summaryrefslogtreecommitdiff
path: root/Master
diff options
context:
space:
mode:
authorTaco Hoekwater <taco@elvenkind.com>2011-06-01 08:54:21 +0000
committerTaco Hoekwater <taco@elvenkind.com>2011-06-01 08:54:21 +0000
commitd7ccb42582f85acf30568913610ccf4d602023fb (patch)
tree7292e3545a420676878e7451b68892d360c62cb6 /Master
parent2d62a6fe9b80def59c392268022f1f9a2d6e358f (diff)
commit context 2011.05.18
git-svn-id: svn://tug.org/texlive/trunk@22719 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rwxr-xr-xMaster/bin/win32/mtxrun.dllbin8192 -> 9216 bytes
-rwxr-xr-xMaster/bin/win32/mtxrun.lua12366
-rwxr-xr-xMaster/bin/win32/pstopdf.exe (renamed from Master/texmf-dist/scripts/context/stubs/mswin/metatex.exe)bin6144 -> 6144 bytes
-rw-r--r--Master/texmf-dist/colors/icc/context/colorprofiles.lua14
-rw-r--r--Master/texmf-dist/colors/icc/context/colorprofiles.xml427
-rw-r--r--Master/texmf-dist/context/data/scite/cont-cs-scite.properties2
-rw-r--r--Master/texmf-dist/context/data/scite/cont-de-scite.properties2
-rw-r--r--Master/texmf-dist/context/data/scite/cont-fr-scite.properties2
-rw-r--r--Master/texmf-dist/context/data/scite/cont-it-scite.properties2
-rw-r--r--Master/texmf-dist/context/data/scite/cont-nl-scite.properties2
-rw-r--r--Master/texmf-dist/context/data/scite/cont-pe-scite.properties2
-rw-r--r--Master/texmf-dist/context/data/scite/cont-ro-scite.properties2
-rw-r--r--Master/texmf-dist/context/data/scite/context.properties2
-rw-r--r--Master/texmf-dist/context/data/textpad/textpad-context-template.txt54
-rw-r--r--Master/texmf-dist/fonts/afm/jmn/hans/hans-sh.afm304
-rw-r--r--Master/texmf-dist/fonts/afm/jmn/hans/hans.afm28
-rw-r--r--Master/texmf-dist/fonts/data/tests/texmfhome.otfbin0 -> 1884 bytes
-rw-r--r--Master/texmf-dist/fonts/enc/dvips/jmn/hans.enc66
-rw-r--r--Master/texmf-dist/fonts/map/dvips/jmn/hans.map2
-rw-r--r--Master/texmf-dist/fonts/tfm/jmn/hans/hans-sh.tfmbin1656 -> 1536 bytes
-rw-r--r--Master/texmf-dist/fonts/tfm/jmn/hans/hans.tfmbin1600 -> 1512 bytes
-rw-r--r--Master/texmf-dist/fonts/type1/jmn/hans/hans-sh.pfbbin30755 -> 25050 bytes
-rw-r--r--Master/texmf-dist/fonts/type1/jmn/hans/hans.pfbbin19762 -> 17187 bytes
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-base.mp2
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-core.mp531
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-form.mp11
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-grid.mp7
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-grph.mp34
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-mlib.mp425
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-page.mp8
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-spec.mp32
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-tool.mp1
-rw-r--r--Master/texmf-dist/metapost/context/font/punkfont-bold.mp4
-rw-r--r--Master/texmf-dist/metapost/context/font/punkfont-boldslanted.mp5
-rw-r--r--Master/texmf-dist/metapost/context/font/punkfont-characters.mp726
-rw-r--r--Master/texmf-dist/metapost/context/font/punkfont-definitions.mp115
-rw-r--r--Master/texmf-dist/metapost/context/font/punkfont-slanted.mp4
-rw-r--r--Master/texmf-dist/metapost/context/font/punkfont.mp865
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-babel.lua36
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-base.lua118
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-cache.lua141
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-chars.lua50
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-check.lua168
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-colors.lua57
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-context.lua1385
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-convert.lua33
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-epub.lua177
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-flac.lua216
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-fonts.lua231
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-grep.lua28
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-interface.lua423
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-metapost.lua177
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-metatex.lua43
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-modules.lua35
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-mptopdf.lua127
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-package.lua36
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-patterns.lua660
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-profile.lua38
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-scite.lua56
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-server-ctx-fonttest.lua56
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-server-ctx-help.lua18
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-server-ctx-startup.lua4
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-server.lua83
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-texworks.lua48
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-timing.lua40
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-tools.lua68
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-unzip.lua41
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-update.lua152
-rw-r--r--Master/texmf-dist/scripts/context/lua/mtx-watch.lua64
-rwxr-xr-xMaster/texmf-dist/scripts/context/lua/mtxrun.lua12366
-rwxr-xr-xMaster/texmf-dist/scripts/context/perl/mptopdf.pl30
-rw-r--r--Master/texmf-dist/scripts/context/ruby/base/kpse.rb18
-rw-r--r--Master/texmf-dist/scripts/context/ruby/base/tex.rb200
-rw-r--r--Master/texmf-dist/scripts/context/ruby/ctxtools.rb9
-rw-r--r--Master/texmf-dist/scripts/context/ruby/fcd_start.rb2
-rw-r--r--Master/texmf-dist/scripts/context/ruby/mtxtools.rb475
-rw-r--r--Master/texmf-dist/scripts/context/ruby/rslibtool.rb114
-rw-r--r--Master/texmf-dist/scripts/context/ruby/texexec.rb19
-rwxr-xr-xMaster/texmf-dist/scripts/context/ruby/texmfstart.rb8
-rwxr-xr-xMaster/texmf-dist/scripts/context/stubs/mswin/mtxrun.dllbin8192 -> 9216 bytes
-rwxr-xr-xMaster/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua12366
-rw-r--r--Master/texmf-dist/scripts/context/stubs/source/mtxrun_dll.c104
-rwxr-xr-xMaster/texmf-dist/scripts/context/stubs/unix/luatools8314
-rwxr-xr-xMaster/texmf-dist/scripts/context/stubs/unix/metatex2
-rwxr-xr-xMaster/texmf-dist/scripts/context/stubs/unix/mtxrun12366
-rw-r--r--Master/texmf-dist/tex/context/base/anch-pgr.mkii8
-rw-r--r--Master/texmf-dist/tex/context/base/anch-pgr.mkiv475
-rw-r--r--Master/texmf-dist/tex/context/base/anch-pos.lua368
-rw-r--r--Master/texmf-dist/tex/context/base/anch-pos.mkii8
-rw-r--r--Master/texmf-dist/tex/context/base/anch-pos.mkiv210
-rw-r--r--Master/texmf-dist/tex/context/base/attr-col.lua516
-rw-r--r--Master/texmf-dist/tex/context/base/attr-col.mkiv82
-rw-r--r--Master/texmf-dist/tex/context/base/attr-eff.lua97
-rw-r--r--Master/texmf-dist/tex/context/base/attr-eff.mkiv74
-rw-r--r--Master/texmf-dist/tex/context/base/attr-ini.lua690
-rw-r--r--Master/texmf-dist/tex/context/base/attr-ini.mkiv175
-rw-r--r--Master/texmf-dist/tex/context/base/attr-lay.lua191
-rw-r--r--Master/texmf-dist/tex/context/base/attr-lay.mkiv106
-rw-r--r--Master/texmf-dist/tex/context/base/attr-neg.lua95
-rw-r--r--Master/texmf-dist/tex/context/base/attr-neg.mkiv30
-rw-r--r--Master/texmf-dist/tex/context/base/back-exp.lua1381
-rw-r--r--Master/texmf-dist/tex/context/base/back-exp.mkiv127
-rw-r--r--Master/texmf-dist/tex/context/base/back-ini.lua144
-rw-r--r--Master/texmf-dist/tex/context/base/back-ini.mkiv28
-rw-r--r--Master/texmf-dist/tex/context/base/back-pdf.lua267
-rw-r--r--Master/texmf-dist/tex/context/base/back-pdf.mkiv327
-rw-r--r--Master/texmf-dist/tex/context/base/back-u3d.mkiv25
-rw-r--r--Master/texmf-dist/tex/context/base/bibl-bib.lua115
-rw-r--r--Master/texmf-dist/tex/context/base/bibl-bib.mkiv51
-rw-r--r--Master/texmf-dist/tex/context/base/bibl-tra.lua85
-rw-r--r--Master/texmf-dist/tex/context/base/bibl-tra.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/bibl-tra.mkiv168
-rw-r--r--Master/texmf-dist/tex/context/base/blob-ini.lua112
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-default.lua42
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-default.mkiv43
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-escaped.lua14
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-escaped.mkiv18
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-lua.lua208
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-lua.mkiv69
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-mp.lua (renamed from Master/texmf-dist/tex/context/base/pret-mp.lua)204
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-mp.mkiv76
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-nested.lua80
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-nested.mkiv21
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-parsed-xml.lua101
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-parsed-xml.mkiv70
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-tex.lua130
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-tex.mkiv51
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-xml.lua133
-rw-r--r--Master/texmf-dist/tex/context/base/buff-imp-xml.mkiv71
-rw-r--r--Master/texmf-dist/tex/context/base/buff-ini.lua855
-rw-r--r--Master/texmf-dist/tex/context/base/buff-ini.mkiv355
-rw-r--r--Master/texmf-dist/tex/context/base/buff-par.lua179
-rw-r--r--Master/texmf-dist/tex/context/base/buff-par.mkiv151
-rw-r--r--Master/texmf-dist/tex/context/base/buff-ver.lua670
-rw-r--r--Master/texmf-dist/tex/context/base/buff-ver.mkii1
-rw-r--r--Master/texmf-dist/tex/context/base/buff-ver.mkiv1334
-rw-r--r--Master/texmf-dist/tex/context/base/catc-act.mkii65
-rw-r--r--Master/texmf-dist/tex/context/base/catc-act.mkiv (renamed from Master/texmf-dist/tex/context/base/catc-act.tex)4
-rw-r--r--Master/texmf-dist/tex/context/base/catc-ctx.mkii76
-rw-r--r--Master/texmf-dist/tex/context/base/catc-ctx.mkiv131
-rw-r--r--Master/texmf-dist/tex/context/base/catc-ctx.tex250
-rw-r--r--Master/texmf-dist/tex/context/base/catc-def.mkii142
-rw-r--r--Master/texmf-dist/tex/context/base/catc-def.mkiv143
-rw-r--r--Master/texmf-dist/tex/context/base/catc-def.tex142
-rw-r--r--Master/texmf-dist/tex/context/base/catc-ini.mkii50
-rw-r--r--Master/texmf-dist/tex/context/base/catc-ini.mkiv191
-rw-r--r--Master/texmf-dist/tex/context/base/catc-sym.mkii (renamed from Master/texmf-dist/tex/context/base/catc-sym.tex)12
-rw-r--r--Master/texmf-dist/tex/context/base/catc-sym.mkiv187
-rw-r--r--Master/texmf-dist/tex/context/base/catc-xml.mkii114
-rw-r--r--Master/texmf-dist/tex/context/base/catc-xml.mkiv133
-rw-r--r--Master/texmf-dist/tex/context/base/char-act.mkiv64
-rw-r--r--Master/texmf-dist/tex/context/base/char-cjk.lua366
-rw-r--r--Master/texmf-dist/tex/context/base/char-cmp.lua268
-rw-r--r--Master/texmf-dist/tex/context/base/char-def.lua4035
-rw-r--r--Master/texmf-dist/tex/context/base/char-enc.lua42
-rw-r--r--Master/texmf-dist/tex/context/base/char-ini.lua1074
-rw-r--r--Master/texmf-dist/tex/context/base/char-ini.mkiv58
-rw-r--r--Master/texmf-dist/tex/context/base/char-map.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/char-tex.lua147
-rw-r--r--Master/texmf-dist/tex/context/base/char-utf.lua436
-rw-r--r--Master/texmf-dist/tex/context/base/char-utf.mkiv17
-rw-r--r--Master/texmf-dist/tex/context/base/chem-ini.lua56
-rw-r--r--Master/texmf-dist/tex/context/base/chem-ini.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/chem-str.lua132
-rw-r--r--Master/texmf-dist/tex/context/base/chem-str.mkiv37
-rw-r--r--Master/texmf-dist/tex/context/base/cldf-com.lua105
-rw-r--r--Master/texmf-dist/tex/context/base/cldf-com.mkiv19
-rw-r--r--Master/texmf-dist/tex/context/base/cldf-ini.lua755
-rw-r--r--Master/texmf-dist/tex/context/base/cldf-ini.mkiv40
-rw-r--r--Master/texmf-dist/tex/context/base/cldf-int.lua (renamed from Master/texmf-dist/tex/context/base/mult-clm.lua)71
-rw-r--r--Master/texmf-dist/tex/context/base/cldf-int.mkiv (renamed from Master/texmf-dist/tex/context/base/mult-cld.mkiv)13
-rw-r--r--Master/texmf-dist/tex/context/base/cldf-ver.lua73
-rw-r--r--Master/texmf-dist/tex/context/base/cldf-ver.mkiv18
-rw-r--r--Master/texmf-dist/tex/context/base/colo-ema.mkii (renamed from Master/texmf-dist/tex/context/base/colo-ema.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/colo-ext.mkiv15
-rw-r--r--Master/texmf-dist/tex/context/base/colo-hex.mkiv28
-rw-r--r--Master/texmf-dist/tex/context/base/colo-hex.tex3
-rw-r--r--Master/texmf-dist/tex/context/base/colo-icc.lua120
-rw-r--r--Master/texmf-dist/tex/context/base/colo-imp-ema.mkiv590
-rw-r--r--Master/texmf-dist/tex/context/base/colo-imp-rgb.mkiv (renamed from Master/texmf-dist/tex/context/base/colo-rgb.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/colo-imp-x11.mkiv (renamed from Master/texmf-dist/tex/context/base/colo-x11.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/colo-imp-xwi.mkiv (renamed from Master/texmf-dist/tex/context/base/colo-xwi.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/colo-ini.lua406
-rw-r--r--Master/texmf-dist/tex/context/base/colo-ini.mkii6
-rw-r--r--Master/texmf-dist/tex/context/base/colo-ini.mkiv171
-rw-r--r--Master/texmf-dist/tex/context/base/colo-rgb.mkii530
-rw-r--r--Master/texmf-dist/tex/context/base/colo-run.mkii (renamed from Master/texmf-dist/tex/context/base/colo-run.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/colo-run.mkiv257
-rw-r--r--Master/texmf-dist/tex/context/base/colo-x11.mkii677
-rw-r--r--Master/texmf-dist/tex/context/base/colo-xwi.mkii142
-rw-r--r--Master/texmf-dist/tex/context/base/cont-cs.mkii21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-cs.mkiv21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-cs.tex39
-rw-r--r--Master/texmf-dist/tex/context/base/cont-de.mkii21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-de.mkiv21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-de.tex44
-rw-r--r--Master/texmf-dist/tex/context/base/cont-en.mkii21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-en.mkiv21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-en.tex46
-rw-r--r--Master/texmf-dist/tex/context/base/cont-err.mkii (renamed from Master/texmf-dist/tex/context/base/cont-err.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/cont-fil.mkii (renamed from Master/texmf-dist/tex/context/base/cont-fil.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/cont-fil.mkiv96
-rw-r--r--Master/texmf-dist/tex/context/base/cont-fr.mkii21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-fr.mkiv21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-fr.tex42
-rw-r--r--Master/texmf-dist/tex/context/base/cont-gb.mkii21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-gb.mkiv21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-gb.tex42
-rw-r--r--Master/texmf-dist/tex/context/base/cont-it.mkii21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-it.mkiv21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-it.tex41
-rw-r--r--Master/texmf-dist/tex/context/base/cont-log.mkii (renamed from Master/texmf-dist/tex/context/base/cont-log.tex)71
-rw-r--r--Master/texmf-dist/tex/context/base/cont-log.mkiv253
-rw-r--r--Master/texmf-dist/tex/context/base/cont-mtx.tex25
-rw-r--r--Master/texmf-dist/tex/context/base/cont-new.mkii925
-rw-r--r--Master/texmf-dist/tex/context/base/cont-new.mkiv580
-rw-r--r--Master/texmf-dist/tex/context/base/cont-new.tex992
-rw-r--r--Master/texmf-dist/tex/context/base/cont-nl.mkii21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-nl.mkiv21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-nl.tex42
-rw-r--r--Master/texmf-dist/tex/context/base/cont-old.tex48
-rw-r--r--Master/texmf-dist/tex/context/base/cont-pe.mkiv22
-rw-r--r--Master/texmf-dist/tex/context/base/cont-pe.tex45
-rw-r--r--Master/texmf-dist/tex/context/base/cont-ro.mkii22
-rw-r--r--Master/texmf-dist/tex/context/base/cont-ro.mkiv21
-rw-r--r--Master/texmf-dist/tex/context/base/cont-ro.tex38
-rw-r--r--Master/texmf-dist/tex/context/base/cont-sys.ori4
-rw-r--r--Master/texmf-dist/tex/context/base/cont-usr.ori109
-rw-r--r--Master/texmf-dist/tex/context/base/context.lus71
-rw-r--r--Master/texmf-dist/tex/context/base/context.mkii149
-rw-r--r--Master/texmf-dist/tex/context/base/context.mkiv237
-rw-r--r--Master/texmf-dist/tex/context/base/context.rme102
-rw-r--r--Master/texmf-dist/tex/context/base/context.tex225
-rw-r--r--Master/texmf-dist/tex/context/base/context.todo6
-rw-r--r--Master/texmf-dist/tex/context/base/core-con.lua858
-rw-r--r--Master/texmf-dist/tex/context/base/core-con.mkiv420
-rw-r--r--Master/texmf-dist/tex/context/base/core-ctx.lua17
-rw-r--r--Master/texmf-dist/tex/context/base/core-ctx.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/core-def.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/core-def.mkiv33
-rw-r--r--Master/texmf-dist/tex/context/base/core-env.lua101
-rw-r--r--Master/texmf-dist/tex/context/base/core-env.mkiv261
-rw-r--r--Master/texmf-dist/tex/context/base/core-fil.mkii8
-rw-r--r--Master/texmf-dist/tex/context/base/core-fil.mkiv61
-rw-r--r--Master/texmf-dist/tex/context/base/core-fnt.mkiv21
-rw-r--r--Master/texmf-dist/tex/context/base/core-ini.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/core-job.lua44
-rw-r--r--Master/texmf-dist/tex/context/base/core-job.mkii58
-rw-r--r--Master/texmf-dist/tex/context/base/core-job.mkiv144
-rw-r--r--Master/texmf-dist/tex/context/base/core-mis.mkii15
-rw-r--r--Master/texmf-dist/tex/context/base/core-mis.mkiv237
-rw-r--r--Master/texmf-dist/tex/context/base/core-sys.lua3
-rw-r--r--Master/texmf-dist/tex/context/base/core-sys.mkiv131
-rw-r--r--Master/texmf-dist/tex/context/base/core-two.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/core-two.mkiv28
-rw-r--r--Master/texmf-dist/tex/context/base/core-uti.lua224
-rw-r--r--Master/texmf-dist/tex/context/base/core-uti.mkiv39
-rw-r--r--Master/texmf-dist/tex/context/base/core-var.mkiv23
-rw-r--r--Master/texmf-dist/tex/context/base/data-aux.lua29
-rw-r--r--Master/texmf-dist/tex/context/base/data-bin.lua16
-rw-r--r--Master/texmf-dist/tex/context/base/data-con.lua89
-rw-r--r--Master/texmf-dist/tex/context/base/data-crl.lua65
-rw-r--r--Master/texmf-dist/tex/context/base/data-ctx.lua24
-rw-r--r--Master/texmf-dist/tex/context/base/data-env.lua289
-rw-r--r--Master/texmf-dist/tex/context/base/data-exp.lua330
-rw-r--r--Master/texmf-dist/tex/context/base/data-fil.lua112
-rw-r--r--Master/texmf-dist/tex/context/base/data-ini.lua229
-rw-r--r--Master/texmf-dist/tex/context/base/data-inp.lua22
-rw-r--r--Master/texmf-dist/tex/context/base/data-lst.lua68
-rw-r--r--Master/texmf-dist/tex/context/base/data-lua.lua61
-rw-r--r--Master/texmf-dist/tex/context/base/data-met.lua128
-rw-r--r--Master/texmf-dist/tex/context/base/data-out.lua10
-rw-r--r--Master/texmf-dist/tex/context/base/data-pre.lua117
-rw-r--r--Master/texmf-dist/tex/context/base/data-res.lua2595
-rw-r--r--Master/texmf-dist/tex/context/base/data-sch.lua148
-rw-r--r--Master/texmf-dist/tex/context/base/data-tex.lua306
-rw-r--r--Master/texmf-dist/tex/context/base/data-tmf.lua108
-rw-r--r--Master/texmf-dist/tex/context/base/data-tmp.lua389
-rw-r--r--Master/texmf-dist/tex/context/base/data-tre.lua51
-rw-r--r--Master/texmf-dist/tex/context/base/data-use.lua58
-rw-r--r--Master/texmf-dist/tex/context/base/data-vir.lua81
-rw-r--r--Master/texmf-dist/tex/context/base/data-zip.lua180
-rw-r--r--Master/texmf-dist/tex/context/base/enco-agr.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/enco-ans.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/enco-ec.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/enco-fde.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/enco-ffr.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/enco-ini.mkii10
-rw-r--r--Master/texmf-dist/tex/context/base/enco-ini.mkiv384
-rw-r--r--Master/texmf-dist/tex/context/base/enco-l7x.mkii16
-rw-r--r--Master/texmf-dist/tex/context/base/enco-qx.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/enco-t5.mkii6
-rw-r--r--Master/texmf-dist/tex/context/base/enco-x5.mkii6
-rw-r--r--Master/texmf-dist/tex/context/base/font-afm.lua1296
-rw-r--r--Master/texmf-dist/tex/context/base/font-age.lua3744
-rw-r--r--Master/texmf-dist/tex/context/base/font-agl.lua3958
-rw-r--r--Master/texmf-dist/tex/context/base/font-aux.lua104
-rw-r--r--Master/texmf-dist/tex/context/base/font-chk.lua23
-rw-r--r--Master/texmf-dist/tex/context/base/font-cid.lua116
-rw-r--r--Master/texmf-dist/tex/context/base/font-col.lua86
-rw-r--r--Master/texmf-dist/tex/context/base/font-col.mkiv19
-rw-r--r--Master/texmf-dist/tex/context/base/font-con.lua1135
-rw-r--r--Master/texmf-dist/tex/context/base/font-ctx.lua1159
-rw-r--r--Master/texmf-dist/tex/context/base/font-def.lua621
-rw-r--r--Master/texmf-dist/tex/context/base/font-dum.lua301
-rw-r--r--Master/texmf-dist/tex/context/base/font-enc.lua67
-rw-r--r--Master/texmf-dist/tex/context/base/font-enh.lua326
-rw-r--r--Master/texmf-dist/tex/context/base/font-ext.lua468
-rw-r--r--Master/texmf-dist/tex/context/base/font-fbk.lua402
-rw-r--r--Master/texmf-dist/tex/context/base/font-gds.lua383
-rw-r--r--Master/texmf-dist/tex/context/base/font-gds.mkiv5
-rw-r--r--Master/texmf-dist/tex/context/base/font-ini.lua95
-rw-r--r--Master/texmf-dist/tex/context/base/font-ini.mkii159
-rw-r--r--Master/texmf-dist/tex/context/base/font-ini.mkiv1256
-rw-r--r--Master/texmf-dist/tex/context/base/font-ldr.lua70
-rw-r--r--Master/texmf-dist/tex/context/base/font-log.lua74
-rw-r--r--Master/texmf-dist/tex/context/base/font-lua.lua46
-rw-r--r--Master/texmf-dist/tex/context/base/font-map.lua236
-rw-r--r--Master/texmf-dist/tex/context/base/font-mis.lua36
-rw-r--r--Master/texmf-dist/tex/context/base/font-ota.lua196
-rw-r--r--Master/texmf-dist/tex/context/base/font-otb.lua772
-rw-r--r--Master/texmf-dist/tex/context/base/font-otc.lua405
-rw-r--r--Master/texmf-dist/tex/context/base/font-otd.lua217
-rw-r--r--Master/texmf-dist/tex/context/base/font-otf.lua2867
-rw-r--r--Master/texmf-dist/tex/context/base/font-oth.lua51
-rw-r--r--Master/texmf-dist/tex/context/base/font-oti.lua91
-rw-r--r--Master/texmf-dist/tex/context/base/font-otn.lua1865
-rw-r--r--Master/texmf-dist/tex/context/base/font-otp.lua799
-rw-r--r--Master/texmf-dist/tex/context/base/font-ott.lua1417
-rw-r--r--Master/texmf-dist/tex/context/base/font-pat.lua145
-rw-r--r--Master/texmf-dist/tex/context/base/font-run.mkiv94
-rw-r--r--Master/texmf-dist/tex/context/base/font-syn.lua597
-rw-r--r--Master/texmf-dist/tex/context/base/font-tfm.lua784
-rw-r--r--Master/texmf-dist/tex/context/base/font-tra.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/font-uni.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/font-vf.lua268
-rw-r--r--Master/texmf-dist/tex/context/base/font-xtx.lua122
-rw-r--r--Master/texmf-dist/tex/context/base/font-xtx.mkii93
-rw-r--r--Master/texmf-dist/tex/context/base/grph-epd.lua26
-rw-r--r--Master/texmf-dist/tex/context/base/grph-epd.mkiv56
-rw-r--r--Master/texmf-dist/tex/context/base/grph-fig.mkiv41
-rw-r--r--Master/texmf-dist/tex/context/base/grph-fil.lua49
-rw-r--r--Master/texmf-dist/tex/context/base/grph-inc.lua891
-rw-r--r--Master/texmf-dist/tex/context/base/grph-inc.mkiv77
-rw-r--r--Master/texmf-dist/tex/context/base/grph-raw.lua39
-rw-r--r--Master/texmf-dist/tex/context/base/grph-raw.mkiv64
-rw-r--r--Master/texmf-dist/tex/context/base/grph-swf.lua82
-rw-r--r--Master/texmf-dist/tex/context/base/grph-u3d.lua26
-rw-r--r--Master/texmf-dist/tex/context/base/grph-wnd.lua47
-rw-r--r--Master/texmf-dist/tex/context/base/hand-ini.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/java-ans.mkii (renamed from Master/texmf-dist/tex/context/base/java-ans.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/java-exa.mkii (renamed from Master/texmf-dist/tex/context/base/java-exa.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/java-fil.mkii (renamed from Master/texmf-dist/tex/context/base/java-fil.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/java-fld.mkii (renamed from Master/texmf-dist/tex/context/base/java-fld.tex)279
-rw-r--r--Master/texmf-dist/tex/context/base/java-imp-exa.mkiv395
-rw-r--r--Master/texmf-dist/tex/context/base/java-imp-fil.mkiv52
-rw-r--r--Master/texmf-dist/tex/context/base/java-imp-fld.mkiv536
-rw-r--r--Master/texmf-dist/tex/context/base/java-imp-stp.mkiv123
-rw-r--r--Master/texmf-dist/tex/context/base/java-ini.lua168
-rw-r--r--Master/texmf-dist/tex/context/base/java-ini.mkii32
-rw-r--r--Master/texmf-dist/tex/context/base/java-ini.mkiv40
-rw-r--r--Master/texmf-dist/tex/context/base/java-stp.mkii (renamed from Master/texmf-dist/tex/context/base/java-stp.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/l-aux.lua254
-rw-r--r--Master/texmf-dist/tex/context/base/l-boolean.lua23
-rw-r--r--Master/texmf-dist/tex/context/base/l-dir.lua266
-rw-r--r--Master/texmf-dist/tex/context/base/l-file.lua279
-rw-r--r--Master/texmf-dist/tex/context/base/l-io.lua115
-rw-r--r--Master/texmf-dist/tex/context/base/l-lpeg.lua480
-rw-r--r--Master/texmf-dist/tex/context/base/l-math.lua27
-rw-r--r--Master/texmf-dist/tex/context/base/l-md5.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/l-number.lua76
-rw-r--r--Master/texmf-dist/tex/context/base/l-os.lua139
-rw-r--r--Master/texmf-dist/tex/context/base/l-pdfview.lua35
-rw-r--r--Master/texmf-dist/tex/context/base/l-set.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/l-string.lua278
-rw-r--r--Master/texmf-dist/tex/context/base/l-table.lua583
-rw-r--r--Master/texmf-dist/tex/context/base/l-unicode.lua365
-rw-r--r--Master/texmf-dist/tex/context/base/l-url.lua225
-rw-r--r--Master/texmf-dist/tex/context/base/l-utils.lua172
-rw-r--r--Master/texmf-dist/tex/context/base/lang-alt.mkii (renamed from Master/texmf-dist/tex/context/base/lang-alt.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/lang-ana.mkii (renamed from Master/texmf-dist/tex/context/base/lang-ana.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/lang-ara.mkiv150
-rw-r--r--Master/texmf-dist/tex/context/base/lang-art.mkii (renamed from Master/texmf-dist/tex/context/base/lang-art.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/lang-bal.mkii (renamed from Master/texmf-dist/tex/context/base/lang-bal.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/lang-cel.mkii (renamed from Master/texmf-dist/tex/context/base/lang-cel.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/lang-cjk.mkiv328
-rw-r--r--Master/texmf-dist/tex/context/base/lang-cyr.mkii (renamed from Master/texmf-dist/tex/context/base/lang-cyr.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/lang-def.lua416
-rw-r--r--Master/texmf-dist/tex/context/base/lang-def.mkiv689
-rw-r--r--Master/texmf-dist/tex/context/base/lang-frd.mkii (renamed from Master/texmf-dist/tex/context/base/lang-frd.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/lang-frq.mkii (renamed from Master/texmf-dist/tex/context/base/lang-frq.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/lang-ger.mkii (renamed from Master/texmf-dist/tex/context/base/lang-ger.tex)76
-rw-r--r--Master/texmf-dist/tex/context/base/lang-grk.mkii (renamed from Master/texmf-dist/tex/context/base/lang-grk.tex)9
-rw-r--r--Master/texmf-dist/tex/context/base/lang-ind.mkii (renamed from Master/texmf-dist/tex/context/base/lang-ind.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/lang-ini.lua485
-rw-r--r--Master/texmf-dist/tex/context/base/lang-ini.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/lang-ini.mkiv245
-rw-r--r--Master/texmf-dist/tex/context/base/lang-ita.mkii (renamed from Master/texmf-dist/tex/context/base/lang-ita.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/lang-lab.lua130
-rw-r--r--Master/texmf-dist/tex/context/base/lang-lab.mkiv309
-rw-r--r--Master/texmf-dist/tex/context/base/lang-mis.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/lang-sla.mkii457
-rw-r--r--Master/texmf-dist/tex/context/base/lang-sla.mkiv17
-rw-r--r--Master/texmf-dist/tex/context/base/lang-sla.tex497
-rw-r--r--Master/texmf-dist/tex/context/base/lang-spa.mkii (renamed from Master/texmf-dist/tex/context/base/lang-spa.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/lang-spa.mkiv76
-rw-r--r--Master/texmf-dist/tex/context/base/lang-txt.lua2510
-rw-r--r--Master/texmf-dist/tex/context/base/lang-ura.mkii (renamed from Master/texmf-dist/tex/context/base/lang-ura.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/lang-url.lua24
-rw-r--r--Master/texmf-dist/tex/context/base/lang-url.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/lang-vn.mkii (renamed from Master/texmf-dist/tex/context/base/lang-vn.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/lang-wrd.lua381
-rw-r--r--Master/texmf-dist/tex/context/base/lang-wrd.mkiv30
-rw-r--r--Master/texmf-dist/tex/context/base/layo-ini.lua61
-rw-r--r--Master/texmf-dist/tex/context/base/layo-ini.mkiv31
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-ano.lua429
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-col.lua172
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-enc.lua157
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-epa.lua193
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-epd.lua308
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-fld.lua899
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-fmt.lua758
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-grp.lua94
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-ini.lua420
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-ini.mkiv271
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-mis.lua156
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-nod.lua23
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-pda.xml171
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-pdx.lua139
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-pdx.mkiv71
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-pdx.xml (renamed from Master/texmf-dist/tex/context/base/lpdf-xmp.xml)4
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-ren.lua184
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-swf.lua216
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-tag.lua308
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-u3d.lua52
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-wid.lua700
-rw-r--r--Master/texmf-dist/tex/context/base/lpdf-xmp.lua82
-rw-r--r--Master/texmf-dist/tex/context/base/luat-bas.mkiv29
-rw-r--r--Master/texmf-dist/tex/context/base/luat-bwc.lua32
-rw-r--r--Master/texmf-dist/tex/context/base/luat-cbk.lua101
-rw-r--r--Master/texmf-dist/tex/context/base/luat-cnf.lua167
-rw-r--r--Master/texmf-dist/tex/context/base/luat-cod.lua167
-rw-r--r--Master/texmf-dist/tex/context/base/luat-cod.mkiv132
-rw-r--r--Master/texmf-dist/tex/context/base/luat-dum.lua126
-rw-r--r--Master/texmf-dist/tex/context/base/luat-env.lua147
-rw-r--r--Master/texmf-dist/tex/context/base/luat-exe.lua91
-rw-r--r--Master/texmf-dist/tex/context/base/luat-fio.lua91
-rw-r--r--Master/texmf-dist/tex/context/base/luat-fmt.lua139
-rw-r--r--Master/texmf-dist/tex/context/base/luat-ini.lua116
-rw-r--r--Master/texmf-dist/tex/context/base/luat-ini.mkiv62
-rw-r--r--Master/texmf-dist/tex/context/base/luat-iop.lua46
-rw-r--r--Master/texmf-dist/tex/context/base/luat-lib.mkiv102
-rw-r--r--Master/texmf-dist/tex/context/base/luat-lua.lua12
-rw-r--r--Master/texmf-dist/tex/context/base/luat-mac.lua271
-rw-r--r--Master/texmf-dist/tex/context/base/luat-run.lua137
-rw-r--r--Master/texmf-dist/tex/context/base/luat-sta.lua51
-rw-r--r--Master/texmf-dist/tex/context/base/luat-sto.lua118
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-aux.lua364
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-ctx.lua10
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-dir.lua18
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-ent.lua12
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-inf.lua5
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-ini.mkiv222
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-lpt.lua329
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-mis.lua18
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-sor.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-sor.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-tab.lua94
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-tex.lua331
-rw-r--r--Master/texmf-dist/tex/context/base/lxml-xml.lua74
-rw-r--r--Master/texmf-dist/tex/context/base/m-arabtex.mkii (renamed from Master/texmf-dist/tex/context/base/m-arabtex.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/m-barcodes.mkiv26
-rw-r--r--Master/texmf-dist/tex/context/base/m-chart.mkii1269
-rw-r--r--Master/texmf-dist/tex/context/base/m-chart.mkiv2530
-rw-r--r--Master/texmf-dist/tex/context/base/m-chart.tex1269
-rw-r--r--Master/texmf-dist/tex/context/base/m-chemic.tex17
-rw-r--r--Master/texmf-dist/tex/context/base/m-database.lua108
-rw-r--r--Master/texmf-dist/tex/context/base/m-database.mkii (renamed from Master/texmf-dist/tex/context/base/m-database.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/m-database.mkiv241
-rw-r--r--Master/texmf-dist/tex/context/base/m-directives.mkiv (renamed from Master/texmf-dist/tex/context/base/m-directives.tex)2
-rw-r--r--Master/texmf-dist/tex/context/base/m-dratex.mkii (renamed from Master/texmf-dist/tex/context/base/m-dratex.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/m-edtsnc.mkii (renamed from Master/texmf-dist/tex/context/base/m-edtsnc.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/m-fields.mkiv70
-rw-r--r--Master/texmf-dist/tex/context/base/m-graph.mkii161
-rw-r--r--Master/texmf-dist/tex/context/base/m-graph.mkiv109
-rw-r--r--Master/texmf-dist/tex/context/base/m-graph.tex175
-rw-r--r--Master/texmf-dist/tex/context/base/m-level.mkii (renamed from Master/texmf-dist/tex/context/base/m-level.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/m-logcategories.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/m-mathcrap.mkiv76
-rw-r--r--Master/texmf-dist/tex/context/base/m-mkii.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/m-mkivhacks.mkiv (renamed from Master/texmf-dist/tex/context/base/m-mkivhacks.tex)2
-rw-r--r--Master/texmf-dist/tex/context/base/m-morse.mkvi264
-rw-r--r--Master/texmf-dist/tex/context/base/m-newmat.tex269
-rw-r--r--Master/texmf-dist/tex/context/base/m-obsolete.mkii (renamed from Master/texmf-dist/tex/context/base/m-obsolete.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/m-obsolete.mkiv5
-rw-r--r--Master/texmf-dist/tex/context/base/m-pdfsnc.mkii (renamed from Master/texmf-dist/tex/context/base/m-pdfsnc.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/m-pictex.tex2
-rw-r--r--Master/texmf-dist/tex/context/base/m-plus.tex30
-rw-r--r--Master/texmf-dist/tex/context/base/m-pstricks.lua15
-rw-r--r--Master/texmf-dist/tex/context/base/m-pstricks.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/m-punk.mkiv354
-rw-r--r--Master/texmf-dist/tex/context/base/m-punk.tex3
-rw-r--r--Master/texmf-dist/tex/context/base/m-spreadsheet.mkiv265
-rw-r--r--Master/texmf-dist/tex/context/base/m-steps.mkiv20
-rw-r--r--Master/texmf-dist/tex/context/base/m-steps.tex4
-rw-r--r--Master/texmf-dist/tex/context/base/m-tex4ht.mkii (renamed from Master/texmf-dist/tex/context/base/m-tex4ht.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/m-timing.mkiv (renamed from Master/texmf-dist/tex/context/base/m-timing.tex)32
-rw-r--r--Master/texmf-dist/tex/context/base/m-trackers.mkiv (renamed from Master/texmf-dist/tex/context/base/m-trackers.tex)2
-rw-r--r--Master/texmf-dist/tex/context/base/m-translate.mkiv (renamed from Master/texmf-dist/tex/context/base/m-translate.tex)36
-rw-r--r--Master/texmf-dist/tex/context/base/m-tryout.tex55
-rw-r--r--Master/texmf-dist/tex/context/base/m-units.mkii (renamed from Master/texmf-dist/tex/context/base/m-units.tex)115
-rw-r--r--Master/texmf-dist/tex/context/base/m-units.mkiv912
-rw-r--r--Master/texmf-dist/tex/context/base/m-zint.mkiv87
-rw-r--r--Master/texmf-dist/tex/context/base/math-act.lua142
-rw-r--r--Master/texmf-dist/tex/context/base/math-ali.mkiv44
-rw-r--r--Master/texmf-dist/tex/context/base/math-arr.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/math-def.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/base/math-dim.lua50
-rw-r--r--Master/texmf-dist/tex/context/base/math-ent.lua5
-rw-r--r--Master/texmf-dist/tex/context/base/math-ext.lua105
-rw-r--r--Master/texmf-dist/tex/context/base/math-frc.mkii195
-rw-r--r--Master/texmf-dist/tex/context/base/math-frc.mkiv215
-rw-r--r--Master/texmf-dist/tex/context/base/math-ini.lua197
-rw-r--r--Master/texmf-dist/tex/context/base/math-ini.mkii4
-rw-r--r--Master/texmf-dist/tex/context/base/math-ini.mkiv215
-rw-r--r--Master/texmf-dist/tex/context/base/math-int.mkiv53
-rw-r--r--Master/texmf-dist/tex/context/base/math-lbr.mkii42
-rw-r--r--Master/texmf-dist/tex/context/base/math-map.lua53
-rw-r--r--Master/texmf-dist/tex/context/base/math-noa.lua518
-rw-r--r--Master/texmf-dist/tex/context/base/math-pln.mkiv53
-rw-r--r--Master/texmf-dist/tex/context/base/math-scr.mkiv65
-rw-r--r--Master/texmf-dist/tex/context/base/math-tag.lua252
-rw-r--r--Master/texmf-dist/tex/context/base/math-vfu.lua626
-rw-r--r--Master/texmf-dist/tex/context/base/meta-clp.mkii (renamed from Master/texmf-dist/tex/context/base/meta-clp.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/meta-dum.mkii (renamed from Master/texmf-dist/tex/context/base/meta-dum.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/meta-fig.mkiv15
-rw-r--r--Master/texmf-dist/tex/context/base/meta-fun.lua9
-rw-r--r--Master/texmf-dist/tex/context/base/meta-fun.mkiv5
-rw-r--r--Master/texmf-dist/tex/context/base/meta-imp-clp.mkiv164
-rw-r--r--Master/texmf-dist/tex/context/base/meta-imp-dum.mkiv147
-rw-r--r--Master/texmf-dist/tex/context/base/meta-imp-mis.mkiv (renamed from Master/texmf-dist/tex/context/base/meta-mis.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/meta-imp-nav.mkiv (renamed from Master/texmf-dist/tex/context/base/meta-nav.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/meta-imp-pre.mkiv (renamed from Master/texmf-dist/tex/context/base/meta-pre.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/meta-imp-txt.mkiv (renamed from Master/texmf-dist/tex/context/base/meta-txt.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/meta-ini.lua29
-rw-r--r--Master/texmf-dist/tex/context/base/meta-ini.mkii18
-rw-r--r--Master/texmf-dist/tex/context/base/meta-ini.mkiv185
-rw-r--r--Master/texmf-dist/tex/context/base/meta-mis.mkii54
-rw-r--r--Master/texmf-dist/tex/context/base/meta-nav.mkii65
-rw-r--r--Master/texmf-dist/tex/context/base/meta-pdf.lua71
-rw-r--r--Master/texmf-dist/tex/context/base/meta-pdf.mkii8
-rw-r--r--Master/texmf-dist/tex/context/base/meta-pdf.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/meta-pdh.lua25
-rw-r--r--Master/texmf-dist/tex/context/base/meta-pdh.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/base/meta-pre.mkii68
-rw-r--r--Master/texmf-dist/tex/context/base/meta-tex.lua38
-rw-r--r--Master/texmf-dist/tex/context/base/meta-tex.mkiv117
-rw-r--r--Master/texmf-dist/tex/context/base/meta-txt.mkii304
-rw-r--r--Master/texmf-dist/tex/context/base/meta-xml.mkii (renamed from Master/texmf-dist/tex/context/base/meta-xml.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/meta-xml.mkiv (renamed from Master/texmf-dist/tex/context/base/m-pstricks.tex)16
-rw-r--r--Master/texmf-dist/tex/context/base/metatex.lus9
-rw-r--r--Master/texmf-dist/tex/context/base/metatex.tex25
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-ctx.lua36
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-pdf.lua275
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-pdf.mkiv11
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-pps.lua1058
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-pps.mkiv40
-rw-r--r--Master/texmf-dist/tex/context/base/mlib-run.lua313
-rw-r--r--Master/texmf-dist/tex/context/base/mtx-context-arrange.tex5
-rw-r--r--Master/texmf-dist/tex/context/base/mtx-context-listing.tex16
-rw-r--r--Master/texmf-dist/tex/context/base/mtx-context-select.tex109
-rw-r--r--Master/texmf-dist/tex/context/base/mult-aux.lua147
-rw-r--r--Master/texmf-dist/tex/context/base/mult-aux.mkii152
-rw-r--r--Master/texmf-dist/tex/context/base/mult-aux.mkiv269
-rw-r--r--Master/texmf-dist/tex/context/base/mult-chk.lua47
-rw-r--r--Master/texmf-dist/tex/context/base/mult-chk.mkiv3
-rw-r--r--Master/texmf-dist/tex/context/base/mult-cld.lua212
-rw-r--r--Master/texmf-dist/tex/context/base/mult-com.mkii (renamed from Master/texmf-dist/tex/context/base/mult-com.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/mult-con.mkii (renamed from Master/texmf-dist/tex/context/base/mult-con.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/mult-de.mkii (renamed from Master/texmf-dist/tex/context/base/mult-de.tex)26
-rw-r--r--Master/texmf-dist/tex/context/base/mult-def.lua151
-rw-r--r--Master/texmf-dist/tex/context/base/mult-def.mkii (renamed from Master/texmf-dist/tex/context/base/mult-def.tex)12
-rw-r--r--Master/texmf-dist/tex/context/base/mult-def.mkiv33
-rw-r--r--Master/texmf-dist/tex/context/base/mult-en.mkii (renamed from Master/texmf-dist/tex/context/base/mult-en.tex)26
-rw-r--r--Master/texmf-dist/tex/context/base/mult-fr.mkii (renamed from Master/texmf-dist/tex/context/base/mult-fr.tex)28
-rw-r--r--Master/texmf-dist/tex/context/base/mult-fst.mkii36
-rw-r--r--Master/texmf-dist/tex/context/base/mult-fst.mkiv (renamed from Master/texmf-dist/tex/context/base/mult-fst.tex)24
-rw-r--r--Master/texmf-dist/tex/context/base/mult-ini.lua240
-rw-r--r--Master/texmf-dist/tex/context/base/mult-ini.mkiv104
-rw-r--r--Master/texmf-dist/tex/context/base/mult-it.mkii (renamed from Master/texmf-dist/tex/context/base/mult-it.tex)26
-rw-r--r--Master/texmf-dist/tex/context/base/mult-mcs.mkii (renamed from Master/texmf-dist/tex/context/base/mult-mcs.tex)6
-rw-r--r--Master/texmf-dist/tex/context/base/mult-mde.mkii (renamed from Master/texmf-dist/tex/context/base/mult-mde.tex)6
-rw-r--r--Master/texmf-dist/tex/context/base/mult-men.mkii (renamed from Master/texmf-dist/tex/context/base/mult-men.tex)6
-rw-r--r--Master/texmf-dist/tex/context/base/mult-mes.lua3783
-rw-r--r--Master/texmf-dist/tex/context/base/mult-mfr.mkii (renamed from Master/texmf-dist/tex/context/base/mult-mfr.tex)4
-rw-r--r--Master/texmf-dist/tex/context/base/mult-mit.mkii (renamed from Master/texmf-dist/tex/context/base/mult-mit.tex)4
-rw-r--r--Master/texmf-dist/tex/context/base/mult-mnl.mkii (renamed from Master/texmf-dist/tex/context/base/mult-mnl.tex)4
-rw-r--r--Master/texmf-dist/tex/context/base/mult-mno.mkii (renamed from Master/texmf-dist/tex/context/base/mult-mno.tex)4
-rw-r--r--Master/texmf-dist/tex/context/base/mult-mpe.mkii (renamed from Master/texmf-dist/tex/context/base/mult-mpe.tex)6
-rw-r--r--Master/texmf-dist/tex/context/base/mult-mro.mkii (renamed from Master/texmf-dist/tex/context/base/mult-mro.tex)4
-rw-r--r--Master/texmf-dist/tex/context/base/mult-nl.mkii (renamed from Master/texmf-dist/tex/context/base/mult-nl.tex)26
-rw-r--r--Master/texmf-dist/tex/context/base/mult-pe.mkii1715
-rw-r--r--Master/texmf-dist/tex/context/base/mult-ro.mkii (renamed from Master/texmf-dist/tex/context/base/mult-ro.tex)26
-rw-r--r--Master/texmf-dist/tex/context/base/mult-sys.mkii (renamed from Master/texmf-dist/tex/context/base/mult-sys.tex)28
-rw-r--r--Master/texmf-dist/tex/context/base/mult-sys.mkiv912
-rw-r--r--Master/texmf-dist/tex/context/base/node-acc.lua113
-rw-r--r--Master/texmf-dist/tex/context/base/node-aux.lua248
-rw-r--r--Master/texmf-dist/tex/context/base/node-bck.lua31
-rw-r--r--Master/texmf-dist/tex/context/base/node-bck.mkiv108
-rw-r--r--Master/texmf-dist/tex/context/base/node-dir.lua33
-rw-r--r--Master/texmf-dist/tex/context/base/node-dum.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/node-fin.lua108
-rw-r--r--Master/texmf-dist/tex/context/base/node-fin.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/node-fnt.lua245
-rw-r--r--Master/texmf-dist/tex/context/base/node-ini.lua303
-rw-r--r--Master/texmf-dist/tex/context/base/node-ini.mkiv41
-rw-r--r--Master/texmf-dist/tex/context/base/node-inj.lua241
-rw-r--r--Master/texmf-dist/tex/context/base/node-mig.lua39
-rw-r--r--Master/texmf-dist/tex/context/base/node-mig.mkiv9
-rw-r--r--Master/texmf-dist/tex/context/base/node-pag.lua2
-rw-r--r--Master/texmf-dist/tex/context/base/node-par.lua63
-rw-r--r--Master/texmf-dist/tex/context/base/node-par.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/node-pro.lua115
-rw-r--r--Master/texmf-dist/tex/context/base/node-ref.lua257
-rw-r--r--Master/texmf-dist/tex/context/base/node-res.lua288
-rw-r--r--Master/texmf-dist/tex/context/base/node-rul.lua247
-rw-r--r--Master/texmf-dist/tex/context/base/node-rul.mkiv159
-rw-r--r--Master/texmf-dist/tex/context/base/node-seq.lua186
-rw-r--r--Master/texmf-dist/tex/context/base/node-ser.lua97
-rw-r--r--Master/texmf-dist/tex/context/base/node-shp.lua42
-rw-r--r--Master/texmf-dist/tex/context/base/node-spl.lua619
-rw-r--r--Master/texmf-dist/tex/context/base/node-spl.mkiv114
-rw-r--r--Master/texmf-dist/tex/context/base/node-tex.lua4
-rw-r--r--Master/texmf-dist/tex/context/base/node-tra.lua425
-rw-r--r--Master/texmf-dist/tex/context/base/node-tsk.lua207
-rw-r--r--Master/texmf-dist/tex/context/base/node-tst.lua75
-rw-r--r--Master/texmf-dist/tex/context/base/node-typ.lua25
-rw-r--r--Master/texmf-dist/tex/context/base/norm-alo.mkii (renamed from Master/texmf-dist/tex/context/base/norm-alo.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/norm-ctx.mkii (renamed from Master/texmf-dist/tex/context/base/norm-ctx.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/norm-ctx.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/base/norm-etx.mkii (renamed from Master/texmf-dist/tex/context/base/norm-etx.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/norm-ltx.mkii (renamed from Master/texmf-dist/tex/context/base/norm-ltx.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/norm-ptx.mkii (renamed from Master/texmf-dist/tex/context/base/norm-ptx.tex)2
-rw-r--r--Master/texmf-dist/tex/context/base/norm-tex.mkii (renamed from Master/texmf-dist/tex/context/base/norm-tex.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/norm-xtx.mkii (renamed from Master/texmf-dist/tex/context/base/norm-xtx.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/pack-box.mkii15
-rw-r--r--Master/texmf-dist/tex/context/base/pack-box.mkiv30
-rw-r--r--Master/texmf-dist/tex/context/base/pack-lyr.mkiv152
-rw-r--r--Master/texmf-dist/tex/context/base/pack-mis.mkvi84
-rw-r--r--Master/texmf-dist/tex/context/base/pack-obj.lua18
-rw-r--r--Master/texmf-dist/tex/context/base/pack-obj.mkiv84
-rw-r--r--Master/texmf-dist/tex/context/base/pack-pos.mkiv151
-rw-r--r--Master/texmf-dist/tex/context/base/pack-rul.lua37
-rw-r--r--Master/texmf-dist/tex/context/base/pack-rul.mkiv631
-rw-r--r--Master/texmf-dist/tex/context/base/page-app.mkiv70
-rw-r--r--Master/texmf-dist/tex/context/base/page-bck.mkiv29
-rw-r--r--Master/texmf-dist/tex/context/base/page-com.mkiv116
-rw-r--r--Master/texmf-dist/tex/context/base/page-flt.lua115
-rw-r--r--Master/texmf-dist/tex/context/base/page-flt.mkiv95
-rw-r--r--Master/texmf-dist/tex/context/base/page-imp.mkii362
-rw-r--r--Master/texmf-dist/tex/context/base/page-imp.mkiv1134
-rw-r--r--Master/texmf-dist/tex/context/base/page-ini.mkiv135
-rw-r--r--Master/texmf-dist/tex/context/base/page-lay.mkii30
-rw-r--r--Master/texmf-dist/tex/context/base/page-lay.mkiv371
-rw-r--r--Master/texmf-dist/tex/context/base/page-lin.lua196
-rw-r--r--Master/texmf-dist/tex/context/base/page-lin.mkiv237
-rw-r--r--Master/texmf-dist/tex/context/base/page-mak.mkii4
-rw-r--r--Master/texmf-dist/tex/context/base/page-mak.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/page-mar.mkiv104
-rw-r--r--Master/texmf-dist/tex/context/base/page-mis.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/page-mul.mkii8
-rw-r--r--Master/texmf-dist/tex/context/base/page-mul.mkiv110
-rw-r--r--Master/texmf-dist/tex/context/base/page-one.mkiv28
-rw-r--r--Master/texmf-dist/tex/context/base/page-par.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/page-plg.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/page-run.mkiv422
-rw-r--r--Master/texmf-dist/tex/context/base/page-sel.mkiv347
-rw-r--r--Master/texmf-dist/tex/context/base/page-set.mkii15
-rw-r--r--Master/texmf-dist/tex/context/base/page-set.mkiv122
-rw-r--r--Master/texmf-dist/tex/context/base/page-sid.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/page-sid.mkiv24
-rw-r--r--Master/texmf-dist/tex/context/base/page-spr.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/page-str.lua39
-rw-r--r--Master/texmf-dist/tex/context/base/page-str.mkii45
-rw-r--r--Master/texmf-dist/tex/context/base/page-str.mkiv12
-rw-r--r--Master/texmf-dist/tex/context/base/page-txt.mkiv114
-rw-r--r--Master/texmf-dist/tex/context/base/ppchtex.mkiv62
-rw-r--r--Master/texmf-dist/tex/context/base/pret-lua.lua319
-rw-r--r--Master/texmf-dist/tex/context/base/pret-tex.lua87
-rw-r--r--Master/texmf-dist/tex/context/base/pret-xml.lua136
-rw-r--r--Master/texmf-dist/tex/context/base/prop-ini.mkiv140
-rw-r--r--Master/texmf-dist/tex/context/base/prop-lay.mkiv140
-rw-r--r--Master/texmf-dist/tex/context/base/prop-mis.mkiv74
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-1.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-10.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-11.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-13.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-14.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-15.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-16.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-2.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-3.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-4.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-5.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-6.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-7.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-8.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-8859-9.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-cp1250.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-cp1251.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-cp1252.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-cp1253.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-cp1254.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-cp1255.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-cp1256.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-cp1257.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-cp1258.lua34
-rw-r--r--Master/texmf-dist/tex/context/base/regi-demo.lua22
-rw-r--r--Master/texmf-dist/tex/context/base/regi-ini.lua234
-rw-r--r--Master/texmf-dist/tex/context/base/regi-ini.mkiv66
-rw-r--r--Master/texmf-dist/tex/context/base/regi-syn.mkii (renamed from Master/texmf-dist/tex/context/base/regi-syn.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/s-abr-01.tex64
-rw-r--r--Master/texmf-dist/tex/context/base/s-abr-04.tex321
-rw-r--r--Master/texmf-dist/tex/context/base/s-cdr-01.tex30
-rw-r--r--Master/texmf-dist/tex/context/base/s-chi-00.mkii (renamed from Master/texmf-dist/tex/context/base/s-chi-00.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/s-def-01.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-01.mkii (renamed from Master/texmf-dist/tex/context/base/s-fnt-01.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-02.mkii (renamed from Master/texmf-dist/tex/context/base/s-fnt-02.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-10.mkiv163
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-10.tex163
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-11.mkiv (renamed from Master/texmf-dist/tex/context/base/s-fnt-11.tex)36
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-20.mkiv (renamed from Master/texmf-dist/tex/context/base/s-fnt-20.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-21.mkiv (renamed from Master/texmf-dist/tex/context/base/s-fnt-21.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-23.mkiv290
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-23.tex272
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-24.mkiv (renamed from Master/texmf-dist/tex/context/base/s-fnt-24.tex)2
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-25.mkiv198
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-25.tex194
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-26.mkiv (renamed from Master/texmf-dist/tex/context/base/s-fnt-26.tex)1
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-28.mkiv46
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-29.mkiv71
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-30.mkiv (renamed from Master/texmf-dist/tex/context/base/s-fnt-30.tex)34
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-31.mkiv166
-rw-r--r--Master/texmf-dist/tex/context/base/s-fnt-32.mkiv60
-rw-r--r--Master/texmf-dist/tex/context/base/s-grk-00.mkii (renamed from Master/texmf-dist/tex/context/base/s-grk-00.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/s-inf-01.mkvi244
-rw-r--r--Master/texmf-dist/tex/context/base/s-inf-01.tex203
-rw-r--r--Master/texmf-dist/tex/context/base/s-inf-02.mkiv (renamed from Master/texmf-dist/tex/context/base/s-inf-02.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/s-inf-03.mkiv353
-rw-r--r--Master/texmf-dist/tex/context/base/s-jap-00.mkii (renamed from Master/texmf-dist/tex/context/base/s-jap-00.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/s-lan-03.mkiv40
-rw-r--r--Master/texmf-dist/tex/context/base/s-lan-04.mkiv153
-rw-r--r--Master/texmf-dist/tex/context/base/s-map-10.mkii (renamed from Master/texmf-dist/tex/context/base/s-map-10.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/s-map-10.mkiv567
-rw-r--r--Master/texmf-dist/tex/context/base/s-mod-00.mkii (renamed from Master/texmf-dist/tex/context/base/s-mod-00.tex)13
-rw-r--r--Master/texmf-dist/tex/context/base/s-mod-00.mkiv481
-rw-r--r--Master/texmf-dist/tex/context/base/s-mod-01.mkii (renamed from Master/texmf-dist/tex/context/base/s-mod-01.tex)4
-rw-r--r--Master/texmf-dist/tex/context/base/s-mod-01.mkiv146
-rw-r--r--Master/texmf-dist/tex/context/base/s-mod-02.mkii (renamed from Master/texmf-dist/tex/context/base/s-mod-02.tex)21
-rw-r--r--Master/texmf-dist/tex/context/base/s-mod-02.mkiv423
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-14.tex1
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-18.tex114
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-22.tex102
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-30.mkii (renamed from Master/texmf-dist/tex/context/base/s-pre-30.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-30.mkiv257
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-50.tex2
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-60.mkii (renamed from Master/texmf-dist/tex/context/base/s-pre-60.tex)44
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-60.mkiv134
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-61.tex2
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-62.tex39
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-63.tex7
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-64.tex53
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-66.tex28
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-67.tex15
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-68.tex150
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-69.mkiv335
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-70.mkiv (renamed from Master/texmf-dist/tex/context/base/s-pre-70.tex)14
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-71.lua63
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-71.mkii (renamed from Master/texmf-dist/tex/context/base/s-pre-71.tex)3
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-71.mkiv170
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-93.tex2
-rw-r--r--Master/texmf-dist/tex/context/base/s-pre-96.tex188
-rw-r--r--Master/texmf-dist/tex/context/base/s-reg-01.mkiv (renamed from Master/texmf-dist/tex/context/base/s-reg-01.tex)22
-rw-r--r--Master/texmf-dist/tex/context/base/s-set-31.mkiv118
-rw-r--r--Master/texmf-dist/tex/context/base/s-sys-01.tex61
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-bar.mkiv398
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-bar.mkvi405
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-but.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-but.mkiv127
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-but.mkvi995
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-fld.lua76
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-fld.mkiv686
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-fld.mkvi972
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-hlp.lua120
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-hlp.mkiv179
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-hlp.mkvi162
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-ini.lua30
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-ini.mkvi178
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-int.lua111
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-int.mkiv610
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-men.mkiv615
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-nav.mkiv256
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-pag.lua27
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-pag.mkvi249
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-ref.lua65
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-ref.mkvi90
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-wid.lua194
-rw-r--r--Master/texmf-dist/tex/context/base/scrn-wid.mkvi702
-rw-r--r--Master/texmf-dist/tex/context/base/scrp-cjk.lua237
-rw-r--r--Master/texmf-dist/tex/context/base/scrp-eth.lua151
-rw-r--r--Master/texmf-dist/tex/context/base/scrp-ini.lua250
-rw-r--r--Master/texmf-dist/tex/context/base/scrp-ini.mkiv79
-rw-r--r--Master/texmf-dist/tex/context/base/sort-ini.lua815
-rw-r--r--Master/texmf-dist/tex/context/base/sort-lan.lua1091
-rw-r--r--Master/texmf-dist/tex/context/base/spac-ali.lua132
-rw-r--r--Master/texmf-dist/tex/context/base/spac-ali.mkiv209
-rw-r--r--Master/texmf-dist/tex/context/base/spac-gen.mkii15
-rw-r--r--Master/texmf-dist/tex/context/base/spac-grd.mkiv66
-rw-r--r--Master/texmf-dist/tex/context/base/spac-hor.lua1
-rw-r--r--Master/texmf-dist/tex/context/base/spac-hor.mkiv139
-rw-r--r--Master/texmf-dist/tex/context/base/spac-pag.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/base/spac-par.lua59
-rw-r--r--Master/texmf-dist/tex/context/base/spac-par.mkiv31
-rw-r--r--Master/texmf-dist/tex/context/base/spac-ver.lua839
-rw-r--r--Master/texmf-dist/tex/context/base/spac-ver.mkiv398
-rw-r--r--Master/texmf-dist/tex/context/base/spec-dpm.mkii4
-rw-r--r--Master/texmf-dist/tex/context/base/spec-dpx.mkii4
-rw-r--r--Master/texmf-dist/tex/context/base/spec-dvi.mkii4
-rw-r--r--Master/texmf-dist/tex/context/base/spec-mis.mkii4
-rw-r--r--Master/texmf-dist/tex/context/base/spec-pdf.mkii4
-rw-r--r--Master/texmf-dist/tex/context/base/spec-tst.mkii4
-rw-r--r--Master/texmf-dist/tex/context/base/spec-win.mkii4
-rw-r--r--Master/texmf-dist/tex/context/base/spec-xtx.mkii4
-rw-r--r--Master/texmf-dist/tex/context/base/status-files.pdfbin0 -> 23577 bytes
-rw-r--r--Master/texmf-dist/tex/context/base/status-lua.pdfbin0 -> 154401 bytes
-rw-r--r--Master/texmf-dist/tex/context/base/strc-bkm.lua153
-rw-r--r--Master/texmf-dist/tex/context/base/strc-bkm.mkiv60
-rw-r--r--Master/texmf-dist/tex/context/base/strc-blk.lua72
-rw-r--r--Master/texmf-dist/tex/context/base/strc-blk.mkiv21
-rw-r--r--Master/texmf-dist/tex/context/base/strc-def.mkiv28
-rw-r--r--Master/texmf-dist/tex/context/base/strc-des.mkiv125
-rw-r--r--Master/texmf-dist/tex/context/base/strc-doc.lua307
-rw-r--r--Master/texmf-dist/tex/context/base/strc-doc.mkiv50
-rw-r--r--Master/texmf-dist/tex/context/base/strc-flt.mkii48
-rw-r--r--Master/texmf-dist/tex/context/base/strc-flt.mkiv280
-rw-r--r--Master/texmf-dist/tex/context/base/strc-ini.lua143
-rw-r--r--Master/texmf-dist/tex/context/base/strc-ini.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/strc-itm.lua7
-rw-r--r--Master/texmf-dist/tex/context/base/strc-itm.mkiv163
-rw-r--r--Master/texmf-dist/tex/context/base/strc-lev.lua46
-rw-r--r--Master/texmf-dist/tex/context/base/strc-lev.mkiv92
-rw-r--r--Master/texmf-dist/tex/context/base/strc-lnt.mkiv73
-rw-r--r--Master/texmf-dist/tex/context/base/strc-lst.lua296
-rw-r--r--Master/texmf-dist/tex/context/base/strc-lst.mkiv315
-rw-r--r--Master/texmf-dist/tex/context/base/strc-mar.lua613
-rw-r--r--Master/texmf-dist/tex/context/base/strc-mar.mkiv549
-rw-r--r--Master/texmf-dist/tex/context/base/strc-mat.lua22
-rw-r--r--Master/texmf-dist/tex/context/base/strc-mat.mkiv123
-rw-r--r--Master/texmf-dist/tex/context/base/strc-not.lua156
-rw-r--r--Master/texmf-dist/tex/context/base/strc-not.mkii4
-rw-r--r--Master/texmf-dist/tex/context/base/strc-not.mkiv306
-rw-r--r--Master/texmf-dist/tex/context/base/strc-num.lua227
-rw-r--r--Master/texmf-dist/tex/context/base/strc-num.mkiv110
-rw-r--r--Master/texmf-dist/tex/context/base/strc-pag.lua131
-rw-r--r--Master/texmf-dist/tex/context/base/strc-pag.mkiv60
-rw-r--r--Master/texmf-dist/tex/context/base/strc-prc.mkiv4
-rw-r--r--Master/texmf-dist/tex/context/base/strc-ref.lua849
-rw-r--r--Master/texmf-dist/tex/context/base/strc-ref.mkii18
-rw-r--r--Master/texmf-dist/tex/context/base/strc-ref.mkiv804
-rw-r--r--Master/texmf-dist/tex/context/base/strc-reg.lua699
-rw-r--r--Master/texmf-dist/tex/context/base/strc-reg.mkiv616
-rw-r--r--Master/texmf-dist/tex/context/base/strc-ren.mkiv174
-rw-r--r--Master/texmf-dist/tex/context/base/strc-sbe.mkiv18
-rw-r--r--Master/texmf-dist/tex/context/base/strc-sec.mkiv387
-rw-r--r--Master/texmf-dist/tex/context/base/strc-syn.lua87
-rw-r--r--Master/texmf-dist/tex/context/base/strc-syn.mkiv62
-rw-r--r--Master/texmf-dist/tex/context/base/strc-tag.lua251
-rw-r--r--Master/texmf-dist/tex/context/base/strc-tag.mkiv220
-rw-r--r--Master/texmf-dist/tex/context/base/strc-xml.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/supp-ali.mkii (renamed from Master/texmf-dist/tex/context/base/supp-ali.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/supp-ali.mkiv173
-rw-r--r--Master/texmf-dist/tex/context/base/supp-box.lua110
-rw-r--r--Master/texmf-dist/tex/context/base/supp-box.mkii (renamed from Master/texmf-dist/tex/context/base/supp-box.tex)8
-rw-r--r--Master/texmf-dist/tex/context/base/supp-box.mkiv2501
-rw-r--r--Master/texmf-dist/tex/context/base/supp-dir.mkiv11
-rw-r--r--Master/texmf-dist/tex/context/base/supp-fil.lua243
-rw-r--r--Master/texmf-dist/tex/context/base/supp-fil.mkiv66
-rw-r--r--Master/texmf-dist/tex/context/base/supp-fun.mkii (renamed from Master/texmf-dist/tex/context/base/supp-fun.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/supp-fun.mkiv746
-rw-r--r--Master/texmf-dist/tex/context/base/supp-lat.mkii (renamed from Master/texmf-dist/tex/context/base/syst-ltx.tex)3
-rw-r--r--Master/texmf-dist/tex/context/base/supp-mat.mkiv150
-rw-r--r--Master/texmf-dist/tex/context/base/supp-mpe.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/supp-num.mkii (renamed from Master/texmf-dist/tex/context/base/supp-num.tex)21
-rw-r--r--Master/texmf-dist/tex/context/base/supp-num.mkiv504
-rw-r--r--Master/texmf-dist/tex/context/base/supp-pat.mkii4
-rw-r--r--Master/texmf-dist/tex/context/base/supp-pdf.mkii10
-rw-r--r--Master/texmf-dist/tex/context/base/supp-ran.lua9
-rw-r--r--Master/texmf-dist/tex/context/base/supp-ran.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/base/supp-vis.mkii (renamed from Master/texmf-dist/tex/context/base/supp-vis.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/supp-vis.mkiv1907
-rw-r--r--Master/texmf-dist/tex/context/base/symb-cow.mkii132
-rw-r--r--Master/texmf-dist/tex/context/base/symb-cow.mkiv130
-rw-r--r--Master/texmf-dist/tex/context/base/symb-cow.tex132
-rw-r--r--Master/texmf-dist/tex/context/base/symb-eur.mkii (renamed from Master/texmf-dist/tex/context/base/symb-eur.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/symb-eur.mkiv52
-rw-r--r--Master/texmf-dist/tex/context/base/symb-glm.mkii (renamed from Master/texmf-dist/tex/context/base/symb-glm.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/symb-ini.lua38
-rw-r--r--Master/texmf-dist/tex/context/base/symb-ini.mkii13
-rw-r--r--Master/texmf-dist/tex/context/base/symb-ini.mkiv56
-rw-r--r--Master/texmf-dist/tex/context/base/symb-jmn.mkii (renamed from Master/texmf-dist/tex/context/base/symb-jmn.tex)9
-rw-r--r--Master/texmf-dist/tex/context/base/symb-jmn.mkiv196
-rw-r--r--Master/texmf-dist/tex/context/base/symb-mis.mkii (renamed from Master/texmf-dist/tex/context/base/symb-mis.tex)28
-rw-r--r--Master/texmf-dist/tex/context/base/symb-mis.mkiv76
-rw-r--r--Master/texmf-dist/tex/context/base/symb-mvs.mkii (renamed from Master/texmf-dist/tex/context/base/symb-mvs.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/symb-mvs.mkiv263
-rw-r--r--Master/texmf-dist/tex/context/base/symb-nav.mkii (renamed from Master/texmf-dist/tex/context/base/symb-nav.tex)6
-rw-r--r--Master/texmf-dist/tex/context/base/symb-nav.mkiv129
-rw-r--r--Master/texmf-dist/tex/context/base/symb-run.mkiv75
-rw-r--r--Master/texmf-dist/tex/context/base/symb-uni.mkii (renamed from Master/texmf-dist/tex/context/base/symb-uni.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/symb-was.mkii (renamed from Master/texmf-dist/tex/context/base/symb-was.tex)4
-rw-r--r--Master/texmf-dist/tex/context/base/syst-aux.mkiv1503
-rw-r--r--Master/texmf-dist/tex/context/base/syst-con.lua26
-rw-r--r--Master/texmf-dist/tex/context/base/syst-con.mkiv34
-rw-r--r--Master/texmf-dist/tex/context/base/syst-ext.mkii12
-rw-r--r--Master/texmf-dist/tex/context/base/syst-ini.mkii (renamed from Master/texmf-dist/tex/context/base/syst-ini.tex)115
-rw-r--r--Master/texmf-dist/tex/context/base/syst-ini.mkiv933
-rw-r--r--Master/texmf-dist/tex/context/base/syst-lua.lua52
-rw-r--r--Master/texmf-dist/tex/context/base/syst-lua.mkiv18
-rw-r--r--Master/texmf-dist/tex/context/base/syst-mes.mkiv22
-rw-r--r--Master/texmf-dist/tex/context/base/syst-pln.mkii (renamed from Master/texmf-dist/tex/context/base/syst-pln.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/syst-pln.mkiv120
-rw-r--r--Master/texmf-dist/tex/context/base/syst-str.mkiv36
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-ltb.mkiv100
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-ntb.mkii8
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-ntb.mkiv188
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-nte.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-pln.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-tab.mkiv3473
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-tbl.lua37
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-tbl.mkiv1433
-rw-r--r--Master/texmf-dist/tex/context/base/tabl-tsp.mkiv55
-rw-r--r--Master/texmf-dist/tex/context/base/task-ini.lua211
-rw-r--r--Master/texmf-dist/tex/context/base/thrd-pic.mkii (renamed from Master/texmf-dist/tex/context/base/thrd-pic.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/thrd-tab.mkii (renamed from Master/texmf-dist/tex/context/base/thrd-tab.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/toks-ini.lua294
-rw-r--r--Master/texmf-dist/tex/context/base/toks-ini.mkiv20
-rw-r--r--Master/texmf-dist/tex/context/base/trac-deb.lua283
-rw-r--r--Master/texmf-dist/tex/context/base/trac-deb.mkiv26
-rw-r--r--Master/texmf-dist/tex/context/base/trac-inf.lua189
-rw-r--r--Master/texmf-dist/tex/context/base/trac-lmx.lua18
-rw-r--r--Master/texmf-dist/tex/context/base/trac-log.lua687
-rw-r--r--Master/texmf-dist/tex/context/base/trac-pro.lua208
-rw-r--r--Master/texmf-dist/tex/context/base/trac-set.lua330
-rw-r--r--Master/texmf-dist/tex/context/base/trac-tex.lua74
-rw-r--r--Master/texmf-dist/tex/context/base/trac-tex.mkiv21
-rw-r--r--Master/texmf-dist/tex/context/base/trac-tim.lua22
-rw-r--r--Master/texmf-dist/tex/context/base/trac-tra.lua341
-rw-r--r--Master/texmf-dist/tex/context/base/trac-vis.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/type-ghz.mkiv24
-rw-r--r--Master/texmf-dist/tex/context/base/type-ini.lua31
-rw-r--r--Master/texmf-dist/tex/context/base/type-ini.mkii9
-rw-r--r--Master/texmf-dist/tex/context/base/type-ini.mkiv173
-rw-r--r--Master/texmf-dist/tex/context/base/type-one.mkii6
-rw-r--r--Master/texmf-dist/tex/context/base/type-otf.mkii476
-rw-r--r--Master/texmf-dist/tex/context/base/type-otf.mkiv417
-rw-r--r--Master/texmf-dist/tex/context/base/type-run.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/type-set.mkii8
-rw-r--r--Master/texmf-dist/tex/context/base/type-set.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/type-siz.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/typo-brk.lua128
-rw-r--r--Master/texmf-dist/tex/context/base/typo-brk.mkiv14
-rw-r--r--Master/texmf-dist/tex/context/base/typo-cap.lua203
-rw-r--r--Master/texmf-dist/tex/context/base/typo-cap.mkiv18
-rw-r--r--Master/texmf-dist/tex/context/base/typo-cln.lua91
-rw-r--r--Master/texmf-dist/tex/context/base/typo-cln.mkiv30
-rw-r--r--Master/texmf-dist/tex/context/base/typo-dig.lua142
-rw-r--r--Master/texmf-dist/tex/context/base/typo-dig.mkiv25
-rw-r--r--Master/texmf-dist/tex/context/base/typo-dir.lua (renamed from Master/texmf-dist/tex/context/base/typo-mir.lua)208
-rw-r--r--Master/texmf-dist/tex/context/base/typo-dir.mkiv (renamed from Master/texmf-dist/tex/context/base/typo-mir.mkiv)51
-rw-r--r--Master/texmf-dist/tex/context/base/typo-ini.lua9
-rw-r--r--Master/texmf-dist/tex/context/base/typo-ini.mkiv7
-rw-r--r--Master/texmf-dist/tex/context/base/typo-krn.lua204
-rw-r--r--Master/texmf-dist/tex/context/base/typo-krn.mkiv22
-rw-r--r--Master/texmf-dist/tex/context/base/typo-mar.lua579
-rw-r--r--Master/texmf-dist/tex/context/base/typo-mar.mkiv351
-rw-r--r--Master/texmf-dist/tex/context/base/typo-rep.lua79
-rw-r--r--Master/texmf-dist/tex/context/base/typo-rep.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/typo-spa.lua138
-rw-r--r--Master/texmf-dist/tex/context/base/typo-spa.mkiv16
-rw-r--r--Master/texmf-dist/tex/context/base/unic-003.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/unic-004.mkii6
-rw-r--r--Master/texmf-dist/tex/context/base/unic-ini.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/unic-ini.mkii12
-rw-r--r--Master/texmf-dist/tex/context/base/unic-ini.mkiv20
-rw-r--r--Master/texmf-dist/tex/context/base/unic-run.mkii12
-rw-r--r--Master/texmf-dist/tex/context/base/util-deb.lua157
-rw-r--r--Master/texmf-dist/tex/context/base/util-dim.lua (renamed from Master/texmf-dist/tex/context/base/l-dimen.lua)190
-rw-r--r--Master/texmf-dist/tex/context/base/util-fmt.lua96
-rw-r--r--Master/texmf-dist/tex/context/base/util-lua.lua48
-rw-r--r--Master/texmf-dist/tex/context/base/util-mrg.lua138
-rw-r--r--Master/texmf-dist/tex/context/base/util-pck.lua142
-rw-r--r--Master/texmf-dist/tex/context/base/util-prs.lua229
-rw-r--r--Master/texmf-dist/tex/context/base/util-seq.lua276
-rw-r--r--Master/texmf-dist/tex/context/base/util-sto.lua168
-rw-r--r--Master/texmf-dist/tex/context/base/util-str.lua107
-rw-r--r--Master/texmf-dist/tex/context/base/util-tab.lua105
-rw-r--r--Master/texmf-dist/tex/context/base/x-asciimath.lua21
-rw-r--r--Master/texmf-dist/tex/context/base/x-asciimath.mkiv8
-rw-r--r--Master/texmf-dist/tex/context/base/x-calcmath.lua19
-rw-r--r--Master/texmf-dist/tex/context/base/x-calcmath.mkiv29
-rw-r--r--Master/texmf-dist/tex/context/base/x-cals.lua6
-rw-r--r--Master/texmf-dist/tex/context/base/x-cals.mkiv6
-rw-r--r--Master/texmf-dist/tex/context/base/x-chemml.lua51
-rw-r--r--Master/texmf-dist/tex/context/base/x-chemml.mkiv88
-rw-r--r--Master/texmf-dist/tex/context/base/x-chemml.tex16
-rw-r--r--Master/texmf-dist/tex/context/base/x-css.lua94
-rw-r--r--Master/texmf-dist/tex/context/base/x-css.mkiv39
-rw-r--r--Master/texmf-dist/tex/context/base/x-ct.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/x-dir-05.mkiv2
-rw-r--r--Master/texmf-dist/tex/context/base/x-fdf-00.mkii (renamed from Master/texmf-dist/tex/context/base/x-fdf-00.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-fig-00.mkii (renamed from Master/texmf-dist/tex/context/base/x-fig-00.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-fig-01.mkii (renamed from Master/texmf-dist/tex/context/base/x-fig-01.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-fig-02.mkii (renamed from Master/texmf-dist/tex/context/base/x-fig-02.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-fig-03.mkii (renamed from Master/texmf-dist/tex/context/base/x-fig-03.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-fo.mkii2
-rw-r--r--Master/texmf-dist/tex/context/base/x-ldx.lua (renamed from Master/texmf-dist/scripts/context/lua/x-ldx.lua)10
-rw-r--r--Master/texmf-dist/tex/context/base/x-ldx.mkiv (renamed from Master/texmf-dist/tex/context/base/x-ldx.tex)19
-rw-r--r--Master/texmf-dist/tex/context/base/x-mathml.lua520
-rw-r--r--Master/texmf-dist/tex/context/base/x-mathml.mkiv304
-rw-r--r--Master/texmf-dist/tex/context/base/x-mathml.tex16
-rw-r--r--Master/texmf-dist/tex/context/base/x-newcml.mkii (renamed from Master/texmf-dist/tex/context/base/x-newcml.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-newmme.mkii (renamed from Master/texmf-dist/tex/context/base/x-newmme.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-newmml.tex16
-rw-r--r--Master/texmf-dist/tex/context/base/x-newmmo.mkii (renamed from Master/texmf-dist/tex/context/base/x-newmmo.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-newpml.mkii (renamed from Master/texmf-dist/tex/context/base/x-newpml.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-openmath.mkii (renamed from Master/texmf-dist/tex/context/base/x-openmath.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-pending.mkiv39
-rw-r--r--Master/texmf-dist/tex/context/base/x-physml.tex16
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-00.mkii (renamed from Master/texmf-dist/tex/context/base/x-res-00.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-01.mkii (renamed from Master/texmf-dist/tex/context/base/x-res-01.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-01.mkiv428
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-02.mkii (renamed from Master/texmf-dist/tex/context/base/x-res-02.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-03.mkii (renamed from Master/texmf-dist/tex/context/base/x-res-03.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-04.mkii (renamed from Master/texmf-dist/tex/context/base/x-res-04.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-08.mkii (renamed from Master/texmf-dist/tex/context/base/x-res-08.tex)4
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-09.mkii (renamed from Master/texmf-dist/tex/context/base/x-res-09.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-10.mkii (renamed from Master/texmf-dist/tex/context/base/x-res-10.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-11.mkii (renamed from Master/texmf-dist/tex/context/base/x-res-11.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-12.mkii (renamed from Master/texmf-dist/tex/context/base/x-res-12.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-20.mkii (renamed from Master/texmf-dist/tex/context/base/x-res-20.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-50.mkii (renamed from Master/texmf-dist/tex/context/base/x-res-50.tex)2
-rw-r--r--Master/texmf-dist/tex/context/base/x-res-50.mkiv431
-rw-r--r--Master/texmf-dist/tex/context/base/x-sch-00.mkii (renamed from Master/texmf-dist/tex/context/base/x-sch-00.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-sch-01.mkii (renamed from Master/texmf-dist/tex/context/base/x-sch-01.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-set-01.mkii (renamed from Master/texmf-dist/tex/context/base/x-set-01.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-set-02.mkii (renamed from Master/texmf-dist/tex/context/base/x-set-02.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-set-11.mkii266
-rw-r--r--Master/texmf-dist/tex/context/base/x-set-11.mkiv305
-rw-r--r--Master/texmf-dist/tex/context/base/x-set-11.tex110
-rw-r--r--Master/texmf-dist/tex/context/base/x-set-12.mkii (renamed from Master/texmf-dist/tex/context/base/x-set-12.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-set-12.mkiv258
-rw-r--r--Master/texmf-dist/tex/context/base/x-set-99.tex283
-rw-r--r--Master/texmf-dist/tex/context/base/x-steps.mkii (renamed from Master/texmf-dist/tex/context/base/m-steps.mkii)2
-rw-r--r--Master/texmf-dist/tex/context/base/x-steps.mkiv99
-rw-r--r--Master/texmf-dist/tex/context/base/x-xml-01.mkii (renamed from Master/texmf-dist/tex/context/base/x-xml-01.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-xml-02.mkii (renamed from Master/texmf-dist/tex/context/base/x-xml-02.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-xml-11.mkii (renamed from Master/texmf-dist/tex/context/base/x-xml-11.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/x-xtag.mkiv19
-rw-r--r--Master/texmf-dist/tex/context/base/xetx-utf.mkii5
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-cml.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-cml.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-ent.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-ent.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-exp.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-exp.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-ext.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-ext.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-hyp.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-hyp.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-ini.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-ini.tex)44
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-map.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-map.tex)8
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-mea.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-mea.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-meb.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-meb.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-mec.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-mec.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-meh.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-meh.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-men.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-men.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-meo.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-meo.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-mer.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-mer.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-mmc.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-mmc.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-mml.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-mml.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-mmp.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-mmp.tex)6
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-mxa.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-mxa.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-mxb.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-mxb.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-mxc.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-mxc.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-mxh.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-mxh.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-mxn.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-mxn.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-mxo.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-mxo.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-mxr.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-mxr.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-pml.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-pml.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-pmu.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-pmu.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-pre.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-pre.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-prs.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-prs.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-raw.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-raw.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-rng.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-rng.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-run.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-run.tex)2
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-stk.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-stk.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-utf.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-utf.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-xsd.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-xsd.tex)0
-rw-r--r--Master/texmf-dist/tex/context/base/xtag-xsl.mkii (renamed from Master/texmf-dist/tex/context/base/xtag-xsl.tex)0
-rw-r--r--Master/texmf-dist/tex/context/bib/bibl-apa.tex34
-rw-r--r--Master/texmf-dist/tex/context/bib/sample.bib38
-rw-r--r--Master/texmf-dist/tex/context/config/cont-de.ini2
-rw-r--r--Master/texmf-dist/tex/context/config/cont-en.ini2
-rw-r--r--Master/texmf-dist/tex/context/config/cont-fr.ini2
-rw-r--r--Master/texmf-dist/tex/context/config/cont-it.ini2
-rw-r--r--Master/texmf-dist/tex/context/config/cont-nl.ini2
-rw-r--r--Master/texmf-dist/tex/context/config/cont-ro.ini2
-rw-r--r--Master/texmf-dist/tex/context/config/cont-usr.tex109
-rw-r--r--Master/texmf-dist/tex/context/fonts/antykwapoltawskiego.lfg245
-rw-r--r--Master/texmf-dist/tex/context/fonts/asana-math.lfg52
-rw-r--r--Master/texmf-dist/tex/context/fonts/cambria-math.lfg26
-rw-r--r--Master/texmf-dist/tex/context/fonts/demo.lfg52
-rw-r--r--Master/texmf-dist/tex/context/fonts/dingbats.lfg213
-rw-r--r--Master/texmf-dist/tex/context/fonts/husayni.lfg36
-rw-r--r--Master/texmf-dist/tex/context/fonts/hvmath-math.lfg2
-rw-r--r--Master/texmf-dist/tex/context/fonts/informal-math.lfg12
-rw-r--r--Master/texmf-dist/tex/context/fonts/lm-math.lfg51
-rw-r--r--Master/texmf-dist/tex/context/fonts/lucida-math.lfg34
-rw-r--r--Master/texmf-dist/tex/context/fonts/px-math.lfg6
-rw-r--r--Master/texmf-dist/tex/context/fonts/tx-math.lfg4
-rw-r--r--Master/texmf-dist/tex/context/fonts/xits-math.lfg25
-rw-r--r--Master/texmf-dist/tex/context/interface/cont-cs.xml106
-rw-r--r--Master/texmf-dist/tex/context/interface/cont-de.xml106
-rw-r--r--Master/texmf-dist/tex/context/interface/cont-en.xml102
-rw-r--r--Master/texmf-dist/tex/context/interface/cont-fr.xml106
-rw-r--r--Master/texmf-dist/tex/context/interface/cont-it.xml106
-rw-r--r--Master/texmf-dist/tex/context/interface/cont-nl.xml106
-rw-r--r--Master/texmf-dist/tex/context/interface/cont-pe.xml106
-rw-r--r--Master/texmf-dist/tex/context/interface/cont-ro.xml106
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-cs.xml26
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-de.xml26
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-en.xml26
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-fr.xml28
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-it.xml26
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-nl.xml26
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-pe.xml26
-rw-r--r--Master/texmf-dist/tex/context/interface/keys-ro.xml26
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-af.hyp8
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-af.lua47
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-af.pat10349
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-af.rme28
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-agr.hyp34
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-agr.lua56
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-agr.pat225
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-agr.rme39
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-bg.lua64
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-bg.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-ca.lua148
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-ca.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-cs.lua108
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-cs.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-cy.lua85
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-cy.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-da.lua95
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-da.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-de.lua53
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-de.rme5
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-deo.lua53
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-deo.rme5
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-es.lua47
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-es.rme5
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-et.lua101
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-et.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-eu.lua66
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-eu.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-fi.lua99
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-fi.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-fr.lua127
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-fr.pat69
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-fr.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-gb.lua83
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-gb.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-hr.lua91
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-hr.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-hu.lua32
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-hu.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-is.lua100
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-is.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-it.lua75
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-it.pat31
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-it.rme52
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-la.lua127
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-la.rme11
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-lt.lua68
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-lt.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-lv.hyp8
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-lv.lua36
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-lv.pat11590
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-lv.rme19
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-mn.lua107
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-mn.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-nb.hyp49
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-nb.lua58
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-nb.pat1
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-nb.rme117
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-nl.lua121
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-nl.rhl2907
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-nl.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-nl.rpl12948
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-nn.hyp49
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-nn.lua58
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-nn.pat1
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-nn.rme117
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-pl.lua112
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-pl.rme5
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-pt.lua109
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-pt.pat5
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-pt.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-ro.lua131
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-ro.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-ru.lua100
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-ru.pat2217
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-ru.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-sk.lua106
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-sk.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-sl.lua115
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-sl.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-sr.lua103
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-sr.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-sv.lua133
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-sv.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-tk.lua39
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-tk.pat3
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-tk.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-tr.lua47
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-tr.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-uk.lua91
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-uk.pat2444
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-uk.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-us.lua63
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-us.rme6
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-zh.lua109
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-zh.pat7
-rw-r--r--Master/texmf-dist/tex/context/patterns/lang-zh.rme6
-rw-r--r--Master/texmf-dist/tex/context/sample/cow.pdfbin0 -> 5526 bytes
-rw-r--r--Master/texmf-dist/tex/context/sample/douglas.tex26
-rw-r--r--Master/texmf-dist/tex/context/sample/hacker.jpgbin0 -> 36148 bytes
-rw-r--r--Master/texmf-dist/tex/context/sample/khatt-ar.tex4
-rw-r--r--Master/texmf-dist/tex/context/sample/khatt-en.tex4
-rw-r--r--Master/texmf-dist/tex/context/sample/mill.pngbin0 -> 154867 bytes
-rw-r--r--Master/texmf-dist/tex/context/sample/spider.eps2843
-rw-r--r--Master/texmf-dist/tex/context/test/pdf-a1a-2005.mkiv43
-rw-r--r--Master/texmf-dist/tex/context/test/pdf-a1b-2005.mkiv42
-rw-r--r--Master/texmf-dist/tex/context/test/pdf-x-common.mkiv30
-rw-r--r--Master/texmf-dist/tex/context/test/pdf-x1a-2001.mkiv9
-rw-r--r--Master/texmf-dist/tex/context/test/pdf-x1a-2003.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/test/pdf-x3-2002.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/test/pdf-x3-2003.mkiv9
-rw-r--r--Master/texmf-dist/tex/context/test/pdf-x4.mkiv11
-rw-r--r--Master/texmf-dist/tex/context/test/pdf-x4p.mkiv10
-rw-r--r--Master/texmf-dist/tex/context/user/cont-sys.rme11
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-basics-gen.lua226
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-basics-nod.lua95
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-fonts-cbk.lua68
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-fonts-def.lua97
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-fonts-demo-vf-1.lua38
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-fonts-enc.lua28
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-fonts-ext.lua276
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-fonts-lua.lua33
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-fonts-merged.lua14505
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-fonts-syn.lua83
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-fonts-tfm.lua38
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-fonts.lua163
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-fonts.tex3
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-mplib.lua86
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-mplib.tex3
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-plain.tex25
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-preprocessor-test.tex30
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-preprocessor.lua163
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-preprocessor.tex14
-rw-r--r--Master/texmf-dist/tex/generic/context/luatex-test.tex22
-rw-r--r--Master/texmf-dist/tex/generic/context/mptopdf.tex4
-rw-r--r--Master/texmf/web2c/texmfcnf.lua190
-rw-r--r--Master/tlpkg/tlpsrc/context.tlpsrc3
1279 files changed, 197357 insertions, 114034 deletions
diff --git a/Master/bin/win32/mtxrun.dll b/Master/bin/win32/mtxrun.dll
index 041e1a0e1d0..4116c5a24a6 100755
--- a/Master/bin/win32/mtxrun.dll
+++ b/Master/bin/win32/mtxrun.dll
Binary files differ
diff --git a/Master/bin/win32/mtxrun.lua b/Master/bin/win32/mtxrun.lua
index 2bdd1b8f020..cc5ebb478ac 100755
--- a/Master/bin/win32/mtxrun.lua
+++ b/Master/bin/win32/mtxrun.lua
@@ -8,7 +8,6 @@ if not modules then modules = { } end modules ['mtxrun'] = {
license = "see context related readme files"
}
-
-- one can make a stub:
--
-- #!/bin/sh
@@ -38,8 +37,6 @@ if not modules then modules = { } end modules ['mtxrun'] = {
-- remember for subruns: _CTX_K_S_#{original}_
-- remember for subruns: TEXMFSTART.#{original} [tex.rb texmfstart.rb]
-texlua = true
-
-- begin library merge
@@ -54,8 +51,9 @@ if not modules then modules = { } end modules ['l-string'] = {
license = "see context related readme files"
}
+local string = string
local sub, gsub, find, match, gmatch, format, char, byte, rep, lower = string.sub, string.gsub, string.find, string.match, string.gmatch, string.format, string.char, string.byte, string.rep, string.lower
-local lpegmatch = lpeg.match
+local lpegmatch, S, C, Ct = lpeg.match, lpeg.S, lpeg.C, lpeg.Ct
-- some functions may disappear as they are not used anywhere
@@ -63,196 +61,68 @@ if not string.split then
-- this will be overloaded by a faster lpeg variant
- function string:split(pattern)
- if #self > 0 then
- local t = { }
- for s in gmatch(self..pattern,"(.-)"..pattern) do
- t[#t+1] = s
+ function string.split(str,pattern)
+ local t = { }
+ if #str > 0 then
+ local n = 1
+ for s in gmatch(str..pattern,"(.-)"..pattern) do
+ t[n] = s
+ n = n + 1
end
- return t
- else
- return { }
end
+ return t
end
end
-local chr_to_esc = {
- ["%"] = "%%",
- ["."] = "%.",
- ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
- ["^"] = "%^", ["$"] = "%$",
- ["["] = "%[", ["]"] = "%]",
- ["("] = "%(", [")"] = "%)",
- ["{"] = "%{", ["}"] = "%}"
-}
-
-string.chr_to_esc = chr_to_esc
-
-function string:esc() -- variant 2
- return (gsub(self,"(.)",chr_to_esc))
-end
-
-function string:unquote()
- return (gsub(self,"^([\"\'])(.*)%1$","%2"))
+function string.unquoted(str)
+ return (gsub(str,"^([\"\'])(.*)%1$","%2"))
end
---~ function string:unquote()
---~ if find(self,"^[\'\"]") then
---~ return sub(self,2,-2)
---~ else
---~ return self
---~ end
---~ end
-function string:quote() -- we could use format("%q")
- return format("%q",self)
+function string.quoted(str)
+ return format("%q",str) -- always "
end
-function string:count(pattern) -- variant 3
+function string.count(str,pattern) -- variant 3
local n = 0
- for _ in gmatch(self,pattern) do
+ for _ in gmatch(str,pattern) do -- not for utf
n = n + 1
end
return n
end
-function string:limit(n,sentinel)
- if #self > n then
- sentinel = sentinel or " ..."
- return sub(self,1,(n-#sentinel)) .. sentinel
- else
- return self
- end
-end
-
---~ function string:strip() -- the .- is quite efficient
---~ -- return match(self,"^%s*(.-)%s*$") or ""
---~ -- return match(self,'^%s*(.*%S)') or '' -- posted on lua list
---~ return find(s,'^%s*$') and '' or match(s,'^%s*(.*%S)')
---~ end
-
-do -- roberto's variant:
- local space = lpeg.S(" \t\v\n")
- local nospace = 1 - space
- local stripper = space^0 * lpeg.C((space^0 * nospace^1)^0)
- function string.strip(str)
- return lpegmatch(stripper,str) or ""
- end
-end
-
-function string:is_empty()
- return not find(self,"%S")
-end
-
-function string:enhance(pattern,action)
- local ok, n = true, 0
- while ok do
- ok = false
- self = gsub(self,pattern, function(...)
- ok, n = true, n + 1
- return action(...)
- end)
- end
- return self, n
-end
-
-local chr_to_hex, hex_to_chr = { }, { }
-
-for i=0,255 do
- local c, h = char(i), format("%02X",i)
- chr_to_hex[c], hex_to_chr[h] = h, c
-end
-
-function string:to_hex()
- return (gsub(self or "","(.)",chr_to_hex))
-end
-
-function string:from_hex()
- return (gsub(self or "","(..)",hex_to_chr))
-end
-
-if not string.characters then
-
- local function nextchar(str, index)
- index = index + 1
- return (index <= #str) and index or nil, sub(str,index,index)
- end
- function string:characters()
- return nextchar, self, 0
- end
- local function nextbyte(str, index)
- index = index + 1
- return (index <= #str) and index or nil, byte(sub(str,index,index))
- end
- function string:bytes()
- return nextbyte, self, 0
- end
-
-end
-
--- we can use format for this (neg n)
-
-function string:rpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return self .. rep(chr or " ",m)
+function string.limit(str,n,sentinel) -- not utf proof
+ if #str > n then
+ sentinel = sentinel or "..."
+ return sub(str,1,(n-#sentinel)) .. sentinel
else
- return self
- end
-end
-
-function string:lpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return rep(chr or " ",m) .. self
- else
- return self
+ return str
end
end
-string.padd = string.rpadd
+local space = S(" \t\v\n")
+local nospace = 1 - space
+local stripper = space^0 * C((space^0 * nospace^1)^0) -- roberto's code
-function is_number(str) -- tonumber
- return find(str,"^[%-%+]?[%d]-%.?[%d+]$") == 1
+function string.strip(str)
+ return lpegmatch(stripper,str) or ""
end
---~ print(is_number("1"))
---~ print(is_number("1.1"))
---~ print(is_number(".1"))
---~ print(is_number("-0.1"))
---~ print(is_number("+0.1"))
---~ print(is_number("-.1"))
---~ print(is_number("+.1"))
-
-function string:split_settings() -- no {} handling, see l-aux for lpeg variant
- if find(self,"=") then
- local t = { }
- for k,v in gmatch(self,"(%a+)=([^%,]*)") do
- t[k] = v
- end
- return t
- else
- return nil
- end
+function string.is_empty(str)
+ return not find(str,"%S")
end
local patterns_escapes = {
- ["-"] = "%-",
- ["."] = "%.",
- ["+"] = "%+",
- ["*"] = "%*",
["%"] = "%%",
- ["("] = "%)",
- [")"] = "%)",
- ["["] = "%[",
- ["]"] = "%]",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%(", [")"] = "%)",
+ -- ["{"] = "%{", ["}"] = "%}"
+ -- ["^"] = "%^", ["$"] = "%$",
}
-function string:pattesc()
- return (gsub(self,".",patterns_escapes))
-end
-
local simple_escapes = {
["-"] = "%-",
["."] = "%.",
@@ -260,80 +130,30 @@ local simple_escapes = {
["*"] = ".*",
}
-function string:simpleesc()
- return (gsub(self,".",simple_escapes))
-end
-
-function string:tohash()
- local t = { }
- for s in gmatch(self,"([^, ]+)") do -- lpeg
- t[s] = true
- end
- return t
-end
-
-local pattern = lpeg.Ct(lpeg.C(1)^0)
-
-function string:totable()
- return lpegmatch(pattern,self)
+function string.escapedpattern(str,simple)
+ return (gsub(str,".",simple and simple_escapes or patterns_escapes))
end
---~ local t = {
---~ "1234567123456712345671234567",
---~ "a\tb\tc",
---~ "aa\tbb\tcc",
---~ "aaa\tbbb\tccc",
---~ "aaaa\tbbbb\tcccc",
---~ "aaaaa\tbbbbb\tccccc",
---~ "aaaaaa\tbbbbbb\tcccccc",
---~ }
---~ for k,v do
---~ print(string.tabtospace(t[k]))
---~ end
-
-function string.tabtospace(str,tab)
- -- we don't handle embedded newlines
- while true do
- local s = find(str,"\t")
- if s then
- if not tab then tab = 7 end -- only when found
- local d = tab-(s-1) % tab
- if d > 0 then
- str = gsub(str,"\t",rep(" ",d),1)
- else
- str = gsub(str,"\t","",1)
- end
+function string.topattern(str,lowercase,strict)
+ if str == "" then
+ return ".*"
+ else
+ str = gsub(str,".",simple_escapes)
+ if lowercase then
+ str = lower(str)
+ end
+ if strict then
+ return "^" .. str .. "$"
else
- break
+ return str
end
end
- return str
end
-function string:compactlong() -- strips newlines and leading spaces
- self = gsub(self,"[\n\r]+ *","")
- self = gsub(self,"^ *","")
- return self
-end
-
-function string:striplong() -- strips newlines and leading spaces
- self = gsub(self,"^%s*","")
- self = gsub(self,"[\n\r]+ *","\n")
- return self
-end
+-- obsolete names:
-function string:topattern(lowercase,strict)
- if lowercase then
- self = lower(self)
- end
- self = gsub(self,".",simple_escapes)
- if self == "" then
- self = ".*"
- elseif strict then
- self = "^" .. self .. "$"
- end
- return self
-end
+string.quote = string.quoted
+string.unquote = string.unquoted
end -- of closure
@@ -350,28 +170,75 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
local lpeg = require("lpeg")
+local type = type
+
+-- Beware, we predefine a bunch of patterns here and one reason for doing so
+-- is that we get consistent behaviour in some of the visualizers.
+
lpeg.patterns = lpeg.patterns or { } -- so that we can share
local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
-local match = lpeg.match
+local P, R, S, V, match = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.match
+local Ct, C, Cs, Cc = lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local lpegtype = lpeg.type
+
+local utfcharacters = string.utfcharacters
+local utfgmatch = unicode and unicode.utf8.gmatch
+
+local anything = P(1)
+local endofstring = P(-1)
+local alwaysmatched = P(true)
+
+patterns.anything = anything
+patterns.endofstring = endofstring
+patterns.beginofstring = alwaysmatched
+patterns.alwaysmatched = alwaysmatched
local digit, sign = R('09'), S('+-')
local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
-local utf8byte = R("\128\191")
+local newline = crlf + cr + lf
+local escaped = P("\\") * anything
+local squote = P("'")
+local dquote = P('"')
+local space = P(" ")
+
+local utfbom_32_be = P('\000\000\254\255')
+local utfbom_32_le = P('\255\254\000\000')
+local utfbom_16_be = P('\255\254')
+local utfbom_16_le = P('\254\255')
+local utfbom_8 = P('\239\187\191')
+local utfbom = utfbom_32_be + utfbom_32_le
+ + utfbom_16_be + utfbom_16_le
+ + utfbom_8
+local utftype = utfbom_32_be / "utf-32-be" + utfbom_32_le / "utf-32-le"
+ + utfbom_16_be / "utf-16-be" + utfbom_16_le / "utf-16-le"
+ + utfbom_8 / "utf-8" + alwaysmatched / "unknown"
+
+local utf8next = R("\128\191")
-patterns.utf8byte = utf8byte
patterns.utf8one = R("\000\127")
-patterns.utf8two = R("\194\223") * utf8byte
-patterns.utf8three = R("\224\239") * utf8byte * utf8byte
-patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+patterns.utf8two = R("\194\223") * utf8next
+patterns.utf8three = R("\224\239") * utf8next * utf8next
+patterns.utf8four = R("\240\244") * utf8next * utf8next * utf8next
+patterns.utfbom = utfbom
+patterns.utftype = utftype
+
+local utf8char = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+local validutf8char = utf8char^0 * endofstring * Cc(true) + Cc(false)
+
+patterns.utf8 = utf8char
+patterns.utf8char = utf8char
+patterns.validutf8 = validutf8char
+patterns.validutf8char = validutf8char
patterns.digit = digit
patterns.sign = sign
patterns.cardinal = sign^0 * digit^1
patterns.integer = sign^0 * digit^1
patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.cfloat = sign^0 * digit^0 * P(',') * digit^1
patterns.number = patterns.float + patterns.integer
+patterns.cnumber = patterns.cfloat + patterns.integer
patterns.oct = P("0") * R("07")^1
patterns.octal = patterns.oct
patterns.HEX = P("0x") * R("09","AF")^1
@@ -380,16 +247,42 @@ patterns.hexadecimal = P("0x") * R("09","AF","af")^1
patterns.lowercase = R("az")
patterns.uppercase = R("AZ")
patterns.letter = patterns.lowercase + patterns.uppercase
-patterns.space = S(" ")
+patterns.space = space
+patterns.tab = P("\t")
+patterns.spaceortab = patterns.space + patterns.tab
patterns.eol = S("\n\r")
patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-patterns.newline = crlf + cr + lf
-patterns.nonspace = 1 - patterns.space
+patterns.newline = newline
+patterns.emptyline = newline^1
patterns.nonspacer = 1 - patterns.spacer
patterns.whitespace = patterns.eol + patterns.spacer
patterns.nonwhitespace = 1 - patterns.whitespace
-patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
-patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
+patterns.equal = P("=")
+patterns.comma = P(",")
+patterns.commaspacer = P(",") * patterns.spacer^0
+patterns.period = P(".")
+patterns.colon = P(":")
+patterns.semicolon = P(";")
+patterns.underscore = P("_")
+patterns.escaped = escaped
+patterns.squote = squote
+patterns.dquote = dquote
+patterns.nosquote = (escaped + (1-squote))^0
+patterns.nodquote = (escaped + (1-dquote))^0
+patterns.unsingle = (squote/"") * patterns.nosquote * (squote/"")
+patterns.undouble = (dquote/"") * patterns.nodquote * (dquote/"")
+patterns.unquoted = patterns.undouble + patterns.unsingle -- more often undouble
+patterns.unspacer = ((patterns.spacer^1)/"")^0
+
+patterns.somecontent = (anything - newline - space)^1 -- (utf8char - newline - space)^1
+patterns.beginline = #(1-newline)
+
+local unquoted = Cs(patterns.unquoted * endofstring) -- not C
+
+function string.unquoted(str)
+ return match(unquoted,str) or str
+end
+
function lpeg.anywhere(pattern) --slightly adapted from website
return P { P(pattern) + 1 * V(1) } -- why so complex?
@@ -399,36 +292,18 @@ function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
-local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
-local empty = spacing * Cc("")
-local nonempty = Cs((1-spacing)^1) * spacing^-1
-local content = (empty + nonempty)^1
-
-local capture = Ct(content^0)
-
-function string:splitlines()
- return match(capture,self)
-end
-
-patterns.textline = content
-
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps")) -- oeps
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps")) -- oeps
-
local splitters_s, splitters_m = { }, { }
local function splitat(separator,single)
local splitter = (single and splitters_s[separator]) or splitters_m[separator]
if not splitter then
separator = P(separator)
+ local other = C((1 - separator)^0)
if single then
- local other, any = C((1 - separator)^0), P(1)
+ local any = anything
splitter = other * (separator * C(any^0) + "") -- ?
splitters_s[separator] = splitter
else
- local other = C((1 - separator)^0)
splitter = other * (separator * other)^0
splitters_m[separator] = splitter
end
@@ -438,6 +313,7 @@ end
lpeg.splitat = splitat
+
local cache = { }
function lpeg.split(separator,str)
@@ -449,16 +325,39 @@ function lpeg.split(separator,str)
return match(c,str)
end
-function string:split(separator)
+function string.split(str,separator)
local c = cache[separator]
if not c then
c = Ct(splitat(separator))
cache[separator] = c
end
- return match(c,self)
+ return match(c,str)
+end
+
+local spacing = patterns.spacer^0 * newline -- sort of strip
+local empty = spacing * Cc("")
+local nonempty = Cs((1-spacing)^1) * spacing^-1
+local content = (empty + nonempty)^1
+
+patterns.textline = content
+
+
+local linesplitter = Ct(splitat(newline))
+
+patterns.linesplitter = linesplitter
+
+function string.splitlines(str)
+ return match(linesplitter,str)
+end
+
+local utflinesplitter = utfbom^-1 * Ct(splitat(newline))
+
+patterns.utflinesplitter = utflinesplitter
+
+function string.utfsplitlines(str)
+ return match(utflinesplitter,str)
end
-lpeg.splitters = cache
local cache = { }
@@ -466,37 +365,24 @@ function lpeg.checkedsplit(separator,str)
local c = cache[separator]
if not c then
separator = P(separator)
- local other = C((1 - separator)^0)
+ local other = C((1 - separator)^1)
c = Ct(separator^0 * other * (separator^1 * other)^0)
cache[separator] = c
end
return match(c,str)
end
-function string:checkedsplit(separator)
+function string.checkedsplit(str,separator)
local c = cache[separator]
if not c then
separator = P(separator)
- local other = C((1 - separator)^0)
+ local other = C((1 - separator)^1)
c = Ct(separator^0 * other * (separator^1 * other)^0)
cache[separator] = c
end
- return match(c,self)
+ return match(c,str)
end
---~ function lpeg.append(list,pp)
---~ local p = pp
---~ for l=1,#list do
---~ if p then
---~ p = p + P(list[l])
---~ else
---~ p = P(list[l])
---~ end
---~ end
---~ return p
---~ end
-
---~ from roberto's site:
local f1 = string.byte
@@ -504,7 +390,273 @@ local function f2(s) local c1, c2 = f1(s,1,2) return c1 * 64 + c2
local function f3(s) local c1, c2, c3 = f1(s,1,3) return (c1 * 64 + c2) * 64 + c3 - 925824 end
local function f4(s) local c1, c2, c3, c4 = f1(s,1,4) return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168 end
-patterns.utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
+local utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
+
+patterns.utf8byte = utf8byte
+
+
+
+local cache = { }
+
+function lpeg.stripper(str)
+ if type(str) == "string" then
+ local s = cache[str]
+ if not s then
+ s = Cs(((S(str)^1)/"" + 1)^0)
+ cache[str] = s
+ end
+ return s
+ else
+ return Cs(((str^1)/"" + 1)^0)
+ end
+end
+
+local cache = { }
+
+function lpeg.keeper(str)
+ if type(str) == "string" then
+ local s = cache[str]
+ if not s then
+ s = Cs((((1-S(str))^1)/"" + 1)^0)
+ cache[str] = s
+ end
+ return s
+ else
+ return Cs((((1-str)^1)/"" + 1)^0)
+ end
+end
+
+function lpeg.frontstripper(str) -- or pattern (yet undocumented)
+ return (P(str) + P(true)) * Cs(P(1)^0)
+end
+
+function lpeg.endstripper(str) -- or pattern (yet undocumented)
+ return Cs((1 - P(str) * P(-1))^0)
+end
+
+-- Just for fun I looked at the used bytecode and
+-- p = (p and p + pp) or pp gets one more (testset).
+
+function lpeg.replacer(one,two)
+ if type(one) == "table" then
+ local no = #one
+ if no > 0 then
+ local p
+ for i=1,no do
+ local o = one[i]
+ local pp = P(o[1]) / o[2]
+ if p then
+ p = p + pp
+ else
+ p = pp
+ end
+ end
+ return Cs((p + 1)^0)
+ end
+ else
+ two = two or ""
+ return Cs((P(one)/two + 1)^0)
+ end
+end
+
+local splitters_f, splitters_s = { }, { }
+
+function lpeg.firstofsplit(separator) -- always return value
+ local splitter = splitters_f[separator]
+ if not splitter then
+ separator = P(separator)
+ splitter = C((1 - separator)^0)
+ splitters_f[separator] = splitter
+ end
+ return splitter
+end
+
+function lpeg.secondofsplit(separator) -- nil if not split
+ local splitter = splitters_s[separator]
+ if not splitter then
+ separator = P(separator)
+ splitter = (1 - separator)^0 * separator * C(anything^0)
+ splitters_s[separator] = splitter
+ end
+ return splitter
+end
+
+function lpeg.balancer(left,right)
+ left, right = P(left), P(right)
+ return P { left * ((1 - left - right) + V(1))^0 * right }
+end
+
+
+
+local nany = utf8char/""
+
+function lpeg.counter(pattern)
+ pattern = Cs((P(pattern)/" " + nany)^0)
+ return function(str)
+ return #match(pattern,str)
+ end
+end
+
+if utfgmatch then
+
+ function lpeg.count(str,what) -- replaces string.count
+ if type(what) == "string" then
+ local n = 0
+ for _ in utfgmatch(str,what) do
+ n = n + 1
+ end
+ return n
+ else -- 4 times slower but still faster than / function
+ return #match(Cs((P(what)/" " + nany)^0),str)
+ end
+ end
+
+else
+
+ local cache = { }
+
+ function lpeg.count(str,what) -- replaces string.count
+ if type(what) == "string" then
+ local p = cache[what]
+ if not p then
+ p = Cs((P(what)/" " + nany)^0)
+ cache[p] = p
+ end
+ return #match(p,str)
+ else -- 4 times slower but still faster than / function
+ return #match(Cs((P(what)/" " + nany)^0),str)
+ end
+ end
+
+end
+
+local patterns_escapes = { -- also defines in l-string
+ ["%"] = "%%",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%)", [")"] = "%)",
+ -- ["{"] = "%{", ["}"] = "%}"
+ -- ["^"] = "%^", ["$"] = "%$",
+}
+
+local simple_escapes = { -- also defines in l-string
+ ["-"] = "%-",
+ ["."] = "%.",
+ ["?"] = ".",
+ ["*"] = ".*",
+}
+
+local p = Cs((S("-.+*%()[]") / patterns_escapes + anything)^0)
+local s = Cs((S("-.+*%()[]") / simple_escapes + anything)^0)
+
+function string.escapedpattern(str,simple)
+ return match(simple and s or p,str)
+end
+
+-- utf extensies
+
+lpeg.UP = lpeg.P
+
+if utfcharacters then
+
+ function lpeg.US(str)
+ local p
+ for uc in utfcharacters(str) do
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ return p
+ end
+
+
+elseif utfgmatch then
+
+ function lpeg.US(str)
+ local p
+ for uc in utfgmatch(str,".") do
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ return p
+ end
+
+else
+
+ function lpeg.US(str)
+ local p
+ local f = function(uc)
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ match((utf8char/f)^0,str)
+ return p
+ end
+
+end
+
+local range = Cs(utf8byte) * (Cs(utf8byte) + Cc(false))
+
+local utfchar = unicode and unicode.utf8 and unicode.utf8.char
+
+function lpeg.UR(str,more)
+ local first, last
+ if type(str) == "number" then
+ first = str
+ last = more or first
+ else
+ first, last = match(range,str)
+ if not last then
+ return P(str)
+ end
+ end
+ if first == last then
+ return P(str)
+ elseif utfchar and last - first < 8 then -- a somewhat arbitrary criterium
+ local p
+ for i=first,last do
+ if p then
+ p = p + P(utfchar(i))
+ else
+ p = P(utfchar(i))
+ end
+ end
+ return p -- nil when invalid range
+ else
+ local f = function(b)
+ return b >= first and b <= last
+ end
+ return utf8byte / f -- nil when invalid range
+ end
+end
+
+
+
+function lpeg.oneof(list,...) -- lpeg.oneof("elseif","else","if","then")
+ if type(list) ~= "table" then
+ list = { list, ... }
+ end
+ -- sort(list) -- longest match first
+ local p = P(list[1])
+ for l=2,#list do
+ p = p + P(list[l])
+ end
+ return p
+end
+
+function lpeg.is_lpeg(p)
+ return p and lpegtype(p) == "pattern"
+end
+
end -- of closure
@@ -519,12 +671,10 @@ if not modules then modules = { } end modules ['l-table'] = {
license = "see context related readme files"
}
-table.join = table.concat
-
+local type, next, tostring, tonumber, ipairs, table, string = type, next, tostring, tonumber, ipairs, table, string
local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove
local format, find, gsub, lower, dump, match = string.format, string.find, string.gsub, string.lower, string.dump, string.match
local getmetatable, setmetatable = getmetatable, setmetatable
-local type, next, tostring, tonumber, ipairs = type, next, tostring, tonumber, ipairs
-- Starting with version 5.2 Lua no longer provide ipairs, which makes
-- sense. As we already used the for loop and # in most places the
@@ -576,50 +726,56 @@ end
-- extra functions, some might go (when not used)
function table.strip(tab)
- local lst = { }
+ local lst, l = { }, 0
for i=1,#tab do
local s = gsub(tab[i],"^%s*(.-)%s*$","%1")
if s == "" then
-- skip this one
else
- lst[#lst+1] = s
+ l = l + 1
+ lst[l] = s
end
end
return lst
end
function table.keys(t)
- local k = { }
+ local keys, k = { }, 0
for key, _ in next, t do
- k[#k+1] = key
+ k = k + 1
+ keys[k] = key
end
- return k
+ return keys
end
local function compare(a,b)
- return (tostring(a) < tostring(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)
+ end
end
local function sortedkeys(tab)
- local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
+ local srt, category, s = { }, 0, 0 -- 0=unknown 1=string, 2=number 3=mixed
for key,_ in next, tab do
- srt[#srt+1] = key
- if kind == 3 then
+ s = s + 1
+ srt[s] = key
+ if category == 3 then
-- no further check
else
local tkey = type(key)
if tkey == "string" then
- -- if kind == 2 then kind = 3 else kind = 1 end
- kind = (kind == 2 and 3) or 1
+ category = (category == 2 and 3) or 1
elseif tkey == "number" then
- -- if kind == 1 then kind = 3 else kind = 2 end
- kind = (kind == 1 and 3) or 2
+ category = (category == 1 and 3) or 2
else
- kind = 3
+ category = 3
end
end
end
- if kind == 0 or kind == 3 then
+ if category == 0 or category == 3 then
sort(srt,compare)
else
sort(srt)
@@ -628,9 +784,12 @@ local function sortedkeys(tab)
end
local function sortedhashkeys(tab) -- fast one
- local srt = { }
+ local srt, s = { }, 0
for key,_ in next, tab do
- srt[#srt+1] = key
+ if key then
+ s= s + 1
+ srt[s] = key
+ end
end
sort(srt)
return srt
@@ -639,34 +798,50 @@ end
table.sortedkeys = sortedkeys
table.sortedhashkeys = sortedhashkeys
-function table.sortedhash(t)
- local s = sortedhashkeys(t) -- maybe just sortedkeys
- local n = 0
- local function kv(s)
- n = n + 1
- local k = s[n]
- return k, t[k]
+local function nothing() end
+
+local function sortedhash(t)
+ if t then
+ local n, s = 0, sortedkeys(t) -- the robust one
+ local function kv(s)
+ n = n + 1
+ local k = s[n]
+ return k, t[k]
+ end
+ return kv, s
+ else
+ return nothing
end
- return kv, s
end
-table.sortedpairs = table.sortedhash
+table.sortedhash = sortedhash
+table.sortedpairs = sortedhash
function table.append(t, list)
- for _,v in next, list do
- insert(t,v)
+ local n = #t
+ for i=1,#list do
+ n = n + 1
+ t[n] = list[i]
end
+ return t
end
function table.prepend(t, list)
- for k,v in next, list do
- insert(t,k,v)
+ local nl = #list
+ local nt = nl + #t
+ for i=#t,1,-1 do
+ t[nt] = t[i]
+ nt = nt - 1
+ end
+ for i=1,#list do
+ t[i] = list[i]
end
+ return t
end
function table.merge(t, ...) -- first one is target
- t = t or {}
- local lst = {...}
+ t = t or { }
+ local lst = { ... }
for i=1,#lst do
for k, v in next, lst[i] do
t[k] = v
@@ -676,7 +851,7 @@ function table.merge(t, ...) -- first one is target
end
function table.merged(...)
- local tmp, lst = { }, {...}
+ local tmp, lst = { }, { ... }
for i=1,#lst do
for k, v in next, lst[i] do
tmp[k] = v
@@ -686,41 +861,45 @@ function table.merged(...)
end
function table.imerge(t, ...)
- local lst = {...}
+ local lst, nt = { ... }, #t
for i=1,#lst do
local nst = lst[i]
for j=1,#nst do
- t[#t+1] = nst[j]
+ nt = nt + 1
+ t[nt] = nst[j]
end
end
return t
end
function table.imerged(...)
- local tmp, lst = { }, {...}
+ local tmp, ntmp, lst = { }, 0, {...}
for i=1,#lst do
local nst = lst[i]
for j=1,#nst do
- tmp[#tmp+1] = nst[j]
+ ntmp = ntmp + 1
+ tmp[ntmp] = nst[j]
end
end
return tmp
end
-local function fastcopy(old) -- fast one
+local function fastcopy(old,metatabletoo) -- fast one
if old then
local new = { }
for k,v in next, old do
if type(v) == "table" then
- new[k] = fastcopy(v) -- was just table.copy
+ new[k] = fastcopy(v,metatabletoo) -- was just table.copy
else
new[k] = v
end
end
- -- optional second arg
- local mt = getmetatable(old)
- if mt then
- setmetatable(new,mt)
+ if metatabletoo then
+ -- optional second arg
+ local mt = getmetatable(old)
+ if mt then
+ setmetatable(new,mt)
+ end
end
return new
else
@@ -728,6 +907,8 @@ local function fastcopy(old) -- fast one
end
end
+-- todo : copy without metatable
+
local function copy(t, tables) -- taken from lua wiki, slightly adapted
tables = tables or { }
local tcopy = {}
@@ -760,33 +941,14 @@ end
table.fastcopy = fastcopy
table.copy = copy
--- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
-
-function table.sub(t,i,j)
- return { unpack(t,i,j) }
-end
-
-function table.replace(a,b)
- for k,v in next, b do
- a[k] = v
+function table.derive(parent)
+ local child = { }
+ if parent then
+ setmetatable(child,{ __index = parent })
end
+ return child
end
--- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice)
-
-function table.is_empty(t) -- obolete, use inline code instead
- return not t or not next(t)
-end
-
-function table.one_entry(t) -- obolete, use inline code instead
- local n = next(t)
- return n and not next(t,n)
-end
-
---~ function table.starts_at(t) -- obsolete, not nice anyway
---~ return ipairs(t,1)(t,0)
---~ end
-
function table.tohash(t,value)
local h = { }
if t then
@@ -799,27 +961,19 @@ function table.tohash(t,value)
end
function table.fromhash(t)
- local h = { }
+ local hsh, h = { }, 0
for k, v in next, t do -- no ipairs here
- if v then h[#h+1] = k end
+ if v then
+ h = h + 1
+ hsh[h] = k
+ end
end
- return h
+ return hsh
end
---~ print(table.serialize(t), "\n")
---~ print(table.serialize(t,"name"), "\n")
---~ print(table.serialize(t,false), "\n")
---~ print(table.serialize(t,true), "\n")
---~ print(table.serialize(t,"name",true), "\n")
---~ print(table.serialize(t,"name",true,true), "\n")
-
-table.serialize_functions = true
-table.serialize_compact = true
-table.serialize_inline = true
-
local noquotes, hexify, handle, reduce, compact, inline, functions
-local reserved = table.tohash { -- intercept a language flaw, no reserved words as key
+local reserved = table.tohash { -- intercept a language inconvenience: no reserved words as key
'and', 'break', 'do', 'else', 'elseif', 'end', 'false', 'for', 'function', 'if',
'in', 'local', 'nil', 'not', 'or', 'repeat', 'return', 'then', 'true', 'until', 'while',
}
@@ -831,20 +985,23 @@ local function simple_table(t)
n = n + 1
end
if n == #t then
- local tt = { }
+ local tt, nt = { }, 0
for i=1,#t do
local v = t[i]
local tv = type(v)
if tv == "number" then
+ nt = nt + 1
if hexify then
- tt[#tt+1] = format("0x%04X",v)
+ tt[nt] = format("0x%04X",v)
else
- tt[#tt+1] = tostring(v) -- tostring not needed
+ tt[nt] = tostring(v) -- tostring not needed
end
elseif tv == "boolean" then
- tt[#tt+1] = tostring(v)
+ nt = nt + 1
+ tt[nt] = tostring(v)
elseif tv == "string" then
- tt[#tt+1] = format("%q",v)
+ nt = nt + 1
+ tt[nt] = format("%q",v)
else
tt = nil
break
@@ -870,21 +1027,25 @@ local function do_serialize(root,name,depth,level,indexed)
depth = depth .. " "
if indexed then
handle(format("%s{",depth))
- elseif name then
- --~ handle(format("%s%s={",depth,key(name)))
- if type(name) == "number" then -- or find(k,"^%d+$") then
+ else
+ local tn = type(name)
+ if tn == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s[0x%04X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
- elseif noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
- handle(format("%s%s={",depth,name))
+ elseif tn == "string" then
+ if noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
+ handle(format("%s%s={",depth,name))
+ else
+ handle(format("%s[%q]={",depth,name))
+ end
+ elseif tn == "boolean" then
+ handle(format("%s[%s]={",depth,tostring(name)))
else
- handle(format("%s[%q]={",depth,name))
+ handle(format("%s{",depth))
end
- else
- handle(format("%s{",depth))
end
end
-- we could check for k (index) being number (cardinal)
@@ -901,11 +1062,9 @@ local function do_serialize(root,name,depth,level,indexed)
for i=1,#sk do
local k = sk[i]
local v = root[k]
- --~ if v == root then
- -- circular
- --~ else
- local t = type(v)
- if compact and first and type(k) == "number" and k >= first and k <= last then
+ -- circular
+ local t, tk = type(v), type(k)
+ if compact and first and tk == "number" and k >= first and k <= last then
if t == "number" then
if hexify then
handle(format("%s 0x%04X,",depth,v))
@@ -947,17 +1106,18 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s __p__=nil,",depth))
end
elseif t == "number" then
- --~ if hexify then
- --~ handle(format("%s %s=0x%04X,",depth,key(k),v))
- --~ else
- --~ handle(format("%s %s=%s,",depth,key(k),v)) -- %.99g
- --~ end
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=0x%04X,",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,tostring(k),v))
+ else
+ handle(format("%s [%s]=%s,",depth,tostring(k),v)) -- %.99g
+ end
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
if hexify then
handle(format("%s %s=0x%04X,",depth,k,v))
@@ -973,26 +1133,28 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "string" then
if reduce and tonumber(v) then
- --~ handle(format("%s %s=%s,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=%s,",depth,tostring(k),v))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%s,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
else
- --~ handle(format("%s %s=%q,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=%q,",depth,tostring(k),v))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%q,",depth,k,v))
else
@@ -1001,13 +1163,14 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "table" then
if not next(v) then
- --~ handle(format("%s %s={},",depth,key(k)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]={},",depth,tostring(k)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s={},",depth,k))
else
@@ -1016,13 +1179,14 @@ local function do_serialize(root,name,depth,level,indexed)
elseif inline then
local st = simple_table(v)
if st then
- --~ handle(format("%s %s={ %s },",depth,key(k),concat(st,", ")))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]={ %s },",depth,tostring(k),concat(st,", ")))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s={ %s },",depth,k,concat(st,", ")))
else
@@ -1035,13 +1199,14 @@ local function do_serialize(root,name,depth,level,indexed)
do_serialize(v,k,depth,level+1)
end
elseif t == "boolean" then
- --~ handle(format("%s %s=%s,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%s,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%s,",depth,k,tostring(v)))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]=%s,",depth,tostring(k),tostring(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%s,",depth,k,tostring(v)))
else
@@ -1049,35 +1214,37 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "function" then
if functions then
- --~ handle(format('%s %s=loadstring(%q),',depth,key(k),dump(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v)))
else
handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v)))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=loadstring(%q),",depth,tostring(k),dump(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=loadstring(%q),",depth,k,dump(v)))
else
- handle(format("%s [%q]=loadstring(%q),",depth,k,dump(v)))
+ -- handle(format("%s [%q]=loadstring(%q),",depth,k,dump(v)))
+ handle(format("%s [%q]=loadstring(%q),",depth,k,debug.getinfo(v).what == "C" and "C code" or dump(v)))
end
end
else
- --~ handle(format("%s %s=%q,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]=%q,",depth,tostring(k),tostring(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%q,",depth,k,tostring(v)))
else
handle(format("%s [%q]=%q,",depth,k,tostring(v)))
end
end
- --~ end
- end
+ end
end
if level > 0 then
handle(format("%s},",depth))
@@ -1087,15 +1254,34 @@ end
-- replacing handle by a direct t[#t+1] = ... (plus test) is not much
-- faster (0.03 on 1.00 for zapfino.tma)
-local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
- noquotes = _noquotes
- hexify = _hexify
- handle = _handle or print
- reduce = _reduce or false
- compact = table.serialize_compact
- inline = compact and table.serialize_inline
- functions = table.serialize_functions
+local function serialize(_handle,root,name,specification) -- handle wins
local tname = type(name)
+ if type(specification) == "table" then
+ noquotes = specification.noquotes
+ hexify = specification.hexify
+ handle = _handle or specification.handle or print
+ reduce = specification.reduce or false
+ functions = specification.functions
+ compact = specification.compact
+ inline = specification.inline and compact
+ if functions == nil then
+ functions = true
+ end
+ if compact == nil then
+ compact = true
+ end
+ if inline == nil then
+ inline = compact
+ end
+ else
+ noquotes = false
+ hexify = false
+ handle = _handle or print
+ reduce = false
+ compact = true
+ inline = true
+ functions = true
+ end
if tname == "string" then
if name == "return" then
handle("return {")
@@ -1117,33 +1303,33 @@ local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
else
handle("t={")
end
- if root and next(root) then
- do_serialize(root,name,"",0,indexed)
+ if root then
+ -- The dummy access will initialize a table that has a delayed initialization
+ -- using a metatable. (maybe explicitly test for metatable)
+ if getmetatable(root) then -- todo: make this an option, maybe even per subtable
+ local dummy = root._w_h_a_t_e_v_e_r_
+ root._w_h_a_t_e_v_e_r_ = nil
+ end
+ -- Let's forget about empty tables.
+ if next(root) then
+ do_serialize(root,name,"",0)
+ end
end
handle("}")
end
---~ name:
---~
---~ true : return { }
---~ false : { }
---~ nil : t = { }
---~ string : string = { }
---~ 'return' : return { }
---~ number : [number] = { }
-function table.serialize(root,name,reduce,noquotes,hexify)
- local t = { }
+function table.serialize(root,name,specification)
+ local t, n = { }, 0
local function flush(s)
- t[#t+1] = s
+ n = n + 1
+ t[n] = s
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
return concat(t,"\n")
end
-function table.tohandle(handle,root,name,reduce,noquotes,hexify)
- serialize(root,name,handle,reduce,noquotes,hexify)
-end
+table.tohandle = serialize
-- sometimes tables are real use (zapfino extra pro is some 85M) in which
-- case a stepwise serialization is nice; actually, we could consider:
@@ -1154,73 +1340,63 @@ end
--
-- so this is on the todo list
-table.tofile_maxtab = 2*1024
+local maxtab = 2*1024
-function table.tofile(filename,root,name,reduce,noquotes,hexify)
+function table.tofile(filename,root,name,specification)
local f = io.open(filename,'w')
if f then
- local maxtab = table.tofile_maxtab
if maxtab > 1 then
- local t = { }
+ local t, n = { }, 0
local function flush(s)
- t[#t+1] = s
- if #t > maxtab then
+ n = n + 1
+ t[n] = s
+ if n > maxtab then
f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
- t = { }
+ t, n = { }, 0 -- we could recycle t if needed
end
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
f:write(concat(t,"\n"),"\n")
else
local function flush(s)
f:write(s,"\n")
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
end
f:close()
+ io.flush()
end
end
-local function flatten(t,f,complete) -- is this used? meybe a variant with next, ...
- for i=1,#t do
- local v = t[i]
- if type(v) == "table" then
- if complete or type(v[1]) == "table" then
- flatten(v,f,complete)
+local function flattened(t,f,depth)
+ if f == nil then
+ f = { }
+ depth = 0xFFFF
+ elseif tonumber(f) then
+ -- assume then only two arguments are given
+ depth = f
+ f = { }
+ elseif not depth then
+ depth = 0xFFFF
+ end
+ for k, v in next, t do
+ if type(k) ~= "number" then
+ if depth > 0 and type(v) == "table" then
+ flattened(v,f,depth-1)
else
- f[#f+1] = v
+ f[k] = v
end
- else
- f[#f+1] = v
end
end
-end
-
-function table.flatten(t)
- local f = { }
- flatten(t,f,true)
- return f
-end
-
-function table.unnest(t) -- bad name
- local f = { }
- flatten(t,f,false)
- return f
-end
-
-table.flatten_one_level = table.unnest
-
--- a better one:
-
-local function flattened(t,f)
- if not f then
- f = { }
- end
- for k, v in next, t do
- if type(v) == "table" then
- flattened(v,f)
+ local n = #f
+ for k=1,#t do
+ local v = t[k]
+ if depth > 0 and type(v) == "table" then
+ flattened(v,f,depth-1)
+ n = #f
else
- f[k] = v
+ n = n + 1
+ f[n] = v
end
end
return f
@@ -1228,49 +1404,27 @@ end
table.flattened = flattened
--- the next three may disappear
-
-function table.remove_value(t,value) -- todo: n
- if value then
- for i=1,#t do
- if t[i] == value then
- remove(t,i)
- -- remove all, so no: return
- end
- end
+local function unnest(t,f) -- only used in mk, for old times sake
+ if not f then -- and only relevant for token lists
+ f = { }
end
-end
-
-function table.insert_before_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i,str)
- return
- end
+ for i=1,#t do
+ local v = t[i]
+ if type(v) == "table" then
+ if type(v[1]) == "table" then
+ unnest(v,f)
+ else
+ f[#f+1] = v
end
+ else
+ f[#f+1] = v
end
- insert(t,1,str)
- elseif value then
- insert(t,1,value)
end
+ return f
end
-function table.insert_after_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,str)
- return
- end
- end
- end
- t[#t+1] = str
- elseif value then
- t[#t+1] = value
- end
+function table.unnest(t) -- bad name
+ return unnest(t)
end
local function are_equal(a,b,n,m) -- indexed
@@ -1297,7 +1451,7 @@ end
local function identical(a,b) -- assumes same structure
for ka, va in next, a do
- local vb = b[k]
+ local vb = b[ka]
if va == vb then
-- same
elseif type(va) == "table" and type(vb) == "table" then
@@ -1311,8 +1465,8 @@ local function identical(a,b) -- assumes same structure
return true
end
-table.are_equal = are_equal
table.identical = identical
+table.are_equal = are_equal
-- maybe also make a combined one
@@ -1338,89 +1492,84 @@ function table.contains(t, v)
end
function table.count(t)
- local n, e = 0, next(t)
- while e do
- n, e = n + 1, next(t,e)
+ local n = 0
+ for k, v in next, t do
+ n = n + 1
end
return n
end
-function table.swapped(t)
- local s = { }
+function table.swapped(t,s) -- hash
+ local n = { }
+ if s then
+ for k, v in next, s do
+ n[k] = v
+ end
+ end
for k, v in next, t do
- s[v] = k
+ n[v] = k
end
- return s
+ return n
end
---~ function table.are_equal(a,b)
---~ return table.serialize(a) == table.serialize(b)
---~ end
-
-function table.clone(t,p) -- t is optional or nil or table
- if not p then
- t, p = { }, t or { }
- elseif not t then
- t = { }
+function table.reversed(t)
+ if t then
+ local tt, tn = { }, #t
+ if tn > 0 then
+ local ttn = 0
+ for i=tn,1,-1 do
+ ttn = ttn + 1
+ tt[ttn] = t[i]
+ end
+ end
+ return tt
end
- setmetatable(t, { __index = function(_,key) return p[key] end }) -- why not __index = p ?
- return t
-end
-
-function table.hexed(t,seperator)
- local tt = { }
- for i=1,#t do tt[i] = format("0x%04X",t[i]) end
- return concat(tt,seperator or " ")
end
-function table.reverse_hash(h)
- local r = { }
- for k,v in next, h do
- r[v] = lower(gsub(k," ",""))
+function table.sequenced(t,sep,simple) -- hash only
+ local s, n = { }, 0
+ for k, v in sortedhash(t) do
+ if simple then
+ if v == true then
+ n = n + 1
+ s[n] = k
+ elseif v and v~= "" then
+ n = n + 1
+ s[n] = k .. "=" .. tostring(v)
+ end
+ else
+ n = n + 1
+ s[n] = k .. "=" .. tostring(v)
+ end
end
- return r
+ return concat(s, sep or " | ")
end
-function table.reverse(t)
- local tt = { }
- if #t > 0 then
- for i=#t,1,-1 do
- tt[#tt+1] = t[i]
- end
+function table.print(t,...)
+ if type(t) ~= "table" then
+ print(tostring(t))
+ else
+ table.tohandle(print,t,...)
end
- return tt
end
-function table.insert_before_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i,extra)
- return
- end
- end
- insert(t,1,extra)
+-- -- -- obsolete but we keep them for a while and might comment them later -- -- --
+
+-- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
+
+function table.sub(t,i,j)
+ return { unpack(t,i,j) }
end
-function table.insert_after_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,extra)
- return
- end
- end
- insert(t,#t+1,extra)
+-- 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)
end
+function table.has_one_entry(t)
+ return t and not next(t,next(t))
+end
end -- of closure
@@ -1435,7 +1584,10 @@ if not modules then modules = { } end modules ['l-io'] = {
license = "see context related readme files"
}
-local byte, find, gsub = string.byte, string.find, string.gsub
+local io = io
+local byte, find, gsub, format = string.byte, string.find, string.gsub, string.format
+local concat = table.concat
+local type = type
if string.find(os.getenv("PATH"),";") then
io.fileseparator, io.pathseparator = "\\", ";"
@@ -1446,9 +1598,7 @@ end
function io.loaddata(filename,textmode)
local f = io.open(filename,(textmode and 'r') or 'rb')
if f then
- -- collectgarbage("step") -- sometimes makes a big difference in mem consumption
local data = f:read('*all')
- -- garbagecollector.check(data)
f:close()
return data
else
@@ -1460,13 +1610,14 @@ function io.savedata(filename,data,joiner)
local f = io.open(filename,"wb")
if f then
if type(data) == "table" then
- f:write(table.join(data,joiner or ""))
+ f:write(concat(data,joiner or ""))
elseif type(data) == "function" then
data(f)
else
f:write(data or "")
end
f:close()
+ io.flush()
return true
else
return false
@@ -1495,12 +1646,19 @@ function io.size(filename)
end
function io.noflines(f)
- local n = 0
- for _ in f:lines() do
- n = n + 1
+ if type(f) == "string" then
+ local f = io.open(filename)
+ local n = f and io.noflines(f) or 0
+ assert(f:close())
+ return n
+ else
+ local n = 0
+ for _ in f:lines() do
+ n = n + 1
+ end
+ f:seek('set',0)
+ return n
end
- f:seek('set',0)
- return n
end
local nextchar = {
@@ -1526,8 +1684,6 @@ local nextchar = {
function io.characters(f,n)
if f then
return nextchar[n or 1], f
- else
- return nil, nil
end
end
@@ -1536,40 +1692,42 @@ local nextbyte = {
local a, b, c, d = f:read(1,1,1,1)
if d then
return byte(a), byte(b), byte(c), byte(d)
- else
- return nil, nil, nil, nil
+ end
+ end,
+ [3] = function(f)
+ local a, b, c = f:read(1,1,1)
+ if b then
+ return byte(a), byte(b), byte(c)
end
end,
[2] = function(f)
local a, b = f:read(1,1)
if b then
return byte(a), byte(b)
- else
- return nil, nil
end
end,
[1] = function (f)
local a = f:read(1)
if a then
return byte(a)
- else
- return nil
end
end,
[-2] = function (f)
local a, b = f:read(1,1)
if b then
return byte(b), byte(a)
- else
- return nil, nil
+ end
+ end,
+ [-3] = function(f)
+ local a, b, c = f:read(1,1,1)
+ if b then
+ return byte(c), byte(b), byte(a)
end
end,
[-4] = function(f)
local a, b, c, d = f:read(1,1,1,1)
if d then
return byte(d), byte(c), byte(b), byte(a)
- else
- return nil, nil, nil, nil
end
end
}
@@ -1586,12 +1744,13 @@ function io.ask(question,default,options)
while true do
io.write(question)
if options then
- io.write(string.format(" [%s]",table.concat(options,"|")))
+ io.write(format(" [%s]",concat(options,"|")))
end
if default then
- io.write(string.format(" [%s]",default))
+ io.write(format(" [%s]",default))
end
- io.write(string.format(" "))
+ io.write(format(" "))
+ io.flush()
local answer = io.read()
answer = gsub(answer,"^%s*(.*)%s*$","%1")
if answer == "" and default then
@@ -1615,6 +1774,63 @@ function io.ask(question,default,options)
end
end
+local function readnumber(f,n,m)
+ if m then
+ f:seek("set",n)
+ n = m
+ end
+ if n == 1 then
+ return byte(f:read(1))
+ elseif n == 2 then
+ local a, b = byte(f:read(2),1,2)
+ return 256 * a + b
+ elseif n == 3 then
+ local a, b, c = byte(f:read(3),1,3)
+ return 256*256 * a + 256 * b + c
+ elseif n == 4 then
+ local a, b, c, d = byte(f:read(4),1,4)
+ return 256*256*256 * a + 256*256 * b + 256 * c + d
+ elseif n == 8 then
+ local a, b = readnumber(f,4), readnumber(f,4)
+ return 256 * a + b
+ elseif n == 12 then
+ local a, b, c = readnumber(f,4), readnumber(f,4), readnumber(f,4)
+ return 256*256 * a + 256 * b + c
+ elseif n == -2 then
+ local b, a = byte(f:read(2),1,2)
+ return 256*a + b
+ elseif n == -3 then
+ local c, b, a = byte(f:read(3),1,3)
+ return 256*256 * a + 256 * b + c
+ elseif n == -4 then
+ local d, c, b, a = byte(f:read(4),1,4)
+ return 256*256*256 * a + 256*256 * b + 256*c + d
+ elseif n == -8 then
+ local h, g, f, e, d, c, b, a = byte(f:read(8),1,8)
+ return 256*256*256*256*256*256*256 * a +
+ 256*256*256*256*256*256 * b +
+ 256*256*256*256*256 * c +
+ 256*256*256*256 * d +
+ 256*256*256 * e +
+ 256*256 * f +
+ 256 * g +
+ h
+ else
+ return 0
+ end
+end
+
+io.readnumber = readnumber
+
+function io.readstring(f,n,m)
+ if m then
+ f:seek("set",n)
+ n = m
+ end
+ local str = gsub(f:read(n),"%z","")
+ return str
+end
+
end -- of closure
@@ -1628,11 +1844,15 @@ if not modules then modules = { } end modules ['l-number'] = {
license = "see context related readme files"
}
+-- this module will be replaced when we have the bit library
+
local tostring = tostring
-local format, floor, insert, match = string.format, math.floor, table.insert, string.match
+local format, floor, match, rep = string.format, math.floor, string.match, string.rep
+local concat, insert = table.concat, table.insert
local lpegmatch = lpeg.match
-number = number or { }
+number = number or { }
+local number = number
-- a,b,c,d,e,f = number.toset(100101)
@@ -1680,6 +1900,54 @@ function number.bits(n,zero)
end
+function number.bit(p)
+ return 2 ^ (p - 1) -- 1-based indexing
+end
+
+function number.hasbit(x, p) -- typical call: if hasbit(x, bit(3)) then ...
+ return x % (p + p) >= p
+end
+
+function number.setbit(x, p)
+ return hasbit(x, p) and x or x + p
+end
+
+function number.clearbit(x, p)
+ return hasbit(x, p) and x - p or x
+end
+
+
+function number.tobitstring(n,m)
+ if n == 0 then
+ if m then
+ rep("00000000",m)
+ else
+ return "00000000"
+ end
+ else
+ local t = { }
+ while n > 0 do
+ insert(t,1,n % 2 > 0 and 1 or 0)
+ n = floor(n/2)
+ end
+ local nn = 8 - #t % 8
+ if nn > 0 and nn < 8 then
+ for i=1,nn do
+ insert(t,1,0)
+ end
+ end
+ if m then
+ m = m * 8 - #t
+ if m > 0 then
+ insert(t,1,rep("0",m))
+ end
+ end
+ return concat(t)
+ end
+end
+
+
+
end -- of closure
do -- create closure to overcome 200 locals limit
@@ -1692,6 +1960,8 @@ if not modules then modules = { } end modules ['l-set'] = {
license = "see context related readme files"
}
+-- This will become obsolete when we have the bitset library embedded.
+
set = set or { }
local nums = { }
@@ -1735,10 +2005,11 @@ function set.tolist(n)
if n == 0 or not tabs[n] then
return ""
else
- local t = { }
+ local t, n = { }, 0
for k, v in next, tabs[n] do
if v then
- t[#t+1] = k
+ n = n + 1
+ t[n] = k
end
end
return concat(t," ")
@@ -1756,17 +2027,6 @@ function set.contains(n,s)
end
end
---~ local c = set.create{'aap','noot','mies'}
---~ local s = set.tonumber(c)
---~ local t = set.totable(s)
---~ print(t['aap'])
---~ local c = set.create{'zus','wim','jet'}
---~ local s = set.tonumber(c)
---~ local t = set.totable(s)
---~ print(t['aap'])
---~ print(t['jet'])
---~ print(set.contains(t,'jet'))
---~ print(set.contains(t,'aap'))
@@ -1782,32 +2042,119 @@ if not modules then modules = { } end modules ['l-os'] = {
license = "see context related readme files"
}
+-- This file deals with some operating system issues. Please don't bother me
+-- with the pros and cons of operating systems as they all have their flaws
+-- and benefits. Bashing one of them won't help solving problems and fixing
+-- bugs faster and is a waste of time and energy.
+--
+-- path separators: / or \ ... we can use / everywhere
+-- suffixes : dll so exe <none> ... no big deal
+-- quotes : we can use "" in most cases
+-- expansion : unless "" are used * might give side effects
+-- piping/threads : somewhat different for each os
+-- locations : specific user file locations and settings can change over time
+--
+-- os.type : windows | unix (new, we already guessed os.platform)
+-- os.name : windows | msdos | linux | macosx | solaris | .. | generic (new)
+-- os.platform : extended os.name with architecture
+
-- maybe build io.flush in os.execute
-local find, format, gsub = string.find, string.format, string.gsub
+local os = os
+local find, format, gsub, upper = string.find, string.format, string.gsub, string.upper
+local concat = table.concat
local random, ceil = math.random, math.ceil
+local rawget, rawset, type, getmetatable, setmetatable, tonumber = rawget, rawset, type, getmetatable, setmetatable, tonumber
+
+-- The following code permits traversing the environment table, at least
+-- in luatex. Internally all environment names are uppercase.
+
+if not os.__getenv__ then
+
+ os.__getenv__ = os.getenv
+ os.__setenv__ = os.setenv
+
+ if os.env then
+
+ local osgetenv = os.getenv
+ local ossetenv = os.setenv
+ local osenv = os.env local _ = osenv.PATH -- initialize the table
+
+ function os.setenv(k,v)
+ if v == nil then
+ v = ""
+ end
+ local K = upper(k)
+ osenv[K] = v
+ if type(v) == "table" then
+ v = concat(v,";") -- path
+ end
+ ossetenv(K,v)
+ end
+
+ function os.getenv(k)
+ local K = upper(k)
+ local v = osenv[K] or osenv[k] or osgetenv(K) or osgetenv(k)
+ if v == "" then
+ return nil
+ else
+ return v
+ end
+ end
+
+ else
+
+ local ossetenv = os.setenv
+ local osgetenv = os.getenv
+ local osenv = { }
+
+ function os.setenv(k,v)
+ if v == nil then
+ v = ""
+ end
+ local K = upper(k)
+ osenv[K] = v
+ end
-local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
+ function os.getenv(k)
+ local K = upper(k)
+ local v = osenv[K] or osgetenv(K) or osgetenv(k)
+ if v == "" then
+ return nil
+ else
+ return v
+ end
+ end
+
+ local function __index(t,k)
+ return os.getenv(k)
+ end
+ local function __newindex(t,k,v)
+ os.setenv(k,v)
+ end
+
+ os.env = { }
+
+ setmetatable(os.env, { __index = __index, __newindex = __newindex } )
+
+ end
+
+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
function os.resultof(command)
- ioflush() -- else messed up logging
local handle = io.popen(command,"r")
- if not handle then
- -- print("unknown command '".. command .. "' in os.resultof")
- return ""
- else
- return handle:read("*all") or ""
- end
+ return handle and handle:read("*all") or ""
end
---~ os.type : windows | unix (new, we already guessed os.platform)
---~ os.name : windows | msdos | linux | macosx | solaris | .. | generic (new)
---~ os.platform : extended os.name with architecture
-
if not io.fileseparator then
if find(os.getenv("PATH"),";") then
io.fileseparator, io.pathseparator, os.type = "\\", ";", os.type or "mswin"
@@ -1856,16 +2203,11 @@ function os.runtime()
return os.gettimeofday() - startuptime
end
---~ print(os.gettimeofday()-os.time())
---~ os.sleep(1.234)
---~ print (">>",os.runtime())
---~ print(os.date("%H:%M:%S",os.gettimeofday()))
---~ print(os.date("%H:%M:%S",os.time()))
-- no need for function anymore as we have more clever code and helpers now
-- this metatable trickery might as well disappear
-os.resolvers = os.resolvers or { }
+os.resolvers = os.resolvers or { } -- will become private
local resolvers = os.resolvers
@@ -1878,24 +2220,6 @@ end
setmetatable(os,osmt)
-if not os.setenv then
-
- -- we still store them but they won't be seen in
- -- child processes although we might pass them some day
- -- using command concatination
-
- local env, getenv = { }, os.getenv
-
- function os.setenv(k,v)
- env[k] = v
- end
-
- function os.getenv(k)
- return env[k] or getenv(k)
- end
-
-end
-
-- we can use HOSTTYPE on some platforms
local name, platform = os.name or "linux", os.getenv("MTX_PLATFORM") or ""
@@ -1935,7 +2259,7 @@ elseif os.type == "windows" then
elseif name == "linux" then
function os.resolvers.platform(t,k)
- -- we sometims have HOSTTYPE set so let's check that first
+ -- we sometimes have HOSTTYPE set so let's check that first
local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
if find(architecture,"x86_64") then
platform = "linux-64"
@@ -2013,10 +2337,10 @@ elseif name == "freebsd" then
elseif name == "kfreebsd" then
function os.resolvers.platform(t,k)
- -- we sometims have HOSTTYPE set so let's check that first
+ -- we sometimes have HOSTTYPE set so let's check that first
local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
if find(architecture,"x86_64") then
- platform = "kfreebsd-64"
+ platform = "kfreebsd-amd64"
else
platform = "kfreebsd-i386"
end
@@ -2091,61 +2415,86 @@ if not modules then modules = { } end modules ['l-file'] = {
-- needs a cleanup
-file = file or { }
+file = file or { }
+local file = file
-local concat = table.concat
-local find, gmatch, match, gsub, sub, char = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char
+local insert, concat = table.insert, table.concat
+local find, gmatch, match, gsub, sub, char, lower = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char, string.lower
local lpegmatch = lpeg.match
+local getcurrentdir, attributes = lfs.currentdir, lfs.attributes
-function file.removesuffix(filename)
- return (gsub(filename,"%.[%a%d]+$",""))
+local P, R, S, C, Cs, Cp, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc
+
+local function dirname(name,default)
+ return match(name,"^(.+)[/\\].-$") or (default or "")
end
-function file.addsuffix(filename, suffix)
- if not suffix or suffix == "" then
- return filename
- elseif not find(filename,"%.[%a%d]+$") then
- return filename .. "." .. suffix
- else
- return filename
- end
+local function basename(name)
+ return match(name,"^.+[/\\](.-)$") or name
end
-function file.replacesuffix(filename, suffix)
- return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+local function nameonly(name)
+ return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
end
-function file.dirname(name,default)
- return match(name,"^(.+)[/\\].-$") or (default or "")
+local function extname(name,default)
+ return match(name,"^.+%.([^/\\]-)$") or default or ""
end
-function file.basename(name)
- return match(name,"^.+[/\\](.-)$") or name
+local function splitname(name)
+ local n, s = match(name,"^(.+)%.([^/\\]-)$")
+ return n or name, s or ""
end
-function file.nameonly(name)
- return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
+file.basename = basename
+file.dirname = dirname
+file.nameonly = nameonly
+file.extname = extname
+file.suffix = extname
+
+function file.removesuffix(filename)
+ return (gsub(filename,"%.[%a%d]+$",""))
end
-function file.extname(name,default)
- return match(name,"^.+%.([^/\\]-)$") or default or ""
+function file.addsuffix(filename, suffix, criterium)
+ if not suffix or suffix == "" then
+ return filename
+ elseif criterium == true then
+ return filename .. "." .. suffix
+ elseif not criterium then
+ local n, s = splitname(filename)
+ if not s or s == "" then
+ return filename .. "." .. suffix
+ else
+ return filename
+ end
+ else
+ local n, s = splitname(filename)
+ if s and s ~= "" then
+ local t = type(criterium)
+ if t == "table" then
+ -- keep if in criterium
+ for i=1,#criterium do
+ if s == criterium[i] then
+ return filename
+ end
+ end
+ elseif t == "string" then
+ -- keep if criterium
+ if s == criterium then
+ return filename
+ end
+ end
+ end
+ return n .. "." .. suffix
+ end
end
-file.suffix = file.extname
---~ function file.join(...)
---~ local pth = concat({...},"/")
---~ pth = gsub(pth,"\\","/")
---~ local a, b = match(pth,"^(.*://)(.*)$")
---~ if a and b then
---~ return a .. gsub(b,"//+","/")
---~ end
---~ a, b = match(pth,"^(//)(.*)$")
---~ if a and b then
---~ return a .. gsub(b,"//+","/")
---~ end
---~ return (gsub(pth,"//+","/"))
---~ end
+function file.replacesuffix(filename, suffix)
+ return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+end
+
local trick_1 = char(1)
local trick_2 = "^" .. trick_1 .. "/+"
@@ -2173,60 +2522,37 @@ function file.join(...)
return (gsub(pth,"//+","/"))
end
---~ print(file.join("//","/y"))
---~ print(file.join("/","/y"))
---~ print(file.join("","/y"))
---~ print(file.join("/x/","/y"))
---~ print(file.join("x/","/y"))
---~ print(file.join("http://","/y"))
---~ print(file.join("http://a","/y"))
---~ print(file.join("http:///a","/y"))
---~ print(file.join("//nas-1","/y"))
-function file.iswritable(name)
- local a = lfs.attributes(name) or lfs.attributes(file.dirname(name,"."))
+function file.is_writable(name)
+ local a = attributes(name) or attributes(dirname(name,"."))
return a and sub(a.permissions,2,2) == "w"
end
-function file.isreadable(name)
- local a = lfs.attributes(name)
+function file.is_readable(name)
+ local a = attributes(name)
return a and sub(a.permissions,1,1) == "r"
end
-file.is_readable = file.isreadable
-file.is_writable = file.iswritable
+file.isreadable = file.is_readable -- depricated
+file.iswritable = file.is_writable -- depricated
--- todo: lpeg
-
---~ function file.split_path(str)
---~ local t = { }
---~ str = gsub(str,"\\", "/")
---~ str = gsub(str,"(%a):([;/])", "%1\001%2")
---~ for name in gmatch(str,"([^;:]+)") do
---~ if name ~= "" then
---~ t[#t+1] = gsub(name,"\001",":")
---~ end
---~ end
---~ return t
---~ end
+-- todo: lpeg \\ / .. does not save much
local checkedsplit = string.checkedsplit
-function file.split_path(str,separator)
+function file.splitpath(str,separator) -- string
str = gsub(str,"\\","/")
return checkedsplit(str,separator or io.pathseparator)
end
-function file.join_path(tab)
- return concat(tab,io.pathseparator) -- can have trailing //
+function file.joinpath(tab,separator) -- table
+ return concat(tab,separator or io.pathseparator) -- can have trailing //
end
-- we can hash them weakly
-local insert = table.insert
-
-function file.collapse_path(str,anchor)
+function file.collapsepath(str,anchor)
if anchor and not find(str,"^/") and not find(str,"^%a:") then
str = getcurrentdir() .. "/" .. str
end
@@ -2280,62 +2606,15 @@ function file.collapse_path(str,anchor)
return concat(newelements, '/')
end
end
-function file.xcollapse_path(str)
- print('collapse', str)
- if str == "" or str =="." then
- return "."
- elseif find(str,"^%.%.") then
- return str
- elseif not find(str,"%.") then
- return str
- end
- str = gsub(str,"^%./",lfs.currentdir() .. "/") -- ./xx in qualified
- str = gsub(str,"\\","/")
- local oldelements = checkedsplit(str,"/")
- local newelements = { }
- local i = #oldelements
- while i > 0 do
- local element = oldelements[i]
- if element == '.' then
- -- do nothing
- elseif element == '..' then
- local n = i -1
- while n > 0 do
- local element = oldelements[n]
- if element ~= '..' and element ~= '.' then
- oldelements[n] = '.'
- break
- else
- n = n - 1
- end
- end
- if n<1 then
- insert(newelements,1,'..')
- end
- elseif element ~= "" then
- insert(newelements,1,element)
- end
- i = i - 1
- end
- if #newelements == 0 then
- return "."
- elseif find(str,"^/") then
- return "/" .. concat(newelements,'/')
- else
- return concat(newelements, '/')
- end
-end
---~ print(file.collapse_path("/a"))
---~ print(file.collapse_path("a/./b/.."))
---~ print(file.collapse_path("a/aa/../b/bb"))
---~ print(file.collapse_path("a/../.."))
---~ print(file.collapse_path("a/.././././b/.."))
---~ print(file.collapse_path("a/./././b/.."))
---~ print(file.collapse_path("a/b/c/../.."))
-function file.robustname(str)
- return (gsub(str,"[^%a%d%/%-%.\\]+","-"))
+function file.robustname(str,strict)
+ str = gsub(str,"[^%a%d%/%-%.\\]+","-")
+ if strict then
+ return lower(gsub(str,"^%-*(.-)%-*$","%1"))
+ else
+ return str
+ end
end
file.readdata = io.loaddata
@@ -2347,100 +2626,34 @@ end
-- lpeg variants, slightly faster, not always
---~ local period = lpeg.P(".")
---~ local slashes = lpeg.S("\\/")
---~ local noperiod = 1-period
---~ local noslashes = 1-slashes
---~ local name = noperiod^1
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.C(noperiod^1) * -1
-
---~ function file.extname(name)
---~ return lpegmatch(pattern,name) or ""
---~ end
-
---~ local pattern = lpeg.Cs(((period * noperiod^1 * -1)/"" + 1)^1)
-
---~ function file.removesuffix(name)
---~ return lpegmatch(pattern,name)
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.C(noslashes^1) * -1
-
---~ function file.basename(name)
---~ return lpegmatch(pattern,name) or name
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.Cp() * noslashes^1 * -1
-
---~ function file.dirname(name)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return sub(name,1,p-2)
---~ else
---~ return ""
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
-
---~ function file.addsuffix(name, suffix)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return name
---~ else
---~ return name .. "." .. suffix
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
-
---~ function file.replacesuffix(name,suffix)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return sub(name,1,p-2) .. "." .. suffix
---~ else
---~ return name .. "." .. suffix
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * lpeg.Cp() * ((noperiod^1 * period)^1 * lpeg.Cp() + lpeg.P(true)) * noperiod^1 * -1
-
---~ function file.nameonly(name)
---~ local a, b = lpegmatch(pattern,name)
---~ if b then
---~ return sub(name,a,b-2)
---~ elseif a then
---~ return sub(name,a)
---~ else
---~ return name
---~ end
---~ end
-
---~ local test = file.extname
---~ local test = file.basename
---~ local test = file.dirname
---~ local test = file.addsuffix
---~ local test = file.replacesuffix
---~ local test = file.nameonly
-
---~ print(1,test("./a/b/c/abd.def.xxx","!!!"))
---~ print(2,test("./../b/c/abd.def.xxx","!!!"))
---~ print(3,test("a/b/c/abd.def.xxx","!!!"))
---~ print(4,test("a/b/c/def.xxx","!!!"))
---~ print(5,test("a/b/c/def","!!!"))
---~ print(6,test("def","!!!"))
---~ print(7,test("def.xxx","!!!"))
-
---~ local tim = os.clock() for i=1,250000 do local ext = test("abd.def.xxx","!!!") end print(os.clock()-tim)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-- also rewrite previous
-local letter = lpeg.R("az","AZ") + lpeg.S("_-+")
-local separator = lpeg.P("://")
+local letter = R("az","AZ") + S("_-+")
+local separator = P("://")
+
+local qualified = P(".")^0 * P("/") + letter*P(":") + letter^1*separator + letter^1 * P("/")
+local rootbased = P("/") + letter*P(":")
-local qualified = lpeg.P(".")^0 * lpeg.P("/") + letter*lpeg.P(":") + letter^1*separator + letter^1 * lpeg.P("/")
-local rootbased = lpeg.P("/") + letter*lpeg.P(":")
+lpeg.patterns.qualified = qualified
+lpeg.patterns.rootbased = rootbased
-- ./name ../name /name c: :// name/name
@@ -2452,14 +2665,16 @@ function file.is_rootbased_path(filename)
return lpegmatch(rootbased,filename) ~= nil
end
-local slash = lpeg.S("\\/")
-local period = lpeg.P(".")
-local drive = lpeg.C(lpeg.R("az","AZ")) * lpeg.P(":")
-local path = lpeg.C(((1-slash)^0 * slash)^0)
-local suffix = period * lpeg.C(lpeg.P(1-period)^0 * lpeg.P(-1))
-local base = lpeg.C((1-suffix)^0)
+-- actually these are schemes
-local pattern = (drive + lpeg.Cc("")) * (path + lpeg.Cc("")) * (base + lpeg.Cc("")) * (suffix + lpeg.Cc(""))
+local slash = S("\\/")
+local period = P(".")
+local drive = C(R("az","AZ")) * P(":")
+local path = C(((1-slash)^0 * slash)^0)
+local suffix = period * C(P(1-period)^0 * P(-1))
+local base = C((1-suffix)^0)
+
+local pattern = (drive + Cc("")) * (path + Cc("")) * (base + Cc("")) * (suffix + Cc(""))
function file.splitname(str) -- returns drive, path, base, suffix
return lpegmatch(pattern,str)
@@ -2472,14 +2687,13 @@ end
-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
---~ -- todo:
---~
---~ if os.type == "windows" then
---~ local currentdir = lfs.currentdir
---~ function lfs.currentdir()
---~ return (gsub(currentdir(),"\\","/"))
---~ end
---~ end
+
+-- for myself:
+
+function file.strip(name,dir)
+ local b, a = match(name,"^(.-)" .. dir .. "(.*)$")
+ return a ~= "" and a or name
+end
end -- of closure
@@ -2495,6 +2709,7 @@ if not modules then modules = { } end modules ['l-md5'] = {
-- This also provides file checksums and checkers.
+local md5, file = md5, file
local gsub, format, byte = string.gsub, string.format, string.byte
local function convert(str,fmt)
@@ -2505,27 +2720,13 @@ 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 function remap(chr) return format("%02X",byte(chr)) end
---~ function md5.HEX(str) return (gsub(md5.sum(str),".",remap)) end
---~ end
---~ 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
---~ 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
-
-file.needs_updating_threshold = 1
-
-function file.needs_updating(oldname,newname) -- size modification access change
+
+function file.needs_updating(oldname,newname,threshold) -- size modification access change
local oldtime = lfs.attributes(oldname, modification)
local newtime = lfs.attributes(newname, modification)
if newtime >= oldtime then
return false
- elseif oldtime - newtime < file.needs_updating_threshold then
+ elseif oldtime - newtime < (threshold or 1) then
return false
else
return true
@@ -2572,86 +2773,171 @@ if not modules then modules = { } end modules ['l-url'] = {
license = "see context related readme files"
}
-local char, gmatch, gsub = string.char, string.gmatch, string.gsub
+local char, gmatch, gsub, format, byte, find = string.char, string.gmatch, string.gsub, string.format, string.byte, string.find
+local concat = table.concat
local tonumber, type = tonumber, type
-local lpegmatch = lpeg.match
+local P, C, R, S, Cs, Cc, Ct = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cs, lpeg.Cc, lpeg.Ct
+local lpegmatch, lpegpatterns, replacer = lpeg.match, lpeg.patterns, lpeg.replacer
--- from the spec (on the web):
+-- from wikipedia:
--
--- foo://example.com:8042/over/there?name=ferret#nose
--- \_/ \______________/\_________/ \_________/ \__/
--- | | | | |
--- scheme authority path query fragment
--- | _____________________|__
--- / \ / \
--- urn:example:animal:ferret:nose
+-- foo://username:password@example.com:8042/over/there/index.dtb?type=animal;name=narwhal#nose
+-- \_/ \_______________/ \_________/ \__/ \___/ \_/ \______________________/ \__/
+-- | | | | | | | |
+-- | userinfo hostname port | | query fragment
+-- | \________________________________/\_____________|____|/
+-- scheme | | | |
+-- | authority path | |
+-- | | |
+-- | path interpretable as filename
+-- | ___________|____________ |
+-- / \ / \ |
+-- urn:example:animal:ferret:nose interpretable as extension
+
+url = url or { }
+local url = url
+
+local tochar = function(s) return char(tonumber(s,16)) end
+
+local colon = P(":")
+local qmark = P("?")
+local hash = P("#")
+local slash = P("/")
+local percent = P("%")
+local endofstring = P(-1)
+
+local hexdigit = R("09","AF","af")
+local plus = P("+")
+local nothing = Cc("")
+local escaped = (plus / " ") + (percent * C(hexdigit * hexdigit) / tochar)
-url = url or { }
+-- we assume schemes with more than 1 character (in order to avoid problems with windows disks)
-local function tochar(s)
- return char(tonumber(s,16))
-end
+local scheme = Cs((escaped+(1-colon-slash-qmark-hash))^2) * colon + nothing
+local authority = slash * slash * Cs((escaped+(1- slash-qmark-hash))^0) + nothing
+local path = slash * Cs((escaped+(1- qmark-hash))^0) + nothing
+local query = qmark * Cs((escaped+(1- hash))^0) + nothing
+local fragment = hash * Cs((escaped+(1- endofstring))^0) + nothing
-local colon, qmark, hash, slash, percent, endofstring = lpeg.P(":"), lpeg.P("?"), lpeg.P("#"), lpeg.P("/"), lpeg.P("%"), lpeg.P(-1)
+local validurl = scheme * authority * path * query * fragment
+local parser = Ct(validurl)
-local hexdigit = lpeg.R("09","AF","af")
-local plus = lpeg.P("+")
-local escaped = (plus / " ") + (percent * lpeg.C(hexdigit * hexdigit) / tochar)
+lpegpatterns.url = validurl
+lpegpatterns.urlsplitter = parser
--- we assume schemes with more than 1 character (in order to avoid problems with windows disks)
+local escapes = { } ; for i=0,255 do escapes[i] = format("%%%02X",i) end
-local scheme = lpeg.Cs((escaped+(1-colon-slash-qmark-hash))^2) * colon + lpeg.Cc("")
-local authority = slash * slash * lpeg.Cs((escaped+(1- slash-qmark-hash))^0) + lpeg.Cc("")
-local path = slash * lpeg.Cs((escaped+(1- qmark-hash))^0) + lpeg.Cc("")
-local query = qmark * lpeg.Cs((escaped+(1- hash))^0) + lpeg.Cc("")
-local fragment = hash * lpeg.Cs((escaped+(1- endofstring))^0) + lpeg.Cc("")
+local escaper = Cs((R("09","AZ","az") + S("-./_") + P(1) / escapes)^0)
-local parser = lpeg.Ct(scheme * authority * path * query * fragment)
+lpegpatterns.urlescaper = escaper
-- todo: reconsider Ct as we can as well have five return values (saves a table)
-- so we can have two parsers, one with and one without
-function url.split(str)
+local function split(str)
return (type(str) == "string" and lpegmatch(parser,str)) or str
end
+local function hasscheme(str)
+ local scheme = lpegmatch(scheme,str) -- at least one character
+ return scheme and scheme ~= ""
+end
+
-- todo: cache them
-function url.hashed(str)
- local s = url.split(str)
+local rootletter = R("az","AZ")
+ + S("_-+")
+local separator = P("://")
+local qualified = P(".")^0 * P("/")
+ + rootletter * P(":")
+ + rootletter^1 * separator
+ + rootletter^1 * P("/")
+local rootbased = P("/")
+ + rootletter * P(":")
+
+local barswapper = replacer("|",":")
+local backslashswapper = replacer("\\","/")
+
+local function hashed(str) -- not yet ok (/test?test)
+ local s = split(str)
local somescheme = s[1] ~= ""
- return {
- scheme = (somescheme and s[1]) or "file",
- authority = s[2],
- path = s[3],
- query = s[4],
- fragment = s[5],
- original = str,
- noscheme = not somescheme,
- }
+ local somequery = s[4] ~= ""
+ if not somescheme and not somequery then
+ s = {
+ scheme = "file",
+ authority = "",
+ path = str,
+ query = "",
+ fragment = "",
+ original = str,
+ 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
+ else
+ filename = authority .. "/" .. path
+ end
+ s = {
+ scheme = s[1],
+ authority = authority,
+ path = path,
+ query = s[4],
+ fragment = s[5],
+ original = str,
+ noscheme = false,
+ filename = filename,
+ }
+ end
+ return s
end
-function url.hasscheme(str)
- return url.split(str)[1] ~= ""
-end
+-- Here we assume:
+--
+-- files: /// = relative
+-- files: //// = absolute (!)
+
+
+
+url.split = split
+url.hasscheme = hasscheme
+url.hashed = hashed
-function url.addscheme(str,scheme)
- return (url.hasscheme(str) and str) or ((scheme or "file:///") .. str)
+function url.addscheme(str,scheme) -- no authority
+ if hasscheme(str) then
+ return str
+ elseif not scheme then
+ return "file:///" .. str
+ else
+ return scheme .. ":///" .. str
+ end
end
-function url.construct(hash)
- local fullurl = hash.sheme .. "://".. hash.authority .. hash.path
- if hash.query then
- fullurl = fullurl .. "?".. hash.query
+function url.construct(hash) -- dodo: we need to escape !
+ local fullurl, f = { }, 0
+ local scheme, authority, path, query, fragment = hash.scheme, hash.authority, hash.path, hash.query, hash.fragment
+ if scheme and scheme ~= "" then
+ f = f + 1 ; fullurl[f] = scheme .. "://"
+ end
+ if authority and authority ~= "" then
+ f = f + 1 ; fullurl[f] = authority
end
- if hash.fragment then
- fullurl = fullurl .. "?".. hash.fragment
+ if path and path ~= "" then
+ f = f + 1 ; fullurl[f] = "/" .. path
end
- return fullurl
+ if query and query ~= "" then
+ f = f + 1 ; fullurl[f] = "?".. query
+ end
+ if fragment and fragment ~= "" then
+ f = f + 1 ; fullurl[f] = "#".. fragment
+ end
+ return lpegmatch(escaper,concat(fullurl))
end
function url.filename(filename)
- local t = url.hashed(filename)
+ local t = hashed(filename)
return (t.scheme == "file" and (gsub(t.path,"^/([a-zA-Z])([:|])/)","%1:"))) or filename
end
@@ -2667,37 +2953,13 @@ function url.query(str)
end
end
---~ print(url.filename("file:///c:/oeps.txt"))
---~ print(url.filename("c:/oeps.txt"))
---~ print(url.filename("file:///oeps.txt"))
---~ print(url.filename("file:///etc/test.txt"))
---~ print(url.filename("/oeps.txt"))
-
---~ from the spec on the web (sort of):
---~
---~ function test(str)
---~ print(table.serialize(url.hashed(str)))
---~ end
---~
---~ test("%56pass%20words")
---~ test("file:///c:/oeps.txt")
---~ test("file:///c|/oeps.txt")
---~ test("file:///etc/oeps.txt")
---~ test("file://./etc/oeps.txt")
---~ test("file:////etc/oeps.txt")
---~ test("ftp://ftp.is.co.za/rfc/rfc1808.txt")
---~ test("http://www.ietf.org/rfc/rfc2396.txt")
---~ test("ldap://[2001:db8::7]/c=GB?objectClass?one#what")
---~ test("mailto:John.Doe@example.com")
---~ test("news:comp.infosystems.www.servers.unix")
---~ test("tel:+1-816-555-1212")
---~ test("telnet://192.0.2.16:80/")
---~ test("urn:oasis:names:specification:docbook:dtd:xml:4.1.2")
---~ test("/etc/passwords")
---~ test("http://www.pragma-ade.com/spaced%20name")
-
---~ test("zip:///oeps/oeps.zip#bla/bla.tex")
---~ test("zip:///oeps/oeps.zip?bla/bla.tex")
+
+
+
+
+
+
+
end -- of closure
@@ -2712,35 +2974,53 @@ if not modules then modules = { } end modules ['l-dir'] = {
license = "see context related readme files"
}
--- dir.expand_name will be merged with cleanpath and collapsepath
+-- dir.expandname will be merged with cleanpath and collapsepath
local type = type
local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
+local concat, insert, remove = table.concat, table.insert, table.remove
local lpegmatch = lpeg.match
+local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
+
dir = dir or { }
+local dir = dir
+local lfs = lfs
+
+local attributes = lfs.attributes
+local walkdir = lfs.dir
+local isdir = lfs.isdir
+local isfile = lfs.isfile
+local mkdir = lfs.mkdir
+local chdir = lfs.chdir
+local currentdir = lfs.currentdir
-- handy
function dir.current()
- return (gsub(lfs.currentdir(),"\\","/"))
+ return (gsub(currentdir(),"\\","/"))
end
--- optimizing for no string.find (*) does not save time
+-- optimizing for no find (*) does not save time
-local attributes = lfs.attributes
-local walkdir = lfs.dir
-local function glob_pattern(path,patt,recurse,action)
- local ok, scanner
+local lfsisdir = isdir
+
+local function isdir(path)
+ path = gsub(path,"[/\\]+$","")
+ return lfsisdir(path)
+end
+
+lfs.isdir = isdir
+
+local function globpattern(path,patt,recurse,action)
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
+ path = path .. "."
+ elseif not find(path,"/$") then
+ path = path .. '/'
end
- if ok and type(scanner) == "function" then
- if not find(path,"/$") then path = path .. '/' end
- for name in scanner do
+ 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
@@ -2748,15 +3028,15 @@ local function glob_pattern(path,patt,recurse,action)
action(full)
end
elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
- glob_pattern(full,patt,recurse,action)
+ globpattern(full,patt,recurse,action)
end
end
end
end
-dir.glob_pattern = glob_pattern
+dir.globpattern = globpattern
-local function collect_pattern(path,patt,recurse,result)
+local function collectpattern(path,patt,recurse,result)
local ok, scanner
result = result or { }
if path == "/" then
@@ -2775,7 +3055,7 @@ local function collect_pattern(path,patt,recurse,result)
result[name] = attr
end
elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
- attr.list = collect_pattern(full,patt,recurse)
+ attr.list = collectpattern(full,patt,recurse)
result[name] = attr
end
end
@@ -2783,9 +3063,7 @@ local function collect_pattern(path,patt,recurse,result)
return result
end
-dir.collect_pattern = collect_pattern
-
-local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
+dir.collectpattern = collectpattern
local pattern = Ct {
[1] = (C(P(".") + P("/")^1) + C(R("az","AZ") * P(":") * P("/")^0) + Cc("./")) * V(2) * V(3),
@@ -2809,16 +3087,16 @@ local function glob(str,t)
for s=1,#str do
glob(str[s],t)
end
- elseif lfs.isfile(str) then
+ elseif isfile(str) then
t(str)
else
- local split = lpegmatch(pattern,str)
+ 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 recurse = find(base,"%*%*")
local start = root .. path
local result = lpegmatch(filter,start .. base)
- glob_pattern(start,result,recurse,t)
+ globpattern(start,result,recurse,t)
end
end
else
@@ -2828,12 +3106,15 @@ local function glob(str,t)
glob(str[s],t)
end
return t
- elseif lfs.isfile(str) then
- local t = t or { }
- t[#t+1] = str
- return t
+ elseif isfile(str) then
+ if t then
+ t[#t+1] = str
+ return t
+ else
+ return { str }
+ end
else
- local split = lpegmatch(pattern,str)
+ 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
@@ -2841,7 +3122,7 @@ local function glob(str,t)
local recurse = find(base,"%*%*")
local start = root .. path
local result = lpegmatch(filter,start .. base)
- glob_pattern(start,result,recurse,action)
+ globpattern(start,result,recurse,action)
return t
else
return { }
@@ -2852,18 +3133,14 @@ 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 function globfiles(path,recurse,func,files) -- func == pattern or function
if type(func) == "string" then
- local s = func -- alas, we need this indirect way
+ local s = func
func = function(name) return find(name,s) end
end
files = files or { }
+ local noffiles = #files
for name in walkdir(path) do
if find(name,"^%.") then
--- skip
@@ -2874,12 +3151,9 @@ local function globfiles(path,recurse,func,files) -- func == pattern or function
globfiles(path .. "/" .. name,recurse,func,files)
end
elseif mode == "file" then
- if func then
- if func(name) then
- files[#files+1] = path .. "/" .. name
- end
- else
- files[#files+1] = path .. "/" .. name
+ if not func or func(name) then
+ noffiles = noffiles + 1
+ files[noffiles] = path .. "/" .. name
end
end
end
@@ -2897,17 +3171,15 @@ dir.globfiles = globfiles
-- print(dir.ls("*.tex"))
function dir.ls(pattern)
- return table.concat(glob(pattern),"\n")
+ return concat(glob(pattern),"\n")
end
---~ mkdirs("temp")
---~ mkdirs("a/b/c")
---~ mkdirs(".","/a/b/c")
---~ mkdirs("a","b","c")
local make_indeed = true -- false
-if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
+local onwindows = os.type == "windows" or find(os.getenv("PATH"),";")
+
+if onwindows then
function dir.mkdirs(...)
local str, pth, t = "", "", { ... }
@@ -2956,64 +3228,21 @@ if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
else
pth = pth .. "/" .. s
end
- if make_indeed and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not isdir(pth) then
+ mkdir(pth)
end
end
- return pth, (lfs.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/"))
-
- function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
- local first, nothing, last = match(str,"^(//)(//*)(.*)$")
- if first then
- first = dir.current() .. "/"
- 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 = lfs.currentdir()
- if lfs.chdir(first) then
- first = dir.current()
- end
- lfs.chdir(d)
- 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 == "" then
- return first
- else
- return first .. "/" .. last
- end
+ return pth, (isdir(pth) == true)
end
+
else
function dir.mkdirs(...)
local str, pth, t = "", "", { ... }
for i=1,#t do
local s = t[i]
- if s ~= "" then
+ if s and s ~= "" then -- we catch nil and false
if str ~= "" then
str = str .. "/" .. s
else
@@ -3031,42 +3260,92 @@ else
else
pth = pth .. "/" .. s
end
- if make_indeed and not first and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not first and not isdir(pth) then
+ mkdir(pth)
end
end
else
pth = "."
for s in gmatch(str,"[^/]+") do
pth = pth .. "/" .. s
- if make_indeed and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not isdir(pth) then
+ mkdir(pth)
+ end
+ end
+ end
+ return pth, (isdir(pth) == true)
+ end
+
+
+end
+
+dir.makedirs = dir.mkdirs
+
+-- we can only define it here as it uses dir.current
+
+if onwindows then
+
+ function dir.expandname(str) -- will be merged with cleanpath and collapsepath
+ local first, nothing, last = match(str,"^(//)(//*)(.*)$")
+ if first then
+ first = dir.current() .. "/"
+ 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()
end
+ chdir(d)
end
end
- return pth, (lfs.isdir(pth) == true)
+ 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
---~ 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/"))
+else
- function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
+ function dir.expandname(str) -- will be merged with cleanpath and collapsepath
if not find(str,"^/") then
- str = lfs.currentdir() .. "/" .. str
+ str = currentdir() .. "/" .. str
end
str = gsub(str,"//","/")
str = gsub(str,"/%./","/")
+ str = gsub(str,"(.)/%.$","%1")
return str
end
end
-dir.makedirs = dir.mkdirs
+file.expandname = dir.expandname -- for convenience
+
+local stack = { }
+
+function dir.push(newdir)
+ insert(stack,lfs.currentdir())
+end
+
+function dir.pop()
+ local d = remove(stack)
+ if d then
+ lfs.chdir(d)
+ end
+ return d
+end
end -- of closure
@@ -3081,12 +3360,17 @@ if not modules then modules = { } end modules ['l-boolean'] = {
license = "see context related readme files"
}
+local type, tonumber = type, tonumber
+
boolean = boolean or { }
+local boolean = boolean
-local type, tonumber = type, tonumber
+-- function boolean.tonumber(b)
+-- return b and 1 or 0 -- test and test and return or return
+-- end
function boolean.tonumber(b)
- if b then return 1 else return 0 end
+ if b then return 1 else return 0 end -- test and return or return
end
function toboolean(str,tolerant)
@@ -3110,7 +3394,9 @@ function toboolean(str,tolerant)
end
end
-function string.is_boolean(str)
+string.toboolean = toboolean
+
+function string.is_boolean(str,default)
if type(str) == "string" then
if str == "true" or str == "yes" or str == "on" or str == "t" then
return true
@@ -3118,18 +3404,301 @@ function string.is_boolean(str)
return false
end
end
- return nil
+ return default
end
-function boolean.alwaystrue()
- return true
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['l-unicode'] = {
+ 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"
+}
+
+if not unicode then
+
+ unicode = { utf8 = { } }
+
+ local floor, char = math.floor, string.char
+
+ function unicode.utf8.utfchar(n)
+ if n < 0x80 then
+ return char(n)
+ elseif n < 0x800 then
+ return char(
+ 0xC0 + floor(n/0x40),
+ 0x80 + (n % 0x40)
+ )
+ elseif n < 0x10000 then
+ return char(
+ 0xE0 + floor(n/0x1000),
+ 0x80 + (floor(n/0x40) % 0x40),
+ 0x80 + (n % 0x40)
+ )
+ elseif n < 0x40000 then
+ return char(
+ 0xF0 + floor(n/0x40000),
+ 0x80 + floor(n/0x1000),
+ 0x80 + (floor(n/0x40) % 0x40),
+ 0x80 + (n % 0x40)
+ )
+ else
+ -- return char(
+ -- 0xF1 + floor(n/0x1000000),
+ -- 0x80 + floor(n/0x40000),
+ -- 0x80 + floor(n/0x1000),
+ -- 0x80 + (floor(n/0x40) % 0x40),
+ -- 0x80 + (n % 0x40)
+ -- )
+ return "?"
+ end
+ end
+
end
-function boolean.falsetrue()
- return false
+local unicode = unicode
+
+utf = utf or unicode.utf8
+
+local concat = table.concat
+local utfchar, utfbyte, utfgsub = utf.char, utf.byte, utf.gsub
+local char, byte, find, bytepairs, utfvalues, format = string.char, string.byte, string.find, string.bytepairs, string.utfvalues, string.format
+local type = type
+
+local utfsplitlines = string.utfsplitlines
+
+-- 0 EF BB BF UTF-8
+-- 1 FF FE UTF-16-little-endian
+-- 2 FE FF UTF-16-big-endian
+-- 3 FF FE 00 00 UTF-32-little-endian
+-- 4 00 00 FE FF UTF-32-big-endian
+
+unicode.utfname = {
+ [0] = 'utf-8',
+ [1] = 'utf-16-le',
+ [2] = 'utf-16-be',
+ [3] = 'utf-32-le',
+ [4] = 'utf-32-be'
+}
+
+-- \000 fails in <= 5.0 but is valid in >=5.1 where %z is depricated
+
+function unicode.utftype(f)
+ local str = f:read(4)
+ if not str then
+ f:seek('set')
+ return 0
+ -- elseif find(str,"^%z%z\254\255") then -- depricated
+ -- elseif find(str,"^\000\000\254\255") then -- not permitted and bugged
+ elseif find(str,"\000\000\254\255",1,true) then -- seems to work okay (TH)
+ return 4
+ -- elseif find(str,"^\255\254%z%z") then -- depricated
+ -- elseif find(str,"^\255\254\000\000") then -- not permitted and bugged
+ elseif find(str,"\255\254\000\000",1,true) then -- seems to work okay (TH)
+ return 3
+ elseif find(str,"^\254\255") then
+ f:seek('set',2)
+ return 2
+ elseif find(str,"^\255\254") then
+ f:seek('set',2)
+ return 1
+ elseif find(str,"^\239\187\191") then
+ f:seek('set',3)
+ return 0
+ else
+ f:seek('set')
+ return 0
+ end
+end
+
+
+
+local function utf16_to_utf8_be(t)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ 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
+ 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
+end
+
+local function utf16_to_utf8_le(t)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ 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
+ 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
+end
+
+local function utf32_to_utf8_be(str)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ end
+ local result = { } -- we reuse result
+ for i=1,#t do
+ local r, more = 0, -1
+ for a,b in bytepairs(str) 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 result
+end
+
+local function utf32_to_utf8_le(str)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ end
+ local result = { } -- we reuse result
+ for i=1,#t do
+ local r, more = 0, -1
+ for a,b in bytepairs(str) 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 result
+end
+
+unicode.utf32_to_utf8_be = utf32_to_utf8_be
+unicode.utf32_to_utf8_le = utf32_to_utf8_le
+unicode.utf16_to_utf8_be = utf16_to_utf8_be
+unicode.utf16_to_utf8_le = utf16_to_utf8_le
+
+function unicode.utf8_to_utf8(t)
+ return type(t) == "string" and utfsplitlines(t) or t
+end
+
+function unicode.utf16_to_utf8(t,endian)
+ return endian and utf16_to_utf8_be(t) or utf16_to_utf8_le(t) or t
+end
+
+function unicode.utf32_to_utf8(t,endian)
+ return endian and utf32_to_utf8_be(t) or utf32_to_utf8_le(t) or t
+end
+
+local function little(c)
+ local b = byte(c)
+ if b < 0x10000 then
+ return char(b%256,b/256)
+ else
+ b = b - 0x10000
+ local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00
+ return char(b1%256,b1/256,b2%256,b2/256)
+ end
+end
+
+local function big(c)
+ local b = byte(c)
+ if b < 0x10000 then
+ return char(b/256,b%256)
+ else
+ b = b - 0x10000
+ local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00
+ return char(b1/256,b1%256,b2/256,b2%256)
+ end
+end
+
+function unicode.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
+
+function unicode.utfcodes(str)
+ local t, n = { }, 0
+ for u in utfvalues(str) do
+ n = n + 1
+ t[n] = format("0x%04X",u)
+ end
+ return concat(t,separator or " ")
+end
+
+function unicode.ustring(s)
+ return format("U+%05X",type(s) == "number" and s or utfbyte(s))
+end
+
+function unicode.xstring(s)
+ return format("0x%05X",type(s) == "number" and s or utfbyte(s))
+end
+
+
+local lpegmatch = lpeg.match
+local utftype = lpeg.patterns.utftype
+
+function unicode.filetype(data)
+ return data and lpegmatch(utftype,data) or "unknown"
end
+
+
end -- of closure
do -- create closure to overcome 200 locals limit
@@ -3145,35 +3714,289 @@ 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.round then
- function math.round(x)
- return floor(x + 0.5)
- end
+ function math.round(x) return floor(x + 0.5) end
end
if not math.div then
- function math.div(n,m)
- return floor(n/m)
- end
+ function math.div(n,m) return floor(n/m) end
end
if not math.mod then
- function math.mod(n,m)
- return n % m
- end
+ function math.mod(n,m) return n % m end
end
local pipi = 2*math.pi/360
-function math.sind(d)
- return sin(d*pipi)
+if not math.sind then
+ function math.sind(d) return sin(d*pipi) end
+ function math.cosd(d) return cos(d*pipi) end
+ function math.tand(d) return tan(d*pipi) end
end
-function math.cosd(d)
- return cos(d*pipi)
+if not math.odd then
+ function math.odd (n) return n % 2 == 0 end
+ function math.even(n) return n % 2 ~= 0 end
end
-function math.tand(d)
- return tan(d*pipi)
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-tab'] = {
+ 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"
+}
+
+utilities = utilities or {}
+utilities.tables = utilities.tables or { }
+local tables = utilities.tables
+
+local format, gmatch = string.format, string.gmatch
+local concat, insert, remove = table.concat, table.insert, table.remove
+local setmetatable, getmetatable, tonumber, tostring = setmetatable, getmetatable, tonumber, tostring
+
+function tables.definetable(target) -- defines undefined tables
+ local composed, t, n = nil, { }, 0
+ for name in gmatch(target,"([^%.]+)") do
+ n = n + 1
+ if composed then
+ composed = composed .. "." .. name
+ else
+ composed = name
+ end
+ t[n] = format("%s = %s or { }",composed,composed)
+ end
+ return concat(t,"\n")
+end
+
+function tables.accesstable(target)
+ local t = _G
+ for name in gmatch(target,"([^%.]+)") do
+ t = t[name]
+ end
+ return t
+end
+
+function tables.removevalue(t,value) -- todo: n
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ remove(t,i)
+ -- remove all, so no: return
+ end
+ end
+ end
+end
+
+function tables.insertbeforevalue(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i,extra)
+ return
+ end
+ end
+ insert(t,1,extra)
+end
+
+function tables.insertaftervalue(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i+1,extra)
+ return
+ end
+ end
+ insert(t,#t+1,extra)
+end
+
+-- experimental
+
+local function toxml(t,d,result)
+ for k, v in table.sortedpairs(t) do
+ if type(v) == "table" then
+ result[#result+1] = format("%s<%s>",d,k)
+ toxml(v,d.." ",result)
+ result[#result+1] = format("%s</%s>",d,k)
+ elseif tonumber(k) then
+ result[#result+1] = format("%s<entry n='%s'>%s</entry>",d,k,v,k)
+ else
+ result[#result+1] = format("%s<%s>%s</%s>",d,k,tostring(v),k)
+ end
+ end
+end
+
+function table.toxml(t,name,nobanner)
+ local noroot = name == false
+ local result = (nobanner or noroot) and { } or { "<?xml version='1.0' standalone='yes' ?>" }
+ if noroot then
+ toxml( t, "", result)
+ else
+ toxml( { [name or "root"] = t }, "", result)
+ end
+ return concat(result,"\n")
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-sto'] = {
+ 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 setmetatable, getmetatable = setmetatable, getmetatable
+
+utilities = utilities or { }
+utilities.storage = utilities.storage or { }
+local storage = utilities.storage
+
+function storage.mark(t)
+ if not t then
+ texio.write_nl("fatal error: storage '%s' cannot be marked",t)
+ os.exit()
+ end
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m.__storage__ = true
+ return t
+end
+
+function storage.allocate(t)
+ t = t or { }
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m.__storage__ = true
+ return t
+end
+
+function storage.marked(t)
+ local m = getmetatable(t)
+ return m and m.__storage__
+end
+
+function storage.checked(t)
+ if not t then
+ texio.write_nl("fatal error: storage '%s' has not been allocated",t)
+ os.exit()
+ end
+ return t
+end
+
+
+function storage.setinitializer(data,initialize)
+ local m = getmetatable(data) or { }
+ m.__index = function(data,k)
+ m.__index = nil -- so that we can access the entries during initializing
+ initialize()
+ return data[k]
+ end
+ setmetatable(data, m)
+end
+
+local keyisvalue = { __index = function(t,k)
+ t[k] = k
+ return k
+end }
+
+function storage.sparse(t)
+ t = t or { }
+ setmetatable(t,keyisvalue)
+ return t
+end
+
+-- table namespace ?
+
+local function f_empty () return "" end -- t,k
+local function f_self (t,k) t[k] = k return k end
+local function f_ignore() end -- t,k,v
+
+local t_empty = { __index = empty }
+local t_self = { __index = self }
+local t_ignore = { __newindex = ignore }
+
+function table.setmetatableindex(t,f)
+ local m = getmetatable(t)
+ if m then
+ if f == "empty" then
+ m.__index = f_empty
+ elseif f == "key" then
+ m.__index = f_self
+ else
+ m.__index = f
+ end
+ else
+ if f == "empty" then
+ setmetatable(t, t_empty)
+ elseif f == "key" then
+ setmetatable(t, t_self)
+ else
+ setmetatable(t,{ __index = f })
+ end
+ end
+end
+
+function table.setmetatablenewindex(t,f)
+ local m = getmetatable(t)
+ if m then
+ if f == "ignore" then
+ m.__newindex = f_ignore
+ else
+ m.__newindex = f
+ end
+ else
+ if f == "ignore" then
+ setmetatable(t, t_ignore)
+ else
+ setmetatable(t,{ __newindex = f })
+ end
+ end
+end
+
+function table.setmetatablecall(t,f)
+ local m = getmetatable(t)
+ if m then
+ m.__call = f
+ else
+ setmetatable(t,{ __call = f })
+ end
+end
+
+function table.setmetatablekey(t,key,value)
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m[key] = value
+end
+
+function table.getmetatablekey(t,key,value)
+ local m = getmetatable(t)
+ return m and m[key]
end
@@ -3181,7 +4004,7 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['l-utils'] = {
+if not modules then modules = { } end modules ['util-mrg'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -3191,89 +4014,85 @@ if not modules then modules = { } end modules ['l-utils'] = {
-- hm, quite unreadable
-local gsub = string.gsub
+local gsub, format = string.gsub, string.format
local concat = table.concat
local type, next = type, next
-if not utils then utils = { } end
-if not utils.merger then utils.merger = { } end
-if not utils.lua then utils.lua = { } end
+utilities = utilities or {}
+utilities.merger = utilities.merger or { } -- maybe mergers
+utilities.report = logs and logs.reporter("system") or print
+
+local merger = utilities.merger
+
+merger.strip_comment = true
+
+local m_begin_merge = "begin library merge"
+local m_end_merge = "end library merge"
+local m_begin_closure = "do -- create closure to overcome 200 locals limit"
+local m_end_closure = "end -- of closure"
-utils.merger.m_begin = "begin library merge"
-utils.merger.m_end = "end library merge"
-utils.merger.pattern =
+local m_pattern =
"%c+" ..
- "%-%-%s+" .. utils.merger.m_begin ..
+ "%-%-%s+" .. m_begin_merge ..
"%c+(.-)%c+" ..
- "%-%-%s+" .. utils.merger.m_end ..
+ "%-%-%s+" .. m_end_merge ..
"%c+"
-function utils.merger._self_fake_()
- return
- "-- " .. "created merged file" .. "\n\n" ..
- "-- " .. utils.merger.m_begin .. "\n\n" ..
- "-- " .. utils.merger.m_end .. "\n\n"
-end
+local m_format =
+ "\n\n-- " .. m_begin_merge ..
+ "\n%s\n" ..
+ "-- " .. m_end_merge .. "\n\n"
-function utils.report(...)
- print(...)
+local m_faked =
+ "-- " .. "created merged file" .. "\n\n" ..
+ "-- " .. m_begin_merge .. "\n\n" ..
+ "-- " .. m_end_merge .. "\n\n"
+
+local function self_fake()
+ return m_faked
end
-utils.merger.strip_comment = true
+local function self_nothing()
+ return ""
+end
-function utils.merger._self_load_(name)
- local f, data = io.open(name), ""
- if f then
- utils.report("reading merge from %s",name)
- data = f:read("*all")
- f:close()
+local function self_load(name)
+ local data = io.loaddata(name) or ""
+ if data == "" then
+ utilities.report("merge: unknown file %s",name)
else
- utils.report("unknown file to merge %s",name)
- end
- if data and utils.merger.strip_comment then
- -- saves some 20K
- data = gsub(data,"%-%-~[^\n\r]*[\r\n]", "")
+ utilities.report("merge: inserting %s",name)
end
return data or ""
end
-function utils.merger._self_save_(name, data)
+local function self_save(name, data)
if data ~= "" then
- local f = io.open(name,'w')
- if f then
- utils.report("saving merge from %s",name)
- f:write(data)
- f:close()
+ if merger.strip_comment then
+ -- saves some 20K
+ local n = #data
+ data = gsub(data,"%-%-~[^\n\r]*[\r\n]","")
+ utilities.report("merge: %s bytes of comment stripped, %s bytes of code left",n-#data,#data)
end
+ io.savedata(name,data)
+ utilities.report("merge: saving %s",name)
end
end
-function utils.merger._self_swap_(data,code)
- if data ~= "" then
- return (gsub(data,utils.merger.pattern, function(s)
- return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n"
- end, 1))
- else
- return ""
- end
+local function self_swap(data,code)
+ return data ~= "" and (gsub(data,m_pattern, function() return format(m_format,code) end, 1)) or ""
end
---~ stripper:
---~
---~ data = gsub(data,"%-%-~[^\n]*\n","")
---~ data = gsub(data,"\n\n+","\n")
-
-function utils.merger._self_libs_(libs,list)
- local result, f, frozen = { }, nil, false
+local function self_libs(libs,list)
+ local result, f, frozen, foundpath = { }, nil, false, nil
result[#result+1] = "\n"
if type(libs) == 'string' then libs = { libs } end
if type(list) == 'string' then list = { list } end
- local foundpath = nil
for i=1,#libs do
local lib = libs[i]
for j=1,#list do
local pth = gsub(list[j],"\\","/") -- file.clean_path
- utils.report("checking library path %s",pth)
+ utilities.report("merge: checking library path %s",pth)
local name = pth .. "/" .. lib
if lfs.isfile(name) then
foundpath = pth
@@ -3282,76 +4101,75 @@ function utils.merger._self_libs_(libs,list)
if foundpath then break end
end
if foundpath then
- utils.report("using library path %s",foundpath)
+ utilities.report("merge: using library path %s",foundpath)
local right, wrong = { }, { }
for i=1,#libs do
local lib = libs[i]
local fullname = foundpath .. "/" .. lib
if lfs.isfile(fullname) then
- -- right[#right+1] = lib
- utils.report("merging library %s",fullname)
- result[#result+1] = "do -- create closure to overcome 200 locals limit"
+ utilities.report("merge: using library %s",fullname)
+ right[#right+1] = lib
+ result[#result+1] = m_begin_closure
result[#result+1] = io.loaddata(fullname,true)
- result[#result+1] = "end -- of closure"
+ result[#result+1] = m_end_closure
else
- -- wrong[#wrong+1] = lib
- utils.report("no library %s",fullname)
+ utilities.report("merge: skipping library %s",fullname)
+ wrong[#wrong+1] = lib
end
end
if #right > 0 then
- utils.report("merged libraries: %s",concat(right," "))
+ utilities.report("merge: used libraries: %s",concat(right," "))
end
if #wrong > 0 then
- utils.report("skipped libraries: %s",concat(wrong," "))
+ utilities.report("merge: skipped libraries: %s",concat(wrong," "))
end
else
- utils.report("no valid library path found")
+ utilities.report("merge: no valid library path found")
end
return concat(result, "\n\n")
end
-function utils.merger.selfcreate(libs,list,target)
+function merger.selfcreate(libs,list,target)
if target then
- utils.merger._self_save_(
- target,
- utils.merger._self_swap_(
- utils.merger._self_fake_(),
- utils.merger._self_libs_(libs,list)
- )
- )
+ self_save(target,self_swap(self_fake(),self_libs(libs,list)))
end
end
-function utils.merger.selfmerge(name,libs,list,target)
- utils.merger._self_save_(
- target or name,
- utils.merger._self_swap_(
- utils.merger._self_load_(name),
- utils.merger._self_libs_(libs,list)
- )
- )
+function merger.selfmerge(name,libs,list,target)
+ self_save(target or name,self_swap(self_load(name),self_libs(libs,list)))
end
-function utils.merger.selfclean(name)
- utils.merger._self_save_(
- name,
- utils.merger._self_swap_(
- utils.merger._self_load_(name),
- ""
- )
- )
+function merger.selfclean(name)
+ self_save(name,self_swap(self_load(name),self_nothing()))
end
-function utils.lua.compile(luafile, lucfile, cleanup, strip) -- defaults: cleanup=false strip=true
- -- utils.report("compiling",luafile,"into",lucfile)
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-lua'] = {
+ 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"
+}
+
+utilities = utilities or {}
+utilities.lua = utilities.lua or { }
+utilities.report = logs and logs.reporter("system") or print
+
+function utilities.lua.compile(luafile,lucfile,cleanup,strip) -- defaults: cleanup=false strip=true
+ utilities.report("lua: compiling %s into %s",luafile,lucfile)
os.remove(lucfile)
- local command = "-o " .. string.quote(lucfile) .. " " .. string.quote(luafile)
+ local command = "-o " .. string.quoted(lucfile) .. " " .. string.quoted(luafile)
if strip ~= false then
command = "-s " .. command
end
- local done = (os.spawn("texluac " .. command) == 0) or (os.spawn("luac " .. command) == 0)
+ local done = os.spawn("texluac " .. command) == 0 or os.spawn("luac " .. command) == 0
if done and cleanup == true and lfs.isfile(lucfile) and lfs.isfile(luafile) then
- -- utils.report("removing",luafile)
+ utilities.report("lua: removing %s",luafile)
os.remove(luafile)
end
return done
@@ -3359,11 +4177,16 @@ end
+
+
+
+
+
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['l-aux'] = {
+if not modules then modules = { } end modules ['util-prs'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -3371,15 +4194,20 @@ if not modules then modules = { } end modules ['l-aux'] = {
license = "see context related readme files"
}
--- for inline, no store split : for s in string.gmatch(str,",* *([^,]+)") do .. end
+local P, R, V, C, Ct, Carg = lpeg.P, lpeg.R, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Carg
+local lpegmatch = lpeg.match
+local concat, format, gmatch = table.concat, string.format, string.gmatch
+local tostring, type, next = tostring, type, next
-aux = aux or { }
+utilities = utilities or {}
+utilities.parsers = utilities.parsers or { }
+local parsers = utilities.parsers
+parsers.patterns = parsers.patterns or { }
-local concat, format, gmatch = table.concat, string.format, string.gmatch
-local tostring, type = tostring, type
-local lpegmatch = lpeg.match
+local setmetatableindex = table.setmetatableindex
+local sortedhash = table.sortedhash
-local P, R, V = lpeg.P, lpeg.R, lpeg.V
+-- we could use a Cf Cg construct
local escape, left, right = P("\\"), P('{'), P('}')
@@ -3388,29 +4216,35 @@ lpeg.patterns.balanced = P {
[2] = left * V(1) * right
}
-local space = lpeg.P(' ')
-local equal = lpeg.P("=")
-local comma = lpeg.P(",")
-local lbrace = lpeg.P("{")
-local rbrace = lpeg.P("}")
+local space = P(' ')
+local equal = P("=")
+local comma = P(",")
+local lbrace = P("{")
+local rbrace = P("}")
local nobrace = 1 - (lbrace+rbrace)
-local nested = lpeg.P { lbrace * (nobrace + lpeg.V(1))^0 * rbrace }
+local nested = P { lbrace * (nobrace + V(1))^0 * rbrace }
local spaces = space^0
-local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
+lpeg.patterns.nested = nested
+
+local value = P(lbrace * C((nobrace + nested)^0) * rbrace) + C((nested + (1-comma))^0)
-local key = lpeg.C((1-equal-comma)^1)
-local pattern_a = (space+comma)^0 * (key * equal * value + key * lpeg.C(""))
+local key = C((1-equal-comma)^1)
+local pattern_a = (space+comma)^0 * (key * equal * value + key * C(""))
local pattern_c = (space+comma)^0 * (key * equal * value)
-local key = lpeg.C((1-space-equal-comma)^1)
-local pattern_b = spaces * comma^0 * spaces * (key * ((spaces * equal * spaces * value) + lpeg.C("")))
+local key = C((1-space-equal-comma)^1)
+local pattern_b = spaces * comma^0 * spaces * (key * ((spaces * equal * spaces * value) + C("")))
-- "a=1, b=2, c=3, d={a{b,c}d}, e=12345, f=xx{a{b,c}d}xx, g={}" : outer {} removes, leading spaces ignored
local hash = { }
-local function set(key,value) -- using Carg is slower here
+local function set(key,value)
+ hash[key] = value
+end
+
+local function set(key,value)
hash[key] = value
end
@@ -3418,11 +4252,11 @@ local pattern_a_s = (pattern_a/set)^1
local pattern_b_s = (pattern_b/set)^1
local pattern_c_s = (pattern_c/set)^1
-aux.settings_to_hash_pattern_a = pattern_a_s
-aux.settings_to_hash_pattern_b = pattern_b_s
-aux.settings_to_hash_pattern_c = pattern_c_s
+parsers.patterns.settings_to_hash_a = pattern_a_s
+parsers.patterns.settings_to_hash_b = pattern_b_s
+parsers.patterns.settings_to_hash_c = pattern_c_s
-function aux.make_settings_to_hash_pattern(set,how)
+function parsers.make_settings_to_hash_pattern(set,how)
if how == "strict" then
return (pattern_c/set)^1
elseif how == "tolerant" then
@@ -3432,21 +4266,17 @@ function aux.make_settings_to_hash_pattern(set,how)
end
end
-function aux.settings_to_hash(str,existing)
+function parsers.settings_to_hash(str,existing)
if str and str ~= "" then
hash = existing or { }
- if moretolerant then
- lpegmatch(pattern_b_s,str)
- else
- lpegmatch(pattern_a_s,str)
- end
+ lpegmatch(pattern_a_s,str)
return hash
else
return { }
end
end
-function aux.settings_to_hash_tolerant(str,existing)
+function parsers.settings_to_hash_tolerant(str,existing)
if str and str ~= "" then
hash = existing or { }
lpegmatch(pattern_b_s,str)
@@ -3456,7 +4286,7 @@ function aux.settings_to_hash_tolerant(str,existing)
end
end
-function aux.settings_to_hash_strict(str,existing)
+function parsers.settings_to_hash_strict(str,existing)
if str and str ~= "" then
hash = existing or { }
lpegmatch(pattern_c_s,str)
@@ -3467,16 +4297,16 @@ function aux.settings_to_hash_strict(str,existing)
end
local separator = comma * space^0
-local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
-local pattern = lpeg.Ct(value*(separator*value)^0)
+local value = P(lbrace * C((nobrace + nested)^0) * rbrace) + C((nested + (1-comma))^0)
+local pattern = Ct(value*(separator*value)^0)
-- "aap, {noot}, mies" : outer {} removes, leading spaces ignored
-aux.settings_to_array_pattern = pattern
+parsers.patterns.settings_to_array = pattern
-- we could use a weak table as cache
-function aux.settings_to_array(str)
+function parsers.settings_to_array(str)
if not str or str == "" then
return { }
else
@@ -3488,16 +4318,16 @@ local function set(t,v)
t[#t+1] = v
end
-local value = lpeg.P(lpeg.Carg(1)*value) / set
-local pattern = value*(separator*value)^0 * lpeg.Carg(1)
+local value = P(Carg(1)*value) / set
+local pattern = value*(separator*value)^0 * Carg(1)
-function aux.add_settings_to_array(t,str)
+function parsers.add_settings_to_array(t,str)
return lpegmatch(pattern,str,nil,t)
end
-function aux.hash_to_string(h,separator,yes,no,strict,omit)
+function parsers.hash_to_string(h,separator,yes,no,strict,omit)
if h then
- local t, s = { }, table.sortedkeys(h)
+ local t, tn, s = { }, 0, table.sortedkeys(h)
omit = omit and table.tohash(omit)
for i=1,#s do
local key = s[i]
@@ -3506,15 +4336,19 @@ function aux.hash_to_string(h,separator,yes,no,strict,omit)
if type(value) == "boolean" then
if yes and no then
if value then
- t[#t+1] = key .. '=' .. yes
+ tn = tn + 1
+ t[tn] = key .. '=' .. yes
elseif not strict then
- t[#t+1] = key .. '=' .. no
+ tn = tn + 1
+ t[tn] = key .. '=' .. no
end
elseif value or not strict then
- t[#t+1] = key .. '=' .. tostring(value)
+ tn = tn + 1
+ t[tn] = key .. '=' .. tostring(value)
end
else
- t[#t+1] = key .. '=' .. value
+ tn = tn + 1
+ t[tn] = key .. '=' .. value
end
end
end
@@ -3524,7 +4358,7 @@ function aux.hash_to_string(h,separator,yes,no,strict,omit)
end
end
-function aux.array_to_string(a,separator)
+function parsers.array_to_string(a,separator)
if a then
return concat(a,separator or ",")
else
@@ -3532,107 +4366,160 @@ function aux.array_to_string(a,separator)
end
end
-function aux.settings_to_set(str,t)
+function parsers.settings_to_set(str,t) -- tohash? -- todo: lpeg -- duplicate anyway
t = t or { }
- for s in gmatch(str,"%s*([^,]+)") do
+-- for s in gmatch(str,"%s*([^, ]+)") do -- space added
+ for s in gmatch(str,"[^, ]+") do -- space added
t[s] = true
end
return t
end
-local value = lbrace * lpeg.C((nobrace + nested)^0) * rbrace
-local pattern = lpeg.Ct((space + value)^0)
+function parsers.simple_hash_to_string(h, separator)
+ local t, tn = { }, 0
+ for k, v in sortedhash(h) do
+ if v then
+ tn = tn + 1
+ t[tn] = k
+ end
+ end
+ return concat(t,separator or ",")
+end
+
+local value = lbrace * C((nobrace + nested)^0) * rbrace
+local pattern = Ct((space + value)^0)
-function aux.arguments_to_table(str)
+function parsers.arguments_to_table(str)
return lpegmatch(pattern,str)
end
--- temporary here
+-- temporary here (unoptimized)
-function aux.getparameters(self,class,parentclass,settings)
+function parsers.getparameters(self,class,parentclass,settings)
local sc = self[class]
if not sc then
- sc = table.clone(self[parent])
+ sc = { }
self[class] = sc
+ if parentclass then
+ local sp = self[parentclass]
+ if not sp then
+ sp = { }
+ self[parentclass] = sp
+ end
+ setmetatableindex(sc,sp)
+ end
end
- aux.settings_to_hash(settings,sc)
+ parsers.settings_to_hash(settings,sc)
+end
+
+function parsers.listitem(str)
+ return gmatch(str,"[^, ]+")
end
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-fmt'] = {
+ 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"
+}
+
+utilities = utilities or { }
+utilities.formatters = utilities.formatters or { }
+local formatters = utilities.formatters
+
+local concat, format = table.concat, string.format
+local tostring, type = tostring, type
+local strip = string.strip
+
+local P, R, Cs = lpeg.P, lpeg.R, lpeg.Cs
+local lpegmatch = lpeg.match
+
-- temporary here
-local digit = lpeg.R("09")
-local period = lpeg.P(".")
-local zero = lpeg.P("0")
+local digit = R("09")
+local period = P(".")
+local zero = P("0")
local trailingzeros = zero^0 * -digit -- suggested by Roberto R
local case_1 = period * trailingzeros / ""
local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
local number = digit^1 * (case_1 + case_2)
-local stripper = lpeg.Cs((number + 1)^0)
+local stripper = Cs((number + 1)^0)
---~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
---~ collectgarbage("collect")
---~ str = string.rep(sample,10000)
---~ local ts = os.clock()
---~ lpegmatch(stripper,str)
---~ print(#str, os.clock()-ts, lpegmatch(stripper,sample))
-lpeg.patterns.strip_zeros = stripper
+lpeg.patterns.stripzeros = stripper
-function aux.strip_zeros(str)
+function formatters.stripzeros(str)
return lpegmatch(stripper,str)
end
-function aux.definetable(target) -- defines undefined tables
- local composed, t = nil, { }
- for name in gmatch(target,"([^%.]+)") do
- if composed then
- composed = composed .. "." .. name
- else
- composed = name
+function formatters.formatcolumns(result,between)
+ if result and #result > 0 then
+ between = between or " "
+ local widths, numbers = { }, { }
+ local first = result[1]
+ local n = #first
+ for i=1,n do
+ widths[i] = 0
+ end
+ for i=1,#result do
+ local r = result[i]
+ for j=1,n do
+ local rj = r[j]
+ local tj = type(rj)
+ if tj == "number" then
+ numbers[j] = true
+ end
+ if tj ~= "string" then
+ rj = tostring(rj)
+ r[j] = rj
+ end
+ local w = #rj
+ if w > widths[j] then
+ widths[j] = w
+ end
+ end
+ end
+ for i=1,n do
+ local w = widths[i]
+ if numbers[i] then
+ if w > 80 then
+ widths[i] = "%s" .. between
+ else
+ widths[i] = "%0" .. w .. "i" .. between
+ end
+ else
+ if w > 80 then
+ widths[i] = "%s" .. between
+ elseif w > 0 then
+ widths[i] = "%-" .. w .. "s" .. between
+ else
+ widths[i] = "%s"
+ end
+ end
+ end
+ local template = strip(concat(widths))
+ for i=1,#result do
+ local str = format(template,unpack(result[i]))
+ result[i] = strip(str)
end
- t[#t+1] = format("%s = %s or { }",composed,composed)
- end
- return concat(t,"\n")
-end
-
-function aux.accesstable(target)
- local t = _G
- for name in gmatch(target,"([^%.]+)") do
- t = t[name]
end
- return t
+ return result
end
---~ function string.commaseparated(str)
---~ return gmatch(str,"([^,%s]+)")
---~ end
-
--- as we use this a lot ...
-
---~ function aux.cachefunction(action,weak)
---~ local cache = { }
---~ if weak then
---~ setmetatable(cache, { __mode = "kv" } )
---~ end
---~ local function reminder(str)
---~ local found = cache[str]
---~ if not found then
---~ found = action(str)
---~ cache[str] = found
---~ end
---~ return found
---~ end
---~ return reminder, cache
---~ end
-
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['trac-tra'] = {
+if not modules then modules = { } end modules ['util.deb'] = {
version = 1.001,
- comment = "companion to trac-tra.mkiv",
+ 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"
@@ -3645,14 +4532,16 @@ if not modules then modules = { } end modules ['trac-tra'] = {
local debug = require "debug"
local getinfo = debug.getinfo
-local type, next = type, next
-local concat = table.concat
-local format, find, lower, gmatch, gsub = string.format, string.find, string.lower, string.gmatch, string.gsub
+local type, next, tostring = type, next, tostring
+local format, find = string.format, string.find
+local is_boolean = string.is_boolean
-debugger = debugger or { }
+utilities = utilities or { }
+utilities.debugger = utilities.debugger or { }
+local debugger = utilities.debugger
local counters = { }
-local names = { }
+local names = { }
-- one
@@ -3670,6 +4559,7 @@ local function hook()
end
end
end
+
local function getname(func)
local n = names[func]
if n then
@@ -3685,6 +4575,7 @@ local function getname(func)
return "unknown"
end
end
+
function debugger.showstats(printer,threshold)
printer = printer or texio.write or print
threshold = threshold or 0
@@ -3707,35 +4598,6 @@ end
-- two
---~ local function hook()
---~ local n = getinfo(2)
---~ if n.what=="C" and not n.name then
---~ local f = tostring(debug.traceback())
---~ local cf = counters[f]
---~ if cf == nil then
---~ counters[f] = 1
---~ names[f] = n
---~ else
---~ counters[f] = cf + 1
---~ end
---~ end
---~ end
---~ function debugger.showstats(printer,threshold)
---~ printer = printer or texio.write or print
---~ threshold = threshold or 0
---~ local total, grandtotal, functions = 0, 0, 0
---~ printer("\n") -- ugly but ok
---~ -- table.sort(counters)
---~ for func, count in next, counters do
---~ if count > threshold then
---~ printer(format("%8i %s", count, func))
---~ total = total + count
---~ end
---~ grandtotal = grandtotal + count
---~ functions = functions + 1
---~ end
---~ printer(format("functions: %s, total: %s, grand total: %s, threshold: %s\n", functions, total, grandtotal, threshold))
---~ end
-- rest
@@ -3753,85 +4615,335 @@ end
function debugger.disable()
debug.sethook()
---~ counters[debug.getinfo(2,"f").func] = nil
end
-function debugger.tracing()
- local n = tonumber(os.env['MTX.TRACE.CALLS']) or tonumber(os.env['MTX_TRACE_CALLS']) or 0
- if n > 0 then
- function debugger.tracing() return true end ; return true
+
+
+
+
+local is_node = node and node.is_node
+
+function inspect(i) -- global function
+ local ti = type(i)
+ if ti == "table" then
+ table.print(i,"table")
+ elseif is_node and is_node(i) then
+ table.print(nodes.astable(i),tostring(i))
else
- function debugger.tracing() return false end ; return false
+ print(tostring(i))
end
end
---~ debugger.enable()
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
+end -- of closure
---~ debugger.disable()
+do -- create closure to overcome 200 locals limit
---~ print("")
---~ debugger.showstats()
---~ print("")
---~ debugger.showstats(print,3)
+if not modules then modules = { } end modules ['trac-inf'] = {
+ version = 1.001,
+ comment = "companion to trac-inf.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- As we want to protect the global tables, we no longer store the timing
+-- in the tables themselves but in a hidden timers table so that we don't
+-- get warnings about assignments. This is more efficient than using rawset
+-- and rawget.
+
+local format = string.format
+local clock = os.gettimeofday or os.clock -- should go in environment
+local write_nl = texio.write_nl
+
+statistics = statistics or { }
+local statistics = statistics
+
+statistics.enable = true
+statistics.threshold = 0.05
+
+local statusinfo, n, registered, timers = { }, 0, { }, { }
+
+local function hastiming(instance)
+ return instance and timers[instance]
+end
+
+local function resettiming(instance)
+ timers[instance or "notimer"] = { timing = 0, loadtime = 0 }
+end
-setters = setters or { }
-setters.data = setters.data or { }
+local function starttiming(instance)
+ local timer = timers[instance or "notimer"]
+ if not timer then
+ timer = { }
+ timers[instance or "notimer"] = timer
+ end
+ local it = timer.timing
+ if not it then
+ it = 0
+ end
+ if it == 0 then
+ timer.starttime = clock()
+ if not timer.loadtime then
+ timer.loadtime = 0
+ end
+ end
+ timer.timing = it + 1
+end
---~ local function set(t,what,value)
---~ local data, done = t.data, t.done
---~ if type(what) == "string" then
---~ what = aux.settings_to_array(what) -- inefficient but ok
---~ end
---~ for i=1,#what do
---~ local w = what[i]
---~ for d, f in next, data do
---~ if done[d] then
---~ -- prevent recursion due to wildcards
---~ elseif find(d,w) then
---~ done[d] = true
---~ for i=1,#f do
---~ f[i](value)
---~ end
---~ end
---~ end
---~ end
---~ end
+local function stoptiming(instance, report)
+ local timer = timers[instance or "notimer"]
+ local it = timer.timing
+ if it > 1 then
+ timer.timing = it - 1
+ else
+ local starttime = timer.starttime
+ if starttime then
+ local stoptime = clock()
+ local loadtime = stoptime - starttime
+ timer.stoptime = stoptime
+ timer.loadtime = timer.loadtime + loadtime
+ if report then
+ statistics.report("load time %0.3f",loadtime)
+ end
+ timer.timing = 0
+ return loadtime
+ end
+ end
+ return 0
+end
-local function set(t,what,value)
+local function elapsedtime(instance)
+ local timer = timers[instance or "notimer"]
+ return format("%0.3f",timer and timer.loadtime or 0)
+end
+
+local function elapsedindeed(instance)
+ local timer = timers[instance or "notimer"]
+ return (timer and timer.loadtime or 0) > statistics.threshold
+end
+
+local function elapsedseconds(instance,rest) -- returns nil if 0 seconds
+ if elapsedindeed(instance) then
+ return format("%s seconds %s", elapsedtime(instance),rest or "")
+ end
+end
+
+statistics.hastiming = hastiming
+statistics.resettiming = resettiming
+statistics.starttiming = starttiming
+statistics.stoptiming = stoptiming
+statistics.elapsedtime = elapsedtime
+statistics.elapsedindeed = elapsedindeed
+statistics.elapsedseconds = elapsedseconds
+
+-- general function
+
+function statistics.register(tag,fnc)
+ if statistics.enable and type(fnc) == "function" then
+ local rt = registered[tag] or (#statusinfo + 1)
+ statusinfo[rt] = { tag, fnc }
+ registered[tag] = rt
+ if #tag > n then n = #tag end
+ end
+end
+
+function statistics.show(reporter)
+ if statistics.enable then
+ if not reporter then reporter = function(tag,data,n) write_nl(tag .. " " .. data) end end
+ -- this code will move
+ local register = statistics.register
+ register("luatex banner", function()
+ return string.lower(status.banner)
+ end)
+ register("control sequences", function()
+ return format("%s of %s", status.cs_count, status.hash_size+status.hash_extra)
+ end)
+ register("callbacks", function()
+ local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0
+ return format("%s direct, %s indirect, %s total", total-indirect, indirect, total)
+ end)
+ collectgarbage("collect")
+ register("current memory usage", statistics.memused)
+ register("runtime",statistics.runtime)
+ for i=1,#statusinfo do
+ local s = statusinfo[i]
+ local r = s[2]()
+ if r then
+ reporter(s[1],r,n)
+ end
+ end
+ write_nl("") -- final newline
+ statistics.enable = false
+ end
+end
+
+local template, report_statistics, nn = nil, nil, 0 -- we only calcute it once
+
+function statistics.showjobstat(tag,data,n)
+ if not logs then
+ -- sorry
+ elseif type(data) == "table" then
+ for i=1,#data do
+ statistics.showjobstat(tag,data[i],n)
+ end
+ else
+ if not template or n > nn then
+ template, n = format("%%-%ss - %%s",n), nn
+ report_statistics = logs.reporter("mkiv lua stats")
+ end
+ report_statistics(format(template,tag,data))
+ end
+end
+
+function statistics.memused() -- no math.round yet -)
+ local round = math.round or math.floor
+ return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000))
+end
+
+starttiming(statistics)
+
+function statistics.formatruntime(runtime) -- indirect so it can be overloaded and
+ return format("%s seconds", runtime) -- indeed that happens in cure-uti.lua
+end
+
+function statistics.runtime()
+ stoptiming(statistics)
+ return statistics.formatruntime(elapsedtime(statistics))
+end
+
+function statistics.timed(action,report)
+ report = report or logs.reporter("system")
+ starttiming("run")
+ action()
+ stoptiming("run")
+ report("total runtime: %s",elapsedtime("run"))
+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")
+ tex.sprint(elapsedtime(name or "whatever"))
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['trac-set'] = { -- might become util-set.lua
+ 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 type, next, tostring = type, next, tostring
+local concat = table.concat
+local format, find, lower, gsub, escapedpattern = string.format, string.find, string.lower, string.gsub, string.escapedpattern
+local is_boolean = string.is_boolean
+local settings_to_hash = utilities.parsers.settings_to_hash
+local allocate = utilities.storage.allocate
+
+utilities = utilities or { }
+local utilities = utilities
+utilities.setters = utilities.setters or { }
+local setters = utilities.setters
+
+local data = { } -- maybe just local
+
+-- We can initialize from the cnf file. This is sort of tricky as
+-- later defined setters also need to be initialized then. If set
+-- this way, we need to ensure that they are not reset later on.
+
+local trace_initialize = false -- only for testing during development
+
+function setters.initialize(filename,name,values) -- filename only for diagnostics
+ local setter = data[name]
+ if setter then
+ local data = setter.data
+ if data then
+ for key, value in next, values do
+ -- key = gsub(key,"_",".")
+ value = is_boolean(value,value)
+ local functions = data[key]
+ if functions then
+ if #functions > 0 and not functions.value then
+ if trace_initialize then
+ setter.report("executing %s (%s -> %s)",key,filename,tostring(value))
+ end
+ for i=1,#functions do
+ functions[i](value)
+ end
+ functions.value = value
+ else
+ if trace_initialize then
+ setter.report("skipping %s (%s -> %s)",key,filename,tostring(value))
+ end
+ end
+ else
+ -- we do a simple preregistration i.e. not in the
+ -- list as it might be an obsolete entry
+ functions = { default = value }
+ data[key] = functions
+ if trace_initialize then
+ setter.report("storing %s (%s -> %s)",key,filename,tostring(value))
+ end
+ end
+ end
+ return true
+ end
+ end
+end
+
+-- user interface code
+
+local function set(t,what,newvalue)
local data, done = t.data, t.done
if type(what) == "string" then
- what = aux.settings_to_hash(what) -- inefficient but ok
+ what = settings_to_hash(what) -- inefficient but ok
+ end
+ if type(what) ~= "table" then
+ return
end
- for w, v in next, what do
- if v == "" then
- v = value
+ for w, value in next, what do
+ if value == "" then
+ value = newvalue
+ elseif not value then
+ value = false -- catch nil
else
- v = toboolean(v)
+ value = is_boolean(value,value)
end
- for d, f in next, data do
- if done[d] then
+ w = "^" .. escapedpattern(w,true) .. "$" -- new: anchored
+ for name, functions in next, data do
+ if done[name] then
-- prevent recursion due to wildcards
- elseif find(d,w) then
- done[d] = true
- for i=1,#f do
- f[i](v)
+ elseif find(name,w) then
+ done[name] = true
+ for i=1,#functions do
+ functions[i](value)
end
+ functions.value = value
end
end
end
end
local function reset(t)
- for d, f in next, t.data do
- for i=1,#f do
- f[i](false)
+ for name, functions in next, t.data do
+ for i=1,#functions do
+ functions[i](false)
end
+ functions.value = false
end
end
@@ -3852,32 +4964,51 @@ end
function setters.register(t,what,...)
local data = t.data
what = lower(what)
- local w = data[what]
- if not w then
- w = { }
- data[what] = w
+ local functions = data[what]
+ if not functions then
+ functions = { }
+ data[what] = functions
+ if trace_initialize then
+ t.report("defining %s",what)
+ end
end
+ local default = functions.default -- can be set from cnf file
for _, fnc in next, { ... } do
local typ = type(fnc)
- if typ == "function" then
- w[#w+1] = fnc
- elseif typ == "string" then
- w[#w+1] = function(value) set(t,fnc,value,nesting) end
+ if typ == "string" then
+ if trace_initialize then
+ t.report("coupling %s to %s",what,fnc)
+ end
+ local s = fnc -- else wrong reference
+ fnc = function(value) set(t,s,value) end
+ elseif typ ~= "function" then
+ fnc = nil
+ end
+ if fnc then
+ functions[#functions+1] = fnc
+ -- default: set at command line or in cnf file
+ -- value : set in tex run (needed when loading runtime)
+ local value = functions.value or default
+ if value ~= nil then
+ fnc(value)
+ functions.value = value
+ end
end
end
+ return false -- so we can use it in an assignment
end
function setters.enable(t,what)
local e = t.enable
t.enable, t.done = enable, { }
- enable(t,string.simpleesc(tostring(what)))
+ enable(t,what)
t.enable, t.done = e, { }
end
function setters.disable(t,what)
local e = t.disable
t.disable, t.done = disable, { }
- disable(t,string.simpleesc(tostring(what)))
+ disable(t,what)
t.disable, t.done = e, { }
end
@@ -3901,68 +5032,94 @@ function setters.list(t) -- pattern
end
function setters.show(t)
- commands.writestatus("","")
+ local category = t.name
local list = setters.list(t)
+ t.report()
for k=1,#list do
- commands.writestatus(t.name,list[k])
+ local name = list[k]
+ local functions = t.data[name]
+ if functions then
+ local value, default, modules = functions.value, functions.default, #functions
+ value = value == nil and "unset" or tostring(value)
+ default = default == nil and "unset" or tostring(default)
+ t.report("%-30s modules: %2i default: %6s value: %6s",name,modules,default,value)
+ end
end
- commands.writestatus("","")
+ t.report()
end
-- we could have used a bit of oo and the trackers:enable syntax but
-- there is already a lot of code around using the singular tracker
--- we could make this into a module
+-- we could make this into a module but we also want the rest avaliable
+
+local enable, disable, register, list, show = setters.enable, setters.disable, setters.register, setters.list, setters.show
+
+local function report(setter,...)
+ local report = logs and logs.report
+ if report then
+ report(setter.name,...)
+ else -- fallback, as this module is loaded before the logger
+ write_nl(format("%-15s : %s\n",setter.name,format(...)))
+ end
+end
function setters.new(name)
- local t
- t = {
- data = { },
+ local setter -- we need to access it in setter itself
+ setter = {
+ data = allocate(), -- indexed, but also default and value fields
name = name,
- enable = function(...) setters.enable (t,...) end,
- disable = function(...) setters.disable (t,...) end,
- register = function(...) setters.register(t,...) end,
- list = function(...) setters.list (t,...) end,
- show = function(...) setters.show (t,...) end,
+ report = function(...) report (setter,...) end,
+ enable = function(...) enable (setter,...) end,
+ disable = function(...) disable (setter,...) end,
+ register = function(...) register(setter,...) end,
+ list = function(...) list (setter,...) end,
+ show = function(...) show (setter,...) end,
}
- setters.data[name] = t
- return t
+ data[name] = setter
+ return setter
end
trackers = setters.new("trackers")
directives = setters.new("directives")
experiments = setters.new("experiments")
+local t_enable, t_disable, t_report = trackers .enable, trackers .disable, trackers .report
+local d_enable, d_disable, d_report = directives .enable, directives .disable, directives .report
+local e_enable, e_disable, e_report = experiments.enable, experiments.disable, experiments.report
+
-- nice trick: we overload two of the directives related functions with variants that
-- do tracing (itself using a tracker) .. proof of concept
local trace_directives = false local trace_directives = false trackers.register("system.directives", function(v) trace_directives = v end)
local trace_experiments = false local trace_experiments = false trackers.register("system.experiments", function(v) trace_experiments = v end)
-local e = directives.enable
-local d = directives.disable
-
function directives.enable(...)
- commands.writestatus("directives","enabling: %s",concat({...}," "))
- e(...)
+ if trace_directives then
+ d_report("enabling: %s",concat({...}," "))
+ end
+ d_enable(...)
end
function directives.disable(...)
- commands.writestatus("directives","disabling: %s",concat({...}," "))
- d(...)
+ if trace_directives then
+ d_report("disabling: %s",concat({...}," "))
+ end
+ d_disable(...)
end
-local e = experiments.enable
-local d = experiments.disable
-
function experiments.enable(...)
- commands.writestatus("experiments","enabling: %s",concat({...}," "))
- e(...)
+ if trace_experiments then
+ e_report("enabling: %s",concat({...}," "))
+ end
+ e_enable(...)
end
function experiments.disable(...)
- commands.writestatus("experiments","disabling: %s",concat({...}," "))
- d(...)
+ if trace_experiments then
+ e_report("disabling: %s",concat({...}," "))
+ end
+ e_disable(...)
end
-- a useful example
@@ -3971,6 +5128,1121 @@ directives.register("system.nostatistics", function(v)
statistics.enable = not v
end)
+directives.register("system.nolibraries", function(v)
+ libraries = nil -- we discard this tracing for security
+end)
+
+-- experiment
+
+local flags = environment and environment.engineflags
+
+if flags then
+ if trackers and flags.trackers then
+ setters.initialize("flags","trackers", settings_to_hash(flags.trackers))
+ -- t_enable(flags.trackers)
+ end
+ if directives and flags.directives then
+ setters.initialize("flags","directives", settings_to_hash(flags.directives))
+ -- d_enable(flags.directives)
+ end
+end
+
+-- here
+
+if texconfig then
+
+ local function set(k,v)
+ v = tonumber(v)
+ if v then
+ texconfig[k] = v
+ end
+ end
+
+ directives.register("luatex.expanddepth", function(v) set("expand_depth",v) end)
+ directives.register("luatex.hashextra", function(v) set("hash_extra",v) end)
+ directives.register("luatex.nestsize", function(v) set("nest_size",v) end)
+ directives.register("luatex.maxinopen", function(v) set("max_in_open",v) end)
+ directives.register("luatex.maxprintline", function(v) set("max_print_line",v) end)
+ directives.register("luatex.maxstrings", function(v) set("max_strings",v) end)
+ directives.register("luatex.paramsize", function(v) set("param_size",v) end)
+ directives.register("luatex.savesize", function(v) set("save_size",v) end)
+ directives.register("luatex.stacksize", function(v) set("stack_size",v) end)
+
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['trac-log'] = {
+ version = 1.001,
+ comment = "companion to trac-log.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- todo: less categories, more subcategories (e.g. nodes)
+
+
+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 escapedpattern = string.escapedpattern
+local texcount = tex and tex.count
+local next, type = next, type
+
+local setmetatableindex = table.setmetatableindex
+
+--[[ldx--
+<p>This is a prelude to a more extensive logging module. We no longer
+provide <l n='xml'/> based logging a sparsing is relatively easy anyway.</p>
+--ldx]]--
+
+logs = logs or { }
+local logs = logs
+
+local moreinfo = [[
+More information about ConTeXt and the tools that come with it can be found at:
+
+maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
+webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
+wiki : http://contextgarden.net
+]]
+
+-- basic loggers
+
+local function ignore() end
+
+setmetatableindex(logs, function(t,k) t[k] = ignore ; return ignore end)
+
+local report, subreport, status, settarget, setformats, settranslations
+
+local direct, subdirect, writer, pushtarget, poptarget
+
+if tex and tex.jobname or tex.formatname then
+
+ local valueiskey = { __index = function(t,k) t[k] = k return k end } -- will be helper
+
+ local target = "term and log"
+
+ logs.flush = io.flush
+
+ local formats = { } setmetatable(formats, valueiskey)
+ local translations = { } setmetatable(translations,valueiskey)
+
+ writer = function(...)
+ write_nl(target,...)
+ end
+
+ report = function(a,b,c,...)
+ if c then
+ write_nl(target,format("%-15s > %s\n",translations[a],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s > %s\n",translations[a],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s >\n", translations[a]))
+ else
+ write_nl(target,"\n")
+ end
+ end
+
+ direct = function(a,b,c,...)
+ if c then
+ return format("%-15s > %s",translations[a],format(formats[b],c,...))
+ elseif b then
+ return format("%-15s > %s",translations[a],formats[b])
+ elseif a then
+ return format("%-15s >", translations[a])
+ else
+ return ""
+ end
+ end
+
+ subreport = function(a,s,b,c,...)
+ if c then
+ write_nl(target,format("%-15s > %s > %s\n",translations[a],translations[s],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s > %s > %s\n",translations[a],translations[s],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s > %s >\n", translations[a],translations[s]))
+ else
+ write_nl(target,"\n")
+ end
+ end
+
+ subdirect = function(a,s,b,c,...)
+ if c then
+ return format("%-15s > %s > %s",translations[a],translations[s],format(formats[b],c,...))
+ elseif b then
+ return format("%-15s > %s > %s",translations[a],translations[s],formats[b])
+ elseif a then
+ return format("%-15s > %s >", translations[a],translations[s])
+ else
+ return ""
+ end
+ end
+
+ status = function(a,b,c,...)
+ if c then
+ write_nl(target,format("%-15s : %s\n",translations[a],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s : %s\n",translations[a],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s :\n", translations[a]))
+ else
+ write_nl(target,"\n")
+ 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
+ if target == "term" or target == "term and log" then
+ logs.flush = io.flush
+ else
+ logs.flush = ignore
+ end
+ end
+
+ local stack = { }
+
+ pushtarget = function(newtarget)
+ insert(stack,target)
+ settarget(newtarget)
+ end
+
+ poptarget = function()
+ if #stack > 0 then
+ settarget(remove(stack))
+ end
+ end
+
+ setformats = function(f)
+ formats = f
+ end
+
+ settranslations = function(t)
+ translations = t
+ end
+
+else
+
+ logs.flush = ignore
+
+ writer = write_nl
+
+ report = function(a,b,c,...)
+ if c then
+ write_nl(format("%-15s | %s",a,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s | %s",a,b))
+ elseif a then
+ write_nl(format("%-15s |", a))
+ else
+ write_nl("")
+ end
+ end
+
+ subreport = function(a,sub,b,c,...)
+ if c then
+ write_nl(format("%-15s | %s | %s",a,sub,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s | %s | %s",a,sub,b))
+ elseif a then
+ write_nl(format("%-15s | %s |", a,sub))
+ else
+ write_nl("")
+ end
+ end
+
+ status = function(a,b,c,...) -- not to be used in lua anyway
+ if c then
+ write_nl(format("%-15s : %s\n",a,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s : %s\n",a,b)) -- b can have %'s
+ elseif a then
+ write_nl(format("%-15s :\n", a))
+ else
+ write_nl("\n")
+ end
+ end
+
+ direct = ignore
+ subdirect = ignore
+
+ settarget = ignore
+ pushtarget = ignore
+ poptarget = ignore
+ setformats = ignore
+ settranslations = ignore
+
+end
+
+logs.report = report
+logs.subreport = subreport
+logs.status = status
+logs.settarget = settarget
+logs.pushtarget = pushtarget
+logs.poptarget = poptarget
+logs.setformats = setformats
+logs.settranslations = settranslations
+
+logs.direct = direct
+logs.subdirect = subdirect
+logs.writer = writer
+
+-- installer
+
+-- todo: renew (un) locks when a new one is added and wildcard
+
+local data, states = { }, nil
+
+function logs.reporter(category,subcategory)
+ local logger = data[category]
+ if not logger then
+ local state = false
+ if states == true then
+ state = true
+ elseif type(states) == "table" then
+ for c, _ in next, states do
+ if find(category,c) then
+ state = true
+ break
+ end
+ end
+ end
+ logger = {
+ reporters = { },
+ state = state,
+ }
+ data[category] = logger
+ end
+ local reporter = logger.reporters[subcategory or "default"]
+ if not reporter then
+ if subcategory then
+ reporter = function(...)
+ if not logger.state then
+ subreport(category,subcategory,...)
+ end
+ end
+ logger.reporters[subcategory] = reporter
+ else
+ local tag = category
+ reporter = function(...)
+ if not logger.state then
+ report(category,...)
+ end
+ end
+ logger.reporters.default = reporter
+ end
+ end
+ return reporter
+end
+
+logs.new = logs.reporter -- for old times sake
+
+-- context specicific: this ends up in the macro stream
+
+local ctxreport = logs.writer
+
+function logs.setmessenger(m)
+ ctxreport = m
+end
+
+function logs.messenger(category,subcategory)
+ -- we need to avoid catcode mess (todo: fast context)
+ if subcategory then
+ return function(...)
+ ctxreport(subdirect(category,subcategory,...))
+ end
+ else
+ return function(...)
+ ctxreport(direct(category,...))
+ end
+ end
+end
+
+-- so far
+
+local function setblocked(category,value)
+ if category == true then
+ -- lock all
+ category, value = "*", true
+ elseif category == false then
+ -- unlock all
+ category, value = "*", false
+ elseif value == nil then
+ -- lock selective
+ value = true
+ end
+ if category == "*" then
+ states = value
+ for k, v in next, data do
+ v.state = value
+ end
+ else
+ states = utilities.parsers.settings_to_hash(category)
+ for c, _ in next, states do
+ if data[c] then
+ v.state = value
+ else
+ c = escapedpattern(c,true)
+ for k, v in next, data do
+ if find(k,c) then
+ v.state = value
+ end
+ end
+ end
+ end
+ end
+end
+
+function logs.disable(category,value)
+ setblocked(category,value == nil and true or value)
+end
+
+function logs.enable(category)
+ setblocked(category,false)
+end
+
+function logs.categories()
+ return table.sortedkeys(data)
+end
+
+function logs.show()
+ local n, c, s, max = 0, 0, 0, 0
+ for category, v in table.sortedpairs(data) do
+ n = n + 1
+ local state = v.state
+ local reporters = v.reporters
+ local nc = #category
+ if nc > c then
+ c = nc
+ end
+ for subcategory, _ in next, reporters do
+ local ns = #subcategory
+ if ns > c then
+ s = ns
+ end
+ local m = nc + ns
+ if m > max then
+ max = m
+ end
+ end
+ local subcategories = concat(table.sortedkeys(reporters),", ")
+ if state == true then
+ state = "disabled"
+ elseif state == false then
+ state = "enabled"
+ else
+ state = "unknown"
+ end
+ -- no new here
+ report("logging","category: '%s', subcategories: '%s', state: '%s'",category,subcategories,state)
+ end
+ report("logging","categories: %s, max category: %s, max subcategory: %s, max combined: %s",n,c,s,max)
+end
+
+directives.register("logs.blocked", function(v)
+ setblocked(v,true)
+end)
+
+directives.register("logs.target", function(v)
+ settarget(v)
+end)
+
+-- tex specific loggers (might move elsewhere)
+
+local report_pages = logs.reporter("pages") -- not needed but saves checking when we grep for it
+
+local real, user, sub
+
+function logs.start_page_number()
+ real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
+end
+
+function logs.stop_page_number()
+ if real > 0 then
+ if user > 0 then
+ if sub > 0 then
+ report_pages("flushing realpage %s, userpage %s, subpage %s",real,user,sub)
+ else
+ report_pages("flushing realpage %s, userpage %s",real,user)
+ end
+ else
+ report_pages("flushing realpage %s",real)
+ end
+ else
+ report_pages("flushing page")
+ end
+ logs.flush()
+end
+
+logs.report_job_stat = statistics and statistics.showjobstat
+
+local report_files = logs.reporter("files")
+
+local nesting = 0
+local verbose = false
+local hasscheme = url.hasscheme
+
+-- we don't have show_open and show_close callbacks yet
+
+function logs.show_open(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- nesting = nesting + 1
+ -- report_files("level %s, opening %s",nesting,name)
+ -- else
+ -- write(format("(%s",name)) -- tex adds a space
+ -- end
+ -- end
+end
+
+function logs.show_close(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- report_files("level %s, closing %s",nesting,name)
+ -- nesting = nesting - 1
+ -- else
+ -- write(")") -- tex adds a space
+ -- end
+ -- end
+end
+
+function logs.show_load(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- report_files("level %s, loading %s",nesting+1,name)
+ -- else
+ -- write(format("(%s)",name))
+ -- end
+ -- end
+end
+
+-- there may be scripts out there using this:
+
+local simple = logs.reporter("comment")
+
+logs.simple = simple
+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
+
+-- applications
+
+local function reportlines(t,str)
+ if str then
+ for line in gmatch(str,"(.-)[\n\r]") do
+ t.report(line)
+ end
+ end
+end
+
+local function reportbanner(t)
+ local banner = t.banner
+ if banner then
+ t.report(banner)
+ t.report()
+ end
+end
+
+local function reporthelp(t,...)
+ local helpinfo = t.helpinfo
+ if type(helpinfo) == "string" then
+ reportlines(t,helpinfo)
+ elseif type(helpinfo) == "table" then
+ local tags = { ... }
+ for i=1,#tags do
+ reportlines(t,t.helpinfo[tags[i]])
+ if i < #tags then
+ t.report()
+ end
+ end
+ end
+end
+
+local function reportinfo(t)
+ t.report()
+ reportlines(t,moreinfo)
+end
+
+function logs.application(t)
+ t.name = t.name or "unknown"
+ t.banner = t.banner
+ t.report = logs.reporter(t.name)
+ t.help = function(...) reportbanner(t) ; reporthelp(t,...) ; reportinfo(t) end
+ t.identify = function() reportbanner(t) end
+ return t
+end
+
+-- somewhat special
+
+-- logging to a file
+
+
+function logs.system(whereto,process,jobname,category,...)
+ local message = format("%s %s => %s => %s => %s\r",os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...))
+ for i=1,10 do
+ local f = io.open(whereto,"a") -- we can consider keepint the file open
+ if f then
+ f:write(message)
+ f:close()
+ break
+ else
+ sleep(0.1)
+ end
+ end
+end
+
+local report_system = logs.reporter("system","logs")
+
+function logs.obsolete(old,new)
+ local o = loadstring("return " .. new)()
+ if type(o) == "function" then
+ return function(...)
+ report_system("function %s is obsolete, use %s",old,new)
+ loadstring(old .. "=" .. new .. " return ".. old)()(...)
+ end
+ elseif type(o) == "table" then
+ local t, m = { }, { }
+ m.__index = function(t,k)
+ report_system("table %s is obsolete, use %s",old,new)
+ m.__index, m.__newindex = o, o
+ return o[k]
+ end
+ m.__newindex = function(t,k,v)
+ report_system("table %s is obsolete, use %s",old,new)
+ m.__index, m.__newindex = o, o
+ o[k] = v
+ end
+ if libraries then
+ libraries.obsolete[old] = t -- true
+ end
+ setmetatable(t,m)
+ return t
+ end
+end
+
+if utilities then
+ utilities.report = report_system
+end
+
+if tex and tex.error then
+ function logs.texerrormessage(...) -- for the moment we put this function here
+ tex.error(format(...), { })
+ end
+else
+ function logs.texerrormessage(...)
+ print(format(...))
+ end
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['trac-pro'] = {
+ 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 getmetatable, setmetatable, rawset, type = getmetatable, setmetatable, rawset, type
+
+-- The protection implemented here is probably not that tight but good enough to catch
+-- problems due to naive usage.
+--
+-- There's a more extensive version (trac-xxx.lua) that supports nesting.
+--
+-- This will change when we have _ENV in lua 5.2+
+
+local trace_namespaces = false trackers.register("system.namespaces", function(v) trace_namespaces = v end)
+
+local report_system = logs.reporter("system","protection")
+
+namespaces = namespaces or { }
+local namespaces = namespaces
+
+local registered = { }
+
+local function report_index(k,name)
+ if trace_namespaces then
+ report_system("reference to '%s' in protected namespace '%s', %s",k,name,debug.traceback())
+ else
+ report_system("reference to '%s' in protected namespace '%s'",k,name)
+ end
+end
+
+local function report_newindex(k,name)
+ if trace_namespaces then
+ report_system("assignment to '%s' in protected namespace '%s', %s",k,name,debug.traceback())
+ else
+ report_system("assignment to '%s' in protected namespace '%s'",k,name)
+ end
+end
+
+local function register(name)
+ local data = name == "global" and _G or _G[name]
+ if not data then
+ return -- error
+ end
+ registered[name] = data
+ local m = getmetatable(data)
+ if not m then
+ m = { }
+ setmetatable(data,m)
+ end
+ local index, newindex = { }, { }
+ m.__saved__index = m.__index
+ m.__no__index = function(t,k)
+ if not index[k] then
+ index[k] = true
+ report_index(k,name)
+ end
+ return nil
+ end
+ m.__saved__newindex = m.__newindex
+ m.__no__newindex = function(t,k,v)
+ if not newindex[k] then
+ newindex[k] = true
+ report_newindex(k,name)
+ end
+ rawset(t,k,v)
+ end
+ m.__protection__depth = 0
+end
+
+local function private(name) -- maybe save name
+ local data = registered[name]
+ if not data then
+ data = _G[name]
+ if not data then
+ data = { }
+ _G[name] = data
+ end
+ register(name)
+ end
+ return data
+end
+
+local function protect(name)
+ local data = registered[name]
+ if not data then
+ return
+ end
+ local m = getmetatable(data)
+ local pd = m.__protection__depth
+ if pd > 0 then
+ m.__protection__depth = pd + 1
+ else
+ m.__save_d_index, m.__saved__newindex = m.__index, m.__newindex
+ m.__index, m.__newindex = m.__no__index, m.__no__newindex
+ m.__protection__depth = 1
+ end
+end
+
+local function unprotect(name)
+ local data = registered[name]
+ if not data then
+ return
+ end
+ local m = getmetatable(data)
+ local pd = m.__protection__depth
+ if pd > 1 then
+ m.__protection__depth = pd - 1
+ else
+ m.__index, m.__newindex = m.__saved__index, m.__saved__newindex
+ m.__protection__depth = 0
+ end
+end
+
+local function protectall()
+ for name, _ in next, registered do
+ if name ~= "global" then
+ protect(name)
+ end
+ end
+end
+
+local function unprotectall()
+ for name, _ in next, registered do
+ if name ~= "global" then
+ unprotect(name)
+ end
+ end
+end
+
+namespaces.register = register -- register when defined
+namespaces.private = private -- allocate and register if needed
+namespaces.protect = protect
+namespaces.unprotect = unprotect
+namespaces.protectall = protectall
+namespaces.unprotectall = unprotectall
+
+namespaces.private("namespaces") registered = { } register("global") -- unreachable
+
+directives.register("system.protect", function(v)
+ if v then
+ protectall()
+ else
+ unprotectall()
+ end
+end)
+
+directives.register("system.checkglobals", function(v)
+ if v then
+ report_system("enabling global namespace guard")
+ protect("global")
+ else
+ report_system("disabling global namespace guard")
+ unprotect("global")
+ end
+end)
+
+-- dummy section (will go to luat-dum.lua)
+
+
+
+
+
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['luat-env'] = {
+ 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"
+}
+
+-- A former version provided functionality for non embeded core
+-- scripts i.e. runtime library loading. Given the amount of
+-- Lua code we use now, this no longer makes sense. Much of this
+-- evolved before bytecode arrays were available and so a lot of
+-- code has disappeared already.
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_lua = logs.reporter("resolvers","lua")
+
+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 concat = table.concat
+
+-- precautions
+
+os.setlocale(nil,nil) -- useless feature and even dangerous in luatex
+
+function os.setlocale()
+ -- no way you can mess with it
+end
+
+-- dirty tricks
+
+if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
+ arg[-1] = arg[0]
+ arg[ 0] = arg[2]
+ for k=3,#arg do
+ arg[k-2] = arg[k]
+ end
+ arg[#arg] = nil -- last
+ arg[#arg] = nil -- pre-last
+end
+
+-- environment
+
+environment = environment or { }
+local environment = environment
+
+environment.arguments = allocate()
+environment.files = allocate()
+environment.sortedflags = nil
+
+local mt = {
+ __index = function(_,k)
+ if k == "version" then
+ local version = tex.toks and tex.toks.contextversiontoks
+ if version and version ~= "" then
+ rawset(environment,"version",version)
+ return version
+ else
+ return "unknown"
+ end
+ elseif k == "jobname" or k == "formatname" then
+ local name = tex and tex[k]
+ if name or name== "" then
+ rawset(environment,k,name)
+ return name
+ else
+ return "unknown"
+ end
+ elseif k == "outputfilename" then
+ local name = environment.jobname
+ rawset(environment,k,name)
+ return name
+ end
+ end
+}
+
+setmetatable(environment,mt)
+
+function environment.initializearguments(arg)
+ local arguments, files = { }, { }
+ environment.arguments, environment.files, environment.sortedflags = arguments, files, nil
+ for index=1,#arg do
+ local argument = arg[index]
+ if index > 0 then
+ local flag, value = match(argument,"^%-+(.-)=(.-)$")
+ if flag then
+ arguments[flag] = unquoted(value or "")
+ else
+ flag = match(argument,"^%-+(.+)")
+ if flag then
+ arguments[flag] = true
+ else
+ files[#files+1] = argument
+ end
+ end
+ end
+ end
+ environment.ownname = environment.ownname or arg[0] or 'unknown.lua'
+end
+
+function environment.setargument(name,value)
+ environment.arguments[name] = value
+end
+
+-- todo: defaults, better checks e.g on type (boolean versus string)
+--
+-- tricky: too many hits when we support partials unless we add
+-- a registration of arguments so from now on we have 'partial'
+
+function environment.argument(name,partial)
+ local arguments, sortedflags = environment.arguments, environment.sortedflags
+ if arguments[name] then
+ return arguments[name]
+ elseif partial then
+ if not sortedflags then
+ sortedflags = allocate(table.sortedkeys(arguments))
+ for k=1,#sortedflags do
+ sortedflags[k] = "^" .. sortedflags[k]
+ end
+ environment.sortedflags = sortedflags
+ end
+ -- example of potential clash: ^mode ^modefile
+ for k=1,#sortedflags do
+ local v = sortedflags[k]
+ if find(name,v) then
+ return arguments[sub(v,2,#v)]
+ end
+ end
+ end
+ return nil
+end
+
+function environment.splitarguments(separator) -- rather special, cut-off before separator
+ local done, before, after = false, { }, { }
+ local originalarguments = environment.originalarguments
+ for k=1,#originalarguments do
+ local v = originalarguments[k]
+ if not done and v == separator then
+ done = true
+ elseif done then
+ after[#after+1] = v
+ else
+ before[#before+1] = v
+ end
+ end
+ return before, after
+end
+
+function environment.reconstructcommandline(arg,noquote)
+ 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
+ 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," ") then
+ result[#result+1] = quoted(a)
+ else
+ result[#result+1] = a
+ end
+ 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
+ local argument = arg[index]
+ if find(argument,"^\"") then
+ newarg[#newarg+1] = gsub(argument,"^\"","")
+ if not find(argument,"\"$") then
+ instring = true
+ end
+ elseif find(argument,"\"$") then
+ newarg[#newarg] = newarg[#newarg] .. " " .. gsub(argument,"\"$","")
+ instring = false
+ elseif instring then
+ newarg[#newarg] = newarg[#newarg] .. " " .. argument
+ else
+ newarg[#newarg+1] = argument
+ end
+ end
+ for i=1,-5,-1 do
+ newarg[i] = arg[i]
+ end
+
+ environment.initializearguments(newarg)
+
+ environment.originalarguments = mark(newarg)
+ environment.rawarguments = mark(arg)
+
+ arg = { } -- prevent duplicate handling
+
+end
+
+-- weird place ... depends on a not yet loaded module
+
+function environment.texfile(filename)
+ return resolvers.findfile(filename,'tex')
+end
+
+function environment.luafile(filename)
+ local resolved = resolvers.findfile(filename,'tex') or ""
+ if resolved ~= "" then
+ return resolved
+ end
+ resolved = resolvers.findfile(filename,'texmfscripts') or ""
+ if resolved ~= "" then
+ return resolved
+ end
+ return resolvers.findfile(filename,'luatexlibs') or ""
+end
+
+environment.loadedluacode = loadfile -- can be overloaded
+
+function environment.luafilechunk(filename,silent) -- used for loading lua bytecode in the format
+ filename = file.replacesuffix(filename, "lua")
+ local fullname = environment.luafile(filename)
+ if fullname and fullname ~= "" then
+ local data = environment.loadedluacode(fullname)
+ if trace_locating then
+ report_lua("loading file %s%s", fullname, not data and " failed" or "")
+ elseif not silent then
+ texio.write("<",data and "+ " or "- ",fullname,">")
+ end
+ return data
+ else
+ if trace_locating then
+ report_lua("unknown file %s", filename)
+ end
+ return nil
+ end
+end
+
+-- the next ones can use the previous ones / combine
+
+function environment.loadluafile(filename, version)
+ local lucname, luaname, chunk
+ local basename = file.removesuffix(filename)
+ if basename == filename then
+ lucname, luaname = basename .. ".luc", basename .. ".lua"
+ else
+ lucname, luaname = nil, basename -- forced suffix
+ end
+ -- when not overloaded by explicit suffix we look for a luc file first
+ local fullname = (lucname and environment.luafile(lucname)) or ""
+ if fullname ~= "" then
+ if trace_locating then
+ report_lua("loading %s", fullname)
+ end
+ chunk = loadfile(fullname) -- this way we don't need a file exists check
+ end
+ if chunk then
+ assert(chunk)()
+ if version then
+ -- we check of the version number of this chunk matches
+ local v = version -- can be nil
+ if modules and modules[filename] then
+ v = modules[filename].version -- new method
+ elseif versions and versions[filename] then
+ v = versions[filename] -- old method
+ end
+ if v == version then
+ return true
+ else
+ if trace_locating then
+ report_lua("version mismatch for %s: lua=%s, luc=%s", filename, v, version)
+ end
+ environment.loadluafile(filename)
+ end
+ else
+ return true
+ end
+ end
+ fullname = (luaname and environment.luafile(luaname)) or ""
+ if fullname ~= "" then
+ if trace_locating then
+ report_lua("loading %s", fullname)
+ end
+ chunk = loadfile(fullname) -- this way we don't need a file exists check
+ if not chunk then
+ if trace_locating then
+ report_lua("unknown file %s", filename)
+ end
+ else
+ assert(chunk)()
+ return true
+ end
+ end
+ return false
+end
end -- of closure
@@ -3991,6 +6263,8 @@ if not modules then modules = { } end modules ['lxml-tab'] = {
local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end)
+local report_xml = logs and logs.reporter("xml","core") or function(...) print(format(...)) end
+
--[[ldx--
<p>The parser used here is inspired by the variant discussed in the lua book, but
handles comment and processing instructions, has a different structure, provides
@@ -4001,11 +6275,15 @@ The find based parser can be found in l-xml-edu.lua along with other older code.
<p>Beware, the interface may change. For instance at, ns, tg, dt may get more
verbose names. Once the code is stable we will also remove some tracing and
optimize the code.</p>
+
+<p>I might even decide to reimplement the parser using the latest <l n='lpeg'/> trickery
+as the current variant was written when <l n='lpeg'/> showed up and it's easier now to
+build tables in one go.</p>
--ldx]]--
xml = xml or { }
+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
@@ -4129,7 +6407,7 @@ local dcache, hcache, acache = { }, { }, { }
local mt = { }
-function initialize_mt(root)
+local function initialize_mt(root)
mt = { __index = root } -- will be redefined later
end
@@ -4137,8 +6415,8 @@ function xml.setproperty(root,k,v)
getmetatable(root).__index[k] = v
end
-function xml.check_error(top,toclose)
- return ""
+function xml.checkerror(top,toclose)
+ return "" -- can be set
end
local function add_attribute(namespace,tag,value)
@@ -4194,9 +6472,9 @@ local function add_end(spacing, namespace, tag)
local toclose = remove(stack)
top = stack[#stack]
if #stack < 1 then
- errorstr = format("nothing to close with %s %s", tag, xml.check_error(top,toclose) or "")
+ errorstr = format("nothing to close with %s %s", tag, xml.checkerror(top,toclose) or "")
elseif toclose.tg ~= tag then -- no namespace check
- errorstr = format("unable to close %s with %s %s", toclose.tg, tag, xml.check_error(top,toclose) or "")
+ errorstr = format("unable to close %s with %s %s", toclose.tg, tag, xml.checkerror(top,toclose) or "")
end
dt = top.dt
dt[#dt+1] = toclose
@@ -4233,24 +6511,29 @@ local reported_attribute_errors = { }
local function attribute_value_error(str)
if not reported_attribute_errors[str] then
- logs.report("xml","invalid attribute value: %q",str)
+ report_xml("invalid attribute value: %q",str)
reported_attribute_errors[str] = true
at._error_ = str
end
return str
end
+
local function attribute_specification_error(str)
if not reported_attribute_errors[str] then
- logs.report("xml","invalid attribute specification: %q",str)
+ report_xml("invalid attribute specification: %q",str)
reported_attribute_errors[str] = true
at._error_ = str
end
return str
end
-function xml.unknown_dec_entity_format(str) return (str == "" and "&error;") or format("&%s;",str) end
-function xml.unknown_hex_entity_format(str) return format("&#x%s;",str) end
-function xml.unknown_any_entity_format(str) return format("&#x%s;",str) end
+xml.placeholders = {
+ unknown_dec_entity = function(str) return (str == "" and "&error;") or format("&%s;",str) end,
+ unknown_hex_entity = function(str) return format("&#x%s;",str) end,
+ unknown_any_entity = function(str) return format("&#x%s;",str) end,
+}
+
+local placeholders = xml.placeholders
local function fromhex(s)
local n = tonumber(s,16)
@@ -4304,18 +6587,18 @@ local function handle_hex_entity(str)
h = unify_predefined and predefined_unified[n]
if h then
if trace_entities then
- logs.report("xml","utfize, converting hex entity &#x%s; into %s",str,h)
+ report_xml("utfize, converting hex entity &#x%s; into %s",str,h)
end
elseif utfize then
- h = (n and utfchar(n)) or xml.unknown_hex_entity_format(str) or ""
+ h = (n and utfchar(n)) or xml.unknown_hex_entity(str) or ""
if not n then
- logs.report("xml","utfize, ignoring hex entity &#x%s;",str)
+ report_xml("utfize, ignoring hex entity &#x%s;",str)
elseif trace_entities then
- logs.report("xml","utfize, converting hex entity &#x%s; into %s",str,h)
+ report_xml("utfize, converting hex entity &#x%s; into %s",str,h)
end
else
if trace_entities then
- logs.report("xml","found entity &#x%s;",str)
+ report_xml("found entity &#x%s;",str)
end
h = "&#x" .. str .. ";"
end
@@ -4331,18 +6614,18 @@ local function handle_dec_entity(str)
d = unify_predefined and predefined_unified[n]
if d then
if trace_entities then
- logs.report("xml","utfize, converting dec entity &#%s; into %s",str,d)
+ report_xml("utfize, converting dec entity &#%s; into %s",str,d)
end
elseif utfize then
- d = (n and utfchar(n)) or xml.unknown_dec_entity_format(str) or ""
+ d = (n and utfchar(n)) or placeholders.unknown_dec_entity(str) or ""
if not n then
- logs.report("xml","utfize, ignoring dec entity &#%s;",str)
+ report_xml("utfize, ignoring dec entity &#%s;",str)
elseif trace_entities then
- logs.report("xml","utfize, converting dec entity &#%s; into %s",str,h)
+ report_xml("utfize, converting dec entity &#%s; into %s",str,h)
end
else
if trace_entities then
- logs.report("xml","found entity &#%s;",str)
+ report_xml("found entity &#%s;",str)
end
d = "&#" .. str .. ";"
end
@@ -4367,20 +6650,21 @@ local function handle_any_entity(str)
end
if a then
if trace_entities then
- logs.report("xml","resolved entity &%s; -> %s (internal)",str,a)
+ report_xml("resolved entity &%s; -> %s (internal)",str,a)
end
a = lpegmatch(parsedentity,a) or a
else
- if xml.unknown_any_entity_format then
- a = xml.unknown_any_entity_format(str) or ""
+ local unknown_any_entity = placeholders.unknown_any_entity
+ if unknown_any_entity then
+ a = unknown_any_entity(str) or ""
end
if a then
if trace_entities then
- logs.report("xml","resolved entity &%s; -> %s (external)",str,a)
+ report_xml("resolved entity &%s; -> %s (external)",str,a)
end
else
if trace_entities then
- logs.report("xml","keeping entity &%s;",str)
+ report_xml("keeping entity &%s;",str)
end
if str == "" then
a = "&error;"
@@ -4392,7 +6676,7 @@ local function handle_any_entity(str)
acache[str] = a
elseif trace_entities then
if not acache[str] then
- logs.report("xml","converting entity &%s; into %s",str,a)
+ report_xml("converting entity &%s; into %s",str,a)
acache[str] = a
end
end
@@ -4401,7 +6685,7 @@ local function handle_any_entity(str)
local a = acache[str]
if not a then
if trace_entities then
- logs.report("xml","found entity &%s;",str)
+ report_xml("found entity &%s;",str)
end
a = resolve_predefined and predefined_simplified[str]
if a then
@@ -4420,7 +6704,7 @@ local function handle_any_entity(str)
end
local function handle_end_entity(chr)
- logs.report("xml","error in entity, %q found instead of ';'",chr)
+ report_xml("error in entity, %q found instead of ';'",chr)
end
local space = S(' \r\n\t')
@@ -4555,7 +6839,7 @@ local function xmlconvert(data, settings)
resolve_predefined = settings.resolve_predefined_entities -- in case we have escaped entities
unify_predefined = settings.unify_predefined_entities -- &#038; -> &amp;
cleanup = settings.text_cleanup
- stack, top, at, xmlns, errorstr, result, entities = { }, { }, { }, { }, nil, nil, settings.entities or { }
+ stack, top, at, xmlns, errorstr, entities = { }, { }, { }, { }, nil, settings.entities or { }
acache, hcache, dcache = { }, { }, { } -- not stored
reported_attribute_errors = { }
if settings.parent_root then
@@ -4583,16 +6867,17 @@ local function xmlconvert(data, settings)
else
errorstr = "invalid xml file - no text at all"
end
+ local result
if errorstr and errorstr ~= "" then
result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={ }, er = true } } }
setmetatable(stack, mt)
- local error_handler = settings.error_handler
- if error_handler == false then
+ local errorhandler = settings.error_handler
+ if errorhandler == false then
-- no error message
else
- error_handler = error_handler or xml.error_handler
- if error_handler then
- xml.error_handler("load",errorstr)
+ errorhandler = errorhandler or xml.errorhandler
+ if errorhandler then
+ xml.errorhandler("load",errorstr)
end
end
else
@@ -4652,7 +6937,7 @@ function xml.is_valid(root)
return root and not root.error
end
-xml.error_handler = (logs and logs.report) or (input and logs.report) or print
+xml.errorhandler = report
--[[ldx--
<p>We cannot load an <l n='lpeg'/> from a filehandle so we need to load
@@ -4763,7 +7048,7 @@ local function verbose_element(e,handlers)
ats[#ats+1] = format('%s=%q',k,v)
end
end
- if ern and trace_remap and ern ~= ens then
+ if ern and trace_entities and ern ~= ens then
ens = ern
end
if ens ~= "" then
@@ -4868,7 +7153,7 @@ local function serialize(e,handlers,...)
-- elseif type(e) == "string" then
-- functions["@tx@"](e,handlers)
else
- functions["@dc@"](e,handlers)
+ functions["@dc@"](e,handlers) -- dc ?
end
if finalize then
return finalize()
@@ -4894,7 +7179,7 @@ local function newhandlers(settings)
if settings then
for k,v in next, settings do
if type(v) == "table" then
- tk = t[k] if not tk then tk = { } t[k] = tk end
+ local tk = t[k] if not tk then tk = { } t[k] = tk end
for kk,vv in next, v do
tk[kk] = vv
end
@@ -4906,6 +7191,7 @@ local function newhandlers(settings)
handlers[settings.name] = t
end
end
+ utilities.storage.mark(t)
return t
end
@@ -5005,7 +7291,7 @@ local function xmltext(root) -- inline
return (root and xmltostring(root)) or ""
end
-function initialize_mt(root)
+initialize_mt = function(root) -- redefinition
mt = { __tostring = xmltext, __index = root }
end
@@ -5040,7 +7326,6 @@ xml.string = xmlstring
<p>A few helpers:</p>
--ldx]]--
---~ xmlsetproperty(root,"settings",settings)
function xml.settings(e)
while e do
@@ -5150,6 +7435,7 @@ function xml.makestandalone(root)
end
end
end
+ return root
end
@@ -5166,11 +7452,14 @@ if not modules then modules = { } end modules ['lxml-pth'] = {
}
-- e.ni is only valid after a filter run
+-- todo: B/C/[get first match]
local concat, remove, insert = table.concat, table.remove, table.insert
local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring
local format, upper, lower, gmatch, gsub, find, rep = string.format, string.upper, string.lower, string.gmatch, string.gsub, string.find, string.rep
-local lpegmatch = lpeg.match
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+
+local setmetatableindex = table.setmetatableindex
-- beware, this is not xpath ... e.g. position is different (currently) and
-- we have reverse-sibling as reversed preceding sibling
@@ -5202,23 +7491,33 @@ local trace_lpath = false if trackers then trackers.register("xml.path",
local trace_lparse = false if trackers then trackers.register("xml.parse", function(v) trace_lparse = v end) end
local trace_lprofile = false if trackers then trackers.register("xml.profile", function(v) trace_lpath = v trace_lparse = v trace_lprofile = v end) end
+local report_lpath = logs.reporter("xml","lpath")
+
--[[ldx--
<p>We've now arrived at an interesting part: accessing the tree using a subset
of <l n='xpath'/> and since we're not compatible we call it <l n='lpath'/>. We
will explain more about its usage in other documents.</p>
--ldx]]--
+local xml = xml
+
local lpathcalls = 0 function xml.lpathcalls () return lpathcalls end
local lpathcached = 0 function xml.lpathcached() return lpathcached end
-xml.functions = xml.functions or { } -- internal
-xml.expressions = xml.expressions or { } -- in expressions
-xml.finalizers = xml.finalizers or { } -- fast do-with ... (with return value other than collection)
-xml.specialhandler = xml.specialhandler or { }
+xml.functions = xml.functions or { } -- internal
+local functions = xml.functions
+
+xml.expressions = xml.expressions or { } -- in expressions
+local expressions = xml.expressions
+
+xml.finalizers = xml.finalizers or { } -- fast do-with ... (with return value other than collection)
+local finalizers = xml.finalizers
-local functions = xml.functions
-local expressions = xml.expressions
-local finalizers = xml.finalizers
+xml.specialhandler = xml.specialhandler or { }
+local specialhandler = xml.specialhandler
+
+lpegpatterns.xml = lpegpatterns.xml or { }
+local xmlpatterns = lpegpatterns.xml
finalizers.xml = finalizers.xml or { }
finalizers.tex = finalizers.tex or { }
@@ -5228,14 +7527,14 @@ local function fallback (t, name)
if fn then
t[name] = fn
else
- logs.report("xml","unknown sub finalizer '%s'",tostring(name))
+ report_lpath("unknown sub finalizer '%s'",tostring(name))
fn = function() end
end
return fn
end
-setmetatable(finalizers.xml, { __index = fallback })
-setmetatable(finalizers.tex, { __index = fallback })
+setmetatableindex(finalizers.xml, fallback)
+setmetatableindex(finalizers.tex, fallback)
xml.defaultprotocol = "xml"
@@ -5283,102 +7582,106 @@ apply_axis['root'] = function(list)
rt = ll
end
end
- collected[#collected+1] = rt
+ collected[l] = rt
end
return collected
end
apply_axis['self'] = function(list)
---~ local collected = { }
---~ for l=1,#list do
---~ collected[#collected+1] = list[l]
---~ end
---~ return collected
return list
end
apply_axis['child'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local dt = ll.dt
- local en = 0
- for k=1,#dt do
- local dk = dt[k]
- if dk.tg then
- collected[#collected+1] = dk
- dk.ni = k -- refresh
- en = en + 1
- dk.ei = en
+ if dt then -- weird that this is needed
+ local en = 0
+ for k=1,#dt do
+ local dk = dt[k]
+ if dk.tg then
+ c = c + 1
+ collected[c] = dk
+ dk.ni = k -- refresh
+ en = en + 1
+ dk.ei = en
+ end
end
+ ll.en = en
end
- ll.en = en
end
return collected
end
-local function collect(list,collected)
+local function collect(list,collected,c)
local dt = list.dt
if dt then
local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
- collected[#collected+1] = dk
+ c = c + 1
+ collected[c] = dk
dk.ni = k -- refresh
en = en + 1
dk.ei = en
- collect(dk,collected)
+ c = collect(dk,collected,c)
end
end
list.en = en
end
+ return c
end
apply_axis['descendant'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
- collect(list[l],collected)
+ c = collect(list[l],collected,c)
end
return collected
end
-local function collect(list,collected)
+local function collect(list,collected,c)
local dt = list.dt
if dt then
local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
- collected[#collected+1] = dk
+ c = c + 1
+ collected[c] = dk
dk.ni = k -- refresh
en = en + 1
dk.ei = en
- collect(dk,collected)
+ c = collect(dk,collected,c)
end
end
list.en = en
end
+ return c
end
apply_axis['descendant-or-self'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
if ll.special ~= true then -- catch double root
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
- collect(ll,collected)
+ c = collect(ll,collected,c)
end
return collected
end
apply_axis['ancestor'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
while ll do
ll = ll.__p__
if ll then
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
end
end
@@ -5386,14 +7689,16 @@ apply_axis['ancestor'] = function(list)
end
apply_axis['ancestor-or-self'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
while ll do
ll = ll.__p__
if ll then
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
end
end
@@ -5401,11 +7706,12 @@ apply_axis['ancestor-or-self'] = function(list)
end
apply_axis['parent'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local pl = list[l].__p__
if pl then
- collected[#collected+1] = pl
+ c = c + 1
+ collected[c] = pl
end
end
return collected
@@ -5420,43 +7726,15 @@ apply_axis['namespace'] = function(list)
end
apply_axis['following'] = function(list) -- incomplete
---~ local collected = { }
---~ for l=1,#list do
---~ local ll = list[l]
---~ local p = ll.__p__
---~ local d = p.dt
---~ for i=ll.ni+1,#d do
---~ local di = d[i]
---~ if type(di) == "table" then
---~ collected[#collected+1] = di
---~ break
---~ end
---~ end
---~ end
---~ return collected
return { }
end
apply_axis['preceding'] = function(list) -- incomplete
---~ local collected = { }
---~ for l=1,#list do
---~ local ll = list[l]
---~ local p = ll.__p__
---~ local d = p.dt
---~ for i=ll.ni-1,1,-1 do
---~ local di = d[i]
---~ if type(di) == "table" then
---~ collected[#collected+1] = di
---~ break
---~ end
---~ end
---~ end
---~ return collected
return { }
end
apply_axis['following-sibling'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -5464,7 +7742,8 @@ apply_axis['following-sibling'] = function(list)
for i=ll.ni+1,#d do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -5472,7 +7751,7 @@ apply_axis['following-sibling'] = function(list)
end
apply_axis['preceding-sibling'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -5480,7 +7759,8 @@ apply_axis['preceding-sibling'] = function(list)
for i=1,ll.ni-1 do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -5488,7 +7768,7 @@ apply_axis['preceding-sibling'] = function(list)
end
apply_axis['reverse-sibling'] = function(list) -- reverse preceding
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -5496,7 +7776,8 @@ apply_axis['reverse-sibling'] = function(list) -- reverse preceding
for i=ll.ni-1,1,-1 do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -5522,7 +7803,7 @@ local function apply_nodes(list,directive,nodes)
return { }
end
else
- local collected, m, p = { }, 0, nil
+ local collected, c, m, p = { }, 0, 0, nil
if not nns then -- only check tag
for l=1,#list do
local ll = list[l]
@@ -5531,11 +7812,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ntg == ltg then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif ntg ~= ltg then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5547,11 +7830,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if lns == nns then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif lns ~= nns then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5565,11 +7850,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif not ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5577,7 +7864,7 @@ local function apply_nodes(list,directive,nodes)
return collected
end
else
- local collected, m, p = { }, 0, nil
+ local collected, c, m, p = { }, 0, 0, nil
for l=1,#list do
local ll = list[l]
local ltg = ll.tg
@@ -5594,11 +7881,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif not ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5609,12 +7898,13 @@ end
local quit_expression = false
local function apply_expression(list,expression,order)
- local collected = { }
+ local collected, c = { }, 0
quit_expression = false
for l=1,#list do
local ll = list[l]
if expression(list,ll,l,order) then -- nasty, order alleen valid als n=1
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
if quit_expression then
break
@@ -5653,7 +7943,9 @@ local lp_builtin = P (
P("ns") / "ll.ns"
) * ((spaces * P("(") * spaces * P(")"))/"")
-local lp_attribute = (P("@") + P("attribute::")) / "" * Cc("(ll.at and ll.at['") * R("az","AZ","--","__")^1 * Cc("'])")
+-- for the moment we keep namespaces with attributes
+
+local lp_attribute = (P("@") + P("attribute::")) / "" * Cc("(ll.at and ll.at['") * ((R("az","AZ") + S("-_:"))^1) * Cc("'])")
local lp_fastpos_p = ((P("+")^0 * R("09")^1 * P(-1)) / function(s) return "l==" .. s end)
local lp_fastpos_n = ((P("-") * R("09")^1 * P(-1)) / function(s) return "(" .. s .. "<0 and (#list+".. s .. "==l))" end)
local lp_fastpos = lp_fastpos_n + lp_fastpos_p
@@ -5714,14 +8006,12 @@ local converter = Cs (
)
cleaner = Cs ( (
---~ lp_fastpos +
lp_reserved +
lp_number +
lp_string +
1 )^1 )
---~ expr
local template_e = [[
local expr = xml.expressions
@@ -5772,13 +8062,13 @@ local skip = { }
local function errorrunner_e(str,cnv)
if not skip[str] then
- logs.report("lpath","error in expression: %s => %s",str,cnv)
+ report_lpath("error in expression: %s => %s",str,cnv)
skip[str] = cnv or str
end
return false
end
local function errorrunner_f(str,arg)
- logs.report("lpath","error in finalizer: %s(%s)",str,arg or "")
+ report_lpath("error in finalizer: %s(%s)",str,arg or "")
return false
end
@@ -5829,7 +8119,7 @@ local special_1 = P("*") * Cc(register_auto_descendant) * Cc(register_all_nodes
local special_2 = P("/") * Cc(register_auto_self)
local special_3 = P("") * Cc(register_auto_self)
-local parser = Ct { "patterns", -- can be made a bit faster by moving pattern outside
+local pathparser = Ct { "patterns", -- can be made a bit faster by moving pattern outside
patterns = spaces * V("protocol") * spaces * (
( V("special") * spaces * P(-1) ) +
@@ -5901,6 +8191,8 @@ local parser = Ct { "patterns", -- can be made a bit faster by moving pattern ou
}
+xmlpatterns.pathparser = pathparser
+
local cache = { }
local function nodesettostring(set,nodetest)
@@ -5910,7 +8202,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[#t+1] = (directive and tg) or format("not(%s)",tg)
+ t[i] = (directive and tg) or format("not(%s)",tg)
end
if nodetest == false then
return format("not(%s)",concat(t,"|"))
@@ -5929,7 +8221,7 @@ local function tagstostring(list)
local ns, tg = li.ns, li.tg
if not ns or ns == "" then ns = "*" end
if not tg or tg == "" then tg = "*" end
- t[#t+1] = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg)
+ t[i] = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg)
end
return concat(t," ")
end
@@ -5937,16 +8229,16 @@ end
xml.nodesettostring = nodesettostring
-local parse_pattern -- we have a harmless kind of circular reference
+local lpath -- we have a harmless kind of circular reference
+
+local lshowoptions = { functions = false }
local function lshow(parsed)
if type(parsed) == "string" then
- parsed = parse_pattern(parsed)
+ parsed = lpath(parsed)
end
- local s = table.serialize_functions -- ugly
- table.serialize_functions = false -- ugly
- logs.report("lpath","%s://%s => %s",parsed.protocol or xml.defaultprotocol,parsed.pattern,table.serialize(parsed,false))
- table.serialize_functions = s -- ugly
+ report_lpath("%s://%s => %s",parsed.protocol or xml.defaultprotocol,parsed.pattern,
+ table.serialize(parsed,false,lshowoptions))
end
xml.lshow = lshow
@@ -5960,7 +8252,7 @@ local function add_comment(p,str)
end
end
-parse_pattern = function (pattern) -- the gain of caching is rather minimal
+lpath = function (pattern) -- the gain of caching is rather minimal
lpathcalls = lpathcalls + 1
if type(pattern) == "table" then
return pattern
@@ -5969,13 +8261,13 @@ parse_pattern = function (pattern) -- the gain of caching is rather minimal
if parsed then
lpathcached = lpathcached + 1
else
- parsed = lpegmatch(parser,pattern)
+ parsed = lpegmatch(pathparser,pattern)
if parsed then
parsed.pattern = pattern
local np = #parsed
if np == 0 then
parsed = { pattern = pattern, register_self, state = "parsing error" }
- logs.report("lpath","parsing error in '%s'",pattern)
+ report_lpath("parsing error in '%s'",pattern)
lshow(parsed)
else
-- we could have done this with a more complex parser but this
@@ -6017,6 +8309,8 @@ parse_pattern = function (pattern) -- the gain of caching is rather minimal
end
end
+xml.lpath = lpath
+
-- we can move all calls inline and then merge the trace back
-- technically we can combine axis and the next nodes which is
-- what we did before but this a bit cleaner (but slower too)
@@ -6079,32 +8373,32 @@ local function traced_apply(list,parsed,nofparsed,order)
if trace_lparse then
lshow(parsed)
end
- logs.report("lpath", "collecting : %s",parsed.pattern)
- logs.report("lpath", " root tags : %s",tagstostring(list))
- logs.report("lpath", " order : %s",order or "unset")
+ report_lpath("collecting: %s",parsed.pattern)
+ report_lpath("root tags : %s",tagstostring(list))
+ report_lpath("order : %s",order or "unset")
local collected = list
for i=1,nofparsed do
local pi = parsed[i]
local kind = pi.kind
if kind == "axis" then
collected = apply_axis[pi.axis](collected)
- logs.report("lpath", "% 10i : ax : %s",(collected and #collected) or 0,pi.axis)
+ report_lpath("% 10i : ax : %s",(collected and #collected) or 0,pi.axis)
elseif kind == "nodes" then
collected = apply_nodes(collected,pi.nodetest,pi.nodes)
- logs.report("lpath", "% 10i : ns : %s",(collected and #collected) or 0,nodesettostring(pi.nodes,pi.nodetest))
+ report_lpath("% 10i : ns : %s",(collected and #collected) or 0,nodesettostring(pi.nodes,pi.nodetest))
elseif kind == "expression" then
collected = apply_expression(collected,pi.evaluator,order)
- logs.report("lpath", "% 10i : ex : %s -> %s",(collected and #collected) or 0,pi.expression,pi.converted)
+ report_lpath("% 10i : ex : %s -> %s",(collected and #collected) or 0,pi.expression,pi.converted)
elseif kind == "finalizer" then
collected = pi.finalizer(collected)
- logs.report("lpath", "% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pi.name,pi.arguments or "")
+ report_lpath("% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pi.name,pi.arguments or "")
return collected
end
if not collected or #collected == 0 then
local pn = i < nofparsed and parsed[nofparsed]
if pn and pn.kind == "finalizer" then
collected = pn.finalizer(collected)
- logs.report("lpath", "% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pn.name,pn.arguments or "")
+ report_lpath("% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pn.name,pn.arguments or "")
return collected
end
return nil
@@ -6141,8 +8435,11 @@ local function normal_apply(list,parsed,nofparsed,order)
return collected
end
-local function parse_apply(list,pattern)
- -- we avoid an extra call
+
+local function applylpath(list,pattern)
+ if not list then
+ return
+ end
local parsed = cache[pattern]
if parsed then
lpathcalls = lpathcalls + 1
@@ -6151,7 +8448,7 @@ local function parse_apply(list,pattern)
lpathcalls = lpathcalls + 1
parsed = pattern
else
- parsed = parse_pattern(pattern) or pattern
+ parsed = lpath(pattern) or pattern
end
if not parsed then
return
@@ -6160,25 +8457,32 @@ local function parse_apply(list,pattern)
if nofparsed == 0 then
return -- something is wrong
end
- local one = list[1]
- if not one then
- return -- something is wrong
- elseif not trace_lpath then
- return normal_apply(list,parsed,nofparsed,one.mi)
+ if not trace_lpath then
+ return normal_apply ({ list },parsed,nofparsed,list.mi)
elseif trace_lprofile then
- return profiled_apply(list,parsed,nofparsed,one.mi)
+ return profiled_apply({ list },parsed,nofparsed,list.mi)
else
- return traced_apply(list,parsed,nofparsed,one.mi)
+ return traced_apply ({ list },parsed,nofparsed,list.mi)
end
end
+xml.applylpath = applylpath -- takes a table as first argment, which is what xml.filter will do
+
+--[[ldx--
+<p>This is the main filter function. It returns whatever is asked for.</p>
+--ldx]]--
+
+function xml.filter(root,pattern) -- no longer funny attribute handling here
+ return applylpath(root,pattern)
+end
+
-- internal (parsed)
expressions.child = function(e,pattern)
- return parse_apply({ e },pattern) -- todo: cache
+ return applylpath(e,pattern) -- todo: cache
end
expressions.count = function(e,pattern)
- local collected = parse_apply({ e },pattern) -- todo: cache
+ local collected = applylpath(e,pattern) -- todo: cache
return (collected and #collected) or 0
end
@@ -6188,7 +8492,7 @@ expressions.oneof = function(s,...) -- slow
local t = {...} for i=1,#t do if s == t[i] then return true end end return false
end
expressions.error = function(str)
- xml.error_handler("unknown function in lpath expression",tostring(str or "?"))
+ xml.errorhandler("unknown function in lpath expression",tostring(str or "?"))
return false
end
expressions.undefined = function(s)
@@ -6217,8 +8521,8 @@ expressions.boolean = toboolean
-- user interface
local function traverse(root,pattern,handle)
- logs.report("xml","use 'xml.selection' instead for '%s'",pattern)
- local collected = parse_apply({ root },pattern)
+ report_lpath("use 'xml.selection' instead for '%s'",pattern)
+ local collected = applylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6229,7 +8533,7 @@ local function traverse(root,pattern,handle)
end
local function selection(root,pattern,handle)
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if handle then
for c=1,#collected do
@@ -6241,19 +8545,9 @@ local function selection(root,pattern,handle)
end
end
-xml.parse_parser = parser
-xml.parse_pattern = parse_pattern
-xml.parse_apply = parse_apply
xml.traverse = traverse -- old method, r, d, k
xml.selection = selection -- new method, simple handle
-local lpath = parse_pattern
-
-xml.lpath = lpath
-
-function xml.cached_patterns()
- return cache
-end
-- generic function finalizer (independant namespace)
@@ -6265,13 +8559,13 @@ local function dofunction(collected,fnc)
f(collected[c])
end
else
- logs.report("xml","unknown function '%s'",fnc)
+ report_lpath("unknown function '%s'",fnc)
end
end
end
-xml.finalizers.xml["function"] = dofunction
-xml.finalizers.tex["function"] = dofunction
+finalizers.xml["function"] = dofunction
+finalizers.tex["function"] = dofunction
-- functions
@@ -6364,14 +8658,6 @@ expressions.tag = function(e,n) -- only tg
end
--[[ldx--
-<p>This is the main filter function. It returns whatever is asked for.</p>
---ldx]]--
-
-function xml.filter(root,pattern) -- no longer funny attribute handling here
- return parse_apply({ root },pattern)
-end
-
---[[ldx--
<p>Often using an iterators looks nicer in the code than passing handler
functions. The <l n='lua'/> book describes how to use coroutines for that
purpose (<url href='http://www.lua.org/pil/9.3.html'/>). This permits
@@ -6390,7 +8676,7 @@ end
local wrap, yield = coroutine.wrap, coroutine.yield
function xml.elements(root,pattern,reverse) -- r, d, k
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if reverse then
return wrap(function() for c=#collected,1,-1 do
@@ -6406,7 +8692,7 @@ function xml.elements(root,pattern,reverse) -- r, d, k
end
function xml.collected(root,pattern,reverse) -- e
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if reverse then
return wrap(function() for c=#collected,1,-1 do yield(collected[c]) end end)
@@ -6417,6 +8703,15 @@ function xml.collected(root,pattern,reverse) -- e
return wrap(function() end)
end
+-- handy
+
+function xml.inspect(collection,pattern)
+ pattern = pattern or "."
+ for e in xml.collected(collection,pattern or ".") do
+ report_lpath("pattern %q\n\n%s\n",pattern,xml.tostring(e))
+ end
+end
+
end -- of closure
@@ -6430,10 +8725,16 @@ if not modules then modules = { } end modules ['lxml-mis'] = {
license = "see context related readme files"
}
+local xml, lpeg, string = xml, lpeg, string
+
local concat = table.concat
local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring
local format, gsub, match = string.format, string.gsub, string.match
-local lpegmatch = lpeg.match
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs
+
+lpegpatterns.xml = lpegpatterns.xml or { }
+local xmlpatterns = lpegpatterns.xml
--[[ldx--
<p>The following helper functions best belong to the <t>lxml-ini</t>
@@ -6457,9 +8758,8 @@ local function xmlgsub(t,old,new) -- will be replaced
end
end
---~ xml.gsub = xmlgsub
-function xml.strip_leading_spaces(dk,d,k) -- cosmetic, for manual
+function xml.stripleadingspaces(dk,d,k) -- cosmetic, for manual
if d and k then
local dkm = d[k-1]
if dkm and type(dkm) == "string" then
@@ -6469,14 +8769,7 @@ function xml.strip_leading_spaces(dk,d,k) -- cosmetic, for manual
end
end
---~ xml.escapes = { ['&'] = '&amp;', ['<'] = '&lt;', ['>'] = '&gt;', ['"'] = '&quot;' }
---~ xml.unescapes = { } for k,v in next, xml.escapes do xml.unescapes[v] = k end
---~ function xml.escaped (str) return (gsub(str,"(.)" , xml.escapes )) end
---~ function xml.unescaped(str) return (gsub(str,"(&.-;)", xml.unescapes)) end
---~ function xml.cleansed (str) return (gsub(str,"<.->" , '' )) end -- "%b<>"
-
-local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs
-- 100 * 2500 * "oeps< oeps> oeps&" : gsub:lpeg|lpeg|lpeg
--
@@ -6502,9 +8795,9 @@ local unescaped = Cs(normal * (special * normal)^0)
local cleansed = Cs(((P("<") * (1-P(">"))^0 * P(">"))/"" + 1)^0)
-xml.escaped_pattern = escaped
-xml.unescaped_pattern = unescaped
-xml.cleansed_pattern = cleansed
+xmlpatterns.escaped = escaped
+xmlpatterns.unescaped = unescaped
+xmlpatterns.cleansed = cleansed
function xml.escaped (str) return lpegmatch(escaped,str) end
function xml.unescaped(str) return lpegmatch(unescaped,str) end
@@ -6540,15 +8833,20 @@ if not modules then modules = { } end modules ['lxml-aux'] = {
local trace_manipulations = false trackers.register("lxml.manipulations", function(v) trace_manipulations = v end)
-local xmlparseapply, xmlconvert, xmlcopy, xmlname = xml.parse_apply, xml.convert, xml.copy, xml.name
+local report_xml = logs.reporter("xml")
+
+local xml = xml
+
+local xmlconvert, xmlcopy, xmlname = xml.convert, xml.copy, xml.name
local xmlinheritedconvert = xml.inheritedconvert
+local xmlapplylpath = xml.applylpath
-local type = type
-local insert, remove = table.insert, table.remove
+local type, setmetatable, getmetatable = type, setmetatable, getmetatable
+local insert, remove, fastcopy = table.insert, table.remove, table.fastcopy
local gmatch, gsub = string.gmatch, string.gsub
local function report(what,pattern,c,e)
- logs.report("xml","%s element '%s' (root: '%s', position: %s, index: %s, pattern: %s)",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
+ report_xml("%s element '%s' (root: '%s', position: %s, index: %s, pattern: %s)",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
end
local function withelements(e,handle,depth)
@@ -6602,10 +8900,8 @@ function xml.withelement(e,n,handle) -- slow
end
end
-xml.elements_only = xml.collected
-
-function xml.each_element(root,pattern,handle,reverse)
- local collected = xmlparseapply({ root },pattern)
+function xml.each(root,pattern,handle,reverse)
+ local collected = xmlapplylpath(root,pattern)
if collected then
if reverse then
for c=#collected,1,-1 do
@@ -6620,10 +8916,8 @@ function xml.each_element(root,pattern,handle,reverse)
end
end
-xml.process_elements = xml.each_element
-
-function xml.process_attributes(root,pattern,handle)
- local collected = xmlparseapply({ root },pattern)
+function xml.processattributes(root,pattern,handle)
+ local collected = xmlapplylpath(root,pattern)
if collected and handle then
for c=1,#collected do
handle(collected[c].at)
@@ -6638,12 +8932,12 @@ end
-- are these still needed -> lxml-cmp.lua
-function xml.collect_elements(root, pattern)
- return xmlparseapply({ root },pattern)
+function xml.collect(root, pattern)
+ return xmlapplylpath(root,pattern)
end
-function xml.collect_texts(root, pattern, flatten) -- todo: variant with handle
- local collected = xmlparseapply({ root },pattern)
+function xml.collecttexts(root, pattern, flatten) -- todo: variant with handle
+ local collected = xmlapplylpath(root,pattern)
if collected and flatten then
local xmltostring = xml.tostring
for c=1,#collected do
@@ -6654,18 +8948,19 @@ function xml.collect_texts(root, pattern, flatten) -- todo: variant with handle
end
function xml.collect_tags(root, pattern, nonamespace)
- local collected = xmlparseapply({ root },pattern)
+ local collected = xmlapplylpath(root,pattern)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
local e = collected[c]
local ns, tg = e.ns, e.tg
+ n = n + 1
if nonamespace then
- t[#t+1] = tg
+ t[n] = tg
elseif ns == "" then
- t[#t+1] = tg
+ t[n] = tg
else
- t[#t+1] = ns .. ":" .. tg
+ t[n] = ns .. ":" .. tg
end
end
return t
@@ -6678,7 +8973,7 @@ end
local no_root = { no_root = true }
-function xml.redo_ni(d)
+local function redo_ni(d)
for k=1,#d do
local dk = d[k]
if type(dk) == "table" then
@@ -6701,12 +8996,7 @@ local function xmltoelement(whatever,root)
return whatever -- string
end
if element then
- --~ if element.ri then
- --~ element = element.dt[element.ri].dt
- --~ else
- --~ element = element.dt
- --~ end
- end
+ end
return element
end
@@ -6724,8 +9014,8 @@ local function copiedelement(element,newparent)
end
end
-function xml.delete_element(root,pattern)
- local collected = xmlparseapply({ root },pattern)
+function xml.delete(root,pattern)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6736,15 +9026,15 @@ function xml.delete_element(root,pattern)
end
local d = p.dt
remove(d,e.ni)
- xml.redo_ni(d) -- can be made faster and inlined
+ redo_ni(d) -- can be made faster and inlined
end
end
end
end
-function xml.replace_element(root,pattern,whatever)
+function xml.replace(root,pattern,whatever)
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6755,15 +9045,50 @@ function xml.replace_element(root,pattern,whatever)
end
local d = p.dt
d[e.ni] = copiedelement(element,p)
- xml.redo_ni(d) -- probably not needed
+ redo_ni(d) -- probably not needed
+ end
+ end
+ end
+end
+
+local function wrap(e,wrapper)
+ local t = {
+ rn = e.rn,
+ tg = e.tg,
+ ns = e.ns,
+ at = e.at,
+ dt = e.dt,
+ __p__ = e,
+ }
+ setmetatable(t,getmetatable(e))
+ e.rn = wrapper.rn or e.rn or ""
+ e.tg = wrapper.tg or e.tg or ""
+ e.ns = wrapper.ns or e.ns or ""
+ e.at = fastcopy(wrapper.at)
+ e.dt = { t }
+end
+
+function xml.wrap(root,pattern,whatever)
+ if whatever then
+ local wrapper = xmltoelement(whatever,root)
+ local collected = xmlapplylpath(root,pattern)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ if trace_manipulations then
+ report('wrapping',pattern,c,e)
+ end
+ wrap(e,wrapper)
end
end
+ else
+ wrap(root,xmltoelement(pattern))
end
end
local function inject_element(root,pattern,whatever,prepend)
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6778,15 +9103,17 @@ local function inject_element(root,pattern,whatever,prepend)
else
be, af = edt, cp
end
+ local bn = #be
for i=1,#af do
- be[#be+1] = af[i]
+ bn = bn + 1
+ be[bn] = af[i]
end
if rri then
r.dt[rri].dt = be
else
d[k].dt = be
end
- xml.redo_ni(d)
+ redo_ni(d)
end
end
end
@@ -6794,7 +9121,7 @@ end
local function insert_element(root,pattern,whatever,before) -- todo: element als functie
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6804,24 +9131,23 @@ local function insert_element(root,pattern,whatever,before) -- todo: element als
k = k + 1
end
insert(d,k,copiedelement(element,r))
- xml.redo_ni(d)
+ redo_ni(d)
end
end
end
-xml.insert_element = insert_element
-xml.insert_element_after = insert_element
-xml.insert_element_before = function(r,p,e) insert_element(r,p,e,true) end
-xml.inject_element = inject_element
-xml.inject_element_after = inject_element
-xml.inject_element_before = function(r,p,e) inject_element(r,p,e,true) end
+xml.insert_element = insert_element
+xml.insertafter = insert_element
+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 collected = xmlparseapply({ xmldata },pattern)
+ local collected = xmlapplylpath(xmldata,pattern)
if collected then
for c=1,#collected do
local ek = collected[c]
@@ -6830,7 +9156,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
local ekat = ek.at
local epdt = ek.__p__.dt
if not attribute or attribute == "" then
- name = (type(ekdt) == "table" and ekdt[1]) or ekdt -- ckeck, probably always tab or str
+ 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
@@ -6845,9 +9171,6 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
-- 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)
@@ -6864,136 +9187,88 @@ end
xml.include = include
---~ local function manipulate(xmldata,pattern,manipulator) -- untested and might go away
---~ local collected = xmlparseapply({ xmldata },pattern)
---~ if collected then
---~ local xmltostring = xml.tostring
---~ for c=1,#collected do
---~ local e = collected[c]
---~ local data = manipulator(xmltostring(e))
---~ if data == "" then
---~ epdt[e.ni] = ""
---~ else
---~ local xi = xmlinheritedconvert(data,xmldata)
---~ if not xi then
---~ epdt[e.ni] = ""
---~ else
---~ epdt[e.ni] = xml.body(xi) -- xml.assign(d,k,xi)
---~ end
---~ end
---~ end
---~ end
---~ end
-
---~ xml.manipulate = manipulate
-
-function xml.strip_whitespace(root, pattern, nolines) -- strips all leading and trailing space !
- local collected = xmlparseapply({ root },pattern)
- if collected then
- for i=1,#collected do
- local e = collected[i]
- local edt = e.dt
- if edt then
- local t = { }
- for i=1,#edt do
- local str = edt[i]
- if type(str) == "string" then
- if str == "" then
- -- stripped
- else
- if nolines then
- str = gsub(str,"[ \n\r\t]+"," ")
- end
- if str == "" then
- -- stripped
- else
- t[#t+1] = str
- end
- end
+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 str = edt[e]
+ if type(str) ~= "string" then
+ n = n + 1
+ t[n] = str
+ elseif str ~= "" then
+ -- todo: lpeg for each case
+ if nolines then
+ str = gsub(str,"%s+"," ")
+ end
+ str = gsub(str,"^%s*(.-)%s*$","%1")
+ if str ~= "" then
+ n = n + 1
+ t[n] = 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
+ remove(edt,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
+ 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 str == "" then
+ remove(edt)
else
- --~ str.ni = i
- t[#t+1] = str
+ edt[nedt] = str
end
end
- e.dt = t
end
end
end
+ return e -- convenient
end
-function xml.strip_whitespace(root, pattern, nolines, anywhere) -- strips all leading and trailing spacing
- local collected = xmlparseapply({ root },pattern) -- beware, indices no longer are valid now
+xml.stripelement = stripelement
+
+function xml.strip(root,pattern,nolines,anywhere) -- strips all leading and trailing spacing
+ local collected = xmlapplylpath(root,pattern) -- beware, indices no longer are valid now
if collected then
for i=1,#collected do
- local e = collected[i]
- local edt = e.dt
- if edt then
- if anywhere then
- local t = { }
- for e=1,#edt do
- local str = edt[e]
- if type(str) ~= "string" then
- t[#t+1] = str
- elseif str ~= "" then
- -- todo: lpeg for each case
- if nolines then
- str = gsub(str,"%s+"," ")
- end
- str = gsub(str,"^%s*(.-)%s*$","%1")
- if str ~= "" then
- t[#t+1] = 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
- remove(edt,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
- end
- end
- if #edt > 1 then
- -- strip end
- local str = edt[#edt]
- 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 str == "" then
- remove(edt)
- else
- edt[#edt] = str
- end
- end
- end
- end
- end
+ stripelement(collected[i],nolines,anywhere)
end
end
end
-local function rename_space(root, oldspace, newspace) -- fast variant
+local function renamespace(root, oldspace, newspace) -- fast variant
local ndt = #root.dt
for i=1,ndt or 0 do
local e = root[i]
@@ -7006,16 +9281,16 @@ local function rename_space(root, oldspace, newspace) -- fast variant
end
local edt = e.dt
if edt then
- rename_space(edt, oldspace, newspace)
+ renamespace(edt, oldspace, newspace)
end
end
end
end
-xml.rename_space = rename_space
+xml.renamespace = renamespace
-function xml.remap_tag(root, pattern, newtg)
- local collected = xmlparseapply({ root },pattern)
+function xml.remaptag(root, pattern, newtg)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
collected[c].tg = newtg
@@ -7023,8 +9298,8 @@ function xml.remap_tag(root, pattern, newtg)
end
end
-function xml.remap_namespace(root, pattern, newns)
- local collected = xmlparseapply({ root },pattern)
+function xml.remapnamespace(root, pattern, newns)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
collected[c].ns = newns
@@ -7032,8 +9307,8 @@ function xml.remap_namespace(root, pattern, newns)
end
end
-function xml.check_namespace(root, pattern, newns)
- local collected = xmlparseapply({ root },pattern)
+function xml.checknamespace(root, pattern, newns)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -7044,8 +9319,8 @@ function xml.check_namespace(root, pattern, newns)
end
end
-function xml.remap_name(root, pattern, newtg, newns, newrn)
- local collected = xmlparseapply({ root },pattern)
+function xml.remapname(root, pattern, newtg, newns, newrn)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -7058,18 +9333,34 @@ end
<p>Here are a few synonyms.</p>
--ldx]]--
-xml.each = xml.each_element
-xml.process = xml.process_element
-xml.strip = xml.strip_whitespace
-xml.collect = xml.collect_elements
-xml.all = xml.collect_elements
-
-xml.insert = xml.insert_element_after
-xml.inject = xml.inject_element_after
-xml.after = xml.insert_element_after
-xml.before = xml.insert_element_before
-xml.delete = xml.delete_element
-xml.replace = xml.replace_element
+xml.all = xml.each
+xml.insert = xml.insertafter
+xml.inject = xml.injectafter
+xml.after = xml.insertafter
+xml.before = xml.insertbefore
+xml.process = xml.each
+
+-- obsolete
+
+xml.obsolete = xml.obsolete or { }
+local obsolete = xml.obsolete
+
+xml.strip_whitespace = xml.strip obsolete.strip_whitespace = xml.strip
+xml.collect_elements = xml.collect obsolete.collect_elements = xml.collect
+xml.delete_element = xml.delete obsolete.delete_element = xml.delete
+xml.replace_element = xml.replace obsolete.replace_element = xml.replacet
+xml.each_element = xml.each obsolete.each_element = xml.each
+xml.process_elements = xml.process obsolete.process_elements = xml.process
+xml.insert_element_after = xml.insertafter obsolete.insert_element_after = xml.insertafter
+xml.insert_element_before = xml.insertbefore obsolete.insert_element_before = xml.insertbefore
+xml.inject_element_after = xml.injectafter obsolete.inject_element_after = xml.injectafter
+xml.inject_element_before = xml.injectbefore obsolete.inject_element_before = xml.injectbefore
+xml.process_attributes = xml.processattributes obsolete.process_attributes = xml.processattributes
+xml.collect_texts = xml.collecttexts obsolete.collect_texts = xml.collecttexts
+xml.inject_element = xml.inject obsolete.inject_element = xml.inject
+xml.remap_tag = xml.remaptag obsolete.remap_tag = xml.remaptag
+xml.remap_name = xml.remapname obsolete.remap_name = xml.remapname
+xml.remap_namespace = xml.remapnamespace obsolete.remap_namespace = xml.remapnamespace
end -- of closure
@@ -7084,10 +9375,15 @@ if not modules then modules = { } end modules ['lxml-xml'] = {
license = "see context related readme files"
}
+local concat = string.concat
+
+local xml = xml
+
local finalizers = xml.finalizers.xml
local xmlfilter = xml.filter -- we could inline this one for speed
local xmltostring = xml.tostring
local xmlserialize = xml.serialize
+local xmlcollected = xml.collected
local function first(collected) -- wrong ?
return collected and collected[1]
@@ -7101,15 +9397,8 @@ local function all(collected)
return collected
end
-local function reverse(collected)
- if collected then
- local reversed = { }
- for c=#collected,1,-1 do
- reversed[#reversed+1] = collected[c]
- end
- return reversed
- end
-end
+
+local reverse = table.reversed
local function attribute(collected,name)
if collected and #collected > 0 then
@@ -7200,11 +9489,12 @@ end
local function texts(collected)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
- local e = collection[c]
+ local e = collected[c]
if e and e.dt then
- t[#t+1] = e.dt
+ n = n + 1
+ t[n] = e.dt
end
end
return t
@@ -7247,14 +9537,15 @@ end
local function tags(collected,nonamespace)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
local e = collected[c]
local ns, tg = e.ns, e.tg
+ n = n + 1
if nonamespace or ns == "" then
- t[#t+1] = tg
+ t[n] = tg
else
- t[#t+1] = ns .. ":" .. tg
+ t[n] = ns .. ":" .. tg
end
end
return t
@@ -7365,293 +9656,273 @@ xml.all = xml.filter
xml.index = xml.position
xml.found = xml.filter
+-- a nice one:
+
+local function totable(x)
+ local t = { }
+ for e in xmlcollected(x[1] or x,"/*") do
+ t[e.tg] = xmltostring(e.dt) or ""
+ end
+ return next(t) and t or nil
+end
+
+xml.table = totable
+finalizers.table = totable
+
+local function textonly(e,t)
+ if e then
+ local edt = e.dt
+ if edt then
+ for i=1,#edt do
+ local e = edt[i]
+ if type(e) == "table" then
+ textonly(e,t)
+ else
+ t[#t+1] = e
+ end
+ end
+ end
+ end
+ return t
+end
+
+function xml.textonly(e) -- no pattern
+ return concat(textonly(e,{}))
+end
+
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['luat-env'] = {
+if not modules then modules = { } end modules ['data-ini'] = {
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"
+ license = "see context related readme files",
}
--- A former version provided functionality for non embeded core
--- scripts i.e. runtime library loading. Given the amount of
--- Lua code we use now, this no longer makes sense. Much of this
--- evolved before bytecode arrays were available and so a lot of
--- code has disappeared already.
+local gsub, find, gmatch = string.gsub, string.find, string.gmatch
+local concat = table.concat
+local next, type = next, type
-local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local filedirname, filebasename, fileextname, filejoin = file.dirname, file.basename, file.extname, file.join
-local format, sub, match, gsub, find = string.format, string.sub, string.match, string.gsub, string.find
-local unquote, quote = string.unquote, string.quote
+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)
--- precautions
+local report_initialization = logs.reporter("resolvers","initialization")
-os.setlocale(nil,nil) -- useless feature and even dangerous in luatex
+local ostype, osname, ossetenv, osgetenv = os.type, os.name, os.setenv, os.getenv
-function os.setlocale()
- -- no way you can mess with it
-end
+-- 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.
--- dirty tricks
+resolvers = resolvers or { }
+local resolvers = resolvers
-if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
- arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil
-end
+-- We don't want the kpse library to kick in. Also, we want to be able to
+-- execute programs. Control over execution is implemented later.
-if profiler and os.env["MTX_PROFILE_RUN"] == "YES" then
- profiler.start("luatex-profile.log")
-end
+texconfig.kpse_init = false
+texconfig.shell_escape = 't'
--- environment
+kpse = { original = kpse }
-environment = environment or { }
-environment.arguments = { }
-environment.files = { }
-environment.sortedflags = nil
+setmetatable(kpse, {
+ __index = function(kp,name)
+ report_initialization("fatal error: kpse library is accessed (key: %s)",name)
+ os.exit()
+ end
+} )
-if not environment.jobname or environment.jobname == "" then if tex then environment.jobname = tex.jobname end end
-if not environment.version or environment.version == "" then environment.version = "unknown" end
-if not environment.jobname then environment.jobname = "unknown" end
+-- First we check a couple of environment variables. Some might be
+-- set already but we need then later on. We start with the system
+-- font path.
-function environment.initialize_arguments(arg)
- local arguments, files = { }, { }
- environment.arguments, environment.files, environment.sortedflags = arguments, files, nil
- for index=1,#arg do
- local argument = arg[index]
- if index > 0 then
- local flag, value = match(argument,"^%-+(.-)=(.-)$")
- if flag then
- arguments[flag] = unquote(value or "")
- else
- flag = match(argument,"^%-+(.+)")
- if flag then
- arguments[flag] = true
- else
- files[#files+1] = argument
- end
- end
- end
+do
+
+ local osfontdir = osgetenv("OSFONTDIR")
+
+ if osfontdir and osfontdir ~= "" then
+ -- ok
+ elseif osname == "windows" then
+ ossetenv("OSFONTDIR","c:/windows/fonts//")
+ elseif osname == "macosx" then
+ ossetenv("OSFONTDIR","$HOME/Library/Fonts//;/Library/Fonts//;/System/Library/Fonts//")
end
- environment.ownname = environment.ownname or arg[0] or 'unknown.lua'
+
end
-function environment.setargument(name,value)
- environment.arguments[name] = value
+-- Next comes the user's home path. We need this as later on we have
+-- to replace ~ with its value.
+
+do
+
+ local homedir = osgetenv(ostype == "windows" and 'USERPROFILE' or 'HOME') or ''
+
+ if not homedir or homedir == "" then
+ homedir = string.char(127) -- we need a value, later we wil trigger on it
+ end
+
+ homedir = file.collapsepath(homedir)
+
+ ossetenv("HOME", homedir) -- can be used in unix cnf files
+ ossetenv("USERPROFILE",homedir) -- can be used in windows cnf files
+
+ environment.homedir = homedir
+
end
--- todo: defaults, better checks e.g on type (boolean versus string)
---
--- tricky: too many hits when we support partials unless we add
--- a registration of arguments so from now on we have 'partial'
+-- The following code sets the name of the own binary and its
+-- path. This is fallback code as we have os.selfdir now.
-function environment.argument(name,partial)
- local arguments, sortedflags = environment.arguments, environment.sortedflags
- if arguments[name] then
- return arguments[name]
- elseif partial then
- if not sortedflags then
- sortedflags = table.sortedkeys(arguments)
- for k=1,#sortedflags do
- sortedflags[k] = "^" .. sortedflags[k]
- end
- environment.sortedflags = sortedflags
+do
+
+ local args = environment.originalarguments or arg -- this needs a cleanup
+
+ local ownbin = environment.ownbin or args[-2] or arg[-2] or args[-1] or arg[-1] or arg[0] or "luatex"
+ local ownpath = environment.ownpath or os.selfdir
+
+ ownbin = file.collapsepath(ownbin)
+ ownpath = file.collapsepath(ownpath)
+
+ if not ownpath or ownpath == "" or ownpath == "unset" then
+ ownpath = args[-1] or arg[-1]
+ ownpath = ownpath and filedirname(gsub(ownpath,"\\","/"))
+ if not ownpath or ownpath == "" then
+ ownpath = args[-0] or arg[-0]
+ ownpath = ownpath and filedirname(gsub(ownpath,"\\","/"))
end
- -- example of potential clash: ^mode ^modefile
- for k=1,#sortedflags do
- local v = sortedflags[k]
- if find(name,v) then
- return arguments[sub(v,2,#v)]
+ local binary = ownbin
+ if not ownpath or ownpath == "" then
+ ownpath = ownpath and filedirname(binary)
+ end
+ if not ownpath or ownpath == "" then
+ if os.binsuffix ~= "" then
+ binary = file.replacesuffix(binary,os.binsuffix)
+ end
+ local path = osgetenv("PATH")
+ if path then
+ for p in gmatch(path,"[^"..io.pathseparator.."]+") do
+ local b = filejoin(p,binary)
+ if lfs.isfile(b) then
+ -- we assume that after changing to the path the currentdir function
+ -- resolves to the real location and use this side effect here; this
+ -- trick is needed because on the mac installations use symlinks in the
+ -- path instead of real locations
+ local olddir = lfs.currentdir()
+ if lfs.chdir(p) then
+ local pp = lfs.currentdir()
+ if trace_locating and p ~= pp then
+ report_initialization("following symlink '%s' to '%s'",p,pp)
+ end
+ ownpath = pp
+ lfs.chdir(olddir)
+ else
+ if trace_locating then
+ report_initialization("unable to check path '%s'",p)
+ end
+ ownpath = p
+ end
+ break
+ end
+ end
end
end
+ if not ownpath or ownpath == "" then
+ ownpath = "."
+ report_initialization("forcing fallback ownpath .")
+ elseif trace_locating then
+ report_initialization("using ownpath '%s'",ownpath)
+ end
end
- return nil
+
+ environment.ownbin = ownbin
+ environment.ownpath = ownpath
+
end
-environment.argument("x",true)
+resolvers.ownpath = environment.ownpath
-function environment.split_arguments(separator) -- rather special, cut-off before separator
- local done, before, after = false, { }, { }
- local original_arguments = environment.original_arguments
- for k=1,#original_arguments do
- local v = original_arguments[k]
- if not done and v == separator then
- done = true
- elseif done then
- after[#after+1] = v
- else
- before[#before+1] = v
- end
- end
- return before, after
+function resolvers.getownpath()
+ return environment.ownpath
end
-function environment.reconstruct_commandline(arg,noquote)
- arg = arg or environment.original_arguments
- if noquote and #arg == 1 then
- local a = arg[1]
- a = resolvers.resolve(a)
- a = unquote(a)
- return a
- elseif #arg > 0 then
- local result = { }
- for i=1,#arg do
- local a = arg[i]
- a = resolvers.resolve(a)
- a = unquote(a)
- a = gsub(a,'"','\\"') -- tricky
- if find(a," ") then
- result[#result+1] = quote(a)
- else
- result[#result+1] = a
- end
- end
- return table.join(result," ")
+-- The self variables permit us to use only a few (or even no)
+-- environment variables.
+
+do
+
+ local ownpath = environment.ownpath or dir.current()
+
+ if ownpath then
+ ossetenv('SELFAUTOLOC', file.collapsepath(ownpath))
+ ossetenv('SELFAUTODIR', file.collapsepath(ownpath .. "/.."))
+ ossetenv('SELFAUTOPARENT', file.collapsepath(ownpath .. "/../.."))
else
- return ""
+ report_initialization("error: unable to locate ownpath")
+ os.exit()
end
+
end
-if arg then
+-- The running os:
- -- new, reconstruct quoted snippets (maybe better just remove the " then and add them later)
- local newarg, instring = { }, false
+-- todo: check is context sits here os.platform is more trustworthy
+-- that the bin check as mtx-update runs from another path
- for index=1,#arg do
- local argument = arg[index]
- if find(argument,"^\"") then
- newarg[#newarg+1] = gsub(argument,"^\"","")
- if not find(argument,"\"$") then
- instring = true
- end
- elseif find(argument,"\"$") then
- newarg[#newarg] = newarg[#newarg] .. " " .. gsub(argument,"\"$","")
- instring = false
- elseif instring then
- newarg[#newarg] = newarg[#newarg] .. " " .. argument
- else
- newarg[#newarg+1] = argument
- end
- end
- for i=1,-5,-1 do
- newarg[i] = arg[i]
- end
+local texos = environment.texos or osgetenv("TEXOS")
+local texmfos = environment.texmfos or osgetenv('SELFAUTODIR')
- environment.initialize_arguments(newarg)
- environment.original_arguments = newarg
- environment.raw_arguments = arg
+if not texos or texos == "" then
+ texos = file.basename(texmfos)
+end
- arg = { } -- prevent duplicate handling
+ossetenv('TEXMFOS', texmfos) -- full bin path
+ossetenv('TEXOS', texos) -- partial bin parent
+ossetenv('SELFAUTOSYSTEM',os.platform) -- bonus
-end
+environment.texos = texos
+environment.texmfos = texmfos
--- weird place ... depends on a not yet loaded module
+-- The current root:
-function environment.texfile(filename)
- return resolvers.find_file(filename,'tex')
-end
+local texroot = environment.texroot or osgetenv("TEXROOT")
-function environment.luafile(filename)
- local resolved = resolvers.find_file(filename,'tex') or ""
- if resolved ~= "" then
- return resolved
- end
- resolved = resolvers.find_file(filename,'texmfscripts') or ""
- if resolved ~= "" then
- return resolved
- end
- return resolvers.find_file(filename,'luatexlibs') or ""
+if not texroot or texroot == "" then
+ texroot = osgetenv('SELFAUTOPARENT')
+ ossetenv('TEXROOT',texroot)
end
-environment.loadedluacode = loadfile -- can be overloaded
+environment.texroot = file.collapsepath(texroot)
---~ function environment.loadedluacode(name)
---~ if os.spawn("texluac -s -o texluac.luc " .. name) == 0 then
---~ local chunk = loadstring(io.loaddata("texluac.luc"))
---~ os.remove("texluac.luc")
---~ return chunk
---~ else
---~ environment.loadedluacode = loadfile -- can be overloaded
---~ return loadfile(name)
---~ end
---~ end
-
-function environment.luafilechunk(filename) -- used for loading lua bytecode in the format
- filename = file.replacesuffix(filename, "lua")
- local fullname = environment.luafile(filename)
- if fullname and fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading file %s", fullname)
- end
- return environment.loadedluacode(fullname)
- else
- if trace_locating then
- logs.report("fileio","unknown file %s", filename)
- end
- return nil
+-- Tracing. Todo ...
+
+function resolvers.settrace(n) -- no longer number but: 'locating' or 'detail'
+ if n then
+ trackers.disable("resolvers.*")
+ trackers.enable("resolvers."..n)
end
end
--- the next ones can use the previous ones / combine
+resolvers.settrace(osgetenv("MTX_INPUT_TRACE"))
-function environment.loadluafile(filename, version)
- local lucname, luaname, chunk
- local basename = file.removesuffix(filename)
- if basename == filename then
- lucname, luaname = basename .. ".luc", basename .. ".lua"
- else
- lucname, luaname = nil, basename -- forced suffix
- end
- -- when not overloaded by explicit suffix we look for a luc file first
- local fullname = (lucname and environment.luafile(lucname)) or ""
- if fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading %s", fullname)
- end
- chunk = loadfile(fullname) -- this way we don't need a file exists check
- end
- if chunk then
- assert(chunk)()
- if version then
- -- we check of the version number of this chunk matches
- local v = version -- can be nil
- if modules and modules[filename] then
- v = modules[filename].version -- new method
- elseif versions and versions[filename] then
- v = versions[filename] -- old method
- end
- if v == version then
- return true
- else
- if trace_locating then
- logs.report("fileio","version mismatch for %s: lua=%s, luc=%s", filename, v, version)
- end
- environment.loadluafile(filename)
- end
- else
- return true
- end
- end
- fullname = (luaname and environment.luafile(luaname)) or ""
- if fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading %s", fullname)
- end
- chunk = loadfile(fullname) -- this way we don't need a file exists check
- if not chunk then
- if trace_locating then
- logs.report("fileio","unknown file %s", filename)
- end
- else
- assert(chunk)()
- return true
- end
- end
- return false
+-- todo:
+
+-- if profiler and osgetenv("MTX_PROFILE_RUN") == "YES" then
+-- profiler.start("luatex-profile.log")
+-- 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
end
@@ -7659,536 +9930,1152 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['trac-inf'] = {
+if not modules then modules = { } end modules ['data-exp'] = {
version = 1.001,
- comment = "companion to trac-inf.mkiv",
+ 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"
+ license = "see context related readme files",
}
-local format = string.format
+local format, find, gmatch, lower = string.format, string.find, string.gmatch, string.lower
+local concat, sort = table.concat, table.sort
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local Ct, Cs, Cc, P, C, S = lpeg.Ct, lpeg.Cs, lpeg.Cc, lpeg.P, lpeg.C, lpeg.S
+local type, next = type, next
-local statusinfo, n, registered = { }, 0, { }
+local ostype = os.type
+local collapsepath = file.collapsepath
-statistics = statistics or { }
+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)
-statistics.enable = true
-statistics.threshold = 0.05
+local report_expansions = logs.reporter("resolvers","expansions")
--- timing functions
+local resolvers = resolvers
-local clock = os.gettimeofday or os.clock
+-- 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
+-- past this every time. See data-obs.lua for the gsub variant.
-local notimer
+-- {a,b,c,d}
+-- a,b,c/{p,q,r},d
+-- a,b,c/{p,q,r}/d/{x,y,z}//
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a{b,c}{d,e}f
+-- {a,b,c,d}
+-- {a,b,c/{p,q,r},d}
+-- {a,b,c/{p,q,r}/d/{x,y,z}//}
+-- {a,b,c/{p,q/{x,y,z}},d/{p,q,r}}
+-- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}}
+-- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}
-function statistics.hastimer(instance)
- return instance and instance.starttime
+local function f_first(a,b)
+ local t, n = { }, 0
+ for s in gmatch(b,"[^,]+") do
+ n = n + 1 ; t[n] = a .. s
+ end
+ return concat(t,",")
end
-function statistics.resettiming(instance)
- if not instance then
- notimer = { timing = 0, loadtime = 0 }
- else
- instance.timing, instance.loadtime = 0, 0
+local function f_second(a,b)
+ local t, n = { }, 0
+ for s in gmatch(a,"[^,]+") do
+ n = n + 1 ; t[n] = s .. b
end
+ return concat(t,",")
end
-function statistics.starttiming(instance)
- if not instance then
- notimer = { }
- instance = notimer
- end
- local it = instance.timing
- if not it then
- it = 0
- end
- if it == 0 then
- instance.starttime = clock()
- if not instance.loadtime then
- instance.loadtime = 0
+local function f_both(a,b)
+ local t, n = { }, 0
+ for sa in gmatch(a,"[^,]+") do
+ for sb in gmatch(b,"[^,]+") do
+ n = n + 1 ; t[n] = sa .. sb
end
- else
---~ logs.report("system","nested timing (%s)",tostring(instance))
end
- instance.timing = it + 1
+ return concat(t,",")
end
-function statistics.stoptiming(instance, report)
- if not instance then
- instance = notimer
- end
- if instance then
- local it = instance.timing
- if it > 1 then
- instance.timing = it - 1
- else
- local starttime = instance.starttime
- if starttime then
- local stoptime = clock()
- local loadtime = stoptime - starttime
- instance.stoptime = stoptime
- instance.loadtime = instance.loadtime + loadtime
- if report then
- statistics.report("load time %0.3f",loadtime)
- end
- instance.timing = 0
- return loadtime
+local left = P("{")
+local right = P("}")
+local var = P((1 - S("{}" ))^0)
+local set = P((1 - S("{},"))^0)
+local other = P(1)
+
+local l_first = Cs( ( Cc("{") * (C(set) * left * C(var) * right / f_first) * Cc("}") + other )^0 )
+local l_second = Cs( ( Cc("{") * (left * C(var) * right * C(set) / f_second) * Cc("}") + other )^0 )
+local l_both = Cs( ( Cc("{") * (left * C(var) * right * left * C(var) * right / f_both) * Cc("}") + other )^0 )
+local l_rest = Cs( ( left * var * (left/"") * var * (right/"") * var * right + other )^0 )
+
+local stripper_1 = lpeg.stripper ("{}@")
+local replacer_1 = lpeg.replacer { { ",}", ",@}" }, { "{,", "{@," }, }
+
+local function splitpathexpr(str, newlist, validate) -- I couldn't resist lpegging it (nice exercise).
+ if trace_expansions then
+ report_expansions("expanding variable '%s'",str)
+ end
+ local t, ok, done = newlist or { }, false, false
+ local n = #t
+ str = lpegmatch(replacer_1,str)
+ repeat local old = str
+ repeat local old = str ; str = lpegmatch(l_first, str) until old == str
+ repeat local old = str ; str = lpegmatch(l_second,str) until old == str
+ repeat local old = str ; str = lpegmatch(l_both, str) until old == str
+ repeat local old = str ; str = lpegmatch(l_rest, str) until old == str
+ until old == str -- or not find(str,"{")
+ str = lpegmatch(stripper_1,str)
+ if validate then
+ for s in gmatch(str,"[^,]+") do
+ s = validate(s)
+ if s then
+ n = n + 1 ; t[n] = s
end
end
+ else
+ for s in gmatch(str,"[^,]+") do
+ n = n + 1 ; t[n] = s
+ end
end
- return 0
+ if trace_expansions then
+ for k=1,#t do
+ report_expansions("% 4i: %s",k,t[k])
+ end
+ end
+ return t
end
-function statistics.elapsedtime(instance)
- if not instance then
- instance = notimer
- end
- return format("%0.3f",(instance and instance.loadtime) or 0)
+-- We could make the previous one public.
+
+local function validate(s)
+ s = collapsepath(s) -- already keeps the //
+ return s ~= "" and not find(s,"^!*unset/*$") and s
end
-function statistics.elapsedindeed(instance)
- if not instance then
- instance = notimer
+resolvers.validatedpath = validate -- keeps the trailing //
+
+function resolvers.expandedpathfromlist(pathlist)
+ local newlist = { }
+ for k=1,#pathlist do
+ splitpathexpr(pathlist[k],newlist,validate)
end
- local t = (instance and instance.loadtime) or 0
- return t > statistics.threshold
+ return newlist
end
-function statistics.elapsedseconds(instance,rest) -- returns nil if 0 seconds
- if statistics.elapsedindeed(instance) then
- return format("%s seconds %s", statistics.elapsedtime(instance),rest or "")
+local cleanup = lpeg.replacer {
+ { "!" , "" },
+ { "\\" , "/" },
+}
+
+local homedir
+
+function resolvers.cleanpath(str)
+ if not homedir then
+ homedir = lpegmatch(cleanup,environment.homedir or "")
+ if homedir == string.char(127) 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 find(str,"~") then
+ return "" -- special case
+ else
+ return str and lpegmatch(cleanup,str)
+ end
+ end
+ else
+ cleanup = lpeg.replacer {
+ { "!" , "" },
+ { "\\" , "/" },
+ { "~" , homedir },
+ }
+ function resolvers.cleanpath(str)
+ return str and lpegmatch(cleanup,str)
+ end
+ end
end
+ return resolvers.cleanpath(str)
end
--- general function
+-- This one strips quotes and funny tokens.
-function statistics.register(tag,fnc)
- if statistics.enable and type(fnc) == "function" then
- local rt = registered[tag] or (#statusinfo + 1)
- statusinfo[rt] = { tag, fnc }
- registered[tag] = rt
- if #tag > n then n = #tag end
- end
+local expandhome = P("~") / "$HOME" -- environment.homedir
+
+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
+)
+
+function resolvers.checkedvariable(str) -- assumes str is a string
+ return lpegmatch(stripper,str) or str
end
-function statistics.show(reporter)
- if statistics.enable then
- if not reporter then reporter = function(tag,data,n) texio.write_nl(tag .. " " .. data) end end
- -- this code will move
- local register = statistics.register
- register("luatex banner", function()
- return string.lower(status.banner)
- end)
- register("control sequences", function()
- return format("%s of %s", status.cs_count, status.hash_size+status.hash_extra)
- end)
- register("callbacks", function()
- local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0
- return format("direct: %s, indirect: %s, total: %s", total-indirect, indirect, total)
- end)
- register("current memory usage", statistics.memused)
- register("runtime",statistics.runtime)
--- --
- for i=1,#statusinfo do
- local s = statusinfo[i]
- local r = s[2]()
- if r then
- reporter(s[1],r,n)
+-- The path splitter:
+
+-- A config (optionally) has the paths split in tables. Internally
+-- we join them and split them after the expansion has taken place. This
+-- is more convenient.
+
+local cache = { }
+
+---- splitter = Ct(lpeg.splitat(S(ostype == "windows" and ";" or ":;"))) -- maybe add ,
+local splitter = Ct(lpeg.splitat(";")) -- as we move towards urls, prefixes and use tables we no longer do :
+
+local backslashswapper = lpeg.replacer("\\","/")
+
+local function splitconfigurationpath(str) -- beware, this can be either a path or a { specification }
+ if str then
+ local found = cache[str]
+ if not found then
+ if str == "" then
+ found = { }
+ else
+ local split = lpegmatch(splitter,lpegmatch(backslashswapper,str)) -- can be combined
+ found = { }
+ local noffound = 0
+ for i=1,#split do
+ local s = split[i]
+ if not find(s,"^{*unset}*") then
+ noffound = noffound + 1
+ found[noffound] = s
+ end
+ end
+ if trace_expansions then
+ report_expansions("splitting path specification '%s'",str)
+ for k=1,noffound do
+ report_expansions("% 4i: %s",k,found[k])
+ end
+ end
+ cache[str] = found
end
end
- texio.write_nl("") -- final newline
- statistics.enable = false
+ return found
end
end
-function statistics.show_job_stat(tag,data,n)
- texio.write_nl(format("%-15s: %s - %s","mkiv lua stats",tag:rpadd(n," "),data))
-end
+resolvers.splitconfigurationpath = splitconfigurationpath
-function statistics.memused() -- no math.round yet -)
- local round = math.round or math.floor
- return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000))
+function resolvers.splitpath(str)
+ if type(str) == 'table' then
+ return str
+ else
+ return splitconfigurationpath(str)
+ end
end
-if statistics.runtime then
- -- already loaded and set
-elseif luatex and luatex.starttime then
- statistics.starttime = luatex.starttime
- statistics.loadtime = 0
- statistics.timing = 0
-else
- statistics.starttiming(statistics)
+function resolvers.joinpath(str)
+ if type(str) == 'table' then
+ return file.joinpath(str)
+ else
+ return str
+ end
end
-function statistics.runtime()
- statistics.stoptiming(statistics)
- return statistics.formatruntime(statistics.elapsedtime(statistics))
-end
+-- The next function scans directories and returns a hash where the
+-- entries are either strings or tables.
-function statistics.formatruntime(runtime)
- return format("%s seconds", statistics.elapsedtime(statistics))
-end
+-- starting with . or .. etc or funny char
-function statistics.timed(action,report)
- local timer = { }
- report = report or logs.simple
- statistics.starttiming(timer)
- action()
- statistics.stoptiming(timer)
- report("total runtime: %s",statistics.elapsedtime(timer))
-end
--- where, not really the best spot for this:
-commands = commands or { }
-local timer
+local weird = P(".")^1 + lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
-function commands.resettimer()
- statistics.resettiming(timer)
- statistics.starttiming(timer)
+local attributes, directory = lfs.attributes, lfs.dir
+
+local function scan(files,spec,path,n,m,r)
+ local full = (path == "" and spec) or (spec .. path .. '/')
+ local dirs, nofdirs = { }, 0
+ for name in directory(full) do
+ if not lpegmatch(weird,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 }
+ else
+ f[#f+1] = path
+ end
+ else -- probably unique anyway
+ files[name] = path
+ local lower = lower(name)
+ if name ~= lower then
+ files["remap:"..lower] = name
+ r = r + 1
+ end
+ end
+ elseif mode == 'directory' then
+ m = m + 1
+ 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, n, m, r = scan(files,spec,dirs[i],n,m,r)
+ end
+ end
+ return files, n, m, r
end
-function commands.elapsedtime()
- statistics.stoptiming(timer)
- tex.sprint(statistics.elapsedtime(timer))
+function resolvers.scanfiles(path,branch)
+ if trace_locating then
+ report_expansions("scanning path '%s', branch '%s'",path, branch or path)
+ end
+ local realpath = resolvers.resolve(path) -- no shortcut
+ 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)
+ end
+ return files
end
-commands.resettimer()
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['trac-log'] = {
+if not modules then modules = { } end modules ['data-env'] = {
version = 1.001,
- comment = "companion to trac-log.mkiv",
+ 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"
+ license = "see context related readme files",
}
--- this is old code that needs an overhaul
+local lower, gsub = string.lower, string.gsub
---~ io.stdout:setvbuf("no")
---~ io.stderr:setvbuf("no")
+local resolvers = resolvers
-local write_nl, write = texio.write_nl or print, texio.write or io.write
-local format, gmatch = string.format, string.gmatch
-local texcount = tex and tex.count
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+local fileextname = file.extname
+
+local formats = allocate()
+local suffixes = allocate()
+local dangerous = allocate()
+local suffixmap = allocate()
+
+resolvers.formats = formats
+resolvers.suffixes = suffixes
+resolvers.dangerous = dangerous
+resolvers.suffixmap = suffixmap
+
+local relations = allocate { -- todo: handlers also here
+ core = {
+ ofm = { -- will become obsolete
+ names = { "ofm", "omega font metric", "omega font metrics" },
+ variable = 'OFMFONTS',
+ suffixes = { 'ofm', 'tfm' },
+ },
+ ovf = { -- will become obsolete
+ names = { "ovf", "omega virtual font", "omega virtual fonts" },
+ variable = 'OVFFONTS',
+ suffixes = { 'ovf', 'vf' },
+ },
+ tfm = {
+ names = { "tfm", "tex font metric", "tex font metrics" },
+ variable = 'TFMFONTS',
+ suffixes = { 'tfm' },
+ },
+ vf = {
+ names = { "vf", "virtual font", "virtual fonts" },
+ variable = 'VFFONTS',
+ suffixes = { 'vf' },
+ },
+ otf = {
+ names = { "otf", "opentype", "opentype font", "opentype fonts"},
+ variable = 'OPENTYPEFONTS',
+ suffixes = { 'otf' },
+ },
+ ttf = {
+ names = { "ttf", "truetype", "truetype font", "truetype fonts", "truetype collection", "truetype collections", "truetype dictionary", "truetype dictionaries" },
+ variable = 'TTFONTS',
+ suffixes = { 'ttf', 'ttc', 'dfont' },
+ },
+ afm = {
+ names = { "afm", "adobe font metric", "adobe font metrics" },
+ variable = "AFMFONTS",
+ suffixes = { "afm" },
+ },
+ pfb = {
+ names = { "pfb", "type1", "type 1", "type1 font", "type 1 font", "type1 fonts", "type 1 fonts" },
+ variable = 'T1FONTS',
+ suffixes = { 'pfb', 'pfa' },
+ },
+ fea = {
+ names = { "fea", "font feature", "font features", "font feature file", "font feature files" },
+ variable = 'FONTFEATURES',
+ suffixes = { 'fea' },
+ },
+ cid = {
+ names = { "cid", "cid map", "cid maps", "cid file", "cid files" },
+ variable = 'FONTCIDMAPS',
+ suffixes = { 'cid', 'cidmap' },
+ },
+ fmt = {
+ names = { "fmt", "format", "tex format" },
+ variable = 'TEXFORMATS',
+ suffixes = { 'fmt' },
+ },
+ mem = { -- will become obsolete
+ names = { 'mem', "metapost format" },
+ variable = 'MPMEMS',
+ suffixes = { 'mem' },
+ },
+ mp = {
+ names = { "mp" },
+ variable = 'MPINPUTS',
+ suffixes = { 'mp' },
+ },
+ tex = {
+ names = { "tex" },
+ variable = 'TEXINPUTS',
+ suffixes = { 'tex', "mkiv", "mkiv", "mkii" },
+ },
+ icc = {
+ names = { "icc", "icc profile", "icc profiles" },
+ variable = 'ICCPROFILES',
+ suffixes = { 'icc' },
+ },
+ texmfscripts = {
+ names = { "texmfscript", "texmfscripts", "script", "scripts" },
+ variable = 'TEXMFSCRIPTS',
+ suffixes = { 'rb', 'pl', 'py' },
+ },
+ lua = {
+ names = { "lua" },
+ variable = 'LUAINPUTS',
+ suffixes = { 'lua', 'luc', 'tma', 'tmc' },
+ },
+ lib = {
+ names = { "lib" },
+ variable = 'CLUAINPUTS',
+ suffixes = os.libsuffix and { os.libsuffix } or { 'dll', 'so' },
+ },
+ bib = {
+ names = { 'bib' },
+ suffixes = { 'bib' },
+ },
+ bst = {
+ names = { 'bst' },
+ suffixes = { 'bst' },
+ },
+ fontconfig = {
+ names = { 'fontconfig', 'fontconfig file', 'fontconfig files' },
+ variable = 'FONTCONFIG_PATH',
+ },
+ },
+ obsolete = {
+ enc = {
+ names = { "enc", "enc files", "enc file", "encoding files", "encoding file" },
+ variable = 'ENCFONTS',
+ suffixes = { 'enc' },
+ },
+ map = {
+ names = { "map", "map files", "map file" },
+ variable = 'TEXFONTMAPS',
+ suffixes = { 'map' },
+ },
+ lig = {
+ names = { "lig files", "lig file", "ligature file", "ligature files" },
+ variable = 'LIGFONTS',
+ suffixes = { 'lig' },
+ },
+ opl = {
+ names = { "opl" },
+ variable = 'OPLFONTS',
+ suffixes = { 'opl' },
+ },
+ ovp = {
+ names = { "ovp" },
+ variable = 'OVPFONTS',
+ suffixes = { 'ovp' },
+ },
+ },
+ kpse = { -- subset
+ base = {
+ names = { 'base', "metafont format" },
+ variable = 'MFBASES',
+ suffixes = { 'base', 'bas' },
+ },
+ cmap = {
+ names = { 'cmap', 'cmap files', 'cmap file' },
+ variable = 'CMAPFONTS',
+ suffixes = { 'cmap' },
+ },
+ cnf = {
+ names = { 'cnf' },
+ suffixes = { 'cnf' },
+ },
+ web = {
+ names = { 'web' },
+ suffixes = { 'web', 'ch' }
+ },
+ cweb = {
+ names = { 'cweb' },
+ suffixes = { 'w', 'web', 'ch' },
+ },
+ gf = {
+ names = { 'gf' },
+ suffixes = { '<resolution>gf' },
+ },
+ mf = {
+ names = { 'mf' },
+ variable = 'MFINPUTS',
+ suffixes = { 'mf' },
+ },
+ mft = {
+ names = { 'mft' },
+ suffixes = { 'mft' },
+ },
+ pk = {
+ names = { 'pk' },
+ suffixes = { '<resolution>pk' },
+ },
+ },
+}
-if texlua then
- write_nl = print
- write = io.write
+resolvers.relations = relations
+
+-- formats: maps a format onto a variable
+
+function resolvers.updaterelations()
+ for category, categories in next, relations do
+ for name, relation in next, categories do
+ local rn = relation.names
+ local rv = relation.variable
+ local rs = relation.suffixes
+ if rn and rv then
+ for i=1,#rn do
+ local rni = lower(gsub(rn[i]," ",""))
+ formats[rni] = rv
+ if rs then
+ suffixes[rni] = rs
+ for i=1,#rs do
+ local rsi = rs[i]
+ suffixmap[rsi] = rni
+ end
+ end
+ end
+ end
+ if rs then
+ end
+ end
+ end
end
---[[ldx--
-<p>This is a prelude to a more extensive logging module. For the sake
-of parsing log files, in addition to the standard logging we will
-provide an <l n='xml'/> structured file. Actually, any logging that
-is hooked into callbacks will be \XML\ by default.</p>
---ldx]]--
+resolvers.updaterelations() -- push this in the metatable -> newindex
+
+local function simplified(t,k)
+ return rawget(t,lower(gsub(k," ","")))
+end
-logs = logs or { }
-logs.xml = logs.xml or { }
-logs.tex = logs.tex or { }
+setmetatableindex(formats, simplified)
+setmetatableindex(suffixes, simplified)
+setmetatableindex(suffixmap, simplified)
---[[ldx--
-<p>This looks pretty ugly but we need to speed things up a bit.</p>
---ldx]]--
+-- A few accessors, mostly for command line tool.
-logs.moreinfo = [[
-more information about ConTeXt and the tools that come with it can be found at:
+function resolvers.suffixofformat(str)
+ local s = suffixes[str]
+ return s and s[1] or ""
+end
-maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
-webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
-wiki : http://contextgarden.net
-]]
+function resolvers.suffixofformat(str)
+ return suffixes[str] or { }
+end
-logs.levels = {
- ['error'] = 1,
- ['warning'] = 2,
- ['info'] = 3,
- ['debug'] = 4,
-}
+for name, format in next, formats do
+ dangerous[name] = true -- still needed ?
+end
-logs.functions = {
- 'report', 'start', 'stop', 'push', 'pop', 'line', 'direct',
- 'start_run', 'stop_run',
- 'start_page_number', 'stop_page_number',
- 'report_output_pages', 'report_output_log',
- 'report_tex_stat', 'report_job_stat',
- 'show_open', 'show_close', 'show_load',
-}
+-- because vf searching is somewhat dangerous, we want to prevent
+-- too liberal searching esp because we do a lookup on the current
+-- path anyway; only tex (or any) is safe
-logs.tracers = {
-}
+dangerous.tex = nil
-logs.level = 0
-logs.mode = string.lower((os.getenv("MTX.LOG.MODE") or os.getenv("MTX_LOG_MODE") or "tex"))
-function logs.set_level(level)
- logs.level = logs.levels[level] or level
-end
+-- more helpers
-function logs.set_method(method)
- for _, v in next, logs.functions do
- logs[v] = logs[method][v] or function() end
- end
+function resolvers.formatofvariable(str)
+ return formats[str] or ''
end
--- tex logging
+function resolvers.formatofsuffix(str) -- of file
+ return suffixmap[fileextname(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc)
+end
-function logs.tex.report(category,fmt,...) -- new
- if fmt then
- write_nl(category .. " | " .. format(fmt,...))
- else
- write_nl(category .. " |")
- end
+function resolvers.variableofformat(str)
+ return formats[str] or ''
end
-function logs.tex.line(fmt,...) -- new
- if fmt then
- write_nl(format(fmt,...))
- else
- write_nl("")
+function resolvers.variableofformatorsuffix(str)
+ local v = formats[str]
+ if v then
+ return v
+ end
+ v = suffixmap[fileextname(str)]
+ if v then
+ return formats[v]
end
+ return ''
end
---~ function logs.tex.start_page_number()
---~ local real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
---~ if real > 0 then
---~ if user > 0 then
---~ if sub > 0 then
---~ write(format("[%s.%s.%s",real,user,sub))
---~ else
---~ write(format("[%s.%s",real,user))
---~ end
---~ else
---~ write(format("[%s",real))
---~ end
---~ else
---~ write("[-")
---~ end
---~ end
---~ function logs.tex.stop_page_number()
---~ write("]")
---~ end
-local real, user, sub
+end -- of closure
-function logs.tex.start_page_number()
- real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-tmp'] = {
+ version = 1.100,
+ 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"
+}
+
+--[[ldx--
+<p>This module deals with caching data. It sets up the paths and
+implements loaders and savers for tables. Best is to set the
+following variable. When not set, the usual paths will be
+checked. Personally I prefer the (users) temporary path.</p>
+
+</code>
+TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
+</code>
+
+<p>Currently we do no locking when we write files. This is no real
+problem because most caching involves fonts and the chance of them
+being written at the same time is small. We also need to extend
+luatools with a recache feature.</p>
+--ldx]]--
+
+local format, lower, gsub, concat = string.format, string.lower, string.gsub, table.concat
+local mkdirs, isdir = dir.mkdirs, lfs.isdir
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
+
+local report_caches = logs.reporter("resolvers","caches")
+local report_resolvers = logs.reporter("resolvers","caching")
+
+local resolvers = resolvers
+
+-- intermezzo
+
+local directive_cleanup = false directives.register("system.compile.cleanup", function(v) directive_cleanup = v end)
+local directive_strip = true directives.register("system.compile.strip", function(v) directive_strip = v end)
+
+local compile = utilities.lua.compile
+
+function utilities.lua.compile(luafile,lucfile,cleanup,strip)
+ if cleanup == nil then cleanup = directive_cleanup end
+ if strip == nil then strip = directive_strip end
+ return compile(luafile,lucfile,cleanup,strip)
end
-function logs.tex.stop_page_number()
- if real > 0 then
- if user > 0 then
- if sub > 0 then
- logs.report("pages", "flushing realpage %s, userpage %s, subpage %s",real,user,sub)
- else
- logs.report("pages", "flushing realpage %s, userpage %s",real,user)
+-- end of intermezzo
+
+caches = caches or { }
+local caches = caches
+
+caches.base = caches.base or "luatex-cache"
+caches.more = caches.more or "context"
+caches.direct = false -- true is faster but may need huge amounts of memory
+caches.tree = false
+caches.force = true
+caches.ask = false
+caches.relocate = false
+caches.defaults = { "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
+
+local writable, readables, usedreadables = nil, { }, { }
+
+-- we could use a metatable for writable and readable but not yet
+
+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")
+ if texmfcaches then
+ for k=1,#texmfcaches do
+ local cachepath = texmfcaches[k]
+ if cachepath ~= "" then
+ cachepath = resolvers.resolve(cachepath)
+ cachepath = resolvers.cleanpath(cachepath)
+ cachepath = file.collapsepath(cachepath)
+ local valid = isdir(cachepath)
+ if valid then
+ if file.is_readable(cachepath) then
+ readables[#readables+1] = cachepath
+ if not writable and file.is_writable(cachepath) then
+ writable = cachepath
+ end
+ end
+ elseif not writable and caches.force then
+ local cacheparent = file.dirname(cachepath)
+ if file.is_writable(cacheparent) then
+ if not caches.ask or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then
+ mkdirs(cachepath)
+ if isdir(cachepath) and file.is_writable(cachepath) then
+ report_caches("created: %s",cachepath)
+ writable = cachepath
+ readables[#readables+1] = cachepath
+ end
+ end
+ end
+ end
end
- else
- logs.report("pages", "flushing realpage %s",real)
+ end
+ end
+ -- As a last resort we check some temporary paths but this time we don't
+ -- create them.
+ local texmfcaches = caches.defaults
+ if texmfcaches then
+ for k=1,#texmfcaches do
+ local cachepath = texmfcaches[k]
+ cachepath = resolvers.expansion(cachepath) -- was getenv
+ if cachepath ~= "" then
+ cachepath = resolvers.resolve(cachepath)
+ cachepath = resolvers.cleanpath(cachepath)
+ local valid = isdir(cachepath)
+ if valid and file.is_readable(cachepath) then
+ if not writable and file.is_writable(cachepath) then
+ readables[#readables+1] = cachepath
+ writable = cachepath
+ break
+ end
+ end
+ end
+ end
+ end
+ -- Some extra checking. If we have no writable or readable path then we simply
+ -- quit.
+ if not writable then
+ report_caches("fatal error: there is no valid writable cache path defined")
+ os.exit()
+ elseif #readables == 0 then
+ report_caches("fatal error: there is no valid readable cache path defined")
+ os.exit()
+ end
+ -- why here
+ writable = dir.expandname(resolvers.cleanpath(writable)) -- just in case
+ -- moved here
+ local base, more, tree = caches.base, caches.more, caches.tree or caches.treehash() -- we have only one writable tree
+ if tree then
+ caches.tree = tree
+ writable = mkdirs(writable,base,more,tree)
+ for i=1,#readables do
+ readables[i] = file.join(readables[i],base,more,tree)
end
else
- logs.report("pages", "flushing page")
+ writable = mkdirs(writable,base,more)
+ for i=1,#readables do
+ readables[i] = file.join(readables[i],base,more)
+ end
+ end
+ -- end
+ if trace_cache then
+ for i=1,#readables do
+ report_caches("using readable path '%s' (order %s)",readables[i],i)
+ end
+ report_caches("using writable path '%s'",writable)
+ end
+ identify = function()
+ return writable, readables
end
- io.flush()
+ return writable, readables
end
-logs.tex.report_job_stat = statistics.show_job_stat
+function caches.usedpaths()
+ local writable, readables = identify()
+ if #readables > 1 then
+ local result = { }
+ for i=1,#readables do
+ local readable = readables[i]
+ if usedreadables[i] or readable == writable then
+ result[#result+1] = format("readable: '%s' (order %s)",readable,i)
+ end
+ end
+ result[#result+1] = format("writable: '%s'",writable)
+ return result
+ else
+ return writable
+ end
+end
--- xml logging
+function caches.configfiles()
+ return table.concat(resolvers.instance.specification,";")
+end
-function logs.xml.report(category,fmt,...) -- new
- if fmt then
- write_nl(format("<r category='%s'>%s</r>",category,format(fmt,...)))
- else
- write_nl(format("<r category='%s'/>",category))
+function caches.hashed(tree)
+ tree = gsub(tree,"\\$","/")
+ tree = gsub(tree,"/+$","")
+ tree = lower(tree)
+ local hash = md5.hex(tree)
+ if trace_cache or trace_locating then
+ report_caches("hashing tree %s, hash %s",tree,hash)
end
+ return hash
end
-function logs.xml.line(fmt,...) -- new
- if fmt then
- write_nl(format("<r>%s</r>",format(fmt,...)))
+
+function caches.treehash()
+ local tree = caches.configfiles()
+ if not tree or tree == "" then
+ return false
else
- write_nl("<r/>")
+ return caches.hashed(tree)
end
end
-function logs.xml.start() if logs.level > 0 then tw("<%s>" ) end end
-function logs.xml.stop () if logs.level > 0 then tw("</%s>") end end
-function logs.xml.push () if logs.level > 0 then tw("<!-- ") end end
-function logs.xml.pop () if logs.level > 0 then tw(" -->" ) end end
+local r_cache, w_cache = { }, { } -- normally w in in r but who cares
-function logs.xml.start_run()
- write_nl("<?xml version='1.0' standalone='yes'?>")
- write_nl("<job>") -- xmlns='www.pragma-ade.com/luatex/schemas/context-job.rng'
- write_nl("")
-end
-
-function logs.xml.stop_run()
- write_nl("</job>")
+local function getreadablepaths(...) -- we can optimize this as we have at most 2 tags
+ local tags = { ... }
+ local hash = concat(tags,"/")
+ local done = r_cache[hash]
+ if not done then
+ local writable, readables = identify() -- exit if not found
+ if #tags > 0 then
+ done = { }
+ for i=1,#readables do
+ done[i] = file.join(readables[i],...)
+ end
+ else
+ done = readables
+ end
+ r_cache[hash] = done
+ end
+ return done
end
-function logs.xml.start_page_number()
- write_nl(format("<p real='%s' page='%s' sub='%s'", texcount.realpageno, texcount.userpageno, texcount.subpageno))
+local function getwritablepath(...)
+ local tags = { ... }
+ local hash = concat(tags,"/")
+ local done = w_cache[hash]
+ if not done then
+ local writable, readables = identify() -- exit if not found
+ if #tags > 0 then
+ done = mkdirs(writable,...)
+ else
+ done = writable
+ end
+ w_cache[hash] = done
+ end
+ return done
end
-function logs.xml.stop_page_number()
- write("/>")
- write_nl("")
-end
+caches.getreadablepaths = getreadablepaths
+caches.getwritablepath = getwritablepath
-function logs.xml.report_output_pages(p,b)
- write_nl(format("<v k='pages' v='%s'/>", p))
- write_nl(format("<v k='bytes' v='%s'/>", b))
- write_nl("")
+function caches.getfirstreadablefile(filename,...)
+ local rd = getreadablepaths(...)
+ for i=1,#rd do
+ local path = rd[i]
+ local fullname = file.join(path,filename)
+ if file.is_readable(fullname) then
+ usedreadables[i] = true
+ return fullname, path
+ end
+ end
+ return caches.setfirstwritablefile(filename,...)
end
-function logs.xml.report_output_log()
+function caches.setfirstwritablefile(filename,...)
+ local wr = getwritablepath(...)
+ local fullname = file.join(wr,filename)
+ return fullname, wr
end
-function logs.xml.report_tex_stat(k,v)
- texiowrite_nl("log","<v k='"..k.."'>"..tostring(v).."</v>")
+function caches.define(category,subcategory) -- for old times sake
+ return function()
+ return getwritablepath(category,subcategory)
+ end
end
-local level = 0
-
-function logs.xml.show_open(name)
- level = level + 1
- texiowrite_nl(format("<f l='%s' n='%s'>",level,name))
+function caches.setluanames(path,name)
+ return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
end
-function logs.xml.show_close(name)
- texiowrite("</f> ")
- level = level - 1
+function caches.loaddata(readables,name)
+ if type(readables) == "string" then
+ readables = { readables }
+ end
+ for i=1,#readables do
+ local path = readables[i]
+ local tmaname, tmcname = caches.setluanames(path,name)
+ local loader = loadfile(tmcname) or loadfile(tmaname)
+ if loader then
+ loader = loader()
+ collectgarbage("step")
+ return loader
+ end
+ end
+ return false
end
-function logs.xml.show_load(name)
- texiowrite_nl(format("<f l='%s' n='%s'/>",level+1,name))
+function caches.is_writable(filepath,filename)
+ local tmaname, tmcname = caches.setluanames(filepath,filename)
+ return file.is_writable(tmaname)
end
---
-
-local name, banner = 'report', 'context'
+local saveoptions = { compact = true }
-local function report(category,fmt,...)
- if fmt then
- write_nl(format("%s | %s: %s",name,category,format(fmt,...)))
- elseif category then
- write_nl(format("%s | %s",name,category))
+function caches.savedata(filepath,filename,data,raw)
+ local tmaname, tmcname = caches.setluanames(filepath,filename)
+ local reduce, simplify = true, true
+ if raw then
+ reduce, simplify = false, false
+ end
+ data.cache_uuid = os.uuid()
+ if caches.direct then
+ file.savedata(tmaname,table.serialize(data,true,saveoptions))
else
- write_nl(format("%s |",name))
+ table.tofile(tmaname,data,true,saveoptions)
end
+ utilities.lua.compile(tmaname,tmcname)
end
-local function simple(fmt,...)
- if fmt then
- write_nl(format("%s | %s",name,format(fmt,...)))
- else
- write_nl(format("%s |",name))
- end
+-- moved from data-res:
+
+local content_state = { }
+
+function caches.contentstate()
+ return content_state or { }
end
-function logs.setprogram(_name_,_banner_,_verbose_)
- name, banner = _name_, _banner_
- if _verbose_ then
- trackers.enable("resolvers.locating")
- end
- logs.set_method("tex")
- logs.report = report -- also used in libraries
- logs.simple = simple -- only used in scripts !
- if utils then
- utils.report = simple
+function caches.loadcontent(cachename,dataname)
+ local name = caches.hashed(cachename)
+ local full, path = caches.getfirstreadablefile(name ..".lua","trees")
+ local filename = file.join(path,name)
+ local blob = loadfile(filename .. ".luc") or loadfile(filename .. ".lua")
+ if blob then
+ local data = blob()
+ if data and data.content then
+ if data.type == dataname then
+ if data.version == resolvers.cacheversion then
+ content_state[#content_state+1] = data.uuid
+ if trace_locating then
+ report_resolvers("loading '%s' for '%s' from '%s'",dataname,cachename,filename)
+ end
+ return data.content
+ else
+ report_resolvers("skipping '%s' for '%s' from '%s' (version mismatch)",dataname,cachename,filename)
+ end
+ else
+ report_resolvers("skipping '%s' for '%s' from '%s' (datatype mismatch)",dataname,cachename,filename)
+ end
+ elseif trace_locating then
+ report_resolvers("skipping '%s' for '%s' from '%s' (no content)",dataname,cachename,filename)
+ end
+ elseif trace_locating then
+ report_resolvers("skipping '%s' for '%s' from '%s' (invalid file)",dataname,cachename,filename)
end
- logs.verbose = _verbose_
end
-function logs.setverbose(what)
- if what then
- trackers.enable("resolvers.locating")
- else
- trackers.disable("resolvers.locating")
+function caches.collapsecontent(content)
+ for k, v in next, content do
+ if type(v) == "table" and #v == 1 then
+ content[k] = v[1]
+ end
end
- logs.verbose = what or false
end
-function logs.extendbanner(_banner_,_verbose_)
- banner = banner .. " | ".. _banner_
- if _verbose_ ~= nil then
- logs.setverbose(what)
+function caches.savecontent(cachename,dataname,content)
+ local name = caches.hashed(cachename)
+ local full, path = caches.setfirstwritablefile(name ..".lua","trees")
+ local filename = file.join(path,name) -- is full
+ local luaname, lucname = filename .. ".lua", filename .. ".luc"
+ if trace_locating then
+ report_resolvers("preparing '%s' for '%s'",dataname,cachename)
+ end
+ local data = {
+ type = dataname,
+ root = cachename,
+ version = resolvers.cacheversion,
+ date = os.date("%Y-%m-%d"),
+ time = os.date("%H:%M:%S"),
+ content = content,
+ uuid = os.uuid(),
+ }
+ local ok = io.savedata(luaname,table.serialize(data,true))
+ if ok then
+ if trace_locating then
+ report_resolvers("category '%s', cachename '%s' saved in '%s'",dataname,cachename,luaname)
+ end
+ if utilities.lua.compile(luaname,lucname) then
+ if trace_locating then
+ report_resolvers("'%s' compiled to '%s'",dataname,lucname)
+ end
+ return true
+ else
+ if trace_locating then
+ report_resolvers("compiling failed for '%s', deleting file '%s'",dataname,lucname)
+ end
+ os.remove(lucname)
+ end
+ elseif trace_locating then
+ report_resolvers("unable to save '%s' in '%s' (access error)",dataname,luaname)
end
end
-logs.verbose = false
-logs.report = logs.tex.report
-logs.simple = logs.tex.report
-function logs.reportlines(str) -- todo: <lines></lines>
- for line in gmatch(str,"(.-)[\n\r]") do
- logs.report(line)
- end
-end
+end -- of closure
-function logs.reportline() -- for scripts too
- logs.report()
-end
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-met'] = {
+ version = 1.100,
+ 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 find, format = string.find, string.format
+local sequenced = table.sequenced
+local addurlscheme, urlhashed = url.addscheme, url.hashed
+
+local trace_locating = false
+
+trackers.register("resolvers.locating", function(v) trace_methods = v end)
+trackers.register("resolvers.methods", function(v) trace_methods = v end)
+
+
+local report_methods = logs.reporter("resolvers","methods")
-logs.simpleline = logs.reportline
+local allocate = utilities.storage.allocate
-function logs.reportbanner() -- for scripts too
- logs.report(banner)
+local resolvers = resolvers
+
+local registered = { }
+
+local function splitmethod(filename) -- todo: filetype in specification
+ if not filename then
+ return { scheme = "unknown", original = filename }
+ end
+ if type(filename) == "table" then
+ return filename -- already split
+ end
+ filename = file.collapsepath(filename)
+ if not find(filename,"://") then
+ return { scheme = "file", path = filename, original = filename, filename = filename }
+ end
+ local specification = url.hashed(filename)
+ if not specification.scheme or specification.scheme == "" then
+ return { scheme = "file", path = filename, original = filename, filename = filename }
+ else
+ return specification
+ end
end
-function logs.help(message,option)
- logs.reportbanner()
- logs.reportline()
- logs.reportlines(message)
- local moreinfo = logs.moreinfo or ""
- if moreinfo ~= "" and option ~= "nomoreinfo" then
- logs.reportline()
- logs.reportlines(moreinfo)
+resolvers.splitmethod = splitmethod -- bad name but ok
+
+-- the second argument is always analyzed (saves time later on) and the original
+-- gets passed as original but also as argument
+
+local function methodhandler(what,first,...) -- filename can be nil or false
+ local method = registered[what]
+ if method then
+ local how, namespace = method.how, method.namespace
+ if how == "uri" or how == "url" then
+ local specification = splitmethod(first)
+ local scheme = specification.scheme
+ local resolver = namespace and namespace[scheme]
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, scheme=%s, argument=%s",what,how,scheme,first)
+ end
+ return resolver(specification,...)
+ else
+ resolver = namespace.default or namespace.file
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, default, argument=%s",what,how,first)
+ end
+ return resolver(specification,...)
+ elseif trace_methods then
+ report_methods("resolver: method=%s, how=%s, no handler",what,how)
+ end
+ end
+ elseif how == "tag" then
+ local resolver = namespace and namespace[first]
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, tag=%s",what,how,first)
+ end
+ return resolver(...)
+ else
+ resolver = namespace.default or namespace.file
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, default",what,how)
+ end
+ return resolver(...)
+ elseif trace_methods then
+ report_methods("resolver: method=%s, how=%s, unknown",what,how)
+ end
+ end
+ end
+ else
+ report_methods("resolver: method=%s, unknown",what)
end
end
-logs.set_level('error')
-logs.set_method('tex')
+resolvers.methodhandler = methodhandler
-function logs.system(whereto,process,jobname,category,...)
- for i=1,10 do
- local f = io.open(whereto,"a")
- if f then
- f:write(format("%s %s => %s => %s => %s\r",os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...)))
- f:close()
- break
+function resolvers.registermethod(name,namespace,how)
+ registered[name] = { how = how or "tag", namespace = namespace }
+ namespace["byscheme"] = function(scheme,filename,...)
+ if scheme == "file" then
+ return methodhandler(name,filename,...)
else
- sleep(0.1)
+ return methodhandler(name,addurlscheme(filename,scheme),...)
end
end
end
---~ local syslogname = "oeps.xxx"
---~
---~ for i=1,10 do
---~ logs.system(syslogname,"context","test","fonts","font %s recached due to newer version (%s)","blabla","123")
---~ end
+local concatinators = allocate { notfound = file.join } -- concatinate paths
+local locators = allocate { notfound = function() end } -- locate databases
+local hashers = allocate { notfound = function() end } -- load databases
+local generators = allocate { notfound = function() end } -- generate databases
-function logs.fatal(where,...)
- logs.report(where,"fatal error: %s, aborting now",format(...))
- os.exit()
-end
+resolvers.concatinators = concatinators
+resolvers.locators = locators
+resolvers.hashers = hashers
+resolvers.generators = generators
+
+local registermethod = resolvers.registermethod
+
+registermethod("concatinators",concatinators,"tag")
+registermethod("locators", locators, "uri")
+registermethod("hashers", hashers, "uri")
+registermethod("generators", generators, "uri")
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['data-inp'] = {
+if not modules then modules = { } end modules ['data-res'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -8196,981 +11083,510 @@ if not modules then modules = { } end modules ['data-inp'] = {
license = "see context related readme files",
}
--- After a few years using the code the large luat-inp.lua file
--- has been split up a bit. In the process some functionality was
--- dropped:
---
--- * support for reading lsr files
--- * selective scanning (subtrees)
--- * some public auxiliary functions were made private
---
--- TODO: os.getenv -> os.env[]
--- TODO: instances.[hashes,cnffiles,configurations,522]
--- TODO: check escaping in find etc, too much, too slow
-
--- This lib is multi-purpose and can be loaded again later on so that
--- additional functionality becomes available. We will split thislogs.report("fileio",
--- module in components once we're done with prototyping. This is the
--- first code I wrote for LuaTeX, so it needs some cleanup. Before changing
--- something in this module one can best check with Taco or Hans first; there
--- is some nasty trickery going on that relates to traditional kpse support.
-
--- To be considered: hash key lowercase, first entry in table filename
--- (any case), rest paths (so no need for optimization). Or maybe a
--- separate table that matches lowercase names to mixed case when
--- present. In that case the lower() cases can go away. I will do that
--- only when we run into problems with names ... well ... Iwona-Regular.
+-- In practice we will work within one tds tree, but i want to keep
+-- the option open to build tools that look at multiple trees, which is
+-- why we keep the tree specific data in a table. We used to pass the
+-- instance but for practical purposes we now avoid this and use a
+-- instance variable. We always have one instance active (sort of global).
--- Beware, loading and saving is overloaded in luat-tmp!
+-- todo: cache:/// home:///
local format, gsub, find, lower, upper, match, gmatch = string.format, string.gsub, string.find, string.lower, string.upper, string.match, string.gmatch
local concat, insert, sortedkeys = table.concat, table.insert, table.sortedkeys
-local next, type = next, type
-local lpegmatch = lpeg.match
+local next, type, rawget = next, type, rawget
+local os = os
-local trace_locating, trace_detail, trace_expansions = false, false, false
+local P, S, R, C, Cc, Cs, Ct, Carg = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Carg
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
-trackers.register("resolvers.locating", function(v) trace_locating = v end)
-trackers.register("resolvers.details", function(v) trace_detail = v end)
-trackers.register("resolvers.expansions", function(v) trace_expansions = v end) -- todo
+local filedirname = file.dirname
+local filebasename = file.basename
+local fileextname = file.extname
+local filejoin = file.join
+local collapsepath = file.collapsepath
+local joinpath = file.joinpath
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
-if not resolvers then
- resolvers = {
- suffixes = { },
- formats = { },
- dangerous = { },
- suffixmap = { },
- alternatives = { },
- locators = { }, -- locate databases
- hashers = { }, -- load databases
- generators = { }, -- generate databases
- }
-end
+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 resolvers = resolvers
+local report_resolving = logs.reporter("resolvers","resolving")
-resolvers.locators .notfound = { nil }
-resolvers.hashers .notfound = { nil }
-resolvers.generators.notfound = { nil }
-
-resolvers.cacheversion = '1.0.1'
-resolvers.cnfname = 'texmf.cnf'
-resolvers.luaname = 'texmfcnf.lua'
-resolvers.homedir = os.env[os.type == "windows" and 'USERPROFILE'] or os.env['HOME'] or '~'
-resolvers.cnfdefault = '{$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}'
-
-local dummy_path_expr = "^!*unset/*$"
-
-local formats = resolvers.formats
-local suffixes = resolvers.suffixes
-local dangerous = resolvers.dangerous
-local suffixmap = resolvers.suffixmap
-local alternatives = resolvers.alternatives
-
-formats['afm'] = 'AFMFONTS' suffixes['afm'] = { 'afm' }
-formats['enc'] = 'ENCFONTS' suffixes['enc'] = { 'enc' }
-formats['fmt'] = 'TEXFORMATS' suffixes['fmt'] = { 'fmt' }
-formats['map'] = 'TEXFONTMAPS' suffixes['map'] = { 'map' }
-formats['mp'] = 'MPINPUTS' suffixes['mp'] = { 'mp' }
-formats['ocp'] = 'OCPINPUTS' suffixes['ocp'] = { 'ocp' }
-formats['ofm'] = 'OFMFONTS' suffixes['ofm'] = { 'ofm', 'tfm' }
-formats['otf'] = 'OPENTYPEFONTS' suffixes['otf'] = { 'otf' } -- 'ttf'
-formats['opl'] = 'OPLFONTS' suffixes['opl'] = { 'opl' }
-formats['otp'] = 'OTPINPUTS' suffixes['otp'] = { 'otp' }
-formats['ovf'] = 'OVFFONTS' suffixes['ovf'] = { 'ovf', 'vf' }
-formats['ovp'] = 'OVPFONTS' suffixes['ovp'] = { 'ovp' }
-formats['tex'] = 'TEXINPUTS' suffixes['tex'] = { 'tex' }
-formats['tfm'] = 'TFMFONTS' suffixes['tfm'] = { 'tfm' }
-formats['ttf'] = 'TTFONTS' suffixes['ttf'] = { 'ttf', 'ttc', 'dfont' }
-formats['pfb'] = 'T1FONTS' suffixes['pfb'] = { 'pfb', 'pfa' }
-formats['vf'] = 'VFFONTS' suffixes['vf'] = { 'vf' }
-
-formats['fea'] = 'FONTFEATURES' suffixes['fea'] = { 'fea' }
-formats['cid'] = 'FONTCIDMAPS' suffixes['cid'] = { 'cid', 'cidmap' }
-
-formats ['texmfscripts'] = 'TEXMFSCRIPTS' -- new
-suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -- 'lua'
-
-formats ['lua'] = 'LUAINPUTS' -- new
-suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' }
-
--- backward compatible ones
-
-alternatives['map files'] = 'map'
-alternatives['enc files'] = 'enc'
-alternatives['cid maps'] = 'cid' -- great, why no cid files
-alternatives['font feature files'] = 'fea' -- and fea files here
-alternatives['opentype fonts'] = 'otf'
-alternatives['truetype fonts'] = 'ttf'
-alternatives['truetype collections'] = 'ttc'
-alternatives['truetype dictionary'] = 'dfont'
-alternatives['type1 fonts'] = 'pfb'
-
--- obscure ones
-
-formats ['misc fonts'] = ''
-suffixes['misc fonts'] = { }
-
-formats ['sfd'] = 'SFDFONTS'
-suffixes ['sfd'] = { 'sfd' }
-alternatives['subfont definition files'] = 'sfd'
-
--- lib paths
-
-formats ['lib'] = 'CLUAINPUTS' -- new (needs checking)
-suffixes['lib'] = (os.libsuffix and { os.libsuffix }) or { 'dll', 'so' }
+local resolvers = resolvers
--- In practice we will work within one tds tree, but i want to keep
--- the option open to build tools that look at multiple trees, which is
--- why we keep the tree specific data in a table. We used to pass the
--- instance but for practical pusposes we now avoid this and use a
--- instance variable.
+local expandedpathfromlist = resolvers.expandedpathfromlist
+local checkedvariable = resolvers.checkedvariable
+local splitconfigurationpath = resolvers.splitconfigurationpath
+local methodhandler = resolvers.methodhandler
--- here we catch a few new thingies (todo: add these paths to context.tmf)
---
--- FONTFEATURES = .;$TEXMF/fonts/fea//
--- FONTCIDMAPS = .;$TEXMF/fonts/cid//
+local initializesetter = utilities.setters.initialize
--- we always have one instance active
+local ostype, osname, osenv, ossetenv, osgetenv = os.type, os.name, os.env, os.setenv, os.getenv
-resolvers.instance = resolvers.instance or nil -- the current one (slow access)
-local instance = resolvers.instance or nil -- the current one (fast access)
+resolvers.cacheversion = '1.0.1'
+resolvers.configbanner = ''
+resolvers.homedir = environment.homedir
+resolvers.criticalvars = allocate { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF", "TEXMF", "TEXOS" }
+resolvers.luacnfname = 'texmfcnf.lua'
+resolvers.luacnfstate = "unknown"
-function resolvers.newinstance()
+-- resolvers.luacnfspec = '{$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}' -- what a rubish path
+resolvers.luacnfspec = 'selfautoparent:{/texmf{-local,}{,/web2c},}}'
- -- store once, freeze and faster (once reset we can best use
- -- instance.environment) maybe better have a register suffix
- -- function
- for k, v in next, suffixes do
- for i=1,#v do
- local vi = v[i]
- if vi then
- suffixmap[vi] = k
- end
- end
- end
- -- because vf searching is somewhat dangerous, we want to prevent
- -- too liberal searching esp because we do a lookup on the current
- -- path anyway; only tex (or any) is safe
+local unset_variable = "unset"
- for k, v in next, formats do
- dangerous[k] = true
- end
- dangerous.tex = nil
+local formats = resolvers.formats
+local suffixes = resolvers.suffixes
+local dangerous = resolvers.dangerous
+local suffixmap = resolvers.suffixmap
- -- the instance
+resolvers.defaultsuffixes = { "tex" } -- "mkiv", "cld" -- too tricky
- local newinstance = {
- rootpath = '',
- treepath = '',
- progname = 'context',
- engine = 'luatex',
- format = '',
- environment = { },
- variables = { },
- expansions = { },
- files = { },
- remap = { },
- configuration = { },
- setup = { },
- order = { },
- found = { },
- foundintrees = { },
- kpsevars = { },
- hashes = { },
- cnffiles = { },
- luafiles = { },
- lists = { },
- remember = true,
- diskcache = true,
- renewcache = false,
- scandisk = true,
- cachepath = nil,
- loaderror = false,
- sortdata = false,
- savelists = true,
- cleanuppaths = true,
- allresults = false,
- pattern = nil, -- lists
- data = { }, -- only for loading
- force_suffixes = true,
- fakepaths = { },
- }
+resolvers.instance = resolvers.instance or nil -- the current one (slow access)
+local instance = resolvers.instance or nil -- the current one (fast access)
- local ne = newinstance.environment
+-- An instance has an environment (coming from the outside, kept raw), variables
+-- (coming from the configuration file), and expansions (variables with nested
+-- variables replaced). One can push something into the outer environment and
+-- its internal copy, but only the later one will be the raw unprefixed variant.
- for k,v in next, os.env do
- ne[k] = resolvers.bare_variable(v)
+function resolvers.setenv(key,value,raw)
+ if instance then
+ -- this one will be consulted first when we stay inside
+ -- the current environment
+ instance.environment[key] = value
+ -- 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))
end
+end
- return newinstance
+-- Beware we don't want empty here as this one can be called early on
+-- and therefore we use rawget.
+local function getenv(key)
+ local value = rawget(instance.environment,key)
+ if value and value ~= "" then
+ return value
+ else
+ local e = osgetenv(key)
+ return e ~= nil and e ~= "" and checkedvariable(e) or ""
+ end
end
-function resolvers.setinstance(someinstance)
- instance = someinstance
- resolvers.instance = someinstance
- return someinstance
-end
+resolvers.getenv = getenv
+resolvers.env = getenv
-function resolvers.reset()
- return resolvers.setinstance(resolvers.newinstance())
-end
+-- We are going to use some metatable trickery where we backtrack from
+-- expansion to variable to environment.
-local function reset_hashes()
- instance.lists = { }
- instance.found = { }
+local function resolve(k)
+ return instance.expansions[k]
end
-local function check_configuration() -- not yet ok, no time for debugging now
- if os.env["OSFONTDIR"] then
- -- ok
- elseif os.type == "windows" then
- os.setenv("OSFONTDIR","c:/windows/fonts//")
- elseif os.type == "macosx" then
- os.setenv("OSFONTDIR","$HOME/Library/Fonts//;/Library/Fonts//;/System/Library/Fonts//")
- end
-end
+local dollarstripper = lpeg.stripper("$")
+local inhibitstripper = P("!")^0 * Cs(P(1)^0)
+local backslashswapper = lpeg.replacer("\\","/")
-function resolvers.bare_variable(str) -- assumes str is a string
- return (gsub(str,"\s*([\"\']?)(.+)%1\s*", "%2"))
-end
+local somevariable = P("$") / ""
+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 )
-function resolvers.settrace(n) -- no longer number but: 'locating' or 'detail'
- if n then
- trackers.disable("resolvers.*")
- trackers.enable("resolvers."..n)
- end
-end
+local cleaner = P("\\") / "/" + P(";") * S("!{}/\\")^0 * P(";")^1 / ";"
+local variablecleaner = Cs((cleaner + P(1))^0)
-resolvers.settrace(os.getenv("MTX_INPUT_TRACE"))
+local somevariable = R("az","AZ","09","__","--")^1 / resolve
+local variable = (P("$")/"") * (somevariable + (P("{")/"") * somevariable * (P("}")/""))
+local variableresolver = Cs((variable + P(1))^0)
-function resolvers.osenv(key)
- local ie = instance.environment
- local value = ie[key]
- if value == nil then
- -- local e = os.getenv(key)
- local e = os.env[key]
- if e == nil then
- -- value = "" -- false
- else
- value = resolvers.bare_variable(e)
- end
- ie[key] = value
- end
- return value or ""
+local function expandedvariable(var)
+ return lpegmatch(variableexpander,var) or var
end
-function resolvers.env(key)
- return instance.environment[key] or resolvers.osenv(key)
-end
+function resolvers.newinstance() -- todo: all vars will become lowercase and alphanum only
---
+ if trace_locating then
+ report_resolving("creating instance")
+ end
-local function expand_vars(lst) -- simple vars
- local variables, env = instance.variables, resolvers.env
- local function resolve(a)
- return variables[a] or env(a)
- end
- for k=1,#lst do
- lst[k] = gsub(lst[k],"%$([%a%d%_%-]+)",resolve)
- end
-end
+ local environment, variables, expansions, order = allocate(), allocate(), allocate(), allocate()
-local function expanded_var(var) -- simple vars
- local function resolve(a)
- return instance.variables[a] or resolvers.env(a)
- end
- return (gsub(var,"%$([%a%d%_%-]+)",resolve))
-end
+ local newinstance = {
+ environment = environment,
+ variables = variables,
+ expansions = expansions,
+ order = order,
+ files = allocate(),
+ setups = allocate(),
+ found = allocate(),
+ foundintrees = allocate(),
+ hashes = allocate(),
+ hashed = allocate(),
+ specification = allocate(),
+ lists = allocate(),
+ data = allocate(), -- only for loading
+ fakepaths = allocate(),
+ remember = true,
+ diskcache = true,
+ renewcache = false,
+ loaderror = false,
+ savelists = true,
+ pattern = nil, -- lists
+ force_suffixes = true,
+ }
-local function entry(entries,name)
- if name and (name ~= "") then
- name = gsub(name,'%$','')
- local result = entries[name..'.'..instance.progname] or entries[name]
- if result then
- return result
- else
- result = resolvers.env(name)
- if result then
- instance.variables[name] = result
- resolvers.expand_variables()
- return instance.expansions[name] or ""
+ setmetatableindex(variables,function(t,k)
+ local v
+ for i=1,#order do
+ v = order[i][k]
+ if v ~= nil then
+ t[k] = v
+ return v
end
end
- end
- return ""
-end
-
-local function is_entry(entries,name)
- if name and name ~= "" then
- name = gsub(name,'%$','')
- return (entries[name..'.'..instance.progname] or entries[name]) ~= nil
- else
- return false
- end
-end
-
--- {a,b,c,d}
--- a,b,c/{p,q,r},d
--- a,b,c/{p,q,r}/d/{x,y,z}//
--- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
--- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
--- a{b,c}{d,e}f
--- {a,b,c,d}
--- {a,b,c/{p,q,r},d}
--- {a,b,c/{p,q,r}/d/{x,y,z}//}
--- {a,b,c/{p,q/{x,y,z}},d/{p,q,r}}
--- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}}
--- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}
+ if v == nil then
+ v = ""
+ end
+ t[k] = v
+ return v
+ end)
--- this one is better and faster, but it took me a while to realize
--- that this kind of replacement is cleaner than messy parsing and
--- fuzzy concatenating we can probably gain a bit with selectively
--- applying lpeg, but experiments with lpeg parsing this proved not to
--- work that well; the parsing is ok, but dealing with the resulting
--- table is a pain because we need to work inside-out recursively
+ setmetatableindex(environment, function(t,k)
+ local v = osgetenv(k)
+ if v == nil then
+ v = variables[k]
+ end
+ if v ~= nil then
+ v = checkedvariable(v) or ""
+ end
+ v = resolvers.repath(v) -- for taco who has a : separated osfontdir
+ t[k] = v
+ return v
+ end)
-local function do_first(a,b)
- local t = { }
- for s in gmatch(b,"[^,]+") do t[#t+1] = a .. s end
- return "{" .. concat(t,",") .. "}"
-end
+ setmetatableindex(expansions, function(t,k)
+ local v = environment[k]
+ if type(v) == "string" then
+ v = lpegmatch(variableresolver,v)
+ v = lpegmatch(variablecleaner,v)
+ end
+ t[k] = v
+ return v
+ end)
-local function do_second(a,b)
- local t = { }
- for s in gmatch(a,"[^,]+") do t[#t+1] = s .. b end
- return "{" .. concat(t,",") .. "}"
-end
+ return newinstance
-local function do_both(a,b)
- local t = { }
- for sa in gmatch(a,"[^,]+") do
- for sb in gmatch(b,"[^,]+") do
- t[#t+1] = sa .. sb
- end
- end
- return "{" .. concat(t,",") .. "}"
end
-local function do_three(a,b,c)
- return a .. b.. c
+function resolvers.setinstance(someinstance) -- only one instance is active
+ instance = someinstance
+ resolvers.instance = someinstance
+ return someinstance
end
-local function splitpathexpr(str, t, validate)
- -- no need for further optimization as it is only called a
- -- few times, we can use lpeg for the sub
- if trace_expansions then
- logs.report("fileio","expanding variable '%s'",str)
- end
- t = t or { }
- str = gsub(str,",}",",@}")
- str = gsub(str,"{,","{@,")
- -- str = "@" .. str .. "@"
- local ok, done
- while true do
- done = false
- while true do
- str, ok = gsub(str,"([^{},]+){([^{}]+)}",do_first)
- if ok > 0 then done = true else break end
- end
- while true do
- str, ok = gsub(str,"{([^{}]+)}([^{},]+)",do_second)
- if ok > 0 then done = true else break end
- end
- while true do
- str, ok = gsub(str,"{([^{}]+)}{([^{}]+)}",do_both)
- if ok > 0 then done = true else break end
- end
- str, ok = gsub(str,"({[^{}]*){([^{}]+)}([^{}]*})",do_three)
- if ok > 0 then done = true end
- if not done then break end
- end
- str = gsub(str,"[{}]", "")
- str = gsub(str,"@","")
- if validate then
- for s in gmatch(str,"[^,]+") do
- s = validate(s)
- if s then t[#t+1] = s end
- end
- else
- for s in gmatch(str,"[^,]+") do
- t[#t+1] = s
- end
- end
- if trace_expansions then
- for k=1,#t do
- logs.report("fileio","% 4i: %s",k,t[k])
- end
- end
- return t
+function resolvers.reset()
+ return resolvers.setinstance(resolvers.newinstance())
end
-local function expanded_path_from_list(pathlist) -- maybe not a list, just a path
- -- a previous version fed back into pathlist
- local newlist, ok = { }, false
- for k=1,#pathlist do
- if find(pathlist[k],"[{}]") then
- ok = true
- break
- end
- end
- if ok then
- local function validate(s)
- s = file.collapse_path(s)
- return s ~= "" and not find(s,dummy_path_expr) and s
- end
- for k=1,#pathlist do
- splitpathexpr(pathlist[k],newlist,validate)
- end
- else
- for k=1,#pathlist do
- for p in gmatch(pathlist[k],"([^,]+)") do
- p = file.collapse_path(p)
- if p ~= "" then newlist[#newlist+1] = p end
- end
- end
- end
- return newlist
+local function reset_hashes()
+ instance.lists = { }
+ instance.found = { }
end
--- we follow a rather traditional approach:
---
--- (1) texmf.cnf given in TEXMFCNF
--- (2) texmf.cnf searched in default variable
---
--- also we now follow the stupid route: if not set then just assume *one*
--- cnf file under texmf (i.e. distribution)
+local slash = P("/")
-local args = environment and environment.original_arguments or arg -- this needs a cleanup
+local pathexpressionpattern = Cs (
+ Cc("^") * (
+ Cc("%") * S(".-")
+ + slash^2 * P(-1) / "/.*"
+ + slash^2 / "/.-/"
+ + (1-slash) * P(-1) * Cc("/")
+ + P(1)
+ )^1 * Cc("$") -- yes or no $
+)
-resolvers.ownbin = resolvers.ownbin or args[-2] or arg[-2] or args[-1] or arg[-1] or arg[0] or "luatex"
-resolvers.ownbin = gsub(resolvers.ownbin,"\\","/")
+local cache = { }
-function resolvers.getownpath()
- local ownpath = resolvers.ownpath or os.selfdir
- if not ownpath or ownpath == "" or ownpath == "unset" then
- ownpath = args[-1] or arg[-1]
- ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
- if not ownpath or ownpath == "" then
- ownpath = args[-0] or arg[-0]
- ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
- end
- local binary = resolvers.ownbin
- if not ownpath or ownpath == "" then
- ownpath = ownpath and file.dirname(binary)
- end
- if not ownpath or ownpath == "" then
- if os.binsuffix ~= "" then
- binary = file.replacesuffix(binary,os.binsuffix)
- end
- for p in gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
- local b = file.join(p,binary)
- if lfs.isfile(b) then
- -- we assume that after changing to the path the currentdir function
- -- resolves to the real location and use this side effect here; this
- -- trick is needed because on the mac installations use symlinks in the
- -- path instead of real locations
- local olddir = lfs.currentdir()
- if lfs.chdir(p) then
- local pp = lfs.currentdir()
- if trace_locating and p ~= pp then
- logs.report("fileio","following symlink '%s' to '%s'",p,pp)
- end
- ownpath = pp
- lfs.chdir(olddir)
- else
- if trace_locating then
- logs.report("fileio","unable to check path '%s'",p)
- end
- ownpath = p
- end
- break
- end
- end
- end
- if not ownpath or ownpath == "" then
- ownpath = "."
- logs.report("fileio","forcing fallback ownpath .")
- elseif trace_locating then
- logs.report("fileio","using ownpath '%s'",ownpath)
+local function makepathexpression(str)
+ if str == "." then
+ return "^%./$"
+ else
+ local c = cache[str]
+ if not c then
+ c = lpegmatch(pathexpressionpattern,str)
+ cache[str] = c
end
+ return c
end
- resolvers.ownpath = ownpath
- function resolvers.getownpath()
- return resolvers.ownpath
- end
- return ownpath
end
-local own_places = { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF" }
-
-local function identify_own()
- local ownpath = resolvers.getownpath() or dir.current()
- local ie = instance.environment
- if ownpath then
- if resolvers.env('SELFAUTOLOC') == "" then os.env['SELFAUTOLOC'] = file.collapse_path(ownpath) end
- if resolvers.env('SELFAUTODIR') == "" then os.env['SELFAUTODIR'] = file.collapse_path(ownpath .. "/..") end
- if resolvers.env('SELFAUTOPARENT') == "" then os.env['SELFAUTOPARENT'] = file.collapse_path(ownpath .. "/../..") end
- else
- logs.report("fileio","error: unable to locate ownpath")
- os.exit()
- end
- if resolvers.env('TEXMFCNF') == "" then os.env['TEXMFCNF'] = resolvers.cnfdefault end
- if resolvers.env('TEXOS') == "" then os.env['TEXOS'] = resolvers.env('SELFAUTODIR') end
- if resolvers.env('TEXROOT') == "" then os.env['TEXROOT'] = resolvers.env('SELFAUTOPARENT') end
+local function reportcriticalvariables()
if trace_locating then
- for i=1,#own_places do
- local v = own_places[i]
- logs.report("fileio","variable '%s' set to '%s'",v,resolvers.env(v) or "unknown")
+ for i=1,#resolvers.criticalvars do
+ local k = resolvers.criticalvars[i]
+ local v = resolvers.getenv(k) or "unknown" -- this one will not resolve !
+ report_resolving("variable '%s' set to '%s'",k,v)
end
+ report_resolving()
end
- identify_own = function() end
+ reportcriticalvariables = function() end
end
-function resolvers.identify_cnf()
- if #instance.cnffiles == 0 then
- -- fallback
- identify_own()
- -- the real search
- resolvers.expand_variables()
- local t = resolvers.split_path(resolvers.env('TEXMFCNF'))
- t = expanded_path_from_list(t)
- expand_vars(t) -- redundant
- local function locate(filename,list)
- for i=1,#t do
- local ti = t[i]
- local texmfcnf = file.collapse_path(file.join(ti,filename))
- if lfs.isfile(texmfcnf) then
- list[#list+1] = texmfcnf
+local function identify_configuration_files()
+ local specification = instance.specification
+ if #specification == 0 then
+ local cnfspec = getenv('TEXMFCNF')
+ if cnfspec == "" then
+ cnfspec = resolvers.luacnfspec
+ resolvers.luacnfstate = "default"
+ else
+ resolvers.luacnfstate = "environment"
+ end
+ reportcriticalvariables()
+ local cnfpaths = expandedpathfromlist(resolvers.splitpath(cnfspec))
+ local luacnfname = resolvers.luacnfname
+ for i=1,#cnfpaths do
+ local filename = collapsepath(filejoin(cnfpaths[i],luacnfname))
+ local realname = resolvers.resolve(filename)
+ if lfs.isfile(realname) then
+ specification[#specification+1] = filename
+ if trace_locating then
+ report_resolving("found configuration file '%s'",realname)
end
+ elseif trace_locating then
+ report_resolving("unknown configuration file '%s'",realname)
end
end
- locate(resolvers.luaname,instance.luafiles)
- locate(resolvers.cnfname,instance.cnffiles)
- end
-end
-
-local function load_cnf_file(fname)
- fname = resolvers.clean_path(fname)
- local lname = file.replacesuffix(fname,'lua')
- if lfs.isfile(lname) then
- local dname = file.dirname(fname) -- fname ?
- if not instance.configuration[dname] then
- resolvers.load_data(dname,'configuration',lname and file.basename(lname))
- instance.order[#instance.order+1] = instance.configuration[dname]
+ if trace_locating then
+ report_resolving()
end
- else
- f = io.open(fname)
- if f then
- if trace_locating then
- logs.report("fileio","loading configuration file %s", fname)
- end
- local line, data, n, k, v
- local dname = file.dirname(fname)
- if not instance.configuration[dname] then
- instance.configuration[dname] = { }
- instance.order[#instance.order+1] = instance.configuration[dname]
- end
- local data = instance.configuration[dname]
- while true do
- local line, n = f:read(), 0
- if line then
- while true do -- join lines
- line, n = gsub(line,"\\%s*$", "")
- if n > 0 then
- line = line .. f:read()
- else
- break
+ elseif trace_locating then
+ report_resolving("configuration files already identified")
+ end
+end
+
+local function load_configuration_files()
+ local specification = instance.specification
+ if #specification > 0 then
+ local luacnfname = resolvers.luacnfname
+ for i=1,#specification do
+ local filename = specification[i]
+ local pathname = filedirname(filename)
+ local filename = filejoin(pathname,luacnfname)
+ local realname = resolvers.resolve(filename) -- no shortcut
+ local blob = loadfile(realname)
+ if blob then
+ local setups = instance.setups
+ local data = blob()
+ data = data and data.content
+ if data then
+ if trace_locating then
+ report_resolving("loading configuration file '%s'",filename)
+ report_resolving()
+ end
+ local variables = data.variables or { }
+ local warning = false
+ for k, v in next, data do
+ local variant = type(v)
+ if variant == "table" then
+ initializesetter(filename,k,v)
+ elseif variables[k] == nil then
+ if trace_locating and not warning then
+ report_resolving("variables like '%s' in configuration file '%s' should move to the 'variables' subtable",
+ k,resolvers.resolve(filename))
+ warning = true
+ end
+ variables[k] = v
end
end
- if not find(line,"^[%%#]") then
- local l = gsub(line,"%s*%%.*$","")
- local k, v = match(l,"%s*(.-)%s*=%s*(.-)%s*$")
- if k and v and not data[k] then
- v = gsub(v,"[%%#].*",'')
- data[k] = gsub(v,"~","$HOME")
- instance.kpsevars[k] = true
+ setups[pathname] = variables
+ if resolvers.luacnfstate == "default" then
+ -- the following code is not tested
+ local cnfspec = variables["TEXMFCNF"]
+ if cnfspec then
+ if trace_locating then
+ report_resolving("reloading configuration due to TEXMF redefinition")
+ end
+ -- we push the value into the main environment (osenv) so
+ -- that it takes precedence over the default one and therefore
+ -- also over following definitions
+ resolvers.setenv('TEXMFCNF',cnfspec) -- resolves prefixes
+ -- we now identify and load the specified configuration files
+ instance.specification = { }
+ identify_configuration_files()
+ load_configuration_files()
+ -- we prevent further overload of the configuration variable
+ resolvers.luacnfstate = "configuration"
+ -- we quit the outer loop
+ break
end
end
- else
- break
- end
- end
- f:close()
- elseif trace_locating then
- logs.report("fileio","skipping configuration file '%s'", fname)
- end
- end
-end
-local function collapse_cnf_data() -- potential optimization: pass start index (setup and configuration are shared)
- local order = instance.order
- for i=1,#order do
- local c = order[i]
- for k,v in next, c do
- if not instance.variables[k] then
- if instance.environment[k] then
- instance.variables[k] = instance.environment[k]
else
- instance.kpsevars[k] = true
- instance.variables[k] = resolvers.bare_variable(v)
+ if trace_locating then
+ report_resolving("skipping configuration file '%s' (no content)",filename)
+ end
+ setups[pathname] = { }
+ instance.loaderror = true
end
+ elseif trace_locating then
+ report_resolving("skipping configuration file '%s' (no file)",filename)
end
- end
- end
-end
-
-function resolvers.load_cnf()
- local function loadoldconfigdata()
- local cnffiles = instance.cnffiles
- for i=1,#cnffiles do
- load_cnf_file(cnffiles[i])
- end
- end
- -- instance.cnffiles contain complete names now !
- -- we still use a funny mix of cnf and new but soon
- -- we will switch to lua exclusively as we only use
- -- the file to collect the tree roots
- if #instance.cnffiles == 0 then
- if trace_locating then
- logs.report("fileio","no cnf files found (TEXMFCNF may not be set/known)")
- end
- else
- local cnffiles = instance.cnffiles
- instance.rootpath = cnffiles[1]
- for k=1,#cnffiles do
- instance.cnffiles[k] = file.collapse_path(cnffiles[k])
- end
- for i=1,3 do
- instance.rootpath = file.dirname(instance.rootpath)
- end
- instance.rootpath = file.collapse_path(instance.rootpath)
- if instance.diskcache and not instance.renewcache then
- resolvers.loadoldconfig(instance.cnffiles)
+ instance.order[#instance.order+1] = instance.setups[pathname]
if instance.loaderror then
- loadoldconfigdata()
- resolvers.saveoldconfig()
- end
- else
- loadoldconfigdata()
- if instance.renewcache then
- resolvers.saveoldconfig()
+ break
end
end
- collapse_cnf_data()
- end
- check_configuration()
-end
-
-function resolvers.load_lua()
- if #instance.luafiles == 0 then
- -- yet harmless
- else
- instance.rootpath = instance.luafiles[1]
- local luafiles = instance.luafiles
- for k=1,#luafiles do
- instance.luafiles[k] = file.collapse_path(luafiles[k])
- end
- for i=1,3 do
- instance.rootpath = file.dirname(instance.rootpath)
- end
- instance.rootpath = file.collapse_path(instance.rootpath)
- resolvers.loadnewconfig()
- collapse_cnf_data()
- end
- check_configuration()
-end
-
--- database loading
-
-function resolvers.load_hash()
- resolvers.locatelists()
- if instance.diskcache and not instance.renewcache then
- resolvers.loadfiles()
- if instance.loaderror then
- resolvers.loadlists()
- resolvers.savefiles()
- end
- else
- resolvers.loadlists()
- if instance.renewcache then
- resolvers.savefiles()
- end
- end
-end
-
-function resolvers.append_hash(type,tag,name)
- if trace_locating then
- logs.report("fileio","hash '%s' appended",tag)
- end
- insert(instance.hashes, { ['type']=type, ['tag']=tag, ['name']=name } )
-end
-
-function resolvers.prepend_hash(type,tag,name)
- if trace_locating then
- logs.report("fileio","hash '%s' prepended",tag)
- end
- insert(instance.hashes, 1, { ['type']=type, ['tag']=tag, ['name']=name } )
-end
-
-function resolvers.extend_texmf_var(specification) -- crap, we could better prepend the hash
--- local t = resolvers.expanded_path_list('TEXMF') -- full expansion
- local t = resolvers.split_path(resolvers.env('TEXMF'))
- insert(t,1,specification)
- local newspec = concat(t,";")
- if instance.environment["TEXMF"] then
- instance.environment["TEXMF"] = newspec
- elseif instance.variables["TEXMF"] then
- instance.variables["TEXMF"] = newspec
- else
- -- weird
- end
- resolvers.expand_variables()
- reset_hashes()
-end
-
--- locators
-
-function resolvers.locatelists()
- local texmfpaths = resolvers.clean_path_list('TEXMF')
- for i=1,#texmfpaths do
- local path = texmfpaths[i]
- if trace_locating then
- logs.report("fileio","locating list of '%s'",path)
- end
- resolvers.locatedatabase(file.collapse_path(path))
- end
-end
-
-function resolvers.locatedatabase(specification)
- return resolvers.methodhandler('locators', specification)
-end
-
-function resolvers.locators.tex(specification)
- if specification and specification ~= '' and lfs.isdir(specification) then
- if trace_locating then
- logs.report("fileio","tex locator '%s' found",specification)
- end
- resolvers.append_hash('file',specification,filename)
elseif trace_locating then
- logs.report("fileio","tex locator '%s' not found",specification)
+ report_resolving("warning: no lua configuration files found")
end
end
--- hashers
-
-function resolvers.hashdatabase(tag,name)
- return resolvers.methodhandler('hashers',tag,name)
-end
+-- scheme magic ... database loading
-function resolvers.loadfiles()
- instance.loaderror = false
- instance.files = { }
+local function load_file_databases()
+ instance.loaderror, instance.files = false, allocate()
if not instance.renewcache then
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- resolvers.hashdatabase(hash.tag,hash.name)
+ resolvers.hashers.byscheme(hash.type,hash.name)
if instance.loaderror then break end
end
end
end
-function resolvers.hashers.tex(tag,name)
- resolvers.load_data(tag,'files')
-end
-
--- generators:
-
-function resolvers.loadlists()
- local hashes = instance.hashes
- for i=1,#hashes do
- resolvers.generatedatabase(hashes[i].tag)
- end
-end
-
-function resolvers.generatedatabase(specification)
- return resolvers.methodhandler('generators', specification)
-end
-
--- starting with . or .. etc or funny char
-
-local weird = lpeg.P(".")^1 + lpeg.anywhere(lpeg.S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
-
---~ local l_forbidden = lpeg.S("~`!#$%^&*()={}[]:;\"\'||\\/<>,?\n\r\t")
---~ local l_confusing = lpeg.P(" ")
---~ local l_character = lpeg.patterns.utf8
---~ local l_dangerous = lpeg.P(".")
-
---~ local l_normal = (l_character - l_forbidden - l_confusing - l_dangerous) * (l_character - l_forbidden - l_confusing^2)^0 * lpeg.P(-1)
---~ ----- l_normal = l_normal * lpeg.Cc(true) + lpeg.Cc(false)
-
---~ local function test(str)
---~ print(str,lpeg.match(l_normal,str))
---~ end
---~ test("ヒラギノ明朝 Pro W3")
---~ test("..ヒラギノ明朝 Pro W3")
---~ test(":ヒラギノ明朝 Pro W3;")
---~ test("ヒラギノ明朝 /Pro W3;")
---~ test("ヒラギノ明朝 Pro W3")
-
-function resolvers.generators.tex(specification)
- local tag = specification
- if trace_locating then
- logs.report("fileio","scanning path '%s'",specification)
- end
- instance.files[tag] = { }
- local files = instance.files[tag]
- local n, m, r = 0, 0, 0
- local spec = specification .. '/'
- local attributes = lfs.attributes
- local directory = lfs.dir
- local function action(path)
- local full
- if path then
- full = spec .. path .. '/'
- else
- full = spec
- end
- for name in directory(full) do
- if not lpegmatch(weird,name) then
- -- if lpegmatch(l_normal,name) then
- local mode = attributes(full..name,'mode')
- if mode == 'file' then
- if path then
- n = n + 1
- local f = files[name]
- if f then
- if type(f) == 'string' then
- files[name] = { f, path }
- else
- f[#f+1] = path
- end
- else -- probably unique anyway
- files[name] = path
- local lower = lower(name)
- if name ~= lower then
- files["remap:"..lower] = name
- r = r + 1
- end
- end
- end
- elseif mode == 'directory' then
- m = m + 1
- if path then
- action(path..'/'..name)
+local function locate_file_databases()
+ -- todo: cache:// and tree:// (runtime)
+ local texmfpaths = resolvers.expandedpathlist('TEXMF')
+ if #texmfpaths > 0 then
+ for i=1,#texmfpaths do
+ local path = collapsepath(texmfpaths[i])
+ local stripped = lpegmatch(inhibitstripper,path) -- the !! thing
+ if stripped ~= "" then
+ local runtime = stripped == path
+ path = resolvers.cleanpath(path)
+ local spec = resolvers.splitmethod(stripped)
+ if spec.scheme == "cache" or spec.scheme == "file" then
+ stripped = spec.path
+ elseif runtime and (spec.noscheme or spec.scheme == "file") then
+ stripped = "tree:///" .. stripped
+ end
+ if trace_locating then
+ if runtime then
+ report_resolving("locating list of '%s' (runtime)",path)
else
- action(name)
+ report_resolving("locating list of '%s' (cached)",path)
end
end
+ methodhandler('locators',stripped)
end
end
- end
- action()
- if trace_locating then
- logs.report("fileio","%s files found on %s directories with %s uppercase remappings",n,m,r)
+ if trace_locating then
+ report_resolving()
+ end
+ elseif trace_locating then
+ report_resolving("no texmf paths are defined (using TEXMF)")
end
end
--- savers, todo
-
-function resolvers.savefiles()
- resolvers.save_data('files')
+local function generate_file_databases()
+ local hashes = instance.hashes
+ for k=1,#hashes do
+ local hash = hashes[k]
+ methodhandler('generators',hash.name)
+ end
+ if trace_locating then
+ report_resolving()
+ end
end
--- A config (optionally) has the paths split in tables. Internally
--- we join them and split them after the expansion has taken place. This
--- is more convenient.
-
---~ local checkedsplit = string.checkedsplit
-
-local cache = { }
-
-local splitter = lpeg.Ct(lpeg.splitat(lpeg.S(os.type == "windows" and ";" or ":;")))
-
-local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
- local found = cache[str]
- if not found then
- if str == "" then
- found = { }
- else
- str = gsub(str,"\\","/")
---~ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
-local split = lpegmatch(splitter,str)
- found = { }
- for i=1,#split do
- local s = split[i]
- if not find(s,"^{*unset}*") then
- found[#found+1] = s
- end
- end
- if trace_expansions then
- logs.report("fileio","splitting path specification '%s'",str)
- for k=1,#found do
- logs.report("fileio","% 4i: %s",k,found[k])
- end
+local function save_file_databases() -- will become cachers
+ for i=1,#instance.hashes do
+ local hash = instance.hashes[i]
+ local cachename = hash.name
+ if hash.cache then
+ local content = instance.files[cachename]
+ caches.collapsecontent(content)
+ if trace_locating then
+ report_resolving("saving tree '%s'",cachename)
end
- cache[str] = found
+ caches.savecontent(cachename,"files",content)
+ elseif trace_locating then
+ report_resolving("not saving runtime tree '%s'",cachename)
end
end
- return found
end
-resolvers.split_kpse_path = split_kpse_path
-
-function resolvers.splitconfig()
- for i=1,#instance do
- local c = instance[i]
- for k,v in next, c do
- if type(v) == 'string' then
- local t = split_kpse_path(v)
- if #t > 1 then
- c[k] = t
- end
- end
+local function load_databases()
+ locate_file_databases()
+ if instance.diskcache and not instance.renewcache then
+ load_file_databases()
+ if instance.loaderror then
+ generate_file_databases()
+ save_file_databases()
+ end
+ else
+ generate_file_databases()
+ if instance.renewcache then
+ save_file_databases()
end
end
end
-function resolvers.joinconfig()
- local order = instance.order
- for i=1,#order do
- local c = order[i]
- for k,v in next, c do -- indexed?
- if type(v) == 'table' then
- c[k] = file.join_path(v)
- end
+function resolvers.appendhash(type,name,cache)
+ -- safeguard ... tricky as it's actually a bug when seen twice
+ if not instance.hashed[name] then
+ if trace_locating then
+ report_resolving("hash '%s' appended",name)
end
+ insert(instance.hashes, { type = type, name = name, cache = cache } )
+ instance.hashed[name] = cache
end
end
-function resolvers.split_path(str)
- if type(str) == 'table' then
- return str
- else
- return split_kpse_path(str)
+function resolvers.prependhash(type,name,cache)
+ -- safeguard ... tricky as it's actually a bug when seen twice
+ if not instance.hashed[name] then
+ if trace_locating then
+ report_resolving("hash '%s' prepended",name)
+ end
+ insert(instance.hashes, 1, { type = type, name = name, cache = cache } )
+ instance.hashed[name] = cache
end
end
-function resolvers.join_path(str)
- if type(str) == 'table' then
- return file.join_path(str)
+function resolvers.extendtexmfvariable(specification) -- crap, we could better prepend the hash
+ local t = resolvers.splitpath(getenv('TEXMF'))
+ insert(t,1,specification)
+ local newspec = concat(t,";")
+ if instance.environment["TEXMF"] then
+ instance.environment["TEXMF"] = newspec
+ elseif instance.variables["TEXMF"] then
+ instance.variables["TEXMF"] = newspec
else
- return str
+ -- weird
end
+ reset_hashes()
end
function resolvers.splitexpansions()
local ie = instance.expansions
for k,v in next, ie do
- local t, h, p = { }, { }, split_kpse_path(v)
+ local t, tn, h, p = { }, 0, { }, splitconfigurationpath(v)
for kk=1,#p do
local vv = p[kk]
if vv ~= "" and not h[vv] then
- t[#t+1] = vv
+ tn = tn + 1
+ t[tn] = vv
h[vv] = true
end
end
@@ -9184,343 +11600,92 @@ end
-- end of split/join code
-function resolvers.saveoldconfig()
- resolvers.splitconfig()
- resolvers.save_data('configuration')
- resolvers.joinconfig()
-end
-
-resolvers.configbanner = [[
--- This is a Luatex configuration file created by 'luatools.lua' or
--- 'luatex.exe' directly. For comment, suggestions and questions you can
--- contact the ConTeXt Development Team. This configuration file is
--- not copyrighted. [HH & TH]
-]]
-
-function resolvers.serialize(files)
- -- This version is somewhat optimized for the kind of
- -- tables that we deal with, so it's much faster than
- -- the generic serializer. This makes sense because
- -- luatools and mtxtools are called frequently. Okay,
- -- we pay a small price for properly tabbed tables.
- local t = { }
- local function dump(k,v,m) -- could be moved inline
- if type(v) == 'string' then
- return m .. "['" .. k .. "']='" .. v .. "',"
- elseif #v == 1 then
- return m .. "['" .. k .. "']='" .. v[1] .. "',"
- else
- return m .. "['" .. k .. "']={'" .. concat(v,"','").. "'},"
- end
- end
- t[#t+1] = "return {"
- if instance.sortdata then
- local sortedfiles = sortedkeys(files)
- for i=1,#sortedfiles do
- local k = sortedfiles[i]
- local fk = files[k]
- if type(fk) == 'table' then
- t[#t+1] = "\t['" .. k .. "']={"
- local sortedfk = sortedkeys(fk)
- for j=1,#sortedfk do
- local kk = sortedfk[j]
- t[#t+1] = dump(kk,fk[kk],"\t\t")
- end
- t[#t+1] = "\t},"
- else
- t[#t+1] = dump(k,fk,"\t")
- end
- end
- else
- for k, v in next, files do
- if type(v) == 'table' then
- t[#t+1] = "\t['" .. k .. "']={"
- for kk,vv in next, v do
- t[#t+1] = dump(kk,vv,"\t\t")
- end
- t[#t+1] = "\t},"
- else
- t[#t+1] = dump(k,v,"\t")
- end
- end
- end
- t[#t+1] = "}"
- return concat(t,"\n")
-end
-
-local data_state = { }
+-- we used to have 'files' and 'configurations' so therefore the following
+-- shared function
-function resolvers.data_state()
- return data_state or { }
-end
-
-function resolvers.save_data(dataname, makename) -- untested without cache overload
- for cachename, files in next, instance[dataname] do
- local name = (makename or file.join)(cachename,dataname)
- local luaname, lucname = name .. ".lua", name .. ".luc"
- if trace_locating then
- logs.report("fileio","preparing '%s' for '%s'",dataname,cachename)
- end
- for k, v in next, files do
- if type(v) == "table" and #v == 1 then
- files[k] = v[1]
- end
- end
- local data = {
- type = dataname,
- root = cachename,
- version = resolvers.cacheversion,
- date = os.date("%Y-%m-%d"),
- time = os.date("%H:%M:%S"),
- content = files,
- uuid = os.uuid(),
- }
- local ok = io.savedata(luaname,resolvers.serialize(data))
- if ok then
- if trace_locating then
- logs.report("fileio","'%s' saved in '%s'",dataname,luaname)
- end
- if utils.lua.compile(luaname,lucname,false,true) then -- no cleanup but strip
- if trace_locating then
- logs.report("fileio","'%s' compiled to '%s'",dataname,lucname)
- end
- else
- if trace_locating then
- logs.report("fileio","compiling failed for '%s', deleting file '%s'",dataname,lucname)
- end
- os.remove(lucname)
- end
- elseif trace_locating then
- logs.report("fileio","unable to save '%s' in '%s' (access error)",dataname,luaname)
- end
- end
-end
-
-function resolvers.load_data(pathname,dataname,filename,makename) -- untested without cache overload
- filename = ((not filename or (filename == "")) and dataname) or filename
- filename = (makename and makename(dataname,filename)) or file.join(pathname,filename)
- local blob = loadfile(filename .. ".luc") or loadfile(filename .. ".lua")
- if blob then
- local data = blob()
- if data and data.content and data.type == dataname and data.version == resolvers.cacheversion then
- data_state[#data_state+1] = data.uuid
- if trace_locating then
- logs.report("fileio","loading '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
- instance[dataname][pathname] = data.content
- else
- if trace_locating then
- logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
- instance[dataname][pathname] = { }
- instance.loaderror = true
- end
- elseif trace_locating then
- logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
-end
-
--- some day i'll use the nested approach, but not yet (actually we even drop
--- engine/progname support since we have only luatex now)
---
--- first texmfcnf.lua files are located, next the cached texmf.cnf files
---
--- return {
--- TEXMFBOGUS = 'effe checken of dit werkt',
--- }
-
-function resolvers.resetconfig()
- identify_own()
- instance.configuration, instance.setup, instance.order, instance.loaderror = { }, { }, { }, false
-end
-
-function resolvers.loadnewconfig()
- local luafiles = instance.luafiles
- for i=1,#luafiles do
- local cnf = luafiles[i]
- local pathname = file.dirname(cnf)
- local filename = file.join(pathname,resolvers.luaname)
- local blob = loadfile(filename)
- if blob then
- local data = blob()
- if data then
- if trace_locating then
- logs.report("fileio","loading configuration file '%s'",filename)
- end
- if true then
- -- flatten to variable.progname
- local t = { }
- for k, v in next, data do -- v = progname
- if type(v) == "string" then
- t[k] = v
- else
- for kk, vv in next, v do -- vv = variable
- if type(vv) == "string" then
- t[vv.."."..v] = kk
- end
- end
- end
- end
- instance['setup'][pathname] = t
- else
- instance['setup'][pathname] = data
- end
- else
- if trace_locating then
- logs.report("fileio","skipping configuration file '%s'",filename)
- end
- instance['setup'][pathname] = { }
- instance.loaderror = true
- end
- elseif trace_locating then
- logs.report("fileio","skipping configuration file '%s'",filename)
- end
- instance.order[#instance.order+1] = instance.setup[pathname]
- if instance.loaderror then break end
- end
-end
-
-function resolvers.loadoldconfig()
- if not instance.renewcache then
- local cnffiles = instance.cnffiles
- for i=1,#cnffiles do
- local cnf = cnffiles[i]
- local dname = file.dirname(cnf)
- resolvers.load_data(dname,'configuration')
- instance.order[#instance.order+1] = instance.configuration[dname]
- if instance.loaderror then break end
- end
- end
- resolvers.joinconfig()
-end
-
-function resolvers.expand_variables()
- local expansions, environment, variables = { }, instance.environment, instance.variables
- local env = resolvers.env
- instance.expansions = expansions
- local engine, progname = instance.engine, instance.progname
- if type(engine) ~= "string" then instance.engine, engine = "", "" end
- if type(progname) ~= "string" then instance.progname, progname = "", "" end
- if engine ~= "" then environment['engine'] = engine end
- if progname ~= "" then environment['progname'] = progname end
- for k,v in next, environment do
- local a, b = match(k,"^(%a+)%_(.*)%s*$")
- if a and b then
- expansions[a..'.'..b] = v
- else
- expansions[k] = v
- end
- end
- for k,v in next, environment do -- move environment to expansions
- if not expansions[k] then expansions[k] = v end
- end
- for k,v in next, variables do -- move variables to expansions
- if not expansions[k] then expansions[k] = v end
- end
- local busy = false
- local function resolve(a)
- busy = true
- return expansions[a] or env(a)
- end
- while true do
- busy = false
- for k,v in next, expansions do
- local s, n = gsub(v,"%$([%a%d%_%-]+)",resolve)
- local s, m = gsub(s,"%$%{([%a%d%_%-]+)%}",resolve)
- if n > 0 or m > 0 then
- expansions[k]= s
- end
- end
- if not busy then break end
- end
- for k,v in next, expansions do
- expansions[k] = gsub(v,"\\", '/')
- end
+function resolvers.datastate()
+ return caches.contentstate()
end
function resolvers.variable(name)
- return entry(instance.variables,name)
+ local name = name and lpegmatch(dollarstripper,name)
+ local result = name and instance.variables[name]
+ return result ~= nil and result or ""
end
function resolvers.expansion(name)
- return entry(instance.expansions,name)
-end
-
-function resolvers.is_variable(name)
- return is_entry(instance.variables,name)
-end
-
-function resolvers.is_expansion(name)
- return is_entry(instance.expansions,name)
+ local name = name and lpegmatch(dollarstripper,name)
+ local result = name and instance.expansions[name]
+ return result ~= nil and result or ""
end
-function resolvers.unexpanded_path_list(str)
+function resolvers.unexpandedpathlist(str)
local pth = resolvers.variable(str)
- local lst = resolvers.split_path(pth)
- return expanded_path_from_list(lst)
+ local lst = resolvers.splitpath(pth)
+ return expandedpathfromlist(lst)
end
-function resolvers.unexpanded_path(str)
- return file.join_path(resolvers.unexpanded_path_list(str))
+function resolvers.unexpandedpath(str)
+ return joinpath(resolvers.unexpandedpathlist(str))
end
-do -- no longer needed
-
- local done = { }
+local done = { }
- function resolvers.reset_extra_path()
- local ep = instance.extra_paths
- if not ep then
- ep, done = { }, { }
- instance.extra_paths = ep
- elseif #ep > 0 then
- instance.lists, done = { }, { }
- end
+function resolvers.resetextrapath()
+ local ep = instance.extra_paths
+ if not ep then
+ ep, done = { }, { }
+ instance.extra_paths = ep
+ elseif #ep > 0 then
+ instance.lists, done = { }, { }
end
+end
- function resolvers.register_extra_path(paths,subpaths)
- local ep = instance.extra_paths or { }
- local n = #ep
- if paths and paths ~= "" then
- if subpaths and subpaths ~= "" then
- for p in gmatch(paths,"[^,]+") do
- -- we gmatch each step again, not that fast, but used seldom
- for s in gmatch(subpaths,"[^,]+") do
- local ps = p .. "/" .. s
- if not done[ps] then
- ep[#ep+1] = resolvers.clean_path(ps)
- done[ps] = true
- end
- end
- end
- else
- for p in gmatch(paths,"[^,]+") do
- if not done[p] then
- ep[#ep+1] = resolvers.clean_path(p)
- done[p] = true
- end
- end
- end
- elseif subpaths and subpaths ~= "" then
- for i=1,n do
+function resolvers.registerextrapath(paths,subpaths)
+ local ep = instance.extra_paths or { }
+ local oldn = #ep
+ local newn = oldn
+ if paths and paths ~= "" then
+ if subpaths and subpaths ~= "" then
+ for p in gmatch(paths,"[^,]+") do
-- we gmatch each step again, not that fast, but used seldom
for s in gmatch(subpaths,"[^,]+") do
- local ps = ep[i] .. "/" .. s
+ local ps = p .. "/" .. s
if not done[ps] then
- ep[#ep+1] = resolvers.clean_path(ps)
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(ps)
done[ps] = true
end
end
end
+ else
+ for p in gmatch(paths,"[^,]+") do
+ if not done[p] then
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(p)
+ done[p] = true
+ end
+ end
end
- if #ep > 0 then
- instance.extra_paths = ep -- register paths
- end
- if #ep > n then
- instance.lists = { } -- erase the cache
+ elseif subpaths and subpaths ~= "" then
+ for i=1,oldn do
+ -- we gmatch each step again, not that fast, but used seldom
+ for s in gmatch(subpaths,"[^,]+") do
+ local ps = ep[i] .. "/" .. s
+ if not done[ps] then
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(ps)
+ done[ps] = true
+ end
+ end
end
end
-
+ if newn > 0 then
+ instance.extra_paths = ep -- register paths
+ end
+ if newn > oldn then
+ instance.lists = { } -- erase the cache
+ end
end
local function made_list(instance,list)
@@ -9528,14 +11693,15 @@ local function made_list(instance,list)
if not ep or #ep == 0 then
return list
else
- local done, new = { }, { }
+ 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
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
else
break
end
@@ -9546,7 +11712,8 @@ local function made_list(instance,list)
local v = ep[k]
if not done[v] then
done[v] = true
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
end
end
-- next the formal paths
@@ -9554,118 +11721,95 @@ local function made_list(instance,list)
local v = list[k]
if not done[v] then
done[v] = true
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
end
end
return new
end
end
-function resolvers.clean_path_list(str)
- local t = resolvers.expanded_path_list(str)
+function resolvers.cleanpathlist(str)
+ local t = resolvers.expandedpathlist(str)
if t then
for i=1,#t do
- t[i] = file.collapse_path(resolvers.clean_path(t[i]))
+ t[i] = collapsepath(resolvers.cleanpath(t[i]))
end
end
return t
end
-function resolvers.expand_path(str)
- return file.join_path(resolvers.expanded_path_list(str))
+function resolvers.expandpath(str)
+ return joinpath(resolvers.expandedpathlist(str))
end
-function resolvers.expanded_path_list(str)
+function resolvers.expandedpathlist(str)
if not str then
- return ep or { } -- ep ?
+ return { }
elseif instance.savelists then
- -- engine+progname hash
- str = gsub(str,"%$","")
+ str = lpegmatch(dollarstripper,str)
if not instance.lists[str] then -- cached
- local lst = made_list(instance,resolvers.split_path(resolvers.expansion(str)))
- instance.lists[str] = expanded_path_from_list(lst)
+ local lst = made_list(instance,resolvers.splitpath(resolvers.expansion(str)))
+ instance.lists[str] = expandedpathfromlist(lst)
end
return instance.lists[str]
else
- local lst = resolvers.split_path(resolvers.expansion(str))
- return made_list(instance,expanded_path_from_list(lst))
- end
-end
-
-function resolvers.expanded_path_list_from_var(str) -- brrr
- local tmp = resolvers.var_of_format_or_suffix(gsub(str,"%$",""))
- if tmp ~= "" then
- return resolvers.expanded_path_list(tmp)
- else
- return resolvers.expanded_path_list(str)
+ local lst = resolvers.splitpath(resolvers.expansion(str))
+ return made_list(instance,expandedpathfromlist(lst))
end
end
-function resolvers.expand_path_from_var(str)
- return file.join_path(resolvers.expanded_path_list_from_var(str))
+function resolvers.expandedpathlistfromvariable(str) -- brrr
+ str = lpegmatch(dollarstripper,str)
+ local tmp = resolvers.variableofformatorsuffix(str)
+ return resolvers.expandedpathlist(tmp ~= "" and tmp or str)
end
-function resolvers.format_of_var(str)
- return formats[str] or formats[alternatives[str]] or ''
-end
-function resolvers.format_of_suffix(str)
- return suffixmap[file.extname(str)] or 'tex'
+function resolvers.expandpathfromvariable(str)
+ return joinpath(resolvers.expandedpathlistfromvariable(str))
end
-function resolvers.variable_of_format(str)
- return formats[str] or formats[alternatives[str]] or ''
+function resolvers.expandbraces(str) -- output variable and brace expansion of STRING
+ local ori = resolvers.variable(str)
+ local pth = expandedpathfromlist(resolvers.splitpath(ori))
+ return joinpath(pth)
end
-function resolvers.var_of_format_or_suffix(str)
- local v = formats[str]
- if v then
- return v
- end
- v = formats[alternatives[str]]
- if v then
- return v
- end
- v = suffixmap[file.extname(str)]
- if v then
- return formats[isf]
+function resolvers.registerfilehash(name,content,someerror)
+ if content then
+ instance.files[name] = content
+ else
+ instance.files[name] = { }
+ if somerror == true then -- can be unset
+ instance.loaderror = someerror
+ end
end
- return ''
-end
-
-function resolvers.expand_braces(str) -- output variable and brace expansion of STRING
- local ori = resolvers.variable(str)
- local pth = expanded_path_from_list(resolvers.split_path(ori))
- return file.join_path(pth)
end
-resolvers.isreadable = { }
-
-function resolvers.isreadable.file(name)
- local readable = lfs.isfile(name) -- brrr
+local function isreadable(name)
+ local readable = lfs.isfile(name) -- not file.is_readable(name) asit can be a dir
if trace_detail then
if readable then
- logs.report("fileio","file '%s' is readable",name)
+ report_resolving("file '%s' is readable",name)
else
- logs.report("fileio","file '%s' is not readable", name)
+ report_resolving("file '%s' is not readable", name)
end
end
return readable
end
-resolvers.isreadable.tex = resolvers.isreadable.file
-
-- name
-- name/name
local function collect_files(names)
- local filelist = { }
+ local filelist, noffiles = { }, 0
for k=1,#names do
local fname = names[k]
if trace_detail then
- logs.report("fileio","checking name '%s'",fname)
+ report_resolving("checking name '%s'",fname)
end
- local bname = file.basename(fname)
- local dname = file.dirname(fname)
+ local bname = filebasename(fname)
+ local dname = filedirname(fname)
if dname == "" or find(dname,"^%.") then
dname = false
else
@@ -9674,11 +11818,11 @@ local function collect_files(names)
local hashes = instance.hashes
for h=1,#hashes do
local hash = hashes[h]
- local blobpath = hash.tag
+ local blobpath = hash.name
local files = blobpath and instance.files[blobpath]
if files then
if trace_detail then
- logs.report("fileio","deep checking '%s' (%s)",blobpath,bname)
+ report_resolving("deep checking '%s' (%s)",blobpath,bname)
end
local blobfile = files[bname]
if not blobfile then
@@ -9690,62 +11834,51 @@ local function collect_files(names)
end
end
if blobfile then
+ local blobroot = files.__path__ or blobpath
if type(blobfile) == 'string' then
if not dname or find(blobfile,dname) then
- filelist[#filelist+1] = {
- hash.type,
- file.join(blobpath,blobfile,bname), -- search
- resolvers.concatinators[hash.type](blobpath,blobfile,bname) -- result
- }
+ 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 '%s', search '%s', result '%s'",variant,search,result)
+ end
+ noffiles = noffiles + 1
+ filelist[noffiles] = { variant, search, result }
end
else
for kk=1,#blobfile do
local vv = blobfile[kk]
if not dname or find(vv,dname) then
- filelist[#filelist+1] = {
- hash.type,
- file.join(blobpath,vv,bname), -- search
- resolvers.concatinators[hash.type](blobpath,vv,bname) -- result
- }
+ 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 '%s', search '%s', result '%s'",variant,search,result)
+ end
+ noffiles = noffiles + 1
+ filelist[noffiles] = { variant, search, result }
end
end
end
end
elseif trace_locating then
- logs.report("fileio","no match in '%s' (%s)",blobpath,bname)
+ report_resolving("no match in '%s' (%s)",blobpath,bname)
end
end
end
- if #filelist > 0 then
- return filelist
- else
- return nil
- end
+ return noffiles > 0 and filelist or nil
end
-function resolvers.suffix_of_format(str)
- if suffixes[str] then
- return suffixes[str][1]
- else
- return ""
- end
-end
-
-function resolvers.suffixes_of_format(str)
- if suffixes[str] then
- return suffixes[str]
- else
- return {}
- end
-end
-
-function resolvers.register_in_trees(name)
+function resolvers.registerintrees(name)
if not find(name,"^%.") then
instance.foundintrees[name] = (instance.foundintrees[name] or 0) + 1 -- maybe only one
end
end
--- split the next one up for readability (bu this module needs a cleanup anyway)
+-- split the next one up for readability (but this module needs a cleanup anyway)
local function can_be_dir(name) -- can become local
local fakepaths = instance.fakepaths
@@ -9756,61 +11889,62 @@ local function can_be_dir(name) -- can become local
fakepaths[name] = 2 -- no directory
end
end
- return (fakepaths[name] == 1)
+ return fakepaths[name] == 1
end
-local function collect_instance_files(filename,collected) -- todo : plugin (scanners, checkers etc)
- local result = collected or { }
+local preparetreepattern = Cs((P(".")/"%%." + P("-")/"%%-" + P(1))^0 * Cc("$"))
+
+-- this one is split in smaller functions but it needs testing
+
+local function collect_instance_files(filename,askedformat,allresults) -- todo : plugin (scanners, checkers etc)
+ local result = { }
local stamp = nil
- filename = file.collapse_path(filename)
+ askedformat = askedformat or ""
+ filename = collapsepath(filename)
-- speed up / beware: format problem
- if instance.remember then
- stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format
+ if instance.remember and not allresults then
+ stamp = filename .. "--" .. askedformat
if instance.found[stamp] then
if trace_locating then
- logs.report("fileio","remembering file '%s'",filename)
+ report_resolving("remembered file '%s'",filename)
end
+ resolvers.registerintrees(filename) -- for tracing used files
return instance.found[stamp]
end
end
- if not dangerous[instance.format or "?"] then
- if resolvers.isreadable.file(filename) then
+ if not dangerous[askedformat] then
+ if isreadable(filename) then
if trace_detail then
- logs.report("fileio","file '%s' found directly",filename)
+ report_resolving("file '%s' found directly",filename)
+ end
+ if stamp then
+ instance.found[stamp] = { filename }
end
- instance.found[stamp] = { filename }
return { filename }
end
end
if find(filename,'%*') then
if trace_locating then
- logs.report("fileio","checking wildcard '%s'", filename)
+ report_resolving("checking wildcard '%s'", filename)
end
- result = resolvers.find_wildcard_files(filename)
+ result = resolvers.findwildcardfiles(filename) -- we can use th elocal
elseif file.is_qualified_path(filename) then
- if resolvers.isreadable.file(filename) then
+ if isreadable(filename) then
if trace_locating then
- logs.report("fileio","qualified name '%s'", filename)
+ report_resolving("qualified name '%s'", filename)
end
result = { filename }
else
- local forcedname, ok, suffix = "", false, file.extname(filename)
+ local forcedname, ok, suffix = "", false, fileextname(filename)
if suffix == "" then -- why
- if instance.format == "" then
- forcedname = filename .. ".tex"
- if resolvers.isreadable.file(forcedname) then
- if trace_locating then
- logs.report("fileio","no suffix, forcing standard filetype 'tex'")
- end
- result, ok = { forcedname }, true
- end
- else
- local suffixes = resolvers.suffixes_of_format(instance.format)
- for _, s in next, suffixes do
+ local format_suffixes = askedformat == "" and resolvers.defaultsuffixes or suffixes[askedformat]
+ if format_suffixes then
+ for i=1,#format_suffixes do
+ local s = format_suffixes[i]
forcedname = filename .. "." .. s
- if resolvers.isreadable.file(forcedname) then
+ if isreadable(forcedname) then
if trace_locating then
- logs.report("fileio","no suffix, forcing format filetype '%s'", s)
+ report_resolving("no suffix, forcing format filetype '%s'", s)
end
result, ok = { forcedname }, true
break
@@ -9821,23 +11955,24 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
if not ok and suffix ~= "" then
-- try to find in tree (no suffix manipulation), here we search for the
-- matching last part of the name
- local basename = file.basename(filename)
- local pattern = gsub(filename .. "$","([%.%-])","%%%1")
- local savedformat = instance.format
+ local basename = filebasename(filename)
+ local pattern = lpegmatch(preparetreepattern,filename)
+ -- messy .. to be sorted out
+ local savedformat = askedformat
local format = savedformat or ""
if format == "" then
- instance.format = resolvers.format_of_suffix(suffix)
+ askedformat = resolvers.formatofsuffix(suffix)
end
if not format then
- instance.format = "othertextfiles" -- kind of everything, maybe texinput is better
+ askedformat = "othertextfiles" -- kind of everything, maybe texinput is better
end
--
if basename ~= filename then
- local resolved = collect_instance_files(basename)
- if #result == 0 then
+ local resolved = collect_instance_files(basename,askedformat,allresults)
+ if #result == 0 then -- shouldn't this be resolved ?
local lowered = lower(basename)
if filename ~= lowered then
- resolved = collect_instance_files(lowered)
+ resolved = collect_instance_files(lowered,askedformat,allresults)
end
end
resolvers.format = savedformat
@@ -9862,57 +11997,60 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
-- end
end
if not ok and trace_locating then
- logs.report("fileio","qualified name '%s'", filename)
+ report_resolving("qualified name '%s'", filename)
end
end
else
-- search spec
- local filetype, extra, done, wantedfiles, ext = '', nil, false, { }, file.extname(filename)
- if ext == "" then
- if not instance.force_suffixes then
- wantedfiles[#wantedfiles+1] = filename
- end
- else
- wantedfiles[#wantedfiles+1] = filename
- end
- if instance.format == "" then
- if ext == "" then
- local forcedname = filename .. '.tex'
- wantedfiles[#wantedfiles+1] = forcedname
- filetype = resolvers.format_of_suffix(forcedname)
- if trace_locating then
- logs.report("fileio","forcing filetype '%s'",filetype)
+ local filetype, done, wantedfiles, ext = '', false, { }, fileextname(filename)
+ -- -- tricky as filename can be bla.1.2.3
+ -- if not suffixmap[ext] then --- probably needs to be done elsewhere too
+ -- wantedfiles[#wantedfiles+1] = filename
+ -- end
+ wantedfiles[#wantedfiles+1] = filename
+ if askedformat == "" then
+ if ext == "" or not suffixmap[ext] then
+ local defaultsuffixes = resolvers.defaultsuffixes
+ for i=1,#defaultsuffixes do
+ local forcedname = filename .. '.' .. defaultsuffixes[i]
+ wantedfiles[#wantedfiles+1] = forcedname
+ filetype = resolvers.formatofsuffix(forcedname)
+ if trace_locating then
+ report_resolving("forcing filetype '%s'",filetype)
+ end
end
else
- filetype = resolvers.format_of_suffix(filename)
+ filetype = resolvers.formatofsuffix(filename)
if trace_locating then
- logs.report("fileio","using suffix based filetype '%s'",filetype)
+ report_resolving("using suffix based filetype '%s'",filetype)
end
end
else
- if ext == "" then
- local suffixes = resolvers.suffixes_of_format(instance.format)
- for _, s in next, suffixes do
- wantedfiles[#wantedfiles+1] = filename .. "." .. s
+ if ext == "" or not suffixmap[ext] then
+ local format_suffixes = suffixes[askedformat]
+ if format_suffixes then
+ for i=1,#format_suffixes do
+ wantedfiles[#wantedfiles+1] = filename .. "." .. format_suffixes[i]
+ end
end
end
- filetype = instance.format
+ filetype = askedformat
if trace_locating then
- logs.report("fileio","using given filetype '%s'",filetype)
+ report_resolving("using given filetype '%s'",filetype)
end
end
- local typespec = resolvers.variable_of_format(filetype)
- local pathlist = resolvers.expanded_path_list(typespec)
+ local typespec = resolvers.variableofformat(filetype)
+ local pathlist = resolvers.expandedpathlist(typespec)
if not pathlist or #pathlist == 0 then
-- no pathlist, access check only / todo == wildcard
if trace_detail then
- logs.report("fileio","checking filename '%s', filetype '%s', wanted files '%s'",filename, filetype or '?',concat(wantedfiles," | "))
+ report_resolving("checking filename '%s', filetype '%s', wanted files '%s'",filename, filetype or '?',concat(wantedfiles," | "))
end
for k=1,#wantedfiles do
local fname = wantedfiles[k]
- if fname and resolvers.isreadable.file(fname) then
+ if fname and isreadable(fname) then
filename, done = fname, true
- result[#result+1] = file.join('.',fname)
+ result[#result+1] = filejoin('.',fname)
break
end
end
@@ -9920,8 +12058,8 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
local filelist = collect_files(wantedfiles)
local fl = filelist and filelist[1]
if fl then
- filename = fl[3]
- result[#result+1] = filename
+ filename = fl[3] -- not local?
+ result[#result+1] = resolvers.resolve(filename)
done = true
end
else
@@ -9930,76 +12068,65 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
local dirlist = { }
if filelist then
for i=1,#filelist do
- dirlist[i] = file.dirname(filelist[i][2]) .. "/"
+ dirlist[i] = filedirname(filelist[i][3]) .. "/" -- was [2] .. gamble
end
end
if trace_detail then
- logs.report("fileio","checking filename '%s'",filename)
+ report_resolving("checking filename '%s'",filename)
end
- -- a bit messy ... esp the doscan setting here
- local doscan
for k=1,#pathlist do
local path = pathlist[k]
- if find(path,"^!!") then doscan = false else doscan = true end
- local pathname = gsub(path,"^!+", '')
+ local pathname = lpegmatch(inhibitstripper,path)
+ local doscan = path == pathname -- no ^!!
done = false
-- using file list
if filelist then
- local expression
-- compare list entries with permitted pattern -- /xx /xx//
- if not find(pathname,"/$") then
- expression = pathname .. "/"
- else
- expression = pathname
- end
- expression = gsub(expression,"([%-%.])","%%%1") -- this also influences
- expression = gsub(expression,"//+$", '/.*') -- later usage of pathname
- expression = gsub(expression,"//", '/.-/') -- not ok for /// but harmless
- expression = "^" .. expression .. "$"
+ local expression = makepathexpression(pathname)
if trace_detail then
- logs.report("fileio","using pattern '%s' for path '%s'",expression,pathname)
+ report_resolving("using pattern '%s' for path '%s'",expression,pathname)
end
for k=1,#filelist do
local fl = filelist[k]
local f = fl[2]
local d = dirlist[k]
if find(d,expression) then
- --- todo, test for readable
- result[#result+1] = fl[3]
- resolvers.register_in_trees(f) -- for tracing used files
+ -- todo, test for readable
+ result[#result+1] = resolvers.resolve(fl[3]) -- no shortcut
done = true
- if instance.allresults then
+ if allresults then
if trace_detail then
- logs.report("fileio","match in hash for file '%s' on path '%s', continue scanning",f,d)
+ report_resolving("match to '%s' in hash for file '%s' and path '%s', continue scanning",expression,f,d)
end
else
if trace_detail then
- logs.report("fileio","match in hash for file '%s' on path '%s', quit scanning",f,d)
+ report_resolving("match to '%s' in hash for file '%s' and path '%s', quit scanning",expression,f,d)
end
break
end
elseif trace_detail then
- logs.report("fileio","no match in hash for file '%s' on path '%s'",f,d)
+ report_resolving("no match to '%s' in hash for file '%s' and path '%s'",expression,f,d)
end
end
end
if not done and doscan then
-- check if on disk / unchecked / does not work at all / also zips
- if resolvers.splitmethod(pathname).scheme == 'file' then -- ?
+ local scheme = url.hasscheme(pathname)
+ if not scheme or scheme == "file" then
local pname = gsub(pathname,"%.%*$",'')
if not find(pname,"%*") then
local ppname = gsub(pname,"/+$","")
if can_be_dir(ppname) then
for k=1,#wantedfiles do
local w = wantedfiles[k]
- local fname = file.join(ppname,w)
- if resolvers.isreadable.file(fname) then
+ local fname = filejoin(ppname,w)
+ if isreadable(fname) then
if trace_detail then
- logs.report("fileio","found '%s' by scanning",fname)
+ report_resolving("found '%s' by scanning",fname)
end
result[#result+1] = fname
done = true
- if not instance.allresults then break end
+ if not allresults then break end
end
end
else
@@ -10009,56 +12136,66 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
end
end
if not done and doscan then
- -- todo: slow path scanning
+ -- todo: slow path scanning ... although we now have tree:// supported in $TEXMF
end
- if done and not instance.allresults then break end
+ if done and not allresults then break end
end
end
end
for k=1,#result do
- result[k] = file.collapse_path(result[k])
+ local rk = collapsepath(result[k])
+ result[k] = rk
+ resolvers.registerintrees(rk) -- for tracing used files
end
- if instance.remember then
+ if stamp then
instance.found[stamp] = result
end
return result
end
-if not resolvers.concatinators then resolvers.concatinators = { } end
+-- -- -- begin of main file search routing -- -- --
-resolvers.concatinators.tex = file.join
-resolvers.concatinators.file = resolvers.concatinators.tex
-function resolvers.find_files(filename,filetype,mustexist)
- if type(mustexist) == boolean then
- -- all set
- elseif type(filetype) == 'boolean' then
- filetype, mustexist = nil, false
- elseif type(filetype) ~= 'string' then
- filetype, mustexist = nil, false
- end
- instance.format = filetype or ''
- local result = collect_instance_files(filename)
+
+
+
+
+
+
+
+
+-- -- -- end of main file search routing -- -- --
+
+local function findfiles(filename,filetype,allresults)
+ local result = collect_instance_files(filename,filetype or "",allresults)
if #result == 0 then
local lowered = lower(filename)
if filename ~= lowered then
- return collect_instance_files(lowered)
+ return collect_instance_files(lowered,filetype or "",allresults)
end
end
- instance.format = ''
return result
end
-function resolvers.find_file(filename,filetype,mustexist)
- return (resolvers.find_files(filename,filetype,mustexist)[1] or "")
+function resolvers.findfiles(filename,filetype)
+ return findfiles(filename,filetype,true)
+end
+
+function resolvers.findfile(filename,filetype)
+ return findfiles(filename,filetype,false)[1] or ""
end
-function resolvers.find_given_files(filename)
- local bname, result = file.basename(filename), { }
+function resolvers.findpath(filename,filetype)
+ return filedirname(findfiles(filename,filetype,false)[1] or "")
+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.tag] or { }
+ local files = instance.files[hash.name] or { }
local blist = files[bname]
if not blist then
local rname = "remap:"..bname
@@ -10070,13 +12207,21 @@ function resolvers.find_given_files(filename)
end
if blist then
if type(blist) == 'string' then
- result[#result+1] = resolvers.concatinators[hash.type](hash.tag,blist,bname) or ""
- if not instance.allresults then break end
+ 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
else
for kk=1,#blist do
local vv = blist[kk]
- result[#result+1] = resolvers.concatinators[hash.type](hash.tag,vv,bname) or ""
- if not instance.allresults then break end
+ 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
+ end
end
end
end
@@ -10084,24 +12229,31 @@ function resolvers.find_given_files(filename)
return result
end
-function resolvers.find_given_file(filename)
- return (resolvers.find_given_files(filename)[1] or "")
+function resolvers.findgivenfiles(filename)
+ return findgivenfiles(filename,true)
+end
+
+function resolvers.findgivenfile(filename)
+ return findgivenfiles(filename,false)[1] or ""
end
-local function doit(path,blist,bname,tag,kind,result,allresults)
+local function doit(path,blist,bname,tag,variant,result,allresults)
local done = false
- if blist and kind then
+ 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
- result[#result+1] = resolvers.concatinators[kind](tag,blist,bname) or ""
+ 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
- result[#result+1] = resolvers.concatinators[kind](tag,vv,bname) or ""
+ local full = methodhandler('concatinators',variant,tag,vv,bname) or ""
+ result[#result+1] = resolve(full)
done = true
if not allresults then break end
end
@@ -10111,30 +12263,32 @@ local function doit(path,blist,bname,tag,kind,result,allresults)
return done
end
-function resolvers.find_wildcard_files(filename) -- todo: remap:
- local result = { }
- local bname, dname = file.basename(filename), file.dirname(filename)
- local path = gsub(dname,"^*/","")
- path = gsub(path,"*",".*")
- path = gsub(path,"-","%%-")
- if dname == "" then
- path = ".*"
- end
- local name = bname
- name = gsub(name,"*",".*")
- name = gsub(name,"-","%%-")
- path = lower(path)
- name = lower(name)
- local files, allresults, done = instance.files, instance.allresults, false
+
+local makewildcard = Cs(
+ (P("^")^0 * P("/") * P(-1) + P(-1)) /".*"
+ + (P("^")^0 * P("/") / "")^0 * (P("*")/".*" + P("-")/"%%-" + P(".")/"%%." + P("?")/"."+ P("\\")/"/" + P(1))^0
+)
+
+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 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
if find(name,"%*") then
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- local tag, kind = hash.tag, hash.type
- for kk, hh in next, files[hash.tag] do
+ 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,tag,kind,result,allresults) then done = true end
+ if doit(path,hh,kk,hashname,hashtype,result,allresults) then done = true end
if done and not allresults then break end
end
end
@@ -10144,8 +12298,8 @@ function resolvers.find_wildcard_files(filename) -- todo: remap:
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- local tag, kind = hash.tag, hash.type
- if doit(path,files[tag][bname],bname,tag,kind,result,allresults) then done = true end
+ local hashname, hashtype = hash.name, hash.type
+ if doit(path,files[hashname][bname],bname,hashname,hashtype,result,allresults) then done = true end
if done and not allresults then break end
end
end
@@ -10154,8 +12308,12 @@ function resolvers.find_wildcard_files(filename) -- todo: remap:
return result
end
-function resolvers.find_wildcard_file(filename)
- return (resolvers.find_wildcard_files(filename)[1] or "")
+function resolvers.findwildcardfiles(filename,result)
+ return findwildcardfiles(filename,true,result)
+end
+
+function resolvers.findwildcardfile(filename)
+ return findwildcardfiles(filename,false)[1] or ""
end
-- main user functions
@@ -10166,34 +12324,33 @@ end
function resolvers.load(option)
statistics.starttiming(instance)
- resolvers.resetconfig()
- resolvers.identify_cnf()
- resolvers.load_lua() -- will become the new method
- resolvers.expand_variables()
- resolvers.load_cnf() -- will be skipped when we have a lua file
- resolvers.expand_variables()
+ identify_configuration_files()
+ load_configuration_files()
if option ~= "nofiles" then
- resolvers.load_hash()
+ load_databases()
resolvers.automount()
end
statistics.stoptiming(instance)
+ local files = instance.files
+ return files and next(files) and true
+end
+
+local function report(str)
+ if trace_locating then
+ report_resolving(str) -- has already verbose
+ else
+ print(str)
+ end
end
-function resolvers.for_files(command, files, filetype, mustexist)
+function resolvers.dowithfilesandreport(command, files, ...) -- will move
if files and #files > 0 then
- local function report(str)
- if trace_locating then
- logs.report("fileio",str) -- has already verbose
- else
- print(str)
- end
- end
if trace_locating then
report('') -- ?
end
for f=1,#files do
local file = files[f]
- local result = command(file,filetype,mustexist)
+ local result = command(file,...)
if type(result) == 'string' then
report(result)
else
@@ -10205,21 +12362,16 @@ function resolvers.for_files(command, files, filetype, mustexist)
end
end
--- strtab
+-- obsolete
-resolvers.var_value = resolvers.variable -- output the value of variable $STRING.
-resolvers.expand_var = resolvers.expansion -- output variable expansion of STRING.
+-- resolvers.varvalue = resolvers.variable -- output the value of variable $STRING.
+-- resolvers.expandvar = resolvers.expansion -- output variable expansion of STRING.
-function resolvers.show_path(str) -- output search path for file type NAME
- return file.join_path(resolvers.expanded_path_list(resolvers.format_of_var(str)))
+function resolvers.showpath(str) -- output search path for file type NAME
+ return joinpath(resolvers.expandedpathlist(resolvers.formatofvariable(str)))
end
--- resolvers.find_file(filename)
--- resolvers.find_file(filename, filetype, mustexist)
--- resolvers.find_file(filename, mustexist)
--- resolvers.find_file(filename, filetype)
-
-function resolvers.register_file(files, name, path)
+function resolvers.registerfile(files, name, path)
if files[name] then
if type(files[name]) == 'string' then
files[name] = { files[name], path }
@@ -10231,101 +12383,24 @@ function resolvers.register_file(files, name, path)
end
end
-function resolvers.splitmethod(filename)
- if not filename then
- return { } -- safeguard
- elseif type(filename) == "table" then
- return filename -- already split
- elseif not find(filename,"://") then
- return { scheme="file", path = filename, original=filename } -- quick hack
- else
- return url.hashed(filename)
- end
-end
-
-function table.sequenced(t,sep) -- temp here
- local s = { }
- for k, v in next, t do -- indexed?
- s[#s+1] = k .. "=" .. tostring(v)
- end
- return concat(s, sep or " | ")
-end
-
-function resolvers.methodhandler(what, filename, filetype) -- ...
- filename = file.collapse_path(filename)
- local specification = (type(filename) == "string" and resolvers.splitmethod(filename)) or filename -- no or { }, let it bomb
- local scheme = specification.scheme
- if resolvers[what][scheme] then
- if trace_locating then
- logs.report("fileio","handler '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
- end
- return resolvers[what][scheme](filename,filetype) -- todo: specification
- else
- return resolvers[what].tex(filename,filetype) -- todo: specification
- end
-end
-
-function resolvers.clean_path(str)
- if str then
- str = gsub(str,"\\","/")
- str = gsub(str,"^!+","")
- str = gsub(str,"^~",resolvers.homedir)
- return str
- else
- return nil
- end
-end
-
-function resolvers.do_with_path(name,func)
- local pathlist = resolvers.expanded_path_list(name)
+function resolvers.dowithpath(name,func)
+ local pathlist = resolvers.expandedpathlist(name)
for i=1,#pathlist do
- func("^"..resolvers.clean_path(pathlist[i]))
+ func("^"..resolvers.cleanpath(pathlist[i]))
end
end
-function resolvers.do_with_var(name,func)
- func(expanded_var(name))
+function resolvers.dowithvariable(name,func)
+ func(expandedvariable(name))
end
-function resolvers.with_files(pattern,handle)
- local hashes = instance.hashes
- for i=1,#hashes do
- local hash = hashes[i]
- local blobpath = hash.tag
- local blobtype = hash.type
- if blobpath then
- local files = instance.files[blobpath]
- if files then
- for k,v in next, files do
- if find(k,"^remap:") then
- k = files[k]
- v = files[k] -- chained
- end
- if find(k,pattern) then
- if type(v) == "string" then
- handle(blobtype,blobpath,v,k)
- else
- for _,vv in next, v do -- indexed
- handle(blobtype,blobpath,vv,k)
- end
- end
- end
- end
- end
- end
- end
-end
-
-function resolvers.locate_format(name)
- local barename, fmtname = gsub(name,"%.%a+$",""), ""
- if resolvers.usecache then
- local path = file.join(caches.setpath("formats")) -- maybe platform
- fmtname = file.join(path,barename..".fmt") or ""
- end
+function resolvers.locateformat(name)
+ local barename = file.removesuffix(name) -- gsub(name,"%.%a+$","")
+ local fmtname = caches.getfirstreadablefile(barename..".fmt","formats") or ""
if fmtname == "" then
- fmtname = resolvers.find_files(barename..".fmt")[1] or ""
+ fmtname = resolvers.findfile(barename..".fmt")
+ fmtname = resolvers.cleanpath(fmtname)
end
- fmtname = resolvers.clean_path(fmtname)
if fmtname ~= "" then
local barename = file.removesuffix(fmtname)
local luaname, lucname, luiname = barename .. ".lua", barename .. ".luc", barename .. ".lui"
@@ -10340,7 +12415,7 @@ function resolvers.locate_format(name)
return nil, nil
end
-function resolvers.boolean_variable(str,default)
+function resolvers.booleanvariable(str,default)
local b = resolvers.expansion(str)
if b == "" then
return default
@@ -10350,204 +12425,62 @@ function resolvers.boolean_variable(str,default)
end
end
-texconfig.kpse_init = false
-
-kpse = { original = kpse } setmetatable(kpse, { __index = function(k,v) return resolvers[v] end } )
-
--- for a while
-
-input = resolvers
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['data-tmp'] = {
- 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"
-}
-
---[[ldx--
-<p>This module deals with caching data. It sets up the paths and
-implements loaders and savers for tables. Best is to set the
-following variable. When not set, the usual paths will be
-checked. Personally I prefer the (users) temporary path.</p>
-
-</code>
-TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
-</code>
-
-<p>Currently we do no locking when we write files. This is no real
-problem because most caching involves fonts and the chance of them
-being written at the same time is small. We also need to extend
-luatools with a recache feature.</p>
---ldx]]--
-
-local format, lower, gsub = string.format, string.lower, string.gsub
-
-local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end) -- not used yet
-
-caches = caches or { }
-
-caches.path = caches.path or nil
-caches.base = caches.base or "luatex-cache"
-caches.more = caches.more or "context"
-caches.direct = false -- true is faster but may need huge amounts of memory
-caches.tree = false
-caches.paths = caches.paths or nil
-caches.force = true -- changed for TEXLIVE by TH
-caches.defaults = { "TEXMFCACHE", "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
-
-function caches.temp()
- local cachepath = nil
- local function check(list,isenv)
- if not cachepath then
- for k=1,#list do
- local v = list[k]
- cachepath = (isenv and (os.env[v] or "")) or v or ""
- if cachepath == "" then
- -- next
- else
- cachepath = resolvers.clean_path(cachepath)
- if lfs.isdir(cachepath) and file.iswritable(cachepath) then -- lfs.attributes(cachepath,"mode") == "directory"
- break
- elseif caches.force or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then
- dir.mkdirs(cachepath)
- if lfs.isdir(cachepath) and file.iswritable(cachepath) then
- break
+function resolvers.dowithfilesintree(pattern,handle,before,after) -- will move, can be a nice iterator instead
+ local instance = resolvers.instance
+ local hashes = instance.hashes
+ for i=1,#hashes do
+ local hash = hashes[i]
+ local blobtype = hash.type
+ local blobpath = hash.name
+ if blobpath then
+ 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 next, files do
+ total = total + 1
+ if find(k,"^remap:") then
+ k = files[k]
+ v = k -- files[k] -- chained
+ end
+ if 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
end
end
end
- cachepath = nil
+ end
+ if after then
+ after(blobtype,blobpath,pattern,total,checked,done)
end
end
end
- check(resolvers.clean_path_list("TEXMFCACHE") or { })
- check(caches.defaults,true)
- if not cachepath then
- print("\nfatal error: there is no valid (writable) cache path defined\n")
- os.exit()
- elseif not lfs.isdir(cachepath) then -- lfs.attributes(cachepath,"mode") ~= "directory"
- print(format("\nfatal error: cache path %s is not a directory\n",cachepath))
- os.exit()
- end
- cachepath = file.collapse_path(cachepath)
- function caches.temp()
- return cachepath
- end
- return cachepath
-end
-
-function caches.configpath()
- return table.concat(resolvers.instance.cnffiles,";")
-end
-
-function caches.hashed(tree)
- return md5.hex(gsub(lower(tree),"[\\\/]+","/"))
-end
-
-function caches.treehash()
- local tree = caches.configpath()
- if not tree or tree == "" then
- return false
- else
- return caches.hashed(tree)
- end
-end
-
-function caches.setpath(...)
- if not caches.path then
- if not caches.path then
- caches.path = caches.temp()
- end
- caches.path = resolvers.clean_path(caches.path) -- to be sure
- caches.tree = caches.tree or caches.treehash()
- if caches.tree then
- caches.path = dir.mkdirs(caches.path,caches.base,caches.more,caches.tree)
- else
- caches.path = dir.mkdirs(caches.path,caches.base,caches.more)
- end
- end
- if not caches.path then
- caches.path = '.'
- end
- caches.path = resolvers.clean_path(caches.path)
- local dirs = { ... }
- if #dirs > 0 then
- local pth = dir.mkdirs(caches.path,...)
- return pth
- end
- caches.path = dir.expand_name(caches.path)
- return caches.path
-end
-
-function caches.definepath(category,subcategory)
- return function()
- return caches.setpath(category,subcategory)
- end
-end
-
-function caches.setluanames(path,name)
- return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
end
-function caches.loaddata(path,name)
- local tmaname, tmcname = caches.setluanames(path,name)
- local loader = loadfile(tmcname) or loadfile(tmaname)
- if loader then
- loader = loader()
- collectgarbage("step")
- return loader
- else
- return false
- end
-end
+resolvers.obsolete = resolvers.obsolete or { }
+local obsolete = resolvers.obsolete
---~ function caches.loaddata(path,name)
---~ local tmaname, tmcname = caches.setluanames(path,name)
---~ return dofile(tmcname) or dofile(tmaname)
---~ end
-
-function caches.iswritable(filepath,filename)
- local tmaname, tmcname = caches.setluanames(filepath,filename)
- return file.iswritable(tmaname)
-end
-
-function caches.savedata(filepath,filename,data,raw)
- local tmaname, tmcname = caches.setluanames(filepath,filename)
- local reduce, simplify = true, true
- if raw then
- reduce, simplify = false, false
- end
- data.cache_uuid = os.uuid()
- if caches.direct then
- file.savedata(tmaname, table.serialize(data,'return',false,true,false)) -- no hex
- else
- table.tofile(tmaname, data,'return',false,true,false) -- maybe not the last true
- end
- local cleanup = resolvers.boolean_variable("PURGECACHE", false)
- local strip = resolvers.boolean_variable("LUACSTRIP", true)
- utils.lua.compile(tmaname, tmcname, cleanup, strip)
-end
-
--- here we use the cache for format loading (texconfig.[formatname|jobname])
-
---~ if tex and texconfig and texconfig.formatname and texconfig.formatname == "" then
-if tex and texconfig and (not texconfig.formatname or texconfig.formatname == "") and input and resolvers.instance then
- if not texconfig.luaname then texconfig.luaname = "cont-en.lua" end -- or luc
- texconfig.formatname = caches.setpath("formats") .. "/" .. gsub(texconfig.luaname,"%.lu.$",".fmt")
-end
+resolvers.find_file = resolvers.findfile obsolete.find_file = resolvers.findfile
+resolvers.find_files = resolvers.findfiles obsolete.find_files = resolvers.findfiles
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['data-res'] = {
+if not modules then modules = { } end modules ['data-pre'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -10555,17 +12488,28 @@ if not modules then modules = { } end modules ['data-res'] = {
license = "see context related readme files"
}
---~ print(resolvers.resolve("abc env:tmp file:cont-en.tex path:cont-en.tex full:cont-en.tex rel:zapf/one/p-chars.tex"))
+-- It could be interesting to hook the resolver in the file
+-- opener so that unresolved prefixes travel around and we
+-- get more abstraction.
+
+-- As we use this beforehand we will move this up in the chain
+-- of loading.
+
-local upper, lower, gsub = string.upper, string.lower, string.gsub
+local resolvers = resolvers
+local prefixes = utilities.storage.allocate()
+resolvers.prefixes = prefixes
-local prefixes = { }
+local gsub = string.gsub
+local cleanpath, findgivenfile, expansion = resolvers.cleanpath, resolvers.findgivenfile, resolvers.expansion
+local getenv = resolvers.getenv -- we can probably also use resolvers.expansion
+local P, Cs, lpegmatch = lpeg.P, lpeg.Cs, lpeg.match
prefixes.environment = function(str)
- return resolvers.clean_path(os.getenv(str) or os.getenv(upper(str)) or os.getenv(lower(str)) or "")
+ return cleanpath(expansion(str))
end
-prefixes.relative = function(str,n)
+prefixes.relative = function(str,n) -- lfs.isfile
if io.exists(str) then
-- nothing
elseif io.exists("./" .. str) then
@@ -10581,7 +12525,7 @@ prefixes.relative = function(str,n)
end
end
end
- return resolvers.clean_path(str)
+ return cleanpath(str)
end
prefixes.auto = function(str)
@@ -10593,18 +12537,34 @@ prefixes.auto = function(str)
end
prefixes.locate = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path((fullname ~= "" and fullname) or str)
+ local fullname = findgivenfile(str) or ""
+ return cleanpath((fullname ~= "" and fullname) or str)
end
prefixes.filename = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path(file.basename((fullname ~= "" and fullname) or str))
+ local fullname = findgivenfile(str) or ""
+ return cleanpath(file.basename((fullname ~= "" and fullname) or str))
end
prefixes.pathname = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path(file.dirname((fullname ~= "" and fullname) or str))
+ local fullname = findgivenfile(str) or ""
+ return cleanpath(file.dirname((fullname ~= "" and fullname) or str))
+end
+
+prefixes.selfautoloc = function(str)
+ return cleanpath(file.join(getenv('SELFAUTOLOC'),str))
+end
+
+prefixes.selfautoparent = function(str)
+ return cleanpath(file.join(getenv('SELFAUTOPARENT'),str))
+end
+
+prefixes.selfautodir = function(str)
+ return cleanpath(file.join(getenv('SELFAUTODIR'),str))
+end
+
+prefixes.home = function(str)
+ return cleanpath(file.join(getenv('HOME'),str))
end
prefixes.env = prefixes.environment
@@ -10633,19 +12593,28 @@ local function _resolve_(method,target)
end
end
-local function resolve(str)
- if type(str) == "table" then
- for k=1,#str do
- local v = str[k]
- str[k] = resolve(v) or v
- end
- elseif str and str ~= "" then
- str = gsub(str,"([a-z]+):([^ \"\']*)",_resolve_)
+local resolved, abstract = { }, { }
+
+function resolvers.resetresolve(str)
+ resolved, abstract = { }, { }
+end
+
+local function resolve(str) -- use schemes, this one is then for the commandline only
+ local res = resolved[str]
+ if not res then
+ res = gsub(str,"([a-z][a-z]+):([^ \"\']*)",_resolve_)
+ resolved[str] = res
+ abstract[res] = str
end
- return str
+ return res
+end
+
+local function unresolve(str)
+ return abstract[str] or str
end
-resolvers.resolve = resolve
+resolvers.resolve = resolve
+resolvers.unresolve = unresolve
if os.uname then
@@ -10657,6 +12626,42 @@ if os.uname then
end
+if os.type == "unix" then
+
+ local pattern
+
+ local function makepattern(t,k,v)
+ local colon = P(":")
+ local 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)
+ if t then
+ t[k] = v
+ end
+ end
+
+ makepattern()
+
+ getmetatable(prefixes).__newindex = makepattern
+
+ function resolvers.repath(str)
+ return lpegmatch(pattern,str)
+ end
+
+else -- already the default:
+
+ function resolvers.repath(str)
+ return str
+ end
+
+end
+
end -- of closure
@@ -10670,13 +12675,23 @@ if not modules then modules = { } end modules ['data-inp'] = {
license = "see context related readme files"
}
-resolvers.finders = resolvers.finders or { }
-resolvers.openers = resolvers.openers or { }
-resolvers.loaders = resolvers.loaders or { }
+local allocate = utilities.storage.allocate
+local resolvers = resolvers
+
+local methodhandler = resolvers.methodhandler
+local registermethod = resolvers.registermethod
+
+local finders = allocate { helpers = { }, notfound = function() end }
+local openers = allocate { helpers = { }, notfound = function() end }
+local loaders = allocate { helpers = { }, notfound = function() return false, nil, 0 end }
-resolvers.finders.notfound = { nil }
-resolvers.openers.notfound = { nil }
-resolvers.loaders.notfound = { false, nil, 0 }
+registermethod("finders", finders, "uri")
+registermethod("openers", openers, "uri")
+registermethod("loaders", loaders, "uri")
+
+resolvers.finders = finders
+resolvers.openers = openers
+resolvers.loaders = loaders
end -- of closure
@@ -10691,15 +12706,23 @@ if not modules then modules = { } end modules ['data-out'] = {
license = "see context related readme files"
}
-outputs = outputs or { }
+local allocate = utilities.storage.allocate
+local resolvers = resolvers
+
+local registermethod = resolvers.registermethod
+
+local savers = allocate { helpers = { } }
+resolvers.savers = savers
+
+registermethod("savers", savers, "uri")
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['data-con'] = {
+if not modules then modules = { } end modules ['data-fil'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -10707,6 +12730,124 @@ if not modules then modules = { } end modules ['data-con'] = {
license = "see context related readme files"
}
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_files = logs.reporter("resolvers","files")
+
+local resolvers = resolvers
+
+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
+
+local checkgarbage = utilities.garbagecollector and utilities.garbagecollector.check
+
+function locators.file(specification)
+ local name = specification.filename
+ local realname = resolvers.resolve(name) -- no shortcut
+ if realname and realname ~= '' and lfs.isdir(realname) then
+ if trace_locating then
+ report_files("file locator '%s' found as '%s'",name,realname)
+ end
+ resolvers.appendhash('file',name,true) -- cache
+ elseif trace_locating then
+ report_files("file locator '%s' not found",name)
+ end
+end
+
+function hashers.file(specification)
+ local name = specification.filename
+ local content = caches.loadcontent(name,'files')
+ resolvers.registerfilehash(name,content,content==nil)
+end
+
+function generators.file(specification)
+ local path = specification.filename
+ local content = resolvers.scanfiles(path)
+ resolvers.registerfilehash(path,content,true)
+end
+
+concatinators.file = file.join
+
+function finders.file(specification,filetype)
+ local filename = specification.filename
+ local foundname = resolvers.findfile(filename,filetype)
+ if foundname and foundname ~= "" then
+ if trace_locating then
+ report_files("file finder: '%s' found",filename)
+ end
+ return foundname
+ else
+ if trace_locating then
+ report_files("file finder: %s' not found",filename)
+ end
+ return finders.notfound()
+ end
+end
+
+-- The default textopener will be overloaded later on.
+
+function openers.helpers.textopener(tag,filename,f)
+ return {
+ reader = function() return f:read () end,
+ close = function() logs.show_close(filename) return f:close() end,
+ }
+end
+
+function openers.file(specification,filetype)
+ local filename = specification.filename
+ if filename and filename ~= "" then
+ local f = io.open(filename,"r")
+ if f then
+ if trace_locating then
+ report_files("file opener, '%s' opened",filename)
+ end
+ return openers.helpers.textopener("file",filename,f)
+ end
+ end
+ if trace_locating then
+ report_files("file opener, '%s' not found",filename)
+ end
+ return openers.notfound()
+end
+
+function loaders.file(specification,filetype)
+ local filename = specification.filename
+ if filename and filename ~= "" then
+ local f = io.open(filename,"rb")
+ if f then
+ logs.show_load(filename)
+ if trace_locating then
+ report_files("file loader, '%s' loaded",filename)
+ end
+ local s = f:read("*a")
+ if checkgarbage then
+ checkgarbage(#s)
+ end
+ f:close()
+ if s then
+ return true, s, #s
+ end
+ end
+ end
+ if trace_locating then
+ report_files("file loader, '%s' not found",filename)
+ end
+ return loaders.notfound()
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-con'] = {
+ version = 1.100,
+ 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 format, lower, gsub = string.format, string.lower, string.gsub
local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
@@ -10726,50 +12867,63 @@ table structures without bothering about the disk cache.</p>
<p>Examples of usage can be found in the font related code.</p>
--ldx]]--
-containers = containers or { }
-
+containers = containers or { }
+local containers = containers
containers.usecache = true
+local report_containers = logs.reporter("resolvers","containers")
+
local function report(container,tag,name)
if trace_cache or trace_containers then
- logs.report(format("%s cache",container.subcategory),"%s: %s",tag,name or 'invalid')
+ report_containers("container: %s, tag: %s, name: %s",container.subcategory,tag,name or 'invalid')
end
end
local allocated = { }
--- tracing
+local mt = {
+ __index = function(t,k)
+ if k == "writable" then
+ local writable = caches.getwritablepath(t.category,t.subcategory) or { "." }
+ t.writable = writable
+ return writable
+ elseif k == "readables" then
+ local readables = caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ t.readables = readables
+ return readables
+ end
+ end,
+ __storage__ = true
+}
function containers.define(category, subcategory, version, enabled)
- return function()
- if category and subcategory then
- local c = allocated[category]
- if not c then
- c = { }
- allocated[category] = c
- end
- local s = c[subcategory]
- if not s then
- s = {
- category = category,
- subcategory = subcategory,
- storage = { },
- enabled = enabled,
- version = version or 1.000,
- trace = false,
- path = caches and caches.setpath and caches.setpath(category,subcategory),
- }
- c[subcategory] = s
- end
- return s
- else
- return nil
+ if category and subcategory then
+ local c = allocated[category]
+ if not c then
+ c = { }
+ allocated[category] = c
+ end
+ local s = c[subcategory]
+ if not s then
+ s = {
+ category = category,
+ subcategory = subcategory,
+ storage = { },
+ enabled = enabled,
+ version = version or math.pi, -- after all, this is TeX
+ trace = false,
+ -- writable = caches.getwritablepath and caches.getwritablepath (category,subcategory) or { "." },
+ -- readables = caches.getreadablepaths and caches.getreadablepaths(category,subcategory) or { "." },
+ }
+ setmetatable(s,mt)
+ c[subcategory] = s
end
+ return s
end
end
function containers.is_usable(container, name)
- return container.enabled and caches and caches.iswritable(container.path, name)
+ return container.enabled and caches and caches.is_writable(container.writable, name)
end
function containers.is_valid(container, name)
@@ -10782,18 +12936,20 @@ function containers.is_valid(container, name)
end
function containers.read(container,name)
- if container.enabled and caches and not container.storage[name] and containers.usecache then
- container.storage[name] = caches.loaddata(container.path,name)
- if containers.is_valid(container,name) then
+ local storage = container.storage
+ local stored = storage[name]
+ if not stored and container.enabled and caches and containers.usecache then
+ stored = caches.loaddata(container.readables,name)
+ if stored and stored.cache_version == container.version then
report(container,"loaded",name)
else
- container.storage[name] = nil
+ stored = nil
end
- end
- if container.storage[name] then
+ storage[name] = stored
+ elseif stored then
report(container,"reusing",name)
end
- return container.storage[name]
+ return stored
end
function containers.write(container, name, data)
@@ -10802,7 +12958,7 @@ function containers.write(container, name, data)
if container.enabled and caches then
local unique, shared = data.unique, data.shared
data.unique, data.shared = nil, nil
- caches.savedata(container.path, name, data)
+ caches.savedata(container.writable, name, data)
report(container,"saved",name)
data.unique, data.shared = unique, shared
end
@@ -10837,50 +12993,18 @@ local format, lower, gsub, find = string.format, string.lower, string.gsub, stri
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
--- since we want to use the cache instead of the tree, we will now
--- reimplement the saver.
-
-local save_data = resolvers.save_data
-local load_data = resolvers.load_data
+local report_mounts = logs.reporter("resolvers","mounts")
-resolvers.cachepath = nil -- public, for tracing
-resolvers.usecache = true -- public, for tracing
-
-function resolvers.save_data(dataname)
- save_data(dataname, function(cachename,dataname)
- resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
- if resolvers.usecache then
- resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
- return file.join(resolvers.cachepath(),caches.hashed(cachename))
- else
- return file.join(cachename,dataname)
- end
- end)
-end
-
-function resolvers.load_data(pathname,dataname,filename)
- load_data(pathname,dataname,filename,function(dataname,filename)
- resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
- if resolvers.usecache then
- resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
- return file.join(resolvers.cachepath(),caches.hashed(pathname))
- else
- if not filename or (filename == "") then
- filename = dataname
- end
- return file.join(pathname,filename)
- end
- end)
-end
+local resolvers = resolvers
-- we will make a better format, maybe something xml or just text or lua
resolvers.automounted = resolvers.automounted or { }
function resolvers.automount(usecache)
- local mountpaths = resolvers.clean_path_list(resolvers.expansion('TEXMFMOUNT'))
+ local mountpaths = resolvers.cleanpathlist(resolvers.expansion('TEXMFMOUNT'))
if (not mountpaths or #mountpaths == 0) and usecache then
- mountpaths = { caches.setpath("mount") }
+ mountpaths = caches.getreadablepaths("mount")
end
if mountpaths and #mountpaths > 0 then
statistics.starttiming(resolvers.instance)
@@ -10894,7 +13018,7 @@ function resolvers.automount(usecache)
-- skip
elseif find(line,"^zip://") then
if trace_locating then
- logs.report("fileio","mounting %s",line)
+ report_mounts("mounting %s",line)
end
table.insert(resolvers.automounted,line)
resolvers.usezipfile(line)
@@ -10910,40 +13034,40 @@ end
-- status info
-statistics.register("used config path", function() return caches.configpath() end)
-statistics.register("used cache path", function() return caches.temp() or "?" end)
+statistics.register("used config file", function() return caches.configfiles() end)
+statistics.register("used cache path", function() return caches.usedpaths() end)
-- experiment (code will move)
-function statistics.save_fmt_status(texname,formatbanner,sourcefile) -- texname == formatname
+function statistics.savefmtstatus(texname,formatbanner,sourcefile) -- texname == formatname
local enginebanner = status.list().banner
if formatbanner and enginebanner and sourcefile then
local luvname = file.replacesuffix(texname,"luv")
local luvdata = {
enginebanner = enginebanner,
formatbanner = formatbanner,
- sourcehash = md5.hex(io.loaddata(resolvers.find_file(sourcefile)) or "unknown"),
+ sourcehash = md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"),
sourcefile = sourcefile,
}
io.savedata(luvname,table.serialize(luvdata,true))
end
end
-function statistics.check_fmt_status(texname)
+function statistics.checkfmtstatus(texname)
local enginebanner = status.list().banner
if enginebanner and texname then
local luvname = file.replacesuffix(texname,"luv")
if lfs.isfile(luvname) then
local luv = dofile(luvname)
if luv and luv.sourcefile then
- local sourcehash = md5.hex(io.loaddata(resolvers.find_file(luv.sourcefile)) or "unknown")
+ local sourcehash = md5.hex(io.loaddata(resolvers.findfile(luv.sourcefile)) or "unknown")
local luvbanner = luv.enginebanner or "?"
if luvbanner ~= enginebanner then
- return string.format("engine mismatch (luv:%s <> bin:%s)",luvbanner,enginebanner)
+ return format("engine mismatch (luv: %s <> bin: %s)",luvbanner,enginebanner)
end
local luvhash = luv.sourcehash or "?"
if luvhash ~= sourcehash then
- return string.format("source mismatch (luv:%s <> bin:%s)",luvhash,sourcehash)
+ return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash)
end
else
return "invalid status file"
@@ -10968,25 +13092,30 @@ if not modules then modules = { } end modules ['data-zip'] = {
license = "see context related readme files"
}
+-- partly redone .. needs testing
+
local format, find, match = string.format, string.find, string.match
-local unpack = unpack or table.unpack
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local report_zip = logs.reporter("resolvers","zip")
+
-- zip:///oeps.zip?name=bla/bla.tex
-- zip:///oeps.zip?tree=tex/texmf-local
-- zip:///texmf.zip?tree=/tex/texmf
-- zip:///texmf.zip?tree=/tex/texmf-local
-- zip:///texmf-mine.zip?tree=/tex/texmf-projects
-zip = zip or { }
-zip.archives = zip.archives or { }
-zip.registeredfiles = zip.registeredfiles or { }
+local resolvers = resolvers
+
+zip = zip or { }
+local zip = zip
-local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
-local locators, hashers, concatinators = resolvers.locators, resolvers.hashers, resolvers.concatinators
+zip.archives = zip.archives or { }
+local archives = zip.archives
-local archives = zip.archives
+zip.registeredfiles = zip.registeredfiles or { }
+local registeredfiles = zip.registeredfiles
local function validzip(str) -- todo: use url splitter
if not find(str,"^zip://") then
@@ -11002,7 +13131,7 @@ function zip.openarchive(name)
else
local arch = archives[name]
if not arch then
- local full = resolvers.find_file(name) or ""
+ local full = resolvers.findfile(name) or ""
arch = (full ~= "" and zip.open(full)) or false
archives[name] = arch
end
@@ -11017,163 +13146,162 @@ function zip.closearchive(name)
end
end
-function locators.zip(specification) -- where is this used? startup zips (untested)
- specification = resolvers.splitmethod(specification)
- local zipfile = specification.path
- local zfile = zip.openarchive(name) -- tricky, could be in to be initialized tree
+function resolvers.locators.zip(specification)
+ local archive = specification.filename
+ local zipfile = archive and archive ~= "" and zip.openarchive(archive) -- tricky, could be in to be initialized tree
if trace_locating then
- if zfile then
- logs.report("fileio","zip locator, archive '%s' found",specification.original)
+ if zipfile then
+ report_zip("locator, archive '%s' found",archive)
else
- logs.report("fileio","zip locator, archive '%s' not found",specification.original)
+ report_zip("locator, archive '%s' not found",archive)
end
end
end
-function hashers.zip(tag,name)
+function resolvers.hashers.zip(specification)
+ local archive = specification.filename
if trace_locating then
- logs.report("fileio","loading zip file '%s' as '%s'",name,tag)
+ report_zip("loading file '%s'",archive)
end
- resolvers.usezipfile(format("%s?tree=%s",tag,name))
+ resolvers.usezipfile(specification.original)
end
-function concatinators.zip(tag,path,name)
+function resolvers.concatinators.zip(zipfile,path,name) -- ok ?
if not path or path == "" then
- return format('%s?name=%s',tag,name)
+ return format('%s?name=%s',zipfile,name)
else
- return format('%s?name=%s/%s',tag,path,name)
+ return format('%s?name=%s/%s',zipfile,path,name)
end
end
-function resolvers.isreadable.zip(name)
- return true
-end
-
-function finders.zip(specification,filetype)
- specification = resolvers.splitmethod(specification)
- if specification.path then
- local q = url.query(specification.query)
- if q.name then
- local zfile = zip.openarchive(specification.path)
+function resolvers.finders.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip finder, archive '%s' found",specification.path)
+ report_zip("finder, archive '%s' found",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
dfile = zfile:close()
if trace_locating then
- logs.report("fileio","zip finder, file '%s' found",q.name)
+ report_zip("finder, file '%s' found",queryname)
end
return specification.original
elseif trace_locating then
- logs.report("fileio","zip finder, file '%s' not found",q.name)
+ report_zip("finder, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip finder, unknown archive '%s'",specification.path)
+ report_zip("finder, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip finder, '%s' not found",filename)
+ report_zip("finder, '%s' not found",original)
end
- return unpack(finders.notfound)
+ return resolvers.finders.notfound()
end
-function openers.zip(specification)
- local zipspecification = resolvers.splitmethod(specification)
- if zipspecification.path then
- local q = url.query(zipspecification.query)
- if q.name then
- local zfile = zip.openarchive(zipspecification.path)
+function resolvers.openers.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip opener, archive '%s' opened",zipspecification.path)
+ report_zip("opener, archive '%s' opened",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
- logs.show_open(specification)
if trace_locating then
- logs.report("fileio","zip opener, file '%s' found",q.name)
+ report_zip("opener, file '%s' found",queryname)
end
- return openers.text_opener(specification,dfile,'zip')
+ return resolvers.openers.helpers.textopener('zip',original,dfile)
elseif trace_locating then
- logs.report("fileio","zip opener, file '%s' not found",q.name)
+ report_zip("opener, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip opener, unknown archive '%s'",zipspecification.path)
+ report_zip("opener, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip opener, '%s' not found",filename)
+ report_zip("opener, '%s' not found",original)
end
- return unpack(openers.notfound)
+ return resolvers.openers.notfound()
end
-function loaders.zip(specification)
- specification = resolvers.splitmethod(specification)
- if specification.path then
- local q = url.query(specification.query)
- if q.name then
- local zfile = zip.openarchive(specification.path)
+function resolvers.loaders.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip loader, archive '%s' opened",specification.path)
+ report_zip("loader, archive '%s' opened",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
- logs.show_load(filename)
+ logs.show_load(original)
if trace_locating then
- logs.report("fileio","zip loader, file '%s' loaded",filename)
+ report_zip("loader, file '%s' loaded",original)
end
local s = dfile:read("*all")
dfile:close()
return true, s, #s
elseif trace_locating then
- logs.report("fileio","zip loader, file '%s' not found",q.name)
+ report_zip("loader, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip loader, unknown archive '%s'",specification.path)
+ report_zip("loader, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip loader, '%s' not found",filename)
+ report_zip("loader, '%s' not found",original)
end
- return unpack(openers.notfound)
+ return resolvers.openers.notfound()
end
-- zip:///somefile.zip
-- zip:///somefile.zip?tree=texmf-local -> mount
-function resolvers.usezipfile(zipname)
- zipname = validzip(zipname)
- local specification = resolvers.splitmethod(zipname)
- local zipfile = specification.path
- if zipfile and not zip.registeredfiles[zipname] then
- local tree = url.query(specification.query).tree or ""
- local z = zip.openarchive(zipfile)
+function resolvers.usezipfile(archive)
+ local specification = resolvers.splitmethod(archive) -- to be sure
+ local archive = specification.filename
+ if archive and not registeredfiles[archive] then
+ local z = zip.openarchive(archive)
if z then
- local instance = resolvers.instance
+ local tree = url.query(specification.query).tree or ""
if trace_locating then
- logs.report("fileio","zip registering, registering archive '%s'",zipname)
- end
- statistics.starttiming(instance)
- resolvers.prepend_hash('zip',zipname,zipfile)
- resolvers.extend_texmf_var(zipname) -- resets hashes too
- zip.registeredfiles[zipname] = z
- instance.files[zipname] = resolvers.register_zip_file(z,tree or "")
- statistics.stoptiming(instance)
+ report_zip("registering, registering archive '%s'",archive)
+ end
+ statistics.starttiming(resolvers.instance)
+ resolvers.prependhash('zip',archive)
+ resolvers.extendtexmfvariable(archive) -- resets hashes too
+ registeredfiles[archive] = z
+ instance.files[archive] = resolvers.registerzipfile(z,tree)
+ statistics.stoptiming(resolvers.instance)
elseif trace_locating then
- logs.report("fileio","zip registering, unknown archive '%s'",zipname)
+ report_zip("registering, unknown archive '%s'",archive)
end
elseif trace_locating then
- logs.report("fileio","zip registering, '%s' not found",zipname)
+ report_zip("registering, '%s' not found",archive)
end
end
-function resolvers.register_zip_file(z,tree)
+function resolvers.registerzipfile(z,tree)
local files, filter = { }, ""
if tree == "" then
filter = "^(.+)/(.-)$"
@@ -11181,9 +13309,9 @@ function resolvers.register_zip_file(z,tree)
filter = format("^%s/(.+)/(.-)$",tree)
end
if trace_locating then
- logs.report("fileio","zip registering, using filter '%s'",filter)
+ report_zip("registering, using filter '%s'",filter)
end
- local register, n = resolvers.register_file, 0
+ local register, n = resolvers.registerfile, 0
for i in z:files() do
local path, name = match(i.filename,filter)
if path then
@@ -11198,7 +13326,7 @@ function resolvers.register_zip_file(z,tree)
n = n + 1
end
end
- logs.report("fileio","zip registering, %s files registered",n)
+ report_zip("registering, %s files registered",n)
return files
end
@@ -11207,6 +13335,84 @@ end -- of closure
do -- create closure to overcome 200 locals limit
+if not modules then modules = { } end modules ['data-tre'] = {
+ 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"
+}
+
+-- \input tree://oeps1/**/oeps.tex
+
+local find, gsub, format = string.find, string.gsub, string.format
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_trees = logs.reporter("resolvers","trees")
+
+local resolvers = resolvers
+
+local done, found, notfound = { }, { }, resolvers.finders.notfound
+
+function resolvers.finders.tree(specification)
+ local spec = specification.filename
+ local fnd = found[spec]
+ if fnd == 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
+ 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
+ end
+ end
+ end
+ fnd = notfound() -- false
+ found[spec] = fnd
+ end
+ return fnd
+end
+
+function resolvers.locators.tree(specification)
+ local name = specification.filename
+ if name ~= '' and lfs.isdir(name) then
+ if trace_locating then
+ report_trees("locator '%s' found",name)
+ end
+ resolvers.appendhash('tree',name,false) -- don't cache
+ elseif trace_locating then
+ report_trees("locator '%s' not found",name)
+ end
+end
+
+function resolvers.hashers.tree(specification)
+ local name = specification.filename
+ if trace_locating then
+ report_trees("analysing '%s'",name)
+ end
+ resolvers.methodhandler("hashers",name)
+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
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
if not modules then modules = { } end modules ['data-crl'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
@@ -11215,58 +13421,59 @@ if not modules then modules = { } end modules ['data-crl'] = {
license = "see context related readme files"
}
-local gsub = string.gsub
+-- this one is replaced by data-sch.lua --
-curl = curl or { }
+local gsub = string.gsub
-curl.cached = { }
-curl.cachepath = caches.definepath("curl")
+local resolvers = resolvers
local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
-function curl.fetch(protocol, name)
- local cachename = curl.cachepath() .. "/" .. gsub(name,"[^%a%d%.]+","-")
--- cachename = gsub(cachename,"[\\/]", io.fileseparator)
- cachename = gsub(cachename,"[\\]", "/") -- cleanup
- if not curl.cached[name] then
+resolvers.curl = resolvers.curl or { }
+local curl = resolvers.curl
+
+local cached = { }
+
+local function runcurl(specification)
+ local original = specification.original
+ -- local scheme = specification.scheme
+ local cleanname = gsub(original,"[^%a%d%.]+","-")
+ local cachename = caches.setfirstwritablefile(cleanname,"curl")
+ if not cached[original] then
if not io.exists(cachename) then
- curl.cached[name] = cachename
- local command = "curl --silent --create-dirs --output " .. cachename .. " " .. name -- no protocol .. "://"
+ cached[original] = cachename
+ local command = "curl --silent --create-dirs --output " .. cachename .. " " .. original
os.spawn(command)
end
if io.exists(cachename) then
- curl.cached[name] = cachename
+ cached[original] = cachename
else
- curl.cached[name] = ""
+ cached[original] = ""
end
end
- return curl.cached[name]
+ return cached[original]
end
-function finders.curl(protocol,filename)
- local foundname = curl.fetch(protocol, filename)
- return finders.generic(protocol,foundname,filetype)
-end
-
-function openers.curl(protocol,filename)
- return openers.generic(protocol,filename)
-end
+-- old code: we could be cleaner using specification (see schemes)
-function loaders.curl(protocol,filename)
- return loaders.generic(protocol,filename)
+local function finder(specification,filetype)
+ return resolvers.methodhandler("finders",runcurl(specification),filetype)
end
--- todo: metamethod
+local opener = openers.file
+local loader = loaders.file
-function curl.install(protocol)
- finders[protocol] = function (filename,filetype) return finders.curl(protocol,filename) end
- openers[protocol] = function (filename) return openers.curl(protocol,filename) end
- loaders[protocol] = function (filename) return loaders.curl(protocol,filename) end
+local function install(scheme)
+ finders[scheme] = finder
+ openers[scheme] = opener
+ loaders[scheme] = loader
end
-curl.install('http')
-curl.install('https')
-curl.install('ftp')
+resolvers.curl.install = install
+
+install('http')
+install('https')
+install('ftp')
end -- of closure
@@ -11287,9 +13494,13 @@ if not modules then modules = { } end modules ['data-lua'] = {
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local report_libraries = logs.reporter("resolvers","libraries")
+
local gsub, insert = string.gsub, table.insert
local unpack = unpack or table.unpack
+local resolvers, package = resolvers, package
+
local libformats = { 'luatexlibs', 'tex', 'texmfscripts', 'othertextfiles' } -- 'luainputs'
local clibformats = { 'lib' }
@@ -11298,7 +13509,7 @@ local _path_, libpaths, _cpath_, clibpaths
function package.libpaths()
if not _path_ or package.path ~= _path_ then
_path_ = package.path
- libpaths = file.split_path(_path_,";")
+ libpaths = file.splitpath(_path_,";")
end
return libpaths
end
@@ -11306,7 +13517,7 @@ end
function package.clibpaths()
if not _cpath_ or package.cpath ~= _cpath_ then
_cpath_ = package.cpath
- clibpaths = file.split_path(_cpath_,";")
+ clibpaths = file.splitpath(_cpath_,";")
end
return clibpaths
end
@@ -11315,18 +13526,18 @@ local function thepath(...)
local t = { ... } t[#t+1] = "?.lua"
local path = file.join(unpack(t))
if trace_locating then
- logs.report("fileio","! appending '%s' to 'package.path'",path)
+ report_libraries("! appending '%s' to 'package.path'",path)
end
return path
end
local p_libpaths, a_libpaths = { }, { }
-function package.append_libpath(...)
+function package.appendtolibpath(...)
insert(a_libpath,thepath(...))
end
-function package.prepend_libpath(...)
+function package.prependtolibpath(...)
insert(p_libpaths,1,thepath(...))
end
@@ -11337,31 +13548,30 @@ local function loaded(libpaths,name,simple)
local libpath = libpaths[i]
local resolved = gsub(libpath,"%?",simple)
if trace_locating then -- more detail
- logs.report("fileio","! checking for '%s' on 'package.path': '%s' => '%s'",simple,libpath,resolved)
+ report_libraries("! checking for '%s' on 'package.path': '%s' => '%s'",simple,libpath,resolved)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'package.path': '%s'",name,resolved)
+ report_libraries("! lib '%s' located via 'package.path': '%s'",name,resolved)
end
return loadfile(resolved)
end
end
end
-
package.loaders[2] = function(name) -- was [#package.loaders+1]
if trace_locating then -- mode detail
- logs.report("fileio","! locating '%s'",name)
+ report_libraries("! locating '%s'",name)
end
for i=1,#libformats do
local format = libformats[i]
- local resolved = resolvers.find_file(name,format) or ""
+ local resolved = resolvers.findfile(name,format) or ""
if trace_locating then -- mode detail
- logs.report("fileio","! checking for '%s' using 'libformat path': '%s'",name,format)
+ report_libraries("! checking for '%s' using 'libformat path': '%s'",name,format)
end
if resolved ~= "" then
if trace_locating then
- logs.report("fileio","! lib '%s' located via environment: '%s'",name,resolved)
+ report_libraries("! lib '%s' located via environment: '%s'",name,resolved)
end
return loadfile(resolved)
end
@@ -11379,16 +13589,16 @@ package.loaders[2] = function(name) -- was [#package.loaders+1]
for i=1,#clibformats do
-- better have a dedicated loop
local format = clibformats[i]
- local paths = resolvers.expanded_path_list_from_var(format)
+ local paths = resolvers.expandedpathlistfromvariable(format)
for p=1,#paths do
local path = paths[p]
local resolved = file.join(path,libname)
if trace_locating then -- mode detail
- logs.report("fileio","! checking for '%s' using 'clibformat path': '%s'",libname,path)
+ report_libraries("! checking for '%s' using 'clibformat path': '%s'",libname,path)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'clibformat': '%s'",libname,resolved)
+ report_libraries("! lib '%s' located via 'clibformat': '%s'",libname,resolved)
end
return package.loadlib(resolved,name)
end
@@ -11398,140 +13608,43 @@ package.loaders[2] = function(name) -- was [#package.loaders+1]
local libpath = clibpaths[i]
local resolved = gsub(libpath,"?",simple)
if trace_locating then -- more detail
- logs.report("fileio","! checking for '%s' on 'package.cpath': '%s'",simple,libpath)
+ report_libraries("! checking for '%s' on 'package.cpath': '%s'",simple,libpath)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'package.cpath': '%s'",name,resolved)
+ report_libraries("! lib '%s' located via 'package.cpath': '%s'",name,resolved)
end
return package.loadlib(resolved,name)
end
end
-- just in case the distribution is messed up
if trace_loading then -- more detail
- logs.report("fileio","! checking for '%s' using 'luatexlibs': '%s'",name)
+ report_libraries("! checking for '%s' using 'luatexlibs': '%s'",name)
end
- local resolved = resolvers.find_file(file.basename(name),'luatexlibs') or ""
+ local resolved = resolvers.findfile(file.basename(name),'luatexlibs') or ""
if resolved ~= "" then
if trace_locating then
- logs.report("fileio","! lib '%s' located by basename via environment: '%s'",name,resolved)
+ report_libraries("! lib '%s' located by basename via environment: '%s'",name,resolved)
end
return loadfile(resolved)
end
if trace_locating then
- logs.report("fileio",'? unable to locate lib: %s',name)
+ report_libraries('? unable to locate lib: %s',name)
end
-- return "unable to locate " .. name
end
resolvers.loadlualib = require
+-- -- -- --
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['luat-kps'] = {
- version = 1.001,
- comment = "companion to luatools.lua",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
---[[ldx--
-<p>This file is used when we want the input handlers to behave like
-<type>kpsewhich</type>. What to do with the following:</p>
-
-<typing>
-{$SELFAUTOLOC,$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}
-$SELFAUTOLOC : /usr/tex/bin/platform
-$SELFAUTODIR : /usr/tex/bin
-$SELFAUTOPARENT : /usr/tex
-</typing>
+package.obsolete = package.obsolete or { }
-<p>How about just forgetting about them?</p>
---ldx]]--
+package.append_libpath = appendtolibpath -- will become obsolete
+package.prepend_libpath = prependtolibpath -- will become obsolete
-local suffixes = resolvers.suffixes
-local formats = resolvers.formats
-
-suffixes['gf'] = { '<resolution>gf' }
-suffixes['pk'] = { '<resolution>pk' }
-suffixes['base'] = { 'base' }
-suffixes['bib'] = { 'bib' }
-suffixes['bst'] = { 'bst' }
-suffixes['cnf'] = { 'cnf' }
-suffixes['mem'] = { 'mem' }
-suffixes['mf'] = { 'mf' }
-suffixes['mfpool'] = { 'pool' }
-suffixes['mft'] = { 'mft' }
-suffixes['mppool'] = { 'pool' }
-suffixes['graphic/figure'] = { 'eps', 'epsi' }
-suffixes['texpool'] = { 'pool' }
-suffixes['PostScript header'] = { 'pro' }
-suffixes['ist'] = { 'ist' }
-suffixes['web'] = { 'web', 'ch' }
-suffixes['cweb'] = { 'w', 'web', 'ch' }
-suffixes['cmap files'] = { 'cmap' }
-suffixes['lig files'] = { 'lig' }
-suffixes['bitmap font'] = { }
-suffixes['MetaPost support'] = { }
-suffixes['TeX system documentation'] = { }
-suffixes['TeX system sources'] = { }
-suffixes['dvips config'] = { }
-suffixes['type42 fonts'] = { }
-suffixes['web2c files'] = { }
-suffixes['other text files'] = { }
-suffixes['other binary files'] = { }
-suffixes['opentype fonts'] = { 'otf' }
-
-suffixes['fmt'] = { 'fmt' }
-suffixes['texmfscripts'] = { 'rb','lua','py','pl' }
-
-suffixes['pdftex config'] = { }
-suffixes['Troff fonts'] = { }
-
-suffixes['ls-R'] = { }
-
---[[ldx--
-<p>If you wondered abou tsome of the previous mappings, how about
-the next bunch:</p>
---ldx]]--
-
-formats['bib'] = ''
-formats['bst'] = ''
-formats['mft'] = ''
-formats['ist'] = ''
-formats['web'] = ''
-formats['cweb'] = ''
-formats['MetaPost support'] = ''
-formats['TeX system documentation'] = ''
-formats['TeX system sources'] = ''
-formats['Troff fonts'] = ''
-formats['dvips config'] = ''
-formats['graphic/figure'] = ''
-formats['ls-R'] = ''
-formats['other text files'] = ''
-formats['other binary files'] = ''
-
-formats['gf'] = ''
-formats['pk'] = ''
-formats['base'] = 'MFBASES'
-formats['cnf'] = ''
-formats['mem'] = 'MPMEMS'
-formats['mf'] = 'MFINPUTS'
-formats['mfpool'] = 'MFPOOL'
-formats['mppool'] = 'MPPOOL'
-formats['texpool'] = 'TEXPOOL'
-formats['PostScript header'] = 'TEXPSHEADERS'
-formats['cmap files'] = 'CMAPFONTS'
-formats['type42 fonts'] = 'T42FONTS'
-formats['web2c files'] = 'WEB2C'
-formats['pdftex config'] = 'PDFTEXCONFIG'
-formats['texmfscripts'] = 'TEXMFSCRIPTS'
-formats['bitmap font'] = ''
-formats['lig files'] = 'LIGFONTS'
+package.obsolete.append_libpath = appendtolibpath -- will become obsolete
+package.obsolete.prepend_libpath = prependtolibpath -- will become obsolete
end -- of closure
@@ -11547,49 +13660,54 @@ if not modules then modules = { } end modules ['data-aux'] = {
}
local find = string.find
+local type, next = type, next
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
-function resolvers.update_script(oldname,newname) -- oldname -> own.name, not per se a suffix
+local resolvers = resolvers
+
+local report_scripts = logs.reporter("resolvers","scripts")
+
+function resolvers.updatescript(oldname,newname) -- oldname -> own.name, not per se a suffix
local scriptpath = "scripts/context/lua"
newname = file.addsuffix(newname,"lua")
- local oldscript = resolvers.clean_path(oldname)
+ local oldscript = resolvers.cleanpath(oldname)
if trace_locating then
- logs.report("fileio","to be replaced old script %s", oldscript)
+ report_scripts("to be replaced old script %s", oldscript)
end
- local newscripts = resolvers.find_files(newname) or { }
+ local newscripts = resolvers.findfiles(newname) or { }
if #newscripts == 0 then
if trace_locating then
- logs.report("fileio","unable to locate new script")
+ report_scripts("unable to locate new script")
end
else
for i=1,#newscripts do
- local newscript = resolvers.clean_path(newscripts[i])
+ local newscript = resolvers.cleanpath(newscripts[i])
if trace_locating then
- logs.report("fileio","checking new script %s", newscript)
+ report_scripts("checking new script %s", newscript)
end
if oldscript == newscript then
if trace_locating then
- logs.report("fileio","old and new script are the same")
+ report_scripts("old and new script are the same")
end
elseif not find(newscript,scriptpath) then
if trace_locating then
- logs.report("fileio","new script should come from %s",scriptpath)
+ report_scripts("new script should come from %s",scriptpath)
end
elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
if trace_locating then
- logs.report("fileio","invalid new script name")
+ report_scripts("invalid new script name")
end
else
local newdata = io.loaddata(newscript)
if newdata then
if trace_locating then
- logs.report("fileio","old script content replaced by new content")
+ report_scripts("old script content replaced by new content")
end
io.savedata(oldscript,newdata)
break
elseif trace_locating then
- logs.report("fileio","unable to load new script")
+ report_scripts("unable to load new script")
end
end
end
@@ -11609,72 +13727,133 @@ if not modules then modules = { } end modules ['data-tmf'] = {
license = "see context related readme files"
}
-local find, gsub, match = string.find, string.gsub, string.match
-local getenv, setenv = os.getenv, os.setenv
+local resolvers = resolvers
--- loads *.tmf files in minimal tree roots (to be optimized and documented)
+local report_tds = logs.reporter("resolvers","tds")
-function resolvers.check_environment(tree)
- logs.simpleline()
- setenv('TMP', getenv('TMP') or getenv('TEMP') or getenv('TMPDIR') or getenv('HOME'))
- setenv('TEXOS', getenv('TEXOS') or ("texmf-" .. os.platform))
- setenv('TEXPATH', gsub(tree or "tex","\/+$",''))
- setenv('TEXMFOS', getenv('TEXPATH') .. "/" .. getenv('TEXOS'))
- logs.simpleline()
- logs.simple("preset : TEXPATH => %s", getenv('TEXPATH'))
- logs.simple("preset : TEXOS => %s", getenv('TEXOS'))
- logs.simple("preset : TEXMFOS => %s", getenv('TEXMFOS'))
- logs.simple("preset : TMP => %s", getenv('TMP'))
- logs.simple('')
-end
+-- = <<
+-- ? ??
+-- < +=
+-- > =+
-function resolvers.load_environment(name) -- todo: key=value as well as lua
- local f = io.open(name)
- if f then
- for line in f:lines() do
- if find(line,"^[%%%#]") then
- -- skip comment
- else
- local key, how, value = match(line,"^(.-)%s*([<=>%?]+)%s*(.*)%s*$")
- if how then
- value = gsub(value,"%%(.-)%%", function(v) return getenv(v) or "" end)
- if how == "=" or how == "<<" then
- setenv(key,value)
- elseif how == "?" or how == "??" then
- setenv(key,getenv(key) or value)
- elseif how == "<" or how == "+=" then
- if getenv(key) then
- setenv(key,getenv(key) .. io.fileseparator .. value)
- else
- setenv(key,value)
- end
- elseif how == ">" or how == "=+" then
- if getenv(key) then
- setenv(key,value .. io.pathseparator .. getenv(key))
- else
- setenv(key,value)
- end
- end
- end
- end
+function resolvers.load_tree(tree,resolve)
+ if type(tree) == "string" and tree ~= "" then
+
+ local getenv, setenv = resolvers.getenv, resolvers.setenv
+
+ -- later might listen to the raw osenv var as well
+ local texos = "texmf-" .. os.platform
+
+ local oldroot = environment.texroot
+ local newroot = file.collapsepath(tree)
+
+ local newtree = file.join(newroot,texos)
+ local newpath = file.join(newtree,"bin")
+
+ if not lfs.isdir(newtree) then
+ report_tds("no '%s' under tree %s",texos,tree)
+ os.exit()
end
- f:close()
+ if not lfs.isdir(newpath) then
+ report_tds("no '%s/bin' under tree %s",texos,tree)
+ os.exit()
+ end
+
+ local texmfos = newtree
+
+ environment.texroot = newroot
+ environment.texos = texos
+ environment.texmfos = texmfos
+
+ -- Beware, we need to obey the relocatable autoparent so we
+ -- set TEXMFCNF to its raw value. This is somewhat tricky when
+ -- we run a mkii job from within. Therefore, in mtxrun, there
+ -- is a resolve applied when we're in mkii/kpse mode.
+
+ setenv('SELFAUTOPARENT', newroot)
+ setenv('SELFAUTODIR', newtree)
+ setenv('SELFAUTOLOC', newpath)
+ setenv('TEXROOT', newroot)
+ setenv('TEXOS', texos)
+ setenv('TEXMFOS', texmfos)
+ setenv('TEXMFCNF', resolvers.luacnfspec, not resolve)
+ setenv("PATH", newpath .. io.pathseparator .. getenv("PATH"))
+
+ report_tds("changing from root '%s' to '%s'",oldroot,newroot)
+ report_tds("prepending '%s' to binary path",newpath)
+ report_tds()
end
end
-function resolvers.load_tree(tree)
- if tree and tree ~= "" then
- local setuptex = 'setuptex.tmf'
- if lfs.attributes(tree, "mode") == "directory" then -- check if not nil
- setuptex = tree .. "/" .. setuptex
- else
- setuptex = tree
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-lst'] = {
+ 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"
+}
+
+-- used in mtxrun, can be loaded later .. todo
+
+local find, concat, upper, format = string.find, table.concat, string.upper, string.format
+
+resolvers.listers = resolvers.listers or { }
+
+local resolvers = resolvers
+
+local report_lists = logs.reporter("resolvers","lists")
+
+local function tabstr(str)
+ if type(str) == 'table' then
+ return concat(str," | ")
+ else
+ return str
+ end
+end
+
+function resolvers.listers.variables(pattern)
+ local instance = resolvers.instance
+ local environment = instance.environment
+ local variables = instance.variables
+ local expansions = instance.expansions
+ local pattern = upper(pattern or "")
+ local configured = { }
+ local order = instance.order
+ for i=1,#order do
+ for k, v in next, order[i] do
+ if v ~= nil and configured[k] == nil then
+ configured[k] = v
+ end
end
- if io.exists(setuptex) then
- resolvers.check_environment(tree)
- resolvers.load_environment(setuptex)
+ end
+ local env = table.fastcopy(environment)
+ local var = table.fastcopy(variables)
+ local exp = table.fastcopy(expansions)
+ for key, value in table.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",resolvers.resolve(expansions[key]) or "unset")
end
end
+ instance.environment = table.fastcopy(env)
+ instance.variables = table.fastcopy(var)
+ instance.expansions = table.fastcopy(exp)
+end
+
+function resolvers.listers.configurations(report)
+ local configurations = resolvers.instance.specification
+ local report = report or texio.write_nl
+ for i=1,#configurations do
+ report(resolvers.resolve(configurations[i]))
+ end
end
@@ -11694,9 +13873,15 @@ if not modules then modules = { } end modules ['luat-sta'] = {
local gmatch, match = string.gmatch, string.match
local type = type
-states = states or { }
-states.data = states.data or { }
-states.hash = states.hash or { }
+states = states or { }
+local states = states
+
+states.data = states.data or { }
+local data = states.data
+
+states.hash = states.hash or { }
+local hash = states.hash
+
states.tag = states.tag or ""
states.filename = states.filename or ""
@@ -11706,7 +13891,7 @@ function states.save(filename,tag)
io.savedata(filename,
"-- generator : luat-sta.lua\n" ..
"-- state tag : " .. tag .. "\n\n" ..
- table.serialize(states.data[tag or states.tag] or {},true)
+ table.serialize(data[tag or states.tag] or {},true)
)
end
@@ -11714,11 +13899,11 @@ function states.load(filename,tag)
states.filename = filename
states.tag = tag or "whatever"
states.filename = file.addsuffix(states.filename,'lus')
- states.data[states.tag], states.hash[states.tag] = (io.exists(filename) and dofile(filename)) or { }, { }
+ data[states.tag], hash[states.tag] = (io.exists(filename) and dofile(filename)) or { }, { }
end
-function states.set_by_tag(tag,key,value,default,persistent)
- local d, h = states.data[tag], states.hash[tag]
+local function set_by_tag(tag,key,value,default,persistent)
+ local d, h = data[tag], hash[tag]
if d then
if type(d) == "table" then
local dkey, hkey = key, key
@@ -11738,8 +13923,10 @@ function states.set_by_tag(tag,key,value,default,persistent)
end
dkey, hkey = post, key
end
- if type(value) == nil then
- value = value or default
+ if value == nil then
+ value = default
+ elseif value == false then
+ -- special case
elseif persistent then
value = value or d[dkey] or default
else
@@ -11748,144 +13935,202 @@ function states.set_by_tag(tag,key,value,default,persistent)
d[dkey], h[hkey] = value, value
elseif type(d) == "string" then
-- weird
- states.data[tag], states.hash[tag] = value, value
+ data[tag], hash[tag] = value, value
end
end
end
-function states.get_by_tag(tag,key,default)
- local h = states.hash[tag]
+local function get_by_tag(tag,key,default)
+ local h = hash[tag]
if h and h[key] then
return h[key]
else
- local d = states.data[tag]
+ local d = data[tag]
if d then
for k in gmatch(key,"[^%.]+") do
local dk = d[k]
- if dk then
+ if dk ~= nil then
d = dk
else
return default
end
end
- return d or default
+ if d == false then
+ return false
+ else
+ return d or default
+ end
end
end
end
+states.set_by_tag = set_by_tag
+states.get_by_tag = get_by_tag
+
function states.set(key,value,default,persistent)
- states.set_by_tag(states.tag,key,value,default,persistent)
+ set_by_tag(states.tag,key,value,default,persistent)
end
function states.get(key,default)
- return states.get_by_tag(states.tag,key,default)
-end
-
---~ states.data.update = {
---~ ["version"] = {
---~ ["major"] = 0,
---~ ["minor"] = 1,
---~ },
---~ ["rsync"] = {
---~ ["server"] = "contextgarden.net",
---~ ["module"] = "minimals",
---~ ["repository"] = "current",
---~ ["flags"] = "-rpztlv --stats",
---~ },
---~ ["tasks"] = {
---~ ["update"] = true,
---~ ["make"] = true,
---~ ["delete"] = false,
---~ },
---~ ["platform"] = {
---~ ["host"] = true,
---~ ["other"] = {
---~ ["mswin"] = false,
---~ ["linux"] = false,
---~ ["linux-64"] = false,
---~ ["osx-intel"] = false,
---~ ["osx-ppc"] = false,
---~ ["sun"] = false,
---~ },
---~ },
---~ ["context"] = {
---~ ["available"] = {"current", "beta", "alpha", "experimental"},
---~ ["selected"] = "current",
---~ },
---~ ["formats"] = {
---~ ["cont-en"] = true,
---~ ["cont-nl"] = true,
---~ ["cont-de"] = false,
---~ ["cont-cz"] = false,
---~ ["cont-fr"] = false,
---~ ["cont-ro"] = false,
---~ },
---~ ["engine"] = {
---~ ["pdftex"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ ["pdftex"] = true,
---~ },
---~ },
---~ ["luatex"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ },
---~ },
---~ ["xetex"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ ["xetex"] = false,
---~ },
---~ },
---~ ["metapost"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ ["mpost"] = true,
---~ ["metafun"] = true,
---~ },
---~ },
---~ },
---~ ["fonts"] = {
---~ },
---~ ["doc"] = {
---~ },
---~ ["modules"] = {
---~ ["f-urwgaramond"] = false,
---~ ["f-urwgothic"] = false,
---~ ["t-bnf"] = false,
---~ ["t-chromato"] = false,
---~ ["t-cmscbf"] = false,
---~ ["t-cmttbf"] = false,
---~ ["t-construction-plan"] = false,
---~ ["t-degrade"] = false,
---~ ["t-french"] = false,
---~ ["t-lettrine"] = false,
---~ ["t-lilypond"] = false,
---~ ["t-mathsets"] = false,
---~ ["t-tikz"] = false,
---~ ["t-typearea"] = false,
---~ ["t-vim"] = false,
---~ },
---~ }
-
---~ states.save("teststate", "update")
---~ states.load("teststate", "update")
-
---~ print(states.get_by_tag("update","rsync.server","unknown"))
---~ states.set_by_tag("update","rsync.server","oeps")
---~ print(states.get_by_tag("update","rsync.server","unknown"))
---~ states.save("teststate", "update")
---~ states.load("teststate", "update")
---~ print(states.get_by_tag("update","rsync.server","unknown"))
+ return get_by_tag(states.tag,key,default)
+end
+
+
+
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['luat-fmt'] = {
+ version = 1.001,
+ comment = "companion to mtxrun",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+
+local format = string.format
+
+local report_format = logs.reporter("resolvers","formats")
+
+-- helper for mtxrun
+
+local quoted = string.quoted
+
+local function primaryflags() -- not yet ok
+ local trackers = environment.argument("trackers")
+ local directives = environment.argument("directives")
+ local flags = ""
+ if trackers and trackers ~= "" then
+ flags = flags .. "--trackers=" .. quoted(trackers)
+ end
+ if directives and directives ~= "" then
+ flags = flags .. "--directives=" .. quoted(directives)
+ end
+ return flags
+end
+
+function environment.make_format(name)
+ -- change to format path (early as we need expanded paths)
+ local olddir = lfs.currentdir()
+ local path = caches.getwritablepath("formats") or "" -- maybe platform
+ if path ~= "" then
+ lfs.chdir(path)
+ end
+ report_format("format path: %s",lfs.currentdir())
+ -- check source file
+ local texsourcename = file.addsuffix(name,"mkiv")
+ local fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
+ if fulltexsourcename == "" then
+ texsourcename = file.addsuffix(name,"tex")
+ fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
+ end
+ if fulltexsourcename == "" then
+ report_format("no tex source file with name: %s (mkiv or tex)",name)
+ lfs.chdir(olddir)
+ return
+ else
+ report_format("using tex source file: %s",fulltexsourcename)
+ end
+ local texsourcepath = dir.expandname(file.dirname(fulltexsourcename)) -- really needed
+ -- check specification
+ local specificationname = file.replacesuffix(fulltexsourcename,"lus")
+ local fullspecificationname = resolvers.findfile(specificationname,"tex") or ""
+ if fullspecificationname == "" then
+ specificationname = file.join(texsourcepath,"context.lus")
+ fullspecificationname = resolvers.findfile(specificationname,"tex") or ""
+ end
+ if fullspecificationname == "" then
+ report_format("unknown stub specification: %s",specificationname)
+ lfs.chdir(olddir)
+ return
+ end
+ local specificationpath = file.dirname(fullspecificationname)
+ -- load specification
+ local usedluastub = nil
+ local usedlualibs = dofile(fullspecificationname)
+ if type(usedlualibs) == "string" then
+ usedluastub = file.join(file.dirname(fullspecificationname),usedlualibs)
+ elseif type(usedlualibs) == "table" then
+ report_format("using stub specification: %s",fullspecificationname)
+ local texbasename = file.basename(name)
+ local luastubname = file.addsuffix(texbasename,"lua")
+ local lucstubname = file.addsuffix(texbasename,"luc")
+ -- pack libraries in stub
+ report_format("creating initialization file: %s",luastubname)
+ utilities.merger.selfcreate(usedlualibs,specificationpath,luastubname)
+ -- compile stub file (does not save that much as we don't use this stub at startup any more)
+ local strip = resolvers.booleanvariable("LUACSTRIP", true)
+ if utilities.lua.compile(luastubname,lucstubname) and lfs.isfile(lucstubname) then
+ report_format("using compiled initialization file: %s",lucstubname)
+ usedluastub = lucstubname
+ else
+ report_format("using uncompiled initialization file: %s",luastubname)
+ usedluastub = luastubname
+ end
+ else
+ report_format("invalid stub specification: %s",fullspecificationname)
+ lfs.chdir(olddir)
+ return
+ end
+ -- generate format
+ local command = format("luatex --ini %s --lua=%s %s %sdump",primaryflags(),quoted(usedluastub),quoted(fulltexsourcename),os.platform == "unix" and "\\\\" or "\\")
+ report_format("running command: %s\n",command)
+ os.spawn(command)
+ -- remove related mem files
+ local pattern = file.removesuffix(file.basename(usedluastub)).."-*.mem"
+ -- report_format("removing related mplib format with pattern '%s'", pattern)
+ local mp = dir.glob(pattern)
+ if mp then
+ for i=1,#mp do
+ local name = mp[i]
+ report_format("removing related mplib format %s", file.basename(name))
+ os.remove(name)
+ end
+ end
+ lfs.chdir(olddir)
+end
+
+function environment.run_format(name,data,more)
+ -- hm, rather old code here; we can now use the file.whatever functions
+ if name and name ~= "" then
+ local barename = file.removesuffix(name)
+ local fmtname = caches.getfirstreadablefile(file.addsuffix(barename,"fmt"),"formats")
+ if fmtname == "" then
+ fmtname = resolvers.findfile(file.addsuffix(barename,"fmt")) or ""
+ end
+ fmtname = resolvers.cleanpath(fmtname)
+ if fmtname == "" then
+ report_format("no format with name: %s",name)
+ else
+ local barename = file.removesuffix(name) -- expanded name
+ local luaname = file.addsuffix(barename,"luc")
+ if not lfs.isfile(luaname) then
+ luaname = file.addsuffix(barename,"lua")
+ end
+ if not lfs.isfile(luaname) then
+ report_format("using format name: %s",fmtname)
+ report_format("no luc/lua with name: %s",barename)
+ else
+ local command = format("luatex %s --fmt=%s --lua=%s %s %s",primaryflags(),quoted(barename),quoted(luaname),quoted(data),more ~= "" and quoted(more) or "")
+ report_format("running command: %s",command)
+ os.spawn(command)
+ end
+ end
+ end
+end
end -- of closure
-- end library merge
-own = { } -- not local
+own = { } -- not local, might change
+
+own.libs = { -- order can be made better
-own.libs = { -- todo: check which ones are really needed
'l-string.lua',
'l-lpeg.lua',
'l-table.lua',
@@ -11898,39 +14143,55 @@ own.libs = { -- todo: check which ones are really needed
'l-url.lua',
'l-dir.lua',
'l-boolean.lua',
+ 'l-unicode.lua',
'l-math.lua',
--- 'l-unicode.lua',
--- 'l-tex.lua',
- 'l-utils.lua',
- 'l-aux.lua',
--- 'l-xml.lua',
- 'trac-tra.lua',
+
+ 'util-tab.lua',
+ 'util-sto.lua',
+ 'util-mrg.lua',
+ 'util-lua.lua',
+ 'util-prs.lua',
+ 'util-fmt.lua',
+ 'util-deb.lua',
+
+ 'trac-inf.lua',
+ 'trac-set.lua',
+ 'trac-log.lua',
+ 'trac-pro.lua',
+
+ 'luat-env.lua', -- can come before inf (as in mkiv)
+
'lxml-tab.lua',
'lxml-lpt.lua',
--- 'lxml-ent.lua',
+ -- 'lxml-ent.lua',
'lxml-mis.lua',
'lxml-aux.lua',
'lxml-xml.lua',
- 'luat-env.lua',
- 'trac-inf.lua',
- 'trac-log.lua',
- 'data-res.lua',
+
+ 'data-ini.lua',
+ 'data-exp.lua',
+ 'data-env.lua',
'data-tmp.lua',
+ 'data-met.lua',
+ 'data-res.lua',
'data-pre.lua',
'data-inp.lua',
'data-out.lua',
+ 'data-fil.lua',
'data-con.lua',
'data-use.lua',
-- 'data-tex.lua',
-- 'data-bin.lua',
'data-zip.lua',
+ 'data-tre.lua',
'data-crl.lua',
'data-lua.lua',
- 'data-kps.lua', -- so that we can replace kpsewhich
'data-aux.lua', -- updater
- 'data-tmf.lua', -- tree files
- -- needed ?
- 'luat-sta.lua', -- states
+ 'data-tmf.lua',
+ 'data-lst.lua',
+
+ 'luat-sta.lua',
+ 'luat-fmt.lua',
}
-- We need this hack till luatex is fixed.
@@ -11943,35 +14204,62 @@ end
-- End of hack.
-own.name = (environment and environment.ownname) or arg[0] or 'luatools.lua'
+local format, gsub, gmatch, match = string.format, string.gsub, string.gmatch, string.match
+local concat = table.concat
+own.name = (environment and environment.ownname) or arg[0] or 'mtxrun.lua'
+own.path = gsub(match(own.name,"^(.+)[\\/].-$") or ".","\\","/")
+
+local ownpath, owntree = own.path, environment and environment.ownpath or own.path
+
+own.list = {
+ '.',
+ ownpath ,
+ ownpath .. "/../sources", -- HH's development path
+ owntree .. "/../../texmf-local/tex/context/base",
+ owntree .. "/../../texmf-context/tex/context/base",
+ owntree .. "/../../texmf-dist/tex/context/base",
+ owntree .. "/../../texmf/tex/context/base",
+ owntree .. "/../../../texmf-local/tex/context/base",
+ owntree .. "/../../../texmf-context/tex/context/base",
+ owntree .. "/../../../texmf-dist/tex/context/base",
+ owntree .. "/../../../texmf/tex/context/base",
+}
-own.path = string.match(own.name,"^(.+)[\\/].-$") or "."
-own.list = { '.' }
-if own.path ~= '.' then
- table.insert(own.list,own.path)
-end
-table.insert(own.list,own.path.."/../../texmf-dist/tex/context/base")
-table.insert(own.list,own.path.."/../../../tex/context/base")
-table.insert(own.list,own.path.."/mtx")
-table.insert(own.list,own.path.."/../sources")
+if own.path == "." then table.remove(own.list,1) end
local function locate_libs()
- for _, lib in pairs(own.libs) do
- for _, pth in pairs(own.list) do
- local filename = string.gsub(pth .. "/" .. lib,"\\","/")
+ for l=1,#own.libs do
+ local lib = own.libs[l]
+ for p =1,#own.list do
+ local pth = own.list[p]
+ local filename = pth .. "/" .. lib
+ local found = lfs.isfile(filename)
+ if found then
+ package.path = package.path .. ";" .. pth .. "/?.lua" -- in case l-* does a require
+ return pth
+ end
+ end
+ end
+end
+
+local function load_libs()
+ local found = locate_libs()
+ if found then
+ for l=1,#own.libs do
+ local filename = found .. "/" .. own.libs[l]
local codeblob = loadfile(filename)
if codeblob then
codeblob()
- own.list = { pth } -- speed up te search
- break
end
end
+ else
+ resolvers = nil
end
end
if not resolvers then
- locate_libs()
+ load_libs()
end
if not resolvers then
@@ -11983,20 +14271,56 @@ if not resolvers then
os.exit()
end
-logs.setprogram('MTXrun',"TDS Runner Tool 1.24",environment.arguments["verbose"] or false)
+-- verbosity
-local instance = resolvers.reset()
+local e_verbose = environment.arguments["verbose"]
-local trackspec = environment.argument("trackers") or environment.argument("track")
+if e_verbose then
+ trackers.enable("resolvers.locating")
+end
+
+-- some common flags (also passed through environment)
+
+local e_silent = environment.argument("silent")
+local e_noconsole = environment.argument("noconsole")
+
+local e_trackers = environment.argument("trackers")
+local e_directives = environment.argument("directives")
+local e_experiments = environment.argument("experiments")
+
+if e_silent == true then
+ e_silent = "*"
+end
+
+if type(e_silent) == "string" then
+ if type(e_directives) == "string" then
+ e_directives = format("%s,logs.blocked={%s}",e_directives,e_silent)
+ else
+ e_directives = format("logs.blocked={%s}",e_silent)
+ end
+end
-if trackspec then
- trackers.enable(trackspec)
+if e_noconsole then
+ if type(e_directives) == "string" then
+ e_directives = format("%s,logs.target=file",e_directives)
+ else
+ e_directives = format("logs.target=file")
+ end
end
-runners = runners or { } -- global
-messages = messages or { }
+if e_trackers then trackers .enable(e_trackers) end
+if e_directives then directives .enable(e_directives) end
+if e_experiments then experiments.enable(e_experiments) end
-messages.help = [[
+if not environment.trackers then environment.trackers = e_trackers end
+if not environment.directives then environment.directives = e_directives end
+if not environment.experiments then environment.experiments = e_experiments end
+
+--
+
+local instance = resolvers.reset()
+
+local helpinfo = [[
--script run an mtx script (lua prefered method) (--noquotes), no script gives list
--execute run a script or program (texmfstart method) (--noquotes)
--resolve resolve prefixed arguments
@@ -12011,15 +14335,14 @@ messages.help = [[
--ifchanged=filename only execute when given file has changed (md checksum)
--iftouched=old,new only execute when given file has changed (time stamp)
---make create stubs for (context related) scripts
---remove remove stubs (context related) scripts
+--makestubs create stubs for (context related) scripts
+--removestubs remove stubs (context related) scripts
--stubpath=binpath paths where stubs wil be written
--windows create windows (mswin) stubs
--unix create unix (linux) stubs
--verbose give a bit more info
--trackers=list enable given trackers
---engine=str target engine
--progname=str format or backend
--edit launch editor with found file
@@ -12032,8 +14355,35 @@ messages.help = [[
--forcekpse force using kpse (handy when no mkiv and cache installed but less functionality)
--prefixes show supported prefixes
+
+--generate generate file database
+
+--variables show configuration variables
+--configurations show configuration order
+
+--expand-braces expand complex variable
+--expand-path expand variable (resolve paths)
+--expand-var expand variable (resolve references)
+--show-path show path expansion of ...
+--var-value report value of variable
+--find-file report file location
+--find-path report path of file
+
+--pattern=str filter variables
]]
+local application = logs.application {
+ name = "mtxrun",
+ banner = "ConTeXt TDS Runner Tool 1.30",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
+messages = messages or { } -- for the moment
+
+runners = runners or { } -- global (might become local)
+
runners.applications = {
["lua"] = "luatex --luaonly",
["luc"] = "luatex --luaonly",
@@ -12056,7 +14406,7 @@ runners.registered = {
makempy = { 'makempy.pl', true },
mptopdf = { 'mptopdf.pl', true },
pstopdf = { 'pstopdf.rb', true }, -- converts ps (and some more) images, does some cleaning (replaced)
--- examplex = { 'examplex.rb', false },
+ -- examplex = { 'examplex.rb', false },
concheck = { 'concheck.rb', false },
runtools = { 'runtools.rb', true },
textools = { 'textools.rb', true },
@@ -12065,9 +14415,9 @@ runners.registered = {
rlxtools = { 'rlxtools.rb', true },
pdftools = { 'pdftools.rb', true },
mpstools = { 'mpstools.rb', true },
--- exatools = { 'exatools.rb', true },
+ -- exatools = { 'exatools.rb', true },
xmltools = { 'xmltools.rb', true },
--- luatools = { 'luatools.lua', true },
+ -- luatools = { 'luatools.lua', true },
mtxtools = { 'mtxtools.rb', true },
pdftrimwhite = { 'pdftrimwhite.pl', false }
}
@@ -12086,45 +14436,39 @@ end
function runners.prepare()
local checkname = environment.argument("ifchanged")
- if checkname and checkname ~= "" then
+ if type(checkname) == "string" and checkname ~= "" then
local oldchecksum = file.loadchecksum(checkname)
local newchecksum = file.checksum(checkname)
if oldchecksum == newchecksum then
- logs.simple("file '%s' is unchanged",checkname)
+ if e_verbose then
+ report("file '%s' is unchanged",checkname)
+ end
return "skip"
- else
- logs.simple("file '%s' is changed, processing started",checkname)
+ elseif e_verbose then
+ report("file '%s' is changed, processing started",checkname)
end
file.savechecksum(checkname)
end
- local oldname, newname = string.split(environment.argument("iftouched") or "", ",")
- if oldname and newname and oldname ~= "" and newname ~= "" then
- if not file.needs_updating(oldname,newname) then
- logs.simple("file '%s' and '%s' have same age",oldname,newname)
- return "skip"
- else
- logs.simple("file '%s' is older than '%s'",oldname,newname)
- end
- end
- local tree = environment.argument('tree') or ""
- if environment.argument('autotree') then
- tree = os.getenv('TEXMFSTART_TREE') or os.getenv('TEXMFSTARTTREE') or tree
- end
- if tree and tree ~= "" then
- resolvers.load_tree(tree)
- end
- local env = environment.argument('environment') or ""
- if env and env ~= "" then
- for _,e in pairs(string.split(env)) do
- -- maybe force suffix when not given
- resolvers.load_tree(e)
+ local touchname = environment.argument("iftouched")
+ if type(touchname) == "string" and touchname ~= "" then
+ local oldname, newname = string.split(touchname, ",")
+ if oldname and newname and oldname ~= "" and newname ~= "" then
+ if not file.needs_updating(oldname,newname) then
+ if e_verbose then
+ report("file '%s' and '%s' have same age",oldname,newname)
+ end
+ return "skip"
+ elseif e_verbose then
+ report("file '%s' is older than '%s'",oldname,newname)
+ end
end
end
local runpath = environment.argument("path")
- if runpath and not lfs.chdir(runpath) then
- logs.simple("unable to change to path '%s'",runpath)
+ if type(runpath) == "string" and not lfs.chdir(runpath) then
+ report("unable to change to path '%s'",runpath)
return "error"
end
+ runners.prepare = function() end
return "run"
end
@@ -12137,8 +14481,6 @@ function runners.execute_script(fullname,internal,nosplit)
elseif state == 'skip' then
return true
elseif state == "run" then
- instance.progname = environment.argument("progname") or instance.progname
- instance.format = environment.argument("format") or instance.format
local path, name, suffix, result = file.dirname(fullname), file.basename(fullname), file.extname(fullname), ""
if path ~= "" then
result = fullname
@@ -12155,21 +14497,21 @@ function runners.execute_script(fullname,internal,nosplit)
if suffix == "" then
-- loop over known suffixes
for _,s in pairs(runners.suffixes) do
- result = resolvers.find_file(name .. "." .. s, 'texmfscripts')
+ result = resolvers.findfile(name .. "." .. s, 'texmfscripts')
if result ~= "" then
break
end
end
elseif runners.applications[suffix] then
- result = resolvers.find_file(name, 'texmfscripts')
+ result = resolvers.findfile(name, 'texmfscripts')
else
-- maybe look on path
- result = resolvers.find_file(name, 'other text files')
+ result = resolvers.findfile(name, 'other text files')
end
end
if result and result ~= "" then
if not no_split then
- local before, after = environment.split_arguments(fullname) -- already done
+ local before, after = environment.splitarguments(fullname) -- already done
environment.arguments_before, environment.arguments_after = before, after
end
if internal then
@@ -12181,12 +14523,12 @@ function runners.execute_script(fullname,internal,nosplit)
if binary and binary ~= "" then
result = binary .. " " .. result
end
- local command = result .. " " .. environment.reconstruct_commandline(environment.arguments_after,noquote)
- if logs.verbose then
- logs.simpleline()
- logs.simple("executing: %s",command)
- logs.simpleline()
- logs.simpleline()
+ local command = result .. " " .. environment.reconstructcommandline(environment.arguments_after,noquote)
+ if e_verbose then
+ report()
+ report("executing: %s",command)
+ report()
+ report()
io.flush()
end
-- no os.exec because otherwise we get the wrong return value
@@ -12196,14 +14538,14 @@ function runners.execute_script(fullname,internal,nosplit)
else
if binary then
binary = file.addsuffix(binary,os.binsuffix)
- for p in string.gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
+ for p in gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
if lfs.isfile(file.join(p,binary)) then
return false
end
end
- logs.simpleline()
- logs.simple("This script needs '%s' which seems not to be installed.",binary)
- logs.simpleline()
+ report()
+ report("This script needs '%s' which seems not to be installed.",binary)
+ report()
end
return false
end
@@ -12223,14 +14565,15 @@ function runners.execute_program(fullname)
elseif state == 'skip' then
return true
elseif state == "run" then
- local before, after = environment.split_arguments(fullname)
- environment.initialize_arguments(after)
+ local before, after = environment.splitarguments(fullname)
+ for k=1,#after do after[k] = resolvers.resolve(after[k]) end
+ environment.initializearguments(after)
fullname = fullname:gsub("^bin:","")
- local command = fullname .. " " .. (environment.reconstruct_commandline(after or "",noquote) or "")
- logs.simpleline()
- logs.simple("executing: %s",command)
- logs.simpleline()
- logs.simpleline()
+ local command = fullname .. " " .. (environment.reconstructcommandline(after or "",noquote) or "")
+ report()
+ report("executing: %s",command)
+ report()
+ report()
io.flush()
local code = os.exec(command) -- (fullname,unpack(after)) does not work / maybe spawn
return code == 0
@@ -12239,7 +14582,7 @@ function runners.execute_program(fullname)
return false
end
--- the --usekpse flag will fallback on kpse (hm, we can better update mtx-stubs)
+-- the --usekpse flag will fallback (not default) on kpse (hm, we can better update mtx-stubs)
local windows_stub = '@echo off\013\010setlocal\013\010set ownpath=%%~dp0%%\013\010texlua "%%ownpath%%mtxrun.lua" --usekpse --execute %s %%*\013\010endlocal\013\010'
local unix_stub = '#!/bin/sh\010mtxrun --usekpse --execute %s \"$@\"\010'
@@ -12258,22 +14601,22 @@ function runners.handle_stubs(create)
for _,v in pairs(runners.registered) do
local name, doit = v[1], v[2]
if doit then
- local base = string.gsub(file.basename(name), "%.(.-)$", "")
+ local base = gsub(file.basename(name), "%.(.-)$", "")
if create then
if windows then
- io.savedata(file.join(stubpath,base..".bat"),string.format(windows_stub,name))
- logs.simple("windows stub for '%s' created",base)
+ io.savedata(file.join(stubpath,base..".bat"),format(windows_stub,name))
+ report("windows stub for '%s' created",base)
end
if unix then
- io.savedata(file.join(stubpath,base),string.format(unix_stub,name))
- logs.simple("unix stub for '%s' created",base)
+ io.savedata(file.join(stubpath,base),format(unix_stub,name))
+ report("unix stub for '%s' created",base)
end
else
if windows and (os.remove(file.join(stubpath,base..'.bat')) or os.remove(file.join(stubpath,base..'.cmd'))) then
- logs.simple("windows stub for '%s' removed", base)
+ report("windows stub for '%s' removed", base)
end
if unix and (os.remove(file.join(stubpath,base)) or os.remove(file.join(stubpath,base..'.sh'))) then
- logs.simple("unix stub for '%s' removed",base)
+ report("unix stub for '%s' removed",base)
end
end
end
@@ -12289,7 +14632,7 @@ end
function runners.locate_file(filename)
-- differs from texmfstart where locate appends .com .exe .bat ... todo
if filename and filename ~= "" then
- runners.report_location(resolvers.find_given_file(filename))
+ runners.report_location(resolvers.findgivenfile(filename))
end
end
@@ -12298,28 +14641,28 @@ function runners.locate_platform()
end
function runners.report_location(result)
- if logs.verbose then
- logs.simpleline()
+ if e_verbose then
+ reportline()
if result and result ~= "" then
- logs.simple(result)
+ report(result)
else
- logs.simple("not found")
+ report("not found")
end
else
io.write(result)
end
end
-function runners.edit_script(filename) -- we assume that vim is present on most systems
- local editor = os.getenv("MTXRUN_EDITOR") or os.getenv("TEXMFSTART_EDITOR") or os.getenv("EDITOR") or 'vim'
+function runners.edit_script(filename) -- we assume that gvim is present on most systems (todo: also in cnf file)
+ local editor = os.getenv("MTXRUN_EDITOR") or os.getenv("TEXMFSTART_EDITOR") or os.getenv("EDITOR") or 'gvim'
local rest = resolvers.resolve(filename)
if rest ~= "" then
local command = editor .. " " .. rest
- if logs.verbose then
- logs.simpleline()
- logs.simple("starting editor: %s",command)
- logs.simple_line()
- logs.simple_line()
+ if e_verbose then
+ report()
+ report("starting editor: %s",command)
+ report()
+ report()
end
os.launch(command)
end
@@ -12362,33 +14705,33 @@ end
function runners.launch_file(filename)
instance.allresults = true
- logs.setverbose(true)
+ trackers.enable("resolvers.locating")
local pattern = environment.arguments["pattern"]
if not pattern or pattern == "" then
pattern = filename
end
if not pattern or pattern == "" then
- logs.simple("provide name or --pattern=")
+ report("provide name or --pattern=")
else
- local t = resolvers.find_files(pattern)
+ local t = resolvers.findfiles(pattern)
if not t or #t == 0 then
- t = resolvers.find_files("*/" .. pattern)
+ t = resolvers.findfiles("*/" .. pattern)
end
if not t or #t == 0 then
- t = resolvers.find_files("*/" .. pattern .. "*")
+ t = resolvers.findfiles("*/" .. pattern .. "*")
end
if t and #t > 0 then
if environment.arguments["all"] then
for _, v in pairs(t) do
- logs.simple("launching %s", v)
+ report("launching %s", v)
resolvers.launch(v)
end
else
- logs.simple("launching %s", t[1])
+ report("launching %s", t[1])
resolvers.launch(t[1])
end
else
- logs.simple("no match for %s", pattern)
+ report("no match for %s", pattern)
end
end
end
@@ -12421,33 +14764,45 @@ function runners.find_mtx_script(filename)
local mtxprefix = (filename:find("^mtx%-") and "") or "mtx-"
-- context namespace, mtx-<filename>
fullname = mtxprefix .. filename
- fullname = found(fullname) or resolvers.find_file(fullname)
+ fullname = found(fullname) or resolvers.findfile(fullname)
if fullname and fullname ~= "" then
return fullname
end
-- context namespace, mtx-<filename>s
fullname = mtxprefix .. basename .. "s" .. "." .. suffix
- fullname = found(fullname) or resolvers.find_file(fullname)
+ fullname = found(fullname) or resolvers.findfile(fullname)
if fullname and fullname ~= "" then
return fullname
end
-- context namespace, mtx-<filename minus trailing s>
fullname = mtxprefix .. basename:gsub("s$","") .. "." .. suffix
- fullname = found(fullname) or resolvers.find_file(fullname)
+ fullname = found(fullname) or resolvers.findfile(fullname)
if fullname and fullname ~= "" then
return fullname
end
-- context namespace, just <filename>
- fullname = resolvers.find_file(filename)
+ fullname = resolvers.findfile(filename)
return fullname
end
-function runners.execute_ctx_script(filename)
+function runners.register_arguments(...)
+ local arguments = environment.arguments_after
+ local passedon = { ... }
+ for i=#passedon,1,-1 do
+ local pi = passedon[i]
+ if pi then
+ table.insert(arguments,1,pi)
+ end
+ end
+end
+
+function runners.execute_ctx_script(filename,...)
+ runners.register_arguments(...)
local arguments = environment.arguments_after
local fullname = runners.find_mtx_script(filename) or ""
if file.extname(fullname) == "cld" then
-- handy in editors where we force --autopdf
- logs.simple("running cld script: %s",filename)
+ report("running cld script: %s",filename)
table.insert(arguments,1,fullname)
table.insert(arguments,"--autopdf")
fullname = runners.find_mtx_script("context") or ""
@@ -12455,7 +14810,7 @@ function runners.execute_ctx_script(filename)
-- retry after generate but only if --autogenerate
if fullname == "" and environment.argument("autogenerate") then -- might become the default
instance.renewcache = true
- logs.setverbose(true)
+ trackers.enable("resolvers.locating")
resolvers.load()
--
fullname = runners.find_mtx_script(filename) or ""
@@ -12470,7 +14825,7 @@ function runners.execute_ctx_script(filename)
elseif state == "run" then
-- load and save ... kind of undocumented
arg = { } for _,v in pairs(arguments) do arg[#arg+1] = resolvers.resolve(v) end
- environment.initialize_arguments(arg)
+ environment.initializearguments(arg)
local loadname = environment.arguments['load']
if loadname then
if type(loadname) ~= "string" then loadname = file.basename(fullname) end
@@ -12478,8 +14833,8 @@ function runners.execute_ctx_script(filename)
runners.load_script_session(loadname)
end
filename = environment.files[1]
- if logs.verbose then
- logs.simple("using script: %s\n",fullname)
+ if e_verbose then
+ report("using script: %s\n",fullname)
end
environment.ownscript = fullname
dofile(fullname)
@@ -12495,44 +14850,42 @@ function runners.execute_ctx_script(filename)
return true
end
else
- -- logs.setverbose(true)
if filename == "" or filename == "help" then
- local context = resolvers.find_file("mtx-context.lua")
- logs.setverbose(true)
+ local context = resolvers.findfile("mtx-context.lua")
+ trackers.enable("resolvers.locating")
if context ~= "" then
- local result = dir.glob((string.gsub(context,"mtx%-context","mtx-*"))) -- () needed
+ local result = dir.glob((gsub(context,"mtx%-context","mtx-*"))) -- () needed
local valid = { }
table.sort(result)
for i=1,#result do
local scriptname = result[i]
- local scriptbase = string.match(scriptname,".*mtx%-([^%-]-)%.lua")
+ local scriptbase = match(scriptname,".*mtx%-([^%-]-)%.lua")
if scriptbase then
local data = io.loaddata(scriptname)
- local banner, version = string.match(data,"[\n\r]logs%.extendbanner%s*%(%s*[\"\']([^\n\r]+)%s*(%d+%.%d+)")
+ local banner, version = match(data,"[\n\r]logs%.extendbanner%s*%(%s*[\"\']([^\n\r]+)%s*(%d+%.%d+)")
if banner then
valid[#valid+1] = { scriptbase, version, banner }
end
end
end
if #valid > 0 then
- logs.reportbanner()
- logs.reportline()
- logs.simple("no script name given, known scripts:")
- logs.simple()
+ application.identify()
+ report("no script name given, known scripts:")
+ report()
for k=1,#valid do
local v = valid[k]
- logs.simple("%-12s %4s %s",v[1],v[2],v[3])
+ report("%-12s %4s %s",v[1],v[2],v[3])
end
end
else
- logs.simple("no script name given")
+ report("no script name given")
end
else
filename = file.addsuffix(filename,"lua")
if file.is_qualified_path(filename) then
- logs.simple("unknown script '%s'",filename)
+ report("unknown script '%s'",filename)
else
- logs.simple("unknown script '%s' or 'mtx-%s'",filename,filename)
+ report("unknown script '%s' or 'mtx-%s'",filename,filename)
end
end
return false
@@ -12540,9 +14893,9 @@ function runners.execute_ctx_script(filename)
end
function runners.prefixes()
- logs.reportbanner()
- logs.reportline()
- logs.simple(table.concat(resolvers.allprefixes(true)," "))
+ application.identify()
+ report()
+ report(concat(resolvers.allprefixes(true)," "))
end
function runners.timedrun(filename) -- just for me
@@ -12562,13 +14915,11 @@ end
local filename = environment.files[1] or ""
local ok = true
-local before, after = environment.split_arguments(filename)
+local before, after = environment.splitarguments(filename)
environment.arguments_before, environment.arguments_after = before, after
-environment.initialize_arguments(before)
+environment.initializearguments(before)
-instance.engine = environment.argument("engine") or 'luatex'
-instance.progname = environment.argument("progname") or 'context'
-instance.lsrmode = environment.argument("lsr") or false
+instance.lsrmode = environment.argument("lsr") or false
-- maybe the unset has to go to this level
@@ -12576,36 +14927,40 @@ local is_mkii_stub = runners.registered[file.removesuffix(file.basename(filename
if environment.argument("usekpse") or environment.argument("forcekpse") or is_mkii_stub then
+ resolvers.load_tree(environment.argument('tree'),true) -- force resolve of TEXMFCNF
+
os.setenv("engine","")
os.setenv("progname","")
local remapper = {
- otf = "opentype fonts",
- ttf = "truetype fonts",
- ttc = "truetype fonts",
- pfb = "type1 fonts",
+ otf = "opentype fonts",
+ ttf = "truetype fonts",
+ ttc = "truetype fonts",
+ pfb = "type1 fonts",
other = "other text files",
}
+ local progname = environment.argument("progname") or 'context'
+
local function kpse_initialized()
texconfig.kpse_init = true
local t = os.clock()
- local k = kpse.original.new("luatex",instance.progname)
+ local k = kpse.original.new("luatex",progname)
local dummy = k:find_file("mtxrun.lua") -- so that we're initialized
- logs.simple("kpse fallback with progname '%s' initialized in %s seconds",instance.progname,os.clock()-t)
+ report("kpse fallback with progname '%s' initialized in %s seconds",progname,os.clock()-t)
kpse_initialized = function() return k end
return k
end
- local find_file = resolvers.find_file
- local show_path = resolvers.show_path
+ local findfile = resolvers.findfile
+ local showpath = resolvers.showpath
if environment.argument("forcekpse") then
- function resolvers.find_file(name,kind)
- return (kpse_initialized():find_file(resolvers.clean_path(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
+ function resolvers.findfile(name,kind)
+ return (kpse_initialized():find_file(resolvers.cleanpath(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
end
- function resolvers.show_path(name)
+ function resolvers.showpath(name)
return (kpse_initialized():show_path(name)) or ""
end
@@ -12613,16 +14968,16 @@ if environment.argument("usekpse") or environment.argument("forcekpse") or is_mk
resolvers.load()
- function resolvers.find_file(name,kind)
- local found = find_file(name,kind) or ""
+ function resolvers.findfile(name,kind)
+ local found = findfile(name,kind) or ""
if found ~= "" then
return found
else
- return (kpse_initialized():find_file(resolvers.clean_path(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
+ return (kpse_initialized():find_file(resolvers.cleanpath(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
end
end
- function resolvers.show_path(name)
- local found = show_path(name) or ""
+ function resolvers.showpath(name)
+ local found = showpath(name) or ""
if found ~= "" then
return found
else
@@ -12632,80 +14987,317 @@ if environment.argument("usekpse") or environment.argument("forcekpse") or is_mk
end
+ function runners.loadbase()
+ end
+
else
- resolvers.load()
+ function runners.loadbase(...)
+ if not resolvers.load(...) then
+ report("forcing cache reload")
+ instance.renewcache = true
+ trackers.enable("resolvers.locating")
+ if not resolvers.load(...) then
+ report("the resolver databases are not present or outdated")
+ end
+ end
+ end
+
+ resolvers.load_tree(environment.argument('tree'))
end
+
if environment.argument("selfmerge") then
+
-- embed used libraries
- utils.merger.selfmerge(own.name,own.libs,own.list)
+
+ runners.loadbase()
+ local found = locate_libs()
+ if found then
+ utilities.merger.selfmerge(own.name,own.libs,{ found })
+ end
+
elseif environment.argument("selfclean") then
+
-- remove embedded libraries
- utils.merger.selfclean(own.name)
+
+ runners.loadbase()
+ utilities.merger.selfclean(own.name)
+
elseif environment.argument("selfupdate") then
- logs.setverbose(true)
- resolvers.update_script(own.name,"mtxrun")
+
+ runners.loadbase()
+ trackers.enable("resolvers.locating")
+ resolvers.updatescript(own.name,"mtxrun")
+
elseif environment.argument("ctxlua") or environment.argument("internal") then
+
-- run a script by loading it (using libs)
+
+ runners.loadbase()
ok = runners.execute_script(filename,true)
+
elseif environment.argument("script") or environment.argument("scripts") then
+
-- run a script by loading it (using libs), pass args
+
+ runners.loadbase()
if is_mkii_stub then
- -- execute mkii script
ok = runners.execute_script(filename,false,true)
else
ok = runners.execute_ctx_script(filename)
end
+
elseif environment.argument("execute") then
+
-- execute script
+
+ runners.loadbase()
ok = runners.execute_script(filename)
+
elseif environment.argument("direct") then
+
-- equals bin:
+
+ runners.loadbase()
ok = runners.execute_program(filename)
+
elseif environment.argument("edit") then
+
-- edit file
+
+ runners.loadbase()
runners.edit_script(filename)
+
elseif environment.argument("launch") then
+
+ runners.loadbase()
runners.launch_file(filename)
-elseif environment.argument("make") then
- -- make stubs
+
+elseif environment.argument("makestubs") then
+
+ -- make stubs (depricated)
+
runners.handle_stubs(true)
-elseif environment.argument("remove") then
- -- remove stub
+
+elseif environment.argument("removestubs") then
+
+ -- remove stub (depricated)
+
+ runners.loadbase()
runners.handle_stubs(false)
+
elseif environment.argument("resolve") then
+
-- resolve string
+
+ runners.loadbase()
runners.resolve_string(filename)
+
elseif environment.argument("locate") then
+
-- locate file
+
+ runners.loadbase()
runners.locate_file(filename)
-elseif environment.argument("platform")then
+
+elseif environment.argument("platform") or environment.argument("show-platform") then
+
-- locate platform
+
+ runners.loadbase()
runners.locate_platform()
+
elseif environment.argument("prefixes") then
+
+ runners.loadbase()
runners.prefixes()
+
elseif environment.argument("timedrun") then
+
-- locate platform
+
+ runners.loadbase()
runners.timedrun(filename)
+
+elseif environment.argument("variables") or environment.argument("show-variables") or environment.argument("expansions") or environment.argument("show-expansions") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expansions",filename)
+
+ resolvers.load("nofiles")
+ resolvers.listers.variables(environment.argument("pattern"))
+
+elseif environment.argument("configurations") or environment.argument("show-configurations") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--configurations",filename)
+
+ resolvers.load("nofiles")
+ resolvers.listers.configurations()
+
+elseif environment.argument("find-file") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--find-file",filename)
+
+ resolvers.load()
+ local e_pattern = environment.argument("pattern")
+ local e_format = environment.arguments("format")
+ if not e_pattern then
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.findfiles,environment.files,e_format)
+ elseif type(e_pattern) == "string" then
+ instance.allresults = true -- brrrr
+ resolvers.dowithfilesandreport(resolvers.findfiles,{ e_pattern }, e_format)
+ end
+
+elseif environment.argument("find-path") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--find-path",filename)
+
+ resolvers.load()
+ local path = resolvers.findpath(filename, instance.my_format)
+ if e_verbose then
+ report(path)
+ else
+ print(path)
+ end
+
+elseif environment.argument("expand-braces") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expand-braces",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.expandbraces, environment.files)
+
+elseif environment.argument("expand-path") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expand-path",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.expandpath, environment.files)
+
+elseif environment.argument("expand-var") or environment.argument("expand-variable") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expand-var",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.expansion, environment.files)
+
+elseif environment.argument("show-path") or environment.argument("path-value") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--show-path",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.showpath, environment.files)
+
+elseif environment.argument("var-value") or environment.argument("show-value") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--show-value",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.variable,environment.files)
+
+elseif environment.argument("format-path") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--format-path",filename)
+
+ resolvers.load()
+ report(caches.getwritablepath("format"))
+
+elseif environment.argument("pattern") then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--pattern='" .. environment.argument("pattern") .. "'",filename)
+
+elseif environment.argument("generate") then
+
+ -- luatools
+
+ instance.renewcache = true
+ trackers.enable("resolvers.locating")
+ resolvers.load()
+
+elseif environment.argument("make") or environment.argument("ini") or environment.argument("compile") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--make",filename)
+
+ resolvers.load()
+ trackers.enable("resolvers.locating")
+ environment.make_format(filename)
+
+elseif environment.argument("run") then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--run",filename)
+
+elseif environment.argument("fmt") then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--fmt",filename)
+
+elseif environment.argument("help") and filename=='base' then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--help")
+
elseif environment.argument("help") or filename=='help' or filename == "" then
- logs.help(messages.help)
- -- execute script
+
+ application.help()
+
elseif filename:find("^bin:") then
+
+ runners.loadbase()
ok = runners.execute_program(filename)
+
elseif is_mkii_stub then
+
-- execute mkii script
+
+ runners.loadbase()
ok = runners.execute_script(filename,false,true)
-else
+
+elseif false then
+
+ runners.loadbase()
ok = runners.execute_ctx_script(filename)
if not ok then
ok = runners.execute_script(filename)
end
+
+elseif environment.files[1] == 'texmfcnf.lua' then -- so that we don't need to load mtx-base
+
+ resolvers.load("nofiles")
+ resolvers.listers.configurations()
+
+else
+
+ runners.loadbase()
+ runners.execute_ctx_script("mtx-base",filename)
+
+end
+
+if e_verbose then
+ report()
+ report("runtime: %0.3f seconds",os.runtime())
end
-if os.platform == "unix" then
- io.write("\n")
+if os.type ~= "windows" then
+ texio.write("\n") -- is this still valid?
end
if ok == false then ok = 1 elseif ok == true then ok = 0 end
diff --git a/Master/texmf-dist/scripts/context/stubs/mswin/metatex.exe b/Master/bin/win32/pstopdf.exe
index 2d45f27494d..2d45f27494d 100755
--- a/Master/texmf-dist/scripts/context/stubs/mswin/metatex.exe
+++ b/Master/bin/win32/pstopdf.exe
Binary files differ
diff --git a/Master/texmf-dist/colors/icc/context/colorprofiles.lua b/Master/texmf-dist/colors/icc/context/colorprofiles.lua
new file mode 100644
index 00000000000..b2ae731a78c
--- /dev/null
+++ b/Master/texmf-dist/colors/icc/context/colorprofiles.lua
@@ -0,0 +1,14 @@
+-- This is just an example. We support both an xml format as well
+-- as lua tables.
+
+return {
+ {
+ filename = "CoatedFOGRA39.icc",
+ id = "FOGRA39",
+ info = "Coated FOGRA39 (ISO 12647-2:2004)",
+ checksum = "74ff62f330bf0dbe4495b5720542d511",
+ url = "http://www.color.org",
+ outputcondition = "",
+ version = "21000000",
+ }
+}
diff --git a/Master/texmf-dist/colors/icc/context/colorprofiles.xml b/Master/texmf-dist/colors/icc/context/colorprofiles.xml
new file mode 100644
index 00000000000..96b8b54c590
--- /dev/null
+++ b/Master/texmf-dist/colors/icc/context/colorprofiles.xml
@@ -0,0 +1,427 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<!--
+
+ We can also support using a lua file: icc.lcg (color goodies) in which case
+ the filename is the hash.
+
+-->
+
+<!--
+
+ <profile>
+ <filename>the file name of the ICC profile</filename>
+ <colorspace>the color space of the profile</colorspace>
+ <class>the device class of the profile (prtr=printer, mntr=monitor, scnr=scanner,spac=space)</class>
+ <id>identifier of the measured data (not for the profile) on which the profile relies; e.g. FOGRA39</id>
+ <info>(optional) info text about the profile</info>
+ <checksum>md5 checksum of the profile</checksum>
+ <version>version number of the profile in hex form</version>
+ <url>url where the profile can be downloaded</url>
+ <outputcondition>(optional) useful info about print technology, paper type/weight</outputcondition>
+ </profile>
+
+-->
+
+<profiles>
+
+ <!-- ghostscript profiles -->
+
+ <profile>
+ <type>default</type>
+ <filename>default_cmyk.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <info>Artifex PS CMYK Profile</info>
+ <checksum>de955d740998369ea1051a4e3e84eb90</checksum>
+ <version>42000000</version>
+ </profile>
+
+ <profile>
+ <type>default</type>
+ <filename>default_gray.icc</filename>
+ <colorspace>GRAY</colorspace>
+ <class>scnr</class>
+ </profile>
+
+ <profile>
+ <type>default</type>
+ <filename>default_rgb.icc</filename>
+ <colorspace>RGB</colorspace>
+ <class>mntr</class>
+ </profile>
+
+ <profile>
+ <type>default</type>
+ <filename>lab.icc</filename>
+ <colorspace>Lab</colorspace>
+ <class>spac</class>
+ </profile>
+
+ <profile>
+ <type>default</type>
+ <filename>ps_cmyk.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <info>U.S. Web Coated (SWOP) v2</info>
+ <checksum>79d7e984ea3ac74eed7cc92bf6b22a0d</checksum>
+ <version>21000000</version>
+ </profile>
+
+ <profile>
+ <type>default</type>
+ <filename>ps_gray.icc</filename>
+ <colorspace>GRAY</colorspace>
+ <class>mntr</class>
+ </profile>
+
+ <profile>
+ <type>default</type>
+ <filename>ps_rgb.icc</filename>
+ <colorspace>RGB</colorspace>
+ <class>mntr</class>
+ </profile>
+
+ <profile>
+ <type>default</type>
+ <filename>sgray.icc</filename>
+ <colorspace>GRAY</colorspace>
+ <class>scnr</class>
+ </profile>
+
+ <profile>
+ <type>default</type>
+ <filename>srgb.icc</filename>
+ <colorspace>RGB</colorspace>
+ <class>mntr</class>
+ </profile>
+
+ <!-- srgb.icc also as output intent -->
+
+ <profile>
+ <filename>srgb.icc</filename>
+ <colorspace>RGB</colorspace>
+ <class>mntr</class>
+ <id>Custom</id>
+ <info>sRGB IEC61966-2.1</info>
+ <checksum>1d3fda2edb4a89ab60a23c5f7c7d81dd</checksum>
+ <version>21000000</version>
+ <url>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+ <!-- test profiles from www.color.org -->
+
+ <profile>
+ <filename>Probev1_ICCv2.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>Custom</id>
+ <info>Probev1_ICCv2.icc</info>
+ <checksum>7d8357d5cb86990465b3d7d4ef359404</checksum>
+ <version>20000000</version>
+ <url>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+ <profile>
+ <filename>Probev1_ICCv4.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>Custom</id>
+ <info>Probev1_ICCv4.icc</info>
+ <checksum>915f373c10daf2e295c0e707d3beb856</checksum>
+ <version>40000000</version>
+ <url>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+ <profile>
+ <filename>Probe2_ICCv4</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>Custom</id>
+ <info>Probev2_ICCv4.icc</info>
+ <checksum>cd8ccdb2b8ee902100cfc45a75b84579</checksum>
+ <version>40000000</version>
+ <url>>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+
+ <!-- GWG recommendated ICC profiles; see http://www.gwg.org/colormanagement.phtml for the details -->
+
+ <profile>
+ <filename>CoatedFOGRA39.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>FOGRA39</id>
+ <info>Coated FOGRA39 (ISO 12647-2:2004)</info>
+ <checksum>74ff62f330bf0dbe4495b5720542d511</checksum>
+ <version>21000000</version>
+ <url>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+ <profile>
+ <filename>GRACoL2006_Coated1v2.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>CGATS TR 006</id>
+ <info>GRACoL2006_Coated1v2.icc</info>
+ <checksum>cc7a6196271b13dbae4622aa1fa0fca9</checksum>
+ <version>20000000</version>
+ <url>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+ <profile>
+ <filename>ISOcoated_v2_300_eci.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>FOGRA39</id>
+ <info>ISO Coated v2 300% (ECI)</info>
+ <checksum>e14f5db955711d914d877df35ad7a1b5</checksum>
+ <version>24000000</version>
+ <url>http://www.color.org</url>
+ <outputcondition>Offset printing, according to ISO 12647-2:2004/Amd 1, OFCOM, paper type 1 or 2 = coated art, 115 g/m2, tone value increase curves A (CMY) and B (K)</outputcondition>
+ </profile>
+
+ <profile>
+ <filename>ISOcoated_v2_eci.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>FOGRA39</id>
+ <info>ISO Coated v2 (ECI)</info>
+ <checksum>bda07efcacf5377e91edacb0454ea7e5</checksum>
+ <version>2400000</version>
+ <url>http://www.color.org</url>
+ <outputcondition>Offset printing, according to ISO 12647-2:2004/Amd 1, OFCOM, paper type 1 or 2 = coated art, 115 g/m2, tone value increase curves A (CMY) and B (K)</outputcondition>
+ </profile>
+
+ <profile>
+ <filename>ISOnewspaper26v4.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>IFRA26</id>
+ <info>ISOnewspaper26v4</info>
+ <checksum>bca21a6afa3a4b5cef9ca8e91565c1b7</checksum>
+ <version>2400000</version>
+ <url>http://www.color.org</url>
+ <outputcondition>Newspaper Coldset-Offset printing according to ISO/DIS 12647-3:2004, standard newsprint 45g/m2, screen ruling 40 l/cm, see readme</outputcondition>
+ </profile>
+
+ <profile>
+ <filename>ISOnewspaper26v4_gr.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>IFRA26</id>
+ <info>ISOnewspaper26v4_gr</info>
+ <checksum>45dabde250dbbc2b4ab1ddaab1380892</checksum>
+ <version>2400000</version>
+ <url>http://www.color.org</url>
+ <outputcondition>Newspaper Coldset-Offset printing according to ISO/DIS 12647-3:2004, standard newsprint 45g/m2, screen ruling 40 l/cm, see readme</outputcondition>
+ </profile>
+
+ <profile>
+ <filename>ISOuncoated.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>FOGRA29</id>
+ <info>ISO Uncoated</info>
+ <checksum>c62d711cf39488a1fc60e8be18a9d6d7</checksum>
+ <version>2000000</version>
+ <url>http://www.color.org</url>
+ <outputcondition>Offset printing according to ISO/DIS 12647-2:2003, OFCOM, paper type 4 = white, uncoated, 120 g/m2, screen ruling 60 cm-1, positive-acting plates, see readme</outputcondition>
+ </profile>
+
+ <profile>
+ <filename>ISOuncoatedyellowish.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>FOGRA30</id>
+ <info>ISO Uncoated Yellowish</info>
+ <checksum>06db2a1b6d1eff0a49aaf350888a170e</checksum>
+ <version>2400000</version>
+ <url>http://www.color.org</url>
+ <outputcondition>Offset printing according to ISO/DIS 12647-2:2004, OFCOM, paper type 5 = slightly yellowish, uncoated, 120 g/m2, screen ruling 60 cm-1, positive-acting plates, see readme</outputcondition>
+ </profile>
+
+ <profile>
+ <filename>ISOwebcoated.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>FOGRA28</id>
+ <info>ISO Web Coated</info>
+ <checksum>0bf2ede138b0272421b629b6c8c4deaf</checksum>
+ <version>2000000</version>
+ <url>http://www.color.org</url>
+ <outputcondition>Offset printing according to ISO/DIS 12647-2:2003, OFCOM, paper type 3 = low weight coated web offset, 60 g/m2, screen ruling 60 cm-1, positive-acting plates, see readme</outputcondition>
+ </profile>
+
+ <profile>
+ <filename>JapanColor2001Coated.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>JC200103</id>
+ <info>Japan Color 2001 Coated</info>
+ <checksum>4cb167869183b59bbad20fb90ccf3e0c</checksum>
+ <version>2100000</version>
+ <url>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+ <profile>
+ <filename>JapanColor2002Newspaper.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>JCN2002</id>
+ <info>Japan Color 2002 Newspaper</info>
+ <checksum>fa5be8d5b4eb756bf1399afc2cda7d1c</checksum>
+ <version>2100000</version>
+ <url>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+ <profile>
+ <filename>JapanWebCoated.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>JCW2003</id>
+ <info>Japan Web Coated (Ad)</info>
+ <checksum>f8607e551233cefdda26d7d6baaa2a4f</checksum>
+ <version>2100000</version>
+ <url>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+ <profile>
+ <filename>SNAP-2007.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>CGATS TR 002</id>
+ <info>SNAP 2007</info>
+ <checksum>8d48c9b10937672a0690b724e0527247</checksum>
+ <version>4100000</version>
+ <url>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+ <profile>
+ <filename>SWOP2006_Coated3v2.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>CGATS TR 003</id>
+ <info>SWOP2006_Coated3v2.icc</info>
+ <checksum>7fbad4c0ae1cb7195c34bfc20e623437</checksum>
+ <version>2000000</version>
+ <url>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+ <profile>
+ <filename>SWOP2006_Coated5v2.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>CGATS TR 005</id>
+ <info>SWOP2006_Coated5v2.icc</info>
+ <checksum>34f7c3c809b926b173ee54e13d655bee</checksum>
+ <version>2000000</version>
+ <url>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+ <profile>
+ <filename>UncoatedFOGRA29.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>FOGRA29</id>
+ <info>Uncoated FOGRA29 (ISO 12647-2:2004)</info>
+ <checksum>e3d8676356f2709a7b120036b7ada996</checksum>
+ <version>2100000</version>
+ <url>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+ <profile>
+ <filename>WebCoatedFOGRA28.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>FOGRA28</id>
+ <info>Web Coated FOGRA28 (ISO 12647-2:2004)</info>
+ <checksum>6e3b77d09d3613bc52ba7f63048d4638</checksum>
+ <version>2100000</version>
+ <url>http://www.color.org</url>
+ <outputcondition/>
+ </profile>
+
+ <!--
+ Some currently (JUN2010) unregistered gravure profiles from ECI (www.eci.org). As a consequence
+ the 'Custom' id is used; url and outputcondition are filled with something that hopefully
+ makes sense
+ -->
+
+ <profile>
+ <filename>PSR_LWC_PLUS_V2_PT.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>Custom</id>
+ <info>PSR_LWC_PLUS_V2_PT</info>
+ <checksum>2373b50219e8df70c70f2e0e798c2e38</checksum>
+ <version>2400000</version>
+ <url>http://www.eci.org</url>
+ <outputcondition>Gravure printing according to ISO 12647-4, paper type LWC (light weight coated) plus</outputcondition>
+ </profile>
+
+ <profile>
+ <filename>PSR_LWC_STD_V2_PT.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>Custom</id>
+ <info>PSR_LWC_STD_V2_PT</info>
+ <checksum>0964b3ca5390dfaf7723527bbb7cec37</checksum>
+ <version>2400000</version>
+ <url>http://www.eci.org</url>
+ <outputcondition>Gravure printing according to ISO 12647-4, paper type LWC (light weight coated) standard</outputcondition>
+ </profile>
+
+ <profile>
+ <filename>PSR_SC_PLUS_V2_PT.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>Custom</id>
+ <info>PSR_SC_PLUS_V2_PT</info>
+ <checksum>aa767f70696059557917c050d3ebc6ba</checksum>
+ <version>2400000</version>
+ <url>http://www.eci.org</url>
+ <outputcondition>Gravure printing according to ISO 12647-4, paper type SC (super-calendered) plus</outputcondition>
+ </profile>
+
+ <profile>
+ <filename>PSR_SC_STD_V2_PT.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>Custom</id>
+ <info>PSR_SC_STD_V2_PT</info>
+ <checksum>6d978234223b29cde94dd3a5c3624504</checksum>
+ <version>2400000</version>
+ <url>http://www.eci.org</url>
+ <outputcondition>Gravure printing according to ISO 12647-4, paper type SC (super-calendered) standard</outputcondition>
+ </profile>
+
+ <profile>
+ <filename>PSRgravureMF.icc</filename>
+ <colorspace>CMYK</colorspace>
+ <class>prtr</class>
+ <id>Custom</id>
+ <info>PSRgravureMF</info>
+ <checksum>728f70371f82e930637e60c760876a3d</checksum>
+ <version>2000000</version>
+ <url>http://www.eci.org</url>
+ <outputcondition>Gravure printing according to ISO 12647-4, paper type MF (machine finished), 55 g/m2
+ </outputcondition>
+ </profile>
+
+ <!-- End of 'GWG recommendated ICC profiles' -->
+
+</profiles>
diff --git a/Master/texmf-dist/context/data/scite/cont-cs-scite.properties b/Master/texmf-dist/context/data/scite/cont-cs-scite.properties
index ddf42aacdd6..5c9cc3354df 100644
--- a/Master/texmf-dist/context/data/scite/cont-cs-scite.properties
+++ b/Master/texmf-dist/context/data/scite/cont-cs-scite.properties
@@ -1 +1 @@
-keywordclass.macros.context.cs=CAP Cap Caps MESIC Rimskecislice SLOVA SLOVO Slova Slovo VSEDNIDEN Znak Znaky aktualnicislonadpisu aktualnidatum appendix barva bilemisto bublinkovanapoveda bypassblocks cap cernalinka cernelinky chapter chem cisla cislonadpisu citace citovat completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister coupledregister crlf datum definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling definetype definetypeface definuj definujbarvu definujblok definujbloksekce definujbuffer definujfont definujformatodkazu definujinterakcnimenu definujinterakcnimenu definujkombinovanyseznam definujkonverzi definujlogo definujnadpis definujobrazeksymbol definujodkaz definujodsazovani definujodstavce definujopis definujoramovani definujoramovanytext definujpaletu definujplvouciobjekt definujpodpole definujpole definujpopis definujpopisek definujprekryv definujpreskok definujprofil definujprogram definujprostredizakladnihofontu definujrejstrik definujsablonutabulky definujsekci definujseznam definujseznamodkazu definujskupinubarev definujstartstop definujsymbol definujsynonumumfontu definujsynonyma definujtabelaci definujtext definujtrideni definujupravu definujvelikostpapiru definujverzi definujvycet definujvystup definujzakladnifont definujzasobnikpoli definujznaceni description dodrzujprofil dodrzujverzi dodrzujverziprofilu dvoustrannypapir emptylines enumeration externiobraz footnotetext forceblocks framedtext hl hlavnijazyk indentation ininner inouter instalacejazyka interakcnilista interakcnitlacitka jazyk jdidolu jdina jdinabox klonujpole komentar konvertujcislo kopirujpole korekcebilehomista labeling listsymbol loadsorts loadsynonyms mapfontsize marginalnilinka marginalnitext matematika mediaeval meritko mesic mezera mrizka nadpis nadruhyokraj name naokraj nastavbarvu nastavbarvy nastavbilamista nastavblok nastavbloksekce nastavbuffer nastavcernelinky nastavcislonadpisu nastavcislostrany nastavcislovani nastavcislovaniodstavcu nastavcislovaniradku nastavcislovanistran nastavcitaci nastavdefinicipoznamekpodcarou nastavdeleniplvoucichobjektu nastavdelitko nastavdolnitexty nastavexterniobrazy nastavhorejsek nastavhornitexty nastavinterakci nastavinterakcnilistu nastavinterakcnimenu nastavinterakcniobrazovku nastavjazyk nastavkapitalky nastavkombinovanyseznam nastavkomentar nastavlegendu nastavmarginalie nastavmarginalniblok nastavmarginalnilinky nastavmeziradkovoumezeru nastavnadpis nastavnadpisy nastavodkazovani nastavodsazeni nastavodsazovani nastavodstavce nastavopis nastavoramovanetexty nastavoramovani nastavorez nastavotoceni nastavpaletu nastavplvouciobjekt nastavplvouciobjekty nastavpodcislostrany nastavpodtrzeni nastavpole nastavpolozky nastavpopisek nastavpopisky nastavpopisy nastavpozadi nastavpozadi nastavpoznamkypodcarou nastavprechodstrany nastavpreskok nastavprofily nastavprogramy nastavprostredizakladnihofontu nastavpublikace nastavradkovani nastavradky nastavrastr nastavrejstrik nastavrovnice nastavsadusymbolu nastavsekci nastavseznam nastavseznamodkazu nastavsirkucary nastavsloupce nastavspodek nastavspojeni nastavsynchronizaci nastavsynchronizacnilistu nastavsynonyma nastavsystem nastavtab nastavtabelaci nastavtabulky nastavtenkelinky nastavtext nastavtexthlavicky nastavtextovelinky nastavtextpopisku nastavtexttexty nastavtextyupati nastavtextyzahlavi nastavtlacitka nastavtoleranci nastavtrideni nastavtype nastavumisteniprotejsku nastavumistovani nastavupati nastavupravu nastavurl nastavusporadani nastavvelikostpapiru nastavverze nastavvsechnapole nastavvycty nastavvyplnovelinky nastavvyplnoveradky nastavvystup nastavvzhled nastavzahlavi nastavzakladnifont nastavzarovnani nastavznaceni nastavzuzeni nastrane nejakyradek nekde nextsection nivy nizky nocap nop obrazovka odkaz odkaz odkaznadatum odkaznastranu odkaznatext odsazovani okr opis opissoubor oramovani oref orez otocit overbar overbars overstrike overstrikes oznacverzi paragraph parovastrana part pis placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist pol pole polozka polozky popisky porovnejpaletu porovnejskupinubarev pozadi pozice poznamka poznamkapodcarou pref prelozit premistinamrizku prepninazakladnifont preskoc prizpusobivepole prizpusobvzhled program propojeneznaceni propojenydokument propojenyrejstrik publikace ran ref register reservefloat reset resettextcontent resetznaceni rimskecislice rozdelplvouciobjekt rozpojeneznaceni roztazene schovejbloky section sedabarva seeregister settextcontent setupfonthandling setupfontsynonym setupforms setupinterlinespace2 setupitemgroup setuplistalternative setuppaper setupstrut sloupec slovovpravo sort spodek stanovcharakteristickuseznamu stanovcislonadpisu startalignment startbarva startbuffer startbuffer startcitace startcolumns startcombination startdescription startdocument startenumeration startfakt startfigure startfloattext startformula startframedtext starthiding startinteraktivnimenu startitemgroup startkomentar startkomponenta startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginalnilinka startmarginblock startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startpozadi startprodukt startprofile startprojekt startprostredi startregister startsymbolset startsynchronization starttable starttables starttabulate starttextovalinka starttyping startunpacked startverze startzhustene stopalignment stopbarva stopbuffer stopbuffer stopcitace stopcolumns stopcombination stopdescription stopdocument stopenumeration stopfakt stopfigure stopfloattext stopformula stopframedtext stophiding stopinteraktivnimenu stopitemgroup stopkomentar stopkomponenta stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginalnilinka stopmarginblock stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stoppozadi stopprodukt stopprofile stopprojekt stopprostredi stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptextovalinka stoptyping stopunpacked stopverze stopzhustene strana sub subject subsection subsubject subsubsection subsubsubject sym symbol synchronizacnilista synchronizovat synonym tab tecky tenkalinka tenkelinky tex texthlavicky textovalinka textpopisku title tlacitko tref tvrdemezery typebuffer typstrany ukazbarvu ukazexterniobrazy ukazmrizku ukaznastaveni ukazpaletu ukazpodpery ukazpole ukazpostredizakladnihofontu ukazramecek ukazsadusymbolu ukazskupinubarev ukazupravu ukazvytisk ukazvzhled ukazzakladnifont umistikombinovanyseznam umistikombinovanyseznam umistilegendu umistiloga umistilokalnipoznamkypodcarou umistinadsebe umistinamrizku umistipodrovnici umistipoznamkypodcarou umistirejstrik umistirejstrik umistirovnici umistiseznam umistivedlesebe umistizalozky underbar underbars usedirectory usetypescript usetypescriptfile uzijURL uzijbloky uzijexternidokument uzijexterniobraz uzijexternisoubor uzijexternisoubory uzijexternizvuk uzijkodovani uzijmodul uzijodkazy uzijprikazy uzijspeciality uzijsymbol verze vl vlasovalinka vlevo vpravo vradku vsedniden vyberbloky vyberpapir vyberverzi vyplnenytext vyplnovelinky vyplnovepole vyplnovyradek vysoky zablokujinterakcnimenu zachovejbloky zadnamezera zadnebilemisto zadnedalsibloky zadnedalsisoubory zadnehorniadolniradky zadneodsazovani zadnezahlaviaupati zadneznaceni zadnyseznam zalozka zapisdorejstriku zapisdoseznamu zapisdoseznamuodkazu zapismeziseznam zaramovani zarovnanonastred zarovnanovlevo zarovnanovpravo zasobnikpoli zaznamovepole zhustene ziskejbuffer ziskejznaceni zlomek znaceni znak znaky zpracujbloky zpracujstranu zrcadlit zref \ No newline at end of file
+keywordclass.macros.context.cs=CAP Cap Caps MESIC Rimskecislice SLOVA SLOVO Slova Slovo VSEDNIDEN Znak Znaky aktualnicislonadpisu aktualnidatum appendix barva bilemisto bublinkovanapoveda bypassblocks cap cernalinka cernelinky chapter chem cisla cislonadpisu citace citovat comment completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister coupledregister crlf datum definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling definetype definetypeface definuj definujbarvu definujblok definujbloksekce definujbuffer definujfont definujformatodkazu definujinterakcnimenu definujinterakcnimenu definujkombinovanyseznam definujkonverzi definujlogo definujnadpis definujobrazeksymbol definujodkaz definujodsazovani definujodstavce definujopis definujoramovani definujoramovanytext definujpaletu definujplvouciobjekt definujpodpole definujpole definujpopis definujpopisek definujprekryv definujpreskok definujprofil definujprogram definujprostredizakladnihofontu definujrejstrik definujsablonutabulky definujsekci definujseznam definujseznamodkazu definujskupinubarev definujstartstop definujsymbol definujsynonumumfontu definujsynonyma definujtabelaci definujtext definujtrideni definujupravu definujvelikostpapiru definujverzi definujvycet definujvystup definujzakladnifont definujzasobnikpoli definujznaceni description dodrzujprofil dodrzujverzi dodrzujverziprofilu dvoustrannypapir emptylines enumeration externiobraz footnotetext forceblocks framedtext hl hlavnijazyk indentation ininner inouter instalacejazyka interakcnilista interakcnitlacitka jazyk jdidolu jdina jdinabox klonujpole konvertujcislo kopirujpole korekcebilehomista labeling listsymbol loadsorts loadsynonyms mapfontsize marginalnilinka marginalnitext matematika mediaeval meritko mesic mezera mrizka nadpis nadruhyokraj name naokraj nastavbarvu nastavbarvy nastavbilamista nastavblok nastavbloksekce nastavbuffer nastavcernelinky nastavcislonadpisu nastavcislostrany nastavcislovani nastavcislovaniodstavcu nastavcislovaniradku nastavcislovanistran nastavcitaci nastavdefinicipoznamekpodcarou nastavdeleniplvoucichobjektu nastavdelitko nastavdolnitexty nastavexterniobrazy nastavhorejsek nastavhornitexty nastavinterakci nastavinterakcnilistu nastavinterakcnimenu nastavinterakcniobrazovku nastavjazyk nastavkapitalky nastavkombinovanyseznam nastavkomentar nastavlegendu nastavmarginalie nastavmarginalniblok nastavmarginalnilinky nastavmeziradkovoumezeru nastavnadpis nastavnadpisy nastavodkazovani nastavodsazeni nastavodsazovani nastavodstavce nastavopis nastavoramovanetexty nastavoramovani nastavorez nastavotoceni nastavpaletu nastavplvouciobjekt nastavplvouciobjekty nastavpodcislostrany nastavpodtrzeni nastavpole nastavpolozky nastavpopisek nastavpopisky nastavpopisy nastavpozadi nastavpozadi nastavpoznamkypodcarou nastavprechodstrany nastavpreskok nastavprofily nastavprogramy nastavprostredizakladnihofontu nastavpublikace nastavradkovani nastavradky nastavrastr nastavrejstrik nastavrovnice nastavsadusymbolu nastavsekci nastavseznam nastavseznamodkazu nastavsirkucary nastavsloupce nastavspodek nastavspojeni nastavsynchronizaci nastavsynchronizacnilistu nastavsynonyma nastavsystem nastavtab nastavtabelaci nastavtabulky nastavtenkelinky nastavtext nastavtexthlavicky nastavtextovelinky nastavtextpopisku nastavtexttexty nastavtextyupati nastavtextyzahlavi nastavtlacitka nastavtoleranci nastavtrideni nastavtype nastavumisteniprotejsku nastavumistovani nastavupati nastavupravu nastavurl nastavusporadani nastavvelikostpapiru nastavverze nastavvsechnapole nastavvycty nastavvyplnovelinky nastavvyplnoveradky nastavvystup nastavvzhled nastavzahlavi nastavzakladnifont nastavzarovnani nastavznaceni nastavzuzeni nastrane nejakyradek nekde nextsection nivy nizky nocap nop obrazovka odkaz odkaz odkaznadatum odkaznastranu odkaznatext odsazovani okr opis opissoubor oramovani oref orez otocit overbar overbars overstrike overstrikes oznacverzi paragraph parovastrana part pis placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist pol pole polozka polozky popisky porovnejpaletu porovnejskupinubarev pozadi pozice poznamka poznamkapodcarou pref prelozit premistinamrizku prepninazakladnifont preskoc prizpusobivepole prizpusobvzhled program propojeneznaceni propojenydokument propojenyrejstrik publikace ran ref register reservefloat reset resettextcontent resetznaceni rimskecislice rozdelplvouciobjekt rozpojeneznaceni roztazene schovejbloky section sedabarva seeregister settextcontent setupfonthandling setupfontsynonym setupforms setupinterlinespace2 setupitemgroup setuplistalternative setuppaper setupstrut sloupec slovovpravo sort spodek stanovcharakteristickuseznamu stanovcislonadpisu startalignment startbarva startbuffer startbuffer startcitace startcolumns startcombination startcomment startdescription startdocument startenumeration startfakt startfigure startfloattext startformula startframedtext starthiding startinteraktivnimenu startitemgroup startkomponenta startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginalnilinka startmarginblock startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startpozadi startprodukt startprofile startprojekt startprostredi startregister startsymbolset startsynchronization starttable starttables starttabulate starttextovalinka starttyping startunpacked startverze startzhustene stopalignment stopbarva stopbuffer stopbuffer stopcitace stopcolumns stopcombination stopcomment stopdescription stopdocument stopenumeration stopfakt stopfigure stopfloattext stopformula stopframedtext stophiding stopinteraktivnimenu stopitemgroup stopkomponenta stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginalnilinka stopmarginblock stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stoppozadi stopprodukt stopprofile stopprojekt stopprostredi stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptextovalinka stoptyping stopunpacked stopverze stopzhustene strana sub subject subsection subsubject subsubsection subsubsubject sym symbol synchronizacnilista synchronizovat synonym tab tecky tenkalinka tenkelinky tex texthlavicky textovalinka textpopisku title tlacitko tref tvrdemezery typebuffer typstrany ukazbarvu ukazexterniobrazy ukazmrizku ukaznastaveni ukazpaletu ukazpodpery ukazpole ukazpostredizakladnihofontu ukazramecek ukazsadusymbolu ukazskupinubarev ukazupravu ukazvytisk ukazvzhled ukazzakladnifont umistikombinovanyseznam umistikombinovanyseznam umistilegendu umistiloga umistilokalnipoznamkypodcarou umistinadsebe umistinamrizku umistipodrovnici umistipoznamkypodcarou umistirejstrik umistirejstrik umistirovnici umistiseznam umistivedlesebe umistizalozky underbar underbars usedirectory usetypescript usetypescriptfile uzijURL uzijbloky uzijexternidokument uzijexterniobraz uzijexternisoubor uzijexternisoubory uzijexternizvuk uzijkodovani uzijmodul uzijodkazy uzijprikazy uzijspeciality uzijsymbol verze vl vlasovalinka vlevo vpravo vradku vsedniden vyberbloky vyberpapir vyberverzi vyplnenytext vyplnovelinky vyplnovepole vyplnovyradek vysoky zablokujinterakcnimenu zachovejbloky zadnamezera zadnebilemisto zadnedalsibloky zadnedalsisoubory zadnehorniadolniradky zadneodsazovani zadnezahlaviaupati zadneznaceni zadnyseznam zalozka zapisdorejstriku zapisdoseznamu zapisdoseznamuodkazu zapismeziseznam zaramovani zarovnanonastred zarovnanovlevo zarovnanovpravo zasobnikpoli zaznamovepole zhustene ziskejbuffer ziskejznaceni zlomek znaceni znak znaky zpracujbloky zpracujstranu zrcadlit zref \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/cont-de-scite.properties b/Master/texmf-dist/context/data/scite/cont-de-scite.properties
index b0e05b91aa5..249fc6a5905 100644
--- a/Master/texmf-dist/context/data/scite/cont-de-scite.properties
+++ b/Master/texmf-dist/context/data/scite/cont-de-scite.properties
@@ -1 +1 @@
-keywordclass.macros.context.de=Buchstabe Buchstaben CAP Cap Caps MONAT Roemischezahlen WOCHENTAG WOERTER WORT Woerter Wort amgitterausrichten amgitterneuausrichten appendix aufseite ausfuellfeld ausfuelltext ausschnitt bearbeitebloecke bearbeiteseite behaltebloecke bei benutzekodierung benutzespezielles beschrifteversion beschriftung bestimmekopfnummer bestimmelistencharakeristika bildschirm blanko bookmark bruch buchstabe buchstaben but bypassblocks cap chapter chem completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister coupledregister crlf datum definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling defineoutput defineschriftsynonym definetype definetypeface definiereabbsymbol definiereabsaetze definiereabschnitt definiereabschnittsblock definierebeschreibung definierebeschreibungen definierebeschriftung definiereblanko definiereblock definiereeinzug definierefarbe definierefarbengruppe definierefeld definierefeldstapel definierefliesstext definierefliesstextumgebung definieregleitobjekt definiereinteraktionsmenue definiereinteraktionsmenue definierekonversion definierelabel definiereliste definierelogo definieren definierenummerierung definiereoverlay definierepalette definierepapierformat definiereprofil definiereprogramme definierepuffer definierereferenz definierereferenzformat definierereferenzliste definiereregister definiereschrift definieresortieren definierestartstop definieresubfeld definieresymbol definieresynonyme definieretabellenvorlage definieretabulator definieretext definieretippen definiereueberschrift definiereumbruch definiereumrahmt definiereumrahmtertext definiereversion definierezusammengestellteliste description doppelseite doppelseitigespapier drehen duennelinie duennerumriss einezeile einziehen emptylines entknuepfebeschriftung enumeration externeabbildung farbe feld feldstapel festesspatium folgeprofil folgeprofilversion folgeversion footnotetext forceblocks format framedtext fussnote gefuelltesrechteck gefuelltezeile gestreckt gitter graufarbe haarlinie hauptsprache heutigesdatum heutigeskopfnummer hintergrund hl hoch holebeschriftung holepuffer imlinken imrechten imumriss in inaktiviereinteraktionsmenue inanderermarginale indentation ininner inmarginalie inouter installieresprache interaktionsbalken interaktionsknopfe inzeile irgendwo its keinebeschriftung keinebloeckemehr keinedateienmehr keinekopfundfusszeilen keineliste keinspatium keinzeilenobenundunten keinzwischenraum kleinerdurchschuss klonierefeld knopf kommentar konvertierezahl kopf kopfnummer kopierefeld korrigierezwischenraum labeling labels labeltext linksbuendig listsymbol loadsorts loadsynonyms mapfontsize mar marginallinie marginaltext mathematik mediaeval monat nachunten name nextsection nichteinziehen nocap nop notiz overbar overbars overstrike overstrikes paragraph part passelayoutan passendfeld placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist platzierebookmarks platziereformel platzierefussnoten platzierelegende platziereliste platzierelogo platzierelokalefussnoten platzierenebeneinander platziereregister platziereregister platziereuntereinander platziereunterformel platzierezusammengestellteliste platzierezusammengestellteliste pos position posten programm publikation punkt ran rechteck rechtecke rechtsbuendig ref referenz register registrierefelder reservefloat resettextcontent roemischezahlen ruecksetzten ruecksetztenbeschriftung schreibezumregister schreibezurliste schreibezurreferenzliste schreibezwischenliste section seeregister seite seitenreferenz seitentyp settext setupfonthandling setupfontsynonym setupforms setupinterlinespace2 setupitemgroup setuplistalternative setuppaper setupstrut showsymbolset sort spalte spatium spiegeln sprache startalignment startbuffer startbuffer startcolumns startcombination startdescription startdocument startenumeration startfarbe startfigure startfloattext startformula startframedtext startgeg starthiding starthintergrund startinteraktionsmenue startitemgroup startkleinerdurchschuss startkommentar startkomponente startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginallinie startmarginblock startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodukt startprofile startprojekt startregister startsymbolset startsynchronization starttable starttables starttabulate starttextlinie starttyping startumgebung startunpacked startversion startzitat stelleabsaetzeein stelleabsatznummerierungein stelleabschnittein stelleabschnittsblockein stelleanordnenein stelleausgabeein stelleausrichtungein stelleausschnittein stellebeschreibungein stellebeschriftungein stellebilderunterschriftein stellebildunterschriftein stellebindestrichein stelleblankoein stelleblockein stelledrehenein stelleduennerumrissein stelleeinziehenein stelleeinzuegein stelleengerein stelleexterneabbildungenein stellefarbeein stellefarbenein stellefeldein stellefelderin stellefliesstextein stellefliesstextumgebungein stelleformelnein stellefussnotendefinitionein stellefussnotenein stellefusszeileein stellefusszeilentextein stellegefuelltesrechteckein stellegefuelltezeileein stellegegenueberplatzierenein stellegleitobjekteein stellegleitobjektein stellehintergruendeein stellehintergrundein stelleinmarginalieein stelleinteraktionein stelleinteraktionsbalkenein stelleinteraktionsbildschirmein stelleinteraktionsmenueein stelleknopfein stellekombinationein stellekommentarein stellekopfzahlein stellekopfzeileein stellekopfzeilentextein stellelabeltextein stellelayoutein stellelegendeein stellelinienbreiteein stellelisteein stellemarginalblockein stellemarginallinieein stellenobenein stellenummerierungein stellepaletteein stellepapierformatein stelleplatziegeteiltegleitobjekt stellepositionierenein stellepostenein stelleprofilein stelleprogrammein stellepublikationein stellepufferein stellerasterein stellerechteckein stellereferenzierenein stellereferenzlisteein stelleregisterein stelleseitennummerein stelleseitennummeriernungein stelleseitenuebergangein stellesortierenein stellespaltenein stellespatiumein stellespracheein stellesymbolsetein stellesynchronisationein stellesynchronisationsbalkenein stellesynonymein stellesystemein stelletabein stelletabellenein stelletabulatorein stelletextein stelletextobenein stelletexttexteein stelletextumrissein stelletextuntenein stelletipein stelletippenein stelletoleranzein stelleueberschriftein stelleueberschriftenein stelleueberschrifttextein stelleumbruchein stelleumrahmtein stelleumrahmtetexteein stelleuntenein stelleunterseitennummerein stelleunterstreichenein stelleurlein stelleversalienein stelleversionein stellezeilenabstandein stellezeilenein stellezeilennumerierungein stellezitierenein stellezusammengestelltelisteein stellezwischenraumein stopalignment stopbuffer stopbuffer stopcolumns stopcombination stopdescription stopdocument stopenumeration stopfarbe stopfigure stopfloattext stopformula stopframedtext stopgeg stophiding stophintergrund stopinteraktionsmenue stopitemgroup stopkleinerdurchschuss stopkommentar stopkomponente stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginallinie stopmarginblock stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodukt stopprofile stopprojekt stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptextlinie stoptyping stopumgebung stopunpacked stopversion stopzitat sub subject subsection subsubject subsubsection subsubsubject sym symbol synchronisationsbalken synchronisieren synonym tab teilegleitobjekt tex textlinie textreferenz tief tiho tip tippedatei tippen tippepuffer title tooltip ueber ueberschrifttext uebersetzten umrahmt underbar underbars usedirectory usetypescript usetypescriptfile verbergebloecke vergleichefarbengruppe vergleichepalette verknuepfebeschriftung verknuepfedokument verknuepfregister version verweis verweisdatum verwendeURL verwendebefehl verwendebloecke verwendeexteresdokument verwendeexterneabbildung verwendeexternedatei verwendeexternedateien verwendeexternestonstueck verwendemodul verwendereferenzen verwendesymbole vl von waehlebloeckeaus waehlepapieraus waehleversionaus wechselezumfliesstext wochentag wortrechts zeigedruck zeigeeinstellungen zeigeexterneabbildungen zeigefarbe zeigefarbengruppe zeigefelder zeigefliesstext zeigefliesstextumgebung zeigegitter zeigelayout zeigepalette zeigerahmen zeigestruts zeigeumbruch zentriert ziffern zitat zitieren zu zurbox zwischenraum \ No newline at end of file
+keywordclass.macros.context.de=Buchstabe Buchstaben CAP Cap Caps MONAT Roemischezahlen WOCHENTAG WOERTER WORT Woerter Wort amgitterausrichten amgitterneuausrichten appendix aufseite ausfuellfeld ausfuelltext ausschnitt bearbeitebloecke bearbeiteseite behaltebloecke bei benutzekodierung benutzespezielles beschrifteversion beschriftung bestimmekopfnummer bestimmelistencharakeristika bildschirm blanko bookmark bruch buchstabe buchstaben but bypassblocks cap chapter chem comment completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister coupledregister crlf datum definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling defineoutput defineschriftsynonym definetype definetypeface definiereabbsymbol definiereabsaetze definiereabschnitt definiereabschnittsblock definierebeschreibung definierebeschreibungen definierebeschriftung definiereblanko definiereblock definiereeinzug definierefarbe definierefarbengruppe definierefeld definierefeldstapel definierefliesstext definierefliesstextumgebung definieregleitobjekt definiereinteraktionsmenue definiereinteraktionsmenue definierekonversion definierelabel definiereliste definierelogo definieren definierenummerierung definiereoverlay definierepalette definierepapierformat definiereprofil definiereprogramme definierepuffer definierereferenz definierereferenzformat definierereferenzliste definiereregister definiereschrift definieresortieren definierestartstop definieresubfeld definieresymbol definieresynonyme definieretabellenvorlage definieretabulator definieretext definieretippen definiereueberschrift definiereumbruch definiereumrahmt definiereumrahmtertext definiereversion definierezusammengestellteliste description doppelseite doppelseitigespapier drehen duennelinie duennerumriss einezeile einziehen emptylines entknuepfebeschriftung enumeration externeabbildung farbe feld feldstapel festesspatium folgeprofil folgeprofilversion folgeversion footnotetext forceblocks format framedtext fussnote gefuelltesrechteck gefuelltezeile gestreckt gitter graufarbe haarlinie hauptsprache heutigesdatum heutigeskopfnummer hintergrund hl hoch holebeschriftung holepuffer imlinken imrechten imumriss in inaktiviereinteraktionsmenue inanderermarginale indentation ininner inmarginalie inouter installieresprache interaktionsbalken interaktionsknopfe inzeile irgendwo its keinebeschriftung keinebloeckemehr keinedateienmehr keinekopfundfusszeilen keineliste keinspatium keinzeilenobenundunten keinzwischenraum kleinerdurchschuss klonierefeld knopf konvertierezahl kopf kopfnummer kopierefeld korrigierezwischenraum labeling labels labeltext linksbuendig listsymbol loadsorts loadsynonyms mapfontsize mar marginallinie marginaltext mathematik mediaeval monat nachunten name nextsection nichteinziehen nocap nop notiz overbar overbars overstrike overstrikes paragraph part passelayoutan passendfeld placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist platzierebookmarks platziereformel platzierefussnoten platzierelegende platziereliste platzierelogo platzierelokalefussnoten platzierenebeneinander platziereregister platziereregister platziereuntereinander platziereunterformel platzierezusammengestellteliste platzierezusammengestellteliste pos position posten programm publikation punkt ran rechteck rechtecke rechtsbuendig ref referenz register registrierefelder reservefloat resettextcontent roemischezahlen ruecksetzten ruecksetztenbeschriftung schreibezumregister schreibezurliste schreibezurreferenzliste schreibezwischenliste section seeregister seite seitenreferenz seitentyp settext setupfonthandling setupfontsynonym setupforms setupinterlinespace2 setupitemgroup setuplistalternative setuppaper setupstrut showsymbolset sort spalte spatium spiegeln sprache startalignment startbuffer startbuffer startcolumns startcombination startcomment startdescription startdocument startenumeration startfarbe startfigure startfloattext startformula startframedtext startgeg starthiding starthintergrund startinteraktionsmenue startitemgroup startkleinerdurchschuss startkomponente startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginallinie startmarginblock startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodukt startprofile startprojekt startregister startsymbolset startsynchronization starttable starttables starttabulate starttextlinie starttyping startumgebung startunpacked startversion startzitat stelleabsaetzeein stelleabsatznummerierungein stelleabschnittein stelleabschnittsblockein stelleanordnenein stelleausgabeein stelleausrichtungein stelleausschnittein stellebeschreibungein stellebeschriftungein stellebilderunterschriftein stellebildunterschriftein stellebindestrichein stelleblankoein stelleblockein stelledrehenein stelleduennerumrissein stelleeinziehenein stelleeinzuegein stelleengerein stelleexterneabbildungenein stellefarbeein stellefarbenein stellefeldein stellefelderin stellefliesstextein stellefliesstextumgebungein stelleformelnein stellefussnotendefinitionein stellefussnotenein stellefusszeileein stellefusszeilentextein stellegefuelltesrechteckein stellegefuelltezeileein stellegegenueberplatzierenein stellegleitobjekteein stellegleitobjektein stellehintergruendeein stellehintergrundein stelleinmarginalieein stelleinteraktionein stelleinteraktionsbalkenein stelleinteraktionsbildschirmein stelleinteraktionsmenueein stelleknopfein stellekombinationein stellekommentarein stellekopfzahlein stellekopfzeileein stellekopfzeilentextein stellelabeltextein stellelayoutein stellelegendeein stellelinienbreiteein stellelisteein stellemarginalblockein stellemarginallinieein stellenobenein stellenummerierungein stellepaletteein stellepapierformatein stelleplatziegeteiltegleitobjekt stellepositionierenein stellepostenein stelleprofilein stelleprogrammein stellepublikationein stellepufferein stellerasterein stellerechteckein stellereferenzierenein stellereferenzlisteein stelleregisterein stelleseitennummerein stelleseitennummeriernungein stelleseitenuebergangein stellesortierenein stellespaltenein stellespatiumein stellespracheein stellesymbolsetein stellesynchronisationein stellesynchronisationsbalkenein stellesynonymein stellesystemein stelletabein stelletabellenein stelletabulatorein stelletextein stelletextobenein stelletexttexteein stelletextumrissein stelletextuntenein stelletipein stelletippenein stelletoleranzein stelleueberschriftein stelleueberschriftenein stelleueberschrifttextein stelleumbruchein stelleumrahmtein stelleumrahmtetexteein stelleuntenein stelleunterseitennummerein stelleunterstreichenein stelleurlein stelleversalienein stelleversionein stellezeilenabstandein stellezeilenein stellezeilennumerierungein stellezitierenein stellezusammengestelltelisteein stellezwischenraumein stopalignment stopbuffer stopbuffer stopcolumns stopcombination stopcomment stopdescription stopdocument stopenumeration stopfarbe stopfigure stopfloattext stopformula stopframedtext stopgeg stophiding stophintergrund stopinteraktionsmenue stopitemgroup stopkleinerdurchschuss stopkomponente stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginallinie stopmarginblock stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodukt stopprofile stopprojekt stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptextlinie stoptyping stopumgebung stopunpacked stopversion stopzitat sub subject subsection subsubject subsubsection subsubsubject sym symbol synchronisationsbalken synchronisieren synonym tab teilegleitobjekt tex textlinie textreferenz tief tiho tip tippedatei tippen tippepuffer title tooltip ueber ueberschrifttext uebersetzten umrahmt underbar underbars usedirectory usetypescript usetypescriptfile verbergebloecke vergleichefarbengruppe vergleichepalette verknuepfebeschriftung verknuepfedokument verknuepfregister version verweis verweisdatum verwendeURL verwendebefehl verwendebloecke verwendeexteresdokument verwendeexterneabbildung verwendeexternedatei verwendeexternedateien verwendeexternestonstueck verwendemodul verwendereferenzen verwendesymbole vl von waehlebloeckeaus waehlepapieraus waehleversionaus wechselezumfliesstext wochentag wortrechts zeigedruck zeigeeinstellungen zeigeexterneabbildungen zeigefarbe zeigefarbengruppe zeigefelder zeigefliesstext zeigefliesstextumgebung zeigegitter zeigelayout zeigepalette zeigerahmen zeigestruts zeigeumbruch zentriert ziffern zitat zitieren zu zurbox zwischenraum \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/cont-fr-scite.properties b/Master/texmf-dist/context/data/scite/cont-fr-scite.properties
index 606be2efaba..5ecccf961dd 100644
--- a/Master/texmf-dist/context/data/scite/cont-fr-scite.properties
+++ b/Master/texmf-dist/context/data/scite/cont-fr-scite.properties
@@ -1 +1 @@
-keywordclass.macros.context.fr=CAP Cap Caps Caractere Caracteres Chiffresromains JOURSEMAINE MOIS MOT MOTS Mot Mots a adaptedisposition ajustechamp alaligne alapage aligneadroite aligneagauche aligneaumilieu appendix arriereplan baha barreinteraction barresynchronisation bas bouton boutonsinteraction but cacheblocs cap caractere caracteres champ changepolicecorps chapter chem chiffresromains citation citer clip clonechamp colonne commentaire comparegroupecouleur comparepalette completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregistre composeenalinea concernant convertitnumero copitchamp corrigeespaceblanc couleur couleurgrise coupledocument coupledregister couplemarquage couplepapier coupleregistre crlf dactylographier dans dansautremarge dansdroite dansgauche dansmarge date datecourante daterecommandation de decouplemarquage definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling defineframed defineframedtext definetypeface definit definitbloc definitblocsection definitbuffer definitchamp definitcompoalinea definitconversion definitcouleur definitdactylo definitdemarrestoppe definitdescription definitenumeration definitenvironnementpolicecorps definitetiquette definitflottant definitformatreference definitgroupecouleur definitliste definitlisteimbriquee definitlistereference definitlogo definitmakeup definitmarquage definitmenuinteraction definitmenuinteraction definitnotepdp definitpalette definitparagraphes definitpilechamp definitpolice definitpolicecorps definitprofil definitprogramme definitreference definitregistre definitrevetement definitsection definitsortie definitsouschamp definitsymbole definitsymbolefigure definitsynonymepolice definitsynonymes definittabulation definittaillepapier definittete definittexte definittrametableau definittri definittype definitversion definitvide definitvide demarreciter deplacesurgrille description determinecaracteristiqueliste determinenumerotete echelle ecran ecritdansliste ecritdanslistereference ecritentreliste ecritregistre el element elements emptylines enumeration espace espaceblanc espacesfixes etiquettes etire fichierdactylo figureexterne forceblocs fraction framed framedtext gardeblocs grille groupe haut hl indentation inframed inhibemenuinteraction ininner inouter installelangue joursemaine labeling labeltexte langue langueprincipale ligneh lignenoire ligneregleetexte lignesnoires listesymbole loadsorts loadsynonyms logchamp mapfontsize mar margereglee marquage marquageversion marquepage mathematique mediaeval mois montrecadre montrechamps montrecouleur montredisposition montreedition montreenvironnementpolicecorps montrefiguresexternes montregrille montregroupecouleur montrejeusymboles montremakeup montrepalette montrepolicecorps montrereglages montrestruts motdroit name nextsection nocap nop note notepdp numeros numerotete numerotetecourant obtientmarquage oriente overbar overbars overstrike overstrikes page pagedouble paragraph part pasplusdeblocs pasplusdefichiers periodes pilechamp placecoteacote placeflottant placeformule placelegende placelesunsaudessusdesautres placeliste placelisteinmbriquee placelisteinmbriquee placelistereference placelistoffloats placelistofsorts placelistofsynonyms placelogos placemarquespages placenotespdp placenotespdplocales placeregistre placeregistre placesousformule placesurgrille position prendbuffer programme publication qqpart ran raz razmarquage recommandation ref reference referencepage referencetexte reflete register reglealignement reglealineas reglearrangement reglearriereplan reglearriereplans reglebarreinteraction reglebarresynchronisation reglebloc regleblocmarge regleblocsection regleboutons reglebuffer reglecapitales reglechamp reglechamps regleclipping reglecolonnes reglecombinaisons reglecommentaire reglecompoetroite reglecomposeenalinea reglecouleur reglecouleurs regledactylo regledansmarge regledescriptions regledisposition regleecraninteraction regleecrans regleelements regleencadre regleentete regleenumerations regleenvironnementpolicecorps regleepaisseurligne regleespaceblanc regleespacement regleespacementinterligne reglefiguresexternes regleflottant regleflottants regleformulaires regleformules regleinf regleinteraction regleintitule regleintitules reglejeusymboles reglelabeltexte reglelangue reglelegende reglelignes reglelignesnoires reglelignesreglestexte regleliste reglelisteimbriquee reglelistereference reglemakeup reglemargereglee reglemarquage reglemarquagehyphenation reglemenuinteraction reglenotepdp reglenumeropage reglenumerotation reglenumerotationligne reglenumerotationpage reglenumerotationparagraphe reglenumerotete regleoriente reglepalette reglepapier regleparagraphes reglepdp regleplacementopposition reglepolicecorps reglepositionnement regleprofils regleprogrammes reglepublications reglereferencage regleregistre regleremplitligne regleremplitlignesreglees reglesection regleseparationflottant reglesortie reglesouslignage reglesousnumeropage reglestrut reglesup reglesynchronisation reglesynonymes reglesysteme regletab regletableaux regletabulation regletaillepapier regletete regletetes regletexte regletextesentete regletextesinf regletextespdp regletextessup regletextestexte regletextetete regletolerance regletraitsfins regletransitionspage regletri regletype regleurl regleversions remplitchamp remplitligne remplitlignesreglees remplittexte reservefloat resettextcontent sansalinea sansespace sansespaceblanc sanslignesenteteetpdp sanslignessupetinf sansliste sansmarquage sauteblocs section seeregister selectionneblocs selectionnepapier selectionneversion separeflottant settext setupfonthandling setupfontsynonym setupframedtexts setupinterlinespace2 setupitemgroup setuplistalternative sort startalignment startarriereplan startbuffer startbuffer startcitation startcolumns startcombination startcommentaire startcomposant startcouleur startdescription startdocument startenumeration startenvironement startfait startfigure startfloattext startformula startframedtext startgroupe starthiding startitemgroup startlegend startligneregleetexte startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmargereglee startmarginblock startmenuinteraction startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startproduit startprofile startprojet startregister startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startversion stopalignment stoparriereplan stopbuffer stopbuffer stopcitation stopcolumns stopcombination stopcommentaire stopcomposant stopcouleur stopdescription stopdocument stopenumeration stopenvironement stopfait stopfigure stopfloattext stopformula stopframedtext stopgroupe stophiding stopitemgroup stoplegend stopligneregleetexte stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmargereglee stopmarginblock stopmenuinteraction stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopproduit stopprofile stopprojet stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopversion sub subject subsection subsubject subsubsection subsubsubject suggestion suivantprofil suivantversion suivantversionprofil sym symbole synchronise synonym tab tapebuffer tapepage tete tex textemarge textenotepdp textetete title traduire traiteblocs traitepage traitfin traitsfins typ underbar underbars uneligne usedirectory usetypescript usetypescriptfile utiliseURL utiliseblocs utilisecommandes utilisedocumentexterne utiliseencodage utilisefichierexterne utilisefichiersexternes utilisefigureexterne utilisemodule utilisepsiteaudioexterne utilisereferences utilisespecialites utilisesymboles va vaalaboite vaenbas version vide vl \ No newline at end of file
+keywordclass.macros.context.fr=CAP Cap Caps Caractere Caracteres Chiffresromains JOURSEMAINE MOIS MOT MOTS Mot Mots a adaptedisposition ajustechamp alaligne alapage aligneadroite aligneagauche aligneaumilieu appendix arriereplan baha barreinteraction barresynchronisation bas bouton boutonsinteraction but cacheblocs cap caractere caracteres champ changepolicecorps chapter chem chiffresromains citation citer clip clonechamp colonne comment comparegroupecouleur comparepalette completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregistre composeenalinea concernant convertitnumero copitchamp corrigeespaceblanc couleur couleurgrise coupledocument coupledregister couplemarquage couplepapier coupleregistre crlf dactylographier dans dansautremarge dansdroite dansgauche dansmarge date datecourante daterecommandation de decouplemarquage definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling defineframed defineframedtext definetypeface definit definitbloc definitblocsection definitbuffer definitchamp definitcompoalinea definitconversion definitcouleur definitdactylo definitdemarrestoppe definitdescription definitenumeration definitenvironnementpolicecorps definitetiquette definitflottant definitformatreference definitgroupecouleur definitliste definitlisteimbriquee definitlistereference definitlogo definitmakeup definitmarquage definitmenuinteraction definitmenuinteraction definitnotepdp definitpalette definitparagraphes definitpilechamp definitpolice definitpolicecorps definitprofil definitprogramme definitreference definitregistre definitrevetement definitsection definitsortie definitsouschamp definitsymbole definitsymbolefigure definitsynonymepolice definitsynonymes definittabulation definittaillepapier definittete definittexte definittrametableau definittri definittype definitversion definitvide definitvide demarreciter deplacesurgrille description determinecaracteristiqueliste determinenumerotete echelle ecran ecritdansliste ecritdanslistereference ecritentreliste ecritregistre el element elements emptylines enumeration espace espaceblanc espacesfixes etiquettes etire fichierdactylo figureexterne forceblocs fraction framed framedtext gardeblocs grille groupe haut hl indentation inframed inhibemenuinteraction ininner inouter installelangue joursemaine labeling labeltexte langue langueprincipale ligneh lignenoire ligneregleetexte lignesnoires listesymbole loadsorts loadsynonyms logchamp mapfontsize mar margereglee marquage marquageversion marquepage mathematique mediaeval mois montrecadre montrechamps montrecouleur montredisposition montreedition montreenvironnementpolicecorps montrefiguresexternes montregrille montregroupecouleur montrejeusymboles montremakeup montrepalette montrepolicecorps montrereglages montrestruts motdroit name nextsection nocap nop note notepdp numeros numerotete numerotetecourant obtientmarquage oriente overbar overbars overstrike overstrikes page pagedouble paragraph part pasplusdeblocs pasplusdefichiers periodes pilechamp placecoteacote placeflottant placeformule placelegende placelesunsaudessusdesautres placeliste placelisteinmbriquee placelisteinmbriquee placelistereference placelistoffloats placelistofsorts placelistofsynonyms placelogos placemarquespages placenotespdp placenotespdplocales placeregistre placeregistre placesousformule placesurgrille position prendbuffer programme publication qqpart ran raz razmarquage recommandation ref reference referencepage referencetexte reflete register reglealignement reglealineas reglearrangement reglearriereplan reglearriereplans reglebarreinteraction reglebarresynchronisation reglebloc regleblocmarge regleblocsection regleboutons reglebuffer reglecapitales reglechamp reglechamps regleclipping reglecolonnes reglecombinaisons reglecommentaire reglecompoetroite reglecomposeenalinea reglecouleur reglecouleurs regledactylo regledansmarge regledescriptions regledisposition regleecraninteraction regleecrans regleelements regleencadre regleentete regleenumerations regleenvironnementpolicecorps regleepaisseurligne regleespaceblanc regleespacement regleespacementinterligne reglefiguresexternes regleflottant regleflottants regleformulaires regleformules regleinf regleinteraction regleintitule regleintitules reglejeusymboles reglelabeltexte reglelangue reglelegende reglelignes reglelignesnoires reglelignesreglestexte regleliste reglelisteimbriquee reglelistereference reglemakeup reglemargereglee reglemarquage reglemarquagehyphenation reglemenuinteraction reglenotepdp reglenumeropage reglenumerotation reglenumerotationligne reglenumerotationpage reglenumerotationparagraphe reglenumerotete regleoriente reglepalette reglepapier regleparagraphes reglepdp regleplacementopposition reglepolicecorps reglepositionnement regleprofils regleprogrammes reglepublications reglereferencage regleregistre regleremplitligne regleremplitlignesreglees reglesection regleseparationflottant reglesortie reglesouslignage reglesousnumeropage reglestrut reglesup reglesynchronisation reglesynonymes reglesysteme regletab regletableaux regletabulation regletaillepapier regletete regletetes regletexte regletextesentete regletextesinf regletextespdp regletextessup regletextestexte regletextetete regletolerance regletraitsfins regletransitionspage regletri regletype regleurl regleversions remplitchamp remplitligne remplitlignesreglees remplittexte reservefloat resettextcontent sansalinea sansespace sansespaceblanc sanslignesenteteetpdp sanslignessupetinf sansliste sansmarquage sauteblocs section seeregister selectionneblocs selectionnepapier selectionneversion separeflottant settext setupfonthandling setupfontsynonym setupframedtexts setupinterlinespace2 setupitemgroup setuplistalternative sort startalignment startarriereplan startbuffer startbuffer startcitation startcolumns startcombination startcomment startcomposant startcouleur startdescription startdocument startenumeration startenvironement startfait startfigure startfloattext startformula startframedtext startgroupe starthiding startitemgroup startlegend startligneregleetexte startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmargereglee startmarginblock startmenuinteraction startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startproduit startprofile startprojet startregister startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startversion stopalignment stoparriereplan stopbuffer stopbuffer stopcitation stopcolumns stopcombination stopcomment stopcomposant stopcouleur stopdescription stopdocument stopenumeration stopenvironement stopfait stopfigure stopfloattext stopformula stopframedtext stopgroupe stophiding stopitemgroup stoplegend stopligneregleetexte stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmargereglee stopmarginblock stopmenuinteraction stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopproduit stopprofile stopprojet stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopversion sub subject subsection subsubject subsubsection subsubsubject suggestion suivantprofil suivantversion suivantversionprofil sym symbole synchronise synonym tab tapebuffer tapepage tete tex textemarge textenotepdp textetete title traduire traiteblocs traitepage traitfin traitsfins typ underbar underbars uneligne usedirectory usetypescript usetypescriptfile utiliseURL utiliseblocs utilisecommandes utilisedocumentexterne utiliseencodage utilisefichierexterne utilisefichiersexternes utilisefigureexterne utilisemodule utilisepsiteaudioexterne utilisereferences utilisespecialites utilisesymboles va vaalaboite vaenbas version vide vl \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/cont-it-scite.properties b/Master/texmf-dist/context/data/scite/cont-it-scite.properties
index da5df24007d..699cd0f1e73 100644
--- a/Master/texmf-dist/context/data/scite/cont-it-scite.properties
+++ b/Master/texmf-dist/context/data/scite/cont-it-scite.properties
@@ -1 +1 @@
-keywordclass.macros.context.it=CAP Cap Caps GIORNOSETTIMANA Lettera Lettere MESE Numeriromani PAROLA PAROLE Parola Parole accoppiacarta accoppiadocumento accoppiamarcatura accoppiapagina accoppiaregistro adattacampo adattalayout al allineacentro allineadestra allineasinistra ap apagina appendix barrainterazione barrasincronizzazione bastablocchi bastafile cambiaafontdeltesto campi camporiempimento cap capello chapter chim circondato citazione clip clonacampo colonna colore coloregrigio commento completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister confrontagruppocolori confrontatavolozza convertinumero copiacampo correggispaziobianco coupledregister crlf da daqualcheparte data datadioggi datareferral definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling definetypeface definisci definisciambientefontdeltesto definisciblocco definiscibloccosezione definiscibuffer definiscicampo definiscicapoversi definiscicolore definisciconversione definiscidescrizione definiscidimensionicarta definiscielenco definiscielencocombinato definiscienumerazione definiscietichetta definiscifigurasimbolo definiscifont definiscifontdeltesto definisciformatoriferimento definiscigruppocolori definisciincorniciato definisciiniziatermina definiscilistariferimenti definiscilogo definiscimakeup definiscimarcatura definiscimenuinterazione definiscimenuinterazione definiscimodellotabella definiscioggettomobile definisciordinamento definiscioutput definisciprofilo definisciprogramma definisciregistro definiscirientro definisciriferimento definiscirigovuoto definiscisezione definiscisimbolo definiscisinonimi definiscisinonimofont definiscisottocampo definiscisovrapposizione definiscistackcampi definiscitabulato definiscitavolozza definiscitesta definiscitesto definiscitestoincorniciato definiscitype definiscityping definisciversion description determinacarattersticheelenco determinanumerotesta disabilitamenuinterazione el elaborablocchi elaborapagina elementi elemento emptylines enumeration etichette figuraesterna fondo forzablocchi framedtext frazione giornosettimana griglia hl impaccato impostaallineamento impostaambientefontdeltesto impostaampiezzariga impostabarrainterazione impostabarrasincronizzazione impostablocchimargine impostablocco impostabloccosezione impostabuffer impostacampi impostacampo impostacapoversi impostacaption impostacaptions impostacima impostaclippling impostacolonne impostacolore impostacolori impostacombinazioni impostacommento impostadefinizionenotepdp impostadescrizioni impostadimensionicarta impostaelementi impostaelenco impostaelencocombinato impostaenumerazioni impostafigureesterne impostafondo impostafontdeltesto impostaforms impostaformule impostaincorniciato impostainmargine impostainstestazione impostainterazione impostainterlinea impostalayout impostalegenda impostalineemargine impostalineenere impostalineeriempimento impostalineesottili impostalineetesto impostalingua impostalistariferimenti impostamaiuscole impostamakeup impostamarcatura impostamenuinterazione impostamenzione impostanotepdp impostanumerazione impostanumerazionecapoversi impostanumerazionepagina impostanumerazionerighe impostanumeropagina impostanumerosottopagina impostanumerotesta impostaoggettimobili impostaoggettomobile impostaordinamento impostaoutput impostaparranging impostapdp impostapiustretto impostaposizionamento impostaposizionamentoopposti impostaprofili impostaprogrammi impostapubblicazioni impostapulsanti impostaregistro impostarientri impostarientro impostariferimento impostarighe impostarigheriempimento impostarigovuoto impostarotazione impostaschermi impostaschermointerazione impostasegnosillabazione impostasetsimboli impostasezione impostasfondi impostasfondo impostasincronizzazione impostasinonimi impostasistema impostasottolinea impostaspaziatura impostaspaziobianco impostaspezzamentooggettomobile impostastrut impostatab impostatabelle impostatabulato impostatavolozza impostatesta impostateste impostatesticima impostatestifondo impostatestiincorniciati impostatestiintestazioni impostatestipdp impostatesto impostatestoetichette impostatestointestazioni impostatestotesti impostatolleranza impostatransizionepagina impostatype impostatyping impostaurl impostaversioni in inaltromargine incorniciato indentation indestra ininner inmargine inouter inriga insinistra installalingua intorno labeling lettera lettere lineamargine lineanera lineasottile lineatesto lineenere lineeriempimento lineesottili lingua linguaprincipale listsymbol loadsorts loadsynonyms logcampi mapfontsize mar marcatura marcaversione matematica mediaeval menzione mese mettielenco mettielencocombinato mettielencocombinato mettifiancoafianco mettiformula mettiingriglia mettilegenda mettiloghi mettinotepdp mettinotepdplocali mettiregistro mettiregistro mettisegnalibro mettisottoformula mettiunosullaltro mostraambientefontdeltesto mostracampi mostracolore mostracornice mostrafiguresterne mostrafontdeltesto mostragriglia mostragruppocolori mostraimpostazioni mostralyout mostramakeup mostrasetsimboli mostrastampa mostrastruts mostratavolozza name nascondiblocchi nextsection nienteelenco nientelineecimafondo nientelineintestazionepdp nientemarcatura nienterientro nientespazio nientespaziobianco nocap nop nota notapdp numeri numeriromani numerotesta numerotestacorrente overbar overbars overstrike overstrikes pagina paragraph paroladestra part ped pedap placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist posizione prendibuffer prendimarcatura programma pubblicazione pulsante pulsantinterazione punti qualcheriga ran referral register reimposta reimpostamarcatura reservefloat resettextcontent rientro rif riferimento riferimentopagina riferimentotesto riflessione rigariempimento rigovuoto ruota saltablocchi scala schermo scrividentroelenco scriviinelenco scriviinlistariferimenti scriviinregistro section seeregister segnalibro seguiprofilo seguiversione seguiversioneprofilo selezionablocchi selezionacarta selezionaversione separamarcatura settext setupfonthandling setupfontsynonym setupinterlinespace2 setupitemgroup setuplistalternative setuppaper sfondo sim simbolo sincronizza sort spazifissi spazio spaziobianco spezzaoggettomobile spostaagriglia stackcampi startalignment startambiente startbuffer startbuffer startcitazione startcolore startcolumns startcombination startcommento startcomponenet startdescription startdocument startenumeration startfatto startfigure startfloattext startformula startframedtext starthiding startimpaccato startitemgroup startlegend startline startlineamargine startlineatesto startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startmenuinterattivo startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodotto startprofile startprogetto startregister startsfondo startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startversione stirato stopalignment stopambiente stopbuffer stopbuffer stopcitazione stopcolore stopcolumns stopcombination stopcommento stopcomponenet stopdescription stopdocument stopenumeration stopfatto stopfigure stopfloattext stopformula stopframedtext stophiding stopimpaccato stopitemgroup stoplegend stopline stoplineamargine stoplineatesto stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopmenuinterattivo stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodotto stopprofile stopprogetto stopsfondo stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopversione sub subject subsection subsubject subsubsection subsubsubject synonym tab testa testoetichetta testoinmargine testoinstestazioni testonotapdp testoriempimento tex tieniblocchi tipopagina title tooltip traduci typ type typebuffer typefile underbar underbars usaURL usablocco usacodifica usacolonnasonoraesterna usacomandi usadocumentoesterno usafiguraesterna usafileesterni usafileesterno usamodulo usariferimenti usasimboli usaspecialita usedirectory usetypescript usetypescriptfile vaia vaiabox vaigiu versione vl \ No newline at end of file
+keywordclass.macros.context.it=CAP Cap Caps GIORNOSETTIMANA Lettera Lettere MESE Numeriromani PAROLA PAROLE Parola Parole accoppiacarta accoppiadocumento accoppiamarcatura accoppiapagina accoppiaregistro adattacampo adattalayout al allineacentro allineadestra allineasinistra ap apagina appendix barrainterazione barrasincronizzazione bastablocchi bastafile cambiaafontdeltesto campi camporiempimento cap capello chapter chim circondato citazione clip clonacampo colonna colore coloregrigio comment completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister confrontagruppocolori confrontatavolozza convertinumero copiacampo correggispaziobianco coupledregister crlf da daqualcheparte data datadioggi datareferral definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling definetypeface definisci definisciambientefontdeltesto definisciblocco definiscibloccosezione definiscibuffer definiscicampo definiscicapoversi definiscicolore definisciconversione definiscidescrizione definiscidimensionicarta definiscielenco definiscielencocombinato definiscienumerazione definiscietichetta definiscifigurasimbolo definiscifont definiscifontdeltesto definisciformatoriferimento definiscigruppocolori definisciincorniciato definisciiniziatermina definiscilistariferimenti definiscilogo definiscimakeup definiscimarcatura definiscimenuinterazione definiscimenuinterazione definiscimodellotabella definiscioggettomobile definisciordinamento definiscioutput definisciprofilo definisciprogramma definisciregistro definiscirientro definisciriferimento definiscirigovuoto definiscisezione definiscisimbolo definiscisinonimi definiscisinonimofont definiscisottocampo definiscisovrapposizione definiscistackcampi definiscitabulato definiscitavolozza definiscitesta definiscitesto definiscitestoincorniciato definiscitype definiscityping definisciversion description determinacarattersticheelenco determinanumerotesta disabilitamenuinterazione el elaborablocchi elaborapagina elementi elemento emptylines enumeration etichette figuraesterna fondo forzablocchi framedtext frazione giornosettimana griglia hl impaccato impostaallineamento impostaambientefontdeltesto impostaampiezzariga impostabarrainterazione impostabarrasincronizzazione impostablocchimargine impostablocco impostabloccosezione impostabuffer impostacampi impostacampo impostacapoversi impostacaption impostacaptions impostacima impostaclippling impostacolonne impostacolore impostacolori impostacombinazioni impostacommento impostadefinizionenotepdp impostadescrizioni impostadimensionicarta impostaelementi impostaelenco impostaelencocombinato impostaenumerazioni impostafigureesterne impostafondo impostafontdeltesto impostaforms impostaformule impostaincorniciato impostainmargine impostainstestazione impostainterazione impostainterlinea impostalayout impostalegenda impostalineemargine impostalineenere impostalineeriempimento impostalineesottili impostalineetesto impostalingua impostalistariferimenti impostamaiuscole impostamakeup impostamarcatura impostamenuinterazione impostamenzione impostanotepdp impostanumerazione impostanumerazionecapoversi impostanumerazionepagina impostanumerazionerighe impostanumeropagina impostanumerosottopagina impostanumerotesta impostaoggettimobili impostaoggettomobile impostaordinamento impostaoutput impostaparranging impostapdp impostapiustretto impostaposizionamento impostaposizionamentoopposti impostaprofili impostaprogrammi impostapubblicazioni impostapulsanti impostaregistro impostarientri impostarientro impostariferimento impostarighe impostarigheriempimento impostarigovuoto impostarotazione impostaschermi impostaschermointerazione impostasegnosillabazione impostasetsimboli impostasezione impostasfondi impostasfondo impostasincronizzazione impostasinonimi impostasistema impostasottolinea impostaspaziatura impostaspaziobianco impostaspezzamentooggettomobile impostastrut impostatab impostatabelle impostatabulato impostatavolozza impostatesta impostateste impostatesticima impostatestifondo impostatestiincorniciati impostatestiintestazioni impostatestipdp impostatesto impostatestoetichette impostatestointestazioni impostatestotesti impostatolleranza impostatransizionepagina impostatype impostatyping impostaurl impostaversioni in inaltromargine incorniciato indentation indestra ininner inmargine inouter inriga insinistra installalingua intorno labeling lettera lettere lineamargine lineanera lineasottile lineatesto lineenere lineeriempimento lineesottili lingua linguaprincipale listsymbol loadsorts loadsynonyms logcampi mapfontsize mar marcatura marcaversione matematica mediaeval menzione mese mettielenco mettielencocombinato mettielencocombinato mettifiancoafianco mettiformula mettiingriglia mettilegenda mettiloghi mettinotepdp mettinotepdplocali mettiregistro mettiregistro mettisegnalibro mettisottoformula mettiunosullaltro mostraambientefontdeltesto mostracampi mostracolore mostracornice mostrafiguresterne mostrafontdeltesto mostragriglia mostragruppocolori mostraimpostazioni mostralyout mostramakeup mostrasetsimboli mostrastampa mostrastruts mostratavolozza name nascondiblocchi nextsection nienteelenco nientelineecimafondo nientelineintestazionepdp nientemarcatura nienterientro nientespazio nientespaziobianco nocap nop nota notapdp numeri numeriromani numerotesta numerotestacorrente overbar overbars overstrike overstrikes pagina paragraph paroladestra part ped pedap placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist posizione prendibuffer prendimarcatura programma pubblicazione pulsante pulsantinterazione punti qualcheriga ran referral register reimposta reimpostamarcatura reservefloat resettextcontent rientro rif riferimento riferimentopagina riferimentotesto riflessione rigariempimento rigovuoto ruota saltablocchi scala schermo scrividentroelenco scriviinelenco scriviinlistariferimenti scriviinregistro section seeregister segnalibro seguiprofilo seguiversione seguiversioneprofilo selezionablocchi selezionacarta selezionaversione separamarcatura settext setupfonthandling setupfontsynonym setupinterlinespace2 setupitemgroup setuplistalternative setuppaper sfondo sim simbolo sincronizza sort spazifissi spazio spaziobianco spezzaoggettomobile spostaagriglia stackcampi startalignment startambiente startbuffer startbuffer startcitazione startcolore startcolumns startcombination startcomment startcomponenet startdescription startdocument startenumeration startfatto startfigure startfloattext startformula startframedtext starthiding startimpaccato startitemgroup startlegend startline startlineamargine startlineatesto startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startmenuinterattivo startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodotto startprofile startprogetto startregister startsfondo startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startversione stirato stopalignment stopambiente stopbuffer stopbuffer stopcitazione stopcolore stopcolumns stopcombination stopcomment stopcomponenet stopdescription stopdocument stopenumeration stopfatto stopfigure stopfloattext stopformula stopframedtext stophiding stopimpaccato stopitemgroup stoplegend stopline stoplineamargine stoplineatesto stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopmenuinterattivo stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodotto stopprofile stopprogetto stopsfondo stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopversione sub subject subsection subsubject subsubsection subsubsubject synonym tab testa testoetichetta testoinmargine testoinstestazioni testonotapdp testoriempimento tex tieniblocchi tipopagina title tooltip traduci typ type typebuffer typefile underbar underbars usaURL usablocco usacodifica usacolonnasonoraesterna usacomandi usadocumentoesterno usafiguraesterna usafileesterni usafileesterno usamodulo usariferimenti usasimboli usaspecialita usedirectory usetypescript usetypescriptfile vaia vaiabox vaigiu versione vl \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/cont-nl-scite.properties b/Master/texmf-dist/context/data/scite/cont-nl-scite.properties
index 688c8a7c034..a36e8f475d6 100644
--- a/Master/texmf-dist/context/data/scite/cont-nl-scite.properties
+++ b/Master/texmf-dist/context/data/scite/cont-nl-scite.properties
@@ -1 +1 @@
-keywordclass.macros.context.nl=CAP Cap Caps Letter Letters MAAND Romeins WEEKDAG WOORD WOORDEN Woord Woorden about achtergrond appendix bepaalkopnummer bepaallijstkenmerken blanko blokje blokjes blokkeerinteractiemenu bookmark breuk but button cap chapter chem cijfers citaat citeer clip commentaar completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms converteernummer copieerveld corrigeerwitruimte coupledregister crlf datum definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling definetypeface definieer definieeralineas definieerbeeldmerk definieerblanko definieerblok definieerbuffer definieerconversie definieerfiguursymbool definieerfont definieerfontsynoniem definieerinteractiemenu definieerinteractiemenu definieerkadertekst definieerkleur definieerkleurgroep definieerkop definieerkorps definieerkorpsomgeving definieerlijst definieermarkering definieeromlijnd definieeropmaak definieeroverlay definieerpalet definieerpapierformaat definieerplaatsblok definieerprofiel definieerprogramma definieerreferentie definieerreferentieformaat definieerreferentielijst definieerregister definieersamengesteldelijst definieersectie definieersectieblok definieersorteren definieerstartstop definieersubveld definieersymbool definieersynoniemen definieertabelvorm definieertabulatie definieertekst definieertype definieertypen definieeruitvoer definieerveld definieerveldstapel definieerversie description doordefinieren doorlabelen doornummeren doorspringen dunnelijn dunnelijnen eenregel enumeration ergens externfiguur forceerblokken framedtext gebruikURL gebruikblokken gebruikcommandos gebruikexterndocument gebruikexternefile gebruikexternefiles gebruikexternfiguur gebruikexterngeluidsfragment gebruikmodule gebruikreferenties gebruikspecials gebruiksymbolen gebruiktypescript gebruiktypescriptfile geenblokkenmeer geenbovenenonderregels geenfilesmeer geenhoofdenvoetregels geenlijst geenmarkering geenspatie geenwitruimte grijskleur haalbuffer haalmarkering haarlijn handhaafblokken hl hoofdtaal hoog huidigedatum huidigekopnummer in inanderemarge inbinnen inbuiten indentation inlijnd inlinker inmarge inrechter inregel inspringen installeertaal interactiebalk interactiebuttons invullijnen invulregel invultekst invulveld items its kantlijn kenmerk kenmerkdatum kleur kloonveld kolom kop kopnummer koppeldocument koppelmarkering koppelpagina koppelpapier koppelregister koptekst laag labeling labels labeltekst laho legeregels letter letters lijstsymbool loadsorts loadsynonyms maand mapfontsize mar margetekst markeer markeerversie mediaeval naar naarbox name nextsection nietinspringen nocap noot nop omlaag omlijnd ontkoppelmarkering op opelkaar oppagina overbar overbars overstrike overstrikes pagina paginareferentie paragraph part paslayoutaan passeerblokken passendveld plaatsbeeldmerken plaatsbookmarks plaatsformule plaatslegenda plaatslijst plaatslokalevoetnoten plaatsnaastelkaar plaatsonderelkaar plaatsopgrid plaatsplaatsblok plaatsreferentielijst plaatsregister plaatsregister plaatssamengesteldelijst plaatssamengesteldelijst plaatssubformule plaatsvoetnoten placelistoffloats placelistofsorts placelistofsynonyms positioneer programma publicatie punten ran ref referentie regellinks regelmidden regelrechts register registreervelden reservefloat reset resetmarkering resettextcontent romeins rooster roteer schaal scherm schrijfnaarlijst schrijfnaarreferentielijst schrijfnaarregister schrijftussenlijst section seeregister selecteerblokken selecteerpapier selecteerversie setupfonthandling setupfontsynonym setupinterlinespace2 setuplistalternative som soortpagina sort spatie spiegel splitsplaatsblok startachtergrond startalignment startbuffer startbuffer startcitaat startcolumns startcombination startcommentaar startdescription startdocument startenumeration startfigure startfloattext startformula startframedtext startgeg starthiding startinteractiemenu startitemgroup startkantlijn startkleur startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startnamemakeup startnarrower startomgeving startonderdeel startopelkaar startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodukt startprofile startprojekt startregister startsymbolset startsynchronization starttable starttables starttabulate starttekstlijn starttyping startunpacked startversie stelachtergrondenin stelachtergrondin stelalineasin stelarrangerenin stelblankoin stelblokin stelblokjesin stelblokkopjein stelblokkopjesin stelbovenin stelboventekstenin stelbufferin stelbuttonsin stelciterenin stelclipin stelcombinatiesin stelcommentaarin steldoordefinierenin steldoornummerenin steldoorspringenin steldunnelijnenin stelexternefigurenin stelformulesin stelformulierenin stelhoofdin stelhoofdtekstenin stelinmargein stelinspringenin stelinteractiebalkin stelinteractiein stelinteractiemenuin stelinteractieschermin stelinterliniein stelinvullijnenin stelinvulregelsin stelitemgroepin stelitemsin stelkadertekstenin stelkantlijnin stelkapitalenin stelkleurenin stelkleurin stelkolommenin stelkopin stelkopnummerin stelkoppeltekenin stelkoppenin stelkoptekstin stelkorpsin stelkorpsomgevingin stellabeltekstin stellayoutin stellegendain stellijndiktein stellijstin stelmargeblokkenin stelmarkeringin stelnaastplaatsenin stelnummerenin stelomlijndin stelonderin stelonderstrepenin stelondertekstenin stelopmaakin stelpaginanummerin stelpaginanummeringin stelpaginaovergangenin stelpaletin stelpapierformaatin stelpapierin stelparagraafnummerenin stelplaatsblokin stelplaatsblokkenin stelplaatsbloksplitsenin stelpositionerenin stelprofielenin stelprogrammasin stelpublicatiesin stelrastersin stelreferentielijstin stelrefererenin stelregelnummerenin stelregelsin stelregisterin stelroterenin stelsamengesteldelijstin stelsectieblokin stelsectiein stelsmallerin stelsorterenin stelspatieringin stelstrutin stelsubpaginanummerin stelsymboolsetin stelsynchronisatiebalkin stelsynchronisatiein stelsynoniemenin stelsysteemin steltaalin steltabellenin steltabin steltabulatiein steltekstin steltekstinhoudin steltekstlijnenin stelteksttekstenin steltolerantiein steltypein steltypenin steluitlijnenin steluitvoerin stelurlin stelveldenin stelveldin stelversiesin stelvoetin stelvoetnootdefinitiein stelvoetnotenin stelvoettekstenin stelwitruimtein stopachtergrond stopalignment stopbuffer stopbuffer stopcitaat stopcolumns stopcombination stopcommentaar stopdescription stopdocument stopenumeration stopfigure stopfloattext stopformula stopframedtext stopgeg stophiding stopinteractiemenu stopitemgroup stopkantlijn stopkleur stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopnamemakeup stopnarrower stopomgeving stoponderdeel stopopelkaar stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodukt stopprofile stopprojekt stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptekstlijn stoptyping stopunpacked stopversie sub subject subsection subsubject subsubsection subsubsubject suggestie switchnaarkorps sym symbool synchronisatiebalk synchroniseer synonym taal tab tekstlijn tekstreferentie tex title toonexternefiguren toongrid tooninstellingen toonkader toonkleur toonkleurgroep toonkorps toonkorpsomgeving toonlayout toonopmaak toonpalet toonprint toonstruts toonsymboolset toonvelden typ type typebuffer typefile uit uitgerekt underbar underbars usecodering usedirectory vastespaties veld veldstapel verbergblokken vergelijkkleurgroep vergelijkpalet verplaatsopgrid versie vertaal verwerkblokken verwerkpagina vl voetnoot voetnoottekst volgprofiel volgprofielversie volgversie volledigregister weekdag wiskunde witruimte woordrechts \ No newline at end of file
+keywordclass.macros.context.nl=CAP Cap Caps Letter Letters MAAND Romeins WEEKDAG WOORD WOORDEN Woord Woorden about achtergrond appendix bepaalkopnummer bepaallijstkenmerken blanko blokje blokjes blokkeerinteractiemenu bookmark breuk but button cap chapter chem cijfers citaat citeer clip comment completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms converteernummer copieerveld corrigeerwitruimte coupledregister crlf datum definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling definetypeface definieer definieeralineas definieerbeeldmerk definieerblanko definieerblok definieerbuffer definieerconversie definieerfiguursymbool definieerfont definieerfontsynoniem definieerinteractiemenu definieerinteractiemenu definieerkadertekst definieerkleur definieerkleurgroep definieerkop definieerkorps definieerkorpsomgeving definieerlijst definieermarkering definieeromlijnd definieeropmaak definieeroverlay definieerpalet definieerpapierformaat definieerplaatsblok definieerprofiel definieerprogramma definieerreferentie definieerreferentieformaat definieerreferentielijst definieerregister definieersamengesteldelijst definieersectie definieersectieblok definieersorteren definieerstartstop definieersubveld definieersymbool definieersynoniemen definieertabelvorm definieertabulatie definieertekst definieertype definieertypen definieeruitvoer definieerveld definieerveldstapel definieerversie description doordefinieren doorlabelen doornummeren doorspringen dunnelijn dunnelijnen eenregel enumeration ergens externfiguur forceerblokken framedtext gebruikURL gebruikblokken gebruikcommandos gebruikexterndocument gebruikexternefile gebruikexternefiles gebruikexternfiguur gebruikexterngeluidsfragment gebruikmodule gebruikreferenties gebruikspecials gebruiksymbolen gebruiktypescript gebruiktypescriptfile geenblokkenmeer geenbovenenonderregels geenfilesmeer geenhoofdenvoetregels geenlijst geenmarkering geenspatie geenwitruimte grijskleur haalbuffer haalmarkering haarlijn handhaafblokken hl hoofdtaal hoog huidigedatum huidigekopnummer in inanderemarge inbinnen inbuiten indentation inlijnd inlinker inmarge inrechter inregel inspringen installeertaal interactiebalk interactiebuttons invullijnen invulregel invultekst invulveld items its kantlijn kenmerk kenmerkdatum kleur kloonveld kolom kop kopnummer koppeldocument koppelmarkering koppelpagina koppelpapier koppelregister koptekst laag labeling labels labeltekst laho legeregels letter letters lijstsymbool loadsorts loadsynonyms maand mapfontsize mar margetekst markeer markeerversie mediaeval naar naarbox name nextsection nietinspringen nocap noot nop omlaag omlijnd ontkoppelmarkering op opelkaar oppagina overbar overbars overstrike overstrikes pagina paginareferentie paragraph part paslayoutaan passeerblokken passendveld plaatsbeeldmerken plaatsbookmarks plaatsformule plaatslegenda plaatslijst plaatslokalevoetnoten plaatsnaastelkaar plaatsonderelkaar plaatsopgrid plaatsplaatsblok plaatsreferentielijst plaatsregister plaatsregister plaatssamengesteldelijst plaatssamengesteldelijst plaatssubformule plaatsvoetnoten placelistoffloats placelistofsorts placelistofsynonyms positioneer programma publicatie punten ran ref referentie regellinks regelmidden regelrechts register registreervelden reservefloat reset resetmarkering resettextcontent romeins rooster roteer schaal scherm schrijfnaarlijst schrijfnaarreferentielijst schrijfnaarregister schrijftussenlijst section seeregister selecteerblokken selecteerpapier selecteerversie setupfonthandling setupfontsynonym setupinterlinespace2 setuplistalternative som soortpagina sort spatie spiegel splitsplaatsblok startachtergrond startalignment startbuffer startbuffer startcitaat startcolumns startcombination startcomment startdescription startdocument startenumeration startfigure startfloattext startformula startframedtext startgeg starthiding startinteractiemenu startitemgroup startkantlijn startkleur startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startnamemakeup startnarrower startomgeving startonderdeel startopelkaar startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodukt startprofile startprojekt startregister startsymbolset startsynchronization starttable starttables starttabulate starttekstlijn starttyping startunpacked startversie stelachtergrondenin stelachtergrondin stelalineasin stelarrangerenin stelblankoin stelblokin stelblokjesin stelblokkopjein stelblokkopjesin stelbovenin stelboventekstenin stelbufferin stelbuttonsin stelciterenin stelclipin stelcombinatiesin stelcommentaarin steldoordefinierenin steldoornummerenin steldoorspringenin steldunnelijnenin stelexternefigurenin stelformulesin stelformulierenin stelhoofdin stelhoofdtekstenin stelinmargein stelinspringenin stelinteractiebalkin stelinteractiein stelinteractiemenuin stelinteractieschermin stelinterliniein stelinvullijnenin stelinvulregelsin stelitemgroepin stelitemsin stelkadertekstenin stelkantlijnin stelkapitalenin stelkleurenin stelkleurin stelkolommenin stelkopin stelkopnummerin stelkoppeltekenin stelkoppenin stelkoptekstin stelkorpsin stelkorpsomgevingin stellabeltekstin stellayoutin stellegendain stellijndiktein stellijstin stelmargeblokkenin stelmarkeringin stelnaastplaatsenin stelnummerenin stelomlijndin stelonderin stelonderstrepenin stelondertekstenin stelopmaakin stelpaginanummerin stelpaginanummeringin stelpaginaovergangenin stelpaletin stelpapierformaatin stelpapierin stelparagraafnummerenin stelplaatsblokin stelplaatsblokkenin stelplaatsbloksplitsenin stelpositionerenin stelprofielenin stelprogrammasin stelpublicatiesin stelrastersin stelreferentielijstin stelrefererenin stelregelnummerenin stelregelsin stelregisterin stelroterenin stelsamengesteldelijstin stelsectieblokin stelsectiein stelsmallerin stelsorterenin stelspatieringin stelstrutin stelsubpaginanummerin stelsymboolsetin stelsynchronisatiebalkin stelsynchronisatiein stelsynoniemenin stelsysteemin steltaalin steltabellenin steltabin steltabulatiein steltekstin steltekstinhoudin steltekstlijnenin stelteksttekstenin steltolerantiein steltypein steltypenin steluitlijnenin steluitvoerin stelurlin stelveldenin stelveldin stelversiesin stelvoetin stelvoetnootdefinitiein stelvoetnotenin stelvoettekstenin stelwitruimtein stopachtergrond stopalignment stopbuffer stopbuffer stopcitaat stopcolumns stopcombination stopcomment stopdescription stopdocument stopenumeration stopfigure stopfloattext stopformula stopframedtext stopgeg stophiding stopinteractiemenu stopitemgroup stopkantlijn stopkleur stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopnamemakeup stopnarrower stopomgeving stoponderdeel stopopelkaar stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodukt stopprofile stopprojekt stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptekstlijn stoptyping stopunpacked stopversie sub subject subsection subsubject subsubsection subsubsubject suggestie switchnaarkorps sym symbool synchronisatiebalk synchroniseer synonym taal tab tekstlijn tekstreferentie tex title toonexternefiguren toongrid tooninstellingen toonkader toonkleur toonkleurgroep toonkorps toonkorpsomgeving toonlayout toonopmaak toonpalet toonprint toonstruts toonsymboolset toonvelden typ type typebuffer typefile uit uitgerekt underbar underbars usecodering usedirectory vastespaties veld veldstapel verbergblokken vergelijkkleurgroep vergelijkpalet verplaatsopgrid versie vertaal verwerkblokken verwerkpagina vl voetnoot voetnoottekst volgprofiel volgprofielversie volgversie volledigregister weekdag wiskunde witruimte woordrechts \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/cont-pe-scite.properties b/Master/texmf-dist/context/data/scite/cont-pe-scite.properties
index a1769572557..c89f52b8f20 100644
--- a/Master/texmf-dist/context/data/scite/cont-pe-scite.properties
+++ b/Master/texmf-dist/context/data/scite/cont-pe-scite.properties
@@ -1 +1 @@
-keywordclass.macros.context.pe=CAP Cap Caps Character Characters MONTH Romannumerals WEEKDAY WORD WORDS Word Words appendix cap chapter chem completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms coupledregister crlf definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling definetypeface description enumeration framedtext indentation its labeling loadsorts loadsynonyms mapfontsize mediaeval name nextsection nocap overbar overbars overstrike overstrikes paragraph part placelistoffloats placelistofsorts placelistofsynonyms ran register reservefloat resettextcontent section seeregister setupcapitals setupfonthandling setupfontsynonym setupinterlinespace2 setuplistalternative setupurl sort startalignment startbuffer startbuffer startcolumns startcombination startdescription startdocument startenumeration startfigure startfloattext startformula startframedtext starthiding startitemgroup startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprofile startregister startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startتوضیح startتولید startحقیقت startخط‌حاشیه startخط‌متن startرنگ startفشرده startمحیط startمنوی‌پانل startمولفه startنسخه startنقل‌قول startپروژه startپس‌زمینه stopalignment stopbuffer stopbuffer stopcolumns stopcombination stopdescription stopdocument stopenumeration stopfigure stopfloattext stopformula stopframedtext stophiding stopitemgroup stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprofile stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopتوضیح stopتولید stopحقیقت stopخط‌حاشیه stopخط‌متن stopرنگ stopفشرده stopمحیط stopمنوی‌پانل stopمولفه stopنسخه stopنقل‌قول stopپروژه stopپس‌زمینه sub subject subsection subsubject subsubsection subsubsubject synonym title tooltip typ underbar underbars useURL usedirectory آیتم آیتمها آینه اجباربلوکها از ازکارانداختن‌منوی‌پانل استفاده‌بلوکها استفاده‌دستخط‌تایپ استفاده‌رمزینه استفاده‌شکل‌خارجی استفاده‌فرمانها استفاده‌قطعه‌موزیک‌خارجی استفاده‌مدول استفاده‌مرجعها استفاده‌نمادها استفاده‌نوشتارخارجی استفاده‌ویژگیها استفاده‌پرونده‌خارجی استفاده‌پرونده‌دستخط‌تایپ استفاده‌پرونده‌های‌خارجی اعدادلاتین اما انتخاب‌برگ انتخاب‌بلوکها انتخاب‌نسخه انتقال‌به‌توری بارگذاری‌آرایش بارگذاری‌آیتمها بارگذاری‌ارجاع بارگذاری‌اندازه‌برگ بارگذاری‌باریکتر بارگذاری‌بافر بارگذاری‌بالا بارگذاری‌بخش بارگذاری‌بردباری بارگذاری‌برنامه‌ها بارگذاری‌برگ بارگذاری‌بست بارگذاری‌بلوک بارگذاری‌بلوکهای‌حاشیه بارگذاری‌بلوک‌بخش بارگذاری‌تایپ بارگذاری‌تایپ‌کردن بارگذاری‌تب بارگذاری‌ترتیب بارگذاری‌ترتیب بارگذاری‌ترکیب‌ها بارگذاری‌تطابق بارگذاری‌تعریف‌پانوشت بارگذاری‌تنظیم بارگذاری‌ته‌برگ بارگذاری‌تورفتگی بارگذاری‌تورفتگیها بارگذاری‌توضیح بارگذاری‌ثبت بارگذاری‌جدولها بارگذاری‌جدول‌بندی بارگذاری‌خالی بارگذاری‌خروجی بارگذاری‌خطها بارگذاری‌خطهای‌حاشیه بارگذاری‌خطهای‌سیاه بارگذاری‌خطهای‌متن بارگذاری‌خطها‌ی‌نازک بارگذاری‌درج‌درخطها بارگذاری‌درج‌مخالف بارگذاری‌درون‌حاشیه بارگذاری‌دوران بارگذاری‌دکمه‌ها بارگذاری‌راهنما بارگذاری‌رنگ بارگذاری‌رنگها بارگذاری‌زبان بارگذاری‌ستونها بارگذاری‌سر بارگذاری‌سربرگ بارگذاری‌سرها بارگذاری‌سیستم بارگذاری‌شرح بارگذاری‌شرح بارگذاری‌شرحها بارگذاری‌شماره‌زیرصفحه بارگذاری‌شماره‌سر بارگذاری‌شماره‌صفحه بارگذاری‌شماره‌گذاری بارگذاری‌شماره‌گذاریها بارگذاری‌شماره‌گذاری‌صفحه بارگذاری‌شماره‌گذاری‌پاراگراف بارگذاری‌شماره‌‌گذاری‌خط بارگذاری‌شناور بارگذاری‌شناورها بارگذاری‌شکافتن‌شناورها بارگذاری‌شکلهای‌خارجی بارگذاری‌طرح بارگذاری‌طرح‌بندی بارگذاری‌عرض‌خط بارگذاری‌فاصله‌بین‌خط بارگذاری‌فرمولها بارگذاری‌فضای‌سفید بارگذاری‌فضا‌گذاری بارگذاری‌قالبی بارگذاری‌قلم‌متن بارگذاری‌لوح بارگذاری‌لیست بارگذاری‌لیست‌ترکیبی بارگذاری‌لیست‌مرجع بارگذاری‌مترادفها بارگذاری‌متن بارگذاری‌متنهای‌بالا بارگذاری‌متن‌سر بارگذاری‌متن‌سربرگ بارگذاری‌متن‌قالبی بارگذاری‌متن‌متنها بارگذاری‌متن‌پانوشت بارگذاری‌متن‌پایین بارگذاری‌مجموعه‌نماد بارگذاری‌محیط‌قلم‌متن بارگذاری‌منوی‌پانل بارگذاری‌مکان‌گذاری بارگذاری‌میدان بارگذاری‌میدانها بارگذاری‌میله‌تطابق بارگذاری‌میله‌زیر بارگذاری‌میله‌پانل بارگذاری‌نسخه‌ها بارگذاری‌نشانه‌شکستن بارگذاری‌نشانه‌گذاری بارگذاری‌نشرها بارگذاری‌نقل بارگذاری‌پاراگرافها بارگذاری‌پانل بارگذاری‌پانوشتها بارگذاری‌پایین بارگذاری‌پرده‌ها بارگذاری‌پرده‌پانل بارگذاری‌پروفایلها بارگذاری‌پرکردن‌خطها بارگذاری‌پس‌زمینه بارگذاری‌پس‌زمینه‌ها بارگذاری‌چیدن بارگذاری‌گذارصفحه بارگذاری‌گروه‌آیتم بازنشانی بازنشانی‌نشانه‌گذاری باگذاری‌متن‌برچسب بدون‌بلوکهای‌بیشتر بدون‌تورفتگی بدون‌خط‌بالاوپایین بدون‌خط‌سروته‌برگ بدون‌فایلهای‌بیشتر بدون‌فضا بدون‌فضای‌سفید بدون‌لیست بدون‌نشانه‌گذاری برنامه بروبه بروبه‌جعبه بروپایین برچسبها بلند بلوکهای‌پردازش بلوکها‌پنهان بنویس‌بین‌لیست بنویس‌درثبت بنویس‌درلیست‌مرجع بنویس‌در‌لیست تاریخ تاریخ‌جاری تاریخ‌رجوع تایپ تایپ‌بافر تایپ‌پرونده تب ترجمه تطابق تعریف تعریف‌آرایش تعریف‌آرم تعریف‌الگوی‌جدول تعریف‌اندازه‌برگ تعریف‌بافر تعریف‌بخش تعریف‌برنامه تعریف‌برچسب تعریف‌بلوک تعریف‌بلوک‌بخش تعریف‌تایپ تعریف‌تایپ‌کردن تعریف‌تبدیل تعریف‌ترتیب تعریف‌توده‌میدان تعریف‌تورفتگی تعریف‌ثبت تعریف‌جدول‌بندی تعریف‌خالی تعریف‌خروجی تعریف‌رنگ تعریف‌زیرمیدان تعریف‌سر تعریف‌شرح تعریف‌شروع‌پایان تعریف‌شماره‌بندی تعریف‌شمایل‌مرجع تعریف‌شناور تعریف‌قالبی تعریف‌قلم تعریف‌قلم‌متن تعریف‌لوح تعریف‌لیست تعریف‌لیست‌ترکیبی تعریف‌لیست‌مرجع تعریف‌مترادفها تعریف‌مترادف‌قلم تعریف‌متن تعریف‌متن‌قالبی تعریف‌محیط‌قلم‌بدنه تعریف‌مرجع تعریف‌منوی‌پانل تعریف‌منوی‌پانل تعریف‌میدان تعریف‌نسخه تعریف‌نشانه‌گذاری تعریف‌نماد تعریف‌نمادشکل تعریف‌پاراگرافها تعریف‌پروفایل تعریف‌پوشش تعریف‌گروه‌رنگ تعیین‌شماره‌سر تعیین‌محتوای‌متن تعیین‌مشخصات‌لیست تغییربه‌قلم‌بدنه تنظیم‌راست تنظیم‌طرح‌بندی تنظیم‌وسط تورفتگی توری توضیح تک ثبت‌زوج ثبت‌کامل جداسازی‌نشانه‌گذاری حاش حرف حرفها حفظ‌بلوکها خالی خطهای‌سیاه خطهای‌نازک خطها‌خالی خط‌حاشیه خط‌سیاه خط‌متن خط‌مو خط‌نازک خ‌ا خ‌ع در درج‌آرمها درج‌ثبت درج‌ثبت درج‌درخط درج‌درخطها درج‌درمتن درج‌درمیدان درج‌در‌بالای‌یکدیگر درج‌در‌توری درج‌راهنما درج‌زیرفرمول درج‌شناور درج‌فرمول درج‌لیست درج‌لیست‌مختلط درج‌لیست‌مختلط درج‌لیست‌مرجع درج‌پانوشتها درج‌پانوشتهای‌موضعی درج‌چوب‌خط درج‌کنار‌به‌کنار درحاشیه درحاشیه‌دیگر درخارجی درخط درداخلی درراست درصفحه درقالبی درمورد درون درچپ دریافت‌بافر دریافت‌نشانه دوران دکمه دکمه‌پانل رج رجوع رنگ رنگ‌خاکستری روزهفته ریاضی زبان زبان‌اصلی ستون سر شماره‌سر شماره‌سرجاری شماره‌مبدل شماره‌ها شکافتن‌شناور شکل‌خارجی صفحه صفحه‌زوج صفحه‌پردازش عبوربلوکها فشرده فضا فضاهای‌ثابت فضای‌سفید فضای‌سفیدصحیح قالبی لوح‌مقایسه ماه متن‌برچسب متن‌حاشیه متن‌سر متن‌پانوشت مرجع مرجع‌صفحه مرجع‌متن مقایسه‌گروه‌رنگ مقیاس منفی مکان میدان میدانهای‌گزارش میدان‌شبیه‌سازی میدان‌پشته میدان‌کپی میله‌تطابق میله‌پانل نسخه نسخه‌نشانه نشانه‌گذاری نشانه‌گذاری‌زوج نشر نصب‌زبان نقطه‌ها نقل نقل‌قول نم نماد نمادلیست نمایش‌آرایش نمایش‌بارگذاریها نمایش‌بستها نمایش‌توری نمایش‌رنگ نمایش‌شکلهای‌خارجی نمایش‌طرح‌بندی نمایش‌قالب نمایش‌قلم‌بدنه نمایش‌لوح نمایش‌مجموعه‌علامت نمایش‌محیط‌قلم‌بدنه نمایش‌میدانها نمایش‌چاپ نمایش‌گروه‌رنگ نوشتارزوج نوع‌صفحه پابا پانوشت پایین پرده پرکردن‌میدان پس‌زمینه پیروی‌نسخه پیروی‌نسخه‌پروفایل پیروی‌پروفایل چوبخط چپ‌چین کاغذزوج کسر کشیده کلمه‌راست گیره یادداشت یک‌جا یک‌خط \ No newline at end of file
+keywordclass.macros.context.pe=CAP Cap Caps Character Characters MONTH Romannumerals WEEKDAY WORD WORDS Word Words appendix cap chapter chem comment completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms coupledregister crlf definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling definetypeface description enumeration framedtext indentation its labeling loadsorts loadsynonyms mapfontsize mediaeval name nextsection nocap overbar overbars overstrike overstrikes paragraph part placelistoffloats placelistofsorts placelistofsynonyms ran register reservefloat resettextcontent section seeregister setupcapitals setupfonthandling setupfontsynonym setupinterlinespace2 setuplistalternative setupurl sort startalignment startbuffer startbuffer startcolumns startcombination startcomment startdescription startdocument startenumeration startfigure startfloattext startformula startframedtext starthiding startitemgroup startlegend startline startlinecorrection startlinenumbering startlines startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprofile startregister startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startتولید startحقیقت startخط‌حاشیه startخط‌متن startرنگ startفشرده startمحیط startمنوی‌پانل startمولفه startنسخه startنقل‌قول startپروژه startپس‌زمینه stopalignment stopbuffer stopbuffer stopcolumns stopcombination stopcomment stopdescription stopdocument stopenumeration stopfigure stopfloattext stopformula stopframedtext stophiding stopitemgroup stoplegend stopline stoplinecorrection stoplinenumbering stoplines stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprofile stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopتولید stopحقیقت stopخط‌حاشیه stopخط‌متن stopرنگ stopفشرده stopمحیط stopمنوی‌پانل stopمولفه stopنسخه stopنقل‌قول stopپروژه stopپس‌زمینه sub subject subsection subsubject subsubsection subsubsubject synonym title tooltip typ underbar underbars useURL usedirectory آیتم آیتمها آینه اجباربلوکها از ازکارانداختن‌منوی‌پانل استفاده‌بلوکها استفاده‌دستخط‌تایپ استفاده‌رمزینه استفاده‌شکل‌خارجی استفاده‌فرمانها استفاده‌قطعه‌موزیک‌خارجی استفاده‌مدول استفاده‌مرجعها استفاده‌نمادها استفاده‌نوشتارخارجی استفاده‌ویژگیها استفاده‌پرونده‌خارجی استفاده‌پرونده‌دستخط‌تایپ استفاده‌پرونده‌های‌خارجی اعدادلاتین اما انتخاب‌برگ انتخاب‌بلوکها انتخاب‌نسخه انتقال‌به‌توری بارگذاری‌آرایش بارگذاری‌آیتمها بارگذاری‌ارجاع بارگذاری‌اندازه‌برگ بارگذاری‌باریکتر بارگذاری‌بافر بارگذاری‌بالا بارگذاری‌بخش بارگذاری‌بردباری بارگذاری‌برنامه‌ها بارگذاری‌برگ بارگذاری‌بست بارگذاری‌بلوک بارگذاری‌بلوکهای‌حاشیه بارگذاری‌بلوک‌بخش بارگذاری‌تایپ بارگذاری‌تایپ‌کردن بارگذاری‌تب بارگذاری‌ترتیب بارگذاری‌ترتیب بارگذاری‌ترکیب‌ها بارگذاری‌تطابق بارگذاری‌تعریف‌پانوشت بارگذاری‌تنظیم بارگذاری‌ته‌برگ بارگذاری‌تورفتگی بارگذاری‌تورفتگیها بارگذاری‌توضیح بارگذاری‌ثبت بارگذاری‌جدولها بارگذاری‌جدول‌بندی بارگذاری‌خالی بارگذاری‌خروجی بارگذاری‌خطها بارگذاری‌خطهای‌حاشیه بارگذاری‌خطهای‌سیاه بارگذاری‌خطهای‌متن بارگذاری‌خطها‌ی‌نازک بارگذاری‌درج‌درخطها بارگذاری‌درج‌مخالف بارگذاری‌درون‌حاشیه بارگذاری‌دوران بارگذاری‌دکمه‌ها بارگذاری‌راهنما بارگذاری‌رنگ بارگذاری‌رنگها بارگذاری‌زبان بارگذاری‌ستونها بارگذاری‌سر بارگذاری‌سربرگ بارگذاری‌سرها بارگذاری‌سیستم بارگذاری‌شرح بارگذاری‌شرح بارگذاری‌شرحها بارگذاری‌شماره‌زیرصفحه بارگذاری‌شماره‌سر بارگذاری‌شماره‌صفحه بارگذاری‌شماره‌گذاری بارگذاری‌شماره‌گذاریها بارگذاری‌شماره‌گذاری‌صفحه بارگذاری‌شماره‌گذاری‌پاراگراف بارگذاری‌شماره‌‌گذاری‌خط بارگذاری‌شناور بارگذاری‌شناورها بارگذاری‌شکافتن‌شناورها بارگذاری‌شکلهای‌خارجی بارگذاری‌طرح بارگذاری‌طرح‌بندی بارگذاری‌عرض‌خط بارگذاری‌فاصله‌بین‌خط بارگذاری‌فرمولها بارگذاری‌فضای‌سفید بارگذاری‌فضا‌گذاری بارگذاری‌قالبی بارگذاری‌قلم‌متن بارگذاری‌لوح بارگذاری‌لیست بارگذاری‌لیست‌ترکیبی بارگذاری‌لیست‌مرجع بارگذاری‌مترادفها بارگذاری‌متن بارگذاری‌متنهای‌بالا بارگذاری‌متن‌سر بارگذاری‌متن‌سربرگ بارگذاری‌متن‌قالبی بارگذاری‌متن‌متنها بارگذاری‌متن‌پانوشت بارگذاری‌متن‌پایین بارگذاری‌مجموعه‌نماد بارگذاری‌محیط‌قلم‌متن بارگذاری‌منوی‌پانل بارگذاری‌مکان‌گذاری بارگذاری‌میدان بارگذاری‌میدانها بارگذاری‌میله‌تطابق بارگذاری‌میله‌زیر بارگذاری‌میله‌پانل بارگذاری‌نسخه‌ها بارگذاری‌نشانه‌شکستن بارگذاری‌نشانه‌گذاری بارگذاری‌نشرها بارگذاری‌نقل بارگذاری‌پاراگرافها بارگذاری‌پانل بارگذاری‌پانوشتها بارگذاری‌پایین بارگذاری‌پرده‌ها بارگذاری‌پرده‌پانل بارگذاری‌پروفایلها بارگذاری‌پرکردن‌خطها بارگذاری‌پس‌زمینه بارگذاری‌پس‌زمینه‌ها بارگذاری‌چیدن بارگذاری‌گذارصفحه بارگذاری‌گروه‌آیتم بازنشانی بازنشانی‌نشانه‌گذاری باگذاری‌متن‌برچسب بدون‌بلوکهای‌بیشتر بدون‌تورفتگی بدون‌خط‌بالاوپایین بدون‌خط‌سروته‌برگ بدون‌فایلهای‌بیشتر بدون‌فضا بدون‌فضای‌سفید بدون‌لیست بدون‌نشانه‌گذاری برنامه بروبه بروبه‌جعبه بروپایین برچسبها بلند بلوکهای‌پردازش بلوکها‌پنهان بنویس‌بین‌لیست بنویس‌درثبت بنویس‌درلیست‌مرجع بنویس‌در‌لیست تاریخ تاریخ‌جاری تاریخ‌رجوع تایپ تایپ‌بافر تایپ‌پرونده تب ترجمه تطابق تعریف تعریف‌آرایش تعریف‌آرم تعریف‌الگوی‌جدول تعریف‌اندازه‌برگ تعریف‌بافر تعریف‌بخش تعریف‌برنامه تعریف‌برچسب تعریف‌بلوک تعریف‌بلوک‌بخش تعریف‌تایپ تعریف‌تایپ‌کردن تعریف‌تبدیل تعریف‌ترتیب تعریف‌توده‌میدان تعریف‌تورفتگی تعریف‌ثبت تعریف‌جدول‌بندی تعریف‌خالی تعریف‌خروجی تعریف‌رنگ تعریف‌زیرمیدان تعریف‌سر تعریف‌شرح تعریف‌شروع‌پایان تعریف‌شماره‌بندی تعریف‌شمایل‌مرجع تعریف‌شناور تعریف‌قالبی تعریف‌قلم تعریف‌قلم‌متن تعریف‌لوح تعریف‌لیست تعریف‌لیست‌ترکیبی تعریف‌لیست‌مرجع تعریف‌مترادفها تعریف‌مترادف‌قلم تعریف‌متن تعریف‌متن‌قالبی تعریف‌محیط‌قلم‌بدنه تعریف‌مرجع تعریف‌منوی‌پانل تعریف‌منوی‌پانل تعریف‌میدان تعریف‌نسخه تعریف‌نشانه‌گذاری تعریف‌نماد تعریف‌نمادشکل تعریف‌پاراگرافها تعریف‌پروفایل تعریف‌پوشش تعریف‌گروه‌رنگ تعیین‌شماره‌سر تعیین‌محتوای‌متن تعیین‌مشخصات‌لیست تغییربه‌قلم‌بدنه تنظیم‌راست تنظیم‌طرح‌بندی تنظیم‌وسط تورفتگی توری تک ثبت‌زوج ثبت‌کامل جداسازی‌نشانه‌گذاری حاش حرف حرفها حفظ‌بلوکها خالی خطهای‌سیاه خطهای‌نازک خطها‌خالی خط‌حاشیه خط‌سیاه خط‌متن خط‌مو خط‌نازک خ‌ا خ‌ع در درج‌آرمها درج‌ثبت درج‌ثبت درج‌درخط درج‌درخطها درج‌درمتن درج‌درمیدان درج‌در‌بالای‌یکدیگر درج‌در‌توری درج‌راهنما درج‌زیرفرمول درج‌شناور درج‌فرمول درج‌لیست درج‌لیست‌مختلط درج‌لیست‌مختلط درج‌لیست‌مرجع درج‌پانوشتها درج‌پانوشتهای‌موضعی درج‌چوب‌خط درج‌کنار‌به‌کنار درحاشیه درحاشیه‌دیگر درخارجی درخط درداخلی درراست درصفحه درقالبی درمورد درون درچپ دریافت‌بافر دریافت‌نشانه دوران دکمه دکمه‌پانل رج رجوع رنگ رنگ‌خاکستری روزهفته ریاضی زبان زبان‌اصلی ستون سر شماره‌سر شماره‌سرجاری شماره‌مبدل شماره‌ها شکافتن‌شناور شکل‌خارجی صفحه صفحه‌زوج صفحه‌پردازش عبوربلوکها فشرده فضا فضاهای‌ثابت فضای‌سفید فضای‌سفیدصحیح قالبی لوح‌مقایسه ماه متن‌برچسب متن‌حاشیه متن‌سر متن‌پانوشت مرجع مرجع‌صفحه مرجع‌متن مقایسه‌گروه‌رنگ مقیاس منفی مکان میدان میدانهای‌گزارش میدان‌شبیه‌سازی میدان‌پشته میدان‌کپی میله‌تطابق میله‌پانل نسخه نسخه‌نشانه نشانه‌گذاری نشانه‌گذاری‌زوج نشر نصب‌زبان نقطه‌ها نقل نقل‌قول نم نماد نمادلیست نمایش‌آرایش نمایش‌بارگذاریها نمایش‌بستها نمایش‌توری نمایش‌رنگ نمایش‌شکلهای‌خارجی نمایش‌طرح‌بندی نمایش‌قالب نمایش‌قلم‌بدنه نمایش‌لوح نمایش‌مجموعه‌علامت نمایش‌محیط‌قلم‌بدنه نمایش‌میدانها نمایش‌چاپ نمایش‌گروه‌رنگ نوشتارزوج نوع‌صفحه پابا پانوشت پایین پرده پرکردن‌میدان پس‌زمینه پیروی‌نسخه پیروی‌نسخه‌پروفایل پیروی‌پروفایل چوبخط چپ‌چین کاغذزوج کسر کشیده کلمه‌راست گیره یادداشت یک‌جا یک‌خط \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/cont-ro-scite.properties b/Master/texmf-dist/context/data/scite/cont-ro-scite.properties
index 47fd2b9c3ce..3f9cc57e160 100644
--- a/Master/texmf-dist/context/data/scite/cont-ro-scite.properties
+++ b/Master/texmf-dist/context/data/scite/cont-ro-scite.properties
@@ -1 +1 @@
-keywordclass.macros.context.ro=CAP CUVANT CUVINTE Cap Caps Cuvant Cuvinte LUNA Litera Litere Numereromane ZIDINSAPTAMANA adapteazaaspect adubuffer adumarcaje afiseazaaspect afiseazacampuri afiseazaculoare afiseazafiguriexterne afiseazafonttext afiseazagrid afiseazagrupculoare afiseazamakeup afiseazamediufonttext afiseazapaleta afiseazarama afiseazasetari afiseazasetsimboluri afiseazastruts afiseazatiparire aliniat aliniatcentru aliniatdreapta aliniatstanga appendix ascundeblocuri barainteractiune barasincronizare blanc but butoaneinteractiune buton camp campumplere cap chapter chem citat clip cloneazacamp coloana comentariu comparagrupculoare comparapaleta completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister convertestenumar copiazacamp corecteazaspatiualb coupledregister crlf culoare culoaregri cupleazadocument cupleazamarcaje cupleazaregistru cuvantdreapta data datacurenta datareferit decupleazamarcaje definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling defineste definestealiat definesteantet definesteblanc definestebloc definesteblocsectiune definestebuffer definestecamp definesteconversie definesteculoare definestedescriere definestedimensiunehartie definesteenumerare definesteeticheta definestefloat definestefont definestefonttext definesteformatreferinte definestegrupculori definesteinconjurare definestelista definestelistacombinata definestelistareferinte definestelogo definestemakeup definestemarcaje definestemediulfonttext definestemeniuinteractiune definestemeniuinteractiune definesteoutput definesteoverlay definestepaleta definesteparagraf definesteprofil definesteprogram definestereferinte definesteregistru definestesablontabel definestesectiune definestesimbol definestesimbolfigura definestesinonim definestesinonimfont definestesortare definestestartstop definestestivacampuri definestesubcamp definestetabulatori definestetext definestetexteinconjurate definestetextinconjurat definestetyping definesteversiune definetype definetypeface description despre determinacaracteristicilelistei determinanumartitlu dezactiveazameniuinteractiune din dute dutebox ecran el element element emptylines enumeration etichete faraaliniat farafisiere faraliniiantetsisubsol faraliniisussijos faralista faramarcaje faraspatiu faraspatiualb figuraexterna firdepar folosesteURL folosestebloc folosestecodificarea folosestecomenzi folosestedocumentextern folosestefiguraexterna folosestefisiereexterne folosestefisierextern folosestemodul folosestemuzicaexterna folosestereferinte folosestesimboluri folosestespeciale footnotetext forteazablocuri fractie framed framedtext fundal gatablocuri grid hartiedubla hl impachetat impartefloat in inalt inaltamargine indentation indreapta inframed ininner injos inlinie inouter instalarelimba instanga intins jos jossus la labeling lapagina limba limbaprincipala liniemargine linieneagra liniesubtire linieumplere liniinegre liniisubtiri listsymbol litera litere loadsorts loadsynonyms logcampuri luna mapfontsize mar marcaje marcheazaversiune marginal matematica mediaeval minicitat mutapegrid name nextsection nocap nop nota notasubsol numartitlu numartitlucurent numere numereromane olinie overbar overbars overstrike overstrikes pagina paginadubla paragraph part pastreazablocuri placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist plaseazapegrid plaseazasemnecarte potrivestecamp pozitie proceseazabloc proceseazapagina program publicatie puncte punedeasuprafiecareia punefatainfata puneformula punelegenda punelista punelistacombinata punelistacombinata punelogouri punenotesubsol punenotesubsollocale puneregistru puneregistru punesubformula ran ref referinta referintapagina referintatext referit reflexie register reservefloat reset reseteazamarcaje resettextcontent riglatext rigleumplere roteste saripesteblocuri scala scriebuffer scrieinlista scrieinlistareferinte scrieinregistru scrieintreliste section seeregister selecteazablocuri selecteazahartie selecteazaversiune semncarte setarebarasincronizare setarelimba setareoutput setarepozitie setaresincronizare seteazaaliniat seteazaaliniate seteazaalinierea seteazaantet seteazaaranjareapag seteazaaspect seteazabarainteractiune seteazablanc seteazabloc seteazablocsectiune seteazablocurimarginale seteazabuffer seteazabutoane seteazacamp seteazacampuri seteazaclipping seteazacoloane seteazacombinari seteazacomentariu seteazaculoare seteazaculori seteazadefinireanotasubsol seteazadescriere seteazadimensiunihartie seteazaecrane seteazaecraninteractiune seteazaelemente seteazaenumerare seteazafiguriexterne seteazafloat seteazafloats seteazafonttext seteazaformulare seteazaformule seteazafundal seteazafundaluri seteazagrosimelinie seteazaimpartireafloat seteazainconjurat seteazaingust seteazainteractiunea seteazajos seteazalegenda seteazalegenda seteazalegendele seteazaliniesilabe seteazaliniesubtire seteazalinii seteazaliniimargine seteazaliniinegre seteazaliniiumplere seteazalista seteazalistacombinata seteazalistareferinte seteazamajuscule seteazamakeup seteazamarcaje seteazamarginal seteazamediulfonttext seteazameniuinteractiune seteazaminicitat seteazanotasubsol seteazanumarpagina seteazanumarsubpagina seteazanumartitlu seteazanumerotare seteazanumerotarelinii seteazanumerotarepagina seteazanumerotareparagrafe seteazapaleta seteazaparagrafe seteazaplasareaopozita seteazaprofile seteazaprograme seteazapublicatii seteazareferinte seteazaregistru seteazarigletext seteazarigleumplere seteazarotare seteazasectiune seteazasimbol seteazasinonime seteazasistem seteazasortare seteazaspatiu seteazaspatiualb seteazaspatiuinterliniar seteazastrut seteazasublinie seteazasubsol seteazasus seteazatab seteazatabele seteazatabulatori seteazatext seteazatexteantet seteazatextejos seteazatextesubsol seteazatextesus seteazatextetext seteazatexteticheta seteazatexttitlu seteazatitlu seteazatitluri seteazatoleranta seteazatranzitiepagina seteazatype seteazatyping seteazaurl seteazaversiuni settextcontent setupfonthandling setupfontsynonym setupinterlinespace2 setupitemgroup setuplistalternative setuppaper sim simbol sincronizeaza sort spatiifixate spatiu spatiualb startalignment startbuffer startbuffer startcitat startcolumns startcombination startcomentariu startcomponenta startculoare startdescription startdocument startenumeration startfact startfigure startfloattext startformula startframedtext startfundal starthiding startimpachetat startitemgroup startlegend startline startlinecorrection startlinenumbering startlines startliniemargine startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startmediu startmeniuinteractiune startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodus startprofile startproiect startregister startriglatext startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startversiune stivacampuri stopalignment stopbuffer stopbuffer stopcitat stopcolumns stopcombination stopcomentariu stopcomponenta stopculoare stopdescription stopdocument stopenumeration stopfact stopfigure stopfloattext stopformula stopframedtext stopfundal stophiding stopimpachetat stopitemgroup stoplegend stopline stoplinecorrection stoplinenumbering stoplines stopliniemargine stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopmediu stopmeniuinteractiune stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodus stopprofile stopproiect stopriglatext stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopversiune sub subject subsection subsubject subsubsection subsubsubject synonym tab tex texteticheta textmarginal texttitlu textumplere tippagina title titlu tooltip traduce trecilafonttext typ type typefile underbar underbars undeva urmeazaprofil urmeazaversiune urmeazaversiuneprofil usedirectory usetypescript usetypescriptfile versiune vl zidinsaptamana \ No newline at end of file
+keywordclass.macros.context.ro=CAP CUVANT CUVINTE Cap Caps Cuvant Cuvinte LUNA Litera Litere Numereromane ZIDINSAPTAMANA adapteazaaspect adubuffer adumarcaje afiseazaaspect afiseazacampuri afiseazaculoare afiseazafiguriexterne afiseazafonttext afiseazagrid afiseazagrupculoare afiseazamakeup afiseazamediufonttext afiseazapaleta afiseazarama afiseazasetari afiseazasetsimboluri afiseazastruts afiseazatiparire aliniat aliniatcentru aliniatdreapta aliniatstanga appendix ascundeblocuri barainteractiune barasincronizare blanc but butoaneinteractiune buton camp campumplere cap chapter chem citat clip cloneazacamp coloana comment comparagrupculoare comparapaleta completecombinedlist completelistoffloats completelistofsorts completelistofsynonyms completeregister convertestenumar copiazacamp corecteazaspatiualb coupledregister crlf culoare culoaregri cupleazadocument cupleazamarcaje cupleazaregistru cuvantdreapta data datacurenta datareferit decupleazamarcaje definebodyfontDEF definebodyfontREF definedfont definefontfeature definefonthandling defineste definestealiat definesteantet definesteblanc definestebloc definesteblocsectiune definestebuffer definestecamp definesteconversie definesteculoare definestedescriere definestedimensiunehartie definesteenumerare definesteeticheta definestefloat definestefont definestefonttext definesteformatreferinte definestegrupculori definesteinconjurare definestelista definestelistacombinata definestelistareferinte definestelogo definestemakeup definestemarcaje definestemediulfonttext definestemeniuinteractiune definestemeniuinteractiune definesteoutput definesteoverlay definestepaleta definesteparagraf definesteprofil definesteprogram definestereferinte definesteregistru definestesablontabel definestesectiune definestesimbol definestesimbolfigura definestesinonim definestesinonimfont definestesortare definestestartstop definestestivacampuri definestesubcamp definestetabulatori definestetext definestetexteinconjurate definestetextinconjurat definestetyping definesteversiune definetype definetypeface description despre determinacaracteristicilelistei determinanumartitlu dezactiveazameniuinteractiune din dute dutebox ecran el element element emptylines enumeration etichete faraaliniat farafisiere faraliniiantetsisubsol faraliniisussijos faralista faramarcaje faraspatiu faraspatiualb figuraexterna firdepar folosesteURL folosestebloc folosestecodificarea folosestecomenzi folosestedocumentextern folosestefiguraexterna folosestefisiereexterne folosestefisierextern folosestemodul folosestemuzicaexterna folosestereferinte folosestesimboluri folosestespeciale footnotetext forteazablocuri fractie framed framedtext fundal gatablocuri grid hartiedubla hl impachetat impartefloat in inalt inaltamargine indentation indreapta inframed ininner injos inlinie inouter instalarelimba instanga intins jos jossus la labeling lapagina limba limbaprincipala liniemargine linieneagra liniesubtire linieumplere liniinegre liniisubtiri listsymbol litera litere loadsorts loadsynonyms logcampuri luna mapfontsize mar marcaje marcheazaversiune marginal matematica mediaeval minicitat mutapegrid name nextsection nocap nop nota notasubsol numartitlu numartitlucurent numere numereromane olinie overbar overbars overstrike overstrikes pagina paginadubla paragraph part pastreazablocuri placefloat placelistoffloats placelistofsorts placelistofsynonyms placereferencelist plaseazapegrid plaseazasemnecarte potrivestecamp pozitie proceseazabloc proceseazapagina program publicatie puncte punedeasuprafiecareia punefatainfata puneformula punelegenda punelista punelistacombinata punelistacombinata punelogouri punenotesubsol punenotesubsollocale puneregistru puneregistru punesubformula ran ref referinta referintapagina referintatext referit reflexie register reservefloat reset reseteazamarcaje resettextcontent riglatext rigleumplere roteste saripesteblocuri scala scriebuffer scrieinlista scrieinlistareferinte scrieinregistru scrieintreliste section seeregister selecteazablocuri selecteazahartie selecteazaversiune semncarte setarebarasincronizare setarelimba setareoutput setarepozitie setaresincronizare seteazaaliniat seteazaaliniate seteazaalinierea seteazaantet seteazaaranjareapag seteazaaspect seteazabarainteractiune seteazablanc seteazabloc seteazablocsectiune seteazablocurimarginale seteazabuffer seteazabutoane seteazacamp seteazacampuri seteazaclipping seteazacoloane seteazacombinari seteazacomentariu seteazaculoare seteazaculori seteazadefinireanotasubsol seteazadescriere seteazadimensiunihartie seteazaecrane seteazaecraninteractiune seteazaelemente seteazaenumerare seteazafiguriexterne seteazafloat seteazafloats seteazafonttext seteazaformulare seteazaformule seteazafundal seteazafundaluri seteazagrosimelinie seteazaimpartireafloat seteazainconjurat seteazaingust seteazainteractiunea seteazajos seteazalegenda seteazalegenda seteazalegendele seteazaliniesilabe seteazaliniesubtire seteazalinii seteazaliniimargine seteazaliniinegre seteazaliniiumplere seteazalista seteazalistacombinata seteazalistareferinte seteazamajuscule seteazamakeup seteazamarcaje seteazamarginal seteazamediulfonttext seteazameniuinteractiune seteazaminicitat seteazanotasubsol seteazanumarpagina seteazanumarsubpagina seteazanumartitlu seteazanumerotare seteazanumerotarelinii seteazanumerotarepagina seteazanumerotareparagrafe seteazapaleta seteazaparagrafe seteazaplasareaopozita seteazaprofile seteazaprograme seteazapublicatii seteazareferinte seteazaregistru seteazarigletext seteazarigleumplere seteazarotare seteazasectiune seteazasimbol seteazasinonime seteazasistem seteazasortare seteazaspatiu seteazaspatiualb seteazaspatiuinterliniar seteazastrut seteazasublinie seteazasubsol seteazasus seteazatab seteazatabele seteazatabulatori seteazatext seteazatexteantet seteazatextejos seteazatextesubsol seteazatextesus seteazatextetext seteazatexteticheta seteazatexttitlu seteazatitlu seteazatitluri seteazatoleranta seteazatranzitiepagina seteazatype seteazatyping seteazaurl seteazaversiuni settextcontent setupfonthandling setupfontsynonym setupinterlinespace2 setupitemgroup setuplistalternative setuppaper sim simbol sincronizeaza sort spatiifixate spatiu spatiualb startalignment startbuffer startbuffer startcitat startcolumns startcombination startcomment startcomponenta startculoare startdescription startdocument startenumeration startfact startfigure startfloattext startformula startframedtext startfundal starthiding startimpachetat startitemgroup startlegend startline startlinecorrection startlinenumbering startlines startliniemargine startlocal startlocalenvironment startlocalfootnotes startmakeup startmarginblock startmediu startmeniuinteractiune startnamemakeup startnarrower startopposite startoverlay startoverview startparagraph startpositioning startpostponing startprodus startprofile startproiect startregister startriglatext startsymbolset startsynchronization starttable starttables starttabulate starttyping startunpacked startversiune stivacampuri stopalignment stopbuffer stopbuffer stopcitat stopcolumns stopcombination stopcomment stopcomponenta stopculoare stopdescription stopdocument stopenumeration stopfact stopfigure stopfloattext stopformula stopframedtext stopfundal stophiding stopimpachetat stopitemgroup stoplegend stopline stoplinecorrection stoplinenumbering stoplines stopliniemargine stoplocal stoplocalenvironment stoplocalfootnotes stopmakeup stopmarginblock stopmediu stopmeniuinteractiune stopnamemakeup stopnarrower stopopposite stopoverlay stopoverview stopparagraph stoppositioning stoppostponing stopprodus stopprofile stopproiect stopriglatext stopsymbolset stopsynchronization stoptable stoptables stoptabulate stoptyping stopunpacked stopversiune sub subject subsection subsubject subsubsection subsubsubject synonym tab tex texteticheta textmarginal texttitlu textumplere tippagina title titlu tooltip traduce trecilafonttext typ type typefile underbar underbars undeva urmeazaprofil urmeazaversiune urmeazaversiuneprofil usedirectory usetypescript usetypescriptfile versiune vl zidinsaptamana \ No newline at end of file
diff --git a/Master/texmf-dist/context/data/scite/context.properties b/Master/texmf-dist/context/data/scite/context.properties
index 13fa079c02e..006cfe64071 100644
--- a/Master/texmf-dist/context/data/scite/context.properties
+++ b/Master/texmf-dist/context/data/scite/context.properties
@@ -39,7 +39,7 @@ textwrapper.length=68
file.patterns.tex=
file.patterns.latex=
-file.patterns.context=*.tex;*.tui;*.tuo;*.sty;*.mkii;*.mkiv;
+file.patterns.context=*.tex;*.tui;*.tuo;*.sty;*.mkii;*.mkiv;*.mkvi;
# ConTeXt : keywords (if not yet loaded already)
diff --git a/Master/texmf-dist/context/data/textpad/textpad-context-template.txt b/Master/texmf-dist/context/data/textpad/textpad-context-template.txt
new file mode 100644
index 00000000000..48d0b86f9e0
--- /dev/null
+++ b/Master/texmf-dist/context/data/textpad/textpad-context-template.txt
@@ -0,0 +1,54 @@
+; TextPad syntax definitions for ConTeXt (and LaTeX, respectively)
+
+LaTeX=1
+
+[Syntax]
+Namespace1=6
+IgnoreCase=No
+InitKeyWordChars=\abcdefghijklmopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ
+KeyWordChars=A-Za-z0-9@*'`!
+BracketChars={}[]()
+OperatorChars=-+*/<>!~%^&|=
+PreprocStart=
+SyntaxStart=
+SyntaxEnd=
+CommentStart=
+CommentEnd=
+CommentStartAlt=$
+CommentEndAlt=$
+SingleComment=%
+SingleCommentCol=
+SingleCommentAlt=
+SingleCommentColAlt=
+SingleCommentEsc=\
+StringStart=
+StringEnd=
+StringAlt=
+StringEsc=
+CharStart=
+CharEnd=
+CharEsc=
+
+[Keywords 1]
+; category: tex commands
+; filename: tex-commands.txt
+
+[Keywords 2]
+; category: context commands
+; filename: context-commands-en.txt
+
+[Keywords 3]
+; category: context commands
+; filename: context-environments-en.txt
+
+[Keywords 4]
+; category: latex commands
+; filename: latex-commands-1.txt
+
+[Keywords 5]
+; category: latex commands
+; filename: latex-commands-2.txt
+
+[Keywords 6]
+; category: latex commands
+; filename: latex-commands-3.txt
diff --git a/Master/texmf-dist/fonts/afm/jmn/hans/hans-sh.afm b/Master/texmf-dist/fonts/afm/jmn/hans/hans-sh.afm
index c6ed33788e5..f6d899922b8 100644
--- a/Master/texmf-dist/fonts/afm/jmn/hans/hans-sh.afm
+++ b/Master/texmf-dist/fonts/afm/jmn/hans/hans-sh.afm
@@ -1,188 +1,164 @@
StartFontMetrics 2.0
Generated by MetaType1 (a MetaPost-based engine)
-Comment Creation Date: 20.08.2004
+Comment Creation Date: 19.08.2004
Notice Design by Janusz M. Nowacki, 2004.
-FontName Hans-SH-Regular
-FullName Hans-SH-Regular
-FamilyName Hans-SH
+FontName Hans-sh-Regular
+FullName Hans-sh-Regular
+FamilyName Hans-sh
Weight Normal
ItalicAngle 0
IsFixedPitch false
UnderlinePosition -200
UnderlineThickness 40
-Version 1.000
+Version 1.0
EncodingScheme FontSpecific
-FontBBox -2 -459 1405 939
-CapHeight 502
-XHeight 410
-Descender 70
-Ascender 535
+FontBBox 0 -469 1420 939
+CapHeight 700
+XHeight 500
+Descender -200
+Ascender 700
Comment TFM designsize: 10 (in points)
Comment TFM fontdimen 1: 0 (slant)
Comment TFM fontdimen 2: 3.33 (space)
Comment TFM fontdimen 3: 1.67 (space stretch)
Comment TFM fontdimen 4: 1.11 (space shrink)
-Comment TFM fontdimen 5: 4.1 (xheight)
+Comment TFM fontdimen 5: 5 (xheight)
Comment TFM fontdimen 6: 10 (quad)
Comment TFM fontdimen 7: 1.11 (extra space)
Comment TFM fontdimen 8: 0.4 (math rule)
Comment TFM fontdimen 22: 2.5 (math axis)
Comment TFM headerbyte 9: FontSpecific
-Comment TFM headerbyte 49: Hans-SH
+Comment TFM headerbyte 49: Hans-sh
Comment TFM headerbyte 72: 234
-StartCharMetrics 153
+StartCharMetrics 129
C 32 ; WX 333 ; N space ; B 0 0 0 0 ;
-C 64 ; WX 580 ; N at ; B 25 -35 575 515 ;
-C 65 ; WX 620 ; N A ; B 25 -55 615 535 ; L A AA ; L at A.alt ;
-C 66 ; WX 620 ; N B ; B 25 -55 615 535 ; L B BB ; L at B.alt ;
-C 67 ; WX 620 ; N C ; B 25 -55 615 535 ; L C CC ; L at C.alt ;
-C 68 ; WX 620 ; N D ; B 25 -55 615 535 ; L D DD ; L at D.alt ;
-C 69 ; WX 645 ; N E ; B 7 -76 640 556 ; L E EE ; L at E.alt ;
-C 70 ; WX 645 ; N F ; B 25 -76 658 556 ; L F FF ; L at F.alt ;
-C 71 ; WX 645 ; N G ; B 7 -76 640 556 ; L G GG ; L at G.alt ;
-C 72 ; WX 645 ; N H ; B 25 -76 658 556 ; L H HH ; L at H.alt ;
-C 73 ; WX 652 ; N I ; B -2 -56 651 536 ; L I II ; L at I.alt ;
-C 74 ; WX 652 ; N J ; B 20 -56 637 536 ; L J JJ ; L at J.alt ;
-C 75 ; WX 652 ; N K ; B -2 -56 651 536 ; L K KK ; L at K.alt ;
-C 76 ; WX 652 ; N L ; B 20 -56 637 536 ; L L LL ; L at L.alt ;
-C 77 ; WX 370 ; N M ; B 25 70 365 410 ; L M MM ;
-C 78 ; WX 370 ; N N ; B 25 70 365 410 ; L N NN ;
-C 79 ; WX 370 ; N O ; B 25 70 365 410 ; L O OO ;
-C 80 ; WX 370 ; N P ; B 25 70 365 410 ; L P PP ;
-C 81 ; WX 370 ; N Q ; B 25 70 365 410 ; L Q QQ ;
-C 82 ; WX 370 ; N R ; B 25 70 365 410 ; L R RR ;
-C 83 ; WX 370 ; N S ; B 25 70 365 410 ; L S SS ;
-C 84 ; WX 358 ; N T ; B 18 69 360 411 ; L T TT ;
-C 85 ; WX 370 ; N U ; B 25 70 365 410 ; L U UU ;
-C 86 ; WX 370 ; N V ; B 25 70 365 410 ; L V VV ;
-C 87 ; WX 474 ; N W ; B 24 17 470 463 ; L W WW ;
-C 88 ; WX 474 ; N X ; B 24 17 470 463 ; L X XX ;
-C 89 ; WX 490 ; N Y ; B 18 3 492 477 ; L Y YY ;
-C 90 ; WX 490 ; N Z ; B 18 3 492 477 ; L Z ZZ ;
-C 97 ; WX 620 ; N a ; B 25 -55 615 535 ; L a aa ;
-C 98 ; WX 620 ; N b ; B 25 -55 615 535 ; L b bb ;
-C 99 ; WX 620 ; N c ; B 25 -55 615 535 ; L c cc ;
-C 100 ; WX 620 ; N d ; B 25 -55 615 535 ; L d dd ;
-C 101 ; WX 645 ; N e ; B 16 -67 649 565 ; L e ee ;
-C 102 ; WX 645 ; N f ; B 16 -85 649 547 ; L f ff ;
-C 103 ; WX 645 ; N g ; B 16 -67 649 565 ; L g gg ;
-C 104 ; WX 645 ; N h ; B 16 -85 649 547 ; L h hh ;
-C 105 ; WX 614 ; N i ; B 21 -76 613 578 ; L i ii ;
-C 106 ; WX 614 ; N j ; B 21 -98 607 556 ; L j jj ;
-C 107 ; WX 614 ; N k ; B 21 -76 613 578 ; L k kk ;
-C 108 ; WX 614 ; N l ; B 21 -98 607 556 ; L l ll ;
-C 109 ; WX 370 ; N m ; B 25 70 365 410 ; L m mm ;
-C 110 ; WX 370 ; N n ; B 25 70 365 410 ; L n nn ;
-C 111 ; WX 370 ; N o ; B 25 70 365 410 ; L o oo ;
-C 112 ; WX 370 ; N p ; B 25 70 365 410 ; L p pp ;
-C 113 ; WX 745 ; N q ; B 25 -55 740 535 ;
-C 114 ; WX 745 ; N r ; B 25 -55 740 535 ;
-C 115 ; WX 745 ; N s ; B 25 -55 740 535 ;
-C 116 ; WX 745 ; N t ; B 25 -55 740 535 ;
-C 117 ; WX 745 ; N u ; B 25 -76 740 556 ;
-C 118 ; WX 745 ; N v ; B 25 -76 740 556 ;
-C 119 ; WX 745 ; N w ; B 25 -76 740 556 ;
-C 120 ; WX 745 ; N x ; B 25 -76 740 556 ; L x xx ;
-C 121 ; WX 741 ; N y ; B 25 -56 740 536 ;
-C 122 ; WX 741 ; N z ; B 20 -56 736 536 ; L z zz ;
-C 128 ; WX 995 ; N AA ; B 25 -55 990 535 ; L A AAA ;
-C 129 ; WX 1367 ; N AAA ; B 25 -55 1362 535 ;
-C 130 ; WX 995 ; N BB ; B 25 -55 990 535 ; L B BBB ;
-C 131 ; WX 1367 ; N BBB ; B 25 -55 1362 535 ;
-C 132 ; WX 995 ; N CC ; B 25 -55 990 535 ; L C CCC ;
-C 133 ; WX 1367 ; N CCC ; B 25 -55 1362 535 ;
-C 134 ; WX 995 ; N DD ; B 25 -55 990 535 ; L D DDD ;
-C 135 ; WX 1367 ; N DDD ; B 25 -55 1362 535 ;
-C 136 ; WX 1020 ; N EE ; B 7 -76 1015 556 ; L E EEE ;
-C 137 ; WX 1391 ; N EEE ; B 7 -76 1387 556 ;
-C 138 ; WX 1020 ; N FF ; B 25 -76 1033 556 ; L F FFF ;
-C 139 ; WX 1391 ; N FFF ; B 25 -76 1405 556 ;
-C 140 ; WX 1020 ; N GG ; B 7 -76 1015 556 ; L G GGG ;
-C 141 ; WX 1391 ; N GGG ; B 7 -76 1387 556 ;
-C 142 ; WX 1020 ; N HH ; B 25 -76 1033 556 ; L H HHH ;
-C 143 ; WX 1391 ; N HHH ; B 25 -76 1405 556 ;
-C 144 ; WX 985 ; N II ; B -2 -56 986 536 ; L I III ;
-C 145 ; WX 1319 ; N III ; B -2 -56 1319 536 ;
-C 146 ; WX 985 ; N JJ ; B 20 -56 971 536 ; L J JJJ ;
-C 147 ; WX 1319 ; N JJJ ; B 20 -56 1304 536 ;
-C 148 ; WX 985 ; N KK ; B -2 -56 986 536 ; L K KKK ;
-C 149 ; WX 1319 ; N KKK ; B -2 -56 1319 536 ;
-C 150 ; WX 985 ; N LL ; B 20 -56 971 536 ; L L LLL ;
-C 151 ; WX 1319 ; N LLL ; B 20 -56 1304 536 ;
-C 152 ; WX 620 ; N MM ; B 25 -55 615 535 ; L M MMM ;
-C 153 ; WX 870 ; N MMM ; B 25 -180 865 660 ;
-C 154 ; WX 620 ; N NN ; B 25 -55 615 535 ; L N NNN ;
-C 155 ; WX 870 ; N NNN ; B 25 -180 865 660 ;
-C 156 ; WX 620 ; N OO ; B 25 -55 615 535 ; L O OOO ;
-C 157 ; WX 870 ; N OOO ; B 25 -180 865 660 ;
-C 158 ; WX 620 ; N PP ; B 25 -55 615 535 ; L P PPP ;
-C 159 ; WX 870 ; N PPP ; B 25 -180 865 660 ;
-C 160 ; WX 620 ; N QQ ; B 25 -55 615 535 ; L Q QQQ ;
-C 161 ; WX 870 ; N QQQ ; B 25 -180 865 660 ;
-C 162 ; WX 620 ; N RR ; B 25 -55 615 535 ; L R RRR ;
-C 163 ; WX 870 ; N RRR ; B 25 -180 865 660 ;
-C 164 ; WX 620 ; N SS ; B 25 -55 615 535 ; L S SSS ;
-C 165 ; WX 870 ; N SSS ; B 25 -180 865 660 ;
-C 166 ; WX 608 ; N TT ; B 18 -56 610 536 ; L T TTT ;
-C 167 ; WX 858 ; N TTT ; B 18 -181 860 661 ;
-C 168 ; WX 620 ; N UU ; B 25 -55 615 535 ; L U UUU ;
-C 169 ; WX 870 ; N UUU ; B 25 -180 865 660 ;
-C 170 ; WX 620 ; N VV ; B 25 -55 615 535 ; L V VVV ;
-C 171 ; WX 870 ; N VVV ; B 25 -180 865 660 ;
-C 172 ; WX 827 ; N WW ; B 24 -160 824 640 ; L W WWW ;
-C 173 ; WX 1181 ; N WWW ; B 24 -336 1176 816 ;
-C 174 ; WX 827 ; N XX ; B 24 -160 824 640 ; L X XXX ;
-C 175 ; WX 1181 ; N XXX ; B 24 -336 1176 816 ;
-C 176 ; WX 844 ; N YY ; B 18 -174 846 654 ; L Y YYY ;
-C 177 ; WX 1197 ; N YYY ; B 18 -351 1200 831 ;
-C 178 ; WX 844 ; N ZZ ; B 18 -174 846 654 ; L Z ZZZ ;
-C 179 ; WX 1197 ; N ZZZ ; B 18 -351 1200 831 ;
-C 180 ; WX 620 ; N aa ; B 26 -242 616 723 ; L a aaa ;
-C 181 ; WX 620 ; N aaa ; B 25 -428 615 908 ;
-C 182 ; WX 620 ; N bb ; B 26 -242 616 723 ; L b bbb ;
-C 183 ; WX 620 ; N bbb ; B 25 -428 615 908 ;
-C 184 ; WX 620 ; N cc ; B 26 -242 616 723 ; L c ccc ;
-C 185 ; WX 620 ; N ccc ; B 25 -428 615 908 ;
-C 186 ; WX 620 ; N dd ; B 26 -242 616 723 ; L d ddd ;
-C 187 ; WX 620 ; N ddd ; B 25 -428 615 908 ;
-C 188 ; WX 645 ; N ee ; B 16 -255 649 753 ; L e eee ;
-C 189 ; WX 645 ; N eee ; B 16 -441 648 939 ;
-C 190 ; WX 645 ; N ff ; B 16 -273 649 735 ; L f fff ;
-C 191 ; WX 645 ; N fff ; B 16 -459 648 921 ;
-C 192 ; WX 645 ; N gg ; B 16 -255 649 753 ; L g ggg ;
-C 193 ; WX 645 ; N ggg ; B 16 -441 648 939 ;
-C 194 ; WX 645 ; N hh ; B 16 -273 649 735 ; L h hhh ;
-C 195 ; WX 645 ; N hhh ; B 16 -459 648 921 ;
-C 196 ; WX 614 ; N ii ; B 21 -243 613 745 ; L i iii ;
-C 197 ; WX 614 ; N iii ; B 21 -408 614 911 ;
-C 198 ; WX 614 ; N jj ; B 21 -265 613 723 ; L j jjj ;
-C 199 ; WX 614 ; N jjj ; B 21 -431 614 888 ;
-C 200 ; WX 614 ; N kk ; B 21 -243 613 745 ; L k kkk ;
-C 201 ; WX 614 ; N kkk ; B 21 -408 614 911 ;
-C 202 ; WX 614 ; N ll ; B 21 -265 613 723 ; L l lll ;
-C 203 ; WX 614 ; N lll ; B 21 -431 614 888 ;
-C 204 ; WX 1120 ; N A.alt ; B 25 -55 1115 535 ;
-C 205 ; WX 1120 ; N B.alt ; B 25 -55 1115 535 ;
-C 206 ; WX 1120 ; N C.alt ; B 25 -55 1115 535 ;
-C 207 ; WX 1120 ; N D.alt ; B 25 -55 1115 535 ;
-C 208 ; WX 1145 ; N E.alt ; B 7 -76 1140 556 ;
-C 209 ; WX 1145 ; N F.alt ; B 25 -76 1158 556 ;
-C 210 ; WX 1145 ; N G.alt ; B 7 -76 1140 556 ;
-C 211 ; WX 1145 ; N H.alt ; B 25 -76 1158 556 ;
-C 212 ; WX 1156 ; N I.alt ; B -2 -57 1151 537 ;
-C 213 ; WX 1156 ; N J.alt ; B 25 -57 1141 537 ;
-C 214 ; WX 1156 ; N K.alt ; B -2 -57 1151 537 ;
-C 215 ; WX 1156 ; N L.alt ; B 25 -57 1141 537 ;
-C 216 ; WX 741 ; N xx ; B 25 -56 740 536 ;
-C 217 ; WX 741 ; N zz ; B 20 -56 736 536 ;
-C 218 ; WX 620 ; N mm ; B 25 -55 615 535 ; L m mmm ;
-C 219 ; WX 870 ; N mmm ; B 25 -180 865 660 ;
-C 220 ; WX 620 ; N nn ; B 25 -55 615 535 ; L n nnn ;
-C 221 ; WX 870 ; N nnn ; B 25 -180 865 660 ;
-C 222 ; WX 620 ; N oo ; B 25 -55 615 535 ; L o ooo ;
-C 223 ; WX 870 ; N ooo ; B 25 -180 865 660 ;
-C 224 ; WX 620 ; N pp ; B 25 -55 615 535 ; L p ppp ;
-C 225 ; WX 870 ; N ppp ; B 25 -180 865 660 ;
+C 64 ; WX 580 ; N at ; B 40 0 540 500 ;
+C 65 ; WX 660 ; N A ; B 30 -65 630 535 ; L A AA ; L at A.alt ;
+C 66 ; WX 660 ; N B ; B 30 -65 630 535 ; L B BB ; L at B.alt ;
+C 67 ; WX 660 ; N C ; B 30 -65 630 535 ; L C CC ; L at C.alt ;
+C 68 ; WX 660 ; N D ; B 30 -65 630 535 ; L D DD ; L at D.alt ;
+C 69 ; WX 703 ; N E ; B 30 -86 673 556 ; L E EE ; L at E.alt ;
+C 70 ; WX 703 ; N F ; B 30 -86 673 556 ; L F FF ; L at F.alt ;
+C 71 ; WX 703 ; N G ; B 30 -86 673 556 ; L G GG ; L at G.alt ;
+C 72 ; WX 703 ; N H ; B 30 -86 673 556 ; L H HH ; L at H.alt ;
+C 73 ; WX 723 ; N I ; B 30 -66 693 536 ; L I II ; L at I.alt ;
+C 74 ; WX 687 ; N J ; B 30 -66 657 536 ; L J JJ ; L at J.alt ;
+C 75 ; WX 723 ; N K ; B 30 -66 693 536 ; L K KK ; L at K.alt ;
+C 76 ; WX 687 ; N L ; B 30 -66 657 536 ; L L LL ; L at L.alt ;
+C 77 ; WX 410 ; N M ; B 30 60 380 410 ; L M MM ;
+C 78 ; WX 410 ; N N ; B 30 60 380 410 ; L N NN ;
+C 79 ; WX 410 ; N O ; B 30 60 380 410 ; L O OO ;
+C 80 ; WX 410 ; N P ; B 30 60 380 410 ; L P PP ;
+C 81 ; WX 410 ; N Q ; B 30 60 380 410 ; L Q QQ ;
+C 82 ; WX 410 ; N R ; B 30 60 380 410 ; L R RR ;
+C 83 ; WX 410 ; N S ; B 30 60 380 410 ; L S SS ;
+C 84 ; WX 412 ; N T ; B 30 59 382 411 ; L T TT ;
+C 85 ; WX 410 ; N U ; B 30 60 380 410 ; L U UU ;
+C 86 ; WX 410 ; N V ; B 30 60 380 410 ; L V VV ;
+C 87 ; WX 515 ; N W ; B 30 7 486 463 ; L W WW ;
+C 88 ; WX 515 ; N X ; B 30 7 486 463 ; L X XX ;
+C 89 ; WX 544 ; N Y ; B 30 -7 514 477 ; L Y YY ;
+C 90 ; WX 544 ; N Z ; B 30 -7 514 477 ; L Z ZZ ;
+C 97 ; WX 660 ; N a ; B 30 -65 630 535 ; L a aa ;
+C 98 ; WX 660 ; N b ; B 30 -65 630 535 ; L b bb ;
+C 99 ; WX 660 ; N c ; B 30 -65 630 535 ; L c cc ;
+C 100 ; WX 660 ; N d ; B 30 -65 630 535 ; L d dd ;
+C 101 ; WX 703 ; N e ; B 30 -77 673 565 ; L e ee ;
+C 102 ; WX 703 ; N f ; B 30 -95 673 547 ; L f ff ;
+C 103 ; WX 703 ; N g ; B 30 -77 673 565 ; L g gg ;
+C 104 ; WX 703 ; N h ; B 30 -95 673 547 ; L h hh ;
+C 105 ; WX 662 ; N i ; B 30 -86 632 578 ; L i ii ;
+C 106 ; WX 656 ; N j ; B 30 -108 626 556 ; L j jj ;
+C 107 ; WX 662 ; N k ; B 30 -86 632 578 ; L k kk ;
+C 108 ; WX 656 ; N l ; B 30 -108 626 556 ; L l ll ;
+C 128 ; WX 1035 ; N AA ; B 30 -65 1005 535 ; L A AAA ;
+C 129 ; WX 1407 ; N AAA ; B 30 -65 1377 535 ;
+C 130 ; WX 1035 ; N BB ; B 30 -65 1005 535 ; L B BBB ;
+C 131 ; WX 1407 ; N BBB ; B 30 -65 1377 535 ;
+C 132 ; WX 1035 ; N CC ; B 30 -65 1005 535 ; L C CCC ;
+C 133 ; WX 1407 ; N CCC ; B 30 -65 1377 535 ;
+C 134 ; WX 1035 ; N DD ; B 30 -65 1005 535 ; L D DDD ;
+C 135 ; WX 1407 ; N DDD ; B 30 -65 1377 535 ;
+C 136 ; WX 1078 ; N EE ; B 30 -86 1048 556 ; L E EEE ;
+C 137 ; WX 1450 ; N EEE ; B 30 -86 1420 556 ;
+C 138 ; WX 1078 ; N FF ; B 30 -86 1048 556 ; L F FFF ;
+C 139 ; WX 1450 ; N FFF ; B 30 -86 1420 556 ;
+C 140 ; WX 1078 ; N GG ; B 30 -86 1048 556 ; L G GGG ;
+C 141 ; WX 1450 ; N GGG ; B 30 -86 1420 556 ;
+C 142 ; WX 1078 ; N HH ; B 30 -86 1048 556 ; L H HHH ;
+C 143 ; WX 1450 ; N HHH ; B 30 -86 1420 556 ;
+C 144 ; WX 1058 ; N II ; B 30 -66 1028 536 ; L I III ;
+C 145 ; WX 1391 ; N III ; B 30 -66 1361 536 ;
+C 146 ; WX 1021 ; N JJ ; B 30 -66 991 536 ; L J JJJ ;
+C 147 ; WX 1354 ; N JJJ ; B 30 -66 1324 536 ;
+C 148 ; WX 1058 ; N KK ; B 30 -66 1028 536 ; L K KKK ;
+C 149 ; WX 1391 ; N KKK ; B 30 -66 1361 536 ;
+C 150 ; WX 1021 ; N LL ; B 30 -66 991 536 ; L L LLL ;
+C 151 ; WX 1354 ; N LLL ; B 30 -66 1324 536 ;
+C 152 ; WX 660 ; N MM ; B 30 -65 630 535 ; L M MMM ;
+C 153 ; WX 910 ; N MMM ; B 30 -190 880 660 ;
+C 154 ; WX 660 ; N NN ; B 30 -65 630 535 ; L N NNN ;
+C 155 ; WX 910 ; N NNN ; B 30 -190 880 660 ;
+C 156 ; WX 660 ; N OO ; B 30 -65 630 535 ; L O OOO ;
+C 157 ; WX 910 ; N OOO ; B 30 -190 880 660 ;
+C 158 ; WX 660 ; N PP ; B 30 -65 630 535 ; L P PPP ;
+C 159 ; WX 910 ; N PPP ; B 30 -190 880 660 ;
+C 160 ; WX 660 ; N QQ ; B 30 -65 630 535 ; L Q QQQ ;
+C 161 ; WX 910 ; N QQQ ; B 30 -190 880 660 ;
+C 162 ; WX 660 ; N RR ; B 30 -65 630 535 ; L R RRR ;
+C 163 ; WX 910 ; N RRR ; B 30 -190 880 660 ;
+C 164 ; WX 660 ; N SS ; B 30 -65 630 535 ; L S SSS ;
+C 165 ; WX 910 ; N SSS ; B 30 -190 880 660 ;
+C 166 ; WX 662 ; N TT ; B 30 -66 632 536 ; L T TTT ;
+C 167 ; WX 912 ; N TTT ; B 30 -191 882 661 ;
+C 168 ; WX 660 ; N UU ; B 30 -65 630 535 ; L U UUU ;
+C 169 ; WX 910 ; N UUU ; B 30 -190 880 660 ;
+C 170 ; WX 660 ; N VV ; B 30 -65 630 535 ; L V VVV ;
+C 171 ; WX 910 ; N VVV ; B 30 -190 880 660 ;
+C 172 ; WX 869 ; N WW ; B 30 -170 840 640 ; L W WWW ;
+C 173 ; WX 1221 ; N WWW ; B 30 -346 1192 816 ;
+C 174 ; WX 869 ; N XX ; B 30 -170 840 640 ; L X XXX ;
+C 175 ; WX 1221 ; N XXX ; B 30 -346 1192 816 ;
+C 176 ; WX 898 ; N YY ; B 30 -184 868 654 ; L Y YYY ;
+C 177 ; WX 1252 ; N YYY ; B 30 -361 1222 831 ;
+C 178 ; WX 898 ; N ZZ ; B 30 -184 868 654 ; L Z ZZZ ;
+C 179 ; WX 1252 ; N ZZZ ; B 30 -361 1222 831 ;
+C 180 ; WX 660 ; N aa ; B 30 -252 630 723 ; L a aaa ;
+C 181 ; WX 660 ; N aaa ; B 30 -438 630 908 ;
+C 182 ; WX 660 ; N bb ; B 30 -252 630 723 ; L b bbb ;
+C 183 ; WX 660 ; N bbb ; B 30 -438 630 908 ;
+C 184 ; WX 660 ; N cc ; B 30 -252 630 723 ; L c ccc ;
+C 185 ; WX 660 ; N ccc ; B 30 -438 630 908 ;
+C 186 ; WX 660 ; N dd ; B 30 -252 630 723 ; L d ddd ;
+C 187 ; WX 660 ; N ddd ; B 30 -438 630 908 ;
+C 188 ; WX 703 ; N ee ; B 30 -265 673 753 ; L e eee ;
+C 189 ; WX 702 ; N eee ; B 30 -451 672 939 ;
+C 190 ; WX 703 ; N ff ; B 30 -283 673 735 ; L f fff ;
+C 191 ; WX 702 ; N fff ; B 30 -469 672 921 ;
+C 192 ; WX 703 ; N gg ; B 30 -265 673 753 ; L g ggg ;
+C 193 ; WX 702 ; N ggg ; B 30 -451 672 939 ;
+C 194 ; WX 703 ; N hh ; B 30 -283 673 735 ; L h hhh ;
+C 195 ; WX 702 ; N hhh ; B 30 -469 672 921 ;
+C 196 ; WX 662 ; N ii ; B 30 -253 632 745 ; L i iii ;
+C 197 ; WX 663 ; N iii ; B 30 -418 633 911 ;
+C 198 ; WX 662 ; N jj ; B 30 -275 632 723 ; L j jjj ;
+C 199 ; WX 663 ; N jjj ; B 30 -441 633 888 ;
+C 200 ; WX 662 ; N kk ; B 30 -253 632 745 ; L k kkk ;
+C 201 ; WX 663 ; N kkk ; B 30 -418 633 911 ;
+C 202 ; WX 662 ; N ll ; B 30 -275 632 723 ; L l lll ;
+C 203 ; WX 663 ; N lll ; B 30 -441 633 888 ;
+C 204 ; WX 1160 ; N A.alt ; B 30 -65 1130 535 ;
+C 205 ; WX 1160 ; N B.alt ; B 30 -65 1130 535 ;
+C 206 ; WX 1160 ; N C.alt ; B 30 -65 1130 535 ;
+C 207 ; WX 1160 ; N D.alt ; B 30 -65 1130 535 ;
+C 208 ; WX 1203 ; N E.alt ; B 30 -86 1173 556 ;
+C 209 ; WX 1203 ; N F.alt ; B 30 -86 1173 556 ;
+C 210 ; WX 1203 ; N G.alt ; B 30 -86 1173 556 ;
+C 211 ; WX 1203 ; N H.alt ; B 30 -86 1173 556 ;
+C 212 ; WX 1223 ; N I.alt ; B 30 -67 1193 537 ;
+C 213 ; WX 1186 ; N J.alt ; B 30 -67 1156 537 ;
+C 214 ; WX 1223 ; N K.alt ; B 30 -67 1193 537 ;
+C 215 ; WX 1186 ; N L.alt ; B 30 -67 1156 537 ;
C -1 ; WX 333 ; N nbspace ; B 0 0 0 0 ;
EndCharMetrics
EndFontMetrics
diff --git a/Master/texmf-dist/fonts/afm/jmn/hans/hans.afm b/Master/texmf-dist/fonts/afm/jmn/hans/hans.afm
index 480524f7e0e..6c599d6e418 100644
--- a/Master/texmf-dist/fonts/afm/jmn/hans/hans.afm
+++ b/Master/texmf-dist/fonts/afm/jmn/hans/hans.afm
@@ -1,6 +1,6 @@
StartFontMetrics 2.0
Generated by MetaType1 (a MetaPost-based engine)
-Comment Creation Date: 20.08.2004
+Comment Creation Date: 18.08.2004
Notice Design by Janusz M. Nowacki, 2004.
FontName Hans-Regular
FullName Hans-Regular
@@ -30,7 +30,7 @@ Comment TFM fontdimen 22: 2.5 (math axis)
Comment TFM headerbyte 9: FontSpecific
Comment TFM headerbyte 49: Hans
Comment TFM headerbyte 72: 234
-StartCharMetrics 153
+StartCharMetrics 129
C 32 ; WX 333 ; N space ; B 0 0 0 0 ;
C 64 ; WX 580 ; N at ; B 40 0 540 500 ;
C 65 ; WX 620 ; N A ; B 40 -20 580 520 ; L A AA ; L at A.alt ;
@@ -71,20 +71,6 @@ C 105 ; WX 614 ; N i ; B 40 -36 574 536 ; L i ii ;
C 106 ; WX 614 ; N j ; B 40 -36 574 536 ; L j jj ;
C 107 ; WX 614 ; N k ; B 40 -36 574 536 ; L k kk ;
C 108 ; WX 614 ; N l ; B 40 -36 574 536 ; L l ll ;
-C 109 ; WX 370 ; N m ; B 40 105 330 395 ; L m mm ;
-C 110 ; WX 370 ; N n ; B 40 105 330 395 ; L n nn ;
-C 111 ; WX 370 ; N o ; B 40 105 330 395 ; L o oo ;
-C 112 ; WX 370 ; N p ; B 40 105 330 395 ; L p pp ;
-C 113 ; WX 745 ; N q ; B 40 -20 705 520 ;
-C 114 ; WX 745 ; N r ; B 40 -20 705 520 ;
-C 115 ; WX 745 ; N s ; B 40 -20 705 520 ;
-C 116 ; WX 745 ; N t ; B 40 -20 705 520 ;
-C 117 ; WX 745 ; N u ; B 40 -32 705 532 ;
-C 118 ; WX 745 ; N v ; B 40 -32 705 532 ;
-C 119 ; WX 745 ; N w ; B 40 -32 705 532 ;
-C 120 ; WX 745 ; N x ; B 40 -32 705 532 ; L x xx ;
-C 121 ; WX 741 ; N y ; B 40 -20 701 520 ;
-C 122 ; WX 741 ; N z ; B 40 -20 701 520 ; L z zz ;
C 128 ; WX 995 ; N AA ; B 40 -20 955 520 ; L A AAA ;
C 129 ; WX 1367 ; N AAA ; B 40 -20 1327 520 ;
C 130 ; WX 995 ; N BB ; B 40 -20 955 520 ; L B BBB ;
@@ -173,16 +159,6 @@ C 212 ; WX 1156 ; N I.alt ; B 40 -17 1116 517 ;
C 213 ; WX 1156 ; N J.alt ; B 40 -17 1116 517 ;
C 214 ; WX 1156 ; N K.alt ; B 40 -17 1116 517 ;
C 215 ; WX 1156 ; N L.alt ; B 40 -17 1116 517 ;
-C 216 ; WX 741 ; N xx ; B 40 -20 701 520 ;
-C 217 ; WX 741 ; N zz ; B 40 -20 701 520 ;
-C 218 ; WX 620 ; N mm ; B 40 -20 580 520 ; L m mmm ;
-C 219 ; WX 870 ; N mmm ; B 40 -145 830 645 ;
-C 220 ; WX 620 ; N nn ; B 40 -20 580 520 ; L n nnn ;
-C 221 ; WX 870 ; N nnn ; B 40 -145 830 645 ;
-C 222 ; WX 620 ; N oo ; B 40 -20 580 520 ; L o ooo ;
-C 223 ; WX 870 ; N ooo ; B 40 -145 830 645 ;
-C 224 ; WX 620 ; N pp ; B 40 -20 580 520 ; L p ppp ;
-C 225 ; WX 870 ; N ppp ; B 40 -145 830 645 ;
C -1 ; WX 333 ; N nbspace ; B 0 0 0 0 ;
EndCharMetrics
EndFontMetrics
diff --git a/Master/texmf-dist/fonts/data/tests/texmfhome.otf b/Master/texmf-dist/fonts/data/tests/texmfhome.otf
new file mode 100644
index 00000000000..d0af1152ff4
--- /dev/null
+++ b/Master/texmf-dist/fonts/data/tests/texmfhome.otf
Binary files differ
diff --git a/Master/texmf-dist/fonts/enc/dvips/jmn/hans.enc b/Master/texmf-dist/fonts/enc/dvips/jmn/hans.enc
index 9139b437778..9c7b78a8665 100644
--- a/Master/texmf-dist/fonts/enc/dvips/jmn/hans.enc
+++ b/Master/texmf-dist/fonts/enc/dvips/jmn/hans.enc
@@ -109,19 +109,19 @@
/k
/l
/m
-/n
-/o
-/p
-/q
-/r
-/s
-/t
-/u
-/v
-/w
-/x
-/y
-/z
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
/.notdef
/.notdef
/.notdef
@@ -215,35 +215,35 @@
/J.alt
/K.alt
/L.alt
-/xx
-/zz
-/mm
-/mmm
-/nn
-/nnn
-/oo
-/ooo
-/pp
-/ppp
-/qq
-/qqq
-/rr
-/rrr
-/ss
-/sss
-/tt
-/ttt
/.notdef
/.notdef
/.notdef
/.notdef
/.notdef
/.notdef
-/xx
/.notdef
/.notdef
/.notdef
-/zz
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
+/.notdef
/.notdef
/.notdef
/.notdef
diff --git a/Master/texmf-dist/fonts/map/dvips/jmn/hans.map b/Master/texmf-dist/fonts/map/dvips/jmn/hans.map
index a60052d3994..8d283c0f664 100644
--- a/Master/texmf-dist/fonts/map/dvips/jmn/hans.map
+++ b/Master/texmf-dist/fonts/map/dvips/jmn/hans.map
@@ -1,2 +1,2 @@
hans Hans-Regular "enchans ReEncodeFont" <hans.enc <hans.pfb
-hans-sh Hans-SH-Regular "enchans ReEncodeFont" <hans.enc <hans-sh.pfb
+hans-sh Hans-sh-Regular "enchans ReEncodeFont" <hans.enc <hans-sh.pfb
diff --git a/Master/texmf-dist/fonts/tfm/jmn/hans/hans-sh.tfm b/Master/texmf-dist/fonts/tfm/jmn/hans/hans-sh.tfm
index c934bc16e9c..09c3a897435 100644
--- a/Master/texmf-dist/fonts/tfm/jmn/hans/hans-sh.tfm
+++ b/Master/texmf-dist/fonts/tfm/jmn/hans/hans-sh.tfm
Binary files differ
diff --git a/Master/texmf-dist/fonts/tfm/jmn/hans/hans.tfm b/Master/texmf-dist/fonts/tfm/jmn/hans/hans.tfm
index 62a383b9865..26002455cdd 100644
--- a/Master/texmf-dist/fonts/tfm/jmn/hans/hans.tfm
+++ b/Master/texmf-dist/fonts/tfm/jmn/hans/hans.tfm
Binary files differ
diff --git a/Master/texmf-dist/fonts/type1/jmn/hans/hans-sh.pfb b/Master/texmf-dist/fonts/type1/jmn/hans/hans-sh.pfb
index 683d61a3214..9c633d6d1d3 100644
--- a/Master/texmf-dist/fonts/type1/jmn/hans/hans-sh.pfb
+++ b/Master/texmf-dist/fonts/type1/jmn/hans/hans-sh.pfb
Binary files differ
diff --git a/Master/texmf-dist/fonts/type1/jmn/hans/hans.pfb b/Master/texmf-dist/fonts/type1/jmn/hans/hans.pfb
index ba92b559483..f516e46184a 100644
--- a/Master/texmf-dist/fonts/type1/jmn/hans/hans.pfb
+++ b/Master/texmf-dist/fonts/type1/jmn/hans/hans.pfb
Binary files differ
diff --git a/Master/texmf-dist/metapost/context/base/mp-base.mp b/Master/texmf-dist/metapost/context/base/mp-base.mp
index d0b3991c856..93cb5e90c8d 100644
--- a/Master/texmf-dist/metapost/context/base/mp-base.mp
+++ b/Master/texmf-dist/metapost/context/base/mp-base.mp
@@ -479,7 +479,7 @@ def label = draw thelabel enddef;
newinternal dotlabeldiam; dotlabeldiam:=3bp;
vardef dotlabel@#(expr s,z) text t_ =
label@#(s,z) t_;
- label@#(s,z);
+% label@#(s,z);
interim linecap:=rounded;
draw z withpen pencircle scaled dotlabeldiam t_;
enddef;
diff --git a/Master/texmf-dist/metapost/context/base/mp-core.mp b/Master/texmf-dist/metapost/context/base/mp-core.mp
index 7c5d5a1c1b1..2ccdad22c24 100644
--- a/Master/texmf-dist/metapost/context/base/mp-core.mp
+++ b/Master/texmf-dist/metapost/context/base/mp-core.mp
@@ -402,19 +402,22 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
set_par_line_height (ph, pd) ;
- numeric par_hang_indent, par_hang_after, par_indent, par_left_skip ;
+ numeric par_hang_indent, par_hang_after, par_indent, par_left_skip, par_right_skip ;
par_hang_indent := rh ;
par_hang_after := ra ;
par_indent := ri ;
par_left_skip := rl ;
+ par_right_skip := rr ;
pair par_start_pos ;
-
+ pair par_stop_pos ;
par_start_pos := llxy[fpos]
if par_indent <0: shifted (-par_indent, 0) fi
if par_left_skip<0: shifted (-par_left_skip,0) fi ;
+ par_stop_pos := lrxy[tpos]
+ if par_right_skip<0: shifted (par_right_skip,0) fi ; % nasty as the endpos can be shifted by rightskip
if wxy[wpos]>0 :
left_skip := rl + xpart llxy[wpos] - xpart llxy[ppos] ;
@@ -430,249 +433,247 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
numeric multi_par_pages ; multi_par_pages := nxy[tpos]-nxy[fpos]+1 ;
- vardef snapped_multi_pos (expr p) =
- if snap_multi_par_tops :
- if abs(ypart p - ypart ulcorner multipar) < par_line_height :
- (xpart p,ypart ulcorner multipar)
- else :
- p
- fi
+ % locals .. why can't i move these outside?
+
+vardef _pmp_set_multipar_ (expr i) =
+ ( (TextAreas[i] leftenlarged -left_skip) rightenlarged (-right_skip
+ if auto_multi_par_hsize : + rw - bbwidth(TextAreas[i]) fi) )
+enddef ;
+
+vardef _pmp_snapped_multi_pos_ (expr p) =
+ if snap_multi_par_tops :
+ if abs(ypart p - ypart ulcorner multipar) < par_line_height :
+ (xpart p,ypart ulcorner multipar)
else :
p
fi
- enddef ;
+ else :
+ p
+ fi
+enddef ;
- % def set_multipar (expr i) =
- % ((TextAreas[i] leftenlarged -left_skip) rightenlarged -right_skip)
- % enddef ;
+vardef _pmp_estimated_par_lines_ (expr h) =
+ round(h/par_line_height)
+enddef ;
- vardef set_multipar (expr i) =
- ( (TextAreas[i] leftenlarged -left_skip) rightenlarged (-right_skip
- if auto_multi_par_hsize : + rw - bbwidth(TextAreas[i]) fi) )
- enddef ;
+vardef _pmp_top_multi_par_(expr p) =
+ (round(_pmp_estimated_par_lines_(bbheight(p)*par_line_height))=round(bbheight(p)))
+enddef ;
- vardef top_multi_par(expr p) =
- (round(estimated_par_lines(bbheight(p)*par_line_height))=round(bbheight(p)))
- enddef ;
+vardef _pmp_multi_par_tsc_(expr p) =
+ if _pmp_top_multi_par_(p) : TopSkipCorrection else : 0 fi
+enddef ;
- vardef multi_par_tsc(expr p) =
- if top_multi_par(p) : TopSkipCorrection else : 0 fi
- enddef ;
+vardef _pmp_estimated_multi_par_height_ (expr n, t) =
+ if round(par_line_height)=0 :
+ 0
+ else :
+ save ok, h ; boolean ok ;
+ numeric h ; h := 0 ;
+ ok := false ;
+ if (nxy[fpos]=RealPageNumber-1) :
+ for i := 1 upto NOfSavedTextAreas :
+ if (InsideSavedTextArea(i,par_start_pos)) :
+ ok := true ;
+ h := h + _pmp_estimated_par_lines_(ypart ulxy[fpos] -
+ ypart llcorner SavedTextAreas[i]) ;
+ elseif ok :
+ h := h + _pmp_estimated_par_lines_(bbheight(SavedTextAreas[i])) ;
+ fi ;
+ endfor ;
+ fi ;
+ if ok :
+ for i := 1 upto n-1 :
+ h := h + _pmp_estimated_par_lines_(bbheight(TextAreas[i])) ;
+ endfor ;
+ else :
+ % already: ok := false ;
+ for i := 1 upto n-1 :
+ if (InsideTextArea(i,par_start_pos)) :
+ ok := true ;
+ h := h + _pmp_estimated_par_lines_(ypart ulxy[fpos] - ypart llcorner TextAreas[i]) ;
+ elseif ok :
+ h := h + _pmp_estimated_par_lines_(bbheight(TextAreas[i])) ;
+ fi ;
+ endfor ;
+ fi ;
+ h
+ fi
+enddef ;
- vardef estimated_par_lines (expr h) =
- round(h/par_line_height)
- enddef ;
+vardef _pmp_left_top_hang_ (expr same_area) =
- vardef estimated_multi_par_height (expr n, t) =
- if round(par_line_height)=0 :
- 0
- else :
- save ok, h ; boolean ok ;
- numeric h ; h := 0 ;
- ok := false ;
- if (nxy[fpos]=RealPageNumber-1) :
- for i := 1 upto NOfSavedTextAreas :
- if (InsideSavedTextArea(i,par_start_pos)) :
- ok := true ;
- h := h + estimated_par_lines(ypart ulxy[fpos] -
- ypart llcorner SavedTextAreas[i]) ;
- elseif ok :
- h := h + estimated_par_lines(bbheight(SavedTextAreas[i])) ;
- fi ;
- endfor ;
- fi ;
- if ok :
- for i := 1 upto n-1 :
- h := h + estimated_par_lines(bbheight(TextAreas[i])) ;
- endfor ;
- else :
- % already: ok := false ;
- for i := 1 upto n-1 :
- if (InsideTextArea(i,par_start_pos)) :
- ok := true ;
- h := h + estimated_par_lines(ypart ulxy[fpos] - ypart llcorner TextAreas[i]) ;
- elseif ok :
- h := h + estimated_par_lines(bbheight(TextAreas[i])) ;
- fi ;
- endfor ;
- fi ;
- h
- fi
- enddef ;
+ par_hang_after := ra + _pmp_estimated_par_lines_(py-fy) ;
- vardef left_top_hang (expr same_area) =
+ if (par_hang_indent>0) and (par_hang_after<0) and obey_multi_par_hang :
+ pair _ul_ ; _ul_ := (xpart ulcorner multipar, ypart _pmp_snapped_multi_pos_(ulxy[fpos]));
+ pair _pa_ ; _pa_ := _ul_ shifted (0,par_hang_after*par_line_height) ;
+ _pa_ := (xpart _pa_,max(ypart _pa_ -TopSkipCorrection,ypart llcorner multipar)) ;
+ if same_area :
+ _pa_ := (xpart _pa_,max(ypart _pa_ -TopSkipCorrection,ypart llxy[tpos])) ;
+ fi ;
+ if obey_multi_par_more and (round(par_line_height)>0) :
+ par_hang_after := min(0,round(par_hang_after +
+ (ypart urxy[fpos]-ypart _pa_)/par_line_height)) ;
+ fi ;
+ (xpart _ul_ + par_hang_indent, ypart lrxy[fpos]) --
+ (xpart _ul_ + par_hang_indent, ypart _pa_) --
+ (xpart ulcorner multipar, ypart _pa_)
+ else :
+ (xpart ulcorner multipar, ypart lrxy[fpos])
+ fi
+enddef ;
- par_hang_after := ra + estimated_par_lines(py-fy) ;
+vardef _pmp_right_top_hang_ (expr same_area) =
- if (par_hang_indent>0) and (par_hang_after<0) and obey_multi_par_hang :
- pair _ul_ ; _ul_ := (xpart ulcorner multipar, ypart snapped_multi_pos(ulxy[fpos]));
- pair _pa_ ; _pa_ := _ul_ shifted (0,par_hang_after*par_line_height) ;
- _pa_ := (xpart _pa_,max(ypart _pa_ -TopSkipCorrection,ypart llcorner multipar)) ;
- if same_area :
- _pa_ := (xpart _pa_,max(ypart _pa_ -TopSkipCorrection,ypart llxy[tpos])) ;
- fi ;
- if obey_multi_par_more and (round(par_line_height)>0) :
- par_hang_after := min(0,round(par_hang_after +
- (ypart urxy[fpos]-ypart _pa_)/par_line_height)) ;
- fi ;
- (xpart _ul_ + par_hang_indent, ypart lrxy[fpos]) --
- (xpart _ul_ + par_hang_indent, ypart _pa_) --
- (xpart ulcorner multipar, ypart _pa_)
- else :
- (xpart ulcorner multipar, ypart lrxy[fpos])
- fi
- enddef ;
+ par_hang_after := ra + _pmp_estimated_par_lines_(py-fy) ;
- vardef right_top_hang (expr same_area) =
+ if (par_hang_indent<0) and (par_hang_after<0) and obey_multi_par_hang :
+ pair _ur_ ; _ur_ := (xpart urcorner multipar, ypart _pmp_snapped_multi_pos_(urxy[fpos])) ;
+ pair _pa_ ; _pa_ := _ur_ shifted (0,par_hang_after*par_line_height) ;
+ _pa_ := (xpart _pa_,max(ypart _pa_ -TopSkipCorrection,ypart llcorner multipar)) ;
+ if same_area :
+ _pa_ := (xpart _pa_,max(ypart _pa_ -TopSkipCorrection,ypart _pmp_snapped_multi_pos_(ulxy[tpos]))) ;
+ fi ;
+ if obey_multi_par_more and (round(par_line_height)>0) :
+ par_hang_after := min(0,round(par_hang_after +
+ (ypart urxy[fpos]-ypart _pa_)/par_line_height)) ;
+ fi ;
+ (xpart urcorner multipar, ypart _pa_) --
+ (xpart _ur_ + par_hang_indent, ypart _pa_) --
+ (xpart _ur_ + par_hang_indent, ypart _pmp_snapped_multi_pos_(urxy[fpos]))
+ else :
+ (xpart urcorner multipar, ypart _pmp_snapped_multi_pos_(urxy[fpos]))
+ fi
+enddef ;
- par_hang_after := ra + estimated_par_lines(py-fy) ;
+vardef _pmp_x_left_top_hang_ (expr i, t) =
+ par_hang_after := min(0,ra + _pmp_estimated_multi_par_height_(i,t)) ;
+ if (par_hang_indent>0) and (par_hang_after<0) :
+ pair _ul_ ; _ul_ := ulcorner multipar ;
+ pair _pa_ ; _pa_ := _ul_ shifted (0,par_hang_after*par_line_height) ;
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart llcorner multipar)) ;
+ if t :
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart llxy[tpos]));
+ fi ;
+ if abs(ypart _pa_-ypart llxy[tpos])<par_line_height :
+ _pa_ := (xpart _pa_,ypart llxy[tpos]);
+ fi ;
+ if abs(ypart _pa_-ypart llcorner multipar)<par_line_height :
+ _pa_ := (xpart _pa_,ypart llcorner multipar);
+ fi ;
+ (xpart _ul_, ypart _pa_) --
+ (xpart _ul_ + par_hang_indent, ypart _pa_) --
+ (xpart _ul_ + par_hang_indent, ypart _ul_)
+ else :
+ ulcorner multipar
+ fi
+enddef ;
- if (par_hang_indent<0) and (par_hang_after<0) and obey_multi_par_hang :
- pair _ur_ ; _ur_ := (xpart urcorner multipar, ypart snapped_multi_pos(urxy[fpos])) ;
- pair _pa_ ; _pa_ := _ur_ shifted (0,par_hang_after*par_line_height) ;
- _pa_ := (xpart _pa_,max(ypart _pa_ -TopSkipCorrection,ypart llcorner multipar)) ;
- if same_area :
- _pa_ := (xpart _pa_,max(ypart _pa_ -TopSkipCorrection,ypart snapped_multi_pos(ulxy[tpos]))) ;
- fi ;
- if obey_multi_par_more and (round(par_line_height)>0) :
- par_hang_after := min(0,round(par_hang_after +
- (ypart urxy[fpos]-ypart _pa_)/par_line_height)) ;
- fi ;
- (xpart urcorner multipar, ypart _pa_) --
- (xpart _ur_ + par_hang_indent, ypart _pa_) --
- (xpart _ur_ + par_hang_indent, ypart snapped_multi_pos(urxy[fpos]))
- else :
- (xpart urcorner multipar, ypart snapped_multi_pos(urxy[fpos]))
- fi
- enddef ;
-
- vardef x_left_top_hang (expr i, t) =
- par_hang_after := min(0,ra + estimated_multi_par_height(i,t)) ;
- if (par_hang_indent>0) and (par_hang_after<0) :
- pair _ul_ ; _ul_ := ulcorner multipar ;
- pair _pa_ ; _pa_ := _ul_ shifted (0,par_hang_after*par_line_height) ;
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart llcorner multipar)) ;
- if t :
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart llxy[tpos]));
- fi ;
- if abs(ypart _pa_-ypart llxy[tpos])<par_line_height :
- _pa_ := (xpart _pa_,ypart llxy[tpos]);
- fi ;
- if abs(ypart _pa_-ypart llcorner multipar)<par_line_height :
- _pa_ := (xpart _pa_,ypart llcorner multipar);
- fi ;
- (xpart _ul_, ypart _pa_) --
- (xpart _ul_ + par_hang_indent, ypart _pa_) --
- (xpart _ul_ + par_hang_indent, ypart _ul_)
- else :
- ulcorner multipar
- fi
- enddef ;
-
- vardef x_right_top_hang (expr i, t) =
- par_hang_after := min(0,ra + estimated_multi_par_height(i,t)) ;
- if (par_hang_indent<0) and (par_hang_after<0) :
- pair _ur_ ; _ur_ := urcorner multipar ;
- pair _pa_ ; _pa_ := _ur_ shifted (0,par_hang_after*par_line_height) ;
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart lrcorner multipar)) ;
- if t :
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart snapped_multi_pos(urxy[tpos]))) ;
- fi ;
- (xpart _ur_ + par_hang_indent, ypart _ur_) --
- (xpart _ur_ + par_hang_indent, ypart _pa_) --
- (xpart _ur_, ypart _pa_)
- else :
- urcorner multipar
- fi
- enddef ;
-
- vardef left_bottom_hang (expr same_area) =
- pair _ll_, _sa_, _pa_ ;
- _sa_ := if same_area : llxy[tpos] else : lrcorner multipar fi ;
- if (par_hang_indent>0) and (par_hang_after>0) and obey_multi_par_hang :
- _ll_ := (xpart ulcorner multipar, ypart snapped_multi_pos(ulxy[fpos])) ;
- _pa_ := _ll_ shifted (0,-par_hang_after*par_line_height) ;
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart llcorner multipar)) ;
- if same_area :
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart _sa_)) ;
- fi ;
- if obey_multi_par_more and (round(par_line_height)>0) :
- par_hang_after := max(0,round(par_hang_after -
- (ypart urxy[fpos]-ypart _pa_)/par_line_height)) ;
- fi ;
- _pa_ --
- (xpart _pa_ + par_hang_indent,ypart _pa_) --
- (xpart _pa_ + par_hang_indent,ypart _sa_)
- else :
- (xpart llcorner multipar, ypart _sa_)
- fi
- enddef ;
-
- vardef right_bottom_hang (expr same_area) =
- pair _lr_, _sa_, _pa_ ;
- _sa_ := if same_area : snapped_multi_pos(ulxy[tpos]) else : lrcorner multipar fi ;
- if (par_hang_indent<0) and (par_hang_after>0) and obey_multi_par_hang :
- _lr_ := (xpart urcorner multipar, ypart snapped_multi_pos(urxy[fpos])) ;
- _pa_ := _lr_ shifted (0,-par_hang_after*par_line_height) ;
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart lrcorner multipar)) ;
- if same_area :
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart snapped_multi_pos(ulxy[tpos]))) ;
- fi ;
- if obey_multi_par_more and (round(par_line_height)>0) :
- par_hang_after := max(0,round(par_hang_after -
- (ypart urxy[fpos]-ypart _pa_)/par_line_height)) ;
- fi ;
+vardef _pmp_x_right_top_hang_ (expr i, t) =
+ par_hang_after := min(0,ra + _pmp_estimated_multi_par_height_(i,t)) ;
+ if (par_hang_indent<0) and (par_hang_after<0) :
+ pair _ur_ ; _ur_ := urcorner multipar ;
+ pair _pa_ ; _pa_ := _ur_ shifted (0,par_hang_after*par_line_height) ;
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart lrcorner multipar)) ;
+ if t :
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart _pmp_snapped_multi_pos_(urxy[tpos]))) ;
+ fi ;
+ (xpart _ur_ + par_hang_indent, ypart _ur_) --
+ (xpart _ur_ + par_hang_indent, ypart _pa_) --
+ (xpart _ur_, ypart _pa_)
+ else :
+ urcorner multipar
+ fi
+enddef ;
+
+vardef _pmp_left_bottom_hang_ (expr same_area) =
+ pair _ll_, _sa_, _pa_ ;
+ _sa_ := if same_area : llxy[tpos] else : lrcorner multipar fi ;
+ if (par_hang_indent>0) and (par_hang_after>0) and obey_multi_par_hang :
+ _ll_ := (xpart ulcorner multipar, ypart _pmp_snapped_multi_pos_(ulxy[fpos])) ;
+ _pa_ := _ll_ shifted (0,-par_hang_after*par_line_height) ;
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart llcorner multipar)) ;
+ if same_area :
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart _sa_)) ;
+ fi ;
+ if obey_multi_par_more and (round(par_line_height)>0) :
+ par_hang_after := max(0,round(par_hang_after -
+ (ypart urxy[fpos]-ypart _pa_)/par_line_height)) ;
+ fi ;
+ _pa_ --
+ (xpart _pa_ + par_hang_indent,ypart _pa_) --
+ (xpart _pa_ + par_hang_indent,ypart _sa_)
+ else :
+ (xpart llcorner multipar, ypart _sa_)
+ fi
+enddef ;
+
+vardef _pmp_right_bottom_hang_ (expr same_area) =
+ pair _lr_, _sa_, _pa_ ;
+ _sa_ := if same_area : _pmp_snapped_multi_pos_(ulxy[tpos]) else : lrcorner multipar fi ;
+ if (par_hang_indent<0) and (par_hang_after>0) and obey_multi_par_hang :
+ _lr_ := (xpart urcorner multipar, ypart _pmp_snapped_multi_pos_(urxy[fpos])) ;
+ _pa_ := _lr_ shifted (0,-par_hang_after*par_line_height) ;
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart lrcorner multipar)) ;
+ if same_area :
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart _pmp_snapped_multi_pos_(ulxy[tpos]))) ;
+ fi ;
+ if obey_multi_par_more and (round(par_line_height)>0) :
+ par_hang_after := max(0,round(par_hang_after -
+ (ypart urxy[fpos]-ypart _pa_)/par_line_height)) ;
+ fi ;
+ (xpart _pa_ + par_hang_indent,ypart _sa_) --
+ (xpart _pa_ + par_hang_indent,ypart _pa_) --
+ _pa_
+ else :
+ (xpart lrcorner multipar, ypart _sa_)
+ fi
+enddef ;
+
+vardef _pmp_x_left_bottom_hang_ (expr i, t) =
+ pair _ll_, _sa_, _pa_ ;
+ _sa_ := if t : llxy[tpos] else : llcorner multipar fi ;
+ if (par_hang_indent>0) and (ra>0) :
+ par_hang_after := max(0,ra - _pmp_estimated_multi_par_height_(i,t)) ;
+ _ll_ := ulcorner multipar ;
+ _pa_ := _ll_ shifted (0,-par_hang_after*par_line_height) ;
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart llcorner multipar)) ;
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart _sa_)) ;
+ % we need to compensate for topskip enlarged areas
+ if abs(ypart _pa_ - ypart _sa_) > par_line_height :
(xpart _pa_ + par_hang_indent,ypart _sa_) --
(xpart _pa_ + par_hang_indent,ypart _pa_) --
- _pa_
- else :
- (xpart lrcorner multipar, ypart _sa_)
fi
- enddef ;
-
- vardef x_left_bottom_hang (expr i, t) =
- pair _ll_, _sa_, _pa_ ;
- _sa_ := if t : llxy[tpos] else : llcorner multipar fi ;
- if (par_hang_indent>0) and (ra>0) :
- par_hang_after := max(0,ra - estimated_multi_par_height(i,t)) ;
- _ll_ := ulcorner multipar ;
- _pa_ := _ll_ shifted (0,-par_hang_after*par_line_height) ;
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart llcorner multipar)) ;
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart _sa_)) ;
- % we need to compensate for topskip enlarged areas
- if abs(ypart _pa_ - ypart _sa_) > par_line_height :
- (xpart _pa_ + par_hang_indent,ypart _sa_) --
- (xpart _pa_ + par_hang_indent,ypart _pa_) --
- fi
- _pa_
- else :
- (xpart llcorner multipar, ypart _sa_)
- fi
- enddef ;
-
- vardef x_right_bottom_hang (expr i, t) =
- pair _lr_, _sa_, _pa_ ;
- _sa_ := if t : snapped_multi_pos(ulxy[tpos]) else : llcorner multipar fi ;
- if (par_hang_indent<0) and (ra>0) :
- par_hang_after := max(0,ra - estimated_multi_par_height(i, t)) ;
- _lr_ := urcorner multipar ;
- _pa_ := _lr_ shifted (0,-par_hang_after*par_line_height) ;
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart lrcorner multipar)) ;
- _pa_ := (xpart _pa_,max(ypart _pa_,ypart _sa_)) ;
- % we need to compensate for topskip enlarged areas
- _pa_
- if abs(ypart _pa_ - ypart _sa_) > par_line_height :
- -- (xpart _pa_ + par_hang_indent,ypart _pa_)
- -- (xpart _pa_ + par_hang_indent,ypart _sa_)
- fi
- else :
- (xpart lrcorner multipar, ypart _sa_)
+ _pa_
+ else :
+ (xpart llcorner multipar, ypart _sa_)
+ fi
+enddef ;
+
+vardef _pmp_x_right_bottom_hang_ (expr i, t) =
+ pair _lr_, _sa_, _pa_ ;
+ _sa_ := if t : _pmp_snapped_multi_pos_(ulxy[tpos]) else : llcorner multipar fi ;
+ if (par_hang_indent<0) and (ra>0) :
+ par_hang_after := max(0,ra - _pmp_estimated_multi_par_height_(i, t)) ;
+ _lr_ := urcorner multipar ;
+ _pa_ := _lr_ shifted (0,-par_hang_after*par_line_height) ;
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart lrcorner multipar)) ;
+ _pa_ := (xpart _pa_,max(ypart _pa_,ypart _sa_)) ;
+ % we need to compensate for topskip enlarged areas
+ _pa_
+ if abs(ypart _pa_ - ypart _sa_) > par_line_height :
+ -- (xpart _pa_ + par_hang_indent,ypart _pa_)
+ -- (xpart _pa_ + par_hang_indent,ypart _sa_)
fi
- enddef ;
+ else :
+ (xpart lrcorner multipar, ypart _sa_)
+ fi
+enddef ;
- def test_multipar =
- multipar := boundingbox multipar ;
- enddef ;
+% def _pmp_test_multipar_ =
+% multipar := boundingbox multipar ;
+% enddef ;
% first loop
@@ -713,7 +714,7 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
TopSkipCorrection := 0 ;
- multipar := set_multipar(i) ;
+ multipar := _pmp_set_multipar_(i) ;
% watch how we compensate for negative indentation
@@ -723,7 +724,8 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
ii := i ;
- if (nxy[tpos]=RealPageNumber) and (InsideTextArea(i,llxy[tpos])) :
+% if (nxy[tpos]=RealPageNumber) and (InsideTextArea(i,llxy[tpos])) :
+ if (nxy[tpos]=RealPageNumber) and (InsideTextArea(i,par_stop_pos)) :
% in same area
@@ -749,9 +751,9 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
llxy[fpos] --
lrxy[tpos] --
%urxy[tpos] --
- snapped_multi_pos(urxy[tpos]) --
+ _pmp_snapped_multi_pos_(urxy[tpos]) --
%ulxy[fpos] --
- snapped_multi_pos(ulxy[fpos]) --
+ _pmp_snapped_multi_pos_(ulxy[fpos]) --
cycle ;
save_multipar (i,1,multipar) ;
@@ -763,9 +765,9 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
multipar := if obey_multi_par_hang :
- right_bottom_hang(true) --
- right_top_hang(true) --
- snapped_multi_pos(urxy[fpos]) --
+ _pmp_right_bottom_hang_(true) --
+ _pmp_right_top_hang_(true) --
+ _pmp_snapped_multi_pos_(urxy[fpos]) --
lrxy[fpos] --
else :
@@ -773,26 +775,26 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
llxy[fpos] --
(xpart urcorner multipar, ypart llxy[fpos]) --
(xpart urcorner multipar, ypart ulxy[fpos]) --
- snapped_multi_pos(ulxy[fpos]) --
+ _pmp_snapped_multi_pos_(ulxy[fpos]) --
fi cycle ;
save_multipar (i,1,multipar) ;
- multipar := set_multipar(i) ;
+ multipar := _pmp_set_multipar_(i) ;
multipar := if obey_multi_par_hang :
- left_bottom_hang(true) --
+ _pmp_left_bottom_hang_(true) --
llxy[tpos] --
- snapped_multi_pos(ulxy[tpos]) --
- left_top_hang(true) --
+ _pmp_snapped_multi_pos_(ulxy[tpos]) --
+ _pmp_left_top_hang_(true) --
else :
(xpart llcorner multipar, ypart llxy[tpos]) --
llxy[tpos] --
- snapped_multi_pos(ulxy[tpos]) --
+ _pmp_snapped_multi_pos_(ulxy[tpos]) --
(xpart llcorner multipar, ypart ulxy[tpos]) --
fi cycle ;
@@ -803,27 +805,27 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
multipar := if obey_multi_par_hang :
- left_bottom_hang(true) --
+ _pmp_left_bottom_hang_(true) --
llxy[tpos] --
%ulxy[tpos] --
- snapped_multi_pos(ulxy[tpos]) --
- right_bottom_hang(true) --
- right_top_hang(true) --
+ _pmp_snapped_multi_pos_(ulxy[tpos]) --
+ _pmp_right_bottom_hang_(true) --
+ _pmp_right_top_hang_(true) --
%urxy[fpos] --
- snapped_multi_pos(urxy[fpos]) --
+ _pmp_snapped_multi_pos_(urxy[fpos]) --
lrxy[fpos] --
- left_top_hang(true) --
+ _pmp_left_top_hang_(true) --
else :
(xpart llcorner multipar, ypart llxy[tpos]) --
llxy[tpos] --
%ulxy[tpos] --
- snapped_multi_pos(ulxy[tpos]) --
+ _pmp_snapped_multi_pos_(ulxy[tpos]) --
(xpart lrcorner multipar, ypart ulxy[tpos]) --
(xpart urcorner multipar, ypart urxy[fpos]) --
%urxy[fpos] --
- snapped_multi_pos(urxy[fpos]) --
+ _pmp_snapped_multi_pos_(urxy[fpos]) --
lrxy[fpos] --
(xpart ulcorner multipar, ypart lrxy[fpos]) --
@@ -837,13 +839,13 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
multipar := if obey_multi_par_hang :
- left_bottom_hang(false) --
- right_bottom_hang(false) --
- right_top_hang(false) --
+ _pmp_left_bottom_hang_(false) --
+ _pmp_right_bottom_hang_(false) --
+ _pmp_right_top_hang_(false) --
%urxy[fpos] --
- snapped_multi_pos(urxy[fpos]) --
+ _pmp_snapped_multi_pos_(urxy[fpos]) --
lrxy[fpos] --
- left_top_hang(false) --
+ _pmp_left_top_hang_(false) --
else :
@@ -851,7 +853,7 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
lrcorner multipar --
(xpart urcorner multipar, ypart urxy[fpos]) --
%urxy[fpos] --
- snapped_multi_pos(urxy[fpos]) --
+ _pmp_snapped_multi_pos_(urxy[fpos]) --
lrxy[fpos] --
(xpart ulcorner multipar, ypart lrxy[fpos]) --
@@ -861,7 +863,8 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
fi ;
- elseif (nxy[tpos]=RealPageNumber) and (InsideTextArea(i,llxy[tpos])) :
+% elseif (nxy[tpos]=RealPageNumber) and (InsideTextArea(i,llxy[tpos])) :
+ elseif (nxy[tpos]=RealPageNumber) and (InsideTextArea(i,par_stop_pos)) :
% last one in chain
@@ -870,12 +873,12 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
if obey_multi_par_hang and obey_multi_par_more :
multipar :=
- x_left_top_hang(i,true) --
- x_right_top_hang(i,true) --
- x_right_bottom_hang(i,true) --
- snapped_multi_pos(ulxy[tpos]) --
+ _pmp_x_left_top_hang_(i,true) --
+ _pmp_x_right_top_hang_(i,true) --
+ _pmp_x_right_bottom_hang_(i,true) --
+ _pmp_snapped_multi_pos_(ulxy[tpos]) --
llxy[tpos] --
- x_left_bottom_hang(i,true) --
+ _pmp_x_left_bottom_hang_(i,true) --
cycle ;
else :
@@ -884,7 +887,7 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
ulcorner multipar --
urcorner multipar --
(xpart lrcorner multipar, ypart urxy[tpos]) --
- snapped_multi_pos(ulxy[tpos]) --
+ _pmp_snapped_multi_pos_(ulxy[tpos]) --
llxy[tpos] --
(xpart llcorner multipar, ypart llxy[tpos]) --
cycle ;
@@ -917,15 +920,15 @@ def prepare_multi_pars (expr fn,fx,fy,fw,fh,fd,
((nxy[fpos]<RealPageNumber) and (nxy[tpos]>RealPageNumber))
:
- multipar := set_multipar(i) ;
+ multipar := _pmp_set_multipar_(i) ;
if obey_multi_par_hang and obey_multi_par_more :
multipar :=
- x_left_top_hang(i,false) --
- x_right_top_hang(i,false) --
- x_right_bottom_hang(i,false) --
- x_left_bottom_hang(i,false) --
+ _pmp_x_left_top_hang_(i,false) --
+ _pmp_x_right_top_hang_(i,false) --
+ _pmp_x_right_bottom_hang_(i,false) --
+ _pmp_x_left_bottom_hang_(i,false) --
cycle ;
fi ;
diff --git a/Master/texmf-dist/metapost/context/base/mp-form.mp b/Master/texmf-dist/metapost/context/base/mp-form.mp
index a65ab6d7374..60ea4cac214 100644
--- a/Master/texmf-dist/metapost/context/base/mp-form.mp
+++ b/Master/texmf-dist/metapost/context/base/mp-form.mp
@@ -15,6 +15,11 @@
boolean mant_font ; mant_font := true ; % signals graph not to load form
+if known mplib :
+ boolean fmt_loaded ; fmt_loaded := true ;
+ expandafter endinput
+fi ;
+
if known fmt_loaded : expandafter endinput fi ;
boolean fmt_loaded ; fmt_loaded := true ;
@@ -78,8 +83,8 @@ begingroup interim warningcheck := 0 ;
%%% Load auxiliary macros.
-input string
-input marith
+input string ;
+input marith ;
%%% Choosing the Layout %%%
@@ -318,7 +323,7 @@ enddef ;
% round and typeset a quantity z in exponent form.
%
% e scientific, p significant figures
-% p decimal, p digits right of the point
+% f decimal, p digits right of the point
% g decimal or scientific, p sig. figs.
% G decimal or scientific, p digits
diff --git a/Master/texmf-dist/metapost/context/base/mp-grid.mp b/Master/texmf-dist/metapost/context/base/mp-grid.mp
index f6e84348915..c87df821cfa 100644
--- a/Master/texmf-dist/metapost/context/base/mp-grid.mp
+++ b/Master/texmf-dist/metapost/context/base/mp-grid.mp
@@ -107,7 +107,12 @@ def do_initialize_numbers =
textext.raw("${\times}10$") ,
textext.raw("${}^-$") ,
textext.raw("${}^2$") ) ;
- numbers_initialized := true ;
+ if unknown _trial_run_ :
+ numbers_initialized := true ;
+ else :
+ % no reset, otherwise textexts get out of sync
+ % slows down graphics a bit but not much
+ fi ;
fi ;
enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mp-grph.mp b/Master/texmf-dist/metapost/context/base/mp-grph.mp
index 243b45318b0..3cd9f2cfbda 100644
--- a/Master/texmf-dist/metapost/context/base/mp-grph.mp
+++ b/Master/texmf-dist/metapost/context/base/mp-grph.mp
@@ -59,21 +59,25 @@ string graphictextfile ; graphictextfile := "dummy.mpo" ;
def data_mpo_file = job_name & "-mpgraph.mpo" enddef ;
def data_mpy_file = job_name & "-mpgraph.mpy" enddef ;
-def savegraphictext (expr str) =
- if (graphictextstring<>"") :
- write graphictextstring to data_mpo_file ;
- graphictextstring := "" ;
- fi ;
- write str to data_mpo_file ;
- let erasegraphictextfile = relax ;
-enddef ;
+if unknown mplib :
-def erasegraphictextfile =
- write EOF to data_mpo_file ;
- let erasegraphictextfile = relax ;
-enddef ;
+ def savegraphictext (expr str) =
+ if (graphictextstring<>"") :
+ write graphictextstring to data_mpo_file ;
+ graphictextstring := "" ;
+ fi ;
+ write str to data_mpo_file ;
+ let erasegraphictextfile = relax ;
+ enddef ;
-extra_beginfig := extra_beginfig & " erasegraphictextfile ;" ;
+ def erasegraphictextfile =
+ write EOF to data_mpo_file ;
+ let erasegraphictextfile = relax ;
+ enddef ;
+
+ extra_beginfig := extra_beginfig & " erasegraphictextfile ;" ;
+
+fi ;
def begingraphictextfig (expr n) =
foundpicture := n ; scratchpicture := nullpicture ;
@@ -138,7 +142,9 @@ def dographictext (expr t) =
graphictextformat := "" ;
fi ;
currentgraphictext := currentgraphictext + 1 ;
- savegraphictext ("\startTEXpage[scale=10000]" & t & "\stopTEXpage") ;
+ if unknown mplib :
+ savegraphictext ("\startTEXpage[scale=10000]" & t & "\stopTEXpage") ;
+ fi ;
dofinishgraphictext
enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mp-mlib.mp b/Master/texmf-dist/metapost/context/base/mp-mlib.mp
index bf2372ca390..6c7115cb7d4 100644
--- a/Master/texmf-dist/metapost/context/base/mp-mlib.mp
+++ b/Master/texmf-dist/metapost/context/base/mp-mlib.mp
@@ -2,7 +2,7 @@
%D [ file=mp-mlib.mp,
%D version=2008.03.21,
%D title=\CONTEXT\ \METAPOST\ graphics,
-%D subtitle=specials,
+%D subtitle=plugins,
%D author=Hans Hagen,
%D date=\currentdate,
%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
@@ -16,6 +16,66 @@ if known context_mlib : endinput ; fi ;
boolean context_mlib ; context_mlib := true ;
+%D Color and transparency
+
+newinternal normaltransparent ; normaltransparent := 1 ;
+newinternal multiplytransparent ; multiplytransparent := 2 ;
+newinternal screentransparent ; screentransparent := 3 ;
+newinternal overlaytransparent ; overlaytransparent := 4 ;
+newinternal softlighttransparent ; softlighttransparent := 5 ;
+newinternal hardlighttransparent ; hardlighttransparent := 6 ;
+newinternal colordodgetransparent ; colordodgetransparent := 7 ;
+newinternal colorburntransparent ; colorburntransparent := 8 ;
+newinternal darkentransparent ; darkentransparent := 9 ;
+newinternal lightentransparent ; lightentransparent := 10 ;
+newinternal differencetransparent ; differencetransparent := 11 ;
+newinternal exclusiontransparent ; exclusiontransparent := 12 ;
+
+vardef transparency_alternative_to_number(expr name) =
+ if string name :
+ if expandafter known scantokens(name & "transparent") :
+ scantokens(name & "transparent")
+ else :
+ 0
+ fi
+ elseif name < 13 :
+ name
+ else :
+ 0
+ fi
+enddef ;
+
+def spotcolor(expr n, v) =
+ 1
+ withprescript "sp_name=" & n
+ withprescript "sp_value=" & v
+enddef ;
+
+def multitonecolor(expr name, fractions, components, value) =
+ 1
+ withprescript "sp_name=" & name
+ withprescript "sp_fractions=" & decimal fractions
+ withprescript "sp_components=" & components
+ withprescript "sp_value=" & value
+enddef ;
+
+def transparent(expr alternative, transparency)(text c) =
+ c
+ withprescript "tr_alternative=" & decimal transparency_alternative_to_number(alternative)
+ withprescript "tr_transparency=" & decimal transparency
+enddef ;
+
+def withtransparency(expr alternative, transparency) =
+ withprescript "tr_alternative=" & decimal transparency_alternative_to_number(alternative)
+ withprescript "tr_transparency=" & decimal transparency
+enddef ;
+
+def cmyk(expr c, m, y, k) =
+ (c,m,y,k)
+enddef ;
+
+% Texts
+
numeric _tt_w_[], _tt_h_[], _tt_d_[] ;
numeric _tt_n_ ; _tt_n_ := 0 ;
picture _tt_p_ ; _tt_p_ := nullpicture ;
@@ -26,34 +86,53 @@ def resettextexts =
_tt_p_ := nullpicture ;
enddef ;
-extra_endfig := ";addto currentpicture also _tt_p_; " & extra_endfig; % was draw _tt_p_
+def flushtextexts =
+ addto currentpicture also _tt_p_
+enddef ;
+
+extra_endfig := "flushtextexts;" & extra_endfig;
extra_beginfig := extra_beginfig & "resettextexts;";
+% We collect and flush them all, as we can also have temporary textexts
+% that gets never really flushed but are used for calculations. So, we
+% flush twice: once in location in order to pick up e.g. color properties,
+% and once at the end because we need to flush missing ones.
+
vardef rawtextext(expr str) =
if str = "" :
nullpicture
elseif _trial_run_ :
+ _tt_n_ := _tt_n_ + 1 ;
+ addto _tt_p_ doublepath unitsquare
+ withprescript "tx_number=" & decimal _tt_n_
+ withprescript "tx_stage=extra"
+ withpostscript str ;
image (
- _tt_n_ := _tt_n_ + 1 ;
- _tt_p_ := image (
- addto currentpicture also _tt_p_ ;
- addto currentpicture doublepath unitsquare withprescript "tf" withpostscript decimal _tt_n_ & ":" & str ;
- ) ;
- addto currentpicture doublepath unitsquare withpen pencircle scaled 0 ;
+ addto currentpicture doublepath unitsquare
+ withprescript "tx_number=" & decimal _tt_n_
+ withprescript "tx_stage=trial"
+ withpostscript str
)
else :
- image (
- _tt_n_ := _tt_n_ + 1 ;
- addto currentpicture doublepath unitsquare
- xscaled _tt_w_[_tt_n_]
- yscaled (_tt_h_[_tt_n_] + _tt_d_[_tt_n_])
- withprescript "ts"
- withpostscript decimal _tt_n_ & ":" & str ;
- ) shifted (0,-_tt_d_[_tt_n_])
+ _tt_n_ := _tt_n_ + 1 ;
+ if known _tt_d_[_tt_n_] :
+ image (
+ addto currentpicture doublepath unitsquare
+ xscaled _tt_w_[_tt_n_]
+ yscaled (_tt_h_[_tt_n_] + _tt_d_[_tt_n_])
+ withprescript "tx_number=" & decimal _tt_n_
+ withprescript "tx_stage=final"
+ ; % withpostscript str ;
+ ) shifted (0,-_tt_d_[_tt_n_])
+ else :
+ image (
+ addto currentpicture doublepath unitsquare ;
+ )
+ fi
fi
enddef ;
-% not ok yet
+% More text
pair laboff.d, laboff.dlft, laboff.drt ; % new positional suffixes
pair laboff.origin, laboff.raw ; % graph mess
@@ -89,44 +168,44 @@ pair laboff.t_r ; laboff.t_r = laboff.urt ;
pair laboff.b_l ; laboff.b_l = laboff.llft ;
pair laboff.b_r ; laboff.b_r = laboff.lrt ;
-labxf.l ; labxf.l = labxf.lft ;
-labxf.r ; labxf.r = labxf.rt ;
-labxf.b ; labxf.b = labxf.bot ;
-labxf.t ; labxf.t = labxf.top ;
-labxf.l_t ; labxf.l_t = labxf.ulft ;
-labxf.r_t ; labxf.r_t = labxf.urt ;
-labxf.l_b ; labxf.l_b = labxf.llft ;
-labxf.r_b ; labxf.r_b = labxf.lrt ;
-labxf.t_l ; labxf.t_l = labxf.ulft ;
-labxf.t_r ; labxf.t_r = labxf.urt ;
-labxf.b_l ; labxf.b_l = labxf.llft ;
-labxf.b_r ; labxf.b_r = labxf.lrt ;
-
-labyf.l ; labyf.l = labyf.lft ;
-labyf.r ; labyf.r = labyf.rt ;
-labyf.b ; labyf.b = labyf.bot ;
-labyf.t ; labyf.t = labyf.top ;
-labyf.l_t ; labyf.l_t = labyf.ulft ;
-labyf.r_t ; labyf.r_t = labyf.urt ;
-labyf.l_b ; labyf.l_b = labyf.llft ;
-labyf.r_b ; labyf.r_b = labyf.lrt ;
-labyf.t_l ; labyf.t_l = labyf.ulft ;
-labyf.t_r ; labyf.t_r = labyf.urt ;
-labyf.b_l ; labyf.b_l = labyf.llft ;
-labyf.b_r ; labyf.b_r = labyf.lrt ;
-
-labtype.l ; labtype.l = labtype.lft ;
-labtype.r ; labtype.r = labtype.rt ;
-labtype.b ; labtype.b = labtype.bot ;
-labtype.t ; labtype.t = labtype.top ;
-labtype.l_t ; labtype.l_t = labtype.ulft ;
-labtype.r_t ; labtype.r_t = labtype.urt ;
-labtype.l_b ; labtype.l_b = labtype.llft ;
-labtype.r_b ; labtype.r_b = labtype.lrt ;
-labtype.t_l ; labtype.t_l = labtype.ulft ;
-labtype.t_r ; labtype.t_r = labtype.urt ;
-labtype.b_l ; labtype.b_l = labtype.llft ;
-labtype.b_r ; labtype.b_r = labtype.lrt ;
+numeric labxf.l ; labxf.l = labxf.lft ;
+numeric labxf.r ; labxf.r = labxf.rt ;
+numeric labxf.b ; labxf.b = labxf.bot ;
+numeric labxf.t ; labxf.t = labxf.top ;
+numeric labxf.l_t ; labxf.l_t = labxf.ulft ;
+numeric labxf.r_t ; labxf.r_t = labxf.urt ;
+numeric labxf.l_b ; labxf.l_b = labxf.llft ;
+numeric labxf.r_b ; labxf.r_b = labxf.lrt ;
+numeric labxf.t_l ; labxf.t_l = labxf.ulft ;
+numeric labxf.t_r ; labxf.t_r = labxf.urt ;
+numeric labxf.b_l ; labxf.b_l = labxf.llft ;
+numeric labxf.b_r ; labxf.b_r = labxf.lrt ;
+
+numeric labyf.l ; labyf.l = labyf.lft ;
+numeric labyf.r ; labyf.r = labyf.rt ;
+numeric labyf.b ; labyf.b = labyf.bot ;
+numeric labyf.t ; labyf.t = labyf.top ;
+numeric labyf.l_t ; labyf.l_t = labyf.ulft ;
+numeric labyf.r_t ; labyf.r_t = labyf.urt ;
+numeric labyf.l_b ; labyf.l_b = labyf.llft ;
+numeric labyf.r_b ; labyf.r_b = labyf.lrt ;
+numeric labyf.t_l ; labyf.t_l = labyf.ulft ;
+numeric labyf.t_r ; labyf.t_r = labyf.urt ;
+numeric labyf.b_l ; labyf.b_l = labyf.llft ;
+numeric labyf.b_r ; labyf.b_r = labyf.lrt ;
+
+numeric labtype.l ; labtype.l = labtype.lft ;
+numeric labtype.r ; labtype.r = labtype.rt ;
+numeric labtype.b ; labtype.b = labtype.bot ;
+numeric labtype.t ; labtype.t = labtype.top ;
+numeric labtype.l_t ; labtype.l_t = labtype.ulft ;
+numeric labtype.r_t ; labtype.r_t = labtype.urt ;
+numeric labtype.l_b ; labtype.l_b = labtype.llft ;
+numeric labtype.r_b ; labtype.r_b = labtype.lrt ;
+numeric labtype.t_l ; labtype.t_l = labtype.ulft ;
+numeric labtype.t_r ; labtype.t_r = labtype.urt ;
+numeric labtype.b_l ; labtype.b_l = labtype.llft ;
+numeric labtype.b_r ; labtype.b_r = labtype.lrt ;
vardef thetextext@#(expr p,z) = % adapted copy of thelabel@
if string p :
@@ -175,6 +254,34 @@ primarydef str infont name = % very naughty !
fi
enddef ;
+% Shades
+
+newinternal shadefactor ; shadefactor := 1 ;
+pair shadeoffset ; shadeoffset := origin ;
+boolean trace_shades ; trace_shades := false ;
+
+def set_linear_vector (suffix a,b)(expr p,n) =
+ if (n=1) : a := llcorner p ; b := urcorner p ;
+ elseif (n=2) : a := lrcorner p ; b := ulcorner p ;
+ elseif (n=3) : a := urcorner p ; b := llcorner p ;
+ elseif (n=4) : a := ulcorner p ; b := lrcorner p ;
+ elseif (n=5) : a := .5[ulcorner p,llcorner p] ; b := .5[urcorner p,lrcorner p] ;
+ elseif (n=6) : a := .5[llcorner p,lrcorner p] ; b := .5[ulcorner p,urcorner p] ;
+ elseif (n=7) : a := .5[lrcorner p,urcorner p] ; b := .5[llcorner p,ulcorner p] ;
+ elseif (n=8) : a := .5[urcorner p,ulcorner p] ; b := .5[lrcorner p,llcorner p] ;
+ else : a := .5[ulcorner p,llcorner p] ; b := .5[urcorner p,lrcorner p] ;
+ fi ;
+enddef ;
+
+def set_circular_vector (suffix ab, r)(expr p,n) =
+ if (n=1) : ab := llcorner p ;
+ elseif (n=2) : ab := lrcorner p ;
+ elseif (n=3) : ab := urcorner p ;
+ elseif (n=4) : ab := ulcorner p ;
+ else : ab := center p ; r := .5r ;
+ fi ;
+enddef ;
+
def circular_shade (expr p, n, ca, cb) =
begingroup ;
save ab, r ; pair ab ; numeric r ;
@@ -186,6 +293,7 @@ def circular_shade (expr p, n, ca, cb) =
fi ;
endgroup ;
enddef ;
+
def linear_shade (expr p, n, ca, cb) =
begingroup ;
save a, b, sh ; pair a, b ;
@@ -196,46 +304,128 @@ def linear_shade (expr p, n, ca, cb) =
fi ;
endgroup ;
enddef ;
+
def withcircularshade (expr a, b, ra, rb, ca, cb) =
- withprescript
- "cs"
- withpostscript
- "0 1 " & decimal shadefactor & " " &
- colordecimals ca & " " & ddecimal (a shifted shadeoffset) & " " & decimal ra & " " &
- colordecimals cb & " " & ddecimal (b shifted shadeoffset) & " " & decimal rb
+ withprescript "sh_type=circular"
+ withprescript "sh_domain=0 1"
+ withprescript "sh_factor=" & decimal shadefactor
+ withprescript "sh_color_a=" & colordecimals ca
+ withprescript "sh_color_b=" & colordecimals cb
+ withprescript "sh_center_a=" & ddecimal (a shifted shadeoffset)
+ withprescript "sh_center_b=" & ddecimal (b shifted shadeoffset)
+ withprescript "sh_radius_a=" & decimal ra
+ withprescript "sh_radius_b=" & decimal rb
enddef ;
+
def withlinearshade (expr a, b, ca, cb) =
- withprescript
- "ls"
- withpostscript
- "0 1 " & decimal shadefactor & " " &
- colordecimals ca & " " & ddecimal (a shifted shadeoffset) & " " &
- colordecimals cb & " " & ddecimal (b shifted shadeoffset)
-enddef ;
-string _defined_cs_pre_[], _defined_cs_post_[] ; numeric _defined_cs_ ; _defined_cs_:= 0 ;
+ withprescript "sh_type=linear"
+ withprescript "sh_domain=0 1"
+ withprescript "sh_factor=" & decimal shadefactor
+ withprescript "sh_color_a=" & colordecimals ca
+ withprescript "sh_color_b=" & colordecimals cb
+ withprescript "sh_center_a=" & ddecimal (a shifted shadeoffset)
+ withprescript "sh_center_b=" & ddecimal (b shifted shadeoffset)
+enddef ;
+
+string _defined_cs_pre_[] ; numeric _defined_cs_ ; _defined_cs_:= 0 ;
+string prescript_separator ; prescript_separator := char(13) ;
+
vardef define_circular_shade (expr a, b, ra, rb, ca, cb) =
_defined_cs_ := _defined_cs_ + 1 ;
- _defined_cs_pre_ [_defined_cs_] := "cs" ;
- _defined_cs_post_[_defined_cs_] := "0 1 " & decimal shadefactor & " " &
- colordecimals ca & " " & ddecimal (a shifted shadeoffset) & " " & decimal ra & " " &
- colordecimals cb & " " & ddecimal (b shifted shadeoffset) & " " & decimal rb ;
+ _defined_cs_pre_ [_defined_cs_] := "sh_type=circular"
+ & prescript_separator & "sh_domain=0 1"
+ & prescript_separator & "sh_factor=" & decimal shadefactor
+ & prescript_separator & "sh_color_a=" & colordecimals ca
+ & prescript_separator & "sh_color_b=" & colordecimals cb
+ & prescript_separator & "sh_center_a=" & ddecimal (a shifted shadeoffset)
+ & prescript_separator & "sh_center_b=" & ddecimal (b shifted shadeoffset)
+ & prescript_separator & "sh_radius_a=" & decimal ra
+ & prescript_separator & "sh_radius_b=" & decimal rb
+ ;
_defined_cs_
enddef ;
+
vardef define_linear_shade (expr a, b, ca, cb) =
_defined_cs_ := _defined_cs_ + 1 ;
- _defined_cs_pre_ [_defined_cs_] := "ls" ;
- _defined_cs_post_[_defined_cs_] := "0 1 " & decimal shadefactor & " " &
- colordecimals ca & " " & ddecimal (a shifted shadeoffset) & " " &
- colordecimals cb & " " & ddecimal (b shifted shadeoffset) ;
+ _defined_cs_pre_ [_defined_cs_] := "sh_type=linear"
+ & prescript_separator & "sh_domain=0 1"
+ & prescript_separator & "sh_factor=" & decimal shadefactor
+ & prescript_separator & "sh_color_a=" & colordecimals ca
+ & prescript_separator & "sh_color_b=" & colordecimals cb
+ & prescript_separator & "sh_center_a=" & ddecimal (a shifted shadeoffset)
+ & prescript_separator & "sh_center_b=" & ddecimal (b shifted shadeoffset)
+ ;
_defined_cs_
enddef ;
+
primarydef p withshade sc =
- p withprescript _defined_cs_pre_[sc] withpostscript _defined_cs_post_[sc]
+ p withprescript _defined_cs_pre_[sc]
+enddef ;
+
+% vardef predefined_linear_shade (expr p, n, ca, cb) =
+% save a, b, sh ; pair a, b ;
+% set_linear_vector(a,b)(p,n) ;
+% define_linear_shade (a,b,ca,cb)
+% enddef ;
+%
+% vardef predefined_circular_shade (expr p, n, ca, cb) =
+% save ab, r ; pair ab ; numeric r ;
+% r := (xpart lrcorner p - xpart llcorner p) ++ (ypart urcorner p - ypart lrcorner p) ;
+% set_circular_vector(ab,r)(p,n) ;
+% define_circular_shade(ab,ab,0,r,ca,cb)
+% enddef ;
+
+% NEW EXPERIMENTAL CODE
+
+def withlinearshading (expr a, b) =
+ withprescript "sh_type=linear"
+ withprescript "sh_domain=0 1"
+ withprescript "sh_factor=" & decimal shadefactor
+ withprescript "sh_center_a=" & ddecimal (a shifted shadeoffset)
+ withprescript "sh_center_b=" & ddecimal (b shifted shadeoffset)
+enddef ;
+
+def withcircularshading (expr a, b, ra, rb) =
+ withprescript "sh_type=circular"
+ withprescript "sh_domain=0 1"
+ withprescript "sh_factor=" & decimal shadefactor
+ withprescript "sh_center_a=" & ddecimal (a shifted shadeoffset)
+ withprescript "sh_center_b=" & ddecimal (b shifted shadeoffset)
+ withprescript "sh_radius_a=" & decimal ra
+ withprescript "sh_radius_b=" & decimal rb
+enddef ;
+
+def withfromshadecolor expr t =
+ withprescript "sh_color=into"
+ withprescript "sh_color_a=" & colordecimals t
+enddef ;
+
+def withtoshadecolor expr t =
+ withprescript "sh_color=into"
+ withprescript "sh_color_b=" & colordecimals t
+enddef ;
+
+def withshading (expr how)(text rest) =
+ if how = "linear" :
+ withlinearshading(rest)
+ elseif how = "circular" :
+ withcircularshading(rest)
+ else :
+ % nothing
+ fi
enddef ;
-def shadecolor(expr sc) = % obsolete
- 1 withprescript _defined_cs_pre_[sc] withpostscript _defined_cs_post_[sc]
+
+primarydef a shadedinto b =
+ 1
+ withprescript "sh_color=into"
+ withprescript "sh_color_a=" & colordecimals a
+ withprescript "sh_color_b=" & colordecimals b
enddef ;
+% END OF NEW
+
+% Graphic text (we will move code here)
+
def graphictext primary t =
if _trial_run_ :
let dographictextindeed = nographictext ;
@@ -244,32 +434,80 @@ def graphictext primary t =
fi
dographictextindeed(t)
enddef ;
+
def dographictext (expr t) =
+ % withprescript "gt_stage=final"
begingroup ;
save figurepicture ; picture figurepicture ;
figurepicture := currentpicture ; currentpicture := nullpicture ;
currentgraphictext := currentgraphictext + 1 ;
dofinishgraphictext
enddef ;
+
def nographictext (expr t) text rest =
- draw unitsquare withprescript "gt" withpostscript t ;
+ draw unitsquare withprescript "gt_stage=trial" withpostscript t
enddef ;
-def savegraphictext (expr str) =
+
+% def savegraphictext (expr str) =
+% enddef ;
+
+% def erasegraphictextfile =
+% enddef ;
+
+% Layers
+
+def onlayer primary name =
+ withprescript "la_name=" & name
enddef ;
-def erasegraphictextfile =
+
+
+% Figures
+
+% def externalfigure primary filename =
+% doexternalfigure (filename)
+% enddef ;
+%
+% def doexternalfigure (expr filename) text transformation =
+% if true : % a bit incompatible esp scaled 1cm now scaled the natural size
+% draw rawtextext("\externalfigure[" & filename & "]") transformation ;
+% else :
+% draw unitsquare transformation withprescript "fg_name=" & filename ;
+% fi ;
+% enddef ;
+
+def withmask primary filename =
+ withprescript "fg_mask=" & filename
enddef ;
def externalfigure primary filename =
- doexternalfigure (filename)
+ if false :
+ rawtextext("\externalfigure[" & filename & "]")
+ else :
+ image (
+ addto currentpicture doublepath unitsquare
+ withprescript "fg_name=" & filename ;
+ )
+% unitsquare
+% withpen pencircle scaled 0
+% withprescript "fg_name=" & filename
+ fi
enddef ;
-def doexternalfigure (expr filename) text transformation =
- draw unitsquare transformation withprescript "fg" withpostscript filename ;
+
+def figure primary filename =
+ rawtextext("\externalfigure[" & filename & "]")
enddef ;
+% Positions
+
def register (expr label, width, height, offset) =
- draw unitsquare xscaled width yscaled height shifted offset withprescript "ps" withpostscript label ;
+ image (
+ addto currentpicture doublepath unitsquare xscaled width yscaled height shifted offset
+ withprescript "ps_label=" & label ;
+ ) ; % no transformations
enddef ;
+% Housekeeping
+
extra_beginfig := extra_beginfig & "currentgraphictext := 0 ; " ;
extra_endfig := extra_endfig & "finishsavingdata ; " ;
extra_endfig := extra_endfig & "resettextexts ; " ;
@@ -277,6 +515,19 @@ extra_endfig := extra_endfig & "resettextexts ; " ;
boolean cmykcolors ; cmykcolors := true ;
boolean spotcolors ; spotcolors := true ;
+% Bonus
+
vardef verbatim(expr str) =
ditto & "\detokenize{" & str & "}" & ditto
enddef ;
+
+% New
+
+def bitmapimage(expr xresolution, yresolution, data) =
+ image (
+ addto currentpicture doublepath unitsquare
+ withprescript "bm_xresolution=" & decimal xresolution
+ withprescript "bm_yresolution=" & decimal yresolution
+ withpostscript data ;
+ )
+enddef ;
diff --git a/Master/texmf-dist/metapost/context/base/mp-page.mp b/Master/texmf-dist/metapost/context/base/mp-page.mp
index 60bfb141754..59d8bccbcd7 100644
--- a/Master/texmf-dist/metapost/context/base/mp-page.mp
+++ b/Master/texmf-dist/metapost/context/base/mp-page.mp
@@ -123,7 +123,7 @@ vardef InsideSavedTextArea (expr _i_, _xy_) =
(round(ypart _xy_) <= round(ypart urcorner SavedTextAreas[_i_])) )
enddef ;
-vardef InsideSomeTextArea(expr _xy_) =
+vardef InsideSomeTextArea (expr _xy_) =
save ok ; boolean ok ; ok := false ;
for i := 1 upto NOfTextAreas :
if InsideTextArea(i,_xy_) : ok := true ; fi ;
@@ -132,7 +132,7 @@ vardef InsideSomeTextArea(expr _xy_) =
ok
enddef ;
-vardef InsideSomeSavedTextArea(expr _xy_) =
+vardef InsideSomeSavedTextArea (expr _xy_) =
save ok ; boolean ok ; ok := false ;
for i := 1 upto NOfSavedTextAreas :
if InsideSavedTextArea(i,_xy_) : ok := true ; fi ;
@@ -211,6 +211,10 @@ vardef TextAreaWH (expr x, y) =
_TextAreaWH_
enddef ;
+string CurrentLayout ;
+
+CurrentLayout := "default" ;
+
PageNumber := 0 ;
PaperHeight := 845.04684pt ;
PaperWidth := 597.50787pt ;
diff --git a/Master/texmf-dist/metapost/context/base/mp-spec.mp b/Master/texmf-dist/metapost/context/base/mp-spec.mp
index 9125b4b8bc2..123e75faaae 100644
--- a/Master/texmf-dist/metapost/context/base/mp-spec.mp
+++ b/Master/texmf-dist/metapost/context/base/mp-spec.mp
@@ -47,6 +47,7 @@
%D for instance shading. More information can be found in
%D type {supp-mpe.tex}.
+if known mplib : endinput ; fi ;
if unknown context_tool : input mp-tool ; fi ;
if known context_spec : endinput ; fi ;
@@ -366,18 +367,16 @@ def circular_shade (expr p, n, ca, cb) =
enddef ;
vardef predefined_linear_shade (expr p, n, ca, cb) =
- save a, b, sh ; pair a, b ;
- set_linear_vector(a,b)(p,n) ;
- set_shade_vector(a,b)(p,n) ;
- define_linear_shade (a,b,ca,cb)
+ save a, b, sh ; pair a, b ;
+ set_linear_vector(a,b)(p,n) ;
+ define_linear_shade (a,b,ca,cb)
enddef ;
vardef predefined_circular_shade (expr p, n, ca, cb) =
- save ab, r ; pair ab ; numeric r ;
- r := (xpart lrcorner p - xpart llcorner p) ++
- (ypart urcorner p - ypart lrcorner p) ;
- set_circular_vector(ab,r)(p,n) ;
- define_circular_shade(ab,ab,0,r,ca,cb)
+ save ab, r ; pair ab ; numeric r ;
+ r := (xpart lrcorner p - xpart llcorner p) ++ (ypart urcorner p - ypart lrcorner p) ;
+ set_circular_vector(ab,r)(p,n) ;
+ define_circular_shade(ab,ab,0,r,ca,cb)
enddef ;
%D Since a \type {fill p withshade s} syntax looks better
@@ -638,8 +637,7 @@ vardef transparent(expr n, t, c) =
flush_special(3, 7, s) ;
fi ;
scantokens(ss) := _special_counter_ ;
- _local_specials_ := _local_specials_ &
- "scantokens(" & ditto & ss & ditto & ") := -1 ;" ;
+ _local_specials_ := _local_specials_ & "scantokens(" & ditto & ss & ditto & ") := -1 ;" ;
fi ;
% go ahead
if is_spot :
@@ -661,6 +659,18 @@ vardef is_transparent(text t) =
endgroup
enddef ;
+% boolean _b_ ; better namespacing
+% color _c_ ;
+% vardef _transparent_(expr nn, tt, cc) = _b_ := true ; cc enddef ;
+% vardef is_transparent(text t) =
+% begingroup ;
+% save transparent ;
+% transparent := _transparent_ ;
+% _b_ := false ;
+% _c_ := t ; _b_
+% endgroup
+% enddef ;
+
%D This function returns the not transparent color.
vardef not_transparent(text t) =
diff --git a/Master/texmf-dist/metapost/context/base/mp-tool.mp b/Master/texmf-dist/metapost/context/base/mp-tool.mp
index 1a748baf9ea..7f047fefcce 100644
--- a/Master/texmf-dist/metapost/context/base/mp-tool.mp
+++ b/Master/texmf-dist/metapost/context/base/mp-tool.mp
@@ -251,6 +251,7 @@ def newtransform text v = forsuffixes i=v : save i ; transform i ; endfor ; endd
def newpath text v = forsuffixes i=v : save i ; path i ; endfor ; enddef ;
def newpicture text v = forsuffixes i=v : save i ; picture i ; endfor ; enddef ;
def newstring text v = forsuffixes i=v : save i ; string i ; endfor ; enddef ;
+def newpair text v = forsuffixes i=v : save i ; pair i ; endfor ; enddef ;
%D Sometimes we don't want parts of the graphics add to the
%D bounding box. One way of doing this is to save the bounding
diff --git a/Master/texmf-dist/metapost/context/font/punkfont-bold.mp b/Master/texmf-dist/metapost/context/font/punkfont-bold.mp
new file mode 100644
index 00000000000..1c62963f9aa
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/font/punkfont-bold.mp
@@ -0,0 +1,4 @@
+boolean bold_punk ; bold_punk := true ;
+
+input "punkfont-definitions.mp" ;
+input "punkfont-characters.mp" ;
diff --git a/Master/texmf-dist/metapost/context/font/punkfont-boldslanted.mp b/Master/texmf-dist/metapost/context/font/punkfont-boldslanted.mp
new file mode 100644
index 00000000000..3e5fa1561df
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/font/punkfont-boldslanted.mp
@@ -0,0 +1,5 @@
+boolean bold_punk ; bold_punk := true ;
+boolean slanted_punk ; slanted_punk := true ;
+
+input "punkfont-definitions.mp" ;
+input "punkfont-characters.mp" ;
diff --git a/Master/texmf-dist/metapost/context/font/punkfont-characters.mp b/Master/texmf-dist/metapost/context/font/punkfont-characters.mp
new file mode 100644
index 00000000000..da0015b02b4
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/font/punkfont-characters.mp
@@ -0,0 +1,726 @@
+initialize_punk_upper ;
+
+beginpunkchar("A",13,1,2);
+z1=pp(1.5u,0); z2=(.5w,1.1h); z3=pp(w-1.5u,0);
+pd z1; pd z3; draw z1--z2--z3; % left and right diagonals
+z4=pp .3[z1,z2]; z5=pp .3[z3,z2]; pd z4; pd z5; draw z4--z5; % crossbar
+endchar;
+
+beginpunkchar("B",12,1,1);
+z1=pp(2u,0); z2=pp(2u,.6h); z3=pp(2u,h); pd z1; pd z3; draw z1--z3; % stem
+z1.5=pp(w-u,.5y2); z2.5=pp(w-u,.5[y2,y3]); draw z2--z2.5--z3; % upper lobe
+draw flex(z2,z1.5,z1); % lower lobe
+endchar;
+
+beginpunkchar("C",13,1,2);
+z1=pp(w-2u,.8h); z2=pp(.6w,h); z3=pp(u,.5h); z4=(.6w,0); z5=(w-2u,.2h);
+pd z1; pd z5; draw z1..z2..z3..z4..z5; % arc
+endchar;
+
+beginpunkchar("D",14,1,2);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-u,.6h);
+pd z1; pd z2; draw flex(z1,z3,z2); % lobe
+draw z1--z2; % stem
+endchar;
+
+beginpunkchar("E",12,.5,1);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2.5u,h); z4=pp(w-2u,0);
+pd z3; pd z4; draw z4--z1--z2--z3; % stem and arms
+z5=pp(2u,.6h); z6=pp(w-3u,.6h); pd z5; pd z6; draw z5--z6; % crossbar
+endchar;
+
+beginpunkchar("F",12,.5,2);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2u,h);
+pd z1; pd z3; draw z1--z2--z3; % stem and arm
+z5=pp(2u,.6h); z6=pp(w-3u,.6h); z4=pp .5[z5,z6]-(0,.1h);
+pd z5; pd z6; draw flex (z5,z4,z6); % crossbar
+endchar;
+
+beginpunkchar("G",13,.5,.5);
+z1=pp(w-2u,.8h); z2=pp(.6w,h); z3=pp(u,.5h); z4=pp(.6w,0); z5=(w-2u,0);
+pd z1; draw z1..z2..z3..z4---z5; % arc
+z6=pp(.5[u,x5],.4h); pd z6; pd z5; draw z6--(pp(x5,y6))--z5; % spur
+endchar;
+
+beginpunkchar("H",14,1,.5);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2u,0); z4=pp(w-2u,h);
+z5=pp(2u,.6h); z6=pp(w-2u,.6h);
+pd z1; pd z2; pd z3; pd z4; draw z1--z2; draw flex(z3,z6,z4); % stems
+pd z5; draw z5--z6; % crossbar
+endchar;
+
+beginpunkchar("I",5,1,2);
+z1=pp(.5w,0); z2=(.5w,1/3h); z3=(.5w,2/3h); z4=(.5w,h);
+pd z1; pd z4; draw flex(z1,z2,z3,z4); % stem
+endchar;
+
+beginpunkchar("J",9,1,2);
+z1=pp(w-2u,h); z2=pp(w-2u,-.1h); z3=pp(u,0);
+pd z1; pd z3; draw z1--z2--z3; % arc
+endchar;
+
+beginpunkchar("K",14,1,2);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(2u,1/3h); z4=pp(w-1.5u,h);
+pd z1; pd z2; draw z1--z2; % stem
+pd z3; pd z4; draw z3--z4; % upper diagonal
+z6=pp(w-u,0); z5=1/3[z3,z4];
+pd z6; draw flex(z5,.8[z1,2/3[z5,z6] ],z6);% lower diagonal
+endchar;
+
+beginpunkchar("L",11,1,2);
+z1=pp(2u,h); z2=pp(2u,0); z3=pp(w-1.5u,0);
+pd z1; pd z3; draw z1--z2--z3; % stem and arm
+endchar;
+
+beginpunkchar("M",17,.5,2);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(.5w,0); z4=pp(w-2u,h); z5=pp(w-2u,0);
+pd z1; pd z5; draw z1--z2--z3--z4--z5; % stems and diagonals
+endchar;
+
+beginpunkchar("N",13,.75,2);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2u,0); z4=pp(w-2u,h);
+pd z1; pd z4; draw z1--z2--z3--z4; % stems and diagonals
+endchar;
+
+beginpunkchar("O",12,.5,2);
+z1=pp(.5w,h); z2=pp(u,.55h); z3=pp(.5w,0); z4=pp(w-u,.55h);
+pd z1; draw z1{left}..z2..z3..z4..z1; % bowl
+endchar;
+
+beginpunkchar("P",13,1,2);
+z1=pp(2u,0); z2=pp(2u,1.1h); z3=pp(2u,.5h); z4=pp(w,.6[y3,y2]);
+pd z1; pd z3; draw z1--z2--z4--z3; % stem and bowl
+endchar;
+
+beginpunkchar("Q",14,.5,2);
+z1=pp(.5w,h); z2=pp(u,.55h); z3=pp(.5w,0); z4=pp(w-u,.55h);
+pd z1; draw z1{curl 2}..z2..z3..z4..z1; % bowl
+z5=pp(.4w,.2h); z6=pp(w-u,-.1h); z7=pp(.5[x5,x6],-.2h);
+pd z5; pd z6; draw z5--z7--z6; % tail
+endchar;
+
+beginpunkchar("R",16,1,2);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-u,.6[y2,y4]); z4=pp(2u,.5h); z5=pp(w-1.5u,0);
+pd z1; pd z2; pd z5; draw z1--flex(z2,z3,z4)--z5; % stem, bowl, and diagonal
+endchar;
+
+beginpunkchar("S",11,.3,1);
+z1=pp(w-2u,.9h); z2=pp(.5w,h); z3=pp(u,.7h); z4=.6[z6,z2];
+z5=pp(w-u,.35h); z6=pp(.5w,u); z7=pp(u,.2h);
+pd z1; pd z7; draw z1--z2...z3..z4..z5...z6--z7; % stroke
+endchar;
+
+beginpunkchar("T",13,.75,2);
+z1=pp(u,h); z2=pp(w-u,h); z3=pp(.5w,0);
+pd z1; pd z2; pd z3; draw z1--z2; % arms
+draw .5[z1,z2]--z3; % stem
+endchar;
+
+beginpunkchar("U",13,.3,2);
+z1=pp(2u,h); z2=pp(2u,.2h); z3=pp(.5w,0); z4=pp(w-2u,.2h); z5=pp(w-2u,h);
+pd z1; pd z5; draw z1---z2...z3{z4-z2}...z4---z5; % stroke
+endchar;
+
+beginpunkchar("V",13,1,2);
+z1=pp(1.5u,h); z2=pp(.5w,0); z3=pp(w-1.5u,h);
+pd z1; pd z3; draw z1--z2--z3; % diagonals
+endchar;
+
+beginpunkchar("W",18,1,2);
+z1=pp(1.5u,h); z2=pp(.5[x1,x3],0); z3=pp(.5w,.8h); z4=pp(.5[x3,x5],0);
+z5=pp(w-1.5u,h);
+pd z1; pd z5; draw z1--z2--z3--z4--z5; % diagonals
+endchar;
+
+beginpunkchar("X",13,1,1);
+z1=pp(1.5u,h); z2=pp(w-1.5u,0); z3=pp(1.5u,0); z4=pp(w-2.5u,h);
+pd z1; pd z2; draw z1--z2; % main diagonal
+pd z3; pd z4; draw z3--z4; % cross diagonal
+endchar;
+
+beginpunkchar("Y",13,1,2);
+z1=pp(1.5u,h); z2=pp(w-1.5u,h); z3=pp(.5w,.5h); z4=pp(.5w,0);
+pd z1; pd z2; pd z4; draw z1--z3--z4; % stem and left diagonal
+draw z2--z3; % right diagonal
+endchar;
+
+beginpunkchar("Z",11,1,2);
+z1=pp(1.5u,h); z2=pp(w-2.5u,h); z3=pp(1.5u,0); z4=pp(w-1.5u,0);
+pd z1; pd z4; draw z1--z2--z3--z4; % diagonals
+endchar;
+
+beginpunkchar(198,16,1,2); % \AE
+z1=pp(1.5u,0); z2=pp(.6w,h); z3=pp(w-1.5u,h);
+pd z1; pd z3; draw z1--z2--z3; % left diagonal and upper arm
+z4=pp .3[z1,z2]; z5=pp(.6w,0); z6=pp(w-2u,.3h);
+pd z4; pd z6; draw z4--z6; % crossbar
+z7=pp(w-u,0); pd z2; pd z7; draw z2--z5--z7; % stem and lower arm
+endchar;
+
+beginpunkchar(338,18,1,2); % \OE
+z1=pp(.5w,h); z2=pp(u,.4h); z3=pp(.5w,0);
+pd z1; draw z1..z2..{right}z3; % bowl
+z4=pp(w-1.5u,h); z5=pp(w-2u,.4h); z6=pp(w-u,0);
+pd z4; pd z6; draw z4--z1--z3--z6; % arms and stem
+pd z5; draw z5--.4[z3,z1]; % crossbar
+endchar;
+
+beginpunkchar(216,14,1,1); % \O
+z1=pp(.5w,h); z2=pp(u,.5h); z3=pp(.5w,0); z4=pp(w-u,.5h);
+z5=pp(w-2u,1.1h); z6=pp(2u,-.1h);
+pd z1; pd z6; draw z1..z2..z3..z4..z5--z6; % bowl and diagonal
+endchar;
+
+beginpunkchar(915,11,1,2); % $\Gamma$
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-1.5u,h);
+pd z1; pd z3; draw z1--z2--z3; % stem and arm
+endchar;
+
+beginpunkchar(916,15,1,2); % $\Delta$
+z1=pp(u,0); z2=pp(.5w,h); z3=pp(w-u,0);
+pd z1; draw z1--z2..tension 5..z3..tension 5..z1; % triangle
+endchar;
+
+beginpunkchar(920,15,.5,2); % $\Theta$
+z1=pp(.5w,h); z2=pp(u,.6h); z3=pp(.5w,0); z4=pp(w-u,.6h);
+pd z1; draw z1..tension.8..z2..z3..z4..tension.8..z1; % bowl
+z5=pp(x2+2u,.4h); z6=pp(x4-2u,.4h); pd z5; pd z6; draw z5--z6; % bar
+endchar;
+
+beginpunkchar(923,12,1,2); % $\Lambda$
+z1=pp(u,0); z2=pp(.5w,h); z3=pp(w-u,0);
+pd z1; pd z3; draw z1--z2--z3; % diagonals
+endchar;
+
+beginpunkchar(926,12,1,1); % $\Xi$
+z1=pp(u,h); z2=pp(w-u,h); pd z1; pd z2; draw z1--z2; % upper arm
+z3=pp(2u,.55h); z4=pp(w-2u,.55h); pd z3; pd z4; draw z3--z4; % bar
+z5=pp(u,0); z6=pp(w-u,0); pd z5; pd z6; draw z5--z6; % lower arm
+endchar;
+
+beginpunkchar(928,13,1,.5); % $\Pi$
+z1=pp(1.5u,0); z2=pp(1.5u,h); z3=pp(w-1.5u,h); z4=pp(w-1.5u,0);
+pd z1; pd z4; draw z1--z2--z3--z4; % stems and bar
+endchar;
+
+beginpunkchar(931,13,1,1); % $\Sigma$
+z1=pp(w-u,h); z2=pp(u,h); z3=pp(.5w-u,.5h); z4=pp(u,0); z5=pp(w-u,0);
+pd z1; pd z5; draw z1--z2{.5[z4,z5]-z2}..z3--z4--z5; % arms and diagonals
+endchar;
+
+beginpunkchar(933,15,1,.5); % $\Upsilon$
+z1=pp(u,.8h); z2=pp(.3w,h); z3=pp(.5w,.5h); z4=pp(.5w,0);
+pd z1; pd z4; draw z1..z2..tension2..z3---z4; % left arc and stem
+z5=pp(w-u,.8h); z6=pp(.7w,h);
+pd z5; draw z5..z6..tension2..{z4-z3}z3; % right arc
+endchar;
+
+beginpunkchar(934,13,1,2); % $\Phi$
+z1=pp(.5w,h); z2=pp(.5w,0); pd z1; pd z2; draw z1--z2; % stem
+z3=pp(.5w,2/3h); z4=pp(u,.5h); z5=pp(.5w,1/4h); z6=pp(w-u,.5h);
+pd z3; draw z3..z4..z5..z6..z3; % bowl
+endchar;
+
+beginpunkchar(936,14,1,1); % $\Psi$
+z1=pp(.5w,h); z2=pp(.5w,0); pd z1; pd z2; draw z1--z2; % stem
+z3=pp(u,.8h); z4=pp(.5w,.2h); z5=pp(w-u,.8h);
+pd z3; pd z5; draw z3{.4[z1,z2]-z3}..z4{right}..{z5-.4[z1,z2]}z5; % stroke
+endchar;
+
+beginpunkchar(937,13,1,2); % $\Omega$
+z1=pp(u,0); z2=pp(1/3w,0); z3=pp(u,2/3h); z4=pp(.5w,h);
+z5=pp(w-u,2/3h); z6=pp(2/3w,0); z7=pp(w-u,0);
+pd z1; pd z7; draw z1--z2{up}..z3..z4..z5..{down}z6--z7; % bowl and arms
+endchar;
+
+beginpunkchar(".",5,1,2);
+pd pp(.5w,0); % dot
+endchar;
+
+beginpunkchar(",",5,.5,.5);
+z1=pp(.5w,0); z2=pp(w-u,-.1h); z3=pp(.5w,-.3h);
+pd z1; pd z3; draw z1--z2--z3; % stroke
+endchar;
+
+beginpunkchar(":",5,1,.5);
+pd pp(.5w,0); pd pp(.5w,.4h); % dots
+endchar;
+
+beginpunkchar(";",5,.5,.5);
+z1=pp(.5w,0); z2=pp(w-u,-.1h); z3=pp(.5w,-.3h);
+pd z1; pd z3; draw z1--z2--z3; % stroke
+pd pp(.5w,.4h); % dot
+endchar;
+
+beginpunkchar("!",5,.5,.5);
+pd pp(.5w,0); % dot
+z1=pp(.5w,1.05h); z2=pp(.5w,.3h); pd z1; pd z2; draw z1--z2; % stem
+endchar;
+
+beginpunkchar(161,5,.5,.5); % spanish inverted !
+pd pp(.5w,.9h); % dot
+z1=pp(.5w,-.1h); z2=pp(.5w,.6h); pd z1; pd z2; draw z1--z2; % stem
+endchar;
+
+beginpunkchar("?",9,1,.5);
+z1=pp(1.5u,.8h); z2=pp(.5w,h); z3=pp(w-u,.8h); z4=pp(.5w,.3h);
+pd z1; pd z4; draw z1..z2..z3..{down}z4; % arc and stem
+pd pp(.5w,0); % dot
+endchar;
+
+beginpunkchar(191,9,1,.5); % spanish inverted ?
+z1=pp(1.5u,.1h); z2=pp(.5w,-.1h); z3=pp(w-u,.1h); z4=pp(.5w,.6h);
+pd z1; pd z4; draw z1..z2..z3..{up}z4; % arc and stem
+pd pp(.5w,.9h); % dot
+endchar;
+
+beginpunkchar("&",14,.5,.5);
+z1=pp(w-2u,h); z2=pp(u,h); z3=pp(3u,0); z5=pp(w-u,.6h); z6=pp(w-2u,0);
+pd z1; pd z5; draw z1--z2--z3--z5; % arms and stem
+draw z1--.5[z2,z3]; pd z6; draw z6--.6[z3,z5]; % diagonals
+endchar;
+
+beginpunkchar("$",12,.5,.5);
+z1=pp(w-1.5u,.7h); z2=pp(.5w,h); z3=pp(u,.7h); z4=.5[z3,z5];
+z5=pp(w-u,.3h); z6=pp(.5w,0); z7=pp(u,.3h);
+pd z1; pd z7; draw z1..z2..z3..z4..z5..z6..z7; % stroke
+z8=z2+(0,.1h); pd z8; draw z8--z6; % stem
+endchar;
+
+beginpunkchar("%",18,.5,.5);
+z1=pp(3.5u,1.1h); z2=pp(u,.8h); z3=pp(3.5u,.5h); z4=pp(6u,.8h);
+z5=pp(w-3.5u,.5h); z6=pp(w-6u,.2h); z7=pp(w-3.5u,-.1h); z8=pp(w-u,.2h);
+pd z1; draw z1..z2..z3..z4..z1; % upper bowl
+pd z5; draw z5..z6..z7..z8..z5; % lower bowl
+z9=pp(w-3u,1.1h); z0=pp(3u,-.1h); pd z0; draw z9--z0; % diagonal
+draw z1{z5-z1}..z9; % link
+endchar;
+
+beginpunkchar("@",18,1,.5);
+z1=pp(2u,0); z2=pp(1/3w,.7h); z3=pp(w-6u,0);
+z4=pp(w,.3h); z5=pp(1/3w,h); z6=pp(u,.5h); z7=.7[z2,z3];
+pd z1; pd z7; draw z1--z2--z3{right}..z4..z5..z6..z7; % diagonals and stroke
+endchar;
+
+beginpunkchar("-",7,.5,.5);
+z1=pp(u,.4h); z2=pp(w-u,.5h); pd z1; pd z2; draw z1--z2; % bar
+endchar;
+
+beginpunkchar(8211,9,.5,.5); % --
+z1=pp(0,.5h); z2=pp(w,.4h); pd z1; pd z2; draw z1--z2; % bar
+endchar;
+
+beginpunkchar(8212,18,.5,.5); % ---
+z1=pp(0,.5h); z2=pp(w,.4h); pd z1; pd z2; draw z1--z2; % bar
+endchar;
+
+beginpunkchar("+",9,.5,1);
+z1=pp(0,.5h); z2=pp(w,.5h); pd z1; pd z2; draw z1--z2; % bar
+z3=pp(.5w,.1h); z4=pp(.5w,.9h); pd z3; pd z4; draw z3--z4; % stem
+endchar;
+
+beginpunkchar("*",13,.5,1);
+z0=pp(.5w,1.1h); z1=pp(u,.9h); z2=pp(2u,.3h); z3=pp(w-u,.3h); z4=pp(w-u,.9h);
+pd z0; draw z0--z2..1/3[.5[z2,z4],z0]..z4--z1--z3--z0; % star
+endchar;
+
+beginpunkchar(39,5,.5,1.5); % ' apostrofe HH/TH (to be checked)
+z1=pp(w/2,h); z2=pp(w/2+u,.85h); z3=pp(w/2,2/3h);
+pd z1; pd z3; draw z1..z2..z3; % stroke
+endchar;
+
+beginpunkchar(34,9,1,1.5); % " HH/TH (to be checked)
+z1=pp(1.5u,h); z2=pp(1.5u,.6h); z3=pp(w-1.5u,h); z4=pp(w-1.5u,.6h);
+pd z1; pd z2; pd z3; pd z4; draw z1--z2; draw z3--z4;
+endchar;
+
+beginpunkchar(8216,5,.3,.5); % `
+z1=pp(w-1.5u,h); z2=pp(u,.85h); z3=pp(w-u,2/3h);
+pd z1; pd z3; draw z1--z2--z3; % stroke
+endchar;
+
+beginpunkchar(8217,5,.3,.5); % '
+z1=pp(1.5u,h); z2=pp(w-u,.85h); z3=pp(u,2/3h);
+pd z1; pd z3; draw z1--z2--z3; % stroke
+endchar;
+
+beginpunkchar(8220,9,.3,.5); % `` quotedblleft
+z1=pp(.5w+.5u,h); z2=pp(w-u,.6h); z3=pp(u,.95h);
+pd z1; pd z3; draw z1--z2--z3; % stroke
+endchar;
+
+beginpunkchar(8221,9,.3,.5); % '' quotedblright
+z1=pp(.5w-.5u,h); z2=pp(u,.6h); z3=pp(w-u,.95h);
+pd z1; pd z3; draw z1--z2--z3; % stroke
+endchar;
+
+beginpunkchar("(",7,.5,.5);
+z1=pp(w-u,h); z2=pp(u,.5h); z3=pp(w-u,0);
+pd z1; pd z3; draw z1..z2..z3; % stroke
+endchar;
+
+beginpunkchar(")",7,.5,.5);
+z1=pp(u,h); z2=pp(w-u,.5h); z3=pp(u,0); pd z1; pd z3; draw z1..z2..z3; % stroke
+endchar;
+
+beginpunkchar("[",8,.5,.5);
+z1=pp(w-u,h); z2=pp(.5w,h); z3=pp(.5w,0); z4=pp(w-u,0);
+pd z1; pd z4; draw z1--z2--z3--z4; % bars and stem
+endchar;
+
+beginpunkchar("]",8,.5,.5);
+z1=pp(u,h); z2=pp(.5w,h); z3=pp(.5w,0); z4=pp(u,0);
+pd z1; pd z4; draw z1--z2--z3--z4; % bars and stem
+endchar;
+
+beginpunkchar("<",9,.5,.5);
+z1=pp(w-u,.9h); z2=pp(u,.5h); z3=pp(w-u,.1h);
+pd z1; pd z3; draw z1--z2--z3; % diagonals
+endchar;
+
+beginpunkchar(">",9,.5,.5);
+z1=pp(u,.9h); z2=pp(w-u,.5h); z3=pp(u,.1h);
+pd z1; pd z3; draw z1--z2--z3; % diagonals
+endchar;
+
+beginpunkchar("{",10,.5,.5); % HH/TH
+z1=pp(w-2u,h); z3=pp(2u,.5h); z5=pp(w-2u,0);
+z2=pp(w-4u,.6h); z4=(w-4u,.4h);
+pd z1; pd z3; pd z5; draw z1{left}..z2--z3 & z3--z4..{right}z5;
+endchar;
+
+beginpunkchar("}",10,.5,.5); % HH/TH
+z1=pp(2u,h); z3=pp(w-2u,.5h); z5=pp(2u,0);
+z2=pp(4u,.6h); z4=(4u,.4h);
+pd z1; pd z3; pd z5; draw z1{right}..z2--z3 & z3--z4..{left}z5;
+endchar;
+
+beginpunkchar("=",9,.5,.5);
+z5=pp(u,2/3h); z6=pp(w-u,2/3h); pd z5; pd z6; draw z5--z6; % upper bar
+z7=pp(u,1/3h); z8=pp(w-u,1/3h); pd z7; pd z8; draw z7--z8; % lower bar
+endchar;
+
+beginpunkchar("#",15,.5,.5);
+z1=pp(.5w,h); z2=pp(3u,0); z3=pp(w-3u,h); z4=pp(.5w,0);
+pd z2; pd z3; draw z3--z1--z2; draw z3--z4--z2; % diagonals (linked)
+z5=pp(u,2/3h); z6=pp(w-u,2/3h); pd z5; pd z6; draw z5--z6; % upper bar
+z7=pp(u,1/3h); z8=pp(w-u,1/3h); pd z7; pd z8; draw z7--z8; % lower bar
+endchar;
+
+beginpunkchar("/",9,1,1);
+z1=pp(1.5u,-.05h); z2=pp(w-1.5u,1.05h); pd z1; pd z2; draw z1--z2; % diagonal
+endchar;
+
+beginpunkchar("\",9,1,1); % HH/TH
+z1=pp(1.5u,1.05h); z2=pp(w-1.5u,-.05h); pd z1; pd z2; draw z1--z2; % reverse diagonal
+endchar;
+
+
+beginpunkchar("0",9,.5,1);
+z1=pp(.5w,h); z2=pp(u,.55h); z3=pp(.5w,0); z4=pp(w-u,.55h);
+pd z1; draw z1{curl 2}..z2..z3..z4..z1; % bowl
+endchar;
+
+beginpunkchar("1",9,.3,1);
+z1=pp(2u,.7h); z2=pp(.6w,h); z3=pp(.6w,0);
+pd z1; pd z3; draw z1--z2--z3; % serif and stem
+endchar;
+
+beginpunkchar("2",9,1,1);
+z1=pp(2u,.7h); z2=pp(.5w,h); z3=pp(w-u,.6h); z4=pp(u,0); z5=pp(w-2u,0);
+pd z1; pd z5; draw z1..z2..z3..z4--z5; % stroke
+endchar;
+
+beginpunkchar("3",9,.5,.5);
+z1=pp(2u,.7h); z2=pp(.5w,h); z3=pp(w-u,.5[y2,y4]);
+z4=pp(.5w-u,.55h); z5=pp(w-u,.5[y4,y6]); z6=pp(.5w,0); z7=pp(1.5u,.2h);
+pd z1; pd z7; draw z1..z2..z3..z4&z4..z5..z6..z7; % arcs
+endchar;
+
+beginpunkchar("4",9,1,1);
+z1=pp(w-u,.3h); z2=pp(u,.3h); z3=pp(2/3w,h); z4=pp(2/3w,0);
+pd z1; pd z4; draw z1--z2--z3--z4; % stem and diagonals
+endchar;
+
+beginpunkchar("5",9,.5,.5);
+z1=pp(w-2u,h); z2=pp(2u,h); z3=pp(u,.7h); z4=pp(w-u,.5[y3,y5]);
+z5=pp(.5w,0); z6=pp(u,.2h);
+pd z1; pd z6; draw z1--z2--z3..z4..z5..z6; % stroke
+endchar;
+
+beginpunkchar("6",9,1,1);
+z1=pp(2/3w,h); z2=pp(u,.3h); z3=pp(.5w,0); z4=pp(w-u,.3h); z5=pp(.6w,.6h);
+z6=pp z2; pd z1; pd z6; draw z1..z2..z3..z4..z5--z6; % stroke
+endchar;
+
+beginpunkchar("7",9,.5,1);
+z1=pp(2u,h); z2=pp(w-.5u,h); z3=pp(.4w,0);
+pd z1; pd z3; draw z1--z2&z2..z3{down}; % stroke
+endchar;
+
+beginpunkchar("8",9,.5,.5);
+z1=pp(.5w,h); z2=pp(u,.5[y1,y3]); z3=pp(.5w,.6h); z4=pp(w-u,.5[y3,y5]);
+z5=pp(.5w,0); z6=pp(u,.5[y5,y3]); z7=pp(w-u,.5[y1,y3]);
+pd z1; draw z1{curl 8}..z2..z3..z4..z5..z6..z3..z7..z1; % stroke
+endchar;
+
+beginpunkchar("9",9,1,1);
+z1=pp(1/3w,0); z2=pp(w-u,.7h); z3=pp(.5w,h); z4=pp(u,.7h); z5=pp(.5w,.4h);
+pd z1; pd z5; draw z1..z2..z3..z4..z5; % stroke
+endchar;
+
+beginpunkchar(96,9,1,1); % \`{} grave
+z1=pp(2.5u,h); z2=pp(.6w,.8h); pd z1; pd z2; draw z1--z2; % diagonal
+endchar;
+
+beginpunkchar(180,9,1,1); % \'{} acute
+z1=pp(w-2.5u,h); z2=pp(.4w,.8h); pd z1; pd z2; draw z1--z2; % diagonal
+endchar;
+
+beginpunkchar(710,13,1,1); % \^{} circumflex
+z1=pp(2.5u,.8h); z2=pp(.5w,h); z3=(w-2.5u,.8h);
+pd z1; pd z3; draw z1--z2--z3; % diagonals
+endchar;
+
+beginpunkchar(711,13,1,1); % \v{} caron
+z1=pp(2.5u,.9h); z2=pp(.5w,.7h); z3=pp(w-2.5u,.9h);
+pd z1; pd z3; draw z1--z2--z3; % diagonals
+endchar;
+
+beginpunkchar(728,11,1,1); % \u{} breve
+z1=pp(2u,h); z2=pp(.5w,.75h); z3=pp(w-2u,h);
+pd z1; pd z3; draw flex(z1,z2,z3); % stroke
+endchar;
+
+beginpunkchar(175,12,1,1); % \={} macron
+z1=pp(u,.8h); z2=pp(w-u,.8h); pd z1; pd z2; draw z1--z2; % bar
+endchar;
+
+beginpunkchar(729,5,1,1); % \.{}
+pd pp(.5w,.9h); % dot
+endchar;
+
+beginpunkchar(168,13,1,1); % \"{} diaeresis
+pd pp(1/5w,.9h); pd pp(4/5w,.9h); % dots
+endchar;
+
+beginpunkchar(732,13,1,1); % \~{} tilde
+z1=pp(u,.75h); z2=pp(w-u,.9h); pd z1; pd z2; draw z1{up}..{up}z2; % stroke
+endchar;
+
+beginpunkchar(733,13,1,1); % \H{} hungarumlaut
+z1=pp(4u,h); z2=pp(2.5u,.7h); z3=pp(w-2u,h); z4=pp(w-3.5u,.7h);
+pd z1; pd z3; draw z1--z2--z4--z3; % diagonals (linked)
+endchar;
+
+beginpunkchar(730,13,0,0); % Scandinavian loop, for \AA\ and \aa (ring)
+z0=(.5w,.66h); % point $z^2$ of lowercase A
+z1=(.5w,.9h); draw z0{z0-(1.5u,0)}..z1..{(w-1.5u,0)-z0}z0; % loop
+endchar;
+
+beginpunkchar(184,13,.5,.5); % Cedilla, for \c c
+z1=(.6w,0); z2=pp(.6w,-.1h); z3=pp(2.5u,-.1h);
+pd z3; draw z1--z2--z3; % stroke
+endchar;
+
+initialize_punk_lower ;
+
+beginpunkchar(305,5,1,2); % dotless I
+z1=pp(.5w,0); z2=(.5w,1/3h); z3=(.5w,2/3h); z4=(.5w,h);
+pd z1; pd z4; draw flex(z1,z2,z3,z4); % stem
+endchar;
+
+beginpunkchar(567,9,1,2); % dotless J
+z1=pp(w-2u,h); z2=pp(w-2u,-.1h); z3=pp(u,0);
+pd z1; pd z3; draw z1--z2--z3; % arc
+endchar;
+
+beginpunkchar(223,18,.3,1); % German SS
+z1=pp(.5w-u,.9h); z2=pp(1/3w,h); z3=pp(u,.7h); z4=.6[z6,z2];
+z5=pp(.5w,.35h); z6=pp(1/3w,u); z7=pp(u,.2h);
+pd z1; pd z7; draw z1--z2...z3..z4..z5...z6--z7; % left stroke
+for i=1 upto 7: z[i+10]=pp(z[i] shifted (.5w-u,0)); endfor
+pd z11; pd z17; draw z11--z12...z13..z14..z15...z16--z17; % right stroke
+endchar;
+
+beginpunkchar("a",13,1,2);
+z1=pp(1.5u,0); z2=(.5w,1.1h); z3=pp(w-1.5u,0);
+pd z1; pd z3; draw z1--z2--z3; % left and right diagonals
+z4=pp .3[z1,z2]; z5=pp .3[z3,z2]; pd z4; pd z5; draw z4--z5; % crossbar
+endchar;
+
+beginpunkchar("b",12,1,1);
+z1=pp(2u,0); z2=pp(2u,.6h); z3=pp(2u,h); pd z1; pd z3; draw z1--z3; % stem
+z1.5=pp(w-u,.5y2); z2.5=pp(w-u,.5[y2,y3]); draw z2--z2.5--z3; % upper lobe
+draw flex(z2,z1.5,z1); % lower lobe
+endchar;
+
+beginpunkchar("c",13,1,2);
+z1=pp(w-2u,.8h); z2=pp(.6w,h); z3=pp(u,.5h); z4=(.6w,0); z5=(w-2u,.2h);
+pd z1; pd z5; draw z1..z2..z3..z4..z5; % arc
+endchar;
+
+beginpunkchar("d",14,1,2);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-u,.6h);
+pd z1; pd z2; draw flex(z1,z3,z2); % lobe
+draw z1--z2; % stem
+endchar;
+
+beginpunkchar("e",12,.5,1);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2.5u,h); z4=pp(w-2u,0);
+pd z3; pd z4; draw z4--z1--z2--z3; % stem and arms
+z5=pp(2u,.6h); z6=pp(w-3u,.6h); pd z5; pd z6; draw z5--z6; % crossbar
+endchar;
+
+beginpunkchar("f",12,.5,2);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2u,h);
+pd z1; pd z3; draw z1--z2--z3; % stem and arm
+z5=pp(2u,.6h); z6=pp(w-3u,.6h); z4=pp .5[z5,z6]-(0,.1h);
+pd z5; pd z6; draw flex (z5,z4,z6); % crossbar
+endchar;
+
+beginpunkchar("g",13,.5,.5);
+z1=pp(w-2u,.8h); z2=pp(.6w,h); z3=pp(u,.5h); z4=pp(.6w,0); z5=(w-2u,0);
+pd z1; draw z1..z2..z3..z4---z5; % arc
+z6=pp(.5[u,x5],.4h); pd z6; pd z5; draw z6--(pp(x5,y6))--z5; % spur
+endchar;
+
+beginpunkchar("h",14,1,.5);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2u,0); z4=pp(w-2u,h);
+z5=pp(2u,.6h); z6=pp(w-2u,.6h);
+pd z1; pd z2; pd z3; pd z4; draw z1--z2; draw flex(z3,z6,z4); % stems
+pd z5; draw z5--z6; % crossbar
+endchar;
+
+beginpunkchar("i",5,1,2);
+z1=pp(.5w,0); z2=(.5w,1/3h); z3=(.5w,2/3h); z4=(.5w,h);
+pd z1; pd z4; draw flex(z1,z2,z3,z4); % stem
+endchar;
+
+beginpunkchar("j",9,1,2);
+z1=pp(w-2u,h); z2=pp(w-2u,-.1h); z3=pp(u,0);
+pd z1; pd z3; draw z1--z2--z3; % arc
+endchar;
+
+beginpunkchar("k",14,1,2);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(2u,1/3h); z4=pp(w-1.5u,h);
+pd z1; pd z2; draw z1--z2; % stem
+pd z3; pd z4; draw z3--z4; % upper diagonal
+z6=pp(w-u,0); z5=1/3[z3,z4];
+pd z6; draw flex(z5,.8[z1,2/3[z5,z6] ],z6);% lower diagonal
+endchar;
+
+beginpunkchar("l",11,1,2);
+z1=pp(2u,h); z2=pp(2u,0); z3=pp(w-1.5u,0);
+pd z1; pd z3; draw z1--z2--z3; % stem and arm
+endchar;
+
+beginpunkchar("m",17,.5,2);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(.5w,0); z4=pp(w-2u,h); z5=pp(w-2u,0);
+pd z1; pd z5; draw z1--z2--z3--z4--z5; % stems and diagonals
+endchar;
+
+beginpunkchar("n",13,.75,2);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2u,0); z4=pp(w-2u,h);
+pd z1; pd z4; draw z1--z2--z3--z4; % stems and diagonals
+endchar;
+
+beginpunkchar("o",12,.5,2);
+z1=pp(.5w,h); z2=pp(u,.55h); z3=pp(.5w,0); z4=pp(w-u,.55h);
+pd z1; draw z1{left}..z2..z3..z4..z1; % bowl
+endchar;
+
+beginpunkchar("p",13,1,2);
+z1=pp(2u,0); z2=pp(2u,1.1h); z3=pp(2u,.5h); z4=pp(w,.6[y3,y2]);
+pd z1; pd z3; draw z1--z2--z4--z3; % stem and bowl
+endchar;
+
+beginpunkchar("q",14,.5,2);
+z1=pp(.5w,h); z2=pp(u,.55h); z3=pp(.5w,0); z4=pp(w-u,.55h);
+pd z1; draw z1{curl 2}..z2..z3..z4..z1; % bowl
+z5=pp(.4w,.2h); z6=pp(w-u,-.1h); z7=pp(.5[x5,x6],-.2h);
+pd z5; pd z6; draw z5--z7--z6; % tail
+endchar;
+
+beginpunkchar("r",16,1,2);
+z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-u,.6[y2,y4]); z4=pp(2u,.5h); z5=pp(w-1.5u,0);
+pd z1; pd z2; pd z5; draw z1--flex(z2,z3,z4)--z5; % stem, bowl, and diagonal
+endchar;
+
+beginpunkchar("s",11,.3,1);
+z1=pp(w-2u,.9h); z2=pp(.5w,h); z3=pp(u,.7h); z4=.6[z6,z2];
+z5=pp(w-u,.35h); z6=pp(.5w,u); z7=pp(u,.2h);
+pd z1; pd z7; draw z1--z2...z3..z4..z5...z6--z7; % stroke
+endchar;
+
+beginpunkchar("t",13,.75,2);
+z1=pp(u,h); z2=pp(w-u,h); z3=pp(.5w,0);
+pd z1; pd z2; pd z3; draw z1--z2; % arms
+draw .5[z1,z2]--z3; % stem
+endchar;
+
+beginpunkchar("u",13,.3,2);
+z1=pp(2u,h); z2=pp(2u,.2h); z3=pp(.5w,0); z4=pp(w-2u,.2h); z5=pp(w-2u,h);
+pd z1; pd z5; draw z1---z2...z3{z4-z2}...z4---z5; % stroke
+endchar;
+
+beginpunkchar("v",13,1,2);
+z1=pp(1.5u,h); z2=pp(.5w,0); z3=pp(w-1.5u,h);
+pd z1; pd z3; draw z1--z2--z3; % diagonals
+endchar;
+
+beginpunkchar("w",18,1,2);
+z1=pp(1.5u,h); z2=pp(.5[x1,x3],0); z3=pp(.5w,.8h); z4=pp(.5[x3,x5],0);
+z5=pp(w-1.5u,h);
+pd z1; pd z5; draw z1--z2--z3--z4--z5; % diagonals
+endchar;
+
+beginpunkchar("x",13,1,1);
+z1=pp(1.5u,h); z2=pp(w-1.5u,0); z3=pp(1.5u,0); z4=pp(w-2.5u,h);
+pd z1; pd z2; draw z1--z2; % main diagonal
+pd z3; pd z4; draw z3--z4; % cross diagonal
+endchar;
+
+beginpunkchar("y",13,1,2);
+z1=pp(1.5u,h); z2=pp(w-1.5u,h); z3=pp(.5w,.5h); z4=pp(.5w,0);
+pd z1; pd z2; pd z4; draw z1--z3--z4; % stem and left diagonal
+draw z2--z3; % right diagonal
+endchar;
+
+beginpunkchar("z",11,1,2);
+z1=pp(1.5u,h); z2=pp(w-2.5u,h); z3=pp(1.5u,0); z4=pp(w-1.5u,0);
+pd z1; pd z4; draw z1--z2--z3--z4; % diagonals
+endchar;
+
+beginpunkchar(230,16,1,2); % \ae
+z1=pp(1.5u,0); z2=pp(.6w,h); z3=pp(w-1.5u,h);
+pd z1; pd z3; draw z1--z2--z3; % left diagonal and upper arm
+z4=pp .3[z1,z2]; z5=pp(.6w,0); z6=pp(w-2u,.3h);
+pd z4; pd z6; draw z4--z6; % crossbar
+z7=pp(w-u,0); pd z2; pd z7; draw z2--z5--z7; % stem and lower arm
+endchar;
+
+beginpunkchar(339,18,1,2); % \oe
+z1=pp(.5w,h); z2=pp(u,.4h); z3=pp(.5w,0);
+pd z1; draw z1..z2..{right}z3; % bowl
+z4=pp(w-1.5u,h); z5=pp(w-2u,.4h); z6=pp(w-u,0);
+pd z4; pd z6; draw z4--z1--z3--z6; % arms and stem
+pd z5; draw z5--.4[z3,z1]; % crossbar
+endchar;
+
+beginpunkchar(248,14,1,1); % \o
+z1=pp(.5w,h); z2=pp(u,.5h); z3=pp(.5w,0); z4=pp(w-u,.5h);
+z5=pp(w-2u,1.1h); z6=pp(2u,-.1h);
+pd z1; pd z6; draw z1..z2..z3..z4..z5--z6; % bowl and diagonal
+endchar;
+
+revert_punk_lower;
+
+beginpunkchar("_",12,.5,.5); % _
+z1=pp(0,-.2h); z2=pp(w,-.2h); pd z1; pd z2; draw z1--z2; % bar
+endchar;
+
+beginpunkchar("^",12,1,.5); %
+z1=pp(.5w,h); z2=pp(1.5u,.6h); z3=pp(w-1.5u,.6h);
+pd z2; pd z3; draw z2--z1--z3;
+endchar;
diff --git a/Master/texmf-dist/metapost/context/font/punkfont-definitions.mp b/Master/texmf-dist/metapost/context/font/punkfont-definitions.mp
new file mode 100644
index 00000000000..2901a9d0312
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/font/punkfont-definitions.mp
@@ -0,0 +1,115 @@
+% Remark:
+%
+% This file is a merge of the original punk files by Donald Knuth, who
+% added this comment:
+%
+% Font inspired by Gerard and Marjan Unger's lectures, Feb 1985
+%
+% The regular punk files are part of TeXLive and in metafont format. All
+% errors introduced are ours. We also changed the encoding to unicode. In
+% due time we might add a few more more characters. We still need to
+% improve some of the metrics which involves a bit of trial and error. The
+% font just covers basic latin shapes but in ConTeXt MkIV we add virtual
+% composed shapes. There is a module m-punk.tex that implements this. This
+% derivate is also used in mk.tex (mk.pdf) which is one of our tests for
+% LuaTeX. We published an article on it in the MAPS (NTG magazine).
+%
+% 2008, Taco Hoekwater & Hans Hagen
+
+if unknown punk_font_loaded :
+
+ if unknown scale_factor :
+ scale_factor := 1 ;
+ fi ;
+
+ boolean punk_font_loaded ;
+
+ punk_font_loaded := true ;
+ warningcheck := 0 ;
+ proofing := 0 ;
+ designsize := 10pt#;
+ font_identifier := "Punk Nova" ; % dedicated to Don Knuth and Hermann Zapf
+
+ ht# := 7pt# ; % height of characters
+ u# := 1/4pt# ; % unit width
+ dev# := .3pt# ; % standard deviation of punk points
+
+ if known bold_punk :
+ s# := 1.2pt# ; % extra sidebar
+ px# := 1pt# ; % horizontal thickness of pen
+ py# := .8pt# ; % vertical thickness of pen
+ dot# := 1.7pt# ; % diameter of dots
+ else :
+ s# := 0 ; % extra sidebar, ok
+ px# := .6pt# ; % horizontal thickness of pen
+ py# := .5pt# ; % vertical thickness of pen
+ dot# := 1.3pt# ; % diameter of dots
+ fi ;
+
+ pt := .1pt ;
+ mag := scale_factor * 10 ;
+ bp_per_pixel := bpppix_ * mag ;
+
+ define_pixels(u,dev) ;
+ define_blacker_pixels(px,py,dot) ;
+ define_whole_pixels(s) ;
+ xoffset := s ;
+
+ pickup pencircle xscaled px yscaled py ;
+ punk_pen := savepen ;
+ pickup pencircle scaled dot ;
+ path dot_pen_path ;
+ dot_pen_path := tensepath makepath currentpen ;
+
+ defaultcolormodel := 1 ;
+
+ if known slanted_punk :
+ dot_pen_path := dot_pen_path slanted -0.25 ;
+ extra_endchar := extra_endchar & "currentpicture := currentpicture slanted 0.25 ;" ;
+ fi ;
+
+
+ def beginpunkchar(expr c,n,h,v) = % code $c$; width is $n$ units
+ hdev := h * dev ; % modify horizontal amounts of deviation
+ vdev := v * dev ; % modify vertical amounts of deviation
+ beginchar(c,n*u#,ht#,0) ;
+ italcorr 0 ;
+ % italcorr ht#*slant;
+ pickup punk_pen
+ enddef ;
+
+ def ^ =
+ transformed currenttransform
+ enddef ;
+
+ def makebox(text rule) =
+ for y=0, h : % horizontals
+ rule((-s,y)^,(w-s,y)^) ;
+ endfor
+ for x=-s, 0, w-2s, w-s : % verticals
+ rule((x,0)^,(x,h)^) ;
+ endfor
+ enddef ;
+
+ rulepen := pensquare ;
+
+ vardef pp expr z =
+ z + (hdev * normaldeviate, vdev * normaldeviate)
+ enddef;
+
+ def pd expr z = % {\bf drawdot}
+ addto currentpicture contour dot_pen_path shifted z.t_ % withpen penspeck
+ enddef;
+
+ def initialize_punk_upper =
+ ht# := 7pt# ; dev# := .3pt# ;
+ enddef ;
+ def initialize_punk_lower =
+ sht# := ht#; sdev := dev;
+ ht# := .6ht# ; dev := .7dev ;
+ enddef ;
+ def revert_punk_lower =
+ ht# := sht#; dev := sdev;
+ enddef ;
+
+fi ;
diff --git a/Master/texmf-dist/metapost/context/font/punkfont-slanted.mp b/Master/texmf-dist/metapost/context/font/punkfont-slanted.mp
new file mode 100644
index 00000000000..5c1ff46b233
--- /dev/null
+++ b/Master/texmf-dist/metapost/context/font/punkfont-slanted.mp
@@ -0,0 +1,4 @@
+boolean slanted_punk ; slanted_punk := true ;
+
+input "punkfont-definitions.mp" ;
+input "punkfont-characters.mp" ;
diff --git a/Master/texmf-dist/metapost/context/font/punkfont.mp b/Master/texmf-dist/metapost/context/font/punkfont.mp
index e57499859c8..2a03aae81df 100644
--- a/Master/texmf-dist/metapost/context/font/punkfont.mp
+++ b/Master/texmf-dist/metapost/context/font/punkfont.mp
@@ -1,863 +1,2 @@
-% Remark:
-%
-% This file is a merge of the original punk files by Donald Knuth, who
-% added this comment:
-%
-% Font inspired by Gerard and Marjan Unger's lectures,
-% Feb 1985
-%
-% The regular punk files are part of TeXLive and in metafont format. All
-% errors introduced are ours. We also changed the encoding to unicode. In
-% due time we might add a few more more characters. We still need to
-% improve some of the metrics which involves a bit of trial and error. The
-% font just covers basic latin shapes but in ConTeXt MkIV we add virtual
-% composed shapes. There is a module m-punk.tex that implements this. This
-% derivate is also used in mk.tex (mk.pdf) which is one of our tests for
-% LuaTeX. We published an article on it in the MAPS (NTG magazine).
-%
-% 2008, Taco Hoekwater & Hans Hagen
-
-if unknown punk_font_loaded :
-
- if unknown scale_factor :
- scale_factor := 1 ;
- fi ;
-
- boolean punk_font_loaded ;
-
- punk_font_loaded := true ;
- warningcheck := 0 ;
- designsize := 10pt#;
- font_identifier := "Punk Nova" ; % dedicated to Don Knuth and Hermann Zapf
-
- ht# := 7pt# ; % height of characters
- u# := 1/4pt# ; % unit width
- % s# := 1.2pt# ; % extra sidebar
- % s# := 0.1pt# ; % extra sidebar, needed because we use the bbox currently
- s# := 0 ; % extra sidebar, ok
-% s# := 1.2pt# ; % extra sidebar
- px# := .6pt# ; % horizontal thickness of pen
- py# := .5pt# ; % vertical thickness of pen
- dot# := 1.3pt# ; % diameter of dots
- dev# := .3pt# ; % standard deviation of punk points
-
- % dot# := .8pt# ; % diameter of dots
- % px# := .3pt# ; % horizontal thickness of pen
- % py# := .2pt# ; % vertical thickness of pen
-
- % seed := sqrt2 ;
- % randomseed := seed ;
- proofing := 0 ;
- pt := .1pt ;
- mag := scale_factor * 10 ;
- bp_per_pixel := bpppix_ * mag ;
-
- define_pixels(u,dev) ;
- define_blacker_pixels(px,py,dot) ;
- define_whole_pixels(s) ;
- xoffset := s ;
-
- pickup pencircle xscaled px yscaled py ;
- punk_pen := savepen ;
- pickup pencircle scaled dot ;
- path dot_pen_path ;
- dot_pen_path := tensepath makepath currentpen ;
-
-% px# := .8pt# ; % horizontal thickness of pen
-% define_pixels(u,dev) ;
-% define_blacker_pixels(px,py,dot) ;
-% pickup pencircle xscaled 1.25px yscaled 1.25py ;
-% punk_pen := savepen ;
-% pickup pencircle scaled 1.25dot ;
-% path dot_pen_path ;
-% dot_pen_path := tensepath makepath currentpen ;
-
- defaultcolormodel := 1 ;
-
- def beginpunkchar(expr c,n,h,v) = % code $c$; width is $n$ units
- hdev := h * dev ; % modify horizontal amounts of deviation
- vdev := v * dev ; % modify vertical amounts of deviation
- beginchar(c,n*u#,ht#,0) ;
- italcorr 0 ;
- % italcorr ht#*slant;
- pickup punk_pen
- enddef ;
-
-% extra_endchar := extra_endchar & "w := w+2s ; charwd := charwd+2s# ;" ;
-% extra_endchar := extra_endchar & "setbounds currentpicture to (0,-d)--(w*1.2,-d)--(w*1.2,h)--(0,h)--cycle;" ;
-
-% extra_endchar := extra_endchar & "w := w+2s ; " ;
-% extra_endchar := extra_endchar & "w := 1.2w ; " ;
-% extra_endchar := extra_endchar & "charwd := 1.2charwd ; " ;
-% extra_endchar := extra_endchar & "setbounds currentpicture to (0,-d)--(w,-d)--(w,h)--(0,h)--cycle;" ;
-
-% todo:
-
-% extra_endchar := extra_endchar &
-% "currentpicture := currentpicture shifted (0,1pt#) ; setbounds currentpicture to " &
-% "llcorner currentpicture shifted ( 0,-1pt#) -- lrcorner currentpicture shifted ( 1pt#,-1pt#) -- " &
-% "urcorner currentpicture shifted ( 1pt#, 1pt#) -- ulcorner currentpicture shifted ( 0, 1pt#) -- cycle ; " ;
-
- def ^ =
- transformed currenttransform
- enddef ;
-
- def makebox(text rule) =
- for y=0, h : % horizontals
- rule((-s,y)^,(w-s,y)^) ;
- endfor
- for x=-s, 0, w-2s, w-s : % verticals
- rule((x,0)^,(x,h)^) ;
- endfor
- enddef ;
-
- rulepen := pensquare ;
-
- vardef pp expr z =
- z + (hdev * normaldeviate, vdev * normaldeviate)
- enddef;
-
- def pd expr z = % {\bf drawdot}
- addto currentpicture contour dot_pen_path shifted z.t_ withpen penspeck
- enddef;
-
- def initialize_punk_upper =
- ht# := 7pt# ; dev# := .3pt# ;
- enddef ;
- def initialize_punk_lower =
- sht# := ht#; sdev := dev;
- ht# := .6ht# ; dev := .7dev ;
- enddef ;
- def revert_punk_lower =
- ht# := sht#; dev := sdev;
- enddef ;
-
-fi ;
-
-
-initialize_punk_upper ;
-
-beginpunkchar("A",13,1,2);
-z1=pp(1.5u,0); z2=(.5w,1.1h); z3=pp(w-1.5u,0);
-pd z1; pd z3; draw z1--z2--z3; % left and right diagonals
-z4=pp .3[z1,z2]; z5=pp .3[z3,z2]; pd z4; pd z5; draw z4--z5; % crossbar
-endchar;
-
-beginpunkchar("B",12,1,1);
-z1=pp(2u,0); z2=pp(2u,.6h); z3=pp(2u,h); pd z1; pd z3; draw z1--z3; % stem
-z1.5=pp(w-u,.5y2); z2.5=pp(w-u,.5[y2,y3]); draw z2--z2.5--z3; % upper lobe
-draw flex(z2,z1.5,z1); % lower lobe
-endchar;
-
-beginpunkchar("C",13,1,2);
-z1=pp(w-2u,.8h); z2=pp(.6w,h); z3=pp(u,.5h); z4=(.6w,0); z5=(w-2u,.2h);
-pd z1; pd z5; draw z1..z2..z3..z4..z5; % arc
-endchar;
-
-beginpunkchar("D",14,1,2);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-u,.6h);
-pd z1; pd z2; draw flex(z1,z3,z2); % lobe
-draw z1--z2; % stem
-endchar;
-
-beginpunkchar("E",12,.5,1);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2.5u,h); z4=pp(w-2u,0);
-pd z3; pd z4; draw z4--z1--z2--z3; % stem and arms
-z5=pp(2u,.6h); z6=pp(w-3u,.6h); pd z5; pd z6; draw z5--z6; % crossbar
-endchar;
-
-beginpunkchar("F",12,.5,2);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2u,h);
-pd z1; pd z3; draw z1--z2--z3; % stem and arm
-z5=pp(2u,.6h); z6=pp(w-3u,.6h); z4=pp .5[z5,z6]-(0,.1h);
-pd z5; pd z6; draw flex (z5,z4,z6); % crossbar
-endchar;
-
-beginpunkchar("G",13,.5,.5);
-z1=pp(w-2u,.8h); z2=pp(.6w,h); z3=pp(u,.5h); z4=pp(.6w,0); z5=(w-2u,0);
-pd z1; draw z1..z2..z3..z4---z5; % arc
-z6=pp(.5[u,x5],.4h); pd z6; pd z5; draw z6--(pp(x5,y6))--z5; % spur
-endchar;
-
-beginpunkchar("H",14,1,.5);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2u,0); z4=pp(w-2u,h);
-z5=pp(2u,.6h); z6=pp(w-2u,.6h);
-pd z1; pd z2; pd z3; pd z4; draw z1--z2; draw flex(z3,z6,z4); % stems
-pd z5; draw z5--z6; % crossbar
-endchar;
-
-beginpunkchar("I",5,1,2);
-z1=pp(.5w,0); z2=(.5w,1/3h); z3=(.5w,2/3h); z4=(.5w,h);
-pd z1; pd z4; draw flex(z1,z2,z3,z4); % stem
-endchar;
-
-beginpunkchar("J",9,1,2);
-z1=pp(w-2u,h); z2=pp(w-2u,-.1h); z3=pp(u,0);
-pd z1; pd z3; draw z1--z2--z3; % arc
-endchar;
-
-beginpunkchar("K",14,1,2);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(2u,1/3h); z4=pp(w-1.5u,h);
-pd z1; pd z2; draw z1--z2; % stem
-pd z3; pd z4; draw z3--z4; % upper diagonal
-z6=pp(w-u,0); z5=1/3[z3,z4];
-pd z6; draw flex(z5,.8[z1,2/3[z5,z6] ],z6);% lower diagonal
-endchar;
-
-beginpunkchar("L",11,1,2);
-z1=pp(2u,h); z2=pp(2u,0); z3=pp(w-1.5u,0);
-pd z1; pd z3; draw z1--z2--z3; % stem and arm
-endchar;
-
-beginpunkchar("M",17,.5,2);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(.5w,0); z4=pp(w-2u,h); z5=pp(w-2u,0);
-pd z1; pd z5; draw z1--z2--z3--z4--z5; % stems and diagonals
-endchar;
-
-beginpunkchar("N",13,.75,2);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2u,0); z4=pp(w-2u,h);
-pd z1; pd z4; draw z1--z2--z3--z4; % stems and diagonals
-endchar;
-
-beginpunkchar("O",12,.5,2);
-z1=pp(.5w,h); z2=pp(u,.55h); z3=pp(.5w,0); z4=pp(w-u,.55h);
-pd z1; draw z1{left}..z2..z3..z4..z1; % bowl
-endchar;
-
-beginpunkchar("P",13,1,2);
-z1=pp(2u,0); z2=pp(2u,1.1h); z3=pp(2u,.5h); z4=pp(w,.6[y3,y2]);
-pd z1; pd z3; draw z1--z2--z4--z3; % stem and bowl
-endchar;
-
-beginpunkchar("Q",14,.5,2);
-z1=pp(.5w,h); z2=pp(u,.55h); z3=pp(.5w,0); z4=pp(w-u,.55h);
-pd z1; draw z1{curl 2}..z2..z3..z4..z1; % bowl
-z5=pp(.4w,.2h); z6=pp(w-u,-.1h); z7=pp(.5[x5,x6],-.2h);
-pd z5; pd z6; draw z5--z7--z6; % tail
-endchar;
-
-beginpunkchar("R",16,1,2);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-u,.6[y2,y4]); z4=pp(2u,.5h); z5=pp(w-1.5u,0);
-pd z1; pd z2; pd z5; draw z1--flex(z2,z3,z4)--z5; % stem, bowl, and diagonal
-endchar;
-
-beginpunkchar("S",11,.3,1);
-z1=pp(w-2u,.9h); z2=pp(.5w,h); z3=pp(u,.7h); z4=.6[z6,z2];
-z5=pp(w-u,.35h); z6=pp(.5w,u); z7=pp(u,.2h);
-pd z1; pd z7; draw z1--z2...z3..z4..z5...z6--z7; % stroke
-endchar;
-
-beginpunkchar("T",13,.75,2);
-z1=pp(u,h); z2=pp(w-u,h); z3=pp(.5w,0);
-pd z1; pd z2; pd z3; draw z1--z2; % arms
-draw .5[z1,z2]--z3; % stem
-endchar;
-
-beginpunkchar("U",13,.3,2);
-z1=pp(2u,h); z2=pp(2u,.2h); z3=pp(.5w,0); z4=pp(w-2u,.2h); z5=pp(w-2u,h);
-pd z1; pd z5; draw z1---z2...z3{z4-z2}...z4---z5; % stroke
-endchar;
-
-beginpunkchar("V",13,1,2);
-z1=pp(1.5u,h); z2=pp(.5w,0); z3=pp(w-1.5u,h);
-pd z1; pd z3; draw z1--z2--z3; % diagonals
-endchar;
-
-beginpunkchar("W",18,1,2);
-z1=pp(1.5u,h); z2=pp(.5[x1,x3],0); z3=pp(.5w,.8h); z4=pp(.5[x3,x5],0);
-z5=pp(w-1.5u,h);
-pd z1; pd z5; draw z1--z2--z3--z4--z5; % diagonals
-endchar;
-
-beginpunkchar("X",13,1,1);
-z1=pp(1.5u,h); z2=pp(w-1.5u,0); z3=pp(1.5u,0); z4=pp(w-2.5u,h);
-pd z1; pd z2; draw z1--z2; % main diagonal
-pd z3; pd z4; draw z3--z4; % cross diagonal
-endchar;
-
-beginpunkchar("Y",13,1,2);
-z1=pp(1.5u,h); z2=pp(w-1.5u,h); z3=pp(.5w,.5h); z4=pp(.5w,0);
-pd z1; pd z2; pd z4; draw z1--z3--z4; % stem and left diagonal
-draw z2--z3; % right diagonal
-endchar;
-
-beginpunkchar("Z",11,1,2);
-z1=pp(1.5u,h); z2=pp(w-2.5u,h); z3=pp(1.5u,0); z4=pp(w-1.5u,0);
-pd z1; pd z4; draw z1--z2--z3--z4; % diagonals
-endchar;
-
-beginpunkchar(198,16,1,2); % \AE
-z1=pp(1.5u,0); z2=pp(.6w,h); z3=pp(w-1.5u,h);
-pd z1; pd z3; draw z1--z2--z3; % left diagonal and upper arm
-z4=pp .3[z1,z2]; z5=pp(.6w,0); z6=pp(w-2u,.3h);
-pd z4; pd z6; draw z4--z6; % crossbar
-z7=pp(w-u,0); pd z2; pd z7; draw z2--z5--z7; % stem and lower arm
-endchar;
-
-beginpunkchar(338,18,1,2); % \OE
-z1=pp(.5w,h); z2=pp(u,.4h); z3=pp(.5w,0);
-pd z1; draw z1..z2..{right}z3; % bowl
-z4=pp(w-1.5u,h); z5=pp(w-2u,.4h); z6=pp(w-u,0);
-pd z4; pd z6; draw z4--z1--z3--z6; % arms and stem
-pd z5; draw z5--.4[z3,z1]; % crossbar
-endchar;
-
-beginpunkchar(216,14,1,1); % \O
-z1=pp(.5w,h); z2=pp(u,.5h); z3=pp(.5w,0); z4=pp(w-u,.5h);
-z5=pp(w-2u,1.1h); z6=pp(2u,-.1h);
-pd z1; pd z6; draw z1..z2..z3..z4..z5--z6; % bowl and diagonal
-endchar;
-
-beginpunkchar(915,11,1,2); % $\Gamma$
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-1.5u,h);
-pd z1; pd z3; draw z1--z2--z3; % stem and arm
-endchar;
-
-beginpunkchar(916,15,1,2); % $\Delta$
-z1=pp(u,0); z2=pp(.5w,h); z3=pp(w-u,0);
-pd z1; draw z1--z2..tension 5..z3..tension 5..z1; % triangle
-endchar;
-
-beginpunkchar(920,15,.5,2); % $\Theta$
-z1=pp(.5w,h); z2=pp(u,.6h); z3=pp(.5w,0); z4=pp(w-u,.6h);
-pd z1; draw z1..tension.8..z2..z3..z4..tension.8..z1; % bowl
-z5=pp(x2+2u,.4h); z6=pp(x4-2u,.4h); pd z5; pd z6; draw z5--z6; % bar
-endchar;
-
-beginpunkchar(923,12,1,2); % $\Lambda$
-z1=pp(u,0); z2=pp(.5w,h); z3=pp(w-u,0);
-pd z1; pd z3; draw z1--z2--z3; % diagonals
-endchar;
-
-beginpunkchar(926,12,1,1); % $\Xi$
-z1=pp(u,h); z2=pp(w-u,h); pd z1; pd z2; draw z1--z2; % upper arm
-z3=pp(2u,.55h); z4=pp(w-2u,.55h); pd z3; pd z4; draw z3--z4; % bar
-z5=pp(u,0); z6=pp(w-u,0); pd z5; pd z6; draw z5--z6; % lower arm
-endchar;
-
-beginpunkchar(928,13,1,.5); % $\Pi$
-z1=pp(1.5u,0); z2=pp(1.5u,h); z3=pp(w-1.5u,h); z4=pp(w-1.5u,0);
-pd z1; pd z4; draw z1--z2--z3--z4; % stems and bar
-endchar;
-
-beginpunkchar(931,13,1,1); % $\Sigma$
-z1=pp(w-u,h); z2=pp(u,h); z3=pp(.5w-u,.5h); z4=pp(u,0); z5=pp(w-u,0);
-pd z1; pd z5; draw z1--z2{.5[z4,z5]-z2}..z3--z4--z5; % arms and diagonals
-endchar;
-
-beginpunkchar(933,15,1,.5); % $\Upsilon$
-z1=pp(u,.8h); z2=pp(.3w,h); z3=pp(.5w,.5h); z4=pp(.5w,0);
-pd z1; pd z4; draw z1..z2..tension2..z3---z4; % left arc and stem
-z5=pp(w-u,.8h); z6=pp(.7w,h);
-pd z5; draw z5..z6..tension2..{z4-z3}z3; % right arc
-endchar;
-
-beginpunkchar(934,13,1,2); % $\Phi$
-z1=pp(.5w,h); z2=pp(.5w,0); pd z1; pd z2; draw z1--z2; % stem
-z3=pp(.5w,2/3h); z4=pp(u,.5h); z5=pp(.5w,1/4h); z6=pp(w-u,.5h);
-pd z3; draw z3..z4..z5..z6..z3; % bowl
-endchar;
-
-beginpunkchar(936,14,1,1); % $\Psi$
-z1=pp(.5w,h); z2=pp(.5w,0); pd z1; pd z2; draw z1--z2; % stem
-z3=pp(u,.8h); z4=pp(.5w,.2h); z5=pp(w-u,.8h);
-pd z3; pd z5; draw z3{.4[z1,z2]-z3}..z4{right}..{z5-.4[z1,z2]}z5; % stroke
-endchar;
-
-beginpunkchar(937,13,1,2); % $\Omega$
-z1=pp(u,0); z2=pp(1/3w,0); z3=pp(u,2/3h); z4=pp(.5w,h);
-z5=pp(w-u,2/3h); z6=pp(2/3w,0); z7=pp(w-u,0);
-pd z1; pd z7; draw z1--z2{up}..z3..z4..z5..{down}z6--z7; % bowl and arms
-endchar;
-
-beginpunkchar(".",5,1,2);
-pd pp(.5w,0); % dot
-endchar;
-
-beginpunkchar(",",5,.5,.5);
-z1=pp(.5w,0); z2=pp(w-u,-.1h); z3=pp(.5w,-.3h);
-pd z1; pd z3; draw z1--z2--z3; % stroke
-endchar;
-
-beginpunkchar(":",5,1,.5);
-pd pp(.5w,0); pd pp(.5w,.4h); % dots
-endchar;
-
-beginpunkchar(";",5,.5,.5);
-z1=pp(.5w,0); z2=pp(w-u,-.1h); z3=pp(.5w,-.3h);
-pd z1; pd z3; draw z1--z2--z3; % stroke
-pd pp(.5w,.4h); % dot
-endchar;
-
-beginpunkchar("!",5,.5,.5);
-pd pp(.5w,0); % dot
-z1=pp(.5w,1.05h); z2=pp(.5w,.3h); pd z1; pd z2; draw z1--z2; % stem
-endchar;
-
-beginpunkchar(161,5,.5,.5); % spanish inverted !
-pd pp(.5w,.9h); % dot
-z1=pp(.5w,-.1h); z2=pp(.5w,.6h); pd z1; pd z2; draw z1--z2; % stem
-endchar;
-
-beginpunkchar("?",9,1,.5);
-z1=pp(1.5u,.8h); z2=pp(.5w,h); z3=pp(w-u,.8h); z4=pp(.5w,.3h);
-pd z1; pd z4; draw z1..z2..z3..{down}z4; % arc and stem
-pd pp(.5w,0); % dot
-endchar;
-
-beginpunkchar(191,9,1,.5); % spanish inverted ?
-z1=pp(1.5u,.1h); z2=pp(.5w,-.1h); z3=pp(w-u,.1h); z4=pp(.5w,.6h);
-pd z1; pd z4; draw z1..z2..z3..{up}z4; % arc and stem
-pd pp(.5w,.9h); % dot
-endchar;
-
-beginpunkchar("&",14,.5,.5);
-z1=pp(w-2u,h); z2=pp(u,h); z3=pp(3u,0); z5=pp(w-u,.6h); z6=pp(w-2u,0);
-pd z1; pd z5; draw z1--z2--z3--z5; % arms and stem
-draw z1--.5[z2,z3]; pd z6; draw z6--.6[z3,z5]; % diagonals
-endchar;
-
-beginpunkchar("$",12,.5,.5);
-z1=pp(w-1.5u,.7h); z2=pp(.5w,h); z3=pp(u,.7h); z4=.5[z3,z5];
-z5=pp(w-u,.3h); z6=pp(.5w,0); z7=pp(u,.3h);
-pd z1; pd z7; draw z1..z2..z3..z4..z5..z6..z7; % stroke
-z8=z2+(0,.1h); pd z8; draw z8--z6; % stem
-endchar;
-
-beginpunkchar("%",18,.5,.5);
-z1=pp(3.5u,1.1h); z2=pp(u,.8h); z3=pp(3.5u,.5h); z4=pp(6u,.8h);
-z5=pp(w-3.5u,.5h); z6=pp(w-6u,.2h); z7=pp(w-3.5u,-.1h); z8=pp(w-u,.2h);
-pd z1; draw z1..z2..z3..z4..z1; % upper bowl
-pd z5; draw z5..z6..z7..z8..z5; % lower bowl
-z9=pp(w-3u,1.1h); z0=pp(3u,-.1h); pd z0; draw z9--z0; % diagonal
-draw z1{z5-z1}..z9; % link
-endchar;
-
-beginpunkchar("@",18,1,.5);
-z1=pp(2u,0); z2=pp(1/3w,.7h); z3=pp(w-6u,0);
-z4=pp(w,.3h); z5=pp(1/3w,h); z6=pp(u,.5h); z7=.7[z2,z3];
-pd z1; pd z7; draw z1--z2--z3{right}..z4..z5..z6..z7; % diagonals and stroke
-endchar;
-
-beginpunkchar("-",7,.5,.5);
-z1=pp(u,.4h); z2=pp(w-u,.5h); pd z1; pd z2; draw z1--z2; % bar
-endchar;
-
-beginpunkchar(8211,9,.5,.5); % --
-z1=pp(0,.5h); z2=pp(w,.4h); pd z1; pd z2; draw z1--z2; % bar
-endchar;
-
-beginpunkchar(8212,18,.5,.5); % ---
-z1=pp(0,.5h); z2=pp(w,.4h); pd z1; pd z2; draw z1--z2; % bar
-endchar;
-
-beginpunkchar("+",9,.5,1);
-z1=pp(0,.5h); z2=pp(w,.5h); pd z1; pd z2; draw z1--z2; % bar
-z3=pp(.5w,.1h); z4=pp(.5w,.9h); pd z3; pd z4; draw z3--z4; % stem
-endchar;
-
-beginpunkchar("*",13,.5,1);
-z0=pp(.5w,1.1h); z1=pp(u,.9h); z2=pp(2u,.3h); z3=pp(w-u,.3h); z4=pp(w-u,.9h);
-pd z0; draw z0--z2..1/3[.5[z2,z4],z0]..z4--z1--z3--z0; % star
-endchar;
-
-beginpunkchar(39,5,.5,1.5); % ' apostrofe HH/TH (to be checked)
-z1=pp(w/2,h); z2=pp(w/2+u,.85h); z3=pp(w/2,2/3h);
-pd z1; pd z3; draw z1..z2..z3; % stroke
-endchar;
-
-beginpunkchar(34,9,1,1.5); % " HH/TH (to be checked)
-z1=pp(1.5u,h); z2=pp(1.5u,.6h); z3=pp(w-1.5u,h); z4=pp(w-1.5u,.6h);
-pd z1; pd z2; pd z3; pd z4; draw z1--z2; draw z3--z4;
-endchar;
-
-beginpunkchar(8216,5,.3,.5); % `
-z1=pp(w-1.5u,h); z2=pp(u,.85h); z3=pp(w-u,2/3h);
-pd z1; pd z3; draw z1--z2--z3; % stroke
-endchar;
-
-beginpunkchar(8217,5,.3,.5); % '
-z1=pp(1.5u,h); z2=pp(w-u,.85h); z3=pp(u,2/3h);
-pd z1; pd z3; draw z1--z2--z3; % stroke
-endchar;
-
-beginpunkchar(8220,9,.3,.5); % `` quotedblleft
-z1=pp(.5w+.5u,h); z2=pp(w-u,.6h); z3=pp(u,.95h);
-pd z1; pd z3; draw z1--z2--z3; % stroke
-endchar;
-
-beginpunkchar(8221,9,.3,.5); % '' quotedblright
-z1=pp(.5w-.5u,h); z2=pp(u,.6h); z3=pp(w-u,.95h);
-pd z1; pd z3; draw z1--z2--z3; % stroke
-endchar;
-
-beginpunkchar("(",7,.5,.5);
-z1=pp(w-u,h); z2=pp(u,.5h); z3=pp(w-u,0);
-pd z1; pd z3; draw z1..z2..z3; % stroke
-endchar;
-
-beginpunkchar(")",7,.5,.5);
-z1=pp(u,h); z2=pp(w-u,.5h); z3=pp(u,0); pd z1; pd z3; draw z1..z2..z3; % stroke
-endchar;
-
-beginpunkchar("[",8,.5,.5);
-z1=pp(w-u,h); z2=pp(.5w,h); z3=pp(.5w,0); z4=pp(w-u,0);
-pd z1; pd z4; draw z1--z2--z3--z4; % bars and stem
-endchar;
-
-beginpunkchar("]",8,.5,.5);
-z1=pp(u,h); z2=pp(.5w,h); z3=pp(.5w,0); z4=pp(u,0);
-pd z1; pd z4; draw z1--z2--z3--z4; % bars and stem
-endchar;
-
-beginpunkchar("<",9,.5,.5);
-z1=pp(w-u,.9h); z2=pp(u,.5h); z3=pp(w-u,.1h);
-pd z1; pd z3; draw z1--z2--z3; % diagonals
-endchar;
-
-beginpunkchar(">",9,.5,.5);
-z1=pp(u,.9h); z2=pp(w-u,.5h); z3=pp(u,.1h);
-pd z1; pd z3; draw z1--z2--z3; % diagonals
-endchar;
-
-beginpunkchar("{",10,.5,.5); % HH/TH
-z1=pp(w-2u,h); z3=pp(2u,.5h); z5=pp(w-2u,0);
-z2=pp(w-4u,.6h); z4=(w-4u,.4h);
-pd z1; pd z3; pd z5; draw z1{left}..z2--z3 & z3--z4..{right}z5;
-endchar;
-
-beginpunkchar("}",10,.5,.5); % HH/TH
-z1=pp(2u,h); z3=pp(w-2u,.5h); z5=pp(2u,0);
-z2=pp(4u,.6h); z4=(4u,.4h);
-pd z1; pd z3; pd z5; draw z1{right}..z2--z3 & z3--z4..{left}z5;
-endchar;
-
-beginpunkchar("=",9,.5,.5);
-z5=pp(u,2/3h); z6=pp(w-u,2/3h); pd z5; pd z6; draw z5--z6; % upper bar
-z7=pp(u,1/3h); z8=pp(w-u,1/3h); pd z7; pd z8; draw z7--z8; % lower bar
-endchar;
-
-beginpunkchar("#",15,.5,.5);
-z1=pp(.5w,h); z2=pp(3u,0); z3=pp(w-3u,h); z4=pp(.5w,0);
-pd z2; pd z3; draw z3--z1--z2; draw z3--z4--z2; % diagonals (linked)
-z5=pp(u,2/3h); z6=pp(w-u,2/3h); pd z5; pd z6; draw z5--z6; % upper bar
-z7=pp(u,1/3h); z8=pp(w-u,1/3h); pd z7; pd z8; draw z7--z8; % lower bar
-endchar;
-
-beginpunkchar("/",9,1,1);
-z1=pp(1.5u,-.05h); z2=pp(w-1.5u,1.05h); pd z1; pd z2; draw z1--z2; % diagonal
-endchar;
-
-beginpunkchar("\",9,1,1); % HH/TH
-z1=pp(1.5u,1.05h); z2=pp(w-1.5u,-.05h); pd z1; pd z2; draw z1--z2; % reverse diagonal
-endchar;
-
-
-beginpunkchar("0",9,.5,1);
-z1=pp(.5w,h); z2=pp(u,.55h); z3=pp(.5w,0); z4=pp(w-u,.55h);
-pd z1; draw z1{curl 2}..z2..z3..z4..z1; % bowl
-endchar;
-
-beginpunkchar("1",9,.3,1);
-z1=pp(2u,.7h); z2=pp(.6w,h); z3=pp(.6w,0);
-pd z1; pd z3; draw z1--z2--z3; % serif and stem
-endchar;
-
-beginpunkchar("2",9,1,1);
-z1=pp(2u,.7h); z2=pp(.5w,h); z3=pp(w-u,.6h); z4=pp(u,0); z5=pp(w-2u,0);
-pd z1; pd z5; draw z1..z2..z3..z4--z5; % stroke
-endchar;
-
-beginpunkchar("3",9,.5,.5);
-z1=pp(2u,.7h); z2=pp(.5w,h); z3=pp(w-u,.5[y2,y4]);
-z4=pp(.5w-u,.55h); z5=pp(w-u,.5[y4,y6]); z6=pp(.5w,0); z7=pp(1.5u,.2h);
-pd z1; pd z7; draw z1..z2..z3..z4&z4..z5..z6..z7; % arcs
-endchar;
-
-beginpunkchar("4",9,1,1);
-z1=pp(w-u,.3h); z2=pp(u,.3h); z3=pp(2/3w,h); z4=pp(2/3w,0);
-pd z1; pd z4; draw z1--z2--z3--z4; % stem and diagonals
-endchar;
-
-beginpunkchar("5",9,.5,.5);
-z1=pp(w-2u,h); z2=pp(2u,h); z3=pp(u,.7h); z4=pp(w-u,.5[y3,y5]);
-z5=pp(.5w,0); z6=pp(u,.2h);
-pd z1; pd z6; draw z1--z2--z3..z4..z5..z6; % stroke
-endchar;
-
-beginpunkchar("6",9,1,1);
-z1=pp(2/3w,h); z2=pp(u,.3h); z3=pp(.5w,0); z4=pp(w-u,.3h); z5=pp(.6w,.6h);
-z6=pp z2; pd z1; pd z6; draw z1..z2..z3..z4..z5--z6; % stroke
-endchar;
-
-beginpunkchar("7",9,.5,1);
-z1=pp(2u,h); z2=pp(w-.5u,h); z3=pp(.4w,0);
-pd z1; pd z3; draw z1--z2&z2..z3{down}; % stroke
-endchar;
-
-beginpunkchar("8",9,.5,.5);
-z1=pp(.5w,h); z2=pp(u,.5[y1,y3]); z3=pp(.5w,.6h); z4=pp(w-u,.5[y3,y5]);
-z5=pp(.5w,0); z6=pp(u,.5[y5,y3]); z7=pp(w-u,.5[y1,y3]);
-pd z1; draw z1{curl 8}..z2..z3..z4..z5..z6..z3..z7..z1; % stroke
-endchar;
-
-beginpunkchar("9",9,1,1);
-z1=pp(1/3w,0); z2=pp(w-u,.7h); z3=pp(.5w,h); z4=pp(u,.7h); z5=pp(.5w,.4h);
-pd z1; pd z5; draw z1..z2..z3..z4..z5; % stroke
-endchar;
-
-beginpunkchar(96,9,1,1); % \`{} grave
-z1=pp(2.5u,h); z2=pp(.6w,.8h); pd z1; pd z2; draw z1--z2; % diagonal
-endchar;
-
-beginpunkchar(180,9,1,1); % \'{} acute
-z1=pp(w-2.5u,h); z2=pp(.4w,.8h); pd z1; pd z2; draw z1--z2; % diagonal
-endchar;
-
-beginpunkchar(710,13,1,1); % \^{} circumflex
-z1=pp(2.5u,.8h); z2=pp(.5w,h); z3=(w-2.5u,.8h);
-pd z1; pd z3; draw z1--z2--z3; % diagonals
-endchar;
-
-beginpunkchar(711,13,1,1); % \v{} caron
-z1=pp(2.5u,.9h); z2=pp(.5w,.7h); z3=pp(w-2.5u,.9h);
-pd z1; pd z3; draw z1--z2--z3; % diagonals
-endchar;
-
-beginpunkchar(728,11,1,1); % \u{} breve
-z1=pp(2u,h); z2=pp(.5w,.75h); z3=pp(w-2u,h);
-pd z1; pd z3; draw flex(z1,z2,z3); % stroke
-endchar;
-
-beginpunkchar(175,12,1,1); % \={} macron
-z1=pp(u,.8h); z2=pp(w-u,.8h); pd z1; pd z2; draw z1--z2; % bar
-endchar;
-
-beginpunkchar(729,5,1,1); % \.{}
-pd pp(.5w,.9h); % dot
-endchar;
-
-beginpunkchar(168,13,1,1); % \"{} diaeresis
-pd pp(1/5w,.9h); pd pp(4/5w,.9h); % dots
-endchar;
-
-beginpunkchar(732,13,1,1); % \~{} tilde
-z1=pp(u,.75h); z2=pp(w-u,.9h); pd z1; pd z2; draw z1{up}..{up}z2; % stroke
-endchar;
-
-beginpunkchar(733,13,1,1); % \H{} hungarumlaut
-z1=pp(4u,h); z2=pp(2.5u,.7h); z3=pp(w-2u,h); z4=pp(w-3.5u,.7h);
-pd z1; pd z3; draw z1--z2--z4--z3; % diagonals (linked)
-endchar;
-
-beginpunkchar(730,13,0,0); % Scandinavian loop, for \AA\ and \aa (ring)
-z0=(.5w,.66h); % point $z^2$ of lowercase A
-z1=(.5w,.9h); draw z0{z0-(1.5u,0)}..z1..{(w-1.5u,0)-z0}z0; % loop
-endchar;
-
-beginpunkchar(184,13,.5,.5); % Cedilla, for \c c
-z1=(.6w,0); z2=pp(.6w,-.1h); z3=pp(2.5u,-.1h);
-pd z3; draw z1--z2--z3; % stroke
-endchar;
-
-initialize_punk_lower ;
-
-beginpunkchar(305,5,1,2); % dotless I
-z1=pp(.5w,0); z2=(.5w,1/3h); z3=(.5w,2/3h); z4=(.5w,h);
-pd z1; pd z4; draw flex(z1,z2,z3,z4); % stem
-endchar;
-
-beginpunkchar(567,9,1,2); % dotless J
-z1=pp(w-2u,h); z2=pp(w-2u,-.1h); z3=pp(u,0);
-pd z1; pd z3; draw z1--z2--z3; % arc
-endchar;
-
-beginpunkchar(223,18,.3,1); % German SS
-z1=pp(.5w-u,.9h); z2=pp(1/3w,h); z3=pp(u,.7h); z4=.6[z6,z2];
-z5=pp(.5w,.35h); z6=pp(1/3w,u); z7=pp(u,.2h);
-pd z1; pd z7; draw z1--z2...z3..z4..z5...z6--z7; % left stroke
-for i=1 upto 7: z[i+10]=pp(z[i] shifted (.5w-u,0)); endfor
-pd z11; pd z17; draw z11--z12...z13..z14..z15...z16--z17; % right stroke
-endchar;
-
-beginpunkchar("a",13,1,2);
-z1=pp(1.5u,0); z2=(.5w,1.1h); z3=pp(w-1.5u,0);
-pd z1; pd z3; draw z1--z2--z3; % left and right diagonals
-z4=pp .3[z1,z2]; z5=pp .3[z3,z2]; pd z4; pd z5; draw z4--z5; % crossbar
-endchar;
-
-beginpunkchar("b",12,1,1);
-z1=pp(2u,0); z2=pp(2u,.6h); z3=pp(2u,h); pd z1; pd z3; draw z1--z3; % stem
-z1.5=pp(w-u,.5y2); z2.5=pp(w-u,.5[y2,y3]); draw z2--z2.5--z3; % upper lobe
-draw flex(z2,z1.5,z1); % lower lobe
-endchar;
-
-beginpunkchar("c",13,1,2);
-z1=pp(w-2u,.8h); z2=pp(.6w,h); z3=pp(u,.5h); z4=(.6w,0); z5=(w-2u,.2h);
-pd z1; pd z5; draw z1..z2..z3..z4..z5; % arc
-endchar;
-
-beginpunkchar("d",14,1,2);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-u,.6h);
-pd z1; pd z2; draw flex(z1,z3,z2); % lobe
-draw z1--z2; % stem
-endchar;
-
-beginpunkchar("e",12,.5,1);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2.5u,h); z4=pp(w-2u,0);
-pd z3; pd z4; draw z4--z1--z2--z3; % stem and arms
-z5=pp(2u,.6h); z6=pp(w-3u,.6h); pd z5; pd z6; draw z5--z6; % crossbar
-endchar;
-
-beginpunkchar("f",12,.5,2);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2u,h);
-pd z1; pd z3; draw z1--z2--z3; % stem and arm
-z5=pp(2u,.6h); z6=pp(w-3u,.6h); z4=pp .5[z5,z6]-(0,.1h);
-pd z5; pd z6; draw flex (z5,z4,z6); % crossbar
-endchar;
-
-beginpunkchar("g",13,.5,.5);
-z1=pp(w-2u,.8h); z2=pp(.6w,h); z3=pp(u,.5h); z4=pp(.6w,0); z5=(w-2u,0);
-pd z1; draw z1..z2..z3..z4---z5; % arc
-z6=pp(.5[u,x5],.4h); pd z6; pd z5; draw z6--(pp(x5,y6))--z5; % spur
-endchar;
-
-beginpunkchar("h",14,1,.5);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2u,0); z4=pp(w-2u,h);
-z5=pp(2u,.6h); z6=pp(w-2u,.6h);
-pd z1; pd z2; pd z3; pd z4; draw z1--z2; draw flex(z3,z6,z4); % stems
-pd z5; draw z5--z6; % crossbar
-endchar;
-
-beginpunkchar("i",5,1,2);
-z1=pp(.5w,0); z2=(.5w,1/3h); z3=(.5w,2/3h); z4=(.5w,h);
-pd z1; pd z4; draw flex(z1,z2,z3,z4); % stem
-endchar;
-
-beginpunkchar("j",9,1,2);
-z1=pp(w-2u,h); z2=pp(w-2u,-.1h); z3=pp(u,0);
-pd z1; pd z3; draw z1--z2--z3; % arc
-endchar;
-
-beginpunkchar("k",14,1,2);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(2u,1/3h); z4=pp(w-1.5u,h);
-pd z1; pd z2; draw z1--z2; % stem
-pd z3; pd z4; draw z3--z4; % upper diagonal
-z6=pp(w-u,0); z5=1/3[z3,z4];
-pd z6; draw flex(z5,.8[z1,2/3[z5,z6] ],z6);% lower diagonal
-endchar;
-
-beginpunkchar("l",11,1,2);
-z1=pp(2u,h); z2=pp(2u,0); z3=pp(w-1.5u,0);
-pd z1; pd z3; draw z1--z2--z3; % stem and arm
-endchar;
-
-beginpunkchar("m",17,.5,2);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(.5w,0); z4=pp(w-2u,h); z5=pp(w-2u,0);
-pd z1; pd z5; draw z1--z2--z3--z4--z5; % stems and diagonals
-endchar;
-
-beginpunkchar("n",13,.75,2);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-2u,0); z4=pp(w-2u,h);
-pd z1; pd z4; draw z1--z2--z3--z4; % stems and diagonals
-endchar;
-
-beginpunkchar("o",12,.5,2);
-z1=pp(.5w,h); z2=pp(u,.55h); z3=pp(.5w,0); z4=pp(w-u,.55h);
-pd z1; draw z1{left}..z2..z3..z4..z1; % bowl
-endchar;
-
-beginpunkchar("p",13,1,2);
-z1=pp(2u,0); z2=pp(2u,1.1h); z3=pp(2u,.5h); z4=pp(w,.6[y3,y2]);
-pd z1; pd z3; draw z1--z2--z4--z3; % stem and bowl
-endchar;
-
-beginpunkchar("q",14,.5,2);
-z1=pp(.5w,h); z2=pp(u,.55h); z3=pp(.5w,0); z4=pp(w-u,.55h);
-pd z1; draw z1{curl 2}..z2..z3..z4..z1; % bowl
-z5=pp(.4w,.2h); z6=pp(w-u,-.1h); z7=pp(.5[x5,x6],-.2h);
-pd z5; pd z6; draw z5--z7--z6; % tail
-endchar;
-
-beginpunkchar("r",16,1,2);
-z1=pp(2u,0); z2=pp(2u,h); z3=pp(w-u,.6[y2,y4]); z4=pp(2u,.5h); z5=pp(w-1.5u,0);
-pd z1; pd z2; pd z5; draw z1--flex(z2,z3,z4)--z5; % stem, bowl, and diagonal
-endchar;
-
-beginpunkchar("s",11,.3,1);
-z1=pp(w-2u,.9h); z2=pp(.5w,h); z3=pp(u,.7h); z4=.6[z6,z2];
-z5=pp(w-u,.35h); z6=pp(.5w,u); z7=pp(u,.2h);
-pd z1; pd z7; draw z1--z2...z3..z4..z5...z6--z7; % stroke
-endchar;
-
-beginpunkchar("t",13,.75,2);
-z1=pp(u,h); z2=pp(w-u,h); z3=pp(.5w,0);
-pd z1; pd z2; pd z3; draw z1--z2; % arms
-draw .5[z1,z2]--z3; % stem
-endchar;
-
-beginpunkchar("u",13,.3,2);
-z1=pp(2u,h); z2=pp(2u,.2h); z3=pp(.5w,0); z4=pp(w-2u,.2h); z5=pp(w-2u,h);
-pd z1; pd z5; draw z1---z2...z3{z4-z2}...z4---z5; % stroke
-endchar;
-
-beginpunkchar("v",13,1,2);
-z1=pp(1.5u,h); z2=pp(.5w,0); z3=pp(w-1.5u,h);
-pd z1; pd z3; draw z1--z2--z3; % diagonals
-endchar;
-
-beginpunkchar("w",18,1,2);
-z1=pp(1.5u,h); z2=pp(.5[x1,x3],0); z3=pp(.5w,.8h); z4=pp(.5[x3,x5],0);
-z5=pp(w-1.5u,h);
-pd z1; pd z5; draw z1--z2--z3--z4--z5; % diagonals
-endchar;
-
-beginpunkchar("x",13,1,1);
-z1=pp(1.5u,h); z2=pp(w-1.5u,0); z3=pp(1.5u,0); z4=pp(w-2.5u,h);
-pd z1; pd z2; draw z1--z2; % main diagonal
-pd z3; pd z4; draw z3--z4; % cross diagonal
-endchar;
-
-beginpunkchar("y",13,1,2);
-z1=pp(1.5u,h); z2=pp(w-1.5u,h); z3=pp(.5w,.5h); z4=pp(.5w,0);
-pd z1; pd z2; pd z4; draw z1--z3--z4; % stem and left diagonal
-draw z2--z3; % right diagonal
-endchar;
-
-beginpunkchar("z",11,1,2);
-z1=pp(1.5u,h); z2=pp(w-2.5u,h); z3=pp(1.5u,0); z4=pp(w-1.5u,0);
-pd z1; pd z4; draw z1--z2--z3--z4; % diagonals
-endchar;
-
-beginpunkchar(230,16,1,2); % \ae
-z1=pp(1.5u,0); z2=pp(.6w,h); z3=pp(w-1.5u,h);
-pd z1; pd z3; draw z1--z2--z3; % left diagonal and upper arm
-z4=pp .3[z1,z2]; z5=pp(.6w,0); z6=pp(w-2u,.3h);
-pd z4; pd z6; draw z4--z6; % crossbar
-z7=pp(w-u,0); pd z2; pd z7; draw z2--z5--z7; % stem and lower arm
-endchar;
-
-beginpunkchar(339,18,1,2); % \oe
-z1=pp(.5w,h); z2=pp(u,.4h); z3=pp(.5w,0);
-pd z1; draw z1..z2..{right}z3; % bowl
-z4=pp(w-1.5u,h); z5=pp(w-2u,.4h); z6=pp(w-u,0);
-pd z4; pd z6; draw z4--z1--z3--z6; % arms and stem
-pd z5; draw z5--.4[z3,z1]; % crossbar
-endchar;
-
-beginpunkchar(248,14,1,1); % \o
-z1=pp(.5w,h); z2=pp(u,.5h); z3=pp(.5w,0); z4=pp(w-u,.5h);
-z5=pp(w-2u,1.1h); z6=pp(2u,-.1h);
-pd z1; pd z6; draw z1..z2..z3..z4..z5--z6; % bowl and diagonal
-endchar;
-
-revert_punk_lower;
-
-beginpunkchar("_",12,.5,.5); % _
-z1=pp(0,-.2h); z2=pp(w,-.2h); pd z1; pd z2; draw z1--z2; % bar
-endchar;
-
-beginpunkchar("^",12,1,.5); %
-z1=pp(.5w,h); z2=pp(1.5u,.6h); z3=pp(w-1.5u,.6h);
-pd z2; pd z3; draw z2--z1--z3;
-endchar;
+input "punkfont-definitions.mp" ;
+input "punkfont-characters.mp" ;
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-babel.lua b/Master/texmf-dist/scripts/context/lua/mtx-babel.lua
index 01e2ba4b223..120e490929e 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-babel.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-babel.lua
@@ -8,6 +8,20 @@ if not modules then modules = { } end modules ['mtx-babel'] = {
-- data tables by Thomas A. Schmitz
+local helpinfo = [[
+--language=string conversion language (e.g. greek)
+--structure=string obey given structure (e.g. 'document', default: 'context')
+--convert convert babel codes into utf
+]]
+
+local application = logs.application {
+ name = "mtx-babel",
+ banner = "Babel Input To UTF Conversion 1.20",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
scripts = scripts or { }
scripts.babel = scripts.babel or { }
@@ -387,22 +401,22 @@ do
local structure = environment.argument("structure") or "document"
converter = converter[structure]
if converter then
- logs.simple("converting '%s' using language '%s' with structure '%s'", filename, language, structure)
+ report("converting '%s' using language '%s' with structure '%s'", filename, language, structure)
data = converter:match(data)
local newfilename = filename .. ".utf"
io.savedata(newfilename, data)
- logs.simple("converted data saved in '%s'", newfilename)
+ report("converted data saved in '%s'", newfilename)
else
- logs.simple("unknown structure '%s' language '%s'", structure, language)
+ report("unknown structure '%s' language '%s'", structure, language)
end
else
- logs.simple("no converter for language '%s'", language)
+ report("no converter for language '%s'", language)
end
else
- logs.simple("provide language")
+ report("provide language")
end
else
- logs.simple("no data in '%s'",filename)
+ report("no data in '%s'",filename)
end
end
end
@@ -415,16 +429,8 @@ do
end
-logs.extendbanner("Babel Input To UTF Conversion 1.20",true)
-
-messages.help = [[
---language=string conversion language (e.g. greek)
---structure=string obey given structure (e.g. 'document', default: 'context')
---convert convert babel codes into utf
-]]
-
if environment.argument("convert") then
scripts.babel.convert(environment.files[1] or "")
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-base.lua b/Master/texmf-dist/scripts/context/lua/mtx-base.lua
new file mode 100644
index 00000000000..ab5bfe18a9b
--- /dev/null
+++ b/Master/texmf-dist/scripts/context/lua/mtx-base.lua
@@ -0,0 +1,118 @@
+if not modules then modules = { } end modules ['mtx-base'] = {
+ version = 1.001,
+ comment = "formerly known as luatools",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local helpinfo = [[
+--generate generate file database
+--variables show configuration variables
+--configurations show configuration order
+--expand-braces expand complex variable
+--expand-path expand variable (resolve paths)
+--expand-var expand variable (resolve references)
+--show-path show path expansion of ...
+--var-value report value of variable
+--find-file report file location
+--find-path report path of file
+--make or --ini make luatex format
+--run or --fmt= run luatex format
+--compile assemble and compile lua inifile
+--verbose give a bit more info
+--all show all found files
+--format=str filter cf format specification (default 'tex', use 'any' for any match)
+--pattern=str filter variables
+--trackers=list enable given trackers
+]]
+
+local application = logs.application {
+ name = "mtx-base",
+ banner = "ConTeXt TDS Management Tool 1.35 (aka luatools)",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
+-- private option --noluc for testing errors in the stub
+
+local instance = resolvers.instance
+
+local pattern = environment.arguments["pattern"] or nil
+local fileformat = environment.arguments["format"] or "" -- nil ?
+local allresults = environment.arguments["all"] or false
+local trace = environment.arguments["trace"]
+
+if type(pattern) == 'boolean' then
+ report("invalid pattern specification")
+ pattern = nil
+end
+
+if trace then
+ resolvers.settrace(trace) -- move to mtxrun ?
+end
+
+if environment.arguments["find-file"] then
+ resolvers.load()
+ if pattern then
+ resolvers.dowithfilesandreport(resolvers.findfiles, { pattern }, fileformat, allresults)
+ else
+ resolvers.dowithfilesandreport(resolvers.findfiles, environment.files, fileformat, allresults)
+ end
+elseif environment.arguments["find-path"] then
+ resolvers.load()
+ local path = resolvers.findpath(environment.files[1], fileformat)
+ print(path) -- quite basic, wil become function in logs
+elseif environment.arguments["run"] then
+ resolvers.load("nofiles") -- ! no need for loading databases
+ trackers.enable("resolvers.locating")
+ environment.run_format(environment.files[1] or "",environment.files[2] or "",environment.files[3] or "")
+elseif environment.arguments["fmt"] then
+ resolvers.load("nofiles") -- ! no need for loading databases
+ trackers.enable("resolvers.locating")
+ environment.run_format(environment.arguments["fmt"], environment.files[1] or "",environment.files[2] or "")
+elseif environment.arguments["expand-braces"] then
+ resolvers.load("nofiles")
+ resolvers.dowithfilesandreport(resolvers.expandbraces, environment.files)
+elseif environment.arguments["expand-path"] then
+ resolvers.load("nofiles")
+ resolvers.dowithfilesandreport(resolvers.expandpath, environment.files)
+elseif environment.arguments["expand-var"] or environment.arguments["expand-variable"] then
+ resolvers.load("nofiles")
+ resolvers.dowithfilesandreport(resolvers.expansion, environment.files)
+elseif environment.arguments["show-path"] or environment.arguments["path-value"] then
+ resolvers.load("nofiles")
+ resolvers.dowithfilesandreport(resolvers.showpath, environment.files)
+elseif environment.arguments["var-value"] or environment.arguments["show-value"] then
+ resolvers.load("nofiles")
+ resolvers.dowithfilesandreport(resolvers.variable, environment.files)
+elseif environment.arguments["format-path"] then
+ resolvers.load()
+ report(caches.getwritablepath("format"))
+elseif pattern then -- brrr
+ resolvers.load()
+ resolvers.dowithfilesandreport(resolvers.findfiles, { pattern }, fileformat, allresults)
+elseif environment.arguments["generate"] then
+ instance.renewcache = true
+ trackers.enable("resolvers.locating")
+ resolvers.load()
+elseif environment.arguments["make"] or environment.arguments["ini"] or environment.arguments["compile"] then
+ resolvers.load()
+ trackers.enable("resolvers.locating")
+ environment.make_format(environment.files[1] or "")
+elseif environment.arguments["variables"] or environment.arguments["show-variables"] or environment.arguments["expansions"] or environment.arguments["show-expansions"] then
+ resolvers.load("nofiles")
+ resolvers.listers.variables(pattern)
+elseif environment.arguments["configurations"] or environment.arguments["show-configurations"] then
+ resolvers.load("nofiles")
+ resolvers.listers.configurations()
+elseif environment.arguments["help"] or (environment.files[1]=='help') or (#environment.files==0) then
+ application.help()
+elseif environment.files[1] == 'texmfcnf.lua' then
+ resolvers.load("nofiles")
+ resolvers.listers.configurations()
+else
+ resolvers.load()
+ resolvers.dowithfilesandreport(resolvers.findfiles, environment.files, fileformat, allresults)
+end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-cache.lua b/Master/texmf-dist/scripts/context/lua/mtx-cache.lua
index c2a0db00d89..08202bbf816 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-cache.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-cache.lua
@@ -6,91 +6,114 @@ if not modules then modules = { } end modules ['mtx-cache'] = {
license = "see context related readme files"
}
-scripts = scripts or { }
-scripts.cache = scripts.cache or { }
+local helpinfo = [[
+--purge remove not used files
+--erase completely remove cache
+--list show cache
-function scripts.cache.collect_one(...)
- local path = caches.setpath(...)
- local tmas = dir.glob(path .. "/*.tma")
- local tmcs = dir.glob(path .. "/*.tmc")
- return path, tmas, tmcs
-end
+--all all (not yet implemented)
+]]
-function scripts.cache.collect_two(...)
- local path = caches.setpath(...)
- local rest = dir.glob(path .. "/**/*")
- return path, rest
-end
+local application = logs.application {
+ name = "mtx-cache",
+ banner = "ConTeXt & MetaTeX Cache Management 0.10",
+ helpinfo = helpinfo,
+}
-local suffixes = { "afm", "tfm", "def", "enc", "otf", "mp", "data" }
+local report = application.report
+
+scripts = scripts or { }
+scripts.cache = scripts.cache or { }
-function scripts.cache.process_one(action)
- for i=1,#suffixes do
- action("fonts", suffixes[i])
+local function collect(path)
+ local all = dir.glob(path .. "/**/*")
+ local tmas, tmcs, rest = { }, { }, { }
+ for i=1,#all do
+ local name = all[i]
+ local suffix = file.suffix(name)
+ if suffix == "tma" then
+ tmas[#tmas+1] = name
+ elseif suffix == "tmc" then
+ tmcs[#tmcs+1] = name
+ else
+ rest[#rest+1] = name
+ end
end
+ return tmas, tmcs, rest, all
end
-function scripts.cache.process_two(action)
- action("curl")
+local function list(banner,path,tmas,tmcs,rest)
+ report("%s: %s",banner,path)
+ report()
+ report("tma : %4i",#tmas)
+ report("tmc : %4i",#tmcs)
+ report("rest : %4i",#rest)
+ report("total : %4i",#tmas+#tmcs+#rest)
+ report()
end
--- todo: recursive delete of paths
-
-function scripts.cache.remove(list,keep)
- local n, keepsuffixes = 0, table.tohash(keep or { })
+local function purge(banner,path,list,all)
+ report("%s: %s",banner,path)
+ report()
+ local n = 0
for i=1,#list do
local filename = list[i]
if string.find(filename,"luatex%-cache") then -- safeguard
- if not keepsuffixes[file.extname(filename) or ""] then
+ if all then
os.remove(filename)
n = n + 1
+ else
+ local suffix = file.suffix(filename)
+ if suffix == "tma" then
+ local checkname = file.replacesuffix(filename,"tma","tmc")
+ if lfs.isfile(checkname) then
+ os.remove(filename)
+ n = n + 1
+ end
+ end
end
end
end
- return n
+ report("removed tma files : %i",n)
+ report()
end
-function scripts.cache.delete(all,keep)
- scripts.cache.process_one(function(...)
- local path, rest = scripts.cache.collect_one(...)
- local n = scripts.cache.remove(rest,keep)
- logs.report("cache path",string.format("%4i files out of %4i deleted on %s",n,#rest,path))
- end)
- scripts.cache.process_two(function(...)
- local path, rest = scripts.cache.collect_two(...)
- local n = scripts.cache.remove(rest,keep)
- logs.report("cache path",string.format("%4i files out of %4i deleted on %s",n,#rest,path))
- end)
+function scripts.cache.purge()
+ local writable = caches.getwritablepath()
+ local tmas, tmcs, rest = collect(writable)
+ list("writable path",writable,tmas,tmcs,rest)
+ local n = purge("writable path",writable,tmas)
+ list("writable path",writable,tmas,tmcs,rest)
end
-function scripts.cache.list(all)
- scripts.cache.process_one(function(...)
- local path, tmas, tmcs = scripts.cache.collect_one(...)
- logs.report("cache path",string.format("%4i (tma:%4i, tmc:%4i) %s",#tmas+#tmcs,#tmas,#tmcs,path))
- logs.report("cache path",string.format("%4i (tma:%4i, tmc:%4i) %s",#tmas+#tmcs,#tmas,#tmcs,path))
- end)
- scripts.cache.process_two(function(...)
- local path, rest = scripts.cache.collect_two("curl")
- logs.report("cache path",string.format("%4i %s",#rest,path))
- end)
+function scripts.cache.erase()
+ local writable = caches.getwritablepath()
+ local tmas, tmcs, rest, all = collect(writable)
+ list("writable path",writable,tmas,tmcs,rest)
+ local n = purge("writable path",writable,all,true)
+ list("writable path",writable,tmas,tmcs,rest)
end
-logs.extendbanner("ConTeXt & MetaTeX Cache Management 0.10")
-
-messages.help = [[
---purge remove not used files
---erase completely remove cache
---list show cache
-
---all all (not yet implemented)
-]]
+function scripts.cache.list()
+ local readables = caches.getreadablepaths()
+ local writable = caches.getwritablepath()
+ local tmas, tmcs, rest = collect(writable)
+ list("writable path",writable,tmas,tmcs,rest)
+ for i=1,#readables do
+ local readable = readables[i]
+ if readable ~= writable then
+ local tmas, tmcs = collect(readable)
+ list("readable path",readable,tmas,tmcs,rest)
+ end
+ end
+end
if environment.argument("purge") then
- scripts.cache.delete(environment.argument("all"),{"tmc"})
+ scripts.cache.purge()
elseif environment.argument("erase") then
- scripts.cache.delete(environment.argument("all"))
+ scripts.cache.erase()
elseif environment.argument("list") then
- scripts.cache.list(environment.argument("all"))
+ scripts.cache.list()
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-chars.lua b/Master/texmf-dist/scripts/context/lua/mtx-chars.lua
index 6acacfbd22e..dc760c4e7e6 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-chars.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-chars.lua
@@ -6,6 +6,20 @@ if not modules then modules = { } end modules ['mtx-chars'] = {
license = "see context related readme files"
}
+local helpinfo = [[
+--stix convert stix table to math table
+--xtx generate xetx-*.tex (used by xetex)
+--pdf generate pdfr-def.tex (used by pdftex)
+]]
+
+local application = logs.application {
+ name = "mtx-chars",
+ banner = "MkII Character Table Generators 0.10",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
local format, concat, utfchar, upper = string.format, table.concat, unicode.utf8.char, string.upper
scripts = scripts or { }
@@ -24,13 +38,13 @@ scripts.chars = scripts.chars or { }
--~
--~ function scripts.chars.stixtomkiv(inname,outname)
--~ if inname == "" then
---~ logs.report("aquiring math data","invalid datafilename")
+--~ report("aquiring math data, invalid datafilename")
--~ end
--~ local f = io.open(inname)
--~ if not f then
---~ logs.report("aquiring math data","invalid datafile")
+--~ report("aquiring math data, invalid datafile")
--~ else
---~ logs.report("aquiring math data","processing " .. inname)
+--~ report("aquiring math data, processing %s",inname)
--~ if not outname or outname == "" then
--~ outname = "char-mth.lua"
--~ end
@@ -72,9 +86,9 @@ scripts.chars = scripts.chars or { }
--~ end
--~ if not valid then
--~ g:write("\t-- The data file is corrupt, invalid or maybe the format has changed.\n")
---~ logs.report("aquiring math data","problems with data table")
+--~ report("aquiring math data, problems with data table")
--~ else
---~ logs.report("aquiring math data","table saved in " .. outname)
+--~ report("aquiring math data, table saved in %s",outname)
--~ end
--~ g:write("}\n")
--~ g:close()
@@ -83,7 +97,7 @@ scripts.chars = scripts.chars or { }
--~ end
function scripts.chars.stixtomkiv(inname,outname)
- logs.report("we no longer use this options but use our own tables instead")
+ report("we no longer use this options but use our own tables instead")
end
local banner_pdf_1 = [[
@@ -101,7 +115,7 @@ local banner_pdf_2 = [[
]]
function scripts.chars.makepdfr()
- local chartable = resolvers.find_file("char-def.lua") or ""
+ local chartable = resolvers.findfile("char-def.lua") or ""
if chartable ~= "" then
dofile(chartable)
if characters and characters.data then
@@ -143,6 +157,11 @@ local banner_utf_patch = [[
\setXTXcharcodes "201C "201C "201C
\setXTXcharcodes "201D "201D "201D
+
+% patch needed for french
+
+\setXTXcharcodes "2019 "2019 "2019
+
]]
local banner_utf_names = [[
@@ -174,13 +193,13 @@ local xtxclasses = {
}
function scripts.chars.makeencoutf()
- local chartable = resolvers.find_file("char-def.lua") or ""
+ local chartable = resolvers.findfile("char-def.lua") or ""
if chartable ~= "" then
dofile(chartable)
local function open(name,banner)
local f = io.open(name,'w')
if f then
- logs.simple("writing '%s'",name)
+ report("writing '%s'",name)
f:write(format(banner_utf_module,name))
f:write(banner)
f:write()
@@ -234,13 +253,14 @@ function scripts.chars.makeencoutf()
end
end
end
+ local template = "\\def\\%-".. length .. "s{\\char\"%05X } %% %s: %s\n"
for i=1,#list do
local code = list[i]
if code > 0x5B and code <= 0xFFFF then
local chr = data[code]
if chr and chr.contextname then
local ch = utfchar(code)
- f:write(format("\\def\\%s{\\char\"%05X } %% %s: %s\n", chr.contextname:rpadd(length," "), code, chr.description, ch))
+ f:write(format(template, chr.contextname, code, chr.description, ch))
end
end
end
@@ -301,14 +321,6 @@ function scripts.chars.makeencoutf()
end
end
-logs.extendbanner("MkII Character Table Generators 0.10")
-
-messages.help = [[
---stix convert stix table to math table
---xtx generate xetx-*.tex (used by xetex)
---pdf generate pdfr-def.tex (used by pdftex)
-]]
-
if environment.argument("stix") then
local inname = environment.files[1] or ""
local outname = environment.files[2] or ""
@@ -318,5 +330,5 @@ elseif environment.argument("xtx") then
elseif environment.argument("pdf") then
scripts.chars.makepdfr()
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-check.lua b/Master/texmf-dist/scripts/context/lua/mtx-check.lua
index 4266ddf0d46..e0ab3b88276 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-check.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-check.lua
@@ -6,91 +6,99 @@ if not modules then modules = { } end modules ['mtx-check'] = {
license = "see context related readme files"
}
+local helpinfo = [[
+--convert check tex file for errors
+]]
+
+local application = logs.application {
+ name = "mtx-check",
+ banner = "Basic ConTeXt Syntax Checking 0.10",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
scripts = scripts or { }
scripts.checker = scripts.checker or { }
local validator = { }
-do
-
- validator.n = 1
- validator.errors = { }
- validator.trace = false
- validator.direct = false
+validator.n = 1
+validator.errors = { }
+validator.trace = false
+validator.direct = false
- validator.printer = print
- validator.tracer = print
+validator.printer = print
+validator.tracer = print
- local message = function(position, kind)
- local ve = validator.errors
- ve[#ve+1] = { kind, position, validator.n }
- if validator.direct then
- validator.printer(string.format("%s error at position %s (line %s)", kind, position, validator.n))
- end
+local message = function(position, kind)
+ local ve = validator.errors
+ ve[#ve+1] = { kind, position, validator.n }
+ if validator.direct then
+ validator.printer(string.format("%s error at position %s (line %s)", kind, position, validator.n))
end
- local progress = function(position, data, kind)
- if validator.trace then
- validator.tracer(string.format("%s at position %s: %s", kind, position, data or ""))
- end
+end
+local progress = function(position, data, kind)
+ if validator.trace then
+ validator.tracer(string.format("%s at position %s: %s", kind, position, data or ""))
end
+end
- local P, R, S, V, C, CP, CC = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.C, lpeg.Cp, lpeg.Cc
-
- local i_m, d_m = P("$"), P("$$")
- local l_s, r_s = P("["), P("]")
- local l_g, r_g = P("{"), P("}")
-
- local okay = lpeg.P("{[}") + lpeg.P("{]}")
-
- local esc = P("\\")
- local cr = P("\r")
- local lf = P("\n")
- local crlf = P("\r\n")
- local space = S(" \t\f\v")
- local newline = crlf + cr + lf
-
- local line = newline / function() validator.n = validator.n + 1 end
-
- -- local grammar = P { "tokens",
- -- ["tokens"] = (V("whatever") + V("grouped") + V("setup") + V("display") + V("inline") + V("errors") + 1)^0,
- -- ["whatever"] = line + esc * 1 + C(P("%") * (1-line)^0),
- -- ["grouped"] = CP() * C(l_g * (V("whatever") + V("grouped") + V("setup") + V("display") + V("inline") + (1 - l_g - r_g))^0 * r_g) * CC("group") / progress,
- -- ["setup"] = CP() * C(l_s * (V("whatever") + V("grouped") + V("setup") + V("display") + V("inline") + (1 - l_s - r_s))^0 * r_s) * CC("setup") / progress,
- -- ["display"] = CP() * C(d_m * (V("whatever") + V("grouped") + (1 - d_m))^0 * d_m) * CC("display") / progress,
- -- ["inline"] = CP() * C(i_m * (V("whatever") + V("grouped") + (1 - i_m))^0 * i_m) * CC("inline") / progress,
- -- ["errors"] = (V("gerror") + V("serror") + V("derror") + V("ierror")) * true,
- -- ["gerror"] = CP() * (l_g + r_g) * CC("grouping") / message,
- -- ["serror"] = CP() * (l_s + r_g) * CC("setup error") / message,
- -- ["derror"] = CP() * d_m * CC("display math error") / message,
- -- ["ierror"] = CP() * i_m * CC("inline math error") / message,
- -- }
-
- local startluacode = P("\\startluacode")
- local stopluacode = P("\\stopluacode")
-
- local somecode = startluacode * (1-stopluacode)^1 * stopluacode
-
- local grammar = P { "tokens",
- ["tokens"] = (V("ignore") + V("whatever") + V("grouped") + V("setup") + V("display") + V("inline") + V("errors") + 1)^0,
- ["whatever"] = line + esc * 1 + C(P("%") * (1-line)^0),
- ["grouped"] = l_g * (V("whatever") + V("grouped") + V("setup") + V("display") + V("inline") + (1 - l_g - r_g))^0 * r_g,
- ["setup"] = l_s * (okay + V("whatever") + V("grouped") + V("setup") + V("display") + V("inline") + (1 - l_s - r_s))^0 * r_s,
- ["display"] = d_m * (V("whatever") + V("grouped") + (1 - d_m))^0 * d_m,
- ["inline"] = i_m * (V("whatever") + V("grouped") + (1 - i_m))^0 * i_m,
- ["errors"] = (V("gerror")+ V("serror") + V("derror") + V("ierror")),
- ["gerror"] = CP() * (l_g + r_g) * CC("grouping") / message,
- ["serror"] = CP() * (l_s + r_g) * CC("setup error") / message,
- ["derror"] = CP() * d_m * CC("display math error") / message,
- ["ierror"] = CP() * i_m * CC("inline math error") / message,
- ["ignore"] = somecode,
- }
-
- function validator.check(str)
- validator.n = 1
- validator.errors = { }
- grammar:match(str)
- end
+local P, R, S, V, C, CP, CC = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.C, lpeg.Cp, lpeg.Cc
+
+local i_m, d_m = P("$"), P("$$")
+local l_s, r_s = P("["), P("]")
+local l_g, r_g = P("{"), P("}")
+
+local okay = lpeg.P("{[}") + lpeg.P("{]}")
+
+local esc = P("\\")
+local cr = P("\r")
+local lf = P("\n")
+local crlf = P("\r\n")
+local space = S(" \t\f\v")
+local newline = crlf + cr + lf
+
+local line = newline / function() validator.n = validator.n + 1 end
+
+-- local grammar = P { "tokens",
+-- ["tokens"] = (V("whatever") + V("grouped") + V("setup") + V("display") + V("inline") + V("errors") + 1)^0,
+-- ["whatever"] = line + esc * 1 + C(P("%") * (1-line)^0),
+-- ["grouped"] = CP() * C(l_g * (V("whatever") + V("grouped") + V("setup") + V("display") + V("inline") + (1 - l_g - r_g))^0 * r_g) * CC("group") / progress,
+-- ["setup"] = CP() * C(l_s * (V("whatever") + V("grouped") + V("setup") + V("display") + V("inline") + (1 - l_s - r_s))^0 * r_s) * CC("setup") / progress,
+-- ["display"] = CP() * C(d_m * (V("whatever") + V("grouped") + (1 - d_m))^0 * d_m) * CC("display") / progress,
+-- ["inline"] = CP() * C(i_m * (V("whatever") + V("grouped") + (1 - i_m))^0 * i_m) * CC("inline") / progress,
+-- ["errors"] = (V("gerror") + V("serror") + V("derror") + V("ierror")) * true,
+-- ["gerror"] = CP() * (l_g + r_g) * CC("grouping") / message,
+-- ["serror"] = CP() * (l_s + r_g) * CC("setup error") / message,
+-- ["derror"] = CP() * d_m * CC("display math error") / message,
+-- ["ierror"] = CP() * i_m * CC("inline math error") / message,
+-- }
+
+local startluacode = P("\\startluacode")
+local stopluacode = P("\\stopluacode")
+
+local somecode = startluacode * (1-stopluacode)^1 * stopluacode
+
+local grammar = P { "tokens",
+ ["tokens"] = (V("ignore") + V("whatever") + V("grouped") + V("setup") + V("display") + V("inline") + V("errors") + 1)^0,
+ ["whatever"] = line + esc * 1 + C(P("%") * (1-line)^0),
+ ["grouped"] = l_g * (V("whatever") + V("grouped") + V("setup") + V("display") + V("inline") + (1 - l_g - r_g))^0 * r_g,
+ ["setup"] = l_s * (okay + V("whatever") + V("grouped") + V("setup") + V("display") + V("inline") + (1 - l_s - r_s))^0 * r_s,
+ ["display"] = d_m * (V("whatever") + V("grouped") + (1 - d_m))^0 * d_m,
+ ["inline"] = i_m * (V("whatever") + V("grouped") + (1 - i_m))^0 * i_m,
+ ["errors"] = (V("gerror")+ V("serror") + V("derror") + V("ierror")),
+ ["gerror"] = CP() * (l_g + r_g) * CC("grouping") / message,
+ ["serror"] = CP() * (l_s + r_g) * CC("setup error") / message,
+ ["derror"] = CP() * d_m * CC("display math error") / message,
+ ["ierror"] = CP() * i_m * CC("inline math error") / message,
+ ["ignore"] = somecode,
+}
+function validator.check(str)
+ validator.n = 1
+ validator.errors = { }
+ grammar:match(str)
end
--~ str = [[
@@ -117,7 +125,7 @@ function scripts.checker.check(filename)
["\t"] = " <tab> ",
})
data = data:gsub("^ *","")
- print(string.format("% 5i %s %s", line,string.rpadd(kind,10," "),data))
+ print(string.format("% 5i %-10s %s", line, kind, data))
end
else
print("no error")
@@ -127,17 +135,13 @@ function scripts.checker.check(filename)
end
end
-logs.extendbanner("Basic ConTeXt Syntax Checking 0.10",true)
-
-messages.help = [[
---convert check tex file for errors
-]]
-
if environment.argument("check") then
scripts.checker.check(environment.files[1])
elseif environment.argument("help") then
- logs.help(messages.help)
+ application.help()
elseif environment.files[1] then
scripts.checker.check(environment.files[1])
+else
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-colors.lua b/Master/texmf-dist/scripts/context/lua/mtx-colors.lua
new file mode 100644
index 00000000000..2a51d50990e
--- /dev/null
+++ b/Master/texmf-dist/scripts/context/lua/mtx-colors.lua
@@ -0,0 +1,57 @@
+if not modules then modules = { } end modules ['mtx-colors'] = {
+ version = 1.001,
+ comment = "companion to mtxrun.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- todo: fc-cache -v en check dirs, or better is: fc-cat -v | grep Directory
+
+local helpinfo = [[
+--table show icc table
+
+example:
+
+mtxrun --script color --table somename
+]]
+
+local application = logs.application {
+ name = "mtx-colors",
+ banner = "ConTeXt Color Management 0.10",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
+if not fontloader then fontloader = fontforge end
+
+dofile(resolvers.findfile("colo-icc.lua","tex"))
+
+scripts = scripts or { }
+scripts.colors = scripts.colors or { }
+
+function scripts.colors.table()
+ local files = environment.files
+ if #files > 0 then
+ for i=1,#files do
+ local profile, okay, message = colors.iccprofile(files[i])
+ if not okay then
+ report(message)
+ else
+ report(table.serialize(profile,"profile"))
+ end
+ end
+ else
+ report("no file(s) given" )
+ end
+end
+
+--~ local track = environment.argument("track")
+--~ if track then trackers.enable(track) end
+
+if environment.argument("table") then
+ scripts.colors.table()
+else
+ application.help()
+end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-context.lua b/Master/texmf-dist/scripts/context/lua/mtx-context.lua
index 79e74e407ff..5645e476050 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-context.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-context.lua
@@ -6,6 +6,93 @@ if not modules then modules = { } end modules ['mtx-context'] = {
license = "see context related readme files"
}
+local format, gmatch, match, gsub, find = string.format, string.gmatch, string.match, string.gsub, string.find
+local quote = string.quote
+local concat = table.concat
+
+local basicinfo = [[
+--run process (one or more) files (default action)
+--make create context formats
+
+--ctx=name use ctx file (process management specification)
+--interface use specified user interface (default: en)
+
+--autopdf close pdf file in viewer and start pdf viewer afterwards
+--purge(all) purge files either or not after a run (--pattern=...)
+
+--usemodule=list load the given module or style, normally part o fthe distribution
+--environment=list load the given environment file first (document styles)
+--mode=list enable given the modes (conditional processing in styles)
+--path=list also consult the given paths when files are looked for
+--arguments=list set variables that can be consulted during a run (key/value pairs)
+--randomseed=number set the randomseed
+--result=name rename the resulting output to the given name
+--trackers=list set tracker variables (show list with --showtrackers)
+--directives=list set directive variables (show list with --showdirectives)
+--silent=list disable logcatgories (show list with --showlogcategories)
+--noconsole disable logging to the console (logfile only)
+--purgeresult purge result file before run
+
+--forcexml force xml stub (optional flag: --mkii)
+--forcecld force cld (context lua document) stub
+
+--arrange run extra imposition pass, given that the style sets up imposition
+--noarrange ignore imposition specifications in the style
+
+--once only run once (no multipass data file is produced)
+--batchmode run without stopping and don't show messages on the console
+--nonstopmode run without stopping
+
+--generate generate file database etc. (as luatools does)
+--paranoid don't descend to .. and ../..
+--version report installed context version
+
+--expert expert options
+]]
+
+-- filter=list is kind of obsolete
+-- color is obsolete for mkiv, always on
+-- separation is obsolete for mkiv, no longer available
+-- output is currently obsolete for mkiv
+-- setuppath=list must check
+-- modefile=name must check
+-- input=name load the given inputfile (must check)
+
+local expertinfo = [[
+expert options:
+
+--touch update context version number (remake needed afterwards, also provide --expert)
+--nostats omit runtime statistics at the end of the run
+--update update context from website (not to be confused with contextgarden)
+--profile profile job (use: mtxrun --script profile --analyze)
+--timing generate timing and statistics overview
+--tracefiles show some extra info when locating files (at the tex end)
+
+--extra=name process extra (mtx-context-<name> in distribution)
+--extras show extras
+]]
+
+local specialinfo = [[
+special options:
+
+--pdftex process file with texexec using pdftex
+--xetex process file with texexec using xetex
+
+--pipe don't check for file and enter scroll mode (--dummyfile=whatever.tmp)
+]]
+
+local application = logs.application {
+ name = "mtx-context",
+ banner = "ConTeXt Process Management 0.52",
+ helpinfo = {
+ basic = basicinfo,
+ extra = extrainfo,
+ expert = expertinfo,
+ }
+}
+
+local report = application.report
+
scripts = scripts or { }
scripts.context = scripts.context or { }
@@ -30,334 +117,334 @@ function io.copydata(fromfile,tofile)
io.savedata(tofile,io.loaddata(fromfile) or "")
end
--- ctx
-
-ctxrunner = { }
-
-do
-
- function ctxrunner.filtered(str,method)
- str = tostring(str)
- if method == 'name' then str = file.removesuffix(file.basename(str))
- elseif method == 'path' then str = file.dirname(str)
- elseif method == 'suffix' then str = file.extname(str)
- elseif method == 'nosuffix' then str = file.removesuffix(str)
- elseif method == 'nopath' then str = file.basename(str)
- elseif method == 'base' then str = file.basename(str)
- -- elseif method == 'full' then
- -- elseif method == 'complete' then
- -- elseif method == 'expand' then -- str = file.expand_path(str)
- end
- return str:gsub("\\","/")
+-- ctx (will become util-ctx)
+
+local ctxrunner = { }
+
+function ctxrunner.filtered(str,method)
+ str = tostring(str)
+ if method == 'name' then str = file.removesuffix(file.basename(str))
+ elseif method == 'path' then str = file.dirname(str)
+ elseif method == 'suffix' then str = file.extname(str)
+ elseif method == 'nosuffix' then str = file.removesuffix(str)
+ elseif method == 'nopath' then str = file.basename(str)
+ elseif method == 'base' then str = file.basename(str)
+-- elseif method == 'full' then
+-- elseif method == 'complete' then
+-- elseif method == 'expand' then -- str = file.expandpath(str)
end
+ return str:gsub("\\","/")
+end
- function ctxrunner.substitute(e,str)
- local attributes = e.at
- if str and attributes then
- if attributes['method'] then
- str = ctxrunner.filtered(str,attributes['method'])
- end
- if str == "" and attributes['default'] then
- str = attributes['default']
- end
+function ctxrunner.substitute(e,str)
+ local attributes = e.at
+ if str and attributes then
+ if attributes['method'] then
+ str = ctxrunner.filtered(str,attributes['method'])
+ end
+ if str == "" and attributes['default'] then
+ str = attributes['default']
end
- return str
end
+ return str
+end
- function ctxrunner.reflag(flags)
- local t = { }
- for _, flag in next, flags do
- local key, value = flag:match("^(.-)=(.+)$")
- if key and value then
- t[key] = value
- else
- t[flag] = true
- end
+function ctxrunner.reflag(flags)
+ local t = { }
+ for _, flag in next, flags do
+ local key, value = match(flag,"^(.-)=(.+)$")
+ if key and value then
+ t[key] = value
+ else
+ t[flag] = true
end
- return t
end
+ return t
+end
- function ctxrunner.substitute(str)
- return str
- end
+function ctxrunner.substitute(str)
+ return str
+end
- function ctxrunner.justtext(str)
- str = xml.unescaped(tostring(str))
- str = xml.cleansed(str)
- str = str:gsub("\\+",'/')
- str = str:gsub("%s+",' ')
- return str
- end
+function ctxrunner.justtext(str)
+ str = xml.unescaped(tostring(str))
+ str = xml.cleansed(str)
+ str = str:gsub("\\+",'/')
+ str = str:gsub("%s+",' ')
+ return str
+end
- function ctxrunner.new()
- return {
- ctxname = "",
- jobname = "",
- xmldata = nil,
- suffix = "prep",
- locations = { '..', '../..' },
- variables = { },
- messages = { },
- environments = { },
- modules = { },
- filters = { },
- flags = { },
- modes = { },
- prepfiles = { },
- paths = { },
- }
- end
+function ctxrunner.new()
+ return {
+ ctxname = "",
+ jobname = "",
+ xmldata = nil,
+ suffix = "prep",
+ locations = { '..', '../..' },
+ variables = { },
+ messages = { },
+ environments = { },
+ modules = { },
+ filters = { },
+ flags = { },
+ modes = { },
+ prepfiles = { },
+ paths = { },
+ }
+end
- function ctxrunner.savelog(ctxdata,ctlname)
- local function yn(b)
- if b then return 'yes' else return 'no' end
- end
- if not ctlname or ctlname == "" or ctlname == ctxdata.jobname then
- if ctxdata.jobname then
- ctlname = file.replacesuffix(ctxdata.jobname,'ctl')
- elseif ctxdata.ctxname then
- ctlname = file.replacesuffix(ctxdata.ctxname,'ctl')
- else
- logs.simple("invalid ctl name: %s",ctlname or "?")
- return
- end
+function ctxrunner.savelog(ctxdata,ctlname)
+ local function yn(b)
+ if b then return 'yes' else return 'no' end
+ end
+ if not ctlname or ctlname == "" or ctlname == ctxdata.jobname then
+ if ctxdata.jobname then
+ ctlname = file.replacesuffix(ctxdata.jobname,'ctl')
+ elseif ctxdata.ctxname then
+ ctlname = file.replacesuffix(ctxdata.ctxname,'ctl')
+ else
+ report("invalid ctl name: %s",ctlname or "?")
+ return
end
- local prepfiles = ctxdata.prepfiles
- if prepfiles and next(prepfiles) then
- logs.simple("saving logdata in: %s",ctlname)
- f = io.open(ctlname,'w')
- if f then
- f:write("<?xml version='1.0' standalone='yes'?>\n\n")
- f:write(string.format("<ctx:preplist local='%s'>\n",yn(ctxdata.runlocal)))
- local sorted = table.sortedkeys(prepfiles)
- for i=1,#sorted do
- local name = sorted[i]
- f:write(string.format("\t<ctx:prepfile done='%s'>%s</ctx:prepfile>\n",yn(prepfiles[name]),name))
- end
- f:write("</ctx:preplist>\n")
- f:close()
+ end
+ local prepfiles = ctxdata.prepfiles
+ if prepfiles and next(prepfiles) then
+ report("saving logdata in: %s",ctlname)
+ f = io.open(ctlname,'w')
+ if f then
+ f:write("<?xml version='1.0' standalone='yes'?>\n\n")
+ f:write(format("<ctx:preplist local='%s'>\n",yn(ctxdata.runlocal)))
+ local sorted = table.sortedkeys(prepfiles)
+ for i=1,#sorted do
+ local name = sorted[i]
+ f:write(format("\t<ctx:prepfile done='%s'>%s</ctx:prepfile>\n",yn(prepfiles[name]),name))
end
- else
- logs.simple("nothing prepared, no ctl file saved")
- os.remove(ctlname)
+ f:write("</ctx:preplist>\n")
+ f:close()
end
+ else
+ report("nothing prepared, no ctl file saved")
+ os.remove(ctlname)
end
+end
- function ctxrunner.register_path(ctxdata,path)
- -- test if exists
- ctxdata.paths[ctxdata.paths+1] = path
- end
+function ctxrunner.register_path(ctxdata,path)
+ -- test if exists
+ ctxdata.paths[ctxdata.paths+1] = path
+end
- function ctxrunner.trace(ctxdata)
- print(table.serialize(ctxdata.messages))
- print(table.serialize(ctxdata.flags))
- print(table.serialize(ctxdata.environments))
- print(table.serialize(ctxdata.modules))
- print(table.serialize(ctxdata.filters))
- print(table.serialize(ctxdata.modes))
- print(xml.tostring(ctxdata.xmldata))
- end
+function ctxrunner.trace(ctxdata)
+ print(table.serialize(ctxdata.messages))
+ print(table.serialize(ctxdata.flags))
+ print(table.serialize(ctxdata.environments))
+ print(table.serialize(ctxdata.modules))
+ print(table.serialize(ctxdata.filters))
+ print(table.serialize(ctxdata.modes))
+ print(xml.tostring(ctxdata.xmldata))
+end
- function ctxrunner.manipulate(ctxdata,ctxname,defaultname)
+function ctxrunner.manipulate(ctxdata,ctxname,defaultname)
- if not ctxdata.jobname or ctxdata.jobname == "" then
- return
- end
+ if not ctxdata.jobname or ctxdata.jobname == "" then
+ return
+ end
- ctxdata.ctxname = ctxname or file.removesuffix(ctxdata.jobname) or ""
+ ctxdata.ctxname = ctxname or file.removesuffix(ctxdata.jobname) or ""
- if ctxdata.ctxname == "" then
- return
- end
+ if ctxdata.ctxname == "" then
+ return
+ end
- ctxdata.jobname = file.addsuffix(ctxdata.jobname,'tex')
- ctxdata.ctxname = file.addsuffix(ctxdata.ctxname,'ctx')
+ ctxdata.jobname = file.addsuffix(ctxdata.jobname,'tex')
+ ctxdata.ctxname = file.addsuffix(ctxdata.ctxname,'ctx')
- logs.simple("jobname: %s",ctxdata.jobname)
- logs.simple("ctxname: %s",ctxdata.ctxname)
+ report("jobname: %s",ctxdata.jobname)
+ report("ctxname: %s",ctxdata.ctxname)
- -- mtxrun should resolve kpse: and file:
+ -- mtxrun should resolve kpse: and file:
- local usedname = ctxdata.ctxname
- local found = lfs.isfile(usedname)
+ local usedname = ctxdata.ctxname
+ local found = lfs.isfile(usedname)
- if not found then
- for _, path in next, ctxdata.locations do
- local fullname = file.join(path,ctxdata.ctxname)
- if lfs.isfile(fullname) then
- usedname, found = fullname, true
- break
- end
+ -- no futher test if qualified path
+
+ if not found then
+ for _, path in next, ctxdata.locations do
+ local fullname = file.join(path,ctxdata.ctxname)
+ if lfs.isfile(fullname) then
+ usedname, found = fullname, true
+ break
end
end
+ end
- usedname = resolvers.find_file(ctxdata.ctxname,"tex")
+ if not found then
+ usedname = resolvers.findfile(ctxdata.ctxname,"tex")
found = usedname ~= ""
+ end
- if not found and defaultname and defaultname ~= "" and lfs.isfile(defaultname) then
- usedname, found = defaultname, true
- end
+ if not found and defaultname and defaultname ~= "" and lfs.isfile(defaultname) then
+ usedname, found = defaultname, true
+ end
- if not found then
- return
- end
+ if not found then
+ return
+ end
- ctxdata.xmldata = xml.load(usedname)
+ ctxdata.xmldata = xml.load(usedname)
- if not ctxdata.xmldata then
- return
- else
- -- test for valid, can be text file
- end
+ if not ctxdata.xmldata then
+ return
+ else
+ -- test for valid, can be text file
+ end
- xml.include(ctxdata.xmldata,'ctx:include','name', table.append({'.', file.dirname(ctxdata.ctxname)},ctxdata.locations))
+ xml.include(ctxdata.xmldata,'ctx:include','name', table.append({'.', file.dirname(ctxdata.ctxname)},ctxdata.locations))
- ctxdata.variables['job'] = ctxdata.jobname
+ ctxdata.variables['job'] = ctxdata.jobname
- ctxdata.flags = xml.collect_texts(ctxdata.xmldata,"/ctx:job/ctx:flags/ctx:flag",true)
- ctxdata.environments = xml.collect_texts(ctxdata.xmldata,"/ctx:job/ctx:process/ctx:resources/ctx:environment",true)
- ctxdata.modules = xml.collect_texts(ctxdata.xmldata,"/ctx:job/ctx:process/ctx:resources/ctx:module",true)
- ctxdata.filters = xml.collect_texts(ctxdata.xmldata,"/ctx:job/ctx:process/ctx:resources/ctx:filter",true)
- ctxdata.modes = xml.collect_texts(ctxdata.xmldata,"/ctx:job/ctx:process/ctx:resources/ctx:mode",true)
- ctxdata.messages = xml.collect_texts(ctxdata.xmldata,"ctx:message",true)
+ ctxdata.flags = xml.collect_texts(ctxdata.xmldata,"/ctx:job/ctx:flags/ctx:flag",true)
+ ctxdata.environments = xml.collect_texts(ctxdata.xmldata,"/ctx:job/ctx:process/ctx:resources/ctx:environment",true)
+ ctxdata.modules = xml.collect_texts(ctxdata.xmldata,"/ctx:job/ctx:process/ctx:resources/ctx:module",true)
+ ctxdata.filters = xml.collect_texts(ctxdata.xmldata,"/ctx:job/ctx:process/ctx:resources/ctx:filter",true)
+ ctxdata.modes = xml.collect_texts(ctxdata.xmldata,"/ctx:job/ctx:process/ctx:resources/ctx:mode",true)
+ ctxdata.messages = xml.collect_texts(ctxdata.xmldata,"ctx:message",true)
- ctxdata.flags = ctxrunner.reflag(ctxdata.flags)
+ ctxdata.flags = ctxrunner.reflag(ctxdata.flags)
- local messages = ctxdata.messages
- for i=1,#messages do
- logs.simple("ctx comment: %s", xml.tostring(messages[i]))
- end
+ local messages = ctxdata.messages
+ for i=1,#messages do
+ report("ctx comment: %s", xml.tostring(messages[i]))
+ end
- for r, d, k in xml.elements(ctxdata.xmldata,"ctx:value[@name='job']") do
- d[k] = ctxdata.variables['job'] or ""
- end
+ for r, d, k in xml.elements(ctxdata.xmldata,"ctx:value[@name='job']") do
+ d[k] = ctxdata.variables['job'] or ""
+ end
- local commands = { }
- for e in xml.collected(ctxdata.xmldata,"/ctx:job/ctx:preprocess/ctx:processors/ctx:processor") do
- commands[e.at and e.at['name'] or "unknown"] = e
- end
+ local commands = { }
+ for e in xml.collected(ctxdata.xmldata,"/ctx:job/ctx:preprocess/ctx:processors/ctx:processor") do
+ commands[e.at and e.at['name'] or "unknown"] = e
+ end
- local suffix = xml.filter(ctxdata.xmldata,"/ctx:job/ctx:preprocess/attribute('suffix')") or ctxdata.suffix
- local runlocal = xml.filter(ctxdata.xmldata,"/ctx:job/ctx:preprocess/ctx:processors/attribute('local')")
+ local suffix = xml.filter(ctxdata.xmldata,"/ctx:job/ctx:preprocess/attribute('suffix')") or ctxdata.suffix
+ local runlocal = xml.filter(ctxdata.xmldata,"/ctx:job/ctx:preprocess/ctx:processors/attribute('local')")
- runlocal = toboolean(runlocal)
+ runlocal = toboolean(runlocal)
- for files in xml.collected(ctxdata.xmldata,"/ctx:job/ctx:preprocess/ctx:files") do
- for pattern in xml.collected(files,"ctx:file") do
+ for files in xml.collected(ctxdata.xmldata,"/ctx:job/ctx:preprocess/ctx:files") do
+ for pattern in xml.collected(files,"ctx:file") do
- preprocessor = pattern.at['processor'] or ""
+ preprocessor = pattern.at['processor'] or ""
- if preprocessor ~= "" then
+ if preprocessor ~= "" then
- ctxdata.variables['old'] = ctxdata.jobname
- for r, d, k in xml.elements(ctxdata.xmldata,"ctx:value") do
- local ek = d[k]
- local ekat = ek.at['name']
- if ekat == 'old' then
- d[k] = ctxrunner.substitute(ctxdata.variables[ekat] or "")
- end
+ ctxdata.variables['old'] = ctxdata.jobname
+ for r, d, k in xml.elements(ctxdata.xmldata,"ctx:value") do
+ local ek = d[k]
+ local ekat = ek.at['name']
+ if ekat == 'old' then
+ d[k] = ctxrunner.substitute(ctxdata.variables[ekat] or "")
end
+ end
- pattern = ctxrunner.justtext(xml.tostring(pattern))
+ pattern = ctxrunner.justtext(xml.tostring(pattern))
- local oldfiles = dir.glob(pattern)
+ local oldfiles = dir.glob(pattern)
- local pluspath = false
- if #oldfiles == 0 then
- -- message: no files match pattern
- local paths = ctxdata.paths
- for i=1,#paths do
- local p = paths[i]
- local oldfiles = dir.glob(path.join(p,pattern))
- if #oldfiles > 0 then
- pluspath = true
- break
- end
+ local pluspath = false
+ if #oldfiles == 0 then
+ -- message: no files match pattern
+ local paths = ctxdata.paths
+ for i=1,#paths do
+ local p = paths[i]
+ local oldfiles = dir.glob(path.join(p,pattern))
+ if #oldfiles > 0 then
+ pluspath = true
+ break
end
end
- if #oldfiles == 0 then
- -- message: no old files
- else
- for i=1,#oldfiles do
- local oldfile = oldfiles[i]
- local newfile = oldfile .. "." .. suffix -- addsuffix will add one only
- if ctxdata.runlocal then
- newfile = file.basename(newfile)
- end
- if oldfile ~= newfile and file.needsupdate(oldfile,newfile) then
- -- message: oldfile needs preprocessing
- -- os.remove(newfile)
- local splitted = preprocessor:split(',')
- for i=1,#splitted do
- local pp = splitted[i]
- local command = commands[pp]
- if command then
- command = xml.copy(command)
- local suf = (command.at and command.at['suffix']) or ctxdata.suffix
- if suf then
- newfile = oldfile .. "." .. suf
- end
- if ctxdata.runlocal then
- newfile = file.basename(newfile)
- end
- for r, d, k in xml.elements(command,"ctx:old") do
- d[k] = ctxrunner.substitute(oldfile)
- end
- for r, d, k in xml.elements(command,"ctx:new") do
- d[k] = ctxrunner.substitute(newfile)
- end
- ctxdata.variables['old'] = oldfile
- ctxdata.variables['new'] = newfile
- for r, d, k in xml.elements(command,"ctx:value") do
- local ek = d[k]
- local ekat = ek.at and ek.at['name']
- if ekat then
- d[k] = ctxrunner.substitute(ctxdata.variables[ekat] or "")
- end
- end
- -- potential optimization: when mtxrun run internal
- command = xml.content(command)
- command = ctxrunner.justtext(command)
- logs.simple("command: %s",command)
- local result = os.spawn(command) or 0
- -- somehow we get the wrong return value
- if result > 0 then
- logs.simple("error, return code: %s",result)
- end
- if ctxdata.runlocal then
- oldfile = file.basename(oldfile)
+ end
+ if #oldfiles == 0 then
+ -- message: no old files
+ else
+ for i=1,#oldfiles do
+ local oldfile = oldfiles[i]
+ local newfile = oldfile .. "." .. suffix -- addsuffix will add one only
+ if ctxdata.runlocal then
+ newfile = file.basename(newfile)
+ end
+ if oldfile ~= newfile and file.needsupdate(oldfile,newfile) then
+ -- message: oldfile needs preprocessing
+ -- os.remove(newfile)
+ local splitted = preprocessor:split(',')
+ for i=1,#splitted do
+ local pp = splitted[i]
+ local command = commands[pp]
+ if command then
+ command = xml.copy(command)
+ local suf = (command.at and command.at['suffix']) or ctxdata.suffix
+ if suf then
+ newfile = oldfile .. "." .. suf
+ end
+ if ctxdata.runlocal then
+ newfile = file.basename(newfile)
+ end
+ for r, d, k in xml.elements(command,"ctx:old") do
+ d[k] = ctxrunner.substitute(oldfile)
+ end
+ for r, d, k in xml.elements(command,"ctx:new") do
+ d[k] = ctxrunner.substitute(newfile)
+ end
+ ctxdata.variables['old'] = oldfile
+ ctxdata.variables['new'] = newfile
+ for r, d, k in xml.elements(command,"ctx:value") do
+ local ek = d[k]
+ local ekat = ek.at and ek.at['name']
+ if ekat then
+ d[k] = ctxrunner.substitute(ctxdata.variables[ekat] or "")
end
end
+ -- potential optimization: when mtxrun run internal
+ command = xml.content(command)
+ command = ctxrunner.justtext(command)
+ report("command: %s",command)
+ local result = os.spawn(command) or 0
+ -- somehow we get the wrong return value
+ if result > 0 then
+ report("error, return code: %s",result)
+ end
+ if ctxdata.runlocal then
+ oldfile = file.basename(oldfile)
+ end
end
- if lfs.isfile(newfile) then
- file.syncmtimes(oldfile,newfile)
- ctxdata.prepfiles[oldfile] = true
- else
- logs.simple("error, check target location of new file: %s", newfile)
- ctxdata.prepfiles[oldfile] = false
- end
+ end
+ if lfs.isfile(newfile) then
+ file.syncmtimes(oldfile,newfile)
+ ctxdata.prepfiles[oldfile] = true
else
- logs.simple("old file needs no preprocessing")
- ctxdata.prepfiles[oldfile] = lfs.isfile(newfile)
+ report("error, check target location of new file: %s", newfile)
+ ctxdata.prepfiles[oldfile] = false
end
+ else
+ report("old file needs no preprocessing")
+ ctxdata.prepfiles[oldfile] = lfs.isfile(newfile)
end
end
end
end
end
+ end
- ctxrunner.savelog(ctxdata)
+ ctxrunner.savelog(ctxdata)
- end
+end
- function ctxrunner.preppedfile(ctxdata,filename)
- if ctxdata.prepfiles[file.basename(filename)] then
- return filename .. ".prep"
- else
- return filename
- end
+function ctxrunner.preppedfile(ctxdata,filename)
+ if ctxdata.prepfiles[file.basename(filename)] then
+ return filename .. ".prep"
+ else
+ return filename
end
-
end
-- rest
@@ -388,14 +475,6 @@ function scripts.context.multipass.changed(oldhash, newhash)
return false
end
-scripts.context.backends = {
- pdftex = 'pdftex',
- luatex = 'pdftex',
- pdf = 'pdftex',
- dvi = 'dvipdfmx',
- dvips = 'dvips'
-}
-
function scripts.context.multipass.makeoptionfile(jobname,ctxdata,kindofrun,currentrun,finalrun)
-- take jobname from ctx
jobname = file.removesuffix(jobname)
@@ -404,62 +483,51 @@ function scripts.context.multipass.makeoptionfile(jobname,ctxdata,kindofrun,curr
local function someflag(flag)
return (ctxdata and ctxdata.flags[flag]) or environment.argument(flag)
end
- local function setvalue(flag,format,hash,default)
+ local function setvalue(flag,template,hash,default)
local a = someflag(flag) or default
if a and a ~= "" then
if hash then
if hash[a] then
- f:write(format:format(a),"\n")
+ f:write(format(template,a),"\n")
end
else
- f:write(format:format(a),"\n")
+ f:write(format(template,a),"\n")
end
end
end
- local function setvalues(flag,format,plural)
+ local function setvalues(flag,template,plural)
if type(flag) == "table" then
for k, v in next, flag do
- f:write(format:format(v),"\n")
+ f:write(format(template,v),"\n")
end
else
local a = someflag(flag) or (plural and someflag(flag.."s"))
if a and a ~= "" then
- for v in a:gmatch("%s*([^,]+)") do
- f:write(format:format(v),"\n")
+ for v in gmatch(a,"%s*([^,]+)") do
+ f:write(format(template,v),"\n")
end
end
end
end
- local function setfixed(flag,format,...)
+ local function setfixed(flag,template,...)
if someflag(flag) then
- f:write(format:format(...),"\n")
+ f:write(format(template,...),"\n")
end
end
- local function setalways(format,...)
- f:write(format:format(...),"\n")
+ local function setalways(template,...)
+ f:write(format(template,...),"\n")
end
--
+ -- This might change ... we can just pass the relevant flags directly.
+ --
setalways("%% runtime options files (command line driven)")
--
setalways("\\unprotect")
--
- setalways("%% special commands, mostly for the ctx development team")
- --
- if environment.argument("dumpdelta") then
- setalways("\\tracersdumpdelta")
- elseif environment.argument("dumphash") then
- setalways("\\tracersdumphash")
- end
setalways("%% feedback and basic job control")
- if type(environment.argument("track")) == "string" then
- setvalue ("track" , "\\enabletrackers[%s]")
- end
- if type(environment.argument("trackers")) == "string" then
- setvalue ("trackers" , "\\enabletrackers[%s]")
- end
- if type(environment.argument("directives")) == "string" then
- setvalue ("directives", "\\enabledirectives[%s]")
- end
+ --
+ -- Option file, we can pass more on the commandline some day soon.
+ --
setfixed ("timing" , "\\usemodule[timing]")
setfixed ("batchmode" , "\\batchmode")
setfixed ("batch" , "\\batchmode")
@@ -479,11 +547,9 @@ function scripts.context.multipass.makeoptionfile(jobname,ctxdata,kindofrun,curr
--
setalways("%% process info")
--
- -- setvalue ("inputfile" , "\\setupsystem[inputfile=%s]")
setalways( "\\setupsystem[inputfile=%s]",environment.argument("input") or environment.files[1] or "\\jobname")
setvalue ("result" , "\\setupsystem[file=%s]")
setalways( "\\setupsystem[\\c!n=%s,\\c!m=%s]", kindofrun or 0, currentrun or 0)
- -- setalways( "\\setupsystem[\\c!type=%s]",os.type) -- windows or unix
setvalues("path" , "\\usepath[%s]")
setvalue ("setuppath" , "\\setupsystem[\\c!directory={%s}]")
setvalue ("randomseed" , "\\setupsystem[\\c!random=%s]")
@@ -498,7 +564,6 @@ function scripts.context.multipass.makeoptionfile(jobname,ctxdata,kindofrun,curr
setalways("%% options (not that important)")
--
setalways("\\startsetups *runtime:options")
- setvalue ('output' , "\\setupoutput[%s]", scripts.context.backends, 'pdftex')
setfixed ("color" , "\\setupcolors[\\c!state=\\v!start]")
setvalue ("separation" , "\\setupcolors[\\c!split=%s]")
setfixed ("noarrange" , "\\setuparranging[\\v!disable]")
@@ -510,7 +575,6 @@ function scripts.context.multipass.makeoptionfile(jobname,ctxdata,kindofrun,curr
setalways("%% styles and modules")
--
setalways("\\startsetups *runtime:modules")
- setvalues("filter" , "\\useXMLfilter[%s]", true)
setvalues("usemodule" , "\\usemodule[%s]", true)
setvalues("environment" , "\\environment %s ", true)
if ctxdata then
@@ -527,7 +591,6 @@ function scripts.context.multipass.makeoptionfile(jobname,ctxdata,kindofrun,curr
end
function scripts.context.multipass.copyluafile(jobname)
--- io.savedata(jobname..".tuc",io.loaddata(jobname..".tua") or "")
local tuaname, tucname = jobname..".tua", jobname..".tuc"
if lfs.isfile(tuaname) then
os.remove(tucname)
@@ -535,28 +598,6 @@ function scripts.context.multipass.copyluafile(jobname)
end
end
--- obsolete:
---
--- function scripts.context.multipass.copytuifile(jobname)
--- local tuiname, tuoname = jobname .. ".tui", jobname .. ".tuo"
--- if lfs.isfile(tuiname) then
--- local f, g = io.open(tuiname), io.open(tuoname,'w')
--- if f and g then
--- g:write("% traditional utility file, only commands written by mtxrun/context\n%\n")
--- for line in f:lines() do
--- if line:find("^c ") then
--- g:write((line:gsub("^c ","")),"%\n")
--- end
--- end
--- g:write("\\endinput\n")
--- f:close()
--- g:close()
--- end
--- else
--- -- os.remove(tuoname)
--- end
--- end
-
scripts.context.cldsuffixes = table.tohash {
"cld",
}
@@ -591,20 +632,20 @@ scripts.context.interfaces = {
scripts.context.defaultformats = {
"cont-en",
"cont-nl",
- "mptopdf",
--- "metatex",
- "metafun",
+-- "mptopdf", -- todo: mak emkiv variant
+-- "metatex", -- will show up soon
+-- "metafun", -- todo: mp formats
-- "plain"
}
-local function analyze(filename)
+local function analyze(filename) -- only files on current path
local f = io.open(file.addsuffix(filename,"tex"))
if f then
local t = { }
local line = f:read("*line") or ""
- local preamble = line:match("[\254\255]*%%%s+(.+)$") -- there can be an utf bomb in front
+ local preamble = match(line,"[\254\255]*%%%s+(.+)$") -- there can be an utf bomb in front
if preamble then
- for key, value in preamble:gmatch("(%S+)=(%S+)") do
+ for key, value in gmatch(preamble,"(%S+)=(%S+)") do
t[key] = value
end
t.type = "tex"
@@ -623,13 +664,17 @@ local function analyze(filename)
return nil
end
-local function makestub(format,filename,prepname)
+local function makestub(wrap,template,filename,prepname)
local stubname = file.replacesuffix(file.basename(filename),'run')
local f = io.open(stubname,'w')
if f then
- f:write("\\starttext\n")
- f:write(string.format(format,prepname or filename),"\n")
- f:write("\\stoptext\n")
+ if wrap then
+ f:write("\\starttext\n")
+ end
+ f:write(format(template,prepname or filename),"\n")
+ if wrap then
+ f:write("\\stoptext\n")
+ end
f:close()
filename = stubname
end
@@ -637,22 +682,24 @@ local function makestub(format,filename,prepname)
end
--~ function scripts.context.openpdf(name)
---~ os.spawn(string.format('pdfopen --file "%s" 2>&1', file.replacesuffix(name,"pdf")))
+--~ os.spawn(format('pdfopen --file "%s" 2>&1', file.replacesuffix(name,"pdf")))
--~ end
--~ function scripts.context.closepdf(name)
---~ os.spawn(string.format('pdfclose --file "%s" 2>&1', file.replacesuffix(name,"pdf")))
+--~ os.spawn(format('pdfclose --file "%s" 2>&1', file.replacesuffix(name,"pdf")))
--~ end
local pdfview -- delayed loading
-function scripts.context.openpdf(name)
- pdfview = pdfview or dofile(resolvers.find_file("l-pdfview.lua","tex"))
- logs.simple("pdfview methods: %s, current method: %s, MTX_PDFVIEW_METHOD=%s",pdfview.methods(),pdfview.method,os.getenv(pdfview.METHOD) or "<unset>")
+function scripts.context.openpdf(name,method)
+ pdfview = pdfview or dofile(resolvers.findfile("l-pdfview.lua","tex"))
+ pdfview.setmethod(method)
+ report(pdfview.status())
pdfview.open(file.replacesuffix(name,"pdf"))
end
-function scripts.context.closepdf(name)
- pdfview = pdfview or dofile(resolvers.find_file("l-pdfview.lua","tex"))
+function scripts.context.closepdf(name,method)
+ pdfview = pdfview or dofile(resolvers.findfile("l-pdfview.lua","tex"))
+ pdfview.setmethod(method)
pdfview.close(file.replacesuffix(name,"pdf"))
end
@@ -672,13 +719,12 @@ function scripts.context.run(ctxdata,filename)
interface = (type(interface) == "string" and interface) or "en"
--
local formatname = scripts.context.interfaces[interface] or "cont-en"
- local formatfile, scriptfile = resolvers.locate_format(formatname)
+ local formatfile, scriptfile = resolvers.locateformat(formatname)
-- this catches the command line
if not formatfile or not scriptfile then
- logs.simple("warning: no format found, forcing remake (commandline driven)")
- scripts.context.generate()
+ report("warning: no format found, forcing remake (commandline driven)")
scripts.context.make(formatname)
- formatfile, scriptfile = resolvers.locate_format(formatname)
+ formatfile, scriptfile = resolvers.locateformat(formatname)
end
--
if formatfile and scriptfile then
@@ -686,7 +732,7 @@ function scripts.context.run(ctxdata,filename)
local filename = files[i]
local basename, pathname = file.basename(filename), file.dirname(filename)
local jobname = file.removesuffix(basename)
- if pathname == "" then
+ if pathname == "" and not environment.argument("global") then
filename = "./" .. filename
end
-- look at the first line
@@ -698,24 +744,34 @@ function scripts.context.run(ctxdata,filename)
--
-- require "mtx-texutil.lua"
else
- local texexec = resolvers.find_file("texexec.rb") or ""
+ local texexec = resolvers.findfile("texexec.rb") or ""
if texexec ~= "" then
os.setenv("RUBYOPT","")
- local command = string.format("ruby %s %s",texexec,environment.reconstruct_commandline(environment.arguments_after))
- os.exec(command)
+ local options = environment.reconstructcommandline(environment.arguments_after)
+ options = gsub(options,"--purge","")
+ options = gsub(options,"--purgeall","")
+ local command = format("ruby %s %s",texexec,options)
+ if environment.argument("purge") then
+ os.execute(command)
+ scripts.context.purge_job(filename,false,true)
+ elseif environment.argument("purgeall") then
+ os.execute(command)
+ scripts.context.purge_job(filename,true,true)
+ else
+ os.exec(command)
+ end
end
end
else
if a and a.interface and a.interface ~= interface then
formatname = scripts.context.interfaces[a.interface] or formatname
- formatfile, scriptfile = resolvers.locate_format(formatname)
+ formatfile, scriptfile = resolvers.locateformat(formatname)
end
-- this catches the command line
if not formatfile or not scriptfile then
- logs.simple("warning: no format found, forcing remake (source driven)")
- scripts.context.generate()
+ report("warning: no format found, forcing remake (source driven)")
scripts.context.make(formatname)
- formatfile, scriptfile = resolvers.locate_format(formatname)
+ formatfile, scriptfile = resolvers.locateformat(formatname)
end
if formatfile and scriptfile then
-- we default to mkiv xml !
@@ -723,17 +779,18 @@ function scripts.context.run(ctxdata,filename)
local suffix = file.extname(filename) or "?"
if scripts.context.xmlsuffixes[suffix] or environment.argument("forcexml") then
if environment.argument("mkii") then
- filename = makestub("\\processXMLfilegrouped{%s}",filename)
+ filename = makestub(true,"\\processXMLfilegrouped{%s}",filename)
else
- filename = makestub("\\xmlprocess{\\xmldocument}{%s}{}",filename)
+ filename = makestub(true,"\\xmlprocess{\\xmldocument}{%s}{}",filename)
end
elseif scripts.context.cldsuffixes[suffix] or environment.argument("forcecld") then
- filename = makestub("\\ctxlua{context.runfile('%s')}",filename)
+ -- self contained cld files need to have a starttext/stoptext (less fontloading)
+ filename = makestub(false,"\\ctxlua{context.runfile('%s')}",filename)
elseif scripts.context.luasuffixes[suffix] or environment.argument("forcelua") then
- filename = makestub("\\ctxlua{dofile('%s')}",filename)
+ filename = makestub(true,"\\ctxlua{dofile('%s')}",filename)
elseif environment.argument("prep") then
-- we need to keep the original jobname
- filename = makestub("\\readfile{%s}{}{}",filename,ctxrunner.preppedfile(ctxdata,filename))
+ filename = makestub(true,"\\readfile{%s}{}{}",filename,ctxrunner.preppedfile(ctxdata,filename))
end
--
-- todo: also other stubs
@@ -747,14 +804,23 @@ function scripts.context.run(ctxdata,filename)
oldbase = file.removesuffix(jobname)
newbase = file.removesuffix(resultname)
if oldbase ~= newbase then
- for _, suffix in next, scripts.context.beforesuffixes do
- local oldname = file.addsuffix(oldbase,suffix)
- local newname = file.addsuffix(newbase,suffix)
- local tmpname = "keep-"..oldname
- os.remove(tmpname)
- os.rename(oldname,tmpname)
- os.remove(oldname)
- os.rename(newname,oldname)
+ if environment.argument("purgeresult") then
+ for _, suffix in next, scripts.context.aftersuffixes do
+ local oldname = file.addsuffix(oldbase,suffix)
+ local newname = file.addsuffix(newbase,suffix)
+ os.remove(newname)
+ os.remove(oldname)
+ end
+ else
+ for _, suffix in next, scripts.context.beforesuffixes do
+ local oldname = file.addsuffix(oldbase,suffix)
+ local newname = file.addsuffix(newbase,suffix)
+ local tmpname = "keep-"..oldname
+ os.remove(tmpname)
+ os.rename(oldname,tmpname)
+ os.remove(oldname)
+ os.rename(newname,oldname)
+ end
end
else
resultname = nil
@@ -763,17 +829,17 @@ function scripts.context.run(ctxdata,filename)
resultname = nil
end
--
- if environment.argument("autopdf") then
- scripts.context.closepdf(filename)
+ local pdfview = environment.argument("autopdf") or environment.argument("closepdf")
+ if pdfview then
+ scripts.context.closepdf(filename,pdfview)
if resultname then
- scripts.context.closepdf(resultname)
+ scripts.context.closepdf(resultname,pdfview)
end
end
--
- local okay = statistics.check_fmt_status(formatfile)
+ local okay = statistics.checkfmtstatus(formatfile)
if okay ~= true then
- logs.simple("warning: %s, forcing remake",tostring(okay))
- scripts.context.generate()
+ report("warning: %s, forcing remake",tostring(okay))
scripts.context.make(formatname)
end
--
@@ -782,13 +848,57 @@ function scripts.context.run(ctxdata,filename)
flags[#flags+1] = "--interaction=batchmode"
end
if environment.argument("synctex") then
- logs.simple("warning: syntex is enabled") -- can add upto 5% runtime
+ -- this should become a directive
+ report("warning: synctex is enabled") -- can add upto 5% runtime
flags[#flags+1] = "--synctex=1"
end
- flags[#flags+1] = "--fmt=" .. string.quote(formatfile)
- flags[#flags+1] = "--lua=" .. string.quote(scriptfile)
- flags[#flags+1] = "--backend=pdf"
- local command = string.format("luatex %s %s", table.concat(flags," "), string.quote(filename))
+ flags[#flags+1] = "--fmt=" .. quote(formatfile)
+ flags[#flags+1] = "--lua=" .. quote(scriptfile)
+ --
+ -- We pass these directly.
+ --
+
+--~ local silent = environment.argument("silent")
+--~ local noconsole = environment.argument("noconsole")
+--~ local directives = environment.argument("directives")
+--~ local trackers = environment.argument("trackers")
+--~ if silent == true then
+--~ silent = "*"
+--~ end
+--~ if type(silent) == "string" then
+--~ if type(directives) == "string" then
+--~ directives = format("%s,logs.blocked={%s}",directives,silent)
+--~ else
+--~ directives = format("logs.blocked={%s}",silent)
+--~ end
+--~ end
+--~ if noconsole then
+--~ if type(directives) == "string" then
+--~ directives = format("%s,logs.target=file",directives)
+--~ else
+--~ directives = format("logs.target=file")
+--~ end
+--~ end
+
+ local directives = environment.directives
+ local trackers = environment.trackers
+ local experiments = environment.experiments
+
+ --
+ if type(directives) == "string" then
+ flags[#flags+1] = format('--directives="%s"',directives)
+ end
+ if type(trackers) == "string" then
+ flags[#flags+1] = format('--trackers="%s"',trackers)
+ end
+ --
+ local backend = environment.argument("backend")
+ if type(backend) ~= "string" then
+ backend = "pdf"
+ end
+ flags[#flags+1] = format('--backend="%s"',backend)
+ --
+ local command = format("luatex %s %s", concat(flags," "), quote(filename))
local oldhash, newhash = scripts.context.multipass.hashfiles(jobname), { }
local once = environment.argument("once")
local maxnofruns = (once and 1) or scripts.context.multipass.nofruns
@@ -797,23 +907,24 @@ function scripts.context.run(ctxdata,filename)
-- 1:first run, 2:successive run, 3:once, 4:last of maxruns
local kindofrun = (once and 3) or (i==1 and 1) or (i==maxnofruns and 4) or 2
scripts.context.multipass.makeoptionfile(jobname,ctxdata,kindofrun,i,false) -- kindofrun, currentrun, final
- logs.simple("run %s: %s",i,command)
+ report("run %s: %s",i,command)
+--~ print("\n") -- cleaner, else continuation on same line
+ print("") -- cleaner, else continuation on same line
local returncode, errorstring = os.spawn(command)
--~ if returncode == 3 then
- --~ scripts.context.generate()
--~ scripts.context.make(formatname)
--~ returncode, errorstring = os.spawn(command)
--~ if returncode == 3 then
- --~ logs.simple("ks: return code 3, message: %s",errorstring or "?")
+ --~ report("ks: return code 3, message: %s",errorstring or "?")
--~ os.exit(1)
--~ end
--~ end
if not returncode then
- logs.simple("fatal error: no return code, message: %s",errorstring or "?")
+ report("fatal error: no return code, message: %s",errorstring or "?")
os.exit(1)
break
elseif returncode > 0 then
- logs.simple("fatal error: return code: %s",returncode or "?")
+ report("fatal error: return code: %s",returncode or "?")
os.exit(returncode)
break
else
@@ -831,13 +942,13 @@ function scripts.context.run(ctxdata,filename)
if arrange then
local kindofrun = 3
scripts.context.multipass.makeoptionfile(jobname,ctxdata,kindofrun,i,true) -- kindofrun, currentrun, final
- logs.simple("arrange run: %s",command)
+ report("arrange run: %s",command)
local returncode, errorstring = os.spawn(command)
if not returncode then
- logs.simple("fatal error: no return code, message: %s",errorstring or "?")
+ report("fatal error: no return code, message: %s",errorstring or "?")
os.exit(1)
elseif returncode > 0 then
- logs.simple("fatal error: return code: %s",returncode or "?")
+ report("fatal error: return code: %s",returncode or "?")
os.exit(returncode)
end
end
@@ -851,15 +962,26 @@ function scripts.context.run(ctxdata,filename)
os.remove(jobname..".top")
--
if resultname then
- for _, suffix in next, scripts.context.aftersuffixes do
- local oldname = file.addsuffix(oldbase,suffix)
- local newname = file.addsuffix(newbase,suffix)
- local tmpname = "keep-"..oldname
- os.remove(newname)
- os.rename(oldname,newname)
- os.rename(tmpname,oldname)
+ if environment.argument("purgeresult") then
+ -- so, if there is no result then we don't get the old one, but
+ -- related files (log etc) are still there for tracing purposes
+ for _, suffix in next, scripts.context.aftersuffixes do
+ local oldname = file.addsuffix(oldbase,suffix)
+ local newname = file.addsuffix(newbase,suffix)
+ os.remove(newname) -- to be sure
+ os.rename(oldname,newname)
+ end
+ else
+ for _, suffix in next, scripts.context.aftersuffixes do
+ local oldname = file.addsuffix(oldbase,suffix)
+ local newname = file.addsuffix(newbase,suffix)
+ local tmpname = "keep-"..oldname
+ os.remove(newname)
+ os.rename(oldname,newname)
+ os.rename(tmpname,oldname)
+ end
end
- logs.simple("result renamed to: %s",newbase)
+ report("result renamed to: %s",newbase)
end
--
if environment.argument("purge") then
@@ -868,23 +990,24 @@ function scripts.context.run(ctxdata,filename)
scripts.context.purge_job(resultname,true)
end
--
- if environment.argument("autopdf") then
- scripts.context.openpdf(resultname or filename)
+ local pdfview = environment.argument("autopdf")
+ if pdfview then
+ scripts.context.openpdf(resultname or filename,pdfview)
end
--
if environment.argument("timing") then
- logs.line()
- logs.simple("you can process (timing) statistics with:",jobname)
- logs.line()
- logs.simple("context --extra=timing '%s'",jobname)
- logs.simple("mtxrun --script timing --xhtml [--launch --remove] '%s'",jobname)
- logs.line()
+ report()
+ report("you can process (timing) statistics with:",jobname)
+ report()
+ report("context --extra=timing '%s'",jobname)
+ report("mtxrun --script timing --xhtml [--launch --remove] '%s'",jobname)
+ report()
end
else
if formatname then
- logs.simple("error, no format found with name: %s, skipping",formatname)
+ report("error, no format found with name: %s, skipping",formatname)
else
- logs.simple("error, no format found (provide formatname or interface)")
+ report("error, no format found (provide formatname or interface)")
end
break
end
@@ -892,9 +1015,9 @@ function scripts.context.run(ctxdata,filename)
end
else
if formatname then
- logs.simple("error, no format found with name: %s, aborting",formatname)
+ report("error, no format found with name: %s, aborting",formatname)
else
- logs.simple("error, no format found (provide formatname or interface)")
+ report("error, no format found (provide formatname or interface)")
end
end
end
@@ -906,37 +1029,35 @@ function scripts.context.pipe()
local interface = environment.argument("interface")
interface = (type(interface) == "string" and interface) or "en"
local formatname = scripts.context.interfaces[interface] or "cont-en"
- local formatfile, scriptfile = resolvers.locate_format(formatname)
+ local formatfile, scriptfile = resolvers.locateformat(formatname)
if not formatfile or not scriptfile then
- logs.simple("warning: no format found, forcing remake (commandline driven)")
- scripts.context.generate()
+ report("warning: no format found, forcing remake (commandline driven)")
scripts.context.make(formatname)
- formatfile, scriptfile = resolvers.locate_format(formatname)
+ formatfile, scriptfile = resolvers.locateformat(formatname)
end
if formatfile and scriptfile then
- local okay = statistics.check_fmt_status(formatfile)
+ local okay = statistics.checkfmtstatus(formatfile)
if okay ~= true then
- logs.simple("warning: %s, forcing remake",tostring(okay))
- scripts.context.generate()
+ report("warning: %s, forcing remake",tostring(okay))
scripts.context.make(formatname)
end
local flags = {
"--interaction=scrollmode",
- "--fmt=" .. string.quote(formatfile),
- "--lua=" .. string.quote(scriptfile),
+ "--fmt=" .. quote(formatfile),
+ "--lua=" .. quote(scriptfile),
"--backend=pdf",
}
local filename = environment.argument("dummyfile") or ""
if filename == "" then
filename = "\\relax"
- logs.simple("entering scrollmode, end job with \\end")
+ report("entering scrollmode, end job with \\end")
else
filename = file.addsuffix(filename,"tmp")
io.savedata(filename,"\\relax")
scripts.context.multipass.makeoptionfile(filename,{ flags = flags },3,1,false) -- kindofrun, currentrun, final
- logs.simple("entering scrollmode using '%s' with optionfile, end job with \\end",filename)
+ report("entering scrollmode using '%s' with optionfile, end job with \\end",filename)
end
- local command = string.format("luatex %s %s", table.concat(flags," "), string.quote(filename))
+ local command = format("luatex %s %s", concat(flags," "), quote(filename))
os.spawn(command)
if environment.argument("purge") then
scripts.context.purge_job(filename)
@@ -946,41 +1067,45 @@ function scripts.context.pipe()
end
else
if formatname then
- logs.simple("error, no format found with name: %s, aborting",formatname)
+ report("error, no format found with name: %s, aborting",formatname)
else
- logs.simple("error, no format found (provide formatname or interface)")
+ report("error, no format found (provide formatname or interface)")
end
end
end
+local make_mkiv_format = environment.make_format
+
+local function make_mkii_format(name,engine)
+ if environment.argument(engine) then
+ local command = format("mtxrun texexec.rb --make --%s %s",name,engine)
+ report("running command: %s",command)
+ os.spawn(command)
+ end
+end
+
+function scripts.context.generate()
+ resolvers.instance.renewcache = true
+ trackers.enable("resolvers.locating")
+ resolvers.load()
+end
+
function scripts.context.make(name)
- local runners = {
- "luatools --make --compile ",
- (environment.argument("pdftex") and "mtxrun texexec.rb --make --pdftex ") or false,
- (environment.argument("xetex") and "mtxrun texexec.rb --make --xetex " ) or false,
- }
+ if not environment.argument("fast") then -- as in texexec
+ scripts.context.generate()
+ end
local list = (name and { name }) or (environment.files[1] and environment.files) or scripts.context.defaultformats
for i=1,#list do
local name = list[i]
- name = scripts.context.interfaces[name] or name
- for i=1,#runners do
- local runner = runners[i]
- if runner then
- local command = runner .. name
- logs.simple("running command: %s",command)
- os.spawn(command)
- end
+ name = scripts.context.interfaces[name] or name or ""
+ if name ~= "" then
+ make_mkiv_format(name)
+ make_mkii_format(name,"pdftex")
+ make_mkii_format(name,"xetex")
end
end
end
-function scripts.context.generate()
- -- hack, should also be a shared function
- local command = "luatools --generate "
- logs.simple("running command: %s",command)
- os.spawn(command)
-end
-
function scripts.context.ctx()
local ctxdata = ctxrunner.new()
ctxdata.jobname = environment.files[1]
@@ -997,7 +1122,7 @@ function scripts.context.autoctx()
if f then
local chunk = f:read(512) or ""
f:close()
- local ctxname = string.match(chunk,"<%?context%-directive%s+job%s+ctxfile%s+([^ ]-)%s*?>")
+ local ctxname = match(chunk,"<%?context%-directive%s+job%s+ctxfile%s+([^ ]-)%s*?>")
if ctxname then
ctxdata = ctxrunner.new()
ctxdata.jobname = firstfile
@@ -1023,13 +1148,13 @@ local loaded = false
function scripts.context.metapost()
local filename = environment.files[1] or ""
if not loaded then
- dofile(resolvers.find_file("mlib-run.lua"))
+ dofile(resolvers.findfile("mlib-run.lua"))
loaded = true
commands = commands or { }
- commands.writestatus = logs.report
+ commands.writestatus = report -- no longer needed
end
local formatname = environment.argument("format") or "metafun"
- if formatname == "" or type(format) == "boolean" then
+ if formatname == "" or type(formatname) == "boolean" then
formatname = "metafun"
end
if environment.argument("pdf") then
@@ -1037,7 +1162,7 @@ function scripts.context.metapost()
local resultname = environment.argument("result") or basename
local jobname = "mtx-context-metapost"
local tempname = file.addsuffix(jobname,"tex")
- io.savedata(tempname,string.format(template,"metafun",filename))
+ io.savedata(tempname,format(template,"metafun",filename))
environment.files[1] = tempname
environment.setargument("result",resultname)
environment.setargument("once",true)
@@ -1052,22 +1177,22 @@ function scripts.context.metapost()
end
function scripts.context.version()
- local name = resolvers.find_file("context.tex")
+ local name = resolvers.findfile("context.mkiv")
if name ~= "" then
- logs.simple("main context file: %s",name)
+ report("main context file: %s",name)
local data = io.loaddata(name)
if data then
- local version = data:match("\\edef\\contextversion{(.-)}")
+ local version = match(data,"\\edef\\contextversion{(.-)}")
if version then
- logs.simple("current version: %s",version)
+ report("current version: %s",version)
else
- logs.simple("context version: unknown, no timestamp found")
+ report("context version: unknown, no timestamp found")
end
else
- logs.simple("context version: unknown, load error")
+ report("context version: unknown, load error")
end
else
- logs.simple("main context file: unknown, 'context.tex' not found")
+ report("main context file: unknown, 'context.mkiv' not found")
end
end
@@ -1093,6 +1218,10 @@ local persistent_runfiles = {
"tuo", "tub", "top", "tuc"
}
+local special_runfiles = {
+ "-mpgraph*", "-mprun*", "-temp-*"
+}
+
local function purge_file(dfile,cfile)
if cfile and lfs.isfile(cfile) then
if os.remove(dfile) then
@@ -1105,31 +1234,38 @@ local function purge_file(dfile,cfile)
end
end
-function scripts.context.purge_job(jobname,all)
+local function remove_special_files(pattern)
+end
+
+function scripts.context.purge_job(jobname,all,mkiitoo)
if jobname and jobname ~= "" then
jobname = file.basename(jobname)
local filebase = file.removesuffix(jobname)
- local deleted = { }
- for i=1,#obsolete_results do
- deleted[#deleted+1] = purge_file(filebase.."."..obsolete_results[i],filebase..".pdf")
- end
- for i=1,#temporary_runfiles do
- deleted[#deleted+1] = purge_file(filebase.."."..temporary_runfiles[i])
- end
- if all then
- for i=1,#persistent_runfiles do
- deleted[#deleted+1] = purge_file(filebase.."."..persistent_runfiles[i])
+ if mkiitoo then
+ scripts.context.purge(all,filebase,true) -- leading "./"
+ else
+ local deleted = { }
+ for i=1,#obsolete_results do
+ deleted[#deleted+1] = purge_file(filebase.."."..obsolete_results[i],filebase..".pdf")
+ end
+ for i=1,#temporary_runfiles do
+ deleted[#deleted+1] = purge_file(filebase.."."..temporary_runfiles[i])
+ end
+ if all then
+ for i=1,#persistent_runfiles do
+ deleted[#deleted+1] = purge_file(filebase.."."..persistent_runfiles[i])
+ end
+ end
+ if #deleted > 0 then
+ report("purged files: %s", concat(deleted,", "))
end
- end
- if #deleted > 0 then
- logs.simple("purged files: %s", table.join(deleted,", "))
end
end
end
-function scripts.context.purge(all)
+function scripts.context.purge(all,pattern,mkiitoo)
local all = all or environment.argument("all")
- local pattern = environment.argument("pattern") or "*.*"
+ local pattern = environment.argument("pattern") or (pattern and (pattern.."*")) or "*.*"
local files = dir.glob(pattern)
local obsolete = table.tohash(obsolete_results)
local temporary = table.tohash(temporary_runfiles)
@@ -1142,18 +1278,21 @@ function scripts.context.purge(all)
local basename = file.basename(name)
if obsolete[suffix] or temporary[suffix] or persistent[suffix] or generic[basename] then
deleted[#deleted+1] = purge_file(name)
+ elseif mkiitoo then
+ for i=1,#special_runfiles do
+ if find(name,special_runfiles[i]) then
+ deleted[#deleted+1] = purge_file(name)
+ end
+ end
end
end
if #deleted > 0 then
- logs.simple("purged files: %s", table.join(deleted,", "))
+ report("purged files: %s", concat(deleted,", "))
end
end
---~ purge_for_files("test",true)
---~ purge_all_files()
-
local function touch(name,pattern)
- local name = resolvers.find_file(name)
+ local name = resolvers.findfile(name)
local olddata = io.loaddata(name)
if olddata then
local oldversion, newversion = "", os.date("%Y.%m.%d %H:%M")
@@ -1173,20 +1312,78 @@ local function touch(name,pattern)
end
end
+local function touchfiles(suffix)
+ local done, oldversion, newversion, foundname = touch(file.addsuffix("context",suffix),"(\\edef\\contextversion{)(.-)(})")
+ if done then
+ report("old version : %s", oldversion)
+ report("new version : %s", newversion)
+ report("touched file: %s", foundname)
+ local ok, _, _, foundname = touch(file.addsuffix("cont-new",suffix), "(\\newcontextversion{)(.-)(})")
+ if ok then
+ report("touched file: %s", foundname)
+ end
+ end
+end
+
function scripts.context.touch()
if environment.argument("expert") then
- local done, oldversion, newversion, foundname = touch("context.tex", "(\\edef\\contextversion{)(.-)(})")
- if done then
- logs.simple("old version : %s", oldversion)
- logs.simple("new version : %s", newversion)
- logs.simple("touched file: %s", foundname)
- local ok, _, _, foundname = touch("cont-new.tex", "(\\newcontextversion{)(.-)(})")
- if ok then
- logs.simple("touched file: %s", foundname)
- end
- local ok, _, _, foundname = touch("cont-xp.tex", "(\\edef\\contextversion{)(.-)(})")
- if ok then
- logs.simple("touched file: %s", foundname)
+ touchfiles("mkii")
+ touchfiles("mkiv")
+ touchfiles("mkvi")
+ end
+end
+
+-- modules
+
+local labels = { "title", "comment", "status" }
+local cards = { "*.mkvi", "*.mkiv", "*.tex" }
+
+function scripts.context.modules(pattern)
+ local list = { }
+ local found = resolvers.findfile("context.mkiv")
+ if not pattern or pattern == "" then
+ -- official files in the tree
+ for _, card in ipairs(cards) do
+ resolvers.findwildcardfiles(card,list)
+ end
+ -- my dev path
+ for _, card in ipairs(cards) do
+ dir.glob(file.join(file.dirname(found),card),list)
+ end
+ else
+ resolvers.findwildcardfiles(pattern,list)
+ dir.glob(file.join(file.dirname(found,pattern)),list)
+ end
+ local done = { } -- todo : sort
+ for i=1,#list do
+ local v = list[i]
+ local base = file.basename(v)
+ if not done[base] then
+ done[base] = true
+ local suffix = file.suffix(base)
+ if suffix == "tex" or suffix == "mkiv" or suffix == "mkvi" then
+ local prefix = match(base,"^([xmst])%-")
+ if prefix then
+ v = resolvers.findfile(base) -- so that files on my dev path are seen
+ local data = io.loaddata(v) or ""
+ data = match(data,"%% begin info(.-)%% end info")
+ if data then
+ local info = { }
+ for label, text in gmatch(data,"%% +([^ ]+) *: *(.-)[\n\r]") do
+ info[label] = text
+ end
+ report()
+ report("%-7s : %s","module",base)
+ report()
+ for i=1,#labels do
+ local l = labels[i]
+ if info[l] then
+ report("%-7s : %s",l,info[l])
+ end
+ end
+ report()
+ end
+ end
end
end
end
@@ -1195,28 +1392,22 @@ end
-- extras
function scripts.context.extras(pattern)
- local found = resolvers.find_file("context.tex")
- if found == "" then
- logs.simple("unknown extra: %s", extra)
- else
- pattern = file.join(dir.expand_name(file.dirname(found)),string.format("mtx-context-%s.tex",pattern or "*"))
+ -- only in base path, i.e. only official ones
+ local found = resolvers.findfile("context.mkiv")
+ if found ~= "" then
+ pattern = file.join(dir.expandname(file.dirname(found)),format("mtx-context-%s.tex",pattern or "*"))
local list = dir.glob(pattern)
- if not extra or extra == "" then
- logs.extendbanner("extras")
- else
- logs.extendbanner(extra)
- end
for i=1,#list do
local v = list[i]
local data = io.loaddata(v) or ""
- data = string.match(data,"begin help(.-)end help")
+ data = match(data,"%% begin help(.-)%% end help")
if data then
- local h = { string.format("extra: %s (%s)",string.gsub(v,"^.*mtx%-context%-(.-)%.tex$","%1"),v) }
- for s in string.gmatch(data,"%% *(.-)[\n\r]") do
- h[#h+1] = s
+ report()
+ report("extra: %s (%s)",(gsub(v,"^.*mtx%-context%-(.-)%.tex$","%1")),v)
+ for s in gmatch(data,"%% *(.-)[\n\r]") do
+ report(s)
end
- h[#h+1] = ""
- logs.help(table.concat(h,"\n"),"nomoreinfo")
+ report()
end
end
end
@@ -1229,15 +1420,15 @@ function scripts.context.extra()
scripts.context.extras(extra)
else
local fullextra = extra
- if not string.find(fullextra,"mtx%-context%-") then
+ if not find(fullextra,"mtx%-context%-") then
fullextra = "mtx-context-" .. extra
end
- local foundextra = resolvers.find_file(fullextra)
+ local foundextra = resolvers.findfile(fullextra)
if foundextra == "" then
scripts.context.extras()
return
else
- logs.simple("processing extra: %s", foundextra)
+ report("processing extra: %s", foundextra)
end
environment.setargument("purgeall",true)
local result = environment.setargument("result") or ""
@@ -1254,26 +1445,34 @@ end
-- todo: we need to do a dummy run
function scripts.context.trackers()
- environment.files = { resolvers.find_file("m-trackers.tex") }
+ environment.files = { resolvers.findfile("m-trackers.mkiv") }
scripts.context.multipass.nofruns = 1
+ environment.setargument("purgeall",true)
scripts.context.run()
- -- maybe filter from log
end
function scripts.context.directives()
- environment.files = { resolvers.find_file("m-directives.tex") }
+ environment.files = { resolvers.findfile("m-directives.mkiv") }
scripts.context.multipass.nofruns = 1
+ environment.setargument("purgeall",true)
+ scripts.context.run()
+end
+
+function scripts.context.logcategories()
+ environment.files = { resolvers.findfile("m-logcategories.mkiv") }
+ scripts.context.multipass.nofruns = 1
+ environment.setargument("purgeall",true)
scripts.context.run()
- -- maybe filter from log
end
function scripts.context.timed(action)
statistics.timed(action)
end
-local zipname = "cont-tmf.zip"
-local mainzip = "http://www.pragma-ade.com/context/latest/" .. zipname
-local validtrees = { "texmf-local", "texmf-context" }
+local zipname = "cont-tmf.zip"
+local mainzip = "http://www.pragma-ade.com/context/latest/" .. zipname
+local validtrees = { "texmf-local", "texmf-context" }
+local selfscripts = { "mtxrun.lua" } -- was: { "luatools.lua", "mtxrun.lua" }
function zip.loaddata(zipfile,filename) -- should be in zip lib
local f = zipfile:open(filename)
@@ -1289,19 +1488,19 @@ function scripts.context.update()
local force = environment.argument("force")
local socket = require("socket")
local http = require("socket.http")
- local basepath = resolvers.find_file("context.tex") or ""
+ local basepath = resolvers.findfile("context.mkiv") or ""
if basepath == "" then
- logs.simple("quiting, no 'context.tex' found")
+ report("quiting, no 'context.mkiv' found")
return
end
- local basetree = basepath.match(basepath,"^(.-)tex/context/base/context.tex$") or ""
+ local basetree = basepath.match(basepath,"^(.-)tex/context/base/context.mkiv$") or ""
if basetree == "" then
- logs.simple("quiting, no proper tds structure (%s)",basepath)
+ report("quiting, no proper tds structure (%s)",basepath)
return
end
local function is_okay(basetree)
for _, tree in next, validtrees do
- local pattern = string.gsub(tree,"%-","%%-")
+ local pattern = gsub(tree,"%-","%%-")
if basetree:find(pattern) then
return tree
end
@@ -1310,19 +1509,19 @@ function scripts.context.update()
end
local okay = is_okay(basetree)
if not okay then
- logs.simple("quiting, tree '%s' is protected",okay)
+ report("quiting, tree '%s' is protected",okay)
return
else
- logs.simple("updating tree '%s'",okay)
+ report("updating tree '%s'",okay)
end
if not lfs.chdir(basetree) then
- logs.simple("quiting, unable to change to '%s'",okay)
+ report("quiting, unable to change to '%s'",okay)
return
end
- logs.simple("fetching '%s'",mainzip)
+ report("fetching '%s'",mainzip)
local latest = http.request(mainzip)
if not latest then
- logs.simple("context tree '%s' can be updated, use --force",okay)
+ report("context tree '%s' can be updated, use --force",okay)
return
end
io.savedata("cont-tmf.zip",latest)
@@ -1333,37 +1532,37 @@ function scripts.context.update()
-- variant 2
local zipfile = zip.open(zipname)
if not zipfile then
- logs.simple("quiting, unable to open '%s'",zipname)
+ report("quiting, unable to open '%s'",zipname)
return
end
- local newfile = zip.loaddata(zipfile,"tex/context/base/context.tex")
+ local newfile = zip.loaddata(zipfile,"tex/context/base/context.mkiv")
if not newfile then
- logs.simple("quiting, unable to open '%s'","context.tex")
+ report("quiting, unable to open '%s'","context.mkiv")
return
end
- local oldfile = io.loaddata(resolvers.find_file("context.tex")) or ""
+ local oldfile = io.loaddata(resolvers.findfile("context.mkiv")) or ""
local function versiontonumber(what,str)
- local version = str:match("\\edef\\contextversion{(.-)}") or ""
- local year, month, day, hour, minute = str:match("\\edef\\contextversion{(%d+)%.(%d+)%.(%d+) *(%d+)%:(%d+)}")
+ local version = match(str,"\\edef\\contextversion{(.-)}") or ""
+ local year, month, day, hour, minute = match(str,"\\edef\\contextversion{(%d+)%.(%d+)%.(%d+) *(%d+)%:(%d+)}")
if year and minute then
local time = os.time { year=year,month=month,day=day,hour=hour,minute=minute}
- logs.simple("%s version: %s (%s)",what,version,time)
+ report("%s version: %s (%s)",what,version,time)
return time
else
- logs.simple("%s version: %s (unknown)",what,version)
+ report("%s version: %s (unknown)",what,version)
return nil
end
end
local oldversion = versiontonumber("old",oldfile)
local newversion = versiontonumber("new",newfile)
if not oldversion or not newversion then
- logs.simple("quiting, version cannot be determined")
+ report("quiting, version cannot be determined")
return
elseif oldversion == newversion then
- logs.simple("quiting, your current version is up-to-date")
+ report("quiting, your current version is up-to-date")
return
elseif oldversion > newversion then
- logs.simple("quiting, your current version is newer")
+ report("quiting, your current version is newer")
return
end
for k in zipfile:files() do
@@ -1376,113 +1575,46 @@ function scripts.context.update()
if force then
io.savedata(filename,data)
end
- logs.simple(filename)
+ report(filename)
end
end
end
- for _, scriptname in next, { "luatools.lua", "mtxrun.lua" } do
- local oldscript = resolvers.find_file(scriptname) or ""
+ for _, scriptname in next, selfscripts do
+ local oldscript = resolvers.findfile(scriptname) or ""
if oldscript ~= "" and is_okay(oldscript) then
local newscript = "./scripts/context/lua/" .. scriptname
local data = io.loaddata(newscript) or ""
if data ~= "" then
- logs.simple("replacing script '%s' by '%s'",oldscript,newscript)
+ report("replacing script '%s' by '%s'",oldscript,newscript)
if force then
io.savedata(oldscript,data)
end
end
else
- logs.simple("keeping script '%s'",oldscript)
+ report("keeping script '%s'",oldscript)
end
end
if force then
- os.execute("context --generate")
- os.execute("context --make")
+ scripts.context.make()
end
end
if force then
- logs.simple("context tree '%s' has been updated",okay)
+ report("context tree '%s' has been updated",okay)
else
- logs.simple("context tree '%s' can been updated (use --force)",okay)
+ report("context tree '%s' can been updated (use --force)",okay)
end
end
-logs.extendbanner("ConTeXt Process Management 0.51",true)
-
-messages.help = [[
---run process (one or more) files (default action)
---make create context formats
-
---ctx=name use ctx file (process management specification)
---interface use specified user interface (default: en)
-
---autopdf close pdf file in viewer and start pdf viewer afterwards
---purge(all) purge files either or not after a run (--pattern=...)
-
---usemodule=list load the given module or style, normally part o fthe distribution
---environment=list load the given environment file first (document styles)
---mode=list enable given the modes (conditional processing in styles)
---path=list also consult the given paths when files are looked for
---arguments=list set variables that can be consulted during a run (key/value pairs)
---randomseed=number set the randomseed
---result=name rename the resulting output to the given name
---trackers=list show/set tracker variables
---directives=list show/set directive variables
-
---forcexml force xml stub (optional flag: --mkii)
---forcecld force cld (context lua document) stub
-
---arrange run extra imposition pass, given that the style sets up imposition
---noarrange ignore imposition specifications in the style
-
---once only run once (no multipass data file is produced)
---batchmode run without stopping and don't show messages on the console
---nonstopmode run without stopping
-
---generate generate file database etc. (as luatools does)
---paranoid don't descend to .. and ../..
---version report installed context version
-
---expert expert options
-]]
-
--- filter=list is kind of obsolete
--- color is obsolete for mkiv, always on
--- separation is obsolete for mkiv, no longer available
--- output is currently obsolete for mkiv
--- setuppath=list must check
--- modefile=name must check
--- input=name load the given inputfile (must check)
-
-messages.expert = [[
-expert options:
-
---touch update context version number (remake needed afterwards, also provide --expert)
---nostats omit runtime statistics at the end of the run
---update update context from website (not to be confused with contextgarden)
---profile profile job (use: mtxrun --script profile --analyse)
---timing generate timing and statistics overview
---tracefiles show some extra info when locating files (at the tex end)
-
---extra=name process extra (mtx-context-<name> in distribution)
---extras show extras
-]]
-
-messages.private = [[
-private options:
-
---dumphash dump hash table afterwards
---dumpdelta dump hash table afterwards (only new entries)
-]]
-
-messages.special = [[
-special options:
+do
---pdftex process file with texexec using pdftex
---xetex process file with texexec using xetex
+ local silent = environment.argument("silent")
+ if type(silent) == "string" then
+ directives.enable(format("logs.blocked={%s}",silent))
+ elseif silent then
+ directives.enable("logs.blocked")
+ end
---pipe don't check for file and enter scroll mode (--dummyfile=whatever.tmp)
-]]
+end
if environment.argument("once") then
scripts.context.multipass.nofruns = 1
@@ -1497,15 +1629,10 @@ end
if environment.argument("run") then
-- scripts.context.timed(scripts.context.run)
scripts.context.timed(scripts.context.autoctx)
-elseif environment.argument("make") or environment.argument("generate") then
- scripts.context.timed(function()
- if environment.argument("generate") then
- scripts.context.generate()
- end
- if environment.argument("make") then
- scripts.context.make()
- end
- end)
+elseif environment.argument("make") then
+ scripts.context.timed(function() scripts.context.make() end)
+elseif environment.argument("generate") then
+ scripts.context.timed(function() scripts.context.generate() end)
elseif environment.argument("ctx") then
scripts.context.timed(scripts.context.ctx)
elseif environment.argument("mp") or environment.argument("metapost") then
@@ -1517,7 +1644,9 @@ elseif environment.argument("touch") then
elseif environment.argument("update") then
scripts.context.update()
elseif environment.argument("expert") then
- logs.help(table.join({ messages.expert, messages.private, messages.special },"\n"))
+ application.help("expert", "special")
+elseif environment.argument("modules") then
+ scripts.context.modules()
elseif environment.argument("extras") then
scripts.context.extras()
elseif environment.argument("extra") then
@@ -1526,12 +1655,14 @@ elseif environment.argument("help") then
if environment.files[1] == "extras" then
scripts.context.extras()
else
- logs.help(messages.help)
+ application.help("basic")
end
-elseif environment.argument("trackers") and type(environment.argument("trackers")) == "boolean" then
+elseif environment.argument("showtrackers") or environment.argument("trackers") == true then
scripts.context.trackers()
-elseif environment.argument("directives") and type(environment.argument("directives")) == "boolean" then
+elseif environment.argument("showdirectives") or environment.argument("directives") == true then
scripts.context.directives()
+elseif environment.argument("showlogcategories") then
+ scripts.context.logcategories()
elseif environment.argument("track") and type(environment.argument("track")) == "boolean" then -- for old times sake, will go
scripts.context.trackers()
elseif environment.files[1] then
@@ -1546,7 +1677,7 @@ elseif environment.argument("purgeall") then
-- only when no filename given, supports --pattern
scripts.context.purge(true)
else
- logs.help(messages.help)
+ application.help("basic")
end
if environment.argument("profile") then
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-convert.lua b/Master/texmf-dist/scripts/context/lua/mtx-convert.lua
index 62198a62188..0c5c01bbfbe 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-convert.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-convert.lua
@@ -8,6 +8,23 @@ if not modules then modules = { } end modules ['mtx-convert'] = {
-- todo: eps and svg
+local helpinfo = [[
+--convertall convert all graphics on path
+--inputpath=string original graphics path
+--outputpath=string converted graphics path
+--watch watch folders
+--force force conversion (even if older)
+--delay time between sweeps
+]]
+
+local application = logs.application {
+ name = "mtx-convert",
+ banner = "ConTeXT Graphic Conversion Helpers 0.10",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
graphics = graphics or { }
graphics.converters = graphics.converters or { }
@@ -40,7 +57,7 @@ local function convert(kind,oldname,newname)
if graphics.converters[kind] then -- extra test
local tmpname = file.replacesuffix(newname,"tmp")
local command = graphics.converters[kind](oldname,tmpname)
- logs.simple("command: %s",command)
+ report("command: %s",command)
io.flush()
os.spawn(command)
os.remove(newname)
@@ -118,22 +135,10 @@ function scripts.convert.convertgiven()
end
end
-
-logs.extendbanner("ConTeXT Graphic Conversion Helpers 0.10",true)
-
-messages.help = [[
---convertall convert all graphics on path
---inputpath=string original graphics path
---outputpath=string converted graphics path
---watch watch folders
---force force conversion (even if older)
---delay time between sweeps
-]]
-
if environment.argument("convertall") then
scripts.convert.convertall()
elseif environment.files[1] then
scripts.convert.convertgiven()
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-epub.lua b/Master/texmf-dist/scripts/context/lua/mtx-epub.lua
new file mode 100644
index 00000000000..70ee7828cee
--- /dev/null
+++ b/Master/texmf-dist/scripts/context/lua/mtx-epub.lua
@@ -0,0 +1,177 @@
+if not modules then modules = { } end modules ['mtx-epub'] = {
+ version = 1.001,
+ comment = "companion to mtxrun.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- The epub specification is far from beautiful. Especially the id related
+-- part is messy and devices/programs react differently on them (so an id is not
+-- really an id but has some special property). Then there is this ncx suffix
+-- thing. Somehow it give the impression of a reversed engineered application
+-- format so it will probably take a few cycles to let it become a real
+-- clean standard. Thanks to Adam Reviczky for helping to figure out all these
+-- puzzling details.
+
+-- This is preliminary code. At some point we will deal with images as well but
+-- first we need a decent strategy to export them. More information will be
+-- available on the wiki.
+
+local format = string.format
+local concat = table.concat
+
+local helpinfo = [[
+--make create epub zip file
+
+example:
+
+mtxrun --script epub --make mydocument
+]]
+
+local application = logs.application {
+ name = "mtx-epub",
+ banner = "ConTeXt EPUB Helpers 0.11",
+ helpinfo = helpinfo,
+}
+
+-- script code
+
+scripts = scripts or { }
+scripts.epub = scripts.epub or { }
+
+local mimetype = "application/epub+zip"
+
+local container = [[
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
+ <rootfiles>
+ <rootfile full-path="OPS/%s" media-type="application/oebps-package+xml"/>
+ </rootfiles>
+</container>
+]]
+
+local package = [[
+<?xml version="1.0"?>
+
+<package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="%s">
+
+ <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
+ <dc:title>My Title</dc:title>
+ <dc:language>en</dc:language>
+ <dc:identifier id="%s" />
+ <dc:creator opf:file-as="Self, My" opf:role="aut">MySelf</dc:creator>
+ </metadata>
+
+ <manifest>
+ %s
+ </manifest>
+
+ <spine toc="ncx">
+ <itemref idref="%s" />
+ </spine>
+
+</package>
+]]
+
+-- We need to figure out what is permitted; numbers only seem to give
+-- problems is some applications as do names with dashes.
+
+local function dumbid(filename)
+ -- return (string.gsub(os.uuid(),"%-%","")) -- to be tested
+ return file.nameonly(filename)
+end
+
+local mimetypes = {
+ xhtml = "application/xhtml+xml",
+ css = "text/css",
+ -- default = "text/plain",
+}
+
+local idmakers = {
+ ncx = function(filename) return "ncx" end,
+ -- css = function(filename) return "stylesheet" end,
+ default = function(filename) return dubmid(filename) end,
+}
+
+-- specification = {
+-- name = "document",
+-- identifier = "123",
+-- root = "a.xhtml",
+-- files = {
+-- "a.xhtml",
+-- "b.css",
+-- "c.png",
+-- }
+-- }
+
+function scripts.epub.make()
+
+ local filename = environment.files[1]
+
+ if filename and filename ~= "" then
+
+ filename = file.basename(filename)
+ local specfile = file.replacesuffix(filename,"specification")
+ local specification = lfs.isfile(specfile) and dofile(specfile) or { }
+
+ -- inspect(specification)
+
+ local name = specification.name or file.removesuffix(filename)
+ local identifier = specification.identifier or os.uuid()
+ local files = specification.files or { file.addsuffix(filename,"xhtml") }
+ local root = specification.root or files[1]
+
+ local epubname = name
+ local epubpath = file.replacesuffix(name,"tree")
+ local epubfile = file.replacesuffix(name,"epub")
+ local epubroot = file.replacesuffix(name,"opf")
+
+ lfs.mkdir(epubpath)
+ lfs.mkdir(file.join(epubpath,"META-INF"))
+ lfs.mkdir(file.join(epubpath,"OPS"))
+
+ local used = { }
+
+ for i=1,#files do
+ local filename = files[i]
+ local suffix = file.suffix(filename)
+ local mime = mimetypes[suffix]
+ if mime then
+ local idmaker = idmakers[suffix] or idmakers.default
+ file.copy(filename,file.join(epubpath,"OPS",filename))
+ used[#used+1] = format("<item id='%s' href='%s' media-type='%s'/>",idmaker(filename),filename,mime)
+ end
+ end
+
+ container = format(container,epubroot)
+ package = format(package,identifier,identifier,concat(used,"\n"),file.removesuffix(root))
+
+ io.savedata(file.join(epubpath,"mimetype"),mimetype)
+ io.savedata(file.join(epubpath,"META-INF","container.xml"),container)
+ io.savedata(file.join(epubpath,"OPS",epubroot),package)
+
+ lfs.chdir(epubpath)
+
+ os.remove(epubfile)
+
+ os.execute(format("zip %s -0 %s",epubfile,"mimetype"))
+ os.execute(format("zip %s -r %s",epubfile,"META-INF"))
+ os.execute(format("zip %s -r %s",epubfile,"OPS"))
+
+ lfs.chdir("..")
+
+ application.report("epub archive: %s",file.join(epubpath,epubfile))
+
+ end
+
+end
+
+--
+
+if environment.argument("make") then
+ scripts.epub.make()
+else
+ application.help()
+end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-flac.lua b/Master/texmf-dist/scripts/context/lua/mtx-flac.lua
new file mode 100644
index 00000000000..37f985654a3
--- /dev/null
+++ b/Master/texmf-dist/scripts/context/lua/mtx-flac.lua
@@ -0,0 +1,216 @@
+if not modules then modules = { } end modules ['mtx-flac'] = {
+ version = 1.001,
+ comment = "companion to mtxrun.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- Written with Within Temptation's "The Unforgiven" in loopmode on
+-- the speakers. The following code is also used for my occasional music
+-- repository cleanup session using the code below.
+
+-- this can become l-flac.lua
+
+local sub, match, byte, lower = string.sub, string.match, string.byte, string.lower
+local readstring, readnumber = io.readstring, io.readnumber
+local concat = table.concat
+local tonumber = tonumber
+local tobitstring = number.tobitstring
+
+flac = flac or { }
+
+flac.report = string.format
+
+local splitter = lpeg.splitat("=")
+local readers = { }
+
+readers[0] = function(f,size,target) -- not yet ok
+ local info = { }
+ target.info = info
+ info.minimum_block_size = readnumber(f,-2)
+ info.maximum_block_size = readnumber(f,-2)
+ info.minimum_frame_size = readnumber(f,-3)
+ info.maximum_frame_size = readnumber(f,-3)
+ local buffer = { }
+ for i=1,8 do
+ buffer[i] = tobitstring(readnumber(f,1))
+ end
+ local bytes = concat(buffer)
+ info.sample_rate_in_hz = tonumber(sub(bytes, 1,20),2) -- 20
+ info.number_of_channels = tonumber(sub(bytes,21,23),2) -- 3
+ info.bits_per_sample = tonumber(sub(bytes,24,28),2) -- 5
+ info.samples_in_stream = tonumber(sub(bytes,29,64),2) -- 36
+ info.md5_signature = readstring(f,16) -- 128
+end
+
+readers[4] = function(f,size,target,banner)
+ local tags = { }
+ target.tags = tags
+ target.vendor = readstring(f,readnumber(f,-4))
+ for i=1,readnumber(f,-4) do
+ local key, value = lpeg.match(splitter,readstring(f,readnumber(f,-4)))
+ tags[lower(key)] = value
+ end
+end
+
+readers.default = function(f,size,target)
+ f:seek("cur",size)
+end
+
+function flac.getmetadata(filename)
+ local f = io.open(filename, "rb")
+ if f then
+ local banner = readstring(f,4)
+ if banner == "fLaC" then
+ local data = {
+ banner = banner,
+ filename = filename,
+ filesize = lfs.attributes(filename,"size"),
+ }
+ while true do
+ local flag = readnumber(f,1)
+ local size = readnumber(f,3)
+ local last = flag > 127
+ if last then
+ flag = flag - 128
+ end
+ local reader = readers[flag] or readers.default
+ reader(f,size,data,banner)
+ if last then
+ return data
+ end
+ end
+ else
+ flac.report("no flac file: %s (%s)",filename,banner)
+ end
+ f:close()
+ else
+ flac.report("no file: %s",filename)
+ end
+end
+
+function flac.savecollection(pattern,filename)
+ pattern = (pattern ~= "" and pattern) or "**/*.flac"
+ filename = (filename ~= "" and filename) or "music-collection.xml"
+ flac.report("identifying files using pattern %q" ,pattern)
+ local files = dir.glob(pattern)
+ flac.report("%s files found, analyzing files",#files)
+ local music = { }
+ for i=1,#files do
+ local data = flac.getmetadata(files[i])
+ if data then
+ local tags = data.tags
+ local info = data.info
+ local artist = tags.artist
+ local album = tags.album
+ local albums = music[artist]
+ if not albums then
+ albums = { }
+ music[artist] = albums
+ end
+ local albumx = albums[album]
+ if not albumx then
+ albumx = {
+ year = tags.date,
+ tracks = { },
+ }
+ albums[album] = albumx
+ end
+ albumx.tracks[tonumber(tags.tracknumber) or 0] = {
+ title = tags.title,
+ length = math.round((info.samples_in_stream/info.sample_rate_in_hz)),
+ }
+ end
+ end
+ -- inspect(music)
+ local nofartists, nofalbums, noftracks, noferrors = 0, 0, 0, 0
+ local f = io.open(filename,"wb")
+ if f then
+ f:write("<?xml version='1.0' standalone='yes'?>\n\n")
+ f:write("<collection>\n")
+ for artist, albums in table.sortedpairs(music) do
+ nofartists = nofartists + 1
+ f:write("\t<artist>\n")
+ f:write("\t\t<name>" .. artist .. "</name>\n")
+ f:write("\t\t<albums>\n")
+ for album, data in table.sortedpairs(albums) do
+ nofalbums = nofalbums + 1
+ f:write("\t\t\t<album year='" .. (data.year or 0) .. "'>\n")
+ f:write("\t\t\t\t<name>" .. album .. "</name>\n")
+ f:write("\t\t\t\t<tracks>\n")
+ local tracks = data.tracks
+ for i=1,#tracks do
+ local track = tracks[i]
+ if track then
+ noftracks = noftracks + 1
+ f:write("\t\t\t\t\t<track length='" .. track.length .. "'>" .. track.title .. "</track>\n")
+ else
+ noferrors = noferrors + 1
+ flac.report("error in album: %q of artist",album,artist)
+ f:write("\t\t\t\t\t<error track='" .. i .. "'/>\n")
+ end
+ end
+ f:write("\t\t\t\t</tracks>\n")
+ f:write("\t\t\t</album>\n")
+ end
+ f:write("\t\t</albums>\n")
+ f:write("\t</artist>\n")
+ end
+ f:write("</collection>\n")
+ end
+ f:close()
+ flac.report("%s tracks of %s albums of %s artists saved in %q (%s errors)",noftracks,nofalbums,nofartists,filename,noferrors)
+end
+
+--
+
+local helpinfo = [[
+--collect collect albums in xml file
+
+example:
+
+mtxrun --script flac --collect somename.flac
+mtxrun --script flac --collect --pattern="m:/music/**")
+]]
+
+local application = logs.application {
+ name = "mtx-flac",
+ banner = "ConTeXt Flac Helpers 0.10",
+ helpinfo = helpinfo,
+}
+
+flac.report = application.report
+
+-- script code
+
+scripts = scripts or { }
+scripts.flac = scripts.flac or { }
+
+function scripts.flac.collect()
+ local files = environment.files
+ local pattern = environment.arguments.pattern
+ if #files > 0 then
+ for i=1,#files do
+ local filename = files[1]
+ if file.suffix(filename) == "flac" then
+ flac.savecollection(filename,file.replacesuffix(filename,"xml"))
+ elseif lfs.isdir(filename) then
+ local pattern = filename .. "/**.flac"
+ flac.savecollection(pattern,file.addsuffix(file.basename(filename),"xml"))
+ else
+ flac.savecollection(file.replacesuffix(filename,"flac"),file.replacesuffix(filename,"xml"))
+ end
+ end
+ elseif pattern then
+ flac.savecollection(file.addsuffix(pattern,"flac"),"music-collection.xml")
+ else
+ flac.report("no file(s) or pattern given" )
+ end
+end
+
+if environment.argument("collect") then
+ scripts.flac.collect()
+else
+ application.help()
+end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua b/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua
index 74012ae38d3..8c8f47a70ab 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-fonts.lua
@@ -6,22 +6,107 @@ if not modules then modules = { } end modules ['mtx-fonts'] = {
license = "see context related readme files"
}
+local helpinfo = [[
+--save save open type font in raw table
+
+--reload generate new font database
+--reload --simple generate 'luatex-fonts-names.lua' (not for context!)
+
+--list --name list installed fonts, filter by name [--pattern]
+--list --spec list installed fonts, filter by spec [--filter]
+--list --file list installed fonts, filter by file [--pattern]
+
+--pattern=str filter files using pattern
+--filter=list key-value pairs
+--all show all found instances
+--info give more details
+--track=list enable trackers
+--statistics some info about the database
+
+examples of searches:
+
+mtxrun --script font --list somename (== --pattern=*somename*)
+
+mtxrun --script font --list --name somename
+mtxrun --script font --list --name --pattern=*somename*
+
+mtxrun --script font --list --spec somename
+mtxrun --script font --list --spec somename-bold-italic
+mtxrun --script font --list --spec --pattern=*somename*
+mtxrun --script font --list --spec --filter="fontname=somename"
+mtxrun --script font --list --spec --filter="familyname=somename,weight=bold,style=italic,width=condensed"
+mtxrun --script font --list --spec --filter="familyname=crap*,weight=bold,style=italic"
+
+mtxrun --script font --list --file somename
+mtxrun --script font --list --file --pattern=*somename*
+]]
+
+local application = logs.application {
+ name = "mtx-fonts",
+ banner = "ConTeXt Font Database Management 0.21",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
+-- todo: fc-cache -v en check dirs, or better is: fc-cat -v | grep Directory
+
if not fontloader then fontloader = fontforge end
-dofile(resolvers.find_file("font-otp.lua","tex"))
-dofile(resolvers.find_file("font-syn.lua","tex"))
-dofile(resolvers.find_file("font-mis.lua","tex"))
+dofile(resolvers.findfile("font-otp.lua","tex")) -- we need to unpack the font for analysis
+dofile(resolvers.findfile("font-syn.lua","tex"))
+dofile(resolvers.findfile("font-mis.lua","tex"))
scripts = scripts or { }
scripts.fonts = scripts.fonts or { }
+function fonts.names.statistics()
+ fonts.names.load()
+
+ local data = fonts.names.data
+ local statistics = data.statistics
+
+ local function counted(t)
+ local n = { }
+ for k, v in next, t do
+ n[k] = table.count(v)
+ end
+ return table.sequenced(n)
+ end
+
+ report("cache uuid : %s", data.cache_uuid)
+ report("cache version : %s", data.cache_version)
+ report("number of trees : %s", #data.datastate)
+ report()
+ report("number of fonts : %s", statistics.fonts or 0)
+ report("used files : %s", statistics.readfiles or 0)
+ report("skipped files : %s", statistics.skippedfiles or 0)
+ report("duplicate files : %s", statistics.duplicatefiles or 0)
+ report("specifications : %s", #data.specifications)
+ report("families : %s", table.count(data.families))
+ report()
+ report("mappings : %s", counted(data.mappings))
+ report("fallbacks : %s", counted(data.fallbacks))
+ report()
+ report("used styles : %s", table.sequenced(statistics.used_styles))
+ report("used variants : %s", table.sequenced(statistics.used_variants))
+ report("used weights : %s", table.sequenced(statistics.used_weights))
+ report("used widths : %s", table.sequenced(statistics.used_widths))
+ report()
+ report("found styles : %s", table.sequenced(statistics.styles))
+ report("found variants : %s", table.sequenced(statistics.variants))
+ report("found weights : %s", table.sequenced(statistics.weights))
+ report("found widths : %s", table.sequenced(statistics.widths))
+
+end
+
function fonts.names.simple()
local simpleversion = 1.001
local simplelist = { "ttf", "otf", "ttc", "dfont" }
local name = "luatex-fonts-names.lua"
fonts.names.filters.list = simplelist
fonts.names.version = simpleversion -- this number is the same as in font-dum.lua
- logs.report("fontnames","generating font database for 'luatex-fonts' version %s",fonts.names.version)
+ report("generating font database for 'luatex-fonts' version %s",fonts.names.version)
fonts.names.identify(true)
local data = fonts.names.data
if data then
@@ -38,12 +123,12 @@ function fonts.names.simple()
simplemappings[tag] = { s.rawname, s.filename, s.subfont }
end
end
- logs.report("fontnames","saving names in '%s'",name)
+ report("saving names in '%s'",name)
io.savedata(name,table.serialize(simplified,true))
- local data = io.loaddata(resolvers.find_file("font-dum.lua","tex"))
+ local data = io.loaddata(resolvers.findfile("font-dum.lua","tex"))
local dummy = string.match(data,"fonts%.names%.version%s*=%s*([%d%.]+)")
if tonumber(dummy) ~= simpleversion then
- logs.report("fontnames","warning: version number %s in 'font-dum' does not match database version number %s",dummy or "?",simpleversion)
+ report("warning: version number %s in 'font-dum' does not match database version number %s",dummy or "?",simpleversion)
end
elseif lfs.isfile(name) then
os.remove(name)
@@ -75,28 +160,29 @@ local function fontweight(fw)
end
local function showfeatures(tag,specification)
- logs.simple("mapping : %s",tag)
- logs.simple("fontname: %s",specification.fontname)
- logs.simple("fullname: %s",specification.fullname)
- logs.simple("filename: %s",specification.filename)
- logs.simple("family : %s",specification.familyname or "<nofamily>")
- logs.simple("weight : %s",specification.weight or "<noweight>")
- logs.simple("style : %s",specification.style or "<nostyle>")
- logs.simple("width : %s",specification.width or "<nowidth>")
- logs.simple("variant : %s",specification.variant or "<novariant>")
- logs.simple("subfont : %s",subfont(specification.subfont))
- logs.simple("fweight : %s",fontweight(specification.fontweight))
+ report()
+ report("mapping : %s",tag)
+ report("fontname: %s",specification.fontname)
+ report("fullname: %s",specification.fullname)
+ report("filename: %s",specification.filename)
+ report("family : %s",specification.familyname or "<nofamily>")
+ report("weight : %s",specification.weight or "<noweight>")
+ report("style : %s",specification.style or "<nostyle>")
+ report("width : %s",specification.width or "<nowidth>")
+ report("variant : %s",specification.variant or "<novariant>")
+ report("subfont : %s",subfont(specification.subfont))
+ report("fweight : %s",fontweight(specification.fontweight))
-- maybe more
- local features = fonts.get_features(specification.filename,specification.format)
+ local features = fonts.helpers.getfeatures(specification.filename,specification.format)
if features then
for what, v in table.sortedhash(features) do
local data = features[what]
if data and next(data) then
- logs.simple()
- logs.simple("%s features:",what)
- logs.simple()
- logs.simple("feature script languages")
- logs.simple()
+ report()
+ report("%s features:",what)
+ report()
+ report("feature script languages")
+ report()
for f,ff in table.sortedhash(data) do
local done = false
for s, ss in table.sortedhash(ff) do
@@ -107,24 +193,22 @@ local function showfeatures(tag,specification)
else
done = true
end
- logs.simple("% -8s % -8s % -8s",f,s,table.concat(table.sortedkeys(ss), " "))
+ report("% -8s % -8s % -8s",f,s,table.concat(table.sortedkeys(ss), " ")) -- todo: padd 4
end
end
end
end
else
- logs.simple()
- logs.simple("no features")
- logs.simple()
+ report("no features")
end
- logs.reportline()
+ report()
end
local function reloadbase(reload)
if reload then
- logs.simple("fontnames, reloading font database")
+ report("fontnames, reloading font database")
names.load(true)
- logs.simple("fontnames, done\n\n")
+ report("fontnames, done\n\n")
end
end
@@ -151,12 +235,10 @@ local function list_specifications(t,info)
subfont(entry.subfont),
fontweight(entry.fontweight),
}
- e[k] = entry
end
- table.formatcolumns(s)
+ utilities.formatters.formatcolumns(s)
for k=1,#s do
- local v = s[k]
- texio.write_nl(v)
+ texio.write_nl(s[k])
end
end
end
@@ -181,7 +263,7 @@ local function list_matches(t,info)
subfont(entry.subfont)
}
end
- table.formatcolumns(s)
+ utilities.formatters.formatcolumns(s)
for k=1,#s do
texio.write_nl(s[k])
end
@@ -205,17 +287,17 @@ function scripts.fonts.list()
--~ mtxrun --script font --list --name --pattern=*somename*
list_matches(fonts.names.list(string.topattern(pattern,true),reload,all),info)
elseif filter then
- logs.report("fontnames","not supported: --list --name --filter",name)
+ report("not supported: --list --name --filter",name)
elseif given then
--~ mtxrun --script font --list --name somename
list_matches(fonts.names.list(given,reload,all),info)
else
- logs.report("fontnames","not supported: --list --name <no specification>",name)
+ report("not supported: --list --name <no specification>",name)
end
elseif environment.argument("spec") then
if pattern then
--~ mtxrun --script font --list --spec --pattern=*somename*
- logs.report("fontnames","not supported: --list --spec --pattern",name)
+ report("not supported: --list --spec --pattern",name)
elseif filter then
--~ mtxrun --script font --list --spec --filter="fontname=somename"
list_specifications(fonts.names.getlookups(filter),info)
@@ -223,19 +305,19 @@ function scripts.fonts.list()
--~ mtxrun --script font --list --spec somename
list_specifications(fonts.names.collectspec(given,reload,all),info)
else
- logs.report("fontnames","not supported: --list --spec <no specification>",name)
+ report("not supported: --list --spec <no specification>",name)
end
elseif environment.argument("file") then
if pattern then
--~ mtxrun --script font --list --file --pattern=*somename*
list_specifications(fonts.names.collectfiles(string.topattern(pattern,true),reload,all),info)
elseif filter then
- logs.report("fontnames","not supported: --list --spec",name)
+ report("not supported: --list --spec",name)
elseif given then
--~ mtxrun --script font --list --file somename
list_specifications(fonts.names.collectfiles(given,reload,all),info)
else
- logs.report("fontnames","not supported: --list --file <no specification>",name)
+ report("not supported: --list --file <no specification>",name)
end
elseif pattern then
--~ mtxrun --script font --list --pattern=*somename*
@@ -243,8 +325,11 @@ function scripts.fonts.list()
elseif given then
--~ mtxrun --script font --list somename
list_matches(fonts.names.list(given,reload,all),info)
+ elseif all then
+ pattern = "*"
+ list_matches(fonts.names.list(string.topattern(pattern,true),reload,all),info)
else
- logs.report("fontnames","not supported: --list <no specification>",name)
+ report("not supported: --list <no specification>",name)
end
end
@@ -255,19 +340,20 @@ function scripts.fonts.save()
local function save(savename,fontblob)
if fontblob then
savename = savename:lower() .. ".lua"
- logs.simple("fontsave, saving data in %s",savename)
+ report("fontsave, saving data in %s",savename)
+-- fontloader.apply_featurefile(fontblob, "./ts/test.fea")
table.tofile(savename,fontloader.to_table(fontblob),"return")
fontloader.close(fontblob)
end
end
if name and name ~= "" then
- local filename = resolvers.find_file(name) -- maybe also search for opentype
+ local filename = resolvers.findfile(name) -- maybe also search for opentype
if filename and filename ~= "" then
- local suffix = file.extname(filename)
+ local suffix = string.lower(file.extname(filename))
if suffix == 'ttf' or suffix == 'otf' or suffix == 'ttc' or suffix == "dfont" then
local fontinfo = fontloader.info(filename)
if fontinfo then
- logs.simple("font: %s located as %s",name,filename)
+ report("font: %s located as %s",name,filename)
if fontinfo[1] then
for k=1,#fontinfo do
local v = fontinfo[k]
@@ -277,58 +363,19 @@ function scripts.fonts.save()
save(fontinfo.fullname,fontloader.open(filename))
end
else
- logs.simple("font: %s cannot be read",filename)
+ report("font: %s cannot be read",filename)
end
else
- logs.simple("font: %s not saved",filename)
+ report("font: %s not saved",filename)
end
else
- logs.simple("font: %s not found",name)
+ report("font: %s not found",name)
end
else
- logs.simple("font: no name given")
+ report("font: no name given")
end
end
-logs.extendbanner("ConTeXt Font Database Management 0.21",true)
-
-messages.help = [[
---save save open type font in raw table
-
---reload generate new font database
---reload --simple generate 'luatex-fonts-names.lua' (not for context!)
-
---list --name list installed fonts, filter by name [--pattern]
---list --spec list installed fonts, filter by spec [--filter]
---list --file list installed fonts, filter by file [--pattern]
-
---pattern=str filter files using pattern
---filter=list key-value pairs
---all show all found instances
---info give more details
---track=list enable trackers
-
-examples of searches:
-
-mtxrun --script font --list somename (== --pattern=*somename*)
-
-mtxrun --script font --list --name somename
-mtxrun --script font --list --name --pattern=*somename*
-
-mtxrun --script font --list --spec somename
-mtxrun --script font --list --spec somename-bold-italic
-mtxrun --script font --list --spec --pattern=*somename*
-mtxrun --script font --list --spec --filter="fontname=somename"
-mtxrun --script font --list --spec --filter="familyname=somename,weight=bold,style=italic,width=condensed"
-
-mtxrun --script font --list --file somename
-mtxrun --script font --list --file --pattern=*somename*
-]]
-
-local track = environment.argument("track")
-
-if track then trackers.enable(track) end
-
if environment.argument("names") then
environment.setargument("reload",true)
environment.setargument("simple",true)
@@ -340,6 +387,8 @@ elseif environment.argument("reload") then
scripts.fonts.reload()
elseif environment.argument("save") then
scripts.fonts.save()
+elseif environment.argument("statistics") then
+ fonts.names.statistics()
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-grep.lua b/Master/texmf-dist/scripts/context/lua/mtx-grep.lua
index 9604bc9f85d..963422c68ec 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-grep.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-grep.lua
@@ -6,11 +6,25 @@ if not modules then modules = { } end modules ['mtx-babel'] = {
license = "see context related readme files"
}
+local helpinfo = [[
+--pattern search for pattern (optional)
+--count count matches only
+--nocomment skip lines that start with %% or #
+
+patterns are lua patterns and need to be escaped accordingly
+]]
+
+local application = logs.application {
+ name = "mtx-grep",
+ banner = "Simple Grepper 0.10",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
scripts = scripts or { }
scripts.grep = scripts.grep or { }
-logs.extendbanner("Simple Grepper 0.10",true)
-
local find, format = string.find, string.format
local cr = lpeg.P("\r")
@@ -94,14 +108,6 @@ function scripts.grep.find(pattern, files, offset)
end
end
-messages.help = [[
---pattern search for pattern (optional)
---count count matches only
---nocomment skip lines that start with %% or #
-
-patterns are lua patterns and need to be escaped accordingly
-]]
-
local pattern = environment.argument("pattern")
local files = environment.files and #environment.files > 0 and environment.files
@@ -110,5 +116,5 @@ if pattern and files then
elseif files then
scripts.grep.find(files[1], files, 2)
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-interface.lua b/Master/texmf-dist/scripts/context/lua/mtx-interface.lua
index 730a030d930..954cb449870 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-interface.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-interface.lua
@@ -6,7 +6,39 @@ if not modules then modules = { } end modules ['mtx-cache'] = {
license = "see context related readme files"
}
-local format = string.format
+local concat, sort, insert = table.concat, table.sort, table.insert
+local gsub, format, gmatch, find = string.gsub, string.format, string.gmatch, string.find
+local utfchar, utfgsub = utf.char, utf.gsub
+
+local helpinfo = [[
+--interfaces generate context interface files
+--messages generate context message files
+--labels generate context label files
+
+--context equals --interfaces --messages --languages
+
+--scite generate scite interface
+--bbedit generate bbedit interface files
+--jedit generate jedit interface files
+--textpad generate textpad interface files
+--text create text files for commands and environments
+--raw report commands to the console
+--check generate check file
+
+--toutf replace named characters by utf
+--preprocess preprocess mkvi files to tex files [force,suffix]
+
+--suffix use given suffix for output files
+--force force action even when in doubt
+]]
+
+local application = logs.application {
+ name = "mtx-interface",
+ banner = "ConTeXt Interface Related Goodies 0.13",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
scripts = scripts or { }
scripts.interface = scripts.interface or { }
@@ -15,11 +47,11 @@ local flushers = { }
local userinterfaces = { 'en','cs','de','it','nl','ro','fr','pe' }
local messageinterfaces = { 'en','cs','de','it','nl','ro','fr','pe','no' }
-function flushers.scite(interface,collection)
+function flushers.scite(interface,commands)
local result, i = {}, 0
result[#result+1] = format("keywordclass.macros.context.%s=",interface)
- for i=1,#collection do
- local command = collection[i]
+ for i=1,#commands do
+ local command = commands[i]
if i==0 then
result[#result+1] = "\\\n"
i = 5
@@ -28,64 +60,139 @@ function flushers.scite(interface,collection)
end
result[#result+1] = format("%s ",command)
end
- io.savedata(format("cont-%s-scite.properties",interface), table.concat(result),"\n")
- io.savedata(format("cont-%s-scite.lua",interface), table.serialize(collection,true))
+ io.savedata(format("cont-%s-scite.properties",interface), concat(result),"\n")
+ io.savedata(format("cont-%s-scite.lua",interface), table.serialize(commands,true))
end
-function flushers.jedit(interface,collection)
+function flushers.jedit(interface,commands)
local result = {}
result[#result+1] = "<?xml version='1.0'?>"
result[#result+1] = "<!DOCTYPE MODE SYSTEM 'xmode.dtd'>\n"
result[#result+1] = "<MODE>"
result[#result+1] = "\t<RULES>"
result[#result+1] = "\t\t<KEYWORDS>"
- for i=1,#collection do
- local command = collection[i]
- result[#result+1] = format("\t\t\t<KEYWORD2>%s</KEYWORD2>",command)
+ for i=1,#commands do
+ result[#result+1] = format("\t\t\t<KEYWORD2>%s</KEYWORD2>",commands[i])
end
result[#result+1] = "\t\t</KEYWORDS>"
result[#result+1] = "\t</RULES>"
result[#result+1] = "</MODE>"
- io.savedata(format("context-jedit-%s.xml",interface), table.concat(result),"\n")
+ io.savedata(format("context-jedit-%s.xml",interface), concat(result),"\n")
end
-function flushers.bbedit(interface,collection)
+function flushers.bbedit(interface,commands)
local result = {}
result[#result+1] = "<?xml version='1.0'?>"
result[#result+1] = "<key>BBLMKeywordList</key>"
result[#result+1] = "<array>"
- for i=1,#collection do
- local command = collection[i]
- result[#result+1] = format("\t<string>\\%s</string>",command)
+ for i=1,#commands do
+ result[#result+1] = format("\t<string>\\%s</string>",commands[i])
end
result[#result+1] = "</array>"
- io.savedata(format("context-bbedit-%s.xml",interface), table.concat(result),"\n")
+ io.savedata(format("context-bbedit-%s.xml",interface), concat(result),"\n")
+end
+
+function flushers.raw(interface,commands)
+ for i=1,#commands do
+ report(commands[i])
+ end
+end
+
+local textpadcreator = "mtx-interface-textpad.lua"
+
+function flushers.text(interface,commands,environments)
+ local c, cname = { }, format("context-commands-%s.txt",interface)
+ local e, ename = { }, format("context-environments-%s.txt",interface)
+ report("saving '%s'",cname)
+ for i=1,#commands do
+ c[#c+1] = format("\\%s",commands[i])
+ end
+ io.savedata(cname,concat(c,"\n"))
+ report("saving '%s'",ename)
+ for i=1,#environments do
+ e[#e+1] = format("\\start%s",environments[i])
+ e[#e+1] = format("\\stop%s", environments[i])
+ end
+ io.savedata(format("context-environments-%s.txt",interface),concat(e,"\n"))
end
-function flushers.raw(interface,collection)
- for i=1,#collection do
- local command = collection[i]
- logs.simple(command)
+function flushers.textpad(interface,commands,environments)
+ flushers.text(interface,commands,environments)
+ --
+ -- plugin, this is a rewrite of a file provided by Lukas Prochazka
+ --
+ local function merge(templatedata,destinationdata,categories)
+ report("loading '%s'",templatedata)
+ local data = io.loaddata(templatedata)
+ local done = 0
+ for i=1,#categories do
+ local category = categories[i]
+ local cpattern = ";%s*category:%s*(" .. category .. ")%s*[\n\r]+"
+ local fpattern = ";%s*filename:%s*(" .. "%S+" .. ")%s*[\n\r]+"
+ data = gsub(data,cpattern..fpattern,function(category,filename)
+ local found = resolvers.findfile(filename) or ""
+ local blob = found ~= "" and io.loaddata(found) or ""
+ if blob == "" then
+ report("category: %s, filename: %s, not found",category,filename)
+ else
+ done = done + 1
+ report("category: %s, filename: %s, merged",category,filename)
+ end
+ return format("; category: %s\n; filename: %s\n%s\n\n",category,filename,blob)
+ end)
+ end
+ if done > 0 then
+ report("saving '%s' (%s files merged)",destinationdata,done)
+ io.savedata(destinationdata,data)
+ else
+ report("skipping '%s' (no files merged)",destinationdata)
+ end
+ end
+ local templatename = "textpad-context-template.txt"
+ local templatedata = resolvers.findfile(templatename) or ""
+ if templatedata == "" then
+ report("unable to locate template '%s'",templatename)
+ else
+ merge(templatedata, "context.syn", { "tex commands","context commands" })
+ if environment.argument("textpad") == "latex" then
+ merge(templatedata, "context-latex.syn", { "tex commands","context commands", "latex commands" })
+ end
end
+ local r = { }
+ local c = io.loaddata("context-commands-en.txt") or "" -- sits on the same path
+ local e = io.loaddata("context-environments-en.txt") or "" -- sits on the same path
+ for s in gmatch(c,"\\(.-)%s") do
+ r[#r+1] = format("\n!TEXT=%s\n\\%s\n!",s,s)
+ end
+ for s in gmatch(e,"\\start(.-)%s+\\stop(.-)") do
+ r[#r+1] = format("\n!TEXT=%s (start/stop)\n\\start%s \\^\\stop%s\n!",s,s,s)
+ end
+ sort(r)
+ insert(r,1,"!TCL=597,\n!TITLE=ConTeXt\n!SORT=N\n!CHARSET=DEFAULT")
+ io.savedata("context.tcl",concat(r,"\n"))
+ -- cleanup
+ os.remove("context-commands-en.txt")
+ os.remove("context-environments-en.txt")
end
-function scripts.interface.editor(editor)
- local interfaces= environment.files
+function scripts.interface.editor(editor,split,forcedinterfaces)
+ local interfaces= forcedinterfaces or environment.files
if #interfaces == 0 then
interfaces= userinterfaces
end
- local xmlfile = resolvers.find_file("cont-en.xml") or ""
+ local xmlfile = resolvers.findfile("cont-en.xml") or ""
if xmlfile == "" then
- logs.simple("unable to locate cont-en.xml")
+ report("unable to locate cont-en.xml")
end
for i=1,#interfaces do
local interface = interfaces[i]
- local keyfile = resolvers.find_file(format("keys-%s.xml",interface)) or ""
+ local keyfile = resolvers.findfile(format("keys-%s.xml",interface)) or ""
if keyfile == "" then
- logs.simple("unable to locate keys-*.xml")
+ report("unable to locate keys-*.xml")
else
- local collection = { }
- local mappings = { }
+ local commands = { }
+ local mappings = { }
+ local environments = { }
local x = xml.load(keyfile)
for e, d, k in xml.elements(x,"cd:command") do
local at = d[k].at
@@ -101,23 +208,28 @@ function scripts.interface.editor(editor)
if name and name ~= "" then
local remapped = mappings[name] or name
if type == "environment" then
- collection[#collection+1] = "start" .. remapped
- collection[#collection+1] = "stop" .. remapped
+ if split then
+ environments[#environments+1] = remapped
+ else
+ commands[#commands+1] = "start" .. remapped
+ commands[#commands+1] = "stop" .. remapped
+ end
else
- collection[#collection+1] = remapped
+ commands[#commands+1] = remapped
end
end
end
- if #collection > 0 then
- table.sort(collection)
- flushers[editor](interface,collection)
+ if #commands > 0 then
+ sort(commands)
+ sort(environments)
+ flushers[editor](interface,commands,environments)
end
end
end
end
function scripts.interface.check()
- local xmlfile = resolvers.find_file("cont-en.xml") or ""
+ local xmlfile = resolvers.findfile("cont-en.xml") or ""
if xmlfile ~= "" then
local f = io.open("cont-en-check.tex","w")
if f then
@@ -142,13 +254,13 @@ function scripts.interface.check()
end
end
-function scripts.interface.context()
- local filename = resolvers.find_file(environment.files[1] or "mult-def.lua") or ""
+function scripts.interface.interfaces()
+ local filename = resolvers.findfile(environment.files[1] or "mult-def.lua") or ""
if filename ~= "" then
local interface = dofile(filename)
if interface and next(interface) then
local variables, constants, commands, elements = interface.variables, interface.constants, interface.commands, interface.elements
- local filename = resolvers.find_file("cont-en.xml") or ""
+ local filename = resolvers.findfile("cont-en.xml") or ""
local xmldata = filename ~= "" and (io.loaddata(filename) or "")
local function flush(texresult,xmlresult,language,what,tag)
local t = interface[what]
@@ -161,7 +273,7 @@ function scripts.interface.context()
local v = t[key]
local value = v[language] or v["en"]
if not value then
- logs.simple(format("warning, no value for key '%s' for language '%s'",key,language))
+ report("warning, no value for key '%s' for language '%s'",key,language)
else
local value = t[key][language] or t[key].en
texresult[#texresult+1] = format("\\setinterface%s{%s}{%s}",tag,key,value)
@@ -196,12 +308,12 @@ function scripts.interface.context()
flush(texresult,xmlresult,language,"commands", "command")
texresult[#texresult+1] = format("%%\n\\endinput")
xmlresult[#xmlresult+1] = format("</cd:interface>")
- local texfilename = format("mult-%s.tex",language)
+ local texfilename = format("mult-%s.mkii",language)
local xmlfilename = format("keys-%s.xml",language)
- io.savedata(texfilename,table.concat(texresult,"\n"))
- logs.simple(format("saving interface definitions '%s'",texfilename))
- io.savedata(xmlfilename,table.concat(xmlresult,"\n"))
- logs.simple(format("saving interface translations '%s'",xmlfilename))
+ io.savedata(texfilename,concat(texresult,"\n"))
+ report("saving interface definitions '%s'",texfilename)
+ io.savedata(xmlfilename,concat(xmlresult,"\n"))
+ report("saving interface translations '%s'",xmlfilename)
if language ~= "en" and xmldata ~= "" then
local newdata = xmldata:gsub("(<cd:interface.*language=.)en(.)","%1"..language.."%2",1)
newdata = replace(newdata, 'cd:string', 'value', interface.commands, interface.elements, language)
@@ -212,63 +324,208 @@ function scripts.interface.context()
newdata = replace(newdata, 'cd:inherit', 'name', interface.commands, interface.elements, language)
local xmlfilename = format("cont-%s.xml",language)
io.savedata(xmlfilename,newdata)
- logs.simple(format("saving interface specification '%s'",xmlfilename))
+ report("saving interface specification '%s'",xmlfilename)
end
end
end
end
end
-function scripts.interface.messages()
- local filename = resolvers.find_file(environment.files[1] or "mult-mes.lua") or ""
- if filename ~= "" then
- local messages = dofile(filename)
- for i=1,#messageinterfaces do
- local interface = messageinterfaces[i]
- local texresult = { }
- for category, data in next, messages do
- for tag, message in next, data do
- if tag ~= "files" then
- local msg = message[interface] or message["all"] or message["en"]
- if msg then
- texresult[#texresult+1] = format("\\setinterfacemessage{%s}{%s}{%s}",category,tag,msg)
- end
- end
- end
+function scripts.interface.preprocess()
+ require("luat-mac.lua")
+ local newsuffix = environment.argument("suffix") or "log"
+ local force = environment.argument("force")
+ for i=1,#environment.files do
+ local oldname = environment.files[i]
+ local newname = file.replacesuffix(oldname,newsuffix)
+ if oldname == newname then
+ report("skipping '%s' because old and new name are the same",oldname)
+ elseif io.exists(newname) and not force then
+ report("skipping '%s' because new file exists, use --force",oldname)
+ else
+ report("processing '%s' into '%s'",oldname,newname)
+ io.savedata(newname,resolvers.macros.preprocessed(io.loaddata(oldname)))
+ end
+ end
+end
+
+-- function scripts.interface.messages()
+-- local filename = resolvers.findfile(environment.files[1] or "mult-mes.lua") or ""
+-- if filename ~= "" then
+-- local messages = dofile(filename)
+-- report("messages for * loaded from '%s'",filename)
+-- report()
+-- for i=1,#messageinterfaces do
+-- local interface = messageinterfaces[i]
+-- local texresult = { }
+-- for category, data in next, messages do
+-- for tag, message in next, data do
+-- if tag ~= "files" then
+-- local msg = message[interface] or message["all"] or message["en"]
+-- if msg then
+-- texresult[#texresult+1] = format("\\setinterfacemessage{%s}{%s}{%s}",category,tag,msg)
+-- end
+-- end
+-- end
+-- end
+-- texresult[#texresult+1] = format("%%\n\\endinput")
+-- local interfacefile = format("mult-m%s.mkii",interface)
+-- io.savedata(interfacefile,concat(texresult,"\n"))
+-- report("messages for '%s' saved in '%s'",interface,interfacefile)
+-- end
+-- end
+-- end
+
+function scripts.interface.toutf()
+ local filename = environment.files[1]
+ if filename then
+ require("char-def.lua")
+ local contextnames = { }
+ for unicode, data in next, characters.data do
+ local contextname = data.contextname
+ if contextname then
+ contextnames[contextname] = utf.char(unicode)
end
- texresult[#texresult+1] = format("%%\n\\endinput")
- io.savedata(format("mult-m%s.tex",interface),table.concat(texresult,"\n"))
+ contextnames.uumlaut = contextnames.udiaeresis
+ contextnames.Uumlaut = contextnames.Udiaeresis
+ contextnames.oumlaut = contextnames.odiaeresis
+ contextnames.Oumlaut = contextnames.Odiaeresis
+ contextnames.aumlaut = contextnames.adiaeresis
+ contextnames.Aumlaut = contextnames.Adiaeresis
end
+ report("loading '%s'",filename)
+ local str = io.loaddata(filename) or ""
+ local done = { }
+ str = gsub(str,"(\\)([a-zA-Z][a-zA-Z][a-zA-Z]+)(%s*)", function(b,s,a)
+ local cn = contextnames[s]
+ if cn then
+ done[s] = (done[s] or 0) + 1
+ return cn
+ else
+ done[s] = (done[s] or 0) - 1
+ return b .. s .. a
+ end
+ end)
+ for k, v in table.sortedpairs(done) do
+ if v > 0 then
+ report("+ %5i : %s => %s",v,k,contextnames[k])
+ else
+ report("- %5i : %s",-v,k,contextnames[k])
+ end
+ end
+ filename = filename .. ".toutf"
+ report("saving '%s'",filename)
+ io.savedata(filename,str)
end
end
-logs.extendbanner("ConTeXt Interface Related Goodies 0.11",true)
+-- function scripts.interface.labels()
+-- require("char-def.lua")
+-- require("lang-txt.lua")
+-- local interfaces = require("mult-def.lua")
+-- local variables = interfaces.variables
+-- local contextnames = { }
+-- for unicode, data in next, characters.data do
+-- local contextname = data.contextname
+-- if contextname then
+-- contextnames[utfchar(unicode)] = "\\" .. contextname .. " "
+-- end
+-- end
+-- contextnames["i"] = nil
+-- contextnames["'"] = nil
+-- contextnames["\\"] = nil
+-- local function flush(f,kind,what,expand,namespace,prefix)
+-- local whatdata = languages.data.labels[what]
+-- f:write("\n")
+-- f:write(format("%% %s => %s\n",what,kind))
+-- for tag, data in table.sortedpairs(whatdata) do
+-- if not data.hidden then
+-- f:write("\n")
+-- for language, text in table.sortedpairs(data.labels) do
+-- if text ~= "" then
+-- if expand then
+-- text = utfgsub(text,".",contextnames)
+-- text = gsub(text," ", "\ ")
+-- end
+-- if namespace and namespace[tag] then
+-- tag = prefix .. tag
+-- end
+-- if find(text,",") then
+-- text = "{" .. text .. "}"
+-- end
+-- if text == "" then
+-- -- skip
+-- else
+-- if type(text) == "table" then
+-- f:write(format("\\setup%stext[\\s!%s][%s={{%s},}]\n",kind,language,tag,text))
+-- else
+-- f:write(format("\\setup%stext[\\s!%s][%s={{%s},{%s}}]\n",kind,language,tag,text[1],text[2]))
+-- end
+-- end
+-- end
+-- end
+-- end
+-- end
+-- end
+-- function flushall(txtname,expand)
+-- local f = io.open(txtname,"w")
+-- if f then
+-- report("saving '%s'",txtname)
+-- f:write("% this file is auto-generated, don't edit this file\n")
+-- flush(f,"head","titles",expand,variables,"\\v!")
+-- flush(f,"label","texts",expand,variables,"\\v!")
+-- flush(f,"mathlabel","functions",expand)
+-- flush(f,"taglabel","tags",expand)
+-- f:write("\n")
+-- f:write("\\endinput\n")
+-- f:close()
+-- end
+-- end
+-- flushall("lang-txt.mkii",true)
+-- flushall("lang-txt.mkiv",false)
+-- end
-messages.help = [[
---scite generate scite interface
---bbedit generate scite interface
---jedit generate scite interface
---check generate check file
---context generate context definition files
---messages generate context message files
-]]
+local ea = environment.argument
-if environment.argument("context") then
- scripts.interface.context()
-elseif environment.argument("messages") then
- scripts.interface.messages()
-elseif environment.argument("scite") or environment.argument("bbedit") or environment.argument("jedit") then
- if environment.argument("scite") then
+if ea("context") then
+ scripts.interface.interfaces()
+ -- scripts.interface.messages()
+ -- scripts.interface.labels()
+elseif ea("interfaces") or ea("messages") or ea("labels") then
+ if ea("interfaces") then
+ scripts.interface.interfaces()
+ end
+ -- if ea("messages") then
+ -- scripts.interface.messages()
+ -- end
+ -- if ea("labels") then
+ -- scripts.interface.labels()
+ -- end
+elseif ea("preprocess") then
+ scripts.interface.preprocess()
+elseif ea("toutf") then
+ scripts.interface.toutf()
+elseif ea("check") then
+ scripts.interface.check()
+elseif ea("scite") or ea("bbedit") or ea("jedit") or ea("textpad") or ea("text") or ea("raw") then
+ if ea("scite") then
scripts.interface.editor("scite")
end
- if environment.argument("bbedit") then
+ if ea("bbedit") then
scripts.interface.editor("bbedit")
end
- if environment.argument("jedit") then
+ if ea("jedit") then
scripts.interface.editor("jedit")
end
-elseif environment.argument("check") then
- scripts.interface.check()
+ if ea("textpad") then
+ scripts.interface.editor("textpad",true, { "en" })
+ end
+ if ea("text") then
+ scripts.interface.editor("text")
+ end
+ if ea("raw") then
+ scripts.interface.editor("raw")
+ end
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-metapost.lua b/Master/texmf-dist/scripts/context/lua/mtx-metapost.lua
new file mode 100644
index 00000000000..3b9ed6ff17e
--- /dev/null
+++ b/Master/texmf-dist/scripts/context/lua/mtx-metapost.lua
@@ -0,0 +1,177 @@
+if not modules then modules = { } end modules ['mtx-metapost'] = { -- this was mtx-mptopdf
+ version = 0.100,
+ comment = "companion to mtxrun.lua",
+ author = "Taco Hoekwater & Hans Hagen",
+ copyright = "ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local helpinfo = [[
+--rawmp raw metapost run
+--metafun use metafun instead of plain
+--latex force --tex=latex
+--texexec force texexec usage (mkii)
+--split split single result file into pages
+
+intended usage:
+
+mtxrun --script metapost yourfile.mp
+mtxrun --script metapost --split yourfile.mp
+mtxrun --script metapost yourfile.123 myfile.mps
+
+other usage resembles mptopdf.pl
+]]
+
+local application = logs.application {
+ name = "mtx-metapost",
+ banner = "MetaPost to PDF processor 0.10",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
+scripts = scripts or { }
+scripts.mptopdf = scripts.mptopdf or { }
+scripts.mptopdf.aux = scripts.mptopdf.aux or { }
+
+local format, find, gsub = string.format, string.find, string.gsub
+
+local function assumes_latex(filename)
+ local d = io.loaddata(filename) or ""
+ return find(d,"\\documentstyle") or find(d,"\\documentclass") or find(d,"\\begin{document}")
+end
+
+local template = "\\startTEXpage\n\\convertMPtoPDF{%s}{1}{1}\n\\stopTEXpage"
+local texified = "\\starttext\n%s\n\\stoptext"
+local splitter = "\\startTEXpage\\externalfigure[%s][page=%s]\\stopTEXpage"
+local tempname = "mptopdf-temp.tex"
+
+local function do_convert(filename)
+ if find(filename,".%d+$") or find(filename,"%.mps$") then
+ io.savedata(tempname,format(template,filename))
+ local resultname = format("%s-%s.pdf",file.nameonly(filename),file.extname(filename))
+ local result = os.execute(format([[context --once --batch --purge --result=%s "%s"]],resultname,tempname))
+ return lfs.isfile(resultname) and resultname
+ end
+end
+
+local function do_split(filename,numbers)
+ local name = file.nameonly(filename)
+ for i=1,#numbers do
+ io.savedata(tempname,format(splitter,file.addsuffix(name,"pdf"),i))
+ local resultname = format("%s-%s.pdf",name,numbers[i])
+ local result = os.execute(format([[context --once --batch --purge --result=%s "%s"]],resultname,tempname))
+ end
+end
+
+local function do_texify(str)
+ -- This only works for flat mp files i.e. outer beginfigs. Normally a
+ -- context user will directly make a tex file. Of course we can make
+ -- this script more clever, but why should we as better methods exist.
+ local numbers = { }
+ str = "\\startMPinclusions\n".. str .. "\n\\stopMPinclusions"
+ str = gsub(str,"beginfig%s*%(%s*(.-)%s*%)%s*;%s*",function(s)
+ numbers[#numbers+1] = tonumber(s) or 0
+ return "\n\\stopMPinclusions\n\\startMPpage\n"
+ end)
+ str = gsub(str,"%s*endfig%s*;%s*","\n\\stopMPpage\n\\startMPinclusions\n")
+ str = gsub(str,"\\startMPinclusions%s*\\stopMPinclusions","")
+ str = gsub(str,"[\n\r]+","\n")
+ return format(texified,str), numbers
+end
+
+local function do_convert_all(filename)
+ local results = dir.glob(file.nameonly(filename) .. ".*") -- reset
+ local report = { }
+ for i=1,#results do
+ local filename = results[i]
+ local resultname = do_convert(filename)
+ if resultname then
+ report[#report+1] = { filename, resultname }
+ end
+ end
+ if #report > 0 then
+ report("number of converted files: %i", #report)
+ report()
+ for i=1,#report do
+ local r = report[i]
+ report("%s => %s", r[1], r[2])
+ end
+ else
+ report("no files are converted for '%s'",filename)
+ end
+end
+
+local function do_convert_one(filename)
+ local resultname = do_convert(filename)
+ if resultname then
+ report("%s => %s", filename,resultname)
+ else
+ report("no result for '%s'",filename)
+ end
+end
+
+function scripts.mptopdf.convertall()
+ local rawmp = environment.arguments.rawmp or false
+ local metafun = environment.arguments.metafun or false
+ local latex = environment.arguments.latex or false
+ local pattern = environment.arguments.pattern or false
+ local split = environment.arguments.split or false
+ local files
+ if pattern then
+ files = dir.glob(file.nameonly(filename))
+ else
+ files = environment.files
+ end
+ if #files > 0 then
+ for i=1,#files do
+ local filename = files[i]
+ if file.suffix(filename) == "mp" then
+ local command, convert, texdata, numbers
+ if rawmp then
+ if metafun then
+ command, convert = format("mpost --progname=mpost --mem=metafun %s",filename), true
+ else
+ command, convert = format("mpost --mem=mpost %s",filename), true
+ end
+ else
+ if latex or assumes_latex(filename) then
+ command, convert = format("mpost --mem=mpost --tex=latex %s",filename), true
+ elseif texexec then
+ command, convert = format("texexec --mptex %s",filename), true
+ else
+ texdata, numbers = do_texify(io.loaddata(filename) or "")
+ io.savedata(tempname,texdata)
+ command, convert = format("context --result=%s --purge --once %s",file.nameonly(filename),tempname), false
+ end
+ end
+ report("running: %s",command)
+ local done = os.execute(command)
+ if done then
+ if convert then
+ do_convert_all(filename)
+ elseif split then
+ do_split(filename,numbers)
+ -- already pdf, maybe optionally split
+ end
+ else
+ report("error while processing mp file '%s'", filename)
+ end
+ else
+ do_convert_one(filename)
+ end
+ end
+ else
+ report("no files match to process")
+ end
+end
+
+if environment.files[1] then
+ scripts.mptopdf.convertall()
+else
+ if not environment.arguments.help then
+ report("provide MP output file (or pattern)")
+ report()
+ end
+ application.help()
+end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-metatex.lua b/Master/texmf-dist/scripts/context/lua/mtx-metatex.lua
index 4453e2ccb47..0b66d59ef3a 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-metatex.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-metatex.lua
@@ -8,39 +8,41 @@ if not modules then modules = { } end modules ['mtx-metatex'] = {
-- future versions will deal with specific variants of metatex
+local helpinfo = [[
+--run process (one or more) files (default action)
+--make create metatex format(s)
+]]
+
+local application = logs.application {
+ name = "mtx-metatex",
+ banner = "MetaTeX Process Management 0.10",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
scripts = scripts or { }
scripts.metatex = scripts.metatex or { }
-- metatex
function scripts.metatex.make()
- local command = "luatools --make --compile metatex"
- logs.simple("running command: %s",command)
- os.spawn(command)
+ environment.make_format("metatex")
end
---~ function scripts.metatex.run()
---~ local name = environment.files[1] or ""
---~ if name ~= "" then
---~ local command = "luatools --fmt=metatex " .. name
---~ logs.simple("running command: %s",command)
---~ os.spawn(command)
---~ end
---~ end
-
function scripts.metatex.run(ctxdata,filename)
local filename = environment.files[1] or ""
if filename ~= "" then
- local formatfile, scriptfile = resolvers.locate_format("metatex")
+ local formatfile, scriptfile = resolvers.locateformat("metatex")
if formatfile and scriptfile then
local command = string.format("luatex --fmt=%s --lua=%s %s",
string.quote(formatfile), string.quote(scriptfile), string.quote(filename))
- logs.simple("running command: %s",command)
+ report("running command: %s",command)
os.spawn(command)
elseif formatname then
- logs.simple("error, no format found with name: %s",formatname)
+ report("error, no format found with name: %s",formatname)
else
- logs.simple("error, no format found (provide formatname or interface)")
+ report("error, no format found (provide formatname or interface)")
end
end
end
@@ -49,13 +51,6 @@ function scripts.metatex.timed(action)
statistics.timed(action)
end
-logs.extendbanner("MetaTeX Process Management 0.10",true)
-
-messages.help = [[
---run process (one or more) files (default action)
---make create metatex format(s)
-]]
-
if environment.argument("run") then
scripts.metatex.timed(scripts.metatex.run)
elseif environment.argument("make") then
@@ -65,5 +60,5 @@ elseif environment.argument("help") then
elseif environment.files[1] then
scripts.metatex.timed(scripts.metatex.run)
else
- logs.help(messages.help,false)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-modules.lua b/Master/texmf-dist/scripts/context/lua/mtx-modules.lua
index 3a348593f8e..8f3ab89cfb6 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-modules.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-modules.lua
@@ -9,6 +9,20 @@ if not modules then modules = { } end modules ['mtx-modules'] = {
scripts = scripts or { }
scripts.modules = scripts.modules or { }
+local helpinfo = [[
+--convert convert source files (tex, mkii, mkiv, mp) to 'ted' files
+--process process source files (tex, mkii, mkiv, mp) to 'pdf' files
+--prep use original name with suffix 'prep' appended
+]]
+
+local application = logs.application {
+ name = "mtx-modules",
+ banner = "ConTeXt Module Documentation Generators 1.00",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
-- Documentation can be woven into a source file. This script can generates
-- a file with the documentation and source fragments properly tagged. The
-- documentation is included as comment:
@@ -39,15 +53,15 @@ local find, format, sub, is_empty, strip = string.find, string.format, string.su
local function source_to_ted(inpname,outname,filetype)
local inp = io.open(inpname)
if not inp then
- logs.simple("unable to open '%s'",inpname)
+ report("unable to open '%s'",inpname)
return
end
local out = io.open(outname,"w")
if not out then
- logs.simple("unable to open '%s'",outname)
+ report("unable to open '%s'",outname)
return
end
- logs.simple("converting '%s' to '%s'",inpname,outname)
+ report("converting '%s' to '%s'",inpname,outname)
local skiplevel, indocument, indefinition = 0, false, false
out:write(format("\\startmodule[type=%s]\n",filetype or file.suffix(inpname)))
for line in inp:lines() do
@@ -118,7 +132,7 @@ local function source_to_ted(inpname,outname,filetype)
return true
end
-local suffixes = table.tohash { 'tex','mkii','mkiv','mp' }
+local suffixes = table.tohash { 'tex','mkii','mkiv', 'mkvi', 'mp' }
function scripts.modules.process(runtex)
local processed = { }
@@ -143,25 +157,16 @@ function scripts.modules.process(runtex)
end
for i=1,#processed do
local name = processed[i]
- logs.simple("modules","processed: %s",name)
+ report("modules","processed: %s",name)
end
end
-- context --ctx=m-modules.ctx xxx.mkiv
-
-logs.extendbanner("ConTeXt Module Documentation Generators 1.00",true)
-
-messages.help = [[
---convert convert source files (tex, mkii, mkiv, mp) to 'ted' files
---process process source files (tex, mkii, mkiv, mp) to 'pdf' files
---prep use original name with suffix 'prep' appended
-]]
-
if environment.argument("process") then
scripts.modules.process(true)
elseif environment.argument("convert") then
scripts.modules.process(false)
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-mptopdf.lua b/Master/texmf-dist/scripts/context/lua/mtx-mptopdf.lua
deleted file mode 100644
index 342ff1c284a..00000000000
--- a/Master/texmf-dist/scripts/context/lua/mtx-mptopdf.lua
+++ /dev/null
@@ -1,127 +0,0 @@
-if not modules then modules = { } end modules ['mtx-mptopdf'] = {
- version = 1.303,
- comment = "companion to mtxrun.lua, patched by HH so errors are his",
- author = "Taco Hoekwater, Elvenkind BV, Dordrecht NL",
- copyright = "Elvenkind BV / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-scripts = scripts or { }
-scripts.mptopdf = scripts.mptopdf or { }
-scripts.mptopdf.aux = scripts.mptopdf.aux or { }
-
-local dosish = os.type == 'windows'
-local miktex = dosish and environment.TEXSYSTEM and environment.TEXSYSTEM:find("miktex")
-local escapeshell = environment.SHELL and environment.SHELL:find("sh") and true
-
-function scripts.mptopdf.aux.find_latex(fname)
- local d = io.loaddata(fname) or ""
- return d:find("\\documentstyle") or d:find("\\documentclass") or d:find("\\begin{document}")
-end
-
-function scripts.mptopdf.aux.do_convert (fname)
- local command, done, pdfdest = "", 0, ""
- if fname:find(".%d+$") or fname:find("%.mps$") then
- if miktex then
- command = "pdftex -undump=mptopdf"
- else
- command = "pdftex -fmt=mptopdf -progname=context"
- end
- if dosish then
- command = string.format('%s \\relax "%s"',command,fname)
- else
- command = string.format('%s \\\\relax "%s"',command,fname)
- end
- local result = os.execute(command)
- if result == 0 then
- local name, suffix = file.nameonly(fname), file.extname(fname)
- local pdfsrc = name .. ".pdf"
- if lfs.isfile(pdfsrc) then
- pdfdest = name .. "-" .. suffix .. ".pdf"
- os.rename(pdfsrc, pdfdest)
- if lfs.isfile(pdfsrc) then -- rename failed
- file.copy(pdfsrc, pdfdest)
- end
- done = 1
- end
- end
- end
- return done, pdfdest
-end
-
-function scripts.mptopdf.aux.make_mps(fn,latex,rawmp,metafun)
- local rest, mpbin = latex and " --tex=latex " or " ", ""
- if rawmp then
- if metafun then
- mpbin = "mpost --progname=mpost --mem=metafun"
- else
- mpbin = "mpost --mem=mpost"
- end
- else
- if latex then
- mpbin = "mpost --mem=mpost"
- else
- mpbin = "texexec --mptex"
- end
- end
- local runner = mpbin .. rest .. fn
- logs.simple("running: %s\n", runner)
- return (os.execute(runner))
-end
-
-function scripts.mptopdf.convertall()
- local rawmp = environment.arguments.rawmp or false
- local metafun = environment.arguments.metafun or false
- local latex = environment.arguments.latex or false
- local files = dir.glob(environment.files)
- if #files > 0 then
- local fn = files[1]
- if #files == 1 and fn:find("%.mp$") then
- latex = scripts.mptopdf.aux.find_latex(fn) or latex
- end
- if scripts.mptopdf.aux.make_mps(fn,latex,rawmp,metafun) then
- files = dir.glob(file.nameonly(fn) .. ".*") -- reset
- else
- logs.simple("error while processing mp file '%s'", fn)
- exit(1)
- end
- local report = { }
- for i=1,#files do
- local fn = files[i]
- local success, name = scripts.mptopdf.aux.do_convert(fn)
- if success > 0 then
- report[#report+1] = { fn, name }
- end
- end
- if #report > 0 then
- logs.simple("number of converted files: %i", #report)
- logs.simple("")
- for i=1,#report do
- local r = report[i]
- logs.simple("%s => %s", r[1], r[2])
- end
- else
- logs.simple("no files are converted")
- end
- else
- logs.simple("no files match %s", table.concat(environment.files,' '))
- end
-end
-
-logs.extendbanner("MetaPost to PDF Converter 0.51",true)
-
-messages.help = [[
---rawmp raw metapost run
---metafun use metafun instead of plain
---latex force --tex=latex
-]]
-
-if environment.files[1] then
- scripts.mptopdf.convertall()
-else
- if not environment.arguments.help then
- logs.simple("provide MP output file (or pattern)")
- logs.simple("")
- end
- logs.help(messages.help)
-end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-package.lua b/Master/texmf-dist/scripts/context/lua/mtx-package.lua
index b36fc0ed89c..294ef4f285a 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-package.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-package.lua
@@ -8,22 +8,34 @@ if not modules then modules = { } end modules ['mtx-package'] = {
local format, gsub, gmatch = string.format, string.gsub, string.gmatch
+local helpinfo = [[
+--merge merge 'loadmodule' into merge file
+]]
+
+local application = logs.application {
+ name = "mtx-package",
+ banner = "Distribution Related Goodies 0.10",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
scripts = scripts or { }
messages = messages or { }
scripts.package = scripts.package or { }
function scripts.package.merge_luatex_files(name,strip)
- local oldname = resolvers.find_file(name) or ""
+ local oldname = resolvers.findfile(name) or ""
oldname = file.replacesuffix(oldname,"lua")
if oldname == "" then
- logs.simple("missing '%s'",name)
+ report("missing '%s'",name)
else
local newname = file.removesuffix(oldname) .. "-merged.lua"
local data = io.loaddata(oldname) or ""
if data == "" then
- logs.simple("missing '%s'",newname)
+ report("missing '%s'",newname)
else
- logs.simple("loading '%s'",oldname)
+ report("loading '%s'",oldname)
local collected = { }
collected[#collected+1] = format("-- merged file : %s\n",newname)
collected[#collected+1] = format("-- parent file : %s\n",oldname)
@@ -31,11 +43,11 @@ function scripts.package.merge_luatex_files(name,strip)
-- loadmodule can have extra arguments
for lib in gmatch(data,"loadmodule *%([\'\"](.-)[\'\"]") do
if file.basename(lib) ~= file.basename(newname) then
- local fullname = resolvers.find_file(lib) or ""
+ local fullname = resolvers.findfile(lib) or ""
if fullname == "" then
- logs.simple("missing '%s'",lib)
+ report("missing '%s'",lib)
else
- logs.simple("fetching '%s'",fullname)
+ report("fetching '%s'",fullname)
local data = io.loaddata(fullname)
if strip then
data = gsub(data,"%-%-%[%[ldx%-%-.-%-%-%ldx%]%]%-%-[\n\r]*","")
@@ -49,20 +61,14 @@ function scripts.package.merge_luatex_files(name,strip)
end
end
end
- logs.simple("saving '%s'",newname)
+ report("saving '%s'",newname)
io.savedata(newname,table.concat(collected))
end
end
end
-logs.extendbanner("Distribution Related Goodies 0.10",true)
-
-messages.help = [[
---merge merge 'loadmodule' into merge file
-]]
-
if environment.argument("merge") then
scripts.package.merge_luatex_files(environment.files[1] or "")
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-patterns.lua b/Master/texmf-dist/scripts/context/lua/mtx-patterns.lua
index 293016991ff..bbf47513354 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-patterns.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-patterns.lua
@@ -6,312 +6,453 @@ if not modules then modules = { } end modules ['mtx-patterns'] = {
license = "see context related readme files"
}
-local format = string.format
+local format, find, concat, gsub, match, gmatch = string.format, string.find, table.concat, string.gsub, string.match, string.gmatch
+local byte, char = utf.byte, utf.char
+local addsuffix = file.addsuffix
+local lpegmatch, validutf8 = lpeg.match, lpeg.patterns.validutf8
+
+local helpinfo = [[
+--convert generate context language files (mnemonic driven, if not given then all)
+--check check pattern file (or those used by context when no file given)
+--path source path where hyph-foo.tex files are stored
+--destination destination path
+
+examples of usage:
+
+mtxrun --script pattern --check hyph-*.tex
+mtxrun --script pattern --check --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns
+mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/tex --destination=e:/tmp/patterns
+mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/txt --destination=e:/tmp/patterns
+]]
+
+local application = logs.application {
+ name = "mtx-patterns",
+ banner = "ConTeXt Pattern File Management 0.20",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
scripts = scripts or { }
scripts.patterns = scripts.patterns or { }
-scripts.patterns.list = {
- { "??", "hyph-ar.tex", "arabic" },
- { "bg", "hyph-bg.tex", "bulgarian" },
- { "ca", "hyph-ca.tex", "catalan" },
- { "??", "hyph-cop.tex", "coptic" },
- { "cs", "hyph-cs.tex", "czech" },
- { "cy", "hyph-cy.tex", "welsh" },
- { "da", "hyph-da.tex", "danish" },
- { "deo", "hyph-de-1901.tex", "german, old spelling" },
- { "de", "hyph-de-1996.tex", "german, new spelling" },
---~ { "??", "hyph-el-monoton.tex", "" },
---~ { "??", "hyph-el-polyton.tex", "" },
- { "agr", "hyph-grc", "ancient greek" },
---~ { "???", "hyph-x-ibycus", "ancient greek in ibycus encoding" },
---~ { "gr", "", "" },
- { "eo", "hyph-eo.tex", "esperanto" },
- { "gb", "hyph-en-gb.tex", "british english" },
- { "us", "hyph-en-us.tex", "american english" },
- { "es", "hyph-es.tex", "spanish" },
- { "et", "hyph-et.tex", "estonian" },
- { "eu", "hyph-eu.tex", "basque" }, -- ba is Bashkir!
- { "fa", "hyph-fa.tex", "farsi" },
- { "fi", "hyph-fi.tex", "finnish" },
- { "fr", "hyph-fr.tex", "french" },
--- { "??", "hyph-ga.tex", "" },
--- { "??", "hyph-gl.tex", "" },
--- { "??", "hyph-grc.tex", "" },
- { "hr", "hyph-hr.tex", "croatian" },
- { "??", "hyph-hsb.tex", "upper sorbian" },
- { "hu", "hyph-hu.tex", "hungarian" },
- { "??", "hyph-ia.tex", "interlingua" },
- { "??", "hyph-id.tex", "indonesian" },
- { "is", "hyph-is.tex", "icelandic" },
- { "it", "hyph-it.tex", "italian" },
- { "la", "hyph-la.tex", "latin" },
- { "lt", "hyph-lt.tex", "lithuanian" },
- { "mn", "hyph-mn-cyrl.tex", "mongolian, cyrillic script" },
- { "nb", "hyph-nb.tex", "norwegian bokmål" },
- { "nl", "hyph-nl.tex", "dutch" },
- { "nn", "hyph-nn.tex", "norwegian nynorsk" },
- { "pl", "hyph-pl.tex", "polish" },
- { "pt", "hyph-pt.tex", "portuguese" },
- { "ro", "hyph-ro.tex", "romanian" },
- { "ru", "hyph-ru.tex", "russian" },
- { "sk", "hyph-sk.tex", "slovak" },
- { "sl", "hyph-sl.tex", "slovenian" },
- { "sr", "hyph-sr-cyrl.tex", "serbian" },
- { "sv", "hyph-sv.tex", "swedish" },
- { "tr", "hyph-tr.tex", "turkish" },
- { "tk", "hyph-tk.tex", "turkman" },
- { "uk", "hyph-uk.tex", "ukrainian" },
- { "zh", "hyph-zh-latn.tex", "zh-latn, chinese Pinyin" },
+local permitted_characters = table.tohash {
+ 0x0009, -- tab
+ 0x0027, -- apostrofe
+ 0x02BC, -- modifier apostrofe (used in greek)
+ 0x002D, -- hyphen
+ 0x200C, -- zwnj
+ 0x2019, -- quote right
+ 0x1FBD, -- greek, but no letter: symbol modifier
+ 0x1FBF, -- greek, but no letter: symbol modifier
}
+local ignored_ancient_greek = table.tohash {
+ 0x1FD3, -- greekiotadialytikatonos (also 0x0390)
+ 0x1FE3, -- greekupsilondialytikatonos (also 0x03B0)
+ 0x1FBD, -- greek, but no letter: symbol modifier
+ 0x1FBF, -- greek, but no letter: symbol modifier
+ 0x03F2, -- greeksigmalunate
+ 0x02BC, -- modifier apostrofe)
+}
--- stripped down from lpeg example:
+local ignored_french = table.tohash {
+ 0x02BC, -- modifier apostrofe
+}
-local utf = unicode.utf8
+local replaced_whatever = {
+ [char(0x2019)] = char(0x0027)
+}
-local cont = lpeg.R("\128\191") -- continuation byte
+scripts.patterns.list = {
+ { "af", "hyph-af", "afrikaans" },
+ -- { "ar", "hyph-ar", "arabic" },
+ -- { "as", "hyph-as", "assamese" },
+ { "bg", "hyph-bg", "bulgarian" },
+ -- { "bn", "hyph-bn", "bengali" },
+ { "ca", "hyph-ca", "catalan" },
+ -- { "??", "hyph-cop", "coptic" },
+ { "cs", "hyph-cs", "czech" },
+ { "cy", "hyph-cy", "welsh" },
+ { "da", "hyph-da", "danish" },
+ { "deo", "hyph-de-1901", "german, old spelling" },
+ { "de", "hyph-de-1996", "german, new spelling" },
+ -- { "??", "hyph-de-ch-1901", "swiss german" },
+ -- { "??", "hyph-el-monoton", "greek" },
+ -- { "gr", "hyph-el-polyton", "greek" },
+ { "agr", "hyph-grc", "ancient greek", ignored_ancient_greek },
+ { "gb", "hyph-en-gb", "british english" },
+ { "us", "hyph-en-us", "american english" },
+ -- { "eo", "hyph-eo", "esperanto" },
+ { "es", "hyph-es", "spanish" },
+ { "et", "hyph-et", "estonian" },
+ { "eu", "hyph-eu", "basque" },
+ -- { "fa", "hyph-fa", "farsi" },
+ { "fi", "hyph-fi", "finnish" },
+ { "fr", "hyph-fr", "french", ignored_french },
+ -- { "??", "hyph-ga", "irish" },
+ -- { "??", "hyph-gl", "galician" },
+ -- { "gu", "hyph-gu", "gujarati" },
+ -- { "hi", "hyph-hi", "hindi" },
+ { "hr", "hyph-hr", "croatian" },
+ -- { "??", "hyph-hsb", "upper sorbian" },
+ { "hu", "hyph-hu", "hungarian" },
+ -- { "hy", "hyph-hy", "armenian" },
+ -- { "??", "hyph-ia", "interlingua" },
+ -- { "??", "hyph-id", "indonesian" },
+ { "is", "hyph-is", "icelandic" },
+ { "it", "hyph-it", "italian" },
+ -- { "??", "hyph-kmr", "kurmanji" },
+ -- { "kn", "hyph-kn", "kannada" },
+ { "la", "hyph-la", "latin" },
+ -- { "lo", "hyph-lo", "lao" },
+ { "lt", "hyph-lt", "lithuanian" },
+ { "lv", "hyph-lv", "latvian" },
+ -- { "ml", "hyph-ml", "..." },
+ { "mn", "hyph-mn-cyrl", "mongolian, cyrillic script" },
+ -- { "mr", "hyph-mr", "..." },
+ { "nb", "hyph-nb", "norwegian bokmål" },
+ { "nl", "hyph-nl", "dutch" },
+ { "nn", "hyph-nn", "norwegian nynorsk" },
+ -- { "or", "hyph-or", "oriya" },
+ -- { "pa", "hyph-pa", "panjabi" },
+ -- { "", "hyph-", "" },
+ { "pl", "hyph-pl", "polish" },
+ { "pt", "hyph-pt", "portuguese" },
+ { "ro", "hyph-ro", "romanian" },
+ { "ru", "hyph-ru", "russian" },
+ -- { "sa", "hyph-sa", "sanskrit" },
+ { "sk", "hyph-sk", "slovak" },
+ { "sl", "hyph-sl", "slovenian" },
+ { "sr", "hyph-sr-cyrl", "serbian" },
+ -- { "sr", "hyph-sr-latn", "serbian" },
+ { "sv", "hyph-sv", "swedish" },
+ -- { "ta", "hyph-ta", "tamil" },
+ -- { "te", "hyph-te", "telugu" },
+ { "tk", "hyph-tk", "turkmen" },
+ { "tr", "hyph-tr", "turkish" },
+ { "uk", "hyph-uk", "ukrainian" },
+ { "zh", "hyph-zh-latn", "zh-latn, chinese pinyin" },
+}
-local utf8 = lpeg.R("\0\127")
- + lpeg.R("\194\223") * cont
- + lpeg.R("\224\239") * cont * cont
- + lpeg.R("\240\244") * cont * cont * cont
+-- stripped down from lpeg example:
-local validutf = (utf8^0/function() return true end) * (lpeg.P(-1)/function() return false end)
+local utf = unicode.utf8
function utf.check(str)
- return lpeg.match(validutf,str)
+ return lpeg.match(lpeg.patterns.validutf8,str)
end
-local permitted_commands = table.tohash {
- "message",
- "endinput"
-}
+-- *.tex
+-- *.hyp.txt *.pat.txt *.lic.txt *.chr.txt
-local permitted_characters = table.tohash {
- 0x0009, -- tab
- 0x0027, -- apostrofe
- 0x002D, -- hyphen
- 0x200C, --
-}
-
-function scripts.patterns.load(path,name,mnemonic,fullcheck)
+function scripts.patterns.load(path,name,mnemonic,ignored)
local fullname = file.join(path,name)
- local data = io.loaddata(fullname) or ""
- local byte, char = utf.byte, utf.char
- if data ~= "" then
- data = data:gsub("([\n\r])\\input ([^ \n\r]+)", function(previous,subname)
- local subname = file.addsuffix(subname,"tex")
- local subfull = file.join(file.dirname(fullname),subname)
- local subdata = io.loaddata(subfull) or ""
- if subdata == "" then
- if mnemonic then
- logs.simple("no subfile %s for language %s",subname,mnemonic)
- else
- logs.simple("no subfile %s",name)
+ local texfile = addsuffix(fullname,"tex")
+ local hypfile = addsuffix(fullname,"hyp.txt")
+ local patfile = addsuffix(fullname,"pat.txt")
+ local licfile = addsuffix(fullname,"lic.txt")
+ -- local chrfile = addsuffix(fullname,"chr.txt")
+ local okay = true
+ local hyphenations, patterns, comment, stripset = "", "", "", ""
+ local splitpatternsnew, splithyphenationsnew = { }, { }
+ local splitpatternsold, splithyphenationsold = { }, { }
+ local usedpatterncharacters, usedhyphenationcharacters = { }, { }
+ if lfs.isfile(patfile) then
+ report("using txt files %s.[hyp|pat|lic].txt",name)
+ comment, patterns, hyphenations = io.loaddata(licfile) or "", io.loaddata(patfile) or "", io.loaddata(hypfile) or ""
+ hypfile, patfile, licfile = hypfile, patfile, licfile
+ elseif lfs.isfile(texfile) then
+ report("using tex file %s.txt",name)
+ local data = io.loaddata(texfile) or ""
+ if data ~= "" then
+ data = gsub(data,"([\n\r])\\input ([^ \n\r]+)", function(previous,subname)
+ local subname = addsuffix(subname,"tex")
+ local subfull = file.join(file.dirname(texfile),subname)
+ local subdata = io.loaddata(subfull) or ""
+ if subdata == "" then
+ report("no subfile %s",subname)
end
- end
- return previous .. subdata
- end)
- local comment = data:match("^(.-)[\n\r]\\patterns") or ""
- local n, okay = 0, true
- local cd = characters.data
- for line in data:gmatch("[^ \n\r]+") do
- local ok = utf.check(line)
- n = n + 1
- if not ok then
- okay = false
- line = line:gsub("%%","%%%%")
- if fullcheck then
- if mnemonic then
- logs.simple("invalid utf in language %s, file %s, line %s: %s",mnemonic,name,n,line)
- else
- logs.simple("invalid utf in file %s, line %s: %s",name,n,line)
- end
- else
- if mnemonic then
- logs.simple("file %s for %s contains invalid utf",name,mnemonic)
- else
- logs.simple("file %s contains invalid utf",name)
+ return previous .. subdata
+ end)
+ data = gsub(data,"%%.-[\n\r]","")
+ data = gsub(data," *[\n\r]+","\n")
+ patterns = match(data,"\\patterns[%s]*{[%s]*(.-)[%s]*}") or ""
+ hyphenations = match(data,"\\hyphenation[%s]*{[%s]*(.-)[%s]*}") or ""
+ comment = match(data,"^(.-)[\n\r]\\patterns") or ""
+ else
+ okay = false
+ end
+ else
+ okay = false
+ end
+ if okay then
+ -- split into lines
+ local how = lpeg.patterns.whitespace^1
+ splitpatternsnew = lpeg.split(how,patterns)
+ splithyphenationsnew = lpeg.split(how,hyphenations)
+ end
+ if okay then
+ -- remove comments
+ local function check(data,splitdata,name)
+ if find(data,"%%") then
+ for i=1,#splitdata do
+ local line = splitdata[i]
+ if find(line,"%%") then
+ splitdata[i] = gsub(line,"%%.*$","")
+ report("removing comment: %s",line)
end
- break
end
end
end
- local c, h = { }, { }
- for line in data:gmatch("[^\n\r]+") do
- local txt, cmt = line:match("^(.-)%%(.*)$")
- if not txt then
- txt, cmt = line, ""
- end
- for s in txt:gmatch("\\([a-zA-Z]+)") do
- h[s] = (h[s] or 0) + 1
- end
- for s in cmt:gmatch("\\([a-zA-Z]+)") do
- c[s] = (c[s] or 0) + 1
- end
- end
- h.patterns = nil
- h.hyphenation = nil
- for k, v in next, h do
- if not permitted_commands[k] then okay = false end
- if mnemonic then
- logs.simple("command \\%s found in language %s, file %s, n=%s",k,mnemonic,name,v)
- else
- logs.simple("command \\%s found in file %s, n=%s",k,name,v)
+ check(patterns,splitpatternsnew,patfile)
+ check(hyphenations,splithyphenationsnew,hypfile)
+ end
+ if okay then
+ -- remove lines with commands
+ local function check(data,splitdata,name)
+ if find(data,"\\") then
+ for i=1,#splitdata do
+ local line = splitdata[i]
+ if find(line,"\\") then
+ splitdata[i] = ""
+ report("removing line with command: %s",line)
+ end
+ end
end
end
- if not environment.argument("fast") then
- for k, v in next, c do
- if mnemonic then
- logs.simple("command \\%s found in comment of language %s, file %s, n=%s",k,mnemonic,name,v)
- else
- logs.simple("command \\%s found in comment of file %s, n=%s",k,name,v)
+ check(patterns,splitpatternsnew,patfile)
+ check(hyphenations,splithyphenationsnew,hypfile)
+ end
+ if okay then
+ -- check for valid utf
+ local function check(data,splitdata,name)
+ for i=1,#splitdata do
+ local line = splitdata[i]
+ local ok = lpegmatch(validutf8,line)
+ if not ok then
+ splitdata[i] = ""
+ report("removing line with invalid utf: %s",line)
end
end
+ -- check for commands being used in comments
end
- data = data:gsub("%%.-[\n\r]","")
- data = data:gsub(" *[\n\r]+","\n")
- local patterns = data:match("\\patterns[%s]*{[%s]*(.-)[%s]*}") or ""
- local hyphenations = data:match("\\hyphenation[%s]*{[%s]*(.-)[%s]*}") or ""
- patterns = patterns:gsub(" +","\n")
- hyphenations = hyphenations:gsub(" +","\n")
- local p, h = { }, { }
- local pats, hyps = { } , { }
- local pused, hused = { } , { }
- local period = byte(".")
- for line in patterns:gmatch("[^ \n\r]+") do
- local ok = true
- for b in line:utfvalues() do
- if b == period then
- -- ok
- else
- local ct = cd[b].category
- if ct == "lu" or ct == "ll" then
- pused[char(b)] = true
- elseif ct == "nd" then
- -- ok
+ check(patterns,splitpatternsnew,patfile)
+ check(hyphenations,splithyphenationsnew,hypfile)
+ end
+ if okay then
+ -- remove funny lines
+ local cd = characters.data
+ local stripped = { }
+ local function check(splitdata,special,name)
+ local used = { }
+ for i=1,#splitdata do
+ local line = splitdata[i]
+ for b in line:utfvalues() do -- could be an lpeg
+ if b == special then
+ -- not registered
+ elseif permitted_characters[b] then
+ used[char(b)] = true
else
- p[b] = (p[b] or 0) + 1
- ok = false
+ local cdb = cd[b]
+ if not cdb then
+ report("no entry in chardata for character %s (0x%04X)",char(b),b)
+ else
+ local ct = cd[b].category
+ if ct == "lu" or ct == "ll" then
+ used[char(b)] = true
+ elseif ct == "nd" then
+ -- number
+ else
+ report("removing line with suspected utf character %s (0x%04X), category %s: %s",char(b),b,ct,line)
+ splitdata[i] = ""
+ break
+ end
+ end
end
end
end
- if ok then
- pats[#pats+1] = line
- end
+ return used
end
- local hyphen = byte("-")
- for line in hyphenations:gmatch("[^ \n\r]+") do
- local ok = true
- for b in line:utfvalues() do
- if b == hyphen then
- -- ok
- else
- local ct = cd[b].category
- if ct == "lu" or ct == "ll" then
- hused[char(b)] = true
+ usedpatterncharacters = check(splitpatternsnew,byte("."))
+ usedhyphenationcharacters = check(splithyphenationsnew,byte("-"))
+ for k, v in next, stripped do
+ report("entries that contain character %s (0x%04X) have been omitted",char(k),k)
+ end
+ end
+ if okay then
+ local function stripped(what,ignored)
+ -- ignored (per language)
+ local p = nil
+ if ignored then
+ for k, v in next, ignored do
+ if p then
+ p = p + lpeg.P(char(k))
else
- h[b] = (h[b] or 0) + 1
- ok = false
+ p = lpeg.P(char(k))
end
end
+ p = lpeg.P{ p + 1 * lpeg.V(1) } -- anywhere
end
- if ok then
- hyps[#hyps+1] = line
- end
- end
- local stripped = { }
- for k, v in next, p do
- if mnemonic then
- logs.simple("invalid character %s (0x%04X) in patterns of language %s, file %s, n=%s",char(k),k,mnemonic,name,v)
- else
- logs.simple("invalid character %s (0x%04X) in patterns of file %s, n=%s",char(k),k,name,v)
+ -- replaced (all languages)
+ local r = nil
+ for k, v in next, replaced_whatever do
+ if r then
+ r = r + lpeg.P(k)/v
+ else
+ r = lpeg.P(k)/v
+ end
end
- if not permitted_characters[k] then
- okay = false
- else
- stripped[k] = true
+ r = lpeg.Cs((r + 1)^0)
+ local result = { }
+ for i=1,#what do
+ local line = what[i]
+ if p and lpegmatch(p,line) then
+ report("discarding conflicting pattern: %s",line)
+ else -- we can speed this up by testing for replacements in the string
+ local l = lpegmatch(r,line)
+ if l ~= line then
+ report("sanitizing pattern: %s -> %s (for old patterns)",line,l)
+ end
+ result[#result+1] = l
+ end
end
+ return result
end
- for k, v in next, h do
- if mnemonic then
- logs.simple("invalid character %s (0x%04X) in exceptions of language %s, file %s, n=%s",char(k),k,mnemonic,name,v)
- else
- logs.simple("invalid character %s (0x%04X) in exceptions of file %s, n=%s",char(k),k,name,v)
- end
- if not permitted_characters[k] then
- okay = false
- else
- stripped[k] = true
+
+ splitpatternsold = stripped(splitpatternsnew,ignored)
+ splithyphenationsold = stripped(splithyphenationsnew,ignored)
+
+ end
+ if okay then
+ -- discarding duplicates
+ local function check(data,splitdata,name)
+ local used, collected = { }, { }
+ for i=1,#splitdata do
+ local line = splitdata[i]
+ if line == "" then
+ -- discard
+ elseif used[line] then
+ -- discard
+ repo("discarding duplicate pattern: %s",line)
+ else
+ used[line] = true
+ collected[#collected+1] = line
+ end
end
+ return collected
end
- local stripset = ""
- for k, v in next, stripped do
- logs.simple("entries that contain character %s will be omitted",char(k))
- stripset = stripset .. "%" .. char(k)
- end
- return okay, pats, hyps, comment, stripset, pused, hused
- else
- if mnemonic then
- logs.simple("no file %s for language %s",fullname,mnemonic)
- else
- logs.simple("no file %s",fullname)
- end
- return false, { }, { }, "", "", { }, { }
+ splitpatternsnew = check(patterns,splitpatternsnew,patfile)
+ splithyphenationsnew = check(hyphenations,splithyphenationsnew,hypfile)
+ splitpatternsold = check(patterns,splitpatternsold,patfile)
+ splithyphenationsold = check(hyphenations,splithyphenationsold,hypfile)
+ end
+ if not okay then
+ report("no valid file %s.*",name)
end
+ return okay, splitpatternsnew, splithyphenationsnew, splitpatternsold, splithyphenationsold, comment, stripset, usedpatterncharacters, usedhyphenationcharacters
end
-function scripts.patterns.save(destination,mnemonic,patterns,hyphenations,comment,stripped,pused,hused)
- local nofpatterns = #patterns
- local nofhyphenations = #hyphenations
- local pu = table.concat(table.sortedkeys(pused), " ")
- local hu = table.concat(table.sortedkeys(hused), " ")
- logs.simple("language %s has %s patterns and %s exceptions",mnemonic,nofpatterns,nofhyphenations)
+function scripts.patterns.save(destination,mnemonic,name,patternsnew,hyphenationsnew,patternsold,hyphenationsold,comment,stripped,pused,hused,ignored)
+ local nofpatternsnew, nofhyphenationsnew = #patternsnew, #hyphenationsnew
+ local nofpatternsold, nofhyphenationsold = #patternsold, #hyphenationsold
+ report("language %s has %s old and %s new patterns and %s old and %s new exceptions",mnemonic,nofpatternsold,nofpatternsnew,nofhyphenationsold,nofhyphenationsnew)
if mnemonic ~= "??" then
+ local pu = concat(table.sortedkeys(pused), " ")
+ local hu = concat(table.sortedkeys(hused), " ")
+
local rmefile = file.join(destination,"lang-"..mnemonic..".rme")
local patfile = file.join(destination,"lang-"..mnemonic..".pat")
local hypfile = file.join(destination,"lang-"..mnemonic..".hyp")
+ local luafile = file.join(destination,"lang-"..mnemonic..".lua") -- suffix might change to llg
+
local topline = "% generated by mtxrun --script pattern --convert"
local banner = "% for comment and copyright, see " .. rmefile
- logs.simple("saving language data for %s",mnemonic)
+ report("saving language data for %s",mnemonic)
if not comment or comment == "" then comment = "% no comment" end
if not type(destination) == "string" then destination = "." end
+
+ local lines = string.splitlines(comment)
+ for i=1,#lines do
+ if not find(lines[i],"^%%") then
+ lines[i] = "% " .. lines[i]
+ end
+ end
+
+ local metadata = {
+ -- texcomment = comment,
+ texcomment = concat(lines,"\n"),
+ source = name,
+ mnemonic = mnemonic,
+ }
+
+ local patterndata, hyphenationdata
+ if nofpatternsnew > 0 then
+ patterndata = {
+ n = nofpatternsnew,
+ data = concat(patternsnew," ") or nil,
+ characters = concat(table.sortedkeys(pused),""),
+ minhyphenmin = 1, -- determined by pattern author
+ minhyphenmax = 1, -- determined by pattern author
+ }
+ else
+ patterndata = {
+ n = 0,
+ }
+ end
+ if nofhyphenationsnew > 0 then
+ hyphenationdata = {
+ n = nofhyphenationsnew,
+ data = concat(hyphenationsnew," "),
+ characters = concat(table.sortedkeys(hused),""),
+ }
+ else
+ hyphenationdata = {
+ n = 0,
+ }
+ end
+ local data = {
+ -- a prelude to language goodies, like we have font goodies and in
+ -- mkiv we can use this file directly
+ version = "1.001",
+ comment = topline,
+ metadata = metadata,
+ patterns = patterndata,
+ exceptions = hyphenationdata,
+ }
+
os.remove(rmefile)
os.remove(patfile)
os.remove(hypfile)
+ os.remove(luafile)
+
io.savedata(rmefile,format("%s\n\n%s",topline,comment))
- io.savedata(patfile,format("%s\n\n%s\n\n%% used: %s\n\n\\patterns{\n%s}",topline,banner,pu,table.concat(patterns,"\n")))
- io.savedata(hypfile,format("%s\n\n%s\n\n%% used: %s\n\n\\hyphenation{\n%s}",topline,banner,hu,table.concat(hyphenations,"\n")))
+ io.savedata(patfile,format("%s\n\n%s\n\n%% used: %s\n\n\\patterns{\n%s}",topline,banner,pu,concat(patternsold,"\n")))
+ io.savedata(hypfile,format("%s\n\n%s\n\n%% used: %s\n\n\\hyphenation{\n%s}",topline,banner,hu,concat(hyphenationsold,"\n")))
+ io.savedata(luafile,table.serialize(data,true))
end
end
function scripts.patterns.prepare()
- dofile(resolvers.find_file("char-def.lua"))
+ dofile(resolvers.findfile("char-def.lua"))
end
function scripts.patterns.check()
local path = environment.argument("path") or "."
- local found = false
local files = environment.files
+ local only = false
if #files > 0 then
- for i=1,#files do
- local name = files[i]
- logs.simple("checking language file %s", name)
- local okay = scripts.patterns.load(path,name,nil,not environment.argument("fast"))
- if #environment.files > 1 then
- logs.simple("")
- end
- end
- else
- for k, v in next, scripts.patterns.list do
- local mnemonic, name = v[1], v[2]
- logs.simple("checking language %s, file %s", mnemonic, name)
- local okay = scripts.patterns.load(path,name,mnemonic,not environment.argument("fast"))
+ only = table.tohash(files)
+ end
+ for k, v in next, scripts.patterns.list do
+ local mnemonic, name, ignored = v[1], v[2], v[4]
+ if not only or only[mnemonic] then
+ report("checking language %s, file %s", mnemonic, name)
+ local okay = scripts.patterns.load(path,name,mnemonic,ignored)
if not okay then
- logs.simple("there are errors that need to be fixed")
+ report("there are errors that need to be fixed")
end
- logs.simple("")
+ report()
end
end
end
@@ -319,36 +460,34 @@ end
function scripts.patterns.convert()
local path = environment.argument("path") or "."
if path == "" then
- logs.simple("provide sourcepath using --path ")
+ report("provide sourcepath using --path ")
else
local destination = environment.argument("destination") or "."
if path == destination then
- logs.simple("source path and destination path should differ (use --path and/or --destination)")
+ resport("source path and destination path should differ (use --path and/or --destination)")
else
+ local files = environment.files
+ local only = false
+ if #files > 0 then
+ only = table.tohash(files)
+ end
for k, v in next, scripts.patterns.list do
- local mnemonic, name = v[1], v[2]
- logs.simple("converting language %s, file %s", mnemonic, name)
- local okay, patterns, hyphenations, comment, stripped, pused, hused = scripts.patterns.load(path,name,false)
- if okay then
- scripts.patterns.save(destination,mnemonic,patterns,hyphenations,comment,stripped,pused,hused)
- else
- logs.simple("convertion aborted due to error(s)")
+ local mnemonic, name, ignored = v[1], v[2], v[4]
+ if not only or only[mnemonic] then
+ report("converting language %s, file %s", mnemonic, name)
+ local okay, patternsnew, hyphenationsnew, patternsold, hyphenationsold, comment, stripped, pused, hused = scripts.patterns.load(path,name,mnemonic,ignored)
+ if okay then
+ scripts.patterns.save(destination,mnemonic,name,patternsnew,hyphenationsnew,patternsold,hyphenationsold,comment,stripped,pused,hused,ignored)
+ else
+ report("convertion aborted due to error(s)")
+ end
+ report()
end
- logs.simple("")
end
end
end
end
-logs.extendbanner("ConTeXt Pattern File Management 0.20",true)
-
-messages.help = [[
---convert generate context language files (mnemonic driven, if not given then all)
---check check pattern file (or those used by context when no file given)
-
---fast only report filenames, no lines
-]]
-
if environment.argument("check") then
scripts.patterns.prepare()
scripts.patterns.check()
@@ -356,11 +495,10 @@ elseif environment.argument("convert") then
scripts.patterns.prepare()
scripts.patterns.convert()
else
- logs.help(messages.help)
+ application.help()
end
-- mtxrun --script pattern --check hyph-*.tex
-- mtxrun --script pattern --check --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns
--- mtxrun --script pattern --check --fast --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns
--- mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns --destination=e:/tmp/patterns
--- mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/branches/luatex/hyph-utf8/tex/generic/hyph-utf8/patterns/tex --destination=e:/tmp/patterns
+-- mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/tex --destination=e:/tmp/patterns
+-- mtxrun --script pattern --convert --path=c:/data/develop/svn-hyphen/trunk/hyph-utf8/tex/generic/hyph-utf8/patterns/txt --destination=e:/tmp/patterns
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-profile.lua b/Master/texmf-dist/scripts/context/lua/mtx-profile.lua
index 11d48d0399b..74e1d153845 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-profile.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-profile.lua
@@ -11,6 +11,19 @@ if not modules then modules = { } end modules ['mtx-profile'] = {
local match, format, find = string.match, string.format, string.find
+local helpinfo = [[
+--analyze analyze lua calls
+--trace analyze tex calls
+]]
+
+local application = logs.application {
+ name = "mtx-cache",
+ banner = "ConTeXt MkIV LuaTeX Profiler 1.00",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
scripts = scripts or { }
scripts.profiler = scripts.profiler or { }
@@ -23,7 +36,7 @@ local calltemplate = "%9i %s"
local totaltemplate = "%i internal calls, %i function calls taking %3.4f seconds"
local thresholdtemplate = "thresholds: %i internal calls, %i function calls, %i seconds"
-function scripts.profiler.analyse(filename)
+function scripts.profiler.analyze(filename)
local f = io.open(filename)
if f then
local times, counts, calls = { }, { }, { }
@@ -54,7 +67,7 @@ function scripts.profiler.analyse(filename)
f:close()
print("")
local loaded = { }
- local sortedtable.sortedkeys(times)
+ sortedtable.sortedkeys(times)
for i=1,#sorted do
local filename = sorted[i]
local functions = times[filename]
@@ -101,7 +114,7 @@ function scripts.profiler.analyse(filename)
end
end
-function scripts.profiler.x_analyse(filename)
+function scripts.profiler.x_analyze(filename)
local f = io.open(filename)
local calls = { }
local lines = 0
@@ -151,20 +164,13 @@ local criterium = 100
end
end
---~ scripts.profiler.analyse("t:/manuals/mk/mk-fonts-profile.lua")
---~ scripts.profiler.analyse("t:/manuals/mk/mk-introduction-profile.lua")
-
-logs.extendbanner("ConTeXt MkIV LuaTeX Profiler 1.00",true)
-
-messages.help = [[
---analyse analyse lua calls
---trace analyse tex calls
-]]
+--~ scripts.profiler.analyze("t:/manuals/mk/mk-fonts-profile.lua")
+--~ scripts.profiler.analyze("t:/manuals/mk/mk-introduction-profile.lua")
-if environment.argument("analyse") then
- scripts.profiler.analyse(environment.files[1] or "luatex-profile.log")
+if environment.argument("analyze") then
+ scripts.profiler.analyze(environment.files[1] or "luatex-profile.log")
elseif environment.argument("trace") then
- scripts.profiler.analyse(environment.files[1] or "temp.log")
+ scripts.profiler.analyze(environment.files[1] or "temp.log")
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-scite.lua b/Master/texmf-dist/scripts/context/lua/mtx-scite.lua
index d5f0a5344e5..0ac09b01702 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-scite.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-scite.lua
@@ -9,6 +9,19 @@ if not modules then modules = { } end modules ['mtx-scite'] = {
-- todo: append to global properties else order of loading problem
-- linux problem ... files are under root protection so we need --install
+local helpinfo = [[
+--start [--verbose] start scite
+--test report what will happen
+]]
+
+local application = logs.application {
+ name = "mtx-scite",
+ banner = "Scite Startup Script 1.00",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
scripts = scripts or { }
scripts.scite = scripts.scite or { }
@@ -30,11 +43,11 @@ function scripts.scite.start(indeed)
local binpaths = file.split_path(os.getenv("PATH")) or file.split_path(os.getenv("path"))
for i=1,#scitesignals do
local scitesignal = scitesignals[i]
- local scitepath = resolvers.find_file(scitesignal,"other text files") or ""
+ local scitepath = resolvers.findfile(scitesignal,"other text files") or ""
if scitepath ~= "" then
scitepath = file.dirname(scitepath) -- data
if scitepath == "" then
- scitepath = resolvers.clean_path(lfs.currentdir())
+ scitepath = resolvers.cleanpath(lfs.currentdir())
else
usedsignal, datapath = scitesignal, scitepath
break
@@ -42,11 +55,11 @@ function scripts.scite.start(indeed)
end
end
if not datapath or datapath == "" then
- logs.simple("invalid datapath, maybe you need to regenerate the file database")
+ report("invalid datapath, maybe you need to regenerate the file database")
return false
end
if not binpaths or #binpaths == 0 then
- logs.simple("invalid binpath")
+ report("invalid binpath")
return false
end
for i=1,#binpaths do
@@ -57,15 +70,15 @@ function scripts.scite.start(indeed)
end
end
if not fullname then
- logs.simple("unable to locate %s",workname)
+ report("unable to locate %s",workname)
return false
end
local properties = dir.glob(file.join(datapath,"*.properties"))
local luafiles = dir.glob(file.join(datapath,"*.lua"))
- local extrafont = resolvers.find_file(screenfont,"truetype font") or ""
+ local extrafont = resolvers.findfile(screenfont,"truetype font") or ""
local pragmafound = dir.glob(file.join(datapath,"pragma.properties"))
if userpath == "" then
- logs.simple("unable to figure out userpath")
+ report("unable to figure out userpath")
return false
end
local verbose = environment.argument("verbose")
@@ -120,47 +133,40 @@ function scripts.scite.start(indeed)
end
end
if not indeed or verbose then
- logs.simple("used signal: %s", usedsignal)
- logs.simple("data path : %s", datapath)
- logs.simple("full name : %s", fullname)
- logs.simple("user path : %s", userpath)
- logs.simple("extra font : %s", extrafont)
+ report("used signal: %s", usedsignal)
+ report("data path : %s", datapath)
+ report("full name : %s", fullname)
+ report("user path : %s", userpath)
+ report("extra font : %s", extrafont)
end
if #logdata > 0 then
- logs.simple("")
+ report("")
for k=1,#logdata do
local v = logdata[k]
- logs.simple(v[1],v[2])
+ report(v[1],v[2])
end
end
if indeed then
if #tobecopied > 0 then
- logs.simple("warning : copying updated files")
+ report("warning : copying updated files")
for i=1,#tobecopied do
local what = tobecopied[i]
- logs.simple("copying : '%s' => '%s'",what[1],what[2])
+ report("copying : '%s' => '%s'",what[1],what[2])
file.copy(what[1],what[2])
end
end
if propfiledone then
- logs.simple("saving : '%s'",userpropfile)
+ report("saving : '%s'",userpropfile)
io.savedata(fullpropfile,userpropdata)
end
os.launch(fullname)
end
end
-logs.extendbanner("Scite Startup Script 1.00",true)
-
-messages.help = [[
---start [--verbose] start scite
---test report what will happen
-]]
-
if environment.argument("start") then
scripts.scite.start(true)
elseif environment.argument("test") then
scripts.scite.start()
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-server-ctx-fonttest.lua b/Master/texmf-dist/scripts/context/lua/mtx-server-ctx-fonttest.lua
index b2a993bf836..b30cf017525 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-server-ctx-fonttest.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-server-ctx-fonttest.lua
@@ -6,18 +6,20 @@ if not modules then modules = { } end modules ['mtx-server-ctx-fonttest'] = {
license = "see context related readme files"
}
---~ dofile(resolvers.find_file("l-aux.lua","tex"))
-dofile(resolvers.find_file("trac-lmx.lua","tex"))
-dofile(resolvers.find_file("font-ott.lua","tex"))
-dofile(resolvers.find_file("font-syn.lua","tex"))
-dofile(resolvers.find_file("font-mis.lua","tex"))
-dofile(resolvers.find_file("font-otp.lua","tex"))
+--~ dofile(resolvers.findfile("l-aux.lua","tex"))
+dofile(resolvers.findfile("trac-lmx.lua","tex"))
+dofile(resolvers.findfile("font-ott.lua","tex"))
+dofile(resolvers.findfile("font-syn.lua","tex"))
+dofile(resolvers.findfile("font-mis.lua","tex"))
+--~ dofile(resolvers.findfile("font-otp.lua","tex"))
local format, gsub, concat, match, find = string.format, string.gsub, table.concat, string.match, string.find
+local report = logs.reporter("ctx-fonttest")
+
local sample_line = "This is a sample line!"
local tempname = "mtx-server-ctx-fonttest-temp"
-local temppath = caches.setpath("temp","mtx-server-ctx-fonttest")
+local temppath = caches.setfirstwritablefile("temp","mtx-server-ctx-fonttest")
local basename = "mtx-server-ctx-fonttest-data.lua"
local basepath = temppath
@@ -33,7 +35,7 @@ local process_templates = { }
process_templates.default = [[
\starttext
\setcharactermirroring[1]
- \definefontfeature[sample][analyse=yes,%s]
+ \definefontfeature[sample][analyze=yes,%s]
\definedfont[name:%s*sample]
\startTEXpage[offset=3pt]
\detokenize{%s}
@@ -150,20 +152,20 @@ local cache = { }
local function showfeatures(f)
if f then
- logs.simple("processing font '%s'",f)
+ report("processing font '%s'",f)
local features = cache[f]
if features == nil then
- features = fonts.get_features(resolvers.find_file(f))
+ features = fonts.helpers.getfeatures(resolvers.findfile(f))
if not features then
- logs.simple("building cache for '%s'",f)
+ report("building cache for '%s'",f)
io.savedata(file.join(temppath,file.addsuffix(tempname,"tex")),format(process_templates.cache,f,f))
os.execute(format("mtxrun --path=%s --script context --once --batchmode %s",temppath,tempname))
- features = fonts.get_features(f)
+ features = fonts.helpers.getfeatures(f)
end
cache[f] = features or false
- logs.simple("caching info of '%s'",f)
+ report("caching info of '%s'",f)
else
- logs.simple("using cached info of '%s'",f)
+ report("using cached info of '%s'",f)
end
if features then
local scr, lan, fea, rev = { }, { }, { }, { }
@@ -294,7 +296,7 @@ local function get_specification(name)
end
local function edit_font(currentfont,detail,tempname)
- logs.simple("entering edit mode for '%s'",currentfont)
+ report("entering edit mode for '%s'",currentfont)
local specification = get_specification(currentfont)
if specification then
local htmldata = showfeatures(specification.filename)
@@ -303,7 +305,7 @@ local function edit_font(currentfont,detail,tempname)
local sorted = table.sortedkeys(htmldata.scripts)
for k=1,#sorted do
local v = sorted[k]
- local s = fonts.otf.tables.scripts[v] or v
+ local s = fonts.handlers.otf.tables.scripts[v] or v
if detail and v == detail.script then
scripts[#scripts+1] = format("<input title='%s' id='s-%s' type='radio' name='script' value='%s' onclick='check_script()' checked='checked'/>&nbsp;<span id='t-s-%s'>%s</span>",s,v,v,v,v)
else
@@ -313,7 +315,7 @@ local function edit_font(currentfont,detail,tempname)
local sorted = table.sortedkeys(htmldata.languages)
for k=1,#sorted do
local v = sorted[k]
- local l = fonts.otf.tables.languages[v] or v
+ local l = fonts.handlers.otf.tables.languages[v] or v
if detail and v == detail.language then
languages[#languages+1] = format("<input title='%s' id='l-%s' type='radio' name='language' value='%s' onclick='check_language()' checked='checked'/>&nbsp;<span id='t-l-%s'>%s</span>",l,v,v,v,v)
else
@@ -323,7 +325,7 @@ local function edit_font(currentfont,detail,tempname)
local sorted = table.sortedkeys(htmldata.features)
for k=1,#sorted do
local v = sorted[k]
- local f = fonts.otf.tables.features[v] or v
+ local f = fonts.handlers.otf.tables.features[v] or v
if detail and detail["f-"..v] then
features[#features+1] = format("<input title='%s' id='f-%s' type='checkbox' name='f-%s' onclick='check_feature()' checked='checked'/>&nbsp;<span id='t-f-%s'>%s</span>",f,v,v,v,v)
else
@@ -374,7 +376,7 @@ local function process_font(currentfont,detail) -- maybe just fontname
end
local sample = string.strip(detail.sampletext or "")
if sample == "" then sample = sample_line end
- logs.simple("sample text: %s",sample)
+ report("sample text: %s",sample)
io.savedata(file.join(temppath,file.addsuffix(tempname,"tex")),format(variant,concat(features,","),currentfont,sample))
os.execute(format("mtxrun --path=%s --script context --once --batchmode %s",temppath,tempname))
return edit_font(currentfont,detail,tempname)
@@ -406,7 +408,7 @@ end
local function show_font(currentfont,detail)
local specification = get_specification(currentfont)
- local features = fonts.get_features(specification.filename)
+ local features = fonts.helpers.getfeatures(specification.filename)
local result = { }
result[#result+1] = format("<h1>names</h1>",what)
result[#result+1] = "<table>"
@@ -444,7 +446,7 @@ local function show_font(currentfont,detail)
else
done = true
end
- local title = fonts.otf.tables.features[f] or ""
+ local title = fonts.handlers.otf.tables.features[f] or ""
result[#result+1] = format("<tr><td width='50%%'>%s&nbsp;&nbsp;</td><td><tt>%s&nbsp;&nbsp;</tt></td><td><tt>%s&nbsp;&nbsp;</tt></td><td><tt>%s&nbsp;&nbsp;</tt></td></tr>",title,f,s,concat(table.sortedkeys(ss)," "))
end
end
@@ -497,7 +499,7 @@ local function loadbase()
if storage == "" then
storage = { }
else
- logs.simple("loading '%s'",datafile)
+ report("loading '%s'",datafile)
storage = loadstring(storage)
storage = (storage and storage()) or { }
end
@@ -527,14 +529,14 @@ end
local function savebase(storage,name)
local datafile = file.join(basepath,basename)
- logs.simple("saving '%s' in '%s'",name or "data",datafile)
+ report("saving '%s' in '%s'",name or "data",datafile)
io.savedata(datafile,table.serialize(storage,true))
end
local function deletestored(detail,currentfont,name)
local storage = loadbase()
if storage and name and storage[name] then
- logs.simple("deleting '%s' from base",name)
+ report("deleting '%s' from base",name)
storage[name] = nil
savebase(storage)
end
@@ -610,7 +612,7 @@ end
function extras.reload()
local command = "mtxrun --script font --reload"
- logs.simple("run command: %s",command)
+ report("run command: %s",command)
os.execute(command)
return do_extras()
end
@@ -679,7 +681,7 @@ function doit(configuration,filename,hashed)
variables.javascripts = ""
variables.javascriptinit = ""
- logs.simple("action: %s",action or "no action")
+ report("action: %s",action or "no action")
local result
@@ -722,7 +724,7 @@ function doit(configuration,filename,hashed)
result = { content = lmx.convert('context-fonttest.lmx',false,variables) }
- logs.simple("time spent on page: %0.03f seconds",os.clock()-start)
+ report("time spent on page: %0.03f seconds",os.clock()-start)
return result
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-server-ctx-help.lua b/Master/texmf-dist/scripts/context/lua/mtx-server-ctx-help.lua
index 2f072f97747..15f393853c1 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-server-ctx-help.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-server-ctx-help.lua
@@ -8,15 +8,17 @@ if not modules then modules = { } end modules ['mtx-server-ctx-help'] = {
-- todo in lua interface: noargument, oneargument, twoarguments, threearguments
---~ dofile(resolvers.find_file("l-aux.lua","tex"))
---~ dofile(resolvers.find_file("l-url.lua","tex"))
-dofile(resolvers.find_file("trac-lmx.lua","tex"))
+--~ dofile(resolvers.findfile("l-aux.lua","tex"))
+--~ dofile(resolvers.findfile("l-url.lua","tex"))
+dofile(resolvers.findfile("trac-lmx.lua","tex"))
-- problem ... serialize parent stack
local format = string.format
local concat = table.concat
+local report = logs.reporter("ctx-help")
+
-- -- -- make this a module: cont-xx.lua
document = document or { }
@@ -329,7 +331,7 @@ document.setups.showsources = true
document.setups.mode = 1
function document.setups.load(filename)
- filename = resolvers.find_file(filename) or ""
+ filename = resolvers.findfile(filename) or ""
if filename ~= "" then
local current = document.setups.loaded[filename]
if not current then
@@ -574,7 +576,7 @@ local variables = {
}
--~ function lmx.loadedfile(filename)
---~ return io.loaddata(resolvers.find_file(filename)) -- return resolvers.texdatablob(filename)
+--~ return io.loaddata(resolvers.findfile(filename)) -- return resolvers.texdatablob(filename)
--~ end
local function doit(configuration,filename,hashed)
@@ -591,7 +593,7 @@ local function doit(configuration,filename,hashed)
lastmode = tonumber(detail.mode or lastmode) or 1
if lastinterface then
- logs.simple("checking interface: %s",lastinterface)
+ report("checking interface: %s",lastinterface)
document.setups.load(format("cont-%s.xml",lastinterface))
end
@@ -632,7 +634,7 @@ local function doit(configuration,filename,hashed)
if document.setups.showsources and lastsource and lastsource ~= "" then
-- todo: mkii, mkiv, tex (can be different)
- local data = io.loaddata(resolvers.find_file(lastsource))
+ local data = io.loaddata(resolvers.findfile(lastsource))
variables.maintitle = lastsource
variables.maintext = formats.listing:format(data)
lastsource = ""
@@ -657,7 +659,7 @@ local function doit(configuration,filename,hashed)
local content = lmx.convert('context-help.lmx',false,variables)
- logs.simple("time spent on page: %0.03f seconds",os.clock()-start)
+ report("time spent on page: %0.03f seconds",os.clock()-start)
return { content = content }
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-server-ctx-startup.lua b/Master/texmf-dist/scripts/context/lua/mtx-server-ctx-startup.lua
index 59536c36cdb..55680511314 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-server-ctx-startup.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-server-ctx-startup.lua
@@ -6,12 +6,12 @@ if not modules then modules = { } end modules ['mtx-server-ctx-startup'] = {
license = "see context related readme files"
}
-dofile(resolvers.find_file("trac-lmx.lua","tex"))
+dofile(resolvers.findfile("trac-lmx.lua","tex"))
function doit(configuration,filename,hashed)
local list = { }
- local root = file.dirname(resolvers.find_file("mtx-server.lua") or ".")
+ local root = file.dirname(resolvers.findfile("mtx-server.lua") or ".")
if root == "" then root = "." end
local pattern = root .. "/mtx-server-ctx-*.lua"
local files = dir.glob(pattern)
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-server.lua b/Master/texmf-dist/scripts/context/lua/mtx-server.lua
index dc0befcaa2f..4547877b5ef 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-server.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-server.lua
@@ -6,11 +6,28 @@ if not modules then modules = { } end modules ['mtx-server'] = {
license = "see context related readme files"
}
+local helpinfo = [[
+--start start server
+--port port to listen to
+--root server root
+--scripts scripts sub path
+--index index file
+--auto start on own path
+]]
+
+local application = logs.application {
+ name = "mtx-server",
+ banner = "Simple Webserver For Helpers 0.10",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
scripts = scripts or { }
scripts.webserver = scripts.webserver or { }
-dofile(resolvers.find_file("l-url.lua","tex"))
-dofile(resolvers.find_file("luat-soc.lua","tex"))
+dofile(resolvers.findfile("l-url.lua","tex"))
+dofile(resolvers.findfile("luat-soc.lua","tex"))
local socket = socket or require("socket") -- redundant in future version
local format = string.format
@@ -127,7 +144,7 @@ local handlers = { }
local function errormessage(client,configuration,n)
local data = format("<head><title>%s %s</title></head><html><h2>%s %s</h2></html>",n,messages[n],n,messages[n])
- logs.simple("handling error %s: %s",n,messages[n])
+ report("handling error %s: %s",n,messages[n])
handlers.generic(client,configuration,data,nil,true)
end
@@ -136,7 +153,7 @@ local validpaths, registered = { }, { }
function scripts.webserver.registerpath(name)
if not registered[name] then
local cleanname = string.gsub(name,"%.%.","deleted-parent")
- logs.simple("registering path '%s'",cleanname)
+ report("registering path '%s'",cleanname)
validpaths[#validpaths+1] = cleanname
registered[name] = true
end
@@ -145,7 +162,7 @@ end
function handlers.generic(client,configuration,data,suffix,iscontent)
if not iscontent then
local name = data
- logs.simple("requested file '%s'",name)
+ report("requested file '%s'",name)
local fullname = file.join(configuration.root,name)
data = io.loaddata(fullname) or ""
if data == "" then
@@ -153,12 +170,12 @@ function handlers.generic(client,configuration,data,suffix,iscontent)
local fullname = file.join(validpaths[n],name)
data = io.loaddata(fullname) or ""
if data ~= "" then
- logs.simple("sending generic file '%s'",fullname)
+ report("sending generic file '%s'",fullname)
break
end
end
else
- logs.simple("sending generic file '%s'",fullname)
+ report("sending generic file '%s'",fullname)
end
end
if data and data ~= "" then
@@ -192,18 +209,18 @@ function handlers.lua(client,configuration,filename,suffix,iscontent,hashed) --
-- todo: split url in components, see l-url; rather trivial
local result, keep = loaded[filename], false
if result then
- logs.simple("reusing script: %s",filename)
+ report("reusing script: %s",filename)
else
- logs.simple("locating script: %s",filename)
+ report("locating script: %s",filename)
if lfs.isfile(filename) then
- logs.simple("loading script: %s",filename)
+ report("loading script: %s",filename)
result = loadfile(filename)
- logs.simple("return type: %s",type(result))
+ report("return type: %s",type(result))
if result and type(result) == "function" then
-- result() should return a table { [type=,] [length=,] content= }, function or string
result, keep = result()
if keep then
- logs.simple("saving script: %s",type(result))
+ report("saving script: %s",type(result))
loaded[filename] = result
end
end
@@ -262,7 +279,7 @@ function scripts.webserver.run(configuration)
end
end
end
- configuration.root = dir.expand_name(configuration.root)
+ configuration.root = dir.expandname(configuration.root)
if not configuration.index then
for i=1,#indices do
local name = indices[i]
@@ -274,14 +291,14 @@ function scripts.webserver.run(configuration)
configuration.index = configuration.index or "unknown"
end
if not configuration.scripts or configuration.scripts == "" then
- configuration.scripts = dir.expand_name(file.join(configuration.root or ".",configuration.scripts or "."))
+ configuration.scripts = dir.expandname(file.join(configuration.root or ".",configuration.scripts or "."))
end
-- so far for checks
- logs.simple("running at port: %s",configuration.port)
- logs.simple("document root: %s",configuration.root or resolvers.ownpath)
- logs.simple("main index file: %s",configuration.index)
- logs.simple("scripts subpath: %s",configuration.scripts)
- logs.simple("context services: http://localhost:%s/mtx-server-ctx-startup.lua",configuration.port)
+ report("running at port: %s",configuration.port)
+ report("document root: %s",configuration.root or resolvers.ownpath)
+ report("main index file: %s",configuration.index)
+ report("scripts subpath: %s",configuration.scripts)
+ report("context services: http://localhost:%s/mtx-server-ctx-startup.lua",configuration.port)
local server = assert(socket.bind("*", configuration.port))
--~ local reading = { server }
while true do -- no multiple clients
@@ -295,26 +312,27 @@ function scripts.webserver.run(configuration)
errormessage(client,configuration,404)
else
local from = client:getpeername()
- logs.simple("request from: %s",tostring(from))
+ report("request from: %s",tostring(from))
local fullurl = request:match("GET (.+) HTTP/.*$") -- todo: more clever
fullurl = socket.url.unescape(fullurl)
local hashed = url.hashed(fullurl)
local query = url.query(hashed.query)
local filename = hashed.path
+--~ table.print(hashed)
if filename then
filename = socket.url.unescape(filename)
- logs.simple("requested action: %s",filename)
+ report("requested action: %s",filename)
if filename:find("%.%.") then
filename = nil -- invalid path
end
if filename == nil or filename == "" or filename == "/" then
filename = configuration.index
- logs.simple("invalid filename, forcing: %s",filename)
+ report("invalid filename, forcing: %s",filename)
end
local suffix = file.extname(filename)
local action = handlers[suffix] or handlers.generic
if action then
- logs.simple("performing action: %s",filename)
+ report("performing action: %s",filename)
action(client,configuration,filename,suffix,false,hashed) -- filename and no content
else
errormessage(client,configuration,404)
@@ -324,23 +342,12 @@ function scripts.webserver.run(configuration)
end
end
client:close()
- logs.simple("time spent with client: %0.03f seconds",os.clock()-start)
+ report("time spent with client: %0.03f seconds",os.clock()-start)
end
end
-logs.extendbanner("Simple Webserver For Helpers 0.10")
-
-messages.help = [[
---start start server
---port port to listen to
---root server root
---scripts scripts sub path
---index index file
---auto start on own path
-]]
-
if environment.argument("auto") then
- local path = resolvers.find_file("mtx-server.lua") or "."
+ local path = resolvers.findfile("mtx-server.lua") or "."
scripts.webserver.run {
port = environment.argument("port"),
root = environment.argument("root") or file.dirname(path) or ".",
@@ -354,8 +361,8 @@ elseif environment.argument("start") then
scripts = environment.argument("scripts"),
}
else
- logs.help(messages.help)
+ application.help()
end
--- mtxrun --script server --start => http://localhost:8080/mtx-server-ctx-help.lua
+-- mtxrun --script server --start => http://localhost:31415/mtx-server-ctx-startup.lua
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-texworks.lua b/Master/texmf-dist/scripts/context/lua/mtx-texworks.lua
index 73ab846cd7f..33e56df468a 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-texworks.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-texworks.lua
@@ -6,6 +6,19 @@ if not modules then modules = { } end modules ['mtx-texworks'] = {
license = "see context related readme files"
}
+local helpinfo = [[
+--start [--verbose] start texworks
+--test report what will happen
+]]
+
+local application = logs.application {
+ name = "mtx-texworks",
+ banner = "TeXworks Startup Script 1.00",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
scripts = scripts or { }
scripts.texworks = scripts.texworks or { }
@@ -25,35 +38,35 @@ local texworkininame = "texworks.ini"
function scripts.texworks.start(indeed)
local workname = (os.type == "windows" and "texworks.exe") or "texworks"
local fullname = nil
- local binpaths = file.split_path(os.getenv("PATH")) or file.split_path(os.getenv("path"))
+ local binpaths = file.splitpath(os.getenv("PATH")) or file.splitpath(os.getenv("path"))
local usedsignal = texworkssignal
- local datapath = resolvers.find_file(usedsignal,"other text files") or ""
+ local datapath = resolvers.findfile(usedsignal,"other text files") or ""
if datapath ~= "" then
datapath = file.dirname(datapath) -- data
if datapath == "" then
- datapath = resolvers.clean_path(lfs.currentdir())
+ datapath = resolvers.cleanpath(lfs.currentdir())
end
else
usedsignal = texworkininame
- datapath = resolvers.find_file(usedsignal,"other text files") or ""
+ datapath = resolvers.findfile(usedsignal,"other text files") or ""
if datapath == "" then
usedsignal = string.lower(usedsignal)
- datapath = resolvers.find_file(usedsignal,"other text files") or ""
+ datapath = resolvers.findfile(usedsignal,"other text files") or ""
end
if datapath ~= "" and lfs.isfile(datapath) then
datapath = file.dirname(datapath) -- TUG
datapath = file.dirname(datapath) -- data
if datapath == "" then
- datapath = resolvers.clean_path(lfs.currentdir())
+ datapath = resolvers.cleanpath(lfs.currentdir())
end
end
end
if datapath == "" then
- logs.simple("invalid datapath, maybe you need to regenerate the file database")
+ report("invalid datapath, maybe you need to regenerate the file database")
return false
end
if not binpaths or #binpaths == 0 then
- logs.simple("invalid binpath")
+ report("invalid binpath")
return false
end
for i=1,#binpaths do
@@ -64,7 +77,7 @@ function scripts.texworks.start(indeed)
end
end
if not fullname then
- logs.simple("unable to locate %s",workname)
+ report("unable to locate %s",workname)
return false
end
for i=1,#texworkspaths do
@@ -73,27 +86,20 @@ function scripts.texworks.start(indeed)
os.setenv("TW_INIPATH",datapath)
os.setenv("TW_LIBPATH",datapath)
if not indeed or environment.argument("verbose") then
- logs.simple("used signal: %s", usedsignal)
- logs.simple("data path : %s", datapath)
- logs.simple("full name : %s", fullname)
- logs.simple("set paths : TW_INIPATH TW_LIBPATH")
+ report("used signal: %s", usedsignal)
+ report("data path : %s", datapath)
+ report("full name : %s", fullname)
+ report("set paths : TW_INIPATH TW_LIBPATH")
end
if indeed then
os.launch(fullname)
end
end
-logs.extendbanner("TeXworks Startup Script 1.00",true)
-
-messages.help = [[
---start [--verbose] start texworks
---test report what will happen
-]]
-
if environment.argument("start") then
scripts.texworks.start(true)
elseif environment.argument("test") then
scripts.texworks.start()
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-timing.lua b/Master/texmf-dist/scripts/context/lua/mtx-timing.lua
index 40e33cdaef0..03100e991af 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-timing.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-timing.lua
@@ -8,8 +8,22 @@ if not modules then modules = { } end modules ['mtx-timing'] = {
local format, gsub, concat = string.format, string.gsub, table.concat
-dofile(resolvers.find_file("trac-tim.lua","tex"))
-dofile(resolvers.find_file("trac-lmx.lua","tex"))
+local helpinfo = [[
+--xhtml make xhtml file
+--launch launch after conversion
+--remove remove after launching
+]]
+
+local application = logs.application {
+ name = "mtx-timing",
+ banner = "ConTeXt Timing Tools 0.10",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
+dofile(resolvers.findfile("trac-tim.lua","tex"))
+dofile(resolvers.findfile("trac-lmx.lua","tex"))
local meta = [[
beginfig(%s) ;
@@ -57,6 +71,8 @@ local directrun = true
local what = { "parameters", "nodes" }
+plugins = plugins or { } -- brrr, will become moduledata as well
+
function plugins.progress.make_svg(filename,other)
local metadata, menudata, c = { }, { }, 0
metadata[#metadata+1] = 'outputformat := "svg" ;'
@@ -74,9 +90,9 @@ function plugins.progress.make_svg(filename,other)
metadata[#metadata+1] = "end ."
metadata = concat(metadata,"\n\n")
if directrun then
- dofile(resolvers.find_file("mlib-run.lua","tex"))
+ dofile(resolvers.findfile("mlib-run.lua","tex"))
commands = commands or { }
- commands.writestatus = logs.report
+ commands.writestatus = report
local result = metapost.directrun("metafun","timing data","svg",true,metadata)
return menudata, result
else
@@ -138,7 +154,7 @@ function plugins.progress.make_lmx_page(name,launch,remove)
local htmldata = plugins.progress.makehtml(filename,other,menudata,metadata)
lmx.htmfile = function(name) return name .. "-timing.xhtml" end
- lmx.lmxfile = function(name) return resolvers.find_file(name,'tex') end
+ lmx.lmxfile = function(name) return resolvers.findfile(name,'tex') end
local variables = {
['title-default'] = 'ConTeXt Timing Information',
@@ -167,9 +183,9 @@ scripts.timings = scripts.timings or { }
function scripts.timings.xhtml(filename)
if filename == "" then
- logs.simple("provide filename")
+ report("provide filename")
elseif not plugins.progress.valid_file(filename) then
- logs.simple("first run context again with the --timing option")
+ report("first run context again with the --timing option")
else
local basename = file.removesuffix(filename)
local launch = environment.argument("launch")
@@ -178,16 +194,8 @@ function scripts.timings.xhtml(filename)
end
end
-logs.extendbanner("ConTeXt Timing Tools 0.10",true)
-
-messages.help = [[
---xhtml make xhtml file
---launch launch after conversion
---remove remove after launching
-]]
-
if environment.argument("xhtml") then
scripts.timings.xhtml(environment.files[1] or "")
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-tools.lua b/Master/texmf-dist/scripts/context/lua/mtx-tools.lua
index bf4add16840..905b3aa8583 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-tools.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-tools.lua
@@ -8,6 +8,33 @@ if not modules then modules = { } end modules ['mtx-tools'] = {
local find, format, sub, rep, gsub, lower = string.find, string.format, string.sub, string.rep, string.gsub, string.lower
+local helpinfo = [[
+--disarmutfbomb remove utf bomb if present
+ --force remove indeed
+
+--dirtoxml glob directory into xml
+ --pattern glob pattern (default: *)
+ --url url attribute (no processing)
+ --root the root of the globbed path (default: .)
+ --output output filename (console by default)
+ --recurse recurse into subdirecories
+ --stripname take pathpart of given pattern
+ --longname set name attributes to full path name
+
+--downcase
+ --pattern glob pattern (default: *)
+ --recurse recurse into subdirecories
+ --force downcase indeed
+]]
+
+local application = logs.application {
+ name = "mtx-tools",
+ banner = "Some File Related Goodies 1.01",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
scripts = scripts or { }
scripts.tools = scripts.tools or { }
@@ -23,24 +50,24 @@ function scripts.tools.disarmutfbomb()
if not data then
-- just skip
elseif find(data,bomb_1) then
- logs.simple("file '%s' has a 2 character utf bomb",name)
+ report("file '%s' has a 2 character utf bomb",name)
if force then
io.savedata(name,(gsub(data,bomb_1,"")))
end
done = true
elseif find(data,bomb_2) then
- logs.simple("file '%s' has a 3 character utf bomb",name)
+ report("file '%s' has a 3 character utf bomb",name)
if force then
io.savedata(name,(gsub(data,bomb_2,"")))
end
done = true
else
- -- logs.simple("file '%s' has no utf bomb",name)
+ -- report("file '%s' has no utf bomb",name)
end
end
end
if done and not force then
- logs.simple("use --force to do a real disarming")
+ report("use --force to do a real disarming")
end
end
@@ -63,12 +90,12 @@ function scripts.tools.downcase()
end)
if n > 0 then
if force then
- logs.simple("%s files renamed",n)
+ report("%s files renamed",n)
else
- logs.simple("use --force to do a real rename (%s files involved)",n)
+ report("use --force to do a real rename (%s files involved)",n)
end
else
- logs.simple("nothing to do")
+ report("nothing to do")
end
end
@@ -111,7 +138,7 @@ function scripts.tools.dirtoxml()
end
if not pattern or pattern == "" then
- logs.report('provide --pattern=')
+ report('provide --pattern=')
return
end
@@ -123,7 +150,7 @@ function scripts.tools.dirtoxml()
lfs.chdir(root)
- local list = dir.collect_pattern(root,luapattern,recurse)
+ local list = dir.collectpattern(root,luapattern,recurse)
if list[outputfile] then
list[outputfile] = nil
@@ -144,27 +171,6 @@ function scripts.tools.dirtoxml()
end
-logs.extendbanner("Some File Related Goodies 1.01",true)
-
-messages.help = [[
---disarmutfbomb remove utf bomb if present
- --force remove indeed
-
---dirtoxml glob directory into xml
- --pattern glob pattern (default: *)
- --url url attribute (no processing)
- --root the root of the globbed path (default: .)
- --output output filename (console by default)
- --recurse recurse into subdirecories
- --stripname take pathpart of given pattern
- --longname set name attributes to full path name
-
---downcase
- --pattern glob pattern (default: *)
- --recurse recurse into subdirecories
- --force downcase indeed
-]]
-
if environment.argument("disarmutfbomb") then
scripts.tools.disarmutfbomb()
elseif environment.argument("dirtoxml") then
@@ -172,5 +178,5 @@ elseif environment.argument("dirtoxml") then
elseif environment.argument("downcase") then
scripts.tools.downcase()
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-unzip.lua b/Master/texmf-dist/scripts/context/lua/mtx-unzip.lua
index f990f421032..645863426db 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-unzip.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-unzip.lua
@@ -1,20 +1,32 @@
+if not modules then modules = { } end modules ['mtx-unzip'] = {
+ version = 1.001,
+ comment = "companion to mtxrun.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
-- maybe --pattern
-logs.extendbanner("Simple Unzipper 0.10")
+local format = string.format
-messages.help = [[
+local helpinfo = [[
--list list files in archive
--junk flatten unzipped directory structure
--extract extract files
]]
+local application = logs.application {
+ name = "mtx-unzip",
+ banner = "Simple Unzipper 0.10",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
scripts = scripts or { }
scripts.unzipper = scripts.unzipper or { }
-function scripts.unzipper.help()
- logs.help(messages.help)
-end
-
function scripts.unzipper.opened()
local filename = environment.files[1]
if filename and filename ~= "" then
@@ -24,7 +36,7 @@ function scripts.unzipper.opened()
return zipfile
end
end
- logs.report("unzip", "no zip file: " .. filename)
+ report("no zip file: %s",filename)
return false
end
@@ -36,10 +48,13 @@ function scripts.unzipper.list()
if #k.filename > n then n = #k.filename end
end
local files, paths, compressed, uncompressed = 0, 0, 0, 0
+ local template_a = "%-"..n.."s"
+ local template_b = "%-"..n.."s % 9i % 9i"
+ local template_c = "\n%-"..n.."s % 9i % 9i"
for k in zipfile:files() do
if k.filename:find("/$") then
paths = paths + 1
- print(string.format("%s", k.filename:rpadd(n," ")))
+ print(format(template_a, k.filename))
else
files = files + 1
local cs, us = k.compressed_size, k.uncompressed_size
@@ -49,10 +64,10 @@ function scripts.unzipper.list()
if us > uncompressed then
uncompressed = us
end
- print(string.format("%s % 9i % 9i", k.filename:rpadd(n," "),cs,us))
+ print(format(template_b,k.filename,cs,us))
end
- end
- print(string.format("\n%s % 9i % 9i", (files .. " files, " .. paths .. " directories"):rpadd(n," "),compressed,uncompressed))
+ end -- check following pattern, n is not enough
+ print(format(template_c,files .. " files, " .. paths .. " directories",compressed,uncompressed))
end
end
@@ -91,11 +106,11 @@ function scripts.unzipper.extract()
end
if environment.arguments["h"] or environment.arguments["help"] then
- scripts.unzipper.help()
+ application.help()
elseif environment.arguments["l"] or environment.arguments["list"] then
scripts.unzipper.list(zipfile)
elseif environment.files[1] then -- implicit --extract
scripts.unzipper.extract(zipfile)
else
- scripts.unzipper.help()
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-update.lua b/Master/texmf-dist/scripts/context/lua/mtx-update.lua
index b56083d3809..750c7488692 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-update.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-update.lua
@@ -11,7 +11,33 @@ if not modules then modules = { } end modules ['mtx-update'] = {
-- Together with Arthur Reutenauer she made sure that it worked well on all
-- platforms that matter.
-local format, concat, gmatch = string.format, table.concat, string.gmatch
+local helpinfo = [[
+--platform=string platform (windows, linux, linux-64, osx-intel, osx-ppc, linux-ppc)
+--server=string repository url (rsync://contextgarden.net)
+--module=string repository url (minimals)
+--repository=string specify version (current, experimental)
+--context=string specify version (current, latest, beta, yyyy.mm.dd)
+--rsync=string rsync binary (rsync)
+--texroot=string installation directory (not guessed for the moment)
+--engine=string tex engine (luatex, pdftex, xetex)
+--extras=string extra modules (can be list or 'all')
+--goodies=string extra binaries (like scite and texworks)
+--force instead of a dryrun, do the real thing
+--update update minimal tree
+--make also make formats and generate file databases
+--keep don't delete unused or obsolete files
+--state update tree using saved state
+]]
+
+local application = logs.application {
+ name = "mtx-update",
+ banner = "ConTeXt Minimals Updater 0.22",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
+local format, concat, gmatch, gsub = string.format, table.concat, string.gmatch, string.gsub
scripts = scripts or { }
scripts.update = scripts.update or { }
@@ -144,6 +170,11 @@ scripts.update.platforms = {
["solaris"] = "solaris-sparc",
}
+scripts.update.selfscripts = {
+ "mtxrun",
+ -- "luatools",
+}
+
-- the list is filled up later (when we know what modules to download)
scripts.update.modules = {
@@ -154,10 +185,10 @@ function scripts.update.run(str)
-- (texlua sets luatex as the engine, we need to reset that or to fix texexec :)
os.setenv("engine",nil)
if environment.argument("force") then
- logs.report("run", str)
+ report("run, %s",str)
os.execute(str)
else
- logs.report("dry run", str)
+ report("dry run, %s",str)
end
end
@@ -171,7 +202,7 @@ end
function scripts.update.synchronize()
- logs.report("update","start")
+ report("update, start")
local texroot = scripts.update.fullpath(states.get("paths.root"))
local engines = states.get('engines') or { }
@@ -184,7 +215,7 @@ function scripts.update.synchronize()
local goodies = states.get("goodies") -- goodies (like editors)
local force = environment.argument("force")
- bin = string.gsub(bin,"\\","/")
+ bin = gsub(bin,"\\","/")
if not url:find("::$") then url = url .. "::" end
local ok = lfs.attributes(texroot,"mode") == "directory"
@@ -197,6 +228,7 @@ function scripts.update.synchronize()
dir.mkdirs(format("%s/%s", texroot, "texmf-cache"))
dir.mkdirs(format("%s/%s", texroot, "texmf-local"))
dir.mkdirs(format("%s/%s", texroot, "texmf-project"))
+ dir.mkdirs(format("%s/%s", texroot, "texmf-fonts"))
end
if ok or not force then
@@ -209,8 +241,8 @@ function scripts.update.synchronize()
local archives = {}
for i=1,#collection do
local archive = collection[i][1]
- archive = archive:gsub("<platform>", platform)
- archive = archive:gsub("<version>", version)
+ archive = gsub(archive,"<platform>",platform)
+ archive = gsub(archive,"<version>",version)
archives[#archives+1] = archive
end
return archives
@@ -281,12 +313,12 @@ function scripts.update.synchronize()
if platform then
for i=1,#collection do
local c = collection[i]
- local archive = c[1]:gsub("<platform>", platform)
- local destination = format("%s/%s", texroot, c[2]:gsub("<platform>", platform))
- destination = destination:gsub("\\","/")
- archive = archive:gsub("<version>",version)
+ local archive = gsub(c[1],"<platform>",platform)
+ local destination = format("%s/%s", texroot, gsub(c[2],"<platform>", platform))
+ destination = gsub(destination,"\\","/")
+ archive = gsub(archive,"<version>",version)
if osplatform == "windows" or osplatform == "mswin" then
- destination = destination:gsub("([a-zA-Z]):/", "/cygdrive/%1/")
+ destination = gsub(destination,"([a-zA-Z]):/", "/cygdrive/%1/")
end
individual[#individual+1] = { archive, destination }
end
@@ -330,23 +362,12 @@ function scripts.update.synchronize()
end
end
end
- if logs.verbose then
- for k, v in next, combined do
- logs.report("update", k)
- for i=1,#v do
- logs.report("update", " <= " .. v[i])
- end
- end
- end
for destination, archive in next, combined do
local archives, command = concat(archive," "), ""
- -- local normalflags, deleteflags = states.get("rsync.flags.normal"), states.get("rsync.flags.delete")
- -- if environment.argument("keep") or destination:find("%.$") then
- -- command = format("%s %s %s'%s' '%s'", bin, normalflags, url, archives, destination)
- -- else
- -- command = format("%s %s %s %s'%s' '%s'", bin, normalflags, deleteflags, url, archives, destination)
- -- end
local normalflags, deleteflags = states.get("rsync.flags.normal"), ""
+ if os.name == "windows" then
+ normalflags = normalflags .. " -L" -- no symlinks
+ end
local dryrunflags = ""
if not environment.argument("force") then
dryrunflags = "--dry-run"
@@ -355,7 +376,7 @@ function scripts.update.synchronize()
deleteflags = states.get("rsync.flags.delete")
end
command = format("%s %s %s %s %s'%s' '%s'", bin, normalflags, deleteflags, dryrunflags, url, archives, destination)
- --logs.report("mtx update", format("running command: %s",command))
+ -- report("running command: %s",command)
if not fetched[command] then
scripts.update.run(command,true)
fetched[command] = command
@@ -363,43 +384,44 @@ function scripts.update.synchronize()
end
local function update_script(script, platform)
- local bin = bin:gsub("\\","/")
- local texroot = texroot:gsub("\\","/")
+ local bin = gsub(bin,"\\","/")
+ local texroot = gsub(texroot,"\\","/")
platform = scripts.update.platforms[platform]
if platform then
local command
if platform == 'mswin' then
- bin = bin:gsub("([a-zA-Z]):/", "/cygdrive/%1/")
- texroot = texroot:gsub("([a-zA-Z]):/", "/cygdrive/%1/")
- command = string.format("%s -t %s/texmf-context/scripts/context/lua/%s.lua %s/texmf-mswin/bin/", bin, texroot, script, texroot)
+ bin = gsub(bin,"([a-zA-Z]):/", "/cygdrive/%1/")
+ texroot = gsub(texroot,"([a-zA-Z]):/", "/cygdrive/%1/")
+ command = format("%s -t %s/texmf-context/scripts/context/lua/%s.lua %s/texmf-mswin/bin/", bin, texroot, script, texroot)
else
- command = string.format("%s -tgo --chmod=a+x %s/texmf-context/scripts/context/lua/%s.lua %s/texmf-%s/bin/%s", bin, texroot, script, texroot, platform, script)
+ command = format("%s -tgo --chmod=a+x %s/texmf-context/scripts/context/lua/%s.lua %s/texmf-%s/bin/%s", bin, texroot, script, texroot, platform, script)
end
- logs.report("mtx update", format("updating %s for %s: %s", script, platform, command))
+ report("updating %s for %s: %s", script, platform, command)
scripts.update.run(command)
end
end
for platform, _ in next, platforms do
- update_script('luatools',platform)
- update_script('mtxrun',platform)
+ for i=1, #scripts.update.selfscripts do
+ update_script(scripts.update.selfscripts[i],platform)
+ end
end
else
- logs.report("mtx update", format("no valid texroot: %s",texroot))
+ report("no valid texroot: %s",texroot)
end
if not force then
- logs.report("update", "use --force to really update files")
+ report("use --force to really update files")
end
resolvers.load_tree(texroot) -- else we operate in the wrong tree
-- update filename database for pdftex/xetex
- scripts.update.run("mktexlsr")
+ scripts.update.run(format('mtxrun --tree="%s" --direct mktexlsr',texroot))
-- update filename database for luatex
- scripts.update.run("luatools --generate")
+ scripts.update.run(format('mtxrun --tree="%s" --generate',texroot))
- logs.report("update","done")
+ report("update, done")
end
function table.fromhash(t)
@@ -413,7 +435,7 @@ end
-- make the ConTeXt formats
function scripts.update.make()
- logs.report("make","start")
+ report("make, start")
local force = environment.argument("force")
local texroot = scripts.update.fullpath(states.get("paths.root"))
@@ -424,8 +446,8 @@ function scripts.update.make()
resolvers.load_tree(texroot)
- scripts.update.run("mktexlsr")
- scripts.update.run("luatools --generate")
+ scripts.update.run(format('mtxrun --tree="%s" --direct mktexlsr',texroot))
+ scripts.update.run(format('mtxrun --tree="%s" --generate',texroot))
local askedformats = formats
local texformats = table.tohash(scripts.update.texformats)
@@ -444,45 +466,24 @@ function scripts.update.make()
if formatlist ~= "" then
for engine in next, engines do
if engine == "luatex" then
- scripts.update.run(format("context --make")) -- maybe also formatlist
+ scripts.update.run(format('mtxrun --tree="%s" --script context --autogenerate --make',texroot))
else
- -- todo: just handle make here or in mtxrun --script context --make
- scripts.update.run(format("texexec --make --all --fast --%s %s",engine,formatlist))
+ scripts.update.run(format('mtxrun --tree="%s" --script texexec --make --all --%s %s',texroot,engine,formatlist))
end
end
end
local formatlist = concat(table.fromhash(mpformats), " ")
if formatlist ~= "" then
- scripts.update.run(format("texexec --make --all --fast %s",formatlist))
+ scripts.update.run(format('mtxrun --tree="%s" --script texexec --make --all %s',texroot,formatlist))
end
if not force then
- logs.report("make", "use --force to really make formats")
+ report("make, use --force to really make formats")
end
- scripts.update.run("mktexlsr")
- scripts.update.run("luatools --generate")
- logs.report("make","done")
+ scripts.update.run(format('mtxrun --tree="%s" --direct mktexlsr',texroot))
+ scripts.update.run(format('mtxrun --tree="%s" --generate',texroot))
+ report("make, done")
end
-logs.extendbanner("ConTeXt Minimals Updater 0.21",true)
-
-messages.help = [[
---platform=string platform (windows, linux, linux-64, osx-intel, osx-ppc, linux-ppc)
---server=string repository url (rsync://contextgarden.net)
---module=string repository url (minimals)
---repository=string specify version (current, experimental)
---context=string specify version (current, latest, yyyy.mm.dd)
---rsync=string rsync binary (rsync)
---texroot=string installation directory (not guessed for the moment)
---engine=string tex engine (luatex, pdftex, xetex)
---extras=string extra modules (can be list or 'all')
---goodies=string extra binaries (like scite and texworks)
---force instead of a dryrun, do the real thing
---update update minimal tree
---make also make formats and generate file databases
---keep don't delete unused or obsolete files
---state update tree using saved state
-]]
-
scripts.savestate = true
if scripts.savestate then
@@ -549,7 +550,8 @@ if scripts.savestate then
states.set("goodies." .. r, true)
end
- logs.report("state","loaded")
+ report("state, loaded")
+ report()
end
@@ -567,7 +569,7 @@ if environment.argument("update") then
elseif environment.argument("make") then
scripts.update.make()
else
- logs.help(messages.help)
+ application.help()
end
if scripts.savestate then
@@ -575,6 +577,6 @@ if scripts.savestate then
states.set("info.runtime",tonumber(statistics.elapsedtime(states)))
if environment.argument("force") then
states.save()
- logs.report("state","saved")
+ report("state","saved")
end
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtx-watch.lua b/Master/texmf-dist/scripts/context/lua/mtx-watch.lua
index 10f01cf8698..5bd0ad5f496 100644
--- a/Master/texmf-dist/scripts/context/lua/mtx-watch.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtx-watch.lua
@@ -6,6 +6,25 @@ if not modules then modules = { } end modules ['mtx-watch'] = {
license = "see context related readme files"
}
+local helpinfo = [[
+--logpath optional path for log files
+--watch watch given path [--delay]
+--pipe use pipe instead of execute
+--delay delay between sweeps
+--automachine replace /machine/ in path /<servername>/
+--collect condense log files
+--cleanup=delay remove files in given path [--force]
+--showlog show log data
+]]
+
+local application = logs.application {
+ name = "mtx-watch",
+ banner = "ConTeXt Request Watchdog 1.00",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
scripts = scripts or { }
scripts.watch = scripts.watch or { }
@@ -92,7 +111,7 @@ function scripts.watch.watch()
end
end
for i=1,#paths do
- logs.report("watch", "watching path ".. paths[i])
+ report("watching path %s",paths[i])
end
local function process()
local done = false
@@ -107,7 +126,7 @@ function scripts.watch.watch()
local ok, joblog = pcall(dofile,name)
if ok and joblog then
if joblog.status == "processing" then
- logs.report("watch",format("aborted job, %s added to queue",name))
+ report("aborted job, %s added to queue",name)
joblog.status = "queued"
io.savedata(name, table.serialize(joblog,true))
elseif joblog.status == "queued" then
@@ -124,7 +143,7 @@ function scripts.watch.watch()
joblog.status = "processing"
joblog.runtime = clock()
io.savedata(name, table.serialize(joblog,true))
- logs.report("watch",format("running: %s", command))
+ report("running: %s", command)
local newpath = file.dirname(name)
io.flush()
local result = ""
@@ -141,7 +160,7 @@ function scripts.watch.watch()
scripts.watch.save_exa_modes(joblog,ctmname)
if pipe then result = os.resultof(command) else result = os.spawn(command) end
end
- logs.report("watch",format("return value: %s", result))
+ report("return value: %s", result)
done = true
local path, base = replacements.outputpath, file.basename(replacements.filename)
joblog.runtime = clock() - joblog.runtime
@@ -162,7 +181,7 @@ function scripts.watch.watch()
if logpath and logpath ~= "" then
local name = file.join(logpath,os.uuid() .. ".lua")
io.savedata(name, table.serialize(joblog,true))
- logs.report("watch", "saving joblog in " .. name)
+ report("saving joblog in %s",name)
end
end
end
@@ -175,7 +194,7 @@ function scripts.watch.watch()
--~ if not done then
--~ n = n + 1
--~ if n >= 10 then
---~ logs.report("watch", format("run time: %i seconds, memory usage: %0.3g MB", difftime(time(),start), (status.luastate_bytes/1024)/1000))
+--~ report("run time: %i seconds, memory usage: %0.3g MB", difftime(time(),start), (status.luastate_bytes/1024)/1000)
--~ n = 0
--~ end
--~ os.sleep(delay)
@@ -187,7 +206,7 @@ function scripts.watch.watch()
if not done then
n = n + 1
if n >= 10 then
- logs.report("watch", format("run time: %i seconds, memory usage: %0.3g MB", difftime(time(),start), (status.luastate_bytes/1024)/1000))
+ report("run time: %i seconds, memory usage: %0.3g MB", difftime(time(),start), (status.luastate_bytes/1024)/1000)
n = 0
end
local ttime = 0
@@ -222,7 +241,7 @@ function scripts.watch.watch()
local filetime = lfs.attributes(name,"modification")
local delta = difftime(currenttime,filetime)
if delta > cleanupdelay then
- -- logs.report("watch",format("cleaning up '%s'",name))
+ -- report("cleaning up '%s'",name)
os.remove(name)
end
end
@@ -248,7 +267,7 @@ function scripts.watch.watch()
end
end
else
- logs.report("watch", "no paths to watch")
+ report("no paths to watch")
end
end
@@ -282,7 +301,7 @@ function scripts.watch.save_logs(collection,path) -- play safe
local check = dofile(filename)
for k,v in next, check do
if not collection[k] then
- logs.error("watch", "error in saving file")
+ report("error in saving file")
os.remove(filename)
return false
end
@@ -326,7 +345,7 @@ function scripts.watch.show_logs(path) -- removes duplicates
local v = sorted[k]
local c = collection[v]
local f, s, r, n = c.filename or "?", c.status or "?", c.runtime or 0, c.size or 0
- logs.report("watch", format("%s %s %3i %8i %s",string.padd(f,max," "),string.padd(s,10," "),r,n,v))
+ report("%s %s %3i %8i %s",string.padd(f,max," "),string.padd(s,10," "),r,n,v)
end
end
@@ -335,11 +354,11 @@ function scripts.watch.cleanup_stale_files() -- removes duplicates
local delay = tonumber(environment.argument("cleanup"))
local force = environment.argument("force")
if not path or path == "." then
- logs.report("watch","provide qualified path")
+ report("provide qualified path")
elseif not delay then
- logs.report("watch","missing --cleanup=delay")
+ report("missing --cleanup=delay")
else
- logs.report("watch","dryrun, use --force for real cleanup")
+ report("dryrun, use --force for real cleanup")
local files = dir.glob(file.join(path,"*"))
local rtime = time()
for i=1,#files do
@@ -347,7 +366,7 @@ function scripts.watch.cleanup_stale_files() -- removes duplicates
local mtime = lfs.attributes(name,"modification")
local delta = difftime(rtime,mtime)
if delta > delay then
- logs.report("watch",format("cleaning up '%s'",name))
+ report("cleaning up '%s'",name)
if force then
os.remove(name)
end
@@ -356,19 +375,6 @@ function scripts.watch.cleanup_stale_files() -- removes duplicates
end
end
-logs.extendbanner("ConTeXt Request Watchdog 1.00",true)
-
-messages.help = [[
---logpath optional path for log files
---watch watch given path [--delay]
---pipe use pipe instead of execute
---delay delay between sweeps
---automachine replace /machine/ in path /<servername>/
---collect condense log files
---cleanup=delay remove files in given path [--force]
---showlog show log data
-]]
-
if environment.argument("watch") then
scripts.watch.watch()
elseif environment.argument("collect") then
@@ -378,5 +384,5 @@ elseif environment.argument("cleanup") then
elseif environment.argument("showlog") then
scripts.watch.show_logs()
else
- logs.help(messages.help)
+ application.help()
end
diff --git a/Master/texmf-dist/scripts/context/lua/mtxrun.lua b/Master/texmf-dist/scripts/context/lua/mtxrun.lua
index 2bdd1b8f020..cc5ebb478ac 100755
--- a/Master/texmf-dist/scripts/context/lua/mtxrun.lua
+++ b/Master/texmf-dist/scripts/context/lua/mtxrun.lua
@@ -8,7 +8,6 @@ if not modules then modules = { } end modules ['mtxrun'] = {
license = "see context related readme files"
}
-
-- one can make a stub:
--
-- #!/bin/sh
@@ -38,8 +37,6 @@ if not modules then modules = { } end modules ['mtxrun'] = {
-- remember for subruns: _CTX_K_S_#{original}_
-- remember for subruns: TEXMFSTART.#{original} [tex.rb texmfstart.rb]
-texlua = true
-
-- begin library merge
@@ -54,8 +51,9 @@ if not modules then modules = { } end modules ['l-string'] = {
license = "see context related readme files"
}
+local string = string
local sub, gsub, find, match, gmatch, format, char, byte, rep, lower = string.sub, string.gsub, string.find, string.match, string.gmatch, string.format, string.char, string.byte, string.rep, string.lower
-local lpegmatch = lpeg.match
+local lpegmatch, S, C, Ct = lpeg.match, lpeg.S, lpeg.C, lpeg.Ct
-- some functions may disappear as they are not used anywhere
@@ -63,196 +61,68 @@ if not string.split then
-- this will be overloaded by a faster lpeg variant
- function string:split(pattern)
- if #self > 0 then
- local t = { }
- for s in gmatch(self..pattern,"(.-)"..pattern) do
- t[#t+1] = s
+ function string.split(str,pattern)
+ local t = { }
+ if #str > 0 then
+ local n = 1
+ for s in gmatch(str..pattern,"(.-)"..pattern) do
+ t[n] = s
+ n = n + 1
end
- return t
- else
- return { }
end
+ return t
end
end
-local chr_to_esc = {
- ["%"] = "%%",
- ["."] = "%.",
- ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
- ["^"] = "%^", ["$"] = "%$",
- ["["] = "%[", ["]"] = "%]",
- ["("] = "%(", [")"] = "%)",
- ["{"] = "%{", ["}"] = "%}"
-}
-
-string.chr_to_esc = chr_to_esc
-
-function string:esc() -- variant 2
- return (gsub(self,"(.)",chr_to_esc))
-end
-
-function string:unquote()
- return (gsub(self,"^([\"\'])(.*)%1$","%2"))
+function string.unquoted(str)
+ return (gsub(str,"^([\"\'])(.*)%1$","%2"))
end
---~ function string:unquote()
---~ if find(self,"^[\'\"]") then
---~ return sub(self,2,-2)
---~ else
---~ return self
---~ end
---~ end
-function string:quote() -- we could use format("%q")
- return format("%q",self)
+function string.quoted(str)
+ return format("%q",str) -- always "
end
-function string:count(pattern) -- variant 3
+function string.count(str,pattern) -- variant 3
local n = 0
- for _ in gmatch(self,pattern) do
+ for _ in gmatch(str,pattern) do -- not for utf
n = n + 1
end
return n
end
-function string:limit(n,sentinel)
- if #self > n then
- sentinel = sentinel or " ..."
- return sub(self,1,(n-#sentinel)) .. sentinel
- else
- return self
- end
-end
-
---~ function string:strip() -- the .- is quite efficient
---~ -- return match(self,"^%s*(.-)%s*$") or ""
---~ -- return match(self,'^%s*(.*%S)') or '' -- posted on lua list
---~ return find(s,'^%s*$') and '' or match(s,'^%s*(.*%S)')
---~ end
-
-do -- roberto's variant:
- local space = lpeg.S(" \t\v\n")
- local nospace = 1 - space
- local stripper = space^0 * lpeg.C((space^0 * nospace^1)^0)
- function string.strip(str)
- return lpegmatch(stripper,str) or ""
- end
-end
-
-function string:is_empty()
- return not find(self,"%S")
-end
-
-function string:enhance(pattern,action)
- local ok, n = true, 0
- while ok do
- ok = false
- self = gsub(self,pattern, function(...)
- ok, n = true, n + 1
- return action(...)
- end)
- end
- return self, n
-end
-
-local chr_to_hex, hex_to_chr = { }, { }
-
-for i=0,255 do
- local c, h = char(i), format("%02X",i)
- chr_to_hex[c], hex_to_chr[h] = h, c
-end
-
-function string:to_hex()
- return (gsub(self or "","(.)",chr_to_hex))
-end
-
-function string:from_hex()
- return (gsub(self or "","(..)",hex_to_chr))
-end
-
-if not string.characters then
-
- local function nextchar(str, index)
- index = index + 1
- return (index <= #str) and index or nil, sub(str,index,index)
- end
- function string:characters()
- return nextchar, self, 0
- end
- local function nextbyte(str, index)
- index = index + 1
- return (index <= #str) and index or nil, byte(sub(str,index,index))
- end
- function string:bytes()
- return nextbyte, self, 0
- end
-
-end
-
--- we can use format for this (neg n)
-
-function string:rpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return self .. rep(chr or " ",m)
+function string.limit(str,n,sentinel) -- not utf proof
+ if #str > n then
+ sentinel = sentinel or "..."
+ return sub(str,1,(n-#sentinel)) .. sentinel
else
- return self
- end
-end
-
-function string:lpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return rep(chr or " ",m) .. self
- else
- return self
+ return str
end
end
-string.padd = string.rpadd
+local space = S(" \t\v\n")
+local nospace = 1 - space
+local stripper = space^0 * C((space^0 * nospace^1)^0) -- roberto's code
-function is_number(str) -- tonumber
- return find(str,"^[%-%+]?[%d]-%.?[%d+]$") == 1
+function string.strip(str)
+ return lpegmatch(stripper,str) or ""
end
---~ print(is_number("1"))
---~ print(is_number("1.1"))
---~ print(is_number(".1"))
---~ print(is_number("-0.1"))
---~ print(is_number("+0.1"))
---~ print(is_number("-.1"))
---~ print(is_number("+.1"))
-
-function string:split_settings() -- no {} handling, see l-aux for lpeg variant
- if find(self,"=") then
- local t = { }
- for k,v in gmatch(self,"(%a+)=([^%,]*)") do
- t[k] = v
- end
- return t
- else
- return nil
- end
+function string.is_empty(str)
+ return not find(str,"%S")
end
local patterns_escapes = {
- ["-"] = "%-",
- ["."] = "%.",
- ["+"] = "%+",
- ["*"] = "%*",
["%"] = "%%",
- ["("] = "%)",
- [")"] = "%)",
- ["["] = "%[",
- ["]"] = "%]",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%(", [")"] = "%)",
+ -- ["{"] = "%{", ["}"] = "%}"
+ -- ["^"] = "%^", ["$"] = "%$",
}
-function string:pattesc()
- return (gsub(self,".",patterns_escapes))
-end
-
local simple_escapes = {
["-"] = "%-",
["."] = "%.",
@@ -260,80 +130,30 @@ local simple_escapes = {
["*"] = ".*",
}
-function string:simpleesc()
- return (gsub(self,".",simple_escapes))
-end
-
-function string:tohash()
- local t = { }
- for s in gmatch(self,"([^, ]+)") do -- lpeg
- t[s] = true
- end
- return t
-end
-
-local pattern = lpeg.Ct(lpeg.C(1)^0)
-
-function string:totable()
- return lpegmatch(pattern,self)
+function string.escapedpattern(str,simple)
+ return (gsub(str,".",simple and simple_escapes or patterns_escapes))
end
---~ local t = {
---~ "1234567123456712345671234567",
---~ "a\tb\tc",
---~ "aa\tbb\tcc",
---~ "aaa\tbbb\tccc",
---~ "aaaa\tbbbb\tcccc",
---~ "aaaaa\tbbbbb\tccccc",
---~ "aaaaaa\tbbbbbb\tcccccc",
---~ }
---~ for k,v do
---~ print(string.tabtospace(t[k]))
---~ end
-
-function string.tabtospace(str,tab)
- -- we don't handle embedded newlines
- while true do
- local s = find(str,"\t")
- if s then
- if not tab then tab = 7 end -- only when found
- local d = tab-(s-1) % tab
- if d > 0 then
- str = gsub(str,"\t",rep(" ",d),1)
- else
- str = gsub(str,"\t","",1)
- end
+function string.topattern(str,lowercase,strict)
+ if str == "" then
+ return ".*"
+ else
+ str = gsub(str,".",simple_escapes)
+ if lowercase then
+ str = lower(str)
+ end
+ if strict then
+ return "^" .. str .. "$"
else
- break
+ return str
end
end
- return str
end
-function string:compactlong() -- strips newlines and leading spaces
- self = gsub(self,"[\n\r]+ *","")
- self = gsub(self,"^ *","")
- return self
-end
-
-function string:striplong() -- strips newlines and leading spaces
- self = gsub(self,"^%s*","")
- self = gsub(self,"[\n\r]+ *","\n")
- return self
-end
+-- obsolete names:
-function string:topattern(lowercase,strict)
- if lowercase then
- self = lower(self)
- end
- self = gsub(self,".",simple_escapes)
- if self == "" then
- self = ".*"
- elseif strict then
- self = "^" .. self .. "$"
- end
- return self
-end
+string.quote = string.quoted
+string.unquote = string.unquoted
end -- of closure
@@ -350,28 +170,75 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
local lpeg = require("lpeg")
+local type = type
+
+-- Beware, we predefine a bunch of patterns here and one reason for doing so
+-- is that we get consistent behaviour in some of the visualizers.
+
lpeg.patterns = lpeg.patterns or { } -- so that we can share
local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
-local match = lpeg.match
+local P, R, S, V, match = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.match
+local Ct, C, Cs, Cc = lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local lpegtype = lpeg.type
+
+local utfcharacters = string.utfcharacters
+local utfgmatch = unicode and unicode.utf8.gmatch
+
+local anything = P(1)
+local endofstring = P(-1)
+local alwaysmatched = P(true)
+
+patterns.anything = anything
+patterns.endofstring = endofstring
+patterns.beginofstring = alwaysmatched
+patterns.alwaysmatched = alwaysmatched
local digit, sign = R('09'), S('+-')
local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
-local utf8byte = R("\128\191")
+local newline = crlf + cr + lf
+local escaped = P("\\") * anything
+local squote = P("'")
+local dquote = P('"')
+local space = P(" ")
+
+local utfbom_32_be = P('\000\000\254\255')
+local utfbom_32_le = P('\255\254\000\000')
+local utfbom_16_be = P('\255\254')
+local utfbom_16_le = P('\254\255')
+local utfbom_8 = P('\239\187\191')
+local utfbom = utfbom_32_be + utfbom_32_le
+ + utfbom_16_be + utfbom_16_le
+ + utfbom_8
+local utftype = utfbom_32_be / "utf-32-be" + utfbom_32_le / "utf-32-le"
+ + utfbom_16_be / "utf-16-be" + utfbom_16_le / "utf-16-le"
+ + utfbom_8 / "utf-8" + alwaysmatched / "unknown"
+
+local utf8next = R("\128\191")
-patterns.utf8byte = utf8byte
patterns.utf8one = R("\000\127")
-patterns.utf8two = R("\194\223") * utf8byte
-patterns.utf8three = R("\224\239") * utf8byte * utf8byte
-patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+patterns.utf8two = R("\194\223") * utf8next
+patterns.utf8three = R("\224\239") * utf8next * utf8next
+patterns.utf8four = R("\240\244") * utf8next * utf8next * utf8next
+patterns.utfbom = utfbom
+patterns.utftype = utftype
+
+local utf8char = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+local validutf8char = utf8char^0 * endofstring * Cc(true) + Cc(false)
+
+patterns.utf8 = utf8char
+patterns.utf8char = utf8char
+patterns.validutf8 = validutf8char
+patterns.validutf8char = validutf8char
patterns.digit = digit
patterns.sign = sign
patterns.cardinal = sign^0 * digit^1
patterns.integer = sign^0 * digit^1
patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.cfloat = sign^0 * digit^0 * P(',') * digit^1
patterns.number = patterns.float + patterns.integer
+patterns.cnumber = patterns.cfloat + patterns.integer
patterns.oct = P("0") * R("07")^1
patterns.octal = patterns.oct
patterns.HEX = P("0x") * R("09","AF")^1
@@ -380,16 +247,42 @@ patterns.hexadecimal = P("0x") * R("09","AF","af")^1
patterns.lowercase = R("az")
patterns.uppercase = R("AZ")
patterns.letter = patterns.lowercase + patterns.uppercase
-patterns.space = S(" ")
+patterns.space = space
+patterns.tab = P("\t")
+patterns.spaceortab = patterns.space + patterns.tab
patterns.eol = S("\n\r")
patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-patterns.newline = crlf + cr + lf
-patterns.nonspace = 1 - patterns.space
+patterns.newline = newline
+patterns.emptyline = newline^1
patterns.nonspacer = 1 - patterns.spacer
patterns.whitespace = patterns.eol + patterns.spacer
patterns.nonwhitespace = 1 - patterns.whitespace
-patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
-patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
+patterns.equal = P("=")
+patterns.comma = P(",")
+patterns.commaspacer = P(",") * patterns.spacer^0
+patterns.period = P(".")
+patterns.colon = P(":")
+patterns.semicolon = P(";")
+patterns.underscore = P("_")
+patterns.escaped = escaped
+patterns.squote = squote
+patterns.dquote = dquote
+patterns.nosquote = (escaped + (1-squote))^0
+patterns.nodquote = (escaped + (1-dquote))^0
+patterns.unsingle = (squote/"") * patterns.nosquote * (squote/"")
+patterns.undouble = (dquote/"") * patterns.nodquote * (dquote/"")
+patterns.unquoted = patterns.undouble + patterns.unsingle -- more often undouble
+patterns.unspacer = ((patterns.spacer^1)/"")^0
+
+patterns.somecontent = (anything - newline - space)^1 -- (utf8char - newline - space)^1
+patterns.beginline = #(1-newline)
+
+local unquoted = Cs(patterns.unquoted * endofstring) -- not C
+
+function string.unquoted(str)
+ return match(unquoted,str) or str
+end
+
function lpeg.anywhere(pattern) --slightly adapted from website
return P { P(pattern) + 1 * V(1) } -- why so complex?
@@ -399,36 +292,18 @@ function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
-local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
-local empty = spacing * Cc("")
-local nonempty = Cs((1-spacing)^1) * spacing^-1
-local content = (empty + nonempty)^1
-
-local capture = Ct(content^0)
-
-function string:splitlines()
- return match(capture,self)
-end
-
-patterns.textline = content
-
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps")) -- oeps
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps")) -- oeps
-
local splitters_s, splitters_m = { }, { }
local function splitat(separator,single)
local splitter = (single and splitters_s[separator]) or splitters_m[separator]
if not splitter then
separator = P(separator)
+ local other = C((1 - separator)^0)
if single then
- local other, any = C((1 - separator)^0), P(1)
+ local any = anything
splitter = other * (separator * C(any^0) + "") -- ?
splitters_s[separator] = splitter
else
- local other = C((1 - separator)^0)
splitter = other * (separator * other)^0
splitters_m[separator] = splitter
end
@@ -438,6 +313,7 @@ end
lpeg.splitat = splitat
+
local cache = { }
function lpeg.split(separator,str)
@@ -449,16 +325,39 @@ function lpeg.split(separator,str)
return match(c,str)
end
-function string:split(separator)
+function string.split(str,separator)
local c = cache[separator]
if not c then
c = Ct(splitat(separator))
cache[separator] = c
end
- return match(c,self)
+ return match(c,str)
+end
+
+local spacing = patterns.spacer^0 * newline -- sort of strip
+local empty = spacing * Cc("")
+local nonempty = Cs((1-spacing)^1) * spacing^-1
+local content = (empty + nonempty)^1
+
+patterns.textline = content
+
+
+local linesplitter = Ct(splitat(newline))
+
+patterns.linesplitter = linesplitter
+
+function string.splitlines(str)
+ return match(linesplitter,str)
+end
+
+local utflinesplitter = utfbom^-1 * Ct(splitat(newline))
+
+patterns.utflinesplitter = utflinesplitter
+
+function string.utfsplitlines(str)
+ return match(utflinesplitter,str)
end
-lpeg.splitters = cache
local cache = { }
@@ -466,37 +365,24 @@ function lpeg.checkedsplit(separator,str)
local c = cache[separator]
if not c then
separator = P(separator)
- local other = C((1 - separator)^0)
+ local other = C((1 - separator)^1)
c = Ct(separator^0 * other * (separator^1 * other)^0)
cache[separator] = c
end
return match(c,str)
end
-function string:checkedsplit(separator)
+function string.checkedsplit(str,separator)
local c = cache[separator]
if not c then
separator = P(separator)
- local other = C((1 - separator)^0)
+ local other = C((1 - separator)^1)
c = Ct(separator^0 * other * (separator^1 * other)^0)
cache[separator] = c
end
- return match(c,self)
+ return match(c,str)
end
---~ function lpeg.append(list,pp)
---~ local p = pp
---~ for l=1,#list do
---~ if p then
---~ p = p + P(list[l])
---~ else
---~ p = P(list[l])
---~ end
---~ end
---~ return p
---~ end
-
---~ from roberto's site:
local f1 = string.byte
@@ -504,7 +390,273 @@ local function f2(s) local c1, c2 = f1(s,1,2) return c1 * 64 + c2
local function f3(s) local c1, c2, c3 = f1(s,1,3) return (c1 * 64 + c2) * 64 + c3 - 925824 end
local function f4(s) local c1, c2, c3, c4 = f1(s,1,4) return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168 end
-patterns.utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
+local utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
+
+patterns.utf8byte = utf8byte
+
+
+
+local cache = { }
+
+function lpeg.stripper(str)
+ if type(str) == "string" then
+ local s = cache[str]
+ if not s then
+ s = Cs(((S(str)^1)/"" + 1)^0)
+ cache[str] = s
+ end
+ return s
+ else
+ return Cs(((str^1)/"" + 1)^0)
+ end
+end
+
+local cache = { }
+
+function lpeg.keeper(str)
+ if type(str) == "string" then
+ local s = cache[str]
+ if not s then
+ s = Cs((((1-S(str))^1)/"" + 1)^0)
+ cache[str] = s
+ end
+ return s
+ else
+ return Cs((((1-str)^1)/"" + 1)^0)
+ end
+end
+
+function lpeg.frontstripper(str) -- or pattern (yet undocumented)
+ return (P(str) + P(true)) * Cs(P(1)^0)
+end
+
+function lpeg.endstripper(str) -- or pattern (yet undocumented)
+ return Cs((1 - P(str) * P(-1))^0)
+end
+
+-- Just for fun I looked at the used bytecode and
+-- p = (p and p + pp) or pp gets one more (testset).
+
+function lpeg.replacer(one,two)
+ if type(one) == "table" then
+ local no = #one
+ if no > 0 then
+ local p
+ for i=1,no do
+ local o = one[i]
+ local pp = P(o[1]) / o[2]
+ if p then
+ p = p + pp
+ else
+ p = pp
+ end
+ end
+ return Cs((p + 1)^0)
+ end
+ else
+ two = two or ""
+ return Cs((P(one)/two + 1)^0)
+ end
+end
+
+local splitters_f, splitters_s = { }, { }
+
+function lpeg.firstofsplit(separator) -- always return value
+ local splitter = splitters_f[separator]
+ if not splitter then
+ separator = P(separator)
+ splitter = C((1 - separator)^0)
+ splitters_f[separator] = splitter
+ end
+ return splitter
+end
+
+function lpeg.secondofsplit(separator) -- nil if not split
+ local splitter = splitters_s[separator]
+ if not splitter then
+ separator = P(separator)
+ splitter = (1 - separator)^0 * separator * C(anything^0)
+ splitters_s[separator] = splitter
+ end
+ return splitter
+end
+
+function lpeg.balancer(left,right)
+ left, right = P(left), P(right)
+ return P { left * ((1 - left - right) + V(1))^0 * right }
+end
+
+
+
+local nany = utf8char/""
+
+function lpeg.counter(pattern)
+ pattern = Cs((P(pattern)/" " + nany)^0)
+ return function(str)
+ return #match(pattern,str)
+ end
+end
+
+if utfgmatch then
+
+ function lpeg.count(str,what) -- replaces string.count
+ if type(what) == "string" then
+ local n = 0
+ for _ in utfgmatch(str,what) do
+ n = n + 1
+ end
+ return n
+ else -- 4 times slower but still faster than / function
+ return #match(Cs((P(what)/" " + nany)^0),str)
+ end
+ end
+
+else
+
+ local cache = { }
+
+ function lpeg.count(str,what) -- replaces string.count
+ if type(what) == "string" then
+ local p = cache[what]
+ if not p then
+ p = Cs((P(what)/" " + nany)^0)
+ cache[p] = p
+ end
+ return #match(p,str)
+ else -- 4 times slower but still faster than / function
+ return #match(Cs((P(what)/" " + nany)^0),str)
+ end
+ end
+
+end
+
+local patterns_escapes = { -- also defines in l-string
+ ["%"] = "%%",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%)", [")"] = "%)",
+ -- ["{"] = "%{", ["}"] = "%}"
+ -- ["^"] = "%^", ["$"] = "%$",
+}
+
+local simple_escapes = { -- also defines in l-string
+ ["-"] = "%-",
+ ["."] = "%.",
+ ["?"] = ".",
+ ["*"] = ".*",
+}
+
+local p = Cs((S("-.+*%()[]") / patterns_escapes + anything)^0)
+local s = Cs((S("-.+*%()[]") / simple_escapes + anything)^0)
+
+function string.escapedpattern(str,simple)
+ return match(simple and s or p,str)
+end
+
+-- utf extensies
+
+lpeg.UP = lpeg.P
+
+if utfcharacters then
+
+ function lpeg.US(str)
+ local p
+ for uc in utfcharacters(str) do
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ return p
+ end
+
+
+elseif utfgmatch then
+
+ function lpeg.US(str)
+ local p
+ for uc in utfgmatch(str,".") do
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ return p
+ end
+
+else
+
+ function lpeg.US(str)
+ local p
+ local f = function(uc)
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ match((utf8char/f)^0,str)
+ return p
+ end
+
+end
+
+local range = Cs(utf8byte) * (Cs(utf8byte) + Cc(false))
+
+local utfchar = unicode and unicode.utf8 and unicode.utf8.char
+
+function lpeg.UR(str,more)
+ local first, last
+ if type(str) == "number" then
+ first = str
+ last = more or first
+ else
+ first, last = match(range,str)
+ if not last then
+ return P(str)
+ end
+ end
+ if first == last then
+ return P(str)
+ elseif utfchar and last - first < 8 then -- a somewhat arbitrary criterium
+ local p
+ for i=first,last do
+ if p then
+ p = p + P(utfchar(i))
+ else
+ p = P(utfchar(i))
+ end
+ end
+ return p -- nil when invalid range
+ else
+ local f = function(b)
+ return b >= first and b <= last
+ end
+ return utf8byte / f -- nil when invalid range
+ end
+end
+
+
+
+function lpeg.oneof(list,...) -- lpeg.oneof("elseif","else","if","then")
+ if type(list) ~= "table" then
+ list = { list, ... }
+ end
+ -- sort(list) -- longest match first
+ local p = P(list[1])
+ for l=2,#list do
+ p = p + P(list[l])
+ end
+ return p
+end
+
+function lpeg.is_lpeg(p)
+ return p and lpegtype(p) == "pattern"
+end
+
end -- of closure
@@ -519,12 +671,10 @@ if not modules then modules = { } end modules ['l-table'] = {
license = "see context related readme files"
}
-table.join = table.concat
-
+local type, next, tostring, tonumber, ipairs, table, string = type, next, tostring, tonumber, ipairs, table, string
local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove
local format, find, gsub, lower, dump, match = string.format, string.find, string.gsub, string.lower, string.dump, string.match
local getmetatable, setmetatable = getmetatable, setmetatable
-local type, next, tostring, tonumber, ipairs = type, next, tostring, tonumber, ipairs
-- Starting with version 5.2 Lua no longer provide ipairs, which makes
-- sense. As we already used the for loop and # in most places the
@@ -576,50 +726,56 @@ end
-- extra functions, some might go (when not used)
function table.strip(tab)
- local lst = { }
+ local lst, l = { }, 0
for i=1,#tab do
local s = gsub(tab[i],"^%s*(.-)%s*$","%1")
if s == "" then
-- skip this one
else
- lst[#lst+1] = s
+ l = l + 1
+ lst[l] = s
end
end
return lst
end
function table.keys(t)
- local k = { }
+ local keys, k = { }, 0
for key, _ in next, t do
- k[#k+1] = key
+ k = k + 1
+ keys[k] = key
end
- return k
+ return keys
end
local function compare(a,b)
- return (tostring(a) < tostring(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)
+ end
end
local function sortedkeys(tab)
- local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
+ local srt, category, s = { }, 0, 0 -- 0=unknown 1=string, 2=number 3=mixed
for key,_ in next, tab do
- srt[#srt+1] = key
- if kind == 3 then
+ s = s + 1
+ srt[s] = key
+ if category == 3 then
-- no further check
else
local tkey = type(key)
if tkey == "string" then
- -- if kind == 2 then kind = 3 else kind = 1 end
- kind = (kind == 2 and 3) or 1
+ category = (category == 2 and 3) or 1
elseif tkey == "number" then
- -- if kind == 1 then kind = 3 else kind = 2 end
- kind = (kind == 1 and 3) or 2
+ category = (category == 1 and 3) or 2
else
- kind = 3
+ category = 3
end
end
end
- if kind == 0 or kind == 3 then
+ if category == 0 or category == 3 then
sort(srt,compare)
else
sort(srt)
@@ -628,9 +784,12 @@ local function sortedkeys(tab)
end
local function sortedhashkeys(tab) -- fast one
- local srt = { }
+ local srt, s = { }, 0
for key,_ in next, tab do
- srt[#srt+1] = key
+ if key then
+ s= s + 1
+ srt[s] = key
+ end
end
sort(srt)
return srt
@@ -639,34 +798,50 @@ end
table.sortedkeys = sortedkeys
table.sortedhashkeys = sortedhashkeys
-function table.sortedhash(t)
- local s = sortedhashkeys(t) -- maybe just sortedkeys
- local n = 0
- local function kv(s)
- n = n + 1
- local k = s[n]
- return k, t[k]
+local function nothing() end
+
+local function sortedhash(t)
+ if t then
+ local n, s = 0, sortedkeys(t) -- the robust one
+ local function kv(s)
+ n = n + 1
+ local k = s[n]
+ return k, t[k]
+ end
+ return kv, s
+ else
+ return nothing
end
- return kv, s
end
-table.sortedpairs = table.sortedhash
+table.sortedhash = sortedhash
+table.sortedpairs = sortedhash
function table.append(t, list)
- for _,v in next, list do
- insert(t,v)
+ local n = #t
+ for i=1,#list do
+ n = n + 1
+ t[n] = list[i]
end
+ return t
end
function table.prepend(t, list)
- for k,v in next, list do
- insert(t,k,v)
+ local nl = #list
+ local nt = nl + #t
+ for i=#t,1,-1 do
+ t[nt] = t[i]
+ nt = nt - 1
+ end
+ for i=1,#list do
+ t[i] = list[i]
end
+ return t
end
function table.merge(t, ...) -- first one is target
- t = t or {}
- local lst = {...}
+ t = t or { }
+ local lst = { ... }
for i=1,#lst do
for k, v in next, lst[i] do
t[k] = v
@@ -676,7 +851,7 @@ function table.merge(t, ...) -- first one is target
end
function table.merged(...)
- local tmp, lst = { }, {...}
+ local tmp, lst = { }, { ... }
for i=1,#lst do
for k, v in next, lst[i] do
tmp[k] = v
@@ -686,41 +861,45 @@ function table.merged(...)
end
function table.imerge(t, ...)
- local lst = {...}
+ local lst, nt = { ... }, #t
for i=1,#lst do
local nst = lst[i]
for j=1,#nst do
- t[#t+1] = nst[j]
+ nt = nt + 1
+ t[nt] = nst[j]
end
end
return t
end
function table.imerged(...)
- local tmp, lst = { }, {...}
+ local tmp, ntmp, lst = { }, 0, {...}
for i=1,#lst do
local nst = lst[i]
for j=1,#nst do
- tmp[#tmp+1] = nst[j]
+ ntmp = ntmp + 1
+ tmp[ntmp] = nst[j]
end
end
return tmp
end
-local function fastcopy(old) -- fast one
+local function fastcopy(old,metatabletoo) -- fast one
if old then
local new = { }
for k,v in next, old do
if type(v) == "table" then
- new[k] = fastcopy(v) -- was just table.copy
+ new[k] = fastcopy(v,metatabletoo) -- was just table.copy
else
new[k] = v
end
end
- -- optional second arg
- local mt = getmetatable(old)
- if mt then
- setmetatable(new,mt)
+ if metatabletoo then
+ -- optional second arg
+ local mt = getmetatable(old)
+ if mt then
+ setmetatable(new,mt)
+ end
end
return new
else
@@ -728,6 +907,8 @@ local function fastcopy(old) -- fast one
end
end
+-- todo : copy without metatable
+
local function copy(t, tables) -- taken from lua wiki, slightly adapted
tables = tables or { }
local tcopy = {}
@@ -760,33 +941,14 @@ end
table.fastcopy = fastcopy
table.copy = copy
--- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
-
-function table.sub(t,i,j)
- return { unpack(t,i,j) }
-end
-
-function table.replace(a,b)
- for k,v in next, b do
- a[k] = v
+function table.derive(parent)
+ local child = { }
+ if parent then
+ setmetatable(child,{ __index = parent })
end
+ return child
end
--- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice)
-
-function table.is_empty(t) -- obolete, use inline code instead
- return not t or not next(t)
-end
-
-function table.one_entry(t) -- obolete, use inline code instead
- local n = next(t)
- return n and not next(t,n)
-end
-
---~ function table.starts_at(t) -- obsolete, not nice anyway
---~ return ipairs(t,1)(t,0)
---~ end
-
function table.tohash(t,value)
local h = { }
if t then
@@ -799,27 +961,19 @@ function table.tohash(t,value)
end
function table.fromhash(t)
- local h = { }
+ local hsh, h = { }, 0
for k, v in next, t do -- no ipairs here
- if v then h[#h+1] = k end
+ if v then
+ h = h + 1
+ hsh[h] = k
+ end
end
- return h
+ return hsh
end
---~ print(table.serialize(t), "\n")
---~ print(table.serialize(t,"name"), "\n")
---~ print(table.serialize(t,false), "\n")
---~ print(table.serialize(t,true), "\n")
---~ print(table.serialize(t,"name",true), "\n")
---~ print(table.serialize(t,"name",true,true), "\n")
-
-table.serialize_functions = true
-table.serialize_compact = true
-table.serialize_inline = true
-
local noquotes, hexify, handle, reduce, compact, inline, functions
-local reserved = table.tohash { -- intercept a language flaw, no reserved words as key
+local reserved = table.tohash { -- intercept a language inconvenience: no reserved words as key
'and', 'break', 'do', 'else', 'elseif', 'end', 'false', 'for', 'function', 'if',
'in', 'local', 'nil', 'not', 'or', 'repeat', 'return', 'then', 'true', 'until', 'while',
}
@@ -831,20 +985,23 @@ local function simple_table(t)
n = n + 1
end
if n == #t then
- local tt = { }
+ local tt, nt = { }, 0
for i=1,#t do
local v = t[i]
local tv = type(v)
if tv == "number" then
+ nt = nt + 1
if hexify then
- tt[#tt+1] = format("0x%04X",v)
+ tt[nt] = format("0x%04X",v)
else
- tt[#tt+1] = tostring(v) -- tostring not needed
+ tt[nt] = tostring(v) -- tostring not needed
end
elseif tv == "boolean" then
- tt[#tt+1] = tostring(v)
+ nt = nt + 1
+ tt[nt] = tostring(v)
elseif tv == "string" then
- tt[#tt+1] = format("%q",v)
+ nt = nt + 1
+ tt[nt] = format("%q",v)
else
tt = nil
break
@@ -870,21 +1027,25 @@ local function do_serialize(root,name,depth,level,indexed)
depth = depth .. " "
if indexed then
handle(format("%s{",depth))
- elseif name then
- --~ handle(format("%s%s={",depth,key(name)))
- if type(name) == "number" then -- or find(k,"^%d+$") then
+ else
+ local tn = type(name)
+ if tn == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s[0x%04X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
- elseif noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
- handle(format("%s%s={",depth,name))
+ elseif tn == "string" then
+ if noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
+ handle(format("%s%s={",depth,name))
+ else
+ handle(format("%s[%q]={",depth,name))
+ end
+ elseif tn == "boolean" then
+ handle(format("%s[%s]={",depth,tostring(name)))
else
- handle(format("%s[%q]={",depth,name))
+ handle(format("%s{",depth))
end
- else
- handle(format("%s{",depth))
end
end
-- we could check for k (index) being number (cardinal)
@@ -901,11 +1062,9 @@ local function do_serialize(root,name,depth,level,indexed)
for i=1,#sk do
local k = sk[i]
local v = root[k]
- --~ if v == root then
- -- circular
- --~ else
- local t = type(v)
- if compact and first and type(k) == "number" and k >= first and k <= last then
+ -- circular
+ local t, tk = type(v), type(k)
+ if compact and first and tk == "number" and k >= first and k <= last then
if t == "number" then
if hexify then
handle(format("%s 0x%04X,",depth,v))
@@ -947,17 +1106,18 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s __p__=nil,",depth))
end
elseif t == "number" then
- --~ if hexify then
- --~ handle(format("%s %s=0x%04X,",depth,key(k),v))
- --~ else
- --~ handle(format("%s %s=%s,",depth,key(k),v)) -- %.99g
- --~ end
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=0x%04X,",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,tostring(k),v))
+ else
+ handle(format("%s [%s]=%s,",depth,tostring(k),v)) -- %.99g
+ end
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
if hexify then
handle(format("%s %s=0x%04X,",depth,k,v))
@@ -973,26 +1133,28 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "string" then
if reduce and tonumber(v) then
- --~ handle(format("%s %s=%s,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=%s,",depth,tostring(k),v))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%s,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
else
- --~ handle(format("%s %s=%q,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=%q,",depth,tostring(k),v))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%q,",depth,k,v))
else
@@ -1001,13 +1163,14 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "table" then
if not next(v) then
- --~ handle(format("%s %s={},",depth,key(k)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]={},",depth,tostring(k)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s={},",depth,k))
else
@@ -1016,13 +1179,14 @@ local function do_serialize(root,name,depth,level,indexed)
elseif inline then
local st = simple_table(v)
if st then
- --~ handle(format("%s %s={ %s },",depth,key(k),concat(st,", ")))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]={ %s },",depth,tostring(k),concat(st,", ")))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s={ %s },",depth,k,concat(st,", ")))
else
@@ -1035,13 +1199,14 @@ local function do_serialize(root,name,depth,level,indexed)
do_serialize(v,k,depth,level+1)
end
elseif t == "boolean" then
- --~ handle(format("%s %s=%s,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%s,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%s,",depth,k,tostring(v)))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]=%s,",depth,tostring(k),tostring(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%s,",depth,k,tostring(v)))
else
@@ -1049,35 +1214,37 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "function" then
if functions then
- --~ handle(format('%s %s=loadstring(%q),',depth,key(k),dump(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v)))
else
handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v)))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=loadstring(%q),",depth,tostring(k),dump(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=loadstring(%q),",depth,k,dump(v)))
else
- handle(format("%s [%q]=loadstring(%q),",depth,k,dump(v)))
+ -- handle(format("%s [%q]=loadstring(%q),",depth,k,dump(v)))
+ handle(format("%s [%q]=loadstring(%q),",depth,k,debug.getinfo(v).what == "C" and "C code" or dump(v)))
end
end
else
- --~ handle(format("%s %s=%q,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]=%q,",depth,tostring(k),tostring(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%q,",depth,k,tostring(v)))
else
handle(format("%s [%q]=%q,",depth,k,tostring(v)))
end
end
- --~ end
- end
+ end
end
if level > 0 then
handle(format("%s},",depth))
@@ -1087,15 +1254,34 @@ end
-- replacing handle by a direct t[#t+1] = ... (plus test) is not much
-- faster (0.03 on 1.00 for zapfino.tma)
-local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
- noquotes = _noquotes
- hexify = _hexify
- handle = _handle or print
- reduce = _reduce or false
- compact = table.serialize_compact
- inline = compact and table.serialize_inline
- functions = table.serialize_functions
+local function serialize(_handle,root,name,specification) -- handle wins
local tname = type(name)
+ if type(specification) == "table" then
+ noquotes = specification.noquotes
+ hexify = specification.hexify
+ handle = _handle or specification.handle or print
+ reduce = specification.reduce or false
+ functions = specification.functions
+ compact = specification.compact
+ inline = specification.inline and compact
+ if functions == nil then
+ functions = true
+ end
+ if compact == nil then
+ compact = true
+ end
+ if inline == nil then
+ inline = compact
+ end
+ else
+ noquotes = false
+ hexify = false
+ handle = _handle or print
+ reduce = false
+ compact = true
+ inline = true
+ functions = true
+ end
if tname == "string" then
if name == "return" then
handle("return {")
@@ -1117,33 +1303,33 @@ local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
else
handle("t={")
end
- if root and next(root) then
- do_serialize(root,name,"",0,indexed)
+ if root then
+ -- The dummy access will initialize a table that has a delayed initialization
+ -- using a metatable. (maybe explicitly test for metatable)
+ if getmetatable(root) then -- todo: make this an option, maybe even per subtable
+ local dummy = root._w_h_a_t_e_v_e_r_
+ root._w_h_a_t_e_v_e_r_ = nil
+ end
+ -- Let's forget about empty tables.
+ if next(root) then
+ do_serialize(root,name,"",0)
+ end
end
handle("}")
end
---~ name:
---~
---~ true : return { }
---~ false : { }
---~ nil : t = { }
---~ string : string = { }
---~ 'return' : return { }
---~ number : [number] = { }
-function table.serialize(root,name,reduce,noquotes,hexify)
- local t = { }
+function table.serialize(root,name,specification)
+ local t, n = { }, 0
local function flush(s)
- t[#t+1] = s
+ n = n + 1
+ t[n] = s
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
return concat(t,"\n")
end
-function table.tohandle(handle,root,name,reduce,noquotes,hexify)
- serialize(root,name,handle,reduce,noquotes,hexify)
-end
+table.tohandle = serialize
-- sometimes tables are real use (zapfino extra pro is some 85M) in which
-- case a stepwise serialization is nice; actually, we could consider:
@@ -1154,73 +1340,63 @@ end
--
-- so this is on the todo list
-table.tofile_maxtab = 2*1024
+local maxtab = 2*1024
-function table.tofile(filename,root,name,reduce,noquotes,hexify)
+function table.tofile(filename,root,name,specification)
local f = io.open(filename,'w')
if f then
- local maxtab = table.tofile_maxtab
if maxtab > 1 then
- local t = { }
+ local t, n = { }, 0
local function flush(s)
- t[#t+1] = s
- if #t > maxtab then
+ n = n + 1
+ t[n] = s
+ if n > maxtab then
f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
- t = { }
+ t, n = { }, 0 -- we could recycle t if needed
end
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
f:write(concat(t,"\n"),"\n")
else
local function flush(s)
f:write(s,"\n")
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
end
f:close()
+ io.flush()
end
end
-local function flatten(t,f,complete) -- is this used? meybe a variant with next, ...
- for i=1,#t do
- local v = t[i]
- if type(v) == "table" then
- if complete or type(v[1]) == "table" then
- flatten(v,f,complete)
+local function flattened(t,f,depth)
+ if f == nil then
+ f = { }
+ depth = 0xFFFF
+ elseif tonumber(f) then
+ -- assume then only two arguments are given
+ depth = f
+ f = { }
+ elseif not depth then
+ depth = 0xFFFF
+ end
+ for k, v in next, t do
+ if type(k) ~= "number" then
+ if depth > 0 and type(v) == "table" then
+ flattened(v,f,depth-1)
else
- f[#f+1] = v
+ f[k] = v
end
- else
- f[#f+1] = v
end
end
-end
-
-function table.flatten(t)
- local f = { }
- flatten(t,f,true)
- return f
-end
-
-function table.unnest(t) -- bad name
- local f = { }
- flatten(t,f,false)
- return f
-end
-
-table.flatten_one_level = table.unnest
-
--- a better one:
-
-local function flattened(t,f)
- if not f then
- f = { }
- end
- for k, v in next, t do
- if type(v) == "table" then
- flattened(v,f)
+ local n = #f
+ for k=1,#t do
+ local v = t[k]
+ if depth > 0 and type(v) == "table" then
+ flattened(v,f,depth-1)
+ n = #f
else
- f[k] = v
+ n = n + 1
+ f[n] = v
end
end
return f
@@ -1228,49 +1404,27 @@ end
table.flattened = flattened
--- the next three may disappear
-
-function table.remove_value(t,value) -- todo: n
- if value then
- for i=1,#t do
- if t[i] == value then
- remove(t,i)
- -- remove all, so no: return
- end
- end
+local function unnest(t,f) -- only used in mk, for old times sake
+ if not f then -- and only relevant for token lists
+ f = { }
end
-end
-
-function table.insert_before_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i,str)
- return
- end
+ for i=1,#t do
+ local v = t[i]
+ if type(v) == "table" then
+ if type(v[1]) == "table" then
+ unnest(v,f)
+ else
+ f[#f+1] = v
end
+ else
+ f[#f+1] = v
end
- insert(t,1,str)
- elseif value then
- insert(t,1,value)
end
+ return f
end
-function table.insert_after_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,str)
- return
- end
- end
- end
- t[#t+1] = str
- elseif value then
- t[#t+1] = value
- end
+function table.unnest(t) -- bad name
+ return unnest(t)
end
local function are_equal(a,b,n,m) -- indexed
@@ -1297,7 +1451,7 @@ end
local function identical(a,b) -- assumes same structure
for ka, va in next, a do
- local vb = b[k]
+ local vb = b[ka]
if va == vb then
-- same
elseif type(va) == "table" and type(vb) == "table" then
@@ -1311,8 +1465,8 @@ local function identical(a,b) -- assumes same structure
return true
end
-table.are_equal = are_equal
table.identical = identical
+table.are_equal = are_equal
-- maybe also make a combined one
@@ -1338,89 +1492,84 @@ function table.contains(t, v)
end
function table.count(t)
- local n, e = 0, next(t)
- while e do
- n, e = n + 1, next(t,e)
+ local n = 0
+ for k, v in next, t do
+ n = n + 1
end
return n
end
-function table.swapped(t)
- local s = { }
+function table.swapped(t,s) -- hash
+ local n = { }
+ if s then
+ for k, v in next, s do
+ n[k] = v
+ end
+ end
for k, v in next, t do
- s[v] = k
+ n[v] = k
end
- return s
+ return n
end
---~ function table.are_equal(a,b)
---~ return table.serialize(a) == table.serialize(b)
---~ end
-
-function table.clone(t,p) -- t is optional or nil or table
- if not p then
- t, p = { }, t or { }
- elseif not t then
- t = { }
+function table.reversed(t)
+ if t then
+ local tt, tn = { }, #t
+ if tn > 0 then
+ local ttn = 0
+ for i=tn,1,-1 do
+ ttn = ttn + 1
+ tt[ttn] = t[i]
+ end
+ end
+ return tt
end
- setmetatable(t, { __index = function(_,key) return p[key] end }) -- why not __index = p ?
- return t
-end
-
-function table.hexed(t,seperator)
- local tt = { }
- for i=1,#t do tt[i] = format("0x%04X",t[i]) end
- return concat(tt,seperator or " ")
end
-function table.reverse_hash(h)
- local r = { }
- for k,v in next, h do
- r[v] = lower(gsub(k," ",""))
+function table.sequenced(t,sep,simple) -- hash only
+ local s, n = { }, 0
+ for k, v in sortedhash(t) do
+ if simple then
+ if v == true then
+ n = n + 1
+ s[n] = k
+ elseif v and v~= "" then
+ n = n + 1
+ s[n] = k .. "=" .. tostring(v)
+ end
+ else
+ n = n + 1
+ s[n] = k .. "=" .. tostring(v)
+ end
end
- return r
+ return concat(s, sep or " | ")
end
-function table.reverse(t)
- local tt = { }
- if #t > 0 then
- for i=#t,1,-1 do
- tt[#tt+1] = t[i]
- end
+function table.print(t,...)
+ if type(t) ~= "table" then
+ print(tostring(t))
+ else
+ table.tohandle(print,t,...)
end
- return tt
end
-function table.insert_before_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i,extra)
- return
- end
- end
- insert(t,1,extra)
+-- -- -- obsolete but we keep them for a while and might comment them later -- -- --
+
+-- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
+
+function table.sub(t,i,j)
+ return { unpack(t,i,j) }
end
-function table.insert_after_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,extra)
- return
- end
- end
- insert(t,#t+1,extra)
+-- 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)
end
+function table.has_one_entry(t)
+ return t and not next(t,next(t))
+end
end -- of closure
@@ -1435,7 +1584,10 @@ if not modules then modules = { } end modules ['l-io'] = {
license = "see context related readme files"
}
-local byte, find, gsub = string.byte, string.find, string.gsub
+local io = io
+local byte, find, gsub, format = string.byte, string.find, string.gsub, string.format
+local concat = table.concat
+local type = type
if string.find(os.getenv("PATH"),";") then
io.fileseparator, io.pathseparator = "\\", ";"
@@ -1446,9 +1598,7 @@ end
function io.loaddata(filename,textmode)
local f = io.open(filename,(textmode and 'r') or 'rb')
if f then
- -- collectgarbage("step") -- sometimes makes a big difference in mem consumption
local data = f:read('*all')
- -- garbagecollector.check(data)
f:close()
return data
else
@@ -1460,13 +1610,14 @@ function io.savedata(filename,data,joiner)
local f = io.open(filename,"wb")
if f then
if type(data) == "table" then
- f:write(table.join(data,joiner or ""))
+ f:write(concat(data,joiner or ""))
elseif type(data) == "function" then
data(f)
else
f:write(data or "")
end
f:close()
+ io.flush()
return true
else
return false
@@ -1495,12 +1646,19 @@ function io.size(filename)
end
function io.noflines(f)
- local n = 0
- for _ in f:lines() do
- n = n + 1
+ if type(f) == "string" then
+ local f = io.open(filename)
+ local n = f and io.noflines(f) or 0
+ assert(f:close())
+ return n
+ else
+ local n = 0
+ for _ in f:lines() do
+ n = n + 1
+ end
+ f:seek('set',0)
+ return n
end
- f:seek('set',0)
- return n
end
local nextchar = {
@@ -1526,8 +1684,6 @@ local nextchar = {
function io.characters(f,n)
if f then
return nextchar[n or 1], f
- else
- return nil, nil
end
end
@@ -1536,40 +1692,42 @@ local nextbyte = {
local a, b, c, d = f:read(1,1,1,1)
if d then
return byte(a), byte(b), byte(c), byte(d)
- else
- return nil, nil, nil, nil
+ end
+ end,
+ [3] = function(f)
+ local a, b, c = f:read(1,1,1)
+ if b then
+ return byte(a), byte(b), byte(c)
end
end,
[2] = function(f)
local a, b = f:read(1,1)
if b then
return byte(a), byte(b)
- else
- return nil, nil
end
end,
[1] = function (f)
local a = f:read(1)
if a then
return byte(a)
- else
- return nil
end
end,
[-2] = function (f)
local a, b = f:read(1,1)
if b then
return byte(b), byte(a)
- else
- return nil, nil
+ end
+ end,
+ [-3] = function(f)
+ local a, b, c = f:read(1,1,1)
+ if b then
+ return byte(c), byte(b), byte(a)
end
end,
[-4] = function(f)
local a, b, c, d = f:read(1,1,1,1)
if d then
return byte(d), byte(c), byte(b), byte(a)
- else
- return nil, nil, nil, nil
end
end
}
@@ -1586,12 +1744,13 @@ function io.ask(question,default,options)
while true do
io.write(question)
if options then
- io.write(string.format(" [%s]",table.concat(options,"|")))
+ io.write(format(" [%s]",concat(options,"|")))
end
if default then
- io.write(string.format(" [%s]",default))
+ io.write(format(" [%s]",default))
end
- io.write(string.format(" "))
+ io.write(format(" "))
+ io.flush()
local answer = io.read()
answer = gsub(answer,"^%s*(.*)%s*$","%1")
if answer == "" and default then
@@ -1615,6 +1774,63 @@ function io.ask(question,default,options)
end
end
+local function readnumber(f,n,m)
+ if m then
+ f:seek("set",n)
+ n = m
+ end
+ if n == 1 then
+ return byte(f:read(1))
+ elseif n == 2 then
+ local a, b = byte(f:read(2),1,2)
+ return 256 * a + b
+ elseif n == 3 then
+ local a, b, c = byte(f:read(3),1,3)
+ return 256*256 * a + 256 * b + c
+ elseif n == 4 then
+ local a, b, c, d = byte(f:read(4),1,4)
+ return 256*256*256 * a + 256*256 * b + 256 * c + d
+ elseif n == 8 then
+ local a, b = readnumber(f,4), readnumber(f,4)
+ return 256 * a + b
+ elseif n == 12 then
+ local a, b, c = readnumber(f,4), readnumber(f,4), readnumber(f,4)
+ return 256*256 * a + 256 * b + c
+ elseif n == -2 then
+ local b, a = byte(f:read(2),1,2)
+ return 256*a + b
+ elseif n == -3 then
+ local c, b, a = byte(f:read(3),1,3)
+ return 256*256 * a + 256 * b + c
+ elseif n == -4 then
+ local d, c, b, a = byte(f:read(4),1,4)
+ return 256*256*256 * a + 256*256 * b + 256*c + d
+ elseif n == -8 then
+ local h, g, f, e, d, c, b, a = byte(f:read(8),1,8)
+ return 256*256*256*256*256*256*256 * a +
+ 256*256*256*256*256*256 * b +
+ 256*256*256*256*256 * c +
+ 256*256*256*256 * d +
+ 256*256*256 * e +
+ 256*256 * f +
+ 256 * g +
+ h
+ else
+ return 0
+ end
+end
+
+io.readnumber = readnumber
+
+function io.readstring(f,n,m)
+ if m then
+ f:seek("set",n)
+ n = m
+ end
+ local str = gsub(f:read(n),"%z","")
+ return str
+end
+
end -- of closure
@@ -1628,11 +1844,15 @@ if not modules then modules = { } end modules ['l-number'] = {
license = "see context related readme files"
}
+-- this module will be replaced when we have the bit library
+
local tostring = tostring
-local format, floor, insert, match = string.format, math.floor, table.insert, string.match
+local format, floor, match, rep = string.format, math.floor, string.match, string.rep
+local concat, insert = table.concat, table.insert
local lpegmatch = lpeg.match
-number = number or { }
+number = number or { }
+local number = number
-- a,b,c,d,e,f = number.toset(100101)
@@ -1680,6 +1900,54 @@ function number.bits(n,zero)
end
+function number.bit(p)
+ return 2 ^ (p - 1) -- 1-based indexing
+end
+
+function number.hasbit(x, p) -- typical call: if hasbit(x, bit(3)) then ...
+ return x % (p + p) >= p
+end
+
+function number.setbit(x, p)
+ return hasbit(x, p) and x or x + p
+end
+
+function number.clearbit(x, p)
+ return hasbit(x, p) and x - p or x
+end
+
+
+function number.tobitstring(n,m)
+ if n == 0 then
+ if m then
+ rep("00000000",m)
+ else
+ return "00000000"
+ end
+ else
+ local t = { }
+ while n > 0 do
+ insert(t,1,n % 2 > 0 and 1 or 0)
+ n = floor(n/2)
+ end
+ local nn = 8 - #t % 8
+ if nn > 0 and nn < 8 then
+ for i=1,nn do
+ insert(t,1,0)
+ end
+ end
+ if m then
+ m = m * 8 - #t
+ if m > 0 then
+ insert(t,1,rep("0",m))
+ end
+ end
+ return concat(t)
+ end
+end
+
+
+
end -- of closure
do -- create closure to overcome 200 locals limit
@@ -1692,6 +1960,8 @@ if not modules then modules = { } end modules ['l-set'] = {
license = "see context related readme files"
}
+-- This will become obsolete when we have the bitset library embedded.
+
set = set or { }
local nums = { }
@@ -1735,10 +2005,11 @@ function set.tolist(n)
if n == 0 or not tabs[n] then
return ""
else
- local t = { }
+ local t, n = { }, 0
for k, v in next, tabs[n] do
if v then
- t[#t+1] = k
+ n = n + 1
+ t[n] = k
end
end
return concat(t," ")
@@ -1756,17 +2027,6 @@ function set.contains(n,s)
end
end
---~ local c = set.create{'aap','noot','mies'}
---~ local s = set.tonumber(c)
---~ local t = set.totable(s)
---~ print(t['aap'])
---~ local c = set.create{'zus','wim','jet'}
---~ local s = set.tonumber(c)
---~ local t = set.totable(s)
---~ print(t['aap'])
---~ print(t['jet'])
---~ print(set.contains(t,'jet'))
---~ print(set.contains(t,'aap'))
@@ -1782,32 +2042,119 @@ if not modules then modules = { } end modules ['l-os'] = {
license = "see context related readme files"
}
+-- This file deals with some operating system issues. Please don't bother me
+-- with the pros and cons of operating systems as they all have their flaws
+-- and benefits. Bashing one of them won't help solving problems and fixing
+-- bugs faster and is a waste of time and energy.
+--
+-- path separators: / or \ ... we can use / everywhere
+-- suffixes : dll so exe <none> ... no big deal
+-- quotes : we can use "" in most cases
+-- expansion : unless "" are used * might give side effects
+-- piping/threads : somewhat different for each os
+-- locations : specific user file locations and settings can change over time
+--
+-- os.type : windows | unix (new, we already guessed os.platform)
+-- os.name : windows | msdos | linux | macosx | solaris | .. | generic (new)
+-- os.platform : extended os.name with architecture
+
-- maybe build io.flush in os.execute
-local find, format, gsub = string.find, string.format, string.gsub
+local os = os
+local find, format, gsub, upper = string.find, string.format, string.gsub, string.upper
+local concat = table.concat
local random, ceil = math.random, math.ceil
+local rawget, rawset, type, getmetatable, setmetatable, tonumber = rawget, rawset, type, getmetatable, setmetatable, tonumber
+
+-- The following code permits traversing the environment table, at least
+-- in luatex. Internally all environment names are uppercase.
+
+if not os.__getenv__ then
+
+ os.__getenv__ = os.getenv
+ os.__setenv__ = os.setenv
+
+ if os.env then
+
+ local osgetenv = os.getenv
+ local ossetenv = os.setenv
+ local osenv = os.env local _ = osenv.PATH -- initialize the table
+
+ function os.setenv(k,v)
+ if v == nil then
+ v = ""
+ end
+ local K = upper(k)
+ osenv[K] = v
+ if type(v) == "table" then
+ v = concat(v,";") -- path
+ end
+ ossetenv(K,v)
+ end
+
+ function os.getenv(k)
+ local K = upper(k)
+ local v = osenv[K] or osenv[k] or osgetenv(K) or osgetenv(k)
+ if v == "" then
+ return nil
+ else
+ return v
+ end
+ end
+
+ else
+
+ local ossetenv = os.setenv
+ local osgetenv = os.getenv
+ local osenv = { }
+
+ function os.setenv(k,v)
+ if v == nil then
+ v = ""
+ end
+ local K = upper(k)
+ osenv[K] = v
+ end
-local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
+ function os.getenv(k)
+ local K = upper(k)
+ local v = osenv[K] or osgetenv(K) or osgetenv(k)
+ if v == "" then
+ return nil
+ else
+ return v
+ end
+ end
+
+ local function __index(t,k)
+ return os.getenv(k)
+ end
+ local function __newindex(t,k,v)
+ os.setenv(k,v)
+ end
+
+ os.env = { }
+
+ setmetatable(os.env, { __index = __index, __newindex = __newindex } )
+
+ end
+
+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
function os.resultof(command)
- ioflush() -- else messed up logging
local handle = io.popen(command,"r")
- if not handle then
- -- print("unknown command '".. command .. "' in os.resultof")
- return ""
- else
- return handle:read("*all") or ""
- end
+ return handle and handle:read("*all") or ""
end
---~ os.type : windows | unix (new, we already guessed os.platform)
---~ os.name : windows | msdos | linux | macosx | solaris | .. | generic (new)
---~ os.platform : extended os.name with architecture
-
if not io.fileseparator then
if find(os.getenv("PATH"),";") then
io.fileseparator, io.pathseparator, os.type = "\\", ";", os.type or "mswin"
@@ -1856,16 +2203,11 @@ function os.runtime()
return os.gettimeofday() - startuptime
end
---~ print(os.gettimeofday()-os.time())
---~ os.sleep(1.234)
---~ print (">>",os.runtime())
---~ print(os.date("%H:%M:%S",os.gettimeofday()))
---~ print(os.date("%H:%M:%S",os.time()))
-- no need for function anymore as we have more clever code and helpers now
-- this metatable trickery might as well disappear
-os.resolvers = os.resolvers or { }
+os.resolvers = os.resolvers or { } -- will become private
local resolvers = os.resolvers
@@ -1878,24 +2220,6 @@ end
setmetatable(os,osmt)
-if not os.setenv then
-
- -- we still store them but they won't be seen in
- -- child processes although we might pass them some day
- -- using command concatination
-
- local env, getenv = { }, os.getenv
-
- function os.setenv(k,v)
- env[k] = v
- end
-
- function os.getenv(k)
- return env[k] or getenv(k)
- end
-
-end
-
-- we can use HOSTTYPE on some platforms
local name, platform = os.name or "linux", os.getenv("MTX_PLATFORM") or ""
@@ -1935,7 +2259,7 @@ elseif os.type == "windows" then
elseif name == "linux" then
function os.resolvers.platform(t,k)
- -- we sometims have HOSTTYPE set so let's check that first
+ -- we sometimes have HOSTTYPE set so let's check that first
local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
if find(architecture,"x86_64") then
platform = "linux-64"
@@ -2013,10 +2337,10 @@ elseif name == "freebsd" then
elseif name == "kfreebsd" then
function os.resolvers.platform(t,k)
- -- we sometims have HOSTTYPE set so let's check that first
+ -- we sometimes have HOSTTYPE set so let's check that first
local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
if find(architecture,"x86_64") then
- platform = "kfreebsd-64"
+ platform = "kfreebsd-amd64"
else
platform = "kfreebsd-i386"
end
@@ -2091,61 +2415,86 @@ if not modules then modules = { } end modules ['l-file'] = {
-- needs a cleanup
-file = file or { }
+file = file or { }
+local file = file
-local concat = table.concat
-local find, gmatch, match, gsub, sub, char = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char
+local insert, concat = table.insert, table.concat
+local find, gmatch, match, gsub, sub, char, lower = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char, string.lower
local lpegmatch = lpeg.match
+local getcurrentdir, attributes = lfs.currentdir, lfs.attributes
-function file.removesuffix(filename)
- return (gsub(filename,"%.[%a%d]+$",""))
+local P, R, S, C, Cs, Cp, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc
+
+local function dirname(name,default)
+ return match(name,"^(.+)[/\\].-$") or (default or "")
end
-function file.addsuffix(filename, suffix)
- if not suffix or suffix == "" then
- return filename
- elseif not find(filename,"%.[%a%d]+$") then
- return filename .. "." .. suffix
- else
- return filename
- end
+local function basename(name)
+ return match(name,"^.+[/\\](.-)$") or name
end
-function file.replacesuffix(filename, suffix)
- return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+local function nameonly(name)
+ return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
end
-function file.dirname(name,default)
- return match(name,"^(.+)[/\\].-$") or (default or "")
+local function extname(name,default)
+ return match(name,"^.+%.([^/\\]-)$") or default or ""
end
-function file.basename(name)
- return match(name,"^.+[/\\](.-)$") or name
+local function splitname(name)
+ local n, s = match(name,"^(.+)%.([^/\\]-)$")
+ return n or name, s or ""
end
-function file.nameonly(name)
- return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
+file.basename = basename
+file.dirname = dirname
+file.nameonly = nameonly
+file.extname = extname
+file.suffix = extname
+
+function file.removesuffix(filename)
+ return (gsub(filename,"%.[%a%d]+$",""))
end
-function file.extname(name,default)
- return match(name,"^.+%.([^/\\]-)$") or default or ""
+function file.addsuffix(filename, suffix, criterium)
+ if not suffix or suffix == "" then
+ return filename
+ elseif criterium == true then
+ return filename .. "." .. suffix
+ elseif not criterium then
+ local n, s = splitname(filename)
+ if not s or s == "" then
+ return filename .. "." .. suffix
+ else
+ return filename
+ end
+ else
+ local n, s = splitname(filename)
+ if s and s ~= "" then
+ local t = type(criterium)
+ if t == "table" then
+ -- keep if in criterium
+ for i=1,#criterium do
+ if s == criterium[i] then
+ return filename
+ end
+ end
+ elseif t == "string" then
+ -- keep if criterium
+ if s == criterium then
+ return filename
+ end
+ end
+ end
+ return n .. "." .. suffix
+ end
end
-file.suffix = file.extname
---~ function file.join(...)
---~ local pth = concat({...},"/")
---~ pth = gsub(pth,"\\","/")
---~ local a, b = match(pth,"^(.*://)(.*)$")
---~ if a and b then
---~ return a .. gsub(b,"//+","/")
---~ end
---~ a, b = match(pth,"^(//)(.*)$")
---~ if a and b then
---~ return a .. gsub(b,"//+","/")
---~ end
---~ return (gsub(pth,"//+","/"))
---~ end
+function file.replacesuffix(filename, suffix)
+ return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+end
+
local trick_1 = char(1)
local trick_2 = "^" .. trick_1 .. "/+"
@@ -2173,60 +2522,37 @@ function file.join(...)
return (gsub(pth,"//+","/"))
end
---~ print(file.join("//","/y"))
---~ print(file.join("/","/y"))
---~ print(file.join("","/y"))
---~ print(file.join("/x/","/y"))
---~ print(file.join("x/","/y"))
---~ print(file.join("http://","/y"))
---~ print(file.join("http://a","/y"))
---~ print(file.join("http:///a","/y"))
---~ print(file.join("//nas-1","/y"))
-function file.iswritable(name)
- local a = lfs.attributes(name) or lfs.attributes(file.dirname(name,"."))
+function file.is_writable(name)
+ local a = attributes(name) or attributes(dirname(name,"."))
return a and sub(a.permissions,2,2) == "w"
end
-function file.isreadable(name)
- local a = lfs.attributes(name)
+function file.is_readable(name)
+ local a = attributes(name)
return a and sub(a.permissions,1,1) == "r"
end
-file.is_readable = file.isreadable
-file.is_writable = file.iswritable
+file.isreadable = file.is_readable -- depricated
+file.iswritable = file.is_writable -- depricated
--- todo: lpeg
-
---~ function file.split_path(str)
---~ local t = { }
---~ str = gsub(str,"\\", "/")
---~ str = gsub(str,"(%a):([;/])", "%1\001%2")
---~ for name in gmatch(str,"([^;:]+)") do
---~ if name ~= "" then
---~ t[#t+1] = gsub(name,"\001",":")
---~ end
---~ end
---~ return t
---~ end
+-- todo: lpeg \\ / .. does not save much
local checkedsplit = string.checkedsplit
-function file.split_path(str,separator)
+function file.splitpath(str,separator) -- string
str = gsub(str,"\\","/")
return checkedsplit(str,separator or io.pathseparator)
end
-function file.join_path(tab)
- return concat(tab,io.pathseparator) -- can have trailing //
+function file.joinpath(tab,separator) -- table
+ return concat(tab,separator or io.pathseparator) -- can have trailing //
end
-- we can hash them weakly
-local insert = table.insert
-
-function file.collapse_path(str,anchor)
+function file.collapsepath(str,anchor)
if anchor and not find(str,"^/") and not find(str,"^%a:") then
str = getcurrentdir() .. "/" .. str
end
@@ -2280,62 +2606,15 @@ function file.collapse_path(str,anchor)
return concat(newelements, '/')
end
end
-function file.xcollapse_path(str)
- print('collapse', str)
- if str == "" or str =="." then
- return "."
- elseif find(str,"^%.%.") then
- return str
- elseif not find(str,"%.") then
- return str
- end
- str = gsub(str,"^%./",lfs.currentdir() .. "/") -- ./xx in qualified
- str = gsub(str,"\\","/")
- local oldelements = checkedsplit(str,"/")
- local newelements = { }
- local i = #oldelements
- while i > 0 do
- local element = oldelements[i]
- if element == '.' then
- -- do nothing
- elseif element == '..' then
- local n = i -1
- while n > 0 do
- local element = oldelements[n]
- if element ~= '..' and element ~= '.' then
- oldelements[n] = '.'
- break
- else
- n = n - 1
- end
- end
- if n<1 then
- insert(newelements,1,'..')
- end
- elseif element ~= "" then
- insert(newelements,1,element)
- end
- i = i - 1
- end
- if #newelements == 0 then
- return "."
- elseif find(str,"^/") then
- return "/" .. concat(newelements,'/')
- else
- return concat(newelements, '/')
- end
-end
---~ print(file.collapse_path("/a"))
---~ print(file.collapse_path("a/./b/.."))
---~ print(file.collapse_path("a/aa/../b/bb"))
---~ print(file.collapse_path("a/../.."))
---~ print(file.collapse_path("a/.././././b/.."))
---~ print(file.collapse_path("a/./././b/.."))
---~ print(file.collapse_path("a/b/c/../.."))
-function file.robustname(str)
- return (gsub(str,"[^%a%d%/%-%.\\]+","-"))
+function file.robustname(str,strict)
+ str = gsub(str,"[^%a%d%/%-%.\\]+","-")
+ if strict then
+ return lower(gsub(str,"^%-*(.-)%-*$","%1"))
+ else
+ return str
+ end
end
file.readdata = io.loaddata
@@ -2347,100 +2626,34 @@ end
-- lpeg variants, slightly faster, not always
---~ local period = lpeg.P(".")
---~ local slashes = lpeg.S("\\/")
---~ local noperiod = 1-period
---~ local noslashes = 1-slashes
---~ local name = noperiod^1
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.C(noperiod^1) * -1
-
---~ function file.extname(name)
---~ return lpegmatch(pattern,name) or ""
---~ end
-
---~ local pattern = lpeg.Cs(((period * noperiod^1 * -1)/"" + 1)^1)
-
---~ function file.removesuffix(name)
---~ return lpegmatch(pattern,name)
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.C(noslashes^1) * -1
-
---~ function file.basename(name)
---~ return lpegmatch(pattern,name) or name
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.Cp() * noslashes^1 * -1
-
---~ function file.dirname(name)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return sub(name,1,p-2)
---~ else
---~ return ""
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
-
---~ function file.addsuffix(name, suffix)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return name
---~ else
---~ return name .. "." .. suffix
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
-
---~ function file.replacesuffix(name,suffix)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return sub(name,1,p-2) .. "." .. suffix
---~ else
---~ return name .. "." .. suffix
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * lpeg.Cp() * ((noperiod^1 * period)^1 * lpeg.Cp() + lpeg.P(true)) * noperiod^1 * -1
-
---~ function file.nameonly(name)
---~ local a, b = lpegmatch(pattern,name)
---~ if b then
---~ return sub(name,a,b-2)
---~ elseif a then
---~ return sub(name,a)
---~ else
---~ return name
---~ end
---~ end
-
---~ local test = file.extname
---~ local test = file.basename
---~ local test = file.dirname
---~ local test = file.addsuffix
---~ local test = file.replacesuffix
---~ local test = file.nameonly
-
---~ print(1,test("./a/b/c/abd.def.xxx","!!!"))
---~ print(2,test("./../b/c/abd.def.xxx","!!!"))
---~ print(3,test("a/b/c/abd.def.xxx","!!!"))
---~ print(4,test("a/b/c/def.xxx","!!!"))
---~ print(5,test("a/b/c/def","!!!"))
---~ print(6,test("def","!!!"))
---~ print(7,test("def.xxx","!!!"))
-
---~ local tim = os.clock() for i=1,250000 do local ext = test("abd.def.xxx","!!!") end print(os.clock()-tim)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-- also rewrite previous
-local letter = lpeg.R("az","AZ") + lpeg.S("_-+")
-local separator = lpeg.P("://")
+local letter = R("az","AZ") + S("_-+")
+local separator = P("://")
+
+local qualified = P(".")^0 * P("/") + letter*P(":") + letter^1*separator + letter^1 * P("/")
+local rootbased = P("/") + letter*P(":")
-local qualified = lpeg.P(".")^0 * lpeg.P("/") + letter*lpeg.P(":") + letter^1*separator + letter^1 * lpeg.P("/")
-local rootbased = lpeg.P("/") + letter*lpeg.P(":")
+lpeg.patterns.qualified = qualified
+lpeg.patterns.rootbased = rootbased
-- ./name ../name /name c: :// name/name
@@ -2452,14 +2665,16 @@ function file.is_rootbased_path(filename)
return lpegmatch(rootbased,filename) ~= nil
end
-local slash = lpeg.S("\\/")
-local period = lpeg.P(".")
-local drive = lpeg.C(lpeg.R("az","AZ")) * lpeg.P(":")
-local path = lpeg.C(((1-slash)^0 * slash)^0)
-local suffix = period * lpeg.C(lpeg.P(1-period)^0 * lpeg.P(-1))
-local base = lpeg.C((1-suffix)^0)
+-- actually these are schemes
-local pattern = (drive + lpeg.Cc("")) * (path + lpeg.Cc("")) * (base + lpeg.Cc("")) * (suffix + lpeg.Cc(""))
+local slash = S("\\/")
+local period = P(".")
+local drive = C(R("az","AZ")) * P(":")
+local path = C(((1-slash)^0 * slash)^0)
+local suffix = period * C(P(1-period)^0 * P(-1))
+local base = C((1-suffix)^0)
+
+local pattern = (drive + Cc("")) * (path + Cc("")) * (base + Cc("")) * (suffix + Cc(""))
function file.splitname(str) -- returns drive, path, base, suffix
return lpegmatch(pattern,str)
@@ -2472,14 +2687,13 @@ end
-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
---~ -- todo:
---~
---~ if os.type == "windows" then
---~ local currentdir = lfs.currentdir
---~ function lfs.currentdir()
---~ return (gsub(currentdir(),"\\","/"))
---~ end
---~ end
+
+-- for myself:
+
+function file.strip(name,dir)
+ local b, a = match(name,"^(.-)" .. dir .. "(.*)$")
+ return a ~= "" and a or name
+end
end -- of closure
@@ -2495,6 +2709,7 @@ if not modules then modules = { } end modules ['l-md5'] = {
-- This also provides file checksums and checkers.
+local md5, file = md5, file
local gsub, format, byte = string.gsub, string.format, string.byte
local function convert(str,fmt)
@@ -2505,27 +2720,13 @@ 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 function remap(chr) return format("%02X",byte(chr)) end
---~ function md5.HEX(str) return (gsub(md5.sum(str),".",remap)) end
---~ end
---~ 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
---~ 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
-
-file.needs_updating_threshold = 1
-
-function file.needs_updating(oldname,newname) -- size modification access change
+
+function file.needs_updating(oldname,newname,threshold) -- size modification access change
local oldtime = lfs.attributes(oldname, modification)
local newtime = lfs.attributes(newname, modification)
if newtime >= oldtime then
return false
- elseif oldtime - newtime < file.needs_updating_threshold then
+ elseif oldtime - newtime < (threshold or 1) then
return false
else
return true
@@ -2572,86 +2773,171 @@ if not modules then modules = { } end modules ['l-url'] = {
license = "see context related readme files"
}
-local char, gmatch, gsub = string.char, string.gmatch, string.gsub
+local char, gmatch, gsub, format, byte, find = string.char, string.gmatch, string.gsub, string.format, string.byte, string.find
+local concat = table.concat
local tonumber, type = tonumber, type
-local lpegmatch = lpeg.match
+local P, C, R, S, Cs, Cc, Ct = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cs, lpeg.Cc, lpeg.Ct
+local lpegmatch, lpegpatterns, replacer = lpeg.match, lpeg.patterns, lpeg.replacer
--- from the spec (on the web):
+-- from wikipedia:
--
--- foo://example.com:8042/over/there?name=ferret#nose
--- \_/ \______________/\_________/ \_________/ \__/
--- | | | | |
--- scheme authority path query fragment
--- | _____________________|__
--- / \ / \
--- urn:example:animal:ferret:nose
+-- foo://username:password@example.com:8042/over/there/index.dtb?type=animal;name=narwhal#nose
+-- \_/ \_______________/ \_________/ \__/ \___/ \_/ \______________________/ \__/
+-- | | | | | | | |
+-- | userinfo hostname port | | query fragment
+-- | \________________________________/\_____________|____|/
+-- scheme | | | |
+-- | authority path | |
+-- | | |
+-- | path interpretable as filename
+-- | ___________|____________ |
+-- / \ / \ |
+-- urn:example:animal:ferret:nose interpretable as extension
+
+url = url or { }
+local url = url
+
+local tochar = function(s) return char(tonumber(s,16)) end
+
+local colon = P(":")
+local qmark = P("?")
+local hash = P("#")
+local slash = P("/")
+local percent = P("%")
+local endofstring = P(-1)
+
+local hexdigit = R("09","AF","af")
+local plus = P("+")
+local nothing = Cc("")
+local escaped = (plus / " ") + (percent * C(hexdigit * hexdigit) / tochar)
-url = url or { }
+-- we assume schemes with more than 1 character (in order to avoid problems with windows disks)
-local function tochar(s)
- return char(tonumber(s,16))
-end
+local scheme = Cs((escaped+(1-colon-slash-qmark-hash))^2) * colon + nothing
+local authority = slash * slash * Cs((escaped+(1- slash-qmark-hash))^0) + nothing
+local path = slash * Cs((escaped+(1- qmark-hash))^0) + nothing
+local query = qmark * Cs((escaped+(1- hash))^0) + nothing
+local fragment = hash * Cs((escaped+(1- endofstring))^0) + nothing
-local colon, qmark, hash, slash, percent, endofstring = lpeg.P(":"), lpeg.P("?"), lpeg.P("#"), lpeg.P("/"), lpeg.P("%"), lpeg.P(-1)
+local validurl = scheme * authority * path * query * fragment
+local parser = Ct(validurl)
-local hexdigit = lpeg.R("09","AF","af")
-local plus = lpeg.P("+")
-local escaped = (plus / " ") + (percent * lpeg.C(hexdigit * hexdigit) / tochar)
+lpegpatterns.url = validurl
+lpegpatterns.urlsplitter = parser
--- we assume schemes with more than 1 character (in order to avoid problems with windows disks)
+local escapes = { } ; for i=0,255 do escapes[i] = format("%%%02X",i) end
-local scheme = lpeg.Cs((escaped+(1-colon-slash-qmark-hash))^2) * colon + lpeg.Cc("")
-local authority = slash * slash * lpeg.Cs((escaped+(1- slash-qmark-hash))^0) + lpeg.Cc("")
-local path = slash * lpeg.Cs((escaped+(1- qmark-hash))^0) + lpeg.Cc("")
-local query = qmark * lpeg.Cs((escaped+(1- hash))^0) + lpeg.Cc("")
-local fragment = hash * lpeg.Cs((escaped+(1- endofstring))^0) + lpeg.Cc("")
+local escaper = Cs((R("09","AZ","az") + S("-./_") + P(1) / escapes)^0)
-local parser = lpeg.Ct(scheme * authority * path * query * fragment)
+lpegpatterns.urlescaper = escaper
-- todo: reconsider Ct as we can as well have five return values (saves a table)
-- so we can have two parsers, one with and one without
-function url.split(str)
+local function split(str)
return (type(str) == "string" and lpegmatch(parser,str)) or str
end
+local function hasscheme(str)
+ local scheme = lpegmatch(scheme,str) -- at least one character
+ return scheme and scheme ~= ""
+end
+
-- todo: cache them
-function url.hashed(str)
- local s = url.split(str)
+local rootletter = R("az","AZ")
+ + S("_-+")
+local separator = P("://")
+local qualified = P(".")^0 * P("/")
+ + rootletter * P(":")
+ + rootletter^1 * separator
+ + rootletter^1 * P("/")
+local rootbased = P("/")
+ + rootletter * P(":")
+
+local barswapper = replacer("|",":")
+local backslashswapper = replacer("\\","/")
+
+local function hashed(str) -- not yet ok (/test?test)
+ local s = split(str)
local somescheme = s[1] ~= ""
- return {
- scheme = (somescheme and s[1]) or "file",
- authority = s[2],
- path = s[3],
- query = s[4],
- fragment = s[5],
- original = str,
- noscheme = not somescheme,
- }
+ local somequery = s[4] ~= ""
+ if not somescheme and not somequery then
+ s = {
+ scheme = "file",
+ authority = "",
+ path = str,
+ query = "",
+ fragment = "",
+ original = str,
+ 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
+ else
+ filename = authority .. "/" .. path
+ end
+ s = {
+ scheme = s[1],
+ authority = authority,
+ path = path,
+ query = s[4],
+ fragment = s[5],
+ original = str,
+ noscheme = false,
+ filename = filename,
+ }
+ end
+ return s
end
-function url.hasscheme(str)
- return url.split(str)[1] ~= ""
-end
+-- Here we assume:
+--
+-- files: /// = relative
+-- files: //// = absolute (!)
+
+
+
+url.split = split
+url.hasscheme = hasscheme
+url.hashed = hashed
-function url.addscheme(str,scheme)
- return (url.hasscheme(str) and str) or ((scheme or "file:///") .. str)
+function url.addscheme(str,scheme) -- no authority
+ if hasscheme(str) then
+ return str
+ elseif not scheme then
+ return "file:///" .. str
+ else
+ return scheme .. ":///" .. str
+ end
end
-function url.construct(hash)
- local fullurl = hash.sheme .. "://".. hash.authority .. hash.path
- if hash.query then
- fullurl = fullurl .. "?".. hash.query
+function url.construct(hash) -- dodo: we need to escape !
+ local fullurl, f = { }, 0
+ local scheme, authority, path, query, fragment = hash.scheme, hash.authority, hash.path, hash.query, hash.fragment
+ if scheme and scheme ~= "" then
+ f = f + 1 ; fullurl[f] = scheme .. "://"
+ end
+ if authority and authority ~= "" then
+ f = f + 1 ; fullurl[f] = authority
end
- if hash.fragment then
- fullurl = fullurl .. "?".. hash.fragment
+ if path and path ~= "" then
+ f = f + 1 ; fullurl[f] = "/" .. path
end
- return fullurl
+ if query and query ~= "" then
+ f = f + 1 ; fullurl[f] = "?".. query
+ end
+ if fragment and fragment ~= "" then
+ f = f + 1 ; fullurl[f] = "#".. fragment
+ end
+ return lpegmatch(escaper,concat(fullurl))
end
function url.filename(filename)
- local t = url.hashed(filename)
+ local t = hashed(filename)
return (t.scheme == "file" and (gsub(t.path,"^/([a-zA-Z])([:|])/)","%1:"))) or filename
end
@@ -2667,37 +2953,13 @@ function url.query(str)
end
end
---~ print(url.filename("file:///c:/oeps.txt"))
---~ print(url.filename("c:/oeps.txt"))
---~ print(url.filename("file:///oeps.txt"))
---~ print(url.filename("file:///etc/test.txt"))
---~ print(url.filename("/oeps.txt"))
-
---~ from the spec on the web (sort of):
---~
---~ function test(str)
---~ print(table.serialize(url.hashed(str)))
---~ end
---~
---~ test("%56pass%20words")
---~ test("file:///c:/oeps.txt")
---~ test("file:///c|/oeps.txt")
---~ test("file:///etc/oeps.txt")
---~ test("file://./etc/oeps.txt")
---~ test("file:////etc/oeps.txt")
---~ test("ftp://ftp.is.co.za/rfc/rfc1808.txt")
---~ test("http://www.ietf.org/rfc/rfc2396.txt")
---~ test("ldap://[2001:db8::7]/c=GB?objectClass?one#what")
---~ test("mailto:John.Doe@example.com")
---~ test("news:comp.infosystems.www.servers.unix")
---~ test("tel:+1-816-555-1212")
---~ test("telnet://192.0.2.16:80/")
---~ test("urn:oasis:names:specification:docbook:dtd:xml:4.1.2")
---~ test("/etc/passwords")
---~ test("http://www.pragma-ade.com/spaced%20name")
-
---~ test("zip:///oeps/oeps.zip#bla/bla.tex")
---~ test("zip:///oeps/oeps.zip?bla/bla.tex")
+
+
+
+
+
+
+
end -- of closure
@@ -2712,35 +2974,53 @@ if not modules then modules = { } end modules ['l-dir'] = {
license = "see context related readme files"
}
--- dir.expand_name will be merged with cleanpath and collapsepath
+-- dir.expandname will be merged with cleanpath and collapsepath
local type = type
local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
+local concat, insert, remove = table.concat, table.insert, table.remove
local lpegmatch = lpeg.match
+local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
+
dir = dir or { }
+local dir = dir
+local lfs = lfs
+
+local attributes = lfs.attributes
+local walkdir = lfs.dir
+local isdir = lfs.isdir
+local isfile = lfs.isfile
+local mkdir = lfs.mkdir
+local chdir = lfs.chdir
+local currentdir = lfs.currentdir
-- handy
function dir.current()
- return (gsub(lfs.currentdir(),"\\","/"))
+ return (gsub(currentdir(),"\\","/"))
end
--- optimizing for no string.find (*) does not save time
+-- optimizing for no find (*) does not save time
-local attributes = lfs.attributes
-local walkdir = lfs.dir
-local function glob_pattern(path,patt,recurse,action)
- local ok, scanner
+local lfsisdir = isdir
+
+local function isdir(path)
+ path = gsub(path,"[/\\]+$","")
+ return lfsisdir(path)
+end
+
+lfs.isdir = isdir
+
+local function globpattern(path,patt,recurse,action)
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
+ path = path .. "."
+ elseif not find(path,"/$") then
+ path = path .. '/'
end
- if ok and type(scanner) == "function" then
- if not find(path,"/$") then path = path .. '/' end
- for name in scanner do
+ 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
@@ -2748,15 +3028,15 @@ local function glob_pattern(path,patt,recurse,action)
action(full)
end
elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
- glob_pattern(full,patt,recurse,action)
+ globpattern(full,patt,recurse,action)
end
end
end
end
-dir.glob_pattern = glob_pattern
+dir.globpattern = globpattern
-local function collect_pattern(path,patt,recurse,result)
+local function collectpattern(path,patt,recurse,result)
local ok, scanner
result = result or { }
if path == "/" then
@@ -2775,7 +3055,7 @@ local function collect_pattern(path,patt,recurse,result)
result[name] = attr
end
elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
- attr.list = collect_pattern(full,patt,recurse)
+ attr.list = collectpattern(full,patt,recurse)
result[name] = attr
end
end
@@ -2783,9 +3063,7 @@ local function collect_pattern(path,patt,recurse,result)
return result
end
-dir.collect_pattern = collect_pattern
-
-local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
+dir.collectpattern = collectpattern
local pattern = Ct {
[1] = (C(P(".") + P("/")^1) + C(R("az","AZ") * P(":") * P("/")^0) + Cc("./")) * V(2) * V(3),
@@ -2809,16 +3087,16 @@ local function glob(str,t)
for s=1,#str do
glob(str[s],t)
end
- elseif lfs.isfile(str) then
+ elseif isfile(str) then
t(str)
else
- local split = lpegmatch(pattern,str)
+ 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 recurse = find(base,"%*%*")
local start = root .. path
local result = lpegmatch(filter,start .. base)
- glob_pattern(start,result,recurse,t)
+ globpattern(start,result,recurse,t)
end
end
else
@@ -2828,12 +3106,15 @@ local function glob(str,t)
glob(str[s],t)
end
return t
- elseif lfs.isfile(str) then
- local t = t or { }
- t[#t+1] = str
- return t
+ elseif isfile(str) then
+ if t then
+ t[#t+1] = str
+ return t
+ else
+ return { str }
+ end
else
- local split = lpegmatch(pattern,str)
+ 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
@@ -2841,7 +3122,7 @@ local function glob(str,t)
local recurse = find(base,"%*%*")
local start = root .. path
local result = lpegmatch(filter,start .. base)
- glob_pattern(start,result,recurse,action)
+ globpattern(start,result,recurse,action)
return t
else
return { }
@@ -2852,18 +3133,14 @@ 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 function globfiles(path,recurse,func,files) -- func == pattern or function
if type(func) == "string" then
- local s = func -- alas, we need this indirect way
+ local s = func
func = function(name) return find(name,s) end
end
files = files or { }
+ local noffiles = #files
for name in walkdir(path) do
if find(name,"^%.") then
--- skip
@@ -2874,12 +3151,9 @@ local function globfiles(path,recurse,func,files) -- func == pattern or function
globfiles(path .. "/" .. name,recurse,func,files)
end
elseif mode == "file" then
- if func then
- if func(name) then
- files[#files+1] = path .. "/" .. name
- end
- else
- files[#files+1] = path .. "/" .. name
+ if not func or func(name) then
+ noffiles = noffiles + 1
+ files[noffiles] = path .. "/" .. name
end
end
end
@@ -2897,17 +3171,15 @@ dir.globfiles = globfiles
-- print(dir.ls("*.tex"))
function dir.ls(pattern)
- return table.concat(glob(pattern),"\n")
+ return concat(glob(pattern),"\n")
end
---~ mkdirs("temp")
---~ mkdirs("a/b/c")
---~ mkdirs(".","/a/b/c")
---~ mkdirs("a","b","c")
local make_indeed = true -- false
-if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
+local onwindows = os.type == "windows" or find(os.getenv("PATH"),";")
+
+if onwindows then
function dir.mkdirs(...)
local str, pth, t = "", "", { ... }
@@ -2956,64 +3228,21 @@ if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
else
pth = pth .. "/" .. s
end
- if make_indeed and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not isdir(pth) then
+ mkdir(pth)
end
end
- return pth, (lfs.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/"))
-
- function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
- local first, nothing, last = match(str,"^(//)(//*)(.*)$")
- if first then
- first = dir.current() .. "/"
- 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 = lfs.currentdir()
- if lfs.chdir(first) then
- first = dir.current()
- end
- lfs.chdir(d)
- 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 == "" then
- return first
- else
- return first .. "/" .. last
- end
+ return pth, (isdir(pth) == true)
end
+
else
function dir.mkdirs(...)
local str, pth, t = "", "", { ... }
for i=1,#t do
local s = t[i]
- if s ~= "" then
+ if s and s ~= "" then -- we catch nil and false
if str ~= "" then
str = str .. "/" .. s
else
@@ -3031,42 +3260,92 @@ else
else
pth = pth .. "/" .. s
end
- if make_indeed and not first and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not first and not isdir(pth) then
+ mkdir(pth)
end
end
else
pth = "."
for s in gmatch(str,"[^/]+") do
pth = pth .. "/" .. s
- if make_indeed and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not isdir(pth) then
+ mkdir(pth)
+ end
+ end
+ end
+ return pth, (isdir(pth) == true)
+ end
+
+
+end
+
+dir.makedirs = dir.mkdirs
+
+-- we can only define it here as it uses dir.current
+
+if onwindows then
+
+ function dir.expandname(str) -- will be merged with cleanpath and collapsepath
+ local first, nothing, last = match(str,"^(//)(//*)(.*)$")
+ if first then
+ first = dir.current() .. "/"
+ 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()
end
+ chdir(d)
end
end
- return pth, (lfs.isdir(pth) == true)
+ 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
---~ 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/"))
+else
- function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
+ function dir.expandname(str) -- will be merged with cleanpath and collapsepath
if not find(str,"^/") then
- str = lfs.currentdir() .. "/" .. str
+ str = currentdir() .. "/" .. str
end
str = gsub(str,"//","/")
str = gsub(str,"/%./","/")
+ str = gsub(str,"(.)/%.$","%1")
return str
end
end
-dir.makedirs = dir.mkdirs
+file.expandname = dir.expandname -- for convenience
+
+local stack = { }
+
+function dir.push(newdir)
+ insert(stack,lfs.currentdir())
+end
+
+function dir.pop()
+ local d = remove(stack)
+ if d then
+ lfs.chdir(d)
+ end
+ return d
+end
end -- of closure
@@ -3081,12 +3360,17 @@ if not modules then modules = { } end modules ['l-boolean'] = {
license = "see context related readme files"
}
+local type, tonumber = type, tonumber
+
boolean = boolean or { }
+local boolean = boolean
-local type, tonumber = type, tonumber
+-- function boolean.tonumber(b)
+-- return b and 1 or 0 -- test and test and return or return
+-- end
function boolean.tonumber(b)
- if b then return 1 else return 0 end
+ if b then return 1 else return 0 end -- test and return or return
end
function toboolean(str,tolerant)
@@ -3110,7 +3394,9 @@ function toboolean(str,tolerant)
end
end
-function string.is_boolean(str)
+string.toboolean = toboolean
+
+function string.is_boolean(str,default)
if type(str) == "string" then
if str == "true" or str == "yes" or str == "on" or str == "t" then
return true
@@ -3118,18 +3404,301 @@ function string.is_boolean(str)
return false
end
end
- return nil
+ return default
end
-function boolean.alwaystrue()
- return true
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['l-unicode'] = {
+ 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"
+}
+
+if not unicode then
+
+ unicode = { utf8 = { } }
+
+ local floor, char = math.floor, string.char
+
+ function unicode.utf8.utfchar(n)
+ if n < 0x80 then
+ return char(n)
+ elseif n < 0x800 then
+ return char(
+ 0xC0 + floor(n/0x40),
+ 0x80 + (n % 0x40)
+ )
+ elseif n < 0x10000 then
+ return char(
+ 0xE0 + floor(n/0x1000),
+ 0x80 + (floor(n/0x40) % 0x40),
+ 0x80 + (n % 0x40)
+ )
+ elseif n < 0x40000 then
+ return char(
+ 0xF0 + floor(n/0x40000),
+ 0x80 + floor(n/0x1000),
+ 0x80 + (floor(n/0x40) % 0x40),
+ 0x80 + (n % 0x40)
+ )
+ else
+ -- return char(
+ -- 0xF1 + floor(n/0x1000000),
+ -- 0x80 + floor(n/0x40000),
+ -- 0x80 + floor(n/0x1000),
+ -- 0x80 + (floor(n/0x40) % 0x40),
+ -- 0x80 + (n % 0x40)
+ -- )
+ return "?"
+ end
+ end
+
end
-function boolean.falsetrue()
- return false
+local unicode = unicode
+
+utf = utf or unicode.utf8
+
+local concat = table.concat
+local utfchar, utfbyte, utfgsub = utf.char, utf.byte, utf.gsub
+local char, byte, find, bytepairs, utfvalues, format = string.char, string.byte, string.find, string.bytepairs, string.utfvalues, string.format
+local type = type
+
+local utfsplitlines = string.utfsplitlines
+
+-- 0 EF BB BF UTF-8
+-- 1 FF FE UTF-16-little-endian
+-- 2 FE FF UTF-16-big-endian
+-- 3 FF FE 00 00 UTF-32-little-endian
+-- 4 00 00 FE FF UTF-32-big-endian
+
+unicode.utfname = {
+ [0] = 'utf-8',
+ [1] = 'utf-16-le',
+ [2] = 'utf-16-be',
+ [3] = 'utf-32-le',
+ [4] = 'utf-32-be'
+}
+
+-- \000 fails in <= 5.0 but is valid in >=5.1 where %z is depricated
+
+function unicode.utftype(f)
+ local str = f:read(4)
+ if not str then
+ f:seek('set')
+ return 0
+ -- elseif find(str,"^%z%z\254\255") then -- depricated
+ -- elseif find(str,"^\000\000\254\255") then -- not permitted and bugged
+ elseif find(str,"\000\000\254\255",1,true) then -- seems to work okay (TH)
+ return 4
+ -- elseif find(str,"^\255\254%z%z") then -- depricated
+ -- elseif find(str,"^\255\254\000\000") then -- not permitted and bugged
+ elseif find(str,"\255\254\000\000",1,true) then -- seems to work okay (TH)
+ return 3
+ elseif find(str,"^\254\255") then
+ f:seek('set',2)
+ return 2
+ elseif find(str,"^\255\254") then
+ f:seek('set',2)
+ return 1
+ elseif find(str,"^\239\187\191") then
+ f:seek('set',3)
+ return 0
+ else
+ f:seek('set')
+ return 0
+ end
+end
+
+
+
+local function utf16_to_utf8_be(t)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ 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
+ 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
+end
+
+local function utf16_to_utf8_le(t)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ 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
+ 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
+end
+
+local function utf32_to_utf8_be(str)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ end
+ local result = { } -- we reuse result
+ for i=1,#t do
+ local r, more = 0, -1
+ for a,b in bytepairs(str) 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 result
+end
+
+local function utf32_to_utf8_le(str)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ end
+ local result = { } -- we reuse result
+ for i=1,#t do
+ local r, more = 0, -1
+ for a,b in bytepairs(str) 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 result
+end
+
+unicode.utf32_to_utf8_be = utf32_to_utf8_be
+unicode.utf32_to_utf8_le = utf32_to_utf8_le
+unicode.utf16_to_utf8_be = utf16_to_utf8_be
+unicode.utf16_to_utf8_le = utf16_to_utf8_le
+
+function unicode.utf8_to_utf8(t)
+ return type(t) == "string" and utfsplitlines(t) or t
+end
+
+function unicode.utf16_to_utf8(t,endian)
+ return endian and utf16_to_utf8_be(t) or utf16_to_utf8_le(t) or t
+end
+
+function unicode.utf32_to_utf8(t,endian)
+ return endian and utf32_to_utf8_be(t) or utf32_to_utf8_le(t) or t
+end
+
+local function little(c)
+ local b = byte(c)
+ if b < 0x10000 then
+ return char(b%256,b/256)
+ else
+ b = b - 0x10000
+ local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00
+ return char(b1%256,b1/256,b2%256,b2/256)
+ end
+end
+
+local function big(c)
+ local b = byte(c)
+ if b < 0x10000 then
+ return char(b/256,b%256)
+ else
+ b = b - 0x10000
+ local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00
+ return char(b1/256,b1%256,b2/256,b2%256)
+ end
+end
+
+function unicode.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
+
+function unicode.utfcodes(str)
+ local t, n = { }, 0
+ for u in utfvalues(str) do
+ n = n + 1
+ t[n] = format("0x%04X",u)
+ end
+ return concat(t,separator or " ")
+end
+
+function unicode.ustring(s)
+ return format("U+%05X",type(s) == "number" and s or utfbyte(s))
+end
+
+function unicode.xstring(s)
+ return format("0x%05X",type(s) == "number" and s or utfbyte(s))
+end
+
+
+local lpegmatch = lpeg.match
+local utftype = lpeg.patterns.utftype
+
+function unicode.filetype(data)
+ return data and lpegmatch(utftype,data) or "unknown"
end
+
+
end -- of closure
do -- create closure to overcome 200 locals limit
@@ -3145,35 +3714,289 @@ 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.round then
- function math.round(x)
- return floor(x + 0.5)
- end
+ function math.round(x) return floor(x + 0.5) end
end
if not math.div then
- function math.div(n,m)
- return floor(n/m)
- end
+ function math.div(n,m) return floor(n/m) end
end
if not math.mod then
- function math.mod(n,m)
- return n % m
- end
+ function math.mod(n,m) return n % m end
end
local pipi = 2*math.pi/360
-function math.sind(d)
- return sin(d*pipi)
+if not math.sind then
+ function math.sind(d) return sin(d*pipi) end
+ function math.cosd(d) return cos(d*pipi) end
+ function math.tand(d) return tan(d*pipi) end
end
-function math.cosd(d)
- return cos(d*pipi)
+if not math.odd then
+ function math.odd (n) return n % 2 == 0 end
+ function math.even(n) return n % 2 ~= 0 end
end
-function math.tand(d)
- return tan(d*pipi)
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-tab'] = {
+ 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"
+}
+
+utilities = utilities or {}
+utilities.tables = utilities.tables or { }
+local tables = utilities.tables
+
+local format, gmatch = string.format, string.gmatch
+local concat, insert, remove = table.concat, table.insert, table.remove
+local setmetatable, getmetatable, tonumber, tostring = setmetatable, getmetatable, tonumber, tostring
+
+function tables.definetable(target) -- defines undefined tables
+ local composed, t, n = nil, { }, 0
+ for name in gmatch(target,"([^%.]+)") do
+ n = n + 1
+ if composed then
+ composed = composed .. "." .. name
+ else
+ composed = name
+ end
+ t[n] = format("%s = %s or { }",composed,composed)
+ end
+ return concat(t,"\n")
+end
+
+function tables.accesstable(target)
+ local t = _G
+ for name in gmatch(target,"([^%.]+)") do
+ t = t[name]
+ end
+ return t
+end
+
+function tables.removevalue(t,value) -- todo: n
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ remove(t,i)
+ -- remove all, so no: return
+ end
+ end
+ end
+end
+
+function tables.insertbeforevalue(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i,extra)
+ return
+ end
+ end
+ insert(t,1,extra)
+end
+
+function tables.insertaftervalue(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i+1,extra)
+ return
+ end
+ end
+ insert(t,#t+1,extra)
+end
+
+-- experimental
+
+local function toxml(t,d,result)
+ for k, v in table.sortedpairs(t) do
+ if type(v) == "table" then
+ result[#result+1] = format("%s<%s>",d,k)
+ toxml(v,d.." ",result)
+ result[#result+1] = format("%s</%s>",d,k)
+ elseif tonumber(k) then
+ result[#result+1] = format("%s<entry n='%s'>%s</entry>",d,k,v,k)
+ else
+ result[#result+1] = format("%s<%s>%s</%s>",d,k,tostring(v),k)
+ end
+ end
+end
+
+function table.toxml(t,name,nobanner)
+ local noroot = name == false
+ local result = (nobanner or noroot) and { } or { "<?xml version='1.0' standalone='yes' ?>" }
+ if noroot then
+ toxml( t, "", result)
+ else
+ toxml( { [name or "root"] = t }, "", result)
+ end
+ return concat(result,"\n")
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-sto'] = {
+ 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 setmetatable, getmetatable = setmetatable, getmetatable
+
+utilities = utilities or { }
+utilities.storage = utilities.storage or { }
+local storage = utilities.storage
+
+function storage.mark(t)
+ if not t then
+ texio.write_nl("fatal error: storage '%s' cannot be marked",t)
+ os.exit()
+ end
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m.__storage__ = true
+ return t
+end
+
+function storage.allocate(t)
+ t = t or { }
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m.__storage__ = true
+ return t
+end
+
+function storage.marked(t)
+ local m = getmetatable(t)
+ return m and m.__storage__
+end
+
+function storage.checked(t)
+ if not t then
+ texio.write_nl("fatal error: storage '%s' has not been allocated",t)
+ os.exit()
+ end
+ return t
+end
+
+
+function storage.setinitializer(data,initialize)
+ local m = getmetatable(data) or { }
+ m.__index = function(data,k)
+ m.__index = nil -- so that we can access the entries during initializing
+ initialize()
+ return data[k]
+ end
+ setmetatable(data, m)
+end
+
+local keyisvalue = { __index = function(t,k)
+ t[k] = k
+ return k
+end }
+
+function storage.sparse(t)
+ t = t or { }
+ setmetatable(t,keyisvalue)
+ return t
+end
+
+-- table namespace ?
+
+local function f_empty () return "" end -- t,k
+local function f_self (t,k) t[k] = k return k end
+local function f_ignore() end -- t,k,v
+
+local t_empty = { __index = empty }
+local t_self = { __index = self }
+local t_ignore = { __newindex = ignore }
+
+function table.setmetatableindex(t,f)
+ local m = getmetatable(t)
+ if m then
+ if f == "empty" then
+ m.__index = f_empty
+ elseif f == "key" then
+ m.__index = f_self
+ else
+ m.__index = f
+ end
+ else
+ if f == "empty" then
+ setmetatable(t, t_empty)
+ elseif f == "key" then
+ setmetatable(t, t_self)
+ else
+ setmetatable(t,{ __index = f })
+ end
+ end
+end
+
+function table.setmetatablenewindex(t,f)
+ local m = getmetatable(t)
+ if m then
+ if f == "ignore" then
+ m.__newindex = f_ignore
+ else
+ m.__newindex = f
+ end
+ else
+ if f == "ignore" then
+ setmetatable(t, t_ignore)
+ else
+ setmetatable(t,{ __newindex = f })
+ end
+ end
+end
+
+function table.setmetatablecall(t,f)
+ local m = getmetatable(t)
+ if m then
+ m.__call = f
+ else
+ setmetatable(t,{ __call = f })
+ end
+end
+
+function table.setmetatablekey(t,key,value)
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m[key] = value
+end
+
+function table.getmetatablekey(t,key,value)
+ local m = getmetatable(t)
+ return m and m[key]
end
@@ -3181,7 +4004,7 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['l-utils'] = {
+if not modules then modules = { } end modules ['util-mrg'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -3191,89 +4014,85 @@ if not modules then modules = { } end modules ['l-utils'] = {
-- hm, quite unreadable
-local gsub = string.gsub
+local gsub, format = string.gsub, string.format
local concat = table.concat
local type, next = type, next
-if not utils then utils = { } end
-if not utils.merger then utils.merger = { } end
-if not utils.lua then utils.lua = { } end
+utilities = utilities or {}
+utilities.merger = utilities.merger or { } -- maybe mergers
+utilities.report = logs and logs.reporter("system") or print
+
+local merger = utilities.merger
+
+merger.strip_comment = true
+
+local m_begin_merge = "begin library merge"
+local m_end_merge = "end library merge"
+local m_begin_closure = "do -- create closure to overcome 200 locals limit"
+local m_end_closure = "end -- of closure"
-utils.merger.m_begin = "begin library merge"
-utils.merger.m_end = "end library merge"
-utils.merger.pattern =
+local m_pattern =
"%c+" ..
- "%-%-%s+" .. utils.merger.m_begin ..
+ "%-%-%s+" .. m_begin_merge ..
"%c+(.-)%c+" ..
- "%-%-%s+" .. utils.merger.m_end ..
+ "%-%-%s+" .. m_end_merge ..
"%c+"
-function utils.merger._self_fake_()
- return
- "-- " .. "created merged file" .. "\n\n" ..
- "-- " .. utils.merger.m_begin .. "\n\n" ..
- "-- " .. utils.merger.m_end .. "\n\n"
-end
+local m_format =
+ "\n\n-- " .. m_begin_merge ..
+ "\n%s\n" ..
+ "-- " .. m_end_merge .. "\n\n"
-function utils.report(...)
- print(...)
+local m_faked =
+ "-- " .. "created merged file" .. "\n\n" ..
+ "-- " .. m_begin_merge .. "\n\n" ..
+ "-- " .. m_end_merge .. "\n\n"
+
+local function self_fake()
+ return m_faked
end
-utils.merger.strip_comment = true
+local function self_nothing()
+ return ""
+end
-function utils.merger._self_load_(name)
- local f, data = io.open(name), ""
- if f then
- utils.report("reading merge from %s",name)
- data = f:read("*all")
- f:close()
+local function self_load(name)
+ local data = io.loaddata(name) or ""
+ if data == "" then
+ utilities.report("merge: unknown file %s",name)
else
- utils.report("unknown file to merge %s",name)
- end
- if data and utils.merger.strip_comment then
- -- saves some 20K
- data = gsub(data,"%-%-~[^\n\r]*[\r\n]", "")
+ utilities.report("merge: inserting %s",name)
end
return data or ""
end
-function utils.merger._self_save_(name, data)
+local function self_save(name, data)
if data ~= "" then
- local f = io.open(name,'w')
- if f then
- utils.report("saving merge from %s",name)
- f:write(data)
- f:close()
+ if merger.strip_comment then
+ -- saves some 20K
+ local n = #data
+ data = gsub(data,"%-%-~[^\n\r]*[\r\n]","")
+ utilities.report("merge: %s bytes of comment stripped, %s bytes of code left",n-#data,#data)
end
+ io.savedata(name,data)
+ utilities.report("merge: saving %s",name)
end
end
-function utils.merger._self_swap_(data,code)
- if data ~= "" then
- return (gsub(data,utils.merger.pattern, function(s)
- return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n"
- end, 1))
- else
- return ""
- end
+local function self_swap(data,code)
+ return data ~= "" and (gsub(data,m_pattern, function() return format(m_format,code) end, 1)) or ""
end
---~ stripper:
---~
---~ data = gsub(data,"%-%-~[^\n]*\n","")
---~ data = gsub(data,"\n\n+","\n")
-
-function utils.merger._self_libs_(libs,list)
- local result, f, frozen = { }, nil, false
+local function self_libs(libs,list)
+ local result, f, frozen, foundpath = { }, nil, false, nil
result[#result+1] = "\n"
if type(libs) == 'string' then libs = { libs } end
if type(list) == 'string' then list = { list } end
- local foundpath = nil
for i=1,#libs do
local lib = libs[i]
for j=1,#list do
local pth = gsub(list[j],"\\","/") -- file.clean_path
- utils.report("checking library path %s",pth)
+ utilities.report("merge: checking library path %s",pth)
local name = pth .. "/" .. lib
if lfs.isfile(name) then
foundpath = pth
@@ -3282,76 +4101,75 @@ function utils.merger._self_libs_(libs,list)
if foundpath then break end
end
if foundpath then
- utils.report("using library path %s",foundpath)
+ utilities.report("merge: using library path %s",foundpath)
local right, wrong = { }, { }
for i=1,#libs do
local lib = libs[i]
local fullname = foundpath .. "/" .. lib
if lfs.isfile(fullname) then
- -- right[#right+1] = lib
- utils.report("merging library %s",fullname)
- result[#result+1] = "do -- create closure to overcome 200 locals limit"
+ utilities.report("merge: using library %s",fullname)
+ right[#right+1] = lib
+ result[#result+1] = m_begin_closure
result[#result+1] = io.loaddata(fullname,true)
- result[#result+1] = "end -- of closure"
+ result[#result+1] = m_end_closure
else
- -- wrong[#wrong+1] = lib
- utils.report("no library %s",fullname)
+ utilities.report("merge: skipping library %s",fullname)
+ wrong[#wrong+1] = lib
end
end
if #right > 0 then
- utils.report("merged libraries: %s",concat(right," "))
+ utilities.report("merge: used libraries: %s",concat(right," "))
end
if #wrong > 0 then
- utils.report("skipped libraries: %s",concat(wrong," "))
+ utilities.report("merge: skipped libraries: %s",concat(wrong," "))
end
else
- utils.report("no valid library path found")
+ utilities.report("merge: no valid library path found")
end
return concat(result, "\n\n")
end
-function utils.merger.selfcreate(libs,list,target)
+function merger.selfcreate(libs,list,target)
if target then
- utils.merger._self_save_(
- target,
- utils.merger._self_swap_(
- utils.merger._self_fake_(),
- utils.merger._self_libs_(libs,list)
- )
- )
+ self_save(target,self_swap(self_fake(),self_libs(libs,list)))
end
end
-function utils.merger.selfmerge(name,libs,list,target)
- utils.merger._self_save_(
- target or name,
- utils.merger._self_swap_(
- utils.merger._self_load_(name),
- utils.merger._self_libs_(libs,list)
- )
- )
+function merger.selfmerge(name,libs,list,target)
+ self_save(target or name,self_swap(self_load(name),self_libs(libs,list)))
end
-function utils.merger.selfclean(name)
- utils.merger._self_save_(
- name,
- utils.merger._self_swap_(
- utils.merger._self_load_(name),
- ""
- )
- )
+function merger.selfclean(name)
+ self_save(name,self_swap(self_load(name),self_nothing()))
end
-function utils.lua.compile(luafile, lucfile, cleanup, strip) -- defaults: cleanup=false strip=true
- -- utils.report("compiling",luafile,"into",lucfile)
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-lua'] = {
+ 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"
+}
+
+utilities = utilities or {}
+utilities.lua = utilities.lua or { }
+utilities.report = logs and logs.reporter("system") or print
+
+function utilities.lua.compile(luafile,lucfile,cleanup,strip) -- defaults: cleanup=false strip=true
+ utilities.report("lua: compiling %s into %s",luafile,lucfile)
os.remove(lucfile)
- local command = "-o " .. string.quote(lucfile) .. " " .. string.quote(luafile)
+ local command = "-o " .. string.quoted(lucfile) .. " " .. string.quoted(luafile)
if strip ~= false then
command = "-s " .. command
end
- local done = (os.spawn("texluac " .. command) == 0) or (os.spawn("luac " .. command) == 0)
+ local done = os.spawn("texluac " .. command) == 0 or os.spawn("luac " .. command) == 0
if done and cleanup == true and lfs.isfile(lucfile) and lfs.isfile(luafile) then
- -- utils.report("removing",luafile)
+ utilities.report("lua: removing %s",luafile)
os.remove(luafile)
end
return done
@@ -3359,11 +4177,16 @@ end
+
+
+
+
+
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['l-aux'] = {
+if not modules then modules = { } end modules ['util-prs'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -3371,15 +4194,20 @@ if not modules then modules = { } end modules ['l-aux'] = {
license = "see context related readme files"
}
--- for inline, no store split : for s in string.gmatch(str,",* *([^,]+)") do .. end
+local P, R, V, C, Ct, Carg = lpeg.P, lpeg.R, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Carg
+local lpegmatch = lpeg.match
+local concat, format, gmatch = table.concat, string.format, string.gmatch
+local tostring, type, next = tostring, type, next
-aux = aux or { }
+utilities = utilities or {}
+utilities.parsers = utilities.parsers or { }
+local parsers = utilities.parsers
+parsers.patterns = parsers.patterns or { }
-local concat, format, gmatch = table.concat, string.format, string.gmatch
-local tostring, type = tostring, type
-local lpegmatch = lpeg.match
+local setmetatableindex = table.setmetatableindex
+local sortedhash = table.sortedhash
-local P, R, V = lpeg.P, lpeg.R, lpeg.V
+-- we could use a Cf Cg construct
local escape, left, right = P("\\"), P('{'), P('}')
@@ -3388,29 +4216,35 @@ lpeg.patterns.balanced = P {
[2] = left * V(1) * right
}
-local space = lpeg.P(' ')
-local equal = lpeg.P("=")
-local comma = lpeg.P(",")
-local lbrace = lpeg.P("{")
-local rbrace = lpeg.P("}")
+local space = P(' ')
+local equal = P("=")
+local comma = P(",")
+local lbrace = P("{")
+local rbrace = P("}")
local nobrace = 1 - (lbrace+rbrace)
-local nested = lpeg.P { lbrace * (nobrace + lpeg.V(1))^0 * rbrace }
+local nested = P { lbrace * (nobrace + V(1))^0 * rbrace }
local spaces = space^0
-local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
+lpeg.patterns.nested = nested
+
+local value = P(lbrace * C((nobrace + nested)^0) * rbrace) + C((nested + (1-comma))^0)
-local key = lpeg.C((1-equal-comma)^1)
-local pattern_a = (space+comma)^0 * (key * equal * value + key * lpeg.C(""))
+local key = C((1-equal-comma)^1)
+local pattern_a = (space+comma)^0 * (key * equal * value + key * C(""))
local pattern_c = (space+comma)^0 * (key * equal * value)
-local key = lpeg.C((1-space-equal-comma)^1)
-local pattern_b = spaces * comma^0 * spaces * (key * ((spaces * equal * spaces * value) + lpeg.C("")))
+local key = C((1-space-equal-comma)^1)
+local pattern_b = spaces * comma^0 * spaces * (key * ((spaces * equal * spaces * value) + C("")))
-- "a=1, b=2, c=3, d={a{b,c}d}, e=12345, f=xx{a{b,c}d}xx, g={}" : outer {} removes, leading spaces ignored
local hash = { }
-local function set(key,value) -- using Carg is slower here
+local function set(key,value)
+ hash[key] = value
+end
+
+local function set(key,value)
hash[key] = value
end
@@ -3418,11 +4252,11 @@ local pattern_a_s = (pattern_a/set)^1
local pattern_b_s = (pattern_b/set)^1
local pattern_c_s = (pattern_c/set)^1
-aux.settings_to_hash_pattern_a = pattern_a_s
-aux.settings_to_hash_pattern_b = pattern_b_s
-aux.settings_to_hash_pattern_c = pattern_c_s
+parsers.patterns.settings_to_hash_a = pattern_a_s
+parsers.patterns.settings_to_hash_b = pattern_b_s
+parsers.patterns.settings_to_hash_c = pattern_c_s
-function aux.make_settings_to_hash_pattern(set,how)
+function parsers.make_settings_to_hash_pattern(set,how)
if how == "strict" then
return (pattern_c/set)^1
elseif how == "tolerant" then
@@ -3432,21 +4266,17 @@ function aux.make_settings_to_hash_pattern(set,how)
end
end
-function aux.settings_to_hash(str,existing)
+function parsers.settings_to_hash(str,existing)
if str and str ~= "" then
hash = existing or { }
- if moretolerant then
- lpegmatch(pattern_b_s,str)
- else
- lpegmatch(pattern_a_s,str)
- end
+ lpegmatch(pattern_a_s,str)
return hash
else
return { }
end
end
-function aux.settings_to_hash_tolerant(str,existing)
+function parsers.settings_to_hash_tolerant(str,existing)
if str and str ~= "" then
hash = existing or { }
lpegmatch(pattern_b_s,str)
@@ -3456,7 +4286,7 @@ function aux.settings_to_hash_tolerant(str,existing)
end
end
-function aux.settings_to_hash_strict(str,existing)
+function parsers.settings_to_hash_strict(str,existing)
if str and str ~= "" then
hash = existing or { }
lpegmatch(pattern_c_s,str)
@@ -3467,16 +4297,16 @@ function aux.settings_to_hash_strict(str,existing)
end
local separator = comma * space^0
-local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
-local pattern = lpeg.Ct(value*(separator*value)^0)
+local value = P(lbrace * C((nobrace + nested)^0) * rbrace) + C((nested + (1-comma))^0)
+local pattern = Ct(value*(separator*value)^0)
-- "aap, {noot}, mies" : outer {} removes, leading spaces ignored
-aux.settings_to_array_pattern = pattern
+parsers.patterns.settings_to_array = pattern
-- we could use a weak table as cache
-function aux.settings_to_array(str)
+function parsers.settings_to_array(str)
if not str or str == "" then
return { }
else
@@ -3488,16 +4318,16 @@ local function set(t,v)
t[#t+1] = v
end
-local value = lpeg.P(lpeg.Carg(1)*value) / set
-local pattern = value*(separator*value)^0 * lpeg.Carg(1)
+local value = P(Carg(1)*value) / set
+local pattern = value*(separator*value)^0 * Carg(1)
-function aux.add_settings_to_array(t,str)
+function parsers.add_settings_to_array(t,str)
return lpegmatch(pattern,str,nil,t)
end
-function aux.hash_to_string(h,separator,yes,no,strict,omit)
+function parsers.hash_to_string(h,separator,yes,no,strict,omit)
if h then
- local t, s = { }, table.sortedkeys(h)
+ local t, tn, s = { }, 0, table.sortedkeys(h)
omit = omit and table.tohash(omit)
for i=1,#s do
local key = s[i]
@@ -3506,15 +4336,19 @@ function aux.hash_to_string(h,separator,yes,no,strict,omit)
if type(value) == "boolean" then
if yes and no then
if value then
- t[#t+1] = key .. '=' .. yes
+ tn = tn + 1
+ t[tn] = key .. '=' .. yes
elseif not strict then
- t[#t+1] = key .. '=' .. no
+ tn = tn + 1
+ t[tn] = key .. '=' .. no
end
elseif value or not strict then
- t[#t+1] = key .. '=' .. tostring(value)
+ tn = tn + 1
+ t[tn] = key .. '=' .. tostring(value)
end
else
- t[#t+1] = key .. '=' .. value
+ tn = tn + 1
+ t[tn] = key .. '=' .. value
end
end
end
@@ -3524,7 +4358,7 @@ function aux.hash_to_string(h,separator,yes,no,strict,omit)
end
end
-function aux.array_to_string(a,separator)
+function parsers.array_to_string(a,separator)
if a then
return concat(a,separator or ",")
else
@@ -3532,107 +4366,160 @@ function aux.array_to_string(a,separator)
end
end
-function aux.settings_to_set(str,t)
+function parsers.settings_to_set(str,t) -- tohash? -- todo: lpeg -- duplicate anyway
t = t or { }
- for s in gmatch(str,"%s*([^,]+)") do
+-- for s in gmatch(str,"%s*([^, ]+)") do -- space added
+ for s in gmatch(str,"[^, ]+") do -- space added
t[s] = true
end
return t
end
-local value = lbrace * lpeg.C((nobrace + nested)^0) * rbrace
-local pattern = lpeg.Ct((space + value)^0)
+function parsers.simple_hash_to_string(h, separator)
+ local t, tn = { }, 0
+ for k, v in sortedhash(h) do
+ if v then
+ tn = tn + 1
+ t[tn] = k
+ end
+ end
+ return concat(t,separator or ",")
+end
+
+local value = lbrace * C((nobrace + nested)^0) * rbrace
+local pattern = Ct((space + value)^0)
-function aux.arguments_to_table(str)
+function parsers.arguments_to_table(str)
return lpegmatch(pattern,str)
end
--- temporary here
+-- temporary here (unoptimized)
-function aux.getparameters(self,class,parentclass,settings)
+function parsers.getparameters(self,class,parentclass,settings)
local sc = self[class]
if not sc then
- sc = table.clone(self[parent])
+ sc = { }
self[class] = sc
+ if parentclass then
+ local sp = self[parentclass]
+ if not sp then
+ sp = { }
+ self[parentclass] = sp
+ end
+ setmetatableindex(sc,sp)
+ end
end
- aux.settings_to_hash(settings,sc)
+ parsers.settings_to_hash(settings,sc)
+end
+
+function parsers.listitem(str)
+ return gmatch(str,"[^, ]+")
end
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-fmt'] = {
+ 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"
+}
+
+utilities = utilities or { }
+utilities.formatters = utilities.formatters or { }
+local formatters = utilities.formatters
+
+local concat, format = table.concat, string.format
+local tostring, type = tostring, type
+local strip = string.strip
+
+local P, R, Cs = lpeg.P, lpeg.R, lpeg.Cs
+local lpegmatch = lpeg.match
+
-- temporary here
-local digit = lpeg.R("09")
-local period = lpeg.P(".")
-local zero = lpeg.P("0")
+local digit = R("09")
+local period = P(".")
+local zero = P("0")
local trailingzeros = zero^0 * -digit -- suggested by Roberto R
local case_1 = period * trailingzeros / ""
local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
local number = digit^1 * (case_1 + case_2)
-local stripper = lpeg.Cs((number + 1)^0)
+local stripper = Cs((number + 1)^0)
---~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
---~ collectgarbage("collect")
---~ str = string.rep(sample,10000)
---~ local ts = os.clock()
---~ lpegmatch(stripper,str)
---~ print(#str, os.clock()-ts, lpegmatch(stripper,sample))
-lpeg.patterns.strip_zeros = stripper
+lpeg.patterns.stripzeros = stripper
-function aux.strip_zeros(str)
+function formatters.stripzeros(str)
return lpegmatch(stripper,str)
end
-function aux.definetable(target) -- defines undefined tables
- local composed, t = nil, { }
- for name in gmatch(target,"([^%.]+)") do
- if composed then
- composed = composed .. "." .. name
- else
- composed = name
+function formatters.formatcolumns(result,between)
+ if result and #result > 0 then
+ between = between or " "
+ local widths, numbers = { }, { }
+ local first = result[1]
+ local n = #first
+ for i=1,n do
+ widths[i] = 0
+ end
+ for i=1,#result do
+ local r = result[i]
+ for j=1,n do
+ local rj = r[j]
+ local tj = type(rj)
+ if tj == "number" then
+ numbers[j] = true
+ end
+ if tj ~= "string" then
+ rj = tostring(rj)
+ r[j] = rj
+ end
+ local w = #rj
+ if w > widths[j] then
+ widths[j] = w
+ end
+ end
+ end
+ for i=1,n do
+ local w = widths[i]
+ if numbers[i] then
+ if w > 80 then
+ widths[i] = "%s" .. between
+ else
+ widths[i] = "%0" .. w .. "i" .. between
+ end
+ else
+ if w > 80 then
+ widths[i] = "%s" .. between
+ elseif w > 0 then
+ widths[i] = "%-" .. w .. "s" .. between
+ else
+ widths[i] = "%s"
+ end
+ end
+ end
+ local template = strip(concat(widths))
+ for i=1,#result do
+ local str = format(template,unpack(result[i]))
+ result[i] = strip(str)
end
- t[#t+1] = format("%s = %s or { }",composed,composed)
- end
- return concat(t,"\n")
-end
-
-function aux.accesstable(target)
- local t = _G
- for name in gmatch(target,"([^%.]+)") do
- t = t[name]
end
- return t
+ return result
end
---~ function string.commaseparated(str)
---~ return gmatch(str,"([^,%s]+)")
---~ end
-
--- as we use this a lot ...
-
---~ function aux.cachefunction(action,weak)
---~ local cache = { }
---~ if weak then
---~ setmetatable(cache, { __mode = "kv" } )
---~ end
---~ local function reminder(str)
---~ local found = cache[str]
---~ if not found then
---~ found = action(str)
---~ cache[str] = found
---~ end
---~ return found
---~ end
---~ return reminder, cache
---~ end
-
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['trac-tra'] = {
+if not modules then modules = { } end modules ['util.deb'] = {
version = 1.001,
- comment = "companion to trac-tra.mkiv",
+ 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"
@@ -3645,14 +4532,16 @@ if not modules then modules = { } end modules ['trac-tra'] = {
local debug = require "debug"
local getinfo = debug.getinfo
-local type, next = type, next
-local concat = table.concat
-local format, find, lower, gmatch, gsub = string.format, string.find, string.lower, string.gmatch, string.gsub
+local type, next, tostring = type, next, tostring
+local format, find = string.format, string.find
+local is_boolean = string.is_boolean
-debugger = debugger or { }
+utilities = utilities or { }
+utilities.debugger = utilities.debugger or { }
+local debugger = utilities.debugger
local counters = { }
-local names = { }
+local names = { }
-- one
@@ -3670,6 +4559,7 @@ local function hook()
end
end
end
+
local function getname(func)
local n = names[func]
if n then
@@ -3685,6 +4575,7 @@ local function getname(func)
return "unknown"
end
end
+
function debugger.showstats(printer,threshold)
printer = printer or texio.write or print
threshold = threshold or 0
@@ -3707,35 +4598,6 @@ end
-- two
---~ local function hook()
---~ local n = getinfo(2)
---~ if n.what=="C" and not n.name then
---~ local f = tostring(debug.traceback())
---~ local cf = counters[f]
---~ if cf == nil then
---~ counters[f] = 1
---~ names[f] = n
---~ else
---~ counters[f] = cf + 1
---~ end
---~ end
---~ end
---~ function debugger.showstats(printer,threshold)
---~ printer = printer or texio.write or print
---~ threshold = threshold or 0
---~ local total, grandtotal, functions = 0, 0, 0
---~ printer("\n") -- ugly but ok
---~ -- table.sort(counters)
---~ for func, count in next, counters do
---~ if count > threshold then
---~ printer(format("%8i %s", count, func))
---~ total = total + count
---~ end
---~ grandtotal = grandtotal + count
---~ functions = functions + 1
---~ end
---~ printer(format("functions: %s, total: %s, grand total: %s, threshold: %s\n", functions, total, grandtotal, threshold))
---~ end
-- rest
@@ -3753,85 +4615,335 @@ end
function debugger.disable()
debug.sethook()
---~ counters[debug.getinfo(2,"f").func] = nil
end
-function debugger.tracing()
- local n = tonumber(os.env['MTX.TRACE.CALLS']) or tonumber(os.env['MTX_TRACE_CALLS']) or 0
- if n > 0 then
- function debugger.tracing() return true end ; return true
+
+
+
+
+local is_node = node and node.is_node
+
+function inspect(i) -- global function
+ local ti = type(i)
+ if ti == "table" then
+ table.print(i,"table")
+ elseif is_node and is_node(i) then
+ table.print(nodes.astable(i),tostring(i))
else
- function debugger.tracing() return false end ; return false
+ print(tostring(i))
end
end
---~ debugger.enable()
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
+end -- of closure
---~ debugger.disable()
+do -- create closure to overcome 200 locals limit
---~ print("")
---~ debugger.showstats()
---~ print("")
---~ debugger.showstats(print,3)
+if not modules then modules = { } end modules ['trac-inf'] = {
+ version = 1.001,
+ comment = "companion to trac-inf.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- As we want to protect the global tables, we no longer store the timing
+-- in the tables themselves but in a hidden timers table so that we don't
+-- get warnings about assignments. This is more efficient than using rawset
+-- and rawget.
+
+local format = string.format
+local clock = os.gettimeofday or os.clock -- should go in environment
+local write_nl = texio.write_nl
+
+statistics = statistics or { }
+local statistics = statistics
+
+statistics.enable = true
+statistics.threshold = 0.05
+
+local statusinfo, n, registered, timers = { }, 0, { }, { }
+
+local function hastiming(instance)
+ return instance and timers[instance]
+end
+
+local function resettiming(instance)
+ timers[instance or "notimer"] = { timing = 0, loadtime = 0 }
+end
-setters = setters or { }
-setters.data = setters.data or { }
+local function starttiming(instance)
+ local timer = timers[instance or "notimer"]
+ if not timer then
+ timer = { }
+ timers[instance or "notimer"] = timer
+ end
+ local it = timer.timing
+ if not it then
+ it = 0
+ end
+ if it == 0 then
+ timer.starttime = clock()
+ if not timer.loadtime then
+ timer.loadtime = 0
+ end
+ end
+ timer.timing = it + 1
+end
---~ local function set(t,what,value)
---~ local data, done = t.data, t.done
---~ if type(what) == "string" then
---~ what = aux.settings_to_array(what) -- inefficient but ok
---~ end
---~ for i=1,#what do
---~ local w = what[i]
---~ for d, f in next, data do
---~ if done[d] then
---~ -- prevent recursion due to wildcards
---~ elseif find(d,w) then
---~ done[d] = true
---~ for i=1,#f do
---~ f[i](value)
---~ end
---~ end
---~ end
---~ end
---~ end
+local function stoptiming(instance, report)
+ local timer = timers[instance or "notimer"]
+ local it = timer.timing
+ if it > 1 then
+ timer.timing = it - 1
+ else
+ local starttime = timer.starttime
+ if starttime then
+ local stoptime = clock()
+ local loadtime = stoptime - starttime
+ timer.stoptime = stoptime
+ timer.loadtime = timer.loadtime + loadtime
+ if report then
+ statistics.report("load time %0.3f",loadtime)
+ end
+ timer.timing = 0
+ return loadtime
+ end
+ end
+ return 0
+end
-local function set(t,what,value)
+local function elapsedtime(instance)
+ local timer = timers[instance or "notimer"]
+ return format("%0.3f",timer and timer.loadtime or 0)
+end
+
+local function elapsedindeed(instance)
+ local timer = timers[instance or "notimer"]
+ return (timer and timer.loadtime or 0) > statistics.threshold
+end
+
+local function elapsedseconds(instance,rest) -- returns nil if 0 seconds
+ if elapsedindeed(instance) then
+ return format("%s seconds %s", elapsedtime(instance),rest or "")
+ end
+end
+
+statistics.hastiming = hastiming
+statistics.resettiming = resettiming
+statistics.starttiming = starttiming
+statistics.stoptiming = stoptiming
+statistics.elapsedtime = elapsedtime
+statistics.elapsedindeed = elapsedindeed
+statistics.elapsedseconds = elapsedseconds
+
+-- general function
+
+function statistics.register(tag,fnc)
+ if statistics.enable and type(fnc) == "function" then
+ local rt = registered[tag] or (#statusinfo + 1)
+ statusinfo[rt] = { tag, fnc }
+ registered[tag] = rt
+ if #tag > n then n = #tag end
+ end
+end
+
+function statistics.show(reporter)
+ if statistics.enable then
+ if not reporter then reporter = function(tag,data,n) write_nl(tag .. " " .. data) end end
+ -- this code will move
+ local register = statistics.register
+ register("luatex banner", function()
+ return string.lower(status.banner)
+ end)
+ register("control sequences", function()
+ return format("%s of %s", status.cs_count, status.hash_size+status.hash_extra)
+ end)
+ register("callbacks", function()
+ local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0
+ return format("%s direct, %s indirect, %s total", total-indirect, indirect, total)
+ end)
+ collectgarbage("collect")
+ register("current memory usage", statistics.memused)
+ register("runtime",statistics.runtime)
+ for i=1,#statusinfo do
+ local s = statusinfo[i]
+ local r = s[2]()
+ if r then
+ reporter(s[1],r,n)
+ end
+ end
+ write_nl("") -- final newline
+ statistics.enable = false
+ end
+end
+
+local template, report_statistics, nn = nil, nil, 0 -- we only calcute it once
+
+function statistics.showjobstat(tag,data,n)
+ if not logs then
+ -- sorry
+ elseif type(data) == "table" then
+ for i=1,#data do
+ statistics.showjobstat(tag,data[i],n)
+ end
+ else
+ if not template or n > nn then
+ template, n = format("%%-%ss - %%s",n), nn
+ report_statistics = logs.reporter("mkiv lua stats")
+ end
+ report_statistics(format(template,tag,data))
+ end
+end
+
+function statistics.memused() -- no math.round yet -)
+ local round = math.round or math.floor
+ return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000))
+end
+
+starttiming(statistics)
+
+function statistics.formatruntime(runtime) -- indirect so it can be overloaded and
+ return format("%s seconds", runtime) -- indeed that happens in cure-uti.lua
+end
+
+function statistics.runtime()
+ stoptiming(statistics)
+ return statistics.formatruntime(elapsedtime(statistics))
+end
+
+function statistics.timed(action,report)
+ report = report or logs.reporter("system")
+ starttiming("run")
+ action()
+ stoptiming("run")
+ report("total runtime: %s",elapsedtime("run"))
+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")
+ tex.sprint(elapsedtime(name or "whatever"))
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['trac-set'] = { -- might become util-set.lua
+ 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 type, next, tostring = type, next, tostring
+local concat = table.concat
+local format, find, lower, gsub, escapedpattern = string.format, string.find, string.lower, string.gsub, string.escapedpattern
+local is_boolean = string.is_boolean
+local settings_to_hash = utilities.parsers.settings_to_hash
+local allocate = utilities.storage.allocate
+
+utilities = utilities or { }
+local utilities = utilities
+utilities.setters = utilities.setters or { }
+local setters = utilities.setters
+
+local data = { } -- maybe just local
+
+-- We can initialize from the cnf file. This is sort of tricky as
+-- later defined setters also need to be initialized then. If set
+-- this way, we need to ensure that they are not reset later on.
+
+local trace_initialize = false -- only for testing during development
+
+function setters.initialize(filename,name,values) -- filename only for diagnostics
+ local setter = data[name]
+ if setter then
+ local data = setter.data
+ if data then
+ for key, value in next, values do
+ -- key = gsub(key,"_",".")
+ value = is_boolean(value,value)
+ local functions = data[key]
+ if functions then
+ if #functions > 0 and not functions.value then
+ if trace_initialize then
+ setter.report("executing %s (%s -> %s)",key,filename,tostring(value))
+ end
+ for i=1,#functions do
+ functions[i](value)
+ end
+ functions.value = value
+ else
+ if trace_initialize then
+ setter.report("skipping %s (%s -> %s)",key,filename,tostring(value))
+ end
+ end
+ else
+ -- we do a simple preregistration i.e. not in the
+ -- list as it might be an obsolete entry
+ functions = { default = value }
+ data[key] = functions
+ if trace_initialize then
+ setter.report("storing %s (%s -> %s)",key,filename,tostring(value))
+ end
+ end
+ end
+ return true
+ end
+ end
+end
+
+-- user interface code
+
+local function set(t,what,newvalue)
local data, done = t.data, t.done
if type(what) == "string" then
- what = aux.settings_to_hash(what) -- inefficient but ok
+ what = settings_to_hash(what) -- inefficient but ok
+ end
+ if type(what) ~= "table" then
+ return
end
- for w, v in next, what do
- if v == "" then
- v = value
+ for w, value in next, what do
+ if value == "" then
+ value = newvalue
+ elseif not value then
+ value = false -- catch nil
else
- v = toboolean(v)
+ value = is_boolean(value,value)
end
- for d, f in next, data do
- if done[d] then
+ w = "^" .. escapedpattern(w,true) .. "$" -- new: anchored
+ for name, functions in next, data do
+ if done[name] then
-- prevent recursion due to wildcards
- elseif find(d,w) then
- done[d] = true
- for i=1,#f do
- f[i](v)
+ elseif find(name,w) then
+ done[name] = true
+ for i=1,#functions do
+ functions[i](value)
end
+ functions.value = value
end
end
end
end
local function reset(t)
- for d, f in next, t.data do
- for i=1,#f do
- f[i](false)
+ for name, functions in next, t.data do
+ for i=1,#functions do
+ functions[i](false)
end
+ functions.value = false
end
end
@@ -3852,32 +4964,51 @@ end
function setters.register(t,what,...)
local data = t.data
what = lower(what)
- local w = data[what]
- if not w then
- w = { }
- data[what] = w
+ local functions = data[what]
+ if not functions then
+ functions = { }
+ data[what] = functions
+ if trace_initialize then
+ t.report("defining %s",what)
+ end
end
+ local default = functions.default -- can be set from cnf file
for _, fnc in next, { ... } do
local typ = type(fnc)
- if typ == "function" then
- w[#w+1] = fnc
- elseif typ == "string" then
- w[#w+1] = function(value) set(t,fnc,value,nesting) end
+ if typ == "string" then
+ if trace_initialize then
+ t.report("coupling %s to %s",what,fnc)
+ end
+ local s = fnc -- else wrong reference
+ fnc = function(value) set(t,s,value) end
+ elseif typ ~= "function" then
+ fnc = nil
+ end
+ if fnc then
+ functions[#functions+1] = fnc
+ -- default: set at command line or in cnf file
+ -- value : set in tex run (needed when loading runtime)
+ local value = functions.value or default
+ if value ~= nil then
+ fnc(value)
+ functions.value = value
+ end
end
end
+ return false -- so we can use it in an assignment
end
function setters.enable(t,what)
local e = t.enable
t.enable, t.done = enable, { }
- enable(t,string.simpleesc(tostring(what)))
+ enable(t,what)
t.enable, t.done = e, { }
end
function setters.disable(t,what)
local e = t.disable
t.disable, t.done = disable, { }
- disable(t,string.simpleesc(tostring(what)))
+ disable(t,what)
t.disable, t.done = e, { }
end
@@ -3901,68 +5032,94 @@ function setters.list(t) -- pattern
end
function setters.show(t)
- commands.writestatus("","")
+ local category = t.name
local list = setters.list(t)
+ t.report()
for k=1,#list do
- commands.writestatus(t.name,list[k])
+ local name = list[k]
+ local functions = t.data[name]
+ if functions then
+ local value, default, modules = functions.value, functions.default, #functions
+ value = value == nil and "unset" or tostring(value)
+ default = default == nil and "unset" or tostring(default)
+ t.report("%-30s modules: %2i default: %6s value: %6s",name,modules,default,value)
+ end
end
- commands.writestatus("","")
+ t.report()
end
-- we could have used a bit of oo and the trackers:enable syntax but
-- there is already a lot of code around using the singular tracker
--- we could make this into a module
+-- we could make this into a module but we also want the rest avaliable
+
+local enable, disable, register, list, show = setters.enable, setters.disable, setters.register, setters.list, setters.show
+
+local function report(setter,...)
+ local report = logs and logs.report
+ if report then
+ report(setter.name,...)
+ else -- fallback, as this module is loaded before the logger
+ write_nl(format("%-15s : %s\n",setter.name,format(...)))
+ end
+end
function setters.new(name)
- local t
- t = {
- data = { },
+ local setter -- we need to access it in setter itself
+ setter = {
+ data = allocate(), -- indexed, but also default and value fields
name = name,
- enable = function(...) setters.enable (t,...) end,
- disable = function(...) setters.disable (t,...) end,
- register = function(...) setters.register(t,...) end,
- list = function(...) setters.list (t,...) end,
- show = function(...) setters.show (t,...) end,
+ report = function(...) report (setter,...) end,
+ enable = function(...) enable (setter,...) end,
+ disable = function(...) disable (setter,...) end,
+ register = function(...) register(setter,...) end,
+ list = function(...) list (setter,...) end,
+ show = function(...) show (setter,...) end,
}
- setters.data[name] = t
- return t
+ data[name] = setter
+ return setter
end
trackers = setters.new("trackers")
directives = setters.new("directives")
experiments = setters.new("experiments")
+local t_enable, t_disable, t_report = trackers .enable, trackers .disable, trackers .report
+local d_enable, d_disable, d_report = directives .enable, directives .disable, directives .report
+local e_enable, e_disable, e_report = experiments.enable, experiments.disable, experiments.report
+
-- nice trick: we overload two of the directives related functions with variants that
-- do tracing (itself using a tracker) .. proof of concept
local trace_directives = false local trace_directives = false trackers.register("system.directives", function(v) trace_directives = v end)
local trace_experiments = false local trace_experiments = false trackers.register("system.experiments", function(v) trace_experiments = v end)
-local e = directives.enable
-local d = directives.disable
-
function directives.enable(...)
- commands.writestatus("directives","enabling: %s",concat({...}," "))
- e(...)
+ if trace_directives then
+ d_report("enabling: %s",concat({...}," "))
+ end
+ d_enable(...)
end
function directives.disable(...)
- commands.writestatus("directives","disabling: %s",concat({...}," "))
- d(...)
+ if trace_directives then
+ d_report("disabling: %s",concat({...}," "))
+ end
+ d_disable(...)
end
-local e = experiments.enable
-local d = experiments.disable
-
function experiments.enable(...)
- commands.writestatus("experiments","enabling: %s",concat({...}," "))
- e(...)
+ if trace_experiments then
+ e_report("enabling: %s",concat({...}," "))
+ end
+ e_enable(...)
end
function experiments.disable(...)
- commands.writestatus("experiments","disabling: %s",concat({...}," "))
- d(...)
+ if trace_experiments then
+ e_report("disabling: %s",concat({...}," "))
+ end
+ e_disable(...)
end
-- a useful example
@@ -3971,6 +5128,1121 @@ directives.register("system.nostatistics", function(v)
statistics.enable = not v
end)
+directives.register("system.nolibraries", function(v)
+ libraries = nil -- we discard this tracing for security
+end)
+
+-- experiment
+
+local flags = environment and environment.engineflags
+
+if flags then
+ if trackers and flags.trackers then
+ setters.initialize("flags","trackers", settings_to_hash(flags.trackers))
+ -- t_enable(flags.trackers)
+ end
+ if directives and flags.directives then
+ setters.initialize("flags","directives", settings_to_hash(flags.directives))
+ -- d_enable(flags.directives)
+ end
+end
+
+-- here
+
+if texconfig then
+
+ local function set(k,v)
+ v = tonumber(v)
+ if v then
+ texconfig[k] = v
+ end
+ end
+
+ directives.register("luatex.expanddepth", function(v) set("expand_depth",v) end)
+ directives.register("luatex.hashextra", function(v) set("hash_extra",v) end)
+ directives.register("luatex.nestsize", function(v) set("nest_size",v) end)
+ directives.register("luatex.maxinopen", function(v) set("max_in_open",v) end)
+ directives.register("luatex.maxprintline", function(v) set("max_print_line",v) end)
+ directives.register("luatex.maxstrings", function(v) set("max_strings",v) end)
+ directives.register("luatex.paramsize", function(v) set("param_size",v) end)
+ directives.register("luatex.savesize", function(v) set("save_size",v) end)
+ directives.register("luatex.stacksize", function(v) set("stack_size",v) end)
+
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['trac-log'] = {
+ version = 1.001,
+ comment = "companion to trac-log.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- todo: less categories, more subcategories (e.g. nodes)
+
+
+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 escapedpattern = string.escapedpattern
+local texcount = tex and tex.count
+local next, type = next, type
+
+local setmetatableindex = table.setmetatableindex
+
+--[[ldx--
+<p>This is a prelude to a more extensive logging module. We no longer
+provide <l n='xml'/> based logging a sparsing is relatively easy anyway.</p>
+--ldx]]--
+
+logs = logs or { }
+local logs = logs
+
+local moreinfo = [[
+More information about ConTeXt and the tools that come with it can be found at:
+
+maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
+webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
+wiki : http://contextgarden.net
+]]
+
+-- basic loggers
+
+local function ignore() end
+
+setmetatableindex(logs, function(t,k) t[k] = ignore ; return ignore end)
+
+local report, subreport, status, settarget, setformats, settranslations
+
+local direct, subdirect, writer, pushtarget, poptarget
+
+if tex and tex.jobname or tex.formatname then
+
+ local valueiskey = { __index = function(t,k) t[k] = k return k end } -- will be helper
+
+ local target = "term and log"
+
+ logs.flush = io.flush
+
+ local formats = { } setmetatable(formats, valueiskey)
+ local translations = { } setmetatable(translations,valueiskey)
+
+ writer = function(...)
+ write_nl(target,...)
+ end
+
+ report = function(a,b,c,...)
+ if c then
+ write_nl(target,format("%-15s > %s\n",translations[a],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s > %s\n",translations[a],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s >\n", translations[a]))
+ else
+ write_nl(target,"\n")
+ end
+ end
+
+ direct = function(a,b,c,...)
+ if c then
+ return format("%-15s > %s",translations[a],format(formats[b],c,...))
+ elseif b then
+ return format("%-15s > %s",translations[a],formats[b])
+ elseif a then
+ return format("%-15s >", translations[a])
+ else
+ return ""
+ end
+ end
+
+ subreport = function(a,s,b,c,...)
+ if c then
+ write_nl(target,format("%-15s > %s > %s\n",translations[a],translations[s],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s > %s > %s\n",translations[a],translations[s],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s > %s >\n", translations[a],translations[s]))
+ else
+ write_nl(target,"\n")
+ end
+ end
+
+ subdirect = function(a,s,b,c,...)
+ if c then
+ return format("%-15s > %s > %s",translations[a],translations[s],format(formats[b],c,...))
+ elseif b then
+ return format("%-15s > %s > %s",translations[a],translations[s],formats[b])
+ elseif a then
+ return format("%-15s > %s >", translations[a],translations[s])
+ else
+ return ""
+ end
+ end
+
+ status = function(a,b,c,...)
+ if c then
+ write_nl(target,format("%-15s : %s\n",translations[a],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s : %s\n",translations[a],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s :\n", translations[a]))
+ else
+ write_nl(target,"\n")
+ 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
+ if target == "term" or target == "term and log" then
+ logs.flush = io.flush
+ else
+ logs.flush = ignore
+ end
+ end
+
+ local stack = { }
+
+ pushtarget = function(newtarget)
+ insert(stack,target)
+ settarget(newtarget)
+ end
+
+ poptarget = function()
+ if #stack > 0 then
+ settarget(remove(stack))
+ end
+ end
+
+ setformats = function(f)
+ formats = f
+ end
+
+ settranslations = function(t)
+ translations = t
+ end
+
+else
+
+ logs.flush = ignore
+
+ writer = write_nl
+
+ report = function(a,b,c,...)
+ if c then
+ write_nl(format("%-15s | %s",a,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s | %s",a,b))
+ elseif a then
+ write_nl(format("%-15s |", a))
+ else
+ write_nl("")
+ end
+ end
+
+ subreport = function(a,sub,b,c,...)
+ if c then
+ write_nl(format("%-15s | %s | %s",a,sub,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s | %s | %s",a,sub,b))
+ elseif a then
+ write_nl(format("%-15s | %s |", a,sub))
+ else
+ write_nl("")
+ end
+ end
+
+ status = function(a,b,c,...) -- not to be used in lua anyway
+ if c then
+ write_nl(format("%-15s : %s\n",a,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s : %s\n",a,b)) -- b can have %'s
+ elseif a then
+ write_nl(format("%-15s :\n", a))
+ else
+ write_nl("\n")
+ end
+ end
+
+ direct = ignore
+ subdirect = ignore
+
+ settarget = ignore
+ pushtarget = ignore
+ poptarget = ignore
+ setformats = ignore
+ settranslations = ignore
+
+end
+
+logs.report = report
+logs.subreport = subreport
+logs.status = status
+logs.settarget = settarget
+logs.pushtarget = pushtarget
+logs.poptarget = poptarget
+logs.setformats = setformats
+logs.settranslations = settranslations
+
+logs.direct = direct
+logs.subdirect = subdirect
+logs.writer = writer
+
+-- installer
+
+-- todo: renew (un) locks when a new one is added and wildcard
+
+local data, states = { }, nil
+
+function logs.reporter(category,subcategory)
+ local logger = data[category]
+ if not logger then
+ local state = false
+ if states == true then
+ state = true
+ elseif type(states) == "table" then
+ for c, _ in next, states do
+ if find(category,c) then
+ state = true
+ break
+ end
+ end
+ end
+ logger = {
+ reporters = { },
+ state = state,
+ }
+ data[category] = logger
+ end
+ local reporter = logger.reporters[subcategory or "default"]
+ if not reporter then
+ if subcategory then
+ reporter = function(...)
+ if not logger.state then
+ subreport(category,subcategory,...)
+ end
+ end
+ logger.reporters[subcategory] = reporter
+ else
+ local tag = category
+ reporter = function(...)
+ if not logger.state then
+ report(category,...)
+ end
+ end
+ logger.reporters.default = reporter
+ end
+ end
+ return reporter
+end
+
+logs.new = logs.reporter -- for old times sake
+
+-- context specicific: this ends up in the macro stream
+
+local ctxreport = logs.writer
+
+function logs.setmessenger(m)
+ ctxreport = m
+end
+
+function logs.messenger(category,subcategory)
+ -- we need to avoid catcode mess (todo: fast context)
+ if subcategory then
+ return function(...)
+ ctxreport(subdirect(category,subcategory,...))
+ end
+ else
+ return function(...)
+ ctxreport(direct(category,...))
+ end
+ end
+end
+
+-- so far
+
+local function setblocked(category,value)
+ if category == true then
+ -- lock all
+ category, value = "*", true
+ elseif category == false then
+ -- unlock all
+ category, value = "*", false
+ elseif value == nil then
+ -- lock selective
+ value = true
+ end
+ if category == "*" then
+ states = value
+ for k, v in next, data do
+ v.state = value
+ end
+ else
+ states = utilities.parsers.settings_to_hash(category)
+ for c, _ in next, states do
+ if data[c] then
+ v.state = value
+ else
+ c = escapedpattern(c,true)
+ for k, v in next, data do
+ if find(k,c) then
+ v.state = value
+ end
+ end
+ end
+ end
+ end
+end
+
+function logs.disable(category,value)
+ setblocked(category,value == nil and true or value)
+end
+
+function logs.enable(category)
+ setblocked(category,false)
+end
+
+function logs.categories()
+ return table.sortedkeys(data)
+end
+
+function logs.show()
+ local n, c, s, max = 0, 0, 0, 0
+ for category, v in table.sortedpairs(data) do
+ n = n + 1
+ local state = v.state
+ local reporters = v.reporters
+ local nc = #category
+ if nc > c then
+ c = nc
+ end
+ for subcategory, _ in next, reporters do
+ local ns = #subcategory
+ if ns > c then
+ s = ns
+ end
+ local m = nc + ns
+ if m > max then
+ max = m
+ end
+ end
+ local subcategories = concat(table.sortedkeys(reporters),", ")
+ if state == true then
+ state = "disabled"
+ elseif state == false then
+ state = "enabled"
+ else
+ state = "unknown"
+ end
+ -- no new here
+ report("logging","category: '%s', subcategories: '%s', state: '%s'",category,subcategories,state)
+ end
+ report("logging","categories: %s, max category: %s, max subcategory: %s, max combined: %s",n,c,s,max)
+end
+
+directives.register("logs.blocked", function(v)
+ setblocked(v,true)
+end)
+
+directives.register("logs.target", function(v)
+ settarget(v)
+end)
+
+-- tex specific loggers (might move elsewhere)
+
+local report_pages = logs.reporter("pages") -- not needed but saves checking when we grep for it
+
+local real, user, sub
+
+function logs.start_page_number()
+ real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
+end
+
+function logs.stop_page_number()
+ if real > 0 then
+ if user > 0 then
+ if sub > 0 then
+ report_pages("flushing realpage %s, userpage %s, subpage %s",real,user,sub)
+ else
+ report_pages("flushing realpage %s, userpage %s",real,user)
+ end
+ else
+ report_pages("flushing realpage %s",real)
+ end
+ else
+ report_pages("flushing page")
+ end
+ logs.flush()
+end
+
+logs.report_job_stat = statistics and statistics.showjobstat
+
+local report_files = logs.reporter("files")
+
+local nesting = 0
+local verbose = false
+local hasscheme = url.hasscheme
+
+-- we don't have show_open and show_close callbacks yet
+
+function logs.show_open(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- nesting = nesting + 1
+ -- report_files("level %s, opening %s",nesting,name)
+ -- else
+ -- write(format("(%s",name)) -- tex adds a space
+ -- end
+ -- end
+end
+
+function logs.show_close(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- report_files("level %s, closing %s",nesting,name)
+ -- nesting = nesting - 1
+ -- else
+ -- write(")") -- tex adds a space
+ -- end
+ -- end
+end
+
+function logs.show_load(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- report_files("level %s, loading %s",nesting+1,name)
+ -- else
+ -- write(format("(%s)",name))
+ -- end
+ -- end
+end
+
+-- there may be scripts out there using this:
+
+local simple = logs.reporter("comment")
+
+logs.simple = simple
+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
+
+-- applications
+
+local function reportlines(t,str)
+ if str then
+ for line in gmatch(str,"(.-)[\n\r]") do
+ t.report(line)
+ end
+ end
+end
+
+local function reportbanner(t)
+ local banner = t.banner
+ if banner then
+ t.report(banner)
+ t.report()
+ end
+end
+
+local function reporthelp(t,...)
+ local helpinfo = t.helpinfo
+ if type(helpinfo) == "string" then
+ reportlines(t,helpinfo)
+ elseif type(helpinfo) == "table" then
+ local tags = { ... }
+ for i=1,#tags do
+ reportlines(t,t.helpinfo[tags[i]])
+ if i < #tags then
+ t.report()
+ end
+ end
+ end
+end
+
+local function reportinfo(t)
+ t.report()
+ reportlines(t,moreinfo)
+end
+
+function logs.application(t)
+ t.name = t.name or "unknown"
+ t.banner = t.banner
+ t.report = logs.reporter(t.name)
+ t.help = function(...) reportbanner(t) ; reporthelp(t,...) ; reportinfo(t) end
+ t.identify = function() reportbanner(t) end
+ return t
+end
+
+-- somewhat special
+
+-- logging to a file
+
+
+function logs.system(whereto,process,jobname,category,...)
+ local message = format("%s %s => %s => %s => %s\r",os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...))
+ for i=1,10 do
+ local f = io.open(whereto,"a") -- we can consider keepint the file open
+ if f then
+ f:write(message)
+ f:close()
+ break
+ else
+ sleep(0.1)
+ end
+ end
+end
+
+local report_system = logs.reporter("system","logs")
+
+function logs.obsolete(old,new)
+ local o = loadstring("return " .. new)()
+ if type(o) == "function" then
+ return function(...)
+ report_system("function %s is obsolete, use %s",old,new)
+ loadstring(old .. "=" .. new .. " return ".. old)()(...)
+ end
+ elseif type(o) == "table" then
+ local t, m = { }, { }
+ m.__index = function(t,k)
+ report_system("table %s is obsolete, use %s",old,new)
+ m.__index, m.__newindex = o, o
+ return o[k]
+ end
+ m.__newindex = function(t,k,v)
+ report_system("table %s is obsolete, use %s",old,new)
+ m.__index, m.__newindex = o, o
+ o[k] = v
+ end
+ if libraries then
+ libraries.obsolete[old] = t -- true
+ end
+ setmetatable(t,m)
+ return t
+ end
+end
+
+if utilities then
+ utilities.report = report_system
+end
+
+if tex and tex.error then
+ function logs.texerrormessage(...) -- for the moment we put this function here
+ tex.error(format(...), { })
+ end
+else
+ function logs.texerrormessage(...)
+ print(format(...))
+ end
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['trac-pro'] = {
+ 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 getmetatable, setmetatable, rawset, type = getmetatable, setmetatable, rawset, type
+
+-- The protection implemented here is probably not that tight but good enough to catch
+-- problems due to naive usage.
+--
+-- There's a more extensive version (trac-xxx.lua) that supports nesting.
+--
+-- This will change when we have _ENV in lua 5.2+
+
+local trace_namespaces = false trackers.register("system.namespaces", function(v) trace_namespaces = v end)
+
+local report_system = logs.reporter("system","protection")
+
+namespaces = namespaces or { }
+local namespaces = namespaces
+
+local registered = { }
+
+local function report_index(k,name)
+ if trace_namespaces then
+ report_system("reference to '%s' in protected namespace '%s', %s",k,name,debug.traceback())
+ else
+ report_system("reference to '%s' in protected namespace '%s'",k,name)
+ end
+end
+
+local function report_newindex(k,name)
+ if trace_namespaces then
+ report_system("assignment to '%s' in protected namespace '%s', %s",k,name,debug.traceback())
+ else
+ report_system("assignment to '%s' in protected namespace '%s'",k,name)
+ end
+end
+
+local function register(name)
+ local data = name == "global" and _G or _G[name]
+ if not data then
+ return -- error
+ end
+ registered[name] = data
+ local m = getmetatable(data)
+ if not m then
+ m = { }
+ setmetatable(data,m)
+ end
+ local index, newindex = { }, { }
+ m.__saved__index = m.__index
+ m.__no__index = function(t,k)
+ if not index[k] then
+ index[k] = true
+ report_index(k,name)
+ end
+ return nil
+ end
+ m.__saved__newindex = m.__newindex
+ m.__no__newindex = function(t,k,v)
+ if not newindex[k] then
+ newindex[k] = true
+ report_newindex(k,name)
+ end
+ rawset(t,k,v)
+ end
+ m.__protection__depth = 0
+end
+
+local function private(name) -- maybe save name
+ local data = registered[name]
+ if not data then
+ data = _G[name]
+ if not data then
+ data = { }
+ _G[name] = data
+ end
+ register(name)
+ end
+ return data
+end
+
+local function protect(name)
+ local data = registered[name]
+ if not data then
+ return
+ end
+ local m = getmetatable(data)
+ local pd = m.__protection__depth
+ if pd > 0 then
+ m.__protection__depth = pd + 1
+ else
+ m.__save_d_index, m.__saved__newindex = m.__index, m.__newindex
+ m.__index, m.__newindex = m.__no__index, m.__no__newindex
+ m.__protection__depth = 1
+ end
+end
+
+local function unprotect(name)
+ local data = registered[name]
+ if not data then
+ return
+ end
+ local m = getmetatable(data)
+ local pd = m.__protection__depth
+ if pd > 1 then
+ m.__protection__depth = pd - 1
+ else
+ m.__index, m.__newindex = m.__saved__index, m.__saved__newindex
+ m.__protection__depth = 0
+ end
+end
+
+local function protectall()
+ for name, _ in next, registered do
+ if name ~= "global" then
+ protect(name)
+ end
+ end
+end
+
+local function unprotectall()
+ for name, _ in next, registered do
+ if name ~= "global" then
+ unprotect(name)
+ end
+ end
+end
+
+namespaces.register = register -- register when defined
+namespaces.private = private -- allocate and register if needed
+namespaces.protect = protect
+namespaces.unprotect = unprotect
+namespaces.protectall = protectall
+namespaces.unprotectall = unprotectall
+
+namespaces.private("namespaces") registered = { } register("global") -- unreachable
+
+directives.register("system.protect", function(v)
+ if v then
+ protectall()
+ else
+ unprotectall()
+ end
+end)
+
+directives.register("system.checkglobals", function(v)
+ if v then
+ report_system("enabling global namespace guard")
+ protect("global")
+ else
+ report_system("disabling global namespace guard")
+ unprotect("global")
+ end
+end)
+
+-- dummy section (will go to luat-dum.lua)
+
+
+
+
+
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['luat-env'] = {
+ 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"
+}
+
+-- A former version provided functionality for non embeded core
+-- scripts i.e. runtime library loading. Given the amount of
+-- Lua code we use now, this no longer makes sense. Much of this
+-- evolved before bytecode arrays were available and so a lot of
+-- code has disappeared already.
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_lua = logs.reporter("resolvers","lua")
+
+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 concat = table.concat
+
+-- precautions
+
+os.setlocale(nil,nil) -- useless feature and even dangerous in luatex
+
+function os.setlocale()
+ -- no way you can mess with it
+end
+
+-- dirty tricks
+
+if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
+ arg[-1] = arg[0]
+ arg[ 0] = arg[2]
+ for k=3,#arg do
+ arg[k-2] = arg[k]
+ end
+ arg[#arg] = nil -- last
+ arg[#arg] = nil -- pre-last
+end
+
+-- environment
+
+environment = environment or { }
+local environment = environment
+
+environment.arguments = allocate()
+environment.files = allocate()
+environment.sortedflags = nil
+
+local mt = {
+ __index = function(_,k)
+ if k == "version" then
+ local version = tex.toks and tex.toks.contextversiontoks
+ if version and version ~= "" then
+ rawset(environment,"version",version)
+ return version
+ else
+ return "unknown"
+ end
+ elseif k == "jobname" or k == "formatname" then
+ local name = tex and tex[k]
+ if name or name== "" then
+ rawset(environment,k,name)
+ return name
+ else
+ return "unknown"
+ end
+ elseif k == "outputfilename" then
+ local name = environment.jobname
+ rawset(environment,k,name)
+ return name
+ end
+ end
+}
+
+setmetatable(environment,mt)
+
+function environment.initializearguments(arg)
+ local arguments, files = { }, { }
+ environment.arguments, environment.files, environment.sortedflags = arguments, files, nil
+ for index=1,#arg do
+ local argument = arg[index]
+ if index > 0 then
+ local flag, value = match(argument,"^%-+(.-)=(.-)$")
+ if flag then
+ arguments[flag] = unquoted(value or "")
+ else
+ flag = match(argument,"^%-+(.+)")
+ if flag then
+ arguments[flag] = true
+ else
+ files[#files+1] = argument
+ end
+ end
+ end
+ end
+ environment.ownname = environment.ownname or arg[0] or 'unknown.lua'
+end
+
+function environment.setargument(name,value)
+ environment.arguments[name] = value
+end
+
+-- todo: defaults, better checks e.g on type (boolean versus string)
+--
+-- tricky: too many hits when we support partials unless we add
+-- a registration of arguments so from now on we have 'partial'
+
+function environment.argument(name,partial)
+ local arguments, sortedflags = environment.arguments, environment.sortedflags
+ if arguments[name] then
+ return arguments[name]
+ elseif partial then
+ if not sortedflags then
+ sortedflags = allocate(table.sortedkeys(arguments))
+ for k=1,#sortedflags do
+ sortedflags[k] = "^" .. sortedflags[k]
+ end
+ environment.sortedflags = sortedflags
+ end
+ -- example of potential clash: ^mode ^modefile
+ for k=1,#sortedflags do
+ local v = sortedflags[k]
+ if find(name,v) then
+ return arguments[sub(v,2,#v)]
+ end
+ end
+ end
+ return nil
+end
+
+function environment.splitarguments(separator) -- rather special, cut-off before separator
+ local done, before, after = false, { }, { }
+ local originalarguments = environment.originalarguments
+ for k=1,#originalarguments do
+ local v = originalarguments[k]
+ if not done and v == separator then
+ done = true
+ elseif done then
+ after[#after+1] = v
+ else
+ before[#before+1] = v
+ end
+ end
+ return before, after
+end
+
+function environment.reconstructcommandline(arg,noquote)
+ 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
+ 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," ") then
+ result[#result+1] = quoted(a)
+ else
+ result[#result+1] = a
+ end
+ 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
+ local argument = arg[index]
+ if find(argument,"^\"") then
+ newarg[#newarg+1] = gsub(argument,"^\"","")
+ if not find(argument,"\"$") then
+ instring = true
+ end
+ elseif find(argument,"\"$") then
+ newarg[#newarg] = newarg[#newarg] .. " " .. gsub(argument,"\"$","")
+ instring = false
+ elseif instring then
+ newarg[#newarg] = newarg[#newarg] .. " " .. argument
+ else
+ newarg[#newarg+1] = argument
+ end
+ end
+ for i=1,-5,-1 do
+ newarg[i] = arg[i]
+ end
+
+ environment.initializearguments(newarg)
+
+ environment.originalarguments = mark(newarg)
+ environment.rawarguments = mark(arg)
+
+ arg = { } -- prevent duplicate handling
+
+end
+
+-- weird place ... depends on a not yet loaded module
+
+function environment.texfile(filename)
+ return resolvers.findfile(filename,'tex')
+end
+
+function environment.luafile(filename)
+ local resolved = resolvers.findfile(filename,'tex') or ""
+ if resolved ~= "" then
+ return resolved
+ end
+ resolved = resolvers.findfile(filename,'texmfscripts') or ""
+ if resolved ~= "" then
+ return resolved
+ end
+ return resolvers.findfile(filename,'luatexlibs') or ""
+end
+
+environment.loadedluacode = loadfile -- can be overloaded
+
+function environment.luafilechunk(filename,silent) -- used for loading lua bytecode in the format
+ filename = file.replacesuffix(filename, "lua")
+ local fullname = environment.luafile(filename)
+ if fullname and fullname ~= "" then
+ local data = environment.loadedluacode(fullname)
+ if trace_locating then
+ report_lua("loading file %s%s", fullname, not data and " failed" or "")
+ elseif not silent then
+ texio.write("<",data and "+ " or "- ",fullname,">")
+ end
+ return data
+ else
+ if trace_locating then
+ report_lua("unknown file %s", filename)
+ end
+ return nil
+ end
+end
+
+-- the next ones can use the previous ones / combine
+
+function environment.loadluafile(filename, version)
+ local lucname, luaname, chunk
+ local basename = file.removesuffix(filename)
+ if basename == filename then
+ lucname, luaname = basename .. ".luc", basename .. ".lua"
+ else
+ lucname, luaname = nil, basename -- forced suffix
+ end
+ -- when not overloaded by explicit suffix we look for a luc file first
+ local fullname = (lucname and environment.luafile(lucname)) or ""
+ if fullname ~= "" then
+ if trace_locating then
+ report_lua("loading %s", fullname)
+ end
+ chunk = loadfile(fullname) -- this way we don't need a file exists check
+ end
+ if chunk then
+ assert(chunk)()
+ if version then
+ -- we check of the version number of this chunk matches
+ local v = version -- can be nil
+ if modules and modules[filename] then
+ v = modules[filename].version -- new method
+ elseif versions and versions[filename] then
+ v = versions[filename] -- old method
+ end
+ if v == version then
+ return true
+ else
+ if trace_locating then
+ report_lua("version mismatch for %s: lua=%s, luc=%s", filename, v, version)
+ end
+ environment.loadluafile(filename)
+ end
+ else
+ return true
+ end
+ end
+ fullname = (luaname and environment.luafile(luaname)) or ""
+ if fullname ~= "" then
+ if trace_locating then
+ report_lua("loading %s", fullname)
+ end
+ chunk = loadfile(fullname) -- this way we don't need a file exists check
+ if not chunk then
+ if trace_locating then
+ report_lua("unknown file %s", filename)
+ end
+ else
+ assert(chunk)()
+ return true
+ end
+ end
+ return false
+end
end -- of closure
@@ -3991,6 +6263,8 @@ if not modules then modules = { } end modules ['lxml-tab'] = {
local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end)
+local report_xml = logs and logs.reporter("xml","core") or function(...) print(format(...)) end
+
--[[ldx--
<p>The parser used here is inspired by the variant discussed in the lua book, but
handles comment and processing instructions, has a different structure, provides
@@ -4001,11 +6275,15 @@ The find based parser can be found in l-xml-edu.lua along with other older code.
<p>Beware, the interface may change. For instance at, ns, tg, dt may get more
verbose names. Once the code is stable we will also remove some tracing and
optimize the code.</p>
+
+<p>I might even decide to reimplement the parser using the latest <l n='lpeg'/> trickery
+as the current variant was written when <l n='lpeg'/> showed up and it's easier now to
+build tables in one go.</p>
--ldx]]--
xml = xml or { }
+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
@@ -4129,7 +6407,7 @@ local dcache, hcache, acache = { }, { }, { }
local mt = { }
-function initialize_mt(root)
+local function initialize_mt(root)
mt = { __index = root } -- will be redefined later
end
@@ -4137,8 +6415,8 @@ function xml.setproperty(root,k,v)
getmetatable(root).__index[k] = v
end
-function xml.check_error(top,toclose)
- return ""
+function xml.checkerror(top,toclose)
+ return "" -- can be set
end
local function add_attribute(namespace,tag,value)
@@ -4194,9 +6472,9 @@ local function add_end(spacing, namespace, tag)
local toclose = remove(stack)
top = stack[#stack]
if #stack < 1 then
- errorstr = format("nothing to close with %s %s", tag, xml.check_error(top,toclose) or "")
+ errorstr = format("nothing to close with %s %s", tag, xml.checkerror(top,toclose) or "")
elseif toclose.tg ~= tag then -- no namespace check
- errorstr = format("unable to close %s with %s %s", toclose.tg, tag, xml.check_error(top,toclose) or "")
+ errorstr = format("unable to close %s with %s %s", toclose.tg, tag, xml.checkerror(top,toclose) or "")
end
dt = top.dt
dt[#dt+1] = toclose
@@ -4233,24 +6511,29 @@ local reported_attribute_errors = { }
local function attribute_value_error(str)
if not reported_attribute_errors[str] then
- logs.report("xml","invalid attribute value: %q",str)
+ report_xml("invalid attribute value: %q",str)
reported_attribute_errors[str] = true
at._error_ = str
end
return str
end
+
local function attribute_specification_error(str)
if not reported_attribute_errors[str] then
- logs.report("xml","invalid attribute specification: %q",str)
+ report_xml("invalid attribute specification: %q",str)
reported_attribute_errors[str] = true
at._error_ = str
end
return str
end
-function xml.unknown_dec_entity_format(str) return (str == "" and "&error;") or format("&%s;",str) end
-function xml.unknown_hex_entity_format(str) return format("&#x%s;",str) end
-function xml.unknown_any_entity_format(str) return format("&#x%s;",str) end
+xml.placeholders = {
+ unknown_dec_entity = function(str) return (str == "" and "&error;") or format("&%s;",str) end,
+ unknown_hex_entity = function(str) return format("&#x%s;",str) end,
+ unknown_any_entity = function(str) return format("&#x%s;",str) end,
+}
+
+local placeholders = xml.placeholders
local function fromhex(s)
local n = tonumber(s,16)
@@ -4304,18 +6587,18 @@ local function handle_hex_entity(str)
h = unify_predefined and predefined_unified[n]
if h then
if trace_entities then
- logs.report("xml","utfize, converting hex entity &#x%s; into %s",str,h)
+ report_xml("utfize, converting hex entity &#x%s; into %s",str,h)
end
elseif utfize then
- h = (n and utfchar(n)) or xml.unknown_hex_entity_format(str) or ""
+ h = (n and utfchar(n)) or xml.unknown_hex_entity(str) or ""
if not n then
- logs.report("xml","utfize, ignoring hex entity &#x%s;",str)
+ report_xml("utfize, ignoring hex entity &#x%s;",str)
elseif trace_entities then
- logs.report("xml","utfize, converting hex entity &#x%s; into %s",str,h)
+ report_xml("utfize, converting hex entity &#x%s; into %s",str,h)
end
else
if trace_entities then
- logs.report("xml","found entity &#x%s;",str)
+ report_xml("found entity &#x%s;",str)
end
h = "&#x" .. str .. ";"
end
@@ -4331,18 +6614,18 @@ local function handle_dec_entity(str)
d = unify_predefined and predefined_unified[n]
if d then
if trace_entities then
- logs.report("xml","utfize, converting dec entity &#%s; into %s",str,d)
+ report_xml("utfize, converting dec entity &#%s; into %s",str,d)
end
elseif utfize then
- d = (n and utfchar(n)) or xml.unknown_dec_entity_format(str) or ""
+ d = (n and utfchar(n)) or placeholders.unknown_dec_entity(str) or ""
if not n then
- logs.report("xml","utfize, ignoring dec entity &#%s;",str)
+ report_xml("utfize, ignoring dec entity &#%s;",str)
elseif trace_entities then
- logs.report("xml","utfize, converting dec entity &#%s; into %s",str,h)
+ report_xml("utfize, converting dec entity &#%s; into %s",str,h)
end
else
if trace_entities then
- logs.report("xml","found entity &#%s;",str)
+ report_xml("found entity &#%s;",str)
end
d = "&#" .. str .. ";"
end
@@ -4367,20 +6650,21 @@ local function handle_any_entity(str)
end
if a then
if trace_entities then
- logs.report("xml","resolved entity &%s; -> %s (internal)",str,a)
+ report_xml("resolved entity &%s; -> %s (internal)",str,a)
end
a = lpegmatch(parsedentity,a) or a
else
- if xml.unknown_any_entity_format then
- a = xml.unknown_any_entity_format(str) or ""
+ local unknown_any_entity = placeholders.unknown_any_entity
+ if unknown_any_entity then
+ a = unknown_any_entity(str) or ""
end
if a then
if trace_entities then
- logs.report("xml","resolved entity &%s; -> %s (external)",str,a)
+ report_xml("resolved entity &%s; -> %s (external)",str,a)
end
else
if trace_entities then
- logs.report("xml","keeping entity &%s;",str)
+ report_xml("keeping entity &%s;",str)
end
if str == "" then
a = "&error;"
@@ -4392,7 +6676,7 @@ local function handle_any_entity(str)
acache[str] = a
elseif trace_entities then
if not acache[str] then
- logs.report("xml","converting entity &%s; into %s",str,a)
+ report_xml("converting entity &%s; into %s",str,a)
acache[str] = a
end
end
@@ -4401,7 +6685,7 @@ local function handle_any_entity(str)
local a = acache[str]
if not a then
if trace_entities then
- logs.report("xml","found entity &%s;",str)
+ report_xml("found entity &%s;",str)
end
a = resolve_predefined and predefined_simplified[str]
if a then
@@ -4420,7 +6704,7 @@ local function handle_any_entity(str)
end
local function handle_end_entity(chr)
- logs.report("xml","error in entity, %q found instead of ';'",chr)
+ report_xml("error in entity, %q found instead of ';'",chr)
end
local space = S(' \r\n\t')
@@ -4555,7 +6839,7 @@ local function xmlconvert(data, settings)
resolve_predefined = settings.resolve_predefined_entities -- in case we have escaped entities
unify_predefined = settings.unify_predefined_entities -- &#038; -> &amp;
cleanup = settings.text_cleanup
- stack, top, at, xmlns, errorstr, result, entities = { }, { }, { }, { }, nil, nil, settings.entities or { }
+ stack, top, at, xmlns, errorstr, entities = { }, { }, { }, { }, nil, settings.entities or { }
acache, hcache, dcache = { }, { }, { } -- not stored
reported_attribute_errors = { }
if settings.parent_root then
@@ -4583,16 +6867,17 @@ local function xmlconvert(data, settings)
else
errorstr = "invalid xml file - no text at all"
end
+ local result
if errorstr and errorstr ~= "" then
result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={ }, er = true } } }
setmetatable(stack, mt)
- local error_handler = settings.error_handler
- if error_handler == false then
+ local errorhandler = settings.error_handler
+ if errorhandler == false then
-- no error message
else
- error_handler = error_handler or xml.error_handler
- if error_handler then
- xml.error_handler("load",errorstr)
+ errorhandler = errorhandler or xml.errorhandler
+ if errorhandler then
+ xml.errorhandler("load",errorstr)
end
end
else
@@ -4652,7 +6937,7 @@ function xml.is_valid(root)
return root and not root.error
end
-xml.error_handler = (logs and logs.report) or (input and logs.report) or print
+xml.errorhandler = report
--[[ldx--
<p>We cannot load an <l n='lpeg'/> from a filehandle so we need to load
@@ -4763,7 +7048,7 @@ local function verbose_element(e,handlers)
ats[#ats+1] = format('%s=%q',k,v)
end
end
- if ern and trace_remap and ern ~= ens then
+ if ern and trace_entities and ern ~= ens then
ens = ern
end
if ens ~= "" then
@@ -4868,7 +7153,7 @@ local function serialize(e,handlers,...)
-- elseif type(e) == "string" then
-- functions["@tx@"](e,handlers)
else
- functions["@dc@"](e,handlers)
+ functions["@dc@"](e,handlers) -- dc ?
end
if finalize then
return finalize()
@@ -4894,7 +7179,7 @@ local function newhandlers(settings)
if settings then
for k,v in next, settings do
if type(v) == "table" then
- tk = t[k] if not tk then tk = { } t[k] = tk end
+ local tk = t[k] if not tk then tk = { } t[k] = tk end
for kk,vv in next, v do
tk[kk] = vv
end
@@ -4906,6 +7191,7 @@ local function newhandlers(settings)
handlers[settings.name] = t
end
end
+ utilities.storage.mark(t)
return t
end
@@ -5005,7 +7291,7 @@ local function xmltext(root) -- inline
return (root and xmltostring(root)) or ""
end
-function initialize_mt(root)
+initialize_mt = function(root) -- redefinition
mt = { __tostring = xmltext, __index = root }
end
@@ -5040,7 +7326,6 @@ xml.string = xmlstring
<p>A few helpers:</p>
--ldx]]--
---~ xmlsetproperty(root,"settings",settings)
function xml.settings(e)
while e do
@@ -5150,6 +7435,7 @@ function xml.makestandalone(root)
end
end
end
+ return root
end
@@ -5166,11 +7452,14 @@ if not modules then modules = { } end modules ['lxml-pth'] = {
}
-- e.ni is only valid after a filter run
+-- todo: B/C/[get first match]
local concat, remove, insert = table.concat, table.remove, table.insert
local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring
local format, upper, lower, gmatch, gsub, find, rep = string.format, string.upper, string.lower, string.gmatch, string.gsub, string.find, string.rep
-local lpegmatch = lpeg.match
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+
+local setmetatableindex = table.setmetatableindex
-- beware, this is not xpath ... e.g. position is different (currently) and
-- we have reverse-sibling as reversed preceding sibling
@@ -5202,23 +7491,33 @@ local trace_lpath = false if trackers then trackers.register("xml.path",
local trace_lparse = false if trackers then trackers.register("xml.parse", function(v) trace_lparse = v end) end
local trace_lprofile = false if trackers then trackers.register("xml.profile", function(v) trace_lpath = v trace_lparse = v trace_lprofile = v end) end
+local report_lpath = logs.reporter("xml","lpath")
+
--[[ldx--
<p>We've now arrived at an interesting part: accessing the tree using a subset
of <l n='xpath'/> and since we're not compatible we call it <l n='lpath'/>. We
will explain more about its usage in other documents.</p>
--ldx]]--
+local xml = xml
+
local lpathcalls = 0 function xml.lpathcalls () return lpathcalls end
local lpathcached = 0 function xml.lpathcached() return lpathcached end
-xml.functions = xml.functions or { } -- internal
-xml.expressions = xml.expressions or { } -- in expressions
-xml.finalizers = xml.finalizers or { } -- fast do-with ... (with return value other than collection)
-xml.specialhandler = xml.specialhandler or { }
+xml.functions = xml.functions or { } -- internal
+local functions = xml.functions
+
+xml.expressions = xml.expressions or { } -- in expressions
+local expressions = xml.expressions
+
+xml.finalizers = xml.finalizers or { } -- fast do-with ... (with return value other than collection)
+local finalizers = xml.finalizers
-local functions = xml.functions
-local expressions = xml.expressions
-local finalizers = xml.finalizers
+xml.specialhandler = xml.specialhandler or { }
+local specialhandler = xml.specialhandler
+
+lpegpatterns.xml = lpegpatterns.xml or { }
+local xmlpatterns = lpegpatterns.xml
finalizers.xml = finalizers.xml or { }
finalizers.tex = finalizers.tex or { }
@@ -5228,14 +7527,14 @@ local function fallback (t, name)
if fn then
t[name] = fn
else
- logs.report("xml","unknown sub finalizer '%s'",tostring(name))
+ report_lpath("unknown sub finalizer '%s'",tostring(name))
fn = function() end
end
return fn
end
-setmetatable(finalizers.xml, { __index = fallback })
-setmetatable(finalizers.tex, { __index = fallback })
+setmetatableindex(finalizers.xml, fallback)
+setmetatableindex(finalizers.tex, fallback)
xml.defaultprotocol = "xml"
@@ -5283,102 +7582,106 @@ apply_axis['root'] = function(list)
rt = ll
end
end
- collected[#collected+1] = rt
+ collected[l] = rt
end
return collected
end
apply_axis['self'] = function(list)
---~ local collected = { }
---~ for l=1,#list do
---~ collected[#collected+1] = list[l]
---~ end
---~ return collected
return list
end
apply_axis['child'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local dt = ll.dt
- local en = 0
- for k=1,#dt do
- local dk = dt[k]
- if dk.tg then
- collected[#collected+1] = dk
- dk.ni = k -- refresh
- en = en + 1
- dk.ei = en
+ if dt then -- weird that this is needed
+ local en = 0
+ for k=1,#dt do
+ local dk = dt[k]
+ if dk.tg then
+ c = c + 1
+ collected[c] = dk
+ dk.ni = k -- refresh
+ en = en + 1
+ dk.ei = en
+ end
end
+ ll.en = en
end
- ll.en = en
end
return collected
end
-local function collect(list,collected)
+local function collect(list,collected,c)
local dt = list.dt
if dt then
local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
- collected[#collected+1] = dk
+ c = c + 1
+ collected[c] = dk
dk.ni = k -- refresh
en = en + 1
dk.ei = en
- collect(dk,collected)
+ c = collect(dk,collected,c)
end
end
list.en = en
end
+ return c
end
apply_axis['descendant'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
- collect(list[l],collected)
+ c = collect(list[l],collected,c)
end
return collected
end
-local function collect(list,collected)
+local function collect(list,collected,c)
local dt = list.dt
if dt then
local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
- collected[#collected+1] = dk
+ c = c + 1
+ collected[c] = dk
dk.ni = k -- refresh
en = en + 1
dk.ei = en
- collect(dk,collected)
+ c = collect(dk,collected,c)
end
end
list.en = en
end
+ return c
end
apply_axis['descendant-or-self'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
if ll.special ~= true then -- catch double root
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
- collect(ll,collected)
+ c = collect(ll,collected,c)
end
return collected
end
apply_axis['ancestor'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
while ll do
ll = ll.__p__
if ll then
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
end
end
@@ -5386,14 +7689,16 @@ apply_axis['ancestor'] = function(list)
end
apply_axis['ancestor-or-self'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
while ll do
ll = ll.__p__
if ll then
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
end
end
@@ -5401,11 +7706,12 @@ apply_axis['ancestor-or-self'] = function(list)
end
apply_axis['parent'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local pl = list[l].__p__
if pl then
- collected[#collected+1] = pl
+ c = c + 1
+ collected[c] = pl
end
end
return collected
@@ -5420,43 +7726,15 @@ apply_axis['namespace'] = function(list)
end
apply_axis['following'] = function(list) -- incomplete
---~ local collected = { }
---~ for l=1,#list do
---~ local ll = list[l]
---~ local p = ll.__p__
---~ local d = p.dt
---~ for i=ll.ni+1,#d do
---~ local di = d[i]
---~ if type(di) == "table" then
---~ collected[#collected+1] = di
---~ break
---~ end
---~ end
---~ end
---~ return collected
return { }
end
apply_axis['preceding'] = function(list) -- incomplete
---~ local collected = { }
---~ for l=1,#list do
---~ local ll = list[l]
---~ local p = ll.__p__
---~ local d = p.dt
---~ for i=ll.ni-1,1,-1 do
---~ local di = d[i]
---~ if type(di) == "table" then
---~ collected[#collected+1] = di
---~ break
---~ end
---~ end
---~ end
---~ return collected
return { }
end
apply_axis['following-sibling'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -5464,7 +7742,8 @@ apply_axis['following-sibling'] = function(list)
for i=ll.ni+1,#d do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -5472,7 +7751,7 @@ apply_axis['following-sibling'] = function(list)
end
apply_axis['preceding-sibling'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -5480,7 +7759,8 @@ apply_axis['preceding-sibling'] = function(list)
for i=1,ll.ni-1 do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -5488,7 +7768,7 @@ apply_axis['preceding-sibling'] = function(list)
end
apply_axis['reverse-sibling'] = function(list) -- reverse preceding
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -5496,7 +7776,8 @@ apply_axis['reverse-sibling'] = function(list) -- reverse preceding
for i=ll.ni-1,1,-1 do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -5522,7 +7803,7 @@ local function apply_nodes(list,directive,nodes)
return { }
end
else
- local collected, m, p = { }, 0, nil
+ local collected, c, m, p = { }, 0, 0, nil
if not nns then -- only check tag
for l=1,#list do
local ll = list[l]
@@ -5531,11 +7812,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ntg == ltg then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif ntg ~= ltg then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5547,11 +7830,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if lns == nns then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif lns ~= nns then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5565,11 +7850,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif not ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5577,7 +7864,7 @@ local function apply_nodes(list,directive,nodes)
return collected
end
else
- local collected, m, p = { }, 0, nil
+ local collected, c, m, p = { }, 0, 0, nil
for l=1,#list do
local ll = list[l]
local ltg = ll.tg
@@ -5594,11 +7881,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif not ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5609,12 +7898,13 @@ end
local quit_expression = false
local function apply_expression(list,expression,order)
- local collected = { }
+ local collected, c = { }, 0
quit_expression = false
for l=1,#list do
local ll = list[l]
if expression(list,ll,l,order) then -- nasty, order alleen valid als n=1
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
if quit_expression then
break
@@ -5653,7 +7943,9 @@ local lp_builtin = P (
P("ns") / "ll.ns"
) * ((spaces * P("(") * spaces * P(")"))/"")
-local lp_attribute = (P("@") + P("attribute::")) / "" * Cc("(ll.at and ll.at['") * R("az","AZ","--","__")^1 * Cc("'])")
+-- for the moment we keep namespaces with attributes
+
+local lp_attribute = (P("@") + P("attribute::")) / "" * Cc("(ll.at and ll.at['") * ((R("az","AZ") + S("-_:"))^1) * Cc("'])")
local lp_fastpos_p = ((P("+")^0 * R("09")^1 * P(-1)) / function(s) return "l==" .. s end)
local lp_fastpos_n = ((P("-") * R("09")^1 * P(-1)) / function(s) return "(" .. s .. "<0 and (#list+".. s .. "==l))" end)
local lp_fastpos = lp_fastpos_n + lp_fastpos_p
@@ -5714,14 +8006,12 @@ local converter = Cs (
)
cleaner = Cs ( (
---~ lp_fastpos +
lp_reserved +
lp_number +
lp_string +
1 )^1 )
---~ expr
local template_e = [[
local expr = xml.expressions
@@ -5772,13 +8062,13 @@ local skip = { }
local function errorrunner_e(str,cnv)
if not skip[str] then
- logs.report("lpath","error in expression: %s => %s",str,cnv)
+ report_lpath("error in expression: %s => %s",str,cnv)
skip[str] = cnv or str
end
return false
end
local function errorrunner_f(str,arg)
- logs.report("lpath","error in finalizer: %s(%s)",str,arg or "")
+ report_lpath("error in finalizer: %s(%s)",str,arg or "")
return false
end
@@ -5829,7 +8119,7 @@ local special_1 = P("*") * Cc(register_auto_descendant) * Cc(register_all_nodes
local special_2 = P("/") * Cc(register_auto_self)
local special_3 = P("") * Cc(register_auto_self)
-local parser = Ct { "patterns", -- can be made a bit faster by moving pattern outside
+local pathparser = Ct { "patterns", -- can be made a bit faster by moving pattern outside
patterns = spaces * V("protocol") * spaces * (
( V("special") * spaces * P(-1) ) +
@@ -5901,6 +8191,8 @@ local parser = Ct { "patterns", -- can be made a bit faster by moving pattern ou
}
+xmlpatterns.pathparser = pathparser
+
local cache = { }
local function nodesettostring(set,nodetest)
@@ -5910,7 +8202,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[#t+1] = (directive and tg) or format("not(%s)",tg)
+ t[i] = (directive and tg) or format("not(%s)",tg)
end
if nodetest == false then
return format("not(%s)",concat(t,"|"))
@@ -5929,7 +8221,7 @@ local function tagstostring(list)
local ns, tg = li.ns, li.tg
if not ns or ns == "" then ns = "*" end
if not tg or tg == "" then tg = "*" end
- t[#t+1] = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg)
+ t[i] = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg)
end
return concat(t," ")
end
@@ -5937,16 +8229,16 @@ end
xml.nodesettostring = nodesettostring
-local parse_pattern -- we have a harmless kind of circular reference
+local lpath -- we have a harmless kind of circular reference
+
+local lshowoptions = { functions = false }
local function lshow(parsed)
if type(parsed) == "string" then
- parsed = parse_pattern(parsed)
+ parsed = lpath(parsed)
end
- local s = table.serialize_functions -- ugly
- table.serialize_functions = false -- ugly
- logs.report("lpath","%s://%s => %s",parsed.protocol or xml.defaultprotocol,parsed.pattern,table.serialize(parsed,false))
- table.serialize_functions = s -- ugly
+ report_lpath("%s://%s => %s",parsed.protocol or xml.defaultprotocol,parsed.pattern,
+ table.serialize(parsed,false,lshowoptions))
end
xml.lshow = lshow
@@ -5960,7 +8252,7 @@ local function add_comment(p,str)
end
end
-parse_pattern = function (pattern) -- the gain of caching is rather minimal
+lpath = function (pattern) -- the gain of caching is rather minimal
lpathcalls = lpathcalls + 1
if type(pattern) == "table" then
return pattern
@@ -5969,13 +8261,13 @@ parse_pattern = function (pattern) -- the gain of caching is rather minimal
if parsed then
lpathcached = lpathcached + 1
else
- parsed = lpegmatch(parser,pattern)
+ parsed = lpegmatch(pathparser,pattern)
if parsed then
parsed.pattern = pattern
local np = #parsed
if np == 0 then
parsed = { pattern = pattern, register_self, state = "parsing error" }
- logs.report("lpath","parsing error in '%s'",pattern)
+ report_lpath("parsing error in '%s'",pattern)
lshow(parsed)
else
-- we could have done this with a more complex parser but this
@@ -6017,6 +8309,8 @@ parse_pattern = function (pattern) -- the gain of caching is rather minimal
end
end
+xml.lpath = lpath
+
-- we can move all calls inline and then merge the trace back
-- technically we can combine axis and the next nodes which is
-- what we did before but this a bit cleaner (but slower too)
@@ -6079,32 +8373,32 @@ local function traced_apply(list,parsed,nofparsed,order)
if trace_lparse then
lshow(parsed)
end
- logs.report("lpath", "collecting : %s",parsed.pattern)
- logs.report("lpath", " root tags : %s",tagstostring(list))
- logs.report("lpath", " order : %s",order or "unset")
+ report_lpath("collecting: %s",parsed.pattern)
+ report_lpath("root tags : %s",tagstostring(list))
+ report_lpath("order : %s",order or "unset")
local collected = list
for i=1,nofparsed do
local pi = parsed[i]
local kind = pi.kind
if kind == "axis" then
collected = apply_axis[pi.axis](collected)
- logs.report("lpath", "% 10i : ax : %s",(collected and #collected) or 0,pi.axis)
+ report_lpath("% 10i : ax : %s",(collected and #collected) or 0,pi.axis)
elseif kind == "nodes" then
collected = apply_nodes(collected,pi.nodetest,pi.nodes)
- logs.report("lpath", "% 10i : ns : %s",(collected and #collected) or 0,nodesettostring(pi.nodes,pi.nodetest))
+ report_lpath("% 10i : ns : %s",(collected and #collected) or 0,nodesettostring(pi.nodes,pi.nodetest))
elseif kind == "expression" then
collected = apply_expression(collected,pi.evaluator,order)
- logs.report("lpath", "% 10i : ex : %s -> %s",(collected and #collected) or 0,pi.expression,pi.converted)
+ report_lpath("% 10i : ex : %s -> %s",(collected and #collected) or 0,pi.expression,pi.converted)
elseif kind == "finalizer" then
collected = pi.finalizer(collected)
- logs.report("lpath", "% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pi.name,pi.arguments or "")
+ report_lpath("% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pi.name,pi.arguments or "")
return collected
end
if not collected or #collected == 0 then
local pn = i < nofparsed and parsed[nofparsed]
if pn and pn.kind == "finalizer" then
collected = pn.finalizer(collected)
- logs.report("lpath", "% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pn.name,pn.arguments or "")
+ report_lpath("% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pn.name,pn.arguments or "")
return collected
end
return nil
@@ -6141,8 +8435,11 @@ local function normal_apply(list,parsed,nofparsed,order)
return collected
end
-local function parse_apply(list,pattern)
- -- we avoid an extra call
+
+local function applylpath(list,pattern)
+ if not list then
+ return
+ end
local parsed = cache[pattern]
if parsed then
lpathcalls = lpathcalls + 1
@@ -6151,7 +8448,7 @@ local function parse_apply(list,pattern)
lpathcalls = lpathcalls + 1
parsed = pattern
else
- parsed = parse_pattern(pattern) or pattern
+ parsed = lpath(pattern) or pattern
end
if not parsed then
return
@@ -6160,25 +8457,32 @@ local function parse_apply(list,pattern)
if nofparsed == 0 then
return -- something is wrong
end
- local one = list[1]
- if not one then
- return -- something is wrong
- elseif not trace_lpath then
- return normal_apply(list,parsed,nofparsed,one.mi)
+ if not trace_lpath then
+ return normal_apply ({ list },parsed,nofparsed,list.mi)
elseif trace_lprofile then
- return profiled_apply(list,parsed,nofparsed,one.mi)
+ return profiled_apply({ list },parsed,nofparsed,list.mi)
else
- return traced_apply(list,parsed,nofparsed,one.mi)
+ return traced_apply ({ list },parsed,nofparsed,list.mi)
end
end
+xml.applylpath = applylpath -- takes a table as first argment, which is what xml.filter will do
+
+--[[ldx--
+<p>This is the main filter function. It returns whatever is asked for.</p>
+--ldx]]--
+
+function xml.filter(root,pattern) -- no longer funny attribute handling here
+ return applylpath(root,pattern)
+end
+
-- internal (parsed)
expressions.child = function(e,pattern)
- return parse_apply({ e },pattern) -- todo: cache
+ return applylpath(e,pattern) -- todo: cache
end
expressions.count = function(e,pattern)
- local collected = parse_apply({ e },pattern) -- todo: cache
+ local collected = applylpath(e,pattern) -- todo: cache
return (collected and #collected) or 0
end
@@ -6188,7 +8492,7 @@ expressions.oneof = function(s,...) -- slow
local t = {...} for i=1,#t do if s == t[i] then return true end end return false
end
expressions.error = function(str)
- xml.error_handler("unknown function in lpath expression",tostring(str or "?"))
+ xml.errorhandler("unknown function in lpath expression",tostring(str or "?"))
return false
end
expressions.undefined = function(s)
@@ -6217,8 +8521,8 @@ expressions.boolean = toboolean
-- user interface
local function traverse(root,pattern,handle)
- logs.report("xml","use 'xml.selection' instead for '%s'",pattern)
- local collected = parse_apply({ root },pattern)
+ report_lpath("use 'xml.selection' instead for '%s'",pattern)
+ local collected = applylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6229,7 +8533,7 @@ local function traverse(root,pattern,handle)
end
local function selection(root,pattern,handle)
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if handle then
for c=1,#collected do
@@ -6241,19 +8545,9 @@ local function selection(root,pattern,handle)
end
end
-xml.parse_parser = parser
-xml.parse_pattern = parse_pattern
-xml.parse_apply = parse_apply
xml.traverse = traverse -- old method, r, d, k
xml.selection = selection -- new method, simple handle
-local lpath = parse_pattern
-
-xml.lpath = lpath
-
-function xml.cached_patterns()
- return cache
-end
-- generic function finalizer (independant namespace)
@@ -6265,13 +8559,13 @@ local function dofunction(collected,fnc)
f(collected[c])
end
else
- logs.report("xml","unknown function '%s'",fnc)
+ report_lpath("unknown function '%s'",fnc)
end
end
end
-xml.finalizers.xml["function"] = dofunction
-xml.finalizers.tex["function"] = dofunction
+finalizers.xml["function"] = dofunction
+finalizers.tex["function"] = dofunction
-- functions
@@ -6364,14 +8658,6 @@ expressions.tag = function(e,n) -- only tg
end
--[[ldx--
-<p>This is the main filter function. It returns whatever is asked for.</p>
---ldx]]--
-
-function xml.filter(root,pattern) -- no longer funny attribute handling here
- return parse_apply({ root },pattern)
-end
-
---[[ldx--
<p>Often using an iterators looks nicer in the code than passing handler
functions. The <l n='lua'/> book describes how to use coroutines for that
purpose (<url href='http://www.lua.org/pil/9.3.html'/>). This permits
@@ -6390,7 +8676,7 @@ end
local wrap, yield = coroutine.wrap, coroutine.yield
function xml.elements(root,pattern,reverse) -- r, d, k
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if reverse then
return wrap(function() for c=#collected,1,-1 do
@@ -6406,7 +8692,7 @@ function xml.elements(root,pattern,reverse) -- r, d, k
end
function xml.collected(root,pattern,reverse) -- e
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if reverse then
return wrap(function() for c=#collected,1,-1 do yield(collected[c]) end end)
@@ -6417,6 +8703,15 @@ function xml.collected(root,pattern,reverse) -- e
return wrap(function() end)
end
+-- handy
+
+function xml.inspect(collection,pattern)
+ pattern = pattern or "."
+ for e in xml.collected(collection,pattern or ".") do
+ report_lpath("pattern %q\n\n%s\n",pattern,xml.tostring(e))
+ end
+end
+
end -- of closure
@@ -6430,10 +8725,16 @@ if not modules then modules = { } end modules ['lxml-mis'] = {
license = "see context related readme files"
}
+local xml, lpeg, string = xml, lpeg, string
+
local concat = table.concat
local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring
local format, gsub, match = string.format, string.gsub, string.match
-local lpegmatch = lpeg.match
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs
+
+lpegpatterns.xml = lpegpatterns.xml or { }
+local xmlpatterns = lpegpatterns.xml
--[[ldx--
<p>The following helper functions best belong to the <t>lxml-ini</t>
@@ -6457,9 +8758,8 @@ local function xmlgsub(t,old,new) -- will be replaced
end
end
---~ xml.gsub = xmlgsub
-function xml.strip_leading_spaces(dk,d,k) -- cosmetic, for manual
+function xml.stripleadingspaces(dk,d,k) -- cosmetic, for manual
if d and k then
local dkm = d[k-1]
if dkm and type(dkm) == "string" then
@@ -6469,14 +8769,7 @@ function xml.strip_leading_spaces(dk,d,k) -- cosmetic, for manual
end
end
---~ xml.escapes = { ['&'] = '&amp;', ['<'] = '&lt;', ['>'] = '&gt;', ['"'] = '&quot;' }
---~ xml.unescapes = { } for k,v in next, xml.escapes do xml.unescapes[v] = k end
---~ function xml.escaped (str) return (gsub(str,"(.)" , xml.escapes )) end
---~ function xml.unescaped(str) return (gsub(str,"(&.-;)", xml.unescapes)) end
---~ function xml.cleansed (str) return (gsub(str,"<.->" , '' )) end -- "%b<>"
-
-local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs
-- 100 * 2500 * "oeps< oeps> oeps&" : gsub:lpeg|lpeg|lpeg
--
@@ -6502,9 +8795,9 @@ local unescaped = Cs(normal * (special * normal)^0)
local cleansed = Cs(((P("<") * (1-P(">"))^0 * P(">"))/"" + 1)^0)
-xml.escaped_pattern = escaped
-xml.unescaped_pattern = unescaped
-xml.cleansed_pattern = cleansed
+xmlpatterns.escaped = escaped
+xmlpatterns.unescaped = unescaped
+xmlpatterns.cleansed = cleansed
function xml.escaped (str) return lpegmatch(escaped,str) end
function xml.unescaped(str) return lpegmatch(unescaped,str) end
@@ -6540,15 +8833,20 @@ if not modules then modules = { } end modules ['lxml-aux'] = {
local trace_manipulations = false trackers.register("lxml.manipulations", function(v) trace_manipulations = v end)
-local xmlparseapply, xmlconvert, xmlcopy, xmlname = xml.parse_apply, xml.convert, xml.copy, xml.name
+local report_xml = logs.reporter("xml")
+
+local xml = xml
+
+local xmlconvert, xmlcopy, xmlname = xml.convert, xml.copy, xml.name
local xmlinheritedconvert = xml.inheritedconvert
+local xmlapplylpath = xml.applylpath
-local type = type
-local insert, remove = table.insert, table.remove
+local type, setmetatable, getmetatable = type, setmetatable, getmetatable
+local insert, remove, fastcopy = table.insert, table.remove, table.fastcopy
local gmatch, gsub = string.gmatch, string.gsub
local function report(what,pattern,c,e)
- logs.report("xml","%s element '%s' (root: '%s', position: %s, index: %s, pattern: %s)",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
+ report_xml("%s element '%s' (root: '%s', position: %s, index: %s, pattern: %s)",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
end
local function withelements(e,handle,depth)
@@ -6602,10 +8900,8 @@ function xml.withelement(e,n,handle) -- slow
end
end
-xml.elements_only = xml.collected
-
-function xml.each_element(root,pattern,handle,reverse)
- local collected = xmlparseapply({ root },pattern)
+function xml.each(root,pattern,handle,reverse)
+ local collected = xmlapplylpath(root,pattern)
if collected then
if reverse then
for c=#collected,1,-1 do
@@ -6620,10 +8916,8 @@ function xml.each_element(root,pattern,handle,reverse)
end
end
-xml.process_elements = xml.each_element
-
-function xml.process_attributes(root,pattern,handle)
- local collected = xmlparseapply({ root },pattern)
+function xml.processattributes(root,pattern,handle)
+ local collected = xmlapplylpath(root,pattern)
if collected and handle then
for c=1,#collected do
handle(collected[c].at)
@@ -6638,12 +8932,12 @@ end
-- are these still needed -> lxml-cmp.lua
-function xml.collect_elements(root, pattern)
- return xmlparseapply({ root },pattern)
+function xml.collect(root, pattern)
+ return xmlapplylpath(root,pattern)
end
-function xml.collect_texts(root, pattern, flatten) -- todo: variant with handle
- local collected = xmlparseapply({ root },pattern)
+function xml.collecttexts(root, pattern, flatten) -- todo: variant with handle
+ local collected = xmlapplylpath(root,pattern)
if collected and flatten then
local xmltostring = xml.tostring
for c=1,#collected do
@@ -6654,18 +8948,19 @@ function xml.collect_texts(root, pattern, flatten) -- todo: variant with handle
end
function xml.collect_tags(root, pattern, nonamespace)
- local collected = xmlparseapply({ root },pattern)
+ local collected = xmlapplylpath(root,pattern)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
local e = collected[c]
local ns, tg = e.ns, e.tg
+ n = n + 1
if nonamespace then
- t[#t+1] = tg
+ t[n] = tg
elseif ns == "" then
- t[#t+1] = tg
+ t[n] = tg
else
- t[#t+1] = ns .. ":" .. tg
+ t[n] = ns .. ":" .. tg
end
end
return t
@@ -6678,7 +8973,7 @@ end
local no_root = { no_root = true }
-function xml.redo_ni(d)
+local function redo_ni(d)
for k=1,#d do
local dk = d[k]
if type(dk) == "table" then
@@ -6701,12 +8996,7 @@ local function xmltoelement(whatever,root)
return whatever -- string
end
if element then
- --~ if element.ri then
- --~ element = element.dt[element.ri].dt
- --~ else
- --~ element = element.dt
- --~ end
- end
+ end
return element
end
@@ -6724,8 +9014,8 @@ local function copiedelement(element,newparent)
end
end
-function xml.delete_element(root,pattern)
- local collected = xmlparseapply({ root },pattern)
+function xml.delete(root,pattern)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6736,15 +9026,15 @@ function xml.delete_element(root,pattern)
end
local d = p.dt
remove(d,e.ni)
- xml.redo_ni(d) -- can be made faster and inlined
+ redo_ni(d) -- can be made faster and inlined
end
end
end
end
-function xml.replace_element(root,pattern,whatever)
+function xml.replace(root,pattern,whatever)
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6755,15 +9045,50 @@ function xml.replace_element(root,pattern,whatever)
end
local d = p.dt
d[e.ni] = copiedelement(element,p)
- xml.redo_ni(d) -- probably not needed
+ redo_ni(d) -- probably not needed
+ end
+ end
+ end
+end
+
+local function wrap(e,wrapper)
+ local t = {
+ rn = e.rn,
+ tg = e.tg,
+ ns = e.ns,
+ at = e.at,
+ dt = e.dt,
+ __p__ = e,
+ }
+ setmetatable(t,getmetatable(e))
+ e.rn = wrapper.rn or e.rn or ""
+ e.tg = wrapper.tg or e.tg or ""
+ e.ns = wrapper.ns or e.ns or ""
+ e.at = fastcopy(wrapper.at)
+ e.dt = { t }
+end
+
+function xml.wrap(root,pattern,whatever)
+ if whatever then
+ local wrapper = xmltoelement(whatever,root)
+ local collected = xmlapplylpath(root,pattern)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ if trace_manipulations then
+ report('wrapping',pattern,c,e)
+ end
+ wrap(e,wrapper)
end
end
+ else
+ wrap(root,xmltoelement(pattern))
end
end
local function inject_element(root,pattern,whatever,prepend)
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6778,15 +9103,17 @@ local function inject_element(root,pattern,whatever,prepend)
else
be, af = edt, cp
end
+ local bn = #be
for i=1,#af do
- be[#be+1] = af[i]
+ bn = bn + 1
+ be[bn] = af[i]
end
if rri then
r.dt[rri].dt = be
else
d[k].dt = be
end
- xml.redo_ni(d)
+ redo_ni(d)
end
end
end
@@ -6794,7 +9121,7 @@ end
local function insert_element(root,pattern,whatever,before) -- todo: element als functie
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6804,24 +9131,23 @@ local function insert_element(root,pattern,whatever,before) -- todo: element als
k = k + 1
end
insert(d,k,copiedelement(element,r))
- xml.redo_ni(d)
+ redo_ni(d)
end
end
end
-xml.insert_element = insert_element
-xml.insert_element_after = insert_element
-xml.insert_element_before = function(r,p,e) insert_element(r,p,e,true) end
-xml.inject_element = inject_element
-xml.inject_element_after = inject_element
-xml.inject_element_before = function(r,p,e) inject_element(r,p,e,true) end
+xml.insert_element = insert_element
+xml.insertafter = insert_element
+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 collected = xmlparseapply({ xmldata },pattern)
+ local collected = xmlapplylpath(xmldata,pattern)
if collected then
for c=1,#collected do
local ek = collected[c]
@@ -6830,7 +9156,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
local ekat = ek.at
local epdt = ek.__p__.dt
if not attribute or attribute == "" then
- name = (type(ekdt) == "table" and ekdt[1]) or ekdt -- ckeck, probably always tab or str
+ 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
@@ -6845,9 +9171,6 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
-- 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)
@@ -6864,136 +9187,88 @@ end
xml.include = include
---~ local function manipulate(xmldata,pattern,manipulator) -- untested and might go away
---~ local collected = xmlparseapply({ xmldata },pattern)
---~ if collected then
---~ local xmltostring = xml.tostring
---~ for c=1,#collected do
---~ local e = collected[c]
---~ local data = manipulator(xmltostring(e))
---~ if data == "" then
---~ epdt[e.ni] = ""
---~ else
---~ local xi = xmlinheritedconvert(data,xmldata)
---~ if not xi then
---~ epdt[e.ni] = ""
---~ else
---~ epdt[e.ni] = xml.body(xi) -- xml.assign(d,k,xi)
---~ end
---~ end
---~ end
---~ end
---~ end
-
---~ xml.manipulate = manipulate
-
-function xml.strip_whitespace(root, pattern, nolines) -- strips all leading and trailing space !
- local collected = xmlparseapply({ root },pattern)
- if collected then
- for i=1,#collected do
- local e = collected[i]
- local edt = e.dt
- if edt then
- local t = { }
- for i=1,#edt do
- local str = edt[i]
- if type(str) == "string" then
- if str == "" then
- -- stripped
- else
- if nolines then
- str = gsub(str,"[ \n\r\t]+"," ")
- end
- if str == "" then
- -- stripped
- else
- t[#t+1] = str
- end
- end
+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 str = edt[e]
+ if type(str) ~= "string" then
+ n = n + 1
+ t[n] = str
+ elseif str ~= "" then
+ -- todo: lpeg for each case
+ if nolines then
+ str = gsub(str,"%s+"," ")
+ end
+ str = gsub(str,"^%s*(.-)%s*$","%1")
+ if str ~= "" then
+ n = n + 1
+ t[n] = 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
+ remove(edt,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
+ 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 str == "" then
+ remove(edt)
else
- --~ str.ni = i
- t[#t+1] = str
+ edt[nedt] = str
end
end
- e.dt = t
end
end
end
+ return e -- convenient
end
-function xml.strip_whitespace(root, pattern, nolines, anywhere) -- strips all leading and trailing spacing
- local collected = xmlparseapply({ root },pattern) -- beware, indices no longer are valid now
+xml.stripelement = stripelement
+
+function xml.strip(root,pattern,nolines,anywhere) -- strips all leading and trailing spacing
+ local collected = xmlapplylpath(root,pattern) -- beware, indices no longer are valid now
if collected then
for i=1,#collected do
- local e = collected[i]
- local edt = e.dt
- if edt then
- if anywhere then
- local t = { }
- for e=1,#edt do
- local str = edt[e]
- if type(str) ~= "string" then
- t[#t+1] = str
- elseif str ~= "" then
- -- todo: lpeg for each case
- if nolines then
- str = gsub(str,"%s+"," ")
- end
- str = gsub(str,"^%s*(.-)%s*$","%1")
- if str ~= "" then
- t[#t+1] = 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
- remove(edt,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
- end
- end
- if #edt > 1 then
- -- strip end
- local str = edt[#edt]
- 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 str == "" then
- remove(edt)
- else
- edt[#edt] = str
- end
- end
- end
- end
- end
+ stripelement(collected[i],nolines,anywhere)
end
end
end
-local function rename_space(root, oldspace, newspace) -- fast variant
+local function renamespace(root, oldspace, newspace) -- fast variant
local ndt = #root.dt
for i=1,ndt or 0 do
local e = root[i]
@@ -7006,16 +9281,16 @@ local function rename_space(root, oldspace, newspace) -- fast variant
end
local edt = e.dt
if edt then
- rename_space(edt, oldspace, newspace)
+ renamespace(edt, oldspace, newspace)
end
end
end
end
-xml.rename_space = rename_space
+xml.renamespace = renamespace
-function xml.remap_tag(root, pattern, newtg)
- local collected = xmlparseapply({ root },pattern)
+function xml.remaptag(root, pattern, newtg)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
collected[c].tg = newtg
@@ -7023,8 +9298,8 @@ function xml.remap_tag(root, pattern, newtg)
end
end
-function xml.remap_namespace(root, pattern, newns)
- local collected = xmlparseapply({ root },pattern)
+function xml.remapnamespace(root, pattern, newns)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
collected[c].ns = newns
@@ -7032,8 +9307,8 @@ function xml.remap_namespace(root, pattern, newns)
end
end
-function xml.check_namespace(root, pattern, newns)
- local collected = xmlparseapply({ root },pattern)
+function xml.checknamespace(root, pattern, newns)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -7044,8 +9319,8 @@ function xml.check_namespace(root, pattern, newns)
end
end
-function xml.remap_name(root, pattern, newtg, newns, newrn)
- local collected = xmlparseapply({ root },pattern)
+function xml.remapname(root, pattern, newtg, newns, newrn)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -7058,18 +9333,34 @@ end
<p>Here are a few synonyms.</p>
--ldx]]--
-xml.each = xml.each_element
-xml.process = xml.process_element
-xml.strip = xml.strip_whitespace
-xml.collect = xml.collect_elements
-xml.all = xml.collect_elements
-
-xml.insert = xml.insert_element_after
-xml.inject = xml.inject_element_after
-xml.after = xml.insert_element_after
-xml.before = xml.insert_element_before
-xml.delete = xml.delete_element
-xml.replace = xml.replace_element
+xml.all = xml.each
+xml.insert = xml.insertafter
+xml.inject = xml.injectafter
+xml.after = xml.insertafter
+xml.before = xml.insertbefore
+xml.process = xml.each
+
+-- obsolete
+
+xml.obsolete = xml.obsolete or { }
+local obsolete = xml.obsolete
+
+xml.strip_whitespace = xml.strip obsolete.strip_whitespace = xml.strip
+xml.collect_elements = xml.collect obsolete.collect_elements = xml.collect
+xml.delete_element = xml.delete obsolete.delete_element = xml.delete
+xml.replace_element = xml.replace obsolete.replace_element = xml.replacet
+xml.each_element = xml.each obsolete.each_element = xml.each
+xml.process_elements = xml.process obsolete.process_elements = xml.process
+xml.insert_element_after = xml.insertafter obsolete.insert_element_after = xml.insertafter
+xml.insert_element_before = xml.insertbefore obsolete.insert_element_before = xml.insertbefore
+xml.inject_element_after = xml.injectafter obsolete.inject_element_after = xml.injectafter
+xml.inject_element_before = xml.injectbefore obsolete.inject_element_before = xml.injectbefore
+xml.process_attributes = xml.processattributes obsolete.process_attributes = xml.processattributes
+xml.collect_texts = xml.collecttexts obsolete.collect_texts = xml.collecttexts
+xml.inject_element = xml.inject obsolete.inject_element = xml.inject
+xml.remap_tag = xml.remaptag obsolete.remap_tag = xml.remaptag
+xml.remap_name = xml.remapname obsolete.remap_name = xml.remapname
+xml.remap_namespace = xml.remapnamespace obsolete.remap_namespace = xml.remapnamespace
end -- of closure
@@ -7084,10 +9375,15 @@ if not modules then modules = { } end modules ['lxml-xml'] = {
license = "see context related readme files"
}
+local concat = string.concat
+
+local xml = xml
+
local finalizers = xml.finalizers.xml
local xmlfilter = xml.filter -- we could inline this one for speed
local xmltostring = xml.tostring
local xmlserialize = xml.serialize
+local xmlcollected = xml.collected
local function first(collected) -- wrong ?
return collected and collected[1]
@@ -7101,15 +9397,8 @@ local function all(collected)
return collected
end
-local function reverse(collected)
- if collected then
- local reversed = { }
- for c=#collected,1,-1 do
- reversed[#reversed+1] = collected[c]
- end
- return reversed
- end
-end
+
+local reverse = table.reversed
local function attribute(collected,name)
if collected and #collected > 0 then
@@ -7200,11 +9489,12 @@ end
local function texts(collected)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
- local e = collection[c]
+ local e = collected[c]
if e and e.dt then
- t[#t+1] = e.dt
+ n = n + 1
+ t[n] = e.dt
end
end
return t
@@ -7247,14 +9537,15 @@ end
local function tags(collected,nonamespace)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
local e = collected[c]
local ns, tg = e.ns, e.tg
+ n = n + 1
if nonamespace or ns == "" then
- t[#t+1] = tg
+ t[n] = tg
else
- t[#t+1] = ns .. ":" .. tg
+ t[n] = ns .. ":" .. tg
end
end
return t
@@ -7365,293 +9656,273 @@ xml.all = xml.filter
xml.index = xml.position
xml.found = xml.filter
+-- a nice one:
+
+local function totable(x)
+ local t = { }
+ for e in xmlcollected(x[1] or x,"/*") do
+ t[e.tg] = xmltostring(e.dt) or ""
+ end
+ return next(t) and t or nil
+end
+
+xml.table = totable
+finalizers.table = totable
+
+local function textonly(e,t)
+ if e then
+ local edt = e.dt
+ if edt then
+ for i=1,#edt do
+ local e = edt[i]
+ if type(e) == "table" then
+ textonly(e,t)
+ else
+ t[#t+1] = e
+ end
+ end
+ end
+ end
+ return t
+end
+
+function xml.textonly(e) -- no pattern
+ return concat(textonly(e,{}))
+end
+
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['luat-env'] = {
+if not modules then modules = { } end modules ['data-ini'] = {
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"
+ license = "see context related readme files",
}
--- A former version provided functionality for non embeded core
--- scripts i.e. runtime library loading. Given the amount of
--- Lua code we use now, this no longer makes sense. Much of this
--- evolved before bytecode arrays were available and so a lot of
--- code has disappeared already.
+local gsub, find, gmatch = string.gsub, string.find, string.gmatch
+local concat = table.concat
+local next, type = next, type
-local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local filedirname, filebasename, fileextname, filejoin = file.dirname, file.basename, file.extname, file.join
-local format, sub, match, gsub, find = string.format, string.sub, string.match, string.gsub, string.find
-local unquote, quote = string.unquote, string.quote
+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)
--- precautions
+local report_initialization = logs.reporter("resolvers","initialization")
-os.setlocale(nil,nil) -- useless feature and even dangerous in luatex
+local ostype, osname, ossetenv, osgetenv = os.type, os.name, os.setenv, os.getenv
-function os.setlocale()
- -- no way you can mess with it
-end
+-- 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.
--- dirty tricks
+resolvers = resolvers or { }
+local resolvers = resolvers
-if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
- arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil
-end
+-- We don't want the kpse library to kick in. Also, we want to be able to
+-- execute programs. Control over execution is implemented later.
-if profiler and os.env["MTX_PROFILE_RUN"] == "YES" then
- profiler.start("luatex-profile.log")
-end
+texconfig.kpse_init = false
+texconfig.shell_escape = 't'
--- environment
+kpse = { original = kpse }
-environment = environment or { }
-environment.arguments = { }
-environment.files = { }
-environment.sortedflags = nil
+setmetatable(kpse, {
+ __index = function(kp,name)
+ report_initialization("fatal error: kpse library is accessed (key: %s)",name)
+ os.exit()
+ end
+} )
-if not environment.jobname or environment.jobname == "" then if tex then environment.jobname = tex.jobname end end
-if not environment.version or environment.version == "" then environment.version = "unknown" end
-if not environment.jobname then environment.jobname = "unknown" end
+-- First we check a couple of environment variables. Some might be
+-- set already but we need then later on. We start with the system
+-- font path.
-function environment.initialize_arguments(arg)
- local arguments, files = { }, { }
- environment.arguments, environment.files, environment.sortedflags = arguments, files, nil
- for index=1,#arg do
- local argument = arg[index]
- if index > 0 then
- local flag, value = match(argument,"^%-+(.-)=(.-)$")
- if flag then
- arguments[flag] = unquote(value or "")
- else
- flag = match(argument,"^%-+(.+)")
- if flag then
- arguments[flag] = true
- else
- files[#files+1] = argument
- end
- end
- end
+do
+
+ local osfontdir = osgetenv("OSFONTDIR")
+
+ if osfontdir and osfontdir ~= "" then
+ -- ok
+ elseif osname == "windows" then
+ ossetenv("OSFONTDIR","c:/windows/fonts//")
+ elseif osname == "macosx" then
+ ossetenv("OSFONTDIR","$HOME/Library/Fonts//;/Library/Fonts//;/System/Library/Fonts//")
end
- environment.ownname = environment.ownname or arg[0] or 'unknown.lua'
+
end
-function environment.setargument(name,value)
- environment.arguments[name] = value
+-- Next comes the user's home path. We need this as later on we have
+-- to replace ~ with its value.
+
+do
+
+ local homedir = osgetenv(ostype == "windows" and 'USERPROFILE' or 'HOME') or ''
+
+ if not homedir or homedir == "" then
+ homedir = string.char(127) -- we need a value, later we wil trigger on it
+ end
+
+ homedir = file.collapsepath(homedir)
+
+ ossetenv("HOME", homedir) -- can be used in unix cnf files
+ ossetenv("USERPROFILE",homedir) -- can be used in windows cnf files
+
+ environment.homedir = homedir
+
end
--- todo: defaults, better checks e.g on type (boolean versus string)
---
--- tricky: too many hits when we support partials unless we add
--- a registration of arguments so from now on we have 'partial'
+-- The following code sets the name of the own binary and its
+-- path. This is fallback code as we have os.selfdir now.
-function environment.argument(name,partial)
- local arguments, sortedflags = environment.arguments, environment.sortedflags
- if arguments[name] then
- return arguments[name]
- elseif partial then
- if not sortedflags then
- sortedflags = table.sortedkeys(arguments)
- for k=1,#sortedflags do
- sortedflags[k] = "^" .. sortedflags[k]
- end
- environment.sortedflags = sortedflags
+do
+
+ local args = environment.originalarguments or arg -- this needs a cleanup
+
+ local ownbin = environment.ownbin or args[-2] or arg[-2] or args[-1] or arg[-1] or arg[0] or "luatex"
+ local ownpath = environment.ownpath or os.selfdir
+
+ ownbin = file.collapsepath(ownbin)
+ ownpath = file.collapsepath(ownpath)
+
+ if not ownpath or ownpath == "" or ownpath == "unset" then
+ ownpath = args[-1] or arg[-1]
+ ownpath = ownpath and filedirname(gsub(ownpath,"\\","/"))
+ if not ownpath or ownpath == "" then
+ ownpath = args[-0] or arg[-0]
+ ownpath = ownpath and filedirname(gsub(ownpath,"\\","/"))
end
- -- example of potential clash: ^mode ^modefile
- for k=1,#sortedflags do
- local v = sortedflags[k]
- if find(name,v) then
- return arguments[sub(v,2,#v)]
+ local binary = ownbin
+ if not ownpath or ownpath == "" then
+ ownpath = ownpath and filedirname(binary)
+ end
+ if not ownpath or ownpath == "" then
+ if os.binsuffix ~= "" then
+ binary = file.replacesuffix(binary,os.binsuffix)
+ end
+ local path = osgetenv("PATH")
+ if path then
+ for p in gmatch(path,"[^"..io.pathseparator.."]+") do
+ local b = filejoin(p,binary)
+ if lfs.isfile(b) then
+ -- we assume that after changing to the path the currentdir function
+ -- resolves to the real location and use this side effect here; this
+ -- trick is needed because on the mac installations use symlinks in the
+ -- path instead of real locations
+ local olddir = lfs.currentdir()
+ if lfs.chdir(p) then
+ local pp = lfs.currentdir()
+ if trace_locating and p ~= pp then
+ report_initialization("following symlink '%s' to '%s'",p,pp)
+ end
+ ownpath = pp
+ lfs.chdir(olddir)
+ else
+ if trace_locating then
+ report_initialization("unable to check path '%s'",p)
+ end
+ ownpath = p
+ end
+ break
+ end
+ end
end
end
+ if not ownpath or ownpath == "" then
+ ownpath = "."
+ report_initialization("forcing fallback ownpath .")
+ elseif trace_locating then
+ report_initialization("using ownpath '%s'",ownpath)
+ end
end
- return nil
+
+ environment.ownbin = ownbin
+ environment.ownpath = ownpath
+
end
-environment.argument("x",true)
+resolvers.ownpath = environment.ownpath
-function environment.split_arguments(separator) -- rather special, cut-off before separator
- local done, before, after = false, { }, { }
- local original_arguments = environment.original_arguments
- for k=1,#original_arguments do
- local v = original_arguments[k]
- if not done and v == separator then
- done = true
- elseif done then
- after[#after+1] = v
- else
- before[#before+1] = v
- end
- end
- return before, after
+function resolvers.getownpath()
+ return environment.ownpath
end
-function environment.reconstruct_commandline(arg,noquote)
- arg = arg or environment.original_arguments
- if noquote and #arg == 1 then
- local a = arg[1]
- a = resolvers.resolve(a)
- a = unquote(a)
- return a
- elseif #arg > 0 then
- local result = { }
- for i=1,#arg do
- local a = arg[i]
- a = resolvers.resolve(a)
- a = unquote(a)
- a = gsub(a,'"','\\"') -- tricky
- if find(a," ") then
- result[#result+1] = quote(a)
- else
- result[#result+1] = a
- end
- end
- return table.join(result," ")
+-- The self variables permit us to use only a few (or even no)
+-- environment variables.
+
+do
+
+ local ownpath = environment.ownpath or dir.current()
+
+ if ownpath then
+ ossetenv('SELFAUTOLOC', file.collapsepath(ownpath))
+ ossetenv('SELFAUTODIR', file.collapsepath(ownpath .. "/.."))
+ ossetenv('SELFAUTOPARENT', file.collapsepath(ownpath .. "/../.."))
else
- return ""
+ report_initialization("error: unable to locate ownpath")
+ os.exit()
end
+
end
-if arg then
+-- The running os:
- -- new, reconstruct quoted snippets (maybe better just remove the " then and add them later)
- local newarg, instring = { }, false
+-- todo: check is context sits here os.platform is more trustworthy
+-- that the bin check as mtx-update runs from another path
- for index=1,#arg do
- local argument = arg[index]
- if find(argument,"^\"") then
- newarg[#newarg+1] = gsub(argument,"^\"","")
- if not find(argument,"\"$") then
- instring = true
- end
- elseif find(argument,"\"$") then
- newarg[#newarg] = newarg[#newarg] .. " " .. gsub(argument,"\"$","")
- instring = false
- elseif instring then
- newarg[#newarg] = newarg[#newarg] .. " " .. argument
- else
- newarg[#newarg+1] = argument
- end
- end
- for i=1,-5,-1 do
- newarg[i] = arg[i]
- end
+local texos = environment.texos or osgetenv("TEXOS")
+local texmfos = environment.texmfos or osgetenv('SELFAUTODIR')
- environment.initialize_arguments(newarg)
- environment.original_arguments = newarg
- environment.raw_arguments = arg
+if not texos or texos == "" then
+ texos = file.basename(texmfos)
+end
- arg = { } -- prevent duplicate handling
+ossetenv('TEXMFOS', texmfos) -- full bin path
+ossetenv('TEXOS', texos) -- partial bin parent
+ossetenv('SELFAUTOSYSTEM',os.platform) -- bonus
-end
+environment.texos = texos
+environment.texmfos = texmfos
--- weird place ... depends on a not yet loaded module
+-- The current root:
-function environment.texfile(filename)
- return resolvers.find_file(filename,'tex')
-end
+local texroot = environment.texroot or osgetenv("TEXROOT")
-function environment.luafile(filename)
- local resolved = resolvers.find_file(filename,'tex') or ""
- if resolved ~= "" then
- return resolved
- end
- resolved = resolvers.find_file(filename,'texmfscripts') or ""
- if resolved ~= "" then
- return resolved
- end
- return resolvers.find_file(filename,'luatexlibs') or ""
+if not texroot or texroot == "" then
+ texroot = osgetenv('SELFAUTOPARENT')
+ ossetenv('TEXROOT',texroot)
end
-environment.loadedluacode = loadfile -- can be overloaded
+environment.texroot = file.collapsepath(texroot)
---~ function environment.loadedluacode(name)
---~ if os.spawn("texluac -s -o texluac.luc " .. name) == 0 then
---~ local chunk = loadstring(io.loaddata("texluac.luc"))
---~ os.remove("texluac.luc")
---~ return chunk
---~ else
---~ environment.loadedluacode = loadfile -- can be overloaded
---~ return loadfile(name)
---~ end
---~ end
-
-function environment.luafilechunk(filename) -- used for loading lua bytecode in the format
- filename = file.replacesuffix(filename, "lua")
- local fullname = environment.luafile(filename)
- if fullname and fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading file %s", fullname)
- end
- return environment.loadedluacode(fullname)
- else
- if trace_locating then
- logs.report("fileio","unknown file %s", filename)
- end
- return nil
+-- Tracing. Todo ...
+
+function resolvers.settrace(n) -- no longer number but: 'locating' or 'detail'
+ if n then
+ trackers.disable("resolvers.*")
+ trackers.enable("resolvers."..n)
end
end
--- the next ones can use the previous ones / combine
+resolvers.settrace(osgetenv("MTX_INPUT_TRACE"))
-function environment.loadluafile(filename, version)
- local lucname, luaname, chunk
- local basename = file.removesuffix(filename)
- if basename == filename then
- lucname, luaname = basename .. ".luc", basename .. ".lua"
- else
- lucname, luaname = nil, basename -- forced suffix
- end
- -- when not overloaded by explicit suffix we look for a luc file first
- local fullname = (lucname and environment.luafile(lucname)) or ""
- if fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading %s", fullname)
- end
- chunk = loadfile(fullname) -- this way we don't need a file exists check
- end
- if chunk then
- assert(chunk)()
- if version then
- -- we check of the version number of this chunk matches
- local v = version -- can be nil
- if modules and modules[filename] then
- v = modules[filename].version -- new method
- elseif versions and versions[filename] then
- v = versions[filename] -- old method
- end
- if v == version then
- return true
- else
- if trace_locating then
- logs.report("fileio","version mismatch for %s: lua=%s, luc=%s", filename, v, version)
- end
- environment.loadluafile(filename)
- end
- else
- return true
- end
- end
- fullname = (luaname and environment.luafile(luaname)) or ""
- if fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading %s", fullname)
- end
- chunk = loadfile(fullname) -- this way we don't need a file exists check
- if not chunk then
- if trace_locating then
- logs.report("fileio","unknown file %s", filename)
- end
- else
- assert(chunk)()
- return true
- end
- end
- return false
+-- todo:
+
+-- if profiler and osgetenv("MTX_PROFILE_RUN") == "YES" then
+-- profiler.start("luatex-profile.log")
+-- 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
end
@@ -7659,536 +9930,1152 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['trac-inf'] = {
+if not modules then modules = { } end modules ['data-exp'] = {
version = 1.001,
- comment = "companion to trac-inf.mkiv",
+ 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"
+ license = "see context related readme files",
}
-local format = string.format
+local format, find, gmatch, lower = string.format, string.find, string.gmatch, string.lower
+local concat, sort = table.concat, table.sort
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local Ct, Cs, Cc, P, C, S = lpeg.Ct, lpeg.Cs, lpeg.Cc, lpeg.P, lpeg.C, lpeg.S
+local type, next = type, next
-local statusinfo, n, registered = { }, 0, { }
+local ostype = os.type
+local collapsepath = file.collapsepath
-statistics = statistics or { }
+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)
-statistics.enable = true
-statistics.threshold = 0.05
+local report_expansions = logs.reporter("resolvers","expansions")
--- timing functions
+local resolvers = resolvers
-local clock = os.gettimeofday or os.clock
+-- 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
+-- past this every time. See data-obs.lua for the gsub variant.
-local notimer
+-- {a,b,c,d}
+-- a,b,c/{p,q,r},d
+-- a,b,c/{p,q,r}/d/{x,y,z}//
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a{b,c}{d,e}f
+-- {a,b,c,d}
+-- {a,b,c/{p,q,r},d}
+-- {a,b,c/{p,q,r}/d/{x,y,z}//}
+-- {a,b,c/{p,q/{x,y,z}},d/{p,q,r}}
+-- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}}
+-- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}
-function statistics.hastimer(instance)
- return instance and instance.starttime
+local function f_first(a,b)
+ local t, n = { }, 0
+ for s in gmatch(b,"[^,]+") do
+ n = n + 1 ; t[n] = a .. s
+ end
+ return concat(t,",")
end
-function statistics.resettiming(instance)
- if not instance then
- notimer = { timing = 0, loadtime = 0 }
- else
- instance.timing, instance.loadtime = 0, 0
+local function f_second(a,b)
+ local t, n = { }, 0
+ for s in gmatch(a,"[^,]+") do
+ n = n + 1 ; t[n] = s .. b
end
+ return concat(t,",")
end
-function statistics.starttiming(instance)
- if not instance then
- notimer = { }
- instance = notimer
- end
- local it = instance.timing
- if not it then
- it = 0
- end
- if it == 0 then
- instance.starttime = clock()
- if not instance.loadtime then
- instance.loadtime = 0
+local function f_both(a,b)
+ local t, n = { }, 0
+ for sa in gmatch(a,"[^,]+") do
+ for sb in gmatch(b,"[^,]+") do
+ n = n + 1 ; t[n] = sa .. sb
end
- else
---~ logs.report("system","nested timing (%s)",tostring(instance))
end
- instance.timing = it + 1
+ return concat(t,",")
end
-function statistics.stoptiming(instance, report)
- if not instance then
- instance = notimer
- end
- if instance then
- local it = instance.timing
- if it > 1 then
- instance.timing = it - 1
- else
- local starttime = instance.starttime
- if starttime then
- local stoptime = clock()
- local loadtime = stoptime - starttime
- instance.stoptime = stoptime
- instance.loadtime = instance.loadtime + loadtime
- if report then
- statistics.report("load time %0.3f",loadtime)
- end
- instance.timing = 0
- return loadtime
+local left = P("{")
+local right = P("}")
+local var = P((1 - S("{}" ))^0)
+local set = P((1 - S("{},"))^0)
+local other = P(1)
+
+local l_first = Cs( ( Cc("{") * (C(set) * left * C(var) * right / f_first) * Cc("}") + other )^0 )
+local l_second = Cs( ( Cc("{") * (left * C(var) * right * C(set) / f_second) * Cc("}") + other )^0 )
+local l_both = Cs( ( Cc("{") * (left * C(var) * right * left * C(var) * right / f_both) * Cc("}") + other )^0 )
+local l_rest = Cs( ( left * var * (left/"") * var * (right/"") * var * right + other )^0 )
+
+local stripper_1 = lpeg.stripper ("{}@")
+local replacer_1 = lpeg.replacer { { ",}", ",@}" }, { "{,", "{@," }, }
+
+local function splitpathexpr(str, newlist, validate) -- I couldn't resist lpegging it (nice exercise).
+ if trace_expansions then
+ report_expansions("expanding variable '%s'",str)
+ end
+ local t, ok, done = newlist or { }, false, false
+ local n = #t
+ str = lpegmatch(replacer_1,str)
+ repeat local old = str
+ repeat local old = str ; str = lpegmatch(l_first, str) until old == str
+ repeat local old = str ; str = lpegmatch(l_second,str) until old == str
+ repeat local old = str ; str = lpegmatch(l_both, str) until old == str
+ repeat local old = str ; str = lpegmatch(l_rest, str) until old == str
+ until old == str -- or not find(str,"{")
+ str = lpegmatch(stripper_1,str)
+ if validate then
+ for s in gmatch(str,"[^,]+") do
+ s = validate(s)
+ if s then
+ n = n + 1 ; t[n] = s
end
end
+ else
+ for s in gmatch(str,"[^,]+") do
+ n = n + 1 ; t[n] = s
+ end
end
- return 0
+ if trace_expansions then
+ for k=1,#t do
+ report_expansions("% 4i: %s",k,t[k])
+ end
+ end
+ return t
end
-function statistics.elapsedtime(instance)
- if not instance then
- instance = notimer
- end
- return format("%0.3f",(instance and instance.loadtime) or 0)
+-- We could make the previous one public.
+
+local function validate(s)
+ s = collapsepath(s) -- already keeps the //
+ return s ~= "" and not find(s,"^!*unset/*$") and s
end
-function statistics.elapsedindeed(instance)
- if not instance then
- instance = notimer
+resolvers.validatedpath = validate -- keeps the trailing //
+
+function resolvers.expandedpathfromlist(pathlist)
+ local newlist = { }
+ for k=1,#pathlist do
+ splitpathexpr(pathlist[k],newlist,validate)
end
- local t = (instance and instance.loadtime) or 0
- return t > statistics.threshold
+ return newlist
end
-function statistics.elapsedseconds(instance,rest) -- returns nil if 0 seconds
- if statistics.elapsedindeed(instance) then
- return format("%s seconds %s", statistics.elapsedtime(instance),rest or "")
+local cleanup = lpeg.replacer {
+ { "!" , "" },
+ { "\\" , "/" },
+}
+
+local homedir
+
+function resolvers.cleanpath(str)
+ if not homedir then
+ homedir = lpegmatch(cleanup,environment.homedir or "")
+ if homedir == string.char(127) 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 find(str,"~") then
+ return "" -- special case
+ else
+ return str and lpegmatch(cleanup,str)
+ end
+ end
+ else
+ cleanup = lpeg.replacer {
+ { "!" , "" },
+ { "\\" , "/" },
+ { "~" , homedir },
+ }
+ function resolvers.cleanpath(str)
+ return str and lpegmatch(cleanup,str)
+ end
+ end
end
+ return resolvers.cleanpath(str)
end
--- general function
+-- This one strips quotes and funny tokens.
-function statistics.register(tag,fnc)
- if statistics.enable and type(fnc) == "function" then
- local rt = registered[tag] or (#statusinfo + 1)
- statusinfo[rt] = { tag, fnc }
- registered[tag] = rt
- if #tag > n then n = #tag end
- end
+local expandhome = P("~") / "$HOME" -- environment.homedir
+
+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
+)
+
+function resolvers.checkedvariable(str) -- assumes str is a string
+ return lpegmatch(stripper,str) or str
end
-function statistics.show(reporter)
- if statistics.enable then
- if not reporter then reporter = function(tag,data,n) texio.write_nl(tag .. " " .. data) end end
- -- this code will move
- local register = statistics.register
- register("luatex banner", function()
- return string.lower(status.banner)
- end)
- register("control sequences", function()
- return format("%s of %s", status.cs_count, status.hash_size+status.hash_extra)
- end)
- register("callbacks", function()
- local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0
- return format("direct: %s, indirect: %s, total: %s", total-indirect, indirect, total)
- end)
- register("current memory usage", statistics.memused)
- register("runtime",statistics.runtime)
--- --
- for i=1,#statusinfo do
- local s = statusinfo[i]
- local r = s[2]()
- if r then
- reporter(s[1],r,n)
+-- The path splitter:
+
+-- A config (optionally) has the paths split in tables. Internally
+-- we join them and split them after the expansion has taken place. This
+-- is more convenient.
+
+local cache = { }
+
+---- splitter = Ct(lpeg.splitat(S(ostype == "windows" and ";" or ":;"))) -- maybe add ,
+local splitter = Ct(lpeg.splitat(";")) -- as we move towards urls, prefixes and use tables we no longer do :
+
+local backslashswapper = lpeg.replacer("\\","/")
+
+local function splitconfigurationpath(str) -- beware, this can be either a path or a { specification }
+ if str then
+ local found = cache[str]
+ if not found then
+ if str == "" then
+ found = { }
+ else
+ local split = lpegmatch(splitter,lpegmatch(backslashswapper,str)) -- can be combined
+ found = { }
+ local noffound = 0
+ for i=1,#split do
+ local s = split[i]
+ if not find(s,"^{*unset}*") then
+ noffound = noffound + 1
+ found[noffound] = s
+ end
+ end
+ if trace_expansions then
+ report_expansions("splitting path specification '%s'",str)
+ for k=1,noffound do
+ report_expansions("% 4i: %s",k,found[k])
+ end
+ end
+ cache[str] = found
end
end
- texio.write_nl("") -- final newline
- statistics.enable = false
+ return found
end
end
-function statistics.show_job_stat(tag,data,n)
- texio.write_nl(format("%-15s: %s - %s","mkiv lua stats",tag:rpadd(n," "),data))
-end
+resolvers.splitconfigurationpath = splitconfigurationpath
-function statistics.memused() -- no math.round yet -)
- local round = math.round or math.floor
- return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000))
+function resolvers.splitpath(str)
+ if type(str) == 'table' then
+ return str
+ else
+ return splitconfigurationpath(str)
+ end
end
-if statistics.runtime then
- -- already loaded and set
-elseif luatex and luatex.starttime then
- statistics.starttime = luatex.starttime
- statistics.loadtime = 0
- statistics.timing = 0
-else
- statistics.starttiming(statistics)
+function resolvers.joinpath(str)
+ if type(str) == 'table' then
+ return file.joinpath(str)
+ else
+ return str
+ end
end
-function statistics.runtime()
- statistics.stoptiming(statistics)
- return statistics.formatruntime(statistics.elapsedtime(statistics))
-end
+-- The next function scans directories and returns a hash where the
+-- entries are either strings or tables.
-function statistics.formatruntime(runtime)
- return format("%s seconds", statistics.elapsedtime(statistics))
-end
+-- starting with . or .. etc or funny char
-function statistics.timed(action,report)
- local timer = { }
- report = report or logs.simple
- statistics.starttiming(timer)
- action()
- statistics.stoptiming(timer)
- report("total runtime: %s",statistics.elapsedtime(timer))
-end
--- where, not really the best spot for this:
-commands = commands or { }
-local timer
+local weird = P(".")^1 + lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
-function commands.resettimer()
- statistics.resettiming(timer)
- statistics.starttiming(timer)
+local attributes, directory = lfs.attributes, lfs.dir
+
+local function scan(files,spec,path,n,m,r)
+ local full = (path == "" and spec) or (spec .. path .. '/')
+ local dirs, nofdirs = { }, 0
+ for name in directory(full) do
+ if not lpegmatch(weird,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 }
+ else
+ f[#f+1] = path
+ end
+ else -- probably unique anyway
+ files[name] = path
+ local lower = lower(name)
+ if name ~= lower then
+ files["remap:"..lower] = name
+ r = r + 1
+ end
+ end
+ elseif mode == 'directory' then
+ m = m + 1
+ 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, n, m, r = scan(files,spec,dirs[i],n,m,r)
+ end
+ end
+ return files, n, m, r
end
-function commands.elapsedtime()
- statistics.stoptiming(timer)
- tex.sprint(statistics.elapsedtime(timer))
+function resolvers.scanfiles(path,branch)
+ if trace_locating then
+ report_expansions("scanning path '%s', branch '%s'",path, branch or path)
+ end
+ local realpath = resolvers.resolve(path) -- no shortcut
+ 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)
+ end
+ return files
end
-commands.resettimer()
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['trac-log'] = {
+if not modules then modules = { } end modules ['data-env'] = {
version = 1.001,
- comment = "companion to trac-log.mkiv",
+ 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"
+ license = "see context related readme files",
}
--- this is old code that needs an overhaul
+local lower, gsub = string.lower, string.gsub
---~ io.stdout:setvbuf("no")
---~ io.stderr:setvbuf("no")
+local resolvers = resolvers
-local write_nl, write = texio.write_nl or print, texio.write or io.write
-local format, gmatch = string.format, string.gmatch
-local texcount = tex and tex.count
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+local fileextname = file.extname
+
+local formats = allocate()
+local suffixes = allocate()
+local dangerous = allocate()
+local suffixmap = allocate()
+
+resolvers.formats = formats
+resolvers.suffixes = suffixes
+resolvers.dangerous = dangerous
+resolvers.suffixmap = suffixmap
+
+local relations = allocate { -- todo: handlers also here
+ core = {
+ ofm = { -- will become obsolete
+ names = { "ofm", "omega font metric", "omega font metrics" },
+ variable = 'OFMFONTS',
+ suffixes = { 'ofm', 'tfm' },
+ },
+ ovf = { -- will become obsolete
+ names = { "ovf", "omega virtual font", "omega virtual fonts" },
+ variable = 'OVFFONTS',
+ suffixes = { 'ovf', 'vf' },
+ },
+ tfm = {
+ names = { "tfm", "tex font metric", "tex font metrics" },
+ variable = 'TFMFONTS',
+ suffixes = { 'tfm' },
+ },
+ vf = {
+ names = { "vf", "virtual font", "virtual fonts" },
+ variable = 'VFFONTS',
+ suffixes = { 'vf' },
+ },
+ otf = {
+ names = { "otf", "opentype", "opentype font", "opentype fonts"},
+ variable = 'OPENTYPEFONTS',
+ suffixes = { 'otf' },
+ },
+ ttf = {
+ names = { "ttf", "truetype", "truetype font", "truetype fonts", "truetype collection", "truetype collections", "truetype dictionary", "truetype dictionaries" },
+ variable = 'TTFONTS',
+ suffixes = { 'ttf', 'ttc', 'dfont' },
+ },
+ afm = {
+ names = { "afm", "adobe font metric", "adobe font metrics" },
+ variable = "AFMFONTS",
+ suffixes = { "afm" },
+ },
+ pfb = {
+ names = { "pfb", "type1", "type 1", "type1 font", "type 1 font", "type1 fonts", "type 1 fonts" },
+ variable = 'T1FONTS',
+ suffixes = { 'pfb', 'pfa' },
+ },
+ fea = {
+ names = { "fea", "font feature", "font features", "font feature file", "font feature files" },
+ variable = 'FONTFEATURES',
+ suffixes = { 'fea' },
+ },
+ cid = {
+ names = { "cid", "cid map", "cid maps", "cid file", "cid files" },
+ variable = 'FONTCIDMAPS',
+ suffixes = { 'cid', 'cidmap' },
+ },
+ fmt = {
+ names = { "fmt", "format", "tex format" },
+ variable = 'TEXFORMATS',
+ suffixes = { 'fmt' },
+ },
+ mem = { -- will become obsolete
+ names = { 'mem', "metapost format" },
+ variable = 'MPMEMS',
+ suffixes = { 'mem' },
+ },
+ mp = {
+ names = { "mp" },
+ variable = 'MPINPUTS',
+ suffixes = { 'mp' },
+ },
+ tex = {
+ names = { "tex" },
+ variable = 'TEXINPUTS',
+ suffixes = { 'tex', "mkiv", "mkiv", "mkii" },
+ },
+ icc = {
+ names = { "icc", "icc profile", "icc profiles" },
+ variable = 'ICCPROFILES',
+ suffixes = { 'icc' },
+ },
+ texmfscripts = {
+ names = { "texmfscript", "texmfscripts", "script", "scripts" },
+ variable = 'TEXMFSCRIPTS',
+ suffixes = { 'rb', 'pl', 'py' },
+ },
+ lua = {
+ names = { "lua" },
+ variable = 'LUAINPUTS',
+ suffixes = { 'lua', 'luc', 'tma', 'tmc' },
+ },
+ lib = {
+ names = { "lib" },
+ variable = 'CLUAINPUTS',
+ suffixes = os.libsuffix and { os.libsuffix } or { 'dll', 'so' },
+ },
+ bib = {
+ names = { 'bib' },
+ suffixes = { 'bib' },
+ },
+ bst = {
+ names = { 'bst' },
+ suffixes = { 'bst' },
+ },
+ fontconfig = {
+ names = { 'fontconfig', 'fontconfig file', 'fontconfig files' },
+ variable = 'FONTCONFIG_PATH',
+ },
+ },
+ obsolete = {
+ enc = {
+ names = { "enc", "enc files", "enc file", "encoding files", "encoding file" },
+ variable = 'ENCFONTS',
+ suffixes = { 'enc' },
+ },
+ map = {
+ names = { "map", "map files", "map file" },
+ variable = 'TEXFONTMAPS',
+ suffixes = { 'map' },
+ },
+ lig = {
+ names = { "lig files", "lig file", "ligature file", "ligature files" },
+ variable = 'LIGFONTS',
+ suffixes = { 'lig' },
+ },
+ opl = {
+ names = { "opl" },
+ variable = 'OPLFONTS',
+ suffixes = { 'opl' },
+ },
+ ovp = {
+ names = { "ovp" },
+ variable = 'OVPFONTS',
+ suffixes = { 'ovp' },
+ },
+ },
+ kpse = { -- subset
+ base = {
+ names = { 'base', "metafont format" },
+ variable = 'MFBASES',
+ suffixes = { 'base', 'bas' },
+ },
+ cmap = {
+ names = { 'cmap', 'cmap files', 'cmap file' },
+ variable = 'CMAPFONTS',
+ suffixes = { 'cmap' },
+ },
+ cnf = {
+ names = { 'cnf' },
+ suffixes = { 'cnf' },
+ },
+ web = {
+ names = { 'web' },
+ suffixes = { 'web', 'ch' }
+ },
+ cweb = {
+ names = { 'cweb' },
+ suffixes = { 'w', 'web', 'ch' },
+ },
+ gf = {
+ names = { 'gf' },
+ suffixes = { '<resolution>gf' },
+ },
+ mf = {
+ names = { 'mf' },
+ variable = 'MFINPUTS',
+ suffixes = { 'mf' },
+ },
+ mft = {
+ names = { 'mft' },
+ suffixes = { 'mft' },
+ },
+ pk = {
+ names = { 'pk' },
+ suffixes = { '<resolution>pk' },
+ },
+ },
+}
-if texlua then
- write_nl = print
- write = io.write
+resolvers.relations = relations
+
+-- formats: maps a format onto a variable
+
+function resolvers.updaterelations()
+ for category, categories in next, relations do
+ for name, relation in next, categories do
+ local rn = relation.names
+ local rv = relation.variable
+ local rs = relation.suffixes
+ if rn and rv then
+ for i=1,#rn do
+ local rni = lower(gsub(rn[i]," ",""))
+ formats[rni] = rv
+ if rs then
+ suffixes[rni] = rs
+ for i=1,#rs do
+ local rsi = rs[i]
+ suffixmap[rsi] = rni
+ end
+ end
+ end
+ end
+ if rs then
+ end
+ end
+ end
end
---[[ldx--
-<p>This is a prelude to a more extensive logging module. For the sake
-of parsing log files, in addition to the standard logging we will
-provide an <l n='xml'/> structured file. Actually, any logging that
-is hooked into callbacks will be \XML\ by default.</p>
---ldx]]--
+resolvers.updaterelations() -- push this in the metatable -> newindex
+
+local function simplified(t,k)
+ return rawget(t,lower(gsub(k," ","")))
+end
-logs = logs or { }
-logs.xml = logs.xml or { }
-logs.tex = logs.tex or { }
+setmetatableindex(formats, simplified)
+setmetatableindex(suffixes, simplified)
+setmetatableindex(suffixmap, simplified)
---[[ldx--
-<p>This looks pretty ugly but we need to speed things up a bit.</p>
---ldx]]--
+-- A few accessors, mostly for command line tool.
-logs.moreinfo = [[
-more information about ConTeXt and the tools that come with it can be found at:
+function resolvers.suffixofformat(str)
+ local s = suffixes[str]
+ return s and s[1] or ""
+end
-maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
-webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
-wiki : http://contextgarden.net
-]]
+function resolvers.suffixofformat(str)
+ return suffixes[str] or { }
+end
-logs.levels = {
- ['error'] = 1,
- ['warning'] = 2,
- ['info'] = 3,
- ['debug'] = 4,
-}
+for name, format in next, formats do
+ dangerous[name] = true -- still needed ?
+end
-logs.functions = {
- 'report', 'start', 'stop', 'push', 'pop', 'line', 'direct',
- 'start_run', 'stop_run',
- 'start_page_number', 'stop_page_number',
- 'report_output_pages', 'report_output_log',
- 'report_tex_stat', 'report_job_stat',
- 'show_open', 'show_close', 'show_load',
-}
+-- because vf searching is somewhat dangerous, we want to prevent
+-- too liberal searching esp because we do a lookup on the current
+-- path anyway; only tex (or any) is safe
-logs.tracers = {
-}
+dangerous.tex = nil
-logs.level = 0
-logs.mode = string.lower((os.getenv("MTX.LOG.MODE") or os.getenv("MTX_LOG_MODE") or "tex"))
-function logs.set_level(level)
- logs.level = logs.levels[level] or level
-end
+-- more helpers
-function logs.set_method(method)
- for _, v in next, logs.functions do
- logs[v] = logs[method][v] or function() end
- end
+function resolvers.formatofvariable(str)
+ return formats[str] or ''
end
--- tex logging
+function resolvers.formatofsuffix(str) -- of file
+ return suffixmap[fileextname(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc)
+end
-function logs.tex.report(category,fmt,...) -- new
- if fmt then
- write_nl(category .. " | " .. format(fmt,...))
- else
- write_nl(category .. " |")
- end
+function resolvers.variableofformat(str)
+ return formats[str] or ''
end
-function logs.tex.line(fmt,...) -- new
- if fmt then
- write_nl(format(fmt,...))
- else
- write_nl("")
+function resolvers.variableofformatorsuffix(str)
+ local v = formats[str]
+ if v then
+ return v
+ end
+ v = suffixmap[fileextname(str)]
+ if v then
+ return formats[v]
end
+ return ''
end
---~ function logs.tex.start_page_number()
---~ local real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
---~ if real > 0 then
---~ if user > 0 then
---~ if sub > 0 then
---~ write(format("[%s.%s.%s",real,user,sub))
---~ else
---~ write(format("[%s.%s",real,user))
---~ end
---~ else
---~ write(format("[%s",real))
---~ end
---~ else
---~ write("[-")
---~ end
---~ end
---~ function logs.tex.stop_page_number()
---~ write("]")
---~ end
-local real, user, sub
+end -- of closure
-function logs.tex.start_page_number()
- real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-tmp'] = {
+ version = 1.100,
+ 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"
+}
+
+--[[ldx--
+<p>This module deals with caching data. It sets up the paths and
+implements loaders and savers for tables. Best is to set the
+following variable. When not set, the usual paths will be
+checked. Personally I prefer the (users) temporary path.</p>
+
+</code>
+TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
+</code>
+
+<p>Currently we do no locking when we write files. This is no real
+problem because most caching involves fonts and the chance of them
+being written at the same time is small. We also need to extend
+luatools with a recache feature.</p>
+--ldx]]--
+
+local format, lower, gsub, concat = string.format, string.lower, string.gsub, table.concat
+local mkdirs, isdir = dir.mkdirs, lfs.isdir
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
+
+local report_caches = logs.reporter("resolvers","caches")
+local report_resolvers = logs.reporter("resolvers","caching")
+
+local resolvers = resolvers
+
+-- intermezzo
+
+local directive_cleanup = false directives.register("system.compile.cleanup", function(v) directive_cleanup = v end)
+local directive_strip = true directives.register("system.compile.strip", function(v) directive_strip = v end)
+
+local compile = utilities.lua.compile
+
+function utilities.lua.compile(luafile,lucfile,cleanup,strip)
+ if cleanup == nil then cleanup = directive_cleanup end
+ if strip == nil then strip = directive_strip end
+ return compile(luafile,lucfile,cleanup,strip)
end
-function logs.tex.stop_page_number()
- if real > 0 then
- if user > 0 then
- if sub > 0 then
- logs.report("pages", "flushing realpage %s, userpage %s, subpage %s",real,user,sub)
- else
- logs.report("pages", "flushing realpage %s, userpage %s",real,user)
+-- end of intermezzo
+
+caches = caches or { }
+local caches = caches
+
+caches.base = caches.base or "luatex-cache"
+caches.more = caches.more or "context"
+caches.direct = false -- true is faster but may need huge amounts of memory
+caches.tree = false
+caches.force = true
+caches.ask = false
+caches.relocate = false
+caches.defaults = { "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
+
+local writable, readables, usedreadables = nil, { }, { }
+
+-- we could use a metatable for writable and readable but not yet
+
+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")
+ if texmfcaches then
+ for k=1,#texmfcaches do
+ local cachepath = texmfcaches[k]
+ if cachepath ~= "" then
+ cachepath = resolvers.resolve(cachepath)
+ cachepath = resolvers.cleanpath(cachepath)
+ cachepath = file.collapsepath(cachepath)
+ local valid = isdir(cachepath)
+ if valid then
+ if file.is_readable(cachepath) then
+ readables[#readables+1] = cachepath
+ if not writable and file.is_writable(cachepath) then
+ writable = cachepath
+ end
+ end
+ elseif not writable and caches.force then
+ local cacheparent = file.dirname(cachepath)
+ if file.is_writable(cacheparent) then
+ if not caches.ask or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then
+ mkdirs(cachepath)
+ if isdir(cachepath) and file.is_writable(cachepath) then
+ report_caches("created: %s",cachepath)
+ writable = cachepath
+ readables[#readables+1] = cachepath
+ end
+ end
+ end
+ end
end
- else
- logs.report("pages", "flushing realpage %s",real)
+ end
+ end
+ -- As a last resort we check some temporary paths but this time we don't
+ -- create them.
+ local texmfcaches = caches.defaults
+ if texmfcaches then
+ for k=1,#texmfcaches do
+ local cachepath = texmfcaches[k]
+ cachepath = resolvers.expansion(cachepath) -- was getenv
+ if cachepath ~= "" then
+ cachepath = resolvers.resolve(cachepath)
+ cachepath = resolvers.cleanpath(cachepath)
+ local valid = isdir(cachepath)
+ if valid and file.is_readable(cachepath) then
+ if not writable and file.is_writable(cachepath) then
+ readables[#readables+1] = cachepath
+ writable = cachepath
+ break
+ end
+ end
+ end
+ end
+ end
+ -- Some extra checking. If we have no writable or readable path then we simply
+ -- quit.
+ if not writable then
+ report_caches("fatal error: there is no valid writable cache path defined")
+ os.exit()
+ elseif #readables == 0 then
+ report_caches("fatal error: there is no valid readable cache path defined")
+ os.exit()
+ end
+ -- why here
+ writable = dir.expandname(resolvers.cleanpath(writable)) -- just in case
+ -- moved here
+ local base, more, tree = caches.base, caches.more, caches.tree or caches.treehash() -- we have only one writable tree
+ if tree then
+ caches.tree = tree
+ writable = mkdirs(writable,base,more,tree)
+ for i=1,#readables do
+ readables[i] = file.join(readables[i],base,more,tree)
end
else
- logs.report("pages", "flushing page")
+ writable = mkdirs(writable,base,more)
+ for i=1,#readables do
+ readables[i] = file.join(readables[i],base,more)
+ end
+ end
+ -- end
+ if trace_cache then
+ for i=1,#readables do
+ report_caches("using readable path '%s' (order %s)",readables[i],i)
+ end
+ report_caches("using writable path '%s'",writable)
+ end
+ identify = function()
+ return writable, readables
end
- io.flush()
+ return writable, readables
end
-logs.tex.report_job_stat = statistics.show_job_stat
+function caches.usedpaths()
+ local writable, readables = identify()
+ if #readables > 1 then
+ local result = { }
+ for i=1,#readables do
+ local readable = readables[i]
+ if usedreadables[i] or readable == writable then
+ result[#result+1] = format("readable: '%s' (order %s)",readable,i)
+ end
+ end
+ result[#result+1] = format("writable: '%s'",writable)
+ return result
+ else
+ return writable
+ end
+end
--- xml logging
+function caches.configfiles()
+ return table.concat(resolvers.instance.specification,";")
+end
-function logs.xml.report(category,fmt,...) -- new
- if fmt then
- write_nl(format("<r category='%s'>%s</r>",category,format(fmt,...)))
- else
- write_nl(format("<r category='%s'/>",category))
+function caches.hashed(tree)
+ tree = gsub(tree,"\\$","/")
+ tree = gsub(tree,"/+$","")
+ tree = lower(tree)
+ local hash = md5.hex(tree)
+ if trace_cache or trace_locating then
+ report_caches("hashing tree %s, hash %s",tree,hash)
end
+ return hash
end
-function logs.xml.line(fmt,...) -- new
- if fmt then
- write_nl(format("<r>%s</r>",format(fmt,...)))
+
+function caches.treehash()
+ local tree = caches.configfiles()
+ if not tree or tree == "" then
+ return false
else
- write_nl("<r/>")
+ return caches.hashed(tree)
end
end
-function logs.xml.start() if logs.level > 0 then tw("<%s>" ) end end
-function logs.xml.stop () if logs.level > 0 then tw("</%s>") end end
-function logs.xml.push () if logs.level > 0 then tw("<!-- ") end end
-function logs.xml.pop () if logs.level > 0 then tw(" -->" ) end end
+local r_cache, w_cache = { }, { } -- normally w in in r but who cares
-function logs.xml.start_run()
- write_nl("<?xml version='1.0' standalone='yes'?>")
- write_nl("<job>") -- xmlns='www.pragma-ade.com/luatex/schemas/context-job.rng'
- write_nl("")
-end
-
-function logs.xml.stop_run()
- write_nl("</job>")
+local function getreadablepaths(...) -- we can optimize this as we have at most 2 tags
+ local tags = { ... }
+ local hash = concat(tags,"/")
+ local done = r_cache[hash]
+ if not done then
+ local writable, readables = identify() -- exit if not found
+ if #tags > 0 then
+ done = { }
+ for i=1,#readables do
+ done[i] = file.join(readables[i],...)
+ end
+ else
+ done = readables
+ end
+ r_cache[hash] = done
+ end
+ return done
end
-function logs.xml.start_page_number()
- write_nl(format("<p real='%s' page='%s' sub='%s'", texcount.realpageno, texcount.userpageno, texcount.subpageno))
+local function getwritablepath(...)
+ local tags = { ... }
+ local hash = concat(tags,"/")
+ local done = w_cache[hash]
+ if not done then
+ local writable, readables = identify() -- exit if not found
+ if #tags > 0 then
+ done = mkdirs(writable,...)
+ else
+ done = writable
+ end
+ w_cache[hash] = done
+ end
+ return done
end
-function logs.xml.stop_page_number()
- write("/>")
- write_nl("")
-end
+caches.getreadablepaths = getreadablepaths
+caches.getwritablepath = getwritablepath
-function logs.xml.report_output_pages(p,b)
- write_nl(format("<v k='pages' v='%s'/>", p))
- write_nl(format("<v k='bytes' v='%s'/>", b))
- write_nl("")
+function caches.getfirstreadablefile(filename,...)
+ local rd = getreadablepaths(...)
+ for i=1,#rd do
+ local path = rd[i]
+ local fullname = file.join(path,filename)
+ if file.is_readable(fullname) then
+ usedreadables[i] = true
+ return fullname, path
+ end
+ end
+ return caches.setfirstwritablefile(filename,...)
end
-function logs.xml.report_output_log()
+function caches.setfirstwritablefile(filename,...)
+ local wr = getwritablepath(...)
+ local fullname = file.join(wr,filename)
+ return fullname, wr
end
-function logs.xml.report_tex_stat(k,v)
- texiowrite_nl("log","<v k='"..k.."'>"..tostring(v).."</v>")
+function caches.define(category,subcategory) -- for old times sake
+ return function()
+ return getwritablepath(category,subcategory)
+ end
end
-local level = 0
-
-function logs.xml.show_open(name)
- level = level + 1
- texiowrite_nl(format("<f l='%s' n='%s'>",level,name))
+function caches.setluanames(path,name)
+ return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
end
-function logs.xml.show_close(name)
- texiowrite("</f> ")
- level = level - 1
+function caches.loaddata(readables,name)
+ if type(readables) == "string" then
+ readables = { readables }
+ end
+ for i=1,#readables do
+ local path = readables[i]
+ local tmaname, tmcname = caches.setluanames(path,name)
+ local loader = loadfile(tmcname) or loadfile(tmaname)
+ if loader then
+ loader = loader()
+ collectgarbage("step")
+ return loader
+ end
+ end
+ return false
end
-function logs.xml.show_load(name)
- texiowrite_nl(format("<f l='%s' n='%s'/>",level+1,name))
+function caches.is_writable(filepath,filename)
+ local tmaname, tmcname = caches.setluanames(filepath,filename)
+ return file.is_writable(tmaname)
end
---
-
-local name, banner = 'report', 'context'
+local saveoptions = { compact = true }
-local function report(category,fmt,...)
- if fmt then
- write_nl(format("%s | %s: %s",name,category,format(fmt,...)))
- elseif category then
- write_nl(format("%s | %s",name,category))
+function caches.savedata(filepath,filename,data,raw)
+ local tmaname, tmcname = caches.setluanames(filepath,filename)
+ local reduce, simplify = true, true
+ if raw then
+ reduce, simplify = false, false
+ end
+ data.cache_uuid = os.uuid()
+ if caches.direct then
+ file.savedata(tmaname,table.serialize(data,true,saveoptions))
else
- write_nl(format("%s |",name))
+ table.tofile(tmaname,data,true,saveoptions)
end
+ utilities.lua.compile(tmaname,tmcname)
end
-local function simple(fmt,...)
- if fmt then
- write_nl(format("%s | %s",name,format(fmt,...)))
- else
- write_nl(format("%s |",name))
- end
+-- moved from data-res:
+
+local content_state = { }
+
+function caches.contentstate()
+ return content_state or { }
end
-function logs.setprogram(_name_,_banner_,_verbose_)
- name, banner = _name_, _banner_
- if _verbose_ then
- trackers.enable("resolvers.locating")
- end
- logs.set_method("tex")
- logs.report = report -- also used in libraries
- logs.simple = simple -- only used in scripts !
- if utils then
- utils.report = simple
+function caches.loadcontent(cachename,dataname)
+ local name = caches.hashed(cachename)
+ local full, path = caches.getfirstreadablefile(name ..".lua","trees")
+ local filename = file.join(path,name)
+ local blob = loadfile(filename .. ".luc") or loadfile(filename .. ".lua")
+ if blob then
+ local data = blob()
+ if data and data.content then
+ if data.type == dataname then
+ if data.version == resolvers.cacheversion then
+ content_state[#content_state+1] = data.uuid
+ if trace_locating then
+ report_resolvers("loading '%s' for '%s' from '%s'",dataname,cachename,filename)
+ end
+ return data.content
+ else
+ report_resolvers("skipping '%s' for '%s' from '%s' (version mismatch)",dataname,cachename,filename)
+ end
+ else
+ report_resolvers("skipping '%s' for '%s' from '%s' (datatype mismatch)",dataname,cachename,filename)
+ end
+ elseif trace_locating then
+ report_resolvers("skipping '%s' for '%s' from '%s' (no content)",dataname,cachename,filename)
+ end
+ elseif trace_locating then
+ report_resolvers("skipping '%s' for '%s' from '%s' (invalid file)",dataname,cachename,filename)
end
- logs.verbose = _verbose_
end
-function logs.setverbose(what)
- if what then
- trackers.enable("resolvers.locating")
- else
- trackers.disable("resolvers.locating")
+function caches.collapsecontent(content)
+ for k, v in next, content do
+ if type(v) == "table" and #v == 1 then
+ content[k] = v[1]
+ end
end
- logs.verbose = what or false
end
-function logs.extendbanner(_banner_,_verbose_)
- banner = banner .. " | ".. _banner_
- if _verbose_ ~= nil then
- logs.setverbose(what)
+function caches.savecontent(cachename,dataname,content)
+ local name = caches.hashed(cachename)
+ local full, path = caches.setfirstwritablefile(name ..".lua","trees")
+ local filename = file.join(path,name) -- is full
+ local luaname, lucname = filename .. ".lua", filename .. ".luc"
+ if trace_locating then
+ report_resolvers("preparing '%s' for '%s'",dataname,cachename)
+ end
+ local data = {
+ type = dataname,
+ root = cachename,
+ version = resolvers.cacheversion,
+ date = os.date("%Y-%m-%d"),
+ time = os.date("%H:%M:%S"),
+ content = content,
+ uuid = os.uuid(),
+ }
+ local ok = io.savedata(luaname,table.serialize(data,true))
+ if ok then
+ if trace_locating then
+ report_resolvers("category '%s', cachename '%s' saved in '%s'",dataname,cachename,luaname)
+ end
+ if utilities.lua.compile(luaname,lucname) then
+ if trace_locating then
+ report_resolvers("'%s' compiled to '%s'",dataname,lucname)
+ end
+ return true
+ else
+ if trace_locating then
+ report_resolvers("compiling failed for '%s', deleting file '%s'",dataname,lucname)
+ end
+ os.remove(lucname)
+ end
+ elseif trace_locating then
+ report_resolvers("unable to save '%s' in '%s' (access error)",dataname,luaname)
end
end
-logs.verbose = false
-logs.report = logs.tex.report
-logs.simple = logs.tex.report
-function logs.reportlines(str) -- todo: <lines></lines>
- for line in gmatch(str,"(.-)[\n\r]") do
- logs.report(line)
- end
-end
+end -- of closure
-function logs.reportline() -- for scripts too
- logs.report()
-end
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-met'] = {
+ version = 1.100,
+ 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 find, format = string.find, string.format
+local sequenced = table.sequenced
+local addurlscheme, urlhashed = url.addscheme, url.hashed
+
+local trace_locating = false
+
+trackers.register("resolvers.locating", function(v) trace_methods = v end)
+trackers.register("resolvers.methods", function(v) trace_methods = v end)
+
+
+local report_methods = logs.reporter("resolvers","methods")
-logs.simpleline = logs.reportline
+local allocate = utilities.storage.allocate
-function logs.reportbanner() -- for scripts too
- logs.report(banner)
+local resolvers = resolvers
+
+local registered = { }
+
+local function splitmethod(filename) -- todo: filetype in specification
+ if not filename then
+ return { scheme = "unknown", original = filename }
+ end
+ if type(filename) == "table" then
+ return filename -- already split
+ end
+ filename = file.collapsepath(filename)
+ if not find(filename,"://") then
+ return { scheme = "file", path = filename, original = filename, filename = filename }
+ end
+ local specification = url.hashed(filename)
+ if not specification.scheme or specification.scheme == "" then
+ return { scheme = "file", path = filename, original = filename, filename = filename }
+ else
+ return specification
+ end
end
-function logs.help(message,option)
- logs.reportbanner()
- logs.reportline()
- logs.reportlines(message)
- local moreinfo = logs.moreinfo or ""
- if moreinfo ~= "" and option ~= "nomoreinfo" then
- logs.reportline()
- logs.reportlines(moreinfo)
+resolvers.splitmethod = splitmethod -- bad name but ok
+
+-- the second argument is always analyzed (saves time later on) and the original
+-- gets passed as original but also as argument
+
+local function methodhandler(what,first,...) -- filename can be nil or false
+ local method = registered[what]
+ if method then
+ local how, namespace = method.how, method.namespace
+ if how == "uri" or how == "url" then
+ local specification = splitmethod(first)
+ local scheme = specification.scheme
+ local resolver = namespace and namespace[scheme]
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, scheme=%s, argument=%s",what,how,scheme,first)
+ end
+ return resolver(specification,...)
+ else
+ resolver = namespace.default or namespace.file
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, default, argument=%s",what,how,first)
+ end
+ return resolver(specification,...)
+ elseif trace_methods then
+ report_methods("resolver: method=%s, how=%s, no handler",what,how)
+ end
+ end
+ elseif how == "tag" then
+ local resolver = namespace and namespace[first]
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, tag=%s",what,how,first)
+ end
+ return resolver(...)
+ else
+ resolver = namespace.default or namespace.file
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, default",what,how)
+ end
+ return resolver(...)
+ elseif trace_methods then
+ report_methods("resolver: method=%s, how=%s, unknown",what,how)
+ end
+ end
+ end
+ else
+ report_methods("resolver: method=%s, unknown",what)
end
end
-logs.set_level('error')
-logs.set_method('tex')
+resolvers.methodhandler = methodhandler
-function logs.system(whereto,process,jobname,category,...)
- for i=1,10 do
- local f = io.open(whereto,"a")
- if f then
- f:write(format("%s %s => %s => %s => %s\r",os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...)))
- f:close()
- break
+function resolvers.registermethod(name,namespace,how)
+ registered[name] = { how = how or "tag", namespace = namespace }
+ namespace["byscheme"] = function(scheme,filename,...)
+ if scheme == "file" then
+ return methodhandler(name,filename,...)
else
- sleep(0.1)
+ return methodhandler(name,addurlscheme(filename,scheme),...)
end
end
end
---~ local syslogname = "oeps.xxx"
---~
---~ for i=1,10 do
---~ logs.system(syslogname,"context","test","fonts","font %s recached due to newer version (%s)","blabla","123")
---~ end
+local concatinators = allocate { notfound = file.join } -- concatinate paths
+local locators = allocate { notfound = function() end } -- locate databases
+local hashers = allocate { notfound = function() end } -- load databases
+local generators = allocate { notfound = function() end } -- generate databases
-function logs.fatal(where,...)
- logs.report(where,"fatal error: %s, aborting now",format(...))
- os.exit()
-end
+resolvers.concatinators = concatinators
+resolvers.locators = locators
+resolvers.hashers = hashers
+resolvers.generators = generators
+
+local registermethod = resolvers.registermethod
+
+registermethod("concatinators",concatinators,"tag")
+registermethod("locators", locators, "uri")
+registermethod("hashers", hashers, "uri")
+registermethod("generators", generators, "uri")
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['data-inp'] = {
+if not modules then modules = { } end modules ['data-res'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -8196,981 +11083,510 @@ if not modules then modules = { } end modules ['data-inp'] = {
license = "see context related readme files",
}
--- After a few years using the code the large luat-inp.lua file
--- has been split up a bit. In the process some functionality was
--- dropped:
---
--- * support for reading lsr files
--- * selective scanning (subtrees)
--- * some public auxiliary functions were made private
---
--- TODO: os.getenv -> os.env[]
--- TODO: instances.[hashes,cnffiles,configurations,522]
--- TODO: check escaping in find etc, too much, too slow
-
--- This lib is multi-purpose and can be loaded again later on so that
--- additional functionality becomes available. We will split thislogs.report("fileio",
--- module in components once we're done with prototyping. This is the
--- first code I wrote for LuaTeX, so it needs some cleanup. Before changing
--- something in this module one can best check with Taco or Hans first; there
--- is some nasty trickery going on that relates to traditional kpse support.
-
--- To be considered: hash key lowercase, first entry in table filename
--- (any case), rest paths (so no need for optimization). Or maybe a
--- separate table that matches lowercase names to mixed case when
--- present. In that case the lower() cases can go away. I will do that
--- only when we run into problems with names ... well ... Iwona-Regular.
+-- In practice we will work within one tds tree, but i want to keep
+-- the option open to build tools that look at multiple trees, which is
+-- why we keep the tree specific data in a table. We used to pass the
+-- instance but for practical purposes we now avoid this and use a
+-- instance variable. We always have one instance active (sort of global).
--- Beware, loading and saving is overloaded in luat-tmp!
+-- todo: cache:/// home:///
local format, gsub, find, lower, upper, match, gmatch = string.format, string.gsub, string.find, string.lower, string.upper, string.match, string.gmatch
local concat, insert, sortedkeys = table.concat, table.insert, table.sortedkeys
-local next, type = next, type
-local lpegmatch = lpeg.match
+local next, type, rawget = next, type, rawget
+local os = os
-local trace_locating, trace_detail, trace_expansions = false, false, false
+local P, S, R, C, Cc, Cs, Ct, Carg = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Carg
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
-trackers.register("resolvers.locating", function(v) trace_locating = v end)
-trackers.register("resolvers.details", function(v) trace_detail = v end)
-trackers.register("resolvers.expansions", function(v) trace_expansions = v end) -- todo
+local filedirname = file.dirname
+local filebasename = file.basename
+local fileextname = file.extname
+local filejoin = file.join
+local collapsepath = file.collapsepath
+local joinpath = file.joinpath
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
-if not resolvers then
- resolvers = {
- suffixes = { },
- formats = { },
- dangerous = { },
- suffixmap = { },
- alternatives = { },
- locators = { }, -- locate databases
- hashers = { }, -- load databases
- generators = { }, -- generate databases
- }
-end
+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 resolvers = resolvers
+local report_resolving = logs.reporter("resolvers","resolving")
-resolvers.locators .notfound = { nil }
-resolvers.hashers .notfound = { nil }
-resolvers.generators.notfound = { nil }
-
-resolvers.cacheversion = '1.0.1'
-resolvers.cnfname = 'texmf.cnf'
-resolvers.luaname = 'texmfcnf.lua'
-resolvers.homedir = os.env[os.type == "windows" and 'USERPROFILE'] or os.env['HOME'] or '~'
-resolvers.cnfdefault = '{$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}'
-
-local dummy_path_expr = "^!*unset/*$"
-
-local formats = resolvers.formats
-local suffixes = resolvers.suffixes
-local dangerous = resolvers.dangerous
-local suffixmap = resolvers.suffixmap
-local alternatives = resolvers.alternatives
-
-formats['afm'] = 'AFMFONTS' suffixes['afm'] = { 'afm' }
-formats['enc'] = 'ENCFONTS' suffixes['enc'] = { 'enc' }
-formats['fmt'] = 'TEXFORMATS' suffixes['fmt'] = { 'fmt' }
-formats['map'] = 'TEXFONTMAPS' suffixes['map'] = { 'map' }
-formats['mp'] = 'MPINPUTS' suffixes['mp'] = { 'mp' }
-formats['ocp'] = 'OCPINPUTS' suffixes['ocp'] = { 'ocp' }
-formats['ofm'] = 'OFMFONTS' suffixes['ofm'] = { 'ofm', 'tfm' }
-formats['otf'] = 'OPENTYPEFONTS' suffixes['otf'] = { 'otf' } -- 'ttf'
-formats['opl'] = 'OPLFONTS' suffixes['opl'] = { 'opl' }
-formats['otp'] = 'OTPINPUTS' suffixes['otp'] = { 'otp' }
-formats['ovf'] = 'OVFFONTS' suffixes['ovf'] = { 'ovf', 'vf' }
-formats['ovp'] = 'OVPFONTS' suffixes['ovp'] = { 'ovp' }
-formats['tex'] = 'TEXINPUTS' suffixes['tex'] = { 'tex' }
-formats['tfm'] = 'TFMFONTS' suffixes['tfm'] = { 'tfm' }
-formats['ttf'] = 'TTFONTS' suffixes['ttf'] = { 'ttf', 'ttc', 'dfont' }
-formats['pfb'] = 'T1FONTS' suffixes['pfb'] = { 'pfb', 'pfa' }
-formats['vf'] = 'VFFONTS' suffixes['vf'] = { 'vf' }
-
-formats['fea'] = 'FONTFEATURES' suffixes['fea'] = { 'fea' }
-formats['cid'] = 'FONTCIDMAPS' suffixes['cid'] = { 'cid', 'cidmap' }
-
-formats ['texmfscripts'] = 'TEXMFSCRIPTS' -- new
-suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -- 'lua'
-
-formats ['lua'] = 'LUAINPUTS' -- new
-suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' }
-
--- backward compatible ones
-
-alternatives['map files'] = 'map'
-alternatives['enc files'] = 'enc'
-alternatives['cid maps'] = 'cid' -- great, why no cid files
-alternatives['font feature files'] = 'fea' -- and fea files here
-alternatives['opentype fonts'] = 'otf'
-alternatives['truetype fonts'] = 'ttf'
-alternatives['truetype collections'] = 'ttc'
-alternatives['truetype dictionary'] = 'dfont'
-alternatives['type1 fonts'] = 'pfb'
-
--- obscure ones
-
-formats ['misc fonts'] = ''
-suffixes['misc fonts'] = { }
-
-formats ['sfd'] = 'SFDFONTS'
-suffixes ['sfd'] = { 'sfd' }
-alternatives['subfont definition files'] = 'sfd'
-
--- lib paths
-
-formats ['lib'] = 'CLUAINPUTS' -- new (needs checking)
-suffixes['lib'] = (os.libsuffix and { os.libsuffix }) or { 'dll', 'so' }
+local resolvers = resolvers
--- In practice we will work within one tds tree, but i want to keep
--- the option open to build tools that look at multiple trees, which is
--- why we keep the tree specific data in a table. We used to pass the
--- instance but for practical pusposes we now avoid this and use a
--- instance variable.
+local expandedpathfromlist = resolvers.expandedpathfromlist
+local checkedvariable = resolvers.checkedvariable
+local splitconfigurationpath = resolvers.splitconfigurationpath
+local methodhandler = resolvers.methodhandler
--- here we catch a few new thingies (todo: add these paths to context.tmf)
---
--- FONTFEATURES = .;$TEXMF/fonts/fea//
--- FONTCIDMAPS = .;$TEXMF/fonts/cid//
+local initializesetter = utilities.setters.initialize
--- we always have one instance active
+local ostype, osname, osenv, ossetenv, osgetenv = os.type, os.name, os.env, os.setenv, os.getenv
-resolvers.instance = resolvers.instance or nil -- the current one (slow access)
-local instance = resolvers.instance or nil -- the current one (fast access)
+resolvers.cacheversion = '1.0.1'
+resolvers.configbanner = ''
+resolvers.homedir = environment.homedir
+resolvers.criticalvars = allocate { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF", "TEXMF", "TEXOS" }
+resolvers.luacnfname = 'texmfcnf.lua'
+resolvers.luacnfstate = "unknown"
-function resolvers.newinstance()
+-- resolvers.luacnfspec = '{$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}' -- what a rubish path
+resolvers.luacnfspec = 'selfautoparent:{/texmf{-local,}{,/web2c},}}'
- -- store once, freeze and faster (once reset we can best use
- -- instance.environment) maybe better have a register suffix
- -- function
- for k, v in next, suffixes do
- for i=1,#v do
- local vi = v[i]
- if vi then
- suffixmap[vi] = k
- end
- end
- end
- -- because vf searching is somewhat dangerous, we want to prevent
- -- too liberal searching esp because we do a lookup on the current
- -- path anyway; only tex (or any) is safe
+local unset_variable = "unset"
- for k, v in next, formats do
- dangerous[k] = true
- end
- dangerous.tex = nil
+local formats = resolvers.formats
+local suffixes = resolvers.suffixes
+local dangerous = resolvers.dangerous
+local suffixmap = resolvers.suffixmap
- -- the instance
+resolvers.defaultsuffixes = { "tex" } -- "mkiv", "cld" -- too tricky
- local newinstance = {
- rootpath = '',
- treepath = '',
- progname = 'context',
- engine = 'luatex',
- format = '',
- environment = { },
- variables = { },
- expansions = { },
- files = { },
- remap = { },
- configuration = { },
- setup = { },
- order = { },
- found = { },
- foundintrees = { },
- kpsevars = { },
- hashes = { },
- cnffiles = { },
- luafiles = { },
- lists = { },
- remember = true,
- diskcache = true,
- renewcache = false,
- scandisk = true,
- cachepath = nil,
- loaderror = false,
- sortdata = false,
- savelists = true,
- cleanuppaths = true,
- allresults = false,
- pattern = nil, -- lists
- data = { }, -- only for loading
- force_suffixes = true,
- fakepaths = { },
- }
+resolvers.instance = resolvers.instance or nil -- the current one (slow access)
+local instance = resolvers.instance or nil -- the current one (fast access)
- local ne = newinstance.environment
+-- An instance has an environment (coming from the outside, kept raw), variables
+-- (coming from the configuration file), and expansions (variables with nested
+-- variables replaced). One can push something into the outer environment and
+-- its internal copy, but only the later one will be the raw unprefixed variant.
- for k,v in next, os.env do
- ne[k] = resolvers.bare_variable(v)
+function resolvers.setenv(key,value,raw)
+ if instance then
+ -- this one will be consulted first when we stay inside
+ -- the current environment
+ instance.environment[key] = value
+ -- 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))
end
+end
- return newinstance
+-- Beware we don't want empty here as this one can be called early on
+-- and therefore we use rawget.
+local function getenv(key)
+ local value = rawget(instance.environment,key)
+ if value and value ~= "" then
+ return value
+ else
+ local e = osgetenv(key)
+ return e ~= nil and e ~= "" and checkedvariable(e) or ""
+ end
end
-function resolvers.setinstance(someinstance)
- instance = someinstance
- resolvers.instance = someinstance
- return someinstance
-end
+resolvers.getenv = getenv
+resolvers.env = getenv
-function resolvers.reset()
- return resolvers.setinstance(resolvers.newinstance())
-end
+-- We are going to use some metatable trickery where we backtrack from
+-- expansion to variable to environment.
-local function reset_hashes()
- instance.lists = { }
- instance.found = { }
+local function resolve(k)
+ return instance.expansions[k]
end
-local function check_configuration() -- not yet ok, no time for debugging now
- if os.env["OSFONTDIR"] then
- -- ok
- elseif os.type == "windows" then
- os.setenv("OSFONTDIR","c:/windows/fonts//")
- elseif os.type == "macosx" then
- os.setenv("OSFONTDIR","$HOME/Library/Fonts//;/Library/Fonts//;/System/Library/Fonts//")
- end
-end
+local dollarstripper = lpeg.stripper("$")
+local inhibitstripper = P("!")^0 * Cs(P(1)^0)
+local backslashswapper = lpeg.replacer("\\","/")
-function resolvers.bare_variable(str) -- assumes str is a string
- return (gsub(str,"\s*([\"\']?)(.+)%1\s*", "%2"))
-end
+local somevariable = P("$") / ""
+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 )
-function resolvers.settrace(n) -- no longer number but: 'locating' or 'detail'
- if n then
- trackers.disable("resolvers.*")
- trackers.enable("resolvers."..n)
- end
-end
+local cleaner = P("\\") / "/" + P(";") * S("!{}/\\")^0 * P(";")^1 / ";"
+local variablecleaner = Cs((cleaner + P(1))^0)
-resolvers.settrace(os.getenv("MTX_INPUT_TRACE"))
+local somevariable = R("az","AZ","09","__","--")^1 / resolve
+local variable = (P("$")/"") * (somevariable + (P("{")/"") * somevariable * (P("}")/""))
+local variableresolver = Cs((variable + P(1))^0)
-function resolvers.osenv(key)
- local ie = instance.environment
- local value = ie[key]
- if value == nil then
- -- local e = os.getenv(key)
- local e = os.env[key]
- if e == nil then
- -- value = "" -- false
- else
- value = resolvers.bare_variable(e)
- end
- ie[key] = value
- end
- return value or ""
+local function expandedvariable(var)
+ return lpegmatch(variableexpander,var) or var
end
-function resolvers.env(key)
- return instance.environment[key] or resolvers.osenv(key)
-end
+function resolvers.newinstance() -- todo: all vars will become lowercase and alphanum only
---
+ if trace_locating then
+ report_resolving("creating instance")
+ end
-local function expand_vars(lst) -- simple vars
- local variables, env = instance.variables, resolvers.env
- local function resolve(a)
- return variables[a] or env(a)
- end
- for k=1,#lst do
- lst[k] = gsub(lst[k],"%$([%a%d%_%-]+)",resolve)
- end
-end
+ local environment, variables, expansions, order = allocate(), allocate(), allocate(), allocate()
-local function expanded_var(var) -- simple vars
- local function resolve(a)
- return instance.variables[a] or resolvers.env(a)
- end
- return (gsub(var,"%$([%a%d%_%-]+)",resolve))
-end
+ local newinstance = {
+ environment = environment,
+ variables = variables,
+ expansions = expansions,
+ order = order,
+ files = allocate(),
+ setups = allocate(),
+ found = allocate(),
+ foundintrees = allocate(),
+ hashes = allocate(),
+ hashed = allocate(),
+ specification = allocate(),
+ lists = allocate(),
+ data = allocate(), -- only for loading
+ fakepaths = allocate(),
+ remember = true,
+ diskcache = true,
+ renewcache = false,
+ loaderror = false,
+ savelists = true,
+ pattern = nil, -- lists
+ force_suffixes = true,
+ }
-local function entry(entries,name)
- if name and (name ~= "") then
- name = gsub(name,'%$','')
- local result = entries[name..'.'..instance.progname] or entries[name]
- if result then
- return result
- else
- result = resolvers.env(name)
- if result then
- instance.variables[name] = result
- resolvers.expand_variables()
- return instance.expansions[name] or ""
+ setmetatableindex(variables,function(t,k)
+ local v
+ for i=1,#order do
+ v = order[i][k]
+ if v ~= nil then
+ t[k] = v
+ return v
end
end
- end
- return ""
-end
-
-local function is_entry(entries,name)
- if name and name ~= "" then
- name = gsub(name,'%$','')
- return (entries[name..'.'..instance.progname] or entries[name]) ~= nil
- else
- return false
- end
-end
-
--- {a,b,c,d}
--- a,b,c/{p,q,r},d
--- a,b,c/{p,q,r}/d/{x,y,z}//
--- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
--- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
--- a{b,c}{d,e}f
--- {a,b,c,d}
--- {a,b,c/{p,q,r},d}
--- {a,b,c/{p,q,r}/d/{x,y,z}//}
--- {a,b,c/{p,q/{x,y,z}},d/{p,q,r}}
--- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}}
--- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}
+ if v == nil then
+ v = ""
+ end
+ t[k] = v
+ return v
+ end)
--- this one is better and faster, but it took me a while to realize
--- that this kind of replacement is cleaner than messy parsing and
--- fuzzy concatenating we can probably gain a bit with selectively
--- applying lpeg, but experiments with lpeg parsing this proved not to
--- work that well; the parsing is ok, but dealing with the resulting
--- table is a pain because we need to work inside-out recursively
+ setmetatableindex(environment, function(t,k)
+ local v = osgetenv(k)
+ if v == nil then
+ v = variables[k]
+ end
+ if v ~= nil then
+ v = checkedvariable(v) or ""
+ end
+ v = resolvers.repath(v) -- for taco who has a : separated osfontdir
+ t[k] = v
+ return v
+ end)
-local function do_first(a,b)
- local t = { }
- for s in gmatch(b,"[^,]+") do t[#t+1] = a .. s end
- return "{" .. concat(t,",") .. "}"
-end
+ setmetatableindex(expansions, function(t,k)
+ local v = environment[k]
+ if type(v) == "string" then
+ v = lpegmatch(variableresolver,v)
+ v = lpegmatch(variablecleaner,v)
+ end
+ t[k] = v
+ return v
+ end)
-local function do_second(a,b)
- local t = { }
- for s in gmatch(a,"[^,]+") do t[#t+1] = s .. b end
- return "{" .. concat(t,",") .. "}"
-end
+ return newinstance
-local function do_both(a,b)
- local t = { }
- for sa in gmatch(a,"[^,]+") do
- for sb in gmatch(b,"[^,]+") do
- t[#t+1] = sa .. sb
- end
- end
- return "{" .. concat(t,",") .. "}"
end
-local function do_three(a,b,c)
- return a .. b.. c
+function resolvers.setinstance(someinstance) -- only one instance is active
+ instance = someinstance
+ resolvers.instance = someinstance
+ return someinstance
end
-local function splitpathexpr(str, t, validate)
- -- no need for further optimization as it is only called a
- -- few times, we can use lpeg for the sub
- if trace_expansions then
- logs.report("fileio","expanding variable '%s'",str)
- end
- t = t or { }
- str = gsub(str,",}",",@}")
- str = gsub(str,"{,","{@,")
- -- str = "@" .. str .. "@"
- local ok, done
- while true do
- done = false
- while true do
- str, ok = gsub(str,"([^{},]+){([^{}]+)}",do_first)
- if ok > 0 then done = true else break end
- end
- while true do
- str, ok = gsub(str,"{([^{}]+)}([^{},]+)",do_second)
- if ok > 0 then done = true else break end
- end
- while true do
- str, ok = gsub(str,"{([^{}]+)}{([^{}]+)}",do_both)
- if ok > 0 then done = true else break end
- end
- str, ok = gsub(str,"({[^{}]*){([^{}]+)}([^{}]*})",do_three)
- if ok > 0 then done = true end
- if not done then break end
- end
- str = gsub(str,"[{}]", "")
- str = gsub(str,"@","")
- if validate then
- for s in gmatch(str,"[^,]+") do
- s = validate(s)
- if s then t[#t+1] = s end
- end
- else
- for s in gmatch(str,"[^,]+") do
- t[#t+1] = s
- end
- end
- if trace_expansions then
- for k=1,#t do
- logs.report("fileio","% 4i: %s",k,t[k])
- end
- end
- return t
+function resolvers.reset()
+ return resolvers.setinstance(resolvers.newinstance())
end
-local function expanded_path_from_list(pathlist) -- maybe not a list, just a path
- -- a previous version fed back into pathlist
- local newlist, ok = { }, false
- for k=1,#pathlist do
- if find(pathlist[k],"[{}]") then
- ok = true
- break
- end
- end
- if ok then
- local function validate(s)
- s = file.collapse_path(s)
- return s ~= "" and not find(s,dummy_path_expr) and s
- end
- for k=1,#pathlist do
- splitpathexpr(pathlist[k],newlist,validate)
- end
- else
- for k=1,#pathlist do
- for p in gmatch(pathlist[k],"([^,]+)") do
- p = file.collapse_path(p)
- if p ~= "" then newlist[#newlist+1] = p end
- end
- end
- end
- return newlist
+local function reset_hashes()
+ instance.lists = { }
+ instance.found = { }
end
--- we follow a rather traditional approach:
---
--- (1) texmf.cnf given in TEXMFCNF
--- (2) texmf.cnf searched in default variable
---
--- also we now follow the stupid route: if not set then just assume *one*
--- cnf file under texmf (i.e. distribution)
+local slash = P("/")
-local args = environment and environment.original_arguments or arg -- this needs a cleanup
+local pathexpressionpattern = Cs (
+ Cc("^") * (
+ Cc("%") * S(".-")
+ + slash^2 * P(-1) / "/.*"
+ + slash^2 / "/.-/"
+ + (1-slash) * P(-1) * Cc("/")
+ + P(1)
+ )^1 * Cc("$") -- yes or no $
+)
-resolvers.ownbin = resolvers.ownbin or args[-2] or arg[-2] or args[-1] or arg[-1] or arg[0] or "luatex"
-resolvers.ownbin = gsub(resolvers.ownbin,"\\","/")
+local cache = { }
-function resolvers.getownpath()
- local ownpath = resolvers.ownpath or os.selfdir
- if not ownpath or ownpath == "" or ownpath == "unset" then
- ownpath = args[-1] or arg[-1]
- ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
- if not ownpath or ownpath == "" then
- ownpath = args[-0] or arg[-0]
- ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
- end
- local binary = resolvers.ownbin
- if not ownpath or ownpath == "" then
- ownpath = ownpath and file.dirname(binary)
- end
- if not ownpath or ownpath == "" then
- if os.binsuffix ~= "" then
- binary = file.replacesuffix(binary,os.binsuffix)
- end
- for p in gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
- local b = file.join(p,binary)
- if lfs.isfile(b) then
- -- we assume that after changing to the path the currentdir function
- -- resolves to the real location and use this side effect here; this
- -- trick is needed because on the mac installations use symlinks in the
- -- path instead of real locations
- local olddir = lfs.currentdir()
- if lfs.chdir(p) then
- local pp = lfs.currentdir()
- if trace_locating and p ~= pp then
- logs.report("fileio","following symlink '%s' to '%s'",p,pp)
- end
- ownpath = pp
- lfs.chdir(olddir)
- else
- if trace_locating then
- logs.report("fileio","unable to check path '%s'",p)
- end
- ownpath = p
- end
- break
- end
- end
- end
- if not ownpath or ownpath == "" then
- ownpath = "."
- logs.report("fileio","forcing fallback ownpath .")
- elseif trace_locating then
- logs.report("fileio","using ownpath '%s'",ownpath)
+local function makepathexpression(str)
+ if str == "." then
+ return "^%./$"
+ else
+ local c = cache[str]
+ if not c then
+ c = lpegmatch(pathexpressionpattern,str)
+ cache[str] = c
end
+ return c
end
- resolvers.ownpath = ownpath
- function resolvers.getownpath()
- return resolvers.ownpath
- end
- return ownpath
end
-local own_places = { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF" }
-
-local function identify_own()
- local ownpath = resolvers.getownpath() or dir.current()
- local ie = instance.environment
- if ownpath then
- if resolvers.env('SELFAUTOLOC') == "" then os.env['SELFAUTOLOC'] = file.collapse_path(ownpath) end
- if resolvers.env('SELFAUTODIR') == "" then os.env['SELFAUTODIR'] = file.collapse_path(ownpath .. "/..") end
- if resolvers.env('SELFAUTOPARENT') == "" then os.env['SELFAUTOPARENT'] = file.collapse_path(ownpath .. "/../..") end
- else
- logs.report("fileio","error: unable to locate ownpath")
- os.exit()
- end
- if resolvers.env('TEXMFCNF') == "" then os.env['TEXMFCNF'] = resolvers.cnfdefault end
- if resolvers.env('TEXOS') == "" then os.env['TEXOS'] = resolvers.env('SELFAUTODIR') end
- if resolvers.env('TEXROOT') == "" then os.env['TEXROOT'] = resolvers.env('SELFAUTOPARENT') end
+local function reportcriticalvariables()
if trace_locating then
- for i=1,#own_places do
- local v = own_places[i]
- logs.report("fileio","variable '%s' set to '%s'",v,resolvers.env(v) or "unknown")
+ for i=1,#resolvers.criticalvars do
+ local k = resolvers.criticalvars[i]
+ local v = resolvers.getenv(k) or "unknown" -- this one will not resolve !
+ report_resolving("variable '%s' set to '%s'",k,v)
end
+ report_resolving()
end
- identify_own = function() end
+ reportcriticalvariables = function() end
end
-function resolvers.identify_cnf()
- if #instance.cnffiles == 0 then
- -- fallback
- identify_own()
- -- the real search
- resolvers.expand_variables()
- local t = resolvers.split_path(resolvers.env('TEXMFCNF'))
- t = expanded_path_from_list(t)
- expand_vars(t) -- redundant
- local function locate(filename,list)
- for i=1,#t do
- local ti = t[i]
- local texmfcnf = file.collapse_path(file.join(ti,filename))
- if lfs.isfile(texmfcnf) then
- list[#list+1] = texmfcnf
+local function identify_configuration_files()
+ local specification = instance.specification
+ if #specification == 0 then
+ local cnfspec = getenv('TEXMFCNF')
+ if cnfspec == "" then
+ cnfspec = resolvers.luacnfspec
+ resolvers.luacnfstate = "default"
+ else
+ resolvers.luacnfstate = "environment"
+ end
+ reportcriticalvariables()
+ local cnfpaths = expandedpathfromlist(resolvers.splitpath(cnfspec))
+ local luacnfname = resolvers.luacnfname
+ for i=1,#cnfpaths do
+ local filename = collapsepath(filejoin(cnfpaths[i],luacnfname))
+ local realname = resolvers.resolve(filename)
+ if lfs.isfile(realname) then
+ specification[#specification+1] = filename
+ if trace_locating then
+ report_resolving("found configuration file '%s'",realname)
end
+ elseif trace_locating then
+ report_resolving("unknown configuration file '%s'",realname)
end
end
- locate(resolvers.luaname,instance.luafiles)
- locate(resolvers.cnfname,instance.cnffiles)
- end
-end
-
-local function load_cnf_file(fname)
- fname = resolvers.clean_path(fname)
- local lname = file.replacesuffix(fname,'lua')
- if lfs.isfile(lname) then
- local dname = file.dirname(fname) -- fname ?
- if not instance.configuration[dname] then
- resolvers.load_data(dname,'configuration',lname and file.basename(lname))
- instance.order[#instance.order+1] = instance.configuration[dname]
+ if trace_locating then
+ report_resolving()
end
- else
- f = io.open(fname)
- if f then
- if trace_locating then
- logs.report("fileio","loading configuration file %s", fname)
- end
- local line, data, n, k, v
- local dname = file.dirname(fname)
- if not instance.configuration[dname] then
- instance.configuration[dname] = { }
- instance.order[#instance.order+1] = instance.configuration[dname]
- end
- local data = instance.configuration[dname]
- while true do
- local line, n = f:read(), 0
- if line then
- while true do -- join lines
- line, n = gsub(line,"\\%s*$", "")
- if n > 0 then
- line = line .. f:read()
- else
- break
+ elseif trace_locating then
+ report_resolving("configuration files already identified")
+ end
+end
+
+local function load_configuration_files()
+ local specification = instance.specification
+ if #specification > 0 then
+ local luacnfname = resolvers.luacnfname
+ for i=1,#specification do
+ local filename = specification[i]
+ local pathname = filedirname(filename)
+ local filename = filejoin(pathname,luacnfname)
+ local realname = resolvers.resolve(filename) -- no shortcut
+ local blob = loadfile(realname)
+ if blob then
+ local setups = instance.setups
+ local data = blob()
+ data = data and data.content
+ if data then
+ if trace_locating then
+ report_resolving("loading configuration file '%s'",filename)
+ report_resolving()
+ end
+ local variables = data.variables or { }
+ local warning = false
+ for k, v in next, data do
+ local variant = type(v)
+ if variant == "table" then
+ initializesetter(filename,k,v)
+ elseif variables[k] == nil then
+ if trace_locating and not warning then
+ report_resolving("variables like '%s' in configuration file '%s' should move to the 'variables' subtable",
+ k,resolvers.resolve(filename))
+ warning = true
+ end
+ variables[k] = v
end
end
- if not find(line,"^[%%#]") then
- local l = gsub(line,"%s*%%.*$","")
- local k, v = match(l,"%s*(.-)%s*=%s*(.-)%s*$")
- if k and v and not data[k] then
- v = gsub(v,"[%%#].*",'')
- data[k] = gsub(v,"~","$HOME")
- instance.kpsevars[k] = true
+ setups[pathname] = variables
+ if resolvers.luacnfstate == "default" then
+ -- the following code is not tested
+ local cnfspec = variables["TEXMFCNF"]
+ if cnfspec then
+ if trace_locating then
+ report_resolving("reloading configuration due to TEXMF redefinition")
+ end
+ -- we push the value into the main environment (osenv) so
+ -- that it takes precedence over the default one and therefore
+ -- also over following definitions
+ resolvers.setenv('TEXMFCNF',cnfspec) -- resolves prefixes
+ -- we now identify and load the specified configuration files
+ instance.specification = { }
+ identify_configuration_files()
+ load_configuration_files()
+ -- we prevent further overload of the configuration variable
+ resolvers.luacnfstate = "configuration"
+ -- we quit the outer loop
+ break
end
end
- else
- break
- end
- end
- f:close()
- elseif trace_locating then
- logs.report("fileio","skipping configuration file '%s'", fname)
- end
- end
-end
-local function collapse_cnf_data() -- potential optimization: pass start index (setup and configuration are shared)
- local order = instance.order
- for i=1,#order do
- local c = order[i]
- for k,v in next, c do
- if not instance.variables[k] then
- if instance.environment[k] then
- instance.variables[k] = instance.environment[k]
else
- instance.kpsevars[k] = true
- instance.variables[k] = resolvers.bare_variable(v)
+ if trace_locating then
+ report_resolving("skipping configuration file '%s' (no content)",filename)
+ end
+ setups[pathname] = { }
+ instance.loaderror = true
end
+ elseif trace_locating then
+ report_resolving("skipping configuration file '%s' (no file)",filename)
end
- end
- end
-end
-
-function resolvers.load_cnf()
- local function loadoldconfigdata()
- local cnffiles = instance.cnffiles
- for i=1,#cnffiles do
- load_cnf_file(cnffiles[i])
- end
- end
- -- instance.cnffiles contain complete names now !
- -- we still use a funny mix of cnf and new but soon
- -- we will switch to lua exclusively as we only use
- -- the file to collect the tree roots
- if #instance.cnffiles == 0 then
- if trace_locating then
- logs.report("fileio","no cnf files found (TEXMFCNF may not be set/known)")
- end
- else
- local cnffiles = instance.cnffiles
- instance.rootpath = cnffiles[1]
- for k=1,#cnffiles do
- instance.cnffiles[k] = file.collapse_path(cnffiles[k])
- end
- for i=1,3 do
- instance.rootpath = file.dirname(instance.rootpath)
- end
- instance.rootpath = file.collapse_path(instance.rootpath)
- if instance.diskcache and not instance.renewcache then
- resolvers.loadoldconfig(instance.cnffiles)
+ instance.order[#instance.order+1] = instance.setups[pathname]
if instance.loaderror then
- loadoldconfigdata()
- resolvers.saveoldconfig()
- end
- else
- loadoldconfigdata()
- if instance.renewcache then
- resolvers.saveoldconfig()
+ break
end
end
- collapse_cnf_data()
- end
- check_configuration()
-end
-
-function resolvers.load_lua()
- if #instance.luafiles == 0 then
- -- yet harmless
- else
- instance.rootpath = instance.luafiles[1]
- local luafiles = instance.luafiles
- for k=1,#luafiles do
- instance.luafiles[k] = file.collapse_path(luafiles[k])
- end
- for i=1,3 do
- instance.rootpath = file.dirname(instance.rootpath)
- end
- instance.rootpath = file.collapse_path(instance.rootpath)
- resolvers.loadnewconfig()
- collapse_cnf_data()
- end
- check_configuration()
-end
-
--- database loading
-
-function resolvers.load_hash()
- resolvers.locatelists()
- if instance.diskcache and not instance.renewcache then
- resolvers.loadfiles()
- if instance.loaderror then
- resolvers.loadlists()
- resolvers.savefiles()
- end
- else
- resolvers.loadlists()
- if instance.renewcache then
- resolvers.savefiles()
- end
- end
-end
-
-function resolvers.append_hash(type,tag,name)
- if trace_locating then
- logs.report("fileio","hash '%s' appended",tag)
- end
- insert(instance.hashes, { ['type']=type, ['tag']=tag, ['name']=name } )
-end
-
-function resolvers.prepend_hash(type,tag,name)
- if trace_locating then
- logs.report("fileio","hash '%s' prepended",tag)
- end
- insert(instance.hashes, 1, { ['type']=type, ['tag']=tag, ['name']=name } )
-end
-
-function resolvers.extend_texmf_var(specification) -- crap, we could better prepend the hash
--- local t = resolvers.expanded_path_list('TEXMF') -- full expansion
- local t = resolvers.split_path(resolvers.env('TEXMF'))
- insert(t,1,specification)
- local newspec = concat(t,";")
- if instance.environment["TEXMF"] then
- instance.environment["TEXMF"] = newspec
- elseif instance.variables["TEXMF"] then
- instance.variables["TEXMF"] = newspec
- else
- -- weird
- end
- resolvers.expand_variables()
- reset_hashes()
-end
-
--- locators
-
-function resolvers.locatelists()
- local texmfpaths = resolvers.clean_path_list('TEXMF')
- for i=1,#texmfpaths do
- local path = texmfpaths[i]
- if trace_locating then
- logs.report("fileio","locating list of '%s'",path)
- end
- resolvers.locatedatabase(file.collapse_path(path))
- end
-end
-
-function resolvers.locatedatabase(specification)
- return resolvers.methodhandler('locators', specification)
-end
-
-function resolvers.locators.tex(specification)
- if specification and specification ~= '' and lfs.isdir(specification) then
- if trace_locating then
- logs.report("fileio","tex locator '%s' found",specification)
- end
- resolvers.append_hash('file',specification,filename)
elseif trace_locating then
- logs.report("fileio","tex locator '%s' not found",specification)
+ report_resolving("warning: no lua configuration files found")
end
end
--- hashers
-
-function resolvers.hashdatabase(tag,name)
- return resolvers.methodhandler('hashers',tag,name)
-end
+-- scheme magic ... database loading
-function resolvers.loadfiles()
- instance.loaderror = false
- instance.files = { }
+local function load_file_databases()
+ instance.loaderror, instance.files = false, allocate()
if not instance.renewcache then
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- resolvers.hashdatabase(hash.tag,hash.name)
+ resolvers.hashers.byscheme(hash.type,hash.name)
if instance.loaderror then break end
end
end
end
-function resolvers.hashers.tex(tag,name)
- resolvers.load_data(tag,'files')
-end
-
--- generators:
-
-function resolvers.loadlists()
- local hashes = instance.hashes
- for i=1,#hashes do
- resolvers.generatedatabase(hashes[i].tag)
- end
-end
-
-function resolvers.generatedatabase(specification)
- return resolvers.methodhandler('generators', specification)
-end
-
--- starting with . or .. etc or funny char
-
-local weird = lpeg.P(".")^1 + lpeg.anywhere(lpeg.S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
-
---~ local l_forbidden = lpeg.S("~`!#$%^&*()={}[]:;\"\'||\\/<>,?\n\r\t")
---~ local l_confusing = lpeg.P(" ")
---~ local l_character = lpeg.patterns.utf8
---~ local l_dangerous = lpeg.P(".")
-
---~ local l_normal = (l_character - l_forbidden - l_confusing - l_dangerous) * (l_character - l_forbidden - l_confusing^2)^0 * lpeg.P(-1)
---~ ----- l_normal = l_normal * lpeg.Cc(true) + lpeg.Cc(false)
-
---~ local function test(str)
---~ print(str,lpeg.match(l_normal,str))
---~ end
---~ test("ヒラギノ明朝 Pro W3")
---~ test("..ヒラギノ明朝 Pro W3")
---~ test(":ヒラギノ明朝 Pro W3;")
---~ test("ヒラギノ明朝 /Pro W3;")
---~ test("ヒラギノ明朝 Pro W3")
-
-function resolvers.generators.tex(specification)
- local tag = specification
- if trace_locating then
- logs.report("fileio","scanning path '%s'",specification)
- end
- instance.files[tag] = { }
- local files = instance.files[tag]
- local n, m, r = 0, 0, 0
- local spec = specification .. '/'
- local attributes = lfs.attributes
- local directory = lfs.dir
- local function action(path)
- local full
- if path then
- full = spec .. path .. '/'
- else
- full = spec
- end
- for name in directory(full) do
- if not lpegmatch(weird,name) then
- -- if lpegmatch(l_normal,name) then
- local mode = attributes(full..name,'mode')
- if mode == 'file' then
- if path then
- n = n + 1
- local f = files[name]
- if f then
- if type(f) == 'string' then
- files[name] = { f, path }
- else
- f[#f+1] = path
- end
- else -- probably unique anyway
- files[name] = path
- local lower = lower(name)
- if name ~= lower then
- files["remap:"..lower] = name
- r = r + 1
- end
- end
- end
- elseif mode == 'directory' then
- m = m + 1
- if path then
- action(path..'/'..name)
+local function locate_file_databases()
+ -- todo: cache:// and tree:// (runtime)
+ local texmfpaths = resolvers.expandedpathlist('TEXMF')
+ if #texmfpaths > 0 then
+ for i=1,#texmfpaths do
+ local path = collapsepath(texmfpaths[i])
+ local stripped = lpegmatch(inhibitstripper,path) -- the !! thing
+ if stripped ~= "" then
+ local runtime = stripped == path
+ path = resolvers.cleanpath(path)
+ local spec = resolvers.splitmethod(stripped)
+ if spec.scheme == "cache" or spec.scheme == "file" then
+ stripped = spec.path
+ elseif runtime and (spec.noscheme or spec.scheme == "file") then
+ stripped = "tree:///" .. stripped
+ end
+ if trace_locating then
+ if runtime then
+ report_resolving("locating list of '%s' (runtime)",path)
else
- action(name)
+ report_resolving("locating list of '%s' (cached)",path)
end
end
+ methodhandler('locators',stripped)
end
end
- end
- action()
- if trace_locating then
- logs.report("fileio","%s files found on %s directories with %s uppercase remappings",n,m,r)
+ if trace_locating then
+ report_resolving()
+ end
+ elseif trace_locating then
+ report_resolving("no texmf paths are defined (using TEXMF)")
end
end
--- savers, todo
-
-function resolvers.savefiles()
- resolvers.save_data('files')
+local function generate_file_databases()
+ local hashes = instance.hashes
+ for k=1,#hashes do
+ local hash = hashes[k]
+ methodhandler('generators',hash.name)
+ end
+ if trace_locating then
+ report_resolving()
+ end
end
--- A config (optionally) has the paths split in tables. Internally
--- we join them and split them after the expansion has taken place. This
--- is more convenient.
-
---~ local checkedsplit = string.checkedsplit
-
-local cache = { }
-
-local splitter = lpeg.Ct(lpeg.splitat(lpeg.S(os.type == "windows" and ";" or ":;")))
-
-local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
- local found = cache[str]
- if not found then
- if str == "" then
- found = { }
- else
- str = gsub(str,"\\","/")
---~ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
-local split = lpegmatch(splitter,str)
- found = { }
- for i=1,#split do
- local s = split[i]
- if not find(s,"^{*unset}*") then
- found[#found+1] = s
- end
- end
- if trace_expansions then
- logs.report("fileio","splitting path specification '%s'",str)
- for k=1,#found do
- logs.report("fileio","% 4i: %s",k,found[k])
- end
+local function save_file_databases() -- will become cachers
+ for i=1,#instance.hashes do
+ local hash = instance.hashes[i]
+ local cachename = hash.name
+ if hash.cache then
+ local content = instance.files[cachename]
+ caches.collapsecontent(content)
+ if trace_locating then
+ report_resolving("saving tree '%s'",cachename)
end
- cache[str] = found
+ caches.savecontent(cachename,"files",content)
+ elseif trace_locating then
+ report_resolving("not saving runtime tree '%s'",cachename)
end
end
- return found
end
-resolvers.split_kpse_path = split_kpse_path
-
-function resolvers.splitconfig()
- for i=1,#instance do
- local c = instance[i]
- for k,v in next, c do
- if type(v) == 'string' then
- local t = split_kpse_path(v)
- if #t > 1 then
- c[k] = t
- end
- end
+local function load_databases()
+ locate_file_databases()
+ if instance.diskcache and not instance.renewcache then
+ load_file_databases()
+ if instance.loaderror then
+ generate_file_databases()
+ save_file_databases()
+ end
+ else
+ generate_file_databases()
+ if instance.renewcache then
+ save_file_databases()
end
end
end
-function resolvers.joinconfig()
- local order = instance.order
- for i=1,#order do
- local c = order[i]
- for k,v in next, c do -- indexed?
- if type(v) == 'table' then
- c[k] = file.join_path(v)
- end
+function resolvers.appendhash(type,name,cache)
+ -- safeguard ... tricky as it's actually a bug when seen twice
+ if not instance.hashed[name] then
+ if trace_locating then
+ report_resolving("hash '%s' appended",name)
end
+ insert(instance.hashes, { type = type, name = name, cache = cache } )
+ instance.hashed[name] = cache
end
end
-function resolvers.split_path(str)
- if type(str) == 'table' then
- return str
- else
- return split_kpse_path(str)
+function resolvers.prependhash(type,name,cache)
+ -- safeguard ... tricky as it's actually a bug when seen twice
+ if not instance.hashed[name] then
+ if trace_locating then
+ report_resolving("hash '%s' prepended",name)
+ end
+ insert(instance.hashes, 1, { type = type, name = name, cache = cache } )
+ instance.hashed[name] = cache
end
end
-function resolvers.join_path(str)
- if type(str) == 'table' then
- return file.join_path(str)
+function resolvers.extendtexmfvariable(specification) -- crap, we could better prepend the hash
+ local t = resolvers.splitpath(getenv('TEXMF'))
+ insert(t,1,specification)
+ local newspec = concat(t,";")
+ if instance.environment["TEXMF"] then
+ instance.environment["TEXMF"] = newspec
+ elseif instance.variables["TEXMF"] then
+ instance.variables["TEXMF"] = newspec
else
- return str
+ -- weird
end
+ reset_hashes()
end
function resolvers.splitexpansions()
local ie = instance.expansions
for k,v in next, ie do
- local t, h, p = { }, { }, split_kpse_path(v)
+ local t, tn, h, p = { }, 0, { }, splitconfigurationpath(v)
for kk=1,#p do
local vv = p[kk]
if vv ~= "" and not h[vv] then
- t[#t+1] = vv
+ tn = tn + 1
+ t[tn] = vv
h[vv] = true
end
end
@@ -9184,343 +11600,92 @@ end
-- end of split/join code
-function resolvers.saveoldconfig()
- resolvers.splitconfig()
- resolvers.save_data('configuration')
- resolvers.joinconfig()
-end
-
-resolvers.configbanner = [[
--- This is a Luatex configuration file created by 'luatools.lua' or
--- 'luatex.exe' directly. For comment, suggestions and questions you can
--- contact the ConTeXt Development Team. This configuration file is
--- not copyrighted. [HH & TH]
-]]
-
-function resolvers.serialize(files)
- -- This version is somewhat optimized for the kind of
- -- tables that we deal with, so it's much faster than
- -- the generic serializer. This makes sense because
- -- luatools and mtxtools are called frequently. Okay,
- -- we pay a small price for properly tabbed tables.
- local t = { }
- local function dump(k,v,m) -- could be moved inline
- if type(v) == 'string' then
- return m .. "['" .. k .. "']='" .. v .. "',"
- elseif #v == 1 then
- return m .. "['" .. k .. "']='" .. v[1] .. "',"
- else
- return m .. "['" .. k .. "']={'" .. concat(v,"','").. "'},"
- end
- end
- t[#t+1] = "return {"
- if instance.sortdata then
- local sortedfiles = sortedkeys(files)
- for i=1,#sortedfiles do
- local k = sortedfiles[i]
- local fk = files[k]
- if type(fk) == 'table' then
- t[#t+1] = "\t['" .. k .. "']={"
- local sortedfk = sortedkeys(fk)
- for j=1,#sortedfk do
- local kk = sortedfk[j]
- t[#t+1] = dump(kk,fk[kk],"\t\t")
- end
- t[#t+1] = "\t},"
- else
- t[#t+1] = dump(k,fk,"\t")
- end
- end
- else
- for k, v in next, files do
- if type(v) == 'table' then
- t[#t+1] = "\t['" .. k .. "']={"
- for kk,vv in next, v do
- t[#t+1] = dump(kk,vv,"\t\t")
- end
- t[#t+1] = "\t},"
- else
- t[#t+1] = dump(k,v,"\t")
- end
- end
- end
- t[#t+1] = "}"
- return concat(t,"\n")
-end
-
-local data_state = { }
+-- we used to have 'files' and 'configurations' so therefore the following
+-- shared function
-function resolvers.data_state()
- return data_state or { }
-end
-
-function resolvers.save_data(dataname, makename) -- untested without cache overload
- for cachename, files in next, instance[dataname] do
- local name = (makename or file.join)(cachename,dataname)
- local luaname, lucname = name .. ".lua", name .. ".luc"
- if trace_locating then
- logs.report("fileio","preparing '%s' for '%s'",dataname,cachename)
- end
- for k, v in next, files do
- if type(v) == "table" and #v == 1 then
- files[k] = v[1]
- end
- end
- local data = {
- type = dataname,
- root = cachename,
- version = resolvers.cacheversion,
- date = os.date("%Y-%m-%d"),
- time = os.date("%H:%M:%S"),
- content = files,
- uuid = os.uuid(),
- }
- local ok = io.savedata(luaname,resolvers.serialize(data))
- if ok then
- if trace_locating then
- logs.report("fileio","'%s' saved in '%s'",dataname,luaname)
- end
- if utils.lua.compile(luaname,lucname,false,true) then -- no cleanup but strip
- if trace_locating then
- logs.report("fileio","'%s' compiled to '%s'",dataname,lucname)
- end
- else
- if trace_locating then
- logs.report("fileio","compiling failed for '%s', deleting file '%s'",dataname,lucname)
- end
- os.remove(lucname)
- end
- elseif trace_locating then
- logs.report("fileio","unable to save '%s' in '%s' (access error)",dataname,luaname)
- end
- end
-end
-
-function resolvers.load_data(pathname,dataname,filename,makename) -- untested without cache overload
- filename = ((not filename or (filename == "")) and dataname) or filename
- filename = (makename and makename(dataname,filename)) or file.join(pathname,filename)
- local blob = loadfile(filename .. ".luc") or loadfile(filename .. ".lua")
- if blob then
- local data = blob()
- if data and data.content and data.type == dataname and data.version == resolvers.cacheversion then
- data_state[#data_state+1] = data.uuid
- if trace_locating then
- logs.report("fileio","loading '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
- instance[dataname][pathname] = data.content
- else
- if trace_locating then
- logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
- instance[dataname][pathname] = { }
- instance.loaderror = true
- end
- elseif trace_locating then
- logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
-end
-
--- some day i'll use the nested approach, but not yet (actually we even drop
--- engine/progname support since we have only luatex now)
---
--- first texmfcnf.lua files are located, next the cached texmf.cnf files
---
--- return {
--- TEXMFBOGUS = 'effe checken of dit werkt',
--- }
-
-function resolvers.resetconfig()
- identify_own()
- instance.configuration, instance.setup, instance.order, instance.loaderror = { }, { }, { }, false
-end
-
-function resolvers.loadnewconfig()
- local luafiles = instance.luafiles
- for i=1,#luafiles do
- local cnf = luafiles[i]
- local pathname = file.dirname(cnf)
- local filename = file.join(pathname,resolvers.luaname)
- local blob = loadfile(filename)
- if blob then
- local data = blob()
- if data then
- if trace_locating then
- logs.report("fileio","loading configuration file '%s'",filename)
- end
- if true then
- -- flatten to variable.progname
- local t = { }
- for k, v in next, data do -- v = progname
- if type(v) == "string" then
- t[k] = v
- else
- for kk, vv in next, v do -- vv = variable
- if type(vv) == "string" then
- t[vv.."."..v] = kk
- end
- end
- end
- end
- instance['setup'][pathname] = t
- else
- instance['setup'][pathname] = data
- end
- else
- if trace_locating then
- logs.report("fileio","skipping configuration file '%s'",filename)
- end
- instance['setup'][pathname] = { }
- instance.loaderror = true
- end
- elseif trace_locating then
- logs.report("fileio","skipping configuration file '%s'",filename)
- end
- instance.order[#instance.order+1] = instance.setup[pathname]
- if instance.loaderror then break end
- end
-end
-
-function resolvers.loadoldconfig()
- if not instance.renewcache then
- local cnffiles = instance.cnffiles
- for i=1,#cnffiles do
- local cnf = cnffiles[i]
- local dname = file.dirname(cnf)
- resolvers.load_data(dname,'configuration')
- instance.order[#instance.order+1] = instance.configuration[dname]
- if instance.loaderror then break end
- end
- end
- resolvers.joinconfig()
-end
-
-function resolvers.expand_variables()
- local expansions, environment, variables = { }, instance.environment, instance.variables
- local env = resolvers.env
- instance.expansions = expansions
- local engine, progname = instance.engine, instance.progname
- if type(engine) ~= "string" then instance.engine, engine = "", "" end
- if type(progname) ~= "string" then instance.progname, progname = "", "" end
- if engine ~= "" then environment['engine'] = engine end
- if progname ~= "" then environment['progname'] = progname end
- for k,v in next, environment do
- local a, b = match(k,"^(%a+)%_(.*)%s*$")
- if a and b then
- expansions[a..'.'..b] = v
- else
- expansions[k] = v
- end
- end
- for k,v in next, environment do -- move environment to expansions
- if not expansions[k] then expansions[k] = v end
- end
- for k,v in next, variables do -- move variables to expansions
- if not expansions[k] then expansions[k] = v end
- end
- local busy = false
- local function resolve(a)
- busy = true
- return expansions[a] or env(a)
- end
- while true do
- busy = false
- for k,v in next, expansions do
- local s, n = gsub(v,"%$([%a%d%_%-]+)",resolve)
- local s, m = gsub(s,"%$%{([%a%d%_%-]+)%}",resolve)
- if n > 0 or m > 0 then
- expansions[k]= s
- end
- end
- if not busy then break end
- end
- for k,v in next, expansions do
- expansions[k] = gsub(v,"\\", '/')
- end
+function resolvers.datastate()
+ return caches.contentstate()
end
function resolvers.variable(name)
- return entry(instance.variables,name)
+ local name = name and lpegmatch(dollarstripper,name)
+ local result = name and instance.variables[name]
+ return result ~= nil and result or ""
end
function resolvers.expansion(name)
- return entry(instance.expansions,name)
-end
-
-function resolvers.is_variable(name)
- return is_entry(instance.variables,name)
-end
-
-function resolvers.is_expansion(name)
- return is_entry(instance.expansions,name)
+ local name = name and lpegmatch(dollarstripper,name)
+ local result = name and instance.expansions[name]
+ return result ~= nil and result or ""
end
-function resolvers.unexpanded_path_list(str)
+function resolvers.unexpandedpathlist(str)
local pth = resolvers.variable(str)
- local lst = resolvers.split_path(pth)
- return expanded_path_from_list(lst)
+ local lst = resolvers.splitpath(pth)
+ return expandedpathfromlist(lst)
end
-function resolvers.unexpanded_path(str)
- return file.join_path(resolvers.unexpanded_path_list(str))
+function resolvers.unexpandedpath(str)
+ return joinpath(resolvers.unexpandedpathlist(str))
end
-do -- no longer needed
-
- local done = { }
+local done = { }
- function resolvers.reset_extra_path()
- local ep = instance.extra_paths
- if not ep then
- ep, done = { }, { }
- instance.extra_paths = ep
- elseif #ep > 0 then
- instance.lists, done = { }, { }
- end
+function resolvers.resetextrapath()
+ local ep = instance.extra_paths
+ if not ep then
+ ep, done = { }, { }
+ instance.extra_paths = ep
+ elseif #ep > 0 then
+ instance.lists, done = { }, { }
end
+end
- function resolvers.register_extra_path(paths,subpaths)
- local ep = instance.extra_paths or { }
- local n = #ep
- if paths and paths ~= "" then
- if subpaths and subpaths ~= "" then
- for p in gmatch(paths,"[^,]+") do
- -- we gmatch each step again, not that fast, but used seldom
- for s in gmatch(subpaths,"[^,]+") do
- local ps = p .. "/" .. s
- if not done[ps] then
- ep[#ep+1] = resolvers.clean_path(ps)
- done[ps] = true
- end
- end
- end
- else
- for p in gmatch(paths,"[^,]+") do
- if not done[p] then
- ep[#ep+1] = resolvers.clean_path(p)
- done[p] = true
- end
- end
- end
- elseif subpaths and subpaths ~= "" then
- for i=1,n do
+function resolvers.registerextrapath(paths,subpaths)
+ local ep = instance.extra_paths or { }
+ local oldn = #ep
+ local newn = oldn
+ if paths and paths ~= "" then
+ if subpaths and subpaths ~= "" then
+ for p in gmatch(paths,"[^,]+") do
-- we gmatch each step again, not that fast, but used seldom
for s in gmatch(subpaths,"[^,]+") do
- local ps = ep[i] .. "/" .. s
+ local ps = p .. "/" .. s
if not done[ps] then
- ep[#ep+1] = resolvers.clean_path(ps)
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(ps)
done[ps] = true
end
end
end
+ else
+ for p in gmatch(paths,"[^,]+") do
+ if not done[p] then
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(p)
+ done[p] = true
+ end
+ end
end
- if #ep > 0 then
- instance.extra_paths = ep -- register paths
- end
- if #ep > n then
- instance.lists = { } -- erase the cache
+ elseif subpaths and subpaths ~= "" then
+ for i=1,oldn do
+ -- we gmatch each step again, not that fast, but used seldom
+ for s in gmatch(subpaths,"[^,]+") do
+ local ps = ep[i] .. "/" .. s
+ if not done[ps] then
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(ps)
+ done[ps] = true
+ end
+ end
end
end
-
+ if newn > 0 then
+ instance.extra_paths = ep -- register paths
+ end
+ if newn > oldn then
+ instance.lists = { } -- erase the cache
+ end
end
local function made_list(instance,list)
@@ -9528,14 +11693,15 @@ local function made_list(instance,list)
if not ep or #ep == 0 then
return list
else
- local done, new = { }, { }
+ 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
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
else
break
end
@@ -9546,7 +11712,8 @@ local function made_list(instance,list)
local v = ep[k]
if not done[v] then
done[v] = true
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
end
end
-- next the formal paths
@@ -9554,118 +11721,95 @@ local function made_list(instance,list)
local v = list[k]
if not done[v] then
done[v] = true
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
end
end
return new
end
end
-function resolvers.clean_path_list(str)
- local t = resolvers.expanded_path_list(str)
+function resolvers.cleanpathlist(str)
+ local t = resolvers.expandedpathlist(str)
if t then
for i=1,#t do
- t[i] = file.collapse_path(resolvers.clean_path(t[i]))
+ t[i] = collapsepath(resolvers.cleanpath(t[i]))
end
end
return t
end
-function resolvers.expand_path(str)
- return file.join_path(resolvers.expanded_path_list(str))
+function resolvers.expandpath(str)
+ return joinpath(resolvers.expandedpathlist(str))
end
-function resolvers.expanded_path_list(str)
+function resolvers.expandedpathlist(str)
if not str then
- return ep or { } -- ep ?
+ return { }
elseif instance.savelists then
- -- engine+progname hash
- str = gsub(str,"%$","")
+ str = lpegmatch(dollarstripper,str)
if not instance.lists[str] then -- cached
- local lst = made_list(instance,resolvers.split_path(resolvers.expansion(str)))
- instance.lists[str] = expanded_path_from_list(lst)
+ local lst = made_list(instance,resolvers.splitpath(resolvers.expansion(str)))
+ instance.lists[str] = expandedpathfromlist(lst)
end
return instance.lists[str]
else
- local lst = resolvers.split_path(resolvers.expansion(str))
- return made_list(instance,expanded_path_from_list(lst))
- end
-end
-
-function resolvers.expanded_path_list_from_var(str) -- brrr
- local tmp = resolvers.var_of_format_or_suffix(gsub(str,"%$",""))
- if tmp ~= "" then
- return resolvers.expanded_path_list(tmp)
- else
- return resolvers.expanded_path_list(str)
+ local lst = resolvers.splitpath(resolvers.expansion(str))
+ return made_list(instance,expandedpathfromlist(lst))
end
end
-function resolvers.expand_path_from_var(str)
- return file.join_path(resolvers.expanded_path_list_from_var(str))
+function resolvers.expandedpathlistfromvariable(str) -- brrr
+ str = lpegmatch(dollarstripper,str)
+ local tmp = resolvers.variableofformatorsuffix(str)
+ return resolvers.expandedpathlist(tmp ~= "" and tmp or str)
end
-function resolvers.format_of_var(str)
- return formats[str] or formats[alternatives[str]] or ''
-end
-function resolvers.format_of_suffix(str)
- return suffixmap[file.extname(str)] or 'tex'
+function resolvers.expandpathfromvariable(str)
+ return joinpath(resolvers.expandedpathlistfromvariable(str))
end
-function resolvers.variable_of_format(str)
- return formats[str] or formats[alternatives[str]] or ''
+function resolvers.expandbraces(str) -- output variable and brace expansion of STRING
+ local ori = resolvers.variable(str)
+ local pth = expandedpathfromlist(resolvers.splitpath(ori))
+ return joinpath(pth)
end
-function resolvers.var_of_format_or_suffix(str)
- local v = formats[str]
- if v then
- return v
- end
- v = formats[alternatives[str]]
- if v then
- return v
- end
- v = suffixmap[file.extname(str)]
- if v then
- return formats[isf]
+function resolvers.registerfilehash(name,content,someerror)
+ if content then
+ instance.files[name] = content
+ else
+ instance.files[name] = { }
+ if somerror == true then -- can be unset
+ instance.loaderror = someerror
+ end
end
- return ''
-end
-
-function resolvers.expand_braces(str) -- output variable and brace expansion of STRING
- local ori = resolvers.variable(str)
- local pth = expanded_path_from_list(resolvers.split_path(ori))
- return file.join_path(pth)
end
-resolvers.isreadable = { }
-
-function resolvers.isreadable.file(name)
- local readable = lfs.isfile(name) -- brrr
+local function isreadable(name)
+ local readable = lfs.isfile(name) -- not file.is_readable(name) asit can be a dir
if trace_detail then
if readable then
- logs.report("fileio","file '%s' is readable",name)
+ report_resolving("file '%s' is readable",name)
else
- logs.report("fileio","file '%s' is not readable", name)
+ report_resolving("file '%s' is not readable", name)
end
end
return readable
end
-resolvers.isreadable.tex = resolvers.isreadable.file
-
-- name
-- name/name
local function collect_files(names)
- local filelist = { }
+ local filelist, noffiles = { }, 0
for k=1,#names do
local fname = names[k]
if trace_detail then
- logs.report("fileio","checking name '%s'",fname)
+ report_resolving("checking name '%s'",fname)
end
- local bname = file.basename(fname)
- local dname = file.dirname(fname)
+ local bname = filebasename(fname)
+ local dname = filedirname(fname)
if dname == "" or find(dname,"^%.") then
dname = false
else
@@ -9674,11 +11818,11 @@ local function collect_files(names)
local hashes = instance.hashes
for h=1,#hashes do
local hash = hashes[h]
- local blobpath = hash.tag
+ local blobpath = hash.name
local files = blobpath and instance.files[blobpath]
if files then
if trace_detail then
- logs.report("fileio","deep checking '%s' (%s)",blobpath,bname)
+ report_resolving("deep checking '%s' (%s)",blobpath,bname)
end
local blobfile = files[bname]
if not blobfile then
@@ -9690,62 +11834,51 @@ local function collect_files(names)
end
end
if blobfile then
+ local blobroot = files.__path__ or blobpath
if type(blobfile) == 'string' then
if not dname or find(blobfile,dname) then
- filelist[#filelist+1] = {
- hash.type,
- file.join(blobpath,blobfile,bname), -- search
- resolvers.concatinators[hash.type](blobpath,blobfile,bname) -- result
- }
+ 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 '%s', search '%s', result '%s'",variant,search,result)
+ end
+ noffiles = noffiles + 1
+ filelist[noffiles] = { variant, search, result }
end
else
for kk=1,#blobfile do
local vv = blobfile[kk]
if not dname or find(vv,dname) then
- filelist[#filelist+1] = {
- hash.type,
- file.join(blobpath,vv,bname), -- search
- resolvers.concatinators[hash.type](blobpath,vv,bname) -- result
- }
+ 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 '%s', search '%s', result '%s'",variant,search,result)
+ end
+ noffiles = noffiles + 1
+ filelist[noffiles] = { variant, search, result }
end
end
end
end
elseif trace_locating then
- logs.report("fileio","no match in '%s' (%s)",blobpath,bname)
+ report_resolving("no match in '%s' (%s)",blobpath,bname)
end
end
end
- if #filelist > 0 then
- return filelist
- else
- return nil
- end
+ return noffiles > 0 and filelist or nil
end
-function resolvers.suffix_of_format(str)
- if suffixes[str] then
- return suffixes[str][1]
- else
- return ""
- end
-end
-
-function resolvers.suffixes_of_format(str)
- if suffixes[str] then
- return suffixes[str]
- else
- return {}
- end
-end
-
-function resolvers.register_in_trees(name)
+function resolvers.registerintrees(name)
if not find(name,"^%.") then
instance.foundintrees[name] = (instance.foundintrees[name] or 0) + 1 -- maybe only one
end
end
--- split the next one up for readability (bu this module needs a cleanup anyway)
+-- split the next one up for readability (but this module needs a cleanup anyway)
local function can_be_dir(name) -- can become local
local fakepaths = instance.fakepaths
@@ -9756,61 +11889,62 @@ local function can_be_dir(name) -- can become local
fakepaths[name] = 2 -- no directory
end
end
- return (fakepaths[name] == 1)
+ return fakepaths[name] == 1
end
-local function collect_instance_files(filename,collected) -- todo : plugin (scanners, checkers etc)
- local result = collected or { }
+local preparetreepattern = Cs((P(".")/"%%." + P("-")/"%%-" + P(1))^0 * Cc("$"))
+
+-- this one is split in smaller functions but it needs testing
+
+local function collect_instance_files(filename,askedformat,allresults) -- todo : plugin (scanners, checkers etc)
+ local result = { }
local stamp = nil
- filename = file.collapse_path(filename)
+ askedformat = askedformat or ""
+ filename = collapsepath(filename)
-- speed up / beware: format problem
- if instance.remember then
- stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format
+ if instance.remember and not allresults then
+ stamp = filename .. "--" .. askedformat
if instance.found[stamp] then
if trace_locating then
- logs.report("fileio","remembering file '%s'",filename)
+ report_resolving("remembered file '%s'",filename)
end
+ resolvers.registerintrees(filename) -- for tracing used files
return instance.found[stamp]
end
end
- if not dangerous[instance.format or "?"] then
- if resolvers.isreadable.file(filename) then
+ if not dangerous[askedformat] then
+ if isreadable(filename) then
if trace_detail then
- logs.report("fileio","file '%s' found directly",filename)
+ report_resolving("file '%s' found directly",filename)
+ end
+ if stamp then
+ instance.found[stamp] = { filename }
end
- instance.found[stamp] = { filename }
return { filename }
end
end
if find(filename,'%*') then
if trace_locating then
- logs.report("fileio","checking wildcard '%s'", filename)
+ report_resolving("checking wildcard '%s'", filename)
end
- result = resolvers.find_wildcard_files(filename)
+ result = resolvers.findwildcardfiles(filename) -- we can use th elocal
elseif file.is_qualified_path(filename) then
- if resolvers.isreadable.file(filename) then
+ if isreadable(filename) then
if trace_locating then
- logs.report("fileio","qualified name '%s'", filename)
+ report_resolving("qualified name '%s'", filename)
end
result = { filename }
else
- local forcedname, ok, suffix = "", false, file.extname(filename)
+ local forcedname, ok, suffix = "", false, fileextname(filename)
if suffix == "" then -- why
- if instance.format == "" then
- forcedname = filename .. ".tex"
- if resolvers.isreadable.file(forcedname) then
- if trace_locating then
- logs.report("fileio","no suffix, forcing standard filetype 'tex'")
- end
- result, ok = { forcedname }, true
- end
- else
- local suffixes = resolvers.suffixes_of_format(instance.format)
- for _, s in next, suffixes do
+ local format_suffixes = askedformat == "" and resolvers.defaultsuffixes or suffixes[askedformat]
+ if format_suffixes then
+ for i=1,#format_suffixes do
+ local s = format_suffixes[i]
forcedname = filename .. "." .. s
- if resolvers.isreadable.file(forcedname) then
+ if isreadable(forcedname) then
if trace_locating then
- logs.report("fileio","no suffix, forcing format filetype '%s'", s)
+ report_resolving("no suffix, forcing format filetype '%s'", s)
end
result, ok = { forcedname }, true
break
@@ -9821,23 +11955,24 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
if not ok and suffix ~= "" then
-- try to find in tree (no suffix manipulation), here we search for the
-- matching last part of the name
- local basename = file.basename(filename)
- local pattern = gsub(filename .. "$","([%.%-])","%%%1")
- local savedformat = instance.format
+ local basename = filebasename(filename)
+ local pattern = lpegmatch(preparetreepattern,filename)
+ -- messy .. to be sorted out
+ local savedformat = askedformat
local format = savedformat or ""
if format == "" then
- instance.format = resolvers.format_of_suffix(suffix)
+ askedformat = resolvers.formatofsuffix(suffix)
end
if not format then
- instance.format = "othertextfiles" -- kind of everything, maybe texinput is better
+ askedformat = "othertextfiles" -- kind of everything, maybe texinput is better
end
--
if basename ~= filename then
- local resolved = collect_instance_files(basename)
- if #result == 0 then
+ local resolved = collect_instance_files(basename,askedformat,allresults)
+ if #result == 0 then -- shouldn't this be resolved ?
local lowered = lower(basename)
if filename ~= lowered then
- resolved = collect_instance_files(lowered)
+ resolved = collect_instance_files(lowered,askedformat,allresults)
end
end
resolvers.format = savedformat
@@ -9862,57 +11997,60 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
-- end
end
if not ok and trace_locating then
- logs.report("fileio","qualified name '%s'", filename)
+ report_resolving("qualified name '%s'", filename)
end
end
else
-- search spec
- local filetype, extra, done, wantedfiles, ext = '', nil, false, { }, file.extname(filename)
- if ext == "" then
- if not instance.force_suffixes then
- wantedfiles[#wantedfiles+1] = filename
- end
- else
- wantedfiles[#wantedfiles+1] = filename
- end
- if instance.format == "" then
- if ext == "" then
- local forcedname = filename .. '.tex'
- wantedfiles[#wantedfiles+1] = forcedname
- filetype = resolvers.format_of_suffix(forcedname)
- if trace_locating then
- logs.report("fileio","forcing filetype '%s'",filetype)
+ local filetype, done, wantedfiles, ext = '', false, { }, fileextname(filename)
+ -- -- tricky as filename can be bla.1.2.3
+ -- if not suffixmap[ext] then --- probably needs to be done elsewhere too
+ -- wantedfiles[#wantedfiles+1] = filename
+ -- end
+ wantedfiles[#wantedfiles+1] = filename
+ if askedformat == "" then
+ if ext == "" or not suffixmap[ext] then
+ local defaultsuffixes = resolvers.defaultsuffixes
+ for i=1,#defaultsuffixes do
+ local forcedname = filename .. '.' .. defaultsuffixes[i]
+ wantedfiles[#wantedfiles+1] = forcedname
+ filetype = resolvers.formatofsuffix(forcedname)
+ if trace_locating then
+ report_resolving("forcing filetype '%s'",filetype)
+ end
end
else
- filetype = resolvers.format_of_suffix(filename)
+ filetype = resolvers.formatofsuffix(filename)
if trace_locating then
- logs.report("fileio","using suffix based filetype '%s'",filetype)
+ report_resolving("using suffix based filetype '%s'",filetype)
end
end
else
- if ext == "" then
- local suffixes = resolvers.suffixes_of_format(instance.format)
- for _, s in next, suffixes do
- wantedfiles[#wantedfiles+1] = filename .. "." .. s
+ if ext == "" or not suffixmap[ext] then
+ local format_suffixes = suffixes[askedformat]
+ if format_suffixes then
+ for i=1,#format_suffixes do
+ wantedfiles[#wantedfiles+1] = filename .. "." .. format_suffixes[i]
+ end
end
end
- filetype = instance.format
+ filetype = askedformat
if trace_locating then
- logs.report("fileio","using given filetype '%s'",filetype)
+ report_resolving("using given filetype '%s'",filetype)
end
end
- local typespec = resolvers.variable_of_format(filetype)
- local pathlist = resolvers.expanded_path_list(typespec)
+ local typespec = resolvers.variableofformat(filetype)
+ local pathlist = resolvers.expandedpathlist(typespec)
if not pathlist or #pathlist == 0 then
-- no pathlist, access check only / todo == wildcard
if trace_detail then
- logs.report("fileio","checking filename '%s', filetype '%s', wanted files '%s'",filename, filetype or '?',concat(wantedfiles," | "))
+ report_resolving("checking filename '%s', filetype '%s', wanted files '%s'",filename, filetype or '?',concat(wantedfiles," | "))
end
for k=1,#wantedfiles do
local fname = wantedfiles[k]
- if fname and resolvers.isreadable.file(fname) then
+ if fname and isreadable(fname) then
filename, done = fname, true
- result[#result+1] = file.join('.',fname)
+ result[#result+1] = filejoin('.',fname)
break
end
end
@@ -9920,8 +12058,8 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
local filelist = collect_files(wantedfiles)
local fl = filelist and filelist[1]
if fl then
- filename = fl[3]
- result[#result+1] = filename
+ filename = fl[3] -- not local?
+ result[#result+1] = resolvers.resolve(filename)
done = true
end
else
@@ -9930,76 +12068,65 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
local dirlist = { }
if filelist then
for i=1,#filelist do
- dirlist[i] = file.dirname(filelist[i][2]) .. "/"
+ dirlist[i] = filedirname(filelist[i][3]) .. "/" -- was [2] .. gamble
end
end
if trace_detail then
- logs.report("fileio","checking filename '%s'",filename)
+ report_resolving("checking filename '%s'",filename)
end
- -- a bit messy ... esp the doscan setting here
- local doscan
for k=1,#pathlist do
local path = pathlist[k]
- if find(path,"^!!") then doscan = false else doscan = true end
- local pathname = gsub(path,"^!+", '')
+ local pathname = lpegmatch(inhibitstripper,path)
+ local doscan = path == pathname -- no ^!!
done = false
-- using file list
if filelist then
- local expression
-- compare list entries with permitted pattern -- /xx /xx//
- if not find(pathname,"/$") then
- expression = pathname .. "/"
- else
- expression = pathname
- end
- expression = gsub(expression,"([%-%.])","%%%1") -- this also influences
- expression = gsub(expression,"//+$", '/.*') -- later usage of pathname
- expression = gsub(expression,"//", '/.-/') -- not ok for /// but harmless
- expression = "^" .. expression .. "$"
+ local expression = makepathexpression(pathname)
if trace_detail then
- logs.report("fileio","using pattern '%s' for path '%s'",expression,pathname)
+ report_resolving("using pattern '%s' for path '%s'",expression,pathname)
end
for k=1,#filelist do
local fl = filelist[k]
local f = fl[2]
local d = dirlist[k]
if find(d,expression) then
- --- todo, test for readable
- result[#result+1] = fl[3]
- resolvers.register_in_trees(f) -- for tracing used files
+ -- todo, test for readable
+ result[#result+1] = resolvers.resolve(fl[3]) -- no shortcut
done = true
- if instance.allresults then
+ if allresults then
if trace_detail then
- logs.report("fileio","match in hash for file '%s' on path '%s', continue scanning",f,d)
+ report_resolving("match to '%s' in hash for file '%s' and path '%s', continue scanning",expression,f,d)
end
else
if trace_detail then
- logs.report("fileio","match in hash for file '%s' on path '%s', quit scanning",f,d)
+ report_resolving("match to '%s' in hash for file '%s' and path '%s', quit scanning",expression,f,d)
end
break
end
elseif trace_detail then
- logs.report("fileio","no match in hash for file '%s' on path '%s'",f,d)
+ report_resolving("no match to '%s' in hash for file '%s' and path '%s'",expression,f,d)
end
end
end
if not done and doscan then
-- check if on disk / unchecked / does not work at all / also zips
- if resolvers.splitmethod(pathname).scheme == 'file' then -- ?
+ local scheme = url.hasscheme(pathname)
+ if not scheme or scheme == "file" then
local pname = gsub(pathname,"%.%*$",'')
if not find(pname,"%*") then
local ppname = gsub(pname,"/+$","")
if can_be_dir(ppname) then
for k=1,#wantedfiles do
local w = wantedfiles[k]
- local fname = file.join(ppname,w)
- if resolvers.isreadable.file(fname) then
+ local fname = filejoin(ppname,w)
+ if isreadable(fname) then
if trace_detail then
- logs.report("fileio","found '%s' by scanning",fname)
+ report_resolving("found '%s' by scanning",fname)
end
result[#result+1] = fname
done = true
- if not instance.allresults then break end
+ if not allresults then break end
end
end
else
@@ -10009,56 +12136,66 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
end
end
if not done and doscan then
- -- todo: slow path scanning
+ -- todo: slow path scanning ... although we now have tree:// supported in $TEXMF
end
- if done and not instance.allresults then break end
+ if done and not allresults then break end
end
end
end
for k=1,#result do
- result[k] = file.collapse_path(result[k])
+ local rk = collapsepath(result[k])
+ result[k] = rk
+ resolvers.registerintrees(rk) -- for tracing used files
end
- if instance.remember then
+ if stamp then
instance.found[stamp] = result
end
return result
end
-if not resolvers.concatinators then resolvers.concatinators = { } end
+-- -- -- begin of main file search routing -- -- --
-resolvers.concatinators.tex = file.join
-resolvers.concatinators.file = resolvers.concatinators.tex
-function resolvers.find_files(filename,filetype,mustexist)
- if type(mustexist) == boolean then
- -- all set
- elseif type(filetype) == 'boolean' then
- filetype, mustexist = nil, false
- elseif type(filetype) ~= 'string' then
- filetype, mustexist = nil, false
- end
- instance.format = filetype or ''
- local result = collect_instance_files(filename)
+
+
+
+
+
+
+
+
+-- -- -- end of main file search routing -- -- --
+
+local function findfiles(filename,filetype,allresults)
+ local result = collect_instance_files(filename,filetype or "",allresults)
if #result == 0 then
local lowered = lower(filename)
if filename ~= lowered then
- return collect_instance_files(lowered)
+ return collect_instance_files(lowered,filetype or "",allresults)
end
end
- instance.format = ''
return result
end
-function resolvers.find_file(filename,filetype,mustexist)
- return (resolvers.find_files(filename,filetype,mustexist)[1] or "")
+function resolvers.findfiles(filename,filetype)
+ return findfiles(filename,filetype,true)
+end
+
+function resolvers.findfile(filename,filetype)
+ return findfiles(filename,filetype,false)[1] or ""
end
-function resolvers.find_given_files(filename)
- local bname, result = file.basename(filename), { }
+function resolvers.findpath(filename,filetype)
+ return filedirname(findfiles(filename,filetype,false)[1] or "")
+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.tag] or { }
+ local files = instance.files[hash.name] or { }
local blist = files[bname]
if not blist then
local rname = "remap:"..bname
@@ -10070,13 +12207,21 @@ function resolvers.find_given_files(filename)
end
if blist then
if type(blist) == 'string' then
- result[#result+1] = resolvers.concatinators[hash.type](hash.tag,blist,bname) or ""
- if not instance.allresults then break end
+ 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
else
for kk=1,#blist do
local vv = blist[kk]
- result[#result+1] = resolvers.concatinators[hash.type](hash.tag,vv,bname) or ""
- if not instance.allresults then break end
+ 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
+ end
end
end
end
@@ -10084,24 +12229,31 @@ function resolvers.find_given_files(filename)
return result
end
-function resolvers.find_given_file(filename)
- return (resolvers.find_given_files(filename)[1] or "")
+function resolvers.findgivenfiles(filename)
+ return findgivenfiles(filename,true)
+end
+
+function resolvers.findgivenfile(filename)
+ return findgivenfiles(filename,false)[1] or ""
end
-local function doit(path,blist,bname,tag,kind,result,allresults)
+local function doit(path,blist,bname,tag,variant,result,allresults)
local done = false
- if blist and kind then
+ 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
- result[#result+1] = resolvers.concatinators[kind](tag,blist,bname) or ""
+ 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
- result[#result+1] = resolvers.concatinators[kind](tag,vv,bname) or ""
+ local full = methodhandler('concatinators',variant,tag,vv,bname) or ""
+ result[#result+1] = resolve(full)
done = true
if not allresults then break end
end
@@ -10111,30 +12263,32 @@ local function doit(path,blist,bname,tag,kind,result,allresults)
return done
end
-function resolvers.find_wildcard_files(filename) -- todo: remap:
- local result = { }
- local bname, dname = file.basename(filename), file.dirname(filename)
- local path = gsub(dname,"^*/","")
- path = gsub(path,"*",".*")
- path = gsub(path,"-","%%-")
- if dname == "" then
- path = ".*"
- end
- local name = bname
- name = gsub(name,"*",".*")
- name = gsub(name,"-","%%-")
- path = lower(path)
- name = lower(name)
- local files, allresults, done = instance.files, instance.allresults, false
+
+local makewildcard = Cs(
+ (P("^")^0 * P("/") * P(-1) + P(-1)) /".*"
+ + (P("^")^0 * P("/") / "")^0 * (P("*")/".*" + P("-")/"%%-" + P(".")/"%%." + P("?")/"."+ P("\\")/"/" + P(1))^0
+)
+
+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 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
if find(name,"%*") then
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- local tag, kind = hash.tag, hash.type
- for kk, hh in next, files[hash.tag] do
+ 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,tag,kind,result,allresults) then done = true end
+ if doit(path,hh,kk,hashname,hashtype,result,allresults) then done = true end
if done and not allresults then break end
end
end
@@ -10144,8 +12298,8 @@ function resolvers.find_wildcard_files(filename) -- todo: remap:
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- local tag, kind = hash.tag, hash.type
- if doit(path,files[tag][bname],bname,tag,kind,result,allresults) then done = true end
+ local hashname, hashtype = hash.name, hash.type
+ if doit(path,files[hashname][bname],bname,hashname,hashtype,result,allresults) then done = true end
if done and not allresults then break end
end
end
@@ -10154,8 +12308,12 @@ function resolvers.find_wildcard_files(filename) -- todo: remap:
return result
end
-function resolvers.find_wildcard_file(filename)
- return (resolvers.find_wildcard_files(filename)[1] or "")
+function resolvers.findwildcardfiles(filename,result)
+ return findwildcardfiles(filename,true,result)
+end
+
+function resolvers.findwildcardfile(filename)
+ return findwildcardfiles(filename,false)[1] or ""
end
-- main user functions
@@ -10166,34 +12324,33 @@ end
function resolvers.load(option)
statistics.starttiming(instance)
- resolvers.resetconfig()
- resolvers.identify_cnf()
- resolvers.load_lua() -- will become the new method
- resolvers.expand_variables()
- resolvers.load_cnf() -- will be skipped when we have a lua file
- resolvers.expand_variables()
+ identify_configuration_files()
+ load_configuration_files()
if option ~= "nofiles" then
- resolvers.load_hash()
+ load_databases()
resolvers.automount()
end
statistics.stoptiming(instance)
+ local files = instance.files
+ return files and next(files) and true
+end
+
+local function report(str)
+ if trace_locating then
+ report_resolving(str) -- has already verbose
+ else
+ print(str)
+ end
end
-function resolvers.for_files(command, files, filetype, mustexist)
+function resolvers.dowithfilesandreport(command, files, ...) -- will move
if files and #files > 0 then
- local function report(str)
- if trace_locating then
- logs.report("fileio",str) -- has already verbose
- else
- print(str)
- end
- end
if trace_locating then
report('') -- ?
end
for f=1,#files do
local file = files[f]
- local result = command(file,filetype,mustexist)
+ local result = command(file,...)
if type(result) == 'string' then
report(result)
else
@@ -10205,21 +12362,16 @@ function resolvers.for_files(command, files, filetype, mustexist)
end
end
--- strtab
+-- obsolete
-resolvers.var_value = resolvers.variable -- output the value of variable $STRING.
-resolvers.expand_var = resolvers.expansion -- output variable expansion of STRING.
+-- resolvers.varvalue = resolvers.variable -- output the value of variable $STRING.
+-- resolvers.expandvar = resolvers.expansion -- output variable expansion of STRING.
-function resolvers.show_path(str) -- output search path for file type NAME
- return file.join_path(resolvers.expanded_path_list(resolvers.format_of_var(str)))
+function resolvers.showpath(str) -- output search path for file type NAME
+ return joinpath(resolvers.expandedpathlist(resolvers.formatofvariable(str)))
end
--- resolvers.find_file(filename)
--- resolvers.find_file(filename, filetype, mustexist)
--- resolvers.find_file(filename, mustexist)
--- resolvers.find_file(filename, filetype)
-
-function resolvers.register_file(files, name, path)
+function resolvers.registerfile(files, name, path)
if files[name] then
if type(files[name]) == 'string' then
files[name] = { files[name], path }
@@ -10231,101 +12383,24 @@ function resolvers.register_file(files, name, path)
end
end
-function resolvers.splitmethod(filename)
- if not filename then
- return { } -- safeguard
- elseif type(filename) == "table" then
- return filename -- already split
- elseif not find(filename,"://") then
- return { scheme="file", path = filename, original=filename } -- quick hack
- else
- return url.hashed(filename)
- end
-end
-
-function table.sequenced(t,sep) -- temp here
- local s = { }
- for k, v in next, t do -- indexed?
- s[#s+1] = k .. "=" .. tostring(v)
- end
- return concat(s, sep or " | ")
-end
-
-function resolvers.methodhandler(what, filename, filetype) -- ...
- filename = file.collapse_path(filename)
- local specification = (type(filename) == "string" and resolvers.splitmethod(filename)) or filename -- no or { }, let it bomb
- local scheme = specification.scheme
- if resolvers[what][scheme] then
- if trace_locating then
- logs.report("fileio","handler '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
- end
- return resolvers[what][scheme](filename,filetype) -- todo: specification
- else
- return resolvers[what].tex(filename,filetype) -- todo: specification
- end
-end
-
-function resolvers.clean_path(str)
- if str then
- str = gsub(str,"\\","/")
- str = gsub(str,"^!+","")
- str = gsub(str,"^~",resolvers.homedir)
- return str
- else
- return nil
- end
-end
-
-function resolvers.do_with_path(name,func)
- local pathlist = resolvers.expanded_path_list(name)
+function resolvers.dowithpath(name,func)
+ local pathlist = resolvers.expandedpathlist(name)
for i=1,#pathlist do
- func("^"..resolvers.clean_path(pathlist[i]))
+ func("^"..resolvers.cleanpath(pathlist[i]))
end
end
-function resolvers.do_with_var(name,func)
- func(expanded_var(name))
+function resolvers.dowithvariable(name,func)
+ func(expandedvariable(name))
end
-function resolvers.with_files(pattern,handle)
- local hashes = instance.hashes
- for i=1,#hashes do
- local hash = hashes[i]
- local blobpath = hash.tag
- local blobtype = hash.type
- if blobpath then
- local files = instance.files[blobpath]
- if files then
- for k,v in next, files do
- if find(k,"^remap:") then
- k = files[k]
- v = files[k] -- chained
- end
- if find(k,pattern) then
- if type(v) == "string" then
- handle(blobtype,blobpath,v,k)
- else
- for _,vv in next, v do -- indexed
- handle(blobtype,blobpath,vv,k)
- end
- end
- end
- end
- end
- end
- end
-end
-
-function resolvers.locate_format(name)
- local barename, fmtname = gsub(name,"%.%a+$",""), ""
- if resolvers.usecache then
- local path = file.join(caches.setpath("formats")) -- maybe platform
- fmtname = file.join(path,barename..".fmt") or ""
- end
+function resolvers.locateformat(name)
+ local barename = file.removesuffix(name) -- gsub(name,"%.%a+$","")
+ local fmtname = caches.getfirstreadablefile(barename..".fmt","formats") or ""
if fmtname == "" then
- fmtname = resolvers.find_files(barename..".fmt")[1] or ""
+ fmtname = resolvers.findfile(barename..".fmt")
+ fmtname = resolvers.cleanpath(fmtname)
end
- fmtname = resolvers.clean_path(fmtname)
if fmtname ~= "" then
local barename = file.removesuffix(fmtname)
local luaname, lucname, luiname = barename .. ".lua", barename .. ".luc", barename .. ".lui"
@@ -10340,7 +12415,7 @@ function resolvers.locate_format(name)
return nil, nil
end
-function resolvers.boolean_variable(str,default)
+function resolvers.booleanvariable(str,default)
local b = resolvers.expansion(str)
if b == "" then
return default
@@ -10350,204 +12425,62 @@ function resolvers.boolean_variable(str,default)
end
end
-texconfig.kpse_init = false
-
-kpse = { original = kpse } setmetatable(kpse, { __index = function(k,v) return resolvers[v] end } )
-
--- for a while
-
-input = resolvers
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['data-tmp'] = {
- 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"
-}
-
---[[ldx--
-<p>This module deals with caching data. It sets up the paths and
-implements loaders and savers for tables. Best is to set the
-following variable. When not set, the usual paths will be
-checked. Personally I prefer the (users) temporary path.</p>
-
-</code>
-TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
-</code>
-
-<p>Currently we do no locking when we write files. This is no real
-problem because most caching involves fonts and the chance of them
-being written at the same time is small. We also need to extend
-luatools with a recache feature.</p>
---ldx]]--
-
-local format, lower, gsub = string.format, string.lower, string.gsub
-
-local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end) -- not used yet
-
-caches = caches or { }
-
-caches.path = caches.path or nil
-caches.base = caches.base or "luatex-cache"
-caches.more = caches.more or "context"
-caches.direct = false -- true is faster but may need huge amounts of memory
-caches.tree = false
-caches.paths = caches.paths or nil
-caches.force = true -- changed for TEXLIVE by TH
-caches.defaults = { "TEXMFCACHE", "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
-
-function caches.temp()
- local cachepath = nil
- local function check(list,isenv)
- if not cachepath then
- for k=1,#list do
- local v = list[k]
- cachepath = (isenv and (os.env[v] or "")) or v or ""
- if cachepath == "" then
- -- next
- else
- cachepath = resolvers.clean_path(cachepath)
- if lfs.isdir(cachepath) and file.iswritable(cachepath) then -- lfs.attributes(cachepath,"mode") == "directory"
- break
- elseif caches.force or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then
- dir.mkdirs(cachepath)
- if lfs.isdir(cachepath) and file.iswritable(cachepath) then
- break
+function resolvers.dowithfilesintree(pattern,handle,before,after) -- will move, can be a nice iterator instead
+ local instance = resolvers.instance
+ local hashes = instance.hashes
+ for i=1,#hashes do
+ local hash = hashes[i]
+ local blobtype = hash.type
+ local blobpath = hash.name
+ if blobpath then
+ 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 next, files do
+ total = total + 1
+ if find(k,"^remap:") then
+ k = files[k]
+ v = k -- files[k] -- chained
+ end
+ if 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
end
end
end
- cachepath = nil
+ end
+ if after then
+ after(blobtype,blobpath,pattern,total,checked,done)
end
end
end
- check(resolvers.clean_path_list("TEXMFCACHE") or { })
- check(caches.defaults,true)
- if not cachepath then
- print("\nfatal error: there is no valid (writable) cache path defined\n")
- os.exit()
- elseif not lfs.isdir(cachepath) then -- lfs.attributes(cachepath,"mode") ~= "directory"
- print(format("\nfatal error: cache path %s is not a directory\n",cachepath))
- os.exit()
- end
- cachepath = file.collapse_path(cachepath)
- function caches.temp()
- return cachepath
- end
- return cachepath
-end
-
-function caches.configpath()
- return table.concat(resolvers.instance.cnffiles,";")
-end
-
-function caches.hashed(tree)
- return md5.hex(gsub(lower(tree),"[\\\/]+","/"))
-end
-
-function caches.treehash()
- local tree = caches.configpath()
- if not tree or tree == "" then
- return false
- else
- return caches.hashed(tree)
- end
-end
-
-function caches.setpath(...)
- if not caches.path then
- if not caches.path then
- caches.path = caches.temp()
- end
- caches.path = resolvers.clean_path(caches.path) -- to be sure
- caches.tree = caches.tree or caches.treehash()
- if caches.tree then
- caches.path = dir.mkdirs(caches.path,caches.base,caches.more,caches.tree)
- else
- caches.path = dir.mkdirs(caches.path,caches.base,caches.more)
- end
- end
- if not caches.path then
- caches.path = '.'
- end
- caches.path = resolvers.clean_path(caches.path)
- local dirs = { ... }
- if #dirs > 0 then
- local pth = dir.mkdirs(caches.path,...)
- return pth
- end
- caches.path = dir.expand_name(caches.path)
- return caches.path
-end
-
-function caches.definepath(category,subcategory)
- return function()
- return caches.setpath(category,subcategory)
- end
-end
-
-function caches.setluanames(path,name)
- return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
end
-function caches.loaddata(path,name)
- local tmaname, tmcname = caches.setluanames(path,name)
- local loader = loadfile(tmcname) or loadfile(tmaname)
- if loader then
- loader = loader()
- collectgarbage("step")
- return loader
- else
- return false
- end
-end
+resolvers.obsolete = resolvers.obsolete or { }
+local obsolete = resolvers.obsolete
---~ function caches.loaddata(path,name)
---~ local tmaname, tmcname = caches.setluanames(path,name)
---~ return dofile(tmcname) or dofile(tmaname)
---~ end
-
-function caches.iswritable(filepath,filename)
- local tmaname, tmcname = caches.setluanames(filepath,filename)
- return file.iswritable(tmaname)
-end
-
-function caches.savedata(filepath,filename,data,raw)
- local tmaname, tmcname = caches.setluanames(filepath,filename)
- local reduce, simplify = true, true
- if raw then
- reduce, simplify = false, false
- end
- data.cache_uuid = os.uuid()
- if caches.direct then
- file.savedata(tmaname, table.serialize(data,'return',false,true,false)) -- no hex
- else
- table.tofile(tmaname, data,'return',false,true,false) -- maybe not the last true
- end
- local cleanup = resolvers.boolean_variable("PURGECACHE", false)
- local strip = resolvers.boolean_variable("LUACSTRIP", true)
- utils.lua.compile(tmaname, tmcname, cleanup, strip)
-end
-
--- here we use the cache for format loading (texconfig.[formatname|jobname])
-
---~ if tex and texconfig and texconfig.formatname and texconfig.formatname == "" then
-if tex and texconfig and (not texconfig.formatname or texconfig.formatname == "") and input and resolvers.instance then
- if not texconfig.luaname then texconfig.luaname = "cont-en.lua" end -- or luc
- texconfig.formatname = caches.setpath("formats") .. "/" .. gsub(texconfig.luaname,"%.lu.$",".fmt")
-end
+resolvers.find_file = resolvers.findfile obsolete.find_file = resolvers.findfile
+resolvers.find_files = resolvers.findfiles obsolete.find_files = resolvers.findfiles
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['data-res'] = {
+if not modules then modules = { } end modules ['data-pre'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -10555,17 +12488,28 @@ if not modules then modules = { } end modules ['data-res'] = {
license = "see context related readme files"
}
---~ print(resolvers.resolve("abc env:tmp file:cont-en.tex path:cont-en.tex full:cont-en.tex rel:zapf/one/p-chars.tex"))
+-- It could be interesting to hook the resolver in the file
+-- opener so that unresolved prefixes travel around and we
+-- get more abstraction.
+
+-- As we use this beforehand we will move this up in the chain
+-- of loading.
+
-local upper, lower, gsub = string.upper, string.lower, string.gsub
+local resolvers = resolvers
+local prefixes = utilities.storage.allocate()
+resolvers.prefixes = prefixes
-local prefixes = { }
+local gsub = string.gsub
+local cleanpath, findgivenfile, expansion = resolvers.cleanpath, resolvers.findgivenfile, resolvers.expansion
+local getenv = resolvers.getenv -- we can probably also use resolvers.expansion
+local P, Cs, lpegmatch = lpeg.P, lpeg.Cs, lpeg.match
prefixes.environment = function(str)
- return resolvers.clean_path(os.getenv(str) or os.getenv(upper(str)) or os.getenv(lower(str)) or "")
+ return cleanpath(expansion(str))
end
-prefixes.relative = function(str,n)
+prefixes.relative = function(str,n) -- lfs.isfile
if io.exists(str) then
-- nothing
elseif io.exists("./" .. str) then
@@ -10581,7 +12525,7 @@ prefixes.relative = function(str,n)
end
end
end
- return resolvers.clean_path(str)
+ return cleanpath(str)
end
prefixes.auto = function(str)
@@ -10593,18 +12537,34 @@ prefixes.auto = function(str)
end
prefixes.locate = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path((fullname ~= "" and fullname) or str)
+ local fullname = findgivenfile(str) or ""
+ return cleanpath((fullname ~= "" and fullname) or str)
end
prefixes.filename = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path(file.basename((fullname ~= "" and fullname) or str))
+ local fullname = findgivenfile(str) or ""
+ return cleanpath(file.basename((fullname ~= "" and fullname) or str))
end
prefixes.pathname = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path(file.dirname((fullname ~= "" and fullname) or str))
+ local fullname = findgivenfile(str) or ""
+ return cleanpath(file.dirname((fullname ~= "" and fullname) or str))
+end
+
+prefixes.selfautoloc = function(str)
+ return cleanpath(file.join(getenv('SELFAUTOLOC'),str))
+end
+
+prefixes.selfautoparent = function(str)
+ return cleanpath(file.join(getenv('SELFAUTOPARENT'),str))
+end
+
+prefixes.selfautodir = function(str)
+ return cleanpath(file.join(getenv('SELFAUTODIR'),str))
+end
+
+prefixes.home = function(str)
+ return cleanpath(file.join(getenv('HOME'),str))
end
prefixes.env = prefixes.environment
@@ -10633,19 +12593,28 @@ local function _resolve_(method,target)
end
end
-local function resolve(str)
- if type(str) == "table" then
- for k=1,#str do
- local v = str[k]
- str[k] = resolve(v) or v
- end
- elseif str and str ~= "" then
- str = gsub(str,"([a-z]+):([^ \"\']*)",_resolve_)
+local resolved, abstract = { }, { }
+
+function resolvers.resetresolve(str)
+ resolved, abstract = { }, { }
+end
+
+local function resolve(str) -- use schemes, this one is then for the commandline only
+ local res = resolved[str]
+ if not res then
+ res = gsub(str,"([a-z][a-z]+):([^ \"\']*)",_resolve_)
+ resolved[str] = res
+ abstract[res] = str
end
- return str
+ return res
+end
+
+local function unresolve(str)
+ return abstract[str] or str
end
-resolvers.resolve = resolve
+resolvers.resolve = resolve
+resolvers.unresolve = unresolve
if os.uname then
@@ -10657,6 +12626,42 @@ if os.uname then
end
+if os.type == "unix" then
+
+ local pattern
+
+ local function makepattern(t,k,v)
+ local colon = P(":")
+ local 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)
+ if t then
+ t[k] = v
+ end
+ end
+
+ makepattern()
+
+ getmetatable(prefixes).__newindex = makepattern
+
+ function resolvers.repath(str)
+ return lpegmatch(pattern,str)
+ end
+
+else -- already the default:
+
+ function resolvers.repath(str)
+ return str
+ end
+
+end
+
end -- of closure
@@ -10670,13 +12675,23 @@ if not modules then modules = { } end modules ['data-inp'] = {
license = "see context related readme files"
}
-resolvers.finders = resolvers.finders or { }
-resolvers.openers = resolvers.openers or { }
-resolvers.loaders = resolvers.loaders or { }
+local allocate = utilities.storage.allocate
+local resolvers = resolvers
+
+local methodhandler = resolvers.methodhandler
+local registermethod = resolvers.registermethod
+
+local finders = allocate { helpers = { }, notfound = function() end }
+local openers = allocate { helpers = { }, notfound = function() end }
+local loaders = allocate { helpers = { }, notfound = function() return false, nil, 0 end }
-resolvers.finders.notfound = { nil }
-resolvers.openers.notfound = { nil }
-resolvers.loaders.notfound = { false, nil, 0 }
+registermethod("finders", finders, "uri")
+registermethod("openers", openers, "uri")
+registermethod("loaders", loaders, "uri")
+
+resolvers.finders = finders
+resolvers.openers = openers
+resolvers.loaders = loaders
end -- of closure
@@ -10691,15 +12706,23 @@ if not modules then modules = { } end modules ['data-out'] = {
license = "see context related readme files"
}
-outputs = outputs or { }
+local allocate = utilities.storage.allocate
+local resolvers = resolvers
+
+local registermethod = resolvers.registermethod
+
+local savers = allocate { helpers = { } }
+resolvers.savers = savers
+
+registermethod("savers", savers, "uri")
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['data-con'] = {
+if not modules then modules = { } end modules ['data-fil'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -10707,6 +12730,124 @@ if not modules then modules = { } end modules ['data-con'] = {
license = "see context related readme files"
}
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_files = logs.reporter("resolvers","files")
+
+local resolvers = resolvers
+
+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
+
+local checkgarbage = utilities.garbagecollector and utilities.garbagecollector.check
+
+function locators.file(specification)
+ local name = specification.filename
+ local realname = resolvers.resolve(name) -- no shortcut
+ if realname and realname ~= '' and lfs.isdir(realname) then
+ if trace_locating then
+ report_files("file locator '%s' found as '%s'",name,realname)
+ end
+ resolvers.appendhash('file',name,true) -- cache
+ elseif trace_locating then
+ report_files("file locator '%s' not found",name)
+ end
+end
+
+function hashers.file(specification)
+ local name = specification.filename
+ local content = caches.loadcontent(name,'files')
+ resolvers.registerfilehash(name,content,content==nil)
+end
+
+function generators.file(specification)
+ local path = specification.filename
+ local content = resolvers.scanfiles(path)
+ resolvers.registerfilehash(path,content,true)
+end
+
+concatinators.file = file.join
+
+function finders.file(specification,filetype)
+ local filename = specification.filename
+ local foundname = resolvers.findfile(filename,filetype)
+ if foundname and foundname ~= "" then
+ if trace_locating then
+ report_files("file finder: '%s' found",filename)
+ end
+ return foundname
+ else
+ if trace_locating then
+ report_files("file finder: %s' not found",filename)
+ end
+ return finders.notfound()
+ end
+end
+
+-- The default textopener will be overloaded later on.
+
+function openers.helpers.textopener(tag,filename,f)
+ return {
+ reader = function() return f:read () end,
+ close = function() logs.show_close(filename) return f:close() end,
+ }
+end
+
+function openers.file(specification,filetype)
+ local filename = specification.filename
+ if filename and filename ~= "" then
+ local f = io.open(filename,"r")
+ if f then
+ if trace_locating then
+ report_files("file opener, '%s' opened",filename)
+ end
+ return openers.helpers.textopener("file",filename,f)
+ end
+ end
+ if trace_locating then
+ report_files("file opener, '%s' not found",filename)
+ end
+ return openers.notfound()
+end
+
+function loaders.file(specification,filetype)
+ local filename = specification.filename
+ if filename and filename ~= "" then
+ local f = io.open(filename,"rb")
+ if f then
+ logs.show_load(filename)
+ if trace_locating then
+ report_files("file loader, '%s' loaded",filename)
+ end
+ local s = f:read("*a")
+ if checkgarbage then
+ checkgarbage(#s)
+ end
+ f:close()
+ if s then
+ return true, s, #s
+ end
+ end
+ end
+ if trace_locating then
+ report_files("file loader, '%s' not found",filename)
+ end
+ return loaders.notfound()
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-con'] = {
+ version = 1.100,
+ 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 format, lower, gsub = string.format, string.lower, string.gsub
local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
@@ -10726,50 +12867,63 @@ table structures without bothering about the disk cache.</p>
<p>Examples of usage can be found in the font related code.</p>
--ldx]]--
-containers = containers or { }
-
+containers = containers or { }
+local containers = containers
containers.usecache = true
+local report_containers = logs.reporter("resolvers","containers")
+
local function report(container,tag,name)
if trace_cache or trace_containers then
- logs.report(format("%s cache",container.subcategory),"%s: %s",tag,name or 'invalid')
+ report_containers("container: %s, tag: %s, name: %s",container.subcategory,tag,name or 'invalid')
end
end
local allocated = { }
--- tracing
+local mt = {
+ __index = function(t,k)
+ if k == "writable" then
+ local writable = caches.getwritablepath(t.category,t.subcategory) or { "." }
+ t.writable = writable
+ return writable
+ elseif k == "readables" then
+ local readables = caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ t.readables = readables
+ return readables
+ end
+ end,
+ __storage__ = true
+}
function containers.define(category, subcategory, version, enabled)
- return function()
- if category and subcategory then
- local c = allocated[category]
- if not c then
- c = { }
- allocated[category] = c
- end
- local s = c[subcategory]
- if not s then
- s = {
- category = category,
- subcategory = subcategory,
- storage = { },
- enabled = enabled,
- version = version or 1.000,
- trace = false,
- path = caches and caches.setpath and caches.setpath(category,subcategory),
- }
- c[subcategory] = s
- end
- return s
- else
- return nil
+ if category and subcategory then
+ local c = allocated[category]
+ if not c then
+ c = { }
+ allocated[category] = c
+ end
+ local s = c[subcategory]
+ if not s then
+ s = {
+ category = category,
+ subcategory = subcategory,
+ storage = { },
+ enabled = enabled,
+ version = version or math.pi, -- after all, this is TeX
+ trace = false,
+ -- writable = caches.getwritablepath and caches.getwritablepath (category,subcategory) or { "." },
+ -- readables = caches.getreadablepaths and caches.getreadablepaths(category,subcategory) or { "." },
+ }
+ setmetatable(s,mt)
+ c[subcategory] = s
end
+ return s
end
end
function containers.is_usable(container, name)
- return container.enabled and caches and caches.iswritable(container.path, name)
+ return container.enabled and caches and caches.is_writable(container.writable, name)
end
function containers.is_valid(container, name)
@@ -10782,18 +12936,20 @@ function containers.is_valid(container, name)
end
function containers.read(container,name)
- if container.enabled and caches and not container.storage[name] and containers.usecache then
- container.storage[name] = caches.loaddata(container.path,name)
- if containers.is_valid(container,name) then
+ local storage = container.storage
+ local stored = storage[name]
+ if not stored and container.enabled and caches and containers.usecache then
+ stored = caches.loaddata(container.readables,name)
+ if stored and stored.cache_version == container.version then
report(container,"loaded",name)
else
- container.storage[name] = nil
+ stored = nil
end
- end
- if container.storage[name] then
+ storage[name] = stored
+ elseif stored then
report(container,"reusing",name)
end
- return container.storage[name]
+ return stored
end
function containers.write(container, name, data)
@@ -10802,7 +12958,7 @@ function containers.write(container, name, data)
if container.enabled and caches then
local unique, shared = data.unique, data.shared
data.unique, data.shared = nil, nil
- caches.savedata(container.path, name, data)
+ caches.savedata(container.writable, name, data)
report(container,"saved",name)
data.unique, data.shared = unique, shared
end
@@ -10837,50 +12993,18 @@ local format, lower, gsub, find = string.format, string.lower, string.gsub, stri
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
--- since we want to use the cache instead of the tree, we will now
--- reimplement the saver.
-
-local save_data = resolvers.save_data
-local load_data = resolvers.load_data
+local report_mounts = logs.reporter("resolvers","mounts")
-resolvers.cachepath = nil -- public, for tracing
-resolvers.usecache = true -- public, for tracing
-
-function resolvers.save_data(dataname)
- save_data(dataname, function(cachename,dataname)
- resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
- if resolvers.usecache then
- resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
- return file.join(resolvers.cachepath(),caches.hashed(cachename))
- else
- return file.join(cachename,dataname)
- end
- end)
-end
-
-function resolvers.load_data(pathname,dataname,filename)
- load_data(pathname,dataname,filename,function(dataname,filename)
- resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
- if resolvers.usecache then
- resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
- return file.join(resolvers.cachepath(),caches.hashed(pathname))
- else
- if not filename or (filename == "") then
- filename = dataname
- end
- return file.join(pathname,filename)
- end
- end)
-end
+local resolvers = resolvers
-- we will make a better format, maybe something xml or just text or lua
resolvers.automounted = resolvers.automounted or { }
function resolvers.automount(usecache)
- local mountpaths = resolvers.clean_path_list(resolvers.expansion('TEXMFMOUNT'))
+ local mountpaths = resolvers.cleanpathlist(resolvers.expansion('TEXMFMOUNT'))
if (not mountpaths or #mountpaths == 0) and usecache then
- mountpaths = { caches.setpath("mount") }
+ mountpaths = caches.getreadablepaths("mount")
end
if mountpaths and #mountpaths > 0 then
statistics.starttiming(resolvers.instance)
@@ -10894,7 +13018,7 @@ function resolvers.automount(usecache)
-- skip
elseif find(line,"^zip://") then
if trace_locating then
- logs.report("fileio","mounting %s",line)
+ report_mounts("mounting %s",line)
end
table.insert(resolvers.automounted,line)
resolvers.usezipfile(line)
@@ -10910,40 +13034,40 @@ end
-- status info
-statistics.register("used config path", function() return caches.configpath() end)
-statistics.register("used cache path", function() return caches.temp() or "?" end)
+statistics.register("used config file", function() return caches.configfiles() end)
+statistics.register("used cache path", function() return caches.usedpaths() end)
-- experiment (code will move)
-function statistics.save_fmt_status(texname,formatbanner,sourcefile) -- texname == formatname
+function statistics.savefmtstatus(texname,formatbanner,sourcefile) -- texname == formatname
local enginebanner = status.list().banner
if formatbanner and enginebanner and sourcefile then
local luvname = file.replacesuffix(texname,"luv")
local luvdata = {
enginebanner = enginebanner,
formatbanner = formatbanner,
- sourcehash = md5.hex(io.loaddata(resolvers.find_file(sourcefile)) or "unknown"),
+ sourcehash = md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"),
sourcefile = sourcefile,
}
io.savedata(luvname,table.serialize(luvdata,true))
end
end
-function statistics.check_fmt_status(texname)
+function statistics.checkfmtstatus(texname)
local enginebanner = status.list().banner
if enginebanner and texname then
local luvname = file.replacesuffix(texname,"luv")
if lfs.isfile(luvname) then
local luv = dofile(luvname)
if luv and luv.sourcefile then
- local sourcehash = md5.hex(io.loaddata(resolvers.find_file(luv.sourcefile)) or "unknown")
+ local sourcehash = md5.hex(io.loaddata(resolvers.findfile(luv.sourcefile)) or "unknown")
local luvbanner = luv.enginebanner or "?"
if luvbanner ~= enginebanner then
- return string.format("engine mismatch (luv:%s <> bin:%s)",luvbanner,enginebanner)
+ return format("engine mismatch (luv: %s <> bin: %s)",luvbanner,enginebanner)
end
local luvhash = luv.sourcehash or "?"
if luvhash ~= sourcehash then
- return string.format("source mismatch (luv:%s <> bin:%s)",luvhash,sourcehash)
+ return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash)
end
else
return "invalid status file"
@@ -10968,25 +13092,30 @@ if not modules then modules = { } end modules ['data-zip'] = {
license = "see context related readme files"
}
+-- partly redone .. needs testing
+
local format, find, match = string.format, string.find, string.match
-local unpack = unpack or table.unpack
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local report_zip = logs.reporter("resolvers","zip")
+
-- zip:///oeps.zip?name=bla/bla.tex
-- zip:///oeps.zip?tree=tex/texmf-local
-- zip:///texmf.zip?tree=/tex/texmf
-- zip:///texmf.zip?tree=/tex/texmf-local
-- zip:///texmf-mine.zip?tree=/tex/texmf-projects
-zip = zip or { }
-zip.archives = zip.archives or { }
-zip.registeredfiles = zip.registeredfiles or { }
+local resolvers = resolvers
+
+zip = zip or { }
+local zip = zip
-local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
-local locators, hashers, concatinators = resolvers.locators, resolvers.hashers, resolvers.concatinators
+zip.archives = zip.archives or { }
+local archives = zip.archives
-local archives = zip.archives
+zip.registeredfiles = zip.registeredfiles or { }
+local registeredfiles = zip.registeredfiles
local function validzip(str) -- todo: use url splitter
if not find(str,"^zip://") then
@@ -11002,7 +13131,7 @@ function zip.openarchive(name)
else
local arch = archives[name]
if not arch then
- local full = resolvers.find_file(name) or ""
+ local full = resolvers.findfile(name) or ""
arch = (full ~= "" and zip.open(full)) or false
archives[name] = arch
end
@@ -11017,163 +13146,162 @@ function zip.closearchive(name)
end
end
-function locators.zip(specification) -- where is this used? startup zips (untested)
- specification = resolvers.splitmethod(specification)
- local zipfile = specification.path
- local zfile = zip.openarchive(name) -- tricky, could be in to be initialized tree
+function resolvers.locators.zip(specification)
+ local archive = specification.filename
+ local zipfile = archive and archive ~= "" and zip.openarchive(archive) -- tricky, could be in to be initialized tree
if trace_locating then
- if zfile then
- logs.report("fileio","zip locator, archive '%s' found",specification.original)
+ if zipfile then
+ report_zip("locator, archive '%s' found",archive)
else
- logs.report("fileio","zip locator, archive '%s' not found",specification.original)
+ report_zip("locator, archive '%s' not found",archive)
end
end
end
-function hashers.zip(tag,name)
+function resolvers.hashers.zip(specification)
+ local archive = specification.filename
if trace_locating then
- logs.report("fileio","loading zip file '%s' as '%s'",name,tag)
+ report_zip("loading file '%s'",archive)
end
- resolvers.usezipfile(format("%s?tree=%s",tag,name))
+ resolvers.usezipfile(specification.original)
end
-function concatinators.zip(tag,path,name)
+function resolvers.concatinators.zip(zipfile,path,name) -- ok ?
if not path or path == "" then
- return format('%s?name=%s',tag,name)
+ return format('%s?name=%s',zipfile,name)
else
- return format('%s?name=%s/%s',tag,path,name)
+ return format('%s?name=%s/%s',zipfile,path,name)
end
end
-function resolvers.isreadable.zip(name)
- return true
-end
-
-function finders.zip(specification,filetype)
- specification = resolvers.splitmethod(specification)
- if specification.path then
- local q = url.query(specification.query)
- if q.name then
- local zfile = zip.openarchive(specification.path)
+function resolvers.finders.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip finder, archive '%s' found",specification.path)
+ report_zip("finder, archive '%s' found",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
dfile = zfile:close()
if trace_locating then
- logs.report("fileio","zip finder, file '%s' found",q.name)
+ report_zip("finder, file '%s' found",queryname)
end
return specification.original
elseif trace_locating then
- logs.report("fileio","zip finder, file '%s' not found",q.name)
+ report_zip("finder, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip finder, unknown archive '%s'",specification.path)
+ report_zip("finder, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip finder, '%s' not found",filename)
+ report_zip("finder, '%s' not found",original)
end
- return unpack(finders.notfound)
+ return resolvers.finders.notfound()
end
-function openers.zip(specification)
- local zipspecification = resolvers.splitmethod(specification)
- if zipspecification.path then
- local q = url.query(zipspecification.query)
- if q.name then
- local zfile = zip.openarchive(zipspecification.path)
+function resolvers.openers.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip opener, archive '%s' opened",zipspecification.path)
+ report_zip("opener, archive '%s' opened",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
- logs.show_open(specification)
if trace_locating then
- logs.report("fileio","zip opener, file '%s' found",q.name)
+ report_zip("opener, file '%s' found",queryname)
end
- return openers.text_opener(specification,dfile,'zip')
+ return resolvers.openers.helpers.textopener('zip',original,dfile)
elseif trace_locating then
- logs.report("fileio","zip opener, file '%s' not found",q.name)
+ report_zip("opener, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip opener, unknown archive '%s'",zipspecification.path)
+ report_zip("opener, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip opener, '%s' not found",filename)
+ report_zip("opener, '%s' not found",original)
end
- return unpack(openers.notfound)
+ return resolvers.openers.notfound()
end
-function loaders.zip(specification)
- specification = resolvers.splitmethod(specification)
- if specification.path then
- local q = url.query(specification.query)
- if q.name then
- local zfile = zip.openarchive(specification.path)
+function resolvers.loaders.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip loader, archive '%s' opened",specification.path)
+ report_zip("loader, archive '%s' opened",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
- logs.show_load(filename)
+ logs.show_load(original)
if trace_locating then
- logs.report("fileio","zip loader, file '%s' loaded",filename)
+ report_zip("loader, file '%s' loaded",original)
end
local s = dfile:read("*all")
dfile:close()
return true, s, #s
elseif trace_locating then
- logs.report("fileio","zip loader, file '%s' not found",q.name)
+ report_zip("loader, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip loader, unknown archive '%s'",specification.path)
+ report_zip("loader, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip loader, '%s' not found",filename)
+ report_zip("loader, '%s' not found",original)
end
- return unpack(openers.notfound)
+ return resolvers.openers.notfound()
end
-- zip:///somefile.zip
-- zip:///somefile.zip?tree=texmf-local -> mount
-function resolvers.usezipfile(zipname)
- zipname = validzip(zipname)
- local specification = resolvers.splitmethod(zipname)
- local zipfile = specification.path
- if zipfile and not zip.registeredfiles[zipname] then
- local tree = url.query(specification.query).tree or ""
- local z = zip.openarchive(zipfile)
+function resolvers.usezipfile(archive)
+ local specification = resolvers.splitmethod(archive) -- to be sure
+ local archive = specification.filename
+ if archive and not registeredfiles[archive] then
+ local z = zip.openarchive(archive)
if z then
- local instance = resolvers.instance
+ local tree = url.query(specification.query).tree or ""
if trace_locating then
- logs.report("fileio","zip registering, registering archive '%s'",zipname)
- end
- statistics.starttiming(instance)
- resolvers.prepend_hash('zip',zipname,zipfile)
- resolvers.extend_texmf_var(zipname) -- resets hashes too
- zip.registeredfiles[zipname] = z
- instance.files[zipname] = resolvers.register_zip_file(z,tree or "")
- statistics.stoptiming(instance)
+ report_zip("registering, registering archive '%s'",archive)
+ end
+ statistics.starttiming(resolvers.instance)
+ resolvers.prependhash('zip',archive)
+ resolvers.extendtexmfvariable(archive) -- resets hashes too
+ registeredfiles[archive] = z
+ instance.files[archive] = resolvers.registerzipfile(z,tree)
+ statistics.stoptiming(resolvers.instance)
elseif trace_locating then
- logs.report("fileio","zip registering, unknown archive '%s'",zipname)
+ report_zip("registering, unknown archive '%s'",archive)
end
elseif trace_locating then
- logs.report("fileio","zip registering, '%s' not found",zipname)
+ report_zip("registering, '%s' not found",archive)
end
end
-function resolvers.register_zip_file(z,tree)
+function resolvers.registerzipfile(z,tree)
local files, filter = { }, ""
if tree == "" then
filter = "^(.+)/(.-)$"
@@ -11181,9 +13309,9 @@ function resolvers.register_zip_file(z,tree)
filter = format("^%s/(.+)/(.-)$",tree)
end
if trace_locating then
- logs.report("fileio","zip registering, using filter '%s'",filter)
+ report_zip("registering, using filter '%s'",filter)
end
- local register, n = resolvers.register_file, 0
+ local register, n = resolvers.registerfile, 0
for i in z:files() do
local path, name = match(i.filename,filter)
if path then
@@ -11198,7 +13326,7 @@ function resolvers.register_zip_file(z,tree)
n = n + 1
end
end
- logs.report("fileio","zip registering, %s files registered",n)
+ report_zip("registering, %s files registered",n)
return files
end
@@ -11207,6 +13335,84 @@ end -- of closure
do -- create closure to overcome 200 locals limit
+if not modules then modules = { } end modules ['data-tre'] = {
+ 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"
+}
+
+-- \input tree://oeps1/**/oeps.tex
+
+local find, gsub, format = string.find, string.gsub, string.format
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_trees = logs.reporter("resolvers","trees")
+
+local resolvers = resolvers
+
+local done, found, notfound = { }, { }, resolvers.finders.notfound
+
+function resolvers.finders.tree(specification)
+ local spec = specification.filename
+ local fnd = found[spec]
+ if fnd == 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
+ 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
+ end
+ end
+ end
+ fnd = notfound() -- false
+ found[spec] = fnd
+ end
+ return fnd
+end
+
+function resolvers.locators.tree(specification)
+ local name = specification.filename
+ if name ~= '' and lfs.isdir(name) then
+ if trace_locating then
+ report_trees("locator '%s' found",name)
+ end
+ resolvers.appendhash('tree',name,false) -- don't cache
+ elseif trace_locating then
+ report_trees("locator '%s' not found",name)
+ end
+end
+
+function resolvers.hashers.tree(specification)
+ local name = specification.filename
+ if trace_locating then
+ report_trees("analysing '%s'",name)
+ end
+ resolvers.methodhandler("hashers",name)
+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
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
if not modules then modules = { } end modules ['data-crl'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
@@ -11215,58 +13421,59 @@ if not modules then modules = { } end modules ['data-crl'] = {
license = "see context related readme files"
}
-local gsub = string.gsub
+-- this one is replaced by data-sch.lua --
-curl = curl or { }
+local gsub = string.gsub
-curl.cached = { }
-curl.cachepath = caches.definepath("curl")
+local resolvers = resolvers
local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
-function curl.fetch(protocol, name)
- local cachename = curl.cachepath() .. "/" .. gsub(name,"[^%a%d%.]+","-")
--- cachename = gsub(cachename,"[\\/]", io.fileseparator)
- cachename = gsub(cachename,"[\\]", "/") -- cleanup
- if not curl.cached[name] then
+resolvers.curl = resolvers.curl or { }
+local curl = resolvers.curl
+
+local cached = { }
+
+local function runcurl(specification)
+ local original = specification.original
+ -- local scheme = specification.scheme
+ local cleanname = gsub(original,"[^%a%d%.]+","-")
+ local cachename = caches.setfirstwritablefile(cleanname,"curl")
+ if not cached[original] then
if not io.exists(cachename) then
- curl.cached[name] = cachename
- local command = "curl --silent --create-dirs --output " .. cachename .. " " .. name -- no protocol .. "://"
+ cached[original] = cachename
+ local command = "curl --silent --create-dirs --output " .. cachename .. " " .. original
os.spawn(command)
end
if io.exists(cachename) then
- curl.cached[name] = cachename
+ cached[original] = cachename
else
- curl.cached[name] = ""
+ cached[original] = ""
end
end
- return curl.cached[name]
+ return cached[original]
end
-function finders.curl(protocol,filename)
- local foundname = curl.fetch(protocol, filename)
- return finders.generic(protocol,foundname,filetype)
-end
-
-function openers.curl(protocol,filename)
- return openers.generic(protocol,filename)
-end
+-- old code: we could be cleaner using specification (see schemes)
-function loaders.curl(protocol,filename)
- return loaders.generic(protocol,filename)
+local function finder(specification,filetype)
+ return resolvers.methodhandler("finders",runcurl(specification),filetype)
end
--- todo: metamethod
+local opener = openers.file
+local loader = loaders.file
-function curl.install(protocol)
- finders[protocol] = function (filename,filetype) return finders.curl(protocol,filename) end
- openers[protocol] = function (filename) return openers.curl(protocol,filename) end
- loaders[protocol] = function (filename) return loaders.curl(protocol,filename) end
+local function install(scheme)
+ finders[scheme] = finder
+ openers[scheme] = opener
+ loaders[scheme] = loader
end
-curl.install('http')
-curl.install('https')
-curl.install('ftp')
+resolvers.curl.install = install
+
+install('http')
+install('https')
+install('ftp')
end -- of closure
@@ -11287,9 +13494,13 @@ if not modules then modules = { } end modules ['data-lua'] = {
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local report_libraries = logs.reporter("resolvers","libraries")
+
local gsub, insert = string.gsub, table.insert
local unpack = unpack or table.unpack
+local resolvers, package = resolvers, package
+
local libformats = { 'luatexlibs', 'tex', 'texmfscripts', 'othertextfiles' } -- 'luainputs'
local clibformats = { 'lib' }
@@ -11298,7 +13509,7 @@ local _path_, libpaths, _cpath_, clibpaths
function package.libpaths()
if not _path_ or package.path ~= _path_ then
_path_ = package.path
- libpaths = file.split_path(_path_,";")
+ libpaths = file.splitpath(_path_,";")
end
return libpaths
end
@@ -11306,7 +13517,7 @@ end
function package.clibpaths()
if not _cpath_ or package.cpath ~= _cpath_ then
_cpath_ = package.cpath
- clibpaths = file.split_path(_cpath_,";")
+ clibpaths = file.splitpath(_cpath_,";")
end
return clibpaths
end
@@ -11315,18 +13526,18 @@ local function thepath(...)
local t = { ... } t[#t+1] = "?.lua"
local path = file.join(unpack(t))
if trace_locating then
- logs.report("fileio","! appending '%s' to 'package.path'",path)
+ report_libraries("! appending '%s' to 'package.path'",path)
end
return path
end
local p_libpaths, a_libpaths = { }, { }
-function package.append_libpath(...)
+function package.appendtolibpath(...)
insert(a_libpath,thepath(...))
end
-function package.prepend_libpath(...)
+function package.prependtolibpath(...)
insert(p_libpaths,1,thepath(...))
end
@@ -11337,31 +13548,30 @@ local function loaded(libpaths,name,simple)
local libpath = libpaths[i]
local resolved = gsub(libpath,"%?",simple)
if trace_locating then -- more detail
- logs.report("fileio","! checking for '%s' on 'package.path': '%s' => '%s'",simple,libpath,resolved)
+ report_libraries("! checking for '%s' on 'package.path': '%s' => '%s'",simple,libpath,resolved)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'package.path': '%s'",name,resolved)
+ report_libraries("! lib '%s' located via 'package.path': '%s'",name,resolved)
end
return loadfile(resolved)
end
end
end
-
package.loaders[2] = function(name) -- was [#package.loaders+1]
if trace_locating then -- mode detail
- logs.report("fileio","! locating '%s'",name)
+ report_libraries("! locating '%s'",name)
end
for i=1,#libformats do
local format = libformats[i]
- local resolved = resolvers.find_file(name,format) or ""
+ local resolved = resolvers.findfile(name,format) or ""
if trace_locating then -- mode detail
- logs.report("fileio","! checking for '%s' using 'libformat path': '%s'",name,format)
+ report_libraries("! checking for '%s' using 'libformat path': '%s'",name,format)
end
if resolved ~= "" then
if trace_locating then
- logs.report("fileio","! lib '%s' located via environment: '%s'",name,resolved)
+ report_libraries("! lib '%s' located via environment: '%s'",name,resolved)
end
return loadfile(resolved)
end
@@ -11379,16 +13589,16 @@ package.loaders[2] = function(name) -- was [#package.loaders+1]
for i=1,#clibformats do
-- better have a dedicated loop
local format = clibformats[i]
- local paths = resolvers.expanded_path_list_from_var(format)
+ local paths = resolvers.expandedpathlistfromvariable(format)
for p=1,#paths do
local path = paths[p]
local resolved = file.join(path,libname)
if trace_locating then -- mode detail
- logs.report("fileio","! checking for '%s' using 'clibformat path': '%s'",libname,path)
+ report_libraries("! checking for '%s' using 'clibformat path': '%s'",libname,path)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'clibformat': '%s'",libname,resolved)
+ report_libraries("! lib '%s' located via 'clibformat': '%s'",libname,resolved)
end
return package.loadlib(resolved,name)
end
@@ -11398,140 +13608,43 @@ package.loaders[2] = function(name) -- was [#package.loaders+1]
local libpath = clibpaths[i]
local resolved = gsub(libpath,"?",simple)
if trace_locating then -- more detail
- logs.report("fileio","! checking for '%s' on 'package.cpath': '%s'",simple,libpath)
+ report_libraries("! checking for '%s' on 'package.cpath': '%s'",simple,libpath)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'package.cpath': '%s'",name,resolved)
+ report_libraries("! lib '%s' located via 'package.cpath': '%s'",name,resolved)
end
return package.loadlib(resolved,name)
end
end
-- just in case the distribution is messed up
if trace_loading then -- more detail
- logs.report("fileio","! checking for '%s' using 'luatexlibs': '%s'",name)
+ report_libraries("! checking for '%s' using 'luatexlibs': '%s'",name)
end
- local resolved = resolvers.find_file(file.basename(name),'luatexlibs') or ""
+ local resolved = resolvers.findfile(file.basename(name),'luatexlibs') or ""
if resolved ~= "" then
if trace_locating then
- logs.report("fileio","! lib '%s' located by basename via environment: '%s'",name,resolved)
+ report_libraries("! lib '%s' located by basename via environment: '%s'",name,resolved)
end
return loadfile(resolved)
end
if trace_locating then
- logs.report("fileio",'? unable to locate lib: %s',name)
+ report_libraries('? unable to locate lib: %s',name)
end
-- return "unable to locate " .. name
end
resolvers.loadlualib = require
+-- -- -- --
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['luat-kps'] = {
- version = 1.001,
- comment = "companion to luatools.lua",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
---[[ldx--
-<p>This file is used when we want the input handlers to behave like
-<type>kpsewhich</type>. What to do with the following:</p>
-
-<typing>
-{$SELFAUTOLOC,$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}
-$SELFAUTOLOC : /usr/tex/bin/platform
-$SELFAUTODIR : /usr/tex/bin
-$SELFAUTOPARENT : /usr/tex
-</typing>
+package.obsolete = package.obsolete or { }
-<p>How about just forgetting about them?</p>
---ldx]]--
+package.append_libpath = appendtolibpath -- will become obsolete
+package.prepend_libpath = prependtolibpath -- will become obsolete
-local suffixes = resolvers.suffixes
-local formats = resolvers.formats
-
-suffixes['gf'] = { '<resolution>gf' }
-suffixes['pk'] = { '<resolution>pk' }
-suffixes['base'] = { 'base' }
-suffixes['bib'] = { 'bib' }
-suffixes['bst'] = { 'bst' }
-suffixes['cnf'] = { 'cnf' }
-suffixes['mem'] = { 'mem' }
-suffixes['mf'] = { 'mf' }
-suffixes['mfpool'] = { 'pool' }
-suffixes['mft'] = { 'mft' }
-suffixes['mppool'] = { 'pool' }
-suffixes['graphic/figure'] = { 'eps', 'epsi' }
-suffixes['texpool'] = { 'pool' }
-suffixes['PostScript header'] = { 'pro' }
-suffixes['ist'] = { 'ist' }
-suffixes['web'] = { 'web', 'ch' }
-suffixes['cweb'] = { 'w', 'web', 'ch' }
-suffixes['cmap files'] = { 'cmap' }
-suffixes['lig files'] = { 'lig' }
-suffixes['bitmap font'] = { }
-suffixes['MetaPost support'] = { }
-suffixes['TeX system documentation'] = { }
-suffixes['TeX system sources'] = { }
-suffixes['dvips config'] = { }
-suffixes['type42 fonts'] = { }
-suffixes['web2c files'] = { }
-suffixes['other text files'] = { }
-suffixes['other binary files'] = { }
-suffixes['opentype fonts'] = { 'otf' }
-
-suffixes['fmt'] = { 'fmt' }
-suffixes['texmfscripts'] = { 'rb','lua','py','pl' }
-
-suffixes['pdftex config'] = { }
-suffixes['Troff fonts'] = { }
-
-suffixes['ls-R'] = { }
-
---[[ldx--
-<p>If you wondered abou tsome of the previous mappings, how about
-the next bunch:</p>
---ldx]]--
-
-formats['bib'] = ''
-formats['bst'] = ''
-formats['mft'] = ''
-formats['ist'] = ''
-formats['web'] = ''
-formats['cweb'] = ''
-formats['MetaPost support'] = ''
-formats['TeX system documentation'] = ''
-formats['TeX system sources'] = ''
-formats['Troff fonts'] = ''
-formats['dvips config'] = ''
-formats['graphic/figure'] = ''
-formats['ls-R'] = ''
-formats['other text files'] = ''
-formats['other binary files'] = ''
-
-formats['gf'] = ''
-formats['pk'] = ''
-formats['base'] = 'MFBASES'
-formats['cnf'] = ''
-formats['mem'] = 'MPMEMS'
-formats['mf'] = 'MFINPUTS'
-formats['mfpool'] = 'MFPOOL'
-formats['mppool'] = 'MPPOOL'
-formats['texpool'] = 'TEXPOOL'
-formats['PostScript header'] = 'TEXPSHEADERS'
-formats['cmap files'] = 'CMAPFONTS'
-formats['type42 fonts'] = 'T42FONTS'
-formats['web2c files'] = 'WEB2C'
-formats['pdftex config'] = 'PDFTEXCONFIG'
-formats['texmfscripts'] = 'TEXMFSCRIPTS'
-formats['bitmap font'] = ''
-formats['lig files'] = 'LIGFONTS'
+package.obsolete.append_libpath = appendtolibpath -- will become obsolete
+package.obsolete.prepend_libpath = prependtolibpath -- will become obsolete
end -- of closure
@@ -11547,49 +13660,54 @@ if not modules then modules = { } end modules ['data-aux'] = {
}
local find = string.find
+local type, next = type, next
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
-function resolvers.update_script(oldname,newname) -- oldname -> own.name, not per se a suffix
+local resolvers = resolvers
+
+local report_scripts = logs.reporter("resolvers","scripts")
+
+function resolvers.updatescript(oldname,newname) -- oldname -> own.name, not per se a suffix
local scriptpath = "scripts/context/lua"
newname = file.addsuffix(newname,"lua")
- local oldscript = resolvers.clean_path(oldname)
+ local oldscript = resolvers.cleanpath(oldname)
if trace_locating then
- logs.report("fileio","to be replaced old script %s", oldscript)
+ report_scripts("to be replaced old script %s", oldscript)
end
- local newscripts = resolvers.find_files(newname) or { }
+ local newscripts = resolvers.findfiles(newname) or { }
if #newscripts == 0 then
if trace_locating then
- logs.report("fileio","unable to locate new script")
+ report_scripts("unable to locate new script")
end
else
for i=1,#newscripts do
- local newscript = resolvers.clean_path(newscripts[i])
+ local newscript = resolvers.cleanpath(newscripts[i])
if trace_locating then
- logs.report("fileio","checking new script %s", newscript)
+ report_scripts("checking new script %s", newscript)
end
if oldscript == newscript then
if trace_locating then
- logs.report("fileio","old and new script are the same")
+ report_scripts("old and new script are the same")
end
elseif not find(newscript,scriptpath) then
if trace_locating then
- logs.report("fileio","new script should come from %s",scriptpath)
+ report_scripts("new script should come from %s",scriptpath)
end
elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
if trace_locating then
- logs.report("fileio","invalid new script name")
+ report_scripts("invalid new script name")
end
else
local newdata = io.loaddata(newscript)
if newdata then
if trace_locating then
- logs.report("fileio","old script content replaced by new content")
+ report_scripts("old script content replaced by new content")
end
io.savedata(oldscript,newdata)
break
elseif trace_locating then
- logs.report("fileio","unable to load new script")
+ report_scripts("unable to load new script")
end
end
end
@@ -11609,72 +13727,133 @@ if not modules then modules = { } end modules ['data-tmf'] = {
license = "see context related readme files"
}
-local find, gsub, match = string.find, string.gsub, string.match
-local getenv, setenv = os.getenv, os.setenv
+local resolvers = resolvers
--- loads *.tmf files in minimal tree roots (to be optimized and documented)
+local report_tds = logs.reporter("resolvers","tds")
-function resolvers.check_environment(tree)
- logs.simpleline()
- setenv('TMP', getenv('TMP') or getenv('TEMP') or getenv('TMPDIR') or getenv('HOME'))
- setenv('TEXOS', getenv('TEXOS') or ("texmf-" .. os.platform))
- setenv('TEXPATH', gsub(tree or "tex","\/+$",''))
- setenv('TEXMFOS', getenv('TEXPATH') .. "/" .. getenv('TEXOS'))
- logs.simpleline()
- logs.simple("preset : TEXPATH => %s", getenv('TEXPATH'))
- logs.simple("preset : TEXOS => %s", getenv('TEXOS'))
- logs.simple("preset : TEXMFOS => %s", getenv('TEXMFOS'))
- logs.simple("preset : TMP => %s", getenv('TMP'))
- logs.simple('')
-end
+-- = <<
+-- ? ??
+-- < +=
+-- > =+
-function resolvers.load_environment(name) -- todo: key=value as well as lua
- local f = io.open(name)
- if f then
- for line in f:lines() do
- if find(line,"^[%%%#]") then
- -- skip comment
- else
- local key, how, value = match(line,"^(.-)%s*([<=>%?]+)%s*(.*)%s*$")
- if how then
- value = gsub(value,"%%(.-)%%", function(v) return getenv(v) or "" end)
- if how == "=" or how == "<<" then
- setenv(key,value)
- elseif how == "?" or how == "??" then
- setenv(key,getenv(key) or value)
- elseif how == "<" or how == "+=" then
- if getenv(key) then
- setenv(key,getenv(key) .. io.fileseparator .. value)
- else
- setenv(key,value)
- end
- elseif how == ">" or how == "=+" then
- if getenv(key) then
- setenv(key,value .. io.pathseparator .. getenv(key))
- else
- setenv(key,value)
- end
- end
- end
- end
+function resolvers.load_tree(tree,resolve)
+ if type(tree) == "string" and tree ~= "" then
+
+ local getenv, setenv = resolvers.getenv, resolvers.setenv
+
+ -- later might listen to the raw osenv var as well
+ local texos = "texmf-" .. os.platform
+
+ local oldroot = environment.texroot
+ local newroot = file.collapsepath(tree)
+
+ local newtree = file.join(newroot,texos)
+ local newpath = file.join(newtree,"bin")
+
+ if not lfs.isdir(newtree) then
+ report_tds("no '%s' under tree %s",texos,tree)
+ os.exit()
end
- f:close()
+ if not lfs.isdir(newpath) then
+ report_tds("no '%s/bin' under tree %s",texos,tree)
+ os.exit()
+ end
+
+ local texmfos = newtree
+
+ environment.texroot = newroot
+ environment.texos = texos
+ environment.texmfos = texmfos
+
+ -- Beware, we need to obey the relocatable autoparent so we
+ -- set TEXMFCNF to its raw value. This is somewhat tricky when
+ -- we run a mkii job from within. Therefore, in mtxrun, there
+ -- is a resolve applied when we're in mkii/kpse mode.
+
+ setenv('SELFAUTOPARENT', newroot)
+ setenv('SELFAUTODIR', newtree)
+ setenv('SELFAUTOLOC', newpath)
+ setenv('TEXROOT', newroot)
+ setenv('TEXOS', texos)
+ setenv('TEXMFOS', texmfos)
+ setenv('TEXMFCNF', resolvers.luacnfspec, not resolve)
+ setenv("PATH", newpath .. io.pathseparator .. getenv("PATH"))
+
+ report_tds("changing from root '%s' to '%s'",oldroot,newroot)
+ report_tds("prepending '%s' to binary path",newpath)
+ report_tds()
end
end
-function resolvers.load_tree(tree)
- if tree and tree ~= "" then
- local setuptex = 'setuptex.tmf'
- if lfs.attributes(tree, "mode") == "directory" then -- check if not nil
- setuptex = tree .. "/" .. setuptex
- else
- setuptex = tree
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-lst'] = {
+ 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"
+}
+
+-- used in mtxrun, can be loaded later .. todo
+
+local find, concat, upper, format = string.find, table.concat, string.upper, string.format
+
+resolvers.listers = resolvers.listers or { }
+
+local resolvers = resolvers
+
+local report_lists = logs.reporter("resolvers","lists")
+
+local function tabstr(str)
+ if type(str) == 'table' then
+ return concat(str," | ")
+ else
+ return str
+ end
+end
+
+function resolvers.listers.variables(pattern)
+ local instance = resolvers.instance
+ local environment = instance.environment
+ local variables = instance.variables
+ local expansions = instance.expansions
+ local pattern = upper(pattern or "")
+ local configured = { }
+ local order = instance.order
+ for i=1,#order do
+ for k, v in next, order[i] do
+ if v ~= nil and configured[k] == nil then
+ configured[k] = v
+ end
end
- if io.exists(setuptex) then
- resolvers.check_environment(tree)
- resolvers.load_environment(setuptex)
+ end
+ local env = table.fastcopy(environment)
+ local var = table.fastcopy(variables)
+ local exp = table.fastcopy(expansions)
+ for key, value in table.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",resolvers.resolve(expansions[key]) or "unset")
end
end
+ instance.environment = table.fastcopy(env)
+ instance.variables = table.fastcopy(var)
+ instance.expansions = table.fastcopy(exp)
+end
+
+function resolvers.listers.configurations(report)
+ local configurations = resolvers.instance.specification
+ local report = report or texio.write_nl
+ for i=1,#configurations do
+ report(resolvers.resolve(configurations[i]))
+ end
end
@@ -11694,9 +13873,15 @@ if not modules then modules = { } end modules ['luat-sta'] = {
local gmatch, match = string.gmatch, string.match
local type = type
-states = states or { }
-states.data = states.data or { }
-states.hash = states.hash or { }
+states = states or { }
+local states = states
+
+states.data = states.data or { }
+local data = states.data
+
+states.hash = states.hash or { }
+local hash = states.hash
+
states.tag = states.tag or ""
states.filename = states.filename or ""
@@ -11706,7 +13891,7 @@ function states.save(filename,tag)
io.savedata(filename,
"-- generator : luat-sta.lua\n" ..
"-- state tag : " .. tag .. "\n\n" ..
- table.serialize(states.data[tag or states.tag] or {},true)
+ table.serialize(data[tag or states.tag] or {},true)
)
end
@@ -11714,11 +13899,11 @@ function states.load(filename,tag)
states.filename = filename
states.tag = tag or "whatever"
states.filename = file.addsuffix(states.filename,'lus')
- states.data[states.tag], states.hash[states.tag] = (io.exists(filename) and dofile(filename)) or { }, { }
+ data[states.tag], hash[states.tag] = (io.exists(filename) and dofile(filename)) or { }, { }
end
-function states.set_by_tag(tag,key,value,default,persistent)
- local d, h = states.data[tag], states.hash[tag]
+local function set_by_tag(tag,key,value,default,persistent)
+ local d, h = data[tag], hash[tag]
if d then
if type(d) == "table" then
local dkey, hkey = key, key
@@ -11738,8 +13923,10 @@ function states.set_by_tag(tag,key,value,default,persistent)
end
dkey, hkey = post, key
end
- if type(value) == nil then
- value = value or default
+ if value == nil then
+ value = default
+ elseif value == false then
+ -- special case
elseif persistent then
value = value or d[dkey] or default
else
@@ -11748,144 +13935,202 @@ function states.set_by_tag(tag,key,value,default,persistent)
d[dkey], h[hkey] = value, value
elseif type(d) == "string" then
-- weird
- states.data[tag], states.hash[tag] = value, value
+ data[tag], hash[tag] = value, value
end
end
end
-function states.get_by_tag(tag,key,default)
- local h = states.hash[tag]
+local function get_by_tag(tag,key,default)
+ local h = hash[tag]
if h and h[key] then
return h[key]
else
- local d = states.data[tag]
+ local d = data[tag]
if d then
for k in gmatch(key,"[^%.]+") do
local dk = d[k]
- if dk then
+ if dk ~= nil then
d = dk
else
return default
end
end
- return d or default
+ if d == false then
+ return false
+ else
+ return d or default
+ end
end
end
end
+states.set_by_tag = set_by_tag
+states.get_by_tag = get_by_tag
+
function states.set(key,value,default,persistent)
- states.set_by_tag(states.tag,key,value,default,persistent)
+ set_by_tag(states.tag,key,value,default,persistent)
end
function states.get(key,default)
- return states.get_by_tag(states.tag,key,default)
-end
-
---~ states.data.update = {
---~ ["version"] = {
---~ ["major"] = 0,
---~ ["minor"] = 1,
---~ },
---~ ["rsync"] = {
---~ ["server"] = "contextgarden.net",
---~ ["module"] = "minimals",
---~ ["repository"] = "current",
---~ ["flags"] = "-rpztlv --stats",
---~ },
---~ ["tasks"] = {
---~ ["update"] = true,
---~ ["make"] = true,
---~ ["delete"] = false,
---~ },
---~ ["platform"] = {
---~ ["host"] = true,
---~ ["other"] = {
---~ ["mswin"] = false,
---~ ["linux"] = false,
---~ ["linux-64"] = false,
---~ ["osx-intel"] = false,
---~ ["osx-ppc"] = false,
---~ ["sun"] = false,
---~ },
---~ },
---~ ["context"] = {
---~ ["available"] = {"current", "beta", "alpha", "experimental"},
---~ ["selected"] = "current",
---~ },
---~ ["formats"] = {
---~ ["cont-en"] = true,
---~ ["cont-nl"] = true,
---~ ["cont-de"] = false,
---~ ["cont-cz"] = false,
---~ ["cont-fr"] = false,
---~ ["cont-ro"] = false,
---~ },
---~ ["engine"] = {
---~ ["pdftex"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ ["pdftex"] = true,
---~ },
---~ },
---~ ["luatex"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ },
---~ },
---~ ["xetex"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ ["xetex"] = false,
---~ },
---~ },
---~ ["metapost"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ ["mpost"] = true,
---~ ["metafun"] = true,
---~ },
---~ },
---~ },
---~ ["fonts"] = {
---~ },
---~ ["doc"] = {
---~ },
---~ ["modules"] = {
---~ ["f-urwgaramond"] = false,
---~ ["f-urwgothic"] = false,
---~ ["t-bnf"] = false,
---~ ["t-chromato"] = false,
---~ ["t-cmscbf"] = false,
---~ ["t-cmttbf"] = false,
---~ ["t-construction-plan"] = false,
---~ ["t-degrade"] = false,
---~ ["t-french"] = false,
---~ ["t-lettrine"] = false,
---~ ["t-lilypond"] = false,
---~ ["t-mathsets"] = false,
---~ ["t-tikz"] = false,
---~ ["t-typearea"] = false,
---~ ["t-vim"] = false,
---~ },
---~ }
-
---~ states.save("teststate", "update")
---~ states.load("teststate", "update")
-
---~ print(states.get_by_tag("update","rsync.server","unknown"))
---~ states.set_by_tag("update","rsync.server","oeps")
---~ print(states.get_by_tag("update","rsync.server","unknown"))
---~ states.save("teststate", "update")
---~ states.load("teststate", "update")
---~ print(states.get_by_tag("update","rsync.server","unknown"))
+ return get_by_tag(states.tag,key,default)
+end
+
+
+
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['luat-fmt'] = {
+ version = 1.001,
+ comment = "companion to mtxrun",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+
+local format = string.format
+
+local report_format = logs.reporter("resolvers","formats")
+
+-- helper for mtxrun
+
+local quoted = string.quoted
+
+local function primaryflags() -- not yet ok
+ local trackers = environment.argument("trackers")
+ local directives = environment.argument("directives")
+ local flags = ""
+ if trackers and trackers ~= "" then
+ flags = flags .. "--trackers=" .. quoted(trackers)
+ end
+ if directives and directives ~= "" then
+ flags = flags .. "--directives=" .. quoted(directives)
+ end
+ return flags
+end
+
+function environment.make_format(name)
+ -- change to format path (early as we need expanded paths)
+ local olddir = lfs.currentdir()
+ local path = caches.getwritablepath("formats") or "" -- maybe platform
+ if path ~= "" then
+ lfs.chdir(path)
+ end
+ report_format("format path: %s",lfs.currentdir())
+ -- check source file
+ local texsourcename = file.addsuffix(name,"mkiv")
+ local fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
+ if fulltexsourcename == "" then
+ texsourcename = file.addsuffix(name,"tex")
+ fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
+ end
+ if fulltexsourcename == "" then
+ report_format("no tex source file with name: %s (mkiv or tex)",name)
+ lfs.chdir(olddir)
+ return
+ else
+ report_format("using tex source file: %s",fulltexsourcename)
+ end
+ local texsourcepath = dir.expandname(file.dirname(fulltexsourcename)) -- really needed
+ -- check specification
+ local specificationname = file.replacesuffix(fulltexsourcename,"lus")
+ local fullspecificationname = resolvers.findfile(specificationname,"tex") or ""
+ if fullspecificationname == "" then
+ specificationname = file.join(texsourcepath,"context.lus")
+ fullspecificationname = resolvers.findfile(specificationname,"tex") or ""
+ end
+ if fullspecificationname == "" then
+ report_format("unknown stub specification: %s",specificationname)
+ lfs.chdir(olddir)
+ return
+ end
+ local specificationpath = file.dirname(fullspecificationname)
+ -- load specification
+ local usedluastub = nil
+ local usedlualibs = dofile(fullspecificationname)
+ if type(usedlualibs) == "string" then
+ usedluastub = file.join(file.dirname(fullspecificationname),usedlualibs)
+ elseif type(usedlualibs) == "table" then
+ report_format("using stub specification: %s",fullspecificationname)
+ local texbasename = file.basename(name)
+ local luastubname = file.addsuffix(texbasename,"lua")
+ local lucstubname = file.addsuffix(texbasename,"luc")
+ -- pack libraries in stub
+ report_format("creating initialization file: %s",luastubname)
+ utilities.merger.selfcreate(usedlualibs,specificationpath,luastubname)
+ -- compile stub file (does not save that much as we don't use this stub at startup any more)
+ local strip = resolvers.booleanvariable("LUACSTRIP", true)
+ if utilities.lua.compile(luastubname,lucstubname) and lfs.isfile(lucstubname) then
+ report_format("using compiled initialization file: %s",lucstubname)
+ usedluastub = lucstubname
+ else
+ report_format("using uncompiled initialization file: %s",luastubname)
+ usedluastub = luastubname
+ end
+ else
+ report_format("invalid stub specification: %s",fullspecificationname)
+ lfs.chdir(olddir)
+ return
+ end
+ -- generate format
+ local command = format("luatex --ini %s --lua=%s %s %sdump",primaryflags(),quoted(usedluastub),quoted(fulltexsourcename),os.platform == "unix" and "\\\\" or "\\")
+ report_format("running command: %s\n",command)
+ os.spawn(command)
+ -- remove related mem files
+ local pattern = file.removesuffix(file.basename(usedluastub)).."-*.mem"
+ -- report_format("removing related mplib format with pattern '%s'", pattern)
+ local mp = dir.glob(pattern)
+ if mp then
+ for i=1,#mp do
+ local name = mp[i]
+ report_format("removing related mplib format %s", file.basename(name))
+ os.remove(name)
+ end
+ end
+ lfs.chdir(olddir)
+end
+
+function environment.run_format(name,data,more)
+ -- hm, rather old code here; we can now use the file.whatever functions
+ if name and name ~= "" then
+ local barename = file.removesuffix(name)
+ local fmtname = caches.getfirstreadablefile(file.addsuffix(barename,"fmt"),"formats")
+ if fmtname == "" then
+ fmtname = resolvers.findfile(file.addsuffix(barename,"fmt")) or ""
+ end
+ fmtname = resolvers.cleanpath(fmtname)
+ if fmtname == "" then
+ report_format("no format with name: %s",name)
+ else
+ local barename = file.removesuffix(name) -- expanded name
+ local luaname = file.addsuffix(barename,"luc")
+ if not lfs.isfile(luaname) then
+ luaname = file.addsuffix(barename,"lua")
+ end
+ if not lfs.isfile(luaname) then
+ report_format("using format name: %s",fmtname)
+ report_format("no luc/lua with name: %s",barename)
+ else
+ local command = format("luatex %s --fmt=%s --lua=%s %s %s",primaryflags(),quoted(barename),quoted(luaname),quoted(data),more ~= "" and quoted(more) or "")
+ report_format("running command: %s",command)
+ os.spawn(command)
+ end
+ end
+ end
+end
end -- of closure
-- end library merge
-own = { } -- not local
+own = { } -- not local, might change
+
+own.libs = { -- order can be made better
-own.libs = { -- todo: check which ones are really needed
'l-string.lua',
'l-lpeg.lua',
'l-table.lua',
@@ -11898,39 +14143,55 @@ own.libs = { -- todo: check which ones are really needed
'l-url.lua',
'l-dir.lua',
'l-boolean.lua',
+ 'l-unicode.lua',
'l-math.lua',
--- 'l-unicode.lua',
--- 'l-tex.lua',
- 'l-utils.lua',
- 'l-aux.lua',
--- 'l-xml.lua',
- 'trac-tra.lua',
+
+ 'util-tab.lua',
+ 'util-sto.lua',
+ 'util-mrg.lua',
+ 'util-lua.lua',
+ 'util-prs.lua',
+ 'util-fmt.lua',
+ 'util-deb.lua',
+
+ 'trac-inf.lua',
+ 'trac-set.lua',
+ 'trac-log.lua',
+ 'trac-pro.lua',
+
+ 'luat-env.lua', -- can come before inf (as in mkiv)
+
'lxml-tab.lua',
'lxml-lpt.lua',
--- 'lxml-ent.lua',
+ -- 'lxml-ent.lua',
'lxml-mis.lua',
'lxml-aux.lua',
'lxml-xml.lua',
- 'luat-env.lua',
- 'trac-inf.lua',
- 'trac-log.lua',
- 'data-res.lua',
+
+ 'data-ini.lua',
+ 'data-exp.lua',
+ 'data-env.lua',
'data-tmp.lua',
+ 'data-met.lua',
+ 'data-res.lua',
'data-pre.lua',
'data-inp.lua',
'data-out.lua',
+ 'data-fil.lua',
'data-con.lua',
'data-use.lua',
-- 'data-tex.lua',
-- 'data-bin.lua',
'data-zip.lua',
+ 'data-tre.lua',
'data-crl.lua',
'data-lua.lua',
- 'data-kps.lua', -- so that we can replace kpsewhich
'data-aux.lua', -- updater
- 'data-tmf.lua', -- tree files
- -- needed ?
- 'luat-sta.lua', -- states
+ 'data-tmf.lua',
+ 'data-lst.lua',
+
+ 'luat-sta.lua',
+ 'luat-fmt.lua',
}
-- We need this hack till luatex is fixed.
@@ -11943,35 +14204,62 @@ end
-- End of hack.
-own.name = (environment and environment.ownname) or arg[0] or 'luatools.lua'
+local format, gsub, gmatch, match = string.format, string.gsub, string.gmatch, string.match
+local concat = table.concat
+own.name = (environment and environment.ownname) or arg[0] or 'mtxrun.lua'
+own.path = gsub(match(own.name,"^(.+)[\\/].-$") or ".","\\","/")
+
+local ownpath, owntree = own.path, environment and environment.ownpath or own.path
+
+own.list = {
+ '.',
+ ownpath ,
+ ownpath .. "/../sources", -- HH's development path
+ owntree .. "/../../texmf-local/tex/context/base",
+ owntree .. "/../../texmf-context/tex/context/base",
+ owntree .. "/../../texmf-dist/tex/context/base",
+ owntree .. "/../../texmf/tex/context/base",
+ owntree .. "/../../../texmf-local/tex/context/base",
+ owntree .. "/../../../texmf-context/tex/context/base",
+ owntree .. "/../../../texmf-dist/tex/context/base",
+ owntree .. "/../../../texmf/tex/context/base",
+}
-own.path = string.match(own.name,"^(.+)[\\/].-$") or "."
-own.list = { '.' }
-if own.path ~= '.' then
- table.insert(own.list,own.path)
-end
-table.insert(own.list,own.path.."/../../texmf-dist/tex/context/base")
-table.insert(own.list,own.path.."/../../../tex/context/base")
-table.insert(own.list,own.path.."/mtx")
-table.insert(own.list,own.path.."/../sources")
+if own.path == "." then table.remove(own.list,1) end
local function locate_libs()
- for _, lib in pairs(own.libs) do
- for _, pth in pairs(own.list) do
- local filename = string.gsub(pth .. "/" .. lib,"\\","/")
+ for l=1,#own.libs do
+ local lib = own.libs[l]
+ for p =1,#own.list do
+ local pth = own.list[p]
+ local filename = pth .. "/" .. lib
+ local found = lfs.isfile(filename)
+ if found then
+ package.path = package.path .. ";" .. pth .. "/?.lua" -- in case l-* does a require
+ return pth
+ end
+ end
+ end
+end
+
+local function load_libs()
+ local found = locate_libs()
+ if found then
+ for l=1,#own.libs do
+ local filename = found .. "/" .. own.libs[l]
local codeblob = loadfile(filename)
if codeblob then
codeblob()
- own.list = { pth } -- speed up te search
- break
end
end
+ else
+ resolvers = nil
end
end
if not resolvers then
- locate_libs()
+ load_libs()
end
if not resolvers then
@@ -11983,20 +14271,56 @@ if not resolvers then
os.exit()
end
-logs.setprogram('MTXrun',"TDS Runner Tool 1.24",environment.arguments["verbose"] or false)
+-- verbosity
-local instance = resolvers.reset()
+local e_verbose = environment.arguments["verbose"]
-local trackspec = environment.argument("trackers") or environment.argument("track")
+if e_verbose then
+ trackers.enable("resolvers.locating")
+end
+
+-- some common flags (also passed through environment)
+
+local e_silent = environment.argument("silent")
+local e_noconsole = environment.argument("noconsole")
+
+local e_trackers = environment.argument("trackers")
+local e_directives = environment.argument("directives")
+local e_experiments = environment.argument("experiments")
+
+if e_silent == true then
+ e_silent = "*"
+end
+
+if type(e_silent) == "string" then
+ if type(e_directives) == "string" then
+ e_directives = format("%s,logs.blocked={%s}",e_directives,e_silent)
+ else
+ e_directives = format("logs.blocked={%s}",e_silent)
+ end
+end
-if trackspec then
- trackers.enable(trackspec)
+if e_noconsole then
+ if type(e_directives) == "string" then
+ e_directives = format("%s,logs.target=file",e_directives)
+ else
+ e_directives = format("logs.target=file")
+ end
end
-runners = runners or { } -- global
-messages = messages or { }
+if e_trackers then trackers .enable(e_trackers) end
+if e_directives then directives .enable(e_directives) end
+if e_experiments then experiments.enable(e_experiments) end
-messages.help = [[
+if not environment.trackers then environment.trackers = e_trackers end
+if not environment.directives then environment.directives = e_directives end
+if not environment.experiments then environment.experiments = e_experiments end
+
+--
+
+local instance = resolvers.reset()
+
+local helpinfo = [[
--script run an mtx script (lua prefered method) (--noquotes), no script gives list
--execute run a script or program (texmfstart method) (--noquotes)
--resolve resolve prefixed arguments
@@ -12011,15 +14335,14 @@ messages.help = [[
--ifchanged=filename only execute when given file has changed (md checksum)
--iftouched=old,new only execute when given file has changed (time stamp)
---make create stubs for (context related) scripts
---remove remove stubs (context related) scripts
+--makestubs create stubs for (context related) scripts
+--removestubs remove stubs (context related) scripts
--stubpath=binpath paths where stubs wil be written
--windows create windows (mswin) stubs
--unix create unix (linux) stubs
--verbose give a bit more info
--trackers=list enable given trackers
---engine=str target engine
--progname=str format or backend
--edit launch editor with found file
@@ -12032,8 +14355,35 @@ messages.help = [[
--forcekpse force using kpse (handy when no mkiv and cache installed but less functionality)
--prefixes show supported prefixes
+
+--generate generate file database
+
+--variables show configuration variables
+--configurations show configuration order
+
+--expand-braces expand complex variable
+--expand-path expand variable (resolve paths)
+--expand-var expand variable (resolve references)
+--show-path show path expansion of ...
+--var-value report value of variable
+--find-file report file location
+--find-path report path of file
+
+--pattern=str filter variables
]]
+local application = logs.application {
+ name = "mtxrun",
+ banner = "ConTeXt TDS Runner Tool 1.30",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
+messages = messages or { } -- for the moment
+
+runners = runners or { } -- global (might become local)
+
runners.applications = {
["lua"] = "luatex --luaonly",
["luc"] = "luatex --luaonly",
@@ -12056,7 +14406,7 @@ runners.registered = {
makempy = { 'makempy.pl', true },
mptopdf = { 'mptopdf.pl', true },
pstopdf = { 'pstopdf.rb', true }, -- converts ps (and some more) images, does some cleaning (replaced)
--- examplex = { 'examplex.rb', false },
+ -- examplex = { 'examplex.rb', false },
concheck = { 'concheck.rb', false },
runtools = { 'runtools.rb', true },
textools = { 'textools.rb', true },
@@ -12065,9 +14415,9 @@ runners.registered = {
rlxtools = { 'rlxtools.rb', true },
pdftools = { 'pdftools.rb', true },
mpstools = { 'mpstools.rb', true },
--- exatools = { 'exatools.rb', true },
+ -- exatools = { 'exatools.rb', true },
xmltools = { 'xmltools.rb', true },
--- luatools = { 'luatools.lua', true },
+ -- luatools = { 'luatools.lua', true },
mtxtools = { 'mtxtools.rb', true },
pdftrimwhite = { 'pdftrimwhite.pl', false }
}
@@ -12086,45 +14436,39 @@ end
function runners.prepare()
local checkname = environment.argument("ifchanged")
- if checkname and checkname ~= "" then
+ if type(checkname) == "string" and checkname ~= "" then
local oldchecksum = file.loadchecksum(checkname)
local newchecksum = file.checksum(checkname)
if oldchecksum == newchecksum then
- logs.simple("file '%s' is unchanged",checkname)
+ if e_verbose then
+ report("file '%s' is unchanged",checkname)
+ end
return "skip"
- else
- logs.simple("file '%s' is changed, processing started",checkname)
+ elseif e_verbose then
+ report("file '%s' is changed, processing started",checkname)
end
file.savechecksum(checkname)
end
- local oldname, newname = string.split(environment.argument("iftouched") or "", ",")
- if oldname and newname and oldname ~= "" and newname ~= "" then
- if not file.needs_updating(oldname,newname) then
- logs.simple("file '%s' and '%s' have same age",oldname,newname)
- return "skip"
- else
- logs.simple("file '%s' is older than '%s'",oldname,newname)
- end
- end
- local tree = environment.argument('tree') or ""
- if environment.argument('autotree') then
- tree = os.getenv('TEXMFSTART_TREE') or os.getenv('TEXMFSTARTTREE') or tree
- end
- if tree and tree ~= "" then
- resolvers.load_tree(tree)
- end
- local env = environment.argument('environment') or ""
- if env and env ~= "" then
- for _,e in pairs(string.split(env)) do
- -- maybe force suffix when not given
- resolvers.load_tree(e)
+ local touchname = environment.argument("iftouched")
+ if type(touchname) == "string" and touchname ~= "" then
+ local oldname, newname = string.split(touchname, ",")
+ if oldname and newname and oldname ~= "" and newname ~= "" then
+ if not file.needs_updating(oldname,newname) then
+ if e_verbose then
+ report("file '%s' and '%s' have same age",oldname,newname)
+ end
+ return "skip"
+ elseif e_verbose then
+ report("file '%s' is older than '%s'",oldname,newname)
+ end
end
end
local runpath = environment.argument("path")
- if runpath and not lfs.chdir(runpath) then
- logs.simple("unable to change to path '%s'",runpath)
+ if type(runpath) == "string" and not lfs.chdir(runpath) then
+ report("unable to change to path '%s'",runpath)
return "error"
end
+ runners.prepare = function() end
return "run"
end
@@ -12137,8 +14481,6 @@ function runners.execute_script(fullname,internal,nosplit)
elseif state == 'skip' then
return true
elseif state == "run" then
- instance.progname = environment.argument("progname") or instance.progname
- instance.format = environment.argument("format") or instance.format
local path, name, suffix, result = file.dirname(fullname), file.basename(fullname), file.extname(fullname), ""
if path ~= "" then
result = fullname
@@ -12155,21 +14497,21 @@ function runners.execute_script(fullname,internal,nosplit)
if suffix == "" then
-- loop over known suffixes
for _,s in pairs(runners.suffixes) do
- result = resolvers.find_file(name .. "." .. s, 'texmfscripts')
+ result = resolvers.findfile(name .. "." .. s, 'texmfscripts')
if result ~= "" then
break
end
end
elseif runners.applications[suffix] then
- result = resolvers.find_file(name, 'texmfscripts')
+ result = resolvers.findfile(name, 'texmfscripts')
else
-- maybe look on path
- result = resolvers.find_file(name, 'other text files')
+ result = resolvers.findfile(name, 'other text files')
end
end
if result and result ~= "" then
if not no_split then
- local before, after = environment.split_arguments(fullname) -- already done
+ local before, after = environment.splitarguments(fullname) -- already done
environment.arguments_before, environment.arguments_after = before, after
end
if internal then
@@ -12181,12 +14523,12 @@ function runners.execute_script(fullname,internal,nosplit)
if binary and binary ~= "" then
result = binary .. " " .. result
end
- local command = result .. " " .. environment.reconstruct_commandline(environment.arguments_after,noquote)
- if logs.verbose then
- logs.simpleline()
- logs.simple("executing: %s",command)
- logs.simpleline()
- logs.simpleline()
+ local command = result .. " " .. environment.reconstructcommandline(environment.arguments_after,noquote)
+ if e_verbose then
+ report()
+ report("executing: %s",command)
+ report()
+ report()
io.flush()
end
-- no os.exec because otherwise we get the wrong return value
@@ -12196,14 +14538,14 @@ function runners.execute_script(fullname,internal,nosplit)
else
if binary then
binary = file.addsuffix(binary,os.binsuffix)
- for p in string.gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
+ for p in gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
if lfs.isfile(file.join(p,binary)) then
return false
end
end
- logs.simpleline()
- logs.simple("This script needs '%s' which seems not to be installed.",binary)
- logs.simpleline()
+ report()
+ report("This script needs '%s' which seems not to be installed.",binary)
+ report()
end
return false
end
@@ -12223,14 +14565,15 @@ function runners.execute_program(fullname)
elseif state == 'skip' then
return true
elseif state == "run" then
- local before, after = environment.split_arguments(fullname)
- environment.initialize_arguments(after)
+ local before, after = environment.splitarguments(fullname)
+ for k=1,#after do after[k] = resolvers.resolve(after[k]) end
+ environment.initializearguments(after)
fullname = fullname:gsub("^bin:","")
- local command = fullname .. " " .. (environment.reconstruct_commandline(after or "",noquote) or "")
- logs.simpleline()
- logs.simple("executing: %s",command)
- logs.simpleline()
- logs.simpleline()
+ local command = fullname .. " " .. (environment.reconstructcommandline(after or "",noquote) or "")
+ report()
+ report("executing: %s",command)
+ report()
+ report()
io.flush()
local code = os.exec(command) -- (fullname,unpack(after)) does not work / maybe spawn
return code == 0
@@ -12239,7 +14582,7 @@ function runners.execute_program(fullname)
return false
end
--- the --usekpse flag will fallback on kpse (hm, we can better update mtx-stubs)
+-- the --usekpse flag will fallback (not default) on kpse (hm, we can better update mtx-stubs)
local windows_stub = '@echo off\013\010setlocal\013\010set ownpath=%%~dp0%%\013\010texlua "%%ownpath%%mtxrun.lua" --usekpse --execute %s %%*\013\010endlocal\013\010'
local unix_stub = '#!/bin/sh\010mtxrun --usekpse --execute %s \"$@\"\010'
@@ -12258,22 +14601,22 @@ function runners.handle_stubs(create)
for _,v in pairs(runners.registered) do
local name, doit = v[1], v[2]
if doit then
- local base = string.gsub(file.basename(name), "%.(.-)$", "")
+ local base = gsub(file.basename(name), "%.(.-)$", "")
if create then
if windows then
- io.savedata(file.join(stubpath,base..".bat"),string.format(windows_stub,name))
- logs.simple("windows stub for '%s' created",base)
+ io.savedata(file.join(stubpath,base..".bat"),format(windows_stub,name))
+ report("windows stub for '%s' created",base)
end
if unix then
- io.savedata(file.join(stubpath,base),string.format(unix_stub,name))
- logs.simple("unix stub for '%s' created",base)
+ io.savedata(file.join(stubpath,base),format(unix_stub,name))
+ report("unix stub for '%s' created",base)
end
else
if windows and (os.remove(file.join(stubpath,base..'.bat')) or os.remove(file.join(stubpath,base..'.cmd'))) then
- logs.simple("windows stub for '%s' removed", base)
+ report("windows stub for '%s' removed", base)
end
if unix and (os.remove(file.join(stubpath,base)) or os.remove(file.join(stubpath,base..'.sh'))) then
- logs.simple("unix stub for '%s' removed",base)
+ report("unix stub for '%s' removed",base)
end
end
end
@@ -12289,7 +14632,7 @@ end
function runners.locate_file(filename)
-- differs from texmfstart where locate appends .com .exe .bat ... todo
if filename and filename ~= "" then
- runners.report_location(resolvers.find_given_file(filename))
+ runners.report_location(resolvers.findgivenfile(filename))
end
end
@@ -12298,28 +14641,28 @@ function runners.locate_platform()
end
function runners.report_location(result)
- if logs.verbose then
- logs.simpleline()
+ if e_verbose then
+ reportline()
if result and result ~= "" then
- logs.simple(result)
+ report(result)
else
- logs.simple("not found")
+ report("not found")
end
else
io.write(result)
end
end
-function runners.edit_script(filename) -- we assume that vim is present on most systems
- local editor = os.getenv("MTXRUN_EDITOR") or os.getenv("TEXMFSTART_EDITOR") or os.getenv("EDITOR") or 'vim'
+function runners.edit_script(filename) -- we assume that gvim is present on most systems (todo: also in cnf file)
+ local editor = os.getenv("MTXRUN_EDITOR") or os.getenv("TEXMFSTART_EDITOR") or os.getenv("EDITOR") or 'gvim'
local rest = resolvers.resolve(filename)
if rest ~= "" then
local command = editor .. " " .. rest
- if logs.verbose then
- logs.simpleline()
- logs.simple("starting editor: %s",command)
- logs.simple_line()
- logs.simple_line()
+ if e_verbose then
+ report()
+ report("starting editor: %s",command)
+ report()
+ report()
end
os.launch(command)
end
@@ -12362,33 +14705,33 @@ end
function runners.launch_file(filename)
instance.allresults = true
- logs.setverbose(true)
+ trackers.enable("resolvers.locating")
local pattern = environment.arguments["pattern"]
if not pattern or pattern == "" then
pattern = filename
end
if not pattern or pattern == "" then
- logs.simple("provide name or --pattern=")
+ report("provide name or --pattern=")
else
- local t = resolvers.find_files(pattern)
+ local t = resolvers.findfiles(pattern)
if not t or #t == 0 then
- t = resolvers.find_files("*/" .. pattern)
+ t = resolvers.findfiles("*/" .. pattern)
end
if not t or #t == 0 then
- t = resolvers.find_files("*/" .. pattern .. "*")
+ t = resolvers.findfiles("*/" .. pattern .. "*")
end
if t and #t > 0 then
if environment.arguments["all"] then
for _, v in pairs(t) do
- logs.simple("launching %s", v)
+ report("launching %s", v)
resolvers.launch(v)
end
else
- logs.simple("launching %s", t[1])
+ report("launching %s", t[1])
resolvers.launch(t[1])
end
else
- logs.simple("no match for %s", pattern)
+ report("no match for %s", pattern)
end
end
end
@@ -12421,33 +14764,45 @@ function runners.find_mtx_script(filename)
local mtxprefix = (filename:find("^mtx%-") and "") or "mtx-"
-- context namespace, mtx-<filename>
fullname = mtxprefix .. filename
- fullname = found(fullname) or resolvers.find_file(fullname)
+ fullname = found(fullname) or resolvers.findfile(fullname)
if fullname and fullname ~= "" then
return fullname
end
-- context namespace, mtx-<filename>s
fullname = mtxprefix .. basename .. "s" .. "." .. suffix
- fullname = found(fullname) or resolvers.find_file(fullname)
+ fullname = found(fullname) or resolvers.findfile(fullname)
if fullname and fullname ~= "" then
return fullname
end
-- context namespace, mtx-<filename minus trailing s>
fullname = mtxprefix .. basename:gsub("s$","") .. "." .. suffix
- fullname = found(fullname) or resolvers.find_file(fullname)
+ fullname = found(fullname) or resolvers.findfile(fullname)
if fullname and fullname ~= "" then
return fullname
end
-- context namespace, just <filename>
- fullname = resolvers.find_file(filename)
+ fullname = resolvers.findfile(filename)
return fullname
end
-function runners.execute_ctx_script(filename)
+function runners.register_arguments(...)
+ local arguments = environment.arguments_after
+ local passedon = { ... }
+ for i=#passedon,1,-1 do
+ local pi = passedon[i]
+ if pi then
+ table.insert(arguments,1,pi)
+ end
+ end
+end
+
+function runners.execute_ctx_script(filename,...)
+ runners.register_arguments(...)
local arguments = environment.arguments_after
local fullname = runners.find_mtx_script(filename) or ""
if file.extname(fullname) == "cld" then
-- handy in editors where we force --autopdf
- logs.simple("running cld script: %s",filename)
+ report("running cld script: %s",filename)
table.insert(arguments,1,fullname)
table.insert(arguments,"--autopdf")
fullname = runners.find_mtx_script("context") or ""
@@ -12455,7 +14810,7 @@ function runners.execute_ctx_script(filename)
-- retry after generate but only if --autogenerate
if fullname == "" and environment.argument("autogenerate") then -- might become the default
instance.renewcache = true
- logs.setverbose(true)
+ trackers.enable("resolvers.locating")
resolvers.load()
--
fullname = runners.find_mtx_script(filename) or ""
@@ -12470,7 +14825,7 @@ function runners.execute_ctx_script(filename)
elseif state == "run" then
-- load and save ... kind of undocumented
arg = { } for _,v in pairs(arguments) do arg[#arg+1] = resolvers.resolve(v) end
- environment.initialize_arguments(arg)
+ environment.initializearguments(arg)
local loadname = environment.arguments['load']
if loadname then
if type(loadname) ~= "string" then loadname = file.basename(fullname) end
@@ -12478,8 +14833,8 @@ function runners.execute_ctx_script(filename)
runners.load_script_session(loadname)
end
filename = environment.files[1]
- if logs.verbose then
- logs.simple("using script: %s\n",fullname)
+ if e_verbose then
+ report("using script: %s\n",fullname)
end
environment.ownscript = fullname
dofile(fullname)
@@ -12495,44 +14850,42 @@ function runners.execute_ctx_script(filename)
return true
end
else
- -- logs.setverbose(true)
if filename == "" or filename == "help" then
- local context = resolvers.find_file("mtx-context.lua")
- logs.setverbose(true)
+ local context = resolvers.findfile("mtx-context.lua")
+ trackers.enable("resolvers.locating")
if context ~= "" then
- local result = dir.glob((string.gsub(context,"mtx%-context","mtx-*"))) -- () needed
+ local result = dir.glob((gsub(context,"mtx%-context","mtx-*"))) -- () needed
local valid = { }
table.sort(result)
for i=1,#result do
local scriptname = result[i]
- local scriptbase = string.match(scriptname,".*mtx%-([^%-]-)%.lua")
+ local scriptbase = match(scriptname,".*mtx%-([^%-]-)%.lua")
if scriptbase then
local data = io.loaddata(scriptname)
- local banner, version = string.match(data,"[\n\r]logs%.extendbanner%s*%(%s*[\"\']([^\n\r]+)%s*(%d+%.%d+)")
+ local banner, version = match(data,"[\n\r]logs%.extendbanner%s*%(%s*[\"\']([^\n\r]+)%s*(%d+%.%d+)")
if banner then
valid[#valid+1] = { scriptbase, version, banner }
end
end
end
if #valid > 0 then
- logs.reportbanner()
- logs.reportline()
- logs.simple("no script name given, known scripts:")
- logs.simple()
+ application.identify()
+ report("no script name given, known scripts:")
+ report()
for k=1,#valid do
local v = valid[k]
- logs.simple("%-12s %4s %s",v[1],v[2],v[3])
+ report("%-12s %4s %s",v[1],v[2],v[3])
end
end
else
- logs.simple("no script name given")
+ report("no script name given")
end
else
filename = file.addsuffix(filename,"lua")
if file.is_qualified_path(filename) then
- logs.simple("unknown script '%s'",filename)
+ report("unknown script '%s'",filename)
else
- logs.simple("unknown script '%s' or 'mtx-%s'",filename,filename)
+ report("unknown script '%s' or 'mtx-%s'",filename,filename)
end
end
return false
@@ -12540,9 +14893,9 @@ function runners.execute_ctx_script(filename)
end
function runners.prefixes()
- logs.reportbanner()
- logs.reportline()
- logs.simple(table.concat(resolvers.allprefixes(true)," "))
+ application.identify()
+ report()
+ report(concat(resolvers.allprefixes(true)," "))
end
function runners.timedrun(filename) -- just for me
@@ -12562,13 +14915,11 @@ end
local filename = environment.files[1] or ""
local ok = true
-local before, after = environment.split_arguments(filename)
+local before, after = environment.splitarguments(filename)
environment.arguments_before, environment.arguments_after = before, after
-environment.initialize_arguments(before)
+environment.initializearguments(before)
-instance.engine = environment.argument("engine") or 'luatex'
-instance.progname = environment.argument("progname") or 'context'
-instance.lsrmode = environment.argument("lsr") or false
+instance.lsrmode = environment.argument("lsr") or false
-- maybe the unset has to go to this level
@@ -12576,36 +14927,40 @@ local is_mkii_stub = runners.registered[file.removesuffix(file.basename(filename
if environment.argument("usekpse") or environment.argument("forcekpse") or is_mkii_stub then
+ resolvers.load_tree(environment.argument('tree'),true) -- force resolve of TEXMFCNF
+
os.setenv("engine","")
os.setenv("progname","")
local remapper = {
- otf = "opentype fonts",
- ttf = "truetype fonts",
- ttc = "truetype fonts",
- pfb = "type1 fonts",
+ otf = "opentype fonts",
+ ttf = "truetype fonts",
+ ttc = "truetype fonts",
+ pfb = "type1 fonts",
other = "other text files",
}
+ local progname = environment.argument("progname") or 'context'
+
local function kpse_initialized()
texconfig.kpse_init = true
local t = os.clock()
- local k = kpse.original.new("luatex",instance.progname)
+ local k = kpse.original.new("luatex",progname)
local dummy = k:find_file("mtxrun.lua") -- so that we're initialized
- logs.simple("kpse fallback with progname '%s' initialized in %s seconds",instance.progname,os.clock()-t)
+ report("kpse fallback with progname '%s' initialized in %s seconds",progname,os.clock()-t)
kpse_initialized = function() return k end
return k
end
- local find_file = resolvers.find_file
- local show_path = resolvers.show_path
+ local findfile = resolvers.findfile
+ local showpath = resolvers.showpath
if environment.argument("forcekpse") then
- function resolvers.find_file(name,kind)
- return (kpse_initialized():find_file(resolvers.clean_path(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
+ function resolvers.findfile(name,kind)
+ return (kpse_initialized():find_file(resolvers.cleanpath(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
end
- function resolvers.show_path(name)
+ function resolvers.showpath(name)
return (kpse_initialized():show_path(name)) or ""
end
@@ -12613,16 +14968,16 @@ if environment.argument("usekpse") or environment.argument("forcekpse") or is_mk
resolvers.load()
- function resolvers.find_file(name,kind)
- local found = find_file(name,kind) or ""
+ function resolvers.findfile(name,kind)
+ local found = findfile(name,kind) or ""
if found ~= "" then
return found
else
- return (kpse_initialized():find_file(resolvers.clean_path(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
+ return (kpse_initialized():find_file(resolvers.cleanpath(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
end
end
- function resolvers.show_path(name)
- local found = show_path(name) or ""
+ function resolvers.showpath(name)
+ local found = showpath(name) or ""
if found ~= "" then
return found
else
@@ -12632,80 +14987,317 @@ if environment.argument("usekpse") or environment.argument("forcekpse") or is_mk
end
+ function runners.loadbase()
+ end
+
else
- resolvers.load()
+ function runners.loadbase(...)
+ if not resolvers.load(...) then
+ report("forcing cache reload")
+ instance.renewcache = true
+ trackers.enable("resolvers.locating")
+ if not resolvers.load(...) then
+ report("the resolver databases are not present or outdated")
+ end
+ end
+ end
+
+ resolvers.load_tree(environment.argument('tree'))
end
+
if environment.argument("selfmerge") then
+
-- embed used libraries
- utils.merger.selfmerge(own.name,own.libs,own.list)
+
+ runners.loadbase()
+ local found = locate_libs()
+ if found then
+ utilities.merger.selfmerge(own.name,own.libs,{ found })
+ end
+
elseif environment.argument("selfclean") then
+
-- remove embedded libraries
- utils.merger.selfclean(own.name)
+
+ runners.loadbase()
+ utilities.merger.selfclean(own.name)
+
elseif environment.argument("selfupdate") then
- logs.setverbose(true)
- resolvers.update_script(own.name,"mtxrun")
+
+ runners.loadbase()
+ trackers.enable("resolvers.locating")
+ resolvers.updatescript(own.name,"mtxrun")
+
elseif environment.argument("ctxlua") or environment.argument("internal") then
+
-- run a script by loading it (using libs)
+
+ runners.loadbase()
ok = runners.execute_script(filename,true)
+
elseif environment.argument("script") or environment.argument("scripts") then
+
-- run a script by loading it (using libs), pass args
+
+ runners.loadbase()
if is_mkii_stub then
- -- execute mkii script
ok = runners.execute_script(filename,false,true)
else
ok = runners.execute_ctx_script(filename)
end
+
elseif environment.argument("execute") then
+
-- execute script
+
+ runners.loadbase()
ok = runners.execute_script(filename)
+
elseif environment.argument("direct") then
+
-- equals bin:
+
+ runners.loadbase()
ok = runners.execute_program(filename)
+
elseif environment.argument("edit") then
+
-- edit file
+
+ runners.loadbase()
runners.edit_script(filename)
+
elseif environment.argument("launch") then
+
+ runners.loadbase()
runners.launch_file(filename)
-elseif environment.argument("make") then
- -- make stubs
+
+elseif environment.argument("makestubs") then
+
+ -- make stubs (depricated)
+
runners.handle_stubs(true)
-elseif environment.argument("remove") then
- -- remove stub
+
+elseif environment.argument("removestubs") then
+
+ -- remove stub (depricated)
+
+ runners.loadbase()
runners.handle_stubs(false)
+
elseif environment.argument("resolve") then
+
-- resolve string
+
+ runners.loadbase()
runners.resolve_string(filename)
+
elseif environment.argument("locate") then
+
-- locate file
+
+ runners.loadbase()
runners.locate_file(filename)
-elseif environment.argument("platform")then
+
+elseif environment.argument("platform") or environment.argument("show-platform") then
+
-- locate platform
+
+ runners.loadbase()
runners.locate_platform()
+
elseif environment.argument("prefixes") then
+
+ runners.loadbase()
runners.prefixes()
+
elseif environment.argument("timedrun") then
+
-- locate platform
+
+ runners.loadbase()
runners.timedrun(filename)
+
+elseif environment.argument("variables") or environment.argument("show-variables") or environment.argument("expansions") or environment.argument("show-expansions") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expansions",filename)
+
+ resolvers.load("nofiles")
+ resolvers.listers.variables(environment.argument("pattern"))
+
+elseif environment.argument("configurations") or environment.argument("show-configurations") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--configurations",filename)
+
+ resolvers.load("nofiles")
+ resolvers.listers.configurations()
+
+elseif environment.argument("find-file") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--find-file",filename)
+
+ resolvers.load()
+ local e_pattern = environment.argument("pattern")
+ local e_format = environment.arguments("format")
+ if not e_pattern then
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.findfiles,environment.files,e_format)
+ elseif type(e_pattern) == "string" then
+ instance.allresults = true -- brrrr
+ resolvers.dowithfilesandreport(resolvers.findfiles,{ e_pattern }, e_format)
+ end
+
+elseif environment.argument("find-path") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--find-path",filename)
+
+ resolvers.load()
+ local path = resolvers.findpath(filename, instance.my_format)
+ if e_verbose then
+ report(path)
+ else
+ print(path)
+ end
+
+elseif environment.argument("expand-braces") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expand-braces",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.expandbraces, environment.files)
+
+elseif environment.argument("expand-path") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expand-path",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.expandpath, environment.files)
+
+elseif environment.argument("expand-var") or environment.argument("expand-variable") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expand-var",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.expansion, environment.files)
+
+elseif environment.argument("show-path") or environment.argument("path-value") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--show-path",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.showpath, environment.files)
+
+elseif environment.argument("var-value") or environment.argument("show-value") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--show-value",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.variable,environment.files)
+
+elseif environment.argument("format-path") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--format-path",filename)
+
+ resolvers.load()
+ report(caches.getwritablepath("format"))
+
+elseif environment.argument("pattern") then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--pattern='" .. environment.argument("pattern") .. "'",filename)
+
+elseif environment.argument("generate") then
+
+ -- luatools
+
+ instance.renewcache = true
+ trackers.enable("resolvers.locating")
+ resolvers.load()
+
+elseif environment.argument("make") or environment.argument("ini") or environment.argument("compile") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--make",filename)
+
+ resolvers.load()
+ trackers.enable("resolvers.locating")
+ environment.make_format(filename)
+
+elseif environment.argument("run") then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--run",filename)
+
+elseif environment.argument("fmt") then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--fmt",filename)
+
+elseif environment.argument("help") and filename=='base' then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--help")
+
elseif environment.argument("help") or filename=='help' or filename == "" then
- logs.help(messages.help)
- -- execute script
+
+ application.help()
+
elseif filename:find("^bin:") then
+
+ runners.loadbase()
ok = runners.execute_program(filename)
+
elseif is_mkii_stub then
+
-- execute mkii script
+
+ runners.loadbase()
ok = runners.execute_script(filename,false,true)
-else
+
+elseif false then
+
+ runners.loadbase()
ok = runners.execute_ctx_script(filename)
if not ok then
ok = runners.execute_script(filename)
end
+
+elseif environment.files[1] == 'texmfcnf.lua' then -- so that we don't need to load mtx-base
+
+ resolvers.load("nofiles")
+ resolvers.listers.configurations()
+
+else
+
+ runners.loadbase()
+ runners.execute_ctx_script("mtx-base",filename)
+
+end
+
+if e_verbose then
+ report()
+ report("runtime: %0.3f seconds",os.runtime())
end
-if os.platform == "unix" then
- io.write("\n")
+if os.type ~= "windows" then
+ texio.write("\n") -- is this still valid?
end
if ok == false then ok = 1 elseif ok == true then ok = 0 end
diff --git a/Master/texmf-dist/scripts/context/perl/mptopdf.pl b/Master/texmf-dist/scripts/context/perl/mptopdf.pl
index ec08c5306b3..42db9001ec4 100755
--- a/Master/texmf-dist/scripts/context/perl/mptopdf.pl
+++ b/Master/texmf-dist/scripts/context/perl/mptopdf.pl
@@ -27,27 +27,30 @@ use File::Basename ;
$Getopt::Long::passthrough = 1 ; # no error message
$Getopt::Long::autoabbrev = 1 ; # partial switch accepted
-my $Help = 0;
-my $Latex = 0;
-my $RawMP = 1;
+my $Help = 0 ;
+my $Latex = 0 ;
+my $TeXexec = 0 ;
+my $RawMP = 1 ;
my $MetaFun = 0 ;
-my $PassOn = '' ;
+my $PassOn = '' ;
&GetOptions
( "help" => \$Help ,
"rawmp" => \$RawMP, # option is now default, but keep for compat
"metafun" => \$MetaFun,
"passon" => \$PassOn, # option is ignored, but keep for compat
- "latex" => \$Latex ) ;
-
-my $program = "MPtoPDF 1.4.0" ;
-my $pattern = "@ARGV" ; # was $ARGV[0]
-my $miktex = 0 ;
-my $done = 0 ;
-my $report = '' ;
+ "latex" => \$Latex,
+ "texexec" => \$TeXexec) ;
+
+my $program = "MPtoPDF 1.4.1" ;
+my $pattern = "@ARGV" ; # was $ARGV[0]
+my $miktex = 0 ;
+my $done = 0 ;
+my $report = '' ;
my $mplatexswitch = " --tex=latex " ;
+my $texexecswitch = " --tex=\"texexec --batch --once --nomp --mptex\" " ; # untested
-my $dosish = ($Config{'osname'} =~/^(ms)?dos|^os\/2|^mswin/i) ;
+my $dosish = ($Config{'osname'} =~ /^(ms)?dos|^os\/2|^mswin/i) ;
my $escapeshell = (($ENV{'SHELL'}) && ($ENV{'SHELL'} =~ m/sh/i ));
if ($ENV{"TEXSYSTEM"}) {
@@ -88,6 +91,9 @@ if (($pattern eq '')||($Help)) {
if ($Latex) {
$rest .= " $mplatexswitch" ;
}
+ if ($TeXexec) {
+ $rest .= " $texexecswitch" ;
+ }
if ($MetaFun) {
$mpbin = "mpost --progname=mpost --mem=metafun" ;
} else {
diff --git a/Master/texmf-dist/scripts/context/ruby/base/kpse.rb b/Master/texmf-dist/scripts/context/ruby/base/kpse.rb
index 0f986878413..313ebbe6286 100644
--- a/Master/texmf-dist/scripts/context/ruby/base/kpse.rb
+++ b/Master/texmf-dist/scripts/context/ruby/base/kpse.rb
@@ -351,15 +351,25 @@ module Kpse
end
end
+ # def Kpse.runscript(name,filename=[],options=[])
+ # setscript(name,`texmfstart --locate #{name}`) unless @@scripts.key?(name)
+ # cmd = "#{@@scripts[name]} #{[options].flatten.join(' ')} #{[filename].flatten.join(' ')}"
+ # system(cmd)
+ # end
+
+ # def Kpse.pipescript(name,filename=[],options=[])
+ # setscript(name,`texmfstart --locate #{name}`) unless @@scripts.key?(name)
+ # cmd = "#{@@scripts[name]} #{[options].flatten.join(' ')} #{[filename].flatten.join(' ')}"
+ # `#{cmd}`
+ # end
+
def Kpse.runscript(name,filename=[],options=[])
- setscript(name,`texmfstart --locate #{name}`) unless @@scripts.key?(name)
- cmd = "#{@@scripts[name]} #{[options].flatten.join(' ')} #{[filename].flatten.join(' ')}"
+ cmd = "mtxrun --script #{name} #{[options].flatten.join(' ')} #{[filename].flatten.join(' ')}"
system(cmd)
end
def Kpse.pipescript(name,filename=[],options=[])
- setscript(name,`texmfstart --locate #{name}`) unless @@scripts.key?(name)
- cmd = "#{@@scripts[name]} #{[options].flatten.join(' ')} #{[filename].flatten.join(' ')}"
+ cmd = "mtxrun --script #{name} #{[options].flatten.join(' ')} #{[filename].flatten.join(' ')}"
`#{cmd}`
end
diff --git a/Master/texmf-dist/scripts/context/ruby/base/tex.rb b/Master/texmf-dist/scripts/context/ruby/base/tex.rb
index 84025693b01..2184447ce84 100644
--- a/Master/texmf-dist/scripts/context/ruby/base/tex.rb
+++ b/Master/texmf-dist/scripts/context/ruby/base/tex.rb
@@ -87,8 +87,6 @@ class TEX
@@texmethods = Hash.new
@@mpsmethods = Hash.new
@@pdftex = 'pdftex' # new default, pdfetex is gone
- @@luafiles = "luafiles.tmp"
- @@luatarget = "lua/context"
@@platformslash = if System.unix? then "\\\\" else "\\" end
@@ -96,7 +94,6 @@ class TEX
['aleph','omega'] .each do |e| @@texengines[e] = 'aleph' end
['xetex'] .each do |e| @@texengines[e] = 'xetex' end
['petex'] .each do |e| @@texengines[e] = 'petex' end
- ['luatex'] .each do |e| @@texengines[e] = 'luatex' end
['metapost','mpost', 'standard'] .each do |e| @@mpsengines[e] = 'mpost' end
@@ -118,18 +115,16 @@ class TEX
# todo norwegian (no)
- ['plain'] .each do |f| @@texformats[f] = 'plain' end
- ['cont-en','en','english','context','standard'].each do |f| @@texformats[f] = 'cont-en' end
- ['cont-nl','nl','dutch'] .each do |f| @@texformats[f] = 'cont-nl' end
- ['cont-de','de','german'] .each do |f| @@texformats[f] = 'cont-de' end
- ['cont-it','it','italian'] .each do |f| @@texformats[f] = 'cont-it' end
- ['cont-fr','fr','french'] .each do |f| @@texformats[f] = 'cont-fr' end
- ['cont-cs','cs','cont-cz','cz','czech'] .each do |f| @@texformats[f] = 'cont-cs' end
- ['cont-ro','ro','romanian'] .each do |f| @@texformats[f] = 'cont-ro' end
- ['cont-gb','gb','cont-uk','uk','british'] .each do |f| @@texformats[f] = 'cont-gb' end
- ['cont-pe','pe','persian'] .each do |f| @@texformats[f] = 'cont-pe' end
- ['cont-xp','xp','experimental'] .each do |f| @@texformats[f] = 'cont-xp' end
- ['mptopdf'] .each do |f| @@texformats[f] = 'mptopdf' end
+ ['plain'] .each do |f| @@texformats[f] = 'plain' end
+ ['cont-en','en','english','context','standard'].each do |f| @@texformats[f] = 'cont-en.mkii' end
+ ['cont-nl','nl','dutch'] .each do |f| @@texformats[f] = 'cont-nl.mkii' end
+ ['cont-de','de','german'] .each do |f| @@texformats[f] = 'cont-de.mkii' end
+ ['cont-it','it','italian'] .each do |f| @@texformats[f] = 'cont-it.mkii' end
+ ['cont-fr','fr','french'] .each do |f| @@texformats[f] = 'cont-fr.mkii' end
+ ['cont-cs','cs','cont-cz','cz','czech'] .each do |f| @@texformats[f] = 'cont-cs.mkii' end
+ ['cont-ro','ro','romanian'] .each do |f| @@texformats[f] = 'cont-ro.mkii' end
+ ['cont-gb','gb','cont-uk','uk','british'] .each do |f| @@texformats[f] = 'cont-gb.mkii' end
+ ['mptopdf'] .each do |f| @@texformats[f] = 'mptopdf' end
['latex'] .each do |f| @@texformats[f] = 'latex.ltx' end
@@ -137,15 +132,20 @@ class TEX
['metafun','context','standard'] .each do |f| @@mpsformats[f] = 'metafun' end
['pdftex','pdfetex','aleph','omega','petex',
- 'xetex','luatex'] .each do |p| @@prognames[p] = 'context' end
+ 'xetex'] .each do |p| @@prognames[p] = 'context' end
['mpost'] .each do |p| @@prognames[p] = 'metafun' end
['latex','pdflatex'] .each do |p| @@prognames[p] = 'latex' end
['plain','default','standard','mptopdf'] .each do |f| @@texmethods[f] = 'plain' end
- ['cont-en','cont-nl','cont-de','cont-it',
- 'cont-fr','cont-cs','cont-ro','cont-gb',
- 'cont-pe','cont-xp'] .each do |f| @@texmethods[f] = 'context' end
- ['latex','pdflatex'] .each do |f| @@texmethods[f] = 'latex' end
+ ['cont-en','cont-en.mkii',
+ 'cont-nl','cont-nl.mkii',
+ 'cont-de','cont-de.mkii',
+ 'cont-it','cont-it.mkii',
+ 'cont-fr','cont-fr.mkii',
+ 'cont-cs','cont-cs.mkii',
+ 'cont-ro','cont-ro.mkii',
+ 'cont-gb','cont-gb.mkii'] .each do |f| @@texmethods[f] = 'context' end
+ ['latex','latex.ltx','pdflatex'] .each do |f| @@texmethods[f] = 'latex' end # untested
['plain','default','standard'] .each do |f| @@mpsmethods[f] = 'plain' end
['metafun'] .each do |f| @@mpsmethods[f] = 'metafun' end
@@ -158,7 +158,6 @@ class TEX
'cont-pe','cont-xp'] .each do |f| @@texprocstr[f] = @@platformslash + "emergencyend" end
@@runoptions['aleph'] = ['--8bit']
- @@runoptions['luatex'] = ['--file-line-error']
@@runoptions['mpost'] = ['--8bit']
@@runoptions['pdfetex'] = ['--8bit'] # obsolete
@@runoptions['pdftex'] = ['--8bit'] # pdftex is now pdfetex
@@ -166,11 +165,9 @@ class TEX
@@runoptions['xetex'] = ['--8bit','-output-driver="xdvipdfmx -E -d 4 -V 5"']
@@draftoptions['pdftex'] = ['--draftmode']
@@synctexcoptions['pdftex'] = ['--synctex=1']
- @@synctexcoptions['luatex'] = ['--synctex=1']
@@synctexcoptions['xetex'] = ['--synctex=1']
@@tcxflag['aleph'] = true
- @@tcxflag['luatex'] = false
@@tcxflag['mpost'] = false
@@tcxflag['pdfetex'] = true
@@tcxflag['pdftex'] = true
@@ -184,7 +181,7 @@ class TEX
'nomapfiles', 'local',
'arrange', 'noarrange',
'forcexml', 'foxet',
- 'alpha', 'beta', 'luatex',
+ 'alpha', 'beta',
'mpyforce', 'forcempy',
'forcetexutil', 'texutil',
'globalfile', 'autopath',
@@ -198,7 +195,7 @@ class TEX
'filters', 'usemodules', 'environments', 'separation', 'setuppath',
'arguments', 'input', 'output', 'randomseed', 'modes', 'mode', 'filename',
'ctxfile', 'printformat', 'paperformat', 'paperoffset',
- 'timeout', 'passon'
+ 'timeout', 'passon', 'pdftitle'
]
@@mainstandardvars = [
'mainlanguage', 'bodyfont', 'language'
@@ -362,9 +359,9 @@ class TEX
end
rescue
end
- ['mpgraph.mp'].each do |file|
- (File.delete(file) if (FileTest.size?(file) rescue 10) < 10) rescue false
- end
+ # ['mpgraph.mp'].each do |file|
+ # (File.delete(file) if (FileTest.size?(file) rescue 10) < 10) rescue false
+ # end
end
def backends() @@backends.keys.sort end
@@ -426,7 +423,7 @@ class TEX
def prefixed(format,engine)
# format
case engine
- when /etex|pdftex|pdfetex|aleph|xetex|luatex/io then
+ when /etex|pdftex|pdfetex|aleph|xetex/io then
"*#{format}"
else
format
@@ -442,14 +439,6 @@ class TEX
if str.class == String then str.split(',') else str.flatten end
end
- def validtexformat(str) validsomething(str,@@texformats,'tex') end
- def validmpsformat(str) validsomething(str,@@mpsformats,'mp' ) end
- def validtexengine(str) validsomething(str,@@texengines,'pdftex') end
- def validmpsengine(str) validsomething(str,@@mpsengines,'mpost' ) end
-
- def validtexmethod(str) [validsomething(str,@@texmethods)].flatten.first end
- def validmpsmethod(str) [validsomething(str,@@mpsmethods)].flatten.first end
-
def validsomething(str,something,type=nil)
if str then
list = [str].flatten.collect do |s|
@@ -471,6 +460,15 @@ class TEX
end
end
+ def validtexformat(str) validsomething(str,@@texformats,'tex') ||
+ validsomething(str,@@texformats,'mkii') end
+ def validmpsformat(str) validsomething(str,@@mpsformats,'mp' ) end
+ def validtexengine(str) validsomething(str,@@texengines,'pdftex') end
+ def validmpsengine(str) validsomething(str,@@mpsengines,'mpost' ) end
+
+ def validtexmethod(str) [validsomething(str,@@texmethods)].flatten.first end
+ def validmpsmethod(str) [validsomething(str,@@mpsmethods)].flatten.first end
+
def validbackend(str)
if str && @@backends.key?(str) then
@@backends[str]
@@ -562,7 +560,7 @@ class TEX
# will go to context/process context/listing etc
def contextversion # ook elders gebruiken
- filename = Kpse.found('context.tex')
+ filename = Kpse.found('context.mkii')
version = 'unknown'
begin
if FileTest.file?(filename) && IO.read(filename).match(/\\contextversion\{(\d+\.\d+\.\d+.*?)\}/) then
@@ -573,39 +571,6 @@ class TEX
return version
end
- def cleanupluafiles
- File.delete(@@luafiles) rescue false
- end
-
- def compileluafiles
- begin
- Dir.glob("lua/context/*.luc").each do |luc|
- File.delete(luc) rescue false
- end
- rescue
- end
- if data = (IO.readlines(@@luafiles) rescue nil) then
- report("compiling lua files (using #{File.expand_path(@@luafiles)})")
- begin
- FileUtils.makedirs(@@luatarget) rescue false
- data.each do |line|
- luafile = line.chomp
- lucfile = File.basename(luafile).gsub(/\..*?$/,'') + ".luc"
- if runcommand(["luac","-s","-o",quoted(File.join(Dir.getwd,@@luatarget,lucfile)),quoted(luafile)]) then
- report("#{File.basename(luafile)} converted to #{File.basename(lucfile)}")
- else
- report("#{File.basename(luafile)} not converted to #{File.basename(lucfile)}")
- end
- end
- rescue
- report("fatal error in compilation")
- end
- else
- report("no lua compilations needed")
- end
- File.delete(@@luafiles) rescue false
- end
-
# we need engine methods
def makeformats
@@ -618,14 +583,6 @@ class TEX
else
report('updating file database')
Kpse.update # obsolete here
- if getvariable('luatex') then
- begin
- runcommand(["luatools","--generate","--verbose"])
- rescue
- report("run 'luatools --generate' manualy")
- exit
- end
- end
end
# goody
if getvariable('texformats') == 'standard' then
@@ -658,22 +615,10 @@ class TEX
# makeuserfile
# makeresponsefile
# end
- if texengine == 'luatex' then
- cleanupluafiles
- texformats.each do |texformat|
- report("generating tex format #{texformat}")
- flags = ['--ini','--compile']
- flags << '--verbose' if getvariable('verbose')
- flags << '--mkii' if getvariable('mkii')
- run_luatools("#{flags.join(" ")} #{texformat}")
- end
- compileluafiles
- else
- texformats.each do |texformat|
- report("generating tex format #{texformat}")
- progname = validprogname([getvariable('progname'),texformat,texengine])
- runcommand([quoted(texengine),prognameflag(progname),iniflag,tcxflag(texengine),prefixed(texformat,texengine),texmakeextras(texformat)])
- end
+ texformats.each do |texformat|
+ report("generating tex format #{texformat}")
+ progname = validprogname([getvariable('progname'),texformat,texengine])
+ runcommand([quoted(texengine),prognameflag(progname),iniflag,tcxflag(texengine),prefixed(texformat,texengine),texmakeextras(texformat)])
end
else
report("unable to make format due to lack of permissions")
@@ -728,15 +673,6 @@ class TEX
end
end
end
- begin
- lucdir = File.join(texformatpath,@@luatarget)
- Dir.chdir(lucdir)
- rescue
- else
- Dir.glob("*.luc").each do |file|
- report("luc: #{filestate(file)} > #{File.expand_path(file)} (#{File.size(file)})")
- end
- end
# to be sure, go back to current path
begin
Dir.chdir(savedpath)
@@ -781,7 +717,7 @@ class TEX
f.close
if FileTest.file?(tempfilename('tex')) then
format = File.basename(name)
- engine = if name =~ /(pdftex|pdfetex|aleph|xetex|luatex)[\/\\]#{format}/ then $1 else '' end
+ engine = if name =~ /(pdftex|pdfetex|aleph|xetex)[\/\\]#{format}/ then $1 else '' end
if engine.empty? then
engineflag = ""
else
@@ -831,7 +767,7 @@ class TEX
private
- def makeuserfile # not used in luatex (yet)
+ def makeuserfile
language = getvariable('language')
mainlanguage = getvariable('mainlanguage')
bodyfont = getvariable('bodyfont')
@@ -1179,24 +1115,6 @@ class TEX
public
- # def run_luatools(args)
- # dirty trick: we know that the lua path is relative to the ruby path; of course this
- # will not work well when stubs are used
- # [(ENV["_CTX_K_S_texexec_"] or ENV["_CTX_K_S_THREAD_"] or ENV["TEXMFSTART.THREAD"]), File.dirname($0)].each do |path|
- # if path then
- # script = "#{path}/../lua/luatools.lua"
- # if FileTest.file?(script) then
- # return runcommand("luatex --luaonly #{script} #{args}")
- # end
- # end
- # end
- # return runcommand("texmfstart luatools #{args}")
- # end
-
- def run_luatools(args)
- return runcommand("luatools #{args}")
- end
-
def processmpgraphic
getarrayvariable('files').each do |filename|
setvariable('filename',filename)
@@ -1584,17 +1502,8 @@ end
report("tex format: #{texformat}")
if texengine && texformat then
fixbackendvars(@@mappaths[texengine])
- if texengine == "luatex" then
- # currently we use luatools to start luatex but some day we should
- # find a clever way to directly call luatex (problem is that we need
- # to feed the explicit location of the format and lua initialization
- # file)
- run_luatools("--fmt=#{texformat} #{filename}")
- else
- progname = validprogname([getvariable('progname'),texformat,texengine])
- runcommand([quoted(texengine),prognameflag(progname),formatflag(texengine,texformat),tcxflag(texengine),runoptions(texengine),filename,texprocextras(texformat)])
- end
- # true
+ progname = validprogname([getvariable('progname'),texformat,texengine])
+ runcommand([quoted(texengine),prognameflag(progname),formatflag(texengine,texformat),tcxflag(texengine),runoptions(texengine),filename,texprocextras(texformat)])
else
false
end
@@ -1673,24 +1582,6 @@ end
end
end
- def runluacheck(jobname)
- if false then
- # test-pos.tex / 6 meg tua file: 18.6 runtime
- old, new = File.suffixed(jobname,'tua'), File.suffixed(jobname,'tuc')
- if FileTest.file?(old) then
- report("converting #{old} into #{new}")
- system("luac -s -o #{new} #{old}")
- end
- else
- # test-pos.tex / 6 meg tua file: 17.5 runtime
- old, new = File.suffixed(jobname,'tua'), File.suffixed(jobname,'tuc')
- if FileTest.file?(old) then
- report("renaming #{old} into #{new}")
- File.rename(old,new) rescue false
- end
- end
- end
-
# 1=tex 2=mptex 3=mpxtex 4=mpgraphic 5=mpstatic
def runtexexec(filename=[], options=[], mode=nil)
@@ -1928,7 +1819,6 @@ end
ok = runtex(if dummyfile || forcexml then rawbase else rawname end)
if ok then
ok = runtexutil(rawbase) if getvariable('texutil') || getvariable('forcetexutil')
- runluacheck(rawbase)
runbackend(rawbase)
popresult(rawbase,result)
end
@@ -1979,7 +1869,6 @@ end
mprundone = runtexmpjob(rawbase, "mprun")
end
ok = runtexutil(rawbase)
- runluacheck(rawbase)
state.update
stoprunning = state.stable?
end
@@ -1989,7 +1878,6 @@ end
end
if (nofruns == 1) && getvariable('texutil') then
ok = runtexutil(rawbase)
- runluacheck(rawbase)
end
if ok && finalrun && (nofruns > 1) then
makeoptionfile(rawbase,jobname,orisuffix,true,finalrun,4,texruns) unless getvariable('nooptionfile')
diff --git a/Master/texmf-dist/scripts/context/ruby/ctxtools.rb b/Master/texmf-dist/scripts/context/ruby/ctxtools.rb
index 67baaab39c4..339f3d4906a 100644
--- a/Master/texmf-dist/scripts/context/ruby/ctxtools.rb
+++ b/Master/texmf-dist/scripts/context/ruby/ctxtools.rb
@@ -1,4 +1,5 @@
#!/usr/bin/env ruby
+#encoding: ASCII-8BIT
# program : ctxtools
# copyright : PRAGMA Advanced Document Engineering
@@ -553,7 +554,7 @@ class Commands
"tuo", "tub", "top", "tuc"
]
$dummyfiles = [
- "mpgraph"
+ # "mpgraph"
]
def removecontextfile (filename)
@@ -1852,8 +1853,6 @@ class Commands
ok = data.add_shebang(filename,'perl')
when /\.py$/ then
ok = data.add_shebang(filename,'python')
- when /\.lua$/ then
- ok = data.add_shebang(filename,'lua')
when /\.tex$/ then
ok = data.add_directive(filename,'tex')
when /\.mp$/ then
@@ -2696,11 +2695,7 @@ class Commands
def remakeformats
system("mktexlsr")
- system("luatools --selfupdate")
- system("mtxrun --selfupdate")
- system("luatools --generate")
system("texmfstart texexec --make --all --fast --pdftex")
- system("texmfstart texexec --make --all --fast --luatex")
system("texmfstart texexec --make --all --fast --xetex")
return true
end
diff --git a/Master/texmf-dist/scripts/context/ruby/fcd_start.rb b/Master/texmf-dist/scripts/context/ruby/fcd_start.rb
index 28f407c761e..b1fa42a2a69 100644
--- a/Master/texmf-dist/scripts/context/ruby/fcd_start.rb
+++ b/Master/texmf-dist/scripts/context/ruby/fcd_start.rb
@@ -38,6 +38,8 @@
# fcd [--find] whatever . (last choice with this pattern)
# fcd --list
+# todo: HOMEDRIVE\HOMEPATH
+
require 'rbconfig'
class FastCD
diff --git a/Master/texmf-dist/scripts/context/ruby/mtxtools.rb b/Master/texmf-dist/scripts/context/ruby/mtxtools.rb
deleted file mode 100644
index 41d0f7085b1..00000000000
--- a/Master/texmf-dist/scripts/context/ruby/mtxtools.rb
+++ /dev/null
@@ -1,475 +0,0 @@
-#!/usr/bin/env ruby
-
-# program : mtxtools
-# copyright : PRAGMA Advanced Document Engineering
-# version : 2004-2005
-# author : Hans Hagen
-#
-# info : j.hagen@xs4all.nl
-# www : www.pragma-ade.com
-
-# This script hosts MetaTeX related features.
-
-banner = ['MtxTools', 'version 1.0.0', '2006', 'PRAGMA ADE/POD']
-
-$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq!
-
-require 'base/switch'
-require 'base/logger'
-require 'base/system'
-require 'base/kpse'
-
-class Reporter
- def report(str)
- puts(str)
- end
-end
-
-module ConTeXt
-
- def ConTeXt::banner(filename,companionname,compact=false)
- "-- filename : #{File.basename(filename)}\n" +
- "-- comment : companion to #{File.basename(companionname)} (in ConTeXt)\n" +
- "-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL\n" +
- "-- copyright: PRAGMA ADE / ConTeXt Development Team\n" +
- "-- license : see context related readme files\n" +
- if compact then "\n-- remark : compact version\n" else "" end
- end
-
-end
-
-class UnicodeTables
-
- @@version = "1.001"
-
- @@shape_a = /^((GREEK|LATIN|HEBREW)\s*(SMALL|CAPITAL|)\s*LETTER\s*[A-Z]+)$/
- @@shape_b = /^((GREEK|LATIN|HEBREW)\s*(SMALL|CAPITAL|)\s*LETTER\s*[A-Z]+)\s*(.+)$/
-
- @@shape_a = /^(.*\s*LETTER\s*[A-Z]+)$/
- @@shape_b = /^(.*\s*LETTER\s*[A-Z]+)\s+WITH\s+(.+)$/
-
- attr_accessor :context, :comment
-
- def initialize(logger=Reporter.new)
- @data = Array.new
- @logger = logger
- @error = false
- @context = true
- @comment = true
- @shapes = Hash.new
- end
-
- def load_unicode_data(filename='unicodedata.txt')
- # beware, the unicodedata table is bugged, sometimes ending
- @logger.report("reading base data from #{filename}") if @logger
- begin
- IO.readlines(filename).each do |line|
- if line =~ /^[0-9A-F]{4,4}/ then
- d = line.chomp.sub(/\;$/, '').split(';')
- if d then
- while d.size < 15 do d << '' end
- n = d[0].hex
- @data[n] = d
- if d[1] =~ @@shape_a then
- @shapes[$1] = d[0]
- end
- end
- end
- end
- rescue
- @error = true
- @logger.report("error while reading base data from #{filename}") if @logger
- end
- end
-
- def load_context_data(filename='contextnames.txt')
- @logger.report("reading data from #{filename}") if @logger
- begin
- IO.readlines(filename).each do |line|
- if line =~ /^[0-9A-F]{4,4}/ then
- d = line.chomp.split(';')
- if d then
- n = d[0].hex
- if @data[n] then
- @data[d[0].hex] << d[1] # adobename == 15
- @data[d[0].hex] << d[2] # contextname == 16
- else
- @logger.report("missing information about #{d} in #{filename}") if @logger
- end
- end
- end
- end
- rescue
- @error = true
- @logger.report("error while reading context data from #{filename}") if @logger
- end
- end
-
- def save_metatex_data(filename='char-def.lua',compact=false)
- if not @error then
- begin
- File.open(filename,'w') do |f|
- @logger.report("saving data in #{filename}") if @logger
- f << ConTeXt::banner(filename,'char-def.tex',compact)
- f << "\n"
- f << "\nif not versions then versions = { } end versions['#{filename.gsub(/\..*?$/,'')}'] = #{@@version}\n"
- f << "\n"
- f << "if not characters then characters = { } end\n"
- f << "if not characters.data then characters.data = { } end\n"
- f << "\n"
- f << "characters.data = {\n" if compact
- @data.each do |d|
- if d then
- r = metatex_data(d)
- if compact then
- f << "\t" << "[0x#{d[0]}]".rjust(8,' ') << " = { #{r.join(", ").gsub(/\t/,'')} }, \n"
- else
- f << "characters.define { -- #{d[0].hex}" << "\n"
- f << r.join(",\n") << "\n"
- f << "}" << "\n"
- end
- end
- end
- f << "}\n" if compact
- end
- rescue
- @logger.report("error while saving data in #{filename}") if @logger
- else
- @logger.report("#{@data.size} (#{sprintf('%X',@data.size)}) entries saved in #{filename}") if @logger
- end
- else
- @logger.report("not saving data in #{filename} due to previous error") if @logger
- end
- end
-
- def metatex_data(d)
- r = Array.new
- r << "\tunicodeslot=0x#{d[0]}"
- if d[2] && ! d[2].empty? then
- r << "\tcategory='#{d[2].downcase}'"
- end
- if @context then
- if d[15] && ! d[15].empty? then
- r << "\tadobename='#{d[15]}'"
- end
- if d[16] && ! d[16].empty? then
- r << "\tcontextname='#{d[16]}'"
- end
- end
- if @comment then
- if d[1] == "<control>" then
- r << "\tdescription='#{d[10]}'" unless d[10].empty?
- else
- r << "\tdescription='#{d[1]}'" unless d[1].empty?
- end
- end
- if d[1] =~ @@shape_b then
- r << "\tshcode=0x#{@shapes[$1]}" if @shapes[$1]
- end
- if d[12] && ! d[12].empty? then
- r << "\tuccode=0x#{d[12]}"
- elsif d[14] && ! d[14].empty? then
- r << "\tuccode=0x#{d[14]}"
- end
- if d[13] && ! d[13].empty? then
- r << "\tlccode=0x#{d[13]}"
- end
- if d[5] && ! d[5].empty? then
- special, specials = '', Array.new
- c = d[5].split(/\s+/).collect do |cc|
- if cc =~ /^\<(.*)\>$/io then
- special = $1.downcase
- else
- specials << "0x#{cc}"
- end
- end
- if specials.size > 0 then
- special = 'char' if special.empty?
- r << "\tspecials={'#{special}',#{specials.join(',')}}"
- end
- end
- return r
- end
-
- def save_xetex_data(filename='enco-utf.tex')
- if not @error then
- begin
- minnumber, maxnumber, n = 0x001F, 0xFFFF, 0
- File.open(filename,'w') do |f|
- @logger.report("saving data in #{filename}") if @logger
- f << "% filename : #{filename}\n"
- f << "% comment : poor man's alternative for a proper enco file\n"
- f << "% this file is generated by mtxtools and can be\n"
- f << "% used in xetex and luatex mkii mode\n"
- f << "% author : Hans Hagen, PRAGMA-ADE, Hasselt NL\n"
- f << "% copyright: PRAGMA ADE / ConTeXt Development Team\n"
- f << "% license : see context related readme files\n"
- f << "\n"
- f << "\\ifx\\setcclcucx\\undefined\n"
- f << "\n"
- f << " \\def\\setcclcucx #1 #2 #3 %\n"
- f << " {\\global\\catcode\"#1=11 \n"
- f << " \\global\\lccode \"#1=\"#2 \n"
- f << " \\global\\uccode \"#1=\"#3 }\n"
- f << "\n"
- f << "\\fi\n"
- f << "\n"
- @data.each do |d|
- if d then
- number, type = d[0], d[2].downcase
- if number.hex >= minnumber && number.hex <= maxnumber && type =~ /^l(l|u|t)$/o then
- if d[13] && ! d[13].empty? then
- lc = d[13]
- else
- lc = number
- end
- if d[12] && ! d[12].empty? then
- uc = d[12]
- elsif d[14] && ! d[14].empty? then
- uc = d[14]
- else
- uc = number
- end
- if @comment then
- f << "\\setcclcuc #{number} #{lc} #{uc} % #{d[1]}\n"
- else
- f << "\\setcclcuc #{number} #{lc} #{uc} \n"
- end
- n += 1
- end
- end
- end
- f << "\n"
- f << "\\endinput\n"
- end
- rescue
- @logger.report("error while saving data in #{filename}") if @logger
- else
- @logger.report("#{n} entries saved in #{filename}") if @logger
- end
- else
- @logger.report("not saving data in #{filename} due to previous error") if @logger
- end
- end
-
-end
-
-class RegimeTables
-
- @@version = "1.001"
-
- def initialize(logger=Reporter.new)
- @logger = logger
- reset
- end
-
- def reset
- @code, @regime, @filename, @loaded = Array.new(256), '', '', false
- (32..127).each do |i|
- @code[i] = [sprintf('%04X',i), i.chr]
- end
- end
-
- def load(filename)
- begin
- reset
- if filename =~ /regi\-(ini|run|uni|utf|syn)/ then
- report("skipping #{filename}")
- else
- report("loading file #{filename}")
- @regime, unicodeset = File.basename(filename).sub(/\..*?$/,''), false
- IO.readlines(filename).each do |line|
- case line
- when /^\#/ then
- # skip
- when /^(0x[0-9A-F]+)\s+(0x[0-9A-F]+)\s+\#\s+(.*)$/ then
- @code[$1.hex], unicodeset = [$2, $3], true
- when /^(0x[0-9A-F]+)\s+(0x[0-9A-F]+)\s+/ then
- @code[$1.hex], unicodeset = [$2, ''], true
- end
- end
- reset if not unicodeset
- end
- rescue
- report("problem in loading file #{filename}")
- reset
- else
- if ! @regime.empty? then
- @loaded = true
- else
- reset
- end
- end
- end
-
- def save(filename,compact=false)
- begin
- if @loaded && ! @regime.empty? then
- if File.expand_path(filename) == File.expand_path(@filename) then
- report("saving in #{filename} is blocked")
- else
- report("saving file #{filename}")
- File.open(filename,'w') do |f|
- f << ConTeXt::banner(filename,'regi-ini.tex',compact)
- f << "\n"
- f << "\nif not versions then versions = { } end versions['#{filename.gsub(/\..*?$/,'')}'] = #{@@version}\n"
- f << "\n"
- f << "if not regimes then regimes = { } end\n"
- f << "if not regimes.data then regimes.data = { } end\n"
- f << "\n"
- if compact then
- f << "regimes.data[\"#{@regime}\"] = { [0] = \n\t"
- i = 17
- @code.each_index do |c|
- if (i-=1) == 0 then
- i = 16
- f << "\n\t"
- end
- if @code[c] then
- f << @code[c][0].rjust(6,' ')
- else
- f << "0x0000".rjust(6,' ')
- end
- f << ', ' if c<@code.length-1
- end
- f << "\n}\n"
- else
- @code.each_index do |c|
- if @code[c] then
- f << someregimeslot(@regime,c,@code[c][0],@code[c][1])
- else
- f << someregimeslot(@regime,c,'','')
- end
- end
- end
- end
- end
- end
- rescue
- report("problem in saving file #{filename} #{$!}")
- end
- end
-
- def report(str)
- @logger.report(str)
- end
-
- private
-
- def someregimeslot(regime,slot,unicodeslot,comment)
- "regimes.define { #{if comment.empty? then '' else '-- ' end} #{comment}\n" +
- "\tregime='#{regime}',\n" +
- "\tslot='#{sprintf('0x%02X',slot)}',\n" +
- "\tunicodeslot='#{if unicodeslot.empty? then '0x0000' else unicodeslot end}'\n" +
- "}\n"
- end
-
- public
-
- def RegimeTables::convert(filenames,compact=false)
- filenames.each do |filename|
- txtfile = File.expand_path(filename)
- luafile = File.join(File.dirname(txtfile),'regi-'+File.basename(txtfile.sub(/\..*?$/, '.lua')))
- unless txtfile == luafile then
- regime = RegimeTables.new
- regime.load(txtfile)
- regime.save(luafile,compact)
- end
- end
- end
-
-end
-
-class Commands
-
- include CommandBase
-
- def unicodetable
- unicode = UnicodeTables.new(logger)
- unicode.load_unicode_data
- unicode.load_context_data
- unicode.save_metatex_data('char-def.lua',@commandline.option('compact'))
- end
-
- def xetextable
- unicode = UnicodeTables.new(logger)
- unicode.load_unicode_data
- unicode.load_context_data
- # unicode.comment = false
- unicode.save_xetex_data
- end
-
- def regimetable
- if @commandline.arguments.length > 0 then
- RegimeTables::convert(@commandline.arguments, @commandline.option('compact'))
- else
- RegimeTables::convert(Dir.glob("cp*.txt") , @commandline.option('compact'))
- RegimeTables::convert(Dir.glob("8859*.txt") , @commandline.option('compact'))
- end
- end
-
- def pdftextable
- # instead of directly saving the data, we use luatex (kind of test)
- pdfrdef = 'pdfr-def.tex'
- tmpfile = 'mtxtools.tmp'
- File.delete(pdfrdef) rescue false
- if f = File.open(tmpfile,'w') then
- f << "\\starttext\n"
- f << "\\ctxlua{characters.pdftex.make_pdf_to_unicodetable('#{pdfrdef}')}\n"
- f << "\\stoptext\n"
- f.close()
- system("texmfstart texexec --luatex --once --purge mtxtools.tmp")
- report("vecor saved in #{pdfrdef}")
- end
- File.delete(tmpfile) rescue false
- end
-
- def xmlmapfile
- # instead of directly saving the data, we use luatex (kind of test)
- tmpfile = 'mtxtools.tmp'
- xmlsuffix = 'frx'
- @commandline.arguments.each do |mapname|
- if f = File.open(tmpfile,'w') then
- xmlname = mapname.gsub(/\.map$/,".#{xmlsuffix}")
- File.delete(xmlname) rescue false
- f << "\\starttext\n"
- f << "\\ctxlua{\n"
- f << " mapname = input.find_file(texmf.instance,'#{mapname}') or ''\n"
- f << " xmlname = '#{xmlname}'\n"
- f << " if mapname and not mapname:is_empty() then\n"
- f << " ctx.fonts.map.convert_file(mapname,xmlname)\n"
- f << " end\n"
- f << "}\n"
- f << "\\stoptext\n"
- f.close()
- system("texmfstart texexec --luatex --once --purge mtxtools.tmp")
- if FileTest.file?(xmlname) then
- report("map file #{mapname} converted to #{xmlname}")
- else
- report("no valid map file #{mapname}")
- end
- end
- end
- File.delete(tmpfile) rescue false
- end
-
-end
-
-logger = Logger.new(banner.shift)
-commandline = CommandLine.new
-
-commandline.registeraction('unicodetable', 'create unicode table for metatex/luatex')
-commandline.registeraction('regimetable' , 'create regime table(s) for metatex/luatex [--compact]')
-commandline.registeraction('xetextable' , 'create unicode table for xetex')
-commandline.registeraction('pdftextable' , 'create unicode table for xetex')
-commandline.registeraction('xmlmapfile' , 'convert traditional mapfile to xml font resourse')
-
-# general
-
-commandline.registeraction('help')
-commandline.registeraction('version')
-commandline.registerflag('compact')
-
-commandline.expand
-
-Commands.new(commandline,logger,banner).send(commandline.action || 'help')
diff --git a/Master/texmf-dist/scripts/context/ruby/rslibtool.rb b/Master/texmf-dist/scripts/context/ruby/rslibtool.rb
new file mode 100644
index 00000000000..7ae5efb647e
--- /dev/null
+++ b/Master/texmf-dist/scripts/context/ruby/rslibtool.rb
@@ -0,0 +1,114 @@
+# program : rslibtool
+# copyright : PRAGMA Publishing On Demand
+# version : 1.00 - 2002
+# author : Hans Hagen
+#
+# project : eXaMpLe
+# concept : Hans Hagen
+# info : j.hagen@xs4all.nl
+# www : www.pragma-pod.com / www.pragma-ade.com
+
+# --add --base=filename --path=directory pattern
+# --remove --base=filename --path=directory label
+# --sort --base=filename --path=directory
+# --purge --base=filename --path=directory
+# --dummy --base=filename
+# --namespace
+
+# rewrite
+
+unless defined? ownpath
+ ownpath = $0.sub(/[\\\/]\w*?\.rb/i,'')
+ $: << ownpath
+end
+
+require 'rslb/base'
+require 'xmpl/base'
+require 'xmpl/switch'
+
+session = Example.new('rslbtool', '1.0', 'PRAGMA POD')
+
+session.identify
+
+commandline = CommandLine.new
+
+commandline.registerflag('add')
+commandline.registerflag('remove')
+commandline.registerflag('delete')
+commandline.registerflag('sort')
+commandline.registerflag('purge')
+commandline.registerflag('dummy')
+commandline.registerflag('process')
+commandline.registerflag('namespace')
+
+commandline.registervalue('prefix')
+commandline.registervalue('base')
+commandline.registervalue('path')
+commandline.registervalue('result')
+commandline.registervalue('texexec')
+commandline.registervalue('zipalso')
+
+commandline.expand
+
+session.inherit(commandline)
+
+base = session.get('option.base')
+path = session.get('option.path')
+
+base = 'rslbtool.xml' if base.empty?
+
+# when path is given, assume that arg list is list of
+# suffixes, else assume it is a list of globbed filespec
+
+if path.empty?
+ base += '.xml' unless base =~ /\..+$/
+ list = commandline.arguments
+else
+ Dir.chdir(File.dirname(path))
+ list = Dir.glob("*.{#{commandline.arguments.join(',')}}")
+end
+
+begin
+ reslib = Resource.new(base,session.get('option.namespace'))
+ reslib.load(base)
+rescue
+ session.error('problems with loading base')
+ exit
+end
+
+unless session.get('option.texexec').empty?
+ reslib.set_texexec(session.get('option.texexec'))
+end
+
+if session.get('option.add')
+
+ session.report('adding records', list)
+ reslib.add_figures(list,session.get('option.prefix'))
+
+elsif session.get('option.remove') or session.get('option.delete')
+
+ session.report('removing records')
+ reslib.delete_figures(list)
+
+elsif session.get('option.sort')
+
+ session.report('sorting records')
+ reslib.sort_figures()
+
+elsif session.get('option.purge')
+
+ session.report('purging records')
+ reslib.purge_figures()
+
+elsif session.get('option.dummy')
+
+ session.report('creating dummy records')
+ reslib.create_dummies(session.get('option.process'),session.get('option.result'),session.get('option.zipalso'))
+
+else
+
+ session.warning('provide action')
+
+end
+
+reslib.save(base)
diff --git a/Master/texmf-dist/scripts/context/ruby/texexec.rb b/Master/texmf-dist/scripts/context/ruby/texexec.rb
index 94b14e4283c..32c9d0ca538 100644
--- a/Master/texmf-dist/scripts/context/ruby/texexec.rb
+++ b/Master/texmf-dist/scripts/context/ruby/texexec.rb
@@ -164,7 +164,8 @@ class Commands
if fast or (files.length > 0) then
if f = File.open(job.tempfilename('tex'),'w') then
files.delete("texexec.pdf")
- Kpse.runscript('rlxtools', ['--identify','--collect'], files.join(' ')) unless fast
+ # Kpse.runscript('rlxtools', ['--identify','--collect'], files.join(' ')) unless fast
+ system("texmfstart rlxtools --identify --collect #{files.join(' ')}")
figures = @commandline.checkedoption('method', 'a').downcase
paperoffset = @commandline.checkedoption('paperoffset', '0pt')
backspace = @commandline.checkedoption('backspace', '1.5cm')
@@ -226,7 +227,8 @@ class Commands
else
markfile = nil
end
- Kpse.runscript('ctxtools',ffname,'--document')
+ # Kpse.runscript('ctxtools',['--document'],ffname)
+ system("texmfstart ctxtools --document #{ffname}")
if ted = File.silentopen(File.suffixed(ffname,'ted')) then
firstline = ted.gets
if firstline =~ /interface=/o then
@@ -506,6 +508,7 @@ class Commands
combination = @commandline.checkedoption('combination','2*2').split(/[\*x]/o)
paperformat = @commandline.checkedoption('paperformat', 'A4*A4').split(/[\*x]/o)
bannerheight = @commandline.checkedoption('bannerheight', '')
+ pdftitle = @commandline.checkedoption('pdftitle', '')
nx, ny = combination[0] || '2', combination[1] || combination[0] || '2'
from, to = paperformat[0] || 'A4', paperformat[1] || paperformat[0] || 'A4'
f << "\\setuppapersize[#{from}][#{to}]\n"
@@ -523,8 +526,10 @@ class Commands
f << "\\setuplayout[footer=0cm]\n"
f << "\\setupbackgrounds[page][background=]\n"
end
- f << "\\setupexternalfigures\n"
- f << " [directory=]\n"
+ f << "\\setupexternalfigures[directory=]\n"
+ if not pdftitle.empty? then
+ f << "\\setupinteraction[state=start,title={#{pdftitle}}]\n"
+ end
f << "\\starttext\n"
files.each do |filename|
result = @commandline.checkedoption('result','texexec')
@@ -582,8 +587,6 @@ job.setvariable('given.backend',job.getvariable('backend'))
if (str = @commandline.option('engine')) && ! str.standard? && ! str.empty? then
job.setvariable('texengine',str)
- elsif @commandline.oneof('luatex') then
- job.setvariable('texengine','luatex')
elsif @commandline.oneof('pdfetex','pdftex','pdf') then
job.setvariable('texengine','pdftex')
elsif @commandline.oneof('xetex','xtx') then
@@ -598,7 +601,7 @@ job.setvariable('given.backend',job.getvariable('backend'))
if (str = @commandline.option('backend')) && ! str.standard? && ! str.empty? then
job.setvariable('backend',str)
- elsif @commandline.oneof('pdfetex','pdftex','pdf','luatex') then
+ elsif @commandline.oneof('pdfetex','pdftex','pdf') then
job.setvariable('backend','pdftex')
elsif @commandline.oneof('dvipdfmx','dvipdfm','dpx','dpm') then
job.setvariable('backend','dvipdfmx')
@@ -616,7 +619,6 @@ job.setvariable('given.backend',job.getvariable('backend'))
case job.getvariable('texengine')
when 'pdfetex' then job.setvariable('backend','pdftex')
when 'pdftex' then job.setvariable('backend','pdftex')
- when 'luatex' then job.setvariable('backend','pdftex')
when 'xetex' then job.setvariable('backend','xetex')
when 'petex' then job.setvariable('backend','dvipdfmx')
when 'aleph' then job.setvariable('backend','dvipdfmx')
@@ -756,7 +758,6 @@ end
commandline.registerflag('pdf')
commandline.registerflag('pdftex')
commandline.registerflag('pdfetex')
-commandline.registerflag('luatex')
commandline.registerflag('dvipdfmx')
commandline.registerflag('dvipdfm')
diff --git a/Master/texmf-dist/scripts/context/ruby/texmfstart.rb b/Master/texmf-dist/scripts/context/ruby/texmfstart.rb
index 97087c3ae40..be892c83ced 100755
--- a/Master/texmf-dist/scripts/context/ruby/texmfstart.rb
+++ b/Master/texmf-dist/scripts/context/ruby/texmfstart.rb
@@ -158,7 +158,6 @@ $runners = Hash.new
$suffixinputs['pl'] = 'PERLINPUTS'
$suffixinputs['rb'] = 'RUBYINPUTS'
$suffixinputs['py'] = 'PYTHONINPUTS'
-$suffixinputs['lua'] = 'LUAINPUTS'
$suffixinputs['jar'] = 'JAVAINPUTS'
$suffixinputs['pdf'] = 'PDFINPUTS'
@@ -183,7 +182,6 @@ $predefined['pdftools'] = 'pdftools.rb'
$predefined['mpstools'] = 'mpstools.rb'
# $predefined['exatools'] = 'exatools.rb'
$predefined['xmltools'] = 'xmltools.rb'
-# $predefined['luatools'] = 'luatools.lua'
# $predefined['mtxtools'] = 'mtxtools.rb'
$predefined['newpstopdf'] = 'pstopdf.rb'
@@ -213,12 +211,11 @@ $makelist = [
'texfind',
'texshow'
#
- # no 'luatools',
# no 'mtxtools',
# no, 'texmfstart'
]
-$scriptlist = 'rb|pl|py|lua|jar'
+$scriptlist = 'rb|pl|py|jar'
$documentlist = 'pdf|ps|eps|htm|html'
$editor = ENV['TEXMFSTART_EDITOR'] || ENV['EDITOR'] || ENV['editor'] || 'scite'
@@ -230,7 +227,6 @@ def set_applications(page=1)
$applications['unknown'] = ''
$applications['ruby'] = $applications['rb'] = 'ruby'
- $applications['lua'] = $applications['lua'] = 'lua'
$applications['perl'] = $applications['pl'] = 'perl'
$applications['python'] = $applications['py'] = 'python'
$applications['java'] = $applications['jar'] = 'java'
@@ -248,8 +244,6 @@ def set_applications(page=1)
$applications['htm'] = $applications['html']
$applications['eps'] = $applications['ps']
- $runners['lua'] = "texlua"
-
end
set_applications()
diff --git a/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.dll b/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.dll
index 041e1a0e1d0..4116c5a24a6 100755
--- a/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.dll
+++ b/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.dll
Binary files differ
diff --git a/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua b/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua
index 2bdd1b8f020..cc5ebb478ac 100755
--- a/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua
+++ b/Master/texmf-dist/scripts/context/stubs/mswin/mtxrun.lua
@@ -8,7 +8,6 @@ if not modules then modules = { } end modules ['mtxrun'] = {
license = "see context related readme files"
}
-
-- one can make a stub:
--
-- #!/bin/sh
@@ -38,8 +37,6 @@ if not modules then modules = { } end modules ['mtxrun'] = {
-- remember for subruns: _CTX_K_S_#{original}_
-- remember for subruns: TEXMFSTART.#{original} [tex.rb texmfstart.rb]
-texlua = true
-
-- begin library merge
@@ -54,8 +51,9 @@ if not modules then modules = { } end modules ['l-string'] = {
license = "see context related readme files"
}
+local string = string
local sub, gsub, find, match, gmatch, format, char, byte, rep, lower = string.sub, string.gsub, string.find, string.match, string.gmatch, string.format, string.char, string.byte, string.rep, string.lower
-local lpegmatch = lpeg.match
+local lpegmatch, S, C, Ct = lpeg.match, lpeg.S, lpeg.C, lpeg.Ct
-- some functions may disappear as they are not used anywhere
@@ -63,196 +61,68 @@ if not string.split then
-- this will be overloaded by a faster lpeg variant
- function string:split(pattern)
- if #self > 0 then
- local t = { }
- for s in gmatch(self..pattern,"(.-)"..pattern) do
- t[#t+1] = s
+ function string.split(str,pattern)
+ local t = { }
+ if #str > 0 then
+ local n = 1
+ for s in gmatch(str..pattern,"(.-)"..pattern) do
+ t[n] = s
+ n = n + 1
end
- return t
- else
- return { }
end
+ return t
end
end
-local chr_to_esc = {
- ["%"] = "%%",
- ["."] = "%.",
- ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
- ["^"] = "%^", ["$"] = "%$",
- ["["] = "%[", ["]"] = "%]",
- ["("] = "%(", [")"] = "%)",
- ["{"] = "%{", ["}"] = "%}"
-}
-
-string.chr_to_esc = chr_to_esc
-
-function string:esc() -- variant 2
- return (gsub(self,"(.)",chr_to_esc))
-end
-
-function string:unquote()
- return (gsub(self,"^([\"\'])(.*)%1$","%2"))
+function string.unquoted(str)
+ return (gsub(str,"^([\"\'])(.*)%1$","%2"))
end
---~ function string:unquote()
---~ if find(self,"^[\'\"]") then
---~ return sub(self,2,-2)
---~ else
---~ return self
---~ end
---~ end
-function string:quote() -- we could use format("%q")
- return format("%q",self)
+function string.quoted(str)
+ return format("%q",str) -- always "
end
-function string:count(pattern) -- variant 3
+function string.count(str,pattern) -- variant 3
local n = 0
- for _ in gmatch(self,pattern) do
+ for _ in gmatch(str,pattern) do -- not for utf
n = n + 1
end
return n
end
-function string:limit(n,sentinel)
- if #self > n then
- sentinel = sentinel or " ..."
- return sub(self,1,(n-#sentinel)) .. sentinel
- else
- return self
- end
-end
-
---~ function string:strip() -- the .- is quite efficient
---~ -- return match(self,"^%s*(.-)%s*$") or ""
---~ -- return match(self,'^%s*(.*%S)') or '' -- posted on lua list
---~ return find(s,'^%s*$') and '' or match(s,'^%s*(.*%S)')
---~ end
-
-do -- roberto's variant:
- local space = lpeg.S(" \t\v\n")
- local nospace = 1 - space
- local stripper = space^0 * lpeg.C((space^0 * nospace^1)^0)
- function string.strip(str)
- return lpegmatch(stripper,str) or ""
- end
-end
-
-function string:is_empty()
- return not find(self,"%S")
-end
-
-function string:enhance(pattern,action)
- local ok, n = true, 0
- while ok do
- ok = false
- self = gsub(self,pattern, function(...)
- ok, n = true, n + 1
- return action(...)
- end)
- end
- return self, n
-end
-
-local chr_to_hex, hex_to_chr = { }, { }
-
-for i=0,255 do
- local c, h = char(i), format("%02X",i)
- chr_to_hex[c], hex_to_chr[h] = h, c
-end
-
-function string:to_hex()
- return (gsub(self or "","(.)",chr_to_hex))
-end
-
-function string:from_hex()
- return (gsub(self or "","(..)",hex_to_chr))
-end
-
-if not string.characters then
-
- local function nextchar(str, index)
- index = index + 1
- return (index <= #str) and index or nil, sub(str,index,index)
- end
- function string:characters()
- return nextchar, self, 0
- end
- local function nextbyte(str, index)
- index = index + 1
- return (index <= #str) and index or nil, byte(sub(str,index,index))
- end
- function string:bytes()
- return nextbyte, self, 0
- end
-
-end
-
--- we can use format for this (neg n)
-
-function string:rpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return self .. rep(chr or " ",m)
+function string.limit(str,n,sentinel) -- not utf proof
+ if #str > n then
+ sentinel = sentinel or "..."
+ return sub(str,1,(n-#sentinel)) .. sentinel
else
- return self
- end
-end
-
-function string:lpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return rep(chr or " ",m) .. self
- else
- return self
+ return str
end
end
-string.padd = string.rpadd
+local space = S(" \t\v\n")
+local nospace = 1 - space
+local stripper = space^0 * C((space^0 * nospace^1)^0) -- roberto's code
-function is_number(str) -- tonumber
- return find(str,"^[%-%+]?[%d]-%.?[%d+]$") == 1
+function string.strip(str)
+ return lpegmatch(stripper,str) or ""
end
---~ print(is_number("1"))
---~ print(is_number("1.1"))
---~ print(is_number(".1"))
---~ print(is_number("-0.1"))
---~ print(is_number("+0.1"))
---~ print(is_number("-.1"))
---~ print(is_number("+.1"))
-
-function string:split_settings() -- no {} handling, see l-aux for lpeg variant
- if find(self,"=") then
- local t = { }
- for k,v in gmatch(self,"(%a+)=([^%,]*)") do
- t[k] = v
- end
- return t
- else
- return nil
- end
+function string.is_empty(str)
+ return not find(str,"%S")
end
local patterns_escapes = {
- ["-"] = "%-",
- ["."] = "%.",
- ["+"] = "%+",
- ["*"] = "%*",
["%"] = "%%",
- ["("] = "%)",
- [")"] = "%)",
- ["["] = "%[",
- ["]"] = "%]",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%(", [")"] = "%)",
+ -- ["{"] = "%{", ["}"] = "%}"
+ -- ["^"] = "%^", ["$"] = "%$",
}
-function string:pattesc()
- return (gsub(self,".",patterns_escapes))
-end
-
local simple_escapes = {
["-"] = "%-",
["."] = "%.",
@@ -260,80 +130,30 @@ local simple_escapes = {
["*"] = ".*",
}
-function string:simpleesc()
- return (gsub(self,".",simple_escapes))
-end
-
-function string:tohash()
- local t = { }
- for s in gmatch(self,"([^, ]+)") do -- lpeg
- t[s] = true
- end
- return t
-end
-
-local pattern = lpeg.Ct(lpeg.C(1)^0)
-
-function string:totable()
- return lpegmatch(pattern,self)
+function string.escapedpattern(str,simple)
+ return (gsub(str,".",simple and simple_escapes or patterns_escapes))
end
---~ local t = {
---~ "1234567123456712345671234567",
---~ "a\tb\tc",
---~ "aa\tbb\tcc",
---~ "aaa\tbbb\tccc",
---~ "aaaa\tbbbb\tcccc",
---~ "aaaaa\tbbbbb\tccccc",
---~ "aaaaaa\tbbbbbb\tcccccc",
---~ }
---~ for k,v do
---~ print(string.tabtospace(t[k]))
---~ end
-
-function string.tabtospace(str,tab)
- -- we don't handle embedded newlines
- while true do
- local s = find(str,"\t")
- if s then
- if not tab then tab = 7 end -- only when found
- local d = tab-(s-1) % tab
- if d > 0 then
- str = gsub(str,"\t",rep(" ",d),1)
- else
- str = gsub(str,"\t","",1)
- end
+function string.topattern(str,lowercase,strict)
+ if str == "" then
+ return ".*"
+ else
+ str = gsub(str,".",simple_escapes)
+ if lowercase then
+ str = lower(str)
+ end
+ if strict then
+ return "^" .. str .. "$"
else
- break
+ return str
end
end
- return str
end
-function string:compactlong() -- strips newlines and leading spaces
- self = gsub(self,"[\n\r]+ *","")
- self = gsub(self,"^ *","")
- return self
-end
-
-function string:striplong() -- strips newlines and leading spaces
- self = gsub(self,"^%s*","")
- self = gsub(self,"[\n\r]+ *","\n")
- return self
-end
+-- obsolete names:
-function string:topattern(lowercase,strict)
- if lowercase then
- self = lower(self)
- end
- self = gsub(self,".",simple_escapes)
- if self == "" then
- self = ".*"
- elseif strict then
- self = "^" .. self .. "$"
- end
- return self
-end
+string.quote = string.quoted
+string.unquote = string.unquoted
end -- of closure
@@ -350,28 +170,75 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
local lpeg = require("lpeg")
+local type = type
+
+-- Beware, we predefine a bunch of patterns here and one reason for doing so
+-- is that we get consistent behaviour in some of the visualizers.
+
lpeg.patterns = lpeg.patterns or { } -- so that we can share
local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
-local match = lpeg.match
+local P, R, S, V, match = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.match
+local Ct, C, Cs, Cc = lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local lpegtype = lpeg.type
+
+local utfcharacters = string.utfcharacters
+local utfgmatch = unicode and unicode.utf8.gmatch
+
+local anything = P(1)
+local endofstring = P(-1)
+local alwaysmatched = P(true)
+
+patterns.anything = anything
+patterns.endofstring = endofstring
+patterns.beginofstring = alwaysmatched
+patterns.alwaysmatched = alwaysmatched
local digit, sign = R('09'), S('+-')
local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
-local utf8byte = R("\128\191")
+local newline = crlf + cr + lf
+local escaped = P("\\") * anything
+local squote = P("'")
+local dquote = P('"')
+local space = P(" ")
+
+local utfbom_32_be = P('\000\000\254\255')
+local utfbom_32_le = P('\255\254\000\000')
+local utfbom_16_be = P('\255\254')
+local utfbom_16_le = P('\254\255')
+local utfbom_8 = P('\239\187\191')
+local utfbom = utfbom_32_be + utfbom_32_le
+ + utfbom_16_be + utfbom_16_le
+ + utfbom_8
+local utftype = utfbom_32_be / "utf-32-be" + utfbom_32_le / "utf-32-le"
+ + utfbom_16_be / "utf-16-be" + utfbom_16_le / "utf-16-le"
+ + utfbom_8 / "utf-8" + alwaysmatched / "unknown"
+
+local utf8next = R("\128\191")
-patterns.utf8byte = utf8byte
patterns.utf8one = R("\000\127")
-patterns.utf8two = R("\194\223") * utf8byte
-patterns.utf8three = R("\224\239") * utf8byte * utf8byte
-patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+patterns.utf8two = R("\194\223") * utf8next
+patterns.utf8three = R("\224\239") * utf8next * utf8next
+patterns.utf8four = R("\240\244") * utf8next * utf8next * utf8next
+patterns.utfbom = utfbom
+patterns.utftype = utftype
+
+local utf8char = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+local validutf8char = utf8char^0 * endofstring * Cc(true) + Cc(false)
+
+patterns.utf8 = utf8char
+patterns.utf8char = utf8char
+patterns.validutf8 = validutf8char
+patterns.validutf8char = validutf8char
patterns.digit = digit
patterns.sign = sign
patterns.cardinal = sign^0 * digit^1
patterns.integer = sign^0 * digit^1
patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.cfloat = sign^0 * digit^0 * P(',') * digit^1
patterns.number = patterns.float + patterns.integer
+patterns.cnumber = patterns.cfloat + patterns.integer
patterns.oct = P("0") * R("07")^1
patterns.octal = patterns.oct
patterns.HEX = P("0x") * R("09","AF")^1
@@ -380,16 +247,42 @@ patterns.hexadecimal = P("0x") * R("09","AF","af")^1
patterns.lowercase = R("az")
patterns.uppercase = R("AZ")
patterns.letter = patterns.lowercase + patterns.uppercase
-patterns.space = S(" ")
+patterns.space = space
+patterns.tab = P("\t")
+patterns.spaceortab = patterns.space + patterns.tab
patterns.eol = S("\n\r")
patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-patterns.newline = crlf + cr + lf
-patterns.nonspace = 1 - patterns.space
+patterns.newline = newline
+patterns.emptyline = newline^1
patterns.nonspacer = 1 - patterns.spacer
patterns.whitespace = patterns.eol + patterns.spacer
patterns.nonwhitespace = 1 - patterns.whitespace
-patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
-patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
+patterns.equal = P("=")
+patterns.comma = P(",")
+patterns.commaspacer = P(",") * patterns.spacer^0
+patterns.period = P(".")
+patterns.colon = P(":")
+patterns.semicolon = P(";")
+patterns.underscore = P("_")
+patterns.escaped = escaped
+patterns.squote = squote
+patterns.dquote = dquote
+patterns.nosquote = (escaped + (1-squote))^0
+patterns.nodquote = (escaped + (1-dquote))^0
+patterns.unsingle = (squote/"") * patterns.nosquote * (squote/"")
+patterns.undouble = (dquote/"") * patterns.nodquote * (dquote/"")
+patterns.unquoted = patterns.undouble + patterns.unsingle -- more often undouble
+patterns.unspacer = ((patterns.spacer^1)/"")^0
+
+patterns.somecontent = (anything - newline - space)^1 -- (utf8char - newline - space)^1
+patterns.beginline = #(1-newline)
+
+local unquoted = Cs(patterns.unquoted * endofstring) -- not C
+
+function string.unquoted(str)
+ return match(unquoted,str) or str
+end
+
function lpeg.anywhere(pattern) --slightly adapted from website
return P { P(pattern) + 1 * V(1) } -- why so complex?
@@ -399,36 +292,18 @@ function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
-local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
-local empty = spacing * Cc("")
-local nonempty = Cs((1-spacing)^1) * spacing^-1
-local content = (empty + nonempty)^1
-
-local capture = Ct(content^0)
-
-function string:splitlines()
- return match(capture,self)
-end
-
-patterns.textline = content
-
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps")) -- oeps
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps")) -- oeps
-
local splitters_s, splitters_m = { }, { }
local function splitat(separator,single)
local splitter = (single and splitters_s[separator]) or splitters_m[separator]
if not splitter then
separator = P(separator)
+ local other = C((1 - separator)^0)
if single then
- local other, any = C((1 - separator)^0), P(1)
+ local any = anything
splitter = other * (separator * C(any^0) + "") -- ?
splitters_s[separator] = splitter
else
- local other = C((1 - separator)^0)
splitter = other * (separator * other)^0
splitters_m[separator] = splitter
end
@@ -438,6 +313,7 @@ end
lpeg.splitat = splitat
+
local cache = { }
function lpeg.split(separator,str)
@@ -449,16 +325,39 @@ function lpeg.split(separator,str)
return match(c,str)
end
-function string:split(separator)
+function string.split(str,separator)
local c = cache[separator]
if not c then
c = Ct(splitat(separator))
cache[separator] = c
end
- return match(c,self)
+ return match(c,str)
+end
+
+local spacing = patterns.spacer^0 * newline -- sort of strip
+local empty = spacing * Cc("")
+local nonempty = Cs((1-spacing)^1) * spacing^-1
+local content = (empty + nonempty)^1
+
+patterns.textline = content
+
+
+local linesplitter = Ct(splitat(newline))
+
+patterns.linesplitter = linesplitter
+
+function string.splitlines(str)
+ return match(linesplitter,str)
+end
+
+local utflinesplitter = utfbom^-1 * Ct(splitat(newline))
+
+patterns.utflinesplitter = utflinesplitter
+
+function string.utfsplitlines(str)
+ return match(utflinesplitter,str)
end
-lpeg.splitters = cache
local cache = { }
@@ -466,37 +365,24 @@ function lpeg.checkedsplit(separator,str)
local c = cache[separator]
if not c then
separator = P(separator)
- local other = C((1 - separator)^0)
+ local other = C((1 - separator)^1)
c = Ct(separator^0 * other * (separator^1 * other)^0)
cache[separator] = c
end
return match(c,str)
end
-function string:checkedsplit(separator)
+function string.checkedsplit(str,separator)
local c = cache[separator]
if not c then
separator = P(separator)
- local other = C((1 - separator)^0)
+ local other = C((1 - separator)^1)
c = Ct(separator^0 * other * (separator^1 * other)^0)
cache[separator] = c
end
- return match(c,self)
+ return match(c,str)
end
---~ function lpeg.append(list,pp)
---~ local p = pp
---~ for l=1,#list do
---~ if p then
---~ p = p + P(list[l])
---~ else
---~ p = P(list[l])
---~ end
---~ end
---~ return p
---~ end
-
---~ from roberto's site:
local f1 = string.byte
@@ -504,7 +390,273 @@ local function f2(s) local c1, c2 = f1(s,1,2) return c1 * 64 + c2
local function f3(s) local c1, c2, c3 = f1(s,1,3) return (c1 * 64 + c2) * 64 + c3 - 925824 end
local function f4(s) local c1, c2, c3, c4 = f1(s,1,4) return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168 end
-patterns.utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
+local utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
+
+patterns.utf8byte = utf8byte
+
+
+
+local cache = { }
+
+function lpeg.stripper(str)
+ if type(str) == "string" then
+ local s = cache[str]
+ if not s then
+ s = Cs(((S(str)^1)/"" + 1)^0)
+ cache[str] = s
+ end
+ return s
+ else
+ return Cs(((str^1)/"" + 1)^0)
+ end
+end
+
+local cache = { }
+
+function lpeg.keeper(str)
+ if type(str) == "string" then
+ local s = cache[str]
+ if not s then
+ s = Cs((((1-S(str))^1)/"" + 1)^0)
+ cache[str] = s
+ end
+ return s
+ else
+ return Cs((((1-str)^1)/"" + 1)^0)
+ end
+end
+
+function lpeg.frontstripper(str) -- or pattern (yet undocumented)
+ return (P(str) + P(true)) * Cs(P(1)^0)
+end
+
+function lpeg.endstripper(str) -- or pattern (yet undocumented)
+ return Cs((1 - P(str) * P(-1))^0)
+end
+
+-- Just for fun I looked at the used bytecode and
+-- p = (p and p + pp) or pp gets one more (testset).
+
+function lpeg.replacer(one,two)
+ if type(one) == "table" then
+ local no = #one
+ if no > 0 then
+ local p
+ for i=1,no do
+ local o = one[i]
+ local pp = P(o[1]) / o[2]
+ if p then
+ p = p + pp
+ else
+ p = pp
+ end
+ end
+ return Cs((p + 1)^0)
+ end
+ else
+ two = two or ""
+ return Cs((P(one)/two + 1)^0)
+ end
+end
+
+local splitters_f, splitters_s = { }, { }
+
+function lpeg.firstofsplit(separator) -- always return value
+ local splitter = splitters_f[separator]
+ if not splitter then
+ separator = P(separator)
+ splitter = C((1 - separator)^0)
+ splitters_f[separator] = splitter
+ end
+ return splitter
+end
+
+function lpeg.secondofsplit(separator) -- nil if not split
+ local splitter = splitters_s[separator]
+ if not splitter then
+ separator = P(separator)
+ splitter = (1 - separator)^0 * separator * C(anything^0)
+ splitters_s[separator] = splitter
+ end
+ return splitter
+end
+
+function lpeg.balancer(left,right)
+ left, right = P(left), P(right)
+ return P { left * ((1 - left - right) + V(1))^0 * right }
+end
+
+
+
+local nany = utf8char/""
+
+function lpeg.counter(pattern)
+ pattern = Cs((P(pattern)/" " + nany)^0)
+ return function(str)
+ return #match(pattern,str)
+ end
+end
+
+if utfgmatch then
+
+ function lpeg.count(str,what) -- replaces string.count
+ if type(what) == "string" then
+ local n = 0
+ for _ in utfgmatch(str,what) do
+ n = n + 1
+ end
+ return n
+ else -- 4 times slower but still faster than / function
+ return #match(Cs((P(what)/" " + nany)^0),str)
+ end
+ end
+
+else
+
+ local cache = { }
+
+ function lpeg.count(str,what) -- replaces string.count
+ if type(what) == "string" then
+ local p = cache[what]
+ if not p then
+ p = Cs((P(what)/" " + nany)^0)
+ cache[p] = p
+ end
+ return #match(p,str)
+ else -- 4 times slower but still faster than / function
+ return #match(Cs((P(what)/" " + nany)^0),str)
+ end
+ end
+
+end
+
+local patterns_escapes = { -- also defines in l-string
+ ["%"] = "%%",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%)", [")"] = "%)",
+ -- ["{"] = "%{", ["}"] = "%}"
+ -- ["^"] = "%^", ["$"] = "%$",
+}
+
+local simple_escapes = { -- also defines in l-string
+ ["-"] = "%-",
+ ["."] = "%.",
+ ["?"] = ".",
+ ["*"] = ".*",
+}
+
+local p = Cs((S("-.+*%()[]") / patterns_escapes + anything)^0)
+local s = Cs((S("-.+*%()[]") / simple_escapes + anything)^0)
+
+function string.escapedpattern(str,simple)
+ return match(simple and s or p,str)
+end
+
+-- utf extensies
+
+lpeg.UP = lpeg.P
+
+if utfcharacters then
+
+ function lpeg.US(str)
+ local p
+ for uc in utfcharacters(str) do
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ return p
+ end
+
+
+elseif utfgmatch then
+
+ function lpeg.US(str)
+ local p
+ for uc in utfgmatch(str,".") do
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ return p
+ end
+
+else
+
+ function lpeg.US(str)
+ local p
+ local f = function(uc)
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ match((utf8char/f)^0,str)
+ return p
+ end
+
+end
+
+local range = Cs(utf8byte) * (Cs(utf8byte) + Cc(false))
+
+local utfchar = unicode and unicode.utf8 and unicode.utf8.char
+
+function lpeg.UR(str,more)
+ local first, last
+ if type(str) == "number" then
+ first = str
+ last = more or first
+ else
+ first, last = match(range,str)
+ if not last then
+ return P(str)
+ end
+ end
+ if first == last then
+ return P(str)
+ elseif utfchar and last - first < 8 then -- a somewhat arbitrary criterium
+ local p
+ for i=first,last do
+ if p then
+ p = p + P(utfchar(i))
+ else
+ p = P(utfchar(i))
+ end
+ end
+ return p -- nil when invalid range
+ else
+ local f = function(b)
+ return b >= first and b <= last
+ end
+ return utf8byte / f -- nil when invalid range
+ end
+end
+
+
+
+function lpeg.oneof(list,...) -- lpeg.oneof("elseif","else","if","then")
+ if type(list) ~= "table" then
+ list = { list, ... }
+ end
+ -- sort(list) -- longest match first
+ local p = P(list[1])
+ for l=2,#list do
+ p = p + P(list[l])
+ end
+ return p
+end
+
+function lpeg.is_lpeg(p)
+ return p and lpegtype(p) == "pattern"
+end
+
end -- of closure
@@ -519,12 +671,10 @@ if not modules then modules = { } end modules ['l-table'] = {
license = "see context related readme files"
}
-table.join = table.concat
-
+local type, next, tostring, tonumber, ipairs, table, string = type, next, tostring, tonumber, ipairs, table, string
local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove
local format, find, gsub, lower, dump, match = string.format, string.find, string.gsub, string.lower, string.dump, string.match
local getmetatable, setmetatable = getmetatable, setmetatable
-local type, next, tostring, tonumber, ipairs = type, next, tostring, tonumber, ipairs
-- Starting with version 5.2 Lua no longer provide ipairs, which makes
-- sense. As we already used the for loop and # in most places the
@@ -576,50 +726,56 @@ end
-- extra functions, some might go (when not used)
function table.strip(tab)
- local lst = { }
+ local lst, l = { }, 0
for i=1,#tab do
local s = gsub(tab[i],"^%s*(.-)%s*$","%1")
if s == "" then
-- skip this one
else
- lst[#lst+1] = s
+ l = l + 1
+ lst[l] = s
end
end
return lst
end
function table.keys(t)
- local k = { }
+ local keys, k = { }, 0
for key, _ in next, t do
- k[#k+1] = key
+ k = k + 1
+ keys[k] = key
end
- return k
+ return keys
end
local function compare(a,b)
- return (tostring(a) < tostring(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)
+ end
end
local function sortedkeys(tab)
- local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
+ local srt, category, s = { }, 0, 0 -- 0=unknown 1=string, 2=number 3=mixed
for key,_ in next, tab do
- srt[#srt+1] = key
- if kind == 3 then
+ s = s + 1
+ srt[s] = key
+ if category == 3 then
-- no further check
else
local tkey = type(key)
if tkey == "string" then
- -- if kind == 2 then kind = 3 else kind = 1 end
- kind = (kind == 2 and 3) or 1
+ category = (category == 2 and 3) or 1
elseif tkey == "number" then
- -- if kind == 1 then kind = 3 else kind = 2 end
- kind = (kind == 1 and 3) or 2
+ category = (category == 1 and 3) or 2
else
- kind = 3
+ category = 3
end
end
end
- if kind == 0 or kind == 3 then
+ if category == 0 or category == 3 then
sort(srt,compare)
else
sort(srt)
@@ -628,9 +784,12 @@ local function sortedkeys(tab)
end
local function sortedhashkeys(tab) -- fast one
- local srt = { }
+ local srt, s = { }, 0
for key,_ in next, tab do
- srt[#srt+1] = key
+ if key then
+ s= s + 1
+ srt[s] = key
+ end
end
sort(srt)
return srt
@@ -639,34 +798,50 @@ end
table.sortedkeys = sortedkeys
table.sortedhashkeys = sortedhashkeys
-function table.sortedhash(t)
- local s = sortedhashkeys(t) -- maybe just sortedkeys
- local n = 0
- local function kv(s)
- n = n + 1
- local k = s[n]
- return k, t[k]
+local function nothing() end
+
+local function sortedhash(t)
+ if t then
+ local n, s = 0, sortedkeys(t) -- the robust one
+ local function kv(s)
+ n = n + 1
+ local k = s[n]
+ return k, t[k]
+ end
+ return kv, s
+ else
+ return nothing
end
- return kv, s
end
-table.sortedpairs = table.sortedhash
+table.sortedhash = sortedhash
+table.sortedpairs = sortedhash
function table.append(t, list)
- for _,v in next, list do
- insert(t,v)
+ local n = #t
+ for i=1,#list do
+ n = n + 1
+ t[n] = list[i]
end
+ return t
end
function table.prepend(t, list)
- for k,v in next, list do
- insert(t,k,v)
+ local nl = #list
+ local nt = nl + #t
+ for i=#t,1,-1 do
+ t[nt] = t[i]
+ nt = nt - 1
+ end
+ for i=1,#list do
+ t[i] = list[i]
end
+ return t
end
function table.merge(t, ...) -- first one is target
- t = t or {}
- local lst = {...}
+ t = t or { }
+ local lst = { ... }
for i=1,#lst do
for k, v in next, lst[i] do
t[k] = v
@@ -676,7 +851,7 @@ function table.merge(t, ...) -- first one is target
end
function table.merged(...)
- local tmp, lst = { }, {...}
+ local tmp, lst = { }, { ... }
for i=1,#lst do
for k, v in next, lst[i] do
tmp[k] = v
@@ -686,41 +861,45 @@ function table.merged(...)
end
function table.imerge(t, ...)
- local lst = {...}
+ local lst, nt = { ... }, #t
for i=1,#lst do
local nst = lst[i]
for j=1,#nst do
- t[#t+1] = nst[j]
+ nt = nt + 1
+ t[nt] = nst[j]
end
end
return t
end
function table.imerged(...)
- local tmp, lst = { }, {...}
+ local tmp, ntmp, lst = { }, 0, {...}
for i=1,#lst do
local nst = lst[i]
for j=1,#nst do
- tmp[#tmp+1] = nst[j]
+ ntmp = ntmp + 1
+ tmp[ntmp] = nst[j]
end
end
return tmp
end
-local function fastcopy(old) -- fast one
+local function fastcopy(old,metatabletoo) -- fast one
if old then
local new = { }
for k,v in next, old do
if type(v) == "table" then
- new[k] = fastcopy(v) -- was just table.copy
+ new[k] = fastcopy(v,metatabletoo) -- was just table.copy
else
new[k] = v
end
end
- -- optional second arg
- local mt = getmetatable(old)
- if mt then
- setmetatable(new,mt)
+ if metatabletoo then
+ -- optional second arg
+ local mt = getmetatable(old)
+ if mt then
+ setmetatable(new,mt)
+ end
end
return new
else
@@ -728,6 +907,8 @@ local function fastcopy(old) -- fast one
end
end
+-- todo : copy without metatable
+
local function copy(t, tables) -- taken from lua wiki, slightly adapted
tables = tables or { }
local tcopy = {}
@@ -760,33 +941,14 @@ end
table.fastcopy = fastcopy
table.copy = copy
--- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
-
-function table.sub(t,i,j)
- return { unpack(t,i,j) }
-end
-
-function table.replace(a,b)
- for k,v in next, b do
- a[k] = v
+function table.derive(parent)
+ local child = { }
+ if parent then
+ setmetatable(child,{ __index = parent })
end
+ return child
end
--- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice)
-
-function table.is_empty(t) -- obolete, use inline code instead
- return not t or not next(t)
-end
-
-function table.one_entry(t) -- obolete, use inline code instead
- local n = next(t)
- return n and not next(t,n)
-end
-
---~ function table.starts_at(t) -- obsolete, not nice anyway
---~ return ipairs(t,1)(t,0)
---~ end
-
function table.tohash(t,value)
local h = { }
if t then
@@ -799,27 +961,19 @@ function table.tohash(t,value)
end
function table.fromhash(t)
- local h = { }
+ local hsh, h = { }, 0
for k, v in next, t do -- no ipairs here
- if v then h[#h+1] = k end
+ if v then
+ h = h + 1
+ hsh[h] = k
+ end
end
- return h
+ return hsh
end
---~ print(table.serialize(t), "\n")
---~ print(table.serialize(t,"name"), "\n")
---~ print(table.serialize(t,false), "\n")
---~ print(table.serialize(t,true), "\n")
---~ print(table.serialize(t,"name",true), "\n")
---~ print(table.serialize(t,"name",true,true), "\n")
-
-table.serialize_functions = true
-table.serialize_compact = true
-table.serialize_inline = true
-
local noquotes, hexify, handle, reduce, compact, inline, functions
-local reserved = table.tohash { -- intercept a language flaw, no reserved words as key
+local reserved = table.tohash { -- intercept a language inconvenience: no reserved words as key
'and', 'break', 'do', 'else', 'elseif', 'end', 'false', 'for', 'function', 'if',
'in', 'local', 'nil', 'not', 'or', 'repeat', 'return', 'then', 'true', 'until', 'while',
}
@@ -831,20 +985,23 @@ local function simple_table(t)
n = n + 1
end
if n == #t then
- local tt = { }
+ local tt, nt = { }, 0
for i=1,#t do
local v = t[i]
local tv = type(v)
if tv == "number" then
+ nt = nt + 1
if hexify then
- tt[#tt+1] = format("0x%04X",v)
+ tt[nt] = format("0x%04X",v)
else
- tt[#tt+1] = tostring(v) -- tostring not needed
+ tt[nt] = tostring(v) -- tostring not needed
end
elseif tv == "boolean" then
- tt[#tt+1] = tostring(v)
+ nt = nt + 1
+ tt[nt] = tostring(v)
elseif tv == "string" then
- tt[#tt+1] = format("%q",v)
+ nt = nt + 1
+ tt[nt] = format("%q",v)
else
tt = nil
break
@@ -870,21 +1027,25 @@ local function do_serialize(root,name,depth,level,indexed)
depth = depth .. " "
if indexed then
handle(format("%s{",depth))
- elseif name then
- --~ handle(format("%s%s={",depth,key(name)))
- if type(name) == "number" then -- or find(k,"^%d+$") then
+ else
+ local tn = type(name)
+ if tn == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s[0x%04X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
- elseif noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
- handle(format("%s%s={",depth,name))
+ elseif tn == "string" then
+ if noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
+ handle(format("%s%s={",depth,name))
+ else
+ handle(format("%s[%q]={",depth,name))
+ end
+ elseif tn == "boolean" then
+ handle(format("%s[%s]={",depth,tostring(name)))
else
- handle(format("%s[%q]={",depth,name))
+ handle(format("%s{",depth))
end
- else
- handle(format("%s{",depth))
end
end
-- we could check for k (index) being number (cardinal)
@@ -901,11 +1062,9 @@ local function do_serialize(root,name,depth,level,indexed)
for i=1,#sk do
local k = sk[i]
local v = root[k]
- --~ if v == root then
- -- circular
- --~ else
- local t = type(v)
- if compact and first and type(k) == "number" and k >= first and k <= last then
+ -- circular
+ local t, tk = type(v), type(k)
+ if compact and first and tk == "number" and k >= first and k <= last then
if t == "number" then
if hexify then
handle(format("%s 0x%04X,",depth,v))
@@ -947,17 +1106,18 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s __p__=nil,",depth))
end
elseif t == "number" then
- --~ if hexify then
- --~ handle(format("%s %s=0x%04X,",depth,key(k),v))
- --~ else
- --~ handle(format("%s %s=%s,",depth,key(k),v)) -- %.99g
- --~ end
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=0x%04X,",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,tostring(k),v))
+ else
+ handle(format("%s [%s]=%s,",depth,tostring(k),v)) -- %.99g
+ end
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
if hexify then
handle(format("%s %s=0x%04X,",depth,k,v))
@@ -973,26 +1133,28 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "string" then
if reduce and tonumber(v) then
- --~ handle(format("%s %s=%s,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=%s,",depth,tostring(k),v))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%s,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
else
- --~ handle(format("%s %s=%q,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=%q,",depth,tostring(k),v))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%q,",depth,k,v))
else
@@ -1001,13 +1163,14 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "table" then
if not next(v) then
- --~ handle(format("%s %s={},",depth,key(k)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]={},",depth,tostring(k)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s={},",depth,k))
else
@@ -1016,13 +1179,14 @@ local function do_serialize(root,name,depth,level,indexed)
elseif inline then
local st = simple_table(v)
if st then
- --~ handle(format("%s %s={ %s },",depth,key(k),concat(st,", ")))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]={ %s },",depth,tostring(k),concat(st,", ")))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s={ %s },",depth,k,concat(st,", ")))
else
@@ -1035,13 +1199,14 @@ local function do_serialize(root,name,depth,level,indexed)
do_serialize(v,k,depth,level+1)
end
elseif t == "boolean" then
- --~ handle(format("%s %s=%s,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%s,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%s,",depth,k,tostring(v)))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]=%s,",depth,tostring(k),tostring(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%s,",depth,k,tostring(v)))
else
@@ -1049,35 +1214,37 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "function" then
if functions then
- --~ handle(format('%s %s=loadstring(%q),',depth,key(k),dump(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v)))
else
handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v)))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=loadstring(%q),",depth,tostring(k),dump(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=loadstring(%q),",depth,k,dump(v)))
else
- handle(format("%s [%q]=loadstring(%q),",depth,k,dump(v)))
+ -- handle(format("%s [%q]=loadstring(%q),",depth,k,dump(v)))
+ handle(format("%s [%q]=loadstring(%q),",depth,k,debug.getinfo(v).what == "C" and "C code" or dump(v)))
end
end
else
- --~ handle(format("%s %s=%q,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]=%q,",depth,tostring(k),tostring(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%q,",depth,k,tostring(v)))
else
handle(format("%s [%q]=%q,",depth,k,tostring(v)))
end
end
- --~ end
- end
+ end
end
if level > 0 then
handle(format("%s},",depth))
@@ -1087,15 +1254,34 @@ end
-- replacing handle by a direct t[#t+1] = ... (plus test) is not much
-- faster (0.03 on 1.00 for zapfino.tma)
-local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
- noquotes = _noquotes
- hexify = _hexify
- handle = _handle or print
- reduce = _reduce or false
- compact = table.serialize_compact
- inline = compact and table.serialize_inline
- functions = table.serialize_functions
+local function serialize(_handle,root,name,specification) -- handle wins
local tname = type(name)
+ if type(specification) == "table" then
+ noquotes = specification.noquotes
+ hexify = specification.hexify
+ handle = _handle or specification.handle or print
+ reduce = specification.reduce or false
+ functions = specification.functions
+ compact = specification.compact
+ inline = specification.inline and compact
+ if functions == nil then
+ functions = true
+ end
+ if compact == nil then
+ compact = true
+ end
+ if inline == nil then
+ inline = compact
+ end
+ else
+ noquotes = false
+ hexify = false
+ handle = _handle or print
+ reduce = false
+ compact = true
+ inline = true
+ functions = true
+ end
if tname == "string" then
if name == "return" then
handle("return {")
@@ -1117,33 +1303,33 @@ local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
else
handle("t={")
end
- if root and next(root) then
- do_serialize(root,name,"",0,indexed)
+ if root then
+ -- The dummy access will initialize a table that has a delayed initialization
+ -- using a metatable. (maybe explicitly test for metatable)
+ if getmetatable(root) then -- todo: make this an option, maybe even per subtable
+ local dummy = root._w_h_a_t_e_v_e_r_
+ root._w_h_a_t_e_v_e_r_ = nil
+ end
+ -- Let's forget about empty tables.
+ if next(root) then
+ do_serialize(root,name,"",0)
+ end
end
handle("}")
end
---~ name:
---~
---~ true : return { }
---~ false : { }
---~ nil : t = { }
---~ string : string = { }
---~ 'return' : return { }
---~ number : [number] = { }
-function table.serialize(root,name,reduce,noquotes,hexify)
- local t = { }
+function table.serialize(root,name,specification)
+ local t, n = { }, 0
local function flush(s)
- t[#t+1] = s
+ n = n + 1
+ t[n] = s
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
return concat(t,"\n")
end
-function table.tohandle(handle,root,name,reduce,noquotes,hexify)
- serialize(root,name,handle,reduce,noquotes,hexify)
-end
+table.tohandle = serialize
-- sometimes tables are real use (zapfino extra pro is some 85M) in which
-- case a stepwise serialization is nice; actually, we could consider:
@@ -1154,73 +1340,63 @@ end
--
-- so this is on the todo list
-table.tofile_maxtab = 2*1024
+local maxtab = 2*1024
-function table.tofile(filename,root,name,reduce,noquotes,hexify)
+function table.tofile(filename,root,name,specification)
local f = io.open(filename,'w')
if f then
- local maxtab = table.tofile_maxtab
if maxtab > 1 then
- local t = { }
+ local t, n = { }, 0
local function flush(s)
- t[#t+1] = s
- if #t > maxtab then
+ n = n + 1
+ t[n] = s
+ if n > maxtab then
f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
- t = { }
+ t, n = { }, 0 -- we could recycle t if needed
end
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
f:write(concat(t,"\n"),"\n")
else
local function flush(s)
f:write(s,"\n")
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
end
f:close()
+ io.flush()
end
end
-local function flatten(t,f,complete) -- is this used? meybe a variant with next, ...
- for i=1,#t do
- local v = t[i]
- if type(v) == "table" then
- if complete or type(v[1]) == "table" then
- flatten(v,f,complete)
+local function flattened(t,f,depth)
+ if f == nil then
+ f = { }
+ depth = 0xFFFF
+ elseif tonumber(f) then
+ -- assume then only two arguments are given
+ depth = f
+ f = { }
+ elseif not depth then
+ depth = 0xFFFF
+ end
+ for k, v in next, t do
+ if type(k) ~= "number" then
+ if depth > 0 and type(v) == "table" then
+ flattened(v,f,depth-1)
else
- f[#f+1] = v
+ f[k] = v
end
- else
- f[#f+1] = v
end
end
-end
-
-function table.flatten(t)
- local f = { }
- flatten(t,f,true)
- return f
-end
-
-function table.unnest(t) -- bad name
- local f = { }
- flatten(t,f,false)
- return f
-end
-
-table.flatten_one_level = table.unnest
-
--- a better one:
-
-local function flattened(t,f)
- if not f then
- f = { }
- end
- for k, v in next, t do
- if type(v) == "table" then
- flattened(v,f)
+ local n = #f
+ for k=1,#t do
+ local v = t[k]
+ if depth > 0 and type(v) == "table" then
+ flattened(v,f,depth-1)
+ n = #f
else
- f[k] = v
+ n = n + 1
+ f[n] = v
end
end
return f
@@ -1228,49 +1404,27 @@ end
table.flattened = flattened
--- the next three may disappear
-
-function table.remove_value(t,value) -- todo: n
- if value then
- for i=1,#t do
- if t[i] == value then
- remove(t,i)
- -- remove all, so no: return
- end
- end
+local function unnest(t,f) -- only used in mk, for old times sake
+ if not f then -- and only relevant for token lists
+ f = { }
end
-end
-
-function table.insert_before_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i,str)
- return
- end
+ for i=1,#t do
+ local v = t[i]
+ if type(v) == "table" then
+ if type(v[1]) == "table" then
+ unnest(v,f)
+ else
+ f[#f+1] = v
end
+ else
+ f[#f+1] = v
end
- insert(t,1,str)
- elseif value then
- insert(t,1,value)
end
+ return f
end
-function table.insert_after_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,str)
- return
- end
- end
- end
- t[#t+1] = str
- elseif value then
- t[#t+1] = value
- end
+function table.unnest(t) -- bad name
+ return unnest(t)
end
local function are_equal(a,b,n,m) -- indexed
@@ -1297,7 +1451,7 @@ end
local function identical(a,b) -- assumes same structure
for ka, va in next, a do
- local vb = b[k]
+ local vb = b[ka]
if va == vb then
-- same
elseif type(va) == "table" and type(vb) == "table" then
@@ -1311,8 +1465,8 @@ local function identical(a,b) -- assumes same structure
return true
end
-table.are_equal = are_equal
table.identical = identical
+table.are_equal = are_equal
-- maybe also make a combined one
@@ -1338,89 +1492,84 @@ function table.contains(t, v)
end
function table.count(t)
- local n, e = 0, next(t)
- while e do
- n, e = n + 1, next(t,e)
+ local n = 0
+ for k, v in next, t do
+ n = n + 1
end
return n
end
-function table.swapped(t)
- local s = { }
+function table.swapped(t,s) -- hash
+ local n = { }
+ if s then
+ for k, v in next, s do
+ n[k] = v
+ end
+ end
for k, v in next, t do
- s[v] = k
+ n[v] = k
end
- return s
+ return n
end
---~ function table.are_equal(a,b)
---~ return table.serialize(a) == table.serialize(b)
---~ end
-
-function table.clone(t,p) -- t is optional or nil or table
- if not p then
- t, p = { }, t or { }
- elseif not t then
- t = { }
+function table.reversed(t)
+ if t then
+ local tt, tn = { }, #t
+ if tn > 0 then
+ local ttn = 0
+ for i=tn,1,-1 do
+ ttn = ttn + 1
+ tt[ttn] = t[i]
+ end
+ end
+ return tt
end
- setmetatable(t, { __index = function(_,key) return p[key] end }) -- why not __index = p ?
- return t
-end
-
-function table.hexed(t,seperator)
- local tt = { }
- for i=1,#t do tt[i] = format("0x%04X",t[i]) end
- return concat(tt,seperator or " ")
end
-function table.reverse_hash(h)
- local r = { }
- for k,v in next, h do
- r[v] = lower(gsub(k," ",""))
+function table.sequenced(t,sep,simple) -- hash only
+ local s, n = { }, 0
+ for k, v in sortedhash(t) do
+ if simple then
+ if v == true then
+ n = n + 1
+ s[n] = k
+ elseif v and v~= "" then
+ n = n + 1
+ s[n] = k .. "=" .. tostring(v)
+ end
+ else
+ n = n + 1
+ s[n] = k .. "=" .. tostring(v)
+ end
end
- return r
+ return concat(s, sep or " | ")
end
-function table.reverse(t)
- local tt = { }
- if #t > 0 then
- for i=#t,1,-1 do
- tt[#tt+1] = t[i]
- end
+function table.print(t,...)
+ if type(t) ~= "table" then
+ print(tostring(t))
+ else
+ table.tohandle(print,t,...)
end
- return tt
end
-function table.insert_before_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i,extra)
- return
- end
- end
- insert(t,1,extra)
+-- -- -- obsolete but we keep them for a while and might comment them later -- -- --
+
+-- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
+
+function table.sub(t,i,j)
+ return { unpack(t,i,j) }
end
-function table.insert_after_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,extra)
- return
- end
- end
- insert(t,#t+1,extra)
+-- 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)
end
+function table.has_one_entry(t)
+ return t and not next(t,next(t))
+end
end -- of closure
@@ -1435,7 +1584,10 @@ if not modules then modules = { } end modules ['l-io'] = {
license = "see context related readme files"
}
-local byte, find, gsub = string.byte, string.find, string.gsub
+local io = io
+local byte, find, gsub, format = string.byte, string.find, string.gsub, string.format
+local concat = table.concat
+local type = type
if string.find(os.getenv("PATH"),";") then
io.fileseparator, io.pathseparator = "\\", ";"
@@ -1446,9 +1598,7 @@ end
function io.loaddata(filename,textmode)
local f = io.open(filename,(textmode and 'r') or 'rb')
if f then
- -- collectgarbage("step") -- sometimes makes a big difference in mem consumption
local data = f:read('*all')
- -- garbagecollector.check(data)
f:close()
return data
else
@@ -1460,13 +1610,14 @@ function io.savedata(filename,data,joiner)
local f = io.open(filename,"wb")
if f then
if type(data) == "table" then
- f:write(table.join(data,joiner or ""))
+ f:write(concat(data,joiner or ""))
elseif type(data) == "function" then
data(f)
else
f:write(data or "")
end
f:close()
+ io.flush()
return true
else
return false
@@ -1495,12 +1646,19 @@ function io.size(filename)
end
function io.noflines(f)
- local n = 0
- for _ in f:lines() do
- n = n + 1
+ if type(f) == "string" then
+ local f = io.open(filename)
+ local n = f and io.noflines(f) or 0
+ assert(f:close())
+ return n
+ else
+ local n = 0
+ for _ in f:lines() do
+ n = n + 1
+ end
+ f:seek('set',0)
+ return n
end
- f:seek('set',0)
- return n
end
local nextchar = {
@@ -1526,8 +1684,6 @@ local nextchar = {
function io.characters(f,n)
if f then
return nextchar[n or 1], f
- else
- return nil, nil
end
end
@@ -1536,40 +1692,42 @@ local nextbyte = {
local a, b, c, d = f:read(1,1,1,1)
if d then
return byte(a), byte(b), byte(c), byte(d)
- else
- return nil, nil, nil, nil
+ end
+ end,
+ [3] = function(f)
+ local a, b, c = f:read(1,1,1)
+ if b then
+ return byte(a), byte(b), byte(c)
end
end,
[2] = function(f)
local a, b = f:read(1,1)
if b then
return byte(a), byte(b)
- else
- return nil, nil
end
end,
[1] = function (f)
local a = f:read(1)
if a then
return byte(a)
- else
- return nil
end
end,
[-2] = function (f)
local a, b = f:read(1,1)
if b then
return byte(b), byte(a)
- else
- return nil, nil
+ end
+ end,
+ [-3] = function(f)
+ local a, b, c = f:read(1,1,1)
+ if b then
+ return byte(c), byte(b), byte(a)
end
end,
[-4] = function(f)
local a, b, c, d = f:read(1,1,1,1)
if d then
return byte(d), byte(c), byte(b), byte(a)
- else
- return nil, nil, nil, nil
end
end
}
@@ -1586,12 +1744,13 @@ function io.ask(question,default,options)
while true do
io.write(question)
if options then
- io.write(string.format(" [%s]",table.concat(options,"|")))
+ io.write(format(" [%s]",concat(options,"|")))
end
if default then
- io.write(string.format(" [%s]",default))
+ io.write(format(" [%s]",default))
end
- io.write(string.format(" "))
+ io.write(format(" "))
+ io.flush()
local answer = io.read()
answer = gsub(answer,"^%s*(.*)%s*$","%1")
if answer == "" and default then
@@ -1615,6 +1774,63 @@ function io.ask(question,default,options)
end
end
+local function readnumber(f,n,m)
+ if m then
+ f:seek("set",n)
+ n = m
+ end
+ if n == 1 then
+ return byte(f:read(1))
+ elseif n == 2 then
+ local a, b = byte(f:read(2),1,2)
+ return 256 * a + b
+ elseif n == 3 then
+ local a, b, c = byte(f:read(3),1,3)
+ return 256*256 * a + 256 * b + c
+ elseif n == 4 then
+ local a, b, c, d = byte(f:read(4),1,4)
+ return 256*256*256 * a + 256*256 * b + 256 * c + d
+ elseif n == 8 then
+ local a, b = readnumber(f,4), readnumber(f,4)
+ return 256 * a + b
+ elseif n == 12 then
+ local a, b, c = readnumber(f,4), readnumber(f,4), readnumber(f,4)
+ return 256*256 * a + 256 * b + c
+ elseif n == -2 then
+ local b, a = byte(f:read(2),1,2)
+ return 256*a + b
+ elseif n == -3 then
+ local c, b, a = byte(f:read(3),1,3)
+ return 256*256 * a + 256 * b + c
+ elseif n == -4 then
+ local d, c, b, a = byte(f:read(4),1,4)
+ return 256*256*256 * a + 256*256 * b + 256*c + d
+ elseif n == -8 then
+ local h, g, f, e, d, c, b, a = byte(f:read(8),1,8)
+ return 256*256*256*256*256*256*256 * a +
+ 256*256*256*256*256*256 * b +
+ 256*256*256*256*256 * c +
+ 256*256*256*256 * d +
+ 256*256*256 * e +
+ 256*256 * f +
+ 256 * g +
+ h
+ else
+ return 0
+ end
+end
+
+io.readnumber = readnumber
+
+function io.readstring(f,n,m)
+ if m then
+ f:seek("set",n)
+ n = m
+ end
+ local str = gsub(f:read(n),"%z","")
+ return str
+end
+
end -- of closure
@@ -1628,11 +1844,15 @@ if not modules then modules = { } end modules ['l-number'] = {
license = "see context related readme files"
}
+-- this module will be replaced when we have the bit library
+
local tostring = tostring
-local format, floor, insert, match = string.format, math.floor, table.insert, string.match
+local format, floor, match, rep = string.format, math.floor, string.match, string.rep
+local concat, insert = table.concat, table.insert
local lpegmatch = lpeg.match
-number = number or { }
+number = number or { }
+local number = number
-- a,b,c,d,e,f = number.toset(100101)
@@ -1680,6 +1900,54 @@ function number.bits(n,zero)
end
+function number.bit(p)
+ return 2 ^ (p - 1) -- 1-based indexing
+end
+
+function number.hasbit(x, p) -- typical call: if hasbit(x, bit(3)) then ...
+ return x % (p + p) >= p
+end
+
+function number.setbit(x, p)
+ return hasbit(x, p) and x or x + p
+end
+
+function number.clearbit(x, p)
+ return hasbit(x, p) and x - p or x
+end
+
+
+function number.tobitstring(n,m)
+ if n == 0 then
+ if m then
+ rep("00000000",m)
+ else
+ return "00000000"
+ end
+ else
+ local t = { }
+ while n > 0 do
+ insert(t,1,n % 2 > 0 and 1 or 0)
+ n = floor(n/2)
+ end
+ local nn = 8 - #t % 8
+ if nn > 0 and nn < 8 then
+ for i=1,nn do
+ insert(t,1,0)
+ end
+ end
+ if m then
+ m = m * 8 - #t
+ if m > 0 then
+ insert(t,1,rep("0",m))
+ end
+ end
+ return concat(t)
+ end
+end
+
+
+
end -- of closure
do -- create closure to overcome 200 locals limit
@@ -1692,6 +1960,8 @@ if not modules then modules = { } end modules ['l-set'] = {
license = "see context related readme files"
}
+-- This will become obsolete when we have the bitset library embedded.
+
set = set or { }
local nums = { }
@@ -1735,10 +2005,11 @@ function set.tolist(n)
if n == 0 or not tabs[n] then
return ""
else
- local t = { }
+ local t, n = { }, 0
for k, v in next, tabs[n] do
if v then
- t[#t+1] = k
+ n = n + 1
+ t[n] = k
end
end
return concat(t," ")
@@ -1756,17 +2027,6 @@ function set.contains(n,s)
end
end
---~ local c = set.create{'aap','noot','mies'}
---~ local s = set.tonumber(c)
---~ local t = set.totable(s)
---~ print(t['aap'])
---~ local c = set.create{'zus','wim','jet'}
---~ local s = set.tonumber(c)
---~ local t = set.totable(s)
---~ print(t['aap'])
---~ print(t['jet'])
---~ print(set.contains(t,'jet'))
---~ print(set.contains(t,'aap'))
@@ -1782,32 +2042,119 @@ if not modules then modules = { } end modules ['l-os'] = {
license = "see context related readme files"
}
+-- This file deals with some operating system issues. Please don't bother me
+-- with the pros and cons of operating systems as they all have their flaws
+-- and benefits. Bashing one of them won't help solving problems and fixing
+-- bugs faster and is a waste of time and energy.
+--
+-- path separators: / or \ ... we can use / everywhere
+-- suffixes : dll so exe <none> ... no big deal
+-- quotes : we can use "" in most cases
+-- expansion : unless "" are used * might give side effects
+-- piping/threads : somewhat different for each os
+-- locations : specific user file locations and settings can change over time
+--
+-- os.type : windows | unix (new, we already guessed os.platform)
+-- os.name : windows | msdos | linux | macosx | solaris | .. | generic (new)
+-- os.platform : extended os.name with architecture
+
-- maybe build io.flush in os.execute
-local find, format, gsub = string.find, string.format, string.gsub
+local os = os
+local find, format, gsub, upper = string.find, string.format, string.gsub, string.upper
+local concat = table.concat
local random, ceil = math.random, math.ceil
+local rawget, rawset, type, getmetatable, setmetatable, tonumber = rawget, rawset, type, getmetatable, setmetatable, tonumber
+
+-- The following code permits traversing the environment table, at least
+-- in luatex. Internally all environment names are uppercase.
+
+if not os.__getenv__ then
+
+ os.__getenv__ = os.getenv
+ os.__setenv__ = os.setenv
+
+ if os.env then
+
+ local osgetenv = os.getenv
+ local ossetenv = os.setenv
+ local osenv = os.env local _ = osenv.PATH -- initialize the table
+
+ function os.setenv(k,v)
+ if v == nil then
+ v = ""
+ end
+ local K = upper(k)
+ osenv[K] = v
+ if type(v) == "table" then
+ v = concat(v,";") -- path
+ end
+ ossetenv(K,v)
+ end
+
+ function os.getenv(k)
+ local K = upper(k)
+ local v = osenv[K] or osenv[k] or osgetenv(K) or osgetenv(k)
+ if v == "" then
+ return nil
+ else
+ return v
+ end
+ end
+
+ else
+
+ local ossetenv = os.setenv
+ local osgetenv = os.getenv
+ local osenv = { }
+
+ function os.setenv(k,v)
+ if v == nil then
+ v = ""
+ end
+ local K = upper(k)
+ osenv[K] = v
+ end
-local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
+ function os.getenv(k)
+ local K = upper(k)
+ local v = osenv[K] or osgetenv(K) or osgetenv(k)
+ if v == "" then
+ return nil
+ else
+ return v
+ end
+ end
+
+ local function __index(t,k)
+ return os.getenv(k)
+ end
+ local function __newindex(t,k,v)
+ os.setenv(k,v)
+ end
+
+ os.env = { }
+
+ setmetatable(os.env, { __index = __index, __newindex = __newindex } )
+
+ end
+
+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
function os.resultof(command)
- ioflush() -- else messed up logging
local handle = io.popen(command,"r")
- if not handle then
- -- print("unknown command '".. command .. "' in os.resultof")
- return ""
- else
- return handle:read("*all") or ""
- end
+ return handle and handle:read("*all") or ""
end
---~ os.type : windows | unix (new, we already guessed os.platform)
---~ os.name : windows | msdos | linux | macosx | solaris | .. | generic (new)
---~ os.platform : extended os.name with architecture
-
if not io.fileseparator then
if find(os.getenv("PATH"),";") then
io.fileseparator, io.pathseparator, os.type = "\\", ";", os.type or "mswin"
@@ -1856,16 +2203,11 @@ function os.runtime()
return os.gettimeofday() - startuptime
end
---~ print(os.gettimeofday()-os.time())
---~ os.sleep(1.234)
---~ print (">>",os.runtime())
---~ print(os.date("%H:%M:%S",os.gettimeofday()))
---~ print(os.date("%H:%M:%S",os.time()))
-- no need for function anymore as we have more clever code and helpers now
-- this metatable trickery might as well disappear
-os.resolvers = os.resolvers or { }
+os.resolvers = os.resolvers or { } -- will become private
local resolvers = os.resolvers
@@ -1878,24 +2220,6 @@ end
setmetatable(os,osmt)
-if not os.setenv then
-
- -- we still store them but they won't be seen in
- -- child processes although we might pass them some day
- -- using command concatination
-
- local env, getenv = { }, os.getenv
-
- function os.setenv(k,v)
- env[k] = v
- end
-
- function os.getenv(k)
- return env[k] or getenv(k)
- end
-
-end
-
-- we can use HOSTTYPE on some platforms
local name, platform = os.name or "linux", os.getenv("MTX_PLATFORM") or ""
@@ -1935,7 +2259,7 @@ elseif os.type == "windows" then
elseif name == "linux" then
function os.resolvers.platform(t,k)
- -- we sometims have HOSTTYPE set so let's check that first
+ -- we sometimes have HOSTTYPE set so let's check that first
local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
if find(architecture,"x86_64") then
platform = "linux-64"
@@ -2013,10 +2337,10 @@ elseif name == "freebsd" then
elseif name == "kfreebsd" then
function os.resolvers.platform(t,k)
- -- we sometims have HOSTTYPE set so let's check that first
+ -- we sometimes have HOSTTYPE set so let's check that first
local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
if find(architecture,"x86_64") then
- platform = "kfreebsd-64"
+ platform = "kfreebsd-amd64"
else
platform = "kfreebsd-i386"
end
@@ -2091,61 +2415,86 @@ if not modules then modules = { } end modules ['l-file'] = {
-- needs a cleanup
-file = file or { }
+file = file or { }
+local file = file
-local concat = table.concat
-local find, gmatch, match, gsub, sub, char = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char
+local insert, concat = table.insert, table.concat
+local find, gmatch, match, gsub, sub, char, lower = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char, string.lower
local lpegmatch = lpeg.match
+local getcurrentdir, attributes = lfs.currentdir, lfs.attributes
-function file.removesuffix(filename)
- return (gsub(filename,"%.[%a%d]+$",""))
+local P, R, S, C, Cs, Cp, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc
+
+local function dirname(name,default)
+ return match(name,"^(.+)[/\\].-$") or (default or "")
end
-function file.addsuffix(filename, suffix)
- if not suffix or suffix == "" then
- return filename
- elseif not find(filename,"%.[%a%d]+$") then
- return filename .. "." .. suffix
- else
- return filename
- end
+local function basename(name)
+ return match(name,"^.+[/\\](.-)$") or name
end
-function file.replacesuffix(filename, suffix)
- return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+local function nameonly(name)
+ return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
end
-function file.dirname(name,default)
- return match(name,"^(.+)[/\\].-$") or (default or "")
+local function extname(name,default)
+ return match(name,"^.+%.([^/\\]-)$") or default or ""
end
-function file.basename(name)
- return match(name,"^.+[/\\](.-)$") or name
+local function splitname(name)
+ local n, s = match(name,"^(.+)%.([^/\\]-)$")
+ return n or name, s or ""
end
-function file.nameonly(name)
- return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
+file.basename = basename
+file.dirname = dirname
+file.nameonly = nameonly
+file.extname = extname
+file.suffix = extname
+
+function file.removesuffix(filename)
+ return (gsub(filename,"%.[%a%d]+$",""))
end
-function file.extname(name,default)
- return match(name,"^.+%.([^/\\]-)$") or default or ""
+function file.addsuffix(filename, suffix, criterium)
+ if not suffix or suffix == "" then
+ return filename
+ elseif criterium == true then
+ return filename .. "." .. suffix
+ elseif not criterium then
+ local n, s = splitname(filename)
+ if not s or s == "" then
+ return filename .. "." .. suffix
+ else
+ return filename
+ end
+ else
+ local n, s = splitname(filename)
+ if s and s ~= "" then
+ local t = type(criterium)
+ if t == "table" then
+ -- keep if in criterium
+ for i=1,#criterium do
+ if s == criterium[i] then
+ return filename
+ end
+ end
+ elseif t == "string" then
+ -- keep if criterium
+ if s == criterium then
+ return filename
+ end
+ end
+ end
+ return n .. "." .. suffix
+ end
end
-file.suffix = file.extname
---~ function file.join(...)
---~ local pth = concat({...},"/")
---~ pth = gsub(pth,"\\","/")
---~ local a, b = match(pth,"^(.*://)(.*)$")
---~ if a and b then
---~ return a .. gsub(b,"//+","/")
---~ end
---~ a, b = match(pth,"^(//)(.*)$")
---~ if a and b then
---~ return a .. gsub(b,"//+","/")
---~ end
---~ return (gsub(pth,"//+","/"))
---~ end
+function file.replacesuffix(filename, suffix)
+ return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+end
+
local trick_1 = char(1)
local trick_2 = "^" .. trick_1 .. "/+"
@@ -2173,60 +2522,37 @@ function file.join(...)
return (gsub(pth,"//+","/"))
end
---~ print(file.join("//","/y"))
---~ print(file.join("/","/y"))
---~ print(file.join("","/y"))
---~ print(file.join("/x/","/y"))
---~ print(file.join("x/","/y"))
---~ print(file.join("http://","/y"))
---~ print(file.join("http://a","/y"))
---~ print(file.join("http:///a","/y"))
---~ print(file.join("//nas-1","/y"))
-function file.iswritable(name)
- local a = lfs.attributes(name) or lfs.attributes(file.dirname(name,"."))
+function file.is_writable(name)
+ local a = attributes(name) or attributes(dirname(name,"."))
return a and sub(a.permissions,2,2) == "w"
end
-function file.isreadable(name)
- local a = lfs.attributes(name)
+function file.is_readable(name)
+ local a = attributes(name)
return a and sub(a.permissions,1,1) == "r"
end
-file.is_readable = file.isreadable
-file.is_writable = file.iswritable
+file.isreadable = file.is_readable -- depricated
+file.iswritable = file.is_writable -- depricated
--- todo: lpeg
-
---~ function file.split_path(str)
---~ local t = { }
---~ str = gsub(str,"\\", "/")
---~ str = gsub(str,"(%a):([;/])", "%1\001%2")
---~ for name in gmatch(str,"([^;:]+)") do
---~ if name ~= "" then
---~ t[#t+1] = gsub(name,"\001",":")
---~ end
---~ end
---~ return t
---~ end
+-- todo: lpeg \\ / .. does not save much
local checkedsplit = string.checkedsplit
-function file.split_path(str,separator)
+function file.splitpath(str,separator) -- string
str = gsub(str,"\\","/")
return checkedsplit(str,separator or io.pathseparator)
end
-function file.join_path(tab)
- return concat(tab,io.pathseparator) -- can have trailing //
+function file.joinpath(tab,separator) -- table
+ return concat(tab,separator or io.pathseparator) -- can have trailing //
end
-- we can hash them weakly
-local insert = table.insert
-
-function file.collapse_path(str,anchor)
+function file.collapsepath(str,anchor)
if anchor and not find(str,"^/") and not find(str,"^%a:") then
str = getcurrentdir() .. "/" .. str
end
@@ -2280,62 +2606,15 @@ function file.collapse_path(str,anchor)
return concat(newelements, '/')
end
end
-function file.xcollapse_path(str)
- print('collapse', str)
- if str == "" or str =="." then
- return "."
- elseif find(str,"^%.%.") then
- return str
- elseif not find(str,"%.") then
- return str
- end
- str = gsub(str,"^%./",lfs.currentdir() .. "/") -- ./xx in qualified
- str = gsub(str,"\\","/")
- local oldelements = checkedsplit(str,"/")
- local newelements = { }
- local i = #oldelements
- while i > 0 do
- local element = oldelements[i]
- if element == '.' then
- -- do nothing
- elseif element == '..' then
- local n = i -1
- while n > 0 do
- local element = oldelements[n]
- if element ~= '..' and element ~= '.' then
- oldelements[n] = '.'
- break
- else
- n = n - 1
- end
- end
- if n<1 then
- insert(newelements,1,'..')
- end
- elseif element ~= "" then
- insert(newelements,1,element)
- end
- i = i - 1
- end
- if #newelements == 0 then
- return "."
- elseif find(str,"^/") then
- return "/" .. concat(newelements,'/')
- else
- return concat(newelements, '/')
- end
-end
---~ print(file.collapse_path("/a"))
---~ print(file.collapse_path("a/./b/.."))
---~ print(file.collapse_path("a/aa/../b/bb"))
---~ print(file.collapse_path("a/../.."))
---~ print(file.collapse_path("a/.././././b/.."))
---~ print(file.collapse_path("a/./././b/.."))
---~ print(file.collapse_path("a/b/c/../.."))
-function file.robustname(str)
- return (gsub(str,"[^%a%d%/%-%.\\]+","-"))
+function file.robustname(str,strict)
+ str = gsub(str,"[^%a%d%/%-%.\\]+","-")
+ if strict then
+ return lower(gsub(str,"^%-*(.-)%-*$","%1"))
+ else
+ return str
+ end
end
file.readdata = io.loaddata
@@ -2347,100 +2626,34 @@ end
-- lpeg variants, slightly faster, not always
---~ local period = lpeg.P(".")
---~ local slashes = lpeg.S("\\/")
---~ local noperiod = 1-period
---~ local noslashes = 1-slashes
---~ local name = noperiod^1
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.C(noperiod^1) * -1
-
---~ function file.extname(name)
---~ return lpegmatch(pattern,name) or ""
---~ end
-
---~ local pattern = lpeg.Cs(((period * noperiod^1 * -1)/"" + 1)^1)
-
---~ function file.removesuffix(name)
---~ return lpegmatch(pattern,name)
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.C(noslashes^1) * -1
-
---~ function file.basename(name)
---~ return lpegmatch(pattern,name) or name
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.Cp() * noslashes^1 * -1
-
---~ function file.dirname(name)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return sub(name,1,p-2)
---~ else
---~ return ""
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
-
---~ function file.addsuffix(name, suffix)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return name
---~ else
---~ return name .. "." .. suffix
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
-
---~ function file.replacesuffix(name,suffix)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return sub(name,1,p-2) .. "." .. suffix
---~ else
---~ return name .. "." .. suffix
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * lpeg.Cp() * ((noperiod^1 * period)^1 * lpeg.Cp() + lpeg.P(true)) * noperiod^1 * -1
-
---~ function file.nameonly(name)
---~ local a, b = lpegmatch(pattern,name)
---~ if b then
---~ return sub(name,a,b-2)
---~ elseif a then
---~ return sub(name,a)
---~ else
---~ return name
---~ end
---~ end
-
---~ local test = file.extname
---~ local test = file.basename
---~ local test = file.dirname
---~ local test = file.addsuffix
---~ local test = file.replacesuffix
---~ local test = file.nameonly
-
---~ print(1,test("./a/b/c/abd.def.xxx","!!!"))
---~ print(2,test("./../b/c/abd.def.xxx","!!!"))
---~ print(3,test("a/b/c/abd.def.xxx","!!!"))
---~ print(4,test("a/b/c/def.xxx","!!!"))
---~ print(5,test("a/b/c/def","!!!"))
---~ print(6,test("def","!!!"))
---~ print(7,test("def.xxx","!!!"))
-
---~ local tim = os.clock() for i=1,250000 do local ext = test("abd.def.xxx","!!!") end print(os.clock()-tim)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-- also rewrite previous
-local letter = lpeg.R("az","AZ") + lpeg.S("_-+")
-local separator = lpeg.P("://")
+local letter = R("az","AZ") + S("_-+")
+local separator = P("://")
+
+local qualified = P(".")^0 * P("/") + letter*P(":") + letter^1*separator + letter^1 * P("/")
+local rootbased = P("/") + letter*P(":")
-local qualified = lpeg.P(".")^0 * lpeg.P("/") + letter*lpeg.P(":") + letter^1*separator + letter^1 * lpeg.P("/")
-local rootbased = lpeg.P("/") + letter*lpeg.P(":")
+lpeg.patterns.qualified = qualified
+lpeg.patterns.rootbased = rootbased
-- ./name ../name /name c: :// name/name
@@ -2452,14 +2665,16 @@ function file.is_rootbased_path(filename)
return lpegmatch(rootbased,filename) ~= nil
end
-local slash = lpeg.S("\\/")
-local period = lpeg.P(".")
-local drive = lpeg.C(lpeg.R("az","AZ")) * lpeg.P(":")
-local path = lpeg.C(((1-slash)^0 * slash)^0)
-local suffix = period * lpeg.C(lpeg.P(1-period)^0 * lpeg.P(-1))
-local base = lpeg.C((1-suffix)^0)
+-- actually these are schemes
-local pattern = (drive + lpeg.Cc("")) * (path + lpeg.Cc("")) * (base + lpeg.Cc("")) * (suffix + lpeg.Cc(""))
+local slash = S("\\/")
+local period = P(".")
+local drive = C(R("az","AZ")) * P(":")
+local path = C(((1-slash)^0 * slash)^0)
+local suffix = period * C(P(1-period)^0 * P(-1))
+local base = C((1-suffix)^0)
+
+local pattern = (drive + Cc("")) * (path + Cc("")) * (base + Cc("")) * (suffix + Cc(""))
function file.splitname(str) -- returns drive, path, base, suffix
return lpegmatch(pattern,str)
@@ -2472,14 +2687,13 @@ end
-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
---~ -- todo:
---~
---~ if os.type == "windows" then
---~ local currentdir = lfs.currentdir
---~ function lfs.currentdir()
---~ return (gsub(currentdir(),"\\","/"))
---~ end
---~ end
+
+-- for myself:
+
+function file.strip(name,dir)
+ local b, a = match(name,"^(.-)" .. dir .. "(.*)$")
+ return a ~= "" and a or name
+end
end -- of closure
@@ -2495,6 +2709,7 @@ if not modules then modules = { } end modules ['l-md5'] = {
-- This also provides file checksums and checkers.
+local md5, file = md5, file
local gsub, format, byte = string.gsub, string.format, string.byte
local function convert(str,fmt)
@@ -2505,27 +2720,13 @@ 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 function remap(chr) return format("%02X",byte(chr)) end
---~ function md5.HEX(str) return (gsub(md5.sum(str),".",remap)) end
---~ end
---~ 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
---~ 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
-
-file.needs_updating_threshold = 1
-
-function file.needs_updating(oldname,newname) -- size modification access change
+
+function file.needs_updating(oldname,newname,threshold) -- size modification access change
local oldtime = lfs.attributes(oldname, modification)
local newtime = lfs.attributes(newname, modification)
if newtime >= oldtime then
return false
- elseif oldtime - newtime < file.needs_updating_threshold then
+ elseif oldtime - newtime < (threshold or 1) then
return false
else
return true
@@ -2572,86 +2773,171 @@ if not modules then modules = { } end modules ['l-url'] = {
license = "see context related readme files"
}
-local char, gmatch, gsub = string.char, string.gmatch, string.gsub
+local char, gmatch, gsub, format, byte, find = string.char, string.gmatch, string.gsub, string.format, string.byte, string.find
+local concat = table.concat
local tonumber, type = tonumber, type
-local lpegmatch = lpeg.match
+local P, C, R, S, Cs, Cc, Ct = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cs, lpeg.Cc, lpeg.Ct
+local lpegmatch, lpegpatterns, replacer = lpeg.match, lpeg.patterns, lpeg.replacer
--- from the spec (on the web):
+-- from wikipedia:
--
--- foo://example.com:8042/over/there?name=ferret#nose
--- \_/ \______________/\_________/ \_________/ \__/
--- | | | | |
--- scheme authority path query fragment
--- | _____________________|__
--- / \ / \
--- urn:example:animal:ferret:nose
+-- foo://username:password@example.com:8042/over/there/index.dtb?type=animal;name=narwhal#nose
+-- \_/ \_______________/ \_________/ \__/ \___/ \_/ \______________________/ \__/
+-- | | | | | | | |
+-- | userinfo hostname port | | query fragment
+-- | \________________________________/\_____________|____|/
+-- scheme | | | |
+-- | authority path | |
+-- | | |
+-- | path interpretable as filename
+-- | ___________|____________ |
+-- / \ / \ |
+-- urn:example:animal:ferret:nose interpretable as extension
+
+url = url or { }
+local url = url
+
+local tochar = function(s) return char(tonumber(s,16)) end
+
+local colon = P(":")
+local qmark = P("?")
+local hash = P("#")
+local slash = P("/")
+local percent = P("%")
+local endofstring = P(-1)
+
+local hexdigit = R("09","AF","af")
+local plus = P("+")
+local nothing = Cc("")
+local escaped = (plus / " ") + (percent * C(hexdigit * hexdigit) / tochar)
-url = url or { }
+-- we assume schemes with more than 1 character (in order to avoid problems with windows disks)
-local function tochar(s)
- return char(tonumber(s,16))
-end
+local scheme = Cs((escaped+(1-colon-slash-qmark-hash))^2) * colon + nothing
+local authority = slash * slash * Cs((escaped+(1- slash-qmark-hash))^0) + nothing
+local path = slash * Cs((escaped+(1- qmark-hash))^0) + nothing
+local query = qmark * Cs((escaped+(1- hash))^0) + nothing
+local fragment = hash * Cs((escaped+(1- endofstring))^0) + nothing
-local colon, qmark, hash, slash, percent, endofstring = lpeg.P(":"), lpeg.P("?"), lpeg.P("#"), lpeg.P("/"), lpeg.P("%"), lpeg.P(-1)
+local validurl = scheme * authority * path * query * fragment
+local parser = Ct(validurl)
-local hexdigit = lpeg.R("09","AF","af")
-local plus = lpeg.P("+")
-local escaped = (plus / " ") + (percent * lpeg.C(hexdigit * hexdigit) / tochar)
+lpegpatterns.url = validurl
+lpegpatterns.urlsplitter = parser
--- we assume schemes with more than 1 character (in order to avoid problems with windows disks)
+local escapes = { } ; for i=0,255 do escapes[i] = format("%%%02X",i) end
-local scheme = lpeg.Cs((escaped+(1-colon-slash-qmark-hash))^2) * colon + lpeg.Cc("")
-local authority = slash * slash * lpeg.Cs((escaped+(1- slash-qmark-hash))^0) + lpeg.Cc("")
-local path = slash * lpeg.Cs((escaped+(1- qmark-hash))^0) + lpeg.Cc("")
-local query = qmark * lpeg.Cs((escaped+(1- hash))^0) + lpeg.Cc("")
-local fragment = hash * lpeg.Cs((escaped+(1- endofstring))^0) + lpeg.Cc("")
+local escaper = Cs((R("09","AZ","az") + S("-./_") + P(1) / escapes)^0)
-local parser = lpeg.Ct(scheme * authority * path * query * fragment)
+lpegpatterns.urlescaper = escaper
-- todo: reconsider Ct as we can as well have five return values (saves a table)
-- so we can have two parsers, one with and one without
-function url.split(str)
+local function split(str)
return (type(str) == "string" and lpegmatch(parser,str)) or str
end
+local function hasscheme(str)
+ local scheme = lpegmatch(scheme,str) -- at least one character
+ return scheme and scheme ~= ""
+end
+
-- todo: cache them
-function url.hashed(str)
- local s = url.split(str)
+local rootletter = R("az","AZ")
+ + S("_-+")
+local separator = P("://")
+local qualified = P(".")^0 * P("/")
+ + rootletter * P(":")
+ + rootletter^1 * separator
+ + rootletter^1 * P("/")
+local rootbased = P("/")
+ + rootletter * P(":")
+
+local barswapper = replacer("|",":")
+local backslashswapper = replacer("\\","/")
+
+local function hashed(str) -- not yet ok (/test?test)
+ local s = split(str)
local somescheme = s[1] ~= ""
- return {
- scheme = (somescheme and s[1]) or "file",
- authority = s[2],
- path = s[3],
- query = s[4],
- fragment = s[5],
- original = str,
- noscheme = not somescheme,
- }
+ local somequery = s[4] ~= ""
+ if not somescheme and not somequery then
+ s = {
+ scheme = "file",
+ authority = "",
+ path = str,
+ query = "",
+ fragment = "",
+ original = str,
+ 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
+ else
+ filename = authority .. "/" .. path
+ end
+ s = {
+ scheme = s[1],
+ authority = authority,
+ path = path,
+ query = s[4],
+ fragment = s[5],
+ original = str,
+ noscheme = false,
+ filename = filename,
+ }
+ end
+ return s
end
-function url.hasscheme(str)
- return url.split(str)[1] ~= ""
-end
+-- Here we assume:
+--
+-- files: /// = relative
+-- files: //// = absolute (!)
+
+
+
+url.split = split
+url.hasscheme = hasscheme
+url.hashed = hashed
-function url.addscheme(str,scheme)
- return (url.hasscheme(str) and str) or ((scheme or "file:///") .. str)
+function url.addscheme(str,scheme) -- no authority
+ if hasscheme(str) then
+ return str
+ elseif not scheme then
+ return "file:///" .. str
+ else
+ return scheme .. ":///" .. str
+ end
end
-function url.construct(hash)
- local fullurl = hash.sheme .. "://".. hash.authority .. hash.path
- if hash.query then
- fullurl = fullurl .. "?".. hash.query
+function url.construct(hash) -- dodo: we need to escape !
+ local fullurl, f = { }, 0
+ local scheme, authority, path, query, fragment = hash.scheme, hash.authority, hash.path, hash.query, hash.fragment
+ if scheme and scheme ~= "" then
+ f = f + 1 ; fullurl[f] = scheme .. "://"
+ end
+ if authority and authority ~= "" then
+ f = f + 1 ; fullurl[f] = authority
end
- if hash.fragment then
- fullurl = fullurl .. "?".. hash.fragment
+ if path and path ~= "" then
+ f = f + 1 ; fullurl[f] = "/" .. path
end
- return fullurl
+ if query and query ~= "" then
+ f = f + 1 ; fullurl[f] = "?".. query
+ end
+ if fragment and fragment ~= "" then
+ f = f + 1 ; fullurl[f] = "#".. fragment
+ end
+ return lpegmatch(escaper,concat(fullurl))
end
function url.filename(filename)
- local t = url.hashed(filename)
+ local t = hashed(filename)
return (t.scheme == "file" and (gsub(t.path,"^/([a-zA-Z])([:|])/)","%1:"))) or filename
end
@@ -2667,37 +2953,13 @@ function url.query(str)
end
end
---~ print(url.filename("file:///c:/oeps.txt"))
---~ print(url.filename("c:/oeps.txt"))
---~ print(url.filename("file:///oeps.txt"))
---~ print(url.filename("file:///etc/test.txt"))
---~ print(url.filename("/oeps.txt"))
-
---~ from the spec on the web (sort of):
---~
---~ function test(str)
---~ print(table.serialize(url.hashed(str)))
---~ end
---~
---~ test("%56pass%20words")
---~ test("file:///c:/oeps.txt")
---~ test("file:///c|/oeps.txt")
---~ test("file:///etc/oeps.txt")
---~ test("file://./etc/oeps.txt")
---~ test("file:////etc/oeps.txt")
---~ test("ftp://ftp.is.co.za/rfc/rfc1808.txt")
---~ test("http://www.ietf.org/rfc/rfc2396.txt")
---~ test("ldap://[2001:db8::7]/c=GB?objectClass?one#what")
---~ test("mailto:John.Doe@example.com")
---~ test("news:comp.infosystems.www.servers.unix")
---~ test("tel:+1-816-555-1212")
---~ test("telnet://192.0.2.16:80/")
---~ test("urn:oasis:names:specification:docbook:dtd:xml:4.1.2")
---~ test("/etc/passwords")
---~ test("http://www.pragma-ade.com/spaced%20name")
-
---~ test("zip:///oeps/oeps.zip#bla/bla.tex")
---~ test("zip:///oeps/oeps.zip?bla/bla.tex")
+
+
+
+
+
+
+
end -- of closure
@@ -2712,35 +2974,53 @@ if not modules then modules = { } end modules ['l-dir'] = {
license = "see context related readme files"
}
--- dir.expand_name will be merged with cleanpath and collapsepath
+-- dir.expandname will be merged with cleanpath and collapsepath
local type = type
local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
+local concat, insert, remove = table.concat, table.insert, table.remove
local lpegmatch = lpeg.match
+local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
+
dir = dir or { }
+local dir = dir
+local lfs = lfs
+
+local attributes = lfs.attributes
+local walkdir = lfs.dir
+local isdir = lfs.isdir
+local isfile = lfs.isfile
+local mkdir = lfs.mkdir
+local chdir = lfs.chdir
+local currentdir = lfs.currentdir
-- handy
function dir.current()
- return (gsub(lfs.currentdir(),"\\","/"))
+ return (gsub(currentdir(),"\\","/"))
end
--- optimizing for no string.find (*) does not save time
+-- optimizing for no find (*) does not save time
-local attributes = lfs.attributes
-local walkdir = lfs.dir
-local function glob_pattern(path,patt,recurse,action)
- local ok, scanner
+local lfsisdir = isdir
+
+local function isdir(path)
+ path = gsub(path,"[/\\]+$","")
+ return lfsisdir(path)
+end
+
+lfs.isdir = isdir
+
+local function globpattern(path,patt,recurse,action)
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
+ path = path .. "."
+ elseif not find(path,"/$") then
+ path = path .. '/'
end
- if ok and type(scanner) == "function" then
- if not find(path,"/$") then path = path .. '/' end
- for name in scanner do
+ 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
@@ -2748,15 +3028,15 @@ local function glob_pattern(path,patt,recurse,action)
action(full)
end
elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
- glob_pattern(full,patt,recurse,action)
+ globpattern(full,patt,recurse,action)
end
end
end
end
-dir.glob_pattern = glob_pattern
+dir.globpattern = globpattern
-local function collect_pattern(path,patt,recurse,result)
+local function collectpattern(path,patt,recurse,result)
local ok, scanner
result = result or { }
if path == "/" then
@@ -2775,7 +3055,7 @@ local function collect_pattern(path,patt,recurse,result)
result[name] = attr
end
elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
- attr.list = collect_pattern(full,patt,recurse)
+ attr.list = collectpattern(full,patt,recurse)
result[name] = attr
end
end
@@ -2783,9 +3063,7 @@ local function collect_pattern(path,patt,recurse,result)
return result
end
-dir.collect_pattern = collect_pattern
-
-local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
+dir.collectpattern = collectpattern
local pattern = Ct {
[1] = (C(P(".") + P("/")^1) + C(R("az","AZ") * P(":") * P("/")^0) + Cc("./")) * V(2) * V(3),
@@ -2809,16 +3087,16 @@ local function glob(str,t)
for s=1,#str do
glob(str[s],t)
end
- elseif lfs.isfile(str) then
+ elseif isfile(str) then
t(str)
else
- local split = lpegmatch(pattern,str)
+ 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 recurse = find(base,"%*%*")
local start = root .. path
local result = lpegmatch(filter,start .. base)
- glob_pattern(start,result,recurse,t)
+ globpattern(start,result,recurse,t)
end
end
else
@@ -2828,12 +3106,15 @@ local function glob(str,t)
glob(str[s],t)
end
return t
- elseif lfs.isfile(str) then
- local t = t or { }
- t[#t+1] = str
- return t
+ elseif isfile(str) then
+ if t then
+ t[#t+1] = str
+ return t
+ else
+ return { str }
+ end
else
- local split = lpegmatch(pattern,str)
+ 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
@@ -2841,7 +3122,7 @@ local function glob(str,t)
local recurse = find(base,"%*%*")
local start = root .. path
local result = lpegmatch(filter,start .. base)
- glob_pattern(start,result,recurse,action)
+ globpattern(start,result,recurse,action)
return t
else
return { }
@@ -2852,18 +3133,14 @@ 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 function globfiles(path,recurse,func,files) -- func == pattern or function
if type(func) == "string" then
- local s = func -- alas, we need this indirect way
+ local s = func
func = function(name) return find(name,s) end
end
files = files or { }
+ local noffiles = #files
for name in walkdir(path) do
if find(name,"^%.") then
--- skip
@@ -2874,12 +3151,9 @@ local function globfiles(path,recurse,func,files) -- func == pattern or function
globfiles(path .. "/" .. name,recurse,func,files)
end
elseif mode == "file" then
- if func then
- if func(name) then
- files[#files+1] = path .. "/" .. name
- end
- else
- files[#files+1] = path .. "/" .. name
+ if not func or func(name) then
+ noffiles = noffiles + 1
+ files[noffiles] = path .. "/" .. name
end
end
end
@@ -2897,17 +3171,15 @@ dir.globfiles = globfiles
-- print(dir.ls("*.tex"))
function dir.ls(pattern)
- return table.concat(glob(pattern),"\n")
+ return concat(glob(pattern),"\n")
end
---~ mkdirs("temp")
---~ mkdirs("a/b/c")
---~ mkdirs(".","/a/b/c")
---~ mkdirs("a","b","c")
local make_indeed = true -- false
-if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
+local onwindows = os.type == "windows" or find(os.getenv("PATH"),";")
+
+if onwindows then
function dir.mkdirs(...)
local str, pth, t = "", "", { ... }
@@ -2956,64 +3228,21 @@ if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
else
pth = pth .. "/" .. s
end
- if make_indeed and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not isdir(pth) then
+ mkdir(pth)
end
end
- return pth, (lfs.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/"))
-
- function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
- local first, nothing, last = match(str,"^(//)(//*)(.*)$")
- if first then
- first = dir.current() .. "/"
- 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 = lfs.currentdir()
- if lfs.chdir(first) then
- first = dir.current()
- end
- lfs.chdir(d)
- 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 == "" then
- return first
- else
- return first .. "/" .. last
- end
+ return pth, (isdir(pth) == true)
end
+
else
function dir.mkdirs(...)
local str, pth, t = "", "", { ... }
for i=1,#t do
local s = t[i]
- if s ~= "" then
+ if s and s ~= "" then -- we catch nil and false
if str ~= "" then
str = str .. "/" .. s
else
@@ -3031,42 +3260,92 @@ else
else
pth = pth .. "/" .. s
end
- if make_indeed and not first and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not first and not isdir(pth) then
+ mkdir(pth)
end
end
else
pth = "."
for s in gmatch(str,"[^/]+") do
pth = pth .. "/" .. s
- if make_indeed and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not isdir(pth) then
+ mkdir(pth)
+ end
+ end
+ end
+ return pth, (isdir(pth) == true)
+ end
+
+
+end
+
+dir.makedirs = dir.mkdirs
+
+-- we can only define it here as it uses dir.current
+
+if onwindows then
+
+ function dir.expandname(str) -- will be merged with cleanpath and collapsepath
+ local first, nothing, last = match(str,"^(//)(//*)(.*)$")
+ if first then
+ first = dir.current() .. "/"
+ 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()
end
+ chdir(d)
end
end
- return pth, (lfs.isdir(pth) == true)
+ 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
---~ 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/"))
+else
- function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
+ function dir.expandname(str) -- will be merged with cleanpath and collapsepath
if not find(str,"^/") then
- str = lfs.currentdir() .. "/" .. str
+ str = currentdir() .. "/" .. str
end
str = gsub(str,"//","/")
str = gsub(str,"/%./","/")
+ str = gsub(str,"(.)/%.$","%1")
return str
end
end
-dir.makedirs = dir.mkdirs
+file.expandname = dir.expandname -- for convenience
+
+local stack = { }
+
+function dir.push(newdir)
+ insert(stack,lfs.currentdir())
+end
+
+function dir.pop()
+ local d = remove(stack)
+ if d then
+ lfs.chdir(d)
+ end
+ return d
+end
end -- of closure
@@ -3081,12 +3360,17 @@ if not modules then modules = { } end modules ['l-boolean'] = {
license = "see context related readme files"
}
+local type, tonumber = type, tonumber
+
boolean = boolean or { }
+local boolean = boolean
-local type, tonumber = type, tonumber
+-- function boolean.tonumber(b)
+-- return b and 1 or 0 -- test and test and return or return
+-- end
function boolean.tonumber(b)
- if b then return 1 else return 0 end
+ if b then return 1 else return 0 end -- test and return or return
end
function toboolean(str,tolerant)
@@ -3110,7 +3394,9 @@ function toboolean(str,tolerant)
end
end
-function string.is_boolean(str)
+string.toboolean = toboolean
+
+function string.is_boolean(str,default)
if type(str) == "string" then
if str == "true" or str == "yes" or str == "on" or str == "t" then
return true
@@ -3118,18 +3404,301 @@ function string.is_boolean(str)
return false
end
end
- return nil
+ return default
end
-function boolean.alwaystrue()
- return true
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['l-unicode'] = {
+ 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"
+}
+
+if not unicode then
+
+ unicode = { utf8 = { } }
+
+ local floor, char = math.floor, string.char
+
+ function unicode.utf8.utfchar(n)
+ if n < 0x80 then
+ return char(n)
+ elseif n < 0x800 then
+ return char(
+ 0xC0 + floor(n/0x40),
+ 0x80 + (n % 0x40)
+ )
+ elseif n < 0x10000 then
+ return char(
+ 0xE0 + floor(n/0x1000),
+ 0x80 + (floor(n/0x40) % 0x40),
+ 0x80 + (n % 0x40)
+ )
+ elseif n < 0x40000 then
+ return char(
+ 0xF0 + floor(n/0x40000),
+ 0x80 + floor(n/0x1000),
+ 0x80 + (floor(n/0x40) % 0x40),
+ 0x80 + (n % 0x40)
+ )
+ else
+ -- return char(
+ -- 0xF1 + floor(n/0x1000000),
+ -- 0x80 + floor(n/0x40000),
+ -- 0x80 + floor(n/0x1000),
+ -- 0x80 + (floor(n/0x40) % 0x40),
+ -- 0x80 + (n % 0x40)
+ -- )
+ return "?"
+ end
+ end
+
end
-function boolean.falsetrue()
- return false
+local unicode = unicode
+
+utf = utf or unicode.utf8
+
+local concat = table.concat
+local utfchar, utfbyte, utfgsub = utf.char, utf.byte, utf.gsub
+local char, byte, find, bytepairs, utfvalues, format = string.char, string.byte, string.find, string.bytepairs, string.utfvalues, string.format
+local type = type
+
+local utfsplitlines = string.utfsplitlines
+
+-- 0 EF BB BF UTF-8
+-- 1 FF FE UTF-16-little-endian
+-- 2 FE FF UTF-16-big-endian
+-- 3 FF FE 00 00 UTF-32-little-endian
+-- 4 00 00 FE FF UTF-32-big-endian
+
+unicode.utfname = {
+ [0] = 'utf-8',
+ [1] = 'utf-16-le',
+ [2] = 'utf-16-be',
+ [3] = 'utf-32-le',
+ [4] = 'utf-32-be'
+}
+
+-- \000 fails in <= 5.0 but is valid in >=5.1 where %z is depricated
+
+function unicode.utftype(f)
+ local str = f:read(4)
+ if not str then
+ f:seek('set')
+ return 0
+ -- elseif find(str,"^%z%z\254\255") then -- depricated
+ -- elseif find(str,"^\000\000\254\255") then -- not permitted and bugged
+ elseif find(str,"\000\000\254\255",1,true) then -- seems to work okay (TH)
+ return 4
+ -- elseif find(str,"^\255\254%z%z") then -- depricated
+ -- elseif find(str,"^\255\254\000\000") then -- not permitted and bugged
+ elseif find(str,"\255\254\000\000",1,true) then -- seems to work okay (TH)
+ return 3
+ elseif find(str,"^\254\255") then
+ f:seek('set',2)
+ return 2
+ elseif find(str,"^\255\254") then
+ f:seek('set',2)
+ return 1
+ elseif find(str,"^\239\187\191") then
+ f:seek('set',3)
+ return 0
+ else
+ f:seek('set')
+ return 0
+ end
+end
+
+
+
+local function utf16_to_utf8_be(t)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ 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
+ 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
+end
+
+local function utf16_to_utf8_le(t)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ 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
+ 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
+end
+
+local function utf32_to_utf8_be(str)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ end
+ local result = { } -- we reuse result
+ for i=1,#t do
+ local r, more = 0, -1
+ for a,b in bytepairs(str) 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 result
+end
+
+local function utf32_to_utf8_le(str)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ end
+ local result = { } -- we reuse result
+ for i=1,#t do
+ local r, more = 0, -1
+ for a,b in bytepairs(str) 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 result
+end
+
+unicode.utf32_to_utf8_be = utf32_to_utf8_be
+unicode.utf32_to_utf8_le = utf32_to_utf8_le
+unicode.utf16_to_utf8_be = utf16_to_utf8_be
+unicode.utf16_to_utf8_le = utf16_to_utf8_le
+
+function unicode.utf8_to_utf8(t)
+ return type(t) == "string" and utfsplitlines(t) or t
+end
+
+function unicode.utf16_to_utf8(t,endian)
+ return endian and utf16_to_utf8_be(t) or utf16_to_utf8_le(t) or t
+end
+
+function unicode.utf32_to_utf8(t,endian)
+ return endian and utf32_to_utf8_be(t) or utf32_to_utf8_le(t) or t
+end
+
+local function little(c)
+ local b = byte(c)
+ if b < 0x10000 then
+ return char(b%256,b/256)
+ else
+ b = b - 0x10000
+ local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00
+ return char(b1%256,b1/256,b2%256,b2/256)
+ end
+end
+
+local function big(c)
+ local b = byte(c)
+ if b < 0x10000 then
+ return char(b/256,b%256)
+ else
+ b = b - 0x10000
+ local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00
+ return char(b1/256,b1%256,b2/256,b2%256)
+ end
+end
+
+function unicode.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
+
+function unicode.utfcodes(str)
+ local t, n = { }, 0
+ for u in utfvalues(str) do
+ n = n + 1
+ t[n] = format("0x%04X",u)
+ end
+ return concat(t,separator or " ")
+end
+
+function unicode.ustring(s)
+ return format("U+%05X",type(s) == "number" and s or utfbyte(s))
+end
+
+function unicode.xstring(s)
+ return format("0x%05X",type(s) == "number" and s or utfbyte(s))
+end
+
+
+local lpegmatch = lpeg.match
+local utftype = lpeg.patterns.utftype
+
+function unicode.filetype(data)
+ return data and lpegmatch(utftype,data) or "unknown"
end
+
+
end -- of closure
do -- create closure to overcome 200 locals limit
@@ -3145,35 +3714,289 @@ 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.round then
- function math.round(x)
- return floor(x + 0.5)
- end
+ function math.round(x) return floor(x + 0.5) end
end
if not math.div then
- function math.div(n,m)
- return floor(n/m)
- end
+ function math.div(n,m) return floor(n/m) end
end
if not math.mod then
- function math.mod(n,m)
- return n % m
- end
+ function math.mod(n,m) return n % m end
end
local pipi = 2*math.pi/360
-function math.sind(d)
- return sin(d*pipi)
+if not math.sind then
+ function math.sind(d) return sin(d*pipi) end
+ function math.cosd(d) return cos(d*pipi) end
+ function math.tand(d) return tan(d*pipi) end
end
-function math.cosd(d)
- return cos(d*pipi)
+if not math.odd then
+ function math.odd (n) return n % 2 == 0 end
+ function math.even(n) return n % 2 ~= 0 end
end
-function math.tand(d)
- return tan(d*pipi)
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-tab'] = {
+ 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"
+}
+
+utilities = utilities or {}
+utilities.tables = utilities.tables or { }
+local tables = utilities.tables
+
+local format, gmatch = string.format, string.gmatch
+local concat, insert, remove = table.concat, table.insert, table.remove
+local setmetatable, getmetatable, tonumber, tostring = setmetatable, getmetatable, tonumber, tostring
+
+function tables.definetable(target) -- defines undefined tables
+ local composed, t, n = nil, { }, 0
+ for name in gmatch(target,"([^%.]+)") do
+ n = n + 1
+ if composed then
+ composed = composed .. "." .. name
+ else
+ composed = name
+ end
+ t[n] = format("%s = %s or { }",composed,composed)
+ end
+ return concat(t,"\n")
+end
+
+function tables.accesstable(target)
+ local t = _G
+ for name in gmatch(target,"([^%.]+)") do
+ t = t[name]
+ end
+ return t
+end
+
+function tables.removevalue(t,value) -- todo: n
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ remove(t,i)
+ -- remove all, so no: return
+ end
+ end
+ end
+end
+
+function tables.insertbeforevalue(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i,extra)
+ return
+ end
+ end
+ insert(t,1,extra)
+end
+
+function tables.insertaftervalue(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i+1,extra)
+ return
+ end
+ end
+ insert(t,#t+1,extra)
+end
+
+-- experimental
+
+local function toxml(t,d,result)
+ for k, v in table.sortedpairs(t) do
+ if type(v) == "table" then
+ result[#result+1] = format("%s<%s>",d,k)
+ toxml(v,d.." ",result)
+ result[#result+1] = format("%s</%s>",d,k)
+ elseif tonumber(k) then
+ result[#result+1] = format("%s<entry n='%s'>%s</entry>",d,k,v,k)
+ else
+ result[#result+1] = format("%s<%s>%s</%s>",d,k,tostring(v),k)
+ end
+ end
+end
+
+function table.toxml(t,name,nobanner)
+ local noroot = name == false
+ local result = (nobanner or noroot) and { } or { "<?xml version='1.0' standalone='yes' ?>" }
+ if noroot then
+ toxml( t, "", result)
+ else
+ toxml( { [name or "root"] = t }, "", result)
+ end
+ return concat(result,"\n")
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-sto'] = {
+ 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 setmetatable, getmetatable = setmetatable, getmetatable
+
+utilities = utilities or { }
+utilities.storage = utilities.storage or { }
+local storage = utilities.storage
+
+function storage.mark(t)
+ if not t then
+ texio.write_nl("fatal error: storage '%s' cannot be marked",t)
+ os.exit()
+ end
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m.__storage__ = true
+ return t
+end
+
+function storage.allocate(t)
+ t = t or { }
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m.__storage__ = true
+ return t
+end
+
+function storage.marked(t)
+ local m = getmetatable(t)
+ return m and m.__storage__
+end
+
+function storage.checked(t)
+ if not t then
+ texio.write_nl("fatal error: storage '%s' has not been allocated",t)
+ os.exit()
+ end
+ return t
+end
+
+
+function storage.setinitializer(data,initialize)
+ local m = getmetatable(data) or { }
+ m.__index = function(data,k)
+ m.__index = nil -- so that we can access the entries during initializing
+ initialize()
+ return data[k]
+ end
+ setmetatable(data, m)
+end
+
+local keyisvalue = { __index = function(t,k)
+ t[k] = k
+ return k
+end }
+
+function storage.sparse(t)
+ t = t or { }
+ setmetatable(t,keyisvalue)
+ return t
+end
+
+-- table namespace ?
+
+local function f_empty () return "" end -- t,k
+local function f_self (t,k) t[k] = k return k end
+local function f_ignore() end -- t,k,v
+
+local t_empty = { __index = empty }
+local t_self = { __index = self }
+local t_ignore = { __newindex = ignore }
+
+function table.setmetatableindex(t,f)
+ local m = getmetatable(t)
+ if m then
+ if f == "empty" then
+ m.__index = f_empty
+ elseif f == "key" then
+ m.__index = f_self
+ else
+ m.__index = f
+ end
+ else
+ if f == "empty" then
+ setmetatable(t, t_empty)
+ elseif f == "key" then
+ setmetatable(t, t_self)
+ else
+ setmetatable(t,{ __index = f })
+ end
+ end
+end
+
+function table.setmetatablenewindex(t,f)
+ local m = getmetatable(t)
+ if m then
+ if f == "ignore" then
+ m.__newindex = f_ignore
+ else
+ m.__newindex = f
+ end
+ else
+ if f == "ignore" then
+ setmetatable(t, t_ignore)
+ else
+ setmetatable(t,{ __newindex = f })
+ end
+ end
+end
+
+function table.setmetatablecall(t,f)
+ local m = getmetatable(t)
+ if m then
+ m.__call = f
+ else
+ setmetatable(t,{ __call = f })
+ end
+end
+
+function table.setmetatablekey(t,key,value)
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m[key] = value
+end
+
+function table.getmetatablekey(t,key,value)
+ local m = getmetatable(t)
+ return m and m[key]
end
@@ -3181,7 +4004,7 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['l-utils'] = {
+if not modules then modules = { } end modules ['util-mrg'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -3191,89 +4014,85 @@ if not modules then modules = { } end modules ['l-utils'] = {
-- hm, quite unreadable
-local gsub = string.gsub
+local gsub, format = string.gsub, string.format
local concat = table.concat
local type, next = type, next
-if not utils then utils = { } end
-if not utils.merger then utils.merger = { } end
-if not utils.lua then utils.lua = { } end
+utilities = utilities or {}
+utilities.merger = utilities.merger or { } -- maybe mergers
+utilities.report = logs and logs.reporter("system") or print
+
+local merger = utilities.merger
+
+merger.strip_comment = true
+
+local m_begin_merge = "begin library merge"
+local m_end_merge = "end library merge"
+local m_begin_closure = "do -- create closure to overcome 200 locals limit"
+local m_end_closure = "end -- of closure"
-utils.merger.m_begin = "begin library merge"
-utils.merger.m_end = "end library merge"
-utils.merger.pattern =
+local m_pattern =
"%c+" ..
- "%-%-%s+" .. utils.merger.m_begin ..
+ "%-%-%s+" .. m_begin_merge ..
"%c+(.-)%c+" ..
- "%-%-%s+" .. utils.merger.m_end ..
+ "%-%-%s+" .. m_end_merge ..
"%c+"
-function utils.merger._self_fake_()
- return
- "-- " .. "created merged file" .. "\n\n" ..
- "-- " .. utils.merger.m_begin .. "\n\n" ..
- "-- " .. utils.merger.m_end .. "\n\n"
-end
+local m_format =
+ "\n\n-- " .. m_begin_merge ..
+ "\n%s\n" ..
+ "-- " .. m_end_merge .. "\n\n"
-function utils.report(...)
- print(...)
+local m_faked =
+ "-- " .. "created merged file" .. "\n\n" ..
+ "-- " .. m_begin_merge .. "\n\n" ..
+ "-- " .. m_end_merge .. "\n\n"
+
+local function self_fake()
+ return m_faked
end
-utils.merger.strip_comment = true
+local function self_nothing()
+ return ""
+end
-function utils.merger._self_load_(name)
- local f, data = io.open(name), ""
- if f then
- utils.report("reading merge from %s",name)
- data = f:read("*all")
- f:close()
+local function self_load(name)
+ local data = io.loaddata(name) or ""
+ if data == "" then
+ utilities.report("merge: unknown file %s",name)
else
- utils.report("unknown file to merge %s",name)
- end
- if data and utils.merger.strip_comment then
- -- saves some 20K
- data = gsub(data,"%-%-~[^\n\r]*[\r\n]", "")
+ utilities.report("merge: inserting %s",name)
end
return data or ""
end
-function utils.merger._self_save_(name, data)
+local function self_save(name, data)
if data ~= "" then
- local f = io.open(name,'w')
- if f then
- utils.report("saving merge from %s",name)
- f:write(data)
- f:close()
+ if merger.strip_comment then
+ -- saves some 20K
+ local n = #data
+ data = gsub(data,"%-%-~[^\n\r]*[\r\n]","")
+ utilities.report("merge: %s bytes of comment stripped, %s bytes of code left",n-#data,#data)
end
+ io.savedata(name,data)
+ utilities.report("merge: saving %s",name)
end
end
-function utils.merger._self_swap_(data,code)
- if data ~= "" then
- return (gsub(data,utils.merger.pattern, function(s)
- return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n"
- end, 1))
- else
- return ""
- end
+local function self_swap(data,code)
+ return data ~= "" and (gsub(data,m_pattern, function() return format(m_format,code) end, 1)) or ""
end
---~ stripper:
---~
---~ data = gsub(data,"%-%-~[^\n]*\n","")
---~ data = gsub(data,"\n\n+","\n")
-
-function utils.merger._self_libs_(libs,list)
- local result, f, frozen = { }, nil, false
+local function self_libs(libs,list)
+ local result, f, frozen, foundpath = { }, nil, false, nil
result[#result+1] = "\n"
if type(libs) == 'string' then libs = { libs } end
if type(list) == 'string' then list = { list } end
- local foundpath = nil
for i=1,#libs do
local lib = libs[i]
for j=1,#list do
local pth = gsub(list[j],"\\","/") -- file.clean_path
- utils.report("checking library path %s",pth)
+ utilities.report("merge: checking library path %s",pth)
local name = pth .. "/" .. lib
if lfs.isfile(name) then
foundpath = pth
@@ -3282,76 +4101,75 @@ function utils.merger._self_libs_(libs,list)
if foundpath then break end
end
if foundpath then
- utils.report("using library path %s",foundpath)
+ utilities.report("merge: using library path %s",foundpath)
local right, wrong = { }, { }
for i=1,#libs do
local lib = libs[i]
local fullname = foundpath .. "/" .. lib
if lfs.isfile(fullname) then
- -- right[#right+1] = lib
- utils.report("merging library %s",fullname)
- result[#result+1] = "do -- create closure to overcome 200 locals limit"
+ utilities.report("merge: using library %s",fullname)
+ right[#right+1] = lib
+ result[#result+1] = m_begin_closure
result[#result+1] = io.loaddata(fullname,true)
- result[#result+1] = "end -- of closure"
+ result[#result+1] = m_end_closure
else
- -- wrong[#wrong+1] = lib
- utils.report("no library %s",fullname)
+ utilities.report("merge: skipping library %s",fullname)
+ wrong[#wrong+1] = lib
end
end
if #right > 0 then
- utils.report("merged libraries: %s",concat(right," "))
+ utilities.report("merge: used libraries: %s",concat(right," "))
end
if #wrong > 0 then
- utils.report("skipped libraries: %s",concat(wrong," "))
+ utilities.report("merge: skipped libraries: %s",concat(wrong," "))
end
else
- utils.report("no valid library path found")
+ utilities.report("merge: no valid library path found")
end
return concat(result, "\n\n")
end
-function utils.merger.selfcreate(libs,list,target)
+function merger.selfcreate(libs,list,target)
if target then
- utils.merger._self_save_(
- target,
- utils.merger._self_swap_(
- utils.merger._self_fake_(),
- utils.merger._self_libs_(libs,list)
- )
- )
+ self_save(target,self_swap(self_fake(),self_libs(libs,list)))
end
end
-function utils.merger.selfmerge(name,libs,list,target)
- utils.merger._self_save_(
- target or name,
- utils.merger._self_swap_(
- utils.merger._self_load_(name),
- utils.merger._self_libs_(libs,list)
- )
- )
+function merger.selfmerge(name,libs,list,target)
+ self_save(target or name,self_swap(self_load(name),self_libs(libs,list)))
end
-function utils.merger.selfclean(name)
- utils.merger._self_save_(
- name,
- utils.merger._self_swap_(
- utils.merger._self_load_(name),
- ""
- )
- )
+function merger.selfclean(name)
+ self_save(name,self_swap(self_load(name),self_nothing()))
end
-function utils.lua.compile(luafile, lucfile, cleanup, strip) -- defaults: cleanup=false strip=true
- -- utils.report("compiling",luafile,"into",lucfile)
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-lua'] = {
+ 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"
+}
+
+utilities = utilities or {}
+utilities.lua = utilities.lua or { }
+utilities.report = logs and logs.reporter("system") or print
+
+function utilities.lua.compile(luafile,lucfile,cleanup,strip) -- defaults: cleanup=false strip=true
+ utilities.report("lua: compiling %s into %s",luafile,lucfile)
os.remove(lucfile)
- local command = "-o " .. string.quote(lucfile) .. " " .. string.quote(luafile)
+ local command = "-o " .. string.quoted(lucfile) .. " " .. string.quoted(luafile)
if strip ~= false then
command = "-s " .. command
end
- local done = (os.spawn("texluac " .. command) == 0) or (os.spawn("luac " .. command) == 0)
+ local done = os.spawn("texluac " .. command) == 0 or os.spawn("luac " .. command) == 0
if done and cleanup == true and lfs.isfile(lucfile) and lfs.isfile(luafile) then
- -- utils.report("removing",luafile)
+ utilities.report("lua: removing %s",luafile)
os.remove(luafile)
end
return done
@@ -3359,11 +4177,16 @@ end
+
+
+
+
+
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['l-aux'] = {
+if not modules then modules = { } end modules ['util-prs'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -3371,15 +4194,20 @@ if not modules then modules = { } end modules ['l-aux'] = {
license = "see context related readme files"
}
--- for inline, no store split : for s in string.gmatch(str,",* *([^,]+)") do .. end
+local P, R, V, C, Ct, Carg = lpeg.P, lpeg.R, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Carg
+local lpegmatch = lpeg.match
+local concat, format, gmatch = table.concat, string.format, string.gmatch
+local tostring, type, next = tostring, type, next
-aux = aux or { }
+utilities = utilities or {}
+utilities.parsers = utilities.parsers or { }
+local parsers = utilities.parsers
+parsers.patterns = parsers.patterns or { }
-local concat, format, gmatch = table.concat, string.format, string.gmatch
-local tostring, type = tostring, type
-local lpegmatch = lpeg.match
+local setmetatableindex = table.setmetatableindex
+local sortedhash = table.sortedhash
-local P, R, V = lpeg.P, lpeg.R, lpeg.V
+-- we could use a Cf Cg construct
local escape, left, right = P("\\"), P('{'), P('}')
@@ -3388,29 +4216,35 @@ lpeg.patterns.balanced = P {
[2] = left * V(1) * right
}
-local space = lpeg.P(' ')
-local equal = lpeg.P("=")
-local comma = lpeg.P(",")
-local lbrace = lpeg.P("{")
-local rbrace = lpeg.P("}")
+local space = P(' ')
+local equal = P("=")
+local comma = P(",")
+local lbrace = P("{")
+local rbrace = P("}")
local nobrace = 1 - (lbrace+rbrace)
-local nested = lpeg.P { lbrace * (nobrace + lpeg.V(1))^0 * rbrace }
+local nested = P { lbrace * (nobrace + V(1))^0 * rbrace }
local spaces = space^0
-local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
+lpeg.patterns.nested = nested
+
+local value = P(lbrace * C((nobrace + nested)^0) * rbrace) + C((nested + (1-comma))^0)
-local key = lpeg.C((1-equal-comma)^1)
-local pattern_a = (space+comma)^0 * (key * equal * value + key * lpeg.C(""))
+local key = C((1-equal-comma)^1)
+local pattern_a = (space+comma)^0 * (key * equal * value + key * C(""))
local pattern_c = (space+comma)^0 * (key * equal * value)
-local key = lpeg.C((1-space-equal-comma)^1)
-local pattern_b = spaces * comma^0 * spaces * (key * ((spaces * equal * spaces * value) + lpeg.C("")))
+local key = C((1-space-equal-comma)^1)
+local pattern_b = spaces * comma^0 * spaces * (key * ((spaces * equal * spaces * value) + C("")))
-- "a=1, b=2, c=3, d={a{b,c}d}, e=12345, f=xx{a{b,c}d}xx, g={}" : outer {} removes, leading spaces ignored
local hash = { }
-local function set(key,value) -- using Carg is slower here
+local function set(key,value)
+ hash[key] = value
+end
+
+local function set(key,value)
hash[key] = value
end
@@ -3418,11 +4252,11 @@ local pattern_a_s = (pattern_a/set)^1
local pattern_b_s = (pattern_b/set)^1
local pattern_c_s = (pattern_c/set)^1
-aux.settings_to_hash_pattern_a = pattern_a_s
-aux.settings_to_hash_pattern_b = pattern_b_s
-aux.settings_to_hash_pattern_c = pattern_c_s
+parsers.patterns.settings_to_hash_a = pattern_a_s
+parsers.patterns.settings_to_hash_b = pattern_b_s
+parsers.patterns.settings_to_hash_c = pattern_c_s
-function aux.make_settings_to_hash_pattern(set,how)
+function parsers.make_settings_to_hash_pattern(set,how)
if how == "strict" then
return (pattern_c/set)^1
elseif how == "tolerant" then
@@ -3432,21 +4266,17 @@ function aux.make_settings_to_hash_pattern(set,how)
end
end
-function aux.settings_to_hash(str,existing)
+function parsers.settings_to_hash(str,existing)
if str and str ~= "" then
hash = existing or { }
- if moretolerant then
- lpegmatch(pattern_b_s,str)
- else
- lpegmatch(pattern_a_s,str)
- end
+ lpegmatch(pattern_a_s,str)
return hash
else
return { }
end
end
-function aux.settings_to_hash_tolerant(str,existing)
+function parsers.settings_to_hash_tolerant(str,existing)
if str and str ~= "" then
hash = existing or { }
lpegmatch(pattern_b_s,str)
@@ -3456,7 +4286,7 @@ function aux.settings_to_hash_tolerant(str,existing)
end
end
-function aux.settings_to_hash_strict(str,existing)
+function parsers.settings_to_hash_strict(str,existing)
if str and str ~= "" then
hash = existing or { }
lpegmatch(pattern_c_s,str)
@@ -3467,16 +4297,16 @@ function aux.settings_to_hash_strict(str,existing)
end
local separator = comma * space^0
-local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
-local pattern = lpeg.Ct(value*(separator*value)^0)
+local value = P(lbrace * C((nobrace + nested)^0) * rbrace) + C((nested + (1-comma))^0)
+local pattern = Ct(value*(separator*value)^0)
-- "aap, {noot}, mies" : outer {} removes, leading spaces ignored
-aux.settings_to_array_pattern = pattern
+parsers.patterns.settings_to_array = pattern
-- we could use a weak table as cache
-function aux.settings_to_array(str)
+function parsers.settings_to_array(str)
if not str or str == "" then
return { }
else
@@ -3488,16 +4318,16 @@ local function set(t,v)
t[#t+1] = v
end
-local value = lpeg.P(lpeg.Carg(1)*value) / set
-local pattern = value*(separator*value)^0 * lpeg.Carg(1)
+local value = P(Carg(1)*value) / set
+local pattern = value*(separator*value)^0 * Carg(1)
-function aux.add_settings_to_array(t,str)
+function parsers.add_settings_to_array(t,str)
return lpegmatch(pattern,str,nil,t)
end
-function aux.hash_to_string(h,separator,yes,no,strict,omit)
+function parsers.hash_to_string(h,separator,yes,no,strict,omit)
if h then
- local t, s = { }, table.sortedkeys(h)
+ local t, tn, s = { }, 0, table.sortedkeys(h)
omit = omit and table.tohash(omit)
for i=1,#s do
local key = s[i]
@@ -3506,15 +4336,19 @@ function aux.hash_to_string(h,separator,yes,no,strict,omit)
if type(value) == "boolean" then
if yes and no then
if value then
- t[#t+1] = key .. '=' .. yes
+ tn = tn + 1
+ t[tn] = key .. '=' .. yes
elseif not strict then
- t[#t+1] = key .. '=' .. no
+ tn = tn + 1
+ t[tn] = key .. '=' .. no
end
elseif value or not strict then
- t[#t+1] = key .. '=' .. tostring(value)
+ tn = tn + 1
+ t[tn] = key .. '=' .. tostring(value)
end
else
- t[#t+1] = key .. '=' .. value
+ tn = tn + 1
+ t[tn] = key .. '=' .. value
end
end
end
@@ -3524,7 +4358,7 @@ function aux.hash_to_string(h,separator,yes,no,strict,omit)
end
end
-function aux.array_to_string(a,separator)
+function parsers.array_to_string(a,separator)
if a then
return concat(a,separator or ",")
else
@@ -3532,107 +4366,160 @@ function aux.array_to_string(a,separator)
end
end
-function aux.settings_to_set(str,t)
+function parsers.settings_to_set(str,t) -- tohash? -- todo: lpeg -- duplicate anyway
t = t or { }
- for s in gmatch(str,"%s*([^,]+)") do
+-- for s in gmatch(str,"%s*([^, ]+)") do -- space added
+ for s in gmatch(str,"[^, ]+") do -- space added
t[s] = true
end
return t
end
-local value = lbrace * lpeg.C((nobrace + nested)^0) * rbrace
-local pattern = lpeg.Ct((space + value)^0)
+function parsers.simple_hash_to_string(h, separator)
+ local t, tn = { }, 0
+ for k, v in sortedhash(h) do
+ if v then
+ tn = tn + 1
+ t[tn] = k
+ end
+ end
+ return concat(t,separator or ",")
+end
+
+local value = lbrace * C((nobrace + nested)^0) * rbrace
+local pattern = Ct((space + value)^0)
-function aux.arguments_to_table(str)
+function parsers.arguments_to_table(str)
return lpegmatch(pattern,str)
end
--- temporary here
+-- temporary here (unoptimized)
-function aux.getparameters(self,class,parentclass,settings)
+function parsers.getparameters(self,class,parentclass,settings)
local sc = self[class]
if not sc then
- sc = table.clone(self[parent])
+ sc = { }
self[class] = sc
+ if parentclass then
+ local sp = self[parentclass]
+ if not sp then
+ sp = { }
+ self[parentclass] = sp
+ end
+ setmetatableindex(sc,sp)
+ end
end
- aux.settings_to_hash(settings,sc)
+ parsers.settings_to_hash(settings,sc)
+end
+
+function parsers.listitem(str)
+ return gmatch(str,"[^, ]+")
end
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-fmt'] = {
+ 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"
+}
+
+utilities = utilities or { }
+utilities.formatters = utilities.formatters or { }
+local formatters = utilities.formatters
+
+local concat, format = table.concat, string.format
+local tostring, type = tostring, type
+local strip = string.strip
+
+local P, R, Cs = lpeg.P, lpeg.R, lpeg.Cs
+local lpegmatch = lpeg.match
+
-- temporary here
-local digit = lpeg.R("09")
-local period = lpeg.P(".")
-local zero = lpeg.P("0")
+local digit = R("09")
+local period = P(".")
+local zero = P("0")
local trailingzeros = zero^0 * -digit -- suggested by Roberto R
local case_1 = period * trailingzeros / ""
local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
local number = digit^1 * (case_1 + case_2)
-local stripper = lpeg.Cs((number + 1)^0)
+local stripper = Cs((number + 1)^0)
---~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
---~ collectgarbage("collect")
---~ str = string.rep(sample,10000)
---~ local ts = os.clock()
---~ lpegmatch(stripper,str)
---~ print(#str, os.clock()-ts, lpegmatch(stripper,sample))
-lpeg.patterns.strip_zeros = stripper
+lpeg.patterns.stripzeros = stripper
-function aux.strip_zeros(str)
+function formatters.stripzeros(str)
return lpegmatch(stripper,str)
end
-function aux.definetable(target) -- defines undefined tables
- local composed, t = nil, { }
- for name in gmatch(target,"([^%.]+)") do
- if composed then
- composed = composed .. "." .. name
- else
- composed = name
+function formatters.formatcolumns(result,between)
+ if result and #result > 0 then
+ between = between or " "
+ local widths, numbers = { }, { }
+ local first = result[1]
+ local n = #first
+ for i=1,n do
+ widths[i] = 0
+ end
+ for i=1,#result do
+ local r = result[i]
+ for j=1,n do
+ local rj = r[j]
+ local tj = type(rj)
+ if tj == "number" then
+ numbers[j] = true
+ end
+ if tj ~= "string" then
+ rj = tostring(rj)
+ r[j] = rj
+ end
+ local w = #rj
+ if w > widths[j] then
+ widths[j] = w
+ end
+ end
+ end
+ for i=1,n do
+ local w = widths[i]
+ if numbers[i] then
+ if w > 80 then
+ widths[i] = "%s" .. between
+ else
+ widths[i] = "%0" .. w .. "i" .. between
+ end
+ else
+ if w > 80 then
+ widths[i] = "%s" .. between
+ elseif w > 0 then
+ widths[i] = "%-" .. w .. "s" .. between
+ else
+ widths[i] = "%s"
+ end
+ end
+ end
+ local template = strip(concat(widths))
+ for i=1,#result do
+ local str = format(template,unpack(result[i]))
+ result[i] = strip(str)
end
- t[#t+1] = format("%s = %s or { }",composed,composed)
- end
- return concat(t,"\n")
-end
-
-function aux.accesstable(target)
- local t = _G
- for name in gmatch(target,"([^%.]+)") do
- t = t[name]
end
- return t
+ return result
end
---~ function string.commaseparated(str)
---~ return gmatch(str,"([^,%s]+)")
---~ end
-
--- as we use this a lot ...
-
---~ function aux.cachefunction(action,weak)
---~ local cache = { }
---~ if weak then
---~ setmetatable(cache, { __mode = "kv" } )
---~ end
---~ local function reminder(str)
---~ local found = cache[str]
---~ if not found then
---~ found = action(str)
---~ cache[str] = found
---~ end
---~ return found
---~ end
---~ return reminder, cache
---~ end
-
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['trac-tra'] = {
+if not modules then modules = { } end modules ['util.deb'] = {
version = 1.001,
- comment = "companion to trac-tra.mkiv",
+ 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"
@@ -3645,14 +4532,16 @@ if not modules then modules = { } end modules ['trac-tra'] = {
local debug = require "debug"
local getinfo = debug.getinfo
-local type, next = type, next
-local concat = table.concat
-local format, find, lower, gmatch, gsub = string.format, string.find, string.lower, string.gmatch, string.gsub
+local type, next, tostring = type, next, tostring
+local format, find = string.format, string.find
+local is_boolean = string.is_boolean
-debugger = debugger or { }
+utilities = utilities or { }
+utilities.debugger = utilities.debugger or { }
+local debugger = utilities.debugger
local counters = { }
-local names = { }
+local names = { }
-- one
@@ -3670,6 +4559,7 @@ local function hook()
end
end
end
+
local function getname(func)
local n = names[func]
if n then
@@ -3685,6 +4575,7 @@ local function getname(func)
return "unknown"
end
end
+
function debugger.showstats(printer,threshold)
printer = printer or texio.write or print
threshold = threshold or 0
@@ -3707,35 +4598,6 @@ end
-- two
---~ local function hook()
---~ local n = getinfo(2)
---~ if n.what=="C" and not n.name then
---~ local f = tostring(debug.traceback())
---~ local cf = counters[f]
---~ if cf == nil then
---~ counters[f] = 1
---~ names[f] = n
---~ else
---~ counters[f] = cf + 1
---~ end
---~ end
---~ end
---~ function debugger.showstats(printer,threshold)
---~ printer = printer or texio.write or print
---~ threshold = threshold or 0
---~ local total, grandtotal, functions = 0, 0, 0
---~ printer("\n") -- ugly but ok
---~ -- table.sort(counters)
---~ for func, count in next, counters do
---~ if count > threshold then
---~ printer(format("%8i %s", count, func))
---~ total = total + count
---~ end
---~ grandtotal = grandtotal + count
---~ functions = functions + 1
---~ end
---~ printer(format("functions: %s, total: %s, grand total: %s, threshold: %s\n", functions, total, grandtotal, threshold))
---~ end
-- rest
@@ -3753,85 +4615,335 @@ end
function debugger.disable()
debug.sethook()
---~ counters[debug.getinfo(2,"f").func] = nil
end
-function debugger.tracing()
- local n = tonumber(os.env['MTX.TRACE.CALLS']) or tonumber(os.env['MTX_TRACE_CALLS']) or 0
- if n > 0 then
- function debugger.tracing() return true end ; return true
+
+
+
+
+local is_node = node and node.is_node
+
+function inspect(i) -- global function
+ local ti = type(i)
+ if ti == "table" then
+ table.print(i,"table")
+ elseif is_node and is_node(i) then
+ table.print(nodes.astable(i),tostring(i))
else
- function debugger.tracing() return false end ; return false
+ print(tostring(i))
end
end
---~ debugger.enable()
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
+end -- of closure
---~ debugger.disable()
+do -- create closure to overcome 200 locals limit
---~ print("")
---~ debugger.showstats()
---~ print("")
---~ debugger.showstats(print,3)
+if not modules then modules = { } end modules ['trac-inf'] = {
+ version = 1.001,
+ comment = "companion to trac-inf.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- As we want to protect the global tables, we no longer store the timing
+-- in the tables themselves but in a hidden timers table so that we don't
+-- get warnings about assignments. This is more efficient than using rawset
+-- and rawget.
+
+local format = string.format
+local clock = os.gettimeofday or os.clock -- should go in environment
+local write_nl = texio.write_nl
+
+statistics = statistics or { }
+local statistics = statistics
+
+statistics.enable = true
+statistics.threshold = 0.05
+
+local statusinfo, n, registered, timers = { }, 0, { }, { }
+
+local function hastiming(instance)
+ return instance and timers[instance]
+end
+
+local function resettiming(instance)
+ timers[instance or "notimer"] = { timing = 0, loadtime = 0 }
+end
-setters = setters or { }
-setters.data = setters.data or { }
+local function starttiming(instance)
+ local timer = timers[instance or "notimer"]
+ if not timer then
+ timer = { }
+ timers[instance or "notimer"] = timer
+ end
+ local it = timer.timing
+ if not it then
+ it = 0
+ end
+ if it == 0 then
+ timer.starttime = clock()
+ if not timer.loadtime then
+ timer.loadtime = 0
+ end
+ end
+ timer.timing = it + 1
+end
---~ local function set(t,what,value)
---~ local data, done = t.data, t.done
---~ if type(what) == "string" then
---~ what = aux.settings_to_array(what) -- inefficient but ok
---~ end
---~ for i=1,#what do
---~ local w = what[i]
---~ for d, f in next, data do
---~ if done[d] then
---~ -- prevent recursion due to wildcards
---~ elseif find(d,w) then
---~ done[d] = true
---~ for i=1,#f do
---~ f[i](value)
---~ end
---~ end
---~ end
---~ end
---~ end
+local function stoptiming(instance, report)
+ local timer = timers[instance or "notimer"]
+ local it = timer.timing
+ if it > 1 then
+ timer.timing = it - 1
+ else
+ local starttime = timer.starttime
+ if starttime then
+ local stoptime = clock()
+ local loadtime = stoptime - starttime
+ timer.stoptime = stoptime
+ timer.loadtime = timer.loadtime + loadtime
+ if report then
+ statistics.report("load time %0.3f",loadtime)
+ end
+ timer.timing = 0
+ return loadtime
+ end
+ end
+ return 0
+end
-local function set(t,what,value)
+local function elapsedtime(instance)
+ local timer = timers[instance or "notimer"]
+ return format("%0.3f",timer and timer.loadtime or 0)
+end
+
+local function elapsedindeed(instance)
+ local timer = timers[instance or "notimer"]
+ return (timer and timer.loadtime or 0) > statistics.threshold
+end
+
+local function elapsedseconds(instance,rest) -- returns nil if 0 seconds
+ if elapsedindeed(instance) then
+ return format("%s seconds %s", elapsedtime(instance),rest or "")
+ end
+end
+
+statistics.hastiming = hastiming
+statistics.resettiming = resettiming
+statistics.starttiming = starttiming
+statistics.stoptiming = stoptiming
+statistics.elapsedtime = elapsedtime
+statistics.elapsedindeed = elapsedindeed
+statistics.elapsedseconds = elapsedseconds
+
+-- general function
+
+function statistics.register(tag,fnc)
+ if statistics.enable and type(fnc) == "function" then
+ local rt = registered[tag] or (#statusinfo + 1)
+ statusinfo[rt] = { tag, fnc }
+ registered[tag] = rt
+ if #tag > n then n = #tag end
+ end
+end
+
+function statistics.show(reporter)
+ if statistics.enable then
+ if not reporter then reporter = function(tag,data,n) write_nl(tag .. " " .. data) end end
+ -- this code will move
+ local register = statistics.register
+ register("luatex banner", function()
+ return string.lower(status.banner)
+ end)
+ register("control sequences", function()
+ return format("%s of %s", status.cs_count, status.hash_size+status.hash_extra)
+ end)
+ register("callbacks", function()
+ local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0
+ return format("%s direct, %s indirect, %s total", total-indirect, indirect, total)
+ end)
+ collectgarbage("collect")
+ register("current memory usage", statistics.memused)
+ register("runtime",statistics.runtime)
+ for i=1,#statusinfo do
+ local s = statusinfo[i]
+ local r = s[2]()
+ if r then
+ reporter(s[1],r,n)
+ end
+ end
+ write_nl("") -- final newline
+ statistics.enable = false
+ end
+end
+
+local template, report_statistics, nn = nil, nil, 0 -- we only calcute it once
+
+function statistics.showjobstat(tag,data,n)
+ if not logs then
+ -- sorry
+ elseif type(data) == "table" then
+ for i=1,#data do
+ statistics.showjobstat(tag,data[i],n)
+ end
+ else
+ if not template or n > nn then
+ template, n = format("%%-%ss - %%s",n), nn
+ report_statistics = logs.reporter("mkiv lua stats")
+ end
+ report_statistics(format(template,tag,data))
+ end
+end
+
+function statistics.memused() -- no math.round yet -)
+ local round = math.round or math.floor
+ return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000))
+end
+
+starttiming(statistics)
+
+function statistics.formatruntime(runtime) -- indirect so it can be overloaded and
+ return format("%s seconds", runtime) -- indeed that happens in cure-uti.lua
+end
+
+function statistics.runtime()
+ stoptiming(statistics)
+ return statistics.formatruntime(elapsedtime(statistics))
+end
+
+function statistics.timed(action,report)
+ report = report or logs.reporter("system")
+ starttiming("run")
+ action()
+ stoptiming("run")
+ report("total runtime: %s",elapsedtime("run"))
+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")
+ tex.sprint(elapsedtime(name or "whatever"))
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['trac-set'] = { -- might become util-set.lua
+ 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 type, next, tostring = type, next, tostring
+local concat = table.concat
+local format, find, lower, gsub, escapedpattern = string.format, string.find, string.lower, string.gsub, string.escapedpattern
+local is_boolean = string.is_boolean
+local settings_to_hash = utilities.parsers.settings_to_hash
+local allocate = utilities.storage.allocate
+
+utilities = utilities or { }
+local utilities = utilities
+utilities.setters = utilities.setters or { }
+local setters = utilities.setters
+
+local data = { } -- maybe just local
+
+-- We can initialize from the cnf file. This is sort of tricky as
+-- later defined setters also need to be initialized then. If set
+-- this way, we need to ensure that they are not reset later on.
+
+local trace_initialize = false -- only for testing during development
+
+function setters.initialize(filename,name,values) -- filename only for diagnostics
+ local setter = data[name]
+ if setter then
+ local data = setter.data
+ if data then
+ for key, value in next, values do
+ -- key = gsub(key,"_",".")
+ value = is_boolean(value,value)
+ local functions = data[key]
+ if functions then
+ if #functions > 0 and not functions.value then
+ if trace_initialize then
+ setter.report("executing %s (%s -> %s)",key,filename,tostring(value))
+ end
+ for i=1,#functions do
+ functions[i](value)
+ end
+ functions.value = value
+ else
+ if trace_initialize then
+ setter.report("skipping %s (%s -> %s)",key,filename,tostring(value))
+ end
+ end
+ else
+ -- we do a simple preregistration i.e. not in the
+ -- list as it might be an obsolete entry
+ functions = { default = value }
+ data[key] = functions
+ if trace_initialize then
+ setter.report("storing %s (%s -> %s)",key,filename,tostring(value))
+ end
+ end
+ end
+ return true
+ end
+ end
+end
+
+-- user interface code
+
+local function set(t,what,newvalue)
local data, done = t.data, t.done
if type(what) == "string" then
- what = aux.settings_to_hash(what) -- inefficient but ok
+ what = settings_to_hash(what) -- inefficient but ok
+ end
+ if type(what) ~= "table" then
+ return
end
- for w, v in next, what do
- if v == "" then
- v = value
+ for w, value in next, what do
+ if value == "" then
+ value = newvalue
+ elseif not value then
+ value = false -- catch nil
else
- v = toboolean(v)
+ value = is_boolean(value,value)
end
- for d, f in next, data do
- if done[d] then
+ w = "^" .. escapedpattern(w,true) .. "$" -- new: anchored
+ for name, functions in next, data do
+ if done[name] then
-- prevent recursion due to wildcards
- elseif find(d,w) then
- done[d] = true
- for i=1,#f do
- f[i](v)
+ elseif find(name,w) then
+ done[name] = true
+ for i=1,#functions do
+ functions[i](value)
end
+ functions.value = value
end
end
end
end
local function reset(t)
- for d, f in next, t.data do
- for i=1,#f do
- f[i](false)
+ for name, functions in next, t.data do
+ for i=1,#functions do
+ functions[i](false)
end
+ functions.value = false
end
end
@@ -3852,32 +4964,51 @@ end
function setters.register(t,what,...)
local data = t.data
what = lower(what)
- local w = data[what]
- if not w then
- w = { }
- data[what] = w
+ local functions = data[what]
+ if not functions then
+ functions = { }
+ data[what] = functions
+ if trace_initialize then
+ t.report("defining %s",what)
+ end
end
+ local default = functions.default -- can be set from cnf file
for _, fnc in next, { ... } do
local typ = type(fnc)
- if typ == "function" then
- w[#w+1] = fnc
- elseif typ == "string" then
- w[#w+1] = function(value) set(t,fnc,value,nesting) end
+ if typ == "string" then
+ if trace_initialize then
+ t.report("coupling %s to %s",what,fnc)
+ end
+ local s = fnc -- else wrong reference
+ fnc = function(value) set(t,s,value) end
+ elseif typ ~= "function" then
+ fnc = nil
+ end
+ if fnc then
+ functions[#functions+1] = fnc
+ -- default: set at command line or in cnf file
+ -- value : set in tex run (needed when loading runtime)
+ local value = functions.value or default
+ if value ~= nil then
+ fnc(value)
+ functions.value = value
+ end
end
end
+ return false -- so we can use it in an assignment
end
function setters.enable(t,what)
local e = t.enable
t.enable, t.done = enable, { }
- enable(t,string.simpleesc(tostring(what)))
+ enable(t,what)
t.enable, t.done = e, { }
end
function setters.disable(t,what)
local e = t.disable
t.disable, t.done = disable, { }
- disable(t,string.simpleesc(tostring(what)))
+ disable(t,what)
t.disable, t.done = e, { }
end
@@ -3901,68 +5032,94 @@ function setters.list(t) -- pattern
end
function setters.show(t)
- commands.writestatus("","")
+ local category = t.name
local list = setters.list(t)
+ t.report()
for k=1,#list do
- commands.writestatus(t.name,list[k])
+ local name = list[k]
+ local functions = t.data[name]
+ if functions then
+ local value, default, modules = functions.value, functions.default, #functions
+ value = value == nil and "unset" or tostring(value)
+ default = default == nil and "unset" or tostring(default)
+ t.report("%-30s modules: %2i default: %6s value: %6s",name,modules,default,value)
+ end
end
- commands.writestatus("","")
+ t.report()
end
-- we could have used a bit of oo and the trackers:enable syntax but
-- there is already a lot of code around using the singular tracker
--- we could make this into a module
+-- we could make this into a module but we also want the rest avaliable
+
+local enable, disable, register, list, show = setters.enable, setters.disable, setters.register, setters.list, setters.show
+
+local function report(setter,...)
+ local report = logs and logs.report
+ if report then
+ report(setter.name,...)
+ else -- fallback, as this module is loaded before the logger
+ write_nl(format("%-15s : %s\n",setter.name,format(...)))
+ end
+end
function setters.new(name)
- local t
- t = {
- data = { },
+ local setter -- we need to access it in setter itself
+ setter = {
+ data = allocate(), -- indexed, but also default and value fields
name = name,
- enable = function(...) setters.enable (t,...) end,
- disable = function(...) setters.disable (t,...) end,
- register = function(...) setters.register(t,...) end,
- list = function(...) setters.list (t,...) end,
- show = function(...) setters.show (t,...) end,
+ report = function(...) report (setter,...) end,
+ enable = function(...) enable (setter,...) end,
+ disable = function(...) disable (setter,...) end,
+ register = function(...) register(setter,...) end,
+ list = function(...) list (setter,...) end,
+ show = function(...) show (setter,...) end,
}
- setters.data[name] = t
- return t
+ data[name] = setter
+ return setter
end
trackers = setters.new("trackers")
directives = setters.new("directives")
experiments = setters.new("experiments")
+local t_enable, t_disable, t_report = trackers .enable, trackers .disable, trackers .report
+local d_enable, d_disable, d_report = directives .enable, directives .disable, directives .report
+local e_enable, e_disable, e_report = experiments.enable, experiments.disable, experiments.report
+
-- nice trick: we overload two of the directives related functions with variants that
-- do tracing (itself using a tracker) .. proof of concept
local trace_directives = false local trace_directives = false trackers.register("system.directives", function(v) trace_directives = v end)
local trace_experiments = false local trace_experiments = false trackers.register("system.experiments", function(v) trace_experiments = v end)
-local e = directives.enable
-local d = directives.disable
-
function directives.enable(...)
- commands.writestatus("directives","enabling: %s",concat({...}," "))
- e(...)
+ if trace_directives then
+ d_report("enabling: %s",concat({...}," "))
+ end
+ d_enable(...)
end
function directives.disable(...)
- commands.writestatus("directives","disabling: %s",concat({...}," "))
- d(...)
+ if trace_directives then
+ d_report("disabling: %s",concat({...}," "))
+ end
+ d_disable(...)
end
-local e = experiments.enable
-local d = experiments.disable
-
function experiments.enable(...)
- commands.writestatus("experiments","enabling: %s",concat({...}," "))
- e(...)
+ if trace_experiments then
+ e_report("enabling: %s",concat({...}," "))
+ end
+ e_enable(...)
end
function experiments.disable(...)
- commands.writestatus("experiments","disabling: %s",concat({...}," "))
- d(...)
+ if trace_experiments then
+ e_report("disabling: %s",concat({...}," "))
+ end
+ e_disable(...)
end
-- a useful example
@@ -3971,6 +5128,1121 @@ directives.register("system.nostatistics", function(v)
statistics.enable = not v
end)
+directives.register("system.nolibraries", function(v)
+ libraries = nil -- we discard this tracing for security
+end)
+
+-- experiment
+
+local flags = environment and environment.engineflags
+
+if flags then
+ if trackers and flags.trackers then
+ setters.initialize("flags","trackers", settings_to_hash(flags.trackers))
+ -- t_enable(flags.trackers)
+ end
+ if directives and flags.directives then
+ setters.initialize("flags","directives", settings_to_hash(flags.directives))
+ -- d_enable(flags.directives)
+ end
+end
+
+-- here
+
+if texconfig then
+
+ local function set(k,v)
+ v = tonumber(v)
+ if v then
+ texconfig[k] = v
+ end
+ end
+
+ directives.register("luatex.expanddepth", function(v) set("expand_depth",v) end)
+ directives.register("luatex.hashextra", function(v) set("hash_extra",v) end)
+ directives.register("luatex.nestsize", function(v) set("nest_size",v) end)
+ directives.register("luatex.maxinopen", function(v) set("max_in_open",v) end)
+ directives.register("luatex.maxprintline", function(v) set("max_print_line",v) end)
+ directives.register("luatex.maxstrings", function(v) set("max_strings",v) end)
+ directives.register("luatex.paramsize", function(v) set("param_size",v) end)
+ directives.register("luatex.savesize", function(v) set("save_size",v) end)
+ directives.register("luatex.stacksize", function(v) set("stack_size",v) end)
+
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['trac-log'] = {
+ version = 1.001,
+ comment = "companion to trac-log.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- todo: less categories, more subcategories (e.g. nodes)
+
+
+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 escapedpattern = string.escapedpattern
+local texcount = tex and tex.count
+local next, type = next, type
+
+local setmetatableindex = table.setmetatableindex
+
+--[[ldx--
+<p>This is a prelude to a more extensive logging module. We no longer
+provide <l n='xml'/> based logging a sparsing is relatively easy anyway.</p>
+--ldx]]--
+
+logs = logs or { }
+local logs = logs
+
+local moreinfo = [[
+More information about ConTeXt and the tools that come with it can be found at:
+
+maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
+webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
+wiki : http://contextgarden.net
+]]
+
+-- basic loggers
+
+local function ignore() end
+
+setmetatableindex(logs, function(t,k) t[k] = ignore ; return ignore end)
+
+local report, subreport, status, settarget, setformats, settranslations
+
+local direct, subdirect, writer, pushtarget, poptarget
+
+if tex and tex.jobname or tex.formatname then
+
+ local valueiskey = { __index = function(t,k) t[k] = k return k end } -- will be helper
+
+ local target = "term and log"
+
+ logs.flush = io.flush
+
+ local formats = { } setmetatable(formats, valueiskey)
+ local translations = { } setmetatable(translations,valueiskey)
+
+ writer = function(...)
+ write_nl(target,...)
+ end
+
+ report = function(a,b,c,...)
+ if c then
+ write_nl(target,format("%-15s > %s\n",translations[a],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s > %s\n",translations[a],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s >\n", translations[a]))
+ else
+ write_nl(target,"\n")
+ end
+ end
+
+ direct = function(a,b,c,...)
+ if c then
+ return format("%-15s > %s",translations[a],format(formats[b],c,...))
+ elseif b then
+ return format("%-15s > %s",translations[a],formats[b])
+ elseif a then
+ return format("%-15s >", translations[a])
+ else
+ return ""
+ end
+ end
+
+ subreport = function(a,s,b,c,...)
+ if c then
+ write_nl(target,format("%-15s > %s > %s\n",translations[a],translations[s],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s > %s > %s\n",translations[a],translations[s],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s > %s >\n", translations[a],translations[s]))
+ else
+ write_nl(target,"\n")
+ end
+ end
+
+ subdirect = function(a,s,b,c,...)
+ if c then
+ return format("%-15s > %s > %s",translations[a],translations[s],format(formats[b],c,...))
+ elseif b then
+ return format("%-15s > %s > %s",translations[a],translations[s],formats[b])
+ elseif a then
+ return format("%-15s > %s >", translations[a],translations[s])
+ else
+ return ""
+ end
+ end
+
+ status = function(a,b,c,...)
+ if c then
+ write_nl(target,format("%-15s : %s\n",translations[a],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s : %s\n",translations[a],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s :\n", translations[a]))
+ else
+ write_nl(target,"\n")
+ 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
+ if target == "term" or target == "term and log" then
+ logs.flush = io.flush
+ else
+ logs.flush = ignore
+ end
+ end
+
+ local stack = { }
+
+ pushtarget = function(newtarget)
+ insert(stack,target)
+ settarget(newtarget)
+ end
+
+ poptarget = function()
+ if #stack > 0 then
+ settarget(remove(stack))
+ end
+ end
+
+ setformats = function(f)
+ formats = f
+ end
+
+ settranslations = function(t)
+ translations = t
+ end
+
+else
+
+ logs.flush = ignore
+
+ writer = write_nl
+
+ report = function(a,b,c,...)
+ if c then
+ write_nl(format("%-15s | %s",a,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s | %s",a,b))
+ elseif a then
+ write_nl(format("%-15s |", a))
+ else
+ write_nl("")
+ end
+ end
+
+ subreport = function(a,sub,b,c,...)
+ if c then
+ write_nl(format("%-15s | %s | %s",a,sub,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s | %s | %s",a,sub,b))
+ elseif a then
+ write_nl(format("%-15s | %s |", a,sub))
+ else
+ write_nl("")
+ end
+ end
+
+ status = function(a,b,c,...) -- not to be used in lua anyway
+ if c then
+ write_nl(format("%-15s : %s\n",a,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s : %s\n",a,b)) -- b can have %'s
+ elseif a then
+ write_nl(format("%-15s :\n", a))
+ else
+ write_nl("\n")
+ end
+ end
+
+ direct = ignore
+ subdirect = ignore
+
+ settarget = ignore
+ pushtarget = ignore
+ poptarget = ignore
+ setformats = ignore
+ settranslations = ignore
+
+end
+
+logs.report = report
+logs.subreport = subreport
+logs.status = status
+logs.settarget = settarget
+logs.pushtarget = pushtarget
+logs.poptarget = poptarget
+logs.setformats = setformats
+logs.settranslations = settranslations
+
+logs.direct = direct
+logs.subdirect = subdirect
+logs.writer = writer
+
+-- installer
+
+-- todo: renew (un) locks when a new one is added and wildcard
+
+local data, states = { }, nil
+
+function logs.reporter(category,subcategory)
+ local logger = data[category]
+ if not logger then
+ local state = false
+ if states == true then
+ state = true
+ elseif type(states) == "table" then
+ for c, _ in next, states do
+ if find(category,c) then
+ state = true
+ break
+ end
+ end
+ end
+ logger = {
+ reporters = { },
+ state = state,
+ }
+ data[category] = logger
+ end
+ local reporter = logger.reporters[subcategory or "default"]
+ if not reporter then
+ if subcategory then
+ reporter = function(...)
+ if not logger.state then
+ subreport(category,subcategory,...)
+ end
+ end
+ logger.reporters[subcategory] = reporter
+ else
+ local tag = category
+ reporter = function(...)
+ if not logger.state then
+ report(category,...)
+ end
+ end
+ logger.reporters.default = reporter
+ end
+ end
+ return reporter
+end
+
+logs.new = logs.reporter -- for old times sake
+
+-- context specicific: this ends up in the macro stream
+
+local ctxreport = logs.writer
+
+function logs.setmessenger(m)
+ ctxreport = m
+end
+
+function logs.messenger(category,subcategory)
+ -- we need to avoid catcode mess (todo: fast context)
+ if subcategory then
+ return function(...)
+ ctxreport(subdirect(category,subcategory,...))
+ end
+ else
+ return function(...)
+ ctxreport(direct(category,...))
+ end
+ end
+end
+
+-- so far
+
+local function setblocked(category,value)
+ if category == true then
+ -- lock all
+ category, value = "*", true
+ elseif category == false then
+ -- unlock all
+ category, value = "*", false
+ elseif value == nil then
+ -- lock selective
+ value = true
+ end
+ if category == "*" then
+ states = value
+ for k, v in next, data do
+ v.state = value
+ end
+ else
+ states = utilities.parsers.settings_to_hash(category)
+ for c, _ in next, states do
+ if data[c] then
+ v.state = value
+ else
+ c = escapedpattern(c,true)
+ for k, v in next, data do
+ if find(k,c) then
+ v.state = value
+ end
+ end
+ end
+ end
+ end
+end
+
+function logs.disable(category,value)
+ setblocked(category,value == nil and true or value)
+end
+
+function logs.enable(category)
+ setblocked(category,false)
+end
+
+function logs.categories()
+ return table.sortedkeys(data)
+end
+
+function logs.show()
+ local n, c, s, max = 0, 0, 0, 0
+ for category, v in table.sortedpairs(data) do
+ n = n + 1
+ local state = v.state
+ local reporters = v.reporters
+ local nc = #category
+ if nc > c then
+ c = nc
+ end
+ for subcategory, _ in next, reporters do
+ local ns = #subcategory
+ if ns > c then
+ s = ns
+ end
+ local m = nc + ns
+ if m > max then
+ max = m
+ end
+ end
+ local subcategories = concat(table.sortedkeys(reporters),", ")
+ if state == true then
+ state = "disabled"
+ elseif state == false then
+ state = "enabled"
+ else
+ state = "unknown"
+ end
+ -- no new here
+ report("logging","category: '%s', subcategories: '%s', state: '%s'",category,subcategories,state)
+ end
+ report("logging","categories: %s, max category: %s, max subcategory: %s, max combined: %s",n,c,s,max)
+end
+
+directives.register("logs.blocked", function(v)
+ setblocked(v,true)
+end)
+
+directives.register("logs.target", function(v)
+ settarget(v)
+end)
+
+-- tex specific loggers (might move elsewhere)
+
+local report_pages = logs.reporter("pages") -- not needed but saves checking when we grep for it
+
+local real, user, sub
+
+function logs.start_page_number()
+ real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
+end
+
+function logs.stop_page_number()
+ if real > 0 then
+ if user > 0 then
+ if sub > 0 then
+ report_pages("flushing realpage %s, userpage %s, subpage %s",real,user,sub)
+ else
+ report_pages("flushing realpage %s, userpage %s",real,user)
+ end
+ else
+ report_pages("flushing realpage %s",real)
+ end
+ else
+ report_pages("flushing page")
+ end
+ logs.flush()
+end
+
+logs.report_job_stat = statistics and statistics.showjobstat
+
+local report_files = logs.reporter("files")
+
+local nesting = 0
+local verbose = false
+local hasscheme = url.hasscheme
+
+-- we don't have show_open and show_close callbacks yet
+
+function logs.show_open(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- nesting = nesting + 1
+ -- report_files("level %s, opening %s",nesting,name)
+ -- else
+ -- write(format("(%s",name)) -- tex adds a space
+ -- end
+ -- end
+end
+
+function logs.show_close(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- report_files("level %s, closing %s",nesting,name)
+ -- nesting = nesting - 1
+ -- else
+ -- write(")") -- tex adds a space
+ -- end
+ -- end
+end
+
+function logs.show_load(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- report_files("level %s, loading %s",nesting+1,name)
+ -- else
+ -- write(format("(%s)",name))
+ -- end
+ -- end
+end
+
+-- there may be scripts out there using this:
+
+local simple = logs.reporter("comment")
+
+logs.simple = simple
+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
+
+-- applications
+
+local function reportlines(t,str)
+ if str then
+ for line in gmatch(str,"(.-)[\n\r]") do
+ t.report(line)
+ end
+ end
+end
+
+local function reportbanner(t)
+ local banner = t.banner
+ if banner then
+ t.report(banner)
+ t.report()
+ end
+end
+
+local function reporthelp(t,...)
+ local helpinfo = t.helpinfo
+ if type(helpinfo) == "string" then
+ reportlines(t,helpinfo)
+ elseif type(helpinfo) == "table" then
+ local tags = { ... }
+ for i=1,#tags do
+ reportlines(t,t.helpinfo[tags[i]])
+ if i < #tags then
+ t.report()
+ end
+ end
+ end
+end
+
+local function reportinfo(t)
+ t.report()
+ reportlines(t,moreinfo)
+end
+
+function logs.application(t)
+ t.name = t.name or "unknown"
+ t.banner = t.banner
+ t.report = logs.reporter(t.name)
+ t.help = function(...) reportbanner(t) ; reporthelp(t,...) ; reportinfo(t) end
+ t.identify = function() reportbanner(t) end
+ return t
+end
+
+-- somewhat special
+
+-- logging to a file
+
+
+function logs.system(whereto,process,jobname,category,...)
+ local message = format("%s %s => %s => %s => %s\r",os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...))
+ for i=1,10 do
+ local f = io.open(whereto,"a") -- we can consider keepint the file open
+ if f then
+ f:write(message)
+ f:close()
+ break
+ else
+ sleep(0.1)
+ end
+ end
+end
+
+local report_system = logs.reporter("system","logs")
+
+function logs.obsolete(old,new)
+ local o = loadstring("return " .. new)()
+ if type(o) == "function" then
+ return function(...)
+ report_system("function %s is obsolete, use %s",old,new)
+ loadstring(old .. "=" .. new .. " return ".. old)()(...)
+ end
+ elseif type(o) == "table" then
+ local t, m = { }, { }
+ m.__index = function(t,k)
+ report_system("table %s is obsolete, use %s",old,new)
+ m.__index, m.__newindex = o, o
+ return o[k]
+ end
+ m.__newindex = function(t,k,v)
+ report_system("table %s is obsolete, use %s",old,new)
+ m.__index, m.__newindex = o, o
+ o[k] = v
+ end
+ if libraries then
+ libraries.obsolete[old] = t -- true
+ end
+ setmetatable(t,m)
+ return t
+ end
+end
+
+if utilities then
+ utilities.report = report_system
+end
+
+if tex and tex.error then
+ function logs.texerrormessage(...) -- for the moment we put this function here
+ tex.error(format(...), { })
+ end
+else
+ function logs.texerrormessage(...)
+ print(format(...))
+ end
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['trac-pro'] = {
+ 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 getmetatable, setmetatable, rawset, type = getmetatable, setmetatable, rawset, type
+
+-- The protection implemented here is probably not that tight but good enough to catch
+-- problems due to naive usage.
+--
+-- There's a more extensive version (trac-xxx.lua) that supports nesting.
+--
+-- This will change when we have _ENV in lua 5.2+
+
+local trace_namespaces = false trackers.register("system.namespaces", function(v) trace_namespaces = v end)
+
+local report_system = logs.reporter("system","protection")
+
+namespaces = namespaces or { }
+local namespaces = namespaces
+
+local registered = { }
+
+local function report_index(k,name)
+ if trace_namespaces then
+ report_system("reference to '%s' in protected namespace '%s', %s",k,name,debug.traceback())
+ else
+ report_system("reference to '%s' in protected namespace '%s'",k,name)
+ end
+end
+
+local function report_newindex(k,name)
+ if trace_namespaces then
+ report_system("assignment to '%s' in protected namespace '%s', %s",k,name,debug.traceback())
+ else
+ report_system("assignment to '%s' in protected namespace '%s'",k,name)
+ end
+end
+
+local function register(name)
+ local data = name == "global" and _G or _G[name]
+ if not data then
+ return -- error
+ end
+ registered[name] = data
+ local m = getmetatable(data)
+ if not m then
+ m = { }
+ setmetatable(data,m)
+ end
+ local index, newindex = { }, { }
+ m.__saved__index = m.__index
+ m.__no__index = function(t,k)
+ if not index[k] then
+ index[k] = true
+ report_index(k,name)
+ end
+ return nil
+ end
+ m.__saved__newindex = m.__newindex
+ m.__no__newindex = function(t,k,v)
+ if not newindex[k] then
+ newindex[k] = true
+ report_newindex(k,name)
+ end
+ rawset(t,k,v)
+ end
+ m.__protection__depth = 0
+end
+
+local function private(name) -- maybe save name
+ local data = registered[name]
+ if not data then
+ data = _G[name]
+ if not data then
+ data = { }
+ _G[name] = data
+ end
+ register(name)
+ end
+ return data
+end
+
+local function protect(name)
+ local data = registered[name]
+ if not data then
+ return
+ end
+ local m = getmetatable(data)
+ local pd = m.__protection__depth
+ if pd > 0 then
+ m.__protection__depth = pd + 1
+ else
+ m.__save_d_index, m.__saved__newindex = m.__index, m.__newindex
+ m.__index, m.__newindex = m.__no__index, m.__no__newindex
+ m.__protection__depth = 1
+ end
+end
+
+local function unprotect(name)
+ local data = registered[name]
+ if not data then
+ return
+ end
+ local m = getmetatable(data)
+ local pd = m.__protection__depth
+ if pd > 1 then
+ m.__protection__depth = pd - 1
+ else
+ m.__index, m.__newindex = m.__saved__index, m.__saved__newindex
+ m.__protection__depth = 0
+ end
+end
+
+local function protectall()
+ for name, _ in next, registered do
+ if name ~= "global" then
+ protect(name)
+ end
+ end
+end
+
+local function unprotectall()
+ for name, _ in next, registered do
+ if name ~= "global" then
+ unprotect(name)
+ end
+ end
+end
+
+namespaces.register = register -- register when defined
+namespaces.private = private -- allocate and register if needed
+namespaces.protect = protect
+namespaces.unprotect = unprotect
+namespaces.protectall = protectall
+namespaces.unprotectall = unprotectall
+
+namespaces.private("namespaces") registered = { } register("global") -- unreachable
+
+directives.register("system.protect", function(v)
+ if v then
+ protectall()
+ else
+ unprotectall()
+ end
+end)
+
+directives.register("system.checkglobals", function(v)
+ if v then
+ report_system("enabling global namespace guard")
+ protect("global")
+ else
+ report_system("disabling global namespace guard")
+ unprotect("global")
+ end
+end)
+
+-- dummy section (will go to luat-dum.lua)
+
+
+
+
+
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['luat-env'] = {
+ 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"
+}
+
+-- A former version provided functionality for non embeded core
+-- scripts i.e. runtime library loading. Given the amount of
+-- Lua code we use now, this no longer makes sense. Much of this
+-- evolved before bytecode arrays were available and so a lot of
+-- code has disappeared already.
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_lua = logs.reporter("resolvers","lua")
+
+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 concat = table.concat
+
+-- precautions
+
+os.setlocale(nil,nil) -- useless feature and even dangerous in luatex
+
+function os.setlocale()
+ -- no way you can mess with it
+end
+
+-- dirty tricks
+
+if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
+ arg[-1] = arg[0]
+ arg[ 0] = arg[2]
+ for k=3,#arg do
+ arg[k-2] = arg[k]
+ end
+ arg[#arg] = nil -- last
+ arg[#arg] = nil -- pre-last
+end
+
+-- environment
+
+environment = environment or { }
+local environment = environment
+
+environment.arguments = allocate()
+environment.files = allocate()
+environment.sortedflags = nil
+
+local mt = {
+ __index = function(_,k)
+ if k == "version" then
+ local version = tex.toks and tex.toks.contextversiontoks
+ if version and version ~= "" then
+ rawset(environment,"version",version)
+ return version
+ else
+ return "unknown"
+ end
+ elseif k == "jobname" or k == "formatname" then
+ local name = tex and tex[k]
+ if name or name== "" then
+ rawset(environment,k,name)
+ return name
+ else
+ return "unknown"
+ end
+ elseif k == "outputfilename" then
+ local name = environment.jobname
+ rawset(environment,k,name)
+ return name
+ end
+ end
+}
+
+setmetatable(environment,mt)
+
+function environment.initializearguments(arg)
+ local arguments, files = { }, { }
+ environment.arguments, environment.files, environment.sortedflags = arguments, files, nil
+ for index=1,#arg do
+ local argument = arg[index]
+ if index > 0 then
+ local flag, value = match(argument,"^%-+(.-)=(.-)$")
+ if flag then
+ arguments[flag] = unquoted(value or "")
+ else
+ flag = match(argument,"^%-+(.+)")
+ if flag then
+ arguments[flag] = true
+ else
+ files[#files+1] = argument
+ end
+ end
+ end
+ end
+ environment.ownname = environment.ownname or arg[0] or 'unknown.lua'
+end
+
+function environment.setargument(name,value)
+ environment.arguments[name] = value
+end
+
+-- todo: defaults, better checks e.g on type (boolean versus string)
+--
+-- tricky: too many hits when we support partials unless we add
+-- a registration of arguments so from now on we have 'partial'
+
+function environment.argument(name,partial)
+ local arguments, sortedflags = environment.arguments, environment.sortedflags
+ if arguments[name] then
+ return arguments[name]
+ elseif partial then
+ if not sortedflags then
+ sortedflags = allocate(table.sortedkeys(arguments))
+ for k=1,#sortedflags do
+ sortedflags[k] = "^" .. sortedflags[k]
+ end
+ environment.sortedflags = sortedflags
+ end
+ -- example of potential clash: ^mode ^modefile
+ for k=1,#sortedflags do
+ local v = sortedflags[k]
+ if find(name,v) then
+ return arguments[sub(v,2,#v)]
+ end
+ end
+ end
+ return nil
+end
+
+function environment.splitarguments(separator) -- rather special, cut-off before separator
+ local done, before, after = false, { }, { }
+ local originalarguments = environment.originalarguments
+ for k=1,#originalarguments do
+ local v = originalarguments[k]
+ if not done and v == separator then
+ done = true
+ elseif done then
+ after[#after+1] = v
+ else
+ before[#before+1] = v
+ end
+ end
+ return before, after
+end
+
+function environment.reconstructcommandline(arg,noquote)
+ 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
+ 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," ") then
+ result[#result+1] = quoted(a)
+ else
+ result[#result+1] = a
+ end
+ 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
+ local argument = arg[index]
+ if find(argument,"^\"") then
+ newarg[#newarg+1] = gsub(argument,"^\"","")
+ if not find(argument,"\"$") then
+ instring = true
+ end
+ elseif find(argument,"\"$") then
+ newarg[#newarg] = newarg[#newarg] .. " " .. gsub(argument,"\"$","")
+ instring = false
+ elseif instring then
+ newarg[#newarg] = newarg[#newarg] .. " " .. argument
+ else
+ newarg[#newarg+1] = argument
+ end
+ end
+ for i=1,-5,-1 do
+ newarg[i] = arg[i]
+ end
+
+ environment.initializearguments(newarg)
+
+ environment.originalarguments = mark(newarg)
+ environment.rawarguments = mark(arg)
+
+ arg = { } -- prevent duplicate handling
+
+end
+
+-- weird place ... depends on a not yet loaded module
+
+function environment.texfile(filename)
+ return resolvers.findfile(filename,'tex')
+end
+
+function environment.luafile(filename)
+ local resolved = resolvers.findfile(filename,'tex') or ""
+ if resolved ~= "" then
+ return resolved
+ end
+ resolved = resolvers.findfile(filename,'texmfscripts') or ""
+ if resolved ~= "" then
+ return resolved
+ end
+ return resolvers.findfile(filename,'luatexlibs') or ""
+end
+
+environment.loadedluacode = loadfile -- can be overloaded
+
+function environment.luafilechunk(filename,silent) -- used for loading lua bytecode in the format
+ filename = file.replacesuffix(filename, "lua")
+ local fullname = environment.luafile(filename)
+ if fullname and fullname ~= "" then
+ local data = environment.loadedluacode(fullname)
+ if trace_locating then
+ report_lua("loading file %s%s", fullname, not data and " failed" or "")
+ elseif not silent then
+ texio.write("<",data and "+ " or "- ",fullname,">")
+ end
+ return data
+ else
+ if trace_locating then
+ report_lua("unknown file %s", filename)
+ end
+ return nil
+ end
+end
+
+-- the next ones can use the previous ones / combine
+
+function environment.loadluafile(filename, version)
+ local lucname, luaname, chunk
+ local basename = file.removesuffix(filename)
+ if basename == filename then
+ lucname, luaname = basename .. ".luc", basename .. ".lua"
+ else
+ lucname, luaname = nil, basename -- forced suffix
+ end
+ -- when not overloaded by explicit suffix we look for a luc file first
+ local fullname = (lucname and environment.luafile(lucname)) or ""
+ if fullname ~= "" then
+ if trace_locating then
+ report_lua("loading %s", fullname)
+ end
+ chunk = loadfile(fullname) -- this way we don't need a file exists check
+ end
+ if chunk then
+ assert(chunk)()
+ if version then
+ -- we check of the version number of this chunk matches
+ local v = version -- can be nil
+ if modules and modules[filename] then
+ v = modules[filename].version -- new method
+ elseif versions and versions[filename] then
+ v = versions[filename] -- old method
+ end
+ if v == version then
+ return true
+ else
+ if trace_locating then
+ report_lua("version mismatch for %s: lua=%s, luc=%s", filename, v, version)
+ end
+ environment.loadluafile(filename)
+ end
+ else
+ return true
+ end
+ end
+ fullname = (luaname and environment.luafile(luaname)) or ""
+ if fullname ~= "" then
+ if trace_locating then
+ report_lua("loading %s", fullname)
+ end
+ chunk = loadfile(fullname) -- this way we don't need a file exists check
+ if not chunk then
+ if trace_locating then
+ report_lua("unknown file %s", filename)
+ end
+ else
+ assert(chunk)()
+ return true
+ end
+ end
+ return false
+end
end -- of closure
@@ -3991,6 +6263,8 @@ if not modules then modules = { } end modules ['lxml-tab'] = {
local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end)
+local report_xml = logs and logs.reporter("xml","core") or function(...) print(format(...)) end
+
--[[ldx--
<p>The parser used here is inspired by the variant discussed in the lua book, but
handles comment and processing instructions, has a different structure, provides
@@ -4001,11 +6275,15 @@ The find based parser can be found in l-xml-edu.lua along with other older code.
<p>Beware, the interface may change. For instance at, ns, tg, dt may get more
verbose names. Once the code is stable we will also remove some tracing and
optimize the code.</p>
+
+<p>I might even decide to reimplement the parser using the latest <l n='lpeg'/> trickery
+as the current variant was written when <l n='lpeg'/> showed up and it's easier now to
+build tables in one go.</p>
--ldx]]--
xml = xml or { }
+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
@@ -4129,7 +6407,7 @@ local dcache, hcache, acache = { }, { }, { }
local mt = { }
-function initialize_mt(root)
+local function initialize_mt(root)
mt = { __index = root } -- will be redefined later
end
@@ -4137,8 +6415,8 @@ function xml.setproperty(root,k,v)
getmetatable(root).__index[k] = v
end
-function xml.check_error(top,toclose)
- return ""
+function xml.checkerror(top,toclose)
+ return "" -- can be set
end
local function add_attribute(namespace,tag,value)
@@ -4194,9 +6472,9 @@ local function add_end(spacing, namespace, tag)
local toclose = remove(stack)
top = stack[#stack]
if #stack < 1 then
- errorstr = format("nothing to close with %s %s", tag, xml.check_error(top,toclose) or "")
+ errorstr = format("nothing to close with %s %s", tag, xml.checkerror(top,toclose) or "")
elseif toclose.tg ~= tag then -- no namespace check
- errorstr = format("unable to close %s with %s %s", toclose.tg, tag, xml.check_error(top,toclose) or "")
+ errorstr = format("unable to close %s with %s %s", toclose.tg, tag, xml.checkerror(top,toclose) or "")
end
dt = top.dt
dt[#dt+1] = toclose
@@ -4233,24 +6511,29 @@ local reported_attribute_errors = { }
local function attribute_value_error(str)
if not reported_attribute_errors[str] then
- logs.report("xml","invalid attribute value: %q",str)
+ report_xml("invalid attribute value: %q",str)
reported_attribute_errors[str] = true
at._error_ = str
end
return str
end
+
local function attribute_specification_error(str)
if not reported_attribute_errors[str] then
- logs.report("xml","invalid attribute specification: %q",str)
+ report_xml("invalid attribute specification: %q",str)
reported_attribute_errors[str] = true
at._error_ = str
end
return str
end
-function xml.unknown_dec_entity_format(str) return (str == "" and "&error;") or format("&%s;",str) end
-function xml.unknown_hex_entity_format(str) return format("&#x%s;",str) end
-function xml.unknown_any_entity_format(str) return format("&#x%s;",str) end
+xml.placeholders = {
+ unknown_dec_entity = function(str) return (str == "" and "&error;") or format("&%s;",str) end,
+ unknown_hex_entity = function(str) return format("&#x%s;",str) end,
+ unknown_any_entity = function(str) return format("&#x%s;",str) end,
+}
+
+local placeholders = xml.placeholders
local function fromhex(s)
local n = tonumber(s,16)
@@ -4304,18 +6587,18 @@ local function handle_hex_entity(str)
h = unify_predefined and predefined_unified[n]
if h then
if trace_entities then
- logs.report("xml","utfize, converting hex entity &#x%s; into %s",str,h)
+ report_xml("utfize, converting hex entity &#x%s; into %s",str,h)
end
elseif utfize then
- h = (n and utfchar(n)) or xml.unknown_hex_entity_format(str) or ""
+ h = (n and utfchar(n)) or xml.unknown_hex_entity(str) or ""
if not n then
- logs.report("xml","utfize, ignoring hex entity &#x%s;",str)
+ report_xml("utfize, ignoring hex entity &#x%s;",str)
elseif trace_entities then
- logs.report("xml","utfize, converting hex entity &#x%s; into %s",str,h)
+ report_xml("utfize, converting hex entity &#x%s; into %s",str,h)
end
else
if trace_entities then
- logs.report("xml","found entity &#x%s;",str)
+ report_xml("found entity &#x%s;",str)
end
h = "&#x" .. str .. ";"
end
@@ -4331,18 +6614,18 @@ local function handle_dec_entity(str)
d = unify_predefined and predefined_unified[n]
if d then
if trace_entities then
- logs.report("xml","utfize, converting dec entity &#%s; into %s",str,d)
+ report_xml("utfize, converting dec entity &#%s; into %s",str,d)
end
elseif utfize then
- d = (n and utfchar(n)) or xml.unknown_dec_entity_format(str) or ""
+ d = (n and utfchar(n)) or placeholders.unknown_dec_entity(str) or ""
if not n then
- logs.report("xml","utfize, ignoring dec entity &#%s;",str)
+ report_xml("utfize, ignoring dec entity &#%s;",str)
elseif trace_entities then
- logs.report("xml","utfize, converting dec entity &#%s; into %s",str,h)
+ report_xml("utfize, converting dec entity &#%s; into %s",str,h)
end
else
if trace_entities then
- logs.report("xml","found entity &#%s;",str)
+ report_xml("found entity &#%s;",str)
end
d = "&#" .. str .. ";"
end
@@ -4367,20 +6650,21 @@ local function handle_any_entity(str)
end
if a then
if trace_entities then
- logs.report("xml","resolved entity &%s; -> %s (internal)",str,a)
+ report_xml("resolved entity &%s; -> %s (internal)",str,a)
end
a = lpegmatch(parsedentity,a) or a
else
- if xml.unknown_any_entity_format then
- a = xml.unknown_any_entity_format(str) or ""
+ local unknown_any_entity = placeholders.unknown_any_entity
+ if unknown_any_entity then
+ a = unknown_any_entity(str) or ""
end
if a then
if trace_entities then
- logs.report("xml","resolved entity &%s; -> %s (external)",str,a)
+ report_xml("resolved entity &%s; -> %s (external)",str,a)
end
else
if trace_entities then
- logs.report("xml","keeping entity &%s;",str)
+ report_xml("keeping entity &%s;",str)
end
if str == "" then
a = "&error;"
@@ -4392,7 +6676,7 @@ local function handle_any_entity(str)
acache[str] = a
elseif trace_entities then
if not acache[str] then
- logs.report("xml","converting entity &%s; into %s",str,a)
+ report_xml("converting entity &%s; into %s",str,a)
acache[str] = a
end
end
@@ -4401,7 +6685,7 @@ local function handle_any_entity(str)
local a = acache[str]
if not a then
if trace_entities then
- logs.report("xml","found entity &%s;",str)
+ report_xml("found entity &%s;",str)
end
a = resolve_predefined and predefined_simplified[str]
if a then
@@ -4420,7 +6704,7 @@ local function handle_any_entity(str)
end
local function handle_end_entity(chr)
- logs.report("xml","error in entity, %q found instead of ';'",chr)
+ report_xml("error in entity, %q found instead of ';'",chr)
end
local space = S(' \r\n\t')
@@ -4555,7 +6839,7 @@ local function xmlconvert(data, settings)
resolve_predefined = settings.resolve_predefined_entities -- in case we have escaped entities
unify_predefined = settings.unify_predefined_entities -- &#038; -> &amp;
cleanup = settings.text_cleanup
- stack, top, at, xmlns, errorstr, result, entities = { }, { }, { }, { }, nil, nil, settings.entities or { }
+ stack, top, at, xmlns, errorstr, entities = { }, { }, { }, { }, nil, settings.entities or { }
acache, hcache, dcache = { }, { }, { } -- not stored
reported_attribute_errors = { }
if settings.parent_root then
@@ -4583,16 +6867,17 @@ local function xmlconvert(data, settings)
else
errorstr = "invalid xml file - no text at all"
end
+ local result
if errorstr and errorstr ~= "" then
result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={ }, er = true } } }
setmetatable(stack, mt)
- local error_handler = settings.error_handler
- if error_handler == false then
+ local errorhandler = settings.error_handler
+ if errorhandler == false then
-- no error message
else
- error_handler = error_handler or xml.error_handler
- if error_handler then
- xml.error_handler("load",errorstr)
+ errorhandler = errorhandler or xml.errorhandler
+ if errorhandler then
+ xml.errorhandler("load",errorstr)
end
end
else
@@ -4652,7 +6937,7 @@ function xml.is_valid(root)
return root and not root.error
end
-xml.error_handler = (logs and logs.report) or (input and logs.report) or print
+xml.errorhandler = report
--[[ldx--
<p>We cannot load an <l n='lpeg'/> from a filehandle so we need to load
@@ -4763,7 +7048,7 @@ local function verbose_element(e,handlers)
ats[#ats+1] = format('%s=%q',k,v)
end
end
- if ern and trace_remap and ern ~= ens then
+ if ern and trace_entities and ern ~= ens then
ens = ern
end
if ens ~= "" then
@@ -4868,7 +7153,7 @@ local function serialize(e,handlers,...)
-- elseif type(e) == "string" then
-- functions["@tx@"](e,handlers)
else
- functions["@dc@"](e,handlers)
+ functions["@dc@"](e,handlers) -- dc ?
end
if finalize then
return finalize()
@@ -4894,7 +7179,7 @@ local function newhandlers(settings)
if settings then
for k,v in next, settings do
if type(v) == "table" then
- tk = t[k] if not tk then tk = { } t[k] = tk end
+ local tk = t[k] if not tk then tk = { } t[k] = tk end
for kk,vv in next, v do
tk[kk] = vv
end
@@ -4906,6 +7191,7 @@ local function newhandlers(settings)
handlers[settings.name] = t
end
end
+ utilities.storage.mark(t)
return t
end
@@ -5005,7 +7291,7 @@ local function xmltext(root) -- inline
return (root and xmltostring(root)) or ""
end
-function initialize_mt(root)
+initialize_mt = function(root) -- redefinition
mt = { __tostring = xmltext, __index = root }
end
@@ -5040,7 +7326,6 @@ xml.string = xmlstring
<p>A few helpers:</p>
--ldx]]--
---~ xmlsetproperty(root,"settings",settings)
function xml.settings(e)
while e do
@@ -5150,6 +7435,7 @@ function xml.makestandalone(root)
end
end
end
+ return root
end
@@ -5166,11 +7452,14 @@ if not modules then modules = { } end modules ['lxml-pth'] = {
}
-- e.ni is only valid after a filter run
+-- todo: B/C/[get first match]
local concat, remove, insert = table.concat, table.remove, table.insert
local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring
local format, upper, lower, gmatch, gsub, find, rep = string.format, string.upper, string.lower, string.gmatch, string.gsub, string.find, string.rep
-local lpegmatch = lpeg.match
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+
+local setmetatableindex = table.setmetatableindex
-- beware, this is not xpath ... e.g. position is different (currently) and
-- we have reverse-sibling as reversed preceding sibling
@@ -5202,23 +7491,33 @@ local trace_lpath = false if trackers then trackers.register("xml.path",
local trace_lparse = false if trackers then trackers.register("xml.parse", function(v) trace_lparse = v end) end
local trace_lprofile = false if trackers then trackers.register("xml.profile", function(v) trace_lpath = v trace_lparse = v trace_lprofile = v end) end
+local report_lpath = logs.reporter("xml","lpath")
+
--[[ldx--
<p>We've now arrived at an interesting part: accessing the tree using a subset
of <l n='xpath'/> and since we're not compatible we call it <l n='lpath'/>. We
will explain more about its usage in other documents.</p>
--ldx]]--
+local xml = xml
+
local lpathcalls = 0 function xml.lpathcalls () return lpathcalls end
local lpathcached = 0 function xml.lpathcached() return lpathcached end
-xml.functions = xml.functions or { } -- internal
-xml.expressions = xml.expressions or { } -- in expressions
-xml.finalizers = xml.finalizers or { } -- fast do-with ... (with return value other than collection)
-xml.specialhandler = xml.specialhandler or { }
+xml.functions = xml.functions or { } -- internal
+local functions = xml.functions
+
+xml.expressions = xml.expressions or { } -- in expressions
+local expressions = xml.expressions
+
+xml.finalizers = xml.finalizers or { } -- fast do-with ... (with return value other than collection)
+local finalizers = xml.finalizers
-local functions = xml.functions
-local expressions = xml.expressions
-local finalizers = xml.finalizers
+xml.specialhandler = xml.specialhandler or { }
+local specialhandler = xml.specialhandler
+
+lpegpatterns.xml = lpegpatterns.xml or { }
+local xmlpatterns = lpegpatterns.xml
finalizers.xml = finalizers.xml or { }
finalizers.tex = finalizers.tex or { }
@@ -5228,14 +7527,14 @@ local function fallback (t, name)
if fn then
t[name] = fn
else
- logs.report("xml","unknown sub finalizer '%s'",tostring(name))
+ report_lpath("unknown sub finalizer '%s'",tostring(name))
fn = function() end
end
return fn
end
-setmetatable(finalizers.xml, { __index = fallback })
-setmetatable(finalizers.tex, { __index = fallback })
+setmetatableindex(finalizers.xml, fallback)
+setmetatableindex(finalizers.tex, fallback)
xml.defaultprotocol = "xml"
@@ -5283,102 +7582,106 @@ apply_axis['root'] = function(list)
rt = ll
end
end
- collected[#collected+1] = rt
+ collected[l] = rt
end
return collected
end
apply_axis['self'] = function(list)
---~ local collected = { }
---~ for l=1,#list do
---~ collected[#collected+1] = list[l]
---~ end
---~ return collected
return list
end
apply_axis['child'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local dt = ll.dt
- local en = 0
- for k=1,#dt do
- local dk = dt[k]
- if dk.tg then
- collected[#collected+1] = dk
- dk.ni = k -- refresh
- en = en + 1
- dk.ei = en
+ if dt then -- weird that this is needed
+ local en = 0
+ for k=1,#dt do
+ local dk = dt[k]
+ if dk.tg then
+ c = c + 1
+ collected[c] = dk
+ dk.ni = k -- refresh
+ en = en + 1
+ dk.ei = en
+ end
end
+ ll.en = en
end
- ll.en = en
end
return collected
end
-local function collect(list,collected)
+local function collect(list,collected,c)
local dt = list.dt
if dt then
local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
- collected[#collected+1] = dk
+ c = c + 1
+ collected[c] = dk
dk.ni = k -- refresh
en = en + 1
dk.ei = en
- collect(dk,collected)
+ c = collect(dk,collected,c)
end
end
list.en = en
end
+ return c
end
apply_axis['descendant'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
- collect(list[l],collected)
+ c = collect(list[l],collected,c)
end
return collected
end
-local function collect(list,collected)
+local function collect(list,collected,c)
local dt = list.dt
if dt then
local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
- collected[#collected+1] = dk
+ c = c + 1
+ collected[c] = dk
dk.ni = k -- refresh
en = en + 1
dk.ei = en
- collect(dk,collected)
+ c = collect(dk,collected,c)
end
end
list.en = en
end
+ return c
end
apply_axis['descendant-or-self'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
if ll.special ~= true then -- catch double root
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
- collect(ll,collected)
+ c = collect(ll,collected,c)
end
return collected
end
apply_axis['ancestor'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
while ll do
ll = ll.__p__
if ll then
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
end
end
@@ -5386,14 +7689,16 @@ apply_axis['ancestor'] = function(list)
end
apply_axis['ancestor-or-self'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
while ll do
ll = ll.__p__
if ll then
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
end
end
@@ -5401,11 +7706,12 @@ apply_axis['ancestor-or-self'] = function(list)
end
apply_axis['parent'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local pl = list[l].__p__
if pl then
- collected[#collected+1] = pl
+ c = c + 1
+ collected[c] = pl
end
end
return collected
@@ -5420,43 +7726,15 @@ apply_axis['namespace'] = function(list)
end
apply_axis['following'] = function(list) -- incomplete
---~ local collected = { }
---~ for l=1,#list do
---~ local ll = list[l]
---~ local p = ll.__p__
---~ local d = p.dt
---~ for i=ll.ni+1,#d do
---~ local di = d[i]
---~ if type(di) == "table" then
---~ collected[#collected+1] = di
---~ break
---~ end
---~ end
---~ end
---~ return collected
return { }
end
apply_axis['preceding'] = function(list) -- incomplete
---~ local collected = { }
---~ for l=1,#list do
---~ local ll = list[l]
---~ local p = ll.__p__
---~ local d = p.dt
---~ for i=ll.ni-1,1,-1 do
---~ local di = d[i]
---~ if type(di) == "table" then
---~ collected[#collected+1] = di
---~ break
---~ end
---~ end
---~ end
---~ return collected
return { }
end
apply_axis['following-sibling'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -5464,7 +7742,8 @@ apply_axis['following-sibling'] = function(list)
for i=ll.ni+1,#d do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -5472,7 +7751,7 @@ apply_axis['following-sibling'] = function(list)
end
apply_axis['preceding-sibling'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -5480,7 +7759,8 @@ apply_axis['preceding-sibling'] = function(list)
for i=1,ll.ni-1 do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -5488,7 +7768,7 @@ apply_axis['preceding-sibling'] = function(list)
end
apply_axis['reverse-sibling'] = function(list) -- reverse preceding
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -5496,7 +7776,8 @@ apply_axis['reverse-sibling'] = function(list) -- reverse preceding
for i=ll.ni-1,1,-1 do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -5522,7 +7803,7 @@ local function apply_nodes(list,directive,nodes)
return { }
end
else
- local collected, m, p = { }, 0, nil
+ local collected, c, m, p = { }, 0, 0, nil
if not nns then -- only check tag
for l=1,#list do
local ll = list[l]
@@ -5531,11 +7812,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ntg == ltg then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif ntg ~= ltg then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5547,11 +7830,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if lns == nns then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif lns ~= nns then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5565,11 +7850,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif not ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5577,7 +7864,7 @@ local function apply_nodes(list,directive,nodes)
return collected
end
else
- local collected, m, p = { }, 0, nil
+ local collected, c, m, p = { }, 0, 0, nil
for l=1,#list do
local ll = list[l]
local ltg = ll.tg
@@ -5594,11 +7881,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif not ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5609,12 +7898,13 @@ end
local quit_expression = false
local function apply_expression(list,expression,order)
- local collected = { }
+ local collected, c = { }, 0
quit_expression = false
for l=1,#list do
local ll = list[l]
if expression(list,ll,l,order) then -- nasty, order alleen valid als n=1
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
if quit_expression then
break
@@ -5653,7 +7943,9 @@ local lp_builtin = P (
P("ns") / "ll.ns"
) * ((spaces * P("(") * spaces * P(")"))/"")
-local lp_attribute = (P("@") + P("attribute::")) / "" * Cc("(ll.at and ll.at['") * R("az","AZ","--","__")^1 * Cc("'])")
+-- for the moment we keep namespaces with attributes
+
+local lp_attribute = (P("@") + P("attribute::")) / "" * Cc("(ll.at and ll.at['") * ((R("az","AZ") + S("-_:"))^1) * Cc("'])")
local lp_fastpos_p = ((P("+")^0 * R("09")^1 * P(-1)) / function(s) return "l==" .. s end)
local lp_fastpos_n = ((P("-") * R("09")^1 * P(-1)) / function(s) return "(" .. s .. "<0 and (#list+".. s .. "==l))" end)
local lp_fastpos = lp_fastpos_n + lp_fastpos_p
@@ -5714,14 +8006,12 @@ local converter = Cs (
)
cleaner = Cs ( (
---~ lp_fastpos +
lp_reserved +
lp_number +
lp_string +
1 )^1 )
---~ expr
local template_e = [[
local expr = xml.expressions
@@ -5772,13 +8062,13 @@ local skip = { }
local function errorrunner_e(str,cnv)
if not skip[str] then
- logs.report("lpath","error in expression: %s => %s",str,cnv)
+ report_lpath("error in expression: %s => %s",str,cnv)
skip[str] = cnv or str
end
return false
end
local function errorrunner_f(str,arg)
- logs.report("lpath","error in finalizer: %s(%s)",str,arg or "")
+ report_lpath("error in finalizer: %s(%s)",str,arg or "")
return false
end
@@ -5829,7 +8119,7 @@ local special_1 = P("*") * Cc(register_auto_descendant) * Cc(register_all_nodes
local special_2 = P("/") * Cc(register_auto_self)
local special_3 = P("") * Cc(register_auto_self)
-local parser = Ct { "patterns", -- can be made a bit faster by moving pattern outside
+local pathparser = Ct { "patterns", -- can be made a bit faster by moving pattern outside
patterns = spaces * V("protocol") * spaces * (
( V("special") * spaces * P(-1) ) +
@@ -5901,6 +8191,8 @@ local parser = Ct { "patterns", -- can be made a bit faster by moving pattern ou
}
+xmlpatterns.pathparser = pathparser
+
local cache = { }
local function nodesettostring(set,nodetest)
@@ -5910,7 +8202,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[#t+1] = (directive and tg) or format("not(%s)",tg)
+ t[i] = (directive and tg) or format("not(%s)",tg)
end
if nodetest == false then
return format("not(%s)",concat(t,"|"))
@@ -5929,7 +8221,7 @@ local function tagstostring(list)
local ns, tg = li.ns, li.tg
if not ns or ns == "" then ns = "*" end
if not tg or tg == "" then tg = "*" end
- t[#t+1] = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg)
+ t[i] = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg)
end
return concat(t," ")
end
@@ -5937,16 +8229,16 @@ end
xml.nodesettostring = nodesettostring
-local parse_pattern -- we have a harmless kind of circular reference
+local lpath -- we have a harmless kind of circular reference
+
+local lshowoptions = { functions = false }
local function lshow(parsed)
if type(parsed) == "string" then
- parsed = parse_pattern(parsed)
+ parsed = lpath(parsed)
end
- local s = table.serialize_functions -- ugly
- table.serialize_functions = false -- ugly
- logs.report("lpath","%s://%s => %s",parsed.protocol or xml.defaultprotocol,parsed.pattern,table.serialize(parsed,false))
- table.serialize_functions = s -- ugly
+ report_lpath("%s://%s => %s",parsed.protocol or xml.defaultprotocol,parsed.pattern,
+ table.serialize(parsed,false,lshowoptions))
end
xml.lshow = lshow
@@ -5960,7 +8252,7 @@ local function add_comment(p,str)
end
end
-parse_pattern = function (pattern) -- the gain of caching is rather minimal
+lpath = function (pattern) -- the gain of caching is rather minimal
lpathcalls = lpathcalls + 1
if type(pattern) == "table" then
return pattern
@@ -5969,13 +8261,13 @@ parse_pattern = function (pattern) -- the gain of caching is rather minimal
if parsed then
lpathcached = lpathcached + 1
else
- parsed = lpegmatch(parser,pattern)
+ parsed = lpegmatch(pathparser,pattern)
if parsed then
parsed.pattern = pattern
local np = #parsed
if np == 0 then
parsed = { pattern = pattern, register_self, state = "parsing error" }
- logs.report("lpath","parsing error in '%s'",pattern)
+ report_lpath("parsing error in '%s'",pattern)
lshow(parsed)
else
-- we could have done this with a more complex parser but this
@@ -6017,6 +8309,8 @@ parse_pattern = function (pattern) -- the gain of caching is rather minimal
end
end
+xml.lpath = lpath
+
-- we can move all calls inline and then merge the trace back
-- technically we can combine axis and the next nodes which is
-- what we did before but this a bit cleaner (but slower too)
@@ -6079,32 +8373,32 @@ local function traced_apply(list,parsed,nofparsed,order)
if trace_lparse then
lshow(parsed)
end
- logs.report("lpath", "collecting : %s",parsed.pattern)
- logs.report("lpath", " root tags : %s",tagstostring(list))
- logs.report("lpath", " order : %s",order or "unset")
+ report_lpath("collecting: %s",parsed.pattern)
+ report_lpath("root tags : %s",tagstostring(list))
+ report_lpath("order : %s",order or "unset")
local collected = list
for i=1,nofparsed do
local pi = parsed[i]
local kind = pi.kind
if kind == "axis" then
collected = apply_axis[pi.axis](collected)
- logs.report("lpath", "% 10i : ax : %s",(collected and #collected) or 0,pi.axis)
+ report_lpath("% 10i : ax : %s",(collected and #collected) or 0,pi.axis)
elseif kind == "nodes" then
collected = apply_nodes(collected,pi.nodetest,pi.nodes)
- logs.report("lpath", "% 10i : ns : %s",(collected and #collected) or 0,nodesettostring(pi.nodes,pi.nodetest))
+ report_lpath("% 10i : ns : %s",(collected and #collected) or 0,nodesettostring(pi.nodes,pi.nodetest))
elseif kind == "expression" then
collected = apply_expression(collected,pi.evaluator,order)
- logs.report("lpath", "% 10i : ex : %s -> %s",(collected and #collected) or 0,pi.expression,pi.converted)
+ report_lpath("% 10i : ex : %s -> %s",(collected and #collected) or 0,pi.expression,pi.converted)
elseif kind == "finalizer" then
collected = pi.finalizer(collected)
- logs.report("lpath", "% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pi.name,pi.arguments or "")
+ report_lpath("% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pi.name,pi.arguments or "")
return collected
end
if not collected or #collected == 0 then
local pn = i < nofparsed and parsed[nofparsed]
if pn and pn.kind == "finalizer" then
collected = pn.finalizer(collected)
- logs.report("lpath", "% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pn.name,pn.arguments or "")
+ report_lpath("% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pn.name,pn.arguments or "")
return collected
end
return nil
@@ -6141,8 +8435,11 @@ local function normal_apply(list,parsed,nofparsed,order)
return collected
end
-local function parse_apply(list,pattern)
- -- we avoid an extra call
+
+local function applylpath(list,pattern)
+ if not list then
+ return
+ end
local parsed = cache[pattern]
if parsed then
lpathcalls = lpathcalls + 1
@@ -6151,7 +8448,7 @@ local function parse_apply(list,pattern)
lpathcalls = lpathcalls + 1
parsed = pattern
else
- parsed = parse_pattern(pattern) or pattern
+ parsed = lpath(pattern) or pattern
end
if not parsed then
return
@@ -6160,25 +8457,32 @@ local function parse_apply(list,pattern)
if nofparsed == 0 then
return -- something is wrong
end
- local one = list[1]
- if not one then
- return -- something is wrong
- elseif not trace_lpath then
- return normal_apply(list,parsed,nofparsed,one.mi)
+ if not trace_lpath then
+ return normal_apply ({ list },parsed,nofparsed,list.mi)
elseif trace_lprofile then
- return profiled_apply(list,parsed,nofparsed,one.mi)
+ return profiled_apply({ list },parsed,nofparsed,list.mi)
else
- return traced_apply(list,parsed,nofparsed,one.mi)
+ return traced_apply ({ list },parsed,nofparsed,list.mi)
end
end
+xml.applylpath = applylpath -- takes a table as first argment, which is what xml.filter will do
+
+--[[ldx--
+<p>This is the main filter function. It returns whatever is asked for.</p>
+--ldx]]--
+
+function xml.filter(root,pattern) -- no longer funny attribute handling here
+ return applylpath(root,pattern)
+end
+
-- internal (parsed)
expressions.child = function(e,pattern)
- return parse_apply({ e },pattern) -- todo: cache
+ return applylpath(e,pattern) -- todo: cache
end
expressions.count = function(e,pattern)
- local collected = parse_apply({ e },pattern) -- todo: cache
+ local collected = applylpath(e,pattern) -- todo: cache
return (collected and #collected) or 0
end
@@ -6188,7 +8492,7 @@ expressions.oneof = function(s,...) -- slow
local t = {...} for i=1,#t do if s == t[i] then return true end end return false
end
expressions.error = function(str)
- xml.error_handler("unknown function in lpath expression",tostring(str or "?"))
+ xml.errorhandler("unknown function in lpath expression",tostring(str or "?"))
return false
end
expressions.undefined = function(s)
@@ -6217,8 +8521,8 @@ expressions.boolean = toboolean
-- user interface
local function traverse(root,pattern,handle)
- logs.report("xml","use 'xml.selection' instead for '%s'",pattern)
- local collected = parse_apply({ root },pattern)
+ report_lpath("use 'xml.selection' instead for '%s'",pattern)
+ local collected = applylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6229,7 +8533,7 @@ local function traverse(root,pattern,handle)
end
local function selection(root,pattern,handle)
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if handle then
for c=1,#collected do
@@ -6241,19 +8545,9 @@ local function selection(root,pattern,handle)
end
end
-xml.parse_parser = parser
-xml.parse_pattern = parse_pattern
-xml.parse_apply = parse_apply
xml.traverse = traverse -- old method, r, d, k
xml.selection = selection -- new method, simple handle
-local lpath = parse_pattern
-
-xml.lpath = lpath
-
-function xml.cached_patterns()
- return cache
-end
-- generic function finalizer (independant namespace)
@@ -6265,13 +8559,13 @@ local function dofunction(collected,fnc)
f(collected[c])
end
else
- logs.report("xml","unknown function '%s'",fnc)
+ report_lpath("unknown function '%s'",fnc)
end
end
end
-xml.finalizers.xml["function"] = dofunction
-xml.finalizers.tex["function"] = dofunction
+finalizers.xml["function"] = dofunction
+finalizers.tex["function"] = dofunction
-- functions
@@ -6364,14 +8658,6 @@ expressions.tag = function(e,n) -- only tg
end
--[[ldx--
-<p>This is the main filter function. It returns whatever is asked for.</p>
---ldx]]--
-
-function xml.filter(root,pattern) -- no longer funny attribute handling here
- return parse_apply({ root },pattern)
-end
-
---[[ldx--
<p>Often using an iterators looks nicer in the code than passing handler
functions. The <l n='lua'/> book describes how to use coroutines for that
purpose (<url href='http://www.lua.org/pil/9.3.html'/>). This permits
@@ -6390,7 +8676,7 @@ end
local wrap, yield = coroutine.wrap, coroutine.yield
function xml.elements(root,pattern,reverse) -- r, d, k
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if reverse then
return wrap(function() for c=#collected,1,-1 do
@@ -6406,7 +8692,7 @@ function xml.elements(root,pattern,reverse) -- r, d, k
end
function xml.collected(root,pattern,reverse) -- e
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if reverse then
return wrap(function() for c=#collected,1,-1 do yield(collected[c]) end end)
@@ -6417,6 +8703,15 @@ function xml.collected(root,pattern,reverse) -- e
return wrap(function() end)
end
+-- handy
+
+function xml.inspect(collection,pattern)
+ pattern = pattern or "."
+ for e in xml.collected(collection,pattern or ".") do
+ report_lpath("pattern %q\n\n%s\n",pattern,xml.tostring(e))
+ end
+end
+
end -- of closure
@@ -6430,10 +8725,16 @@ if not modules then modules = { } end modules ['lxml-mis'] = {
license = "see context related readme files"
}
+local xml, lpeg, string = xml, lpeg, string
+
local concat = table.concat
local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring
local format, gsub, match = string.format, string.gsub, string.match
-local lpegmatch = lpeg.match
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs
+
+lpegpatterns.xml = lpegpatterns.xml or { }
+local xmlpatterns = lpegpatterns.xml
--[[ldx--
<p>The following helper functions best belong to the <t>lxml-ini</t>
@@ -6457,9 +8758,8 @@ local function xmlgsub(t,old,new) -- will be replaced
end
end
---~ xml.gsub = xmlgsub
-function xml.strip_leading_spaces(dk,d,k) -- cosmetic, for manual
+function xml.stripleadingspaces(dk,d,k) -- cosmetic, for manual
if d and k then
local dkm = d[k-1]
if dkm and type(dkm) == "string" then
@@ -6469,14 +8769,7 @@ function xml.strip_leading_spaces(dk,d,k) -- cosmetic, for manual
end
end
---~ xml.escapes = { ['&'] = '&amp;', ['<'] = '&lt;', ['>'] = '&gt;', ['"'] = '&quot;' }
---~ xml.unescapes = { } for k,v in next, xml.escapes do xml.unescapes[v] = k end
---~ function xml.escaped (str) return (gsub(str,"(.)" , xml.escapes )) end
---~ function xml.unescaped(str) return (gsub(str,"(&.-;)", xml.unescapes)) end
---~ function xml.cleansed (str) return (gsub(str,"<.->" , '' )) end -- "%b<>"
-
-local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs
-- 100 * 2500 * "oeps< oeps> oeps&" : gsub:lpeg|lpeg|lpeg
--
@@ -6502,9 +8795,9 @@ local unescaped = Cs(normal * (special * normal)^0)
local cleansed = Cs(((P("<") * (1-P(">"))^0 * P(">"))/"" + 1)^0)
-xml.escaped_pattern = escaped
-xml.unescaped_pattern = unescaped
-xml.cleansed_pattern = cleansed
+xmlpatterns.escaped = escaped
+xmlpatterns.unescaped = unescaped
+xmlpatterns.cleansed = cleansed
function xml.escaped (str) return lpegmatch(escaped,str) end
function xml.unescaped(str) return lpegmatch(unescaped,str) end
@@ -6540,15 +8833,20 @@ if not modules then modules = { } end modules ['lxml-aux'] = {
local trace_manipulations = false trackers.register("lxml.manipulations", function(v) trace_manipulations = v end)
-local xmlparseapply, xmlconvert, xmlcopy, xmlname = xml.parse_apply, xml.convert, xml.copy, xml.name
+local report_xml = logs.reporter("xml")
+
+local xml = xml
+
+local xmlconvert, xmlcopy, xmlname = xml.convert, xml.copy, xml.name
local xmlinheritedconvert = xml.inheritedconvert
+local xmlapplylpath = xml.applylpath
-local type = type
-local insert, remove = table.insert, table.remove
+local type, setmetatable, getmetatable = type, setmetatable, getmetatable
+local insert, remove, fastcopy = table.insert, table.remove, table.fastcopy
local gmatch, gsub = string.gmatch, string.gsub
local function report(what,pattern,c,e)
- logs.report("xml","%s element '%s' (root: '%s', position: %s, index: %s, pattern: %s)",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
+ report_xml("%s element '%s' (root: '%s', position: %s, index: %s, pattern: %s)",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
end
local function withelements(e,handle,depth)
@@ -6602,10 +8900,8 @@ function xml.withelement(e,n,handle) -- slow
end
end
-xml.elements_only = xml.collected
-
-function xml.each_element(root,pattern,handle,reverse)
- local collected = xmlparseapply({ root },pattern)
+function xml.each(root,pattern,handle,reverse)
+ local collected = xmlapplylpath(root,pattern)
if collected then
if reverse then
for c=#collected,1,-1 do
@@ -6620,10 +8916,8 @@ function xml.each_element(root,pattern,handle,reverse)
end
end
-xml.process_elements = xml.each_element
-
-function xml.process_attributes(root,pattern,handle)
- local collected = xmlparseapply({ root },pattern)
+function xml.processattributes(root,pattern,handle)
+ local collected = xmlapplylpath(root,pattern)
if collected and handle then
for c=1,#collected do
handle(collected[c].at)
@@ -6638,12 +8932,12 @@ end
-- are these still needed -> lxml-cmp.lua
-function xml.collect_elements(root, pattern)
- return xmlparseapply({ root },pattern)
+function xml.collect(root, pattern)
+ return xmlapplylpath(root,pattern)
end
-function xml.collect_texts(root, pattern, flatten) -- todo: variant with handle
- local collected = xmlparseapply({ root },pattern)
+function xml.collecttexts(root, pattern, flatten) -- todo: variant with handle
+ local collected = xmlapplylpath(root,pattern)
if collected and flatten then
local xmltostring = xml.tostring
for c=1,#collected do
@@ -6654,18 +8948,19 @@ function xml.collect_texts(root, pattern, flatten) -- todo: variant with handle
end
function xml.collect_tags(root, pattern, nonamespace)
- local collected = xmlparseapply({ root },pattern)
+ local collected = xmlapplylpath(root,pattern)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
local e = collected[c]
local ns, tg = e.ns, e.tg
+ n = n + 1
if nonamespace then
- t[#t+1] = tg
+ t[n] = tg
elseif ns == "" then
- t[#t+1] = tg
+ t[n] = tg
else
- t[#t+1] = ns .. ":" .. tg
+ t[n] = ns .. ":" .. tg
end
end
return t
@@ -6678,7 +8973,7 @@ end
local no_root = { no_root = true }
-function xml.redo_ni(d)
+local function redo_ni(d)
for k=1,#d do
local dk = d[k]
if type(dk) == "table" then
@@ -6701,12 +8996,7 @@ local function xmltoelement(whatever,root)
return whatever -- string
end
if element then
- --~ if element.ri then
- --~ element = element.dt[element.ri].dt
- --~ else
- --~ element = element.dt
- --~ end
- end
+ end
return element
end
@@ -6724,8 +9014,8 @@ local function copiedelement(element,newparent)
end
end
-function xml.delete_element(root,pattern)
- local collected = xmlparseapply({ root },pattern)
+function xml.delete(root,pattern)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6736,15 +9026,15 @@ function xml.delete_element(root,pattern)
end
local d = p.dt
remove(d,e.ni)
- xml.redo_ni(d) -- can be made faster and inlined
+ redo_ni(d) -- can be made faster and inlined
end
end
end
end
-function xml.replace_element(root,pattern,whatever)
+function xml.replace(root,pattern,whatever)
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6755,15 +9045,50 @@ function xml.replace_element(root,pattern,whatever)
end
local d = p.dt
d[e.ni] = copiedelement(element,p)
- xml.redo_ni(d) -- probably not needed
+ redo_ni(d) -- probably not needed
+ end
+ end
+ end
+end
+
+local function wrap(e,wrapper)
+ local t = {
+ rn = e.rn,
+ tg = e.tg,
+ ns = e.ns,
+ at = e.at,
+ dt = e.dt,
+ __p__ = e,
+ }
+ setmetatable(t,getmetatable(e))
+ e.rn = wrapper.rn or e.rn or ""
+ e.tg = wrapper.tg or e.tg or ""
+ e.ns = wrapper.ns or e.ns or ""
+ e.at = fastcopy(wrapper.at)
+ e.dt = { t }
+end
+
+function xml.wrap(root,pattern,whatever)
+ if whatever then
+ local wrapper = xmltoelement(whatever,root)
+ local collected = xmlapplylpath(root,pattern)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ if trace_manipulations then
+ report('wrapping',pattern,c,e)
+ end
+ wrap(e,wrapper)
end
end
+ else
+ wrap(root,xmltoelement(pattern))
end
end
local function inject_element(root,pattern,whatever,prepend)
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6778,15 +9103,17 @@ local function inject_element(root,pattern,whatever,prepend)
else
be, af = edt, cp
end
+ local bn = #be
for i=1,#af do
- be[#be+1] = af[i]
+ bn = bn + 1
+ be[bn] = af[i]
end
if rri then
r.dt[rri].dt = be
else
d[k].dt = be
end
- xml.redo_ni(d)
+ redo_ni(d)
end
end
end
@@ -6794,7 +9121,7 @@ end
local function insert_element(root,pattern,whatever,before) -- todo: element als functie
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6804,24 +9131,23 @@ local function insert_element(root,pattern,whatever,before) -- todo: element als
k = k + 1
end
insert(d,k,copiedelement(element,r))
- xml.redo_ni(d)
+ redo_ni(d)
end
end
end
-xml.insert_element = insert_element
-xml.insert_element_after = insert_element
-xml.insert_element_before = function(r,p,e) insert_element(r,p,e,true) end
-xml.inject_element = inject_element
-xml.inject_element_after = inject_element
-xml.inject_element_before = function(r,p,e) inject_element(r,p,e,true) end
+xml.insert_element = insert_element
+xml.insertafter = insert_element
+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 collected = xmlparseapply({ xmldata },pattern)
+ local collected = xmlapplylpath(xmldata,pattern)
if collected then
for c=1,#collected do
local ek = collected[c]
@@ -6830,7 +9156,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
local ekat = ek.at
local epdt = ek.__p__.dt
if not attribute or attribute == "" then
- name = (type(ekdt) == "table" and ekdt[1]) or ekdt -- ckeck, probably always tab or str
+ 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
@@ -6845,9 +9171,6 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
-- 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)
@@ -6864,136 +9187,88 @@ end
xml.include = include
---~ local function manipulate(xmldata,pattern,manipulator) -- untested and might go away
---~ local collected = xmlparseapply({ xmldata },pattern)
---~ if collected then
---~ local xmltostring = xml.tostring
---~ for c=1,#collected do
---~ local e = collected[c]
---~ local data = manipulator(xmltostring(e))
---~ if data == "" then
---~ epdt[e.ni] = ""
---~ else
---~ local xi = xmlinheritedconvert(data,xmldata)
---~ if not xi then
---~ epdt[e.ni] = ""
---~ else
---~ epdt[e.ni] = xml.body(xi) -- xml.assign(d,k,xi)
---~ end
---~ end
---~ end
---~ end
---~ end
-
---~ xml.manipulate = manipulate
-
-function xml.strip_whitespace(root, pattern, nolines) -- strips all leading and trailing space !
- local collected = xmlparseapply({ root },pattern)
- if collected then
- for i=1,#collected do
- local e = collected[i]
- local edt = e.dt
- if edt then
- local t = { }
- for i=1,#edt do
- local str = edt[i]
- if type(str) == "string" then
- if str == "" then
- -- stripped
- else
- if nolines then
- str = gsub(str,"[ \n\r\t]+"," ")
- end
- if str == "" then
- -- stripped
- else
- t[#t+1] = str
- end
- end
+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 str = edt[e]
+ if type(str) ~= "string" then
+ n = n + 1
+ t[n] = str
+ elseif str ~= "" then
+ -- todo: lpeg for each case
+ if nolines then
+ str = gsub(str,"%s+"," ")
+ end
+ str = gsub(str,"^%s*(.-)%s*$","%1")
+ if str ~= "" then
+ n = n + 1
+ t[n] = 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
+ remove(edt,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
+ 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 str == "" then
+ remove(edt)
else
- --~ str.ni = i
- t[#t+1] = str
+ edt[nedt] = str
end
end
- e.dt = t
end
end
end
+ return e -- convenient
end
-function xml.strip_whitespace(root, pattern, nolines, anywhere) -- strips all leading and trailing spacing
- local collected = xmlparseapply({ root },pattern) -- beware, indices no longer are valid now
+xml.stripelement = stripelement
+
+function xml.strip(root,pattern,nolines,anywhere) -- strips all leading and trailing spacing
+ local collected = xmlapplylpath(root,pattern) -- beware, indices no longer are valid now
if collected then
for i=1,#collected do
- local e = collected[i]
- local edt = e.dt
- if edt then
- if anywhere then
- local t = { }
- for e=1,#edt do
- local str = edt[e]
- if type(str) ~= "string" then
- t[#t+1] = str
- elseif str ~= "" then
- -- todo: lpeg for each case
- if nolines then
- str = gsub(str,"%s+"," ")
- end
- str = gsub(str,"^%s*(.-)%s*$","%1")
- if str ~= "" then
- t[#t+1] = 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
- remove(edt,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
- end
- end
- if #edt > 1 then
- -- strip end
- local str = edt[#edt]
- 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 str == "" then
- remove(edt)
- else
- edt[#edt] = str
- end
- end
- end
- end
- end
+ stripelement(collected[i],nolines,anywhere)
end
end
end
-local function rename_space(root, oldspace, newspace) -- fast variant
+local function renamespace(root, oldspace, newspace) -- fast variant
local ndt = #root.dt
for i=1,ndt or 0 do
local e = root[i]
@@ -7006,16 +9281,16 @@ local function rename_space(root, oldspace, newspace) -- fast variant
end
local edt = e.dt
if edt then
- rename_space(edt, oldspace, newspace)
+ renamespace(edt, oldspace, newspace)
end
end
end
end
-xml.rename_space = rename_space
+xml.renamespace = renamespace
-function xml.remap_tag(root, pattern, newtg)
- local collected = xmlparseapply({ root },pattern)
+function xml.remaptag(root, pattern, newtg)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
collected[c].tg = newtg
@@ -7023,8 +9298,8 @@ function xml.remap_tag(root, pattern, newtg)
end
end
-function xml.remap_namespace(root, pattern, newns)
- local collected = xmlparseapply({ root },pattern)
+function xml.remapnamespace(root, pattern, newns)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
collected[c].ns = newns
@@ -7032,8 +9307,8 @@ function xml.remap_namespace(root, pattern, newns)
end
end
-function xml.check_namespace(root, pattern, newns)
- local collected = xmlparseapply({ root },pattern)
+function xml.checknamespace(root, pattern, newns)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -7044,8 +9319,8 @@ function xml.check_namespace(root, pattern, newns)
end
end
-function xml.remap_name(root, pattern, newtg, newns, newrn)
- local collected = xmlparseapply({ root },pattern)
+function xml.remapname(root, pattern, newtg, newns, newrn)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -7058,18 +9333,34 @@ end
<p>Here are a few synonyms.</p>
--ldx]]--
-xml.each = xml.each_element
-xml.process = xml.process_element
-xml.strip = xml.strip_whitespace
-xml.collect = xml.collect_elements
-xml.all = xml.collect_elements
-
-xml.insert = xml.insert_element_after
-xml.inject = xml.inject_element_after
-xml.after = xml.insert_element_after
-xml.before = xml.insert_element_before
-xml.delete = xml.delete_element
-xml.replace = xml.replace_element
+xml.all = xml.each
+xml.insert = xml.insertafter
+xml.inject = xml.injectafter
+xml.after = xml.insertafter
+xml.before = xml.insertbefore
+xml.process = xml.each
+
+-- obsolete
+
+xml.obsolete = xml.obsolete or { }
+local obsolete = xml.obsolete
+
+xml.strip_whitespace = xml.strip obsolete.strip_whitespace = xml.strip
+xml.collect_elements = xml.collect obsolete.collect_elements = xml.collect
+xml.delete_element = xml.delete obsolete.delete_element = xml.delete
+xml.replace_element = xml.replace obsolete.replace_element = xml.replacet
+xml.each_element = xml.each obsolete.each_element = xml.each
+xml.process_elements = xml.process obsolete.process_elements = xml.process
+xml.insert_element_after = xml.insertafter obsolete.insert_element_after = xml.insertafter
+xml.insert_element_before = xml.insertbefore obsolete.insert_element_before = xml.insertbefore
+xml.inject_element_after = xml.injectafter obsolete.inject_element_after = xml.injectafter
+xml.inject_element_before = xml.injectbefore obsolete.inject_element_before = xml.injectbefore
+xml.process_attributes = xml.processattributes obsolete.process_attributes = xml.processattributes
+xml.collect_texts = xml.collecttexts obsolete.collect_texts = xml.collecttexts
+xml.inject_element = xml.inject obsolete.inject_element = xml.inject
+xml.remap_tag = xml.remaptag obsolete.remap_tag = xml.remaptag
+xml.remap_name = xml.remapname obsolete.remap_name = xml.remapname
+xml.remap_namespace = xml.remapnamespace obsolete.remap_namespace = xml.remapnamespace
end -- of closure
@@ -7084,10 +9375,15 @@ if not modules then modules = { } end modules ['lxml-xml'] = {
license = "see context related readme files"
}
+local concat = string.concat
+
+local xml = xml
+
local finalizers = xml.finalizers.xml
local xmlfilter = xml.filter -- we could inline this one for speed
local xmltostring = xml.tostring
local xmlserialize = xml.serialize
+local xmlcollected = xml.collected
local function first(collected) -- wrong ?
return collected and collected[1]
@@ -7101,15 +9397,8 @@ local function all(collected)
return collected
end
-local function reverse(collected)
- if collected then
- local reversed = { }
- for c=#collected,1,-1 do
- reversed[#reversed+1] = collected[c]
- end
- return reversed
- end
-end
+
+local reverse = table.reversed
local function attribute(collected,name)
if collected and #collected > 0 then
@@ -7200,11 +9489,12 @@ end
local function texts(collected)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
- local e = collection[c]
+ local e = collected[c]
if e and e.dt then
- t[#t+1] = e.dt
+ n = n + 1
+ t[n] = e.dt
end
end
return t
@@ -7247,14 +9537,15 @@ end
local function tags(collected,nonamespace)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
local e = collected[c]
local ns, tg = e.ns, e.tg
+ n = n + 1
if nonamespace or ns == "" then
- t[#t+1] = tg
+ t[n] = tg
else
- t[#t+1] = ns .. ":" .. tg
+ t[n] = ns .. ":" .. tg
end
end
return t
@@ -7365,293 +9656,273 @@ xml.all = xml.filter
xml.index = xml.position
xml.found = xml.filter
+-- a nice one:
+
+local function totable(x)
+ local t = { }
+ for e in xmlcollected(x[1] or x,"/*") do
+ t[e.tg] = xmltostring(e.dt) or ""
+ end
+ return next(t) and t or nil
+end
+
+xml.table = totable
+finalizers.table = totable
+
+local function textonly(e,t)
+ if e then
+ local edt = e.dt
+ if edt then
+ for i=1,#edt do
+ local e = edt[i]
+ if type(e) == "table" then
+ textonly(e,t)
+ else
+ t[#t+1] = e
+ end
+ end
+ end
+ end
+ return t
+end
+
+function xml.textonly(e) -- no pattern
+ return concat(textonly(e,{}))
+end
+
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['luat-env'] = {
+if not modules then modules = { } end modules ['data-ini'] = {
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"
+ license = "see context related readme files",
}
--- A former version provided functionality for non embeded core
--- scripts i.e. runtime library loading. Given the amount of
--- Lua code we use now, this no longer makes sense. Much of this
--- evolved before bytecode arrays were available and so a lot of
--- code has disappeared already.
+local gsub, find, gmatch = string.gsub, string.find, string.gmatch
+local concat = table.concat
+local next, type = next, type
-local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local filedirname, filebasename, fileextname, filejoin = file.dirname, file.basename, file.extname, file.join
-local format, sub, match, gsub, find = string.format, string.sub, string.match, string.gsub, string.find
-local unquote, quote = string.unquote, string.quote
+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)
--- precautions
+local report_initialization = logs.reporter("resolvers","initialization")
-os.setlocale(nil,nil) -- useless feature and even dangerous in luatex
+local ostype, osname, ossetenv, osgetenv = os.type, os.name, os.setenv, os.getenv
-function os.setlocale()
- -- no way you can mess with it
-end
+-- 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.
--- dirty tricks
+resolvers = resolvers or { }
+local resolvers = resolvers
-if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
- arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil
-end
+-- We don't want the kpse library to kick in. Also, we want to be able to
+-- execute programs. Control over execution is implemented later.
-if profiler and os.env["MTX_PROFILE_RUN"] == "YES" then
- profiler.start("luatex-profile.log")
-end
+texconfig.kpse_init = false
+texconfig.shell_escape = 't'
--- environment
+kpse = { original = kpse }
-environment = environment or { }
-environment.arguments = { }
-environment.files = { }
-environment.sortedflags = nil
+setmetatable(kpse, {
+ __index = function(kp,name)
+ report_initialization("fatal error: kpse library is accessed (key: %s)",name)
+ os.exit()
+ end
+} )
-if not environment.jobname or environment.jobname == "" then if tex then environment.jobname = tex.jobname end end
-if not environment.version or environment.version == "" then environment.version = "unknown" end
-if not environment.jobname then environment.jobname = "unknown" end
+-- First we check a couple of environment variables. Some might be
+-- set already but we need then later on. We start with the system
+-- font path.
-function environment.initialize_arguments(arg)
- local arguments, files = { }, { }
- environment.arguments, environment.files, environment.sortedflags = arguments, files, nil
- for index=1,#arg do
- local argument = arg[index]
- if index > 0 then
- local flag, value = match(argument,"^%-+(.-)=(.-)$")
- if flag then
- arguments[flag] = unquote(value or "")
- else
- flag = match(argument,"^%-+(.+)")
- if flag then
- arguments[flag] = true
- else
- files[#files+1] = argument
- end
- end
- end
+do
+
+ local osfontdir = osgetenv("OSFONTDIR")
+
+ if osfontdir and osfontdir ~= "" then
+ -- ok
+ elseif osname == "windows" then
+ ossetenv("OSFONTDIR","c:/windows/fonts//")
+ elseif osname == "macosx" then
+ ossetenv("OSFONTDIR","$HOME/Library/Fonts//;/Library/Fonts//;/System/Library/Fonts//")
end
- environment.ownname = environment.ownname or arg[0] or 'unknown.lua'
+
end
-function environment.setargument(name,value)
- environment.arguments[name] = value
+-- Next comes the user's home path. We need this as later on we have
+-- to replace ~ with its value.
+
+do
+
+ local homedir = osgetenv(ostype == "windows" and 'USERPROFILE' or 'HOME') or ''
+
+ if not homedir or homedir == "" then
+ homedir = string.char(127) -- we need a value, later we wil trigger on it
+ end
+
+ homedir = file.collapsepath(homedir)
+
+ ossetenv("HOME", homedir) -- can be used in unix cnf files
+ ossetenv("USERPROFILE",homedir) -- can be used in windows cnf files
+
+ environment.homedir = homedir
+
end
--- todo: defaults, better checks e.g on type (boolean versus string)
---
--- tricky: too many hits when we support partials unless we add
--- a registration of arguments so from now on we have 'partial'
+-- The following code sets the name of the own binary and its
+-- path. This is fallback code as we have os.selfdir now.
-function environment.argument(name,partial)
- local arguments, sortedflags = environment.arguments, environment.sortedflags
- if arguments[name] then
- return arguments[name]
- elseif partial then
- if not sortedflags then
- sortedflags = table.sortedkeys(arguments)
- for k=1,#sortedflags do
- sortedflags[k] = "^" .. sortedflags[k]
- end
- environment.sortedflags = sortedflags
+do
+
+ local args = environment.originalarguments or arg -- this needs a cleanup
+
+ local ownbin = environment.ownbin or args[-2] or arg[-2] or args[-1] or arg[-1] or arg[0] or "luatex"
+ local ownpath = environment.ownpath or os.selfdir
+
+ ownbin = file.collapsepath(ownbin)
+ ownpath = file.collapsepath(ownpath)
+
+ if not ownpath or ownpath == "" or ownpath == "unset" then
+ ownpath = args[-1] or arg[-1]
+ ownpath = ownpath and filedirname(gsub(ownpath,"\\","/"))
+ if not ownpath or ownpath == "" then
+ ownpath = args[-0] or arg[-0]
+ ownpath = ownpath and filedirname(gsub(ownpath,"\\","/"))
end
- -- example of potential clash: ^mode ^modefile
- for k=1,#sortedflags do
- local v = sortedflags[k]
- if find(name,v) then
- return arguments[sub(v,2,#v)]
+ local binary = ownbin
+ if not ownpath or ownpath == "" then
+ ownpath = ownpath and filedirname(binary)
+ end
+ if not ownpath or ownpath == "" then
+ if os.binsuffix ~= "" then
+ binary = file.replacesuffix(binary,os.binsuffix)
+ end
+ local path = osgetenv("PATH")
+ if path then
+ for p in gmatch(path,"[^"..io.pathseparator.."]+") do
+ local b = filejoin(p,binary)
+ if lfs.isfile(b) then
+ -- we assume that after changing to the path the currentdir function
+ -- resolves to the real location and use this side effect here; this
+ -- trick is needed because on the mac installations use symlinks in the
+ -- path instead of real locations
+ local olddir = lfs.currentdir()
+ if lfs.chdir(p) then
+ local pp = lfs.currentdir()
+ if trace_locating and p ~= pp then
+ report_initialization("following symlink '%s' to '%s'",p,pp)
+ end
+ ownpath = pp
+ lfs.chdir(olddir)
+ else
+ if trace_locating then
+ report_initialization("unable to check path '%s'",p)
+ end
+ ownpath = p
+ end
+ break
+ end
+ end
end
end
+ if not ownpath or ownpath == "" then
+ ownpath = "."
+ report_initialization("forcing fallback ownpath .")
+ elseif trace_locating then
+ report_initialization("using ownpath '%s'",ownpath)
+ end
end
- return nil
+
+ environment.ownbin = ownbin
+ environment.ownpath = ownpath
+
end
-environment.argument("x",true)
+resolvers.ownpath = environment.ownpath
-function environment.split_arguments(separator) -- rather special, cut-off before separator
- local done, before, after = false, { }, { }
- local original_arguments = environment.original_arguments
- for k=1,#original_arguments do
- local v = original_arguments[k]
- if not done and v == separator then
- done = true
- elseif done then
- after[#after+1] = v
- else
- before[#before+1] = v
- end
- end
- return before, after
+function resolvers.getownpath()
+ return environment.ownpath
end
-function environment.reconstruct_commandline(arg,noquote)
- arg = arg or environment.original_arguments
- if noquote and #arg == 1 then
- local a = arg[1]
- a = resolvers.resolve(a)
- a = unquote(a)
- return a
- elseif #arg > 0 then
- local result = { }
- for i=1,#arg do
- local a = arg[i]
- a = resolvers.resolve(a)
- a = unquote(a)
- a = gsub(a,'"','\\"') -- tricky
- if find(a," ") then
- result[#result+1] = quote(a)
- else
- result[#result+1] = a
- end
- end
- return table.join(result," ")
+-- The self variables permit us to use only a few (or even no)
+-- environment variables.
+
+do
+
+ local ownpath = environment.ownpath or dir.current()
+
+ if ownpath then
+ ossetenv('SELFAUTOLOC', file.collapsepath(ownpath))
+ ossetenv('SELFAUTODIR', file.collapsepath(ownpath .. "/.."))
+ ossetenv('SELFAUTOPARENT', file.collapsepath(ownpath .. "/../.."))
else
- return ""
+ report_initialization("error: unable to locate ownpath")
+ os.exit()
end
+
end
-if arg then
+-- The running os:
- -- new, reconstruct quoted snippets (maybe better just remove the " then and add them later)
- local newarg, instring = { }, false
+-- todo: check is context sits here os.platform is more trustworthy
+-- that the bin check as mtx-update runs from another path
- for index=1,#arg do
- local argument = arg[index]
- if find(argument,"^\"") then
- newarg[#newarg+1] = gsub(argument,"^\"","")
- if not find(argument,"\"$") then
- instring = true
- end
- elseif find(argument,"\"$") then
- newarg[#newarg] = newarg[#newarg] .. " " .. gsub(argument,"\"$","")
- instring = false
- elseif instring then
- newarg[#newarg] = newarg[#newarg] .. " " .. argument
- else
- newarg[#newarg+1] = argument
- end
- end
- for i=1,-5,-1 do
- newarg[i] = arg[i]
- end
+local texos = environment.texos or osgetenv("TEXOS")
+local texmfos = environment.texmfos or osgetenv('SELFAUTODIR')
- environment.initialize_arguments(newarg)
- environment.original_arguments = newarg
- environment.raw_arguments = arg
+if not texos or texos == "" then
+ texos = file.basename(texmfos)
+end
- arg = { } -- prevent duplicate handling
+ossetenv('TEXMFOS', texmfos) -- full bin path
+ossetenv('TEXOS', texos) -- partial bin parent
+ossetenv('SELFAUTOSYSTEM',os.platform) -- bonus
-end
+environment.texos = texos
+environment.texmfos = texmfos
--- weird place ... depends on a not yet loaded module
+-- The current root:
-function environment.texfile(filename)
- return resolvers.find_file(filename,'tex')
-end
+local texroot = environment.texroot or osgetenv("TEXROOT")
-function environment.luafile(filename)
- local resolved = resolvers.find_file(filename,'tex') or ""
- if resolved ~= "" then
- return resolved
- end
- resolved = resolvers.find_file(filename,'texmfscripts') or ""
- if resolved ~= "" then
- return resolved
- end
- return resolvers.find_file(filename,'luatexlibs') or ""
+if not texroot or texroot == "" then
+ texroot = osgetenv('SELFAUTOPARENT')
+ ossetenv('TEXROOT',texroot)
end
-environment.loadedluacode = loadfile -- can be overloaded
+environment.texroot = file.collapsepath(texroot)
---~ function environment.loadedluacode(name)
---~ if os.spawn("texluac -s -o texluac.luc " .. name) == 0 then
---~ local chunk = loadstring(io.loaddata("texluac.luc"))
---~ os.remove("texluac.luc")
---~ return chunk
---~ else
---~ environment.loadedluacode = loadfile -- can be overloaded
---~ return loadfile(name)
---~ end
---~ end
-
-function environment.luafilechunk(filename) -- used for loading lua bytecode in the format
- filename = file.replacesuffix(filename, "lua")
- local fullname = environment.luafile(filename)
- if fullname and fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading file %s", fullname)
- end
- return environment.loadedluacode(fullname)
- else
- if trace_locating then
- logs.report("fileio","unknown file %s", filename)
- end
- return nil
+-- Tracing. Todo ...
+
+function resolvers.settrace(n) -- no longer number but: 'locating' or 'detail'
+ if n then
+ trackers.disable("resolvers.*")
+ trackers.enable("resolvers."..n)
end
end
--- the next ones can use the previous ones / combine
+resolvers.settrace(osgetenv("MTX_INPUT_TRACE"))
-function environment.loadluafile(filename, version)
- local lucname, luaname, chunk
- local basename = file.removesuffix(filename)
- if basename == filename then
- lucname, luaname = basename .. ".luc", basename .. ".lua"
- else
- lucname, luaname = nil, basename -- forced suffix
- end
- -- when not overloaded by explicit suffix we look for a luc file first
- local fullname = (lucname and environment.luafile(lucname)) or ""
- if fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading %s", fullname)
- end
- chunk = loadfile(fullname) -- this way we don't need a file exists check
- end
- if chunk then
- assert(chunk)()
- if version then
- -- we check of the version number of this chunk matches
- local v = version -- can be nil
- if modules and modules[filename] then
- v = modules[filename].version -- new method
- elseif versions and versions[filename] then
- v = versions[filename] -- old method
- end
- if v == version then
- return true
- else
- if trace_locating then
- logs.report("fileio","version mismatch for %s: lua=%s, luc=%s", filename, v, version)
- end
- environment.loadluafile(filename)
- end
- else
- return true
- end
- end
- fullname = (luaname and environment.luafile(luaname)) or ""
- if fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading %s", fullname)
- end
- chunk = loadfile(fullname) -- this way we don't need a file exists check
- if not chunk then
- if trace_locating then
- logs.report("fileio","unknown file %s", filename)
- end
- else
- assert(chunk)()
- return true
- end
- end
- return false
+-- todo:
+
+-- if profiler and osgetenv("MTX_PROFILE_RUN") == "YES" then
+-- profiler.start("luatex-profile.log")
+-- 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
end
@@ -7659,536 +9930,1152 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['trac-inf'] = {
+if not modules then modules = { } end modules ['data-exp'] = {
version = 1.001,
- comment = "companion to trac-inf.mkiv",
+ 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"
+ license = "see context related readme files",
}
-local format = string.format
+local format, find, gmatch, lower = string.format, string.find, string.gmatch, string.lower
+local concat, sort = table.concat, table.sort
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local Ct, Cs, Cc, P, C, S = lpeg.Ct, lpeg.Cs, lpeg.Cc, lpeg.P, lpeg.C, lpeg.S
+local type, next = type, next
-local statusinfo, n, registered = { }, 0, { }
+local ostype = os.type
+local collapsepath = file.collapsepath
-statistics = statistics or { }
+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)
-statistics.enable = true
-statistics.threshold = 0.05
+local report_expansions = logs.reporter("resolvers","expansions")
--- timing functions
+local resolvers = resolvers
-local clock = os.gettimeofday or os.clock
+-- 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
+-- past this every time. See data-obs.lua for the gsub variant.
-local notimer
+-- {a,b,c,d}
+-- a,b,c/{p,q,r},d
+-- a,b,c/{p,q,r}/d/{x,y,z}//
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a{b,c}{d,e}f
+-- {a,b,c,d}
+-- {a,b,c/{p,q,r},d}
+-- {a,b,c/{p,q,r}/d/{x,y,z}//}
+-- {a,b,c/{p,q/{x,y,z}},d/{p,q,r}}
+-- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}}
+-- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}
-function statistics.hastimer(instance)
- return instance and instance.starttime
+local function f_first(a,b)
+ local t, n = { }, 0
+ for s in gmatch(b,"[^,]+") do
+ n = n + 1 ; t[n] = a .. s
+ end
+ return concat(t,",")
end
-function statistics.resettiming(instance)
- if not instance then
- notimer = { timing = 0, loadtime = 0 }
- else
- instance.timing, instance.loadtime = 0, 0
+local function f_second(a,b)
+ local t, n = { }, 0
+ for s in gmatch(a,"[^,]+") do
+ n = n + 1 ; t[n] = s .. b
end
+ return concat(t,",")
end
-function statistics.starttiming(instance)
- if not instance then
- notimer = { }
- instance = notimer
- end
- local it = instance.timing
- if not it then
- it = 0
- end
- if it == 0 then
- instance.starttime = clock()
- if not instance.loadtime then
- instance.loadtime = 0
+local function f_both(a,b)
+ local t, n = { }, 0
+ for sa in gmatch(a,"[^,]+") do
+ for sb in gmatch(b,"[^,]+") do
+ n = n + 1 ; t[n] = sa .. sb
end
- else
---~ logs.report("system","nested timing (%s)",tostring(instance))
end
- instance.timing = it + 1
+ return concat(t,",")
end
-function statistics.stoptiming(instance, report)
- if not instance then
- instance = notimer
- end
- if instance then
- local it = instance.timing
- if it > 1 then
- instance.timing = it - 1
- else
- local starttime = instance.starttime
- if starttime then
- local stoptime = clock()
- local loadtime = stoptime - starttime
- instance.stoptime = stoptime
- instance.loadtime = instance.loadtime + loadtime
- if report then
- statistics.report("load time %0.3f",loadtime)
- end
- instance.timing = 0
- return loadtime
+local left = P("{")
+local right = P("}")
+local var = P((1 - S("{}" ))^0)
+local set = P((1 - S("{},"))^0)
+local other = P(1)
+
+local l_first = Cs( ( Cc("{") * (C(set) * left * C(var) * right / f_first) * Cc("}") + other )^0 )
+local l_second = Cs( ( Cc("{") * (left * C(var) * right * C(set) / f_second) * Cc("}") + other )^0 )
+local l_both = Cs( ( Cc("{") * (left * C(var) * right * left * C(var) * right / f_both) * Cc("}") + other )^0 )
+local l_rest = Cs( ( left * var * (left/"") * var * (right/"") * var * right + other )^0 )
+
+local stripper_1 = lpeg.stripper ("{}@")
+local replacer_1 = lpeg.replacer { { ",}", ",@}" }, { "{,", "{@," }, }
+
+local function splitpathexpr(str, newlist, validate) -- I couldn't resist lpegging it (nice exercise).
+ if trace_expansions then
+ report_expansions("expanding variable '%s'",str)
+ end
+ local t, ok, done = newlist or { }, false, false
+ local n = #t
+ str = lpegmatch(replacer_1,str)
+ repeat local old = str
+ repeat local old = str ; str = lpegmatch(l_first, str) until old == str
+ repeat local old = str ; str = lpegmatch(l_second,str) until old == str
+ repeat local old = str ; str = lpegmatch(l_both, str) until old == str
+ repeat local old = str ; str = lpegmatch(l_rest, str) until old == str
+ until old == str -- or not find(str,"{")
+ str = lpegmatch(stripper_1,str)
+ if validate then
+ for s in gmatch(str,"[^,]+") do
+ s = validate(s)
+ if s then
+ n = n + 1 ; t[n] = s
end
end
+ else
+ for s in gmatch(str,"[^,]+") do
+ n = n + 1 ; t[n] = s
+ end
end
- return 0
+ if trace_expansions then
+ for k=1,#t do
+ report_expansions("% 4i: %s",k,t[k])
+ end
+ end
+ return t
end
-function statistics.elapsedtime(instance)
- if not instance then
- instance = notimer
- end
- return format("%0.3f",(instance and instance.loadtime) or 0)
+-- We could make the previous one public.
+
+local function validate(s)
+ s = collapsepath(s) -- already keeps the //
+ return s ~= "" and not find(s,"^!*unset/*$") and s
end
-function statistics.elapsedindeed(instance)
- if not instance then
- instance = notimer
+resolvers.validatedpath = validate -- keeps the trailing //
+
+function resolvers.expandedpathfromlist(pathlist)
+ local newlist = { }
+ for k=1,#pathlist do
+ splitpathexpr(pathlist[k],newlist,validate)
end
- local t = (instance and instance.loadtime) or 0
- return t > statistics.threshold
+ return newlist
end
-function statistics.elapsedseconds(instance,rest) -- returns nil if 0 seconds
- if statistics.elapsedindeed(instance) then
- return format("%s seconds %s", statistics.elapsedtime(instance),rest or "")
+local cleanup = lpeg.replacer {
+ { "!" , "" },
+ { "\\" , "/" },
+}
+
+local homedir
+
+function resolvers.cleanpath(str)
+ if not homedir then
+ homedir = lpegmatch(cleanup,environment.homedir or "")
+ if homedir == string.char(127) 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 find(str,"~") then
+ return "" -- special case
+ else
+ return str and lpegmatch(cleanup,str)
+ end
+ end
+ else
+ cleanup = lpeg.replacer {
+ { "!" , "" },
+ { "\\" , "/" },
+ { "~" , homedir },
+ }
+ function resolvers.cleanpath(str)
+ return str and lpegmatch(cleanup,str)
+ end
+ end
end
+ return resolvers.cleanpath(str)
end
--- general function
+-- This one strips quotes and funny tokens.
-function statistics.register(tag,fnc)
- if statistics.enable and type(fnc) == "function" then
- local rt = registered[tag] or (#statusinfo + 1)
- statusinfo[rt] = { tag, fnc }
- registered[tag] = rt
- if #tag > n then n = #tag end
- end
+local expandhome = P("~") / "$HOME" -- environment.homedir
+
+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
+)
+
+function resolvers.checkedvariable(str) -- assumes str is a string
+ return lpegmatch(stripper,str) or str
end
-function statistics.show(reporter)
- if statistics.enable then
- if not reporter then reporter = function(tag,data,n) texio.write_nl(tag .. " " .. data) end end
- -- this code will move
- local register = statistics.register
- register("luatex banner", function()
- return string.lower(status.banner)
- end)
- register("control sequences", function()
- return format("%s of %s", status.cs_count, status.hash_size+status.hash_extra)
- end)
- register("callbacks", function()
- local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0
- return format("direct: %s, indirect: %s, total: %s", total-indirect, indirect, total)
- end)
- register("current memory usage", statistics.memused)
- register("runtime",statistics.runtime)
--- --
- for i=1,#statusinfo do
- local s = statusinfo[i]
- local r = s[2]()
- if r then
- reporter(s[1],r,n)
+-- The path splitter:
+
+-- A config (optionally) has the paths split in tables. Internally
+-- we join them and split them after the expansion has taken place. This
+-- is more convenient.
+
+local cache = { }
+
+---- splitter = Ct(lpeg.splitat(S(ostype == "windows" and ";" or ":;"))) -- maybe add ,
+local splitter = Ct(lpeg.splitat(";")) -- as we move towards urls, prefixes and use tables we no longer do :
+
+local backslashswapper = lpeg.replacer("\\","/")
+
+local function splitconfigurationpath(str) -- beware, this can be either a path or a { specification }
+ if str then
+ local found = cache[str]
+ if not found then
+ if str == "" then
+ found = { }
+ else
+ local split = lpegmatch(splitter,lpegmatch(backslashswapper,str)) -- can be combined
+ found = { }
+ local noffound = 0
+ for i=1,#split do
+ local s = split[i]
+ if not find(s,"^{*unset}*") then
+ noffound = noffound + 1
+ found[noffound] = s
+ end
+ end
+ if trace_expansions then
+ report_expansions("splitting path specification '%s'",str)
+ for k=1,noffound do
+ report_expansions("% 4i: %s",k,found[k])
+ end
+ end
+ cache[str] = found
end
end
- texio.write_nl("") -- final newline
- statistics.enable = false
+ return found
end
end
-function statistics.show_job_stat(tag,data,n)
- texio.write_nl(format("%-15s: %s - %s","mkiv lua stats",tag:rpadd(n," "),data))
-end
+resolvers.splitconfigurationpath = splitconfigurationpath
-function statistics.memused() -- no math.round yet -)
- local round = math.round or math.floor
- return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000))
+function resolvers.splitpath(str)
+ if type(str) == 'table' then
+ return str
+ else
+ return splitconfigurationpath(str)
+ end
end
-if statistics.runtime then
- -- already loaded and set
-elseif luatex and luatex.starttime then
- statistics.starttime = luatex.starttime
- statistics.loadtime = 0
- statistics.timing = 0
-else
- statistics.starttiming(statistics)
+function resolvers.joinpath(str)
+ if type(str) == 'table' then
+ return file.joinpath(str)
+ else
+ return str
+ end
end
-function statistics.runtime()
- statistics.stoptiming(statistics)
- return statistics.formatruntime(statistics.elapsedtime(statistics))
-end
+-- The next function scans directories and returns a hash where the
+-- entries are either strings or tables.
-function statistics.formatruntime(runtime)
- return format("%s seconds", statistics.elapsedtime(statistics))
-end
+-- starting with . or .. etc or funny char
-function statistics.timed(action,report)
- local timer = { }
- report = report or logs.simple
- statistics.starttiming(timer)
- action()
- statistics.stoptiming(timer)
- report("total runtime: %s",statistics.elapsedtime(timer))
-end
--- where, not really the best spot for this:
-commands = commands or { }
-local timer
+local weird = P(".")^1 + lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
-function commands.resettimer()
- statistics.resettiming(timer)
- statistics.starttiming(timer)
+local attributes, directory = lfs.attributes, lfs.dir
+
+local function scan(files,spec,path,n,m,r)
+ local full = (path == "" and spec) or (spec .. path .. '/')
+ local dirs, nofdirs = { }, 0
+ for name in directory(full) do
+ if not lpegmatch(weird,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 }
+ else
+ f[#f+1] = path
+ end
+ else -- probably unique anyway
+ files[name] = path
+ local lower = lower(name)
+ if name ~= lower then
+ files["remap:"..lower] = name
+ r = r + 1
+ end
+ end
+ elseif mode == 'directory' then
+ m = m + 1
+ 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, n, m, r = scan(files,spec,dirs[i],n,m,r)
+ end
+ end
+ return files, n, m, r
end
-function commands.elapsedtime()
- statistics.stoptiming(timer)
- tex.sprint(statistics.elapsedtime(timer))
+function resolvers.scanfiles(path,branch)
+ if trace_locating then
+ report_expansions("scanning path '%s', branch '%s'",path, branch or path)
+ end
+ local realpath = resolvers.resolve(path) -- no shortcut
+ 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)
+ end
+ return files
end
-commands.resettimer()
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['trac-log'] = {
+if not modules then modules = { } end modules ['data-env'] = {
version = 1.001,
- comment = "companion to trac-log.mkiv",
+ 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"
+ license = "see context related readme files",
}
--- this is old code that needs an overhaul
+local lower, gsub = string.lower, string.gsub
---~ io.stdout:setvbuf("no")
---~ io.stderr:setvbuf("no")
+local resolvers = resolvers
-local write_nl, write = texio.write_nl or print, texio.write or io.write
-local format, gmatch = string.format, string.gmatch
-local texcount = tex and tex.count
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+local fileextname = file.extname
+
+local formats = allocate()
+local suffixes = allocate()
+local dangerous = allocate()
+local suffixmap = allocate()
+
+resolvers.formats = formats
+resolvers.suffixes = suffixes
+resolvers.dangerous = dangerous
+resolvers.suffixmap = suffixmap
+
+local relations = allocate { -- todo: handlers also here
+ core = {
+ ofm = { -- will become obsolete
+ names = { "ofm", "omega font metric", "omega font metrics" },
+ variable = 'OFMFONTS',
+ suffixes = { 'ofm', 'tfm' },
+ },
+ ovf = { -- will become obsolete
+ names = { "ovf", "omega virtual font", "omega virtual fonts" },
+ variable = 'OVFFONTS',
+ suffixes = { 'ovf', 'vf' },
+ },
+ tfm = {
+ names = { "tfm", "tex font metric", "tex font metrics" },
+ variable = 'TFMFONTS',
+ suffixes = { 'tfm' },
+ },
+ vf = {
+ names = { "vf", "virtual font", "virtual fonts" },
+ variable = 'VFFONTS',
+ suffixes = { 'vf' },
+ },
+ otf = {
+ names = { "otf", "opentype", "opentype font", "opentype fonts"},
+ variable = 'OPENTYPEFONTS',
+ suffixes = { 'otf' },
+ },
+ ttf = {
+ names = { "ttf", "truetype", "truetype font", "truetype fonts", "truetype collection", "truetype collections", "truetype dictionary", "truetype dictionaries" },
+ variable = 'TTFONTS',
+ suffixes = { 'ttf', 'ttc', 'dfont' },
+ },
+ afm = {
+ names = { "afm", "adobe font metric", "adobe font metrics" },
+ variable = "AFMFONTS",
+ suffixes = { "afm" },
+ },
+ pfb = {
+ names = { "pfb", "type1", "type 1", "type1 font", "type 1 font", "type1 fonts", "type 1 fonts" },
+ variable = 'T1FONTS',
+ suffixes = { 'pfb', 'pfa' },
+ },
+ fea = {
+ names = { "fea", "font feature", "font features", "font feature file", "font feature files" },
+ variable = 'FONTFEATURES',
+ suffixes = { 'fea' },
+ },
+ cid = {
+ names = { "cid", "cid map", "cid maps", "cid file", "cid files" },
+ variable = 'FONTCIDMAPS',
+ suffixes = { 'cid', 'cidmap' },
+ },
+ fmt = {
+ names = { "fmt", "format", "tex format" },
+ variable = 'TEXFORMATS',
+ suffixes = { 'fmt' },
+ },
+ mem = { -- will become obsolete
+ names = { 'mem', "metapost format" },
+ variable = 'MPMEMS',
+ suffixes = { 'mem' },
+ },
+ mp = {
+ names = { "mp" },
+ variable = 'MPINPUTS',
+ suffixes = { 'mp' },
+ },
+ tex = {
+ names = { "tex" },
+ variable = 'TEXINPUTS',
+ suffixes = { 'tex', "mkiv", "mkiv", "mkii" },
+ },
+ icc = {
+ names = { "icc", "icc profile", "icc profiles" },
+ variable = 'ICCPROFILES',
+ suffixes = { 'icc' },
+ },
+ texmfscripts = {
+ names = { "texmfscript", "texmfscripts", "script", "scripts" },
+ variable = 'TEXMFSCRIPTS',
+ suffixes = { 'rb', 'pl', 'py' },
+ },
+ lua = {
+ names = { "lua" },
+ variable = 'LUAINPUTS',
+ suffixes = { 'lua', 'luc', 'tma', 'tmc' },
+ },
+ lib = {
+ names = { "lib" },
+ variable = 'CLUAINPUTS',
+ suffixes = os.libsuffix and { os.libsuffix } or { 'dll', 'so' },
+ },
+ bib = {
+ names = { 'bib' },
+ suffixes = { 'bib' },
+ },
+ bst = {
+ names = { 'bst' },
+ suffixes = { 'bst' },
+ },
+ fontconfig = {
+ names = { 'fontconfig', 'fontconfig file', 'fontconfig files' },
+ variable = 'FONTCONFIG_PATH',
+ },
+ },
+ obsolete = {
+ enc = {
+ names = { "enc", "enc files", "enc file", "encoding files", "encoding file" },
+ variable = 'ENCFONTS',
+ suffixes = { 'enc' },
+ },
+ map = {
+ names = { "map", "map files", "map file" },
+ variable = 'TEXFONTMAPS',
+ suffixes = { 'map' },
+ },
+ lig = {
+ names = { "lig files", "lig file", "ligature file", "ligature files" },
+ variable = 'LIGFONTS',
+ suffixes = { 'lig' },
+ },
+ opl = {
+ names = { "opl" },
+ variable = 'OPLFONTS',
+ suffixes = { 'opl' },
+ },
+ ovp = {
+ names = { "ovp" },
+ variable = 'OVPFONTS',
+ suffixes = { 'ovp' },
+ },
+ },
+ kpse = { -- subset
+ base = {
+ names = { 'base', "metafont format" },
+ variable = 'MFBASES',
+ suffixes = { 'base', 'bas' },
+ },
+ cmap = {
+ names = { 'cmap', 'cmap files', 'cmap file' },
+ variable = 'CMAPFONTS',
+ suffixes = { 'cmap' },
+ },
+ cnf = {
+ names = { 'cnf' },
+ suffixes = { 'cnf' },
+ },
+ web = {
+ names = { 'web' },
+ suffixes = { 'web', 'ch' }
+ },
+ cweb = {
+ names = { 'cweb' },
+ suffixes = { 'w', 'web', 'ch' },
+ },
+ gf = {
+ names = { 'gf' },
+ suffixes = { '<resolution>gf' },
+ },
+ mf = {
+ names = { 'mf' },
+ variable = 'MFINPUTS',
+ suffixes = { 'mf' },
+ },
+ mft = {
+ names = { 'mft' },
+ suffixes = { 'mft' },
+ },
+ pk = {
+ names = { 'pk' },
+ suffixes = { '<resolution>pk' },
+ },
+ },
+}
-if texlua then
- write_nl = print
- write = io.write
+resolvers.relations = relations
+
+-- formats: maps a format onto a variable
+
+function resolvers.updaterelations()
+ for category, categories in next, relations do
+ for name, relation in next, categories do
+ local rn = relation.names
+ local rv = relation.variable
+ local rs = relation.suffixes
+ if rn and rv then
+ for i=1,#rn do
+ local rni = lower(gsub(rn[i]," ",""))
+ formats[rni] = rv
+ if rs then
+ suffixes[rni] = rs
+ for i=1,#rs do
+ local rsi = rs[i]
+ suffixmap[rsi] = rni
+ end
+ end
+ end
+ end
+ if rs then
+ end
+ end
+ end
end
---[[ldx--
-<p>This is a prelude to a more extensive logging module. For the sake
-of parsing log files, in addition to the standard logging we will
-provide an <l n='xml'/> structured file. Actually, any logging that
-is hooked into callbacks will be \XML\ by default.</p>
---ldx]]--
+resolvers.updaterelations() -- push this in the metatable -> newindex
+
+local function simplified(t,k)
+ return rawget(t,lower(gsub(k," ","")))
+end
-logs = logs or { }
-logs.xml = logs.xml or { }
-logs.tex = logs.tex or { }
+setmetatableindex(formats, simplified)
+setmetatableindex(suffixes, simplified)
+setmetatableindex(suffixmap, simplified)
---[[ldx--
-<p>This looks pretty ugly but we need to speed things up a bit.</p>
---ldx]]--
+-- A few accessors, mostly for command line tool.
-logs.moreinfo = [[
-more information about ConTeXt and the tools that come with it can be found at:
+function resolvers.suffixofformat(str)
+ local s = suffixes[str]
+ return s and s[1] or ""
+end
-maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
-webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
-wiki : http://contextgarden.net
-]]
+function resolvers.suffixofformat(str)
+ return suffixes[str] or { }
+end
-logs.levels = {
- ['error'] = 1,
- ['warning'] = 2,
- ['info'] = 3,
- ['debug'] = 4,
-}
+for name, format in next, formats do
+ dangerous[name] = true -- still needed ?
+end
-logs.functions = {
- 'report', 'start', 'stop', 'push', 'pop', 'line', 'direct',
- 'start_run', 'stop_run',
- 'start_page_number', 'stop_page_number',
- 'report_output_pages', 'report_output_log',
- 'report_tex_stat', 'report_job_stat',
- 'show_open', 'show_close', 'show_load',
-}
+-- because vf searching is somewhat dangerous, we want to prevent
+-- too liberal searching esp because we do a lookup on the current
+-- path anyway; only tex (or any) is safe
-logs.tracers = {
-}
+dangerous.tex = nil
-logs.level = 0
-logs.mode = string.lower((os.getenv("MTX.LOG.MODE") or os.getenv("MTX_LOG_MODE") or "tex"))
-function logs.set_level(level)
- logs.level = logs.levels[level] or level
-end
+-- more helpers
-function logs.set_method(method)
- for _, v in next, logs.functions do
- logs[v] = logs[method][v] or function() end
- end
+function resolvers.formatofvariable(str)
+ return formats[str] or ''
end
--- tex logging
+function resolvers.formatofsuffix(str) -- of file
+ return suffixmap[fileextname(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc)
+end
-function logs.tex.report(category,fmt,...) -- new
- if fmt then
- write_nl(category .. " | " .. format(fmt,...))
- else
- write_nl(category .. " |")
- end
+function resolvers.variableofformat(str)
+ return formats[str] or ''
end
-function logs.tex.line(fmt,...) -- new
- if fmt then
- write_nl(format(fmt,...))
- else
- write_nl("")
+function resolvers.variableofformatorsuffix(str)
+ local v = formats[str]
+ if v then
+ return v
+ end
+ v = suffixmap[fileextname(str)]
+ if v then
+ return formats[v]
end
+ return ''
end
---~ function logs.tex.start_page_number()
---~ local real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
---~ if real > 0 then
---~ if user > 0 then
---~ if sub > 0 then
---~ write(format("[%s.%s.%s",real,user,sub))
---~ else
---~ write(format("[%s.%s",real,user))
---~ end
---~ else
---~ write(format("[%s",real))
---~ end
---~ else
---~ write("[-")
---~ end
---~ end
---~ function logs.tex.stop_page_number()
---~ write("]")
---~ end
-local real, user, sub
+end -- of closure
-function logs.tex.start_page_number()
- real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-tmp'] = {
+ version = 1.100,
+ 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"
+}
+
+--[[ldx--
+<p>This module deals with caching data. It sets up the paths and
+implements loaders and savers for tables. Best is to set the
+following variable. When not set, the usual paths will be
+checked. Personally I prefer the (users) temporary path.</p>
+
+</code>
+TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
+</code>
+
+<p>Currently we do no locking when we write files. This is no real
+problem because most caching involves fonts and the chance of them
+being written at the same time is small. We also need to extend
+luatools with a recache feature.</p>
+--ldx]]--
+
+local format, lower, gsub, concat = string.format, string.lower, string.gsub, table.concat
+local mkdirs, isdir = dir.mkdirs, lfs.isdir
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
+
+local report_caches = logs.reporter("resolvers","caches")
+local report_resolvers = logs.reporter("resolvers","caching")
+
+local resolvers = resolvers
+
+-- intermezzo
+
+local directive_cleanup = false directives.register("system.compile.cleanup", function(v) directive_cleanup = v end)
+local directive_strip = true directives.register("system.compile.strip", function(v) directive_strip = v end)
+
+local compile = utilities.lua.compile
+
+function utilities.lua.compile(luafile,lucfile,cleanup,strip)
+ if cleanup == nil then cleanup = directive_cleanup end
+ if strip == nil then strip = directive_strip end
+ return compile(luafile,lucfile,cleanup,strip)
end
-function logs.tex.stop_page_number()
- if real > 0 then
- if user > 0 then
- if sub > 0 then
- logs.report("pages", "flushing realpage %s, userpage %s, subpage %s",real,user,sub)
- else
- logs.report("pages", "flushing realpage %s, userpage %s",real,user)
+-- end of intermezzo
+
+caches = caches or { }
+local caches = caches
+
+caches.base = caches.base or "luatex-cache"
+caches.more = caches.more or "context"
+caches.direct = false -- true is faster but may need huge amounts of memory
+caches.tree = false
+caches.force = true
+caches.ask = false
+caches.relocate = false
+caches.defaults = { "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
+
+local writable, readables, usedreadables = nil, { }, { }
+
+-- we could use a metatable for writable and readable but not yet
+
+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")
+ if texmfcaches then
+ for k=1,#texmfcaches do
+ local cachepath = texmfcaches[k]
+ if cachepath ~= "" then
+ cachepath = resolvers.resolve(cachepath)
+ cachepath = resolvers.cleanpath(cachepath)
+ cachepath = file.collapsepath(cachepath)
+ local valid = isdir(cachepath)
+ if valid then
+ if file.is_readable(cachepath) then
+ readables[#readables+1] = cachepath
+ if not writable and file.is_writable(cachepath) then
+ writable = cachepath
+ end
+ end
+ elseif not writable and caches.force then
+ local cacheparent = file.dirname(cachepath)
+ if file.is_writable(cacheparent) then
+ if not caches.ask or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then
+ mkdirs(cachepath)
+ if isdir(cachepath) and file.is_writable(cachepath) then
+ report_caches("created: %s",cachepath)
+ writable = cachepath
+ readables[#readables+1] = cachepath
+ end
+ end
+ end
+ end
end
- else
- logs.report("pages", "flushing realpage %s",real)
+ end
+ end
+ -- As a last resort we check some temporary paths but this time we don't
+ -- create them.
+ local texmfcaches = caches.defaults
+ if texmfcaches then
+ for k=1,#texmfcaches do
+ local cachepath = texmfcaches[k]
+ cachepath = resolvers.expansion(cachepath) -- was getenv
+ if cachepath ~= "" then
+ cachepath = resolvers.resolve(cachepath)
+ cachepath = resolvers.cleanpath(cachepath)
+ local valid = isdir(cachepath)
+ if valid and file.is_readable(cachepath) then
+ if not writable and file.is_writable(cachepath) then
+ readables[#readables+1] = cachepath
+ writable = cachepath
+ break
+ end
+ end
+ end
+ end
+ end
+ -- Some extra checking. If we have no writable or readable path then we simply
+ -- quit.
+ if not writable then
+ report_caches("fatal error: there is no valid writable cache path defined")
+ os.exit()
+ elseif #readables == 0 then
+ report_caches("fatal error: there is no valid readable cache path defined")
+ os.exit()
+ end
+ -- why here
+ writable = dir.expandname(resolvers.cleanpath(writable)) -- just in case
+ -- moved here
+ local base, more, tree = caches.base, caches.more, caches.tree or caches.treehash() -- we have only one writable tree
+ if tree then
+ caches.tree = tree
+ writable = mkdirs(writable,base,more,tree)
+ for i=1,#readables do
+ readables[i] = file.join(readables[i],base,more,tree)
end
else
- logs.report("pages", "flushing page")
+ writable = mkdirs(writable,base,more)
+ for i=1,#readables do
+ readables[i] = file.join(readables[i],base,more)
+ end
+ end
+ -- end
+ if trace_cache then
+ for i=1,#readables do
+ report_caches("using readable path '%s' (order %s)",readables[i],i)
+ end
+ report_caches("using writable path '%s'",writable)
+ end
+ identify = function()
+ return writable, readables
end
- io.flush()
+ return writable, readables
end
-logs.tex.report_job_stat = statistics.show_job_stat
+function caches.usedpaths()
+ local writable, readables = identify()
+ if #readables > 1 then
+ local result = { }
+ for i=1,#readables do
+ local readable = readables[i]
+ if usedreadables[i] or readable == writable then
+ result[#result+1] = format("readable: '%s' (order %s)",readable,i)
+ end
+ end
+ result[#result+1] = format("writable: '%s'",writable)
+ return result
+ else
+ return writable
+ end
+end
--- xml logging
+function caches.configfiles()
+ return table.concat(resolvers.instance.specification,";")
+end
-function logs.xml.report(category,fmt,...) -- new
- if fmt then
- write_nl(format("<r category='%s'>%s</r>",category,format(fmt,...)))
- else
- write_nl(format("<r category='%s'/>",category))
+function caches.hashed(tree)
+ tree = gsub(tree,"\\$","/")
+ tree = gsub(tree,"/+$","")
+ tree = lower(tree)
+ local hash = md5.hex(tree)
+ if trace_cache or trace_locating then
+ report_caches("hashing tree %s, hash %s",tree,hash)
end
+ return hash
end
-function logs.xml.line(fmt,...) -- new
- if fmt then
- write_nl(format("<r>%s</r>",format(fmt,...)))
+
+function caches.treehash()
+ local tree = caches.configfiles()
+ if not tree or tree == "" then
+ return false
else
- write_nl("<r/>")
+ return caches.hashed(tree)
end
end
-function logs.xml.start() if logs.level > 0 then tw("<%s>" ) end end
-function logs.xml.stop () if logs.level > 0 then tw("</%s>") end end
-function logs.xml.push () if logs.level > 0 then tw("<!-- ") end end
-function logs.xml.pop () if logs.level > 0 then tw(" -->" ) end end
+local r_cache, w_cache = { }, { } -- normally w in in r but who cares
-function logs.xml.start_run()
- write_nl("<?xml version='1.0' standalone='yes'?>")
- write_nl("<job>") -- xmlns='www.pragma-ade.com/luatex/schemas/context-job.rng'
- write_nl("")
-end
-
-function logs.xml.stop_run()
- write_nl("</job>")
+local function getreadablepaths(...) -- we can optimize this as we have at most 2 tags
+ local tags = { ... }
+ local hash = concat(tags,"/")
+ local done = r_cache[hash]
+ if not done then
+ local writable, readables = identify() -- exit if not found
+ if #tags > 0 then
+ done = { }
+ for i=1,#readables do
+ done[i] = file.join(readables[i],...)
+ end
+ else
+ done = readables
+ end
+ r_cache[hash] = done
+ end
+ return done
end
-function logs.xml.start_page_number()
- write_nl(format("<p real='%s' page='%s' sub='%s'", texcount.realpageno, texcount.userpageno, texcount.subpageno))
+local function getwritablepath(...)
+ local tags = { ... }
+ local hash = concat(tags,"/")
+ local done = w_cache[hash]
+ if not done then
+ local writable, readables = identify() -- exit if not found
+ if #tags > 0 then
+ done = mkdirs(writable,...)
+ else
+ done = writable
+ end
+ w_cache[hash] = done
+ end
+ return done
end
-function logs.xml.stop_page_number()
- write("/>")
- write_nl("")
-end
+caches.getreadablepaths = getreadablepaths
+caches.getwritablepath = getwritablepath
-function logs.xml.report_output_pages(p,b)
- write_nl(format("<v k='pages' v='%s'/>", p))
- write_nl(format("<v k='bytes' v='%s'/>", b))
- write_nl("")
+function caches.getfirstreadablefile(filename,...)
+ local rd = getreadablepaths(...)
+ for i=1,#rd do
+ local path = rd[i]
+ local fullname = file.join(path,filename)
+ if file.is_readable(fullname) then
+ usedreadables[i] = true
+ return fullname, path
+ end
+ end
+ return caches.setfirstwritablefile(filename,...)
end
-function logs.xml.report_output_log()
+function caches.setfirstwritablefile(filename,...)
+ local wr = getwritablepath(...)
+ local fullname = file.join(wr,filename)
+ return fullname, wr
end
-function logs.xml.report_tex_stat(k,v)
- texiowrite_nl("log","<v k='"..k.."'>"..tostring(v).."</v>")
+function caches.define(category,subcategory) -- for old times sake
+ return function()
+ return getwritablepath(category,subcategory)
+ end
end
-local level = 0
-
-function logs.xml.show_open(name)
- level = level + 1
- texiowrite_nl(format("<f l='%s' n='%s'>",level,name))
+function caches.setluanames(path,name)
+ return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
end
-function logs.xml.show_close(name)
- texiowrite("</f> ")
- level = level - 1
+function caches.loaddata(readables,name)
+ if type(readables) == "string" then
+ readables = { readables }
+ end
+ for i=1,#readables do
+ local path = readables[i]
+ local tmaname, tmcname = caches.setluanames(path,name)
+ local loader = loadfile(tmcname) or loadfile(tmaname)
+ if loader then
+ loader = loader()
+ collectgarbage("step")
+ return loader
+ end
+ end
+ return false
end
-function logs.xml.show_load(name)
- texiowrite_nl(format("<f l='%s' n='%s'/>",level+1,name))
+function caches.is_writable(filepath,filename)
+ local tmaname, tmcname = caches.setluanames(filepath,filename)
+ return file.is_writable(tmaname)
end
---
-
-local name, banner = 'report', 'context'
+local saveoptions = { compact = true }
-local function report(category,fmt,...)
- if fmt then
- write_nl(format("%s | %s: %s",name,category,format(fmt,...)))
- elseif category then
- write_nl(format("%s | %s",name,category))
+function caches.savedata(filepath,filename,data,raw)
+ local tmaname, tmcname = caches.setluanames(filepath,filename)
+ local reduce, simplify = true, true
+ if raw then
+ reduce, simplify = false, false
+ end
+ data.cache_uuid = os.uuid()
+ if caches.direct then
+ file.savedata(tmaname,table.serialize(data,true,saveoptions))
else
- write_nl(format("%s |",name))
+ table.tofile(tmaname,data,true,saveoptions)
end
+ utilities.lua.compile(tmaname,tmcname)
end
-local function simple(fmt,...)
- if fmt then
- write_nl(format("%s | %s",name,format(fmt,...)))
- else
- write_nl(format("%s |",name))
- end
+-- moved from data-res:
+
+local content_state = { }
+
+function caches.contentstate()
+ return content_state or { }
end
-function logs.setprogram(_name_,_banner_,_verbose_)
- name, banner = _name_, _banner_
- if _verbose_ then
- trackers.enable("resolvers.locating")
- end
- logs.set_method("tex")
- logs.report = report -- also used in libraries
- logs.simple = simple -- only used in scripts !
- if utils then
- utils.report = simple
+function caches.loadcontent(cachename,dataname)
+ local name = caches.hashed(cachename)
+ local full, path = caches.getfirstreadablefile(name ..".lua","trees")
+ local filename = file.join(path,name)
+ local blob = loadfile(filename .. ".luc") or loadfile(filename .. ".lua")
+ if blob then
+ local data = blob()
+ if data and data.content then
+ if data.type == dataname then
+ if data.version == resolvers.cacheversion then
+ content_state[#content_state+1] = data.uuid
+ if trace_locating then
+ report_resolvers("loading '%s' for '%s' from '%s'",dataname,cachename,filename)
+ end
+ return data.content
+ else
+ report_resolvers("skipping '%s' for '%s' from '%s' (version mismatch)",dataname,cachename,filename)
+ end
+ else
+ report_resolvers("skipping '%s' for '%s' from '%s' (datatype mismatch)",dataname,cachename,filename)
+ end
+ elseif trace_locating then
+ report_resolvers("skipping '%s' for '%s' from '%s' (no content)",dataname,cachename,filename)
+ end
+ elseif trace_locating then
+ report_resolvers("skipping '%s' for '%s' from '%s' (invalid file)",dataname,cachename,filename)
end
- logs.verbose = _verbose_
end
-function logs.setverbose(what)
- if what then
- trackers.enable("resolvers.locating")
- else
- trackers.disable("resolvers.locating")
+function caches.collapsecontent(content)
+ for k, v in next, content do
+ if type(v) == "table" and #v == 1 then
+ content[k] = v[1]
+ end
end
- logs.verbose = what or false
end
-function logs.extendbanner(_banner_,_verbose_)
- banner = banner .. " | ".. _banner_
- if _verbose_ ~= nil then
- logs.setverbose(what)
+function caches.savecontent(cachename,dataname,content)
+ local name = caches.hashed(cachename)
+ local full, path = caches.setfirstwritablefile(name ..".lua","trees")
+ local filename = file.join(path,name) -- is full
+ local luaname, lucname = filename .. ".lua", filename .. ".luc"
+ if trace_locating then
+ report_resolvers("preparing '%s' for '%s'",dataname,cachename)
+ end
+ local data = {
+ type = dataname,
+ root = cachename,
+ version = resolvers.cacheversion,
+ date = os.date("%Y-%m-%d"),
+ time = os.date("%H:%M:%S"),
+ content = content,
+ uuid = os.uuid(),
+ }
+ local ok = io.savedata(luaname,table.serialize(data,true))
+ if ok then
+ if trace_locating then
+ report_resolvers("category '%s', cachename '%s' saved in '%s'",dataname,cachename,luaname)
+ end
+ if utilities.lua.compile(luaname,lucname) then
+ if trace_locating then
+ report_resolvers("'%s' compiled to '%s'",dataname,lucname)
+ end
+ return true
+ else
+ if trace_locating then
+ report_resolvers("compiling failed for '%s', deleting file '%s'",dataname,lucname)
+ end
+ os.remove(lucname)
+ end
+ elseif trace_locating then
+ report_resolvers("unable to save '%s' in '%s' (access error)",dataname,luaname)
end
end
-logs.verbose = false
-logs.report = logs.tex.report
-logs.simple = logs.tex.report
-function logs.reportlines(str) -- todo: <lines></lines>
- for line in gmatch(str,"(.-)[\n\r]") do
- logs.report(line)
- end
-end
+end -- of closure
-function logs.reportline() -- for scripts too
- logs.report()
-end
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-met'] = {
+ version = 1.100,
+ 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 find, format = string.find, string.format
+local sequenced = table.sequenced
+local addurlscheme, urlhashed = url.addscheme, url.hashed
+
+local trace_locating = false
+
+trackers.register("resolvers.locating", function(v) trace_methods = v end)
+trackers.register("resolvers.methods", function(v) trace_methods = v end)
+
+
+local report_methods = logs.reporter("resolvers","methods")
-logs.simpleline = logs.reportline
+local allocate = utilities.storage.allocate
-function logs.reportbanner() -- for scripts too
- logs.report(banner)
+local resolvers = resolvers
+
+local registered = { }
+
+local function splitmethod(filename) -- todo: filetype in specification
+ if not filename then
+ return { scheme = "unknown", original = filename }
+ end
+ if type(filename) == "table" then
+ return filename -- already split
+ end
+ filename = file.collapsepath(filename)
+ if not find(filename,"://") then
+ return { scheme = "file", path = filename, original = filename, filename = filename }
+ end
+ local specification = url.hashed(filename)
+ if not specification.scheme or specification.scheme == "" then
+ return { scheme = "file", path = filename, original = filename, filename = filename }
+ else
+ return specification
+ end
end
-function logs.help(message,option)
- logs.reportbanner()
- logs.reportline()
- logs.reportlines(message)
- local moreinfo = logs.moreinfo or ""
- if moreinfo ~= "" and option ~= "nomoreinfo" then
- logs.reportline()
- logs.reportlines(moreinfo)
+resolvers.splitmethod = splitmethod -- bad name but ok
+
+-- the second argument is always analyzed (saves time later on) and the original
+-- gets passed as original but also as argument
+
+local function methodhandler(what,first,...) -- filename can be nil or false
+ local method = registered[what]
+ if method then
+ local how, namespace = method.how, method.namespace
+ if how == "uri" or how == "url" then
+ local specification = splitmethod(first)
+ local scheme = specification.scheme
+ local resolver = namespace and namespace[scheme]
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, scheme=%s, argument=%s",what,how,scheme,first)
+ end
+ return resolver(specification,...)
+ else
+ resolver = namespace.default or namespace.file
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, default, argument=%s",what,how,first)
+ end
+ return resolver(specification,...)
+ elseif trace_methods then
+ report_methods("resolver: method=%s, how=%s, no handler",what,how)
+ end
+ end
+ elseif how == "tag" then
+ local resolver = namespace and namespace[first]
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, tag=%s",what,how,first)
+ end
+ return resolver(...)
+ else
+ resolver = namespace.default or namespace.file
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, default",what,how)
+ end
+ return resolver(...)
+ elseif trace_methods then
+ report_methods("resolver: method=%s, how=%s, unknown",what,how)
+ end
+ end
+ end
+ else
+ report_methods("resolver: method=%s, unknown",what)
end
end
-logs.set_level('error')
-logs.set_method('tex')
+resolvers.methodhandler = methodhandler
-function logs.system(whereto,process,jobname,category,...)
- for i=1,10 do
- local f = io.open(whereto,"a")
- if f then
- f:write(format("%s %s => %s => %s => %s\r",os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...)))
- f:close()
- break
+function resolvers.registermethod(name,namespace,how)
+ registered[name] = { how = how or "tag", namespace = namespace }
+ namespace["byscheme"] = function(scheme,filename,...)
+ if scheme == "file" then
+ return methodhandler(name,filename,...)
else
- sleep(0.1)
+ return methodhandler(name,addurlscheme(filename,scheme),...)
end
end
end
---~ local syslogname = "oeps.xxx"
---~
---~ for i=1,10 do
---~ logs.system(syslogname,"context","test","fonts","font %s recached due to newer version (%s)","blabla","123")
---~ end
+local concatinators = allocate { notfound = file.join } -- concatinate paths
+local locators = allocate { notfound = function() end } -- locate databases
+local hashers = allocate { notfound = function() end } -- load databases
+local generators = allocate { notfound = function() end } -- generate databases
-function logs.fatal(where,...)
- logs.report(where,"fatal error: %s, aborting now",format(...))
- os.exit()
-end
+resolvers.concatinators = concatinators
+resolvers.locators = locators
+resolvers.hashers = hashers
+resolvers.generators = generators
+
+local registermethod = resolvers.registermethod
+
+registermethod("concatinators",concatinators,"tag")
+registermethod("locators", locators, "uri")
+registermethod("hashers", hashers, "uri")
+registermethod("generators", generators, "uri")
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['data-inp'] = {
+if not modules then modules = { } end modules ['data-res'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -8196,981 +11083,510 @@ if not modules then modules = { } end modules ['data-inp'] = {
license = "see context related readme files",
}
--- After a few years using the code the large luat-inp.lua file
--- has been split up a bit. In the process some functionality was
--- dropped:
---
--- * support for reading lsr files
--- * selective scanning (subtrees)
--- * some public auxiliary functions were made private
---
--- TODO: os.getenv -> os.env[]
--- TODO: instances.[hashes,cnffiles,configurations,522]
--- TODO: check escaping in find etc, too much, too slow
-
--- This lib is multi-purpose and can be loaded again later on so that
--- additional functionality becomes available. We will split thislogs.report("fileio",
--- module in components once we're done with prototyping. This is the
--- first code I wrote for LuaTeX, so it needs some cleanup. Before changing
--- something in this module one can best check with Taco or Hans first; there
--- is some nasty trickery going on that relates to traditional kpse support.
-
--- To be considered: hash key lowercase, first entry in table filename
--- (any case), rest paths (so no need for optimization). Or maybe a
--- separate table that matches lowercase names to mixed case when
--- present. In that case the lower() cases can go away. I will do that
--- only when we run into problems with names ... well ... Iwona-Regular.
+-- In practice we will work within one tds tree, but i want to keep
+-- the option open to build tools that look at multiple trees, which is
+-- why we keep the tree specific data in a table. We used to pass the
+-- instance but for practical purposes we now avoid this and use a
+-- instance variable. We always have one instance active (sort of global).
--- Beware, loading and saving is overloaded in luat-tmp!
+-- todo: cache:/// home:///
local format, gsub, find, lower, upper, match, gmatch = string.format, string.gsub, string.find, string.lower, string.upper, string.match, string.gmatch
local concat, insert, sortedkeys = table.concat, table.insert, table.sortedkeys
-local next, type = next, type
-local lpegmatch = lpeg.match
+local next, type, rawget = next, type, rawget
+local os = os
-local trace_locating, trace_detail, trace_expansions = false, false, false
+local P, S, R, C, Cc, Cs, Ct, Carg = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Carg
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
-trackers.register("resolvers.locating", function(v) trace_locating = v end)
-trackers.register("resolvers.details", function(v) trace_detail = v end)
-trackers.register("resolvers.expansions", function(v) trace_expansions = v end) -- todo
+local filedirname = file.dirname
+local filebasename = file.basename
+local fileextname = file.extname
+local filejoin = file.join
+local collapsepath = file.collapsepath
+local joinpath = file.joinpath
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
-if not resolvers then
- resolvers = {
- suffixes = { },
- formats = { },
- dangerous = { },
- suffixmap = { },
- alternatives = { },
- locators = { }, -- locate databases
- hashers = { }, -- load databases
- generators = { }, -- generate databases
- }
-end
+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 resolvers = resolvers
+local report_resolving = logs.reporter("resolvers","resolving")
-resolvers.locators .notfound = { nil }
-resolvers.hashers .notfound = { nil }
-resolvers.generators.notfound = { nil }
-
-resolvers.cacheversion = '1.0.1'
-resolvers.cnfname = 'texmf.cnf'
-resolvers.luaname = 'texmfcnf.lua'
-resolvers.homedir = os.env[os.type == "windows" and 'USERPROFILE'] or os.env['HOME'] or '~'
-resolvers.cnfdefault = '{$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}'
-
-local dummy_path_expr = "^!*unset/*$"
-
-local formats = resolvers.formats
-local suffixes = resolvers.suffixes
-local dangerous = resolvers.dangerous
-local suffixmap = resolvers.suffixmap
-local alternatives = resolvers.alternatives
-
-formats['afm'] = 'AFMFONTS' suffixes['afm'] = { 'afm' }
-formats['enc'] = 'ENCFONTS' suffixes['enc'] = { 'enc' }
-formats['fmt'] = 'TEXFORMATS' suffixes['fmt'] = { 'fmt' }
-formats['map'] = 'TEXFONTMAPS' suffixes['map'] = { 'map' }
-formats['mp'] = 'MPINPUTS' suffixes['mp'] = { 'mp' }
-formats['ocp'] = 'OCPINPUTS' suffixes['ocp'] = { 'ocp' }
-formats['ofm'] = 'OFMFONTS' suffixes['ofm'] = { 'ofm', 'tfm' }
-formats['otf'] = 'OPENTYPEFONTS' suffixes['otf'] = { 'otf' } -- 'ttf'
-formats['opl'] = 'OPLFONTS' suffixes['opl'] = { 'opl' }
-formats['otp'] = 'OTPINPUTS' suffixes['otp'] = { 'otp' }
-formats['ovf'] = 'OVFFONTS' suffixes['ovf'] = { 'ovf', 'vf' }
-formats['ovp'] = 'OVPFONTS' suffixes['ovp'] = { 'ovp' }
-formats['tex'] = 'TEXINPUTS' suffixes['tex'] = { 'tex' }
-formats['tfm'] = 'TFMFONTS' suffixes['tfm'] = { 'tfm' }
-formats['ttf'] = 'TTFONTS' suffixes['ttf'] = { 'ttf', 'ttc', 'dfont' }
-formats['pfb'] = 'T1FONTS' suffixes['pfb'] = { 'pfb', 'pfa' }
-formats['vf'] = 'VFFONTS' suffixes['vf'] = { 'vf' }
-
-formats['fea'] = 'FONTFEATURES' suffixes['fea'] = { 'fea' }
-formats['cid'] = 'FONTCIDMAPS' suffixes['cid'] = { 'cid', 'cidmap' }
-
-formats ['texmfscripts'] = 'TEXMFSCRIPTS' -- new
-suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -- 'lua'
-
-formats ['lua'] = 'LUAINPUTS' -- new
-suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' }
-
--- backward compatible ones
-
-alternatives['map files'] = 'map'
-alternatives['enc files'] = 'enc'
-alternatives['cid maps'] = 'cid' -- great, why no cid files
-alternatives['font feature files'] = 'fea' -- and fea files here
-alternatives['opentype fonts'] = 'otf'
-alternatives['truetype fonts'] = 'ttf'
-alternatives['truetype collections'] = 'ttc'
-alternatives['truetype dictionary'] = 'dfont'
-alternatives['type1 fonts'] = 'pfb'
-
--- obscure ones
-
-formats ['misc fonts'] = ''
-suffixes['misc fonts'] = { }
-
-formats ['sfd'] = 'SFDFONTS'
-suffixes ['sfd'] = { 'sfd' }
-alternatives['subfont definition files'] = 'sfd'
-
--- lib paths
-
-formats ['lib'] = 'CLUAINPUTS' -- new (needs checking)
-suffixes['lib'] = (os.libsuffix and { os.libsuffix }) or { 'dll', 'so' }
+local resolvers = resolvers
--- In practice we will work within one tds tree, but i want to keep
--- the option open to build tools that look at multiple trees, which is
--- why we keep the tree specific data in a table. We used to pass the
--- instance but for practical pusposes we now avoid this and use a
--- instance variable.
+local expandedpathfromlist = resolvers.expandedpathfromlist
+local checkedvariable = resolvers.checkedvariable
+local splitconfigurationpath = resolvers.splitconfigurationpath
+local methodhandler = resolvers.methodhandler
--- here we catch a few new thingies (todo: add these paths to context.tmf)
---
--- FONTFEATURES = .;$TEXMF/fonts/fea//
--- FONTCIDMAPS = .;$TEXMF/fonts/cid//
+local initializesetter = utilities.setters.initialize
--- we always have one instance active
+local ostype, osname, osenv, ossetenv, osgetenv = os.type, os.name, os.env, os.setenv, os.getenv
-resolvers.instance = resolvers.instance or nil -- the current one (slow access)
-local instance = resolvers.instance or nil -- the current one (fast access)
+resolvers.cacheversion = '1.0.1'
+resolvers.configbanner = ''
+resolvers.homedir = environment.homedir
+resolvers.criticalvars = allocate { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF", "TEXMF", "TEXOS" }
+resolvers.luacnfname = 'texmfcnf.lua'
+resolvers.luacnfstate = "unknown"
-function resolvers.newinstance()
+-- resolvers.luacnfspec = '{$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}' -- what a rubish path
+resolvers.luacnfspec = 'selfautoparent:{/texmf{-local,}{,/web2c},}}'
- -- store once, freeze and faster (once reset we can best use
- -- instance.environment) maybe better have a register suffix
- -- function
- for k, v in next, suffixes do
- for i=1,#v do
- local vi = v[i]
- if vi then
- suffixmap[vi] = k
- end
- end
- end
- -- because vf searching is somewhat dangerous, we want to prevent
- -- too liberal searching esp because we do a lookup on the current
- -- path anyway; only tex (or any) is safe
+local unset_variable = "unset"
- for k, v in next, formats do
- dangerous[k] = true
- end
- dangerous.tex = nil
+local formats = resolvers.formats
+local suffixes = resolvers.suffixes
+local dangerous = resolvers.dangerous
+local suffixmap = resolvers.suffixmap
- -- the instance
+resolvers.defaultsuffixes = { "tex" } -- "mkiv", "cld" -- too tricky
- local newinstance = {
- rootpath = '',
- treepath = '',
- progname = 'context',
- engine = 'luatex',
- format = '',
- environment = { },
- variables = { },
- expansions = { },
- files = { },
- remap = { },
- configuration = { },
- setup = { },
- order = { },
- found = { },
- foundintrees = { },
- kpsevars = { },
- hashes = { },
- cnffiles = { },
- luafiles = { },
- lists = { },
- remember = true,
- diskcache = true,
- renewcache = false,
- scandisk = true,
- cachepath = nil,
- loaderror = false,
- sortdata = false,
- savelists = true,
- cleanuppaths = true,
- allresults = false,
- pattern = nil, -- lists
- data = { }, -- only for loading
- force_suffixes = true,
- fakepaths = { },
- }
+resolvers.instance = resolvers.instance or nil -- the current one (slow access)
+local instance = resolvers.instance or nil -- the current one (fast access)
- local ne = newinstance.environment
+-- An instance has an environment (coming from the outside, kept raw), variables
+-- (coming from the configuration file), and expansions (variables with nested
+-- variables replaced). One can push something into the outer environment and
+-- its internal copy, but only the later one will be the raw unprefixed variant.
- for k,v in next, os.env do
- ne[k] = resolvers.bare_variable(v)
+function resolvers.setenv(key,value,raw)
+ if instance then
+ -- this one will be consulted first when we stay inside
+ -- the current environment
+ instance.environment[key] = value
+ -- 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))
end
+end
- return newinstance
+-- Beware we don't want empty here as this one can be called early on
+-- and therefore we use rawget.
+local function getenv(key)
+ local value = rawget(instance.environment,key)
+ if value and value ~= "" then
+ return value
+ else
+ local e = osgetenv(key)
+ return e ~= nil and e ~= "" and checkedvariable(e) or ""
+ end
end
-function resolvers.setinstance(someinstance)
- instance = someinstance
- resolvers.instance = someinstance
- return someinstance
-end
+resolvers.getenv = getenv
+resolvers.env = getenv
-function resolvers.reset()
- return resolvers.setinstance(resolvers.newinstance())
-end
+-- We are going to use some metatable trickery where we backtrack from
+-- expansion to variable to environment.
-local function reset_hashes()
- instance.lists = { }
- instance.found = { }
+local function resolve(k)
+ return instance.expansions[k]
end
-local function check_configuration() -- not yet ok, no time for debugging now
- if os.env["OSFONTDIR"] then
- -- ok
- elseif os.type == "windows" then
- os.setenv("OSFONTDIR","c:/windows/fonts//")
- elseif os.type == "macosx" then
- os.setenv("OSFONTDIR","$HOME/Library/Fonts//;/Library/Fonts//;/System/Library/Fonts//")
- end
-end
+local dollarstripper = lpeg.stripper("$")
+local inhibitstripper = P("!")^0 * Cs(P(1)^0)
+local backslashswapper = lpeg.replacer("\\","/")
-function resolvers.bare_variable(str) -- assumes str is a string
- return (gsub(str,"\s*([\"\']?)(.+)%1\s*", "%2"))
-end
+local somevariable = P("$") / ""
+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 )
-function resolvers.settrace(n) -- no longer number but: 'locating' or 'detail'
- if n then
- trackers.disable("resolvers.*")
- trackers.enable("resolvers."..n)
- end
-end
+local cleaner = P("\\") / "/" + P(";") * S("!{}/\\")^0 * P(";")^1 / ";"
+local variablecleaner = Cs((cleaner + P(1))^0)
-resolvers.settrace(os.getenv("MTX_INPUT_TRACE"))
+local somevariable = R("az","AZ","09","__","--")^1 / resolve
+local variable = (P("$")/"") * (somevariable + (P("{")/"") * somevariable * (P("}")/""))
+local variableresolver = Cs((variable + P(1))^0)
-function resolvers.osenv(key)
- local ie = instance.environment
- local value = ie[key]
- if value == nil then
- -- local e = os.getenv(key)
- local e = os.env[key]
- if e == nil then
- -- value = "" -- false
- else
- value = resolvers.bare_variable(e)
- end
- ie[key] = value
- end
- return value or ""
+local function expandedvariable(var)
+ return lpegmatch(variableexpander,var) or var
end
-function resolvers.env(key)
- return instance.environment[key] or resolvers.osenv(key)
-end
+function resolvers.newinstance() -- todo: all vars will become lowercase and alphanum only
---
+ if trace_locating then
+ report_resolving("creating instance")
+ end
-local function expand_vars(lst) -- simple vars
- local variables, env = instance.variables, resolvers.env
- local function resolve(a)
- return variables[a] or env(a)
- end
- for k=1,#lst do
- lst[k] = gsub(lst[k],"%$([%a%d%_%-]+)",resolve)
- end
-end
+ local environment, variables, expansions, order = allocate(), allocate(), allocate(), allocate()
-local function expanded_var(var) -- simple vars
- local function resolve(a)
- return instance.variables[a] or resolvers.env(a)
- end
- return (gsub(var,"%$([%a%d%_%-]+)",resolve))
-end
+ local newinstance = {
+ environment = environment,
+ variables = variables,
+ expansions = expansions,
+ order = order,
+ files = allocate(),
+ setups = allocate(),
+ found = allocate(),
+ foundintrees = allocate(),
+ hashes = allocate(),
+ hashed = allocate(),
+ specification = allocate(),
+ lists = allocate(),
+ data = allocate(), -- only for loading
+ fakepaths = allocate(),
+ remember = true,
+ diskcache = true,
+ renewcache = false,
+ loaderror = false,
+ savelists = true,
+ pattern = nil, -- lists
+ force_suffixes = true,
+ }
-local function entry(entries,name)
- if name and (name ~= "") then
- name = gsub(name,'%$','')
- local result = entries[name..'.'..instance.progname] or entries[name]
- if result then
- return result
- else
- result = resolvers.env(name)
- if result then
- instance.variables[name] = result
- resolvers.expand_variables()
- return instance.expansions[name] or ""
+ setmetatableindex(variables,function(t,k)
+ local v
+ for i=1,#order do
+ v = order[i][k]
+ if v ~= nil then
+ t[k] = v
+ return v
end
end
- end
- return ""
-end
-
-local function is_entry(entries,name)
- if name and name ~= "" then
- name = gsub(name,'%$','')
- return (entries[name..'.'..instance.progname] or entries[name]) ~= nil
- else
- return false
- end
-end
-
--- {a,b,c,d}
--- a,b,c/{p,q,r},d
--- a,b,c/{p,q,r}/d/{x,y,z}//
--- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
--- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
--- a{b,c}{d,e}f
--- {a,b,c,d}
--- {a,b,c/{p,q,r},d}
--- {a,b,c/{p,q,r}/d/{x,y,z}//}
--- {a,b,c/{p,q/{x,y,z}},d/{p,q,r}}
--- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}}
--- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}
+ if v == nil then
+ v = ""
+ end
+ t[k] = v
+ return v
+ end)
--- this one is better and faster, but it took me a while to realize
--- that this kind of replacement is cleaner than messy parsing and
--- fuzzy concatenating we can probably gain a bit with selectively
--- applying lpeg, but experiments with lpeg parsing this proved not to
--- work that well; the parsing is ok, but dealing with the resulting
--- table is a pain because we need to work inside-out recursively
+ setmetatableindex(environment, function(t,k)
+ local v = osgetenv(k)
+ if v == nil then
+ v = variables[k]
+ end
+ if v ~= nil then
+ v = checkedvariable(v) or ""
+ end
+ v = resolvers.repath(v) -- for taco who has a : separated osfontdir
+ t[k] = v
+ return v
+ end)
-local function do_first(a,b)
- local t = { }
- for s in gmatch(b,"[^,]+") do t[#t+1] = a .. s end
- return "{" .. concat(t,",") .. "}"
-end
+ setmetatableindex(expansions, function(t,k)
+ local v = environment[k]
+ if type(v) == "string" then
+ v = lpegmatch(variableresolver,v)
+ v = lpegmatch(variablecleaner,v)
+ end
+ t[k] = v
+ return v
+ end)
-local function do_second(a,b)
- local t = { }
- for s in gmatch(a,"[^,]+") do t[#t+1] = s .. b end
- return "{" .. concat(t,",") .. "}"
-end
+ return newinstance
-local function do_both(a,b)
- local t = { }
- for sa in gmatch(a,"[^,]+") do
- for sb in gmatch(b,"[^,]+") do
- t[#t+1] = sa .. sb
- end
- end
- return "{" .. concat(t,",") .. "}"
end
-local function do_three(a,b,c)
- return a .. b.. c
+function resolvers.setinstance(someinstance) -- only one instance is active
+ instance = someinstance
+ resolvers.instance = someinstance
+ return someinstance
end
-local function splitpathexpr(str, t, validate)
- -- no need for further optimization as it is only called a
- -- few times, we can use lpeg for the sub
- if trace_expansions then
- logs.report("fileio","expanding variable '%s'",str)
- end
- t = t or { }
- str = gsub(str,",}",",@}")
- str = gsub(str,"{,","{@,")
- -- str = "@" .. str .. "@"
- local ok, done
- while true do
- done = false
- while true do
- str, ok = gsub(str,"([^{},]+){([^{}]+)}",do_first)
- if ok > 0 then done = true else break end
- end
- while true do
- str, ok = gsub(str,"{([^{}]+)}([^{},]+)",do_second)
- if ok > 0 then done = true else break end
- end
- while true do
- str, ok = gsub(str,"{([^{}]+)}{([^{}]+)}",do_both)
- if ok > 0 then done = true else break end
- end
- str, ok = gsub(str,"({[^{}]*){([^{}]+)}([^{}]*})",do_three)
- if ok > 0 then done = true end
- if not done then break end
- end
- str = gsub(str,"[{}]", "")
- str = gsub(str,"@","")
- if validate then
- for s in gmatch(str,"[^,]+") do
- s = validate(s)
- if s then t[#t+1] = s end
- end
- else
- for s in gmatch(str,"[^,]+") do
- t[#t+1] = s
- end
- end
- if trace_expansions then
- for k=1,#t do
- logs.report("fileio","% 4i: %s",k,t[k])
- end
- end
- return t
+function resolvers.reset()
+ return resolvers.setinstance(resolvers.newinstance())
end
-local function expanded_path_from_list(pathlist) -- maybe not a list, just a path
- -- a previous version fed back into pathlist
- local newlist, ok = { }, false
- for k=1,#pathlist do
- if find(pathlist[k],"[{}]") then
- ok = true
- break
- end
- end
- if ok then
- local function validate(s)
- s = file.collapse_path(s)
- return s ~= "" and not find(s,dummy_path_expr) and s
- end
- for k=1,#pathlist do
- splitpathexpr(pathlist[k],newlist,validate)
- end
- else
- for k=1,#pathlist do
- for p in gmatch(pathlist[k],"([^,]+)") do
- p = file.collapse_path(p)
- if p ~= "" then newlist[#newlist+1] = p end
- end
- end
- end
- return newlist
+local function reset_hashes()
+ instance.lists = { }
+ instance.found = { }
end
--- we follow a rather traditional approach:
---
--- (1) texmf.cnf given in TEXMFCNF
--- (2) texmf.cnf searched in default variable
---
--- also we now follow the stupid route: if not set then just assume *one*
--- cnf file under texmf (i.e. distribution)
+local slash = P("/")
-local args = environment and environment.original_arguments or arg -- this needs a cleanup
+local pathexpressionpattern = Cs (
+ Cc("^") * (
+ Cc("%") * S(".-")
+ + slash^2 * P(-1) / "/.*"
+ + slash^2 / "/.-/"
+ + (1-slash) * P(-1) * Cc("/")
+ + P(1)
+ )^1 * Cc("$") -- yes or no $
+)
-resolvers.ownbin = resolvers.ownbin or args[-2] or arg[-2] or args[-1] or arg[-1] or arg[0] or "luatex"
-resolvers.ownbin = gsub(resolvers.ownbin,"\\","/")
+local cache = { }
-function resolvers.getownpath()
- local ownpath = resolvers.ownpath or os.selfdir
- if not ownpath or ownpath == "" or ownpath == "unset" then
- ownpath = args[-1] or arg[-1]
- ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
- if not ownpath or ownpath == "" then
- ownpath = args[-0] or arg[-0]
- ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
- end
- local binary = resolvers.ownbin
- if not ownpath or ownpath == "" then
- ownpath = ownpath and file.dirname(binary)
- end
- if not ownpath or ownpath == "" then
- if os.binsuffix ~= "" then
- binary = file.replacesuffix(binary,os.binsuffix)
- end
- for p in gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
- local b = file.join(p,binary)
- if lfs.isfile(b) then
- -- we assume that after changing to the path the currentdir function
- -- resolves to the real location and use this side effect here; this
- -- trick is needed because on the mac installations use symlinks in the
- -- path instead of real locations
- local olddir = lfs.currentdir()
- if lfs.chdir(p) then
- local pp = lfs.currentdir()
- if trace_locating and p ~= pp then
- logs.report("fileio","following symlink '%s' to '%s'",p,pp)
- end
- ownpath = pp
- lfs.chdir(olddir)
- else
- if trace_locating then
- logs.report("fileio","unable to check path '%s'",p)
- end
- ownpath = p
- end
- break
- end
- end
- end
- if not ownpath or ownpath == "" then
- ownpath = "."
- logs.report("fileio","forcing fallback ownpath .")
- elseif trace_locating then
- logs.report("fileio","using ownpath '%s'",ownpath)
+local function makepathexpression(str)
+ if str == "." then
+ return "^%./$"
+ else
+ local c = cache[str]
+ if not c then
+ c = lpegmatch(pathexpressionpattern,str)
+ cache[str] = c
end
+ return c
end
- resolvers.ownpath = ownpath
- function resolvers.getownpath()
- return resolvers.ownpath
- end
- return ownpath
end
-local own_places = { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF" }
-
-local function identify_own()
- local ownpath = resolvers.getownpath() or dir.current()
- local ie = instance.environment
- if ownpath then
- if resolvers.env('SELFAUTOLOC') == "" then os.env['SELFAUTOLOC'] = file.collapse_path(ownpath) end
- if resolvers.env('SELFAUTODIR') == "" then os.env['SELFAUTODIR'] = file.collapse_path(ownpath .. "/..") end
- if resolvers.env('SELFAUTOPARENT') == "" then os.env['SELFAUTOPARENT'] = file.collapse_path(ownpath .. "/../..") end
- else
- logs.report("fileio","error: unable to locate ownpath")
- os.exit()
- end
- if resolvers.env('TEXMFCNF') == "" then os.env['TEXMFCNF'] = resolvers.cnfdefault end
- if resolvers.env('TEXOS') == "" then os.env['TEXOS'] = resolvers.env('SELFAUTODIR') end
- if resolvers.env('TEXROOT') == "" then os.env['TEXROOT'] = resolvers.env('SELFAUTOPARENT') end
+local function reportcriticalvariables()
if trace_locating then
- for i=1,#own_places do
- local v = own_places[i]
- logs.report("fileio","variable '%s' set to '%s'",v,resolvers.env(v) or "unknown")
+ for i=1,#resolvers.criticalvars do
+ local k = resolvers.criticalvars[i]
+ local v = resolvers.getenv(k) or "unknown" -- this one will not resolve !
+ report_resolving("variable '%s' set to '%s'",k,v)
end
+ report_resolving()
end
- identify_own = function() end
+ reportcriticalvariables = function() end
end
-function resolvers.identify_cnf()
- if #instance.cnffiles == 0 then
- -- fallback
- identify_own()
- -- the real search
- resolvers.expand_variables()
- local t = resolvers.split_path(resolvers.env('TEXMFCNF'))
- t = expanded_path_from_list(t)
- expand_vars(t) -- redundant
- local function locate(filename,list)
- for i=1,#t do
- local ti = t[i]
- local texmfcnf = file.collapse_path(file.join(ti,filename))
- if lfs.isfile(texmfcnf) then
- list[#list+1] = texmfcnf
+local function identify_configuration_files()
+ local specification = instance.specification
+ if #specification == 0 then
+ local cnfspec = getenv('TEXMFCNF')
+ if cnfspec == "" then
+ cnfspec = resolvers.luacnfspec
+ resolvers.luacnfstate = "default"
+ else
+ resolvers.luacnfstate = "environment"
+ end
+ reportcriticalvariables()
+ local cnfpaths = expandedpathfromlist(resolvers.splitpath(cnfspec))
+ local luacnfname = resolvers.luacnfname
+ for i=1,#cnfpaths do
+ local filename = collapsepath(filejoin(cnfpaths[i],luacnfname))
+ local realname = resolvers.resolve(filename)
+ if lfs.isfile(realname) then
+ specification[#specification+1] = filename
+ if trace_locating then
+ report_resolving("found configuration file '%s'",realname)
end
+ elseif trace_locating then
+ report_resolving("unknown configuration file '%s'",realname)
end
end
- locate(resolvers.luaname,instance.luafiles)
- locate(resolvers.cnfname,instance.cnffiles)
- end
-end
-
-local function load_cnf_file(fname)
- fname = resolvers.clean_path(fname)
- local lname = file.replacesuffix(fname,'lua')
- if lfs.isfile(lname) then
- local dname = file.dirname(fname) -- fname ?
- if not instance.configuration[dname] then
- resolvers.load_data(dname,'configuration',lname and file.basename(lname))
- instance.order[#instance.order+1] = instance.configuration[dname]
+ if trace_locating then
+ report_resolving()
end
- else
- f = io.open(fname)
- if f then
- if trace_locating then
- logs.report("fileio","loading configuration file %s", fname)
- end
- local line, data, n, k, v
- local dname = file.dirname(fname)
- if not instance.configuration[dname] then
- instance.configuration[dname] = { }
- instance.order[#instance.order+1] = instance.configuration[dname]
- end
- local data = instance.configuration[dname]
- while true do
- local line, n = f:read(), 0
- if line then
- while true do -- join lines
- line, n = gsub(line,"\\%s*$", "")
- if n > 0 then
- line = line .. f:read()
- else
- break
+ elseif trace_locating then
+ report_resolving("configuration files already identified")
+ end
+end
+
+local function load_configuration_files()
+ local specification = instance.specification
+ if #specification > 0 then
+ local luacnfname = resolvers.luacnfname
+ for i=1,#specification do
+ local filename = specification[i]
+ local pathname = filedirname(filename)
+ local filename = filejoin(pathname,luacnfname)
+ local realname = resolvers.resolve(filename) -- no shortcut
+ local blob = loadfile(realname)
+ if blob then
+ local setups = instance.setups
+ local data = blob()
+ data = data and data.content
+ if data then
+ if trace_locating then
+ report_resolving("loading configuration file '%s'",filename)
+ report_resolving()
+ end
+ local variables = data.variables or { }
+ local warning = false
+ for k, v in next, data do
+ local variant = type(v)
+ if variant == "table" then
+ initializesetter(filename,k,v)
+ elseif variables[k] == nil then
+ if trace_locating and not warning then
+ report_resolving("variables like '%s' in configuration file '%s' should move to the 'variables' subtable",
+ k,resolvers.resolve(filename))
+ warning = true
+ end
+ variables[k] = v
end
end
- if not find(line,"^[%%#]") then
- local l = gsub(line,"%s*%%.*$","")
- local k, v = match(l,"%s*(.-)%s*=%s*(.-)%s*$")
- if k and v and not data[k] then
- v = gsub(v,"[%%#].*",'')
- data[k] = gsub(v,"~","$HOME")
- instance.kpsevars[k] = true
+ setups[pathname] = variables
+ if resolvers.luacnfstate == "default" then
+ -- the following code is not tested
+ local cnfspec = variables["TEXMFCNF"]
+ if cnfspec then
+ if trace_locating then
+ report_resolving("reloading configuration due to TEXMF redefinition")
+ end
+ -- we push the value into the main environment (osenv) so
+ -- that it takes precedence over the default one and therefore
+ -- also over following definitions
+ resolvers.setenv('TEXMFCNF',cnfspec) -- resolves prefixes
+ -- we now identify and load the specified configuration files
+ instance.specification = { }
+ identify_configuration_files()
+ load_configuration_files()
+ -- we prevent further overload of the configuration variable
+ resolvers.luacnfstate = "configuration"
+ -- we quit the outer loop
+ break
end
end
- else
- break
- end
- end
- f:close()
- elseif trace_locating then
- logs.report("fileio","skipping configuration file '%s'", fname)
- end
- end
-end
-local function collapse_cnf_data() -- potential optimization: pass start index (setup and configuration are shared)
- local order = instance.order
- for i=1,#order do
- local c = order[i]
- for k,v in next, c do
- if not instance.variables[k] then
- if instance.environment[k] then
- instance.variables[k] = instance.environment[k]
else
- instance.kpsevars[k] = true
- instance.variables[k] = resolvers.bare_variable(v)
+ if trace_locating then
+ report_resolving("skipping configuration file '%s' (no content)",filename)
+ end
+ setups[pathname] = { }
+ instance.loaderror = true
end
+ elseif trace_locating then
+ report_resolving("skipping configuration file '%s' (no file)",filename)
end
- end
- end
-end
-
-function resolvers.load_cnf()
- local function loadoldconfigdata()
- local cnffiles = instance.cnffiles
- for i=1,#cnffiles do
- load_cnf_file(cnffiles[i])
- end
- end
- -- instance.cnffiles contain complete names now !
- -- we still use a funny mix of cnf and new but soon
- -- we will switch to lua exclusively as we only use
- -- the file to collect the tree roots
- if #instance.cnffiles == 0 then
- if trace_locating then
- logs.report("fileio","no cnf files found (TEXMFCNF may not be set/known)")
- end
- else
- local cnffiles = instance.cnffiles
- instance.rootpath = cnffiles[1]
- for k=1,#cnffiles do
- instance.cnffiles[k] = file.collapse_path(cnffiles[k])
- end
- for i=1,3 do
- instance.rootpath = file.dirname(instance.rootpath)
- end
- instance.rootpath = file.collapse_path(instance.rootpath)
- if instance.diskcache and not instance.renewcache then
- resolvers.loadoldconfig(instance.cnffiles)
+ instance.order[#instance.order+1] = instance.setups[pathname]
if instance.loaderror then
- loadoldconfigdata()
- resolvers.saveoldconfig()
- end
- else
- loadoldconfigdata()
- if instance.renewcache then
- resolvers.saveoldconfig()
+ break
end
end
- collapse_cnf_data()
- end
- check_configuration()
-end
-
-function resolvers.load_lua()
- if #instance.luafiles == 0 then
- -- yet harmless
- else
- instance.rootpath = instance.luafiles[1]
- local luafiles = instance.luafiles
- for k=1,#luafiles do
- instance.luafiles[k] = file.collapse_path(luafiles[k])
- end
- for i=1,3 do
- instance.rootpath = file.dirname(instance.rootpath)
- end
- instance.rootpath = file.collapse_path(instance.rootpath)
- resolvers.loadnewconfig()
- collapse_cnf_data()
- end
- check_configuration()
-end
-
--- database loading
-
-function resolvers.load_hash()
- resolvers.locatelists()
- if instance.diskcache and not instance.renewcache then
- resolvers.loadfiles()
- if instance.loaderror then
- resolvers.loadlists()
- resolvers.savefiles()
- end
- else
- resolvers.loadlists()
- if instance.renewcache then
- resolvers.savefiles()
- end
- end
-end
-
-function resolvers.append_hash(type,tag,name)
- if trace_locating then
- logs.report("fileio","hash '%s' appended",tag)
- end
- insert(instance.hashes, { ['type']=type, ['tag']=tag, ['name']=name } )
-end
-
-function resolvers.prepend_hash(type,tag,name)
- if trace_locating then
- logs.report("fileio","hash '%s' prepended",tag)
- end
- insert(instance.hashes, 1, { ['type']=type, ['tag']=tag, ['name']=name } )
-end
-
-function resolvers.extend_texmf_var(specification) -- crap, we could better prepend the hash
--- local t = resolvers.expanded_path_list('TEXMF') -- full expansion
- local t = resolvers.split_path(resolvers.env('TEXMF'))
- insert(t,1,specification)
- local newspec = concat(t,";")
- if instance.environment["TEXMF"] then
- instance.environment["TEXMF"] = newspec
- elseif instance.variables["TEXMF"] then
- instance.variables["TEXMF"] = newspec
- else
- -- weird
- end
- resolvers.expand_variables()
- reset_hashes()
-end
-
--- locators
-
-function resolvers.locatelists()
- local texmfpaths = resolvers.clean_path_list('TEXMF')
- for i=1,#texmfpaths do
- local path = texmfpaths[i]
- if trace_locating then
- logs.report("fileio","locating list of '%s'",path)
- end
- resolvers.locatedatabase(file.collapse_path(path))
- end
-end
-
-function resolvers.locatedatabase(specification)
- return resolvers.methodhandler('locators', specification)
-end
-
-function resolvers.locators.tex(specification)
- if specification and specification ~= '' and lfs.isdir(specification) then
- if trace_locating then
- logs.report("fileio","tex locator '%s' found",specification)
- end
- resolvers.append_hash('file',specification,filename)
elseif trace_locating then
- logs.report("fileio","tex locator '%s' not found",specification)
+ report_resolving("warning: no lua configuration files found")
end
end
--- hashers
-
-function resolvers.hashdatabase(tag,name)
- return resolvers.methodhandler('hashers',tag,name)
-end
+-- scheme magic ... database loading
-function resolvers.loadfiles()
- instance.loaderror = false
- instance.files = { }
+local function load_file_databases()
+ instance.loaderror, instance.files = false, allocate()
if not instance.renewcache then
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- resolvers.hashdatabase(hash.tag,hash.name)
+ resolvers.hashers.byscheme(hash.type,hash.name)
if instance.loaderror then break end
end
end
end
-function resolvers.hashers.tex(tag,name)
- resolvers.load_data(tag,'files')
-end
-
--- generators:
-
-function resolvers.loadlists()
- local hashes = instance.hashes
- for i=1,#hashes do
- resolvers.generatedatabase(hashes[i].tag)
- end
-end
-
-function resolvers.generatedatabase(specification)
- return resolvers.methodhandler('generators', specification)
-end
-
--- starting with . or .. etc or funny char
-
-local weird = lpeg.P(".")^1 + lpeg.anywhere(lpeg.S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
-
---~ local l_forbidden = lpeg.S("~`!#$%^&*()={}[]:;\"\'||\\/<>,?\n\r\t")
---~ local l_confusing = lpeg.P(" ")
---~ local l_character = lpeg.patterns.utf8
---~ local l_dangerous = lpeg.P(".")
-
---~ local l_normal = (l_character - l_forbidden - l_confusing - l_dangerous) * (l_character - l_forbidden - l_confusing^2)^0 * lpeg.P(-1)
---~ ----- l_normal = l_normal * lpeg.Cc(true) + lpeg.Cc(false)
-
---~ local function test(str)
---~ print(str,lpeg.match(l_normal,str))
---~ end
---~ test("ヒラギノ明朝 Pro W3")
---~ test("..ヒラギノ明朝 Pro W3")
---~ test(":ヒラギノ明朝 Pro W3;")
---~ test("ヒラギノ明朝 /Pro W3;")
---~ test("ヒラギノ明朝 Pro W3")
-
-function resolvers.generators.tex(specification)
- local tag = specification
- if trace_locating then
- logs.report("fileio","scanning path '%s'",specification)
- end
- instance.files[tag] = { }
- local files = instance.files[tag]
- local n, m, r = 0, 0, 0
- local spec = specification .. '/'
- local attributes = lfs.attributes
- local directory = lfs.dir
- local function action(path)
- local full
- if path then
- full = spec .. path .. '/'
- else
- full = spec
- end
- for name in directory(full) do
- if not lpegmatch(weird,name) then
- -- if lpegmatch(l_normal,name) then
- local mode = attributes(full..name,'mode')
- if mode == 'file' then
- if path then
- n = n + 1
- local f = files[name]
- if f then
- if type(f) == 'string' then
- files[name] = { f, path }
- else
- f[#f+1] = path
- end
- else -- probably unique anyway
- files[name] = path
- local lower = lower(name)
- if name ~= lower then
- files["remap:"..lower] = name
- r = r + 1
- end
- end
- end
- elseif mode == 'directory' then
- m = m + 1
- if path then
- action(path..'/'..name)
+local function locate_file_databases()
+ -- todo: cache:// and tree:// (runtime)
+ local texmfpaths = resolvers.expandedpathlist('TEXMF')
+ if #texmfpaths > 0 then
+ for i=1,#texmfpaths do
+ local path = collapsepath(texmfpaths[i])
+ local stripped = lpegmatch(inhibitstripper,path) -- the !! thing
+ if stripped ~= "" then
+ local runtime = stripped == path
+ path = resolvers.cleanpath(path)
+ local spec = resolvers.splitmethod(stripped)
+ if spec.scheme == "cache" or spec.scheme == "file" then
+ stripped = spec.path
+ elseif runtime and (spec.noscheme or spec.scheme == "file") then
+ stripped = "tree:///" .. stripped
+ end
+ if trace_locating then
+ if runtime then
+ report_resolving("locating list of '%s' (runtime)",path)
else
- action(name)
+ report_resolving("locating list of '%s' (cached)",path)
end
end
+ methodhandler('locators',stripped)
end
end
- end
- action()
- if trace_locating then
- logs.report("fileio","%s files found on %s directories with %s uppercase remappings",n,m,r)
+ if trace_locating then
+ report_resolving()
+ end
+ elseif trace_locating then
+ report_resolving("no texmf paths are defined (using TEXMF)")
end
end
--- savers, todo
-
-function resolvers.savefiles()
- resolvers.save_data('files')
+local function generate_file_databases()
+ local hashes = instance.hashes
+ for k=1,#hashes do
+ local hash = hashes[k]
+ methodhandler('generators',hash.name)
+ end
+ if trace_locating then
+ report_resolving()
+ end
end
--- A config (optionally) has the paths split in tables. Internally
--- we join them and split them after the expansion has taken place. This
--- is more convenient.
-
---~ local checkedsplit = string.checkedsplit
-
-local cache = { }
-
-local splitter = lpeg.Ct(lpeg.splitat(lpeg.S(os.type == "windows" and ";" or ":;")))
-
-local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
- local found = cache[str]
- if not found then
- if str == "" then
- found = { }
- else
- str = gsub(str,"\\","/")
---~ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
-local split = lpegmatch(splitter,str)
- found = { }
- for i=1,#split do
- local s = split[i]
- if not find(s,"^{*unset}*") then
- found[#found+1] = s
- end
- end
- if trace_expansions then
- logs.report("fileio","splitting path specification '%s'",str)
- for k=1,#found do
- logs.report("fileio","% 4i: %s",k,found[k])
- end
+local function save_file_databases() -- will become cachers
+ for i=1,#instance.hashes do
+ local hash = instance.hashes[i]
+ local cachename = hash.name
+ if hash.cache then
+ local content = instance.files[cachename]
+ caches.collapsecontent(content)
+ if trace_locating then
+ report_resolving("saving tree '%s'",cachename)
end
- cache[str] = found
+ caches.savecontent(cachename,"files",content)
+ elseif trace_locating then
+ report_resolving("not saving runtime tree '%s'",cachename)
end
end
- return found
end
-resolvers.split_kpse_path = split_kpse_path
-
-function resolvers.splitconfig()
- for i=1,#instance do
- local c = instance[i]
- for k,v in next, c do
- if type(v) == 'string' then
- local t = split_kpse_path(v)
- if #t > 1 then
- c[k] = t
- end
- end
+local function load_databases()
+ locate_file_databases()
+ if instance.diskcache and not instance.renewcache then
+ load_file_databases()
+ if instance.loaderror then
+ generate_file_databases()
+ save_file_databases()
+ end
+ else
+ generate_file_databases()
+ if instance.renewcache then
+ save_file_databases()
end
end
end
-function resolvers.joinconfig()
- local order = instance.order
- for i=1,#order do
- local c = order[i]
- for k,v in next, c do -- indexed?
- if type(v) == 'table' then
- c[k] = file.join_path(v)
- end
+function resolvers.appendhash(type,name,cache)
+ -- safeguard ... tricky as it's actually a bug when seen twice
+ if not instance.hashed[name] then
+ if trace_locating then
+ report_resolving("hash '%s' appended",name)
end
+ insert(instance.hashes, { type = type, name = name, cache = cache } )
+ instance.hashed[name] = cache
end
end
-function resolvers.split_path(str)
- if type(str) == 'table' then
- return str
- else
- return split_kpse_path(str)
+function resolvers.prependhash(type,name,cache)
+ -- safeguard ... tricky as it's actually a bug when seen twice
+ if not instance.hashed[name] then
+ if trace_locating then
+ report_resolving("hash '%s' prepended",name)
+ end
+ insert(instance.hashes, 1, { type = type, name = name, cache = cache } )
+ instance.hashed[name] = cache
end
end
-function resolvers.join_path(str)
- if type(str) == 'table' then
- return file.join_path(str)
+function resolvers.extendtexmfvariable(specification) -- crap, we could better prepend the hash
+ local t = resolvers.splitpath(getenv('TEXMF'))
+ insert(t,1,specification)
+ local newspec = concat(t,";")
+ if instance.environment["TEXMF"] then
+ instance.environment["TEXMF"] = newspec
+ elseif instance.variables["TEXMF"] then
+ instance.variables["TEXMF"] = newspec
else
- return str
+ -- weird
end
+ reset_hashes()
end
function resolvers.splitexpansions()
local ie = instance.expansions
for k,v in next, ie do
- local t, h, p = { }, { }, split_kpse_path(v)
+ local t, tn, h, p = { }, 0, { }, splitconfigurationpath(v)
for kk=1,#p do
local vv = p[kk]
if vv ~= "" and not h[vv] then
- t[#t+1] = vv
+ tn = tn + 1
+ t[tn] = vv
h[vv] = true
end
end
@@ -9184,343 +11600,92 @@ end
-- end of split/join code
-function resolvers.saveoldconfig()
- resolvers.splitconfig()
- resolvers.save_data('configuration')
- resolvers.joinconfig()
-end
-
-resolvers.configbanner = [[
--- This is a Luatex configuration file created by 'luatools.lua' or
--- 'luatex.exe' directly. For comment, suggestions and questions you can
--- contact the ConTeXt Development Team. This configuration file is
--- not copyrighted. [HH & TH]
-]]
-
-function resolvers.serialize(files)
- -- This version is somewhat optimized for the kind of
- -- tables that we deal with, so it's much faster than
- -- the generic serializer. This makes sense because
- -- luatools and mtxtools are called frequently. Okay,
- -- we pay a small price for properly tabbed tables.
- local t = { }
- local function dump(k,v,m) -- could be moved inline
- if type(v) == 'string' then
- return m .. "['" .. k .. "']='" .. v .. "',"
- elseif #v == 1 then
- return m .. "['" .. k .. "']='" .. v[1] .. "',"
- else
- return m .. "['" .. k .. "']={'" .. concat(v,"','").. "'},"
- end
- end
- t[#t+1] = "return {"
- if instance.sortdata then
- local sortedfiles = sortedkeys(files)
- for i=1,#sortedfiles do
- local k = sortedfiles[i]
- local fk = files[k]
- if type(fk) == 'table' then
- t[#t+1] = "\t['" .. k .. "']={"
- local sortedfk = sortedkeys(fk)
- for j=1,#sortedfk do
- local kk = sortedfk[j]
- t[#t+1] = dump(kk,fk[kk],"\t\t")
- end
- t[#t+1] = "\t},"
- else
- t[#t+1] = dump(k,fk,"\t")
- end
- end
- else
- for k, v in next, files do
- if type(v) == 'table' then
- t[#t+1] = "\t['" .. k .. "']={"
- for kk,vv in next, v do
- t[#t+1] = dump(kk,vv,"\t\t")
- end
- t[#t+1] = "\t},"
- else
- t[#t+1] = dump(k,v,"\t")
- end
- end
- end
- t[#t+1] = "}"
- return concat(t,"\n")
-end
-
-local data_state = { }
+-- we used to have 'files' and 'configurations' so therefore the following
+-- shared function
-function resolvers.data_state()
- return data_state or { }
-end
-
-function resolvers.save_data(dataname, makename) -- untested without cache overload
- for cachename, files in next, instance[dataname] do
- local name = (makename or file.join)(cachename,dataname)
- local luaname, lucname = name .. ".lua", name .. ".luc"
- if trace_locating then
- logs.report("fileio","preparing '%s' for '%s'",dataname,cachename)
- end
- for k, v in next, files do
- if type(v) == "table" and #v == 1 then
- files[k] = v[1]
- end
- end
- local data = {
- type = dataname,
- root = cachename,
- version = resolvers.cacheversion,
- date = os.date("%Y-%m-%d"),
- time = os.date("%H:%M:%S"),
- content = files,
- uuid = os.uuid(),
- }
- local ok = io.savedata(luaname,resolvers.serialize(data))
- if ok then
- if trace_locating then
- logs.report("fileio","'%s' saved in '%s'",dataname,luaname)
- end
- if utils.lua.compile(luaname,lucname,false,true) then -- no cleanup but strip
- if trace_locating then
- logs.report("fileio","'%s' compiled to '%s'",dataname,lucname)
- end
- else
- if trace_locating then
- logs.report("fileio","compiling failed for '%s', deleting file '%s'",dataname,lucname)
- end
- os.remove(lucname)
- end
- elseif trace_locating then
- logs.report("fileio","unable to save '%s' in '%s' (access error)",dataname,luaname)
- end
- end
-end
-
-function resolvers.load_data(pathname,dataname,filename,makename) -- untested without cache overload
- filename = ((not filename or (filename == "")) and dataname) or filename
- filename = (makename and makename(dataname,filename)) or file.join(pathname,filename)
- local blob = loadfile(filename .. ".luc") or loadfile(filename .. ".lua")
- if blob then
- local data = blob()
- if data and data.content and data.type == dataname and data.version == resolvers.cacheversion then
- data_state[#data_state+1] = data.uuid
- if trace_locating then
- logs.report("fileio","loading '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
- instance[dataname][pathname] = data.content
- else
- if trace_locating then
- logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
- instance[dataname][pathname] = { }
- instance.loaderror = true
- end
- elseif trace_locating then
- logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
-end
-
--- some day i'll use the nested approach, but not yet (actually we even drop
--- engine/progname support since we have only luatex now)
---
--- first texmfcnf.lua files are located, next the cached texmf.cnf files
---
--- return {
--- TEXMFBOGUS = 'effe checken of dit werkt',
--- }
-
-function resolvers.resetconfig()
- identify_own()
- instance.configuration, instance.setup, instance.order, instance.loaderror = { }, { }, { }, false
-end
-
-function resolvers.loadnewconfig()
- local luafiles = instance.luafiles
- for i=1,#luafiles do
- local cnf = luafiles[i]
- local pathname = file.dirname(cnf)
- local filename = file.join(pathname,resolvers.luaname)
- local blob = loadfile(filename)
- if blob then
- local data = blob()
- if data then
- if trace_locating then
- logs.report("fileio","loading configuration file '%s'",filename)
- end
- if true then
- -- flatten to variable.progname
- local t = { }
- for k, v in next, data do -- v = progname
- if type(v) == "string" then
- t[k] = v
- else
- for kk, vv in next, v do -- vv = variable
- if type(vv) == "string" then
- t[vv.."."..v] = kk
- end
- end
- end
- end
- instance['setup'][pathname] = t
- else
- instance['setup'][pathname] = data
- end
- else
- if trace_locating then
- logs.report("fileio","skipping configuration file '%s'",filename)
- end
- instance['setup'][pathname] = { }
- instance.loaderror = true
- end
- elseif trace_locating then
- logs.report("fileio","skipping configuration file '%s'",filename)
- end
- instance.order[#instance.order+1] = instance.setup[pathname]
- if instance.loaderror then break end
- end
-end
-
-function resolvers.loadoldconfig()
- if not instance.renewcache then
- local cnffiles = instance.cnffiles
- for i=1,#cnffiles do
- local cnf = cnffiles[i]
- local dname = file.dirname(cnf)
- resolvers.load_data(dname,'configuration')
- instance.order[#instance.order+1] = instance.configuration[dname]
- if instance.loaderror then break end
- end
- end
- resolvers.joinconfig()
-end
-
-function resolvers.expand_variables()
- local expansions, environment, variables = { }, instance.environment, instance.variables
- local env = resolvers.env
- instance.expansions = expansions
- local engine, progname = instance.engine, instance.progname
- if type(engine) ~= "string" then instance.engine, engine = "", "" end
- if type(progname) ~= "string" then instance.progname, progname = "", "" end
- if engine ~= "" then environment['engine'] = engine end
- if progname ~= "" then environment['progname'] = progname end
- for k,v in next, environment do
- local a, b = match(k,"^(%a+)%_(.*)%s*$")
- if a and b then
- expansions[a..'.'..b] = v
- else
- expansions[k] = v
- end
- end
- for k,v in next, environment do -- move environment to expansions
- if not expansions[k] then expansions[k] = v end
- end
- for k,v in next, variables do -- move variables to expansions
- if not expansions[k] then expansions[k] = v end
- end
- local busy = false
- local function resolve(a)
- busy = true
- return expansions[a] or env(a)
- end
- while true do
- busy = false
- for k,v in next, expansions do
- local s, n = gsub(v,"%$([%a%d%_%-]+)",resolve)
- local s, m = gsub(s,"%$%{([%a%d%_%-]+)%}",resolve)
- if n > 0 or m > 0 then
- expansions[k]= s
- end
- end
- if not busy then break end
- end
- for k,v in next, expansions do
- expansions[k] = gsub(v,"\\", '/')
- end
+function resolvers.datastate()
+ return caches.contentstate()
end
function resolvers.variable(name)
- return entry(instance.variables,name)
+ local name = name and lpegmatch(dollarstripper,name)
+ local result = name and instance.variables[name]
+ return result ~= nil and result or ""
end
function resolvers.expansion(name)
- return entry(instance.expansions,name)
-end
-
-function resolvers.is_variable(name)
- return is_entry(instance.variables,name)
-end
-
-function resolvers.is_expansion(name)
- return is_entry(instance.expansions,name)
+ local name = name and lpegmatch(dollarstripper,name)
+ local result = name and instance.expansions[name]
+ return result ~= nil and result or ""
end
-function resolvers.unexpanded_path_list(str)
+function resolvers.unexpandedpathlist(str)
local pth = resolvers.variable(str)
- local lst = resolvers.split_path(pth)
- return expanded_path_from_list(lst)
+ local lst = resolvers.splitpath(pth)
+ return expandedpathfromlist(lst)
end
-function resolvers.unexpanded_path(str)
- return file.join_path(resolvers.unexpanded_path_list(str))
+function resolvers.unexpandedpath(str)
+ return joinpath(resolvers.unexpandedpathlist(str))
end
-do -- no longer needed
-
- local done = { }
+local done = { }
- function resolvers.reset_extra_path()
- local ep = instance.extra_paths
- if not ep then
- ep, done = { }, { }
- instance.extra_paths = ep
- elseif #ep > 0 then
- instance.lists, done = { }, { }
- end
+function resolvers.resetextrapath()
+ local ep = instance.extra_paths
+ if not ep then
+ ep, done = { }, { }
+ instance.extra_paths = ep
+ elseif #ep > 0 then
+ instance.lists, done = { }, { }
end
+end
- function resolvers.register_extra_path(paths,subpaths)
- local ep = instance.extra_paths or { }
- local n = #ep
- if paths and paths ~= "" then
- if subpaths and subpaths ~= "" then
- for p in gmatch(paths,"[^,]+") do
- -- we gmatch each step again, not that fast, but used seldom
- for s in gmatch(subpaths,"[^,]+") do
- local ps = p .. "/" .. s
- if not done[ps] then
- ep[#ep+1] = resolvers.clean_path(ps)
- done[ps] = true
- end
- end
- end
- else
- for p in gmatch(paths,"[^,]+") do
- if not done[p] then
- ep[#ep+1] = resolvers.clean_path(p)
- done[p] = true
- end
- end
- end
- elseif subpaths and subpaths ~= "" then
- for i=1,n do
+function resolvers.registerextrapath(paths,subpaths)
+ local ep = instance.extra_paths or { }
+ local oldn = #ep
+ local newn = oldn
+ if paths and paths ~= "" then
+ if subpaths and subpaths ~= "" then
+ for p in gmatch(paths,"[^,]+") do
-- we gmatch each step again, not that fast, but used seldom
for s in gmatch(subpaths,"[^,]+") do
- local ps = ep[i] .. "/" .. s
+ local ps = p .. "/" .. s
if not done[ps] then
- ep[#ep+1] = resolvers.clean_path(ps)
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(ps)
done[ps] = true
end
end
end
+ else
+ for p in gmatch(paths,"[^,]+") do
+ if not done[p] then
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(p)
+ done[p] = true
+ end
+ end
end
- if #ep > 0 then
- instance.extra_paths = ep -- register paths
- end
- if #ep > n then
- instance.lists = { } -- erase the cache
+ elseif subpaths and subpaths ~= "" then
+ for i=1,oldn do
+ -- we gmatch each step again, not that fast, but used seldom
+ for s in gmatch(subpaths,"[^,]+") do
+ local ps = ep[i] .. "/" .. s
+ if not done[ps] then
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(ps)
+ done[ps] = true
+ end
+ end
end
end
-
+ if newn > 0 then
+ instance.extra_paths = ep -- register paths
+ end
+ if newn > oldn then
+ instance.lists = { } -- erase the cache
+ end
end
local function made_list(instance,list)
@@ -9528,14 +11693,15 @@ local function made_list(instance,list)
if not ep or #ep == 0 then
return list
else
- local done, new = { }, { }
+ 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
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
else
break
end
@@ -9546,7 +11712,8 @@ local function made_list(instance,list)
local v = ep[k]
if not done[v] then
done[v] = true
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
end
end
-- next the formal paths
@@ -9554,118 +11721,95 @@ local function made_list(instance,list)
local v = list[k]
if not done[v] then
done[v] = true
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
end
end
return new
end
end
-function resolvers.clean_path_list(str)
- local t = resolvers.expanded_path_list(str)
+function resolvers.cleanpathlist(str)
+ local t = resolvers.expandedpathlist(str)
if t then
for i=1,#t do
- t[i] = file.collapse_path(resolvers.clean_path(t[i]))
+ t[i] = collapsepath(resolvers.cleanpath(t[i]))
end
end
return t
end
-function resolvers.expand_path(str)
- return file.join_path(resolvers.expanded_path_list(str))
+function resolvers.expandpath(str)
+ return joinpath(resolvers.expandedpathlist(str))
end
-function resolvers.expanded_path_list(str)
+function resolvers.expandedpathlist(str)
if not str then
- return ep or { } -- ep ?
+ return { }
elseif instance.savelists then
- -- engine+progname hash
- str = gsub(str,"%$","")
+ str = lpegmatch(dollarstripper,str)
if not instance.lists[str] then -- cached
- local lst = made_list(instance,resolvers.split_path(resolvers.expansion(str)))
- instance.lists[str] = expanded_path_from_list(lst)
+ local lst = made_list(instance,resolvers.splitpath(resolvers.expansion(str)))
+ instance.lists[str] = expandedpathfromlist(lst)
end
return instance.lists[str]
else
- local lst = resolvers.split_path(resolvers.expansion(str))
- return made_list(instance,expanded_path_from_list(lst))
- end
-end
-
-function resolvers.expanded_path_list_from_var(str) -- brrr
- local tmp = resolvers.var_of_format_or_suffix(gsub(str,"%$",""))
- if tmp ~= "" then
- return resolvers.expanded_path_list(tmp)
- else
- return resolvers.expanded_path_list(str)
+ local lst = resolvers.splitpath(resolvers.expansion(str))
+ return made_list(instance,expandedpathfromlist(lst))
end
end
-function resolvers.expand_path_from_var(str)
- return file.join_path(resolvers.expanded_path_list_from_var(str))
+function resolvers.expandedpathlistfromvariable(str) -- brrr
+ str = lpegmatch(dollarstripper,str)
+ local tmp = resolvers.variableofformatorsuffix(str)
+ return resolvers.expandedpathlist(tmp ~= "" and tmp or str)
end
-function resolvers.format_of_var(str)
- return formats[str] or formats[alternatives[str]] or ''
-end
-function resolvers.format_of_suffix(str)
- return suffixmap[file.extname(str)] or 'tex'
+function resolvers.expandpathfromvariable(str)
+ return joinpath(resolvers.expandedpathlistfromvariable(str))
end
-function resolvers.variable_of_format(str)
- return formats[str] or formats[alternatives[str]] or ''
+function resolvers.expandbraces(str) -- output variable and brace expansion of STRING
+ local ori = resolvers.variable(str)
+ local pth = expandedpathfromlist(resolvers.splitpath(ori))
+ return joinpath(pth)
end
-function resolvers.var_of_format_or_suffix(str)
- local v = formats[str]
- if v then
- return v
- end
- v = formats[alternatives[str]]
- if v then
- return v
- end
- v = suffixmap[file.extname(str)]
- if v then
- return formats[isf]
+function resolvers.registerfilehash(name,content,someerror)
+ if content then
+ instance.files[name] = content
+ else
+ instance.files[name] = { }
+ if somerror == true then -- can be unset
+ instance.loaderror = someerror
+ end
end
- return ''
-end
-
-function resolvers.expand_braces(str) -- output variable and brace expansion of STRING
- local ori = resolvers.variable(str)
- local pth = expanded_path_from_list(resolvers.split_path(ori))
- return file.join_path(pth)
end
-resolvers.isreadable = { }
-
-function resolvers.isreadable.file(name)
- local readable = lfs.isfile(name) -- brrr
+local function isreadable(name)
+ local readable = lfs.isfile(name) -- not file.is_readable(name) asit can be a dir
if trace_detail then
if readable then
- logs.report("fileio","file '%s' is readable",name)
+ report_resolving("file '%s' is readable",name)
else
- logs.report("fileio","file '%s' is not readable", name)
+ report_resolving("file '%s' is not readable", name)
end
end
return readable
end
-resolvers.isreadable.tex = resolvers.isreadable.file
-
-- name
-- name/name
local function collect_files(names)
- local filelist = { }
+ local filelist, noffiles = { }, 0
for k=1,#names do
local fname = names[k]
if trace_detail then
- logs.report("fileio","checking name '%s'",fname)
+ report_resolving("checking name '%s'",fname)
end
- local bname = file.basename(fname)
- local dname = file.dirname(fname)
+ local bname = filebasename(fname)
+ local dname = filedirname(fname)
if dname == "" or find(dname,"^%.") then
dname = false
else
@@ -9674,11 +11818,11 @@ local function collect_files(names)
local hashes = instance.hashes
for h=1,#hashes do
local hash = hashes[h]
- local blobpath = hash.tag
+ local blobpath = hash.name
local files = blobpath and instance.files[blobpath]
if files then
if trace_detail then
- logs.report("fileio","deep checking '%s' (%s)",blobpath,bname)
+ report_resolving("deep checking '%s' (%s)",blobpath,bname)
end
local blobfile = files[bname]
if not blobfile then
@@ -9690,62 +11834,51 @@ local function collect_files(names)
end
end
if blobfile then
+ local blobroot = files.__path__ or blobpath
if type(blobfile) == 'string' then
if not dname or find(blobfile,dname) then
- filelist[#filelist+1] = {
- hash.type,
- file.join(blobpath,blobfile,bname), -- search
- resolvers.concatinators[hash.type](blobpath,blobfile,bname) -- result
- }
+ 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 '%s', search '%s', result '%s'",variant,search,result)
+ end
+ noffiles = noffiles + 1
+ filelist[noffiles] = { variant, search, result }
end
else
for kk=1,#blobfile do
local vv = blobfile[kk]
if not dname or find(vv,dname) then
- filelist[#filelist+1] = {
- hash.type,
- file.join(blobpath,vv,bname), -- search
- resolvers.concatinators[hash.type](blobpath,vv,bname) -- result
- }
+ 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 '%s', search '%s', result '%s'",variant,search,result)
+ end
+ noffiles = noffiles + 1
+ filelist[noffiles] = { variant, search, result }
end
end
end
end
elseif trace_locating then
- logs.report("fileio","no match in '%s' (%s)",blobpath,bname)
+ report_resolving("no match in '%s' (%s)",blobpath,bname)
end
end
end
- if #filelist > 0 then
- return filelist
- else
- return nil
- end
+ return noffiles > 0 and filelist or nil
end
-function resolvers.suffix_of_format(str)
- if suffixes[str] then
- return suffixes[str][1]
- else
- return ""
- end
-end
-
-function resolvers.suffixes_of_format(str)
- if suffixes[str] then
- return suffixes[str]
- else
- return {}
- end
-end
-
-function resolvers.register_in_trees(name)
+function resolvers.registerintrees(name)
if not find(name,"^%.") then
instance.foundintrees[name] = (instance.foundintrees[name] or 0) + 1 -- maybe only one
end
end
--- split the next one up for readability (bu this module needs a cleanup anyway)
+-- split the next one up for readability (but this module needs a cleanup anyway)
local function can_be_dir(name) -- can become local
local fakepaths = instance.fakepaths
@@ -9756,61 +11889,62 @@ local function can_be_dir(name) -- can become local
fakepaths[name] = 2 -- no directory
end
end
- return (fakepaths[name] == 1)
+ return fakepaths[name] == 1
end
-local function collect_instance_files(filename,collected) -- todo : plugin (scanners, checkers etc)
- local result = collected or { }
+local preparetreepattern = Cs((P(".")/"%%." + P("-")/"%%-" + P(1))^0 * Cc("$"))
+
+-- this one is split in smaller functions but it needs testing
+
+local function collect_instance_files(filename,askedformat,allresults) -- todo : plugin (scanners, checkers etc)
+ local result = { }
local stamp = nil
- filename = file.collapse_path(filename)
+ askedformat = askedformat or ""
+ filename = collapsepath(filename)
-- speed up / beware: format problem
- if instance.remember then
- stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format
+ if instance.remember and not allresults then
+ stamp = filename .. "--" .. askedformat
if instance.found[stamp] then
if trace_locating then
- logs.report("fileio","remembering file '%s'",filename)
+ report_resolving("remembered file '%s'",filename)
end
+ resolvers.registerintrees(filename) -- for tracing used files
return instance.found[stamp]
end
end
- if not dangerous[instance.format or "?"] then
- if resolvers.isreadable.file(filename) then
+ if not dangerous[askedformat] then
+ if isreadable(filename) then
if trace_detail then
- logs.report("fileio","file '%s' found directly",filename)
+ report_resolving("file '%s' found directly",filename)
+ end
+ if stamp then
+ instance.found[stamp] = { filename }
end
- instance.found[stamp] = { filename }
return { filename }
end
end
if find(filename,'%*') then
if trace_locating then
- logs.report("fileio","checking wildcard '%s'", filename)
+ report_resolving("checking wildcard '%s'", filename)
end
- result = resolvers.find_wildcard_files(filename)
+ result = resolvers.findwildcardfiles(filename) -- we can use th elocal
elseif file.is_qualified_path(filename) then
- if resolvers.isreadable.file(filename) then
+ if isreadable(filename) then
if trace_locating then
- logs.report("fileio","qualified name '%s'", filename)
+ report_resolving("qualified name '%s'", filename)
end
result = { filename }
else
- local forcedname, ok, suffix = "", false, file.extname(filename)
+ local forcedname, ok, suffix = "", false, fileextname(filename)
if suffix == "" then -- why
- if instance.format == "" then
- forcedname = filename .. ".tex"
- if resolvers.isreadable.file(forcedname) then
- if trace_locating then
- logs.report("fileio","no suffix, forcing standard filetype 'tex'")
- end
- result, ok = { forcedname }, true
- end
- else
- local suffixes = resolvers.suffixes_of_format(instance.format)
- for _, s in next, suffixes do
+ local format_suffixes = askedformat == "" and resolvers.defaultsuffixes or suffixes[askedformat]
+ if format_suffixes then
+ for i=1,#format_suffixes do
+ local s = format_suffixes[i]
forcedname = filename .. "." .. s
- if resolvers.isreadable.file(forcedname) then
+ if isreadable(forcedname) then
if trace_locating then
- logs.report("fileio","no suffix, forcing format filetype '%s'", s)
+ report_resolving("no suffix, forcing format filetype '%s'", s)
end
result, ok = { forcedname }, true
break
@@ -9821,23 +11955,24 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
if not ok and suffix ~= "" then
-- try to find in tree (no suffix manipulation), here we search for the
-- matching last part of the name
- local basename = file.basename(filename)
- local pattern = gsub(filename .. "$","([%.%-])","%%%1")
- local savedformat = instance.format
+ local basename = filebasename(filename)
+ local pattern = lpegmatch(preparetreepattern,filename)
+ -- messy .. to be sorted out
+ local savedformat = askedformat
local format = savedformat or ""
if format == "" then
- instance.format = resolvers.format_of_suffix(suffix)
+ askedformat = resolvers.formatofsuffix(suffix)
end
if not format then
- instance.format = "othertextfiles" -- kind of everything, maybe texinput is better
+ askedformat = "othertextfiles" -- kind of everything, maybe texinput is better
end
--
if basename ~= filename then
- local resolved = collect_instance_files(basename)
- if #result == 0 then
+ local resolved = collect_instance_files(basename,askedformat,allresults)
+ if #result == 0 then -- shouldn't this be resolved ?
local lowered = lower(basename)
if filename ~= lowered then
- resolved = collect_instance_files(lowered)
+ resolved = collect_instance_files(lowered,askedformat,allresults)
end
end
resolvers.format = savedformat
@@ -9862,57 +11997,60 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
-- end
end
if not ok and trace_locating then
- logs.report("fileio","qualified name '%s'", filename)
+ report_resolving("qualified name '%s'", filename)
end
end
else
-- search spec
- local filetype, extra, done, wantedfiles, ext = '', nil, false, { }, file.extname(filename)
- if ext == "" then
- if not instance.force_suffixes then
- wantedfiles[#wantedfiles+1] = filename
- end
- else
- wantedfiles[#wantedfiles+1] = filename
- end
- if instance.format == "" then
- if ext == "" then
- local forcedname = filename .. '.tex'
- wantedfiles[#wantedfiles+1] = forcedname
- filetype = resolvers.format_of_suffix(forcedname)
- if trace_locating then
- logs.report("fileio","forcing filetype '%s'",filetype)
+ local filetype, done, wantedfiles, ext = '', false, { }, fileextname(filename)
+ -- -- tricky as filename can be bla.1.2.3
+ -- if not suffixmap[ext] then --- probably needs to be done elsewhere too
+ -- wantedfiles[#wantedfiles+1] = filename
+ -- end
+ wantedfiles[#wantedfiles+1] = filename
+ if askedformat == "" then
+ if ext == "" or not suffixmap[ext] then
+ local defaultsuffixes = resolvers.defaultsuffixes
+ for i=1,#defaultsuffixes do
+ local forcedname = filename .. '.' .. defaultsuffixes[i]
+ wantedfiles[#wantedfiles+1] = forcedname
+ filetype = resolvers.formatofsuffix(forcedname)
+ if trace_locating then
+ report_resolving("forcing filetype '%s'",filetype)
+ end
end
else
- filetype = resolvers.format_of_suffix(filename)
+ filetype = resolvers.formatofsuffix(filename)
if trace_locating then
- logs.report("fileio","using suffix based filetype '%s'",filetype)
+ report_resolving("using suffix based filetype '%s'",filetype)
end
end
else
- if ext == "" then
- local suffixes = resolvers.suffixes_of_format(instance.format)
- for _, s in next, suffixes do
- wantedfiles[#wantedfiles+1] = filename .. "." .. s
+ if ext == "" or not suffixmap[ext] then
+ local format_suffixes = suffixes[askedformat]
+ if format_suffixes then
+ for i=1,#format_suffixes do
+ wantedfiles[#wantedfiles+1] = filename .. "." .. format_suffixes[i]
+ end
end
end
- filetype = instance.format
+ filetype = askedformat
if trace_locating then
- logs.report("fileio","using given filetype '%s'",filetype)
+ report_resolving("using given filetype '%s'",filetype)
end
end
- local typespec = resolvers.variable_of_format(filetype)
- local pathlist = resolvers.expanded_path_list(typespec)
+ local typespec = resolvers.variableofformat(filetype)
+ local pathlist = resolvers.expandedpathlist(typespec)
if not pathlist or #pathlist == 0 then
-- no pathlist, access check only / todo == wildcard
if trace_detail then
- logs.report("fileio","checking filename '%s', filetype '%s', wanted files '%s'",filename, filetype or '?',concat(wantedfiles," | "))
+ report_resolving("checking filename '%s', filetype '%s', wanted files '%s'",filename, filetype or '?',concat(wantedfiles," | "))
end
for k=1,#wantedfiles do
local fname = wantedfiles[k]
- if fname and resolvers.isreadable.file(fname) then
+ if fname and isreadable(fname) then
filename, done = fname, true
- result[#result+1] = file.join('.',fname)
+ result[#result+1] = filejoin('.',fname)
break
end
end
@@ -9920,8 +12058,8 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
local filelist = collect_files(wantedfiles)
local fl = filelist and filelist[1]
if fl then
- filename = fl[3]
- result[#result+1] = filename
+ filename = fl[3] -- not local?
+ result[#result+1] = resolvers.resolve(filename)
done = true
end
else
@@ -9930,76 +12068,65 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
local dirlist = { }
if filelist then
for i=1,#filelist do
- dirlist[i] = file.dirname(filelist[i][2]) .. "/"
+ dirlist[i] = filedirname(filelist[i][3]) .. "/" -- was [2] .. gamble
end
end
if trace_detail then
- logs.report("fileio","checking filename '%s'",filename)
+ report_resolving("checking filename '%s'",filename)
end
- -- a bit messy ... esp the doscan setting here
- local doscan
for k=1,#pathlist do
local path = pathlist[k]
- if find(path,"^!!") then doscan = false else doscan = true end
- local pathname = gsub(path,"^!+", '')
+ local pathname = lpegmatch(inhibitstripper,path)
+ local doscan = path == pathname -- no ^!!
done = false
-- using file list
if filelist then
- local expression
-- compare list entries with permitted pattern -- /xx /xx//
- if not find(pathname,"/$") then
- expression = pathname .. "/"
- else
- expression = pathname
- end
- expression = gsub(expression,"([%-%.])","%%%1") -- this also influences
- expression = gsub(expression,"//+$", '/.*') -- later usage of pathname
- expression = gsub(expression,"//", '/.-/') -- not ok for /// but harmless
- expression = "^" .. expression .. "$"
+ local expression = makepathexpression(pathname)
if trace_detail then
- logs.report("fileio","using pattern '%s' for path '%s'",expression,pathname)
+ report_resolving("using pattern '%s' for path '%s'",expression,pathname)
end
for k=1,#filelist do
local fl = filelist[k]
local f = fl[2]
local d = dirlist[k]
if find(d,expression) then
- --- todo, test for readable
- result[#result+1] = fl[3]
- resolvers.register_in_trees(f) -- for tracing used files
+ -- todo, test for readable
+ result[#result+1] = resolvers.resolve(fl[3]) -- no shortcut
done = true
- if instance.allresults then
+ if allresults then
if trace_detail then
- logs.report("fileio","match in hash for file '%s' on path '%s', continue scanning",f,d)
+ report_resolving("match to '%s' in hash for file '%s' and path '%s', continue scanning",expression,f,d)
end
else
if trace_detail then
- logs.report("fileio","match in hash for file '%s' on path '%s', quit scanning",f,d)
+ report_resolving("match to '%s' in hash for file '%s' and path '%s', quit scanning",expression,f,d)
end
break
end
elseif trace_detail then
- logs.report("fileio","no match in hash for file '%s' on path '%s'",f,d)
+ report_resolving("no match to '%s' in hash for file '%s' and path '%s'",expression,f,d)
end
end
end
if not done and doscan then
-- check if on disk / unchecked / does not work at all / also zips
- if resolvers.splitmethod(pathname).scheme == 'file' then -- ?
+ local scheme = url.hasscheme(pathname)
+ if not scheme or scheme == "file" then
local pname = gsub(pathname,"%.%*$",'')
if not find(pname,"%*") then
local ppname = gsub(pname,"/+$","")
if can_be_dir(ppname) then
for k=1,#wantedfiles do
local w = wantedfiles[k]
- local fname = file.join(ppname,w)
- if resolvers.isreadable.file(fname) then
+ local fname = filejoin(ppname,w)
+ if isreadable(fname) then
if trace_detail then
- logs.report("fileio","found '%s' by scanning",fname)
+ report_resolving("found '%s' by scanning",fname)
end
result[#result+1] = fname
done = true
- if not instance.allresults then break end
+ if not allresults then break end
end
end
else
@@ -10009,56 +12136,66 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
end
end
if not done and doscan then
- -- todo: slow path scanning
+ -- todo: slow path scanning ... although we now have tree:// supported in $TEXMF
end
- if done and not instance.allresults then break end
+ if done and not allresults then break end
end
end
end
for k=1,#result do
- result[k] = file.collapse_path(result[k])
+ local rk = collapsepath(result[k])
+ result[k] = rk
+ resolvers.registerintrees(rk) -- for tracing used files
end
- if instance.remember then
+ if stamp then
instance.found[stamp] = result
end
return result
end
-if not resolvers.concatinators then resolvers.concatinators = { } end
+-- -- -- begin of main file search routing -- -- --
-resolvers.concatinators.tex = file.join
-resolvers.concatinators.file = resolvers.concatinators.tex
-function resolvers.find_files(filename,filetype,mustexist)
- if type(mustexist) == boolean then
- -- all set
- elseif type(filetype) == 'boolean' then
- filetype, mustexist = nil, false
- elseif type(filetype) ~= 'string' then
- filetype, mustexist = nil, false
- end
- instance.format = filetype or ''
- local result = collect_instance_files(filename)
+
+
+
+
+
+
+
+
+-- -- -- end of main file search routing -- -- --
+
+local function findfiles(filename,filetype,allresults)
+ local result = collect_instance_files(filename,filetype or "",allresults)
if #result == 0 then
local lowered = lower(filename)
if filename ~= lowered then
- return collect_instance_files(lowered)
+ return collect_instance_files(lowered,filetype or "",allresults)
end
end
- instance.format = ''
return result
end
-function resolvers.find_file(filename,filetype,mustexist)
- return (resolvers.find_files(filename,filetype,mustexist)[1] or "")
+function resolvers.findfiles(filename,filetype)
+ return findfiles(filename,filetype,true)
+end
+
+function resolvers.findfile(filename,filetype)
+ return findfiles(filename,filetype,false)[1] or ""
end
-function resolvers.find_given_files(filename)
- local bname, result = file.basename(filename), { }
+function resolvers.findpath(filename,filetype)
+ return filedirname(findfiles(filename,filetype,false)[1] or "")
+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.tag] or { }
+ local files = instance.files[hash.name] or { }
local blist = files[bname]
if not blist then
local rname = "remap:"..bname
@@ -10070,13 +12207,21 @@ function resolvers.find_given_files(filename)
end
if blist then
if type(blist) == 'string' then
- result[#result+1] = resolvers.concatinators[hash.type](hash.tag,blist,bname) or ""
- if not instance.allresults then break end
+ 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
else
for kk=1,#blist do
local vv = blist[kk]
- result[#result+1] = resolvers.concatinators[hash.type](hash.tag,vv,bname) or ""
- if not instance.allresults then break end
+ 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
+ end
end
end
end
@@ -10084,24 +12229,31 @@ function resolvers.find_given_files(filename)
return result
end
-function resolvers.find_given_file(filename)
- return (resolvers.find_given_files(filename)[1] or "")
+function resolvers.findgivenfiles(filename)
+ return findgivenfiles(filename,true)
+end
+
+function resolvers.findgivenfile(filename)
+ return findgivenfiles(filename,false)[1] or ""
end
-local function doit(path,blist,bname,tag,kind,result,allresults)
+local function doit(path,blist,bname,tag,variant,result,allresults)
local done = false
- if blist and kind then
+ 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
- result[#result+1] = resolvers.concatinators[kind](tag,blist,bname) or ""
+ 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
- result[#result+1] = resolvers.concatinators[kind](tag,vv,bname) or ""
+ local full = methodhandler('concatinators',variant,tag,vv,bname) or ""
+ result[#result+1] = resolve(full)
done = true
if not allresults then break end
end
@@ -10111,30 +12263,32 @@ local function doit(path,blist,bname,tag,kind,result,allresults)
return done
end
-function resolvers.find_wildcard_files(filename) -- todo: remap:
- local result = { }
- local bname, dname = file.basename(filename), file.dirname(filename)
- local path = gsub(dname,"^*/","")
- path = gsub(path,"*",".*")
- path = gsub(path,"-","%%-")
- if dname == "" then
- path = ".*"
- end
- local name = bname
- name = gsub(name,"*",".*")
- name = gsub(name,"-","%%-")
- path = lower(path)
- name = lower(name)
- local files, allresults, done = instance.files, instance.allresults, false
+
+local makewildcard = Cs(
+ (P("^")^0 * P("/") * P(-1) + P(-1)) /".*"
+ + (P("^")^0 * P("/") / "")^0 * (P("*")/".*" + P("-")/"%%-" + P(".")/"%%." + P("?")/"."+ P("\\")/"/" + P(1))^0
+)
+
+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 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
if find(name,"%*") then
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- local tag, kind = hash.tag, hash.type
- for kk, hh in next, files[hash.tag] do
+ 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,tag,kind,result,allresults) then done = true end
+ if doit(path,hh,kk,hashname,hashtype,result,allresults) then done = true end
if done and not allresults then break end
end
end
@@ -10144,8 +12298,8 @@ function resolvers.find_wildcard_files(filename) -- todo: remap:
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- local tag, kind = hash.tag, hash.type
- if doit(path,files[tag][bname],bname,tag,kind,result,allresults) then done = true end
+ local hashname, hashtype = hash.name, hash.type
+ if doit(path,files[hashname][bname],bname,hashname,hashtype,result,allresults) then done = true end
if done and not allresults then break end
end
end
@@ -10154,8 +12308,12 @@ function resolvers.find_wildcard_files(filename) -- todo: remap:
return result
end
-function resolvers.find_wildcard_file(filename)
- return (resolvers.find_wildcard_files(filename)[1] or "")
+function resolvers.findwildcardfiles(filename,result)
+ return findwildcardfiles(filename,true,result)
+end
+
+function resolvers.findwildcardfile(filename)
+ return findwildcardfiles(filename,false)[1] or ""
end
-- main user functions
@@ -10166,34 +12324,33 @@ end
function resolvers.load(option)
statistics.starttiming(instance)
- resolvers.resetconfig()
- resolvers.identify_cnf()
- resolvers.load_lua() -- will become the new method
- resolvers.expand_variables()
- resolvers.load_cnf() -- will be skipped when we have a lua file
- resolvers.expand_variables()
+ identify_configuration_files()
+ load_configuration_files()
if option ~= "nofiles" then
- resolvers.load_hash()
+ load_databases()
resolvers.automount()
end
statistics.stoptiming(instance)
+ local files = instance.files
+ return files and next(files) and true
+end
+
+local function report(str)
+ if trace_locating then
+ report_resolving(str) -- has already verbose
+ else
+ print(str)
+ end
end
-function resolvers.for_files(command, files, filetype, mustexist)
+function resolvers.dowithfilesandreport(command, files, ...) -- will move
if files and #files > 0 then
- local function report(str)
- if trace_locating then
- logs.report("fileio",str) -- has already verbose
- else
- print(str)
- end
- end
if trace_locating then
report('') -- ?
end
for f=1,#files do
local file = files[f]
- local result = command(file,filetype,mustexist)
+ local result = command(file,...)
if type(result) == 'string' then
report(result)
else
@@ -10205,21 +12362,16 @@ function resolvers.for_files(command, files, filetype, mustexist)
end
end
--- strtab
+-- obsolete
-resolvers.var_value = resolvers.variable -- output the value of variable $STRING.
-resolvers.expand_var = resolvers.expansion -- output variable expansion of STRING.
+-- resolvers.varvalue = resolvers.variable -- output the value of variable $STRING.
+-- resolvers.expandvar = resolvers.expansion -- output variable expansion of STRING.
-function resolvers.show_path(str) -- output search path for file type NAME
- return file.join_path(resolvers.expanded_path_list(resolvers.format_of_var(str)))
+function resolvers.showpath(str) -- output search path for file type NAME
+ return joinpath(resolvers.expandedpathlist(resolvers.formatofvariable(str)))
end
--- resolvers.find_file(filename)
--- resolvers.find_file(filename, filetype, mustexist)
--- resolvers.find_file(filename, mustexist)
--- resolvers.find_file(filename, filetype)
-
-function resolvers.register_file(files, name, path)
+function resolvers.registerfile(files, name, path)
if files[name] then
if type(files[name]) == 'string' then
files[name] = { files[name], path }
@@ -10231,101 +12383,24 @@ function resolvers.register_file(files, name, path)
end
end
-function resolvers.splitmethod(filename)
- if not filename then
- return { } -- safeguard
- elseif type(filename) == "table" then
- return filename -- already split
- elseif not find(filename,"://") then
- return { scheme="file", path = filename, original=filename } -- quick hack
- else
- return url.hashed(filename)
- end
-end
-
-function table.sequenced(t,sep) -- temp here
- local s = { }
- for k, v in next, t do -- indexed?
- s[#s+1] = k .. "=" .. tostring(v)
- end
- return concat(s, sep or " | ")
-end
-
-function resolvers.methodhandler(what, filename, filetype) -- ...
- filename = file.collapse_path(filename)
- local specification = (type(filename) == "string" and resolvers.splitmethod(filename)) or filename -- no or { }, let it bomb
- local scheme = specification.scheme
- if resolvers[what][scheme] then
- if trace_locating then
- logs.report("fileio","handler '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
- end
- return resolvers[what][scheme](filename,filetype) -- todo: specification
- else
- return resolvers[what].tex(filename,filetype) -- todo: specification
- end
-end
-
-function resolvers.clean_path(str)
- if str then
- str = gsub(str,"\\","/")
- str = gsub(str,"^!+","")
- str = gsub(str,"^~",resolvers.homedir)
- return str
- else
- return nil
- end
-end
-
-function resolvers.do_with_path(name,func)
- local pathlist = resolvers.expanded_path_list(name)
+function resolvers.dowithpath(name,func)
+ local pathlist = resolvers.expandedpathlist(name)
for i=1,#pathlist do
- func("^"..resolvers.clean_path(pathlist[i]))
+ func("^"..resolvers.cleanpath(pathlist[i]))
end
end
-function resolvers.do_with_var(name,func)
- func(expanded_var(name))
+function resolvers.dowithvariable(name,func)
+ func(expandedvariable(name))
end
-function resolvers.with_files(pattern,handle)
- local hashes = instance.hashes
- for i=1,#hashes do
- local hash = hashes[i]
- local blobpath = hash.tag
- local blobtype = hash.type
- if blobpath then
- local files = instance.files[blobpath]
- if files then
- for k,v in next, files do
- if find(k,"^remap:") then
- k = files[k]
- v = files[k] -- chained
- end
- if find(k,pattern) then
- if type(v) == "string" then
- handle(blobtype,blobpath,v,k)
- else
- for _,vv in next, v do -- indexed
- handle(blobtype,blobpath,vv,k)
- end
- end
- end
- end
- end
- end
- end
-end
-
-function resolvers.locate_format(name)
- local barename, fmtname = gsub(name,"%.%a+$",""), ""
- if resolvers.usecache then
- local path = file.join(caches.setpath("formats")) -- maybe platform
- fmtname = file.join(path,barename..".fmt") or ""
- end
+function resolvers.locateformat(name)
+ local barename = file.removesuffix(name) -- gsub(name,"%.%a+$","")
+ local fmtname = caches.getfirstreadablefile(barename..".fmt","formats") or ""
if fmtname == "" then
- fmtname = resolvers.find_files(barename..".fmt")[1] or ""
+ fmtname = resolvers.findfile(barename..".fmt")
+ fmtname = resolvers.cleanpath(fmtname)
end
- fmtname = resolvers.clean_path(fmtname)
if fmtname ~= "" then
local barename = file.removesuffix(fmtname)
local luaname, lucname, luiname = barename .. ".lua", barename .. ".luc", barename .. ".lui"
@@ -10340,7 +12415,7 @@ function resolvers.locate_format(name)
return nil, nil
end
-function resolvers.boolean_variable(str,default)
+function resolvers.booleanvariable(str,default)
local b = resolvers.expansion(str)
if b == "" then
return default
@@ -10350,204 +12425,62 @@ function resolvers.boolean_variable(str,default)
end
end
-texconfig.kpse_init = false
-
-kpse = { original = kpse } setmetatable(kpse, { __index = function(k,v) return resolvers[v] end } )
-
--- for a while
-
-input = resolvers
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['data-tmp'] = {
- 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"
-}
-
---[[ldx--
-<p>This module deals with caching data. It sets up the paths and
-implements loaders and savers for tables. Best is to set the
-following variable. When not set, the usual paths will be
-checked. Personally I prefer the (users) temporary path.</p>
-
-</code>
-TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
-</code>
-
-<p>Currently we do no locking when we write files. This is no real
-problem because most caching involves fonts and the chance of them
-being written at the same time is small. We also need to extend
-luatools with a recache feature.</p>
---ldx]]--
-
-local format, lower, gsub = string.format, string.lower, string.gsub
-
-local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end) -- not used yet
-
-caches = caches or { }
-
-caches.path = caches.path or nil
-caches.base = caches.base or "luatex-cache"
-caches.more = caches.more or "context"
-caches.direct = false -- true is faster but may need huge amounts of memory
-caches.tree = false
-caches.paths = caches.paths or nil
-caches.force = true -- changed for TEXLIVE by TH
-caches.defaults = { "TEXMFCACHE", "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
-
-function caches.temp()
- local cachepath = nil
- local function check(list,isenv)
- if not cachepath then
- for k=1,#list do
- local v = list[k]
- cachepath = (isenv and (os.env[v] or "")) or v or ""
- if cachepath == "" then
- -- next
- else
- cachepath = resolvers.clean_path(cachepath)
- if lfs.isdir(cachepath) and file.iswritable(cachepath) then -- lfs.attributes(cachepath,"mode") == "directory"
- break
- elseif caches.force or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then
- dir.mkdirs(cachepath)
- if lfs.isdir(cachepath) and file.iswritable(cachepath) then
- break
+function resolvers.dowithfilesintree(pattern,handle,before,after) -- will move, can be a nice iterator instead
+ local instance = resolvers.instance
+ local hashes = instance.hashes
+ for i=1,#hashes do
+ local hash = hashes[i]
+ local blobtype = hash.type
+ local blobpath = hash.name
+ if blobpath then
+ 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 next, files do
+ total = total + 1
+ if find(k,"^remap:") then
+ k = files[k]
+ v = k -- files[k] -- chained
+ end
+ if 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
end
end
end
- cachepath = nil
+ end
+ if after then
+ after(blobtype,blobpath,pattern,total,checked,done)
end
end
end
- check(resolvers.clean_path_list("TEXMFCACHE") or { })
- check(caches.defaults,true)
- if not cachepath then
- print("\nfatal error: there is no valid (writable) cache path defined\n")
- os.exit()
- elseif not lfs.isdir(cachepath) then -- lfs.attributes(cachepath,"mode") ~= "directory"
- print(format("\nfatal error: cache path %s is not a directory\n",cachepath))
- os.exit()
- end
- cachepath = file.collapse_path(cachepath)
- function caches.temp()
- return cachepath
- end
- return cachepath
-end
-
-function caches.configpath()
- return table.concat(resolvers.instance.cnffiles,";")
-end
-
-function caches.hashed(tree)
- return md5.hex(gsub(lower(tree),"[\\\/]+","/"))
-end
-
-function caches.treehash()
- local tree = caches.configpath()
- if not tree or tree == "" then
- return false
- else
- return caches.hashed(tree)
- end
-end
-
-function caches.setpath(...)
- if not caches.path then
- if not caches.path then
- caches.path = caches.temp()
- end
- caches.path = resolvers.clean_path(caches.path) -- to be sure
- caches.tree = caches.tree or caches.treehash()
- if caches.tree then
- caches.path = dir.mkdirs(caches.path,caches.base,caches.more,caches.tree)
- else
- caches.path = dir.mkdirs(caches.path,caches.base,caches.more)
- end
- end
- if not caches.path then
- caches.path = '.'
- end
- caches.path = resolvers.clean_path(caches.path)
- local dirs = { ... }
- if #dirs > 0 then
- local pth = dir.mkdirs(caches.path,...)
- return pth
- end
- caches.path = dir.expand_name(caches.path)
- return caches.path
-end
-
-function caches.definepath(category,subcategory)
- return function()
- return caches.setpath(category,subcategory)
- end
-end
-
-function caches.setluanames(path,name)
- return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
end
-function caches.loaddata(path,name)
- local tmaname, tmcname = caches.setluanames(path,name)
- local loader = loadfile(tmcname) or loadfile(tmaname)
- if loader then
- loader = loader()
- collectgarbage("step")
- return loader
- else
- return false
- end
-end
+resolvers.obsolete = resolvers.obsolete or { }
+local obsolete = resolvers.obsolete
---~ function caches.loaddata(path,name)
---~ local tmaname, tmcname = caches.setluanames(path,name)
---~ return dofile(tmcname) or dofile(tmaname)
---~ end
-
-function caches.iswritable(filepath,filename)
- local tmaname, tmcname = caches.setluanames(filepath,filename)
- return file.iswritable(tmaname)
-end
-
-function caches.savedata(filepath,filename,data,raw)
- local tmaname, tmcname = caches.setluanames(filepath,filename)
- local reduce, simplify = true, true
- if raw then
- reduce, simplify = false, false
- end
- data.cache_uuid = os.uuid()
- if caches.direct then
- file.savedata(tmaname, table.serialize(data,'return',false,true,false)) -- no hex
- else
- table.tofile(tmaname, data,'return',false,true,false) -- maybe not the last true
- end
- local cleanup = resolvers.boolean_variable("PURGECACHE", false)
- local strip = resolvers.boolean_variable("LUACSTRIP", true)
- utils.lua.compile(tmaname, tmcname, cleanup, strip)
-end
-
--- here we use the cache for format loading (texconfig.[formatname|jobname])
-
---~ if tex and texconfig and texconfig.formatname and texconfig.formatname == "" then
-if tex and texconfig and (not texconfig.formatname or texconfig.formatname == "") and input and resolvers.instance then
- if not texconfig.luaname then texconfig.luaname = "cont-en.lua" end -- or luc
- texconfig.formatname = caches.setpath("formats") .. "/" .. gsub(texconfig.luaname,"%.lu.$",".fmt")
-end
+resolvers.find_file = resolvers.findfile obsolete.find_file = resolvers.findfile
+resolvers.find_files = resolvers.findfiles obsolete.find_files = resolvers.findfiles
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['data-res'] = {
+if not modules then modules = { } end modules ['data-pre'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -10555,17 +12488,28 @@ if not modules then modules = { } end modules ['data-res'] = {
license = "see context related readme files"
}
---~ print(resolvers.resolve("abc env:tmp file:cont-en.tex path:cont-en.tex full:cont-en.tex rel:zapf/one/p-chars.tex"))
+-- It could be interesting to hook the resolver in the file
+-- opener so that unresolved prefixes travel around and we
+-- get more abstraction.
+
+-- As we use this beforehand we will move this up in the chain
+-- of loading.
+
-local upper, lower, gsub = string.upper, string.lower, string.gsub
+local resolvers = resolvers
+local prefixes = utilities.storage.allocate()
+resolvers.prefixes = prefixes
-local prefixes = { }
+local gsub = string.gsub
+local cleanpath, findgivenfile, expansion = resolvers.cleanpath, resolvers.findgivenfile, resolvers.expansion
+local getenv = resolvers.getenv -- we can probably also use resolvers.expansion
+local P, Cs, lpegmatch = lpeg.P, lpeg.Cs, lpeg.match
prefixes.environment = function(str)
- return resolvers.clean_path(os.getenv(str) or os.getenv(upper(str)) or os.getenv(lower(str)) or "")
+ return cleanpath(expansion(str))
end
-prefixes.relative = function(str,n)
+prefixes.relative = function(str,n) -- lfs.isfile
if io.exists(str) then
-- nothing
elseif io.exists("./" .. str) then
@@ -10581,7 +12525,7 @@ prefixes.relative = function(str,n)
end
end
end
- return resolvers.clean_path(str)
+ return cleanpath(str)
end
prefixes.auto = function(str)
@@ -10593,18 +12537,34 @@ prefixes.auto = function(str)
end
prefixes.locate = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path((fullname ~= "" and fullname) or str)
+ local fullname = findgivenfile(str) or ""
+ return cleanpath((fullname ~= "" and fullname) or str)
end
prefixes.filename = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path(file.basename((fullname ~= "" and fullname) or str))
+ local fullname = findgivenfile(str) or ""
+ return cleanpath(file.basename((fullname ~= "" and fullname) or str))
end
prefixes.pathname = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path(file.dirname((fullname ~= "" and fullname) or str))
+ local fullname = findgivenfile(str) or ""
+ return cleanpath(file.dirname((fullname ~= "" and fullname) or str))
+end
+
+prefixes.selfautoloc = function(str)
+ return cleanpath(file.join(getenv('SELFAUTOLOC'),str))
+end
+
+prefixes.selfautoparent = function(str)
+ return cleanpath(file.join(getenv('SELFAUTOPARENT'),str))
+end
+
+prefixes.selfautodir = function(str)
+ return cleanpath(file.join(getenv('SELFAUTODIR'),str))
+end
+
+prefixes.home = function(str)
+ return cleanpath(file.join(getenv('HOME'),str))
end
prefixes.env = prefixes.environment
@@ -10633,19 +12593,28 @@ local function _resolve_(method,target)
end
end
-local function resolve(str)
- if type(str) == "table" then
- for k=1,#str do
- local v = str[k]
- str[k] = resolve(v) or v
- end
- elseif str and str ~= "" then
- str = gsub(str,"([a-z]+):([^ \"\']*)",_resolve_)
+local resolved, abstract = { }, { }
+
+function resolvers.resetresolve(str)
+ resolved, abstract = { }, { }
+end
+
+local function resolve(str) -- use schemes, this one is then for the commandline only
+ local res = resolved[str]
+ if not res then
+ res = gsub(str,"([a-z][a-z]+):([^ \"\']*)",_resolve_)
+ resolved[str] = res
+ abstract[res] = str
end
- return str
+ return res
+end
+
+local function unresolve(str)
+ return abstract[str] or str
end
-resolvers.resolve = resolve
+resolvers.resolve = resolve
+resolvers.unresolve = unresolve
if os.uname then
@@ -10657,6 +12626,42 @@ if os.uname then
end
+if os.type == "unix" then
+
+ local pattern
+
+ local function makepattern(t,k,v)
+ local colon = P(":")
+ local 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)
+ if t then
+ t[k] = v
+ end
+ end
+
+ makepattern()
+
+ getmetatable(prefixes).__newindex = makepattern
+
+ function resolvers.repath(str)
+ return lpegmatch(pattern,str)
+ end
+
+else -- already the default:
+
+ function resolvers.repath(str)
+ return str
+ end
+
+end
+
end -- of closure
@@ -10670,13 +12675,23 @@ if not modules then modules = { } end modules ['data-inp'] = {
license = "see context related readme files"
}
-resolvers.finders = resolvers.finders or { }
-resolvers.openers = resolvers.openers or { }
-resolvers.loaders = resolvers.loaders or { }
+local allocate = utilities.storage.allocate
+local resolvers = resolvers
+
+local methodhandler = resolvers.methodhandler
+local registermethod = resolvers.registermethod
+
+local finders = allocate { helpers = { }, notfound = function() end }
+local openers = allocate { helpers = { }, notfound = function() end }
+local loaders = allocate { helpers = { }, notfound = function() return false, nil, 0 end }
-resolvers.finders.notfound = { nil }
-resolvers.openers.notfound = { nil }
-resolvers.loaders.notfound = { false, nil, 0 }
+registermethod("finders", finders, "uri")
+registermethod("openers", openers, "uri")
+registermethod("loaders", loaders, "uri")
+
+resolvers.finders = finders
+resolvers.openers = openers
+resolvers.loaders = loaders
end -- of closure
@@ -10691,15 +12706,23 @@ if not modules then modules = { } end modules ['data-out'] = {
license = "see context related readme files"
}
-outputs = outputs or { }
+local allocate = utilities.storage.allocate
+local resolvers = resolvers
+
+local registermethod = resolvers.registermethod
+
+local savers = allocate { helpers = { } }
+resolvers.savers = savers
+
+registermethod("savers", savers, "uri")
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['data-con'] = {
+if not modules then modules = { } end modules ['data-fil'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -10707,6 +12730,124 @@ if not modules then modules = { } end modules ['data-con'] = {
license = "see context related readme files"
}
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_files = logs.reporter("resolvers","files")
+
+local resolvers = resolvers
+
+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
+
+local checkgarbage = utilities.garbagecollector and utilities.garbagecollector.check
+
+function locators.file(specification)
+ local name = specification.filename
+ local realname = resolvers.resolve(name) -- no shortcut
+ if realname and realname ~= '' and lfs.isdir(realname) then
+ if trace_locating then
+ report_files("file locator '%s' found as '%s'",name,realname)
+ end
+ resolvers.appendhash('file',name,true) -- cache
+ elseif trace_locating then
+ report_files("file locator '%s' not found",name)
+ end
+end
+
+function hashers.file(specification)
+ local name = specification.filename
+ local content = caches.loadcontent(name,'files')
+ resolvers.registerfilehash(name,content,content==nil)
+end
+
+function generators.file(specification)
+ local path = specification.filename
+ local content = resolvers.scanfiles(path)
+ resolvers.registerfilehash(path,content,true)
+end
+
+concatinators.file = file.join
+
+function finders.file(specification,filetype)
+ local filename = specification.filename
+ local foundname = resolvers.findfile(filename,filetype)
+ if foundname and foundname ~= "" then
+ if trace_locating then
+ report_files("file finder: '%s' found",filename)
+ end
+ return foundname
+ else
+ if trace_locating then
+ report_files("file finder: %s' not found",filename)
+ end
+ return finders.notfound()
+ end
+end
+
+-- The default textopener will be overloaded later on.
+
+function openers.helpers.textopener(tag,filename,f)
+ return {
+ reader = function() return f:read () end,
+ close = function() logs.show_close(filename) return f:close() end,
+ }
+end
+
+function openers.file(specification,filetype)
+ local filename = specification.filename
+ if filename and filename ~= "" then
+ local f = io.open(filename,"r")
+ if f then
+ if trace_locating then
+ report_files("file opener, '%s' opened",filename)
+ end
+ return openers.helpers.textopener("file",filename,f)
+ end
+ end
+ if trace_locating then
+ report_files("file opener, '%s' not found",filename)
+ end
+ return openers.notfound()
+end
+
+function loaders.file(specification,filetype)
+ local filename = specification.filename
+ if filename and filename ~= "" then
+ local f = io.open(filename,"rb")
+ if f then
+ logs.show_load(filename)
+ if trace_locating then
+ report_files("file loader, '%s' loaded",filename)
+ end
+ local s = f:read("*a")
+ if checkgarbage then
+ checkgarbage(#s)
+ end
+ f:close()
+ if s then
+ return true, s, #s
+ end
+ end
+ end
+ if trace_locating then
+ report_files("file loader, '%s' not found",filename)
+ end
+ return loaders.notfound()
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-con'] = {
+ version = 1.100,
+ 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 format, lower, gsub = string.format, string.lower, string.gsub
local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
@@ -10726,50 +12867,63 @@ table structures without bothering about the disk cache.</p>
<p>Examples of usage can be found in the font related code.</p>
--ldx]]--
-containers = containers or { }
-
+containers = containers or { }
+local containers = containers
containers.usecache = true
+local report_containers = logs.reporter("resolvers","containers")
+
local function report(container,tag,name)
if trace_cache or trace_containers then
- logs.report(format("%s cache",container.subcategory),"%s: %s",tag,name or 'invalid')
+ report_containers("container: %s, tag: %s, name: %s",container.subcategory,tag,name or 'invalid')
end
end
local allocated = { }
--- tracing
+local mt = {
+ __index = function(t,k)
+ if k == "writable" then
+ local writable = caches.getwritablepath(t.category,t.subcategory) or { "." }
+ t.writable = writable
+ return writable
+ elseif k == "readables" then
+ local readables = caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ t.readables = readables
+ return readables
+ end
+ end,
+ __storage__ = true
+}
function containers.define(category, subcategory, version, enabled)
- return function()
- if category and subcategory then
- local c = allocated[category]
- if not c then
- c = { }
- allocated[category] = c
- end
- local s = c[subcategory]
- if not s then
- s = {
- category = category,
- subcategory = subcategory,
- storage = { },
- enabled = enabled,
- version = version or 1.000,
- trace = false,
- path = caches and caches.setpath and caches.setpath(category,subcategory),
- }
- c[subcategory] = s
- end
- return s
- else
- return nil
+ if category and subcategory then
+ local c = allocated[category]
+ if not c then
+ c = { }
+ allocated[category] = c
+ end
+ local s = c[subcategory]
+ if not s then
+ s = {
+ category = category,
+ subcategory = subcategory,
+ storage = { },
+ enabled = enabled,
+ version = version or math.pi, -- after all, this is TeX
+ trace = false,
+ -- writable = caches.getwritablepath and caches.getwritablepath (category,subcategory) or { "." },
+ -- readables = caches.getreadablepaths and caches.getreadablepaths(category,subcategory) or { "." },
+ }
+ setmetatable(s,mt)
+ c[subcategory] = s
end
+ return s
end
end
function containers.is_usable(container, name)
- return container.enabled and caches and caches.iswritable(container.path, name)
+ return container.enabled and caches and caches.is_writable(container.writable, name)
end
function containers.is_valid(container, name)
@@ -10782,18 +12936,20 @@ function containers.is_valid(container, name)
end
function containers.read(container,name)
- if container.enabled and caches and not container.storage[name] and containers.usecache then
- container.storage[name] = caches.loaddata(container.path,name)
- if containers.is_valid(container,name) then
+ local storage = container.storage
+ local stored = storage[name]
+ if not stored and container.enabled and caches and containers.usecache then
+ stored = caches.loaddata(container.readables,name)
+ if stored and stored.cache_version == container.version then
report(container,"loaded",name)
else
- container.storage[name] = nil
+ stored = nil
end
- end
- if container.storage[name] then
+ storage[name] = stored
+ elseif stored then
report(container,"reusing",name)
end
- return container.storage[name]
+ return stored
end
function containers.write(container, name, data)
@@ -10802,7 +12958,7 @@ function containers.write(container, name, data)
if container.enabled and caches then
local unique, shared = data.unique, data.shared
data.unique, data.shared = nil, nil
- caches.savedata(container.path, name, data)
+ caches.savedata(container.writable, name, data)
report(container,"saved",name)
data.unique, data.shared = unique, shared
end
@@ -10837,50 +12993,18 @@ local format, lower, gsub, find = string.format, string.lower, string.gsub, stri
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
--- since we want to use the cache instead of the tree, we will now
--- reimplement the saver.
-
-local save_data = resolvers.save_data
-local load_data = resolvers.load_data
+local report_mounts = logs.reporter("resolvers","mounts")
-resolvers.cachepath = nil -- public, for tracing
-resolvers.usecache = true -- public, for tracing
-
-function resolvers.save_data(dataname)
- save_data(dataname, function(cachename,dataname)
- resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
- if resolvers.usecache then
- resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
- return file.join(resolvers.cachepath(),caches.hashed(cachename))
- else
- return file.join(cachename,dataname)
- end
- end)
-end
-
-function resolvers.load_data(pathname,dataname,filename)
- load_data(pathname,dataname,filename,function(dataname,filename)
- resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
- if resolvers.usecache then
- resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
- return file.join(resolvers.cachepath(),caches.hashed(pathname))
- else
- if not filename or (filename == "") then
- filename = dataname
- end
- return file.join(pathname,filename)
- end
- end)
-end
+local resolvers = resolvers
-- we will make a better format, maybe something xml or just text or lua
resolvers.automounted = resolvers.automounted or { }
function resolvers.automount(usecache)
- local mountpaths = resolvers.clean_path_list(resolvers.expansion('TEXMFMOUNT'))
+ local mountpaths = resolvers.cleanpathlist(resolvers.expansion('TEXMFMOUNT'))
if (not mountpaths or #mountpaths == 0) and usecache then
- mountpaths = { caches.setpath("mount") }
+ mountpaths = caches.getreadablepaths("mount")
end
if mountpaths and #mountpaths > 0 then
statistics.starttiming(resolvers.instance)
@@ -10894,7 +13018,7 @@ function resolvers.automount(usecache)
-- skip
elseif find(line,"^zip://") then
if trace_locating then
- logs.report("fileio","mounting %s",line)
+ report_mounts("mounting %s",line)
end
table.insert(resolvers.automounted,line)
resolvers.usezipfile(line)
@@ -10910,40 +13034,40 @@ end
-- status info
-statistics.register("used config path", function() return caches.configpath() end)
-statistics.register("used cache path", function() return caches.temp() or "?" end)
+statistics.register("used config file", function() return caches.configfiles() end)
+statistics.register("used cache path", function() return caches.usedpaths() end)
-- experiment (code will move)
-function statistics.save_fmt_status(texname,formatbanner,sourcefile) -- texname == formatname
+function statistics.savefmtstatus(texname,formatbanner,sourcefile) -- texname == formatname
local enginebanner = status.list().banner
if formatbanner and enginebanner and sourcefile then
local luvname = file.replacesuffix(texname,"luv")
local luvdata = {
enginebanner = enginebanner,
formatbanner = formatbanner,
- sourcehash = md5.hex(io.loaddata(resolvers.find_file(sourcefile)) or "unknown"),
+ sourcehash = md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"),
sourcefile = sourcefile,
}
io.savedata(luvname,table.serialize(luvdata,true))
end
end
-function statistics.check_fmt_status(texname)
+function statistics.checkfmtstatus(texname)
local enginebanner = status.list().banner
if enginebanner and texname then
local luvname = file.replacesuffix(texname,"luv")
if lfs.isfile(luvname) then
local luv = dofile(luvname)
if luv and luv.sourcefile then
- local sourcehash = md5.hex(io.loaddata(resolvers.find_file(luv.sourcefile)) or "unknown")
+ local sourcehash = md5.hex(io.loaddata(resolvers.findfile(luv.sourcefile)) or "unknown")
local luvbanner = luv.enginebanner or "?"
if luvbanner ~= enginebanner then
- return string.format("engine mismatch (luv:%s <> bin:%s)",luvbanner,enginebanner)
+ return format("engine mismatch (luv: %s <> bin: %s)",luvbanner,enginebanner)
end
local luvhash = luv.sourcehash or "?"
if luvhash ~= sourcehash then
- return string.format("source mismatch (luv:%s <> bin:%s)",luvhash,sourcehash)
+ return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash)
end
else
return "invalid status file"
@@ -10968,25 +13092,30 @@ if not modules then modules = { } end modules ['data-zip'] = {
license = "see context related readme files"
}
+-- partly redone .. needs testing
+
local format, find, match = string.format, string.find, string.match
-local unpack = unpack or table.unpack
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local report_zip = logs.reporter("resolvers","zip")
+
-- zip:///oeps.zip?name=bla/bla.tex
-- zip:///oeps.zip?tree=tex/texmf-local
-- zip:///texmf.zip?tree=/tex/texmf
-- zip:///texmf.zip?tree=/tex/texmf-local
-- zip:///texmf-mine.zip?tree=/tex/texmf-projects
-zip = zip or { }
-zip.archives = zip.archives or { }
-zip.registeredfiles = zip.registeredfiles or { }
+local resolvers = resolvers
+
+zip = zip or { }
+local zip = zip
-local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
-local locators, hashers, concatinators = resolvers.locators, resolvers.hashers, resolvers.concatinators
+zip.archives = zip.archives or { }
+local archives = zip.archives
-local archives = zip.archives
+zip.registeredfiles = zip.registeredfiles or { }
+local registeredfiles = zip.registeredfiles
local function validzip(str) -- todo: use url splitter
if not find(str,"^zip://") then
@@ -11002,7 +13131,7 @@ function zip.openarchive(name)
else
local arch = archives[name]
if not arch then
- local full = resolvers.find_file(name) or ""
+ local full = resolvers.findfile(name) or ""
arch = (full ~= "" and zip.open(full)) or false
archives[name] = arch
end
@@ -11017,163 +13146,162 @@ function zip.closearchive(name)
end
end
-function locators.zip(specification) -- where is this used? startup zips (untested)
- specification = resolvers.splitmethod(specification)
- local zipfile = specification.path
- local zfile = zip.openarchive(name) -- tricky, could be in to be initialized tree
+function resolvers.locators.zip(specification)
+ local archive = specification.filename
+ local zipfile = archive and archive ~= "" and zip.openarchive(archive) -- tricky, could be in to be initialized tree
if trace_locating then
- if zfile then
- logs.report("fileio","zip locator, archive '%s' found",specification.original)
+ if zipfile then
+ report_zip("locator, archive '%s' found",archive)
else
- logs.report("fileio","zip locator, archive '%s' not found",specification.original)
+ report_zip("locator, archive '%s' not found",archive)
end
end
end
-function hashers.zip(tag,name)
+function resolvers.hashers.zip(specification)
+ local archive = specification.filename
if trace_locating then
- logs.report("fileio","loading zip file '%s' as '%s'",name,tag)
+ report_zip("loading file '%s'",archive)
end
- resolvers.usezipfile(format("%s?tree=%s",tag,name))
+ resolvers.usezipfile(specification.original)
end
-function concatinators.zip(tag,path,name)
+function resolvers.concatinators.zip(zipfile,path,name) -- ok ?
if not path or path == "" then
- return format('%s?name=%s',tag,name)
+ return format('%s?name=%s',zipfile,name)
else
- return format('%s?name=%s/%s',tag,path,name)
+ return format('%s?name=%s/%s',zipfile,path,name)
end
end
-function resolvers.isreadable.zip(name)
- return true
-end
-
-function finders.zip(specification,filetype)
- specification = resolvers.splitmethod(specification)
- if specification.path then
- local q = url.query(specification.query)
- if q.name then
- local zfile = zip.openarchive(specification.path)
+function resolvers.finders.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip finder, archive '%s' found",specification.path)
+ report_zip("finder, archive '%s' found",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
dfile = zfile:close()
if trace_locating then
- logs.report("fileio","zip finder, file '%s' found",q.name)
+ report_zip("finder, file '%s' found",queryname)
end
return specification.original
elseif trace_locating then
- logs.report("fileio","zip finder, file '%s' not found",q.name)
+ report_zip("finder, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip finder, unknown archive '%s'",specification.path)
+ report_zip("finder, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip finder, '%s' not found",filename)
+ report_zip("finder, '%s' not found",original)
end
- return unpack(finders.notfound)
+ return resolvers.finders.notfound()
end
-function openers.zip(specification)
- local zipspecification = resolvers.splitmethod(specification)
- if zipspecification.path then
- local q = url.query(zipspecification.query)
- if q.name then
- local zfile = zip.openarchive(zipspecification.path)
+function resolvers.openers.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip opener, archive '%s' opened",zipspecification.path)
+ report_zip("opener, archive '%s' opened",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
- logs.show_open(specification)
if trace_locating then
- logs.report("fileio","zip opener, file '%s' found",q.name)
+ report_zip("opener, file '%s' found",queryname)
end
- return openers.text_opener(specification,dfile,'zip')
+ return resolvers.openers.helpers.textopener('zip',original,dfile)
elseif trace_locating then
- logs.report("fileio","zip opener, file '%s' not found",q.name)
+ report_zip("opener, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip opener, unknown archive '%s'",zipspecification.path)
+ report_zip("opener, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip opener, '%s' not found",filename)
+ report_zip("opener, '%s' not found",original)
end
- return unpack(openers.notfound)
+ return resolvers.openers.notfound()
end
-function loaders.zip(specification)
- specification = resolvers.splitmethod(specification)
- if specification.path then
- local q = url.query(specification.query)
- if q.name then
- local zfile = zip.openarchive(specification.path)
+function resolvers.loaders.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip loader, archive '%s' opened",specification.path)
+ report_zip("loader, archive '%s' opened",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
- logs.show_load(filename)
+ logs.show_load(original)
if trace_locating then
- logs.report("fileio","zip loader, file '%s' loaded",filename)
+ report_zip("loader, file '%s' loaded",original)
end
local s = dfile:read("*all")
dfile:close()
return true, s, #s
elseif trace_locating then
- logs.report("fileio","zip loader, file '%s' not found",q.name)
+ report_zip("loader, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip loader, unknown archive '%s'",specification.path)
+ report_zip("loader, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip loader, '%s' not found",filename)
+ report_zip("loader, '%s' not found",original)
end
- return unpack(openers.notfound)
+ return resolvers.openers.notfound()
end
-- zip:///somefile.zip
-- zip:///somefile.zip?tree=texmf-local -> mount
-function resolvers.usezipfile(zipname)
- zipname = validzip(zipname)
- local specification = resolvers.splitmethod(zipname)
- local zipfile = specification.path
- if zipfile and not zip.registeredfiles[zipname] then
- local tree = url.query(specification.query).tree or ""
- local z = zip.openarchive(zipfile)
+function resolvers.usezipfile(archive)
+ local specification = resolvers.splitmethod(archive) -- to be sure
+ local archive = specification.filename
+ if archive and not registeredfiles[archive] then
+ local z = zip.openarchive(archive)
if z then
- local instance = resolvers.instance
+ local tree = url.query(specification.query).tree or ""
if trace_locating then
- logs.report("fileio","zip registering, registering archive '%s'",zipname)
- end
- statistics.starttiming(instance)
- resolvers.prepend_hash('zip',zipname,zipfile)
- resolvers.extend_texmf_var(zipname) -- resets hashes too
- zip.registeredfiles[zipname] = z
- instance.files[zipname] = resolvers.register_zip_file(z,tree or "")
- statistics.stoptiming(instance)
+ report_zip("registering, registering archive '%s'",archive)
+ end
+ statistics.starttiming(resolvers.instance)
+ resolvers.prependhash('zip',archive)
+ resolvers.extendtexmfvariable(archive) -- resets hashes too
+ registeredfiles[archive] = z
+ instance.files[archive] = resolvers.registerzipfile(z,tree)
+ statistics.stoptiming(resolvers.instance)
elseif trace_locating then
- logs.report("fileio","zip registering, unknown archive '%s'",zipname)
+ report_zip("registering, unknown archive '%s'",archive)
end
elseif trace_locating then
- logs.report("fileio","zip registering, '%s' not found",zipname)
+ report_zip("registering, '%s' not found",archive)
end
end
-function resolvers.register_zip_file(z,tree)
+function resolvers.registerzipfile(z,tree)
local files, filter = { }, ""
if tree == "" then
filter = "^(.+)/(.-)$"
@@ -11181,9 +13309,9 @@ function resolvers.register_zip_file(z,tree)
filter = format("^%s/(.+)/(.-)$",tree)
end
if trace_locating then
- logs.report("fileio","zip registering, using filter '%s'",filter)
+ report_zip("registering, using filter '%s'",filter)
end
- local register, n = resolvers.register_file, 0
+ local register, n = resolvers.registerfile, 0
for i in z:files() do
local path, name = match(i.filename,filter)
if path then
@@ -11198,7 +13326,7 @@ function resolvers.register_zip_file(z,tree)
n = n + 1
end
end
- logs.report("fileio","zip registering, %s files registered",n)
+ report_zip("registering, %s files registered",n)
return files
end
@@ -11207,6 +13335,84 @@ end -- of closure
do -- create closure to overcome 200 locals limit
+if not modules then modules = { } end modules ['data-tre'] = {
+ 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"
+}
+
+-- \input tree://oeps1/**/oeps.tex
+
+local find, gsub, format = string.find, string.gsub, string.format
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_trees = logs.reporter("resolvers","trees")
+
+local resolvers = resolvers
+
+local done, found, notfound = { }, { }, resolvers.finders.notfound
+
+function resolvers.finders.tree(specification)
+ local spec = specification.filename
+ local fnd = found[spec]
+ if fnd == 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
+ 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
+ end
+ end
+ end
+ fnd = notfound() -- false
+ found[spec] = fnd
+ end
+ return fnd
+end
+
+function resolvers.locators.tree(specification)
+ local name = specification.filename
+ if name ~= '' and lfs.isdir(name) then
+ if trace_locating then
+ report_trees("locator '%s' found",name)
+ end
+ resolvers.appendhash('tree',name,false) -- don't cache
+ elseif trace_locating then
+ report_trees("locator '%s' not found",name)
+ end
+end
+
+function resolvers.hashers.tree(specification)
+ local name = specification.filename
+ if trace_locating then
+ report_trees("analysing '%s'",name)
+ end
+ resolvers.methodhandler("hashers",name)
+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
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
if not modules then modules = { } end modules ['data-crl'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
@@ -11215,58 +13421,59 @@ if not modules then modules = { } end modules ['data-crl'] = {
license = "see context related readme files"
}
-local gsub = string.gsub
+-- this one is replaced by data-sch.lua --
-curl = curl or { }
+local gsub = string.gsub
-curl.cached = { }
-curl.cachepath = caches.definepath("curl")
+local resolvers = resolvers
local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
-function curl.fetch(protocol, name)
- local cachename = curl.cachepath() .. "/" .. gsub(name,"[^%a%d%.]+","-")
--- cachename = gsub(cachename,"[\\/]", io.fileseparator)
- cachename = gsub(cachename,"[\\]", "/") -- cleanup
- if not curl.cached[name] then
+resolvers.curl = resolvers.curl or { }
+local curl = resolvers.curl
+
+local cached = { }
+
+local function runcurl(specification)
+ local original = specification.original
+ -- local scheme = specification.scheme
+ local cleanname = gsub(original,"[^%a%d%.]+","-")
+ local cachename = caches.setfirstwritablefile(cleanname,"curl")
+ if not cached[original] then
if not io.exists(cachename) then
- curl.cached[name] = cachename
- local command = "curl --silent --create-dirs --output " .. cachename .. " " .. name -- no protocol .. "://"
+ cached[original] = cachename
+ local command = "curl --silent --create-dirs --output " .. cachename .. " " .. original
os.spawn(command)
end
if io.exists(cachename) then
- curl.cached[name] = cachename
+ cached[original] = cachename
else
- curl.cached[name] = ""
+ cached[original] = ""
end
end
- return curl.cached[name]
+ return cached[original]
end
-function finders.curl(protocol,filename)
- local foundname = curl.fetch(protocol, filename)
- return finders.generic(protocol,foundname,filetype)
-end
-
-function openers.curl(protocol,filename)
- return openers.generic(protocol,filename)
-end
+-- old code: we could be cleaner using specification (see schemes)
-function loaders.curl(protocol,filename)
- return loaders.generic(protocol,filename)
+local function finder(specification,filetype)
+ return resolvers.methodhandler("finders",runcurl(specification),filetype)
end
--- todo: metamethod
+local opener = openers.file
+local loader = loaders.file
-function curl.install(protocol)
- finders[protocol] = function (filename,filetype) return finders.curl(protocol,filename) end
- openers[protocol] = function (filename) return openers.curl(protocol,filename) end
- loaders[protocol] = function (filename) return loaders.curl(protocol,filename) end
+local function install(scheme)
+ finders[scheme] = finder
+ openers[scheme] = opener
+ loaders[scheme] = loader
end
-curl.install('http')
-curl.install('https')
-curl.install('ftp')
+resolvers.curl.install = install
+
+install('http')
+install('https')
+install('ftp')
end -- of closure
@@ -11287,9 +13494,13 @@ if not modules then modules = { } end modules ['data-lua'] = {
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local report_libraries = logs.reporter("resolvers","libraries")
+
local gsub, insert = string.gsub, table.insert
local unpack = unpack or table.unpack
+local resolvers, package = resolvers, package
+
local libformats = { 'luatexlibs', 'tex', 'texmfscripts', 'othertextfiles' } -- 'luainputs'
local clibformats = { 'lib' }
@@ -11298,7 +13509,7 @@ local _path_, libpaths, _cpath_, clibpaths
function package.libpaths()
if not _path_ or package.path ~= _path_ then
_path_ = package.path
- libpaths = file.split_path(_path_,";")
+ libpaths = file.splitpath(_path_,";")
end
return libpaths
end
@@ -11306,7 +13517,7 @@ end
function package.clibpaths()
if not _cpath_ or package.cpath ~= _cpath_ then
_cpath_ = package.cpath
- clibpaths = file.split_path(_cpath_,";")
+ clibpaths = file.splitpath(_cpath_,";")
end
return clibpaths
end
@@ -11315,18 +13526,18 @@ local function thepath(...)
local t = { ... } t[#t+1] = "?.lua"
local path = file.join(unpack(t))
if trace_locating then
- logs.report("fileio","! appending '%s' to 'package.path'",path)
+ report_libraries("! appending '%s' to 'package.path'",path)
end
return path
end
local p_libpaths, a_libpaths = { }, { }
-function package.append_libpath(...)
+function package.appendtolibpath(...)
insert(a_libpath,thepath(...))
end
-function package.prepend_libpath(...)
+function package.prependtolibpath(...)
insert(p_libpaths,1,thepath(...))
end
@@ -11337,31 +13548,30 @@ local function loaded(libpaths,name,simple)
local libpath = libpaths[i]
local resolved = gsub(libpath,"%?",simple)
if trace_locating then -- more detail
- logs.report("fileio","! checking for '%s' on 'package.path': '%s' => '%s'",simple,libpath,resolved)
+ report_libraries("! checking for '%s' on 'package.path': '%s' => '%s'",simple,libpath,resolved)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'package.path': '%s'",name,resolved)
+ report_libraries("! lib '%s' located via 'package.path': '%s'",name,resolved)
end
return loadfile(resolved)
end
end
end
-
package.loaders[2] = function(name) -- was [#package.loaders+1]
if trace_locating then -- mode detail
- logs.report("fileio","! locating '%s'",name)
+ report_libraries("! locating '%s'",name)
end
for i=1,#libformats do
local format = libformats[i]
- local resolved = resolvers.find_file(name,format) or ""
+ local resolved = resolvers.findfile(name,format) or ""
if trace_locating then -- mode detail
- logs.report("fileio","! checking for '%s' using 'libformat path': '%s'",name,format)
+ report_libraries("! checking for '%s' using 'libformat path': '%s'",name,format)
end
if resolved ~= "" then
if trace_locating then
- logs.report("fileio","! lib '%s' located via environment: '%s'",name,resolved)
+ report_libraries("! lib '%s' located via environment: '%s'",name,resolved)
end
return loadfile(resolved)
end
@@ -11379,16 +13589,16 @@ package.loaders[2] = function(name) -- was [#package.loaders+1]
for i=1,#clibformats do
-- better have a dedicated loop
local format = clibformats[i]
- local paths = resolvers.expanded_path_list_from_var(format)
+ local paths = resolvers.expandedpathlistfromvariable(format)
for p=1,#paths do
local path = paths[p]
local resolved = file.join(path,libname)
if trace_locating then -- mode detail
- logs.report("fileio","! checking for '%s' using 'clibformat path': '%s'",libname,path)
+ report_libraries("! checking for '%s' using 'clibformat path': '%s'",libname,path)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'clibformat': '%s'",libname,resolved)
+ report_libraries("! lib '%s' located via 'clibformat': '%s'",libname,resolved)
end
return package.loadlib(resolved,name)
end
@@ -11398,140 +13608,43 @@ package.loaders[2] = function(name) -- was [#package.loaders+1]
local libpath = clibpaths[i]
local resolved = gsub(libpath,"?",simple)
if trace_locating then -- more detail
- logs.report("fileio","! checking for '%s' on 'package.cpath': '%s'",simple,libpath)
+ report_libraries("! checking for '%s' on 'package.cpath': '%s'",simple,libpath)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'package.cpath': '%s'",name,resolved)
+ report_libraries("! lib '%s' located via 'package.cpath': '%s'",name,resolved)
end
return package.loadlib(resolved,name)
end
end
-- just in case the distribution is messed up
if trace_loading then -- more detail
- logs.report("fileio","! checking for '%s' using 'luatexlibs': '%s'",name)
+ report_libraries("! checking for '%s' using 'luatexlibs': '%s'",name)
end
- local resolved = resolvers.find_file(file.basename(name),'luatexlibs') or ""
+ local resolved = resolvers.findfile(file.basename(name),'luatexlibs') or ""
if resolved ~= "" then
if trace_locating then
- logs.report("fileio","! lib '%s' located by basename via environment: '%s'",name,resolved)
+ report_libraries("! lib '%s' located by basename via environment: '%s'",name,resolved)
end
return loadfile(resolved)
end
if trace_locating then
- logs.report("fileio",'? unable to locate lib: %s',name)
+ report_libraries('? unable to locate lib: %s',name)
end
-- return "unable to locate " .. name
end
resolvers.loadlualib = require
+-- -- -- --
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['luat-kps'] = {
- version = 1.001,
- comment = "companion to luatools.lua",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
---[[ldx--
-<p>This file is used when we want the input handlers to behave like
-<type>kpsewhich</type>. What to do with the following:</p>
-
-<typing>
-{$SELFAUTOLOC,$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}
-$SELFAUTOLOC : /usr/tex/bin/platform
-$SELFAUTODIR : /usr/tex/bin
-$SELFAUTOPARENT : /usr/tex
-</typing>
+package.obsolete = package.obsolete or { }
-<p>How about just forgetting about them?</p>
---ldx]]--
+package.append_libpath = appendtolibpath -- will become obsolete
+package.prepend_libpath = prependtolibpath -- will become obsolete
-local suffixes = resolvers.suffixes
-local formats = resolvers.formats
-
-suffixes['gf'] = { '<resolution>gf' }
-suffixes['pk'] = { '<resolution>pk' }
-suffixes['base'] = { 'base' }
-suffixes['bib'] = { 'bib' }
-suffixes['bst'] = { 'bst' }
-suffixes['cnf'] = { 'cnf' }
-suffixes['mem'] = { 'mem' }
-suffixes['mf'] = { 'mf' }
-suffixes['mfpool'] = { 'pool' }
-suffixes['mft'] = { 'mft' }
-suffixes['mppool'] = { 'pool' }
-suffixes['graphic/figure'] = { 'eps', 'epsi' }
-suffixes['texpool'] = { 'pool' }
-suffixes['PostScript header'] = { 'pro' }
-suffixes['ist'] = { 'ist' }
-suffixes['web'] = { 'web', 'ch' }
-suffixes['cweb'] = { 'w', 'web', 'ch' }
-suffixes['cmap files'] = { 'cmap' }
-suffixes['lig files'] = { 'lig' }
-suffixes['bitmap font'] = { }
-suffixes['MetaPost support'] = { }
-suffixes['TeX system documentation'] = { }
-suffixes['TeX system sources'] = { }
-suffixes['dvips config'] = { }
-suffixes['type42 fonts'] = { }
-suffixes['web2c files'] = { }
-suffixes['other text files'] = { }
-suffixes['other binary files'] = { }
-suffixes['opentype fonts'] = { 'otf' }
-
-suffixes['fmt'] = { 'fmt' }
-suffixes['texmfscripts'] = { 'rb','lua','py','pl' }
-
-suffixes['pdftex config'] = { }
-suffixes['Troff fonts'] = { }
-
-suffixes['ls-R'] = { }
-
---[[ldx--
-<p>If you wondered abou tsome of the previous mappings, how about
-the next bunch:</p>
---ldx]]--
-
-formats['bib'] = ''
-formats['bst'] = ''
-formats['mft'] = ''
-formats['ist'] = ''
-formats['web'] = ''
-formats['cweb'] = ''
-formats['MetaPost support'] = ''
-formats['TeX system documentation'] = ''
-formats['TeX system sources'] = ''
-formats['Troff fonts'] = ''
-formats['dvips config'] = ''
-formats['graphic/figure'] = ''
-formats['ls-R'] = ''
-formats['other text files'] = ''
-formats['other binary files'] = ''
-
-formats['gf'] = ''
-formats['pk'] = ''
-formats['base'] = 'MFBASES'
-formats['cnf'] = ''
-formats['mem'] = 'MPMEMS'
-formats['mf'] = 'MFINPUTS'
-formats['mfpool'] = 'MFPOOL'
-formats['mppool'] = 'MPPOOL'
-formats['texpool'] = 'TEXPOOL'
-formats['PostScript header'] = 'TEXPSHEADERS'
-formats['cmap files'] = 'CMAPFONTS'
-formats['type42 fonts'] = 'T42FONTS'
-formats['web2c files'] = 'WEB2C'
-formats['pdftex config'] = 'PDFTEXCONFIG'
-formats['texmfscripts'] = 'TEXMFSCRIPTS'
-formats['bitmap font'] = ''
-formats['lig files'] = 'LIGFONTS'
+package.obsolete.append_libpath = appendtolibpath -- will become obsolete
+package.obsolete.prepend_libpath = prependtolibpath -- will become obsolete
end -- of closure
@@ -11547,49 +13660,54 @@ if not modules then modules = { } end modules ['data-aux'] = {
}
local find = string.find
+local type, next = type, next
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
-function resolvers.update_script(oldname,newname) -- oldname -> own.name, not per se a suffix
+local resolvers = resolvers
+
+local report_scripts = logs.reporter("resolvers","scripts")
+
+function resolvers.updatescript(oldname,newname) -- oldname -> own.name, not per se a suffix
local scriptpath = "scripts/context/lua"
newname = file.addsuffix(newname,"lua")
- local oldscript = resolvers.clean_path(oldname)
+ local oldscript = resolvers.cleanpath(oldname)
if trace_locating then
- logs.report("fileio","to be replaced old script %s", oldscript)
+ report_scripts("to be replaced old script %s", oldscript)
end
- local newscripts = resolvers.find_files(newname) or { }
+ local newscripts = resolvers.findfiles(newname) or { }
if #newscripts == 0 then
if trace_locating then
- logs.report("fileio","unable to locate new script")
+ report_scripts("unable to locate new script")
end
else
for i=1,#newscripts do
- local newscript = resolvers.clean_path(newscripts[i])
+ local newscript = resolvers.cleanpath(newscripts[i])
if trace_locating then
- logs.report("fileio","checking new script %s", newscript)
+ report_scripts("checking new script %s", newscript)
end
if oldscript == newscript then
if trace_locating then
- logs.report("fileio","old and new script are the same")
+ report_scripts("old and new script are the same")
end
elseif not find(newscript,scriptpath) then
if trace_locating then
- logs.report("fileio","new script should come from %s",scriptpath)
+ report_scripts("new script should come from %s",scriptpath)
end
elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
if trace_locating then
- logs.report("fileio","invalid new script name")
+ report_scripts("invalid new script name")
end
else
local newdata = io.loaddata(newscript)
if newdata then
if trace_locating then
- logs.report("fileio","old script content replaced by new content")
+ report_scripts("old script content replaced by new content")
end
io.savedata(oldscript,newdata)
break
elseif trace_locating then
- logs.report("fileio","unable to load new script")
+ report_scripts("unable to load new script")
end
end
end
@@ -11609,72 +13727,133 @@ if not modules then modules = { } end modules ['data-tmf'] = {
license = "see context related readme files"
}
-local find, gsub, match = string.find, string.gsub, string.match
-local getenv, setenv = os.getenv, os.setenv
+local resolvers = resolvers
--- loads *.tmf files in minimal tree roots (to be optimized and documented)
+local report_tds = logs.reporter("resolvers","tds")
-function resolvers.check_environment(tree)
- logs.simpleline()
- setenv('TMP', getenv('TMP') or getenv('TEMP') or getenv('TMPDIR') or getenv('HOME'))
- setenv('TEXOS', getenv('TEXOS') or ("texmf-" .. os.platform))
- setenv('TEXPATH', gsub(tree or "tex","\/+$",''))
- setenv('TEXMFOS', getenv('TEXPATH') .. "/" .. getenv('TEXOS'))
- logs.simpleline()
- logs.simple("preset : TEXPATH => %s", getenv('TEXPATH'))
- logs.simple("preset : TEXOS => %s", getenv('TEXOS'))
- logs.simple("preset : TEXMFOS => %s", getenv('TEXMFOS'))
- logs.simple("preset : TMP => %s", getenv('TMP'))
- logs.simple('')
-end
+-- = <<
+-- ? ??
+-- < +=
+-- > =+
-function resolvers.load_environment(name) -- todo: key=value as well as lua
- local f = io.open(name)
- if f then
- for line in f:lines() do
- if find(line,"^[%%%#]") then
- -- skip comment
- else
- local key, how, value = match(line,"^(.-)%s*([<=>%?]+)%s*(.*)%s*$")
- if how then
- value = gsub(value,"%%(.-)%%", function(v) return getenv(v) or "" end)
- if how == "=" or how == "<<" then
- setenv(key,value)
- elseif how == "?" or how == "??" then
- setenv(key,getenv(key) or value)
- elseif how == "<" or how == "+=" then
- if getenv(key) then
- setenv(key,getenv(key) .. io.fileseparator .. value)
- else
- setenv(key,value)
- end
- elseif how == ">" or how == "=+" then
- if getenv(key) then
- setenv(key,value .. io.pathseparator .. getenv(key))
- else
- setenv(key,value)
- end
- end
- end
- end
+function resolvers.load_tree(tree,resolve)
+ if type(tree) == "string" and tree ~= "" then
+
+ local getenv, setenv = resolvers.getenv, resolvers.setenv
+
+ -- later might listen to the raw osenv var as well
+ local texos = "texmf-" .. os.platform
+
+ local oldroot = environment.texroot
+ local newroot = file.collapsepath(tree)
+
+ local newtree = file.join(newroot,texos)
+ local newpath = file.join(newtree,"bin")
+
+ if not lfs.isdir(newtree) then
+ report_tds("no '%s' under tree %s",texos,tree)
+ os.exit()
end
- f:close()
+ if not lfs.isdir(newpath) then
+ report_tds("no '%s/bin' under tree %s",texos,tree)
+ os.exit()
+ end
+
+ local texmfos = newtree
+
+ environment.texroot = newroot
+ environment.texos = texos
+ environment.texmfos = texmfos
+
+ -- Beware, we need to obey the relocatable autoparent so we
+ -- set TEXMFCNF to its raw value. This is somewhat tricky when
+ -- we run a mkii job from within. Therefore, in mtxrun, there
+ -- is a resolve applied when we're in mkii/kpse mode.
+
+ setenv('SELFAUTOPARENT', newroot)
+ setenv('SELFAUTODIR', newtree)
+ setenv('SELFAUTOLOC', newpath)
+ setenv('TEXROOT', newroot)
+ setenv('TEXOS', texos)
+ setenv('TEXMFOS', texmfos)
+ setenv('TEXMFCNF', resolvers.luacnfspec, not resolve)
+ setenv("PATH", newpath .. io.pathseparator .. getenv("PATH"))
+
+ report_tds("changing from root '%s' to '%s'",oldroot,newroot)
+ report_tds("prepending '%s' to binary path",newpath)
+ report_tds()
end
end
-function resolvers.load_tree(tree)
- if tree and tree ~= "" then
- local setuptex = 'setuptex.tmf'
- if lfs.attributes(tree, "mode") == "directory" then -- check if not nil
- setuptex = tree .. "/" .. setuptex
- else
- setuptex = tree
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-lst'] = {
+ 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"
+}
+
+-- used in mtxrun, can be loaded later .. todo
+
+local find, concat, upper, format = string.find, table.concat, string.upper, string.format
+
+resolvers.listers = resolvers.listers or { }
+
+local resolvers = resolvers
+
+local report_lists = logs.reporter("resolvers","lists")
+
+local function tabstr(str)
+ if type(str) == 'table' then
+ return concat(str," | ")
+ else
+ return str
+ end
+end
+
+function resolvers.listers.variables(pattern)
+ local instance = resolvers.instance
+ local environment = instance.environment
+ local variables = instance.variables
+ local expansions = instance.expansions
+ local pattern = upper(pattern or "")
+ local configured = { }
+ local order = instance.order
+ for i=1,#order do
+ for k, v in next, order[i] do
+ if v ~= nil and configured[k] == nil then
+ configured[k] = v
+ end
end
- if io.exists(setuptex) then
- resolvers.check_environment(tree)
- resolvers.load_environment(setuptex)
+ end
+ local env = table.fastcopy(environment)
+ local var = table.fastcopy(variables)
+ local exp = table.fastcopy(expansions)
+ for key, value in table.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",resolvers.resolve(expansions[key]) or "unset")
end
end
+ instance.environment = table.fastcopy(env)
+ instance.variables = table.fastcopy(var)
+ instance.expansions = table.fastcopy(exp)
+end
+
+function resolvers.listers.configurations(report)
+ local configurations = resolvers.instance.specification
+ local report = report or texio.write_nl
+ for i=1,#configurations do
+ report(resolvers.resolve(configurations[i]))
+ end
end
@@ -11694,9 +13873,15 @@ if not modules then modules = { } end modules ['luat-sta'] = {
local gmatch, match = string.gmatch, string.match
local type = type
-states = states or { }
-states.data = states.data or { }
-states.hash = states.hash or { }
+states = states or { }
+local states = states
+
+states.data = states.data or { }
+local data = states.data
+
+states.hash = states.hash or { }
+local hash = states.hash
+
states.tag = states.tag or ""
states.filename = states.filename or ""
@@ -11706,7 +13891,7 @@ function states.save(filename,tag)
io.savedata(filename,
"-- generator : luat-sta.lua\n" ..
"-- state tag : " .. tag .. "\n\n" ..
- table.serialize(states.data[tag or states.tag] or {},true)
+ table.serialize(data[tag or states.tag] or {},true)
)
end
@@ -11714,11 +13899,11 @@ function states.load(filename,tag)
states.filename = filename
states.tag = tag or "whatever"
states.filename = file.addsuffix(states.filename,'lus')
- states.data[states.tag], states.hash[states.tag] = (io.exists(filename) and dofile(filename)) or { }, { }
+ data[states.tag], hash[states.tag] = (io.exists(filename) and dofile(filename)) or { }, { }
end
-function states.set_by_tag(tag,key,value,default,persistent)
- local d, h = states.data[tag], states.hash[tag]
+local function set_by_tag(tag,key,value,default,persistent)
+ local d, h = data[tag], hash[tag]
if d then
if type(d) == "table" then
local dkey, hkey = key, key
@@ -11738,8 +13923,10 @@ function states.set_by_tag(tag,key,value,default,persistent)
end
dkey, hkey = post, key
end
- if type(value) == nil then
- value = value or default
+ if value == nil then
+ value = default
+ elseif value == false then
+ -- special case
elseif persistent then
value = value or d[dkey] or default
else
@@ -11748,144 +13935,202 @@ function states.set_by_tag(tag,key,value,default,persistent)
d[dkey], h[hkey] = value, value
elseif type(d) == "string" then
-- weird
- states.data[tag], states.hash[tag] = value, value
+ data[tag], hash[tag] = value, value
end
end
end
-function states.get_by_tag(tag,key,default)
- local h = states.hash[tag]
+local function get_by_tag(tag,key,default)
+ local h = hash[tag]
if h and h[key] then
return h[key]
else
- local d = states.data[tag]
+ local d = data[tag]
if d then
for k in gmatch(key,"[^%.]+") do
local dk = d[k]
- if dk then
+ if dk ~= nil then
d = dk
else
return default
end
end
- return d or default
+ if d == false then
+ return false
+ else
+ return d or default
+ end
end
end
end
+states.set_by_tag = set_by_tag
+states.get_by_tag = get_by_tag
+
function states.set(key,value,default,persistent)
- states.set_by_tag(states.tag,key,value,default,persistent)
+ set_by_tag(states.tag,key,value,default,persistent)
end
function states.get(key,default)
- return states.get_by_tag(states.tag,key,default)
-end
-
---~ states.data.update = {
---~ ["version"] = {
---~ ["major"] = 0,
---~ ["minor"] = 1,
---~ },
---~ ["rsync"] = {
---~ ["server"] = "contextgarden.net",
---~ ["module"] = "minimals",
---~ ["repository"] = "current",
---~ ["flags"] = "-rpztlv --stats",
---~ },
---~ ["tasks"] = {
---~ ["update"] = true,
---~ ["make"] = true,
---~ ["delete"] = false,
---~ },
---~ ["platform"] = {
---~ ["host"] = true,
---~ ["other"] = {
---~ ["mswin"] = false,
---~ ["linux"] = false,
---~ ["linux-64"] = false,
---~ ["osx-intel"] = false,
---~ ["osx-ppc"] = false,
---~ ["sun"] = false,
---~ },
---~ },
---~ ["context"] = {
---~ ["available"] = {"current", "beta", "alpha", "experimental"},
---~ ["selected"] = "current",
---~ },
---~ ["formats"] = {
---~ ["cont-en"] = true,
---~ ["cont-nl"] = true,
---~ ["cont-de"] = false,
---~ ["cont-cz"] = false,
---~ ["cont-fr"] = false,
---~ ["cont-ro"] = false,
---~ },
---~ ["engine"] = {
---~ ["pdftex"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ ["pdftex"] = true,
---~ },
---~ },
---~ ["luatex"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ },
---~ },
---~ ["xetex"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ ["xetex"] = false,
---~ },
---~ },
---~ ["metapost"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ ["mpost"] = true,
---~ ["metafun"] = true,
---~ },
---~ },
---~ },
---~ ["fonts"] = {
---~ },
---~ ["doc"] = {
---~ },
---~ ["modules"] = {
---~ ["f-urwgaramond"] = false,
---~ ["f-urwgothic"] = false,
---~ ["t-bnf"] = false,
---~ ["t-chromato"] = false,
---~ ["t-cmscbf"] = false,
---~ ["t-cmttbf"] = false,
---~ ["t-construction-plan"] = false,
---~ ["t-degrade"] = false,
---~ ["t-french"] = false,
---~ ["t-lettrine"] = false,
---~ ["t-lilypond"] = false,
---~ ["t-mathsets"] = false,
---~ ["t-tikz"] = false,
---~ ["t-typearea"] = false,
---~ ["t-vim"] = false,
---~ },
---~ }
-
---~ states.save("teststate", "update")
---~ states.load("teststate", "update")
-
---~ print(states.get_by_tag("update","rsync.server","unknown"))
---~ states.set_by_tag("update","rsync.server","oeps")
---~ print(states.get_by_tag("update","rsync.server","unknown"))
---~ states.save("teststate", "update")
---~ states.load("teststate", "update")
---~ print(states.get_by_tag("update","rsync.server","unknown"))
+ return get_by_tag(states.tag,key,default)
+end
+
+
+
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['luat-fmt'] = {
+ version = 1.001,
+ comment = "companion to mtxrun",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+
+local format = string.format
+
+local report_format = logs.reporter("resolvers","formats")
+
+-- helper for mtxrun
+
+local quoted = string.quoted
+
+local function primaryflags() -- not yet ok
+ local trackers = environment.argument("trackers")
+ local directives = environment.argument("directives")
+ local flags = ""
+ if trackers and trackers ~= "" then
+ flags = flags .. "--trackers=" .. quoted(trackers)
+ end
+ if directives and directives ~= "" then
+ flags = flags .. "--directives=" .. quoted(directives)
+ end
+ return flags
+end
+
+function environment.make_format(name)
+ -- change to format path (early as we need expanded paths)
+ local olddir = lfs.currentdir()
+ local path = caches.getwritablepath("formats") or "" -- maybe platform
+ if path ~= "" then
+ lfs.chdir(path)
+ end
+ report_format("format path: %s",lfs.currentdir())
+ -- check source file
+ local texsourcename = file.addsuffix(name,"mkiv")
+ local fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
+ if fulltexsourcename == "" then
+ texsourcename = file.addsuffix(name,"tex")
+ fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
+ end
+ if fulltexsourcename == "" then
+ report_format("no tex source file with name: %s (mkiv or tex)",name)
+ lfs.chdir(olddir)
+ return
+ else
+ report_format("using tex source file: %s",fulltexsourcename)
+ end
+ local texsourcepath = dir.expandname(file.dirname(fulltexsourcename)) -- really needed
+ -- check specification
+ local specificationname = file.replacesuffix(fulltexsourcename,"lus")
+ local fullspecificationname = resolvers.findfile(specificationname,"tex") or ""
+ if fullspecificationname == "" then
+ specificationname = file.join(texsourcepath,"context.lus")
+ fullspecificationname = resolvers.findfile(specificationname,"tex") or ""
+ end
+ if fullspecificationname == "" then
+ report_format("unknown stub specification: %s",specificationname)
+ lfs.chdir(olddir)
+ return
+ end
+ local specificationpath = file.dirname(fullspecificationname)
+ -- load specification
+ local usedluastub = nil
+ local usedlualibs = dofile(fullspecificationname)
+ if type(usedlualibs) == "string" then
+ usedluastub = file.join(file.dirname(fullspecificationname),usedlualibs)
+ elseif type(usedlualibs) == "table" then
+ report_format("using stub specification: %s",fullspecificationname)
+ local texbasename = file.basename(name)
+ local luastubname = file.addsuffix(texbasename,"lua")
+ local lucstubname = file.addsuffix(texbasename,"luc")
+ -- pack libraries in stub
+ report_format("creating initialization file: %s",luastubname)
+ utilities.merger.selfcreate(usedlualibs,specificationpath,luastubname)
+ -- compile stub file (does not save that much as we don't use this stub at startup any more)
+ local strip = resolvers.booleanvariable("LUACSTRIP", true)
+ if utilities.lua.compile(luastubname,lucstubname) and lfs.isfile(lucstubname) then
+ report_format("using compiled initialization file: %s",lucstubname)
+ usedluastub = lucstubname
+ else
+ report_format("using uncompiled initialization file: %s",luastubname)
+ usedluastub = luastubname
+ end
+ else
+ report_format("invalid stub specification: %s",fullspecificationname)
+ lfs.chdir(olddir)
+ return
+ end
+ -- generate format
+ local command = format("luatex --ini %s --lua=%s %s %sdump",primaryflags(),quoted(usedluastub),quoted(fulltexsourcename),os.platform == "unix" and "\\\\" or "\\")
+ report_format("running command: %s\n",command)
+ os.spawn(command)
+ -- remove related mem files
+ local pattern = file.removesuffix(file.basename(usedluastub)).."-*.mem"
+ -- report_format("removing related mplib format with pattern '%s'", pattern)
+ local mp = dir.glob(pattern)
+ if mp then
+ for i=1,#mp do
+ local name = mp[i]
+ report_format("removing related mplib format %s", file.basename(name))
+ os.remove(name)
+ end
+ end
+ lfs.chdir(olddir)
+end
+
+function environment.run_format(name,data,more)
+ -- hm, rather old code here; we can now use the file.whatever functions
+ if name and name ~= "" then
+ local barename = file.removesuffix(name)
+ local fmtname = caches.getfirstreadablefile(file.addsuffix(barename,"fmt"),"formats")
+ if fmtname == "" then
+ fmtname = resolvers.findfile(file.addsuffix(barename,"fmt")) or ""
+ end
+ fmtname = resolvers.cleanpath(fmtname)
+ if fmtname == "" then
+ report_format("no format with name: %s",name)
+ else
+ local barename = file.removesuffix(name) -- expanded name
+ local luaname = file.addsuffix(barename,"luc")
+ if not lfs.isfile(luaname) then
+ luaname = file.addsuffix(barename,"lua")
+ end
+ if not lfs.isfile(luaname) then
+ report_format("using format name: %s",fmtname)
+ report_format("no luc/lua with name: %s",barename)
+ else
+ local command = format("luatex %s --fmt=%s --lua=%s %s %s",primaryflags(),quoted(barename),quoted(luaname),quoted(data),more ~= "" and quoted(more) or "")
+ report_format("running command: %s",command)
+ os.spawn(command)
+ end
+ end
+ end
+end
end -- of closure
-- end library merge
-own = { } -- not local
+own = { } -- not local, might change
+
+own.libs = { -- order can be made better
-own.libs = { -- todo: check which ones are really needed
'l-string.lua',
'l-lpeg.lua',
'l-table.lua',
@@ -11898,39 +14143,55 @@ own.libs = { -- todo: check which ones are really needed
'l-url.lua',
'l-dir.lua',
'l-boolean.lua',
+ 'l-unicode.lua',
'l-math.lua',
--- 'l-unicode.lua',
--- 'l-tex.lua',
- 'l-utils.lua',
- 'l-aux.lua',
--- 'l-xml.lua',
- 'trac-tra.lua',
+
+ 'util-tab.lua',
+ 'util-sto.lua',
+ 'util-mrg.lua',
+ 'util-lua.lua',
+ 'util-prs.lua',
+ 'util-fmt.lua',
+ 'util-deb.lua',
+
+ 'trac-inf.lua',
+ 'trac-set.lua',
+ 'trac-log.lua',
+ 'trac-pro.lua',
+
+ 'luat-env.lua', -- can come before inf (as in mkiv)
+
'lxml-tab.lua',
'lxml-lpt.lua',
--- 'lxml-ent.lua',
+ -- 'lxml-ent.lua',
'lxml-mis.lua',
'lxml-aux.lua',
'lxml-xml.lua',
- 'luat-env.lua',
- 'trac-inf.lua',
- 'trac-log.lua',
- 'data-res.lua',
+
+ 'data-ini.lua',
+ 'data-exp.lua',
+ 'data-env.lua',
'data-tmp.lua',
+ 'data-met.lua',
+ 'data-res.lua',
'data-pre.lua',
'data-inp.lua',
'data-out.lua',
+ 'data-fil.lua',
'data-con.lua',
'data-use.lua',
-- 'data-tex.lua',
-- 'data-bin.lua',
'data-zip.lua',
+ 'data-tre.lua',
'data-crl.lua',
'data-lua.lua',
- 'data-kps.lua', -- so that we can replace kpsewhich
'data-aux.lua', -- updater
- 'data-tmf.lua', -- tree files
- -- needed ?
- 'luat-sta.lua', -- states
+ 'data-tmf.lua',
+ 'data-lst.lua',
+
+ 'luat-sta.lua',
+ 'luat-fmt.lua',
}
-- We need this hack till luatex is fixed.
@@ -11943,35 +14204,62 @@ end
-- End of hack.
-own.name = (environment and environment.ownname) or arg[0] or 'luatools.lua'
+local format, gsub, gmatch, match = string.format, string.gsub, string.gmatch, string.match
+local concat = table.concat
+own.name = (environment and environment.ownname) or arg[0] or 'mtxrun.lua'
+own.path = gsub(match(own.name,"^(.+)[\\/].-$") or ".","\\","/")
+
+local ownpath, owntree = own.path, environment and environment.ownpath or own.path
+
+own.list = {
+ '.',
+ ownpath ,
+ ownpath .. "/../sources", -- HH's development path
+ owntree .. "/../../texmf-local/tex/context/base",
+ owntree .. "/../../texmf-context/tex/context/base",
+ owntree .. "/../../texmf-dist/tex/context/base",
+ owntree .. "/../../texmf/tex/context/base",
+ owntree .. "/../../../texmf-local/tex/context/base",
+ owntree .. "/../../../texmf-context/tex/context/base",
+ owntree .. "/../../../texmf-dist/tex/context/base",
+ owntree .. "/../../../texmf/tex/context/base",
+}
-own.path = string.match(own.name,"^(.+)[\\/].-$") or "."
-own.list = { '.' }
-if own.path ~= '.' then
- table.insert(own.list,own.path)
-end
-table.insert(own.list,own.path.."/../../texmf-dist/tex/context/base")
-table.insert(own.list,own.path.."/../../../tex/context/base")
-table.insert(own.list,own.path.."/mtx")
-table.insert(own.list,own.path.."/../sources")
+if own.path == "." then table.remove(own.list,1) end
local function locate_libs()
- for _, lib in pairs(own.libs) do
- for _, pth in pairs(own.list) do
- local filename = string.gsub(pth .. "/" .. lib,"\\","/")
+ for l=1,#own.libs do
+ local lib = own.libs[l]
+ for p =1,#own.list do
+ local pth = own.list[p]
+ local filename = pth .. "/" .. lib
+ local found = lfs.isfile(filename)
+ if found then
+ package.path = package.path .. ";" .. pth .. "/?.lua" -- in case l-* does a require
+ return pth
+ end
+ end
+ end
+end
+
+local function load_libs()
+ local found = locate_libs()
+ if found then
+ for l=1,#own.libs do
+ local filename = found .. "/" .. own.libs[l]
local codeblob = loadfile(filename)
if codeblob then
codeblob()
- own.list = { pth } -- speed up te search
- break
end
end
+ else
+ resolvers = nil
end
end
if not resolvers then
- locate_libs()
+ load_libs()
end
if not resolvers then
@@ -11983,20 +14271,56 @@ if not resolvers then
os.exit()
end
-logs.setprogram('MTXrun',"TDS Runner Tool 1.24",environment.arguments["verbose"] or false)
+-- verbosity
-local instance = resolvers.reset()
+local e_verbose = environment.arguments["verbose"]
-local trackspec = environment.argument("trackers") or environment.argument("track")
+if e_verbose then
+ trackers.enable("resolvers.locating")
+end
+
+-- some common flags (also passed through environment)
+
+local e_silent = environment.argument("silent")
+local e_noconsole = environment.argument("noconsole")
+
+local e_trackers = environment.argument("trackers")
+local e_directives = environment.argument("directives")
+local e_experiments = environment.argument("experiments")
+
+if e_silent == true then
+ e_silent = "*"
+end
+
+if type(e_silent) == "string" then
+ if type(e_directives) == "string" then
+ e_directives = format("%s,logs.blocked={%s}",e_directives,e_silent)
+ else
+ e_directives = format("logs.blocked={%s}",e_silent)
+ end
+end
-if trackspec then
- trackers.enable(trackspec)
+if e_noconsole then
+ if type(e_directives) == "string" then
+ e_directives = format("%s,logs.target=file",e_directives)
+ else
+ e_directives = format("logs.target=file")
+ end
end
-runners = runners or { } -- global
-messages = messages or { }
+if e_trackers then trackers .enable(e_trackers) end
+if e_directives then directives .enable(e_directives) end
+if e_experiments then experiments.enable(e_experiments) end
-messages.help = [[
+if not environment.trackers then environment.trackers = e_trackers end
+if not environment.directives then environment.directives = e_directives end
+if not environment.experiments then environment.experiments = e_experiments end
+
+--
+
+local instance = resolvers.reset()
+
+local helpinfo = [[
--script run an mtx script (lua prefered method) (--noquotes), no script gives list
--execute run a script or program (texmfstart method) (--noquotes)
--resolve resolve prefixed arguments
@@ -12011,15 +14335,14 @@ messages.help = [[
--ifchanged=filename only execute when given file has changed (md checksum)
--iftouched=old,new only execute when given file has changed (time stamp)
---make create stubs for (context related) scripts
---remove remove stubs (context related) scripts
+--makestubs create stubs for (context related) scripts
+--removestubs remove stubs (context related) scripts
--stubpath=binpath paths where stubs wil be written
--windows create windows (mswin) stubs
--unix create unix (linux) stubs
--verbose give a bit more info
--trackers=list enable given trackers
---engine=str target engine
--progname=str format or backend
--edit launch editor with found file
@@ -12032,8 +14355,35 @@ messages.help = [[
--forcekpse force using kpse (handy when no mkiv and cache installed but less functionality)
--prefixes show supported prefixes
+
+--generate generate file database
+
+--variables show configuration variables
+--configurations show configuration order
+
+--expand-braces expand complex variable
+--expand-path expand variable (resolve paths)
+--expand-var expand variable (resolve references)
+--show-path show path expansion of ...
+--var-value report value of variable
+--find-file report file location
+--find-path report path of file
+
+--pattern=str filter variables
]]
+local application = logs.application {
+ name = "mtxrun",
+ banner = "ConTeXt TDS Runner Tool 1.30",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
+messages = messages or { } -- for the moment
+
+runners = runners or { } -- global (might become local)
+
runners.applications = {
["lua"] = "luatex --luaonly",
["luc"] = "luatex --luaonly",
@@ -12056,7 +14406,7 @@ runners.registered = {
makempy = { 'makempy.pl', true },
mptopdf = { 'mptopdf.pl', true },
pstopdf = { 'pstopdf.rb', true }, -- converts ps (and some more) images, does some cleaning (replaced)
--- examplex = { 'examplex.rb', false },
+ -- examplex = { 'examplex.rb', false },
concheck = { 'concheck.rb', false },
runtools = { 'runtools.rb', true },
textools = { 'textools.rb', true },
@@ -12065,9 +14415,9 @@ runners.registered = {
rlxtools = { 'rlxtools.rb', true },
pdftools = { 'pdftools.rb', true },
mpstools = { 'mpstools.rb', true },
--- exatools = { 'exatools.rb', true },
+ -- exatools = { 'exatools.rb', true },
xmltools = { 'xmltools.rb', true },
--- luatools = { 'luatools.lua', true },
+ -- luatools = { 'luatools.lua', true },
mtxtools = { 'mtxtools.rb', true },
pdftrimwhite = { 'pdftrimwhite.pl', false }
}
@@ -12086,45 +14436,39 @@ end
function runners.prepare()
local checkname = environment.argument("ifchanged")
- if checkname and checkname ~= "" then
+ if type(checkname) == "string" and checkname ~= "" then
local oldchecksum = file.loadchecksum(checkname)
local newchecksum = file.checksum(checkname)
if oldchecksum == newchecksum then
- logs.simple("file '%s' is unchanged",checkname)
+ if e_verbose then
+ report("file '%s' is unchanged",checkname)
+ end
return "skip"
- else
- logs.simple("file '%s' is changed, processing started",checkname)
+ elseif e_verbose then
+ report("file '%s' is changed, processing started",checkname)
end
file.savechecksum(checkname)
end
- local oldname, newname = string.split(environment.argument("iftouched") or "", ",")
- if oldname and newname and oldname ~= "" and newname ~= "" then
- if not file.needs_updating(oldname,newname) then
- logs.simple("file '%s' and '%s' have same age",oldname,newname)
- return "skip"
- else
- logs.simple("file '%s' is older than '%s'",oldname,newname)
- end
- end
- local tree = environment.argument('tree') or ""
- if environment.argument('autotree') then
- tree = os.getenv('TEXMFSTART_TREE') or os.getenv('TEXMFSTARTTREE') or tree
- end
- if tree and tree ~= "" then
- resolvers.load_tree(tree)
- end
- local env = environment.argument('environment') or ""
- if env and env ~= "" then
- for _,e in pairs(string.split(env)) do
- -- maybe force suffix when not given
- resolvers.load_tree(e)
+ local touchname = environment.argument("iftouched")
+ if type(touchname) == "string" and touchname ~= "" then
+ local oldname, newname = string.split(touchname, ",")
+ if oldname and newname and oldname ~= "" and newname ~= "" then
+ if not file.needs_updating(oldname,newname) then
+ if e_verbose then
+ report("file '%s' and '%s' have same age",oldname,newname)
+ end
+ return "skip"
+ elseif e_verbose then
+ report("file '%s' is older than '%s'",oldname,newname)
+ end
end
end
local runpath = environment.argument("path")
- if runpath and not lfs.chdir(runpath) then
- logs.simple("unable to change to path '%s'",runpath)
+ if type(runpath) == "string" and not lfs.chdir(runpath) then
+ report("unable to change to path '%s'",runpath)
return "error"
end
+ runners.prepare = function() end
return "run"
end
@@ -12137,8 +14481,6 @@ function runners.execute_script(fullname,internal,nosplit)
elseif state == 'skip' then
return true
elseif state == "run" then
- instance.progname = environment.argument("progname") or instance.progname
- instance.format = environment.argument("format") or instance.format
local path, name, suffix, result = file.dirname(fullname), file.basename(fullname), file.extname(fullname), ""
if path ~= "" then
result = fullname
@@ -12155,21 +14497,21 @@ function runners.execute_script(fullname,internal,nosplit)
if suffix == "" then
-- loop over known suffixes
for _,s in pairs(runners.suffixes) do
- result = resolvers.find_file(name .. "." .. s, 'texmfscripts')
+ result = resolvers.findfile(name .. "." .. s, 'texmfscripts')
if result ~= "" then
break
end
end
elseif runners.applications[suffix] then
- result = resolvers.find_file(name, 'texmfscripts')
+ result = resolvers.findfile(name, 'texmfscripts')
else
-- maybe look on path
- result = resolvers.find_file(name, 'other text files')
+ result = resolvers.findfile(name, 'other text files')
end
end
if result and result ~= "" then
if not no_split then
- local before, after = environment.split_arguments(fullname) -- already done
+ local before, after = environment.splitarguments(fullname) -- already done
environment.arguments_before, environment.arguments_after = before, after
end
if internal then
@@ -12181,12 +14523,12 @@ function runners.execute_script(fullname,internal,nosplit)
if binary and binary ~= "" then
result = binary .. " " .. result
end
- local command = result .. " " .. environment.reconstruct_commandline(environment.arguments_after,noquote)
- if logs.verbose then
- logs.simpleline()
- logs.simple("executing: %s",command)
- logs.simpleline()
- logs.simpleline()
+ local command = result .. " " .. environment.reconstructcommandline(environment.arguments_after,noquote)
+ if e_verbose then
+ report()
+ report("executing: %s",command)
+ report()
+ report()
io.flush()
end
-- no os.exec because otherwise we get the wrong return value
@@ -12196,14 +14538,14 @@ function runners.execute_script(fullname,internal,nosplit)
else
if binary then
binary = file.addsuffix(binary,os.binsuffix)
- for p in string.gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
+ for p in gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
if lfs.isfile(file.join(p,binary)) then
return false
end
end
- logs.simpleline()
- logs.simple("This script needs '%s' which seems not to be installed.",binary)
- logs.simpleline()
+ report()
+ report("This script needs '%s' which seems not to be installed.",binary)
+ report()
end
return false
end
@@ -12223,14 +14565,15 @@ function runners.execute_program(fullname)
elseif state == 'skip' then
return true
elseif state == "run" then
- local before, after = environment.split_arguments(fullname)
- environment.initialize_arguments(after)
+ local before, after = environment.splitarguments(fullname)
+ for k=1,#after do after[k] = resolvers.resolve(after[k]) end
+ environment.initializearguments(after)
fullname = fullname:gsub("^bin:","")
- local command = fullname .. " " .. (environment.reconstruct_commandline(after or "",noquote) or "")
- logs.simpleline()
- logs.simple("executing: %s",command)
- logs.simpleline()
- logs.simpleline()
+ local command = fullname .. " " .. (environment.reconstructcommandline(after or "",noquote) or "")
+ report()
+ report("executing: %s",command)
+ report()
+ report()
io.flush()
local code = os.exec(command) -- (fullname,unpack(after)) does not work / maybe spawn
return code == 0
@@ -12239,7 +14582,7 @@ function runners.execute_program(fullname)
return false
end
--- the --usekpse flag will fallback on kpse (hm, we can better update mtx-stubs)
+-- the --usekpse flag will fallback (not default) on kpse (hm, we can better update mtx-stubs)
local windows_stub = '@echo off\013\010setlocal\013\010set ownpath=%%~dp0%%\013\010texlua "%%ownpath%%mtxrun.lua" --usekpse --execute %s %%*\013\010endlocal\013\010'
local unix_stub = '#!/bin/sh\010mtxrun --usekpse --execute %s \"$@\"\010'
@@ -12258,22 +14601,22 @@ function runners.handle_stubs(create)
for _,v in pairs(runners.registered) do
local name, doit = v[1], v[2]
if doit then
- local base = string.gsub(file.basename(name), "%.(.-)$", "")
+ local base = gsub(file.basename(name), "%.(.-)$", "")
if create then
if windows then
- io.savedata(file.join(stubpath,base..".bat"),string.format(windows_stub,name))
- logs.simple("windows stub for '%s' created",base)
+ io.savedata(file.join(stubpath,base..".bat"),format(windows_stub,name))
+ report("windows stub for '%s' created",base)
end
if unix then
- io.savedata(file.join(stubpath,base),string.format(unix_stub,name))
- logs.simple("unix stub for '%s' created",base)
+ io.savedata(file.join(stubpath,base),format(unix_stub,name))
+ report("unix stub for '%s' created",base)
end
else
if windows and (os.remove(file.join(stubpath,base..'.bat')) or os.remove(file.join(stubpath,base..'.cmd'))) then
- logs.simple("windows stub for '%s' removed", base)
+ report("windows stub for '%s' removed", base)
end
if unix and (os.remove(file.join(stubpath,base)) or os.remove(file.join(stubpath,base..'.sh'))) then
- logs.simple("unix stub for '%s' removed",base)
+ report("unix stub for '%s' removed",base)
end
end
end
@@ -12289,7 +14632,7 @@ end
function runners.locate_file(filename)
-- differs from texmfstart where locate appends .com .exe .bat ... todo
if filename and filename ~= "" then
- runners.report_location(resolvers.find_given_file(filename))
+ runners.report_location(resolvers.findgivenfile(filename))
end
end
@@ -12298,28 +14641,28 @@ function runners.locate_platform()
end
function runners.report_location(result)
- if logs.verbose then
- logs.simpleline()
+ if e_verbose then
+ reportline()
if result and result ~= "" then
- logs.simple(result)
+ report(result)
else
- logs.simple("not found")
+ report("not found")
end
else
io.write(result)
end
end
-function runners.edit_script(filename) -- we assume that vim is present on most systems
- local editor = os.getenv("MTXRUN_EDITOR") or os.getenv("TEXMFSTART_EDITOR") or os.getenv("EDITOR") or 'vim'
+function runners.edit_script(filename) -- we assume that gvim is present on most systems (todo: also in cnf file)
+ local editor = os.getenv("MTXRUN_EDITOR") or os.getenv("TEXMFSTART_EDITOR") or os.getenv("EDITOR") or 'gvim'
local rest = resolvers.resolve(filename)
if rest ~= "" then
local command = editor .. " " .. rest
- if logs.verbose then
- logs.simpleline()
- logs.simple("starting editor: %s",command)
- logs.simple_line()
- logs.simple_line()
+ if e_verbose then
+ report()
+ report("starting editor: %s",command)
+ report()
+ report()
end
os.launch(command)
end
@@ -12362,33 +14705,33 @@ end
function runners.launch_file(filename)
instance.allresults = true
- logs.setverbose(true)
+ trackers.enable("resolvers.locating")
local pattern = environment.arguments["pattern"]
if not pattern or pattern == "" then
pattern = filename
end
if not pattern or pattern == "" then
- logs.simple("provide name or --pattern=")
+ report("provide name or --pattern=")
else
- local t = resolvers.find_files(pattern)
+ local t = resolvers.findfiles(pattern)
if not t or #t == 0 then
- t = resolvers.find_files("*/" .. pattern)
+ t = resolvers.findfiles("*/" .. pattern)
end
if not t or #t == 0 then
- t = resolvers.find_files("*/" .. pattern .. "*")
+ t = resolvers.findfiles("*/" .. pattern .. "*")
end
if t and #t > 0 then
if environment.arguments["all"] then
for _, v in pairs(t) do
- logs.simple("launching %s", v)
+ report("launching %s", v)
resolvers.launch(v)
end
else
- logs.simple("launching %s", t[1])
+ report("launching %s", t[1])
resolvers.launch(t[1])
end
else
- logs.simple("no match for %s", pattern)
+ report("no match for %s", pattern)
end
end
end
@@ -12421,33 +14764,45 @@ function runners.find_mtx_script(filename)
local mtxprefix = (filename:find("^mtx%-") and "") or "mtx-"
-- context namespace, mtx-<filename>
fullname = mtxprefix .. filename
- fullname = found(fullname) or resolvers.find_file(fullname)
+ fullname = found(fullname) or resolvers.findfile(fullname)
if fullname and fullname ~= "" then
return fullname
end
-- context namespace, mtx-<filename>s
fullname = mtxprefix .. basename .. "s" .. "." .. suffix
- fullname = found(fullname) or resolvers.find_file(fullname)
+ fullname = found(fullname) or resolvers.findfile(fullname)
if fullname and fullname ~= "" then
return fullname
end
-- context namespace, mtx-<filename minus trailing s>
fullname = mtxprefix .. basename:gsub("s$","") .. "." .. suffix
- fullname = found(fullname) or resolvers.find_file(fullname)
+ fullname = found(fullname) or resolvers.findfile(fullname)
if fullname and fullname ~= "" then
return fullname
end
-- context namespace, just <filename>
- fullname = resolvers.find_file(filename)
+ fullname = resolvers.findfile(filename)
return fullname
end
-function runners.execute_ctx_script(filename)
+function runners.register_arguments(...)
+ local arguments = environment.arguments_after
+ local passedon = { ... }
+ for i=#passedon,1,-1 do
+ local pi = passedon[i]
+ if pi then
+ table.insert(arguments,1,pi)
+ end
+ end
+end
+
+function runners.execute_ctx_script(filename,...)
+ runners.register_arguments(...)
local arguments = environment.arguments_after
local fullname = runners.find_mtx_script(filename) or ""
if file.extname(fullname) == "cld" then
-- handy in editors where we force --autopdf
- logs.simple("running cld script: %s",filename)
+ report("running cld script: %s",filename)
table.insert(arguments,1,fullname)
table.insert(arguments,"--autopdf")
fullname = runners.find_mtx_script("context") or ""
@@ -12455,7 +14810,7 @@ function runners.execute_ctx_script(filename)
-- retry after generate but only if --autogenerate
if fullname == "" and environment.argument("autogenerate") then -- might become the default
instance.renewcache = true
- logs.setverbose(true)
+ trackers.enable("resolvers.locating")
resolvers.load()
--
fullname = runners.find_mtx_script(filename) or ""
@@ -12470,7 +14825,7 @@ function runners.execute_ctx_script(filename)
elseif state == "run" then
-- load and save ... kind of undocumented
arg = { } for _,v in pairs(arguments) do arg[#arg+1] = resolvers.resolve(v) end
- environment.initialize_arguments(arg)
+ environment.initializearguments(arg)
local loadname = environment.arguments['load']
if loadname then
if type(loadname) ~= "string" then loadname = file.basename(fullname) end
@@ -12478,8 +14833,8 @@ function runners.execute_ctx_script(filename)
runners.load_script_session(loadname)
end
filename = environment.files[1]
- if logs.verbose then
- logs.simple("using script: %s\n",fullname)
+ if e_verbose then
+ report("using script: %s\n",fullname)
end
environment.ownscript = fullname
dofile(fullname)
@@ -12495,44 +14850,42 @@ function runners.execute_ctx_script(filename)
return true
end
else
- -- logs.setverbose(true)
if filename == "" or filename == "help" then
- local context = resolvers.find_file("mtx-context.lua")
- logs.setverbose(true)
+ local context = resolvers.findfile("mtx-context.lua")
+ trackers.enable("resolvers.locating")
if context ~= "" then
- local result = dir.glob((string.gsub(context,"mtx%-context","mtx-*"))) -- () needed
+ local result = dir.glob((gsub(context,"mtx%-context","mtx-*"))) -- () needed
local valid = { }
table.sort(result)
for i=1,#result do
local scriptname = result[i]
- local scriptbase = string.match(scriptname,".*mtx%-([^%-]-)%.lua")
+ local scriptbase = match(scriptname,".*mtx%-([^%-]-)%.lua")
if scriptbase then
local data = io.loaddata(scriptname)
- local banner, version = string.match(data,"[\n\r]logs%.extendbanner%s*%(%s*[\"\']([^\n\r]+)%s*(%d+%.%d+)")
+ local banner, version = match(data,"[\n\r]logs%.extendbanner%s*%(%s*[\"\']([^\n\r]+)%s*(%d+%.%d+)")
if banner then
valid[#valid+1] = { scriptbase, version, banner }
end
end
end
if #valid > 0 then
- logs.reportbanner()
- logs.reportline()
- logs.simple("no script name given, known scripts:")
- logs.simple()
+ application.identify()
+ report("no script name given, known scripts:")
+ report()
for k=1,#valid do
local v = valid[k]
- logs.simple("%-12s %4s %s",v[1],v[2],v[3])
+ report("%-12s %4s %s",v[1],v[2],v[3])
end
end
else
- logs.simple("no script name given")
+ report("no script name given")
end
else
filename = file.addsuffix(filename,"lua")
if file.is_qualified_path(filename) then
- logs.simple("unknown script '%s'",filename)
+ report("unknown script '%s'",filename)
else
- logs.simple("unknown script '%s' or 'mtx-%s'",filename,filename)
+ report("unknown script '%s' or 'mtx-%s'",filename,filename)
end
end
return false
@@ -12540,9 +14893,9 @@ function runners.execute_ctx_script(filename)
end
function runners.prefixes()
- logs.reportbanner()
- logs.reportline()
- logs.simple(table.concat(resolvers.allprefixes(true)," "))
+ application.identify()
+ report()
+ report(concat(resolvers.allprefixes(true)," "))
end
function runners.timedrun(filename) -- just for me
@@ -12562,13 +14915,11 @@ end
local filename = environment.files[1] or ""
local ok = true
-local before, after = environment.split_arguments(filename)
+local before, after = environment.splitarguments(filename)
environment.arguments_before, environment.arguments_after = before, after
-environment.initialize_arguments(before)
+environment.initializearguments(before)
-instance.engine = environment.argument("engine") or 'luatex'
-instance.progname = environment.argument("progname") or 'context'
-instance.lsrmode = environment.argument("lsr") or false
+instance.lsrmode = environment.argument("lsr") or false
-- maybe the unset has to go to this level
@@ -12576,36 +14927,40 @@ local is_mkii_stub = runners.registered[file.removesuffix(file.basename(filename
if environment.argument("usekpse") or environment.argument("forcekpse") or is_mkii_stub then
+ resolvers.load_tree(environment.argument('tree'),true) -- force resolve of TEXMFCNF
+
os.setenv("engine","")
os.setenv("progname","")
local remapper = {
- otf = "opentype fonts",
- ttf = "truetype fonts",
- ttc = "truetype fonts",
- pfb = "type1 fonts",
+ otf = "opentype fonts",
+ ttf = "truetype fonts",
+ ttc = "truetype fonts",
+ pfb = "type1 fonts",
other = "other text files",
}
+ local progname = environment.argument("progname") or 'context'
+
local function kpse_initialized()
texconfig.kpse_init = true
local t = os.clock()
- local k = kpse.original.new("luatex",instance.progname)
+ local k = kpse.original.new("luatex",progname)
local dummy = k:find_file("mtxrun.lua") -- so that we're initialized
- logs.simple("kpse fallback with progname '%s' initialized in %s seconds",instance.progname,os.clock()-t)
+ report("kpse fallback with progname '%s' initialized in %s seconds",progname,os.clock()-t)
kpse_initialized = function() return k end
return k
end
- local find_file = resolvers.find_file
- local show_path = resolvers.show_path
+ local findfile = resolvers.findfile
+ local showpath = resolvers.showpath
if environment.argument("forcekpse") then
- function resolvers.find_file(name,kind)
- return (kpse_initialized():find_file(resolvers.clean_path(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
+ function resolvers.findfile(name,kind)
+ return (kpse_initialized():find_file(resolvers.cleanpath(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
end
- function resolvers.show_path(name)
+ function resolvers.showpath(name)
return (kpse_initialized():show_path(name)) or ""
end
@@ -12613,16 +14968,16 @@ if environment.argument("usekpse") or environment.argument("forcekpse") or is_mk
resolvers.load()
- function resolvers.find_file(name,kind)
- local found = find_file(name,kind) or ""
+ function resolvers.findfile(name,kind)
+ local found = findfile(name,kind) or ""
if found ~= "" then
return found
else
- return (kpse_initialized():find_file(resolvers.clean_path(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
+ return (kpse_initialized():find_file(resolvers.cleanpath(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
end
end
- function resolvers.show_path(name)
- local found = show_path(name) or ""
+ function resolvers.showpath(name)
+ local found = showpath(name) or ""
if found ~= "" then
return found
else
@@ -12632,80 +14987,317 @@ if environment.argument("usekpse") or environment.argument("forcekpse") or is_mk
end
+ function runners.loadbase()
+ end
+
else
- resolvers.load()
+ function runners.loadbase(...)
+ if not resolvers.load(...) then
+ report("forcing cache reload")
+ instance.renewcache = true
+ trackers.enable("resolvers.locating")
+ if not resolvers.load(...) then
+ report("the resolver databases are not present or outdated")
+ end
+ end
+ end
+
+ resolvers.load_tree(environment.argument('tree'))
end
+
if environment.argument("selfmerge") then
+
-- embed used libraries
- utils.merger.selfmerge(own.name,own.libs,own.list)
+
+ runners.loadbase()
+ local found = locate_libs()
+ if found then
+ utilities.merger.selfmerge(own.name,own.libs,{ found })
+ end
+
elseif environment.argument("selfclean") then
+
-- remove embedded libraries
- utils.merger.selfclean(own.name)
+
+ runners.loadbase()
+ utilities.merger.selfclean(own.name)
+
elseif environment.argument("selfupdate") then
- logs.setverbose(true)
- resolvers.update_script(own.name,"mtxrun")
+
+ runners.loadbase()
+ trackers.enable("resolvers.locating")
+ resolvers.updatescript(own.name,"mtxrun")
+
elseif environment.argument("ctxlua") or environment.argument("internal") then
+
-- run a script by loading it (using libs)
+
+ runners.loadbase()
ok = runners.execute_script(filename,true)
+
elseif environment.argument("script") or environment.argument("scripts") then
+
-- run a script by loading it (using libs), pass args
+
+ runners.loadbase()
if is_mkii_stub then
- -- execute mkii script
ok = runners.execute_script(filename,false,true)
else
ok = runners.execute_ctx_script(filename)
end
+
elseif environment.argument("execute") then
+
-- execute script
+
+ runners.loadbase()
ok = runners.execute_script(filename)
+
elseif environment.argument("direct") then
+
-- equals bin:
+
+ runners.loadbase()
ok = runners.execute_program(filename)
+
elseif environment.argument("edit") then
+
-- edit file
+
+ runners.loadbase()
runners.edit_script(filename)
+
elseif environment.argument("launch") then
+
+ runners.loadbase()
runners.launch_file(filename)
-elseif environment.argument("make") then
- -- make stubs
+
+elseif environment.argument("makestubs") then
+
+ -- make stubs (depricated)
+
runners.handle_stubs(true)
-elseif environment.argument("remove") then
- -- remove stub
+
+elseif environment.argument("removestubs") then
+
+ -- remove stub (depricated)
+
+ runners.loadbase()
runners.handle_stubs(false)
+
elseif environment.argument("resolve") then
+
-- resolve string
+
+ runners.loadbase()
runners.resolve_string(filename)
+
elseif environment.argument("locate") then
+
-- locate file
+
+ runners.loadbase()
runners.locate_file(filename)
-elseif environment.argument("platform")then
+
+elseif environment.argument("platform") or environment.argument("show-platform") then
+
-- locate platform
+
+ runners.loadbase()
runners.locate_platform()
+
elseif environment.argument("prefixes") then
+
+ runners.loadbase()
runners.prefixes()
+
elseif environment.argument("timedrun") then
+
-- locate platform
+
+ runners.loadbase()
runners.timedrun(filename)
+
+elseif environment.argument("variables") or environment.argument("show-variables") or environment.argument("expansions") or environment.argument("show-expansions") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expansions",filename)
+
+ resolvers.load("nofiles")
+ resolvers.listers.variables(environment.argument("pattern"))
+
+elseif environment.argument("configurations") or environment.argument("show-configurations") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--configurations",filename)
+
+ resolvers.load("nofiles")
+ resolvers.listers.configurations()
+
+elseif environment.argument("find-file") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--find-file",filename)
+
+ resolvers.load()
+ local e_pattern = environment.argument("pattern")
+ local e_format = environment.arguments("format")
+ if not e_pattern then
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.findfiles,environment.files,e_format)
+ elseif type(e_pattern) == "string" then
+ instance.allresults = true -- brrrr
+ resolvers.dowithfilesandreport(resolvers.findfiles,{ e_pattern }, e_format)
+ end
+
+elseif environment.argument("find-path") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--find-path",filename)
+
+ resolvers.load()
+ local path = resolvers.findpath(filename, instance.my_format)
+ if e_verbose then
+ report(path)
+ else
+ print(path)
+ end
+
+elseif environment.argument("expand-braces") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expand-braces",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.expandbraces, environment.files)
+
+elseif environment.argument("expand-path") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expand-path",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.expandpath, environment.files)
+
+elseif environment.argument("expand-var") or environment.argument("expand-variable") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expand-var",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.expansion, environment.files)
+
+elseif environment.argument("show-path") or environment.argument("path-value") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--show-path",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.showpath, environment.files)
+
+elseif environment.argument("var-value") or environment.argument("show-value") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--show-value",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.variable,environment.files)
+
+elseif environment.argument("format-path") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--format-path",filename)
+
+ resolvers.load()
+ report(caches.getwritablepath("format"))
+
+elseif environment.argument("pattern") then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--pattern='" .. environment.argument("pattern") .. "'",filename)
+
+elseif environment.argument("generate") then
+
+ -- luatools
+
+ instance.renewcache = true
+ trackers.enable("resolvers.locating")
+ resolvers.load()
+
+elseif environment.argument("make") or environment.argument("ini") or environment.argument("compile") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--make",filename)
+
+ resolvers.load()
+ trackers.enable("resolvers.locating")
+ environment.make_format(filename)
+
+elseif environment.argument("run") then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--run",filename)
+
+elseif environment.argument("fmt") then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--fmt",filename)
+
+elseif environment.argument("help") and filename=='base' then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--help")
+
elseif environment.argument("help") or filename=='help' or filename == "" then
- logs.help(messages.help)
- -- execute script
+
+ application.help()
+
elseif filename:find("^bin:") then
+
+ runners.loadbase()
ok = runners.execute_program(filename)
+
elseif is_mkii_stub then
+
-- execute mkii script
+
+ runners.loadbase()
ok = runners.execute_script(filename,false,true)
-else
+
+elseif false then
+
+ runners.loadbase()
ok = runners.execute_ctx_script(filename)
if not ok then
ok = runners.execute_script(filename)
end
+
+elseif environment.files[1] == 'texmfcnf.lua' then -- so that we don't need to load mtx-base
+
+ resolvers.load("nofiles")
+ resolvers.listers.configurations()
+
+else
+
+ runners.loadbase()
+ runners.execute_ctx_script("mtx-base",filename)
+
+end
+
+if e_verbose then
+ report()
+ report("runtime: %0.3f seconds",os.runtime())
end
-if os.platform == "unix" then
- io.write("\n")
+if os.type ~= "windows" then
+ texio.write("\n") -- is this still valid?
end
if ok == false then ok = 1 elseif ok == true then ok = 0 end
diff --git a/Master/texmf-dist/scripts/context/stubs/source/mtxrun_dll.c b/Master/texmf-dist/scripts/context/stubs/source/mtxrun_dll.c
index 27841c68764..400ed677882 100644
--- a/Master/texmf-dist/scripts/context/stubs/source/mtxrun_dll.c
+++ b/Master/texmf-dist/scripts/context/stubs/source/mtxrun_dll.c
@@ -5,8 +5,8 @@
Public Domain
Originally written in 2010 by Tomasz M. Trzeciak and Hans Hagen
- This program is derived from the 'runscript' program originally
- written in 2009 by T.M. Trzeciak. It has been adapted for use in
+ This program is derived from the 'runscript' program originally
+ written in 2009 by T.M. Trzeciak. It has been adapted for use in
ConTeXt MkIV.
Comment:
@@ -18,26 +18,26 @@
mtxrun --script font --reload
Here mtxrun is a lua script. In order to avoid the usage of a cmd
- file on windows this runner will start texlua directly. If the
- shared library luatex.dll is available, texlua will be started in
- the same process avoiding thus any additional overhead. Otherwise
+ file on windows this runner will start texlua directly. If the
+ shared library luatex.dll is available, texlua will be started in
+ the same process avoiding thus any additional overhead. Otherwise
it will be spawned in a new proces.
We also don't want to use other runners, like those that use kpse
to locate the script as this is exactly what mtxrun itself is doing
already. Therefore the runscript program is adapted to a more direct
approach suitable for mtxrun.
-
+
Compilation:
with gcc (size optimized):
- gcc -Os -s -shared -o mtxrun.dll mtxrun_dll.c
+ gcc -Os -s -shared -o mtxrun.dll mtxrun_dll.c
gcc -Os -s -o mtxrun.exe mtxrun_exe.c -L./ -lmtxrun
with tcc (extra small size):
-
- tcc -shared -o mtxrun.dll mtxrun_dll.c
+
+ tcc -shared -o mtxrun.dll mtxrun_dll.c
tcc -o mtxrun.exe mtxrun_exe.c mtxrun.def
************************************************************************/
@@ -65,9 +65,9 @@ HMODULE dllluatex = NULL;
typedef int ( *mainlikeproc )( int, char ** );
#ifdef STATIC
-int main( int argc, char *argv[] )
+int main( int argc, char *argv[] )
#else
-__declspec(dllexport) int dllrunscript( int argc, char *argv[] )
+__declspec(dllexport) int dllrunscript( int argc, char *argv[] )
#endif
{
char *s, *luatexfname, *argstr, **lua_argv;
@@ -75,44 +75,52 @@ __declspec(dllexport) int dllrunscript( int argc, char *argv[] )
int passprogname = 0;
// directory of this module/executable
-
- HMODULE module_handle = GetModuleHandle( "mtxrun.dll" );
+
+ HMODULE module_handle = GetModuleHandle( "mtxrun.dll" );
// if ( module_handle == NULL ) exe path will be used, which is OK too
k = (int) GetModuleFileName( module_handle, dirpath, MAX_PATH );
- if ( !k || ( k == MAX_PATH ) )
+ if ( !k || ( k == MAX_PATH ) )
DIE( "unable to determine a valid module name\n" );
s = strrchr(dirpath, '\\');
if ( s == NULL ) DIE( "no directory part in module path: %s\n", dirpath );
*(++s) = '\0'; //remove file name, leave trailing backslash
-
+
// program name
-
+
k = strlen(argv[0]);
while ( k && (argv[0][k-1] != '/') && (argv[0][k-1] != '\\') ) k--;
strcpy(progname, &argv[0][k]);
s = progname;
if ( s = strrchr(s, '.') ) *s = '\0'; // remove file extension part
-
+
// script path
-
+
strcpy( scriptpath, dirpath );
k = strlen(progname);
if ( k < 6 ) k = 6; // in case the program name is shorter than "mtxrun"
- if ( strlen(dirpath) + k + 4 >= MAX_PATH )
+ if ( strlen(dirpath) + k + 4 >= MAX_PATH )
DIE( "path too long: %s%s\n", dirpath, progname );
- if ( ( strcmpi(progname,"mtxrun") == 0 ) || ( strcmpi(progname,"luatools") == 0 ) ) {
+
+ if ( strcmpi(progname,"mtxrun") == 0 ) {
strcat( scriptpath, progname );
strcat( scriptpath, ".lua" );
+ } else if ( strcmpi(progname,"luatools") == 0 ) {
+ strcat( scriptpath, "mtxrun.lua" );
+ strcpy( progname, "base" );
+ passprogname = 1;
+ } else if ( strcmpi(progname,"texmfstart") == 0 ) {
+ strcat( scriptpath, "mtxrun.lua" );
} else {
strcat( scriptpath, "mtxrun.lua" );
- if ( strcmpi(progname,"texmfstart") != 0 ) passprogname = 1;
+ passprogname = 1;
}
- if ( GetFileAttributes(scriptpath) == INVALID_FILE_ATTRIBUTES )
+
+ if ( GetFileAttributes(scriptpath) == INVALID_FILE_ATTRIBUTES )
DIE( "file not found: %s\n", scriptpath );
-
+
// find texlua.exe
-
- if ( !SearchPath(
+
+ if ( !SearchPath(
getenv( "PATH" ), // path to search (optional)
"texlua.exe", // file name to search
NULL, // file extension to add (optional)
@@ -120,7 +128,7 @@ __declspec(dllexport) int dllrunscript( int argc, char *argv[] )
luatexpath, // output buffer pointer
&luatexfname ) // pointer to a file part in the output buffer (optional)
)
- if ( !SearchPath(
+ if ( !SearchPath(
dirpath, // path to search (optional)
"texlua.exe", // file name to search
NULL, // file extension to add (optional)
@@ -136,11 +144,11 @@ __declspec(dllexport) int dllrunscript( int argc, char *argv[] )
if ( dllluatex = LoadLibrary(luatexpath) )
{
mainlikeproc dllluatexmain = (mainlikeproc) GetProcAddress( dllluatex, "dllluatexmain" );
- if ( dllluatexmain == NULL )
+ if ( dllluatexmain == NULL )
DIE( "unable to locate dllluatexmain procedure in luatex.dll" );
-
+
// set up argument list for texlua script
-
+
lua_argv = (char **)malloc( (argc + 4) * sizeof(char *) );
if ( lua_argv == NULL ) DIE( "out of memory\n" );
lua_argv[lua_argc=0] = texlua_name;
@@ -148,18 +156,18 @@ __declspec(dllexport) int dllrunscript( int argc, char *argv[] )
if (passprogname) {
lua_argv[++lua_argc] = "--script";
lua_argv[++lua_argc] = progname;
- }
+ }
for ( k = 1; k < argc; k++ ) lua_argv[++lua_argc] = argv[k];
lua_argv[++lua_argc] = NULL;
// call texlua interpreter
// dllluatexmain never returns, but we pretend that it does
-
+
k = dllluatexmain( lua_argc, lua_argv );
if (lua_argv) free( lua_argv );
return k;
}
-
+
// we are still here, so no luatex.dll; spawn texlua.exe instead
strcpy( luatexfname, "texlua.exe" );
@@ -172,24 +180,24 @@ __declspec(dllexport) int dllrunscript( int argc, char *argv[] )
strcat( cmdline, " --script " );
strcat( cmdline, progname );
}
-
+
argstr = GetCommandLine(); // get the command line of this process
if ( argstr == NULL ) DIE( "unable to retrieve the command line string\n" );
// skip over argv[0] in the argument string
// (it can contain embedded double quotes if launched from cmd.exe!)
-
- for ( quoted = 0; (*argstr) && ( !IS_WHITESPACE(*argstr) || quoted ); argstr++ )
+
+ for ( quoted = 0; (*argstr) && ( !IS_WHITESPACE(*argstr) || quoted ); argstr++ )
if (*argstr == '"') quoted = !quoted;
-
+
// pass through all the arguments
-
- if ( strlen(cmdline) + strlen(argstr) >= MAX_CMD )
+
+ if ( strlen(cmdline) + strlen(argstr) >= MAX_CMD )
DIE( "command line string too long:\n%s%s\n", cmdline, argstr );
- strcat( cmdline, argstr );
-
+ strcat( cmdline, argstr );
+
// create child process
-
+
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
@@ -201,7 +209,7 @@ __declspec(dllexport) int dllrunscript( int argc, char *argv[] )
si.hStdOutput = GetStdHandle( STD_OUTPUT_HANDLE );
si.hStdError = GetStdHandle( STD_ERROR_HANDLE );
ZeroMemory( &pi, sizeof(pi) );
-
+
if( !CreateProcess(
NULL, // module name (uses command line if NULL)
cmdline, // command line
@@ -214,17 +222,17 @@ __declspec(dllexport) int dllrunscript( int argc, char *argv[] )
&si, // STARTUPINFO structure
&pi ) // PROCESS_INFORMATION structure
) DIE( "command execution failed: %s\n", cmdline );
-
+
DWORD ret = 0;
CloseHandle( pi.hThread ); // thread handle is not needed
if ( WaitForSingleObject( pi.hProcess, INFINITE ) == WAIT_OBJECT_0 ) {
- if ( !GetExitCodeProcess( pi.hProcess, &ret) )
+ if ( !GetExitCodeProcess( pi.hProcess, &ret) )
DIE( "unable to retrieve process exit code: %s\n", cmdline );
} else DIE( "failed to wait for process termination: %s\n", cmdline );
CloseHandle( pi.hProcess );
-
+
// propagate exit code from the child process
-
- return ret;
-
+
+ return ret;
+
}
diff --git a/Master/texmf-dist/scripts/context/stubs/unix/luatools b/Master/texmf-dist/scripts/context/stubs/unix/luatools
index c060beff8fe..c17b483be53 100755
--- a/Master/texmf-dist/scripts/context/stubs/unix/luatools
+++ b/Master/texmf-dist/scripts/context/stubs/unix/luatools
@@ -1,8312 +1,2 @@
-#!/usr/bin/env texlua
-
-if not modules then modules = { } end modules ['luatools'] = {
- version = 1.001,
- comment = "companion to context.tex",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local format = string.format
-
--- one can make a stub:
---
--- #!/bin/sh
--- env LUATEXDIR=/....../texmf/scripts/context/lua texlua luatools.lua "$@"
-
--- Although this script is part of the ConTeXt distribution it is
--- relatively indepent of ConTeXt. The same is true for some of
--- the luat files. We may may make them even less dependent in
--- the future. As long as Luatex is under development the
--- interfaces and names of functions may change.
-
--- For the sake of independence we optionally can merge the library
--- code here. It's too much code, but that does not harm. Much of the
--- library code is used elsewhere. We don't want dependencies on
--- Lua library paths simply because these scripts are located in the
--- texmf tree and not in some Lua path. Normally this merge is not
--- needed when texmfstart is used, or when the proper stub is used or
--- when (windows) suffix binding is active.
-
-texlua = true
-
--- begin library merge
-
-
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-string'] = {
- 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 sub, gsub, find, match, gmatch, format, char, byte, rep, lower = string.sub, string.gsub, string.find, string.match, string.gmatch, string.format, string.char, string.byte, string.rep, string.lower
-local lpegmatch = lpeg.match
-
--- some functions may disappear as they are not used anywhere
-
-if not string.split then
-
- -- this will be overloaded by a faster lpeg variant
-
- function string:split(pattern)
- if #self > 0 then
- local t = { }
- for s in gmatch(self..pattern,"(.-)"..pattern) do
- t[#t+1] = s
- end
- return t
- else
- return { }
- end
- end
-
-end
-
-local chr_to_esc = {
- ["%"] = "%%",
- ["."] = "%.",
- ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
- ["^"] = "%^", ["$"] = "%$",
- ["["] = "%[", ["]"] = "%]",
- ["("] = "%(", [")"] = "%)",
- ["{"] = "%{", ["}"] = "%}"
-}
-
-string.chr_to_esc = chr_to_esc
-
-function string:esc() -- variant 2
- return (gsub(self,"(.)",chr_to_esc))
-end
-
-function string:unquote()
- return (gsub(self,"^([\"\'])(.*)%1$","%2"))
-end
-
---~ function string:unquote()
---~ if find(self,"^[\'\"]") then
---~ return sub(self,2,-2)
---~ else
---~ return self
---~ end
---~ end
-
-function string:quote() -- we could use format("%q")
- return format("%q",self)
-end
-
-function string:count(pattern) -- variant 3
- local n = 0
- for _ in gmatch(self,pattern) do
- n = n + 1
- end
- return n
-end
-
-function string:limit(n,sentinel)
- if #self > n then
- sentinel = sentinel or " ..."
- return sub(self,1,(n-#sentinel)) .. sentinel
- else
- return self
- end
-end
-
---~ function string:strip() -- the .- is quite efficient
---~ -- return match(self,"^%s*(.-)%s*$") or ""
---~ -- return match(self,'^%s*(.*%S)') or '' -- posted on lua list
---~ return find(s,'^%s*$') and '' or match(s,'^%s*(.*%S)')
---~ end
-
-do -- roberto's variant:
- local space = lpeg.S(" \t\v\n")
- local nospace = 1 - space
- local stripper = space^0 * lpeg.C((space^0 * nospace^1)^0)
- function string.strip(str)
- return lpegmatch(stripper,str) or ""
- end
-end
-
-function string:is_empty()
- return not find(self,"%S")
-end
-
-function string:enhance(pattern,action)
- local ok, n = true, 0
- while ok do
- ok = false
- self = gsub(self,pattern, function(...)
- ok, n = true, n + 1
- return action(...)
- end)
- end
- return self, n
-end
-
-local chr_to_hex, hex_to_chr = { }, { }
-
-for i=0,255 do
- local c, h = char(i), format("%02X",i)
- chr_to_hex[c], hex_to_chr[h] = h, c
-end
-
-function string:to_hex()
- return (gsub(self or "","(.)",chr_to_hex))
-end
-
-function string:from_hex()
- return (gsub(self or "","(..)",hex_to_chr))
-end
-
-if not string.characters then
-
- local function nextchar(str, index)
- index = index + 1
- return (index <= #str) and index or nil, sub(str,index,index)
- end
- function string:characters()
- return nextchar, self, 0
- end
- local function nextbyte(str, index)
- index = index + 1
- return (index <= #str) and index or nil, byte(sub(str,index,index))
- end
- function string:bytes()
- return nextbyte, self, 0
- end
-
-end
-
--- we can use format for this (neg n)
-
-function string:rpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return self .. rep(chr or " ",m)
- else
- return self
- end
-end
-
-function string:lpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return rep(chr or " ",m) .. self
- else
- return self
- end
-end
-
-string.padd = string.rpadd
-
-function is_number(str) -- tonumber
- return find(str,"^[%-%+]?[%d]-%.?[%d+]$") == 1
-end
-
---~ print(is_number("1"))
---~ print(is_number("1.1"))
---~ print(is_number(".1"))
---~ print(is_number("-0.1"))
---~ print(is_number("+0.1"))
---~ print(is_number("-.1"))
---~ print(is_number("+.1"))
-
-function string:split_settings() -- no {} handling, see l-aux for lpeg variant
- if find(self,"=") then
- local t = { }
- for k,v in gmatch(self,"(%a+)=([^%,]*)") do
- t[k] = v
- end
- return t
- else
- return nil
- end
-end
-
-local patterns_escapes = {
- ["-"] = "%-",
- ["."] = "%.",
- ["+"] = "%+",
- ["*"] = "%*",
- ["%"] = "%%",
- ["("] = "%)",
- [")"] = "%)",
- ["["] = "%[",
- ["]"] = "%]",
-}
-
-function string:pattesc()
- return (gsub(self,".",patterns_escapes))
-end
-
-local simple_escapes = {
- ["-"] = "%-",
- ["."] = "%.",
- ["?"] = ".",
- ["*"] = ".*",
-}
-
-function string:simpleesc()
- return (gsub(self,".",simple_escapes))
-end
-
-function string:tohash()
- local t = { }
- for s in gmatch(self,"([^, ]+)") do -- lpeg
- t[s] = true
- end
- return t
-end
-
-local pattern = lpeg.Ct(lpeg.C(1)^0)
-
-function string:totable()
- return lpegmatch(pattern,self)
-end
-
---~ local t = {
---~ "1234567123456712345671234567",
---~ "a\tb\tc",
---~ "aa\tbb\tcc",
---~ "aaa\tbbb\tccc",
---~ "aaaa\tbbbb\tcccc",
---~ "aaaaa\tbbbbb\tccccc",
---~ "aaaaaa\tbbbbbb\tcccccc",
---~ }
---~ for k,v do
---~ print(string.tabtospace(t[k]))
---~ end
-
-function string.tabtospace(str,tab)
- -- we don't handle embedded newlines
- while true do
- local s = find(str,"\t")
- if s then
- if not tab then tab = 7 end -- only when found
- local d = tab-(s-1) % tab
- if d > 0 then
- str = gsub(str,"\t",rep(" ",d),1)
- else
- str = gsub(str,"\t","",1)
- end
- else
- break
- end
- end
- return str
-end
-
-function string:compactlong() -- strips newlines and leading spaces
- self = gsub(self,"[\n\r]+ *","")
- self = gsub(self,"^ *","")
- return self
-end
-
-function string:striplong() -- strips newlines and leading spaces
- self = gsub(self,"^%s*","")
- self = gsub(self,"[\n\r]+ *","\n")
- return self
-end
-
-function string:topattern(lowercase,strict)
- if lowercase then
- self = lower(self)
- end
- self = gsub(self,".",simple_escapes)
- if self == "" then
- self = ".*"
- elseif strict then
- self = "^" .. self .. "$"
- end
- return self
-end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-lpeg'] = {
- 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 lpeg = require("lpeg")
-
-lpeg.patterns = lpeg.patterns or { } -- so that we can share
-local patterns = lpeg.patterns
-
-local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
-local match = lpeg.match
-
-local digit, sign = R('09'), S('+-')
-local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
-local utf8byte = R("\128\191")
-
-patterns.utf8byte = utf8byte
-patterns.utf8one = R("\000\127")
-patterns.utf8two = R("\194\223") * utf8byte
-patterns.utf8three = R("\224\239") * utf8byte * utf8byte
-patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
-
-patterns.digit = digit
-patterns.sign = sign
-patterns.cardinal = sign^0 * digit^1
-patterns.integer = sign^0 * digit^1
-patterns.float = sign^0 * digit^0 * P('.') * digit^1
-patterns.number = patterns.float + patterns.integer
-patterns.oct = P("0") * R("07")^1
-patterns.octal = patterns.oct
-patterns.HEX = P("0x") * R("09","AF")^1
-patterns.hex = P("0x") * R("09","af")^1
-patterns.hexadecimal = P("0x") * R("09","AF","af")^1
-patterns.lowercase = R("az")
-patterns.uppercase = R("AZ")
-patterns.letter = patterns.lowercase + patterns.uppercase
-patterns.space = S(" ")
-patterns.eol = S("\n\r")
-patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-patterns.newline = crlf + cr + lf
-patterns.nonspace = 1 - patterns.space
-patterns.nonspacer = 1 - patterns.spacer
-patterns.whitespace = patterns.eol + patterns.spacer
-patterns.nonwhitespace = 1 - patterns.whitespace
-patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
-patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
-
-function lpeg.anywhere(pattern) --slightly adapted from website
- return P { P(pattern) + 1 * V(1) } -- why so complex?
-end
-
-function lpeg.splitter(pattern, action)
- return (((1-P(pattern))^1)/action+1)^0
-end
-
-local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
-local empty = spacing * Cc("")
-local nonempty = Cs((1-spacing)^1) * spacing^-1
-local content = (empty + nonempty)^1
-
-local capture = Ct(content^0)
-
-function string:splitlines()
- return match(capture,self)
-end
-
-patterns.textline = content
-
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps")) -- oeps
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps")) -- oeps
-
-local splitters_s, splitters_m = { }, { }
-
-local function splitat(separator,single)
- local splitter = (single and splitters_s[separator]) or splitters_m[separator]
- if not splitter then
- separator = P(separator)
- if single then
- local other, any = C((1 - separator)^0), P(1)
- splitter = other * (separator * C(any^0) + "") -- ?
- splitters_s[separator] = splitter
- else
- local other = C((1 - separator)^0)
- splitter = other * (separator * other)^0
- splitters_m[separator] = splitter
- end
- end
- return splitter
-end
-
-lpeg.splitat = splitat
-
-local cache = { }
-
-function lpeg.split(separator,str)
- local c = cache[separator]
- if not c then
- c = Ct(splitat(separator))
- cache[separator] = c
- end
- return match(c,str)
-end
-
-function string:split(separator)
- local c = cache[separator]
- if not c then
- c = Ct(splitat(separator))
- cache[separator] = c
- end
- return match(c,self)
-end
-
-lpeg.splitters = cache
-
-local cache = { }
-
-function lpeg.checkedsplit(separator,str)
- local c = cache[separator]
- if not c then
- separator = P(separator)
- local other = C((1 - separator)^0)
- c = Ct(separator^0 * other * (separator^1 * other)^0)
- cache[separator] = c
- end
- return match(c,str)
-end
-
-function string:checkedsplit(separator)
- local c = cache[separator]
- if not c then
- separator = P(separator)
- local other = C((1 - separator)^0)
- c = Ct(separator^0 * other * (separator^1 * other)^0)
- cache[separator] = c
- end
- return match(c,self)
-end
-
---~ function lpeg.append(list,pp)
---~ local p = pp
---~ for l=1,#list do
---~ if p then
---~ p = p + P(list[l])
---~ else
---~ p = P(list[l])
---~ end
---~ end
---~ return p
---~ end
-
---~ from roberto's site:
-
-local f1 = string.byte
-
-local function f2(s) local c1, c2 = f1(s,1,2) return c1 * 64 + c2 - 12416 end
-local function f3(s) local c1, c2, c3 = f1(s,1,3) return (c1 * 64 + c2) * 64 + c3 - 925824 end
-local function f4(s) local c1, c2, c3, c4 = f1(s,1,4) return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168 end
-
-patterns.utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-table'] = {
- 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"
-}
-
-table.join = table.concat
-
-local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove
-local format, find, gsub, lower, dump, match = string.format, string.find, string.gsub, string.lower, string.dump, string.match
-local getmetatable, setmetatable = getmetatable, setmetatable
-local type, next, tostring, tonumber, ipairs = type, next, tostring, tonumber, ipairs
-
--- Starting with version 5.2 Lua no longer provide ipairs, which makes
--- sense. As we already used the for loop and # in most places the
--- impact on ConTeXt was not that large; the remaining ipairs already
--- have been replaced. In a similar fashio we also hardly used pairs.
---
--- Just in case, we provide the fallbacks as discussed in Programming
--- in Lua (http://www.lua.org/pil/7.3.html):
-
-if not ipairs then
-
- -- for k, v in ipairs(t) do ... end
- -- for k=1,#t do local v = t[k] ... end
-
- local function iterate(a,i)
- i = i + 1
- local v = a[i]
- if v ~= nil then
- return i, v --, nil
- end
- end
-
- function ipairs(a)
- return iterate, a, 0
- end
-
-end
-
-if not pairs then
-
- -- for k, v in pairs(t) do ... end
- -- for k, v in next, t do ... end
-
- function pairs(t)
- return next, t -- , nil
- end
-
-end
-
--- Also, unpack has been moved to the table table, and for compatiility
--- reasons we provide both now.
-
-if not table.unpack then
- table.unpack = _G.unpack
-elseif not unpack then
- _G.unpack = table.unpack
-end
-
--- extra functions, some might go (when not used)
-
-function table.strip(tab)
- local lst = { }
- for i=1,#tab do
- local s = gsub(tab[i],"^%s*(.-)%s*$","%1")
- if s == "" then
- -- skip this one
- else
- lst[#lst+1] = s
- end
- end
- return lst
-end
-
-function table.keys(t)
- local k = { }
- for key, _ in next, t do
- k[#k+1] = key
- end
- return k
-end
-
-local function compare(a,b)
- return (tostring(a) < tostring(b))
-end
-
-local function sortedkeys(tab)
- local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
- for key,_ in next, tab do
- srt[#srt+1] = key
- if kind == 3 then
- -- no further check
- else
- local tkey = type(key)
- if tkey == "string" then
- -- if kind == 2 then kind = 3 else kind = 1 end
- kind = (kind == 2 and 3) or 1
- elseif tkey == "number" then
- -- if kind == 1 then kind = 3 else kind = 2 end
- kind = (kind == 1 and 3) or 2
- else
- kind = 3
- end
- end
- end
- if kind == 0 or kind == 3 then
- sort(srt,compare)
- else
- sort(srt)
- end
- return srt
-end
-
-local function sortedhashkeys(tab) -- fast one
- local srt = { }
- for key,_ in next, tab do
- srt[#srt+1] = key
- end
- sort(srt)
- return srt
-end
-
-table.sortedkeys = sortedkeys
-table.sortedhashkeys = sortedhashkeys
-
-function table.sortedhash(t)
- local s = sortedhashkeys(t) -- maybe just sortedkeys
- local n = 0
- local function kv(s)
- n = n + 1
- local k = s[n]
- return k, t[k]
- end
- return kv, s
-end
-
-table.sortedpairs = table.sortedhash
-
-function table.append(t, list)
- for _,v in next, list do
- insert(t,v)
- end
-end
-
-function table.prepend(t, list)
- for k,v in next, list do
- insert(t,k,v)
- end
-end
-
-function table.merge(t, ...) -- first one is target
- t = t or {}
- local lst = {...}
- for i=1,#lst do
- for k, v in next, lst[i] do
- t[k] = v
- end
- end
- return t
-end
-
-function table.merged(...)
- local tmp, lst = { }, {...}
- for i=1,#lst do
- for k, v in next, lst[i] do
- tmp[k] = v
- end
- end
- return tmp
-end
-
-function table.imerge(t, ...)
- local lst = {...}
- for i=1,#lst do
- local nst = lst[i]
- for j=1,#nst do
- t[#t+1] = nst[j]
- end
- end
- return t
-end
-
-function table.imerged(...)
- local tmp, lst = { }, {...}
- for i=1,#lst do
- local nst = lst[i]
- for j=1,#nst do
- tmp[#tmp+1] = nst[j]
- end
- end
- return tmp
-end
-
-local function fastcopy(old) -- fast one
- if old then
- local new = { }
- for k,v in next, old do
- if type(v) == "table" then
- new[k] = fastcopy(v) -- was just table.copy
- else
- new[k] = v
- end
- end
- -- optional second arg
- local mt = getmetatable(old)
- if mt then
- setmetatable(new,mt)
- end
- return new
- else
- return { }
- end
-end
-
-local function copy(t, tables) -- taken from lua wiki, slightly adapted
- tables = tables or { }
- local tcopy = {}
- if not tables[t] then
- tables[t] = tcopy
- end
- for i,v in next, t do -- brrr, what happens with sparse indexed
- if type(i) == "table" then
- if tables[i] then
- i = tables[i]
- else
- i = copy(i, tables)
- end
- end
- if type(v) ~= "table" then
- tcopy[i] = v
- elseif tables[v] then
- tcopy[i] = tables[v]
- else
- tcopy[i] = copy(v, tables)
- end
- end
- local mt = getmetatable(t)
- if mt then
- setmetatable(tcopy,mt)
- end
- return tcopy
-end
-
-table.fastcopy = fastcopy
-table.copy = copy
-
--- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
-
-function table.sub(t,i,j)
- return { unpack(t,i,j) }
-end
-
-function table.replace(a,b)
- for k,v in next, b do
- a[k] = v
- end
-end
-
--- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice)
-
-function table.is_empty(t) -- obolete, use inline code instead
- return not t or not next(t)
-end
-
-function table.one_entry(t) -- obolete, use inline code instead
- local n = next(t)
- return n and not next(t,n)
-end
-
---~ function table.starts_at(t) -- obsolete, not nice anyway
---~ return ipairs(t,1)(t,0)
---~ end
-
-function table.tohash(t,value)
- local h = { }
- if t then
- if value == nil then value = true end
- for _, v in next, t do -- no ipairs here
- h[v] = value
- end
- end
- return h
-end
-
-function table.fromhash(t)
- local h = { }
- for k, v in next, t do -- no ipairs here
- if v then h[#h+1] = k end
- end
- return h
-end
-
---~ print(table.serialize(t), "\n")
---~ print(table.serialize(t,"name"), "\n")
---~ print(table.serialize(t,false), "\n")
---~ print(table.serialize(t,true), "\n")
---~ print(table.serialize(t,"name",true), "\n")
---~ print(table.serialize(t,"name",true,true), "\n")
-
-table.serialize_functions = true
-table.serialize_compact = true
-table.serialize_inline = true
-
-local noquotes, hexify, handle, reduce, compact, inline, functions
-
-local reserved = table.tohash { -- intercept a language flaw, no reserved words as key
- 'and', 'break', 'do', 'else', 'elseif', 'end', 'false', 'for', 'function', 'if',
- 'in', 'local', 'nil', 'not', 'or', 'repeat', 'return', 'then', 'true', 'until', 'while',
-}
-
-local function simple_table(t)
- if #t > 0 then
- local n = 0
- for _,v in next, t do
- n = n + 1
- end
- if n == #t then
- local tt = { }
- for i=1,#t do
- local v = t[i]
- local tv = type(v)
- if tv == "number" then
- if hexify then
- tt[#tt+1] = format("0x%04X",v)
- else
- tt[#tt+1] = tostring(v) -- tostring not needed
- end
- elseif tv == "boolean" then
- tt[#tt+1] = tostring(v)
- elseif tv == "string" then
- tt[#tt+1] = format("%q",v)
- else
- tt = nil
- break
- end
- end
- return tt
- end
- end
- return nil
-end
-
--- Because this is a core function of mkiv I moved some function calls
--- inline.
---
--- twice as fast in a test:
---
--- local propername = lpeg.P(lpeg.R("AZ","az","__") * lpeg.R("09","AZ","az", "__")^0 * lpeg.P(-1) )
-
--- problem: there no good number_to_string converter with the best resolution
-
-local function do_serialize(root,name,depth,level,indexed)
- if level > 0 then
- depth = depth .. " "
- if indexed then
- handle(format("%s{",depth))
- elseif name then
- --~ handle(format("%s%s={",depth,key(name)))
- if type(name) == "number" then -- or find(k,"^%d+$") then
- if hexify then
- handle(format("%s[0x%04X]={",depth,name))
- else
- handle(format("%s[%s]={",depth,name))
- end
- elseif noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
- handle(format("%s%s={",depth,name))
- else
- handle(format("%s[%q]={",depth,name))
- end
- else
- handle(format("%s{",depth))
- end
- end
- -- we could check for k (index) being number (cardinal)
- if root and next(root) 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)
- for k,v in ipairs(root) do -- can we use next?
- if not first then first = k end
- last = last + 1
- end
- end
- local sk = sortedkeys(root)
- for i=1,#sk do
- local k = sk[i]
- local v = root[k]
- --~ if v == root then
- -- circular
- --~ else
- local t = type(v)
- if compact and first and type(k) == "number" and k >= first and k <= last then
- if t == "number" then
- if hexify then
- handle(format("%s 0x%04X,",depth,v))
- else
- handle(format("%s %s,",depth,v)) -- %.99g
- end
- elseif t == "string" then
- if reduce and tonumber(v) then
- handle(format("%s %s,",depth,v))
- else
- handle(format("%s %q,",depth,v))
- end
- elseif t == "table" then
- if not next(v) then
- handle(format("%s {},",depth))
- elseif inline then -- and #t > 0
- local st = simple_table(v)
- if st then
- handle(format("%s { %s },",depth,concat(st,", ")))
- else
- do_serialize(v,k,depth,level+1,true)
- end
- else
- do_serialize(v,k,depth,level+1,true)
- end
- elseif t == "boolean" then
- handle(format("%s %s,",depth,tostring(v)))
- elseif t == "function" then
- if functions then
- handle(format('%s loadstring(%q),',depth,dump(v)))
- else
- handle(format('%s "function",',depth))
- end
- else
- handle(format("%s %q,",depth,tostring(v)))
- end
- elseif k == "__p__" then -- parent
- if false then
- handle(format("%s __p__=nil,",depth))
- end
- elseif t == "number" then
- --~ if hexify then
- --~ handle(format("%s %s=0x%04X,",depth,key(k),v))
- --~ else
- --~ handle(format("%s %s=%s,",depth,key(k),v)) -- %.99g
- --~ end
- if type(k) == "number" then -- or find(k,"^%d+$") then
- if hexify then
- handle(format("%s [0x%04X]=0x%04X,",depth,k,v))
- else
- handle(format("%s [%s]=%s,",depth,k,v)) -- %.99g
- end
- elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
- if hexify then
- handle(format("%s %s=0x%04X,",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))
- else
- handle(format("%s [%q]=%s,",depth,k,v)) -- %.99g
- end
- end
- elseif t == "string" then
- if reduce and tonumber(v) then
- --~ handle(format("%s %s=%s,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
- if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,v))
- else
- handle(format("%s [%s]=%s,",depth,k,v))
- end
- elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
- handle(format("%s %s=%s,",depth,k,v))
- else
- handle(format("%s [%q]=%s,",depth,k,v))
- end
- else
- --~ handle(format("%s %s=%q,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
- if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,v))
- else
- handle(format("%s [%s]=%q,",depth,k,v))
- end
- elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
- handle(format("%s %s=%q,",depth,k,v))
- else
- handle(format("%s [%q]=%q,",depth,k,v))
- end
- end
- elseif t == "table" then
- if not next(v) then
- --~ handle(format("%s %s={},",depth,key(k)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
- if hexify then
- handle(format("%s [0x%04X]={},",depth,k))
- else
- handle(format("%s [%s]={},",depth,k))
- end
- elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
- handle(format("%s %s={},",depth,k))
- else
- handle(format("%s [%q]={},",depth,k))
- end
- elseif inline then
- local st = simple_table(v)
- if st then
- --~ handle(format("%s %s={ %s },",depth,key(k),concat(st,", ")))
- if type(k) == "number" then -- or find(k,"^%d+$") then
- if hexify then
- handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
- else
- handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
- end
- elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
- handle(format("%s %s={ %s },",depth,k,concat(st,", ")))
- else
- handle(format("%s [%q]={ %s },",depth,k,concat(st,", ")))
- end
- else
- do_serialize(v,k,depth,level+1)
- end
- else
- do_serialize(v,k,depth,level+1)
- end
- elseif t == "boolean" then
- --~ handle(format("%s %s=%s,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
- if hexify then
- handle(format("%s [0x%04X]=%s,",depth,k,tostring(v)))
- else
- handle(format("%s [%s]=%s,",depth,k,tostring(v)))
- end
- elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
- handle(format("%s %s=%s,",depth,k,tostring(v)))
- else
- handle(format("%s [%q]=%s,",depth,k,tostring(v)))
- end
- elseif t == "function" then
- if functions then
- --~ handle(format('%s %s=loadstring(%q),',depth,key(k),dump(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
- if hexify then
- handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v)))
- else
- handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v)))
- end
- elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
- handle(format("%s %s=loadstring(%q),",depth,k,dump(v)))
- else
- handle(format("%s [%q]=loadstring(%q),",depth,k,dump(v)))
- end
- end
- else
- --~ handle(format("%s %s=%q,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
- if hexify then
- handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
- else
- handle(format("%s [%s]=%q,",depth,k,tostring(v)))
- end
- elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
- handle(format("%s %s=%q,",depth,k,tostring(v)))
- else
- handle(format("%s [%q]=%q,",depth,k,tostring(v)))
- end
- end
- --~ end
- end
- end
- if level > 0 then
- handle(format("%s},",depth))
- end
-end
-
--- replacing handle by a direct t[#t+1] = ... (plus test) is not much
--- faster (0.03 on 1.00 for zapfino.tma)
-
-local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
- noquotes = _noquotes
- hexify = _hexify
- handle = _handle or print
- reduce = _reduce or false
- compact = table.serialize_compact
- inline = compact and table.serialize_inline
- functions = table.serialize_functions
- local tname = type(name)
- if tname == "string" then
- if name == "return" then
- handle("return {")
- else
- handle(name .. "={")
- end
- elseif tname == "number" then
- if hexify then
- handle(format("[0x%04X]={",name))
- else
- handle("[" .. name .. "]={")
- end
- elseif tname == "boolean" then
- if name then
- handle("return {")
- else
- handle("{")
- end
- else
- handle("t={")
- end
- if root and next(root) then
- do_serialize(root,name,"",0,indexed)
- end
- handle("}")
-end
-
---~ name:
---~
---~ true : return { }
---~ false : { }
---~ nil : t = { }
---~ string : string = { }
---~ 'return' : return { }
---~ number : [number] = { }
-
-function table.serialize(root,name,reduce,noquotes,hexify)
- local t = { }
- local function flush(s)
- t[#t+1] = s
- end
- serialize(root,name,flush,reduce,noquotes,hexify)
- return concat(t,"\n")
-end
-
-function table.tohandle(handle,root,name,reduce,noquotes,hexify)
- serialize(root,name,handle,reduce,noquotes,hexify)
-end
-
--- sometimes tables are real use (zapfino extra pro is some 85M) in which
--- case a stepwise serialization is nice; actually, we could consider:
---
--- for line in table.serializer(root,name,reduce,noquotes) do
--- ...(line)
--- end
---
--- so this is on the todo list
-
-table.tofile_maxtab = 2*1024
-
-function table.tofile(filename,root,name,reduce,noquotes,hexify)
- local f = io.open(filename,'w')
- if f then
- local maxtab = table.tofile_maxtab
- if maxtab > 1 then
- local t = { }
- local function flush(s)
- t[#t+1] = s
- if #t > maxtab then
- f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
- t = { }
- end
- end
- serialize(root,name,flush,reduce,noquotes,hexify)
- f:write(concat(t,"\n"),"\n")
- else
- local function flush(s)
- f:write(s,"\n")
- end
- serialize(root,name,flush,reduce,noquotes,hexify)
- end
- f:close()
- end
-end
-
-local function flatten(t,f,complete) -- is this used? meybe a variant with next, ...
- for i=1,#t do
- local v = t[i]
- if type(v) == "table" then
- if complete or type(v[1]) == "table" then
- flatten(v,f,complete)
- else
- f[#f+1] = v
- end
- else
- f[#f+1] = v
- end
- end
-end
-
-function table.flatten(t)
- local f = { }
- flatten(t,f,true)
- return f
-end
-
-function table.unnest(t) -- bad name
- local f = { }
- flatten(t,f,false)
- return f
-end
-
-table.flatten_one_level = table.unnest
-
--- a better one:
-
-local function flattened(t,f)
- if not f then
- f = { }
- end
- for k, v in next, t do
- if type(v) == "table" then
- flattened(v,f)
- else
- f[k] = v
- end
- end
- return f
-end
-
-table.flattened = flattened
-
--- the next three may disappear
-
-function table.remove_value(t,value) -- todo: n
- if value then
- for i=1,#t do
- if t[i] == value then
- remove(t,i)
- -- remove all, so no: return
- end
- end
- end
-end
-
-function table.insert_before_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i,str)
- return
- end
- end
- end
- insert(t,1,str)
- elseif value then
- insert(t,1,value)
- end
-end
-
-function table.insert_after_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,str)
- return
- end
- end
- end
- t[#t+1] = str
- elseif value then
- t[#t+1] = value
- end
-end
-
-local function are_equal(a,b,n,m) -- indexed
- if a and b and #a == #b then
- n = n or 1
- m = m or #a
- for i=n,m do
- local ai, bi = a[i], b[i]
- if ai==bi then
- -- same
- elseif type(ai)=="table" and type(bi)=="table" then
- if not are_equal(ai,bi) then
- return false
- end
- else
- return false
- end
- end
- return true
- else
- return false
- end
-end
-
-local function identical(a,b) -- assumes same structure
- for ka, va in next, a do
- local vb = b[k]
- if va == vb then
- -- same
- elseif type(va) == "table" and type(vb) == "table" then
- if not identical(va,vb) then
- return false
- end
- else
- return false
- end
- end
- return true
-end
-
-table.are_equal = are_equal
-table.identical = identical
-
--- maybe also make a combined one
-
-function table.compact(t)
- if t then
- for k,v in next, t do
- if not next(v) then
- t[k] = nil
- end
- end
- end
-end
-
-function table.contains(t, v)
- if t then
- for i=1, #t do
- if t[i] == v then
- return i
- end
- end
- end
- return false
-end
-
-function table.count(t)
- local n, e = 0, next(t)
- while e do
- n, e = n + 1, next(t,e)
- end
- return n
-end
-
-function table.swapped(t)
- local s = { }
- for k, v in next, t do
- s[v] = k
- end
- return s
-end
-
---~ function table.are_equal(a,b)
---~ return table.serialize(a) == table.serialize(b)
---~ end
-
-function table.clone(t,p) -- t is optional or nil or table
- if not p then
- t, p = { }, t or { }
- elseif not t then
- t = { }
- end
- setmetatable(t, { __index = function(_,key) return p[key] end }) -- why not __index = p ?
- return t
-end
-
-function table.hexed(t,seperator)
- local tt = { }
- for i=1,#t do tt[i] = format("0x%04X",t[i]) end
- return concat(tt,seperator or " ")
-end
-
-function table.reverse_hash(h)
- local r = { }
- for k,v in next, h do
- r[v] = lower(gsub(k," ",""))
- end
- return r
-end
-
-function table.reverse(t)
- local tt = { }
- if #t > 0 then
- for i=#t,1,-1 do
- tt[#tt+1] = t[i]
- end
- end
- return tt
-end
-
-function table.insert_before_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i,extra)
- return
- end
- end
- insert(t,1,extra)
-end
-
-function table.insert_after_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,extra)
- return
- end
- end
- insert(t,#t+1,extra)
-end
-
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-io'] = {
- 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 byte, find, gsub = string.byte, string.find, string.gsub
-
-if string.find(os.getenv("PATH"),";") then
- io.fileseparator, io.pathseparator = "\\", ";"
-else
- io.fileseparator, io.pathseparator = "/" , ":"
-end
-
-function io.loaddata(filename,textmode)
- local f = io.open(filename,(textmode and 'r') or 'rb')
- if f then
- -- collectgarbage("step") -- sometimes makes a big difference in mem consumption
- local data = f:read('*all')
- -- garbagecollector.check(data)
- f:close()
- return data
- else
- return nil
- end
-end
-
-function io.savedata(filename,data,joiner)
- local f = io.open(filename,"wb")
- if f then
- if type(data) == "table" then
- f:write(table.join(data,joiner or ""))
- elseif type(data) == "function" then
- data(f)
- else
- f:write(data or "")
- end
- f:close()
- return true
- else
- return false
- end
-end
-
-function io.exists(filename)
- local f = io.open(filename)
- if f == nil then
- return false
- else
- assert(f:close())
- return true
- end
-end
-
-function io.size(filename)
- local f = io.open(filename)
- if f == nil then
- return 0
- else
- local s = f:seek("end")
- assert(f:close())
- return s
- end
-end
-
-function io.noflines(f)
- local n = 0
- for _ in f:lines() do
- n = n + 1
- end
- f:seek('set',0)
- return n
-end
-
-local nextchar = {
- [ 4] = function(f)
- return f:read(1,1,1,1)
- end,
- [ 2] = function(f)
- return f:read(1,1)
- end,
- [ 1] = function(f)
- return f:read(1)
- end,
- [-2] = function(f)
- local a, b = f:read(1,1)
- return b, a
- end,
- [-4] = function(f)
- local a, b, c, d = f:read(1,1,1,1)
- return d, c, b, a
- end
-}
-
-function io.characters(f,n)
- if f then
- return nextchar[n or 1], f
- else
- return nil, nil
- end
-end
-
-local nextbyte = {
- [4] = function(f)
- local a, b, c, d = f:read(1,1,1,1)
- if d then
- return byte(a), byte(b), byte(c), byte(d)
- else
- return nil, nil, nil, nil
- end
- end,
- [2] = function(f)
- local a, b = f:read(1,1)
- if b then
- return byte(a), byte(b)
- else
- return nil, nil
- end
- end,
- [1] = function (f)
- local a = f:read(1)
- if a then
- return byte(a)
- else
- return nil
- end
- end,
- [-2] = function (f)
- local a, b = f:read(1,1)
- if b then
- return byte(b), byte(a)
- else
- return nil, nil
- end
- end,
- [-4] = function(f)
- local a, b, c, d = f:read(1,1,1,1)
- if d then
- return byte(d), byte(c), byte(b), byte(a)
- else
- return nil, nil, nil, nil
- end
- end
-}
-
-function io.bytes(f,n)
- if f then
- return nextbyte[n or 1], f
- else
- return nil, nil
- end
-end
-
-function io.ask(question,default,options)
- while true do
- io.write(question)
- if options then
- io.write(string.format(" [%s]",table.concat(options,"|")))
- end
- if default then
- io.write(string.format(" [%s]",default))
- end
- io.write(string.format(" "))
- local answer = io.read()
- answer = gsub(answer,"^%s*(.*)%s*$","%1")
- if answer == "" and default then
- return default
- elseif not options then
- return answer
- else
- for k=1,#options do
- if options[k] == answer then
- return answer
- end
- end
- local pattern = "^" .. answer
- for k=1,#options do
- local v = options[k]
- if find(v,pattern) then
- return v
- end
- end
- end
- end
-end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-number'] = {
- 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 tostring = tostring
-local format, floor, insert, match = string.format, math.floor, table.insert, string.match
-local lpegmatch = lpeg.match
-
-number = number or { }
-
--- a,b,c,d,e,f = number.toset(100101)
-
-function number.toset(n)
- return match(tostring(n),"(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)")
-end
-
-function number.toevenhex(n)
- local s = format("%X",n)
- if #s % 2 == 0 then
- return s
- else
- return "0" .. s
- end
-end
-
--- the lpeg way is slower on 8 digits, but faster on 4 digits, some 7.5%
--- on
---
--- for i=1,1000000 do
--- local a,b,c,d,e,f,g,h = number.toset(12345678)
--- local a,b,c,d = number.toset(1234)
--- local a,b,c = number.toset(123)
--- end
---
--- of course dedicated "(.)(.)(.)(.)" matches are even faster
-
-local one = lpeg.C(1-lpeg.S(''))^1
-
-function number.toset(n)
- return lpegmatch(one,tostring(n))
-end
-
-function number.bits(n,zero)
- local t, i = { }, (zero and 0) or 1
- while n > 0 do
- local m = n % 2
- if m > 0 then
- insert(t,1,i)
- end
- n = floor(n/2)
- i = i + 1
- end
- return t
-end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-set'] = {
- 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"
-}
-
-set = set or { }
-
-local nums = { }
-local tabs = { }
-local concat = table.concat
-local next, type = next, type
-
-set.create = table.tohash
-
-function set.tonumber(t)
- if next(t) then
- local s = ""
- -- we could save mem by sorting, but it slows down
- for k, v in next, t do
- if v then
- -- why bother about the leading space
- s = s .. " " .. k
- end
- end
- local n = nums[s]
- if not n then
- n = #tabs + 1
- tabs[n] = t
- nums[s] = n
- end
- return n
- else
- return 0
- end
-end
-
-function set.totable(n)
- if n == 0 then
- return { }
- else
- return tabs[n] or { }
- end
-end
-
-function set.tolist(n)
- if n == 0 or not tabs[n] then
- return ""
- else
- local t = { }
- for k, v in next, tabs[n] do
- if v then
- t[#t+1] = k
- end
- end
- return concat(t," ")
- end
-end
-
-function set.contains(n,s)
- if type(n) == "table" then
- return n[s]
- elseif n == 0 then
- return false
- else
- local t = tabs[n]
- return t and t[s]
- end
-end
-
---~ local c = set.create{'aap','noot','mies'}
---~ local s = set.tonumber(c)
---~ local t = set.totable(s)
---~ print(t['aap'])
---~ local c = set.create{'zus','wim','jet'}
---~ local s = set.tonumber(c)
---~ local t = set.totable(s)
---~ print(t['aap'])
---~ print(t['jet'])
---~ print(set.contains(t,'jet'))
---~ print(set.contains(t,'aap'))
-
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-os'] = {
- 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"
-}
-
--- maybe build io.flush in os.execute
-
-local find, format, gsub = string.find, string.format, string.gsub
-local random, ceil = math.random, math.ceil
-
-local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
-
-function os.execute(...) ioflush() return execute(...) end
-function os.spawn (...) ioflush() return spawn (...) end
-function os.exec (...) ioflush() return exec (...) end
-
-function os.resultof(command)
- ioflush() -- else messed up logging
- local handle = io.popen(command,"r")
- if not handle then
- -- print("unknown command '".. command .. "' in os.resultof")
- return ""
- else
- return handle:read("*all") or ""
- end
-end
-
---~ os.type : windows | unix (new, we already guessed os.platform)
---~ os.name : windows | msdos | linux | macosx | solaris | .. | generic (new)
---~ os.platform : extended os.name with architecture
-
-if not io.fileseparator then
- if find(os.getenv("PATH"),";") then
- io.fileseparator, io.pathseparator, os.type = "\\", ";", os.type or "mswin"
- else
- io.fileseparator, io.pathseparator, os.type = "/" , ":", os.type or "unix"
- end
-end
-
-os.type = os.type or (io.pathseparator == ";" and "windows") or "unix"
-os.name = os.name or (os.type == "windows" and "mswin" ) or "linux"
-
-if os.type == "windows" then
- os.libsuffix, os.binsuffix = 'dll', 'exe'
-else
- os.libsuffix, os.binsuffix = 'so', ''
-end
-
-function os.launch(str)
- if os.type == "windows" then
- os.execute("start " .. str) -- os.spawn ?
- else
- os.execute(str .. " &") -- os.spawn ?
- end
-end
-
-if not os.times then
- -- utime = user time
- -- stime = system time
- -- cutime = children user time
- -- cstime = children system time
- function os.times()
- return {
- utime = os.gettimeofday(), -- user
- stime = 0, -- system
- cutime = 0, -- children user
- cstime = 0, -- children system
- }
- end
-end
-
-os.gettimeofday = os.gettimeofday or os.clock
-
-local startuptime = os.gettimeofday()
-
-function os.runtime()
- return os.gettimeofday() - startuptime
-end
-
---~ print(os.gettimeofday()-os.time())
---~ os.sleep(1.234)
---~ print (">>",os.runtime())
---~ print(os.date("%H:%M:%S",os.gettimeofday()))
---~ print(os.date("%H:%M:%S",os.time()))
-
--- no need for function anymore as we have more clever code and helpers now
--- this metatable trickery might as well disappear
-
-os.resolvers = os.resolvers or { }
-
-local resolvers = os.resolvers
-
-local osmt = getmetatable(os) or { __index = function(t,k) t[k] = "unset" return "unset" end } -- maybe nil
-local osix = osmt.__index
-
-osmt.__index = function(t,k)
- return (resolvers[k] or osix)(t,k)
-end
-
-setmetatable(os,osmt)
-
-if not os.setenv then
-
- -- we still store them but they won't be seen in
- -- child processes although we might pass them some day
- -- using command concatination
-
- local env, getenv = { }, os.getenv
-
- function os.setenv(k,v)
- env[k] = v
- end
-
- function os.getenv(k)
- return env[k] or getenv(k)
- end
-
-end
-
--- we can use HOSTTYPE on some platforms
-
-local name, platform = os.name or "linux", os.getenv("MTX_PLATFORM") or ""
-
-local function guess()
- local architecture = os.resultof("uname -m") or ""
- if architecture ~= "" then
- return architecture
- end
- architecture = os.getenv("HOSTTYPE") or ""
- if architecture ~= "" then
- return architecture
- end
- return os.resultof("echo $HOSTTYPE") or ""
-end
-
-if platform ~= "" then
-
- os.platform = platform
-
-elseif os.type == "windows" then
-
- -- we could set the variable directly, no function needed here
-
- function os.resolvers.platform(t,k)
- local platform, architecture = "", os.getenv("PROCESSOR_ARCHITECTURE") or ""
- if find(architecture,"AMD64") then
- platform = "mswin-64"
- else
- platform = "mswin"
- end
- os.setenv("MTX_PLATFORM",platform)
- os.platform = platform
- return platform
- end
-
-elseif name == "linux" then
-
- function os.resolvers.platform(t,k)
- -- we sometims have HOSTTYPE set so let's check that first
- local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
- if find(architecture,"x86_64") then
- platform = "linux-64"
- elseif find(architecture,"ppc") then
- platform = "linux-ppc"
- else
- platform = "linux"
- end
- os.setenv("MTX_PLATFORM",platform)
- os.platform = platform
- return platform
- end
-
-elseif name == "macosx" then
-
- --[[
- Identifying the architecture of OSX is quite a mess and this
- is the best we can come up with. For some reason $HOSTTYPE is
- a kind of pseudo environment variable, not known to the current
- environment. And yes, uname cannot be trusted either, so there
- is a change that you end up with a 32 bit run on a 64 bit system.
- Also, some proper 64 bit intel macs are too cheap (low-end) and
- therefore not permitted to run the 64 bit kernel.
- ]]--
-
- function os.resolvers.platform(t,k)
- -- local platform, architecture = "", os.getenv("HOSTTYPE") or ""
- -- if architecture == "" then
- -- architecture = os.resultof("echo $HOSTTYPE") or ""
- -- end
- local platform, architecture = "", os.resultof("echo $HOSTTYPE") or ""
- if architecture == "" then
- -- print("\nI have no clue what kind of OSX you're running so let's assume an 32 bit intel.\n")
- platform = "osx-intel"
- elseif find(architecture,"i386") then
- platform = "osx-intel"
- elseif find(architecture,"x86_64") then
- platform = "osx-64"
- else
- platform = "osx-ppc"
- end
- os.setenv("MTX_PLATFORM",platform)
- os.platform = platform
- return platform
- end
-
-elseif name == "sunos" then
-
- function os.resolvers.platform(t,k)
- local platform, architecture = "", os.resultof("uname -m") or ""
- if find(architecture,"sparc") then
- platform = "solaris-sparc"
- else -- if architecture == 'i86pc'
- platform = "solaris-intel"
- end
- os.setenv("MTX_PLATFORM",platform)
- os.platform = platform
- return platform
- end
-
-elseif name == "freebsd" then
-
- function os.resolvers.platform(t,k)
- local platform, architecture = "", os.resultof("uname -m") or ""
- if find(architecture,"amd64") then
- platform = "freebsd-amd64"
- else
- platform = "freebsd"
- end
- os.setenv("MTX_PLATFORM",platform)
- os.platform = platform
- return platform
- end
-
-elseif name == "kfreebsd" then
-
- function os.resolvers.platform(t,k)
- -- we sometims have HOSTTYPE set so let's check that first
- local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
- if find(architecture,"x86_64") then
- platform = "kfreebsd-64"
- else
- platform = "kfreebsd-i386"
- end
- os.setenv("MTX_PLATFORM",platform)
- os.platform = platform
- return platform
- end
-
-else
-
- -- platform = "linux"
- -- os.setenv("MTX_PLATFORM",platform)
- -- os.platform = platform
-
- function os.resolvers.platform(t,k)
- local platform = "linux"
- os.setenv("MTX_PLATFORM",platform)
- os.platform = platform
- return platform
- end
-
-end
-
--- beware, we set the randomseed
-
--- from wikipedia: Version 4 UUIDs use a scheme relying only on random numbers. This algorithm sets the
--- version number as well as two reserved bits. All other bits are set using a random or pseudorandom
--- data source. Version 4 UUIDs have the form xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx with hexadecimal
--- digits x and hexadecimal digits 8, 9, A, or B for y. e.g. f47ac10b-58cc-4372-a567-0e02b2c3d479.
---
--- as we don't call this function too often there is not so much risk on repetition
-
-local t = { 8, 9, "a", "b" }
-
-function os.uuid()
- return format("%04x%04x-4%03x-%s%03x-%04x-%04x%04x%04x",
- random(0xFFFF),random(0xFFFF),
- random(0x0FFF),
- t[ceil(random(4))] or 8,random(0x0FFF),
- random(0xFFFF),
- random(0xFFFF),random(0xFFFF),random(0xFFFF)
- )
-end
-
-local d
-
-function os.timezone(delta)
- d = d or tonumber(tonumber(os.date("%H")-os.date("!%H")))
- if delta then
- if d > 0 then
- return format("+%02i:00",d)
- else
- return format("-%02i:00",-d)
- end
- else
- return 1
- end
-end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-file'] = {
- 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"
-}
-
--- needs a cleanup
-
-file = file or { }
-
-local concat = table.concat
-local find, gmatch, match, gsub, sub, char = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char
-local lpegmatch = lpeg.match
-
-function file.removesuffix(filename)
- return (gsub(filename,"%.[%a%d]+$",""))
-end
-
-function file.addsuffix(filename, suffix)
- if not suffix or suffix == "" then
- return filename
- elseif not find(filename,"%.[%a%d]+$") then
- return filename .. "." .. suffix
- else
- return filename
- end
-end
-
-function file.replacesuffix(filename, suffix)
- return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
-end
-
-function file.dirname(name,default)
- return match(name,"^(.+)[/\\].-$") or (default or "")
-end
-
-function file.basename(name)
- return match(name,"^.+[/\\](.-)$") or name
-end
-
-function file.nameonly(name)
- return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
-end
-
-function file.extname(name,default)
- return match(name,"^.+%.([^/\\]-)$") or default or ""
-end
-
-file.suffix = file.extname
-
---~ function file.join(...)
---~ local pth = concat({...},"/")
---~ pth = gsub(pth,"\\","/")
---~ local a, b = match(pth,"^(.*://)(.*)$")
---~ if a and b then
---~ return a .. gsub(b,"//+","/")
---~ end
---~ a, b = match(pth,"^(//)(.*)$")
---~ if a and b then
---~ return a .. gsub(b,"//+","/")
---~ end
---~ return (gsub(pth,"//+","/"))
---~ end
-
-local trick_1 = char(1)
-local trick_2 = "^" .. trick_1 .. "/+"
-
-function file.join(...)
- local lst = { ... }
- local a, b = lst[1], lst[2]
- if a == "" then
- lst[1] = trick_1
- elseif b and find(a,"^/+$") and find(b,"^/") then
- lst[1] = ""
- lst[2] = gsub(b,"^/+","")
- end
- local pth = concat(lst,"/")
- pth = gsub(pth,"\\","/")
- local a, b = match(pth,"^(.*://)(.*)$")
- if a and b then
- return a .. gsub(b,"//+","/")
- end
- a, b = match(pth,"^(//)(.*)$")
- if a and b then
- return a .. gsub(b,"//+","/")
- end
- pth = gsub(pth,trick_2,"")
- return (gsub(pth,"//+","/"))
-end
-
---~ print(file.join("//","/y"))
---~ print(file.join("/","/y"))
---~ print(file.join("","/y"))
---~ print(file.join("/x/","/y"))
---~ print(file.join("x/","/y"))
---~ print(file.join("http://","/y"))
---~ print(file.join("http://a","/y"))
---~ print(file.join("http:///a","/y"))
---~ print(file.join("//nas-1","/y"))
-
-function file.iswritable(name)
- local a = lfs.attributes(name) or lfs.attributes(file.dirname(name,"."))
- return a and sub(a.permissions,2,2) == "w"
-end
-
-function file.isreadable(name)
- local a = lfs.attributes(name)
- return a and sub(a.permissions,1,1) == "r"
-end
-
-file.is_readable = file.isreadable
-file.is_writable = file.iswritable
-
--- todo: lpeg
-
---~ function file.split_path(str)
---~ local t = { }
---~ str = gsub(str,"\\", "/")
---~ str = gsub(str,"(%a):([;/])", "%1\001%2")
---~ for name in gmatch(str,"([^;:]+)") do
---~ if name ~= "" then
---~ t[#t+1] = gsub(name,"\001",":")
---~ end
---~ end
---~ return t
---~ end
-
-local checkedsplit = string.checkedsplit
-
-function file.split_path(str,separator)
- str = gsub(str,"\\","/")
- return checkedsplit(str,separator or io.pathseparator)
-end
-
-function file.join_path(tab)
- return concat(tab,io.pathseparator) -- can have trailing //
-end
-
--- we can hash them weakly
-
-
-local insert = table.insert
-
-function file.collapse_path(str,anchor)
- if anchor and not find(str,"^/") and not find(str,"^%a:") then
- str = getcurrentdir() .. "/" .. str
- end
- if str == "" or str =="." then
- return "."
- elseif find(str,"^%.%.") then
- str = gsub(str,"\\","/")
- return str
- elseif not find(str,"%.") then
- str = gsub(str,"\\","/")
- return str
- end
- str = gsub(str,"\\","/")
- local starter, rest = match(str,"^(%a+:/*)(.-)$")
- if starter then
- str = rest
- end
- local oldelements = checkedsplit(str,"/")
- local newelements = { }
- local i = #oldelements
- while i > 0 do
- local element = oldelements[i]
- if element == '.' then
- -- do nothing
- elseif element == '..' then
- local n = i -1
- while n > 0 do
- local element = oldelements[n]
- if element ~= '..' and element ~= '.' then
- oldelements[n] = '.'
- break
- else
- n = n - 1
- end
- end
- if n < 1 then
- insert(newelements,1,'..')
- end
- elseif element ~= "" then
- insert(newelements,1,element)
- end
- i = i - 1
- end
- if #newelements == 0 then
- return starter or "."
- elseif starter then
- return starter .. concat(newelements, '/')
- elseif find(str,"^/") then
- return "/" .. concat(newelements,'/')
- else
- return concat(newelements, '/')
- end
-end
-function file.xcollapse_path(str)
- print('collapse', str)
- if str == "" or str =="." then
- return "."
- elseif find(str,"^%.%.") then
- return str
- elseif not find(str,"%.") then
- return str
- end
- str = gsub(str,"^%./",lfs.currentdir() .. "/") -- ./xx in qualified
- str = gsub(str,"\\","/")
- local oldelements = checkedsplit(str,"/")
- local newelements = { }
- local i = #oldelements
- while i > 0 do
- local element = oldelements[i]
- if element == '.' then
- -- do nothing
- elseif element == '..' then
- local n = i -1
- while n > 0 do
- local element = oldelements[n]
- if element ~= '..' and element ~= '.' then
- oldelements[n] = '.'
- break
- else
- n = n - 1
- end
- end
- if n<1 then
- insert(newelements,1,'..')
- end
- elseif element ~= "" then
- insert(newelements,1,element)
- end
- i = i - 1
- end
- if #newelements == 0 then
- return "."
- elseif find(str,"^/") then
- return "/" .. concat(newelements,'/')
- else
- return concat(newelements, '/')
- end
-end
-
---~ print(file.collapse_path("/a"))
---~ print(file.collapse_path("a/./b/.."))
---~ print(file.collapse_path("a/aa/../b/bb"))
---~ print(file.collapse_path("a/../.."))
---~ print(file.collapse_path("a/.././././b/.."))
---~ print(file.collapse_path("a/./././b/.."))
---~ print(file.collapse_path("a/b/c/../.."))
-
-function file.robustname(str)
- return (gsub(str,"[^%a%d%/%-%.\\]+","-"))
-end
-
-file.readdata = io.loaddata
-file.savedata = io.savedata
-
-function file.copy(oldname,newname)
- file.savedata(newname,io.loaddata(oldname))
-end
-
--- lpeg variants, slightly faster, not always
-
---~ local period = lpeg.P(".")
---~ local slashes = lpeg.S("\\/")
---~ local noperiod = 1-period
---~ local noslashes = 1-slashes
---~ local name = noperiod^1
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.C(noperiod^1) * -1
-
---~ function file.extname(name)
---~ return lpegmatch(pattern,name) or ""
---~ end
-
---~ local pattern = lpeg.Cs(((period * noperiod^1 * -1)/"" + 1)^1)
-
---~ function file.removesuffix(name)
---~ return lpegmatch(pattern,name)
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.C(noslashes^1) * -1
-
---~ function file.basename(name)
---~ return lpegmatch(pattern,name) or name
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.Cp() * noslashes^1 * -1
-
---~ function file.dirname(name)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return sub(name,1,p-2)
---~ else
---~ return ""
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
-
---~ function file.addsuffix(name, suffix)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return name
---~ else
---~ return name .. "." .. suffix
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
-
---~ function file.replacesuffix(name,suffix)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return sub(name,1,p-2) .. "." .. suffix
---~ else
---~ return name .. "." .. suffix
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * lpeg.Cp() * ((noperiod^1 * period)^1 * lpeg.Cp() + lpeg.P(true)) * noperiod^1 * -1
-
---~ function file.nameonly(name)
---~ local a, b = lpegmatch(pattern,name)
---~ if b then
---~ return sub(name,a,b-2)
---~ elseif a then
---~ return sub(name,a)
---~ else
---~ return name
---~ end
---~ end
-
---~ local test = file.extname
---~ local test = file.basename
---~ local test = file.dirname
---~ local test = file.addsuffix
---~ local test = file.replacesuffix
---~ local test = file.nameonly
-
---~ print(1,test("./a/b/c/abd.def.xxx","!!!"))
---~ print(2,test("./../b/c/abd.def.xxx","!!!"))
---~ print(3,test("a/b/c/abd.def.xxx","!!!"))
---~ print(4,test("a/b/c/def.xxx","!!!"))
---~ print(5,test("a/b/c/def","!!!"))
---~ print(6,test("def","!!!"))
---~ print(7,test("def.xxx","!!!"))
-
---~ local tim = os.clock() for i=1,250000 do local ext = test("abd.def.xxx","!!!") end print(os.clock()-tim)
-
--- also rewrite previous
-
-local letter = lpeg.R("az","AZ") + lpeg.S("_-+")
-local separator = lpeg.P("://")
-
-local qualified = lpeg.P(".")^0 * lpeg.P("/") + letter*lpeg.P(":") + letter^1*separator + letter^1 * lpeg.P("/")
-local rootbased = lpeg.P("/") + letter*lpeg.P(":")
-
--- ./name ../name /name c: :// name/name
-
-function file.is_qualified_path(filename)
- return lpegmatch(qualified,filename) ~= nil
-end
-
-function file.is_rootbased_path(filename)
- return lpegmatch(rootbased,filename) ~= nil
-end
-
-local slash = lpeg.S("\\/")
-local period = lpeg.P(".")
-local drive = lpeg.C(lpeg.R("az","AZ")) * lpeg.P(":")
-local path = lpeg.C(((1-slash)^0 * slash)^0)
-local suffix = period * lpeg.C(lpeg.P(1-period)^0 * lpeg.P(-1))
-local base = lpeg.C((1-suffix)^0)
-
-local pattern = (drive + lpeg.Cc("")) * (path + lpeg.Cc("")) * (base + lpeg.Cc("")) * (suffix + lpeg.Cc(""))
-
-function file.splitname(str) -- returns drive, path, base, suffix
- return lpegmatch(pattern,str)
-end
-
--- function test(t) for k, v in next, t do print(v, "=>", file.splitname(v)) end end
---
--- test { "c:", "c:/aa", "c:/aa/bb", "c:/aa/bb/cc", "c:/aa/bb/cc.dd", "c:/aa/bb/cc.dd.ee" }
--- test { "c:", "c:aa", "c:aa/bb", "c:aa/bb/cc", "c:aa/bb/cc.dd", "c:aa/bb/cc.dd.ee" }
--- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
--- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
-
---~ -- todo:
---~
---~ if os.type == "windows" then
---~ local currentdir = lfs.currentdir
---~ function lfs.currentdir()
---~ return (gsub(currentdir(),"\\","/"))
---~ end
---~ end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-md5'] = {
- version = 1.001,
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- This also provides file checksums and checkers.
-
-local gsub, format, byte = string.gsub, string.format, string.byte
-
-local function convert(str,fmt)
- return (gsub(md5.sum(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
-
---~ 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
---~ 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
---~ 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
-
-file.needs_updating_threshold = 1
-
-function file.needs_updating(oldname,newname) -- size modification access change
- local oldtime = lfs.attributes(oldname, modification)
- local newtime = lfs.attributes(newname, modification)
- if newtime >= oldtime then
- return false
- elseif oldtime - newtime < file.needs_updating_threshold then
- return false
- else
- return true
- end
-end
-
-function file.checksum(name)
- if md5 then
- local data = io.loaddata(name)
- if data then
- return md5.HEX(data)
- end
- end
- return nil
-end
-
-function file.loadchecksum(name)
- if md5 then
- local data = io.loaddata(name .. ".md5")
- return data and (gsub(data,"%s",""))
- end
- return nil
-end
-
-function file.savechecksum(name, checksum)
- if not checksum then checksum = file.checksum(name) end
- if checksum then
- io.savedata(name .. ".md5",checksum)
- return checksum
- end
- return nil
-end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-url'] = {
- 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 char, gmatch, gsub = string.char, string.gmatch, string.gsub
-local tonumber, type = tonumber, type
-local lpegmatch = lpeg.match
-
--- from the spec (on the web):
---
--- foo://example.com:8042/over/there?name=ferret#nose
--- \_/ \______________/\_________/ \_________/ \__/
--- | | | | |
--- scheme authority path query fragment
--- | _____________________|__
--- / \ / \
--- urn:example:animal:ferret:nose
-
-url = url or { }
-
-local function tochar(s)
- return char(tonumber(s,16))
-end
-
-local colon, qmark, hash, slash, percent, endofstring = lpeg.P(":"), lpeg.P("?"), lpeg.P("#"), lpeg.P("/"), lpeg.P("%"), lpeg.P(-1)
-
-local hexdigit = lpeg.R("09","AF","af")
-local plus = lpeg.P("+")
-local escaped = (plus / " ") + (percent * lpeg.C(hexdigit * hexdigit) / tochar)
-
--- we assume schemes with more than 1 character (in order to avoid problems with windows disks)
-
-local scheme = lpeg.Cs((escaped+(1-colon-slash-qmark-hash))^2) * colon + lpeg.Cc("")
-local authority = slash * slash * lpeg.Cs((escaped+(1- slash-qmark-hash))^0) + lpeg.Cc("")
-local path = slash * lpeg.Cs((escaped+(1- qmark-hash))^0) + lpeg.Cc("")
-local query = qmark * lpeg.Cs((escaped+(1- hash))^0) + lpeg.Cc("")
-local fragment = hash * lpeg.Cs((escaped+(1- endofstring))^0) + lpeg.Cc("")
-
-local parser = lpeg.Ct(scheme * authority * path * query * fragment)
-
--- todo: reconsider Ct as we can as well have five return values (saves a table)
--- so we can have two parsers, one with and one without
-
-function url.split(str)
- return (type(str) == "string" and lpegmatch(parser,str)) or str
-end
-
--- todo: cache them
-
-function url.hashed(str)
- local s = url.split(str)
- local somescheme = s[1] ~= ""
- return {
- scheme = (somescheme and s[1]) or "file",
- authority = s[2],
- path = s[3],
- query = s[4],
- fragment = s[5],
- original = str,
- noscheme = not somescheme,
- }
-end
-
-function url.hasscheme(str)
- return url.split(str)[1] ~= ""
-end
-
-function url.addscheme(str,scheme)
- return (url.hasscheme(str) and str) or ((scheme or "file:///") .. str)
-end
-
-function url.construct(hash)
- local fullurl = hash.sheme .. "://".. hash.authority .. hash.path
- if hash.query then
- fullurl = fullurl .. "?".. hash.query
- end
- if hash.fragment then
- fullurl = fullurl .. "?".. hash.fragment
- end
- return fullurl
-end
-
-function url.filename(filename)
- local t = url.hashed(filename)
- return (t.scheme == "file" and (gsub(t.path,"^/([a-zA-Z])([:|])/)","%1:"))) or filename
-end
-
-function url.query(str)
- if type(str) == "string" then
- local t = { }
- for k, v in gmatch(str,"([^&=]*)=([^&=]*)") do
- t[k] = v
- end
- return t
- else
- return str
- end
-end
-
---~ print(url.filename("file:///c:/oeps.txt"))
---~ print(url.filename("c:/oeps.txt"))
---~ print(url.filename("file:///oeps.txt"))
---~ print(url.filename("file:///etc/test.txt"))
---~ print(url.filename("/oeps.txt"))
-
---~ from the spec on the web (sort of):
---~
---~ function test(str)
---~ print(table.serialize(url.hashed(str)))
---~ end
---~
---~ test("%56pass%20words")
---~ test("file:///c:/oeps.txt")
---~ test("file:///c|/oeps.txt")
---~ test("file:///etc/oeps.txt")
---~ test("file://./etc/oeps.txt")
---~ test("file:////etc/oeps.txt")
---~ test("ftp://ftp.is.co.za/rfc/rfc1808.txt")
---~ test("http://www.ietf.org/rfc/rfc2396.txt")
---~ test("ldap://[2001:db8::7]/c=GB?objectClass?one#what")
---~ test("mailto:John.Doe@example.com")
---~ test("news:comp.infosystems.www.servers.unix")
---~ test("tel:+1-816-555-1212")
---~ test("telnet://192.0.2.16:80/")
---~ test("urn:oasis:names:specification:docbook:dtd:xml:4.1.2")
---~ test("/etc/passwords")
---~ test("http://www.pragma-ade.com/spaced%20name")
-
---~ test("zip:///oeps/oeps.zip#bla/bla.tex")
---~ test("zip:///oeps/oeps.zip?bla/bla.tex")
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-dir'] = {
- 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"
-}
-
--- dir.expand_name will be merged with cleanpath and collapsepath
-
-local type = type
-local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
-local lpegmatch = lpeg.match
-
-dir = dir or { }
-
--- handy
-
-function dir.current()
- return (gsub(lfs.currentdir(),"\\","/"))
-end
-
--- optimizing for no string.find (*) does not save time
-
-local attributes = lfs.attributes
-local walkdir = lfs.dir
-
-local function glob_pattern(path,patt,recurse,action)
- 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
- glob_pattern(full,patt,recurse,action)
- end
- end
- end
-end
-
-dir.glob_pattern = glob_pattern
-
-local function collect_pattern(path,patt,recurse,result)
- local ok, scanner
- result = result or { }
- 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 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") and (name ~= '.') and (name ~= "..") then
- attr.list = collect_pattern(full,patt,recurse)
- result[name] = attr
- end
- end
- end
- return result
-end
-
-dir.collect_pattern = collect_pattern
-
-local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
-
-local pattern = Ct {
- [1] = (C(P(".") + P("/")^1) + C(R("az","AZ") * P(":") * P("/")^0) + Cc("./")) * V(2) * V(3),
- [2] = C(((1-S("*?/"))^0 * P("/"))^0),
- [3] = C(P(1)^0)
-}
-
-local filter = Cs ( (
- P("**") / ".*" +
- P("*") / "[^/]*" +
- P("?") / "[^/]" +
- P(".") / "%%." +
- P("+") / "%%+" +
- P("-") / "%%-" +
- P(1)
-)^0 )
-
-local function glob(str,t)
- if type(t) == "function" then
- if type(str) == "table" then
- for s=1,#str do
- glob(str[s],t)
- end
- elseif lfs.isfile(str) then
- t(str)
- else
- local split = lpegmatch(pattern,str)
- if split then
- local root, path, base = split[1], split[2], split[3]
- local recurse = find(base,"%*%*")
- local start = root .. path
- local result = lpegmatch(filter,start .. base)
- glob_pattern(start,result,recurse,t)
- end
- end
- else
- if type(str) == "table" then
- local t = t or { }
- for s=1,#str do
- glob(str[s],t)
- end
- return t
- elseif lfs.isfile(str) then
- local t = t or { }
- t[#t+1] = str
- return t
- else
- local split = lpegmatch(pattern,str)
- 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,"%*%*")
- local start = root .. path
- local result = lpegmatch(filter,start .. base)
- glob_pattern(start,result,recurse,action)
- return t
- else
- return { }
- end
- end
- end
-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 function globfiles(path,recurse,func,files) -- func == pattern or function
- if type(func) == "string" then
- local s = func -- alas, we need this indirect way
- func = function(name) return find(name,s) end
- end
- files = files or { }
- for name in walkdir(path) do
- if find(name,"^%.") then
- --- skip
- else
- local mode = attributes(name,'mode')
- if mode == "directory" then
- if recurse then
- globfiles(path .. "/" .. name,recurse,func,files)
- end
- elseif mode == "file" then
- if func then
- if func(name) then
- files[#files+1] = path .. "/" .. name
- end
- else
- files[#files+1] = path .. "/" .. name
- end
- end
- end
- end
- return files
-end
-
-dir.globfiles = globfiles
-
--- t = dir.glob("c:/data/develop/context/sources/**/????-*.tex")
--- t = dir.glob("c:/data/develop/tex/texmf/**/*.tex")
--- t = dir.glob("c:/data/develop/context/texmf/**/*.tex")
--- t = dir.glob("f:/minimal/tex/**/*")
--- print(dir.ls("f:/minimal/tex/**/*"))
--- print(dir.ls("*.tex"))
-
-function dir.ls(pattern)
- return table.concat(glob(pattern),"\n")
-end
-
---~ mkdirs("temp")
---~ mkdirs("a/b/c")
---~ mkdirs(".","/a/b/c")
---~ mkdirs("a","b","c")
-
-local make_indeed = true -- false
-
-if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
-
- function dir.mkdirs(...)
- local str, pth, t = "", "", { ... }
- for i=1,#t do
- local s = t[i]
- if s ~= "" then
- if str ~= "" then
- str = str .. "/" .. s
- else
- str = s
- end
- end
- end
- local first, middle, last
- local drive = false
- first, middle, last = match(str,"^(//)(//*)(.*)$")
- if first then
- -- empty network path == local path
- else
- first, last = match(str,"^(//)/*(.-)$")
- if first then
- middle, last = match(str,"([^/]+)/+(.-)$")
- if middle then
- pth = "//" .. middle
- else
- pth = "//" .. last
- last = ""
- end
- else
- first, middle, last = match(str,"^([a-zA-Z]:)(/*)(.-)$")
- if first then
- pth, drive = first .. middle, true
- else
- middle, last = match(str,"^(/*)(.-)$")
- if not middle then
- last = str
- end
- end
- end
- end
- for s in gmatch(last,"[^/]+") do
- if pth == "" then
- pth = s
- elseif drive then
- pth, drive = pth .. s, false
- else
- pth = pth .. "/" .. s
- end
- if make_indeed and not lfs.isdir(pth) then
- lfs.mkdir(pth)
- end
- end
- return pth, (lfs.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/"))
-
- function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
- local first, nothing, last = match(str,"^(//)(//*)(.*)$")
- if first then
- first = dir.current() .. "/"
- 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 = lfs.currentdir()
- if lfs.chdir(first) then
- first = dir.current()
- end
- lfs.chdir(d)
- 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 == "" then
- return first
- else
- return first .. "/" .. last
- end
- end
-
-else
-
- function dir.mkdirs(...)
- local str, pth, t = "", "", { ... }
- for i=1,#t do
- local s = t[i]
- if s ~= "" then
- if str ~= "" then
- str = str .. "/" .. s
- else
- str = s
- end
- end
- end
- str = gsub(str,"/+","/")
- if find(str,"^/") then
- pth = "/"
- for s in gmatch(str,"[^/]+") do
- local first = (pth == "/")
- if first then
- pth = pth .. s
- else
- pth = pth .. "/" .. s
- end
- if make_indeed and not first and not lfs.isdir(pth) then
- lfs.mkdir(pth)
- end
- end
- else
- pth = "."
- for s in gmatch(str,"[^/]+") do
- pth = pth .. "/" .. s
- if make_indeed and not lfs.isdir(pth) then
- lfs.mkdir(pth)
- end
- end
- end
- return pth, (lfs.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/"))
-
- function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
- if not find(str,"^/") then
- str = lfs.currentdir() .. "/" .. str
- end
- str = gsub(str,"//","/")
- str = gsub(str,"/%./","/")
- return str
- end
-
-end
-
-dir.makedirs = dir.mkdirs
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-boolean'] = {
- 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"
-}
-
-boolean = boolean or { }
-
-local type, tonumber = type, tonumber
-
-function boolean.tonumber(b)
- if b then return 1 else return 0 end
-end
-
-function toboolean(str,tolerant)
- if tolerant then
- local tstr = type(str)
- if tstr == "string" then
- return str == "true" or str == "yes" or str == "on" or str == "1" or str == "t"
- elseif tstr == "number" then
- return tonumber(str) ~= 0
- elseif tstr == "nil" then
- return false
- else
- return str
- end
- elseif str == "true" then
- return true
- elseif str == "false" then
- return false
- else
- return str
- end
-end
-
-function string.is_boolean(str)
- if type(str) == "string" then
- if str == "true" or str == "yes" or str == "on" or str == "t" then
- return true
- elseif str == "false" or str == "no" or str == "off" or str == "f" then
- return false
- end
- end
- return nil
-end
-
-function boolean.alwaystrue()
- return true
-end
-
-function boolean.falsetrue()
- return false
-end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-unicode'] = {
- 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"
-}
-
-if not unicode then
-
- unicode = { utf8 = { } }
-
- local floor, char = math.floor, string.char
-
- function unicode.utf8.utfchar(n)
- if n < 0x80 then
- return char(n)
- elseif n < 0x800 then
- return char(0xC0 + floor(n/0x40)) .. char(0x80 + (n % 0x40))
- elseif n < 0x10000 then
- return char(0xE0 + floor(n/0x1000)) .. char(0x80 + (floor(n/0x40) % 0x40)) .. char(0x80 + (n % 0x40))
- elseif n < 0x40000 then
- return char(0xF0 + floor(n/0x40000)) .. char(0x80 + floor(n/0x1000)) .. char(0x80 + (floor(n/0x40) % 0x40)) .. char(0x80 + (n % 0x40))
- else -- wrong:
- -- return char(0xF1 + floor(n/0x1000000)) .. char(0x80 + floor(n/0x40000)) .. char(0x80 + floor(n/0x1000)) .. char(0x80 + (floor(n/0x40) % 0x40)) .. char(0x80 + (n % 0x40))
- return "?"
- end
- end
-
-end
-
-utf = utf or unicode.utf8
-
-local concat, utfchar, utfgsub = table.concat, utf.char, utf.gsub
-local char, byte, find, bytepairs = string.char, string.byte, string.find, string.bytepairs
-
--- 0 EF BB BF UTF-8
--- 1 FF FE UTF-16-little-endian
--- 2 FE FF UTF-16-big-endian
--- 3 FF FE 00 00 UTF-32-little-endian
--- 4 00 00 FE FF UTF-32-big-endian
-
-unicode.utfname = {
- [0] = 'utf-8',
- [1] = 'utf-16-le',
- [2] = 'utf-16-be',
- [3] = 'utf-32-le',
- [4] = 'utf-32-be'
-}
-
--- \000 fails in <= 5.0 but is valid in >=5.1 where %z is depricated
-
-function unicode.utftype(f)
- local str = f:read(4)
- if not str then
- f:seek('set')
- return 0
- -- elseif find(str,"^%z%z\254\255") then -- depricated
- -- elseif find(str,"^\000\000\254\255") then -- not permitted and bugged
- elseif find(str,"\000\000\254\255",1,true) then -- seems to work okay (TH)
- return 4
- -- elseif find(str,"^\255\254%z%z") then -- depricated
- -- elseif find(str,"^\255\254\000\000") then -- not permitted and bugged
- elseif find(str,"\255\254\000\000",1,true) then -- seems to work okay (TH)
- return 3
- elseif find(str,"^\254\255") then
- f:seek('set',2)
- return 2
- elseif find(str,"^\255\254") then
- f:seek('set',2)
- return 1
- elseif find(str,"^\239\187\191") then
- f:seek('set',3)
- return 0
- else
- f:seek('set')
- return 0
- end
-end
-
-function unicode.utf16_to_utf8(str, endian) -- maybe a gsub is faster or an lpeg
- local result, tmp, n, m, p = { }, { }, 0, 0, 0
- -- lf | cr | crlf / (cr:13, lf:10)
- local function doit()
- if n == 10 then
- if p ~= 13 then
- result[#result+1] = concat(tmp)
- tmp = { }
- p = 0
- end
- elseif n == 13 then
- result[#result+1] = concat(tmp)
- tmp = { }
- p = n
- else
- tmp[#tmp+1] = utfchar(n)
- p = 0
- end
- end
- for l,r in bytepairs(str) do
- if r then
- if endian then
- n = l*256 + r
- else
- n = r*256 + l
- end
- if m > 0 then
- n = (m-0xD800)*0x400 + (n-0xDC00) + 0x10000
- m = 0
- doit()
- elseif n >= 0xD800 and n <= 0xDBFF then
- m = n
- else
- doit()
- end
- end
- end
- if #tmp > 0 then
- result[#result+1] = concat(tmp)
- end
- return result
-end
-
-function unicode.utf32_to_utf8(str, endian)
- local result = { }
- local tmp, n, m, p = { }, 0, -1, 0
- -- lf | cr | crlf / (cr:13, lf:10)
- local function doit()
- if n == 10 then
- if p ~= 13 then
- result[#result+1] = concat(tmp)
- tmp = { }
- p = 0
- end
- elseif n == 13 then
- result[#result+1] = concat(tmp)
- tmp = { }
- p = n
- else
- tmp[#tmp+1] = utfchar(n)
- p = 0
- end
- end
- for a,b in bytepairs(str) do
- if a and b then
- if m < 0 then
- if endian then
- m = a*256*256*256 + b*256*256
- else
- m = b*256 + a
- end
- else
- if endian then
- n = m + a*256 + b
- else
- n = m + b*256*256*256 + a*256*256
- end
- m = -1
- doit()
- end
- else
- break
- end
- end
- if #tmp > 0 then
- result[#result+1] = concat(tmp)
- end
- return result
-end
-
-local function little(c)
- local b = byte(c) -- b = c:byte()
- if b < 0x10000 then
- return char(b%256,b/256)
- else
- b = b - 0x10000
- local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00
- return char(b1%256,b1/256,b2%256,b2/256)
- end
-end
-
-local function big(c)
- local b = byte(c)
- if b < 0x10000 then
- return char(b/256,b%256)
- else
- b = b - 0x10000
- local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00
- return char(b1/256,b1%256,b2/256,b2%256)
- end
-end
-
-function unicode.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
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-math'] = {
- 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 floor, sin, cos, tan = math.floor, math.sin, math.cos, math.tan
-
-if not math.round then
- function math.round(x)
- return floor(x + 0.5)
- end
-end
-
-if not math.div then
- function math.div(n,m)
- return floor(n/m)
- end
-end
-
-if not math.mod then
- function math.mod(n,m)
- return n % m
- end
-end
-
-local pipi = 2*math.pi/360
-
-function math.sind(d)
- return sin(d*pipi)
-end
-
-function math.cosd(d)
- return cos(d*pipi)
-end
-
-function math.tand(d)
- return tan(d*pipi)
-end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-utils'] = {
- 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"
-}
-
--- hm, quite unreadable
-
-local gsub = string.gsub
-local concat = table.concat
-local type, next = type, next
-
-if not utils then utils = { } end
-if not utils.merger then utils.merger = { } end
-if not utils.lua then utils.lua = { } end
-
-utils.merger.m_begin = "begin library merge"
-utils.merger.m_end = "end library merge"
-utils.merger.pattern =
- "%c+" ..
- "%-%-%s+" .. utils.merger.m_begin ..
- "%c+(.-)%c+" ..
- "%-%-%s+" .. utils.merger.m_end ..
- "%c+"
-
-function utils.merger._self_fake_()
- return
- "-- " .. "created merged file" .. "\n\n" ..
- "-- " .. utils.merger.m_begin .. "\n\n" ..
- "-- " .. utils.merger.m_end .. "\n\n"
-end
-
-function utils.report(...)
- print(...)
-end
-
-utils.merger.strip_comment = true
-
-function utils.merger._self_load_(name)
- local f, data = io.open(name), ""
- if f then
- utils.report("reading merge from %s",name)
- data = f:read("*all")
- f:close()
- else
- utils.report("unknown file to merge %s",name)
- end
- if data and utils.merger.strip_comment then
- -- saves some 20K
- data = gsub(data,"%-%-~[^\n\r]*[\r\n]", "")
- end
- return data or ""
-end
-
-function utils.merger._self_save_(name, data)
- if data ~= "" then
- local f = io.open(name,'w')
- if f then
- utils.report("saving merge from %s",name)
- f:write(data)
- f:close()
- end
- end
-end
-
-function utils.merger._self_swap_(data,code)
- if data ~= "" then
- return (gsub(data,utils.merger.pattern, function(s)
- return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n"
- end, 1))
- else
- return ""
- end
-end
-
---~ stripper:
---~
---~ data = gsub(data,"%-%-~[^\n]*\n","")
---~ data = gsub(data,"\n\n+","\n")
-
-function utils.merger._self_libs_(libs,list)
- local result, f, frozen = { }, nil, false
- result[#result+1] = "\n"
- if type(libs) == 'string' then libs = { libs } end
- if type(list) == 'string' then list = { list } end
- local foundpath = nil
- for i=1,#libs do
- local lib = libs[i]
- for j=1,#list do
- local pth = gsub(list[j],"\\","/") -- file.clean_path
- utils.report("checking library path %s",pth)
- local name = pth .. "/" .. lib
- if lfs.isfile(name) then
- foundpath = pth
- end
- end
- if foundpath then break end
- end
- if foundpath then
- utils.report("using library path %s",foundpath)
- local right, wrong = { }, { }
- for i=1,#libs do
- local lib = libs[i]
- local fullname = foundpath .. "/" .. lib
- if lfs.isfile(fullname) then
- -- right[#right+1] = lib
- utils.report("merging library %s",fullname)
- result[#result+1] = "do -- create closure to overcome 200 locals limit"
- result[#result+1] = io.loaddata(fullname,true)
- result[#result+1] = "end -- of closure"
- else
- -- wrong[#wrong+1] = lib
- utils.report("no library %s",fullname)
- end
- end
- if #right > 0 then
- utils.report("merged libraries: %s",concat(right," "))
- end
- if #wrong > 0 then
- utils.report("skipped libraries: %s",concat(wrong," "))
- end
- else
- utils.report("no valid library path found")
- end
- return concat(result, "\n\n")
-end
-
-function utils.merger.selfcreate(libs,list,target)
- if target then
- utils.merger._self_save_(
- target,
- utils.merger._self_swap_(
- utils.merger._self_fake_(),
- utils.merger._self_libs_(libs,list)
- )
- )
- end
-end
-
-function utils.merger.selfmerge(name,libs,list,target)
- utils.merger._self_save_(
- target or name,
- utils.merger._self_swap_(
- utils.merger._self_load_(name),
- utils.merger._self_libs_(libs,list)
- )
- )
-end
-
-function utils.merger.selfclean(name)
- utils.merger._self_save_(
- name,
- utils.merger._self_swap_(
- utils.merger._self_load_(name),
- ""
- )
- )
-end
-
-function utils.lua.compile(luafile, lucfile, cleanup, strip) -- defaults: cleanup=false strip=true
- -- utils.report("compiling",luafile,"into",lucfile)
- os.remove(lucfile)
- local command = "-o " .. string.quote(lucfile) .. " " .. string.quote(luafile)
- if strip ~= false then
- command = "-s " .. command
- end
- local done = (os.spawn("texluac " .. command) == 0) or (os.spawn("luac " .. command) == 0)
- if done and cleanup == true and lfs.isfile(lucfile) and lfs.isfile(luafile) then
- -- utils.report("removing",luafile)
- os.remove(luafile)
- end
- return done
-end
-
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['l-aux'] = {
- 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"
-}
-
--- for inline, no store split : for s in string.gmatch(str,",* *([^,]+)") do .. end
-
-aux = aux or { }
-
-local concat, format, gmatch = table.concat, string.format, string.gmatch
-local tostring, type = tostring, type
-local lpegmatch = lpeg.match
-
-local P, R, V = lpeg.P, lpeg.R, lpeg.V
-
-local escape, left, right = P("\\"), P('{'), P('}')
-
-lpeg.patterns.balanced = P {
- [1] = ((escape * (left+right)) + (1 - (left+right)) + V(2))^0,
- [2] = left * V(1) * right
-}
-
-local space = lpeg.P(' ')
-local equal = lpeg.P("=")
-local comma = lpeg.P(",")
-local lbrace = lpeg.P("{")
-local rbrace = lpeg.P("}")
-local nobrace = 1 - (lbrace+rbrace)
-local nested = lpeg.P { lbrace * (nobrace + lpeg.V(1))^0 * rbrace }
-local spaces = space^0
-
-local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
-
-local key = lpeg.C((1-equal-comma)^1)
-local pattern_a = (space+comma)^0 * (key * equal * value + key * lpeg.C(""))
-local pattern_c = (space+comma)^0 * (key * equal * value)
-
-local key = lpeg.C((1-space-equal-comma)^1)
-local pattern_b = spaces * comma^0 * spaces * (key * ((spaces * equal * spaces * value) + lpeg.C("")))
-
--- "a=1, b=2, c=3, d={a{b,c}d}, e=12345, f=xx{a{b,c}d}xx, g={}" : outer {} removes, leading spaces ignored
-
-local hash = { }
-
-local function set(key,value) -- using Carg is slower here
- hash[key] = value
-end
-
-local pattern_a_s = (pattern_a/set)^1
-local pattern_b_s = (pattern_b/set)^1
-local pattern_c_s = (pattern_c/set)^1
-
-aux.settings_to_hash_pattern_a = pattern_a_s
-aux.settings_to_hash_pattern_b = pattern_b_s
-aux.settings_to_hash_pattern_c = pattern_c_s
-
-function aux.make_settings_to_hash_pattern(set,how)
- if how == "strict" then
- return (pattern_c/set)^1
- elseif how == "tolerant" then
- return (pattern_b/set)^1
- else
- return (pattern_a/set)^1
- end
-end
-
-function aux.settings_to_hash(str,existing)
- if str and str ~= "" then
- hash = existing or { }
- if moretolerant then
- lpegmatch(pattern_b_s,str)
- else
- lpegmatch(pattern_a_s,str)
- end
- return hash
- else
- return { }
- end
-end
-
-function aux.settings_to_hash_tolerant(str,existing)
- if str and str ~= "" then
- hash = existing or { }
- lpegmatch(pattern_b_s,str)
- return hash
- else
- return { }
- end
-end
-
-function aux.settings_to_hash_strict(str,existing)
- if str and str ~= "" then
- hash = existing or { }
- lpegmatch(pattern_c_s,str)
- return next(hash) and hash
- else
- return nil
- end
-end
-
-local separator = comma * space^0
-local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
-local pattern = lpeg.Ct(value*(separator*value)^0)
-
--- "aap, {noot}, mies" : outer {} removes, leading spaces ignored
-
-aux.settings_to_array_pattern = pattern
-
--- we could use a weak table as cache
-
-function aux.settings_to_array(str)
- if not str or str == "" then
- return { }
- else
- return lpegmatch(pattern,str)
- end
-end
-
-local function set(t,v)
- t[#t+1] = v
-end
-
-local value = lpeg.P(lpeg.Carg(1)*value) / set
-local pattern = value*(separator*value)^0 * lpeg.Carg(1)
-
-function aux.add_settings_to_array(t,str)
- return lpegmatch(pattern,str,nil,t)
-end
-
-function aux.hash_to_string(h,separator,yes,no,strict,omit)
- if h then
- local t, s = { }, table.sortedkeys(h)
- omit = omit and table.tohash(omit)
- for i=1,#s do
- local key = s[i]
- if not omit or not omit[key] then
- local value = h[key]
- if type(value) == "boolean" then
- if yes and no then
- if value then
- t[#t+1] = key .. '=' .. yes
- elseif not strict then
- t[#t+1] = key .. '=' .. no
- end
- elseif value or not strict then
- t[#t+1] = key .. '=' .. tostring(value)
- end
- else
- t[#t+1] = key .. '=' .. value
- end
- end
- end
- return concat(t,separator or ",")
- else
- return ""
- end
-end
-
-function aux.array_to_string(a,separator)
- if a then
- return concat(a,separator or ",")
- else
- return ""
- end
-end
-
-function aux.settings_to_set(str,t)
- t = t or { }
- for s in gmatch(str,"%s*([^,]+)") do
- t[s] = true
- end
- return t
-end
-
-local value = lbrace * lpeg.C((nobrace + nested)^0) * rbrace
-local pattern = lpeg.Ct((space + value)^0)
-
-function aux.arguments_to_table(str)
- return lpegmatch(pattern,str)
-end
-
--- temporary here
-
-function aux.getparameters(self,class,parentclass,settings)
- local sc = self[class]
- if not sc then
- sc = table.clone(self[parent])
- self[class] = sc
- end
- aux.settings_to_hash(settings,sc)
-end
-
--- temporary here
-
-local digit = lpeg.R("09")
-local period = lpeg.P(".")
-local zero = lpeg.P("0")
-local trailingzeros = zero^0 * -digit -- suggested by Roberto R
-local case_1 = period * trailingzeros / ""
-local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
-local number = digit^1 * (case_1 + case_2)
-local stripper = lpeg.Cs((number + 1)^0)
-
---~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
---~ collectgarbage("collect")
---~ str = string.rep(sample,10000)
---~ local ts = os.clock()
---~ lpegmatch(stripper,str)
---~ print(#str, os.clock()-ts, lpegmatch(stripper,sample))
-
-lpeg.patterns.strip_zeros = stripper
-
-function aux.strip_zeros(str)
- return lpegmatch(stripper,str)
-end
-
-function aux.definetable(target) -- defines undefined tables
- local composed, t = nil, { }
- for name in gmatch(target,"([^%.]+)") do
- if composed then
- composed = composed .. "." .. name
- else
- composed = name
- end
- t[#t+1] = format("%s = %s or { }",composed,composed)
- end
- return concat(t,"\n")
-end
-
-function aux.accesstable(target)
- local t = _G
- for name in gmatch(target,"([^%.]+)") do
- t = t[name]
- end
- return t
-end
-
---~ function string.commaseparated(str)
---~ return gmatch(str,"([^,%s]+)")
---~ end
-
--- as we use this a lot ...
-
---~ function aux.cachefunction(action,weak)
---~ local cache = { }
---~ if weak then
---~ setmetatable(cache, { __mode = "kv" } )
---~ end
---~ local function reminder(str)
---~ local found = cache[str]
---~ if not found then
---~ found = action(str)
---~ cache[str] = found
---~ end
---~ return found
---~ end
---~ return reminder, cache
---~ end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['trac-tra'] = {
- version = 1.001,
- comment = "companion to trac-tra.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- the <anonymous> tag is kind of generic and used for functions that are not
--- bound to a variable, like node.new, node.copy etc (contrary to for instance
--- node.has_attribute which is bound to a has_attribute local variable in mkiv)
-
-local debug = require "debug"
-
-local getinfo = debug.getinfo
-local type, next = type, next
-local concat = table.concat
-local format, find, lower, gmatch, gsub = string.format, string.find, string.lower, string.gmatch, string.gsub
-
-debugger = debugger or { }
-
-local counters = { }
-local names = { }
-
--- one
-
-local function hook()
- local f = getinfo(2,"f").func
- local n = getinfo(2,"Sn")
--- if n.what == "C" and n.name then print (n.namewhat .. ': ' .. n.name) end
- if f then
- local cf = counters[f]
- if cf == nil then
- counters[f] = 1
- names[f] = n
- else
- counters[f] = cf + 1
- end
- end
-end
-local function getname(func)
- local n = names[func]
- if n then
- if n.what == "C" then
- return n.name or '<anonymous>'
- else
- -- source short_src linedefined what name namewhat nups func
- local name = n.name or n.namewhat or n.what
- if not name or name == "" then name = "?" end
- return format("%s : %s : %s", n.short_src or "unknown source", n.linedefined or "--", name)
- end
- else
- return "unknown"
- end
-end
-function debugger.showstats(printer,threshold)
- printer = printer or texio.write or print
- threshold = threshold or 0
- local total, grandtotal, functions = 0, 0, 0
- printer("\n") -- ugly but ok
- -- table.sort(counters)
- for func, count in next, counters do
- if count > threshold then
- local name = getname(func)
- if not find(name,"for generator") then
- printer(format("%8i %s", count, name))
- total = total + count
- end
- end
- grandtotal = grandtotal + count
- functions = functions + 1
- end
- printer(format("functions: %s, total: %s, grand total: %s, threshold: %s\n", functions, total, grandtotal, threshold))
-end
-
--- two
-
---~ local function hook()
---~ local n = getinfo(2)
---~ if n.what=="C" and not n.name then
---~ local f = tostring(debug.traceback())
---~ local cf = counters[f]
---~ if cf == nil then
---~ counters[f] = 1
---~ names[f] = n
---~ else
---~ counters[f] = cf + 1
---~ end
---~ end
---~ end
---~ function debugger.showstats(printer,threshold)
---~ printer = printer or texio.write or print
---~ threshold = threshold or 0
---~ local total, grandtotal, functions = 0, 0, 0
---~ printer("\n") -- ugly but ok
---~ -- table.sort(counters)
---~ for func, count in next, counters do
---~ if count > threshold then
---~ printer(format("%8i %s", count, func))
---~ total = total + count
---~ end
---~ grandtotal = grandtotal + count
---~ functions = functions + 1
---~ end
---~ printer(format("functions: %s, total: %s, grand total: %s, threshold: %s\n", functions, total, grandtotal, threshold))
---~ end
-
--- rest
-
-function debugger.savestats(filename,threshold)
- local f = io.open(filename,'w')
- if f then
- debugger.showstats(function(str) f:write(str) end,threshold)
- f:close()
- end
-end
-
-function debugger.enable()
- debug.sethook(hook,"c")
-end
-
-function debugger.disable()
- debug.sethook()
---~ counters[debug.getinfo(2,"f").func] = nil
-end
-
-function debugger.tracing()
- local n = tonumber(os.env['MTX.TRACE.CALLS']) or tonumber(os.env['MTX_TRACE_CALLS']) or 0
- if n > 0 then
- function debugger.tracing() return true end ; return true
- else
- function debugger.tracing() return false end ; return false
- end
-end
-
---~ debugger.enable()
-
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
-
---~ debugger.disable()
-
---~ print("")
---~ debugger.showstats()
---~ print("")
---~ debugger.showstats(print,3)
-
-setters = setters or { }
-setters.data = setters.data or { }
-
---~ local function set(t,what,value)
---~ local data, done = t.data, t.done
---~ if type(what) == "string" then
---~ what = aux.settings_to_array(what) -- inefficient but ok
---~ end
---~ for i=1,#what do
---~ local w = what[i]
---~ for d, f in next, data do
---~ if done[d] then
---~ -- prevent recursion due to wildcards
---~ elseif find(d,w) then
---~ done[d] = true
---~ for i=1,#f do
---~ f[i](value)
---~ end
---~ end
---~ end
---~ end
---~ end
-
-local function set(t,what,value)
- local data, done = t.data, t.done
- if type(what) == "string" then
- what = aux.settings_to_hash(what) -- inefficient but ok
- end
- for w, v in next, what do
- if v == "" then
- v = value
- else
- v = toboolean(v)
- end
- for d, f in next, data do
- if done[d] then
- -- prevent recursion due to wildcards
- elseif find(d,w) then
- done[d] = true
- for i=1,#f do
- f[i](v)
- end
- end
- end
- end
-end
-
-local function reset(t)
- for d, f in next, t.data do
- for i=1,#f do
- f[i](false)
- end
- end
-end
-
-local function enable(t,what)
- set(t,what,true)
-end
-
-local function disable(t,what)
- local data = t.data
- if not what or what == "" then
- t.done = { }
- reset(t)
- else
- set(t,what,false)
- end
-end
-
-function setters.register(t,what,...)
- local data = t.data
- what = lower(what)
- local w = data[what]
- if not w then
- w = { }
- data[what] = w
- end
- for _, fnc in next, { ... } do
- local typ = type(fnc)
- if typ == "function" then
- w[#w+1] = fnc
- elseif typ == "string" then
- w[#w+1] = function(value) set(t,fnc,value,nesting) end
- end
- end
-end
-
-function setters.enable(t,what)
- local e = t.enable
- t.enable, t.done = enable, { }
- enable(t,string.simpleesc(tostring(what)))
- t.enable, t.done = e, { }
-end
-
-function setters.disable(t,what)
- local e = t.disable
- t.disable, t.done = disable, { }
- disable(t,string.simpleesc(tostring(what)))
- t.disable, t.done = e, { }
-end
-
-function setters.reset(t)
- t.done = { }
- reset(t)
-end
-
-function setters.list(t) -- pattern
- local list = table.sortedkeys(t.data)
- local user, system = { }, { }
- for l=1,#list do
- local what = list[l]
- if find(what,"^%*") then
- system[#system+1] = what
- else
- user[#user+1] = what
- end
- end
- return user, system
-end
-
-function setters.show(t)
- commands.writestatus("","")
- local list = setters.list(t)
- for k=1,#list do
- commands.writestatus(t.name,list[k])
- end
- commands.writestatus("","")
-end
-
--- we could have used a bit of oo and the trackers:enable syntax but
--- there is already a lot of code around using the singular tracker
-
--- we could make this into a module
-
-function setters.new(name)
- local t
- t = {
- data = { },
- name = name,
- enable = function(...) setters.enable (t,...) end,
- disable = function(...) setters.disable (t,...) end,
- register = function(...) setters.register(t,...) end,
- list = function(...) setters.list (t,...) end,
- show = function(...) setters.show (t,...) end,
- }
- setters.data[name] = t
- return t
-end
-
-trackers = setters.new("trackers")
-directives = setters.new("directives")
-experiments = setters.new("experiments")
-
--- nice trick: we overload two of the directives related functions with variants that
--- do tracing (itself using a tracker) .. proof of concept
-
-local trace_directives = false local trace_directives = false trackers.register("system.directives", function(v) trace_directives = v end)
-local trace_experiments = false local trace_experiments = false trackers.register("system.experiments", function(v) trace_experiments = v end)
-
-local e = directives.enable
-local d = directives.disable
-
-function directives.enable(...)
- commands.writestatus("directives","enabling: %s",concat({...}," "))
- e(...)
-end
-
-function directives.disable(...)
- commands.writestatus("directives","disabling: %s",concat({...}," "))
- d(...)
-end
-
-local e = experiments.enable
-local d = experiments.disable
-
-function experiments.enable(...)
- commands.writestatus("experiments","enabling: %s",concat({...}," "))
- e(...)
-end
-
-function experiments.disable(...)
- commands.writestatus("experiments","disabling: %s",concat({...}," "))
- d(...)
-end
-
--- a useful example
-
-directives.register("system.nostatistics", function(v)
- statistics.enable = not v
-end)
-
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['luat-env'] = {
- 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"
-}
-
--- A former version provided functionality for non embeded core
--- scripts i.e. runtime library loading. Given the amount of
--- Lua code we use now, this no longer makes sense. Much of this
--- evolved before bytecode arrays were available and so a lot of
--- code has disappeared already.
-
-local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
-
-local format, sub, match, gsub, find = string.format, string.sub, string.match, string.gsub, string.find
-local unquote, quote = string.unquote, string.quote
-
--- precautions
-
-os.setlocale(nil,nil) -- useless feature and even dangerous in luatex
-
-function os.setlocale()
- -- no way you can mess with it
-end
-
--- dirty tricks
-
-if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
- arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil
-end
-
-if profiler and os.env["MTX_PROFILE_RUN"] == "YES" then
- profiler.start("luatex-profile.log")
-end
-
--- environment
-
-environment = environment or { }
-environment.arguments = { }
-environment.files = { }
-environment.sortedflags = nil
-
-if not environment.jobname or environment.jobname == "" then if tex then environment.jobname = tex.jobname end end
-if not environment.version or environment.version == "" then environment.version = "unknown" end
-if not environment.jobname then environment.jobname = "unknown" end
-
-function environment.initialize_arguments(arg)
- local arguments, files = { }, { }
- environment.arguments, environment.files, environment.sortedflags = arguments, files, nil
- for index=1,#arg do
- local argument = arg[index]
- if index > 0 then
- local flag, value = match(argument,"^%-+(.-)=(.-)$")
- if flag then
- arguments[flag] = unquote(value or "")
- else
- flag = match(argument,"^%-+(.+)")
- if flag then
- arguments[flag] = true
- else
- files[#files+1] = argument
- end
- end
- end
- end
- environment.ownname = environment.ownname or arg[0] or 'unknown.lua'
-end
-
-function environment.setargument(name,value)
- environment.arguments[name] = value
-end
-
--- todo: defaults, better checks e.g on type (boolean versus string)
---
--- tricky: too many hits when we support partials unless we add
--- a registration of arguments so from now on we have 'partial'
-
-function environment.argument(name,partial)
- local arguments, sortedflags = environment.arguments, environment.sortedflags
- if arguments[name] then
- return arguments[name]
- elseif partial then
- if not sortedflags then
- sortedflags = table.sortedkeys(arguments)
- for k=1,#sortedflags do
- sortedflags[k] = "^" .. sortedflags[k]
- end
- environment.sortedflags = sortedflags
- end
- -- example of potential clash: ^mode ^modefile
- for k=1,#sortedflags do
- local v = sortedflags[k]
- if find(name,v) then
- return arguments[sub(v,2,#v)]
- end
- end
- end
- return nil
-end
-
-environment.argument("x",true)
-
-function environment.split_arguments(separator) -- rather special, cut-off before separator
- local done, before, after = false, { }, { }
- local original_arguments = environment.original_arguments
- for k=1,#original_arguments do
- local v = original_arguments[k]
- if not done and v == separator then
- done = true
- elseif done then
- after[#after+1] = v
- else
- before[#before+1] = v
- end
- end
- return before, after
-end
-
-function environment.reconstruct_commandline(arg,noquote)
- arg = arg or environment.original_arguments
- if noquote and #arg == 1 then
- local a = arg[1]
- a = resolvers.resolve(a)
- a = unquote(a)
- return a
- elseif #arg > 0 then
- local result = { }
- for i=1,#arg do
- local a = arg[i]
- a = resolvers.resolve(a)
- a = unquote(a)
- a = gsub(a,'"','\\"') -- tricky
- if find(a," ") then
- result[#result+1] = quote(a)
- else
- result[#result+1] = a
- end
- end
- return table.join(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
- local argument = arg[index]
- if find(argument,"^\"") then
- newarg[#newarg+1] = gsub(argument,"^\"","")
- if not find(argument,"\"$") then
- instring = true
- end
- elseif find(argument,"\"$") then
- newarg[#newarg] = newarg[#newarg] .. " " .. gsub(argument,"\"$","")
- instring = false
- elseif instring then
- newarg[#newarg] = newarg[#newarg] .. " " .. argument
- else
- newarg[#newarg+1] = argument
- end
- end
- for i=1,-5,-1 do
- newarg[i] = arg[i]
- end
-
- environment.initialize_arguments(newarg)
- environment.original_arguments = newarg
- environment.raw_arguments = arg
-
- arg = { } -- prevent duplicate handling
-
-end
-
--- weird place ... depends on a not yet loaded module
-
-function environment.texfile(filename)
- return resolvers.find_file(filename,'tex')
-end
-
-function environment.luafile(filename)
- local resolved = resolvers.find_file(filename,'tex') or ""
- if resolved ~= "" then
- return resolved
- end
- resolved = resolvers.find_file(filename,'texmfscripts') or ""
- if resolved ~= "" then
- return resolved
- end
- return resolvers.find_file(filename,'luatexlibs') or ""
-end
-
-environment.loadedluacode = loadfile -- can be overloaded
-
---~ function environment.loadedluacode(name)
---~ if os.spawn("texluac -s -o texluac.luc " .. name) == 0 then
---~ local chunk = loadstring(io.loaddata("texluac.luc"))
---~ os.remove("texluac.luc")
---~ return chunk
---~ else
---~ environment.loadedluacode = loadfile -- can be overloaded
---~ return loadfile(name)
---~ end
---~ end
-
-function environment.luafilechunk(filename) -- used for loading lua bytecode in the format
- filename = file.replacesuffix(filename, "lua")
- local fullname = environment.luafile(filename)
- if fullname and fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading file %s", fullname)
- end
- return environment.loadedluacode(fullname)
- else
- if trace_locating then
- logs.report("fileio","unknown file %s", filename)
- end
- return nil
- end
-end
-
--- the next ones can use the previous ones / combine
-
-function environment.loadluafile(filename, version)
- local lucname, luaname, chunk
- local basename = file.removesuffix(filename)
- if basename == filename then
- lucname, luaname = basename .. ".luc", basename .. ".lua"
- else
- lucname, luaname = nil, basename -- forced suffix
- end
- -- when not overloaded by explicit suffix we look for a luc file first
- local fullname = (lucname and environment.luafile(lucname)) or ""
- if fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading %s", fullname)
- end
- chunk = loadfile(fullname) -- this way we don't need a file exists check
- end
- if chunk then
- assert(chunk)()
- if version then
- -- we check of the version number of this chunk matches
- local v = version -- can be nil
- if modules and modules[filename] then
- v = modules[filename].version -- new method
- elseif versions and versions[filename] then
- v = versions[filename] -- old method
- end
- if v == version then
- return true
- else
- if trace_locating then
- logs.report("fileio","version mismatch for %s: lua=%s, luc=%s", filename, v, version)
- end
- environment.loadluafile(filename)
- end
- else
- return true
- end
- end
- fullname = (luaname and environment.luafile(luaname)) or ""
- if fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading %s", fullname)
- end
- chunk = loadfile(fullname) -- this way we don't need a file exists check
- if not chunk then
- if trace_locating then
- logs.report("fileio","unknown file %s", filename)
- end
- else
- assert(chunk)()
- return true
- end
- end
- return false
-end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['trac-inf'] = {
- version = 1.001,
- comment = "companion to trac-inf.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local format = string.format
-
-local statusinfo, n, registered = { }, 0, { }
-
-statistics = statistics or { }
-
-statistics.enable = true
-statistics.threshold = 0.05
-
--- timing functions
-
-local clock = os.gettimeofday or os.clock
-
-local notimer
-
-function statistics.hastimer(instance)
- return instance and instance.starttime
-end
-
-function statistics.resettiming(instance)
- if not instance then
- notimer = { timing = 0, loadtime = 0 }
- else
- instance.timing, instance.loadtime = 0, 0
- end
-end
-
-function statistics.starttiming(instance)
- if not instance then
- notimer = { }
- instance = notimer
- end
- local it = instance.timing
- if not it then
- it = 0
- end
- if it == 0 then
- instance.starttime = clock()
- if not instance.loadtime then
- instance.loadtime = 0
- end
- else
---~ logs.report("system","nested timing (%s)",tostring(instance))
- end
- instance.timing = it + 1
-end
-
-function statistics.stoptiming(instance, report)
- if not instance then
- instance = notimer
- end
- if instance then
- local it = instance.timing
- if it > 1 then
- instance.timing = it - 1
- else
- local starttime = instance.starttime
- if starttime then
- local stoptime = clock()
- local loadtime = stoptime - starttime
- instance.stoptime = stoptime
- instance.loadtime = instance.loadtime + loadtime
- if report then
- statistics.report("load time %0.3f",loadtime)
- end
- instance.timing = 0
- return loadtime
- end
- end
- end
- return 0
-end
-
-function statistics.elapsedtime(instance)
- if not instance then
- instance = notimer
- end
- return format("%0.3f",(instance and instance.loadtime) or 0)
-end
-
-function statistics.elapsedindeed(instance)
- if not instance then
- instance = notimer
- end
- local t = (instance and instance.loadtime) or 0
- return t > statistics.threshold
-end
-
-function statistics.elapsedseconds(instance,rest) -- returns nil if 0 seconds
- if statistics.elapsedindeed(instance) then
- return format("%s seconds %s", statistics.elapsedtime(instance),rest or "")
- end
-end
-
--- general function
-
-function statistics.register(tag,fnc)
- if statistics.enable and type(fnc) == "function" then
- local rt = registered[tag] or (#statusinfo + 1)
- statusinfo[rt] = { tag, fnc }
- registered[tag] = rt
- if #tag > n then n = #tag end
- end
-end
-
-function statistics.show(reporter)
- if statistics.enable then
- if not reporter then reporter = function(tag,data,n) texio.write_nl(tag .. " " .. data) end end
- -- this code will move
- local register = statistics.register
- register("luatex banner", function()
- return string.lower(status.banner)
- end)
- register("control sequences", function()
- return format("%s of %s", status.cs_count, status.hash_size+status.hash_extra)
- end)
- register("callbacks", function()
- local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0
- return format("direct: %s, indirect: %s, total: %s", total-indirect, indirect, total)
- end)
- register("current memory usage", statistics.memused)
- register("runtime",statistics.runtime)
--- --
- for i=1,#statusinfo do
- local s = statusinfo[i]
- local r = s[2]()
- if r then
- reporter(s[1],r,n)
- end
- end
- texio.write_nl("") -- final newline
- statistics.enable = false
- end
-end
-
-function statistics.show_job_stat(tag,data,n)
- texio.write_nl(format("%-15s: %s - %s","mkiv lua stats",tag:rpadd(n," "),data))
-end
-
-function statistics.memused() -- no math.round yet -)
- local round = math.round or math.floor
- return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000))
-end
-
-if statistics.runtime then
- -- already loaded and set
-elseif luatex and luatex.starttime then
- statistics.starttime = luatex.starttime
- statistics.loadtime = 0
- statistics.timing = 0
-else
- statistics.starttiming(statistics)
-end
-
-function statistics.runtime()
- statistics.stoptiming(statistics)
- return statistics.formatruntime(statistics.elapsedtime(statistics))
-end
-
-function statistics.formatruntime(runtime)
- return format("%s seconds", statistics.elapsedtime(statistics))
-end
-
-function statistics.timed(action,report)
- local timer = { }
- report = report or logs.simple
- statistics.starttiming(timer)
- action()
- statistics.stoptiming(timer)
- report("total runtime: %s",statistics.elapsedtime(timer))
-end
-
--- where, not really the best spot for this:
-
-commands = commands or { }
-
-local timer
-
-function commands.resettimer()
- statistics.resettiming(timer)
- statistics.starttiming(timer)
-end
-
-function commands.elapsedtime()
- statistics.stoptiming(timer)
- tex.sprint(statistics.elapsedtime(timer))
-end
-
-commands.resettimer()
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['trac-log'] = {
- version = 1.001,
- comment = "companion to trac-log.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- this is old code that needs an overhaul
-
---~ io.stdout:setvbuf("no")
---~ io.stderr:setvbuf("no")
-
-local write_nl, write = texio.write_nl or print, texio.write or io.write
-local format, gmatch = string.format, string.gmatch
-local texcount = tex and tex.count
-
-if texlua then
- write_nl = print
- write = io.write
-end
-
---[[ldx--
-<p>This is a prelude to a more extensive logging module. For the sake
-of parsing log files, in addition to the standard logging we will
-provide an <l n='xml'/> structured file. Actually, any logging that
-is hooked into callbacks will be \XML\ by default.</p>
---ldx]]--
-
-logs = logs or { }
-logs.xml = logs.xml or { }
-logs.tex = logs.tex or { }
-
---[[ldx--
-<p>This looks pretty ugly but we need to speed things up a bit.</p>
---ldx]]--
-
-logs.moreinfo = [[
-more information about ConTeXt and the tools that come with it can be found at:
-
-maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
-webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
-wiki : http://contextgarden.net
-]]
-
-logs.levels = {
- ['error'] = 1,
- ['warning'] = 2,
- ['info'] = 3,
- ['debug'] = 4,
-}
-
-logs.functions = {
- 'report', 'start', 'stop', 'push', 'pop', 'line', 'direct',
- 'start_run', 'stop_run',
- 'start_page_number', 'stop_page_number',
- 'report_output_pages', 'report_output_log',
- 'report_tex_stat', 'report_job_stat',
- 'show_open', 'show_close', 'show_load',
-}
-
-logs.tracers = {
-}
-
-logs.level = 0
-logs.mode = string.lower((os.getenv("MTX.LOG.MODE") or os.getenv("MTX_LOG_MODE") or "tex"))
-
-function logs.set_level(level)
- logs.level = logs.levels[level] or level
-end
-
-function logs.set_method(method)
- for _, v in next, logs.functions do
- logs[v] = logs[method][v] or function() end
- end
-end
-
--- tex logging
-
-function logs.tex.report(category,fmt,...) -- new
- if fmt then
- write_nl(category .. " | " .. format(fmt,...))
- else
- write_nl(category .. " |")
- end
-end
-
-function logs.tex.line(fmt,...) -- new
- if fmt then
- write_nl(format(fmt,...))
- else
- write_nl("")
- end
-end
-
---~ function logs.tex.start_page_number()
---~ local real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
---~ if real > 0 then
---~ if user > 0 then
---~ if sub > 0 then
---~ write(format("[%s.%s.%s",real,user,sub))
---~ else
---~ write(format("[%s.%s",real,user))
---~ end
---~ else
---~ write(format("[%s",real))
---~ end
---~ else
---~ write("[-")
---~ end
---~ end
-
---~ function logs.tex.stop_page_number()
---~ write("]")
---~ end
-
-local real, user, sub
-
-function logs.tex.start_page_number()
- real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
-end
-
-function logs.tex.stop_page_number()
- if real > 0 then
- if user > 0 then
- if sub > 0 then
- logs.report("pages", "flushing realpage %s, userpage %s, subpage %s",real,user,sub)
- else
- logs.report("pages", "flushing realpage %s, userpage %s",real,user)
- end
- else
- logs.report("pages", "flushing realpage %s",real)
- end
- else
- logs.report("pages", "flushing page")
- end
- io.flush()
-end
-
-logs.tex.report_job_stat = statistics.show_job_stat
-
--- xml logging
-
-function logs.xml.report(category,fmt,...) -- new
- if fmt then
- write_nl(format("<r category='%s'>%s</r>",category,format(fmt,...)))
- else
- write_nl(format("<r category='%s'/>",category))
- end
-end
-function logs.xml.line(fmt,...) -- new
- if fmt then
- write_nl(format("<r>%s</r>",format(fmt,...)))
- else
- write_nl("<r/>")
- end
-end
-
-function logs.xml.start() if logs.level > 0 then tw("<%s>" ) end end
-function logs.xml.stop () if logs.level > 0 then tw("</%s>") end end
-function logs.xml.push () if logs.level > 0 then tw("<!-- ") end end
-function logs.xml.pop () if logs.level > 0 then tw(" -->" ) end end
-
-function logs.xml.start_run()
- write_nl("<?xml version='1.0' standalone='yes'?>")
- write_nl("<job>") -- xmlns='www.pragma-ade.com/luatex/schemas/context-job.rng'
- write_nl("")
-end
-
-function logs.xml.stop_run()
- write_nl("</job>")
-end
-
-function logs.xml.start_page_number()
- write_nl(format("<p real='%s' page='%s' sub='%s'", texcount.realpageno, texcount.userpageno, texcount.subpageno))
-end
-
-function logs.xml.stop_page_number()
- write("/>")
- write_nl("")
-end
-
-function logs.xml.report_output_pages(p,b)
- write_nl(format("<v k='pages' v='%s'/>", p))
- write_nl(format("<v k='bytes' v='%s'/>", b))
- write_nl("")
-end
-
-function logs.xml.report_output_log()
-end
-
-function logs.xml.report_tex_stat(k,v)
- texiowrite_nl("log","<v k='"..k.."'>"..tostring(v).."</v>")
-end
-
-local level = 0
-
-function logs.xml.show_open(name)
- level = level + 1
- texiowrite_nl(format("<f l='%s' n='%s'>",level,name))
-end
-
-function logs.xml.show_close(name)
- texiowrite("</f> ")
- level = level - 1
-end
-
-function logs.xml.show_load(name)
- texiowrite_nl(format("<f l='%s' n='%s'/>",level+1,name))
-end
-
---
-
-local name, banner = 'report', 'context'
-
-local function report(category,fmt,...)
- if fmt then
- write_nl(format("%s | %s: %s",name,category,format(fmt,...)))
- elseif category then
- write_nl(format("%s | %s",name,category))
- else
- write_nl(format("%s |",name))
- end
-end
-
-local function simple(fmt,...)
- if fmt then
- write_nl(format("%s | %s",name,format(fmt,...)))
- else
- write_nl(format("%s |",name))
- end
-end
-
-function logs.setprogram(_name_,_banner_,_verbose_)
- name, banner = _name_, _banner_
- if _verbose_ then
- trackers.enable("resolvers.locating")
- end
- logs.set_method("tex")
- logs.report = report -- also used in libraries
- logs.simple = simple -- only used in scripts !
- if utils then
- utils.report = simple
- end
- logs.verbose = _verbose_
-end
-
-function logs.setverbose(what)
- if what then
- trackers.enable("resolvers.locating")
- else
- trackers.disable("resolvers.locating")
- end
- logs.verbose = what or false
-end
-
-function logs.extendbanner(_banner_,_verbose_)
- banner = banner .. " | ".. _banner_
- if _verbose_ ~= nil then
- logs.setverbose(what)
- end
-end
-
-logs.verbose = false
-logs.report = logs.tex.report
-logs.simple = logs.tex.report
-
-function logs.reportlines(str) -- todo: <lines></lines>
- for line in gmatch(str,"(.-)[\n\r]") do
- logs.report(line)
- end
-end
-
-function logs.reportline() -- for scripts too
- logs.report()
-end
-
-logs.simpleline = logs.reportline
-
-function logs.reportbanner() -- for scripts too
- logs.report(banner)
-end
-
-function logs.help(message,option)
- logs.reportbanner()
- logs.reportline()
- logs.reportlines(message)
- local moreinfo = logs.moreinfo or ""
- if moreinfo ~= "" and option ~= "nomoreinfo" then
- logs.reportline()
- logs.reportlines(moreinfo)
- end
-end
-
-logs.set_level('error')
-logs.set_method('tex')
-
-function logs.system(whereto,process,jobname,category,...)
- for i=1,10 do
- local f = io.open(whereto,"a")
- if f then
- f:write(format("%s %s => %s => %s => %s\r",os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...)))
- f:close()
- break
- else
- sleep(0.1)
- end
- end
-end
-
---~ local syslogname = "oeps.xxx"
---~
---~ for i=1,10 do
---~ logs.system(syslogname,"context","test","fonts","font %s recached due to newer version (%s)","blabla","123")
---~ end
-
-function logs.fatal(where,...)
- logs.report(where,"fatal error: %s, aborting now",format(...))
- os.exit()
-end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['data-inp'] = {
- 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",
-}
-
--- After a few years using the code the large luat-inp.lua file
--- has been split up a bit. In the process some functionality was
--- dropped:
---
--- * support for reading lsr files
--- * selective scanning (subtrees)
--- * some public auxiliary functions were made private
---
--- TODO: os.getenv -> os.env[]
--- TODO: instances.[hashes,cnffiles,configurations,522]
--- TODO: check escaping in find etc, too much, too slow
-
--- This lib is multi-purpose and can be loaded again later on so that
--- additional functionality becomes available. We will split thislogs.report("fileio",
--- module in components once we're done with prototyping. This is the
--- first code I wrote for LuaTeX, so it needs some cleanup. Before changing
--- something in this module one can best check with Taco or Hans first; there
--- is some nasty trickery going on that relates to traditional kpse support.
-
--- To be considered: hash key lowercase, first entry in table filename
--- (any case), rest paths (so no need for optimization). Or maybe a
--- separate table that matches lowercase names to mixed case when
--- present. In that case the lower() cases can go away. I will do that
--- only when we run into problems with names ... well ... Iwona-Regular.
-
--- Beware, loading and saving is overloaded in luat-tmp!
-
-local format, gsub, find, lower, upper, match, gmatch = string.format, string.gsub, string.find, string.lower, string.upper, string.match, string.gmatch
-local concat, insert, sortedkeys = table.concat, table.insert, table.sortedkeys
-local next, type = next, type
-local lpegmatch = lpeg.match
-
-local trace_locating, trace_detail, trace_expansions = false, false, false
-
-trackers.register("resolvers.locating", function(v) trace_locating = v end)
-trackers.register("resolvers.details", function(v) trace_detail = v end)
-trackers.register("resolvers.expansions", function(v) trace_expansions = v end) -- todo
-
-if not resolvers then
- resolvers = {
- suffixes = { },
- formats = { },
- dangerous = { },
- suffixmap = { },
- alternatives = { },
- locators = { }, -- locate databases
- hashers = { }, -- load databases
- generators = { }, -- generate databases
- }
-end
-
-local resolvers = resolvers
-
-resolvers.locators .notfound = { nil }
-resolvers.hashers .notfound = { nil }
-resolvers.generators.notfound = { nil }
-
-resolvers.cacheversion = '1.0.1'
-resolvers.cnfname = 'texmf.cnf'
-resolvers.luaname = 'texmfcnf.lua'
-resolvers.homedir = os.env[os.type == "windows" and 'USERPROFILE'] or os.env['HOME'] or '~'
-resolvers.cnfdefault = '{$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}'
-
-local dummy_path_expr = "^!*unset/*$"
-
-local formats = resolvers.formats
-local suffixes = resolvers.suffixes
-local dangerous = resolvers.dangerous
-local suffixmap = resolvers.suffixmap
-local alternatives = resolvers.alternatives
-
-formats['afm'] = 'AFMFONTS' suffixes['afm'] = { 'afm' }
-formats['enc'] = 'ENCFONTS' suffixes['enc'] = { 'enc' }
-formats['fmt'] = 'TEXFORMATS' suffixes['fmt'] = { 'fmt' }
-formats['map'] = 'TEXFONTMAPS' suffixes['map'] = { 'map' }
-formats['mp'] = 'MPINPUTS' suffixes['mp'] = { 'mp' }
-formats['ocp'] = 'OCPINPUTS' suffixes['ocp'] = { 'ocp' }
-formats['ofm'] = 'OFMFONTS' suffixes['ofm'] = { 'ofm', 'tfm' }
-formats['otf'] = 'OPENTYPEFONTS' suffixes['otf'] = { 'otf' } -- 'ttf'
-formats['opl'] = 'OPLFONTS' suffixes['opl'] = { 'opl' }
-formats['otp'] = 'OTPINPUTS' suffixes['otp'] = { 'otp' }
-formats['ovf'] = 'OVFFONTS' suffixes['ovf'] = { 'ovf', 'vf' }
-formats['ovp'] = 'OVPFONTS' suffixes['ovp'] = { 'ovp' }
-formats['tex'] = 'TEXINPUTS' suffixes['tex'] = { 'tex' }
-formats['tfm'] = 'TFMFONTS' suffixes['tfm'] = { 'tfm' }
-formats['ttf'] = 'TTFONTS' suffixes['ttf'] = { 'ttf', 'ttc', 'dfont' }
-formats['pfb'] = 'T1FONTS' suffixes['pfb'] = { 'pfb', 'pfa' }
-formats['vf'] = 'VFFONTS' suffixes['vf'] = { 'vf' }
-
-formats['fea'] = 'FONTFEATURES' suffixes['fea'] = { 'fea' }
-formats['cid'] = 'FONTCIDMAPS' suffixes['cid'] = { 'cid', 'cidmap' }
-
-formats ['texmfscripts'] = 'TEXMFSCRIPTS' -- new
-suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -- 'lua'
-
-formats ['lua'] = 'LUAINPUTS' -- new
-suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' }
-
--- backward compatible ones
-
-alternatives['map files'] = 'map'
-alternatives['enc files'] = 'enc'
-alternatives['cid maps'] = 'cid' -- great, why no cid files
-alternatives['font feature files'] = 'fea' -- and fea files here
-alternatives['opentype fonts'] = 'otf'
-alternatives['truetype fonts'] = 'ttf'
-alternatives['truetype collections'] = 'ttc'
-alternatives['truetype dictionary'] = 'dfont'
-alternatives['type1 fonts'] = 'pfb'
-
--- obscure ones
-
-formats ['misc fonts'] = ''
-suffixes['misc fonts'] = { }
-
-formats ['sfd'] = 'SFDFONTS'
-suffixes ['sfd'] = { 'sfd' }
-alternatives['subfont definition files'] = 'sfd'
-
--- lib paths
-
-formats ['lib'] = 'CLUAINPUTS' -- new (needs checking)
-suffixes['lib'] = (os.libsuffix and { os.libsuffix }) or { 'dll', 'so' }
-
--- In practice we will work within one tds tree, but i want to keep
--- the option open to build tools that look at multiple trees, which is
--- why we keep the tree specific data in a table. We used to pass the
--- instance but for practical pusposes we now avoid this and use a
--- instance variable.
-
--- here we catch a few new thingies (todo: add these paths to context.tmf)
---
--- FONTFEATURES = .;$TEXMF/fonts/fea//
--- FONTCIDMAPS = .;$TEXMF/fonts/cid//
-
--- we always have one instance active
-
-resolvers.instance = resolvers.instance or nil -- the current one (slow access)
-local instance = resolvers.instance or nil -- the current one (fast access)
-
-function resolvers.newinstance()
-
- -- store once, freeze and faster (once reset we can best use
- -- instance.environment) maybe better have a register suffix
- -- function
-
- for k, v in next, suffixes do
- for i=1,#v do
- local vi = v[i]
- if vi then
- suffixmap[vi] = k
- end
- end
- end
-
- -- because vf searching is somewhat dangerous, we want to prevent
- -- too liberal searching esp because we do a lookup on the current
- -- path anyway; only tex (or any) is safe
-
- for k, v in next, formats do
- dangerous[k] = true
- end
- dangerous.tex = nil
-
- -- the instance
-
- local newinstance = {
- rootpath = '',
- treepath = '',
- progname = 'context',
- engine = 'luatex',
- format = '',
- environment = { },
- variables = { },
- expansions = { },
- files = { },
- remap = { },
- configuration = { },
- setup = { },
- order = { },
- found = { },
- foundintrees = { },
- kpsevars = { },
- hashes = { },
- cnffiles = { },
- luafiles = { },
- lists = { },
- remember = true,
- diskcache = true,
- renewcache = false,
- scandisk = true,
- cachepath = nil,
- loaderror = false,
- sortdata = false,
- savelists = true,
- cleanuppaths = true,
- allresults = false,
- pattern = nil, -- lists
- data = { }, -- only for loading
- force_suffixes = true,
- fakepaths = { },
- }
-
- local ne = newinstance.environment
-
- for k,v in next, os.env do
- ne[k] = resolvers.bare_variable(v)
- end
-
- return newinstance
-
-end
-
-function resolvers.setinstance(someinstance)
- instance = someinstance
- resolvers.instance = someinstance
- return someinstance
-end
-
-function resolvers.reset()
- return resolvers.setinstance(resolvers.newinstance())
-end
-
-local function reset_hashes()
- instance.lists = { }
- instance.found = { }
-end
-
-local function check_configuration() -- not yet ok, no time for debugging now
- if os.env["OSFONTDIR"] then
- -- ok
- elseif os.type == "windows" then
- os.setenv("OSFONTDIR","c:/windows/fonts//")
- elseif os.type == "macosx" then
- os.setenv("OSFONTDIR","$HOME/Library/Fonts//;/Library/Fonts//;/System/Library/Fonts//")
- end
-end
-
-function resolvers.bare_variable(str) -- assumes str is a string
- return (gsub(str,"\s*([\"\']?)(.+)%1\s*", "%2"))
-end
-
-function resolvers.settrace(n) -- no longer number but: 'locating' or 'detail'
- if n then
- trackers.disable("resolvers.*")
- trackers.enable("resolvers."..n)
- end
-end
-
-resolvers.settrace(os.getenv("MTX_INPUT_TRACE"))
-
-function resolvers.osenv(key)
- local ie = instance.environment
- local value = ie[key]
- if value == nil then
- -- local e = os.getenv(key)
- local e = os.env[key]
- if e == nil then
- -- value = "" -- false
- else
- value = resolvers.bare_variable(e)
- end
- ie[key] = value
- end
- return value or ""
-end
-
-function resolvers.env(key)
- return instance.environment[key] or resolvers.osenv(key)
-end
-
---
-
-local function expand_vars(lst) -- simple vars
- local variables, env = instance.variables, resolvers.env
- local function resolve(a)
- return variables[a] or env(a)
- end
- for k=1,#lst do
- lst[k] = gsub(lst[k],"%$([%a%d%_%-]+)",resolve)
- end
-end
-
-local function expanded_var(var) -- simple vars
- local function resolve(a)
- return instance.variables[a] or resolvers.env(a)
- end
- return (gsub(var,"%$([%a%d%_%-]+)",resolve))
-end
-
-local function entry(entries,name)
- if name and (name ~= "") then
- name = gsub(name,'%$','')
- local result = entries[name..'.'..instance.progname] or entries[name]
- if result then
- return result
- else
- result = resolvers.env(name)
- if result then
- instance.variables[name] = result
- resolvers.expand_variables()
- return instance.expansions[name] or ""
- end
- end
- end
- return ""
-end
-
-local function is_entry(entries,name)
- if name and name ~= "" then
- name = gsub(name,'%$','')
- return (entries[name..'.'..instance.progname] or entries[name]) ~= nil
- else
- return false
- end
-end
-
--- {a,b,c,d}
--- a,b,c/{p,q,r},d
--- a,b,c/{p,q,r}/d/{x,y,z}//
--- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
--- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
--- a{b,c}{d,e}f
--- {a,b,c,d}
--- {a,b,c/{p,q,r},d}
--- {a,b,c/{p,q,r}/d/{x,y,z}//}
--- {a,b,c/{p,q/{x,y,z}},d/{p,q,r}}
--- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}}
--- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}
-
--- this one is better and faster, but it took me a while to realize
--- that this kind of replacement is cleaner than messy parsing and
--- fuzzy concatenating we can probably gain a bit with selectively
--- applying lpeg, but experiments with lpeg parsing this proved not to
--- work that well; the parsing is ok, but dealing with the resulting
--- table is a pain because we need to work inside-out recursively
-
-local function do_first(a,b)
- local t = { }
- for s in gmatch(b,"[^,]+") do t[#t+1] = a .. s end
- return "{" .. concat(t,",") .. "}"
-end
-
-local function do_second(a,b)
- local t = { }
- for s in gmatch(a,"[^,]+") do t[#t+1] = s .. b end
- return "{" .. concat(t,",") .. "}"
-end
-
-local function do_both(a,b)
- local t = { }
- for sa in gmatch(a,"[^,]+") do
- for sb in gmatch(b,"[^,]+") do
- t[#t+1] = sa .. sb
- end
- end
- return "{" .. concat(t,",") .. "}"
-end
-
-local function do_three(a,b,c)
- return a .. b.. c
-end
-
-local function splitpathexpr(str, t, validate)
- -- no need for further optimization as it is only called a
- -- few times, we can use lpeg for the sub
- if trace_expansions then
- logs.report("fileio","expanding variable '%s'",str)
- end
- t = t or { }
- str = gsub(str,",}",",@}")
- str = gsub(str,"{,","{@,")
- -- str = "@" .. str .. "@"
- local ok, done
- while true do
- done = false
- while true do
- str, ok = gsub(str,"([^{},]+){([^{}]+)}",do_first)
- if ok > 0 then done = true else break end
- end
- while true do
- str, ok = gsub(str,"{([^{}]+)}([^{},]+)",do_second)
- if ok > 0 then done = true else break end
- end
- while true do
- str, ok = gsub(str,"{([^{}]+)}{([^{}]+)}",do_both)
- if ok > 0 then done = true else break end
- end
- str, ok = gsub(str,"({[^{}]*){([^{}]+)}([^{}]*})",do_three)
- if ok > 0 then done = true end
- if not done then break end
- end
- str = gsub(str,"[{}]", "")
- str = gsub(str,"@","")
- if validate then
- for s in gmatch(str,"[^,]+") do
- s = validate(s)
- if s then t[#t+1] = s end
- end
- else
- for s in gmatch(str,"[^,]+") do
- t[#t+1] = s
- end
- end
- if trace_expansions then
- for k=1,#t do
- logs.report("fileio","% 4i: %s",k,t[k])
- end
- end
- return t
-end
-
-local function expanded_path_from_list(pathlist) -- maybe not a list, just a path
- -- a previous version fed back into pathlist
- local newlist, ok = { }, false
- for k=1,#pathlist do
- if find(pathlist[k],"[{}]") then
- ok = true
- break
- end
- end
- if ok then
- local function validate(s)
- s = file.collapse_path(s)
- return s ~= "" and not find(s,dummy_path_expr) and s
- end
- for k=1,#pathlist do
- splitpathexpr(pathlist[k],newlist,validate)
- end
- else
- for k=1,#pathlist do
- for p in gmatch(pathlist[k],"([^,]+)") do
- p = file.collapse_path(p)
- if p ~= "" then newlist[#newlist+1] = p end
- end
- end
- end
- return newlist
-end
-
--- we follow a rather traditional approach:
---
--- (1) texmf.cnf given in TEXMFCNF
--- (2) texmf.cnf searched in default variable
---
--- also we now follow the stupid route: if not set then just assume *one*
--- cnf file under texmf (i.e. distribution)
-
-local args = environment and environment.original_arguments or arg -- this needs a cleanup
-
-resolvers.ownbin = resolvers.ownbin or args[-2] or arg[-2] or args[-1] or arg[-1] or arg[0] or "luatex"
-resolvers.ownbin = gsub(resolvers.ownbin,"\\","/")
-
-function resolvers.getownpath()
- local ownpath = resolvers.ownpath or os.selfdir
- if not ownpath or ownpath == "" or ownpath == "unset" then
- ownpath = args[-1] or arg[-1]
- ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
- if not ownpath or ownpath == "" then
- ownpath = args[-0] or arg[-0]
- ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
- end
- local binary = resolvers.ownbin
- if not ownpath or ownpath == "" then
- ownpath = ownpath and file.dirname(binary)
- end
- if not ownpath or ownpath == "" then
- if os.binsuffix ~= "" then
- binary = file.replacesuffix(binary,os.binsuffix)
- end
- for p in gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
- local b = file.join(p,binary)
- if lfs.isfile(b) then
- -- we assume that after changing to the path the currentdir function
- -- resolves to the real location and use this side effect here; this
- -- trick is needed because on the mac installations use symlinks in the
- -- path instead of real locations
- local olddir = lfs.currentdir()
- if lfs.chdir(p) then
- local pp = lfs.currentdir()
- if trace_locating and p ~= pp then
- logs.report("fileio","following symlink '%s' to '%s'",p,pp)
- end
- ownpath = pp
- lfs.chdir(olddir)
- else
- if trace_locating then
- logs.report("fileio","unable to check path '%s'",p)
- end
- ownpath = p
- end
- break
- end
- end
- end
- if not ownpath or ownpath == "" then
- ownpath = "."
- logs.report("fileio","forcing fallback ownpath .")
- elseif trace_locating then
- logs.report("fileio","using ownpath '%s'",ownpath)
- end
- end
- resolvers.ownpath = ownpath
- function resolvers.getownpath()
- return resolvers.ownpath
- end
- return ownpath
-end
-
-local own_places = { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF" }
-
-local function identify_own()
- local ownpath = resolvers.getownpath() or dir.current()
- local ie = instance.environment
- if ownpath then
- if resolvers.env('SELFAUTOLOC') == "" then os.env['SELFAUTOLOC'] = file.collapse_path(ownpath) end
- if resolvers.env('SELFAUTODIR') == "" then os.env['SELFAUTODIR'] = file.collapse_path(ownpath .. "/..") end
- if resolvers.env('SELFAUTOPARENT') == "" then os.env['SELFAUTOPARENT'] = file.collapse_path(ownpath .. "/../..") end
- else
- logs.report("fileio","error: unable to locate ownpath")
- os.exit()
- end
- if resolvers.env('TEXMFCNF') == "" then os.env['TEXMFCNF'] = resolvers.cnfdefault end
- if resolvers.env('TEXOS') == "" then os.env['TEXOS'] = resolvers.env('SELFAUTODIR') end
- if resolvers.env('TEXROOT') == "" then os.env['TEXROOT'] = resolvers.env('SELFAUTOPARENT') end
- if trace_locating then
- for i=1,#own_places do
- local v = own_places[i]
- logs.report("fileio","variable '%s' set to '%s'",v,resolvers.env(v) or "unknown")
- end
- end
- identify_own = function() end
-end
-
-function resolvers.identify_cnf()
- if #instance.cnffiles == 0 then
- -- fallback
- identify_own()
- -- the real search
- resolvers.expand_variables()
- local t = resolvers.split_path(resolvers.env('TEXMFCNF'))
- t = expanded_path_from_list(t)
- expand_vars(t) -- redundant
- local function locate(filename,list)
- for i=1,#t do
- local ti = t[i]
- local texmfcnf = file.collapse_path(file.join(ti,filename))
- if lfs.isfile(texmfcnf) then
- list[#list+1] = texmfcnf
- end
- end
- end
- locate(resolvers.luaname,instance.luafiles)
- locate(resolvers.cnfname,instance.cnffiles)
- end
-end
-
-local function load_cnf_file(fname)
- fname = resolvers.clean_path(fname)
- local lname = file.replacesuffix(fname,'lua')
- if lfs.isfile(lname) then
- local dname = file.dirname(fname) -- fname ?
- if not instance.configuration[dname] then
- resolvers.load_data(dname,'configuration',lname and file.basename(lname))
- instance.order[#instance.order+1] = instance.configuration[dname]
- end
- else
- f = io.open(fname)
- if f then
- if trace_locating then
- logs.report("fileio","loading configuration file %s", fname)
- end
- local line, data, n, k, v
- local dname = file.dirname(fname)
- if not instance.configuration[dname] then
- instance.configuration[dname] = { }
- instance.order[#instance.order+1] = instance.configuration[dname]
- end
- local data = instance.configuration[dname]
- while true do
- local line, n = f:read(), 0
- if line then
- while true do -- join lines
- line, n = gsub(line,"\\%s*$", "")
- if n > 0 then
- line = line .. f:read()
- else
- break
- end
- end
- if not find(line,"^[%%#]") then
- local l = gsub(line,"%s*%%.*$","")
- local k, v = match(l,"%s*(.-)%s*=%s*(.-)%s*$")
- if k and v and not data[k] then
- v = gsub(v,"[%%#].*",'')
- data[k] = gsub(v,"~","$HOME")
- instance.kpsevars[k] = true
- end
- end
- else
- break
- end
- end
- f:close()
- elseif trace_locating then
- logs.report("fileio","skipping configuration file '%s'", fname)
- end
- end
-end
-
-local function collapse_cnf_data() -- potential optimization: pass start index (setup and configuration are shared)
- local order = instance.order
- for i=1,#order do
- local c = order[i]
- for k,v in next, c do
- if not instance.variables[k] then
- if instance.environment[k] then
- instance.variables[k] = instance.environment[k]
- else
- instance.kpsevars[k] = true
- instance.variables[k] = resolvers.bare_variable(v)
- end
- end
- end
- end
-end
-
-function resolvers.load_cnf()
- local function loadoldconfigdata()
- local cnffiles = instance.cnffiles
- for i=1,#cnffiles do
- load_cnf_file(cnffiles[i])
- end
- end
- -- instance.cnffiles contain complete names now !
- -- we still use a funny mix of cnf and new but soon
- -- we will switch to lua exclusively as we only use
- -- the file to collect the tree roots
- if #instance.cnffiles == 0 then
- if trace_locating then
- logs.report("fileio","no cnf files found (TEXMFCNF may not be set/known)")
- end
- else
- local cnffiles = instance.cnffiles
- instance.rootpath = cnffiles[1]
- for k=1,#cnffiles do
- instance.cnffiles[k] = file.collapse_path(cnffiles[k])
- end
- for i=1,3 do
- instance.rootpath = file.dirname(instance.rootpath)
- end
- instance.rootpath = file.collapse_path(instance.rootpath)
- if instance.diskcache and not instance.renewcache then
- resolvers.loadoldconfig(instance.cnffiles)
- if instance.loaderror then
- loadoldconfigdata()
- resolvers.saveoldconfig()
- end
- else
- loadoldconfigdata()
- if instance.renewcache then
- resolvers.saveoldconfig()
- end
- end
- collapse_cnf_data()
- end
- check_configuration()
-end
-
-function resolvers.load_lua()
- if #instance.luafiles == 0 then
- -- yet harmless
- else
- instance.rootpath = instance.luafiles[1]
- local luafiles = instance.luafiles
- for k=1,#luafiles do
- instance.luafiles[k] = file.collapse_path(luafiles[k])
- end
- for i=1,3 do
- instance.rootpath = file.dirname(instance.rootpath)
- end
- instance.rootpath = file.collapse_path(instance.rootpath)
- resolvers.loadnewconfig()
- collapse_cnf_data()
- end
- check_configuration()
-end
-
--- database loading
-
-function resolvers.load_hash()
- resolvers.locatelists()
- if instance.diskcache and not instance.renewcache then
- resolvers.loadfiles()
- if instance.loaderror then
- resolvers.loadlists()
- resolvers.savefiles()
- end
- else
- resolvers.loadlists()
- if instance.renewcache then
- resolvers.savefiles()
- end
- end
-end
-
-function resolvers.append_hash(type,tag,name)
- if trace_locating then
- logs.report("fileio","hash '%s' appended",tag)
- end
- insert(instance.hashes, { ['type']=type, ['tag']=tag, ['name']=name } )
-end
-
-function resolvers.prepend_hash(type,tag,name)
- if trace_locating then
- logs.report("fileio","hash '%s' prepended",tag)
- end
- insert(instance.hashes, 1, { ['type']=type, ['tag']=tag, ['name']=name } )
-end
-
-function resolvers.extend_texmf_var(specification) -- crap, we could better prepend the hash
--- local t = resolvers.expanded_path_list('TEXMF') -- full expansion
- local t = resolvers.split_path(resolvers.env('TEXMF'))
- insert(t,1,specification)
- local newspec = concat(t,";")
- if instance.environment["TEXMF"] then
- instance.environment["TEXMF"] = newspec
- elseif instance.variables["TEXMF"] then
- instance.variables["TEXMF"] = newspec
- else
- -- weird
- end
- resolvers.expand_variables()
- reset_hashes()
-end
-
--- locators
-
-function resolvers.locatelists()
- local texmfpaths = resolvers.clean_path_list('TEXMF')
- for i=1,#texmfpaths do
- local path = texmfpaths[i]
- if trace_locating then
- logs.report("fileio","locating list of '%s'",path)
- end
- resolvers.locatedatabase(file.collapse_path(path))
- end
-end
-
-function resolvers.locatedatabase(specification)
- return resolvers.methodhandler('locators', specification)
-end
-
-function resolvers.locators.tex(specification)
- if specification and specification ~= '' and lfs.isdir(specification) then
- if trace_locating then
- logs.report("fileio","tex locator '%s' found",specification)
- end
- resolvers.append_hash('file',specification,filename)
- elseif trace_locating then
- logs.report("fileio","tex locator '%s' not found",specification)
- end
-end
-
--- hashers
-
-function resolvers.hashdatabase(tag,name)
- return resolvers.methodhandler('hashers',tag,name)
-end
-
-function resolvers.loadfiles()
- instance.loaderror = false
- instance.files = { }
- if not instance.renewcache then
- local hashes = instance.hashes
- for k=1,#hashes do
- local hash = hashes[k]
- resolvers.hashdatabase(hash.tag,hash.name)
- if instance.loaderror then break end
- end
- end
-end
-
-function resolvers.hashers.tex(tag,name)
- resolvers.load_data(tag,'files')
-end
-
--- generators:
-
-function resolvers.loadlists()
- local hashes = instance.hashes
- for i=1,#hashes do
- resolvers.generatedatabase(hashes[i].tag)
- end
-end
-
-function resolvers.generatedatabase(specification)
- return resolvers.methodhandler('generators', specification)
-end
-
--- starting with . or .. etc or funny char
-
-local weird = lpeg.P(".")^1 + lpeg.anywhere(lpeg.S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
-
---~ local l_forbidden = lpeg.S("~`!#$%^&*()={}[]:;\"\'||\\/<>,?\n\r\t")
---~ local l_confusing = lpeg.P(" ")
---~ local l_character = lpeg.patterns.utf8
---~ local l_dangerous = lpeg.P(".")
-
---~ local l_normal = (l_character - l_forbidden - l_confusing - l_dangerous) * (l_character - l_forbidden - l_confusing^2)^0 * lpeg.P(-1)
---~ ----- l_normal = l_normal * lpeg.Cc(true) + lpeg.Cc(false)
-
---~ local function test(str)
---~ print(str,lpeg.match(l_normal,str))
---~ end
---~ test("ヒラギノ明朝 Pro W3")
---~ test("..ヒラギノ明朝 Pro W3")
---~ test(":ヒラギノ明朝 Pro W3;")
---~ test("ヒラギノ明朝 /Pro W3;")
---~ test("ヒラギノ明朝 Pro W3")
-
-function resolvers.generators.tex(specification)
- local tag = specification
- if trace_locating then
- logs.report("fileio","scanning path '%s'",specification)
- end
- instance.files[tag] = { }
- local files = instance.files[tag]
- local n, m, r = 0, 0, 0
- local spec = specification .. '/'
- local attributes = lfs.attributes
- local directory = lfs.dir
- local function action(path)
- local full
- if path then
- full = spec .. path .. '/'
- else
- full = spec
- end
- for name in directory(full) do
- if not lpegmatch(weird,name) then
- -- if lpegmatch(l_normal,name) then
- local mode = attributes(full..name,'mode')
- if mode == 'file' then
- if path then
- n = n + 1
- local f = files[name]
- if f then
- if type(f) == 'string' then
- files[name] = { f, path }
- else
- f[#f+1] = path
- end
- else -- probably unique anyway
- files[name] = path
- local lower = lower(name)
- if name ~= lower then
- files["remap:"..lower] = name
- r = r + 1
- end
- end
- end
- elseif mode == 'directory' then
- m = m + 1
- if path then
- action(path..'/'..name)
- else
- action(name)
- end
- end
- end
- end
- end
- action()
- if trace_locating then
- logs.report("fileio","%s files found on %s directories with %s uppercase remappings",n,m,r)
- end
-end
-
--- savers, todo
-
-function resolvers.savefiles()
- resolvers.save_data('files')
-end
-
--- A config (optionally) has the paths split in tables. Internally
--- we join them and split them after the expansion has taken place. This
--- is more convenient.
-
---~ local checkedsplit = string.checkedsplit
-
-local cache = { }
-
-local splitter = lpeg.Ct(lpeg.splitat(lpeg.S(os.type == "windows" and ";" or ":;")))
-
-local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
- local found = cache[str]
- if not found then
- if str == "" then
- found = { }
- else
- str = gsub(str,"\\","/")
---~ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
-local split = lpegmatch(splitter,str)
- found = { }
- for i=1,#split do
- local s = split[i]
- if not find(s,"^{*unset}*") then
- found[#found+1] = s
- end
- end
- if trace_expansions then
- logs.report("fileio","splitting path specification '%s'",str)
- for k=1,#found do
- logs.report("fileio","% 4i: %s",k,found[k])
- end
- end
- cache[str] = found
- end
- end
- return found
-end
-
-resolvers.split_kpse_path = split_kpse_path
-
-function resolvers.splitconfig()
- for i=1,#instance do
- local c = instance[i]
- for k,v in next, c do
- if type(v) == 'string' then
- local t = split_kpse_path(v)
- if #t > 1 then
- c[k] = t
- end
- end
- end
- end
-end
-
-function resolvers.joinconfig()
- local order = instance.order
- for i=1,#order do
- local c = order[i]
- for k,v in next, c do -- indexed?
- if type(v) == 'table' then
- c[k] = file.join_path(v)
- end
- end
- end
-end
-
-function resolvers.split_path(str)
- if type(str) == 'table' then
- return str
- else
- return split_kpse_path(str)
- end
-end
-
-function resolvers.join_path(str)
- if type(str) == 'table' then
- return file.join_path(str)
- else
- return str
- end
-end
-
-function resolvers.splitexpansions()
- local ie = instance.expansions
- for k,v in next, ie do
- local t, h, p = { }, { }, split_kpse_path(v)
- for kk=1,#p do
- local vv = p[kk]
- if vv ~= "" and not h[vv] then
- t[#t+1] = vv
- h[vv] = true
- end
- end
- if #t > 1 then
- ie[k] = t
- else
- ie[k] = t[1]
- end
- end
-end
-
--- end of split/join code
-
-function resolvers.saveoldconfig()
- resolvers.splitconfig()
- resolvers.save_data('configuration')
- resolvers.joinconfig()
-end
-
-resolvers.configbanner = [[
--- This is a Luatex configuration file created by 'luatools.lua' or
--- 'luatex.exe' directly. For comment, suggestions and questions you can
--- contact the ConTeXt Development Team. This configuration file is
--- not copyrighted. [HH & TH]
-]]
-
-function resolvers.serialize(files)
- -- This version is somewhat optimized for the kind of
- -- tables that we deal with, so it's much faster than
- -- the generic serializer. This makes sense because
- -- luatools and mtxtools are called frequently. Okay,
- -- we pay a small price for properly tabbed tables.
- local t = { }
- local function dump(k,v,m) -- could be moved inline
- if type(v) == 'string' then
- return m .. "['" .. k .. "']='" .. v .. "',"
- elseif #v == 1 then
- return m .. "['" .. k .. "']='" .. v[1] .. "',"
- else
- return m .. "['" .. k .. "']={'" .. concat(v,"','").. "'},"
- end
- end
- t[#t+1] = "return {"
- if instance.sortdata then
- local sortedfiles = sortedkeys(files)
- for i=1,#sortedfiles do
- local k = sortedfiles[i]
- local fk = files[k]
- if type(fk) == 'table' then
- t[#t+1] = "\t['" .. k .. "']={"
- local sortedfk = sortedkeys(fk)
- for j=1,#sortedfk do
- local kk = sortedfk[j]
- t[#t+1] = dump(kk,fk[kk],"\t\t")
- end
- t[#t+1] = "\t},"
- else
- t[#t+1] = dump(k,fk,"\t")
- end
- end
- else
- for k, v in next, files do
- if type(v) == 'table' then
- t[#t+1] = "\t['" .. k .. "']={"
- for kk,vv in next, v do
- t[#t+1] = dump(kk,vv,"\t\t")
- end
- t[#t+1] = "\t},"
- else
- t[#t+1] = dump(k,v,"\t")
- end
- end
- end
- t[#t+1] = "}"
- return concat(t,"\n")
-end
-
-local data_state = { }
-
-function resolvers.data_state()
- return data_state or { }
-end
-
-function resolvers.save_data(dataname, makename) -- untested without cache overload
- for cachename, files in next, instance[dataname] do
- local name = (makename or file.join)(cachename,dataname)
- local luaname, lucname = name .. ".lua", name .. ".luc"
- if trace_locating then
- logs.report("fileio","preparing '%s' for '%s'",dataname,cachename)
- end
- for k, v in next, files do
- if type(v) == "table" and #v == 1 then
- files[k] = v[1]
- end
- end
- local data = {
- type = dataname,
- root = cachename,
- version = resolvers.cacheversion,
- date = os.date("%Y-%m-%d"),
- time = os.date("%H:%M:%S"),
- content = files,
- uuid = os.uuid(),
- }
- local ok = io.savedata(luaname,resolvers.serialize(data))
- if ok then
- if trace_locating then
- logs.report("fileio","'%s' saved in '%s'",dataname,luaname)
- end
- if utils.lua.compile(luaname,lucname,false,true) then -- no cleanup but strip
- if trace_locating then
- logs.report("fileio","'%s' compiled to '%s'",dataname,lucname)
- end
- else
- if trace_locating then
- logs.report("fileio","compiling failed for '%s', deleting file '%s'",dataname,lucname)
- end
- os.remove(lucname)
- end
- elseif trace_locating then
- logs.report("fileio","unable to save '%s' in '%s' (access error)",dataname,luaname)
- end
- end
-end
-
-function resolvers.load_data(pathname,dataname,filename,makename) -- untested without cache overload
- filename = ((not filename or (filename == "")) and dataname) or filename
- filename = (makename and makename(dataname,filename)) or file.join(pathname,filename)
- local blob = loadfile(filename .. ".luc") or loadfile(filename .. ".lua")
- if blob then
- local data = blob()
- if data and data.content and data.type == dataname and data.version == resolvers.cacheversion then
- data_state[#data_state+1] = data.uuid
- if trace_locating then
- logs.report("fileio","loading '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
- instance[dataname][pathname] = data.content
- else
- if trace_locating then
- logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
- instance[dataname][pathname] = { }
- instance.loaderror = true
- end
- elseif trace_locating then
- logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
-end
-
--- some day i'll use the nested approach, but not yet (actually we even drop
--- engine/progname support since we have only luatex now)
---
--- first texmfcnf.lua files are located, next the cached texmf.cnf files
---
--- return {
--- TEXMFBOGUS = 'effe checken of dit werkt',
--- }
-
-function resolvers.resetconfig()
- identify_own()
- instance.configuration, instance.setup, instance.order, instance.loaderror = { }, { }, { }, false
-end
-
-function resolvers.loadnewconfig()
- local luafiles = instance.luafiles
- for i=1,#luafiles do
- local cnf = luafiles[i]
- local pathname = file.dirname(cnf)
- local filename = file.join(pathname,resolvers.luaname)
- local blob = loadfile(filename)
- if blob then
- local data = blob()
- if data then
- if trace_locating then
- logs.report("fileio","loading configuration file '%s'",filename)
- end
- if true then
- -- flatten to variable.progname
- local t = { }
- for k, v in next, data do -- v = progname
- if type(v) == "string" then
- t[k] = v
- else
- for kk, vv in next, v do -- vv = variable
- if type(vv) == "string" then
- t[vv.."."..v] = kk
- end
- end
- end
- end
- instance['setup'][pathname] = t
- else
- instance['setup'][pathname] = data
- end
- else
- if trace_locating then
- logs.report("fileio","skipping configuration file '%s'",filename)
- end
- instance['setup'][pathname] = { }
- instance.loaderror = true
- end
- elseif trace_locating then
- logs.report("fileio","skipping configuration file '%s'",filename)
- end
- instance.order[#instance.order+1] = instance.setup[pathname]
- if instance.loaderror then break end
- end
-end
-
-function resolvers.loadoldconfig()
- if not instance.renewcache then
- local cnffiles = instance.cnffiles
- for i=1,#cnffiles do
- local cnf = cnffiles[i]
- local dname = file.dirname(cnf)
- resolvers.load_data(dname,'configuration')
- instance.order[#instance.order+1] = instance.configuration[dname]
- if instance.loaderror then break end
- end
- end
- resolvers.joinconfig()
-end
-
-function resolvers.expand_variables()
- local expansions, environment, variables = { }, instance.environment, instance.variables
- local env = resolvers.env
- instance.expansions = expansions
- local engine, progname = instance.engine, instance.progname
- if type(engine) ~= "string" then instance.engine, engine = "", "" end
- if type(progname) ~= "string" then instance.progname, progname = "", "" end
- if engine ~= "" then environment['engine'] = engine end
- if progname ~= "" then environment['progname'] = progname end
- for k,v in next, environment do
- local a, b = match(k,"^(%a+)%_(.*)%s*$")
- if a and b then
- expansions[a..'.'..b] = v
- else
- expansions[k] = v
- end
- end
- for k,v in next, environment do -- move environment to expansions
- if not expansions[k] then expansions[k] = v end
- end
- for k,v in next, variables do -- move variables to expansions
- if not expansions[k] then expansions[k] = v end
- end
- local busy = false
- local function resolve(a)
- busy = true
- return expansions[a] or env(a)
- end
- while true do
- busy = false
- for k,v in next, expansions do
- local s, n = gsub(v,"%$([%a%d%_%-]+)",resolve)
- local s, m = gsub(s,"%$%{([%a%d%_%-]+)%}",resolve)
- if n > 0 or m > 0 then
- expansions[k]= s
- end
- end
- if not busy then break end
- end
- for k,v in next, expansions do
- expansions[k] = gsub(v,"\\", '/')
- end
-end
-
-function resolvers.variable(name)
- return entry(instance.variables,name)
-end
-
-function resolvers.expansion(name)
- return entry(instance.expansions,name)
-end
-
-function resolvers.is_variable(name)
- return is_entry(instance.variables,name)
-end
-
-function resolvers.is_expansion(name)
- return is_entry(instance.expansions,name)
-end
-
-function resolvers.unexpanded_path_list(str)
- local pth = resolvers.variable(str)
- local lst = resolvers.split_path(pth)
- return expanded_path_from_list(lst)
-end
-
-function resolvers.unexpanded_path(str)
- return file.join_path(resolvers.unexpanded_path_list(str))
-end
-
-do -- no longer needed
-
- local done = { }
-
- function resolvers.reset_extra_path()
- local ep = instance.extra_paths
- if not ep then
- ep, done = { }, { }
- instance.extra_paths = ep
- elseif #ep > 0 then
- instance.lists, done = { }, { }
- end
- end
-
- function resolvers.register_extra_path(paths,subpaths)
- local ep = instance.extra_paths or { }
- local n = #ep
- if paths and paths ~= "" then
- if subpaths and subpaths ~= "" then
- for p in gmatch(paths,"[^,]+") do
- -- we gmatch each step again, not that fast, but used seldom
- for s in gmatch(subpaths,"[^,]+") do
- local ps = p .. "/" .. s
- if not done[ps] then
- ep[#ep+1] = resolvers.clean_path(ps)
- done[ps] = true
- end
- end
- end
- else
- for p in gmatch(paths,"[^,]+") do
- if not done[p] then
- ep[#ep+1] = resolvers.clean_path(p)
- done[p] = true
- end
- end
- end
- elseif subpaths and subpaths ~= "" then
- for i=1,n do
- -- we gmatch each step again, not that fast, but used seldom
- for s in gmatch(subpaths,"[^,]+") do
- local ps = ep[i] .. "/" .. s
- if not done[ps] then
- ep[#ep+1] = resolvers.clean_path(ps)
- done[ps] = true
- end
- end
- end
- end
- if #ep > 0 then
- instance.extra_paths = ep -- register paths
- end
- if #ep > n then
- instance.lists = { } -- erase the cache
- end
- end
-
-end
-
-local function made_list(instance,list)
- local ep = instance.extra_paths
- if not ep or #ep == 0 then
- return list
- else
- local done, new = { }, { }
- -- 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
- new[#new+1] = v
- else
- break
- end
- end
- end
- -- first the extra paths
- for k=1,#ep do
- local v = ep[k]
- if not done[v] then
- done[v] = true
- new[#new+1] = v
- end
- end
- -- next the formal paths
- for k=1,#list do
- local v = list[k]
- if not done[v] then
- done[v] = true
- new[#new+1] = v
- end
- end
- return new
- end
-end
-
-function resolvers.clean_path_list(str)
- local t = resolvers.expanded_path_list(str)
- if t then
- for i=1,#t do
- t[i] = file.collapse_path(resolvers.clean_path(t[i]))
- end
- end
- return t
-end
-
-function resolvers.expand_path(str)
- return file.join_path(resolvers.expanded_path_list(str))
-end
-
-function resolvers.expanded_path_list(str)
- if not str then
- return ep or { } -- ep ?
- elseif instance.savelists then
- -- engine+progname hash
- str = gsub(str,"%$","")
- if not instance.lists[str] then -- cached
- local lst = made_list(instance,resolvers.split_path(resolvers.expansion(str)))
- instance.lists[str] = expanded_path_from_list(lst)
- end
- return instance.lists[str]
- else
- local lst = resolvers.split_path(resolvers.expansion(str))
- return made_list(instance,expanded_path_from_list(lst))
- end
-end
-
-function resolvers.expanded_path_list_from_var(str) -- brrr
- local tmp = resolvers.var_of_format_or_suffix(gsub(str,"%$",""))
- if tmp ~= "" then
- return resolvers.expanded_path_list(tmp)
- else
- return resolvers.expanded_path_list(str)
- end
-end
-
-function resolvers.expand_path_from_var(str)
- return file.join_path(resolvers.expanded_path_list_from_var(str))
-end
-
-function resolvers.format_of_var(str)
- return formats[str] or formats[alternatives[str]] or ''
-end
-function resolvers.format_of_suffix(str)
- return suffixmap[file.extname(str)] or 'tex'
-end
-
-function resolvers.variable_of_format(str)
- return formats[str] or formats[alternatives[str]] or ''
-end
-
-function resolvers.var_of_format_or_suffix(str)
- local v = formats[str]
- if v then
- return v
- end
- v = formats[alternatives[str]]
- if v then
- return v
- end
- v = suffixmap[file.extname(str)]
- if v then
- return formats[isf]
- end
- return ''
-end
-
-function resolvers.expand_braces(str) -- output variable and brace expansion of STRING
- local ori = resolvers.variable(str)
- local pth = expanded_path_from_list(resolvers.split_path(ori))
- return file.join_path(pth)
-end
-
-resolvers.isreadable = { }
-
-function resolvers.isreadable.file(name)
- local readable = lfs.isfile(name) -- brrr
- if trace_detail then
- if readable then
- logs.report("fileio","file '%s' is readable",name)
- else
- logs.report("fileio","file '%s' is not readable", name)
- end
- end
- return readable
-end
-
-resolvers.isreadable.tex = resolvers.isreadable.file
-
--- name
--- name/name
-
-local function collect_files(names)
- local filelist = { }
- for k=1,#names do
- local fname = names[k]
- if trace_detail then
- logs.report("fileio","checking name '%s'",fname)
- end
- local bname = file.basename(fname)
- local dname = file.dirname(fname)
- if dname == "" or find(dname,"^%.") then
- dname = false
- else
- dname = "/" .. dname .. "$"
- end
- local hashes = instance.hashes
- for h=1,#hashes do
- local hash = hashes[h]
- local blobpath = hash.tag
- local files = blobpath and instance.files[blobpath]
- if files then
- if trace_detail then
- logs.report("fileio","deep checking '%s' (%s)",blobpath,bname)
- 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
- if type(blobfile) == 'string' then
- if not dname or find(blobfile,dname) then
- filelist[#filelist+1] = {
- hash.type,
- file.join(blobpath,blobfile,bname), -- search
- resolvers.concatinators[hash.type](blobpath,blobfile,bname) -- result
- }
- end
- else
- for kk=1,#blobfile do
- local vv = blobfile[kk]
- if not dname or find(vv,dname) then
- filelist[#filelist+1] = {
- hash.type,
- file.join(blobpath,vv,bname), -- search
- resolvers.concatinators[hash.type](blobpath,vv,bname) -- result
- }
- end
- end
- end
- end
- elseif trace_locating then
- logs.report("fileio","no match in '%s' (%s)",blobpath,bname)
- end
- end
- end
- if #filelist > 0 then
- return filelist
- else
- return nil
- end
-end
-
-function resolvers.suffix_of_format(str)
- if suffixes[str] then
- return suffixes[str][1]
- else
- return ""
- end
-end
-
-function resolvers.suffixes_of_format(str)
- if suffixes[str] then
- return suffixes[str]
- else
- return {}
- end
-end
-
-function resolvers.register_in_trees(name)
- if not find(name,"^%.") then
- instance.foundintrees[name] = (instance.foundintrees[name] or 0) + 1 -- maybe only one
- end
-end
-
--- split the next one up for readability (bu this module needs a cleanup anyway)
-
-local function can_be_dir(name) -- can become local
- local fakepaths = instance.fakepaths
- if not fakepaths[name] then
- if lfs.isdir(name) then
- fakepaths[name] = 1 -- directory
- else
- fakepaths[name] = 2 -- no directory
- end
- end
- return (fakepaths[name] == 1)
-end
-
-local function collect_instance_files(filename,collected) -- todo : plugin (scanners, checkers etc)
- local result = collected or { }
- local stamp = nil
- filename = file.collapse_path(filename)
- -- speed up / beware: format problem
- if instance.remember then
- stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format
- if instance.found[stamp] then
- if trace_locating then
- logs.report("fileio","remembering file '%s'",filename)
- end
- return instance.found[stamp]
- end
- end
- if not dangerous[instance.format or "?"] then
- if resolvers.isreadable.file(filename) then
- if trace_detail then
- logs.report("fileio","file '%s' found directly",filename)
- end
- instance.found[stamp] = { filename }
- return { filename }
- end
- end
- if find(filename,'%*') then
- if trace_locating then
- logs.report("fileio","checking wildcard '%s'", filename)
- end
- result = resolvers.find_wildcard_files(filename)
- elseif file.is_qualified_path(filename) then
- if resolvers.isreadable.file(filename) then
- if trace_locating then
- logs.report("fileio","qualified name '%s'", filename)
- end
- result = { filename }
- else
- local forcedname, ok, suffix = "", false, file.extname(filename)
- if suffix == "" then -- why
- if instance.format == "" then
- forcedname = filename .. ".tex"
- if resolvers.isreadable.file(forcedname) then
- if trace_locating then
- logs.report("fileio","no suffix, forcing standard filetype 'tex'")
- end
- result, ok = { forcedname }, true
- end
- else
- local suffixes = resolvers.suffixes_of_format(instance.format)
- for _, s in next, suffixes do
- forcedname = filename .. "." .. s
- if resolvers.isreadable.file(forcedname) then
- if trace_locating then
- logs.report("fileio","no suffix, forcing format filetype '%s'", s)
- end
- result, ok = { forcedname }, true
- break
- end
- end
- end
- end
- if not ok and suffix ~= "" then
- -- try to find in tree (no suffix manipulation), here we search for the
- -- matching last part of the name
- local basename = file.basename(filename)
- local pattern = gsub(filename .. "$","([%.%-])","%%%1")
- local savedformat = instance.format
- local format = savedformat or ""
- if format == "" then
- instance.format = resolvers.format_of_suffix(suffix)
- end
- if not format then
- instance.format = "othertextfiles" -- kind of everything, maybe texinput is better
- end
- --
- if basename ~= filename then
- local resolved = collect_instance_files(basename)
- if #result == 0 then
- local lowered = lower(basename)
- if filename ~= lowered then
- resolved = collect_instance_files(lowered)
- end
- end
- resolvers.format = savedformat
- --
- for r=1,#resolved do
- local rr = resolved[r]
- if find(rr,pattern) then
- result[#result+1], ok = rr, true
- end
- end
- end
- -- a real wildcard:
- --
- -- if not ok then
- -- local filelist = collect_files({basename})
- -- for f=1,#filelist do
- -- local ff = filelist[f][3] or ""
- -- if find(ff,pattern) then
- -- result[#result+1], ok = ff, true
- -- end
- -- end
- -- end
- end
- if not ok and trace_locating then
- logs.report("fileio","qualified name '%s'", filename)
- end
- end
- else
- -- search spec
- local filetype, extra, done, wantedfiles, ext = '', nil, false, { }, file.extname(filename)
- if ext == "" then
- if not instance.force_suffixes then
- wantedfiles[#wantedfiles+1] = filename
- end
- else
- wantedfiles[#wantedfiles+1] = filename
- end
- if instance.format == "" then
- if ext == "" then
- local forcedname = filename .. '.tex'
- wantedfiles[#wantedfiles+1] = forcedname
- filetype = resolvers.format_of_suffix(forcedname)
- if trace_locating then
- logs.report("fileio","forcing filetype '%s'",filetype)
- end
- else
- filetype = resolvers.format_of_suffix(filename)
- if trace_locating then
- logs.report("fileio","using suffix based filetype '%s'",filetype)
- end
- end
- else
- if ext == "" then
- local suffixes = resolvers.suffixes_of_format(instance.format)
- for _, s in next, suffixes do
- wantedfiles[#wantedfiles+1] = filename .. "." .. s
- end
- end
- filetype = instance.format
- if trace_locating then
- logs.report("fileio","using given filetype '%s'",filetype)
- end
- end
- local typespec = resolvers.variable_of_format(filetype)
- local pathlist = resolvers.expanded_path_list(typespec)
- if not pathlist or #pathlist == 0 then
- -- no pathlist, access check only / todo == wildcard
- if trace_detail then
- logs.report("fileio","checking filename '%s', filetype '%s', wanted files '%s'",filename, filetype or '?',concat(wantedfiles," | "))
- end
- for k=1,#wantedfiles do
- local fname = wantedfiles[k]
- if fname and resolvers.isreadable.file(fname) then
- filename, done = fname, true
- result[#result+1] = file.join('.',fname)
- break
- end
- end
- -- this is actually 'other text files' or 'any' or 'whatever'
- local filelist = collect_files(wantedfiles)
- local fl = filelist and filelist[1]
- if fl then
- filename = fl[3]
- result[#result+1] = filename
- done = true
- end
- else
- -- list search
- local filelist = collect_files(wantedfiles)
- local dirlist = { }
- if filelist then
- for i=1,#filelist do
- dirlist[i] = file.dirname(filelist[i][2]) .. "/"
- end
- end
- if trace_detail then
- logs.report("fileio","checking filename '%s'",filename)
- end
- -- a bit messy ... esp the doscan setting here
- local doscan
- for k=1,#pathlist do
- local path = pathlist[k]
- if find(path,"^!!") then doscan = false else doscan = true end
- local pathname = gsub(path,"^!+", '')
- done = false
- -- using file list
- if filelist then
- local expression
- -- compare list entries with permitted pattern -- /xx /xx//
- if not find(pathname,"/$") then
- expression = pathname .. "/"
- else
- expression = pathname
- end
- expression = gsub(expression,"([%-%.])","%%%1") -- this also influences
- expression = gsub(expression,"//+$", '/.*') -- later usage of pathname
- expression = gsub(expression,"//", '/.-/') -- not ok for /// but harmless
- expression = "^" .. expression .. "$"
- if trace_detail then
- logs.report("fileio","using pattern '%s' for path '%s'",expression,pathname)
- end
- for k=1,#filelist do
- local fl = filelist[k]
- local f = fl[2]
- local d = dirlist[k]
- if find(d,expression) then
- --- todo, test for readable
- result[#result+1] = fl[3]
- resolvers.register_in_trees(f) -- for tracing used files
- done = true
- if instance.allresults then
- if trace_detail then
- logs.report("fileio","match in hash for file '%s' on path '%s', continue scanning",f,d)
- end
- else
- if trace_detail then
- logs.report("fileio","match in hash for file '%s' on path '%s', quit scanning",f,d)
- end
- break
- end
- elseif trace_detail then
- logs.report("fileio","no match in hash for file '%s' on path '%s'",f,d)
- end
- end
- end
- if not done and doscan then
- -- check if on disk / unchecked / does not work at all / also zips
- if resolvers.splitmethod(pathname).scheme == 'file' then -- ?
- local pname = gsub(pathname,"%.%*$",'')
- if not find(pname,"%*") then
- local ppname = gsub(pname,"/+$","")
- if can_be_dir(ppname) then
- for k=1,#wantedfiles do
- local w = wantedfiles[k]
- local fname = file.join(ppname,w)
- if resolvers.isreadable.file(fname) then
- if trace_detail then
- logs.report("fileio","found '%s' by scanning",fname)
- end
- result[#result+1] = fname
- done = true
- if not instance.allresults then break end
- end
- end
- else
- -- no access needed for non existing path, speedup (esp in large tree with lots of fake)
- end
- end
- end
- end
- if not done and doscan then
- -- todo: slow path scanning
- end
- if done and not instance.allresults then break end
- end
- end
- end
- for k=1,#result do
- result[k] = file.collapse_path(result[k])
- end
- if instance.remember then
- instance.found[stamp] = result
- end
- return result
-end
-
-if not resolvers.concatinators then resolvers.concatinators = { } end
-
-resolvers.concatinators.tex = file.join
-resolvers.concatinators.file = resolvers.concatinators.tex
-
-function resolvers.find_files(filename,filetype,mustexist)
- if type(mustexist) == boolean then
- -- all set
- elseif type(filetype) == 'boolean' then
- filetype, mustexist = nil, false
- elseif type(filetype) ~= 'string' then
- filetype, mustexist = nil, false
- end
- instance.format = filetype or ''
- local result = collect_instance_files(filename)
- if #result == 0 then
- local lowered = lower(filename)
- if filename ~= lowered then
- return collect_instance_files(lowered)
- end
- end
- instance.format = ''
- return result
-end
-
-function resolvers.find_file(filename,filetype,mustexist)
- return (resolvers.find_files(filename,filetype,mustexist)[1] or "")
-end
-
-function resolvers.find_given_files(filename)
- local bname, result = file.basename(filename), { }
- local hashes = instance.hashes
- for k=1,#hashes do
- local hash = hashes[k]
- local files = instance.files[hash.tag] 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
- end
- if blist then
- if type(blist) == 'string' then
- result[#result+1] = resolvers.concatinators[hash.type](hash.tag,blist,bname) or ""
- if not instance.allresults then break end
- else
- for kk=1,#blist do
- local vv = blist[kk]
- result[#result+1] = resolvers.concatinators[hash.type](hash.tag,vv,bname) or ""
- if not instance.allresults then break end
- end
- end
- end
- end
- return result
-end
-
-function resolvers.find_given_file(filename)
- return (resolvers.find_given_files(filename)[1] or "")
-end
-
-local function doit(path,blist,bname,tag,kind,result,allresults)
- local done = false
- if blist and kind then
- if type(blist) == 'string' then
- -- make function and share code
- if find(lower(blist),path) then
- result[#result+1] = resolvers.concatinators[kind](tag,blist,bname) or ""
- done = true
- end
- else
- for kk=1,#blist do
- local vv = blist[kk]
- if find(lower(vv),path) then
- result[#result+1] = resolvers.concatinators[kind](tag,vv,bname) or ""
- done = true
- if not allresults then break end
- end
- end
- end
- end
- return done
-end
-
-function resolvers.find_wildcard_files(filename) -- todo: remap:
- local result = { }
- local bname, dname = file.basename(filename), file.dirname(filename)
- local path = gsub(dname,"^*/","")
- path = gsub(path,"*",".*")
- path = gsub(path,"-","%%-")
- if dname == "" then
- path = ".*"
- end
- local name = bname
- name = gsub(name,"*",".*")
- name = gsub(name,"-","%%-")
- path = lower(path)
- name = lower(name)
- local files, allresults, done = instance.files, instance.allresults, false
- if find(name,"%*") then
- local hashes = instance.hashes
- for k=1,#hashes do
- local hash = hashes[k]
- local tag, kind = hash.tag, hash.type
- for kk, hh in next, files[hash.tag] do
- if not find(kk,"^remap:") then
- if find(lower(kk),name) then
- if doit(path,hh,kk,tag,kind,result,allresults) then done = true end
- if done and not allresults then break end
- end
- end
- end
- end
- else
- local hashes = instance.hashes
- for k=1,#hashes do
- local hash = hashes[k]
- local tag, kind = hash.tag, hash.type
- if doit(path,files[tag][bname],bname,tag,kind,result,allresults) then done = true end
- if done and not allresults then break end
- end
- end
- -- we can consider also searching the paths not in the database, but then
- -- we end up with a messy search (all // in all path specs)
- return result
-end
-
-function resolvers.find_wildcard_file(filename)
- return (resolvers.find_wildcard_files(filename)[1] or "")
-end
-
--- main user functions
-
-function resolvers.automount()
- -- implemented later
-end
-
-function resolvers.load(option)
- statistics.starttiming(instance)
- resolvers.resetconfig()
- resolvers.identify_cnf()
- resolvers.load_lua() -- will become the new method
- resolvers.expand_variables()
- resolvers.load_cnf() -- will be skipped when we have a lua file
- resolvers.expand_variables()
- if option ~= "nofiles" then
- resolvers.load_hash()
- resolvers.automount()
- end
- statistics.stoptiming(instance)
-end
-
-function resolvers.for_files(command, files, filetype, mustexist)
- if files and #files > 0 then
- local function report(str)
- if trace_locating then
- logs.report("fileio",str) -- has already verbose
- else
- print(str)
- end
- end
- if trace_locating then
- report('') -- ?
- end
- for f=1,#files do
- local file = files[f]
- local result = command(file,filetype,mustexist)
- if type(result) == 'string' then
- report(result)
- else
- for i=1,#result do
- report(result[i]) -- could be unpack
- end
- end
- end
- end
-end
-
--- strtab
-
-resolvers.var_value = resolvers.variable -- output the value of variable $STRING.
-resolvers.expand_var = resolvers.expansion -- output variable expansion of STRING.
-
-function resolvers.show_path(str) -- output search path for file type NAME
- return file.join_path(resolvers.expanded_path_list(resolvers.format_of_var(str)))
-end
-
--- resolvers.find_file(filename)
--- resolvers.find_file(filename, filetype, mustexist)
--- resolvers.find_file(filename, mustexist)
--- resolvers.find_file(filename, filetype)
-
-function resolvers.register_file(files, name, path)
- if files[name] then
- if type(files[name]) == 'string' then
- files[name] = { files[name], path }
- else
- files[name] = path
- end
- else
- files[name] = path
- end
-end
-
-function resolvers.splitmethod(filename)
- if not filename then
- return { } -- safeguard
- elseif type(filename) == "table" then
- return filename -- already split
- elseif not find(filename,"://") then
- return { scheme="file", path = filename, original=filename } -- quick hack
- else
- return url.hashed(filename)
- end
-end
-
-function table.sequenced(t,sep) -- temp here
- local s = { }
- for k, v in next, t do -- indexed?
- s[#s+1] = k .. "=" .. tostring(v)
- end
- return concat(s, sep or " | ")
-end
-
-function resolvers.methodhandler(what, filename, filetype) -- ...
- filename = file.collapse_path(filename)
- local specification = (type(filename) == "string" and resolvers.splitmethod(filename)) or filename -- no or { }, let it bomb
- local scheme = specification.scheme
- if resolvers[what][scheme] then
- if trace_locating then
- logs.report("fileio","handler '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
- end
- return resolvers[what][scheme](filename,filetype) -- todo: specification
- else
- return resolvers[what].tex(filename,filetype) -- todo: specification
- end
-end
-
-function resolvers.clean_path(str)
- if str then
- str = gsub(str,"\\","/")
- str = gsub(str,"^!+","")
- str = gsub(str,"^~",resolvers.homedir)
- return str
- else
- return nil
- end
-end
-
-function resolvers.do_with_path(name,func)
- local pathlist = resolvers.expanded_path_list(name)
- for i=1,#pathlist do
- func("^"..resolvers.clean_path(pathlist[i]))
- end
-end
-
-function resolvers.do_with_var(name,func)
- func(expanded_var(name))
-end
-
-function resolvers.with_files(pattern,handle)
- local hashes = instance.hashes
- for i=1,#hashes do
- local hash = hashes[i]
- local blobpath = hash.tag
- local blobtype = hash.type
- if blobpath then
- local files = instance.files[blobpath]
- if files then
- for k,v in next, files do
- if find(k,"^remap:") then
- k = files[k]
- v = files[k] -- chained
- end
- if find(k,pattern) then
- if type(v) == "string" then
- handle(blobtype,blobpath,v,k)
- else
- for _,vv in next, v do -- indexed
- handle(blobtype,blobpath,vv,k)
- end
- end
- end
- end
- end
- end
- end
-end
-
-function resolvers.locate_format(name)
- local barename, fmtname = gsub(name,"%.%a+$",""), ""
- if resolvers.usecache then
- local path = file.join(caches.setpath("formats")) -- maybe platform
- fmtname = file.join(path,barename..".fmt") or ""
- end
- if fmtname == "" then
- fmtname = resolvers.find_files(barename..".fmt")[1] or ""
- end
- fmtname = resolvers.clean_path(fmtname)
- if fmtname ~= "" then
- local barename = file.removesuffix(fmtname)
- local luaname, lucname, luiname = barename .. ".lua", barename .. ".luc", barename .. ".lui"
- if lfs.isfile(luiname) then
- return barename, luiname
- elseif lfs.isfile(lucname) then
- return barename, lucname
- elseif lfs.isfile(luaname) then
- return barename, luaname
- end
- end
- return nil, nil
-end
-
-function resolvers.boolean_variable(str,default)
- local b = resolvers.expansion(str)
- if b == "" then
- return default
- else
- b = toboolean(b)
- return (b == nil and default) or b
- end
-end
-
-texconfig.kpse_init = false
-
-kpse = { original = kpse } setmetatable(kpse, { __index = function(k,v) return resolvers[v] end } )
-
--- for a while
-
-input = resolvers
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['data-tmp'] = {
- 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"
-}
-
---[[ldx--
-<p>This module deals with caching data. It sets up the paths and
-implements loaders and savers for tables. Best is to set the
-following variable. When not set, the usual paths will be
-checked. Personally I prefer the (users) temporary path.</p>
-
-</code>
-TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
-</code>
-
-<p>Currently we do no locking when we write files. This is no real
-problem because most caching involves fonts and the chance of them
-being written at the same time is small. We also need to extend
-luatools with a recache feature.</p>
---ldx]]--
-
-local format, lower, gsub = string.format, string.lower, string.gsub
-
-local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end) -- not used yet
-
-caches = caches or { }
-
-caches.path = caches.path or nil
-caches.base = caches.base or "luatex-cache"
-caches.more = caches.more or "context"
-caches.direct = false -- true is faster but may need huge amounts of memory
-caches.tree = false
-caches.paths = caches.paths or nil
-caches.force = true -- changed for TEXLIVE by TH
-caches.defaults = { "TEXMFCACHE", "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
-
-function caches.temp()
- local cachepath = nil
- local function check(list,isenv)
- if not cachepath then
- for k=1,#list do
- local v = list[k]
- cachepath = (isenv and (os.env[v] or "")) or v or ""
- if cachepath == "" then
- -- next
- else
- cachepath = resolvers.clean_path(cachepath)
- if lfs.isdir(cachepath) and file.iswritable(cachepath) then -- lfs.attributes(cachepath,"mode") == "directory"
- break
- elseif caches.force or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then
- dir.mkdirs(cachepath)
- if lfs.isdir(cachepath) and file.iswritable(cachepath) then
- break
- end
- end
- end
- cachepath = nil
- end
- end
- end
- check(resolvers.clean_path_list("TEXMFCACHE") or { })
- check(caches.defaults,true)
- if not cachepath then
- print("\nfatal error: there is no valid (writable) cache path defined\n")
- os.exit()
- elseif not lfs.isdir(cachepath) then -- lfs.attributes(cachepath,"mode") ~= "directory"
- print(format("\nfatal error: cache path %s is not a directory\n",cachepath))
- os.exit()
- end
- cachepath = file.collapse_path(cachepath)
- function caches.temp()
- return cachepath
- end
- return cachepath
-end
-
-function caches.configpath()
- return table.concat(resolvers.instance.cnffiles,";")
-end
-
-function caches.hashed(tree)
- return md5.hex(gsub(lower(tree),"[\\\/]+","/"))
-end
-
-function caches.treehash()
- local tree = caches.configpath()
- if not tree or tree == "" then
- return false
- else
- return caches.hashed(tree)
- end
-end
-
-function caches.setpath(...)
- if not caches.path then
- if not caches.path then
- caches.path = caches.temp()
- end
- caches.path = resolvers.clean_path(caches.path) -- to be sure
- caches.tree = caches.tree or caches.treehash()
- if caches.tree then
- caches.path = dir.mkdirs(caches.path,caches.base,caches.more,caches.tree)
- else
- caches.path = dir.mkdirs(caches.path,caches.base,caches.more)
- end
- end
- if not caches.path then
- caches.path = '.'
- end
- caches.path = resolvers.clean_path(caches.path)
- local dirs = { ... }
- if #dirs > 0 then
- local pth = dir.mkdirs(caches.path,...)
- return pth
- end
- caches.path = dir.expand_name(caches.path)
- return caches.path
-end
-
-function caches.definepath(category,subcategory)
- return function()
- return caches.setpath(category,subcategory)
- end
-end
-
-function caches.setluanames(path,name)
- return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
-end
-
-function caches.loaddata(path,name)
- local tmaname, tmcname = caches.setluanames(path,name)
- local loader = loadfile(tmcname) or loadfile(tmaname)
- if loader then
- loader = loader()
- collectgarbage("step")
- return loader
- else
- return false
- end
-end
-
---~ function caches.loaddata(path,name)
---~ local tmaname, tmcname = caches.setluanames(path,name)
---~ return dofile(tmcname) or dofile(tmaname)
---~ end
-
-function caches.iswritable(filepath,filename)
- local tmaname, tmcname = caches.setluanames(filepath,filename)
- return file.iswritable(tmaname)
-end
-
-function caches.savedata(filepath,filename,data,raw)
- local tmaname, tmcname = caches.setluanames(filepath,filename)
- local reduce, simplify = true, true
- if raw then
- reduce, simplify = false, false
- end
- data.cache_uuid = os.uuid()
- if caches.direct then
- file.savedata(tmaname, table.serialize(data,'return',false,true,false)) -- no hex
- else
- table.tofile(tmaname, data,'return',false,true,false) -- maybe not the last true
- end
- local cleanup = resolvers.boolean_variable("PURGECACHE", false)
- local strip = resolvers.boolean_variable("LUACSTRIP", true)
- utils.lua.compile(tmaname, tmcname, cleanup, strip)
-end
-
--- here we use the cache for format loading (texconfig.[formatname|jobname])
-
---~ if tex and texconfig and texconfig.formatname and texconfig.formatname == "" then
-if tex and texconfig and (not texconfig.formatname or texconfig.formatname == "") and input and resolvers.instance then
- if not texconfig.luaname then texconfig.luaname = "cont-en.lua" end -- or luc
- texconfig.formatname = caches.setpath("formats") .. "/" .. gsub(texconfig.luaname,"%.lu.$",".fmt")
-end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['data-inp'] = {
- 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"
-}
-
-resolvers.finders = resolvers.finders or { }
-resolvers.openers = resolvers.openers or { }
-resolvers.loaders = resolvers.loaders or { }
-
-resolvers.finders.notfound = { nil }
-resolvers.openers.notfound = { nil }
-resolvers.loaders.notfound = { false, nil, 0 }
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['data-out'] = {
- 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"
-}
-
-outputs = outputs or { }
-
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['data-con'] = {
- 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 format, lower, gsub = string.format, string.lower, string.gsub
-
-local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
-local trace_containers = false trackers.register("resolvers.containers", function(v) trace_containers = v end)
-local trace_storage = false trackers.register("resolvers.storage", function(v) trace_storage = v end)
-
---[[ldx--
-<p>Once we found ourselves defining similar cache constructs
-several times, containers were introduced. Containers are used
-to collect tables in memory and reuse them when possible based
-on (unique) hashes (to be provided by the calling function).</p>
-
-<p>Caching to disk is disabled by default. Version numbers are
-stored in the saved table which makes it possible to change the
-table structures without bothering about the disk cache.</p>
-
-<p>Examples of usage can be found in the font related code.</p>
---ldx]]--
-
-containers = containers or { }
-
-containers.usecache = true
-
-local function report(container,tag,name)
- if trace_cache or trace_containers then
- logs.report(format("%s cache",container.subcategory),"%s: %s",tag,name or 'invalid')
- end
-end
-
-local allocated = { }
-
--- tracing
-
-function containers.define(category, subcategory, version, enabled)
- return function()
- if category and subcategory then
- local c = allocated[category]
- if not c then
- c = { }
- allocated[category] = c
- end
- local s = c[subcategory]
- if not s then
- s = {
- category = category,
- subcategory = subcategory,
- storage = { },
- enabled = enabled,
- version = version or 1.000,
- trace = false,
- path = caches and caches.setpath and caches.setpath(category,subcategory),
- }
- c[subcategory] = s
- end
- return s
- else
- return nil
- end
- end
-end
-
-function containers.is_usable(container, name)
- return container.enabled and caches and caches.iswritable(container.path, name)
-end
-
-function containers.is_valid(container, name)
- if name and name ~= "" then
- local storage = container.storage[name]
- return storage and storage.cache_version == container.version
- else
- return false
- end
-end
-
-function containers.read(container,name)
- if container.enabled and caches and not container.storage[name] and containers.usecache then
- container.storage[name] = caches.loaddata(container.path,name)
- if containers.is_valid(container,name) then
- report(container,"loaded",name)
- else
- container.storage[name] = nil
- end
- end
- if container.storage[name] then
- report(container,"reusing",name)
- end
- return container.storage[name]
-end
-
-function containers.write(container, name, data)
- if data then
- data.cache_version = container.version
- if container.enabled and caches then
- local unique, shared = data.unique, data.shared
- data.unique, data.shared = nil, nil
- caches.savedata(container.path, name, data)
- report(container,"saved",name)
- data.unique, data.shared = unique, shared
- end
- report(container,"stored",name)
- container.storage[name] = data
- end
- return data
-end
-
-function containers.content(container,name)
- return container.storage[name]
-end
-
-function containers.cleanname(name)
- return (gsub(lower(name),"[^%w%d]+","-"))
-end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['data-use'] = {
- 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 format, lower, gsub, find = string.format, string.lower, string.gsub, string.find
-
-local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
-
--- since we want to use the cache instead of the tree, we will now
--- reimplement the saver.
-
-local save_data = resolvers.save_data
-local load_data = resolvers.load_data
-
-resolvers.cachepath = nil -- public, for tracing
-resolvers.usecache = true -- public, for tracing
-
-function resolvers.save_data(dataname)
- save_data(dataname, function(cachename,dataname)
- resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
- if resolvers.usecache then
- resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
- return file.join(resolvers.cachepath(),caches.hashed(cachename))
- else
- return file.join(cachename,dataname)
- end
- end)
-end
-
-function resolvers.load_data(pathname,dataname,filename)
- load_data(pathname,dataname,filename,function(dataname,filename)
- resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
- if resolvers.usecache then
- resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
- return file.join(resolvers.cachepath(),caches.hashed(pathname))
- else
- if not filename or (filename == "") then
- filename = dataname
- end
- return file.join(pathname,filename)
- end
- end)
-end
-
--- we will make a better format, maybe something xml or just text or lua
-
-resolvers.automounted = resolvers.automounted or { }
-
-function resolvers.automount(usecache)
- local mountpaths = resolvers.clean_path_list(resolvers.expansion('TEXMFMOUNT'))
- if (not mountpaths or #mountpaths == 0) and usecache then
- mountpaths = { caches.setpath("mount") }
- end
- if mountpaths and #mountpaths > 0 then
- statistics.starttiming(resolvers.instance)
- for k=1,#mountpaths do
- local root = mountpaths[k]
- local f = io.open(root.."/url.tmi")
- if f then
- for line in f:lines() do
- if line then
- if find(line,"^[%%#%-]") then -- or %W
- -- skip
- elseif find(line,"^zip://") then
- if trace_locating then
- logs.report("fileio","mounting %s",line)
- end
- table.insert(resolvers.automounted,line)
- resolvers.usezipfile(line)
- end
- end
- end
- f:close()
- end
- end
- statistics.stoptiming(resolvers.instance)
- end
-end
-
--- status info
-
-statistics.register("used config path", function() return caches.configpath() end)
-statistics.register("used cache path", function() return caches.temp() or "?" end)
-
--- experiment (code will move)
-
-function statistics.save_fmt_status(texname,formatbanner,sourcefile) -- texname == formatname
- local enginebanner = status.list().banner
- if formatbanner and enginebanner and sourcefile then
- local luvname = file.replacesuffix(texname,"luv")
- local luvdata = {
- enginebanner = enginebanner,
- formatbanner = formatbanner,
- sourcehash = md5.hex(io.loaddata(resolvers.find_file(sourcefile)) or "unknown"),
- sourcefile = sourcefile,
- }
- io.savedata(luvname,table.serialize(luvdata,true))
- end
-end
-
-function statistics.check_fmt_status(texname)
- local enginebanner = status.list().banner
- if enginebanner and texname then
- local luvname = file.replacesuffix(texname,"luv")
- if lfs.isfile(luvname) then
- local luv = dofile(luvname)
- if luv and luv.sourcefile then
- local sourcehash = md5.hex(io.loaddata(resolvers.find_file(luv.sourcefile)) or "unknown")
- local luvbanner = luv.enginebanner or "?"
- if luvbanner ~= enginebanner then
- return string.format("engine mismatch (luv:%s <> bin:%s)",luvbanner,enginebanner)
- end
- local luvhash = luv.sourcehash or "?"
- if luvhash ~= sourcehash then
- return string.format("source mismatch (luv:%s <> bin:%s)",luvhash,sourcehash)
- end
- else
- return "invalid status file"
- end
- else
- return "missing status file"
- end
- end
- return true
-end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['luat-kps'] = {
- version = 1.001,
- comment = "companion to luatools.lua",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
---[[ldx--
-<p>This file is used when we want the input handlers to behave like
-<type>kpsewhich</type>. What to do with the following:</p>
-
-<typing>
-{$SELFAUTOLOC,$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}
-$SELFAUTOLOC : /usr/tex/bin/platform
-$SELFAUTODIR : /usr/tex/bin
-$SELFAUTOPARENT : /usr/tex
-</typing>
-
-<p>How about just forgetting about them?</p>
---ldx]]--
-
-local suffixes = resolvers.suffixes
-local formats = resolvers.formats
-
-suffixes['gf'] = { '<resolution>gf' }
-suffixes['pk'] = { '<resolution>pk' }
-suffixes['base'] = { 'base' }
-suffixes['bib'] = { 'bib' }
-suffixes['bst'] = { 'bst' }
-suffixes['cnf'] = { 'cnf' }
-suffixes['mem'] = { 'mem' }
-suffixes['mf'] = { 'mf' }
-suffixes['mfpool'] = { 'pool' }
-suffixes['mft'] = { 'mft' }
-suffixes['mppool'] = { 'pool' }
-suffixes['graphic/figure'] = { 'eps', 'epsi' }
-suffixes['texpool'] = { 'pool' }
-suffixes['PostScript header'] = { 'pro' }
-suffixes['ist'] = { 'ist' }
-suffixes['web'] = { 'web', 'ch' }
-suffixes['cweb'] = { 'w', 'web', 'ch' }
-suffixes['cmap files'] = { 'cmap' }
-suffixes['lig files'] = { 'lig' }
-suffixes['bitmap font'] = { }
-suffixes['MetaPost support'] = { }
-suffixes['TeX system documentation'] = { }
-suffixes['TeX system sources'] = { }
-suffixes['dvips config'] = { }
-suffixes['type42 fonts'] = { }
-suffixes['web2c files'] = { }
-suffixes['other text files'] = { }
-suffixes['other binary files'] = { }
-suffixes['opentype fonts'] = { 'otf' }
-
-suffixes['fmt'] = { 'fmt' }
-suffixes['texmfscripts'] = { 'rb','lua','py','pl' }
-
-suffixes['pdftex config'] = { }
-suffixes['Troff fonts'] = { }
-
-suffixes['ls-R'] = { }
-
---[[ldx--
-<p>If you wondered abou tsome of the previous mappings, how about
-the next bunch:</p>
---ldx]]--
-
-formats['bib'] = ''
-formats['bst'] = ''
-formats['mft'] = ''
-formats['ist'] = ''
-formats['web'] = ''
-formats['cweb'] = ''
-formats['MetaPost support'] = ''
-formats['TeX system documentation'] = ''
-formats['TeX system sources'] = ''
-formats['Troff fonts'] = ''
-formats['dvips config'] = ''
-formats['graphic/figure'] = ''
-formats['ls-R'] = ''
-formats['other text files'] = ''
-formats['other binary files'] = ''
-
-formats['gf'] = ''
-formats['pk'] = ''
-formats['base'] = 'MFBASES'
-formats['cnf'] = ''
-formats['mem'] = 'MPMEMS'
-formats['mf'] = 'MFINPUTS'
-formats['mfpool'] = 'MFPOOL'
-formats['mppool'] = 'MPPOOL'
-formats['texpool'] = 'TEXPOOL'
-formats['PostScript header'] = 'TEXPSHEADERS'
-formats['cmap files'] = 'CMAPFONTS'
-formats['type42 fonts'] = 'T42FONTS'
-formats['web2c files'] = 'WEB2C'
-formats['pdftex config'] = 'PDFTEXCONFIG'
-formats['texmfscripts'] = 'TEXMFSCRIPTS'
-formats['bitmap font'] = ''
-formats['lig files'] = 'LIGFONTS'
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['data-aux'] = {
- 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 find = string.find
-
-local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
-
-function resolvers.update_script(oldname,newname) -- oldname -> own.name, not per se a suffix
- local scriptpath = "scripts/context/lua"
- newname = file.addsuffix(newname,"lua")
- local oldscript = resolvers.clean_path(oldname)
- if trace_locating then
- logs.report("fileio","to be replaced old script %s", oldscript)
- end
- local newscripts = resolvers.find_files(newname) or { }
- if #newscripts == 0 then
- if trace_locating then
- logs.report("fileio","unable to locate new script")
- end
- else
- for i=1,#newscripts do
- local newscript = resolvers.clean_path(newscripts[i])
- if trace_locating then
- logs.report("fileio","checking new script %s", newscript)
- end
- if oldscript == newscript then
- if trace_locating then
- logs.report("fileio","old and new script are the same")
- end
- elseif not find(newscript,scriptpath) then
- if trace_locating then
- logs.report("fileio","new script should come from %s",scriptpath)
- end
- elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
- if trace_locating then
- logs.report("fileio","invalid new script name")
- end
- else
- local newdata = io.loaddata(newscript)
- if newdata then
- if trace_locating then
- logs.report("fileio","old script content replaced by new content")
- end
- io.savedata(oldscript,newdata)
- break
- elseif trace_locating then
- logs.report("fileio","unable to load new script")
- end
- end
- end
- end
-end
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['data-lst'] = {
- 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"
-}
-
--- used in mtxrun
-
-local find, concat, upper, format = string.find, table.concat, string.upper, string.format
-
-resolvers.listers = resolvers.listers or { }
-
-local function tabstr(str)
- if type(str) == 'table' then
- return concat(str," | ")
- else
- return str
- end
-end
-
-local function list(list,report)
- local instance = resolvers.instance
- local pat = upper(pattern or "","")
- local report = report or texio.write_nl
- local sorted = table.sortedkeys(list)
- for i=1,#sorted do
- local key = sorted[i]
- if instance.pattern == "" or find(upper(key),pat) then
- if instance.kpseonly then
- if instance.kpsevars[key] then
- report(format("%s=%s",key,tabstr(list[key])))
- end
- else
- report(format('%s %s=%s',(instance.kpsevars[key] and 'K') or 'E',key,tabstr(list[key])))
- end
- end
- end
-end
-
-function resolvers.listers.variables () list(resolvers.instance.variables ) end
-function resolvers.listers.expansions() list(resolvers.instance.expansions) end
-
-function resolvers.listers.configurations(report)
- local report = report or texio.write_nl
- local instance = resolvers.instance
- local sorted = table.sortedkeys(instance.kpsevars)
- for i=1,#sorted do
- local key = sorted[i]
- if not instance.pattern or (instance.pattern=="") or find(key,instance.pattern) then
- report(format("%s\n",key))
- local order = instance.order
- for i=1,#order do
- local str = order[i][key]
- if str then
- report(format("\t%s\t%s",i,str))
- end
- end
- report("")
- end
- end
-end
-
-
-end -- of closure
--- end library merge
-
--- We initialize some characteristics of this program. We need to
--- do this before we load the libraries, else own.name will not be
--- properly set (handy for selfcleaning the file). It's an ugly
--- looking piece of code.
-
-own = { }
-
-own.libs = { -- todo: check which ones are really needed
- 'l-string.lua',
- 'l-lpeg.lua',
- 'l-table.lua',
- 'l-io.lua',
- 'l-number.lua',
- 'l-set.lua',
- 'l-os.lua',
- 'l-file.lua',
- 'l-md5.lua',
- 'l-url.lua',
- 'l-dir.lua',
- 'l-boolean.lua',
- 'l-unicode.lua',
- 'l-math.lua',
- 'l-utils.lua',
- 'l-aux.lua',
- 'trac-tra.lua',
- 'luat-env.lua',
- 'trac-inf.lua',
- 'trac-log.lua',
- 'data-res.lua',
- 'data-tmp.lua',
--- 'data-pre.lua',
- 'data-inp.lua',
- 'data-out.lua',
- 'data-con.lua',
- 'data-use.lua',
--- 'data-tex.lua',
--- 'data-bin.lua',
--- 'data-zip.lua',
--- 'data-crl.lua',
--- 'data-lua.lua',
- 'data-kps.lua', -- so that we can replace kpsewhich
- 'data-aux.lua', -- updater
- 'data-lst.lua', -- lister
-}
-
--- We need this hack till luatex is fixed.
-
-if arg and arg[0] == 'luatex' and arg[1] == "--luaonly" then
- arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil
-end
-
--- End of hack.
-
-own.name = (environment and environment.ownname) or arg[0] or 'luatools.lua'
-own.path = string.match(own.name,"^(.+)[\\/].-$") or "."
-own.list = { '.' }
-
-if own.path ~= '.' then
- table.insert(own.list,own.path)
-end
-
-table.insert(own.list,own.path.."/../../texmf-dist/tex/context/base")
-table.insert(own.list,own.path.."/../../../tex/context/base")
-table.insert(own.list,own.path.."/mtx")
-table.insert(own.list,own.path.."/../sources")
-
-function locate_libs()
- for _, lib in pairs(own.libs) do
- for _, pth in pairs(own.list) do
- local filename = string.gsub(pth .. "/" .. lib,"\\","/")
- local codeblob = loadfile(filename)
- if codeblob then
- codeblob()
- own.list = { pth } -- speed up te search
- break
- end
- end
- end
-end
-
-if not resolvers then
- locate_libs()
-end
-
-if not resolvers then
- print("")
- print("Luatools is unable to start up due to lack of libraries. You may")
- print("try to run 'lua luatools.lua --selfmerge' in the path where this")
- print("script is located (normally under ..../scripts/context/lua) which")
- print("will make luatools library independent.")
- os.exit()
-end
-
-logs.setprogram('LuaTools',"TDS Management Tool 1.32",environment.arguments["verbose"] or false)
-
-local instance = resolvers.reset()
-
-resolvers.defaultlibs = { -- not all are needed (this will become: context.lus (lua spec)
- 'l-string.lua',
- 'l-lpeg.lua',
- 'l-table.lua',
- 'l-boolean.lua',
- 'l-number.lua',
- 'l-unicode.lua',
- 'l-os.lua',
- 'l-io.lua',
- 'l-file.lua',
- 'l-md5.lua',
- 'l-url.lua',
- 'l-dir.lua',
- 'l-utils.lua',
- 'l-dimen.lua',
- 'trac-inf.lua',
- 'trac-tra.lua',
- 'trac-log.lua',
- 'luat-env.lua', -- here ?
- 'data-res.lua',
- 'data-inp.lua',
- 'data-out.lua',
- 'data-tmp.lua',
- 'data-con.lua',
- 'data-use.lua',
--- 'data-pre.lua',
- 'data-tex.lua',
- 'data-bin.lua',
--- 'data-zip.lua',
--- 'data-clr.lua',
- 'data-lua.lua',
- 'data-ctx.lua',
- 'luat-fio.lua',
- 'luat-cnf.lua',
-}
-
-instance.engine = environment.arguments["engine"] or 'luatex'
-instance.progname = environment.arguments["progname"] or 'context'
-instance.luaname = environment.arguments["luafile"] or "" -- environment.ownname or ""
-instance.lualibs = environment.arguments["lualibs"] or table.concat(resolvers.defaultlibs,",")
-instance.allresults = environment.arguments["all"] or false
-instance.pattern = environment.arguments["pattern"] or nil
-instance.sortdata = environment.arguments["sort"] or false
-instance.kpseonly = not environment.arguments["all"] or false
-instance.my_format = environment.arguments["format"] or instance.format
-
-if type(instance.pattern) == 'boolean' then
- logs.simple("invalid pattern specification")
- instance.pattern = nil
-end
-
-if environment.arguments["trace"] then resolvers.settrace(environment.arguments["trace"]) end
-
-local trackspec = environment.argument("trackers") or environment.argument("track")
-
-if trackspec then
- trackers.enable(trackspec)
-end
-
-runners = runners or { }
-messages = messages or { }
-
-messages.no_ini_file = [[
-There is no lua initialization file found. This file can be forced by the
-"--progname" directive, or specified with "--luaname", or it is derived
-automatically from the formatname (aka jobname). It may be that you have
-to regenerate the file database using "luatools --generate".
-]]
-
-messages.help = [[
---generate generate file database
---variables show configuration variables
---expansions show expanded variables
---configurations show configuration order
---expand-braces expand complex variable
---expand-path expand variable (resolve paths)
---expand-var expand variable (resolve references)
---show-path show path expansion of ...
---var-value report value of variable
---find-file report file location
---find-path report path of file
---make or --ini make luatex format
---run or --fmt= run luatex format
---luafile=str lua inifile (default is <progname>.lua)
---lualibs=list libraries to assemble (optional when --compile)
---compile assemble and compile lua inifile
---verbose give a bit more info
---all show all found files
---sort sort cached data
---engine=str target engine
---progname=str format or backend
---pattern=str filter variables
---trackers=list enable given trackers
-]]
-
-function runners.make_format(texname)
- local instance = resolvers.instance
- if texname and texname ~= "" then
- if resolvers.usecache then
- local path = file.join(caches.setpath("formats")) -- maybe platform
- if path and lfs then
- lfs.chdir(path)
- end
- end
- local barename = texname:gsub("%.%a+$","")
- if barename == texname then
- texname = texname .. ".tex"
- end
- local fullname = resolvers.find_files(texname)[1] or ""
- if fullname == "" then
- logs.simple("no tex file with name: %s",texname)
- else
- local luaname, lucname, luapath, lualibs = "", "", "", { }
- -- the following is optional, since context.lua can also
- -- handle this collect and compile business
- if environment.arguments["compile"] then
- if luaname == "" then luaname = barename end
- logs.simple("creating initialization file: %s",luaname)
- luapath = file.dirname(luaname)
- if luapath == "" then
- luapath = file.dirname(texname)
- end
- if luapath == "" then
- luapath = file.dirname(resolvers.find_files(texname)[1] or "")
- end
- lualibs = string.split(instance.lualibs,",")
- luaname = file.basename(barename .. ".lua")
- lucname = file.basename(barename .. ".luc")
- -- todo: when this fails, we can just copy the merged libraries from
- -- luatools since they are normally the same, at least for context
- if lualibs[1] then
- local firstlib = file.join(luapath,lualibs[1])
- if not lfs.isfile(firstlib) then
- local foundname = resolvers.find_files(lualibs[1])[1]
- if foundname then
- logs.simple("located library path: %s",luapath)
- luapath = file.dirname(foundname)
- end
- end
- end
- logs.simple("using library path: %s",luapath)
- logs.simple("using lua libraries: %s",table.join(lualibs," "))
- utils.merger.selfcreate(lualibs,luapath,luaname)
- local strip = resolvers.boolean_variable("LUACSTRIP", true)
- if utils.lua.compile(luaname,lucname,false,strip) and io.exists(lucname) then
- luaname = lucname
- logs.simple("using compiled initialization file: %s",lucname)
- else
- logs.simple("using uncompiled initialization file: %s",luaname)
- end
- else
- local what = { instance.luaname, instance.progname, barename }
- for k=1,#what do
- local v = string.gsub(what[k]..".lua","%.lua%.lua$",".lua")
- if v and (v ~= "") then
- luaname = resolvers.find_files(v)[1] or ""
- if luaname ~= "" then
- break
- end
- end
- end
- end
- if environment.arguments["noluc"] then
- luaname = luaname:gsub("%.luc$",".lua") -- make this an option
- end
- if luaname == "" then
- if logs.verbose then
- logs.simplelines(messages.no_ini_file)
- logs.simple("texname : %s",texname)
- logs.simple("luaname : %s",instance.luaname)
- logs.simple("progname: %s",instance.progname)
- logs.simple("barename: %s",barename)
- end
- else
- logs.simple("using lua initialization file: %s",luaname)
- local mp = dir.glob(file.removesuffix(file.basename(luaname)).."-*.mem")
- if mp and #mp > 0 then
- for i=1,#mp do
- local name = mp[i]
- logs.simple("removing related mplib format %s", file.basename(name))
- os.remove(name)
- end
- end
- local flags = {
- "--ini",
- "--lua=" .. string.quote(luaname)
- }
- local bs = (os.platform == "unix" and "\\\\") or "\\" -- todo: make a function
- local command = "luatex ".. table.concat(flags," ") .. " " .. string.quote(fullname) .. " " .. bs .. "dump"
- logs.simple("running command: %s\n",command)
- os.spawn(command)
- -- todo: do a dummy run that generates the related metafun and mfplain formats
- end
- end
- else
- logs.simple("no tex file given")
- end
-end
-
-function runners.run_format(name,data,more)
- -- hm, rather old code here; we can now use the file.whatever functions
- if name and (name ~= "") then
- local barename = name:gsub("%.%a+$","")
- local fmtname = ""
- if resolvers.usecache then
- local path = file.join(caches.setpath("formats")) -- maybe platform
- fmtname = file.join(path,barename..".fmt") or ""
- end
- if fmtname == "" then
- fmtname = resolvers.find_files(barename..".fmt")[1] or ""
- end
- fmtname = resolvers.clean_path(fmtname)
- barename = fmtname:gsub("%.%a+$","")
- if fmtname == "" then
- logs.simple("no format with name: %s",name)
- else
- local luaname = barename .. ".luc"
- local f = io.open(luaname)
- if not f then
- luaname = barename .. ".lua"
- f = io.open(luaname)
- end
- if f then
- f:close()
- local command = "luatex --fmt=" .. string.quote(barename) .. " --lua=" .. string.quote(luaname) .. " " .. string.quote(data) .. " " .. (more ~= "" and string.quote(more) or "")
- logs.simple("running command: %s",command)
- os.spawn(command)
- else
- logs.simple("using format name: %s",fmtname)
- logs.simple("no luc/lua with name: %s",barename)
- end
- end
- end
-end
-
-local ok = true
-
--- private option --noluc for testing errors in the stub
-
-if environment.arguments["find-file"] then
- resolvers.load()
- instance.format = environment.arguments["format"] or instance.format
- if instance.pattern then
- instance.allresults = true
- resolvers.for_files(resolvers.find_files, { instance.pattern }, instance.my_format)
- else
- resolvers.for_files(resolvers.find_files, environment.files, instance.my_format)
- end
-elseif environment.arguments["find-path"] then
- resolvers.load()
- local path = resolvers.find_file(environment.files[1], instance.my_format)
- if logs.verbose then
- logs.simple(file.dirname(path))
- else
- print(file.dirname(path))
- end
-elseif environment.arguments["run"] then
- resolvers.load("nofiles") -- ! no need for loading databases
- logs.setverbose(true)
- runners.run_format(environment.files[1] or "",environment.files[2] or "",environment.files[3] or "")
-elseif environment.arguments["fmt"] then
- resolvers.load("nofiles") -- ! no need for loading databases
- logs.setverbose(true)
- runners.run_format(environment.arguments["fmt"], environment.files[1] or "",environment.files[2] or "")
-elseif environment.arguments["expand-braces"] then
- resolvers.load("nofiles")
- resolvers.for_files(resolvers.expand_braces, environment.files)
-elseif environment.arguments["expand-path"] then
- resolvers.load("nofiles")
- resolvers.for_files(resolvers.expand_path, environment.files)
-elseif environment.arguments["expand-var"] or environment.arguments["expand-variable"] then
- resolvers.load("nofiles")
- resolvers.for_files(resolvers.expand_var, environment.files)
-elseif environment.arguments["show-path"] or environment.arguments["path-value"] then
- resolvers.load("nofiles")
- resolvers.for_files(resolvers.show_path, environment.files)
-elseif environment.arguments["var-value"] or environment.arguments["show-value"] then
- resolvers.load("nofiles")
- resolvers.for_files(resolvers.var_value, environment.files)
-elseif environment.arguments["format-path"] then
- resolvers.load()
- logs.simple(caches.setpath("format"))
-elseif instance.pattern then -- brrr
- resolvers.load()
- instance.format = environment.arguments["format"] or instance.format
- instance.allresults = true
- resolvers.for_files(resolvers.find_files, { instance.pattern }, instance.my_format)
-elseif environment.arguments["generate"] then
- instance.renewcache = true
- logs.setverbose(true)
- resolvers.load()
-elseif environment.arguments["make"] or environment.arguments["ini"] or environment.arguments["compile"] then
- resolvers.load()
- logs.setverbose(true)
- runners.make_format(environment.files[1] or "")
-elseif environment.arguments["selfmerge"] then
- utils.merger.selfmerge(own.name,own.libs,own.list)
-elseif environment.arguments["selfclean"] then
- utils.merger.selfclean(own.name)
-elseif environment.arguments["selfupdate"] then
- resolvers.load()
- logs.setverbose(true)
- resolvers.update_script(own.name,"luatools")
-elseif environment.arguments["variables"] or environment.arguments["show-variables"] then
- resolvers.load("nofiles")
- resolvers.listers.variables()
-elseif environment.arguments["expansions"] or environment.arguments["show-expansions"] then
- resolvers.load("nofiles")
- resolvers.listers.expansions()
-elseif environment.arguments["configurations"] or environment.arguments["show-configurations"] then
- resolvers.load("nofiles")
- resolvers.listers.configurations()
-elseif environment.arguments["help"] or (environment.files[1]=='help') or (#environment.files==0) then
- logs.help(messages.help)
-else
- resolvers.load()
- resolvers.for_files(resolvers.find_files, environment.files, instance.my_format)
-end
-
-if logs.verbose then
- logs.simpleline()
- logs.simple("runtime: %0.3f seconds",os.runtime())
-end
-
-if os.platform == "unix" then
- io.write("\n")
-end
+#!/bin/sh
+mtxrun --script base "$@"
diff --git a/Master/texmf-dist/scripts/context/stubs/unix/metatex b/Master/texmf-dist/scripts/context/stubs/unix/metatex
deleted file mode 100755
index f0c6b65d42f..00000000000
--- a/Master/texmf-dist/scripts/context/stubs/unix/metatex
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-mtxrun --script metatex "$@"
diff --git a/Master/texmf-dist/scripts/context/stubs/unix/mtxrun b/Master/texmf-dist/scripts/context/stubs/unix/mtxrun
index 2bdd1b8f020..cc5ebb478ac 100755
--- a/Master/texmf-dist/scripts/context/stubs/unix/mtxrun
+++ b/Master/texmf-dist/scripts/context/stubs/unix/mtxrun
@@ -8,7 +8,6 @@ if not modules then modules = { } end modules ['mtxrun'] = {
license = "see context related readme files"
}
-
-- one can make a stub:
--
-- #!/bin/sh
@@ -38,8 +37,6 @@ if not modules then modules = { } end modules ['mtxrun'] = {
-- remember for subruns: _CTX_K_S_#{original}_
-- remember for subruns: TEXMFSTART.#{original} [tex.rb texmfstart.rb]
-texlua = true
-
-- begin library merge
@@ -54,8 +51,9 @@ if not modules then modules = { } end modules ['l-string'] = {
license = "see context related readme files"
}
+local string = string
local sub, gsub, find, match, gmatch, format, char, byte, rep, lower = string.sub, string.gsub, string.find, string.match, string.gmatch, string.format, string.char, string.byte, string.rep, string.lower
-local lpegmatch = lpeg.match
+local lpegmatch, S, C, Ct = lpeg.match, lpeg.S, lpeg.C, lpeg.Ct
-- some functions may disappear as they are not used anywhere
@@ -63,196 +61,68 @@ if not string.split then
-- this will be overloaded by a faster lpeg variant
- function string:split(pattern)
- if #self > 0 then
- local t = { }
- for s in gmatch(self..pattern,"(.-)"..pattern) do
- t[#t+1] = s
+ function string.split(str,pattern)
+ local t = { }
+ if #str > 0 then
+ local n = 1
+ for s in gmatch(str..pattern,"(.-)"..pattern) do
+ t[n] = s
+ n = n + 1
end
- return t
- else
- return { }
end
+ return t
end
end
-local chr_to_esc = {
- ["%"] = "%%",
- ["."] = "%.",
- ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
- ["^"] = "%^", ["$"] = "%$",
- ["["] = "%[", ["]"] = "%]",
- ["("] = "%(", [")"] = "%)",
- ["{"] = "%{", ["}"] = "%}"
-}
-
-string.chr_to_esc = chr_to_esc
-
-function string:esc() -- variant 2
- return (gsub(self,"(.)",chr_to_esc))
-end
-
-function string:unquote()
- return (gsub(self,"^([\"\'])(.*)%1$","%2"))
+function string.unquoted(str)
+ return (gsub(str,"^([\"\'])(.*)%1$","%2"))
end
---~ function string:unquote()
---~ if find(self,"^[\'\"]") then
---~ return sub(self,2,-2)
---~ else
---~ return self
---~ end
---~ end
-function string:quote() -- we could use format("%q")
- return format("%q",self)
+function string.quoted(str)
+ return format("%q",str) -- always "
end
-function string:count(pattern) -- variant 3
+function string.count(str,pattern) -- variant 3
local n = 0
- for _ in gmatch(self,pattern) do
+ for _ in gmatch(str,pattern) do -- not for utf
n = n + 1
end
return n
end
-function string:limit(n,sentinel)
- if #self > n then
- sentinel = sentinel or " ..."
- return sub(self,1,(n-#sentinel)) .. sentinel
- else
- return self
- end
-end
-
---~ function string:strip() -- the .- is quite efficient
---~ -- return match(self,"^%s*(.-)%s*$") or ""
---~ -- return match(self,'^%s*(.*%S)') or '' -- posted on lua list
---~ return find(s,'^%s*$') and '' or match(s,'^%s*(.*%S)')
---~ end
-
-do -- roberto's variant:
- local space = lpeg.S(" \t\v\n")
- local nospace = 1 - space
- local stripper = space^0 * lpeg.C((space^0 * nospace^1)^0)
- function string.strip(str)
- return lpegmatch(stripper,str) or ""
- end
-end
-
-function string:is_empty()
- return not find(self,"%S")
-end
-
-function string:enhance(pattern,action)
- local ok, n = true, 0
- while ok do
- ok = false
- self = gsub(self,pattern, function(...)
- ok, n = true, n + 1
- return action(...)
- end)
- end
- return self, n
-end
-
-local chr_to_hex, hex_to_chr = { }, { }
-
-for i=0,255 do
- local c, h = char(i), format("%02X",i)
- chr_to_hex[c], hex_to_chr[h] = h, c
-end
-
-function string:to_hex()
- return (gsub(self or "","(.)",chr_to_hex))
-end
-
-function string:from_hex()
- return (gsub(self or "","(..)",hex_to_chr))
-end
-
-if not string.characters then
-
- local function nextchar(str, index)
- index = index + 1
- return (index <= #str) and index or nil, sub(str,index,index)
- end
- function string:characters()
- return nextchar, self, 0
- end
- local function nextbyte(str, index)
- index = index + 1
- return (index <= #str) and index or nil, byte(sub(str,index,index))
- end
- function string:bytes()
- return nextbyte, self, 0
- end
-
-end
-
--- we can use format for this (neg n)
-
-function string:rpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return self .. rep(chr or " ",m)
+function string.limit(str,n,sentinel) -- not utf proof
+ if #str > n then
+ sentinel = sentinel or "..."
+ return sub(str,1,(n-#sentinel)) .. sentinel
else
- return self
- end
-end
-
-function string:lpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return rep(chr or " ",m) .. self
- else
- return self
+ return str
end
end
-string.padd = string.rpadd
+local space = S(" \t\v\n")
+local nospace = 1 - space
+local stripper = space^0 * C((space^0 * nospace^1)^0) -- roberto's code
-function is_number(str) -- tonumber
- return find(str,"^[%-%+]?[%d]-%.?[%d+]$") == 1
+function string.strip(str)
+ return lpegmatch(stripper,str) or ""
end
---~ print(is_number("1"))
---~ print(is_number("1.1"))
---~ print(is_number(".1"))
---~ print(is_number("-0.1"))
---~ print(is_number("+0.1"))
---~ print(is_number("-.1"))
---~ print(is_number("+.1"))
-
-function string:split_settings() -- no {} handling, see l-aux for lpeg variant
- if find(self,"=") then
- local t = { }
- for k,v in gmatch(self,"(%a+)=([^%,]*)") do
- t[k] = v
- end
- return t
- else
- return nil
- end
+function string.is_empty(str)
+ return not find(str,"%S")
end
local patterns_escapes = {
- ["-"] = "%-",
- ["."] = "%.",
- ["+"] = "%+",
- ["*"] = "%*",
["%"] = "%%",
- ["("] = "%)",
- [")"] = "%)",
- ["["] = "%[",
- ["]"] = "%]",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%(", [")"] = "%)",
+ -- ["{"] = "%{", ["}"] = "%}"
+ -- ["^"] = "%^", ["$"] = "%$",
}
-function string:pattesc()
- return (gsub(self,".",patterns_escapes))
-end
-
local simple_escapes = {
["-"] = "%-",
["."] = "%.",
@@ -260,80 +130,30 @@ local simple_escapes = {
["*"] = ".*",
}
-function string:simpleesc()
- return (gsub(self,".",simple_escapes))
-end
-
-function string:tohash()
- local t = { }
- for s in gmatch(self,"([^, ]+)") do -- lpeg
- t[s] = true
- end
- return t
-end
-
-local pattern = lpeg.Ct(lpeg.C(1)^0)
-
-function string:totable()
- return lpegmatch(pattern,self)
+function string.escapedpattern(str,simple)
+ return (gsub(str,".",simple and simple_escapes or patterns_escapes))
end
---~ local t = {
---~ "1234567123456712345671234567",
---~ "a\tb\tc",
---~ "aa\tbb\tcc",
---~ "aaa\tbbb\tccc",
---~ "aaaa\tbbbb\tcccc",
---~ "aaaaa\tbbbbb\tccccc",
---~ "aaaaaa\tbbbbbb\tcccccc",
---~ }
---~ for k,v do
---~ print(string.tabtospace(t[k]))
---~ end
-
-function string.tabtospace(str,tab)
- -- we don't handle embedded newlines
- while true do
- local s = find(str,"\t")
- if s then
- if not tab then tab = 7 end -- only when found
- local d = tab-(s-1) % tab
- if d > 0 then
- str = gsub(str,"\t",rep(" ",d),1)
- else
- str = gsub(str,"\t","",1)
- end
+function string.topattern(str,lowercase,strict)
+ if str == "" then
+ return ".*"
+ else
+ str = gsub(str,".",simple_escapes)
+ if lowercase then
+ str = lower(str)
+ end
+ if strict then
+ return "^" .. str .. "$"
else
- break
+ return str
end
end
- return str
end
-function string:compactlong() -- strips newlines and leading spaces
- self = gsub(self,"[\n\r]+ *","")
- self = gsub(self,"^ *","")
- return self
-end
-
-function string:striplong() -- strips newlines and leading spaces
- self = gsub(self,"^%s*","")
- self = gsub(self,"[\n\r]+ *","\n")
- return self
-end
+-- obsolete names:
-function string:topattern(lowercase,strict)
- if lowercase then
- self = lower(self)
- end
- self = gsub(self,".",simple_escapes)
- if self == "" then
- self = ".*"
- elseif strict then
- self = "^" .. self .. "$"
- end
- return self
-end
+string.quote = string.quoted
+string.unquote = string.unquoted
end -- of closure
@@ -350,28 +170,75 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
local lpeg = require("lpeg")
+local type = type
+
+-- Beware, we predefine a bunch of patterns here and one reason for doing so
+-- is that we get consistent behaviour in some of the visualizers.
+
lpeg.patterns = lpeg.patterns or { } -- so that we can share
local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
-local match = lpeg.match
+local P, R, S, V, match = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.match
+local Ct, C, Cs, Cc = lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local lpegtype = lpeg.type
+
+local utfcharacters = string.utfcharacters
+local utfgmatch = unicode and unicode.utf8.gmatch
+
+local anything = P(1)
+local endofstring = P(-1)
+local alwaysmatched = P(true)
+
+patterns.anything = anything
+patterns.endofstring = endofstring
+patterns.beginofstring = alwaysmatched
+patterns.alwaysmatched = alwaysmatched
local digit, sign = R('09'), S('+-')
local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
-local utf8byte = R("\128\191")
+local newline = crlf + cr + lf
+local escaped = P("\\") * anything
+local squote = P("'")
+local dquote = P('"')
+local space = P(" ")
+
+local utfbom_32_be = P('\000\000\254\255')
+local utfbom_32_le = P('\255\254\000\000')
+local utfbom_16_be = P('\255\254')
+local utfbom_16_le = P('\254\255')
+local utfbom_8 = P('\239\187\191')
+local utfbom = utfbom_32_be + utfbom_32_le
+ + utfbom_16_be + utfbom_16_le
+ + utfbom_8
+local utftype = utfbom_32_be / "utf-32-be" + utfbom_32_le / "utf-32-le"
+ + utfbom_16_be / "utf-16-be" + utfbom_16_le / "utf-16-le"
+ + utfbom_8 / "utf-8" + alwaysmatched / "unknown"
+
+local utf8next = R("\128\191")
-patterns.utf8byte = utf8byte
patterns.utf8one = R("\000\127")
-patterns.utf8two = R("\194\223") * utf8byte
-patterns.utf8three = R("\224\239") * utf8byte * utf8byte
-patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+patterns.utf8two = R("\194\223") * utf8next
+patterns.utf8three = R("\224\239") * utf8next * utf8next
+patterns.utf8four = R("\240\244") * utf8next * utf8next * utf8next
+patterns.utfbom = utfbom
+patterns.utftype = utftype
+
+local utf8char = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+local validutf8char = utf8char^0 * endofstring * Cc(true) + Cc(false)
+
+patterns.utf8 = utf8char
+patterns.utf8char = utf8char
+patterns.validutf8 = validutf8char
+patterns.validutf8char = validutf8char
patterns.digit = digit
patterns.sign = sign
patterns.cardinal = sign^0 * digit^1
patterns.integer = sign^0 * digit^1
patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.cfloat = sign^0 * digit^0 * P(',') * digit^1
patterns.number = patterns.float + patterns.integer
+patterns.cnumber = patterns.cfloat + patterns.integer
patterns.oct = P("0") * R("07")^1
patterns.octal = patterns.oct
patterns.HEX = P("0x") * R("09","AF")^1
@@ -380,16 +247,42 @@ patterns.hexadecimal = P("0x") * R("09","AF","af")^1
patterns.lowercase = R("az")
patterns.uppercase = R("AZ")
patterns.letter = patterns.lowercase + patterns.uppercase
-patterns.space = S(" ")
+patterns.space = space
+patterns.tab = P("\t")
+patterns.spaceortab = patterns.space + patterns.tab
patterns.eol = S("\n\r")
patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-patterns.newline = crlf + cr + lf
-patterns.nonspace = 1 - patterns.space
+patterns.newline = newline
+patterns.emptyline = newline^1
patterns.nonspacer = 1 - patterns.spacer
patterns.whitespace = patterns.eol + patterns.spacer
patterns.nonwhitespace = 1 - patterns.whitespace
-patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
-patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
+patterns.equal = P("=")
+patterns.comma = P(",")
+patterns.commaspacer = P(",") * patterns.spacer^0
+patterns.period = P(".")
+patterns.colon = P(":")
+patterns.semicolon = P(";")
+patterns.underscore = P("_")
+patterns.escaped = escaped
+patterns.squote = squote
+patterns.dquote = dquote
+patterns.nosquote = (escaped + (1-squote))^0
+patterns.nodquote = (escaped + (1-dquote))^0
+patterns.unsingle = (squote/"") * patterns.nosquote * (squote/"")
+patterns.undouble = (dquote/"") * patterns.nodquote * (dquote/"")
+patterns.unquoted = patterns.undouble + patterns.unsingle -- more often undouble
+patterns.unspacer = ((patterns.spacer^1)/"")^0
+
+patterns.somecontent = (anything - newline - space)^1 -- (utf8char - newline - space)^1
+patterns.beginline = #(1-newline)
+
+local unquoted = Cs(patterns.unquoted * endofstring) -- not C
+
+function string.unquoted(str)
+ return match(unquoted,str) or str
+end
+
function lpeg.anywhere(pattern) --slightly adapted from website
return P { P(pattern) + 1 * V(1) } -- why so complex?
@@ -399,36 +292,18 @@ function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
-local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
-local empty = spacing * Cc("")
-local nonempty = Cs((1-spacing)^1) * spacing^-1
-local content = (empty + nonempty)^1
-
-local capture = Ct(content^0)
-
-function string:splitlines()
- return match(capture,self)
-end
-
-patterns.textline = content
-
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps")) -- oeps
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps")) -- oeps
-
local splitters_s, splitters_m = { }, { }
local function splitat(separator,single)
local splitter = (single and splitters_s[separator]) or splitters_m[separator]
if not splitter then
separator = P(separator)
+ local other = C((1 - separator)^0)
if single then
- local other, any = C((1 - separator)^0), P(1)
+ local any = anything
splitter = other * (separator * C(any^0) + "") -- ?
splitters_s[separator] = splitter
else
- local other = C((1 - separator)^0)
splitter = other * (separator * other)^0
splitters_m[separator] = splitter
end
@@ -438,6 +313,7 @@ end
lpeg.splitat = splitat
+
local cache = { }
function lpeg.split(separator,str)
@@ -449,16 +325,39 @@ function lpeg.split(separator,str)
return match(c,str)
end
-function string:split(separator)
+function string.split(str,separator)
local c = cache[separator]
if not c then
c = Ct(splitat(separator))
cache[separator] = c
end
- return match(c,self)
+ return match(c,str)
+end
+
+local spacing = patterns.spacer^0 * newline -- sort of strip
+local empty = spacing * Cc("")
+local nonempty = Cs((1-spacing)^1) * spacing^-1
+local content = (empty + nonempty)^1
+
+patterns.textline = content
+
+
+local linesplitter = Ct(splitat(newline))
+
+patterns.linesplitter = linesplitter
+
+function string.splitlines(str)
+ return match(linesplitter,str)
+end
+
+local utflinesplitter = utfbom^-1 * Ct(splitat(newline))
+
+patterns.utflinesplitter = utflinesplitter
+
+function string.utfsplitlines(str)
+ return match(utflinesplitter,str)
end
-lpeg.splitters = cache
local cache = { }
@@ -466,37 +365,24 @@ function lpeg.checkedsplit(separator,str)
local c = cache[separator]
if not c then
separator = P(separator)
- local other = C((1 - separator)^0)
+ local other = C((1 - separator)^1)
c = Ct(separator^0 * other * (separator^1 * other)^0)
cache[separator] = c
end
return match(c,str)
end
-function string:checkedsplit(separator)
+function string.checkedsplit(str,separator)
local c = cache[separator]
if not c then
separator = P(separator)
- local other = C((1 - separator)^0)
+ local other = C((1 - separator)^1)
c = Ct(separator^0 * other * (separator^1 * other)^0)
cache[separator] = c
end
- return match(c,self)
+ return match(c,str)
end
---~ function lpeg.append(list,pp)
---~ local p = pp
---~ for l=1,#list do
---~ if p then
---~ p = p + P(list[l])
---~ else
---~ p = P(list[l])
---~ end
---~ end
---~ return p
---~ end
-
---~ from roberto's site:
local f1 = string.byte
@@ -504,7 +390,273 @@ local function f2(s) local c1, c2 = f1(s,1,2) return c1 * 64 + c2
local function f3(s) local c1, c2, c3 = f1(s,1,3) return (c1 * 64 + c2) * 64 + c3 - 925824 end
local function f4(s) local c1, c2, c3, c4 = f1(s,1,4) return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168 end
-patterns.utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
+local utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
+
+patterns.utf8byte = utf8byte
+
+
+
+local cache = { }
+
+function lpeg.stripper(str)
+ if type(str) == "string" then
+ local s = cache[str]
+ if not s then
+ s = Cs(((S(str)^1)/"" + 1)^0)
+ cache[str] = s
+ end
+ return s
+ else
+ return Cs(((str^1)/"" + 1)^0)
+ end
+end
+
+local cache = { }
+
+function lpeg.keeper(str)
+ if type(str) == "string" then
+ local s = cache[str]
+ if not s then
+ s = Cs((((1-S(str))^1)/"" + 1)^0)
+ cache[str] = s
+ end
+ return s
+ else
+ return Cs((((1-str)^1)/"" + 1)^0)
+ end
+end
+
+function lpeg.frontstripper(str) -- or pattern (yet undocumented)
+ return (P(str) + P(true)) * Cs(P(1)^0)
+end
+
+function lpeg.endstripper(str) -- or pattern (yet undocumented)
+ return Cs((1 - P(str) * P(-1))^0)
+end
+
+-- Just for fun I looked at the used bytecode and
+-- p = (p and p + pp) or pp gets one more (testset).
+
+function lpeg.replacer(one,two)
+ if type(one) == "table" then
+ local no = #one
+ if no > 0 then
+ local p
+ for i=1,no do
+ local o = one[i]
+ local pp = P(o[1]) / o[2]
+ if p then
+ p = p + pp
+ else
+ p = pp
+ end
+ end
+ return Cs((p + 1)^0)
+ end
+ else
+ two = two or ""
+ return Cs((P(one)/two + 1)^0)
+ end
+end
+
+local splitters_f, splitters_s = { }, { }
+
+function lpeg.firstofsplit(separator) -- always return value
+ local splitter = splitters_f[separator]
+ if not splitter then
+ separator = P(separator)
+ splitter = C((1 - separator)^0)
+ splitters_f[separator] = splitter
+ end
+ return splitter
+end
+
+function lpeg.secondofsplit(separator) -- nil if not split
+ local splitter = splitters_s[separator]
+ if not splitter then
+ separator = P(separator)
+ splitter = (1 - separator)^0 * separator * C(anything^0)
+ splitters_s[separator] = splitter
+ end
+ return splitter
+end
+
+function lpeg.balancer(left,right)
+ left, right = P(left), P(right)
+ return P { left * ((1 - left - right) + V(1))^0 * right }
+end
+
+
+
+local nany = utf8char/""
+
+function lpeg.counter(pattern)
+ pattern = Cs((P(pattern)/" " + nany)^0)
+ return function(str)
+ return #match(pattern,str)
+ end
+end
+
+if utfgmatch then
+
+ function lpeg.count(str,what) -- replaces string.count
+ if type(what) == "string" then
+ local n = 0
+ for _ in utfgmatch(str,what) do
+ n = n + 1
+ end
+ return n
+ else -- 4 times slower but still faster than / function
+ return #match(Cs((P(what)/" " + nany)^0),str)
+ end
+ end
+
+else
+
+ local cache = { }
+
+ function lpeg.count(str,what) -- replaces string.count
+ if type(what) == "string" then
+ local p = cache[what]
+ if not p then
+ p = Cs((P(what)/" " + nany)^0)
+ cache[p] = p
+ end
+ return #match(p,str)
+ else -- 4 times slower but still faster than / function
+ return #match(Cs((P(what)/" " + nany)^0),str)
+ end
+ end
+
+end
+
+local patterns_escapes = { -- also defines in l-string
+ ["%"] = "%%",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%)", [")"] = "%)",
+ -- ["{"] = "%{", ["}"] = "%}"
+ -- ["^"] = "%^", ["$"] = "%$",
+}
+
+local simple_escapes = { -- also defines in l-string
+ ["-"] = "%-",
+ ["."] = "%.",
+ ["?"] = ".",
+ ["*"] = ".*",
+}
+
+local p = Cs((S("-.+*%()[]") / patterns_escapes + anything)^0)
+local s = Cs((S("-.+*%()[]") / simple_escapes + anything)^0)
+
+function string.escapedpattern(str,simple)
+ return match(simple and s or p,str)
+end
+
+-- utf extensies
+
+lpeg.UP = lpeg.P
+
+if utfcharacters then
+
+ function lpeg.US(str)
+ local p
+ for uc in utfcharacters(str) do
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ return p
+ end
+
+
+elseif utfgmatch then
+
+ function lpeg.US(str)
+ local p
+ for uc in utfgmatch(str,".") do
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ return p
+ end
+
+else
+
+ function lpeg.US(str)
+ local p
+ local f = function(uc)
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ match((utf8char/f)^0,str)
+ return p
+ end
+
+end
+
+local range = Cs(utf8byte) * (Cs(utf8byte) + Cc(false))
+
+local utfchar = unicode and unicode.utf8 and unicode.utf8.char
+
+function lpeg.UR(str,more)
+ local first, last
+ if type(str) == "number" then
+ first = str
+ last = more or first
+ else
+ first, last = match(range,str)
+ if not last then
+ return P(str)
+ end
+ end
+ if first == last then
+ return P(str)
+ elseif utfchar and last - first < 8 then -- a somewhat arbitrary criterium
+ local p
+ for i=first,last do
+ if p then
+ p = p + P(utfchar(i))
+ else
+ p = P(utfchar(i))
+ end
+ end
+ return p -- nil when invalid range
+ else
+ local f = function(b)
+ return b >= first and b <= last
+ end
+ return utf8byte / f -- nil when invalid range
+ end
+end
+
+
+
+function lpeg.oneof(list,...) -- lpeg.oneof("elseif","else","if","then")
+ if type(list) ~= "table" then
+ list = { list, ... }
+ end
+ -- sort(list) -- longest match first
+ local p = P(list[1])
+ for l=2,#list do
+ p = p + P(list[l])
+ end
+ return p
+end
+
+function lpeg.is_lpeg(p)
+ return p and lpegtype(p) == "pattern"
+end
+
end -- of closure
@@ -519,12 +671,10 @@ if not modules then modules = { } end modules ['l-table'] = {
license = "see context related readme files"
}
-table.join = table.concat
-
+local type, next, tostring, tonumber, ipairs, table, string = type, next, tostring, tonumber, ipairs, table, string
local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove
local format, find, gsub, lower, dump, match = string.format, string.find, string.gsub, string.lower, string.dump, string.match
local getmetatable, setmetatable = getmetatable, setmetatable
-local type, next, tostring, tonumber, ipairs = type, next, tostring, tonumber, ipairs
-- Starting with version 5.2 Lua no longer provide ipairs, which makes
-- sense. As we already used the for loop and # in most places the
@@ -576,50 +726,56 @@ end
-- extra functions, some might go (when not used)
function table.strip(tab)
- local lst = { }
+ local lst, l = { }, 0
for i=1,#tab do
local s = gsub(tab[i],"^%s*(.-)%s*$","%1")
if s == "" then
-- skip this one
else
- lst[#lst+1] = s
+ l = l + 1
+ lst[l] = s
end
end
return lst
end
function table.keys(t)
- local k = { }
+ local keys, k = { }, 0
for key, _ in next, t do
- k[#k+1] = key
+ k = k + 1
+ keys[k] = key
end
- return k
+ return keys
end
local function compare(a,b)
- return (tostring(a) < tostring(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)
+ end
end
local function sortedkeys(tab)
- local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
+ local srt, category, s = { }, 0, 0 -- 0=unknown 1=string, 2=number 3=mixed
for key,_ in next, tab do
- srt[#srt+1] = key
- if kind == 3 then
+ s = s + 1
+ srt[s] = key
+ if category == 3 then
-- no further check
else
local tkey = type(key)
if tkey == "string" then
- -- if kind == 2 then kind = 3 else kind = 1 end
- kind = (kind == 2 and 3) or 1
+ category = (category == 2 and 3) or 1
elseif tkey == "number" then
- -- if kind == 1 then kind = 3 else kind = 2 end
- kind = (kind == 1 and 3) or 2
+ category = (category == 1 and 3) or 2
else
- kind = 3
+ category = 3
end
end
end
- if kind == 0 or kind == 3 then
+ if category == 0 or category == 3 then
sort(srt,compare)
else
sort(srt)
@@ -628,9 +784,12 @@ local function sortedkeys(tab)
end
local function sortedhashkeys(tab) -- fast one
- local srt = { }
+ local srt, s = { }, 0
for key,_ in next, tab do
- srt[#srt+1] = key
+ if key then
+ s= s + 1
+ srt[s] = key
+ end
end
sort(srt)
return srt
@@ -639,34 +798,50 @@ end
table.sortedkeys = sortedkeys
table.sortedhashkeys = sortedhashkeys
-function table.sortedhash(t)
- local s = sortedhashkeys(t) -- maybe just sortedkeys
- local n = 0
- local function kv(s)
- n = n + 1
- local k = s[n]
- return k, t[k]
+local function nothing() end
+
+local function sortedhash(t)
+ if t then
+ local n, s = 0, sortedkeys(t) -- the robust one
+ local function kv(s)
+ n = n + 1
+ local k = s[n]
+ return k, t[k]
+ end
+ return kv, s
+ else
+ return nothing
end
- return kv, s
end
-table.sortedpairs = table.sortedhash
+table.sortedhash = sortedhash
+table.sortedpairs = sortedhash
function table.append(t, list)
- for _,v in next, list do
- insert(t,v)
+ local n = #t
+ for i=1,#list do
+ n = n + 1
+ t[n] = list[i]
end
+ return t
end
function table.prepend(t, list)
- for k,v in next, list do
- insert(t,k,v)
+ local nl = #list
+ local nt = nl + #t
+ for i=#t,1,-1 do
+ t[nt] = t[i]
+ nt = nt - 1
+ end
+ for i=1,#list do
+ t[i] = list[i]
end
+ return t
end
function table.merge(t, ...) -- first one is target
- t = t or {}
- local lst = {...}
+ t = t or { }
+ local lst = { ... }
for i=1,#lst do
for k, v in next, lst[i] do
t[k] = v
@@ -676,7 +851,7 @@ function table.merge(t, ...) -- first one is target
end
function table.merged(...)
- local tmp, lst = { }, {...}
+ local tmp, lst = { }, { ... }
for i=1,#lst do
for k, v in next, lst[i] do
tmp[k] = v
@@ -686,41 +861,45 @@ function table.merged(...)
end
function table.imerge(t, ...)
- local lst = {...}
+ local lst, nt = { ... }, #t
for i=1,#lst do
local nst = lst[i]
for j=1,#nst do
- t[#t+1] = nst[j]
+ nt = nt + 1
+ t[nt] = nst[j]
end
end
return t
end
function table.imerged(...)
- local tmp, lst = { }, {...}
+ local tmp, ntmp, lst = { }, 0, {...}
for i=1,#lst do
local nst = lst[i]
for j=1,#nst do
- tmp[#tmp+1] = nst[j]
+ ntmp = ntmp + 1
+ tmp[ntmp] = nst[j]
end
end
return tmp
end
-local function fastcopy(old) -- fast one
+local function fastcopy(old,metatabletoo) -- fast one
if old then
local new = { }
for k,v in next, old do
if type(v) == "table" then
- new[k] = fastcopy(v) -- was just table.copy
+ new[k] = fastcopy(v,metatabletoo) -- was just table.copy
else
new[k] = v
end
end
- -- optional second arg
- local mt = getmetatable(old)
- if mt then
- setmetatable(new,mt)
+ if metatabletoo then
+ -- optional second arg
+ local mt = getmetatable(old)
+ if mt then
+ setmetatable(new,mt)
+ end
end
return new
else
@@ -728,6 +907,8 @@ local function fastcopy(old) -- fast one
end
end
+-- todo : copy without metatable
+
local function copy(t, tables) -- taken from lua wiki, slightly adapted
tables = tables or { }
local tcopy = {}
@@ -760,33 +941,14 @@ end
table.fastcopy = fastcopy
table.copy = copy
--- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
-
-function table.sub(t,i,j)
- return { unpack(t,i,j) }
-end
-
-function table.replace(a,b)
- for k,v in next, b do
- a[k] = v
+function table.derive(parent)
+ local child = { }
+ if parent then
+ setmetatable(child,{ __index = parent })
end
+ return child
end
--- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice)
-
-function table.is_empty(t) -- obolete, use inline code instead
- return not t or not next(t)
-end
-
-function table.one_entry(t) -- obolete, use inline code instead
- local n = next(t)
- return n and not next(t,n)
-end
-
---~ function table.starts_at(t) -- obsolete, not nice anyway
---~ return ipairs(t,1)(t,0)
---~ end
-
function table.tohash(t,value)
local h = { }
if t then
@@ -799,27 +961,19 @@ function table.tohash(t,value)
end
function table.fromhash(t)
- local h = { }
+ local hsh, h = { }, 0
for k, v in next, t do -- no ipairs here
- if v then h[#h+1] = k end
+ if v then
+ h = h + 1
+ hsh[h] = k
+ end
end
- return h
+ return hsh
end
---~ print(table.serialize(t), "\n")
---~ print(table.serialize(t,"name"), "\n")
---~ print(table.serialize(t,false), "\n")
---~ print(table.serialize(t,true), "\n")
---~ print(table.serialize(t,"name",true), "\n")
---~ print(table.serialize(t,"name",true,true), "\n")
-
-table.serialize_functions = true
-table.serialize_compact = true
-table.serialize_inline = true
-
local noquotes, hexify, handle, reduce, compact, inline, functions
-local reserved = table.tohash { -- intercept a language flaw, no reserved words as key
+local reserved = table.tohash { -- intercept a language inconvenience: no reserved words as key
'and', 'break', 'do', 'else', 'elseif', 'end', 'false', 'for', 'function', 'if',
'in', 'local', 'nil', 'not', 'or', 'repeat', 'return', 'then', 'true', 'until', 'while',
}
@@ -831,20 +985,23 @@ local function simple_table(t)
n = n + 1
end
if n == #t then
- local tt = { }
+ local tt, nt = { }, 0
for i=1,#t do
local v = t[i]
local tv = type(v)
if tv == "number" then
+ nt = nt + 1
if hexify then
- tt[#tt+1] = format("0x%04X",v)
+ tt[nt] = format("0x%04X",v)
else
- tt[#tt+1] = tostring(v) -- tostring not needed
+ tt[nt] = tostring(v) -- tostring not needed
end
elseif tv == "boolean" then
- tt[#tt+1] = tostring(v)
+ nt = nt + 1
+ tt[nt] = tostring(v)
elseif tv == "string" then
- tt[#tt+1] = format("%q",v)
+ nt = nt + 1
+ tt[nt] = format("%q",v)
else
tt = nil
break
@@ -870,21 +1027,25 @@ local function do_serialize(root,name,depth,level,indexed)
depth = depth .. " "
if indexed then
handle(format("%s{",depth))
- elseif name then
- --~ handle(format("%s%s={",depth,key(name)))
- if type(name) == "number" then -- or find(k,"^%d+$") then
+ else
+ local tn = type(name)
+ if tn == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s[0x%04X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
- elseif noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
- handle(format("%s%s={",depth,name))
+ elseif tn == "string" then
+ if noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
+ handle(format("%s%s={",depth,name))
+ else
+ handle(format("%s[%q]={",depth,name))
+ end
+ elseif tn == "boolean" then
+ handle(format("%s[%s]={",depth,tostring(name)))
else
- handle(format("%s[%q]={",depth,name))
+ handle(format("%s{",depth))
end
- else
- handle(format("%s{",depth))
end
end
-- we could check for k (index) being number (cardinal)
@@ -901,11 +1062,9 @@ local function do_serialize(root,name,depth,level,indexed)
for i=1,#sk do
local k = sk[i]
local v = root[k]
- --~ if v == root then
- -- circular
- --~ else
- local t = type(v)
- if compact and first and type(k) == "number" and k >= first and k <= last then
+ -- circular
+ local t, tk = type(v), type(k)
+ if compact and first and tk == "number" and k >= first and k <= last then
if t == "number" then
if hexify then
handle(format("%s 0x%04X,",depth,v))
@@ -947,17 +1106,18 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s __p__=nil,",depth))
end
elseif t == "number" then
- --~ if hexify then
- --~ handle(format("%s %s=0x%04X,",depth,key(k),v))
- --~ else
- --~ handle(format("%s %s=%s,",depth,key(k),v)) -- %.99g
- --~ end
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=0x%04X,",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,tostring(k),v))
+ else
+ handle(format("%s [%s]=%s,",depth,tostring(k),v)) -- %.99g
+ end
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
if hexify then
handle(format("%s %s=0x%04X,",depth,k,v))
@@ -973,26 +1133,28 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "string" then
if reduce and tonumber(v) then
- --~ handle(format("%s %s=%s,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=%s,",depth,tostring(k),v))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%s,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
else
- --~ handle(format("%s %s=%q,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=%q,",depth,tostring(k),v))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%q,",depth,k,v))
else
@@ -1001,13 +1163,14 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "table" then
if not next(v) then
- --~ handle(format("%s %s={},",depth,key(k)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]={},",depth,tostring(k)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s={},",depth,k))
else
@@ -1016,13 +1179,14 @@ local function do_serialize(root,name,depth,level,indexed)
elseif inline then
local st = simple_table(v)
if st then
- --~ handle(format("%s %s={ %s },",depth,key(k),concat(st,", ")))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]={ %s },",depth,tostring(k),concat(st,", ")))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s={ %s },",depth,k,concat(st,", ")))
else
@@ -1035,13 +1199,14 @@ local function do_serialize(root,name,depth,level,indexed)
do_serialize(v,k,depth,level+1)
end
elseif t == "boolean" then
- --~ handle(format("%s %s=%s,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%s,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%s,",depth,k,tostring(v)))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]=%s,",depth,tostring(k),tostring(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%s,",depth,k,tostring(v)))
else
@@ -1049,35 +1214,37 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "function" then
if functions then
- --~ handle(format('%s %s=loadstring(%q),',depth,key(k),dump(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v)))
else
handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v)))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=loadstring(%q),",depth,tostring(k),dump(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=loadstring(%q),",depth,k,dump(v)))
else
- handle(format("%s [%q]=loadstring(%q),",depth,k,dump(v)))
+ -- handle(format("%s [%q]=loadstring(%q),",depth,k,dump(v)))
+ handle(format("%s [%q]=loadstring(%q),",depth,k,debug.getinfo(v).what == "C" and "C code" or dump(v)))
end
end
else
- --~ handle(format("%s %s=%q,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]=%q,",depth,tostring(k),tostring(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%q,",depth,k,tostring(v)))
else
handle(format("%s [%q]=%q,",depth,k,tostring(v)))
end
end
- --~ end
- end
+ end
end
if level > 0 then
handle(format("%s},",depth))
@@ -1087,15 +1254,34 @@ end
-- replacing handle by a direct t[#t+1] = ... (plus test) is not much
-- faster (0.03 on 1.00 for zapfino.tma)
-local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
- noquotes = _noquotes
- hexify = _hexify
- handle = _handle or print
- reduce = _reduce or false
- compact = table.serialize_compact
- inline = compact and table.serialize_inline
- functions = table.serialize_functions
+local function serialize(_handle,root,name,specification) -- handle wins
local tname = type(name)
+ if type(specification) == "table" then
+ noquotes = specification.noquotes
+ hexify = specification.hexify
+ handle = _handle or specification.handle or print
+ reduce = specification.reduce or false
+ functions = specification.functions
+ compact = specification.compact
+ inline = specification.inline and compact
+ if functions == nil then
+ functions = true
+ end
+ if compact == nil then
+ compact = true
+ end
+ if inline == nil then
+ inline = compact
+ end
+ else
+ noquotes = false
+ hexify = false
+ handle = _handle or print
+ reduce = false
+ compact = true
+ inline = true
+ functions = true
+ end
if tname == "string" then
if name == "return" then
handle("return {")
@@ -1117,33 +1303,33 @@ local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
else
handle("t={")
end
- if root and next(root) then
- do_serialize(root,name,"",0,indexed)
+ if root then
+ -- The dummy access will initialize a table that has a delayed initialization
+ -- using a metatable. (maybe explicitly test for metatable)
+ if getmetatable(root) then -- todo: make this an option, maybe even per subtable
+ local dummy = root._w_h_a_t_e_v_e_r_
+ root._w_h_a_t_e_v_e_r_ = nil
+ end
+ -- Let's forget about empty tables.
+ if next(root) then
+ do_serialize(root,name,"",0)
+ end
end
handle("}")
end
---~ name:
---~
---~ true : return { }
---~ false : { }
---~ nil : t = { }
---~ string : string = { }
---~ 'return' : return { }
---~ number : [number] = { }
-function table.serialize(root,name,reduce,noquotes,hexify)
- local t = { }
+function table.serialize(root,name,specification)
+ local t, n = { }, 0
local function flush(s)
- t[#t+1] = s
+ n = n + 1
+ t[n] = s
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
return concat(t,"\n")
end
-function table.tohandle(handle,root,name,reduce,noquotes,hexify)
- serialize(root,name,handle,reduce,noquotes,hexify)
-end
+table.tohandle = serialize
-- sometimes tables are real use (zapfino extra pro is some 85M) in which
-- case a stepwise serialization is nice; actually, we could consider:
@@ -1154,73 +1340,63 @@ end
--
-- so this is on the todo list
-table.tofile_maxtab = 2*1024
+local maxtab = 2*1024
-function table.tofile(filename,root,name,reduce,noquotes,hexify)
+function table.tofile(filename,root,name,specification)
local f = io.open(filename,'w')
if f then
- local maxtab = table.tofile_maxtab
if maxtab > 1 then
- local t = { }
+ local t, n = { }, 0
local function flush(s)
- t[#t+1] = s
- if #t > maxtab then
+ n = n + 1
+ t[n] = s
+ if n > maxtab then
f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
- t = { }
+ t, n = { }, 0 -- we could recycle t if needed
end
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
f:write(concat(t,"\n"),"\n")
else
local function flush(s)
f:write(s,"\n")
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
end
f:close()
+ io.flush()
end
end
-local function flatten(t,f,complete) -- is this used? meybe a variant with next, ...
- for i=1,#t do
- local v = t[i]
- if type(v) == "table" then
- if complete or type(v[1]) == "table" then
- flatten(v,f,complete)
+local function flattened(t,f,depth)
+ if f == nil then
+ f = { }
+ depth = 0xFFFF
+ elseif tonumber(f) then
+ -- assume then only two arguments are given
+ depth = f
+ f = { }
+ elseif not depth then
+ depth = 0xFFFF
+ end
+ for k, v in next, t do
+ if type(k) ~= "number" then
+ if depth > 0 and type(v) == "table" then
+ flattened(v,f,depth-1)
else
- f[#f+1] = v
+ f[k] = v
end
- else
- f[#f+1] = v
end
end
-end
-
-function table.flatten(t)
- local f = { }
- flatten(t,f,true)
- return f
-end
-
-function table.unnest(t) -- bad name
- local f = { }
- flatten(t,f,false)
- return f
-end
-
-table.flatten_one_level = table.unnest
-
--- a better one:
-
-local function flattened(t,f)
- if not f then
- f = { }
- end
- for k, v in next, t do
- if type(v) == "table" then
- flattened(v,f)
+ local n = #f
+ for k=1,#t do
+ local v = t[k]
+ if depth > 0 and type(v) == "table" then
+ flattened(v,f,depth-1)
+ n = #f
else
- f[k] = v
+ n = n + 1
+ f[n] = v
end
end
return f
@@ -1228,49 +1404,27 @@ end
table.flattened = flattened
--- the next three may disappear
-
-function table.remove_value(t,value) -- todo: n
- if value then
- for i=1,#t do
- if t[i] == value then
- remove(t,i)
- -- remove all, so no: return
- end
- end
+local function unnest(t,f) -- only used in mk, for old times sake
+ if not f then -- and only relevant for token lists
+ f = { }
end
-end
-
-function table.insert_before_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i,str)
- return
- end
+ for i=1,#t do
+ local v = t[i]
+ if type(v) == "table" then
+ if type(v[1]) == "table" then
+ unnest(v,f)
+ else
+ f[#f+1] = v
end
+ else
+ f[#f+1] = v
end
- insert(t,1,str)
- elseif value then
- insert(t,1,value)
end
+ return f
end
-function table.insert_after_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,str)
- return
- end
- end
- end
- t[#t+1] = str
- elseif value then
- t[#t+1] = value
- end
+function table.unnest(t) -- bad name
+ return unnest(t)
end
local function are_equal(a,b,n,m) -- indexed
@@ -1297,7 +1451,7 @@ end
local function identical(a,b) -- assumes same structure
for ka, va in next, a do
- local vb = b[k]
+ local vb = b[ka]
if va == vb then
-- same
elseif type(va) == "table" and type(vb) == "table" then
@@ -1311,8 +1465,8 @@ local function identical(a,b) -- assumes same structure
return true
end
-table.are_equal = are_equal
table.identical = identical
+table.are_equal = are_equal
-- maybe also make a combined one
@@ -1338,89 +1492,84 @@ function table.contains(t, v)
end
function table.count(t)
- local n, e = 0, next(t)
- while e do
- n, e = n + 1, next(t,e)
+ local n = 0
+ for k, v in next, t do
+ n = n + 1
end
return n
end
-function table.swapped(t)
- local s = { }
+function table.swapped(t,s) -- hash
+ local n = { }
+ if s then
+ for k, v in next, s do
+ n[k] = v
+ end
+ end
for k, v in next, t do
- s[v] = k
+ n[v] = k
end
- return s
+ return n
end
---~ function table.are_equal(a,b)
---~ return table.serialize(a) == table.serialize(b)
---~ end
-
-function table.clone(t,p) -- t is optional or nil or table
- if not p then
- t, p = { }, t or { }
- elseif not t then
- t = { }
+function table.reversed(t)
+ if t then
+ local tt, tn = { }, #t
+ if tn > 0 then
+ local ttn = 0
+ for i=tn,1,-1 do
+ ttn = ttn + 1
+ tt[ttn] = t[i]
+ end
+ end
+ return tt
end
- setmetatable(t, { __index = function(_,key) return p[key] end }) -- why not __index = p ?
- return t
-end
-
-function table.hexed(t,seperator)
- local tt = { }
- for i=1,#t do tt[i] = format("0x%04X",t[i]) end
- return concat(tt,seperator or " ")
end
-function table.reverse_hash(h)
- local r = { }
- for k,v in next, h do
- r[v] = lower(gsub(k," ",""))
+function table.sequenced(t,sep,simple) -- hash only
+ local s, n = { }, 0
+ for k, v in sortedhash(t) do
+ if simple then
+ if v == true then
+ n = n + 1
+ s[n] = k
+ elseif v and v~= "" then
+ n = n + 1
+ s[n] = k .. "=" .. tostring(v)
+ end
+ else
+ n = n + 1
+ s[n] = k .. "=" .. tostring(v)
+ end
end
- return r
+ return concat(s, sep or " | ")
end
-function table.reverse(t)
- local tt = { }
- if #t > 0 then
- for i=#t,1,-1 do
- tt[#tt+1] = t[i]
- end
+function table.print(t,...)
+ if type(t) ~= "table" then
+ print(tostring(t))
+ else
+ table.tohandle(print,t,...)
end
- return tt
end
-function table.insert_before_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i,extra)
- return
- end
- end
- insert(t,1,extra)
+-- -- -- obsolete but we keep them for a while and might comment them later -- -- --
+
+-- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
+
+function table.sub(t,i,j)
+ return { unpack(t,i,j) }
end
-function table.insert_after_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,extra)
- return
- end
- end
- insert(t,#t+1,extra)
+-- 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)
end
+function table.has_one_entry(t)
+ return t and not next(t,next(t))
+end
end -- of closure
@@ -1435,7 +1584,10 @@ if not modules then modules = { } end modules ['l-io'] = {
license = "see context related readme files"
}
-local byte, find, gsub = string.byte, string.find, string.gsub
+local io = io
+local byte, find, gsub, format = string.byte, string.find, string.gsub, string.format
+local concat = table.concat
+local type = type
if string.find(os.getenv("PATH"),";") then
io.fileseparator, io.pathseparator = "\\", ";"
@@ -1446,9 +1598,7 @@ end
function io.loaddata(filename,textmode)
local f = io.open(filename,(textmode and 'r') or 'rb')
if f then
- -- collectgarbage("step") -- sometimes makes a big difference in mem consumption
local data = f:read('*all')
- -- garbagecollector.check(data)
f:close()
return data
else
@@ -1460,13 +1610,14 @@ function io.savedata(filename,data,joiner)
local f = io.open(filename,"wb")
if f then
if type(data) == "table" then
- f:write(table.join(data,joiner or ""))
+ f:write(concat(data,joiner or ""))
elseif type(data) == "function" then
data(f)
else
f:write(data or "")
end
f:close()
+ io.flush()
return true
else
return false
@@ -1495,12 +1646,19 @@ function io.size(filename)
end
function io.noflines(f)
- local n = 0
- for _ in f:lines() do
- n = n + 1
+ if type(f) == "string" then
+ local f = io.open(filename)
+ local n = f and io.noflines(f) or 0
+ assert(f:close())
+ return n
+ else
+ local n = 0
+ for _ in f:lines() do
+ n = n + 1
+ end
+ f:seek('set',0)
+ return n
end
- f:seek('set',0)
- return n
end
local nextchar = {
@@ -1526,8 +1684,6 @@ local nextchar = {
function io.characters(f,n)
if f then
return nextchar[n or 1], f
- else
- return nil, nil
end
end
@@ -1536,40 +1692,42 @@ local nextbyte = {
local a, b, c, d = f:read(1,1,1,1)
if d then
return byte(a), byte(b), byte(c), byte(d)
- else
- return nil, nil, nil, nil
+ end
+ end,
+ [3] = function(f)
+ local a, b, c = f:read(1,1,1)
+ if b then
+ return byte(a), byte(b), byte(c)
end
end,
[2] = function(f)
local a, b = f:read(1,1)
if b then
return byte(a), byte(b)
- else
- return nil, nil
end
end,
[1] = function (f)
local a = f:read(1)
if a then
return byte(a)
- else
- return nil
end
end,
[-2] = function (f)
local a, b = f:read(1,1)
if b then
return byte(b), byte(a)
- else
- return nil, nil
+ end
+ end,
+ [-3] = function(f)
+ local a, b, c = f:read(1,1,1)
+ if b then
+ return byte(c), byte(b), byte(a)
end
end,
[-4] = function(f)
local a, b, c, d = f:read(1,1,1,1)
if d then
return byte(d), byte(c), byte(b), byte(a)
- else
- return nil, nil, nil, nil
end
end
}
@@ -1586,12 +1744,13 @@ function io.ask(question,default,options)
while true do
io.write(question)
if options then
- io.write(string.format(" [%s]",table.concat(options,"|")))
+ io.write(format(" [%s]",concat(options,"|")))
end
if default then
- io.write(string.format(" [%s]",default))
+ io.write(format(" [%s]",default))
end
- io.write(string.format(" "))
+ io.write(format(" "))
+ io.flush()
local answer = io.read()
answer = gsub(answer,"^%s*(.*)%s*$","%1")
if answer == "" and default then
@@ -1615,6 +1774,63 @@ function io.ask(question,default,options)
end
end
+local function readnumber(f,n,m)
+ if m then
+ f:seek("set",n)
+ n = m
+ end
+ if n == 1 then
+ return byte(f:read(1))
+ elseif n == 2 then
+ local a, b = byte(f:read(2),1,2)
+ return 256 * a + b
+ elseif n == 3 then
+ local a, b, c = byte(f:read(3),1,3)
+ return 256*256 * a + 256 * b + c
+ elseif n == 4 then
+ local a, b, c, d = byte(f:read(4),1,4)
+ return 256*256*256 * a + 256*256 * b + 256 * c + d
+ elseif n == 8 then
+ local a, b = readnumber(f,4), readnumber(f,4)
+ return 256 * a + b
+ elseif n == 12 then
+ local a, b, c = readnumber(f,4), readnumber(f,4), readnumber(f,4)
+ return 256*256 * a + 256 * b + c
+ elseif n == -2 then
+ local b, a = byte(f:read(2),1,2)
+ return 256*a + b
+ elseif n == -3 then
+ local c, b, a = byte(f:read(3),1,3)
+ return 256*256 * a + 256 * b + c
+ elseif n == -4 then
+ local d, c, b, a = byte(f:read(4),1,4)
+ return 256*256*256 * a + 256*256 * b + 256*c + d
+ elseif n == -8 then
+ local h, g, f, e, d, c, b, a = byte(f:read(8),1,8)
+ return 256*256*256*256*256*256*256 * a +
+ 256*256*256*256*256*256 * b +
+ 256*256*256*256*256 * c +
+ 256*256*256*256 * d +
+ 256*256*256 * e +
+ 256*256 * f +
+ 256 * g +
+ h
+ else
+ return 0
+ end
+end
+
+io.readnumber = readnumber
+
+function io.readstring(f,n,m)
+ if m then
+ f:seek("set",n)
+ n = m
+ end
+ local str = gsub(f:read(n),"%z","")
+ return str
+end
+
end -- of closure
@@ -1628,11 +1844,15 @@ if not modules then modules = { } end modules ['l-number'] = {
license = "see context related readme files"
}
+-- this module will be replaced when we have the bit library
+
local tostring = tostring
-local format, floor, insert, match = string.format, math.floor, table.insert, string.match
+local format, floor, match, rep = string.format, math.floor, string.match, string.rep
+local concat, insert = table.concat, table.insert
local lpegmatch = lpeg.match
-number = number or { }
+number = number or { }
+local number = number
-- a,b,c,d,e,f = number.toset(100101)
@@ -1680,6 +1900,54 @@ function number.bits(n,zero)
end
+function number.bit(p)
+ return 2 ^ (p - 1) -- 1-based indexing
+end
+
+function number.hasbit(x, p) -- typical call: if hasbit(x, bit(3)) then ...
+ return x % (p + p) >= p
+end
+
+function number.setbit(x, p)
+ return hasbit(x, p) and x or x + p
+end
+
+function number.clearbit(x, p)
+ return hasbit(x, p) and x - p or x
+end
+
+
+function number.tobitstring(n,m)
+ if n == 0 then
+ if m then
+ rep("00000000",m)
+ else
+ return "00000000"
+ end
+ else
+ local t = { }
+ while n > 0 do
+ insert(t,1,n % 2 > 0 and 1 or 0)
+ n = floor(n/2)
+ end
+ local nn = 8 - #t % 8
+ if nn > 0 and nn < 8 then
+ for i=1,nn do
+ insert(t,1,0)
+ end
+ end
+ if m then
+ m = m * 8 - #t
+ if m > 0 then
+ insert(t,1,rep("0",m))
+ end
+ end
+ return concat(t)
+ end
+end
+
+
+
end -- of closure
do -- create closure to overcome 200 locals limit
@@ -1692,6 +1960,8 @@ if not modules then modules = { } end modules ['l-set'] = {
license = "see context related readme files"
}
+-- This will become obsolete when we have the bitset library embedded.
+
set = set or { }
local nums = { }
@@ -1735,10 +2005,11 @@ function set.tolist(n)
if n == 0 or not tabs[n] then
return ""
else
- local t = { }
+ local t, n = { }, 0
for k, v in next, tabs[n] do
if v then
- t[#t+1] = k
+ n = n + 1
+ t[n] = k
end
end
return concat(t," ")
@@ -1756,17 +2027,6 @@ function set.contains(n,s)
end
end
---~ local c = set.create{'aap','noot','mies'}
---~ local s = set.tonumber(c)
---~ local t = set.totable(s)
---~ print(t['aap'])
---~ local c = set.create{'zus','wim','jet'}
---~ local s = set.tonumber(c)
---~ local t = set.totable(s)
---~ print(t['aap'])
---~ print(t['jet'])
---~ print(set.contains(t,'jet'))
---~ print(set.contains(t,'aap'))
@@ -1782,32 +2042,119 @@ if not modules then modules = { } end modules ['l-os'] = {
license = "see context related readme files"
}
+-- This file deals with some operating system issues. Please don't bother me
+-- with the pros and cons of operating systems as they all have their flaws
+-- and benefits. Bashing one of them won't help solving problems and fixing
+-- bugs faster and is a waste of time and energy.
+--
+-- path separators: / or \ ... we can use / everywhere
+-- suffixes : dll so exe <none> ... no big deal
+-- quotes : we can use "" in most cases
+-- expansion : unless "" are used * might give side effects
+-- piping/threads : somewhat different for each os
+-- locations : specific user file locations and settings can change over time
+--
+-- os.type : windows | unix (new, we already guessed os.platform)
+-- os.name : windows | msdos | linux | macosx | solaris | .. | generic (new)
+-- os.platform : extended os.name with architecture
+
-- maybe build io.flush in os.execute
-local find, format, gsub = string.find, string.format, string.gsub
+local os = os
+local find, format, gsub, upper = string.find, string.format, string.gsub, string.upper
+local concat = table.concat
local random, ceil = math.random, math.ceil
+local rawget, rawset, type, getmetatable, setmetatable, tonumber = rawget, rawset, type, getmetatable, setmetatable, tonumber
+
+-- The following code permits traversing the environment table, at least
+-- in luatex. Internally all environment names are uppercase.
+
+if not os.__getenv__ then
+
+ os.__getenv__ = os.getenv
+ os.__setenv__ = os.setenv
+
+ if os.env then
+
+ local osgetenv = os.getenv
+ local ossetenv = os.setenv
+ local osenv = os.env local _ = osenv.PATH -- initialize the table
+
+ function os.setenv(k,v)
+ if v == nil then
+ v = ""
+ end
+ local K = upper(k)
+ osenv[K] = v
+ if type(v) == "table" then
+ v = concat(v,";") -- path
+ end
+ ossetenv(K,v)
+ end
+
+ function os.getenv(k)
+ local K = upper(k)
+ local v = osenv[K] or osenv[k] or osgetenv(K) or osgetenv(k)
+ if v == "" then
+ return nil
+ else
+ return v
+ end
+ end
+
+ else
+
+ local ossetenv = os.setenv
+ local osgetenv = os.getenv
+ local osenv = { }
+
+ function os.setenv(k,v)
+ if v == nil then
+ v = ""
+ end
+ local K = upper(k)
+ osenv[K] = v
+ end
-local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
+ function os.getenv(k)
+ local K = upper(k)
+ local v = osenv[K] or osgetenv(K) or osgetenv(k)
+ if v == "" then
+ return nil
+ else
+ return v
+ end
+ end
+
+ local function __index(t,k)
+ return os.getenv(k)
+ end
+ local function __newindex(t,k,v)
+ os.setenv(k,v)
+ end
+
+ os.env = { }
+
+ setmetatable(os.env, { __index = __index, __newindex = __newindex } )
+
+ end
+
+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
function os.resultof(command)
- ioflush() -- else messed up logging
local handle = io.popen(command,"r")
- if not handle then
- -- print("unknown command '".. command .. "' in os.resultof")
- return ""
- else
- return handle:read("*all") or ""
- end
+ return handle and handle:read("*all") or ""
end
---~ os.type : windows | unix (new, we already guessed os.platform)
---~ os.name : windows | msdos | linux | macosx | solaris | .. | generic (new)
---~ os.platform : extended os.name with architecture
-
if not io.fileseparator then
if find(os.getenv("PATH"),";") then
io.fileseparator, io.pathseparator, os.type = "\\", ";", os.type or "mswin"
@@ -1856,16 +2203,11 @@ function os.runtime()
return os.gettimeofday() - startuptime
end
---~ print(os.gettimeofday()-os.time())
---~ os.sleep(1.234)
---~ print (">>",os.runtime())
---~ print(os.date("%H:%M:%S",os.gettimeofday()))
---~ print(os.date("%H:%M:%S",os.time()))
-- no need for function anymore as we have more clever code and helpers now
-- this metatable trickery might as well disappear
-os.resolvers = os.resolvers or { }
+os.resolvers = os.resolvers or { } -- will become private
local resolvers = os.resolvers
@@ -1878,24 +2220,6 @@ end
setmetatable(os,osmt)
-if not os.setenv then
-
- -- we still store them but they won't be seen in
- -- child processes although we might pass them some day
- -- using command concatination
-
- local env, getenv = { }, os.getenv
-
- function os.setenv(k,v)
- env[k] = v
- end
-
- function os.getenv(k)
- return env[k] or getenv(k)
- end
-
-end
-
-- we can use HOSTTYPE on some platforms
local name, platform = os.name or "linux", os.getenv("MTX_PLATFORM") or ""
@@ -1935,7 +2259,7 @@ elseif os.type == "windows" then
elseif name == "linux" then
function os.resolvers.platform(t,k)
- -- we sometims have HOSTTYPE set so let's check that first
+ -- we sometimes have HOSTTYPE set so let's check that first
local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
if find(architecture,"x86_64") then
platform = "linux-64"
@@ -2013,10 +2337,10 @@ elseif name == "freebsd" then
elseif name == "kfreebsd" then
function os.resolvers.platform(t,k)
- -- we sometims have HOSTTYPE set so let's check that first
+ -- we sometimes have HOSTTYPE set so let's check that first
local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
if find(architecture,"x86_64") then
- platform = "kfreebsd-64"
+ platform = "kfreebsd-amd64"
else
platform = "kfreebsd-i386"
end
@@ -2091,61 +2415,86 @@ if not modules then modules = { } end modules ['l-file'] = {
-- needs a cleanup
-file = file or { }
+file = file or { }
+local file = file
-local concat = table.concat
-local find, gmatch, match, gsub, sub, char = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char
+local insert, concat = table.insert, table.concat
+local find, gmatch, match, gsub, sub, char, lower = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char, string.lower
local lpegmatch = lpeg.match
+local getcurrentdir, attributes = lfs.currentdir, lfs.attributes
-function file.removesuffix(filename)
- return (gsub(filename,"%.[%a%d]+$",""))
+local P, R, S, C, Cs, Cp, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc
+
+local function dirname(name,default)
+ return match(name,"^(.+)[/\\].-$") or (default or "")
end
-function file.addsuffix(filename, suffix)
- if not suffix or suffix == "" then
- return filename
- elseif not find(filename,"%.[%a%d]+$") then
- return filename .. "." .. suffix
- else
- return filename
- end
+local function basename(name)
+ return match(name,"^.+[/\\](.-)$") or name
end
-function file.replacesuffix(filename, suffix)
- return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+local function nameonly(name)
+ return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
end
-function file.dirname(name,default)
- return match(name,"^(.+)[/\\].-$") or (default or "")
+local function extname(name,default)
+ return match(name,"^.+%.([^/\\]-)$") or default or ""
end
-function file.basename(name)
- return match(name,"^.+[/\\](.-)$") or name
+local function splitname(name)
+ local n, s = match(name,"^(.+)%.([^/\\]-)$")
+ return n or name, s or ""
end
-function file.nameonly(name)
- return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
+file.basename = basename
+file.dirname = dirname
+file.nameonly = nameonly
+file.extname = extname
+file.suffix = extname
+
+function file.removesuffix(filename)
+ return (gsub(filename,"%.[%a%d]+$",""))
end
-function file.extname(name,default)
- return match(name,"^.+%.([^/\\]-)$") or default or ""
+function file.addsuffix(filename, suffix, criterium)
+ if not suffix or suffix == "" then
+ return filename
+ elseif criterium == true then
+ return filename .. "." .. suffix
+ elseif not criterium then
+ local n, s = splitname(filename)
+ if not s or s == "" then
+ return filename .. "." .. suffix
+ else
+ return filename
+ end
+ else
+ local n, s = splitname(filename)
+ if s and s ~= "" then
+ local t = type(criterium)
+ if t == "table" then
+ -- keep if in criterium
+ for i=1,#criterium do
+ if s == criterium[i] then
+ return filename
+ end
+ end
+ elseif t == "string" then
+ -- keep if criterium
+ if s == criterium then
+ return filename
+ end
+ end
+ end
+ return n .. "." .. suffix
+ end
end
-file.suffix = file.extname
---~ function file.join(...)
---~ local pth = concat({...},"/")
---~ pth = gsub(pth,"\\","/")
---~ local a, b = match(pth,"^(.*://)(.*)$")
---~ if a and b then
---~ return a .. gsub(b,"//+","/")
---~ end
---~ a, b = match(pth,"^(//)(.*)$")
---~ if a and b then
---~ return a .. gsub(b,"//+","/")
---~ end
---~ return (gsub(pth,"//+","/"))
---~ end
+function file.replacesuffix(filename, suffix)
+ return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+end
+
local trick_1 = char(1)
local trick_2 = "^" .. trick_1 .. "/+"
@@ -2173,60 +2522,37 @@ function file.join(...)
return (gsub(pth,"//+","/"))
end
---~ print(file.join("//","/y"))
---~ print(file.join("/","/y"))
---~ print(file.join("","/y"))
---~ print(file.join("/x/","/y"))
---~ print(file.join("x/","/y"))
---~ print(file.join("http://","/y"))
---~ print(file.join("http://a","/y"))
---~ print(file.join("http:///a","/y"))
---~ print(file.join("//nas-1","/y"))
-function file.iswritable(name)
- local a = lfs.attributes(name) or lfs.attributes(file.dirname(name,"."))
+function file.is_writable(name)
+ local a = attributes(name) or attributes(dirname(name,"."))
return a and sub(a.permissions,2,2) == "w"
end
-function file.isreadable(name)
- local a = lfs.attributes(name)
+function file.is_readable(name)
+ local a = attributes(name)
return a and sub(a.permissions,1,1) == "r"
end
-file.is_readable = file.isreadable
-file.is_writable = file.iswritable
+file.isreadable = file.is_readable -- depricated
+file.iswritable = file.is_writable -- depricated
--- todo: lpeg
-
---~ function file.split_path(str)
---~ local t = { }
---~ str = gsub(str,"\\", "/")
---~ str = gsub(str,"(%a):([;/])", "%1\001%2")
---~ for name in gmatch(str,"([^;:]+)") do
---~ if name ~= "" then
---~ t[#t+1] = gsub(name,"\001",":")
---~ end
---~ end
---~ return t
---~ end
+-- todo: lpeg \\ / .. does not save much
local checkedsplit = string.checkedsplit
-function file.split_path(str,separator)
+function file.splitpath(str,separator) -- string
str = gsub(str,"\\","/")
return checkedsplit(str,separator or io.pathseparator)
end
-function file.join_path(tab)
- return concat(tab,io.pathseparator) -- can have trailing //
+function file.joinpath(tab,separator) -- table
+ return concat(tab,separator or io.pathseparator) -- can have trailing //
end
-- we can hash them weakly
-local insert = table.insert
-
-function file.collapse_path(str,anchor)
+function file.collapsepath(str,anchor)
if anchor and not find(str,"^/") and not find(str,"^%a:") then
str = getcurrentdir() .. "/" .. str
end
@@ -2280,62 +2606,15 @@ function file.collapse_path(str,anchor)
return concat(newelements, '/')
end
end
-function file.xcollapse_path(str)
- print('collapse', str)
- if str == "" or str =="." then
- return "."
- elseif find(str,"^%.%.") then
- return str
- elseif not find(str,"%.") then
- return str
- end
- str = gsub(str,"^%./",lfs.currentdir() .. "/") -- ./xx in qualified
- str = gsub(str,"\\","/")
- local oldelements = checkedsplit(str,"/")
- local newelements = { }
- local i = #oldelements
- while i > 0 do
- local element = oldelements[i]
- if element == '.' then
- -- do nothing
- elseif element == '..' then
- local n = i -1
- while n > 0 do
- local element = oldelements[n]
- if element ~= '..' and element ~= '.' then
- oldelements[n] = '.'
- break
- else
- n = n - 1
- end
- end
- if n<1 then
- insert(newelements,1,'..')
- end
- elseif element ~= "" then
- insert(newelements,1,element)
- end
- i = i - 1
- end
- if #newelements == 0 then
- return "."
- elseif find(str,"^/") then
- return "/" .. concat(newelements,'/')
- else
- return concat(newelements, '/')
- end
-end
---~ print(file.collapse_path("/a"))
---~ print(file.collapse_path("a/./b/.."))
---~ print(file.collapse_path("a/aa/../b/bb"))
---~ print(file.collapse_path("a/../.."))
---~ print(file.collapse_path("a/.././././b/.."))
---~ print(file.collapse_path("a/./././b/.."))
---~ print(file.collapse_path("a/b/c/../.."))
-function file.robustname(str)
- return (gsub(str,"[^%a%d%/%-%.\\]+","-"))
+function file.robustname(str,strict)
+ str = gsub(str,"[^%a%d%/%-%.\\]+","-")
+ if strict then
+ return lower(gsub(str,"^%-*(.-)%-*$","%1"))
+ else
+ return str
+ end
end
file.readdata = io.loaddata
@@ -2347,100 +2626,34 @@ end
-- lpeg variants, slightly faster, not always
---~ local period = lpeg.P(".")
---~ local slashes = lpeg.S("\\/")
---~ local noperiod = 1-period
---~ local noslashes = 1-slashes
---~ local name = noperiod^1
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.C(noperiod^1) * -1
-
---~ function file.extname(name)
---~ return lpegmatch(pattern,name) or ""
---~ end
-
---~ local pattern = lpeg.Cs(((period * noperiod^1 * -1)/"" + 1)^1)
-
---~ function file.removesuffix(name)
---~ return lpegmatch(pattern,name)
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.C(noslashes^1) * -1
-
---~ function file.basename(name)
---~ return lpegmatch(pattern,name) or name
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.Cp() * noslashes^1 * -1
-
---~ function file.dirname(name)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return sub(name,1,p-2)
---~ else
---~ return ""
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
-
---~ function file.addsuffix(name, suffix)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return name
---~ else
---~ return name .. "." .. suffix
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
-
---~ function file.replacesuffix(name,suffix)
---~ local p = lpegmatch(pattern,name)
---~ if p then
---~ return sub(name,1,p-2) .. "." .. suffix
---~ else
---~ return name .. "." .. suffix
---~ end
---~ end
-
---~ local pattern = (noslashes^0 * slashes)^0 * lpeg.Cp() * ((noperiod^1 * period)^1 * lpeg.Cp() + lpeg.P(true)) * noperiod^1 * -1
-
---~ function file.nameonly(name)
---~ local a, b = lpegmatch(pattern,name)
---~ if b then
---~ return sub(name,a,b-2)
---~ elseif a then
---~ return sub(name,a)
---~ else
---~ return name
---~ end
---~ end
-
---~ local test = file.extname
---~ local test = file.basename
---~ local test = file.dirname
---~ local test = file.addsuffix
---~ local test = file.replacesuffix
---~ local test = file.nameonly
-
---~ print(1,test("./a/b/c/abd.def.xxx","!!!"))
---~ print(2,test("./../b/c/abd.def.xxx","!!!"))
---~ print(3,test("a/b/c/abd.def.xxx","!!!"))
---~ print(4,test("a/b/c/def.xxx","!!!"))
---~ print(5,test("a/b/c/def","!!!"))
---~ print(6,test("def","!!!"))
---~ print(7,test("def.xxx","!!!"))
-
---~ local tim = os.clock() for i=1,250000 do local ext = test("abd.def.xxx","!!!") end print(os.clock()-tim)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-- also rewrite previous
-local letter = lpeg.R("az","AZ") + lpeg.S("_-+")
-local separator = lpeg.P("://")
+local letter = R("az","AZ") + S("_-+")
+local separator = P("://")
+
+local qualified = P(".")^0 * P("/") + letter*P(":") + letter^1*separator + letter^1 * P("/")
+local rootbased = P("/") + letter*P(":")
-local qualified = lpeg.P(".")^0 * lpeg.P("/") + letter*lpeg.P(":") + letter^1*separator + letter^1 * lpeg.P("/")
-local rootbased = lpeg.P("/") + letter*lpeg.P(":")
+lpeg.patterns.qualified = qualified
+lpeg.patterns.rootbased = rootbased
-- ./name ../name /name c: :// name/name
@@ -2452,14 +2665,16 @@ function file.is_rootbased_path(filename)
return lpegmatch(rootbased,filename) ~= nil
end
-local slash = lpeg.S("\\/")
-local period = lpeg.P(".")
-local drive = lpeg.C(lpeg.R("az","AZ")) * lpeg.P(":")
-local path = lpeg.C(((1-slash)^0 * slash)^0)
-local suffix = period * lpeg.C(lpeg.P(1-period)^0 * lpeg.P(-1))
-local base = lpeg.C((1-suffix)^0)
+-- actually these are schemes
-local pattern = (drive + lpeg.Cc("")) * (path + lpeg.Cc("")) * (base + lpeg.Cc("")) * (suffix + lpeg.Cc(""))
+local slash = S("\\/")
+local period = P(".")
+local drive = C(R("az","AZ")) * P(":")
+local path = C(((1-slash)^0 * slash)^0)
+local suffix = period * C(P(1-period)^0 * P(-1))
+local base = C((1-suffix)^0)
+
+local pattern = (drive + Cc("")) * (path + Cc("")) * (base + Cc("")) * (suffix + Cc(""))
function file.splitname(str) -- returns drive, path, base, suffix
return lpegmatch(pattern,str)
@@ -2472,14 +2687,13 @@ end
-- test { "/aa", "/aa/bb", "/aa/bb/cc", "/aa/bb/cc.dd", "/aa/bb/cc.dd.ee" }
-- test { "aa", "aa/bb", "aa/bb/cc", "aa/bb/cc.dd", "aa/bb/cc.dd.ee" }
---~ -- todo:
---~
---~ if os.type == "windows" then
---~ local currentdir = lfs.currentdir
---~ function lfs.currentdir()
---~ return (gsub(currentdir(),"\\","/"))
---~ end
---~ end
+
+-- for myself:
+
+function file.strip(name,dir)
+ local b, a = match(name,"^(.-)" .. dir .. "(.*)$")
+ return a ~= "" and a or name
+end
end -- of closure
@@ -2495,6 +2709,7 @@ if not modules then modules = { } end modules ['l-md5'] = {
-- This also provides file checksums and checkers.
+local md5, file = md5, file
local gsub, format, byte = string.gsub, string.format, string.byte
local function convert(str,fmt)
@@ -2505,27 +2720,13 @@ 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 function remap(chr) return format("%02X",byte(chr)) end
---~ function md5.HEX(str) return (gsub(md5.sum(str),".",remap)) end
---~ end
---~ 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
---~ 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
-
-file.needs_updating_threshold = 1
-
-function file.needs_updating(oldname,newname) -- size modification access change
+
+function file.needs_updating(oldname,newname,threshold) -- size modification access change
local oldtime = lfs.attributes(oldname, modification)
local newtime = lfs.attributes(newname, modification)
if newtime >= oldtime then
return false
- elseif oldtime - newtime < file.needs_updating_threshold then
+ elseif oldtime - newtime < (threshold or 1) then
return false
else
return true
@@ -2572,86 +2773,171 @@ if not modules then modules = { } end modules ['l-url'] = {
license = "see context related readme files"
}
-local char, gmatch, gsub = string.char, string.gmatch, string.gsub
+local char, gmatch, gsub, format, byte, find = string.char, string.gmatch, string.gsub, string.format, string.byte, string.find
+local concat = table.concat
local tonumber, type = tonumber, type
-local lpegmatch = lpeg.match
+local P, C, R, S, Cs, Cc, Ct = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cs, lpeg.Cc, lpeg.Ct
+local lpegmatch, lpegpatterns, replacer = lpeg.match, lpeg.patterns, lpeg.replacer
--- from the spec (on the web):
+-- from wikipedia:
--
--- foo://example.com:8042/over/there?name=ferret#nose
--- \_/ \______________/\_________/ \_________/ \__/
--- | | | | |
--- scheme authority path query fragment
--- | _____________________|__
--- / \ / \
--- urn:example:animal:ferret:nose
+-- foo://username:password@example.com:8042/over/there/index.dtb?type=animal;name=narwhal#nose
+-- \_/ \_______________/ \_________/ \__/ \___/ \_/ \______________________/ \__/
+-- | | | | | | | |
+-- | userinfo hostname port | | query fragment
+-- | \________________________________/\_____________|____|/
+-- scheme | | | |
+-- | authority path | |
+-- | | |
+-- | path interpretable as filename
+-- | ___________|____________ |
+-- / \ / \ |
+-- urn:example:animal:ferret:nose interpretable as extension
+
+url = url or { }
+local url = url
+
+local tochar = function(s) return char(tonumber(s,16)) end
+
+local colon = P(":")
+local qmark = P("?")
+local hash = P("#")
+local slash = P("/")
+local percent = P("%")
+local endofstring = P(-1)
+
+local hexdigit = R("09","AF","af")
+local plus = P("+")
+local nothing = Cc("")
+local escaped = (plus / " ") + (percent * C(hexdigit * hexdigit) / tochar)
-url = url or { }
+-- we assume schemes with more than 1 character (in order to avoid problems with windows disks)
-local function tochar(s)
- return char(tonumber(s,16))
-end
+local scheme = Cs((escaped+(1-colon-slash-qmark-hash))^2) * colon + nothing
+local authority = slash * slash * Cs((escaped+(1- slash-qmark-hash))^0) + nothing
+local path = slash * Cs((escaped+(1- qmark-hash))^0) + nothing
+local query = qmark * Cs((escaped+(1- hash))^0) + nothing
+local fragment = hash * Cs((escaped+(1- endofstring))^0) + nothing
-local colon, qmark, hash, slash, percent, endofstring = lpeg.P(":"), lpeg.P("?"), lpeg.P("#"), lpeg.P("/"), lpeg.P("%"), lpeg.P(-1)
+local validurl = scheme * authority * path * query * fragment
+local parser = Ct(validurl)
-local hexdigit = lpeg.R("09","AF","af")
-local plus = lpeg.P("+")
-local escaped = (plus / " ") + (percent * lpeg.C(hexdigit * hexdigit) / tochar)
+lpegpatterns.url = validurl
+lpegpatterns.urlsplitter = parser
--- we assume schemes with more than 1 character (in order to avoid problems with windows disks)
+local escapes = { } ; for i=0,255 do escapes[i] = format("%%%02X",i) end
-local scheme = lpeg.Cs((escaped+(1-colon-slash-qmark-hash))^2) * colon + lpeg.Cc("")
-local authority = slash * slash * lpeg.Cs((escaped+(1- slash-qmark-hash))^0) + lpeg.Cc("")
-local path = slash * lpeg.Cs((escaped+(1- qmark-hash))^0) + lpeg.Cc("")
-local query = qmark * lpeg.Cs((escaped+(1- hash))^0) + lpeg.Cc("")
-local fragment = hash * lpeg.Cs((escaped+(1- endofstring))^0) + lpeg.Cc("")
+local escaper = Cs((R("09","AZ","az") + S("-./_") + P(1) / escapes)^0)
-local parser = lpeg.Ct(scheme * authority * path * query * fragment)
+lpegpatterns.urlescaper = escaper
-- todo: reconsider Ct as we can as well have five return values (saves a table)
-- so we can have two parsers, one with and one without
-function url.split(str)
+local function split(str)
return (type(str) == "string" and lpegmatch(parser,str)) or str
end
+local function hasscheme(str)
+ local scheme = lpegmatch(scheme,str) -- at least one character
+ return scheme and scheme ~= ""
+end
+
-- todo: cache them
-function url.hashed(str)
- local s = url.split(str)
+local rootletter = R("az","AZ")
+ + S("_-+")
+local separator = P("://")
+local qualified = P(".")^0 * P("/")
+ + rootletter * P(":")
+ + rootletter^1 * separator
+ + rootletter^1 * P("/")
+local rootbased = P("/")
+ + rootletter * P(":")
+
+local barswapper = replacer("|",":")
+local backslashswapper = replacer("\\","/")
+
+local function hashed(str) -- not yet ok (/test?test)
+ local s = split(str)
local somescheme = s[1] ~= ""
- return {
- scheme = (somescheme and s[1]) or "file",
- authority = s[2],
- path = s[3],
- query = s[4],
- fragment = s[5],
- original = str,
- noscheme = not somescheme,
- }
+ local somequery = s[4] ~= ""
+ if not somescheme and not somequery then
+ s = {
+ scheme = "file",
+ authority = "",
+ path = str,
+ query = "",
+ fragment = "",
+ original = str,
+ 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
+ else
+ filename = authority .. "/" .. path
+ end
+ s = {
+ scheme = s[1],
+ authority = authority,
+ path = path,
+ query = s[4],
+ fragment = s[5],
+ original = str,
+ noscheme = false,
+ filename = filename,
+ }
+ end
+ return s
end
-function url.hasscheme(str)
- return url.split(str)[1] ~= ""
-end
+-- Here we assume:
+--
+-- files: /// = relative
+-- files: //// = absolute (!)
+
+
+
+url.split = split
+url.hasscheme = hasscheme
+url.hashed = hashed
-function url.addscheme(str,scheme)
- return (url.hasscheme(str) and str) or ((scheme or "file:///") .. str)
+function url.addscheme(str,scheme) -- no authority
+ if hasscheme(str) then
+ return str
+ elseif not scheme then
+ return "file:///" .. str
+ else
+ return scheme .. ":///" .. str
+ end
end
-function url.construct(hash)
- local fullurl = hash.sheme .. "://".. hash.authority .. hash.path
- if hash.query then
- fullurl = fullurl .. "?".. hash.query
+function url.construct(hash) -- dodo: we need to escape !
+ local fullurl, f = { }, 0
+ local scheme, authority, path, query, fragment = hash.scheme, hash.authority, hash.path, hash.query, hash.fragment
+ if scheme and scheme ~= "" then
+ f = f + 1 ; fullurl[f] = scheme .. "://"
+ end
+ if authority and authority ~= "" then
+ f = f + 1 ; fullurl[f] = authority
end
- if hash.fragment then
- fullurl = fullurl .. "?".. hash.fragment
+ if path and path ~= "" then
+ f = f + 1 ; fullurl[f] = "/" .. path
end
- return fullurl
+ if query and query ~= "" then
+ f = f + 1 ; fullurl[f] = "?".. query
+ end
+ if fragment and fragment ~= "" then
+ f = f + 1 ; fullurl[f] = "#".. fragment
+ end
+ return lpegmatch(escaper,concat(fullurl))
end
function url.filename(filename)
- local t = url.hashed(filename)
+ local t = hashed(filename)
return (t.scheme == "file" and (gsub(t.path,"^/([a-zA-Z])([:|])/)","%1:"))) or filename
end
@@ -2667,37 +2953,13 @@ function url.query(str)
end
end
---~ print(url.filename("file:///c:/oeps.txt"))
---~ print(url.filename("c:/oeps.txt"))
---~ print(url.filename("file:///oeps.txt"))
---~ print(url.filename("file:///etc/test.txt"))
---~ print(url.filename("/oeps.txt"))
-
---~ from the spec on the web (sort of):
---~
---~ function test(str)
---~ print(table.serialize(url.hashed(str)))
---~ end
---~
---~ test("%56pass%20words")
---~ test("file:///c:/oeps.txt")
---~ test("file:///c|/oeps.txt")
---~ test("file:///etc/oeps.txt")
---~ test("file://./etc/oeps.txt")
---~ test("file:////etc/oeps.txt")
---~ test("ftp://ftp.is.co.za/rfc/rfc1808.txt")
---~ test("http://www.ietf.org/rfc/rfc2396.txt")
---~ test("ldap://[2001:db8::7]/c=GB?objectClass?one#what")
---~ test("mailto:John.Doe@example.com")
---~ test("news:comp.infosystems.www.servers.unix")
---~ test("tel:+1-816-555-1212")
---~ test("telnet://192.0.2.16:80/")
---~ test("urn:oasis:names:specification:docbook:dtd:xml:4.1.2")
---~ test("/etc/passwords")
---~ test("http://www.pragma-ade.com/spaced%20name")
-
---~ test("zip:///oeps/oeps.zip#bla/bla.tex")
---~ test("zip:///oeps/oeps.zip?bla/bla.tex")
+
+
+
+
+
+
+
end -- of closure
@@ -2712,35 +2974,53 @@ if not modules then modules = { } end modules ['l-dir'] = {
license = "see context related readme files"
}
--- dir.expand_name will be merged with cleanpath and collapsepath
+-- dir.expandname will be merged with cleanpath and collapsepath
local type = type
local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
+local concat, insert, remove = table.concat, table.insert, table.remove
local lpegmatch = lpeg.match
+local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
+
dir = dir or { }
+local dir = dir
+local lfs = lfs
+
+local attributes = lfs.attributes
+local walkdir = lfs.dir
+local isdir = lfs.isdir
+local isfile = lfs.isfile
+local mkdir = lfs.mkdir
+local chdir = lfs.chdir
+local currentdir = lfs.currentdir
-- handy
function dir.current()
- return (gsub(lfs.currentdir(),"\\","/"))
+ return (gsub(currentdir(),"\\","/"))
end
--- optimizing for no string.find (*) does not save time
+-- optimizing for no find (*) does not save time
-local attributes = lfs.attributes
-local walkdir = lfs.dir
-local function glob_pattern(path,patt,recurse,action)
- local ok, scanner
+local lfsisdir = isdir
+
+local function isdir(path)
+ path = gsub(path,"[/\\]+$","")
+ return lfsisdir(path)
+end
+
+lfs.isdir = isdir
+
+local function globpattern(path,patt,recurse,action)
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
+ path = path .. "."
+ elseif not find(path,"/$") then
+ path = path .. '/'
end
- if ok and type(scanner) == "function" then
- if not find(path,"/$") then path = path .. '/' end
- for name in scanner do
+ 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
@@ -2748,15 +3028,15 @@ local function glob_pattern(path,patt,recurse,action)
action(full)
end
elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
- glob_pattern(full,patt,recurse,action)
+ globpattern(full,patt,recurse,action)
end
end
end
end
-dir.glob_pattern = glob_pattern
+dir.globpattern = globpattern
-local function collect_pattern(path,patt,recurse,result)
+local function collectpattern(path,patt,recurse,result)
local ok, scanner
result = result or { }
if path == "/" then
@@ -2775,7 +3055,7 @@ local function collect_pattern(path,patt,recurse,result)
result[name] = attr
end
elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
- attr.list = collect_pattern(full,patt,recurse)
+ attr.list = collectpattern(full,patt,recurse)
result[name] = attr
end
end
@@ -2783,9 +3063,7 @@ local function collect_pattern(path,patt,recurse,result)
return result
end
-dir.collect_pattern = collect_pattern
-
-local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
+dir.collectpattern = collectpattern
local pattern = Ct {
[1] = (C(P(".") + P("/")^1) + C(R("az","AZ") * P(":") * P("/")^0) + Cc("./")) * V(2) * V(3),
@@ -2809,16 +3087,16 @@ local function glob(str,t)
for s=1,#str do
glob(str[s],t)
end
- elseif lfs.isfile(str) then
+ elseif isfile(str) then
t(str)
else
- local split = lpegmatch(pattern,str)
+ 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 recurse = find(base,"%*%*")
local start = root .. path
local result = lpegmatch(filter,start .. base)
- glob_pattern(start,result,recurse,t)
+ globpattern(start,result,recurse,t)
end
end
else
@@ -2828,12 +3106,15 @@ local function glob(str,t)
glob(str[s],t)
end
return t
- elseif lfs.isfile(str) then
- local t = t or { }
- t[#t+1] = str
- return t
+ elseif isfile(str) then
+ if t then
+ t[#t+1] = str
+ return t
+ else
+ return { str }
+ end
else
- local split = lpegmatch(pattern,str)
+ 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
@@ -2841,7 +3122,7 @@ local function glob(str,t)
local recurse = find(base,"%*%*")
local start = root .. path
local result = lpegmatch(filter,start .. base)
- glob_pattern(start,result,recurse,action)
+ globpattern(start,result,recurse,action)
return t
else
return { }
@@ -2852,18 +3133,14 @@ 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 function globfiles(path,recurse,func,files) -- func == pattern or function
if type(func) == "string" then
- local s = func -- alas, we need this indirect way
+ local s = func
func = function(name) return find(name,s) end
end
files = files or { }
+ local noffiles = #files
for name in walkdir(path) do
if find(name,"^%.") then
--- skip
@@ -2874,12 +3151,9 @@ local function globfiles(path,recurse,func,files) -- func == pattern or function
globfiles(path .. "/" .. name,recurse,func,files)
end
elseif mode == "file" then
- if func then
- if func(name) then
- files[#files+1] = path .. "/" .. name
- end
- else
- files[#files+1] = path .. "/" .. name
+ if not func or func(name) then
+ noffiles = noffiles + 1
+ files[noffiles] = path .. "/" .. name
end
end
end
@@ -2897,17 +3171,15 @@ dir.globfiles = globfiles
-- print(dir.ls("*.tex"))
function dir.ls(pattern)
- return table.concat(glob(pattern),"\n")
+ return concat(glob(pattern),"\n")
end
---~ mkdirs("temp")
---~ mkdirs("a/b/c")
---~ mkdirs(".","/a/b/c")
---~ mkdirs("a","b","c")
local make_indeed = true -- false
-if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
+local onwindows = os.type == "windows" or find(os.getenv("PATH"),";")
+
+if onwindows then
function dir.mkdirs(...)
local str, pth, t = "", "", { ... }
@@ -2956,64 +3228,21 @@ if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
else
pth = pth .. "/" .. s
end
- if make_indeed and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not isdir(pth) then
+ mkdir(pth)
end
end
- return pth, (lfs.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/"))
-
- function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
- local first, nothing, last = match(str,"^(//)(//*)(.*)$")
- if first then
- first = dir.current() .. "/"
- 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 = lfs.currentdir()
- if lfs.chdir(first) then
- first = dir.current()
- end
- lfs.chdir(d)
- 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 == "" then
- return first
- else
- return first .. "/" .. last
- end
+ return pth, (isdir(pth) == true)
end
+
else
function dir.mkdirs(...)
local str, pth, t = "", "", { ... }
for i=1,#t do
local s = t[i]
- if s ~= "" then
+ if s and s ~= "" then -- we catch nil and false
if str ~= "" then
str = str .. "/" .. s
else
@@ -3031,42 +3260,92 @@ else
else
pth = pth .. "/" .. s
end
- if make_indeed and not first and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not first and not isdir(pth) then
+ mkdir(pth)
end
end
else
pth = "."
for s in gmatch(str,"[^/]+") do
pth = pth .. "/" .. s
- if make_indeed and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not isdir(pth) then
+ mkdir(pth)
+ end
+ end
+ end
+ return pth, (isdir(pth) == true)
+ end
+
+
+end
+
+dir.makedirs = dir.mkdirs
+
+-- we can only define it here as it uses dir.current
+
+if onwindows then
+
+ function dir.expandname(str) -- will be merged with cleanpath and collapsepath
+ local first, nothing, last = match(str,"^(//)(//*)(.*)$")
+ if first then
+ first = dir.current() .. "/"
+ 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()
end
+ chdir(d)
end
end
- return pth, (lfs.isdir(pth) == true)
+ 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
---~ 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/"))
+else
- function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
+ function dir.expandname(str) -- will be merged with cleanpath and collapsepath
if not find(str,"^/") then
- str = lfs.currentdir() .. "/" .. str
+ str = currentdir() .. "/" .. str
end
str = gsub(str,"//","/")
str = gsub(str,"/%./","/")
+ str = gsub(str,"(.)/%.$","%1")
return str
end
end
-dir.makedirs = dir.mkdirs
+file.expandname = dir.expandname -- for convenience
+
+local stack = { }
+
+function dir.push(newdir)
+ insert(stack,lfs.currentdir())
+end
+
+function dir.pop()
+ local d = remove(stack)
+ if d then
+ lfs.chdir(d)
+ end
+ return d
+end
end -- of closure
@@ -3081,12 +3360,17 @@ if not modules then modules = { } end modules ['l-boolean'] = {
license = "see context related readme files"
}
+local type, tonumber = type, tonumber
+
boolean = boolean or { }
+local boolean = boolean
-local type, tonumber = type, tonumber
+-- function boolean.tonumber(b)
+-- return b and 1 or 0 -- test and test and return or return
+-- end
function boolean.tonumber(b)
- if b then return 1 else return 0 end
+ if b then return 1 else return 0 end -- test and return or return
end
function toboolean(str,tolerant)
@@ -3110,7 +3394,9 @@ function toboolean(str,tolerant)
end
end
-function string.is_boolean(str)
+string.toboolean = toboolean
+
+function string.is_boolean(str,default)
if type(str) == "string" then
if str == "true" or str == "yes" or str == "on" or str == "t" then
return true
@@ -3118,18 +3404,301 @@ function string.is_boolean(str)
return false
end
end
- return nil
+ return default
end
-function boolean.alwaystrue()
- return true
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['l-unicode'] = {
+ 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"
+}
+
+if not unicode then
+
+ unicode = { utf8 = { } }
+
+ local floor, char = math.floor, string.char
+
+ function unicode.utf8.utfchar(n)
+ if n < 0x80 then
+ return char(n)
+ elseif n < 0x800 then
+ return char(
+ 0xC0 + floor(n/0x40),
+ 0x80 + (n % 0x40)
+ )
+ elseif n < 0x10000 then
+ return char(
+ 0xE0 + floor(n/0x1000),
+ 0x80 + (floor(n/0x40) % 0x40),
+ 0x80 + (n % 0x40)
+ )
+ elseif n < 0x40000 then
+ return char(
+ 0xF0 + floor(n/0x40000),
+ 0x80 + floor(n/0x1000),
+ 0x80 + (floor(n/0x40) % 0x40),
+ 0x80 + (n % 0x40)
+ )
+ else
+ -- return char(
+ -- 0xF1 + floor(n/0x1000000),
+ -- 0x80 + floor(n/0x40000),
+ -- 0x80 + floor(n/0x1000),
+ -- 0x80 + (floor(n/0x40) % 0x40),
+ -- 0x80 + (n % 0x40)
+ -- )
+ return "?"
+ end
+ end
+
end
-function boolean.falsetrue()
- return false
+local unicode = unicode
+
+utf = utf or unicode.utf8
+
+local concat = table.concat
+local utfchar, utfbyte, utfgsub = utf.char, utf.byte, utf.gsub
+local char, byte, find, bytepairs, utfvalues, format = string.char, string.byte, string.find, string.bytepairs, string.utfvalues, string.format
+local type = type
+
+local utfsplitlines = string.utfsplitlines
+
+-- 0 EF BB BF UTF-8
+-- 1 FF FE UTF-16-little-endian
+-- 2 FE FF UTF-16-big-endian
+-- 3 FF FE 00 00 UTF-32-little-endian
+-- 4 00 00 FE FF UTF-32-big-endian
+
+unicode.utfname = {
+ [0] = 'utf-8',
+ [1] = 'utf-16-le',
+ [2] = 'utf-16-be',
+ [3] = 'utf-32-le',
+ [4] = 'utf-32-be'
+}
+
+-- \000 fails in <= 5.0 but is valid in >=5.1 where %z is depricated
+
+function unicode.utftype(f)
+ local str = f:read(4)
+ if not str then
+ f:seek('set')
+ return 0
+ -- elseif find(str,"^%z%z\254\255") then -- depricated
+ -- elseif find(str,"^\000\000\254\255") then -- not permitted and bugged
+ elseif find(str,"\000\000\254\255",1,true) then -- seems to work okay (TH)
+ return 4
+ -- elseif find(str,"^\255\254%z%z") then -- depricated
+ -- elseif find(str,"^\255\254\000\000") then -- not permitted and bugged
+ elseif find(str,"\255\254\000\000",1,true) then -- seems to work okay (TH)
+ return 3
+ elseif find(str,"^\254\255") then
+ f:seek('set',2)
+ return 2
+ elseif find(str,"^\255\254") then
+ f:seek('set',2)
+ return 1
+ elseif find(str,"^\239\187\191") then
+ f:seek('set',3)
+ return 0
+ else
+ f:seek('set')
+ return 0
+ end
+end
+
+
+
+local function utf16_to_utf8_be(t)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ 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
+ 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
+end
+
+local function utf16_to_utf8_le(t)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ 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
+ 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
+end
+
+local function utf32_to_utf8_be(str)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ end
+ local result = { } -- we reuse result
+ for i=1,#t do
+ local r, more = 0, -1
+ for a,b in bytepairs(str) 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 result
+end
+
+local function utf32_to_utf8_le(str)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ end
+ local result = { } -- we reuse result
+ for i=1,#t do
+ local r, more = 0, -1
+ for a,b in bytepairs(str) 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 result
+end
+
+unicode.utf32_to_utf8_be = utf32_to_utf8_be
+unicode.utf32_to_utf8_le = utf32_to_utf8_le
+unicode.utf16_to_utf8_be = utf16_to_utf8_be
+unicode.utf16_to_utf8_le = utf16_to_utf8_le
+
+function unicode.utf8_to_utf8(t)
+ return type(t) == "string" and utfsplitlines(t) or t
+end
+
+function unicode.utf16_to_utf8(t,endian)
+ return endian and utf16_to_utf8_be(t) or utf16_to_utf8_le(t) or t
+end
+
+function unicode.utf32_to_utf8(t,endian)
+ return endian and utf32_to_utf8_be(t) or utf32_to_utf8_le(t) or t
+end
+
+local function little(c)
+ local b = byte(c)
+ if b < 0x10000 then
+ return char(b%256,b/256)
+ else
+ b = b - 0x10000
+ local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00
+ return char(b1%256,b1/256,b2%256,b2/256)
+ end
+end
+
+local function big(c)
+ local b = byte(c)
+ if b < 0x10000 then
+ return char(b/256,b%256)
+ else
+ b = b - 0x10000
+ local b1, b2 = b/1024 + 0xD800, b%1024 + 0xDC00
+ return char(b1/256,b1%256,b2/256,b2%256)
+ end
+end
+
+function unicode.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
+
+function unicode.utfcodes(str)
+ local t, n = { }, 0
+ for u in utfvalues(str) do
+ n = n + 1
+ t[n] = format("0x%04X",u)
+ end
+ return concat(t,separator or " ")
+end
+
+function unicode.ustring(s)
+ return format("U+%05X",type(s) == "number" and s or utfbyte(s))
+end
+
+function unicode.xstring(s)
+ return format("0x%05X",type(s) == "number" and s or utfbyte(s))
+end
+
+
+local lpegmatch = lpeg.match
+local utftype = lpeg.patterns.utftype
+
+function unicode.filetype(data)
+ return data and lpegmatch(utftype,data) or "unknown"
end
+
+
end -- of closure
do -- create closure to overcome 200 locals limit
@@ -3145,35 +3714,289 @@ 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.round then
- function math.round(x)
- return floor(x + 0.5)
- end
+ function math.round(x) return floor(x + 0.5) end
end
if not math.div then
- function math.div(n,m)
- return floor(n/m)
- end
+ function math.div(n,m) return floor(n/m) end
end
if not math.mod then
- function math.mod(n,m)
- return n % m
- end
+ function math.mod(n,m) return n % m end
end
local pipi = 2*math.pi/360
-function math.sind(d)
- return sin(d*pipi)
+if not math.sind then
+ function math.sind(d) return sin(d*pipi) end
+ function math.cosd(d) return cos(d*pipi) end
+ function math.tand(d) return tan(d*pipi) end
end
-function math.cosd(d)
- return cos(d*pipi)
+if not math.odd then
+ function math.odd (n) return n % 2 == 0 end
+ function math.even(n) return n % 2 ~= 0 end
end
-function math.tand(d)
- return tan(d*pipi)
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-tab'] = {
+ 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"
+}
+
+utilities = utilities or {}
+utilities.tables = utilities.tables or { }
+local tables = utilities.tables
+
+local format, gmatch = string.format, string.gmatch
+local concat, insert, remove = table.concat, table.insert, table.remove
+local setmetatable, getmetatable, tonumber, tostring = setmetatable, getmetatable, tonumber, tostring
+
+function tables.definetable(target) -- defines undefined tables
+ local composed, t, n = nil, { }, 0
+ for name in gmatch(target,"([^%.]+)") do
+ n = n + 1
+ if composed then
+ composed = composed .. "." .. name
+ else
+ composed = name
+ end
+ t[n] = format("%s = %s or { }",composed,composed)
+ end
+ return concat(t,"\n")
+end
+
+function tables.accesstable(target)
+ local t = _G
+ for name in gmatch(target,"([^%.]+)") do
+ t = t[name]
+ end
+ return t
+end
+
+function tables.removevalue(t,value) -- todo: n
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ remove(t,i)
+ -- remove all, so no: return
+ end
+ end
+ end
+end
+
+function tables.insertbeforevalue(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i,extra)
+ return
+ end
+ end
+ insert(t,1,extra)
+end
+
+function tables.insertaftervalue(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i+1,extra)
+ return
+ end
+ end
+ insert(t,#t+1,extra)
+end
+
+-- experimental
+
+local function toxml(t,d,result)
+ for k, v in table.sortedpairs(t) do
+ if type(v) == "table" then
+ result[#result+1] = format("%s<%s>",d,k)
+ toxml(v,d.." ",result)
+ result[#result+1] = format("%s</%s>",d,k)
+ elseif tonumber(k) then
+ result[#result+1] = format("%s<entry n='%s'>%s</entry>",d,k,v,k)
+ else
+ result[#result+1] = format("%s<%s>%s</%s>",d,k,tostring(v),k)
+ end
+ end
+end
+
+function table.toxml(t,name,nobanner)
+ local noroot = name == false
+ local result = (nobanner or noroot) and { } or { "<?xml version='1.0' standalone='yes' ?>" }
+ if noroot then
+ toxml( t, "", result)
+ else
+ toxml( { [name or "root"] = t }, "", result)
+ end
+ return concat(result,"\n")
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-sto'] = {
+ 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 setmetatable, getmetatable = setmetatable, getmetatable
+
+utilities = utilities or { }
+utilities.storage = utilities.storage or { }
+local storage = utilities.storage
+
+function storage.mark(t)
+ if not t then
+ texio.write_nl("fatal error: storage '%s' cannot be marked",t)
+ os.exit()
+ end
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m.__storage__ = true
+ return t
+end
+
+function storage.allocate(t)
+ t = t or { }
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m.__storage__ = true
+ return t
+end
+
+function storage.marked(t)
+ local m = getmetatable(t)
+ return m and m.__storage__
+end
+
+function storage.checked(t)
+ if not t then
+ texio.write_nl("fatal error: storage '%s' has not been allocated",t)
+ os.exit()
+ end
+ return t
+end
+
+
+function storage.setinitializer(data,initialize)
+ local m = getmetatable(data) or { }
+ m.__index = function(data,k)
+ m.__index = nil -- so that we can access the entries during initializing
+ initialize()
+ return data[k]
+ end
+ setmetatable(data, m)
+end
+
+local keyisvalue = { __index = function(t,k)
+ t[k] = k
+ return k
+end }
+
+function storage.sparse(t)
+ t = t or { }
+ setmetatable(t,keyisvalue)
+ return t
+end
+
+-- table namespace ?
+
+local function f_empty () return "" end -- t,k
+local function f_self (t,k) t[k] = k return k end
+local function f_ignore() end -- t,k,v
+
+local t_empty = { __index = empty }
+local t_self = { __index = self }
+local t_ignore = { __newindex = ignore }
+
+function table.setmetatableindex(t,f)
+ local m = getmetatable(t)
+ if m then
+ if f == "empty" then
+ m.__index = f_empty
+ elseif f == "key" then
+ m.__index = f_self
+ else
+ m.__index = f
+ end
+ else
+ if f == "empty" then
+ setmetatable(t, t_empty)
+ elseif f == "key" then
+ setmetatable(t, t_self)
+ else
+ setmetatable(t,{ __index = f })
+ end
+ end
+end
+
+function table.setmetatablenewindex(t,f)
+ local m = getmetatable(t)
+ if m then
+ if f == "ignore" then
+ m.__newindex = f_ignore
+ else
+ m.__newindex = f
+ end
+ else
+ if f == "ignore" then
+ setmetatable(t, t_ignore)
+ else
+ setmetatable(t,{ __newindex = f })
+ end
+ end
+end
+
+function table.setmetatablecall(t,f)
+ local m = getmetatable(t)
+ if m then
+ m.__call = f
+ else
+ setmetatable(t,{ __call = f })
+ end
+end
+
+function table.setmetatablekey(t,key,value)
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m[key] = value
+end
+
+function table.getmetatablekey(t,key,value)
+ local m = getmetatable(t)
+ return m and m[key]
end
@@ -3181,7 +4004,7 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['l-utils'] = {
+if not modules then modules = { } end modules ['util-mrg'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -3191,89 +4014,85 @@ if not modules then modules = { } end modules ['l-utils'] = {
-- hm, quite unreadable
-local gsub = string.gsub
+local gsub, format = string.gsub, string.format
local concat = table.concat
local type, next = type, next
-if not utils then utils = { } end
-if not utils.merger then utils.merger = { } end
-if not utils.lua then utils.lua = { } end
+utilities = utilities or {}
+utilities.merger = utilities.merger or { } -- maybe mergers
+utilities.report = logs and logs.reporter("system") or print
+
+local merger = utilities.merger
+
+merger.strip_comment = true
+
+local m_begin_merge = "begin library merge"
+local m_end_merge = "end library merge"
+local m_begin_closure = "do -- create closure to overcome 200 locals limit"
+local m_end_closure = "end -- of closure"
-utils.merger.m_begin = "begin library merge"
-utils.merger.m_end = "end library merge"
-utils.merger.pattern =
+local m_pattern =
"%c+" ..
- "%-%-%s+" .. utils.merger.m_begin ..
+ "%-%-%s+" .. m_begin_merge ..
"%c+(.-)%c+" ..
- "%-%-%s+" .. utils.merger.m_end ..
+ "%-%-%s+" .. m_end_merge ..
"%c+"
-function utils.merger._self_fake_()
- return
- "-- " .. "created merged file" .. "\n\n" ..
- "-- " .. utils.merger.m_begin .. "\n\n" ..
- "-- " .. utils.merger.m_end .. "\n\n"
-end
+local m_format =
+ "\n\n-- " .. m_begin_merge ..
+ "\n%s\n" ..
+ "-- " .. m_end_merge .. "\n\n"
-function utils.report(...)
- print(...)
+local m_faked =
+ "-- " .. "created merged file" .. "\n\n" ..
+ "-- " .. m_begin_merge .. "\n\n" ..
+ "-- " .. m_end_merge .. "\n\n"
+
+local function self_fake()
+ return m_faked
end
-utils.merger.strip_comment = true
+local function self_nothing()
+ return ""
+end
-function utils.merger._self_load_(name)
- local f, data = io.open(name), ""
- if f then
- utils.report("reading merge from %s",name)
- data = f:read("*all")
- f:close()
+local function self_load(name)
+ local data = io.loaddata(name) or ""
+ if data == "" then
+ utilities.report("merge: unknown file %s",name)
else
- utils.report("unknown file to merge %s",name)
- end
- if data and utils.merger.strip_comment then
- -- saves some 20K
- data = gsub(data,"%-%-~[^\n\r]*[\r\n]", "")
+ utilities.report("merge: inserting %s",name)
end
return data or ""
end
-function utils.merger._self_save_(name, data)
+local function self_save(name, data)
if data ~= "" then
- local f = io.open(name,'w')
- if f then
- utils.report("saving merge from %s",name)
- f:write(data)
- f:close()
+ if merger.strip_comment then
+ -- saves some 20K
+ local n = #data
+ data = gsub(data,"%-%-~[^\n\r]*[\r\n]","")
+ utilities.report("merge: %s bytes of comment stripped, %s bytes of code left",n-#data,#data)
end
+ io.savedata(name,data)
+ utilities.report("merge: saving %s",name)
end
end
-function utils.merger._self_swap_(data,code)
- if data ~= "" then
- return (gsub(data,utils.merger.pattern, function(s)
- return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n"
- end, 1))
- else
- return ""
- end
+local function self_swap(data,code)
+ return data ~= "" and (gsub(data,m_pattern, function() return format(m_format,code) end, 1)) or ""
end
---~ stripper:
---~
---~ data = gsub(data,"%-%-~[^\n]*\n","")
---~ data = gsub(data,"\n\n+","\n")
-
-function utils.merger._self_libs_(libs,list)
- local result, f, frozen = { }, nil, false
+local function self_libs(libs,list)
+ local result, f, frozen, foundpath = { }, nil, false, nil
result[#result+1] = "\n"
if type(libs) == 'string' then libs = { libs } end
if type(list) == 'string' then list = { list } end
- local foundpath = nil
for i=1,#libs do
local lib = libs[i]
for j=1,#list do
local pth = gsub(list[j],"\\","/") -- file.clean_path
- utils.report("checking library path %s",pth)
+ utilities.report("merge: checking library path %s",pth)
local name = pth .. "/" .. lib
if lfs.isfile(name) then
foundpath = pth
@@ -3282,76 +4101,75 @@ function utils.merger._self_libs_(libs,list)
if foundpath then break end
end
if foundpath then
- utils.report("using library path %s",foundpath)
+ utilities.report("merge: using library path %s",foundpath)
local right, wrong = { }, { }
for i=1,#libs do
local lib = libs[i]
local fullname = foundpath .. "/" .. lib
if lfs.isfile(fullname) then
- -- right[#right+1] = lib
- utils.report("merging library %s",fullname)
- result[#result+1] = "do -- create closure to overcome 200 locals limit"
+ utilities.report("merge: using library %s",fullname)
+ right[#right+1] = lib
+ result[#result+1] = m_begin_closure
result[#result+1] = io.loaddata(fullname,true)
- result[#result+1] = "end -- of closure"
+ result[#result+1] = m_end_closure
else
- -- wrong[#wrong+1] = lib
- utils.report("no library %s",fullname)
+ utilities.report("merge: skipping library %s",fullname)
+ wrong[#wrong+1] = lib
end
end
if #right > 0 then
- utils.report("merged libraries: %s",concat(right," "))
+ utilities.report("merge: used libraries: %s",concat(right," "))
end
if #wrong > 0 then
- utils.report("skipped libraries: %s",concat(wrong," "))
+ utilities.report("merge: skipped libraries: %s",concat(wrong," "))
end
else
- utils.report("no valid library path found")
+ utilities.report("merge: no valid library path found")
end
return concat(result, "\n\n")
end
-function utils.merger.selfcreate(libs,list,target)
+function merger.selfcreate(libs,list,target)
if target then
- utils.merger._self_save_(
- target,
- utils.merger._self_swap_(
- utils.merger._self_fake_(),
- utils.merger._self_libs_(libs,list)
- )
- )
+ self_save(target,self_swap(self_fake(),self_libs(libs,list)))
end
end
-function utils.merger.selfmerge(name,libs,list,target)
- utils.merger._self_save_(
- target or name,
- utils.merger._self_swap_(
- utils.merger._self_load_(name),
- utils.merger._self_libs_(libs,list)
- )
- )
+function merger.selfmerge(name,libs,list,target)
+ self_save(target or name,self_swap(self_load(name),self_libs(libs,list)))
end
-function utils.merger.selfclean(name)
- utils.merger._self_save_(
- name,
- utils.merger._self_swap_(
- utils.merger._self_load_(name),
- ""
- )
- )
+function merger.selfclean(name)
+ self_save(name,self_swap(self_load(name),self_nothing()))
end
-function utils.lua.compile(luafile, lucfile, cleanup, strip) -- defaults: cleanup=false strip=true
- -- utils.report("compiling",luafile,"into",lucfile)
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-lua'] = {
+ 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"
+}
+
+utilities = utilities or {}
+utilities.lua = utilities.lua or { }
+utilities.report = logs and logs.reporter("system") or print
+
+function utilities.lua.compile(luafile,lucfile,cleanup,strip) -- defaults: cleanup=false strip=true
+ utilities.report("lua: compiling %s into %s",luafile,lucfile)
os.remove(lucfile)
- local command = "-o " .. string.quote(lucfile) .. " " .. string.quote(luafile)
+ local command = "-o " .. string.quoted(lucfile) .. " " .. string.quoted(luafile)
if strip ~= false then
command = "-s " .. command
end
- local done = (os.spawn("texluac " .. command) == 0) or (os.spawn("luac " .. command) == 0)
+ local done = os.spawn("texluac " .. command) == 0 or os.spawn("luac " .. command) == 0
if done and cleanup == true and lfs.isfile(lucfile) and lfs.isfile(luafile) then
- -- utils.report("removing",luafile)
+ utilities.report("lua: removing %s",luafile)
os.remove(luafile)
end
return done
@@ -3359,11 +4177,16 @@ end
+
+
+
+
+
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['l-aux'] = {
+if not modules then modules = { } end modules ['util-prs'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -3371,15 +4194,20 @@ if not modules then modules = { } end modules ['l-aux'] = {
license = "see context related readme files"
}
--- for inline, no store split : for s in string.gmatch(str,",* *([^,]+)") do .. end
+local P, R, V, C, Ct, Carg = lpeg.P, lpeg.R, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Carg
+local lpegmatch = lpeg.match
+local concat, format, gmatch = table.concat, string.format, string.gmatch
+local tostring, type, next = tostring, type, next
-aux = aux or { }
+utilities = utilities or {}
+utilities.parsers = utilities.parsers or { }
+local parsers = utilities.parsers
+parsers.patterns = parsers.patterns or { }
-local concat, format, gmatch = table.concat, string.format, string.gmatch
-local tostring, type = tostring, type
-local lpegmatch = lpeg.match
+local setmetatableindex = table.setmetatableindex
+local sortedhash = table.sortedhash
-local P, R, V = lpeg.P, lpeg.R, lpeg.V
+-- we could use a Cf Cg construct
local escape, left, right = P("\\"), P('{'), P('}')
@@ -3388,29 +4216,35 @@ lpeg.patterns.balanced = P {
[2] = left * V(1) * right
}
-local space = lpeg.P(' ')
-local equal = lpeg.P("=")
-local comma = lpeg.P(",")
-local lbrace = lpeg.P("{")
-local rbrace = lpeg.P("}")
+local space = P(' ')
+local equal = P("=")
+local comma = P(",")
+local lbrace = P("{")
+local rbrace = P("}")
local nobrace = 1 - (lbrace+rbrace)
-local nested = lpeg.P { lbrace * (nobrace + lpeg.V(1))^0 * rbrace }
+local nested = P { lbrace * (nobrace + V(1))^0 * rbrace }
local spaces = space^0
-local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
+lpeg.patterns.nested = nested
+
+local value = P(lbrace * C((nobrace + nested)^0) * rbrace) + C((nested + (1-comma))^0)
-local key = lpeg.C((1-equal-comma)^1)
-local pattern_a = (space+comma)^0 * (key * equal * value + key * lpeg.C(""))
+local key = C((1-equal-comma)^1)
+local pattern_a = (space+comma)^0 * (key * equal * value + key * C(""))
local pattern_c = (space+comma)^0 * (key * equal * value)
-local key = lpeg.C((1-space-equal-comma)^1)
-local pattern_b = spaces * comma^0 * spaces * (key * ((spaces * equal * spaces * value) + lpeg.C("")))
+local key = C((1-space-equal-comma)^1)
+local pattern_b = spaces * comma^0 * spaces * (key * ((spaces * equal * spaces * value) + C("")))
-- "a=1, b=2, c=3, d={a{b,c}d}, e=12345, f=xx{a{b,c}d}xx, g={}" : outer {} removes, leading spaces ignored
local hash = { }
-local function set(key,value) -- using Carg is slower here
+local function set(key,value)
+ hash[key] = value
+end
+
+local function set(key,value)
hash[key] = value
end
@@ -3418,11 +4252,11 @@ local pattern_a_s = (pattern_a/set)^1
local pattern_b_s = (pattern_b/set)^1
local pattern_c_s = (pattern_c/set)^1
-aux.settings_to_hash_pattern_a = pattern_a_s
-aux.settings_to_hash_pattern_b = pattern_b_s
-aux.settings_to_hash_pattern_c = pattern_c_s
+parsers.patterns.settings_to_hash_a = pattern_a_s
+parsers.patterns.settings_to_hash_b = pattern_b_s
+parsers.patterns.settings_to_hash_c = pattern_c_s
-function aux.make_settings_to_hash_pattern(set,how)
+function parsers.make_settings_to_hash_pattern(set,how)
if how == "strict" then
return (pattern_c/set)^1
elseif how == "tolerant" then
@@ -3432,21 +4266,17 @@ function aux.make_settings_to_hash_pattern(set,how)
end
end
-function aux.settings_to_hash(str,existing)
+function parsers.settings_to_hash(str,existing)
if str and str ~= "" then
hash = existing or { }
- if moretolerant then
- lpegmatch(pattern_b_s,str)
- else
- lpegmatch(pattern_a_s,str)
- end
+ lpegmatch(pattern_a_s,str)
return hash
else
return { }
end
end
-function aux.settings_to_hash_tolerant(str,existing)
+function parsers.settings_to_hash_tolerant(str,existing)
if str and str ~= "" then
hash = existing or { }
lpegmatch(pattern_b_s,str)
@@ -3456,7 +4286,7 @@ function aux.settings_to_hash_tolerant(str,existing)
end
end
-function aux.settings_to_hash_strict(str,existing)
+function parsers.settings_to_hash_strict(str,existing)
if str and str ~= "" then
hash = existing or { }
lpegmatch(pattern_c_s,str)
@@ -3467,16 +4297,16 @@ function aux.settings_to_hash_strict(str,existing)
end
local separator = comma * space^0
-local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
-local pattern = lpeg.Ct(value*(separator*value)^0)
+local value = P(lbrace * C((nobrace + nested)^0) * rbrace) + C((nested + (1-comma))^0)
+local pattern = Ct(value*(separator*value)^0)
-- "aap, {noot}, mies" : outer {} removes, leading spaces ignored
-aux.settings_to_array_pattern = pattern
+parsers.patterns.settings_to_array = pattern
-- we could use a weak table as cache
-function aux.settings_to_array(str)
+function parsers.settings_to_array(str)
if not str or str == "" then
return { }
else
@@ -3488,16 +4318,16 @@ local function set(t,v)
t[#t+1] = v
end
-local value = lpeg.P(lpeg.Carg(1)*value) / set
-local pattern = value*(separator*value)^0 * lpeg.Carg(1)
+local value = P(Carg(1)*value) / set
+local pattern = value*(separator*value)^0 * Carg(1)
-function aux.add_settings_to_array(t,str)
+function parsers.add_settings_to_array(t,str)
return lpegmatch(pattern,str,nil,t)
end
-function aux.hash_to_string(h,separator,yes,no,strict,omit)
+function parsers.hash_to_string(h,separator,yes,no,strict,omit)
if h then
- local t, s = { }, table.sortedkeys(h)
+ local t, tn, s = { }, 0, table.sortedkeys(h)
omit = omit and table.tohash(omit)
for i=1,#s do
local key = s[i]
@@ -3506,15 +4336,19 @@ function aux.hash_to_string(h,separator,yes,no,strict,omit)
if type(value) == "boolean" then
if yes and no then
if value then
- t[#t+1] = key .. '=' .. yes
+ tn = tn + 1
+ t[tn] = key .. '=' .. yes
elseif not strict then
- t[#t+1] = key .. '=' .. no
+ tn = tn + 1
+ t[tn] = key .. '=' .. no
end
elseif value or not strict then
- t[#t+1] = key .. '=' .. tostring(value)
+ tn = tn + 1
+ t[tn] = key .. '=' .. tostring(value)
end
else
- t[#t+1] = key .. '=' .. value
+ tn = tn + 1
+ t[tn] = key .. '=' .. value
end
end
end
@@ -3524,7 +4358,7 @@ function aux.hash_to_string(h,separator,yes,no,strict,omit)
end
end
-function aux.array_to_string(a,separator)
+function parsers.array_to_string(a,separator)
if a then
return concat(a,separator or ",")
else
@@ -3532,107 +4366,160 @@ function aux.array_to_string(a,separator)
end
end
-function aux.settings_to_set(str,t)
+function parsers.settings_to_set(str,t) -- tohash? -- todo: lpeg -- duplicate anyway
t = t or { }
- for s in gmatch(str,"%s*([^,]+)") do
+-- for s in gmatch(str,"%s*([^, ]+)") do -- space added
+ for s in gmatch(str,"[^, ]+") do -- space added
t[s] = true
end
return t
end
-local value = lbrace * lpeg.C((nobrace + nested)^0) * rbrace
-local pattern = lpeg.Ct((space + value)^0)
+function parsers.simple_hash_to_string(h, separator)
+ local t, tn = { }, 0
+ for k, v in sortedhash(h) do
+ if v then
+ tn = tn + 1
+ t[tn] = k
+ end
+ end
+ return concat(t,separator or ",")
+end
+
+local value = lbrace * C((nobrace + nested)^0) * rbrace
+local pattern = Ct((space + value)^0)
-function aux.arguments_to_table(str)
+function parsers.arguments_to_table(str)
return lpegmatch(pattern,str)
end
--- temporary here
+-- temporary here (unoptimized)
-function aux.getparameters(self,class,parentclass,settings)
+function parsers.getparameters(self,class,parentclass,settings)
local sc = self[class]
if not sc then
- sc = table.clone(self[parent])
+ sc = { }
self[class] = sc
+ if parentclass then
+ local sp = self[parentclass]
+ if not sp then
+ sp = { }
+ self[parentclass] = sp
+ end
+ setmetatableindex(sc,sp)
+ end
end
- aux.settings_to_hash(settings,sc)
+ parsers.settings_to_hash(settings,sc)
+end
+
+function parsers.listitem(str)
+ return gmatch(str,"[^, ]+")
end
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['util-fmt'] = {
+ 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"
+}
+
+utilities = utilities or { }
+utilities.formatters = utilities.formatters or { }
+local formatters = utilities.formatters
+
+local concat, format = table.concat, string.format
+local tostring, type = tostring, type
+local strip = string.strip
+
+local P, R, Cs = lpeg.P, lpeg.R, lpeg.Cs
+local lpegmatch = lpeg.match
+
-- temporary here
-local digit = lpeg.R("09")
-local period = lpeg.P(".")
-local zero = lpeg.P("0")
+local digit = R("09")
+local period = P(".")
+local zero = P("0")
local trailingzeros = zero^0 * -digit -- suggested by Roberto R
local case_1 = period * trailingzeros / ""
local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
local number = digit^1 * (case_1 + case_2)
-local stripper = lpeg.Cs((number + 1)^0)
+local stripper = Cs((number + 1)^0)
---~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
---~ collectgarbage("collect")
---~ str = string.rep(sample,10000)
---~ local ts = os.clock()
---~ lpegmatch(stripper,str)
---~ print(#str, os.clock()-ts, lpegmatch(stripper,sample))
-lpeg.patterns.strip_zeros = stripper
+lpeg.patterns.stripzeros = stripper
-function aux.strip_zeros(str)
+function formatters.stripzeros(str)
return lpegmatch(stripper,str)
end
-function aux.definetable(target) -- defines undefined tables
- local composed, t = nil, { }
- for name in gmatch(target,"([^%.]+)") do
- if composed then
- composed = composed .. "." .. name
- else
- composed = name
+function formatters.formatcolumns(result,between)
+ if result and #result > 0 then
+ between = between or " "
+ local widths, numbers = { }, { }
+ local first = result[1]
+ local n = #first
+ for i=1,n do
+ widths[i] = 0
+ end
+ for i=1,#result do
+ local r = result[i]
+ for j=1,n do
+ local rj = r[j]
+ local tj = type(rj)
+ if tj == "number" then
+ numbers[j] = true
+ end
+ if tj ~= "string" then
+ rj = tostring(rj)
+ r[j] = rj
+ end
+ local w = #rj
+ if w > widths[j] then
+ widths[j] = w
+ end
+ end
+ end
+ for i=1,n do
+ local w = widths[i]
+ if numbers[i] then
+ if w > 80 then
+ widths[i] = "%s" .. between
+ else
+ widths[i] = "%0" .. w .. "i" .. between
+ end
+ else
+ if w > 80 then
+ widths[i] = "%s" .. between
+ elseif w > 0 then
+ widths[i] = "%-" .. w .. "s" .. between
+ else
+ widths[i] = "%s"
+ end
+ end
+ end
+ local template = strip(concat(widths))
+ for i=1,#result do
+ local str = format(template,unpack(result[i]))
+ result[i] = strip(str)
end
- t[#t+1] = format("%s = %s or { }",composed,composed)
- end
- return concat(t,"\n")
-end
-
-function aux.accesstable(target)
- local t = _G
- for name in gmatch(target,"([^%.]+)") do
- t = t[name]
end
- return t
+ return result
end
---~ function string.commaseparated(str)
---~ return gmatch(str,"([^,%s]+)")
---~ end
-
--- as we use this a lot ...
-
---~ function aux.cachefunction(action,weak)
---~ local cache = { }
---~ if weak then
---~ setmetatable(cache, { __mode = "kv" } )
---~ end
---~ local function reminder(str)
---~ local found = cache[str]
---~ if not found then
---~ found = action(str)
---~ cache[str] = found
---~ end
---~ return found
---~ end
---~ return reminder, cache
---~ end
-
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['trac-tra'] = {
+if not modules then modules = { } end modules ['util.deb'] = {
version = 1.001,
- comment = "companion to trac-tra.mkiv",
+ 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"
@@ -3645,14 +4532,16 @@ if not modules then modules = { } end modules ['trac-tra'] = {
local debug = require "debug"
local getinfo = debug.getinfo
-local type, next = type, next
-local concat = table.concat
-local format, find, lower, gmatch, gsub = string.format, string.find, string.lower, string.gmatch, string.gsub
+local type, next, tostring = type, next, tostring
+local format, find = string.format, string.find
+local is_boolean = string.is_boolean
-debugger = debugger or { }
+utilities = utilities or { }
+utilities.debugger = utilities.debugger or { }
+local debugger = utilities.debugger
local counters = { }
-local names = { }
+local names = { }
-- one
@@ -3670,6 +4559,7 @@ local function hook()
end
end
end
+
local function getname(func)
local n = names[func]
if n then
@@ -3685,6 +4575,7 @@ local function getname(func)
return "unknown"
end
end
+
function debugger.showstats(printer,threshold)
printer = printer or texio.write or print
threshold = threshold or 0
@@ -3707,35 +4598,6 @@ end
-- two
---~ local function hook()
---~ local n = getinfo(2)
---~ if n.what=="C" and not n.name then
---~ local f = tostring(debug.traceback())
---~ local cf = counters[f]
---~ if cf == nil then
---~ counters[f] = 1
---~ names[f] = n
---~ else
---~ counters[f] = cf + 1
---~ end
---~ end
---~ end
---~ function debugger.showstats(printer,threshold)
---~ printer = printer or texio.write or print
---~ threshold = threshold or 0
---~ local total, grandtotal, functions = 0, 0, 0
---~ printer("\n") -- ugly but ok
---~ -- table.sort(counters)
---~ for func, count in next, counters do
---~ if count > threshold then
---~ printer(format("%8i %s", count, func))
---~ total = total + count
---~ end
---~ grandtotal = grandtotal + count
---~ functions = functions + 1
---~ end
---~ printer(format("functions: %s, total: %s, grand total: %s, threshold: %s\n", functions, total, grandtotal, threshold))
---~ end
-- rest
@@ -3753,85 +4615,335 @@ end
function debugger.disable()
debug.sethook()
---~ counters[debug.getinfo(2,"f").func] = nil
end
-function debugger.tracing()
- local n = tonumber(os.env['MTX.TRACE.CALLS']) or tonumber(os.env['MTX_TRACE_CALLS']) or 0
- if n > 0 then
- function debugger.tracing() return true end ; return true
+
+
+
+
+local is_node = node and node.is_node
+
+function inspect(i) -- global function
+ local ti = type(i)
+ if ti == "table" then
+ table.print(i,"table")
+ elseif is_node and is_node(i) then
+ table.print(nodes.astable(i),tostring(i))
else
- function debugger.tracing() return false end ; return false
+ print(tostring(i))
end
end
---~ debugger.enable()
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
+end -- of closure
---~ debugger.disable()
+do -- create closure to overcome 200 locals limit
---~ print("")
---~ debugger.showstats()
---~ print("")
---~ debugger.showstats(print,3)
+if not modules then modules = { } end modules ['trac-inf'] = {
+ version = 1.001,
+ comment = "companion to trac-inf.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- As we want to protect the global tables, we no longer store the timing
+-- in the tables themselves but in a hidden timers table so that we don't
+-- get warnings about assignments. This is more efficient than using rawset
+-- and rawget.
+
+local format = string.format
+local clock = os.gettimeofday or os.clock -- should go in environment
+local write_nl = texio.write_nl
+
+statistics = statistics or { }
+local statistics = statistics
+
+statistics.enable = true
+statistics.threshold = 0.05
+
+local statusinfo, n, registered, timers = { }, 0, { }, { }
+
+local function hastiming(instance)
+ return instance and timers[instance]
+end
+
+local function resettiming(instance)
+ timers[instance or "notimer"] = { timing = 0, loadtime = 0 }
+end
-setters = setters or { }
-setters.data = setters.data or { }
+local function starttiming(instance)
+ local timer = timers[instance or "notimer"]
+ if not timer then
+ timer = { }
+ timers[instance or "notimer"] = timer
+ end
+ local it = timer.timing
+ if not it then
+ it = 0
+ end
+ if it == 0 then
+ timer.starttime = clock()
+ if not timer.loadtime then
+ timer.loadtime = 0
+ end
+ end
+ timer.timing = it + 1
+end
---~ local function set(t,what,value)
---~ local data, done = t.data, t.done
---~ if type(what) == "string" then
---~ what = aux.settings_to_array(what) -- inefficient but ok
---~ end
---~ for i=1,#what do
---~ local w = what[i]
---~ for d, f in next, data do
---~ if done[d] then
---~ -- prevent recursion due to wildcards
---~ elseif find(d,w) then
---~ done[d] = true
---~ for i=1,#f do
---~ f[i](value)
---~ end
---~ end
---~ end
---~ end
---~ end
+local function stoptiming(instance, report)
+ local timer = timers[instance or "notimer"]
+ local it = timer.timing
+ if it > 1 then
+ timer.timing = it - 1
+ else
+ local starttime = timer.starttime
+ if starttime then
+ local stoptime = clock()
+ local loadtime = stoptime - starttime
+ timer.stoptime = stoptime
+ timer.loadtime = timer.loadtime + loadtime
+ if report then
+ statistics.report("load time %0.3f",loadtime)
+ end
+ timer.timing = 0
+ return loadtime
+ end
+ end
+ return 0
+end
-local function set(t,what,value)
+local function elapsedtime(instance)
+ local timer = timers[instance or "notimer"]
+ return format("%0.3f",timer and timer.loadtime or 0)
+end
+
+local function elapsedindeed(instance)
+ local timer = timers[instance or "notimer"]
+ return (timer and timer.loadtime or 0) > statistics.threshold
+end
+
+local function elapsedseconds(instance,rest) -- returns nil if 0 seconds
+ if elapsedindeed(instance) then
+ return format("%s seconds %s", elapsedtime(instance),rest or "")
+ end
+end
+
+statistics.hastiming = hastiming
+statistics.resettiming = resettiming
+statistics.starttiming = starttiming
+statistics.stoptiming = stoptiming
+statistics.elapsedtime = elapsedtime
+statistics.elapsedindeed = elapsedindeed
+statistics.elapsedseconds = elapsedseconds
+
+-- general function
+
+function statistics.register(tag,fnc)
+ if statistics.enable and type(fnc) == "function" then
+ local rt = registered[tag] or (#statusinfo + 1)
+ statusinfo[rt] = { tag, fnc }
+ registered[tag] = rt
+ if #tag > n then n = #tag end
+ end
+end
+
+function statistics.show(reporter)
+ if statistics.enable then
+ if not reporter then reporter = function(tag,data,n) write_nl(tag .. " " .. data) end end
+ -- this code will move
+ local register = statistics.register
+ register("luatex banner", function()
+ return string.lower(status.banner)
+ end)
+ register("control sequences", function()
+ return format("%s of %s", status.cs_count, status.hash_size+status.hash_extra)
+ end)
+ register("callbacks", function()
+ local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0
+ return format("%s direct, %s indirect, %s total", total-indirect, indirect, total)
+ end)
+ collectgarbage("collect")
+ register("current memory usage", statistics.memused)
+ register("runtime",statistics.runtime)
+ for i=1,#statusinfo do
+ local s = statusinfo[i]
+ local r = s[2]()
+ if r then
+ reporter(s[1],r,n)
+ end
+ end
+ write_nl("") -- final newline
+ statistics.enable = false
+ end
+end
+
+local template, report_statistics, nn = nil, nil, 0 -- we only calcute it once
+
+function statistics.showjobstat(tag,data,n)
+ if not logs then
+ -- sorry
+ elseif type(data) == "table" then
+ for i=1,#data do
+ statistics.showjobstat(tag,data[i],n)
+ end
+ else
+ if not template or n > nn then
+ template, n = format("%%-%ss - %%s",n), nn
+ report_statistics = logs.reporter("mkiv lua stats")
+ end
+ report_statistics(format(template,tag,data))
+ end
+end
+
+function statistics.memused() -- no math.round yet -)
+ local round = math.round or math.floor
+ return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000))
+end
+
+starttiming(statistics)
+
+function statistics.formatruntime(runtime) -- indirect so it can be overloaded and
+ return format("%s seconds", runtime) -- indeed that happens in cure-uti.lua
+end
+
+function statistics.runtime()
+ stoptiming(statistics)
+ return statistics.formatruntime(elapsedtime(statistics))
+end
+
+function statistics.timed(action,report)
+ report = report or logs.reporter("system")
+ starttiming("run")
+ action()
+ stoptiming("run")
+ report("total runtime: %s",elapsedtime("run"))
+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")
+ tex.sprint(elapsedtime(name or "whatever"))
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['trac-set'] = { -- might become util-set.lua
+ 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 type, next, tostring = type, next, tostring
+local concat = table.concat
+local format, find, lower, gsub, escapedpattern = string.format, string.find, string.lower, string.gsub, string.escapedpattern
+local is_boolean = string.is_boolean
+local settings_to_hash = utilities.parsers.settings_to_hash
+local allocate = utilities.storage.allocate
+
+utilities = utilities or { }
+local utilities = utilities
+utilities.setters = utilities.setters or { }
+local setters = utilities.setters
+
+local data = { } -- maybe just local
+
+-- We can initialize from the cnf file. This is sort of tricky as
+-- later defined setters also need to be initialized then. If set
+-- this way, we need to ensure that they are not reset later on.
+
+local trace_initialize = false -- only for testing during development
+
+function setters.initialize(filename,name,values) -- filename only for diagnostics
+ local setter = data[name]
+ if setter then
+ local data = setter.data
+ if data then
+ for key, value in next, values do
+ -- key = gsub(key,"_",".")
+ value = is_boolean(value,value)
+ local functions = data[key]
+ if functions then
+ if #functions > 0 and not functions.value then
+ if trace_initialize then
+ setter.report("executing %s (%s -> %s)",key,filename,tostring(value))
+ end
+ for i=1,#functions do
+ functions[i](value)
+ end
+ functions.value = value
+ else
+ if trace_initialize then
+ setter.report("skipping %s (%s -> %s)",key,filename,tostring(value))
+ end
+ end
+ else
+ -- we do a simple preregistration i.e. not in the
+ -- list as it might be an obsolete entry
+ functions = { default = value }
+ data[key] = functions
+ if trace_initialize then
+ setter.report("storing %s (%s -> %s)",key,filename,tostring(value))
+ end
+ end
+ end
+ return true
+ end
+ end
+end
+
+-- user interface code
+
+local function set(t,what,newvalue)
local data, done = t.data, t.done
if type(what) == "string" then
- what = aux.settings_to_hash(what) -- inefficient but ok
+ what = settings_to_hash(what) -- inefficient but ok
+ end
+ if type(what) ~= "table" then
+ return
end
- for w, v in next, what do
- if v == "" then
- v = value
+ for w, value in next, what do
+ if value == "" then
+ value = newvalue
+ elseif not value then
+ value = false -- catch nil
else
- v = toboolean(v)
+ value = is_boolean(value,value)
end
- for d, f in next, data do
- if done[d] then
+ w = "^" .. escapedpattern(w,true) .. "$" -- new: anchored
+ for name, functions in next, data do
+ if done[name] then
-- prevent recursion due to wildcards
- elseif find(d,w) then
- done[d] = true
- for i=1,#f do
- f[i](v)
+ elseif find(name,w) then
+ done[name] = true
+ for i=1,#functions do
+ functions[i](value)
end
+ functions.value = value
end
end
end
end
local function reset(t)
- for d, f in next, t.data do
- for i=1,#f do
- f[i](false)
+ for name, functions in next, t.data do
+ for i=1,#functions do
+ functions[i](false)
end
+ functions.value = false
end
end
@@ -3852,32 +4964,51 @@ end
function setters.register(t,what,...)
local data = t.data
what = lower(what)
- local w = data[what]
- if not w then
- w = { }
- data[what] = w
+ local functions = data[what]
+ if not functions then
+ functions = { }
+ data[what] = functions
+ if trace_initialize then
+ t.report("defining %s",what)
+ end
end
+ local default = functions.default -- can be set from cnf file
for _, fnc in next, { ... } do
local typ = type(fnc)
- if typ == "function" then
- w[#w+1] = fnc
- elseif typ == "string" then
- w[#w+1] = function(value) set(t,fnc,value,nesting) end
+ if typ == "string" then
+ if trace_initialize then
+ t.report("coupling %s to %s",what,fnc)
+ end
+ local s = fnc -- else wrong reference
+ fnc = function(value) set(t,s,value) end
+ elseif typ ~= "function" then
+ fnc = nil
+ end
+ if fnc then
+ functions[#functions+1] = fnc
+ -- default: set at command line or in cnf file
+ -- value : set in tex run (needed when loading runtime)
+ local value = functions.value or default
+ if value ~= nil then
+ fnc(value)
+ functions.value = value
+ end
end
end
+ return false -- so we can use it in an assignment
end
function setters.enable(t,what)
local e = t.enable
t.enable, t.done = enable, { }
- enable(t,string.simpleesc(tostring(what)))
+ enable(t,what)
t.enable, t.done = e, { }
end
function setters.disable(t,what)
local e = t.disable
t.disable, t.done = disable, { }
- disable(t,string.simpleesc(tostring(what)))
+ disable(t,what)
t.disable, t.done = e, { }
end
@@ -3901,68 +5032,94 @@ function setters.list(t) -- pattern
end
function setters.show(t)
- commands.writestatus("","")
+ local category = t.name
local list = setters.list(t)
+ t.report()
for k=1,#list do
- commands.writestatus(t.name,list[k])
+ local name = list[k]
+ local functions = t.data[name]
+ if functions then
+ local value, default, modules = functions.value, functions.default, #functions
+ value = value == nil and "unset" or tostring(value)
+ default = default == nil and "unset" or tostring(default)
+ t.report("%-30s modules: %2i default: %6s value: %6s",name,modules,default,value)
+ end
end
- commands.writestatus("","")
+ t.report()
end
-- we could have used a bit of oo and the trackers:enable syntax but
-- there is already a lot of code around using the singular tracker
--- we could make this into a module
+-- we could make this into a module but we also want the rest avaliable
+
+local enable, disable, register, list, show = setters.enable, setters.disable, setters.register, setters.list, setters.show
+
+local function report(setter,...)
+ local report = logs and logs.report
+ if report then
+ report(setter.name,...)
+ else -- fallback, as this module is loaded before the logger
+ write_nl(format("%-15s : %s\n",setter.name,format(...)))
+ end
+end
function setters.new(name)
- local t
- t = {
- data = { },
+ local setter -- we need to access it in setter itself
+ setter = {
+ data = allocate(), -- indexed, but also default and value fields
name = name,
- enable = function(...) setters.enable (t,...) end,
- disable = function(...) setters.disable (t,...) end,
- register = function(...) setters.register(t,...) end,
- list = function(...) setters.list (t,...) end,
- show = function(...) setters.show (t,...) end,
+ report = function(...) report (setter,...) end,
+ enable = function(...) enable (setter,...) end,
+ disable = function(...) disable (setter,...) end,
+ register = function(...) register(setter,...) end,
+ list = function(...) list (setter,...) end,
+ show = function(...) show (setter,...) end,
}
- setters.data[name] = t
- return t
+ data[name] = setter
+ return setter
end
trackers = setters.new("trackers")
directives = setters.new("directives")
experiments = setters.new("experiments")
+local t_enable, t_disable, t_report = trackers .enable, trackers .disable, trackers .report
+local d_enable, d_disable, d_report = directives .enable, directives .disable, directives .report
+local e_enable, e_disable, e_report = experiments.enable, experiments.disable, experiments.report
+
-- nice trick: we overload two of the directives related functions with variants that
-- do tracing (itself using a tracker) .. proof of concept
local trace_directives = false local trace_directives = false trackers.register("system.directives", function(v) trace_directives = v end)
local trace_experiments = false local trace_experiments = false trackers.register("system.experiments", function(v) trace_experiments = v end)
-local e = directives.enable
-local d = directives.disable
-
function directives.enable(...)
- commands.writestatus("directives","enabling: %s",concat({...}," "))
- e(...)
+ if trace_directives then
+ d_report("enabling: %s",concat({...}," "))
+ end
+ d_enable(...)
end
function directives.disable(...)
- commands.writestatus("directives","disabling: %s",concat({...}," "))
- d(...)
+ if trace_directives then
+ d_report("disabling: %s",concat({...}," "))
+ end
+ d_disable(...)
end
-local e = experiments.enable
-local d = experiments.disable
-
function experiments.enable(...)
- commands.writestatus("experiments","enabling: %s",concat({...}," "))
- e(...)
+ if trace_experiments then
+ e_report("enabling: %s",concat({...}," "))
+ end
+ e_enable(...)
end
function experiments.disable(...)
- commands.writestatus("experiments","disabling: %s",concat({...}," "))
- d(...)
+ if trace_experiments then
+ e_report("disabling: %s",concat({...}," "))
+ end
+ e_disable(...)
end
-- a useful example
@@ -3971,6 +5128,1121 @@ directives.register("system.nostatistics", function(v)
statistics.enable = not v
end)
+directives.register("system.nolibraries", function(v)
+ libraries = nil -- we discard this tracing for security
+end)
+
+-- experiment
+
+local flags = environment and environment.engineflags
+
+if flags then
+ if trackers and flags.trackers then
+ setters.initialize("flags","trackers", settings_to_hash(flags.trackers))
+ -- t_enable(flags.trackers)
+ end
+ if directives and flags.directives then
+ setters.initialize("flags","directives", settings_to_hash(flags.directives))
+ -- d_enable(flags.directives)
+ end
+end
+
+-- here
+
+if texconfig then
+
+ local function set(k,v)
+ v = tonumber(v)
+ if v then
+ texconfig[k] = v
+ end
+ end
+
+ directives.register("luatex.expanddepth", function(v) set("expand_depth",v) end)
+ directives.register("luatex.hashextra", function(v) set("hash_extra",v) end)
+ directives.register("luatex.nestsize", function(v) set("nest_size",v) end)
+ directives.register("luatex.maxinopen", function(v) set("max_in_open",v) end)
+ directives.register("luatex.maxprintline", function(v) set("max_print_line",v) end)
+ directives.register("luatex.maxstrings", function(v) set("max_strings",v) end)
+ directives.register("luatex.paramsize", function(v) set("param_size",v) end)
+ directives.register("luatex.savesize", function(v) set("save_size",v) end)
+ directives.register("luatex.stacksize", function(v) set("stack_size",v) end)
+
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['trac-log'] = {
+ version = 1.001,
+ comment = "companion to trac-log.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- todo: less categories, more subcategories (e.g. nodes)
+
+
+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 escapedpattern = string.escapedpattern
+local texcount = tex and tex.count
+local next, type = next, type
+
+local setmetatableindex = table.setmetatableindex
+
+--[[ldx--
+<p>This is a prelude to a more extensive logging module. We no longer
+provide <l n='xml'/> based logging a sparsing is relatively easy anyway.</p>
+--ldx]]--
+
+logs = logs or { }
+local logs = logs
+
+local moreinfo = [[
+More information about ConTeXt and the tools that come with it can be found at:
+
+maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
+webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
+wiki : http://contextgarden.net
+]]
+
+-- basic loggers
+
+local function ignore() end
+
+setmetatableindex(logs, function(t,k) t[k] = ignore ; return ignore end)
+
+local report, subreport, status, settarget, setformats, settranslations
+
+local direct, subdirect, writer, pushtarget, poptarget
+
+if tex and tex.jobname or tex.formatname then
+
+ local valueiskey = { __index = function(t,k) t[k] = k return k end } -- will be helper
+
+ local target = "term and log"
+
+ logs.flush = io.flush
+
+ local formats = { } setmetatable(formats, valueiskey)
+ local translations = { } setmetatable(translations,valueiskey)
+
+ writer = function(...)
+ write_nl(target,...)
+ end
+
+ report = function(a,b,c,...)
+ if c then
+ write_nl(target,format("%-15s > %s\n",translations[a],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s > %s\n",translations[a],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s >\n", translations[a]))
+ else
+ write_nl(target,"\n")
+ end
+ end
+
+ direct = function(a,b,c,...)
+ if c then
+ return format("%-15s > %s",translations[a],format(formats[b],c,...))
+ elseif b then
+ return format("%-15s > %s",translations[a],formats[b])
+ elseif a then
+ return format("%-15s >", translations[a])
+ else
+ return ""
+ end
+ end
+
+ subreport = function(a,s,b,c,...)
+ if c then
+ write_nl(target,format("%-15s > %s > %s\n",translations[a],translations[s],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s > %s > %s\n",translations[a],translations[s],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s > %s >\n", translations[a],translations[s]))
+ else
+ write_nl(target,"\n")
+ end
+ end
+
+ subdirect = function(a,s,b,c,...)
+ if c then
+ return format("%-15s > %s > %s",translations[a],translations[s],format(formats[b],c,...))
+ elseif b then
+ return format("%-15s > %s > %s",translations[a],translations[s],formats[b])
+ elseif a then
+ return format("%-15s > %s >", translations[a],translations[s])
+ else
+ return ""
+ end
+ end
+
+ status = function(a,b,c,...)
+ if c then
+ write_nl(target,format("%-15s : %s\n",translations[a],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s : %s\n",translations[a],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s :\n", translations[a]))
+ else
+ write_nl(target,"\n")
+ 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
+ if target == "term" or target == "term and log" then
+ logs.flush = io.flush
+ else
+ logs.flush = ignore
+ end
+ end
+
+ local stack = { }
+
+ pushtarget = function(newtarget)
+ insert(stack,target)
+ settarget(newtarget)
+ end
+
+ poptarget = function()
+ if #stack > 0 then
+ settarget(remove(stack))
+ end
+ end
+
+ setformats = function(f)
+ formats = f
+ end
+
+ settranslations = function(t)
+ translations = t
+ end
+
+else
+
+ logs.flush = ignore
+
+ writer = write_nl
+
+ report = function(a,b,c,...)
+ if c then
+ write_nl(format("%-15s | %s",a,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s | %s",a,b))
+ elseif a then
+ write_nl(format("%-15s |", a))
+ else
+ write_nl("")
+ end
+ end
+
+ subreport = function(a,sub,b,c,...)
+ if c then
+ write_nl(format("%-15s | %s | %s",a,sub,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s | %s | %s",a,sub,b))
+ elseif a then
+ write_nl(format("%-15s | %s |", a,sub))
+ else
+ write_nl("")
+ end
+ end
+
+ status = function(a,b,c,...) -- not to be used in lua anyway
+ if c then
+ write_nl(format("%-15s : %s\n",a,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s : %s\n",a,b)) -- b can have %'s
+ elseif a then
+ write_nl(format("%-15s :\n", a))
+ else
+ write_nl("\n")
+ end
+ end
+
+ direct = ignore
+ subdirect = ignore
+
+ settarget = ignore
+ pushtarget = ignore
+ poptarget = ignore
+ setformats = ignore
+ settranslations = ignore
+
+end
+
+logs.report = report
+logs.subreport = subreport
+logs.status = status
+logs.settarget = settarget
+logs.pushtarget = pushtarget
+logs.poptarget = poptarget
+logs.setformats = setformats
+logs.settranslations = settranslations
+
+logs.direct = direct
+logs.subdirect = subdirect
+logs.writer = writer
+
+-- installer
+
+-- todo: renew (un) locks when a new one is added and wildcard
+
+local data, states = { }, nil
+
+function logs.reporter(category,subcategory)
+ local logger = data[category]
+ if not logger then
+ local state = false
+ if states == true then
+ state = true
+ elseif type(states) == "table" then
+ for c, _ in next, states do
+ if find(category,c) then
+ state = true
+ break
+ end
+ end
+ end
+ logger = {
+ reporters = { },
+ state = state,
+ }
+ data[category] = logger
+ end
+ local reporter = logger.reporters[subcategory or "default"]
+ if not reporter then
+ if subcategory then
+ reporter = function(...)
+ if not logger.state then
+ subreport(category,subcategory,...)
+ end
+ end
+ logger.reporters[subcategory] = reporter
+ else
+ local tag = category
+ reporter = function(...)
+ if not logger.state then
+ report(category,...)
+ end
+ end
+ logger.reporters.default = reporter
+ end
+ end
+ return reporter
+end
+
+logs.new = logs.reporter -- for old times sake
+
+-- context specicific: this ends up in the macro stream
+
+local ctxreport = logs.writer
+
+function logs.setmessenger(m)
+ ctxreport = m
+end
+
+function logs.messenger(category,subcategory)
+ -- we need to avoid catcode mess (todo: fast context)
+ if subcategory then
+ return function(...)
+ ctxreport(subdirect(category,subcategory,...))
+ end
+ else
+ return function(...)
+ ctxreport(direct(category,...))
+ end
+ end
+end
+
+-- so far
+
+local function setblocked(category,value)
+ if category == true then
+ -- lock all
+ category, value = "*", true
+ elseif category == false then
+ -- unlock all
+ category, value = "*", false
+ elseif value == nil then
+ -- lock selective
+ value = true
+ end
+ if category == "*" then
+ states = value
+ for k, v in next, data do
+ v.state = value
+ end
+ else
+ states = utilities.parsers.settings_to_hash(category)
+ for c, _ in next, states do
+ if data[c] then
+ v.state = value
+ else
+ c = escapedpattern(c,true)
+ for k, v in next, data do
+ if find(k,c) then
+ v.state = value
+ end
+ end
+ end
+ end
+ end
+end
+
+function logs.disable(category,value)
+ setblocked(category,value == nil and true or value)
+end
+
+function logs.enable(category)
+ setblocked(category,false)
+end
+
+function logs.categories()
+ return table.sortedkeys(data)
+end
+
+function logs.show()
+ local n, c, s, max = 0, 0, 0, 0
+ for category, v in table.sortedpairs(data) do
+ n = n + 1
+ local state = v.state
+ local reporters = v.reporters
+ local nc = #category
+ if nc > c then
+ c = nc
+ end
+ for subcategory, _ in next, reporters do
+ local ns = #subcategory
+ if ns > c then
+ s = ns
+ end
+ local m = nc + ns
+ if m > max then
+ max = m
+ end
+ end
+ local subcategories = concat(table.sortedkeys(reporters),", ")
+ if state == true then
+ state = "disabled"
+ elseif state == false then
+ state = "enabled"
+ else
+ state = "unknown"
+ end
+ -- no new here
+ report("logging","category: '%s', subcategories: '%s', state: '%s'",category,subcategories,state)
+ end
+ report("logging","categories: %s, max category: %s, max subcategory: %s, max combined: %s",n,c,s,max)
+end
+
+directives.register("logs.blocked", function(v)
+ setblocked(v,true)
+end)
+
+directives.register("logs.target", function(v)
+ settarget(v)
+end)
+
+-- tex specific loggers (might move elsewhere)
+
+local report_pages = logs.reporter("pages") -- not needed but saves checking when we grep for it
+
+local real, user, sub
+
+function logs.start_page_number()
+ real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
+end
+
+function logs.stop_page_number()
+ if real > 0 then
+ if user > 0 then
+ if sub > 0 then
+ report_pages("flushing realpage %s, userpage %s, subpage %s",real,user,sub)
+ else
+ report_pages("flushing realpage %s, userpage %s",real,user)
+ end
+ else
+ report_pages("flushing realpage %s",real)
+ end
+ else
+ report_pages("flushing page")
+ end
+ logs.flush()
+end
+
+logs.report_job_stat = statistics and statistics.showjobstat
+
+local report_files = logs.reporter("files")
+
+local nesting = 0
+local verbose = false
+local hasscheme = url.hasscheme
+
+-- we don't have show_open and show_close callbacks yet
+
+function logs.show_open(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- nesting = nesting + 1
+ -- report_files("level %s, opening %s",nesting,name)
+ -- else
+ -- write(format("(%s",name)) -- tex adds a space
+ -- end
+ -- end
+end
+
+function logs.show_close(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- report_files("level %s, closing %s",nesting,name)
+ -- nesting = nesting - 1
+ -- else
+ -- write(")") -- tex adds a space
+ -- end
+ -- end
+end
+
+function logs.show_load(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- report_files("level %s, loading %s",nesting+1,name)
+ -- else
+ -- write(format("(%s)",name))
+ -- end
+ -- end
+end
+
+-- there may be scripts out there using this:
+
+local simple = logs.reporter("comment")
+
+logs.simple = simple
+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
+
+-- applications
+
+local function reportlines(t,str)
+ if str then
+ for line in gmatch(str,"(.-)[\n\r]") do
+ t.report(line)
+ end
+ end
+end
+
+local function reportbanner(t)
+ local banner = t.banner
+ if banner then
+ t.report(banner)
+ t.report()
+ end
+end
+
+local function reporthelp(t,...)
+ local helpinfo = t.helpinfo
+ if type(helpinfo) == "string" then
+ reportlines(t,helpinfo)
+ elseif type(helpinfo) == "table" then
+ local tags = { ... }
+ for i=1,#tags do
+ reportlines(t,t.helpinfo[tags[i]])
+ if i < #tags then
+ t.report()
+ end
+ end
+ end
+end
+
+local function reportinfo(t)
+ t.report()
+ reportlines(t,moreinfo)
+end
+
+function logs.application(t)
+ t.name = t.name or "unknown"
+ t.banner = t.banner
+ t.report = logs.reporter(t.name)
+ t.help = function(...) reportbanner(t) ; reporthelp(t,...) ; reportinfo(t) end
+ t.identify = function() reportbanner(t) end
+ return t
+end
+
+-- somewhat special
+
+-- logging to a file
+
+
+function logs.system(whereto,process,jobname,category,...)
+ local message = format("%s %s => %s => %s => %s\r",os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...))
+ for i=1,10 do
+ local f = io.open(whereto,"a") -- we can consider keepint the file open
+ if f then
+ f:write(message)
+ f:close()
+ break
+ else
+ sleep(0.1)
+ end
+ end
+end
+
+local report_system = logs.reporter("system","logs")
+
+function logs.obsolete(old,new)
+ local o = loadstring("return " .. new)()
+ if type(o) == "function" then
+ return function(...)
+ report_system("function %s is obsolete, use %s",old,new)
+ loadstring(old .. "=" .. new .. " return ".. old)()(...)
+ end
+ elseif type(o) == "table" then
+ local t, m = { }, { }
+ m.__index = function(t,k)
+ report_system("table %s is obsolete, use %s",old,new)
+ m.__index, m.__newindex = o, o
+ return o[k]
+ end
+ m.__newindex = function(t,k,v)
+ report_system("table %s is obsolete, use %s",old,new)
+ m.__index, m.__newindex = o, o
+ o[k] = v
+ end
+ if libraries then
+ libraries.obsolete[old] = t -- true
+ end
+ setmetatable(t,m)
+ return t
+ end
+end
+
+if utilities then
+ utilities.report = report_system
+end
+
+if tex and tex.error then
+ function logs.texerrormessage(...) -- for the moment we put this function here
+ tex.error(format(...), { })
+ end
+else
+ function logs.texerrormessage(...)
+ print(format(...))
+ end
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['trac-pro'] = {
+ 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 getmetatable, setmetatable, rawset, type = getmetatable, setmetatable, rawset, type
+
+-- The protection implemented here is probably not that tight but good enough to catch
+-- problems due to naive usage.
+--
+-- There's a more extensive version (trac-xxx.lua) that supports nesting.
+--
+-- This will change when we have _ENV in lua 5.2+
+
+local trace_namespaces = false trackers.register("system.namespaces", function(v) trace_namespaces = v end)
+
+local report_system = logs.reporter("system","protection")
+
+namespaces = namespaces or { }
+local namespaces = namespaces
+
+local registered = { }
+
+local function report_index(k,name)
+ if trace_namespaces then
+ report_system("reference to '%s' in protected namespace '%s', %s",k,name,debug.traceback())
+ else
+ report_system("reference to '%s' in protected namespace '%s'",k,name)
+ end
+end
+
+local function report_newindex(k,name)
+ if trace_namespaces then
+ report_system("assignment to '%s' in protected namespace '%s', %s",k,name,debug.traceback())
+ else
+ report_system("assignment to '%s' in protected namespace '%s'",k,name)
+ end
+end
+
+local function register(name)
+ local data = name == "global" and _G or _G[name]
+ if not data then
+ return -- error
+ end
+ registered[name] = data
+ local m = getmetatable(data)
+ if not m then
+ m = { }
+ setmetatable(data,m)
+ end
+ local index, newindex = { }, { }
+ m.__saved__index = m.__index
+ m.__no__index = function(t,k)
+ if not index[k] then
+ index[k] = true
+ report_index(k,name)
+ end
+ return nil
+ end
+ m.__saved__newindex = m.__newindex
+ m.__no__newindex = function(t,k,v)
+ if not newindex[k] then
+ newindex[k] = true
+ report_newindex(k,name)
+ end
+ rawset(t,k,v)
+ end
+ m.__protection__depth = 0
+end
+
+local function private(name) -- maybe save name
+ local data = registered[name]
+ if not data then
+ data = _G[name]
+ if not data then
+ data = { }
+ _G[name] = data
+ end
+ register(name)
+ end
+ return data
+end
+
+local function protect(name)
+ local data = registered[name]
+ if not data then
+ return
+ end
+ local m = getmetatable(data)
+ local pd = m.__protection__depth
+ if pd > 0 then
+ m.__protection__depth = pd + 1
+ else
+ m.__save_d_index, m.__saved__newindex = m.__index, m.__newindex
+ m.__index, m.__newindex = m.__no__index, m.__no__newindex
+ m.__protection__depth = 1
+ end
+end
+
+local function unprotect(name)
+ local data = registered[name]
+ if not data then
+ return
+ end
+ local m = getmetatable(data)
+ local pd = m.__protection__depth
+ if pd > 1 then
+ m.__protection__depth = pd - 1
+ else
+ m.__index, m.__newindex = m.__saved__index, m.__saved__newindex
+ m.__protection__depth = 0
+ end
+end
+
+local function protectall()
+ for name, _ in next, registered do
+ if name ~= "global" then
+ protect(name)
+ end
+ end
+end
+
+local function unprotectall()
+ for name, _ in next, registered do
+ if name ~= "global" then
+ unprotect(name)
+ end
+ end
+end
+
+namespaces.register = register -- register when defined
+namespaces.private = private -- allocate and register if needed
+namespaces.protect = protect
+namespaces.unprotect = unprotect
+namespaces.protectall = protectall
+namespaces.unprotectall = unprotectall
+
+namespaces.private("namespaces") registered = { } register("global") -- unreachable
+
+directives.register("system.protect", function(v)
+ if v then
+ protectall()
+ else
+ unprotectall()
+ end
+end)
+
+directives.register("system.checkglobals", function(v)
+ if v then
+ report_system("enabling global namespace guard")
+ protect("global")
+ else
+ report_system("disabling global namespace guard")
+ unprotect("global")
+ end
+end)
+
+-- dummy section (will go to luat-dum.lua)
+
+
+
+
+
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['luat-env'] = {
+ 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"
+}
+
+-- A former version provided functionality for non embeded core
+-- scripts i.e. runtime library loading. Given the amount of
+-- Lua code we use now, this no longer makes sense. Much of this
+-- evolved before bytecode arrays were available and so a lot of
+-- code has disappeared already.
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_lua = logs.reporter("resolvers","lua")
+
+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 concat = table.concat
+
+-- precautions
+
+os.setlocale(nil,nil) -- useless feature and even dangerous in luatex
+
+function os.setlocale()
+ -- no way you can mess with it
+end
+
+-- dirty tricks
+
+if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
+ arg[-1] = arg[0]
+ arg[ 0] = arg[2]
+ for k=3,#arg do
+ arg[k-2] = arg[k]
+ end
+ arg[#arg] = nil -- last
+ arg[#arg] = nil -- pre-last
+end
+
+-- environment
+
+environment = environment or { }
+local environment = environment
+
+environment.arguments = allocate()
+environment.files = allocate()
+environment.sortedflags = nil
+
+local mt = {
+ __index = function(_,k)
+ if k == "version" then
+ local version = tex.toks and tex.toks.contextversiontoks
+ if version and version ~= "" then
+ rawset(environment,"version",version)
+ return version
+ else
+ return "unknown"
+ end
+ elseif k == "jobname" or k == "formatname" then
+ local name = tex and tex[k]
+ if name or name== "" then
+ rawset(environment,k,name)
+ return name
+ else
+ return "unknown"
+ end
+ elseif k == "outputfilename" then
+ local name = environment.jobname
+ rawset(environment,k,name)
+ return name
+ end
+ end
+}
+
+setmetatable(environment,mt)
+
+function environment.initializearguments(arg)
+ local arguments, files = { }, { }
+ environment.arguments, environment.files, environment.sortedflags = arguments, files, nil
+ for index=1,#arg do
+ local argument = arg[index]
+ if index > 0 then
+ local flag, value = match(argument,"^%-+(.-)=(.-)$")
+ if flag then
+ arguments[flag] = unquoted(value or "")
+ else
+ flag = match(argument,"^%-+(.+)")
+ if flag then
+ arguments[flag] = true
+ else
+ files[#files+1] = argument
+ end
+ end
+ end
+ end
+ environment.ownname = environment.ownname or arg[0] or 'unknown.lua'
+end
+
+function environment.setargument(name,value)
+ environment.arguments[name] = value
+end
+
+-- todo: defaults, better checks e.g on type (boolean versus string)
+--
+-- tricky: too many hits when we support partials unless we add
+-- a registration of arguments so from now on we have 'partial'
+
+function environment.argument(name,partial)
+ local arguments, sortedflags = environment.arguments, environment.sortedflags
+ if arguments[name] then
+ return arguments[name]
+ elseif partial then
+ if not sortedflags then
+ sortedflags = allocate(table.sortedkeys(arguments))
+ for k=1,#sortedflags do
+ sortedflags[k] = "^" .. sortedflags[k]
+ end
+ environment.sortedflags = sortedflags
+ end
+ -- example of potential clash: ^mode ^modefile
+ for k=1,#sortedflags do
+ local v = sortedflags[k]
+ if find(name,v) then
+ return arguments[sub(v,2,#v)]
+ end
+ end
+ end
+ return nil
+end
+
+function environment.splitarguments(separator) -- rather special, cut-off before separator
+ local done, before, after = false, { }, { }
+ local originalarguments = environment.originalarguments
+ for k=1,#originalarguments do
+ local v = originalarguments[k]
+ if not done and v == separator then
+ done = true
+ elseif done then
+ after[#after+1] = v
+ else
+ before[#before+1] = v
+ end
+ end
+ return before, after
+end
+
+function environment.reconstructcommandline(arg,noquote)
+ 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
+ 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," ") then
+ result[#result+1] = quoted(a)
+ else
+ result[#result+1] = a
+ end
+ 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
+ local argument = arg[index]
+ if find(argument,"^\"") then
+ newarg[#newarg+1] = gsub(argument,"^\"","")
+ if not find(argument,"\"$") then
+ instring = true
+ end
+ elseif find(argument,"\"$") then
+ newarg[#newarg] = newarg[#newarg] .. " " .. gsub(argument,"\"$","")
+ instring = false
+ elseif instring then
+ newarg[#newarg] = newarg[#newarg] .. " " .. argument
+ else
+ newarg[#newarg+1] = argument
+ end
+ end
+ for i=1,-5,-1 do
+ newarg[i] = arg[i]
+ end
+
+ environment.initializearguments(newarg)
+
+ environment.originalarguments = mark(newarg)
+ environment.rawarguments = mark(arg)
+
+ arg = { } -- prevent duplicate handling
+
+end
+
+-- weird place ... depends on a not yet loaded module
+
+function environment.texfile(filename)
+ return resolvers.findfile(filename,'tex')
+end
+
+function environment.luafile(filename)
+ local resolved = resolvers.findfile(filename,'tex') or ""
+ if resolved ~= "" then
+ return resolved
+ end
+ resolved = resolvers.findfile(filename,'texmfscripts') or ""
+ if resolved ~= "" then
+ return resolved
+ end
+ return resolvers.findfile(filename,'luatexlibs') or ""
+end
+
+environment.loadedluacode = loadfile -- can be overloaded
+
+function environment.luafilechunk(filename,silent) -- used for loading lua bytecode in the format
+ filename = file.replacesuffix(filename, "lua")
+ local fullname = environment.luafile(filename)
+ if fullname and fullname ~= "" then
+ local data = environment.loadedluacode(fullname)
+ if trace_locating then
+ report_lua("loading file %s%s", fullname, not data and " failed" or "")
+ elseif not silent then
+ texio.write("<",data and "+ " or "- ",fullname,">")
+ end
+ return data
+ else
+ if trace_locating then
+ report_lua("unknown file %s", filename)
+ end
+ return nil
+ end
+end
+
+-- the next ones can use the previous ones / combine
+
+function environment.loadluafile(filename, version)
+ local lucname, luaname, chunk
+ local basename = file.removesuffix(filename)
+ if basename == filename then
+ lucname, luaname = basename .. ".luc", basename .. ".lua"
+ else
+ lucname, luaname = nil, basename -- forced suffix
+ end
+ -- when not overloaded by explicit suffix we look for a luc file first
+ local fullname = (lucname and environment.luafile(lucname)) or ""
+ if fullname ~= "" then
+ if trace_locating then
+ report_lua("loading %s", fullname)
+ end
+ chunk = loadfile(fullname) -- this way we don't need a file exists check
+ end
+ if chunk then
+ assert(chunk)()
+ if version then
+ -- we check of the version number of this chunk matches
+ local v = version -- can be nil
+ if modules and modules[filename] then
+ v = modules[filename].version -- new method
+ elseif versions and versions[filename] then
+ v = versions[filename] -- old method
+ end
+ if v == version then
+ return true
+ else
+ if trace_locating then
+ report_lua("version mismatch for %s: lua=%s, luc=%s", filename, v, version)
+ end
+ environment.loadluafile(filename)
+ end
+ else
+ return true
+ end
+ end
+ fullname = (luaname and environment.luafile(luaname)) or ""
+ if fullname ~= "" then
+ if trace_locating then
+ report_lua("loading %s", fullname)
+ end
+ chunk = loadfile(fullname) -- this way we don't need a file exists check
+ if not chunk then
+ if trace_locating then
+ report_lua("unknown file %s", filename)
+ end
+ else
+ assert(chunk)()
+ return true
+ end
+ end
+ return false
+end
end -- of closure
@@ -3991,6 +6263,8 @@ if not modules then modules = { } end modules ['lxml-tab'] = {
local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end)
+local report_xml = logs and logs.reporter("xml","core") or function(...) print(format(...)) end
+
--[[ldx--
<p>The parser used here is inspired by the variant discussed in the lua book, but
handles comment and processing instructions, has a different structure, provides
@@ -4001,11 +6275,15 @@ The find based parser can be found in l-xml-edu.lua along with other older code.
<p>Beware, the interface may change. For instance at, ns, tg, dt may get more
verbose names. Once the code is stable we will also remove some tracing and
optimize the code.</p>
+
+<p>I might even decide to reimplement the parser using the latest <l n='lpeg'/> trickery
+as the current variant was written when <l n='lpeg'/> showed up and it's easier now to
+build tables in one go.</p>
--ldx]]--
xml = xml or { }
+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
@@ -4129,7 +6407,7 @@ local dcache, hcache, acache = { }, { }, { }
local mt = { }
-function initialize_mt(root)
+local function initialize_mt(root)
mt = { __index = root } -- will be redefined later
end
@@ -4137,8 +6415,8 @@ function xml.setproperty(root,k,v)
getmetatable(root).__index[k] = v
end
-function xml.check_error(top,toclose)
- return ""
+function xml.checkerror(top,toclose)
+ return "" -- can be set
end
local function add_attribute(namespace,tag,value)
@@ -4194,9 +6472,9 @@ local function add_end(spacing, namespace, tag)
local toclose = remove(stack)
top = stack[#stack]
if #stack < 1 then
- errorstr = format("nothing to close with %s %s", tag, xml.check_error(top,toclose) or "")
+ errorstr = format("nothing to close with %s %s", tag, xml.checkerror(top,toclose) or "")
elseif toclose.tg ~= tag then -- no namespace check
- errorstr = format("unable to close %s with %s %s", toclose.tg, tag, xml.check_error(top,toclose) or "")
+ errorstr = format("unable to close %s with %s %s", toclose.tg, tag, xml.checkerror(top,toclose) or "")
end
dt = top.dt
dt[#dt+1] = toclose
@@ -4233,24 +6511,29 @@ local reported_attribute_errors = { }
local function attribute_value_error(str)
if not reported_attribute_errors[str] then
- logs.report("xml","invalid attribute value: %q",str)
+ report_xml("invalid attribute value: %q",str)
reported_attribute_errors[str] = true
at._error_ = str
end
return str
end
+
local function attribute_specification_error(str)
if not reported_attribute_errors[str] then
- logs.report("xml","invalid attribute specification: %q",str)
+ report_xml("invalid attribute specification: %q",str)
reported_attribute_errors[str] = true
at._error_ = str
end
return str
end
-function xml.unknown_dec_entity_format(str) return (str == "" and "&error;") or format("&%s;",str) end
-function xml.unknown_hex_entity_format(str) return format("&#x%s;",str) end
-function xml.unknown_any_entity_format(str) return format("&#x%s;",str) end
+xml.placeholders = {
+ unknown_dec_entity = function(str) return (str == "" and "&error;") or format("&%s;",str) end,
+ unknown_hex_entity = function(str) return format("&#x%s;",str) end,
+ unknown_any_entity = function(str) return format("&#x%s;",str) end,
+}
+
+local placeholders = xml.placeholders
local function fromhex(s)
local n = tonumber(s,16)
@@ -4304,18 +6587,18 @@ local function handle_hex_entity(str)
h = unify_predefined and predefined_unified[n]
if h then
if trace_entities then
- logs.report("xml","utfize, converting hex entity &#x%s; into %s",str,h)
+ report_xml("utfize, converting hex entity &#x%s; into %s",str,h)
end
elseif utfize then
- h = (n and utfchar(n)) or xml.unknown_hex_entity_format(str) or ""
+ h = (n and utfchar(n)) or xml.unknown_hex_entity(str) or ""
if not n then
- logs.report("xml","utfize, ignoring hex entity &#x%s;",str)
+ report_xml("utfize, ignoring hex entity &#x%s;",str)
elseif trace_entities then
- logs.report("xml","utfize, converting hex entity &#x%s; into %s",str,h)
+ report_xml("utfize, converting hex entity &#x%s; into %s",str,h)
end
else
if trace_entities then
- logs.report("xml","found entity &#x%s;",str)
+ report_xml("found entity &#x%s;",str)
end
h = "&#x" .. str .. ";"
end
@@ -4331,18 +6614,18 @@ local function handle_dec_entity(str)
d = unify_predefined and predefined_unified[n]
if d then
if trace_entities then
- logs.report("xml","utfize, converting dec entity &#%s; into %s",str,d)
+ report_xml("utfize, converting dec entity &#%s; into %s",str,d)
end
elseif utfize then
- d = (n and utfchar(n)) or xml.unknown_dec_entity_format(str) or ""
+ d = (n and utfchar(n)) or placeholders.unknown_dec_entity(str) or ""
if not n then
- logs.report("xml","utfize, ignoring dec entity &#%s;",str)
+ report_xml("utfize, ignoring dec entity &#%s;",str)
elseif trace_entities then
- logs.report("xml","utfize, converting dec entity &#%s; into %s",str,h)
+ report_xml("utfize, converting dec entity &#%s; into %s",str,h)
end
else
if trace_entities then
- logs.report("xml","found entity &#%s;",str)
+ report_xml("found entity &#%s;",str)
end
d = "&#" .. str .. ";"
end
@@ -4367,20 +6650,21 @@ local function handle_any_entity(str)
end
if a then
if trace_entities then
- logs.report("xml","resolved entity &%s; -> %s (internal)",str,a)
+ report_xml("resolved entity &%s; -> %s (internal)",str,a)
end
a = lpegmatch(parsedentity,a) or a
else
- if xml.unknown_any_entity_format then
- a = xml.unknown_any_entity_format(str) or ""
+ local unknown_any_entity = placeholders.unknown_any_entity
+ if unknown_any_entity then
+ a = unknown_any_entity(str) or ""
end
if a then
if trace_entities then
- logs.report("xml","resolved entity &%s; -> %s (external)",str,a)
+ report_xml("resolved entity &%s; -> %s (external)",str,a)
end
else
if trace_entities then
- logs.report("xml","keeping entity &%s;",str)
+ report_xml("keeping entity &%s;",str)
end
if str == "" then
a = "&error;"
@@ -4392,7 +6676,7 @@ local function handle_any_entity(str)
acache[str] = a
elseif trace_entities then
if not acache[str] then
- logs.report("xml","converting entity &%s; into %s",str,a)
+ report_xml("converting entity &%s; into %s",str,a)
acache[str] = a
end
end
@@ -4401,7 +6685,7 @@ local function handle_any_entity(str)
local a = acache[str]
if not a then
if trace_entities then
- logs.report("xml","found entity &%s;",str)
+ report_xml("found entity &%s;",str)
end
a = resolve_predefined and predefined_simplified[str]
if a then
@@ -4420,7 +6704,7 @@ local function handle_any_entity(str)
end
local function handle_end_entity(chr)
- logs.report("xml","error in entity, %q found instead of ';'",chr)
+ report_xml("error in entity, %q found instead of ';'",chr)
end
local space = S(' \r\n\t')
@@ -4555,7 +6839,7 @@ local function xmlconvert(data, settings)
resolve_predefined = settings.resolve_predefined_entities -- in case we have escaped entities
unify_predefined = settings.unify_predefined_entities -- &#038; -> &amp;
cleanup = settings.text_cleanup
- stack, top, at, xmlns, errorstr, result, entities = { }, { }, { }, { }, nil, nil, settings.entities or { }
+ stack, top, at, xmlns, errorstr, entities = { }, { }, { }, { }, nil, settings.entities or { }
acache, hcache, dcache = { }, { }, { } -- not stored
reported_attribute_errors = { }
if settings.parent_root then
@@ -4583,16 +6867,17 @@ local function xmlconvert(data, settings)
else
errorstr = "invalid xml file - no text at all"
end
+ local result
if errorstr and errorstr ~= "" then
result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={ }, er = true } } }
setmetatable(stack, mt)
- local error_handler = settings.error_handler
- if error_handler == false then
+ local errorhandler = settings.error_handler
+ if errorhandler == false then
-- no error message
else
- error_handler = error_handler or xml.error_handler
- if error_handler then
- xml.error_handler("load",errorstr)
+ errorhandler = errorhandler or xml.errorhandler
+ if errorhandler then
+ xml.errorhandler("load",errorstr)
end
end
else
@@ -4652,7 +6937,7 @@ function xml.is_valid(root)
return root and not root.error
end
-xml.error_handler = (logs and logs.report) or (input and logs.report) or print
+xml.errorhandler = report
--[[ldx--
<p>We cannot load an <l n='lpeg'/> from a filehandle so we need to load
@@ -4763,7 +7048,7 @@ local function verbose_element(e,handlers)
ats[#ats+1] = format('%s=%q',k,v)
end
end
- if ern and trace_remap and ern ~= ens then
+ if ern and trace_entities and ern ~= ens then
ens = ern
end
if ens ~= "" then
@@ -4868,7 +7153,7 @@ local function serialize(e,handlers,...)
-- elseif type(e) == "string" then
-- functions["@tx@"](e,handlers)
else
- functions["@dc@"](e,handlers)
+ functions["@dc@"](e,handlers) -- dc ?
end
if finalize then
return finalize()
@@ -4894,7 +7179,7 @@ local function newhandlers(settings)
if settings then
for k,v in next, settings do
if type(v) == "table" then
- tk = t[k] if not tk then tk = { } t[k] = tk end
+ local tk = t[k] if not tk then tk = { } t[k] = tk end
for kk,vv in next, v do
tk[kk] = vv
end
@@ -4906,6 +7191,7 @@ local function newhandlers(settings)
handlers[settings.name] = t
end
end
+ utilities.storage.mark(t)
return t
end
@@ -5005,7 +7291,7 @@ local function xmltext(root) -- inline
return (root and xmltostring(root)) or ""
end
-function initialize_mt(root)
+initialize_mt = function(root) -- redefinition
mt = { __tostring = xmltext, __index = root }
end
@@ -5040,7 +7326,6 @@ xml.string = xmlstring
<p>A few helpers:</p>
--ldx]]--
---~ xmlsetproperty(root,"settings",settings)
function xml.settings(e)
while e do
@@ -5150,6 +7435,7 @@ function xml.makestandalone(root)
end
end
end
+ return root
end
@@ -5166,11 +7452,14 @@ if not modules then modules = { } end modules ['lxml-pth'] = {
}
-- e.ni is only valid after a filter run
+-- todo: B/C/[get first match]
local concat, remove, insert = table.concat, table.remove, table.insert
local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring
local format, upper, lower, gmatch, gsub, find, rep = string.format, string.upper, string.lower, string.gmatch, string.gsub, string.find, string.rep
-local lpegmatch = lpeg.match
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+
+local setmetatableindex = table.setmetatableindex
-- beware, this is not xpath ... e.g. position is different (currently) and
-- we have reverse-sibling as reversed preceding sibling
@@ -5202,23 +7491,33 @@ local trace_lpath = false if trackers then trackers.register("xml.path",
local trace_lparse = false if trackers then trackers.register("xml.parse", function(v) trace_lparse = v end) end
local trace_lprofile = false if trackers then trackers.register("xml.profile", function(v) trace_lpath = v trace_lparse = v trace_lprofile = v end) end
+local report_lpath = logs.reporter("xml","lpath")
+
--[[ldx--
<p>We've now arrived at an interesting part: accessing the tree using a subset
of <l n='xpath'/> and since we're not compatible we call it <l n='lpath'/>. We
will explain more about its usage in other documents.</p>
--ldx]]--
+local xml = xml
+
local lpathcalls = 0 function xml.lpathcalls () return lpathcalls end
local lpathcached = 0 function xml.lpathcached() return lpathcached end
-xml.functions = xml.functions or { } -- internal
-xml.expressions = xml.expressions or { } -- in expressions
-xml.finalizers = xml.finalizers or { } -- fast do-with ... (with return value other than collection)
-xml.specialhandler = xml.specialhandler or { }
+xml.functions = xml.functions or { } -- internal
+local functions = xml.functions
+
+xml.expressions = xml.expressions or { } -- in expressions
+local expressions = xml.expressions
+
+xml.finalizers = xml.finalizers or { } -- fast do-with ... (with return value other than collection)
+local finalizers = xml.finalizers
-local functions = xml.functions
-local expressions = xml.expressions
-local finalizers = xml.finalizers
+xml.specialhandler = xml.specialhandler or { }
+local specialhandler = xml.specialhandler
+
+lpegpatterns.xml = lpegpatterns.xml or { }
+local xmlpatterns = lpegpatterns.xml
finalizers.xml = finalizers.xml or { }
finalizers.tex = finalizers.tex or { }
@@ -5228,14 +7527,14 @@ local function fallback (t, name)
if fn then
t[name] = fn
else
- logs.report("xml","unknown sub finalizer '%s'",tostring(name))
+ report_lpath("unknown sub finalizer '%s'",tostring(name))
fn = function() end
end
return fn
end
-setmetatable(finalizers.xml, { __index = fallback })
-setmetatable(finalizers.tex, { __index = fallback })
+setmetatableindex(finalizers.xml, fallback)
+setmetatableindex(finalizers.tex, fallback)
xml.defaultprotocol = "xml"
@@ -5283,102 +7582,106 @@ apply_axis['root'] = function(list)
rt = ll
end
end
- collected[#collected+1] = rt
+ collected[l] = rt
end
return collected
end
apply_axis['self'] = function(list)
---~ local collected = { }
---~ for l=1,#list do
---~ collected[#collected+1] = list[l]
---~ end
---~ return collected
return list
end
apply_axis['child'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local dt = ll.dt
- local en = 0
- for k=1,#dt do
- local dk = dt[k]
- if dk.tg then
- collected[#collected+1] = dk
- dk.ni = k -- refresh
- en = en + 1
- dk.ei = en
+ if dt then -- weird that this is needed
+ local en = 0
+ for k=1,#dt do
+ local dk = dt[k]
+ if dk.tg then
+ c = c + 1
+ collected[c] = dk
+ dk.ni = k -- refresh
+ en = en + 1
+ dk.ei = en
+ end
end
+ ll.en = en
end
- ll.en = en
end
return collected
end
-local function collect(list,collected)
+local function collect(list,collected,c)
local dt = list.dt
if dt then
local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
- collected[#collected+1] = dk
+ c = c + 1
+ collected[c] = dk
dk.ni = k -- refresh
en = en + 1
dk.ei = en
- collect(dk,collected)
+ c = collect(dk,collected,c)
end
end
list.en = en
end
+ return c
end
apply_axis['descendant'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
- collect(list[l],collected)
+ c = collect(list[l],collected,c)
end
return collected
end
-local function collect(list,collected)
+local function collect(list,collected,c)
local dt = list.dt
if dt then
local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
- collected[#collected+1] = dk
+ c = c + 1
+ collected[c] = dk
dk.ni = k -- refresh
en = en + 1
dk.ei = en
- collect(dk,collected)
+ c = collect(dk,collected,c)
end
end
list.en = en
end
+ return c
end
apply_axis['descendant-or-self'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
if ll.special ~= true then -- catch double root
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
- collect(ll,collected)
+ c = collect(ll,collected,c)
end
return collected
end
apply_axis['ancestor'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
while ll do
ll = ll.__p__
if ll then
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
end
end
@@ -5386,14 +7689,16 @@ apply_axis['ancestor'] = function(list)
end
apply_axis['ancestor-or-self'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
while ll do
ll = ll.__p__
if ll then
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
end
end
@@ -5401,11 +7706,12 @@ apply_axis['ancestor-or-self'] = function(list)
end
apply_axis['parent'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local pl = list[l].__p__
if pl then
- collected[#collected+1] = pl
+ c = c + 1
+ collected[c] = pl
end
end
return collected
@@ -5420,43 +7726,15 @@ apply_axis['namespace'] = function(list)
end
apply_axis['following'] = function(list) -- incomplete
---~ local collected = { }
---~ for l=1,#list do
---~ local ll = list[l]
---~ local p = ll.__p__
---~ local d = p.dt
---~ for i=ll.ni+1,#d do
---~ local di = d[i]
---~ if type(di) == "table" then
---~ collected[#collected+1] = di
---~ break
---~ end
---~ end
---~ end
---~ return collected
return { }
end
apply_axis['preceding'] = function(list) -- incomplete
---~ local collected = { }
---~ for l=1,#list do
---~ local ll = list[l]
---~ local p = ll.__p__
---~ local d = p.dt
---~ for i=ll.ni-1,1,-1 do
---~ local di = d[i]
---~ if type(di) == "table" then
---~ collected[#collected+1] = di
---~ break
---~ end
---~ end
---~ end
---~ return collected
return { }
end
apply_axis['following-sibling'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -5464,7 +7742,8 @@ apply_axis['following-sibling'] = function(list)
for i=ll.ni+1,#d do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -5472,7 +7751,7 @@ apply_axis['following-sibling'] = function(list)
end
apply_axis['preceding-sibling'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -5480,7 +7759,8 @@ apply_axis['preceding-sibling'] = function(list)
for i=1,ll.ni-1 do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -5488,7 +7768,7 @@ apply_axis['preceding-sibling'] = function(list)
end
apply_axis['reverse-sibling'] = function(list) -- reverse preceding
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -5496,7 +7776,8 @@ apply_axis['reverse-sibling'] = function(list) -- reverse preceding
for i=ll.ni-1,1,-1 do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -5522,7 +7803,7 @@ local function apply_nodes(list,directive,nodes)
return { }
end
else
- local collected, m, p = { }, 0, nil
+ local collected, c, m, p = { }, 0, 0, nil
if not nns then -- only check tag
for l=1,#list do
local ll = list[l]
@@ -5531,11 +7812,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ntg == ltg then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif ntg ~= ltg then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5547,11 +7830,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if lns == nns then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif lns ~= nns then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5565,11 +7850,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif not ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5577,7 +7864,7 @@ local function apply_nodes(list,directive,nodes)
return collected
end
else
- local collected, m, p = { }, 0, nil
+ local collected, c, m, p = { }, 0, 0, nil
for l=1,#list do
local ll = list[l]
local ltg = ll.tg
@@ -5594,11 +7881,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif not ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -5609,12 +7898,13 @@ end
local quit_expression = false
local function apply_expression(list,expression,order)
- local collected = { }
+ local collected, c = { }, 0
quit_expression = false
for l=1,#list do
local ll = list[l]
if expression(list,ll,l,order) then -- nasty, order alleen valid als n=1
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
if quit_expression then
break
@@ -5653,7 +7943,9 @@ local lp_builtin = P (
P("ns") / "ll.ns"
) * ((spaces * P("(") * spaces * P(")"))/"")
-local lp_attribute = (P("@") + P("attribute::")) / "" * Cc("(ll.at and ll.at['") * R("az","AZ","--","__")^1 * Cc("'])")
+-- for the moment we keep namespaces with attributes
+
+local lp_attribute = (P("@") + P("attribute::")) / "" * Cc("(ll.at and ll.at['") * ((R("az","AZ") + S("-_:"))^1) * Cc("'])")
local lp_fastpos_p = ((P("+")^0 * R("09")^1 * P(-1)) / function(s) return "l==" .. s end)
local lp_fastpos_n = ((P("-") * R("09")^1 * P(-1)) / function(s) return "(" .. s .. "<0 and (#list+".. s .. "==l))" end)
local lp_fastpos = lp_fastpos_n + lp_fastpos_p
@@ -5714,14 +8006,12 @@ local converter = Cs (
)
cleaner = Cs ( (
---~ lp_fastpos +
lp_reserved +
lp_number +
lp_string +
1 )^1 )
---~ expr
local template_e = [[
local expr = xml.expressions
@@ -5772,13 +8062,13 @@ local skip = { }
local function errorrunner_e(str,cnv)
if not skip[str] then
- logs.report("lpath","error in expression: %s => %s",str,cnv)
+ report_lpath("error in expression: %s => %s",str,cnv)
skip[str] = cnv or str
end
return false
end
local function errorrunner_f(str,arg)
- logs.report("lpath","error in finalizer: %s(%s)",str,arg or "")
+ report_lpath("error in finalizer: %s(%s)",str,arg or "")
return false
end
@@ -5829,7 +8119,7 @@ local special_1 = P("*") * Cc(register_auto_descendant) * Cc(register_all_nodes
local special_2 = P("/") * Cc(register_auto_self)
local special_3 = P("") * Cc(register_auto_self)
-local parser = Ct { "patterns", -- can be made a bit faster by moving pattern outside
+local pathparser = Ct { "patterns", -- can be made a bit faster by moving pattern outside
patterns = spaces * V("protocol") * spaces * (
( V("special") * spaces * P(-1) ) +
@@ -5901,6 +8191,8 @@ local parser = Ct { "patterns", -- can be made a bit faster by moving pattern ou
}
+xmlpatterns.pathparser = pathparser
+
local cache = { }
local function nodesettostring(set,nodetest)
@@ -5910,7 +8202,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[#t+1] = (directive and tg) or format("not(%s)",tg)
+ t[i] = (directive and tg) or format("not(%s)",tg)
end
if nodetest == false then
return format("not(%s)",concat(t,"|"))
@@ -5929,7 +8221,7 @@ local function tagstostring(list)
local ns, tg = li.ns, li.tg
if not ns or ns == "" then ns = "*" end
if not tg or tg == "" then tg = "*" end
- t[#t+1] = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg)
+ t[i] = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg)
end
return concat(t," ")
end
@@ -5937,16 +8229,16 @@ end
xml.nodesettostring = nodesettostring
-local parse_pattern -- we have a harmless kind of circular reference
+local lpath -- we have a harmless kind of circular reference
+
+local lshowoptions = { functions = false }
local function lshow(parsed)
if type(parsed) == "string" then
- parsed = parse_pattern(parsed)
+ parsed = lpath(parsed)
end
- local s = table.serialize_functions -- ugly
- table.serialize_functions = false -- ugly
- logs.report("lpath","%s://%s => %s",parsed.protocol or xml.defaultprotocol,parsed.pattern,table.serialize(parsed,false))
- table.serialize_functions = s -- ugly
+ report_lpath("%s://%s => %s",parsed.protocol or xml.defaultprotocol,parsed.pattern,
+ table.serialize(parsed,false,lshowoptions))
end
xml.lshow = lshow
@@ -5960,7 +8252,7 @@ local function add_comment(p,str)
end
end
-parse_pattern = function (pattern) -- the gain of caching is rather minimal
+lpath = function (pattern) -- the gain of caching is rather minimal
lpathcalls = lpathcalls + 1
if type(pattern) == "table" then
return pattern
@@ -5969,13 +8261,13 @@ parse_pattern = function (pattern) -- the gain of caching is rather minimal
if parsed then
lpathcached = lpathcached + 1
else
- parsed = lpegmatch(parser,pattern)
+ parsed = lpegmatch(pathparser,pattern)
if parsed then
parsed.pattern = pattern
local np = #parsed
if np == 0 then
parsed = { pattern = pattern, register_self, state = "parsing error" }
- logs.report("lpath","parsing error in '%s'",pattern)
+ report_lpath("parsing error in '%s'",pattern)
lshow(parsed)
else
-- we could have done this with a more complex parser but this
@@ -6017,6 +8309,8 @@ parse_pattern = function (pattern) -- the gain of caching is rather minimal
end
end
+xml.lpath = lpath
+
-- we can move all calls inline and then merge the trace back
-- technically we can combine axis and the next nodes which is
-- what we did before but this a bit cleaner (but slower too)
@@ -6079,32 +8373,32 @@ local function traced_apply(list,parsed,nofparsed,order)
if trace_lparse then
lshow(parsed)
end
- logs.report("lpath", "collecting : %s",parsed.pattern)
- logs.report("lpath", " root tags : %s",tagstostring(list))
- logs.report("lpath", " order : %s",order or "unset")
+ report_lpath("collecting: %s",parsed.pattern)
+ report_lpath("root tags : %s",tagstostring(list))
+ report_lpath("order : %s",order or "unset")
local collected = list
for i=1,nofparsed do
local pi = parsed[i]
local kind = pi.kind
if kind == "axis" then
collected = apply_axis[pi.axis](collected)
- logs.report("lpath", "% 10i : ax : %s",(collected and #collected) or 0,pi.axis)
+ report_lpath("% 10i : ax : %s",(collected and #collected) or 0,pi.axis)
elseif kind == "nodes" then
collected = apply_nodes(collected,pi.nodetest,pi.nodes)
- logs.report("lpath", "% 10i : ns : %s",(collected and #collected) or 0,nodesettostring(pi.nodes,pi.nodetest))
+ report_lpath("% 10i : ns : %s",(collected and #collected) or 0,nodesettostring(pi.nodes,pi.nodetest))
elseif kind == "expression" then
collected = apply_expression(collected,pi.evaluator,order)
- logs.report("lpath", "% 10i : ex : %s -> %s",(collected and #collected) or 0,pi.expression,pi.converted)
+ report_lpath("% 10i : ex : %s -> %s",(collected and #collected) or 0,pi.expression,pi.converted)
elseif kind == "finalizer" then
collected = pi.finalizer(collected)
- logs.report("lpath", "% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pi.name,pi.arguments or "")
+ report_lpath("% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pi.name,pi.arguments or "")
return collected
end
if not collected or #collected == 0 then
local pn = i < nofparsed and parsed[nofparsed]
if pn and pn.kind == "finalizer" then
collected = pn.finalizer(collected)
- logs.report("lpath", "% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pn.name,pn.arguments or "")
+ report_lpath("% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pn.name,pn.arguments or "")
return collected
end
return nil
@@ -6141,8 +8435,11 @@ local function normal_apply(list,parsed,nofparsed,order)
return collected
end
-local function parse_apply(list,pattern)
- -- we avoid an extra call
+
+local function applylpath(list,pattern)
+ if not list then
+ return
+ end
local parsed = cache[pattern]
if parsed then
lpathcalls = lpathcalls + 1
@@ -6151,7 +8448,7 @@ local function parse_apply(list,pattern)
lpathcalls = lpathcalls + 1
parsed = pattern
else
- parsed = parse_pattern(pattern) or pattern
+ parsed = lpath(pattern) or pattern
end
if not parsed then
return
@@ -6160,25 +8457,32 @@ local function parse_apply(list,pattern)
if nofparsed == 0 then
return -- something is wrong
end
- local one = list[1]
- if not one then
- return -- something is wrong
- elseif not trace_lpath then
- return normal_apply(list,parsed,nofparsed,one.mi)
+ if not trace_lpath then
+ return normal_apply ({ list },parsed,nofparsed,list.mi)
elseif trace_lprofile then
- return profiled_apply(list,parsed,nofparsed,one.mi)
+ return profiled_apply({ list },parsed,nofparsed,list.mi)
else
- return traced_apply(list,parsed,nofparsed,one.mi)
+ return traced_apply ({ list },parsed,nofparsed,list.mi)
end
end
+xml.applylpath = applylpath -- takes a table as first argment, which is what xml.filter will do
+
+--[[ldx--
+<p>This is the main filter function. It returns whatever is asked for.</p>
+--ldx]]--
+
+function xml.filter(root,pattern) -- no longer funny attribute handling here
+ return applylpath(root,pattern)
+end
+
-- internal (parsed)
expressions.child = function(e,pattern)
- return parse_apply({ e },pattern) -- todo: cache
+ return applylpath(e,pattern) -- todo: cache
end
expressions.count = function(e,pattern)
- local collected = parse_apply({ e },pattern) -- todo: cache
+ local collected = applylpath(e,pattern) -- todo: cache
return (collected and #collected) or 0
end
@@ -6188,7 +8492,7 @@ expressions.oneof = function(s,...) -- slow
local t = {...} for i=1,#t do if s == t[i] then return true end end return false
end
expressions.error = function(str)
- xml.error_handler("unknown function in lpath expression",tostring(str or "?"))
+ xml.errorhandler("unknown function in lpath expression",tostring(str or "?"))
return false
end
expressions.undefined = function(s)
@@ -6217,8 +8521,8 @@ expressions.boolean = toboolean
-- user interface
local function traverse(root,pattern,handle)
- logs.report("xml","use 'xml.selection' instead for '%s'",pattern)
- local collected = parse_apply({ root },pattern)
+ report_lpath("use 'xml.selection' instead for '%s'",pattern)
+ local collected = applylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6229,7 +8533,7 @@ local function traverse(root,pattern,handle)
end
local function selection(root,pattern,handle)
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if handle then
for c=1,#collected do
@@ -6241,19 +8545,9 @@ local function selection(root,pattern,handle)
end
end
-xml.parse_parser = parser
-xml.parse_pattern = parse_pattern
-xml.parse_apply = parse_apply
xml.traverse = traverse -- old method, r, d, k
xml.selection = selection -- new method, simple handle
-local lpath = parse_pattern
-
-xml.lpath = lpath
-
-function xml.cached_patterns()
- return cache
-end
-- generic function finalizer (independant namespace)
@@ -6265,13 +8559,13 @@ local function dofunction(collected,fnc)
f(collected[c])
end
else
- logs.report("xml","unknown function '%s'",fnc)
+ report_lpath("unknown function '%s'",fnc)
end
end
end
-xml.finalizers.xml["function"] = dofunction
-xml.finalizers.tex["function"] = dofunction
+finalizers.xml["function"] = dofunction
+finalizers.tex["function"] = dofunction
-- functions
@@ -6364,14 +8658,6 @@ expressions.tag = function(e,n) -- only tg
end
--[[ldx--
-<p>This is the main filter function. It returns whatever is asked for.</p>
---ldx]]--
-
-function xml.filter(root,pattern) -- no longer funny attribute handling here
- return parse_apply({ root },pattern)
-end
-
---[[ldx--
<p>Often using an iterators looks nicer in the code than passing handler
functions. The <l n='lua'/> book describes how to use coroutines for that
purpose (<url href='http://www.lua.org/pil/9.3.html'/>). This permits
@@ -6390,7 +8676,7 @@ end
local wrap, yield = coroutine.wrap, coroutine.yield
function xml.elements(root,pattern,reverse) -- r, d, k
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if reverse then
return wrap(function() for c=#collected,1,-1 do
@@ -6406,7 +8692,7 @@ function xml.elements(root,pattern,reverse) -- r, d, k
end
function xml.collected(root,pattern,reverse) -- e
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if reverse then
return wrap(function() for c=#collected,1,-1 do yield(collected[c]) end end)
@@ -6417,6 +8703,15 @@ function xml.collected(root,pattern,reverse) -- e
return wrap(function() end)
end
+-- handy
+
+function xml.inspect(collection,pattern)
+ pattern = pattern or "."
+ for e in xml.collected(collection,pattern or ".") do
+ report_lpath("pattern %q\n\n%s\n",pattern,xml.tostring(e))
+ end
+end
+
end -- of closure
@@ -6430,10 +8725,16 @@ if not modules then modules = { } end modules ['lxml-mis'] = {
license = "see context related readme files"
}
+local xml, lpeg, string = xml, lpeg, string
+
local concat = table.concat
local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring
local format, gsub, match = string.format, string.gsub, string.match
-local lpegmatch = lpeg.match
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs
+
+lpegpatterns.xml = lpegpatterns.xml or { }
+local xmlpatterns = lpegpatterns.xml
--[[ldx--
<p>The following helper functions best belong to the <t>lxml-ini</t>
@@ -6457,9 +8758,8 @@ local function xmlgsub(t,old,new) -- will be replaced
end
end
---~ xml.gsub = xmlgsub
-function xml.strip_leading_spaces(dk,d,k) -- cosmetic, for manual
+function xml.stripleadingspaces(dk,d,k) -- cosmetic, for manual
if d and k then
local dkm = d[k-1]
if dkm and type(dkm) == "string" then
@@ -6469,14 +8769,7 @@ function xml.strip_leading_spaces(dk,d,k) -- cosmetic, for manual
end
end
---~ xml.escapes = { ['&'] = '&amp;', ['<'] = '&lt;', ['>'] = '&gt;', ['"'] = '&quot;' }
---~ xml.unescapes = { } for k,v in next, xml.escapes do xml.unescapes[v] = k end
---~ function xml.escaped (str) return (gsub(str,"(.)" , xml.escapes )) end
---~ function xml.unescaped(str) return (gsub(str,"(&.-;)", xml.unescapes)) end
---~ function xml.cleansed (str) return (gsub(str,"<.->" , '' )) end -- "%b<>"
-
-local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs
-- 100 * 2500 * "oeps< oeps> oeps&" : gsub:lpeg|lpeg|lpeg
--
@@ -6502,9 +8795,9 @@ local unescaped = Cs(normal * (special * normal)^0)
local cleansed = Cs(((P("<") * (1-P(">"))^0 * P(">"))/"" + 1)^0)
-xml.escaped_pattern = escaped
-xml.unescaped_pattern = unescaped
-xml.cleansed_pattern = cleansed
+xmlpatterns.escaped = escaped
+xmlpatterns.unescaped = unescaped
+xmlpatterns.cleansed = cleansed
function xml.escaped (str) return lpegmatch(escaped,str) end
function xml.unescaped(str) return lpegmatch(unescaped,str) end
@@ -6540,15 +8833,20 @@ if not modules then modules = { } end modules ['lxml-aux'] = {
local trace_manipulations = false trackers.register("lxml.manipulations", function(v) trace_manipulations = v end)
-local xmlparseapply, xmlconvert, xmlcopy, xmlname = xml.parse_apply, xml.convert, xml.copy, xml.name
+local report_xml = logs.reporter("xml")
+
+local xml = xml
+
+local xmlconvert, xmlcopy, xmlname = xml.convert, xml.copy, xml.name
local xmlinheritedconvert = xml.inheritedconvert
+local xmlapplylpath = xml.applylpath
-local type = type
-local insert, remove = table.insert, table.remove
+local type, setmetatable, getmetatable = type, setmetatable, getmetatable
+local insert, remove, fastcopy = table.insert, table.remove, table.fastcopy
local gmatch, gsub = string.gmatch, string.gsub
local function report(what,pattern,c,e)
- logs.report("xml","%s element '%s' (root: '%s', position: %s, index: %s, pattern: %s)",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
+ report_xml("%s element '%s' (root: '%s', position: %s, index: %s, pattern: %s)",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
end
local function withelements(e,handle,depth)
@@ -6602,10 +8900,8 @@ function xml.withelement(e,n,handle) -- slow
end
end
-xml.elements_only = xml.collected
-
-function xml.each_element(root,pattern,handle,reverse)
- local collected = xmlparseapply({ root },pattern)
+function xml.each(root,pattern,handle,reverse)
+ local collected = xmlapplylpath(root,pattern)
if collected then
if reverse then
for c=#collected,1,-1 do
@@ -6620,10 +8916,8 @@ function xml.each_element(root,pattern,handle,reverse)
end
end
-xml.process_elements = xml.each_element
-
-function xml.process_attributes(root,pattern,handle)
- local collected = xmlparseapply({ root },pattern)
+function xml.processattributes(root,pattern,handle)
+ local collected = xmlapplylpath(root,pattern)
if collected and handle then
for c=1,#collected do
handle(collected[c].at)
@@ -6638,12 +8932,12 @@ end
-- are these still needed -> lxml-cmp.lua
-function xml.collect_elements(root, pattern)
- return xmlparseapply({ root },pattern)
+function xml.collect(root, pattern)
+ return xmlapplylpath(root,pattern)
end
-function xml.collect_texts(root, pattern, flatten) -- todo: variant with handle
- local collected = xmlparseapply({ root },pattern)
+function xml.collecttexts(root, pattern, flatten) -- todo: variant with handle
+ local collected = xmlapplylpath(root,pattern)
if collected and flatten then
local xmltostring = xml.tostring
for c=1,#collected do
@@ -6654,18 +8948,19 @@ function xml.collect_texts(root, pattern, flatten) -- todo: variant with handle
end
function xml.collect_tags(root, pattern, nonamespace)
- local collected = xmlparseapply({ root },pattern)
+ local collected = xmlapplylpath(root,pattern)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
local e = collected[c]
local ns, tg = e.ns, e.tg
+ n = n + 1
if nonamespace then
- t[#t+1] = tg
+ t[n] = tg
elseif ns == "" then
- t[#t+1] = tg
+ t[n] = tg
else
- t[#t+1] = ns .. ":" .. tg
+ t[n] = ns .. ":" .. tg
end
end
return t
@@ -6678,7 +8973,7 @@ end
local no_root = { no_root = true }
-function xml.redo_ni(d)
+local function redo_ni(d)
for k=1,#d do
local dk = d[k]
if type(dk) == "table" then
@@ -6701,12 +8996,7 @@ local function xmltoelement(whatever,root)
return whatever -- string
end
if element then
- --~ if element.ri then
- --~ element = element.dt[element.ri].dt
- --~ else
- --~ element = element.dt
- --~ end
- end
+ end
return element
end
@@ -6724,8 +9014,8 @@ local function copiedelement(element,newparent)
end
end
-function xml.delete_element(root,pattern)
- local collected = xmlparseapply({ root },pattern)
+function xml.delete(root,pattern)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6736,15 +9026,15 @@ function xml.delete_element(root,pattern)
end
local d = p.dt
remove(d,e.ni)
- xml.redo_ni(d) -- can be made faster and inlined
+ redo_ni(d) -- can be made faster and inlined
end
end
end
end
-function xml.replace_element(root,pattern,whatever)
+function xml.replace(root,pattern,whatever)
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6755,15 +9045,50 @@ function xml.replace_element(root,pattern,whatever)
end
local d = p.dt
d[e.ni] = copiedelement(element,p)
- xml.redo_ni(d) -- probably not needed
+ redo_ni(d) -- probably not needed
+ end
+ end
+ end
+end
+
+local function wrap(e,wrapper)
+ local t = {
+ rn = e.rn,
+ tg = e.tg,
+ ns = e.ns,
+ at = e.at,
+ dt = e.dt,
+ __p__ = e,
+ }
+ setmetatable(t,getmetatable(e))
+ e.rn = wrapper.rn or e.rn or ""
+ e.tg = wrapper.tg or e.tg or ""
+ e.ns = wrapper.ns or e.ns or ""
+ e.at = fastcopy(wrapper.at)
+ e.dt = { t }
+end
+
+function xml.wrap(root,pattern,whatever)
+ if whatever then
+ local wrapper = xmltoelement(whatever,root)
+ local collected = xmlapplylpath(root,pattern)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ if trace_manipulations then
+ report('wrapping',pattern,c,e)
+ end
+ wrap(e,wrapper)
end
end
+ else
+ wrap(root,xmltoelement(pattern))
end
end
local function inject_element(root,pattern,whatever,prepend)
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6778,15 +9103,17 @@ local function inject_element(root,pattern,whatever,prepend)
else
be, af = edt, cp
end
+ local bn = #be
for i=1,#af do
- be[#be+1] = af[i]
+ bn = bn + 1
+ be[bn] = af[i]
end
if rri then
r.dt[rri].dt = be
else
d[k].dt = be
end
- xml.redo_ni(d)
+ redo_ni(d)
end
end
end
@@ -6794,7 +9121,7 @@ end
local function insert_element(root,pattern,whatever,before) -- todo: element als functie
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -6804,24 +9131,23 @@ local function insert_element(root,pattern,whatever,before) -- todo: element als
k = k + 1
end
insert(d,k,copiedelement(element,r))
- xml.redo_ni(d)
+ redo_ni(d)
end
end
end
-xml.insert_element = insert_element
-xml.insert_element_after = insert_element
-xml.insert_element_before = function(r,p,e) insert_element(r,p,e,true) end
-xml.inject_element = inject_element
-xml.inject_element_after = inject_element
-xml.inject_element_before = function(r,p,e) inject_element(r,p,e,true) end
+xml.insert_element = insert_element
+xml.insertafter = insert_element
+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 collected = xmlparseapply({ xmldata },pattern)
+ local collected = xmlapplylpath(xmldata,pattern)
if collected then
for c=1,#collected do
local ek = collected[c]
@@ -6830,7 +9156,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
local ekat = ek.at
local epdt = ek.__p__.dt
if not attribute or attribute == "" then
- name = (type(ekdt) == "table" and ekdt[1]) or ekdt -- ckeck, probably always tab or str
+ 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
@@ -6845,9 +9171,6 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
-- 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)
@@ -6864,136 +9187,88 @@ end
xml.include = include
---~ local function manipulate(xmldata,pattern,manipulator) -- untested and might go away
---~ local collected = xmlparseapply({ xmldata },pattern)
---~ if collected then
---~ local xmltostring = xml.tostring
---~ for c=1,#collected do
---~ local e = collected[c]
---~ local data = manipulator(xmltostring(e))
---~ if data == "" then
---~ epdt[e.ni] = ""
---~ else
---~ local xi = xmlinheritedconvert(data,xmldata)
---~ if not xi then
---~ epdt[e.ni] = ""
---~ else
---~ epdt[e.ni] = xml.body(xi) -- xml.assign(d,k,xi)
---~ end
---~ end
---~ end
---~ end
---~ end
-
---~ xml.manipulate = manipulate
-
-function xml.strip_whitespace(root, pattern, nolines) -- strips all leading and trailing space !
- local collected = xmlparseapply({ root },pattern)
- if collected then
- for i=1,#collected do
- local e = collected[i]
- local edt = e.dt
- if edt then
- local t = { }
- for i=1,#edt do
- local str = edt[i]
- if type(str) == "string" then
- if str == "" then
- -- stripped
- else
- if nolines then
- str = gsub(str,"[ \n\r\t]+"," ")
- end
- if str == "" then
- -- stripped
- else
- t[#t+1] = str
- end
- end
+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 str = edt[e]
+ if type(str) ~= "string" then
+ n = n + 1
+ t[n] = str
+ elseif str ~= "" then
+ -- todo: lpeg for each case
+ if nolines then
+ str = gsub(str,"%s+"," ")
+ end
+ str = gsub(str,"^%s*(.-)%s*$","%1")
+ if str ~= "" then
+ n = n + 1
+ t[n] = 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
+ remove(edt,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
+ 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 str == "" then
+ remove(edt)
else
- --~ str.ni = i
- t[#t+1] = str
+ edt[nedt] = str
end
end
- e.dt = t
end
end
end
+ return e -- convenient
end
-function xml.strip_whitespace(root, pattern, nolines, anywhere) -- strips all leading and trailing spacing
- local collected = xmlparseapply({ root },pattern) -- beware, indices no longer are valid now
+xml.stripelement = stripelement
+
+function xml.strip(root,pattern,nolines,anywhere) -- strips all leading and trailing spacing
+ local collected = xmlapplylpath(root,pattern) -- beware, indices no longer are valid now
if collected then
for i=1,#collected do
- local e = collected[i]
- local edt = e.dt
- if edt then
- if anywhere then
- local t = { }
- for e=1,#edt do
- local str = edt[e]
- if type(str) ~= "string" then
- t[#t+1] = str
- elseif str ~= "" then
- -- todo: lpeg for each case
- if nolines then
- str = gsub(str,"%s+"," ")
- end
- str = gsub(str,"^%s*(.-)%s*$","%1")
- if str ~= "" then
- t[#t+1] = 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
- remove(edt,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
- end
- end
- if #edt > 1 then
- -- strip end
- local str = edt[#edt]
- 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 str == "" then
- remove(edt)
- else
- edt[#edt] = str
- end
- end
- end
- end
- end
+ stripelement(collected[i],nolines,anywhere)
end
end
end
-local function rename_space(root, oldspace, newspace) -- fast variant
+local function renamespace(root, oldspace, newspace) -- fast variant
local ndt = #root.dt
for i=1,ndt or 0 do
local e = root[i]
@@ -7006,16 +9281,16 @@ local function rename_space(root, oldspace, newspace) -- fast variant
end
local edt = e.dt
if edt then
- rename_space(edt, oldspace, newspace)
+ renamespace(edt, oldspace, newspace)
end
end
end
end
-xml.rename_space = rename_space
+xml.renamespace = renamespace
-function xml.remap_tag(root, pattern, newtg)
- local collected = xmlparseapply({ root },pattern)
+function xml.remaptag(root, pattern, newtg)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
collected[c].tg = newtg
@@ -7023,8 +9298,8 @@ function xml.remap_tag(root, pattern, newtg)
end
end
-function xml.remap_namespace(root, pattern, newns)
- local collected = xmlparseapply({ root },pattern)
+function xml.remapnamespace(root, pattern, newns)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
collected[c].ns = newns
@@ -7032,8 +9307,8 @@ function xml.remap_namespace(root, pattern, newns)
end
end
-function xml.check_namespace(root, pattern, newns)
- local collected = xmlparseapply({ root },pattern)
+function xml.checknamespace(root, pattern, newns)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -7044,8 +9319,8 @@ function xml.check_namespace(root, pattern, newns)
end
end
-function xml.remap_name(root, pattern, newtg, newns, newrn)
- local collected = xmlparseapply({ root },pattern)
+function xml.remapname(root, pattern, newtg, newns, newrn)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -7058,18 +9333,34 @@ end
<p>Here are a few synonyms.</p>
--ldx]]--
-xml.each = xml.each_element
-xml.process = xml.process_element
-xml.strip = xml.strip_whitespace
-xml.collect = xml.collect_elements
-xml.all = xml.collect_elements
-
-xml.insert = xml.insert_element_after
-xml.inject = xml.inject_element_after
-xml.after = xml.insert_element_after
-xml.before = xml.insert_element_before
-xml.delete = xml.delete_element
-xml.replace = xml.replace_element
+xml.all = xml.each
+xml.insert = xml.insertafter
+xml.inject = xml.injectafter
+xml.after = xml.insertafter
+xml.before = xml.insertbefore
+xml.process = xml.each
+
+-- obsolete
+
+xml.obsolete = xml.obsolete or { }
+local obsolete = xml.obsolete
+
+xml.strip_whitespace = xml.strip obsolete.strip_whitespace = xml.strip
+xml.collect_elements = xml.collect obsolete.collect_elements = xml.collect
+xml.delete_element = xml.delete obsolete.delete_element = xml.delete
+xml.replace_element = xml.replace obsolete.replace_element = xml.replacet
+xml.each_element = xml.each obsolete.each_element = xml.each
+xml.process_elements = xml.process obsolete.process_elements = xml.process
+xml.insert_element_after = xml.insertafter obsolete.insert_element_after = xml.insertafter
+xml.insert_element_before = xml.insertbefore obsolete.insert_element_before = xml.insertbefore
+xml.inject_element_after = xml.injectafter obsolete.inject_element_after = xml.injectafter
+xml.inject_element_before = xml.injectbefore obsolete.inject_element_before = xml.injectbefore
+xml.process_attributes = xml.processattributes obsolete.process_attributes = xml.processattributes
+xml.collect_texts = xml.collecttexts obsolete.collect_texts = xml.collecttexts
+xml.inject_element = xml.inject obsolete.inject_element = xml.inject
+xml.remap_tag = xml.remaptag obsolete.remap_tag = xml.remaptag
+xml.remap_name = xml.remapname obsolete.remap_name = xml.remapname
+xml.remap_namespace = xml.remapnamespace obsolete.remap_namespace = xml.remapnamespace
end -- of closure
@@ -7084,10 +9375,15 @@ if not modules then modules = { } end modules ['lxml-xml'] = {
license = "see context related readme files"
}
+local concat = string.concat
+
+local xml = xml
+
local finalizers = xml.finalizers.xml
local xmlfilter = xml.filter -- we could inline this one for speed
local xmltostring = xml.tostring
local xmlserialize = xml.serialize
+local xmlcollected = xml.collected
local function first(collected) -- wrong ?
return collected and collected[1]
@@ -7101,15 +9397,8 @@ local function all(collected)
return collected
end
-local function reverse(collected)
- if collected then
- local reversed = { }
- for c=#collected,1,-1 do
- reversed[#reversed+1] = collected[c]
- end
- return reversed
- end
-end
+
+local reverse = table.reversed
local function attribute(collected,name)
if collected and #collected > 0 then
@@ -7200,11 +9489,12 @@ end
local function texts(collected)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
- local e = collection[c]
+ local e = collected[c]
if e and e.dt then
- t[#t+1] = e.dt
+ n = n + 1
+ t[n] = e.dt
end
end
return t
@@ -7247,14 +9537,15 @@ end
local function tags(collected,nonamespace)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
local e = collected[c]
local ns, tg = e.ns, e.tg
+ n = n + 1
if nonamespace or ns == "" then
- t[#t+1] = tg
+ t[n] = tg
else
- t[#t+1] = ns .. ":" .. tg
+ t[n] = ns .. ":" .. tg
end
end
return t
@@ -7365,293 +9656,273 @@ xml.all = xml.filter
xml.index = xml.position
xml.found = xml.filter
+-- a nice one:
+
+local function totable(x)
+ local t = { }
+ for e in xmlcollected(x[1] or x,"/*") do
+ t[e.tg] = xmltostring(e.dt) or ""
+ end
+ return next(t) and t or nil
+end
+
+xml.table = totable
+finalizers.table = totable
+
+local function textonly(e,t)
+ if e then
+ local edt = e.dt
+ if edt then
+ for i=1,#edt do
+ local e = edt[i]
+ if type(e) == "table" then
+ textonly(e,t)
+ else
+ t[#t+1] = e
+ end
+ end
+ end
+ end
+ return t
+end
+
+function xml.textonly(e) -- no pattern
+ return concat(textonly(e,{}))
+end
+
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['luat-env'] = {
+if not modules then modules = { } end modules ['data-ini'] = {
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"
+ license = "see context related readme files",
}
--- A former version provided functionality for non embeded core
--- scripts i.e. runtime library loading. Given the amount of
--- Lua code we use now, this no longer makes sense. Much of this
--- evolved before bytecode arrays were available and so a lot of
--- code has disappeared already.
+local gsub, find, gmatch = string.gsub, string.find, string.gmatch
+local concat = table.concat
+local next, type = next, type
-local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local filedirname, filebasename, fileextname, filejoin = file.dirname, file.basename, file.extname, file.join
-local format, sub, match, gsub, find = string.format, string.sub, string.match, string.gsub, string.find
-local unquote, quote = string.unquote, string.quote
+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)
--- precautions
+local report_initialization = logs.reporter("resolvers","initialization")
-os.setlocale(nil,nil) -- useless feature and even dangerous in luatex
+local ostype, osname, ossetenv, osgetenv = os.type, os.name, os.setenv, os.getenv
-function os.setlocale()
- -- no way you can mess with it
-end
+-- 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.
--- dirty tricks
+resolvers = resolvers or { }
+local resolvers = resolvers
-if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
- arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil
-end
+-- We don't want the kpse library to kick in. Also, we want to be able to
+-- execute programs. Control over execution is implemented later.
-if profiler and os.env["MTX_PROFILE_RUN"] == "YES" then
- profiler.start("luatex-profile.log")
-end
+texconfig.kpse_init = false
+texconfig.shell_escape = 't'
--- environment
+kpse = { original = kpse }
-environment = environment or { }
-environment.arguments = { }
-environment.files = { }
-environment.sortedflags = nil
+setmetatable(kpse, {
+ __index = function(kp,name)
+ report_initialization("fatal error: kpse library is accessed (key: %s)",name)
+ os.exit()
+ end
+} )
-if not environment.jobname or environment.jobname == "" then if tex then environment.jobname = tex.jobname end end
-if not environment.version or environment.version == "" then environment.version = "unknown" end
-if not environment.jobname then environment.jobname = "unknown" end
+-- First we check a couple of environment variables. Some might be
+-- set already but we need then later on. We start with the system
+-- font path.
-function environment.initialize_arguments(arg)
- local arguments, files = { }, { }
- environment.arguments, environment.files, environment.sortedflags = arguments, files, nil
- for index=1,#arg do
- local argument = arg[index]
- if index > 0 then
- local flag, value = match(argument,"^%-+(.-)=(.-)$")
- if flag then
- arguments[flag] = unquote(value or "")
- else
- flag = match(argument,"^%-+(.+)")
- if flag then
- arguments[flag] = true
- else
- files[#files+1] = argument
- end
- end
- end
+do
+
+ local osfontdir = osgetenv("OSFONTDIR")
+
+ if osfontdir and osfontdir ~= "" then
+ -- ok
+ elseif osname == "windows" then
+ ossetenv("OSFONTDIR","c:/windows/fonts//")
+ elseif osname == "macosx" then
+ ossetenv("OSFONTDIR","$HOME/Library/Fonts//;/Library/Fonts//;/System/Library/Fonts//")
end
- environment.ownname = environment.ownname or arg[0] or 'unknown.lua'
+
end
-function environment.setargument(name,value)
- environment.arguments[name] = value
+-- Next comes the user's home path. We need this as later on we have
+-- to replace ~ with its value.
+
+do
+
+ local homedir = osgetenv(ostype == "windows" and 'USERPROFILE' or 'HOME') or ''
+
+ if not homedir or homedir == "" then
+ homedir = string.char(127) -- we need a value, later we wil trigger on it
+ end
+
+ homedir = file.collapsepath(homedir)
+
+ ossetenv("HOME", homedir) -- can be used in unix cnf files
+ ossetenv("USERPROFILE",homedir) -- can be used in windows cnf files
+
+ environment.homedir = homedir
+
end
--- todo: defaults, better checks e.g on type (boolean versus string)
---
--- tricky: too many hits when we support partials unless we add
--- a registration of arguments so from now on we have 'partial'
+-- The following code sets the name of the own binary and its
+-- path. This is fallback code as we have os.selfdir now.
-function environment.argument(name,partial)
- local arguments, sortedflags = environment.arguments, environment.sortedflags
- if arguments[name] then
- return arguments[name]
- elseif partial then
- if not sortedflags then
- sortedflags = table.sortedkeys(arguments)
- for k=1,#sortedflags do
- sortedflags[k] = "^" .. sortedflags[k]
- end
- environment.sortedflags = sortedflags
+do
+
+ local args = environment.originalarguments or arg -- this needs a cleanup
+
+ local ownbin = environment.ownbin or args[-2] or arg[-2] or args[-1] or arg[-1] or arg[0] or "luatex"
+ local ownpath = environment.ownpath or os.selfdir
+
+ ownbin = file.collapsepath(ownbin)
+ ownpath = file.collapsepath(ownpath)
+
+ if not ownpath or ownpath == "" or ownpath == "unset" then
+ ownpath = args[-1] or arg[-1]
+ ownpath = ownpath and filedirname(gsub(ownpath,"\\","/"))
+ if not ownpath or ownpath == "" then
+ ownpath = args[-0] or arg[-0]
+ ownpath = ownpath and filedirname(gsub(ownpath,"\\","/"))
end
- -- example of potential clash: ^mode ^modefile
- for k=1,#sortedflags do
- local v = sortedflags[k]
- if find(name,v) then
- return arguments[sub(v,2,#v)]
+ local binary = ownbin
+ if not ownpath or ownpath == "" then
+ ownpath = ownpath and filedirname(binary)
+ end
+ if not ownpath or ownpath == "" then
+ if os.binsuffix ~= "" then
+ binary = file.replacesuffix(binary,os.binsuffix)
+ end
+ local path = osgetenv("PATH")
+ if path then
+ for p in gmatch(path,"[^"..io.pathseparator.."]+") do
+ local b = filejoin(p,binary)
+ if lfs.isfile(b) then
+ -- we assume that after changing to the path the currentdir function
+ -- resolves to the real location and use this side effect here; this
+ -- trick is needed because on the mac installations use symlinks in the
+ -- path instead of real locations
+ local olddir = lfs.currentdir()
+ if lfs.chdir(p) then
+ local pp = lfs.currentdir()
+ if trace_locating and p ~= pp then
+ report_initialization("following symlink '%s' to '%s'",p,pp)
+ end
+ ownpath = pp
+ lfs.chdir(olddir)
+ else
+ if trace_locating then
+ report_initialization("unable to check path '%s'",p)
+ end
+ ownpath = p
+ end
+ break
+ end
+ end
end
end
+ if not ownpath or ownpath == "" then
+ ownpath = "."
+ report_initialization("forcing fallback ownpath .")
+ elseif trace_locating then
+ report_initialization("using ownpath '%s'",ownpath)
+ end
end
- return nil
+
+ environment.ownbin = ownbin
+ environment.ownpath = ownpath
+
end
-environment.argument("x",true)
+resolvers.ownpath = environment.ownpath
-function environment.split_arguments(separator) -- rather special, cut-off before separator
- local done, before, after = false, { }, { }
- local original_arguments = environment.original_arguments
- for k=1,#original_arguments do
- local v = original_arguments[k]
- if not done and v == separator then
- done = true
- elseif done then
- after[#after+1] = v
- else
- before[#before+1] = v
- end
- end
- return before, after
+function resolvers.getownpath()
+ return environment.ownpath
end
-function environment.reconstruct_commandline(arg,noquote)
- arg = arg or environment.original_arguments
- if noquote and #arg == 1 then
- local a = arg[1]
- a = resolvers.resolve(a)
- a = unquote(a)
- return a
- elseif #arg > 0 then
- local result = { }
- for i=1,#arg do
- local a = arg[i]
- a = resolvers.resolve(a)
- a = unquote(a)
- a = gsub(a,'"','\\"') -- tricky
- if find(a," ") then
- result[#result+1] = quote(a)
- else
- result[#result+1] = a
- end
- end
- return table.join(result," ")
+-- The self variables permit us to use only a few (or even no)
+-- environment variables.
+
+do
+
+ local ownpath = environment.ownpath or dir.current()
+
+ if ownpath then
+ ossetenv('SELFAUTOLOC', file.collapsepath(ownpath))
+ ossetenv('SELFAUTODIR', file.collapsepath(ownpath .. "/.."))
+ ossetenv('SELFAUTOPARENT', file.collapsepath(ownpath .. "/../.."))
else
- return ""
+ report_initialization("error: unable to locate ownpath")
+ os.exit()
end
+
end
-if arg then
+-- The running os:
- -- new, reconstruct quoted snippets (maybe better just remove the " then and add them later)
- local newarg, instring = { }, false
+-- todo: check is context sits here os.platform is more trustworthy
+-- that the bin check as mtx-update runs from another path
- for index=1,#arg do
- local argument = arg[index]
- if find(argument,"^\"") then
- newarg[#newarg+1] = gsub(argument,"^\"","")
- if not find(argument,"\"$") then
- instring = true
- end
- elseif find(argument,"\"$") then
- newarg[#newarg] = newarg[#newarg] .. " " .. gsub(argument,"\"$","")
- instring = false
- elseif instring then
- newarg[#newarg] = newarg[#newarg] .. " " .. argument
- else
- newarg[#newarg+1] = argument
- end
- end
- for i=1,-5,-1 do
- newarg[i] = arg[i]
- end
+local texos = environment.texos or osgetenv("TEXOS")
+local texmfos = environment.texmfos or osgetenv('SELFAUTODIR')
- environment.initialize_arguments(newarg)
- environment.original_arguments = newarg
- environment.raw_arguments = arg
+if not texos or texos == "" then
+ texos = file.basename(texmfos)
+end
- arg = { } -- prevent duplicate handling
+ossetenv('TEXMFOS', texmfos) -- full bin path
+ossetenv('TEXOS', texos) -- partial bin parent
+ossetenv('SELFAUTOSYSTEM',os.platform) -- bonus
-end
+environment.texos = texos
+environment.texmfos = texmfos
--- weird place ... depends on a not yet loaded module
+-- The current root:
-function environment.texfile(filename)
- return resolvers.find_file(filename,'tex')
-end
+local texroot = environment.texroot or osgetenv("TEXROOT")
-function environment.luafile(filename)
- local resolved = resolvers.find_file(filename,'tex') or ""
- if resolved ~= "" then
- return resolved
- end
- resolved = resolvers.find_file(filename,'texmfscripts') or ""
- if resolved ~= "" then
- return resolved
- end
- return resolvers.find_file(filename,'luatexlibs') or ""
+if not texroot or texroot == "" then
+ texroot = osgetenv('SELFAUTOPARENT')
+ ossetenv('TEXROOT',texroot)
end
-environment.loadedluacode = loadfile -- can be overloaded
+environment.texroot = file.collapsepath(texroot)
---~ function environment.loadedluacode(name)
---~ if os.spawn("texluac -s -o texluac.luc " .. name) == 0 then
---~ local chunk = loadstring(io.loaddata("texluac.luc"))
---~ os.remove("texluac.luc")
---~ return chunk
---~ else
---~ environment.loadedluacode = loadfile -- can be overloaded
---~ return loadfile(name)
---~ end
---~ end
-
-function environment.luafilechunk(filename) -- used for loading lua bytecode in the format
- filename = file.replacesuffix(filename, "lua")
- local fullname = environment.luafile(filename)
- if fullname and fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading file %s", fullname)
- end
- return environment.loadedluacode(fullname)
- else
- if trace_locating then
- logs.report("fileio","unknown file %s", filename)
- end
- return nil
+-- Tracing. Todo ...
+
+function resolvers.settrace(n) -- no longer number but: 'locating' or 'detail'
+ if n then
+ trackers.disable("resolvers.*")
+ trackers.enable("resolvers."..n)
end
end
--- the next ones can use the previous ones / combine
+resolvers.settrace(osgetenv("MTX_INPUT_TRACE"))
-function environment.loadluafile(filename, version)
- local lucname, luaname, chunk
- local basename = file.removesuffix(filename)
- if basename == filename then
- lucname, luaname = basename .. ".luc", basename .. ".lua"
- else
- lucname, luaname = nil, basename -- forced suffix
- end
- -- when not overloaded by explicit suffix we look for a luc file first
- local fullname = (lucname and environment.luafile(lucname)) or ""
- if fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading %s", fullname)
- end
- chunk = loadfile(fullname) -- this way we don't need a file exists check
- end
- if chunk then
- assert(chunk)()
- if version then
- -- we check of the version number of this chunk matches
- local v = version -- can be nil
- if modules and modules[filename] then
- v = modules[filename].version -- new method
- elseif versions and versions[filename] then
- v = versions[filename] -- old method
- end
- if v == version then
- return true
- else
- if trace_locating then
- logs.report("fileio","version mismatch for %s: lua=%s, luc=%s", filename, v, version)
- end
- environment.loadluafile(filename)
- end
- else
- return true
- end
- end
- fullname = (luaname and environment.luafile(luaname)) or ""
- if fullname ~= "" then
- if trace_locating then
- logs.report("fileio","loading %s", fullname)
- end
- chunk = loadfile(fullname) -- this way we don't need a file exists check
- if not chunk then
- if trace_locating then
- logs.report("fileio","unknown file %s", filename)
- end
- else
- assert(chunk)()
- return true
- end
- end
- return false
+-- todo:
+
+-- if profiler and osgetenv("MTX_PROFILE_RUN") == "YES" then
+-- profiler.start("luatex-profile.log")
+-- 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
end
@@ -7659,536 +9930,1152 @@ end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['trac-inf'] = {
+if not modules then modules = { } end modules ['data-exp'] = {
version = 1.001,
- comment = "companion to trac-inf.mkiv",
+ 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"
+ license = "see context related readme files",
}
-local format = string.format
+local format, find, gmatch, lower = string.format, string.find, string.gmatch, string.lower
+local concat, sort = table.concat, table.sort
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local Ct, Cs, Cc, P, C, S = lpeg.Ct, lpeg.Cs, lpeg.Cc, lpeg.P, lpeg.C, lpeg.S
+local type, next = type, next
-local statusinfo, n, registered = { }, 0, { }
+local ostype = os.type
+local collapsepath = file.collapsepath
-statistics = statistics or { }
+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)
-statistics.enable = true
-statistics.threshold = 0.05
+local report_expansions = logs.reporter("resolvers","expansions")
--- timing functions
+local resolvers = resolvers
-local clock = os.gettimeofday or os.clock
+-- 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
+-- past this every time. See data-obs.lua for the gsub variant.
-local notimer
+-- {a,b,c,d}
+-- a,b,c/{p,q,r},d
+-- a,b,c/{p,q,r}/d/{x,y,z}//
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a{b,c}{d,e}f
+-- {a,b,c,d}
+-- {a,b,c/{p,q,r},d}
+-- {a,b,c/{p,q,r}/d/{x,y,z}//}
+-- {a,b,c/{p,q/{x,y,z}},d/{p,q,r}}
+-- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}}
+-- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}
-function statistics.hastimer(instance)
- return instance and instance.starttime
+local function f_first(a,b)
+ local t, n = { }, 0
+ for s in gmatch(b,"[^,]+") do
+ n = n + 1 ; t[n] = a .. s
+ end
+ return concat(t,",")
end
-function statistics.resettiming(instance)
- if not instance then
- notimer = { timing = 0, loadtime = 0 }
- else
- instance.timing, instance.loadtime = 0, 0
+local function f_second(a,b)
+ local t, n = { }, 0
+ for s in gmatch(a,"[^,]+") do
+ n = n + 1 ; t[n] = s .. b
end
+ return concat(t,",")
end
-function statistics.starttiming(instance)
- if not instance then
- notimer = { }
- instance = notimer
- end
- local it = instance.timing
- if not it then
- it = 0
- end
- if it == 0 then
- instance.starttime = clock()
- if not instance.loadtime then
- instance.loadtime = 0
+local function f_both(a,b)
+ local t, n = { }, 0
+ for sa in gmatch(a,"[^,]+") do
+ for sb in gmatch(b,"[^,]+") do
+ n = n + 1 ; t[n] = sa .. sb
end
- else
---~ logs.report("system","nested timing (%s)",tostring(instance))
end
- instance.timing = it + 1
+ return concat(t,",")
end
-function statistics.stoptiming(instance, report)
- if not instance then
- instance = notimer
- end
- if instance then
- local it = instance.timing
- if it > 1 then
- instance.timing = it - 1
- else
- local starttime = instance.starttime
- if starttime then
- local stoptime = clock()
- local loadtime = stoptime - starttime
- instance.stoptime = stoptime
- instance.loadtime = instance.loadtime + loadtime
- if report then
- statistics.report("load time %0.3f",loadtime)
- end
- instance.timing = 0
- return loadtime
+local left = P("{")
+local right = P("}")
+local var = P((1 - S("{}" ))^0)
+local set = P((1 - S("{},"))^0)
+local other = P(1)
+
+local l_first = Cs( ( Cc("{") * (C(set) * left * C(var) * right / f_first) * Cc("}") + other )^0 )
+local l_second = Cs( ( Cc("{") * (left * C(var) * right * C(set) / f_second) * Cc("}") + other )^0 )
+local l_both = Cs( ( Cc("{") * (left * C(var) * right * left * C(var) * right / f_both) * Cc("}") + other )^0 )
+local l_rest = Cs( ( left * var * (left/"") * var * (right/"") * var * right + other )^0 )
+
+local stripper_1 = lpeg.stripper ("{}@")
+local replacer_1 = lpeg.replacer { { ",}", ",@}" }, { "{,", "{@," }, }
+
+local function splitpathexpr(str, newlist, validate) -- I couldn't resist lpegging it (nice exercise).
+ if trace_expansions then
+ report_expansions("expanding variable '%s'",str)
+ end
+ local t, ok, done = newlist or { }, false, false
+ local n = #t
+ str = lpegmatch(replacer_1,str)
+ repeat local old = str
+ repeat local old = str ; str = lpegmatch(l_first, str) until old == str
+ repeat local old = str ; str = lpegmatch(l_second,str) until old == str
+ repeat local old = str ; str = lpegmatch(l_both, str) until old == str
+ repeat local old = str ; str = lpegmatch(l_rest, str) until old == str
+ until old == str -- or not find(str,"{")
+ str = lpegmatch(stripper_1,str)
+ if validate then
+ for s in gmatch(str,"[^,]+") do
+ s = validate(s)
+ if s then
+ n = n + 1 ; t[n] = s
end
end
+ else
+ for s in gmatch(str,"[^,]+") do
+ n = n + 1 ; t[n] = s
+ end
end
- return 0
+ if trace_expansions then
+ for k=1,#t do
+ report_expansions("% 4i: %s",k,t[k])
+ end
+ end
+ return t
end
-function statistics.elapsedtime(instance)
- if not instance then
- instance = notimer
- end
- return format("%0.3f",(instance and instance.loadtime) or 0)
+-- We could make the previous one public.
+
+local function validate(s)
+ s = collapsepath(s) -- already keeps the //
+ return s ~= "" and not find(s,"^!*unset/*$") and s
end
-function statistics.elapsedindeed(instance)
- if not instance then
- instance = notimer
+resolvers.validatedpath = validate -- keeps the trailing //
+
+function resolvers.expandedpathfromlist(pathlist)
+ local newlist = { }
+ for k=1,#pathlist do
+ splitpathexpr(pathlist[k],newlist,validate)
end
- local t = (instance and instance.loadtime) or 0
- return t > statistics.threshold
+ return newlist
end
-function statistics.elapsedseconds(instance,rest) -- returns nil if 0 seconds
- if statistics.elapsedindeed(instance) then
- return format("%s seconds %s", statistics.elapsedtime(instance),rest or "")
+local cleanup = lpeg.replacer {
+ { "!" , "" },
+ { "\\" , "/" },
+}
+
+local homedir
+
+function resolvers.cleanpath(str)
+ if not homedir then
+ homedir = lpegmatch(cleanup,environment.homedir or "")
+ if homedir == string.char(127) 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 find(str,"~") then
+ return "" -- special case
+ else
+ return str and lpegmatch(cleanup,str)
+ end
+ end
+ else
+ cleanup = lpeg.replacer {
+ { "!" , "" },
+ { "\\" , "/" },
+ { "~" , homedir },
+ }
+ function resolvers.cleanpath(str)
+ return str and lpegmatch(cleanup,str)
+ end
+ end
end
+ return resolvers.cleanpath(str)
end
--- general function
+-- This one strips quotes and funny tokens.
-function statistics.register(tag,fnc)
- if statistics.enable and type(fnc) == "function" then
- local rt = registered[tag] or (#statusinfo + 1)
- statusinfo[rt] = { tag, fnc }
- registered[tag] = rt
- if #tag > n then n = #tag end
- end
+local expandhome = P("~") / "$HOME" -- environment.homedir
+
+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
+)
+
+function resolvers.checkedvariable(str) -- assumes str is a string
+ return lpegmatch(stripper,str) or str
end
-function statistics.show(reporter)
- if statistics.enable then
- if not reporter then reporter = function(tag,data,n) texio.write_nl(tag .. " " .. data) end end
- -- this code will move
- local register = statistics.register
- register("luatex banner", function()
- return string.lower(status.banner)
- end)
- register("control sequences", function()
- return format("%s of %s", status.cs_count, status.hash_size+status.hash_extra)
- end)
- register("callbacks", function()
- local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0
- return format("direct: %s, indirect: %s, total: %s", total-indirect, indirect, total)
- end)
- register("current memory usage", statistics.memused)
- register("runtime",statistics.runtime)
--- --
- for i=1,#statusinfo do
- local s = statusinfo[i]
- local r = s[2]()
- if r then
- reporter(s[1],r,n)
+-- The path splitter:
+
+-- A config (optionally) has the paths split in tables. Internally
+-- we join them and split them after the expansion has taken place. This
+-- is more convenient.
+
+local cache = { }
+
+---- splitter = Ct(lpeg.splitat(S(ostype == "windows" and ";" or ":;"))) -- maybe add ,
+local splitter = Ct(lpeg.splitat(";")) -- as we move towards urls, prefixes and use tables we no longer do :
+
+local backslashswapper = lpeg.replacer("\\","/")
+
+local function splitconfigurationpath(str) -- beware, this can be either a path or a { specification }
+ if str then
+ local found = cache[str]
+ if not found then
+ if str == "" then
+ found = { }
+ else
+ local split = lpegmatch(splitter,lpegmatch(backslashswapper,str)) -- can be combined
+ found = { }
+ local noffound = 0
+ for i=1,#split do
+ local s = split[i]
+ if not find(s,"^{*unset}*") then
+ noffound = noffound + 1
+ found[noffound] = s
+ end
+ end
+ if trace_expansions then
+ report_expansions("splitting path specification '%s'",str)
+ for k=1,noffound do
+ report_expansions("% 4i: %s",k,found[k])
+ end
+ end
+ cache[str] = found
end
end
- texio.write_nl("") -- final newline
- statistics.enable = false
+ return found
end
end
-function statistics.show_job_stat(tag,data,n)
- texio.write_nl(format("%-15s: %s - %s","mkiv lua stats",tag:rpadd(n," "),data))
-end
+resolvers.splitconfigurationpath = splitconfigurationpath
-function statistics.memused() -- no math.round yet -)
- local round = math.round or math.floor
- return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000))
+function resolvers.splitpath(str)
+ if type(str) == 'table' then
+ return str
+ else
+ return splitconfigurationpath(str)
+ end
end
-if statistics.runtime then
- -- already loaded and set
-elseif luatex and luatex.starttime then
- statistics.starttime = luatex.starttime
- statistics.loadtime = 0
- statistics.timing = 0
-else
- statistics.starttiming(statistics)
+function resolvers.joinpath(str)
+ if type(str) == 'table' then
+ return file.joinpath(str)
+ else
+ return str
+ end
end
-function statistics.runtime()
- statistics.stoptiming(statistics)
- return statistics.formatruntime(statistics.elapsedtime(statistics))
-end
+-- The next function scans directories and returns a hash where the
+-- entries are either strings or tables.
-function statistics.formatruntime(runtime)
- return format("%s seconds", statistics.elapsedtime(statistics))
-end
+-- starting with . or .. etc or funny char
-function statistics.timed(action,report)
- local timer = { }
- report = report or logs.simple
- statistics.starttiming(timer)
- action()
- statistics.stoptiming(timer)
- report("total runtime: %s",statistics.elapsedtime(timer))
-end
--- where, not really the best spot for this:
-commands = commands or { }
-local timer
+local weird = P(".")^1 + lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
-function commands.resettimer()
- statistics.resettiming(timer)
- statistics.starttiming(timer)
+local attributes, directory = lfs.attributes, lfs.dir
+
+local function scan(files,spec,path,n,m,r)
+ local full = (path == "" and spec) or (spec .. path .. '/')
+ local dirs, nofdirs = { }, 0
+ for name in directory(full) do
+ if not lpegmatch(weird,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 }
+ else
+ f[#f+1] = path
+ end
+ else -- probably unique anyway
+ files[name] = path
+ local lower = lower(name)
+ if name ~= lower then
+ files["remap:"..lower] = name
+ r = r + 1
+ end
+ end
+ elseif mode == 'directory' then
+ m = m + 1
+ 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, n, m, r = scan(files,spec,dirs[i],n,m,r)
+ end
+ end
+ return files, n, m, r
end
-function commands.elapsedtime()
- statistics.stoptiming(timer)
- tex.sprint(statistics.elapsedtime(timer))
+function resolvers.scanfiles(path,branch)
+ if trace_locating then
+ report_expansions("scanning path '%s', branch '%s'",path, branch or path)
+ end
+ local realpath = resolvers.resolve(path) -- no shortcut
+ 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)
+ end
+ return files
end
-commands.resettimer()
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['trac-log'] = {
+if not modules then modules = { } end modules ['data-env'] = {
version = 1.001,
- comment = "companion to trac-log.mkiv",
+ 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"
+ license = "see context related readme files",
}
--- this is old code that needs an overhaul
+local lower, gsub = string.lower, string.gsub
---~ io.stdout:setvbuf("no")
---~ io.stderr:setvbuf("no")
+local resolvers = resolvers
-local write_nl, write = texio.write_nl or print, texio.write or io.write
-local format, gmatch = string.format, string.gmatch
-local texcount = tex and tex.count
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+local fileextname = file.extname
+
+local formats = allocate()
+local suffixes = allocate()
+local dangerous = allocate()
+local suffixmap = allocate()
+
+resolvers.formats = formats
+resolvers.suffixes = suffixes
+resolvers.dangerous = dangerous
+resolvers.suffixmap = suffixmap
+
+local relations = allocate { -- todo: handlers also here
+ core = {
+ ofm = { -- will become obsolete
+ names = { "ofm", "omega font metric", "omega font metrics" },
+ variable = 'OFMFONTS',
+ suffixes = { 'ofm', 'tfm' },
+ },
+ ovf = { -- will become obsolete
+ names = { "ovf", "omega virtual font", "omega virtual fonts" },
+ variable = 'OVFFONTS',
+ suffixes = { 'ovf', 'vf' },
+ },
+ tfm = {
+ names = { "tfm", "tex font metric", "tex font metrics" },
+ variable = 'TFMFONTS',
+ suffixes = { 'tfm' },
+ },
+ vf = {
+ names = { "vf", "virtual font", "virtual fonts" },
+ variable = 'VFFONTS',
+ suffixes = { 'vf' },
+ },
+ otf = {
+ names = { "otf", "opentype", "opentype font", "opentype fonts"},
+ variable = 'OPENTYPEFONTS',
+ suffixes = { 'otf' },
+ },
+ ttf = {
+ names = { "ttf", "truetype", "truetype font", "truetype fonts", "truetype collection", "truetype collections", "truetype dictionary", "truetype dictionaries" },
+ variable = 'TTFONTS',
+ suffixes = { 'ttf', 'ttc', 'dfont' },
+ },
+ afm = {
+ names = { "afm", "adobe font metric", "adobe font metrics" },
+ variable = "AFMFONTS",
+ suffixes = { "afm" },
+ },
+ pfb = {
+ names = { "pfb", "type1", "type 1", "type1 font", "type 1 font", "type1 fonts", "type 1 fonts" },
+ variable = 'T1FONTS',
+ suffixes = { 'pfb', 'pfa' },
+ },
+ fea = {
+ names = { "fea", "font feature", "font features", "font feature file", "font feature files" },
+ variable = 'FONTFEATURES',
+ suffixes = { 'fea' },
+ },
+ cid = {
+ names = { "cid", "cid map", "cid maps", "cid file", "cid files" },
+ variable = 'FONTCIDMAPS',
+ suffixes = { 'cid', 'cidmap' },
+ },
+ fmt = {
+ names = { "fmt", "format", "tex format" },
+ variable = 'TEXFORMATS',
+ suffixes = { 'fmt' },
+ },
+ mem = { -- will become obsolete
+ names = { 'mem', "metapost format" },
+ variable = 'MPMEMS',
+ suffixes = { 'mem' },
+ },
+ mp = {
+ names = { "mp" },
+ variable = 'MPINPUTS',
+ suffixes = { 'mp' },
+ },
+ tex = {
+ names = { "tex" },
+ variable = 'TEXINPUTS',
+ suffixes = { 'tex', "mkiv", "mkiv", "mkii" },
+ },
+ icc = {
+ names = { "icc", "icc profile", "icc profiles" },
+ variable = 'ICCPROFILES',
+ suffixes = { 'icc' },
+ },
+ texmfscripts = {
+ names = { "texmfscript", "texmfscripts", "script", "scripts" },
+ variable = 'TEXMFSCRIPTS',
+ suffixes = { 'rb', 'pl', 'py' },
+ },
+ lua = {
+ names = { "lua" },
+ variable = 'LUAINPUTS',
+ suffixes = { 'lua', 'luc', 'tma', 'tmc' },
+ },
+ lib = {
+ names = { "lib" },
+ variable = 'CLUAINPUTS',
+ suffixes = os.libsuffix and { os.libsuffix } or { 'dll', 'so' },
+ },
+ bib = {
+ names = { 'bib' },
+ suffixes = { 'bib' },
+ },
+ bst = {
+ names = { 'bst' },
+ suffixes = { 'bst' },
+ },
+ fontconfig = {
+ names = { 'fontconfig', 'fontconfig file', 'fontconfig files' },
+ variable = 'FONTCONFIG_PATH',
+ },
+ },
+ obsolete = {
+ enc = {
+ names = { "enc", "enc files", "enc file", "encoding files", "encoding file" },
+ variable = 'ENCFONTS',
+ suffixes = { 'enc' },
+ },
+ map = {
+ names = { "map", "map files", "map file" },
+ variable = 'TEXFONTMAPS',
+ suffixes = { 'map' },
+ },
+ lig = {
+ names = { "lig files", "lig file", "ligature file", "ligature files" },
+ variable = 'LIGFONTS',
+ suffixes = { 'lig' },
+ },
+ opl = {
+ names = { "opl" },
+ variable = 'OPLFONTS',
+ suffixes = { 'opl' },
+ },
+ ovp = {
+ names = { "ovp" },
+ variable = 'OVPFONTS',
+ suffixes = { 'ovp' },
+ },
+ },
+ kpse = { -- subset
+ base = {
+ names = { 'base', "metafont format" },
+ variable = 'MFBASES',
+ suffixes = { 'base', 'bas' },
+ },
+ cmap = {
+ names = { 'cmap', 'cmap files', 'cmap file' },
+ variable = 'CMAPFONTS',
+ suffixes = { 'cmap' },
+ },
+ cnf = {
+ names = { 'cnf' },
+ suffixes = { 'cnf' },
+ },
+ web = {
+ names = { 'web' },
+ suffixes = { 'web', 'ch' }
+ },
+ cweb = {
+ names = { 'cweb' },
+ suffixes = { 'w', 'web', 'ch' },
+ },
+ gf = {
+ names = { 'gf' },
+ suffixes = { '<resolution>gf' },
+ },
+ mf = {
+ names = { 'mf' },
+ variable = 'MFINPUTS',
+ suffixes = { 'mf' },
+ },
+ mft = {
+ names = { 'mft' },
+ suffixes = { 'mft' },
+ },
+ pk = {
+ names = { 'pk' },
+ suffixes = { '<resolution>pk' },
+ },
+ },
+}
-if texlua then
- write_nl = print
- write = io.write
+resolvers.relations = relations
+
+-- formats: maps a format onto a variable
+
+function resolvers.updaterelations()
+ for category, categories in next, relations do
+ for name, relation in next, categories do
+ local rn = relation.names
+ local rv = relation.variable
+ local rs = relation.suffixes
+ if rn and rv then
+ for i=1,#rn do
+ local rni = lower(gsub(rn[i]," ",""))
+ formats[rni] = rv
+ if rs then
+ suffixes[rni] = rs
+ for i=1,#rs do
+ local rsi = rs[i]
+ suffixmap[rsi] = rni
+ end
+ end
+ end
+ end
+ if rs then
+ end
+ end
+ end
end
---[[ldx--
-<p>This is a prelude to a more extensive logging module. For the sake
-of parsing log files, in addition to the standard logging we will
-provide an <l n='xml'/> structured file. Actually, any logging that
-is hooked into callbacks will be \XML\ by default.</p>
---ldx]]--
+resolvers.updaterelations() -- push this in the metatable -> newindex
+
+local function simplified(t,k)
+ return rawget(t,lower(gsub(k," ","")))
+end
-logs = logs or { }
-logs.xml = logs.xml or { }
-logs.tex = logs.tex or { }
+setmetatableindex(formats, simplified)
+setmetatableindex(suffixes, simplified)
+setmetatableindex(suffixmap, simplified)
---[[ldx--
-<p>This looks pretty ugly but we need to speed things up a bit.</p>
---ldx]]--
+-- A few accessors, mostly for command line tool.
-logs.moreinfo = [[
-more information about ConTeXt and the tools that come with it can be found at:
+function resolvers.suffixofformat(str)
+ local s = suffixes[str]
+ return s and s[1] or ""
+end
-maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
-webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
-wiki : http://contextgarden.net
-]]
+function resolvers.suffixofformat(str)
+ return suffixes[str] or { }
+end
-logs.levels = {
- ['error'] = 1,
- ['warning'] = 2,
- ['info'] = 3,
- ['debug'] = 4,
-}
+for name, format in next, formats do
+ dangerous[name] = true -- still needed ?
+end
-logs.functions = {
- 'report', 'start', 'stop', 'push', 'pop', 'line', 'direct',
- 'start_run', 'stop_run',
- 'start_page_number', 'stop_page_number',
- 'report_output_pages', 'report_output_log',
- 'report_tex_stat', 'report_job_stat',
- 'show_open', 'show_close', 'show_load',
-}
+-- because vf searching is somewhat dangerous, we want to prevent
+-- too liberal searching esp because we do a lookup on the current
+-- path anyway; only tex (or any) is safe
-logs.tracers = {
-}
+dangerous.tex = nil
-logs.level = 0
-logs.mode = string.lower((os.getenv("MTX.LOG.MODE") or os.getenv("MTX_LOG_MODE") or "tex"))
-function logs.set_level(level)
- logs.level = logs.levels[level] or level
-end
+-- more helpers
-function logs.set_method(method)
- for _, v in next, logs.functions do
- logs[v] = logs[method][v] or function() end
- end
+function resolvers.formatofvariable(str)
+ return formats[str] or ''
end
--- tex logging
+function resolvers.formatofsuffix(str) -- of file
+ return suffixmap[fileextname(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc)
+end
-function logs.tex.report(category,fmt,...) -- new
- if fmt then
- write_nl(category .. " | " .. format(fmt,...))
- else
- write_nl(category .. " |")
- end
+function resolvers.variableofformat(str)
+ return formats[str] or ''
end
-function logs.tex.line(fmt,...) -- new
- if fmt then
- write_nl(format(fmt,...))
- else
- write_nl("")
+function resolvers.variableofformatorsuffix(str)
+ local v = formats[str]
+ if v then
+ return v
+ end
+ v = suffixmap[fileextname(str)]
+ if v then
+ return formats[v]
end
+ return ''
end
---~ function logs.tex.start_page_number()
---~ local real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
---~ if real > 0 then
---~ if user > 0 then
---~ if sub > 0 then
---~ write(format("[%s.%s.%s",real,user,sub))
---~ else
---~ write(format("[%s.%s",real,user))
---~ end
---~ else
---~ write(format("[%s",real))
---~ end
---~ else
---~ write("[-")
---~ end
---~ end
---~ function logs.tex.stop_page_number()
---~ write("]")
---~ end
-local real, user, sub
+end -- of closure
-function logs.tex.start_page_number()
- real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-tmp'] = {
+ version = 1.100,
+ 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"
+}
+
+--[[ldx--
+<p>This module deals with caching data. It sets up the paths and
+implements loaders and savers for tables. Best is to set the
+following variable. When not set, the usual paths will be
+checked. Personally I prefer the (users) temporary path.</p>
+
+</code>
+TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
+</code>
+
+<p>Currently we do no locking when we write files. This is no real
+problem because most caching involves fonts and the chance of them
+being written at the same time is small. We also need to extend
+luatools with a recache feature.</p>
+--ldx]]--
+
+local format, lower, gsub, concat = string.format, string.lower, string.gsub, table.concat
+local mkdirs, isdir = dir.mkdirs, lfs.isdir
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
+
+local report_caches = logs.reporter("resolvers","caches")
+local report_resolvers = logs.reporter("resolvers","caching")
+
+local resolvers = resolvers
+
+-- intermezzo
+
+local directive_cleanup = false directives.register("system.compile.cleanup", function(v) directive_cleanup = v end)
+local directive_strip = true directives.register("system.compile.strip", function(v) directive_strip = v end)
+
+local compile = utilities.lua.compile
+
+function utilities.lua.compile(luafile,lucfile,cleanup,strip)
+ if cleanup == nil then cleanup = directive_cleanup end
+ if strip == nil then strip = directive_strip end
+ return compile(luafile,lucfile,cleanup,strip)
end
-function logs.tex.stop_page_number()
- if real > 0 then
- if user > 0 then
- if sub > 0 then
- logs.report("pages", "flushing realpage %s, userpage %s, subpage %s",real,user,sub)
- else
- logs.report("pages", "flushing realpage %s, userpage %s",real,user)
+-- end of intermezzo
+
+caches = caches or { }
+local caches = caches
+
+caches.base = caches.base or "luatex-cache"
+caches.more = caches.more or "context"
+caches.direct = false -- true is faster but may need huge amounts of memory
+caches.tree = false
+caches.force = true
+caches.ask = false
+caches.relocate = false
+caches.defaults = { "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
+
+local writable, readables, usedreadables = nil, { }, { }
+
+-- we could use a metatable for writable and readable but not yet
+
+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")
+ if texmfcaches then
+ for k=1,#texmfcaches do
+ local cachepath = texmfcaches[k]
+ if cachepath ~= "" then
+ cachepath = resolvers.resolve(cachepath)
+ cachepath = resolvers.cleanpath(cachepath)
+ cachepath = file.collapsepath(cachepath)
+ local valid = isdir(cachepath)
+ if valid then
+ if file.is_readable(cachepath) then
+ readables[#readables+1] = cachepath
+ if not writable and file.is_writable(cachepath) then
+ writable = cachepath
+ end
+ end
+ elseif not writable and caches.force then
+ local cacheparent = file.dirname(cachepath)
+ if file.is_writable(cacheparent) then
+ if not caches.ask or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then
+ mkdirs(cachepath)
+ if isdir(cachepath) and file.is_writable(cachepath) then
+ report_caches("created: %s",cachepath)
+ writable = cachepath
+ readables[#readables+1] = cachepath
+ end
+ end
+ end
+ end
end
- else
- logs.report("pages", "flushing realpage %s",real)
+ end
+ end
+ -- As a last resort we check some temporary paths but this time we don't
+ -- create them.
+ local texmfcaches = caches.defaults
+ if texmfcaches then
+ for k=1,#texmfcaches do
+ local cachepath = texmfcaches[k]
+ cachepath = resolvers.expansion(cachepath) -- was getenv
+ if cachepath ~= "" then
+ cachepath = resolvers.resolve(cachepath)
+ cachepath = resolvers.cleanpath(cachepath)
+ local valid = isdir(cachepath)
+ if valid and file.is_readable(cachepath) then
+ if not writable and file.is_writable(cachepath) then
+ readables[#readables+1] = cachepath
+ writable = cachepath
+ break
+ end
+ end
+ end
+ end
+ end
+ -- Some extra checking. If we have no writable or readable path then we simply
+ -- quit.
+ if not writable then
+ report_caches("fatal error: there is no valid writable cache path defined")
+ os.exit()
+ elseif #readables == 0 then
+ report_caches("fatal error: there is no valid readable cache path defined")
+ os.exit()
+ end
+ -- why here
+ writable = dir.expandname(resolvers.cleanpath(writable)) -- just in case
+ -- moved here
+ local base, more, tree = caches.base, caches.more, caches.tree or caches.treehash() -- we have only one writable tree
+ if tree then
+ caches.tree = tree
+ writable = mkdirs(writable,base,more,tree)
+ for i=1,#readables do
+ readables[i] = file.join(readables[i],base,more,tree)
end
else
- logs.report("pages", "flushing page")
+ writable = mkdirs(writable,base,more)
+ for i=1,#readables do
+ readables[i] = file.join(readables[i],base,more)
+ end
+ end
+ -- end
+ if trace_cache then
+ for i=1,#readables do
+ report_caches("using readable path '%s' (order %s)",readables[i],i)
+ end
+ report_caches("using writable path '%s'",writable)
+ end
+ identify = function()
+ return writable, readables
end
- io.flush()
+ return writable, readables
end
-logs.tex.report_job_stat = statistics.show_job_stat
+function caches.usedpaths()
+ local writable, readables = identify()
+ if #readables > 1 then
+ local result = { }
+ for i=1,#readables do
+ local readable = readables[i]
+ if usedreadables[i] or readable == writable then
+ result[#result+1] = format("readable: '%s' (order %s)",readable,i)
+ end
+ end
+ result[#result+1] = format("writable: '%s'",writable)
+ return result
+ else
+ return writable
+ end
+end
--- xml logging
+function caches.configfiles()
+ return table.concat(resolvers.instance.specification,";")
+end
-function logs.xml.report(category,fmt,...) -- new
- if fmt then
- write_nl(format("<r category='%s'>%s</r>",category,format(fmt,...)))
- else
- write_nl(format("<r category='%s'/>",category))
+function caches.hashed(tree)
+ tree = gsub(tree,"\\$","/")
+ tree = gsub(tree,"/+$","")
+ tree = lower(tree)
+ local hash = md5.hex(tree)
+ if trace_cache or trace_locating then
+ report_caches("hashing tree %s, hash %s",tree,hash)
end
+ return hash
end
-function logs.xml.line(fmt,...) -- new
- if fmt then
- write_nl(format("<r>%s</r>",format(fmt,...)))
+
+function caches.treehash()
+ local tree = caches.configfiles()
+ if not tree or tree == "" then
+ return false
else
- write_nl("<r/>")
+ return caches.hashed(tree)
end
end
-function logs.xml.start() if logs.level > 0 then tw("<%s>" ) end end
-function logs.xml.stop () if logs.level > 0 then tw("</%s>") end end
-function logs.xml.push () if logs.level > 0 then tw("<!-- ") end end
-function logs.xml.pop () if logs.level > 0 then tw(" -->" ) end end
+local r_cache, w_cache = { }, { } -- normally w in in r but who cares
-function logs.xml.start_run()
- write_nl("<?xml version='1.0' standalone='yes'?>")
- write_nl("<job>") -- xmlns='www.pragma-ade.com/luatex/schemas/context-job.rng'
- write_nl("")
-end
-
-function logs.xml.stop_run()
- write_nl("</job>")
+local function getreadablepaths(...) -- we can optimize this as we have at most 2 tags
+ local tags = { ... }
+ local hash = concat(tags,"/")
+ local done = r_cache[hash]
+ if not done then
+ local writable, readables = identify() -- exit if not found
+ if #tags > 0 then
+ done = { }
+ for i=1,#readables do
+ done[i] = file.join(readables[i],...)
+ end
+ else
+ done = readables
+ end
+ r_cache[hash] = done
+ end
+ return done
end
-function logs.xml.start_page_number()
- write_nl(format("<p real='%s' page='%s' sub='%s'", texcount.realpageno, texcount.userpageno, texcount.subpageno))
+local function getwritablepath(...)
+ local tags = { ... }
+ local hash = concat(tags,"/")
+ local done = w_cache[hash]
+ if not done then
+ local writable, readables = identify() -- exit if not found
+ if #tags > 0 then
+ done = mkdirs(writable,...)
+ else
+ done = writable
+ end
+ w_cache[hash] = done
+ end
+ return done
end
-function logs.xml.stop_page_number()
- write("/>")
- write_nl("")
-end
+caches.getreadablepaths = getreadablepaths
+caches.getwritablepath = getwritablepath
-function logs.xml.report_output_pages(p,b)
- write_nl(format("<v k='pages' v='%s'/>", p))
- write_nl(format("<v k='bytes' v='%s'/>", b))
- write_nl("")
+function caches.getfirstreadablefile(filename,...)
+ local rd = getreadablepaths(...)
+ for i=1,#rd do
+ local path = rd[i]
+ local fullname = file.join(path,filename)
+ if file.is_readable(fullname) then
+ usedreadables[i] = true
+ return fullname, path
+ end
+ end
+ return caches.setfirstwritablefile(filename,...)
end
-function logs.xml.report_output_log()
+function caches.setfirstwritablefile(filename,...)
+ local wr = getwritablepath(...)
+ local fullname = file.join(wr,filename)
+ return fullname, wr
end
-function logs.xml.report_tex_stat(k,v)
- texiowrite_nl("log","<v k='"..k.."'>"..tostring(v).."</v>")
+function caches.define(category,subcategory) -- for old times sake
+ return function()
+ return getwritablepath(category,subcategory)
+ end
end
-local level = 0
-
-function logs.xml.show_open(name)
- level = level + 1
- texiowrite_nl(format("<f l='%s' n='%s'>",level,name))
+function caches.setluanames(path,name)
+ return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
end
-function logs.xml.show_close(name)
- texiowrite("</f> ")
- level = level - 1
+function caches.loaddata(readables,name)
+ if type(readables) == "string" then
+ readables = { readables }
+ end
+ for i=1,#readables do
+ local path = readables[i]
+ local tmaname, tmcname = caches.setluanames(path,name)
+ local loader = loadfile(tmcname) or loadfile(tmaname)
+ if loader then
+ loader = loader()
+ collectgarbage("step")
+ return loader
+ end
+ end
+ return false
end
-function logs.xml.show_load(name)
- texiowrite_nl(format("<f l='%s' n='%s'/>",level+1,name))
+function caches.is_writable(filepath,filename)
+ local tmaname, tmcname = caches.setluanames(filepath,filename)
+ return file.is_writable(tmaname)
end
---
-
-local name, banner = 'report', 'context'
+local saveoptions = { compact = true }
-local function report(category,fmt,...)
- if fmt then
- write_nl(format("%s | %s: %s",name,category,format(fmt,...)))
- elseif category then
- write_nl(format("%s | %s",name,category))
+function caches.savedata(filepath,filename,data,raw)
+ local tmaname, tmcname = caches.setluanames(filepath,filename)
+ local reduce, simplify = true, true
+ if raw then
+ reduce, simplify = false, false
+ end
+ data.cache_uuid = os.uuid()
+ if caches.direct then
+ file.savedata(tmaname,table.serialize(data,true,saveoptions))
else
- write_nl(format("%s |",name))
+ table.tofile(tmaname,data,true,saveoptions)
end
+ utilities.lua.compile(tmaname,tmcname)
end
-local function simple(fmt,...)
- if fmt then
- write_nl(format("%s | %s",name,format(fmt,...)))
- else
- write_nl(format("%s |",name))
- end
+-- moved from data-res:
+
+local content_state = { }
+
+function caches.contentstate()
+ return content_state or { }
end
-function logs.setprogram(_name_,_banner_,_verbose_)
- name, banner = _name_, _banner_
- if _verbose_ then
- trackers.enable("resolvers.locating")
- end
- logs.set_method("tex")
- logs.report = report -- also used in libraries
- logs.simple = simple -- only used in scripts !
- if utils then
- utils.report = simple
+function caches.loadcontent(cachename,dataname)
+ local name = caches.hashed(cachename)
+ local full, path = caches.getfirstreadablefile(name ..".lua","trees")
+ local filename = file.join(path,name)
+ local blob = loadfile(filename .. ".luc") or loadfile(filename .. ".lua")
+ if blob then
+ local data = blob()
+ if data and data.content then
+ if data.type == dataname then
+ if data.version == resolvers.cacheversion then
+ content_state[#content_state+1] = data.uuid
+ if trace_locating then
+ report_resolvers("loading '%s' for '%s' from '%s'",dataname,cachename,filename)
+ end
+ return data.content
+ else
+ report_resolvers("skipping '%s' for '%s' from '%s' (version mismatch)",dataname,cachename,filename)
+ end
+ else
+ report_resolvers("skipping '%s' for '%s' from '%s' (datatype mismatch)",dataname,cachename,filename)
+ end
+ elseif trace_locating then
+ report_resolvers("skipping '%s' for '%s' from '%s' (no content)",dataname,cachename,filename)
+ end
+ elseif trace_locating then
+ report_resolvers("skipping '%s' for '%s' from '%s' (invalid file)",dataname,cachename,filename)
end
- logs.verbose = _verbose_
end
-function logs.setverbose(what)
- if what then
- trackers.enable("resolvers.locating")
- else
- trackers.disable("resolvers.locating")
+function caches.collapsecontent(content)
+ for k, v in next, content do
+ if type(v) == "table" and #v == 1 then
+ content[k] = v[1]
+ end
end
- logs.verbose = what or false
end
-function logs.extendbanner(_banner_,_verbose_)
- banner = banner .. " | ".. _banner_
- if _verbose_ ~= nil then
- logs.setverbose(what)
+function caches.savecontent(cachename,dataname,content)
+ local name = caches.hashed(cachename)
+ local full, path = caches.setfirstwritablefile(name ..".lua","trees")
+ local filename = file.join(path,name) -- is full
+ local luaname, lucname = filename .. ".lua", filename .. ".luc"
+ if trace_locating then
+ report_resolvers("preparing '%s' for '%s'",dataname,cachename)
+ end
+ local data = {
+ type = dataname,
+ root = cachename,
+ version = resolvers.cacheversion,
+ date = os.date("%Y-%m-%d"),
+ time = os.date("%H:%M:%S"),
+ content = content,
+ uuid = os.uuid(),
+ }
+ local ok = io.savedata(luaname,table.serialize(data,true))
+ if ok then
+ if trace_locating then
+ report_resolvers("category '%s', cachename '%s' saved in '%s'",dataname,cachename,luaname)
+ end
+ if utilities.lua.compile(luaname,lucname) then
+ if trace_locating then
+ report_resolvers("'%s' compiled to '%s'",dataname,lucname)
+ end
+ return true
+ else
+ if trace_locating then
+ report_resolvers("compiling failed for '%s', deleting file '%s'",dataname,lucname)
+ end
+ os.remove(lucname)
+ end
+ elseif trace_locating then
+ report_resolvers("unable to save '%s' in '%s' (access error)",dataname,luaname)
end
end
-logs.verbose = false
-logs.report = logs.tex.report
-logs.simple = logs.tex.report
-function logs.reportlines(str) -- todo: <lines></lines>
- for line in gmatch(str,"(.-)[\n\r]") do
- logs.report(line)
- end
-end
+end -- of closure
-function logs.reportline() -- for scripts too
- logs.report()
-end
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-met'] = {
+ version = 1.100,
+ 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 find, format = string.find, string.format
+local sequenced = table.sequenced
+local addurlscheme, urlhashed = url.addscheme, url.hashed
+
+local trace_locating = false
+
+trackers.register("resolvers.locating", function(v) trace_methods = v end)
+trackers.register("resolvers.methods", function(v) trace_methods = v end)
+
+
+local report_methods = logs.reporter("resolvers","methods")
-logs.simpleline = logs.reportline
+local allocate = utilities.storage.allocate
-function logs.reportbanner() -- for scripts too
- logs.report(banner)
+local resolvers = resolvers
+
+local registered = { }
+
+local function splitmethod(filename) -- todo: filetype in specification
+ if not filename then
+ return { scheme = "unknown", original = filename }
+ end
+ if type(filename) == "table" then
+ return filename -- already split
+ end
+ filename = file.collapsepath(filename)
+ if not find(filename,"://") then
+ return { scheme = "file", path = filename, original = filename, filename = filename }
+ end
+ local specification = url.hashed(filename)
+ if not specification.scheme or specification.scheme == "" then
+ return { scheme = "file", path = filename, original = filename, filename = filename }
+ else
+ return specification
+ end
end
-function logs.help(message,option)
- logs.reportbanner()
- logs.reportline()
- logs.reportlines(message)
- local moreinfo = logs.moreinfo or ""
- if moreinfo ~= "" and option ~= "nomoreinfo" then
- logs.reportline()
- logs.reportlines(moreinfo)
+resolvers.splitmethod = splitmethod -- bad name but ok
+
+-- the second argument is always analyzed (saves time later on) and the original
+-- gets passed as original but also as argument
+
+local function methodhandler(what,first,...) -- filename can be nil or false
+ local method = registered[what]
+ if method then
+ local how, namespace = method.how, method.namespace
+ if how == "uri" or how == "url" then
+ local specification = splitmethod(first)
+ local scheme = specification.scheme
+ local resolver = namespace and namespace[scheme]
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, scheme=%s, argument=%s",what,how,scheme,first)
+ end
+ return resolver(specification,...)
+ else
+ resolver = namespace.default or namespace.file
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, default, argument=%s",what,how,first)
+ end
+ return resolver(specification,...)
+ elseif trace_methods then
+ report_methods("resolver: method=%s, how=%s, no handler",what,how)
+ end
+ end
+ elseif how == "tag" then
+ local resolver = namespace and namespace[first]
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, tag=%s",what,how,first)
+ end
+ return resolver(...)
+ else
+ resolver = namespace.default or namespace.file
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, default",what,how)
+ end
+ return resolver(...)
+ elseif trace_methods then
+ report_methods("resolver: method=%s, how=%s, unknown",what,how)
+ end
+ end
+ end
+ else
+ report_methods("resolver: method=%s, unknown",what)
end
end
-logs.set_level('error')
-logs.set_method('tex')
+resolvers.methodhandler = methodhandler
-function logs.system(whereto,process,jobname,category,...)
- for i=1,10 do
- local f = io.open(whereto,"a")
- if f then
- f:write(format("%s %s => %s => %s => %s\r",os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...)))
- f:close()
- break
+function resolvers.registermethod(name,namespace,how)
+ registered[name] = { how = how or "tag", namespace = namespace }
+ namespace["byscheme"] = function(scheme,filename,...)
+ if scheme == "file" then
+ return methodhandler(name,filename,...)
else
- sleep(0.1)
+ return methodhandler(name,addurlscheme(filename,scheme),...)
end
end
end
---~ local syslogname = "oeps.xxx"
---~
---~ for i=1,10 do
---~ logs.system(syslogname,"context","test","fonts","font %s recached due to newer version (%s)","blabla","123")
---~ end
+local concatinators = allocate { notfound = file.join } -- concatinate paths
+local locators = allocate { notfound = function() end } -- locate databases
+local hashers = allocate { notfound = function() end } -- load databases
+local generators = allocate { notfound = function() end } -- generate databases
-function logs.fatal(where,...)
- logs.report(where,"fatal error: %s, aborting now",format(...))
- os.exit()
-end
+resolvers.concatinators = concatinators
+resolvers.locators = locators
+resolvers.hashers = hashers
+resolvers.generators = generators
+
+local registermethod = resolvers.registermethod
+
+registermethod("concatinators",concatinators,"tag")
+registermethod("locators", locators, "uri")
+registermethod("hashers", hashers, "uri")
+registermethod("generators", generators, "uri")
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['data-inp'] = {
+if not modules then modules = { } end modules ['data-res'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -8196,981 +11083,510 @@ if not modules then modules = { } end modules ['data-inp'] = {
license = "see context related readme files",
}
--- After a few years using the code the large luat-inp.lua file
--- has been split up a bit. In the process some functionality was
--- dropped:
---
--- * support for reading lsr files
--- * selective scanning (subtrees)
--- * some public auxiliary functions were made private
---
--- TODO: os.getenv -> os.env[]
--- TODO: instances.[hashes,cnffiles,configurations,522]
--- TODO: check escaping in find etc, too much, too slow
-
--- This lib is multi-purpose and can be loaded again later on so that
--- additional functionality becomes available. We will split thislogs.report("fileio",
--- module in components once we're done with prototyping. This is the
--- first code I wrote for LuaTeX, so it needs some cleanup. Before changing
--- something in this module one can best check with Taco or Hans first; there
--- is some nasty trickery going on that relates to traditional kpse support.
-
--- To be considered: hash key lowercase, first entry in table filename
--- (any case), rest paths (so no need for optimization). Or maybe a
--- separate table that matches lowercase names to mixed case when
--- present. In that case the lower() cases can go away. I will do that
--- only when we run into problems with names ... well ... Iwona-Regular.
+-- In practice we will work within one tds tree, but i want to keep
+-- the option open to build tools that look at multiple trees, which is
+-- why we keep the tree specific data in a table. We used to pass the
+-- instance but for practical purposes we now avoid this and use a
+-- instance variable. We always have one instance active (sort of global).
--- Beware, loading and saving is overloaded in luat-tmp!
+-- todo: cache:/// home:///
local format, gsub, find, lower, upper, match, gmatch = string.format, string.gsub, string.find, string.lower, string.upper, string.match, string.gmatch
local concat, insert, sortedkeys = table.concat, table.insert, table.sortedkeys
-local next, type = next, type
-local lpegmatch = lpeg.match
+local next, type, rawget = next, type, rawget
+local os = os
-local trace_locating, trace_detail, trace_expansions = false, false, false
+local P, S, R, C, Cc, Cs, Ct, Carg = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Carg
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
-trackers.register("resolvers.locating", function(v) trace_locating = v end)
-trackers.register("resolvers.details", function(v) trace_detail = v end)
-trackers.register("resolvers.expansions", function(v) trace_expansions = v end) -- todo
+local filedirname = file.dirname
+local filebasename = file.basename
+local fileextname = file.extname
+local filejoin = file.join
+local collapsepath = file.collapsepath
+local joinpath = file.joinpath
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
-if not resolvers then
- resolvers = {
- suffixes = { },
- formats = { },
- dangerous = { },
- suffixmap = { },
- alternatives = { },
- locators = { }, -- locate databases
- hashers = { }, -- load databases
- generators = { }, -- generate databases
- }
-end
+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 resolvers = resolvers
+local report_resolving = logs.reporter("resolvers","resolving")
-resolvers.locators .notfound = { nil }
-resolvers.hashers .notfound = { nil }
-resolvers.generators.notfound = { nil }
-
-resolvers.cacheversion = '1.0.1'
-resolvers.cnfname = 'texmf.cnf'
-resolvers.luaname = 'texmfcnf.lua'
-resolvers.homedir = os.env[os.type == "windows" and 'USERPROFILE'] or os.env['HOME'] or '~'
-resolvers.cnfdefault = '{$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}'
-
-local dummy_path_expr = "^!*unset/*$"
-
-local formats = resolvers.formats
-local suffixes = resolvers.suffixes
-local dangerous = resolvers.dangerous
-local suffixmap = resolvers.suffixmap
-local alternatives = resolvers.alternatives
-
-formats['afm'] = 'AFMFONTS' suffixes['afm'] = { 'afm' }
-formats['enc'] = 'ENCFONTS' suffixes['enc'] = { 'enc' }
-formats['fmt'] = 'TEXFORMATS' suffixes['fmt'] = { 'fmt' }
-formats['map'] = 'TEXFONTMAPS' suffixes['map'] = { 'map' }
-formats['mp'] = 'MPINPUTS' suffixes['mp'] = { 'mp' }
-formats['ocp'] = 'OCPINPUTS' suffixes['ocp'] = { 'ocp' }
-formats['ofm'] = 'OFMFONTS' suffixes['ofm'] = { 'ofm', 'tfm' }
-formats['otf'] = 'OPENTYPEFONTS' suffixes['otf'] = { 'otf' } -- 'ttf'
-formats['opl'] = 'OPLFONTS' suffixes['opl'] = { 'opl' }
-formats['otp'] = 'OTPINPUTS' suffixes['otp'] = { 'otp' }
-formats['ovf'] = 'OVFFONTS' suffixes['ovf'] = { 'ovf', 'vf' }
-formats['ovp'] = 'OVPFONTS' suffixes['ovp'] = { 'ovp' }
-formats['tex'] = 'TEXINPUTS' suffixes['tex'] = { 'tex' }
-formats['tfm'] = 'TFMFONTS' suffixes['tfm'] = { 'tfm' }
-formats['ttf'] = 'TTFONTS' suffixes['ttf'] = { 'ttf', 'ttc', 'dfont' }
-formats['pfb'] = 'T1FONTS' suffixes['pfb'] = { 'pfb', 'pfa' }
-formats['vf'] = 'VFFONTS' suffixes['vf'] = { 'vf' }
-
-formats['fea'] = 'FONTFEATURES' suffixes['fea'] = { 'fea' }
-formats['cid'] = 'FONTCIDMAPS' suffixes['cid'] = { 'cid', 'cidmap' }
-
-formats ['texmfscripts'] = 'TEXMFSCRIPTS' -- new
-suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -- 'lua'
-
-formats ['lua'] = 'LUAINPUTS' -- new
-suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' }
-
--- backward compatible ones
-
-alternatives['map files'] = 'map'
-alternatives['enc files'] = 'enc'
-alternatives['cid maps'] = 'cid' -- great, why no cid files
-alternatives['font feature files'] = 'fea' -- and fea files here
-alternatives['opentype fonts'] = 'otf'
-alternatives['truetype fonts'] = 'ttf'
-alternatives['truetype collections'] = 'ttc'
-alternatives['truetype dictionary'] = 'dfont'
-alternatives['type1 fonts'] = 'pfb'
-
--- obscure ones
-
-formats ['misc fonts'] = ''
-suffixes['misc fonts'] = { }
-
-formats ['sfd'] = 'SFDFONTS'
-suffixes ['sfd'] = { 'sfd' }
-alternatives['subfont definition files'] = 'sfd'
-
--- lib paths
-
-formats ['lib'] = 'CLUAINPUTS' -- new (needs checking)
-suffixes['lib'] = (os.libsuffix and { os.libsuffix }) or { 'dll', 'so' }
+local resolvers = resolvers
--- In practice we will work within one tds tree, but i want to keep
--- the option open to build tools that look at multiple trees, which is
--- why we keep the tree specific data in a table. We used to pass the
--- instance but for practical pusposes we now avoid this and use a
--- instance variable.
+local expandedpathfromlist = resolvers.expandedpathfromlist
+local checkedvariable = resolvers.checkedvariable
+local splitconfigurationpath = resolvers.splitconfigurationpath
+local methodhandler = resolvers.methodhandler
--- here we catch a few new thingies (todo: add these paths to context.tmf)
---
--- FONTFEATURES = .;$TEXMF/fonts/fea//
--- FONTCIDMAPS = .;$TEXMF/fonts/cid//
+local initializesetter = utilities.setters.initialize
--- we always have one instance active
+local ostype, osname, osenv, ossetenv, osgetenv = os.type, os.name, os.env, os.setenv, os.getenv
-resolvers.instance = resolvers.instance or nil -- the current one (slow access)
-local instance = resolvers.instance or nil -- the current one (fast access)
+resolvers.cacheversion = '1.0.1'
+resolvers.configbanner = ''
+resolvers.homedir = environment.homedir
+resolvers.criticalvars = allocate { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF", "TEXMF", "TEXOS" }
+resolvers.luacnfname = 'texmfcnf.lua'
+resolvers.luacnfstate = "unknown"
-function resolvers.newinstance()
+-- resolvers.luacnfspec = '{$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}' -- what a rubish path
+resolvers.luacnfspec = 'selfautoparent:{/texmf{-local,}{,/web2c},}}'
- -- store once, freeze and faster (once reset we can best use
- -- instance.environment) maybe better have a register suffix
- -- function
- for k, v in next, suffixes do
- for i=1,#v do
- local vi = v[i]
- if vi then
- suffixmap[vi] = k
- end
- end
- end
- -- because vf searching is somewhat dangerous, we want to prevent
- -- too liberal searching esp because we do a lookup on the current
- -- path anyway; only tex (or any) is safe
+local unset_variable = "unset"
- for k, v in next, formats do
- dangerous[k] = true
- end
- dangerous.tex = nil
+local formats = resolvers.formats
+local suffixes = resolvers.suffixes
+local dangerous = resolvers.dangerous
+local suffixmap = resolvers.suffixmap
- -- the instance
+resolvers.defaultsuffixes = { "tex" } -- "mkiv", "cld" -- too tricky
- local newinstance = {
- rootpath = '',
- treepath = '',
- progname = 'context',
- engine = 'luatex',
- format = '',
- environment = { },
- variables = { },
- expansions = { },
- files = { },
- remap = { },
- configuration = { },
- setup = { },
- order = { },
- found = { },
- foundintrees = { },
- kpsevars = { },
- hashes = { },
- cnffiles = { },
- luafiles = { },
- lists = { },
- remember = true,
- diskcache = true,
- renewcache = false,
- scandisk = true,
- cachepath = nil,
- loaderror = false,
- sortdata = false,
- savelists = true,
- cleanuppaths = true,
- allresults = false,
- pattern = nil, -- lists
- data = { }, -- only for loading
- force_suffixes = true,
- fakepaths = { },
- }
+resolvers.instance = resolvers.instance or nil -- the current one (slow access)
+local instance = resolvers.instance or nil -- the current one (fast access)
- local ne = newinstance.environment
+-- An instance has an environment (coming from the outside, kept raw), variables
+-- (coming from the configuration file), and expansions (variables with nested
+-- variables replaced). One can push something into the outer environment and
+-- its internal copy, but only the later one will be the raw unprefixed variant.
- for k,v in next, os.env do
- ne[k] = resolvers.bare_variable(v)
+function resolvers.setenv(key,value,raw)
+ if instance then
+ -- this one will be consulted first when we stay inside
+ -- the current environment
+ instance.environment[key] = value
+ -- 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))
end
+end
- return newinstance
+-- Beware we don't want empty here as this one can be called early on
+-- and therefore we use rawget.
+local function getenv(key)
+ local value = rawget(instance.environment,key)
+ if value and value ~= "" then
+ return value
+ else
+ local e = osgetenv(key)
+ return e ~= nil and e ~= "" and checkedvariable(e) or ""
+ end
end
-function resolvers.setinstance(someinstance)
- instance = someinstance
- resolvers.instance = someinstance
- return someinstance
-end
+resolvers.getenv = getenv
+resolvers.env = getenv
-function resolvers.reset()
- return resolvers.setinstance(resolvers.newinstance())
-end
+-- We are going to use some metatable trickery where we backtrack from
+-- expansion to variable to environment.
-local function reset_hashes()
- instance.lists = { }
- instance.found = { }
+local function resolve(k)
+ return instance.expansions[k]
end
-local function check_configuration() -- not yet ok, no time for debugging now
- if os.env["OSFONTDIR"] then
- -- ok
- elseif os.type == "windows" then
- os.setenv("OSFONTDIR","c:/windows/fonts//")
- elseif os.type == "macosx" then
- os.setenv("OSFONTDIR","$HOME/Library/Fonts//;/Library/Fonts//;/System/Library/Fonts//")
- end
-end
+local dollarstripper = lpeg.stripper("$")
+local inhibitstripper = P("!")^0 * Cs(P(1)^0)
+local backslashswapper = lpeg.replacer("\\","/")
-function resolvers.bare_variable(str) -- assumes str is a string
- return (gsub(str,"\s*([\"\']?)(.+)%1\s*", "%2"))
-end
+local somevariable = P("$") / ""
+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 )
-function resolvers.settrace(n) -- no longer number but: 'locating' or 'detail'
- if n then
- trackers.disable("resolvers.*")
- trackers.enable("resolvers."..n)
- end
-end
+local cleaner = P("\\") / "/" + P(";") * S("!{}/\\")^0 * P(";")^1 / ";"
+local variablecleaner = Cs((cleaner + P(1))^0)
-resolvers.settrace(os.getenv("MTX_INPUT_TRACE"))
+local somevariable = R("az","AZ","09","__","--")^1 / resolve
+local variable = (P("$")/"") * (somevariable + (P("{")/"") * somevariable * (P("}")/""))
+local variableresolver = Cs((variable + P(1))^0)
-function resolvers.osenv(key)
- local ie = instance.environment
- local value = ie[key]
- if value == nil then
- -- local e = os.getenv(key)
- local e = os.env[key]
- if e == nil then
- -- value = "" -- false
- else
- value = resolvers.bare_variable(e)
- end
- ie[key] = value
- end
- return value or ""
+local function expandedvariable(var)
+ return lpegmatch(variableexpander,var) or var
end
-function resolvers.env(key)
- return instance.environment[key] or resolvers.osenv(key)
-end
+function resolvers.newinstance() -- todo: all vars will become lowercase and alphanum only
---
+ if trace_locating then
+ report_resolving("creating instance")
+ end
-local function expand_vars(lst) -- simple vars
- local variables, env = instance.variables, resolvers.env
- local function resolve(a)
- return variables[a] or env(a)
- end
- for k=1,#lst do
- lst[k] = gsub(lst[k],"%$([%a%d%_%-]+)",resolve)
- end
-end
+ local environment, variables, expansions, order = allocate(), allocate(), allocate(), allocate()
-local function expanded_var(var) -- simple vars
- local function resolve(a)
- return instance.variables[a] or resolvers.env(a)
- end
- return (gsub(var,"%$([%a%d%_%-]+)",resolve))
-end
+ local newinstance = {
+ environment = environment,
+ variables = variables,
+ expansions = expansions,
+ order = order,
+ files = allocate(),
+ setups = allocate(),
+ found = allocate(),
+ foundintrees = allocate(),
+ hashes = allocate(),
+ hashed = allocate(),
+ specification = allocate(),
+ lists = allocate(),
+ data = allocate(), -- only for loading
+ fakepaths = allocate(),
+ remember = true,
+ diskcache = true,
+ renewcache = false,
+ loaderror = false,
+ savelists = true,
+ pattern = nil, -- lists
+ force_suffixes = true,
+ }
-local function entry(entries,name)
- if name and (name ~= "") then
- name = gsub(name,'%$','')
- local result = entries[name..'.'..instance.progname] or entries[name]
- if result then
- return result
- else
- result = resolvers.env(name)
- if result then
- instance.variables[name] = result
- resolvers.expand_variables()
- return instance.expansions[name] or ""
+ setmetatableindex(variables,function(t,k)
+ local v
+ for i=1,#order do
+ v = order[i][k]
+ if v ~= nil then
+ t[k] = v
+ return v
end
end
- end
- return ""
-end
-
-local function is_entry(entries,name)
- if name and name ~= "" then
- name = gsub(name,'%$','')
- return (entries[name..'.'..instance.progname] or entries[name]) ~= nil
- else
- return false
- end
-end
-
--- {a,b,c,d}
--- a,b,c/{p,q,r},d
--- a,b,c/{p,q,r}/d/{x,y,z}//
--- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
--- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
--- a{b,c}{d,e}f
--- {a,b,c,d}
--- {a,b,c/{p,q,r},d}
--- {a,b,c/{p,q,r}/d/{x,y,z}//}
--- {a,b,c/{p,q/{x,y,z}},d/{p,q,r}}
--- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}}
--- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}
+ if v == nil then
+ v = ""
+ end
+ t[k] = v
+ return v
+ end)
--- this one is better and faster, but it took me a while to realize
--- that this kind of replacement is cleaner than messy parsing and
--- fuzzy concatenating we can probably gain a bit with selectively
--- applying lpeg, but experiments with lpeg parsing this proved not to
--- work that well; the parsing is ok, but dealing with the resulting
--- table is a pain because we need to work inside-out recursively
+ setmetatableindex(environment, function(t,k)
+ local v = osgetenv(k)
+ if v == nil then
+ v = variables[k]
+ end
+ if v ~= nil then
+ v = checkedvariable(v) or ""
+ end
+ v = resolvers.repath(v) -- for taco who has a : separated osfontdir
+ t[k] = v
+ return v
+ end)
-local function do_first(a,b)
- local t = { }
- for s in gmatch(b,"[^,]+") do t[#t+1] = a .. s end
- return "{" .. concat(t,",") .. "}"
-end
+ setmetatableindex(expansions, function(t,k)
+ local v = environment[k]
+ if type(v) == "string" then
+ v = lpegmatch(variableresolver,v)
+ v = lpegmatch(variablecleaner,v)
+ end
+ t[k] = v
+ return v
+ end)
-local function do_second(a,b)
- local t = { }
- for s in gmatch(a,"[^,]+") do t[#t+1] = s .. b end
- return "{" .. concat(t,",") .. "}"
-end
+ return newinstance
-local function do_both(a,b)
- local t = { }
- for sa in gmatch(a,"[^,]+") do
- for sb in gmatch(b,"[^,]+") do
- t[#t+1] = sa .. sb
- end
- end
- return "{" .. concat(t,",") .. "}"
end
-local function do_three(a,b,c)
- return a .. b.. c
+function resolvers.setinstance(someinstance) -- only one instance is active
+ instance = someinstance
+ resolvers.instance = someinstance
+ return someinstance
end
-local function splitpathexpr(str, t, validate)
- -- no need for further optimization as it is only called a
- -- few times, we can use lpeg for the sub
- if trace_expansions then
- logs.report("fileio","expanding variable '%s'",str)
- end
- t = t or { }
- str = gsub(str,",}",",@}")
- str = gsub(str,"{,","{@,")
- -- str = "@" .. str .. "@"
- local ok, done
- while true do
- done = false
- while true do
- str, ok = gsub(str,"([^{},]+){([^{}]+)}",do_first)
- if ok > 0 then done = true else break end
- end
- while true do
- str, ok = gsub(str,"{([^{}]+)}([^{},]+)",do_second)
- if ok > 0 then done = true else break end
- end
- while true do
- str, ok = gsub(str,"{([^{}]+)}{([^{}]+)}",do_both)
- if ok > 0 then done = true else break end
- end
- str, ok = gsub(str,"({[^{}]*){([^{}]+)}([^{}]*})",do_three)
- if ok > 0 then done = true end
- if not done then break end
- end
- str = gsub(str,"[{}]", "")
- str = gsub(str,"@","")
- if validate then
- for s in gmatch(str,"[^,]+") do
- s = validate(s)
- if s then t[#t+1] = s end
- end
- else
- for s in gmatch(str,"[^,]+") do
- t[#t+1] = s
- end
- end
- if trace_expansions then
- for k=1,#t do
- logs.report("fileio","% 4i: %s",k,t[k])
- end
- end
- return t
+function resolvers.reset()
+ return resolvers.setinstance(resolvers.newinstance())
end
-local function expanded_path_from_list(pathlist) -- maybe not a list, just a path
- -- a previous version fed back into pathlist
- local newlist, ok = { }, false
- for k=1,#pathlist do
- if find(pathlist[k],"[{}]") then
- ok = true
- break
- end
- end
- if ok then
- local function validate(s)
- s = file.collapse_path(s)
- return s ~= "" and not find(s,dummy_path_expr) and s
- end
- for k=1,#pathlist do
- splitpathexpr(pathlist[k],newlist,validate)
- end
- else
- for k=1,#pathlist do
- for p in gmatch(pathlist[k],"([^,]+)") do
- p = file.collapse_path(p)
- if p ~= "" then newlist[#newlist+1] = p end
- end
- end
- end
- return newlist
+local function reset_hashes()
+ instance.lists = { }
+ instance.found = { }
end
--- we follow a rather traditional approach:
---
--- (1) texmf.cnf given in TEXMFCNF
--- (2) texmf.cnf searched in default variable
---
--- also we now follow the stupid route: if not set then just assume *one*
--- cnf file under texmf (i.e. distribution)
+local slash = P("/")
-local args = environment and environment.original_arguments or arg -- this needs a cleanup
+local pathexpressionpattern = Cs (
+ Cc("^") * (
+ Cc("%") * S(".-")
+ + slash^2 * P(-1) / "/.*"
+ + slash^2 / "/.-/"
+ + (1-slash) * P(-1) * Cc("/")
+ + P(1)
+ )^1 * Cc("$") -- yes or no $
+)
-resolvers.ownbin = resolvers.ownbin or args[-2] or arg[-2] or args[-1] or arg[-1] or arg[0] or "luatex"
-resolvers.ownbin = gsub(resolvers.ownbin,"\\","/")
+local cache = { }
-function resolvers.getownpath()
- local ownpath = resolvers.ownpath or os.selfdir
- if not ownpath or ownpath == "" or ownpath == "unset" then
- ownpath = args[-1] or arg[-1]
- ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
- if not ownpath or ownpath == "" then
- ownpath = args[-0] or arg[-0]
- ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
- end
- local binary = resolvers.ownbin
- if not ownpath or ownpath == "" then
- ownpath = ownpath and file.dirname(binary)
- end
- if not ownpath or ownpath == "" then
- if os.binsuffix ~= "" then
- binary = file.replacesuffix(binary,os.binsuffix)
- end
- for p in gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
- local b = file.join(p,binary)
- if lfs.isfile(b) then
- -- we assume that after changing to the path the currentdir function
- -- resolves to the real location and use this side effect here; this
- -- trick is needed because on the mac installations use symlinks in the
- -- path instead of real locations
- local olddir = lfs.currentdir()
- if lfs.chdir(p) then
- local pp = lfs.currentdir()
- if trace_locating and p ~= pp then
- logs.report("fileio","following symlink '%s' to '%s'",p,pp)
- end
- ownpath = pp
- lfs.chdir(olddir)
- else
- if trace_locating then
- logs.report("fileio","unable to check path '%s'",p)
- end
- ownpath = p
- end
- break
- end
- end
- end
- if not ownpath or ownpath == "" then
- ownpath = "."
- logs.report("fileio","forcing fallback ownpath .")
- elseif trace_locating then
- logs.report("fileio","using ownpath '%s'",ownpath)
+local function makepathexpression(str)
+ if str == "." then
+ return "^%./$"
+ else
+ local c = cache[str]
+ if not c then
+ c = lpegmatch(pathexpressionpattern,str)
+ cache[str] = c
end
+ return c
end
- resolvers.ownpath = ownpath
- function resolvers.getownpath()
- return resolvers.ownpath
- end
- return ownpath
end
-local own_places = { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF" }
-
-local function identify_own()
- local ownpath = resolvers.getownpath() or dir.current()
- local ie = instance.environment
- if ownpath then
- if resolvers.env('SELFAUTOLOC') == "" then os.env['SELFAUTOLOC'] = file.collapse_path(ownpath) end
- if resolvers.env('SELFAUTODIR') == "" then os.env['SELFAUTODIR'] = file.collapse_path(ownpath .. "/..") end
- if resolvers.env('SELFAUTOPARENT') == "" then os.env['SELFAUTOPARENT'] = file.collapse_path(ownpath .. "/../..") end
- else
- logs.report("fileio","error: unable to locate ownpath")
- os.exit()
- end
- if resolvers.env('TEXMFCNF') == "" then os.env['TEXMFCNF'] = resolvers.cnfdefault end
- if resolvers.env('TEXOS') == "" then os.env['TEXOS'] = resolvers.env('SELFAUTODIR') end
- if resolvers.env('TEXROOT') == "" then os.env['TEXROOT'] = resolvers.env('SELFAUTOPARENT') end
+local function reportcriticalvariables()
if trace_locating then
- for i=1,#own_places do
- local v = own_places[i]
- logs.report("fileio","variable '%s' set to '%s'",v,resolvers.env(v) or "unknown")
+ for i=1,#resolvers.criticalvars do
+ local k = resolvers.criticalvars[i]
+ local v = resolvers.getenv(k) or "unknown" -- this one will not resolve !
+ report_resolving("variable '%s' set to '%s'",k,v)
end
+ report_resolving()
end
- identify_own = function() end
+ reportcriticalvariables = function() end
end
-function resolvers.identify_cnf()
- if #instance.cnffiles == 0 then
- -- fallback
- identify_own()
- -- the real search
- resolvers.expand_variables()
- local t = resolvers.split_path(resolvers.env('TEXMFCNF'))
- t = expanded_path_from_list(t)
- expand_vars(t) -- redundant
- local function locate(filename,list)
- for i=1,#t do
- local ti = t[i]
- local texmfcnf = file.collapse_path(file.join(ti,filename))
- if lfs.isfile(texmfcnf) then
- list[#list+1] = texmfcnf
+local function identify_configuration_files()
+ local specification = instance.specification
+ if #specification == 0 then
+ local cnfspec = getenv('TEXMFCNF')
+ if cnfspec == "" then
+ cnfspec = resolvers.luacnfspec
+ resolvers.luacnfstate = "default"
+ else
+ resolvers.luacnfstate = "environment"
+ end
+ reportcriticalvariables()
+ local cnfpaths = expandedpathfromlist(resolvers.splitpath(cnfspec))
+ local luacnfname = resolvers.luacnfname
+ for i=1,#cnfpaths do
+ local filename = collapsepath(filejoin(cnfpaths[i],luacnfname))
+ local realname = resolvers.resolve(filename)
+ if lfs.isfile(realname) then
+ specification[#specification+1] = filename
+ if trace_locating then
+ report_resolving("found configuration file '%s'",realname)
end
+ elseif trace_locating then
+ report_resolving("unknown configuration file '%s'",realname)
end
end
- locate(resolvers.luaname,instance.luafiles)
- locate(resolvers.cnfname,instance.cnffiles)
- end
-end
-
-local function load_cnf_file(fname)
- fname = resolvers.clean_path(fname)
- local lname = file.replacesuffix(fname,'lua')
- if lfs.isfile(lname) then
- local dname = file.dirname(fname) -- fname ?
- if not instance.configuration[dname] then
- resolvers.load_data(dname,'configuration',lname and file.basename(lname))
- instance.order[#instance.order+1] = instance.configuration[dname]
+ if trace_locating then
+ report_resolving()
end
- else
- f = io.open(fname)
- if f then
- if trace_locating then
- logs.report("fileio","loading configuration file %s", fname)
- end
- local line, data, n, k, v
- local dname = file.dirname(fname)
- if not instance.configuration[dname] then
- instance.configuration[dname] = { }
- instance.order[#instance.order+1] = instance.configuration[dname]
- end
- local data = instance.configuration[dname]
- while true do
- local line, n = f:read(), 0
- if line then
- while true do -- join lines
- line, n = gsub(line,"\\%s*$", "")
- if n > 0 then
- line = line .. f:read()
- else
- break
+ elseif trace_locating then
+ report_resolving("configuration files already identified")
+ end
+end
+
+local function load_configuration_files()
+ local specification = instance.specification
+ if #specification > 0 then
+ local luacnfname = resolvers.luacnfname
+ for i=1,#specification do
+ local filename = specification[i]
+ local pathname = filedirname(filename)
+ local filename = filejoin(pathname,luacnfname)
+ local realname = resolvers.resolve(filename) -- no shortcut
+ local blob = loadfile(realname)
+ if blob then
+ local setups = instance.setups
+ local data = blob()
+ data = data and data.content
+ if data then
+ if trace_locating then
+ report_resolving("loading configuration file '%s'",filename)
+ report_resolving()
+ end
+ local variables = data.variables or { }
+ local warning = false
+ for k, v in next, data do
+ local variant = type(v)
+ if variant == "table" then
+ initializesetter(filename,k,v)
+ elseif variables[k] == nil then
+ if trace_locating and not warning then
+ report_resolving("variables like '%s' in configuration file '%s' should move to the 'variables' subtable",
+ k,resolvers.resolve(filename))
+ warning = true
+ end
+ variables[k] = v
end
end
- if not find(line,"^[%%#]") then
- local l = gsub(line,"%s*%%.*$","")
- local k, v = match(l,"%s*(.-)%s*=%s*(.-)%s*$")
- if k and v and not data[k] then
- v = gsub(v,"[%%#].*",'')
- data[k] = gsub(v,"~","$HOME")
- instance.kpsevars[k] = true
+ setups[pathname] = variables
+ if resolvers.luacnfstate == "default" then
+ -- the following code is not tested
+ local cnfspec = variables["TEXMFCNF"]
+ if cnfspec then
+ if trace_locating then
+ report_resolving("reloading configuration due to TEXMF redefinition")
+ end
+ -- we push the value into the main environment (osenv) so
+ -- that it takes precedence over the default one and therefore
+ -- also over following definitions
+ resolvers.setenv('TEXMFCNF',cnfspec) -- resolves prefixes
+ -- we now identify and load the specified configuration files
+ instance.specification = { }
+ identify_configuration_files()
+ load_configuration_files()
+ -- we prevent further overload of the configuration variable
+ resolvers.luacnfstate = "configuration"
+ -- we quit the outer loop
+ break
end
end
- else
- break
- end
- end
- f:close()
- elseif trace_locating then
- logs.report("fileio","skipping configuration file '%s'", fname)
- end
- end
-end
-local function collapse_cnf_data() -- potential optimization: pass start index (setup and configuration are shared)
- local order = instance.order
- for i=1,#order do
- local c = order[i]
- for k,v in next, c do
- if not instance.variables[k] then
- if instance.environment[k] then
- instance.variables[k] = instance.environment[k]
else
- instance.kpsevars[k] = true
- instance.variables[k] = resolvers.bare_variable(v)
+ if trace_locating then
+ report_resolving("skipping configuration file '%s' (no content)",filename)
+ end
+ setups[pathname] = { }
+ instance.loaderror = true
end
+ elseif trace_locating then
+ report_resolving("skipping configuration file '%s' (no file)",filename)
end
- end
- end
-end
-
-function resolvers.load_cnf()
- local function loadoldconfigdata()
- local cnffiles = instance.cnffiles
- for i=1,#cnffiles do
- load_cnf_file(cnffiles[i])
- end
- end
- -- instance.cnffiles contain complete names now !
- -- we still use a funny mix of cnf and new but soon
- -- we will switch to lua exclusively as we only use
- -- the file to collect the tree roots
- if #instance.cnffiles == 0 then
- if trace_locating then
- logs.report("fileio","no cnf files found (TEXMFCNF may not be set/known)")
- end
- else
- local cnffiles = instance.cnffiles
- instance.rootpath = cnffiles[1]
- for k=1,#cnffiles do
- instance.cnffiles[k] = file.collapse_path(cnffiles[k])
- end
- for i=1,3 do
- instance.rootpath = file.dirname(instance.rootpath)
- end
- instance.rootpath = file.collapse_path(instance.rootpath)
- if instance.diskcache and not instance.renewcache then
- resolvers.loadoldconfig(instance.cnffiles)
+ instance.order[#instance.order+1] = instance.setups[pathname]
if instance.loaderror then
- loadoldconfigdata()
- resolvers.saveoldconfig()
- end
- else
- loadoldconfigdata()
- if instance.renewcache then
- resolvers.saveoldconfig()
+ break
end
end
- collapse_cnf_data()
- end
- check_configuration()
-end
-
-function resolvers.load_lua()
- if #instance.luafiles == 0 then
- -- yet harmless
- else
- instance.rootpath = instance.luafiles[1]
- local luafiles = instance.luafiles
- for k=1,#luafiles do
- instance.luafiles[k] = file.collapse_path(luafiles[k])
- end
- for i=1,3 do
- instance.rootpath = file.dirname(instance.rootpath)
- end
- instance.rootpath = file.collapse_path(instance.rootpath)
- resolvers.loadnewconfig()
- collapse_cnf_data()
- end
- check_configuration()
-end
-
--- database loading
-
-function resolvers.load_hash()
- resolvers.locatelists()
- if instance.diskcache and not instance.renewcache then
- resolvers.loadfiles()
- if instance.loaderror then
- resolvers.loadlists()
- resolvers.savefiles()
- end
- else
- resolvers.loadlists()
- if instance.renewcache then
- resolvers.savefiles()
- end
- end
-end
-
-function resolvers.append_hash(type,tag,name)
- if trace_locating then
- logs.report("fileio","hash '%s' appended",tag)
- end
- insert(instance.hashes, { ['type']=type, ['tag']=tag, ['name']=name } )
-end
-
-function resolvers.prepend_hash(type,tag,name)
- if trace_locating then
- logs.report("fileio","hash '%s' prepended",tag)
- end
- insert(instance.hashes, 1, { ['type']=type, ['tag']=tag, ['name']=name } )
-end
-
-function resolvers.extend_texmf_var(specification) -- crap, we could better prepend the hash
--- local t = resolvers.expanded_path_list('TEXMF') -- full expansion
- local t = resolvers.split_path(resolvers.env('TEXMF'))
- insert(t,1,specification)
- local newspec = concat(t,";")
- if instance.environment["TEXMF"] then
- instance.environment["TEXMF"] = newspec
- elseif instance.variables["TEXMF"] then
- instance.variables["TEXMF"] = newspec
- else
- -- weird
- end
- resolvers.expand_variables()
- reset_hashes()
-end
-
--- locators
-
-function resolvers.locatelists()
- local texmfpaths = resolvers.clean_path_list('TEXMF')
- for i=1,#texmfpaths do
- local path = texmfpaths[i]
- if trace_locating then
- logs.report("fileio","locating list of '%s'",path)
- end
- resolvers.locatedatabase(file.collapse_path(path))
- end
-end
-
-function resolvers.locatedatabase(specification)
- return resolvers.methodhandler('locators', specification)
-end
-
-function resolvers.locators.tex(specification)
- if specification and specification ~= '' and lfs.isdir(specification) then
- if trace_locating then
- logs.report("fileio","tex locator '%s' found",specification)
- end
- resolvers.append_hash('file',specification,filename)
elseif trace_locating then
- logs.report("fileio","tex locator '%s' not found",specification)
+ report_resolving("warning: no lua configuration files found")
end
end
--- hashers
-
-function resolvers.hashdatabase(tag,name)
- return resolvers.methodhandler('hashers',tag,name)
-end
+-- scheme magic ... database loading
-function resolvers.loadfiles()
- instance.loaderror = false
- instance.files = { }
+local function load_file_databases()
+ instance.loaderror, instance.files = false, allocate()
if not instance.renewcache then
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- resolvers.hashdatabase(hash.tag,hash.name)
+ resolvers.hashers.byscheme(hash.type,hash.name)
if instance.loaderror then break end
end
end
end
-function resolvers.hashers.tex(tag,name)
- resolvers.load_data(tag,'files')
-end
-
--- generators:
-
-function resolvers.loadlists()
- local hashes = instance.hashes
- for i=1,#hashes do
- resolvers.generatedatabase(hashes[i].tag)
- end
-end
-
-function resolvers.generatedatabase(specification)
- return resolvers.methodhandler('generators', specification)
-end
-
--- starting with . or .. etc or funny char
-
-local weird = lpeg.P(".")^1 + lpeg.anywhere(lpeg.S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
-
---~ local l_forbidden = lpeg.S("~`!#$%^&*()={}[]:;\"\'||\\/<>,?\n\r\t")
---~ local l_confusing = lpeg.P(" ")
---~ local l_character = lpeg.patterns.utf8
---~ local l_dangerous = lpeg.P(".")
-
---~ local l_normal = (l_character - l_forbidden - l_confusing - l_dangerous) * (l_character - l_forbidden - l_confusing^2)^0 * lpeg.P(-1)
---~ ----- l_normal = l_normal * lpeg.Cc(true) + lpeg.Cc(false)
-
---~ local function test(str)
---~ print(str,lpeg.match(l_normal,str))
---~ end
---~ test("ヒラギノ明朝 Pro W3")
---~ test("..ヒラギノ明朝 Pro W3")
---~ test(":ヒラギノ明朝 Pro W3;")
---~ test("ヒラギノ明朝 /Pro W3;")
---~ test("ヒラギノ明朝 Pro W3")
-
-function resolvers.generators.tex(specification)
- local tag = specification
- if trace_locating then
- logs.report("fileio","scanning path '%s'",specification)
- end
- instance.files[tag] = { }
- local files = instance.files[tag]
- local n, m, r = 0, 0, 0
- local spec = specification .. '/'
- local attributes = lfs.attributes
- local directory = lfs.dir
- local function action(path)
- local full
- if path then
- full = spec .. path .. '/'
- else
- full = spec
- end
- for name in directory(full) do
- if not lpegmatch(weird,name) then
- -- if lpegmatch(l_normal,name) then
- local mode = attributes(full..name,'mode')
- if mode == 'file' then
- if path then
- n = n + 1
- local f = files[name]
- if f then
- if type(f) == 'string' then
- files[name] = { f, path }
- else
- f[#f+1] = path
- end
- else -- probably unique anyway
- files[name] = path
- local lower = lower(name)
- if name ~= lower then
- files["remap:"..lower] = name
- r = r + 1
- end
- end
- end
- elseif mode == 'directory' then
- m = m + 1
- if path then
- action(path..'/'..name)
+local function locate_file_databases()
+ -- todo: cache:// and tree:// (runtime)
+ local texmfpaths = resolvers.expandedpathlist('TEXMF')
+ if #texmfpaths > 0 then
+ for i=1,#texmfpaths do
+ local path = collapsepath(texmfpaths[i])
+ local stripped = lpegmatch(inhibitstripper,path) -- the !! thing
+ if stripped ~= "" then
+ local runtime = stripped == path
+ path = resolvers.cleanpath(path)
+ local spec = resolvers.splitmethod(stripped)
+ if spec.scheme == "cache" or spec.scheme == "file" then
+ stripped = spec.path
+ elseif runtime and (spec.noscheme or spec.scheme == "file") then
+ stripped = "tree:///" .. stripped
+ end
+ if trace_locating then
+ if runtime then
+ report_resolving("locating list of '%s' (runtime)",path)
else
- action(name)
+ report_resolving("locating list of '%s' (cached)",path)
end
end
+ methodhandler('locators',stripped)
end
end
- end
- action()
- if trace_locating then
- logs.report("fileio","%s files found on %s directories with %s uppercase remappings",n,m,r)
+ if trace_locating then
+ report_resolving()
+ end
+ elseif trace_locating then
+ report_resolving("no texmf paths are defined (using TEXMF)")
end
end
--- savers, todo
-
-function resolvers.savefiles()
- resolvers.save_data('files')
+local function generate_file_databases()
+ local hashes = instance.hashes
+ for k=1,#hashes do
+ local hash = hashes[k]
+ methodhandler('generators',hash.name)
+ end
+ if trace_locating then
+ report_resolving()
+ end
end
--- A config (optionally) has the paths split in tables. Internally
--- we join them and split them after the expansion has taken place. This
--- is more convenient.
-
---~ local checkedsplit = string.checkedsplit
-
-local cache = { }
-
-local splitter = lpeg.Ct(lpeg.splitat(lpeg.S(os.type == "windows" and ";" or ":;")))
-
-local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
- local found = cache[str]
- if not found then
- if str == "" then
- found = { }
- else
- str = gsub(str,"\\","/")
---~ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
-local split = lpegmatch(splitter,str)
- found = { }
- for i=1,#split do
- local s = split[i]
- if not find(s,"^{*unset}*") then
- found[#found+1] = s
- end
- end
- if trace_expansions then
- logs.report("fileio","splitting path specification '%s'",str)
- for k=1,#found do
- logs.report("fileio","% 4i: %s",k,found[k])
- end
+local function save_file_databases() -- will become cachers
+ for i=1,#instance.hashes do
+ local hash = instance.hashes[i]
+ local cachename = hash.name
+ if hash.cache then
+ local content = instance.files[cachename]
+ caches.collapsecontent(content)
+ if trace_locating then
+ report_resolving("saving tree '%s'",cachename)
end
- cache[str] = found
+ caches.savecontent(cachename,"files",content)
+ elseif trace_locating then
+ report_resolving("not saving runtime tree '%s'",cachename)
end
end
- return found
end
-resolvers.split_kpse_path = split_kpse_path
-
-function resolvers.splitconfig()
- for i=1,#instance do
- local c = instance[i]
- for k,v in next, c do
- if type(v) == 'string' then
- local t = split_kpse_path(v)
- if #t > 1 then
- c[k] = t
- end
- end
+local function load_databases()
+ locate_file_databases()
+ if instance.diskcache and not instance.renewcache then
+ load_file_databases()
+ if instance.loaderror then
+ generate_file_databases()
+ save_file_databases()
+ end
+ else
+ generate_file_databases()
+ if instance.renewcache then
+ save_file_databases()
end
end
end
-function resolvers.joinconfig()
- local order = instance.order
- for i=1,#order do
- local c = order[i]
- for k,v in next, c do -- indexed?
- if type(v) == 'table' then
- c[k] = file.join_path(v)
- end
+function resolvers.appendhash(type,name,cache)
+ -- safeguard ... tricky as it's actually a bug when seen twice
+ if not instance.hashed[name] then
+ if trace_locating then
+ report_resolving("hash '%s' appended",name)
end
+ insert(instance.hashes, { type = type, name = name, cache = cache } )
+ instance.hashed[name] = cache
end
end
-function resolvers.split_path(str)
- if type(str) == 'table' then
- return str
- else
- return split_kpse_path(str)
+function resolvers.prependhash(type,name,cache)
+ -- safeguard ... tricky as it's actually a bug when seen twice
+ if not instance.hashed[name] then
+ if trace_locating then
+ report_resolving("hash '%s' prepended",name)
+ end
+ insert(instance.hashes, 1, { type = type, name = name, cache = cache } )
+ instance.hashed[name] = cache
end
end
-function resolvers.join_path(str)
- if type(str) == 'table' then
- return file.join_path(str)
+function resolvers.extendtexmfvariable(specification) -- crap, we could better prepend the hash
+ local t = resolvers.splitpath(getenv('TEXMF'))
+ insert(t,1,specification)
+ local newspec = concat(t,";")
+ if instance.environment["TEXMF"] then
+ instance.environment["TEXMF"] = newspec
+ elseif instance.variables["TEXMF"] then
+ instance.variables["TEXMF"] = newspec
else
- return str
+ -- weird
end
+ reset_hashes()
end
function resolvers.splitexpansions()
local ie = instance.expansions
for k,v in next, ie do
- local t, h, p = { }, { }, split_kpse_path(v)
+ local t, tn, h, p = { }, 0, { }, splitconfigurationpath(v)
for kk=1,#p do
local vv = p[kk]
if vv ~= "" and not h[vv] then
- t[#t+1] = vv
+ tn = tn + 1
+ t[tn] = vv
h[vv] = true
end
end
@@ -9184,343 +11600,92 @@ end
-- end of split/join code
-function resolvers.saveoldconfig()
- resolvers.splitconfig()
- resolvers.save_data('configuration')
- resolvers.joinconfig()
-end
-
-resolvers.configbanner = [[
--- This is a Luatex configuration file created by 'luatools.lua' or
--- 'luatex.exe' directly. For comment, suggestions and questions you can
--- contact the ConTeXt Development Team. This configuration file is
--- not copyrighted. [HH & TH]
-]]
-
-function resolvers.serialize(files)
- -- This version is somewhat optimized for the kind of
- -- tables that we deal with, so it's much faster than
- -- the generic serializer. This makes sense because
- -- luatools and mtxtools are called frequently. Okay,
- -- we pay a small price for properly tabbed tables.
- local t = { }
- local function dump(k,v,m) -- could be moved inline
- if type(v) == 'string' then
- return m .. "['" .. k .. "']='" .. v .. "',"
- elseif #v == 1 then
- return m .. "['" .. k .. "']='" .. v[1] .. "',"
- else
- return m .. "['" .. k .. "']={'" .. concat(v,"','").. "'},"
- end
- end
- t[#t+1] = "return {"
- if instance.sortdata then
- local sortedfiles = sortedkeys(files)
- for i=1,#sortedfiles do
- local k = sortedfiles[i]
- local fk = files[k]
- if type(fk) == 'table' then
- t[#t+1] = "\t['" .. k .. "']={"
- local sortedfk = sortedkeys(fk)
- for j=1,#sortedfk do
- local kk = sortedfk[j]
- t[#t+1] = dump(kk,fk[kk],"\t\t")
- end
- t[#t+1] = "\t},"
- else
- t[#t+1] = dump(k,fk,"\t")
- end
- end
- else
- for k, v in next, files do
- if type(v) == 'table' then
- t[#t+1] = "\t['" .. k .. "']={"
- for kk,vv in next, v do
- t[#t+1] = dump(kk,vv,"\t\t")
- end
- t[#t+1] = "\t},"
- else
- t[#t+1] = dump(k,v,"\t")
- end
- end
- end
- t[#t+1] = "}"
- return concat(t,"\n")
-end
-
-local data_state = { }
+-- we used to have 'files' and 'configurations' so therefore the following
+-- shared function
-function resolvers.data_state()
- return data_state or { }
-end
-
-function resolvers.save_data(dataname, makename) -- untested without cache overload
- for cachename, files in next, instance[dataname] do
- local name = (makename or file.join)(cachename,dataname)
- local luaname, lucname = name .. ".lua", name .. ".luc"
- if trace_locating then
- logs.report("fileio","preparing '%s' for '%s'",dataname,cachename)
- end
- for k, v in next, files do
- if type(v) == "table" and #v == 1 then
- files[k] = v[1]
- end
- end
- local data = {
- type = dataname,
- root = cachename,
- version = resolvers.cacheversion,
- date = os.date("%Y-%m-%d"),
- time = os.date("%H:%M:%S"),
- content = files,
- uuid = os.uuid(),
- }
- local ok = io.savedata(luaname,resolvers.serialize(data))
- if ok then
- if trace_locating then
- logs.report("fileio","'%s' saved in '%s'",dataname,luaname)
- end
- if utils.lua.compile(luaname,lucname,false,true) then -- no cleanup but strip
- if trace_locating then
- logs.report("fileio","'%s' compiled to '%s'",dataname,lucname)
- end
- else
- if trace_locating then
- logs.report("fileio","compiling failed for '%s', deleting file '%s'",dataname,lucname)
- end
- os.remove(lucname)
- end
- elseif trace_locating then
- logs.report("fileio","unable to save '%s' in '%s' (access error)",dataname,luaname)
- end
- end
-end
-
-function resolvers.load_data(pathname,dataname,filename,makename) -- untested without cache overload
- filename = ((not filename or (filename == "")) and dataname) or filename
- filename = (makename and makename(dataname,filename)) or file.join(pathname,filename)
- local blob = loadfile(filename .. ".luc") or loadfile(filename .. ".lua")
- if blob then
- local data = blob()
- if data and data.content and data.type == dataname and data.version == resolvers.cacheversion then
- data_state[#data_state+1] = data.uuid
- if trace_locating then
- logs.report("fileio","loading '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
- instance[dataname][pathname] = data.content
- else
- if trace_locating then
- logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
- instance[dataname][pathname] = { }
- instance.loaderror = true
- end
- elseif trace_locating then
- logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
-end
-
--- some day i'll use the nested approach, but not yet (actually we even drop
--- engine/progname support since we have only luatex now)
---
--- first texmfcnf.lua files are located, next the cached texmf.cnf files
---
--- return {
--- TEXMFBOGUS = 'effe checken of dit werkt',
--- }
-
-function resolvers.resetconfig()
- identify_own()
- instance.configuration, instance.setup, instance.order, instance.loaderror = { }, { }, { }, false
-end
-
-function resolvers.loadnewconfig()
- local luafiles = instance.luafiles
- for i=1,#luafiles do
- local cnf = luafiles[i]
- local pathname = file.dirname(cnf)
- local filename = file.join(pathname,resolvers.luaname)
- local blob = loadfile(filename)
- if blob then
- local data = blob()
- if data then
- if trace_locating then
- logs.report("fileio","loading configuration file '%s'",filename)
- end
- if true then
- -- flatten to variable.progname
- local t = { }
- for k, v in next, data do -- v = progname
- if type(v) == "string" then
- t[k] = v
- else
- for kk, vv in next, v do -- vv = variable
- if type(vv) == "string" then
- t[vv.."."..v] = kk
- end
- end
- end
- end
- instance['setup'][pathname] = t
- else
- instance['setup'][pathname] = data
- end
- else
- if trace_locating then
- logs.report("fileio","skipping configuration file '%s'",filename)
- end
- instance['setup'][pathname] = { }
- instance.loaderror = true
- end
- elseif trace_locating then
- logs.report("fileio","skipping configuration file '%s'",filename)
- end
- instance.order[#instance.order+1] = instance.setup[pathname]
- if instance.loaderror then break end
- end
-end
-
-function resolvers.loadoldconfig()
- if not instance.renewcache then
- local cnffiles = instance.cnffiles
- for i=1,#cnffiles do
- local cnf = cnffiles[i]
- local dname = file.dirname(cnf)
- resolvers.load_data(dname,'configuration')
- instance.order[#instance.order+1] = instance.configuration[dname]
- if instance.loaderror then break end
- end
- end
- resolvers.joinconfig()
-end
-
-function resolvers.expand_variables()
- local expansions, environment, variables = { }, instance.environment, instance.variables
- local env = resolvers.env
- instance.expansions = expansions
- local engine, progname = instance.engine, instance.progname
- if type(engine) ~= "string" then instance.engine, engine = "", "" end
- if type(progname) ~= "string" then instance.progname, progname = "", "" end
- if engine ~= "" then environment['engine'] = engine end
- if progname ~= "" then environment['progname'] = progname end
- for k,v in next, environment do
- local a, b = match(k,"^(%a+)%_(.*)%s*$")
- if a and b then
- expansions[a..'.'..b] = v
- else
- expansions[k] = v
- end
- end
- for k,v in next, environment do -- move environment to expansions
- if not expansions[k] then expansions[k] = v end
- end
- for k,v in next, variables do -- move variables to expansions
- if not expansions[k] then expansions[k] = v end
- end
- local busy = false
- local function resolve(a)
- busy = true
- return expansions[a] or env(a)
- end
- while true do
- busy = false
- for k,v in next, expansions do
- local s, n = gsub(v,"%$([%a%d%_%-]+)",resolve)
- local s, m = gsub(s,"%$%{([%a%d%_%-]+)%}",resolve)
- if n > 0 or m > 0 then
- expansions[k]= s
- end
- end
- if not busy then break end
- end
- for k,v in next, expansions do
- expansions[k] = gsub(v,"\\", '/')
- end
+function resolvers.datastate()
+ return caches.contentstate()
end
function resolvers.variable(name)
- return entry(instance.variables,name)
+ local name = name and lpegmatch(dollarstripper,name)
+ local result = name and instance.variables[name]
+ return result ~= nil and result or ""
end
function resolvers.expansion(name)
- return entry(instance.expansions,name)
-end
-
-function resolvers.is_variable(name)
- return is_entry(instance.variables,name)
-end
-
-function resolvers.is_expansion(name)
- return is_entry(instance.expansions,name)
+ local name = name and lpegmatch(dollarstripper,name)
+ local result = name and instance.expansions[name]
+ return result ~= nil and result or ""
end
-function resolvers.unexpanded_path_list(str)
+function resolvers.unexpandedpathlist(str)
local pth = resolvers.variable(str)
- local lst = resolvers.split_path(pth)
- return expanded_path_from_list(lst)
+ local lst = resolvers.splitpath(pth)
+ return expandedpathfromlist(lst)
end
-function resolvers.unexpanded_path(str)
- return file.join_path(resolvers.unexpanded_path_list(str))
+function resolvers.unexpandedpath(str)
+ return joinpath(resolvers.unexpandedpathlist(str))
end
-do -- no longer needed
-
- local done = { }
+local done = { }
- function resolvers.reset_extra_path()
- local ep = instance.extra_paths
- if not ep then
- ep, done = { }, { }
- instance.extra_paths = ep
- elseif #ep > 0 then
- instance.lists, done = { }, { }
- end
+function resolvers.resetextrapath()
+ local ep = instance.extra_paths
+ if not ep then
+ ep, done = { }, { }
+ instance.extra_paths = ep
+ elseif #ep > 0 then
+ instance.lists, done = { }, { }
end
+end
- function resolvers.register_extra_path(paths,subpaths)
- local ep = instance.extra_paths or { }
- local n = #ep
- if paths and paths ~= "" then
- if subpaths and subpaths ~= "" then
- for p in gmatch(paths,"[^,]+") do
- -- we gmatch each step again, not that fast, but used seldom
- for s in gmatch(subpaths,"[^,]+") do
- local ps = p .. "/" .. s
- if not done[ps] then
- ep[#ep+1] = resolvers.clean_path(ps)
- done[ps] = true
- end
- end
- end
- else
- for p in gmatch(paths,"[^,]+") do
- if not done[p] then
- ep[#ep+1] = resolvers.clean_path(p)
- done[p] = true
- end
- end
- end
- elseif subpaths and subpaths ~= "" then
- for i=1,n do
+function resolvers.registerextrapath(paths,subpaths)
+ local ep = instance.extra_paths or { }
+ local oldn = #ep
+ local newn = oldn
+ if paths and paths ~= "" then
+ if subpaths and subpaths ~= "" then
+ for p in gmatch(paths,"[^,]+") do
-- we gmatch each step again, not that fast, but used seldom
for s in gmatch(subpaths,"[^,]+") do
- local ps = ep[i] .. "/" .. s
+ local ps = p .. "/" .. s
if not done[ps] then
- ep[#ep+1] = resolvers.clean_path(ps)
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(ps)
done[ps] = true
end
end
end
+ else
+ for p in gmatch(paths,"[^,]+") do
+ if not done[p] then
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(p)
+ done[p] = true
+ end
+ end
end
- if #ep > 0 then
- instance.extra_paths = ep -- register paths
- end
- if #ep > n then
- instance.lists = { } -- erase the cache
+ elseif subpaths and subpaths ~= "" then
+ for i=1,oldn do
+ -- we gmatch each step again, not that fast, but used seldom
+ for s in gmatch(subpaths,"[^,]+") do
+ local ps = ep[i] .. "/" .. s
+ if not done[ps] then
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(ps)
+ done[ps] = true
+ end
+ end
end
end
-
+ if newn > 0 then
+ instance.extra_paths = ep -- register paths
+ end
+ if newn > oldn then
+ instance.lists = { } -- erase the cache
+ end
end
local function made_list(instance,list)
@@ -9528,14 +11693,15 @@ local function made_list(instance,list)
if not ep or #ep == 0 then
return list
else
- local done, new = { }, { }
+ 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
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
else
break
end
@@ -9546,7 +11712,8 @@ local function made_list(instance,list)
local v = ep[k]
if not done[v] then
done[v] = true
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
end
end
-- next the formal paths
@@ -9554,118 +11721,95 @@ local function made_list(instance,list)
local v = list[k]
if not done[v] then
done[v] = true
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
end
end
return new
end
end
-function resolvers.clean_path_list(str)
- local t = resolvers.expanded_path_list(str)
+function resolvers.cleanpathlist(str)
+ local t = resolvers.expandedpathlist(str)
if t then
for i=1,#t do
- t[i] = file.collapse_path(resolvers.clean_path(t[i]))
+ t[i] = collapsepath(resolvers.cleanpath(t[i]))
end
end
return t
end
-function resolvers.expand_path(str)
- return file.join_path(resolvers.expanded_path_list(str))
+function resolvers.expandpath(str)
+ return joinpath(resolvers.expandedpathlist(str))
end
-function resolvers.expanded_path_list(str)
+function resolvers.expandedpathlist(str)
if not str then
- return ep or { } -- ep ?
+ return { }
elseif instance.savelists then
- -- engine+progname hash
- str = gsub(str,"%$","")
+ str = lpegmatch(dollarstripper,str)
if not instance.lists[str] then -- cached
- local lst = made_list(instance,resolvers.split_path(resolvers.expansion(str)))
- instance.lists[str] = expanded_path_from_list(lst)
+ local lst = made_list(instance,resolvers.splitpath(resolvers.expansion(str)))
+ instance.lists[str] = expandedpathfromlist(lst)
end
return instance.lists[str]
else
- local lst = resolvers.split_path(resolvers.expansion(str))
- return made_list(instance,expanded_path_from_list(lst))
- end
-end
-
-function resolvers.expanded_path_list_from_var(str) -- brrr
- local tmp = resolvers.var_of_format_or_suffix(gsub(str,"%$",""))
- if tmp ~= "" then
- return resolvers.expanded_path_list(tmp)
- else
- return resolvers.expanded_path_list(str)
+ local lst = resolvers.splitpath(resolvers.expansion(str))
+ return made_list(instance,expandedpathfromlist(lst))
end
end
-function resolvers.expand_path_from_var(str)
- return file.join_path(resolvers.expanded_path_list_from_var(str))
+function resolvers.expandedpathlistfromvariable(str) -- brrr
+ str = lpegmatch(dollarstripper,str)
+ local tmp = resolvers.variableofformatorsuffix(str)
+ return resolvers.expandedpathlist(tmp ~= "" and tmp or str)
end
-function resolvers.format_of_var(str)
- return formats[str] or formats[alternatives[str]] or ''
-end
-function resolvers.format_of_suffix(str)
- return suffixmap[file.extname(str)] or 'tex'
+function resolvers.expandpathfromvariable(str)
+ return joinpath(resolvers.expandedpathlistfromvariable(str))
end
-function resolvers.variable_of_format(str)
- return formats[str] or formats[alternatives[str]] or ''
+function resolvers.expandbraces(str) -- output variable and brace expansion of STRING
+ local ori = resolvers.variable(str)
+ local pth = expandedpathfromlist(resolvers.splitpath(ori))
+ return joinpath(pth)
end
-function resolvers.var_of_format_or_suffix(str)
- local v = formats[str]
- if v then
- return v
- end
- v = formats[alternatives[str]]
- if v then
- return v
- end
- v = suffixmap[file.extname(str)]
- if v then
- return formats[isf]
+function resolvers.registerfilehash(name,content,someerror)
+ if content then
+ instance.files[name] = content
+ else
+ instance.files[name] = { }
+ if somerror == true then -- can be unset
+ instance.loaderror = someerror
+ end
end
- return ''
-end
-
-function resolvers.expand_braces(str) -- output variable and brace expansion of STRING
- local ori = resolvers.variable(str)
- local pth = expanded_path_from_list(resolvers.split_path(ori))
- return file.join_path(pth)
end
-resolvers.isreadable = { }
-
-function resolvers.isreadable.file(name)
- local readable = lfs.isfile(name) -- brrr
+local function isreadable(name)
+ local readable = lfs.isfile(name) -- not file.is_readable(name) asit can be a dir
if trace_detail then
if readable then
- logs.report("fileio","file '%s' is readable",name)
+ report_resolving("file '%s' is readable",name)
else
- logs.report("fileio","file '%s' is not readable", name)
+ report_resolving("file '%s' is not readable", name)
end
end
return readable
end
-resolvers.isreadable.tex = resolvers.isreadable.file
-
-- name
-- name/name
local function collect_files(names)
- local filelist = { }
+ local filelist, noffiles = { }, 0
for k=1,#names do
local fname = names[k]
if trace_detail then
- logs.report("fileio","checking name '%s'",fname)
+ report_resolving("checking name '%s'",fname)
end
- local bname = file.basename(fname)
- local dname = file.dirname(fname)
+ local bname = filebasename(fname)
+ local dname = filedirname(fname)
if dname == "" or find(dname,"^%.") then
dname = false
else
@@ -9674,11 +11818,11 @@ local function collect_files(names)
local hashes = instance.hashes
for h=1,#hashes do
local hash = hashes[h]
- local blobpath = hash.tag
+ local blobpath = hash.name
local files = blobpath and instance.files[blobpath]
if files then
if trace_detail then
- logs.report("fileio","deep checking '%s' (%s)",blobpath,bname)
+ report_resolving("deep checking '%s' (%s)",blobpath,bname)
end
local blobfile = files[bname]
if not blobfile then
@@ -9690,62 +11834,51 @@ local function collect_files(names)
end
end
if blobfile then
+ local blobroot = files.__path__ or blobpath
if type(blobfile) == 'string' then
if not dname or find(blobfile,dname) then
- filelist[#filelist+1] = {
- hash.type,
- file.join(blobpath,blobfile,bname), -- search
- resolvers.concatinators[hash.type](blobpath,blobfile,bname) -- result
- }
+ 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 '%s', search '%s', result '%s'",variant,search,result)
+ end
+ noffiles = noffiles + 1
+ filelist[noffiles] = { variant, search, result }
end
else
for kk=1,#blobfile do
local vv = blobfile[kk]
if not dname or find(vv,dname) then
- filelist[#filelist+1] = {
- hash.type,
- file.join(blobpath,vv,bname), -- search
- resolvers.concatinators[hash.type](blobpath,vv,bname) -- result
- }
+ 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 '%s', search '%s', result '%s'",variant,search,result)
+ end
+ noffiles = noffiles + 1
+ filelist[noffiles] = { variant, search, result }
end
end
end
end
elseif trace_locating then
- logs.report("fileio","no match in '%s' (%s)",blobpath,bname)
+ report_resolving("no match in '%s' (%s)",blobpath,bname)
end
end
end
- if #filelist > 0 then
- return filelist
- else
- return nil
- end
+ return noffiles > 0 and filelist or nil
end
-function resolvers.suffix_of_format(str)
- if suffixes[str] then
- return suffixes[str][1]
- else
- return ""
- end
-end
-
-function resolvers.suffixes_of_format(str)
- if suffixes[str] then
- return suffixes[str]
- else
- return {}
- end
-end
-
-function resolvers.register_in_trees(name)
+function resolvers.registerintrees(name)
if not find(name,"^%.") then
instance.foundintrees[name] = (instance.foundintrees[name] or 0) + 1 -- maybe only one
end
end
--- split the next one up for readability (bu this module needs a cleanup anyway)
+-- split the next one up for readability (but this module needs a cleanup anyway)
local function can_be_dir(name) -- can become local
local fakepaths = instance.fakepaths
@@ -9756,61 +11889,62 @@ local function can_be_dir(name) -- can become local
fakepaths[name] = 2 -- no directory
end
end
- return (fakepaths[name] == 1)
+ return fakepaths[name] == 1
end
-local function collect_instance_files(filename,collected) -- todo : plugin (scanners, checkers etc)
- local result = collected or { }
+local preparetreepattern = Cs((P(".")/"%%." + P("-")/"%%-" + P(1))^0 * Cc("$"))
+
+-- this one is split in smaller functions but it needs testing
+
+local function collect_instance_files(filename,askedformat,allresults) -- todo : plugin (scanners, checkers etc)
+ local result = { }
local stamp = nil
- filename = file.collapse_path(filename)
+ askedformat = askedformat or ""
+ filename = collapsepath(filename)
-- speed up / beware: format problem
- if instance.remember then
- stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format
+ if instance.remember and not allresults then
+ stamp = filename .. "--" .. askedformat
if instance.found[stamp] then
if trace_locating then
- logs.report("fileio","remembering file '%s'",filename)
+ report_resolving("remembered file '%s'",filename)
end
+ resolvers.registerintrees(filename) -- for tracing used files
return instance.found[stamp]
end
end
- if not dangerous[instance.format or "?"] then
- if resolvers.isreadable.file(filename) then
+ if not dangerous[askedformat] then
+ if isreadable(filename) then
if trace_detail then
- logs.report("fileio","file '%s' found directly",filename)
+ report_resolving("file '%s' found directly",filename)
+ end
+ if stamp then
+ instance.found[stamp] = { filename }
end
- instance.found[stamp] = { filename }
return { filename }
end
end
if find(filename,'%*') then
if trace_locating then
- logs.report("fileio","checking wildcard '%s'", filename)
+ report_resolving("checking wildcard '%s'", filename)
end
- result = resolvers.find_wildcard_files(filename)
+ result = resolvers.findwildcardfiles(filename) -- we can use th elocal
elseif file.is_qualified_path(filename) then
- if resolvers.isreadable.file(filename) then
+ if isreadable(filename) then
if trace_locating then
- logs.report("fileio","qualified name '%s'", filename)
+ report_resolving("qualified name '%s'", filename)
end
result = { filename }
else
- local forcedname, ok, suffix = "", false, file.extname(filename)
+ local forcedname, ok, suffix = "", false, fileextname(filename)
if suffix == "" then -- why
- if instance.format == "" then
- forcedname = filename .. ".tex"
- if resolvers.isreadable.file(forcedname) then
- if trace_locating then
- logs.report("fileio","no suffix, forcing standard filetype 'tex'")
- end
- result, ok = { forcedname }, true
- end
- else
- local suffixes = resolvers.suffixes_of_format(instance.format)
- for _, s in next, suffixes do
+ local format_suffixes = askedformat == "" and resolvers.defaultsuffixes or suffixes[askedformat]
+ if format_suffixes then
+ for i=1,#format_suffixes do
+ local s = format_suffixes[i]
forcedname = filename .. "." .. s
- if resolvers.isreadable.file(forcedname) then
+ if isreadable(forcedname) then
if trace_locating then
- logs.report("fileio","no suffix, forcing format filetype '%s'", s)
+ report_resolving("no suffix, forcing format filetype '%s'", s)
end
result, ok = { forcedname }, true
break
@@ -9821,23 +11955,24 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
if not ok and suffix ~= "" then
-- try to find in tree (no suffix manipulation), here we search for the
-- matching last part of the name
- local basename = file.basename(filename)
- local pattern = gsub(filename .. "$","([%.%-])","%%%1")
- local savedformat = instance.format
+ local basename = filebasename(filename)
+ local pattern = lpegmatch(preparetreepattern,filename)
+ -- messy .. to be sorted out
+ local savedformat = askedformat
local format = savedformat or ""
if format == "" then
- instance.format = resolvers.format_of_suffix(suffix)
+ askedformat = resolvers.formatofsuffix(suffix)
end
if not format then
- instance.format = "othertextfiles" -- kind of everything, maybe texinput is better
+ askedformat = "othertextfiles" -- kind of everything, maybe texinput is better
end
--
if basename ~= filename then
- local resolved = collect_instance_files(basename)
- if #result == 0 then
+ local resolved = collect_instance_files(basename,askedformat,allresults)
+ if #result == 0 then -- shouldn't this be resolved ?
local lowered = lower(basename)
if filename ~= lowered then
- resolved = collect_instance_files(lowered)
+ resolved = collect_instance_files(lowered,askedformat,allresults)
end
end
resolvers.format = savedformat
@@ -9862,57 +11997,60 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
-- end
end
if not ok and trace_locating then
- logs.report("fileio","qualified name '%s'", filename)
+ report_resolving("qualified name '%s'", filename)
end
end
else
-- search spec
- local filetype, extra, done, wantedfiles, ext = '', nil, false, { }, file.extname(filename)
- if ext == "" then
- if not instance.force_suffixes then
- wantedfiles[#wantedfiles+1] = filename
- end
- else
- wantedfiles[#wantedfiles+1] = filename
- end
- if instance.format == "" then
- if ext == "" then
- local forcedname = filename .. '.tex'
- wantedfiles[#wantedfiles+1] = forcedname
- filetype = resolvers.format_of_suffix(forcedname)
- if trace_locating then
- logs.report("fileio","forcing filetype '%s'",filetype)
+ local filetype, done, wantedfiles, ext = '', false, { }, fileextname(filename)
+ -- -- tricky as filename can be bla.1.2.3
+ -- if not suffixmap[ext] then --- probably needs to be done elsewhere too
+ -- wantedfiles[#wantedfiles+1] = filename
+ -- end
+ wantedfiles[#wantedfiles+1] = filename
+ if askedformat == "" then
+ if ext == "" or not suffixmap[ext] then
+ local defaultsuffixes = resolvers.defaultsuffixes
+ for i=1,#defaultsuffixes do
+ local forcedname = filename .. '.' .. defaultsuffixes[i]
+ wantedfiles[#wantedfiles+1] = forcedname
+ filetype = resolvers.formatofsuffix(forcedname)
+ if trace_locating then
+ report_resolving("forcing filetype '%s'",filetype)
+ end
end
else
- filetype = resolvers.format_of_suffix(filename)
+ filetype = resolvers.formatofsuffix(filename)
if trace_locating then
- logs.report("fileio","using suffix based filetype '%s'",filetype)
+ report_resolving("using suffix based filetype '%s'",filetype)
end
end
else
- if ext == "" then
- local suffixes = resolvers.suffixes_of_format(instance.format)
- for _, s in next, suffixes do
- wantedfiles[#wantedfiles+1] = filename .. "." .. s
+ if ext == "" or not suffixmap[ext] then
+ local format_suffixes = suffixes[askedformat]
+ if format_suffixes then
+ for i=1,#format_suffixes do
+ wantedfiles[#wantedfiles+1] = filename .. "." .. format_suffixes[i]
+ end
end
end
- filetype = instance.format
+ filetype = askedformat
if trace_locating then
- logs.report("fileio","using given filetype '%s'",filetype)
+ report_resolving("using given filetype '%s'",filetype)
end
end
- local typespec = resolvers.variable_of_format(filetype)
- local pathlist = resolvers.expanded_path_list(typespec)
+ local typespec = resolvers.variableofformat(filetype)
+ local pathlist = resolvers.expandedpathlist(typespec)
if not pathlist or #pathlist == 0 then
-- no pathlist, access check only / todo == wildcard
if trace_detail then
- logs.report("fileio","checking filename '%s', filetype '%s', wanted files '%s'",filename, filetype or '?',concat(wantedfiles," | "))
+ report_resolving("checking filename '%s', filetype '%s', wanted files '%s'",filename, filetype or '?',concat(wantedfiles," | "))
end
for k=1,#wantedfiles do
local fname = wantedfiles[k]
- if fname and resolvers.isreadable.file(fname) then
+ if fname and isreadable(fname) then
filename, done = fname, true
- result[#result+1] = file.join('.',fname)
+ result[#result+1] = filejoin('.',fname)
break
end
end
@@ -9920,8 +12058,8 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
local filelist = collect_files(wantedfiles)
local fl = filelist and filelist[1]
if fl then
- filename = fl[3]
- result[#result+1] = filename
+ filename = fl[3] -- not local?
+ result[#result+1] = resolvers.resolve(filename)
done = true
end
else
@@ -9930,76 +12068,65 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
local dirlist = { }
if filelist then
for i=1,#filelist do
- dirlist[i] = file.dirname(filelist[i][2]) .. "/"
+ dirlist[i] = filedirname(filelist[i][3]) .. "/" -- was [2] .. gamble
end
end
if trace_detail then
- logs.report("fileio","checking filename '%s'",filename)
+ report_resolving("checking filename '%s'",filename)
end
- -- a bit messy ... esp the doscan setting here
- local doscan
for k=1,#pathlist do
local path = pathlist[k]
- if find(path,"^!!") then doscan = false else doscan = true end
- local pathname = gsub(path,"^!+", '')
+ local pathname = lpegmatch(inhibitstripper,path)
+ local doscan = path == pathname -- no ^!!
done = false
-- using file list
if filelist then
- local expression
-- compare list entries with permitted pattern -- /xx /xx//
- if not find(pathname,"/$") then
- expression = pathname .. "/"
- else
- expression = pathname
- end
- expression = gsub(expression,"([%-%.])","%%%1") -- this also influences
- expression = gsub(expression,"//+$", '/.*') -- later usage of pathname
- expression = gsub(expression,"//", '/.-/') -- not ok for /// but harmless
- expression = "^" .. expression .. "$"
+ local expression = makepathexpression(pathname)
if trace_detail then
- logs.report("fileio","using pattern '%s' for path '%s'",expression,pathname)
+ report_resolving("using pattern '%s' for path '%s'",expression,pathname)
end
for k=1,#filelist do
local fl = filelist[k]
local f = fl[2]
local d = dirlist[k]
if find(d,expression) then
- --- todo, test for readable
- result[#result+1] = fl[3]
- resolvers.register_in_trees(f) -- for tracing used files
+ -- todo, test for readable
+ result[#result+1] = resolvers.resolve(fl[3]) -- no shortcut
done = true
- if instance.allresults then
+ if allresults then
if trace_detail then
- logs.report("fileio","match in hash for file '%s' on path '%s', continue scanning",f,d)
+ report_resolving("match to '%s' in hash for file '%s' and path '%s', continue scanning",expression,f,d)
end
else
if trace_detail then
- logs.report("fileio","match in hash for file '%s' on path '%s', quit scanning",f,d)
+ report_resolving("match to '%s' in hash for file '%s' and path '%s', quit scanning",expression,f,d)
end
break
end
elseif trace_detail then
- logs.report("fileio","no match in hash for file '%s' on path '%s'",f,d)
+ report_resolving("no match to '%s' in hash for file '%s' and path '%s'",expression,f,d)
end
end
end
if not done and doscan then
-- check if on disk / unchecked / does not work at all / also zips
- if resolvers.splitmethod(pathname).scheme == 'file' then -- ?
+ local scheme = url.hasscheme(pathname)
+ if not scheme or scheme == "file" then
local pname = gsub(pathname,"%.%*$",'')
if not find(pname,"%*") then
local ppname = gsub(pname,"/+$","")
if can_be_dir(ppname) then
for k=1,#wantedfiles do
local w = wantedfiles[k]
- local fname = file.join(ppname,w)
- if resolvers.isreadable.file(fname) then
+ local fname = filejoin(ppname,w)
+ if isreadable(fname) then
if trace_detail then
- logs.report("fileio","found '%s' by scanning",fname)
+ report_resolving("found '%s' by scanning",fname)
end
result[#result+1] = fname
done = true
- if not instance.allresults then break end
+ if not allresults then break end
end
end
else
@@ -10009,56 +12136,66 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
end
end
if not done and doscan then
- -- todo: slow path scanning
+ -- todo: slow path scanning ... although we now have tree:// supported in $TEXMF
end
- if done and not instance.allresults then break end
+ if done and not allresults then break end
end
end
end
for k=1,#result do
- result[k] = file.collapse_path(result[k])
+ local rk = collapsepath(result[k])
+ result[k] = rk
+ resolvers.registerintrees(rk) -- for tracing used files
end
- if instance.remember then
+ if stamp then
instance.found[stamp] = result
end
return result
end
-if not resolvers.concatinators then resolvers.concatinators = { } end
+-- -- -- begin of main file search routing -- -- --
-resolvers.concatinators.tex = file.join
-resolvers.concatinators.file = resolvers.concatinators.tex
-function resolvers.find_files(filename,filetype,mustexist)
- if type(mustexist) == boolean then
- -- all set
- elseif type(filetype) == 'boolean' then
- filetype, mustexist = nil, false
- elseif type(filetype) ~= 'string' then
- filetype, mustexist = nil, false
- end
- instance.format = filetype or ''
- local result = collect_instance_files(filename)
+
+
+
+
+
+
+
+
+-- -- -- end of main file search routing -- -- --
+
+local function findfiles(filename,filetype,allresults)
+ local result = collect_instance_files(filename,filetype or "",allresults)
if #result == 0 then
local lowered = lower(filename)
if filename ~= lowered then
- return collect_instance_files(lowered)
+ return collect_instance_files(lowered,filetype or "",allresults)
end
end
- instance.format = ''
return result
end
-function resolvers.find_file(filename,filetype,mustexist)
- return (resolvers.find_files(filename,filetype,mustexist)[1] or "")
+function resolvers.findfiles(filename,filetype)
+ return findfiles(filename,filetype,true)
+end
+
+function resolvers.findfile(filename,filetype)
+ return findfiles(filename,filetype,false)[1] or ""
end
-function resolvers.find_given_files(filename)
- local bname, result = file.basename(filename), { }
+function resolvers.findpath(filename,filetype)
+ return filedirname(findfiles(filename,filetype,false)[1] or "")
+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.tag] or { }
+ local files = instance.files[hash.name] or { }
local blist = files[bname]
if not blist then
local rname = "remap:"..bname
@@ -10070,13 +12207,21 @@ function resolvers.find_given_files(filename)
end
if blist then
if type(blist) == 'string' then
- result[#result+1] = resolvers.concatinators[hash.type](hash.tag,blist,bname) or ""
- if not instance.allresults then break end
+ 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
else
for kk=1,#blist do
local vv = blist[kk]
- result[#result+1] = resolvers.concatinators[hash.type](hash.tag,vv,bname) or ""
- if not instance.allresults then break end
+ 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
+ end
end
end
end
@@ -10084,24 +12229,31 @@ function resolvers.find_given_files(filename)
return result
end
-function resolvers.find_given_file(filename)
- return (resolvers.find_given_files(filename)[1] or "")
+function resolvers.findgivenfiles(filename)
+ return findgivenfiles(filename,true)
+end
+
+function resolvers.findgivenfile(filename)
+ return findgivenfiles(filename,false)[1] or ""
end
-local function doit(path,blist,bname,tag,kind,result,allresults)
+local function doit(path,blist,bname,tag,variant,result,allresults)
local done = false
- if blist and kind then
+ 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
- result[#result+1] = resolvers.concatinators[kind](tag,blist,bname) or ""
+ 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
- result[#result+1] = resolvers.concatinators[kind](tag,vv,bname) or ""
+ local full = methodhandler('concatinators',variant,tag,vv,bname) or ""
+ result[#result+1] = resolve(full)
done = true
if not allresults then break end
end
@@ -10111,30 +12263,32 @@ local function doit(path,blist,bname,tag,kind,result,allresults)
return done
end
-function resolvers.find_wildcard_files(filename) -- todo: remap:
- local result = { }
- local bname, dname = file.basename(filename), file.dirname(filename)
- local path = gsub(dname,"^*/","")
- path = gsub(path,"*",".*")
- path = gsub(path,"-","%%-")
- if dname == "" then
- path = ".*"
- end
- local name = bname
- name = gsub(name,"*",".*")
- name = gsub(name,"-","%%-")
- path = lower(path)
- name = lower(name)
- local files, allresults, done = instance.files, instance.allresults, false
+
+local makewildcard = Cs(
+ (P("^")^0 * P("/") * P(-1) + P(-1)) /".*"
+ + (P("^")^0 * P("/") / "")^0 * (P("*")/".*" + P("-")/"%%-" + P(".")/"%%." + P("?")/"."+ P("\\")/"/" + P(1))^0
+)
+
+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 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
if find(name,"%*") then
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- local tag, kind = hash.tag, hash.type
- for kk, hh in next, files[hash.tag] do
+ 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,tag,kind,result,allresults) then done = true end
+ if doit(path,hh,kk,hashname,hashtype,result,allresults) then done = true end
if done and not allresults then break end
end
end
@@ -10144,8 +12298,8 @@ function resolvers.find_wildcard_files(filename) -- todo: remap:
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- local tag, kind = hash.tag, hash.type
- if doit(path,files[tag][bname],bname,tag,kind,result,allresults) then done = true end
+ local hashname, hashtype = hash.name, hash.type
+ if doit(path,files[hashname][bname],bname,hashname,hashtype,result,allresults) then done = true end
if done and not allresults then break end
end
end
@@ -10154,8 +12308,12 @@ function resolvers.find_wildcard_files(filename) -- todo: remap:
return result
end
-function resolvers.find_wildcard_file(filename)
- return (resolvers.find_wildcard_files(filename)[1] or "")
+function resolvers.findwildcardfiles(filename,result)
+ return findwildcardfiles(filename,true,result)
+end
+
+function resolvers.findwildcardfile(filename)
+ return findwildcardfiles(filename,false)[1] or ""
end
-- main user functions
@@ -10166,34 +12324,33 @@ end
function resolvers.load(option)
statistics.starttiming(instance)
- resolvers.resetconfig()
- resolvers.identify_cnf()
- resolvers.load_lua() -- will become the new method
- resolvers.expand_variables()
- resolvers.load_cnf() -- will be skipped when we have a lua file
- resolvers.expand_variables()
+ identify_configuration_files()
+ load_configuration_files()
if option ~= "nofiles" then
- resolvers.load_hash()
+ load_databases()
resolvers.automount()
end
statistics.stoptiming(instance)
+ local files = instance.files
+ return files and next(files) and true
+end
+
+local function report(str)
+ if trace_locating then
+ report_resolving(str) -- has already verbose
+ else
+ print(str)
+ end
end
-function resolvers.for_files(command, files, filetype, mustexist)
+function resolvers.dowithfilesandreport(command, files, ...) -- will move
if files and #files > 0 then
- local function report(str)
- if trace_locating then
- logs.report("fileio",str) -- has already verbose
- else
- print(str)
- end
- end
if trace_locating then
report('') -- ?
end
for f=1,#files do
local file = files[f]
- local result = command(file,filetype,mustexist)
+ local result = command(file,...)
if type(result) == 'string' then
report(result)
else
@@ -10205,21 +12362,16 @@ function resolvers.for_files(command, files, filetype, mustexist)
end
end
--- strtab
+-- obsolete
-resolvers.var_value = resolvers.variable -- output the value of variable $STRING.
-resolvers.expand_var = resolvers.expansion -- output variable expansion of STRING.
+-- resolvers.varvalue = resolvers.variable -- output the value of variable $STRING.
+-- resolvers.expandvar = resolvers.expansion -- output variable expansion of STRING.
-function resolvers.show_path(str) -- output search path for file type NAME
- return file.join_path(resolvers.expanded_path_list(resolvers.format_of_var(str)))
+function resolvers.showpath(str) -- output search path for file type NAME
+ return joinpath(resolvers.expandedpathlist(resolvers.formatofvariable(str)))
end
--- resolvers.find_file(filename)
--- resolvers.find_file(filename, filetype, mustexist)
--- resolvers.find_file(filename, mustexist)
--- resolvers.find_file(filename, filetype)
-
-function resolvers.register_file(files, name, path)
+function resolvers.registerfile(files, name, path)
if files[name] then
if type(files[name]) == 'string' then
files[name] = { files[name], path }
@@ -10231,101 +12383,24 @@ function resolvers.register_file(files, name, path)
end
end
-function resolvers.splitmethod(filename)
- if not filename then
- return { } -- safeguard
- elseif type(filename) == "table" then
- return filename -- already split
- elseif not find(filename,"://") then
- return { scheme="file", path = filename, original=filename } -- quick hack
- else
- return url.hashed(filename)
- end
-end
-
-function table.sequenced(t,sep) -- temp here
- local s = { }
- for k, v in next, t do -- indexed?
- s[#s+1] = k .. "=" .. tostring(v)
- end
- return concat(s, sep or " | ")
-end
-
-function resolvers.methodhandler(what, filename, filetype) -- ...
- filename = file.collapse_path(filename)
- local specification = (type(filename) == "string" and resolvers.splitmethod(filename)) or filename -- no or { }, let it bomb
- local scheme = specification.scheme
- if resolvers[what][scheme] then
- if trace_locating then
- logs.report("fileio","handler '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
- end
- return resolvers[what][scheme](filename,filetype) -- todo: specification
- else
- return resolvers[what].tex(filename,filetype) -- todo: specification
- end
-end
-
-function resolvers.clean_path(str)
- if str then
- str = gsub(str,"\\","/")
- str = gsub(str,"^!+","")
- str = gsub(str,"^~",resolvers.homedir)
- return str
- else
- return nil
- end
-end
-
-function resolvers.do_with_path(name,func)
- local pathlist = resolvers.expanded_path_list(name)
+function resolvers.dowithpath(name,func)
+ local pathlist = resolvers.expandedpathlist(name)
for i=1,#pathlist do
- func("^"..resolvers.clean_path(pathlist[i]))
+ func("^"..resolvers.cleanpath(pathlist[i]))
end
end
-function resolvers.do_with_var(name,func)
- func(expanded_var(name))
+function resolvers.dowithvariable(name,func)
+ func(expandedvariable(name))
end
-function resolvers.with_files(pattern,handle)
- local hashes = instance.hashes
- for i=1,#hashes do
- local hash = hashes[i]
- local blobpath = hash.tag
- local blobtype = hash.type
- if blobpath then
- local files = instance.files[blobpath]
- if files then
- for k,v in next, files do
- if find(k,"^remap:") then
- k = files[k]
- v = files[k] -- chained
- end
- if find(k,pattern) then
- if type(v) == "string" then
- handle(blobtype,blobpath,v,k)
- else
- for _,vv in next, v do -- indexed
- handle(blobtype,blobpath,vv,k)
- end
- end
- end
- end
- end
- end
- end
-end
-
-function resolvers.locate_format(name)
- local barename, fmtname = gsub(name,"%.%a+$",""), ""
- if resolvers.usecache then
- local path = file.join(caches.setpath("formats")) -- maybe platform
- fmtname = file.join(path,barename..".fmt") or ""
- end
+function resolvers.locateformat(name)
+ local barename = file.removesuffix(name) -- gsub(name,"%.%a+$","")
+ local fmtname = caches.getfirstreadablefile(barename..".fmt","formats") or ""
if fmtname == "" then
- fmtname = resolvers.find_files(barename..".fmt")[1] or ""
+ fmtname = resolvers.findfile(barename..".fmt")
+ fmtname = resolvers.cleanpath(fmtname)
end
- fmtname = resolvers.clean_path(fmtname)
if fmtname ~= "" then
local barename = file.removesuffix(fmtname)
local luaname, lucname, luiname = barename .. ".lua", barename .. ".luc", barename .. ".lui"
@@ -10340,7 +12415,7 @@ function resolvers.locate_format(name)
return nil, nil
end
-function resolvers.boolean_variable(str,default)
+function resolvers.booleanvariable(str,default)
local b = resolvers.expansion(str)
if b == "" then
return default
@@ -10350,204 +12425,62 @@ function resolvers.boolean_variable(str,default)
end
end
-texconfig.kpse_init = false
-
-kpse = { original = kpse } setmetatable(kpse, { __index = function(k,v) return resolvers[v] end } )
-
--- for a while
-
-input = resolvers
-
-
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['data-tmp'] = {
- 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"
-}
-
---[[ldx--
-<p>This module deals with caching data. It sets up the paths and
-implements loaders and savers for tables. Best is to set the
-following variable. When not set, the usual paths will be
-checked. Personally I prefer the (users) temporary path.</p>
-
-</code>
-TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;.
-</code>
-
-<p>Currently we do no locking when we write files. This is no real
-problem because most caching involves fonts and the chance of them
-being written at the same time is small. We also need to extend
-luatools with a recache feature.</p>
---ldx]]--
-
-local format, lower, gsub = string.format, string.lower, string.gsub
-
-local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end) -- not used yet
-
-caches = caches or { }
-
-caches.path = caches.path or nil
-caches.base = caches.base or "luatex-cache"
-caches.more = caches.more or "context"
-caches.direct = false -- true is faster but may need huge amounts of memory
-caches.tree = false
-caches.paths = caches.paths or nil
-caches.force = true -- changed for TEXLIVE by TH
-caches.defaults = { "TEXMFCACHE", "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
-
-function caches.temp()
- local cachepath = nil
- local function check(list,isenv)
- if not cachepath then
- for k=1,#list do
- local v = list[k]
- cachepath = (isenv and (os.env[v] or "")) or v or ""
- if cachepath == "" then
- -- next
- else
- cachepath = resolvers.clean_path(cachepath)
- if lfs.isdir(cachepath) and file.iswritable(cachepath) then -- lfs.attributes(cachepath,"mode") == "directory"
- break
- elseif caches.force or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then
- dir.mkdirs(cachepath)
- if lfs.isdir(cachepath) and file.iswritable(cachepath) then
- break
+function resolvers.dowithfilesintree(pattern,handle,before,after) -- will move, can be a nice iterator instead
+ local instance = resolvers.instance
+ local hashes = instance.hashes
+ for i=1,#hashes do
+ local hash = hashes[i]
+ local blobtype = hash.type
+ local blobpath = hash.name
+ if blobpath then
+ 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 next, files do
+ total = total + 1
+ if find(k,"^remap:") then
+ k = files[k]
+ v = k -- files[k] -- chained
+ end
+ if 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
end
end
end
- cachepath = nil
+ end
+ if after then
+ after(blobtype,blobpath,pattern,total,checked,done)
end
end
end
- check(resolvers.clean_path_list("TEXMFCACHE") or { })
- check(caches.defaults,true)
- if not cachepath then
- print("\nfatal error: there is no valid (writable) cache path defined\n")
- os.exit()
- elseif not lfs.isdir(cachepath) then -- lfs.attributes(cachepath,"mode") ~= "directory"
- print(format("\nfatal error: cache path %s is not a directory\n",cachepath))
- os.exit()
- end
- cachepath = file.collapse_path(cachepath)
- function caches.temp()
- return cachepath
- end
- return cachepath
-end
-
-function caches.configpath()
- return table.concat(resolvers.instance.cnffiles,";")
-end
-
-function caches.hashed(tree)
- return md5.hex(gsub(lower(tree),"[\\\/]+","/"))
-end
-
-function caches.treehash()
- local tree = caches.configpath()
- if not tree or tree == "" then
- return false
- else
- return caches.hashed(tree)
- end
-end
-
-function caches.setpath(...)
- if not caches.path then
- if not caches.path then
- caches.path = caches.temp()
- end
- caches.path = resolvers.clean_path(caches.path) -- to be sure
- caches.tree = caches.tree or caches.treehash()
- if caches.tree then
- caches.path = dir.mkdirs(caches.path,caches.base,caches.more,caches.tree)
- else
- caches.path = dir.mkdirs(caches.path,caches.base,caches.more)
- end
- end
- if not caches.path then
- caches.path = '.'
- end
- caches.path = resolvers.clean_path(caches.path)
- local dirs = { ... }
- if #dirs > 0 then
- local pth = dir.mkdirs(caches.path,...)
- return pth
- end
- caches.path = dir.expand_name(caches.path)
- return caches.path
-end
-
-function caches.definepath(category,subcategory)
- return function()
- return caches.setpath(category,subcategory)
- end
-end
-
-function caches.setluanames(path,name)
- return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
end
-function caches.loaddata(path,name)
- local tmaname, tmcname = caches.setluanames(path,name)
- local loader = loadfile(tmcname) or loadfile(tmaname)
- if loader then
- loader = loader()
- collectgarbage("step")
- return loader
- else
- return false
- end
-end
+resolvers.obsolete = resolvers.obsolete or { }
+local obsolete = resolvers.obsolete
---~ function caches.loaddata(path,name)
---~ local tmaname, tmcname = caches.setluanames(path,name)
---~ return dofile(tmcname) or dofile(tmaname)
---~ end
-
-function caches.iswritable(filepath,filename)
- local tmaname, tmcname = caches.setluanames(filepath,filename)
- return file.iswritable(tmaname)
-end
-
-function caches.savedata(filepath,filename,data,raw)
- local tmaname, tmcname = caches.setluanames(filepath,filename)
- local reduce, simplify = true, true
- if raw then
- reduce, simplify = false, false
- end
- data.cache_uuid = os.uuid()
- if caches.direct then
- file.savedata(tmaname, table.serialize(data,'return',false,true,false)) -- no hex
- else
- table.tofile(tmaname, data,'return',false,true,false) -- maybe not the last true
- end
- local cleanup = resolvers.boolean_variable("PURGECACHE", false)
- local strip = resolvers.boolean_variable("LUACSTRIP", true)
- utils.lua.compile(tmaname, tmcname, cleanup, strip)
-end
-
--- here we use the cache for format loading (texconfig.[formatname|jobname])
-
---~ if tex and texconfig and texconfig.formatname and texconfig.formatname == "" then
-if tex and texconfig and (not texconfig.formatname or texconfig.formatname == "") and input and resolvers.instance then
- if not texconfig.luaname then texconfig.luaname = "cont-en.lua" end -- or luc
- texconfig.formatname = caches.setpath("formats") .. "/" .. gsub(texconfig.luaname,"%.lu.$",".fmt")
-end
+resolvers.find_file = resolvers.findfile obsolete.find_file = resolvers.findfile
+resolvers.find_files = resolvers.findfiles obsolete.find_files = resolvers.findfiles
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['data-res'] = {
+if not modules then modules = { } end modules ['data-pre'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -10555,17 +12488,28 @@ if not modules then modules = { } end modules ['data-res'] = {
license = "see context related readme files"
}
---~ print(resolvers.resolve("abc env:tmp file:cont-en.tex path:cont-en.tex full:cont-en.tex rel:zapf/one/p-chars.tex"))
+-- It could be interesting to hook the resolver in the file
+-- opener so that unresolved prefixes travel around and we
+-- get more abstraction.
+
+-- As we use this beforehand we will move this up in the chain
+-- of loading.
+
-local upper, lower, gsub = string.upper, string.lower, string.gsub
+local resolvers = resolvers
+local prefixes = utilities.storage.allocate()
+resolvers.prefixes = prefixes
-local prefixes = { }
+local gsub = string.gsub
+local cleanpath, findgivenfile, expansion = resolvers.cleanpath, resolvers.findgivenfile, resolvers.expansion
+local getenv = resolvers.getenv -- we can probably also use resolvers.expansion
+local P, Cs, lpegmatch = lpeg.P, lpeg.Cs, lpeg.match
prefixes.environment = function(str)
- return resolvers.clean_path(os.getenv(str) or os.getenv(upper(str)) or os.getenv(lower(str)) or "")
+ return cleanpath(expansion(str))
end
-prefixes.relative = function(str,n)
+prefixes.relative = function(str,n) -- lfs.isfile
if io.exists(str) then
-- nothing
elseif io.exists("./" .. str) then
@@ -10581,7 +12525,7 @@ prefixes.relative = function(str,n)
end
end
end
- return resolvers.clean_path(str)
+ return cleanpath(str)
end
prefixes.auto = function(str)
@@ -10593,18 +12537,34 @@ prefixes.auto = function(str)
end
prefixes.locate = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path((fullname ~= "" and fullname) or str)
+ local fullname = findgivenfile(str) or ""
+ return cleanpath((fullname ~= "" and fullname) or str)
end
prefixes.filename = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path(file.basename((fullname ~= "" and fullname) or str))
+ local fullname = findgivenfile(str) or ""
+ return cleanpath(file.basename((fullname ~= "" and fullname) or str))
end
prefixes.pathname = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path(file.dirname((fullname ~= "" and fullname) or str))
+ local fullname = findgivenfile(str) or ""
+ return cleanpath(file.dirname((fullname ~= "" and fullname) or str))
+end
+
+prefixes.selfautoloc = function(str)
+ return cleanpath(file.join(getenv('SELFAUTOLOC'),str))
+end
+
+prefixes.selfautoparent = function(str)
+ return cleanpath(file.join(getenv('SELFAUTOPARENT'),str))
+end
+
+prefixes.selfautodir = function(str)
+ return cleanpath(file.join(getenv('SELFAUTODIR'),str))
+end
+
+prefixes.home = function(str)
+ return cleanpath(file.join(getenv('HOME'),str))
end
prefixes.env = prefixes.environment
@@ -10633,19 +12593,28 @@ local function _resolve_(method,target)
end
end
-local function resolve(str)
- if type(str) == "table" then
- for k=1,#str do
- local v = str[k]
- str[k] = resolve(v) or v
- end
- elseif str and str ~= "" then
- str = gsub(str,"([a-z]+):([^ \"\']*)",_resolve_)
+local resolved, abstract = { }, { }
+
+function resolvers.resetresolve(str)
+ resolved, abstract = { }, { }
+end
+
+local function resolve(str) -- use schemes, this one is then for the commandline only
+ local res = resolved[str]
+ if not res then
+ res = gsub(str,"([a-z][a-z]+):([^ \"\']*)",_resolve_)
+ resolved[str] = res
+ abstract[res] = str
end
- return str
+ return res
+end
+
+local function unresolve(str)
+ return abstract[str] or str
end
-resolvers.resolve = resolve
+resolvers.resolve = resolve
+resolvers.unresolve = unresolve
if os.uname then
@@ -10657,6 +12626,42 @@ if os.uname then
end
+if os.type == "unix" then
+
+ local pattern
+
+ local function makepattern(t,k,v)
+ local colon = P(":")
+ local 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)
+ if t then
+ t[k] = v
+ end
+ end
+
+ makepattern()
+
+ getmetatable(prefixes).__newindex = makepattern
+
+ function resolvers.repath(str)
+ return lpegmatch(pattern,str)
+ end
+
+else -- already the default:
+
+ function resolvers.repath(str)
+ return str
+ end
+
+end
+
end -- of closure
@@ -10670,13 +12675,23 @@ if not modules then modules = { } end modules ['data-inp'] = {
license = "see context related readme files"
}
-resolvers.finders = resolvers.finders or { }
-resolvers.openers = resolvers.openers or { }
-resolvers.loaders = resolvers.loaders or { }
+local allocate = utilities.storage.allocate
+local resolvers = resolvers
+
+local methodhandler = resolvers.methodhandler
+local registermethod = resolvers.registermethod
+
+local finders = allocate { helpers = { }, notfound = function() end }
+local openers = allocate { helpers = { }, notfound = function() end }
+local loaders = allocate { helpers = { }, notfound = function() return false, nil, 0 end }
-resolvers.finders.notfound = { nil }
-resolvers.openers.notfound = { nil }
-resolvers.loaders.notfound = { false, nil, 0 }
+registermethod("finders", finders, "uri")
+registermethod("openers", openers, "uri")
+registermethod("loaders", loaders, "uri")
+
+resolvers.finders = finders
+resolvers.openers = openers
+resolvers.loaders = loaders
end -- of closure
@@ -10691,15 +12706,23 @@ if not modules then modules = { } end modules ['data-out'] = {
license = "see context related readme files"
}
-outputs = outputs or { }
+local allocate = utilities.storage.allocate
+local resolvers = resolvers
+
+local registermethod = resolvers.registermethod
+
+local savers = allocate { helpers = { } }
+resolvers.savers = savers
+
+registermethod("savers", savers, "uri")
end -- of closure
do -- create closure to overcome 200 locals limit
-if not modules then modules = { } end modules ['data-con'] = {
+if not modules then modules = { } end modules ['data-fil'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -10707,6 +12730,124 @@ if not modules then modules = { } end modules ['data-con'] = {
license = "see context related readme files"
}
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_files = logs.reporter("resolvers","files")
+
+local resolvers = resolvers
+
+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
+
+local checkgarbage = utilities.garbagecollector and utilities.garbagecollector.check
+
+function locators.file(specification)
+ local name = specification.filename
+ local realname = resolvers.resolve(name) -- no shortcut
+ if realname and realname ~= '' and lfs.isdir(realname) then
+ if trace_locating then
+ report_files("file locator '%s' found as '%s'",name,realname)
+ end
+ resolvers.appendhash('file',name,true) -- cache
+ elseif trace_locating then
+ report_files("file locator '%s' not found",name)
+ end
+end
+
+function hashers.file(specification)
+ local name = specification.filename
+ local content = caches.loadcontent(name,'files')
+ resolvers.registerfilehash(name,content,content==nil)
+end
+
+function generators.file(specification)
+ local path = specification.filename
+ local content = resolvers.scanfiles(path)
+ resolvers.registerfilehash(path,content,true)
+end
+
+concatinators.file = file.join
+
+function finders.file(specification,filetype)
+ local filename = specification.filename
+ local foundname = resolvers.findfile(filename,filetype)
+ if foundname and foundname ~= "" then
+ if trace_locating then
+ report_files("file finder: '%s' found",filename)
+ end
+ return foundname
+ else
+ if trace_locating then
+ report_files("file finder: %s' not found",filename)
+ end
+ return finders.notfound()
+ end
+end
+
+-- The default textopener will be overloaded later on.
+
+function openers.helpers.textopener(tag,filename,f)
+ return {
+ reader = function() return f:read () end,
+ close = function() logs.show_close(filename) return f:close() end,
+ }
+end
+
+function openers.file(specification,filetype)
+ local filename = specification.filename
+ if filename and filename ~= "" then
+ local f = io.open(filename,"r")
+ if f then
+ if trace_locating then
+ report_files("file opener, '%s' opened",filename)
+ end
+ return openers.helpers.textopener("file",filename,f)
+ end
+ end
+ if trace_locating then
+ report_files("file opener, '%s' not found",filename)
+ end
+ return openers.notfound()
+end
+
+function loaders.file(specification,filetype)
+ local filename = specification.filename
+ if filename and filename ~= "" then
+ local f = io.open(filename,"rb")
+ if f then
+ logs.show_load(filename)
+ if trace_locating then
+ report_files("file loader, '%s' loaded",filename)
+ end
+ local s = f:read("*a")
+ if checkgarbage then
+ checkgarbage(#s)
+ end
+ f:close()
+ if s then
+ return true, s, #s
+ end
+ end
+ end
+ if trace_locating then
+ report_files("file loader, '%s' not found",filename)
+ end
+ return loaders.notfound()
+end
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-con'] = {
+ version = 1.100,
+ 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 format, lower, gsub = string.format, string.lower, string.gsub
local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
@@ -10726,50 +12867,63 @@ table structures without bothering about the disk cache.</p>
<p>Examples of usage can be found in the font related code.</p>
--ldx]]--
-containers = containers or { }
-
+containers = containers or { }
+local containers = containers
containers.usecache = true
+local report_containers = logs.reporter("resolvers","containers")
+
local function report(container,tag,name)
if trace_cache or trace_containers then
- logs.report(format("%s cache",container.subcategory),"%s: %s",tag,name or 'invalid')
+ report_containers("container: %s, tag: %s, name: %s",container.subcategory,tag,name or 'invalid')
end
end
local allocated = { }
--- tracing
+local mt = {
+ __index = function(t,k)
+ if k == "writable" then
+ local writable = caches.getwritablepath(t.category,t.subcategory) or { "." }
+ t.writable = writable
+ return writable
+ elseif k == "readables" then
+ local readables = caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ t.readables = readables
+ return readables
+ end
+ end,
+ __storage__ = true
+}
function containers.define(category, subcategory, version, enabled)
- return function()
- if category and subcategory then
- local c = allocated[category]
- if not c then
- c = { }
- allocated[category] = c
- end
- local s = c[subcategory]
- if not s then
- s = {
- category = category,
- subcategory = subcategory,
- storage = { },
- enabled = enabled,
- version = version or 1.000,
- trace = false,
- path = caches and caches.setpath and caches.setpath(category,subcategory),
- }
- c[subcategory] = s
- end
- return s
- else
- return nil
+ if category and subcategory then
+ local c = allocated[category]
+ if not c then
+ c = { }
+ allocated[category] = c
+ end
+ local s = c[subcategory]
+ if not s then
+ s = {
+ category = category,
+ subcategory = subcategory,
+ storage = { },
+ enabled = enabled,
+ version = version or math.pi, -- after all, this is TeX
+ trace = false,
+ -- writable = caches.getwritablepath and caches.getwritablepath (category,subcategory) or { "." },
+ -- readables = caches.getreadablepaths and caches.getreadablepaths(category,subcategory) or { "." },
+ }
+ setmetatable(s,mt)
+ c[subcategory] = s
end
+ return s
end
end
function containers.is_usable(container, name)
- return container.enabled and caches and caches.iswritable(container.path, name)
+ return container.enabled and caches and caches.is_writable(container.writable, name)
end
function containers.is_valid(container, name)
@@ -10782,18 +12936,20 @@ function containers.is_valid(container, name)
end
function containers.read(container,name)
- if container.enabled and caches and not container.storage[name] and containers.usecache then
- container.storage[name] = caches.loaddata(container.path,name)
- if containers.is_valid(container,name) then
+ local storage = container.storage
+ local stored = storage[name]
+ if not stored and container.enabled and caches and containers.usecache then
+ stored = caches.loaddata(container.readables,name)
+ if stored and stored.cache_version == container.version then
report(container,"loaded",name)
else
- container.storage[name] = nil
+ stored = nil
end
- end
- if container.storage[name] then
+ storage[name] = stored
+ elseif stored then
report(container,"reusing",name)
end
- return container.storage[name]
+ return stored
end
function containers.write(container, name, data)
@@ -10802,7 +12958,7 @@ function containers.write(container, name, data)
if container.enabled and caches then
local unique, shared = data.unique, data.shared
data.unique, data.shared = nil, nil
- caches.savedata(container.path, name, data)
+ caches.savedata(container.writable, name, data)
report(container,"saved",name)
data.unique, data.shared = unique, shared
end
@@ -10837,50 +12993,18 @@ local format, lower, gsub, find = string.format, string.lower, string.gsub, stri
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
--- since we want to use the cache instead of the tree, we will now
--- reimplement the saver.
-
-local save_data = resolvers.save_data
-local load_data = resolvers.load_data
+local report_mounts = logs.reporter("resolvers","mounts")
-resolvers.cachepath = nil -- public, for tracing
-resolvers.usecache = true -- public, for tracing
-
-function resolvers.save_data(dataname)
- save_data(dataname, function(cachename,dataname)
- resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
- if resolvers.usecache then
- resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
- return file.join(resolvers.cachepath(),caches.hashed(cachename))
- else
- return file.join(cachename,dataname)
- end
- end)
-end
-
-function resolvers.load_data(pathname,dataname,filename)
- load_data(pathname,dataname,filename,function(dataname,filename)
- resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
- if resolvers.usecache then
- resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
- return file.join(resolvers.cachepath(),caches.hashed(pathname))
- else
- if not filename or (filename == "") then
- filename = dataname
- end
- return file.join(pathname,filename)
- end
- end)
-end
+local resolvers = resolvers
-- we will make a better format, maybe something xml or just text or lua
resolvers.automounted = resolvers.automounted or { }
function resolvers.automount(usecache)
- local mountpaths = resolvers.clean_path_list(resolvers.expansion('TEXMFMOUNT'))
+ local mountpaths = resolvers.cleanpathlist(resolvers.expansion('TEXMFMOUNT'))
if (not mountpaths or #mountpaths == 0) and usecache then
- mountpaths = { caches.setpath("mount") }
+ mountpaths = caches.getreadablepaths("mount")
end
if mountpaths and #mountpaths > 0 then
statistics.starttiming(resolvers.instance)
@@ -10894,7 +13018,7 @@ function resolvers.automount(usecache)
-- skip
elseif find(line,"^zip://") then
if trace_locating then
- logs.report("fileio","mounting %s",line)
+ report_mounts("mounting %s",line)
end
table.insert(resolvers.automounted,line)
resolvers.usezipfile(line)
@@ -10910,40 +13034,40 @@ end
-- status info
-statistics.register("used config path", function() return caches.configpath() end)
-statistics.register("used cache path", function() return caches.temp() or "?" end)
+statistics.register("used config file", function() return caches.configfiles() end)
+statistics.register("used cache path", function() return caches.usedpaths() end)
-- experiment (code will move)
-function statistics.save_fmt_status(texname,formatbanner,sourcefile) -- texname == formatname
+function statistics.savefmtstatus(texname,formatbanner,sourcefile) -- texname == formatname
local enginebanner = status.list().banner
if formatbanner and enginebanner and sourcefile then
local luvname = file.replacesuffix(texname,"luv")
local luvdata = {
enginebanner = enginebanner,
formatbanner = formatbanner,
- sourcehash = md5.hex(io.loaddata(resolvers.find_file(sourcefile)) or "unknown"),
+ sourcehash = md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"),
sourcefile = sourcefile,
}
io.savedata(luvname,table.serialize(luvdata,true))
end
end
-function statistics.check_fmt_status(texname)
+function statistics.checkfmtstatus(texname)
local enginebanner = status.list().banner
if enginebanner and texname then
local luvname = file.replacesuffix(texname,"luv")
if lfs.isfile(luvname) then
local luv = dofile(luvname)
if luv and luv.sourcefile then
- local sourcehash = md5.hex(io.loaddata(resolvers.find_file(luv.sourcefile)) or "unknown")
+ local sourcehash = md5.hex(io.loaddata(resolvers.findfile(luv.sourcefile)) or "unknown")
local luvbanner = luv.enginebanner or "?"
if luvbanner ~= enginebanner then
- return string.format("engine mismatch (luv:%s <> bin:%s)",luvbanner,enginebanner)
+ return format("engine mismatch (luv: %s <> bin: %s)",luvbanner,enginebanner)
end
local luvhash = luv.sourcehash or "?"
if luvhash ~= sourcehash then
- return string.format("source mismatch (luv:%s <> bin:%s)",luvhash,sourcehash)
+ return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash)
end
else
return "invalid status file"
@@ -10968,25 +13092,30 @@ if not modules then modules = { } end modules ['data-zip'] = {
license = "see context related readme files"
}
+-- partly redone .. needs testing
+
local format, find, match = string.format, string.find, string.match
-local unpack = unpack or table.unpack
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local report_zip = logs.reporter("resolvers","zip")
+
-- zip:///oeps.zip?name=bla/bla.tex
-- zip:///oeps.zip?tree=tex/texmf-local
-- zip:///texmf.zip?tree=/tex/texmf
-- zip:///texmf.zip?tree=/tex/texmf-local
-- zip:///texmf-mine.zip?tree=/tex/texmf-projects
-zip = zip or { }
-zip.archives = zip.archives or { }
-zip.registeredfiles = zip.registeredfiles or { }
+local resolvers = resolvers
+
+zip = zip or { }
+local zip = zip
-local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
-local locators, hashers, concatinators = resolvers.locators, resolvers.hashers, resolvers.concatinators
+zip.archives = zip.archives or { }
+local archives = zip.archives
-local archives = zip.archives
+zip.registeredfiles = zip.registeredfiles or { }
+local registeredfiles = zip.registeredfiles
local function validzip(str) -- todo: use url splitter
if not find(str,"^zip://") then
@@ -11002,7 +13131,7 @@ function zip.openarchive(name)
else
local arch = archives[name]
if not arch then
- local full = resolvers.find_file(name) or ""
+ local full = resolvers.findfile(name) or ""
arch = (full ~= "" and zip.open(full)) or false
archives[name] = arch
end
@@ -11017,163 +13146,162 @@ function zip.closearchive(name)
end
end
-function locators.zip(specification) -- where is this used? startup zips (untested)
- specification = resolvers.splitmethod(specification)
- local zipfile = specification.path
- local zfile = zip.openarchive(name) -- tricky, could be in to be initialized tree
+function resolvers.locators.zip(specification)
+ local archive = specification.filename
+ local zipfile = archive and archive ~= "" and zip.openarchive(archive) -- tricky, could be in to be initialized tree
if trace_locating then
- if zfile then
- logs.report("fileio","zip locator, archive '%s' found",specification.original)
+ if zipfile then
+ report_zip("locator, archive '%s' found",archive)
else
- logs.report("fileio","zip locator, archive '%s' not found",specification.original)
+ report_zip("locator, archive '%s' not found",archive)
end
end
end
-function hashers.zip(tag,name)
+function resolvers.hashers.zip(specification)
+ local archive = specification.filename
if trace_locating then
- logs.report("fileio","loading zip file '%s' as '%s'",name,tag)
+ report_zip("loading file '%s'",archive)
end
- resolvers.usezipfile(format("%s?tree=%s",tag,name))
+ resolvers.usezipfile(specification.original)
end
-function concatinators.zip(tag,path,name)
+function resolvers.concatinators.zip(zipfile,path,name) -- ok ?
if not path or path == "" then
- return format('%s?name=%s',tag,name)
+ return format('%s?name=%s',zipfile,name)
else
- return format('%s?name=%s/%s',tag,path,name)
+ return format('%s?name=%s/%s',zipfile,path,name)
end
end
-function resolvers.isreadable.zip(name)
- return true
-end
-
-function finders.zip(specification,filetype)
- specification = resolvers.splitmethod(specification)
- if specification.path then
- local q = url.query(specification.query)
- if q.name then
- local zfile = zip.openarchive(specification.path)
+function resolvers.finders.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip finder, archive '%s' found",specification.path)
+ report_zip("finder, archive '%s' found",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
dfile = zfile:close()
if trace_locating then
- logs.report("fileio","zip finder, file '%s' found",q.name)
+ report_zip("finder, file '%s' found",queryname)
end
return specification.original
elseif trace_locating then
- logs.report("fileio","zip finder, file '%s' not found",q.name)
+ report_zip("finder, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip finder, unknown archive '%s'",specification.path)
+ report_zip("finder, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip finder, '%s' not found",filename)
+ report_zip("finder, '%s' not found",original)
end
- return unpack(finders.notfound)
+ return resolvers.finders.notfound()
end
-function openers.zip(specification)
- local zipspecification = resolvers.splitmethod(specification)
- if zipspecification.path then
- local q = url.query(zipspecification.query)
- if q.name then
- local zfile = zip.openarchive(zipspecification.path)
+function resolvers.openers.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip opener, archive '%s' opened",zipspecification.path)
+ report_zip("opener, archive '%s' opened",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
- logs.show_open(specification)
if trace_locating then
- logs.report("fileio","zip opener, file '%s' found",q.name)
+ report_zip("opener, file '%s' found",queryname)
end
- return openers.text_opener(specification,dfile,'zip')
+ return resolvers.openers.helpers.textopener('zip',original,dfile)
elseif trace_locating then
- logs.report("fileio","zip opener, file '%s' not found",q.name)
+ report_zip("opener, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip opener, unknown archive '%s'",zipspecification.path)
+ report_zip("opener, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip opener, '%s' not found",filename)
+ report_zip("opener, '%s' not found",original)
end
- return unpack(openers.notfound)
+ return resolvers.openers.notfound()
end
-function loaders.zip(specification)
- specification = resolvers.splitmethod(specification)
- if specification.path then
- local q = url.query(specification.query)
- if q.name then
- local zfile = zip.openarchive(specification.path)
+function resolvers.loaders.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip loader, archive '%s' opened",specification.path)
+ report_zip("loader, archive '%s' opened",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
- logs.show_load(filename)
+ logs.show_load(original)
if trace_locating then
- logs.report("fileio","zip loader, file '%s' loaded",filename)
+ report_zip("loader, file '%s' loaded",original)
end
local s = dfile:read("*all")
dfile:close()
return true, s, #s
elseif trace_locating then
- logs.report("fileio","zip loader, file '%s' not found",q.name)
+ report_zip("loader, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip loader, unknown archive '%s'",specification.path)
+ report_zip("loader, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip loader, '%s' not found",filename)
+ report_zip("loader, '%s' not found",original)
end
- return unpack(openers.notfound)
+ return resolvers.openers.notfound()
end
-- zip:///somefile.zip
-- zip:///somefile.zip?tree=texmf-local -> mount
-function resolvers.usezipfile(zipname)
- zipname = validzip(zipname)
- local specification = resolvers.splitmethod(zipname)
- local zipfile = specification.path
- if zipfile and not zip.registeredfiles[zipname] then
- local tree = url.query(specification.query).tree or ""
- local z = zip.openarchive(zipfile)
+function resolvers.usezipfile(archive)
+ local specification = resolvers.splitmethod(archive) -- to be sure
+ local archive = specification.filename
+ if archive and not registeredfiles[archive] then
+ local z = zip.openarchive(archive)
if z then
- local instance = resolvers.instance
+ local tree = url.query(specification.query).tree or ""
if trace_locating then
- logs.report("fileio","zip registering, registering archive '%s'",zipname)
- end
- statistics.starttiming(instance)
- resolvers.prepend_hash('zip',zipname,zipfile)
- resolvers.extend_texmf_var(zipname) -- resets hashes too
- zip.registeredfiles[zipname] = z
- instance.files[zipname] = resolvers.register_zip_file(z,tree or "")
- statistics.stoptiming(instance)
+ report_zip("registering, registering archive '%s'",archive)
+ end
+ statistics.starttiming(resolvers.instance)
+ resolvers.prependhash('zip',archive)
+ resolvers.extendtexmfvariable(archive) -- resets hashes too
+ registeredfiles[archive] = z
+ instance.files[archive] = resolvers.registerzipfile(z,tree)
+ statistics.stoptiming(resolvers.instance)
elseif trace_locating then
- logs.report("fileio","zip registering, unknown archive '%s'",zipname)
+ report_zip("registering, unknown archive '%s'",archive)
end
elseif trace_locating then
- logs.report("fileio","zip registering, '%s' not found",zipname)
+ report_zip("registering, '%s' not found",archive)
end
end
-function resolvers.register_zip_file(z,tree)
+function resolvers.registerzipfile(z,tree)
local files, filter = { }, ""
if tree == "" then
filter = "^(.+)/(.-)$"
@@ -11181,9 +13309,9 @@ function resolvers.register_zip_file(z,tree)
filter = format("^%s/(.+)/(.-)$",tree)
end
if trace_locating then
- logs.report("fileio","zip registering, using filter '%s'",filter)
+ report_zip("registering, using filter '%s'",filter)
end
- local register, n = resolvers.register_file, 0
+ local register, n = resolvers.registerfile, 0
for i in z:files() do
local path, name = match(i.filename,filter)
if path then
@@ -11198,7 +13326,7 @@ function resolvers.register_zip_file(z,tree)
n = n + 1
end
end
- logs.report("fileio","zip registering, %s files registered",n)
+ report_zip("registering, %s files registered",n)
return files
end
@@ -11207,6 +13335,84 @@ end -- of closure
do -- create closure to overcome 200 locals limit
+if not modules then modules = { } end modules ['data-tre'] = {
+ 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"
+}
+
+-- \input tree://oeps1/**/oeps.tex
+
+local find, gsub, format = string.find, string.gsub, string.format
+
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_trees = logs.reporter("resolvers","trees")
+
+local resolvers = resolvers
+
+local done, found, notfound = { }, { }, resolvers.finders.notfound
+
+function resolvers.finders.tree(specification)
+ local spec = specification.filename
+ local fnd = found[spec]
+ if fnd == 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
+ 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
+ end
+ end
+ end
+ fnd = notfound() -- false
+ found[spec] = fnd
+ end
+ return fnd
+end
+
+function resolvers.locators.tree(specification)
+ local name = specification.filename
+ if name ~= '' and lfs.isdir(name) then
+ if trace_locating then
+ report_trees("locator '%s' found",name)
+ end
+ resolvers.appendhash('tree',name,false) -- don't cache
+ elseif trace_locating then
+ report_trees("locator '%s' not found",name)
+ end
+end
+
+function resolvers.hashers.tree(specification)
+ local name = specification.filename
+ if trace_locating then
+ report_trees("analysing '%s'",name)
+ end
+ resolvers.methodhandler("hashers",name)
+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
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
if not modules then modules = { } end modules ['data-crl'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
@@ -11215,58 +13421,59 @@ if not modules then modules = { } end modules ['data-crl'] = {
license = "see context related readme files"
}
-local gsub = string.gsub
+-- this one is replaced by data-sch.lua --
-curl = curl or { }
+local gsub = string.gsub
-curl.cached = { }
-curl.cachepath = caches.definepath("curl")
+local resolvers = resolvers
local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
-function curl.fetch(protocol, name)
- local cachename = curl.cachepath() .. "/" .. gsub(name,"[^%a%d%.]+","-")
--- cachename = gsub(cachename,"[\\/]", io.fileseparator)
- cachename = gsub(cachename,"[\\]", "/") -- cleanup
- if not curl.cached[name] then
+resolvers.curl = resolvers.curl or { }
+local curl = resolvers.curl
+
+local cached = { }
+
+local function runcurl(specification)
+ local original = specification.original
+ -- local scheme = specification.scheme
+ local cleanname = gsub(original,"[^%a%d%.]+","-")
+ local cachename = caches.setfirstwritablefile(cleanname,"curl")
+ if not cached[original] then
if not io.exists(cachename) then
- curl.cached[name] = cachename
- local command = "curl --silent --create-dirs --output " .. cachename .. " " .. name -- no protocol .. "://"
+ cached[original] = cachename
+ local command = "curl --silent --create-dirs --output " .. cachename .. " " .. original
os.spawn(command)
end
if io.exists(cachename) then
- curl.cached[name] = cachename
+ cached[original] = cachename
else
- curl.cached[name] = ""
+ cached[original] = ""
end
end
- return curl.cached[name]
+ return cached[original]
end
-function finders.curl(protocol,filename)
- local foundname = curl.fetch(protocol, filename)
- return finders.generic(protocol,foundname,filetype)
-end
-
-function openers.curl(protocol,filename)
- return openers.generic(protocol,filename)
-end
+-- old code: we could be cleaner using specification (see schemes)
-function loaders.curl(protocol,filename)
- return loaders.generic(protocol,filename)
+local function finder(specification,filetype)
+ return resolvers.methodhandler("finders",runcurl(specification),filetype)
end
--- todo: metamethod
+local opener = openers.file
+local loader = loaders.file
-function curl.install(protocol)
- finders[protocol] = function (filename,filetype) return finders.curl(protocol,filename) end
- openers[protocol] = function (filename) return openers.curl(protocol,filename) end
- loaders[protocol] = function (filename) return loaders.curl(protocol,filename) end
+local function install(scheme)
+ finders[scheme] = finder
+ openers[scheme] = opener
+ loaders[scheme] = loader
end
-curl.install('http')
-curl.install('https')
-curl.install('ftp')
+resolvers.curl.install = install
+
+install('http')
+install('https')
+install('ftp')
end -- of closure
@@ -11287,9 +13494,13 @@ if not modules then modules = { } end modules ['data-lua'] = {
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local report_libraries = logs.reporter("resolvers","libraries")
+
local gsub, insert = string.gsub, table.insert
local unpack = unpack or table.unpack
+local resolvers, package = resolvers, package
+
local libformats = { 'luatexlibs', 'tex', 'texmfscripts', 'othertextfiles' } -- 'luainputs'
local clibformats = { 'lib' }
@@ -11298,7 +13509,7 @@ local _path_, libpaths, _cpath_, clibpaths
function package.libpaths()
if not _path_ or package.path ~= _path_ then
_path_ = package.path
- libpaths = file.split_path(_path_,";")
+ libpaths = file.splitpath(_path_,";")
end
return libpaths
end
@@ -11306,7 +13517,7 @@ end
function package.clibpaths()
if not _cpath_ or package.cpath ~= _cpath_ then
_cpath_ = package.cpath
- clibpaths = file.split_path(_cpath_,";")
+ clibpaths = file.splitpath(_cpath_,";")
end
return clibpaths
end
@@ -11315,18 +13526,18 @@ local function thepath(...)
local t = { ... } t[#t+1] = "?.lua"
local path = file.join(unpack(t))
if trace_locating then
- logs.report("fileio","! appending '%s' to 'package.path'",path)
+ report_libraries("! appending '%s' to 'package.path'",path)
end
return path
end
local p_libpaths, a_libpaths = { }, { }
-function package.append_libpath(...)
+function package.appendtolibpath(...)
insert(a_libpath,thepath(...))
end
-function package.prepend_libpath(...)
+function package.prependtolibpath(...)
insert(p_libpaths,1,thepath(...))
end
@@ -11337,31 +13548,30 @@ local function loaded(libpaths,name,simple)
local libpath = libpaths[i]
local resolved = gsub(libpath,"%?",simple)
if trace_locating then -- more detail
- logs.report("fileio","! checking for '%s' on 'package.path': '%s' => '%s'",simple,libpath,resolved)
+ report_libraries("! checking for '%s' on 'package.path': '%s' => '%s'",simple,libpath,resolved)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'package.path': '%s'",name,resolved)
+ report_libraries("! lib '%s' located via 'package.path': '%s'",name,resolved)
end
return loadfile(resolved)
end
end
end
-
package.loaders[2] = function(name) -- was [#package.loaders+1]
if trace_locating then -- mode detail
- logs.report("fileio","! locating '%s'",name)
+ report_libraries("! locating '%s'",name)
end
for i=1,#libformats do
local format = libformats[i]
- local resolved = resolvers.find_file(name,format) or ""
+ local resolved = resolvers.findfile(name,format) or ""
if trace_locating then -- mode detail
- logs.report("fileio","! checking for '%s' using 'libformat path': '%s'",name,format)
+ report_libraries("! checking for '%s' using 'libformat path': '%s'",name,format)
end
if resolved ~= "" then
if trace_locating then
- logs.report("fileio","! lib '%s' located via environment: '%s'",name,resolved)
+ report_libraries("! lib '%s' located via environment: '%s'",name,resolved)
end
return loadfile(resolved)
end
@@ -11379,16 +13589,16 @@ package.loaders[2] = function(name) -- was [#package.loaders+1]
for i=1,#clibformats do
-- better have a dedicated loop
local format = clibformats[i]
- local paths = resolvers.expanded_path_list_from_var(format)
+ local paths = resolvers.expandedpathlistfromvariable(format)
for p=1,#paths do
local path = paths[p]
local resolved = file.join(path,libname)
if trace_locating then -- mode detail
- logs.report("fileio","! checking for '%s' using 'clibformat path': '%s'",libname,path)
+ report_libraries("! checking for '%s' using 'clibformat path': '%s'",libname,path)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'clibformat': '%s'",libname,resolved)
+ report_libraries("! lib '%s' located via 'clibformat': '%s'",libname,resolved)
end
return package.loadlib(resolved,name)
end
@@ -11398,140 +13608,43 @@ package.loaders[2] = function(name) -- was [#package.loaders+1]
local libpath = clibpaths[i]
local resolved = gsub(libpath,"?",simple)
if trace_locating then -- more detail
- logs.report("fileio","! checking for '%s' on 'package.cpath': '%s'",simple,libpath)
+ report_libraries("! checking for '%s' on 'package.cpath': '%s'",simple,libpath)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'package.cpath': '%s'",name,resolved)
+ report_libraries("! lib '%s' located via 'package.cpath': '%s'",name,resolved)
end
return package.loadlib(resolved,name)
end
end
-- just in case the distribution is messed up
if trace_loading then -- more detail
- logs.report("fileio","! checking for '%s' using 'luatexlibs': '%s'",name)
+ report_libraries("! checking for '%s' using 'luatexlibs': '%s'",name)
end
- local resolved = resolvers.find_file(file.basename(name),'luatexlibs') or ""
+ local resolved = resolvers.findfile(file.basename(name),'luatexlibs') or ""
if resolved ~= "" then
if trace_locating then
- logs.report("fileio","! lib '%s' located by basename via environment: '%s'",name,resolved)
+ report_libraries("! lib '%s' located by basename via environment: '%s'",name,resolved)
end
return loadfile(resolved)
end
if trace_locating then
- logs.report("fileio",'? unable to locate lib: %s',name)
+ report_libraries('? unable to locate lib: %s',name)
end
-- return "unable to locate " .. name
end
resolvers.loadlualib = require
+-- -- -- --
-end -- of closure
-
-do -- create closure to overcome 200 locals limit
-
-if not modules then modules = { } end modules ['luat-kps'] = {
- version = 1.001,
- comment = "companion to luatools.lua",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
---[[ldx--
-<p>This file is used when we want the input handlers to behave like
-<type>kpsewhich</type>. What to do with the following:</p>
-
-<typing>
-{$SELFAUTOLOC,$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}
-$SELFAUTOLOC : /usr/tex/bin/platform
-$SELFAUTODIR : /usr/tex/bin
-$SELFAUTOPARENT : /usr/tex
-</typing>
+package.obsolete = package.obsolete or { }
-<p>How about just forgetting about them?</p>
---ldx]]--
+package.append_libpath = appendtolibpath -- will become obsolete
+package.prepend_libpath = prependtolibpath -- will become obsolete
-local suffixes = resolvers.suffixes
-local formats = resolvers.formats
-
-suffixes['gf'] = { '<resolution>gf' }
-suffixes['pk'] = { '<resolution>pk' }
-suffixes['base'] = { 'base' }
-suffixes['bib'] = { 'bib' }
-suffixes['bst'] = { 'bst' }
-suffixes['cnf'] = { 'cnf' }
-suffixes['mem'] = { 'mem' }
-suffixes['mf'] = { 'mf' }
-suffixes['mfpool'] = { 'pool' }
-suffixes['mft'] = { 'mft' }
-suffixes['mppool'] = { 'pool' }
-suffixes['graphic/figure'] = { 'eps', 'epsi' }
-suffixes['texpool'] = { 'pool' }
-suffixes['PostScript header'] = { 'pro' }
-suffixes['ist'] = { 'ist' }
-suffixes['web'] = { 'web', 'ch' }
-suffixes['cweb'] = { 'w', 'web', 'ch' }
-suffixes['cmap files'] = { 'cmap' }
-suffixes['lig files'] = { 'lig' }
-suffixes['bitmap font'] = { }
-suffixes['MetaPost support'] = { }
-suffixes['TeX system documentation'] = { }
-suffixes['TeX system sources'] = { }
-suffixes['dvips config'] = { }
-suffixes['type42 fonts'] = { }
-suffixes['web2c files'] = { }
-suffixes['other text files'] = { }
-suffixes['other binary files'] = { }
-suffixes['opentype fonts'] = { 'otf' }
-
-suffixes['fmt'] = { 'fmt' }
-suffixes['texmfscripts'] = { 'rb','lua','py','pl' }
-
-suffixes['pdftex config'] = { }
-suffixes['Troff fonts'] = { }
-
-suffixes['ls-R'] = { }
-
---[[ldx--
-<p>If you wondered abou tsome of the previous mappings, how about
-the next bunch:</p>
---ldx]]--
-
-formats['bib'] = ''
-formats['bst'] = ''
-formats['mft'] = ''
-formats['ist'] = ''
-formats['web'] = ''
-formats['cweb'] = ''
-formats['MetaPost support'] = ''
-formats['TeX system documentation'] = ''
-formats['TeX system sources'] = ''
-formats['Troff fonts'] = ''
-formats['dvips config'] = ''
-formats['graphic/figure'] = ''
-formats['ls-R'] = ''
-formats['other text files'] = ''
-formats['other binary files'] = ''
-
-formats['gf'] = ''
-formats['pk'] = ''
-formats['base'] = 'MFBASES'
-formats['cnf'] = ''
-formats['mem'] = 'MPMEMS'
-formats['mf'] = 'MFINPUTS'
-formats['mfpool'] = 'MFPOOL'
-formats['mppool'] = 'MPPOOL'
-formats['texpool'] = 'TEXPOOL'
-formats['PostScript header'] = 'TEXPSHEADERS'
-formats['cmap files'] = 'CMAPFONTS'
-formats['type42 fonts'] = 'T42FONTS'
-formats['web2c files'] = 'WEB2C'
-formats['pdftex config'] = 'PDFTEXCONFIG'
-formats['texmfscripts'] = 'TEXMFSCRIPTS'
-formats['bitmap font'] = ''
-formats['lig files'] = 'LIGFONTS'
+package.obsolete.append_libpath = appendtolibpath -- will become obsolete
+package.obsolete.prepend_libpath = prependtolibpath -- will become obsolete
end -- of closure
@@ -11547,49 +13660,54 @@ if not modules then modules = { } end modules ['data-aux'] = {
}
local find = string.find
+local type, next = type, next
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
-function resolvers.update_script(oldname,newname) -- oldname -> own.name, not per se a suffix
+local resolvers = resolvers
+
+local report_scripts = logs.reporter("resolvers","scripts")
+
+function resolvers.updatescript(oldname,newname) -- oldname -> own.name, not per se a suffix
local scriptpath = "scripts/context/lua"
newname = file.addsuffix(newname,"lua")
- local oldscript = resolvers.clean_path(oldname)
+ local oldscript = resolvers.cleanpath(oldname)
if trace_locating then
- logs.report("fileio","to be replaced old script %s", oldscript)
+ report_scripts("to be replaced old script %s", oldscript)
end
- local newscripts = resolvers.find_files(newname) or { }
+ local newscripts = resolvers.findfiles(newname) or { }
if #newscripts == 0 then
if trace_locating then
- logs.report("fileio","unable to locate new script")
+ report_scripts("unable to locate new script")
end
else
for i=1,#newscripts do
- local newscript = resolvers.clean_path(newscripts[i])
+ local newscript = resolvers.cleanpath(newscripts[i])
if trace_locating then
- logs.report("fileio","checking new script %s", newscript)
+ report_scripts("checking new script %s", newscript)
end
if oldscript == newscript then
if trace_locating then
- logs.report("fileio","old and new script are the same")
+ report_scripts("old and new script are the same")
end
elseif not find(newscript,scriptpath) then
if trace_locating then
- logs.report("fileio","new script should come from %s",scriptpath)
+ report_scripts("new script should come from %s",scriptpath)
end
elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
if trace_locating then
- logs.report("fileio","invalid new script name")
+ report_scripts("invalid new script name")
end
else
local newdata = io.loaddata(newscript)
if newdata then
if trace_locating then
- logs.report("fileio","old script content replaced by new content")
+ report_scripts("old script content replaced by new content")
end
io.savedata(oldscript,newdata)
break
elseif trace_locating then
- logs.report("fileio","unable to load new script")
+ report_scripts("unable to load new script")
end
end
end
@@ -11609,72 +13727,133 @@ if not modules then modules = { } end modules ['data-tmf'] = {
license = "see context related readme files"
}
-local find, gsub, match = string.find, string.gsub, string.match
-local getenv, setenv = os.getenv, os.setenv
+local resolvers = resolvers
--- loads *.tmf files in minimal tree roots (to be optimized and documented)
+local report_tds = logs.reporter("resolvers","tds")
-function resolvers.check_environment(tree)
- logs.simpleline()
- setenv('TMP', getenv('TMP') or getenv('TEMP') or getenv('TMPDIR') or getenv('HOME'))
- setenv('TEXOS', getenv('TEXOS') or ("texmf-" .. os.platform))
- setenv('TEXPATH', gsub(tree or "tex","\/+$",''))
- setenv('TEXMFOS', getenv('TEXPATH') .. "/" .. getenv('TEXOS'))
- logs.simpleline()
- logs.simple("preset : TEXPATH => %s", getenv('TEXPATH'))
- logs.simple("preset : TEXOS => %s", getenv('TEXOS'))
- logs.simple("preset : TEXMFOS => %s", getenv('TEXMFOS'))
- logs.simple("preset : TMP => %s", getenv('TMP'))
- logs.simple('')
-end
+-- = <<
+-- ? ??
+-- < +=
+-- > =+
-function resolvers.load_environment(name) -- todo: key=value as well as lua
- local f = io.open(name)
- if f then
- for line in f:lines() do
- if find(line,"^[%%%#]") then
- -- skip comment
- else
- local key, how, value = match(line,"^(.-)%s*([<=>%?]+)%s*(.*)%s*$")
- if how then
- value = gsub(value,"%%(.-)%%", function(v) return getenv(v) or "" end)
- if how == "=" or how == "<<" then
- setenv(key,value)
- elseif how == "?" or how == "??" then
- setenv(key,getenv(key) or value)
- elseif how == "<" or how == "+=" then
- if getenv(key) then
- setenv(key,getenv(key) .. io.fileseparator .. value)
- else
- setenv(key,value)
- end
- elseif how == ">" or how == "=+" then
- if getenv(key) then
- setenv(key,value .. io.pathseparator .. getenv(key))
- else
- setenv(key,value)
- end
- end
- end
- end
+function resolvers.load_tree(tree,resolve)
+ if type(tree) == "string" and tree ~= "" then
+
+ local getenv, setenv = resolvers.getenv, resolvers.setenv
+
+ -- later might listen to the raw osenv var as well
+ local texos = "texmf-" .. os.platform
+
+ local oldroot = environment.texroot
+ local newroot = file.collapsepath(tree)
+
+ local newtree = file.join(newroot,texos)
+ local newpath = file.join(newtree,"bin")
+
+ if not lfs.isdir(newtree) then
+ report_tds("no '%s' under tree %s",texos,tree)
+ os.exit()
end
- f:close()
+ if not lfs.isdir(newpath) then
+ report_tds("no '%s/bin' under tree %s",texos,tree)
+ os.exit()
+ end
+
+ local texmfos = newtree
+
+ environment.texroot = newroot
+ environment.texos = texos
+ environment.texmfos = texmfos
+
+ -- Beware, we need to obey the relocatable autoparent so we
+ -- set TEXMFCNF to its raw value. This is somewhat tricky when
+ -- we run a mkii job from within. Therefore, in mtxrun, there
+ -- is a resolve applied when we're in mkii/kpse mode.
+
+ setenv('SELFAUTOPARENT', newroot)
+ setenv('SELFAUTODIR', newtree)
+ setenv('SELFAUTOLOC', newpath)
+ setenv('TEXROOT', newroot)
+ setenv('TEXOS', texos)
+ setenv('TEXMFOS', texmfos)
+ setenv('TEXMFCNF', resolvers.luacnfspec, not resolve)
+ setenv("PATH", newpath .. io.pathseparator .. getenv("PATH"))
+
+ report_tds("changing from root '%s' to '%s'",oldroot,newroot)
+ report_tds("prepending '%s' to binary path",newpath)
+ report_tds()
end
end
-function resolvers.load_tree(tree)
- if tree and tree ~= "" then
- local setuptex = 'setuptex.tmf'
- if lfs.attributes(tree, "mode") == "directory" then -- check if not nil
- setuptex = tree .. "/" .. setuptex
- else
- setuptex = tree
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['data-lst'] = {
+ 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"
+}
+
+-- used in mtxrun, can be loaded later .. todo
+
+local find, concat, upper, format = string.find, table.concat, string.upper, string.format
+
+resolvers.listers = resolvers.listers or { }
+
+local resolvers = resolvers
+
+local report_lists = logs.reporter("resolvers","lists")
+
+local function tabstr(str)
+ if type(str) == 'table' then
+ return concat(str," | ")
+ else
+ return str
+ end
+end
+
+function resolvers.listers.variables(pattern)
+ local instance = resolvers.instance
+ local environment = instance.environment
+ local variables = instance.variables
+ local expansions = instance.expansions
+ local pattern = upper(pattern or "")
+ local configured = { }
+ local order = instance.order
+ for i=1,#order do
+ for k, v in next, order[i] do
+ if v ~= nil and configured[k] == nil then
+ configured[k] = v
+ end
end
- if io.exists(setuptex) then
- resolvers.check_environment(tree)
- resolvers.load_environment(setuptex)
+ end
+ local env = table.fastcopy(environment)
+ local var = table.fastcopy(variables)
+ local exp = table.fastcopy(expansions)
+ for key, value in table.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",resolvers.resolve(expansions[key]) or "unset")
end
end
+ instance.environment = table.fastcopy(env)
+ instance.variables = table.fastcopy(var)
+ instance.expansions = table.fastcopy(exp)
+end
+
+function resolvers.listers.configurations(report)
+ local configurations = resolvers.instance.specification
+ local report = report or texio.write_nl
+ for i=1,#configurations do
+ report(resolvers.resolve(configurations[i]))
+ end
end
@@ -11694,9 +13873,15 @@ if not modules then modules = { } end modules ['luat-sta'] = {
local gmatch, match = string.gmatch, string.match
local type = type
-states = states or { }
-states.data = states.data or { }
-states.hash = states.hash or { }
+states = states or { }
+local states = states
+
+states.data = states.data or { }
+local data = states.data
+
+states.hash = states.hash or { }
+local hash = states.hash
+
states.tag = states.tag or ""
states.filename = states.filename or ""
@@ -11706,7 +13891,7 @@ function states.save(filename,tag)
io.savedata(filename,
"-- generator : luat-sta.lua\n" ..
"-- state tag : " .. tag .. "\n\n" ..
- table.serialize(states.data[tag or states.tag] or {},true)
+ table.serialize(data[tag or states.tag] or {},true)
)
end
@@ -11714,11 +13899,11 @@ function states.load(filename,tag)
states.filename = filename
states.tag = tag or "whatever"
states.filename = file.addsuffix(states.filename,'lus')
- states.data[states.tag], states.hash[states.tag] = (io.exists(filename) and dofile(filename)) or { }, { }
+ data[states.tag], hash[states.tag] = (io.exists(filename) and dofile(filename)) or { }, { }
end
-function states.set_by_tag(tag,key,value,default,persistent)
- local d, h = states.data[tag], states.hash[tag]
+local function set_by_tag(tag,key,value,default,persistent)
+ local d, h = data[tag], hash[tag]
if d then
if type(d) == "table" then
local dkey, hkey = key, key
@@ -11738,8 +13923,10 @@ function states.set_by_tag(tag,key,value,default,persistent)
end
dkey, hkey = post, key
end
- if type(value) == nil then
- value = value or default
+ if value == nil then
+ value = default
+ elseif value == false then
+ -- special case
elseif persistent then
value = value or d[dkey] or default
else
@@ -11748,144 +13935,202 @@ function states.set_by_tag(tag,key,value,default,persistent)
d[dkey], h[hkey] = value, value
elseif type(d) == "string" then
-- weird
- states.data[tag], states.hash[tag] = value, value
+ data[tag], hash[tag] = value, value
end
end
end
-function states.get_by_tag(tag,key,default)
- local h = states.hash[tag]
+local function get_by_tag(tag,key,default)
+ local h = hash[tag]
if h and h[key] then
return h[key]
else
- local d = states.data[tag]
+ local d = data[tag]
if d then
for k in gmatch(key,"[^%.]+") do
local dk = d[k]
- if dk then
+ if dk ~= nil then
d = dk
else
return default
end
end
- return d or default
+ if d == false then
+ return false
+ else
+ return d or default
+ end
end
end
end
+states.set_by_tag = set_by_tag
+states.get_by_tag = get_by_tag
+
function states.set(key,value,default,persistent)
- states.set_by_tag(states.tag,key,value,default,persistent)
+ set_by_tag(states.tag,key,value,default,persistent)
end
function states.get(key,default)
- return states.get_by_tag(states.tag,key,default)
-end
-
---~ states.data.update = {
---~ ["version"] = {
---~ ["major"] = 0,
---~ ["minor"] = 1,
---~ },
---~ ["rsync"] = {
---~ ["server"] = "contextgarden.net",
---~ ["module"] = "minimals",
---~ ["repository"] = "current",
---~ ["flags"] = "-rpztlv --stats",
---~ },
---~ ["tasks"] = {
---~ ["update"] = true,
---~ ["make"] = true,
---~ ["delete"] = false,
---~ },
---~ ["platform"] = {
---~ ["host"] = true,
---~ ["other"] = {
---~ ["mswin"] = false,
---~ ["linux"] = false,
---~ ["linux-64"] = false,
---~ ["osx-intel"] = false,
---~ ["osx-ppc"] = false,
---~ ["sun"] = false,
---~ },
---~ },
---~ ["context"] = {
---~ ["available"] = {"current", "beta", "alpha", "experimental"},
---~ ["selected"] = "current",
---~ },
---~ ["formats"] = {
---~ ["cont-en"] = true,
---~ ["cont-nl"] = true,
---~ ["cont-de"] = false,
---~ ["cont-cz"] = false,
---~ ["cont-fr"] = false,
---~ ["cont-ro"] = false,
---~ },
---~ ["engine"] = {
---~ ["pdftex"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ ["pdftex"] = true,
---~ },
---~ },
---~ ["luatex"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ },
---~ },
---~ ["xetex"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ ["xetex"] = false,
---~ },
---~ },
---~ ["metapost"] = {
---~ ["install"] = true,
---~ ["formats"] = {
---~ ["mpost"] = true,
---~ ["metafun"] = true,
---~ },
---~ },
---~ },
---~ ["fonts"] = {
---~ },
---~ ["doc"] = {
---~ },
---~ ["modules"] = {
---~ ["f-urwgaramond"] = false,
---~ ["f-urwgothic"] = false,
---~ ["t-bnf"] = false,
---~ ["t-chromato"] = false,
---~ ["t-cmscbf"] = false,
---~ ["t-cmttbf"] = false,
---~ ["t-construction-plan"] = false,
---~ ["t-degrade"] = false,
---~ ["t-french"] = false,
---~ ["t-lettrine"] = false,
---~ ["t-lilypond"] = false,
---~ ["t-mathsets"] = false,
---~ ["t-tikz"] = false,
---~ ["t-typearea"] = false,
---~ ["t-vim"] = false,
---~ },
---~ }
-
---~ states.save("teststate", "update")
---~ states.load("teststate", "update")
-
---~ print(states.get_by_tag("update","rsync.server","unknown"))
---~ states.set_by_tag("update","rsync.server","oeps")
---~ print(states.get_by_tag("update","rsync.server","unknown"))
---~ states.save("teststate", "update")
---~ states.load("teststate", "update")
---~ print(states.get_by_tag("update","rsync.server","unknown"))
+ return get_by_tag(states.tag,key,default)
+end
+
+
+
+
+
+end -- of closure
+
+do -- create closure to overcome 200 locals limit
+
+if not modules then modules = { } end modules ['luat-fmt'] = {
+ version = 1.001,
+ comment = "companion to mtxrun",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+
+local format = string.format
+
+local report_format = logs.reporter("resolvers","formats")
+
+-- helper for mtxrun
+
+local quoted = string.quoted
+
+local function primaryflags() -- not yet ok
+ local trackers = environment.argument("trackers")
+ local directives = environment.argument("directives")
+ local flags = ""
+ if trackers and trackers ~= "" then
+ flags = flags .. "--trackers=" .. quoted(trackers)
+ end
+ if directives and directives ~= "" then
+ flags = flags .. "--directives=" .. quoted(directives)
+ end
+ return flags
+end
+
+function environment.make_format(name)
+ -- change to format path (early as we need expanded paths)
+ local olddir = lfs.currentdir()
+ local path = caches.getwritablepath("formats") or "" -- maybe platform
+ if path ~= "" then
+ lfs.chdir(path)
+ end
+ report_format("format path: %s",lfs.currentdir())
+ -- check source file
+ local texsourcename = file.addsuffix(name,"mkiv")
+ local fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
+ if fulltexsourcename == "" then
+ texsourcename = file.addsuffix(name,"tex")
+ fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
+ end
+ if fulltexsourcename == "" then
+ report_format("no tex source file with name: %s (mkiv or tex)",name)
+ lfs.chdir(olddir)
+ return
+ else
+ report_format("using tex source file: %s",fulltexsourcename)
+ end
+ local texsourcepath = dir.expandname(file.dirname(fulltexsourcename)) -- really needed
+ -- check specification
+ local specificationname = file.replacesuffix(fulltexsourcename,"lus")
+ local fullspecificationname = resolvers.findfile(specificationname,"tex") or ""
+ if fullspecificationname == "" then
+ specificationname = file.join(texsourcepath,"context.lus")
+ fullspecificationname = resolvers.findfile(specificationname,"tex") or ""
+ end
+ if fullspecificationname == "" then
+ report_format("unknown stub specification: %s",specificationname)
+ lfs.chdir(olddir)
+ return
+ end
+ local specificationpath = file.dirname(fullspecificationname)
+ -- load specification
+ local usedluastub = nil
+ local usedlualibs = dofile(fullspecificationname)
+ if type(usedlualibs) == "string" then
+ usedluastub = file.join(file.dirname(fullspecificationname),usedlualibs)
+ elseif type(usedlualibs) == "table" then
+ report_format("using stub specification: %s",fullspecificationname)
+ local texbasename = file.basename(name)
+ local luastubname = file.addsuffix(texbasename,"lua")
+ local lucstubname = file.addsuffix(texbasename,"luc")
+ -- pack libraries in stub
+ report_format("creating initialization file: %s",luastubname)
+ utilities.merger.selfcreate(usedlualibs,specificationpath,luastubname)
+ -- compile stub file (does not save that much as we don't use this stub at startup any more)
+ local strip = resolvers.booleanvariable("LUACSTRIP", true)
+ if utilities.lua.compile(luastubname,lucstubname) and lfs.isfile(lucstubname) then
+ report_format("using compiled initialization file: %s",lucstubname)
+ usedluastub = lucstubname
+ else
+ report_format("using uncompiled initialization file: %s",luastubname)
+ usedluastub = luastubname
+ end
+ else
+ report_format("invalid stub specification: %s",fullspecificationname)
+ lfs.chdir(olddir)
+ return
+ end
+ -- generate format
+ local command = format("luatex --ini %s --lua=%s %s %sdump",primaryflags(),quoted(usedluastub),quoted(fulltexsourcename),os.platform == "unix" and "\\\\" or "\\")
+ report_format("running command: %s\n",command)
+ os.spawn(command)
+ -- remove related mem files
+ local pattern = file.removesuffix(file.basename(usedluastub)).."-*.mem"
+ -- report_format("removing related mplib format with pattern '%s'", pattern)
+ local mp = dir.glob(pattern)
+ if mp then
+ for i=1,#mp do
+ local name = mp[i]
+ report_format("removing related mplib format %s", file.basename(name))
+ os.remove(name)
+ end
+ end
+ lfs.chdir(olddir)
+end
+
+function environment.run_format(name,data,more)
+ -- hm, rather old code here; we can now use the file.whatever functions
+ if name and name ~= "" then
+ local barename = file.removesuffix(name)
+ local fmtname = caches.getfirstreadablefile(file.addsuffix(barename,"fmt"),"formats")
+ if fmtname == "" then
+ fmtname = resolvers.findfile(file.addsuffix(barename,"fmt")) or ""
+ end
+ fmtname = resolvers.cleanpath(fmtname)
+ if fmtname == "" then
+ report_format("no format with name: %s",name)
+ else
+ local barename = file.removesuffix(name) -- expanded name
+ local luaname = file.addsuffix(barename,"luc")
+ if not lfs.isfile(luaname) then
+ luaname = file.addsuffix(barename,"lua")
+ end
+ if not lfs.isfile(luaname) then
+ report_format("using format name: %s",fmtname)
+ report_format("no luc/lua with name: %s",barename)
+ else
+ local command = format("luatex %s --fmt=%s --lua=%s %s %s",primaryflags(),quoted(barename),quoted(luaname),quoted(data),more ~= "" and quoted(more) or "")
+ report_format("running command: %s",command)
+ os.spawn(command)
+ end
+ end
+ end
+end
end -- of closure
-- end library merge
-own = { } -- not local
+own = { } -- not local, might change
+
+own.libs = { -- order can be made better
-own.libs = { -- todo: check which ones are really needed
'l-string.lua',
'l-lpeg.lua',
'l-table.lua',
@@ -11898,39 +14143,55 @@ own.libs = { -- todo: check which ones are really needed
'l-url.lua',
'l-dir.lua',
'l-boolean.lua',
+ 'l-unicode.lua',
'l-math.lua',
--- 'l-unicode.lua',
--- 'l-tex.lua',
- 'l-utils.lua',
- 'l-aux.lua',
--- 'l-xml.lua',
- 'trac-tra.lua',
+
+ 'util-tab.lua',
+ 'util-sto.lua',
+ 'util-mrg.lua',
+ 'util-lua.lua',
+ 'util-prs.lua',
+ 'util-fmt.lua',
+ 'util-deb.lua',
+
+ 'trac-inf.lua',
+ 'trac-set.lua',
+ 'trac-log.lua',
+ 'trac-pro.lua',
+
+ 'luat-env.lua', -- can come before inf (as in mkiv)
+
'lxml-tab.lua',
'lxml-lpt.lua',
--- 'lxml-ent.lua',
+ -- 'lxml-ent.lua',
'lxml-mis.lua',
'lxml-aux.lua',
'lxml-xml.lua',
- 'luat-env.lua',
- 'trac-inf.lua',
- 'trac-log.lua',
- 'data-res.lua',
+
+ 'data-ini.lua',
+ 'data-exp.lua',
+ 'data-env.lua',
'data-tmp.lua',
+ 'data-met.lua',
+ 'data-res.lua',
'data-pre.lua',
'data-inp.lua',
'data-out.lua',
+ 'data-fil.lua',
'data-con.lua',
'data-use.lua',
-- 'data-tex.lua',
-- 'data-bin.lua',
'data-zip.lua',
+ 'data-tre.lua',
'data-crl.lua',
'data-lua.lua',
- 'data-kps.lua', -- so that we can replace kpsewhich
'data-aux.lua', -- updater
- 'data-tmf.lua', -- tree files
- -- needed ?
- 'luat-sta.lua', -- states
+ 'data-tmf.lua',
+ 'data-lst.lua',
+
+ 'luat-sta.lua',
+ 'luat-fmt.lua',
}
-- We need this hack till luatex is fixed.
@@ -11943,35 +14204,62 @@ end
-- End of hack.
-own.name = (environment and environment.ownname) or arg[0] or 'luatools.lua'
+local format, gsub, gmatch, match = string.format, string.gsub, string.gmatch, string.match
+local concat = table.concat
+own.name = (environment and environment.ownname) or arg[0] or 'mtxrun.lua'
+own.path = gsub(match(own.name,"^(.+)[\\/].-$") or ".","\\","/")
+
+local ownpath, owntree = own.path, environment and environment.ownpath or own.path
+
+own.list = {
+ '.',
+ ownpath ,
+ ownpath .. "/../sources", -- HH's development path
+ owntree .. "/../../texmf-local/tex/context/base",
+ owntree .. "/../../texmf-context/tex/context/base",
+ owntree .. "/../../texmf-dist/tex/context/base",
+ owntree .. "/../../texmf/tex/context/base",
+ owntree .. "/../../../texmf-local/tex/context/base",
+ owntree .. "/../../../texmf-context/tex/context/base",
+ owntree .. "/../../../texmf-dist/tex/context/base",
+ owntree .. "/../../../texmf/tex/context/base",
+}
-own.path = string.match(own.name,"^(.+)[\\/].-$") or "."
-own.list = { '.' }
-if own.path ~= '.' then
- table.insert(own.list,own.path)
-end
-table.insert(own.list,own.path.."/../../texmf-dist/tex/context/base")
-table.insert(own.list,own.path.."/../../../tex/context/base")
-table.insert(own.list,own.path.."/mtx")
-table.insert(own.list,own.path.."/../sources")
+if own.path == "." then table.remove(own.list,1) end
local function locate_libs()
- for _, lib in pairs(own.libs) do
- for _, pth in pairs(own.list) do
- local filename = string.gsub(pth .. "/" .. lib,"\\","/")
+ for l=1,#own.libs do
+ local lib = own.libs[l]
+ for p =1,#own.list do
+ local pth = own.list[p]
+ local filename = pth .. "/" .. lib
+ local found = lfs.isfile(filename)
+ if found then
+ package.path = package.path .. ";" .. pth .. "/?.lua" -- in case l-* does a require
+ return pth
+ end
+ end
+ end
+end
+
+local function load_libs()
+ local found = locate_libs()
+ if found then
+ for l=1,#own.libs do
+ local filename = found .. "/" .. own.libs[l]
local codeblob = loadfile(filename)
if codeblob then
codeblob()
- own.list = { pth } -- speed up te search
- break
end
end
+ else
+ resolvers = nil
end
end
if not resolvers then
- locate_libs()
+ load_libs()
end
if not resolvers then
@@ -11983,20 +14271,56 @@ if not resolvers then
os.exit()
end
-logs.setprogram('MTXrun',"TDS Runner Tool 1.24",environment.arguments["verbose"] or false)
+-- verbosity
-local instance = resolvers.reset()
+local e_verbose = environment.arguments["verbose"]
-local trackspec = environment.argument("trackers") or environment.argument("track")
+if e_verbose then
+ trackers.enable("resolvers.locating")
+end
+
+-- some common flags (also passed through environment)
+
+local e_silent = environment.argument("silent")
+local e_noconsole = environment.argument("noconsole")
+
+local e_trackers = environment.argument("trackers")
+local e_directives = environment.argument("directives")
+local e_experiments = environment.argument("experiments")
+
+if e_silent == true then
+ e_silent = "*"
+end
+
+if type(e_silent) == "string" then
+ if type(e_directives) == "string" then
+ e_directives = format("%s,logs.blocked={%s}",e_directives,e_silent)
+ else
+ e_directives = format("logs.blocked={%s}",e_silent)
+ end
+end
-if trackspec then
- trackers.enable(trackspec)
+if e_noconsole then
+ if type(e_directives) == "string" then
+ e_directives = format("%s,logs.target=file",e_directives)
+ else
+ e_directives = format("logs.target=file")
+ end
end
-runners = runners or { } -- global
-messages = messages or { }
+if e_trackers then trackers .enable(e_trackers) end
+if e_directives then directives .enable(e_directives) end
+if e_experiments then experiments.enable(e_experiments) end
-messages.help = [[
+if not environment.trackers then environment.trackers = e_trackers end
+if not environment.directives then environment.directives = e_directives end
+if not environment.experiments then environment.experiments = e_experiments end
+
+--
+
+local instance = resolvers.reset()
+
+local helpinfo = [[
--script run an mtx script (lua prefered method) (--noquotes), no script gives list
--execute run a script or program (texmfstart method) (--noquotes)
--resolve resolve prefixed arguments
@@ -12011,15 +14335,14 @@ messages.help = [[
--ifchanged=filename only execute when given file has changed (md checksum)
--iftouched=old,new only execute when given file has changed (time stamp)
---make create stubs for (context related) scripts
---remove remove stubs (context related) scripts
+--makestubs create stubs for (context related) scripts
+--removestubs remove stubs (context related) scripts
--stubpath=binpath paths where stubs wil be written
--windows create windows (mswin) stubs
--unix create unix (linux) stubs
--verbose give a bit more info
--trackers=list enable given trackers
---engine=str target engine
--progname=str format or backend
--edit launch editor with found file
@@ -12032,8 +14355,35 @@ messages.help = [[
--forcekpse force using kpse (handy when no mkiv and cache installed but less functionality)
--prefixes show supported prefixes
+
+--generate generate file database
+
+--variables show configuration variables
+--configurations show configuration order
+
+--expand-braces expand complex variable
+--expand-path expand variable (resolve paths)
+--expand-var expand variable (resolve references)
+--show-path show path expansion of ...
+--var-value report value of variable
+--find-file report file location
+--find-path report path of file
+
+--pattern=str filter variables
]]
+local application = logs.application {
+ name = "mtxrun",
+ banner = "ConTeXt TDS Runner Tool 1.30",
+ helpinfo = helpinfo,
+}
+
+local report = application.report
+
+messages = messages or { } -- for the moment
+
+runners = runners or { } -- global (might become local)
+
runners.applications = {
["lua"] = "luatex --luaonly",
["luc"] = "luatex --luaonly",
@@ -12056,7 +14406,7 @@ runners.registered = {
makempy = { 'makempy.pl', true },
mptopdf = { 'mptopdf.pl', true },
pstopdf = { 'pstopdf.rb', true }, -- converts ps (and some more) images, does some cleaning (replaced)
--- examplex = { 'examplex.rb', false },
+ -- examplex = { 'examplex.rb', false },
concheck = { 'concheck.rb', false },
runtools = { 'runtools.rb', true },
textools = { 'textools.rb', true },
@@ -12065,9 +14415,9 @@ runners.registered = {
rlxtools = { 'rlxtools.rb', true },
pdftools = { 'pdftools.rb', true },
mpstools = { 'mpstools.rb', true },
--- exatools = { 'exatools.rb', true },
+ -- exatools = { 'exatools.rb', true },
xmltools = { 'xmltools.rb', true },
--- luatools = { 'luatools.lua', true },
+ -- luatools = { 'luatools.lua', true },
mtxtools = { 'mtxtools.rb', true },
pdftrimwhite = { 'pdftrimwhite.pl', false }
}
@@ -12086,45 +14436,39 @@ end
function runners.prepare()
local checkname = environment.argument("ifchanged")
- if checkname and checkname ~= "" then
+ if type(checkname) == "string" and checkname ~= "" then
local oldchecksum = file.loadchecksum(checkname)
local newchecksum = file.checksum(checkname)
if oldchecksum == newchecksum then
- logs.simple("file '%s' is unchanged",checkname)
+ if e_verbose then
+ report("file '%s' is unchanged",checkname)
+ end
return "skip"
- else
- logs.simple("file '%s' is changed, processing started",checkname)
+ elseif e_verbose then
+ report("file '%s' is changed, processing started",checkname)
end
file.savechecksum(checkname)
end
- local oldname, newname = string.split(environment.argument("iftouched") or "", ",")
- if oldname and newname and oldname ~= "" and newname ~= "" then
- if not file.needs_updating(oldname,newname) then
- logs.simple("file '%s' and '%s' have same age",oldname,newname)
- return "skip"
- else
- logs.simple("file '%s' is older than '%s'",oldname,newname)
- end
- end
- local tree = environment.argument('tree') or ""
- if environment.argument('autotree') then
- tree = os.getenv('TEXMFSTART_TREE') or os.getenv('TEXMFSTARTTREE') or tree
- end
- if tree and tree ~= "" then
- resolvers.load_tree(tree)
- end
- local env = environment.argument('environment') or ""
- if env and env ~= "" then
- for _,e in pairs(string.split(env)) do
- -- maybe force suffix when not given
- resolvers.load_tree(e)
+ local touchname = environment.argument("iftouched")
+ if type(touchname) == "string" and touchname ~= "" then
+ local oldname, newname = string.split(touchname, ",")
+ if oldname and newname and oldname ~= "" and newname ~= "" then
+ if not file.needs_updating(oldname,newname) then
+ if e_verbose then
+ report("file '%s' and '%s' have same age",oldname,newname)
+ end
+ return "skip"
+ elseif e_verbose then
+ report("file '%s' is older than '%s'",oldname,newname)
+ end
end
end
local runpath = environment.argument("path")
- if runpath and not lfs.chdir(runpath) then
- logs.simple("unable to change to path '%s'",runpath)
+ if type(runpath) == "string" and not lfs.chdir(runpath) then
+ report("unable to change to path '%s'",runpath)
return "error"
end
+ runners.prepare = function() end
return "run"
end
@@ -12137,8 +14481,6 @@ function runners.execute_script(fullname,internal,nosplit)
elseif state == 'skip' then
return true
elseif state == "run" then
- instance.progname = environment.argument("progname") or instance.progname
- instance.format = environment.argument("format") or instance.format
local path, name, suffix, result = file.dirname(fullname), file.basename(fullname), file.extname(fullname), ""
if path ~= "" then
result = fullname
@@ -12155,21 +14497,21 @@ function runners.execute_script(fullname,internal,nosplit)
if suffix == "" then
-- loop over known suffixes
for _,s in pairs(runners.suffixes) do
- result = resolvers.find_file(name .. "." .. s, 'texmfscripts')
+ result = resolvers.findfile(name .. "." .. s, 'texmfscripts')
if result ~= "" then
break
end
end
elseif runners.applications[suffix] then
- result = resolvers.find_file(name, 'texmfscripts')
+ result = resolvers.findfile(name, 'texmfscripts')
else
-- maybe look on path
- result = resolvers.find_file(name, 'other text files')
+ result = resolvers.findfile(name, 'other text files')
end
end
if result and result ~= "" then
if not no_split then
- local before, after = environment.split_arguments(fullname) -- already done
+ local before, after = environment.splitarguments(fullname) -- already done
environment.arguments_before, environment.arguments_after = before, after
end
if internal then
@@ -12181,12 +14523,12 @@ function runners.execute_script(fullname,internal,nosplit)
if binary and binary ~= "" then
result = binary .. " " .. result
end
- local command = result .. " " .. environment.reconstruct_commandline(environment.arguments_after,noquote)
- if logs.verbose then
- logs.simpleline()
- logs.simple("executing: %s",command)
- logs.simpleline()
- logs.simpleline()
+ local command = result .. " " .. environment.reconstructcommandline(environment.arguments_after,noquote)
+ if e_verbose then
+ report()
+ report("executing: %s",command)
+ report()
+ report()
io.flush()
end
-- no os.exec because otherwise we get the wrong return value
@@ -12196,14 +14538,14 @@ function runners.execute_script(fullname,internal,nosplit)
else
if binary then
binary = file.addsuffix(binary,os.binsuffix)
- for p in string.gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
+ for p in gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
if lfs.isfile(file.join(p,binary)) then
return false
end
end
- logs.simpleline()
- logs.simple("This script needs '%s' which seems not to be installed.",binary)
- logs.simpleline()
+ report()
+ report("This script needs '%s' which seems not to be installed.",binary)
+ report()
end
return false
end
@@ -12223,14 +14565,15 @@ function runners.execute_program(fullname)
elseif state == 'skip' then
return true
elseif state == "run" then
- local before, after = environment.split_arguments(fullname)
- environment.initialize_arguments(after)
+ local before, after = environment.splitarguments(fullname)
+ for k=1,#after do after[k] = resolvers.resolve(after[k]) end
+ environment.initializearguments(after)
fullname = fullname:gsub("^bin:","")
- local command = fullname .. " " .. (environment.reconstruct_commandline(after or "",noquote) or "")
- logs.simpleline()
- logs.simple("executing: %s",command)
- logs.simpleline()
- logs.simpleline()
+ local command = fullname .. " " .. (environment.reconstructcommandline(after or "",noquote) or "")
+ report()
+ report("executing: %s",command)
+ report()
+ report()
io.flush()
local code = os.exec(command) -- (fullname,unpack(after)) does not work / maybe spawn
return code == 0
@@ -12239,7 +14582,7 @@ function runners.execute_program(fullname)
return false
end
--- the --usekpse flag will fallback on kpse (hm, we can better update mtx-stubs)
+-- the --usekpse flag will fallback (not default) on kpse (hm, we can better update mtx-stubs)
local windows_stub = '@echo off\013\010setlocal\013\010set ownpath=%%~dp0%%\013\010texlua "%%ownpath%%mtxrun.lua" --usekpse --execute %s %%*\013\010endlocal\013\010'
local unix_stub = '#!/bin/sh\010mtxrun --usekpse --execute %s \"$@\"\010'
@@ -12258,22 +14601,22 @@ function runners.handle_stubs(create)
for _,v in pairs(runners.registered) do
local name, doit = v[1], v[2]
if doit then
- local base = string.gsub(file.basename(name), "%.(.-)$", "")
+ local base = gsub(file.basename(name), "%.(.-)$", "")
if create then
if windows then
- io.savedata(file.join(stubpath,base..".bat"),string.format(windows_stub,name))
- logs.simple("windows stub for '%s' created",base)
+ io.savedata(file.join(stubpath,base..".bat"),format(windows_stub,name))
+ report("windows stub for '%s' created",base)
end
if unix then
- io.savedata(file.join(stubpath,base),string.format(unix_stub,name))
- logs.simple("unix stub for '%s' created",base)
+ io.savedata(file.join(stubpath,base),format(unix_stub,name))
+ report("unix stub for '%s' created",base)
end
else
if windows and (os.remove(file.join(stubpath,base..'.bat')) or os.remove(file.join(stubpath,base..'.cmd'))) then
- logs.simple("windows stub for '%s' removed", base)
+ report("windows stub for '%s' removed", base)
end
if unix and (os.remove(file.join(stubpath,base)) or os.remove(file.join(stubpath,base..'.sh'))) then
- logs.simple("unix stub for '%s' removed",base)
+ report("unix stub for '%s' removed",base)
end
end
end
@@ -12289,7 +14632,7 @@ end
function runners.locate_file(filename)
-- differs from texmfstart where locate appends .com .exe .bat ... todo
if filename and filename ~= "" then
- runners.report_location(resolvers.find_given_file(filename))
+ runners.report_location(resolvers.findgivenfile(filename))
end
end
@@ -12298,28 +14641,28 @@ function runners.locate_platform()
end
function runners.report_location(result)
- if logs.verbose then
- logs.simpleline()
+ if e_verbose then
+ reportline()
if result and result ~= "" then
- logs.simple(result)
+ report(result)
else
- logs.simple("not found")
+ report("not found")
end
else
io.write(result)
end
end
-function runners.edit_script(filename) -- we assume that vim is present on most systems
- local editor = os.getenv("MTXRUN_EDITOR") or os.getenv("TEXMFSTART_EDITOR") or os.getenv("EDITOR") or 'vim'
+function runners.edit_script(filename) -- we assume that gvim is present on most systems (todo: also in cnf file)
+ local editor = os.getenv("MTXRUN_EDITOR") or os.getenv("TEXMFSTART_EDITOR") or os.getenv("EDITOR") or 'gvim'
local rest = resolvers.resolve(filename)
if rest ~= "" then
local command = editor .. " " .. rest
- if logs.verbose then
- logs.simpleline()
- logs.simple("starting editor: %s",command)
- logs.simple_line()
- logs.simple_line()
+ if e_verbose then
+ report()
+ report("starting editor: %s",command)
+ report()
+ report()
end
os.launch(command)
end
@@ -12362,33 +14705,33 @@ end
function runners.launch_file(filename)
instance.allresults = true
- logs.setverbose(true)
+ trackers.enable("resolvers.locating")
local pattern = environment.arguments["pattern"]
if not pattern or pattern == "" then
pattern = filename
end
if not pattern or pattern == "" then
- logs.simple("provide name or --pattern=")
+ report("provide name or --pattern=")
else
- local t = resolvers.find_files(pattern)
+ local t = resolvers.findfiles(pattern)
if not t or #t == 0 then
- t = resolvers.find_files("*/" .. pattern)
+ t = resolvers.findfiles("*/" .. pattern)
end
if not t or #t == 0 then
- t = resolvers.find_files("*/" .. pattern .. "*")
+ t = resolvers.findfiles("*/" .. pattern .. "*")
end
if t and #t > 0 then
if environment.arguments["all"] then
for _, v in pairs(t) do
- logs.simple("launching %s", v)
+ report("launching %s", v)
resolvers.launch(v)
end
else
- logs.simple("launching %s", t[1])
+ report("launching %s", t[1])
resolvers.launch(t[1])
end
else
- logs.simple("no match for %s", pattern)
+ report("no match for %s", pattern)
end
end
end
@@ -12421,33 +14764,45 @@ function runners.find_mtx_script(filename)
local mtxprefix = (filename:find("^mtx%-") and "") or "mtx-"
-- context namespace, mtx-<filename>
fullname = mtxprefix .. filename
- fullname = found(fullname) or resolvers.find_file(fullname)
+ fullname = found(fullname) or resolvers.findfile(fullname)
if fullname and fullname ~= "" then
return fullname
end
-- context namespace, mtx-<filename>s
fullname = mtxprefix .. basename .. "s" .. "." .. suffix
- fullname = found(fullname) or resolvers.find_file(fullname)
+ fullname = found(fullname) or resolvers.findfile(fullname)
if fullname and fullname ~= "" then
return fullname
end
-- context namespace, mtx-<filename minus trailing s>
fullname = mtxprefix .. basename:gsub("s$","") .. "." .. suffix
- fullname = found(fullname) or resolvers.find_file(fullname)
+ fullname = found(fullname) or resolvers.findfile(fullname)
if fullname and fullname ~= "" then
return fullname
end
-- context namespace, just <filename>
- fullname = resolvers.find_file(filename)
+ fullname = resolvers.findfile(filename)
return fullname
end
-function runners.execute_ctx_script(filename)
+function runners.register_arguments(...)
+ local arguments = environment.arguments_after
+ local passedon = { ... }
+ for i=#passedon,1,-1 do
+ local pi = passedon[i]
+ if pi then
+ table.insert(arguments,1,pi)
+ end
+ end
+end
+
+function runners.execute_ctx_script(filename,...)
+ runners.register_arguments(...)
local arguments = environment.arguments_after
local fullname = runners.find_mtx_script(filename) or ""
if file.extname(fullname) == "cld" then
-- handy in editors where we force --autopdf
- logs.simple("running cld script: %s",filename)
+ report("running cld script: %s",filename)
table.insert(arguments,1,fullname)
table.insert(arguments,"--autopdf")
fullname = runners.find_mtx_script("context") or ""
@@ -12455,7 +14810,7 @@ function runners.execute_ctx_script(filename)
-- retry after generate but only if --autogenerate
if fullname == "" and environment.argument("autogenerate") then -- might become the default
instance.renewcache = true
- logs.setverbose(true)
+ trackers.enable("resolvers.locating")
resolvers.load()
--
fullname = runners.find_mtx_script(filename) or ""
@@ -12470,7 +14825,7 @@ function runners.execute_ctx_script(filename)
elseif state == "run" then
-- load and save ... kind of undocumented
arg = { } for _,v in pairs(arguments) do arg[#arg+1] = resolvers.resolve(v) end
- environment.initialize_arguments(arg)
+ environment.initializearguments(arg)
local loadname = environment.arguments['load']
if loadname then
if type(loadname) ~= "string" then loadname = file.basename(fullname) end
@@ -12478,8 +14833,8 @@ function runners.execute_ctx_script(filename)
runners.load_script_session(loadname)
end
filename = environment.files[1]
- if logs.verbose then
- logs.simple("using script: %s\n",fullname)
+ if e_verbose then
+ report("using script: %s\n",fullname)
end
environment.ownscript = fullname
dofile(fullname)
@@ -12495,44 +14850,42 @@ function runners.execute_ctx_script(filename)
return true
end
else
- -- logs.setverbose(true)
if filename == "" or filename == "help" then
- local context = resolvers.find_file("mtx-context.lua")
- logs.setverbose(true)
+ local context = resolvers.findfile("mtx-context.lua")
+ trackers.enable("resolvers.locating")
if context ~= "" then
- local result = dir.glob((string.gsub(context,"mtx%-context","mtx-*"))) -- () needed
+ local result = dir.glob((gsub(context,"mtx%-context","mtx-*"))) -- () needed
local valid = { }
table.sort(result)
for i=1,#result do
local scriptname = result[i]
- local scriptbase = string.match(scriptname,".*mtx%-([^%-]-)%.lua")
+ local scriptbase = match(scriptname,".*mtx%-([^%-]-)%.lua")
if scriptbase then
local data = io.loaddata(scriptname)
- local banner, version = string.match(data,"[\n\r]logs%.extendbanner%s*%(%s*[\"\']([^\n\r]+)%s*(%d+%.%d+)")
+ local banner, version = match(data,"[\n\r]logs%.extendbanner%s*%(%s*[\"\']([^\n\r]+)%s*(%d+%.%d+)")
if banner then
valid[#valid+1] = { scriptbase, version, banner }
end
end
end
if #valid > 0 then
- logs.reportbanner()
- logs.reportline()
- logs.simple("no script name given, known scripts:")
- logs.simple()
+ application.identify()
+ report("no script name given, known scripts:")
+ report()
for k=1,#valid do
local v = valid[k]
- logs.simple("%-12s %4s %s",v[1],v[2],v[3])
+ report("%-12s %4s %s",v[1],v[2],v[3])
end
end
else
- logs.simple("no script name given")
+ report("no script name given")
end
else
filename = file.addsuffix(filename,"lua")
if file.is_qualified_path(filename) then
- logs.simple("unknown script '%s'",filename)
+ report("unknown script '%s'",filename)
else
- logs.simple("unknown script '%s' or 'mtx-%s'",filename,filename)
+ report("unknown script '%s' or 'mtx-%s'",filename,filename)
end
end
return false
@@ -12540,9 +14893,9 @@ function runners.execute_ctx_script(filename)
end
function runners.prefixes()
- logs.reportbanner()
- logs.reportline()
- logs.simple(table.concat(resolvers.allprefixes(true)," "))
+ application.identify()
+ report()
+ report(concat(resolvers.allprefixes(true)," "))
end
function runners.timedrun(filename) -- just for me
@@ -12562,13 +14915,11 @@ end
local filename = environment.files[1] or ""
local ok = true
-local before, after = environment.split_arguments(filename)
+local before, after = environment.splitarguments(filename)
environment.arguments_before, environment.arguments_after = before, after
-environment.initialize_arguments(before)
+environment.initializearguments(before)
-instance.engine = environment.argument("engine") or 'luatex'
-instance.progname = environment.argument("progname") or 'context'
-instance.lsrmode = environment.argument("lsr") or false
+instance.lsrmode = environment.argument("lsr") or false
-- maybe the unset has to go to this level
@@ -12576,36 +14927,40 @@ local is_mkii_stub = runners.registered[file.removesuffix(file.basename(filename
if environment.argument("usekpse") or environment.argument("forcekpse") or is_mkii_stub then
+ resolvers.load_tree(environment.argument('tree'),true) -- force resolve of TEXMFCNF
+
os.setenv("engine","")
os.setenv("progname","")
local remapper = {
- otf = "opentype fonts",
- ttf = "truetype fonts",
- ttc = "truetype fonts",
- pfb = "type1 fonts",
+ otf = "opentype fonts",
+ ttf = "truetype fonts",
+ ttc = "truetype fonts",
+ pfb = "type1 fonts",
other = "other text files",
}
+ local progname = environment.argument("progname") or 'context'
+
local function kpse_initialized()
texconfig.kpse_init = true
local t = os.clock()
- local k = kpse.original.new("luatex",instance.progname)
+ local k = kpse.original.new("luatex",progname)
local dummy = k:find_file("mtxrun.lua") -- so that we're initialized
- logs.simple("kpse fallback with progname '%s' initialized in %s seconds",instance.progname,os.clock()-t)
+ report("kpse fallback with progname '%s' initialized in %s seconds",progname,os.clock()-t)
kpse_initialized = function() return k end
return k
end
- local find_file = resolvers.find_file
- local show_path = resolvers.show_path
+ local findfile = resolvers.findfile
+ local showpath = resolvers.showpath
if environment.argument("forcekpse") then
- function resolvers.find_file(name,kind)
- return (kpse_initialized():find_file(resolvers.clean_path(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
+ function resolvers.findfile(name,kind)
+ return (kpse_initialized():find_file(resolvers.cleanpath(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
end
- function resolvers.show_path(name)
+ function resolvers.showpath(name)
return (kpse_initialized():show_path(name)) or ""
end
@@ -12613,16 +14968,16 @@ if environment.argument("usekpse") or environment.argument("forcekpse") or is_mk
resolvers.load()
- function resolvers.find_file(name,kind)
- local found = find_file(name,kind) or ""
+ function resolvers.findfile(name,kind)
+ local found = findfile(name,kind) or ""
if found ~= "" then
return found
else
- return (kpse_initialized():find_file(resolvers.clean_path(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
+ return (kpse_initialized():find_file(resolvers.cleanpath(name),(kind ~= "" and (remapper[kind] or kind)) or "tex") or "") or ""
end
end
- function resolvers.show_path(name)
- local found = show_path(name) or ""
+ function resolvers.showpath(name)
+ local found = showpath(name) or ""
if found ~= "" then
return found
else
@@ -12632,80 +14987,317 @@ if environment.argument("usekpse") or environment.argument("forcekpse") or is_mk
end
+ function runners.loadbase()
+ end
+
else
- resolvers.load()
+ function runners.loadbase(...)
+ if not resolvers.load(...) then
+ report("forcing cache reload")
+ instance.renewcache = true
+ trackers.enable("resolvers.locating")
+ if not resolvers.load(...) then
+ report("the resolver databases are not present or outdated")
+ end
+ end
+ end
+
+ resolvers.load_tree(environment.argument('tree'))
end
+
if environment.argument("selfmerge") then
+
-- embed used libraries
- utils.merger.selfmerge(own.name,own.libs,own.list)
+
+ runners.loadbase()
+ local found = locate_libs()
+ if found then
+ utilities.merger.selfmerge(own.name,own.libs,{ found })
+ end
+
elseif environment.argument("selfclean") then
+
-- remove embedded libraries
- utils.merger.selfclean(own.name)
+
+ runners.loadbase()
+ utilities.merger.selfclean(own.name)
+
elseif environment.argument("selfupdate") then
- logs.setverbose(true)
- resolvers.update_script(own.name,"mtxrun")
+
+ runners.loadbase()
+ trackers.enable("resolvers.locating")
+ resolvers.updatescript(own.name,"mtxrun")
+
elseif environment.argument("ctxlua") or environment.argument("internal") then
+
-- run a script by loading it (using libs)
+
+ runners.loadbase()
ok = runners.execute_script(filename,true)
+
elseif environment.argument("script") or environment.argument("scripts") then
+
-- run a script by loading it (using libs), pass args
+
+ runners.loadbase()
if is_mkii_stub then
- -- execute mkii script
ok = runners.execute_script(filename,false,true)
else
ok = runners.execute_ctx_script(filename)
end
+
elseif environment.argument("execute") then
+
-- execute script
+
+ runners.loadbase()
ok = runners.execute_script(filename)
+
elseif environment.argument("direct") then
+
-- equals bin:
+
+ runners.loadbase()
ok = runners.execute_program(filename)
+
elseif environment.argument("edit") then
+
-- edit file
+
+ runners.loadbase()
runners.edit_script(filename)
+
elseif environment.argument("launch") then
+
+ runners.loadbase()
runners.launch_file(filename)
-elseif environment.argument("make") then
- -- make stubs
+
+elseif environment.argument("makestubs") then
+
+ -- make stubs (depricated)
+
runners.handle_stubs(true)
-elseif environment.argument("remove") then
- -- remove stub
+
+elseif environment.argument("removestubs") then
+
+ -- remove stub (depricated)
+
+ runners.loadbase()
runners.handle_stubs(false)
+
elseif environment.argument("resolve") then
+
-- resolve string
+
+ runners.loadbase()
runners.resolve_string(filename)
+
elseif environment.argument("locate") then
+
-- locate file
+
+ runners.loadbase()
runners.locate_file(filename)
-elseif environment.argument("platform")then
+
+elseif environment.argument("platform") or environment.argument("show-platform") then
+
-- locate platform
+
+ runners.loadbase()
runners.locate_platform()
+
elseif environment.argument("prefixes") then
+
+ runners.loadbase()
runners.prefixes()
+
elseif environment.argument("timedrun") then
+
-- locate platform
+
+ runners.loadbase()
runners.timedrun(filename)
+
+elseif environment.argument("variables") or environment.argument("show-variables") or environment.argument("expansions") or environment.argument("show-expansions") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expansions",filename)
+
+ resolvers.load("nofiles")
+ resolvers.listers.variables(environment.argument("pattern"))
+
+elseif environment.argument("configurations") or environment.argument("show-configurations") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--configurations",filename)
+
+ resolvers.load("nofiles")
+ resolvers.listers.configurations()
+
+elseif environment.argument("find-file") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--find-file",filename)
+
+ resolvers.load()
+ local e_pattern = environment.argument("pattern")
+ local e_format = environment.arguments("format")
+ if not e_pattern then
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.findfiles,environment.files,e_format)
+ elseif type(e_pattern) == "string" then
+ instance.allresults = true -- brrrr
+ resolvers.dowithfilesandreport(resolvers.findfiles,{ e_pattern }, e_format)
+ end
+
+elseif environment.argument("find-path") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--find-path",filename)
+
+ resolvers.load()
+ local path = resolvers.findpath(filename, instance.my_format)
+ if e_verbose then
+ report(path)
+ else
+ print(path)
+ end
+
+elseif environment.argument("expand-braces") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expand-braces",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.expandbraces, environment.files)
+
+elseif environment.argument("expand-path") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expand-path",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.expandpath, environment.files)
+
+elseif environment.argument("expand-var") or environment.argument("expand-variable") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--expand-var",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.expansion, environment.files)
+
+elseif environment.argument("show-path") or environment.argument("path-value") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--show-path",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.showpath, environment.files)
+
+elseif environment.argument("var-value") or environment.argument("show-value") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--show-value",filename)
+
+ resolvers.load("nofiles")
+ runners.register_arguments(filename)
+ environment.initializearguments(environment.arguments_after)
+ resolvers.dowithfilesandreport(resolvers.variable,environment.files)
+
+elseif environment.argument("format-path") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--format-path",filename)
+
+ resolvers.load()
+ report(caches.getwritablepath("format"))
+
+elseif environment.argument("pattern") then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--pattern='" .. environment.argument("pattern") .. "'",filename)
+
+elseif environment.argument("generate") then
+
+ -- luatools
+
+ instance.renewcache = true
+ trackers.enable("resolvers.locating")
+ resolvers.load()
+
+elseif environment.argument("make") or environment.argument("ini") or environment.argument("compile") then
+
+ -- luatools: runners.execute_ctx_script("mtx-base","--make",filename)
+
+ resolvers.load()
+ trackers.enable("resolvers.locating")
+ environment.make_format(filename)
+
+elseif environment.argument("run") then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--run",filename)
+
+elseif environment.argument("fmt") then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--fmt",filename)
+
+elseif environment.argument("help") and filename=='base' then
+
+ -- luatools
+
+ runners.execute_ctx_script("mtx-base","--help")
+
elseif environment.argument("help") or filename=='help' or filename == "" then
- logs.help(messages.help)
- -- execute script
+
+ application.help()
+
elseif filename:find("^bin:") then
+
+ runners.loadbase()
ok = runners.execute_program(filename)
+
elseif is_mkii_stub then
+
-- execute mkii script
+
+ runners.loadbase()
ok = runners.execute_script(filename,false,true)
-else
+
+elseif false then
+
+ runners.loadbase()
ok = runners.execute_ctx_script(filename)
if not ok then
ok = runners.execute_script(filename)
end
+
+elseif environment.files[1] == 'texmfcnf.lua' then -- so that we don't need to load mtx-base
+
+ resolvers.load("nofiles")
+ resolvers.listers.configurations()
+
+else
+
+ runners.loadbase()
+ runners.execute_ctx_script("mtx-base",filename)
+
+end
+
+if e_verbose then
+ report()
+ report("runtime: %0.3f seconds",os.runtime())
end
-if os.platform == "unix" then
- io.write("\n")
+if os.type ~= "windows" then
+ texio.write("\n") -- is this still valid?
end
if ok == false then ok = 1 elseif ok == true then ok = 0 end
diff --git a/Master/texmf-dist/tex/context/base/anch-pgr.mkii b/Master/texmf-dist/tex/context/base/anch-pgr.mkii
index 194f1975517..cc7ae77f4c5 100644
--- a/Master/texmf-dist/tex/context/base/anch-pgr.mkii
+++ b/Master/texmf-dist/tex/context/base/anch-pgr.mkii
@@ -66,10 +66,14 @@
\def\registerpageposition#1% this one is flushed first !
{\ifpositioning\ifcase\realpageno\or
- \ifdim\printpaperheight=\paperheight\else
- \ifdim\printpaperwidth=\paperwidth\else
+ \ifdim\printpaperheight=\paperheight
+ \ifdim\printpaperwidth=\paperwidth
+ % not needed,
+ \else
\setbox#1\hbox{\hpos\pageanchor{\box#1}}%
\fi
+ \else
+ \setbox#1\ruledhbox{\hpos\pageanchor{\box#1}}%
\fi
\fi\fi}
diff --git a/Master/texmf-dist/tex/context/base/anch-pgr.mkiv b/Master/texmf-dist/tex/context/base/anch-pgr.mkiv
index 248b9ca5e31..afa88193384 100644
--- a/Master/texmf-dist/tex/context/base/anch-pgr.mkiv
+++ b/Master/texmf-dist/tex/context/base/anch-pgr.mkiv
@@ -69,10 +69,14 @@
\def\registerpageposition#1% this one is flushed first !
{\ifpositioning\ifcase\realpageno\or
- \ifdim\printpaperheight=\paperheight\else
- \ifdim\printpaperwidth=\paperwidth\else
+ \ifdim\printpaperheight=\paperheight
+ \ifdim\printpaperwidth=\paperwidth
+ % not needed,
+ \else
\setbox#1\hbox{\hpos\pageanchor{\box#1}}%
\fi
+ \else
+ \setbox#1\ruledhbox{\hpos\pageanchor{\box#1}}%
\fi
\fi\fi}
@@ -143,11 +147,6 @@
\def\MPanchoridentifier{mpa} % {mp-anchor}
\def\MPoverlayposprefix{MO::}
-% obsolete and wrong anyway
-%
-% \long\unexpanded\def\defineMPpositiongraphic#1%
-% {\long\setvalue{\MPoverlayposprefix#1}}
-
%D The rest of the definitions concerning such overlays may
%D look complicated,
@@ -213,16 +212,6 @@
\fi
\fi}
-% \def\cleanuppositionaction#1% not in trialtypesetting
-% {\ifcsname\POSactionprefix#1++\endcsname
-% \the\everycleanpositionaction
-% \iflocalpositioning
-% \global\expandafter\let\csname\POSactionprefix#1++\endcsname\empty
-% \else
-% \global\expandafter\let\csname\POSactionprefix#1++\expandafter\endcsname\csname\POSactionprefix#1++\endcsname
-% \fi
-% \fi}
-
\def\handlepositionaction#1\with#2\on#3%
{\bgroup
\ifx\currentpositionoverlay\empty
@@ -627,6 +616,7 @@
\appendtoks
% a position can be mid paragraph in which case we're behind
+ % this will change when we move positions to lua
\initializeparbackgrounds
\to \everystarttext
@@ -842,42 +832,6 @@
\def\calculatenexttextpardimensions
{\docalculatetextpardimensions\nextbtbanchor\nextetbanchor\relax}
-% \def\docalculatetextpardimensions#1#2#3% #1=\btbanchor #2=\etbanchor
-% {\scratchcounter\numexpr\MPp#2-\MPp#1\relax
-% \edef\textparpages{\the\scratchcounter}%
-% \ifcase\scratchcounter
-% % one page
-% \scratchdimen\dimexpr\MPy#1-\MPy#2\relax
-% \else
-% % two or more pages
-% \ifnum\scratchcounter>2
-% \ifnum\scratchcounter<5
-% % more pages
-% \scratchdimen\textheight
-% \advance\scratchcounter \minusone
-% \multiply\scratchdimen \scratchcounter
-% \else
-% % keep'm small
-% \scratchdimen5\textheight
-% \fi
-% \else
-% \scratchdimen\dimexpr\MPy#1-\MPy#2-\MPy\textanchor+\MPy\textanchor+\MPh\textanchor\relax
-% \fi
-% \fi
-% \edef\textparheight{\the\scratchdimen}%
-% \ifcase\scratchcounter
-% % one page
-% \scratchdimen\dimexpr\MPx#2-\MPx#1\relax
-% \else
-% % two or more pages / maybe also hang
-% \ifx#3\relax
-% \scratchdimen\makeupwidth % \textwidth
-% \else
-% \scratchdimen\dimexpr\MPw\MPparanchor-\MPl\MPparanchor-\MPr\MPparanchor\relax
-% \fi
-% \fi
-% \edef\textparwidth{\the\scratchdimen}}
-
\def\docalculatetextpardimensions#1#2#3% #1=\btbanchor #2=\etbanchor (adapted 8/6/2009)
{\scratchcounter\numexpr\MPp#2-\MPp#1\relax
\edef\textparpages
@@ -1017,8 +971,6 @@
\ifx\basegrid\undefined \else \letvalue\v!grid=\basegrid \fi
-% lelijk, aanpassen, opties
-
\setupMPvariables
[mpos:connect]
[linecolor=red,
@@ -1109,226 +1061,187 @@
\def\stackposleft {\dostackposbox{\copy\nextbox\hskip\nextboxwd\hskip\stackposdistance}}
\def\stackposright{\dostackposbox{\hskip\stackposdistance\hskip\nextboxwd\flushnextbox}}
-%D \macros
-%D {stackeddown}
-%D
-%D However, a better implementation is possible with the
-%D following macro. We now have an extra key \type {stack} for
-%D margin settings. When set to \type {yes}, this macro comes
-%D into action.
-
-% Because there can be many stacked items in a line and successive lines, we
-% play dirty and adapt the position and height of the current node so that
-% this becomes visible to a next pass.
+% obsolete
%
-% \startbuffer
-% \inleft {test 1} test 1 \inleft {test 2} test 2 \endgraf
-% \inleft {test 3} test 3
-% \stopbuffer
-% \getbuffer \typebuffer \flushstatus \page
+% %D \macros
+% %D {stackeddown}
+% %D
+% %D However, a better implementation is possible with the
+% %D following macro. We now have an extra key \type {stack} for
+% %D margin settings. When set to \type {yes}, this macro comes
+% %D into action.
%
-% \startbuffer
-% \inleft {test 1} test 1 \inleft {test 2} test 2 \inleft {test 3} test 3 \endgraf
-% \inleft {test 4} test 4
-% \stopbuffer
-% \getbuffer \typebuffer \flushstatus \page
+% % Because there can be many stacked items in a line and successive lines, we
+% % play dirty and adapt the position and height of the current node so that
+% % this becomes visible to a next pass.
+% %
+% % \startbuffer
+% % \inleft {test 1} test 1 \inleft {test 2} test 2 \endgraf
+% % \inleft {test 3} test 3
+% % \stopbuffer
+% % \getbuffer \typebuffer \flushstatus \page
+% %
+% % \startbuffer
+% % \inleft {test 1} test 1 \inleft {test 2} test 2 \inleft {test 3} test 3 \endgraf
+% % \inleft {test 4} test 4
+% % \stopbuffer
+% % \getbuffer \typebuffer \flushstatus \page
+% %
+% % \startbuffer
+% % \inleft {test 1} test 1 \endgraf
+% % \inleft {test 2} test 2 \endgraf
+% % \inleft {test 3} test 3
+% % \stopbuffer
+% % \getbuffer \typebuffer \flushstatus \page
+% %
+% % \startbuffer
+% % \inleft {test 1\\test 1} test 1 \inleft {test 2} test 2 \endgraf
+% % \inleft {test 3} test 3
+% % \stopbuffer
+% % \getbuffer \typebuffer \flushstatus \page
+% %
+% % \startbuffer
+% % \inleft {test 1\\test 1\\test 1\\test 1\\test 1} test 1 \endgraf
+% % test 2 \endgraf
+% % \inleft {test 3} test 3
+% % \stopbuffer
+% % \getbuffer \typebuffer \flushstatus \page
+% %
+% % \startbuffer
+% % \inleft{test 1} test \inleft{test 2} test \inleft{test 3\\test 3} test
+% % \stopbuffer
+% % \getbuffer \typebuffer \flushstatus \page
+% %
+% % \startbuffer
+% % \inleft{test 1\\test 1\\test 1} test \inleft{test 2\\test 2} test \inleft{test 3\\test 3\\test 3} test \endgraf
+% % \inleft{test 1\\test 1\\test 1} test \inleft{test 2\\test 2} test \inleft{test 3\\test 3\\test 3} test
+% % \stopbuffer
+% % \getbuffer \typebuffer \flushstatus \page
%
-% \startbuffer
-% \inleft {test 1} test 1 \endgraf
-% \inleft {test 2} test 2 \endgraf
-% \inleft {test 3} test 3
-% \stopbuffer
-% \getbuffer \typebuffer \flushstatus \page
+% \newdimen\laststackvmove % use \scratchdimenone instead of skip
%
-% \startbuffer
-% \inleft {test 1\\test 1} test 1 \inleft {test 2} test 2 \endgraf
-% \inleft {test 3} test 3
-% \stopbuffer
-% \getbuffer \typebuffer \flushstatus \page
+% \def\stackeddown
+% {\bgroup
+% % this macro assumes a few things and is meant to work for margin notes
+% \dowithnextbox
+% {\global\advance\currentautopos\plusone
+% \global\laststackvmove\zeropoint
+% \hpos{\POSstackprefix\number\currentautopos}
+% {\edef\next
+% {\nextboxht\the\nextboxht
+% \nextboxdp\the\nextboxdp
+% \nextboxwd\the\nextboxwd}%
+% \previousautopos\currentautopos
+% \scratchdimen\zeropoint
+% \scratchcounter\zerocount
+% \doloop
+% {\advance\previousautopos\minusone
+% \edef\currentposition {\POSstackprefix\number\currentautopos}%
+% \edef\previousposition{\POSstackprefix\number\previousautopos}%
+% \ifnum\MPp\currentposition=\MPp\previousposition\relax
+% %\registerstatus{doing \number\currentautopos/\number\previousautopos}%
+% \doifoverlappingelse\currentposition\previousposition
+% {\scratchskip\dimexpr
+% \MPy\currentposition
+% -\MPy\previousposition
+% -\MPd\currentposition % untested
+% +\MPd\previousposition % untested
+% +\MPh\currentposition
+% \relax\relax % second relax realy needed, forgotten while dimexpressing
+% % todo: also take depth into account
+% \ifdim\scratchskip<\scratchdimen
+% %\registerstatus{no \the\scratchskip}%
+% \else
+% %\registerstatus{yes \the\scratchskip}%
+% \scratchdimen\scratchskip
+% \fi}%
+% \donothing % {\registerstatus{next}}%
+% \ifnum\previousautopos<\zerocount\exitloop\fi
+% \else
+% \exitloop
+% \fi}%
+% \ifdim\scratchdimen=\zeropoint \else
+% \bgroup
+% \edef\currentposition{\POSstackprefix\number\currentautopos}%
+% \scratchskip\scratchdimen
+% \advance\scratchskip\MPh\currentposition
+% \scratchdimen-\scratchdimen
+% \advance\scratchdimen\MPy\currentposition
+% %\registerstatus{old \number\currentautopos: \MPy\currentposition/\MPh\currentposition}%
+% \expanded{\replacepospxywhd
+% {\currentposition}{\MPp\currentposition}{\MPx\currentposition}{\the\scratchdimen}%
+% {\MPw\currentposition}{\the\scratchskip}{\MPd\currentposition}}%
+% %\registerstatus{new \number\currentautopos: \MPy\currentposition/\MPh\currentposition}%
+% \egroup
+% \global\laststackvmove\scratchdimen % new
+% \setbox\nextbox\iftracepositions\@EA\ruledhbox\else\@EA\hbox\fi
+% {\lower\scratchdimen\flushnextbox}%
+% \next
+% %\registerstatus{\strut}%
+% \fi
+% \flushnextbox}%
+% \egroup}}
%
-% \startbuffer
-% \inleft {test 1\\test 1\\test 1\\test 1\\test 1} test 1 \endgraf
-% test 2 \endgraf
-% \inleft {test 3} test 3
-% \stopbuffer
-% \getbuffer \typebuffer \flushstatus \page
+% %D The next hack make sure that margin texts near faulty
+% %D strutted lines are handled ok.
%
-% \startbuffer
-% \inleft{test 1} test \inleft{test 2} test \inleft{test 3\\test 3} test
-% \stopbuffer
-% \getbuffer \typebuffer \flushstatus \page
+% \newif\ifrepositionmarginbox \repositionmarginboxtrue
%
-% \startbuffer
-% \inleft{test 1\\test 1\\test 1} test \inleft{test 2\\test 2} test \inleft{test 3\\test 3\\test 3} test \endgraf
-% \inleft{test 1\\test 1\\test 1} test \inleft{test 2\\test 2} test \inleft{test 3\\test 3\\test 3} test
-% \stopbuffer
-% \getbuffer \typebuffer \flushstatus \page
-
-\newdimen\laststackvmove % use \scratchdimenone instead of skip
-
-\def\stackeddown
- {\bgroup
- % this macro assumes a few things and is meant to work for margin notes
- \dowithnextbox
- {\global\advance\currentautopos\plusone
- \global\laststackvmove\zeropoint
- \hpos{\POSstackprefix\number\currentautopos}
- {\edef\next
- {\nextboxht\the\nextboxht
- \nextboxdp\the\nextboxdp
- \nextboxwd\the\nextboxwd}%
- \previousautopos\currentautopos
- \scratchdimen\zeropoint
- \scratchcounter\zerocount
- \doloop
- {\advance\previousautopos\minusone
- \edef\currentposition {\POSstackprefix\number\currentautopos}%
- \edef\previousposition{\POSstackprefix\number\previousautopos}%
- \ifnum\MPp\currentposition=\MPp\previousposition\relax
- %\registerstatus{doing \number\currentautopos/\number\previousautopos}%
- \doifoverlappingelse\currentposition\previousposition
- {\scratchskip\dimexpr
- \MPy\currentposition
- -\MPy\previousposition
- -\MPd\currentposition % untested
- +\MPd\previousposition % untested
- +\MPh\currentposition
- \relax\relax % second relax realy needed, forgotten while dimexpressing
- % todo: also take depth into account
- \ifdim\scratchskip<\scratchdimen
- %\registerstatus{no \the\scratchskip}%
- \else
- %\registerstatus{yes \the\scratchskip}%
- \scratchdimen\scratchskip
- \fi}%
- \donothing % {\registerstatus{next}}%
- \ifnum\previousautopos<\zerocount\exitloop\fi
- \else
- \exitloop
- \fi}%
- \ifdim\scratchdimen=\zeropoint \else
- \bgroup
- \edef\currentposition{\POSstackprefix\number\currentautopos}%
- \scratchskip\scratchdimen
- \advance\scratchskip\MPh\currentposition
- \scratchdimen-\scratchdimen
- \advance\scratchdimen\MPy\currentposition
- %\registerstatus{old \number\currentautopos: \MPy\currentposition/\MPh\currentposition}%
- \expanded{\replacepospxywhd
- {\currentposition}{\MPp\currentposition}{\MPx\currentposition}{\the\scratchdimen}%
- {\MPw\currentposition}{\the\scratchskip}{\MPd\currentposition}}%
- %\registerstatus{new \number\currentautopos: \MPy\currentposition/\MPh\currentposition}%
- \egroup
- \global\laststackvmove\scratchdimen % new
- \setbox\nextbox\iftracepositions\@EA\ruledhbox\else\@EA\hbox\fi
- {\lower\scratchdimen\flushnextbox}%
- \next
- %\registerstatus{\strut}%
- \fi
- \flushnextbox}%
- \egroup}}
-
-%D The next hack make sure that margin texts near faulty
-%D strutted lines are handled ok.
-
-\newif\ifrepositionmarginbox \repositionmarginboxtrue
-
-\newcount\currentmarginpos
-
-\def\dopositionmarginbox#1%
- {\bgroup
- \ifrepositionmarginbox
- \global\advance\currentmarginpos\plusone
- %\setposition{\s!margin:\number\currentmarginpos}% not always
- \ifcase\marginrepositionmethod
- % nothing
- \or
- % nothing
- \or
- % stack / page check yet untested
- \setposition{\s!margin:\number\currentmarginpos}%
- \scratchdimen\MPy{\s!margin:\number\currentmarginpos}%
- \global\advance\currentmarginpos\plusone
- \advance\scratchdimen -\MPy{\s!margin:\number\currentmarginpos}%
- \advance\scratchdimen -\strutdp
- % new but bugged
- % \setbox#1\hbox
- % {\hskip-\MPx{\s!margin:\number\currentmarginpos}%
- % \hskip\MPx{head:\the\realpageno}%
- % \box#1}%
- % so far
- \setbox#1\hbox
- {\setposition{\s!margin:\number\currentmarginpos}%
- \raise\scratchdimen\box#1}%
- \or
- % move up
- \setposition{\s!margin:\number\currentmarginpos}%
- \ifnum\MPp{p:\number\parposcounter}=\MPp{\s!margin:\number\currentmarginpos}\relax
- \scratchdimen\dimexpr\MPy{p:\number\parposcounter}-\MPy{\s!margin:\number\currentmarginpos}\relax
- \expanded{\setbox#1\hbox{\raise\scratchdimen\box#1}\ht#1\the\ht#1\dp#1\the\dp#1}%
- \fi
- \or
- % move up, assume end of par
- \setposition{\s!margin:\number\currentmarginpos}%
- \ifnum\MPp{p:\number\parposcounter}=\MPp{\s!margin:\number\currentmarginpos}\relax
- \getnoflines\margincontentheight
- \advance\noflines\minusone
- \scratchdimen\noflines\lineheight
- \else
- \scratchdimen\dimexpr\MPy{p:\number\parposcounter}-\MPy{\s!margin:\number\currentmarginpos}\relax
- \fi
- \expanded{\setbox#1\hbox{\raise\scratchdimen\box#1}\ht#1\the\ht#1\dp#1\the\dp#1}%
- \fi
- \dp#1\zeropoint
- \ht#1\zeropoint
- \fi
- \graphicvadjust{\dontleavehmode\box#1}% dontleavehmode is needed to get direction right
- \egroup}
-
-\chardef\marginrepositionmethod\plusone % sidemethod
-\chardef\margincontentmethod \plusthree % textmethod % beware: 1 = old method
-\chardef\marginpagecheckmethod \plusone % splitmethod
-
-%D For a right menu, a sequence of calls to \type
-%D {right_menu_button} is generated.
-%D
-%D \starttyping
-%D right_menu_button (n, p, s=0/1/2, x, y, w, h, d) ;
-%D \stoptyping
-%D
-%D Here, n is the number of the button, s a status variable,
-%D while the rest is positional info. The status variable is
-%D 0, 1 or~2: not found, found and found but current page.
-
-% 0=not found 1=found 2=current page
-
-% geen leeg
-
-\newtoks\MPmenutoks
-
-\def\MPmenubuttons#1{\the\MPmenutoks}
-
-\appendtoks \global\MPmenutoks\emptytoks \to \everyshipout
-
-% 0=notfound 1=found 2=currentpage
-
-\def\domenuitemposition#1#2#3%
- {\doifelsevalue{\??am#1\c!position}\v!yes
- {\doglobal\increment\currentamposition
- \doifreferencefoundelse{#2}% 0=not found, 1=same page, >1=elsewhere
- {\chardef\currentamrealpage\ifnum\currentreferencerealpage=\realpageno\plusone\else\plustwo\fi}%
- {\chardef\currentamrealpage\plustwo}%
- \expanded
- {\doglobal\noexpand\appendtoks
- #1_menu_button(\number\currentamposition,\the\currentamrealpage,\MPpos{#1:\currentamposition}) ;
- \to \MPmenutoks}%
- \hpos{#1:\currentamposition}{#3}}
- {#3}}
-
-\def\dowholemenuposition#1%
- {\ifnum\currentamposition>0
- \dowithnextbox{\hpos{menu:#1:\the\realpageno}{\flushnextbox}}\hbox
- \fi}
+% \newcount\currentmarginpos
+%
+% \def\dopositionmarginbox#1%
+% {\bgroup
+% \ifrepositionmarginbox
+% \global\advance\currentmarginpos\plusone
+% %\setposition{\s!margin:\number\currentmarginpos}% not always
+% \ifcase\marginrepositionmethod
+% % nothing
+% \or
+% % nothing
+% \or
+% % stack / page check yet untested
+% \setposition{\s!margin:\number\currentmarginpos}%
+% \scratchdimen\MPy{\s!margin:\number\currentmarginpos}%
+% \global\advance\currentmarginpos\plusone
+% \advance\scratchdimen -\MPy{\s!margin:\number\currentmarginpos}%
+% \advance\scratchdimen -\strutdp
+% % new but bugged
+% % \setbox#1\hbox
+% % {\hskip-\MPx{\s!margin:\number\currentmarginpos}%
+% % \hskip\MPx{head:\the\realpageno}%
+% % \box#1}%
+% % so far
+% \setbox#1\hbox
+% {\setposition{\s!margin:\number\currentmarginpos}%
+% \raise\scratchdimen\box#1}%
+% \or
+% % move up
+% \setposition{\s!margin:\number\currentmarginpos}%
+% \ifnum\MPp{p:\number\parposcounter}=\MPp{\s!margin:\number\currentmarginpos}\relax
+% \scratchdimen\dimexpr\MPy{p:\number\parposcounter}-\MPy{\s!margin:\number\currentmarginpos}\relax
+% \expanded{\setbox#1\hbox{\raise\scratchdimen\box#1}\ht#1\the\ht#1\dp#1\the\dp#1}%
+% \fi
+% \or
+% % move up, assume end of par
+% \setposition{\s!margin:\number\currentmarginpos}%
+% \ifnum\MPp{p:\number\parposcounter}=\MPp{\s!margin:\number\currentmarginpos}\relax
+% \getnoflines\margincontentheight
+% \advance\noflines\minusone
+% \scratchdimen\noflines\lineheight
+% \else
+% \scratchdimen\dimexpr\MPy{p:\number\parposcounter}-\MPy{\s!margin:\number\currentmarginpos}\relax
+% \fi
+% \expanded{\setbox#1\hbox{\raise\scratchdimen\box#1}\ht#1\the\ht#1\dp#1\the\dp#1}%
+% \fi
+% \dp#1\zeropoint
+% \ht#1\zeropoint
+% \fi
+% \graphicvadjust{\dontleavehmode\box#1}% dontleavehmode is needed to get direction right
+% \egroup}
+%
+% % \setnewconstant\marginrepositionmethod\plusone % sidemethod
+% % \setnewconstant\margincontentmethod \plusthree % textmethod % beware: 1 = old method
+% % \setnewconstant\marginpagecheckmethod \plusone % splitmethod
%D \macros
%D {GFC, GTC, GSC}
@@ -1348,11 +1261,6 @@
\def\tbPOSprefix
{tbp:\number\noftabpositions:}
-% \def\tableposindeed
-% {\scratchtoks\posXCtoks
-% \global\posXCtoks\emptytoks
-% \the\scratchtoks}
-
\def\tablepos
{\normalexpanded{\global\posXCtoks\emptytoks\the\posXCtoks}}
@@ -1453,14 +1361,6 @@
\hskip-\wd\scratchbox
\box\scratchbox}
-\def\tabulatenormalcolumn#1% overloaded later in node-bck
- {&\iftabulateequal\tabulateequalpos\else\tabulatenormalpos\fi
- &\global\chardef\tabulatetype#1&}
-
-\def\tabulateequalcolumn#1% overloaded
- {&\tabulateequalpos
- &\global\chardef\tabulatetype#1&}
-
\appendtoks
\global\advance\noftabpositions\plusone
\global\setfalse\tablehaspositions
@@ -1481,17 +1381,8 @@
\gdef\doflushtabulateepos{\epos{#1}}%
\fi}
-\def\splitofftabulatebox % overloaded in node-bck
- {\dontcomplain
- \global\setbox\tabulatebox % % % global ? % % %
- \vsplit\tablebox\tabulatecolumn to \lineheight
- \setbox\tabulatebox\normalvbox
- {\unvbox\tabulatebox}%
- \setbox\tabulatebox\hbox to \wd\tabulatebox
- {\hss\dotabulatehook{\box\tabulatebox}\hss}%
- \ht\tabulatebox\strutht
- \dp\tabulatebox\strutdp
- \box\tabulatebox
+\def\flushtabulatesplitbox
+ {\box\tabulatebox
\iftrialtypesetting\else\ifconditional\tablehaspositions\doflushtabulateepos\fi\fi}
\appendtoks
diff --git a/Master/texmf-dist/tex/context/base/anch-pos.lua b/Master/texmf-dist/tex/context/base/anch-pos.lua
index 8066af4ceba..789e1aefe71 100644
--- a/Master/texmf-dist/tex/context/base/anch-pos.lua
+++ b/Master/texmf-dist/tex/context/base/anch-pos.lua
@@ -12,155 +12,375 @@ can we store much more information in <l n='lua'/> but it's also
more efficient.</p>
--ldx]]--
-local concat, format = table.concat, string.format
-local texprint, ctxcatcodes = tex.print, tex.ctxcatcodes
+-- to be considered: store as numbers instead of string
+-- maybe replace texsp by our own converter (stay at the lua end)
+
+local tostring = tostring
+local concat, format, gmatch = table.concat, string.format, string.gmatch
local lpegmatch = lpeg.match
+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
-jobpositions = jobpositions or { }
-jobpositions.collected = jobpositions.collected or { }
-jobpositions.tobesaved = jobpositions.tobesaved or { }
+local collected = allocate()
+local tobesaved = allocate()
--- these are global since they are used often at the tex end
+local jobpositions = {
+ collected = collected,
+ tobesaved = tobesaved,
+}
--- \the\dimexpr #2\ifnum\positionanchormode=\plusone-\MPx\pageanchor\fi\relax
--- \the\dimexpr #3\ifnum\positionanchormode=\plusone-\MPy\pageanchor\fi\relax
+job.positions = jobpositions
-ptbs, pcol = jobpositions.tobesaved, jobpositions.collected -- global
+_ptbs_, _pcol_ = tobesaved, collected -- global
-local dx, dy = "0pt", "0pt"
+local dx, dy, nx, ny = "0pt", "0pt", 0, 0
local function initializer()
- ptbs, pcol = jobpositions.tobesaved, jobpositions.collected
- local p = pcol["page:0"] -- page:1
- if p then
--- to be checked !
---~ dx, dy = p[2] or "0pt", p[3] or "0pt"
- end
+ tobesaved = jobpositions.tobesaved
+ collected = jobpositions.collected
+ _ptbs_ = tobesaved -- global
+ _pcol_ = collected -- global
+ -- local p = collected["page:0"] -- page:1
+ -- if p then
+ -- dx, nx = p[2] or "0pt", 0
+ -- dy, ny = p[3] or "0pt", 0
+ -- end
end
-job.register('jobpositions.collected', jobpositions.tobesaved, initializer)
+job.register('job.positions.collected', tobesaved, initializer)
function jobpositions.copy(target,source)
- jobpositions.collected[target] = jobpositions.collected[source] or ptbs[source]
+ collected[target] = collected[source] or tobesaved[source]
end
function jobpositions.replace(name,...)
- jobpositions.collected[name] = {...}
+ collected[name] = {...}
+end
+
+function jobpositions.page(id)
+ local jpi = collected[id] or tobesaved[id]
+ if jpi then
+ return texsp(jpi[1])
+ else
+ return 0
+ end
+end
+
+function jobpositions.x(id)
+ local jpi = collected[id] or tobesaved[id]
+ if jpi then
+ return texsp(jpi[2]) - nx
+ else
+ return 0
+ end
end
-function jobpositions.doifelse(name)
- commands.testcase(jobpositions.collected[name] or ptbs[name])
+function jobpositions.y(id)
+ local jpi = collected[id] or tobesaved[id]
+ if jpi then
+ return texsp(jpi[3]) - ny
+ else
+ return 0
+ end
end
-function jobpositions.MPp(id) local jpi = pcol[id] or ptbs[id] texprint(ctxcatcodes,(jpi and jpi[1]) or '0' ) end
-function jobpositions.MPx(id) local jpi = pcol[id] or ptbs[id] texprint(ctxcatcodes,(jpi and jpi[2]) or '0pt') end
-function jobpositions.MPy(id) local jpi = pcol[id] or ptbs[id] texprint(ctxcatcodes,(jpi and jpi[3]) or '0pt') end
-function jobpositions.MPw(id) local jpi = pcol[id] or ptbs[id] texprint(ctxcatcodes,(jpi and jpi[4]) or '0pt') end
-function jobpositions.MPh(id) local jpi = pcol[id] or ptbs[id] texprint(ctxcatcodes,(jpi and jpi[5]) or '0pt') end
-function jobpositions.MPd(id) local jpi = pcol[id] or ptbs[id] texprint(ctxcatcodes,(jpi and jpi[6]) or '0pt') end
+function jobpositions.width(id)
+ local jpi = collected[id] or tobesaved[id]
+ if jpi then
+ return texsp(jpi[4])
+ else
+ return 0
+ end
+end
+function jobpositions.height(id)
+ local jpi = collected[id] or tobesaved[id]
+ if jpi then
+ return texsp(jpi[5])
+ else
+ return 0
+ end
+end
-function jobpositions.MPx(id)
- local jpi = pcol[id] or ptbs[id]
+function jobpositions.depth(id)
+ local jpi = collected[id] or tobesaved[id]
+ if jpi then
+ return texsp(jpi[6])
+ else
+ return 0
+ end
+end
+
+function jobpositions.xy(id)
+ local jpi = collected[id] or tobesaved[id]
+ if jpi then
+ return texsp(jpi[2]) - nx, texsp(jpi[3]) - ny
+ else
+ return 0, 0
+ end
+end
+
+function jobpositions.lowerleft(id)
+ local jpi = collected[id] or tobesaved[id]
+ if jpi then
+ return texsp(jpi[2]) - nx, texsp(jpi[3]) - texsp(jpi[6]) - ny
+ else
+ return 0, 0
+ end
+end
+
+function jobpositions.lowerright(id)
+ local jpi = collected[id] or tobesaved[id]
+ if jpi then
+ return texsp(jpi[2]) + texsp(jpi[4]) - nx, texsp(jpi[3]) - texsp(jpi[6]) - ny
+ else
+ return 0, 0
+ end
+end
+
+function jobpositions.upperright(id)
+ local jpi = collected[id] or tobesaved[id]
+ if jpi then
+ return texsp(jpi[2]) + texsp(jpi[4]) - nx, texsp(jpi[3]) + texsp(jpi[5]) - ny
+ else
+ return 0, 0
+ end
+end
+
+function jobpositions.upperleft(id)
+ local jpi = collected[id] or tobesaved[id]
+ if jpi then
+ return texsp(jpi[2]) - nx, texsp(jpi[3]) + texsp(jpi[5]) - ny
+ else
+ return 0, 0
+ end
+end
+
+function jobpositions.position(id)
+ local jpi = collected[id] or tobesaved[id]
+ if jpi then
+ return texsp(jpi[1]), texsp(jpi[2]), texsp(jpi[3]), texsp(jpi[4]), texsp(jpi[5]), texsp(jpi[6])
+ else
+ return 0, 0, 0, 0, 0, 0
+ end
+end
+
+function jobpositions.extra(id,n,default) -- assume numbers
+ local jpi = collected[id] or tobesaved[id]
+ if not jpi then
+ return default
+ else
+ local split = jpi[0]
+ if not split then
+ split = lpegmatch(splitter,jpi[7])
+ jpi[0] = split
+ end
+ return texsp(split[n]) or default
+ end
+end
+
+local function overlapping(one,two,overlappingmargin)
+ one = collected[one] or tobesaved[one]
+ two = collected[two] or tobesaved[two]
+ if one and two and one[1] == two[1] then
+ if not overlappingmargin then
+ overlappingmargin = 2
+ end
+ local x_one = one[2]
+ local x_two = two[2]
+ local w_two = two[4]
+ local llx_one = x_one - overlappingmargin
+ local urx_two = x_two + w_two + overlappingmargin
+ if llx_one > urx_two then
+ return false
+ end
+ local w_one = one[4]
+ local urx_one = x_one + w_one + overlappingmargin
+ local llx_two = x_two - overlappingmargin
+ if urx_one < llx_two then
+ return false
+ end
+ local y_one = one[3]
+ local y_two = two[3]
+ local d_one = one[6]
+ local h_two = two[5]
+ local lly_one = y_one - d_one - overlappingmargin
+ local ury_two = y_two + h_two + overlappingmargin
+ if lly_one > ury_two then
+ return false
+ end
+ local h_one = one[5]
+ local d_two = two[6]
+ local ury_one = y_one + h_one + overlappingmargin
+ local lly_two = y_two - d_two - overlappingmargin
+ if ury_one < lly_two then
+ return false
+ end
+ return true
+ end
+end
+
+local function onsamepage(list,page)
+ for id in gmatch(list,"(, )") do
+ local jpi = collected[id] or tobesaved[id]
+ if jpi then
+ local p = jpi[1]
+ if not page then
+ page = p
+ elseif page ~= p then
+ return false
+ end
+ end
+ end
+ return page
+end
+
+jobpositions.overlapping = overlapping
+jobpositions.onsamepage = onsamepage
+
+-- interface
+
+commands.replacepospxywhd = jobpositions.replace
+commands.copyposition = jobpositions.copy
+
+function commands.MPp(id)
+ local jpi = collected[id] or tobesaved[id]
+ context(jpi and jpi[1] or '0')
+end
+
+function commands.MPx(id)
+ local jpi = collected[id] or tobesaved[id]
local x = jpi and jpi[2]
if x then
- texprint(ctxcatcodes,format('\\the\\dimexpr%s-%s\\relax',x,dx)) -- no space after dimexpr !
+ if nx == 0 then
+ context(x)
+ else
+ context('\\the\\dimexpr%s-%s\\relax',x,dx)
+ end
else
- texprint(ctxcatcodes,'0pt')
+ context('0pt')
end
end
-function jobpositions.MPy(id)
- local jpi = pcol[id] or ptbs[id]
+function commands.MPy(id)
+ local jpi = collected[id] or tobesaved[id]
local y = jpi and jpi[3]
if y then
- texprint(ctxcatcodes,format('\\the\\dimexpr%s-%s\\relax',y,dy)) -- no space after dimexpr !
+ if ny == 0 then
+ context(y)
+ else
+ context('\\the\\dimexpr%s-%s\\relax',y,dy)
+ end
else
- texprint(ctxcatcodes,'0pt')
+ context('0pt')
end
end
--- the following are only for MP so there we can leave out the pt
+function commands.MPw(id)
+ local jpi = collected[id] or tobesaved[id]
+ context(jpi and jpi[4] or '0pt')
+end
--- can be writes and no format needed any more
+function commands.MPh(id)
+ local jpi = collected[id] or tobesaved[id]
+ context(jpi and jpi[5] or '0pt')
+end
+
+function commands.MPd(id)
+ local jpi = collected[id] or tobesaved[id]
+ context(jpi and jpi[6] or '0pt')
+end
-function jobpositions.MPxy(id)
- local jpi = pcol[id] or ptbs[id]
+function commands.MPxy(id)
+ local jpi = collected[id] or tobesaved[id]
if jpi then
- texprint(ctxcatcodes,format('(%s-%s,%s-%s)',jpi[2],dx,jpi[3],dy))
---~ texprint(ctxcatcodes,'(',jpi[2],'-',dx,',',jpi[3],'-',dy,')')
+ context('(%s-%s,%s-%s)',jpi[2],dx,jpi[3],dy)
else
- texprint(ctxcatcodes,'(0,0)')
+ context('(0,0)')
end
end
-function jobpositions.MPll(id)
- local jpi = pcol[id] or ptbs[id]
+function commands.MPll(id)
+ local jpi = collected[id] or tobesaved[id]
if jpi then
- texprint(ctxcatcodes,format('(%s-%s,%s-%s-%s)',jpi[2],dx,jpi[3],jpi[6],dy))
---~ texprint(ctxcatcodes,'(',jpi[2],'-',dx,',',jpi[3],'-',jpi[6],'-',dy,')')
+ context('(%s-%s,%s-%s-%s)',jpi[2],dx,jpi[3],jpi[6],dy)
else
- texprint(ctxcatcodes,'(0,0)')
+ context('(0,0)')
end
end
-function jobpositions.MPlr(id)
- local jpi = pcol[id] or ptbs[id]
+function commands.MPlr(id)
+ local jpi = collected[id] or tobesaved[id]
if jpi then
- texprint(ctxcatcodes,format('(%s+%s-%s,%s-%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[6],dy))
---~ texprint(ctxcatcodes,'(',jpi[2],'+',jpi[4],'-',dx,',',jpi[3],'-',jpi[6],'-',dy,')')
+ context('(%s+%s-%s,%s-%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[6],dy)
else
- texprint(ctxcatcodes,'(0,0)')
+ context('(0,0)')
end
end
-function jobpositions.MPur(id)
- local jpi = pcol[id] or ptbs[id]
+function commands.MPur(id)
+ local jpi = collected[id] or tobesaved[id]
if jpi then
- texprint(ctxcatcodes,format('(%s+%s-%s,%s+%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[5],dy))
---~ texprint(ctxcatcodes,'(',jpi[2],'+',jpi[4],'-',dx,',',jpi[3],'+',jpi[5],'-',dy,')')
+ context('(%s+%s-%s,%s+%s-%s)',jpi[2],jpi[4],dx,jpi[3],jpi[5],dy)
else
- texprint(ctxcatcodes,'(0,0)')
+ context('(0,0)')
end
end
-function jobpositions.MPul(id)
- local jpi = pcol[id] or ptbs[id]
+function commands.MPul(id)
+ local jpi = collected[id] or tobesaved[id]
if jpi then
- texprint(ctxcatcodes,format('(%s-%s,%s+%s-%s)',jpi[2],dx,jpi[3],jpi[5],dy))
---~ texprint(ctxcatcodes,'(',jpi[2],'-',dx,',',jpi[3],'+',jpi[5],'-',dy,')')
+ context('(%s-%s,%s+%s-%s)',jpi[2],dx,jpi[3],jpi[5],dy)
else
- texprint(ctxcatcodes,'(0,0)')
+ context('(0,0)')
end
end
-function jobpositions.MPpos(id)
- local jpi = pcol[id] or ptbs[id]
+function commands.MPpos(id)
+ local jpi = collected[id] or tobesaved[id]
if jpi then
- texprint(ctxcatcodes,concat(jpi,',',1,6))
+ context(concat(jpi,',',1,6))
else
- texprint(ctxcatcodes,'0,0,0,0,0,0')
+ context('0,0,0,0,0,0')
end
end
local splitter = lpeg.Ct(lpeg.splitat(","))
-function jobpositions.MPplus(id,n,default)
- local jpi = pcol[id] or ptbs[id]
+function commands.MPplus(id,n,default)
+ local jpi = collected[id] or tobesaved[id]
if not jpi then
- texprint(ctxcatcodes,default)
+ context(default)
else
local split = jpi[0]
if not split then
split = lpegmatch(splitter,jpi[7])
jpi[0] = split
end
- texprint(ctxcatcodes,split[n] or default)
+ context(split[n] or default)
end
end
-function jobpositions.MPrest(id,default)
- local jpi = pcol[id] or ptbs[id]
- -- texprint(ctxcatcodes,(jpi and jpi[7] and concat(jpi,",",7,#jpi)) or default)
- texprint(ctxcatcodes,(jpi and jpi[7]) or default)
+function commands.MPrest(id,default)
+ local jpi = collected[id] or tobesaved[id]
+ context(jpi and jpi[7] or default)
+end
+
+-- is testcase already defined? if so, then local
+
+function commands.doifpositionelse(name)
+ commands.testcase(collected[name] or tobesaved[name])
+end
+
+function commands.doifoverlappingelse(one,two,overlappingmargin)
+ commands.testcase(overlapping(one,two,overlappingmargin))
+end
+
+function commands.doifpositionsonsamepageelse(list,page)
+ commands.testcase(onsamepage(list))
+end
+
+function commands.doifpositionsonthispageelse(list)
+ commands.testcase(onsamepage(list,tostring(tex.count.realpageno)))
end
diff --git a/Master/texmf-dist/tex/context/base/anch-pos.mkii b/Master/texmf-dist/tex/context/base/anch-pos.mkii
index 589c4aa26d5..c793f7ba4a8 100644
--- a/Master/texmf-dist/tex/context/base/anch-pos.mkii
+++ b/Master/texmf-dist/tex/context/base/anch-pos.mkii
@@ -637,7 +637,13 @@
\iftracepositions\registerparsymbol\fi}
\def\traceposstring#1#2#3%
- {\iftracepositions\smashedhbox{#1{\infofont#2#3}}\fi}
+ {\iftracepositions
+ \smashedhbox
+ {#1{\infofont#2#3}%
+ \scratchdimen.5\points
+ \kern-2\scratchdimen
+ \vrule\!!width4\scratchdimen\!!height\scratchdimen\!!depth\scratchdimen}%
+ \fi}
\def\registerparsymbol
{\iftracepositions
diff --git a/Master/texmf-dist/tex/context/base/anch-pos.mkiv b/Master/texmf-dist/tex/context/base/anch-pos.mkiv
index e454747daf2..dc231bcff82 100644
--- a/Master/texmf-dist/tex/context/base/anch-pos.mkiv
+++ b/Master/texmf-dist/tex/context/base/anch-pos.mkiv
@@ -15,7 +15,6 @@
% related code to meta-pos
% shorter tags, ..:achtergrond:.. etc in pos actions
-
% dubbele text- * pos's eruit
% class pos -> als gelijk aan vorige, dan niet niet definieren
@@ -35,7 +34,8 @@
% at some point (when we no longer share code) we will move to numbers
% do that we have less garbage collection and hashing
%
-% the global table ptbs is equivalent to jobpositions.tobesaved
+% the global table _ptbs_ is equivalent to job.positions.tobesaved
+% the global table _pcol_ is equivalent to job.positions.collected
%
% btw, using a function is more efficient than passing longer code
% snippets to ctxlua
@@ -106,32 +106,30 @@
%D method is implemented in a special driver. If needed, the
%D driver can fall back on the following macros.
-% are the next 6 still used?
-
-\def\dolazysaveposition #1#2#3#4{\normalexpanded{\ctxlatelua{ptbs['#1']={#2,"#3","#4"}}}}
-\def\dolazysavepositionwhd #1#2#3#4#5#6#7{\normalexpanded{\ctxlatelua{ptbs['#1']={#2,"#3","#4","#5","#6","#7"}}}}
-\def\dolazysavepositionplus#1#2#3#4#5#6#7#8{\normalexpanded{\ctxlatelua{ptbs['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
-\def\dosaveposition #1#2#3#4{\normalexpanded{\ctxlua {ptbs['#1']={#2,"#3","#4"}}}}
-\def\dosavepositionwhd #1#2#3#4#5#6#7{\normalexpanded{\ctxlua {ptbs['#1']={#2,"#3","#4","#5","#6","#7"}}}}
-\def\dosavepositionplus #1#2#3#4#5#6#7#8{\normalexpanded{\ctxlua {ptbs['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
+\def\dolazysaveposition #1#2#3#4{\normalexpanded{\ctxlatelua{_ptbs_['#1']={#2,"#3","#4"}}}}
+\def\dolazysavepositionwhd #1#2#3#4#5#6#7{\normalexpanded{\ctxlatelua{_ptbs_['#1']={#2,"#3","#4","#5","#6","#7"}}}}
+\def\dolazysavepositionplus#1#2#3#4#5#6#7#8{\normalexpanded{\ctxlatelua{_ptbs_['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
+\def\dosaveposition #1#2#3#4{\normalexpanded{\ctxlua {_ptbs_['#1']={#2,"#3","#4"}}}}
+\def\dosavepositionwhd #1#2#3#4#5#6#7{\normalexpanded{\ctxlua {_ptbs_['#1']={#2,"#3","#4","#5","#6","#7"}}}}
+\def\dosavepositionplus #1#2#3#4#5#6#7#8{\normalexpanded{\ctxlua {_ptbs_['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}}
\def\lastsavedpositionx {\the\dimexpr\pdflastxpos\scaledpoint\relax}
\def\lastsavedpositiony {\the\dimexpr\pdflastypos\scaledpoint\relax}
\let\savecurrentposition\pdfsavepos
-\def\dosetposition#1%
+\def\dosetposition#1% will become commands.setposition
{\savecurrentposition
- \normalexpanded{\ctxlatelua{ptbs['#1']={%
+ \normalexpanded{\ctxlatelua{_ptbs_['#1']={%
\noexpand\realfolio,"\noexpand\lastsavedpositionx","\noexpand\lastsavedpositiony"}}}}
\def\dosetpositionwhd#1#2#3#4%
{\savecurrentposition
- \normalexpanded{\ctxlatelua{ptbs['#1']={%
+ \normalexpanded{\ctxlatelua{_ptbs_['#1']={%
\noexpand\realfolio,"\noexpand\lastsavedpositionx","\noexpand\lastsavedpositiony","#2","#3","#4"}}}}
\def\dosetpositionplus#1#2#3#4#5%
{\savecurrentposition
- \normalexpanded{\ctxlatelua{ptbs['#1']={%
+ \normalexpanded{\ctxlatelua{_ptbs_['#1']={%
\noexpand\realfolio,"\noexpand\lastsavedpositionx","\noexpand\lastsavedpositiony","#2","#3","#4","#5"}}}}
\let\dosetpositionpapersize\gobbletwoarguments
@@ -149,18 +147,13 @@
%D page box and therefore flushed first. So, when present, it
%D is applied to all positions except itself.
-\chardef\positionanchormode=0 % don't relocate page origin
-\chardef\positionanchormode=1 % relocate page origin once
-
-%D The core set macros.
+% 0 = don't relocate page origin 1 = relocate page origin once
-\let\pospxy \gobblefourarguments
-\let\pospxywhd \gobblesevenarguments
-\let\pospxyplus\gobbleeightarguments
+\setnewconstant\positionanchormode\plusone
%D Sometimes we want to trick the position handler a bit:
-\def\replacepospxywhd#1#2#3#4#5#6#7{\ctxlua{jobpositions.replace('#1',\number#2,"\the\dimexpr#3\relax","\the\dimexpr#4\relax","\the\dimexpr#5\relax","\the\dimexpr#6\relax","\the\dimexpr#7\relax")}}
+\def\replacepospxywhd#1#2#3#4#5#6#7{\ctxcommand{replacepospxywhd('#1',\number#2,"\the\dimexpr#3\relax","\the\dimexpr#4\relax","\the\dimexpr#5\relax","\the\dimexpr#6\relax","\the\dimexpr#7\relax")}}
%D For postprocessing purposes, we save the number of
%D positions.
@@ -176,47 +169,39 @@
%D not applicable when the content floats indeed. In such
%D situations one can treat positions and graphics local.
-\newif\iflocalpositioning
+\newif\iflocalpositioning % todo: conditional
%D Watch out: sometimes a pagebreak occurs inside a float
%D placement, so there we need to disable local mode.
\appendtoks
- \localpositioningtrue
+ \localpositioningtrue
\to \everyinsidefloat
\appendtoks
- \localpositioningfalse
+ \localpositioningfalse
\to \everypagebody
-%D Since the positional values are to be fully expandable, we
-%D need to preload them as soon as possible, which is why we
-%D load the data when we start a text.
-
-% \appendtoks \checkpositions \to \everystarttext
-
%D \macros
%D {MPp, MPx, MPy, MPw, MPh, MPd,
%D MPxy, MPll, MPlr, MPur, MPul, MPpos}
%D
%D Access to the positional information is provided by macros
-%D with short names that are clearly meant for \METAPOST.
-
-% \the\dimexpr\noexpand\lastsavedpositionx\ifnum\positionanchormode=\plusone-\MPx\pageanchor\fi\relax
-% \the\dimexpr\noexpand\lastsavedpositiony\ifnum\positionanchormode=\plusone-\MPx\pageanchor\fi\relax
-
-\def\MPp #1{\ctxlua{jobpositions.MPp("#1")}}
-\def\MPx #1{\ctxlua{jobpositions.MPx("#1")}}
-\def\MPy #1{\ctxlua{jobpositions.MPy("#1")}}
-\def\MPw #1{\ctxlua{jobpositions.MPw("#1")}}
-\def\MPh #1{\ctxlua{jobpositions.MPh("#1")}}
-\def\MPd #1{\ctxlua{jobpositions.MPd("#1")}}
-\def\MPxy #1{\ctxlua{jobpositions.MPxy("#1")}}
-\def\MPll #1{\ctxlua{jobpositions.MPll("#1")}}
-\def\MPlr #1{\ctxlua{jobpositions.MPlr("#1")}}
-\def\MPur #1{\ctxlua{jobpositions.MPur("#1")}}
-\def\MPul #1{\ctxlua{jobpositions.MPul("#1")}}
-\def\MPpos#1{\ctxlua{jobpositions.MPpos("#1")}}
+%D with short names that are clearly meant for \METAPOST\ but
+%D nowadays also used for other purposes.
+
+\def\MPp #1{\ctxcommand{MPp("#1")}}
+\def\MPx #1{\ctxcommand{MPx("#1")}}
+\def\MPy #1{\ctxcommand{MPy("#1")}}
+\def\MPw #1{\ctxcommand{MPw("#1")}}
+\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")}}
%D \macros
%D {MPplus, MPrest, MPv, MPvv}
@@ -238,8 +223,8 @@
%D
%D The extra parameters are not treated.
-\def\MPplus#1#2#3{\ctxlua{jobpositions.MPplus("#1",#2,"#3")}} \let\MPv \MPplus
-\def\MPrest #1#2{\ctxlua{jobpositions.MPrest("#1","#2")}} \let\MPvv\MPrest
+\def\MPplus#1#2#3{\ctxcommand{MPplus("#1",#2,"#3")}} \let\MPv \MPplus
+\def\MPrest #1#2{\ctxcommand{MPrest("#1","#2")}} \let\MPvv\MPrest
%D \macros
%D {MPanchor}
@@ -248,14 +233,6 @@
\def\MPanchor{\MPpos}
-%D \macros
-%D {POSp, POSx, POSy, POSh, POSd, POSw}
-%D
-%D and:
-
-\def\POSp{\MPp} \def\POSx{\MPx} \def\POSy{\MPy}
-\def\POSh{\MPh} \def\POSd{\MPd} \def\POSw{\MPw}
-
%D There are two low level positioning macros. Both store the
%D position as well as execute an action associated with that
%D position.
@@ -263,9 +240,7 @@
\def\initializenextposition
{\ifpositioning \else
\global\positioningtrue
- \dosetpositionpapersize
- {\printpaperwidth }%
- {\printpaperheight}%
+ \dosetpositionpapersize\printpaperwidth\printpaperheight
\fi
\global\advance\currentpositions\plusone}
@@ -400,7 +375,7 @@
%D
%D Again, this is a global action.
-\def\copyposition#1#2{\ctxlua{jobpositions.copy('#1','#2')}}
+\def\copyposition#1#2{\ctxcommand{copyposition('#1','#2')}}
%D The fact that handling positions is a two pass operation, is
%D one of the reasons why we need to be able to test for
@@ -410,7 +385,7 @@
%D \doifpositionelse {identifier} {found action} {not found action}
%D \stoptyping
-\def\doifpositionelse#1{\ctxlua{jobpositions.doifelse('#1')}}
+\def\doifpositionelse#1{\ctxcommand{doifpositionelse('#1')}}
%D We have now arrived at a few macros that would make sense as
%D support macros, but ended up in the core.
@@ -499,7 +474,6 @@
\newcount\parposcounter
\newif \ifpositioningpar
-\chardef \parposstrut = 1 % 0 => no strut data, so fall backs used
\newif \iftracepositions
% we can check for used entries, and if not, then not add one
@@ -515,15 +489,11 @@
\let\registerparoptions\relax
\def\doregisterparoptions
- {\ifpositioningpar \ifpositioning \iftrialtypesetting \else
+ {\iftrialtypesetting \else
\ifinpagebody \else \ifmmode \else \ifinformula \else
- \ifprocessingverbatim
- \iflinepar \dodoregisterparoptions \fi
- \else
- \dodoregisterparoptions
- \fi
+ \dodoregisterparoptions
\fi \fi \fi
- \fi \fi \fi}
+ \fi}
\def\dodoregisterparoptions
{\global\advance\parposcounter\plusone
@@ -537,7 +507,13 @@
\iftracepositions\registerparsymbol\fi}
\def\traceposstring#1#2#3%
- {\iftracepositions\smashedhbox{#1{\infofont#2#3}}\fi}
+ {\iftracepositions
+ \smashedhbox
+ {#1{\infofont#2#3}%
+ \scratchdimen.5\points
+ \kern-2\scratchdimen
+ \vrule\!!width4\scratchdimen\!!height\scratchdimen\!!depth\scratchdimen}%
+ \fi}
\def\registerparsymbol
{\iftracepositions
@@ -592,7 +568,7 @@
\def\getnodelocationn#1{\countervalue{\@@noden#1}}
\def\getnodelocationo#1{\getvalue {\@@nodeo#1}}
-\chardef\nodelocationmode\plusone
+\setnewconstant\nodelocationmode\plusone
\def\analyzenodelocation#1%
{\ifcsname\@@noden#1\endcsname
@@ -680,67 +656,14 @@
%D {action when not overlapping}
%D \stoptyping
-\def\overlappingmargin{-2\scaledpoint}
-
-\def\overlappingcheckone#1#2%
- {\ifdim#1<\!!dimena \else \ifdim#1>\!!dimenb \else
- \ifdim#2<\!!dimenc \else \ifdim#2>\!!dimend \else
- \donetrue
- \fi\fi
- \fi\fi}
-
-\def\overlappingchecktwo#1#2%
- {\ifdim#1<\!!dimene \else \ifdim#1>\!!dimenf \else
- \ifdim#2<\!!dimeng \else \ifdim#2>\!!dimenh \else
- \donetrue
- \fi\fi
- \fi\fi}
-
-\def\doifoverlappingelse#1#2% maybe do this in lua
- {\begingroup
- \donefalse
- \edef\!!stringa{#1}\edef\!!stringb{#2}%
- \ifnum\MPp\!!stringa=\MPp\!!stringb\relax
- \!!dimena\MPx\!!stringa
- \!!dimenb\dimexpr\MPx\!!stringa+\MPw\!!stringa\relax
- \!!dimenc\dimexpr\MPy\!!stringa-\MPd\!!stringa\relax
- \!!dimend\dimexpr\MPy\!!stringa+\MPh\!!stringa\relax
- \!!dimene\MPx\!!stringb
- \!!dimenf\dimexpr\MPx\!!stringb+\MPw\!!stringb\relax
- \!!dimeng\dimexpr\MPy\!!stringb-\MPd\!!stringb\relax
- \!!dimenh\dimexpr\MPy\!!stringb+\MPh\!!stringb\relax
- \ifdim\overlappingmargin=\zeropoint\else
- \advance\!!dimena-\overlappingmargin
- \advance\!!dimenb+\overlappingmargin
- \advance\!!dimenc-\overlappingmargin
- \advance\!!dimend+\overlappingmargin
- \advance\!!dimene-\overlappingmargin
- \advance\!!dimenf+\overlappingmargin
- \advance\!!dimeng-\overlappingmargin
- \advance\!!dimenh+\overlappingmargin
- \fi
- % more often eh fb eg fg
- \overlappingcheckone\!!dimene\!!dimeng \ifdone \else
- \overlappingcheckone\!!dimene\!!dimenh \ifdone \else
- \overlappingcheckone\!!dimenf\!!dimeng \ifdone \else
- \overlappingcheckone\!!dimenf\!!dimenh \ifdone \else
- \overlappingchecktwo\!!dimena\!!dimenc \ifdone \else
- \overlappingchecktwo\!!dimena\!!dimend \ifdone \else
- \overlappingchecktwo\!!dimenb\!!dimene \ifdone \else
- \overlappingchecktwo\!!dimenb\!!dimenc \fi \fi \fi \fi \fi \fi \fi
- \fi
- \ifdone
- \endgroup\expandafter\firstoftwoarguments
- \else
- \endgroup\expandafter\secondoftwoarguments
- \fi}
+\def\doifoverlappingelse#1#2{\ctxcommand{doifoverlappingelse("#1","#2")}}
%D \macros
%D {doifpositionsonsamepageelse,
%D doifpositionsonthispageelse}
%D
%D Instead of letting the user handle fuzzy expansion, we
-%D provide a simple test on positione being on the same page.
+%D provide a simple test on positions being on the same page.
%D
%D \starttyping
%D \doifpositionsonsamepageelse{point a}{point b}
@@ -751,33 +674,20 @@
%D {action when not on this page}
%D \stoptyping
-\def\dododoifpositionsonsamepageelse#1%
- {\ifcase\scratchcounter
- \scratchcounter\MPp{##}\donetrue
- \else
- \ifnum\scratchcounter=\MPp{#1}\relax\else\donefalse\fi
- \fi}%
-
-\def\dodoifpositionsonsamepageelse#1#2%
- {\begingroup
- \scratchcounter#1\donefalse
- \rawprocesscommalist[#2]\dododoifpositionsonsamepageelse
- \ifdone
- \endgroup\expandafter\firstoftwoarguments
- \else
- \endgroup\expandafter\secondoftwoarguments
- \fi}
-
-\def\doifpositionsonsamepageelse{\dodoifpositionsonsamepageelse\!!zerocount}
-\def\doifpositionsonthispageelse{\dodoifpositionsonsamepageelse\realfolio }
+\def\doifpositionsonsamepageelse#1{\ctxcommand{doifpositionsonsamepageelse("#1")}}
+\def\doifpositionsonthispageelse#1{\ctxcommand{doifpositionsonthispageelse("#1")}}
%D Plugins:
-\let\MPv \MPplus
-\let\MPvv\MPrest
-
+\let\MPv \MPplus
+\let\MPvv \MPrest
\let\MPanchor\MPpos
+%D \macros
+%D {POSp, POSx, POSy, POSh, POSd, POSw}
+%D
+%D This is obsolete in \MKIV:
+
\let\POSp\MPp \let\POSx\MPx \let\POSy\MPy
\let\POSh\MPh \let\POSd\MPd \let\POSw\MPw
diff --git a/Master/texmf-dist/tex/context/base/attr-col.lua b/Master/texmf-dist/tex/context/base/attr-col.lua
new file mode 100644
index 00000000000..871ac3e03cf
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/attr-col.lua
@@ -0,0 +1,516 @@
+if not modules then modules = { } end modules ['attr-col'] = {
+ version = 1.001,
+ comment = "companion to attr-col.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this module is being reconstructed and code will move to other places
+-- we can also do the nsnone via a metatable and then also se index 0
+
+local type = type
+local format = string.format
+local concat = table.concat
+
+local attributes, nodes = attributes, nodes
+
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+
+local report_attributes = logs.reporter("attributes","colors")
+local report_colors = logs.reporter("colors","support")
+local report_transparencies = logs.reporter("transparencies","support")
+
+-- todo: document this but first reimplement this as it reflects the early
+-- days of luatex / mkiv and we have better ways now
+
+-- nb: attributes: color etc is much slower than normal (marks + literals) but ...
+-- nb. too many "0 g"s
+
+local states = attributes.states
+local tasks = nodes.tasks
+local nodeinjections = backends.nodeinjections
+local registrations = backends.registrations
+local unsetvalue = attributes.unsetvalue
+
+-- 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.
+
+--
+-- colors
+--
+
+-- we can also collapse the two attributes: n, n+1, n+2 and then
+-- at the tex end add 0, 1, 2, but this is not faster and less
+-- flexible (since sometimes we freeze color attribute values at
+-- the lua end of the game
+--
+-- we also need to store the colorvalues because we need then in mp
+--
+-- This is a compromis between speed and simplicity. We used to store the
+-- values and data in one array, which made in neccessary to store the
+-- converters that need node constructor into strings and evaluate them
+-- at runtime (after reading from storage). Think of:
+--
+-- colors.strings = colors.strings or { }
+--
+-- if environment.initex then
+-- colors.strings[color] = "return colors." .. colorspace .. "(" .. concat({...},",") .. ")"
+-- end
+--
+-- storage.register("attributes/colors/data", colors.strings, "attributes.colors.data") -- evaluated
+--
+-- We assume that only processcolors are defined in the format.
+
+attributes.colors = attributes.colors or { }
+local colors = attributes.colors
+
+local a_color = attributes.private('color')
+local a_selector = attributes.private('colormodel')
+
+colors.data = allocate()
+colors.values = colors.values or { }
+colors.registered = colors.registered or { }
+colors.weightgray = true
+colors.attribute = a_color
+colors.selector = a_selector
+colors.default = 1
+colors.main = nil
+colors.triggering = true
+colors.supported = true
+
+storage.register("attributes/colors/values", colors.values, "attributes.colors.values")
+storage.register("attributes/colors/registered", colors.registered, "attributes.colors.registered")
+
+local templates = {
+ rgb = "r:%s:%s:%s",
+ cmyk = "c:%s:%s:%s:%s",
+ gray = "s:%s",
+ spot = "p:%s:%s:%s:%s"
+}
+
+local models = {
+ [interfaces.variables.none] = unsetvalue,
+ black = unsetvalue,
+ bw = unsetvalue,
+ all = 1,
+ gray = 2,
+ rgb = 3,
+ cmyk = 4,
+}
+
+colors.model = "all"
+
+local data = colors.data
+local values = colors.values
+local registered = colors.registered
+
+local numbers = attributes.numbers
+local list = attributes.list
+
+local min, max, floor = math.min, math.max, math.floor
+
+local function rgbtocmyk(r,g,b) -- we could reduce
+ return 1-r, 1-g, 1-b, 0
+end
+
+local function cmyktorgb(c,m,y,k)
+ return 1.0 - min(1.0,c+k), 1.0 - min(1.0,m+k), 1.0 - min(1.0,y+k)
+end
+
+local function rgbtogray(r,g,b)
+ if colors.weightgray then
+ return .30*r+.59*g+.11*b
+ else
+ return r/3+g/3+b/3
+ end
+end
+
+local function cmyktogray(c,m,y,k)
+ return rgbtogray(cmyktorgb(c,m,y,k))
+end
+
+-- http://en.wikipedia.org/wiki/HSI_color_space
+-- http://nl.wikipedia.org/wiki/HSV_(kleurruimte)
+
+local function hsvtorgb(h,s,v)
+ -- h = h % 360
+ local hd = h/60
+ local hf = floor(hd)
+ local hi = hf % 6
+ -- local f = hd - hi
+ local f = hd - hf
+ local p = v * (1 - s)
+ local q = v * (1 - f * s)
+ local t = v * (1 - (1 - f) * s)
+ if hi == 0 then
+ return v, t, p
+ elseif hi == 1 then
+ return q, v, p
+ elseif hi == 2 then
+ return p, v, t
+ elseif hi == 3 then
+ return p, q, v
+ elseif hi == 4 then
+ return t, p, v
+ elseif hi == 5 then
+ return v, p, q
+ else
+ print("error in hsv -> rgb",hi,h,s,v)
+ end
+end
+
+local function rgbtohsv(r,g,b)
+ local offset, maximum, other_1, other_2
+ if r >= g and r >= b then
+ offset, maximum, other_1, other_2 = 0, r, g, b
+ elseif g >= r and g >= b then
+ offset, maximum, other_1, other_2 = 2, g, b, r
+ else
+ offset, maximum, other_1, other_2 = 4, b, r, g
+ end
+ if maximum == 0 then
+ return 0, 0, 0
+ end
+ local minimum = other_1 < other_2 and other_1 or other_2
+ if maximum == minimum then
+ return 0, 0, maximum
+ end
+ local delta = maximum - minimum
+ return (offset + (other_1-other_2)/delta)*60, delta/maximum, maximum
+end
+
+local function graytorgb(s) -- unweighted
+ return 1-s, 1-s, 1-s
+end
+
+local function hsvtogray(h,s,v)
+ return rgb_to_gray(hsv_to_rgb(h,s,v))
+end
+
+local function graytohsv(s)
+ return 0, 0, s
+end
+
+colors.rgbtocmyk = rgbtocmyk
+colors.rgbtogray = rgbtogray
+colors.cmyktorgb = cmyktorgb
+colors.cmyktogray = cmyktogray
+colors.rgbtohsv = rgbtohsv
+colors.hsvtorgb = hsvtorgb
+colors.hsvtogray = hsvtogray
+colors.graytohsv = graytohsv
+
+-- we can share some *data by using s, rgb and cmyk hashes, but
+-- normally the amount of colors is not that large; storing the
+-- components costs a bit of extra runtime, but we expect to gain
+-- some back because we have them at hand; the number indicates the
+-- default color space
+
+function colors.gray(s)
+ return { 2, s, s, s, s, 0, 0, 0, 1-s }
+end
+
+function colors.rgb(r,g,b)
+ local s = rgbtogray(r,g,b)
+ local c, m, y, k = rgbtocmyk(r,g,b)
+ return { 3, s, r, g, b, c, m, y, k }
+end
+
+function colors.cmyk(c,m,y,k)
+ local s = cmyktogray(c,m,y,k)
+ local r, g, b = cmyktorgb(c,m,y,k)
+ return { 4, s, r, g, b, c, m, y, k }
+end
+
+--~ function colors.spot(parent,f,d,p)
+--~ return { 5, .5, .5, .5, .5, 0, 0, 0, .5, parent, f, d, p }
+--~ end
+
+function colors.spot(parent,f,d,p)
+ if type(p) == "number" then
+ local n = list[numbers.color][parent] -- hard coded ref to color number
+ if n then
+ local v = values[n]
+ if v then
+ -- the via cmyk hack is dirty, but it scales better
+ local c, m, y, k = p*v[6], p*v[7], p*v[8], p*v[8]
+ local r, g, b = cmyktorgb(c,m,y,k)
+ local s = cmyktogray(c,m,y,k)
+ return { 5, s, r, g, b, c, m, y, k, parent, f, d, p }
+ end
+ end
+ else
+ -- todo, multitone (maybe p should be a table)
+ end
+ return { 5, .5, .5, .5, .5, 0, 0, 0, .5, parent, f, d, p }
+end
+
+local function graycolor(...) graycolor = nodeinjections.graycolor return graycolor(...) end
+local function rgbcolor (...) rgbcolor = nodeinjections.rgbcolor return rgbcolor (...) end
+local function cmykcolor(...) cmykcolor = nodeinjections.cmykcolor return cmykcolor(...) end
+local function spotcolor(...) spotcolor = nodeinjections.spotcolor return spotcolor(...) end
+
+local function extender(colors,key)
+ if colors.supported and key == "none" then
+ local d = graycolor(0)
+ colors.none = d
+ return d
+ end
+end
+
+local function reviver(data,n)
+ if colors.supported then
+ local v = values[n]
+ local d
+ if not v then
+ local gray = graycolor(0)
+ d = { gray, gray, gray, gray }
+ report_attributes("unable to revive color %s",n or "?")
+ else
+ local model = colors.forcedmodel(v[1])
+ if model == 2 then
+ local gray= graycolor(v[2])
+ d = { gray, gray, gray, gray }
+ elseif model == 3 then
+ local gray, rgb, cmyk = graycolor(v[2]), rgbcolor(v[3],v[4],v[5]), cmykcolor(v[6],v[7],v[8],v[9])
+ d = { rgb, gray, rgb, cmyk }
+ elseif model == 4 then
+ local gray, rgb, cmyk = graycolor(v[2]), rgbcolor(v[3],v[4],v[5]), cmykcolor(v[6],v[7],v[8],v[9])
+ d = { cmyk, gray, rgb, cmyk }
+ elseif model == 5 then
+ local spot = spotcolor(v[10],v[11],v[12],v[13])
+ -- d = { spot, gray, rgb, cmyk }
+ d = { spot, spot, spot, spot }
+ end
+ end
+ data[n] = d
+ return d
+ end
+end
+
+setmetatableindex(colors, extender)
+setmetatableindex(colors.data, reviver)
+
+function colors.filter(n)
+ return concat(data[n],":",5)
+end
+
+function colors.setmodel(name,weightgray)
+ colors.model = name
+ colors.default = models[name] or 1
+ colors.weightgray = weightgray ~= false
+ return colors.default
+end
+
+function colors.register(name, colorspace, ...) -- passing 9 vars is faster (but not called that often)
+ local stamp = format(templates[colorspace],...)
+ local color = registered[stamp]
+ if not color then
+ color = #values + 1
+ values[color] = colors[colorspace](...)
+ registered[stamp] = color
+ -- colors.reviver(color)
+ end
+ if name then
+ list[a_color][name] = color -- not grouped, so only global colors
+ end
+ return registered[stamp]
+end
+
+function colors.value(id)
+ return values[id]
+end
+
+attributes.colors.handler = nodes.installattributehandler {
+ name = "color",
+ namespace = colors,
+ initializer = states.initialize,
+ finalizer = states.finalize,
+ processor = states.selective,
+ resolver = function() return colors.main end,
+}
+
+function colors.enable(value)
+ if value == false or not colors.supported then
+ tasks.disableaction("shipouts","attributes.colors.handler")
+ else
+ tasks.enableaction("shipouts","attributes.colors.handler")
+ end
+end
+
+function colors.forcesupport(value) -- can move to attr-div
+ colors.supported = value
+ report_colors("color is %ssupported",value and "" or "not ")
+ colors.enable(value)
+end
+
+-- transparencies
+
+attributes.transparencies = attributes.transparencies or { }
+local transparencies = attributes.transparencies
+transparencies.registered = transparencies.registered or { }
+transparencies.data = allocate()
+transparencies.values = transparencies.values or { }
+transparencies.triggering = true
+transparencies.attribute = attributes.private('transparency')
+transparencies.supported = true
+
+storage.register("attributes/transparencies/registered", transparencies.registered, "attributes.transparencies.registered")
+storage.register("attributes/transparencies/values", transparencies.values, "attributes.transparencies.values")
+
+local registered = transparencies.registered -- we could use a 2 dimensional table instead
+local data = transparencies.data
+local values = transparencies.values
+local template = "%s:%s"
+
+local function inject_transparency (...)
+ inject_transparency = nodeinjections.transparency
+ return inject_transparency(...)
+end
+
+local function register_transparency(...)
+ register_transparency = registrations.transparency
+ return register_transparency(...)
+end
+
+function transparencies.register(name,a,t,force) -- name is irrelevant here (can even be nil)
+ -- Force needed here for metapost converter. We could always force
+ -- but then we'd end up with transparencies resources even if we
+ -- would not use transparencies (but define them only). This is
+ -- somewhat messy.
+ local stamp = format(template,a,t)
+ local n = registered[stamp]
+ if not n then
+ n = #values + 1
+ values[n] = { a, t }
+ registered[stamp] = n
+ if force then
+ register_transparency(n,a,t)
+ end
+ elseif force and not data[n] then
+ register_transparency(n,a,t)
+ end
+ return registered[stamp]
+end
+
+local function extender(transparencies,key)
+ if colors.supported and key == "none" then
+ local d = inject_transparency(0)
+ transparencies.none = d
+ return d
+ end
+end
+
+local function reviver(data,n)
+ if transparencies.supported then
+ local v = values[n]
+ local d
+ if not v then
+ d = inject_transparency(0)
+ else
+ d = inject_transparency(n)
+ register_transparency(n,v[1],v[2])
+ end
+ data[n] = d
+ return d
+ else
+ return ""
+ end
+end
+
+setmetatableindex(transparencies, extender)
+setmetatableindex(transparencies.data, reviver) -- register if used
+
+-- check if there is an identity
+
+function transparencies.value(id)
+ return values[id]
+end
+
+attributes.transparencies.handler = nodes.installattributehandler {
+ name = "transparency",
+ namespace = transparencies,
+ initializer = states.initialize,
+ finalizer = states.finalize,
+ processor = states.process,
+}
+
+function transparencies.enable(value) -- nil is enable
+ if value == false or not transparencies.supported then
+ tasks.disableaction("shipouts","attributes.transparencies.handler")
+ else
+ tasks.enableaction("shipouts","attributes.transparencies.handler")
+ end
+end
+
+function transparencies.forcesupport(value) -- can move to attr-div
+ transparencies.supported = value
+ report_transparencies("transparency is %ssupported",value and "" or "not ")
+ transparencies.enable(value)
+end
+
+--- colorintents: overprint / knockout
+
+attributes.colorintents = attributes.colorintents or { }
+local colorintents = attributes.colorintents
+colorintents.data = allocate() -- colorintents.data or { }
+colorintents.attribute = attributes.private('colorintent')
+
+colorintents.registered = allocate {
+ overprint = 1,
+ knockout = 2,
+}
+
+local data, registered = colorintents.data, colorintents.registered
+
+local function extender(colorintents,key)
+ if key == "none" then
+ local d = data[2]
+ colorintents.none = d
+ return d
+ end
+end
+
+local function reviver(data,n)
+ if n == 1 then
+ local d = nodeinjections.overprint() -- called once
+ data[1] = d
+ return d
+ elseif n == 2 then
+ local d = nodeinjections.knockout() -- called once
+ data[2] = d
+ return d
+ end
+end
+
+setmetatableindex(colorintents, extender)
+setmetatableindex(colorintents.data, reviver)
+
+function colorintents.register(stamp)
+ return registered[stamp] or registered.overprint
+end
+
+colorintents.handler = nodes.installattributehandler {
+ name = "colorintent",
+ namespace = colorintents,
+ initializer = states.initialize,
+ finalizer = states.finalize,
+ processor = states.process,
+}
+
+function colorintents.enable()
+ tasks.enableaction("shipouts","attributes.colorintents.handler")
+end
+
+-- interface
+
+commands.enablecolor = colors.enable
+commands.enabletransparency = transparencies.enable
+commands.enablecolorintents = colorintents.enable
+
+function commands.registercolor (...) context(colors .register(...)) end
+function commands.registertransparency(...) context(transparencies.register(...)) end
+function commands.registercolorintent (...) context(colorintents .register(...)) end
diff --git a/Master/texmf-dist/tex/context/base/attr-col.mkiv b/Master/texmf-dist/tex/context/base/attr-col.mkiv
new file mode 100644
index 00000000000..8d61ee8aeff
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/attr-col.mkiv
@@ -0,0 +1,82 @@
+%D \module
+%D [ file=attr-col,
+%D version=2007.06.06,
+%D title=\CONTEXT\ Attribute Macros,
+%D subtitle=Color,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%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 Attribute Macros / Color}
+
+\registerctxluafile{attr-col}{1.001}
+
+\unprotect
+
+% todo: no need for 'color' argument, we can set that once at startup; currently
+% a bit inconsistent
+
+% 1=off 2=gray 3=spot 4=rgb 5=cmyk 6=cmy % only 1/2/4/5 are supported
+%
+% We could combine this in one attribute but this is not faster and also
+% less flexible because sometimes we want to freeze the attribute bit.
+
+% % color (layer on top)
+%
+% \def\dosetcolormodel#1% overloaded later
+% {\ctxcommand{setcolormodel('#1')}} % sets attribute
+%
+% \dosetcolormodel{all}
+%
+% \def\registerrgbcolor#1#2#3#4% not used
+% {\setevalue{(cs:#1)}{\attribute\colorattribute\ctxcommand{registercolor('#1','rgb' ,#2,#3,#4)}}}
+%
+% \def\registercmykcolor#1#2#3#4#5% not used
+% {\setevalue{(cs:#1)}{\attribute\colorattribute\ctxcommand{registercolor('#1','cmyk',#2,#3,#4,#5)}}}
+%
+% \def\registergraycolor#1#2% not used
+% {\setevalue{(cs:#1)}{\attribute\colorattribute\ctxcommand{registercolor('#1','gray',#2)}}}
+
+% % transparency (layer on top)
+%
+% \def\registertransparency#1#2#3%
+% {\setevalue{(ts:#1)}{\attribute\transparencyattribute\ctxcommand{registertransparency(#2,#3)} }}
+%
+% \def\sometransparencyswitch#1%
+% {\csname(ts:#1)\endcsname}
+%
+% \def\sometransparencyswitch
+% {\ctxcommand{enabletransparency()}%
+% \gdef\sometransparencyswitch##1{\csname(ts:##1)\endcsname}%
+% \sometransparencyswitch}
+%
+% \registertransparency {one} {1} {.5}
+% \registertransparency {two} {1} {.6}
+
+% overprint
+
+\def\registercolorintent#1#2%
+ {\setevalue{(os:#1)}{\attribute\colorintentattribute\ctxcommand{registercolorintent('#2')} }}
+
+\def\dotriggercolorintent
+ {\ctxcommand{enablecolorintents()}%
+ \gdef\dotriggercolorintent##1{\csname(os:##1)\endcsname}%
+ \dotriggercolorintent}
+
+\registercolorintent{knockout} {knockout}
+\registercolorintent{overprint}{overprint}
+
+\installattributestack\colorintentattribute
+
+\setevalue{(os:#\v!none}{\attribute\colorintentattribute\attributeunsetvalue} % does this work out ok?
+
+\protect \endinput
+
+% test case
+%
+% {\green \hbox to \hsize{\leaders\hrule \hfill a}\par}
+% {\red \hbox to \hsize{\leaders\hbox{x}\hfill a}\par}
diff --git a/Master/texmf-dist/tex/context/base/attr-eff.lua b/Master/texmf-dist/tex/context/base/attr-eff.lua
new file mode 100644
index 00000000000..023d1c51b53
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/attr-eff.lua
@@ -0,0 +1,97 @@
+if not modules then modules = { } end modules ['attr-eff'] = {
+ version = 1.001,
+ comment = "companion to attr-eff.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+
+local attributes, nodes = attributes, nodes
+
+local states = attributes.states
+local tasks = nodes.tasks
+local nodeinjections = backends.nodeinjections
+local settexattribute = tex.setattribute
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+
+attributes.effects = attributes.effects or { }
+local effects = attributes.effects
+
+local a_effect = attributes.private('effect')
+
+effects.data = allocate()
+effects.values = effects.values or { }
+effects.registered = effects.registered or { }
+effects.attribute = a_effect
+
+storage.register("attributes/effects/registered", effects.registered, "attributes.effects.registered")
+storage.register("attributes/effects/values", effects.values, "attributes.effects.values")
+
+local template = "%s:%s:%s"
+
+local data = effects.data
+local registered = effects.registered
+local values = effects.values
+
+-- valid effects: normal inner outer both hidden (stretch,rulethickness,effect)
+
+local function effect(...) effect = nodeinjections.effect return effect(...) end
+
+local function extender(effects,key)
+ if key == "none" then
+ local d = effect(0,0,0)
+ effects.none = d
+ return d
+ end
+end
+
+local function reviver(data,n)
+ local e = values[n] -- we could nil values[n] now but hardly needed
+ local d = effect(e[1],e[2],e[3])
+ data[n] = d
+ return d
+end
+
+setmetatableindex(effects, extender)
+setmetatableindex(effects.data, reviver)
+
+effects.handler = nodes.installattributehandler {
+ name = "effect",
+ namespace = effects,
+ initializer = states.initialize,
+ finalizer = states.finalize,
+ processor = states.process,
+}
+
+local function register(effect,stretch,rulethickness)
+ local stamp = format(template,effect,stretch,rulethickness)
+ local n = registered[stamp]
+ if not n then
+ n = #values + 1
+ values[n] = { effect, stretch, rulethickness }
+ registered[stamp] = n
+ end
+ return n
+end
+
+local function enable()
+ tasks.enableaction("shipouts","attributes.effects.handler")
+end
+
+effects.register = register
+effects.enable = enable
+
+-- interface
+
+local enabled = false
+
+function commands.triggereffect(effect,stretch,rulethickness)
+ if not enabled then
+ enable()
+ enabled = true
+ end
+ settexattribute(a_effect,register(effect,stretch,rulethickness))
+end
diff --git a/Master/texmf-dist/tex/context/base/attr-eff.mkiv b/Master/texmf-dist/tex/context/base/attr-eff.mkiv
new file mode 100644
index 00000000000..3526276c7e7
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/attr-eff.mkiv
@@ -0,0 +1,74 @@
+%D \module
+%D [ file=attr-eff,
+%D version=2007.06.06,
+%D title=\CONTEXT\ Attribute Macros,
+%D subtitle=Effects,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%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 Attribute Macros / Effects}
+
+\registerctxluafile{attr-eff}{1.001}
+
+\unprotect
+
+% \def\registereffect#1#2#3% #2=stretch #3=rulethickness
+% {\setxvalue{(es:#1:#2:\number\dimexpr#3\relax)}% todo: set attribute at lua end
+% {\attribute\effectattribute\ctxcommand{registereffect('#1',#2,\number\dimexpr#3\relax)}\relax}}
+%
+% \def\dotriggereffect
+% {\ctxcommand{enableeffect()}% can then move to caller
+% \gdef\dotriggereffect##1##2##3%
+% {\ifcsname(es:##1:##2:\number\dimexpr##3\relax)\endcsname\else\registereffect{##1}{##2}{##3}\fi
+% \csname(es:##1:##2:\number\dimexpr##3\relax)\endcsname}%
+% \dotriggereffect}
+%
+% \def\registereffect#1#2#3% #2=stretch #3=rulethickness
+% {\setxvalue{(es:#1:#2:\number\dimexpr#3\relax)}% todo: set attribute at lua end
+% {\attribute\effectattribute\ctxcommand{registereffect('#1',#2,\number\dimexpr#3\relax)}\relax}}
+
+\gdef\dotriggereffect#1#2#3%
+ {\ctxcommand{triggereffect('#1',#2,\number\dimexpr#3\relax)}}
+
+\unexpanded\def\setupeffect
+ {\dodoubleargument\dosetupeffect}
+
+\def\dosetupeffect[#1][#2]%
+ {\getparameters[\??et#1][#2]}
+
+\unexpanded\def\defineeffect
+ {\dodoubleargument\dodefineeffect}
+
+\def\dodefineeffect[#1][#2]%
+ {\getparameters[\??et#1][\c!method=\v!none,\c!stretch=0,\c!rulethickness=\zeropoint,\c!alternative=\v!normal,#2]%
+ \doif{\getvalue{\??et#1\c!method}}\v!command
+ {\setugvalue{\e!start#1}{\starteffect[#1]}%
+ \setugvalue{\e!stop #1}{\stopeffect}}}
+
+% yes or no grouped
+
+\unexpanded\def\starteffect[#1]%
+ {\dotriggereffect
+ {\csname\??et#1\c!alternative \endcsname}%
+ {\csname\??et#1\c!stretch \endcsname}%
+ {\csname\??et#1\c!rulethickness\endcsname}}
+
+\unexpanded\def\stopeffect % can be special
+ {\dotriggereffect\v!normal0\zeropoint}
+
+\unexpanded\def\effect[#1]%
+ {\groupedcommand{\starteffect[#1]}{\stopeffect}}
+
+\defineeffect [\v!inner] [\c!alternative=\v!inner,\c!rulethickness=.25pt]
+\defineeffect [\v!outer] [\c!alternative=\v!outer,\c!rulethickness=.25pt]
+\defineeffect [\v!both] [\c!alternative=\v!both, \c!rulethickness=.25pt]
+\defineeffect [\v!normal] [\c!alternative=\v!normal]
+\defineeffect [\v!hidden] [\c!alternative=\v!hidden]
+\defineeffect [\v!stretch] [\c!alternative=\v!stretch,\c!stretch=1]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/attr-ini.lua b/Master/texmf-dist/tex/context/base/attr-ini.lua
index 81c2f4744ca..96d7c7228c7 100644
--- a/Master/texmf-dist/tex/context/base/attr-ini.lua
+++ b/Master/texmf-dist/tex/context/base/attr-ini.lua
@@ -6,643 +6,101 @@ if not modules then modules = { } end modules ['attr-ini'] = {
license = "see context related readme files"
}
--- this module is being reconstructed
--- we can also do the nsnone via a metatable and then also se index 0
+local next, type = next, type
-local type = type
-local format, gmatch = string.format, string.gmatch
-local concat = table.concat
-local texsprint = tex.sprint
+--[[ldx--
+<p>We start with a registration system for atributes so that we can use the
+symbolic names later on.</p>
+--ldx]]--
-local ctxcatcodes = tex.ctxcatcodes
-local unsetvalue = attributes.unsetvalue
+attributes = attributes or { }
--- todo: document this but first reimplement this as it reflects the early
--- days of luatex / mkiv and we have better ways now
+local attributes, nodes = attributes, nodes
--- nb: attributes: color etc is much slower than normal (marks + literals) but ...
--- nb. too many "0 g"s
+-- todo: local and then gobals ... first loaded anyway
-nodes = nodes or { }
-states = states or { }
-shipouts = shipouts or { }
+attributes.names = attributes.names or { }
+attributes.numbers = attributes.numbers or { }
+attributes.list = attributes.list or { }
+attributes.states = attributes.states or { }
+attributes.handlers = attributes.handlers or { }
+attributes.unsetvalue = -0x7FFFFFFF
--- 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.
+local names, numbers, list = attributes.names, attributes.numbers, attributes.list
---
--- colors
---
-
--- we can also collapse the two attributes: n, n+1, n+2 and then
--- at the tex end add 0, 1, 2, but this is not faster and less
--- flexible (since sometimes we freeze color attribute values at
--- the lua end of the game
---
--- we also need to store the colorvalues because we need then in mp
---
--- This is a compromis between speed and simplicity. We used to store the
--- values and data in one array, which made in neccessary to store the
--- converters that need node constructor into strings and evaluate them
--- at runtime (after reading from storage). Think of:
---
--- colors.strings = colors.strings or { }
---
--- if environment.initex then
--- colors.strings[color] = "return colors." .. colorspace .. "(" .. concat({...},",") .. ")"
--- end
---
--- storage.register("colors/data", colors.strings, "colors.data") -- evaluated
---
--- We assume that only processcolors are defined in the format.
-
-colors = colors or { }
-colors.data = colors.data or { }
-colors.values = colors.values or { }
-colors.registered = colors.registered or { }
-
-colors.weightgray = true
-colors.attribute = attributes.private('color')
-colors.selector = attributes.private('colormodel')
-colors.default = 1
-colors.main = nil
-colors.triggering = true
-
-storage.register("colors/values", colors.values, "colors.values")
-storage.register("colors/registered", colors.registered, "colors.registered")
-
-local templates = {
- rgb = "r:%s:%s:%s",
- cmyk = "c:%s:%s:%s:%s",
- gray = "s:%s",
- spot = "p:%s:%s:%s:%s"
-}
-
-local models = {
- [interfaces.variables.none] = unsetvalue,
- black = unsetvalue,
- bw = unsetvalue,
- all = 1,
- gray = 2,
- rgb = 3,
- cmyk = 4,
-}
-
-colors.model = "all"
-
-local data = colors.data
-local values = colors.values
-local registered = colors.registered
-
-local numbers = attributes.numbers
-local list = attributes.list
-
-local min, max, floor = math.min, math.max, math.floor
-
-local nodeinjections = backends.nodeinjections
-local codeinjections = backends.codeinjections
-local registrations = backends.registrations
-
-local function rgbtocmyk(r,g,b) -- we could reduce
- return 1-r, 1-g, 1-b, 0
-end
-
-local function cmyktorgb(c,m,y,k)
- return 1.0 - min(1.0,c+k), 1.0 - min(1.0,m+k), 1.0 - min(1.0,y+k)
-end
-
-local function rgbtogray(r,g,b)
- if colors.weightgray then
- return .30*r+.59*g+.11*b
- else
- return r/3+g/3+b/3
- end
-end
-
-local function cmyktogray(c,m,y,k)
- return rgbtogray(cmyktorgb(c,m,y,k))
-end
-
--- http://en.wikipedia.org/wiki/HSI_color_space
--- http://nl.wikipedia.org/wiki/HSV_(kleurruimte)
-
-
-local function hsvtorgb(h,s,v)
- -- h = h % 360
- local hd = h/60
- local hf = floor(hd)
- local hi = hf % 6
- -- local f = hd - hi
- local f = hd - hf
- local p = v * (1 - s)
- local q = v * (1 - f * s)
- local t = v * (1 - (1 - f) * s)
- if hi == 0 then
- return v, t, p
- elseif hi == 1 then
- return q, v, p
- elseif hi == 2 then
- return p, v, t
- elseif hi == 3 then
- return p, q, v
- elseif hi == 4 then
- return t, p, v
- elseif hi == 5 then
- return v, p, q
- else
- print("error in hsv -> rgb",hi,h,s,v)
- end
-end
-
-function rgbtohsv(r,g,b)
- local offset, maximum, other_1, other_2
- if r >= g and r >= b then
- offset, maximum, other_1, other_2 = 0, r, g, b
- elseif g >= r and g >= b then
- offset, maximum, other_1, other_2 = 2, g, b, r
- else
- offset, maximum, other_1, other_2 = 4, b, r, g
- end
- if maximum == 0 then
- return 0, 0, 0
- end
- local minimum = other_1 < other_2 and other_1 or other_2
- if maximum == minimum then
- return 0, 0, maximum
- end
- local delta = maximum - minimum
- return (offset + (other_1-other_2)/delta)*60, delta/maximum, maximum
-end
-
-function graytorgb(s) -- unweighted
- return 1-s, 1-s, 1-s
-end
+storage.register("attributes/names", names, "attributes.names")
+storage.register("attributes/numbers", numbers, "attributes.numbers")
+storage.register("attributes/list", list, "attributes.list")
-function hsvtogray(h,s,v)
- return rgb_to_gray(hsv_to_rgb(h,s,v))
-end
-
-function grayto_hsv(s)
- return 0, 0, s
-end
-
-colors.rgbtocmyk = rgbtocmyk
-colors.rgbtogray = rgbtogray
-colors.cmyktorgb = cmyktorgb
-colors.cmyktogray = cmyktogray
-colors.rgbtohsv = rgbtohsv
-colors.hsvtorgb = hsvtorgb
-colors.hsvtogray = hsvtogray
-colors.graytohsv = graytohsv
-
--- we can share some *data by using s, rgb and cmyk hashes, but
--- normally the amount of colors is not that large; storing the
--- components costs a bit of extra runtime, but we expect to gain
--- some back because we have them at hand; the number indicates the
--- default color space
-
-function colors.gray(s)
- return { 2, s, s, s, s, 0, 0, 0, 1-s }
-end
-
-function colors.rgb(r,g,b)
- local s = rgbtogray(r,g,b)
- local c, m, y, k = rgbtocmyk(r,g,b)
- return { 3, s, r, g, b, c, m, y, k }
-end
-
-function colors.cmyk(c,m,y,k)
- local s = cmyktogray(c,m,y,k)
- local r, g, b = cmyktorgb(c,m,y,k)
- return { 4, s, r, g, b, c, m, y, k }
-end
-
---~ function colors.spot(parent,f,d,p)
---~ return { 5, .5, .5, .5, .5, 0, 0, 0, .5, parent, f, d, p }
---~ end
-
-function colors.spot(parent,f,d,p)
- if type(p) == "number" then
- local n = list[numbers.color][parent] -- hard coded ref to color number
- if n then
- local v = values[n]
- if v then
- -- the via cmyk hack is dirty, but it scales better
- local c, m, y, k = p*v[6], p*v[7], p*v[8], p*v[8]
- local r, g, b = cmyktorgb(c,m,y,k)
- local s = cmyktogray(c,m,y,k)
- return { 5, s, r, g, b, c, m, y, k, parent, f, d, p }
- end
- end
- else
- -- todo, multitone (maybe p should be a table)
+function attributes.define(name,number) -- at the tex end
+ if not numbers[name] then
+ numbers[name], names[number], list[number] = number, name, { }
end
- return { 5, .5, .5, .5, .5, 0, 0, 0, .5, parent, f, d, p }
end
-local function graycolor(...) graycolor = nodeinjections.graycolor return graycolor(...) end
-local function rgbcolor (...) rgbcolor = nodeinjections.rgbcolor return rgbcolor (...) end
-local function cmykcolor(...) cmykcolor = nodeinjections.cmykcolor return cmykcolor(...) end
-local function spotcolor(...) spotcolor = nodeinjections.spotcolor return spotcolor(...) end
+--[[ldx--
+<p>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 <l n='context'/>.</p>
+--ldx]]--
-local function extender(colors,key)
- if key == "none" then
- local d = graycolor(0)
- colors.none = d
- return d
- end
-end
+storage.shared.attributes_last_private = storage.shared.attributes_last_private or 127
-local function reviver(data,n)
- local v = values[n]
- local d
- if not v then
- local gray = graycolor(0)
- d = { gray, gray, gray, gray }
- logs.report("attributes","unable to revive color %s",n or "?")
- else
- local kind = v[1]
- if kind == 2 then
- local gray= graycolor(v[2])
- d = { gray, gray, gray, gray }
- elseif kind == 3 then
- local gray, rgb, cmyk = graycolor(v[2]), rgbcolor(v[3],v[4],v[5]), cmykcolor(v[6],v[7],v[8],v[9])
- d = { rgb, gray, rgb, cmyk }
- elseif kind == 4 then
- local gray, rgb, cmyk = graycolor(v[2]), rgbcolor(v[3],v[4],v[5]), cmykcolor(v[6],v[7],v[8],v[9])
- d = { cmyk, gray, rgb, cmyk }
- elseif kind == 5 then
- local spot = spotcolor(v[10],v[11],v[12],v[13])
- -- d = { spot, gray, rgb, cmyk }
- d = { spot, spot, spot, spot }
+-- to be considered (so that we can use an array access):
+--
+-- local private = { } attributes.private = private
+--
+-- setmetatable(private, {
+-- __index = function(t,name)
+-- local number = storage.shared.attributes_last_private or 127
+-- if number < 1023 then -- tex.count.minallocatedattribute - 1
+-- number = number + 1
+-- storage.shared.attributes_last_private = number
+-- end
+-- numbers[name], names[number], list[number] = number, name, { }
+-- private[name] = number
+-- return number
+-- end,
+-- __call = function(t,name)
+-- return t[name]
+-- end
+-- } )
+
+function attributes.private(name) -- at the lua end (hidden from user)
+ local number = numbers[name]
+ if not number then
+ local last = storage.shared.attributes_last_private or 127
+ if last < 1023 then -- tex.count.minallocatedattribute - 1
+ last = last + 1
+ storage.shared.attributes_last_private = last
+ else
+ report_attribute("no more room for private attributes") -- fatal
+ os.exit()
end
+ number = last
+ numbers[name], names[number], list[number] = number, name, { }
end
- data[n] = d
- return d
-end
-
-setmetatable(colors, { __index = extender })
-setmetatable(colors.data, { __index = reviver })
-
-function colors.filter(n)
- return concat(data[n],":",5)
-end
-
-function colors.setmodel(name,weightgray)
- colors.model = name
- colors.default = models[name] or 1
- colors.weightgray = weightgray ~= false
- return colors.default
-end
-
-function colors.register(name, colorspace, ...) -- passing 9 vars is faster (but not called that often)
- local stamp = format(templates[colorspace],...)
- local color = registered[stamp]
- if not color then
- color = #values + 1
- values[color] = colors[colorspace](...)
- registered[stamp] = color
- -- colors.reviver(color)
- end
- if name then
- list[colors.attribute][name] = color -- not grouped, so only global colors
- end
- return registered[stamp]
+ return number
end
-function colors.value(id)
- return values[id]
-end
-
-shipouts.handle_color = nodes.install_attribute_handler {
- name = "color",
- namespace = colors,
- initializer = states.initialize,
- finalizer = states.finalize,
- processor = states.selective,
- resolver = function() return colors.main end,
-}
-
-function colors.enable()
- tasks.enableaction("shipouts","shipouts.handle_color")
-end
+-- new (actually a tracer)
--- transparencies
-
-transparencies = transparencies or { }
-transparencies.registered = transparencies.registered or { }
-transparencies.data = transparencies.data or { }
-transparencies.values = transparencies.values or { }
-transparencies.triggering = true
-transparencies.attribute = attributes.private('transparency')
-
-storage.register("transparencies/registered", transparencies.registered, "transparencies.registered")
-storage.register("transparencies/values", transparencies.values, "transparencies.values")
-
-local registered = transparencies.registered -- we could use a 2 dimensional table instead
-local data = transparencies.data
-local values = transparencies.values
-local template = "%s:%s"
-
-local function inject_transparency (...)
- inject_transparency = nodeinjections.transparency
- return inject_transparency(...)
-end
-
-local function register_transparency(...)
- register_transparency = registrations.transparency
- return register_transparency(...)
-end
-
-function transparencies.register(name,a,t,force) -- name is irrelevant here (can even be nil)
- -- Force needed here for metapost converter. We could always force
- -- but then we'd end up with transparencies resources even if we
- -- would not use transparencies (but define them only). This is
- -- somewhat messy.
- local stamp = format(template,a,t)
- local n = registered[stamp]
- if not n then
- n = #values + 1
- values[n] = { a, t }
- registered[stamp] = n
- if force then
- register_transparency(n,a,t)
+function attributes.ofnode(n)
+ local a = n.attr
+ if a then
+ a = a.next
+ while a do
+ local number, value = a.number, a.value
+ texio.write_nl(format("%s : attribute %3i, value %4i, name %s",tostring(n),number,value,names[number] or '?'))
+ a = a.next
end
- elseif force and not data[n] then
- register_transparency(n,a,t)
- end
- return registered[stamp]
-end
-
-local function extender(transparencies,key)
- if key == "none" then
- local d = inject_transparency(0)
- transparencies.none = d
- return d
- end
-end
-
-local function reviver(data,n)
- local v = values[n]
- local d
- if not v then
- d = inject_transparency(0)
- else
- d = inject_transparency(n)
- register_transparency(n,v[1],v[2])
- end
- data[n] = d
- return d
-end
-
-setmetatable(transparencies, { __index = extender })
-setmetatable(transparencies.data, { __index = reviver }) -- register if used
-
--- check if there is an identity
-
-function transparencies.value(id)
- return values[id]
-end
-
-shipouts.handle_transparency = nodes.install_attribute_handler {
- name = "transparency",
- namespace = transparencies,
- initializer = states.initialize,
- finalizer = states.finalize,
- processor = states.process,
-}
-
-function transparencies.enable()
- tasks.enableaction("shipouts","shipouts.handle_transparency")
-end
-
---- colorintents: overprint / knockout
-
-colorintents = colorintents or { }
-colorintents.data = colorintents.data or { }
-colorintents.attribute = attributes.private('colorintent')
-
-colorintents.registered = {
- overprint = 1,
- knockout = 2,
-}
-
-local data, registered = colorintents.data, colorintents.registered
-
-local function extender(colorintents,key)
- if key == "none" then
- local d = data[2]
- colorintents.none = d
- return d
- end
-end
-
-local function reviver(data,n)
- if n == 1 then
- local d = nodeinjections.overprint() -- called once
- data[1] = d
- return d
- elseif n == 2 then
- local d = nodeinjections.knockout() -- called once
- data[2] = d
- return d
- end
-end
-
-setmetatable(colorintents, { __index = extender })
-setmetatable(colorintents.data, { __index = reviver })
-
-function colorintents.register(stamp)
- return registered[stamp] or registered.overprint
-end
-
-shipouts.handle_colorintent = nodes.install_attribute_handler {
- name = "colorintent",
- namespace = colorintents,
- initializer = states.initialize,
- finalizer = states.finalize,
- processor = states.process,
-}
-
-function colorintents.enable()
- tasks.enableaction("shipouts","shipouts.handle_colorintent")
-end
-
---- negative / positive
-
-negatives = negatives or { }
-negatives.data = negatives.data or { }
-negatives.attribute = attributes.private("negative")
-
-negatives.registered = {
- positive = 1,
- negative = 2,
-}
-
-local data, registered = negatives.data, negatives.registered
-
-local function extender(negatives,key)
- if key == "none" then
- local d = data[1]
- negatives.none = d
- return d
- end
-end
-
-local function reviver(data,n)
- if n == 1 then
- local d = nodeinjections.positive() -- called once
- data[1] = d
- return d
- elseif n == 2 then
- local d = nodeinjections.negative() -- called once
- data[2] = d
- return d
- end
+ end
end
-setmetatable(negatives, { __index = extender })
-setmetatable(negatives.data, { __index = reviver })
+-- interface
-function negatives.register(stamp)
- return registered[stamp] or registered.positive
-end
-
-shipouts.handle_negative = nodes.install_attribute_handler {
- name = "negative",
- namespace = negatives,
- initializer = states.initialize,
- finalizer = states.finalize,
- processor = states.process,
-}
-
-function negatives.enable()
- tasks.enableaction("shipouts","shipouts.handle_negative")
-end
-
--- effects -- can be optimized (todo: metatables)
-
-effects = effects or { }
-effects.data = effects.data or { }
-effects.values = effects.values or { }
-effects.registered = effects.registered or { }
-effects.stamp = "%s:%s:%s"
-effects.attribute = attributes.private("effect")
-
-storage.register("effects/registered", effects.registered, "effects.registered")
-storage.register("effects/values", effects.values, "effects.values")
-
-local data, registered, values = effects.data, effects.registered, effects.values
-
--- valid effects: normal inner outer both hidden (stretch,rulethickness,effect)
-
-local function effect(...) effect = nodeinjections.effect return effect(...) end
-
-local function extender(effects,key)
- if key == "none" then
- local d = effect(0,0,0)
- effects.none = d
- return d
- end
-end
-
-local function reviver(data,n)
- local e = values[n] -- we could nil values[n] now but hardly needed
- local d = effect(e[1],e[2],e[3])
- data[n] = d
- return d
-end
-
-setmetatable(effects, { __index = extender })
-setmetatable(effects.data, { __index = reviver })
-
-function effects.register(effect,stretch,rulethickness)
- local stamp = format(effects.stamp,effect,stretch,rulethickness)
- local n = registered[stamp]
- if not n then
- n = #values + 1
- values[n] = { effect, stretch, rulethickness }
- registered[stamp] = n
- end
- return n
-end
-
-shipouts.handle_effect = nodes.install_attribute_handler {
- name = "effect",
- namespace = effects,
- initializer = states.initialize,
- finalizer = states.finalize,
- processor = states.process,
-}
-
-function effects.enable()
- tasks.enableaction("shipouts","shipouts.handle_effect")
-end
-
--- layers (ugly code, due to no grouping and such); currently we use exclusive layers
--- but when we need it stacked layers might show up too; the next function based
--- approach can be replaced by static (metatable driven) resolvers
-
-viewerlayers = viewerlayers or { }
-viewerlayers.data = viewerlayers.data or { }
-viewerlayers.registered = viewerlayers.registered or { }
-viewerlayers.values = viewerlayers.values or { }
-viewerlayers.listwise = viewerlayers.listwise or { }
-viewerlayers.attribute = attributes.private("viewerlayer")
-
-storage.register("viewerlayers/registered", viewerlayers.registered, "viewerlayers.registered")
-storage.register("viewerlayers/values", viewerlayers.values, "viewerlayers.values")
-
-local data = viewerlayers.data
-local values = viewerlayers.values
-local listwise = viewerlayers.listwise
-local registered = viewerlayers.registered
-local template = "%s"
-
--- stacked
-
-local function extender(viewerlayers,key)
- if key == "none" then
- local d = nodeinjections.stoplayer()
- viewerlayers.none = d
- return d
- end
-end
-
-local function reviver(data,n)
- local d = nodeinjections.startlayer(values[n])
- data[n] = d
- return d
-end
-
-setmetatable(viewerlayers, { __index = extender })
-setmetatable(viewerlayers.data, { __index = reviver })
-
-local function initializer(...)
- return states.initialize(...)
-end
-
-viewerlayers.register = function(name,lw) -- if not inimode redefine data[n] in first call
- local stamp = format(template,name)
- local n = registered[stamp]
- if not n then
- n = #values + 1
- values[n] = name
- registered[stamp] = n
- listwise[n] = lw or false
- end
- return registered[stamp] -- == n
-end
-
-shipouts.handle_viewerlayer = nodes.install_attribute_handler {
- name = "viewerlayer",
- namespace = viewerlayers,
- initializer = initializer,
- finalizer = states.finalize,
- processor = states.stacked,
-}
+commands.defineattribute = attributes.define
-function viewerlayers.enable()
- tasks.enableaction("shipouts","shipouts.handle_viewerlayer")
+function commands.getprivateattribute(name)
+ context(attributes.private(name))
end
diff --git a/Master/texmf-dist/tex/context/base/attr-ini.mkiv b/Master/texmf-dist/tex/context/base/attr-ini.mkiv
index 87d06c48a44..ba6ca369fc5 100644
--- a/Master/texmf-dist/tex/context/base/attr-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/attr-ini.mkiv
@@ -14,14 +14,13 @@
\writestatus{loading}{ConTeXt Attribute Macros / Initialization}
%D Although it's still somewhat experimental, here we introduce code
-%D related to attributes.
+%D related to attributes. Housekeeping will move completely to Lua
+%D and \newattribute will go away.
\unprotect
\registerctxluafile{attr-ini}{1.001}
-%D This might move:
-
\def\pushattribute#1%
{\global\advance\csname\??ae:\string#1\endcsname\plusone
\global\expandafter\mathchardef\csname\??ae:\string#1:\number\csname\??ae:\string#1\endcsname\endcsname\attribute#1}
@@ -33,138 +32,64 @@
\def\installattributestack#1%
{\expandafter\newcount\csname\??ae:\string#1\endcsname}
-%D For the moment we put this here (later it will move to where it's used):
-
-\definesystemattribute[state]
-\definesystemattribute[skip]
-\definesystemattribute[penalty]
-\definesystemattribute[colormodel][global] \chardef\colormodelattribute \dogetattributeid{colormodel}
-\definesystemattribute[color] \chardef\colorattribute \dogetattributeid{color}
-\definesystemattribute[transparency] \chardef\transparencyattribute \dogetattributeid{transparency}
-\definesystemattribute[background] \chardef\backgroundattribute \dogetattributeid{background}
-\definesystemattribute[colorintent] \chardef\colorintentattribute \dogetattributeid{colorintent}
-\definesystemattribute[negative] \chardef\negativeattribute \dogetattributeid{negative}
-\definesystemattribute[effect] \chardef\effectattribute \dogetattributeid{effect}
-\definesystemattribute[viewerlayer] \chardef\viewerlayerattribute \dogetattributeid{viewerlayer}
-\definesystemattribute[layoutcomponent] \chardef\layoutcomponentattribute\dogetattributeid{layoutcomponent}
-\definesystemattribute[reference] \chardef\referenceattribute \dogetattributeid{reference}
-\definesystemattribute[destination] \chardef\destinationattribute \dogetattributeid{destination}
-\definesystemattribute[graphicvadjust] \chardef\graphicvadjustattribute \dogetattributeid{graphicvadjust}
-\definesystemattribute[ruled] \chardef\ruledattribute \dogetattributeid{ruled}
-\definesystemattribute[shifted] \chardef\shiftedattribute \dogetattributeid{shifted}
-
-% \definesystemattribute[ignore]
-%
-% \edef\startignorecontent{\dosetattribute{ignore}\plusone}
-% \edef\stopignorecontent {\doresetattribute{ignore}}
-
-% todo: no need for 'color' argument, we can set that once at startup; currently
-% a bit inconsistent
-
-% 1=off 2=gray 3=spot 4=rgb 5=cmyk 6=cmy % only 1/2/4/5 are supported
-%
-% We could combine this in one attribute but this is not faster and also
-% less flexible because sometimes we want to freeze the attribute bit.
-%
-% Watch out: real color support will be implemented later.
-
-\newcount\currentcolormodel
-
-\def\dosetcolormodel#1%
- {\currentcolormodel\ctxlua{tex.print(colors.setmodel('#1'))}%
- \attribute\colormodelattribute\currentcolormodel}
-
-\dosetcolormodel{all}
-
-\appendtoks
- \dosetcolormodel{all}% redundant?
-\to \everyjob
-
-\def\registerrgbcolor #1#2#3#4{\ctxlua{colors.register('#1','rgb' ,#2,#3,#4)}}
-\def\registercmykcolor#1#2#3#4#5{\ctxlua{colors.register('#1','cmyk',#2,#3,#4,#5)}}
-\def\registergraycolor #1#2{\ctxlua{colors.register('#1','gray',#2)}}
-
-% transparency
-
-\def\registertransparency#1#2#3%
- {\setevalue{(ts:#1)}{\attribute\transparencyattribute\ctxlua{tex.write(transparencies.register(#2,#3))} }}
+\newtoks \attributesresetlist
-\def\sometransparencyswitch#1{\csname(ts:#1)\endcsname}
+\ifdefined \s!global \else \def\s!global{global} \fi % for metatex % or hard check later
+\ifdefined \s!public \else \def\s!public{public} \fi % for metatex % or hard check later
-\def\sometransparencyswitch
- {\ctxlua{transparencies.enable()}%
- \gdef\sometransparencyswitch##1{\csname(ts:##1)\endcsname}%
- \sometransparencyswitch}
+\unexpanded\def\defineattribute
+ {\dodoubleempty\dodefineattribute}
-% \registertransparency {one} {1} {.5}
-% \registertransparency {two} {1} {.6}
+\def\dodefineattribute[#1][#2]% alternatively we can let lua do the housekeeping
+ {\expandafter\newattribute\csname @attr@#1\endcsname
+ \expandafter\newconstant \csname :attr:#1\endcsname
+ \csname :attr:#1\endcsname\lastallocatedattribute
+ \ctxcommand{defineattribute("#1",\number\lastallocatedattribute)}%
+ %\writestatus\m!system{defining attribute #1 with number \number\lastallocatedattribute}%
+ \doifnotinset\s!global{#2}{\appendetoks\csname @attr@#1\endcsname\attributeunsetvalue\to\attributesresetlist}%
+ \doifinset \s!public{#2}{\expandafter\let\csname#1attribute\expandafter\endcsname\csname :attr:#1\endcsname}}
-% overprint
+\unexpanded\def\definesystemattribute
+ {\dodoubleempty\dodefinesystemattribute}
-\def\registercolorintent#1#2%
- {\setevalue{(os:#1)}{\attribute\colorintentattribute\ctxlua{tex.write(colorintents.register('#2'))} }}
+\def\dodefinesystemattribute[#1][#2]% alternatively we can let lua do the housekeeping
+ {\scratchcounter\ctxcommand{getprivateattribute("#1")}\relax
+ \expandafter\attributedef\csname @attr@#1\endcsname\scratchcounter
+ \expandafter\newconstant \csname :attr:#1\endcsname
+ \csname :attr:#1\endcsname\scratchcounter
+ %\writestatus\m!system{defining system attribute #1 with number \number\scratchcounter}%
+ \doifnotinset\s!global{#2}{\appendetoks\csname @attr@#1\endcsname\attributeunsetvalue\to\attributesresetlist}%
+ \doifinset \s!public{#2}{\expandafter\let\csname#1attribute\expandafter\endcsname\csname :attr:#1\endcsname}}
-\def\dotriggercolorintent
- {\ctxlua{colorintents.enable()}%
- \gdef\dotriggercolorintent##1{\csname(os:##1)\endcsname}%
- \dotriggercolorintent}
+% expandable so we can \edef them for speed
-\registercolorintent{knockout} {knockout}
-\registercolorintent{overprint}{overprint}
+\def\dosetattribute#1#2{\csname @attr@#1\endcsname#2\relax}
+\def\doresetattribute#1{\csname @attr@#1\endcsname\attributeunsetvalue}
+\def\dogetattribute #1{\number\csname @attr@#1\endcsname}
+\def\dogetattributeid#1{\number\csname :attr:#1\endcsname}
-\installattributestack\colorintentattribute
+\let\dompattribute\gobbletwoarguments
-\setevalue{(os:#\v!none}{\attribute\colorintentattribute\attributeunsetvalue} % does this work out ok?
+\def\resetallattributes{\the\attributesresetlist}
-% negative
-
-\def\registernegative#1#2%
- {\setevalue{(ns:#1)}{\attribute\negativeattribute\ctxlua{tex.write(negatives.register('#2'))} }}
-
-\def\dotriggernegative
- {\ctxlua{negatives.enable()}%
- \gdef\dotriggernegative##1{\csname(ns:##1)\endcsname}%
- \dotriggernegative}
-
-\registernegative{positive}{positive}
-\registernegative{negative}{negative}
-
-% effect
-
-\def\registereffect#1#2#3% #2=stretch #3=rulethickness
- {\setxvalue{(es:#1:#2:\number\dimexpr#3\relax)}%
- {\attribute\effectattribute\ctxlua{tex.write(effects.register('#1',#2,\number\dimexpr#3\relax))} }}
-
-\def\dotriggereffect
- {\ctxlua{effects.enable()}%
- \gdef\dotriggereffect##1##2##3%
- {\ifcsname(es:##1:##2:\number\dimexpr##3\relax)\endcsname\else\registereffect{##1}{##2}{##3}\fi
- \csname(es:##1:##2:\number\dimexpr##3\relax)\endcsname}%
- \dotriggereffect}
-
-% \registereffect{normal}
-% \registereffect{inner}
-% \registereffect{outer}
-% \registereffect{both}
-% \registereffect{hidden}
-
-% viewerlayers (will probably change a bit)
-
-% needs to work over stopitemize grouping etc
-
-\def\registerviewerlayer#1#2% global !
- {\setxvalue{(vl:#1)}{\global\attribute\viewerlayerattribute\ctxlua{tex.write(viewerlayers.register('#2'))} }}
-
-\setevalue{(vl:)}{\global\attribute\viewerlayerattribute\attributeunsetvalue}
+%D For the moment we put this here (later it will move to where it's used):
-\def\dotriggerviewerlayer
- {\ctxlua{viewerlayers.enable()}%
- \gdef\dotriggerviewerlayer##1{\csname(vl:##1)\endcsname}%
- \dotriggerviewerlayer}
+\definesystemattribute [state]
+\definesystemattribute [skip]
+\definesystemattribute [penalty]
+\definesystemattribute [colormodel] [public,global]
+\definesystemattribute [color] [public]
+\definesystemattribute [transparency] [public]
+\definesystemattribute [background] [public]
+\definesystemattribute [colorintent] [public]
+\definesystemattribute [negative] [public]
+\definesystemattribute [effect] [public]
+\definesystemattribute [viewerlayer] [public]
+\definesystemattribute [layoutcomponent] [public]
+\definesystemattribute [reference] [public]
+\definesystemattribute [destination] [public]
+\definesystemattribute [internal] [public]
+\definesystemattribute [ruled] [public]
+\definesystemattribute [shifted] [public]
\protect \endinput
-
-% test case
-%
-% {\green \hbox to \hsize{\leaders\hrule \hfill a}\par}
-% {\red \hbox to \hsize{\leaders\hbox{x}\hfill a}\par}
diff --git a/Master/texmf-dist/tex/context/base/attr-lay.lua b/Master/texmf-dist/tex/context/base/attr-lay.lua
new file mode 100644
index 00000000000..e12938fa45e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/attr-lay.lua
@@ -0,0 +1,191 @@
+if not modules then modules = { } end modules ['attr-lay'] = {
+ version = 1.001,
+ comment = "companion to attr-lay.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- layers (ugly code, due to no grouping and such); currently we use exclusive layers
+-- but when we need it stacked layers might show up too; the next function based
+-- approach can be replaced by static (metatable driven) resolvers
+
+local type = type
+local format = string.format
+local insert, remove = table.insert, table.remove
+
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+
+local report_viewerlayers = logs.reporter("viewerlayers")
+
+-- todo: document this but first reimplement this as it reflects the early
+-- days of luatex / mkiv and we have better ways now
+
+-- nb: attributes: color etc is much slower than normal (marks + literals) but ...
+-- nb. too many "0 g"s
+-- nb: more local tables
+
+local attributes, nodes = attributes, nodes
+
+attributes.viewerlayers = attributes.viewerlayers or { }
+local viewerlayers = attributes.viewerlayers
+
+local variables = interfaces.variables
+local v_local = variables["local"]
+local v_global = variables["global"]
+
+local a_viewerlayer = attributes.private("viewerlayer")
+
+viewerlayers = viewerlayers or { }
+viewerlayers.data = allocate()
+viewerlayers.registered = viewerlayers.registered or { }
+viewerlayers.values = viewerlayers.values or { }
+viewerlayers.scopes = viewerlayers.scopes or { }
+viewerlayers.listwise = allocate()
+viewerlayers.attribute = a_viewerlayer
+viewerlayers.supported = true
+viewerlayers.hasorder = true
+
+local states = attributes.states
+local tasks = nodes.tasks
+local nodeinjections = backends.nodeinjections
+local codeinjections = backends.codeinjections
+
+local texsetattribute = tex.setattribute
+local texgetattribute = tex.getattribute
+local texsettokenlist = tex.settoks
+local unsetvalue = attributes.unsetvalue
+
+storage.register("attributes/viewerlayers/registered", viewerlayers.registered, "attributes.viewerlayers.registered")
+storage.register("attributes/viewerlayers/values", viewerlayers.values, "attributes.viewerlayers.values")
+storage.register("attributes/viewerlayers/scopes", viewerlayers.scopes, "attributes.viewerlayers.scopes")
+
+local data = viewerlayers.data
+local values = viewerlayers.values
+local listwise = viewerlayers.listwise
+local registered = viewerlayers.registered
+local scopes = viewerlayers.scopes
+local template = "%s"
+
+-- stacked
+
+local function extender(viewerlayers,key)
+ if viewerlayers.supported and key == "none" then
+ local d = nodeinjections.stoplayer()
+ viewerlayers.none = d
+ return d
+ end
+end
+
+local function reviver(data,n)
+ if viewerlayers.supported then
+ local v = values[n]
+ if v then
+ local d = nodeinjections.startlayer(v)
+ data[n] = d
+ return d
+ else
+ report_viewerlayers("error, unknown reference '%s'",tostring(n))
+ end
+ end
+end
+
+setmetatableindex(viewerlayers, extender)
+setmetatableindex(viewerlayers.data, reviver)
+
+local function initializer(...)
+ return states.initialize(...)
+end
+
+local function register(name,lw) -- if not inimode redefine data[n] in first call
+ local stamp = format(template,name)
+ local n = registered[stamp]
+ if not n then
+ n = #values + 1
+ values[n] = name
+ registered[stamp] = n
+ listwise[n] = lw or false
+ end
+ return registered[stamp] -- == n
+end
+
+viewerlayers.register = register
+
+attributes.viewerlayers.handler = nodes.installattributehandler {
+ name = "viewerlayer",
+ namespace = viewerlayers,
+ initializer = initializer,
+ finalizer = states.finalize,
+ processor = states.stacked,
+}
+
+function viewerlayers.enable(value)
+ if value == false or not viewerlayers.supported then
+ tasks.disableaction("shipouts","attributes.viewerlayers.handler")
+ else
+ tasks.enableaction("shipouts","attributes.viewerlayers.handler")
+ end
+end
+
+function viewerlayers.forcesupport(value)
+ viewerlayers.supported = value
+ report_viewerlayers("viewerlayers are %ssupported",value and "" or "not ")
+ viewerlayers.enable(value)
+end
+
+function viewerlayers.setfeatures(hasorder)
+ viewerlayers.hasorder = hasorder
+end
+
+local stack, enabled, global = { }, false, false
+
+function viewerlayers.start(name)
+ if not enabled then
+ viewerlayers.enable(true)
+ end
+ insert(stack,texgetattribute(a_viewerlayer))
+ local a = register(name) or unsetvalue
+ if global or scopes[name] == v_global then
+ scopes[a] = v_global -- messy but we don't know the attributes yet
+ texsetattribute("global",a_viewerlayer,a)
+ else
+ texsetattribute(a_viewerlayer,a)
+ end
+ texsettokenlist("currentviewerlayertoks",name)
+end
+
+function viewerlayers.stop()
+ local a = remove(stack)
+ if a >= 0 then
+ if global or scopes[a] == v_global then
+ texsetattribute("global",a_viewerlayer,a)
+ else
+ texsetattribute(a_viewerlayer,a)
+ end
+ texsettokenlist("currentviewerlayertoks",values[a])
+ else
+ if global or scopes[a] == v_global then
+ texsetattribute("global",a_viewerlayer,unsetvalue)
+ else
+ texsetattribute(a_viewerlayer,unsetvalue)
+ end
+ texsettokenlist("currentviewerlayertoks","")
+ end
+end
+
+function viewerlayers.define(settings)
+ local tag = settings.tag
+ if not tag or tag == "" then
+ -- error
+ elseif not scopes[tag] then -- prevent duplicates
+ local title = settings.title
+ if not title or title == "" then
+ settings.title = tag
+ end
+ scopes[tag] = settings.scope or v_local
+ codeinjections.defineviewerlayer(settings)
+ end
+end
+
+commands.defineviewerlayer = viewerlayers.define
diff --git a/Master/texmf-dist/tex/context/base/attr-lay.mkiv b/Master/texmf-dist/tex/context/base/attr-lay.mkiv
new file mode 100644
index 00000000000..b1f3c944e46
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/attr-lay.mkiv
@@ -0,0 +1,106 @@
+%D \module
+%D [ file=attr-lay,
+%D version=2007.06.06,
+%D title=\CONTEXT\ Attribute Macros,
+%D subtitle=Viewerlayers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%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 Attribute Macros / Viewerlayers}
+
+\unprotect
+
+\def\c!printable{printable} % todo
+
+\registerctxluafile{attr-lay}{1.001}
+
+% needs to work over stopitemize grouping etc
+
+\def\registerviewerlayer#1#2% global !
+ {\setxvalue{(vl:#1)}{\global\attribute\viewerlayerattribute\ctxlua{tex.write(attributes.viewerlayers.register('#2'))} }}
+
+\setevalue{(vl:)}{\global\attribute\viewerlayerattribute\attributeunsetvalue}
+
+\def\dotriggerviewerlayer % move to lua
+ {\ctxlua{attributes.viewerlayers.enable()}%
+ \gdef\dotriggerviewerlayer##1{\csname(vl:##1)\endcsname}%
+ \dotriggerviewerlayer}
+
+\getparameters
+ [\??lr]
+ [\c!state=\v!start,
+ \c!title=,
+ \c!printable=\v!yes,
+ \c!scope=\v!local, % maybe global but needs checking with layout
+ \c!method=\v!none]
+
+\def\defineviewerlayer
+ {\dodoubleargument\dodefineviewerlayer}
+
+\def\dodefineviewerlayer[#1][#2]% document wide properties
+ {\begingroup
+ \getparameters[\??lr][#2]%
+ \ctxcommand{defineviewerlayer{
+ tag = "#1",
+ title = "\@@lrtitle",
+ visible = "\@@lrstate",
+ editable = "\v!yes",
+ printable = "\@@lrprintable",
+ scope = "\@@lrscope"
+ }}%
+ \doif\@@lrmethod\v!command
+ {\setugvalue{\e!start#1}{\startviewerlayer[#1]}%
+ \setugvalue{\e!stop #1}{\stopviewerlayer }}%
+ \endgroup}
+
+\unexpanded\def\startviewerlayer[#1]{\ctxlua{attributes.viewerlayers.start("#1")}} % not grouped
+\unexpanded\def\stopviewerlayer {\ctxlua{attributes.viewerlayers.stop()}} % not grouped
+\unexpanded\def\viewerlayer [#1]{\groupedcommand{\startviewerlayer[#1]}{\stopviewerlayer}} % grouped
+
+% some day we will keep this at the lua end as the info is only needed there
+
+\let\currentviewerlayer\empty \newtoks\currentviewerlayertoks % soon we can set macros at the lua end
+
+\def\currentviewerlayer{\the\currentviewerlayertoks}
+
+\appendtoks
+ \let\currentviewerlayer\empty
+\to \everypagebody
+
+% layout components are implemented rather directly (speed)
+
+\def\doinitializelayoutcomponent#1#2%
+ {\ctxcommand{defineviewerlayer{% this will move to the lua end i.e be merged with register
+ tag = "#1:#2",
+ title = "#1 #2",
+ visible = "\v!start",
+ editable = "\v!yes",
+ printable = "\v!yes"
+ }}%
+ \edef\layoutcomponentboxattribute{attr \viewerlayerattribute \ctxlua{tex.write(attributes.viewerlayers.register('#1:#2',true))}\relax}%
+ \expandafter\glet\csname\??ly>#1:#2\endcsname\layoutcomponentboxattribute}
+
+\def\dosetlayoutcomponentattribute#1#2% make this faster
+ {\expandafter\let\expandafter\layoutcomponentboxattribute\csname\??ly>#1:#2\endcsname
+ \ifx\layoutcomponentboxattribute\relax
+ \doinitializelayoutcomponent{#1}{#2}% get rid of { }
+ \fi}
+
+\def\doresetlayoutcomponentattribute
+ {\let\layoutcomponentboxattribute\empty}
+
+\let\setlayoutcomponentattribute \gobbletwoarguments
+\let\resetlayoutcomponentattribute\relax
+\let\layoutcomponentboxattribute \empty
+
+\def\showlayoutcomponents
+ {\ctxlua{attributes.viewerlayers.enable()}%
+ \let\setlayoutcomponentattribute \dosetlayoutcomponentattribute
+ \let\resetlayoutcomponentattribute\doresetlayoutcomponentattribute}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/attr-neg.lua b/Master/texmf-dist/tex/context/base/attr-neg.lua
new file mode 100644
index 00000000000..766295a16fd
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/attr-neg.lua
@@ -0,0 +1,95 @@
+if not modules then modules = { } end modules ['attr-neg'] = {
+ version = 1.001,
+ comment = "companion to attr-neg.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this module is being reconstructed and code will move to other places
+-- we can also do the nsnone via a metatable and then also se index 0
+
+local format = string.format
+
+
+local attributes, nodes = attributes, nodes
+
+local states = attributes.states
+local tasks = nodes.tasks
+local nodeinjections = backends.nodeinjections
+local settexattribute = tex.setattribute
+local variables = interfaces.variables
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+
+--- negative / positive
+
+attributes.negatives = attributes.negatives or { }
+local negatives = attributes.negatives
+
+local a_negative = attributes.private("negative")
+
+negatives.data = allocate()
+negatives.attribute = a_negative
+
+negatives.registered = allocate {
+ [variables.positive] = 1,
+ [variables.negative] = 2,
+}
+
+local data = negatives.data
+local registered = negatives.registered
+
+local function extender(negatives,key)
+ if key == "none" then
+ local d = data[1]
+ negatives.none = d
+ return d
+ end
+end
+
+local function reviver(data,n)
+ if n == 1 then
+ local d = nodeinjections.positive() -- called once
+ data[1] = d
+ return d
+ elseif n == 2 then
+ local d = nodeinjections.negative() -- called once
+ data[2] = d
+ return d
+ end
+end
+
+setmetatableindex(negatives, extender)
+setmetatableindex(negatives.data, reviver)
+
+negatives.handler = nodes.installattributehandler {
+ name = "negative",
+ namespace = negatives,
+ initializer = states.initialize,
+ finalizer = states.finalize,
+ processor = states.process,
+}
+
+local function register(stamp)
+ return registered[stamp] or registered.positive
+end
+
+local function enable()
+ tasks.enableaction("shipouts","attributes.negatives.handler")
+end
+
+negatives.register = register
+negatives.enable = enable
+
+-- interface
+
+local enabled = false
+
+function commands.triggernegative(stamp)
+ if not enabled then
+ enable()
+ enabled = true
+ end
+ settexattribute(a_negative,register(stamp))
+end
diff --git a/Master/texmf-dist/tex/context/base/attr-neg.mkiv b/Master/texmf-dist/tex/context/base/attr-neg.mkiv
new file mode 100644
index 00000000000..2b817bb711a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/attr-neg.mkiv
@@ -0,0 +1,30 @@
+%D \module
+%D [ file=attr-neg,
+%D version=2007.06.06,
+%D title=\CONTEXT\ Attribute Macros,
+%D subtitle=Negation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%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 Attribute Macros / Negation}
+
+\registerctxluafile{attr-neg}{1.001}
+
+\unprotect
+
+% positive and negative are preregistered
+
+\def\dotriggernegative#1{\ctxcommand{triggernegative('#1'))}}
+
+\unexpanded\def\startnegative{\dotriggernegative\v!negative}
+\unexpanded\def\stopnegative {\dotriggernegative\v!positive}
+
+\unexpanded\def\startpositive{\dotriggernegative\v!positive}
+\unexpanded\def\stoppositive {\dotriggernegative\v!negative}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/back-exp.lua b/Master/texmf-dist/tex/context/base/back-exp.lua
new file mode 100644
index 00000000000..7f52223a17b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/back-exp.lua
@@ -0,0 +1,1381 @@
+if not modules then modules = { } end modules ['back-exp'] = {
+ version = 1.001,
+ comment = "companion to back-exp.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- 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)
+
+-- Because we need to look ahead we now always build a tree (this was optional in
+-- the beginning). The extra overhead in the frontend is neglectable.
+
+-- We can consider replacing attributes by the hash entry ... slower in resolving but it's still
+-- quite okay.
+
+-- todo: less attributes e.g. internal only first node
+-- todo: build xml tree in mem (handy for cleaning)
+
+-- delimited: left/right string (needs marking)
+
+local nodecodes = nodes.nodecodes
+local traverse_nodes = node.traverse
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+
+local function locate(start,wantedid,wantedsubtype)
+ for n in traverse_nodes(start) do
+ local id = n.id
+ if id == wantedid then
+ if not wantedsubtype or n.subtype == wantedsubtype then
+ return n
+ end
+ elseif id == hlist_code or id == vlist_code then
+ local found = locate(n.list,wantedid,wantedsubtype)
+ if found then
+ return found
+ end
+ end
+ end
+end
+
+nodes.locate = locate
+
+local next, type = next, type
+local format, match, concat, rep, sub, gsub, gmatch = string.format, string.match, table.concat, string.rep, string.sub, string.gsub, string.gmatch
+local lpegmatch = lpeg.match
+local utfchar, utfsub = utf.char, utf.sub
+local insert, remove = table.insert, table.remove
+
+local trace_export = false trackers.register ("structures.export", function(v) trace_export = v end)
+local trace_spaces = false trackers.register ("structures.export.spaces", function(v) trace_spaces = v end)
+local trace_tree = false trackers.register ("structures.export.showtree", function(v) trace_tree = v end)
+local less_state = false directives.register("structures.export.lessstate", function(v) less_state = v end)
+local page_breaks = false directives.register("structures.export.pagebreaks", function(v) page_breaks = v end)
+
+local report_export = logs.reporter("backend","export")
+
+local nodes = nodes
+local attributes = attributes
+local variables = interfaces.variables
+
+local settings_to_array = utilities.parsers.settings_to_array
+
+local setmetatableindex = table.setmetatableindex
+local tasks = nodes.tasks
+local fontchar = fonts.hashes.characters
+local languagenames = languages.numbers
+
+local nodecodes = nodes.nodecodes
+local skipcodes = nodes.skipcodes
+local whatsitcodes = nodes.whatsitcodes
+local listcodes = nodes.listcodes
+
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local glyph_code = nodecodes.glyph
+local glue_code = nodecodes.glue
+local kern_code = nodecodes.kern
+local disc_code = nodecodes.disc
+local insert_code = nodecodes.insert
+local whatsit_code = nodecodes.whatsit
+local refximage_code = whatsitcodes.pdfrefximage
+
+local userskip_code = skipcodes.userskip
+local rightskip_code = skipcodes.rightskip
+local parfillskip_code = skipcodes.parfillskip
+
+local line_code = listcodes.line
+
+local a_tagged = attributes.private('tagged')
+local a_image = attributes.private('image')
+
+local a_taggedalign = attributes.private("taggedalign")
+local a_taggedcolumns = attributes.private("taggedcolumns")
+local a_taggedrows = attributes.private("taggedrows")
+local a_taggedpar = attributes.private("taggedpar")
+local a_taggedpacked = attributes.private("taggedpacked")
+local a_taggedsymbol = attributes.private("taggedsymbol")
+local a_taggedinsert = attributes.private("taggedinsert")
+local a_taggedtag = attributes.private("taggedtag")
+
+local a_reference = attributes.private('reference')
+
+local has_attribute = node.has_attribute
+local traverse_nodes = node.traverse
+local slide_nodelist = node.slide
+local texattribute = tex.attribute
+local unsetvalue = attributes.unsetvalue
+local locate_node = nodes.locate
+
+local references = structures.references
+local structurestags = structures.tags
+local taglist = structurestags.taglist
+local properties = structurestags.properties
+local userdata = structurestags.userdata -- might be combines with taglist
+local tagdata = structurestags.data
+
+local starttiming = statistics.starttiming
+local stoptiming = statistics.stoptiming
+
+-- todo: more locals (and optimize)
+
+local version = "0.20"
+local result = nil -- todo: nofresult
+local entry = nil
+local attributehash = { }
+local hyphen = utfchar(0xAD) -- todo: also emdash etc
+local colonsplitter = lpeg.splitat(":")
+local dashsplitter = lpeg.splitat("-")
+local threshold = 65536
+local indexing = false
+local linedone = false
+local inlinedepth = 0
+local tree = { data = { }, depth = 0 } -- root
+local treestack = { }
+local treehash = { }
+local extras = { }
+local nofbreaks = 0
+local used = { }
+local exporting = false
+local last = nil
+local lastpar = nil
+
+setmetatableindex(used, function(t,k)
+ if k then
+ local v = { }
+ t[k] = v
+ return v
+ end
+end)
+
+local joiner_1 = " "
+local joiner_2 = " " -- todo: test if this one can always be ""
+local joiner_3 = " "
+local joiner_4 = " "
+local joiner_5 = " "
+local joiner_6 = " "
+local joiner_7 = "\n"
+local joiner_8 = " "
+local joiner_9 = " "
+local joiner_0 = " "
+
+local namespaced = {
+ -- filled on
+}
+
+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",
+}
+
+setmetatableindex(namespaced, function(t,k)
+ local namespace = namespaces[k]
+ local v = namespace and namespace .. ":" .. k or k
+ t[k] = v
+ return v
+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 listdata = { }
+
+local function hashlistdata()
+ local c = structures.lists.collected
+ for i=1,#c do
+ local ci = c[i]
+ local tag = ci.references.tag
+ if tag then
+ listdata[ci.metadata.kind .. ":" .. ci.metadata.name .. "-" .. tag] = ci
+ end
+ end
+end
+
+local spaces = { } -- watch how we also moved the -1 in depth-1 to the creator
+
+setmetatableindex(spaces, function(t,k) t[k] = rep(" ",k-1) return t[k] end)
+
+properties.vspace = { export = "break", nature = "display" }
+properties.pbreak = { export = "pagebreak", nature = "display" }
+
+local function makebreak(entry)
+ nofbreaks = nofbreaks + 1
+ local t, tl = { }, entry[1]
+ if tl then
+ for i=1,#tl do
+ t[i] = tl[i]
+ end
+ end
+ t[#t+1] = "break-" .. nofbreaks
+ return { t, { "" }, 0, 0 }
+end
+
+local function makebreaknode(node)
+ nofbreaks = nofbreaks + 1
+ return {
+ tg = "break",
+ fulltag = "break-" .. nofbreaks,
+ n = nofbreaks,
+ depth = node.depth,
+ element = "break",
+ nature = "display",
+ data = { },
+ attribute = { } ,
+ parnumber = 0,
+ }
+end
+
+local fields = { "title", "subtitle", "author", "keywords" }
+
+function extras.document(handle,element,detail,n,fulltag,hash)
+ handle:write(format(" language=%q",languagenames[tex.count.mainlanguagenumber]))
+ if not less_state then
+ handle:write(format(" file=%q",tex.jobname))
+ handle:write(format(" date=%q",os.date()))
+ handle:write(format(" context=%q",environment.version))
+ handle:write(format(" version=%q",version))
+ handle:write(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
+ handle:write(format(" %s=%q",key,value))
+ end
+ end
+ end
+end
+
+local snames, snumbers = { }, { }
+
+function structurestags.setitemgroup(packed,symbol,di)
+ local s = snumbers[symbol]
+ if not s then
+ s = #snames + 1
+ snames[s], snumbers[symbol] = symbol, s
+ end
+ texattribute[a_taggedpacked] = packed and 1 or unsetvalue
+ texattribute[a_taggedsymbol] = s
+end
+
+-- todo: per class
+
+local synonymnames, synonymnumbers = { }, { } -- can be one hash
+
+function structurestags.setsynonym(class,tag)
+ local s = synonymnumbers[tag]
+ if not s then
+ s = #synonymnames + 1
+ synonymnames[s], synonymnumbers[tag] = tag, s
+ end
+ texattribute[a_taggedtag] = s
+end
+
+local sortingnames, sortingnumbers = { }, { } -- can be one hash
+
+function structurestags.setsorting(class,tag)
+ local s = sortingnumbers[tag]
+ if not s then
+ s = #sortingnames + 1
+ sortingnames[s], sortingnumbers[tag] = tag, s
+ end
+ texattribute[a_taggedtag] = s
+end
+
+local insertids = { }
+
+function structurestags.setdescriptionid(tag,n)
+ local nd = structures.notes.get(tag,n) -- todo: use listdata instead
+ if nd then
+ local r = nd.references
+ texattribute[a_taggedinsert] = r.internal or unsetvalue
+ else
+ texattribute[a_taggedinsert] = unsetvalue
+ end
+end
+
+function extras.descriptiontag(handle,element,detail,n,fulltag,di)
+ local hash = attributehash[fulltag]
+ if hash then
+ local v = hash.insert
+ v = v and insertids[v]
+ if v then
+ handle:write(" insert='",v,"'")
+ end
+ end
+end
+
+function extras.descriptionsymbol(handle,element,detail,n,fulltag,di)
+ local hash = attributehash[fulltag]
+ if hash then
+ local v = hash.insert
+ v = v and insertids[v]
+ if v then
+ handle:write(" insert='",v,"'")
+ end
+ end
+end
+
+function extras.synonym(handle,element,detail,n,fulltag,di)
+ local hash = attributehash[fulltag]
+ if hash then
+ local v = hash.tag
+ v = v and synonymnames[v]
+ if v then
+ handle:write(" tag='",v,"'")
+ end
+ end
+end
+
+function extras.sorting(handle,element,detail,n,fulltag,di)
+ local hash = attributehash[fulltag]
+ if hash then
+ local v = hash.tag
+ v = v and sortingnames[v]
+ if v then
+ handle:write(" tag='",v,"'")
+ end
+ end
+end
+
+function extras.image(handle,element,detail,n,fulltag,di)
+ local hash = attributehash[fulltag]
+ if hash then
+ local v = hash.imageindex
+ if v then
+ local figure = img.ofindex(v)
+ if figure then
+ local fullname = figure.filepath
+ local name = file.basename(fullname)
+ local path = file.dirname(fullname)
+ local page = figure.page or 1
+ if name ~= "" then
+ handle:write(" name='",name,"'")
+ end
+ if path ~= "" then
+ handle:write(" path='",path,"'")
+ end
+ if page > 1 then
+ handle:write(" page='",page,"'")
+ end
+ end
+ end
+ end
+end
+
+-- quite some code deals with exporting references --
+
+local evaluators = { }
+local specials = { }
+
+evaluators.inner = function(handle,var)
+ local inner = var.inner
+ if var.inner then
+ handle:write(" location='",inner,"'")
+ end
+end
+
+evaluators.outer = function(handle,var)
+ local file, url = references.checkedfileorurl(var.outer,var.outer)
+ if url then
+ handle:write(" url='",url,"'")
+ elseif file then
+ handle:write(" file='",file,"'")
+ end
+end
+
+evaluators["outer with inner"] = function(handle,var)
+ local file = references.checkedfile(var.f)
+ if file then
+ handle:write(" file='",file,"'")
+ end
+ local inner = var.inner
+ if var.inner then
+ handle:write(" location='",inner,"'")
+ end
+end
+
+evaluators.special = function(handle,var)
+ local handler = specials[var.special]
+ if handler then
+ handler(handle,var)
+ end
+end
+
+evaluators["special outer with operation"] = evaluators.special
+evaluators["special operation"] = evaluators.special
+evaluators["special operation with arguments"] = evaluators.special
+
+function specials.url(handle,var)
+ local url = references.checkedurl(var.operation)
+ if url then
+ handle:write(" url='",url,"'")
+ end
+end
+
+function specials.file(handle,var)
+ local file = references.checkedfile(var.operation)
+ if file then
+ handle:write(" file='",file,"'")
+ end
+end
+
+function specials.fileorurl(handle,var)
+ local file, url = references.checkedfileorurl(var.operation,var.operation)
+ if url then
+ handle:write(" url='",url,"'")
+ elseif file then
+ handle:write(" file='",file,"'")
+ end
+end
+
+function specials.internal(handle,var)
+ local internal = references.checkedurl(var.operation)
+ if internal then
+ handle:write(" location='aut:",internal,"'")
+ end
+end
+
+local function adddestination(handle,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
+ handle:write(" prefix='",prefix,"'")
+ end
+ handle:write(" destination='",reference,"'")
+ for i=1,#references do
+ local r = references[i]
+ local e = evaluators[r.kind]
+ if e then
+ e(handle,r)
+ end
+ end
+ end
+ end
+end
+
+local function addreference(handle,references)
+ if references then
+ local reference = references.reference
+ if reference and reference ~= "" then
+ local prefix = references.prefix
+ if prefix and prefix ~= "" then
+ handle:write(" prefix='",prefix,"'")
+ end
+ handle:write(" reference='",reference,"'")
+ end
+ local internal = references.internal
+ if internal and internal ~= "" then
+ handle:write(" location='aut:",internal,"'")
+ end
+ end
+end
+
+function extras.link(handle,element,detail,n,fulltag,di)
+ -- for instance in lists a link has nested elements and no own text
+ local hash = attributehash[fulltag]
+ if hash then
+ local references = hash.reference
+ if references then
+ adddestination(handle,structures.references.get(references))
+ end
+ return true
+ else
+ local data = di.data
+ if data then
+ for i=1,#data do
+ local di = data[i]
+ if di and extras.link(handle,element,detail,n,di.fulltag,di) then
+ return true
+ end
+ end
+ end
+ end
+end
+
+function extras.section(handle,element,detail,n,fulltag,di)
+ local data = listdata[fulltag]
+ if data then
+ addreference(handle,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 extras.section(handle,element,detail,n,ft,di) then
+ return true
+ end
+ end
+ end
+ end
+ end
+end
+
+function extras.float(handle,element,detail,n,fulltag,di)
+ local data = listdata[fulltag]
+ if data then
+ addreference(handle,data.references)
+ return true
+ else
+ local data = di.data
+ if data then
+ for i=1,#data do
+ local di = data[i]
+ if di and extras.section(handle,element,detail,n,di.fulltag,di) then
+ return true
+ end
+ end
+ end
+ end
+end
+
+function extras.itemgroup(handle,element,detail,n,fulltag,di)
+ local data = di.data
+ for i=1,#data do
+ local di = data[i]
+ if type(di) == "table" and di.tg == "item" then
+ local ddata = di.data
+ for i=1,#ddata do
+ local ddi = ddata[i]
+ if type(ddi) == "table" then
+ local tg = ddi.tg
+ if tg == "itemtag" or tg == "itemcontent" then
+ local hash = attributehash[ddi.fulltag]
+ if hash then
+ local v = hash.packed
+ if v and v == 1 then
+ handle:write(" packed='yes'")
+ end
+ local v = hash.symbol
+ if v then
+ handle:write(" symbol='",snames[v],"'")
+ end
+ return
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+function extras.tablecell(handle,element,detail,n,fulltag,di)
+ local hash = attributehash[fulltag]
+ if hash then
+ local v = hash.align
+ if not v or v == 0 then
+ -- normal
+ elseif v == 1 then
+ handle:write(" align='flushright'")
+ elseif v == 2 then
+ handle:write(" align='middle'")
+ elseif v == 3 then
+ handle:write(" align='flushleft'")
+ end
+ local v = hash.columns
+ if v and v > 1 then
+ handle:write(" columns='",v,"'")
+ end
+ local v = hash.rows
+ if v and v > 1 then
+ handle:write(" rows='",v,"'")
+ end
+ end
+end
+
+function extras.tabulatecell(handle,element,detail,n,fulltag,di)
+ local hash = attributehash[fulltag]
+ if hash then
+ local v = hash.align
+ if not v or v == 0 then
+ -- normal
+ elseif v == 1 then
+ handle:write(" align='flushright'")
+ elseif v == 2 then
+ handle:write(" align='middle'")
+ elseif v == 3 then
+ handle:write(" align='flushleft'")
+ end
+ end
+end
+
+local function emptytag(handle,element,nature,depth)
+ handle:write("\n",spaces[depth],"<",namespaced[element],"/>\n")
+end
+
+local function begintag(handle,element,nature,depth,di,empty)
+ local detail, n, fulltag = di.detail, di.n, di.fulltag
+ if nature == "inline" then
+ linedone = false
+ inlinedepth = inlinedepth + 1
+ elseif nature == "mixed" then
+ if inlinedepth > 0 then
+ elseif linedone then
+ handle:write(spaces[depth])
+ else
+ handle:write("\n",spaces[depth])
+ linedone = false
+ end
+ inlinedepth = inlinedepth + 1
+ else
+ if inlinedepth > 0 then
+ elseif linedone then
+ handle:write(spaces[depth])
+ else
+ handle:write("\n",spaces[depth])
+ linedone = false
+ end
+ end
+ handle:write("<",namespaced[element])
+ if detail then
+ handle:write(" detail='",detail,"'")
+ end
+ if indexing and n then
+ handle:write(" n='",n,"'")
+ end
+ local extra = extras[element]
+ if extra then
+ extra(handle,element,detail,n,fulltag,di)
+ end
+ local u = userdata[fulltag]
+ if u then
+ for k, v in next, u do
+ handle:write(format(" %s=%q",k,v))
+ end
+ end
+ if not empty then
+ handle:write(">")
+ if inlinedepth > 0 then
+ elseif nature == "display" then
+ handle:write("\n")
+ linedone = true
+ end
+ end
+ used[element][detail or ""] = nature
+end
+
+local function endtag(handle,element,nature,depth,empty)
+ if nature == "display" then
+ if inlinedepth == 0 then
+ if empty then
+ handle:write("</>\n")
+ else
+ if not linedone then
+ handle:write("\n")
+ end
+ handle:write(spaces[depth],"</",namespaced[element],">\n")
+ end
+ linedone = true
+ else
+ if empty then
+ handle:write("/>")
+ else
+ handle:write("</",namespaced[element],">")
+ end
+ end
+ else
+ inlinedepth = inlinedepth - 1
+ if empty then
+ handle:write("/>")
+ else
+ handle:write("</",namespaced[element],">")
+ end
+ linedone = false
+ end
+end
+
+local function push(fulltag,depth,entry)
+ local attribute, parnumber = entry[3], entry[4]
+ -- local tg, detail, n = lpegmatch(tagsplitter,fulltag)
+ 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 "inline"
+ else
+ local p = properties[tg]
+ element = p and p.export or tg
+ nature = p and p.nature or "inline"
+ end
+ local t = {
+ -- parent = tree,
+ tg = tg,
+ fulltag = fulltag,
+ detail = detail,
+ n = tonumber(n), -- more efficient
+ depth = depth,
+ element = element,
+ nature = nature,
+ data = { },
+ attribute = attribute,
+ parnumber = parnumber,
+ -- node = entry[5], -- will go
+ }
+ local treedata = tree.data
+ treedata[#treedata+1] = t
+ insert(treestack,tree)
+ tree = t
+ local h = treehash[fulltag]
+ if h then
+ h[#h+1] = t
+ else
+ treehash[fulltag] = { t }
+ end
+end
+
+local function pop()
+ tree = remove(treestack)
+end
+
+local function flushresult(entry)
+ local current, content = entry[1], entry[2]
+ if not content then
+ -- skip, normally this cannot happen
+ else
+ local newdepth, olddepth, content = #current, #treestack, concat(content)
+ if trace_export then
+ report_export("%s => %s : handling: %s",olddepth,newdepth,current[newdepth])
+ end
+ if olddepth <= 0 then
+ for i=1,newdepth do
+ if trace_export then
+ report_export("[1] push : %s",current[i])
+ end
+ push(current[i],i,entry)
+ end
+ if content then
+ tree.data[#tree.data+1] = content
+ end
+ elseif newdepth < olddepth then
+ for i=newdepth,olddepth-1 do
+ if trace_export then
+ report_export("[2a] pop : %s",current[i])
+ end
+ pop()
+ end
+ -- we can have a pagebreak and for instance a new chapter
+ -- will mess up the structure then
+ for i=newdepth,1,-1 do
+ if current[i] ~= treestack[i].fulltag then -- needs checking
+ if trace_export then
+ report_export("[2b] pop : %s",current[i])
+ end
+ pop()
+ else
+ break
+ end
+ end
+ olddepth = #treestack
+ for i=olddepth+1,newdepth do
+ if trace_export then
+ report_export("[2] push : %s",current[i])
+ end
+ push(current[i],i,entry)
+ end
+ if content then
+ tree.data[#tree.data+1] = content
+ end
+ elseif newdepth > olddepth then
+ for i=olddepth,1,-1 do
+ if current[i] ~= treestack[i].fulltag then
+ if trace_export then
+ report_export("[3] pop : %s",current[i])
+ end
+ pop()
+ else
+ break
+ end
+ end
+ olddepth = #treestack
+ for i=olddepth+1,newdepth do
+ if trace_export then
+ report_export("[3] push : %s",current[i])
+ end
+ push(current[i],i,entry)
+ end
+ if content then
+ tree.data[#tree.data+1] = content
+ end
+ elseif current[newdepth] == treestack[olddepth] then --move up ?
+ -- continuation
+ if content then
+ tree.data[#tree.data+1] = content
+ end
+ else
+ for i=olddepth,1,-1 do
+ if current[i] ~= treestack[i].fulltag then
+ if trace_export then
+ report_export("[4] pop : %s",current[i])
+ end
+ pop()
+ else
+ break
+ end
+ end
+ olddepth = #treestack
+ for i=olddepth+1,newdepth do
+ if trace_export then
+ report_export("[4] push : %s",current[i])
+ end
+ push(current[i],i,entry)
+ end
+ if content then
+ tree.data[#tree.data+1] = content
+ end
+ end
+ end
+end
+
+local function checkinserts(data)
+ local nofinserts = 0
+ for i=1,#data do
+ local di = data[i]
+ if type(di) == "table" then -- id ~= false
+ if di.element == "descriptionsymbol" then
+ local hash = attributehash[di.fulltag]
+ if hash then
+ local i = hash.insert
+ if i then
+ nofinserts = nofinserts + 1
+ insertids[i] = nofinserts
+ end
+ else
+ -- something is wrong
+ end
+ end
+ if di.data then
+ checkinserts(di.data)
+ end
+ end
+ end
+end
+
+local function flushtree(handle,data,nature)
+ local nofdata = #data
+ for i=1,nofdata do
+ local di = data[i]
+ if not di then
+ -- collapsed
+ elseif type(di) == "string" then
+if i == nofdata and sub(di,-1) == joiner_7 then
+ if nature == "inline" or nature == "mixed" then
+ handle:write(sub(di,1,-2))
+ else
+ handle:write(sub(di,1,-2)," ")
+ end
+else
+ handle:write(di)
+end
+ linedone = false
+ elseif not di.collapsed then
+ local element = di.element
+ if element == "break" or element == "pagebreak" then
+ emptytag(handle,element,nature,di.depth)
+ else
+ local nature, depth = di.nature, di.depth
+ local did = di.data
+ local nid = #did
+ if nid == 0 or (nid == 1 and did[1] == "") then
+ begintag(handle,element,nature,depth,di,true)
+ -- no content
+ endtag(handle,element,nature,depth,true)
+ else
+ begintag(handle,element,nature,depth,di)
+ flushtree(handle,did,nature)
+ endtag(handle,element,nature,depth)
+ end
+ end
+ end
+ end
+end
+
+local function collapsetree()
+ for k, v in next, treehash do
+ local d = v[1].data
+ local nd = #d
+ for i=2,#v do
+ local vi = v[i]
+ local vd = vi.data
+ local done = false
+ local lpn = v[i-1].parnumber
+ if lpn and lpn == 0 then lpn = nil end
+ if type(d[1]) ~= "string" then lpn = nil end -- no need anyway so no further testing needed
+local justdone = false
+ for j=1,#vd do
+ local vdj = vd[j]
+ if type(vdj) == "string" then
+--~ print(vdj)
+ -- experiment, should be improved
+ -- can be simplified ... lpn instead of done
+ if done then
+ nd = nd + 1
+ d[nd] = joiner_1
+ else
+ done = true
+ local pn = vi.parnumber
+ if not pn then
+ nd = nd + 1
+ d[nd] = joiner_2
+ lpn = nil
+ elseif not lpn then
+ nd = nd + 1
+ d[nd] = joiner_3
+ lpn = pn
+ elseif pn and pn ~= lpn then
+ nd = nd + 1
+ d[nd] = makebreaknode(vi)
+ lpn = pn
+ else
+ -- nd = nd + 1
+ -- d[nd] = joiner_4 -- we need to be more clever
+ end
+ end
+ else
+--~ nd = nd + 1
+--~ d[nd] = joiner_3
+ -- lpn = nil
+ end
+ if vdj ~= "" then
+ nd = nd + 1
+ d[nd] = vdj -- hm, any?
+ end
+ vd[j] = false
+ end
+ v[i].collapsed = true
+ end
+ end
+end
+
+local function prunetree(tree)
+ if not tree.collapsed then
+ local data = tree.data
+ if data then
+ local p, np = { }, 0
+ for i=1,#data do
+ local d = data[i]
+ if type(d) == "table" then
+ if not d.collapsed then
+ prunetree(d)
+ np = np + 1
+ p[np] = d
+ end
+ elseif type(d) == "string" then
+ np = np + 1
+ p[np] = d
+ end
+ end
+ tree.data = np > 0 and p
+ end
+ end
+end
+
+local function finishexport()
+ if entry then
+ local result = entry[2]
+ if result and result[#result] == " " then
+ result[#result] = nil -- nicer, remove last space
+ end
+ flushresult(entry)
+ end
+ for i=#treestack,1,-1 do
+ pop()
+ end
+end
+
+local displaymapping = {
+ inline = "inline",
+ display = "block",
+ mixed = "inline",
+}
+
+local e_template = [[
+%s {
+ display: %s ;
+}]]
+
+local d_template = [[
+%s[detail=%s] {
+ display: %s ;
+}]]
+
+-- encoding='utf-8'
+
+local xmlpreamble = [[
+<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
+
+<!-- input filename : %- 17s -->
+<!-- processing date : %- 17s -->
+<!-- context version : %- 17s -->
+<!-- exporter version : %- 17s -->
+]]
+
+local csspreamble = [[
+
+<?xml-stylesheet type="text/css" href="%s"?>
+]]
+
+local cssfile, xhtmlfile = nil, nil
+
+directives.register("backend.export.css", function(v) cssfile = v end)
+directives.register("backend.export.xhtml",function(v) xhtmlfile = v end)
+
+local function stopexport(v)
+ starttiming(treehash)
+ report_export("finalizing")
+ finishexport()
+ collapsetree()
+ if trace_tree then
+ prunetree(tree)
+ report_export(table.serialize(tree,"root"))
+ end
+ checkinserts(tree.data)
+ hashlistdata()
+ if type(v) ~= "string" or v == variables.yes or v == "" then
+ v = tex.jobname
+ end
+ local xmlfile = file.addsuffix(v,"export")
+ local handle = io.open(xmlfile,"wb")
+ if handle then
+ local files = { }
+ local specification = {
+ name = file.removesuffix(v),
+ identifier = os.uuid(),
+ files = files,
+ }
+ report_export("saving xml data in '%s",xmlfile)
+ handle:write(format(xmlpreamble,tex.jobname,os.date(),environment.version,version))
+ if type(cssfile) == "string" then
+ local cssfiles = settings_to_array(cssfile)
+ for i=1,#cssfiles do
+ local cssfile = cssfiles[i]
+ files[#files+1] = cssfile
+ 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")
+ end
+ report_export("adding css reference '%s",cssfile)
+ handle:write(format(csspreamble,cssfile))
+ end
+ end
+ flushtree(handle,tree.data)
+ handle:close()
+ -- css template file
+ local cssfile = file.replacesuffix(xmlfile,"template")
+ report_export("saving css template in '%s",cssfile)
+ local templates = { format("/* template for file %s */",xmlfile) }
+ for element, details in table.sortedhash(used) do
+ templates[#templates+1] = format("/* category: %s */",element)
+ for detail, nature in table.sortedhash(details) do
+ local d = displaymapping[nature or "display"] or "block"
+ if detail == "" then
+ templates[#templates+1] = format(e_template,element,d)
+ else
+ templates[#templates+1] = format(d_template,element,detail,d)
+ end
+ end
+ end
+ io.savedata(cssfile,concat(templates,"\n\n"))
+ -- xhtml references
+ if xhtmlfile then
+ -- messy
+ 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")
+ end
+ report_export("saving xhtml variant in '%s",xhtmlfile)
+ local xmltree = xml.load(xmlfile)
+ 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
+ local wrapper = { tg = "a", ns = "xhtml", at = { href = "unknown" } }
+ for e in xml.collected(xmltree,"link") do
+ local location = e.at.location
+ if location then
+ wrapper.at.href = "#" .. gsub(location,":","_")
+ 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
+ xml.save(xmltree,xhtmlfile)
+ end
+ files[#files+1] = xhtmlfile
+ specification.root = xhtmlfile
+ local specfile = file.replacesuffix(xmlfile,"specification")
+ report_export("saving specification in '%s' (mtxrun --script epub --make %s)",specfile,specfile)
+ io.savedata(specfile,table.serialize(specification,true))
+ end
+ else
+ report_export("unable to saving xml in '%s",xmlfile)
+ end
+ stoptiming(treehash)
+end
+
+local function startexport(v)
+ if v and not exporting then
+ nodes.tasks.appendaction("shipouts", "normalizers", "nodes.handlers.export")
+ report_export("enabling export to xml")
+ luatex.registerstopactions(function() stopexport(v) end)
+ if trace_spaces then
+ joiner_1 = "<S1/>" joiner_2 = "<S2/>" joiner_3 = "<S3/>" joiner_4 = "<S4/>" joiner_5 = "<S5/>"
+ joiner_6 = "<S6/>" joiner_7 = "<S7/>" joiner_8 = "<S8/>" joiner_9 = "<S9/>" joiner_0 = "<S0/>"
+ end
+ exporting = true
+ end
+end
+
+directives.register("backend.export",startexport) -- maybe .name
+
+local function injectbreak()
+ flushresult(entry)
+ flushresult(makebreak(entry))
+ result = { }
+ entry = { entry[1], result, last, lastpar } -- entry[1] ?
+end
+
+local function injectspace(a,joiner)
+ flushresult(entry)
+ result = { joiner }
+ local tl = taglist[a]
+ entry = { tl , result, a, lastpar, n }
+end
+
+local function collectresults(head,list,p)
+ local preceding = p or false
+ for n in traverse_nodes(head) do
+ local id = n.id -- 14: image, 8: literal (mp)
+ if id == glyph_code then
+ local at = has_attribute(n,a_tagged)
+ if not at then
+ -- we need to tag the pagebody stuff as being valid skippable
+ --
+ -- report_export("skipping character: 0x%05X %s (no attribute)",n.char,utfchar(n.char))
+ else
+ -- we could add tonunicodes for ligatures (todo)
+ local components = n.components
+ if components then -- we loose data
+ collectresults(components,nil,preceding)
+--~ preceding = true
+ else
+ if last ~= at then
+ local tl = taglist[at]
+ if entry then
+ flushresult(entry)
+ end
+ if preceding then
+ preceding = false
+ result = { joiner_5 }
+ else
+ result = { }
+ end
+ lastpar = has_attribute(n,a_taggedpar)
+ entry = { tl, result, at, lastpar, n }
+ local ah = { -- this includes detail !
+ align = has_attribute(n,a_taggedalign ),
+ columns = has_attribute(n,a_taggedcolumns),
+ rows = has_attribute(n,a_taggedrows ),
+ packed = has_attribute(n,a_taggedpacked ),
+ symbol = has_attribute(n,a_taggedsymbol ),
+ insert = has_attribute(n,a_taggedinsert ),
+ reference = has_attribute(n,a_reference ),
+ tag = has_attribute(n,a_taggedtag ), -- used for synonyms
+ }
+ if next(ah) then
+ attributehash[tl[#tl]] = ah
+ end
+ last = at
+ elseif last then
+ local at = has_attribute(n,a_taggedpar)
+ if at ~= lastpar then
+ injectbreak()
+ lastpar = at
+ end
+ end
+ local c = n.char
+ if c == 0x26 then
+ result[#result+1] = "&amp;"
+ elseif c == 0x3E then
+ result[#result+1] = "&gt;"
+ elseif c == 0x3C then
+ result[#result+1] = "&lt;"
+ elseif c == 0 then
+ result[#result+1] = "" -- utfchar(0) -- todo: check if "" is needed
+ else
+ local fc = fontchar[n.font]
+ if fc then
+ fc = fc and fc[c]
+ if fc then
+ local u = fc.tounicode
+ if u and u ~= "" then
+ for s in gmatch(u,"....") do -- is this ok?
+ result[#result+1] = utfchar(tonumber(s,16))
+ end
+ else
+ result[#result+1] = utfchar(c)
+ end
+ else -- weird, happens in hz (we really need to get rid of the pseudo fonts)
+ result[#result+1] = utfchar(c)
+ end
+ else
+ result[#result+1] = utfchar(c)
+ end
+ end
+ end
+ end
+ elseif id == hlist_code or id == vlist_code then
+ local ai = has_attribute(n,a_image)
+ if ai then
+ local at = has_attribute(n,a_tagged)
+ if entry then
+ flushresult(entry)
+ result = { }
+ entry[2] = result -- mess, to be sorted out, but otherwise duplicates (still some spacing issues)
+ end
+ local tl = taglist[at]
+ local i = locate_node(n,whatsit_code,refximage_code)
+ if i then
+ attributehash[tl[#tl]] = { imageindex = i.index }
+ end
+ flushresult { tl, { }, 0, 0 } -- has an index, todo: flag empty element
+ last = nil
+ lastpar = nil
+ else
+--~ if result and #result > 0 then -- and n.subtype == line_code then
+--~ local r = result[#result]
+--~ if type(r) == "string" and r ~= " " then
+--~ local s = utfsub(r,-1)
+--~ if s == hyphen then
+--~ result[#result] = utfsub(r,1,-2)
+--~ elseif s ~= joiner_7 then
+--~ result[#result] = r .. joiner_7
+--~ --~ preceding = true
+--~ end
+--~ end
+--~ preceding = false
+--~ end
+ -- we need to determine an end-of-line
+ preceding = collectresults(n.list,n,preceding)
+ preceding = false
+ end
+ elseif id == disc_code then -- probably too late
+ collectresults(n.replace,nil)
+ preceding = false
+ elseif id == glue_code then
+ -- we need to distinguish between hskips and vskips
+ local subtype = n.subtype
+ if subtype == userskip_code then -- todo space_code
+ if n.spec.width > threshold then
+--~ preceding = true
+ if result and last and #result > 0 and result[#result] ~= " " then
+ local a = has_attribute(n,a_tagged)
+ if a == last then
+ result[#result+1] = joiner_6
+ preceding = false
+ elseif a then
+ -- e.g LOGO<space>LOGO
+ preceding = false
+ last = a
+ injectspace(last,joiner_6)
+ end
+ end
+ end
+ elseif subtype == rightskip_code or subtype == parfillskip_code then
+if result and #result > 0 then -- and n.subtype == line_code then
+ local r = result[#result]
+ if type(r) == "string" and r ~= " " then
+ local s = utfsub(r,-1)
+ if s == hyphen then
+ result[#result] = utfsub(r,1,-2)
+ elseif s ~= joiner_7 then
+ result[#result] = r .. joiner_7
+--~ preceding = true
+ end
+ end
+ preceding = false
+end
+ end
+ elseif id == kern_code then
+ if n.kern > threshold then
+--~ preceding = true
+ if result and last and #result > 0 and result[#result] ~= " " then
+ local a = has_attribute(n,a_tagged)
+ if a == last then
+ result[#result+1] = joiner_8
+ preceding = false
+ elseif a then
+ -- e.g LOGO<space>LOGO
+ preceding = false
+ last = a
+ injectspace(last,joiner_8)
+ end
+ end
+ end
+ end
+ end
+ return preceding
+end
+
+function nodes.handlers.export(head)
+ if result then
+ -- maybe we need a better test for what is in result so far
+ if page_breaks then
+ joiner_0 = "<pagebreak/>"
+ end
+ result[#result+1] = joiner_0
+ end
+ starttiming(treehash)
+ collectresults(head)
+ -- no flush here, pending page stuff
+ stoptiming(treehash)
+ return head, true
+end
+
+statistics.register("xml exporting time", function()
+ if exporting then
+ return format("%s seconds", statistics.elapsedtime(treehash))
+ end
+end)
diff --git a/Master/texmf-dist/tex/context/base/back-exp.mkiv b/Master/texmf-dist/tex/context/base/back-exp.mkiv
new file mode 100644
index 00000000000..88272fca70c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/back-exp.mkiv
@@ -0,0 +1,127 @@
+%D \module
+%D [ file=back-exp,
+%D version=2010.08.22,
+%D title=\CONTEXT\ Backend Macros,
+%D subtitle=XML export,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%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 Backend Macros / XML export}
+
+\registerctxluafile{back-exp.lua}{1.001}
+
+%D This is an experimental exporter and a logical follow up on tagging. The
+%D exporter assumes a properly tagged document. Some elements get a couple
+%D of attributes becaus eitherwise rendering information would get lost. In
+%D general we assume that when the \XML\ is converted to \HTML\ some stylesheet
+%D is applied anyway.
+
+\unprotect
+
+% we can replace this by a more generic attributeset mechanism where we bind
+% to any element (needed anyway, see userdata thingies)
+
+\definesystemattribute[taggedrows] [public]
+\definesystemattribute[taggedcolumns][public]
+\definesystemattribute[taggedalign] [public]
+\definesystemattribute[taggedpar] [public]
+\definesystemattribute[taggedpacked] [public]
+\definesystemattribute[taggedsymbol] [public]
+\definesystemattribute[taggedinsert] [public]
+\definesystemattribute[taggedtag] [public]
+
+\def\setelementexporttag
+ {\dotripleargument\dosetelementexporttag}
+
+\def\dosetelementexporttag[#1][#2][#3]%
+ {\ifthirdargument
+ \ctxlua{structures.tags.settagproperty("#1","#2", "#3")}%
+ \else\ifsecondargument
+ \ctxlua{structures.tags.settagproperty("#1","export", "#2")}%
+ \fi\fi}
+
+\newcount\tagparcounter
+
+\let\dotagsetparcounter\relax
+
+\appendtoks
+ \dotagsetparcounter
+\to \everypar
+
+\appendtoks
+ \dotagsetparcounter
+\to \neverypar
+
+\appendtoks
+ \dotagsetparcounter
+\to \everytabulatepar % tricky, maybe this should be neverypar
+
+\appendtoks
+ \def\dotagnoftablecolumns{\attribute\taggedcolumnsattribute\!!counta}%
+ \def\dotagnoftablerows {\attribute\taggedrowsattribute \!!countb}%
+\to \everyenableelements
+
+\appendtoks
+ \def\dotagTABLEalign{\attribute\taggedalignattribute\raggedstatus}%
+ \def\dotagTABLEcell {\char\zerocount}%
+\to \everyenableelements
+
+\appendtoks
+ \def\dotagtabulatealign{\attribute\taggedalignattribute\ifcase\tabulatealign\attributeunsetvalue\or\plusthree\or\plusone\or\plustwo\or\attributeunsetvalue\fi}%
+\to \everyenableelements
+
+\appendtoks
+ \def\dotagsynonym{\ctxlua{structures.tags.setsynonym("\currentsynonym","\currentsynonymtag")}}%
+\to \everyenableelements
+
+\appendtoks
+ \def\dotagsorting{\ctxlua{structures.tags.setsorting("\currentsorting","\currentsortingtag")}}%
+\to \everyenableelements
+
+\appendtoks
+ \def\dotagsetparcounter{\global\advance\tagparcounter\plusone\attribute\taggedparattribute\tagparcounter}%
+\to \everyenableelements
+
+\appendtoks
+ \def\dotagsetitemize{\ctxlua{structures.tags.setitemgroup(\ifconditional\packlistitem true\else false\fi,"\currentitemsymbol")}}%
+\to \everyenableelements
+
+\appendtoks
+ \def\dotagsetdescriptiontag{\ctxlua{structures.tags.setdescriptionid("\currentdescription",\currentdescriptionnumberentry)}}%
+\to \everyenableelements
+
+\appendtoks
+ \def\dotagsetnotesymbol{\ctxlua{structures.tags.setdescriptionid("\currentnote",\currentnotenumber)}}%
+\to \everyenableelements
+
+\appendtoks
+ \unexpanded\def\doverbatimspace{\char32\relax}% will be done permanently
+\to \everyenableelements
+
+% The action: \setupbackend[export=yes] % or filename
+
+\def\c!export {export} % maybe: option={css,xhtml}
+\def\c!css {css}
+\def\c!xhtml {xhtml}
+
+\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!export}
+ {\setupstructure
+ [\c!state=\v!start]%
+ \enabledirectives
+ [backend.export=\backendparameter\c!export]}%
+\to \everysetupbackend
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/back-ini.lua b/Master/texmf-dist/tex/context/base/back-ini.lua
index 12a487dd4dc..39de73741e2 100644
--- a/Master/texmf-dist/tex/context/base/back-ini.lua
+++ b/Master/texmf-dist/tex/context/base/back-ini.lua
@@ -6,99 +6,48 @@ if not modules then modules = { } end modules ['back-ini'] = {
license = "see context related readme files"
}
-backends = backends or { }
-local trace_backend = false
+backends = backends or { }
+local backends = backends
-local function nothing() return nil end
-
-backends.nothing = nothing
-
-backends.nodeinjections = {
- rgbcolor = nothing,
- cmykcolor = nothing,
- graycolor = nothing,
- spotcolor = nothing,
- transparency = nothing,
- overprint = nothing,
- knockout = nothing,
- positive = nothing,
- negative = nothing,
- effect = nothing,
- startlayer = nothing,
- stoplayer = nothing,
- switchlayer = nothing,
-
- reference = nothing,
- destination = nothing,
-
-}
-
-backends.codeinjections = {
-
- prerollreference = nothing,
-
- insertmovie = nothing,
- insertsound = nothing,
+local trace_backend = false trackers.register("backend.initializers", function(v) trace_finalizers = v end)
- presetsymbollist = nothing,
- registersymbol = nothing,
- registeredsymbol = nothing,
+local report_backend = logs.reporter("backend","initializing")
- registercomment = nothing,
- embedfile = nothing,
- attachfile = nothing,
- adddocumentinfo = nothing,
- setupidentity = nothing,
- setpagetransition = nothing,
- defineviewerlayer = nothing,
- addbookmarks = nothing,
- addtransparencygroup = nothing,
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
- typesetfield = nothing,
- doiffieldelse = nothing,
- doiffieldgroupelse = nothing,
- definefield = nothing,
- clonefield = nothing,
- definefieldset = nothing,
- getfieldgroup = nothing,
- setformsmethod = nothing,
- getdefaultfieldvalue = nothing,
-
- setupcanvas = nothing,
+local function nothing() return nil end
- initializepage = nothing,
- initializedocument = nothing,
- finalizepage = nothing,
- finalizedocument = nothing,
+backends.nothing = nothing
- flushpageactions = nothing,
- flushdocumentactions = nothing,
+local nodeinjections = { }
+local codeinjections = { }
+local registrations = { }
+local tables = allocate()
- insertrenderingwindow = nothing,
- processrendering = nothing,
- kindofrendering = nothing,
- flushrenderingwindow = nothing,
+local function donothing(t,k)
+ t[k] = nothing
+ return nothing
+end
- setfigurecolorspace = nothing,
- setfigurealternative = nothing,
+setmetatableindex(nodeinjections, donothing)
+setmetatableindex(codeinjections, donothing)
+setmetatableindex(registrations, donothing)
+local defaults = {
+ nodeinjections = nodeinjections,
+ codeinjections = codeinjections,
+ registrations = registrations,
+ tables = tables,
}
-backends.registrations = {
- grayspotcolor = nothing,
- rgbspotcolor = nothing,
- cmykspotcolor = nothing,
- grayindexcolor = nothing,
- rgbindexcolor = nothing,
- cmykindexcolor = nothing,
- spotcolorname = nothing,
- transparency = nothing,
-}
+backends.defaults = defaults
-local nodeinjections = backends.nodeinjections
-local codeinjections = backends.codeinjections
-local registrations = backends.registrations
+backends.nodeinjections = { } setmetatableindex(backends.nodeinjections, nodeinjections)
+backends.codeinjections = { } setmetatableindex(backends.codeinjections, codeinjections)
+backends.registrations = { } setmetatableindex(backends.registrations, registrations)
+backends.tables = { } setmetatableindex(backends.tables, tables)
backends.current = "unknown"
@@ -107,28 +56,16 @@ function backends.install(what)
local backend = backends[what]
if backend then
if trace_backend then
- logs.report("backend", "initializing backend %s (%s)",what,backend.comment or "no comment")
+ report_backend("initializing backend %s (%s)",what,backend.comment or "no comment")
end
backends.current = what
- for _, category in next, { "nodeinjections", "codeinjections", "registrations"} do
- local plugin = backend[category]
- if plugin then
- local whereto = backends[category]
- for name, meaning in next, whereto do
- if plugin[name] then
- whereto[name] = plugin[name]
- -- logs.report("backend", "installing function %s in category %s of %s",name,category,what)
- elseif trace_backend then
- logs.report("backend", "no function %s in category %s of %s",name,category,what)
- end
- end
- elseif trace_backend then
- logs.report("backend", "no category %s in %s",category,what)
- end
+ for category, default in next, defaults do
+ local target, plugin = backends[category], backend[category]
+ setmetatableindex(plugin, default)
+ setmetatableindex(target, plugin)
end
- backends.helpers = backend.helpers
elseif trace_backend then
- logs.report("backend", "no backend named %s",what)
+ report_backend("no backend named %s",what)
end
end
end
@@ -141,3 +78,14 @@ statistics.register("used backend", function()
return nil
end
end)
+
+local comment = { "comment", "" }
+
+tables.vfspecials = allocate {
+ red = comment,
+ green = comment,
+ blue = comment,
+ black = comment,
+ startslant = comment,
+ stopslant = comment,
+}
diff --git a/Master/texmf-dist/tex/context/base/back-ini.mkiv b/Master/texmf-dist/tex/context/base/back-ini.mkiv
index b7bbdb56f01..a3cf2ca54c4 100644
--- a/Master/texmf-dist/tex/context/base/back-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/back-ini.mkiv
@@ -128,22 +128,6 @@
\let \doloadmapline \gobbletwoarguments % + - = | fileline
%D \macros
-%D {ifusepagedestinations}
-%D
-%D In \PDF\ version 1.0 only page references were supported,
-%D while in \DVIWINDO\ 1.N only named references were accepted.
-%D Therefore \CONTEXT\ supports both methods of referencing. In
-%D \PDF\ version 1.1 named destinations arrived. Lack of
-%D continuous support of version 1.1 viewers for \MSDOS\
-%D therefore sometimes forces us to prefer page references. As
-%D a bonus, they are faster too and have no limitations. How
-%D fortunate we were having both mechanisms available when the
-%D version 3.0 (\PDF\ version 1.2) viewers proved to be too
-%D bugged to support named destinations.
-
-\newif\ifusepagedestinations % not yet interfaced in mkiv
-
-%D \macros
%D {jobsuffix}
%D
%D By default, \TEX\ produces \DVI\ files which can be
@@ -153,7 +137,7 @@
\def\jobsuffix{pdf}
-\ifdefined\resetsystemmode \else
+\ifdefined\resetsystemmode \else % can't happen
\let\setsystemmode \gobbleoneargument
\let\resetsystemmode\gobbleoneargument
\fi
@@ -165,4 +149,14 @@
\unexpanded\def\setupoutput[#1]{} % will be command line switch
+%D New:
+
+\newtoks\everysetupbackend
+
+\def\backendparameter#1{\csname\ifcsname\??bc#1\endcsname\??bc#1\else\s!empty\fi\endcsname}
+
+\def\setupbackend[#1]%
+ {\getparameters[\??bc][#1]%
+ \the\everysetupbackend}
+
\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 54e22f1a2bd..33cb8c97558 100644
--- a/Master/texmf-dist/tex/context/base/back-pdf.lua
+++ b/Master/texmf-dist/tex/context/base/back-pdf.lua
@@ -6,7 +6,9 @@ if not modules then modules = { } end modules ['back-pdf'] = {
license = "see context related readme files"
}
--- we will move code to lpdf-* files (second cleanup stage)
+-- we will move code to lpdf-* files (second cleanup stage in 2011/2012)
+
+-- the push/pop is a mess (only needed for calculate ...) .. will be done differently
--[[ldx--
<p>This module implements a couple of cleanup methods. We need these
@@ -20,29 +22,30 @@ local char, byte, format, gsub, rep, gmatch = string.char, string.byte, string.f
local concat = table.concat
local round = math.round
local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
-local texsprint, texwrite = tex.sprint, tex.write
-local ctxcatcodes = tex.ctxcatcodes
-local copy_node = node.copy
+local backends, lpdf, nodes, node = backends, lpdf, nodes, node
+
+local copy_node = node.copy
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations = backends.pdf.registrations
-local nodeinjections = backends.pdf.nodeinjections
-local codeinjections = backends.pdf.codeinjections
-local registrations = backends.pdf.registrations
+local nodepool = nodes.pool
-local pdfliteral, register = nodes.pdfliteral, nodes.register
+local register = nodepool.register
-local pdfconstant = lpdf.constant
-local pdfstring = lpdf.string
-local pdfdictionary = lpdf.dictionary
-local pdfarray = lpdf.array
-local pdfreference = lpdf.reference
-local pdfverbose = lpdf.verbose
-local pdfflushobject = lpdf.flushobject
-local pdfreserveobject = lpdf.reserveobject
-local pdfannotation = nodes.pdfannotation
+local pdfconstant = lpdf.constant
+local pdfstring = lpdf.string
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfreference = lpdf.reference
+local pdfverbose = lpdf.verbose
+local pdfflushobject = lpdf.flushobject
+local pdfimmediateobject = lpdf.immediateobject
-local pdfreserveobj = pdf.reserveobj
-local pdfimmediateobj = pdf.immediateobj
+local pdfliteral = nodepool.pdfliteral
+local pdfannotation_node = nodepool.pdfannotation
function nodeinjections.rgbcolor(r,g,b)
return register(pdfliteral(format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b)))
@@ -86,9 +89,19 @@ end
local cache = { }
+function codeinjections.startlayer(name)
+ codeinjections.useviewerlayer(name)
+ return format("/OC /%s BDC",name)
+end
+
+function codeinjections.stoplayer(name)
+ return "EMC"
+end
+
function nodeinjections.startlayer(name)
local c = cache[name]
if not c then
+ codeinjections.useviewerlayer(name)
c = register(pdfliteral(format("/OC /%s BDC",name)))
cache[name] = c
end
@@ -103,17 +116,18 @@ end
local cache = { }
-function nodeinjections.switchlayer(name)
+function nodeinjections.switchlayer(name) -- not used, optimization
local c = cache[name]
if not c then
+ codeinjections.useviewerlayer(name)
c = register(pdfliteral(format("EMC /OC /%s BDC",name)))
end
return copy_node(c)
end
--- code
+-- code, will move to lpdf-*
-function codeinjections.insertmovie(specification)
+function nodeinjections.insertmovie(specification)
-- managed in figure inclusion: width, height, factor, repeat, controls, preview, label, foundname
local width = specification.width
local height = specification.height
@@ -134,12 +148,12 @@ function codeinjections.insertmovie(specification)
Movie = moviedict,
A = controldict,
}
- node.write(pdfannotation(width,height,0,action()))
+ node.write(pdfannotation_node(width,height,0,action()))
end
-function codeinjections.insertsound(specification)
+function nodeinjections.insertsound(specification)
-- rmanaged in interaction: repeat, label, foundname
- local soundclip = interactions.soundclip(specification.label)
+ local soundclip = interactions.soundclips.soundclip(specification.label)
if soundclip then
local controldict = pdfdictionary {
Mode = (specification["repeat"] and pdfconstant("Repeat")) or nil
@@ -154,7 +168,7 @@ function codeinjections.insertsound(specification)
Movie = sounddict,
A = controldict,
}
- node.write(pdfannotation(0,0,0,action()))
+ node.write(pdfannotation_node(0,0,0,action()))
end
end
@@ -179,14 +193,22 @@ local gray_function = "%s mul"
local documentcolorspaces = pdfdictionary()
local spotcolorhash = { } -- not needed
-local spotcolornames = { }
-local indexcolorhash = { }
-local delayedindexcolors = { }
+local spotcolornames = { }
+local indexcolorhash = { }
+local delayedindexcolors = { }
function registrations.spotcolorname(name,e)
spotcolornames[name] = e or name
end
+function registrations.getspotcolorreference(name)
+ return spotcolorhash[name]
+end
+
+-- beware: xpdf/okular/evince cannot handle the spot->process shade
+
+local processcolors
+
local function registersomespotcolor(name,noffractions,names,p,colorspace,range,funct)
noffractions = tonumber(noffractions) or 1 -- to be checked
if noffractions == 0 then
@@ -197,14 +219,20 @@ local function registersomespotcolor(name,noffractions,names,p,colorspace,range,
Domain = { 0, 1 },
Range = range,
}
- local n = pdfimmediateobj("stream",format("{ %s }",funct),dictionary())
+ local calculations = pdfimmediateobject("stream",format("{ %s }",funct),dictionary()) -- todo: lpdf.stream
+ -- local calculations = pdfobject {
+ -- type = "stream",
+ -- immediate = true,
+ -- string = format("{ %s }",funct),
+ -- attr = dictionary(),
+ -- }
local array = pdfarray {
pdf_separation,
pdfconstant(spotcolornames[name] or name),
colorspace,
- pdfreference(n),
+ pdfreference(calculations),
}
- local m = pdfimmediateobj(tostring(array))
+ local m = pdfimmediateobject(tostring(array))
local mr = pdfreference(m)
spotcolorhash[name] = m
documentcolorspaces[name] = mr
@@ -212,24 +240,55 @@ local function registersomespotcolor(name,noffractions,names,p,colorspace,range,
else
local cnames = pdfarray()
local domain = pdfarray()
+ local colorants = pdfdictionary()
for n in gmatch(names,"[^,]+") do
- cnames[#cnames+1] = pdfconstant(spotcolornames[n] or n)
+ local name = spotcolornames[n] or n
+ if n == "cyan" then
+ name = "Cyan"
+ elseif n == "magenta" then
+ name = "Magenta"
+ elseif n == "yellow" then
+ name = "Yellow"
+ elseif n == "black" then
+ name = "Black"
+ else
+ colorants[name] = pdfreference(spotcolorhash[name] or spotcolorhash[n])
+ end
+ cnames[#cnames+1] = pdfconstant(name)
domain[#domain+1] = 0
domain[#domain+1] = 1
end
+ if not processcolors then
+ local specification = pdfdictionary {
+ ColorSpace = pdfconstant("DeviceCMYK"),
+ Components = pdfarray {
+ pdfconstant("Cyan"),
+ pdfconstant("Magenta"),
+ pdfconstant("Yellow"),
+ pdfconstant("Black")
+ }
+ }
+ processcolors = pdfreference(pdfimmediateobject(tostring(specification)))
+ end
local dictionary = pdfdictionary {
FunctionType = 4,
Domain = domain,
Range = range,
}
- local n = pdfimmediateobj("stream",format("{ %s %s }",rep("pop ",noffractions),funct),dictionary())
+ local calculation = pdfimmediateobject("stream",format("{ %s %s }",rep("pop ",noffractions),funct),dictionary())
+ local channels = pdfdictionary {
+ Subtype = pdfconstant("NChannel"),
+ Colorants = colorants,
+ Process = processcolors,
+ }
local array = pdfarray {
pdf_device_n,
cnames,
colorspace,
- pdfreference(n),
+ pdfreference(calculation),
+ lpdf.shareobjectreference(tostring(channels)), -- optional but needed for shades
}
- local m = pdfimmediateobj(tostring(array))
+ local m = pdfimmediateobject(tostring(array))
local mr = pdfreference(m)
spotcolorhash[name] = m
documentcolorspaces[name] = mr
@@ -237,7 +296,9 @@ local function registersomespotcolor(name,noffractions,names,p,colorspace,range,
end
end
-function registersomeindexcolor(name,noffractions,names,p,colorspace,range,funct)
+-- wrong name
+
+local function registersomeindexcolor(name,noffractions,names,p,colorspace,range,funct)
noffractions = tonumber(noffractions) or 1 -- to be checked
local cnames = pdfarray()
local domain = pdfarray()
@@ -256,7 +317,7 @@ function registersomeindexcolor(name,noffractions,names,p,colorspace,range,funct
Domain = domain,
Range = range,
}
- local n = pdfimmediateobj("stream",format("{ %s %s }",rep("exch pop ",noffractions),funct),dictionary()) -- exch pop
+ local n = pdfimmediateobject("stream",format("{ %s %s }",rep("exch pop ",noffractions),funct),dictionary()) -- exch pop
local a = pdfarray {
pdf_device_n,
cnames,
@@ -280,7 +341,7 @@ function registersomeindexcolor(name,noffractions,names,p,colorspace,range,funct
vector[#vector+1] = concat(set)
end
vector = pdfverbose { "<", concat(vector, " "), ">" }
- local n = pdfimmediateobj(tostring(pdfarray{ pdf_indexed, a, 255, vector }))
+ local n = pdfimmediateobject(tostring(pdfarray{ pdf_indexed, a, 255, vector }))
lpdf.adddocumentcolorspace(format("%s_indexed",name),pdfreference(n))
return n
end
@@ -289,13 +350,11 @@ end
local function delayindexcolor(name,names,func)
local hash = (names ~= "" and names) or name
- -- logs.report("index colors","delaying '%s'",name)
delayedindexcolors[hash] = func
end
local function indexcolorref(name) -- actually, names (parent) is the hash
if not indexcolorhash[name] then
- -- logs.report("index colors","registering '%s'",name)
local delayedindexcolor = delayedindexcolors[name]
if type(delayedindexcolor) == "function" then
indexcolorhash[name] = delayedindexcolor()
@@ -395,7 +454,7 @@ function registrations.transparency(n,a,t)
BM = transparencies[1],
AIS = false,
}
- local m = pdfimmediateobj(tostring(d))
+ local m = pdfimmediateobject(tostring(d))
local mr = pdfreference(m)
transparencyhash[0] = m
documenttransparencies[0] = mr
@@ -407,10 +466,10 @@ function registrations.transparency(n,a,t)
Type = pdf_extgstate,
ca = tonumber(t),
CA = tonumber(t),
- BM = transparencies[a] or transparencies[0],
+ BM = transparencies[tonumber(a)] or transparencies[0],
AIS = false,
}
- local m = pdfimmediateobj(tostring(d))
+ local m = pdfimmediateobject(tostring(d))
local mr = pdfreference(m)
transparencyhash[n] = m
documenttransparencies[n] = mr
@@ -418,6 +477,8 @@ function registrations.transparency(n,a,t)
end
end
+-- overloaded in lpdf-xmp:
+
function codeinjections.adddocumentinfo(key,value)
lpdf.addtoinfo(key,lpdf.tosixteen(value))
end
@@ -425,11 +486,11 @@ end
-- graphics
function codeinjections.setfigurealternative(data,figure)
- local display = data.request.display
+ local request = data.request
+ local display = request.display
if display and display ~= "" then
- local request = data.request
- figures.push {
- name = request.display,
+ local nested = figures.push {
+ name = display,
page = request.page,
size = request.size,
prefix = request.prefix,
@@ -442,28 +503,112 @@ function codeinjections.setfigurealternative(data,figure)
if displayfigure then
-- figure.aform = true
img.immediatewrite(figure)
- local a = lpdf.array {
- lpdf.dictionary {
- Image = lpdf.reference(figure.objnum),
+ local a = pdfarray {
+ pdfdictionary {
+ Image = pdfreference(figure.objnum),
DefaultForPrinting = true,
}
}
- local d = lpdf.dictionary {
- Alternates = lpdf.reference(pdf.immediateobj(tostring(a))),
+ local d = pdfdictionary {
+ Alternates = pdfreference(pdfimmediateobject(tostring(a))),
}
displayfigure.attr = d()
- return displayfigure, figures.current()
+ figures.pop()
+ return displayfigure, nested
+ else
+ figures.pop()
end
end
end
--- eventually we need to load this runtime
---
--- backends.install((environment and environment.arguments and environment.arguments.backend) or "pdf")
---
--- but now we need to force this as we also load the pdf tex part which hooks into all kind of places
+function codeinjections.getpreviewfigure(request)
+ local figure = figures.initialize(request)
+ if not figure then
+ return
+ end
+ figure = figures.identify(figure)
+ if not figure then
+ return
+ end
+ figure = figures.check(figure)
+ if not figure then
+ return
+ end
+ local image = figure.status.private
+ if image then
+ img.immediatewrite(image)
+ end
+ return figure
+end
+
+function codeinjections.setfiguremask(data,figure) -- mark
+ local request = data.request
+ local mask = request.mask
+ if mask and mask ~= "" then
+ figures.push {
+ name = mask,
+ page = request.page,
+ size = request.size,
+ prefix = request.prefix,
+ cache = request.cache,
+ width = request.width,
+ height = request.height,
+ }
+ figures.identify()
+ local maskfigure = figures.check()
+ if maskfigure then
+ local image = maskfigure.status.private
+ if image then
+ img.immediatewrite(image)
+ local d = pdfdictionary {
+ Interpolate = false,
+ SMask = pdfreference(image.objnum),
+ }
+ figure.attr = d()
+ end
+ end
+ figures.pop()
+ end
+end
+
+local outputfilename
+
+function codeinjections.getoutputfilename()
+ if not outputfilename then
+ outputfilename = file.addsuffix(tex.jobname,"pdf")
+ end
+ return outputfilename
+end
+
+-- temp hack
+
+local factor = number.dimenfactors.bp
+
+function img.package(image)
+ local boundingbox = image.bbox
+ local imagetag = "Im" .. image.index
+ local resources = pdfdictionary {
+ ProcSet = pdfarray {
+ pdfconstant("PDF"),
+ pdfconstant("ImageC")
+ },
+ Resources = pdfdictionary {
+ XObject = pdfdictionary {
+ [imagetag] = pdfreference(image.objnum)
+ }
+ }
+ }
+ local width = boundingbox[3]
+ local height = boundingbox[4]
+ local xform = img.scan {
+ attr = resources(),
+ stream = format("%s 0 0 %s 0 0 cm /%s Do",width,height,imagetag),
+ bbox = { 0, 0, width/factor, height/factor },
+ }
+ img.immediatewrite(xform)
+ return xform
+end
-codeinjections.finalizepage = lpdf.finalizepage
-codeinjections.finalizedocument = lpdf.finalizedocument
+-- till here
backends.install("pdf")
diff --git a/Master/texmf-dist/tex/context/base/back-pdf.mkiv b/Master/texmf-dist/tex/context/base/back-pdf.mkiv
index a10afd5b901..5b7de128de4 100644
--- a/Master/texmf-dist/tex/context/base/back-pdf.mkiv
+++ b/Master/texmf-dist/tex/context/base/back-pdf.mkiv
@@ -13,30 +13,71 @@
\writestatus{loading}{ConTeXt Backend Macros / PDF}
-\registerctxluafile{back-pdf}{1.001} % this will change
+\registerctxluafile{lpdf-ini}{1.001}
+\registerctxluafile{lpdf-col}{1.000}
+\registerctxluafile{lpdf-xmp}{1.001}
+\registerctxluafile{lpdf-nod}{1.001}
+\registerctxluafile{lpdf-mis}{1.001}
+\registerctxluafile{lpdf-ano}{1.001}
+\registerctxluafile{lpdf-ren}{1.001}
+\registerctxluafile{lpdf-grp}{1.001}
+\registerctxluafile{lpdf-wid}{1.001}
+\registerctxluafile{lpdf-fld}{1.001}
+\registerctxluafile{lpdf-u3d}{1.001}
+\registerctxluafile{lpdf-swf}{1.001}
+\registerctxluafile{lpdf-tag}{1.001}
+\registerctxluafile{lpdf-fmt}{1.001}
+\registerctxluafile{lpdf-epd}{1.001}
+\registerctxluafile{lpdf-epa}{1.001}
+
+\registerctxluafile{back-pdf}{1.001} % some code will move to lpdf-*
\unprotect
%D We will minimize the number of calls to \PDF\ specific primitives
%D and delegate all management and injection of code to the backend.
%D
-%D Here we initialize some internal quantities.
-
-\pdfoutput = 1
-\pdfhorigin = 1 true in
-\pdfvorigin = 1 true in
-\pdfimageresolution = 300
-\pdfpkresolution = 600
-\pdfdecimaldigits = 10
-\pdfinclusionerrorlevel = 0
-\pdfminorversion = 6 % maybe even 7
-%pdfuniqueresname = 1
+%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
+
+% most of these will be protected as well
+
+\pdfimageresolution 300
+\pdfpkresolution 600
+\pdfdecimaldigits 10
+\pdfinclusionerrorlevel 0
+\pdfminorversion 6 % use setupbackend for changes
%D This one can be consulted by users although the suffix is also
%D a system mode.
\setjobsuffix{pdf}
+%D PDF/X (matbe combine the two lua calls)
+
+\setupbackend
+ [xmpfile=]
+
+\appendtoks
+ \doifsomething{\backendparameter{xmpfile}}
+ {\ctxcommand{setxmpfile("\backendparameter{xmpfile}")}}%
+\to \everysetupbackend
+
+\appendtoks
+ \doifsomething{\backendparameter\c!format}
+ {\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",
+ }}}%
+\to \everysetupbackend
+
%D For the moment we keep these.
\newtoks \pdfbackendeveryximage
@@ -59,6 +100,8 @@
\def\pdfbackendcurrentresources {\ctxlua{lpdf.collectedresources()}}
+\def\pdfcolor #1{\ctxlua{lpdf.pdfcolor(\thecolorattribute{#1})}} \let\PDFcolor\pdfcolor
+
%D Let's block these:
\let\pdfcatalog \relax \newtoks\pdfcatalog
@@ -77,16 +120,6 @@
\pdfbackendsetinfo{ConTeXt.Url} {www.pragma-ade.com}%
\to \everylastbackendshipout
-%D Unfortunately this is still needed (also for \METAPOST\ to
-%D \PDF\ converter):
-
-% \def\doresetmapfilelist
-% {\global\let\doresetmapfilelist\relax
-% \pdfmapfile{original-empty.map}}
-%
-% \appendtoksonce \loadallfontmapfiles \to \pdfbackendeveryxform
-% \appendtoksonce \loadallfontmapfiles \to \pdfbackendeveryximage
-
%D Transformations. Some day we will use primitives (once they're fixed).
\def\dostartrotation#1% grouped
@@ -119,7 +152,7 @@
%D The following will move to the backend \LUA\ code:
\appendtoks \ctxlua{backends.codeinjections.finalizepage ()}\to \everybackendshipout % is immediate
-\appendtoks \ctxlua{backends.codeinjections.finalizedocument()}\to \everylastbackendshipout % is immediate
+%appendtoks \ctxlua{backends.codeinjections.finalizedocument()}\to \everylastbackendshipout % is immediate
%D Temporary hack, will be removed or improved or default.
@@ -157,14 +190,6 @@
\donothing
\endgroup}
-\def\doPDFgetobjectpage#1#2#3%
- {\dogetobjectreferencepage{#1}{#2}#3%
- \ifx#3\empty\def#3{\realfolio}\fi}
-
-\def\doPDFgetobjectpagereference#1#2#3%
- {\dogetobjectreferencepage{#1}{#2}#3%
- \doPDFgetpagereference{\ifx#3\empty\realfolio\else#3\fi}#3}
-
\let\lastpredefinedsymbol\empty % some day we can do more at the lua end
\def\predefinesymbol[#1]%
@@ -175,4 +200,244 @@
\ctxlua{backends.codeinjections.registersymbol("#1",\lastref)}%
\endgroup}
+% for the moment here
+
+%D \macros
+%D {doovalbox}
+%D
+%D Drawing frames with round corners is inherited from the
+%D main module.
+%D
+%D For drawing ovals we use quite raw \PDF\ code. The next
+%D implementation does not differ that much from the one
+%D implemented in the \POSTSCRIPT\ driver. This code is
+%D somewhat obsolete as we now have metapost embedded.
+
+\def\doPDFovalcalc#1#2#3%
+ {\PointsToBigPoints{\dimexpr#1+#2\relax}#3}
+
+\def\doovalbox#1#2#3#4#5#6#7#8% todo: \scratchdimen/\scatchbox
+ {\forcecolorhack
+ \bgroup
+ \dimen0=#4\divide\dimen0 \plustwo
+ \doPDFovalcalc{0pt}{+\dimen0}\xmin
+ \doPDFovalcalc{#1}{-\dimen0}\xmax
+ \doPDFovalcalc{#2}{-\dimen0}\ymax
+ \doPDFovalcalc{-#3}{+\dimen0}\ymin
+ \advance\dimen0 by #5%
+ \doPDFovalcalc{0pt}{+\dimen0}\xxmin
+ \doPDFovalcalc{#1}{-\dimen0}\xxmax
+ \doPDFovalcalc{#2}{-\dimen0}\yymax
+ \doPDFovalcalc{-#3}{+\dimen0}\yymin
+ \doPDFovalcalc{#4}{\zeropoint}\stroke
+ \doPDFovalcalc{#5}{\zeropoint}\radius
+ \edef\dostroke{#6}%
+ \edef\dofill{#7}%
+ \edef\mode{\number#8 \space}%
+ % no \ifcase, else \relax in pdfcode
+ \setbox\scratchbox\hbox
+ {\ifnum\dostroke\dofill>\zerocount
+ \pdfliteral
+ {q
+ \stroke\space w
+ \ifcase\mode
+ \xxmin\space \ymin \space m
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax\space \ymax \space y
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ h
+ \or % 1
+ \xxmin\space \ymin \space m
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \ymax \space l
+ \xmin \space \ymax \space l
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ h
+ \or % 2
+ \xxmin\space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \ymax \space l
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ h
+ \or % 3
+ \xmin \space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax\space \ymax \space y
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \ymin \space l
+ h
+ \or % 4
+ \xmin \space \ymin \space m
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax\space \ymax \space y
+ \xmin \space \ymax \space l
+ \xmin \space \ymin\space l
+ h
+ \or % 5
+ \xmin \space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax\space \ymax \space y
+ \xmin \space \ymax \space l
+ \xmin \space \ymin \space l
+ h
+ \or % 6
+ \xmin \space \ymin \space m
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \ymax \space l
+ \xmin \space \ymax \space l
+ \xmin \space \ymin \space l
+ h
+ \or
+ \xxmin\space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \ymax \space l
+ \xmin \space \ymax \space l
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ h
+ \or
+ \xmin \space \ymin \space m
+ \xmax \space \ymin \space l
+ \xmax \space \ymax \space l
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \ymin \space l
+ h
+ \or % 9 top open
+ \xmin \space \ymax \space m
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ \xxmax\space \ymin \space l
+ \xmax \space \ymin \space \xmax \space \yymin\space y
+ \xmax \space \ymax \space l
+ \or % 10 right open
+ \xmax \space \ymax \space m
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \yymin\space l
+ \xmin \space \ymin \space \xxmin\space \ymin \space y
+ \xmax\space \ymin \space l
+ \or % 11 bottom open
+ \xmax \space \ymin \space m
+ \xmax \space \yymax\space l
+ \xmax \space \ymax \space \xxmax \space \ymax\space y
+ \xxmin\space \ymax \space l
+ \xmin \space \ymax \space \xmin \space \yymax\space y
+ \xmin \space \ymin \space l
+ \or % 12 left open
+ \xmin \space \ymax \space m
+ \xxmax\space \ymax \space l
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmax \space \yymin\space l
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xmin \space \ymin \space l
+ \or % 13
+ \xmin \space \ymax \space m
+ \xxmax\space \ymax \space l
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmax\space \ymin \space l
+ \or % 14
+ \xmax \space \ymax \space m
+ \xmax \space \yymin\space l
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xmin \space \ymin \space l
+ \or % 15
+ \xmax \space \ymin \space m
+ \xxmin\space \ymin \space l
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \xmin \space \ymax \space l
+ \or % 16
+ \xmin \space \ymin \space m
+ \xmin \space \yymax\space l
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \xmax \space \ymax \space l
+ \or % 17
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \or % 18
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \or % 19
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \or % 20
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 21
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 22
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \or % 23
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \or % 24
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 25
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 26
+ \xmax \space \yymin\space m
+ \xmax \space \ymin \space \xxmax\space \ymin \space y
+ \xmin \space \yymax\space m
+ \xmin \space \ymax \space \xxmin\space \ymax \space y
+ \or % 27
+ \xxmax\space \ymax \space m
+ \xmax \space \ymax \space \xmax \space \yymax\space y
+ \xxmin\space \ymin \space m
+ \xmin \space \ymin \space \xmin \space \yymin\space y
+ \or % 28
+ \fi
+ \ifnum\mode>8
+ S
+ \else
+ \ifnum\dostroke=\plusone S \fi
+ \ifnum\dofill =\plusone f \fi
+ \fi
+ Q}%
+ \fi}%
+ \wd\scratchbox#1\ht\scratchbox#2\dp\scratchbox#3\box\scratchbox
+ \egroup}
+
+\unexpanded\def\pdfactualtext#1#2%
+ {\pdfliteral direct{/Span <</ActualText \ctxlua{tex.write(lpdf.tosixteen("#2"))} >> BDC}%
+ #1%
+ \pdfliteral direct{EMC}}
+
+% \starttext
+% text \pdfactualtext{Meier}{Müller} text
+% \stoptext
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/back-u3d.mkiv b/Master/texmf-dist/tex/context/base/back-u3d.mkiv
index 398159feb2c..e2609449650 100644
--- a/Master/texmf-dist/tex/context/base/back-u3d.mkiv
+++ b/Master/texmf-dist/tex/context/base/back-u3d.mkiv
@@ -124,28 +124,31 @@
toolbar = true,
preview = 'cloudq.png'
\stopluaparameterset
+
\startluaparameterset[u3d:myset:display:3]
toolbar = true,
- tree = false,
+ tree = false,
preview = 'area.png'
\stopluaparameterset
+
\startluaparameterset[u3d:myset:display:4]
toolbar = true,
- tree = false,
- view = {
- name = 'view',
- bg = {0.1,0.1,0.1},
- c2c = {-1,-1,0},
- roo = 50,
- aac = 2.5,
- roll = 45,
+ tree = false,
+ view = {
+ name = 'view',
+ bg = {0.1,0.1,0.1},
+ c2c = {-1,-1,0},
+ roo = 50,
+ aac = 2.5,
+ roll = 45,
lights = 'Red'
}
\stopluaparameterset
+
\startluaparameterset[u3d:myset:display:5]
toolbar = true,
- tree = false,
- view = 'ortho'
+ tree = false,
+ view = 'ortho'
\stopluaparameterset
\placefigure[here]{none}{\externalfigure[cloudq][display=u3d:myset:display:2]}
diff --git a/Master/texmf-dist/tex/context/base/bibl-bib.lua b/Master/texmf-dist/tex/context/base/bibl-bib.lua
index 3c0dad2fa4e..e0e5a6c3a42 100644
--- a/Master/texmf-dist/tex/context/base/bibl-bib.lua
+++ b/Master/texmf-dist/tex/context/base/bibl-bib.lua
@@ -16,20 +16,28 @@ local utf = unicode.utf8
local lower, format, gsub, concat = string.lower, string.format, string.gsub, table.concat
local next = next
local utfchar = utf.char
-local lpegmatch = lpeg.match
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
local textoutf = characters and characters.tex.toutf
local variables = interfaces and interfaces.variables
-
+local settings_to_hash = utilities.parsers.settings_to_hash
local finalizers = xml.finalizers.tex
-local xmlfilter, xmltext = xml.filter, xml.text
+local xmlfilter, xmltext, getid = xml.filter, xml.text, lxml.getid
+
+local P, R, S, C, Cc, Cs, Ct = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct
local trace_bibxml = false trackers.register("publications.bibxml", function(v) trace_bibtex = v end)
-bibtex = bibtex or { }
+local report_xml = logs.reporter("publications","xml")
-bibtex.size = 0
-bibtex.definitions = 0
-bibtex.shortcuts = 0
+bibtex = bibtex or { }
+local bibtex = bibtex
+
+bibtex.statistics = bibtex.statistics or { }
+local bibtexstats = bibtex.statistics
+
+bibtexstats.nofbytes = 0
+bibtexstats.nofdefinitions = 0
+bibtexstats.nofshortcuts = 0
local defaultshortcuts = {
jan = "1",
@@ -55,7 +63,7 @@ local entries
-- hashed again.
local function do_shortcut(tag,key,value)
- bibtex.shortcuts = bibtex.shortcuts + 1
+ bibtexstats.nofshortcuts = bibtexstats.nofshortcuts + 1
if lower(tag) == "@string" then
shortcuts[key] = value
end
@@ -63,7 +71,7 @@ end
local function do_definition(tag,key,tab) -- maybe check entries here (saves memory)
if not entries or entries[key] then
- bibtex.definitions = bibtex.definitions + 1
+ bibtexstats.nofdefinitions = bibtexstats.nofdefinitions + 1
local t = { }
for i=1,#tab,2 do
t[tab[i]] = tab[i+1]
@@ -81,8 +89,6 @@ local function resolve(s)
return shortcuts[s] or defaultshortcuts[s] or s -- can be number
end
-local P, R, S, C, Cc, Cs, Ct = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct
-
local percent = P("%")
local start = P("@")
local comma = P(",")
@@ -101,10 +107,10 @@ local collapsed = (space^1)/ " "
local function add(a,b) if b then return a..b else return a end end
-local keyword = C((lpeg.R("az","AZ","09") + S("@_:-"))^1) -- lpeg.C((1-space)^1)
+local keyword = C((R("az","AZ","09") + S("@_:-"))^1) -- C((1-space)^1)
local s_quoted = ((escape*single) + collapsed + (1-single))^0
local d_quoted = ((escape*double) + collapsed + (1-double))^0
-local balanced = lpeg.patterns.balanced
+local balanced = lpegpatterns.balanced
local s_value = (single/"") * s_quoted * (single/"")
local d_value = (double/"") * d_quoted * (double/"")
@@ -116,7 +122,7 @@ local value = Cs((somevalue * ((spacing * hash * spacing)/"" * somevalue)^0
local assignment = spacing * keyword * spacing * equal * spacing * value * spacing
local shortcut = keyword * spacing * left * spacing * (assignment * comma^0)^0 * spacing * right
-local definition = keyword * spacing * left * spacing * keyword * comma * lpeg.Ct((assignment * comma^0)^0) * spacing * right
+local definition = keyword * spacing * left * spacing * keyword * comma * Ct((assignment * comma^0)^0) * spacing * right
local comment = keyword * spacing * left * (1-right)^0 * spacing * right
local forget = percent^1 * (1-lineending)^0
@@ -127,21 +133,20 @@ local grammar = (space + forget + shortcut/do_shortcut + definition/do_definitio
function bibtex.convert(session,content)
statistics.starttiming(bibtex)
data, shortcuts, entries = session.data, session.shortcuts, session.entries
- -- session.size = session.size + #content
- bibtex.size = bibtex.size + #content
- session.size = session.size + #content
+ bibtexstats.nofbytes = bibtexstats.nofbytes + #content
+ session.nofbytes = session.nofbytes + #content
lpegmatch(grammar,content or "")
statistics.stoptiming(bibtex)
end
function bibtex.load(session,filename)
- local filename = resolvers.find_file(filename,"bib")
+ local filename = resolvers.findfile(filename,"bib")
if filename ~= "" then
local data = io.loaddata(filename) or ""
if data == "" then
- logs.report("publications","empty file '%s', no conversion to xml",filename)
+ report_xml("empty file '%s', no conversion to xml",filename)
elseif trace_bibxml then
- logs.report("publications","converting file '%s' to xml",filename)
+ report_xml("converting file '%s' to xml",filename)
end
bibtex.convert(session,data)
end
@@ -149,16 +154,16 @@ end
function bibtex.new()
return {
- data = { },
+ data = { },
shortcuts = { },
- xml = xml.convert("<?xml version='1.0' standalone='yes'?>\n<bibtex></bibtex>"),
- size = 0,
- entries = nil,
- loaded = false,
+ xml = xml.convert("<?xml version='1.0' standalone='yes'?>\n<bibtex></bibtex>"),
+ nofbytes = 0,
+ entries = nil,
+ loaded = false,
}
end
-local escaped_pattern = xml.escaped_pattern
+local escaped_pattern = lpegpatterns.xml.escaped
local ihatethis = {
f = "\\f",
@@ -193,12 +198,12 @@ function bibtex.toxml(session,options)
-- we can always speed this up if needed
-- format slows down things a bit but who cares
statistics.starttiming(bibtex)
- local result = { }
- local options = aux.settings_to_hash(options)
+ local result, r = { }, 0
+ local options = settings_to_hash(options)
local convert = options.convert -- todo: interface
local strip = options.strip -- todo: interface
local entries = session.entries
- result[#result+1] = format("<?xml version='1.0' standalone='yes'?>")
+ r = r + 1 ; result[r] = format("<?xml version='1.0' standalone='yes'?>")
result[#result+1] = format("<bibtex>")
for id, categories in next, session.data do
id = lower(gsub(id,"^@",""))
@@ -218,14 +223,14 @@ function bibtex.toxml(session,options)
-- kind of hackery ... bibtex databases are quite unportable
value = lpegmatch(filter,value) or value
end
- result[#result+1] = format(" <field name='%s'>%s</field>",key,value)
+ r = r + 1 ; result[r] = format(" <field name='%s'>%s</field>",key,value)
end
end
- result[#result+1] = format("</entry>")
+ r = r + 1 ; result[r] = format("</entry>")
end
end
end
- result[#result+1] = format("</bibtex>")
+ r = r + 1 ; result[r] = format("</bibtex>")
result = concat(result,"\n")
-- alternatively we could use lxml.convert
session.xml = xml.convert(result, {
@@ -240,10 +245,10 @@ function bibtex.toxml(session,options)
end
statistics.register("bibtex load time", function()
- local size = bibtex.size
- if size > 0 then
+ local nofbytes = bibtexstats.nofbytes
+ if nofbytes > 0 then
return format("%s seconds (%s bytes, %s definitions, %s shortcuts)",
- statistics.elapsedtime(bibtex),size,bibtex.definitions,bibtex.shortcuts)
+ statistics.elapsedtime(bibtex),nofbytes,bibtexstats.nofdefinitions,bibtexstats.nofshortcuts)
else
return nil
end
@@ -264,14 +269,14 @@ end)
--~ local session = bibtex.new()
--~ bibtex.convert(session,str)
--~ bibtex.toxml(session)
---~ print(session.size,statistics.elapsedtime(bibtex))
+--~ print(session.nofbytes,statistics.elapsedtime(bibtex))
--~ local session = bibtex.new()
--~ bibtex.load(session,"IEEEabrv.bib")
--~ bibtex.load(session,"IEEEfull.bib")
--~ bibtex.load(session,"IEEEexample.bib")
--~ bibtex.toxml(session)
---~ print(session.size,statistics.elapsedtime(bibtex))
+--~ print(session.nofbytes,statistics.elapsedtime(bibtex))
--~ local session = bibtex.new()
--~ bibtex.load(session,"gut.bib")
@@ -284,27 +289,29 @@ end)
--~ bibtex.load(session,"texnique.bib")
--~ bibtex.load(session,"tugboat.bib")
--~ bibtex.toxml(session)
---~ print(session.size,statistics.elapsedtime(bibtex))
+--~ print(session.nofbytes,statistics.elapsedtime(bibtex))
--~ print(table.serialize(session.data))
--~ print(table.serialize(session.shortcuts))
--~ print(xml.serialize(session.xml))
-if not characters then dofile(resolvers.find_file("char-def.lua")) end
+if not characters then dofile(resolvers.findfile("char-def.lua")) end
local chardata = characters.data
local concat = table.concat
-local P, Ct, lpegmatch = lpeg.P, lpeg.Ct, lpeg.match
+local lpeg = lpeg
+
+local P, Ct, lpegmatch, lpegpatterns = lpeg.P, lpeg.Ct, lpeg.match, lpeg.patterns
local space, comma = P(" "), P(",")
local andsplitter = Ct(lpeg.splitat(space^1 * "and" * space^1))
local commasplitter = Ct(lpeg.splitat(space^0 * comma * space^0))
local spacesplitter = Ct(lpeg.splitat(space^1))
-local firstcharacter = lpeg.patterns.utf8byte
+local firstcharacter = lpegpatterns.utf8byte
-function is_upper(str)
+local function is_upper(str)
local first = lpegmatch(firstcharacter,str)
local okay = chardata[first]
return okay and okay.category == "lu"
@@ -578,8 +585,8 @@ end
-- pays off.
local function collectauthoryears(id,list)
- list = aux.settings_to_hash(list)
- id = lxml.get_id(id)
+ list = settings_to_hash(list)
+ id = getid(id)
local found = { }
for e in xml.collected(id,"/bibtex/entry") do
if list[e.at.tag] then
@@ -631,9 +638,6 @@ end
if commands then
- local texsprint = tex and tex.sprint
- local ctxcatcodes = tex and tex.ctxcatcodes
-
local sessions = { }
function commands.definebibtexsession(name)
@@ -667,7 +671,7 @@ if commands then
if collected then
local author = collected[1].dt[1] or ""
if author ~= "" then
- texsprint(ctxcatcodes,authors.concat(author,method,what,settings))
+ context(authors.concat(author,method,what,settings))
end
end
end
@@ -677,7 +681,7 @@ if commands then
local c = collected[1]
local year = xmlfilter(c,"xml://field[@name='year']/text()")
local author = xmlfilter(c,"xml://field[@name='author']/text()")
- texsprint(ctxcatcodes,authors.short(author,year))
+ context(authors.short(author,year))
end
end
@@ -711,31 +715,32 @@ if commands then
function bibtex.authorref(id,list)
local result = collectauthoryears(id,list,method,what)
for author, years in next, result do
- texsprint(ctxcatcodes,authors.concat(author,method,what,settings))
+ context(authors.concat(author,method,what,settings))
end
end
function bibtex.authoryearref(id,list)
local result = collectauthoryears(id,list,method,what)
for author, years in next, result do
- texsprint(ctxcatcodes,authors.concat(author,method,what,settings)," (",concat(years,", "),")")
+ context("%s (%s)",authors.concat(author,method,what,settings),concat(years,", "))
end
end
function bibtex.authoryearsref(id,list)
local result = collectauthoryears(id,list,method,what)
for author, years in next, result do
- texsprint(ctxcatcodes,"(",authors.concat(author,method,what,settings),", ",concat(years,", "),")")
+ context("(%s, %s)",authors.concat(author,method,what,settings),concat(years,", "))
end
end
- function bibtex.singular_or_plural(singular,plural)
+ function bibtex.singularorplural(singular,plural)
if lastconcatsize and lastconcatsize > 1 then
- texsprint(ctxcatcodes,plural)
+ context(plural)
else
- texsprint(ctxcatcodes,singular)
+ context(singular)
end
end
+
end
diff --git a/Master/texmf-dist/tex/context/base/bibl-bib.mkiv b/Master/texmf-dist/tex/context/base/bibl-bib.mkiv
index 10abe5cb8a7..681be325f2b 100644
--- a/Master/texmf-dist/tex/context/base/bibl-bib.mkiv
+++ b/Master/texmf-dist/tex/context/base/bibl-bib.mkiv
@@ -118,16 +118,16 @@
\newtoks \everysetupbibtexsession
\setfalse \tracebibtexformat
-\unexpanded\def\definebibtexsession {\dosingleargument\dodefinebibtexsession}
+\unexpanded\def\definebibtexsession{\dosingleargument\dodefinebibtexsession}
\def\preparebibtexsession {\dodoubleempty \dopreparebibtexsession}
-\unexpanded\def\setupbibtexsession {\dodoubleargument\dosetupbibtexsession}
+\unexpanded\def\setupbibtexsession {\dodoubleargument\dosetupbibtexsession}
\def\dodefinebibtexsession [#1]{\edef\currentbibtexsession{#1}%
- \ctxlua{commands.definebibtexsession("#1")}%
+ \ctxcommand{definebibtexsession("#1")}%
\the\everydefinebibtexsession}
\def\dopreparebibtexsession[#1][#2]{\edef\currentbibtexsession{#1}%
- \ctxlua{commands.preparebibtexsession("#1","bibtex:#1","#2")}%
+ \ctxcommand{preparebibtexsession("#1","bibtex:#1","#2")}%
\the\everypreparebibtexsession}
\def\dosetupbibtexsession [#1][#2]{\edef\currentbibtexsession{#1}%
@@ -138,8 +138,8 @@
\def\registerbibtexentry {\dodoubleargument\doregisterbibtexentry}
\def\applytobibtexsession {\dodoubleargument\doapplytobibtexsession}
-\def\doregisterbibtexfile [#1][#2]{\ctxlua{commands.registerbibtexfile("#1","#2")}}
-\def\doregisterbibtexentry [#1][#2]{\ctxlua{commands.registerbibtexentry("#1","#2")}}
+\def\doregisterbibtexfile [#1][#2]{\ctxcommand{registerbibtexfile("#1","#2")}}
+\def\doregisterbibtexentry [#1][#2]{\ctxcommand{registerbibtexentry("#1","#2")}}
\def\doapplytobibtexsession[#1][#2]{\xmlprocessregistered{bibtex:#1}{#2}{#2}}
\unexpanded\def\bibtexcommand#1%
@@ -169,7 +169,7 @@
\def\bibxmlflush #1{\xmlcontext \currentbibxmlnode{/field[@name='#1']}}
\def\bibxmlsetup {\xmlsetup \currentbibxmlnode} % {#1}
-\def\currentbibtexformat{apa} % ho wto interface this, maybe split loading and key
+\def\currentbibtexformat{apa} % how to interface this, maybe split loading and key
\def\currentbibxmlnode {unset}
\def\currentbibxmltag {unset}
@@ -280,7 +280,6 @@
*doi*
\stopxmlsetups
-
\startxmlsetups bibtex:format:doi
% \bibdoifelse{\@@pb@biburl}{#1\expanded{\bibgotoURL{\@@pb@thekey}{\@@pb@biburl}}#2}{#3}
*url*
@@ -299,7 +298,7 @@
% lists
\def\bibtexlistprocessor
- {\ctxlua{bibtex.hacks.add(structure.lists.uservalue("\currentlist",\currentlistindex,"bibref"),\currentlistindex)}}
+ {\ctxlua{bibtex.hacks.add(structures.lists.uservalue("\currentlist",\currentlistindex,"bibref"),\currentlistindex)}}
\appendtoks
\definelist[\currentbibtexsession]%
@@ -456,17 +455,23 @@
\def\dodoloadbibtexpublicationalternative#1%
{\doonlyonce{#1}
- {\readsysfile{bxml-#1.mkiv}
+ {\startreadingfile
+ \readsysfile{bxml-#1.mkiv}
{\showmessage\m!publications{6}{bxml-#1}}
- {\showmessage\m!publications{1}{bxml-#1}}}}
+ {\showmessage\m!publications{1}{bxml-#1}}%
+ \stopreadingfile}}
\appendtoks
\doloadbibtexpublicationalternative
\to \everysetupbibtexpublications
-\appendtoks
- \doloadbibtexpublicationalternative
-\to \everyjob
+% we expect at least one invocation of the setup commands
+% because otherwise we always load the apa style even if
+% no publications are used
+%
+% \appendtoks
+% \doloadbibtexpublicationalternative
+% \to \everystarttext
% whatever, should be key
@@ -578,7 +583,7 @@
{\ifx\currentbibtexnumbering\v!short
\setbox\scratchbox\hbox{\bibtexpublicationsparameter\c!numbercommand{\bibtexpublicationsparameter\c!samplesize}}%
\else
- \setbox\scratchbox\hbox{\bibtexpublicationsparameter\c!numbercommand{\ctxlua{tex.write(structure.lists.size())}}}%
+ \setbox\scratchbox\hbox{\bibtexpublicationsparameter\c!numbercommand{\ctxlua{tex.write(structures.lists.size())}}}%
\fi
\bibtexnumberwidth\wd\scratchbox
\setuplist[\currentbibtexsession][\c!distance=\zeropoint]}
@@ -615,10 +620,12 @@
\doifelse{\bibtexpublicationsparameter\c!method}\v!local
{\ctxlua{bibtex.hacks.reset(1)}}% function can take method
{\ctxlua{bibtex.hacks.reset(2)}}%
- \placestructurelist
+ \doplacestructurelist
{\currentbibtexsession}
{\currentbibtexcriterium}
{\namedlistparameter\currentbibtexsession\c!number}%
+ {\namedlistparameter\currentbibtexsession\c!extras}%
+ {\namedlistparameter\currentbibtexsession\c!order}%
\ctxlua{bibtex.hacks.flush("\bibtexpublicationsparameter\c!sorttype")}%
\doendoflist}
@@ -627,7 +634,7 @@
\ifx\currentbibtexsessiontag\empty
% can't really happen
\else\ifx\currentbibtexcriterium\v!all
- \doplacepublicationindeed
+ \dotypesetbibtexpublication % was \doplacepublicationindeed
\else
\ctxlua{bibtex.hacks.doifalreadyplaced("\currentbibtexsessiontag")}
\donothing
@@ -822,17 +829,17 @@
\def\inbibtexlink#1#2%
{\doifreferencefoundelse{\bibtexrefprefix#1}
{\goto{#2}[\bibtexrefprefix#1]}
- {!#1!\unknownreference{#1}}}
+ {!#1!}}
\def\dobibtexgotolink#1#2%
{\doifreferencefoundelse{\bibtexrefprefix#1}
{\goto{#2}[\bibtexrefprefix#1]}
- {!#1!\unknownreference{#1}}}
+ {!#1!}}
\def\dobibattexlink#1#2%
{\doifreferencefoundelse{\bibtexrefprefix#1}
{\at{#2}[\bibtexrefprefix#1]}
- {!#1!\unknownreference{#1}}}
+ {!#1!}}
\def\dobibtexurllink#1#2%
{\expanded{\useURL[bibtex:url:#1][#2]}%
@@ -940,7 +947,7 @@
% \setuppublications[\c!refcommand=num]%
% \cite[#1]%
% \endgroup}
-% {\unknownreference{#1}}}
+% {}}
% compress years
% andtext namesep
@@ -956,7 +963,7 @@
\def\dodobibtexauthoryearref #1{\ctxlua{bibtex.authoryearref ("bibtex:\currentbibtexsession","#1","normal","author")}}
\def\dodobibtexauthoryearsref#1{\ctxlua{bibtex.authoryearsref("bibtex:\currentbibtexsession","#1","normal","author")}}
-\unexpanded\def\bibtexsingularplural#1#2{\ctxlua{bibtex.singular_or_plural(\!!bs#1\!!es,\!!bs#2\!!es)}}
+\unexpanded\def\bibtexsingularplural#1#2{\ctxlua{bibtex.singularorplural(\!!bs#1\!!es,\!!bs#2\!!es)}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/bibl-tra.lua b/Master/texmf-dist/tex/context/base/bibl-tra.lua
index 44223102859..4ae81188d87 100644
--- a/Master/texmf-dist/tex/context/base/bibl-tra.lua
+++ b/Master/texmf-dist/tex/context/base/bibl-tra.lua
@@ -6,21 +6,28 @@ if not modules then modules = { } end modules ['bibl-bib'] = {
license = "see context related readme files"
}
-bibtex = bibtex or { }
+bibtex = bibtex or { }
+local bibtex = bibtex
+
bibtex.hacks = bibtex.hacks or { }
+local hacks = bibtex.hacks
local match, gmatch, format, concat, sort = string.match, string.gmatch, string.format, table.concat, table.sort
-local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
local variables, constants = interfaces.variables, interfaces.constants
local trace_bibtex = false trackers.register("publications.bibtex", function(v) trace_bibtex = v end)
-local hacks = bibtex.hacks
+local report_tex = logs.reporter("publications","tex")
+
+local context, structures = context, structures
+
+local references = structures.references
+local sections = structures.sections
local list, done, alldone, used, registered, ordered = { }, { }, { }, { }, { }, { }
local mode = 0
-local template = string.striplong([[
+local template = utilities.strings.striplong([[
\citation{*}
\bibstyle{cont-%s}
\bibdata{%s}
@@ -34,7 +41,7 @@ function hacks.process(settings)
interfaces.showmessage("publications",3)
io.savedata(file.addsuffix(jobname,"aux"),format(template,style,database))
if trace_bibtex then
- logs.report("publications","processing bibtex file '%s'",jobname)
+ report_tex("processing bibtex file '%s'",jobname)
end
os.execute(format("bibtex %s",jobname))
-- purge 'm
@@ -43,12 +50,16 @@ end
function hacks.register(str)
if trace_bibtex then
- logs.report("publications","registering bibtex entry '%s'",str)
+ report_tex("registering bibtex entry '%s'",str)
end
registered[#registered+1] = str
ordered[str] = #registered
end
+function hacks.nofregistered()
+ return #registered
+end
+
function hacks.reset(m)
mode, list, done = m, { }, { }
end
@@ -58,14 +69,14 @@ function hacks.add(str,listindex)
-- skip
elseif mode == 1 then
-- all locals but no duplicates
- local sc = structure.sections.currentid()
+ local sc = sections.currentid()
if done[str] ~= sc then
done[str], alldone[str] = sc, true
list[#list+1] = { str, listindex }
end
elseif mode == 2 then
-- all locals but no preceding
- local sc = structure.sections.currentid()
+ local sc = sections.currentid()
if not alldone[str] and done[str] ~= sc then
done[str], alldone[str] = sc, true
list[#list+1] = { str, listindex }
@@ -73,13 +84,13 @@ function hacks.add(str,listindex)
end
end
-local function compare(a,b)
- local aa, bb = a[1], b[1]
+local function compare(a,b) -- quite some checking for non-nil
+ local aa, bb = a and a[1], b and b[1]
if aa and bb then
- return ordered[aa] < ordered[bb]
- else
- return true
+ local oa, ob = ordered[aa], ordered[bb]
+ return oa and ob and oa < ob
end
+ return false
end
function hacks.flush(sortvariant)
@@ -93,6 +104,12 @@ function hacks.flush(sortvariant)
end
end
+function hacks.filterall()
+ for i=1,#registered do
+ list[i] = { registered[i], i }
+ end
+end
+
function hacks.registerplaced(str)
used[str] = true
end
@@ -106,15 +123,16 @@ end
-- we look forward
local function compare(a,b)
- return a[3] < b[3]
+ local aa, bb = a and a[3], b and b[3]
+ return aa and bb and aa < bb
end
function hacks.resolve(prefix,block,reference) -- maybe already feed it split
- local subset = jobreferences.collected[prefix or ""] or jobreferences.collected[""]
+ local subset = references.collected[prefix or ""] or references.collected[""]
if subset then
- local result, done = { }, { }
+ local result, nofresult, done = { }, 0, { }
block = tonumber(block)
- for rest in gmatch(reference,"([^,%s]+)") do
+ for rest in gmatch(reference,"[^, ]+") do
local blk, tag, found = block, nil, nil
if block then
tag = blk .. ":" .. rest
@@ -136,9 +154,10 @@ function hacks.resolve(prefix,block,reference) -- maybe already feed it split
found = subset[tag]
end
if found then
- local current = found.entries and found.entries.text
+ local current = tonumber(found.entries and found.entries.text) -- tonumber needed
if current and not done[current] then
- result[#result+1] = { blk, rest, current }
+ nofresult = nofresult + 1
+ result[nofresult] = { blk, rest, current }
done[current] = true
end
end
@@ -146,8 +165,8 @@ function hacks.resolve(prefix,block,reference) -- maybe already feed it split
-- todo: ranges so the interface will change
sort(result,compare)
local first, last, firsti, lasti, firstr, lastr
- local collected = { }
- for i=1,#result do
+ local collected, nofcollected = { }, 0
+ for i=1,nofresult do
local r = result[i]
local current = r[3]
if not first then
@@ -156,28 +175,34 @@ function hacks.resolve(prefix,block,reference) -- maybe already feed it split
last, lasti, lastr = current, i, r
else
if last > first + 1 then
- collected[#collected+1] = { firstr[1], firstr[2], lastr[1], lastr[2] }
+ nofcollected = nofcollected + 1
+ collected[nofcollected] = { firstr[1], firstr[2], lastr[1], lastr[2] }
else
- collected[#collected+1] = { firstr[1], firstr[2] }
+ nofcollected = nofcollected + 1
+ collected[nofcollected] = { firstr[1], firstr[2] }
if last > first then
- collected[#collected+1] = { lastr[1], lastr[2] }
+ nofcollected = nofcollected + 1
+ collected[nofcollected] = { lastr[1], lastr[2] }
end
end
first, last, firsti, lasti, firstr, lastr = current, current, i, i, r, r
end
end
- if first then
+ if first and last then
if last > first + 1 then
- collected[#collected+1] = { firstr[1], firstr[2], lastr[1], lastr[2] }
+ nofcollected = nofcollected + 1
+ collected[nofcollected] = { firstr[1], firstr[2], lastr[1], lastr[2] }
else
- collected[#collected+1] = { firstr[1], firstr[2] }
+ nofcollected = nofcollected + 1
+ collected[nofcollected] = { firstr[1], firstr[2] }
if last > first then
- collected[#collected+1] = { lastr[1], lastr[2] }
+ nofcollected = nofcollected + 1
+ collected[nofcollected] = { lastr[1], lastr[2] }
end
end
end
- if #collected > 0 then
- for i=1,#collected do
+ if nofcollected > 0 then
+ for i=1,nofcollected do
local c = collected[i]
if c[3] then
context.dowithbibtexnumrefrange(#collected,i,prefix,c[1],c[2],c[3],c[4])
diff --git a/Master/texmf-dist/tex/context/base/bibl-tra.mkii b/Master/texmf-dist/tex/context/base/bibl-tra.mkii
index 087781db9b1..2c03a7f9160 100644
--- a/Master/texmf-dist/tex/context/base/bibl-tra.mkii
+++ b/Master/texmf-dist/tex/context/base/bibl-tra.mkii
@@ -506,6 +506,8 @@
{#1\@EA\cite\@EA[\@@pb@crossref]#2}
{#3}}
+\let\insertcrossref\gobblethreearguments
+
\appendtoks\let\insertcrossref\bibinsertcrossref\to\initializebibdefinitions
%D \macros{complexbibdef,specialbibinsert}
diff --git a/Master/texmf-dist/tex/context/base/bibl-tra.mkiv b/Master/texmf-dist/tex/context/base/bibl-tra.mkiv
index 519af0c6f77..8e2f61641f3 100644
--- a/Master/texmf-dist/tex/context/base/bibl-tra.mkiv
+++ b/Master/texmf-dist/tex/context/base/bibl-tra.mkiv
@@ -185,10 +185,11 @@
\setuplist
[pubs]
[\c!state=\v!start,
+ \c!criterium=\@@pbcriterium,
\c!width=]
\installstructurelistprocessor{pubs:userdata}%
- {\ctxlua{bibtex.hacks.add(structure.lists.uservalue("\currentlist",\currentlistindex,"bibref"),\currentlistindex)}}
+ {\ctxlua{bibtex.hacks.add(structures.lists.uservalue("\currentlist",\currentlistindex,"bibref"),\currentlistindex)}}
\newcount\bibtexblock \bibtexblock\plusone
@@ -295,28 +296,18 @@
%D We can omit already shown references (\v!global) or use fresh
%D lists each time (\v!local).
-\chardef\bibtexoncemode\plusone % 0=disable, 1=local, 2=global
+\setnewconstant\bibtexoncemode\plusone % 0=disable, 1=local, 2=global
\appendtoks
\doifelse\@@pbmethod\v!local
- {\chardef\bibtexoncemode\plusone}%
- {\chardef\bibtexoncemode\plustwo}%
+ {\bibtexoncemode\plusone}%
+ {\bibtexoncemode\plustwo}%
\to \everysetuppublications
%D Cite lists are compressed, if possible. This is set later on.
\newif\ifbibcitecompress\bibcitecompresstrue
-% \appendtoks
-% \processaction
-% [\@@pbnumbering]
-% [ \v!yes=>\let\@@pbinumbercommand\firstofoneargument,
-% \v!no=>\let\@@pbinumbercommand\gobbleoneargument,
-% \v!short=>\def\@@pbinumbercommand##1{\bibgetvars\currentpublicationkey},
-% \v!bib=>\def\@@pbinumbercommand##1{\bibgetvarn\currentpublicationkey},
-% \s!unknown=>\let\@@pbinumbercommand\firstofoneargument]%
-% \to \everysetuppublications
-
\def\@@pbinumbercommand{\executeifdefined{\??pb:\c!numbercommand:\@@pbnumbering}\firstofoneargument}
\letvalue{\??pb:\c!numbercommand:\v!yes }\firstofoneargument
@@ -348,16 +339,10 @@
\def\usepublications[#1]%
{\processcommalist[#1]\dousepublications}
-% \def\dousepublications#1%
-% {\doonlyonce{#1.\f!bibextension}
-% {\readfile{#1.\f!bibextension}
-% {\showmessage\m!publications{4}{#1.\f!bibextension}}
-% {\showmessage\m!publications{2}{#1.\f!bibextension}}}}
-
\def\dousepublications#1%
{\doonlyonce{#1.\f!bibextension}{\dodousepublications{#1}}}
-\def\dodousepublications#1%
+\def\dodousepublications#1% brr, this par stuff
{\let\@@savedpar\par
\let\par\ignorespaces
\ifhmode\kern\zeropoint\fi
@@ -394,7 +379,10 @@
\let\normalsetuppublicationlayout\setuppublicationlayout
-\setuppublicationlist[\c!title=,\c!command=\dospecialbibinsert,\c!maybeyear=\v!on]
+\setuppublicationlist
+ [\c!title=,
+ \c!command=\dospecialbibinsert,
+ \c!maybeyear=\v!on]
%D \macros{bibalternative}
%D
@@ -442,20 +430,6 @@
\processcommacommand[\bibcommandlist]\simplebibdef
-% \def\bibinsertdoi#1#2#3%
-% {\begingroup
-% \bibdoifelse{\@@pb@doi}%
-% {\edef\ascii{\detokenize\expandafter{\@@pb@doi}}% probably not ok, to less expansion
-% #1\expanded{\bibgotoDOI{\@@pb@thekey}{\ascii}}#2}{#3}%
-% \endgroup}
-%
-% \def\bibinsertbiburl#1#2#3%
-% {\begingroup
-% \bibdoifelse{\@@pb@biburl}%
-% {\edef\ascii{\detokenize\expandafter{\@@pb@biburl}}% probably not ok, to less expansion
-% #1\expanded{\bibgotoURL{\@@pb@thekey}{\ascii}}#2}{#3}%
-% \endgroup}
-
\def\bibinsertdoi#1#2#3% let's see how this fails
{\bibdoifelse{\@@pb@doi}{#1\expanded{\bibgotoDOI{\@@pb@thekey}{\@@pb@doi}}#2}{#3}}
@@ -506,19 +480,6 @@
%D \specialbibinsert{author}{\author@num}{<before>}{<after>}{<not>}
%D \stoptyping
-% \def\docomplexbibdef#1%
-% {\def\currentype{#1}%
-% \dosingleempty\dodocomplexbibdef}
-
-% \def\dodocomplexbibdef[#1]#2%
-% {\def\firstarg{#1}\def\secondarg{#2}%
-% \dosingleempty\dododocomplexbibdef}
-
-% \def\dododocomplexbibdef[#1]#2#3%
-% {\@EA\increment\csname\currentype @num\endcsname
-% \setevalue{\??pb @\currentype\csname \currentype @num\endcsname}%
-% {{\secondarg}{#2}{#3}{#1}{\firstarg}}\ignorespaces}
-
\def\docomplexbibdef#1%
{\dodoubleempty\dodocomplexbibdef[#1]}
@@ -583,29 +544,6 @@
%D \#2 = number of items to be typeset
%D \#3 = commacommand containing authors
-% \def\dospecialbibinsert#1#2#3%
-% {\getcommacommandsize[#3]%
-% \scratchcounter\zerocount
-% \def\processauthoritem##1%
-% {\advance\scratchcounter\plusone
-% \ifnum\numexpr\scratchcounter-\plusone\relax<#2\relax
-% \publicationlistparameter{#1}##1%
-% \ifnum\scratchcounter=#2\relax
-% \ifnum\etallimitcounter<\commalistsize\relax
-% \bibalternative{#1etaltext}%
-% \fi
-% \else\ifnum\numexpr\scratchcounter+\plusone\relax=#2\relax
-% \ifnum\commalistsize>\plustwo
-% \bibalternative\c!finalnamesep
-% \else
-% \bibalternative\c!lastnamesep
-% \fi
-% \else
-% \bibalternative\c!namesep
-% \fi\fi
-% \fi}%
-% \processcommacommand[#3]\processauthoritem}
-
\def\doprocessauthoritem#1#2#3%
{\advance\scratchcounter\plusone
\ifnum\numexpr\scratchcounter-\plusone\relax<#2\relax
@@ -678,22 +616,6 @@
\def\clearbibitem#1{\setvalue{\??pb @#1}{}}%
-% \def\clearbibitemtwo#1%
-% {\letvalue{#1@num}\!!zerocount
-% \doloop
-% {\doifdefinedelse{\??pb @#1\recurselevel}
-% {\letvalue{\??pb @#1\recurselevel}\empty} % why not undefined?
-% {\exitloop}}}
-
-% \def\clearbibitemtwo#1%
-% {\letvalue{#1@num}\!!zerocount
-% \doloop
-% {\ifcsname\??pb @#1\recurselevel\endcsname
-% \expandafter\let\csname\??pb @#1\recurselevel\undefined
-% \else
-% \exitloop
-% \fi}}
-
\def\clearbibitemtwo#1% is this reset really needed? after all we reset the counter and we are local
{%\dofastrecurse\plusone{\csname#1@num\endcsname}\plusone{\expandafter\let\csname\??pb @#1\recurselevel\undefined}%
\letvalue{#1@num}\!!zerocount}
@@ -735,7 +657,7 @@
\unexpanded\def\startpublication
{\begingroup
- \catcode`\%=\othercatcode
+ \catcode\commentasciicode\othercatcode
\dosingleempty\dostartpublication}
\let\stoppublication\relax
@@ -786,7 +708,7 @@
{\preloadbiblist
\doifdefinedelse{pbd:#1}
\firstoftwoarguments
- {\showmessage\m!publications{5}{#1 is unknown}\secondoftwoarguments}}
+ {\showmessage\m!publications{5}{#1}\secondoftwoarguments}}
%D \macros{bib@crossref}
%D
@@ -804,6 +726,8 @@
\def\bibinsertcrossref#1#2#3%
{\bibdoifelse\@@pb@crossref{#1\cite[\@@pb@crossref]#2}{#3}}
+\let\insertcrossref\gobblethreearguments
+
\appendtoks\let\insertcrossref\bibinsertcrossref\to\initializebibdefinitions
%D The next macro is needed because the number command of the
@@ -814,17 +738,28 @@
\def\doprocessbibtexentry#1{\typesetapublication{#1}}
\def\typesetpubslist
- {\dobeginoflist
+ {\preloadbiblist
+ \dobeginoflist
% \the\initializebibdefinitions % COMMENTED
\edef\currentlist{pubs}%
- \doif{\listparameter\c!criterium}\v!cite{\setuplist[pubs][\c!criterium=\v!here]}%
\ctxlua{bibtex.hacks.reset(\number\bibtexoncemode)}%
- \placestructurelist{pubs}{\listparameter\c!criterium}{\listparameter\c!number}%
+ \doifelse{\listparameter\c!criterium}\v!all
+ {\showmessage\m!publications{7}{}%
+ \ctxlua{bibtex.hacks.filterall()}}
+ {\doif{\listparameter\c!criterium}\v!cite
+ {\setuplist[pubs][\c!criterium=\v!here]}%
+ \doplacestructurelist
+ {pubs}%
+ {\listparameter\c!criterium}%
+ {\listparameter\c!number}%
+ {\listparameter\c!extras}%
+ {\listparameter\c!order}}%
\ctxlua{bibtex.hacks.flush("\@@pbsorttype")}%
\doendoflist}
\newif\ifinpublist
+
\def\initializepubslist
{\def\currentlist{pubs}%
\edef\@@pbnumbering{\@@pbnumbering}%
@@ -832,7 +767,10 @@
{\ifx\@@pbnumbering\v!short
\setbox\scratchbox\hbox{\@@pbnumbercommand{\listparameter\c!samplesize}}%
\else
- \setbox\scratchbox\hbox{\@@pbnumbercommand{\ctxlua{tex.write(structure.lists.size())}}}%
+ \doifelse{\listparameter\c!criterium}\v!all
+ {\setbox\scratchbox\hbox{\@@pbnumbercommand{\ctxlua{tex.write{bibtex.hacks.nofregistered()}}}}}
+ {\determinelistcharacteristics[pubs]%
+ \setbox\scratchbox\hbox{\@@pbnumbercommand{\structurelistsize}}}%
\fi
\edef\publistnumberbox{\hbox to \the\wd\scratchbox}%
\expanded{\setuplist[pubs][\c!width=\the\wd\scratchbox,\c!distance=\zeropoint]}%
@@ -871,7 +809,8 @@
\def\docompletepublications[#1]%
{\begingroup
- \setuplist[pubs][\c!criterium=\v!previous,#1]
+% \setuplist[pubs][\c!criterium=\v!previous,#1]
+ \setuplist[pubs][#1]
\doifelsenothing{\publicationlistparameter\c!title}
{\systemsuppliedchapter[pubs]{\headtext{pubs}}}
{\normalexpanded{\systemsuppliedchapter[pubs]{\publicationlistparameter\c!title}}}%
@@ -886,7 +825,8 @@
\def\doplacepublications[#1]%
{\begingroup
- \setuplist[pubs][\c!criterium=\v!previous,#1]%
+% \setuplist[pubs][\c!criterium=\v!previous,#1]%
+ \setuplist[pubs][#1]%
\dodoplacepublications}
\def\dodoplacepublications
@@ -901,6 +841,9 @@
\global\advance\bibtexblock\plusone}
%D \subsubject{What's in a publication}
+%D
+%D Watch out: here all means all publications in database, so use
+%D text when you want text only.
\unexpanded\def\typesetapublication#1%
{\doifsomething{#1}
@@ -970,17 +913,6 @@
%D \type{\cite} commands with a braced argument (these might appear
%D in included data from the \type{.bib} file).
-% \unexpanded\def\cite
-% {\doifnextoptionalelse\dodocite\dobibref}
-% \def\dobibref#1%
-% {\docite[#1][]}
-% \def\dodocite[#1]%
-% {\startstrictinspectnextcharacter
-% \dodoubleempty\dododocite[#1]}
-% \def\dododocite % [#1][#2]
-% {\stopstrictinspectnextcharacter
-% \docite}
-
\unexpanded\def\cite
{\strictdoifnextoptionalelse\dodocite\dobibref}
@@ -1283,9 +1215,9 @@
%D
%D The final task is looping over that list until a match is found.
-\def\gotobiblink#1[#2]{\doifreferencefoundelse{\bibrefprefix#2}{\goto{#1}[\bibrefprefix#2]}{\unknownreference{#2}}}
-\def\atbiblink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\at [\bibrefprefix#1]}{\unknownreference{#1}}}
-\def\inbiblink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\expanded{\goto{\currentreferencetext}}[\bibrefprefix#1]}{\unknownreference{#1}}}
+\def\gotobiblink#1[#2]{\doifreferencefoundelse{\bibrefprefix#2}{\goto{#1}[\bibrefprefix#2]}{}}
+\def\atbiblink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\at [\bibrefprefix#1]}{}}
+\def\inbiblink [#1]{\doifreferencefoundelse{\bibrefprefix#1}{\expanded{\goto{\currentreferencetext}}[\bibrefprefix#1]}{}}
%D \macros{bibauthoryearref,bibauthoryearsref,bibauthorref,bibyearref}
%D
@@ -1386,7 +1318,7 @@
{\bibinsertrefsep
\doifbibreferencefoundelse{#1}
{\gotobiblink{\bibgetvars{#1}}[#1]}
- {\unknownreference{#1}}}
+ {}}
\def\bibserialref[#1]%
{\bibalternative\v!left
@@ -1397,7 +1329,7 @@
{\bibinsertrefsep
\doifbibreferencefoundelse{#1}
{\gotobiblink{\bibgetvarn{#1}}[#1]}
- {\unknownreference{#1}}}
+ {}}
\def\bibkeyref[#1]%
{\bibalternative\v!left
@@ -1424,7 +1356,7 @@
{\bibinsertrefsep
\doifbibreferencefoundelse{#1}
{\expanded{\bibgotoDOI{#1}{\bibgetvaro{#1}}}}
- {\unknownreference{#1}}}
+ {}}
\def\biburlref[#1]%
{\bibalternative\v!left
@@ -1440,7 +1372,7 @@
{\bibinsertrefsep
\doifbibreferencefoundelse{#1}
{\expanded{\bibgotoURL{#1}{\bibgetvaru{#1}}}}
- {\unknownreference{#1}}}
+ {}}
\def\bibtyperef[#1]%
{\bibalternative\v!left
@@ -1451,7 +1383,7 @@
{\bibinsertrefsep
\doifbibreferencefoundelse{#1}
{\gotobiblink{\bibgetvart{#1}}[#1]}
- {\unknownreference{#1}}}
+ {}}
\def\bibpageref[#1]%
{\bibalternative\v!left
@@ -1473,7 +1405,7 @@
{\bibinsertrefsep
\doifbibreferencefoundelse{#1}
{\dotypesetapublication{#1}}
- {\unknownreference{#1}}}
+ {}}
\let\bibnoneref\nocite
@@ -1529,7 +1461,7 @@
\setuppublications[\c!refcommand=num]%
\cite[#1]%
\endgroup}
- {\unknownreference{#1}}}
+ {}}
%D And some defaults are loaded from bibl-apa:
@@ -1539,6 +1471,8 @@
[\c!monthconversion=,
\c!alternative=apa,
\c!method=\v!global,
+ %\c!criterium=\v!previous,
+ \c!criterium=\v!cite, % mojca wants this so bother her, not me
\c!refcommand=num,
\c!numbercommand=\bibleftnumber]
diff --git a/Master/texmf-dist/tex/context/base/blob-ini.lua b/Master/texmf-dist/tex/context/base/blob-ini.lua
index 0f7ccee26c5..48cf4e39314 100644
--- a/Master/texmf-dist/tex/context/base/blob-ini.lua
+++ b/Master/texmf-dist/tex/context/base/blob-ini.lua
@@ -6,8 +6,11 @@ if not modules then modules = { } end modules ['blob-ini'] = {
license = "see context related readme files"
}
--- later we will consider an OO variant.
-
+-- Experimental ... names and functionality will change ... just a
+-- place to collect code, so:
+--
+-- DON'T USE THESE FUNCTIONS AS THEY WILL CHANGE!
+--
-- This module is just a playground. Occasionally we need to typeset
-- at the lua and and this is one method. In principle we can construct
-- pages this way too which sometimes makes sense in dumb cases. Actually,
@@ -20,17 +23,22 @@ if not modules then modules = { } end modules ['blob-ini'] = {
-- collapse or new pars
-- interline spacing etc
--- DON'T USE THESE FUNCTIONS AS THEY WILL CHANGE!
+-- blob.char
+-- blob.line
+-- blob.paragraph
+-- blob.page
local type = type
-
-local utfvalues = string.utfvalues
local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
-local fontdata = fonts.identifiers
+local report_blobs = logs.reporter("blobs")
+
+local fontdata = fonts.hashes.identifiers
+
+local nodepool = nodes.pool
-local new_glyph_node = nodes.glyph
-local new_glue_node = nodes.glyph
+local new_glyph = nodepool.glyph
+local new_glue = nodepool.glue
local copy_node = node.copy
local copy_node_list = node.copy_list
@@ -57,70 +65,34 @@ local ctxtextcapture = lpeg.Ct ( (
)
)^0)
-local function tonodes(str,fnt,attr) -- (str,template_glyph)
- if not str or str == "" then
- return
- end
- local head, tail, space, fnt, template = nil, nil, nil, nil, nil
- if not fnt then
- fnt = current_font()
- elseif type(fnt) ~= "number" and fnt.id == "glyph" then
- fnt, template = nil, fnt
- -- else
- -- already a number
- end
- for s in utfvalues(str) do
- local n
- if s == 32 then
- if not space then
- local parameters = fontdata[fnt].parameters
- space = new_glue_node(parameters.space,parameters.space_stretch,parameters.space_shrink)
- n = space
- else
- n = copy_node(space)
- end
- elseif template then
- n = copy_node(template)
- n.char = s
- else
- n = new_glyph_node(fnt,s)
- end
- if attr then -- normall false when template
- n.attr = copy_node_list(attr)
- end
- if head then
- insert_node_after(head,tail,n)
- else
- head = n
- end
- tail = n
- end
- return head, tail
-end
-
-blobs.tonodes = tonodes
-
function blobs.new()
return {
list = { },
}
end
-function blobs.append(t,str)
- local kind = type(str)
+function blobs.append(t,str) -- will be link nodes.link
+ local typ = type(str)
local dummy = nil
- if kind == "string" then
+ if typ == "number" then
+ str = tostring(str)
+ typ = "string"
+ end
+ local list = t.list
+ if typ == "string" then
local pars = lpegmatch(ctxtextcapture,str)
- local list = t.list
+ local noflist = #list
for p=1,#pars do
local str = pars[p]
if #str == 0 then
- list[#list+1 ] = { head = nil, tail = nil }
+ noflist = noflist + 1
+ list[noflist] = { head = nil, tail = nil }
else
- local l = list[#list]
+ local l = list[noflist]
if not l then
l = { head = nil, tail = nil }
- list[#list+1 ] = l
+ noflist = noflist + 1
+ list[noflist] = l
end
local head, tail = tonodes(str,nil,nil)
if head then
@@ -147,7 +119,7 @@ function blobs.pack(t,how)
if how == "vertical" then
-- we need to prepend a local par node
-- list[i].pack = node.vpack(list[i].head,"exactly")
- logs.report("blobs","vpack not yet supported")
+ report_blobs("vpack not yet supported")
else
list[i].pack = hpack_node_list(list[i].head,"exactly")
end
@@ -163,3 +135,25 @@ function blobs.write(t)
end
end
end
+
+
+-- blob.char
+-- blob.line: head, tail
+-- blob.paragraph
+-- blob.page
+
+--~ local lineblob = {
+--~ type = "line",
+--~ head = false,
+--~ tail = false,
+--~ pack = false,
+--~ properties = { },
+--~ end
+
+--~ local parblob = {
+--~ type = "line",
+--~ head = false,
+--~ tail = false,
+--~ pack = false,
+--~ properties = { },
+--~ end
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-default.lua b/Master/texmf-dist/tex/context/base/buff-imp-default.lua
new file mode 100644
index 00000000000..72a49d6253b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-default.lua
@@ -0,0 +1,42 @@
+if not modules then modules = { } end modules ['buff-imp-default'] = {
+ version = 1.001,
+ comment = "companion to buff-imp-default.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local patterns, P, V = lpeg.patterns, lpeg.P, lpeg.V
+local makepattern = visualizers.makepattern
+
+local handler = visualizers.newhandler()
+
+local grammar = { "visualizer",
+
+ -- basic
+
+ signal = makepattern(handler,"signal", visualizers.signalpattern),
+ emptyline = makepattern(handler,"emptyline",patterns.emptyline),
+ beginline = makepattern(handler,"beginline",patterns.beginline),
+ newline = makepattern(handler,"newline", patterns.newline),
+ space = makepattern(handler,"space", patterns.space),
+ default = makepattern(handler,"default", patterns.utf8char),
+ content = makepattern(handler,"default", patterns.somecontent), -- not too efficient
+
+ -- handy
+
+ -- line = V("newline") * V("emptyline")^0 * V("beginline"),
+ line = V("newline") * V("emptyline")^0 * V("beginline") + V("emptyline") + V("newline"),
+ whitespace = (V("space") + V("line"))^1,
+ optionalwhitespace = (V("space") + V("line"))^0,
+
+ -- used
+
+ pattern = V("line") + V("space") + V("signal") + V("content"),
+ visualizer = V("pattern")^1
+
+}
+
+local parser = P(grammar)
+
+visualizers.register("default", { parser = parser, handler = handler, grammar = grammar })
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-default.mkiv b/Master/texmf-dist/tex/context/base/buff-imp-default.mkiv
new file mode 100644
index 00000000000..7a935e218b8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-default.mkiv
@@ -0,0 +1,43 @@
+%D \module
+%D [ file=buff-imp-default,
+%D version=2010.10.19,
+%D title=\CONTEXT\ Visualizer Macros,
+%D subtitle=Default,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{buff-imp-default.lua}{1.001}
+
+\unprotect
+
+\definestartstop
+ [DefaultSnippet]
+ [\c!before=\blank,
+ \c!after=\blank,
+ \c!style=\tt]
+
+% Name
+% NamePrimitive
+% NamePlain
+% NameMetafun
+% Group
+% Boundary
+% Special
+% Comment
+% Constructor
+% Key
+% Entity
+% String
+% Equal
+% Cdata
+% Instruction
+
+% Value
+% Quote
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-escaped.lua b/Master/texmf-dist/tex/context/base/buff-imp-escaped.lua
new file mode 100644
index 00000000000..159921e2a85
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-escaped.lua
@@ -0,0 +1,14 @@
+if not modules then modules = { } end modules ['buff-imp-escaped'] = {
+ version = 1.001,
+ comment = "companion to buff-imp-escaped.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+visualizers.registerescapepattern("/BTEX/ETEX","/BTEX","/ETEX")
+
+visualizers.register("escaped", {
+ parser = visualizers.escapepatterns["/BTEX/ETEX"],
+ handler = visualizers.newhandler(),
+})
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-escaped.mkiv b/Master/texmf-dist/tex/context/base/buff-imp-escaped.mkiv
new file mode 100644
index 00000000000..55d2fb093bd
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-escaped.mkiv
@@ -0,0 +1,18 @@
+%D \module
+%D [ file=buff-imp-escaped,
+%D version=2010.10.19,
+%D title=\CONTEXT\ Visualizer Macros,
+%D subtitle=Escaped,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{buff-imp-escaped.lua}{1.001}
+
+\unprotect
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-lua.lua b/Master/texmf-dist/tex/context/base/buff-imp-lua.lua
new file mode 100644
index 00000000000..3a3bb3d2c08
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-lua.lua
@@ -0,0 +1,208 @@
+if not modules then modules = { } end modules ['buff-imp-lua'] = {
+ version = 1.001,
+ comment = "companion to buff-imp-lua.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- borrowed from scite
+--
+-- depricated:
+--
+-- gcinfo unpack getfenv setfenv loadlib
+-- table.maxn table.getn table.setn
+-- math.log10 math.mod math.modf math.fmod
+
+local format, tohash = string.format, table.tohash
+local P, S, V, patterns = lpeg.P, lpeg.S, lpeg.V, lpeg.patterns
+local C, Cs, Cg, Cb, Cmt, Carg = lpeg.C, lpeg.Cs, lpeg.Cg, lpeg.Cb, lpeg.Cmt, lpeg.Carg
+
+local core = tohash {
+ "and", "break", "do", "else", "elseif", "end", "false", "for", "function",
+ "if", "in", "local", "nil", "not", "or", "repeat", "return", "then",
+ "true", "until", "while"
+}
+
+local base = tohash {
+ "assert", "collectgarbage", "dofile", "error", "loadfile",
+ "loadstring", "print", "rawget", "rawset", "require", "tonumber",
+ "tostring", "type", "_G", "getmetatable", "ipairs", "next", "pairs",
+ "pcall", "rawequal", "setmetatable", "xpcall", "module", "select",
+}
+
+local libraries = {
+ coroutine = tohash {
+ "create", "resume", "status", "wrap", "yield", "running",
+ },
+ package = tohash{
+ "cpath", "loaded", "loadlib", "path", "config", "preload", "seeall",
+ },
+ io = tohash{
+ "close", "flush", "input", "lines", "open", "output", "read", "tmpfile",
+ "type", "write", "stdin", "stdout", "stderr", "popen",
+ },
+ math = tohash{
+ "abs", "acos", "asin", "atan", "atan2", "ceil", "cos", "deg", "exp",
+ "floor ", "ldexp", "log", "max", "min", "pi", "pow", "rad", "random",
+ "randomseed", "sin", "sqrt", "tan", "cosh", "sinh", "tanh", "huge",
+ },
+ string = tohash{
+ "byte", "char", "dump", "find", "len", "lower", "rep", "sub", "upper",
+ "format", "gfind", "gsub", "gmatch", "match", "reverse",
+ },
+ table = tohash{
+ "concat", "foreach", "foreachi", "sort", "insert", "remove", "pack",
+ "unpack",
+ },
+ os = tohash{
+ "clock", "date", "difftime", "execute", "exit", "getenv", "remove",
+ "rename", "setlocale", "time", "tmpname",
+ },
+ lpeg = tohash{
+ "print", "match", "locale", "type", "version", "setmaxstack",
+ "P", "R", "S", "C", "V", "Cs", "Ct", "Cs", "Cp", "Carg",
+ "Cg", "Cb", "Cmt", "Cf", "B",
+ },
+ -- bit
+ -- debug
+}
+
+local context = context
+local verbatim = context.verbatim
+local makepattern = visualizers.makepattern
+
+local LuaSnippet = context.LuaSnippet
+local startLuaSnippet = context.startLuaSnippet
+local stopLuaSnippet = context.stopLuaSnippet
+
+local LuaSnippetBoundary = verbatim.LuaSnippetBoundary
+local LuaSnippetQuote = verbatim.LuaSnippetQuote
+local LuaSnippetString = verbatim.LuaSnippetString
+local LuaSnippetSpecial = verbatim.LuaSnippetSpecial
+local LuaSnippetComment = verbatim.LuaSnippetComment
+local LuaSnippetNameCore = verbatim.LuaSnippetNameCore
+local LuaSnippetNameBase = verbatim.LuaSnippetNameBase
+local LuaSnippetNameLibraries = verbatim.LuaSnippetNameLibraries
+local LuaSnippetName = verbatim.LuaSnippetName
+
+local namespace
+
+local function visualizename_a(s)
+ if core[s] then
+ namespace = nil
+ LuaSnippetNameCore(s)
+ elseif base[s] then
+ namespace = nil
+ LuaSnippetNameBase(s)
+ else
+ namespace = libraries[s]
+ if namespace then
+ LuaSnippetNameLibraries(s)
+ else
+ LuaSnippetName(s)
+ end
+ end
+end
+
+local function visualizename_b(s)
+ if namespace and namespace[s] then
+ namespace = nil
+ LuaSnippetNameLibraries(s)
+ else
+ LuaSnippetName(s)
+ end
+end
+
+local function visualizename_c(s)
+ LuaSnippetName(s)
+end
+
+local handler = visualizers.newhandler {
+ startinline = function() LuaSnippet(false,"{") end,
+ stopinline = function() context("}") end,
+ startdisplay = function() startLuaSnippet() end,
+ stopdisplay = function() stopLuaSnippet() end ,
+ boundary = function(s) LuaSnippetBoundary(s) end,
+ special = function(s) LuaSnippetSpecial(s) end,
+ comment = function(s) LuaSnippetComment(s) end,
+ quote = function(s) LuaSnippetQuote(s) end,
+ string = function(s) LuaSnippetString(s) end,
+ period = function(s) verbatim(s) end,
+ name_a = visualizename_a,
+ name_b = visualizename_b,
+ name_c = visualizename_c,
+}
+
+local comment = P("--")
+local name = (patterns.letter + patterns.underscore)
+ * (patterns.letter + patterns.underscore + patterns.digit)^0
+local boundary = S('()[]{}')
+local special = S("-+/*^%=#") + P("..")
+
+-- The following longstring parser is taken from Roberto's documentation
+-- that can be found at http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html.
+
+local equals = P("=")^0
+local open = P("[") * Cg(equals, "init") * P("[") * P("\n")^-1 -- maybe better: patterns.newline^-1
+local close = P("]") * C(equals) * P("]")
+local closeeq = Cmt(close * Cb("init"), function(s,i,a,b) return a == b end)
+local longstring = open * Cs((P(1) - closeeq)^0) * close * Carg(1)
+
+local function long(content,equals,settings)
+ handler.boundary(format("[%s[",equals or ""))
+ visualizers.write(content,settings) -- unhandled
+ handler.boundary(format("]%s]",equals or ""))
+end
+
+local grammar = visualizers.newgrammar("default", { "visualizer",
+ sstring =
+ makepattern(handler,"quote",patterns.dquote)
+ * (V("whitespace") + makepattern(handler,"string",1-patterns.dquote))^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
+ * makepattern(handler,"quote",patterns.squote),
+ longstring =
+ longstring / long,
+ comment =
+ makepattern(handler,"comment",comment)
+ * (V("space") + V("content"))^0,
+ longcomment =
+ makepattern(handler,"comment",comment)
+ * longstring / long,
+ name =
+ makepattern(handler,"name_a",name)
+ * ( V("optionalwhitespace")
+ * makepattern(handler,"default",patterns.period)
+ * V("optionalwhitespace")
+ * makepattern(handler,"name_b",name)
+ )^-1
+ * ( V("optionalwhitespace")
+ * makepattern(handler,"default",patterns.period)
+ * V("optionalwhitespace")
+ * makepattern(handler,"name_c",name)
+ )^0,
+
+ pattern =
+ V("longcomment")
+ + V("comment")
+ + V("longstring")
+ + V("dstring")
+ + V("sstring")
+ + V("name")
+ + makepattern(handler,"boundary",boundary)
+ + makepattern(handler,"special",special)
+
+ + V("space")
+ + V("line")
+ + V("default"),
+
+ visualizer =
+ V("pattern")^1
+} )
+
+local parser = P(grammar)
+
+visualizers.register("lua", { parser = parser, handler = handler, grammar = grammar } )
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-lua.mkiv b/Master/texmf-dist/tex/context/base/buff-imp-lua.mkiv
new file mode 100644
index 00000000000..a04e2385143
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-lua.mkiv
@@ -0,0 +1,69 @@
+%D \module
+%D [ file=buff-imp-lua,
+%D version=2010.10.19,
+%D title=\CONTEXT\ Visualizer Macros,
+%D subtitle=\LUA,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{buff-imp-lua.lua}{1.001}
+
+\unprotect
+
+\definestartstop
+ [LuaSnippet]
+ [DefaultSnippet]
+
+\definestartstop
+ [LuaSnippetName]
+ [\c!color=,
+ \c!style=boldface]
+
+\definestartstop
+ [LuaSnippetNameCore]
+ [\c!color=darkgreen,
+ \c!style=boldface]
+
+\definestartstop
+ [LuaSnippetNameBase]
+ [\c!color=darkgreen,
+ \c!style=boldface]
+
+\definestartstop
+ [LuaSnippetNameLibraries]
+ [\c!color=darkgreen,
+ \c!style=boldface]
+
+\definestartstop
+ [LuaSnippetBoundary]
+ [\c!color=darkblue,
+ \c!style=boldface]
+
+\definestartstop
+ [LuaSnippetString]
+ [LuaSnippet]
+
+\definestartstop
+ [LuaSnippetQuote]
+ [LuaSnippetBoundary]
+
+\definestartstop
+ [LuaSnippetSpecial]
+ [\c!color=darkred,
+ \c!style=boldface]
+
+\definestartstop
+ [LuaSnippetComment]
+ [\c!color=darkyellow,
+ \c!style=boldface]
+
+\definetyping
+ [LUA]
+ [\c!option=lua]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/pret-mp.lua b/Master/texmf-dist/tex/context/base/buff-imp-mp.lua
index 782adf5f5a2..6b8a2653661 100644
--- a/Master/texmf-dist/tex/context/base/pret-mp.lua
+++ b/Master/texmf-dist/tex/context/base/buff-imp-mp.lua
@@ -1,23 +1,14 @@
-if not modules then modules = { } end modules ['pret-mp'] = {
+if not modules then modules = { } end modules ['buff-imp-mp'] = {
version = 1.001,
- comment = "companion to buff-ver.mkiv",
+ comment = "companion to buff-imp-mp.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
-local utf = unicode.utf8
+local P, S, V, patterns = lpeg.P, lpeg.S, lpeg.V, lpeg.patterns
-local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
-local utfbyte, utffind = utf.byte, utf.find
-local texsprint, texwrite = tex.sprint, tex.write
-local ctxcatcodes = tex.ctxcatcodes
-
-local visualizer = buffers.newvisualizer("mp")
-
-visualizer.identifiers = { }
-
-visualizer.identifiers.primitives = {
+local primitives = table.tohash {
'charcode', 'day', 'linecap', 'linejoin', 'miterlimit', 'month', 'pausing',
'prologues', 'showstopping', 'time', 'tracingcapsules', 'tracingchoices',
'tracingcommands', 'tracingequations', 'tracinglostchars',
@@ -59,7 +50,7 @@ visualizer.identifiers.primitives = {
'end', 'btex', 'etex', 'verbatimtex'
}
-visualizer.identifiers.plain = {
+local plain = table.tohash {
'ahangle', 'ahlength', 'bboxmargin', 'defaultpen', 'defaultscale',
'labeloffset', 'background', 'currentpen', 'currentpicture', 'cuttings',
'defaultfont', 'extra_beginfig', 'extra_endfig',
@@ -86,7 +77,7 @@ visualizer.identifiers.plain = {
'font_extra_space'
}
-visualizer.identifiers.metafun = {
+local metafun = table.tohash {
'unitcircle', 'fulldiamond', 'unitdiamond',
'halfcircle', 'quartercircle',
'llcircle', 'lrcircle', 'urcircle', 'ulcircle',
@@ -108,129 +99,78 @@ visualizer.identifiers.metafun = {
'loadfigure', 'externalfigure'
}
-visualizer.styles = {
- primitives = "",
- plain = "\\sl",
- metafun = "\\sl",
+local context = context
+local verbatim = context.verbatim
+local makepattern = visualizers.makepattern
+
+local MetapostSnippet = context.MetapostSnippet
+local startMetapostSnippet = context.startMetapostSnippet
+local stopMetapostSnippet = context.stopMetapostSnippet
+
+local MetapostSnippetConstructor = verbatim.MetapostSnippetConstructor
+local MetapostSnippetBoundary = verbatim.MetapostSnippetBoundary
+local MetapostSnippetSpecial = verbatim.MetapostSnippetSpecial
+local MetapostSnippetComment = verbatim.MetapostSnippetComment
+local MetapostSnippetNamePrimitive = verbatim.MetapostSnippetNamePrimitive
+local MetapostSnippetNamePlain = verbatim.MetapostSnippetNamePlain
+local MetapostSnippetNameMetafun = verbatim.MetapostSnippetNameMetafun
+local MetapostSnippetName = verbatim.MetapostSnippetName
+
+local function visualizename(s)
+ if primitives[s] then
+ MetapostSnippetNamePrimitive(s)
+ elseif plain[s] then
+ MetapostSnippetNamePlain(s)
+ elseif metafun[s] then
+ MetapostSnippetNameMetafun(s)
+ else
+ MetapostSnippetName(s)
+ end
+end
+
+local handler = visualizers.newhandler {
+ startinline = function() MetapostSnippet(false,"{") end,
+ stopinline = function() context("}") end,
+ startdisplay = function() startMetapostSnippet() end,
+ stopdisplay = function() stopMetapostSnippet() end ,
+ constructor = function(s) MetapostSnippetConstructor(s) end,
+ boundary = function(s) MetapostSnippetBoundary(s) end,
+ special = function(s) MetapostSnippetSpecial(s) end,
+ comment = function(s) MetapostSnippetComment(s) end,
+ string = function(s) MetapostSnippetString(s) end,
+ quote = function(s) MetapostSnippetQuote(s) end,
+ name = visualizename,
}
-local styles = visualizer.styles
+local comment = S("%")
+local name = (patterns.letter + S("_"))^1
+local constructor = S("$@#")
+local boundary = S('()[]:=<>;"')
+local special = S("-+/*|`!?^&%.,")
--- btex .. etex
+local grammar = visualizers.newgrammar("default", { "visualizer",
-local colors = {
- "prettyone",
- "prettytwo",
- "prettythree",
- "prettyfour",
-}
+ comment = makepattern(handler,"comment",comment)
+ * (V("space") + V("content"))^0,
+ dstring = makepattern(handler,"quote",patterns.dquote)
+ * makepattern(handler,"string",patterns.nodquote)
+ * makepattern(handler,"quote",patterns.dquote),
+ name = makepattern(handler,"name",name),
+ constructor = makepattern(handler,"constructor",constructor),
+ boundary = makepattern(handler,"boundary",boundary),
+ special = makepattern(handler,"special",special),
-local states = {
- [';']=1, ['$']=1, ['@']=1, ['#']=1,
- ['\\']=2,
- ['(']=3, [')']=3, ['[']=3, [']']=3, [':']=3, ['=']=3, ['<']=3, ['>']=3, ['"']=3,
- ['-']=4, ['+']=4, ['/']=4, ['*']=4, ['|']=4, ['`']=4, ['!']=4, ['?']=4, ['^']=4, ['&']=4, ['%']=4,
- ['%']=4, ['.']=4, [',']=4
-}
+ pattern =
+ V("comment") + V("dstring") + V("name") + V("constructor") + V("boundary") + V("special")
+ + V("newline") * V("emptyline")^0 * V("beginline")
+ + V("space")
+ + V("default"),
-local known_words = { }
+ visualizer =
+ V("pattern")^1
-for k,v in next, visualizer.identifiers do
- for _,w in next, v do
- known_words[w] = k
- end
-end
+} )
-local change_state, finish_state = buffers.change_state, buffers.finish_state
-
-local function flush_mp_word(state, word, intex)
- if word then
- if intex then
- if word == 'etex' then
- state = change_state(2,state)
- texwrite(word)
- state = finish_state(state)
- return state, false
- else
- texwrite(word)
- return state, true
- end
- else
- local id = known_words[word]
- if id then
- state = change_state(2,state)
- if styles[id] then
- texsprint(ctxcatcodes,styles[id])
- end
- texwrite(word)
- state = finish_state(state)
- return state, (word == 'btex') or (word == 'verbatimtex')
- else
- state = finish_state(state)
- texwrite(word)
- return state, intex
- end
- end
- else
- state = finish_state(state)
- return state, intex
- end
-end
+local parser = P(grammar)
--- todo: split string in code and comment, and escape comment fast
--- could be generic
-
--- to be considered: visualizer => table [result, instr, incomment, word]
-
-function visualizer.flush_line(str,nested)
- local state, word, instr, intex, incomment = 0, nil, false, false, false
- buffers.currentcolors = colors
- for c in utfcharacters(str) do
- if c == " " then
- state, intex = flush_mp_word(state, word, intex)
- word = nil
- texsprint(ctxcatcodes,"\\obs")
- elseif incomment then
- texwrite(c)
- elseif c == '%' then
- state = change_state(states[c], state)
- incomment = true
- texwrite(c)
- state = finish_state(state)
- elseif instr then
- if c == '"' then
- state = change_state(states[c],state)
- instr = false
- texwrite(c)
- state = finish_state(state)
- else
- texwrite(c)
- end
- elseif intex then
- if utffind(c,"^[%a]$") then
- if word then word = word .. c else word = c end
- else
- state, intex = flush_mp_word(state, word, intex)
- word = nil
- if intex then
- texwrite(c)
- else
- state = change_state(states[c], state)
- texwrite(c)
- end
- end
- elseif utffind(c,"^[%a]$") then
- state = finish_state(state)
- if word then word = word .. c else word = c end
- else
- state, intex = flush_mp_word(state, word, intex)
- word = nil
- state = change_state(states[c], state)
- texwrite(c)
- state = finish_state(state)
- instr = (c == '"')
- end
- end
- state, intex = flush_mp_word(state, word, intex)
- state = finish_state(state)
-end
+visualizers.register("mp", { parser = parser, handler = handler, grammar = grammar } )
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-mp.mkiv b/Master/texmf-dist/tex/context/base/buff-imp-mp.mkiv
new file mode 100644
index 00000000000..55e13b12da1
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-mp.mkiv
@@ -0,0 +1,76 @@
+%D \module
+%D [ file=buff-imp-mp,
+%D version=2010.10.19,
+%D title=\CONTEXT\ Visualizer Macros,
+%D subtitle=\METAPOST,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{buff-imp-mp.lua}{1.001}
+
+\unprotect
+
+\definestartstop
+ [MetapostSnippet]
+ [DefaultSnippet]
+
+\definestartstop
+ [MetapostSnippetName]
+ [\c!color=darkgreen,
+ \c!style=boldface]
+
+\definestartstop
+ [MetapostSnippetNamePrimitive]
+ [\c!color=darkgreen,
+ \c!style=swapface]
+
+\definestartstop
+ [MetapostSnippetNamePlain]
+ [\c!color=darkblue,
+ \c!color=darkgreen,
+ \c!style=swapface]
+
+\definestartstop
+ [MetapostSnippetNameMetafun]
+ [\c!color=darkred,
+ \c!color=darkgreen,
+ \c!style=swapface]
+
+\definestartstop
+ [MetapostSnippetConstructor]
+ [\c!color=darkred,
+ \c!style=boldface]
+
+\definestartstop
+ [MetapostSnippetBoundary]
+ [\c!color=darkblue,
+ \c!style=boldface]
+
+\definestartstop
+ [MetapostSnippetQuote]
+ [MetapostSnippetBoundary]
+
+\definestartstop
+ [MetapostSnippetSpecial]
+ [\c!color=darkyellow,
+ \c!style=boldface]
+
+\definestartstop
+ [MetapostSnippetString]
+ [MetapostSnippet]
+
+\definestartstop
+ [MetapostSnippetComment]
+ [\c!color=darkyellow,
+ \c!style=boldface]
+
+\definetyping
+ [MP]
+ [\c!option=mp]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-nested.lua b/Master/texmf-dist/tex/context/base/buff-imp-nested.lua
new file mode 100644
index 00000000000..019cd996d6e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-nested.lua
@@ -0,0 +1,80 @@
+if not modules then modules = { } end modules ['buff-imp-nested'] = {
+ version = 1.001,
+ comment = "companion to buff-imp-nested.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local lpegmatch, patterns = lpeg.match, lpeg.patterns
+local P, V, Carg = lpeg.P, lpeg.V, lpeg.Carg
+
+local context = context
+local verbatim = context.verbatim
+local variables = interfaces.variables
+
+local makepattern = visualizers.makepattern
+local getvisualizer = visualizers.getvisualizer
+
+local nested = nil
+
+local donestedtypingstart = context.donestedtypingstart
+local donestedtypingstop = context.donestedtypingstop
+
+local v_none = variables.none
+local v_slanted = variables.slanted
+
+local handler = visualizers.newhandler {
+ initialize = function(settings)
+ local option = settings and settings.option
+ if not option or option == "" then
+ nested = nil
+ elseif option == v_slanted then
+ nested = nil
+ elseif option == v_none then
+ nested = nil
+ else
+ nested = getvisualizer(option,"direct")
+ end
+ end,
+ open = function()
+ donestedtypingstart()
+ end,
+ close = function()
+ donestedtypingstop()
+ end,
+ content = function(s)
+ if nested then
+ nested(s)
+ else
+ verbatim(s)
+ end
+ end,
+}
+
+local open = P("<<")
+local close = P(">>")
+local rest = (1 - open - close - patterns.space - patterns.newline)^1
+
+local grammar = visualizers.newgrammar("default", {
+
+ initialize = patterns.beginofstring * Carg(1) / handler.initialize,
+
+ open = makepattern(handler,"open",open),
+ close = makepattern(handler,"close",close),
+ rest = makepattern(handler,"content",rest),
+
+ nested = V("open") * (V("pattern")^0) * V("close"),
+ pattern = V("line") + V("space") + V("nested") + V("rest"),
+
+ visualizer = V("initialize") * (V("pattern")^1)
+
+} )
+
+local parser = P(grammar)
+
+visualizers.register("nested", { parser = parser, handler = handler, grammar = grammar } )
+
+-- lpeg.match(parser,[[<<tf<<sl>>tf<<sl>>tf>>]]) context.par()
+-- lpeg.match(parser,[[<<tf<<sl<<tf>>sl>>tf>>]]) context.par()
+-- lpeg.match(parser,[[sl<<tf<<sl>>tf>>sl]]) context.par()
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-nested.mkiv b/Master/texmf-dist/tex/context/base/buff-imp-nested.mkiv
new file mode 100644
index 00000000000..627acc68508
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-nested.mkiv
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=buff-imp-nested,
+%D version=2010.10.19,
+%D title=\CONTEXT\ Visualizer Macros,
+%D subtitle=Nested,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{buff-imp-nested.lua}{1.001}
+
+\unprotect
+
+\unexpanded\def\donestedtypingstart{\bgroup\swaptypeface{}}
+\unexpanded\def\donestedtypingstop {\egroup{}}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-parsed-xml.lua b/Master/texmf-dist/tex/context/base/buff-imp-parsed-xml.lua
new file mode 100644
index 00000000000..22611ac8ab7
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-parsed-xml.lua
@@ -0,0 +1,101 @@
+if not modules then modules = { } end modules ['buff-imp-parsed-xml'] = {
+ version = 1.001,
+ comment = "companion to buff-imp-parsed-xml.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+
+local context = context
+local verbatim = context.verbatim
+
+local write = visualizers.write
+local writespace = visualizers.writespace
+local writeargument = visualizers.writeargument
+
+local ParsedXmlSnippetKey = context.ParsedXmlSnippetKey
+local ParsedXmlSnippetValue = context.ParsedXmlSnippetValue
+
+local ParsedXmlSnippetElement = verbatim.ParsedXmlSnippetElement
+local ParsedXmlSnippetInstruction = verbatim.ParsedXmlSnippetInstruction
+local ParsedXmlSnippetComment = verbatim.ParsedXmlSnippetComment
+local ParsedXmlSnippetCdata = verbatim.ParsedXmlSnippetCdata
+local ParsedXmlSnippetDoctype = verbatim.ParsedXmlSnippetDoctype
+
+local startParsedXmlSnippet = context.startParsedXmlSnippet
+local stopParsedXmlSnippet = context.stopParsedXmlSnippet
+
+local parsedxmlhandler = xml.newhandlers { -- todo: treat spaces and tabs
+ name = "parsedxml",
+ handle = function(...)
+ print("error:",...) -- we need a handler as fallback, even if not used
+ end,
+ functions = {
+ ["@el@"] = function(e,handler)
+ local at = e.at
+ if at and next(at) then
+ ParsedXmlSnippetElement(format("<%s",e.tg))
+ for k, v in next, at do
+ writespace()
+ ParsedXmlSnippetKey()
+ writeargument(k)
+ verbatim("=")
+ ParsedXmlSnippetValue()
+ writeargument(format("%q",k))
+ end
+ ParsedXmlSnippetElement(">")
+ else
+ ParsedXmlSnippetElement(format("<%s>",e.tg))
+ end
+ handler.serialize(e.dt,handler)
+ ParsedXmlSnippetElement(format("</%s>",e.tg))
+ end,
+ ["@pi@"] = function(e,handler)
+ ParsedXmlSnippetInstruction("<?")
+ write(e.dt[1])
+ ParsedXmlSnippetInstruction("?>")
+ end ,
+ ["@cm@"] = function(e,handler)
+ ParsedXmlSnippetComment("<!--")
+ write(e.dt[1])
+ ParsedXmlSnippetComment("-->")
+ end,
+ ["@cd@"] = function(e,handler)
+ ParsedXmlSnippetCdata("<![CDATA[")
+ write(e.dt[1])
+ ParsedXmlSnippetCdata("]]>")
+ end,
+ ["@dt@"] = function(e,handler)
+ ParsedXmlSnippetDoctype("<!DOCTYPE")
+ write(e.dt[1])
+ ParsedXmlSnippetDoctype(">")
+ end,
+ ["@tx@"] = function(s,handler)
+ write(s)
+ end,
+ }
+}
+
+local function parsedxml(root,pattern)
+ if root then
+ if pattern then
+ root = xml.filter(root,pattern)
+ end
+ if root then
+ context.startParsedXmlSnippet()
+ xml.serialize(root,parsedxmlhandler)
+ context.stopParsedXmlSnippet()
+ end
+ end
+end
+
+local function parser(str,settings)
+ parsedxml(xml.convert(str),settings and settings.pattern)
+end
+
+visualizers.parsedxml = parsedxml -- for use at the lua end (maybe namespace needed)
+
+visualizers.register("parsed-xml", { parser = parser } )
+
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-parsed-xml.mkiv b/Master/texmf-dist/tex/context/base/buff-imp-parsed-xml.mkiv
new file mode 100644
index 00000000000..1aa8fbc7411
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-parsed-xml.mkiv
@@ -0,0 +1,70 @@
+%D \module
+%D [ file=buff-imp-parsed-xml,
+%D version=2010.10.19,
+%D title=\CONTEXT\ Visualizer Macros,
+%D subtitle=Parsed \XML,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%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: color specific elements
+
+\registerctxluafile{buff-imp-parsed-xml.lua}{1.001}
+
+\unprotect
+
+\definestartstop
+ [ParsedXmlSnippet]
+ [%\c!before=\blank,
+ %\c!after=\blank,
+ \c!style=\tt]
+
+\definestartstop
+ [ParsedXmlSnippetDocType]
+ [\c!style=boldface,
+ \c!color=darkgreen]
+
+\definestartstop
+ [ParsedXmlSnippetElement]
+ [\c!style=boldface,
+ \c!color=darkblue]
+
+\definestartstop
+ [ParsedXmlSnippetInstruction]
+ [\c!style=boldface,
+ \c!color=darkgreen]
+
+\definestartstop
+ [ParsedXmlSnippetCdata]
+ [\c!style=boldface,
+ \c!color=darkgreen]
+
+\definestartstop
+ [ParsedXmlSnippetComment]
+ [\c!style=boldface,
+ \c!color=darkgreen]
+
+\definestartstop
+ [ParsedXmlSnippetKey]
+ [\c!style=boldface,
+ \c!color=darkred]
+
+% \definestartstop
+% [ParsedXmlSnippetQuote]
+% [\c!style=,
+% \c!color=]
+
+\definestartstop
+ [ParsedXmlSnippetValue]
+ [\c!style=,
+ \c!color=]
+
+\definetyping
+ [PARSEDXML]
+ [option=parsed-xml]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-tex.lua b/Master/texmf-dist/tex/context/base/buff-imp-tex.lua
new file mode 100644
index 00000000000..29fd8c0c5fe
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-tex.lua
@@ -0,0 +1,130 @@
+if not modules then modules = { } end modules ['buff-imp-tex'] = {
+ version = 1.001,
+ comment = "companion to v-tex.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local P, S, V, patterns = lpeg.P, lpeg.S, lpeg.V, lpeg.patterns
+
+local context = context
+local verbatim = context.verbatim
+local makepattern = visualizers.makepattern
+local makenested = visualizers.makenested
+local getvisualizer = visualizers.getvisualizer
+
+local TexSnippet = context.TexSnippet
+local startTexSnippet = context.startTexSnippet
+local stopTexSnippet = context.stopTexSnippet
+
+local TexSnippetName = verbatim.TexSnippetName
+local TexSnippetGroup = verbatim.TexSnippetGroup
+local TexSnippetBoundary = verbatim.TexSnippetBoundary
+local TexSnippetSpecial = verbatim.TexSnippetSpecial
+local TexSnippetComment = verbatim.TexSnippetComment
+
+local handler = visualizers.newhandler {
+ startinline = function() TexSnippet(false,"{") end,
+ stopinline = function() context("}") end,
+ startdisplay = function() startTexSnippet() end,
+ stopdisplay = function() stopTexSnippet() end ,
+ name = function(s) TexSnippetName(s) end,
+ group = function(s) TexSnippetGroup(s) end,
+ boundary = function(s) TexSnippetBoundary(s) end,
+ special = function(s) TexSnippetSpecial(s) end,
+ comment = function(s) TexSnippetComment(s) end,
+}
+
+-- todo: unicode letters in control sequences (slow as we need to test the nature)
+
+local comment = S("%")
+local name = P("\\") * (patterns.letter + S("@!?"))^1
+local escape = P("\\") * (patterns.anything - patterns.newline)^-1 -- else we get \n
+local group = S("${}")
+local boundary = S('[]()<>#="')
+local special = S("/^_-&+'`|")
+
+local p_comment = makepattern(handler,"comment",comment)
+ * (V("space") + V("content"))^0
+local p_name = makepattern(handler,"name",name)
+local p_escape = makepattern(handler,"name",escape)
+local p_group = makepattern(handler,"group",group)
+local p_boundary = makepattern(handler,"boundary",boundary)
+local p_special = makepattern(handler,"special",special)
+local p_somespace = V("newline") * V("emptyline")^0 * V("beginline")
+ + V("space")
+
+--~ local pattern = visualizers.pattern
+
+local grammar = visualizers.newgrammar("default", { "visualizer",
+
+ comment = p_comment,
+ name = p_name,
+ escape = p_escape,
+ group = p_group,
+ boundary = p_boundary,
+ special = p_special,
+ somespace = p_somespace,
+
+ pattern = V("comment")
+ + V("name") + V("escape") + V("group") + V("boundary") + V("special")
+ + V("newline") * V("emptyline")^0 * V("beginline")
+ + V("space")
+ + V("default"),
+
+ visualizer = V("pattern")^1
+
+} )
+
+local parser = P(grammar)
+
+visualizers.register("tex", { parser = parser, handler = handler, grammar = grammar } )
+
+local function makecommand(handler,how,start,left,right)
+ local c, l, r, f = P(start), P(left), P(right), how
+ local n = ( P { l * ((1 - (l + r)) + V(1))^0 * r } + P(1-r) )^0
+ if type(how) == "string" then
+ f = function(s) getvisualizer(how,"direct")(s) end
+ end
+ return makepattern(handler,"name",c)
+ * V("somespace")^0
+ * makepattern(handler,"group",l)
+ * (n/f)
+ * makepattern(handler,"group",r)
+end
+
+local grammar = visualizers.newgrammar("default", { "visualizer",
+
+ comment = p_comment,
+ name = p_name,
+ escape = p_escape,
+ group = p_group,
+ boundary = p_boundary,
+ special = p_special,
+ somespace = p_somespace,
+
+ mpcode = makenested(handler,"mp","\\startMPcode","\\stopMPcode")
+ + makenested(handler,"mp","\\startMPgraphic","\\stopMPgraphic")
+ + makenested(handler,"mp","\\startuseMPgraphic","\\stopuseMPgraphic")
+ + makenested(handler,"mp","\\startreusableMPgraphic","\\stopreusableMPgraphic")
+ + makenested(handler,"mp","\\startuniqueMPgraphic","\\stopuniqueMPgraphic")
+ + makenested(handler,"mp","\\startMPpage","\\stopMPpage"),
+
+ luacode = makenested (handler,"lua","\\startluacode","\\stopluacode")
+ + makecommand(handler,"lua","\\ctxlua","{","}"),
+
+ pattern = V("comment")
+ + V("mpcode") + V("luacode")
+ + V("name") + V("escape") + V("group") + V("boundary") + V("special")
+ + V("newline") * V("emptyline")^0 * V("beginline")
+ + V("space")
+ + V("default"),
+
+ visualizer = V("pattern")^1
+
+} )
+
+local parser = P(grammar)
+
+visualizers.register("context", { parser = parser, handler = handler, grammar = grammar } )
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-tex.mkiv b/Master/texmf-dist/tex/context/base/buff-imp-tex.mkiv
new file mode 100644
index 00000000000..3849757292b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-tex.mkiv
@@ -0,0 +1,51 @@
+%D \module
+%D [ file=buff-imp-tex,
+%D version=2010.10.19,
+%D title=\CONTEXT\ Visualizer Macros,
+%D subtitle=\TEX,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{buff-imp-tex.lua}{1.001}
+
+\unprotect
+
+\definestartstop
+ [TexSnippet]
+ [DefaultSnippet]
+
+\definestartstop
+ [TexSnippetName]
+ [\c!color=darkgreen,
+ \c!style=boldface]
+
+\definestartstop
+ [TexSnippetGroup]
+ [\c!color=darkred,
+ \c!style=boldface]
+
+\definestartstop
+ [TexSnippetBoundary]
+ [\c!color=darkblue,
+ \c!style=boldface]
+
+\definestartstop
+ [TexSnippetSpecial]
+ [\c!color=darkyellow,
+ \c!style=boldface]
+
+\definestartstop
+ [TexSnippetComment]
+ [\c!color=darkyellow,
+ \c!style=boldface]
+
+\definetyping
+ [TEX]
+ [\c!option=tex]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-xml.lua b/Master/texmf-dist/tex/context/base/buff-imp-xml.lua
new file mode 100644
index 00000000000..baf290d4ce7
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-xml.lua
@@ -0,0 +1,133 @@
+if not modules then modules = { } end modules ['buff-imp-xml'] = {
+ version = 1.001,
+ comment = "companion to v-xml.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local P, S, V, patterns = lpeg.P, lpeg.S, lpeg.V, lpeg.patterns
+
+local context = context
+local verbatim = context.verbatim
+local makepattern = visualizers.makepattern
+
+local XmlSnippet = context.XmlSnippet
+local startXmlSnippet = context.startXmlSnippet
+local stopXmlSnippet = context.stopXmlSnippet
+
+local XmlSnippetName = verbatim.XmlSnippetName
+local XmlSnippetKey = verbatim.XmlSnippetKey
+local XmlSnippetBoundary = verbatim.XmlSnippetBoundary
+local XmlSnippetString = verbatim.XmlSnippetString
+local XmlSnippetEqual = verbatim.XmlSnippetEqual
+local XmlSnippetEntity = verbatim.XmlSnippetEntity
+local XmlSnippetComment = verbatim.XmlSnippetComment
+local XmlSnippetCdata = verbatim.XmlSnippetCdata
+
+local handler = visualizers.newhandler {
+ startinline = function() XmlSnippet(false,"{") end,
+ stopinline = function() context("}") end,
+ startdisplay = function() startXmlSnippet() end,
+ stopdisplay = function() stopXmlSnippet () end,
+ name = function(s) XmlSnippetName(s) end,
+ key = function(s) XmlSnippetKey(s) end,
+ boundary = function(s) XmlSnippetBoundary(s) end,
+ string = function(s) XmlSnippetString(s) end,
+ equal = function(s) XmlSnippetEqual(s) end,
+ entity = function(s) XmlSnippetEntity(s) end,
+ comment = function(s) XmlSnippetComment(s) end,
+ cdata = function(s) XmlSnippetCdata(s) end,
+}
+
+local comment = P("--")
+local name = (patterns.letter + patterns.digit + S('_-.'))^1
+local entity = P("&") * (1-P(";"))^1 * P(";")
+local openbegin = P("<")
+local openend = P("</")
+local closebegin = P("/>") + P(">")
+local closeend = P(">")
+local opencomment = P("<!--")
+local closecomment = P("-->")
+local openinstruction = P("<?")
+local closeinstruction = P("?>")
+local opencdata = P("<![CDATA[")
+local closecdata = P("]]>")
+
+local grammar = visualizers.newgrammar("default", { "visualizer",
+ sstring =
+ makepattern(handler,"string",patterns.dquote)
+ * (V("whitespace") + makepattern(handler,"default",1-patterns.dquote))^0
+ * makepattern(handler,"string",patterns.dquote),
+ dstring =
+ makepattern(handler,"string",patterns.squote)
+ * (V("whitespace") + makepattern(handler,"default",1-patterns.squote))^0
+ * makepattern(handler,"string",patterns.squote),
+ entity =
+ makepattern(handler,"entity",entity),
+ name =
+ makepattern(handler,"name",name)
+ * (
+ makepattern(handler,"default",patterns.colon)
+ * makepattern(handler,"name",name)
+ )^0,
+ key =
+ makepattern(handler,"key",name)
+ * (
+ makepattern(handler,"default",patterns.colon)
+ * makepattern(handler,"key",name)
+ )^0,
+ attributes = (
+ V("optionalwhitespace")
+ * V("key")
+ * V("optionalwhitespace")
+ * makepattern(handler,"equal",patterns.equal)
+ * V("optionalwhitespace")
+ * (V("dstring") + V("sstring"))
+ * V("optionalwhitespace")
+ )^0,
+ open =
+ makepattern(handler,"boundary",openbegin)
+ * V("name")
+ * V("optionalwhitespace")
+ * V("attributes")
+ * makepattern(handler,"boundary",closebegin),
+ close =
+ makepattern(handler,"boundary",openend)
+ * V("name")
+ * V("optionalwhitespace")
+ * makepattern(handler,"boundary",closeend),
+ comment =
+ makepattern(handler,"boundary",opencomment)
+ * (V("whitespace") + makepattern(handler,"comment",(1-closecomment)))^0 -- slow
+ * makepattern(handler,"boundary",closecomment),
+ cdata =
+ makepattern(handler,"boundary",opencdata)
+ * (V("whitespace") + makepattern(handler,"comment",(1-closecdata)))^0 -- slow
+ * makepattern(handler,"boundary",closecdata),
+ instruction =
+ makepattern(handler,"boundary",openinstruction)
+ * V("name")
+ * V("optionalwhitespace")
+ * V("attributes")
+ * V("optionalwhitespace")
+ * makepattern(handler,"boundary",closeinstruction),
+
+ pattern =
+ V("comment")
+ + V("instruction")
+ + V("cdata")
+ + V("close")
+ + V("open")
+ + V("entity")
+ + V("space")
+ + V("line")
+ + V("default"),
+
+ visualizer =
+ V("pattern")^1
+} )
+
+local parser = P(grammar)
+
+visualizers.register("xml", { parser = parser, handler = handler, grammar = grammar } )
diff --git a/Master/texmf-dist/tex/context/base/buff-imp-xml.mkiv b/Master/texmf-dist/tex/context/base/buff-imp-xml.mkiv
new file mode 100644
index 00000000000..68dc9ed1394
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-imp-xml.mkiv
@@ -0,0 +1,71 @@
+%D \module
+%D [ file=buff-imp-xml,
+%D version=2010.10.19,
+%D title=\CONTEXT\ Visualizer Macros,
+%D subtitle=\XML,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{buff-imp-xml.lua}{1.001}
+
+\unprotect
+
+\definestartstop
+ [XmlSnippet]
+ [DefaultSnippet]
+
+\definestartstop
+ [XmlSnippetName]
+ [\c!color=darkblue,
+ \c!style=boldface]
+
+\definestartstop
+ [XmlSnippetKey]
+ [\c!color=darkgreen,
+ \c!style=boldface]
+
+\definestartstop
+ [XmlSnippetBoundary]
+ [\c!color=darkblue,
+ \c!style=boldface]
+
+\definestartstop
+ [XmlSnippetEntity]
+ [\c!color=darkred,
+ \c!style=boldface]
+
+\definestartstop
+ [XmlSnippetString]
+ [\c!color=darkblue,
+ \c!style=boldface]
+
+\definestartstop
+ [XmlSnippetEqual]
+ [\c!color=darkblue,
+ \c!style=boldface]
+
+\definestartstop
+ [XmlSnippetComment]
+ [\c!color=darkyellow,
+ \c!style=boldface]
+
+\definestartstop
+ [XmlSnippetCdata]
+ [\c!color=darkyellow,
+ \c!style=boldface]
+
+\definestartstop
+ [XmlSnippetInstruction]
+ [\c!color=darkyellow,
+ \c!style=boldface]
+
+\definetyping
+ [XML]
+ [\c!option=xml]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/buff-ini.lua b/Master/texmf-dist/tex/context/base/buff-ini.lua
index 6b1af8f96f3..70328f0f198 100644
--- a/Master/texmf-dist/tex/context/base/buff-ini.lua
+++ b/Master/texmf-dist/tex/context/base/buff-ini.lua
@@ -1,266 +1,137 @@
if not modules then modules = { } end modules ['buff-ini'] = {
version = 1.001,
- comment = "companion to core-buf.mkiv",
+ comment = "companion to buff-ini.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
--- ctx lua reference model / hooks and such
--- to be optimized
-
--- redefine buffers.get
-
-buffers = { }
-buffers.data = { }
-buffers.hooks = { }
-buffers.flags = { }
-buffers.commands = { }
-buffers.visualizers = { }
-
--- if needed we can make 'm local
-
local trace_run = false trackers.register("buffers.run", function(v) trace_run = v end)
local trace_visualize = false trackers.register("buffers.visualize", function(v) trace_visualize = v end)
-local utf = unicode.utf8
+local report_buffers = logs.reporter("buffers","usage")
-local concat, texsprint, texprint, texwrite = table.concat, tex.sprint, tex.print, tex.write
-local utfbyte, utffind, utfgsub = utf.byte, utf.find, utf.gsub
+local concat = table.concat
local type, next = type, next
-local huge = math.huge
-local byte, sub, find, char, gsub, rep, lower, format, gmatch, match = string.byte, string.sub, string.find, string.char, string.gsub, string.rep, string.lower, string.format, string.gmatch, string.match
-local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
-local ctxcatcodes = tex.ctxcatcodes
+local sub, format, count, splitlines = string.sub, string.format, string.count, string.splitlines
+
local variables = interfaces.variables
-local lpegmatch = lpeg.match
+local settings_to_array = utilities.parsers.settings_to_array
+local texprint, ctxcatcodes = tex.print, tex.ctxcatcodes
+
+buffers = { }
-local data, flags, hooks, visualizers = buffers.data, buffers.flags, buffers.hooks, buffers.visualizers
+local buffers = buffers
+local context = context
-visualizers.defaultname = variables.typing
+local data = { }
function buffers.raw(name)
- return data[name] or { }
+ return data[name] or ""
end
-function buffers.erase(name)
+local function erase(name)
data[name] = nil
end
-function buffers.set(name, str)
- data[name] = { str } -- CHECK THIS
+local function assign(name,str)
+ data[name] = str
end
-function buffers.append(name, str)
+local function append(name,str)
data[name] = (data[name] or "") .. str
end
+local function exists(name)
+ return data[name] ~= nil
+end
-buffers.flags.store_as_table = true
-
--- to be sorted out: crlf + \ ; slow now
+local function getcontent(name) -- == raw
+ return data[name] or ""
+end
-local n = 0
+local function getlines(name)
+ local d = name and data[name]
+ return d and splitlines(d)
+end
-function buffers.grab(name,begintag,endtag,bufferdata)
- local dn = data[name] or ""
- if dn == "" then
- buffers.level = 0
+local function collectcontent(names,separator) -- no print
+ if type(names) == "string" then
+ names = settings_to_array(names)
end
- buffers.level = buffers.level + bufferdata:count("\\"..begintag) - bufferdata:count("\\"..endtag)
- local more = buffers.level > 0
- if more then
- dn = dn .. bufferdata .. endtag
- buffers.level = buffers.level - 1
+ if #names == 1 then
+ return getcontent(names[1])
else
- if dn == "" then
- dn = sub(bufferdata,1,#bufferdata-1)
- else
- dn = dn .. "\n" .. sub(bufferdata,1,#bufferdata-1)
- end
- dn = gsub(dn,"[\010\013]$","")
- if flags.store_as_table then
- dn = dn:splitlines()
+ local t, n = { }, 0
+ for i=1,#names do
+ local c = getcontent(names[i])
+ if c ~= "" then
+ n = n + 1
+ t[n] = c
+ end
end
+ return concat(t,separator or "\n") -- was \r
end
- data[name] = dn
- cs.testcase(more)
end
-function buffers.exists(name)
- return data[name] ~= nil
-end
+buffers.erase = erase
+buffers.assign = assign
+buffers.append = append
+buffers.exists = exists
+buffers.getcontent = getcontent
+buffers.getlines = getlines
+buffers.collectcontent = collectcontent
-function buffers.doifelsebuffer(name)
- cs.testcase(data[name] ~= nil)
-end
+-- the context interface
-flags.optimize_verbatim = true
-flags.count_empty_lines = false
-
-local no_break_command = "\\doverbatimnobreak"
-local do_break_command = "\\doverbatimgoodbreak"
-local begin_of_line_command = "\\doverbatimbeginofline"
-local end_of_line_command = "\\doverbatimendofline"
-local empty_line_command = "\\doverbatimemptyline"
-
-local begin_of_display_command = "\\doverbatimbeginofdisplay"
-local end_of_display_command = "\\doverbatimendofdisplay"
-local begin_of_inline_command = "\\doverbatimbeginofinline"
-local end_of_inline_command = "\\doverbatimendofinline"
-
-function buffers.verbatimbreak(n,m)
- if flags.optimize_verbatim then
- if n == 2 or n == m then
- texsprint(no_break_command)
- elseif n > 1 then
- texsprint(do_break_command)
- end
- end
-end
+commands.erasebuffer = erase
+commands.assignbuffer = assign
-function buffers.strip(lines,first,last)
- local first, last = first or 1, last or #lines
- for i=first,last do
- local li = lines[i]
- if #li == 0 or find(li,"^%s*$") then
- first = first + 1
- else
- break
- end
- end
- for i=last,first,-1 do
- local li = lines[i]
- if #li == 0 or find(li,"^%s*$") then
- last = last - 1
- else
- break
- end
- end
- return first, last, last - first + 1
-end
+local P, patterns, lpegmatch = lpeg.P, lpeg.patterns, lpeg.match
-function buffers.range(lines,first,last,range) -- 1,3 1,+3 fromhere,tothere
- local first, last = first or 1, last or #lines
- local what = aux.settings_to_array(range)
- local r_first, r_last = what[1], what[2]
- local f, l = tonumber(r_first), tonumber(r_last)
- if r_first then
- if f then
- if f > first then
- first = f
- end
- else
- for i=first,last do
- if find(lines[i],r_first) then
- first, strip = i + 1
- break
- end
- end
- end
- end
- if r_last then
- if l then
- if find(r_last,"^[%+]") then -- 1,+3
- l = first + l
- end
- if l < last then
- last = l
- end
- else
- for i=first,last do
- if find(lines[i],r_last) then
- last = i - 1
- break
- end
- end
- end
- end
- return first, last
+local function countnesting(b,e)
+ local n
+ local g = P(b) / function() n = n + 1 end
+ + P(e) / function() n = n - 1 end
+ + patterns.anything
+ local p = patterns.alwaysmatched / function() n = 0 end
+ * g^0
+ * patterns.alwaysmatched / function() return n end
+ return p
end
-function buffers.type(name,realign,range)
- local lines = data[name]
- local action = buffers.typeline
- if lines then
- if type(lines) == "string" then
- lines = lines:splitlines()
- data[name] = lines
- end
- if realign then
- lines = buffers.realign(lines,realign)
- end
- local line, n = 0, 0
- local first, last, m = buffers.strip(lines)
- if range then
- first, last = buffers.range(lines,first,last,range)
- first, last = buffers.strip(lines,first,last)
- end
- hooks.begin_of_display()
- for i=first,last do
- n, line = action(lines[i], n, m, line)
- end
- hooks.end_of_display()
- end
-end
+local counters = { }
+local nesting = 0
-function buffers.loaddata(filename) -- this one might go away
- -- this will be cleaned up when we have split supp-fil completely
- -- instead of half-half
- local ok, str, n = resolvers.loaders.tex(filename)
- if not str then
- ok, str, n = resolvers.loaders.tex(file.addsuffix(filename,'tex'))
+function commands.grabbuffer(name,begintag,endtag,bufferdata) -- maybe move \\ to call
+ local dn = getcontent(name)
+ if dn == "" then
+ nesting = 0
end
-end
-
-function buffers.loaddata(filename) -- this one might go away
- local foundname = resolvers.findtexfile(filename) or ""
- if foundname == "" then
- foundname = resolvers.findtexfile(file.addsuffix(filename,'tex')) or ""
+ -- nesting = nesting + count(bufferdata,"\\"..begintag) - count(bufferdata,"\\"..endtag)
+ local counter = counters[begintag]
+ if not counter then
+ counter = countnesting(begintag,endtag)
+ counters[begintag] = counter
end
- if foundname == "" then
- return ""
+ nesting = nesting + lpegmatch(counter,bufferdata)
+ local more = nesting > 0
+ if more then
+ dn = dn .. bufferdata .. endtag
+ nesting = nesting - 1
else
- return resolvers.loadtexfile(foundname)
- end
-end
-
-function buffers.typefile(name,realign,range) -- still somewhat messy, since name can be be suffixless
- local str = buffers.loaddata(name)
- if str and str~= "" then
- local lines = str:splitlines()
- if realign then
- lines = buffers.realign(lines,realign)
- end
- local line, n, action = 0, 0, buffers.typeline
- local first, last, m = buffers.strip(lines)
- hooks.begin_of_display()
- if range then
- first, last = buffers.range(lines,first,last,range)
- first, last = buffers.strip(lines,first,last)
+ if dn == "" then
+ dn = sub(bufferdata,1,-2)
+ else
+ dn = dn .. "\n" .. sub(bufferdata,1,-2) -- no \r, \n is more generic
end
- for i=first,last do
- n, line = action(lines[i], n, m, line)
+ 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
- hooks.end_of_display()
end
-end
-
-function buffers.typeline(str,n,m,line)
- n = n + 1
- buffers.verbatimbreak(n,m)
- if find(str,"%S") then
- line = line + 1
- hooks.begin_of_line(line)
- hooks.flush_line(hooks.line(str))
- hooks.end_of_line()
- else
- if flags.count_empty_lines then
- line = line + 1
- end
- hooks.empty_line(line)
- end
- return n, line
+ assign(name,dn)
+ commands.testcase(more)
end
-- The optional prefix hack is there for the typesetbuffer feature and
@@ -273,7 +144,7 @@ local function prepared(name,list) -- list is optional
if not name or name == "" then
name = tex.jobname .. "-" .. list .. ".tmp"
end
- local content = buffers.collect(list,nil) or ""
+ local content = collectcontent(list,nil) or ""
if content == "" then
content = "empty buffer"
end
@@ -283,556 +154,56 @@ end
local capsule = "\\starttext\n%s\n\\stoptext\n"
local command = "context %s"
-function buffers.save(name,list,encapsulate) -- list is optional
- local name, content = prepared(name,list)
- io.savedata(name, (encapsulate and format(capsule,content)) or content)
-end
-
-function commands.savebuffer(list,name) -- name is optional
- buffers.save(name,list)
-end
-
-function buffers.run(name,list,encapsulate)
+function commands.runbuffer(name,list,encapsulate)
local name, content = prepared(name,list)
+ if encapsulate then
+ content = format(capsule,content)
+ end
local data = io.loaddata(name)
- content = (encapsulate and format(capsule,content)) or content
if data ~= content then
if trace_run then
- commands.writestatus("buffers","changes in '%s', processing forced",name)
+ report_buffers("changes in '%s', processing forced",name)
end
io.savedata(name,content)
os.execute(format(command,name))
elseif trace_run then
- commands.writestatus("buffers","no changes in '%s', not processed",name)
+ report_buffers("no changes in '%s', not processed",name)
end
end
-local printer = (lpeg.patterns.textline/texprint)^0
-
-function buffers.get(name)
- local b = buffers.data[name]
- if b then
- if type(b) == "table" then
- for i=1,#b do
- texprint(b[i])
- end
- else
- lpegmatch(printer,b)
- end
- end
-end
-
-local function content(name,separator) -- no print
- local b = data[name]
- if b then
- if type(b) == "table" then
- return concat(b,separator or "\n")
- else
- return b
- end
- else
- return ""
- end
-end
-
-buffers.content = content
-
-function buffers.collect(names,separator) -- no print
- -- maybe we should always store a buffer as table so
- -- that we can pass it directly
- if type(names) == "string" then
- names = aux.settings_to_array(names)
- end
- local t = { }
- for i=1,#names do
- local c = content(names[i],separator)
- if c ~= "" then
- t[#t+1] = c
- end
- end
- return concat(t,separator or "\r") -- "\n" is safer due to comments and such
-end
-
-function buffers.feedback(names,separator)
- -- don't change the texprint into texsprint as it fails on mp buffers
- -- because (p<nl>enddef) becomes penddef then
- texprint(ctxcatcodes,string.splitlines(buffers.collect(names,separator)))
-end
-
-local function tobyte(c)
- return " [" .. utfbyte(c) .. "] "
-end
-
-function buffers.inspect(name)
- local b = data[name]
- if b then
- if type(b) == "table" then
- for k=1,#b do
- local v = b[k]
- if v == "" then
- texsprint(ctxcatcodes,"[crlf]\\par ") -- space ?
- else
- texsprint(ctxcatcodes,(gsub(v,"(.)",tobyte)),"\\par")
- end
- end
- else
- texsprint(ctxcatcodes,(gsub(b,"(.)",tobyte)))
- end
- end
-end
-
--- maybe just line(n,str) empty(n,str)
-
-visualizers.tablength = 7
-visualizers.enabletab = true -- false
-visualizers.obeyspace = true
-
-function buffers.settablength(tablength)
- visualizers.tablength = tablength and tonumber(tablength) or 7
-end
-
-visualizers.handlers = visualizers.handlers or { }
-
-local handlers = visualizers.handlers
-
-function buffers.newvisualizer(name)
- name = lower(name)
- local handler = { }
- handlers[name] = handler
- return handler
-end
-
-function buffers.getvisualizer(name)
- name = lower(name)
- return handlers[name] or buffers.loadvisualizer(name)
-end
-
-function buffers.loadvisualizer(name)
- name = lower(name)
- local hn = handlers[name]
- if hn then
- return hn
- else
- environment.loadluafile("pret-" .. name)
- local hn = handlers[name]
- if not hn then
- -- hn = buffers.newvisualizer(name)
- hn = handlers[visualizers.defaultname]
- handlers[name] = hn
- if trace_visualize then
- logs.report("buffers","mapping '%s' visualizer onto '%s'",name,visualizers.defaultname)
- end
- elseif trace_visualize then
- logs.report("buffers","loading '%s' visualizer",name)
- end
- return hn
- end
-end
-
--- was "default", should be set at tex end (todo)
-
-local default = buffers.newvisualizer(visualizers.defaultname)
-
---~ print(variables.typing) os.exit()
-
--- will become cleaner
-
-local currentvisualizer, currenthandler
-
-function buffers.setvisualizer(str)
- currentvisualizer = lower(str)
- currenthandler = handlers[currentvisualizer]
- if currenthandler then
- -- if trace_visualize then
- -- logs.report("buffers","enabling specific '%s' visualizer",currentvisualizer)
- -- end
- else
- currentvisualizer = visualizers.defaultname
- currenthandler = handlers.default
- -- if trace_visualize then
- -- logs.report("buffers","enabling default visualizer '%s'",currentvisualizer)
- -- end
- end
- if currenthandler.reset then
- currenthandler.reset()
- end
-end
-
-function buffers.resetvisualizer()
- currentvisualizer = visualizers.defaultname
- currenthandler = handlers.default
- if currenthandler.reset then
- currenthandler.reset()
- end
-end
-
-buffers.setvisualizer(visualizers.defaultname)
-
-function visualizers.reset()
-end
-
-function buffers.doifelsevisualizer(str)
- cs.testcase((str ~= "") and (handlers[lower(str)] ~= nil))
-end
-
--- calling routines, don't change
-
-function hooks.begin_of_display()
- (currenthandler.begin_of_display or default.begin_of_display)(currentvisualizer)
-end
-
-function hooks.end_of_display()
- (currenthandler.end_of_display or default.end_of_display)()
-end
-
-function hooks.begin_of_inline()
- (currenthandler.begin_of_inline or default.begin_of_inline)(currentvisualizer)
-end
-
-function hooks.end_of_inline()
- (currenthandler.end_of_inline or default.end_of_inline)()
-end
-
-function hooks.flush_line(str,nesting)
- local fl = currenthandler.flush_line
- if fl then
- str = gsub(str," *[\n\r]+ *"," ") ; -- semi colon needed
- fl(str,nesting)
- else
- -- gsub done later
- default.flush_line(str,nesting)
- end
-end
-
-function hooks.flush_inline(str,nesting)
- hooks.begin_of_inline()
- hooks.flush_line(str,nesting)
- hooks.end_of_inline()
-end
-
-function hooks.begin_of_line(n)
- (currenthandler.begin_of_line or default.begin_of_line)(n)
-end
-
-function hooks.end_of_line()
- (currenthandler.end_of_line or default.end_of_line)()
-end
-
-function hooks.empty_line()
- (currenthandler.empty_line or default.empty_line)()
-end
-
-function hooks.line(str)
- if visualizers.enabletab then
- str = string.tabtospace(str,visualizers.tablength)
- else
- str = gsub(str,"\t"," ")
- end
- return (currenthandler.line or default.line)(str)
-end
-
--- defaults
-
-function default.begin_of_display(currentvisualizer)
- texsprint(ctxcatcodes,begin_of_display_command,"{",currentvisualizer,"}")
-end
-
-function default.end_of_display()
- texsprint(ctxcatcodes,end_of_display_command)
-end
-
-function default.begin_of_inline(currentvisualizer)
- texsprint(ctxcatcodes,begin_of_inline_command,"{",currentvisualizer,"}")
-end
-
-function default.end_of_inline()
- texsprint(ctxcatcodes,end_of_inline_command)
-end
-
-function default.begin_of_line(n)
- texsprint(ctxcatcodes, begin_of_line_command,"{",n,"}")
-end
-
-function default.end_of_line()
- texsprint(ctxcatcodes,end_of_line_command)
-end
-
-function default.empty_line()
- texsprint(ctxcatcodes,empty_line_command)
-end
-
-function default.line(str)
- return str
-end
-
-function default.flush_line(str)
- str = gsub(str," *[\n\r]+ *"," ")
- if visualizers.obeyspace then
- for c in utfcharacters(str) do
- if c == " " then
- texsprint(ctxcatcodes,"\\obs")
- else
- texwrite(c)
- end
- end
- else
- texwrite(str)
- end
-end
-
--- not needed any more
-
-local function escaped_token(c)
- if utffind(c,"^(%a%d)$") then
- return c
- elseif c == " " then
- return "\\obs "
- else
- return "\\char" .. utfbyte(c) .. " "
- end
-end
-
-buffers.escaped_token = escaped_token
-
-function buffers.escaped(str)
- -- use the utfcharacters loop
- return (utfgsub(str,"(.)", escaped_token))
+function commands.savebuffer(list,name) -- name is optional
+ local name, content = prepared(name,list)
+ io.savedata(name,content)
end
--- special one
-
-buffers.commands.nested = "\\switchslantedtype "
-
--- todo : utf + faster, direct print and such. no \\char, vrb catcodes, see end
-
-function visualizers.flush_nested(str, enable) -- no utf, kind of obsolete mess
- str = gsub(str," *[\n\r]+ *"," ")
- local result, c, nested, i = "", "", 0, 1
- local commands = buffers.commands -- otherwise wrong commands
- while i < #str do -- slow
- c = sub(str,i,i+1)
- if c == "<<" then
- nested = nested + 1
- if enable then
- result = result .. "{" .. commands.nested
- else
- result = result .. "{"
- end
- i = i + 2
- elseif c == ">>" then
- if nested > 0 then
- nested = nested - 1
- result = result .. "}"
- end
- i = i + 2
- else
- c = sub(str,i,i)
- if c == " " then
- result = result .. "\\obs "
- elseif find(c,"%a") then
- result = result .. c
- else
- result = result .. "\\char" .. byte(c) .. " "
- end
- i = i + 1
- end
+function commands.getbuffer(name)
+ local str = data[name]
+ if str and str ~= "" then
+ context.viafile(str)
end
- result = result .. "\\char" .. byte(sub(str,i,i)) .. " " .. rep("}",nested)
- texsprint(ctxcatcodes,result)
end
--- handy helpers
---
--- \sop[color] switch_of_pretty
--- \bop[color] begin_of_pretty
--- \eop end_of_pretty
--- \obs obeyedspace
--- \char <n> special characters
-
-buffers.currentcolors = { }
-
-function buffers.change_state(n, state)
- if n then
- if state ~= n then
- if state > 0 then
- texsprint(ctxcatcodes,"\\sop[",buffers.currentcolors[n],"]")
- else
- texsprint(ctxcatcodes,"\\bop[",buffers.currentcolors[n],"]")
- end
- return n
- end
- elseif state > 0 then
- texsprint(ctxcatcodes,"\\eop")
- return 0
- end
- return state
+function commands.getbuffermkvi(name)
+ context.viafile(resolvers.macros.preprocessed(getcontent(name)))
end
-function buffers.finish_state(state)
- if state > 0 then
- texsprint(ctxcatcodes,"\\eop")
- return 0
+function commands.getbufferctxlua(name)
+ local ok = loadstring(getcontent(name))
+ if ok then
+ ok()
else
- return state
+ report_buffers("invalid lua code in buffer '%s'",name)
end
end
-buffers.open_nested = rep("\\char"..byte('<').." ",2)
-buffers.close_nested = rep("\\char"..byte('>').." ",2)
-
-function buffers.replace_nested(result)
- result = gsub(result,buffers.open_nested, "{")
- result = gsub(result,buffers.close_nested,"}")
- return result
-end
-
-function buffers.flush_result(result,nested)
- if nested then
- texsprint(ctxcatcodes,buffers.replace_nested(concat(result,"")))
- else
- texsprint(ctxcatcodes,concat(result,""))
- end
+function commands.doifelsebuffer(name)
+ commands.testcase(exists(name))
end
--- new
+-- This only used for mp buffers and is a kludge. Don't
+-- change the texprint into texsprint as it fails because
+-- "p<nl>enddef" becomes "penddef" then.
-function buffers.realign(name,forced_n) -- no, auto, <number>
- local n, d
- if type(name) == "string" then
- d = data[name]
- if type(d) == "string" then
- d = d:splitlines()
- end
- else
- d = name -- already a buffer
- end
- forced_n = (forced_n == variables.auto and huge) or tonumber(forced_n)
- if forced_n then
- for i=1, #d do
- local spaces = find(d[i],"%S")
- if not spaces then
- -- empty line
- elseif not n then
- n = spaces
- elseif spaces == 0 then
- n = 0
- break
- elseif n > spaces then
- n = spaces
- end
- end
- if n > 0 then
- if n > forced_n then
- n = forced_n
- end
- for i=1,#d do
- d[i] = sub(d[i],n)
- end
- end
- end
- return d
-end
-
--- escapes: buffers.set_escape("tex","/BTEX","/ETEX")
-
-local function flush_escaped_line(str,pattern,flushline)
- while true do
- local a, b, c = match(str,pattern)
- if a and a ~= "" then
- flushline(a)
- end
- if b and b ~= "" then
- texsprint(ctxcatcodes,"{",b,"}")
- end
- if c then
- if c == "" then
- break
- else
- str = c
- end
- else
- flushline(str)
- break
- end
- end
-end
-
-function buffers.set_escape(name,pair)
- if pair and pair ~= "" then
- local visualizer = buffers.getvisualizer(name)
- visualizer.normal_flush_line = visualizer.normal_flush_line or visualizer.flush_line
- if pair == variables.no then
- visualizer.flush_line = visualizer.normal_flush_line or visualizer.flush_line
- if trace_visualize then
- logs.report("buffers","resetting escape range for visualizer '%s'",name)
- end
- else
- local start, stop
- if pair == variables.yes then
- start, stop = "/BTEX", "/ETEX"
- else
- pair = string.split(pair,",")
- start, stop = string.esc(pair[1] or ""), string.esc(pair[2] or "")
- end
- if start ~= "" then
- local pattern
- if stop == "" then
- pattern = "^(.-)" .. start .. "(.*)(.*)$"
- else
- pattern = "^(.-)" .. start .. "(.-)" .. stop .. "(.*)$"
- end
- function visualizer.flush_line(str)
- flush_escaped_line(str,pattern,visualizer.normal_flush_line)
- end
- if trace_visualize then
- logs.report("buffers","setting escape range for visualizer '%s' to %s -> %s",name,start,stop)
- end
- elseif trace_visualize then
- logs.report("buffers","problematic escape specification '%s' for visualizer '%s'",pair,name)
- end
- end
- end
+function commands.feedback(names)
+ texprint(ctxcatcodes,splitlines(collectcontent(names)))
end
-
--- THIS WILL BECOME A FRAMEWORK: the problem with prety printing is that
--- we deal with snippets and therefore we need tolerant parsing
-
---~ local type = type
-
---~ visualizers = visualizers or { }
-
---~ local function fallback(s) return s end
-
---~ function visualizers.visualize(visualizer,kind,pattern)
---~ if type(visualizer) == "table" and type(kind) == "string" then
---~ kind = visualizer[kind] or visualizer.default or fallback
---~ else
---~ kind = fallback
---~ end
---~ return (lpeg.C(pattern))/kind
---~ end
-
---~ local flusher = texio.write
---~ local format = string.format
-
---~ local visualizer = {
---~ word = function(s) return flusher(format("\\bold{%s}",s)) end,
---~ number = function(s) return flusher(format("\\slanted{%s}",s)) end,
---~ default = function(s) return flusher(s) end,
---~ }
-
---~ local word = lpeg.R("AZ","az")^1
---~ local number = lpeg.R("09")^1
---~ local any = lpeg.P(1)
-
---~ local pattern = lpeg.P { "start",
---~ start = (
---~ visualizers.visualize(visualizer,"word",word) +
---~ visualizers.visualize(visualizer,"number",number) +
---~ visualizers.visualize(visualizer,"default",any)
---~ )^1
---~ }
-
---~ str = [[test 123 test $oeps$]]
-
---~ lpegmatch(pattern,str)
diff --git a/Master/texmf-dist/tex/context/base/buff-ini.mkiv b/Master/texmf-dist/tex/context/base/buff-ini.mkiv
index 86b0fa3c530..7bd382fe2e9 100644
--- a/Master/texmf-dist/tex/context/base/buff-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/buff-ini.mkiv
@@ -1,6 +1,6 @@
%D \module
-%D [ file=buff-ini, % was core-buf, % blocks are moved to core-blk
-%D version=2000.01.05,
+%D [ file=buff-ini,
+%D version=2011.11.22, % previous big effort 2000.01.05,
%D title=\CONTEXT\ Buffer Macros,
%D subtitle=Buffers,
%D author=Hans Hagen,
@@ -15,72 +15,32 @@
\registerctxluafile{buff-ini}{1.001}
-% todo:
-%
-% \startluacode
-% local locations = { }
-% function document.set_number(name)
-% locations[name] = {
-% line = status.linenumber,
-% file = status.filename
-% }
-% end
-% function document.add_number(name)
-% local b, l = buffers.raw(name), locations[name]
-% if b and l then
-% for i=1,#b do
-% b[i] = string.gsub(b[i],"# line: <number>","# line: " .. l.line + 2)
-% end
-% end
-% end
-% \stopluacode
-%
-% \starttext
-%
-% \ctxlua{document.set_number("oeps")}
-% \startbuffer[oeps]
-% # line: <number>
-%
-% test
-% test
-% \stopbuffer
-% \ctxlua{document.add_number("oeps")}
-%
-% \typebuffer[oeps]
-%
-% \stoptext
-
-\ifdefined\doinitializeverbatim \else% temp hack
- \def\doinitializeverbatim{\tttf}
-\fi
-
\unprotect
-\chardef\buffernestmode\plusone % 0: not nested, 1: startbuffer nested, 2: all buffers nested
+% number is messy and not needed as we store the number anyway
+% we can get rid of \c!number
-\newif\ifsegmentatebuffer
-\newif\ifemptybufferline
+\newcount\nofdefinedbuffers
-\def\currentbuffer{\jobname}
+\let\currentbuffer\empty
-\def\setcurrentbuffer#1%
- {\doifelsenothing{#1}{\edef\currentbuffer{\jobname}}{\edef\currentbuffer{#1}}}
+\def\doifelsebuffer#1%
+ {\ctxcommand{doifelsebuffer("#1")}}
\def\resetbuffer
{\dosingleempty\doresetbuffer}
\def\doresetbuffer[#1]%
- {\begingroup
- \setcurrentbuffer{#1}%
- \ctxlua{buffers.erase("\currentbuffer")}%
- \endgroup}
+ {\ctxcommand{erasebuffer("#1")}}
-\def\dostartbuffer
+\unexpanded\def\dostartdefinedbuffer
{\bgroup
- \obeylines % nodig, anders gaat 't fout als direct \starttable (bv)
+ \obeylines
\doquadrupleempty\dodostartbuffer}
-\def\dodostartbuffer[#1][#2][#3][#4]% upward compatible
+\let\dostartbuffer\dostartdefinedbuffer % used in some modules
+
+\def\dodostartbuffer[#1][#2][#3][#4]% [category] [name] [start] [stop]
{\iffourthargument
\def\next{\dododostartbuffer{#1}{#2}{#3}{#4}}%
\else
@@ -88,63 +48,43 @@
\fi
\next}
-\def\dododostartbuffer#1#2#3#4%
- {%\showmessage\m!systems{15}{#2}%
- \doifelsevalue{\??bu#1\c!paragraph}\v!yes
- {\segmentatebuffertrue} % todo in mkiv
- {\doifnumberelse{\getvalue{\??bu#1\c!paragraph}}\segmentatebuffertrue\segmentatebufferfalse}%
- \doifvalue{\??bu#1\c!local}\v!yes
- {\chardef\buffernestmode\plustwo}% permit nesting
- \setcurrentbuffer{#2}%
- \doifelsenothing{#4}
- {\normalexpanded{\noexpand\setbuffercapsules{\e!start\v!buffer}{\e!stop\v!buffer}}%
- \letvalue\bufferstop\relax}
- %{\@EA\setbuffercapsules\@EA{\csname#3\@EA\endcsname\@EA}\@EA{\csname#4\endcsname}}% if we strip later
- {\setbuffercapsules{#3}{#4}}%
- \normalexpanded{\noexpand\dodowithbuffer
- {\currentbuffer}
- {\bufferstart}
- {\bufferstop}
- {\donothing}
- {\egroup
- \noexpand\getvalue{\bufferstop}}}}
-
-\letvalue{\e!start\v!buffer}\dostartbuffer
-
-\let\endbuffer\undefined % to please the dep parser
+\def\dododostartbuffer#1#2#3#4% \donothing needed !
+ {\normalexpanded{\dodowithbuffer{#2}{#3}{#4}{\donothing}{\egroup\noexpand\getvalue{#4}}}}
+
+\setvalue{\e!start\v!buffer}%
+ {\bgroup
+ \obeylines
+ \dosingleempty\redostartbuffer}
+
+\def\redostartbuffer[#1]%
+ {\dododostartbuffer{}{#1}{\e!start\v!buffer}{\e!stop\v!buffer}}
\def\dowithbuffer#1#2#3% name, startsequence, stopsequence, before, after
- {\setbuffercapsules{#2}{#3}%
- \normalexpanded{\noexpand\dodowithbuffer{#1}{\bufferstart}{\bufferstop}}}
+ {\normalexpanded{\dodowithbuffer{#1}{#2}{#3}}}
-\long\def\dodowithbuffer#1#2#3#4#5% name, startsequence, stopsequence, before, after
+\unexpanded\long\def\dodowithbuffer#1#2#3#4#5% name, startsequence, stopsequence, before, after
{#4%
\bgroup
+ \ctxcommand{erasebuffer("#1")}%
\setcatcodetable \vrbcatcodes
- \catcode`\\=12
- \ctxlua{buffers.erase("#1")}%
\long\def\nododowithbuffer
{\egroup
#5}%
\long\def\dododowithbuffer##1#3% is detokenize needed? TEST
- {\ctxlua
- {buffers.grab("#1","#2","#3",\!!bs\detokenize{##1}\!!es)}
- \dododowithbuffer
- \nododowithbuffer}%
+ {\ctxcommand{grabbuffer("#1","#2","#3",\!!bs\detokenize{##1}\!!es)} % space ?
+ \dododowithbuffer
+ \nododowithbuffer}%
\dododowithbuffer}
-\def\setbuffercapsules#1#2% \scantextokens not needed (had a reason at some point)
- {\edef\bufferstart{#1}\edef\bufferstart{\scantextokens\expandafter{\bufferstart}}%
- \edef\bufferstop {#2}\edef\bufferstop {\scantextokens\expandafter{\bufferstop }}}
-
\def\setbuffer
{\dosingleempty\dosetbuffer}
+\let\endbuffer\relax
+
\long\def\dosetbuffer[#1]#2\endbuffer % seldom used so we just pass #2
- {\begingroup
- \setcurrentbuffer{#1}%
- \ctxlua{buffers.set("\currentbuffer", \!!bs\detokenize{#2}\!!es)}%
- \endgroup}
+ {\ctxcommand{assignbuffer("#1", \!!bs\detokenize{#2}\!!es)}}
+
+\def\namedbufferparameter#1#2{\csname\??bu#1#2\endcsname}
\unexpanded\def\setupbuffer
{\dodoubleempty\dosetupbuffer}
@@ -156,188 +96,65 @@
\getparameters[\??bu][#1]%
\fi}
-\def\dodefinebuffer[#1][#2]%
- {\iffirstargument % else problems
- \doglobal\increment\nofdefinedbuffers
- \letvalue{\??bu#1\c!number }\nofdefinedbuffers
- \letvalue{\??bu#1\c!paragraph}\v!no
- \setuevalue{\e!start#1}{\noexpand\dostartbuffer[#1][def-\nofdefinedbuffers][\e!start#1][\e!stop#1]}% maybe also relax stop
- \setuevalue{\e!get #1}{\noexpand\dogetbuffer [#1][def-\nofdefinedbuffers]}%
- \setuevalue{\e!type #1}{\noexpand\dotypebuffer [#1][def-\nofdefinedbuffers]}%
- \getparameters[\??bu#1][#2]%
- \fi}
+\newtoks\everydefinebuffer
\unexpanded\def\definebuffer
{\dodoubleempty\dodefinebuffer}
-\def\thebuffernumber#1%
- {\csname\??bu#1\c!number\endcsname}
-
-\unexpanded\def\getbuffer
- {\dodoubleempty\dogetbuffer}
-
-\def\dogetbuffer[#1][#2]%
- {\ifsecondargument
- \dodogetbuffer[#1][#2]%
- \else
- \dodogetbuffer[][#1]%
- \fi}
-
-\def\dogetbufferasis{\ctxlua{buffers.get("\currentbuffer")}}
-
-\def\dodogetbuffer[#1][#2]%
- {\getvalue{\??bu#1\c!before}%
- \dobuffer{16}{#2}\dogetbufferasis
- \getvalue{\??bu#1\c!after}}
-
-\unexpanded\def\typebuffer
- {\dodoubleempty\dotypebuffer}
-
-\def\doprocessbufferverbatim
- {\doinitializeverbatim
- \ctxlua{buffers.type("\currentbuffer","\typingparameter\c!strip")}}
-
-\def\doprocessbufferlinesverbatim#1#2#3%
- {#2%
- % todo, set up numbers
- \doinitializeverbatim
- \ctxlua{buffers.type("\currentbuffer","\typingparameter\c!strip")}
- #3}
-
-\def\doifelsebuffer#1%
- {\ctxlua{buffers.doifelsebuffer("#1")}}
-
-\def\dodotypebuffer#1#2#3% see dodotypefile
- {\doifelsebuffer{#3}
- {\dosometyping{#1}{#2}{#3}\doprocessbufferverbatim\doprocessbufferlinesverbatim}
- {\reporttypingerror{#3}}}
-
-\def\dotypefilebuffer{\dodotypebuffer{\v!file}{}{\currentbuffer}}%
-
-\def\dotypebuffer[#1][#2]%
+\def\dodefinebuffer[#1][#2]%
{\iffirstargument
- \dobuffer{17}{#1}\dotypefilebuffer
+ \global\advance\nofdefinedbuffers\plusone
+ \setevalue{\??bu#1\c!number}{\number\nofdefinedbuffers}%
+ \def\currentbuffer{#1}%
+ \getparameters[\??bu#1][#2]%
+ \the\everydefinebuffer
\else
- \dobuffer{17}{#2}\dotypefilebuffer
+ % fatal error
\fi}
-\def\dobuffer#1#2#3%
- {\doifelsenothing{#2}
- {\dodobuffer#3\jobname}
- {\processcommalist[#2]{\dodobuffer#3}}}
-
-\def\dodobuffer#1#2% command name
- {\pushmacro\currentbuffer
- \edef\currentbuffer{\ifcsname\??bu#2\c!number\endcsname def-\csname\??bu#2\c!number\endcsname\else#2\fi}%
- #1%
- \popmacro\currentbuffer}
+\def\thebuffernumber #1{\csname\??bu#1\c!number\endcsname}
+\def\thedefinedbuffer#1{def-\csname\??bu#1\c!number\endcsname}
-\def\processTEXbuffer{\getbuffer} % handy
+\appendtoks
+ \setuevalue{\e!start\currentbuffer}%
+ {\noexpand\dostartdefinedbuffer
+ [\currentbuffer]%
+ [def-\number\nofdefinedbuffers]%
+ [\e!start\currentbuffer]%
+ [\e!stop\currentbuffer]}%
+ \setuevalue{\e!get\currentbuffer}%
+ {\noexpand\dogetdefinedbuffer
+ [\currentbuffer]%
+ [def-\number\nofdefinedbuffers]}%
+\to \everydefinebuffer
-% extras:
+\def\doprocessbufferlist#1#2%
+ {\doifelsenothing{#1}
+ {\dododogetbuffer\empty}
+ {\processcommalist[#1]#2}}
-\def\inspectbuffer
- {\dosingleempty\doinspectbuffer}
+\unexpanded\def\getbuffer % no [settings yet]
+ {\dosingleempty\dogetbuffer}
-\def\doinspectbuffer[#1]%
- {\setcurrentbuffer{#1}%
- \ctxlua{buffers.inspect("\currentbuffer")}}
-
-% seldom used, only in a few projects that demanded more speed
-
-\let\usememorybuffers\relax
-\let\usefilebuffers \relax
-
-% this features is soldom used (complex examns where we need to fetch
-% special parts of a text
-%
-% this is not yet supported in mkiv (relatively easy to do but there
-% we don't have the par tags but need to grab 'm
+\unexpanded\def\dogetbuffer[#1]% [name]
+ {\namedbufferparameter\empty\c!before
+ \doprocessbufferlist{#1}\dododogetbuffer
+ \namedbufferparameter\empty\c!after}
-\def\skippedbufferparagraphs{0}
+\def\dogetdefinedbuffer[#1][#2]%
+ {\namedbufferparameter{#1}\c!before
+ \dododogetbuffer{#2}%
+ \namedbufferparameter{#1}\c!after}
-\let\startbufferparagraph\relax
-\let\stopbufferparagraph \par % \relax
+\def\dododogetbuffer#1%
+ {\ctxcommand{getbuffer("#1")}}
-\newcount\currentbufferparagraph
+\definebuffer[\v!hiding] \setupbuffer[\v!hiding][\c!before=,\c!after=]
-\def\getbufferparagraphs
- {\dodoubleempty\dogetbufferparagraphs}
-
-\def\dosetbufferoffset#1%
- {\doifnumberelse{\getvalue{\??bu#1\c!paragraph}}
- {\currentbufferparagraph-\getvalue{\??bu#1\c!paragraph}}
- {\currentbufferparagraph \zerocount}%
- \relax}
-
-\def\dogetbufferparagraphs[#1][#2]%
- {\iffirstargument
- \ifsecondargument
- \dosetbufferoffset{#1}%
- \doifelse{#2}\v!all
- {\unexpanded\def\startbufferparagraph{\normalbufferparagraph{#1}}}
- {\unexpanded\def\startbufferparagraph{\filterbufferparagraph{#1}{#2}}}%
- \unexpanded\def\stopbufferparagraph{\dostopbufferparagraph{#1}}%
- \def\next{\getparagraphedbuffer[#1]}%
- \else
- \dosetbufferoffset\empty
- \unexpanded\def\startbufferparagraph{\filterbufferparagraph{}{#1}}%
- \unexpanded\def\stopbufferparagraph{\dostopbufferparagraph{}}%
- \def\next{\getparagraphedbuffer[]}%
- \fi
- \else
- \dosetbufferoffset\empty
- \unexpanded\def\startbufferparagraph{\normalbufferparagraph{}}%
- \unexpanded\def\stopbufferparagraph{\dostopbufferparagraph{}}%
- \def\next{\getparagraphedbuffer[]}%
- \fi
- \next}
-
-\def\dotypeparagraphbuffer{\ctxlua{buffers.get("\currentbuffer")}}
-
-\def\getparagraphedbuffer[#1]%
- {\dobuffer{16}{#1}\dotypeparagraphbuffer}
-
-\def\dostopbufferparagraph#1%
- {\getvalue{\??bu#1\c!after}\par}
-
-\def\dostartbufferparagraph#1%
- {\par\getvalue{\??bu#1\c!before}}
-
-\def\normalbufferparagraph
- {\advance\currentbufferparagraph \plusone
- \ifnum\currentbufferparagraph>\zerocount
- \expandafter\dostartbufferparagraph
- \else
- \expandafter\gobbleoneargument
- \fi}
-
-\def\filterbufferparagraph#1#2%
- {\advance\currentbufferparagraph \plusone
- \ifcase\currentbufferparagraph
- \@EA\gobblebufferparagraph
- \else
- \doifinsetelse{\the\currentbufferparagraph}{#2}
- {\@EA\dostartbufferparagraph}
- {\@EA\fakebufferparagraph}%
- \fi
- {#1}}
-
-\long\def\gobblebufferparagraph#1#2\stopbufferparagraph
- {}
-
-\def\fakebufferparagraph#1%
- {\bgroup
- \unexpanded\def\stopbufferparagraph{\dostopbufferparagraph{#1}\egroup\egroup}%
- \setbox\scratchbox\vbox\bgroup\dostartbufferparagraph{#1}}
-
-% definitions
-
-\definebuffer[\v!hiding] \setupbuffer[\v!hiding][\c!local=\v!yes]
+\let\processTEXbuffer\getbuffer % handy synonym
\setupbuffer
- [\c!paragraph=\v!no,
- \c!before=,
+ [\c!before=,
\c!after=]
% only mkiv:
@@ -350,6 +167,24 @@
\unexpanded\def\savebuffer{\dodoubleempty\dosavebuffer}
-\def\dosavebuffer[#1][#2]{\ctxlua{commands.savebuffer("#1","#2")}}
+\def\dosavebuffer[#1][#2]{\ctxcommand{savebuffer("#1","#2")}}
+
+%D Experimental: no expansion of commands in buffer!
+
+% \startbuffer[what]
+% tex.print("WHAT")
+% \stopbuffer
+% \startbuffer
+% tex.print("JOBNAME")
+% \stopbuffer
+%
+% \ctxluabuffer[what] \ctxluabuffer
+
+\def\ctxluabuffer {\dosingleempty\doctxluabuffer}
+\def\mkvibuffer {\dosingleempty\domkvibuffer}
+\def\mkvibufferraw{\dosingleempty\domkvibufferraw}
+
+\def\doctxluabuffer [#1]{\ctxcommand{getbufferctxlua("#1")}}
+\def\domkvibuffer [#1]{\ctxcommand{getbuffermkvi("#1")}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/buff-par.lua b/Master/texmf-dist/tex/context/base/buff-par.lua
new file mode 100644
index 00000000000..2015b0bc0a4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-par.lua
@@ -0,0 +1,179 @@
+if not modules then modules = { } end modules ['buff-ini'] = {
+ version = 1.001,
+ comment = "companion to buff-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local trace_parallel = false trackers.register("buffers.parallel", function(v) trace_parallel = v end)
+
+local report_parallel = logs.reporter("buffers","parallel")
+
+local insert, remove, find, gmatch = table.insert, table.remove, string.find, string.gmatch
+local strip, format = string.strip, string.format
+
+local variables = interfaces.variables
+
+buffers.parallel = { } local parallel = buffers.parallel
+
+local data = { }
+
+function parallel.define(category,tags)
+ local tags = utilities.parsers.settings_to_array(tags)
+ local entries = { }
+ data[category] = {
+ tags = tags,
+ entries = entries,
+ }
+ for i=1,#tags do
+ entries[tags[i]] = {
+ lines = { },
+ number = 0,
+ }
+ end
+end
+
+function parallel.reset(category,tags)
+ if not tags or tags == "" or tags == variables.all then
+ tags = table.keys(entries)
+ else
+ tags = utilities.parsers.settings_to_array(tags)
+ end
+ for i=1,#tags do
+ entries[tags[i]] = {
+ lines = { },
+ number = 0,
+ }
+ end
+end
+
+function parallel.next(category)
+ local dc = data[category]
+ local tags = dc.tags
+ local entries = dc.entries
+ for i=1,#tags do
+ insert(entries[tags[i]].lines, { })
+ end
+end
+
+function parallel.save(category,tag,content)
+ local dc = data[category]
+ if not dc then
+ return
+ end
+ local entries = dc.entries[tag]
+ if not entries then
+ return
+ end
+ local lines = entries.lines
+ if not lines then
+ return
+ end
+ local line = lines[#lines]
+ if not line then
+ return
+ end
+ -- maybe no strip
+ -- use lpeg
+ if find(content,"^%s*%[") then
+ local done = false
+ for label, content in gmatch(content,"%s*%[(.-)%]%s*([^%[]+)") do
+ if done then
+ line = { }
+ insert(lines,line)
+ else
+ done = true
+ end
+ if trace_parallel and label ~= "" then
+ report_parallel("reference found: category '%s', tag '%s', label '%s'",category,tag,label)
+ end
+ line.label = label
+ line.content = strip(content)
+ end
+ else
+ line.content = strip(content)
+ line.label = ""
+ end
+end
+
+function parallel.hassomecontent(category,tags)
+ local dc = data[category]
+ if not dc then
+ return false
+ end
+ local entries = dc.entries
+ if not tags or tags == "" or tags == variables.all then
+ tags = table.keys(entries)
+ else
+ tags = utilities.parsers.settings_to_array(tags)
+ end
+ for t=1,#tags do
+ local tag = tags[t]
+ local lines = entries[tag].lines
+ for i=1,#lines do
+ local content = lines[i].content
+ if content and content ~= "" then
+ return true
+ end
+ end
+ end
+ return false
+end
+
+local save = 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
+ if n then
+ max = n
+ elseif criterium == variables.all then
+ max = 0
+ for t=1,#tags do
+ local tag = tags[t]
+ local lines = entries[tag].lines
+ if #lines > max then
+ max = #lines
+ end
+ end
+ end
+ for i=1,max do
+ for t=1,#tags do
+ 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)
+ else
+ context.doflushparallel(tag,0,number,"","")
+ end
+ end
+ end
+ end
+end
+
+-- interface
+
+commands.defineparallel = parallel.define
+commands.nextparallel = parallel.next
+commands.saveparallel = parallel.save
+commands.placeparallel = parallel.place
+commands.resetparallel = parallel.reset
+
+function commands.doifelseparallel(category,tags)
+ commands.testcase(parallel.hassomecontent(category,tags))
+end
diff --git a/Master/texmf-dist/tex/context/base/buff-par.mkiv b/Master/texmf-dist/tex/context/base/buff-par.mkiv
new file mode 100644
index 00000000000..c44a75050b1
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-par.mkiv
@@ -0,0 +1,151 @@
+%D \module
+%D [ file=buff-par,
+%D version=2010.12.05,
+%D title=\CONTEXT\ Buffer Macros,
+%D subtitle=Parallel,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Buffer Macros / Parallel}
+
+\registerctxluafile{buff-par}{1.001}
+
+%D This module is developped for Thomas Schmitz as part of
+%D a project.
+
+\unprotect
+
+\letvalue{\??px:}\empty
+
+\def\parallelparameter#1%
+ {\csname\??px:%
+ \ifcsname\??px:\currentparallel:\currentparallelinstance:#1\endcsname
+ \currentparallel:\currentparallelinstance:#1%
+ \else\ifcsname\??px:\currentparallel:#1\endcsname
+ \currentparallel:#1%
+ \else\ifcsname\??px:#1\endcsname
+ #1%
+ \fi\fi\fi
+ \endcsname}
+
+\unexpanded\def\defineparallel
+ {\dodoubleargument\dodefineparallel}
+
+\def\dodefineparallel[#1][#2]%
+ {\ctxcommand{defineparallel("#1","#2")}%
+ \processcommalist[#2]\dododefineparallel
+ \setuvalue{\e!start#1}{\dostartparallelset{#1}}%
+ \setuvalue{\e!stop #1}{\dostopparallelset}}
+
+\def\dododefineparallel#1%
+ {\definebuffer[#1]%%
+ \setuvalue{\e!stop#1}{\dowithparallel{#1}}}
+
+\def\dostartparallelset#1%
+ {\def\currentparallel{#1}%
+ \ctxcommand{nextparallel("\currentparallel")}}
+
+\def\dostopparallelset#1%
+ {}
+
+\def\dowithparallel#1% defined moet ook aan de lua kant kunnen
+ {\ctxcommand{saveparallel("\currentparallel","#1",buffers.raw("\thedefinedbuffer{#1}"))}}
+
+\unexpanded\def\placeparallel
+ {\dotripleempty\doplaceparallel}
+
+\def\doplaceparallel[#1][#2][#3]%
+ {\begingroup
+ \def\currentparallel{#1}%
+ \ctxcommand{placeparallel("\currentparallel","#2","#3")}%
+ \endgroup}
+
+% was: \parallelparameter\c!command}
+
+\def\doflushparallel#1#2#3#4#5% {instance}{status}{line}{label}{content}
+ {\begingroup
+ \def\currentparallelinstance{#1}%
+ \def\currentparallelnumber {#2}%
+ \def\currentparallelline {#3}%
+ \def\currentparallellabel {#4}%
+ \def\currentparallelcontent {#5}%
+ \ifcase#2\relax
+ \expandafter\noflushparalleldefault
+ \or
+ \expandafter\doflushparalleldefault
+ \fi
+ \endgroup}
+
+\def\noflushparalleldefault{}
+\def\doflushparalleldefault{\directsetup{\parallelparameter\c!setups}}
+
+\startsetups parallel:place:default
+ \hangafter1
+ \hangindent4em
+ \dontleavehmode
+ \hbox to 3em \bgroup
+ \hss
+ \bf
+ \doifsomething \currentparallellabel {
+ \textreference[\currentparallellabel]{\currentparallelline}
+ }
+ \currentparallelline
+ \quad
+ \egroup
+ \currentparallelcontent
+ \par
+\stopsetups
+
+\unexpanded\def\setupparallel
+ {\dotripleempty\dosetupparallel}
+
+\def\dosetupparallel[#1][#2][#3]%
+ {\ifthirdargument
+ \getparameters[\??px:#1:#2:][#3]%
+ \else\ifsecondargument
+ \getparameters[\??px:#1:][#2]%
+ \else
+ \getparameters[\??px:][#1]% maybe no : here
+ \fi\fi}
+
+\setupparallel
+% [\c!command=\doflushparalleldefault]
+ [\c!setups=parallel:place:default]
+
+\def\doifelseparallel#1#2%
+ {\cldcontext{commands.doifelseparallel("#1","#2")}}
+
+\def\resetparallel
+ {\dodoubleempty\doresetparallel}
+
+\def\resetparallel[#1][#2]%
+ {\ctxcommand{resetparallel("#1","#2"))}}
+
+% default
+
+% \def\doflushparalleldefault#1#2#3#4% todo: setups instead
+% {\ifcase#1\or
+% \begingroup
+% \hangafter1
+% \hangindent4em
+% \dontleavehmode
+% \hbox to 3em{\hss\bf\doifsomething{#3}{\textreference[#3]{#2}}#2\quad}#4\par
+% \endgroup
+% \fi}
+
+\protect \endinput
+
+% \def\dododefineparallel#1%
+% {\setuvalue{\e!stop #1}{}%
+% \setuvalue{\e!start#1}{\dostartparallel{#1}}}
+%
+% \def\dostartparallel#1%
+% {\grabuntil{\e!stop#1}{\dododostartparallel{#1}}}
+%
+% \def\dododostartparallel#1#2%
+% {\ctxcommand{saveparallel("\currentparallel","#1",\!!bs\detokenize{#2}\!!es)}}
diff --git a/Master/texmf-dist/tex/context/base/buff-ver.lua b/Master/texmf-dist/tex/context/base/buff-ver.lua
new file mode 100644
index 00000000000..bd274a36a7b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/buff-ver.lua
@@ -0,0 +1,670 @@
+if not modules then modules = { } end modules ['buff-ver'] = {
+ version = 1.001,
+ comment = "companion to buff-ver.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- The default visualizers have reserved names starting with buff-imp-*. Users are
+-- supposed to use different names for their own variants.
+--
+-- todo: skip=auto
+
+local type, next, rawset, rawget, setmetatable, getmetatable = type, next, rawset, rawget, setmetatable, getmetatable
+local format, lower, upper,match, find, sub = string.format, string.lower, string.upper, string.match, string.find, string.sub
+local splitlines = string.splitlines
+local concat = table.concat
+local C, P, R, V, Carg, Cc, Cs = lpeg.C, lpeg.P, lpeg.R, lpeg.V, lpeg.Carg, lpeg.Cc, lpeg.Cs
+local patterns, lpegmatch, is_lpeg = lpeg.patterns, lpeg.match, lpeg.is_lpeg
+
+local trace_visualize = false trackers.register("buffers.visualize", function(v) trace_visualize = v end)
+local report_visualizers = logs.reporter("buffers","visualizers")
+
+local allocate = utilities.storage.allocate
+
+visualizers = visualizers or { }
+local specifications = allocate()
+visualizers.specifications = specifications
+
+local tabtospace = utilities.strings.tabtospace
+local variables = interfaces.variables
+local settings_to_array = utilities.parsers.settings_to_array
+local verbatim = context.verbatim
+local variables = interfaces.variables
+local findfile = resolvers.findfile
+local addsuffix = file.addsuffix
+
+local v_auto = variables.auto
+local v_yes = variables.yes
+
+-- beware, these all get an argument (like newline)
+
+local doinlineverbatimnewline = context.doinlineverbatimnewline
+local doinlineverbatimbeginline = context.doinlineverbatimbeginline
+local doinlineverbatimemptyline = context.doinlineverbatimemptyline
+local doinlineverbatimstart = context.doinlineverbatimstart
+local doinlineverbatimstop = context.doinlineverbatimstop
+
+local dodisplayverbatimnewline = context.dodisplayverbatimnewline
+local dodisplayverbatimbeginline = context.dodisplayverbatimbeginline
+local dodisplayverbatimemptyline = context.dodisplayverbatimemptyline
+local dodisplayverbatimstart = context.dodisplayverbatimstart
+local dodisplayverbatimstop = context.dodisplayverbatimstop
+
+local doverbatimspace = context.doverbatimspace
+
+local CargOne = Carg(1)
+
+local function f_emptyline(s,settings)
+ if settings and settings.nature == "inline" then
+ doinlineverbatimemptyline()
+ else
+ dodisplayverbatimemptyline()
+ end
+end
+
+local function f_beginline(s,settings)
+ if settings and settings.nature == "inline" then
+ doinlineverbatimbeginline()
+ else
+ dodisplayverbatimbeginline()
+ end
+end
+
+local function f_newline(s,settings)
+ if settings and settings.nature == "inline" then
+ doinlineverbatimnewline()
+ else
+ dodisplayverbatimnewline()
+ end
+end
+
+local function f_start(s,settings)
+ if settings and settings.nature == "inline" then
+ doinlineverbatimstart()
+ else
+ dodisplayverbatimstart()
+ end
+end
+
+local function f_stop(s,settings)
+ if settings and settings.nature == "inline" then
+ doinlineverbatimstop()
+ else
+ dodisplayverbatimstop()
+ end
+end
+
+local function f_default(s) -- (s,settings)
+ verbatim(s)
+end
+
+local function f_space() -- (s,settings)
+ doverbatimspace()
+end
+
+local function f_signal() -- (s,settings)
+ -- we use these for special purposes
+end
+
+local signal = "\000"
+
+visualizers.signal = signal
+visualizers.signalpattern = P(signal)
+
+local functions = { __index = {
+ emptyline = f_emptyline,
+ newline = f_newline,
+ default = f_default,
+ beginline = f_beginline,
+ space = f_space,
+ start = f_start,
+ stop = f_stop,
+ signal = f_signal,
+ }
+}
+
+local handlers = { }
+
+function visualizers.newhandler(name,data)
+ local tname, tdata = type(name), type(data)
+ if tname == "table" then -- (data)
+ setmetatable(name,getmetatable(name) or functions)
+ return name
+ elseif tname == "string" then
+ if tdata == "string" then -- ("name","parent")
+ local result = { }
+ setmetatable(result,getmetatable(handlers[data]) or functions)
+ handlers[name] = result
+ return result
+ elseif tdata == "table" then -- ("name",data)
+ setmetatable(data,getmetatable(data) or functions)
+ handlers[name] = data
+ return data
+ else -- ("name")
+ local result = { }
+ setmetatable(result,functions)
+ handlers[name] = result
+ return result
+ end
+ else -- ()
+ local result = { }
+ setmetatable(result,functions)
+ return result
+ end
+end
+
+function visualizers.newgrammar(name,t)
+ name = lower(name)
+ t = t or { }
+ local g = visualizers.specifications[name]
+ g = g and g.grammar
+ if g then
+ if trace_visualize then
+ report_visualizers("cloning grammar '%s'",name)
+ end
+ for k,v in next, g do
+ if not t[k] then
+ t[k] = v
+ end
+ if is_lpeg(v) then
+ t[name..":"..k] = v
+ end
+ end
+ end
+ return t
+end
+
+local function getvisualizer(method,nature)
+ method = lower(method)
+ local m = specifications[method] or specifications.default
+ if nature then
+ if trace_visualize then
+ report_visualizers("getting visualizer '%s' with nature '%s'",method,nature)
+ end
+ return m and (m[nature] or m.parser) or nil
+ else
+ if trace_visualize then
+ report_visualizers("getting visualizer '%s'",method)
+ end
+ return m and m.parser or nil
+ end
+end
+
+local fallback = context.verbatim
+
+local function makepattern(visualizer,replacement,pattern)
+ if not pattern then
+ report_visualizers("error in visualizer: %s",replacement)
+ return patterns.alwaystrue
+ else
+ if type(visualizer) == "table" and type(replacement) == "string" then
+ replacement = visualizer[replacement] or fallback
+ else
+ replacement = fallback
+ end
+ return (C(pattern) * CargOne) / replacement
+ end
+end
+
+local function makenested(handler,how,start,stop)
+ local b, e, f = P(start), P(stop), how
+ if type(how) == "string" then
+ f = function(s) getvisualizer(how,"direct")(s) end
+ end
+ return makepattern(handler,"name",b)
+ * ((1-e)^1/f)
+ * makepattern(handler,"name",e)
+end
+
+visualizers.pattern = makepattern
+visualizers.makepattern = makepattern
+visualizers.makenested = makenested
+
+function visualizers.load(name)
+ name = lower(name)
+ if rawget(specifications,name) == nil then
+ name = lower(name)
+ local texname = findfile(format("buff-imp-%s.mkiv",name))
+ local luaname = findfile(format("buff-imp-%s.lua" ,name))
+ if texname == "" or luaname == "" then
+ -- assume a user specific file
+ luaname = findfile(addsuffix(name,"mkiv"))
+ texname = findfile(addsuffix(name,"lua" ))
+ end
+ if texname == "" or luaname == "" then
+ if trace_visualize then
+ report_visualizers("unknown visualizer '%s'",name)
+ end
+ else
+ if trace_visualize then
+ report_visualizers("loading visualizer '%s'",name)
+ end
+ lua.registercode(luaname)
+ context.input(texname)
+ end
+ if rawget(specifications,name) == nil then
+ rawset(specifications,name,false)
+ end
+ end
+end
+
+function commands.doifelsevisualizer(name)
+ commands.testcase(specifications[lower(name)])
+end
+
+function visualizers.register(name,specification)
+ name = lower(name)
+ if trace_visualize then
+ report_visualizers("registering visualizer '%s'",name)
+ end
+ specifications[name] = specification
+ local parser, handler = specification.parser, specification.handler
+ local displayparser = specification.display or parser
+ local inlineparser = specification.inline or parser
+ local isparser = is_lpeg(parser)
+ local start, stop
+ if isparser then
+ start = makepattern(handler,"start",patterns.alwaysmatched)
+ stop = makepattern(handler,"stop",patterns.alwaysmatched)
+ end
+ if handler then
+ if isparser then
+ specification.display = function(content,settings)
+ if handler.startdisplay then handler.startdisplay(settings) end
+ lpegmatch(start * displayparser * stop,content,1,settings)
+ if handler.stopdisplay then handler.stopdisplay(settings) end
+ end
+ specification.inline = function(content,settings)
+ if handler.startinline then handler.startinline(settings) end
+ lpegmatch(start * inlineparser * stop,content,1,settings)
+ if handler.stopinline then handler.stopinline(settings) end
+ end
+ specification.direct = function(content,settings)
+ lpegmatch(parser,content,1,settings)
+ end
+ elseif parser then
+ specification.display = function(content,settings)
+ if handler.startdisplay then handler.startdisplay(settings) end
+ parser(content,settings)
+ if handler.stopdisplay then handler.stopdisplay(settings) end
+ end
+ specification.inline = function(content,settings)
+ if handler.startinline then handler.startinline(settings) end
+ parser(content,settings)
+ if handler.stopinline then handler.stopinline(settings) end
+ end
+ specification.direct = parser
+ end
+ elseif isparser then
+ specification.display = function(content,settings)
+ lpegmatch(start * displayparser * stop,content,1,settings)
+ end
+ specification.inline = function(content,settings)
+ lpegmatch(start * inlineparser * stop,content,1,settings)
+ end
+ specification.direct = function(content,settings)
+ lpegmatch(parser,content,1,settings)
+ end
+ elseif parser then
+ specification.display = parser
+ specification.inline = parser
+ specification.direct = parser
+ end
+ return specification
+end
+
+local escapepatterns = allocate()
+visualizers.escapepatterns = escapepatterns
+
+local function texmethod(s)
+ context.bgroup()
+ context(s)
+ context.egroup()
+end
+
+local function texcommand(s)
+ context[s]()
+end
+
+local function defaultmethod(s,settings)
+ lpegmatch(getvisualizer("default"),lower(s),1,settings)
+end
+
+-- we can consider using a nested instead
+
+local space_pattern = patterns.space^0
+local name_pattern = R("az","AZ")^1
+
+-- the hack is needed in order to retain newlines when an escape happens at the
+-- at the begin of a line; it also ensures proper line numbering; a bit messy
+
+local function hack(pattern)
+ return Cs(pattern * Cc(signal))
+end
+
+function visualizers.registerescapepattern(name,before,after,normalmethod,escapemethod)
+ local escapepattern = escapepatterns[name]
+ if not escapepattern then
+ if trace_visualize then
+ report_visualizers("registering escape pattern, name: '%s', before: '%s', after: '%s'",name,before,after)
+ end
+ before, after = P(before) * space_pattern, space_pattern * P(after)
+ escapepattern = (
+ (before / "")
+ * ((1 - after)^0 / (escapemethod or texmethod))
+ * (after / "")
+ + hack((1 - before)^1) / (normalmethod or defaultmethod)
+ )^0
+ escapepatterns[name] = escapepattern
+ end
+ return escapepattern
+end
+
+function visualizers.registerescapecommand(name,token,normalmethod,escapecommand)
+ local escapepattern = escapepatterns[name]
+ if not escapepattern then
+ if trace_visualize then
+ report_visualizers("registering escape token, name: '%s', token: '%s'",name,token)
+ end
+ token = P(token)
+ local notoken = hack((1 - token)^1)
+ local cstoken = name_pattern * space_pattern
+ escapepattern = (
+ (token / "")
+ * (cstoken / (escapecommand or texcommand))
+ + (notoken / (normalmethod or defaultmethod))
+ )^0
+ escapepatterns[name] = escapepattern
+ end
+ return escapepattern
+end
+
+local escapedvisualizers = { }
+
+local function visualize(content,settings) -- maybe also method in settings
+ if content and content ~= "" then
+ local method = lower(settings.method or "default")
+ local m
+ local e = settings.escape
+ if e and e ~= "" then
+ local newname = format("%s-%s",e,method)
+ local newspec = specifications[newname]
+ if newspec then
+ m = newspec
+ else
+ local start, stop
+ if e == v_yes then
+ start, stop = "/BTEX", "/ETEX"
+ else
+ start, stop = match(e,"^(.-),(.-)$") -- todo: lpeg
+ end
+ local oldvisualizer = specifications[method] or specifications.default
+ local oldparser = oldvisualizer.direct
+ local newparser
+ if start and stop then
+ newparser = visualizers.registerescapepattern(newname,start,stop,oldparser)
+ else -- for old times sake: /em
+ newparser = visualizers.registerescapecommand(newname,e,oldparser)
+ end
+ m = visualizers.register(newname, {
+ parser = newparser,
+ handler = oldvisualizer.handler,
+ })
+ end
+ else
+ m = specifications[method] or specifications.default
+ end
+ local nature = settings.nature or "display"
+ local n = m and m[nature]
+ if n then
+ if trace_visualize then
+ report_visualizers("visualize using method '%s' and nature '%s'",method,nature)
+ end
+ n(content,settings)
+ else
+ if trace_visualize then
+ report_visualizers("visualize using method '%s'",method)
+ end
+ fallback(content,1,settings)
+ end
+ end
+end
+
+visualizers.visualize = visualize
+visualizers.getvisualizer = getvisualizer
+
+local function checkedsettings(settings,nature)
+ if not settings then
+ return { nature = nature }
+ else
+ if not settings.nature then
+ settings.nature = nature
+ end
+ return settings
+ end
+end
+
+function visualizers.visualizestring(content,settings)
+ visualize(content,checkedsettings(settings,"inline"))
+end
+
+function visualizers.visualizefile(name,settings)
+ visualize(resolvers.loadtexfile(name),checkedsettings(settings,"display"))
+end
+
+function visualizers.visualizebuffer(name,settings)
+ visualize(buffers.getcontent(name),checkedsettings(settings,"display"))
+end
+
+-- --
+
+local space = C(patterns.space) * CargOne / f_space
+local newline = C(patterns.newline) * CargOne / f_newline
+local emptyline = C(patterns.emptyline) * CargOne / f_emptyline
+local beginline = C(patterns.beginline) * CargOne / f_beginline
+local anything = C(patterns.somecontent) * CargOne / f_default
+
+----- verbosed = (space + newline * (emptyline^0) * beginline + anything)^0
+local verbosed = (space + newline * (emptyline^0) * beginline + emptyline + newline + anything)^0
+
+local function write(s,settings) -- bad name
+ lpegmatch(verbosed,s,1,settings or false)
+end
+
+visualizers.write = write
+visualizers.writenewline = f_newline
+visualizers.writeemptyline = f_emptyline
+visualizers.writespace = f_space
+visualizers.writedefault = f_default
+
+function visualizers.writeargument(...)
+ context("{") -- If we didn't have tracing then we could
+ write(...) -- use a faster print to tex variant for the
+ context("}") -- { } tokens as they always have ctxcatcodes.
+end
+
+-- helpers
+
+local function realign(lines,forced_n) -- no, auto, <number>
+ forced_n = (forced_n == v_auto and huge) or tonumber(forced_n)
+ if forced_n then
+ local n = 0
+ for i=1, #lines do
+ local spaces = find(lines[i],"%S")
+ if not spaces then
+ -- empty line
+ elseif not n then
+ n = spaces
+ elseif spaces == 0 then
+ n = 0
+ break
+ elseif n > spaces then
+ n = spaces
+ end
+ end
+ if n > 0 then
+ if n > forced_n then
+ n = forced_n
+ end
+ for i=1,#d do
+ lines[i] = sub(lines[i],n)
+ end
+ end
+ end
+ return lines
+end
+
+local function getstrip(lines,first,last)
+ local first, last = first or 1, last or #lines
+ for i=first,last do
+ local li = lines[i]
+ if #li == 0 or find(li,"^%s*$") then
+ first = first + 1
+ else
+ break
+ end
+ end
+ for i=last,first,-1 do
+ local li = lines[i]
+ if #li == 0 or find(li,"^%s*$") then
+ last = last - 1
+ else
+ break
+ end
+ end
+ return first, last, last - first + 1
+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
+ if last < 0 then
+ last = noflines + last
+ end
+ local what = settings_to_array(range)
+ local r_first, r_last = what[1], what[2]
+ local f, l = tonumber(r_first), tonumber(r_last)
+ if r_first then
+ if f then
+ if f > first then
+ first = f
+ end
+ else
+ for i=first,last do
+ if find(lines[i],r_first) then
+ first = i + 1
+ break
+ end
+ end
+ end
+ end
+ if r_last then
+ if l then
+ if l < 0 then
+ l = noflines + l
+ end
+ if find(r_last,"^[%+]") then -- 1,+3
+ l = first + l
+ end
+ if l < last then
+ last = l
+ end
+ else
+ for i=first,last do
+ if find(lines[i],r_last) then
+ last = i - 1
+ break
+ end
+ end
+ end
+ end
+ return first, last
+end
+
+local tablength = 7
+
+local function dotabs(content,settings)
+ local tab = settings.tab
+ tab = tab and (tab == v_yes and tablength or tonumber(tab))
+ if tab then
+ return tabtospace(content,tab)
+ else
+ return content
+ end
+end
+
+local function filter(lines,settings) -- todo: inline or display in settings
+ local strip = settings.strip
+ if strip == v_yes then
+ lines = realign(lines,strip)
+ end
+ local line, n = 0, 0
+ local first, last, m = getstrip(lines)
+ if range then
+ first, last = getrange(lines,first,last,range)
+ first, last = getstrip(lines,first,last)
+ end
+ -- \r is \endlinechar but \n would is more generic so this choice is debatable
+ local content = concat(lines,(settings.nature == "inline" and " ") or "\n",first,last)
+ return content, m
+end
+
+-- main functions
+
+local getlines = buffers.getlines
+
+function commands.typebuffer(settings)
+ local lines = getlines(settings.name)
+ if lines then
+ local content, m = filter(lines,settings)
+ if content and content ~= "" then
+ content = dotabs(content,settings)
+ visualize(content,checkedsettings(settings,"display"))
+ end
+ end
+end
+
+function commands.processbuffer(settings)
+ local lines = getlines(settings.name)
+ if lines then
+ local content, m = filter(lines,settings)
+ if content and content ~= "" then
+ content = dotabs(content,settings)
+ visualize(content,checkedsettings(settings,"direct"))
+ end
+ end
+end
+
+-- not really buffers but it's closely related
+
+function commands.typestring(settings)
+ local content = settings.data
+ if content and content ~= "" then
+ -- content = dotabs(content,settings)
+ visualize(content,checkedsettings(settings,"inline"))
+ end
+end
+
+function commands.typefile(settings)
+ local filename = settings.name
+ local foundname = resolvers.findtexfile(filename)
+ if foundname and foundname ~= "" then
+ local str = resolvers.loadtexfile(foundname)
+ if str and str ~= "" then
+ local regime = settings.regime
+ if regime and regime ~= "" then
+ str = regimes.translate(str,regime)
+ end
+ if str and str~= "" then
+ local lines = splitlines(str)
+ local content, m = filter(lines,settings)
+ if content and content ~= "" then
+ content = dotabs(content,settings)
+ visualize(content,checkedsettings(settings,"display"))
+ end
+ end
+ end
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/buff-ver.mkii b/Master/texmf-dist/tex/context/base/buff-ver.mkii
index e7ad5474f37..3552961010f 100644
--- a/Master/texmf-dist/tex/context/base/buff-ver.mkii
+++ b/Master/texmf-dist/tex/context/base/buff-ver.mkii
@@ -626,7 +626,6 @@
{\let\currenttypingclass\??ty
\initializetype
\verbatimcolor
- %\setcatcodetable \typcatcodesa
\catcode`\{=\@@begingroup
\catcode`\}=\@@endgroup}
diff --git a/Master/texmf-dist/tex/context/base/buff-ver.mkiv b/Master/texmf-dist/tex/context/base/buff-ver.mkiv
index dacbdb7ac99..c8f07ddb4b9 100644
--- a/Master/texmf-dist/tex/context/base/buff-ver.mkiv
+++ b/Master/texmf-dist/tex/context/base/buff-ver.mkiv
@@ -13,157 +13,148 @@
\writestatus{loading}{ConTeXt Buffer Macros / Verbatim}
-%D We can optimize esp the initializations a bit.
+\registerctxluafile{buff-ver}{1.001}
\unprotect
-\ifdefined\startlinenumbering\else \let\startlinenumbering \relax \fi
-\ifdefined\stoplinenumbering \else \let\stoplinenumbering \relax \fi
-\ifdefined\setuplinenumbering\else \unexpanded\def\setuplinenumbering[#1]{} \fi
-
-% D \macros
-% D {iflinepar}
-% D
-% D A careful reader will see that \type{\linepar} is reset.
-% D This boolean can be used to determine if the current line is
-% D the first line in a pseudo paragraph and this boolean is set
-% D after each empty line. The \type{\relax} can be used to
-% D determine the end of the line when one implements a scanner
-% D routine.
-%
-% will become obsolete
-
-\newif\iflinepar
+\definesystemattribute[verbatimline][public]
-% \type{ <crlf> char} geeft bagger
+\appendtoksonce \attribute\verbatimlineattribute \attributeunsetvalue \to \everyforgetall
-%D We are going to embed the general verbatim support macros in
-%D a proper environment. First we show the common setup
-%D macro, so we know what features are supported. The options
-%D are hooked into the support macros via the \type{\obey}
-%D macros.
+%D Initializations.
-\newif\ifslantedtypeactivated
-\newif\ifslantedtypepermitted
+\newtoks\everyinitializeverbatim
-\def\switchslantedtype
- {\ifslantedtypepermitted
- \ifslantedtypeactivated
- \slantedtypeactivatedfalse\tttf
- \else
- \slantedtypeactivatedtrue\ttsl
- \fi
- \fi}
+\appendtoks
+ \the\everyresettypesetting
+ \resetfontfeature
+ \resetcharacterspacing
+\to \everyinitializeverbatim
-\def\prettyidentifier {TEX}
-\def\prettypalet {}
-
-\def\installprettytype
- {\dodoubleargument\doinstallprettytype}
-
-\def\doinstallprettytype[#1][#2]% map #1 onto #2
- {\uppercasestring#1\to\asciia
- \uppercasestring#2\to\asciib
- \setevalue{\??ty\??ty\asciia}{\asciib}}
-
-\unexpanded\def\setupprettiesintype#1%
- {\uppercasestring#1\to\ascii
- \edef\prettyidentifier{\executeifdefined{\??ty\??ty\ascii}{TEX}}%
- \begingroup
- % we can move this to lua
- % \lowercasestring \f!prettyprefix\prettyidentifier\to\filename
- % \doonlyonce\filename{\ctxloadluafile\filename\empty}%
- \ctxlua{buffers.loadvisualizer("\ascii")}%
- \endgroup}
-
-\unexpanded\def\setupprettytype
- {\processingverbatimtrue % will move
- \ctxlua{buffers.visualizers.reset()}}
-
-\def\setverbatimspaceskip
- {\setbox\scratchbox\hbox{x}%
- \spaceskip\wd\scratchbox
+\def\setverbatimspaceskip % to be checked: must happen after font switch
+ {\spaceskip\fontcharwd\font`x\relax
\xspaceskip\spaceskip}
-\let\obeycharacters\relax % tab mess can go
+\unexpanded\def\specialcontrolspace{\hskip\zeropoint\fastcontrolspace\hskip\zeropoint}
\setvalue{\??tp:\c!lines:\v!yes }{\obeybreakpoints}
\setvalue{\??tp:\c!lines:\v!hyphenated}{\obeyhyphens}
-%setvalue{\??tp:\c!empty:\v!yes }{\obeyemptylines}
-%setvalue{\??tp:\c!empty:\v!all }{\obeyallemptylines}
-
-\setvalue{\??tp:\c!option:\v!none }{\let\obeycharacters\relax}
-\setvalue{\??tp:\c!option:\empty }{\let\obeycharacters\relax}
-\setvalue{\??tp:\c!option:\v!color }{\setupprettiesintype{\typingparameter\c!option}%
- \let\obeycharacters\setupprettytype}
-\setvalue{\??tp:\c!option:\v!normal }{\let\obeycharacters\setupgroupedtype}
-\setvalue{\??tp:\c!option:\v!slanted }{\let\obeycharacters\setupslantedtype}
-\setvalue{\??tp:\c!option:\s!unknown }{\setupprettiesintype{\typingparameter\c!option}%
- \let\obeycharacters\setupprettytype}
-%setvalue{\??tp:\c!option:\v!commands }{\def\obeycharacters{\setupcommandsintype}}
-
-\def\dosetverbatimfont
- {\redoconvertfont\dosetfontattribute{\currenttypingclass\currenttyping}\c!style
- \normalnoligatures\font}
-
-\unexpanded\def\setupcommonverbatim
- {\let\prettyidentifier\s!default
- %
- \def\prettyidentifierfont{\typingparameter\c!icommand}%
- \def\prettyvariablefont {\typingparameter\c!vcommand}%
- \def\prettynaturalfont {\typingparameter\c!ccommand}%
- %
- \ignorehyphens % default
- \getvalue{\??tp:\c!lines:\typingparameter\c!lines}%
- \getvalue{\??tp:\c!empty:\typingparameter\c!empty}%
- \getvalue{\??tp:\c!option:\ifcsname\??tp:\c!option:\typingparameter\c!option\endcsname\typingparameter\c!option\else\s!unknown\fi}%
- \setupverbatimcolor}
-
-\newtoks \everyinitializeverbatim
-
-\def\ignorebeginofpretty [#1]{}
-\def\ignoreendofpretty {}
-
-\def\doverbatimbop{\bgroup\beginofpretty}
-\def\doverbatimeop{\endofpretty\egroup}
-\def\doverbatimsop{\endofpretty\egroup\bgroup\beginofpretty}
-
-\let\noverbatimbop\ignorebeginofpretty
-\let\noverbatimeop\ignoreendofpretty
-\let\noverbatimsop\ignorebeginofpretty
-
-\def\doinitializeverbatim % todo: combine all in one call is faster
- {\ctxlua{buffers.visualizers.reset()}%
- \doifelse{\typingparameter\c!space}\v!on
- {\let\obs\fastcontrolspace}%
- {\let\obs\specialobeyedspace}%
- \edef\askedverbatimtab{\typingparameter\c!tab}%
- \doifelse\askedverbatimtab\v!no
- {\ctxlua{buffers.settablength(1)}}
- {\doifnumberelse{\askedverbatimtab}
- {\ctxlua{buffers.settablength(\askedverbatimtab)}}
- {\ctxlua{buffers.settablength()}}}%
- \ctxlua{buffers.doifelsevisualizer("\prettyidentifier")}
- {\ctxlua{buffers.setvisualizer("\prettyidentifier")}%
- \let\bop\doverbatimbop
- \let\eop\doverbatimeop
- \let\sop\doverbatimsop}%
- {\ctxlua{buffers.setvisualizer("\v!typing")}% or resetdefaultvisualizer
- \let\bop\noverbatimbop
- \let\eop\noverbatimeop
- \let\sop\noverbatimsop}%
+\setvalue{\??tp:\c!space:\v!on }{\let\obeyedspace\specialcontrolspace}
+\setvalue{\??tp:\c!space:\v!stretch }{\let\obeyedspace\specialstretchedspace}
+\setvalue{\??tp:\c!space:\v!normal }{}
+\setvalue{\??tp:\c!space:\v!fixed }{\let\obeyedspace\specialfixedspace}
+
+\setvalue{\??tp:\c!blank:\v!standard }{\ctxparskip}
+\setvalue{\??tp:\c!blank:\v!small }{\smallskipamount}
+\setvalue{\??tp:\c!blank:\v!medium }{\medskipamount}
+\setvalue{\??tp:\c!blank:\v!big }{\bigskipamount}
+\setvalue{\??tp:\c!blank:\v!halfline }{.5\baselineskip}
+\setvalue{\??tp:\c!blank:\v!line }{\baselineskip}
+\setvalue{\??tp:\c!blank:\v!none }{\zeropoint}
+
+\def\secondstageinitializetype
+ {\let\obeyedspace\specialobeyedspace
+ \csname\??tp:\c!space:\typeparameter\c!space\endcsname
\relax\the\everyinitializeverbatim\relax}
+\def\secondstageinitializetyping
+ {\let\obeyedspace\specialobeyedspace
+ \csname\??tp:\c!space:\typingparameter\c!space\endcsname
+ \csname\??tp:\c!lines:\typingparameter\c!lines\endcsname
+ \relax\the\everyinitializeverbatim\relax}
+
+\def\firststageinitializetype
+ {\let\obeylines\ignorelines
+ \ignorehyphens % default
+ \dosettypeattributes\c!style\c!color
+ \setcatcodetable\vrbcatcodes}
+
+\let\doverbatimsetlinemargin\relax
+
+\def\dodoverbatimsetlinemargin
+ {\getpagestatus
+ \ifrightpage
+ \hskip\typingparameter\c!oddmargin\relax
+ \else
+ \hskip\typingparameter\c!evenmargin\relax
+ \fi}
+
+\def\docheckverbatimmargins
+ {\scratchskip\typingparameter\c!oddmargin\relax
+ \ifzeropt\scratchskip
+ \else
+ \let\doverbatimsetlinemargin\dodoverbatimsetlinemargin
+ \fi
+ \scratchskip\typingparameter\c!evenmargin\relax
+ \ifzeropt\scratchskip
+ \else
+ \let\doverbatimsetlinemargin\dodoverbatimsetlinemargin
+ \fi
+ \ifx\doverbatimsetlinemargin\relax
+ \doadaptleftskip{\typingparameter\c!margin}%
+ \fi}
+
+\def\firststageinitializetyping
+ {\switchtobodyfont[\typingparameter\c!bodyfont]%
+ \docheckverbatimmargins
+ \dosettypingattributes\c!style\c!color
+ \doifsomething{\typingparameter\c!align}{\setupalign[\typingparameter\c!align]}%
+ \ignorehyphens} % default
+
+%D \macros
+%D {definetype,setuptype}
+%D
+%D Specific inline verbatim commands can be defined with the
+%D following command.
+
+\installcommandhandler{\??ty}{type}{\??ty}
+
\appendtoks
- \resetfontfeature
- \resetcharacterspacing
-\to \everyinitializeverbatim
+ \normalexpanded{\dodefinetype{\currenttype}}%
+\to \everydefinetype
-% BEWARE: the noligatures will globally change the verbatim font's behaviour
+\unexpanded\def\dodefinetype#1%
+ {\setuvalue{#1}{\dotype{#1}}}
+
+\appendtoks
+ \doinitializevisualizer{\typeparameter\c!option}%
+\to \everysetuptype
+
+%D \macros
+%D {definetyping,setuptyping}
+%D
+%D For most users the standard \type{\start}||\type{\stop}||pair
+%D will suffice, but for documentation purposes the next
+%D definition command can be of use:
+%D
+%D \starttyping
+%D \definetyping[extratyping][margin=3em]
+%D
+%D \startextratyping
+%D these extra ones are indented by 1 em
+%D \stopextratyping
+%D \stoptyping
+%D
+%D The definitions default to the standard typing values.
+
+\installcommandhandler{\??tp}{typing}{\??tp}
+
+\appendtoks
+ \normalexpanded{\dodefinetyping{\currenttyping}}%
+\to \everydefinetyping
+
+\unexpanded\def\dodefinetyping#1%
+ {\setvalue{\e!start#1}{\dostarttyping{#1}}%
+ \setvalue{\e!stop #1}{\dostoptyping {#1}}}
+
+\appendtoks
+ \doinitializevisualizer{\typingparameter\c!option}% we can check at the tex end
+\to \everysetuptyping
+
+\def\doinitializevisualizer#1%
+ {\ifproductionrun\ctxlua{visualizers.load("#1")}\fi}
-% test case:
-%
% \definetype[typeTEX][option=tex]
%
% \typeTEX|\example---oeps|. this---ligates---again.
@@ -210,33 +201,9 @@
%D
%D \typebuffer \start \getbuffer \stop
-\unexpanded\def\setupcommandsintype
- {\ctxlua{buffers.set_escape("\currenttyping",\!!bs\typingparameter\c!escape\!!es)}}
-
-\appendtoks
- \setupcommandsintype
-\to \everyinitializeverbatim
-
-\unexpanded\def\setupslantedtype
- {\slantedtypepermittedtrue}
-
-\ifx\setupprettytype \undefined \let\setupprettytype \relax \fi
-\ifx\setupslantedtype \undefined \let\setupslantedtype \relax \fi
-\ifx\setupgroupedtype \undefined \let\setupgroupedtype \relax \fi
-\ifx\normalnoligatures\undefined \let\normalnoligatures\gobbleoneargument \fi
-
-%D The verbatim commands have a rather long and turbulent
-%D history. Most users of \CONTEXT\ probably will never use
-%D some of the features, but I've kept in mind that when one is
-%D writing a users manual, about everything can and undoubtly
-%D will be subject to a verbatim treatment.
-%D
%D Verbatim command are very sensitive to argument processing,
%D which is a direct result of the \CATCODES\ being fixed at
-%D reading time. With our growing understanding of \TEX,
-%D especially of the mechanism that can be used for looking
-%D ahead and manipulating \CATCODES, the verbatim support
-%D became more and more advanced and natural.
+%D reading time.
%D
%D Typesetting inline verbatim can be accomplished by
%D \type{\type}, which in this sentence was typeset by saying
@@ -253,14 +220,11 @@
%D \type{<<} and \type{>>} as delimiters. This alternative can
%D be used in situations where slanted typeseting is needed.
-% todo: we can use \letter... here:
-
\def\lesscharacter {<}
\def\morecharacter {>}
-
-\chardef\texescape = `\\
-\chardef\leftargument = `\{
-\chardef\rightargument = `\}
+\let\texescape \textbackslash
+\let\leftargument \textbraceleft
+\let\rightargument \textbraceright
%D \macros
%D {type}
@@ -268,17 +232,17 @@
%D We define \type{\type} as a protected command. This command
%D has several invocations: grouped, wirt boundary characters,
%D and with font switches.
-
-% \starttyping
-% normal: \par \type{xx<<..xx..<<xx <<xx>> >>..>>xx} \par \type<<....>> \par \type<<..<<xx>>..>> \par
-% normal: \par \type{xx<..xx..<xx <slanted> >..>xx} \par \type{<....>} \par \type{<..<xx>..>}
-% \setuptype[option=slanted]
-% slanted: \par \type{xx<<..sl..<<xx <<sl>> xx>>..sl..>>xx} \par \type<<..xx..>> \par \type<<..<<sl>>..>> \par
-% slanted: \par \type{xx<<..sl..<xx <sl> xx>..sl..>>xx} \par \type<<..xx..>> \par \type<<..<sl>..>> \par
-% \setuptype[option=none]
-% none: \par \type{xx<<..xx..<<xx <<xx>> >>..>>xx} \par \type<<....>> \par \type<<..<<xx>>..>> \par
-% \stoptyping
-
+%D
+%D \starttyping
+%D normal: \par \type{xx<<..xx..<<xx <<xx>> >>..>>xx} \par \type<<....>> \par \type<<..<<xx>>..>> \par
+%D normal: \par \type{xx<..xx..<xx <slanted> >..>xx} \par \type{<....>} \par \type{<..<xx>..>}
+%D \setuptype[option=slanted]
+%D slanted: \par \type{xx<<..sl..<<xx <<sl>> xx>>..sl..>>xx} \par \type<<..xx..>> \par \type<<..<<sl>>..>> \par
+%D slanted: \par \type{xx<<..sl..<xx <sl> xx>..sl..>>xx} \par \type<<..xx..>> \par \type<<..<sl>..>> \par
+%D \setuptype[option=none]
+%D none: \par \type{xx<<..xx..<<xx <<xx>> >>..>>xx} \par \type<<....>> \par \type<<..<<xx>>..>> \par
+%D \stoptyping
+%D
%D When writing the manual to \CONTEXT\ and documenting this
%D source we needed to typeset \type{<<} and \type{>>}. Because
%D we wanted to do this in the natural way, we've adapted the
@@ -287,7 +251,7 @@
%D further and treats the lone \type{<<} and \type{>>} a bit
%D different. The \type {\null} prevents ligatures, which
%D unfortunately turn up in Lucida fonts.
-
+%D
%D The following lines show what happens when we set
%D \type {option=commands}.
%D
@@ -306,120 +270,110 @@
%D
%D \typebuffer
+% beware, the command is supposed to do something like
+% \framed and not manipulate content i.e. it gets no
+% argument but something b/egrouped instead
+%
+% so, if we only had left and right it woul dbe:
+%
+% \def\doleftoftype {\typeparameter\c!left\bgroup} % we need the grouping in order
+% \def\dorightoftype{\egroup\typeparameter\c!right} % to get the normal font
+%
+% but with command:
+
+\def\doleftoftype {\typeparameter\c!left\typeparameter\c!command\bgroup}
+\def\dorightoftype{\egroup\typeparameter\c!right}
+
\unexpanded\def\type{\dotype\empty}
+\unexpanded\def\typ {\dotyp \empty}
-\def\dotype#1% was \dotype
- {\dontleavehmode \bgroup
- % new, \strut enables leading space in \type { abc } at par start / begstrut
- % else no hyphenation (replaced by \dontleavehmode which saves unboxing)
- % \begstrut
- \let\currenttypingclass\??ty
- \edef\currenttyping{#1}%
- \catcode`\<=\@@other
- \catcode`\>=\@@other
- \futurelet\next\dodotype}
+\def\dotype#1%
+ {\dontleavehmode
+ \bgroup
+ \edef\currenttype{#1}%
+ \doifnextoptionalelse\redotype\dodotype}
+
+\def\redotype[#1]%
+ {\getparameters[\??ty\currenttype][#1]%
+ \dodotype}
\def\dodotype
+ {\doleftoftype
+ \futurelet\next\dodotypeone}
+
+\def\dotyp#1%
+ {\dontleavehmode
+ \bgroup
+ \edef\currenttype{#1}%
+ \lettypeparameter\v!lines\v!hyphenated
+ \let\specialobeyedspace\specialstretchedspace
+ \doifnextoptionalelse\redotype\dodotype}
+
+\def\dodotypeone
{\ifx\next\bgroup
\@EA\dodotypeA
\else
- \@EA\dodotypeAD
+ \@EA\dodotypetwo
\fi}
-\def\dodotypeAD
+\def\dodotypetwo
+ {\catcode`<=\othercatcode % old precaution
+ \catcode`>=\othercatcode % old precaution
+ \futurelet\next\dodotypethree}
+
+\def\dodotypethree
{\if\next<%
- \doifelse{\typingparameter\c!option}\v!none{\@EA\dodotypeB}{\@EA\dodotypeC}%
+ \@EA\dodotypeB
\else
- \@EA\dodotypeD
+ \@EA\dodotypeC
\fi}
\def\dodotypeA
- {\initializetype % probably too much
- \verbatimcolor
- \dosetverbatimfont
- \setcatcodetable \typcatcodesa
- \dodotypeAA}
-
-\def\dodotypeAA#1%
- {\doinitializeverbatim
- \def\obs{\obeyedspace}%
- \ctxlua{buffers.hooks.flush_inline(\!!bs\detokenize{#1}\!!es)}%
- \egroup}
+ {\firststageinitializetype
+ \setcatcodetable\tpacatcodes
+ \dodotypenormal}
\def\dodotypeB#1%
- {\initializetype
- \verbatimcolor
- \dosetverbatimfont
- \setcatcodetable \typcatcodesb
- \dodotypeBB}
-
-\def\dodotypeBB#1%
- {\doinitializeverbatim
- \ctxlua{buffers.visualizers.flush_nested(\!!bs\detokenize{#1}\!!es,false)}%
- \egroup
- \gobbleoneargument} % grab last >
+ {\firststageinitializetype
+ \setcatcodetable\tpbcatcodes
+ \dodotypenested}
\def\dodotypeC#1%
- {\initializetype
- \verbatimcolor
- \dosetverbatimfont
- \setcatcodetable \typcatcodesb
- \dodotypeCC}
-
-\def\dodotypeCC#1%
- {\doinitializeverbatim
- \ifx\obeycharacters\setupprettytype % temp hack, we need a proper signal
- \ctxlua{buffers.hooks.flush_inline([\!!bs\detokenize{#1}\!!es,true)}%
- \else
- \def\obs{\obeyedspace}%
- \ctxlua{buffers.visualizers.flush_nested(\!!bs\detokenize{#1}\!!es,true)}%
- \fi
- \egroup
- \gobbleoneargument} % grab last >
+ {\firststageinitializetype
+ \setcatcodetable\vrbcatcodes
+ \def\next##1#1{\dodotypenormal{##1}}%
+ \next}
+
+\def\dodotypenormal#1%
+ {\secondstageinitializetype
+ \dostarttagged\t!verbatim\currenttype
+ \ctxcommand{typestring {
+ data = \!!bs\detokenize{#1}\!!es,
+ tab = "\typeparameter\c!tab",
+ method = "\typeparameter\c!option",
+ nature = "inline",
+ }}%
+ \dostoptagged
+ \dorightoftype
+ \egroup}
-\def\dodotypeD#1%
- {\initializetype
- \verbatimcolor
- \dosetverbatimfont
- \setcatcodetable \typcatcodesa
- \def\dodotypeDD##1#1{\dodotypeAA{##1}}%
- \dodotypeDD}
-
-\def\dodotypeDD#1%
- {\doinitializeverbatim
- \ctxlua{buffers.hooks.flush_inline(\!!bs\detokenize{#1}\!!es,true)}%
+\def\dodotypenested#1%
+ {\secondstageinitializetype
+ \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",
+ }}%
+ \dostoptagged
+ \dorightoftype
\egroup
\gobbleoneargument} % grab last >
-%D The neccessary initializations are done by calling
-%D \type{\initializetype} which in return calls for the support
-%D macro \type{\setupinlineverbatim}.
-
-\def\initializetype
- {\let\obeylines\ignorelines
- \setupcommonverbatim
- %\dosetverbatimfont
- %\setverbatimspaceskip
- %\setupcopyverbatim % not needed
- \setcatcodetable\vrbcatcodes}
-
-%D \macros
-%D {setuptype}
-%D
-%D Some characteristics of \type{\type} can be set up by:
-
-\unexpanded\def\setuptype
- {\dodoubleempty\dosetuptype}
-
-\def\dosetuptype[#1][#2]%
- {\ifsecondargument
- \getparameters[\??ty#1][#2]%
- \else
- \getparameters[\??ty][#1]%
- \fi}
-
%D \macros
-%D {typ,obeyhyphens,obeybreakpoints}
+%D {obeyhyphens,obeybreakpoints}
%D
%D Although it's not clear from the macros, one character
%D trait of this macros, which are build on top of the support
@@ -428,11 +382,13 @@
%D works all right, but a decent hyphenation support of
%D \type{\tt} text will be implemented soon.
-\def\specialobeyedspace {\hskip\interwordspace\relax} % better than spaceskip
-\def\specialcontrolspace{\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint\relax}
+\def\specialfixedspace {\kern\interwordspace\relax}
+\def\specialobeyedspace {\hskip\interwordspace\relax} % better than spaceskip
+\def\specialstretchedspace{\hskip.5\interwordspace\!!plus.125\interwordstretch\relax} % more but not less
+\def\specialcontrolspace {\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint\relax}
\def\obeyhyphens
- {\let\obeyedspace \specialobeyedspace
+ {\let\obeyedspace \specialobeyedspace % maybe \specialstretchedspace
\let\controlspace\specialcontrolspace
\spaceskip.25em\relax} % hm a bit of stretch !
@@ -446,11 +402,6 @@
\let\controlspace\specialcontrolspace
\spaceskip.5em\relax}
-\unexpanded\def\typ
- {\bgroup
- \let\@@tylines\v!hyphenated
- \futurelet\next\dodotype}
-
%D \macros
%D {tex,arg,mat,dis}
%D
@@ -461,38 +412,11 @@
%D but we've decided not to use that slow and sometimes
%D troublesome solution. Instead we stick to some 'old'
%D \CONTEXT\ macros for typesetting typical \TEX\ characters.
-%D
-%D The next implementation is more clear but less versatile,
-%D so we treated it for a beter one.
-%D
-%D \starttyping
-%D \def\dospecialtype#1#2%
-%D {\bgroup
-%D \initializetype
-%D \catcode`\{=\@@begingroup
-%D \catcode`\}=\@@endgroup
-%D \def\dospecialtype%
-%D {\def\dospecialtype{#2\egroup}%
-%D \bgroup
-%D \aftergroup\dospecialtype
-%D #1}%
-%D \afterassignment\dospecialtype
-%D \let\next=}
-%D
-%D \unexpanded\def\tex{\dospecialtype\texescape\relax}
-%D \unexpanded\def\arg{\dospecialtype\leftargument\rightargument}
-%D \unexpanded\def\mat{\dospecialtype\$\$}
-%D \unexpanded\def\dis{\dospecialtype{\$\$}{\$\$}}
-%D \stoptyping
\def\setgroupedtype
- {\let\currenttypingclass\??ty
- \initializetype
- \verbatimcolor
- \dosetverbatimfont
- %\setcatcodetable \typcatcodesa
- \catcode`\{=\@@begingroup
- \catcode`\}=\@@endgroup}
+ {\firststageinitializetype
+ \catcode\leftbraceasciicode \begingroupcatcode
+ \catcode\rightbraceasciicode\endgroupcatcode}
\unexpanded\def\tex{\groupedcommand{\setgroupedtype\texescape}{\relax}}
\unexpanded\def\arg{\groupedcommand{\setgroupedtype\leftargument}{\rightargument}}
@@ -504,118 +428,17 @@
\let\normaltextmat\mat
\let\normaltextdis\dis
-\def\astype
- {\groupedcommand\dorawtype\relax}
-
-\def\dorawtype
- {\let\currenttypingclass\??ty
- \normalverbatimcolor % \verbatimcolor
- \dosetverbatimfont}
-
-%D \macros
-%D {starttyping}
-%D
-%D Display verbatim is realized far more easy, which is mostly
-%D due to the fact that we use \type{\stop...} as delimiter.
-%D The implementation inherits some features, for instance the
-%D support of linenumbering, which can best be studied in the
-%D documented support module.
-
-\let\currenttyping \empty
-\let\currenttypingclass\??ty % saveguard
-
-\def\typingparameter#1%
- {\ifcsname\currenttypingclass\currenttyping#1\endcsname
- \csname\currenttypingclass\currenttyping#1\endcsname
- \else\ifcsname\currenttypingclass#1\endcsname
- \csname\currenttypingclass#1\endcsname
- \fi\fi}
-
-\def\settypingparameter#1#2%
- {\setvalue{\currenttypingclass\currenttyping#1}{#2}}
-
-\def\setxtypingparameter#1#2%
- {\setxvalue{\currenttypingclass\currenttyping#1}{#2}}
-
-\setvalue{\??tp:\c!blank:\v!standard}{\ctxparskip}
-\setvalue{\??tp:\c!blank:\v!small }{\smallskipamount}
-\setvalue{\??tp:\c!blank:\v!medium }{\medskipamount}
-\setvalue{\??tp:\c!blank:\v!big }{\bigskipamount}
-\setvalue{\??tp:\c!blank:\v!halfline}{.5\baselineskip}
-\setvalue{\??tp:\c!blank:\v!line }{\baselineskip}
-\setvalue{\??tp:\c!blank:\v!none }{\zeropoint}
-
-\def\doopenupverbatimlineindeed
- {\getpagestatus
- \ifrightpage
- \hskip\typingparameter\c!oddmargin\relax
- \else
- \hskip\typingparameter\c!evenmargin\relax
- \fi}
-
-\def\initializetyping
- {%\donefalse
- \switchtobodyfont[\typingparameter\c!bodyfont]%
- \donefalse
- \scratchskip\typingparameter\c!oddmargin\relax
- \ifzeropt\scratchskip\else\donetrue\fi
- \scratchskip\typingparameter\c!evenmargin\relax
- \ifzeropt\scratchskip\else\donetrue\fi
- \ifdone
- \let\doopenupverbatimline\doopenupverbatimlineindeed
- \else
- \doadaptleftskip{\typingparameter\c!margin}%
- \fi
- % no symbolic blanks !
- \edef\!!stringa{\executeifdefined{\??bo\typingparameter\c!blank}{\typingparameter\c!blank}}%
- \scratchskip\executeifdefined{\??tp:\c!blank:\!!stringa}\!!stringa\relax
- \ifgridsnapping
- % this will be adapted
- \ifdim\scratchskip=.5\baselineskip\relax
- \edef\verbatimbaselineskip{\the\scratchskip}% new
- \else
- \edef\verbatimbaselineskip{\the\baselineskip}%
- \fi
- \else
- \edef\verbatimbaselineskip{\the\scratchskip}%
- \fi
-\doifsomething{\typingparameter\c!align}{\setupalign[\typingparameter\c!align]}%
- \setupcommonverbatim}
+\def\astype{\groupedcommand{\dosettypeattributes\c!style\c!color}{}}
%D The basic display verbatim commands are defined in an
%D indirect way. As we will see, they are a specific case of a
%D more general mechanism.
-\newif\ifoptimizeverbatim \optimizeverbatimtrue
-
-\let \beginofverbatimlines \relax
-\let \endofverbatimlines \relax
-
-\def\doverbatimnobreak
- {\ifoptimizeverbatim\penalty500 \fi}
-
-\def\doverbatimgoodbreak
- {\ifoptimizeverbatim\penalty\linepenalty\fi}
-
-% \def\doflushverbatimline
-% {\expandafter\dodoverbatimline\expandafter{\savedverbatimline}}
-% \def\doverbatimbeginofline#1% linenumber (optional provided by mkiv / todo)
-% {\dontleavehmode
-% \strut
-% \the\everyline}
-% \def\doverbatimendofline
-% {\par}
-% \def\doverbatimemptyline
-% {\strut
-% \par}
-% \let\handleverbatimline=\relax
-
-% we need this hack because otherwise verbatim skips
-% the first line (everything after the initial command)
+\let\beginofverbatimlines\relax
+\let\endofverbatimlines \relax
\def\dostarttyping#1% tricky non standard lookahead
{\bgroup
- \let\currenttypingclass\??tp
\edef\currenttyping{#1}%
\obeylines
\futurelet\nexttoken\dodostarttyping}
@@ -630,36 +453,40 @@
\def\nododostarttyping
{\dododostarttyping[]}
-\def\dotypefileverbatim
- {\doinitializeverbatim
- \beginofverbatimlines
- \ctxlua{buffers.typefile("\readfilename","\typingparameter\c!strip","\typingparameter\c!range")}%
- \endofverbatimlines}
-
-\def\dotypefilelinesverbatim#1#2%
- {#1\dotypefileverbatim#2}
+\def\dododostarttyping[#1]%
+ {\typingparameter\c!before
+ \startpacked[\v!blank]
+ \doifassignmentelse{#1}
+ {\setuptyping[\currenttyping][#1]}
+ {\doifinset\v!continue{#1}{\setuptyping[\currenttyping][\c!continue=\v!yes]}}%
+ \dosetuptypelinenumbering
+ \firststageinitializetyping
+ \normalexpanded{\dotypeblockverbatim{\e!start\currenttyping}{\e!stop\currenttyping}}}
\unexpanded\def\dotypeblockverbatim#1#2%
- {\dowithbuffer{_typing_}{#1}{#2}
- {}
- {\doinitializeverbatim
- \beginofverbatimlines
- \ctxlua{buffers.type("_typing_","\typingparameter\c!strip","\typingparameter\c!range")}%
- \endofverbatimlines
- \csname#2\endcsname}}
+ {\dowithbuffer{_typing_}{#1}{#2}{}{\dodotypeblockverbatim{#1}{#2}}}
-\def\dododostarttyping[#1]%
- {\typingparameter\c!before
- \startpacked % includes \bgroup
- \dosetuptypelinenumbering{#1}%
- \initializetyping
- \dosetverbatimfont
- \startverbatimcolor
- \normalexpanded{\dotypeblockverbatim{\e!start\currenttyping}{\e!stop\currenttyping}}} % was s!start
+\def\dodotypeblockverbatim#1#2%
+ {\secondstageinitializetyping
+ \dostarttagged\t!verbatimblock\currenttyping
+ \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",
+ }}%
+ \dostoptagged
+ \endofverbatimlines
+ \dostoptagged
+ \csname#2\endcsname}
\def\dostoptyping#1% hm, currenttyping
- {\stopverbatimcolor
- \stoppacked % includes \egroup
+ {\stoppacked
\typingparameter\c!after
\normalexpanded{\egroup\checknextindentation[\typingparameter\c!indentnext]}%
\dorechecknextindentation}
@@ -700,8 +527,7 @@
%D
%D \starttext
%D
-%D % \typefile[file][range={3,6}]{whatever.tex}
-%D
+%D % \typefile[file][range={3,6}] {whatever.tex}
%D % \typefile[file][range={3,+2}]{whatever.tex}
%D
%D \typefile[file][range={label:start:one,label:stop:one}]{whatever.tex}
@@ -710,128 +536,6 @@
%D \stoptyping
%D \macros
-%D {setuptyping}
-%D
-%D The setup of typing accepts two arguments. The optional
-%D first one identifies the user defined ones. If only one
-%D argument is given, the values apply to both the standard
-%D command \type{\starttyping} and \type{\typefile}.
-
-\def\dosetuptyping[#1][#2]%
- {\ifsecondargument
- \getparameters[\??tp#1][#2]%
- \else
- \getparameters[\??tp][#1]%
- \fi}
-
-\unexpanded\def\setuptyping
- {\dodoubleempty\dosetuptyping}
-
-%D \macros
-%D {definetype}
-%D
-%D Specific inline verbatim commands can be defined with the
-%D following command.
-
-\unexpanded\def\definetype
- {\dodoubleempty\dodefinetype}
-
-\def\dodefinetype[#1][#2]%
- {\setuvalue{#1}{\dotype{#1}}%
- \getparameters[\??ty#1][#2]}
-
-%D \macros
-%D {definetyping}
-%D
-%D For most users the standard \type{\start}||\type{\stop}||pair
-%D will suffice, but for documentation purposes the next
-%D definition command can be of use:
-%D
-%D \starttyping
-%D \definetyping[extratyping][margin=3em]
-%D
-%D \startextratyping
-%D these extra ones are indented by 1 em
-%D \stopextratyping
-%D \stoptyping
-%D
-%D The definitions default to the standard typing values.
-
-% TODO: parent etc !
-
-\def\presettyping[#1][#2]% brrr also use parent here
- {\copyparameters[\??tp#1][\??tp][\c!color,\c!style]%
- \getparameters [\??tp#1][#2]}
-
-\def\dodefinetyping[#1][#2]%
- {\setvalue{\e!start#1}{\dostarttyping{#1}}%
- \setvalue{\e!stop #1}{\dostoptyping {#1}}%
- \presettyping[#1][#2]}
-
-\unexpanded\def\definetyping
- {\dodoubleempty\dodefinetyping}
-
-%D We can use some core color commands. These are faster than
-%D the standard color switching ones and work ok on a line by
-%D line basis.
-%D
-%D \starttyping
-%D \unexpanded\def\setupverbatimcolor%
-%D {\edef\prettypalet{\prettyidentifier\typingparameter\c!palet}%
-%D \def\beginofpretty[##1]{\startcolormode{\prettypalet:##1}}%
-%D \def\endofpretty {\stopcolormode}}
-%D \stoptyping
-%D
-%D Since we support a global color too, the folowing
-%D definition is better:
-
-\def\normalbeginofpretty [#1]{\startcolor[\prettypalet:#1]}%
-\def\normalendofpretty {\stopcolor}
-\def\normalstartverbatimcolor{\startcolor[\typingparameter\c!color]}%
-\def\normalstopverbatimcolor {\stopcolor}
-\def\normalverbatimcolor {\getvalue{\typingparameter\c!color}}% command !
-
-\unexpanded\def\setupnormalprettyverbatim
- {\edef\prettypalet{\prettyidentifier\prettypalet}%
- \let\beginofpretty \normalbeginofpretty
- \let\endofpretty \normalendofpretty
- \let\startverbatimcolor\normalstartverbatimcolor
- \let\stopverbatimcolor \normalstopverbatimcolor
- \let\verbatimcolor \normalverbatimcolor}
-
-\unexpanded\def\setupignoreprettyverbatim
- {\let\prettypalet \empty
- \let\beginofpretty \ignorebeginofpretty
- \let\endofpretty \ignoreendofpretty
- \let\startverbatimcolor\normalstartverbatimcolor
- \let\stopverbatimcolor \normalstopverbatimcolor
- \let\verbatimcolor \normalverbatimcolor}
-
-\unexpanded\def\setupverbatimcolor
- {\edef\prettypalet{\typingparameter\c!palet}%
- \ifx\prettypalet\empty
- \setupignoreprettyverbatim
- \else
- \setupnormalprettyverbatim
- \fi}
-
-\let\beginofpretty \ignorebeginofpretty
-\let\endofpretty \ignoreendofpretty
-\let\prettypalet \empty
-\let\startverbatimcolor\relax
-\let\stopverbatimcolor \relax
-\let\verbatimcolor \relax
-
-%D \macros
-%D {EveryPar, EveryLine, iflinepar}
-%D
-%D One of the features of these commands is the support of
-%D \type{\EveryPar}, \type{\EveryLine} and \type{\iflinepar}.
-%D In the documentation of the verbatim support module we give
-%D some examples of line- and paragraph numbering using these
-%D macros.
-
-%D \macros
%D {typefile}
%D
%D Typesetting files verbatim (for the moment) only supports
@@ -839,118 +543,95 @@
%D setup values are inherited from display verbatim.
%D The implementation of \type{\typefile} is straightforward:
-% new feature (not yet 100\% ok)
-%
-% \setuptyping[file][numbering=file]
-%
-% \typefile[start=2,nlines=3]{zapf}
-% \typefile[start=continue,nlines=13]{zapf}
-% \typefile{zapf}
-%
-% \setuptyping[file][numbering=line]
-%
-% \typefile[start=4,step=3]{zapf}
-% \typefile{zapf}
+% [category] [settings] {name} % for historic reasons, all filenames are {}
\def\typefile
{\dodoubleempty\dotypefile}
\def\dotypefile[#1][#2]#3%
- {\ifsecondargument
- \dodotypefile[#1][#2]{#3}%
+ {\bgroup
+ \ifsecondargument
+ \setuptyping[#1][#2]%
+ \dododotypefile{#1}{#3}%
\else\iffirstargument
\doifassignmentelse{#1}
- {\dodotypefile[\v!file][#1]{#3}}
- {\dodotypefile[#1][]{#3}}%
+ {\setuptyping[\v!file][#1]
+ \dododotypefile\v!file{#3}}
+ {\dododotypefile{#1}{#3}}%
\else
- \dodotypefile[\v!file][]{#3}%
- \fi\fi}
-
-\def\dosetuptypelinenumbering#1% fuzzy
- {%\ifcsname\currenttypingclass\currenttyping\c!start\endcsname \else
- % \setuptyping[\currenttyping][\c!start=1,\c!stop=,\c!step=1,\c!continue=\v!no,\c!nlines=]%
- %\fi
- \doifassignmentelse{#1}{\setuptyping[\currenttyping][#1]}\donothing
- \doifelse{\typingparameter\c!numbering}\v!file
- {% kind of special: filters lines !
- \setuplinenumbering[\currenttyping][\c!method=\v!file]%
- \donetrue}
- {\doifelse{\typingparameter\c!numbering}\v!line
- {\doifinset\v!continue{#1}{\setuptyping[\currenttyping][\c!continue=\v!yes]}% fails: \settypingparameter\c!continue{\v!yes}
- \donetrue}
- {\donefalse}}%
- \ifdone
- \edef\beginofverbatimlines{\noexpand\startlinenumbering
- [\currenttyping]%
- [\c!continue=\typingparameter\c!continue,
- \c!method=\v!type,
- \c!start=\typingparameter\c!start,
- \c!stop=\typingparameter\c!stop, % ?
- \c!step=\typingparameter\c!step]%
- }%
- \def\endofverbatimlines{\stoplinenumbering}%
- \fi}
-
-\def\reporttypingerror#1% temp hack
- {\blank
- \dontleavehmode\hbox\bgroup
- \expanded{\defconvertedargument\noexpand\ascii{#1}}%
- \tttf[\makemessage\m!verbatims1\ascii]%
- \showmessage\m!verbatims1\ascii
- \egroup
- \blank}
-
-\def\dosometyping#1#2#3#4#5%
- {\bgroup
- \let\currenttypingclass\??tp
- \edef\currenttyping{#1}%
- \typingparameter\c!before
- \startpacked % includes \bgroup
- \dosetuptypelinenumbering{#2}%
- \doifinset{\typingparameter\c!option}{\v!commands,\v!slanted,\v!normal}
- {\setuptyping[#1][\c!option=\v!none]}%
- \doif{\typingparameter\c!option}\v!color
- {\expandafter\aftersplitstring#3\at.\to\prettyidentifier
- \settypingparameter\c!option{\prettyidentifier}}%
- \initializetyping
- \dosetverbatimfont
- \startverbatimcolor
- \scratchcounter
- \ifcsname\currenttypingclass#3\v!global\c!start\endcsname
- \numexpr\csname\currenttypingclass#3\v!global\c!start\endcsname+\plusone\relax
- \else
- \plusone
- \fi
- \setxvalue{\currenttypingclass#3\v!global\c!start}{\the\scratchcounter}% no direct setxvalue as it defines beforehand
- \doifelsenothing{\typingparameter\c!start}
- {#4}
- {\doif{\typingparameter\c!start}\v!continue
- {\setevalue{\currenttypingclass#1\c!start}%
- {\getvalue{\currenttypingclass#3\v!global\c!start}}}%
- \doifelsenothing{\typingparameter\c!stop}
- {\doifelsenothing{\typingparameter\c!nlines}
- {#4}
- {\setxvalue{\currenttypingclass#3\v!global\c!start}%
- {\the\numexpr\typingparameter\c!start+\typingparameter\c!nlines+\minusone\relax}%
- #5{\typingparameter\c!start}{\getvalue{\currenttypingclass#3\v!global\c!start}}}}%
- {#5{\typingparameter\c!start}{\typingparameter\c!stop}}}%
- \stopverbatimcolor
- \stoppacked
- \typingparameter\c!after
+ \dododotypefile\v!file{#3}%
+ \fi\fi
\egroup}
+\def\dododotypefile#1#2%
+ {\doifelsetypingfile{#2}
+ {\dodododotypefile{#1}\readfilename}
+ {\showmessage\m!verbatims1{#2}}}
+
\def\doifelsetypingfile#1% sets \readfilename (we will make this proper mkiv i.e. less messy)
{\doiflocfileelse{#1}
{\firstoftwoarguments}
{\doifinputfileelse{#1}
-% {\def\readfilename{\pathplusfile\filepath{#1}}\firstoftwoarguments} % messy, looks wrong too
{\def\readfilename{#1}\firstoftwoarguments} % messy, looks wrong too
{\secondoftwoarguments}}}
-\def\dodotypefile[#1][#2]#3%
- {\doifelsetypingfile{#3}
- {\dosometyping{#1}{#2}{#3}\dotypefileverbatim\dotypefilelinesverbatim}
- {\reporttypingerror{#3}}}
+\def\dodododotypefile#1#2% category name
+ {\edef\currenttyping{#1}%
+ \typingparameter\c!before
+ \startpacked[\v!blank]
+ \dosetuptypelinenumbering
+ \firststageinitializetyping
+ \secondstageinitializetyping
+ \dostarttagged\t!verbatimblock\currenttyping
+ \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",
+ }}%
+ \dostoptagged
+ \endofverbatimlines
+ \dostoptagged
+ \stoppacked
+ \typingparameter\c!after}
+
+%D Line numbering:
+
+\newconditional\verbatimnumberinglines
+
+\def\beginofverbatimlinenumbering
+ {\startlinenumbering
+ [\currenttyping]%
+ [\c!continue=\typingparameter\c!continue,
+ \c!method=\v!type,
+ \c!start=\typingparameter\c!start,
+ \c!stop=\typingparameter\c!stop, % ?
+ \c!step=\typingparameter\c!step]}
+
+\def\endofverbatimlinenumbering
+ {\stoplinenumbering}
+
+\def\dosetuptypelinenumbering
+ {\ifdefined\startlinenumbering
+ \edef\currenttypingnumbering{\typingparameter\c!numbering}%
+ \ifx\currenttypingnumbering\v!file
+ \setuplinenumbering[\currenttyping][\c!method=\v!file]%
+ \settrue\verbatimnumberinglines
+ \else\ifx\currenttypingnumbering\v!line
+ \settrue\verbatimnumberinglines
+ \else
+ \setfalse\verbatimnumberinglines
+ \fi\fi
+ \ifconditional\verbatimnumberinglines
+ \let\beginofverbatimlines\beginofverbatimlinenumbering
+ \let\endofverbatimlines \endofverbatimlinenumbering
+ \fi
+ \fi}
%D \macros
%D {filename}
@@ -965,9 +646,12 @@
\unexpanded\def\filename#1{{\tttf\hyphenatedfilename{#1}}}
-%D And a bonus macro:
+%D \macros
+%D {verbatim}
+%d
+%D And a bonus macro, an unexpanded detokenize:
-\def\verbatim#1{\defconvertedargument\ascii{#1}\ascii}
+\unexpanded\def\verbatim#1{\detokenize{#1}}
%D The setups for display verbatim and file verbatim are
%D shared. One can adapt the extra defined typing environments,
@@ -977,217 +661,191 @@
\setuptyping
[ \c!before=\blank,
\c!after=\blank,
- \c!bodyfont=,
- \c!color=,
+ %\c!bodyfont=,
+ %\c!color=,
\c!space=\v!off,
\c!page=\v!no,
- \c!tab=\s!ascii,
+ \c!tab=\v!yes, % what is this: \s!ascii ?
\c!option=\v!none,
- \c!palet=colorpretty,
\c!text=\v!no,
\c!style=\tttf,
- \c!icommand=\ttsl,
- \c!vcommand=,
- \c!ccommand=\tttf,
\c!indentnext=\v!yes,
\c!margin=\!!zeropoint,
\c!evenmargin=\!!zeropoint,
\c!oddmargin=\!!zeropoint,
\c!blank=\v!line,
- \c!escape=, % yes | no | START,STOP BTEX,ETEX
+ %\c!escape=, % yes | no | {START,STOP} | default when yes: {BTEX,ETEX}
\c!numbering=\v!no,
- \c!lines=,
- \c!range=,
- \c!empty=,
+ %\c!lines=,
+ %\c!range=,
\c!start=1,
- \c!stop=,
+ %\c!stop=,
\c!step=1,
- \c!continue=,
- \c!strip=\v!no, % auto or number
- \c!nlines=]
+ %\c!continue=,
+ \c!strip=\v!no] %auto or number
\definetyping[\v!typing]
-\presettyping[\v!file][]
-
-% \setuptyping % not needed
-% [\v!file]
-% [\c!start=1,
-% \c!stop=,
-% \c!step=1,
-% \c!continue=,
-% \c!nlines=]
+\setuptyping[\v!file] [\s!parent=\??tp\v!typing] % we don't want \start..\stop overload
+\setuptyping[\v!buffer][\s!parent=\??tp\v!file] % we don't want \start..\stop overload
%D The setups for inline verbatim default to:
\setuptype
[ \c!space=\v!off,
- \c!color=,
+ %\c!color=,
\c!style=\tt\tf, % \tttf gives problems with {\tx \type...}
+ %\c!option=\v!normal,
\c!page=\v!no,
- \c!tab=\v!yes,
- \c!palet=colorpretty,
- \c!option=\v!normal]
-
-%D Beware: only a few are currently (re)implemented in \MKIV.
-
-\definetyping[RAW] [\c!option=RAW]
-\definetyping[MP] [\c!option=MP] % done
-\definetyping[PL] [\c!option=PL]
-\definetyping[PM] [\c!option=PL]
-\definetyping[JS] [\c!option=JS]
-\definetyping[JV] [\c!option=JV]
-\definetyping[SQL] [\c!option=SQL]
-\definetyping[TEX] [\c!option=TEX] % done
-\definetyping[PAS] [\c!option=PAS]
-\definetyping[PASCAL][\c!option=PAS]
-\definetyping[MOD] [\c!option=PAS]
-\definetyping[MODULA][\c!option=PAS]
-\definetyping[DELPHI][\c!option=PAS]
-\definetyping[EIFFEL][\c!option=EIF]
-\definetyping[XML] [\c!option=XML]
-\definetyping[LUA] [\c!option=LUA] % done
-
-\installprettytype [RAW] [RAW]
-
-\installprettytype [TEX] [TEX]
-
-\installprettytype [PERL] [PL]
-\installprettytype [PL] [PL]
-\installprettytype [PM] [PL]
-
-\installprettytype [METAPOST] [MP]
-\installprettytype [METAFONT] [MP]
-\installprettytype [MP] [MP]
-\installprettytype [MF] [MP]
-
-\installprettytype [JAVASCRIPT] [JS]
-\installprettytype [JAVA] [JV]
-\installprettytype [JS] [JS]
-\installprettytype [JV] [JV]
-
-\installprettytype [SQL] [SQL]
-
-\installprettytype [PASCAL] [PAS]
-\installprettytype [PAS] [PAS]
-\installprettytype [MODULA] [PAS]
-\installprettytype [MOD] [PAS]
-
-\installprettytype [EIFFEL] [EIF]
-\installprettytype [EIF] [EIF]
-\installprettytype [E] [EIF]
-
-\installprettytype [XML] [XML]
-
-\installprettytype [LUA] [LUA]
-
-%D We use the \CONTEXT\ color system for switching to and from
-%D color mode. We can always redefine these colors afterwards.
-
-\definecolor [colorprettyone] [r=.9, g=.0, b=.0] % red
-\definecolor [colorprettytwo] [r=.0, g=.8, b=.0] % green
-\definecolor [colorprettythree] [r=.0, g=.0, b=.9] % blue
-\definecolor [colorprettyfour] [r=.8, g=.8, b=.6] % yellow
-
-\definecolor [grayprettyone] [s=.30]
-\definecolor [grayprettytwo] [s=.45]
-\definecolor [grayprettythree] [s=.60]
-\definecolor [grayprettyfour] [s=.75]
-
-\definepalet
- [colorpretty]
- [ prettyone=colorprettyone,
- prettytwo=colorprettytwo,
- prettythree=colorprettythree,
- prettyfour=colorprettyfour]
-
-\definepalet
- [graypretty]
- [ prettyone=grayprettyone,
- prettytwo=grayprettytwo,
- prettythree=grayprettythree,
- prettyfour=grayprettyfour]
-
-\definepalet [TEXcolorpretty] [colorpretty]
-\definepalet [TEXgraypretty] [graypretty]
-\definepalet [PLcolorpretty] [colorpretty]
-\definepalet [PLgraypretty] [graypretty]
-\definepalet [PMcolorpretty] [colorpretty]
-\definepalet [PMgraypretty] [graypretty]
-\definepalet [MPcolorpretty] [colorpretty]
-\definepalet [MPgraypretty] [graypretty]
-\definepalet [JVcolorpretty] [colorpretty]
-\definepalet [JVgraypretty] [graypretty]
-\definepalet [JScolorpretty] [colorpretty]
-\definepalet [JSgraypretty] [graypretty]
-\definepalet [SQLcolorpretty] [colorpretty]
-\definepalet [SQLgraypretty] [graypretty]
-\definepalet [PAScolorpretty] [colorpretty]
-\definepalet [PASgraypretty] [graypretty]
-\definepalet [EIFcolorpretty] [colorpretty]
-\definepalet [EIFgraypretty] [graypretty]
-\definepalet [XMLcolorpretty] [colorpretty]
-\definepalet [XMLgraypretty] [graypretty]
-\definepalet [LUAcolorpretty] [colorpretty]
-\definepalet [LUAgraypretty] [graypretty]
-
-% patched from verb-ini (todo)
-
-% \let\beginverbatimline\relax
-% \let\endverbatimline \relax
-
-% \appendtoks whatever\par\to\everyverbatimbeginofdisplay
-% \appendtoks whatever\to\everyverbatimendofdisplay
-% \appendtoks [\to\everyverbatimbeginofinline
-% \appendtoks ]\to\everyverbatimendofinline
-
-\let\doopenupverbatimline\empty
-
-\newtoks\everyverbatimbeginofdisplay
-\newtoks\everyverbatimendofdisplay
-\newtoks\everyverbatimbeginofinline
-\newtoks\everyverbatimendofinline
-
-\let\currentverbatimpretty\empty
-
-\def\doverbatimbeginofdisplay#1%
- {\edef\currentverbatimpretty{#1}%
- \the\everyverbatimbeginofdisplay}
-
-\def\doverbatimendofdisplay
- {\the\everyverbatimendofdisplay}
-
-\def\doverbatimbeginofinline#1%
- {\edef\currentverbatimpretty{#1}%
- \the\everyverbatimbeginofinline}
-
-\def\doverbatimendofinline
- {\the\everyverbatimendofinline}
-
-\def\doverbatimbeginofline#1% linenumber
- {\bgroup % due to pretty status
- \iflinepar\else\EveryPar{}\fi
- \noindent % was wrong: \dontleavehmode
- \xdef\dokeepverbatimlinedata % hm, still needed?
- {\parindent \the\parindent
- \hangindent\the\hangindent
- \hangafter \the\hangafter
- \leftskip \the\leftskip
- \rightskip \the\rightskip}%
- \egroup
- \dokeepverbatimlinedata
- \doopenupverbatimline
+ \c!tab=\v!yes]
+
+%D Buffers
+
+% [name] [settings] | [name] | [settings]
+
+\unexpanded\def\typebuffer
+ {\dodoubleempty\dotypebuffer}
+
+\unexpanded\def\dotypedefinedbuffer
+ {\dotripleempty\dodotypedefinedbuffer}
+
+\appendtoks
+ \setuevalue{\e!type\currentbuffer}%
+ {\noexpand\dotypedefinedbuffer
+ [\v!buffer]%
+ [def-\number\nofdefinedbuffers]}%
+\to \everydefinebuffer
+
+\def\dotypebuffer[#1][#2]%
+ {\bgroup
+ \ifsecondargument
+ \setuptyping[\v!buffer][#2]%
+ \processcommalist[#1]{\dododotypebuffer\v!buffer}% [name] [settings]
+ \else\iffirstargument
+ \doifassignmentelse{#1}
+ {\setuptyping[\v!buffer][#1]%
+ \dododotypebuffer\v!buffer\empty}% [settings]
+ {\processcommalist[#1]{\dododotypebuffer\v!buffer}}% [name]
+ \else
+ \dododotypebuffer\v!buffer\empty% []
+ \fi\fi
+ \egroup}
+
+\def\dodotypedefinedbuffer[#1][#2][#3]% category name settings
+ {\bgroup
+ \ifthirdargument
+ \setuptyping[#1][#3]%
+ \fi
+ \dododotypebuffer{#1}{#2}%
+ \egroup}
+
+\def\dododotypebuffer#1#2% category name
+ {\edef\currenttyping{#1}%
+ \typingparameter\c!before
+ \startpacked[\v!blank]
+ \dosetuptypelinenumbering
+ \firststageinitializetyping
+ \secondstageinitializetyping
+ \beginofverbatimlines
+ \dostarttagged\t!verbatimblock{#1}%
+ \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",
+ }}%
+ \dostoptagged
+ \endofverbatimlines
+ \stoppacked
+ \typingparameter\c!after}
+
+% process buffers .. settings
+
+\unexpanded\def\processbuffer
+ {\dodoubleempty\doprocessbuffer}
+
+\def\doprocessbuffer[#1][#2]%
+ {\bgroup
+ \ifsecondargument
+ \setuptyping[\v!buffer][#2]%
+ \processcommalist[#1]{\dodoprocessbuffer\v!buffer}% [name] [settings]
+ \else\iffirstargument
+ \doifassignmentelse{#1}
+ {\setuptyping[\v!buffer][#1]%
+ \dodoprocessbuffer\v!buffer\empty}% [settings]
+ {\processcommalist[#1]{\dodoprocessbuffer\v!buffer}}% [name]
+ \else
+ \dodoprocessbuffer\v!buffer\empty% []
+ \fi\fi
+ \egroup}
+
+% get : before/after of buffer
+% typing : before/after of typing
+% process : no before/after (special case anyway)
+
+\def\dodoprocessbuffer#1#2%
+ {\edef\currenttyping{#1}%
+ \ctxcommand{processbuffer {
+ name = "#2",
+ strip = "\typingparameter\c!strip",
+ tab = "\typingparameter\c!tab",
+ method = "\typingparameter\c!option",
+ nature = "direct",
+ }}}
+
+% line numbering, keep broken lines together
+
+\newcount\nofverbatimlines
+
+\def\doverbatimbeginofline
+ {\ifconditional\verbatimnumberinglines
+ \global\advance\nofverbatimlines\plusone
+ \attribute\verbatimlineattribute\nofverbatimlines
+ \fi
+ \noindent
+ \doverbatimsetlinemargin
\the\everyline\strut
- }%\beginverbatimline}
+ \dostarttagged\t!verbatimline\empty}
\def\doverbatimendofline
- {%\endverbatimline
- \global\lineparfalse
- \obeyedline\par}
+ {\dostoptagged
+ \obeyedline % still needed?
+ \par
+ \ifconditional\verbatimnumberinglines
+ \attribute\verbatimlineattribute\attributeunsetvalue
+ \fi}
\def\doverbatimemptyline
- {\strut
- \par
- \global\linepartrue}
+ {\dostoptagged
+ \ifconditional\verbatimnumberinglines
+ \par\strut\par % this will be an option where we use a signal instead of a strut
+ \else
+ \blank[\typingparameter\c!blank]%
+ \fi
+ \dostarttagged\t!verbatimlines\empty}
+
+% hooks:
+
+\def\doinlineverbatimstart {}
+\def\doinlineverbatimstop {}
+\def\doinlineverbatimbeginline {}
+\def\doinlineverbatimnewline {\obeyedspace}
+\def\doinlineverbatimemptyline {\obeyedspace}
+
+\def\dodisplayverbatimstart {\doverbatimbeginofline}
+\def\dodisplayverbatimstop {\doverbatimendofline}
+\def\dodisplayverbatimbeginline {\doverbatimbeginofline}
+\def\dodisplayverbatimnewline {\doverbatimendofline\par}
+\def\dodisplayverbatimemptyline {\doverbatimemptyline}
+
+\def\doverbatimspace {\obeyedspace}
+
+\loadmarkfile{buff-imp-default} % preloaded as otherwise spurious spaces inline due to loading
+\loadmarkfile{buff-imp-nested} % preloaded as otherwise spurious spaces inline due to loading
+\loadmarkfile{buff-imp-escaped} % for completeness
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/catc-act.mkii b/Master/texmf-dist/tex/context/base/catc-act.mkii
new file mode 100644
index 00000000000..41b7e8b981d
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/catc-act.mkii
@@ -0,0 +1,65 @@
+%D \module
+%D [ file=catc-act,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Catcode Macros,
+%D subtitle=Default Catcode Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module deals with some active character handling. Use
+%D with care.
+
+%D \macros
+%D {installactivecharacter}
+
+\def\installactivecharacter#1 %
+ {\edef\temp{\detokenize{#1}}%
+ \cctcounterc\expandafter`\temp\relax % relax needed
+ \expandafter\startextendcatcodetable
+ \expandafter\ctxcatcodes\expandafter\catcode\the\cctcounterc\activecatcode
+ \stopextendcatcodetable
+ \letcatcodecommand \ctxcatcodes \cctcounterc \temp \relax
+ \ifnum\currentcatcodetable=\ctxcatcodes \setcatcodetable\ctxcatcodes \fi}
+
+%D \macros
+%D {defineactivecharacter}
+%D
+%D Use this one with care, esp in combination with catcode
+%D vectors. There are better ways now.
+
+\chardef\activehackcode=`~
+
+\def\defineactivecharacter #1#2 #3%
+ {\cctcounterc\uccode\activehackcode
+ \if#1"\uccode\activehackcode\expandafter\doifnumberelse\expandafter{\string#1#2}\empty #1#2\else
+ \uccode\activehackcode\expandafter\doifnumberelse\expandafter{\string#1#2}\empty`#1#2\fi
+ \catcode\uccode\activehackcode\activecatcode
+ \uppercase{\def\next{~}}%
+ \uccode\activehackcode\cctcounterc
+ \expandafter\expandafter\expandafter\def\expandafter\next\expandafter
+ {\expandafter\dohandleactivecharacter\next{#3}}}
+
+\chardef\activecharactermode\plusone % overloading still backward compatible
+
+\def\dodohandleactivecharacter#1#2{#2}
+\def\donthandleactivecharacter#1#2{\noexpand#1}
+
+\def\dohandleactivecharacter
+ {\ifcase\activecharactermode
+ \expandafter\donthandleactivecharacter
+ \else
+ \expandafter\dodohandleactivecharacter
+ \fi}
+
+\def\makecharacteractive #1 {\catcode`#1\active}
+
+% \def\installanddefineactivecharacter #1 % #2%
+% {\normalexpanded{\noexpand\installactivecharacter \utfchar{#1} }% wrong
+% \defineactivecharacter #1 }% {#2}}
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/catc-act.tex b/Master/texmf-dist/tex/context/base/catc-act.mkiv
index bc24562d7fe..2cde28e44f1 100644
--- a/Master/texmf-dist/tex/context/base/catc-act.tex
+++ b/Master/texmf-dist/tex/context/base/catc-act.mkiv
@@ -58,4 +58,8 @@
\def\makecharacteractive #1 {\catcode`#1\active}
+\def\installanddefineactivecharacter #1 % #2%
+ {\normalexpanded{\noexpand\installactivecharacter \utfchar{#1} }%
+ \defineactivecharacter #1 }% {#2}}
+
\endinput
diff --git a/Master/texmf-dist/tex/context/base/catc-ctx.mkii b/Master/texmf-dist/tex/context/base/catc-ctx.mkii
new file mode 100644
index 00000000000..6bf4e9cfb24
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/catc-ctx.mkii
@@ -0,0 +1,76 @@
+%D \module
+%D [ file=catc-cys,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Catcode Macros,
+%D subtitle=Extra Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 We prefer to define relevant catcode tables in this file instead
+%D of everywhere around.
+
+\ifdefined \ctxcatcodes \else \newcatcodetable \ctxcatcodes \fi
+\ifdefined \prtcatcodes \else \newcatcodetable \prtcatcodes \fi
+
+\startcatcodetable \ctxcatcodes
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\circumflexasciicode\superscriptcatcode
+ \catcode\underscoreasciicode\subscriptcatcode
+ \catcode\ampersandasciicode \alignmentcatcode
+ \catcode\backslashasciicode \escapecatcode
+ \catcode\leftbraceasciicode \begingroupcatcode
+ \catcode\rightbraceasciicode\endgroupcatcode
+ \catcode\dollarasciicode \mathshiftcatcode
+ \catcode\hashasciicode \parametercatcode
+ \catcode\commentasciicode \commentcatcode
+ \catcode\tildeasciicode \activecatcode
+ \catcode\barasciicode \activecatcode
+\stopcatcodetable
+
+\startcatcodetable \prtcatcodes
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\circumflexasciicode\superscriptcatcode
+ \catcode\underscoreasciicode\subscriptcatcode
+ \catcode\ampersandasciicode \alignmentcatcode
+ \catcode\backslashasciicode \escapecatcode
+ \catcode\leftbraceasciicode \begingroupcatcode
+ \catcode\rightbraceasciicode\endgroupcatcode
+ \catcode\dollarasciicode \mathshiftcatcode
+ \catcode\hashasciicode \parametercatcode
+ \catcode\commentasciicode \commentcatcode
+ \catcode`\@ \lettercatcode
+ \catcode`\! \lettercatcode
+ \catcode`\? \lettercatcode
+ \catcode\tildeasciicode \activecatcode
+ \catcode\barasciicode \activecatcode
+\stopcatcodetable
+
+\letcatcodecommand \ctxcatcodes \barasciicode \relax
+\letcatcodecommand \ctxcatcodes \tildeasciicode \relax
+
+ \catcodetable \ctxcatcodes
+\let \defaultcatcodetable \ctxcatcodes
+
+% for the moment here:
+
+\def\starttexcode
+ {\pushcatcodetable
+ \catcodetable\prtcatcodes}
+
+\def\stoptexcode
+ {\popcatcodetable}
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/catc-ctx.mkiv b/Master/texmf-dist/tex/context/base/catc-ctx.mkiv
new file mode 100644
index 00000000000..bdba6aeee0e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/catc-ctx.mkiv
@@ -0,0 +1,131 @@
+%D \module
+%D [ file=catc-cys,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Catcode Macros,
+%D subtitle=Extra Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 We prefer to define relevant catcode tables in this file instead
+%D of everywhere around.
+
+\ifdefined \ctxcatcodes \else \newcatcodetable \ctxcatcodes \fi
+\ifdefined \prtcatcodes \else \newcatcodetable \prtcatcodes \fi
+\ifdefined \txtcatcodes \else \newcatcodetable \txtcatcodes \fi
+%ifdefined \mthcatcodes \else \newcatcodetable \mthcatcodes \fi % math, not used, too tricky
+\ifdefined \tpacatcodes \else \newcatcodetable \tpacatcodes \fi % { }
+\ifdefined \tpbcatcodes \else \newcatcodetable \tpbcatcodes \fi % < >
+
+\startcatcodetable \ctxcatcodes
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\circumflexasciicode\superscriptcatcode
+ \catcode\underscoreasciicode\subscriptcatcode
+ \catcode\ampersandasciicode \alignmentcatcode
+ \catcode\backslashasciicode \escapecatcode
+ \catcode\leftbraceasciicode \begingroupcatcode
+ \catcode\rightbraceasciicode\endgroupcatcode
+ \catcode\dollarasciicode \mathshiftcatcode
+ \catcode\hashasciicode \parametercatcode
+ \catcode\commentasciicode \commentcatcode
+ \catcode\tildeasciicode \activecatcode
+ \catcode\barasciicode \activecatcode
+\stopcatcodetable
+
+\startcatcodetable \prtcatcodes
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\circumflexasciicode\superscriptcatcode
+ \catcode\underscoreasciicode\lettercatcode
+ \catcode\ampersandasciicode \alignmentcatcode
+ \catcode\backslashasciicode \escapecatcode
+ \catcode\leftbraceasciicode \begingroupcatcode
+ \catcode\rightbraceasciicode\endgroupcatcode
+ \catcode\dollarasciicode \mathshiftcatcode
+ \catcode\hashasciicode \parametercatcode
+ \catcode\commentasciicode \commentcatcode
+ \catcode`\@ \lettercatcode
+ \catcode`\! \lettercatcode
+ \catcode`\? \lettercatcode
+ \catcode\tildeasciicode \activecatcode
+ \catcode\barasciicode \activecatcode
+\stopcatcodetable
+
+%startcatcodetable \mthcatcodes
+% \catcode\tabasciicode \spacecatcode
+% \catcode\endoflineasciicode \endoflinecatcode
+% %\catcode\newlineasciicode \spacecatcode
+% \catcode\formfeedasciicode \endoflinecatcode
+% \catcode\spaceasciicode \spacecatcode
+% \catcode\endoffileasciicode \ignorecatcode
+% \catcode\circumflexasciicode\superscriptcatcode
+% \catcode\underscoreasciicode\subscriptcatcode
+% \catcode\ampersandasciicode \alignmentcatcode
+% \catcode\backslashasciicode \escapecatcode
+% \catcode\leftbraceasciicode \begingroupcatcode
+% \catcode\rightbraceasciicode\endgroupcatcode
+% \catcode\dollarasciicode \mathshiftcatcode
+% \catcode\hashasciicode \parametercatcode
+% \catcode\commentasciicode \commentcatcode
+% %\catcode\tildeasciicode \activecatcode
+% %\catcode\barasciicode \activecatcode
+%stopcatcodetable
+
+\startcatcodetable \tpacatcodes
+ \catcode\tabasciicode \othercatcode
+ \catcode\endoflineasciicode \othercatcode
+ \catcode\formfeedasciicode \othercatcode
+ \catcode\spaceasciicode \othercatcode
+ \catcode\endoffileasciicode \othercatcode
+ \catcode\leftbraceasciicode \begingroupcatcode
+ \catcode\rightbraceasciicode\endgroupcatcode
+\stopcatcodetable
+
+\startcatcodetable \tpbcatcodes
+ \catcode\tabasciicode \othercatcode
+ \catcode\endoflineasciicode \othercatcode
+ \catcode\formfeedasciicode \othercatcode
+ \catcode\spaceasciicode \othercatcode
+ \catcode\endoffileasciicode \othercatcode
+ \catcode`\< \begingroupcatcode
+ \catcode`\> \endgroupcatcode
+\stopcatcodetable
+
+\startcatcodetable \txtcatcodes
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\backslashasciicode \escapecatcode
+ \catcode\leftbraceasciicode \begingroupcatcode
+ \catcode\rightbraceasciicode\endgroupcatcode
+\stopcatcodetable
+
+\letcatcodecommand \ctxcatcodes \barasciicode \relax
+\letcatcodecommand \ctxcatcodes \tildeasciicode \relax
+
+ \catcodetable \ctxcatcodes
+\let \defaultcatcodetable \ctxcatcodes
+
+% for the moment here:
+
+\def\starttexcode
+ {\pushcatcodetable
+ \catcodetable\prtcatcodes}
+
+\def\stoptexcode
+ {\popcatcodetable}
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/catc-ctx.tex b/Master/texmf-dist/tex/context/base/catc-ctx.tex
deleted file mode 100644
index 21e7d013641..00000000000
--- a/Master/texmf-dist/tex/context/base/catc-ctx.tex
+++ /dev/null
@@ -1,250 +0,0 @@
-%D \module
-%D [ file=catc-cys,
-%D version=2006.09.18,
-%D title=\CONTEXT\ Catcode Macros,
-%D subtitle=Extra Tables,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 We prefer to define relevant catcode tables in this file instead
-%D of everywhere around.
-
-\ifdefined \ctxcatcodes \else \newcatcodetable \ctxcatcodes \fi
-\ifdefined \mthcatcodes \else \newcatcodetable \mthcatcodes \fi % math, not used, too tricky
-\ifdefined \xmlcatcodesn \else \newcatcodetable \xmlcatcodesn \fi % normal
-\ifdefined \xmlcatcodese \else \newcatcodetable \xmlcatcodese \fi % entitle
-\ifdefined \xmlcatcodesr \else \newcatcodetable \xmlcatcodesr \fi % reduce
-\ifdefined \typcatcodesa \else \newcatcodetable \typcatcodesa \fi % { }
-\ifdefined \typcatcodesb \else \newcatcodetable \typcatcodesb \fi % < >
-
-\startcatcodetable \ctxcatcodes
- \catcode`\^^I = 10
- \catcode`\^^M = 5
- % \catcode`\^^J = 10 % new
- \catcode`\^^L = 5
- \catcode`\ = 10
- \catcode`\^^Z = 9
- \catcode`\\ = 0
- \catcode`\{ = 1
- \catcode`\} = 2
- \catcode`\$ = 3
- \catcode`\& = 4
- \catcode`\# = 6
- \catcode`\^ = 7
- \catcode`\_ = 8
- \catcode`\% = 14
- \catcode`\~ = 13
- \catcode`\| = 13
-\stopcatcodetable
-
-\startcatcodetable \prtcatcodes
- \catcode`\^^I = 10
- \catcode`\^^M = 5
- \catcode`\^^L = 5
- \catcode`\ = 10
- \catcode`\^^Z = 9
- \catcode`\\ = 0
- \catcode`\{ = 1
- \catcode`\} = 2
- \catcode`\$ = 3
- \catcode`\& = 4
- \catcode`\# = 6
- \catcode`\^ = 7
- \catcode`\_ = 8
- \catcode`\% = 14
- \catcode`\@ = 11
- \catcode`\! = 11
- \catcode`\? = 11
- \catcode`\~ = 13
- \catcode`\| = 13
-\stopcatcodetable
-
-\startcatcodetable \mthcatcodes
- \catcode`\^^I = 10
- \catcode`\^^M = 5
- %\catcode`\^^J = 10 % new
- \catcode`\^^L = 5
- \catcode`\ = 10
- \catcode`\^^Z = 9
- \catcode`\\ = 0
- \catcode`\{ = 1
- \catcode`\} = 2
- \catcode`\$ = 3
- \catcode`\& = 4
- \catcode`\# = 6
- \catcode`\^ = 7
- \catcode`\_ = 8
- \catcode`\% = 14
- %\catcode`\~ = 13
- %\catcode`\| = 13
-\stopcatcodetable
-
-\startcatcodetable \xmlcatcodesn
- \catcode`\^^I = 10 % ascii tab is a blank space
- \catcode`\^^M = 5 % ascii return is end-line
- \catcode`\^^L = 5 % ascii form-feed
- \catcode`\ = 10 % ascii space is blank space
- \catcode`\^^Z = 9 % ascii eof is ignored
- \catcode`\& = 13 % entity
- \catcode`\< = 13 % element
- \catcode`\> = 12
- \catcode`\" = 12 % probably not needed any more
- \catcode`\/ = 12 % probably not needed any more
- \catcode`\' = 12 % probably not needed any more
- \catcode`\~ = 12 % probably not needed any more
- \catcode`\# = 12 % probably not needed any more
- \catcode`\\ = 12 % probably not needed any more
-\stopcatcodetable
-
-\startcatcodetable \xmlcatcodese
- \catcode`\^^I = 10 % ascii tab is a blank space
- \catcode`\^^M = 5 % ascii return is end-line
- \catcode`\^^L = 5 % ascii form-feed
- \catcode`\ = 10 % ascii space is blank space
- \catcode`\^^Z = 9 % ascii eof is ignored
- \catcode`\& = 13 % entity
- \catcode`\< = 13 % element
- \catcode`\> = 12
- \catcode`\# = 13
- \catcode`\$ = 13
- \catcode`\% = 13
- \catcode`\\ = 13
- \catcode`\^ = 13
- \catcode`\_ = 13
- \catcode`\{ = 13
- \catcode`\} = 13
- \catcode`\| = 13
- \catcode`\~ = 13
-\stopcatcodetable
-
-\startcatcodetable \xmlcatcodesr
- \catcode`\^^I = 10 % ascii tab is a blank space
- \catcode`\^^M = 5 % ascii return is end-line
- \catcode`\^^L = 5 % ascii form-feed
- \catcode`\ = 10 % ascii space is blank space
- \catcode`\^^Z = 9 % ascii eof is ignored
- \catcode`\& = 13 % entity
- \catcode`\< = 13 % element
- \catcode`\> = 12
- \catcode`\# = 13
- \catcode`\$ = 13
- \catcode`\% = 13
- \catcode`\\ = 13
- \catcode`\^ = 13
- \catcode`\_ = 13
- \catcode`\{ = 13
- \catcode`\} = 13
- \catcode`\| = 13
- \catcode`\~ = 13
-\stopcatcodetable
-
-\startcatcodetable \typcatcodesa
- \catcode`\^^I = 12
- \catcode`\^^M = 12
- \catcode`\^^L = 12
- \catcode`\ = 12
- \catcode`\^^Z = 12
- \catcode`\{ = 1
- \catcode`\} = 2
-\stopcatcodetable
-
-\startcatcodetable \typcatcodesb
- \catcode`\^^I = 12
- \catcode`\^^M = 12
- \catcode`\^^L = 12
- \catcode`\ = 12
- \catcode`\^^Z = 12
- \catcode`\< = 1
- \catcode`\> = 2
-\stopcatcodetable
-
-\letcatcodecommand \ctxcatcodes `\| \relax
-\letcatcodecommand \ctxcatcodes `\~ \relax
-
-%letcatcodecommand \prtcatcodes `\| \relax % falls back on ctx
-%letcatcodecommand \prtcatcodes `\~ \relax % falls back on ctx
-
-\letcatcodecommand \xmlcatcodesn `\& \relax
-\letcatcodecommand \xmlcatcodesn `\< \relax
-
-\letcatcodecommand \xmlcatcodese `\& \relax
-\letcatcodecommand \xmlcatcodese `\< \relax
-
-\letcatcodecommand \xmlcatcodesr `\& \relax
-\letcatcodecommand \xmlcatcodesr `\< \relax
-
-\letcatcodecommand \xmlcatcodese `\# \relax
-\letcatcodecommand \xmlcatcodese `\$ \relax
-\letcatcodecommand \xmlcatcodese `\% \relax
-\letcatcodecommand \xmlcatcodese `\\ \relax
-\letcatcodecommand \xmlcatcodese `\^ \relax
-\letcatcodecommand \xmlcatcodese `\_ \relax
-\letcatcodecommand \xmlcatcodese `\{ \relax
-\letcatcodecommand \xmlcatcodese `\} \relax
-\letcatcodecommand \xmlcatcodese `\| \relax
-\letcatcodecommand \xmlcatcodese `\~ \relax
-
-\letcatcodecommand \xmlcatcodesr `\# \relax
-\letcatcodecommand \xmlcatcodesr `\$ \relax
-\letcatcodecommand \xmlcatcodesr `\% \relax
-\letcatcodecommand \xmlcatcodesr `\\ \relax
-\letcatcodecommand \xmlcatcodesr `\^ \relax
-\letcatcodecommand \xmlcatcodesr `\_ \relax
-\letcatcodecommand \xmlcatcodesr `\{ \relax
-\letcatcodecommand \xmlcatcodesr `\} \relax
-\letcatcodecommand \xmlcatcodesr `\| \relax
-\letcatcodecommand \xmlcatcodesr `\~ \relax
-
- \catcodetable \ctxcatcodes
-\let\defaultcatcodetable\ctxcatcodes
-\let\xmlcatcodes \xmlcatcodesn % beware, in mkiv we use \notcatcodes
-
-\endinput
-
-% under consideration:
-%
-% \newcatcodetable\txtcatcodes
-%
-% \startcatcodetable \txtcatcodes
-% \catcode`\^^I = 10
-% \catcode`\^^M = 5
-% \catcode`\^^L = 5
-% \catcode`\ = 10
-% \catcode`\\ = 0
-% \catcode`\{ = 1
-% \catcode`\} = 2
-% \stopcatcodetable
-%
-% \newcount\relaxedcatcodedepth
-%
-% \def\startrelaxedcatcodes
-% {\global\chardef\relaxedcatcodeparent\catcodetable
-% \global\advance\relaxedcatcodedepth\plusone
-% \nonknuthmode\setcatcodetable\txtcatcodes}
-%
-% \def\stoprelaxedcatcodes
-% {\ifcase\relaxedcatcodedepth
-% % error
-% \or
-% \setcatcodetable\relaxedcatcodeparent
-% \global\relaxedcatcodedepth\zerocount
-% \else
-% \global\advance\relaxedcatcodedepth\minusone
-% \setcatcodetable\txtcatcodes
-% \fi}
-%
-% \starttext
-%
-% \startrelaxedcatcodes
-% \startcomment test \stopcomment
-% test $ test 10% whatever|test \mathematics{x^2=1}
-% \stoprelaxedcatcodes
-%
-% $x^2=1$
-%
-% \stoptext
diff --git a/Master/texmf-dist/tex/context/base/catc-def.mkii b/Master/texmf-dist/tex/context/base/catc-def.mkii
new file mode 100644
index 00000000000..275a9a6cda4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/catc-def.mkii
@@ -0,0 +1,142 @@
+%D \module
+%D [ file=catc-def,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Catcode Macros,
+%D subtitle=Default Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The following catcode tables are rather \CONTEXT\ independent.
+
+\ifdefined\nilcatcodes \else \newcatcodetable \nilcatcodes \fi
+\ifdefined\texcatcodes \else \newcatcodetable \texcatcodes \fi
+\ifdefined\luacatcodes \else \newcatcodetable \luacatcodes \fi
+\ifdefined\notcatcodes \else \newcatcodetable \notcatcodes \fi
+\ifdefined\vrbcatcodes \else \newcatcodetable \vrbcatcodes \fi
+\ifdefined\prtcatcodes \else \newcatcodetable \prtcatcodes \fi
+
+\startcatcodetable \nilcatcodes
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode\endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode\ignorecatcode
+\stopcatcodetable
+
+\startcatcodetable \texcatcodes
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\circumflexasciicode\superscriptcatcode
+ \catcode\underscoreasciicode\subscriptcatcode
+ \catcode\ampersandasciicode \alignmentcatcode
+ \catcode\backslashasciicode \escapecatcode
+ \catcode\leftbraceasciicode \begingroupcatcode
+ \catcode\rightbraceasciicode\endgroupcatcode
+ \catcode\dollarasciicode \mathshiftcatcode
+ \catcode\hashasciicode \parametercatcode
+ \catcode\commentasciicode \commentcatcode
+\stopcatcodetable
+
+\startcatcodetable \luacatcodes
+ \catcode\tabasciicode \othercatcode
+ \catcode\endoflineasciicode \othercatcode
+ \catcode\formfeedasciicode \othercatcode
+ \catcode\spaceasciicode \othercatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\circumflexasciicode\othercatcode
+ \catcode\underscoreasciicode\othercatcode
+ \catcode\ampersandasciicode \othercatcode
+ \catcode\backslashasciicode \escapecatcode
+ \catcode\commentasciicode \othercatcode
+ \catcode\hashasciicode \othercatcode
+ \catcode\barasciicode \othercatcode
+ \catcode\leftbraceasciicode \othercatcode
+ \catcode\rightbraceasciicode\othercatcode
+ \catcode\tildeasciicode \othercatcode
+ \catcode\dollarasciicode \othercatcode
+\stopcatcodetable
+
+\startcatcodetable \notcatcodes % probably less needed
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\circumflexasciicode\othercatcode
+ \catcode\underscoreasciicode\othercatcode
+ \catcode\ampersandasciicode \othercatcode
+ \catcode\tildeasciicode \othercatcode
+ \catcode\hashasciicode \othercatcode
+ \catcode\dollarasciicode \othercatcode
+ \catcode\commentasciicode \othercatcode
+ \catcode`\< \othercatcode
+ \catcode`\> \othercatcode
+ \catcode\leftbraceasciicode \othercatcode
+ \catcode\rightbraceasciicode\othercatcode
+ \catcode`\" \othercatcode
+ \catcode`\' \othercatcode
+ \catcode`\/ \othercatcode
+ \catcode\backslashasciicode \othercatcode
+ \catcode\barasciicode \othercatcode
+\stopcatcodetable
+
+\startcatcodetable \vrbcatcodes % probably less needed
+ \catcode\tabasciicode \othercatcode
+ \catcode\endoflineasciicode\othercatcode
+ \catcode\formfeedasciicode \othercatcode
+ \catcode\spaceasciicode \othercatcode
+ \catcode\endoffileasciicode\othercatcode
+\stopcatcodetable
+
+\startcatcodetable \prtcatcodes
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\circumflexasciicode\superscriptcatcode
+ \catcode\underscoreasciicode\subscriptcatcode
+ \catcode\ampersandasciicode \alignmentcatcode
+ \catcode\backslashasciicode \escapecatcode
+ \catcode\leftbraceasciicode \begingroupcatcode
+ \catcode\rightbraceasciicode\endgroupcatcode
+ \catcode\dollarasciicode \mathshiftcatcode
+ \catcode\hashasciicode \parametercatcode
+ \catcode\commentasciicode \commentcatcode
+ \catcode`\@ \lettercatcode
+ \catcode`\! \lettercatcode
+ \catcode`\? \lettercatcode
+ \catcode\tildeasciicode \activecatcode
+ \catcode\barasciicode \activecatcode
+\stopcatcodetable
+
+%D Because some characters have a special meaning, we provide
+%D shortcuts to their character representation.
+
+\chardef\^=\circumflexasciicode
+\chardef\_=\underscoreasciicode % but way too wide in lm, so ... until that's fixed:
+\chardef\&=\ampersandasciicode
+\chardef\%=\commentasciicode
+\chardef\#=\hashasciicode
+\chardef\$=\dollarasciicode
+\chardef\{=\leftbraceasciicode
+\chardef\}=\rightbraceasciicode
+\chardef\\=\backslashasciicode
+
+%def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
+\def\_{\dontleavehmode \kern.06em \vbox{\hrule width.3em}}
+
+%D From now on we can use the protection mechanisms.
+
+\def\unprotect {\pushcatcodetable\setcatcodetable\prtcatcodes}
+\def\protect {\popcatcodetable}
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/catc-def.mkiv b/Master/texmf-dist/tex/context/base/catc-def.mkiv
new file mode 100644
index 00000000000..0bd7deed72b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/catc-def.mkiv
@@ -0,0 +1,143 @@
+%D \module
+%D [ file=catc-def,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Catcode Macros,
+%D subtitle=Default Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The following catcode tables are rather \CONTEXT\ independent.
+
+\ifdefined\nilcatcodes \else \newcatcodetable \nilcatcodes \fi
+\ifdefined\texcatcodes \else \newcatcodetable \texcatcodes \fi
+\ifdefined\luacatcodes \else \newcatcodetable \luacatcodes \fi
+\ifdefined\notcatcodes \else \newcatcodetable \notcatcodes \fi
+\ifdefined\vrbcatcodes \else \newcatcodetable \vrbcatcodes \fi
+\ifdefined\prtcatcodes \else \newcatcodetable \prtcatcodes \fi
+
+\startcatcodetable \nilcatcodes
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode\endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode\ignorecatcode
+\stopcatcodetable
+
+\startcatcodetable \texcatcodes
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\circumflexasciicode\superscriptcatcode
+ \catcode\underscoreasciicode\subscriptcatcode
+ \catcode\ampersandasciicode \alignmentcatcode
+ \catcode\backslashasciicode \escapecatcode
+ \catcode\leftbraceasciicode \begingroupcatcode
+ \catcode\rightbraceasciicode\endgroupcatcode
+ \catcode\dollarasciicode \mathshiftcatcode
+ \catcode\hashasciicode \parametercatcode
+ \catcode\commentasciicode \commentcatcode
+\stopcatcodetable
+
+\startcatcodetable \luacatcodes
+ \catcode\tabasciicode \othercatcode
+ \catcode\endoflineasciicode \othercatcode
+ \catcode\formfeedasciicode \othercatcode
+ \catcode\spaceasciicode \othercatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\circumflexasciicode\othercatcode
+ \catcode\underscoreasciicode\othercatcode
+ \catcode\ampersandasciicode \othercatcode
+ \catcode\backslashasciicode \escapecatcode
+ \catcode\commentasciicode \othercatcode
+ \catcode\hashasciicode \othercatcode
+ \catcode\barasciicode \othercatcode
+ \catcode\leftbraceasciicode \othercatcode
+ \catcode\rightbraceasciicode\othercatcode
+ \catcode\tildeasciicode \othercatcode
+ \catcode\dollarasciicode \othercatcode
+\stopcatcodetable
+
+\startcatcodetable \notcatcodes % probably less needed
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\circumflexasciicode\othercatcode
+ \catcode\underscoreasciicode\othercatcode
+ \catcode\ampersandasciicode \othercatcode
+ \catcode\tildeasciicode \othercatcode
+ \catcode\hashasciicode \othercatcode
+ \catcode\dollarasciicode \othercatcode
+ \catcode\commentasciicode \othercatcode
+ \catcode`\< \othercatcode
+ \catcode`\> \othercatcode
+ \catcode\leftbraceasciicode \othercatcode
+ \catcode\rightbraceasciicode\othercatcode
+ \catcode`\" \othercatcode
+ \catcode`\' \othercatcode
+ \catcode`\/ \othercatcode
+ \catcode\backslashasciicode \othercatcode
+ \catcode\barasciicode \othercatcode
+\stopcatcodetable
+
+\startcatcodetable \vrbcatcodes % probably less needed
+ \catcode\tabasciicode \othercatcode
+ \catcode\endoflineasciicode\othercatcode
+ \catcode\formfeedasciicode \othercatcode
+ \catcode\spaceasciicode \othercatcode
+ \catcode\endoffileasciicode\othercatcode
+\stopcatcodetable
+
+\startcatcodetable \prtcatcodes
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\circumflexasciicode\superscriptcatcode
+% \catcode\underscoreasciicode\subscriptcatcode
+ \catcode\underscoreasciicode\lettercatcode
+ \catcode\ampersandasciicode \alignmentcatcode
+ \catcode\backslashasciicode \escapecatcode
+ \catcode\leftbraceasciicode \begingroupcatcode
+ \catcode\rightbraceasciicode\endgroupcatcode
+ \catcode\dollarasciicode \mathshiftcatcode
+ \catcode\hashasciicode \parametercatcode
+ \catcode\commentasciicode \commentcatcode
+ \catcode`\@ \lettercatcode
+ \catcode`\! \lettercatcode
+ \catcode`\? \lettercatcode
+ \catcode\tildeasciicode \activecatcode
+ \catcode\barasciicode \activecatcode
+\stopcatcodetable
+
+%D Because some characters have a special meaning, we provide
+%D shortcuts to their character representation.
+
+\chardef\^=\circumflexasciicode
+\chardef\_=\underscoreasciicode % but way too wide in lm, so ... until that's fixed:
+\chardef\&=\ampersandasciicode
+\chardef\%=\commentasciicode
+\chardef\#=\hashasciicode
+\chardef\$=\dollarasciicode
+\chardef\{=\leftbraceasciicode
+\chardef\}=\rightbraceasciicode
+\chardef\\=\backslashasciicode
+
+%def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
+\def\_{\dontleavehmode \kern.06em \vbox{\hrule width.3em}}
+
+%D From now on we can use the protection mechanisms.
+
+\def\unprotect {\pushcatcodetable\setcatcodetable\prtcatcodes}
+\def\protect {\popcatcodetable}
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/catc-def.tex b/Master/texmf-dist/tex/context/base/catc-def.tex
deleted file mode 100644
index e80cfe12539..00000000000
--- a/Master/texmf-dist/tex/context/base/catc-def.tex
+++ /dev/null
@@ -1,142 +0,0 @@
-%D \module
-%D [ file=catc-def,
-%D version=2006.09.18,
-%D title=\CONTEXT\ Catcode Macros,
-%D subtitle=Default Tables,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-%D The following catcode tables are rather \CONTEXT\ independent.
-
-\ifdefined\nilcatcodes \else \newcatcodetable \nilcatcodes \fi
-\ifdefined\texcatcodes \else \newcatcodetable \texcatcodes \fi
-\ifdefined\luacatcodes \else \newcatcodetable \luacatcodes \fi
-\ifdefined\notcatcodes \else \newcatcodetable \notcatcodes \fi
-\ifdefined\vrbcatcodes \else \newcatcodetable \vrbcatcodes \fi
-\ifdefined\prtcatcodes \else \newcatcodetable \prtcatcodes \fi
-
-\startcatcodetable \nilcatcodes
- \catcode`\^^I = 10 % ascii tab is a blank space
- \catcode`\^^M = 5 % ascii return is end-line
- \catcode`\^^L = 5 % ascii form-feed
- \catcode`\ = 10 % ascii space is blank space
- \catcode`\^^Z = 9 % ascii eof is ignored
-\stopcatcodetable
-
-\startcatcodetable \texcatcodes
- \catcode`\^^I = 10
- \catcode`\^^M = 5
- \catcode`\^^L = 5
- \catcode`\ = 10
- \catcode`\^^Z = 9
- \catcode`\\ = 0
- \catcode`\{ = 1
- \catcode`\} = 2
- \catcode`\$ = 3
- \catcode`\& = 4
- \catcode`\# = 6
- \catcode`\^ = 7
- \catcode`\_ = 8
- \catcode`\% = 14
-\stopcatcodetable
-
-\startcatcodetable \luacatcodes
- \catcode`\^^I = 12 % ascii tab is a blank space
- \catcode`\^^M = 12 % ascii return is end-line
- \catcode`\^^L = 12 % ascii form-feed
- \catcode`\ = 12 % ascii space is blank space
- \catcode`\^^Z = 9 % ascii eof is ignored
- \catcode`\\ = 0
- \catcode`\% = 12
- \catcode`\# = 12
- \catcode`\_ = 12
- \catcode`\^ = 12
- \catcode`\& = 12
- \catcode`\| = 12
- \catcode`\{ = 12
- \catcode`\} = 12
- \catcode`\~ = 12
- \catcode`\$ = 12
-\stopcatcodetable
-
-\startcatcodetable \notcatcodes
- \catcode`\^^I = 10 % ascii tab is a blank space
- \catcode`\^^M = 5 % ascii return is end-line
- \catcode`\^^L = 5 % ascii form-feed
- \catcode`\ = 10 % ascii space is blank space
- \catcode`\^^Z = 9 % ascii eof is ignored
- \catcode`\~ = 12
- \catcode`\# = 12 % probably too much, in principle
- \catcode`\$ = 12 % nilcatcodes would be ok too
- \catcode`\% = 12
- \catcode`\^ = 12
- \catcode`\& = 12
- \catcode`\_ = 12
- \catcode`\< = 12
- \catcode`\> = 12
- \catcode`\{ = 12
- \catcode`\} = 12
- \catcode`\" = 12
- \catcode`\' = 12
- \catcode`\/ = 12
- \catcode`\\ = 12
- \catcode`\| = 12
-\stopcatcodetable
-
-\startcatcodetable \vrbcatcodes % probably less needed
- \catcode`\^^I = 12
- \catcode`\^^M = 12
- \catcode`\^^L = 12
- \catcode`\ = 12
- \catcode`\^^Z = 12
-\stopcatcodetable
-
-\startcatcodetable \prtcatcodes
- \catcode`\^^I = 10
- \catcode`\^^M = 5
- \catcode`\^^L = 5
- \catcode`\ = 10
- \catcode`\^^Z = 9
- \catcode`\\ = 0
- \catcode`\{ = 1
- \catcode`\} = 2
- \catcode`\$ = 3
- \catcode`\& = 4
- \catcode`\# = 6
- \catcode`\^ = 7
- \catcode`\_ = 8
- \catcode`\% = 14
- \catcode`\@ = 11
- \catcode`\! = 11
- \catcode`\? = 11
- \catcode`\~ = 13
- \catcode`\| = 13
-\stopcatcodetable
-
-%D Because some characters have a special meaning, we provide
-%D shortcuts to their character representation.
-
-\chardef\%=`\%
-\chardef\&=`\&
-\chardef\#=`\#
-\chardef\$=`\$
-\chardef\{=`\{
-\chardef\}=`\}
-\chardef\\=`\\
-\chardef\^=`\^
-\chardef\_=`\_ % but way too wide in lm, so ... until that's fixed:
-
-%def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
-\def\_{\dontleavehmode \kern.06em \vbox{\hrule width.3em}}
-
-%D From now on we can use the protection mechanisms.
-
-\def\unprotect {\pushcatcodetable\setcatcodetable\prtcatcodes}
-\def\protect {\popcatcodetable}
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/catc-ini.mkii b/Master/texmf-dist/tex/context/base/catc-ini.mkii
index dee15290ac0..900f617563a 100644
--- a/Master/texmf-dist/tex/context/base/catc-ini.mkii
+++ b/Master/texmf-dist/tex/context/base/catc-ini.mkii
@@ -22,21 +22,41 @@
\ifx\plusone \undefined \chardef \plusone = 1 \fi
\ifx\minusone \undefined \newcount\minusone \minusone =-1 \fi
-\chardef\escapecatcode = 0
-\chardef\begingroupcatcode = 1
-\chardef\endgroupcatcode = 2
-\chardef\mathshiftcatcode = 3
-\chardef\alignmentcatcode = 4
-\chardef\endoflinecatcode = 5
-\chardef\parametercatcode = 6
-\chardef\superscriptcatcode = 7
-\chardef\subscriptcatcode = 8
-\chardef\ignorecatcode = 9
-\chardef\spacecatcode = 10
-\chardef\lettercatcode = 11
-\chardef\othercatcode = 12 \chardef\other = 12
-\chardef\activecatcode = 13 \chardef\active = 13
-\chardef\commentcatcode = 14
+\chardef\escapecatcode = 0
+\chardef\begingroupcatcode = 1
+\chardef\endgroupcatcode = 2
+\chardef\mathshiftcatcode = 3
+\chardef\alignmentcatcode = 4
+\chardef\endoflinecatcode = 5
+\chardef\parametercatcode = 6
+\chardef\superscriptcatcode = 7
+\chardef\subscriptcatcode = 8
+\chardef\ignorecatcode = 9
+\chardef\spacecatcode = 10
+\chardef\lettercatcode = 11
+\chardef\othercatcode = 12 \chardef\other = 12
+\chardef\activecatcode = 13 \chardef\active = 13
+\chardef\commentcatcode = 14
+\chardef\invalidcatcode = 15
+
+\chardef\tabasciicode = 9 % ^^I
+\chardef\newlineasciicode = 10 % ^^J don't confuse this one with \endoflineasciicode
+\chardef\formfeedasciicode = 12 % ^^L
+\chardef\endoflineasciicode = 13 % ^^M somewhat messy but this can be the active \par
+\chardef\endoffileasciicode = 26 % ^^Z
+\chardef\spaceasciicode = 32
+\chardef\hashasciicode = 35
+\chardef\dollarasciicode = 36
+\chardef\commentasciicode = 37
+\chardef\ampersandasciicode = 38
+\chardef\backslashasciicode = 92 % `\\
+\chardef\circumflexasciicode = 94
+\chardef\underscoreasciicode = 95
+\chardef\leftbraceasciicode = 123 % `\{
+\chardef\barasciicode = 124 % `\|
+\chardef\rightbraceasciicode = 125 % `\}
+\chardef\tildeasciicode = 126 % `\~
+\chardef\delasciicode = 127
\newif \ifrecatcodeuppercharacters % only used in good old tex
diff --git a/Master/texmf-dist/tex/context/base/catc-ini.mkiv b/Master/texmf-dist/tex/context/base/catc-ini.mkiv
index 269330a1bbd..9221d17c51f 100644
--- a/Master/texmf-dist/tex/context/base/catc-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/catc-ini.mkiv
@@ -14,32 +14,66 @@
%D We've split the functionality of syst-cat.* over more files
%D now so that we can load more selectively.
-\registerctxluafile{catc-ini} {1.001}
+\registerctxluafile{catc-ini}{1.001}
%D A long standing wish has been the availability of catcode
%D arrays. Because traditional \TEX\ does not provide this we
%D implement a fake method in the \MKII\ file. There is some
%D overlap in code with \MKII\ but we take that for granted.
-\ifx\zerocount\undefined \chardef \zerocount= 0 \fi
-\ifx\plusone \undefined \chardef \plusone = 1 \fi
-\ifx\minusone \undefined \newcount\minusone \minusone =-1 \fi
-
-\chardef\escapecatcode = 0
-\chardef\begingroupcatcode = 1
-\chardef\endgroupcatcode = 2
-\chardef\mathshiftcatcode = 3
-\chardef\alignmentcatcode = 4
-\chardef\endoflinecatcode = 5
-\chardef\parametercatcode = 6
-\chardef\superscriptcatcode = 7
-\chardef\subscriptcatcode = 8
-\chardef\ignorecatcode = 9
-\chardef\spacecatcode = 10
-\chardef\lettercatcode = 11
-\chardef\othercatcode = 12 \chardef\other = 12
-\chardef\activecatcode = 13 \chardef\active = 13
-\chardef\commentcatcode = 14
+\setnewconstant\escapecatcode 0
+\setnewconstant\begingroupcatcode 1
+\setnewconstant\endgroupcatcode 2
+\setnewconstant\mathshiftcatcode 3
+\setnewconstant\alignmentcatcode 4
+\setnewconstant\endoflinecatcode 5
+\setnewconstant\parametercatcode 6
+\setnewconstant\superscriptcatcode 7
+\setnewconstant\subscriptcatcode 8
+\setnewconstant\ignorecatcode 9
+\setnewconstant\spacecatcode 10
+\setnewconstant\lettercatcode 11
+\setnewconstant\othercatcode 12 \let\other \othercatcode
+\setnewconstant\activecatcode 13 \let\active\activecatcode
+\setnewconstant\commentcatcode 14
+\setnewconstant\invalidcatcode 15
+
+\setnewconstant\tabasciicode 9
+\setnewconstant\newlineasciicode 10 % don't confuse this one with \endoflineasciicode
+\setnewconstant\formfeedasciicode 12
+\setnewconstant\endoflineasciicode 13 % somewhat messy but this can be the active \par
+\setnewconstant\endoffileasciicode 26
+\setnewconstant\spaceasciicode 32
+\setnewconstant\hashasciicode 35
+\setnewconstant\dollarasciicode 36
+\setnewconstant\commentasciicode 37
+\setnewconstant\ampersandasciicode 38
+\setnewconstant\backslashasciicode 92 % `\\
+\setnewconstant\circumflexasciicode 94
+\setnewconstant\underscoreasciicode 95
+\setnewconstant\leftbraceasciicode 123 % `\{
+\setnewconstant\barasciicode 124 % `\|
+\setnewconstant\rightbraceasciicode 125 % `\}
+\setnewconstant\tildeasciicode 126 % `\~
+\setnewconstant\delasciicode 127
+
+\bgroup
+ \catcode \tabasciicode \activecatcode \gdef\activetabtoken {^^I}
+ \gdef\outputnewlinechar {^^J}
+ \catcode \formfeedasciicode \activecatcode \gdef\activeformfeedtoken {^^L}
+ \catcode \endoflineasciicode \activecatcode \gdef\activeendoflinetoken{^^M}
+\egroup
+
+% \endlinechar = \endoflineasciicode % appended to input lines
+% \newlinechar = \newlineasciicode % can be used in write
+
+% rather special and used in writing to file: \let\par\outputnewlinechar
+
+\def\initializenewlinechar % operating system dependent
+ {\bgroup
+ \newlinechar\newlineasciicode
+ \xdef\outputnewlinechar{^^J}%
+ \egroup}
\ifx\gobbleoneargument\undefined \long\def\gobbleoneargument#1{} \fi
@@ -54,21 +88,20 @@
\def\newcatcodetable#1%
{\global\advance\cctdefcounter\plusone
\expandafter\xdef\csname @@ccn:\number\cctdefcounter\endcsname{\string#1}% logging
- \global\chardef#1\cctdefcounter
- \ctxlua{catcodes.register("\expandafter\gobbleoneargument\string#1",\number#1)}%
- % we have two ways to access catcodetable numbers
- \startruntimectxluacode tex.\expandafter\gobbleoneargument\string#1 = \number#1 ;\stopruntimectxluacode}
+ \newconstant#1%
+ #1\cctdefcounter
+ \ctxlua{catcodes.register("\expandafter\gobbleoneargument\string#1",\number#1)}}
\newcatcodetable \scratchcatcodes \initcatcodetable\scratchcatcodes
\newtoks \setdefaultcatcodes
\setdefaultcatcodes
- {\catcode`\\ \othercatcode
- \catcode`\^^M \othercatcode
- \catcode`\ \othercatcode
- \catcode`\% \othercatcode
- \catcode127 \othercatcode}
+ {\catcode\backslashasciicode\othercatcode
+ \catcode\endoflineasciicode\othercatcode
+ \catcode\spaceasciicode \othercatcode
+ \catcode\commentasciicode \othercatcode
+ \catcode\delasciicode \othercatcode}
\long\normalprotected\def\startcatcodetable#1#2\stopcatcodetable
{\bgroup
@@ -78,6 +111,11 @@
\savecatcodetable#1\relax
\egroup}
+\def\permitcircumflexescape % to be used grouped
+ {\catcode\circumflexasciicode\superscriptcatcode}
+
+\let\permitcaretescape\permitcircumflexescape
+
\newcatcodetable\dummycatcodes
\long\normalprotected\def\startextendcatcodetable#1#2\stopextendcatcodetable
@@ -111,7 +149,7 @@
%D mechanism? Future versions of \MKIV\ might only use
%D active characters for very special cases.
-\chardef\activehackcode=`\~
+\setnewconstant\activehackcode \tildeasciicode
%D Once a catcode is assigned, the next assignments will happen faster.
@@ -187,7 +225,7 @@
\uppercase{\normalprotected\xdef~{\noexpand\catcodecommand{\number\cctcounterb}}}%
\egroup}
-\chardef\defaultcatcodetable\zerocount
+\newconstant\defaultcatcodetable
\def\catcodecommand#1%
{\csname CCC:\number
@@ -197,8 +235,7 @@
:\number#1\endcsname}
%D \macros
-%D {restorecatcodes,
-%D beginrestorecatcodes,endrestorecatcodes}
+%D {restorecatcodes,pushcatcodetable,popcatcodetable}
%D
%D We're not finished dealing \CATCODES\ yet. In \CONTEXT\ we
%D use only one auxiliary file, which deals with tables of
@@ -210,16 +247,19 @@
%D what the next macros do. Saving the catcodes can be
%D disabled by saying \type{\localcatcodestrue}.
+% quite likely we will define \unexpanded earlier on so
+% that \normalprotected will go
+
\let\savedcatcodetable\relax
\newcount\catcoderestorelevel
-\def\pushcatcodetable
+\normalprotected\def\pushcatcodetable
{\advance\catcoderestorelevel\plusone
\tracepushcatcodetable
\expandafter\chardef\csname scct:\number\catcoderestorelevel\endcsname\currentcatcodetable}
-\def\popcatcodetable
+\normalprotected\def\popcatcodetable
{\ifcase\catcoderestorelevel
\showcatcodenestingerror
\else
@@ -228,22 +268,22 @@
\advance\catcoderestorelevel\minusone
\fi}
-\def\showcatcodenestingerror % can be overloaded
+\normalprotected\def\showcatcodenestingerror % can be overloaded
{\immediate\write16{}%
\immediate\write16{Fatal error: catcode push/pop mismatch. Fix this!}\wait\end
\immediate\write16{}}
-\def\restorecatcodes % takes previous level
+\normalprotected\def\restorecatcodes % takes previous level
{\ifnum\catcoderestorelevel>\plusone
\expandafter\catcodetable\csname scct:\number\numexpr\catcoderestorelevel-1\relax\endcsname
\fi}
\newtoks\everycatcodetable
-\def\setcatcodetable#1%
- {\catcodetable#1%
- \the\everycatcodetable
- \tracesetcatcodetable}
+\normalprotected\def\setcatcodetable#1%
+ {\catcodetable#1%
+ \the\everycatcodetable
+ \tracesetcatcodetable}
\def\dotracecatcodetable#1{\immediate\write16{[#1]}}
@@ -272,46 +312,43 @@
\let\tracepushcatcodetable\empty
\let\tracepopcatcodetable \empty
-\def\beginrestorecatcodes{\pushcatcodetable}
-\def\endrestorecatcodes {\popcatcodetable}
-
%D Handy for debugging:
% \tracecatcodetables
-%D Only in \MKIV\ (to be used when crossing pages with changed catcodes
-%D in the current vector):
-%D
-%D \starttyping
-%D \normalprotected\def\startcrap
-%D {\bgroup
-%D \pushcatcodes
-%D \whitespace
-%D \obeylines
-%D \activatespacehandler\v!yes
-%D \strut}
-%D
-%D \normalprotected\def\stopcrap
-%D {\popcatcodes
-%D \egroup}
-%D \stoptyping
-
-\newcount\catcodetablelevel
-
-\def\pushcatcodes
- {\bgroup
- \global\advance\catcodetablelevel\plusone
- \ifcsname @@ccf:\number\catcodetablelevel\endcsname \else
- \global\advance\cctdefcounter\plusone
- \expandafter\global\expandafter\chardef\csname @@ccf:\number\catcodetablelevel\endcsname\cctdefcounter
- \fi
- \catcodetable\ctxcatcodes
- \expandafter\savecatcodetable\csname @@ccf:\number\catcodetablelevel\endcsname
- \egroup
- \expandafter\catcodetable\csname @@ccf:\number\catcodetablelevel\endcsname}
-
-\def\popcatcodes
- {\global\advance\catcodetablelevel\minusone}
+% D Only in \MKIV\ (to be used when crossing pages with changed catcodes
+% D in the current vector):
+% D
+% D \starttyping
+% D \normalprotected\def\startcrap
+% D {\bgroup
+% D \pushcatcodes
+% D \whitespace
+% D \obeylines
+% D \activatespacehandler\v!yes
+% D \strut}
+% D
+% D \normalprotected\def\stopcrap
+% D {\popcatcodes
+% D \egroup}
+% D \stoptyping
+%
+% \newcount\catcodetablelevel
+%
+% \def\pushcatcodes
+% {\bgroup
+% \global\advance\catcodetablelevel\plusone
+% \ifcsname @@ccf:\number\catcodetablelevel\endcsname \else
+% \global\advance\cctdefcounter\plusone
+% \expandafter\global\expandafter\chardef\csname @@ccf:\number\catcodetablelevel\endcsname\cctdefcounter
+% \fi
+% \catcodetable\ctxcatcodes
+% \expandafter\savecatcodetable\csname @@ccf:\number\catcodetablelevel\endcsname
+% \egroup
+% \expandafter\catcodetable\csname @@ccf:\number\catcodetablelevel\endcsname}
+%
+% \def\popcatcodes
+% {\global\advance\catcodetablelevel\minusone}
\endinput
diff --git a/Master/texmf-dist/tex/context/base/catc-sym.tex b/Master/texmf-dist/tex/context/base/catc-sym.mkii
index 067e192c85a..91cac5f90d7 100644
--- a/Master/texmf-dist/tex/context/base/catc-sym.tex
+++ b/Master/texmf-dist/tex/context/base/catc-sym.mkii
@@ -70,10 +70,10 @@
\def\uncatcodeallcharacters{\setcatcodetable\nilcatcodes} % was slow one, with restore
\def\uncatcodespacetokens
- {\catcode`\ =\spacecatcode
- \catcode`\^^L=\ignorecatcode
- \catcode`\^^M=\endoflinecatcode
- \catcode`\^^?=\ignorecatcode}
+ {\catcode\spaceasciicode \spacecatcode
+ \catcode\formfeedasciicode \ignorecatcode
+ \catcode\endoflineasciicode\endoflinecatcode
+ \catcode\delasciicode \ignorecatcode}
%D \macros
%D {setverbosecharacter,setverbosecscharacters}
@@ -94,8 +94,8 @@
% if used often we can move the code inline
- \catcode`\|=\activecatcode
- \catcode`\~=\activecatcode
+ \catcode\barasciicode \activecatcode
+ \catcode\tildeasciicode\activecatcode
\global \everyverbosechacters =
{\setverbosecscharacter |\setverbosecscharacter ~% context specific
diff --git a/Master/texmf-dist/tex/context/base/catc-sym.mkiv b/Master/texmf-dist/tex/context/base/catc-sym.mkiv
new file mode 100644
index 00000000000..91cac5f90d7
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/catc-sym.mkiv
@@ -0,0 +1,187 @@
+%D \module
+%D [ file=catc-sym,
+%D version=1997.01.03, % moved code
+%D title=\CONTEXT\ Catcode Macros,
+%D subtitle=Some Handy Constants,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% we now have loaded syst-* so we have all @@catcode constants
+
+%D We want to have access to the raw alternatives of the
+%D special characters. We use a \type {\xdef} instead of
+%D \type {\let} because we need an expandable token in a
+%D \type {\write}.
+
+\bgroup
+
+\catcode`B=\begingroupcatcode
+\catcode`E=\endgroupcatcode
+\catcode`.=\escapecatcode
+
+.catcode `.{ 12 .xdef .letteropenbrace B.string{E
+.catcode `.} 12 .xdef .letterclosebrace B.string}E
+.catcode `.& 12 .xdef .letterampersand B.string&E
+.catcode `.< 12 .xdef .letterless B.string<E
+.catcode `.> 12 .xdef .lettermore B.string>E
+.catcode `.# 12 .xdef .letterhash B.string#E
+.catcode `." 12 .xdef .letterdoublequote B.string"E
+.catcode `.' 12 .xdef .lettersinglequote B.string'E
+.catcode `.$ 12 .xdef .letterdollar B.string$E
+.catcode `.% 12 .xdef .letterpercent B.string%E
+.catcode `.^ 12 .xdef .letterhat B.string^E
+.catcode `._ 12 .xdef .letterunderscore B.string_E
+.catcode `.| 12 .xdef .letterbar B.string|E
+.catcode `.~ 12 .xdef .lettertilde B.string~E
+.catcode `.\ 12 .xdef .letterbackslash B.string\E
+.catcode `./ 12 .xdef .letterslash B.string/E
+.catcode `.? 12 .xdef .letterquestionmark B.string?E
+.catcode `.! 12 .xdef .letterexclamationmark B.string!E
+.catcode `.@ 12 .xdef .letterat B.string@E
+.catcode `.: 12 .xdef .lettercolon B.string:E
+
+ .global .let .letterescape .letterbackslash
+ .global .let .letterbgroup .letteropenbrace
+ .global .let .letteregroup .letterclosebrace
+ .global .let .letterleftbrace .letteropenbrace
+ .global .let .letterrightbrace .letterclosebrace
+
+.egroup
+
+%D \macros
+%D {uncatcodespecials,setnaturalcatcodes,setnormalcatcodes,
+%D uncatcodecharacters,uncatcodeallcharacters,
+%D uncatcodespacetokens}
+%D
+%D The following macros are more or less replaced by switching
+%D to a catcode table (which we simulate in \MKII) but we keep
+%D them for convenience and compatibility. Some old engine code
+%D has been removed.
+
+\def\uncatcodespecials {\setcatcodetable\nilcatcodes \uncatcodespacetokens}
+\def\setnaturalcatcodes {\setcatcodetable\nilcatcodes}
+\def\setnormalcatcodes {\setcatcodetable\ctxcatcodes} % maybe \texcatcodes
+\def\uncatcodecharacters {\setcatcodetable\nilcatcodes} % was fast version, gone now
+\def\uncatcodeallcharacters{\setcatcodetable\nilcatcodes} % was slow one, with restore
+
+\def\uncatcodespacetokens
+ {\catcode\spaceasciicode \spacecatcode
+ \catcode\formfeedasciicode \ignorecatcode
+ \catcode\endoflineasciicode\endoflinecatcode
+ \catcode\delasciicode \ignorecatcode}
+
+%D \macros
+%D {setverbosecharacter,setverbosecscharacters}
+%D
+%D Next follows a definition that lets some shortcuts expand to
+%D themselves. This macro is meant for \POSTSCRIPT\ and \PDF\
+%D code passed on to the backend.
+
+\newtoks\everyverbosechacters
+
+\def\setverbosecscharacter#1%
+ {\edef#1{\string#1}}
+
+\def\setverbosecscharacters
+ {\the\everyverbosechacters}
+
+\bgroup
+
+ % if used often we can move the code inline
+
+ \catcode\barasciicode \activecatcode
+ \catcode\tildeasciicode\activecatcode
+
+ \global \everyverbosechacters =
+ {\setverbosecscharacter |\setverbosecscharacter ~% context specific
+ \setverbosecscharacter\|\setverbosecscharacter\~%
+ \setverbosecscharacter\:\setverbosecscharacter\;%
+ \setverbosecscharacter\+\setverbosecscharacter\-%
+ \setverbosecscharacter\[\setverbosecscharacter\]%
+ \setverbosecscharacter\.\setverbosecscharacter\\%
+ \setverbosecscharacter\)\setverbosecscharacter\(%
+ \setverbosecscharacter\0\setverbosecscharacter\1%
+ \setverbosecscharacter\2\setverbosecscharacter\3%
+ \setverbosecscharacter\4\setverbosecscharacter\5%
+ \setverbosecscharacter\6\setverbosecscharacter\7%
+ \setverbosecscharacter\8\setverbosecscharacter\9%
+ \setverbosecscharacter\n\setverbosecscharacter\s%
+ \setverbosecscharacter\/}
+
+\egroup
+
+%D (Inspired by a discussion on the \CONTEXT\ mailing list)
+%D
+%D In \TEX\ each character can have one of 16 catcodes. This way the
+%D backslash, dollar, ampersand, hash and some more characters get
+%D their special meaning. If you want to process tokens under a
+%D certain catcode regime, passing arguments can interfere badly.
+%D
+%D \startbuffer[a]
+%D \def\whatever#1{[#1]}
+%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
+%D \stopbuffer
+%D
+%D \typebuffer[a]
+%D
+%D Here we pass an argument to \type {\whatever} but part of that
+%D argument is to be processed under a different catcode regime, i.e.\
+%D all characters that need to be typeset verbatim need to get
+%D the catcode that makes it a letter. This is what we get when we typeset
+%D the text verbatim:
+%D
+%D \starttyping
+%D whatever \type {\whatever{you want}} $or$ not!
+%D \stoptyping
+%D
+%D However, when passed to \type {\whatever} we get:
+%D
+%D \getbuffer[a]
+%D
+%D In \ETEX\ one can use \type {\scantokens} to circumvent this problem.
+%D
+%D \startbuffer[b]
+%D \def\rescan#1{\scantokens{#1}}
+%D \def\whatever#1{[\rescan{#1}]}
+%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
+%D \stopbuffer
+%D
+%D \getbuffer[b] \typebuffer[b]
+%D
+%D This time the \type {\whatever} call gives:
+%D
+%D \getbuffer[b]
+%D
+%D In this example, two spaces have crept in. The first one, after the
+%D macro name, is inserted by \TEX\ and cannot be avoided. The last space
+%D is inserted by \type {\scantokens}, and is the consequence of the fact
+%D that this macro mimics reading from a file. You can avoid the last
+%D space by a slightly different definition:
+%D
+%D \startbuffer[c]
+%D \def\rescan#1{\scantokens{#1\ignorespaces}}
+%D \def\whatever#1{[\rescan{#1}]}
+%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
+%D \stopbuffer
+%D
+%D \typebuffer[c]
+%D
+%D Unfortunately we still keep the first space, but at least it's better than
+%D a failure:
+%D
+%D \getbuffer[c]
+
+\long\def\rescan#1{\scantokens{#1\ignorespaces}}
+\long\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}
+\fi
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/catc-xml.mkii b/Master/texmf-dist/tex/context/base/catc-xml.mkii
new file mode 100644
index 00000000000..2349e01a247
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/catc-xml.mkii
@@ -0,0 +1,114 @@
+%D \module
+%D [ file=catc-xml,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Catcode Macros,
+%D subtitle=\XML\ Catcode Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Catcode Regimes / XML}
+
+\ifdefined \xmlcatcodesn \else \newcatcodetable \xmlcatcodesn \fi % normal
+\ifdefined \xmlcatcodese \else \newcatcodetable \xmlcatcodese \fi % entitle
+\ifdefined \xmlcatcodesr \else \newcatcodetable \xmlcatcodesr \fi % reduce
+
+\startcatcodetable \xmlcatcodesn
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\ampersandasciicode \activecatcode
+ \catcode`\< \activecatcode
+ \catcode`\> \othercatcode
+ \catcode`\" \othercatcode % probably not needed any more
+ \catcode`\/ \othercatcode % probably not needed any more
+ \catcode`\' \othercatcode % probably not needed any more
+ \catcode\tildeasciicode \othercatcode % probably not needed any more
+ \catcode\hashasciicode \othercatcode % probably not needed any more
+ \catcode\backslashasciicode \othercatcode % probably not needed any more
+\stopcatcodetable
+
+\startcatcodetable \xmlcatcodese
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\ampersandasciicode \activecatcode
+ \catcode`\< \activecatcode
+ \catcode`\> \activecatcode
+ \catcode\hashasciicode \activecatcode
+ \catcode\dollarasciicode \activecatcode
+ \catcode\commentasciicode \activecatcode
+ \catcode\backslashasciicode \activecatcode
+ \catcode\circumflexasciicode\activecatcode
+ \catcode\underscoreasciicode\activecatcode
+ \catcode\leftbraceasciicode \activecatcode
+ \catcode\rightbraceasciicode\activecatcode
+ \catcode\barasciicode \activecatcode
+ \catcode\tildeasciicode \activecatcode
+\stopcatcodetable
+
+\startcatcodetable \xmlcatcodesr
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\ampersandasciicode \activecatcode
+ \catcode`\< \activecatcode
+ \catcode`\> \activecatcode
+ \catcode\hashasciicode \activecatcode
+ \catcode\dollarasciicode \activecatcode
+ \catcode\commentasciicode \activecatcode
+ \catcode\backslashasciicode \activecatcode
+ \catcode\circumflexasciicode\activecatcode
+ \catcode\underscoreasciicode\activecatcode
+ \catcode\leftbraceasciicode \activecatcode
+ \catcode\rightbraceasciicode\activecatcode
+ \catcode\barasciicode \activecatcode
+ \catcode\tildeasciicode \activecatcode
+\stopcatcodetable
+
+%D Next we hook in some active character definitions.
+
+\letcatcodecommand \xmlcatcodesn \ampersandasciicode \relax
+\letcatcodecommand \xmlcatcodesn `\< \relax
+
+\letcatcodecommand \xmlcatcodese \ampersandasciicode \relax
+\letcatcodecommand \xmlcatcodese `\< \relax
+
+\letcatcodecommand \xmlcatcodesr \ampersandasciicode \relax
+\letcatcodecommand \xmlcatcodesr `\< \relax
+
+\letcatcodecommand \xmlcatcodese \hashasciicode \relax
+\letcatcodecommand \xmlcatcodese \dollarasciicode \relax
+\letcatcodecommand \xmlcatcodese \commentasciicode \relax
+\letcatcodecommand \xmlcatcodese \backslashasciicode \relax
+\letcatcodecommand \xmlcatcodese \circumflexasciicode \relax
+\letcatcodecommand \xmlcatcodese \underscoreasciicode \relax
+\letcatcodecommand \xmlcatcodese \leftbraceasciicode \relax
+\letcatcodecommand \xmlcatcodese \rightbraceasciicode \relax
+\letcatcodecommand \xmlcatcodese \barasciicode \relax
+\letcatcodecommand \xmlcatcodese \tildeasciicode \relax
+
+\letcatcodecommand \xmlcatcodesr \hashasciicode \relax
+\letcatcodecommand \xmlcatcodesr \dollarasciicode \relax
+\letcatcodecommand \xmlcatcodesr \commentasciicode \relax
+\letcatcodecommand \xmlcatcodesr \backslashasciicode \relax
+\letcatcodecommand \xmlcatcodesr \circumflexasciicode \relax
+\letcatcodecommand \xmlcatcodesr \underscoreasciicode \relax
+\letcatcodecommand \xmlcatcodesr \leftbraceasciicode \relax
+\letcatcodecommand \xmlcatcodesr \rightbraceasciicode \relax
+\letcatcodecommand \xmlcatcodesr \barasciicode \relax
+\letcatcodecommand \xmlcatcodesr \tildeasciicode \relax
+
+\let\xmlcatcodes \xmlcatcodesn % beware, in mkiv we use \notcatcodes
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/catc-xml.mkiv b/Master/texmf-dist/tex/context/base/catc-xml.mkiv
new file mode 100644
index 00000000000..1f11d353a27
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/catc-xml.mkiv
@@ -0,0 +1,133 @@
+%D \module
+%D [ file=catc-xml,
+%D version=2006.09.18,
+%D title=\CONTEXT\ Catcode Macros,
+%D subtitle=\XML\ Catcode Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Catcode Regimes / XML}
+
+\ifdefined \xmlcatcodesn \else \newcatcodetable \xmlcatcodesn \fi % normal
+\ifdefined \xmlcatcodese \else \newcatcodetable \xmlcatcodese \fi % entitle
+\ifdefined \xmlcatcodesr \else \newcatcodetable \xmlcatcodesr \fi % reduce
+
+\startcatcodetable \xmlcatcodesn
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\ampersandasciicode \activecatcode
+ \catcode`\< \activecatcode
+ \catcode`\> \othercatcode
+ \catcode`\" \othercatcode % probably not needed any more
+ \catcode`\/ \othercatcode % probably not needed any more
+ \catcode`\' \othercatcode % probably not needed any more
+ \catcode\tildeasciicode \othercatcode % probably not needed any more
+ \catcode\hashasciicode \othercatcode % probably not needed any more
+ \catcode\backslashasciicode \othercatcode % probably not needed any more
+\stopcatcodetable
+
+\startcatcodetable \xmlcatcodese
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\ampersandasciicode \activecatcode
+ \catcode`\< \activecatcode
+ \catcode`\> \activecatcode
+ \catcode\hashasciicode \activecatcode
+ \catcode\dollarasciicode \activecatcode
+ \catcode\commentasciicode \activecatcode
+ \catcode\backslashasciicode \activecatcode
+ \catcode\circumflexasciicode\activecatcode
+ \catcode\underscoreasciicode\activecatcode
+ \catcode\leftbraceasciicode \activecatcode
+ \catcode\rightbraceasciicode\activecatcode
+ \catcode\barasciicode \activecatcode
+ \catcode\tildeasciicode \activecatcode
+\stopcatcodetable
+
+\startcatcodetable \xmlcatcodesr
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode \endoflinecatcode
+ \catcode\formfeedasciicode \endoflinecatcode
+ \catcode\spaceasciicode \spacecatcode
+ \catcode\endoffileasciicode \ignorecatcode
+ \catcode\ampersandasciicode \activecatcode
+ \catcode`\< \activecatcode
+ \catcode`\> \activecatcode
+ \catcode\hashasciicode \activecatcode
+ \catcode\dollarasciicode \activecatcode
+ \catcode\commentasciicode \activecatcode
+ \catcode\backslashasciicode \activecatcode
+ \catcode\circumflexasciicode\activecatcode
+ \catcode\underscoreasciicode\activecatcode
+ \catcode\leftbraceasciicode \activecatcode
+ \catcode\rightbraceasciicode\activecatcode
+ \catcode\barasciicode \activecatcode
+ \catcode\tildeasciicode \activecatcode
+\stopcatcodetable
+
+%D Next we hook in some active character definitions.
+
+\letcatcodecommand \xmlcatcodesn \ampersandasciicode \relax
+\letcatcodecommand \xmlcatcodesn `\< \relax
+
+\letcatcodecommand \xmlcatcodese \ampersandasciicode \relax
+\letcatcodecommand \xmlcatcodese `\< \relax
+
+\letcatcodecommand \xmlcatcodesr \ampersandasciicode \relax
+\letcatcodecommand \xmlcatcodesr `\< \relax
+
+\letcatcodecommand \xmlcatcodese \hashasciicode \relax
+\letcatcodecommand \xmlcatcodese \dollarasciicode \relax
+\letcatcodecommand \xmlcatcodese \commentasciicode \relax
+\letcatcodecommand \xmlcatcodese \backslashasciicode \relax
+\letcatcodecommand \xmlcatcodese \circumflexasciicode \relax
+\letcatcodecommand \xmlcatcodese \underscoreasciicode \relax
+\letcatcodecommand \xmlcatcodese \leftbraceasciicode \relax
+\letcatcodecommand \xmlcatcodese \rightbraceasciicode \relax
+\letcatcodecommand \xmlcatcodese \barasciicode \relax
+\letcatcodecommand \xmlcatcodese \tildeasciicode \relax
+
+\letcatcodecommand \xmlcatcodesr \hashasciicode \relax
+\letcatcodecommand \xmlcatcodesr \dollarasciicode \relax
+\letcatcodecommand \xmlcatcodesr \commentasciicode \relax
+\letcatcodecommand \xmlcatcodesr \backslashasciicode \relax
+\letcatcodecommand \xmlcatcodesr \circumflexasciicode \relax
+\letcatcodecommand \xmlcatcodesr \underscoreasciicode \relax
+\letcatcodecommand \xmlcatcodesr \leftbraceasciicode \relax
+\letcatcodecommand \xmlcatcodesr \rightbraceasciicode \relax
+\letcatcodecommand \xmlcatcodesr \barasciicode \relax
+\letcatcodecommand \xmlcatcodesr \tildeasciicode \relax
+
+\let\xmlcatcodes \xmlcatcodesn % beware, in mkiv we use \notcatcodes
+
+%D We register the catcodetables at the \LUA\ end where some further
+%D initializations take place.
+
+\ctxlua {
+ characters.define(
+ { % letter catcodes
+ \number\xmlcatcodesn,
+ \number\xmlcatcodese,
+ \number\xmlcatcodesr,
+ },
+ { % activate catcodes
+ \number\xmlcatcodesn,
+ \number\xmlcatcodese,
+ \number\xmlcatcodesr,
+ }
+ )
+ catcodes.register("xmlcatcodes",\number\xmlcatcodes)
+}
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/char-act.mkiv b/Master/texmf-dist/tex/context/base/char-act.mkiv
index 2dc7823f0bf..1045d59758c 100644
--- a/Master/texmf-dist/tex/context/base/char-act.mkiv
+++ b/Master/texmf-dist/tex/context/base/char-act.mkiv
@@ -49,12 +49,12 @@
\def\controlspace{\hbox{\char32}} % rather tex
\def\normalspace { }
-\def\normalspaces{\catcode`\ =\@@space}
+\def\normalspaces{\catcode\spaceasciicode\spacecatcode}
\bgroup
-\catcode`\ =\@@active
-\gdef\obeyspaces{\catcode`\ =\@@active\def {\obeyedspace}}
-\gdef\setcontrolspaces{\catcode`\ =\@@active\def {\controlspace}}
+\catcode\spaceasciicode\activecatcode
+\gdef\obeyspaces{\catcode\spaceasciicode\activecatcode\def {\obeyedspace}}
+\gdef\setcontrolspaces{\catcode\spaceasciicode\activecatcode\def {\controlspace}}
\egroup
%D \macros
@@ -66,27 +66,44 @@
%D \NEWPAGE\ character locally, we redefine the meaning of
%D this (often already) active character.
-\catcode`\^^L=\@@active \def^^L{\par}
+% \bgroup \permitcircumflexescape
+
+% \catcode\formfeedasciicode\activecatcode
+
+% \gdef^^L{\par}
+
+% \egroup
+
+\expandafter\def\activeformfeedtoken{\par}
%D The following indirect definitions enable us to implement
%D all kind of \type{\obeyed} handlers.
-\bgroup
+% \bgroup \permitcircumflexescape
-\catcode`\^^I=\@@active
-\catcode`\^^M=\@@active
-\catcode`\^^L=\@@active
+% \catcode\tabasciicode \activecatcode
+% \catcode\endoflineasciicode\activecatcode
+% \catcode\formfeedasciicode \activecatcode
-\gdef\obeytabs {\catcode`\^^I=\@@active\def^^I{\obeyedtab}}
-\gdef\obeylines {\catcode`\^^M=\@@active\def^^M{\obeyedline}}
-\gdef\obeypages {\catcode`\^^L=\@@active\def^^L{\obeyedpage}}
+% \gdef\obeytabs {\catcode\tabasciicode \activecatcode\def^^I{\obeyedtab }}
+% \gdef\obeylines {\catcode\endoflineasciicode\activecatcode\def^^M{\obeyedline}}
+% \gdef\obeypages {\catcode\formfeedasciicode \activecatcode\def^^L{\obeyedpage}}
-\gdef\ignoretabs {\catcode`\^^I=\@@active\def^^I{\obeyedspace}}
-\gdef\ignorelines {\catcode`\^^M=\@@active\def^^M{\obeyedspace}}
-\gdef\ignorepages {\catcode`\^^L=\@@ignore} % \@@active\def^^L{\obeyedline}}
-\gdef\ignoreeofs {\catcode`\^^Z=\@@ignore}
+% \gdef\ignoretabs {\catcode\tabasciicode \activecatcode\def^^I{\obeyedspace}}
+% \gdef\ignorelines{\catcode\endoflineasciicode\activecatcode\def^^M{\obeyedspace}}
+% \gdef\ignorepages{\catcode\formfeedasciicode \ignorecatcode}
+% \gdef\ignoreeofs {\catcode\endoffileasciicode\ignorecatcode}
-\egroup
+% \egroup
+
+\def\obeytabs {\catcode\tabasciicode \activecatcode\expandafter\def\activetabtoken {\obeyedtab }}
+\def\obeylines {\catcode\endoflineasciicode\activecatcode\expandafter\def\activeendoflinetoken{\obeyedline}}
+\def\obeypages {\catcode\formfeedasciicode \activecatcode\expandafter\def\activeformfeedtoken {\obeyedpage}}
+
+\def\ignoretabs {\catcode\tabasciicode \activecatcode\expandafter\def\activetabtoken {\obeyedspace}}
+\def\ignorelines{\catcode\endoflineasciicode\activecatcode\expandafter\def\activeendoflinetoken{\obeyedspace}}
+\def\ignorepages{\catcode\formfeedasciicode \ignorecatcode}
+\def\ignoreeofs {\catcode\endoffileasciicode\ignorecatcode}
%D \macros
%D {naturaltextext}
@@ -102,19 +119,6 @@
\prettynaturalfont{\scantextokens\expandafter{\ascii}\ifhmode\unskip\fi}%
\egroup}
-%D What-a-mess:
-
-% \def\normalspacecodes
-% {\catcode`\^^I = 10
-% \catcode`\^^M = 5
-% \catcode`\^^L = 5
-% \catcode`\ = 10
-% \catcode`\^^Z = 9 }
-
-% \appendtoks
-% \normalspacecodes
-% \to \everybeforeoutput
-
\endinput \protect
% obsolete (old hack for idris)
diff --git a/Master/texmf-dist/tex/context/base/char-cjk.lua b/Master/texmf-dist/tex/context/base/char-cjk.lua
new file mode 100644
index 00000000000..067371c6478
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/char-cjk.lua
@@ -0,0 +1,366 @@
+if not modules then modules = { } end modules ['char-cjk'] = {
+ 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"
+}
+
+local setmetatable = setmetatable
+local insert = table.insert
+local floor = math.floor
+local format = string.format
+local utfchar = utf.char
+
+local ranges = characters.ranges
+
+-- Hangul Syllable
+
+-- The following conversion is taken from unicode.org/reports/tr15/tr15-23.html#Hangul
+-- but adapted to our needs.
+
+-- local SBase = 0xAC00
+--
+-- local LBase, LCount = 0x1100, 19
+-- local VBase, VCount = 0x1161, 21
+-- local TBase, TCount = 0x11A7, 28
+--
+-- local NCount = VCount * TCount
+-- local SCount = LCount * NCount
+--
+-- local function decomposed(unicode)
+-- local SIndex = unicode - SBase
+-- if SIndex >= 0 and SIndex < SCount then
+-- local lead_consonant = LBase + floor( SIndex / NCount)
+-- local medial_vowel = VBase + floor((SIndex % NCount) / TCount)
+-- local tail_consonant = TBase + SIndex % TCount
+-- if tail_consonant ~= TBase then
+-- return lead_consonant, medial_vowel, tail_consonant
+-- else
+-- return lead_consonant, medial_vowel
+-- end
+-- end
+-- end
+--
+-- Lua will optimize the inline constants so the next variant is
+-- 10% faster. In practice this will go unnoticed, but it's also less
+-- code, so let's do it. Pushing the constant section into the
+-- function body saves 5%.
+
+local function decomposed(unicode)
+ local index = unicode - 0xAC00
+ if index >= 0 and index < 19 * 21 * 28 then
+ local lead_consonant = 0x1100 + floor( index / (21 * 28))
+ local medial_vowel = 0x1161 + floor((index % (21 * 28)) / 28)
+ local tail_consonant = 0x11A7 + index % 28
+ if tail_consonant ~= 0x11A7 then
+ return lead_consonant, medial_vowel, tail_consonant
+ else
+ return lead_consonant, medial_vowel
+ end
+ end
+end
+
+local lead_consonants = { [0] =
+ "G", "GG", "N", "D", "DD", "R", "M", "B", "BB",
+ "S", "SS", "", "J", "JJ", "C", "K", "T", "P", "H"
+}
+
+local medial_vowels = { [0] =
+ "A", "AE", "YA", "YAE", "EO", "E", "YEO", "YE", "O",
+ "WA", "WAE", "OE", "YO", "U", "WEO", "WE", "WI",
+ "YU", "EU", "YI", "I"
+}
+
+local tail_consonants = { [0] =
+ "", "G", "GG", "GS", "N", "NJ", "NH", "D", "L", "LG", "LM",
+ "LB", "LS", "LT", "LP", "LH", "M", "B", "BS",
+ "S", "SS", "NG", "J", "C", "K", "T", "P", "H"
+}
+
+-- local function description(unicode)
+-- local index = unicode - 0xAC00
+-- if index >= 0 and index < 19 * 21 * 28 then
+-- local lead_consonant = floor( index / NCount)
+-- local medial_vowel = floor((index % NCount) / TCount)
+-- local tail_consonant = index % TCount
+-- return format(
+-- "HANGUL SYLLABLE %s%s%s",
+-- lead_consonants[lead_consonant],
+-- medial_vowels [medial_vowel ],
+-- tail_consonants[tail_consonant]
+-- )
+-- end
+-- end
+
+local function description(unicode)
+ local index = unicode - 0xAC00
+ if index >= 0 and index < 19 * 21 * 28 then
+ local lead_consonant = floor( index / (21 * 28))
+ local medial_vowel = floor((index % (21 * 28)) / 28)
+ local tail_consonant = index % 28
+ return format(
+ "HANGUL SYLLABLE %s%s%s",
+ lead_consonants[lead_consonant],
+ medial_vowels [medial_vowel ],
+ tail_consonants[tail_consonant]
+ )
+ end
+end
+
+-- so far
+
+-- We have a [lead consonant,medial vowel,tail consonant] where the last one
+-- is optional. For sort ranges we need the first one but some are collapsed.
+-- Beware, we map to modern so the font should support it.
+
+local function leadconsonant(unicode)
+ return
+ -- unicode < 0xAC00 and nil -- original
+ -- unicode > 0xD7AF and nil or -- original
+ unicode >= 0xD558 and 0x314E or -- 하 => ㅎ
+ unicode >= 0xD30C and 0x314D or -- 파 => ㅍ
+ unicode >= 0xD0C0 and 0x314C or -- 타 => ㅌ
+ unicode >= 0xCE74 and 0x314B or -- 카 => ㅋ
+ unicode >= 0xCC28 and 0x314A or -- 차 => ㅊ
+ unicode >= 0xC790 and 0x3148 or -- 자 => ㅈ
+ unicode >= 0xC544 and 0x3147 or -- 아 => ㅇ
+ unicode >= 0xC0AC and 0x3145 or -- 사 => ㅅ
+ unicode >= 0xBC14 and 0x3142 or -- 바 => ㅂ
+ unicode >= 0xB9C8 and 0x3141 or -- 마 => ㅁ
+ unicode >= 0xB77C and 0x3139 or -- 라 => ㄹ
+ unicode >= 0xB2E4 and 0x3137 or -- 다 => ㄷ
+ unicode >= 0xB098 and 0x3134 or -- 나 => ㄴ
+ unicode >= 0xAC00 and 0x3131 or -- 가 => ㄱ
+ nil -- can't happen
+end
+
+local remapped = { -- this might be merged into char-def.lua
+ [0x1100] = 0x3131, -- G
+ [0x1101] = 0x3132, -- GG
+ [0x1102] = 0x3134, -- N
+ [0x1103] = 0x3137, -- D
+ [0x1104] = 0x3138, -- DD
+ [0x1105] = 0x3139, -- R
+ -- [0X111A] = 0x3140, -- LH used for last sound
+ [0x1106] = 0x3141, -- M
+ [0x1107] = 0x3142, -- B
+ [0x1108] = 0x3143, -- BB
+ -- [0x1121] = 0x3144, -- BS used for last sound
+ [0x1109] = 0x3145, -- S
+ [0x110A] = 0x3146, -- SS
+ [0x110B] = 0x3147, -- (IEUNG) no sound but has form
+ [0x110C] = 0x3148, -- J
+ [0x110D] = 0x3149, -- JJ
+ [0x110E] = 0x314A, -- C
+ [0x110F] = 0x314B, -- K
+ [0x1110] = 0x314C, -- T
+ [0x1111] = 0x314D, -- P
+ [0x1112] = 0x314E, -- H
+
+ [0x1161] = 0x314F, -- A
+ [0x1162] = 0x3150, -- AE
+ [0x1163] = 0x3151, -- YA
+ [0x1164] = 0x3152, -- YAE
+ [0x1165] = 0x3153, -- EO
+ [0x1166] = 0x3154, -- E
+ [0x1167] = 0x3155, -- YEO
+ [0x1168] = 0x3156, -- YE
+ [0x1169] = 0x3157, -- O
+ [0x116A] = 0x3158, -- WA
+ [0x116B] = 0x3159, -- WAE
+ [0x116C] = 0x315A, -- OE
+ [0x116D] = 0x315B, -- YO
+ [0x116E] = 0x315C, -- U
+ [0x116F] = 0x315D, -- WEO
+ [0x1170] = 0x315E, -- WE
+ [0x1171] = 0x315F, -- WI
+ [0x1172] = 0x3160, -- YU
+ [0x1173] = 0x3161, -- EU
+ [0x1174] = 0x3162, -- YI
+ [0x1175] = 0x3163, -- I
+
+ [0x11A8] = 0x3131, -- G
+ [0x11A9] = 0x3132, -- GG
+ [0x11AA] = 0x3133, -- GS
+ [0x11AB] = 0x3134, -- N
+ [0x11AC] = 0x3135, -- NJ
+ [0x11AD] = 0x3136, -- NH
+ [0x11AE] = 0x3137, -- D
+ [0x11AF] = 0x3139, -- L
+ [0x11B0] = 0x313A, -- LG
+ [0x11B1] = 0x313B, -- LM
+ [0x11B2] = 0x313C, -- LB
+ [0x11B3] = 0x313D, -- LS
+ [0x11B4] = 0x313E, -- LT
+ [0x11B5] = 0x313F, -- LP
+ [0x11B6] = 0x3140, -- LH
+ [0x11B7] = 0x3141, -- M
+ [0x11B8] = 0x3142, -- B
+ [0x11B9] = 0x3144, -- BS
+ [0x11BA] = 0x3145, -- S
+ [0x11BB] = 0x3146, -- SS
+ [0x11BC] = 0x3147, -- NG
+ [0x11BD] = 0x3148, -- J
+ [0x11BE] = 0x314A, -- C
+ [0x11BF] = 0x314B, -- K
+ [0x11C0] = 0x314C, -- T
+ [0x11C1] = 0x314D, -- P
+ [0x11C2] = 0x314E, -- H
+}
+
+characters.hangul = {
+ decomposed = decomposed,
+ description = description,
+ leadconsonant = leadconsonant,
+ remapped = remapped,
+}
+
+-- so far
+
+local hangul_syllable_basetable = {
+ category = "lo",
+ cjkwd = "w",
+ description = "<Hangul Syllable>",
+ direction = "l",
+ linebreak = "h2",
+}
+
+--~ local hangul_syllable_metatable = {
+--~ __index = function(t,k)
+--~ local u = t.unicodeslot
+--~ if k == "fscode" then
+--~ -- no need to cache this as we normally use fscodes
+--~ return leadconsonant(u)
+--~ elseif k == "shcode" then
+--~ return { decomposed(u) }
+--~ elseif k == "specials" then
+--~ return { "char", decomposed(u) }
+--~ elseif k == "description" then
+--~ return description(u)
+--~ else
+--~ return hangul_syllable_basetable[k]
+--~ end
+--~ end
+--~ }
+
+local hangul_syllable_metatable = {
+ __index = function(t,k)
+ local u = t.unicodeslot
+ if k == "fscode" then
+ return leadconsonant(u)
+ elseif k == "decomposed" then
+ return { decomposed(u) }
+ elseif k == "specials" then
+ return { "char", decomposed(u) }
+ elseif k == "description" then
+ return description(u)
+ else
+ return hangul_syllable_basetable[k]
+ end
+ end
+}
+
+local hangul_syllable_extender = function(k,v)
+ local t = {
+ unicodeslot = k,
+ }
+ setmetatable(t,hangul_syllable_metatable)
+ return t
+end
+
+local hangul_syllable_range = {
+ first = 0xAC00,
+ last = 0xD7A3,
+ extender = hangul_syllable_extender,
+}
+
+setmetatable(hangul_syllable_range, hangul_syllable_metatable)
+
+-- CJK Ideograph
+
+local cjk_ideograph_metatable = {
+ __index = {
+ category = "lo",
+ cjkwd = "w",
+ description = "<CJK Ideograph>",
+ direction = "l",
+ linebreak = "id",
+ }
+}
+
+local cjk_ideograph_extender = function(k,v)
+ local t = {
+ -- shcode = shcode,
+ unicodeslot = k,
+ }
+ setmetatable(t,cjk_ideograph_metatable)
+ return t
+end
+
+local cjk_ideograph_range = {
+ first = 0x4E00,
+ last = 0x9FBB,
+ extender = cjk_ideograph_extender,
+}
+
+-- CJK Ideograph Extension A
+
+local cjk_ideograph_extension_a_metatable = {
+ __index = {
+ category = "lo",
+ cjkwd = "w",
+ description = "<CJK Ideograph Extension A>",
+ direction = "l",
+ linebreak = "id",
+ }
+}
+
+local cjk_ideograph_extension_a_extender = function(k,v)
+ local t = {
+ -- shcode = shcode,
+ unicodeslot = k,
+ }
+ setmetatable(t,cjk_ideograph_extension_a_metatable)
+ return t
+end
+
+local cjk_ideograph_extension_a_range = {
+ first = 0x3400,
+ last = 0x4DB5,
+ extender = cjk_ideograph_extension_a_extender,
+}
+
+-- CJK Ideograph Extension B
+
+local cjk_ideograph_extension_b_metatable = {
+ __index = {
+ category = "lo",
+ cjkwd = "w",
+ description = "<CJK Ideograph Extension B>",
+ direction = "l",
+ linebreak = "id",
+ }
+}
+
+local cjk_ideograph_extension_b_extender = function(k,v)
+ local t = {
+ -- shcode = shcode,
+ unicodeslot = k,
+ }
+ setmetatable(t,cjk_ideograph_extension_b_metatable)
+ return t
+end
+
+local cjk_ideograph_extension_b_range = {
+ first = 0x20000,
+ last = 0x2A6D6,
+ extender = cjk_ideograph_extension_b_extender,
+}
+
+-- Ranges
+
+insert(ranges, hangul_syllable_range)
+insert(ranges, cjk_ideograph_range)
+insert(ranges, cjk_ideograph_extension_a_range)
+insert(ranges, cjk_ideograph_extension_b_range)
diff --git a/Master/texmf-dist/tex/context/base/char-cmp.lua b/Master/texmf-dist/tex/context/base/char-cmp.lua
deleted file mode 100644
index c7deb79010f..00000000000
--- a/Master/texmf-dist/tex/context/base/char-cmp.lua
+++ /dev/null
@@ -1,268 +0,0 @@
-if not modules then modules = { } end modules ['char-cmp'] = {
- version = 1.001,
- comment = "companion to char-ini.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local utf = unicode.utf8
-local unpack = unpack or table.unpack
-
-characters = characters or { }
-characters.uncomposed = characters.uncomposed or { }
-
---[[ldx--
-<p>The code defined here may move to the big character table.</p>
---ldx]]--
-
-characters.basedigits = {
- ['zero'] = 48, ['one'] = 49,
- ['two'] = 50, ['three'] = 51,
- ['four'] = 52, ['five'] = 53,
- ['six'] = 54, ['seven'] = 55,
- ['eight'] = 56, ['nine'] = 57
-}
-
---[[ldx--
-<p>The next three tables can for instance be be used to enhance
-kerning tables that lack kerning pairs for these special characters.
-Of course they may come in handy elsewhere too</p>
---ldx]]--
-
--- we can use shcodes, but then we also need slcode and srcode
---
--- AEligature
--- => slcode == ub('A')
--- => srcode == ub('E')
--- or
--- => shcode == { ub('A'), ub('E') }
--- => reduction = "AE"
---
--- eacute
--- => shcode == ub('A')
--- or
--- => shcode == { ub('a') }
--- => reduction = "a"
-
-characters.uncomposed.left = {
- AEligature = "A", aeligature = "a",
- OEligature = "O", oeligature = "o",
- IJligature = "I", ijligature = "i",
- AE = "A", ae = "a",
- OE = "O", oe = "o",
- IJ = "I", ij = "i",
- Ssharp = "S", ssharp = "s",
-}
-
-characters.uncomposed.right = {
- AEligature = "E", aeligature = "e",
- OEligature = "E", oeligature = "e",
- IJligature = "J", ijligature = "j",
- AE = "E", ae = "e",
- OE = "E", oe = "e",
- IJ = "J", ij = "j",
- Ssharp = "S", ssharp = "s",
-}
-
-characters.uncomposed.both = {
- Acircumflex = "A", acircumflex = "a",
- Ccircumflex = "C", ccircumflex = "c",
- Ecircumflex = "E", ecircumflex = "e",
- Gcircumflex = "G", gcircumflex = "g",
- Hcircumflex = "H", hcircumflex = "h",
- Icircumflex = "I", icircumflex = "i",
- Jcircumflex = "J", jcircumflex = "j",
- Ocircumflex = "O", ocircumflex = "o",
- Scircumflex = "S", scircumflex = "s",
- Ucircumflex = "U", ucircumflex = "u",
- Wcircumflex = "W", wcircumflex = "w",
- Ycircumflex = "Y", ycircumflex = "y",
-
- Agrave = "A", agrave = "a",
- Egrave = "E", egrave = "e",
- Igrave = "I", igrave = "i",
- Ograve = "O", ograve = "o",
- Ugrave = "U", ugrave = "u",
- Ygrave = "Y", ygrave = "y",
-
- Atilde = "A", atilde = "a",
- Itilde = "I", itilde = "i",
- Otilde = "O", otilde = "o",
- Utilde = "U", utilde = "u",
- Ntilde = "N", ntilde = "n",
-
- Adiaeresis = "A", adiaeresis = "a", Adieresis = "A", adieresis = "a",
- Ediaeresis = "E", ediaeresis = "e", Edieresis = "E", edieresis = "e",
- Idiaeresis = "I", idiaeresis = "i", Idieresis = "I", idieresis = "i",
- Odiaeresis = "O", odiaeresis = "o", Odieresis = "O", odieresis = "o",
- Udiaeresis = "U", udiaeresis = "u", Udieresis = "U", udieresis = "u",
- Ydiaeresis = "Y", ydiaeresis = "y", Ydieresis = "Y", ydieresis = "y",
-
- Aacute = "A", aacute = "a",
- Cacute = "C", cacute = "c",
- Eacute = "E", eacute = "e",
- Iacute = "I", iacute = "i",
- Lacute = "L", lacute = "l",
- Nacute = "N", nacute = "n",
- Oacute = "O", oacute = "o",
- Racute = "R", racute = "r",
- Sacute = "S", sacute = "s",
- Uacute = "U", uacute = "u",
- Yacute = "Y", yacute = "y",
- Zacute = "Z", zacute = "z",
-
- Dstroke = "D", dstroke = "d",
- Hstroke = "H", hstroke = "h",
- Tstroke = "T", tstroke = "t",
-
- Cdotaccent = "C", cdotaccent = "c",
- Edotaccent = "E", edotaccent = "e",
- Gdotaccent = "G", gdotaccent = "g",
- Idotaccent = "I", idotaccent = "i",
- Zdotaccent = "Z", zdotaccent = "z",
-
- Amacron = "A", amacron = "a",
- Emacron = "E", emacron = "e",
- Imacron = "I", imacron = "i",
- Omacron = "O", omacron = "o",
- Umacron = "U", umacron = "u",
-
- Ccedilla = "C", ccedilla = "c",
- Kcedilla = "K", kcedilla = "k",
- Lcedilla = "L", lcedilla = "l",
- Ncedilla = "N", ncedilla = "n",
- Rcedilla = "R", rcedilla = "r",
- Scedilla = "S", scedilla = "s",
- Tcedilla = "T", tcedilla = "t",
-
- Ohungarumlaut = "O", ohungarumlaut = "o",
- Uhungarumlaut = "U", uhungarumlaut = "u",
-
- Aogonek = "A", aogonek = "a",
- Eogonek = "E", eogonek = "e",
- Iogonek = "I", iogonek = "i",
- Uogonek = "U", uogonek = "u",
-
- Aring = "A", aring = "a",
- Uring = "U", uring = "u",
-
- Abreve = "A", abreve = "a",
- Ebreve = "E", ebreve = "e",
- Gbreve = "G", gbreve = "g",
- Ibreve = "I", ibreve = "i",
- Obreve = "O", obreve = "o",
- Ubreve = "U", ubreve = "u",
-
- Ccaron = "C", ccaron = "c",
- Dcaron = "D", dcaron = "d",
- Ecaron = "E", ecaron = "e",
- Lcaron = "L", lcaron = "l",
- Ncaron = "N", ncaron = "n",
- Rcaron = "R", rcaron = "r",
- Scaron = "S", scaron = "s",
- Tcaron = "T", tcaron = "t",
- Zcaron = "Z", zcaron = "z",
-
- dotlessI = "I", dotlessi = "i",
- dotlessJ = "J", dotlessj = "j",
-
- AEligature = "AE", aeligature = "ae", AE = "AE", ae = "ae",
- OEligature = "OE", oeligature = "oe", OE = "OE", oe = "oe",
- IJligature = "IJ", ijligature = "ij", IJ = "IJ", ij = "ij",
-
- Lstroke = "L", lstroke = "l", Lslash = "L", lslash = "l",
- Ostroke = "O", ostroke = "o", Oslash = "O", oslash = "o",
-
- Ssharp = "SS", ssharp = "ss",
-
- Aumlaut = "A", aumlaut = "a",
- Eumlaut = "E", eumlaut = "e",
- Iumlaut = "I", iumlaut = "i",
- Oumlaut = "O", oumlaut = "o",
- Uumlaut = "U", uumlaut = "u",
-
-}
-
---[[ldx--
-<p>The following function is used in the indexing code, where
-we need some sort of default fallback mapping.</p>
---ldx]]--
-
-function characters.uncompose(n) -- n == string|number, returns string
- local cdn
- if type(n) == "string" then
- cdn = characters.data[utf.byte(n)]
- else
- cdn = characters.data[n]
- end
- -- return characters.shape(n)
- if cdn then
- local shcode = cdn.shcode
- if not shcode then
- return characters.uncomposed.both[cdn.contextname] or n
- elseif type(shcode) == "table" then
- return utf.char(unpack(cdn.shcode))
- else
- return utf.char(cdn.shcode)
- end
- end
- return n
-end
-
---[[ldx--
-<p>Only characters with a code smaller than 128 make sense,
-anything larger is encoding dependent. An interesting complication
-is that a character can be in an encoding twice but is hashed
-once.</p>
---ldx]]--
-
-characters.ligatures = {
- ['f'] = {
- { 'f', 'ff' },
- { 'i', 'fi' },
- { 'l', 'fl' },
- },
- ['ff'] = {
- { 'i', 'ffi' }
- },
- ['fi'] = {
- { 'i', 'fii' }
- },
- ['fl'] = {
- { 'i', 'fli' }
- },
- ['s'] = {
- { 't', 'st' }
- },
- ['i'] = {
- { 'j', 'ij' }
- },
-}
-
-characters.texligatures = {
- -- ['space'] = {
- -- { 'L', 'Lslash' },
- -- { 'l', 'lslash' }
- -- },
- -- ['question'] = {
- -- { 'quoteleft', 'questiondown' }
- -- },
- -- ['exclam'] = {
- -- { 'quoteleft', 'exclamdown' }
- -- },
- ['quoteleft'] = {
- { 'quoteleft', 'quotedblleft' }
- },
- ['quoteright'] = {
- { 'quoteright', 'quotedblright' }
- },
- ['hyphen'] = {
- { 'hyphen', 'endash' }
- },
- ['endash'] = {
- { 'hyphen', 'emdash' }
- }
-}
-
---~ U+2019: right single quotation mark / quoteright
diff --git a/Master/texmf-dist/tex/context/base/char-def.lua b/Master/texmf-dist/tex/context/base/char-def.lua
index b7abee0fbf6..c830774cbfa 100644
--- a/Master/texmf-dist/tex/context/base/char-def.lua
+++ b/Master/texmf-dist/tex/context/base/char-def.lua
@@ -25,6 +25,7 @@ characters.data={
unicodeslot=0x0000,
},
{
+ adobename="controlSTX",
category="cc",
description="START OF HEADING",
direction="bn",
@@ -32,6 +33,7 @@ characters.data={
unicodeslot=0x0001,
},
{
+ adobename="controlSOT",
category="cc",
description="START OF TEXT",
direction="bn",
@@ -39,6 +41,7 @@ characters.data={
unicodeslot=0x0002,
},
{
+ adobename="controlETX",
category="cc",
description="END OF TEXT",
direction="bn",
@@ -46,6 +49,7 @@ characters.data={
unicodeslot=0x0003,
},
{
+ adobename="controlEOT",
category="cc",
description="END OF TRANSMISSION",
direction="bn",
@@ -53,6 +57,7 @@ characters.data={
unicodeslot=0x0004,
},
{
+ adobename="controlENQ",
category="cc",
description="ENQUIRY",
direction="bn",
@@ -60,6 +65,7 @@ characters.data={
unicodeslot=0x0005,
},
{
+ adobename="controlACK",
category="cc",
description="ACKNOWLEDGE",
direction="bn",
@@ -67,6 +73,7 @@ characters.data={
unicodeslot=0x0006,
},
{
+ adobename="controlBEL",
category="cc",
description="BELL",
direction="bn",
@@ -74,6 +81,7 @@ characters.data={
unicodeslot=0x0007,
},
{
+ adobename="controlBS",
category="cc",
description="BACKSPACE",
direction="bn",
@@ -81,6 +89,7 @@ characters.data={
unicodeslot=0x0008,
},
{
+ adobename="controlHT",
category="cc",
description="CHARACTER TABULATION",
direction="s",
@@ -88,6 +97,7 @@ characters.data={
unicodeslot=0x0009,
},
{
+ adobename="controlLF",
category="cc",
description="LINE FEED (LF)",
direction="b",
@@ -95,6 +105,7 @@ characters.data={
unicodeslot=0x000A,
},
{
+ adobename="controlVT",
category="cc",
description="LINE TABULATION",
direction="s",
@@ -102,6 +113,7 @@ characters.data={
unicodeslot=0x000B,
},
{
+ adobename="controlFF",
category="cc",
description="FORM FEED (FF)",
direction="ws",
@@ -109,6 +121,7 @@ characters.data={
unicodeslot=0x000C,
},
{
+ adobename="controlCR",
category="cc",
description="CARRIAGE RETURN (CR)",
direction="b",
@@ -116,6 +129,7 @@ characters.data={
unicodeslot=0x000D,
},
{
+ adobename="controlSO",
category="cc",
description="SHIFT OUT",
direction="bn",
@@ -123,6 +137,7 @@ characters.data={
unicodeslot=0x000E,
},
{
+ adobename="controlSI",
category="cc",
description="SHIFT IN",
direction="bn",
@@ -130,6 +145,7 @@ characters.data={
unicodeslot=0x000F,
},
{
+ adobename="controlDLE",
category="cc",
description="DATA LINK ESCAPE",
direction="bn",
@@ -137,6 +153,7 @@ characters.data={
unicodeslot=0x0010,
},
{
+ adobename="controlDC1",
category="cc",
description="DEVICE CONTROL ONE",
direction="bn",
@@ -144,6 +161,7 @@ characters.data={
unicodeslot=0x0011,
},
{
+ adobename="controlDC2",
category="cc",
description="DEVICE CONTROL TWO",
direction="bn",
@@ -151,6 +169,7 @@ characters.data={
unicodeslot=0x0012,
},
{
+ adobename="controlDC3",
category="cc",
description="DEVICE CONTROL THREE",
direction="bn",
@@ -158,6 +177,7 @@ characters.data={
unicodeslot=0x0013,
},
{
+ adobename="controlDC4",
category="cc",
description="DEVICE CONTROL FOUR",
direction="bn",
@@ -165,6 +185,7 @@ characters.data={
unicodeslot=0x0014,
},
{
+ adobename="controlNAK",
category="cc",
description="NEGATIVE ACKNOWLEDGE",
direction="bn",
@@ -172,6 +193,7 @@ characters.data={
unicodeslot=0x0015,
},
{
+ adobename="controlSYN",
category="cc",
description="SYNCHRONOUS IDLE",
direction="bn",
@@ -179,6 +201,7 @@ characters.data={
unicodeslot=0x0016,
},
{
+ adobename="controlETB",
category="cc",
description="END OF TRANSMISSION BLOCK",
direction="bn",
@@ -186,6 +209,7 @@ characters.data={
unicodeslot=0x0017,
},
{
+ adobename="controlCAN",
category="cc",
description="CANCEL",
direction="bn",
@@ -193,6 +217,7 @@ characters.data={
unicodeslot=0x0018,
},
{
+ adobename="controlEM",
category="cc",
description="END OF MEDIUM",
direction="bn",
@@ -200,6 +225,7 @@ characters.data={
unicodeslot=0x0019,
},
{
+ adobename="controlSUB",
category="cc",
description="SUBSTITUTE",
direction="bn",
@@ -207,6 +233,7 @@ characters.data={
unicodeslot=0x001A,
},
{
+ adobename="controlESC",
category="cc",
description="ESCAPE",
direction="bn",
@@ -214,6 +241,7 @@ characters.data={
unicodeslot=0x001B,
},
{
+ adobename="controlFS",
category="cc",
description="INFORMATION SEPARATOR FOUR",
direction="b",
@@ -221,6 +249,7 @@ characters.data={
unicodeslot=0x001C,
},
{
+ adobename="controlGS",
category="cc",
description="INFORMATION SEPARATOR THREE",
direction="b",
@@ -228,6 +257,7 @@ characters.data={
unicodeslot=0x001D,
},
{
+ adobename="controlRS",
category="cc",
description="INFORMATION SEPARATOR TWO",
direction="b",
@@ -235,6 +265,7 @@ characters.data={
unicodeslot=0x001E,
},
{
+ adobename="controlUS",
category="cc",
description="INFORMATION SEPARATOR ONE",
direction="s",
@@ -267,8 +298,8 @@ characters.data={
contextname="quotedbl",
description="QUOTATION MARK",
direction="on",
- mathclass="default",
linebreak="qu",
+ mathclass="default",
unicodeslot=0x0022,
},
{
@@ -372,10 +403,16 @@ characters.data={
description="COMMA",
direction="cs",
linebreak="is",
- mathclass="punctuation",
+ mathclass="punctuation", -- redundant
mathspec={
- { class="punctuation", name="textcomma" },
- { class="ord", name="mathcomma" },
+ {
+ class="punctuation",
+ name="textcomma",
+ },
+ {
+ class="ord",
+ name="mathcomma",
+ },
},
unicodeslot=0x002C,
},
@@ -398,9 +435,18 @@ characters.data={
linebreak="is",
mathclass="ord",
mathspec={
- { class="ord", name="mathperiod" },
- { class="punctuation", name="textperiod" },
- { class="punctuation", name="ldotp" },
+ {
+ class="ord",
+ name="mathperiod",
+ },
+ {
+ class="punctuation",
+ name="textperiod",
+ },
+ {
+ class="punctuation",
+ name="ldotp",
+ },
},
unicodeslot=0x002E,
},
@@ -519,12 +565,11 @@ characters.data={
adobename="colon",
category="po",
cjkwd="na",
+ comment="mathclass=punctuation,mathname=colon",
description="COLON",
direction="cs",
linebreak="is",
---~ mathclass="punctuation",
mathclass="relation",
--- mathname="colon",
unicodeslot=0x003A,
},
{
@@ -544,7 +589,7 @@ characters.data={
description="LESS-THAN SIGN",
direction="on",
linebreak="al",
- mathclass="binary",
+ mathclass="relation",
mathname="lt",
mirror=0x003E,
unicodeslot=0x003C,
@@ -553,10 +598,10 @@ characters.data={
adobename="equal",
category="sm",
cjkwd="na",
+ comment="mathclass=binary",
description="EQUALS SIGN",
direction="on",
linebreak="al",
---~ mathclass="binary",
mathclass="relation",
mathname="eq",
unicodeslot=0x003D,
@@ -568,7 +613,7 @@ characters.data={
description="GREATER-THAN SIGN",
direction="on",
linebreak="al",
- mathclass="binary",
+ mathclass="relation",
mathname="gt",
mirror=0x003C,
unicodeslot=0x003E,
@@ -685,6 +730,7 @@ characters.data={
adobename="I",
category="lu",
cjkwd="na",
+ contextname="dotlessI",
description="LATIN CAPITAL LETTER I",
direction="l",
lccode=0x0069,
@@ -696,6 +742,7 @@ characters.data={
adobename="J",
category="lu",
cjkwd="na",
+ contextname="dotlessJ",
description="LATIN CAPITAL LETTER J",
direction="l",
lccode=0x006A,
@@ -942,10 +989,10 @@ characters.data={
cjkwd="na",
contextname="textgrave",
description="GRAVE ACCENT",
- mathclass="accent",
- mathname="grave",
direction="on",
linebreak="al",
+ mathclass="accent",
+ mathname="grave",
unicodeslot=0x0060,
},
{
@@ -1244,25 +1291,40 @@ characters.data={
direction="on",
linebreak="op",
mathclass="open",
- mathname="lbrace", -- was false
+ mathname="lbrace",
mirror=0x007D,
unicodeslot=0x007B,
},
{
- adobename="bar",
+ adobename="verticalbar",
category="sm",
cjkwd="na",
+ comment="mathclass=binary,mathname=bar",
contextname="textbar",
description="VERTICAL LINE",
direction="on",
linebreak="ba",
mathspec={
--- { class="binary", name="bar" },
- { class="nothing", name="arrowvert" },
- { class="delimiter", name="vert" },
- { class="open", name="lvert" },
- { class="close", name="rvert" },
- { class="relation", name="mid" },
+ {
+ class="nothing",
+ name="arrowvert",
+ },
+ {
+ class="delimiter",
+ name="vert",
+ },
+ {
+ class="open",
+ name="lvert",
+ },
+ {
+ class="close",
+ name="rvert",
+ },
+ {
+ class="relation",
+ name="mid",
+ },
},
unicodeslot=0x007C,
},
@@ -1275,7 +1337,7 @@ characters.data={
direction="on",
linebreak="cl",
mathclass="close",
- mathname="rbrace", -- was false
+ mathname="rbrace",
mirror=0x007B,
unicodeslot=0x007D,
},
@@ -1290,6 +1352,7 @@ characters.data={
unicodeslot=0x007E,
},
{
+ adobename="controlDEL",
category="cc",
description="DELETE",
direction="bn",
@@ -1521,6 +1584,7 @@ characters.data={
unicodeslot=0x009F,
},
{
+ adobename="nonbreakingspace",
category="zs",
contextname="nobreakspace",
description="NO-BREAK SPACE",
@@ -1655,12 +1719,19 @@ characters.data={
direction="on",
linebreak="al",
mathspec={
- { class="ord", name="lnot" },
- { class="ord", name="neg" },
+ {
+ class="ord",
+ name="lnot",
+ },
+ {
+ class="ord",
+ name="neg",
+ },
},
unicodeslot=0x00AC,
},
{
+ adobename="softhyphen",
category="cf",
cjkwd="a",
contextname="softhyphen",
@@ -1715,6 +1786,7 @@ characters.data={
unicodeslot=0x00B1,
},
{
+ adobename="twosuperior",
category="no",
cjkwd="a",
contextname="twosuperior",
@@ -1725,6 +1797,7 @@ characters.data={
unicodeslot=0x00B2,
},
{
+ adobename="threesuperior",
category="no",
cjkwd="a",
contextname="threesuperior",
@@ -1748,7 +1821,7 @@ characters.data={
unicodeslot=0x00B4,
},
{
- adobename="mu",
+ adobename="mu1",
category="ll",
contextname="textmu",
description="MICRO SIGN",
@@ -1794,6 +1867,7 @@ characters.data={
unicodeslot=0x00B8,
},
{
+ adobename="onesuperior",
category="no",
cjkwd="a",
contextname="onesuperior",
@@ -2245,7 +2319,7 @@ characters.data={
description="LATIN SMALL LETTER SHARP S",
direction="l",
linebreak="al",
- uccodes={ 0x0053, 0x0053 },
+ uccode={ 0x0053, 0x0053 },
unicodeslot=0x00DF,
},
{
@@ -2330,7 +2404,7 @@ characters.data={
description="LATIN SMALL LETTER AE",
direction="l",
linebreak="al",
- shcode={ 0x00E6, 0x00EA },
+ shcode={ 0x0061, 0x0065 },
uccode=0x00C6,
unicodeslot=0x00E6,
},
@@ -2451,7 +2525,7 @@ characters.data={
adobename="eth",
category="ll",
cjkwd="a",
- --~ contextname="eth", -- AM: Should this be defined in text mode?
+ comment="contextname=eth",
description="LATIN SMALL LETTER ETH",
direction="l",
linebreak="al",
@@ -2838,7 +2912,7 @@ characters.data={
unicodeslot=0x010F,
},
{
- adobename="Dcroat",
+ adobename="Dslash",
category="lu",
contextname="Dstroke",
description="LATIN CAPITAL LETTER D WITH STROKE",
@@ -2849,7 +2923,7 @@ characters.data={
unicodeslot=0x0110,
},
{
- adobename="dcroat",
+ adobename="dmacron",
category="ll",
cjkwd="a",
contextname="dstroke",
@@ -3405,7 +3479,7 @@ characters.data={
unicodeslot=0x013E,
},
{
- adobename="Ldot",
+ adobename="Ldotaccent",
category="lu",
cjkwd="a",
contextname="Ldotmiddle",
@@ -3418,7 +3492,7 @@ characters.data={
unicodeslot=0x013F,
},
{
- adobename="ldot",
+ adobename="ldotaccent",
category="ll",
cjkwd="a",
contextname="ldotmiddle",
@@ -3529,7 +3603,7 @@ characters.data={
unicodeslot=0x0148,
},
{
- adobename="napostrophe",
+ adobename="quoterightn",
category="ll",
cjkwd="a",
contextname="napostrophe",
@@ -4176,7 +4250,7 @@ characters.data={
unicodeslot=0x017E,
},
{
- adobename="longs",
+ adobename="slong",
category="ll",
contextname="slong",
description="LATIN SMALL LETTER LONG S",
@@ -4187,6 +4261,7 @@ characters.data={
unicodeslot=0x017F,
},
{
+ adobename="bstroke",
category="ll",
contextname="bstroke",
description="LATIN SMALL LETTER B WITH STROKE",
@@ -4197,6 +4272,7 @@ characters.data={
unicodeslot=0x0180,
},
{
+ adobename="Bhook",
category="lu",
contextname="Bhook",
description="LATIN CAPITAL LETTER B WITH HOOK",
@@ -4207,6 +4283,7 @@ characters.data={
unicodeslot=0x0181,
},
{
+ adobename="Btopbar",
category="lu",
description="LATIN CAPITAL LETTER B WITH TOPBAR",
direction="l",
@@ -4216,6 +4293,7 @@ characters.data={
unicodeslot=0x0182,
},
{
+ adobename="btopbar",
category="ll",
description="LATIN SMALL LETTER B WITH TOPBAR",
direction="l",
@@ -4225,6 +4303,7 @@ characters.data={
unicodeslot=0x0183,
},
{
+ adobename="Tonesix",
category="lu",
description="LATIN CAPITAL LETTER TONE SIX",
direction="l",
@@ -4233,6 +4312,7 @@ characters.data={
unicodeslot=0x0184,
},
{
+ adobename="tonesix",
category="ll",
description="LATIN SMALL LETTER TONE SIX",
direction="l",
@@ -4241,6 +4321,7 @@ characters.data={
unicodeslot=0x0185,
},
{
+ adobename="Oopen",
category="lu",
description="LATIN CAPITAL LETTER OPEN O",
direction="l",
@@ -4249,6 +4330,7 @@ characters.data={
unicodeslot=0x0186,
},
{
+ adobename="Chook",
category="lu",
contextname="Chook",
description="LATIN CAPITAL LETTER C WITH HOOK",
@@ -4259,6 +4341,7 @@ characters.data={
unicodeslot=0x0187,
},
{
+ adobename="chook",
category="ll",
contextname="chook",
description="LATIN SMALL LETTER C WITH HOOK",
@@ -4269,6 +4352,7 @@ characters.data={
unicodeslot=0x0188,
},
{
+ adobename="Dafrican",
category="lu",
contextname="Dafrican",
description="LATIN CAPITAL LETTER AFRICAN D",
@@ -4278,6 +4362,7 @@ characters.data={
unicodeslot=0x0189,
},
{
+ adobename="Dhook",
category="lu",
contextname="Dhook",
description="LATIN CAPITAL LETTER D WITH HOOK",
@@ -4288,6 +4373,7 @@ characters.data={
unicodeslot=0x018A,
},
{
+ adobename="Dtopbar",
category="lu",
description="LATIN CAPITAL LETTER D WITH TOPBAR",
direction="l",
@@ -4297,6 +4383,7 @@ characters.data={
unicodeslot=0x018B,
},
{
+ adobename="dtopbar",
category="ll",
description="LATIN SMALL LETTER D WITH TOPBAR",
direction="l",
@@ -4306,6 +4393,7 @@ characters.data={
unicodeslot=0x018C,
},
{
+ adobename="deltaturned",
category="ll",
description="LATIN SMALL LETTER TURNED DELTA",
direction="l",
@@ -4313,6 +4401,7 @@ characters.data={
unicodeslot=0x018D,
},
{
+ adobename="Ereversed",
category="lu",
description="LATIN CAPITAL LETTER REVERSED E",
direction="l",
@@ -4321,6 +4410,7 @@ characters.data={
unicodeslot=0x018E,
},
{
+ adobename="Schwa",
category="lu",
contextname="Schwa",
description="LATIN CAPITAL LETTER SCHWA",
@@ -4330,6 +4420,7 @@ characters.data={
unicodeslot=0x018F,
},
{
+ adobename="Eopen",
category="lu",
description="LATIN CAPITAL LETTER OPEN E",
direction="l",
@@ -4338,6 +4429,7 @@ characters.data={
unicodeslot=0x0190,
},
{
+ adobename="Fhook",
category="lu",
contextname="Fhook",
description="LATIN CAPITAL LETTER F WITH HOOK",
@@ -4359,6 +4451,7 @@ characters.data={
unicodeslot=0x0192,
},
{
+ adobename="Ghook",
category="lu",
contextname="Ghook",
description="LATIN CAPITAL LETTER G WITH HOOK",
@@ -4369,6 +4462,7 @@ characters.data={
unicodeslot=0x0193,
},
{
+ adobename="Gammaafrican",
category="lu",
description="LATIN CAPITAL LETTER GAMMA",
direction="l",
@@ -4377,6 +4471,7 @@ characters.data={
unicodeslot=0x0194,
},
{
+ adobename="hv",
category="ll",
description="LATIN SMALL LETTER HV",
direction="l",
@@ -4385,6 +4480,7 @@ characters.data={
unicodeslot=0x0195,
},
{
+ adobename="Iotaafrican",
category="lu",
description="LATIN CAPITAL LETTER IOTA",
direction="l",
@@ -4393,6 +4489,7 @@ characters.data={
unicodeslot=0x0196,
},
{
+ adobename="Istroke",
category="lu",
contextname="Istroke",
description="LATIN CAPITAL LETTER I WITH STROKE",
@@ -4403,6 +4500,7 @@ characters.data={
unicodeslot=0x0197,
},
{
+ adobename="Khook",
category="lu",
contextname="Khook",
description="LATIN CAPITAL LETTER K WITH HOOK",
@@ -4413,6 +4511,7 @@ characters.data={
unicodeslot=0x0198,
},
{
+ adobename="khook",
category="ll",
contextname="khook",
description="LATIN SMALL LETTER K WITH HOOK",
@@ -4423,6 +4522,7 @@ characters.data={
unicodeslot=0x0199,
},
{
+ adobename="lbar",
category="ll",
contextname="lbar",
description="LATIN SMALL LETTER L WITH BAR",
@@ -4433,6 +4533,7 @@ characters.data={
unicodeslot=0x019A,
},
{
+ adobename="lambdastroke",
category="ll",
description="LATIN SMALL LETTER LAMBDA WITH STROKE",
direction="l",
@@ -4440,6 +4541,7 @@ characters.data={
unicodeslot=0x019B,
},
{
+ adobename="Mturned",
category="lu",
description="LATIN CAPITAL LETTER TURNED M",
direction="l",
@@ -4448,6 +4550,7 @@ characters.data={
unicodeslot=0x019C,
},
{
+ adobename="Nhookleft",
category="lu",
description="LATIN CAPITAL LETTER N WITH LEFT HOOK",
direction="l",
@@ -4457,6 +4560,7 @@ characters.data={
unicodeslot=0x019D,
},
{
+ adobename="nlegrightlong",
category="ll",
description="LATIN SMALL LETTER N WITH LONG RIGHT LEG",
direction="l",
@@ -4466,6 +4570,7 @@ characters.data={
unicodeslot=0x019E,
},
{
+ adobename="Ocenteredtilde",
category="lu",
description="LATIN CAPITAL LETTER O WITH MIDDLE TILDE",
direction="l",
@@ -4499,6 +4604,7 @@ characters.data={
unicodeslot=0x01A1,
},
{
+ adobename="Oi",
category="lu",
description="LATIN CAPITAL LETTER OI",
direction="l",
@@ -4507,6 +4613,7 @@ characters.data={
unicodeslot=0x01A2,
},
{
+ adobename="oi",
category="ll",
description="LATIN SMALL LETTER OI",
direction="l",
@@ -4515,6 +4622,7 @@ characters.data={
unicodeslot=0x01A3,
},
{
+ adobename="Phook",
category="lu",
contextname="Phook",
description="LATIN CAPITAL LETTER P WITH HOOK",
@@ -4525,6 +4633,7 @@ characters.data={
unicodeslot=0x01A4,
},
{
+ adobename="phook",
category="ll",
contextname="phook",
description="LATIN SMALL LETTER P WITH HOOK",
@@ -4535,6 +4644,7 @@ characters.data={
unicodeslot=0x01A5,
},
{
+ adobename="yr",
category="lu",
description="LATIN LETTER YR",
direction="l",
@@ -4543,6 +4653,7 @@ characters.data={
unicodeslot=0x01A6,
},
{
+ adobename="Tonetwo",
category="lu",
description="LATIN CAPITAL LETTER TONE TWO",
direction="l",
@@ -4551,6 +4662,7 @@ characters.data={
unicodeslot=0x01A7,
},
{
+ adobename="tonetwo",
category="ll",
description="LATIN SMALL LETTER TONE TWO",
direction="l",
@@ -4559,6 +4671,7 @@ characters.data={
unicodeslot=0x01A8,
},
{
+ adobename="Esh",
category="lu",
description="LATIN CAPITAL LETTER ESH",
direction="l",
@@ -4567,6 +4680,7 @@ characters.data={
unicodeslot=0x01A9,
},
{
+ adobename="eshreversedloop",
category="ll",
description="LATIN LETTER REVERSED ESH LOOP",
direction="l",
@@ -4574,6 +4688,7 @@ characters.data={
unicodeslot=0x01AA,
},
{
+ adobename="tpalatalhook",
category="ll",
description="LATIN SMALL LETTER T WITH PALATAL HOOK",
direction="l",
@@ -4582,6 +4697,7 @@ characters.data={
unicodeslot=0x01AB,
},
{
+ adobename="Thook",
category="lu",
contextname="Thook",
description="LATIN CAPITAL LETTER T WITH HOOK",
@@ -4592,6 +4708,7 @@ characters.data={
unicodeslot=0x01AC,
},
{
+ adobename="thook",
category="ll",
contextname="thook",
description="LATIN SMALL LETTER T WITH HOOK",
@@ -4602,6 +4719,7 @@ characters.data={
unicodeslot=0x01AD,
},
{
+ adobename="Tretroflexhook",
category="lu",
description="LATIN CAPITAL LETTER T WITH RETROFLEX HOOK",
direction="l",
@@ -4635,6 +4753,7 @@ characters.data={
unicodeslot=0x01B0,
},
{
+ adobename="Upsilonafrican",
category="lu",
description="LATIN CAPITAL LETTER UPSILON",
direction="l",
@@ -4643,6 +4762,7 @@ characters.data={
unicodeslot=0x01B1,
},
{
+ adobename="Vhook",
category="lu",
contextname="Uhook",
description="LATIN CAPITAL LETTER V WITH HOOK",
@@ -4653,6 +4773,7 @@ characters.data={
unicodeslot=0x01B2,
},
{
+ adobename="Yhook",
category="lu",
contextname="Yhook",
description="LATIN CAPITAL LETTER Y WITH HOOK",
@@ -4663,6 +4784,7 @@ characters.data={
unicodeslot=0x01B3,
},
{
+ adobename="yhook",
category="ll",
contextname="yhook",
description="LATIN SMALL LETTER Y WITH HOOK",
@@ -4673,6 +4795,7 @@ characters.data={
unicodeslot=0x01B4,
},
{
+ adobename="Zstroke",
category="lu",
contextname="Zstroke",
description="LATIN CAPITAL LETTER Z WITH STROKE",
@@ -4683,6 +4806,7 @@ characters.data={
unicodeslot=0x01B5,
},
{
+ adobename="zstroke",
category="ll",
contextname="zstroke",
description="LATIN SMALL LETTER Z WITH STROKE",
@@ -4693,6 +4817,7 @@ characters.data={
unicodeslot=0x01B6,
},
{
+ adobename="Ezh",
category="lu",
description="LATIN CAPITAL LETTER EZH",
direction="l",
@@ -4701,6 +4826,7 @@ characters.data={
unicodeslot=0x01B7,
},
{
+ adobename="Ezhreversed",
category="lu",
description="LATIN CAPITAL LETTER EZH REVERSED",
direction="l",
@@ -4709,6 +4835,7 @@ characters.data={
unicodeslot=0x01B8,
},
{
+ adobename="ezhreversed",
category="ll",
description="LATIN SMALL LETTER EZH REVERSED",
direction="l",
@@ -4717,6 +4844,7 @@ characters.data={
unicodeslot=0x01B9,
},
{
+ adobename="ezhtail",
category="ll",
description="LATIN SMALL LETTER EZH WITH TAIL",
direction="l",
@@ -4725,6 +4853,7 @@ characters.data={
unicodeslot=0x01BA,
},
{
+ adobename="twostroke",
category="lo",
description="LATIN LETTER TWO WITH STROKE",
direction="l",
@@ -4732,6 +4861,7 @@ characters.data={
unicodeslot=0x01BB,
},
{
+ adobename="Tonefive",
category="lu",
description="LATIN CAPITAL LETTER TONE FIVE",
direction="l",
@@ -4740,6 +4870,7 @@ characters.data={
unicodeslot=0x01BC,
},
{
+ adobename="tonefive",
category="ll",
description="LATIN SMALL LETTER TONE FIVE",
direction="l",
@@ -4748,6 +4879,7 @@ characters.data={
unicodeslot=0x01BD,
},
{
+ adobename="glottalinvertedstroke",
category="ll",
description="LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE",
direction="l",
@@ -4755,6 +4887,7 @@ characters.data={
unicodeslot=0x01BE,
},
{
+ adobename="wynn",
category="ll",
description="LATIN LETTER WYNN",
direction="l",
@@ -4763,6 +4896,7 @@ characters.data={
unicodeslot=0x01BF,
},
{
+ adobename="clickdental",
category="lo",
description="LATIN LETTER DENTAL CLICK",
direction="l",
@@ -4770,6 +4904,7 @@ characters.data={
unicodeslot=0x01C0,
},
{
+ adobename="clicklateral",
category="lo",
description="LATIN LETTER LATERAL CLICK",
direction="l",
@@ -4777,6 +4912,7 @@ characters.data={
unicodeslot=0x01C1,
},
{
+ adobename="clickalveolar",
category="lo",
description="LATIN LETTER ALVEOLAR CLICK",
direction="l",
@@ -4784,6 +4920,7 @@ characters.data={
unicodeslot=0x01C2,
},
{
+ adobename="clickretroflex",
category="lo",
description="LATIN LETTER RETROFLEX CLICK",
direction="l",
@@ -4791,6 +4928,7 @@ characters.data={
unicodeslot=0x01C3,
},
{
+ adobename="DZcaron",
category="lu",
contextname="DZcaronligature",
description="LATIN CAPITAL LETTER DZ WITH CARON",
@@ -4803,6 +4941,7 @@ characters.data={
unicodeslot=0x01C4,
},
{
+ adobename="Dzcaron",
category="lt",
contextname="Dzcaronligature",
description="LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON",
@@ -4815,6 +4954,7 @@ characters.data={
unicodeslot=0x01C5,
},
{
+ adobename="dzcaron",
category="ll",
contextname="dzcaronligature",
description="LATIN SMALL LETTER DZ WITH CARON",
@@ -4826,6 +4966,7 @@ characters.data={
unicodeslot=0x01C6,
},
{
+ adobename="LJ",
category="lu",
contextname="LJligature",
description="LATIN CAPITAL LETTER LJ",
@@ -4838,6 +4979,7 @@ characters.data={
unicodeslot=0x01C7,
},
{
+ adobename="Lj",
category="lt",
contextname="Ljligature",
description="LATIN CAPITAL LETTER L WITH SMALL LETTER J",
@@ -4850,6 +4992,7 @@ characters.data={
unicodeslot=0x01C8,
},
{
+ adobename="lj",
category="ll",
contextname="ljligature",
description="LATIN SMALL LETTER LJ",
@@ -4861,6 +5004,7 @@ characters.data={
unicodeslot=0x01C9,
},
{
+ adobename="NJ",
category="lu",
contextname="NJligature",
description="LATIN CAPITAL LETTER NJ",
@@ -4873,6 +5017,7 @@ characters.data={
unicodeslot=0x01CA,
},
{
+ adobename="Nj",
category="lt",
contextname="Njligature",
description="LATIN CAPITAL LETTER N WITH SMALL LETTER J",
@@ -4885,6 +5030,7 @@ characters.data={
unicodeslot=0x01CB,
},
{
+ adobename="nj",
category="ll",
contextname="njligature",
description="LATIN SMALL LETTER NJ",
@@ -4896,6 +5042,7 @@ characters.data={
unicodeslot=0x01CC,
},
{
+ adobename="Acaron",
category="lu",
contextname="Acaron",
description="LATIN CAPITAL LETTER A WITH CARON",
@@ -4907,6 +5054,7 @@ characters.data={
unicodeslot=0x01CD,
},
{
+ adobename="acaron",
category="ll",
cjkwd="a",
contextname="acaron",
@@ -4919,6 +5067,7 @@ characters.data={
unicodeslot=0x01CE,
},
{
+ adobename="Icaron",
category="lu",
contextname="Icaron",
description="LATIN CAPITAL LETTER I WITH CARON",
@@ -4930,6 +5079,7 @@ characters.data={
unicodeslot=0x01CF,
},
{
+ adobename="icaron",
category="ll",
cjkwd="a",
contextname="icaron",
@@ -4942,6 +5092,7 @@ characters.data={
unicodeslot=0x01D0,
},
{
+ adobename="Ocaron",
category="lu",
contextname="Ocaron",
description="LATIN CAPITAL LETTER O WITH CARON",
@@ -4953,6 +5104,7 @@ characters.data={
unicodeslot=0x01D1,
},
{
+ adobename="ocaron",
category="ll",
cjkwd="a",
contextname="ocaron",
@@ -4965,6 +5117,7 @@ characters.data={
unicodeslot=0x01D2,
},
{
+ adobename="Ucaron",
category="lu",
contextname="Ucaron",
description="LATIN CAPITAL LETTER U WITH CARON",
@@ -4976,6 +5129,7 @@ characters.data={
unicodeslot=0x01D3,
},
{
+ adobename="ucaron",
category="ll",
cjkwd="a",
contextname="ucaron",
@@ -4988,6 +5142,7 @@ characters.data={
unicodeslot=0x01D4,
},
{
+ adobename="Udieresismacron",
category="lu",
contextname="Udiaeresismacron",
description="LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON",
@@ -4999,6 +5154,7 @@ characters.data={
unicodeslot=0x01D5,
},
{
+ adobename="udieresismacron",
category="ll",
cjkwd="a",
contextname="udiaeresismacron",
@@ -5011,6 +5167,7 @@ characters.data={
unicodeslot=0x01D6,
},
{
+ adobename="Udieresisacute",
category="lu",
contextname="Udiaeresisacute",
description="LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE",
@@ -5022,6 +5179,7 @@ characters.data={
unicodeslot=0x01D7,
},
{
+ adobename="udieresisacute",
category="ll",
cjkwd="a",
contextname="udiaeresisacute",
@@ -5034,6 +5192,7 @@ characters.data={
unicodeslot=0x01D8,
},
{
+ adobename="Udieresiscaron",
category="lu",
contextname="Udiaeresiscaron",
description="LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON",
@@ -5045,6 +5204,7 @@ characters.data={
unicodeslot=0x01D9,
},
{
+ adobename="udieresiscaron",
category="ll",
cjkwd="a",
contextname="udiaeresiscaron",
@@ -5057,6 +5217,7 @@ characters.data={
unicodeslot=0x01DA,
},
{
+ adobename="Udieresisgrave",
category="lu",
contextname="Udiaeresisgrave",
description="LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE",
@@ -5068,6 +5229,7 @@ characters.data={
unicodeslot=0x01DB,
},
{
+ adobename="udieresisgrave",
category="ll",
cjkwd="a",
contextname="udiaeresisgrave",
@@ -5080,6 +5242,7 @@ characters.data={
unicodeslot=0x01DC,
},
{
+ adobename="eturned",
category="ll",
description="LATIN SMALL LETTER TURNED E",
direction="l",
@@ -5088,6 +5251,7 @@ characters.data={
unicodeslot=0x01DD,
},
{
+ adobename="Adieresismacron",
category="lu",
contextname="Adiaeresismacron",
description="LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON",
@@ -5099,6 +5263,7 @@ characters.data={
unicodeslot=0x01DE,
},
{
+ adobename="adieresismacron",
category="ll",
contextname="adiaeresismacron",
description="LATIN SMALL LETTER A WITH DIAERESIS AND MACRON",
@@ -5110,6 +5275,7 @@ characters.data={
unicodeslot=0x01DF,
},
{
+ adobename="Adotmacron",
category="lu",
contextname="Adotaccentmacron",
description="LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON",
@@ -5121,6 +5287,7 @@ characters.data={
unicodeslot=0x01E0,
},
{
+ adobename="adotmacron",
category="ll",
contextname="adotaccentmacron",
description="LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON",
@@ -5132,6 +5299,7 @@ characters.data={
unicodeslot=0x01E1,
},
{
+ adobename="AEmacron",
category="lu",
contextname="AEmacron",
description="LATIN CAPITAL LETTER AE WITH MACRON",
@@ -5143,6 +5311,7 @@ characters.data={
unicodeslot=0x01E2,
},
{
+ adobename="aemacron",
category="ll",
contextname="aemacron",
description="LATIN SMALL LETTER AE WITH MACRON",
@@ -5154,6 +5323,7 @@ characters.data={
unicodeslot=0x01E3,
},
{
+ adobename="Gstroke",
category="lu",
contextname="Gstroke",
description="LATIN CAPITAL LETTER G WITH STROKE",
@@ -5164,6 +5334,7 @@ characters.data={
unicodeslot=0x01E4,
},
{
+ adobename="gstroke",
category="ll",
contextname="gstroke",
description="LATIN SMALL LETTER G WITH STROKE",
@@ -5198,6 +5369,7 @@ characters.data={
unicodeslot=0x01E7,
},
{
+ adobename="Kcaron",
category="lu",
contextname="Kcaron",
description="LATIN CAPITAL LETTER K WITH CARON",
@@ -5209,6 +5381,7 @@ characters.data={
unicodeslot=0x01E8,
},
{
+ adobename="kcaron",
category="ll",
contextname="kcaron",
description="LATIN SMALL LETTER K WITH CARON",
@@ -5220,6 +5393,7 @@ characters.data={
unicodeslot=0x01E9,
},
{
+ adobename="Oogonek",
category="lu",
contextname="Oogonek",
description="LATIN CAPITAL LETTER O WITH OGONEK",
@@ -5231,6 +5405,7 @@ characters.data={
unicodeslot=0x01EA,
},
{
+ adobename="oogonek",
category="ll",
contextname="oogonek",
description="LATIN SMALL LETTER O WITH OGONEK",
@@ -5242,6 +5417,7 @@ characters.data={
unicodeslot=0x01EB,
},
{
+ adobename="Oogonekmacron",
category="lu",
contextname="Oogonekmacron",
description="LATIN CAPITAL LETTER O WITH OGONEK AND MACRON",
@@ -5253,6 +5429,7 @@ characters.data={
unicodeslot=0x01EC,
},
{
+ adobename="oogonekmacron",
category="ll",
contextname="oogonekmacron",
description="LATIN SMALL LETTER O WITH OGONEK AND MACRON",
@@ -5264,6 +5441,7 @@ characters.data={
unicodeslot=0x01ED,
},
{
+ adobename="Ezhcaron",
category="lu",
description="LATIN CAPITAL LETTER EZH WITH CARON",
direction="l",
@@ -5274,6 +5452,7 @@ characters.data={
unicodeslot=0x01EE,
},
{
+ adobename="ezhcaron",
category="ll",
description="LATIN SMALL LETTER EZH WITH CARON",
direction="l",
@@ -5284,6 +5463,7 @@ characters.data={
unicodeslot=0x01EF,
},
{
+ adobename="jcaron",
category="ll",
contextname="jcaron",
description="LATIN SMALL LETTER J WITH CARON",
@@ -5294,6 +5474,7 @@ characters.data={
unicodeslot=0x01F0,
},
{
+ adobename="DZ",
category="lu",
contextname="DZligature",
description="LATIN CAPITAL LETTER DZ",
@@ -5305,6 +5486,7 @@ characters.data={
unicodeslot=0x01F1,
},
{
+ adobename="Dz",
category="lt",
contextname="Dzligature",
description="LATIN CAPITAL LETTER D WITH SMALL LETTER Z",
@@ -5317,6 +5499,7 @@ characters.data={
unicodeslot=0x01F2,
},
{
+ adobename="dz",
category="ll",
contextname="dzligature",
description="LATIN SMALL LETTER DZ",
@@ -5327,6 +5510,7 @@ characters.data={
unicodeslot=0x01F3,
},
{
+ adobename="Gacute",
category="lu",
contextname="Gacute",
description="LATIN CAPITAL LETTER G WITH ACUTE",
@@ -5338,6 +5522,7 @@ characters.data={
unicodeslot=0x01F4,
},
{
+ adobename="gacute",
category="ll",
contextname="gacute",
description="LATIN SMALL LETTER G WITH ACUTE",
@@ -5435,7 +5620,7 @@ characters.data={
unicodeslot=0x01FD,
},
{
- adobename="Oslashacute",
+ adobename="Ostrokeacute",
category="lu",
contextname="Ostrokeacute",
description="LATIN CAPITAL LETTER O WITH STROKE AND ACUTE",
@@ -5447,7 +5632,7 @@ characters.data={
unicodeslot=0x01FE,
},
{
- adobename="oslashacute",
+ adobename="ostrokeacute",
category="ll",
contextname="ostrokeacute",
description="LATIN SMALL LETTER O WITH STROKE AND ACUTE",
@@ -5459,6 +5644,7 @@ characters.data={
unicodeslot=0x01FF,
},
{
+ adobename="Adblgrave",
category="lu",
contextname="Adoublegrave",
description="LATIN CAPITAL LETTER A WITH DOUBLE GRAVE",
@@ -5470,6 +5656,7 @@ characters.data={
unicodeslot=0x0200,
},
{
+ adobename="adblgrave",
category="ll",
contextname="adoublegrave",
description="LATIN SMALL LETTER A WITH DOUBLE GRAVE",
@@ -5481,6 +5668,7 @@ characters.data={
unicodeslot=0x0201,
},
{
+ adobename="Ainvertedbreve",
category="lu",
contextname="Ainvertedbreve",
description="LATIN CAPITAL LETTER A WITH INVERTED BREVE",
@@ -5492,6 +5680,7 @@ characters.data={
unicodeslot=0x0202,
},
{
+ adobename="ainvertedbreve",
category="ll",
contextname="ainvertedbreve",
description="LATIN SMALL LETTER A WITH INVERTED BREVE",
@@ -5503,6 +5692,7 @@ characters.data={
unicodeslot=0x0203,
},
{
+ adobename="Edblgrave",
category="lu",
contextname="Edoublegrave",
description="LATIN CAPITAL LETTER E WITH DOUBLE GRAVE",
@@ -5514,6 +5704,7 @@ characters.data={
unicodeslot=0x0204,
},
{
+ adobename="edblgrave",
category="ll",
contextname="edoublegrave",
description="LATIN SMALL LETTER E WITH DOUBLE GRAVE",
@@ -5525,6 +5716,7 @@ characters.data={
unicodeslot=0x0205,
},
{
+ adobename="Einvertedbreve",
category="lu",
contextname="Einvertedbreve",
description="LATIN CAPITAL LETTER E WITH INVERTED BREVE",
@@ -5536,6 +5728,7 @@ characters.data={
unicodeslot=0x0206,
},
{
+ adobename="einvertedbreve",
category="ll",
contextname="einvertedbreve",
description="LATIN SMALL LETTER E WITH INVERTED BREVE",
@@ -5547,6 +5740,7 @@ characters.data={
unicodeslot=0x0207,
},
{
+ adobename="Idblgrave",
category="lu",
contextname="Idoublegrave",
description="LATIN CAPITAL LETTER I WITH DOUBLE GRAVE",
@@ -5558,6 +5752,7 @@ characters.data={
unicodeslot=0x0208,
},
{
+ adobename="idblgrave",
category="ll",
contextname="idoublegrave",
description="LATIN SMALL LETTER I WITH DOUBLE GRAVE",
@@ -5569,6 +5764,7 @@ characters.data={
unicodeslot=0x0209,
},
{
+ adobename="Iinvertedbreve",
category="lu",
contextname="Iinvertedbreve",
description="LATIN CAPITAL LETTER I WITH INVERTED BREVE",
@@ -5580,6 +5776,7 @@ characters.data={
unicodeslot=0x020A,
},
{
+ adobename="iinvertedbreve",
category="ll",
contextname="iinvertedbreve",
description="LATIN SMALL LETTER I WITH INVERTED BREVE",
@@ -5591,6 +5788,7 @@ characters.data={
unicodeslot=0x020B,
},
{
+ adobename="Odblgrave",
category="lu",
contextname="Odoublegrave",
description="LATIN CAPITAL LETTER O WITH DOUBLE GRAVE",
@@ -5602,6 +5800,7 @@ characters.data={
unicodeslot=0x020C,
},
{
+ adobename="odblgrave",
category="ll",
contextname="odoublegrave",
description="LATIN SMALL LETTER O WITH DOUBLE GRAVE",
@@ -5613,6 +5812,7 @@ characters.data={
unicodeslot=0x020D,
},
{
+ adobename="Oinvertedbreve",
category="lu",
contextname="Oinvertedbreve",
description="LATIN CAPITAL LETTER O WITH INVERTED BREVE",
@@ -5624,6 +5824,7 @@ characters.data={
unicodeslot=0x020E,
},
{
+ adobename="oinvertedbreve",
category="ll",
contextname="oinvertedbreve",
description="LATIN SMALL LETTER O WITH INVERTED BREVE",
@@ -5635,6 +5836,7 @@ characters.data={
unicodeslot=0x020F,
},
{
+ adobename="Rdblgrave",
category="lu",
contextname="Rdoublegrave",
description="LATIN CAPITAL LETTER R WITH DOUBLE GRAVE",
@@ -5646,6 +5848,7 @@ characters.data={
unicodeslot=0x0210,
},
{
+ adobename="rdblgrave",
category="ll",
contextname="rdoublegrave",
description="LATIN SMALL LETTER R WITH DOUBLE GRAVE",
@@ -5657,6 +5860,7 @@ characters.data={
unicodeslot=0x0211,
},
{
+ adobename="Rinvertedbreve",
category="lu",
contextname="Rinvertedbreve",
description="LATIN CAPITAL LETTER R WITH INVERTED BREVE",
@@ -5668,6 +5872,7 @@ characters.data={
unicodeslot=0x0212,
},
{
+ adobename="rinvertedbreve",
category="ll",
contextname="rinvertedbreve",
description="LATIN SMALL LETTER R WITH INVERTED BREVE",
@@ -5679,6 +5884,7 @@ characters.data={
unicodeslot=0x0213,
},
{
+ adobename="Udblgrave",
category="lu",
contextname="Udoublegrave",
description="LATIN CAPITAL LETTER U WITH DOUBLE GRAVE",
@@ -5690,6 +5896,7 @@ characters.data={
unicodeslot=0x0214,
},
{
+ adobename="udblgrave",
category="ll",
contextname="udoublegrave",
description="LATIN SMALL LETTER U WITH DOUBLE GRAVE",
@@ -5701,6 +5908,7 @@ characters.data={
unicodeslot=0x0215,
},
{
+ adobename="Uinvertedbreve",
category="lu",
contextname="Uinvertedbreve",
description="LATIN CAPITAL LETTER U WITH INVERTED BREVE",
@@ -5712,6 +5920,7 @@ characters.data={
unicodeslot=0x0216,
},
{
+ adobename="uinvertedbreve",
category="ll",
contextname="uinvertedbreve",
description="LATIN SMALL LETTER U WITH INVERTED BREVE",
@@ -6259,6 +6468,7 @@ characters.data={
unicodeslot=0x024F,
},
{
+ adobename="aturned",
category="ll",
description="LATIN SMALL LETTER TURNED A",
direction="l",
@@ -6266,6 +6476,7 @@ characters.data={
unicodeslot=0x0250,
},
{
+ adobename="ascript",
category="ll",
cjkwd="a",
description="LATIN SMALL LETTER ALPHA",
@@ -6274,6 +6485,7 @@ characters.data={
unicodeslot=0x0251,
},
{
+ adobename="ascriptturned",
category="ll",
description="LATIN SMALL LETTER TURNED ALPHA",
direction="l",
@@ -6281,6 +6493,7 @@ characters.data={
unicodeslot=0x0252,
},
{
+ adobename="bhook",
category="ll",
contextname="bhook",
description="LATIN SMALL LETTER B WITH HOOK",
@@ -6291,6 +6504,7 @@ characters.data={
unicodeslot=0x0253,
},
{
+ adobename="oopen",
category="ll",
description="LATIN SMALL LETTER OPEN O",
direction="l",
@@ -6299,6 +6513,7 @@ characters.data={
unicodeslot=0x0254,
},
{
+ adobename="ccurl",
category="ll",
contextname="ccurl",
description="LATIN SMALL LETTER C WITH CURL",
@@ -6308,6 +6523,7 @@ characters.data={
unicodeslot=0x0255,
},
{
+ adobename="dtail",
category="ll",
contextname="dtail",
description="LATIN SMALL LETTER D WITH TAIL",
@@ -6318,6 +6534,7 @@ characters.data={
unicodeslot=0x0256,
},
{
+ adobename="dhook",
category="ll",
contextname="dhook",
description="LATIN SMALL LETTER D WITH HOOK",
@@ -6328,6 +6545,7 @@ characters.data={
unicodeslot=0x0257,
},
{
+ adobename="ereversed",
category="ll",
description="LATIN SMALL LETTER REVERSED E",
direction="l",
@@ -6335,6 +6553,7 @@ characters.data={
unicodeslot=0x0258,
},
{
+ adobename="schwa",
category="ll",
contextname="schwa",
description="LATIN SMALL LETTER SCHWA",
@@ -6344,6 +6563,7 @@ characters.data={
unicodeslot=0x0259,
},
{
+ adobename="schwahook",
category="ll",
contextname="schwahook",
description="LATIN SMALL LETTER SCHWA WITH HOOK",
@@ -6353,6 +6573,7 @@ characters.data={
unicodeslot=0x025A,
},
{
+ adobename="eopen",
category="ll",
description="LATIN SMALL LETTER OPEN E",
direction="l",
@@ -6361,6 +6582,7 @@ characters.data={
unicodeslot=0x025B,
},
{
+ adobename="eopenreversed",
category="ll",
description="LATIN SMALL LETTER REVERSED OPEN E",
direction="l",
@@ -6368,6 +6590,7 @@ characters.data={
unicodeslot=0x025C,
},
{
+ adobename="eopenreversedhook",
category="ll",
description="LATIN SMALL LETTER REVERSED OPEN E WITH HOOK",
direction="l",
@@ -6375,6 +6598,7 @@ characters.data={
unicodeslot=0x025D,
},
{
+ adobename="eopenreversedclosed",
category="ll",
description="LATIN SMALL LETTER CLOSED REVERSED OPEN E",
direction="l",
@@ -6382,6 +6606,7 @@ characters.data={
unicodeslot=0x025E,
},
{
+ adobename="jdotlessstroke",
category="ll",
contextname="dotlessjstroke",
description="LATIN SMALL LETTER DOTLESS J WITH STROKE",
@@ -6390,6 +6615,7 @@ characters.data={
unicodeslot=0x025F,
},
{
+ adobename="ghook",
category="ll",
description="LATIN SMALL LETTER G WITH HOOK",
direction="l",
@@ -6399,6 +6625,7 @@ characters.data={
unicodeslot=0x0260,
},
{
+ adobename="gscript",
category="ll",
cjkwd="a",
description="LATIN SMALL LETTER SCRIPT G",
@@ -6414,6 +6641,7 @@ characters.data={
unicodeslot=0x0262,
},
{
+ adobename="gammalatinsmall",
category="ll",
description="LATIN SMALL LETTER GAMMA",
direction="l",
@@ -6422,6 +6650,7 @@ characters.data={
unicodeslot=0x0263,
},
{
+ adobename="ramshorn",
category="ll",
description="LATIN SMALL LETTER RAMS HORN",
direction="l",
@@ -6429,6 +6658,7 @@ characters.data={
unicodeslot=0x0264,
},
{
+ adobename="hturned",
category="ll",
description="LATIN SMALL LETTER TURNED H",
direction="l",
@@ -6436,6 +6666,7 @@ characters.data={
unicodeslot=0x0265,
},
{
+ adobename="hhook",
category="ll",
description="LATIN SMALL LETTER H WITH HOOK",
direction="l",
@@ -6444,6 +6675,7 @@ characters.data={
unicodeslot=0x0266,
},
{
+ adobename="henghook",
category="ll",
description="LATIN SMALL LETTER HENG WITH HOOK",
direction="l",
@@ -6451,6 +6683,7 @@ characters.data={
unicodeslot=0x0267,
},
{
+ adobename="istroke",
category="ll",
description="LATIN SMALL LETTER I WITH STROKE",
direction="l",
@@ -6460,6 +6693,7 @@ characters.data={
unicodeslot=0x0268,
},
{
+ adobename="iotalatin",
category="ll",
description="LATIN SMALL LETTER IOTA",
direction="l",
@@ -6475,6 +6709,7 @@ characters.data={
unicodeslot=0x026A,
},
{
+ adobename="lmiddletilde",
category="ll",
description="LATIN SMALL LETTER L WITH MIDDLE TILDE",
direction="l",
@@ -6484,6 +6719,7 @@ characters.data={
unicodeslot=0x026B,
},
{
+ adobename="lbelt",
category="ll",
description="LATIN SMALL LETTER L WITH BELT",
direction="l",
@@ -6492,6 +6728,7 @@ characters.data={
unicodeslot=0x026C,
},
{
+ adobename="lhookretroflex",
category="ll",
description="LATIN SMALL LETTER L WITH RETROFLEX HOOK",
direction="l",
@@ -6500,6 +6737,7 @@ characters.data={
unicodeslot=0x026D,
},
{
+ adobename="lezh",
category="ll",
description="LATIN SMALL LETTER LEZH",
direction="l",
@@ -6507,6 +6745,7 @@ characters.data={
unicodeslot=0x026E,
},
{
+ adobename="mturned",
category="ll",
description="LATIN SMALL LETTER TURNED M",
direction="l",
@@ -6515,6 +6754,7 @@ characters.data={
unicodeslot=0x026F,
},
{
+ adobename="mlonglegturned",
category="ll",
description="LATIN SMALL LETTER TURNED M WITH LONG LEG",
direction="l",
@@ -6522,6 +6762,7 @@ characters.data={
unicodeslot=0x0270,
},
{
+ adobename="mhook",
category="ll",
description="LATIN SMALL LETTER M WITH HOOK",
direction="l",
@@ -6530,6 +6771,7 @@ characters.data={
unicodeslot=0x0271,
},
{
+ adobename="nhookleft",
category="ll",
description="LATIN SMALL LETTER N WITH LEFT HOOK",
direction="l",
@@ -6539,6 +6781,7 @@ characters.data={
unicodeslot=0x0272,
},
{
+ adobename="nhookretroflex",
category="ll",
description="LATIN SMALL LETTER N WITH RETROFLEX HOOK",
direction="l",
@@ -6554,6 +6797,7 @@ characters.data={
unicodeslot=0x0274,
},
{
+ adobename="obarred",
category="ll",
description="LATIN SMALL LETTER BARRED O",
direction="l",
@@ -6569,6 +6813,7 @@ characters.data={
unicodeslot=0x0276,
},
{
+ adobename="omegalatinclosed",
category="ll",
description="LATIN SMALL LETTER CLOSED OMEGA",
direction="l",
@@ -6576,6 +6821,7 @@ characters.data={
unicodeslot=0x0277,
},
{
+ adobename="philatin",
category="ll",
description="LATIN SMALL LETTER PHI",
direction="l",
@@ -6583,6 +6829,7 @@ characters.data={
unicodeslot=0x0278,
},
{
+ adobename="rturned",
category="ll",
description="LATIN SMALL LETTER TURNED R",
direction="l",
@@ -6590,6 +6837,7 @@ characters.data={
unicodeslot=0x0279,
},
{
+ adobename="rlonglegturned",
category="ll",
description="LATIN SMALL LETTER TURNED R WITH LONG LEG",
direction="l",
@@ -6597,6 +6845,7 @@ characters.data={
unicodeslot=0x027A,
},
{
+ adobename="rhookturned",
category="ll",
description="LATIN SMALL LETTER TURNED R WITH HOOK",
direction="l",
@@ -6604,6 +6853,7 @@ characters.data={
unicodeslot=0x027B,
},
{
+ adobename="rlongleg",
category="ll",
description="LATIN SMALL LETTER R WITH LONG LEG",
direction="l",
@@ -6612,6 +6862,7 @@ characters.data={
unicodeslot=0x027C,
},
{
+ adobename="rhook",
category="ll",
description="LATIN SMALL LETTER R WITH TAIL",
direction="l",
@@ -6621,6 +6872,7 @@ characters.data={
unicodeslot=0x027D,
},
{
+ adobename="rfishhook",
category="ll",
description="LATIN SMALL LETTER R WITH FISHHOOK",
direction="l",
@@ -6629,6 +6881,7 @@ characters.data={
unicodeslot=0x027E,
},
{
+ adobename="rfishhookreversed",
category="ll",
description="LATIN SMALL LETTER REVERSED R WITH FISHHOOK",
direction="l",
@@ -6644,6 +6897,7 @@ characters.data={
unicodeslot=0x0280,
},
{
+ adobename="Rsmallinverted",
category="ll",
description="LATIN LETTER SMALL CAPITAL INVERTED R",
direction="l",
@@ -6651,6 +6905,7 @@ characters.data={
unicodeslot=0x0281,
},
{
+ adobename="shook",
category="ll",
description="LATIN SMALL LETTER S WITH HOOK",
direction="l",
@@ -6659,6 +6914,7 @@ characters.data={
unicodeslot=0x0282,
},
{
+ adobename="esh",
category="ll",
description="LATIN SMALL LETTER ESH",
direction="l",
@@ -6667,6 +6923,7 @@ characters.data={
unicodeslot=0x0283,
},
{
+ adobename="dotlessjstrokehook",
category="ll",
description="LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK",
direction="l",
@@ -6674,6 +6931,7 @@ characters.data={
unicodeslot=0x0284,
},
{
+ adobename="eshsquatreversed",
category="ll",
description="LATIN SMALL LETTER SQUAT REVERSED ESH",
direction="l",
@@ -6681,6 +6939,7 @@ characters.data={
unicodeslot=0x0285,
},
{
+ adobename="eshcurl",
category="ll",
description="LATIN SMALL LETTER ESH WITH CURL",
direction="l",
@@ -6689,6 +6948,7 @@ characters.data={
unicodeslot=0x0286,
},
{
+ adobename="tturned",
category="ll",
description="LATIN SMALL LETTER TURNED T",
direction="l",
@@ -6696,6 +6956,7 @@ characters.data={
unicodeslot=0x0287,
},
{
+ adobename="tretroflexhook",
category="ll",
description="LATIN SMALL LETTER T WITH RETROFLEX HOOK",
direction="l",
@@ -6705,6 +6966,7 @@ characters.data={
unicodeslot=0x0288,
},
{
+ adobename="ubar",
category="ll",
description="LATIN SMALL LETTER U BAR",
direction="l",
@@ -6713,6 +6975,7 @@ characters.data={
unicodeslot=0x0289,
},
{
+ adobename="upsilonlatin",
category="ll",
description="LATIN SMALL LETTER UPSILON",
direction="l",
@@ -6721,6 +6984,7 @@ characters.data={
unicodeslot=0x028A,
},
{
+ adobename="vhook",
category="ll",
description="LATIN SMALL LETTER V WITH HOOK",
direction="l",
@@ -6730,6 +6994,7 @@ characters.data={
unicodeslot=0x028B,
},
{
+ adobename="vturned",
category="ll",
description="LATIN SMALL LETTER TURNED V",
direction="l",
@@ -6738,6 +7003,7 @@ characters.data={
unicodeslot=0x028C,
},
{
+ adobename="wturned",
category="ll",
description="LATIN SMALL LETTER TURNED W",
direction="l",
@@ -6745,6 +7011,7 @@ characters.data={
unicodeslot=0x028D,
},
{
+ adobename="yturned",
category="ll",
description="LATIN SMALL LETTER TURNED Y",
direction="l",
@@ -6759,6 +7026,7 @@ characters.data={
unicodeslot=0x028F,
},
{
+ adobename="zretroflexhook",
category="ll",
description="LATIN SMALL LETTER Z WITH RETROFLEX HOOK",
direction="l",
@@ -6767,6 +7035,7 @@ characters.data={
unicodeslot=0x0290,
},
{
+ adobename="zcurl",
category="ll",
description="LATIN SMALL LETTER Z WITH CURL",
direction="l",
@@ -6775,6 +7044,7 @@ characters.data={
unicodeslot=0x0291,
},
{
+ adobename="ezh",
category="ll",
description="LATIN SMALL LETTER EZH",
direction="l",
@@ -6783,6 +7053,7 @@ characters.data={
unicodeslot=0x0292,
},
{
+ adobename="ezhcurl",
category="ll",
description="LATIN SMALL LETTER EZH WITH CURL",
direction="l",
@@ -6791,6 +7062,7 @@ characters.data={
unicodeslot=0x0293,
},
{
+ adobename="glottalstop",
category="lo",
description="LATIN LETTER GLOTTAL STOP",
direction="l",
@@ -6798,6 +7070,7 @@ characters.data={
unicodeslot=0x0294,
},
{
+ adobename="glottalstopreversed",
category="ll",
description="LATIN LETTER PHARYNGEAL VOICED FRICATIVE",
direction="l",
@@ -6805,6 +7078,7 @@ characters.data={
unicodeslot=0x0295,
},
{
+ adobename="glottalstopinverted",
category="ll",
description="LATIN LETTER INVERTED GLOTTAL STOP",
direction="l",
@@ -6812,6 +7086,7 @@ characters.data={
unicodeslot=0x0296,
},
{
+ adobename="cstretched",
category="ll",
description="LATIN LETTER STRETCHED C",
direction="l",
@@ -6819,6 +7094,7 @@ characters.data={
unicodeslot=0x0297,
},
{
+ adobename="bilabialclick",
category="ll",
description="LATIN LETTER BILABIAL CLICK",
direction="l",
@@ -6833,6 +7109,7 @@ characters.data={
unicodeslot=0x0299,
},
{
+ adobename="eopenclosed",
category="ll",
description="LATIN SMALL LETTER CLOSED OPEN E",
direction="l",
@@ -6840,6 +7117,7 @@ characters.data={
unicodeslot=0x029A,
},
{
+ adobename="Gsmallhook",
category="ll",
description="LATIN LETTER SMALL CAPITAL G WITH HOOK",
direction="l",
@@ -6854,6 +7132,7 @@ characters.data={
unicodeslot=0x029C,
},
{
+ adobename="jcrossedtail",
category="ll",
description="LATIN SMALL LETTER J WITH CROSSED-TAIL",
direction="l",
@@ -6862,6 +7141,7 @@ characters.data={
unicodeslot=0x029D,
},
{
+ adobename="kturned",
category="ll",
description="LATIN SMALL LETTER TURNED K",
direction="l",
@@ -6876,6 +7156,7 @@ characters.data={
unicodeslot=0x029F,
},
{
+ adobename="qhook",
category="ll",
description="LATIN SMALL LETTER Q WITH HOOK",
direction="l",
@@ -6884,6 +7165,7 @@ characters.data={
unicodeslot=0x02A0,
},
{
+ adobename="glottalstopstroke",
category="ll",
description="LATIN LETTER GLOTTAL STOP WITH STROKE",
direction="l",
@@ -6891,6 +7173,7 @@ characters.data={
unicodeslot=0x02A1,
},
{
+ adobename="glottalstopstrokereversed",
category="ll",
description="LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE",
direction="l",
@@ -6898,6 +7181,7 @@ characters.data={
unicodeslot=0x02A2,
},
{
+ adobename="dzaltone",
category="ll",
description="LATIN SMALL LETTER DZ DIGRAPH",
direction="l",
@@ -6905,6 +7189,7 @@ characters.data={
unicodeslot=0x02A3,
},
{
+ adobename="dezh",
category="ll",
description="LATIN SMALL LETTER DEZH DIGRAPH",
direction="l",
@@ -6912,6 +7197,7 @@ characters.data={
unicodeslot=0x02A4,
},
{
+ adobename="dzcurl",
category="ll",
description="LATIN SMALL LETTER DZ DIGRAPH WITH CURL",
direction="l",
@@ -6919,6 +7205,7 @@ characters.data={
unicodeslot=0x02A5,
},
{
+ adobename="ts",
category="ll",
description="LATIN SMALL LETTER TS DIGRAPH",
direction="l",
@@ -6926,6 +7213,7 @@ characters.data={
unicodeslot=0x02A6,
},
{
+ adobename="tesh",
category="ll",
description="LATIN SMALL LETTER TESH DIGRAPH",
direction="l",
@@ -6933,6 +7221,7 @@ characters.data={
unicodeslot=0x02A7,
},
{
+ adobename="tccurl",
category="ll",
description="LATIN SMALL LETTER TC DIGRAPH WITH CURL",
direction="l",
@@ -6989,6 +7278,7 @@ characters.data={
unicodeslot=0x02AF,
},
{
+ adobename="hsuperior",
category="lm",
description="MODIFIER LETTER SMALL H",
direction="l",
@@ -6997,6 +7287,7 @@ characters.data={
unicodeslot=0x02B0,
},
{
+ adobename="hhooksuperior",
category="lm",
description="MODIFIER LETTER SMALL H WITH HOOK",
direction="l",
@@ -7005,6 +7296,7 @@ characters.data={
unicodeslot=0x02B1,
},
{
+ adobename="jsuperior",
category="lm",
description="MODIFIER LETTER SMALL J",
direction="l",
@@ -7021,6 +7313,7 @@ characters.data={
unicodeslot=0x02B3,
},
{
+ adobename="rturnedsuperior",
category="lm",
description="MODIFIER LETTER SMALL TURNED R",
direction="l",
@@ -7029,6 +7322,7 @@ characters.data={
unicodeslot=0x02B4,
},
{
+ adobename="rhookturnedsuperior",
category="lm",
description="MODIFIER LETTER SMALL TURNED R WITH HOOK",
direction="l",
@@ -7037,6 +7331,7 @@ characters.data={
unicodeslot=0x02B5,
},
{
+ adobename="Rsmallinvertedsuperior",
category="lm",
description="MODIFIER LETTER SMALL CAPITAL INVERTED R",
direction="l",
@@ -7045,6 +7340,7 @@ characters.data={
unicodeslot=0x02B6,
},
{
+ adobename="wsuperior",
category="lm",
description="MODIFIER LETTER SMALL W",
direction="l",
@@ -7053,6 +7349,7 @@ characters.data={
unicodeslot=0x02B7,
},
{
+ adobename="ysuperior",
category="lm",
description="MODIFIER LETTER SMALL Y",
direction="l",
@@ -7061,6 +7358,7 @@ characters.data={
unicodeslot=0x02B8,
},
{
+ adobename="primemod",
category="lm",
description="MODIFIER LETTER PRIME",
direction="on",
@@ -7068,6 +7366,7 @@ characters.data={
unicodeslot=0x02B9,
},
{
+ adobename="dblprimemod",
category="lm",
description="MODIFIER LETTER DOUBLE PRIME",
direction="on",
@@ -7075,6 +7374,7 @@ characters.data={
unicodeslot=0x02BA,
},
{
+ adobename="commaturnedmod",
category="lm",
description="MODIFIER LETTER TURNED COMMA",
direction="l",
@@ -7082,7 +7382,7 @@ characters.data={
unicodeslot=0x02BB,
},
{
- adobename="afii57929",
+ adobename="apostrophemod",
category="lm",
description="MODIFIER LETTER APOSTROPHE",
direction="l",
@@ -7090,7 +7390,7 @@ characters.data={
unicodeslot=0x02BC,
},
{
- adobename="afii64937",
+ adobename="commareversedmod",
category="lm",
description="MODIFIER LETTER REVERSED COMMA",
direction="l",
@@ -7098,6 +7398,7 @@ characters.data={
unicodeslot=0x02BD,
},
{
+ adobename="ringhalfright",
category="lm",
description="MODIFIER LETTER RIGHT HALF RING",
direction="l",
@@ -7105,6 +7406,7 @@ characters.data={
unicodeslot=0x02BE,
},
{
+ adobename="ringhalfleft",
category="lm",
description="MODIFIER LETTER LEFT HALF RING",
direction="l",
@@ -7112,6 +7414,7 @@ characters.data={
unicodeslot=0x02BF,
},
{
+ adobename="glottalstopmod",
category="lm",
description="MODIFIER LETTER GLOTTAL STOP",
direction="l",
@@ -7119,6 +7422,7 @@ characters.data={
unicodeslot=0x02C0,
},
{
+ adobename="glottalstopreversedmod",
category="lm",
description="MODIFIER LETTER REVERSED GLOTTAL STOP",
direction="l",
@@ -7126,6 +7430,7 @@ characters.data={
unicodeslot=0x02C1,
},
{
+ adobename="arrowheadleftmod",
category="sk",
description="MODIFIER LETTER LEFT ARROWHEAD",
direction="on",
@@ -7133,6 +7438,7 @@ characters.data={
unicodeslot=0x02C2,
},
{
+ adobename="arrowheadrightmod",
category="sk",
description="MODIFIER LETTER RIGHT ARROWHEAD",
direction="on",
@@ -7140,6 +7446,7 @@ characters.data={
unicodeslot=0x02C3,
},
{
+ adobename="arrowheadupmod",
category="sk",
cjkwd="a",
description="MODIFIER LETTER UP ARROWHEAD",
@@ -7148,6 +7455,7 @@ characters.data={
unicodeslot=0x02C4,
},
{
+ adobename="arrowheaddownmod",
category="sk",
description="MODIFIER LETTER DOWN ARROWHEAD",
direction="on",
@@ -7180,6 +7488,7 @@ characters.data={
unicodeslot=0x02C7,
},
{
+ adobename="verticallinemod",
category="lm",
description="MODIFIER LETTER VERTICAL LINE",
direction="on",
@@ -7187,6 +7496,7 @@ characters.data={
unicodeslot=0x02C8,
},
{
+ adobename="firsttonechinese",
category="lm",
cjkwd="a",
description="MODIFIER LETTER MACRON",
@@ -7195,6 +7505,7 @@ characters.data={
unicodeslot=0x02C9,
},
{
+ adobename="secondtonechinese",
category="lm",
cjkwd="a",
description="MODIFIER LETTER ACUTE ACCENT",
@@ -7203,6 +7514,7 @@ characters.data={
unicodeslot=0x02CA,
},
{
+ adobename="fourthtonechinese",
category="lm",
cjkwd="a",
description="MODIFIER LETTER GRAVE ACCENT",
@@ -7211,6 +7523,7 @@ characters.data={
unicodeslot=0x02CB,
},
{
+ adobename="verticallinelowmod",
category="lm",
description="MODIFIER LETTER LOW VERTICAL LINE",
direction="on",
@@ -7218,6 +7531,7 @@ characters.data={
unicodeslot=0x02CC,
},
{
+ adobename="macronlowmod",
category="lm",
cjkwd="a",
description="MODIFIER LETTER LOW MACRON",
@@ -7226,6 +7540,7 @@ characters.data={
unicodeslot=0x02CD,
},
{
+ adobename="gravelowmod",
category="lm",
description="MODIFIER LETTER LOW GRAVE ACCENT",
direction="on",
@@ -7233,6 +7548,7 @@ characters.data={
unicodeslot=0x02CE,
},
{
+ adobename="acutelowmod",
category="lm",
description="MODIFIER LETTER LOW ACUTE ACCENT",
direction="on",
@@ -7240,6 +7556,7 @@ characters.data={
unicodeslot=0x02CF,
},
{
+ adobename="colontriangularmod",
category="lm",
cjkwd="a",
description="MODIFIER LETTER TRIANGULAR COLON",
@@ -7248,6 +7565,7 @@ characters.data={
unicodeslot=0x02D0,
},
{
+ adobename="colontriangularhalfmod",
category="lm",
description="MODIFIER LETTER HALF TRIANGULAR COLON",
direction="l",
@@ -7255,6 +7573,7 @@ characters.data={
unicodeslot=0x02D1,
},
{
+ adobename="ringhalfrightcentered",
category="sk",
description="MODIFIER LETTER CENTRED RIGHT HALF RING",
direction="on",
@@ -7262,6 +7581,7 @@ characters.data={
unicodeslot=0x02D2,
},
{
+ adobename="ringhalfleftcentered",
category="sk",
description="MODIFIER LETTER CENTRED LEFT HALF RING",
direction="on",
@@ -7269,6 +7589,7 @@ characters.data={
unicodeslot=0x02D3,
},
{
+ adobename="uptackmod",
category="sk",
description="MODIFIER LETTER UP TACK",
direction="on",
@@ -7276,6 +7597,7 @@ characters.data={
unicodeslot=0x02D4,
},
{
+ adobename="downtackmod",
category="sk",
description="MODIFIER LETTER DOWN TACK",
direction="on",
@@ -7283,6 +7605,7 @@ characters.data={
unicodeslot=0x02D5,
},
{
+ adobename="plusmod",
category="sk",
description="MODIFIER LETTER PLUS SIGN",
direction="on",
@@ -7290,6 +7613,7 @@ characters.data={
unicodeslot=0x02D6,
},
{
+ adobename="minusmod",
category="sk",
description="MODIFIER LETTER MINUS SIGN",
direction="on",
@@ -7370,6 +7694,7 @@ characters.data={
unicodeslot=0x02DD,
},
{
+ adobename="rhotichookmod",
category="sk",
description="MODIFIER LETTER RHOTIC HOOK",
direction="on",
@@ -7385,6 +7710,7 @@ characters.data={
unicodeslot=0x02DF,
},
{
+ adobename="gammasuperior",
category="lm",
description="MODIFIER LETTER SMALL GAMMA",
direction="l",
@@ -7409,6 +7735,7 @@ characters.data={
unicodeslot=0x02E2,
},
{
+ adobename="xsuperior",
category="lm",
description="MODIFIER LETTER SMALL X",
direction="l",
@@ -7417,6 +7744,7 @@ characters.data={
unicodeslot=0x02E3,
},
{
+ adobename="glottalstopreversedsuperior",
category="lm",
description="MODIFIER LETTER SMALL REVERSED GLOTTAL STOP",
direction="l",
@@ -7425,6 +7753,7 @@ characters.data={
unicodeslot=0x02E4,
},
{
+ adobename="tonebarextrahighmod",
category="sk",
description="MODIFIER LETTER EXTRA-HIGH TONE BAR",
direction="on",
@@ -7432,6 +7761,7 @@ characters.data={
unicodeslot=0x02E5,
},
{
+ adobename="tonebarhighmod",
category="sk",
description="MODIFIER LETTER HIGH TONE BAR",
direction="on",
@@ -7439,6 +7769,7 @@ characters.data={
unicodeslot=0x02E6,
},
{
+ adobename="tonebarmidmod",
category="sk",
description="MODIFIER LETTER MID TONE BAR",
direction="on",
@@ -7446,6 +7777,7 @@ characters.data={
unicodeslot=0x02E7,
},
{
+ adobename="tonebarlowmod",
category="sk",
description="MODIFIER LETTER LOW TONE BAR",
direction="on",
@@ -7453,6 +7785,7 @@ characters.data={
unicodeslot=0x02E8,
},
{
+ adobename="tonebarextralowmod",
category="sk",
description="MODIFIER LETTER EXTRA-LOW TONE BAR",
direction="on",
@@ -7632,6 +7965,7 @@ characters.data={
unicodeslot=0x0301,
},
{
+ adobename="circumflexcmb",
category="mn",
cjkwd="a",
description="COMBINING CIRCUMFLEX ACCENT",
@@ -7651,6 +7985,7 @@ characters.data={
unicodeslot=0x0303,
},
{
+ adobename="macroncmb",
category="mn",
cjkwd="a",
description="COMBINING MACRON",
@@ -7659,6 +7994,7 @@ characters.data={
unicodeslot=0x0304,
},
{
+ adobename="overlinecmb",
category="mn",
cjkwd="a",
description="COMBINING OVERLINE",
@@ -7667,6 +8003,7 @@ characters.data={
unicodeslot=0x0305,
},
{
+ adobename="brevecmb",
category="mn",
cjkwd="a",
description="COMBINING BREVE",
@@ -7675,6 +8012,7 @@ characters.data={
unicodeslot=0x0306,
},
{
+ adobename="dotaccentcmb",
category="mn",
cjkwd="a",
description="COMBINING DOT ABOVE",
@@ -7683,6 +8021,7 @@ characters.data={
unicodeslot=0x0307,
},
{
+ adobename="dieresiscmb",
category="mn",
cjkwd="a",
description="COMBINING DIAERESIS",
@@ -7691,7 +8030,7 @@ characters.data={
unicodeslot=0x0308,
},
{
- adobename="hookabovecomb",
+ adobename="hookcmb",
category="mn",
cjkwd="a",
description="COMBINING HOOK ABOVE",
@@ -7700,6 +8039,7 @@ characters.data={
unicodeslot=0x0309,
},
{
+ adobename="ringcmb",
category="mn",
cjkwd="a",
description="COMBINING RING ABOVE",
@@ -7708,6 +8048,7 @@ characters.data={
unicodeslot=0x030A,
},
{
+ adobename="hungarumlautcmb",
category="mn",
cjkwd="a",
description="COMBINING DOUBLE ACUTE ACCENT",
@@ -7716,6 +8057,7 @@ characters.data={
unicodeslot=0x030B,
},
{
+ adobename="caroncmb",
category="mn",
cjkwd="a",
description="COMBINING CARON",
@@ -7724,6 +8066,7 @@ characters.data={
unicodeslot=0x030C,
},
{
+ adobename="verticallineabovecmb",
category="mn",
cjkwd="a",
description="COMBINING VERTICAL LINE ABOVE",
@@ -7732,6 +8075,7 @@ characters.data={
unicodeslot=0x030D,
},
{
+ adobename="dblverticallineabovecmb",
category="mn",
cjkwd="a",
description="COMBINING DOUBLE VERTICAL LINE ABOVE",
@@ -7740,6 +8084,7 @@ characters.data={
unicodeslot=0x030E,
},
{
+ adobename="dblgravecmb",
category="mn",
cjkwd="a",
description="COMBINING DOUBLE GRAVE ACCENT",
@@ -7748,6 +8093,7 @@ characters.data={
unicodeslot=0x030F,
},
{
+ adobename="candrabinducmb",
category="mn",
cjkwd="a",
description="COMBINING CANDRABINDU",
@@ -7756,6 +8102,7 @@ characters.data={
unicodeslot=0x0310,
},
{
+ adobename="breveinvertedcmb",
category="mn",
cjkwd="a",
description="COMBINING INVERTED BREVE",
@@ -7764,6 +8111,7 @@ characters.data={
unicodeslot=0x0311,
},
{
+ adobename="commaturnedabovecmb",
category="mn",
cjkwd="a",
description="COMBINING TURNED COMMA ABOVE",
@@ -7772,6 +8120,7 @@ characters.data={
unicodeslot=0x0312,
},
{
+ adobename="commaabovecmb",
category="mn",
cjkwd="a",
description="COMBINING COMMA ABOVE",
@@ -7780,6 +8129,7 @@ characters.data={
unicodeslot=0x0313,
},
{
+ adobename="commareversedabovecmb",
category="mn",
cjkwd="a",
description="COMBINING REVERSED COMMA ABOVE",
@@ -7788,6 +8138,7 @@ characters.data={
unicodeslot=0x0314,
},
{
+ adobename="commaaboverightcmb",
category="mn",
cjkwd="a",
description="COMBINING COMMA ABOVE RIGHT",
@@ -7796,6 +8147,7 @@ characters.data={
unicodeslot=0x0315,
},
{
+ adobename="gravebelowcmb",
category="mn",
cjkwd="a",
description="COMBINING GRAVE ACCENT BELOW",
@@ -7804,6 +8156,7 @@ characters.data={
unicodeslot=0x0316,
},
{
+ adobename="acutebelowcmb",
category="mn",
cjkwd="a",
description="COMBINING ACUTE ACCENT BELOW",
@@ -7812,6 +8165,7 @@ characters.data={
unicodeslot=0x0317,
},
{
+ adobename="lefttackbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING LEFT TACK BELOW",
@@ -7820,6 +8174,7 @@ characters.data={
unicodeslot=0x0318,
},
{
+ adobename="righttackbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING RIGHT TACK BELOW",
@@ -7828,6 +8183,7 @@ characters.data={
unicodeslot=0x0319,
},
{
+ adobename="leftangleabovecmb",
category="mn",
cjkwd="a",
description="COMBINING LEFT ANGLE ABOVE",
@@ -7836,6 +8192,7 @@ characters.data={
unicodeslot=0x031A,
},
{
+ adobename="horncmb",
category="mn",
cjkwd="a",
description="COMBINING HORN",
@@ -7844,6 +8201,7 @@ characters.data={
unicodeslot=0x031B,
},
{
+ adobename="ringhalfleftbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING LEFT HALF RING BELOW",
@@ -7852,6 +8210,7 @@ characters.data={
unicodeslot=0x031C,
},
{
+ adobename="uptackbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING UP TACK BELOW",
@@ -7860,6 +8219,7 @@ characters.data={
unicodeslot=0x031D,
},
{
+ adobename="downtackbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING DOWN TACK BELOW",
@@ -7868,6 +8228,7 @@ characters.data={
unicodeslot=0x031E,
},
{
+ adobename="plusbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING PLUS SIGN BELOW",
@@ -7876,6 +8237,7 @@ characters.data={
unicodeslot=0x031F,
},
{
+ adobename="minusbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING MINUS SIGN BELOW",
@@ -7884,6 +8246,7 @@ characters.data={
unicodeslot=0x0320,
},
{
+ adobename="hookpalatalizedbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING PALATALIZED HOOK BELOW",
@@ -7892,6 +8255,7 @@ characters.data={
unicodeslot=0x0321,
},
{
+ adobename="hookretroflexbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING RETROFLEX HOOK BELOW",
@@ -7910,6 +8274,7 @@ characters.data={
unicodeslot=0x0323,
},
{
+ adobename="dieresisbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING DIAERESIS BELOW",
@@ -7918,6 +8283,7 @@ characters.data={
unicodeslot=0x0324,
},
{
+ adobename="ringbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING RING BELOW",
@@ -7935,6 +8301,7 @@ characters.data={
unicodeslot=0x0326,
},
{
+ adobename="cedillacmb",
category="mn",
cjkwd="a",
description="COMBINING CEDILLA",
@@ -7943,6 +8310,7 @@ characters.data={
unicodeslot=0x0327,
},
{
+ adobename="ogonekcmb",
category="mn",
cjkwd="a",
description="COMBINING OGONEK",
@@ -7951,6 +8319,7 @@ characters.data={
unicodeslot=0x0328,
},
{
+ adobename="verticallinebelowcmb",
category="mn",
cjkwd="a",
description="COMBINING VERTICAL LINE BELOW",
@@ -7959,6 +8328,7 @@ characters.data={
unicodeslot=0x0329,
},
{
+ adobename="bridgebelowcmb",
category="mn",
cjkwd="a",
description="COMBINING BRIDGE BELOW",
@@ -7967,6 +8337,7 @@ characters.data={
unicodeslot=0x032A,
},
{
+ adobename="dblarchinvertedbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING INVERTED DOUBLE ARCH BELOW",
@@ -7975,6 +8346,7 @@ characters.data={
unicodeslot=0x032B,
},
{
+ adobename="caronbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING CARON BELOW",
@@ -7983,6 +8355,7 @@ characters.data={
unicodeslot=0x032C,
},
{
+ adobename="circumflexbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING CIRCUMFLEX ACCENT BELOW",
@@ -7991,6 +8364,7 @@ characters.data={
unicodeslot=0x032D,
},
{
+ adobename="brevebelowcmb",
category="mn",
cjkwd="a",
description="COMBINING BREVE BELOW",
@@ -7999,6 +8373,7 @@ characters.data={
unicodeslot=0x032E,
},
{
+ adobename="breveinvertedbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING INVERTED BREVE BELOW",
@@ -8007,6 +8382,7 @@ characters.data={
unicodeslot=0x032F,
},
{
+ adobename="tildebelowcmb",
category="mn",
cjkwd="a",
description="COMBINING TILDE BELOW",
@@ -8015,6 +8391,7 @@ characters.data={
unicodeslot=0x0330,
},
{
+ adobename="macronbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING MACRON BELOW",
@@ -8023,6 +8400,7 @@ characters.data={
unicodeslot=0x0331,
},
{
+ adobename="lowlinecmb",
category="mn",
cjkwd="a",
description="COMBINING LOW LINE",
@@ -8031,6 +8409,7 @@ characters.data={
unicodeslot=0x0332,
},
{
+ adobename="dbllowlinecmb",
category="mn",
cjkwd="a",
description="COMBINING DOUBLE LOW LINE",
@@ -8039,6 +8418,7 @@ characters.data={
unicodeslot=0x0333,
},
{
+ adobename="tildeoverlaycmb",
category="mn",
cjkwd="a",
description="COMBINING TILDE OVERLAY",
@@ -8047,6 +8427,7 @@ characters.data={
unicodeslot=0x0334,
},
{
+ adobename="strokeshortoverlaycmb",
category="mn",
cjkwd="a",
description="COMBINING SHORT STROKE OVERLAY",
@@ -8055,6 +8436,7 @@ characters.data={
unicodeslot=0x0335,
},
{
+ adobename="strokelongoverlaycmb",
category="mn",
cjkwd="a",
description="COMBINING LONG STROKE OVERLAY",
@@ -8063,6 +8445,7 @@ characters.data={
unicodeslot=0x0336,
},
{
+ adobename="solidusshortoverlaycmb",
category="mn",
cjkwd="a",
description="COMBINING SHORT SOLIDUS OVERLAY",
@@ -8071,6 +8454,7 @@ characters.data={
unicodeslot=0x0337,
},
{
+ adobename="soliduslongoverlaycmb",
category="mn",
cjkwd="a",
description="COMBINING LONG SOLIDUS OVERLAY",
@@ -8081,6 +8465,7 @@ characters.data={
unicodeslot=0x0338,
},
{
+ adobename="ringhalfrightbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING RIGHT HALF RING BELOW",
@@ -8089,6 +8474,7 @@ characters.data={
unicodeslot=0x0339,
},
{
+ adobename="bridgeinvertedbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING INVERTED BRIDGE BELOW",
@@ -8097,6 +8483,7 @@ characters.data={
unicodeslot=0x033A,
},
{
+ adobename="squarebelowcmb",
category="mn",
cjkwd="a",
description="COMBINING SQUARE BELOW",
@@ -8105,6 +8492,7 @@ characters.data={
unicodeslot=0x033B,
},
{
+ adobename="seagullbelowcmb",
category="mn",
cjkwd="a",
description="COMBINING SEAGULL BELOW",
@@ -8113,6 +8501,7 @@ characters.data={
unicodeslot=0x033C,
},
{
+ adobename="xabovecmb",
category="mn",
cjkwd="a",
description="COMBINING X ABOVE",
@@ -8121,6 +8510,7 @@ characters.data={
unicodeslot=0x033D,
},
{
+ adobename="tildeverticalcmb",
category="mn",
cjkwd="a",
description="COMBINING VERTICAL TILDE",
@@ -8129,6 +8519,7 @@ characters.data={
unicodeslot=0x033E,
},
{
+ adobename="dbloverlinecmb",
category="mn",
cjkwd="a",
description="COMBINING DOUBLE OVERLINE",
@@ -8137,6 +8528,7 @@ characters.data={
unicodeslot=0x033F,
},
{
+ adobename="gravetonecmb",
category="mn",
cjkwd="a",
description="COMBINING GRAVE TONE MARK",
@@ -8146,6 +8538,7 @@ characters.data={
unicodeslot=0x0340,
},
{
+ adobename="acutetonecmb",
category="mn",
cjkwd="a",
description="COMBINING ACUTE TONE MARK",
@@ -8155,6 +8548,7 @@ characters.data={
unicodeslot=0x0341,
},
{
+ adobename="perispomenigreekcmb",
category="mn",
cjkwd="a",
description="COMBINING GREEK PERISPOMENI",
@@ -8163,6 +8557,7 @@ characters.data={
unicodeslot=0x0342,
},
{
+ adobename="koroniscmb",
category="mn",
cjkwd="a",
description="COMBINING GREEK KORONIS",
@@ -8172,6 +8567,7 @@ characters.data={
unicodeslot=0x0343,
},
{
+ adobename="dialytikatonoscmb",
category="mn",
cjkwd="a",
description="COMBINING GREEK DIALYTIKA TONOS",
@@ -8181,6 +8577,7 @@ characters.data={
unicodeslot=0x0344,
},
{
+ adobename="ypogegrammenigreekcmb",
category="mn",
cjkwd="a",
description="COMBINING GREEK YPOGEGRAMMENI",
@@ -8398,6 +8795,7 @@ characters.data={
unicodeslot=0x035F,
},
{
+ adobename="tildedoublecmb",
category="mn",
cjkwd="a",
description="COMBINING DOUBLE TILDE",
@@ -8406,6 +8804,7 @@ characters.data={
unicodeslot=0x0360,
},
{
+ adobename="breveinverteddoublecmb",
category="mn",
cjkwd="a",
description="COMBINING DOUBLE INVERTED BREVE",
@@ -8526,6 +8925,7 @@ characters.data={
unicodeslot=0x036F,
},
[0x0374]={
+ adobename="numeralsigngreek",
category="sk",
description="GREEK NUMERAL SIGN",
direction="on",
@@ -8534,6 +8934,7 @@ characters.data={
unicodeslot=0x0374,
},
[0x0375]={
+ adobename="numeralsignlowergreek",
category="sk",
description="GREEK LOWER NUMERAL SIGN",
direction="on",
@@ -8541,6 +8942,7 @@ characters.data={
unicodeslot=0x0375,
},
[0x037A]={
+ adobename="ypogegrammeni",
category="lm",
description="GREEK YPOGEGRAMMENI",
direction="l",
@@ -8573,6 +8975,7 @@ characters.data={
unicodeslot=0x037D,
},
[0x037E]={
+ adobename="questiongreek",
category="po",
description="GREEK QUESTION MARK",
direction="on",
@@ -8712,9 +9115,9 @@ characters.data={
description="GREEK CAPITAL LETTER ALPHA",
direction="l",
lccode=0x03B1,
+ linebreak="al",
mathclass="variable",
mathname="Alpha",
- linebreak="al",
unicodeslot=0x0391,
},
[0x0392]={
@@ -8725,9 +9128,9 @@ characters.data={
description="GREEK CAPITAL LETTER BETA",
direction="l",
lccode=0x03B2,
+ linebreak="al",
mathclass="variable",
mathname="Beta",
- linebreak="al",
unicodeslot=0x0392,
},
[0x0393]={
@@ -8737,22 +9140,23 @@ characters.data={
contextname="greekGamma",
description="GREEK CAPITAL LETTER GAMMA",
direction="l",
- mathclass="variable",
- mathname="Gamma",
lccode=0x03B3,
linebreak="al",
+ mathclass="variable",
+ mathname="Gamma",
unicodeslot=0x0393,
},
[0x0394]={
+ adobename="Deltagreek",
category="lu",
cjkwd="a",
contextname="greekDelta",
description="GREEK CAPITAL LETTER DELTA",
direction="l",
- mathclass="variable",
- mathname="Delta",
lccode=0x03B4,
linebreak="al",
+ mathclass="variable",
+ mathname="Delta",
unicodeslot=0x0394,
},
[0x0395]={
@@ -8762,10 +9166,10 @@ characters.data={
contextname="greekEpsilon",
description="GREEK CAPITAL LETTER EPSILON",
direction="l",
- mathclass="variable",
- mathname="Epsilon",
lccode=0x03B5,
linebreak="al",
+ mathclass="variable",
+ mathname="Epsilon",
unicodeslot=0x0395,
},
[0x0396]={
@@ -8775,10 +9179,10 @@ characters.data={
contextname="greekZeta",
description="GREEK CAPITAL LETTER ZETA",
direction="l",
- mathclass="variable",
- mathname="Zeta",
lccode=0x03B6,
linebreak="al",
+ mathclass="variable",
+ mathname="Zeta",
unicodeslot=0x0396,
},
[0x0397]={
@@ -8788,10 +9192,10 @@ characters.data={
contextname="greekEta",
description="GREEK CAPITAL LETTER ETA",
direction="l",
- mathclass="variable",
- mathname="Eta",
lccode=0x03B7,
linebreak="al",
+ mathclass="variable",
+ mathname="Eta",
unicodeslot=0x0397,
},
[0x0398]={
@@ -8801,10 +9205,10 @@ characters.data={
contextname="greekTheta",
description="GREEK CAPITAL LETTER THETA",
direction="l",
- mathclass="variable",
- mathname="Theta",
lccode=0x03B8,
linebreak="al",
+ mathclass="variable",
+ mathname="Theta",
unicodeslot=0x0398,
},
[0x0399]={
@@ -8814,10 +9218,10 @@ characters.data={
contextname="greekIota",
description="GREEK CAPITAL LETTER IOTA",
direction="l",
- mathclass="variable",
- mathname="Iota",
lccode=0x03B9,
linebreak="al",
+ mathclass="variable",
+ mathname="Iota",
unicodeslot=0x0399,
},
[0x039A]={
@@ -8827,10 +9231,10 @@ characters.data={
contextname="greekKappa",
description="GREEK CAPITAL LETTER KAPPA",
direction="l",
- mathclass="variable",
- mathname="Kappa",
lccode=0x03BA,
linebreak="al",
+ mathclass="variable",
+ mathname="Kappa",
unicodeslot=0x039A,
},
[0x039B]={
@@ -8840,10 +9244,10 @@ characters.data={
contextname="greekLambda",
description="GREEK CAPITAL LETTER LAMDA",
direction="l",
- mathclass="variable",
- mathname="Lambda",
lccode=0x03BB,
linebreak="al",
+ mathclass="variable",
+ mathname="Lambda",
unicodeslot=0x039B,
},
[0x039C]={
@@ -8853,10 +9257,10 @@ characters.data={
contextname="greekMu",
description="GREEK CAPITAL LETTER MU",
direction="l",
- mathclass="variable",
- mathname="Mu",
lccode=0x03BC,
linebreak="al",
+ mathclass="variable",
+ mathname="Mu",
unicodeslot=0x039C,
},
[0x039D]={
@@ -8866,10 +9270,10 @@ characters.data={
contextname="greekNu",
description="GREEK CAPITAL LETTER NU",
direction="l",
- mathclass="variable",
- mathname="Nu",
lccode=0x03BD,
linebreak="al",
+ mathclass="variable",
+ mathname="Nu",
unicodeslot=0x039D,
},
[0x039E]={
@@ -8879,10 +9283,10 @@ characters.data={
contextname="greekXi",
description="GREEK CAPITAL LETTER XI",
direction="l",
- mathclass="variable",
- mathname="Xi",
lccode=0x03BE,
linebreak="al",
+ mathclass="variable",
+ mathname="Xi",
unicodeslot=0x039E,
},
[0x039F]={
@@ -8892,10 +9296,10 @@ characters.data={
contextname="greekOmicron",
description="GREEK CAPITAL LETTER OMICRON",
direction="l",
- mathclass="variable",
- mathname="Omicron",
lccode=0x03BF,
linebreak="al",
+ mathclass="variable",
+ mathname="Omicron",
unicodeslot=0x039F,
},
[0x03A0]={
@@ -8905,10 +9309,10 @@ characters.data={
contextname="greekPi",
description="GREEK CAPITAL LETTER PI",
direction="l",
- mathclass="variable",
- mathname="Pi",
lccode=0x03C0,
linebreak="al",
+ mathclass="variable",
+ mathname="Pi",
unicodeslot=0x03A0,
},
[0x03A1]={
@@ -8918,10 +9322,10 @@ characters.data={
contextname="greekRho",
description="GREEK CAPITAL LETTER RHO",
direction="l",
- mathclass="variable",
- mathname="Rho",
lccode=0x03C1,
linebreak="al",
+ mathclass="variable",
+ mathname="Rho",
unicodeslot=0x03A1,
},
[0x03A3]={
@@ -8931,10 +9335,10 @@ characters.data={
contextname="greekSigma",
description="GREEK CAPITAL LETTER SIGMA",
direction="l",
- mathclass="variable",
- mathname="Sigma",
lccode=0x03C3,
linebreak="al",
+ mathclass="variable",
+ mathname="Sigma",
unicodeslot=0x03A3,
},
[0x03A4]={
@@ -8944,10 +9348,10 @@ characters.data={
contextname="greekTau",
description="GREEK CAPITAL LETTER TAU",
direction="l",
- mathclass="variable",
- mathname="Tau",
lccode=0x03C4,
linebreak="al",
+ mathclass="variable",
+ mathname="Tau",
unicodeslot=0x03A4,
},
[0x03A5]={
@@ -8957,10 +9361,10 @@ characters.data={
contextname="greekUpsilon",
description="GREEK CAPITAL LETTER UPSILON",
direction="l",
- mathclass="variable",
- mathname="Upsilon",
lccode=0x03C5,
linebreak="al",
+ mathclass="variable",
+ mathname="Upsilon",
unicodeslot=0x03A5,
},
[0x03A6]={
@@ -8970,10 +9374,10 @@ characters.data={
contextname="greekPhi",
description="GREEK CAPITAL LETTER PHI",
direction="l",
- mathclass="variable",
- mathname="Phi",
lccode=0x03C6,
linebreak="al",
+ mathclass="variable",
+ mathname="Phi",
unicodeslot=0x03A6,
},
[0x03A7]={
@@ -8983,10 +9387,10 @@ characters.data={
contextname="greekChi",
description="GREEK CAPITAL LETTER CHI",
direction="l",
- mathclass="variable",
- mathname="Chi",
lccode=0x03C7,
linebreak="al",
+ mathclass="variable",
+ mathname="Chi",
unicodeslot=0x03A7,
},
[0x03A8]={
@@ -8996,22 +9400,23 @@ characters.data={
contextname="greekPsi",
description="GREEK CAPITAL LETTER PSI",
direction="l",
- mathclass="variable",
- mathname="Psi",
lccode=0x03C8,
linebreak="al",
+ mathclass="variable",
+ mathname="Psi",
unicodeslot=0x03A8,
},
[0x03A9]={
+ adobename="Omegagreek",
category="lu",
cjkwd="a",
contextname="greekOmega",
description="GREEK CAPITAL LETTER OMEGA",
direction="l",
- mathclass="variable",
- mathname="Omega",
lccode=0x03C9,
linebreak="al",
+ mathclass="variable",
+ mathname="Omega",
unicodeslot=0x03A9,
},
[0x03AA]={
@@ -9241,6 +9646,7 @@ characters.data={
unicodeslot=0x03BB,
},
[0x03BC]={
+ adobename="mugreek",
category="ll",
cjkwd="a",
contextname="greekmu",
@@ -9318,7 +9724,7 @@ characters.data={
unicodeslot=0x03C1,
},
[0x03C2]={
- adobename="sigma1",
+ adobename="sigmafinal",
category="ll",
contextname="greekfinalsigma",
description="GREEK SMALL LETTER FINAL SIGMA",
@@ -9481,6 +9887,7 @@ characters.data={
unicodeslot=0x03CE,
},
[0x03D0]={
+ adobename="betasymbolgreek",
category="ll",
description="GREEK BETA SYMBOL",
direction="l",
@@ -9490,7 +9897,7 @@ characters.data={
unicodeslot=0x03D0,
},
[0x03D1]={
- adobename="theta1",
+ adobename="thetasymbolgreek",
category="ll",
contextname="greekthetaalt",
description="GREEK THETA SYMBOL",
@@ -9503,7 +9910,7 @@ characters.data={
unicodeslot=0x03D1,
},
[0x03D2]={
- adobename="Upsilon1",
+ adobename="Upsilonhooksymbol",
category="lu",
description="GREEK UPSILON WITH HOOK SYMBOL",
direction="l",
@@ -9512,6 +9919,7 @@ characters.data={
unicodeslot=0x03D2,
},
[0x03D3]={
+ adobename="Upsilonacutehooksymbolgreek",
category="lu",
description="GREEK UPSILON WITH ACUTE AND HOOK SYMBOL",
direction="l",
@@ -9520,6 +9928,7 @@ characters.data={
unicodeslot=0x03D3,
},
[0x03D4]={
+ adobename="Upsilondieresishooksymbolgreek",
category="lu",
description="GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL",
direction="l",
@@ -9528,20 +9937,20 @@ characters.data={
unicodeslot=0x03D4,
},
[0x03D5]={
- adobename="phi1",
+ adobename="phisymbolgreek",
category="ll",
contextname="greekphialt",
description="GREEK PHI SYMBOL",
direction="l",
linebreak="al",
- specials={ "compat", 0x03C6 },
mathclass="variable",
mathname="phi",
+ specials={ "compat", 0x03C6 },
uccode=0x03A6,
unicodeslot=0x03D5,
},
[0x03D6]={
- adobename="omega1",
+ adobename="pisymbolgreek",
category="ll",
contextname="greekpialt",
description="GREEK PI SYMBOL",
@@ -9578,6 +9987,7 @@ characters.data={
unicodeslot=0x03D9,
},
[0x03DA]={
+ adobename="Stigmagreek",
category="lu",
description="GREEK LETTER STIGMA",
direction="l",
@@ -9595,6 +10005,7 @@ characters.data={
unicodeslot=0x03DB,
},
[0x03DC]={
+ adobename="Digammagreek",
category="lu",
description="GREEK LETTER DIGAMMA",
direction="l",
@@ -9614,6 +10025,7 @@ characters.data={
unicodeslot=0x03DD,
},
[0x03DE]={
+ adobename="Koppagreek",
category="lu",
description="GREEK LETTER KOPPA",
direction="l",
@@ -9631,6 +10043,7 @@ characters.data={
unicodeslot=0x03DF,
},
[0x03E0]={
+ adobename="Sampigreek",
category="lu",
description="GREEK LETTER SAMPI",
direction="l",
@@ -9648,6 +10061,7 @@ characters.data={
unicodeslot=0x03E1,
},
[0x03E2]={
+ adobename="Sheicoptic",
category="lu",
description="COPTIC CAPITAL LETTER SHEI",
direction="l",
@@ -9656,6 +10070,7 @@ characters.data={
unicodeslot=0x03E2,
},
[0x03E3]={
+ adobename="sheicoptic",
category="ll",
description="COPTIC SMALL LETTER SHEI",
direction="l",
@@ -9664,6 +10079,7 @@ characters.data={
unicodeslot=0x03E3,
},
[0x03E4]={
+ adobename="Feicoptic",
category="lu",
description="COPTIC CAPITAL LETTER FEI",
direction="l",
@@ -9672,6 +10088,7 @@ characters.data={
unicodeslot=0x03E4,
},
[0x03E5]={
+ adobename="feicoptic",
category="ll",
description="COPTIC SMALL LETTER FEI",
direction="l",
@@ -9680,6 +10097,7 @@ characters.data={
unicodeslot=0x03E5,
},
[0x03E6]={
+ adobename="Kheicoptic",
category="lu",
description="COPTIC CAPITAL LETTER KHEI",
direction="l",
@@ -9688,6 +10106,7 @@ characters.data={
unicodeslot=0x03E6,
},
[0x03E7]={
+ adobename="kheicoptic",
category="ll",
description="COPTIC SMALL LETTER KHEI",
direction="l",
@@ -9696,6 +10115,7 @@ characters.data={
unicodeslot=0x03E7,
},
[0x03E8]={
+ adobename="Horicoptic",
category="lu",
description="COPTIC CAPITAL LETTER HORI",
direction="l",
@@ -9704,6 +10124,7 @@ characters.data={
unicodeslot=0x03E8,
},
[0x03E9]={
+ adobename="horicoptic",
category="ll",
description="COPTIC SMALL LETTER HORI",
direction="l",
@@ -9712,6 +10133,7 @@ characters.data={
unicodeslot=0x03E9,
},
[0x03EA]={
+ adobename="Gangiacoptic",
category="lu",
description="COPTIC CAPITAL LETTER GANGIA",
direction="l",
@@ -9720,6 +10142,7 @@ characters.data={
unicodeslot=0x03EA,
},
[0x03EB]={
+ adobename="gangiacoptic",
category="ll",
description="COPTIC SMALL LETTER GANGIA",
direction="l",
@@ -9728,6 +10151,7 @@ characters.data={
unicodeslot=0x03EB,
},
[0x03EC]={
+ adobename="Shimacoptic",
category="lu",
description="COPTIC CAPITAL LETTER SHIMA",
direction="l",
@@ -9736,6 +10160,7 @@ characters.data={
unicodeslot=0x03EC,
},
[0x03ED]={
+ adobename="shimacoptic",
category="ll",
description="COPTIC SMALL LETTER SHIMA",
direction="l",
@@ -9744,6 +10169,7 @@ characters.data={
unicodeslot=0x03ED,
},
[0x03EE]={
+ adobename="Deicoptic",
category="lu",
description="COPTIC CAPITAL LETTER DEI",
direction="l",
@@ -9752,6 +10178,7 @@ characters.data={
unicodeslot=0x03EE,
},
[0x03EF]={
+ adobename="deicoptic",
category="ll",
description="COPTIC SMALL LETTER DEI",
direction="l",
@@ -9760,17 +10187,19 @@ characters.data={
unicodeslot=0x03EF,
},
[0x03F0]={
+ adobename="kappasymbolgreek",
category="ll",
description="GREEK KAPPA SYMBOL",
direction="l",
linebreak="al",
- specials={ "compat", 0x03BA },
mathclass="ord",
mathname="varkappa",
+ specials={ "compat", 0x03BA },
uccode=0x039A,
unicodeslot=0x03F0,
},
[0x03F1]={
+ adobename="rhosymbolgreek",
category="ll",
contextname="greekrhoalt",
description="GREEK RHO SYMBOL",
@@ -9781,6 +10210,7 @@ characters.data={
unicodeslot=0x03F1,
},
[0x03F2]={
+ adobename="sigmalunatesymbolgreek",
category="ll",
contextname="greeksigmalunate",
description="GREEK LUNATE SIGMA SYMBOL",
@@ -9791,6 +10221,7 @@ characters.data={
unicodeslot=0x03F2,
},
[0x03F3]={
+ adobename="yotgreek",
category="ll",
description="GREEK LETTER YOT",
direction="l",
@@ -10433,7 +10864,7 @@ characters.data={
unicodeslot=0x0430,
},
[0x0431]={
- adobename="afii10066",
+ adobename="becyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicb",
@@ -10444,7 +10875,7 @@ characters.data={
unicodeslot=0x0431,
},
[0x0432]={
- adobename="afii10067",
+ adobename="vecyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicv",
@@ -10455,7 +10886,7 @@ characters.data={
unicodeslot=0x0432,
},
[0x0433]={
- adobename="afii10068",
+ adobename="gecyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicg",
@@ -10466,7 +10897,7 @@ characters.data={
unicodeslot=0x0433,
},
[0x0434]={
- adobename="afii10069",
+ adobename="decyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicd",
@@ -10477,7 +10908,7 @@ characters.data={
unicodeslot=0x0434,
},
[0x0435]={
- adobename="afii10070",
+ adobename="iecyrillic",
category="ll",
cjkwd="a",
contextname="cyrillice",
@@ -10488,7 +10919,7 @@ characters.data={
unicodeslot=0x0435,
},
[0x0436]={
- adobename="afii10072",
+ adobename="zhecyrillic",
category="ll",
cjkwd="a",
contextname="cyrilliczh",
@@ -10499,7 +10930,7 @@ characters.data={
unicodeslot=0x0436,
},
[0x0437]={
- adobename="afii10073",
+ adobename="zecyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicz",
@@ -10510,7 +10941,7 @@ characters.data={
unicodeslot=0x0437,
},
[0x0438]={
- adobename="afii10074",
+ adobename="iicyrillic",
category="ll",
cjkwd="a",
contextname="cyrillici",
@@ -10521,7 +10952,7 @@ characters.data={
unicodeslot=0x0438,
},
[0x0439]={
- adobename="afii10075",
+ adobename="iishortcyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicishrt",
@@ -10533,7 +10964,7 @@ characters.data={
unicodeslot=0x0439,
},
[0x043A]={
- adobename="afii10076",
+ adobename="kacyrillic",
category="ll",
cjkwd="a",
contextname="cyrillick",
@@ -10544,7 +10975,7 @@ characters.data={
unicodeslot=0x043A,
},
[0x043B]={
- adobename="afii10077",
+ adobename="elcyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicl",
@@ -10555,7 +10986,7 @@ characters.data={
unicodeslot=0x043B,
},
[0x043C]={
- adobename="afii10078",
+ adobename="emcyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicm",
@@ -10566,7 +10997,7 @@ characters.data={
unicodeslot=0x043C,
},
[0x043D]={
- adobename="afii10079",
+ adobename="encyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicn",
@@ -10577,7 +11008,7 @@ characters.data={
unicodeslot=0x043D,
},
[0x043E]={
- adobename="afii10080",
+ adobename="ocyrillic",
category="ll",
cjkwd="a",
contextname="cyrillico",
@@ -10588,7 +11019,7 @@ characters.data={
unicodeslot=0x043E,
},
[0x043F]={
- adobename="afii10081",
+ adobename="pecyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicp",
@@ -10599,7 +11030,7 @@ characters.data={
unicodeslot=0x043F,
},
[0x0440]={
- adobename="afii10082",
+ adobename="ercyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicr",
@@ -10610,7 +11041,7 @@ characters.data={
unicodeslot=0x0440,
},
[0x0441]={
- adobename="afii10083",
+ adobename="escyrillic",
category="ll",
cjkwd="a",
contextname="cyrillics",
@@ -10621,7 +11052,7 @@ characters.data={
unicodeslot=0x0441,
},
[0x0442]={
- adobename="afii10084",
+ adobename="tecyrillic",
category="ll",
cjkwd="a",
contextname="cyrillict",
@@ -10632,7 +11063,7 @@ characters.data={
unicodeslot=0x0442,
},
[0x0443]={
- adobename="afii10085",
+ adobename="ucyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicu",
@@ -10643,7 +11074,7 @@ characters.data={
unicodeslot=0x0443,
},
[0x0444]={
- adobename="afii10086",
+ adobename="efcyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicf",
@@ -10654,7 +11085,7 @@ characters.data={
unicodeslot=0x0444,
},
[0x0445]={
- adobename="afii10087",
+ adobename="khacyrillic",
category="ll",
cjkwd="a",
contextname="cyrillich",
@@ -10665,7 +11096,7 @@ characters.data={
unicodeslot=0x0445,
},
[0x0446]={
- adobename="afii10088",
+ adobename="tsecyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicc",
@@ -10676,7 +11107,7 @@ characters.data={
unicodeslot=0x0446,
},
[0x0447]={
- adobename="afii10089",
+ adobename="checyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicch",
@@ -10687,7 +11118,7 @@ characters.data={
unicodeslot=0x0447,
},
[0x0448]={
- adobename="afii10090",
+ adobename="shacyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicsh",
@@ -10698,7 +11129,7 @@ characters.data={
unicodeslot=0x0448,
},
[0x0449]={
- adobename="afii10091",
+ adobename="shchacyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicshch",
@@ -10709,7 +11140,7 @@ characters.data={
unicodeslot=0x0449,
},
[0x044A]={
- adobename="afii10092",
+ adobename="hardsigncyrillic",
category="ll",
cjkwd="a",
contextname="cyrillichrdsn",
@@ -10720,7 +11151,7 @@ characters.data={
unicodeslot=0x044A,
},
[0x044B]={
- adobename="afii10093",
+ adobename="yericyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicery",
@@ -10731,7 +11162,7 @@ characters.data={
unicodeslot=0x044B,
},
[0x044C]={
- adobename="afii10094",
+ adobename="softsigncyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicsftsn",
@@ -10742,7 +11173,7 @@ characters.data={
unicodeslot=0x044C,
},
[0x044D]={
- adobename="afii10095",
+ adobename="ereversedcyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicerev",
@@ -10753,7 +11184,7 @@ characters.data={
unicodeslot=0x044D,
},
[0x044E]={
- adobename="afii10096",
+ adobename="iucyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicyu",
@@ -10764,7 +11195,7 @@ characters.data={
unicodeslot=0x044E,
},
[0x044F]={
- adobename="afii10097",
+ adobename="iacyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicya",
@@ -10786,7 +11217,7 @@ characters.data={
unicodeslot=0x0450,
},
[0x0451]={
- adobename="afii10071",
+ adobename="iocyrillic",
category="ll",
cjkwd="a",
contextname="cyrillicyo",
@@ -10798,7 +11229,7 @@ characters.data={
unicodeslot=0x0451,
},
[0x0452]={
- adobename="afii10099",
+ adobename="djecyrillic",
category="ll",
contextname="cyrillicdje",
description="CYRILLIC SMALL LETTER DJE",
@@ -10808,7 +11239,7 @@ characters.data={
unicodeslot=0x0452,
},
[0x0453]={
- adobename="afii10100",
+ adobename="gjecyrillic",
category="ll",
contextname="cyrillicgje",
description="CYRILLIC SMALL LETTER GJE",
@@ -10819,7 +11250,7 @@ characters.data={
unicodeslot=0x0453,
},
[0x0454]={
- adobename="afii10101",
+ adobename="ecyrillic",
category="ll",
contextname="cyrillicie",
description="CYRILLIC SMALL LETTER UKRAINIAN IE",
@@ -10829,7 +11260,7 @@ characters.data={
unicodeslot=0x0454,
},
[0x0455]={
- adobename="afii10102",
+ adobename="dzecyrillic",
category="ll",
contextname="cyrillicdze",
description="CYRILLIC SMALL LETTER DZE",
@@ -10839,7 +11270,7 @@ characters.data={
unicodeslot=0x0455,
},
[0x0456]={
- adobename="afii10103",
+ adobename="icyrillic",
category="ll",
contextname="cyrillicii",
description="CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I",
@@ -10849,7 +11280,7 @@ characters.data={
unicodeslot=0x0456,
},
[0x0457]={
- adobename="afii10104",
+ adobename="yicyrillic",
category="ll",
contextname="cyrillicyi",
description="CYRILLIC SMALL LETTER YI",
@@ -10860,7 +11291,7 @@ characters.data={
unicodeslot=0x0457,
},
[0x0458]={
- adobename="afii10105",
+ adobename="jecyrillic",
category="ll",
contextname="cyrillicje",
description="CYRILLIC SMALL LETTER JE",
@@ -10870,7 +11301,7 @@ characters.data={
unicodeslot=0x0458,
},
[0x0459]={
- adobename="afii10106",
+ adobename="ljecyrillic",
category="ll",
contextname="cyrilliclje",
description="CYRILLIC SMALL LETTER LJE",
@@ -10880,7 +11311,7 @@ characters.data={
unicodeslot=0x0459,
},
[0x045A]={
- adobename="afii10107",
+ adobename="njecyrillic",
category="ll",
contextname="cyrillicnje",
description="CYRILLIC SMALL LETTER NJE",
@@ -10890,7 +11321,7 @@ characters.data={
unicodeslot=0x045A,
},
[0x045B]={
- adobename="afii10108",
+ adobename="tshecyrillic",
category="ll",
contextname="cyrillictshe",
description="CYRILLIC SMALL LETTER TSHE",
@@ -10900,7 +11331,7 @@ characters.data={
unicodeslot=0x045B,
},
[0x045C]={
- adobename="afii10109",
+ adobename="kjecyrillic",
category="ll",
contextname="cyrillickje",
description="CYRILLIC SMALL LETTER KJE",
@@ -10922,7 +11353,7 @@ characters.data={
unicodeslot=0x045D,
},
[0x045E]={
- adobename="afii10110",
+ adobename="ushortcyrillic",
category="ll",
contextname="cyrillicushrt",
description="CYRILLIC SMALL LETTER SHORT U",
@@ -10933,7 +11364,7 @@ characters.data={
unicodeslot=0x045E,
},
[0x045F]={
- adobename="afii10193",
+ adobename="dzhecyrillic",
category="ll",
contextname="cyrillicdzhe",
description="CYRILLIC SMALL LETTER DZHE",
@@ -10943,6 +11374,7 @@ characters.data={
unicodeslot=0x045F,
},
[0x0460]={
+ adobename="Omegacyrillic",
category="lu",
contextname="cyrillicOMEGA",
description="CYRILLIC CAPITAL LETTER OMEGA",
@@ -10952,6 +11384,7 @@ characters.data={
unicodeslot=0x0460,
},
[0x0461]={
+ adobename="omegacyrillic",
category="ll",
contextname="cyrillicomega",
description="CYRILLIC SMALL LETTER OMEGA",
@@ -10971,7 +11404,7 @@ characters.data={
unicodeslot=0x0462,
},
[0x0463]={
- adobename="afii10194",
+ adobename="yatcyrillic",
category="ll",
contextname="cyrillicyat",
description="CYRILLIC SMALL LETTER YAT",
@@ -10981,6 +11414,7 @@ characters.data={
unicodeslot=0x0463,
},
[0x0464]={
+ adobename="Eiotifiedcyrillic",
category="lu",
contextname="cyrillicEiotified",
description="CYRILLIC CAPITAL LETTER IOTIFIED E",
@@ -10990,6 +11424,7 @@ characters.data={
unicodeslot=0x0464,
},
[0x0465]={
+ adobename="eiotifiedcyrillic",
category="ll",
contextname="cyrilliceiotified",
description="CYRILLIC SMALL LETTER IOTIFIED E",
@@ -10999,6 +11434,7 @@ characters.data={
unicodeslot=0x0465,
},
[0x0466]={
+ adobename="Yuslittlecyrillic",
category="lu",
contextname="cyrillicLITTLEYUS",
description="CYRILLIC CAPITAL LETTER LITTLE YUS",
@@ -11008,6 +11444,7 @@ characters.data={
unicodeslot=0x0466,
},
[0x0467]={
+ adobename="yuslittlecyrillic",
category="ll",
contextname="cyrilliclittleyus",
description="CYRILLIC SMALL LETTER LITTLE YUS",
@@ -11017,6 +11454,7 @@ characters.data={
unicodeslot=0x0467,
},
[0x0468]={
+ adobename="Yuslittleiotifiedcyrillic",
category="lu",
contextname="cyrillicLITTLEYUSiotified",
description="CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS",
@@ -11026,6 +11464,7 @@ characters.data={
unicodeslot=0x0468,
},
[0x0469]={
+ adobename="yuslittleiotifiedcyrillic",
category="ll",
contextname="cyrilliclittleyusiotified",
description="CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS",
@@ -11035,6 +11474,7 @@ characters.data={
unicodeslot=0x0469,
},
[0x046A]={
+ adobename="Yusbigcyrillic",
category="lu",
contextname="cyrillicBIGYUS",
description="CYRILLIC CAPITAL LETTER BIG YUS",
@@ -11044,6 +11484,7 @@ characters.data={
unicodeslot=0x046A,
},
[0x046B]={
+ adobename="yusbigcyrillic",
category="ll",
contextname="cyrillicbigyus",
description="CYRILLIC SMALL LETTER BIG YUS",
@@ -11053,6 +11494,7 @@ characters.data={
unicodeslot=0x046B,
},
[0x046C]={
+ adobename="Yusbigiotifiedcyrillic",
category="lu",
contextname="cyrillicBIGYUSiotified",
description="CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS",
@@ -11062,6 +11504,7 @@ characters.data={
unicodeslot=0x046C,
},
[0x046D]={
+ adobename="yusbigiotifiedcyrillic",
category="ll",
contextname="cyrillicbigyusiotified",
description="CYRILLIC SMALL LETTER IOTIFIED BIG YUS",
@@ -11071,6 +11514,7 @@ characters.data={
unicodeslot=0x046D,
},
[0x046E]={
+ adobename="Ksicyrillic",
category="lu",
contextname="cyrillicKSI",
description="CYRILLIC CAPITAL LETTER KSI",
@@ -11080,6 +11524,7 @@ characters.data={
unicodeslot=0x046E,
},
[0x046F]={
+ adobename="ksicyrillic",
category="ll",
contextname="cyrillicksi",
description="CYRILLIC SMALL LETTER KSI",
@@ -11089,6 +11534,7 @@ characters.data={
unicodeslot=0x046F,
},
[0x0470]={
+ adobename="Psicyrillic",
category="lu",
contextname="cyrillicPSI",
description="CYRILLIC CAPITAL LETTER PSI",
@@ -11098,6 +11544,7 @@ characters.data={
unicodeslot=0x0470,
},
[0x0471]={
+ adobename="psicyrillic",
category="ll",
contextname="cyrillicpsi",
description="CYRILLIC SMALL LETTER PSI",
@@ -11117,7 +11564,7 @@ characters.data={
unicodeslot=0x0472,
},
[0x0473]={
- adobename="afii10195",
+ adobename="fitacyrillic",
category="ll",
contextname="cyrillicfita",
description="CYRILLIC SMALL LETTER FITA",
@@ -11137,7 +11584,7 @@ characters.data={
unicodeslot=0x0474,
},
[0x0475]={
- adobename="afii10196",
+ adobename="izhitsacyrillic",
category="ll",
contextname="cyrillicizhitsa",
description="CYRILLIC SMALL LETTER IZHITSA",
@@ -11147,6 +11594,7 @@ characters.data={
unicodeslot=0x0475,
},
[0x0476]={
+ adobename="Izhitsadblgravecyrillic",
category="lu",
contextname="cyrillicIZHITSAdoublegrave",
description="CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT",
@@ -11158,6 +11606,7 @@ characters.data={
unicodeslot=0x0476,
},
[0x0477]={
+ adobename="izhitsadblgravecyrillic",
category="ll",
contextname="cyrillicizhitsadoublegrave",
description="CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT",
@@ -11169,6 +11618,7 @@ characters.data={
unicodeslot=0x0477,
},
[0x0478]={
+ adobename="Ukcyrillic",
category="lu",
contextname="cyrillicUK",
description="CYRILLIC CAPITAL LETTER UK",
@@ -11178,6 +11628,7 @@ characters.data={
unicodeslot=0x0478,
},
[0x0479]={
+ adobename="ukcyrillic",
category="ll",
contextname="cyrillicuk",
description="CYRILLIC SMALL LETTER UK",
@@ -11187,6 +11638,7 @@ characters.data={
unicodeslot=0x0479,
},
[0x047A]={
+ adobename="Omegaroundcyrillic",
category="lu",
contextname="cyrillicOMEGAround",
description="CYRILLIC CAPITAL LETTER ROUND OMEGA",
@@ -11196,6 +11648,7 @@ characters.data={
unicodeslot=0x047A,
},
[0x047B]={
+ adobename="omegaroundcyrillic",
category="ll",
contextname="cyrillicomegaround",
description="CYRILLIC SMALL LETTER ROUND OMEGA",
@@ -11205,6 +11658,7 @@ characters.data={
unicodeslot=0x047B,
},
[0x047C]={
+ adobename="Omegatitlocyrillic",
category="lu",
contextname="cyrillicOMEGAtitlo",
description="CYRILLIC CAPITAL LETTER OMEGA WITH TITLO",
@@ -11215,6 +11669,7 @@ characters.data={
unicodeslot=0x047C,
},
[0x047D]={
+ adobename="omegatitlocyrillic",
category="ll",
contextname="cyrillicomegatitlo",
description="CYRILLIC SMALL LETTER OMEGA WITH TITLO",
@@ -11225,6 +11680,7 @@ characters.data={
unicodeslot=0x047D,
},
[0x047E]={
+ adobename="Otcyrillic",
category="lu",
contextname="cyrillicOT",
description="CYRILLIC CAPITAL LETTER OT",
@@ -11234,6 +11690,7 @@ characters.data={
unicodeslot=0x047E,
},
[0x047F]={
+ adobename="otcyrillic",
category="ll",
contextname="cyrillicot",
description="CYRILLIC SMALL LETTER OT",
@@ -11243,6 +11700,7 @@ characters.data={
unicodeslot=0x047F,
},
[0x0480]={
+ adobename="Koppacyrillic",
category="lu",
contextname="cyrillicKOPPA",
description="CYRILLIC CAPITAL LETTER KOPPA",
@@ -11252,6 +11710,7 @@ characters.data={
unicodeslot=0x0480,
},
[0x0481]={
+ adobename="koppacyrillic",
category="ll",
contextname="cyrillickoppa",
description="CYRILLIC SMALL LETTER KOPPA",
@@ -11261,6 +11720,7 @@ characters.data={
unicodeslot=0x0481,
},
[0x0482]={
+ adobename="thousandcyrillic",
category="so",
description="CYRILLIC THOUSANDS SIGN",
direction="l",
@@ -11268,6 +11728,7 @@ characters.data={
unicodeslot=0x0482,
},
[0x0483]={
+ adobename="titlocyrilliccmb",
category="mn",
contextname="cyrillicTITLO",
description="COMBINING CYRILLIC TITLO",
@@ -11276,6 +11737,7 @@ characters.data={
unicodeslot=0x0483,
},
[0x0484]={
+ adobename="palatalizationcyrilliccmb",
category="mn",
contextname="cyrillicPALATALIZATION",
description="COMBINING CYRILLIC PALATALIZATION",
@@ -11284,6 +11746,7 @@ characters.data={
unicodeslot=0x0484,
},
[0x0485]={
+ adobename="dasiapneumatacyrilliccmb",
category="mn",
contextname="cyrillicDASIAPNEUMATA",
description="COMBINING CYRILLIC DASIA PNEUMATA",
@@ -11292,6 +11755,7 @@ characters.data={
unicodeslot=0x0485,
},
[0x0486]={
+ adobename="psilipneumatacyrilliccmb",
category="mn",
contextname="cyrillicPSILIPNEUMATA",
description="COMBINING CYRILLIC PSILI PNEUMATA",
@@ -11381,7 +11845,7 @@ characters.data={
unicodeslot=0x0490,
},
[0x0491]={
- adobename="afii10098",
+ adobename="gheupturncyrillic",
category="ll",
contextname="cyrillicgheupturn",
description="CYRILLIC SMALL LETTER GHE WITH UPTURN",
@@ -11392,6 +11856,7 @@ characters.data={
unicodeslot=0x0491,
},
[0x0492]={
+ adobename="Ghestrokecyrillic",
category="lu",
contextname="cyrillicGHEstroke",
description="CYRILLIC CAPITAL LETTER GHE WITH STROKE",
@@ -11402,6 +11867,7 @@ characters.data={
unicodeslot=0x0492,
},
[0x0493]={
+ adobename="ghestrokecyrillic",
category="ll",
contextname="cyrillicghestroke",
description="CYRILLIC SMALL LETTER GHE WITH STROKE",
@@ -11412,6 +11878,7 @@ characters.data={
unicodeslot=0x0493,
},
[0x0494]={
+ adobename="Ghemiddlehookcyrillic",
category="lu",
contextname="cyrillicGHEmidhook",
description="CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK",
@@ -11422,6 +11889,7 @@ characters.data={
unicodeslot=0x0494,
},
[0x0495]={
+ adobename="ghemiddlehookcyrillic",
category="ll",
contextname="cyrillicghemidhook",
description="CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK",
@@ -11432,6 +11900,7 @@ characters.data={
unicodeslot=0x0495,
},
[0x0496]={
+ adobename="Zhedescendercyrillic",
category="lu",
contextname="cyrillicZHEdescender",
description="CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER",
@@ -11442,6 +11911,7 @@ characters.data={
unicodeslot=0x0496,
},
[0x0497]={
+ adobename="zhedescendercyrillic",
category="ll",
contextname="cyrilliczhedescender",
description="CYRILLIC SMALL LETTER ZHE WITH DESCENDER",
@@ -11452,6 +11922,7 @@ characters.data={
unicodeslot=0x0497,
},
[0x0498]={
+ adobename="Zedescendercyrillic",
category="lu",
contextname="cyrillicZDSC",
description="CYRILLIC CAPITAL LETTER ZE WITH DESCENDER",
@@ -11462,6 +11933,7 @@ characters.data={
unicodeslot=0x0498,
},
[0x0499]={
+ adobename="zedescendercyrillic",
category="ll",
contextname="cyrilliczdsc",
description="CYRILLIC SMALL LETTER ZE WITH DESCENDER",
@@ -11472,6 +11944,7 @@ characters.data={
unicodeslot=0x0499,
},
[0x049A]={
+ adobename="Kadescendercyrillic",
category="lu",
contextname="cyrillicKADC",
description="CYRILLIC CAPITAL LETTER KA WITH DESCENDER",
@@ -11482,6 +11955,7 @@ characters.data={
unicodeslot=0x049A,
},
[0x049B]={
+ adobename="kadescendercyrillic",
category="ll",
contextname="cyrillickadc",
description="CYRILLIC SMALL LETTER KA WITH DESCENDER",
@@ -11492,6 +11966,7 @@ characters.data={
unicodeslot=0x049B,
},
[0x049C]={
+ adobename="Kaverticalstrokecyrillic",
category="lu",
contextname="cyrillicKAvertstroke",
description="CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE",
@@ -11502,6 +11977,7 @@ characters.data={
unicodeslot=0x049C,
},
[0x049D]={
+ adobename="kaverticalstrokecyrillic",
category="ll",
contextname="cyrillickavertstroke",
description="CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE",
@@ -11512,6 +11988,7 @@ characters.data={
unicodeslot=0x049D,
},
[0x049E]={
+ adobename="Kastrokecyrillic",
category="lu",
contextname="cyrillicKAstroke",
description="CYRILLIC CAPITAL LETTER KA WITH STROKE",
@@ -11522,6 +11999,7 @@ characters.data={
unicodeslot=0x049E,
},
[0x049F]={
+ adobename="kastrokecyrillic",
category="ll",
contextname="cyrillickastroke",
description="CYRILLIC SMALL LETTER KA WITH STROKE",
@@ -11532,6 +12010,7 @@ characters.data={
unicodeslot=0x049F,
},
[0x04A0]={
+ adobename="Kabashkircyrillic",
category="lu",
contextname="cyrillicKAbashkir",
description="CYRILLIC CAPITAL LETTER BASHKIR KA",
@@ -11541,6 +12020,7 @@ characters.data={
unicodeslot=0x04A0,
},
[0x04A1]={
+ adobename="kabashkircyrillic",
category="ll",
contextname="cyrillickabashkir",
description="CYRILLIC SMALL LETTER BASHKIR KA",
@@ -11550,6 +12030,7 @@ characters.data={
unicodeslot=0x04A1,
},
[0x04A2]={
+ adobename="Endescendercyrillic",
category="lu",
contextname="cyrillicENDC",
description="CYRILLIC CAPITAL LETTER EN WITH DESCENDER",
@@ -11560,6 +12041,7 @@ characters.data={
unicodeslot=0x04A2,
},
[0x04A3]={
+ adobename="endescendercyrillic",
category="ll",
contextname="cyrillicendc",
description="CYRILLIC SMALL LETTER EN WITH DESCENDER",
@@ -11570,6 +12052,7 @@ characters.data={
unicodeslot=0x04A3,
},
[0x04A4]={
+ adobename="Enghecyrillic",
category="lu",
contextname="cyrillicENGHE",
description="CYRILLIC CAPITAL LIGATURE EN GHE",
@@ -11579,6 +12062,7 @@ characters.data={
unicodeslot=0x04A4,
},
[0x04A5]={
+ adobename="enghecyrillic",
category="ll",
contextname="cyrillicenghe",
description="CYRILLIC SMALL LIGATURE EN GHE",
@@ -11588,6 +12072,7 @@ characters.data={
unicodeslot=0x04A5,
},
[0x04A6]={
+ adobename="Pemiddlehookcyrillic",
category="lu",
contextname="cyrillicPEmidhook",
description="CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK",
@@ -11598,6 +12083,7 @@ characters.data={
unicodeslot=0x04A6,
},
[0x04A7]={
+ adobename="pemiddlehookcyrillic",
category="ll",
contextname="cyrillicpemidhook",
description="CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK",
@@ -11608,6 +12094,7 @@ characters.data={
unicodeslot=0x04A7,
},
[0x04A8]={
+ adobename="Haabkhasiancyrillic",
category="lu",
contextname="cyrillicHA",
description="CYRILLIC CAPITAL LETTER ABKHASIAN HA",
@@ -11617,6 +12104,7 @@ characters.data={
unicodeslot=0x04A8,
},
[0x04A9]={
+ adobename="haabkhasiancyrillic",
category="ll",
contextname="cyrillicha",
description="CYRILLIC SMALL LETTER ABKHASIAN HA",
@@ -11626,6 +12114,7 @@ characters.data={
unicodeslot=0x04A9,
},
[0x04AA]={
+ adobename="Esdescendercyrillic",
category="lu",
contextname="cyrillicSDSC",
description="CYRILLIC CAPITAL LETTER ES WITH DESCENDER",
@@ -11636,6 +12125,7 @@ characters.data={
unicodeslot=0x04AA,
},
[0x04AB]={
+ adobename="esdescendercyrillic",
category="ll",
contextname="cyrillicsdsc",
description="CYRILLIC SMALL LETTER ES WITH DESCENDER",
@@ -11646,6 +12136,7 @@ characters.data={
unicodeslot=0x04AB,
},
[0x04AC]={
+ adobename="Tedescendercyrillic",
category="lu",
contextname="cyrillicTEDC",
description="CYRILLIC CAPITAL LETTER TE WITH DESCENDER",
@@ -11656,6 +12147,7 @@ characters.data={
unicodeslot=0x04AC,
},
[0x04AD]={
+ adobename="tedescendercyrillic",
category="ll",
contextname="cyrillictedc",
description="CYRILLIC SMALL LETTER TE WITH DESCENDER",
@@ -11666,6 +12158,7 @@ characters.data={
unicodeslot=0x04AD,
},
[0x04AE]={
+ adobename="Ustraightcyrillic",
category="lu",
contextname="cyrillicYstr",
description="CYRILLIC CAPITAL LETTER STRAIGHT U",
@@ -11675,6 +12168,7 @@ characters.data={
unicodeslot=0x04AE,
},
[0x04AF]={
+ adobename="ustraightcyrillic",
category="ll",
contextname="cyrillicystr",
description="CYRILLIC SMALL LETTER STRAIGHT U",
@@ -11684,6 +12178,7 @@ characters.data={
unicodeslot=0x04AF,
},
[0x04B0]={
+ adobename="Ustraightstrokecyrillic",
category="lu",
contextname="cyrillicYstrstroke",
description="CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE",
@@ -11693,6 +12188,7 @@ characters.data={
unicodeslot=0x04B0,
},
[0x04B1]={
+ adobename="ustraightstrokecyrillic",
category="ll",
contextname="cyrillicystrstroke",
description="CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE",
@@ -11702,6 +12198,7 @@ characters.data={
unicodeslot=0x04B1,
},
[0x04B2]={
+ adobename="Hadescendercyrillic",
category="lu",
contextname="cyrillicHADC",
description="CYRILLIC CAPITAL LETTER HA WITH DESCENDER",
@@ -11712,6 +12209,7 @@ characters.data={
unicodeslot=0x04B2,
},
[0x04B3]={
+ adobename="hadescendercyrillic",
category="ll",
contextname="cyrillichadc",
description="CYRILLIC SMALL LETTER HA WITH DESCENDER",
@@ -11722,6 +12220,7 @@ characters.data={
unicodeslot=0x04B3,
},
[0x04B4]={
+ adobename="Tetsecyrillic",
category="lu",
contextname="cyrillicTETSE",
description="CYRILLIC CAPITAL LIGATURE TE TSE",
@@ -11731,6 +12230,7 @@ characters.data={
unicodeslot=0x04B4,
},
[0x04B5]={
+ adobename="tetsecyrillic",
category="ll",
contextname="cyrillictetse",
description="CYRILLIC SMALL LIGATURE TE TSE",
@@ -11740,6 +12240,7 @@ characters.data={
unicodeslot=0x04B5,
},
[0x04B6]={
+ adobename="Chedescendercyrillic",
category="lu",
contextname="cyrillicCHEDC",
description="CYRILLIC CAPITAL LETTER CHE WITH DESCENDER",
@@ -11750,6 +12251,7 @@ characters.data={
unicodeslot=0x04B6,
},
[0x04B7]={
+ adobename="chedescendercyrillic",
category="ll",
contextname="cyrillicchedc",
description="CYRILLIC SMALL LETTER CHE WITH DESCENDER",
@@ -11760,6 +12262,7 @@ characters.data={
unicodeslot=0x04B7,
},
[0x04B8]={
+ adobename="Cheverticalstrokecyrillic",
category="lu",
contextname="cyrillicCHEvertstroke",
description="CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE",
@@ -11770,6 +12273,7 @@ characters.data={
unicodeslot=0x04B8,
},
[0x04B9]={
+ adobename="cheverticalstrokecyrillic",
category="ll",
contextname="cyrillicchevertstroke",
description="CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE",
@@ -11780,6 +12284,7 @@ characters.data={
unicodeslot=0x04B9,
},
[0x04BA]={
+ adobename="Shhacyrillic",
category="lu",
contextname="cyrillicSHHA",
description="CYRILLIC CAPITAL LETTER SHHA",
@@ -11789,6 +12294,7 @@ characters.data={
unicodeslot=0x04BA,
},
[0x04BB]={
+ adobename="shhacyrillic",
category="ll",
contextname="cyrillicshha",
description="CYRILLIC SMALL LETTER SHHA",
@@ -11798,6 +12304,7 @@ characters.data={
unicodeslot=0x04BB,
},
[0x04BC]={
+ adobename="Cheabkhasiancyrillic",
category="lu",
contextname="cyrillicCHEabkhasian",
description="CYRILLIC CAPITAL LETTER ABKHASIAN CHE",
@@ -11807,6 +12314,7 @@ characters.data={
unicodeslot=0x04BC,
},
[0x04BD]={
+ adobename="cheabkhasiancyrillic",
category="ll",
contextname="cyrilliccheabkhasian",
description="CYRILLIC SMALL LETTER ABKHASIAN CHE",
@@ -11816,6 +12324,7 @@ characters.data={
unicodeslot=0x04BD,
},
[0x04BE]={
+ adobename="Chedescenderabkhasiancyrillic",
category="lu",
contextname="cyrillicCHEDCabkhasian",
description="CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER",
@@ -11825,6 +12334,7 @@ characters.data={
unicodeslot=0x04BE,
},
[0x04BF]={
+ adobename="chedescenderabkhasiancyrillic",
category="ll",
contextname="cyrillicchedcabkhasian",
description="CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER",
@@ -11834,6 +12344,7 @@ characters.data={
unicodeslot=0x04BF,
},
[0x04C0]={
+ adobename="palochkacyrillic",
category="lu",
contextname="cyrillicPALOCHKA",
description="CYRILLIC LETTER PALOCHKA",
@@ -11843,6 +12354,7 @@ characters.data={
unicodeslot=0x04C0,
},
[0x04C1]={
+ adobename="Zhebrevecyrillic",
category="lu",
contextname="cyrillicZHEbreve",
description="CYRILLIC CAPITAL LETTER ZHE WITH BREVE",
@@ -11854,6 +12366,7 @@ characters.data={
unicodeslot=0x04C1,
},
[0x04C2]={
+ adobename="zhebrevecyrillic",
category="ll",
contextname="cyrilliczhebreve",
description="CYRILLIC SMALL LETTER ZHE WITH BREVE",
@@ -11865,6 +12378,7 @@ characters.data={
unicodeslot=0x04C2,
},
[0x04C3]={
+ adobename="Kahookcyrillic",
category="lu",
contextname="cyrillicKAhook",
description="CYRILLIC CAPITAL LETTER KA WITH HOOK",
@@ -11875,6 +12389,7 @@ characters.data={
unicodeslot=0x04C3,
},
[0x04C4]={
+ adobename="kahookcyrillic",
category="ll",
contextname="cyrillickahook",
description="CYRILLIC SMALL LETTER KA WITH HOOK",
@@ -11905,6 +12420,7 @@ characters.data={
unicodeslot=0x04C6,
},
[0x04C7]={
+ adobename="Enhookcyrillic",
category="lu",
contextname="cyrillicENhook",
description="CYRILLIC CAPITAL LETTER EN WITH HOOK",
@@ -11915,6 +12431,7 @@ characters.data={
unicodeslot=0x04C7,
},
[0x04C8]={
+ adobename="enhookcyrillic",
category="ll",
contextname="cyrillicenhook",
description="CYRILLIC SMALL LETTER EN WITH HOOK",
@@ -11945,6 +12462,7 @@ characters.data={
unicodeslot=0x04CA,
},
[0x04CB]={
+ adobename="Chekhakassiancyrillic",
category="lu",
contextname="cyrillicCHEkhakassian",
description="CYRILLIC CAPITAL LETTER KHAKASSIAN CHE",
@@ -11954,6 +12472,7 @@ characters.data={
unicodeslot=0x04CB,
},
[0x04CC]={
+ adobename="chekhakassiancyrillic",
category="ll",
contextname="cyrillicchekhakassian",
description="CYRILLIC SMALL LETTER KHAKASSIAN CHE",
@@ -11991,6 +12510,7 @@ characters.data={
unicodeslot=0x04CF,
},
[0x04D0]={
+ adobename="Abrevecyrillic",
category="lu",
contextname="cyrillicAbreve",
description="CYRILLIC CAPITAL LETTER A WITH BREVE",
@@ -12002,6 +12522,7 @@ characters.data={
unicodeslot=0x04D0,
},
[0x04D1]={
+ adobename="abrevecyrillic",
category="ll",
contextname="cyrillicabreve",
description="CYRILLIC SMALL LETTER A WITH BREVE",
@@ -12013,6 +12534,7 @@ characters.data={
unicodeslot=0x04D1,
},
[0x04D2]={
+ adobename="Adieresiscyrillic",
category="lu",
contextname="cyrillicAdiaeresis",
description="CYRILLIC CAPITAL LETTER A WITH DIAERESIS",
@@ -12024,6 +12546,7 @@ characters.data={
unicodeslot=0x04D2,
},
[0x04D3]={
+ adobename="adieresiscyrillic",
category="ll",
contextname="cyrillicadiaeresis",
description="CYRILLIC SMALL LETTER A WITH DIAERESIS",
@@ -12035,6 +12558,7 @@ characters.data={
unicodeslot=0x04D3,
},
[0x04D4]={
+ adobename="Aiecyrillic",
category="lu",
contextname="cyrillicAE",
description="CYRILLIC CAPITAL LIGATURE A IE",
@@ -12044,6 +12568,7 @@ characters.data={
unicodeslot=0x04D4,
},
[0x04D5]={
+ adobename="aiecyrillic",
category="ll",
contextname="cyrillicae",
description="CYRILLIC SMALL LIGATURE A IE",
@@ -12053,6 +12578,7 @@ characters.data={
unicodeslot=0x04D5,
},
[0x04D6]={
+ adobename="Iebrevecyrillic",
category="lu",
contextname="cyrillicEbreve",
description="CYRILLIC CAPITAL LETTER IE WITH BREVE",
@@ -12064,6 +12590,7 @@ characters.data={
unicodeslot=0x04D6,
},
[0x04D7]={
+ adobename="iebrevecyrillic",
category="ll",
contextname="cyrillicebreve",
description="CYRILLIC SMALL LETTER IE WITH BREVE",
@@ -12075,6 +12602,7 @@ characters.data={
unicodeslot=0x04D7,
},
[0x04D8]={
+ adobename="Schwacyrillic",
category="lu",
contextname="cyrillicSCHWA",
description="CYRILLIC CAPITAL LETTER SCHWA",
@@ -12084,7 +12612,7 @@ characters.data={
unicodeslot=0x04D8,
},
[0x04D9]={
- adobename="afii10846",
+ adobename="schwacyrillic",
category="ll",
contextname="cyrillicschwa",
description="CYRILLIC SMALL LETTER SCHWA",
@@ -12094,6 +12622,7 @@ characters.data={
unicodeslot=0x04D9,
},
[0x04DA]={
+ adobename="Schwadieresiscyrillic",
category="lu",
contextname="cyrillicSCHWAdiaeresis",
description="CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS",
@@ -12105,6 +12634,7 @@ characters.data={
unicodeslot=0x04DA,
},
[0x04DB]={
+ adobename="schwadieresiscyrillic",
category="ll",
contextname="cyrillicschwadiaeresis",
description="CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS",
@@ -12116,6 +12646,7 @@ characters.data={
unicodeslot=0x04DB,
},
[0x04DC]={
+ adobename="Zhedieresiscyrillic",
category="lu",
contextname="cyrillicZHEdiaeresis",
description="CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS",
@@ -12127,6 +12658,7 @@ characters.data={
unicodeslot=0x04DC,
},
[0x04DD]={
+ adobename="zhedieresiscyrillic",
category="ll",
contextname="cyrilliczhediaeresis",
description="CYRILLIC SMALL LETTER ZHE WITH DIAERESIS",
@@ -12138,6 +12670,7 @@ characters.data={
unicodeslot=0x04DD,
},
[0x04DE]={
+ adobename="Zedieresiscyrillic",
category="lu",
contextname="cyrillicZEdiaeresis",
description="CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS",
@@ -12149,6 +12682,7 @@ characters.data={
unicodeslot=0x04DE,
},
[0x04DF]={
+ adobename="zedieresiscyrillic",
category="ll",
contextname="cyrilliczediaeresis",
description="CYRILLIC SMALL LETTER ZE WITH DIAERESIS",
@@ -12160,6 +12694,7 @@ characters.data={
unicodeslot=0x04DF,
},
[0x04E0]={
+ adobename="Dzeabkhasiancyrillic",
category="lu",
contextname="cyrillicDZEabkhasian",
description="CYRILLIC CAPITAL LETTER ABKHASIAN DZE",
@@ -12169,6 +12704,7 @@ characters.data={
unicodeslot=0x04E0,
},
[0x04E1]={
+ adobename="dzeabkhasiancyrillic",
category="ll",
contextname="cyrillicdzeabkhasian",
description="CYRILLIC SMALL LETTER ABKHASIAN DZE",
@@ -12178,6 +12714,7 @@ characters.data={
unicodeslot=0x04E1,
},
[0x04E2]={
+ adobename="Imacroncyrillic",
category="lu",
contextname="cyrillicImacron",
description="CYRILLIC CAPITAL LETTER I WITH MACRON",
@@ -12189,6 +12726,7 @@ characters.data={
unicodeslot=0x04E2,
},
[0x04E3]={
+ adobename="imacroncyrillic",
category="ll",
contextname="cyrillicimacron",
description="CYRILLIC SMALL LETTER I WITH MACRON",
@@ -12200,6 +12738,7 @@ characters.data={
unicodeslot=0x04E3,
},
[0x04E4]={
+ adobename="Idieresiscyrillic",
category="lu",
contextname="cyrillicIdiaeresis",
description="CYRILLIC CAPITAL LETTER I WITH DIAERESIS",
@@ -12211,6 +12750,7 @@ characters.data={
unicodeslot=0x04E4,
},
[0x04E5]={
+ adobename="idieresiscyrillic",
category="ll",
contextname="cyrillicidiaeresis",
description="CYRILLIC SMALL LETTER I WITH DIAERESIS",
@@ -12222,6 +12762,7 @@ characters.data={
unicodeslot=0x04E5,
},
[0x04E6]={
+ adobename="Odieresiscyrillic",
category="lu",
contextname="cyrillicOdiaeresis",
description="CYRILLIC CAPITAL LETTER O WITH DIAERESIS",
@@ -12233,6 +12774,7 @@ characters.data={
unicodeslot=0x04E6,
},
[0x04E7]={
+ adobename="odieresiscyrillic",
category="ll",
contextname="cyrillicodiaeresis",
description="CYRILLIC SMALL LETTER O WITH DIAERESIS",
@@ -12244,6 +12786,7 @@ characters.data={
unicodeslot=0x04E7,
},
[0x04E8]={
+ adobename="Obarredcyrillic",
category="lu",
contextname="cyrillicObarred",
description="CYRILLIC CAPITAL LETTER BARRED O",
@@ -12253,6 +12796,7 @@ characters.data={
unicodeslot=0x04E8,
},
[0x04E9]={
+ adobename="obarredcyrillic",
category="ll",
contextname="cyrillicobarred",
description="CYRILLIC SMALL LETTER BARRED O",
@@ -12262,6 +12806,7 @@ characters.data={
unicodeslot=0x04E9,
},
[0x04EA]={
+ adobename="Obarreddieresiscyrillic",
category="lu",
contextname="cyrillicObarreddiaeresis",
description="CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS",
@@ -12272,6 +12817,7 @@ characters.data={
unicodeslot=0x04EA,
},
[0x04EB]={
+ adobename="obarreddieresiscyrillic",
category="ll",
contextname="cyrillicobarreddiaeresis",
description="CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS",
@@ -12304,6 +12850,7 @@ characters.data={
unicodeslot=0x04ED,
},
[0x04EE]={
+ adobename="Umacroncyrillic",
category="lu",
contextname="cyrillicUmacron",
description="CYRILLIC CAPITAL LETTER U WITH MACRON",
@@ -12315,6 +12862,7 @@ characters.data={
unicodeslot=0x04EE,
},
[0x04EF]={
+ adobename="umacroncyrillic",
category="ll",
contextname="cyrillicumacron",
description="CYRILLIC SMALL LETTER U WITH MACRON",
@@ -12326,6 +12874,7 @@ characters.data={
unicodeslot=0x04EF,
},
[0x04F0]={
+ adobename="Udieresiscyrillic",
category="lu",
contextname="cyrillicUdiaeresis",
description="CYRILLIC CAPITAL LETTER U WITH DIAERESIS",
@@ -12337,6 +12886,7 @@ characters.data={
unicodeslot=0x04F0,
},
[0x04F1]={
+ adobename="udieresiscyrillic",
category="ll",
contextname="cyrillicudiaeresis",
description="CYRILLIC SMALL LETTER U WITH DIAERESIS",
@@ -12348,6 +12898,7 @@ characters.data={
unicodeslot=0x04F1,
},
[0x04F2]={
+ adobename="Uhungarumlautcyrillic",
category="lu",
contextname="cyrillicUdoubleacute",
description="CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE",
@@ -12359,6 +12910,7 @@ characters.data={
unicodeslot=0x04F2,
},
[0x04F3]={
+ adobename="uhungarumlautcyrillic",
category="ll",
contextname="cyrillicudoubleacute",
description="CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE",
@@ -12370,6 +12922,7 @@ characters.data={
unicodeslot=0x04F3,
},
[0x04F4]={
+ adobename="Chedieresiscyrillic",
category="lu",
contextname="cyrillicCHEdiaeresis",
description="CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS",
@@ -12381,6 +12934,7 @@ characters.data={
unicodeslot=0x04F4,
},
[0x04F5]={
+ adobename="chedieresiscyrillic",
category="ll",
contextname="cyrillicchediaeresis",
description="CYRILLIC SMALL LETTER CHE WITH DIAERESIS",
@@ -12410,6 +12964,7 @@ characters.data={
unicodeslot=0x04F7,
},
[0x04F8]={
+ adobename="Yerudieresiscyrillic",
category="lu",
contextname="cyrillicYERUdiaeresis",
description="CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS",
@@ -12421,6 +12976,7 @@ characters.data={
unicodeslot=0x04F8,
},
[0x04F9]={
+ adobename="yerudieresiscyrillic",
category="ll",
contextname="cyrillicyerudiaeresis",
description="CYRILLIC SMALL LETTER YERU WITH DIAERESIS",
@@ -12648,6 +13204,7 @@ characters.data={
unicodeslot=0x0513,
},
[0x0531]={
+ adobename="Aybarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER AYB",
direction="l",
@@ -12656,6 +13213,7 @@ characters.data={
unicodeslot=0x0531,
},
[0x0532]={
+ adobename="Benarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER BEN",
direction="l",
@@ -12664,6 +13222,7 @@ characters.data={
unicodeslot=0x0532,
},
[0x0533]={
+ adobename="Gimarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER GIM",
direction="l",
@@ -12672,6 +13231,7 @@ characters.data={
unicodeslot=0x0533,
},
[0x0534]={
+ adobename="Daarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER DA",
direction="l",
@@ -12680,6 +13240,7 @@ characters.data={
unicodeslot=0x0534,
},
[0x0535]={
+ adobename="Echarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER ECH",
direction="l",
@@ -12688,6 +13249,7 @@ characters.data={
unicodeslot=0x0535,
},
[0x0536]={
+ adobename="Zaarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER ZA",
direction="l",
@@ -12696,6 +13258,7 @@ characters.data={
unicodeslot=0x0536,
},
[0x0537]={
+ adobename="Eharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER EH",
direction="l",
@@ -12704,6 +13267,7 @@ characters.data={
unicodeslot=0x0537,
},
[0x0538]={
+ adobename="Etarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER ET",
direction="l",
@@ -12712,6 +13276,7 @@ characters.data={
unicodeslot=0x0538,
},
[0x0539]={
+ adobename="Toarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER TO",
direction="l",
@@ -12720,6 +13285,7 @@ characters.data={
unicodeslot=0x0539,
},
[0x053A]={
+ adobename="Zhearmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER ZHE",
direction="l",
@@ -12728,6 +13294,7 @@ characters.data={
unicodeslot=0x053A,
},
[0x053B]={
+ adobename="Iniarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER INI",
direction="l",
@@ -12736,6 +13303,7 @@ characters.data={
unicodeslot=0x053B,
},
[0x053C]={
+ adobename="Liwnarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER LIWN",
direction="l",
@@ -12744,6 +13312,7 @@ characters.data={
unicodeslot=0x053C,
},
[0x053D]={
+ adobename="Xeharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER XEH",
direction="l",
@@ -12752,6 +13321,7 @@ characters.data={
unicodeslot=0x053D,
},
[0x053E]={
+ adobename="Caarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER CA",
direction="l",
@@ -12760,6 +13330,7 @@ characters.data={
unicodeslot=0x053E,
},
[0x053F]={
+ adobename="Kenarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER KEN",
direction="l",
@@ -12768,6 +13339,7 @@ characters.data={
unicodeslot=0x053F,
},
[0x0540]={
+ adobename="Hoarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER HO",
direction="l",
@@ -12776,6 +13348,7 @@ characters.data={
unicodeslot=0x0540,
},
[0x0541]={
+ adobename="Jaarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER JA",
direction="l",
@@ -12784,6 +13357,7 @@ characters.data={
unicodeslot=0x0541,
},
[0x0542]={
+ adobename="Ghadarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER GHAD",
direction="l",
@@ -12792,6 +13366,7 @@ characters.data={
unicodeslot=0x0542,
},
[0x0543]={
+ adobename="Cheharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER CHEH",
direction="l",
@@ -12800,6 +13375,7 @@ characters.data={
unicodeslot=0x0543,
},
[0x0544]={
+ adobename="Menarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER MEN",
direction="l",
@@ -12808,6 +13384,7 @@ characters.data={
unicodeslot=0x0544,
},
[0x0545]={
+ adobename="Yiarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER YI",
direction="l",
@@ -12816,6 +13393,7 @@ characters.data={
unicodeslot=0x0545,
},
[0x0546]={
+ adobename="Nowarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER NOW",
direction="l",
@@ -12824,6 +13402,7 @@ characters.data={
unicodeslot=0x0546,
},
[0x0547]={
+ adobename="Shaarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER SHA",
direction="l",
@@ -12832,6 +13411,7 @@ characters.data={
unicodeslot=0x0547,
},
[0x0548]={
+ adobename="Voarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER VO",
direction="l",
@@ -12840,6 +13420,7 @@ characters.data={
unicodeslot=0x0548,
},
[0x0549]={
+ adobename="Chaarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER CHA",
direction="l",
@@ -12848,6 +13429,7 @@ characters.data={
unicodeslot=0x0549,
},
[0x054A]={
+ adobename="Peharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER PEH",
direction="l",
@@ -12856,6 +13438,7 @@ characters.data={
unicodeslot=0x054A,
},
[0x054B]={
+ adobename="Jheharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER JHEH",
direction="l",
@@ -12864,6 +13447,7 @@ characters.data={
unicodeslot=0x054B,
},
[0x054C]={
+ adobename="Raarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER RA",
direction="l",
@@ -12872,6 +13456,7 @@ characters.data={
unicodeslot=0x054C,
},
[0x054D]={
+ adobename="Seharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER SEH",
direction="l",
@@ -12880,6 +13465,7 @@ characters.data={
unicodeslot=0x054D,
},
[0x054E]={
+ adobename="Vewarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER VEW",
direction="l",
@@ -12888,6 +13474,7 @@ characters.data={
unicodeslot=0x054E,
},
[0x054F]={
+ adobename="Tiwnarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER TIWN",
direction="l",
@@ -12896,6 +13483,7 @@ characters.data={
unicodeslot=0x054F,
},
[0x0550]={
+ adobename="Reharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER REH",
direction="l",
@@ -12904,6 +13492,7 @@ characters.data={
unicodeslot=0x0550,
},
[0x0551]={
+ adobename="Coarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER CO",
direction="l",
@@ -12912,6 +13501,7 @@ characters.data={
unicodeslot=0x0551,
},
[0x0552]={
+ adobename="Yiwnarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER YIWN",
direction="l",
@@ -12920,6 +13510,7 @@ characters.data={
unicodeslot=0x0552,
},
[0x0553]={
+ adobename="Piwrarmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER PIWR",
direction="l",
@@ -12928,6 +13519,7 @@ characters.data={
unicodeslot=0x0553,
},
[0x0554]={
+ adobename="Keharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER KEH",
direction="l",
@@ -12936,6 +13528,7 @@ characters.data={
unicodeslot=0x0554,
},
[0x0555]={
+ adobename="Oharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER OH",
direction="l",
@@ -12944,6 +13537,7 @@ characters.data={
unicodeslot=0x0555,
},
[0x0556]={
+ adobename="Feharmenian",
category="lu",
description="ARMENIAN CAPITAL LETTER FEH",
direction="l",
@@ -12952,6 +13546,7 @@ characters.data={
unicodeslot=0x0556,
},
[0x0559]={
+ adobename="ringhalfleftarmenian",
category="lm",
description="ARMENIAN MODIFIER LETTER LEFT HALF RING",
direction="l",
@@ -12959,6 +13554,7 @@ characters.data={
unicodeslot=0x0559,
},
[0x055A]={
+ adobename="apostrophearmenian",
category="po",
description="ARMENIAN APOSTROPHE",
direction="l",
@@ -12966,6 +13562,7 @@ characters.data={
unicodeslot=0x055A,
},
[0x055B]={
+ adobename="emphasismarkarmenian",
category="po",
description="ARMENIAN EMPHASIS MARK",
direction="l",
@@ -12973,6 +13570,7 @@ characters.data={
unicodeslot=0x055B,
},
[0x055C]={
+ adobename="exclamarmenian",
category="po",
description="ARMENIAN EXCLAMATION MARK",
direction="l",
@@ -12980,6 +13578,7 @@ characters.data={
unicodeslot=0x055C,
},
[0x055D]={
+ adobename="commaarmenian",
category="po",
description="ARMENIAN COMMA",
direction="l",
@@ -12987,6 +13586,7 @@ characters.data={
unicodeslot=0x055D,
},
[0x055E]={
+ adobename="questionarmenian",
category="po",
description="ARMENIAN QUESTION MARK",
direction="l",
@@ -12994,6 +13594,7 @@ characters.data={
unicodeslot=0x055E,
},
[0x055F]={
+ adobename="abbreviationmarkarmenian",
category="po",
description="ARMENIAN ABBREVIATION MARK",
direction="l",
@@ -13001,6 +13602,7 @@ characters.data={
unicodeslot=0x055F,
},
[0x0561]={
+ adobename="aybarmenian",
category="ll",
description="ARMENIAN SMALL LETTER AYB",
direction="l",
@@ -13009,6 +13611,7 @@ characters.data={
unicodeslot=0x0561,
},
[0x0562]={
+ adobename="benarmenian",
category="ll",
description="ARMENIAN SMALL LETTER BEN",
direction="l",
@@ -13017,6 +13620,7 @@ characters.data={
unicodeslot=0x0562,
},
[0x0563]={
+ adobename="gimarmenian",
category="ll",
description="ARMENIAN SMALL LETTER GIM",
direction="l",
@@ -13025,6 +13629,7 @@ characters.data={
unicodeslot=0x0563,
},
[0x0564]={
+ adobename="daarmenian",
category="ll",
description="ARMENIAN SMALL LETTER DA",
direction="l",
@@ -13033,6 +13638,7 @@ characters.data={
unicodeslot=0x0564,
},
[0x0565]={
+ adobename="echarmenian",
category="ll",
description="ARMENIAN SMALL LETTER ECH",
direction="l",
@@ -13041,6 +13647,7 @@ characters.data={
unicodeslot=0x0565,
},
[0x0566]={
+ adobename="zaarmenian",
category="ll",
description="ARMENIAN SMALL LETTER ZA",
direction="l",
@@ -13049,6 +13656,7 @@ characters.data={
unicodeslot=0x0566,
},
[0x0567]={
+ adobename="eharmenian",
category="ll",
description="ARMENIAN SMALL LETTER EH",
direction="l",
@@ -13057,6 +13665,7 @@ characters.data={
unicodeslot=0x0567,
},
[0x0568]={
+ adobename="etarmenian",
category="ll",
description="ARMENIAN SMALL LETTER ET",
direction="l",
@@ -13065,6 +13674,7 @@ characters.data={
unicodeslot=0x0568,
},
[0x0569]={
+ adobename="toarmenian",
category="ll",
description="ARMENIAN SMALL LETTER TO",
direction="l",
@@ -13073,6 +13683,7 @@ characters.data={
unicodeslot=0x0569,
},
[0x056A]={
+ adobename="zhearmenian",
category="ll",
description="ARMENIAN SMALL LETTER ZHE",
direction="l",
@@ -13081,6 +13692,7 @@ characters.data={
unicodeslot=0x056A,
},
[0x056B]={
+ adobename="iniarmenian",
category="ll",
description="ARMENIAN SMALL LETTER INI",
direction="l",
@@ -13089,6 +13701,7 @@ characters.data={
unicodeslot=0x056B,
},
[0x056C]={
+ adobename="liwnarmenian",
category="ll",
description="ARMENIAN SMALL LETTER LIWN",
direction="l",
@@ -13097,6 +13710,7 @@ characters.data={
unicodeslot=0x056C,
},
[0x056D]={
+ adobename="xeharmenian",
category="ll",
description="ARMENIAN SMALL LETTER XEH",
direction="l",
@@ -13105,6 +13719,7 @@ characters.data={
unicodeslot=0x056D,
},
[0x056E]={
+ adobename="caarmenian",
category="ll",
description="ARMENIAN SMALL LETTER CA",
direction="l",
@@ -13113,6 +13728,7 @@ characters.data={
unicodeslot=0x056E,
},
[0x056F]={
+ adobename="kenarmenian",
category="ll",
description="ARMENIAN SMALL LETTER KEN",
direction="l",
@@ -13121,6 +13737,7 @@ characters.data={
unicodeslot=0x056F,
},
[0x0570]={
+ adobename="hoarmenian",
category="ll",
description="ARMENIAN SMALL LETTER HO",
direction="l",
@@ -13129,6 +13746,7 @@ characters.data={
unicodeslot=0x0570,
},
[0x0571]={
+ adobename="jaarmenian",
category="ll",
description="ARMENIAN SMALL LETTER JA",
direction="l",
@@ -13137,6 +13755,7 @@ characters.data={
unicodeslot=0x0571,
},
[0x0572]={
+ adobename="ghadarmenian",
category="ll",
description="ARMENIAN SMALL LETTER GHAD",
direction="l",
@@ -13145,6 +13764,7 @@ characters.data={
unicodeslot=0x0572,
},
[0x0573]={
+ adobename="cheharmenian",
category="ll",
description="ARMENIAN SMALL LETTER CHEH",
direction="l",
@@ -13153,6 +13773,7 @@ characters.data={
unicodeslot=0x0573,
},
[0x0574]={
+ adobename="menarmenian",
category="ll",
description="ARMENIAN SMALL LETTER MEN",
direction="l",
@@ -13161,6 +13782,7 @@ characters.data={
unicodeslot=0x0574,
},
[0x0575]={
+ adobename="yiarmenian",
category="ll",
description="ARMENIAN SMALL LETTER YI",
direction="l",
@@ -13169,6 +13791,7 @@ characters.data={
unicodeslot=0x0575,
},
[0x0576]={
+ adobename="nowarmenian",
category="ll",
description="ARMENIAN SMALL LETTER NOW",
direction="l",
@@ -13177,6 +13800,7 @@ characters.data={
unicodeslot=0x0576,
},
[0x0577]={
+ adobename="shaarmenian",
category="ll",
description="ARMENIAN SMALL LETTER SHA",
direction="l",
@@ -13185,6 +13809,7 @@ characters.data={
unicodeslot=0x0577,
},
[0x0578]={
+ adobename="voarmenian",
category="ll",
description="ARMENIAN SMALL LETTER VO",
direction="l",
@@ -13193,6 +13818,7 @@ characters.data={
unicodeslot=0x0578,
},
[0x0579]={
+ adobename="chaarmenian",
category="ll",
description="ARMENIAN SMALL LETTER CHA",
direction="l",
@@ -13201,6 +13827,7 @@ characters.data={
unicodeslot=0x0579,
},
[0x057A]={
+ adobename="peharmenian",
category="ll",
description="ARMENIAN SMALL LETTER PEH",
direction="l",
@@ -13209,6 +13836,7 @@ characters.data={
unicodeslot=0x057A,
},
[0x057B]={
+ adobename="jheharmenian",
category="ll",
description="ARMENIAN SMALL LETTER JHEH",
direction="l",
@@ -13217,6 +13845,7 @@ characters.data={
unicodeslot=0x057B,
},
[0x057C]={
+ adobename="raarmenian",
category="ll",
description="ARMENIAN SMALL LETTER RA",
direction="l",
@@ -13225,6 +13854,7 @@ characters.data={
unicodeslot=0x057C,
},
[0x057D]={
+ adobename="seharmenian",
category="ll",
description="ARMENIAN SMALL LETTER SEH",
direction="l",
@@ -13233,6 +13863,7 @@ characters.data={
unicodeslot=0x057D,
},
[0x057E]={
+ adobename="vewarmenian",
category="ll",
description="ARMENIAN SMALL LETTER VEW",
direction="l",
@@ -13241,6 +13872,7 @@ characters.data={
unicodeslot=0x057E,
},
[0x057F]={
+ adobename="tiwnarmenian",
category="ll",
description="ARMENIAN SMALL LETTER TIWN",
direction="l",
@@ -13249,6 +13881,7 @@ characters.data={
unicodeslot=0x057F,
},
[0x0580]={
+ adobename="reharmenian",
category="ll",
description="ARMENIAN SMALL LETTER REH",
direction="l",
@@ -13257,6 +13890,7 @@ characters.data={
unicodeslot=0x0580,
},
[0x0581]={
+ adobename="coarmenian",
category="ll",
description="ARMENIAN SMALL LETTER CO",
direction="l",
@@ -13265,6 +13899,7 @@ characters.data={
unicodeslot=0x0581,
},
[0x0582]={
+ adobename="yiwnarmenian",
category="ll",
description="ARMENIAN SMALL LETTER YIWN",
direction="l",
@@ -13273,6 +13908,7 @@ characters.data={
unicodeslot=0x0582,
},
[0x0583]={
+ adobename="piwrarmenian",
category="ll",
description="ARMENIAN SMALL LETTER PIWR",
direction="l",
@@ -13281,6 +13917,7 @@ characters.data={
unicodeslot=0x0583,
},
[0x0584]={
+ adobename="keharmenian",
category="ll",
description="ARMENIAN SMALL LETTER KEH",
direction="l",
@@ -13289,6 +13926,7 @@ characters.data={
unicodeslot=0x0584,
},
[0x0585]={
+ adobename="oharmenian",
category="ll",
description="ARMENIAN SMALL LETTER OH",
direction="l",
@@ -13297,6 +13935,7 @@ characters.data={
unicodeslot=0x0585,
},
[0x0586]={
+ adobename="feharmenian",
category="ll",
description="ARMENIAN SMALL LETTER FEH",
direction="l",
@@ -13305,6 +13944,7 @@ characters.data={
unicodeslot=0x0586,
},
[0x0587]={
+ adobename="echyiwnarmenian",
category="ll",
description="ARMENIAN SMALL LIGATURE ECH YIWN",
direction="l",
@@ -13313,6 +13953,7 @@ characters.data={
unicodeslot=0x0587,
},
[0x0589]={
+ adobename="periodarmenian",
category="po",
description="ARMENIAN FULL STOP",
direction="l",
@@ -13327,6 +13968,7 @@ characters.data={
unicodeslot=0x058A,
},
[0x0591]={
+ adobename="etnahtalefthebrew",
category="mn",
description="HEBREW ACCENT ETNAHTA",
direction="nsm",
@@ -13334,6 +13976,7 @@ characters.data={
unicodeslot=0x0591,
},
[0x0592]={
+ adobename="segoltahebrew",
category="mn",
description="HEBREW ACCENT SEGOL",
direction="nsm",
@@ -13341,6 +13984,7 @@ characters.data={
unicodeslot=0x0592,
},
[0x0593]={
+ adobename="shalshelethebrew",
category="mn",
description="HEBREW ACCENT SHALSHELET",
direction="nsm",
@@ -13348,6 +13992,7 @@ characters.data={
unicodeslot=0x0593,
},
[0x0594]={
+ adobename="zaqefqatanhebrew",
category="mn",
description="HEBREW ACCENT ZAQEF QATAN",
direction="nsm",
@@ -13355,6 +14000,7 @@ characters.data={
unicodeslot=0x0594,
},
[0x0595]={
+ adobename="zaqefgadolhebrew",
category="mn",
description="HEBREW ACCENT ZAQEF GADOL",
direction="nsm",
@@ -13362,6 +14008,7 @@ characters.data={
unicodeslot=0x0595,
},
[0x0596]={
+ adobename="tipehalefthebrew",
category="mn",
description="HEBREW ACCENT TIPEHA",
direction="nsm",
@@ -13369,6 +14016,7 @@ characters.data={
unicodeslot=0x0596,
},
[0x0597]={
+ adobename="reviamugrashhebrew",
category="mn",
description="HEBREW ACCENT REVIA",
direction="nsm",
@@ -13376,6 +14024,7 @@ characters.data={
unicodeslot=0x0597,
},
[0x0598]={
+ adobename="zarqahebrew",
category="mn",
description="HEBREW ACCENT ZARQA",
direction="nsm",
@@ -13383,6 +14032,7 @@ characters.data={
unicodeslot=0x0598,
},
[0x0599]={
+ adobename="pashtahebrew",
category="mn",
description="HEBREW ACCENT PASHTA",
direction="nsm",
@@ -13390,6 +14040,7 @@ characters.data={
unicodeslot=0x0599,
},
[0x059A]={
+ adobename="yetivhebrew",
category="mn",
description="HEBREW ACCENT YETIV",
direction="nsm",
@@ -13397,6 +14048,7 @@ characters.data={
unicodeslot=0x059A,
},
[0x059B]={
+ adobename="tevirlefthebrew",
category="mn",
description="HEBREW ACCENT TEVIR",
direction="nsm",
@@ -13404,6 +14056,7 @@ characters.data={
unicodeslot=0x059B,
},
[0x059C]={
+ adobename="gereshaccenthebrew",
category="mn",
description="HEBREW ACCENT GERESH",
direction="nsm",
@@ -13411,6 +14064,7 @@ characters.data={
unicodeslot=0x059C,
},
[0x059D]={
+ adobename="gereshmuqdamhebrew",
category="mn",
description="HEBREW ACCENT GERESH MUQDAM",
direction="nsm",
@@ -13418,6 +14072,7 @@ characters.data={
unicodeslot=0x059D,
},
[0x059E]={
+ adobename="gershayimaccenthebrew",
category="mn",
description="HEBREW ACCENT GERSHAYIM",
direction="nsm",
@@ -13425,6 +14080,7 @@ characters.data={
unicodeslot=0x059E,
},
[0x059F]={
+ adobename="qarneyparahebrew",
category="mn",
description="HEBREW ACCENT QARNEY PARA",
direction="nsm",
@@ -13432,6 +14088,7 @@ characters.data={
unicodeslot=0x059F,
},
[0x05A0]={
+ adobename="telishagedolahebrew",
category="mn",
description="HEBREW ACCENT TELISHA GEDOLA",
direction="nsm",
@@ -13439,6 +14096,7 @@ characters.data={
unicodeslot=0x05A0,
},
[0x05A1]={
+ adobename="pazerhebrew",
category="mn",
description="HEBREW ACCENT PAZER",
direction="nsm",
@@ -13453,6 +14111,7 @@ characters.data={
unicodeslot=0x05A2,
},
[0x05A3]={
+ adobename="munahlefthebrew",
category="mn",
description="HEBREW ACCENT MUNAH",
direction="nsm",
@@ -13460,6 +14119,7 @@ characters.data={
unicodeslot=0x05A3,
},
[0x05A4]={
+ adobename="mahapakhlefthebrew",
category="mn",
description="HEBREW ACCENT MAHAPAKH",
direction="nsm",
@@ -13467,6 +14127,7 @@ characters.data={
unicodeslot=0x05A4,
},
[0x05A5]={
+ adobename="merkhalefthebrew",
category="mn",
description="HEBREW ACCENT MERKHA",
direction="nsm",
@@ -13474,6 +14135,7 @@ characters.data={
unicodeslot=0x05A5,
},
[0x05A6]={
+ adobename="merkhakefulalefthebrew",
category="mn",
description="HEBREW ACCENT MERKHA KEFULA",
direction="nsm",
@@ -13481,6 +14143,7 @@ characters.data={
unicodeslot=0x05A6,
},
[0x05A7]={
+ adobename="dargalefthebrew",
category="mn",
description="HEBREW ACCENT DARGA",
direction="nsm",
@@ -13488,6 +14151,7 @@ characters.data={
unicodeslot=0x05A7,
},
[0x05A8]={
+ adobename="qadmahebrew",
category="mn",
description="HEBREW ACCENT QADMA",
direction="nsm",
@@ -13495,6 +14159,7 @@ characters.data={
unicodeslot=0x05A8,
},
[0x05A9]={
+ adobename="telishaqetanahebrew",
category="mn",
description="HEBREW ACCENT TELISHA QETANA",
direction="nsm",
@@ -13502,6 +14167,7 @@ characters.data={
unicodeslot=0x05A9,
},
[0x05AA]={
+ adobename="yerahbenyomolefthebrew",
category="mn",
description="HEBREW ACCENT YERAH BEN YOMO",
direction="nsm",
@@ -13509,6 +14175,7 @@ characters.data={
unicodeslot=0x05AA,
},
[0x05AB]={
+ adobename="olehebrew",
category="mn",
description="HEBREW ACCENT OLE",
direction="nsm",
@@ -13516,6 +14183,7 @@ characters.data={
unicodeslot=0x05AB,
},
[0x05AC]={
+ adobename="iluyhebrew",
category="mn",
description="HEBREW ACCENT ILUY",
direction="nsm",
@@ -13523,6 +14191,7 @@ characters.data={
unicodeslot=0x05AC,
},
[0x05AD]={
+ adobename="dehihebrew",
category="mn",
description="HEBREW ACCENT DEHI",
direction="nsm",
@@ -13530,6 +14199,7 @@ characters.data={
unicodeslot=0x05AD,
},
[0x05AE]={
+ adobename="zinorhebrew",
category="mn",
description="HEBREW ACCENT ZINOR",
direction="nsm",
@@ -13537,6 +14207,7 @@ characters.data={
unicodeslot=0x05AE,
},
[0x05AF]={
+ adobename="masoracirclehebrew",
category="mn",
description="HEBREW MARK MASORA CIRCLE",
direction="nsm",
@@ -13544,7 +14215,7 @@ characters.data={
unicodeslot=0x05AF,
},
[0x05B0]={
- adobename="afii57799",
+ adobename="shevawidehebrew",
category="mn",
description="HEBREW POINT SHEVA",
direction="nsm",
@@ -13552,7 +14223,7 @@ characters.data={
unicodeslot=0x05B0,
},
[0x05B1]={
- adobename="afii57801",
+ adobename="hatafsegolwidehebrew",
category="mn",
description="HEBREW POINT HATAF SEGOL",
direction="nsm",
@@ -13560,7 +14231,7 @@ characters.data={
unicodeslot=0x05B1,
},
[0x05B2]={
- adobename="afii57800",
+ adobename="hatafpatahwidehebrew",
category="mn",
description="HEBREW POINT HATAF PATAH",
direction="nsm",
@@ -13568,7 +14239,7 @@ characters.data={
unicodeslot=0x05B2,
},
[0x05B3]={
- adobename="afii57802",
+ adobename="hatafqamatswidehebrew",
category="mn",
description="HEBREW POINT HATAF QAMATS",
direction="nsm",
@@ -13576,7 +14247,7 @@ characters.data={
unicodeslot=0x05B3,
},
[0x05B4]={
- adobename="afii57793",
+ adobename="hiriqwidehebrew",
category="mn",
description="HEBREW POINT HIRIQ",
direction="nsm",
@@ -13584,7 +14255,7 @@ characters.data={
unicodeslot=0x05B4,
},
[0x05B5]={
- adobename="afii57794",
+ adobename="tserewidehebrew",
category="mn",
description="HEBREW POINT TSERE",
direction="nsm",
@@ -13592,7 +14263,7 @@ characters.data={
unicodeslot=0x05B5,
},
[0x05B6]={
- adobename="afii57795",
+ adobename="segolwidehebrew",
category="mn",
description="HEBREW POINT SEGOL",
direction="nsm",
@@ -13600,7 +14271,7 @@ characters.data={
unicodeslot=0x05B6,
},
[0x05B7]={
- adobename="afii57798",
+ adobename="patahwidehebrew",
category="mn",
description="HEBREW POINT PATAH",
direction="nsm",
@@ -13608,7 +14279,7 @@ characters.data={
unicodeslot=0x05B7,
},
[0x05B8]={
- adobename="afii57797",
+ adobename="qamatswidehebrew",
category="mn",
description="HEBREW POINT QAMATS",
direction="nsm",
@@ -13616,7 +14287,7 @@ characters.data={
unicodeslot=0x05B8,
},
[0x05B9]={
- adobename="afii57806",
+ adobename="holamwidehebrew",
category="mn",
description="HEBREW POINT HOLAM",
direction="nsm",
@@ -13631,7 +14302,7 @@ characters.data={
unicodeslot=0x05BA,
},
[0x05BB]={
- adobename="afii57796",
+ adobename="qubutswidehebrew",
category="mn",
description="HEBREW POINT QUBUTS",
direction="nsm",
@@ -13639,7 +14310,7 @@ characters.data={
unicodeslot=0x05BB,
},
[0x05BC]={
- adobename="afii57807",
+ adobename="dageshhebrew",
category="mn",
description="HEBREW POINT DAGESH OR MAPIQ",
direction="nsm",
@@ -13647,7 +14318,7 @@ characters.data={
unicodeslot=0x05BC,
},
[0x05BD]={
- adobename="afii57839",
+ adobename="siluqlefthebrew",
category="mn",
description="HEBREW POINT METEG",
direction="nsm",
@@ -13655,7 +14326,7 @@ characters.data={
unicodeslot=0x05BD,
},
[0x05BE]={
- adobename="afii57645",
+ adobename="maqafhebrew",
category="po",
description="HEBREW PUNCTUATION MAQAF",
direction="r",
@@ -13663,7 +14334,7 @@ characters.data={
unicodeslot=0x05BE,
},
[0x05BF]={
- adobename="afii57841",
+ adobename="rafehebrew",
category="mn",
description="HEBREW POINT RAFE",
direction="nsm",
@@ -13671,7 +14342,7 @@ characters.data={
unicodeslot=0x05BF,
},
[0x05C0]={
- adobename="afii57842",
+ adobename="paseqhebrew",
category="po",
description="HEBREW PUNCTUATION PASEQ",
direction="r",
@@ -13679,7 +14350,7 @@ characters.data={
unicodeslot=0x05C0,
},
[0x05C1]={
- adobename="afii57804",
+ adobename="shindothebrew",
category="mn",
description="HEBREW POINT SHIN DOT",
direction="nsm",
@@ -13687,7 +14358,7 @@ characters.data={
unicodeslot=0x05C1,
},
[0x05C2]={
- adobename="afii57803",
+ adobename="sindothebrew",
category="mn",
description="HEBREW POINT SIN DOT",
direction="nsm",
@@ -13695,7 +14366,7 @@ characters.data={
unicodeslot=0x05C2,
},
[0x05C3]={
- adobename="afii57658",
+ adobename="sofpasuqhebrew",
category="po",
description="HEBREW PUNCTUATION SOF PASUQ",
direction="r",
@@ -13703,6 +14374,7 @@ characters.data={
unicodeslot=0x05C3,
},
[0x05C4]={
+ adobename="upperdothebrew",
category="mn",
description="HEBREW MARK UPPER DOT",
direction="nsm",
@@ -13731,7 +14403,7 @@ characters.data={
unicodeslot=0x05C7,
},
[0x05D0]={
- adobename="afii57664",
+ adobename="alefhebrew",
category="lo",
contextname="hebrewAlef",
description="HEBREW LETTER ALEF",
@@ -13740,7 +14412,7 @@ characters.data={
unicodeslot=0x05D0,
},
[0x05D1]={
- adobename="afii57665",
+ adobename="bethebrew",
category="lo",
contextname="hebrewBet",
description="HEBREW LETTER BET",
@@ -13749,7 +14421,7 @@ characters.data={
unicodeslot=0x05D1,
},
[0x05D2]={
- adobename="afii57666",
+ adobename="gimelhebrew",
category="lo",
contextname="hebrewGimel",
description="HEBREW LETTER GIMEL",
@@ -13758,7 +14430,7 @@ characters.data={
unicodeslot=0x05D2,
},
[0x05D3]={
- adobename="afii57667",
+ adobename="dalettserehebrew",
category="lo",
contextname="hebrewDalet",
description="HEBREW LETTER DALET",
@@ -13767,7 +14439,7 @@ characters.data={
unicodeslot=0x05D3,
},
[0x05D4]={
- adobename="afii57668",
+ adobename="hehebrew",
category="lo",
contextname="hebrewHe",
description="HEBREW LETTER HE",
@@ -13776,7 +14448,7 @@ characters.data={
unicodeslot=0x05D4,
},
[0x05D5]={
- adobename="afii57669",
+ adobename="vavhebrew",
category="lo",
contextname="hebrewVav",
description="HEBREW LETTER VAV",
@@ -13785,7 +14457,7 @@ characters.data={
unicodeslot=0x05D5,
},
[0x05D6]={
- adobename="afii57670",
+ adobename="zayinhebrew",
category="lo",
contextname="hebrewZayin",
description="HEBREW LETTER ZAYIN",
@@ -13794,7 +14466,7 @@ characters.data={
unicodeslot=0x05D6,
},
[0x05D7]={
- adobename="afii57671",
+ adobename="hethebrew",
category="lo",
contextname="hebrewHet",
description="HEBREW LETTER HET",
@@ -13803,7 +14475,7 @@ characters.data={
unicodeslot=0x05D7,
},
[0x05D8]={
- adobename="afii57672",
+ adobename="tethebrew",
category="lo",
contextname="hebrewTet",
description="HEBREW LETTER TET",
@@ -13812,7 +14484,7 @@ characters.data={
unicodeslot=0x05D8,
},
[0x05D9]={
- adobename="afii57673",
+ adobename="yodhebrew",
category="lo",
contextname="hebrewYod",
description="HEBREW LETTER YOD",
@@ -13821,7 +14493,7 @@ characters.data={
unicodeslot=0x05D9,
},
[0x05DA]={
- adobename="afii57674",
+ adobename="finalkafshevahebrew",
category="lo",
contextname="hebrewKaffinal",
description="HEBREW LETTER FINAL KAF",
@@ -13830,7 +14502,7 @@ characters.data={
unicodeslot=0x05DA,
},
[0x05DB]={
- adobename="afii57675",
+ adobename="kafhebrew",
category="lo",
contextname="hebrewKaf",
description="HEBREW LETTER KAF",
@@ -13839,7 +14511,7 @@ characters.data={
unicodeslot=0x05DB,
},
[0x05DC]={
- adobename="afii57676",
+ adobename="lamedholamhebrew",
category="lo",
contextname="hebrewLamed",
description="HEBREW LETTER LAMED",
@@ -13848,7 +14520,7 @@ characters.data={
unicodeslot=0x05DC,
},
[0x05DD]={
- adobename="afii57677",
+ adobename="finalmemhebrew",
category="lo",
contextname="hebrewMemfinal",
description="HEBREW LETTER FINAL MEM",
@@ -13857,7 +14529,7 @@ characters.data={
unicodeslot=0x05DD,
},
[0x05DE]={
- adobename="afii57678",
+ adobename="memhebrew",
category="lo",
contextname="hebrewMem",
description="HEBREW LETTER MEM",
@@ -13866,7 +14538,7 @@ characters.data={
unicodeslot=0x05DE,
},
[0x05DF]={
- adobename="afii57679",
+ adobename="finalnunhebrew",
category="lo",
contextname="hebrewNunfinal",
description="HEBREW LETTER FINAL NUN",
@@ -13875,7 +14547,7 @@ characters.data={
unicodeslot=0x05DF,
},
[0x05E0]={
- adobename="afii57680",
+ adobename="nunhebrew",
category="lo",
contextname="hebrewNun",
description="HEBREW LETTER NUN",
@@ -13884,7 +14556,7 @@ characters.data={
unicodeslot=0x05E0,
},
[0x05E1]={
- adobename="afii57681",
+ adobename="samekhhebrew",
category="lo",
contextname="hebrewSamekh",
description="HEBREW LETTER SAMEKH",
@@ -13893,7 +14565,7 @@ characters.data={
unicodeslot=0x05E1,
},
[0x05E2]={
- adobename="afii57682",
+ adobename="ayinhebrew",
category="lo",
contextname="hebrewAyin",
description="HEBREW LETTER AYIN",
@@ -13902,7 +14574,7 @@ characters.data={
unicodeslot=0x05E2,
},
[0x05E3]={
- adobename="afii57683",
+ adobename="finalpehebrew",
category="lo",
contextname="hebrewPefinal",
description="HEBREW LETTER FINAL PE",
@@ -13911,7 +14583,7 @@ characters.data={
unicodeslot=0x05E3,
},
[0x05E4]={
- adobename="afii57684",
+ adobename="pehebrew",
category="lo",
contextname="hebrewPe",
description="HEBREW LETTER PE",
@@ -13920,7 +14592,7 @@ characters.data={
unicodeslot=0x05E4,
},
[0x05E5]={
- adobename="afii57685",
+ adobename="finaltsadihebrew",
category="lo",
contextname="hebrewTsadifinal",
description="HEBREW LETTER FINAL TSADI",
@@ -13929,7 +14601,7 @@ characters.data={
unicodeslot=0x05E5,
},
[0x05E6]={
- adobename="afii57686",
+ adobename="tsadihebrew",
category="lo",
contextname="hebrewTsadi",
description="HEBREW LETTER TSADI",
@@ -13938,7 +14610,7 @@ characters.data={
unicodeslot=0x05E6,
},
[0x05E7]={
- adobename="afii57687",
+ adobename="qoftserehebrew",
category="lo",
contextname="hebrewQof",
description="HEBREW LETTER QOF",
@@ -13947,7 +14619,7 @@ characters.data={
unicodeslot=0x05E7,
},
[0x05E8]={
- adobename="afii57688",
+ adobename="reshtserehebrew",
category="lo",
contextname="hebrewResh",
description="HEBREW LETTER RESH",
@@ -13956,7 +14628,7 @@ characters.data={
unicodeslot=0x05E8,
},
[0x05E9]={
- adobename="afii57689",
+ adobename="shinhebrew",
category="lo",
contextname="hebrewShin",
description="HEBREW LETTER SHIN",
@@ -13965,7 +14637,7 @@ characters.data={
unicodeslot=0x05E9,
},
[0x05EA]={
- adobename="afii57690",
+ adobename="tavhebrew",
category="lo",
contextname="hebrewTav",
description="HEBREW LETTER TAV",
@@ -13974,7 +14646,7 @@ characters.data={
unicodeslot=0x05EA,
},
[0x05F0]={
- adobename="afii57716",
+ adobename="vavvavhebrew",
category="lo",
description="HEBREW LIGATURE YIDDISH DOUBLE VAV",
direction="r",
@@ -13982,7 +14654,7 @@ characters.data={
unicodeslot=0x05F0,
},
[0x05F1]={
- adobename="afii57717",
+ adobename="vavyodhebrew",
category="lo",
description="HEBREW LIGATURE YIDDISH VAV YOD",
direction="r",
@@ -13990,7 +14662,7 @@ characters.data={
unicodeslot=0x05F1,
},
[0x05F2]={
- adobename="afii57718",
+ adobename="yodyodhebrew",
category="lo",
description="HEBREW LIGATURE YIDDISH DOUBLE YOD",
direction="r",
@@ -13998,6 +14670,7 @@ characters.data={
unicodeslot=0x05F2,
},
[0x05F3]={
+ adobename="gereshhebrew",
category="po",
description="HEBREW PUNCTUATION GERESH",
direction="r",
@@ -14005,6 +14678,7 @@ characters.data={
unicodeslot=0x05F3,
},
[0x05F4]={
+ adobename="gershayimhebrew",
category="po",
description="HEBREW PUNCTUATION GERSHAYIM",
direction="r",
@@ -14015,33 +14689,33 @@ characters.data={
category="cf",
description="ARABIC NUMBER SIGN",
direction="an",
- visible="yes",
linebreak="al",
unicodeslot=0x0600,
+ visible="yes",
},
[0x0601]={
category="cf",
description="ARABIC SIGN SANAH",
direction="an",
- visible="yes",
linebreak="al",
unicodeslot=0x0601,
+ visible="yes",
},
[0x0602]={
category="cf",
description="ARABIC FOOTNOTE MARKER",
direction="an",
- visible="yes",
linebreak="al",
unicodeslot=0x0602,
+ visible="yes",
},
[0x0603]={
category="cf",
description="ARABIC SIGN SAFHA",
direction="an",
- visible="yes",
linebreak="al",
unicodeslot=0x0603,
+ visible="yes",
},
[0x060B]={
category="sc",
@@ -14051,7 +14725,7 @@ characters.data={
unicodeslot=0x060B,
},
[0x060C]={
- adobename="afii57388",
+ adobename="commaarabic",
category="po",
description="ARABIC COMMA",
direction="cs",
@@ -14122,7 +14796,7 @@ characters.data={
unicodeslot=0x0615,
},
[0x061B]={
- adobename="afii57403",
+ adobename="semicolonarabic",
category="po",
description="ARABIC SEMICOLON",
direction="al",
@@ -14137,7 +14811,7 @@ characters.data={
unicodeslot=0x061E,
},
[0x061F]={
- adobename="afii57407",
+ adobename="questionarabic",
category="po",
description="ARABIC QUESTION MARK",
direction="al",
@@ -14145,7 +14819,7 @@ characters.data={
unicodeslot=0x061F,
},
[0x0621]={
- adobename="afii57409",
+ adobename="hamzasukunarabic",
category="lo",
description="ARABIC LETTER HAMZA",
direction="al",
@@ -14153,7 +14827,7 @@ characters.data={
unicodeslot=0x0621,
},
[0x0622]={
- adobename="afii57410",
+ adobename="alefmaddaabovearabic",
category="lo",
description="ARABIC LETTER ALEF WITH MADDA ABOVE",
direction="al",
@@ -14163,7 +14837,7 @@ characters.data={
unicodeslot=0x0622,
},
[0x0623]={
- adobename="afii57411",
+ adobename="alefhamzaabovearabic",
category="lo",
description="ARABIC LETTER ALEF WITH HAMZA ABOVE",
direction="al",
@@ -14173,7 +14847,7 @@ characters.data={
unicodeslot=0x0623,
},
[0x0624]={
- adobename="afii57412",
+ adobename="wawhamzaabovearabic",
category="lo",
description="ARABIC LETTER WAW WITH HAMZA ABOVE",
direction="al",
@@ -14183,7 +14857,7 @@ characters.data={
unicodeslot=0x0624,
},
[0x0625]={
- adobename="afii57413",
+ adobename="alefhamzabelowarabic",
category="lo",
description="ARABIC LETTER ALEF WITH HAMZA BELOW",
direction="al",
@@ -14193,7 +14867,7 @@ characters.data={
unicodeslot=0x0625,
},
[0x0626]={
- adobename="afii57414",
+ adobename="yehhamzaabovearabic",
category="lo",
description="ARABIC LETTER YEH WITH HAMZA ABOVE",
direction="al",
@@ -14203,7 +14877,7 @@ characters.data={
unicodeslot=0x0626,
},
[0x0627]={
- adobename="afii57415",
+ adobename="alefarabic",
category="lo",
description="ARABIC LETTER ALEF",
direction="al",
@@ -14211,7 +14885,7 @@ characters.data={
unicodeslot=0x0627,
},
[0x0628]={
- adobename="afii57416",
+ adobename="beharabic",
category="lo",
description="ARABIC LETTER BEH",
direction="al",
@@ -14219,7 +14893,7 @@ characters.data={
unicodeslot=0x0628,
},
[0x0629]={
- adobename="afii57417",
+ adobename="tehmarbutaarabic",
category="lo",
description="ARABIC LETTER TEH MARBUTA",
direction="al",
@@ -14227,7 +14901,7 @@ characters.data={
unicodeslot=0x0629,
},
[0x062A]={
- adobename="afii57418",
+ adobename="teharabic",
category="lo",
description="ARABIC LETTER TEH",
direction="al",
@@ -14235,7 +14909,7 @@ characters.data={
unicodeslot=0x062A,
},
[0x062B]={
- adobename="afii57419",
+ adobename="theharabic",
category="lo",
description="ARABIC LETTER THEH",
direction="al",
@@ -14243,7 +14917,7 @@ characters.data={
unicodeslot=0x062B,
},
[0x062C]={
- adobename="afii57420",
+ adobename="jeemarabic",
category="lo",
description="ARABIC LETTER JEEM",
direction="al",
@@ -14251,7 +14925,7 @@ characters.data={
unicodeslot=0x062C,
},
[0x062D]={
- adobename="afii57421",
+ adobename="haharabic",
category="lo",
description="ARABIC LETTER HAH",
direction="al",
@@ -14259,7 +14933,7 @@ characters.data={
unicodeslot=0x062D,
},
[0x062E]={
- adobename="afii57422",
+ adobename="khaharabic",
category="lo",
description="ARABIC LETTER KHAH",
direction="al",
@@ -14267,7 +14941,7 @@ characters.data={
unicodeslot=0x062E,
},
[0x062F]={
- adobename="afii57423",
+ adobename="dalarabic",
category="lo",
description="ARABIC LETTER DAL",
direction="al",
@@ -14275,7 +14949,7 @@ characters.data={
unicodeslot=0x062F,
},
[0x0630]={
- adobename="afii57424",
+ adobename="thalarabic",
category="lo",
description="ARABIC LETTER THAL",
direction="al",
@@ -14283,7 +14957,7 @@ characters.data={
unicodeslot=0x0630,
},
[0x0631]={
- adobename="afii57425",
+ adobename="rehyehaleflamarabic",
category="lo",
description="ARABIC LETTER REH",
direction="al",
@@ -14291,7 +14965,7 @@ characters.data={
unicodeslot=0x0631,
},
[0x0632]={
- adobename="afii57426",
+ adobename="zainarabic",
category="lo",
description="ARABIC LETTER ZAIN",
direction="al",
@@ -14299,7 +14973,7 @@ characters.data={
unicodeslot=0x0632,
},
[0x0633]={
- adobename="afii57427",
+ adobename="seenarabic",
category="lo",
description="ARABIC LETTER SEEN",
direction="al",
@@ -14307,7 +14981,7 @@ characters.data={
unicodeslot=0x0633,
},
[0x0634]={
- adobename="afii57428",
+ adobename="sheenarabic",
category="lo",
description="ARABIC LETTER SHEEN",
direction="al",
@@ -14315,7 +14989,7 @@ characters.data={
unicodeslot=0x0634,
},
[0x0635]={
- adobename="afii57429",
+ adobename="sadarabic",
category="lo",
description="ARABIC LETTER SAD",
direction="al",
@@ -14323,7 +14997,7 @@ characters.data={
unicodeslot=0x0635,
},
[0x0636]={
- adobename="afii57430",
+ adobename="dadarabic",
category="lo",
description="ARABIC LETTER DAD",
direction="al",
@@ -14331,7 +15005,7 @@ characters.data={
unicodeslot=0x0636,
},
[0x0637]={
- adobename="afii57431",
+ adobename="taharabic",
category="lo",
description="ARABIC LETTER TAH",
direction="al",
@@ -14339,7 +15013,7 @@ characters.data={
unicodeslot=0x0637,
},
[0x0638]={
- adobename="afii57432",
+ adobename="zaharabic",
category="lo",
description="ARABIC LETTER ZAH",
direction="al",
@@ -14347,7 +15021,7 @@ characters.data={
unicodeslot=0x0638,
},
[0x0639]={
- adobename="afii57433",
+ adobename="ainarabic",
category="lo",
description="ARABIC LETTER AIN",
direction="al",
@@ -14355,7 +15029,7 @@ characters.data={
unicodeslot=0x0639,
},
[0x063A]={
- adobename="afii57434",
+ adobename="ghainarabic",
category="lo",
description="ARABIC LETTER GHAIN",
direction="al",
@@ -14363,7 +15037,7 @@ characters.data={
unicodeslot=0x063A,
},
[0x0640]={
- adobename="afii57440",
+ adobename="tatweelarabic",
category="lm",
description="ARABIC TATWEEL",
direction="al",
@@ -14371,7 +15045,7 @@ characters.data={
unicodeslot=0x0640,
},
[0x0641]={
- adobename="afii57441",
+ adobename="feharabic",
category="lo",
description="ARABIC LETTER FEH",
direction="al",
@@ -14379,7 +15053,7 @@ characters.data={
unicodeslot=0x0641,
},
[0x0642]={
- adobename="afii57442",
+ adobename="qafarabic",
category="lo",
description="ARABIC LETTER QAF",
direction="al",
@@ -14387,7 +15061,7 @@ characters.data={
unicodeslot=0x0642,
},
[0x0643]={
- adobename="afii57443",
+ adobename="kafarabic",
category="lo",
description="ARABIC LETTER KAF",
direction="al",
@@ -14395,7 +15069,7 @@ characters.data={
unicodeslot=0x0643,
},
[0x0644]={
- adobename="afii57444",
+ adobename="lamarabic",
category="lo",
description="ARABIC LETTER LAM",
direction="al",
@@ -14403,7 +15077,7 @@ characters.data={
unicodeslot=0x0644,
},
[0x0645]={
- adobename="afii57445",
+ adobename="meemarabic",
category="lo",
description="ARABIC LETTER MEEM",
direction="al",
@@ -14411,7 +15085,7 @@ characters.data={
unicodeslot=0x0645,
},
[0x0646]={
- adobename="afii57446",
+ adobename="noonarabic",
category="lo",
description="ARABIC LETTER NOON",
direction="al",
@@ -14419,7 +15093,7 @@ characters.data={
unicodeslot=0x0646,
},
[0x0647]={
- adobename="afii57470",
+ adobename="heharabic",
category="lo",
description="ARABIC LETTER HEH",
direction="al",
@@ -14427,7 +15101,7 @@ characters.data={
unicodeslot=0x0647,
},
[0x0648]={
- adobename="afii57448",
+ adobename="wawarabic",
category="lo",
description="ARABIC LETTER WAW",
direction="al",
@@ -14435,7 +15109,7 @@ characters.data={
unicodeslot=0x0648,
},
[0x0649]={
- adobename="afii57449",
+ adobename="alefmaksuraarabic",
category="lo",
description="ARABIC LETTER ALEF MAKSURA",
direction="al",
@@ -14443,7 +15117,7 @@ characters.data={
unicodeslot=0x0649,
},
[0x064A]={
- adobename="afii57450",
+ adobename="yeharabic",
category="lo",
description="ARABIC LETTER YEH",
direction="al",
@@ -14451,7 +15125,7 @@ characters.data={
unicodeslot=0x064A,
},
[0x064B]={
- adobename="afii57451",
+ adobename="fathatanarabic",
category="mn",
description="ARABIC FATHATAN",
direction="nsm",
@@ -14459,7 +15133,7 @@ characters.data={
unicodeslot=0x064B,
},
[0x064C]={
- adobename="afii57452",
+ adobename="dammatanarabic",
category="mn",
description="ARABIC DAMMATAN",
direction="nsm",
@@ -14467,7 +15141,7 @@ characters.data={
unicodeslot=0x064C,
},
[0x064D]={
- adobename="afii57453",
+ adobename="kasratanarabic",
category="mn",
description="ARABIC KASRATAN",
direction="nsm",
@@ -14475,7 +15149,7 @@ characters.data={
unicodeslot=0x064D,
},
[0x064E]={
- adobename="afii57454",
+ adobename="fathalowarabic",
category="mn",
description="ARABIC FATHA",
direction="nsm",
@@ -14483,7 +15157,7 @@ characters.data={
unicodeslot=0x064E,
},
[0x064F]={
- adobename="afii57455",
+ adobename="dammalowarabic",
category="mn",
description="ARABIC DAMMA",
direction="nsm",
@@ -14491,7 +15165,7 @@ characters.data={
unicodeslot=0x064F,
},
[0x0650]={
- adobename="afii57456",
+ adobename="kasraarabic",
category="mn",
description="ARABIC KASRA",
direction="nsm",
@@ -14499,7 +15173,7 @@ characters.data={
unicodeslot=0x0650,
},
[0x0651]={
- adobename="afii57457",
+ adobename="shaddafathatanarabic",
category="mn",
description="ARABIC SHADDA",
direction="nsm",
@@ -14507,7 +15181,7 @@ characters.data={
unicodeslot=0x0651,
},
[0x0652]={
- adobename="afii57458",
+ adobename="sukunarabic",
category="mn",
description="ARABIC SUKUN",
direction="nsm",
@@ -14599,7 +15273,7 @@ characters.data={
unicodeslot=0x065E,
},
[0x0660]={
- adobename="afii57392",
+ adobename="zerohackarabic",
category="nd",
description="ARABIC-INDIC DIGIT ZERO",
direction="an",
@@ -14607,7 +15281,7 @@ characters.data={
unicodeslot=0x0660,
},
[0x0661]={
- adobename="afii57393",
+ adobename="onehackarabic",
category="nd",
description="ARABIC-INDIC DIGIT ONE",
direction="an",
@@ -14615,7 +15289,7 @@ characters.data={
unicodeslot=0x0661,
},
[0x0662]={
- adobename="afii57394",
+ adobename="twohackarabic",
category="nd",
description="ARABIC-INDIC DIGIT TWO",
direction="an",
@@ -14623,7 +15297,7 @@ characters.data={
unicodeslot=0x0662,
},
[0x0663]={
- adobename="afii57395",
+ adobename="threehackarabic",
category="nd",
description="ARABIC-INDIC DIGIT THREE",
direction="an",
@@ -14631,7 +15305,7 @@ characters.data={
unicodeslot=0x0663,
},
[0x0664]={
- adobename="afii57396",
+ adobename="fourhackarabic",
category="nd",
description="ARABIC-INDIC DIGIT FOUR",
direction="an",
@@ -14639,7 +15313,7 @@ characters.data={
unicodeslot=0x0664,
},
[0x0665]={
- adobename="afii57397",
+ adobename="fivehackarabic",
category="nd",
description="ARABIC-INDIC DIGIT FIVE",
direction="an",
@@ -14647,7 +15321,7 @@ characters.data={
unicodeslot=0x0665,
},
[0x0666]={
- adobename="afii57398",
+ adobename="sixhackarabic",
category="nd",
description="ARABIC-INDIC DIGIT SIX",
direction="an",
@@ -14655,7 +15329,7 @@ characters.data={
unicodeslot=0x0666,
},
[0x0667]={
- adobename="afii57399",
+ adobename="sevenhackarabic",
category="nd",
description="ARABIC-INDIC DIGIT SEVEN",
direction="an",
@@ -14663,7 +15337,7 @@ characters.data={
unicodeslot=0x0667,
},
[0x0668]={
- adobename="afii57400",
+ adobename="eighthackarabic",
category="nd",
description="ARABIC-INDIC DIGIT EIGHT",
direction="an",
@@ -14671,7 +15345,7 @@ characters.data={
unicodeslot=0x0668,
},
[0x0669]={
- adobename="afii57401",
+ adobename="ninehackarabic",
category="nd",
description="ARABIC-INDIC DIGIT NINE",
direction="an",
@@ -14679,7 +15353,7 @@ characters.data={
unicodeslot=0x0669,
},
[0x066A]={
- adobename="afii57381",
+ adobename="percentarabic",
category="po",
description="ARABIC PERCENT SIGN",
direction="et",
@@ -14687,6 +15361,7 @@ characters.data={
unicodeslot=0x066A,
},
[0x066B]={
+ adobename="decimalseparatorpersian",
category="po",
description="ARABIC DECIMAL SEPARATOR",
direction="an",
@@ -14694,6 +15369,7 @@ characters.data={
unicodeslot=0x066B,
},
[0x066C]={
+ adobename="thousandsseparatorpersian",
category="po",
description="ARABIC THOUSANDS SEPARATOR",
direction="an",
@@ -14701,7 +15377,7 @@ characters.data={
unicodeslot=0x066C,
},
[0x066D]={
- adobename="afii63167",
+ adobename="asteriskarabic",
category="po",
description="ARABIC FIVE POINTED STAR",
direction="al",
@@ -14793,7 +15469,7 @@ characters.data={
unicodeslot=0x0678,
},
[0x0679]={
- adobename="afii57511",
+ adobename="tteharabic",
category="lo",
description="ARABIC LETTER TTEH",
direction="al",
@@ -14831,7 +15507,7 @@ characters.data={
unicodeslot=0x067D,
},
[0x067E]={
- adobename="afii57506",
+ adobename="peharabic",
category="lo",
description="ARABIC LETTER PEH",
direction="al",
@@ -14891,7 +15567,7 @@ characters.data={
unicodeslot=0x0685,
},
[0x0686]={
- adobename="afii57507",
+ adobename="tcheharabic",
category="lo",
description="ARABIC LETTER TCHEH",
direction="al",
@@ -14906,7 +15582,7 @@ characters.data={
unicodeslot=0x0687,
},
[0x0688]={
- adobename="afii57512",
+ adobename="ddalarabic",
category="lo",
description="ARABIC LETTER DDAL",
direction="al",
@@ -14975,7 +15651,7 @@ characters.data={
unicodeslot=0x0690,
},
[0x0691]={
- adobename="afii57513",
+ adobename="rreharabic",
category="lo",
description="ARABIC LETTER RREH",
direction="al",
@@ -15031,7 +15707,7 @@ characters.data={
unicodeslot=0x0697,
},
[0x0698]={
- adobename="afii57508",
+ adobename="jeharabic",
category="lo",
description="ARABIC LETTER JEH",
direction="al",
@@ -15126,7 +15802,7 @@ characters.data={
unicodeslot=0x06A3,
},
[0x06A4]={
- adobename="afii57505",
+ adobename="veharabic",
category="lo",
description="ARABIC LETTER VEH",
direction="al",
@@ -15210,7 +15886,7 @@ characters.data={
unicodeslot=0x06AE,
},
[0x06AF]={
- adobename="afii57509",
+ adobename="gafarabic",
category="lo",
description="ARABIC LETTER GAF",
direction="al",
@@ -15296,7 +15972,7 @@ characters.data={
unicodeslot=0x06B9,
},
[0x06BA]={
- adobename="afii57514",
+ adobename="noonghunnaarabic",
category="lo",
description="ARABIC LETTER NOON GHUNNA",
direction="al",
@@ -15351,6 +16027,7 @@ characters.data={
unicodeslot=0x06C0,
},
[0x06C1]={
+ adobename="hehaltonearabic",
category="lo",
description="ARABIC LETTER HEH GOAL",
direction="al",
@@ -15469,6 +16146,7 @@ characters.data={
unicodeslot=0x06D0,
},
[0x06D1]={
+ adobename="yehthreedotsbelowarabic",
category="lo",
description="ARABIC LETTER YEH WITH THREE DOTS BELOW",
direction="al",
@@ -15477,7 +16155,7 @@ characters.data={
unicodeslot=0x06D1,
},
[0x06D2]={
- adobename="afii57519",
+ adobename="yehbarreearabic",
category="lo",
description="ARABIC LETTER YEH BARREE",
direction="al",
@@ -15560,9 +16238,9 @@ characters.data={
category="cf",
description="ARABIC END OF AYAH",
direction="an",
- visible="yes",
linebreak="al",
unicodeslot=0x06DD,
+ visible="yes",
},
[0x06DE]={
category="me",
@@ -15693,6 +16371,7 @@ characters.data={
unicodeslot=0x06EF,
},
[0x06F0]={
+ adobename="zeropersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT ZERO",
direction="en",
@@ -15700,6 +16379,7 @@ characters.data={
unicodeslot=0x06F0,
},
[0x06F1]={
+ adobename="onepersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT ONE",
direction="en",
@@ -15707,6 +16387,7 @@ characters.data={
unicodeslot=0x06F1,
},
[0x06F2]={
+ adobename="twopersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT TWO",
direction="en",
@@ -15714,6 +16395,7 @@ characters.data={
unicodeslot=0x06F2,
},
[0x06F3]={
+ adobename="threepersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT THREE",
direction="en",
@@ -15721,6 +16403,7 @@ characters.data={
unicodeslot=0x06F3,
},
[0x06F4]={
+ adobename="fourpersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT FOUR",
direction="en",
@@ -15728,6 +16411,7 @@ characters.data={
unicodeslot=0x06F4,
},
[0x06F5]={
+ adobename="fivepersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT FIVE",
direction="en",
@@ -15735,6 +16419,7 @@ characters.data={
unicodeslot=0x06F5,
},
[0x06F6]={
+ adobename="sixpersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT SIX",
direction="en",
@@ -15742,6 +16427,7 @@ characters.data={
unicodeslot=0x06F6,
},
[0x06F7]={
+ adobename="sevenpersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT SEVEN",
direction="en",
@@ -15749,6 +16435,7 @@ characters.data={
unicodeslot=0x06F7,
},
[0x06F8]={
+ adobename="eightpersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT EIGHT",
direction="en",
@@ -15756,6 +16443,7 @@ characters.data={
unicodeslot=0x06F8,
},
[0x06F9]={
+ adobename="ninepersian",
category="nd",
description="EXTENDED ARABIC-INDIC DIGIT NINE",
direction="en",
@@ -15910,9 +16598,9 @@ characters.data={
category="cf",
description="SYRIAC ABBREVIATION MARK",
direction="bn",
- visible="yes",
linebreak="al",
unicodeslot=0x070F,
+ visible="yes",
},
[0x0710]={
category="lo",
@@ -17352,6 +18040,7 @@ characters.data={
unicodeslot=0x07FA,
},
[0x0901]={
+ adobename="candrabindudeva",
category="mn",
description="DEVANAGARI SIGN CANDRABINDU",
direction="nsm",
@@ -17359,6 +18048,7 @@ characters.data={
unicodeslot=0x0901,
},
[0x0902]={
+ adobename="anusvaradeva",
category="mn",
description="DEVANAGARI SIGN ANUSVARA",
direction="nsm",
@@ -17366,6 +18056,7 @@ characters.data={
unicodeslot=0x0902,
},
[0x0903]={
+ adobename="visargadeva",
category="mc",
description="DEVANAGARI SIGN VISARGA",
direction="l",
@@ -17380,6 +18071,7 @@ characters.data={
unicodeslot=0x0904,
},
[0x0905]={
+ adobename="adeva",
category="lo",
description="DEVANAGARI LETTER A",
direction="l",
@@ -17387,6 +18079,7 @@ characters.data={
unicodeslot=0x0905,
},
[0x0906]={
+ adobename="aadeva",
category="lo",
description="DEVANAGARI LETTER AA",
direction="l",
@@ -17394,6 +18087,7 @@ characters.data={
unicodeslot=0x0906,
},
[0x0907]={
+ adobename="ideva",
category="lo",
description="DEVANAGARI LETTER I",
direction="l",
@@ -17401,6 +18095,7 @@ characters.data={
unicodeslot=0x0907,
},
[0x0908]={
+ adobename="iideva",
category="lo",
description="DEVANAGARI LETTER II",
direction="l",
@@ -17408,6 +18103,7 @@ characters.data={
unicodeslot=0x0908,
},
[0x0909]={
+ adobename="udeva",
category="lo",
description="DEVANAGARI LETTER U",
direction="l",
@@ -17415,6 +18111,7 @@ characters.data={
unicodeslot=0x0909,
},
[0x090A]={
+ adobename="uudeva",
category="lo",
description="DEVANAGARI LETTER UU",
direction="l",
@@ -17422,6 +18119,7 @@ characters.data={
unicodeslot=0x090A,
},
[0x090B]={
+ adobename="rvocalicdeva",
category="lo",
description="DEVANAGARI LETTER VOCALIC R",
direction="l",
@@ -17429,6 +18127,7 @@ characters.data={
unicodeslot=0x090B,
},
[0x090C]={
+ adobename="lvocalicdeva",
category="lo",
description="DEVANAGARI LETTER VOCALIC L",
direction="l",
@@ -17436,6 +18135,7 @@ characters.data={
unicodeslot=0x090C,
},
[0x090D]={
+ adobename="ecandradeva",
category="lo",
description="DEVANAGARI LETTER CANDRA E",
direction="l",
@@ -17443,6 +18143,7 @@ characters.data={
unicodeslot=0x090D,
},
[0x090E]={
+ adobename="eshortdeva",
category="lo",
description="DEVANAGARI LETTER SHORT E",
direction="l",
@@ -17450,6 +18151,7 @@ characters.data={
unicodeslot=0x090E,
},
[0x090F]={
+ adobename="edeva",
category="lo",
description="DEVANAGARI LETTER E",
direction="l",
@@ -17457,6 +18159,7 @@ characters.data={
unicodeslot=0x090F,
},
[0x0910]={
+ adobename="aideva",
category="lo",
description="DEVANAGARI LETTER AI",
direction="l",
@@ -17464,6 +18167,7 @@ characters.data={
unicodeslot=0x0910,
},
[0x0911]={
+ adobename="ocandradeva",
category="lo",
description="DEVANAGARI LETTER CANDRA O",
direction="l",
@@ -17471,6 +18175,7 @@ characters.data={
unicodeslot=0x0911,
},
[0x0912]={
+ adobename="oshortdeva",
category="lo",
description="DEVANAGARI LETTER SHORT O",
direction="l",
@@ -17478,6 +18183,7 @@ characters.data={
unicodeslot=0x0912,
},
[0x0913]={
+ adobename="odeva",
category="lo",
description="DEVANAGARI LETTER O",
direction="l",
@@ -17485,6 +18191,7 @@ characters.data={
unicodeslot=0x0913,
},
[0x0914]={
+ adobename="audeva",
category="lo",
description="DEVANAGARI LETTER AU",
direction="l",
@@ -17492,6 +18199,7 @@ characters.data={
unicodeslot=0x0914,
},
[0x0915]={
+ adobename="kadeva",
category="lo",
description="DEVANAGARI LETTER KA",
direction="l",
@@ -17499,6 +18207,7 @@ characters.data={
unicodeslot=0x0915,
},
[0x0916]={
+ adobename="khadeva",
category="lo",
description="DEVANAGARI LETTER KHA",
direction="l",
@@ -17506,6 +18215,7 @@ characters.data={
unicodeslot=0x0916,
},
[0x0917]={
+ adobename="gadeva",
category="lo",
description="DEVANAGARI LETTER GA",
direction="l",
@@ -17513,6 +18223,7 @@ characters.data={
unicodeslot=0x0917,
},
[0x0918]={
+ adobename="ghadeva",
category="lo",
description="DEVANAGARI LETTER GHA",
direction="l",
@@ -17520,6 +18231,7 @@ characters.data={
unicodeslot=0x0918,
},
[0x0919]={
+ adobename="ngadeva",
category="lo",
description="DEVANAGARI LETTER NGA",
direction="l",
@@ -17527,6 +18239,7 @@ characters.data={
unicodeslot=0x0919,
},
[0x091A]={
+ adobename="cadeva",
category="lo",
description="DEVANAGARI LETTER CA",
direction="l",
@@ -17534,6 +18247,7 @@ characters.data={
unicodeslot=0x091A,
},
[0x091B]={
+ adobename="chadeva",
category="lo",
description="DEVANAGARI LETTER CHA",
direction="l",
@@ -17541,6 +18255,7 @@ characters.data={
unicodeslot=0x091B,
},
[0x091C]={
+ adobename="jadeva",
category="lo",
description="DEVANAGARI LETTER JA",
direction="l",
@@ -17548,6 +18263,7 @@ characters.data={
unicodeslot=0x091C,
},
[0x091D]={
+ adobename="jhadeva",
category="lo",
description="DEVANAGARI LETTER JHA",
direction="l",
@@ -17555,6 +18271,7 @@ characters.data={
unicodeslot=0x091D,
},
[0x091E]={
+ adobename="nyadeva",
category="lo",
description="DEVANAGARI LETTER NYA",
direction="l",
@@ -17562,6 +18279,7 @@ characters.data={
unicodeslot=0x091E,
},
[0x091F]={
+ adobename="ttadeva",
category="lo",
description="DEVANAGARI LETTER TTA",
direction="l",
@@ -17569,6 +18287,7 @@ characters.data={
unicodeslot=0x091F,
},
[0x0920]={
+ adobename="tthadeva",
category="lo",
description="DEVANAGARI LETTER TTHA",
direction="l",
@@ -17576,6 +18295,7 @@ characters.data={
unicodeslot=0x0920,
},
[0x0921]={
+ adobename="ddadeva",
category="lo",
description="DEVANAGARI LETTER DDA",
direction="l",
@@ -17583,6 +18303,7 @@ characters.data={
unicodeslot=0x0921,
},
[0x0922]={
+ adobename="ddhadeva",
category="lo",
description="DEVANAGARI LETTER DDHA",
direction="l",
@@ -17590,6 +18311,7 @@ characters.data={
unicodeslot=0x0922,
},
[0x0923]={
+ adobename="nnadeva",
category="lo",
description="DEVANAGARI LETTER NNA",
direction="l",
@@ -17597,6 +18319,7 @@ characters.data={
unicodeslot=0x0923,
},
[0x0924]={
+ adobename="tadeva",
category="lo",
description="DEVANAGARI LETTER TA",
direction="l",
@@ -17604,6 +18327,7 @@ characters.data={
unicodeslot=0x0924,
},
[0x0925]={
+ adobename="thadeva",
category="lo",
description="DEVANAGARI LETTER THA",
direction="l",
@@ -17611,6 +18335,7 @@ characters.data={
unicodeslot=0x0925,
},
[0x0926]={
+ adobename="dadeva",
category="lo",
description="DEVANAGARI LETTER DA",
direction="l",
@@ -17618,6 +18343,7 @@ characters.data={
unicodeslot=0x0926,
},
[0x0927]={
+ adobename="dhadeva",
category="lo",
description="DEVANAGARI LETTER DHA",
direction="l",
@@ -17625,6 +18351,7 @@ characters.data={
unicodeslot=0x0927,
},
[0x0928]={
+ adobename="nadeva",
category="lo",
description="DEVANAGARI LETTER NA",
direction="l",
@@ -17632,6 +18359,7 @@ characters.data={
unicodeslot=0x0928,
},
[0x0929]={
+ adobename="nnnadeva",
category="lo",
description="DEVANAGARI LETTER NNNA",
direction="l",
@@ -17640,6 +18368,7 @@ characters.data={
unicodeslot=0x0929,
},
[0x092A]={
+ adobename="padeva",
category="lo",
description="DEVANAGARI LETTER PA",
direction="l",
@@ -17647,6 +18376,7 @@ characters.data={
unicodeslot=0x092A,
},
[0x092B]={
+ adobename="phadeva",
category="lo",
description="DEVANAGARI LETTER PHA",
direction="l",
@@ -17654,6 +18384,7 @@ characters.data={
unicodeslot=0x092B,
},
[0x092C]={
+ adobename="badeva",
category="lo",
description="DEVANAGARI LETTER BA",
direction="l",
@@ -17661,6 +18392,7 @@ characters.data={
unicodeslot=0x092C,
},
[0x092D]={
+ adobename="bhadeva",
category="lo",
description="DEVANAGARI LETTER BHA",
direction="l",
@@ -17668,6 +18400,7 @@ characters.data={
unicodeslot=0x092D,
},
[0x092E]={
+ adobename="madeva",
category="lo",
description="DEVANAGARI LETTER MA",
direction="l",
@@ -17675,6 +18408,7 @@ characters.data={
unicodeslot=0x092E,
},
[0x092F]={
+ adobename="yadeva",
category="lo",
description="DEVANAGARI LETTER YA",
direction="l",
@@ -17682,6 +18416,7 @@ characters.data={
unicodeslot=0x092F,
},
[0x0930]={
+ adobename="radeva",
category="lo",
description="DEVANAGARI LETTER RA",
direction="l",
@@ -17689,6 +18424,7 @@ characters.data={
unicodeslot=0x0930,
},
[0x0931]={
+ adobename="rradeva",
category="lo",
description="DEVANAGARI LETTER RRA",
direction="l",
@@ -17697,6 +18433,7 @@ characters.data={
unicodeslot=0x0931,
},
[0x0932]={
+ adobename="ladeva",
category="lo",
description="DEVANAGARI LETTER LA",
direction="l",
@@ -17704,6 +18441,7 @@ characters.data={
unicodeslot=0x0932,
},
[0x0933]={
+ adobename="lladeva",
category="lo",
description="DEVANAGARI LETTER LLA",
direction="l",
@@ -17711,6 +18449,7 @@ characters.data={
unicodeslot=0x0933,
},
[0x0934]={
+ adobename="llladeva",
category="lo",
description="DEVANAGARI LETTER LLLA",
direction="l",
@@ -17719,6 +18458,7 @@ characters.data={
unicodeslot=0x0934,
},
[0x0935]={
+ adobename="vadeva",
category="lo",
description="DEVANAGARI LETTER VA",
direction="l",
@@ -17726,6 +18466,7 @@ characters.data={
unicodeslot=0x0935,
},
[0x0936]={
+ adobename="shadeva",
category="lo",
description="DEVANAGARI LETTER SHA",
direction="l",
@@ -17733,6 +18474,7 @@ characters.data={
unicodeslot=0x0936,
},
[0x0937]={
+ adobename="ssadeva",
category="lo",
description="DEVANAGARI LETTER SSA",
direction="l",
@@ -17740,6 +18482,7 @@ characters.data={
unicodeslot=0x0937,
},
[0x0938]={
+ adobename="sadeva",
category="lo",
description="DEVANAGARI LETTER SA",
direction="l",
@@ -17747,6 +18490,7 @@ characters.data={
unicodeslot=0x0938,
},
[0x0939]={
+ adobename="hadeva",
category="lo",
description="DEVANAGARI LETTER HA",
direction="l",
@@ -17754,6 +18498,7 @@ characters.data={
unicodeslot=0x0939,
},
[0x093C]={
+ adobename="nuktadeva",
category="mn",
description="DEVANAGARI SIGN NUKTA",
direction="nsm",
@@ -17761,6 +18506,7 @@ characters.data={
unicodeslot=0x093C,
},
[0x093D]={
+ adobename="avagrahadeva",
category="lo",
description="DEVANAGARI SIGN AVAGRAHA",
direction="l",
@@ -17768,6 +18514,7 @@ characters.data={
unicodeslot=0x093D,
},
[0x093E]={
+ adobename="aavowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN AA",
direction="l",
@@ -17775,6 +18522,7 @@ characters.data={
unicodeslot=0x093E,
},
[0x093F]={
+ adobename="ivowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN I",
direction="l",
@@ -17782,6 +18530,7 @@ characters.data={
unicodeslot=0x093F,
},
[0x0940]={
+ adobename="iivowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN II",
direction="l",
@@ -17789,6 +18538,7 @@ characters.data={
unicodeslot=0x0940,
},
[0x0941]={
+ adobename="uvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN U",
direction="nsm",
@@ -17796,6 +18546,7 @@ characters.data={
unicodeslot=0x0941,
},
[0x0942]={
+ adobename="uuvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN UU",
direction="nsm",
@@ -17803,6 +18554,7 @@ characters.data={
unicodeslot=0x0942,
},
[0x0943]={
+ adobename="rvocalicvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN VOCALIC R",
direction="nsm",
@@ -17810,6 +18562,7 @@ characters.data={
unicodeslot=0x0943,
},
[0x0944]={
+ adobename="rrvocalicvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN VOCALIC RR",
direction="nsm",
@@ -17817,6 +18570,7 @@ characters.data={
unicodeslot=0x0944,
},
[0x0945]={
+ adobename="ecandravowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN CANDRA E",
direction="nsm",
@@ -17824,6 +18578,7 @@ characters.data={
unicodeslot=0x0945,
},
[0x0946]={
+ adobename="eshortvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN SHORT E",
direction="nsm",
@@ -17831,6 +18586,7 @@ characters.data={
unicodeslot=0x0946,
},
[0x0947]={
+ adobename="evowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN E",
direction="nsm",
@@ -17838,6 +18594,7 @@ characters.data={
unicodeslot=0x0947,
},
[0x0948]={
+ adobename="aivowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN AI",
direction="nsm",
@@ -17845,6 +18602,7 @@ characters.data={
unicodeslot=0x0948,
},
[0x0949]={
+ adobename="ocandravowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN CANDRA O",
direction="l",
@@ -17852,6 +18610,7 @@ characters.data={
unicodeslot=0x0949,
},
[0x094A]={
+ adobename="oshortvowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN SHORT O",
direction="l",
@@ -17859,6 +18618,7 @@ characters.data={
unicodeslot=0x094A,
},
[0x094B]={
+ adobename="ovowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN O",
direction="l",
@@ -17866,6 +18626,7 @@ characters.data={
unicodeslot=0x094B,
},
[0x094C]={
+ adobename="auvowelsigndeva",
category="mc",
description="DEVANAGARI VOWEL SIGN AU",
direction="l",
@@ -17873,6 +18634,7 @@ characters.data={
unicodeslot=0x094C,
},
[0x094D]={
+ adobename="viramadeva",
category="mn",
description="DEVANAGARI SIGN VIRAMA",
direction="nsm",
@@ -17880,6 +18642,7 @@ characters.data={
unicodeslot=0x094D,
},
[0x0950]={
+ adobename="omdeva",
category="lo",
description="DEVANAGARI OM",
direction="l",
@@ -17887,6 +18650,7 @@ characters.data={
unicodeslot=0x0950,
},
[0x0951]={
+ adobename="udattadeva",
category="mn",
description="DEVANAGARI STRESS SIGN UDATTA",
direction="nsm",
@@ -17894,6 +18658,7 @@ characters.data={
unicodeslot=0x0951,
},
[0x0952]={
+ adobename="anudattadeva",
category="mn",
description="DEVANAGARI STRESS SIGN ANUDATTA",
direction="nsm",
@@ -17901,6 +18666,7 @@ characters.data={
unicodeslot=0x0952,
},
[0x0953]={
+ adobename="gravedeva",
category="mn",
description="DEVANAGARI GRAVE ACCENT",
direction="nsm",
@@ -17908,6 +18674,7 @@ characters.data={
unicodeslot=0x0953,
},
[0x0954]={
+ adobename="acutedeva",
category="mn",
description="DEVANAGARI ACUTE ACCENT",
direction="nsm",
@@ -17915,6 +18682,7 @@ characters.data={
unicodeslot=0x0954,
},
[0x0958]={
+ adobename="qadeva",
category="lo",
description="DEVANAGARI LETTER QA",
direction="l",
@@ -17923,6 +18691,7 @@ characters.data={
unicodeslot=0x0958,
},
[0x0959]={
+ adobename="khhadeva",
category="lo",
description="DEVANAGARI LETTER KHHA",
direction="l",
@@ -17931,6 +18700,7 @@ characters.data={
unicodeslot=0x0959,
},
[0x095A]={
+ adobename="ghhadeva",
category="lo",
description="DEVANAGARI LETTER GHHA",
direction="l",
@@ -17939,6 +18709,7 @@ characters.data={
unicodeslot=0x095A,
},
[0x095B]={
+ adobename="zadeva",
category="lo",
description="DEVANAGARI LETTER ZA",
direction="l",
@@ -17947,6 +18718,7 @@ characters.data={
unicodeslot=0x095B,
},
[0x095C]={
+ adobename="dddhadeva",
category="lo",
description="DEVANAGARI LETTER DDDHA",
direction="l",
@@ -17955,6 +18727,7 @@ characters.data={
unicodeslot=0x095C,
},
[0x095D]={
+ adobename="rhadeva",
category="lo",
description="DEVANAGARI LETTER RHA",
direction="l",
@@ -17963,6 +18736,7 @@ characters.data={
unicodeslot=0x095D,
},
[0x095E]={
+ adobename="fadeva",
category="lo",
description="DEVANAGARI LETTER FA",
direction="l",
@@ -17971,6 +18745,7 @@ characters.data={
unicodeslot=0x095E,
},
[0x095F]={
+ adobename="yyadeva",
category="lo",
description="DEVANAGARI LETTER YYA",
direction="l",
@@ -17979,6 +18754,7 @@ characters.data={
unicodeslot=0x095F,
},
[0x0960]={
+ adobename="rrvocalicdeva",
category="lo",
description="DEVANAGARI LETTER VOCALIC RR",
direction="l",
@@ -17986,6 +18762,7 @@ characters.data={
unicodeslot=0x0960,
},
[0x0961]={
+ adobename="llvocalicdeva",
category="lo",
description="DEVANAGARI LETTER VOCALIC LL",
direction="l",
@@ -17993,6 +18770,7 @@ characters.data={
unicodeslot=0x0961,
},
[0x0962]={
+ adobename="lvocalicvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN VOCALIC L",
direction="nsm",
@@ -18000,6 +18778,7 @@ characters.data={
unicodeslot=0x0962,
},
[0x0963]={
+ adobename="llvocalicvowelsigndeva",
category="mn",
description="DEVANAGARI VOWEL SIGN VOCALIC LL",
direction="nsm",
@@ -18007,6 +18786,7 @@ characters.data={
unicodeslot=0x0963,
},
[0x0964]={
+ adobename="danda",
category="po",
description="DEVANAGARI DANDA",
direction="l",
@@ -18014,6 +18794,7 @@ characters.data={
unicodeslot=0x0964,
},
[0x0965]={
+ adobename="dbldanda",
category="po",
description="DEVANAGARI DOUBLE DANDA",
direction="l",
@@ -18021,6 +18802,7 @@ characters.data={
unicodeslot=0x0965,
},
[0x0966]={
+ adobename="zerodeva",
category="nd",
description="DEVANAGARI DIGIT ZERO",
direction="l",
@@ -18028,6 +18810,7 @@ characters.data={
unicodeslot=0x0966,
},
[0x0967]={
+ adobename="onedeva",
category="nd",
description="DEVANAGARI DIGIT ONE",
direction="l",
@@ -18035,6 +18818,7 @@ characters.data={
unicodeslot=0x0967,
},
[0x0968]={
+ adobename="twodeva",
category="nd",
description="DEVANAGARI DIGIT TWO",
direction="l",
@@ -18042,6 +18826,7 @@ characters.data={
unicodeslot=0x0968,
},
[0x0969]={
+ adobename="threedeva",
category="nd",
description="DEVANAGARI DIGIT THREE",
direction="l",
@@ -18049,6 +18834,7 @@ characters.data={
unicodeslot=0x0969,
},
[0x096A]={
+ adobename="fourdeva",
category="nd",
description="DEVANAGARI DIGIT FOUR",
direction="l",
@@ -18056,6 +18842,7 @@ characters.data={
unicodeslot=0x096A,
},
[0x096B]={
+ adobename="fivedeva",
category="nd",
description="DEVANAGARI DIGIT FIVE",
direction="l",
@@ -18063,6 +18850,7 @@ characters.data={
unicodeslot=0x096B,
},
[0x096C]={
+ adobename="sixdeva",
category="nd",
description="DEVANAGARI DIGIT SIX",
direction="l",
@@ -18070,6 +18858,7 @@ characters.data={
unicodeslot=0x096C,
},
[0x096D]={
+ adobename="sevendeva",
category="nd",
description="DEVANAGARI DIGIT SEVEN",
direction="l",
@@ -18077,6 +18866,7 @@ characters.data={
unicodeslot=0x096D,
},
[0x096E]={
+ adobename="eightdeva",
category="nd",
description="DEVANAGARI DIGIT EIGHT",
direction="l",
@@ -18084,6 +18874,7 @@ characters.data={
unicodeslot=0x096E,
},
[0x096F]={
+ adobename="ninedeva",
category="nd",
description="DEVANAGARI DIGIT NINE",
direction="l",
@@ -18091,6 +18882,7 @@ characters.data={
unicodeslot=0x096F,
},
[0x0970]={
+ adobename="abbreviationsigndeva",
category="po",
description="DEVANAGARI ABBREVIATION SIGN",
direction="l",
@@ -18133,6 +18925,7 @@ characters.data={
unicodeslot=0x097F,
},
[0x0981]={
+ adobename="candrabindubengali",
category="mn",
description="BENGALI SIGN CANDRABINDU",
direction="nsm",
@@ -18140,6 +18933,7 @@ characters.data={
unicodeslot=0x0981,
},
[0x0982]={
+ adobename="anusvarabengali",
category="mc",
description="BENGALI SIGN ANUSVARA",
direction="l",
@@ -18147,6 +18941,7 @@ characters.data={
unicodeslot=0x0982,
},
[0x0983]={
+ adobename="visargabengali",
category="mc",
description="BENGALI SIGN VISARGA",
direction="l",
@@ -18154,6 +18949,7 @@ characters.data={
unicodeslot=0x0983,
},
[0x0985]={
+ adobename="abengali",
category="lo",
description="BENGALI LETTER A",
direction="l",
@@ -18161,6 +18957,7 @@ characters.data={
unicodeslot=0x0985,
},
[0x0986]={
+ adobename="aabengali",
category="lo",
description="BENGALI LETTER AA",
direction="l",
@@ -18168,6 +18965,7 @@ characters.data={
unicodeslot=0x0986,
},
[0x0987]={
+ adobename="ibengali",
category="lo",
description="BENGALI LETTER I",
direction="l",
@@ -18175,6 +18973,7 @@ characters.data={
unicodeslot=0x0987,
},
[0x0988]={
+ adobename="iibengali",
category="lo",
description="BENGALI LETTER II",
direction="l",
@@ -18182,6 +18981,7 @@ characters.data={
unicodeslot=0x0988,
},
[0x0989]={
+ adobename="ubengali",
category="lo",
description="BENGALI LETTER U",
direction="l",
@@ -18189,6 +18989,7 @@ characters.data={
unicodeslot=0x0989,
},
[0x098A]={
+ adobename="uubengali",
category="lo",
description="BENGALI LETTER UU",
direction="l",
@@ -18196,6 +18997,7 @@ characters.data={
unicodeslot=0x098A,
},
[0x098B]={
+ adobename="rvocalicbengali",
category="lo",
description="BENGALI LETTER VOCALIC R",
direction="l",
@@ -18203,6 +19005,7 @@ characters.data={
unicodeslot=0x098B,
},
[0x098C]={
+ adobename="lvocalicbengali",
category="lo",
description="BENGALI LETTER VOCALIC L",
direction="l",
@@ -18210,6 +19013,7 @@ characters.data={
unicodeslot=0x098C,
},
[0x098F]={
+ adobename="ebengali",
category="lo",
description="BENGALI LETTER E",
direction="l",
@@ -18217,6 +19021,7 @@ characters.data={
unicodeslot=0x098F,
},
[0x0990]={
+ adobename="aibengali",
category="lo",
description="BENGALI LETTER AI",
direction="l",
@@ -18224,6 +19029,7 @@ characters.data={
unicodeslot=0x0990,
},
[0x0993]={
+ adobename="obengali",
category="lo",
description="BENGALI LETTER O",
direction="l",
@@ -18231,6 +19037,7 @@ characters.data={
unicodeslot=0x0993,
},
[0x0994]={
+ adobename="aubengali",
category="lo",
description="BENGALI LETTER AU",
direction="l",
@@ -18238,6 +19045,7 @@ characters.data={
unicodeslot=0x0994,
},
[0x0995]={
+ adobename="kabengali",
category="lo",
description="BENGALI LETTER KA",
direction="l",
@@ -18245,6 +19053,7 @@ characters.data={
unicodeslot=0x0995,
},
[0x0996]={
+ adobename="khabengali",
category="lo",
description="BENGALI LETTER KHA",
direction="l",
@@ -18252,6 +19061,7 @@ characters.data={
unicodeslot=0x0996,
},
[0x0997]={
+ adobename="gabengali",
category="lo",
description="BENGALI LETTER GA",
direction="l",
@@ -18259,6 +19069,7 @@ characters.data={
unicodeslot=0x0997,
},
[0x0998]={
+ adobename="ghabengali",
category="lo",
description="BENGALI LETTER GHA",
direction="l",
@@ -18266,6 +19077,7 @@ characters.data={
unicodeslot=0x0998,
},
[0x0999]={
+ adobename="ngabengali",
category="lo",
description="BENGALI LETTER NGA",
direction="l",
@@ -18273,6 +19085,7 @@ characters.data={
unicodeslot=0x0999,
},
[0x099A]={
+ adobename="cabengali",
category="lo",
description="BENGALI LETTER CA",
direction="l",
@@ -18280,6 +19093,7 @@ characters.data={
unicodeslot=0x099A,
},
[0x099B]={
+ adobename="chabengali",
category="lo",
description="BENGALI LETTER CHA",
direction="l",
@@ -18287,6 +19101,7 @@ characters.data={
unicodeslot=0x099B,
},
[0x099C]={
+ adobename="jabengali",
category="lo",
description="BENGALI LETTER JA",
direction="l",
@@ -18294,6 +19109,7 @@ characters.data={
unicodeslot=0x099C,
},
[0x099D]={
+ adobename="jhabengali",
category="lo",
description="BENGALI LETTER JHA",
direction="l",
@@ -18301,6 +19117,7 @@ characters.data={
unicodeslot=0x099D,
},
[0x099E]={
+ adobename="nyabengali",
category="lo",
description="BENGALI LETTER NYA",
direction="l",
@@ -18308,6 +19125,7 @@ characters.data={
unicodeslot=0x099E,
},
[0x099F]={
+ adobename="ttabengali",
category="lo",
description="BENGALI LETTER TTA",
direction="l",
@@ -18315,6 +19133,7 @@ characters.data={
unicodeslot=0x099F,
},
[0x09A0]={
+ adobename="tthabengali",
category="lo",
description="BENGALI LETTER TTHA",
direction="l",
@@ -18322,6 +19141,7 @@ characters.data={
unicodeslot=0x09A0,
},
[0x09A1]={
+ adobename="ddabengali",
category="lo",
description="BENGALI LETTER DDA",
direction="l",
@@ -18329,6 +19149,7 @@ characters.data={
unicodeslot=0x09A1,
},
[0x09A2]={
+ adobename="ddhabengali",
category="lo",
description="BENGALI LETTER DDHA",
direction="l",
@@ -18336,6 +19157,7 @@ characters.data={
unicodeslot=0x09A2,
},
[0x09A3]={
+ adobename="nnabengali",
category="lo",
description="BENGALI LETTER NNA",
direction="l",
@@ -18343,6 +19165,7 @@ characters.data={
unicodeslot=0x09A3,
},
[0x09A4]={
+ adobename="tabengali",
category="lo",
description="BENGALI LETTER TA",
direction="l",
@@ -18350,6 +19173,7 @@ characters.data={
unicodeslot=0x09A4,
},
[0x09A5]={
+ adobename="thabengali",
category="lo",
description="BENGALI LETTER THA",
direction="l",
@@ -18357,6 +19181,7 @@ characters.data={
unicodeslot=0x09A5,
},
[0x09A6]={
+ adobename="dabengali",
category="lo",
description="BENGALI LETTER DA",
direction="l",
@@ -18364,6 +19189,7 @@ characters.data={
unicodeslot=0x09A6,
},
[0x09A7]={
+ adobename="dhabengali",
category="lo",
description="BENGALI LETTER DHA",
direction="l",
@@ -18371,6 +19197,7 @@ characters.data={
unicodeslot=0x09A7,
},
[0x09A8]={
+ adobename="nabengali",
category="lo",
description="BENGALI LETTER NA",
direction="l",
@@ -18378,6 +19205,7 @@ characters.data={
unicodeslot=0x09A8,
},
[0x09AA]={
+ adobename="pabengali",
category="lo",
description="BENGALI LETTER PA",
direction="l",
@@ -18385,6 +19213,7 @@ characters.data={
unicodeslot=0x09AA,
},
[0x09AB]={
+ adobename="phabengali",
category="lo",
description="BENGALI LETTER PHA",
direction="l",
@@ -18392,6 +19221,7 @@ characters.data={
unicodeslot=0x09AB,
},
[0x09AC]={
+ adobename="babengali",
category="lo",
description="BENGALI LETTER BA",
direction="l",
@@ -18399,6 +19229,7 @@ characters.data={
unicodeslot=0x09AC,
},
[0x09AD]={
+ adobename="bhabengali",
category="lo",
description="BENGALI LETTER BHA",
direction="l",
@@ -18406,6 +19237,7 @@ characters.data={
unicodeslot=0x09AD,
},
[0x09AE]={
+ adobename="mabengali",
category="lo",
description="BENGALI LETTER MA",
direction="l",
@@ -18413,6 +19245,7 @@ characters.data={
unicodeslot=0x09AE,
},
[0x09AF]={
+ adobename="yabengali",
category="lo",
description="BENGALI LETTER YA",
direction="l",
@@ -18420,6 +19253,7 @@ characters.data={
unicodeslot=0x09AF,
},
[0x09B0]={
+ adobename="rabengali",
category="lo",
description="BENGALI LETTER RA",
direction="l",
@@ -18427,6 +19261,7 @@ characters.data={
unicodeslot=0x09B0,
},
[0x09B2]={
+ adobename="labengali",
category="lo",
description="BENGALI LETTER LA",
direction="l",
@@ -18434,6 +19269,7 @@ characters.data={
unicodeslot=0x09B2,
},
[0x09B6]={
+ adobename="shabengali",
category="lo",
description="BENGALI LETTER SHA",
direction="l",
@@ -18441,6 +19277,7 @@ characters.data={
unicodeslot=0x09B6,
},
[0x09B7]={
+ adobename="ssabengali",
category="lo",
description="BENGALI LETTER SSA",
direction="l",
@@ -18448,6 +19285,7 @@ characters.data={
unicodeslot=0x09B7,
},
[0x09B8]={
+ adobename="sabengali",
category="lo",
description="BENGALI LETTER SA",
direction="l",
@@ -18455,6 +19293,7 @@ characters.data={
unicodeslot=0x09B8,
},
[0x09B9]={
+ adobename="habengali",
category="lo",
description="BENGALI LETTER HA",
direction="l",
@@ -18462,6 +19301,7 @@ characters.data={
unicodeslot=0x09B9,
},
[0x09BC]={
+ adobename="nuktabengali",
category="mn",
description="BENGALI SIGN NUKTA",
direction="nsm",
@@ -18476,6 +19316,7 @@ characters.data={
unicodeslot=0x09BD,
},
[0x09BE]={
+ adobename="aavowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN AA",
direction="l",
@@ -18483,6 +19324,7 @@ characters.data={
unicodeslot=0x09BE,
},
[0x09BF]={
+ adobename="ivowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN I",
direction="l",
@@ -18490,6 +19332,7 @@ characters.data={
unicodeslot=0x09BF,
},
[0x09C0]={
+ adobename="iivowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN II",
direction="l",
@@ -18497,6 +19340,7 @@ characters.data={
unicodeslot=0x09C0,
},
[0x09C1]={
+ adobename="uvowelsignbengali",
category="mn",
description="BENGALI VOWEL SIGN U",
direction="nsm",
@@ -18504,6 +19348,7 @@ characters.data={
unicodeslot=0x09C1,
},
[0x09C2]={
+ adobename="uuvowelsignbengali",
category="mn",
description="BENGALI VOWEL SIGN UU",
direction="nsm",
@@ -18511,6 +19356,7 @@ characters.data={
unicodeslot=0x09C2,
},
[0x09C3]={
+ adobename="rvocalicvowelsignbengali",
category="mn",
description="BENGALI VOWEL SIGN VOCALIC R",
direction="nsm",
@@ -18518,6 +19364,7 @@ characters.data={
unicodeslot=0x09C3,
},
[0x09C4]={
+ adobename="rrvocalicvowelsignbengali",
category="mn",
description="BENGALI VOWEL SIGN VOCALIC RR",
direction="nsm",
@@ -18525,6 +19372,7 @@ characters.data={
unicodeslot=0x09C4,
},
[0x09C7]={
+ adobename="evowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN E",
direction="l",
@@ -18532,6 +19380,7 @@ characters.data={
unicodeslot=0x09C7,
},
[0x09C8]={
+ adobename="aivowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN AI",
direction="l",
@@ -18539,6 +19388,7 @@ characters.data={
unicodeslot=0x09C8,
},
[0x09CB]={
+ adobename="ovowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN O",
direction="l",
@@ -18547,6 +19397,7 @@ characters.data={
unicodeslot=0x09CB,
},
[0x09CC]={
+ adobename="auvowelsignbengali",
category="mc",
description="BENGALI VOWEL SIGN AU",
direction="l",
@@ -18555,6 +19406,7 @@ characters.data={
unicodeslot=0x09CC,
},
[0x09CD]={
+ adobename="viramabengali",
category="mn",
description="BENGALI SIGN VIRAMA",
direction="nsm",
@@ -18569,6 +19421,7 @@ characters.data={
unicodeslot=0x09CE,
},
[0x09D7]={
+ adobename="aulengthmarkbengali",
category="mc",
description="BENGALI AU LENGTH MARK",
direction="l",
@@ -18576,6 +19429,7 @@ characters.data={
unicodeslot=0x09D7,
},
[0x09DC]={
+ adobename="rrabengali",
category="lo",
description="BENGALI LETTER RRA",
direction="l",
@@ -18584,6 +19438,7 @@ characters.data={
unicodeslot=0x09DC,
},
[0x09DD]={
+ adobename="rhabengali",
category="lo",
description="BENGALI LETTER RHA",
direction="l",
@@ -18592,6 +19447,7 @@ characters.data={
unicodeslot=0x09DD,
},
[0x09DF]={
+ adobename="yyabengali",
category="lo",
description="BENGALI LETTER YYA",
direction="l",
@@ -18600,6 +19456,7 @@ characters.data={
unicodeslot=0x09DF,
},
[0x09E0]={
+ adobename="rrvocalicbengali",
category="lo",
description="BENGALI LETTER VOCALIC RR",
direction="l",
@@ -18607,6 +19464,7 @@ characters.data={
unicodeslot=0x09E0,
},
[0x09E1]={
+ adobename="llvocalicbengali",
category="lo",
description="BENGALI LETTER VOCALIC LL",
direction="l",
@@ -18614,6 +19472,7 @@ characters.data={
unicodeslot=0x09E1,
},
[0x09E2]={
+ adobename="lvocalicvowelsignbengali",
category="mn",
description="BENGALI VOWEL SIGN VOCALIC L",
direction="nsm",
@@ -18621,6 +19480,7 @@ characters.data={
unicodeslot=0x09E2,
},
[0x09E3]={
+ adobename="llvocalicvowelsignbengali",
category="mn",
description="BENGALI VOWEL SIGN VOCALIC LL",
direction="nsm",
@@ -18628,6 +19488,7 @@ characters.data={
unicodeslot=0x09E3,
},
[0x09E6]={
+ adobename="zerobengali",
category="nd",
description="BENGALI DIGIT ZERO",
direction="l",
@@ -18635,6 +19496,7 @@ characters.data={
unicodeslot=0x09E6,
},
[0x09E7]={
+ adobename="onebengali",
category="nd",
description="BENGALI DIGIT ONE",
direction="l",
@@ -18642,6 +19504,7 @@ characters.data={
unicodeslot=0x09E7,
},
[0x09E8]={
+ adobename="twobengali",
category="nd",
description="BENGALI DIGIT TWO",
direction="l",
@@ -18649,6 +19512,7 @@ characters.data={
unicodeslot=0x09E8,
},
[0x09E9]={
+ adobename="threebengali",
category="nd",
description="BENGALI DIGIT THREE",
direction="l",
@@ -18656,6 +19520,7 @@ characters.data={
unicodeslot=0x09E9,
},
[0x09EA]={
+ adobename="fourbengali",
category="nd",
description="BENGALI DIGIT FOUR",
direction="l",
@@ -18663,6 +19528,7 @@ characters.data={
unicodeslot=0x09EA,
},
[0x09EB]={
+ adobename="fivebengali",
category="nd",
description="BENGALI DIGIT FIVE",
direction="l",
@@ -18670,6 +19536,7 @@ characters.data={
unicodeslot=0x09EB,
},
[0x09EC]={
+ adobename="sixbengali",
category="nd",
description="BENGALI DIGIT SIX",
direction="l",
@@ -18677,6 +19544,7 @@ characters.data={
unicodeslot=0x09EC,
},
[0x09ED]={
+ adobename="sevenbengali",
category="nd",
description="BENGALI DIGIT SEVEN",
direction="l",
@@ -18684,6 +19552,7 @@ characters.data={
unicodeslot=0x09ED,
},
[0x09EE]={
+ adobename="eightbengali",
category="nd",
description="BENGALI DIGIT EIGHT",
direction="l",
@@ -18691,6 +19560,7 @@ characters.data={
unicodeslot=0x09EE,
},
[0x09EF]={
+ adobename="ninebengali",
category="nd",
description="BENGALI DIGIT NINE",
direction="l",
@@ -18698,6 +19568,7 @@ characters.data={
unicodeslot=0x09EF,
},
[0x09F0]={
+ adobename="ramiddlediagonalbengali",
category="lo",
description="BENGALI LETTER RA WITH MIDDLE DIAGONAL",
direction="l",
@@ -18706,6 +19577,7 @@ characters.data={
unicodeslot=0x09F0,
},
[0x09F1]={
+ adobename="ralowerdiagonalbengali",
category="lo",
description="BENGALI LETTER RA WITH LOWER DIAGONAL",
direction="l",
@@ -18714,6 +19586,7 @@ characters.data={
unicodeslot=0x09F1,
},
[0x09F2]={
+ adobename="rupeemarkbengali",
category="sc",
description="BENGALI RUPEE MARK",
direction="et",
@@ -18721,6 +19594,7 @@ characters.data={
unicodeslot=0x09F2,
},
[0x09F3]={
+ adobename="rupeesignbengali",
category="sc",
description="BENGALI RUPEE SIGN",
direction="et",
@@ -18728,6 +19602,7 @@ characters.data={
unicodeslot=0x09F3,
},
[0x09F4]={
+ adobename="onenumeratorbengali",
category="no",
description="BENGALI CURRENCY NUMERATOR ONE",
direction="l",
@@ -18735,6 +19610,7 @@ characters.data={
unicodeslot=0x09F4,
},
[0x09F5]={
+ adobename="twonumeratorbengali",
category="no",
description="BENGALI CURRENCY NUMERATOR TWO",
direction="l",
@@ -18742,6 +19618,7 @@ characters.data={
unicodeslot=0x09F5,
},
[0x09F6]={
+ adobename="threenumeratorbengali",
category="no",
description="BENGALI CURRENCY NUMERATOR THREE",
direction="l",
@@ -18749,6 +19626,7 @@ characters.data={
unicodeslot=0x09F6,
},
[0x09F7]={
+ adobename="fournumeratorbengali",
category="no",
description="BENGALI CURRENCY NUMERATOR FOUR",
direction="l",
@@ -18756,6 +19634,7 @@ characters.data={
unicodeslot=0x09F7,
},
[0x09F8]={
+ adobename="denominatorminusonenumeratorbengali",
category="no",
description="BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR",
direction="l",
@@ -18763,6 +19642,7 @@ characters.data={
unicodeslot=0x09F8,
},
[0x09F9]={
+ adobename="sixteencurrencydenominatorbengali",
category="no",
description="BENGALI CURRENCY DENOMINATOR SIXTEEN",
direction="l",
@@ -18770,6 +19650,7 @@ characters.data={
unicodeslot=0x09F9,
},
[0x09FA]={
+ adobename="issharbengali",
category="so",
description="BENGALI ISSHAR",
direction="l",
@@ -18784,6 +19665,7 @@ characters.data={
unicodeslot=0x0A01,
},
[0x0A02]={
+ adobename="bindigurmukhi",
category="mn",
description="GURMUKHI SIGN BINDI",
direction="nsm",
@@ -18798,6 +19680,7 @@ characters.data={
unicodeslot=0x0A03,
},
[0x0A05]={
+ adobename="agurmukhi",
category="lo",
description="GURMUKHI LETTER A",
direction="l",
@@ -18805,6 +19688,7 @@ characters.data={
unicodeslot=0x0A05,
},
[0x0A06]={
+ adobename="aagurmukhi",
category="lo",
description="GURMUKHI LETTER AA",
direction="l",
@@ -18812,6 +19696,7 @@ characters.data={
unicodeslot=0x0A06,
},
[0x0A07]={
+ adobename="igurmukhi",
category="lo",
description="GURMUKHI LETTER I",
direction="l",
@@ -18819,6 +19704,7 @@ characters.data={
unicodeslot=0x0A07,
},
[0x0A08]={
+ adobename="iigurmukhi",
category="lo",
description="GURMUKHI LETTER II",
direction="l",
@@ -18826,6 +19712,7 @@ characters.data={
unicodeslot=0x0A08,
},
[0x0A09]={
+ adobename="ugurmukhi",
category="lo",
description="GURMUKHI LETTER U",
direction="l",
@@ -18833,6 +19720,7 @@ characters.data={
unicodeslot=0x0A09,
},
[0x0A0A]={
+ adobename="uugurmukhi",
category="lo",
description="GURMUKHI LETTER UU",
direction="l",
@@ -18840,6 +19728,7 @@ characters.data={
unicodeslot=0x0A0A,
},
[0x0A0F]={
+ adobename="eegurmukhi",
category="lo",
description="GURMUKHI LETTER EE",
direction="l",
@@ -18847,6 +19736,7 @@ characters.data={
unicodeslot=0x0A0F,
},
[0x0A10]={
+ adobename="aigurmukhi",
category="lo",
description="GURMUKHI LETTER AI",
direction="l",
@@ -18854,6 +19744,7 @@ characters.data={
unicodeslot=0x0A10,
},
[0x0A13]={
+ adobename="oogurmukhi",
category="lo",
description="GURMUKHI LETTER OO",
direction="l",
@@ -18861,6 +19752,7 @@ characters.data={
unicodeslot=0x0A13,
},
[0x0A14]={
+ adobename="augurmukhi",
category="lo",
description="GURMUKHI LETTER AU",
direction="l",
@@ -18868,6 +19760,7 @@ characters.data={
unicodeslot=0x0A14,
},
[0x0A15]={
+ adobename="kagurmukhi",
category="lo",
description="GURMUKHI LETTER KA",
direction="l",
@@ -18875,6 +19768,7 @@ characters.data={
unicodeslot=0x0A15,
},
[0x0A16]={
+ adobename="khagurmukhi",
category="lo",
description="GURMUKHI LETTER KHA",
direction="l",
@@ -18882,6 +19776,7 @@ characters.data={
unicodeslot=0x0A16,
},
[0x0A17]={
+ adobename="gagurmukhi",
category="lo",
description="GURMUKHI LETTER GA",
direction="l",
@@ -18889,6 +19784,7 @@ characters.data={
unicodeslot=0x0A17,
},
[0x0A18]={
+ adobename="ghagurmukhi",
category="lo",
description="GURMUKHI LETTER GHA",
direction="l",
@@ -18896,6 +19792,7 @@ characters.data={
unicodeslot=0x0A18,
},
[0x0A19]={
+ adobename="ngagurmukhi",
category="lo",
description="GURMUKHI LETTER NGA",
direction="l",
@@ -18903,6 +19800,7 @@ characters.data={
unicodeslot=0x0A19,
},
[0x0A1A]={
+ adobename="cagurmukhi",
category="lo",
description="GURMUKHI LETTER CA",
direction="l",
@@ -18910,6 +19808,7 @@ characters.data={
unicodeslot=0x0A1A,
},
[0x0A1B]={
+ adobename="chagurmukhi",
category="lo",
description="GURMUKHI LETTER CHA",
direction="l",
@@ -18917,6 +19816,7 @@ characters.data={
unicodeslot=0x0A1B,
},
[0x0A1C]={
+ adobename="jagurmukhi",
category="lo",
description="GURMUKHI LETTER JA",
direction="l",
@@ -18924,6 +19824,7 @@ characters.data={
unicodeslot=0x0A1C,
},
[0x0A1D]={
+ adobename="jhagurmukhi",
category="lo",
description="GURMUKHI LETTER JHA",
direction="l",
@@ -18931,6 +19832,7 @@ characters.data={
unicodeslot=0x0A1D,
},
[0x0A1E]={
+ adobename="nyagurmukhi",
category="lo",
description="GURMUKHI LETTER NYA",
direction="l",
@@ -18938,6 +19840,7 @@ characters.data={
unicodeslot=0x0A1E,
},
[0x0A1F]={
+ adobename="ttagurmukhi",
category="lo",
description="GURMUKHI LETTER TTA",
direction="l",
@@ -18945,6 +19848,7 @@ characters.data={
unicodeslot=0x0A1F,
},
[0x0A20]={
+ adobename="tthagurmukhi",
category="lo",
description="GURMUKHI LETTER TTHA",
direction="l",
@@ -18952,6 +19856,7 @@ characters.data={
unicodeslot=0x0A20,
},
[0x0A21]={
+ adobename="ddagurmukhi",
category="lo",
description="GURMUKHI LETTER DDA",
direction="l",
@@ -18959,6 +19864,7 @@ characters.data={
unicodeslot=0x0A21,
},
[0x0A22]={
+ adobename="ddhagurmukhi",
category="lo",
description="GURMUKHI LETTER DDHA",
direction="l",
@@ -18966,6 +19872,7 @@ characters.data={
unicodeslot=0x0A22,
},
[0x0A23]={
+ adobename="nnagurmukhi",
category="lo",
description="GURMUKHI LETTER NNA",
direction="l",
@@ -18973,6 +19880,7 @@ characters.data={
unicodeslot=0x0A23,
},
[0x0A24]={
+ adobename="tagurmukhi",
category="lo",
description="GURMUKHI LETTER TA",
direction="l",
@@ -18980,6 +19888,7 @@ characters.data={
unicodeslot=0x0A24,
},
[0x0A25]={
+ adobename="thagurmukhi",
category="lo",
description="GURMUKHI LETTER THA",
direction="l",
@@ -18987,6 +19896,7 @@ characters.data={
unicodeslot=0x0A25,
},
[0x0A26]={
+ adobename="dagurmukhi",
category="lo",
description="GURMUKHI LETTER DA",
direction="l",
@@ -18994,6 +19904,7 @@ characters.data={
unicodeslot=0x0A26,
},
[0x0A27]={
+ adobename="dhagurmukhi",
category="lo",
description="GURMUKHI LETTER DHA",
direction="l",
@@ -19001,6 +19912,7 @@ characters.data={
unicodeslot=0x0A27,
},
[0x0A28]={
+ adobename="nagurmukhi",
category="lo",
description="GURMUKHI LETTER NA",
direction="l",
@@ -19008,6 +19920,7 @@ characters.data={
unicodeslot=0x0A28,
},
[0x0A2A]={
+ adobename="pagurmukhi",
category="lo",
description="GURMUKHI LETTER PA",
direction="l",
@@ -19015,6 +19928,7 @@ characters.data={
unicodeslot=0x0A2A,
},
[0x0A2B]={
+ adobename="phagurmukhi",
category="lo",
description="GURMUKHI LETTER PHA",
direction="l",
@@ -19022,6 +19936,7 @@ characters.data={
unicodeslot=0x0A2B,
},
[0x0A2C]={
+ adobename="bagurmukhi",
category="lo",
description="GURMUKHI LETTER BA",
direction="l",
@@ -19029,6 +19944,7 @@ characters.data={
unicodeslot=0x0A2C,
},
[0x0A2D]={
+ adobename="bhagurmukhi",
category="lo",
description="GURMUKHI LETTER BHA",
direction="l",
@@ -19036,6 +19952,7 @@ characters.data={
unicodeslot=0x0A2D,
},
[0x0A2E]={
+ adobename="magurmukhi",
category="lo",
description="GURMUKHI LETTER MA",
direction="l",
@@ -19043,6 +19960,7 @@ characters.data={
unicodeslot=0x0A2E,
},
[0x0A2F]={
+ adobename="yagurmukhi",
category="lo",
description="GURMUKHI LETTER YA",
direction="l",
@@ -19050,6 +19968,7 @@ characters.data={
unicodeslot=0x0A2F,
},
[0x0A30]={
+ adobename="ragurmukhi",
category="lo",
description="GURMUKHI LETTER RA",
direction="l",
@@ -19057,6 +19976,7 @@ characters.data={
unicodeslot=0x0A30,
},
[0x0A32]={
+ adobename="lagurmukhi",
category="lo",
description="GURMUKHI LETTER LA",
direction="l",
@@ -19072,6 +19992,7 @@ characters.data={
unicodeslot=0x0A33,
},
[0x0A35]={
+ adobename="vagurmukhi",
category="lo",
description="GURMUKHI LETTER VA",
direction="l",
@@ -19079,6 +20000,7 @@ characters.data={
unicodeslot=0x0A35,
},
[0x0A36]={
+ adobename="shagurmukhi",
category="lo",
description="GURMUKHI LETTER SHA",
direction="l",
@@ -19087,6 +20009,7 @@ characters.data={
unicodeslot=0x0A36,
},
[0x0A38]={
+ adobename="sagurmukhi",
category="lo",
description="GURMUKHI LETTER SA",
direction="l",
@@ -19094,6 +20017,7 @@ characters.data={
unicodeslot=0x0A38,
},
[0x0A39]={
+ adobename="hagurmukhi",
category="lo",
description="GURMUKHI LETTER HA",
direction="l",
@@ -19101,6 +20025,7 @@ characters.data={
unicodeslot=0x0A39,
},
[0x0A3C]={
+ adobename="nuktagurmukhi",
category="mn",
description="GURMUKHI SIGN NUKTA",
direction="nsm",
@@ -19108,6 +20033,7 @@ characters.data={
unicodeslot=0x0A3C,
},
[0x0A3E]={
+ adobename="aamatragurmukhi",
category="mc",
description="GURMUKHI VOWEL SIGN AA",
direction="l",
@@ -19115,6 +20041,7 @@ characters.data={
unicodeslot=0x0A3E,
},
[0x0A3F]={
+ adobename="imatragurmukhi",
category="mc",
description="GURMUKHI VOWEL SIGN I",
direction="l",
@@ -19122,6 +20049,7 @@ characters.data={
unicodeslot=0x0A3F,
},
[0x0A40]={
+ adobename="iimatragurmukhi",
category="mc",
description="GURMUKHI VOWEL SIGN II",
direction="l",
@@ -19129,6 +20057,7 @@ characters.data={
unicodeslot=0x0A40,
},
[0x0A41]={
+ adobename="umatragurmukhi",
category="mn",
description="GURMUKHI VOWEL SIGN U",
direction="nsm",
@@ -19136,6 +20065,7 @@ characters.data={
unicodeslot=0x0A41,
},
[0x0A42]={
+ adobename="uumatragurmukhi",
category="mn",
description="GURMUKHI VOWEL SIGN UU",
direction="nsm",
@@ -19143,6 +20073,7 @@ characters.data={
unicodeslot=0x0A42,
},
[0x0A47]={
+ adobename="eematragurmukhi",
category="mn",
description="GURMUKHI VOWEL SIGN EE",
direction="nsm",
@@ -19150,6 +20081,7 @@ characters.data={
unicodeslot=0x0A47,
},
[0x0A48]={
+ adobename="aimatragurmukhi",
category="mn",
description="GURMUKHI VOWEL SIGN AI",
direction="nsm",
@@ -19157,6 +20089,7 @@ characters.data={
unicodeslot=0x0A48,
},
[0x0A4B]={
+ adobename="oomatragurmukhi",
category="mn",
description="GURMUKHI VOWEL SIGN OO",
direction="nsm",
@@ -19164,6 +20097,7 @@ characters.data={
unicodeslot=0x0A4B,
},
[0x0A4C]={
+ adobename="aumatragurmukhi",
category="mn",
description="GURMUKHI VOWEL SIGN AU",
direction="nsm",
@@ -19171,6 +20105,7 @@ characters.data={
unicodeslot=0x0A4C,
},
[0x0A4D]={
+ adobename="halantgurmukhi",
category="mn",
description="GURMUKHI SIGN VIRAMA",
direction="nsm",
@@ -19178,6 +20113,7 @@ characters.data={
unicodeslot=0x0A4D,
},
[0x0A59]={
+ adobename="khhagurmukhi",
category="lo",
description="GURMUKHI LETTER KHHA",
direction="l",
@@ -19186,6 +20122,7 @@ characters.data={
unicodeslot=0x0A59,
},
[0x0A5A]={
+ adobename="ghhagurmukhi",
category="lo",
description="GURMUKHI LETTER GHHA",
direction="l",
@@ -19194,6 +20131,7 @@ characters.data={
unicodeslot=0x0A5A,
},
[0x0A5B]={
+ adobename="zagurmukhi",
category="lo",
description="GURMUKHI LETTER ZA",
direction="l",
@@ -19202,6 +20140,7 @@ characters.data={
unicodeslot=0x0A5B,
},
[0x0A5C]={
+ adobename="rragurmukhi",
category="lo",
description="GURMUKHI LETTER RRA",
direction="l",
@@ -19209,6 +20148,7 @@ characters.data={
unicodeslot=0x0A5C,
},
[0x0A5E]={
+ adobename="fagurmukhi",
category="lo",
description="GURMUKHI LETTER FA",
direction="l",
@@ -19217,6 +20157,7 @@ characters.data={
unicodeslot=0x0A5E,
},
[0x0A66]={
+ adobename="zerogurmukhi",
category="nd",
description="GURMUKHI DIGIT ZERO",
direction="l",
@@ -19224,6 +20165,7 @@ characters.data={
unicodeslot=0x0A66,
},
[0x0A67]={
+ adobename="onegurmukhi",
category="nd",
description="GURMUKHI DIGIT ONE",
direction="l",
@@ -19231,6 +20173,7 @@ characters.data={
unicodeslot=0x0A67,
},
[0x0A68]={
+ adobename="twogurmukhi",
category="nd",
description="GURMUKHI DIGIT TWO",
direction="l",
@@ -19238,6 +20181,7 @@ characters.data={
unicodeslot=0x0A68,
},
[0x0A69]={
+ adobename="threegurmukhi",
category="nd",
description="GURMUKHI DIGIT THREE",
direction="l",
@@ -19245,6 +20189,7 @@ characters.data={
unicodeslot=0x0A69,
},
[0x0A6A]={
+ adobename="fourgurmukhi",
category="nd",
description="GURMUKHI DIGIT FOUR",
direction="l",
@@ -19252,6 +20197,7 @@ characters.data={
unicodeslot=0x0A6A,
},
[0x0A6B]={
+ adobename="fivegurmukhi",
category="nd",
description="GURMUKHI DIGIT FIVE",
direction="l",
@@ -19259,6 +20205,7 @@ characters.data={
unicodeslot=0x0A6B,
},
[0x0A6C]={
+ adobename="sixgurmukhi",
category="nd",
description="GURMUKHI DIGIT SIX",
direction="l",
@@ -19266,6 +20213,7 @@ characters.data={
unicodeslot=0x0A6C,
},
[0x0A6D]={
+ adobename="sevengurmukhi",
category="nd",
description="GURMUKHI DIGIT SEVEN",
direction="l",
@@ -19273,6 +20221,7 @@ characters.data={
unicodeslot=0x0A6D,
},
[0x0A6E]={
+ adobename="eightgurmukhi",
category="nd",
description="GURMUKHI DIGIT EIGHT",
direction="l",
@@ -19280,6 +20229,7 @@ characters.data={
unicodeslot=0x0A6E,
},
[0x0A6F]={
+ adobename="ninegurmukhi",
category="nd",
description="GURMUKHI DIGIT NINE",
direction="l",
@@ -19287,6 +20237,7 @@ characters.data={
unicodeslot=0x0A6F,
},
[0x0A70]={
+ adobename="tippigurmukhi",
category="mn",
description="GURMUKHI TIPPI",
direction="nsm",
@@ -19294,6 +20245,7 @@ characters.data={
unicodeslot=0x0A70,
},
[0x0A71]={
+ adobename="addakgurmukhi",
category="mn",
description="GURMUKHI ADDAK",
direction="nsm",
@@ -19301,6 +20253,7 @@ characters.data={
unicodeslot=0x0A71,
},
[0x0A72]={
+ adobename="irigurmukhi",
category="lo",
description="GURMUKHI IRI",
direction="l",
@@ -19308,6 +20261,7 @@ characters.data={
unicodeslot=0x0A72,
},
[0x0A73]={
+ adobename="uragurmukhi",
category="lo",
description="GURMUKHI URA",
direction="l",
@@ -19315,6 +20269,7 @@ characters.data={
unicodeslot=0x0A73,
},
[0x0A74]={
+ adobename="ekonkargurmukhi",
category="lo",
description="GURMUKHI EK ONKAR",
direction="l",
@@ -19322,6 +20277,7 @@ characters.data={
unicodeslot=0x0A74,
},
[0x0A81]={
+ adobename="candrabindugujarati",
category="mn",
description="GUJARATI SIGN CANDRABINDU",
direction="nsm",
@@ -19329,6 +20285,7 @@ characters.data={
unicodeslot=0x0A81,
},
[0x0A82]={
+ adobename="anusvaragujarati",
category="mn",
description="GUJARATI SIGN ANUSVARA",
direction="nsm",
@@ -19336,6 +20293,7 @@ characters.data={
unicodeslot=0x0A82,
},
[0x0A83]={
+ adobename="visargagujarati",
category="mc",
description="GUJARATI SIGN VISARGA",
direction="l",
@@ -19343,6 +20301,7 @@ characters.data={
unicodeslot=0x0A83,
},
[0x0A85]={
+ adobename="agujarati",
category="lo",
description="GUJARATI LETTER A",
direction="l",
@@ -19350,6 +20309,7 @@ characters.data={
unicodeslot=0x0A85,
},
[0x0A86]={
+ adobename="aagujarati",
category="lo",
description="GUJARATI LETTER AA",
direction="l",
@@ -19357,6 +20317,7 @@ characters.data={
unicodeslot=0x0A86,
},
[0x0A87]={
+ adobename="igujarati",
category="lo",
description="GUJARATI LETTER I",
direction="l",
@@ -19364,6 +20325,7 @@ characters.data={
unicodeslot=0x0A87,
},
[0x0A88]={
+ adobename="iigujarati",
category="lo",
description="GUJARATI LETTER II",
direction="l",
@@ -19371,6 +20333,7 @@ characters.data={
unicodeslot=0x0A88,
},
[0x0A89]={
+ adobename="ugujarati",
category="lo",
description="GUJARATI LETTER U",
direction="l",
@@ -19378,6 +20341,7 @@ characters.data={
unicodeslot=0x0A89,
},
[0x0A8A]={
+ adobename="uugujarati",
category="lo",
description="GUJARATI LETTER UU",
direction="l",
@@ -19385,6 +20349,7 @@ characters.data={
unicodeslot=0x0A8A,
},
[0x0A8B]={
+ adobename="rvocalicgujarati",
category="lo",
description="GUJARATI LETTER VOCALIC R",
direction="l",
@@ -19399,6 +20364,7 @@ characters.data={
unicodeslot=0x0A8C,
},
[0x0A8D]={
+ adobename="ecandragujarati",
category="lo",
description="GUJARATI VOWEL CANDRA E",
direction="l",
@@ -19406,6 +20372,7 @@ characters.data={
unicodeslot=0x0A8D,
},
[0x0A8F]={
+ adobename="egujarati",
category="lo",
description="GUJARATI LETTER E",
direction="l",
@@ -19413,6 +20380,7 @@ characters.data={
unicodeslot=0x0A8F,
},
[0x0A90]={
+ adobename="aigujarati",
category="lo",
description="GUJARATI LETTER AI",
direction="l",
@@ -19420,6 +20388,7 @@ characters.data={
unicodeslot=0x0A90,
},
[0x0A91]={
+ adobename="ocandragujarati",
category="lo",
description="GUJARATI VOWEL CANDRA O",
direction="l",
@@ -19427,6 +20396,7 @@ characters.data={
unicodeslot=0x0A91,
},
[0x0A93]={
+ adobename="ogujarati",
category="lo",
description="GUJARATI LETTER O",
direction="l",
@@ -19434,6 +20404,7 @@ characters.data={
unicodeslot=0x0A93,
},
[0x0A94]={
+ adobename="augujarati",
category="lo",
description="GUJARATI LETTER AU",
direction="l",
@@ -19441,6 +20412,7 @@ characters.data={
unicodeslot=0x0A94,
},
[0x0A95]={
+ adobename="kagujarati",
category="lo",
description="GUJARATI LETTER KA",
direction="l",
@@ -19448,6 +20420,7 @@ characters.data={
unicodeslot=0x0A95,
},
[0x0A96]={
+ adobename="khagujarati",
category="lo",
description="GUJARATI LETTER KHA",
direction="l",
@@ -19455,6 +20428,7 @@ characters.data={
unicodeslot=0x0A96,
},
[0x0A97]={
+ adobename="gagujarati",
category="lo",
description="GUJARATI LETTER GA",
direction="l",
@@ -19462,6 +20436,7 @@ characters.data={
unicodeslot=0x0A97,
},
[0x0A98]={
+ adobename="ghagujarati",
category="lo",
description="GUJARATI LETTER GHA",
direction="l",
@@ -19469,6 +20444,7 @@ characters.data={
unicodeslot=0x0A98,
},
[0x0A99]={
+ adobename="ngagujarati",
category="lo",
description="GUJARATI LETTER NGA",
direction="l",
@@ -19476,6 +20452,7 @@ characters.data={
unicodeslot=0x0A99,
},
[0x0A9A]={
+ adobename="cagujarati",
category="lo",
description="GUJARATI LETTER CA",
direction="l",
@@ -19483,6 +20460,7 @@ characters.data={
unicodeslot=0x0A9A,
},
[0x0A9B]={
+ adobename="chagujarati",
category="lo",
description="GUJARATI LETTER CHA",
direction="l",
@@ -19490,6 +20468,7 @@ characters.data={
unicodeslot=0x0A9B,
},
[0x0A9C]={
+ adobename="jagujarati",
category="lo",
description="GUJARATI LETTER JA",
direction="l",
@@ -19497,6 +20476,7 @@ characters.data={
unicodeslot=0x0A9C,
},
[0x0A9D]={
+ adobename="jhagujarati",
category="lo",
description="GUJARATI LETTER JHA",
direction="l",
@@ -19504,6 +20484,7 @@ characters.data={
unicodeslot=0x0A9D,
},
[0x0A9E]={
+ adobename="nyagujarati",
category="lo",
description="GUJARATI LETTER NYA",
direction="l",
@@ -19511,6 +20492,7 @@ characters.data={
unicodeslot=0x0A9E,
},
[0x0A9F]={
+ adobename="ttagujarati",
category="lo",
description="GUJARATI LETTER TTA",
direction="l",
@@ -19518,6 +20500,7 @@ characters.data={
unicodeslot=0x0A9F,
},
[0x0AA0]={
+ adobename="tthagujarati",
category="lo",
description="GUJARATI LETTER TTHA",
direction="l",
@@ -19525,6 +20508,7 @@ characters.data={
unicodeslot=0x0AA0,
},
[0x0AA1]={
+ adobename="ddagujarati",
category="lo",
description="GUJARATI LETTER DDA",
direction="l",
@@ -19532,6 +20516,7 @@ characters.data={
unicodeslot=0x0AA1,
},
[0x0AA2]={
+ adobename="ddhagujarati",
category="lo",
description="GUJARATI LETTER DDHA",
direction="l",
@@ -19539,6 +20524,7 @@ characters.data={
unicodeslot=0x0AA2,
},
[0x0AA3]={
+ adobename="nnagujarati",
category="lo",
description="GUJARATI LETTER NNA",
direction="l",
@@ -19546,6 +20532,7 @@ characters.data={
unicodeslot=0x0AA3,
},
[0x0AA4]={
+ adobename="tagujarati",
category="lo",
description="GUJARATI LETTER TA",
direction="l",
@@ -19553,6 +20540,7 @@ characters.data={
unicodeslot=0x0AA4,
},
[0x0AA5]={
+ adobename="thagujarati",
category="lo",
description="GUJARATI LETTER THA",
direction="l",
@@ -19560,6 +20548,7 @@ characters.data={
unicodeslot=0x0AA5,
},
[0x0AA6]={
+ adobename="dagujarati",
category="lo",
description="GUJARATI LETTER DA",
direction="l",
@@ -19567,6 +20556,7 @@ characters.data={
unicodeslot=0x0AA6,
},
[0x0AA7]={
+ adobename="dhagujarati",
category="lo",
description="GUJARATI LETTER DHA",
direction="l",
@@ -19574,6 +20564,7 @@ characters.data={
unicodeslot=0x0AA7,
},
[0x0AA8]={
+ adobename="nagujarati",
category="lo",
description="GUJARATI LETTER NA",
direction="l",
@@ -19581,6 +20572,7 @@ characters.data={
unicodeslot=0x0AA8,
},
[0x0AAA]={
+ adobename="pagujarati",
category="lo",
description="GUJARATI LETTER PA",
direction="l",
@@ -19588,6 +20580,7 @@ characters.data={
unicodeslot=0x0AAA,
},
[0x0AAB]={
+ adobename="phagujarati",
category="lo",
description="GUJARATI LETTER PHA",
direction="l",
@@ -19595,6 +20588,7 @@ characters.data={
unicodeslot=0x0AAB,
},
[0x0AAC]={
+ adobename="bagujarati",
category="lo",
description="GUJARATI LETTER BA",
direction="l",
@@ -19602,6 +20596,7 @@ characters.data={
unicodeslot=0x0AAC,
},
[0x0AAD]={
+ adobename="bhagujarati",
category="lo",
description="GUJARATI LETTER BHA",
direction="l",
@@ -19609,6 +20604,7 @@ characters.data={
unicodeslot=0x0AAD,
},
[0x0AAE]={
+ adobename="magujarati",
category="lo",
description="GUJARATI LETTER MA",
direction="l",
@@ -19616,6 +20612,7 @@ characters.data={
unicodeslot=0x0AAE,
},
[0x0AAF]={
+ adobename="yagujarati",
category="lo",
description="GUJARATI LETTER YA",
direction="l",
@@ -19623,6 +20620,7 @@ characters.data={
unicodeslot=0x0AAF,
},
[0x0AB0]={
+ adobename="ragujarati",
category="lo",
description="GUJARATI LETTER RA",
direction="l",
@@ -19630,6 +20628,7 @@ characters.data={
unicodeslot=0x0AB0,
},
[0x0AB2]={
+ adobename="lagujarati",
category="lo",
description="GUJARATI LETTER LA",
direction="l",
@@ -19637,6 +20636,7 @@ characters.data={
unicodeslot=0x0AB2,
},
[0x0AB3]={
+ adobename="llagujarati",
category="lo",
description="GUJARATI LETTER LLA",
direction="l",
@@ -19644,6 +20644,7 @@ characters.data={
unicodeslot=0x0AB3,
},
[0x0AB5]={
+ adobename="vagujarati",
category="lo",
description="GUJARATI LETTER VA",
direction="l",
@@ -19651,6 +20652,7 @@ characters.data={
unicodeslot=0x0AB5,
},
[0x0AB6]={
+ adobename="shagujarati",
category="lo",
description="GUJARATI LETTER SHA",
direction="l",
@@ -19658,6 +20660,7 @@ characters.data={
unicodeslot=0x0AB6,
},
[0x0AB7]={
+ adobename="ssagujarati",
category="lo",
description="GUJARATI LETTER SSA",
direction="l",
@@ -19665,6 +20668,7 @@ characters.data={
unicodeslot=0x0AB7,
},
[0x0AB8]={
+ adobename="sagujarati",
category="lo",
description="GUJARATI LETTER SA",
direction="l",
@@ -19672,6 +20676,7 @@ characters.data={
unicodeslot=0x0AB8,
},
[0x0AB9]={
+ adobename="hagujarati",
category="lo",
description="GUJARATI LETTER HA",
direction="l",
@@ -19679,6 +20684,7 @@ characters.data={
unicodeslot=0x0AB9,
},
[0x0ABC]={
+ adobename="nuktagujarati",
category="mn",
description="GUJARATI SIGN NUKTA",
direction="nsm",
@@ -19693,6 +20699,7 @@ characters.data={
unicodeslot=0x0ABD,
},
[0x0ABE]={
+ adobename="aavowelsigngujarati",
category="mc",
description="GUJARATI VOWEL SIGN AA",
direction="l",
@@ -19700,6 +20707,7 @@ characters.data={
unicodeslot=0x0ABE,
},
[0x0ABF]={
+ adobename="ivowelsigngujarati",
category="mc",
description="GUJARATI VOWEL SIGN I",
direction="l",
@@ -19707,6 +20715,7 @@ characters.data={
unicodeslot=0x0ABF,
},
[0x0AC0]={
+ adobename="iivowelsigngujarati",
category="mc",
description="GUJARATI VOWEL SIGN II",
direction="l",
@@ -19714,6 +20723,7 @@ characters.data={
unicodeslot=0x0AC0,
},
[0x0AC1]={
+ adobename="uvowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN U",
direction="nsm",
@@ -19721,6 +20731,7 @@ characters.data={
unicodeslot=0x0AC1,
},
[0x0AC2]={
+ adobename="uuvowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN UU",
direction="nsm",
@@ -19728,6 +20739,7 @@ characters.data={
unicodeslot=0x0AC2,
},
[0x0AC3]={
+ adobename="rvocalicvowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN VOCALIC R",
direction="nsm",
@@ -19735,6 +20747,7 @@ characters.data={
unicodeslot=0x0AC3,
},
[0x0AC4]={
+ adobename="rrvocalicvowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN VOCALIC RR",
direction="nsm",
@@ -19742,6 +20755,7 @@ characters.data={
unicodeslot=0x0AC4,
},
[0x0AC5]={
+ adobename="ecandravowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN CANDRA E",
direction="nsm",
@@ -19749,6 +20763,7 @@ characters.data={
unicodeslot=0x0AC5,
},
[0x0AC7]={
+ adobename="evowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN E",
direction="nsm",
@@ -19756,6 +20771,7 @@ characters.data={
unicodeslot=0x0AC7,
},
[0x0AC8]={
+ adobename="aivowelsigngujarati",
category="mn",
description="GUJARATI VOWEL SIGN AI",
direction="nsm",
@@ -19763,6 +20779,7 @@ characters.data={
unicodeslot=0x0AC8,
},
[0x0AC9]={
+ adobename="ocandravowelsigngujarati",
category="mc",
description="GUJARATI VOWEL SIGN CANDRA O",
direction="l",
@@ -19770,6 +20787,7 @@ characters.data={
unicodeslot=0x0AC9,
},
[0x0ACB]={
+ adobename="ovowelsigngujarati",
category="mc",
description="GUJARATI VOWEL SIGN O",
direction="l",
@@ -19777,6 +20795,7 @@ characters.data={
unicodeslot=0x0ACB,
},
[0x0ACC]={
+ adobename="auvowelsigngujarati",
category="mc",
description="GUJARATI VOWEL SIGN AU",
direction="l",
@@ -19784,6 +20803,7 @@ characters.data={
unicodeslot=0x0ACC,
},
[0x0ACD]={
+ adobename="viramagujarati",
category="mn",
description="GUJARATI SIGN VIRAMA",
direction="nsm",
@@ -19791,6 +20811,7 @@ characters.data={
unicodeslot=0x0ACD,
},
[0x0AD0]={
+ adobename="omgujarati",
category="lo",
description="GUJARATI OM",
direction="l",
@@ -19798,6 +20819,7 @@ characters.data={
unicodeslot=0x0AD0,
},
[0x0AE0]={
+ adobename="rrvocalicgujarati",
category="lo",
description="GUJARATI LETTER VOCALIC RR",
direction="l",
@@ -19826,6 +20848,7 @@ characters.data={
unicodeslot=0x0AE3,
},
[0x0AE6]={
+ adobename="zerogujarati",
category="nd",
description="GUJARATI DIGIT ZERO",
direction="l",
@@ -19833,6 +20856,7 @@ characters.data={
unicodeslot=0x0AE6,
},
[0x0AE7]={
+ adobename="onegujarati",
category="nd",
description="GUJARATI DIGIT ONE",
direction="l",
@@ -19840,6 +20864,7 @@ characters.data={
unicodeslot=0x0AE7,
},
[0x0AE8]={
+ adobename="twogujarati",
category="nd",
description="GUJARATI DIGIT TWO",
direction="l",
@@ -19847,6 +20872,7 @@ characters.data={
unicodeslot=0x0AE8,
},
[0x0AE9]={
+ adobename="threegujarati",
category="nd",
description="GUJARATI DIGIT THREE",
direction="l",
@@ -19854,6 +20880,7 @@ characters.data={
unicodeslot=0x0AE9,
},
[0x0AEA]={
+ adobename="fourgujarati",
category="nd",
description="GUJARATI DIGIT FOUR",
direction="l",
@@ -19861,6 +20888,7 @@ characters.data={
unicodeslot=0x0AEA,
},
[0x0AEB]={
+ adobename="fivegujarati",
category="nd",
description="GUJARATI DIGIT FIVE",
direction="l",
@@ -19868,6 +20896,7 @@ characters.data={
unicodeslot=0x0AEB,
},
[0x0AEC]={
+ adobename="sixgujarati",
category="nd",
description="GUJARATI DIGIT SIX",
direction="l",
@@ -19875,6 +20904,7 @@ characters.data={
unicodeslot=0x0AEC,
},
[0x0AED]={
+ adobename="sevengujarati",
category="nd",
description="GUJARATI DIGIT SEVEN",
direction="l",
@@ -19882,6 +20912,7 @@ characters.data={
unicodeslot=0x0AED,
},
[0x0AEE]={
+ adobename="eightgujarati",
category="nd",
description="GUJARATI DIGIT EIGHT",
direction="l",
@@ -19889,6 +20920,7 @@ characters.data={
unicodeslot=0x0AEE,
},
[0x0AEF]={
+ adobename="ninegujarati",
category="nd",
description="GUJARATI DIGIT NINE",
direction="l",
@@ -23257,6 +24289,7 @@ characters.data={
unicodeslot=0x0DF4,
},
[0x0E01]={
+ adobename="kokaithai",
category="lo",
description="THAI CHARACTER KO KAI",
direction="l",
@@ -23264,6 +24297,7 @@ characters.data={
unicodeslot=0x0E01,
},
[0x0E02]={
+ adobename="khokhaithai",
category="lo",
description="THAI CHARACTER KHO KHAI",
direction="l",
@@ -23271,6 +24305,7 @@ characters.data={
unicodeslot=0x0E02,
},
[0x0E03]={
+ adobename="khokhuatthai",
category="lo",
description="THAI CHARACTER KHO KHUAT",
direction="l",
@@ -23278,6 +24313,7 @@ characters.data={
unicodeslot=0x0E03,
},
[0x0E04]={
+ adobename="khokhwaithai",
category="lo",
description="THAI CHARACTER KHO KHWAI",
direction="l",
@@ -23285,6 +24321,7 @@ characters.data={
unicodeslot=0x0E04,
},
[0x0E05]={
+ adobename="khokhonthai",
category="lo",
description="THAI CHARACTER KHO KHON",
direction="l",
@@ -23292,6 +24329,7 @@ characters.data={
unicodeslot=0x0E05,
},
[0x0E06]={
+ adobename="khorakhangthai",
category="lo",
description="THAI CHARACTER KHO RAKHANG",
direction="l",
@@ -23299,6 +24337,7 @@ characters.data={
unicodeslot=0x0E06,
},
[0x0E07]={
+ adobename="ngonguthai",
category="lo",
description="THAI CHARACTER NGO NGU",
direction="l",
@@ -23306,6 +24345,7 @@ characters.data={
unicodeslot=0x0E07,
},
[0x0E08]={
+ adobename="chochanthai",
category="lo",
description="THAI CHARACTER CHO CHAN",
direction="l",
@@ -23313,6 +24353,7 @@ characters.data={
unicodeslot=0x0E08,
},
[0x0E09]={
+ adobename="chochingthai",
category="lo",
description="THAI CHARACTER CHO CHING",
direction="l",
@@ -23320,6 +24361,7 @@ characters.data={
unicodeslot=0x0E09,
},
[0x0E0A]={
+ adobename="chochangthai",
category="lo",
description="THAI CHARACTER CHO CHANG",
direction="l",
@@ -23327,6 +24369,7 @@ characters.data={
unicodeslot=0x0E0A,
},
[0x0E0B]={
+ adobename="sosothai",
category="lo",
description="THAI CHARACTER SO SO",
direction="l",
@@ -23334,6 +24377,7 @@ characters.data={
unicodeslot=0x0E0B,
},
[0x0E0C]={
+ adobename="chochoethai",
category="lo",
description="THAI CHARACTER CHO CHOE",
direction="l",
@@ -23341,6 +24385,7 @@ characters.data={
unicodeslot=0x0E0C,
},
[0x0E0D]={
+ adobename="yoyingthai",
category="lo",
description="THAI CHARACTER YO YING",
direction="l",
@@ -23348,6 +24393,7 @@ characters.data={
unicodeslot=0x0E0D,
},
[0x0E0E]={
+ adobename="dochadathai",
category="lo",
description="THAI CHARACTER DO CHADA",
direction="l",
@@ -23355,6 +24401,7 @@ characters.data={
unicodeslot=0x0E0E,
},
[0x0E0F]={
+ adobename="topatakthai",
category="lo",
description="THAI CHARACTER TO PATAK",
direction="l",
@@ -23362,6 +24409,7 @@ characters.data={
unicodeslot=0x0E0F,
},
[0x0E10]={
+ adobename="thothanthai",
category="lo",
description="THAI CHARACTER THO THAN",
direction="l",
@@ -23369,6 +24417,7 @@ characters.data={
unicodeslot=0x0E10,
},
[0x0E11]={
+ adobename="thonangmonthothai",
category="lo",
description="THAI CHARACTER THO NANGMONTHO",
direction="l",
@@ -23376,6 +24425,7 @@ characters.data={
unicodeslot=0x0E11,
},
[0x0E12]={
+ adobename="thophuthaothai",
category="lo",
description="THAI CHARACTER THO PHUTHAO",
direction="l",
@@ -23383,6 +24433,7 @@ characters.data={
unicodeslot=0x0E12,
},
[0x0E13]={
+ adobename="nonenthai",
category="lo",
description="THAI CHARACTER NO NEN",
direction="l",
@@ -23390,6 +24441,7 @@ characters.data={
unicodeslot=0x0E13,
},
[0x0E14]={
+ adobename="dodekthai",
category="lo",
description="THAI CHARACTER DO DEK",
direction="l",
@@ -23397,6 +24449,7 @@ characters.data={
unicodeslot=0x0E14,
},
[0x0E15]={
+ adobename="totaothai",
category="lo",
description="THAI CHARACTER TO TAO",
direction="l",
@@ -23404,6 +24457,7 @@ characters.data={
unicodeslot=0x0E15,
},
[0x0E16]={
+ adobename="thothungthai",
category="lo",
description="THAI CHARACTER THO THUNG",
direction="l",
@@ -23411,6 +24465,7 @@ characters.data={
unicodeslot=0x0E16,
},
[0x0E17]={
+ adobename="thothahanthai",
category="lo",
description="THAI CHARACTER THO THAHAN",
direction="l",
@@ -23418,6 +24473,7 @@ characters.data={
unicodeslot=0x0E17,
},
[0x0E18]={
+ adobename="thothongthai",
category="lo",
description="THAI CHARACTER THO THONG",
direction="l",
@@ -23425,6 +24481,7 @@ characters.data={
unicodeslot=0x0E18,
},
[0x0E19]={
+ adobename="nonuthai",
category="lo",
description="THAI CHARACTER NO NU",
direction="l",
@@ -23432,6 +24489,7 @@ characters.data={
unicodeslot=0x0E19,
},
[0x0E1A]={
+ adobename="bobaimaithai",
category="lo",
description="THAI CHARACTER BO BAIMAI",
direction="l",
@@ -23439,6 +24497,7 @@ characters.data={
unicodeslot=0x0E1A,
},
[0x0E1B]={
+ adobename="poplathai",
category="lo",
description="THAI CHARACTER PO PLA",
direction="l",
@@ -23446,6 +24505,7 @@ characters.data={
unicodeslot=0x0E1B,
},
[0x0E1C]={
+ adobename="phophungthai",
category="lo",
description="THAI CHARACTER PHO PHUNG",
direction="l",
@@ -23453,6 +24513,7 @@ characters.data={
unicodeslot=0x0E1C,
},
[0x0E1D]={
+ adobename="fofathai",
category="lo",
description="THAI CHARACTER FO FA",
direction="l",
@@ -23460,6 +24521,7 @@ characters.data={
unicodeslot=0x0E1D,
},
[0x0E1E]={
+ adobename="phophanthai",
category="lo",
description="THAI CHARACTER PHO PHAN",
direction="l",
@@ -23467,6 +24529,7 @@ characters.data={
unicodeslot=0x0E1E,
},
[0x0E1F]={
+ adobename="fofanthai",
category="lo",
description="THAI CHARACTER FO FAN",
direction="l",
@@ -23474,6 +24537,7 @@ characters.data={
unicodeslot=0x0E1F,
},
[0x0E20]={
+ adobename="phosamphaothai",
category="lo",
description="THAI CHARACTER PHO SAMPHAO",
direction="l",
@@ -23481,6 +24545,7 @@ characters.data={
unicodeslot=0x0E20,
},
[0x0E21]={
+ adobename="momathai",
category="lo",
description="THAI CHARACTER MO MA",
direction="l",
@@ -23488,6 +24553,7 @@ characters.data={
unicodeslot=0x0E21,
},
[0x0E22]={
+ adobename="yoyakthai",
category="lo",
description="THAI CHARACTER YO YAK",
direction="l",
@@ -23495,6 +24561,7 @@ characters.data={
unicodeslot=0x0E22,
},
[0x0E23]={
+ adobename="roruathai",
category="lo",
description="THAI CHARACTER RO RUA",
direction="l",
@@ -23502,6 +24569,7 @@ characters.data={
unicodeslot=0x0E23,
},
[0x0E24]={
+ adobename="ruthai",
category="lo",
description="THAI CHARACTER RU",
direction="l",
@@ -23509,6 +24577,7 @@ characters.data={
unicodeslot=0x0E24,
},
[0x0E25]={
+ adobename="lolingthai",
category="lo",
description="THAI CHARACTER LO LING",
direction="l",
@@ -23516,6 +24585,7 @@ characters.data={
unicodeslot=0x0E25,
},
[0x0E26]={
+ adobename="luthai",
category="lo",
description="THAI CHARACTER LU",
direction="l",
@@ -23523,6 +24593,7 @@ characters.data={
unicodeslot=0x0E26,
},
[0x0E27]={
+ adobename="wowaenthai",
category="lo",
description="THAI CHARACTER WO WAEN",
direction="l",
@@ -23530,6 +24601,7 @@ characters.data={
unicodeslot=0x0E27,
},
[0x0E28]={
+ adobename="sosalathai",
category="lo",
description="THAI CHARACTER SO SALA",
direction="l",
@@ -23537,6 +24609,7 @@ characters.data={
unicodeslot=0x0E28,
},
[0x0E29]={
+ adobename="sorusithai",
category="lo",
description="THAI CHARACTER SO RUSI",
direction="l",
@@ -23544,6 +24617,7 @@ characters.data={
unicodeslot=0x0E29,
},
[0x0E2A]={
+ adobename="sosuathai",
category="lo",
description="THAI CHARACTER SO SUA",
direction="l",
@@ -23551,6 +24625,7 @@ characters.data={
unicodeslot=0x0E2A,
},
[0x0E2B]={
+ adobename="hohipthai",
category="lo",
description="THAI CHARACTER HO HIP",
direction="l",
@@ -23558,6 +24633,7 @@ characters.data={
unicodeslot=0x0E2B,
},
[0x0E2C]={
+ adobename="lochulathai",
category="lo",
description="THAI CHARACTER LO CHULA",
direction="l",
@@ -23565,6 +24641,7 @@ characters.data={
unicodeslot=0x0E2C,
},
[0x0E2D]={
+ adobename="oangthai",
category="lo",
description="THAI CHARACTER O ANG",
direction="l",
@@ -23572,6 +24649,7 @@ characters.data={
unicodeslot=0x0E2D,
},
[0x0E2E]={
+ adobename="honokhukthai",
category="lo",
description="THAI CHARACTER HO NOKHUK",
direction="l",
@@ -23579,6 +24657,7 @@ characters.data={
unicodeslot=0x0E2E,
},
[0x0E2F]={
+ adobename="paiyannoithai",
category="lo",
description="THAI CHARACTER PAIYANNOI",
direction="l",
@@ -23586,6 +24665,7 @@ characters.data={
unicodeslot=0x0E2F,
},
[0x0E30]={
+ adobename="saraathai",
category="lo",
description="THAI CHARACTER SARA A",
direction="l",
@@ -23593,6 +24673,7 @@ characters.data={
unicodeslot=0x0E30,
},
[0x0E31]={
+ adobename="maihanakatthai",
category="mn",
description="THAI CHARACTER MAI HAN-AKAT",
direction="nsm",
@@ -23600,6 +24681,7 @@ characters.data={
unicodeslot=0x0E31,
},
[0x0E32]={
+ adobename="saraaathai",
category="lo",
description="THAI CHARACTER SARA AA",
direction="l",
@@ -23607,6 +24689,7 @@ characters.data={
unicodeslot=0x0E32,
},
[0x0E33]={
+ adobename="saraamthai",
category="lo",
description="THAI CHARACTER SARA AM",
direction="l",
@@ -23615,6 +24698,7 @@ characters.data={
unicodeslot=0x0E33,
},
[0x0E34]={
+ adobename="saraithai",
category="mn",
description="THAI CHARACTER SARA I",
direction="nsm",
@@ -23622,6 +24706,7 @@ characters.data={
unicodeslot=0x0E34,
},
[0x0E35]={
+ adobename="saraiithai",
category="mn",
description="THAI CHARACTER SARA II",
direction="nsm",
@@ -23629,6 +24714,7 @@ characters.data={
unicodeslot=0x0E35,
},
[0x0E36]={
+ adobename="sarauethai",
category="mn",
description="THAI CHARACTER SARA UE",
direction="nsm",
@@ -23636,6 +24722,7 @@ characters.data={
unicodeslot=0x0E36,
},
[0x0E37]={
+ adobename="saraueethai",
category="mn",
description="THAI CHARACTER SARA UEE",
direction="nsm",
@@ -23643,6 +24730,7 @@ characters.data={
unicodeslot=0x0E37,
},
[0x0E38]={
+ adobename="sarauthai",
category="mn",
description="THAI CHARACTER SARA U",
direction="nsm",
@@ -23650,6 +24738,7 @@ characters.data={
unicodeslot=0x0E38,
},
[0x0E39]={
+ adobename="sarauuthai",
category="mn",
description="THAI CHARACTER SARA UU",
direction="nsm",
@@ -23657,6 +24746,7 @@ characters.data={
unicodeslot=0x0E39,
},
[0x0E3A]={
+ adobename="phinthuthai",
category="mn",
description="THAI CHARACTER PHINTHU",
direction="nsm",
@@ -23664,6 +24754,7 @@ characters.data={
unicodeslot=0x0E3A,
},
[0x0E3F]={
+ adobename="bahtthai",
category="sc",
description="THAI CURRENCY SYMBOL BAHT",
direction="et",
@@ -23671,6 +24762,7 @@ characters.data={
unicodeslot=0x0E3F,
},
[0x0E40]={
+ adobename="saraethai",
category="lo",
description="THAI CHARACTER SARA E",
direction="l",
@@ -23678,6 +24770,7 @@ characters.data={
unicodeslot=0x0E40,
},
[0x0E41]={
+ adobename="saraaethai",
category="lo",
description="THAI CHARACTER SARA AE",
direction="l",
@@ -23685,6 +24778,7 @@ characters.data={
unicodeslot=0x0E41,
},
[0x0E42]={
+ adobename="saraothai",
category="lo",
description="THAI CHARACTER SARA O",
direction="l",
@@ -23692,6 +24786,7 @@ characters.data={
unicodeslot=0x0E42,
},
[0x0E43]={
+ adobename="saraaimaimuanthai",
category="lo",
description="THAI CHARACTER SARA AI MAIMUAN",
direction="l",
@@ -23699,6 +24794,7 @@ characters.data={
unicodeslot=0x0E43,
},
[0x0E44]={
+ adobename="saraaimaimalaithai",
category="lo",
description="THAI CHARACTER SARA AI MAIMALAI",
direction="l",
@@ -23706,6 +24802,7 @@ characters.data={
unicodeslot=0x0E44,
},
[0x0E45]={
+ adobename="lakkhangyaothai",
category="lo",
description="THAI CHARACTER LAKKHANGYAO",
direction="l",
@@ -23713,6 +24810,7 @@ characters.data={
unicodeslot=0x0E45,
},
[0x0E46]={
+ adobename="maiyamokthai",
category="lm",
description="THAI CHARACTER MAIYAMOK",
direction="l",
@@ -23720,6 +24818,7 @@ characters.data={
unicodeslot=0x0E46,
},
[0x0E47]={
+ adobename="maitaikhuthai",
category="mn",
description="THAI CHARACTER MAITAIKHU",
direction="nsm",
@@ -23727,6 +24826,7 @@ characters.data={
unicodeslot=0x0E47,
},
[0x0E48]={
+ adobename="maiekthai",
category="mn",
description="THAI CHARACTER MAI EK",
direction="nsm",
@@ -23734,6 +24834,7 @@ characters.data={
unicodeslot=0x0E48,
},
[0x0E49]={
+ adobename="maithothai",
category="mn",
description="THAI CHARACTER MAI THO",
direction="nsm",
@@ -23741,6 +24842,7 @@ characters.data={
unicodeslot=0x0E49,
},
[0x0E4A]={
+ adobename="maitrithai",
category="mn",
description="THAI CHARACTER MAI TRI",
direction="nsm",
@@ -23748,6 +24850,7 @@ characters.data={
unicodeslot=0x0E4A,
},
[0x0E4B]={
+ adobename="maichattawathai",
category="mn",
description="THAI CHARACTER MAI CHATTAWA",
direction="nsm",
@@ -23755,6 +24858,7 @@ characters.data={
unicodeslot=0x0E4B,
},
[0x0E4C]={
+ adobename="thanthakhatthai",
category="mn",
description="THAI CHARACTER THANTHAKHAT",
direction="nsm",
@@ -23762,6 +24866,7 @@ characters.data={
unicodeslot=0x0E4C,
},
[0x0E4D]={
+ adobename="nikhahitthai",
category="mn",
description="THAI CHARACTER NIKHAHIT",
direction="nsm",
@@ -23769,6 +24874,7 @@ characters.data={
unicodeslot=0x0E4D,
},
[0x0E4E]={
+ adobename="yamakkanthai",
category="mn",
description="THAI CHARACTER YAMAKKAN",
direction="nsm",
@@ -23776,6 +24882,7 @@ characters.data={
unicodeslot=0x0E4E,
},
[0x0E4F]={
+ adobename="fongmanthai",
category="po",
description="THAI CHARACTER FONGMAN",
direction="l",
@@ -23783,6 +24890,7 @@ characters.data={
unicodeslot=0x0E4F,
},
[0x0E50]={
+ adobename="zerothai",
category="nd",
description="THAI DIGIT ZERO",
direction="l",
@@ -23790,6 +24898,7 @@ characters.data={
unicodeslot=0x0E50,
},
[0x0E51]={
+ adobename="onethai",
category="nd",
description="THAI DIGIT ONE",
direction="l",
@@ -23797,6 +24906,7 @@ characters.data={
unicodeslot=0x0E51,
},
[0x0E52]={
+ adobename="twothai",
category="nd",
description="THAI DIGIT TWO",
direction="l",
@@ -23804,6 +24914,7 @@ characters.data={
unicodeslot=0x0E52,
},
[0x0E53]={
+ adobename="threethai",
category="nd",
description="THAI DIGIT THREE",
direction="l",
@@ -23811,6 +24922,7 @@ characters.data={
unicodeslot=0x0E53,
},
[0x0E54]={
+ adobename="fourthai",
category="nd",
description="THAI DIGIT FOUR",
direction="l",
@@ -23818,6 +24930,7 @@ characters.data={
unicodeslot=0x0E54,
},
[0x0E55]={
+ adobename="fivethai",
category="nd",
description="THAI DIGIT FIVE",
direction="l",
@@ -23825,6 +24938,7 @@ characters.data={
unicodeslot=0x0E55,
},
[0x0E56]={
+ adobename="sixthai",
category="nd",
description="THAI DIGIT SIX",
direction="l",
@@ -23832,6 +24946,7 @@ characters.data={
unicodeslot=0x0E56,
},
[0x0E57]={
+ adobename="seventhai",
category="nd",
description="THAI DIGIT SEVEN",
direction="l",
@@ -23839,6 +24954,7 @@ characters.data={
unicodeslot=0x0E57,
},
[0x0E58]={
+ adobename="eightthai",
category="nd",
description="THAI DIGIT EIGHT",
direction="l",
@@ -23846,6 +24962,7 @@ characters.data={
unicodeslot=0x0E58,
},
[0x0E59]={
+ adobename="ninethai",
category="nd",
description="THAI DIGIT NINE",
direction="l",
@@ -23853,6 +24970,7 @@ characters.data={
unicodeslot=0x0E59,
},
[0x0E5A]={
+ adobename="angkhankhuthai",
category="po",
description="THAI CHARACTER ANGKHANKHU",
direction="l",
@@ -23860,6 +24978,7 @@ characters.data={
unicodeslot=0x0E5A,
},
[0x0E5B]={
+ adobename="khomutthai",
category="po",
description="THAI CHARACTER KHOMUT",
direction="l",
@@ -43684,6 +44803,7 @@ characters.data={
unicodeslot=0x1DFF,
},
[0x1E00]={
+ adobename="Aringbelow",
category="lu",
description="LATIN CAPITAL LETTER A WITH RING BELOW",
direction="l",
@@ -43694,6 +44814,7 @@ characters.data={
unicodeslot=0x1E00,
},
[0x1E01]={
+ adobename="aringbelow",
category="ll",
description="LATIN SMALL LETTER A WITH RING BELOW",
direction="l",
@@ -43704,6 +44825,7 @@ characters.data={
unicodeslot=0x1E01,
},
[0x1E02]={
+ adobename="Bdotaccent",
category="lu",
description="LATIN CAPITAL LETTER B WITH DOT ABOVE",
direction="l",
@@ -43714,6 +44836,7 @@ characters.data={
unicodeslot=0x1E02,
},
[0x1E03]={
+ adobename="bdotaccent",
category="ll",
description="LATIN SMALL LETTER B WITH DOT ABOVE",
direction="l",
@@ -43724,6 +44847,7 @@ characters.data={
unicodeslot=0x1E03,
},
[0x1E04]={
+ adobename="Bdotbelow",
category="lu",
description="LATIN CAPITAL LETTER B WITH DOT BELOW",
direction="l",
@@ -43734,6 +44858,7 @@ characters.data={
unicodeslot=0x1E04,
},
[0x1E05]={
+ adobename="bdotbelow",
category="ll",
description="LATIN SMALL LETTER B WITH DOT BELOW",
direction="l",
@@ -43744,6 +44869,7 @@ characters.data={
unicodeslot=0x1E05,
},
[0x1E06]={
+ adobename="Blinebelow",
category="lu",
description="LATIN CAPITAL LETTER B WITH LINE BELOW",
direction="l",
@@ -43754,6 +44880,7 @@ characters.data={
unicodeslot=0x1E06,
},
[0x1E07]={
+ adobename="blinebelow",
category="ll",
description="LATIN SMALL LETTER B WITH LINE BELOW",
direction="l",
@@ -43764,6 +44891,7 @@ characters.data={
unicodeslot=0x1E07,
},
[0x1E08]={
+ adobename="Ccedillaacute",
category="lu",
description="LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE",
direction="l",
@@ -43774,6 +44902,7 @@ characters.data={
unicodeslot=0x1E08,
},
[0x1E09]={
+ adobename="ccedillaacute",
category="ll",
description="LATIN SMALL LETTER C WITH CEDILLA AND ACUTE",
direction="l",
@@ -43784,6 +44913,7 @@ characters.data={
unicodeslot=0x1E09,
},
[0x1E0A]={
+ adobename="Ddotaccent",
category="lu",
description="LATIN CAPITAL LETTER D WITH DOT ABOVE",
direction="l",
@@ -43794,6 +44924,7 @@ characters.data={
unicodeslot=0x1E0A,
},
[0x1E0B]={
+ adobename="ddotaccent",
category="ll",
description="LATIN SMALL LETTER D WITH DOT ABOVE",
direction="l",
@@ -43804,6 +44935,7 @@ characters.data={
unicodeslot=0x1E0B,
},
[0x1E0C]={
+ adobename="Ddotbelow",
category="lu",
description="LATIN CAPITAL LETTER D WITH DOT BELOW",
direction="l",
@@ -43814,6 +44946,7 @@ characters.data={
unicodeslot=0x1E0C,
},
[0x1E0D]={
+ adobename="ddotbelow",
category="ll",
description="LATIN SMALL LETTER D WITH DOT BELOW",
direction="l",
@@ -43824,6 +44957,7 @@ characters.data={
unicodeslot=0x1E0D,
},
[0x1E0E]={
+ adobename="Dlinebelow",
category="lu",
description="LATIN CAPITAL LETTER D WITH LINE BELOW",
direction="l",
@@ -43834,6 +44968,7 @@ characters.data={
unicodeslot=0x1E0E,
},
[0x1E0F]={
+ adobename="dlinebelow",
category="ll",
description="LATIN SMALL LETTER D WITH LINE BELOW",
direction="l",
@@ -43844,6 +44979,7 @@ characters.data={
unicodeslot=0x1E0F,
},
[0x1E10]={
+ adobename="Dcedilla",
category="lu",
description="LATIN CAPITAL LETTER D WITH CEDILLA",
direction="l",
@@ -43854,6 +44990,7 @@ characters.data={
unicodeslot=0x1E10,
},
[0x1E11]={
+ adobename="dcedilla",
category="ll",
description="LATIN SMALL LETTER D WITH CEDILLA",
direction="l",
@@ -43864,6 +45001,7 @@ characters.data={
unicodeslot=0x1E11,
},
[0x1E12]={
+ adobename="Dcircumflexbelow",
category="lu",
description="LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW",
direction="l",
@@ -43874,6 +45012,7 @@ characters.data={
unicodeslot=0x1E12,
},
[0x1E13]={
+ adobename="dcircumflexbelow",
category="ll",
description="LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW",
direction="l",
@@ -43884,6 +45023,7 @@ characters.data={
unicodeslot=0x1E13,
},
[0x1E14]={
+ adobename="Emacrongrave",
category="lu",
description="LATIN CAPITAL LETTER E WITH MACRON AND GRAVE",
direction="l",
@@ -43894,6 +45034,7 @@ characters.data={
unicodeslot=0x1E14,
},
[0x1E15]={
+ adobename="emacrongrave",
category="ll",
description="LATIN SMALL LETTER E WITH MACRON AND GRAVE",
direction="l",
@@ -43904,6 +45045,7 @@ characters.data={
unicodeslot=0x1E15,
},
[0x1E16]={
+ adobename="Emacronacute",
category="lu",
description="LATIN CAPITAL LETTER E WITH MACRON AND ACUTE",
direction="l",
@@ -43914,6 +45056,7 @@ characters.data={
unicodeslot=0x1E16,
},
[0x1E17]={
+ adobename="emacronacute",
category="ll",
description="LATIN SMALL LETTER E WITH MACRON AND ACUTE",
direction="l",
@@ -43924,6 +45067,7 @@ characters.data={
unicodeslot=0x1E17,
},
[0x1E18]={
+ adobename="Ecircumflexbelow",
category="lu",
description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW",
direction="l",
@@ -43934,6 +45078,7 @@ characters.data={
unicodeslot=0x1E18,
},
[0x1E19]={
+ adobename="ecircumflexbelow",
category="ll",
description="LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW",
direction="l",
@@ -43944,6 +45089,7 @@ characters.data={
unicodeslot=0x1E19,
},
[0x1E1A]={
+ adobename="Etildebelow",
category="lu",
description="LATIN CAPITAL LETTER E WITH TILDE BELOW",
direction="l",
@@ -43954,6 +45100,7 @@ characters.data={
unicodeslot=0x1E1A,
},
[0x1E1B]={
+ adobename="etildebelow",
category="ll",
description="LATIN SMALL LETTER E WITH TILDE BELOW",
direction="l",
@@ -43964,6 +45111,7 @@ characters.data={
unicodeslot=0x1E1B,
},
[0x1E1C]={
+ adobename="Ecedillabreve",
category="lu",
description="LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE",
direction="l",
@@ -43974,6 +45122,7 @@ characters.data={
unicodeslot=0x1E1C,
},
[0x1E1D]={
+ adobename="ecedillabreve",
category="ll",
description="LATIN SMALL LETTER E WITH CEDILLA AND BREVE",
direction="l",
@@ -43984,6 +45133,7 @@ characters.data={
unicodeslot=0x1E1D,
},
[0x1E1E]={
+ adobename="Fdotaccent",
category="lu",
description="LATIN CAPITAL LETTER F WITH DOT ABOVE",
direction="l",
@@ -43994,6 +45144,7 @@ characters.data={
unicodeslot=0x1E1E,
},
[0x1E1F]={
+ adobename="fdotaccent",
category="ll",
description="LATIN SMALL LETTER F WITH DOT ABOVE",
direction="l",
@@ -44004,6 +45155,7 @@ characters.data={
unicodeslot=0x1E1F,
},
[0x1E20]={
+ adobename="Gmacron",
category="lu",
description="LATIN CAPITAL LETTER G WITH MACRON",
direction="l",
@@ -44014,6 +45166,7 @@ characters.data={
unicodeslot=0x1E20,
},
[0x1E21]={
+ adobename="gmacron",
category="ll",
description="LATIN SMALL LETTER G WITH MACRON",
direction="l",
@@ -44024,6 +45177,7 @@ characters.data={
unicodeslot=0x1E21,
},
[0x1E22]={
+ adobename="Hdotaccent",
category="lu",
description="LATIN CAPITAL LETTER H WITH DOT ABOVE",
direction="l",
@@ -44034,6 +45188,7 @@ characters.data={
unicodeslot=0x1E22,
},
[0x1E23]={
+ adobename="hdotaccent",
category="ll",
description="LATIN SMALL LETTER H WITH DOT ABOVE",
direction="l",
@@ -44044,6 +45199,7 @@ characters.data={
unicodeslot=0x1E23,
},
[0x1E24]={
+ adobename="Hdotbelow",
category="lu",
description="LATIN CAPITAL LETTER H WITH DOT BELOW",
direction="l",
@@ -44054,6 +45210,7 @@ characters.data={
unicodeslot=0x1E24,
},
[0x1E25]={
+ adobename="hdotbelow",
category="ll",
description="LATIN SMALL LETTER H WITH DOT BELOW",
direction="l",
@@ -44064,6 +45221,7 @@ characters.data={
unicodeslot=0x1E25,
},
[0x1E26]={
+ adobename="Hdieresis",
category="lu",
description="LATIN CAPITAL LETTER H WITH DIAERESIS",
direction="l",
@@ -44074,6 +45232,7 @@ characters.data={
unicodeslot=0x1E26,
},
[0x1E27]={
+ adobename="hdieresis",
category="ll",
description="LATIN SMALL LETTER H WITH DIAERESIS",
direction="l",
@@ -44084,6 +45243,7 @@ characters.data={
unicodeslot=0x1E27,
},
[0x1E28]={
+ adobename="Hcedilla",
category="lu",
description="LATIN CAPITAL LETTER H WITH CEDILLA",
direction="l",
@@ -44094,6 +45254,7 @@ characters.data={
unicodeslot=0x1E28,
},
[0x1E29]={
+ adobename="hcedilla",
category="ll",
description="LATIN SMALL LETTER H WITH CEDILLA",
direction="l",
@@ -44104,6 +45265,7 @@ characters.data={
unicodeslot=0x1E29,
},
[0x1E2A]={
+ adobename="Hbrevebelow",
category="lu",
description="LATIN CAPITAL LETTER H WITH BREVE BELOW",
direction="l",
@@ -44114,6 +45276,7 @@ characters.data={
unicodeslot=0x1E2A,
},
[0x1E2B]={
+ adobename="hbrevebelow",
category="ll",
description="LATIN SMALL LETTER H WITH BREVE BELOW",
direction="l",
@@ -44124,6 +45287,7 @@ characters.data={
unicodeslot=0x1E2B,
},
[0x1E2C]={
+ adobename="Itildebelow",
category="lu",
description="LATIN CAPITAL LETTER I WITH TILDE BELOW",
direction="l",
@@ -44134,6 +45298,7 @@ characters.data={
unicodeslot=0x1E2C,
},
[0x1E2D]={
+ adobename="itildebelow",
category="ll",
description="LATIN SMALL LETTER I WITH TILDE BELOW",
direction="l",
@@ -44144,6 +45309,7 @@ characters.data={
unicodeslot=0x1E2D,
},
[0x1E2E]={
+ adobename="Idieresisacute",
category="lu",
description="LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE",
direction="l",
@@ -44154,6 +45320,7 @@ characters.data={
unicodeslot=0x1E2E,
},
[0x1E2F]={
+ adobename="idieresisacute",
category="ll",
description="LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE",
direction="l",
@@ -44164,6 +45331,7 @@ characters.data={
unicodeslot=0x1E2F,
},
[0x1E30]={
+ adobename="Kacute",
category="lu",
description="LATIN CAPITAL LETTER K WITH ACUTE",
direction="l",
@@ -44174,6 +45342,7 @@ characters.data={
unicodeslot=0x1E30,
},
[0x1E31]={
+ adobename="kacute",
category="ll",
description="LATIN SMALL LETTER K WITH ACUTE",
direction="l",
@@ -44184,6 +45353,7 @@ characters.data={
unicodeslot=0x1E31,
},
[0x1E32]={
+ adobename="Kdotbelow",
category="lu",
description="LATIN CAPITAL LETTER K WITH DOT BELOW",
direction="l",
@@ -44194,6 +45364,7 @@ characters.data={
unicodeslot=0x1E32,
},
[0x1E33]={
+ adobename="kdotbelow",
category="ll",
description="LATIN SMALL LETTER K WITH DOT BELOW",
direction="l",
@@ -44204,6 +45375,7 @@ characters.data={
unicodeslot=0x1E33,
},
[0x1E34]={
+ adobename="Klinebelow",
category="lu",
description="LATIN CAPITAL LETTER K WITH LINE BELOW",
direction="l",
@@ -44214,6 +45386,7 @@ characters.data={
unicodeslot=0x1E34,
},
[0x1E35]={
+ adobename="klinebelow",
category="ll",
description="LATIN SMALL LETTER K WITH LINE BELOW",
direction="l",
@@ -44224,6 +45397,7 @@ characters.data={
unicodeslot=0x1E35,
},
[0x1E36]={
+ adobename="Ldotbelow",
category="lu",
description="LATIN CAPITAL LETTER L WITH DOT BELOW",
direction="l",
@@ -44234,6 +45408,7 @@ characters.data={
unicodeslot=0x1E36,
},
[0x1E37]={
+ adobename="ldotbelow",
category="ll",
description="LATIN SMALL LETTER L WITH DOT BELOW",
direction="l",
@@ -44244,6 +45419,7 @@ characters.data={
unicodeslot=0x1E37,
},
[0x1E38]={
+ adobename="Ldotbelowmacron",
category="lu",
description="LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON",
direction="l",
@@ -44254,6 +45430,7 @@ characters.data={
unicodeslot=0x1E38,
},
[0x1E39]={
+ adobename="ldotbelowmacron",
category="ll",
description="LATIN SMALL LETTER L WITH DOT BELOW AND MACRON",
direction="l",
@@ -44264,6 +45441,7 @@ characters.data={
unicodeslot=0x1E39,
},
[0x1E3A]={
+ adobename="Llinebelow",
category="lu",
description="LATIN CAPITAL LETTER L WITH LINE BELOW",
direction="l",
@@ -44274,6 +45452,7 @@ characters.data={
unicodeslot=0x1E3A,
},
[0x1E3B]={
+ adobename="llinebelow",
category="ll",
description="LATIN SMALL LETTER L WITH LINE BELOW",
direction="l",
@@ -44284,6 +45463,7 @@ characters.data={
unicodeslot=0x1E3B,
},
[0x1E3C]={
+ adobename="Lcircumflexbelow",
category="lu",
description="LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW",
direction="l",
@@ -44294,6 +45474,7 @@ characters.data={
unicodeslot=0x1E3C,
},
[0x1E3D]={
+ adobename="lcircumflexbelow",
category="ll",
description="LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW",
direction="l",
@@ -44304,6 +45485,7 @@ characters.data={
unicodeslot=0x1E3D,
},
[0x1E3E]={
+ adobename="Macute",
category="lu",
description="LATIN CAPITAL LETTER M WITH ACUTE",
direction="l",
@@ -44314,6 +45496,7 @@ characters.data={
unicodeslot=0x1E3E,
},
[0x1E3F]={
+ adobename="macute",
category="ll",
description="LATIN SMALL LETTER M WITH ACUTE",
direction="l",
@@ -44324,6 +45507,7 @@ characters.data={
unicodeslot=0x1E3F,
},
[0x1E40]={
+ adobename="Mdotaccent",
category="lu",
description="LATIN CAPITAL LETTER M WITH DOT ABOVE",
direction="l",
@@ -44334,6 +45518,7 @@ characters.data={
unicodeslot=0x1E40,
},
[0x1E41]={
+ adobename="mdotaccent",
category="ll",
description="LATIN SMALL LETTER M WITH DOT ABOVE",
direction="l",
@@ -44344,6 +45529,7 @@ characters.data={
unicodeslot=0x1E41,
},
[0x1E42]={
+ adobename="Mdotbelow",
category="lu",
description="LATIN CAPITAL LETTER M WITH DOT BELOW",
direction="l",
@@ -44354,6 +45540,7 @@ characters.data={
unicodeslot=0x1E42,
},
[0x1E43]={
+ adobename="mdotbelow",
category="ll",
description="LATIN SMALL LETTER M WITH DOT BELOW",
direction="l",
@@ -44364,6 +45551,7 @@ characters.data={
unicodeslot=0x1E43,
},
[0x1E44]={
+ adobename="Ndotaccent",
category="lu",
description="LATIN CAPITAL LETTER N WITH DOT ABOVE",
direction="l",
@@ -44374,6 +45562,7 @@ characters.data={
unicodeslot=0x1E44,
},
[0x1E45]={
+ adobename="ndotaccent",
category="ll",
description="LATIN SMALL LETTER N WITH DOT ABOVE",
direction="l",
@@ -44384,6 +45573,7 @@ characters.data={
unicodeslot=0x1E45,
},
[0x1E46]={
+ adobename="Ndotbelow",
category="lu",
description="LATIN CAPITAL LETTER N WITH DOT BELOW",
direction="l",
@@ -44394,6 +45584,7 @@ characters.data={
unicodeslot=0x1E46,
},
[0x1E47]={
+ adobename="ndotbelow",
category="ll",
description="LATIN SMALL LETTER N WITH DOT BELOW",
direction="l",
@@ -44404,6 +45595,7 @@ characters.data={
unicodeslot=0x1E47,
},
[0x1E48]={
+ adobename="Nlinebelow",
category="lu",
description="LATIN CAPITAL LETTER N WITH LINE BELOW",
direction="l",
@@ -44414,6 +45606,7 @@ characters.data={
unicodeslot=0x1E48,
},
[0x1E49]={
+ adobename="nlinebelow",
category="ll",
description="LATIN SMALL LETTER N WITH LINE BELOW",
direction="l",
@@ -44424,6 +45617,7 @@ characters.data={
unicodeslot=0x1E49,
},
[0x1E4A]={
+ adobename="Ncircumflexbelow",
category="lu",
description="LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW",
direction="l",
@@ -44434,6 +45628,7 @@ characters.data={
unicodeslot=0x1E4A,
},
[0x1E4B]={
+ adobename="ncircumflexbelow",
category="ll",
description="LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW",
direction="l",
@@ -44444,6 +45639,7 @@ characters.data={
unicodeslot=0x1E4B,
},
[0x1E4C]={
+ adobename="Otildeacute",
category="lu",
description="LATIN CAPITAL LETTER O WITH TILDE AND ACUTE",
direction="l",
@@ -44454,6 +45650,7 @@ characters.data={
unicodeslot=0x1E4C,
},
[0x1E4D]={
+ adobename="otildeacute",
category="ll",
description="LATIN SMALL LETTER O WITH TILDE AND ACUTE",
direction="l",
@@ -44464,6 +45661,7 @@ characters.data={
unicodeslot=0x1E4D,
},
[0x1E4E]={
+ adobename="Otildedieresis",
category="lu",
description="LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS",
direction="l",
@@ -44474,6 +45672,7 @@ characters.data={
unicodeslot=0x1E4E,
},
[0x1E4F]={
+ adobename="otildedieresis",
category="ll",
description="LATIN SMALL LETTER O WITH TILDE AND DIAERESIS",
direction="l",
@@ -44484,6 +45683,7 @@ characters.data={
unicodeslot=0x1E4F,
},
[0x1E50]={
+ adobename="Omacrongrave",
category="lu",
description="LATIN CAPITAL LETTER O WITH MACRON AND GRAVE",
direction="l",
@@ -44494,6 +45694,7 @@ characters.data={
unicodeslot=0x1E50,
},
[0x1E51]={
+ adobename="omacrongrave",
category="ll",
description="LATIN SMALL LETTER O WITH MACRON AND GRAVE",
direction="l",
@@ -44504,6 +45705,7 @@ characters.data={
unicodeslot=0x1E51,
},
[0x1E52]={
+ adobename="Omacronacute",
category="lu",
description="LATIN CAPITAL LETTER O WITH MACRON AND ACUTE",
direction="l",
@@ -44514,6 +45716,7 @@ characters.data={
unicodeslot=0x1E52,
},
[0x1E53]={
+ adobename="omacronacute",
category="ll",
description="LATIN SMALL LETTER O WITH MACRON AND ACUTE",
direction="l",
@@ -44524,6 +45727,7 @@ characters.data={
unicodeslot=0x1E53,
},
[0x1E54]={
+ adobename="Pacute",
category="lu",
description="LATIN CAPITAL LETTER P WITH ACUTE",
direction="l",
@@ -44534,6 +45738,7 @@ characters.data={
unicodeslot=0x1E54,
},
[0x1E55]={
+ adobename="pacute",
category="ll",
description="LATIN SMALL LETTER P WITH ACUTE",
direction="l",
@@ -44544,6 +45749,7 @@ characters.data={
unicodeslot=0x1E55,
},
[0x1E56]={
+ adobename="Pdotaccent",
category="lu",
description="LATIN CAPITAL LETTER P WITH DOT ABOVE",
direction="l",
@@ -44554,6 +45760,7 @@ characters.data={
unicodeslot=0x1E56,
},
[0x1E57]={
+ adobename="pdotaccent",
category="ll",
description="LATIN SMALL LETTER P WITH DOT ABOVE",
direction="l",
@@ -44564,6 +45771,7 @@ characters.data={
unicodeslot=0x1E57,
},
[0x1E58]={
+ adobename="Rdotaccent",
category="lu",
description="LATIN CAPITAL LETTER R WITH DOT ABOVE",
direction="l",
@@ -44574,6 +45782,7 @@ characters.data={
unicodeslot=0x1E58,
},
[0x1E59]={
+ adobename="rdotaccent",
category="ll",
description="LATIN SMALL LETTER R WITH DOT ABOVE",
direction="l",
@@ -44584,6 +45793,7 @@ characters.data={
unicodeslot=0x1E59,
},
[0x1E5A]={
+ adobename="Rdotbelow",
category="lu",
description="LATIN CAPITAL LETTER R WITH DOT BELOW",
direction="l",
@@ -44594,6 +45804,7 @@ characters.data={
unicodeslot=0x1E5A,
},
[0x1E5B]={
+ adobename="rdotbelow",
category="ll",
description="LATIN SMALL LETTER R WITH DOT BELOW",
direction="l",
@@ -44604,6 +45815,7 @@ characters.data={
unicodeslot=0x1E5B,
},
[0x1E5C]={
+ adobename="Rdotbelowmacron",
category="lu",
description="LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON",
direction="l",
@@ -44614,6 +45826,7 @@ characters.data={
unicodeslot=0x1E5C,
},
[0x1E5D]={
+ adobename="rdotbelowmacron",
category="ll",
description="LATIN SMALL LETTER R WITH DOT BELOW AND MACRON",
direction="l",
@@ -44624,6 +45837,7 @@ characters.data={
unicodeslot=0x1E5D,
},
[0x1E5E]={
+ adobename="Rlinebelow",
category="lu",
description="LATIN CAPITAL LETTER R WITH LINE BELOW",
direction="l",
@@ -44634,6 +45848,7 @@ characters.data={
unicodeslot=0x1E5E,
},
[0x1E5F]={
+ adobename="rlinebelow",
category="ll",
description="LATIN SMALL LETTER R WITH LINE BELOW",
direction="l",
@@ -44644,6 +45859,7 @@ characters.data={
unicodeslot=0x1E5F,
},
[0x1E60]={
+ adobename="Sdotaccent",
category="lu",
description="LATIN CAPITAL LETTER S WITH DOT ABOVE",
direction="l",
@@ -44654,6 +45870,7 @@ characters.data={
unicodeslot=0x1E60,
},
[0x1E61]={
+ adobename="sdotaccent",
category="ll",
description="LATIN SMALL LETTER S WITH DOT ABOVE",
direction="l",
@@ -44664,6 +45881,7 @@ characters.data={
unicodeslot=0x1E61,
},
[0x1E62]={
+ adobename="Sdotbelow",
category="lu",
description="LATIN CAPITAL LETTER S WITH DOT BELOW",
direction="l",
@@ -44674,6 +45892,7 @@ characters.data={
unicodeslot=0x1E62,
},
[0x1E63]={
+ adobename="sdotbelow",
category="ll",
description="LATIN SMALL LETTER S WITH DOT BELOW",
direction="l",
@@ -44684,6 +45903,7 @@ characters.data={
unicodeslot=0x1E63,
},
[0x1E64]={
+ adobename="Sacutedotaccent",
category="lu",
description="LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE",
direction="l",
@@ -44694,6 +45914,7 @@ characters.data={
unicodeslot=0x1E64,
},
[0x1E65]={
+ adobename="sacutedotaccent",
category="ll",
description="LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE",
direction="l",
@@ -44704,6 +45925,7 @@ characters.data={
unicodeslot=0x1E65,
},
[0x1E66]={
+ adobename="Scarondotaccent",
category="lu",
description="LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE",
direction="l",
@@ -44714,6 +45936,7 @@ characters.data={
unicodeslot=0x1E66,
},
[0x1E67]={
+ adobename="scarondotaccent",
category="ll",
description="LATIN SMALL LETTER S WITH CARON AND DOT ABOVE",
direction="l",
@@ -44724,6 +45947,7 @@ characters.data={
unicodeslot=0x1E67,
},
[0x1E68]={
+ adobename="Sdotbelowdotaccent",
category="lu",
description="LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE",
direction="l",
@@ -44734,6 +45958,7 @@ characters.data={
unicodeslot=0x1E68,
},
[0x1E69]={
+ adobename="sdotbelowdotaccent",
category="ll",
description="LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE",
direction="l",
@@ -44744,6 +45969,7 @@ characters.data={
unicodeslot=0x1E69,
},
[0x1E6A]={
+ adobename="Tdotaccent",
category="lu",
description="LATIN CAPITAL LETTER T WITH DOT ABOVE",
direction="l",
@@ -44754,6 +45980,7 @@ characters.data={
unicodeslot=0x1E6A,
},
[0x1E6B]={
+ adobename="tdotaccent",
category="ll",
description="LATIN SMALL LETTER T WITH DOT ABOVE",
direction="l",
@@ -44764,6 +45991,7 @@ characters.data={
unicodeslot=0x1E6B,
},
[0x1E6C]={
+ adobename="Tdotbelow",
category="lu",
description="LATIN CAPITAL LETTER T WITH DOT BELOW",
direction="l",
@@ -44774,6 +46002,7 @@ characters.data={
unicodeslot=0x1E6C,
},
[0x1E6D]={
+ adobename="tdotbelow",
category="ll",
description="LATIN SMALL LETTER T WITH DOT BELOW",
direction="l",
@@ -44784,6 +46013,7 @@ characters.data={
unicodeslot=0x1E6D,
},
[0x1E6E]={
+ adobename="Tlinebelow",
category="lu",
description="LATIN CAPITAL LETTER T WITH LINE BELOW",
direction="l",
@@ -44794,6 +46024,7 @@ characters.data={
unicodeslot=0x1E6E,
},
[0x1E6F]={
+ adobename="tlinebelow",
category="ll",
description="LATIN SMALL LETTER T WITH LINE BELOW",
direction="l",
@@ -44804,6 +46035,7 @@ characters.data={
unicodeslot=0x1E6F,
},
[0x1E70]={
+ adobename="Tcircumflexbelow",
category="lu",
description="LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW",
direction="l",
@@ -44814,6 +46046,7 @@ characters.data={
unicodeslot=0x1E70,
},
[0x1E71]={
+ adobename="tcircumflexbelow",
category="ll",
description="LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW",
direction="l",
@@ -44824,6 +46057,7 @@ characters.data={
unicodeslot=0x1E71,
},
[0x1E72]={
+ adobename="Udieresisbelow",
category="lu",
description="LATIN CAPITAL LETTER U WITH DIAERESIS BELOW",
direction="l",
@@ -44834,6 +46068,7 @@ characters.data={
unicodeslot=0x1E72,
},
[0x1E73]={
+ adobename="udieresisbelow",
category="ll",
description="LATIN SMALL LETTER U WITH DIAERESIS BELOW",
direction="l",
@@ -44844,6 +46079,7 @@ characters.data={
unicodeslot=0x1E73,
},
[0x1E74]={
+ adobename="Utildebelow",
category="lu",
description="LATIN CAPITAL LETTER U WITH TILDE BELOW",
direction="l",
@@ -44854,6 +46090,7 @@ characters.data={
unicodeslot=0x1E74,
},
[0x1E75]={
+ adobename="utildebelow",
category="ll",
description="LATIN SMALL LETTER U WITH TILDE BELOW",
direction="l",
@@ -44864,6 +46101,7 @@ characters.data={
unicodeslot=0x1E75,
},
[0x1E76]={
+ adobename="Ucircumflexbelow",
category="lu",
description="LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW",
direction="l",
@@ -44874,6 +46112,7 @@ characters.data={
unicodeslot=0x1E76,
},
[0x1E77]={
+ adobename="ucircumflexbelow",
category="ll",
description="LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW",
direction="l",
@@ -44884,6 +46123,7 @@ characters.data={
unicodeslot=0x1E77,
},
[0x1E78]={
+ adobename="Utildeacute",
category="lu",
description="LATIN CAPITAL LETTER U WITH TILDE AND ACUTE",
direction="l",
@@ -44894,6 +46134,7 @@ characters.data={
unicodeslot=0x1E78,
},
[0x1E79]={
+ adobename="utildeacute",
category="ll",
description="LATIN SMALL LETTER U WITH TILDE AND ACUTE",
direction="l",
@@ -44904,6 +46145,7 @@ characters.data={
unicodeslot=0x1E79,
},
[0x1E7A]={
+ adobename="Umacrondieresis",
category="lu",
description="LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS",
direction="l",
@@ -44914,6 +46156,7 @@ characters.data={
unicodeslot=0x1E7A,
},
[0x1E7B]={
+ adobename="umacrondieresis",
category="ll",
description="LATIN SMALL LETTER U WITH MACRON AND DIAERESIS",
direction="l",
@@ -44924,6 +46167,7 @@ characters.data={
unicodeslot=0x1E7B,
},
[0x1E7C]={
+ adobename="Vtilde",
category="lu",
description="LATIN CAPITAL LETTER V WITH TILDE",
direction="l",
@@ -44934,6 +46178,7 @@ characters.data={
unicodeslot=0x1E7C,
},
[0x1E7D]={
+ adobename="vtilde",
category="ll",
description="LATIN SMALL LETTER V WITH TILDE",
direction="l",
@@ -44944,6 +46189,7 @@ characters.data={
unicodeslot=0x1E7D,
},
[0x1E7E]={
+ adobename="Vdotbelow",
category="lu",
description="LATIN CAPITAL LETTER V WITH DOT BELOW",
direction="l",
@@ -44954,6 +46200,7 @@ characters.data={
unicodeslot=0x1E7E,
},
[0x1E7F]={
+ adobename="vdotbelow",
category="ll",
description="LATIN SMALL LETTER V WITH DOT BELOW",
direction="l",
@@ -45030,6 +46277,7 @@ characters.data={
unicodeslot=0x1E85,
},
[0x1E86]={
+ adobename="Wdotaccent",
category="lu",
description="LATIN CAPITAL LETTER W WITH DOT ABOVE",
direction="l",
@@ -45040,6 +46288,7 @@ characters.data={
unicodeslot=0x1E86,
},
[0x1E87]={
+ adobename="wdotaccent",
category="ll",
description="LATIN SMALL LETTER W WITH DOT ABOVE",
direction="l",
@@ -45050,6 +46299,7 @@ characters.data={
unicodeslot=0x1E87,
},
[0x1E88]={
+ adobename="Wdotbelow",
category="lu",
description="LATIN CAPITAL LETTER W WITH DOT BELOW",
direction="l",
@@ -45060,6 +46310,7 @@ characters.data={
unicodeslot=0x1E88,
},
[0x1E89]={
+ adobename="wdotbelow",
category="ll",
description="LATIN SMALL LETTER W WITH DOT BELOW",
direction="l",
@@ -45070,6 +46321,7 @@ characters.data={
unicodeslot=0x1E89,
},
[0x1E8A]={
+ adobename="Xdotaccent",
category="lu",
description="LATIN CAPITAL LETTER X WITH DOT ABOVE",
direction="l",
@@ -45080,6 +46332,7 @@ characters.data={
unicodeslot=0x1E8A,
},
[0x1E8B]={
+ adobename="xdotaccent",
category="ll",
description="LATIN SMALL LETTER X WITH DOT ABOVE",
direction="l",
@@ -45090,6 +46343,7 @@ characters.data={
unicodeslot=0x1E8B,
},
[0x1E8C]={
+ adobename="Xdieresis",
category="lu",
description="LATIN CAPITAL LETTER X WITH DIAERESIS",
direction="l",
@@ -45100,6 +46354,7 @@ characters.data={
unicodeslot=0x1E8C,
},
[0x1E8D]={
+ adobename="xdieresis",
category="ll",
description="LATIN SMALL LETTER X WITH DIAERESIS",
direction="l",
@@ -45110,6 +46365,7 @@ characters.data={
unicodeslot=0x1E8D,
},
[0x1E8E]={
+ adobename="Ydotaccent",
category="lu",
description="LATIN CAPITAL LETTER Y WITH DOT ABOVE",
direction="l",
@@ -45120,6 +46376,7 @@ characters.data={
unicodeslot=0x1E8E,
},
[0x1E8F]={
+ adobename="ydotaccent",
category="ll",
description="LATIN SMALL LETTER Y WITH DOT ABOVE",
direction="l",
@@ -45130,6 +46387,7 @@ characters.data={
unicodeslot=0x1E8F,
},
[0x1E90]={
+ adobename="Zcircumflex",
category="lu",
description="LATIN CAPITAL LETTER Z WITH CIRCUMFLEX",
direction="l",
@@ -45140,6 +46398,7 @@ characters.data={
unicodeslot=0x1E90,
},
[0x1E91]={
+ adobename="zcircumflex",
category="ll",
description="LATIN SMALL LETTER Z WITH CIRCUMFLEX",
direction="l",
@@ -45150,6 +46409,7 @@ characters.data={
unicodeslot=0x1E91,
},
[0x1E92]={
+ adobename="Zdotbelow",
category="lu",
description="LATIN CAPITAL LETTER Z WITH DOT BELOW",
direction="l",
@@ -45160,6 +46420,7 @@ characters.data={
unicodeslot=0x1E92,
},
[0x1E93]={
+ adobename="zdotbelow",
category="ll",
description="LATIN SMALL LETTER Z WITH DOT BELOW",
direction="l",
@@ -45170,6 +46431,7 @@ characters.data={
unicodeslot=0x1E93,
},
[0x1E94]={
+ adobename="Zlinebelow",
category="lu",
description="LATIN CAPITAL LETTER Z WITH LINE BELOW",
direction="l",
@@ -45180,6 +46442,7 @@ characters.data={
unicodeslot=0x1E94,
},
[0x1E95]={
+ adobename="zlinebelow",
category="ll",
description="LATIN SMALL LETTER Z WITH LINE BELOW",
direction="l",
@@ -45190,6 +46453,7 @@ characters.data={
unicodeslot=0x1E95,
},
[0x1E96]={
+ adobename="hlinebelow",
category="ll",
description="LATIN SMALL LETTER H WITH LINE BELOW",
direction="l",
@@ -45199,6 +46463,7 @@ characters.data={
unicodeslot=0x1E96,
},
[0x1E97]={
+ adobename="tdieresis",
category="ll",
description="LATIN SMALL LETTER T WITH DIAERESIS",
direction="l",
@@ -45208,6 +46473,7 @@ characters.data={
unicodeslot=0x1E97,
},
[0x1E98]={
+ adobename="wring",
category="ll",
description="LATIN SMALL LETTER W WITH RING ABOVE",
direction="l",
@@ -45217,6 +46483,7 @@ characters.data={
unicodeslot=0x1E98,
},
[0x1E99]={
+ adobename="yring",
category="ll",
description="LATIN SMALL LETTER Y WITH RING ABOVE",
direction="l",
@@ -45226,6 +46493,7 @@ characters.data={
unicodeslot=0x1E99,
},
[0x1E9A]={
+ adobename="arighthalfring",
category="ll",
description="LATIN SMALL LETTER A WITH RIGHT HALF RING",
direction="l",
@@ -45235,6 +46503,7 @@ characters.data={
unicodeslot=0x1E9A,
},
[0x1E9B]={
+ adobename="slongdotaccent",
category="ll",
description="LATIN SMALL LETTER LONG S WITH DOT ABOVE",
direction="l",
@@ -45244,6 +46513,7 @@ characters.data={
unicodeslot=0x1E9B,
},
[0x1EA0]={
+ adobename="Adotbelow",
category="lu",
contextname="Adotbelow",
description="LATIN CAPITAL LETTER A WITH DOT BELOW",
@@ -45255,6 +46525,7 @@ characters.data={
unicodeslot=0x1EA0,
},
[0x1EA1]={
+ adobename="adotbelow",
category="ll",
contextname="adotbelow",
description="LATIN SMALL LETTER A WITH DOT BELOW",
@@ -45266,6 +46537,7 @@ characters.data={
unicodeslot=0x1EA1,
},
[0x1EA2]={
+ adobename="Ahookabove",
category="lu",
contextname="Ahook",
description="LATIN CAPITAL LETTER A WITH HOOK ABOVE",
@@ -45277,6 +46549,7 @@ characters.data={
unicodeslot=0x1EA2,
},
[0x1EA3]={
+ adobename="ahookabove",
category="ll",
contextname="ahook",
description="LATIN SMALL LETTER A WITH HOOK ABOVE",
@@ -45288,6 +46561,7 @@ characters.data={
unicodeslot=0x1EA3,
},
[0x1EA4]={
+ adobename="Acircumflexacute",
category="lu",
contextname="Acircumflexacute",
description="LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE",
@@ -45299,6 +46573,7 @@ characters.data={
unicodeslot=0x1EA4,
},
[0x1EA5]={
+ adobename="acircumflexacute",
category="ll",
contextname="acircumflexacute",
description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE",
@@ -45310,6 +46585,7 @@ characters.data={
unicodeslot=0x1EA5,
},
[0x1EA6]={
+ adobename="Acircumflexgrave",
category="lu",
contextname="Acircumflexgrave",
description="LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE",
@@ -45321,6 +46597,7 @@ characters.data={
unicodeslot=0x1EA6,
},
[0x1EA7]={
+ adobename="acircumflexgrave",
category="ll",
contextname="acircumflexgrave",
description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE",
@@ -45332,6 +46609,7 @@ characters.data={
unicodeslot=0x1EA7,
},
[0x1EA8]={
+ adobename="Acircumflexhookabove",
category="lu",
contextname="Acircumflexhook",
description="LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE",
@@ -45343,6 +46621,7 @@ characters.data={
unicodeslot=0x1EA8,
},
[0x1EA9]={
+ adobename="acircumflexhookabove",
category="ll",
contextname="acircumflexhook",
description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE",
@@ -45354,6 +46633,7 @@ characters.data={
unicodeslot=0x1EA9,
},
[0x1EAA]={
+ adobename="Acircumflextilde",
category="lu",
contextname="Acircumflextilde",
description="LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE",
@@ -45365,6 +46645,7 @@ characters.data={
unicodeslot=0x1EAA,
},
[0x1EAB]={
+ adobename="acircumflextilde",
category="ll",
contextname="acircumflextilde",
description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE",
@@ -45376,6 +46657,7 @@ characters.data={
unicodeslot=0x1EAB,
},
[0x1EAC]={
+ adobename="Acircumflexdotbelow",
category="lu",
contextname="Acircumflexdotbelow",
description="LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW",
@@ -45387,6 +46669,7 @@ characters.data={
unicodeslot=0x1EAC,
},
[0x1EAD]={
+ adobename="acircumflexdotbelow",
category="ll",
contextname="acircumflexdotbelow",
description="LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW",
@@ -45398,6 +46681,7 @@ characters.data={
unicodeslot=0x1EAD,
},
[0x1EAE]={
+ adobename="Abreveacute",
category="lu",
contextname="Abreveacute",
description="LATIN CAPITAL LETTER A WITH BREVE AND ACUTE",
@@ -45409,6 +46693,7 @@ characters.data={
unicodeslot=0x1EAE,
},
[0x1EAF]={
+ adobename="abreveacute",
category="ll",
contextname="abreveacute",
description="LATIN SMALL LETTER A WITH BREVE AND ACUTE",
@@ -45420,6 +46705,7 @@ characters.data={
unicodeslot=0x1EAF,
},
[0x1EB0]={
+ adobename="Abrevegrave",
category="lu",
contextname="Abrevegrave",
description="LATIN CAPITAL LETTER A WITH BREVE AND GRAVE",
@@ -45431,6 +46717,7 @@ characters.data={
unicodeslot=0x1EB0,
},
[0x1EB1]={
+ adobename="abrevegrave",
category="ll",
contextname="abrevegrave",
description="LATIN SMALL LETTER A WITH BREVE AND GRAVE",
@@ -45442,6 +46729,7 @@ characters.data={
unicodeslot=0x1EB1,
},
[0x1EB2]={
+ adobename="Abrevehookabove",
category="lu",
contextname="Abrevehook",
description="LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE",
@@ -45453,6 +46741,7 @@ characters.data={
unicodeslot=0x1EB2,
},
[0x1EB3]={
+ adobename="abrevehookabove",
category="ll",
contextname="abrevehook",
description="LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE",
@@ -45464,6 +46753,7 @@ characters.data={
unicodeslot=0x1EB3,
},
[0x1EB4]={
+ adobename="Abrevetilde",
category="lu",
contextname="Abrevetilde",
description="LATIN CAPITAL LETTER A WITH BREVE AND TILDE",
@@ -45475,6 +46765,7 @@ characters.data={
unicodeslot=0x1EB4,
},
[0x1EB5]={
+ adobename="abrevetilde",
category="ll",
contextname="abrevetilde",
description="LATIN SMALL LETTER A WITH BREVE AND TILDE",
@@ -45486,6 +46777,7 @@ characters.data={
unicodeslot=0x1EB5,
},
[0x1EB6]={
+ adobename="Abrevedotbelow",
category="lu",
contextname="Abrevedotbelow",
description="LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW",
@@ -45497,6 +46789,7 @@ characters.data={
unicodeslot=0x1EB6,
},
[0x1EB7]={
+ adobename="abrevedotbelow",
category="ll",
contextname="abrevedotbelow",
description="LATIN SMALL LETTER A WITH BREVE AND DOT BELOW",
@@ -45508,6 +46801,7 @@ characters.data={
unicodeslot=0x1EB7,
},
[0x1EB8]={
+ adobename="Edotbelow",
category="lu",
contextname="Edotbelow",
description="LATIN CAPITAL LETTER E WITH DOT BELOW",
@@ -45519,6 +46813,7 @@ characters.data={
unicodeslot=0x1EB8,
},
[0x1EB9]={
+ adobename="edotbelow",
category="ll",
contextname="edotbelow",
description="LATIN SMALL LETTER E WITH DOT BELOW",
@@ -45530,6 +46825,7 @@ characters.data={
unicodeslot=0x1EB9,
},
[0x1EBA]={
+ adobename="Ehookabove",
category="lu",
contextname="Ehook",
description="LATIN CAPITAL LETTER E WITH HOOK ABOVE",
@@ -45541,6 +46837,7 @@ characters.data={
unicodeslot=0x1EBA,
},
[0x1EBB]={
+ adobename="ehookabove",
category="ll",
contextname="ehook",
description="LATIN SMALL LETTER E WITH HOOK ABOVE",
@@ -45552,6 +46849,7 @@ characters.data={
unicodeslot=0x1EBB,
},
[0x1EBC]={
+ adobename="Etilde",
category="lu",
contextname="Etilde",
description="LATIN CAPITAL LETTER E WITH TILDE",
@@ -45563,6 +46861,7 @@ characters.data={
unicodeslot=0x1EBC,
},
[0x1EBD]={
+ adobename="etilde",
category="ll",
contextname="etilde",
description="LATIN SMALL LETTER E WITH TILDE",
@@ -45574,6 +46873,7 @@ characters.data={
unicodeslot=0x1EBD,
},
[0x1EBE]={
+ adobename="Ecircumflexacute",
category="lu",
contextname="Ecircumflexacute",
description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE",
@@ -45585,6 +46885,7 @@ characters.data={
unicodeslot=0x1EBE,
},
[0x1EBF]={
+ adobename="ecircumflexacute",
category="ll",
contextname="ecircumflexacute",
description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE",
@@ -45596,6 +46897,7 @@ characters.data={
unicodeslot=0x1EBF,
},
[0x1EC0]={
+ adobename="Ecircumflexgrave",
category="lu",
contextname="Ecircumflexgrave",
description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE",
@@ -45607,6 +46909,7 @@ characters.data={
unicodeslot=0x1EC0,
},
[0x1EC1]={
+ adobename="ecircumflexgrave",
category="ll",
contextname="ecircumflexgrave",
description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE",
@@ -45618,6 +46921,7 @@ characters.data={
unicodeslot=0x1EC1,
},
[0x1EC2]={
+ adobename="Ecircumflexhookabove",
category="lu",
contextname="Ecircumflexhook",
description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE",
@@ -45629,6 +46933,7 @@ characters.data={
unicodeslot=0x1EC2,
},
[0x1EC3]={
+ adobename="ecircumflexhookabove",
category="ll",
contextname="ecircumflexhook",
description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE",
@@ -45640,6 +46945,7 @@ characters.data={
unicodeslot=0x1EC3,
},
[0x1EC4]={
+ adobename="Ecircumflextilde",
category="lu",
contextname="Ecircumflextilde",
description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE",
@@ -45651,6 +46957,7 @@ characters.data={
unicodeslot=0x1EC4,
},
[0x1EC5]={
+ adobename="ecircumflextilde",
category="ll",
contextname="ecircumflextilde",
description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE",
@@ -45662,6 +46969,7 @@ characters.data={
unicodeslot=0x1EC5,
},
[0x1EC6]={
+ adobename="Ecircumflexdotbelow",
category="lu",
contextname="Ecircumflexdotbelow",
description="LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW",
@@ -45673,6 +46981,7 @@ characters.data={
unicodeslot=0x1EC6,
},
[0x1EC7]={
+ adobename="ecircumflexdotbelow",
category="ll",
contextname="ecircumflexdotbelow",
description="LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW",
@@ -45684,6 +46993,7 @@ characters.data={
unicodeslot=0x1EC7,
},
[0x1EC8]={
+ adobename="Ihookabove",
category="lu",
contextname="Ihook",
description="LATIN CAPITAL LETTER I WITH HOOK ABOVE",
@@ -45695,6 +47005,7 @@ characters.data={
unicodeslot=0x1EC8,
},
[0x1EC9]={
+ adobename="ihookabove",
category="ll",
contextname="ihook",
description="LATIN SMALL LETTER I WITH HOOK ABOVE",
@@ -45706,6 +47017,7 @@ characters.data={
unicodeslot=0x1EC9,
},
[0x1ECA]={
+ adobename="Idotbelow",
category="lu",
contextname="Idotbelow",
description="LATIN CAPITAL LETTER I WITH DOT BELOW",
@@ -45717,6 +47029,7 @@ characters.data={
unicodeslot=0x1ECA,
},
[0x1ECB]={
+ adobename="idotbelow",
category="ll",
contextname="idotbelow",
description="LATIN SMALL LETTER I WITH DOT BELOW",
@@ -45728,6 +47041,7 @@ characters.data={
unicodeslot=0x1ECB,
},
[0x1ECC]={
+ adobename="Odotbelow",
category="lu",
contextname="Odotbelow",
description="LATIN CAPITAL LETTER O WITH DOT BELOW",
@@ -45739,6 +47053,7 @@ characters.data={
unicodeslot=0x1ECC,
},
[0x1ECD]={
+ adobename="odotbelow",
category="ll",
contextname="odotbelow",
description="LATIN SMALL LETTER O WITH DOT BELOW",
@@ -45750,6 +47065,7 @@ characters.data={
unicodeslot=0x1ECD,
},
[0x1ECE]={
+ adobename="Ohookabove",
category="lu",
contextname="Ohook",
description="LATIN CAPITAL LETTER O WITH HOOK ABOVE",
@@ -45761,6 +47077,7 @@ characters.data={
unicodeslot=0x1ECE,
},
[0x1ECF]={
+ adobename="ohookabove",
category="ll",
contextname="ohook",
description="LATIN SMALL LETTER O WITH HOOK ABOVE",
@@ -45772,6 +47089,7 @@ characters.data={
unicodeslot=0x1ECF,
},
[0x1ED0]={
+ adobename="Ocircumflexacute",
category="lu",
contextname="Ocircumflexacute",
description="LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE",
@@ -45783,6 +47101,7 @@ characters.data={
unicodeslot=0x1ED0,
},
[0x1ED1]={
+ adobename="ocircumflexacute",
category="ll",
contextname="ocircumflexacute",
description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE",
@@ -45794,6 +47113,7 @@ characters.data={
unicodeslot=0x1ED1,
},
[0x1ED2]={
+ adobename="Ocircumflexgrave",
category="lu",
contextname="Ocircumflexgrave",
description="LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE",
@@ -45805,6 +47125,7 @@ characters.data={
unicodeslot=0x1ED2,
},
[0x1ED3]={
+ adobename="ocircumflexgrave",
category="ll",
contextname="ocircumflexgrave",
description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE",
@@ -45816,6 +47137,7 @@ characters.data={
unicodeslot=0x1ED3,
},
[0x1ED4]={
+ adobename="Ocircumflexhookabove",
category="lu",
contextname="Ocircumflexhook",
description="LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE",
@@ -45827,6 +47149,7 @@ characters.data={
unicodeslot=0x1ED4,
},
[0x1ED5]={
+ adobename="ocircumflexhookabove",
category="ll",
contextname="ocircumflexhook",
description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE",
@@ -45838,6 +47161,7 @@ characters.data={
unicodeslot=0x1ED5,
},
[0x1ED6]={
+ adobename="Ocircumflextilde",
category="lu",
contextname="Ocircumflextilde",
description="LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE",
@@ -45849,6 +47173,7 @@ characters.data={
unicodeslot=0x1ED6,
},
[0x1ED7]={
+ adobename="ocircumflextilde",
category="ll",
contextname="ocircumflextilde",
description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE",
@@ -45860,6 +47185,7 @@ characters.data={
unicodeslot=0x1ED7,
},
[0x1ED8]={
+ adobename="Ocircumflexdotbelow",
category="lu",
contextname="Ocircumflexdotbelow",
description="LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW",
@@ -45871,6 +47197,7 @@ characters.data={
unicodeslot=0x1ED8,
},
[0x1ED9]={
+ adobename="ocircumflexdotbelow",
category="ll",
contextname="ocircumflexdotbelow",
description="LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW",
@@ -45882,6 +47209,7 @@ characters.data={
unicodeslot=0x1ED9,
},
[0x1EDA]={
+ adobename="Ohornacute",
category="lu",
contextname="Ohornacute",
description="LATIN CAPITAL LETTER O WITH HORN AND ACUTE",
@@ -45893,6 +47221,7 @@ characters.data={
unicodeslot=0x1EDA,
},
[0x1EDB]={
+ adobename="ohornacute",
category="ll",
contextname="ohornacute",
description="LATIN SMALL LETTER O WITH HORN AND ACUTE",
@@ -45904,6 +47233,7 @@ characters.data={
unicodeslot=0x1EDB,
},
[0x1EDC]={
+ adobename="Ohorngrave",
category="lu",
contextname="Ohorngrave",
description="LATIN CAPITAL LETTER O WITH HORN AND GRAVE",
@@ -45915,6 +47245,7 @@ characters.data={
unicodeslot=0x1EDC,
},
[0x1EDD]={
+ adobename="ohorngrave",
category="ll",
contextname="ohorngrave",
description="LATIN SMALL LETTER O WITH HORN AND GRAVE",
@@ -45926,6 +47257,7 @@ characters.data={
unicodeslot=0x1EDD,
},
[0x1EDE]={
+ adobename="Ohornhookabove",
category="lu",
contextname="Ohornhook",
description="LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE",
@@ -45937,6 +47269,7 @@ characters.data={
unicodeslot=0x1EDE,
},
[0x1EDF]={
+ adobename="ohornhookabove",
category="ll",
contextname="ohornhook",
description="LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE",
@@ -45948,6 +47281,7 @@ characters.data={
unicodeslot=0x1EDF,
},
[0x1EE0]={
+ adobename="Ohorntilde",
category="lu",
contextname="Ohorntilde",
description="LATIN CAPITAL LETTER O WITH HORN AND TILDE",
@@ -45959,6 +47293,7 @@ characters.data={
unicodeslot=0x1EE0,
},
[0x1EE1]={
+ adobename="ohorntilde",
category="ll",
contextname="ohorntilde",
description="LATIN SMALL LETTER O WITH HORN AND TILDE",
@@ -45970,6 +47305,7 @@ characters.data={
unicodeslot=0x1EE1,
},
[0x1EE2]={
+ adobename="Ohorndotbelow",
category="lu",
contextname="Ohorndotbelow",
description="LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW",
@@ -45981,6 +47317,7 @@ characters.data={
unicodeslot=0x1EE2,
},
[0x1EE3]={
+ adobename="ohorndotbelow",
category="ll",
contextname="ohorndotbelow",
description="LATIN SMALL LETTER O WITH HORN AND DOT BELOW",
@@ -45992,6 +47329,7 @@ characters.data={
unicodeslot=0x1EE3,
},
[0x1EE4]={
+ adobename="Udotbelow",
category="lu",
contextname="Udotbelow",
description="LATIN CAPITAL LETTER U WITH DOT BELOW",
@@ -46003,6 +47341,7 @@ characters.data={
unicodeslot=0x1EE4,
},
[0x1EE5]={
+ adobename="udotbelow",
category="ll",
contextname="udotbelow",
description="LATIN SMALL LETTER U WITH DOT BELOW",
@@ -46014,6 +47353,7 @@ characters.data={
unicodeslot=0x1EE5,
},
[0x1EE6]={
+ adobename="Uhookabove",
category="lu",
contextname="Uhook",
description="LATIN CAPITAL LETTER U WITH HOOK ABOVE",
@@ -46025,6 +47365,7 @@ characters.data={
unicodeslot=0x1EE6,
},
[0x1EE7]={
+ adobename="uhookabove",
category="ll",
contextname="uhook",
description="LATIN SMALL LETTER U WITH HOOK ABOVE",
@@ -46036,6 +47377,7 @@ characters.data={
unicodeslot=0x1EE7,
},
[0x1EE8]={
+ adobename="Uhornacute",
category="lu",
contextname="Uhornacute",
description="LATIN CAPITAL LETTER U WITH HORN AND ACUTE",
@@ -46047,6 +47389,7 @@ characters.data={
unicodeslot=0x1EE8,
},
[0x1EE9]={
+ adobename="uhornacute",
category="ll",
contextname="uhornacute",
description="LATIN SMALL LETTER U WITH HORN AND ACUTE",
@@ -46058,6 +47401,7 @@ characters.data={
unicodeslot=0x1EE9,
},
[0x1EEA]={
+ adobename="Uhorngrave",
category="lu",
contextname="Uhorngrave",
description="LATIN CAPITAL LETTER U WITH HORN AND GRAVE",
@@ -46069,6 +47413,7 @@ characters.data={
unicodeslot=0x1EEA,
},
[0x1EEB]={
+ adobename="uhorngrave",
category="ll",
contextname="uhorngrave",
description="LATIN SMALL LETTER U WITH HORN AND GRAVE",
@@ -46080,6 +47425,7 @@ characters.data={
unicodeslot=0x1EEB,
},
[0x1EEC]={
+ adobename="Uhornhookabove",
category="lu",
contextname="Uhornhook",
description="LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE",
@@ -46091,6 +47437,7 @@ characters.data={
unicodeslot=0x1EEC,
},
[0x1EED]={
+ adobename="uhornhookabove",
category="ll",
contextname="uhornhook",
description="LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE",
@@ -46102,6 +47449,7 @@ characters.data={
unicodeslot=0x1EED,
},
[0x1EEE]={
+ adobename="Uhorntilde",
category="lu",
contextname="Uhorntilde",
description="LATIN CAPITAL LETTER U WITH HORN AND TILDE",
@@ -46113,6 +47461,7 @@ characters.data={
unicodeslot=0x1EEE,
},
[0x1EEF]={
+ adobename="uhorntilde",
category="ll",
contextname="uhorntilde",
description="LATIN SMALL LETTER U WITH HORN AND TILDE",
@@ -46124,6 +47473,7 @@ characters.data={
unicodeslot=0x1EEF,
},
[0x1EF0]={
+ adobename="Uhorndotbelow",
category="lu",
contextname="Uhorndotbelow",
description="LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW",
@@ -46135,6 +47485,7 @@ characters.data={
unicodeslot=0x1EF0,
},
[0x1EF1]={
+ adobename="uhorndotbelow",
category="ll",
contextname="uhorndotbelow",
description="LATIN SMALL LETTER U WITH HORN AND DOT BELOW",
@@ -46170,6 +47521,7 @@ characters.data={
unicodeslot=0x1EF3,
},
[0x1EF4]={
+ adobename="Ydotbelow",
category="lu",
contextname="Ydotbelow",
description="LATIN CAPITAL LETTER Y WITH DOT BELOW",
@@ -46181,6 +47533,7 @@ characters.data={
unicodeslot=0x1EF4,
},
[0x1EF5]={
+ adobename="ydotbelow",
category="ll",
contextname="ydotbelow",
description="LATIN SMALL LETTER Y WITH DOT BELOW",
@@ -46192,6 +47545,7 @@ characters.data={
unicodeslot=0x1EF5,
},
[0x1EF6]={
+ adobename="Yhookabove",
category="lu",
contextname="Yhook",
description="LATIN CAPITAL LETTER Y WITH HOOK ABOVE",
@@ -46203,6 +47557,7 @@ characters.data={
unicodeslot=0x1EF6,
},
[0x1EF7]={
+ adobename="yhookabove",
category="ll",
contextname="yhook",
description="LATIN SMALL LETTER Y WITH HOOK ABOVE",
@@ -46214,6 +47569,7 @@ characters.data={
unicodeslot=0x1EF7,
},
[0x1EF8]={
+ adobename="Ytilde",
category="lu",
contextname="Ytilde",
description="LATIN CAPITAL LETTER Y WITH TILDE",
@@ -46225,6 +47581,7 @@ characters.data={
unicodeslot=0x1EF8,
},
[0x1EF9]={
+ adobename="ytilde",
category="ll",
contextname="ytilde",
description="LATIN SMALL LETTER Y WITH TILDE",
@@ -48759,6 +50116,7 @@ characters.data={
unicodeslot=0x2001,
},
[0x2002]={
+ adobename="enspace",
category="zs",
contextname="enspace",
description="EN SPACE",
@@ -48840,6 +50198,7 @@ characters.data={
unicodeslot=0x200A,
},
[0x200B]={
+ adobename="zerowidthspace",
category="cf",
contextname="zerowidthspace",
description="ZERO WIDTH SPACE",
@@ -48848,7 +50207,7 @@ characters.data={
unicodeslot=0x200B,
},
[0x200C]={
- adobename="afii61664",
+ adobename="zerowidthnonjoiner",
category="cf",
contextname="zwnj",
description="ZERO WIDTH NON-JOINER",
@@ -48882,6 +50241,7 @@ characters.data={
unicodeslot=0x200F,
},
[0x2010]={
+ adobename="hyphentwo",
category="pd",
cjkwd="a",
description="HYPHEN",
@@ -48927,7 +50287,7 @@ characters.data={
unicodeslot=0x2014,
},
[0x2015]={
- adobename="afii208",
+ adobename="horizontalbar",
category="pd",
cjkwd="a",
contextname="texthorizontalbar",
@@ -48937,11 +50297,30 @@ characters.data={
unicodeslot=0x2015,
},
[0x2016]={
+ adobename="dblverticalbar",
category="po",
cjkwd="a",
description="DOUBLE VERTICAL LINE",
direction="on",
linebreak="ai",
+ mathspec={
+ {
+ class="delimiter",
+ name="Vert",
+ },
+ {
+ class="nothing",
+ name="Arrowvert",
+ },
+ {
+ class="open",
+ name="lVert",
+ },
+ {
+ class="close",
+ name="rVert",
+ },
+ },
unicodeslot=0x2016,
},
[0x2017]={
@@ -49035,8 +50414,14 @@ characters.data={
direction="on",
linebreak="ai",
mathspec={
- { class="binary", name="dagger" },
- { class="box", name="dag" },
+ {
+ class="binary",
+ name="dagger",
+ },
+ {
+ class="box",
+ name="dag",
+ },
},
unicodeslot=0x2020,
},
@@ -49049,8 +50434,14 @@ characters.data={
direction="on",
linebreak="ai",
mathspec={
- { class="binary", name="ddagger" },
- { class="box", name="ddag" },
+ {
+ class="binary",
+ name="ddagger",
+ },
+ {
+ class="box",
+ name="ddag",
+ },
},
unicodeslot=0x2021,
},
@@ -49084,7 +50475,7 @@ characters.data={
unicodeslot=0x2024,
},
[0x2025]={
- adobename="twodotenleader",
+ adobename="twodotleader",
category="po",
cjkwd="a",
description="TWO DOT LEADER",
@@ -49222,6 +50613,7 @@ characters.data={
unicodeslot=0x2034,
},
[0x2035]={
+ adobename="primereversed",
category="po",
cjkwd="a",
description="REVERSED PRIME",
@@ -49273,6 +50665,7 @@ characters.data={
unicodeslot=0x203A,
},
[0x203B]={
+ adobename="referencemark",
category="po",
cjkwd="a",
description="REFERENCE MARK",
@@ -49297,6 +50690,7 @@ characters.data={
unicodeslot=0x203D,
},
[0x203E]={
+ adobename="overline",
category="po",
cjkwd="a",
description="OVERLINE",
@@ -49327,6 +50721,7 @@ characters.data={
unicodeslot=0x2041,
},
[0x2042]={
+ adobename="asterism",
category="po",
description="ASTERISM",
direction="on",
@@ -49348,8 +50743,14 @@ characters.data={
direction="cs",
linebreak="is",
mathspec={
- { class="binary", name="slash" },
- { class="close", name="solidus" },
+ {
+ class="binary",
+ name="slash",
+ },
+ {
+ class="close",
+ name="solidus",
+ },
},
unicodeslot=0x2044,
},
@@ -49623,6 +51024,7 @@ characters.data={
unicodeslot=0x206F,
},
[0x2070]={
+ adobename="zerosuperior",
category="no",
description="SUPERSCRIPT ZERO",
direction="en",
@@ -49639,6 +51041,7 @@ characters.data={
unicodeslot=0x2071,
},
[0x2074]={
+ adobename="foursuperior",
category="no",
cjkwd="a",
description="SUPERSCRIPT FOUR",
@@ -49648,6 +51051,7 @@ characters.data={
unicodeslot=0x2074,
},
[0x2075]={
+ adobename="fivesuperior",
category="no",
description="SUPERSCRIPT FIVE",
direction="en",
@@ -49656,6 +51060,7 @@ characters.data={
unicodeslot=0x2075,
},
[0x2076]={
+ adobename="sixsuperior",
category="no",
description="SUPERSCRIPT SIX",
direction="en",
@@ -49664,6 +51069,7 @@ characters.data={
unicodeslot=0x2076,
},
[0x2077]={
+ adobename="sevensuperior",
category="no",
description="SUPERSCRIPT SEVEN",
direction="en",
@@ -49672,6 +51078,7 @@ characters.data={
unicodeslot=0x2077,
},
[0x2078]={
+ adobename="eightsuperior",
category="no",
description="SUPERSCRIPT EIGHT",
direction="en",
@@ -49680,6 +51087,7 @@ characters.data={
unicodeslot=0x2078,
},
[0x2079]={
+ adobename="ninesuperior",
category="no",
description="SUPERSCRIPT NINE",
direction="en",
@@ -49688,6 +51096,7 @@ characters.data={
unicodeslot=0x2079,
},
[0x207A]={
+ adobename="plussuperior",
category="sm",
description="SUPERSCRIPT PLUS SIGN",
direction="es",
@@ -49704,6 +51113,7 @@ characters.data={
unicodeslot=0x207B,
},
[0x207C]={
+ adobename="equalsuperior",
category="sm",
description="SUPERSCRIPT EQUALS SIGN",
direction="on",
@@ -49712,6 +51122,7 @@ characters.data={
unicodeslot=0x207C,
},
[0x207D]={
+ adobename="parenleftsuperior",
category="ps",
description="SUPERSCRIPT LEFT PARENTHESIS",
direction="on",
@@ -49721,6 +51132,7 @@ characters.data={
unicodeslot=0x207D,
},
[0x207E]={
+ adobename="parenrightsuperior",
category="pe",
description="SUPERSCRIPT RIGHT PARENTHESIS",
direction="on",
@@ -49730,6 +51142,7 @@ characters.data={
unicodeslot=0x207E,
},
[0x207F]={
+ adobename="nsuperior",
category="ll",
cjkwd="a",
description="SUPERSCRIPT LATIN SMALL LETTER N",
@@ -49739,6 +51152,7 @@ characters.data={
unicodeslot=0x207F,
},
[0x2080]={
+ adobename="zeroinferior",
category="no",
description="SUBSCRIPT ZERO",
direction="en",
@@ -49747,6 +51161,7 @@ characters.data={
unicodeslot=0x2080,
},
[0x2081]={
+ adobename="oneinferior",
category="no",
cjkwd="a",
description="SUBSCRIPT ONE",
@@ -49756,6 +51171,7 @@ characters.data={
unicodeslot=0x2081,
},
[0x2082]={
+ adobename="twoinferior",
category="no",
cjkwd="a",
description="SUBSCRIPT TWO",
@@ -49765,6 +51181,7 @@ characters.data={
unicodeslot=0x2082,
},
[0x2083]={
+ adobename="threeinferior",
category="no",
cjkwd="a",
description="SUBSCRIPT THREE",
@@ -49774,6 +51191,7 @@ characters.data={
unicodeslot=0x2083,
},
[0x2084]={
+ adobename="fourinferior",
category="no",
cjkwd="a",
description="SUBSCRIPT FOUR",
@@ -49783,6 +51201,7 @@ characters.data={
unicodeslot=0x2084,
},
[0x2085]={
+ adobename="fiveinferior",
category="no",
description="SUBSCRIPT FIVE",
direction="en",
@@ -49791,6 +51210,7 @@ characters.data={
unicodeslot=0x2085,
},
[0x2086]={
+ adobename="sixinferior",
category="no",
description="SUBSCRIPT SIX",
direction="en",
@@ -49799,6 +51219,7 @@ characters.data={
unicodeslot=0x2086,
},
[0x2087]={
+ adobename="seveninferior",
category="no",
description="SUBSCRIPT SEVEN",
direction="en",
@@ -49807,6 +51228,7 @@ characters.data={
unicodeslot=0x2087,
},
[0x2088]={
+ adobename="eightinferior",
category="no",
description="SUBSCRIPT EIGHT",
direction="en",
@@ -49815,6 +51237,7 @@ characters.data={
unicodeslot=0x2088,
},
[0x2089]={
+ adobename="nineinferior",
category="no",
description="SUBSCRIPT NINE",
direction="en",
@@ -49847,6 +51270,7 @@ characters.data={
unicodeslot=0x208C,
},
[0x208D]={
+ adobename="parenleftinferior",
category="ps",
description="SUBSCRIPT LEFT PARENTHESIS",
direction="on",
@@ -49856,6 +51280,7 @@ characters.data={
unicodeslot=0x208D,
},
[0x208E]={
+ adobename="parenrightinferior",
category="pe",
description="SUBSCRIPT RIGHT PARENTHESIS",
direction="on",
@@ -49912,7 +51337,7 @@ characters.data={
unicodeslot=0x20A0,
},
[0x20A1]={
- adobename="colonmonetary",
+ adobename="colonsign",
category="sc",
description="COLON SIGN",
direction="et",
@@ -49920,6 +51345,7 @@ characters.data={
unicodeslot=0x20A1,
},
[0x20A2]={
+ adobename="cruzeiro",
category="sc",
description="CRUZEIRO SIGN",
direction="et",
@@ -49973,6 +51399,7 @@ characters.data={
unicodeslot=0x20A8,
},
[0x20A9]={
+ adobename="won",
category="sc",
cjkwd="h",
description="WON SIGN",
@@ -49981,7 +51408,7 @@ characters.data={
unicodeslot=0x20A9,
},
[0x20AA]={
- adobename="afii57636",
+ adobename="sheqelhebrew",
category="sc",
description="NEW SHEQEL SIGN",
direction="et",
@@ -49998,7 +51425,7 @@ characters.data={
unicodeslot=0x20AB,
},
[0x20AC]={
- adobename="Euro",
+ adobename="euro",
category="sc",
cjkwd="a",
contextname="texteuro",
@@ -50171,8 +51598,14 @@ characters.data={
direction="nsm",
linebreak="cm",
mathspec={
- { class="default",name="bigcircle" },
- { class="binary",name="bigcircle" },
+ {
+ class="default",
+ name="bigcircle",
+ },
+ {
+ class="binary",
+ name="bigcircle",
+ },
},
unicodeslot=0x20DD,
},
@@ -50334,10 +51767,11 @@ characters.data={
unicodeslot=0x2102,
},
[0x2103]={
+ adobename="centigrade",
category="so",
cjkwd="a",
- description="DEGREE CELSIUS",
contextname="textcelsius",
+ description="DEGREE CELSIUS",
direction="on",
linebreak="po",
specials={ "compat", 0x00B0, 0x0043 },
@@ -50351,7 +51785,7 @@ characters.data={
unicodeslot=0x2104,
},
[0x2105]={
- adobename="afii61248",
+ adobename="careof",
category="so",
cjkwd="a",
description="CARE OF",
@@ -50373,6 +51807,8 @@ characters.data={
description="EULER CONSTANT",
direction="l",
linebreak="al",
+ mathclass="variable",
+ mathname="Eulerconst",
specials={ "compat", 0x0190 },
unicodeslot=0x2107,
},
@@ -50384,6 +51820,7 @@ characters.data={
unicodeslot=0x2108,
},
[0x2109]={
+ adobename="fahrenheit",
category="so",
cjkwd="a",
description="DEGREE FAHRENHEIT",
@@ -50429,6 +51866,8 @@ characters.data={
description="PLANCK CONSTANT",
direction="l",
linebreak="al",
+ mathclass="variable",
+ mathname="Plankconst",
specials={ "font", 0x0068 },
unicodeslot=0x210E,
},
@@ -50470,7 +51909,7 @@ characters.data={
unicodeslot=0x2112,
},
[0x2113]={
- adobename="afii61289",
+ adobename="lsquare",
category="ll",
cjkwd="a",
description="SCRIPT SMALL L",
@@ -50499,7 +51938,7 @@ characters.data={
unicodeslot=0x2115,
},
[0x2116]={
- adobename="afii61352",
+ adobename="numero",
category="so",
cjkwd="a",
contextname="textnumero",
@@ -50600,6 +52039,7 @@ characters.data={
unicodeslot=0x2120,
},
[0x2121]={
+ adobename="telephone",
category="so",
cjkwd="a",
description="TELEPHONE SIGN",
@@ -50648,20 +52088,20 @@ characters.data={
adobename="Omega",
category="lu",
cjkwd="a",
- description="OHM SIGN",
contextname="textohm",
+ description="OHM SIGN",
direction="l",
- lccode=0x03C9, --AM: Not sure?
+ lccode=0x03C9,
linebreak="al",
mathclass="variable",
- mathname="ohm", --AM: Should we do this or does specials take care of it
+ mathname="ohm",
specials={ "char", 0x03A9 },
unicodeslot=0x2126,
},
[0x2127]={
category="so",
- description="INVERTED OHM SIGN",
contextname="textmho",
+ description="INVERTED OHM SIGN",
direction="on",
linebreak="al",
mathclass="variable",
@@ -50681,24 +52121,27 @@ characters.data={
description="TURNED GREEK SMALL LETTER IOTA",
direction="on",
linebreak="al",
+ mathclass="variable",
+ mathname="turnediota",
unicodeslot=0x2129,
},
[0x212A]={
category="lu",
+ contextname="textkelvin",
description="KELVIN SIGN",
direction="l",
- contextname="textkelvin",
lccode=0x006B,
linebreak="al",
specials={ "char", 0x004B },
unicodeslot=0x212A,
},
[0x212B]={
+ adobename="angstrom",
category="lu",
cjkwd="a",
+ contextname="textAngstrom",
description="ANGSTROM SIGN",
direction="l",
- contextname="textAngstrom",
lccode=0x00E5,
linebreak="ai",
mathclass="variable",
@@ -50796,7 +52239,7 @@ characters.data={
description="BET SYMBOL",
direction="l",
linebreak="al",
- mathclass="ord",
+ mathclass="default",
mathname="beth",
specials={ "compat", 0x05D1 },
unicodeslot=0x2136,
@@ -50806,7 +52249,7 @@ characters.data={
description="GIMEL SYMBOL",
direction="l",
linebreak="al",
- mathclass="ord",
+ mathclass="default",
mathname="gimel",
specials={ "compat", 0x05D2 },
unicodeslot=0x2137,
@@ -50816,7 +52259,7 @@ characters.data={
description="DALET SYMBOL",
direction="l",
linebreak="al",
- mathclass="ord",
+ mathclass="default",
mathname="daleth",
specials={ "compat", 0x05D3 },
unicodeslot=0x2138,
@@ -50895,23 +52338,29 @@ characters.data={
},
[0x2142]={
category="sm",
+ comment="mathname=sansLturned",
description="TURNED SANS-SERIF CAPITAL L",
direction="on",
linebreak="al",
+ mathclass="ord",
unicodeslot=0x2142,
},
[0x2143]={
category="sm",
+ comment="mathname=sansLmirrored",
description="REVERSED SANS-SERIF CAPITAL L",
direction="on",
linebreak="al",
+ mathclass="ord",
unicodeslot=0x2143,
},
[0x2144]={
category="sm",
+ comment="mathname=Yup",
description="TURNED SANS-SERIF CAPITAL Y",
direction="on",
linebreak="al",
+ mathclass="ord",
unicodeslot=0x2144,
},
[0x2145]={
@@ -50969,6 +52418,8 @@ characters.data={
description="PROPERTY LINE",
direction="on",
linebreak="al",
+ mathclass="ord",
+ mathname="PropertyLine",
unicodeslot=0x214A,
},
[0x214B]={
@@ -50976,6 +52427,8 @@ characters.data={
description="TURNED AMPERSAND",
direction="on",
linebreak="al",
+ mathclass="bin",
+ mathname="upand",
unicodeslot=0x214B,
},
[0x214C]={
@@ -51129,6 +52582,7 @@ characters.data={
unicodeslot=0x215F,
},
[0x2160]={
+ adobename="Oneroman",
category="nl",
cjkwd="a",
contextname="romanI",
@@ -51140,6 +52594,7 @@ characters.data={
unicodeslot=0x2160,
},
[0x2161]={
+ adobename="Tworoman",
category="nl",
cjkwd="a",
contextname="romanII",
@@ -51151,6 +52606,7 @@ characters.data={
unicodeslot=0x2161,
},
[0x2162]={
+ adobename="Threeroman",
category="nl",
cjkwd="a",
contextname="romanIII",
@@ -51162,6 +52618,7 @@ characters.data={
unicodeslot=0x2162,
},
[0x2163]={
+ adobename="Fourroman",
category="nl",
cjkwd="a",
contextname="romanIV",
@@ -51173,6 +52630,7 @@ characters.data={
unicodeslot=0x2163,
},
[0x2164]={
+ adobename="Fiveroman",
category="nl",
cjkwd="a",
contextname="romanV",
@@ -51184,6 +52642,7 @@ characters.data={
unicodeslot=0x2164,
},
[0x2165]={
+ adobename="Sixroman",
category="nl",
cjkwd="a",
contextname="romanVI",
@@ -51195,6 +52654,7 @@ characters.data={
unicodeslot=0x2165,
},
[0x2166]={
+ adobename="Sevenroman",
category="nl",
cjkwd="a",
contextname="romanVII",
@@ -51206,6 +52666,7 @@ characters.data={
unicodeslot=0x2166,
},
[0x2167]={
+ adobename="Eightroman",
category="nl",
cjkwd="a",
contextname="romanVIII",
@@ -51217,6 +52678,7 @@ characters.data={
unicodeslot=0x2167,
},
[0x2168]={
+ adobename="Nineroman",
category="nl",
cjkwd="a",
contextname="romanIX",
@@ -51228,6 +52690,7 @@ characters.data={
unicodeslot=0x2168,
},
[0x2169]={
+ adobename="Tenroman",
category="nl",
cjkwd="a",
contextname="romanX",
@@ -51239,6 +52702,7 @@ characters.data={
unicodeslot=0x2169,
},
[0x216A]={
+ adobename="Elevenroman",
category="nl",
cjkwd="a",
contextname="romanXI",
@@ -51250,6 +52714,7 @@ characters.data={
unicodeslot=0x216A,
},
[0x216B]={
+ adobename="Twelveroman",
category="nl",
cjkwd="a",
contextname="romanXII",
@@ -51301,6 +52766,7 @@ characters.data={
unicodeslot=0x216F,
},
[0x2170]={
+ adobename="oneroman",
category="nl",
cjkwd="a",
contextname="romani",
@@ -51312,6 +52778,7 @@ characters.data={
unicodeslot=0x2170,
},
[0x2171]={
+ adobename="tworoman",
category="nl",
cjkwd="a",
contextname="romanii",
@@ -51323,6 +52790,7 @@ characters.data={
unicodeslot=0x2171,
},
[0x2172]={
+ adobename="threeroman",
category="nl",
cjkwd="a",
contextname="romaniii",
@@ -51334,6 +52802,7 @@ characters.data={
unicodeslot=0x2172,
},
[0x2173]={
+ adobename="fourroman",
category="nl",
cjkwd="a",
contextname="romaniv",
@@ -51345,6 +52814,7 @@ characters.data={
unicodeslot=0x2173,
},
[0x2174]={
+ adobename="fiveroman",
category="nl",
cjkwd="a",
contextname="romanv",
@@ -51356,6 +52826,7 @@ characters.data={
unicodeslot=0x2174,
},
[0x2175]={
+ adobename="sixroman",
category="nl",
cjkwd="a",
contextname="romanvi",
@@ -51367,6 +52838,7 @@ characters.data={
unicodeslot=0x2175,
},
[0x2176]={
+ adobename="sevenroman",
category="nl",
cjkwd="a",
contextname="romanvii",
@@ -51378,6 +52850,7 @@ characters.data={
unicodeslot=0x2176,
},
[0x2177]={
+ adobename="eightroman",
category="nl",
cjkwd="a",
contextname="romanviii",
@@ -51389,6 +52862,7 @@ characters.data={
unicodeslot=0x2177,
},
[0x2178]={
+ adobename="nineroman",
category="nl",
cjkwd="a",
contextname="romanix",
@@ -51400,6 +52874,7 @@ characters.data={
unicodeslot=0x2178,
},
[0x2179]={
+ adobename="tenroman",
category="nl",
cjkwd="a",
contextname="romanx",
@@ -51411,6 +52886,7 @@ characters.data={
unicodeslot=0x2179,
},
[0x217A]={
+ adobename="elevenroman",
category="nl",
contextname="romanxi",
description="SMALL ROMAN NUMERAL ELEVEN",
@@ -51421,6 +52897,7 @@ characters.data={
unicodeslot=0x217A,
},
[0x217B]={
+ adobename="twelveroman",
category="nl",
contextname="romanxii",
description="SMALL ROMAN NUMERAL TWELVE",
@@ -51515,10 +52992,22 @@ characters.data={
direction="on",
linebreak="ai",
mathspec={
- { class="relation", name="leftarrow" },
- { class="relation", name="gets" },
- { class="under", name="underleftarrow" },
- { class="over", name="overleftarrow" },
+ {
+ class="relation",
+ name="leftarrow",
+ },
+ {
+ class="relation",
+ name="gets",
+ },
+ {
+ class="under",
+ name="underleftarrow",
+ },
+ {
+ class="over",
+ name="overleftarrow",
+ },
},
mathstretch="h",
unicodeslot=0x2190,
@@ -51542,10 +53031,22 @@ characters.data={
direction="on",
linebreak="ai",
mathspec={
- { class="relation",name="rightarrow" },
- { class="relation",name="to" },
- { class="under", name="underrightarrow" },
- { class="over", name="overrightarrow" },
+ {
+ class="relation",
+ name="rightarrow",
+ },
+ {
+ class="relation",
+ name="to",
+ },
+ {
+ class="under",
+ name="underrightarrow",
+ },
+ {
+ class="over",
+ name="overrightarrow",
+ },
},
mathstretch="h",
unicodeslot=0x2192,
@@ -51584,6 +53085,7 @@ characters.data={
unicodeslot=0x2195,
},
[0x2196]={
+ adobename="arrowupleft",
category="so",
cjkwd="a",
description="NORTH WEST ARROW",
@@ -51594,6 +53096,7 @@ characters.data={
unicodeslot=0x2196,
},
[0x2197]={
+ adobename="arrowupright",
category="so",
cjkwd="a",
description="NORTH EAST ARROW",
@@ -51604,6 +53107,7 @@ characters.data={
unicodeslot=0x2197,
},
[0x2198]={
+ adobename="arrowdownright",
category="so",
cjkwd="a",
description="SOUTH EAST ARROW",
@@ -51614,6 +53118,7 @@ characters.data={
unicodeslot=0x2198,
},
[0x2199]={
+ adobename="arrowdownleft",
category="so",
cjkwd="a",
description="SOUTH WEST ARROW",
@@ -51648,6 +53153,8 @@ characters.data={
description="LEFTWARDS WAVE ARROW",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="leftwavearrow",
unicodeslot=0x219C,
},
[0x219D]={
@@ -51655,6 +53162,8 @@ characters.data={
description="RIGHTWARDS WAVE ARROW",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="rightwavearrow",
unicodeslot=0x219D,
},
[0x219E]={
@@ -51672,7 +53181,7 @@ characters.data={
direction="on",
linebreak="al",
mathclass="relation",
- mathname="twoheadupleftarrow",
+ mathname="twoheaduparrow",
unicodeslot=0x219F,
},
[0x21A0]={
@@ -51690,7 +53199,7 @@ characters.data={
direction="on",
linebreak="al",
mathclass="relation",
- mathname="twoheaddownleftarrow",
+ mathname="twoheaddownarrow",
unicodeslot=0x21A1,
},
[0x21A2]={
@@ -51716,6 +53225,8 @@ characters.data={
description="LEFTWARDS ARROW FROM BAR",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="mapsfrom",
unicodeslot=0x21A4,
},
[0x21A5]={
@@ -51723,6 +53234,8 @@ characters.data={
description="UPWARDS ARROW FROM BAR",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="mapsup",
unicodeslot=0x21A5,
},
[0x21A6]={
@@ -51730,7 +53243,6 @@ characters.data={
description="RIGHTWARDS ARROW FROM BAR",
direction="on",
linebreak="al",
- fallback=[[\mapstochar\rightarrow]],
mathclass="relation",
mathname="mapsto",
unicodeslot=0x21A6,
@@ -51740,14 +53252,18 @@ characters.data={
description="DOWNWARDS ARROW FROM BAR",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="mapsdown",
unicodeslot=0x21A7,
},
[0x21A8]={
- adobename="arrowupdnbse",
+ adobename="arrowupdownbase",
category="so",
description="UP DOWN ARROW WITH BASE",
direction="on",
linebreak="al",
+ mathclass="ord",
+ mathname="updownarrowbar",
unicodeslot=0x21A8,
},
[0x21A9]={
@@ -51755,7 +53271,6 @@ characters.data={
description="LEFTWARDS ARROW WITH HOOK",
direction="on",
linebreak="al",
- fallback=[[\leftarrow\joinrel\rhook]],
mathclass="relation",
mathname="hookleftarrow",
unicodeslot=0x21A9,
@@ -51765,7 +53280,6 @@ characters.data={
description="RIGHTWARDS ARROW WITH HOOK",
direction="on",
linebreak="al",
- fallback=[[\lhook\joinrel\rightarrow]],
mathclass="relation",
mathname="hookrightarrow",
unicodeslot=0x21AA,
@@ -51812,6 +53326,8 @@ characters.data={
description="DOWNWARDS ZIGZAG ARROW",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="downzigzagarrow",
unicodeslot=0x21AF,
},
[0x21B0]={
@@ -51838,7 +53354,7 @@ characters.data={
direction="on",
linebreak="al",
mathclass="relation",
- mathname="dlsh", -- from mathabx
+ mathname="Ldsh",
unicodeslot=0x21B2,
},
[0x21B3]={
@@ -51847,7 +53363,7 @@ characters.data={
direction="on",
linebreak="al",
mathclass="relation",
- mathname="drsh", -- from mathabx
+ mathname="Rdsh",
unicodeslot=0x21B3,
},
[0x21B4]={
@@ -51855,15 +53371,19 @@ characters.data={
description="RIGHTWARDS ARROW WITH CORNER DOWNWARDS",
direction="on",
linebreak="al",
+ mathclass="ord",
+ mathname="linefeed",
unicodeslot=0x21B4,
},
[0x21B5]={
adobename="carriagereturn",
- contextname="carriagereturn",
category="so",
+ contextname="carriagereturn",
description="DOWNWARDS ARROW WITH CORNER LEFTWARDS",
direction="on",
linebreak="al",
+ mathclass="ord",
+ mathname="carriagereturn",
unicodeslot=0x21B5,
},
[0x21B6]={
@@ -51890,6 +53410,8 @@ characters.data={
description="NORTH WEST ARROW TO LONG BAR",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="barovernorthwestarrow",
unicodeslot=0x21B8,
},
[0x21B9]={
@@ -51898,6 +53420,8 @@ characters.data={
description="LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="barleftarrowrightarrowbar",
unicodeslot=0x21B9,
},
[0x21BA]={
@@ -51905,8 +53429,16 @@ characters.data={
description="ANTICLOCKWISE OPEN CIRCLE ARROW",
direction="on",
linebreak="al",
- mathclass="relation",
- mathname="circlearrowright",
+ mathspec={
+ {
+ class="relation",
+ name="circlearrowright",
+ },
+ {
+ class="relation",
+ name="acwopencirclearrow",
+ },
+ },
unicodeslot=0x21BA,
},
[0x21BB]={
@@ -51914,11 +53446,20 @@ characters.data={
description="CLOCKWISE OPEN CIRCLE ARROW",
direction="on",
linebreak="al",
- mathclass="relation",
- mathname="circlearrowleft",
+ mathspec={
+ {
+ class="relation",
+ name="circlearrowleft",
+ },
+ {
+ class="relation",
+ name="cwopencirclearrow",
+ },
+ },
unicodeslot=0x21BB,
},
[0x21BC]={
+ adobename="harpoonleftbarbup",
category="so",
description="LEFTWARDS HARPOON WITH BARB UPWARDS",
direction="on",
@@ -51942,8 +53483,14 @@ characters.data={
direction="on",
linebreak="al",
mathspec={
- { class="relation", name="upharpoonright" },
- { class="relation", name="restriction" },
+ {
+ class="relation",
+ name="upharpoonright",
+ },
+ {
+ class="relation",
+ name="restriction",
+ },
},
unicodeslot=0x21BE,
},
@@ -51957,6 +53504,7 @@ characters.data={
unicodeslot=0x21BF,
},
[0x21C0]={
+ adobename="harpoonrightbarbup",
category="so",
description="RIGHTWARDS HARPOON WITH BARB UPWARDS",
direction="on",
@@ -51993,6 +53541,7 @@ characters.data={
unicodeslot=0x21C3,
},
[0x21C4]={
+ adobename="arrowrightoverleft",
category="so",
description="RIGHTWARDS ARROW OVER LEFTWARDS ARROW",
direction="on",
@@ -52002,6 +53551,7 @@ characters.data={
unicodeslot=0x21C4,
},
[0x21C5]={
+ adobename="arrowupleftofdown",
category="so",
description="UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW",
direction="on",
@@ -52011,6 +53561,7 @@ characters.data={
unicodeslot=0x21C5,
},
[0x21C6]={
+ adobename="arrowleftoverright",
category="so",
description="LEFTWARDS ARROW OVER RIGHTWARDS ARROW",
direction="on",
@@ -52074,6 +53625,7 @@ characters.data={
unicodeslot=0x21CC,
},
[0x21CD]={
+ adobename="arrowleftdblstroke",
category="so",
description="LEFTWARDS DOUBLE ARROW WITH STROKE",
direction="on",
@@ -52094,6 +53646,7 @@ characters.data={
unicodeslot=0x21CE,
},
[0x21CF]={
+ adobename="arrowrightdblstroke",
category="sm",
description="RIGHTWARDS DOUBLE ARROW WITH STROKE",
direction="on",
@@ -52104,7 +53657,7 @@ characters.data={
unicodeslot=0x21CF,
},
[0x21D0]={
- adobename="arrowdblleft",
+ adobename="arrowleftdbl",
category="so",
description="LEFTWARDS DOUBLE ARROW",
direction="on",
@@ -52124,7 +53677,7 @@ characters.data={
unicodeslot=0x21D1,
},
[0x21D2]={
- adobename="arrowdblright",
+ adobename="dblarrowright",
category="sm",
cjkwd="a",
description="RIGHTWARDS DOUBLE ARROW",
@@ -52145,7 +53698,7 @@ characters.data={
unicodeslot=0x21D3,
},
[0x21D4]={
- adobename="arrowdblboth",
+ adobename="dblarrowleft",
category="sm",
cjkwd="a",
description="LEFT RIGHT DOUBLE ARROW",
@@ -52233,107 +53786,148 @@ characters.data={
direction="on",
linebreak="al",
mathspec={
- { class="relation",name="rightsquigarrow" },
- { class="relation",name="leadsto" },
+ {
+ class="relation",
+ name="rightsquigarrow",
+ },
+ {
+ class="relation",
+ name="leadsto",
+ },
},
unicodeslot=0x21DD,
},
[0x21DE]={
+ adobename="pageup",
category="so",
description="UPWARDS ARROW WITH DOUBLE STROKE",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="nHuparrow",
unicodeslot=0x21DE,
},
[0x21DF]={
+ adobename="pagedown",
category="so",
description="DOWNWARDS ARROW WITH DOUBLE STROKE",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="nHdownarrow",
unicodeslot=0x21DF,
},
[0x21E0]={
+ adobename="arrowdashleft",
category="so",
description="LEFTWARDS DASHED ARROW",
direction="on",
linebreak="al",
mathclass="relation",
- mathname="dashleftarrow",
+ mathname="leftdasharrow",
unicodeslot=0x21E0,
},
[0x21E1]={
+ adobename="arrowdashup",
category="so",
description="UPWARDS DASHED ARROW",
direction="on",
linebreak="al",
mathclass="relation",
- mathname="dashuparrow",
+ mathname="updasharrow",
unicodeslot=0x21E1,
},
[0x21E2]={
+ adobename="arrowdashright",
category="so",
description="RIGHTWARDS DASHED ARROW",
direction="on",
linebreak="al",
mathspec={
- { class="relation", name="dashrightarrow" } ,
- { class="relation", name="dasharrow" } ,
+ {
+ class="relation",
+ name="rightdasharrow",
+ },
+ {
+ class="relation",
+ name="dasharrow",
+ },
},
unicodeslot=0x21E2,
},
[0x21E3]={
+ adobename="arrowdashdown",
category="so",
description="DOWNWARDS DASHED ARROW",
direction="on",
linebreak="al",
mathclass="relation",
- mathname="dashdownarrow",
+ mathname="downdasharrow",
unicodeslot=0x21E3,
},
[0x21E4]={
+ adobename="arrowtableft",
category="so",
description="LEFTWARDS ARROW TO BAR",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="barleftarrow",
unicodeslot=0x21E4,
},
[0x21E5]={
+ adobename="arrowtabright",
category="so",
description="RIGHTWARDS ARROW TO BAR",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="rightarrowbar",
unicodeslot=0x21E5,
},
[0x21E6]={
+ adobename="arrowleftwhite",
category="so",
description="LEFTWARDS WHITE ARROW",
direction="on",
linebreak="al",
+ mathclass="ord",
+ mathname="leftwhitearrow",
unicodeslot=0x21E6,
},
[0x21E7]={
+ adobename="arrowupwhite",
category="so",
cjkwd="a",
description="UPWARDS WHITE ARROW",
direction="on",
linebreak="al",
+ mathclass="ord",
+ mathname="upwhitearrow",
unicodeslot=0x21E7,
},
[0x21E8]={
+ adobename="arrowrightwhite",
category="so",
description="RIGHTWARDS WHITE ARROW",
direction="on",
linebreak="al",
+ mathclass="ord",
+ mathname="rightwhitearrow",
unicodeslot=0x21E8,
},
[0x21E9]={
+ adobename="arrowdownwhite",
category="so",
description="DOWNWARDS WHITE ARROW",
direction="on",
linebreak="al",
+ mathclass="ord",
+ mathname="downwhitearrow",
unicodeslot=0x21E9,
},
[0x21EA]={
+ adobename="capslock",
category="so",
description="UPWARDS WHITE ARROW FROM BAR",
direction="on",
@@ -52345,6 +53939,8 @@ characters.data={
description="UPWARDS WHITE ARROW ON PEDESTAL",
direction="on",
linebreak="al",
+ mathclass="ord",
+ mathname="whitearrowupfrombar",
unicodeslot=0x21EB,
},
[0x21EC]={
@@ -52408,6 +54004,8 @@ characters.data={
description="RIGHT ARROW WITH SMALL CIRCLE",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="circleonrightarrow",
unicodeslot=0x21F4,
},
[0x21F5]={
@@ -52415,6 +54013,8 @@ characters.data={
description="DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="downuparrows",
unicodeslot=0x21F5,
},
[0x21F6]={
@@ -52422,6 +54022,8 @@ characters.data={
description="THREE RIGHTWARDS ARROWS",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="rightthreearrows",
unicodeslot=0x21F6,
},
[0x21F7]={
@@ -52429,6 +54031,8 @@ characters.data={
description="LEFTWARDS ARROW WITH VERTICAL STROKE",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="nvleftarrow",
unicodeslot=0x21F7,
},
[0x21F8]={
@@ -52436,6 +54040,8 @@ characters.data={
description="RIGHTWARDS ARROW WITH VERTICAL STROKE",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="nvrightarrow",
unicodeslot=0x21F8,
},
[0x21F9]={
@@ -52443,6 +54049,8 @@ characters.data={
description="LEFT RIGHT ARROW WITH VERTICAL STROKE",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="nvleftrightarrow",
unicodeslot=0x21F9,
},
[0x21FA]={
@@ -52450,6 +54058,8 @@ characters.data={
description="LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="nVleftarrow",
unicodeslot=0x21FA,
},
[0x21FB]={
@@ -52457,6 +54067,8 @@ characters.data={
description="RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="nVrightarrow",
unicodeslot=0x21FB,
},
[0x21FC]={
@@ -52464,6 +54076,8 @@ characters.data={
description="LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE",
direction="on",
linebreak="al",
+ mathclass="relation",
+ mathname="nVleftrightarrow",
unicodeslot=0x21FC,
},
[0x21FD]={
@@ -52525,7 +54139,7 @@ characters.data={
unicodeslot=0x2202,
},
[0x2203]={
- adobename="existential",
+ adobename="thereexists",
category="sm",
cjkwd="a",
description="THERE EXISTS",
@@ -52556,7 +54170,7 @@ characters.data={
unicodeslot=0x2205,
},
[0x2206]={
- adobename="Delta",
+ adobename="increment",
category="sm",
description="INCREMENT",
direction="on",
@@ -52564,7 +54178,7 @@ characters.data={
unicodeslot=0x2206,
},
[0x2207]={
- adobename="gradient",
+ adobename="nabla",
category="sm",
cjkwd="a",
description="NABLA",
@@ -52585,14 +54199,14 @@ characters.data={
unicodeslot=0x2208,
},
[0x2209]={
- adobename="notelement",
+ adobename="notelementof",
category="sm",
description="NOT AN ELEMENT OF",
direction="on",
linebreak="al",
- mirror=0x220C,
mathclass="relation",
mathname="nin",
+ mirror=0x220C,
specials={ "char", 0x2208, 0x0338 },
unicodeslot=0x2209,
},
@@ -52612,23 +54226,36 @@ characters.data={
direction="on",
linebreak="ai",
mathspec={
- { class="relation", name="ni" },
- { class="relation", name="owns" },
+ {
+ class="relation",
+ name="ni",
+ },
+ {
+ class="relation",
+ name="owns",
+ },
},
mirror=0x2208,
unicodeslot=0x220B,
},
[0x220C]={
+ adobename="notcontains",
category="sm",
description="DOES NOT CONTAIN AS MEMBER",
direction="on",
linebreak="al",
- mirror=0x2209,
- specials={ "char", 0x220B, 0x0338 },
mathspec={
- { class="relation", name="nni" },
- { class="relation", name="nowns" },
+ {
+ class="relation",
+ name="nni",
+ },
+ {
+ class="relation",
+ name="nowns",
+ },
},
+ mirror=0x2209,
+ specials={ "char", 0x220B, 0x0338 },
unicodeslot=0x220C,
},
[0x220D]={
@@ -52657,7 +54284,7 @@ characters.data={
mathname="prod",
unicodeslot=0x220F,
},
-[0x2210]={
+ [0x2210]={
category="sm",
description="N-ARY COPRODUCT",
direction="on",
@@ -52687,6 +54314,7 @@ characters.data={
unicodeslot=0x2212,
},
[0x2213]={
+ adobename="minusplus",
category="sm",
description="MINUS-OR-PLUS SIGN",
direction="et",
@@ -52705,26 +54333,27 @@ characters.data={
unicodeslot=0x2214,
},
[0x2215]={
+ adobename="divisionslash",
category="sm",
cjkwd="a",
+ comment="mathclass=ord,mathname=diagup",
description="DIVISION SLASH",
direction="on",
linebreak="ai",
- --~ mathclass="ord",
- --~ mathname="diagup",
mirror=0x29F5,
unicodeslot=0x2215,
},
- -- AM: diagup and diagdown are mapped to 2215 and 2216 by Tralics,
- -- but ams uses different symbols for setminus and diagdown.
[0x2216]={
category="sm",
+ comment="mathclass=ord,mathname=diagdown",
description="SET MINUS",
direction="on",
linebreak="al",
mathspec={
- { class="binary", name="setminus" },
- --~ { class="ord", name="diagdown" },
+ {
+ class="binary",
+ name="setminus",
+ },
},
unicodeslot=0x2216,
},
@@ -52748,6 +54377,7 @@ characters.data={
unicodeslot=0x2218,
},
[0x2219]={
+ adobename="bulletoperator",
category="sm",
description="BULLET OPERATOR",
direction="on",
@@ -52804,14 +54434,14 @@ characters.data={
unicodeslot=0x221E,
},
[0x221F]={
- adobename="orthogonal",
+ adobename="rightangle",
category="sm",
cjkwd="a",
description="RIGHT ANGLE",
direction="on",
+ linebreak="ai",
mathclass="ord",
mathname="rightangle",
- linebreak="ai",
unicodeslot=0x221F,
},
[0x2220]={
@@ -52844,6 +54474,7 @@ characters.data={
unicodeslot=0x2222,
},
[0x2223]={
+ adobename="divides",
category="sm",
cjkwd="a",
description="DIVIDES",
@@ -52858,29 +54489,36 @@ characters.data={
description="DOES NOT DIVIDE",
direction="on",
linebreak="al",
- specials={ "char", 0x2223, 0x0338 },
mathspec={
- { class="binary", name="ndivides", },
- { class="relation", name="nmid", },
+ {
+ class="binary",
+ name="ndivides",
+ },
+ {
+ class="relation",
+ name="nmid",
+ },
},
+ specials={ "char", 0x2223, 0x0338 },
unicodeslot=0x2224,
},
[0x2225]={
+ adobename="parallel",
category="sm",
cjkwd="a",
description="PARALLEL TO",
direction="on",
linebreak="ai",
mathspec={
- { class="relation", name="parallel" },
- { class="delimiter", name="Vert" },
- { class="nothing", name="Arrowvert" },
- { class="open", name="lVert" },
- { class="close", name="rVert" },
+ {
+ class="relation",
+ name="parallel",
+ },
},
unicodeslot=0x2225,
},
[0x2226]={
+ adobename="notparallel",
category="sm",
description="NOT PARALLEL TO",
direction="on",
@@ -52898,8 +54536,14 @@ characters.data={
direction="on",
linebreak="ai",
mathspec={
- { class="binary", name="wedge" },
- { class="binary", name="land" },
+ {
+ class="binary",
+ name="wedge",
+ },
+ {
+ class="binary",
+ name="land",
+ },
},
unicodeslot=0x2227,
},
@@ -52911,8 +54555,14 @@ characters.data={
direction="on",
linebreak="ai",
mathspec={
- { class="bin",name="vee" },
- { class="bin",name="lor" },
+ {
+ class="bin",
+ name="vee",
+ },
+ {
+ class="bin",
+ name="lor",
+ },
},
unicodeslot=0x2228,
},
@@ -52946,22 +54596,35 @@ characters.data={
direction="on",
linebreak="ai",
mathspec={
- { class="nothing", name="intop" },
- { class="limop" , name="int" },
+ {
+ class="nothing",
+ name="intop",
+ },
+ {
+ class="limop",
+ name="int",
+ },
},
unicodeslot=0x222B,
},
[0x222C]={
+ adobename="dblintegral",
category="sm",
cjkwd="a",
description="DOUBLE INTEGRAL",
direction="on",
linebreak="ai",
- specials={ "compat", 0x222B, 0x222B },
mathspec={
- { class="nothing", name="iintop" },
- { class="limop" , name="iint" },
+ {
+ class="nothing",
+ name="iintop",
+ },
+ {
+ class="limop",
+ name="iint",
+ },
},
+ specials={ "compat", 0x222B, 0x222B },
unicodeslot=0x222C,
},
[0x222D]={
@@ -52969,14 +54632,21 @@ characters.data={
description="TRIPLE INTEGRAL",
direction="on",
linebreak="al",
- specials={ "compat", 0x222B, 0x222B, 0x222B },
mathspec={
- { class="nothing", name="iiintop" },
- { class="limop" , name="iiint" },
+ {
+ class="nothing",
+ name="iiintop",
+ },
+ {
+ class="limop",
+ name="iiint",
+ },
},
+ specials={ "compat", 0x222B, 0x222B, 0x222B },
unicodeslot=0x222D,
},
[0x222E]={
+ adobename="contourintegral",
category="sm",
cjkwd="a",
description="CONTOUR INTEGRAL",
@@ -53045,6 +54715,7 @@ characters.data={
unicodeslot=0x2234,
},
[0x2235]={
+ adobename="because",
category="sm",
cjkwd="a",
description="BECAUSE",
@@ -53055,6 +54726,7 @@ characters.data={
unicodeslot=0x2235,
},
[0x2236]={
+ adobename="ratio",
category="sm",
cjkwd="a",
description="RATIO",
@@ -53065,6 +54737,7 @@ characters.data={
unicodeslot=0x2236,
},
[0x2237]={
+ adobename="proportion",
category="sm",
cjkwd="a",
description="PROPORTION",
@@ -53107,7 +54780,7 @@ characters.data={
unicodeslot=0x223B,
},
[0x223C]={
- adobename="similar",
+ adobename="tildeoperator",
category="sm",
cjkwd="a",
description="TILDE OPERATOR",
@@ -53119,6 +54792,7 @@ characters.data={
unicodeslot=0x223C,
},
[0x223D]={
+ adobename="reversedtilde",
category="sm",
cjkwd="a",
description="REVERSED TILDE",
@@ -53172,6 +54846,7 @@ characters.data={
unicodeslot=0x2242,
},
[0x2243]={
+ adobename="asymptoticallyequal",
category="sm",
description="ASYMPTOTICALLY EQUAL TO",
direction="on",
@@ -53186,9 +54861,9 @@ characters.data={
description="NOT ASYMPTOTICALLY EQUAL TO",
direction="on",
linebreak="al",
- specials={ "char", 0x2243, 0x0338 },
mathclass="relation",
mathname="nsimeq",
+ specials={ "char", 0x2243, 0x0338 },
unicodeslot=0x2244,
},
[0x2245]={
@@ -53198,8 +54873,14 @@ characters.data={
direction="on",
linebreak="al",
mathspec={
- { class="relation", name="approxEq"},
- { class="relation", name="cong"},
+ {
+ class="relation",
+ name="approxEq",
+ },
+ {
+ class="relation",
+ name="cong",
+ },
},
unicodeslot=0x2245,
},
@@ -53209,8 +54890,14 @@ characters.data={
direction="on",
linebreak="al",
mathspec={
- { class="relation", name="napproxEq"},
- { class="relation", name="ncong"},
+ {
+ class="relation",
+ name="napproxEq",
+ },
+ {
+ class="relation",
+ name="ncong",
+ },
},
unicodeslot=0x2246,
},
@@ -53249,9 +54936,9 @@ characters.data={
category="sm",
description="ALMOST EQUAL OR EQUAL TO",
direction="on",
+ linebreak="al",
mathclass="relation",
mathname="approxeq",
- linebreak="al",
unicodeslot=0x224A,
},
[0x224B]={
@@ -53262,6 +54949,7 @@ characters.data={
unicodeslot=0x224B,
},
[0x224C]={
+ adobename="allequal",
category="sm",
cjkwd="a",
description="ALL EQUAL TO",
@@ -53296,6 +54984,7 @@ characters.data={
unicodeslot=0x224F,
},
[0x2250]={
+ adobename="approaches",
category="sm",
description="APPROACHES THE LIMIT",
direction="on",
@@ -53303,35 +54992,44 @@ characters.data={
unicodeslot=0x2250,
},
[0x2251]={
+ adobename="geometricallyequal",
category="sm",
description="GEOMETRICALLY EQUAL TO",
direction="on",
linebreak="al",
mathspec={
- { class="relation", name="doteqdot" },
- { class="relation", name="Doteq" },
+ {
+ class="relation",
+ name="doteqdot",
+ },
+ {
+ class="relation",
+ name="Doteq",
+ },
},
unicodeslot=0x2251,
},
[0x2252]={
+ adobename="approxequalorimage",
category="sm",
cjkwd="a",
description="APPROXIMATELY EQUAL TO OR THE IMAGE OF",
direction="on",
linebreak="ai",
- mirror=0x2253,
mathclass="relation",
mathname="fallingdotseq",
+ mirror=0x2253,
unicodeslot=0x2252,
},
[0x2253]={
+ adobename="imageorapproximatelyequal",
category="sm",
description="IMAGE OF OR APPROXIMATELY EQUAL TO",
direction="on",
linebreak="al",
- mirror=0x2252,
mathclass="relation",
mathname="risingdotseq",
+ mirror=0x2252,
unicodeslot=0x2253,
},
[0x2254]={
@@ -53339,9 +55037,9 @@ characters.data={
description="COLON EQUALS",
direction="on",
linebreak="al",
- mirror=0x2255,
mathclass="relation",
mathname="colonequals",
+ mirror=0x2255,
unicodeslot=0x2254,
},
[0x2255]={
@@ -53349,9 +55047,9 @@ characters.data={
description="EQUALS COLON",
direction="on",
linebreak="al",
- mirror=0x2254,
mathclass="relation",
mathname="equalscolon",
+ mirror=0x2254,
unicodeslot=0x2255,
},
[0x2256]={
@@ -53383,11 +55081,10 @@ characters.data={
category="sm",
description="ESTIMATES",
direction="on",
- fallback=[[\buildrel\wedge\over=]],
linebreak="al",
- unicodeslot=0x2259,
mathclass="relation",
mathname="wedgeeq",
+ unicodeslot=0x2259,
},
[0x225A]={
category="sm",
@@ -53451,8 +55148,14 @@ characters.data={
direction="on",
linebreak="ai",
mathspec={
- { class="relation", name="neq" },
- { class="relation", name="ne" },
+ {
+ class="relation",
+ name="neq",
+ },
+ {
+ class="relation",
+ name="ne",
+ },
},
specials={ "char", 0x003D, 0x0338 },
unicodeslot=0x2260,
@@ -53469,6 +55172,7 @@ characters.data={
unicodeslot=0x2261,
},
[0x2262]={
+ adobename="notidentical",
category="sm",
description="NOT IDENTICAL TO",
direction="on",
@@ -53493,8 +55197,14 @@ characters.data={
direction="on",
linebreak="ai",
mathspec={
- { class="relation", name="leq" },
- { class="relation", name="le" },
+ {
+ class="relation",
+ name="leq",
+ },
+ {
+ class="relation",
+ name="le",
+ },
},
mirror=0x2265,
unicodeslot=0x2264,
@@ -53507,13 +55217,20 @@ characters.data={
direction="on",
linebreak="ai",
mathspec={
- { class="relation", name="geq" },
- { class="relation", name="ge" },
+ {
+ class="relation",
+ name="geq",
+ },
+ {
+ class="relation",
+ name="ge",
+ },
},
mirror=0x2264,
unicodeslot=0x2265,
},
[0x2266]={
+ adobename="lessoverequal",
category="sm",
cjkwd="a",
description="LESS-THAN OVER EQUAL TO",
@@ -53525,6 +55242,7 @@ characters.data={
unicodeslot=0x2266,
},
[0x2267]={
+ adobename="greateroverequal",
category="sm",
cjkwd="a",
description="GREATER-THAN OVER EQUAL TO",
@@ -53556,6 +55274,7 @@ characters.data={
unicodeslot=0x2269,
},
[0x226A]={
+ adobename="muchless",
category="sm",
cjkwd="a",
description="MUCH LESS-THAN",
@@ -53567,6 +55286,7 @@ characters.data={
unicodeslot=0x226A,
},
[0x226B]={
+ adobename="muchgreater",
category="sm",
cjkwd="a",
description="MUCH GREATER-THAN",
@@ -53597,6 +55317,7 @@ characters.data={
unicodeslot=0x226D,
},
[0x226E]={
+ adobename="notless",
category="sm",
cjkwd="a",
description="NOT LESS-THAN",
@@ -53609,6 +55330,7 @@ characters.data={
unicodeslot=0x226E,
},
[0x226F]={
+ adobename="notgreater",
category="sm",
cjkwd="a",
description="NOT GREATER-THAN",
@@ -53621,6 +55343,7 @@ characters.data={
unicodeslot=0x226F,
},
[0x2270]={
+ adobename="notlessnorequal",
category="sm",
description="NEITHER LESS-THAN NOR EQUAL TO",
direction="on",
@@ -53632,6 +55355,7 @@ characters.data={
unicodeslot=0x2270,
},
[0x2271]={
+ adobename="notgreaternorequal",
category="sm",
description="NEITHER GREATER-THAN NOR EQUAL TO",
direction="on",
@@ -53643,6 +55367,7 @@ characters.data={
unicodeslot=0x2271,
},
[0x2272]={
+ adobename="lessorequivalent",
category="sm",
description="LESS-THAN OR EQUIVALENT TO",
direction="on",
@@ -53653,6 +55378,7 @@ characters.data={
unicodeslot=0x2272,
},
[0x2273]={
+ adobename="greaterorequivalent",
category="sm",
description="GREATER-THAN OR EQUIVALENT TO",
direction="on",
@@ -53685,6 +55411,7 @@ characters.data={
unicodeslot=0x2275,
},
[0x2276]={
+ adobename="lessorgreater",
category="sm",
description="LESS-THAN OR GREATER-THAN",
direction="on",
@@ -53695,6 +55422,7 @@ characters.data={
unicodeslot=0x2276,
},
[0x2277]={
+ adobename="greaterorless",
category="sm",
description="GREATER-THAN OR LESS-THAN",
direction="on",
@@ -53716,6 +55444,7 @@ characters.data={
unicodeslot=0x2278,
},
[0x2279]={
+ adobename="notgreaternorless",
category="sm",
description="NEITHER GREATER-THAN NOR LESS-THAN",
direction="on",
@@ -53727,6 +55456,7 @@ characters.data={
unicodeslot=0x2279,
},
[0x227A]={
+ adobename="precedes",
category="sm",
description="PRECEDES",
direction="on",
@@ -53737,6 +55467,7 @@ characters.data={
unicodeslot=0x227A,
},
[0x227B]={
+ adobename="succeeds",
category="sm",
description="SUCCEEDS",
direction="on",
@@ -53787,6 +55518,7 @@ characters.data={
unicodeslot=0x227F,
},
[0x2280]={
+ adobename="notprecedes",
category="sm",
description="DOES NOT PRECEDE",
direction="on",
@@ -53798,6 +55530,7 @@ characters.data={
unicodeslot=0x2280,
},
[0x2281]={
+ adobename="notsucceeds",
category="sm",
description="DOES NOT SUCCEED",
direction="on",
@@ -53809,19 +55542,19 @@ characters.data={
unicodeslot=0x2281,
},
[0x2282]={
- adobename="propersubset",
+ adobename="subset",
category="sm",
cjkwd="a",
description="SUBSET OF",
direction="on",
linebreak="ai",
mathclass="relation",
- mathname="subset", -- Subset
+ mathname="subset",
mirror=0x2283,
unicodeslot=0x2282,
},
[0x2283]={
- adobename="propersuperset",
+ adobename="superset",
category="sm",
cjkwd="a",
description="SUPERSET OF",
@@ -53837,19 +55570,18 @@ characters.data={
category="sm",
description="NOT A SUBSET OF",
direction="on",
- fallback=[[\not\subset]],
+ linebreak="al",
mathclass="relation",
mathname="nsubset",
- linebreak="al",
mirror=0x2285,
specials={ "char", 0x2282, 0x0338 },
unicodeslot=0x2284,
},
[0x2285]={
+ adobename="notsuperset",
category="sm",
description="NOT A SUPERSET OF",
direction="on",
- fallback=[[\not\supset]],
linebreak="al",
mathclass="relation",
mathname="nsupset",
@@ -53858,7 +55590,7 @@ characters.data={
unicodeslot=0x2285,
},
[0x2286]={
- adobename="reflexsubset",
+ adobename="subsetorequal",
category="sm",
cjkwd="a",
description="SUBSET OF OR EQUAL TO",
@@ -53870,7 +55602,7 @@ characters.data={
unicodeslot=0x2286,
},
[0x2287]={
- adobename="reflexsuperset",
+ adobename="supersetorequal",
category="sm",
cjkwd="a",
description="SUPERSET OF OR EQUAL TO",
@@ -53904,6 +55636,7 @@ characters.data={
unicodeslot=0x2289,
},
[0x228A]={
+ adobename="subsetnotequal",
category="sm",
description="SUBSET OF WITH NOT EQUAL TO",
direction="on",
@@ -53914,6 +55647,7 @@ characters.data={
unicodeslot=0x228A,
},
[0x228B]={
+ adobename="supersetnotequal",
category="sm",
description="SUPERSET OF WITH NOT EQUAL TO",
direction="on",
@@ -54005,7 +55739,7 @@ characters.data={
unicodeslot=0x2294,
},
[0x2295]={
- adobename="circleplus",
+ adobename="pluscircle",
category="sm",
cjkwd="a",
description="CIRCLED PLUS",
@@ -54016,6 +55750,7 @@ characters.data={
unicodeslot=0x2295,
},
[0x2296]={
+ adobename="minuscircle",
category="sm",
description="CIRCLED MINUS",
direction="on",
@@ -54025,7 +55760,7 @@ characters.data={
unicodeslot=0x2296,
},
[0x2297]={
- adobename="circlemultiply",
+ adobename="timescircle",
category="sm",
description="CIRCLED TIMES",
direction="on",
@@ -54045,6 +55780,7 @@ characters.data={
unicodeslot=0x2298,
},
[0x2299]={
+ adobename="circleot",
category="sm",
cjkwd="a",
description="CIRCLED DOT OPERATOR",
@@ -54137,6 +55873,7 @@ characters.data={
unicodeslot=0x22A2,
},
[0x22A3]={
+ adobename="tackleft",
category="sm",
description="LEFT TACK",
direction="on",
@@ -54147,6 +55884,7 @@ characters.data={
unicodeslot=0x22A3,
},
[0x22A4]={
+ adobename="tackdown",
category="sm",
description="DOWN TACK",
direction="on",
@@ -54163,8 +55901,14 @@ characters.data={
direction="on",
linebreak="ai",
mathspec={
- { class="default", name="bot" },
- { class="relation", name="perp" },
+ {
+ class="default",
+ name="bot",
+ },
+ {
+ class="relation",
+ name="perp",
+ },
},
unicodeslot=0x22A5,
},
@@ -54181,7 +55925,6 @@ characters.data={
description="MODELS",
direction="on",
linebreak="al",
- fallback=[[\mathrel|\joinrel=]],
mathclass="relation",
mathname="models",
unicodeslot=0x22A7,
@@ -54191,9 +55934,9 @@ characters.data={
description="TRUE",
direction="on",
linebreak="al",
- mirror=0x2AE4,
mathclass="relation",
mathname="vDash",
+ mirror=0x2AE4,
unicodeslot=0x22A8,
},
[0x22A9]={
@@ -54201,9 +55944,9 @@ characters.data={
description="FORCES",
direction="on",
linebreak="al",
- mirror=0x2AE3,
mathclass="relation",
mathname="Vdash",
+ mirror=0x2AE3,
unicodeslot=0x22A9,
},
[0x22AA]={
@@ -54220,9 +55963,9 @@ characters.data={
description="DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE",
direction="on",
linebreak="al",
- mirror=0x2AE5,
mathclass="relation",
mathname="VDash",
+ mirror=0x2AE5,
unicodeslot=0x22AB,
},
[0x22AC]={
@@ -54391,6 +56134,7 @@ characters.data={
unicodeslot=0x22BE,
},
[0x22BF]={
+ adobename="righttriangle",
category="sm",
cjkwd="a",
description="RIGHT TRIANGLE",
@@ -54450,8 +56194,14 @@ characters.data={
direction="on",
linebreak="al",
mathspec={
- { class="binary", name="cdot" },
- { class="punctuation", name="cdotp" },
+ {
+ class="binary",
+ name="cdot",
+ },
+ {
+ class="punctuation",
+ name="cdotp",
+ },
},
unicodeslot=0x22C5,
},
@@ -54478,10 +56228,15 @@ characters.data={
description="BOWTIE",
direction="on",
linebreak="al",
- fallback=[[\mathrel\triangleright\joinrel\mathrel\triangleleft]],
mathspec={
- { class="relation", name="bowtie" },
- { class="relation", name="Join" }, -- AM: Maybe wrong
+ {
+ class="relation",
+ name="bowtie",
+ },
+ {
+ class="relation",
+ name="Join",
+ },
},
unicodeslot=0x22C8,
},
@@ -54534,6 +56289,7 @@ characters.data={
unicodeslot=0x22CD,
},
[0x22CE]={
+ adobename="curlyor",
category="sm",
description="CURLY LOGICAL OR",
direction="on",
@@ -54543,6 +56299,7 @@ characters.data={
unicodeslot=0x22CE,
},
[0x22CF]={
+ adobename="curlyand",
category="sm",
description="CURLY LOGICAL AND",
direction="on",
@@ -54577,8 +56334,14 @@ characters.data={
direction="on",
linebreak="al",
mathspec={
- { class="binary", name="Cap" },
- { class="binary", name="doublecap"},
+ {
+ class="binary",
+ name="Cap",
+ },
+ {
+ class="binary",
+ name="doublecap",
+ },
},
unicodeslot=0x22D2,
},
@@ -54588,8 +56351,14 @@ characters.data={
direction="on",
linebreak="al",
mathspec={
- { class="binary", name="Cup" },
- { class="binary", name="doublecup"},
+ {
+ class="binary",
+ name="Cup",
+ },
+ {
+ class="binary",
+ name="doublecup",
+ },
},
unicodeslot=0x22D3,
},
@@ -54635,8 +56404,14 @@ characters.data={
direction="on",
linebreak="al",
mathspec={
- { class="relation", name="lll"},
- { class="relation", name="llless"},
+ {
+ class="relation",
+ name="lll",
+ },
+ {
+ class="relation",
+ name="llless",
+ },
},
mirror=0x22D9,
unicodeslot=0x22D8,
@@ -54647,30 +56422,38 @@ characters.data={
direction="on",
linebreak="al",
mathspec={
- { class="relation", name="ggg"},
- { class="relation", name="gggtr"},
+ {
+ class="relation",
+ name="ggg",
+ },
+ {
+ class="relation",
+ name="gggtr",
+ },
},
mirror=0x22D8,
unicodeslot=0x22D9,
},
[0x22DA]={
+ adobename="lessequalorgreater",
category="sm",
description="LESS-THAN EQUAL TO OR GREATER-THAN",
direction="on",
linebreak="al",
- mirror=0x22DB,
mathclass="relation",
mathname="lesseqgtr",
+ mirror=0x22DB,
unicodeslot=0x22DA,
},
[0x22DB]={
+ adobename="greaterequalorless",
category="sm",
description="GREATER-THAN EQUAL TO OR LESS-THAN",
direction="on",
linebreak="al",
- mirror=0x22DA,
mathclass="relation",
mathname="gtreqless",
+ mirror=0x22DA,
unicodeslot=0x22DB,
},
[0x22DC]={
@@ -54698,9 +56481,9 @@ characters.data={
description="EQUAL TO OR PRECEDES",
direction="on",
linebreak="al",
- mirror=0x22DF,
mathclass="relation",
mathname="curlyeqprec",
+ mirror=0x22DF,
unicodeslot=0x22DE,
},
[0x22DF]={
@@ -54708,9 +56491,9 @@ characters.data={
description="EQUAL TO OR SUCCEEDS",
direction="on",
linebreak="al",
- mirror=0x22DE,
mathclass="relation",
mathname="curlyeqsucc",
+ mirror=0x22DE,
unicodeslot=0x22DF,
},
[0x22E0]={
@@ -54718,9 +56501,9 @@ characters.data={
description="DOES NOT PRECEDE OR EQUAL",
direction="on",
linebreak="al",
- mirror=0x22E1,
mathclass="relation",
mathname="npreccurlyeq",
+ mirror=0x22E1,
specials={ "char", 0x227C, 0x0338 },
unicodeslot=0x22E0,
},
@@ -54729,9 +56512,9 @@ characters.data={
description="DOES NOT SUCCEED OR EQUAL",
direction="on",
linebreak="al",
- mirror=0x22E0,
mathclass="relation",
mathname="nsucccurlyeq",
+ mirror=0x22E0,
specials={ "char", 0x227D, 0x0338 },
unicodeslot=0x22E1,
},
@@ -54862,6 +56645,7 @@ characters.data={
unicodeslot=0x22ED,
},
[0x22EE]={
+ adobename="ellipsisvertical",
category="sm",
description="VERTICAL ELLIPSIS",
direction="on",
@@ -55032,6 +56816,7 @@ characters.data={
unicodeslot=0x2302,
},
[0x2303]={
+ adobename="control",
category="so",
description="UP ARROWHEAD",
direction="on",
@@ -55046,6 +56831,7 @@ characters.data={
unicodeslot=0x2304,
},
[0x2305]={
+ adobename="projective",
category="so",
description="PROJECTIVE",
direction="on",
@@ -55150,6 +56936,7 @@ characters.data={
unicodeslot=0x2311,
},
[0x2312]={
+ adobename="arc",
category="so",
cjkwd="a",
description="ARC",
@@ -55193,6 +56980,7 @@ characters.data={
unicodeslot=0x2317,
},
[0x2318]={
+ adobename="propellor",
category="so",
description="PLACE OF INTEREST SIGN",
direction="on",
@@ -55298,6 +57086,7 @@ characters.data={
unicodeslot=0x2324,
},
[0x2325]={
+ adobename="option",
category="so",
description="OPTION KEY",
direction="on",
@@ -55305,6 +57094,7 @@ characters.data={
unicodeslot=0x2325,
},
[0x2326]={
+ adobename="deleteright",
category="so",
description="ERASE TO THE RIGHT",
direction="on",
@@ -55312,6 +57102,7 @@ characters.data={
unicodeslot=0x2326,
},
[0x2327]={
+ adobename="clear",
category="so",
description="X IN A RECTANGLE BOX",
direction="on",
@@ -55348,6 +57139,7 @@ characters.data={
unicodeslot=0x232A,
},
[0x232B]={
+ adobename="deleteleft",
category="so",
description="ERASE TO THE LEFT",
direction="on",
@@ -56930,6 +58722,7 @@ characters.data={
unicodeslot=0x2422,
},
[0x2423]={
+ adobename="blank",
category="so",
description="OPEN BOX",
direction="on",
@@ -57035,6 +58828,7 @@ characters.data={
unicodeslot=0x244A,
},
[0x2460]={
+ adobename="onecircle",
category="no",
cjkwd="a",
description="CIRCLED DIGIT ONE",
@@ -57044,6 +58838,7 @@ characters.data={
unicodeslot=0x2460,
},
[0x2461]={
+ adobename="twocircle",
category="no",
cjkwd="a",
description="CIRCLED DIGIT TWO",
@@ -57053,6 +58848,7 @@ characters.data={
unicodeslot=0x2461,
},
[0x2462]={
+ adobename="threecircle",
category="no",
cjkwd="a",
description="CIRCLED DIGIT THREE",
@@ -57062,6 +58858,7 @@ characters.data={
unicodeslot=0x2462,
},
[0x2463]={
+ adobename="fourcircle",
category="no",
cjkwd="a",
description="CIRCLED DIGIT FOUR",
@@ -57071,6 +58868,7 @@ characters.data={
unicodeslot=0x2463,
},
[0x2464]={
+ adobename="fivecircle",
category="no",
cjkwd="a",
description="CIRCLED DIGIT FIVE",
@@ -57080,6 +58878,7 @@ characters.data={
unicodeslot=0x2464,
},
[0x2465]={
+ adobename="sixcircle",
category="no",
cjkwd="a",
description="CIRCLED DIGIT SIX",
@@ -57089,6 +58888,7 @@ characters.data={
unicodeslot=0x2465,
},
[0x2466]={
+ adobename="sevencircle",
category="no",
cjkwd="a",
description="CIRCLED DIGIT SEVEN",
@@ -57098,6 +58898,7 @@ characters.data={
unicodeslot=0x2466,
},
[0x2467]={
+ adobename="eightcircle",
category="no",
cjkwd="a",
description="CIRCLED DIGIT EIGHT",
@@ -57107,6 +58908,7 @@ characters.data={
unicodeslot=0x2467,
},
[0x2468]={
+ adobename="ninecircle",
category="no",
cjkwd="a",
description="CIRCLED DIGIT NINE",
@@ -57116,6 +58918,7 @@ characters.data={
unicodeslot=0x2468,
},
[0x2469]={
+ adobename="tencircle",
category="no",
cjkwd="a",
description="CIRCLED NUMBER TEN",
@@ -57125,6 +58928,7 @@ characters.data={
unicodeslot=0x2469,
},
[0x246A]={
+ adobename="elevencircle",
category="no",
cjkwd="a",
description="CIRCLED NUMBER ELEVEN",
@@ -57134,6 +58938,7 @@ characters.data={
unicodeslot=0x246A,
},
[0x246B]={
+ adobename="twelvecircle",
category="no",
cjkwd="a",
description="CIRCLED NUMBER TWELVE",
@@ -57143,6 +58948,7 @@ characters.data={
unicodeslot=0x246B,
},
[0x246C]={
+ adobename="thirteencircle",
category="no",
cjkwd="a",
description="CIRCLED NUMBER THIRTEEN",
@@ -57152,6 +58958,7 @@ characters.data={
unicodeslot=0x246C,
},
[0x246D]={
+ adobename="fourteencircle",
category="no",
cjkwd="a",
description="CIRCLED NUMBER FOURTEEN",
@@ -57161,6 +58968,7 @@ characters.data={
unicodeslot=0x246D,
},
[0x246E]={
+ adobename="fifteencircle",
category="no",
cjkwd="a",
description="CIRCLED NUMBER FIFTEEN",
@@ -57170,6 +58978,7 @@ characters.data={
unicodeslot=0x246E,
},
[0x246F]={
+ adobename="sixteencircle",
category="no",
cjkwd="a",
description="CIRCLED NUMBER SIXTEEN",
@@ -57179,6 +58988,7 @@ characters.data={
unicodeslot=0x246F,
},
[0x2470]={
+ adobename="seventeencircle",
category="no",
cjkwd="a",
description="CIRCLED NUMBER SEVENTEEN",
@@ -57188,6 +58998,7 @@ characters.data={
unicodeslot=0x2470,
},
[0x2471]={
+ adobename="eighteencircle",
category="no",
cjkwd="a",
description="CIRCLED NUMBER EIGHTEEN",
@@ -57197,6 +59008,7 @@ characters.data={
unicodeslot=0x2471,
},
[0x2472]={
+ adobename="nineteencircle",
category="no",
cjkwd="a",
description="CIRCLED NUMBER NINETEEN",
@@ -57206,6 +59018,7 @@ characters.data={
unicodeslot=0x2472,
},
[0x2473]={
+ adobename="twentycircle",
category="no",
cjkwd="a",
description="CIRCLED NUMBER TWENTY",
@@ -57215,6 +59028,7 @@ characters.data={
unicodeslot=0x2473,
},
[0x2474]={
+ adobename="oneparen",
category="no",
cjkwd="a",
description="PARENTHESIZED DIGIT ONE",
@@ -57224,6 +59038,7 @@ characters.data={
unicodeslot=0x2474,
},
[0x2475]={
+ adobename="twoparen",
category="no",
cjkwd="a",
description="PARENTHESIZED DIGIT TWO",
@@ -57233,6 +59048,7 @@ characters.data={
unicodeslot=0x2475,
},
[0x2476]={
+ adobename="threeparen",
category="no",
cjkwd="a",
description="PARENTHESIZED DIGIT THREE",
@@ -57242,6 +59058,7 @@ characters.data={
unicodeslot=0x2476,
},
[0x2477]={
+ adobename="fourparen",
category="no",
cjkwd="a",
description="PARENTHESIZED DIGIT FOUR",
@@ -57251,6 +59068,7 @@ characters.data={
unicodeslot=0x2477,
},
[0x2478]={
+ adobename="fiveparen",
category="no",
cjkwd="a",
description="PARENTHESIZED DIGIT FIVE",
@@ -57260,6 +59078,7 @@ characters.data={
unicodeslot=0x2478,
},
[0x2479]={
+ adobename="sixparen",
category="no",
cjkwd="a",
description="PARENTHESIZED DIGIT SIX",
@@ -57269,6 +59088,7 @@ characters.data={
unicodeslot=0x2479,
},
[0x247A]={
+ adobename="sevenparen",
category="no",
cjkwd="a",
description="PARENTHESIZED DIGIT SEVEN",
@@ -57278,6 +59098,7 @@ characters.data={
unicodeslot=0x247A,
},
[0x247B]={
+ adobename="eightparen",
category="no",
cjkwd="a",
description="PARENTHESIZED DIGIT EIGHT",
@@ -57287,6 +59108,7 @@ characters.data={
unicodeslot=0x247B,
},
[0x247C]={
+ adobename="nineparen",
category="no",
cjkwd="a",
description="PARENTHESIZED DIGIT NINE",
@@ -57296,6 +59118,7 @@ characters.data={
unicodeslot=0x247C,
},
[0x247D]={
+ adobename="tenparen",
category="no",
cjkwd="a",
description="PARENTHESIZED NUMBER TEN",
@@ -57305,6 +59128,7 @@ characters.data={
unicodeslot=0x247D,
},
[0x247E]={
+ adobename="elevenparen",
category="no",
cjkwd="a",
description="PARENTHESIZED NUMBER ELEVEN",
@@ -57314,6 +59138,7 @@ characters.data={
unicodeslot=0x247E,
},
[0x247F]={
+ adobename="twelveparen",
category="no",
cjkwd="a",
description="PARENTHESIZED NUMBER TWELVE",
@@ -57323,6 +59148,7 @@ characters.data={
unicodeslot=0x247F,
},
[0x2480]={
+ adobename="thirteenparen",
category="no",
cjkwd="a",
description="PARENTHESIZED NUMBER THIRTEEN",
@@ -57332,6 +59158,7 @@ characters.data={
unicodeslot=0x2480,
},
[0x2481]={
+ adobename="fourteenparen",
category="no",
cjkwd="a",
description="PARENTHESIZED NUMBER FOURTEEN",
@@ -57341,6 +59168,7 @@ characters.data={
unicodeslot=0x2481,
},
[0x2482]={
+ adobename="fifteenparen",
category="no",
cjkwd="a",
description="PARENTHESIZED NUMBER FIFTEEN",
@@ -57350,6 +59178,7 @@ characters.data={
unicodeslot=0x2482,
},
[0x2483]={
+ adobename="sixteenparen",
category="no",
cjkwd="a",
description="PARENTHESIZED NUMBER SIXTEEN",
@@ -57359,6 +59188,7 @@ characters.data={
unicodeslot=0x2483,
},
[0x2484]={
+ adobename="seventeenparen",
category="no",
cjkwd="a",
description="PARENTHESIZED NUMBER SEVENTEEN",
@@ -57368,6 +59198,7 @@ characters.data={
unicodeslot=0x2484,
},
[0x2485]={
+ adobename="eighteenparen",
category="no",
cjkwd="a",
description="PARENTHESIZED NUMBER EIGHTEEN",
@@ -57377,6 +59208,7 @@ characters.data={
unicodeslot=0x2485,
},
[0x2486]={
+ adobename="nineteenparen",
category="no",
cjkwd="a",
description="PARENTHESIZED NUMBER NINETEEN",
@@ -57386,6 +59218,7 @@ characters.data={
unicodeslot=0x2486,
},
[0x2487]={
+ adobename="twentyparen",
category="no",
cjkwd="a",
description="PARENTHESIZED NUMBER TWENTY",
@@ -57395,6 +59228,7 @@ characters.data={
unicodeslot=0x2487,
},
[0x2488]={
+ adobename="oneperiod",
category="no",
cjkwd="a",
description="DIGIT ONE FULL STOP",
@@ -57404,6 +59238,7 @@ characters.data={
unicodeslot=0x2488,
},
[0x2489]={
+ adobename="twoperiod",
category="no",
cjkwd="a",
description="DIGIT TWO FULL STOP",
@@ -57413,6 +59248,7 @@ characters.data={
unicodeslot=0x2489,
},
[0x248A]={
+ adobename="threeperiod",
category="no",
cjkwd="a",
description="DIGIT THREE FULL STOP",
@@ -57422,6 +59258,7 @@ characters.data={
unicodeslot=0x248A,
},
[0x248B]={
+ adobename="fourperiod",
category="no",
cjkwd="a",
description="DIGIT FOUR FULL STOP",
@@ -57431,6 +59268,7 @@ characters.data={
unicodeslot=0x248B,
},
[0x248C]={
+ adobename="fiveperiod",
category="no",
cjkwd="a",
description="DIGIT FIVE FULL STOP",
@@ -57440,6 +59278,7 @@ characters.data={
unicodeslot=0x248C,
},
[0x248D]={
+ adobename="sixperiod",
category="no",
cjkwd="a",
description="DIGIT SIX FULL STOP",
@@ -57449,6 +59288,7 @@ characters.data={
unicodeslot=0x248D,
},
[0x248E]={
+ adobename="sevenperiod",
category="no",
cjkwd="a",
description="DIGIT SEVEN FULL STOP",
@@ -57458,6 +59298,7 @@ characters.data={
unicodeslot=0x248E,
},
[0x248F]={
+ adobename="eightperiod",
category="no",
cjkwd="a",
description="DIGIT EIGHT FULL STOP",
@@ -57467,6 +59308,7 @@ characters.data={
unicodeslot=0x248F,
},
[0x2490]={
+ adobename="nineperiod",
category="no",
cjkwd="a",
description="DIGIT NINE FULL STOP",
@@ -57476,6 +59318,7 @@ characters.data={
unicodeslot=0x2490,
},
[0x2491]={
+ adobename="tenperiod",
category="no",
cjkwd="a",
description="NUMBER TEN FULL STOP",
@@ -57485,6 +59328,7 @@ characters.data={
unicodeslot=0x2491,
},
[0x2492]={
+ adobename="elevenperiod",
category="no",
cjkwd="a",
description="NUMBER ELEVEN FULL STOP",
@@ -57494,6 +59338,7 @@ characters.data={
unicodeslot=0x2492,
},
[0x2493]={
+ adobename="twelveperiod",
category="no",
cjkwd="a",
description="NUMBER TWELVE FULL STOP",
@@ -57503,6 +59348,7 @@ characters.data={
unicodeslot=0x2493,
},
[0x2494]={
+ adobename="thirteenperiod",
category="no",
cjkwd="a",
description="NUMBER THIRTEEN FULL STOP",
@@ -57512,6 +59358,7 @@ characters.data={
unicodeslot=0x2494,
},
[0x2495]={
+ adobename="fourteenperiod",
category="no",
cjkwd="a",
description="NUMBER FOURTEEN FULL STOP",
@@ -57521,6 +59368,7 @@ characters.data={
unicodeslot=0x2495,
},
[0x2496]={
+ adobename="fifteenperiod",
category="no",
cjkwd="a",
description="NUMBER FIFTEEN FULL STOP",
@@ -57530,6 +59378,7 @@ characters.data={
unicodeslot=0x2496,
},
[0x2497]={
+ adobename="sixteenperiod",
category="no",
cjkwd="a",
description="NUMBER SIXTEEN FULL STOP",
@@ -57539,6 +59388,7 @@ characters.data={
unicodeslot=0x2497,
},
[0x2498]={
+ adobename="seventeenperiod",
category="no",
cjkwd="a",
description="NUMBER SEVENTEEN FULL STOP",
@@ -57548,6 +59398,7 @@ characters.data={
unicodeslot=0x2498,
},
[0x2499]={
+ adobename="eighteenperiod",
category="no",
cjkwd="a",
description="NUMBER EIGHTEEN FULL STOP",
@@ -57557,6 +59408,7 @@ characters.data={
unicodeslot=0x2499,
},
[0x249A]={
+ adobename="nineteenperiod",
category="no",
cjkwd="a",
description="NUMBER NINETEEN FULL STOP",
@@ -57566,6 +59418,7 @@ characters.data={
unicodeslot=0x249A,
},
[0x249B]={
+ adobename="twentyperiod",
category="no",
cjkwd="a",
description="NUMBER TWENTY FULL STOP",
@@ -57575,6 +59428,7 @@ characters.data={
unicodeslot=0x249B,
},
[0x249C]={
+ adobename="aparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER A",
@@ -57584,6 +59438,7 @@ characters.data={
unicodeslot=0x249C,
},
[0x249D]={
+ adobename="bparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER B",
@@ -57593,6 +59448,7 @@ characters.data={
unicodeslot=0x249D,
},
[0x249E]={
+ adobename="cparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER C",
@@ -57602,6 +59458,7 @@ characters.data={
unicodeslot=0x249E,
},
[0x249F]={
+ adobename="dparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER D",
@@ -57611,6 +59468,7 @@ characters.data={
unicodeslot=0x249F,
},
[0x24A0]={
+ adobename="eparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER E",
@@ -57620,6 +59478,7 @@ characters.data={
unicodeslot=0x24A0,
},
[0x24A1]={
+ adobename="fparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER F",
@@ -57629,6 +59488,7 @@ characters.data={
unicodeslot=0x24A1,
},
[0x24A2]={
+ adobename="gparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER G",
@@ -57638,6 +59498,7 @@ characters.data={
unicodeslot=0x24A2,
},
[0x24A3]={
+ adobename="hparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER H",
@@ -57647,6 +59508,7 @@ characters.data={
unicodeslot=0x24A3,
},
[0x24A4]={
+ adobename="iparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER I",
@@ -57656,6 +59518,7 @@ characters.data={
unicodeslot=0x24A4,
},
[0x24A5]={
+ adobename="jparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER J",
@@ -57665,6 +59528,7 @@ characters.data={
unicodeslot=0x24A5,
},
[0x24A6]={
+ adobename="kparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER K",
@@ -57674,6 +59538,7 @@ characters.data={
unicodeslot=0x24A6,
},
[0x24A7]={
+ adobename="lparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER L",
@@ -57683,6 +59548,7 @@ characters.data={
unicodeslot=0x24A7,
},
[0x24A8]={
+ adobename="mparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER M",
@@ -57692,6 +59558,7 @@ characters.data={
unicodeslot=0x24A8,
},
[0x24A9]={
+ adobename="nparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER N",
@@ -57701,6 +59568,7 @@ characters.data={
unicodeslot=0x24A9,
},
[0x24AA]={
+ adobename="oparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER O",
@@ -57710,6 +59578,7 @@ characters.data={
unicodeslot=0x24AA,
},
[0x24AB]={
+ adobename="pparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER P",
@@ -57719,6 +59588,7 @@ characters.data={
unicodeslot=0x24AB,
},
[0x24AC]={
+ adobename="qparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER Q",
@@ -57728,6 +59598,7 @@ characters.data={
unicodeslot=0x24AC,
},
[0x24AD]={
+ adobename="rparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER R",
@@ -57737,6 +59608,7 @@ characters.data={
unicodeslot=0x24AD,
},
[0x24AE]={
+ adobename="sparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER S",
@@ -57746,6 +59618,7 @@ characters.data={
unicodeslot=0x24AE,
},
[0x24AF]={
+ adobename="tparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER T",
@@ -57755,6 +59628,7 @@ characters.data={
unicodeslot=0x24AF,
},
[0x24B0]={
+ adobename="uparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER U",
@@ -57764,6 +59638,7 @@ characters.data={
unicodeslot=0x24B0,
},
[0x24B1]={
+ adobename="vparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER V",
@@ -57773,6 +59648,7 @@ characters.data={
unicodeslot=0x24B1,
},
[0x24B2]={
+ adobename="wparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER W",
@@ -57782,6 +59658,7 @@ characters.data={
unicodeslot=0x24B2,
},
[0x24B3]={
+ adobename="xparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER X",
@@ -57791,6 +59668,7 @@ characters.data={
unicodeslot=0x24B3,
},
[0x24B4]={
+ adobename="yparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER Y",
@@ -57800,6 +59678,7 @@ characters.data={
unicodeslot=0x24B4,
},
[0x24B5]={
+ adobename="zparen",
category="so",
cjkwd="a",
description="PARENTHESIZED LATIN SMALL LETTER Z",
@@ -57809,6 +59688,7 @@ characters.data={
unicodeslot=0x24B5,
},
[0x24B6]={
+ adobename="Acircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER A",
@@ -57819,6 +59699,7 @@ characters.data={
unicodeslot=0x24B6,
},
[0x24B7]={
+ adobename="Bcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER B",
@@ -57829,6 +59710,7 @@ characters.data={
unicodeslot=0x24B7,
},
[0x24B8]={
+ adobename="Ccircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER C",
@@ -57839,6 +59721,7 @@ characters.data={
unicodeslot=0x24B8,
},
[0x24B9]={
+ adobename="Dcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER D",
@@ -57849,6 +59732,7 @@ characters.data={
unicodeslot=0x24B9,
},
[0x24BA]={
+ adobename="Ecircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER E",
@@ -57859,6 +59743,7 @@ characters.data={
unicodeslot=0x24BA,
},
[0x24BB]={
+ adobename="Fcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER F",
@@ -57869,6 +59754,7 @@ characters.data={
unicodeslot=0x24BB,
},
[0x24BC]={
+ adobename="Gcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER G",
@@ -57879,6 +59765,7 @@ characters.data={
unicodeslot=0x24BC,
},
[0x24BD]={
+ adobename="Hcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER H",
@@ -57889,6 +59776,7 @@ characters.data={
unicodeslot=0x24BD,
},
[0x24BE]={
+ adobename="Icircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER I",
@@ -57899,6 +59787,7 @@ characters.data={
unicodeslot=0x24BE,
},
[0x24BF]={
+ adobename="Jcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER J",
@@ -57909,6 +59798,7 @@ characters.data={
unicodeslot=0x24BF,
},
[0x24C0]={
+ adobename="Kcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER K",
@@ -57919,6 +59809,7 @@ characters.data={
unicodeslot=0x24C0,
},
[0x24C1]={
+ adobename="Lcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER L",
@@ -57929,6 +59820,7 @@ characters.data={
unicodeslot=0x24C1,
},
[0x24C2]={
+ adobename="Mcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER M",
@@ -57939,6 +59831,7 @@ characters.data={
unicodeslot=0x24C2,
},
[0x24C3]={
+ adobename="Ncircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER N",
@@ -57949,6 +59842,7 @@ characters.data={
unicodeslot=0x24C3,
},
[0x24C4]={
+ adobename="Ocircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER O",
@@ -57959,6 +59853,7 @@ characters.data={
unicodeslot=0x24C4,
},
[0x24C5]={
+ adobename="Pcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER P",
@@ -57969,6 +59864,7 @@ characters.data={
unicodeslot=0x24C5,
},
[0x24C6]={
+ adobename="Qcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER Q",
@@ -57979,6 +59875,7 @@ characters.data={
unicodeslot=0x24C6,
},
[0x24C7]={
+ adobename="Rcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER R",
@@ -57991,6 +59888,7 @@ characters.data={
unicodeslot=0x24C7,
},
[0x24C8]={
+ adobename="Scircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER S",
@@ -58003,6 +59901,7 @@ characters.data={
unicodeslot=0x24C8,
},
[0x24C9]={
+ adobename="Tcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER T",
@@ -58013,6 +59912,7 @@ characters.data={
unicodeslot=0x24C9,
},
[0x24CA]={
+ adobename="Ucircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER U",
@@ -58023,6 +59923,7 @@ characters.data={
unicodeslot=0x24CA,
},
[0x24CB]={
+ adobename="Vcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER V",
@@ -58033,6 +59934,7 @@ characters.data={
unicodeslot=0x24CB,
},
[0x24CC]={
+ adobename="Wcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER W",
@@ -58043,6 +59945,7 @@ characters.data={
unicodeslot=0x24CC,
},
[0x24CD]={
+ adobename="Xcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER X",
@@ -58053,6 +59956,7 @@ characters.data={
unicodeslot=0x24CD,
},
[0x24CE]={
+ adobename="Ycircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER Y",
@@ -58063,6 +59967,7 @@ characters.data={
unicodeslot=0x24CE,
},
[0x24CF]={
+ adobename="Zcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN CAPITAL LETTER Z",
@@ -58073,6 +59978,7 @@ characters.data={
unicodeslot=0x24CF,
},
[0x24D0]={
+ adobename="acircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER A",
@@ -58083,6 +59989,7 @@ characters.data={
unicodeslot=0x24D0,
},
[0x24D1]={
+ adobename="bcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER B",
@@ -58093,6 +60000,7 @@ characters.data={
unicodeslot=0x24D1,
},
[0x24D2]={
+ adobename="ccircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER C",
@@ -58103,6 +60011,7 @@ characters.data={
unicodeslot=0x24D2,
},
[0x24D3]={
+ adobename="dcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER D",
@@ -58113,6 +60022,7 @@ characters.data={
unicodeslot=0x24D3,
},
[0x24D4]={
+ adobename="ecircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER E",
@@ -58123,6 +60033,7 @@ characters.data={
unicodeslot=0x24D4,
},
[0x24D5]={
+ adobename="fcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER F",
@@ -58133,6 +60044,7 @@ characters.data={
unicodeslot=0x24D5,
},
[0x24D6]={
+ adobename="gcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER G",
@@ -58143,6 +60055,7 @@ characters.data={
unicodeslot=0x24D6,
},
[0x24D7]={
+ adobename="hcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER H",
@@ -58153,6 +60066,7 @@ characters.data={
unicodeslot=0x24D7,
},
[0x24D8]={
+ adobename="icircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER I",
@@ -58163,6 +60077,7 @@ characters.data={
unicodeslot=0x24D8,
},
[0x24D9]={
+ adobename="jcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER J",
@@ -58173,6 +60088,7 @@ characters.data={
unicodeslot=0x24D9,
},
[0x24DA]={
+ adobename="kcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER K",
@@ -58183,6 +60099,7 @@ characters.data={
unicodeslot=0x24DA,
},
[0x24DB]={
+ adobename="lcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER L",
@@ -58193,6 +60110,7 @@ characters.data={
unicodeslot=0x24DB,
},
[0x24DC]={
+ adobename="mcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER M",
@@ -58203,6 +60121,7 @@ characters.data={
unicodeslot=0x24DC,
},
[0x24DD]={
+ adobename="ncircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER N",
@@ -58213,6 +60132,7 @@ characters.data={
unicodeslot=0x24DD,
},
[0x24DE]={
+ adobename="ocircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER O",
@@ -58223,6 +60143,7 @@ characters.data={
unicodeslot=0x24DE,
},
[0x24DF]={
+ adobename="pcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER P",
@@ -58233,6 +60154,7 @@ characters.data={
unicodeslot=0x24DF,
},
[0x24E0]={
+ adobename="qcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER Q",
@@ -58243,6 +60165,7 @@ characters.data={
unicodeslot=0x24E0,
},
[0x24E1]={
+ adobename="rcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER R",
@@ -58253,6 +60176,7 @@ characters.data={
unicodeslot=0x24E1,
},
[0x24E2]={
+ adobename="scircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER S",
@@ -58263,6 +60187,7 @@ characters.data={
unicodeslot=0x24E2,
},
[0x24E3]={
+ adobename="tcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER T",
@@ -58273,6 +60198,7 @@ characters.data={
unicodeslot=0x24E3,
},
[0x24E4]={
+ adobename="ucircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER U",
@@ -58283,6 +60209,7 @@ characters.data={
unicodeslot=0x24E4,
},
[0x24E5]={
+ adobename="vcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER V",
@@ -58293,6 +60220,7 @@ characters.data={
unicodeslot=0x24E5,
},
[0x24E6]={
+ adobename="wcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER W",
@@ -58303,6 +60231,7 @@ characters.data={
unicodeslot=0x24E6,
},
[0x24E7]={
+ adobename="xcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER X",
@@ -58313,6 +60242,7 @@ characters.data={
unicodeslot=0x24E7,
},
[0x24E8]={
+ adobename="ycircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER Y",
@@ -58323,6 +60253,7 @@ characters.data={
unicodeslot=0x24E8,
},
[0x24E9]={
+ adobename="zcircle",
category="so",
cjkwd="a",
description="CIRCLED LATIN SMALL LETTER Z",
@@ -58607,7 +60538,7 @@ characters.data={
unicodeslot=0x250B,
},
[0x250C]={
- adobename="SF10000",
+ adobename="SF010000",
category="so",
cjkwd="a",
description="BOX DRAWINGS LIGHT DOWN AND RIGHT",
@@ -58640,7 +60571,7 @@ characters.data={
unicodeslot=0x250F,
},
[0x2510]={
- adobename="SF30000",
+ adobename="SF030000",
category="so",
cjkwd="a",
description="BOX DRAWINGS LIGHT DOWN AND LEFT",
@@ -58673,7 +60604,7 @@ characters.data={
unicodeslot=0x2513,
},
[0x2514]={
- adobename="SF20000",
+ adobename="SF020000",
category="so",
cjkwd="a",
description="BOX DRAWINGS LIGHT UP AND RIGHT",
@@ -58706,7 +60637,7 @@ characters.data={
unicodeslot=0x2517,
},
[0x2518]={
- adobename="SF40000",
+ adobename="SF040000",
category="so",
cjkwd="a",
description="BOX DRAWINGS LIGHT UP AND LEFT",
@@ -58739,7 +60670,7 @@ characters.data={
unicodeslot=0x251B,
},
[0x251C]={
- adobename="SF80000",
+ adobename="SF080000",
category="so",
cjkwd="a",
description="BOX DRAWINGS LIGHT VERTICAL AND RIGHT",
@@ -58804,7 +60735,7 @@ characters.data={
unicodeslot=0x2523,
},
[0x2524]={
- adobename="SF90000",
+ adobename="SF090000",
category="so",
cjkwd="a",
description="BOX DRAWINGS LIGHT VERTICAL AND LEFT",
@@ -58869,7 +60800,7 @@ characters.data={
unicodeslot=0x252B,
},
[0x252C]={
- adobename="SF60000",
+ adobename="SF060000",
category="so",
cjkwd="a",
description="BOX DRAWINGS LIGHT DOWN AND HORIZONTAL",
@@ -58934,7 +60865,7 @@ characters.data={
unicodeslot=0x2533,
},
[0x2534]={
- adobename="SF70000",
+ adobename="SF070000",
category="so",
cjkwd="a",
description="BOX DRAWINGS LIGHT UP AND HORIZONTAL",
@@ -58999,7 +60930,7 @@ characters.data={
unicodeslot=0x253B,
},
[0x253C]={
- adobename="SF50000",
+ adobename="SF050000",
category="so",
cjkwd="a",
description="BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL",
@@ -59697,7 +61628,7 @@ characters.data={
unicodeslot=0x2590,
},
[0x2591]={
- adobename="ltshade",
+ adobename="shadelight",
category="so",
description="LIGHT SHADE",
direction="on",
@@ -59705,7 +61636,7 @@ characters.data={
unicodeslot=0x2591,
},
[0x2592]={
- adobename="shade",
+ adobename="shademedium",
category="so",
cjkwd="a",
description="MEDIUM SHADE",
@@ -59714,7 +61645,7 @@ characters.data={
unicodeslot=0x2592,
},
[0x2593]={
- adobename="dkshade",
+ adobename="shadedark",
category="so",
cjkwd="a",
description="DARK SHADE",
@@ -59818,15 +61749,21 @@ characters.data={
unicodeslot=0x25A0,
},
[0x25A1]={
- adobename="H22073",
+ adobename="whitesquare",
category="so",
cjkwd="a",
description="WHITE SQUARE",
direction="on",
linebreak="ai",
mathspec={
- { class="ord", name="square" },
- { class="ord", name="Box" },
+ {
+ class="ord",
+ name="square",
+ },
+ {
+ class="ord",
+ name="Box",
+ },
},
unicodeslot=0x25A1,
},
@@ -59840,6 +61777,7 @@ characters.data={
unicodeslot=0x25A2,
},
[0x25A3]={
+ adobename="squarewhitewithsmallblack",
category="so",
cjkwd="a",
description="WHITE SQUARE CONTAINING BLACK SMALL SQUARE",
@@ -59848,6 +61786,7 @@ characters.data={
unicodeslot=0x25A3,
},
[0x25A4]={
+ adobename="squarehorizontalfill",
category="so",
cjkwd="a",
description="SQUARE WITH HORIZONTAL FILL",
@@ -59856,6 +61795,7 @@ characters.data={
unicodeslot=0x25A4,
},
[0x25A5]={
+ adobename="squareverticalfill",
category="so",
cjkwd="a",
description="SQUARE WITH VERTICAL FILL",
@@ -59864,6 +61804,7 @@ characters.data={
unicodeslot=0x25A5,
},
[0x25A6]={
+ adobename="squareorthogonalcrosshatchfill",
category="so",
cjkwd="a",
description="SQUARE WITH ORTHOGONAL CROSSHATCH FILL",
@@ -59872,6 +61813,7 @@ characters.data={
unicodeslot=0x25A6,
},
[0x25A7]={
+ adobename="squareupperlefttolowerrightfill",
category="so",
cjkwd="a",
description="SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL",
@@ -59880,6 +61822,7 @@ characters.data={
unicodeslot=0x25A7,
},
[0x25A8]={
+ adobename="squareupperrighttolowerleftfill",
category="so",
cjkwd="a",
description="SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL",
@@ -59888,6 +61831,7 @@ characters.data={
unicodeslot=0x25A8,
},
[0x25A9]={
+ adobename="squarediagonalcrosshatchfill",
category="so",
cjkwd="a",
description="SQUARE WITH DIAGONAL CROSSHATCH FILL",
@@ -59896,7 +61840,7 @@ characters.data={
unicodeslot=0x25A9,
},
[0x25AA]={
- adobename="H18543",
+ adobename="blacksmallsquare",
category="so",
description="BLACK SMALL SQUARE",
direction="on",
@@ -59904,7 +61848,7 @@ characters.data={
unicodeslot=0x25AA,
},
[0x25AB]={
- adobename="H18551",
+ adobename="whitesmallsquare",
category="so",
description="WHITE SMALL SQUARE",
direction="on",
@@ -59964,18 +61908,26 @@ characters.data={
unicodeslot=0x25B2,
},
[0x25B3]={
+ adobename="whiteuppointingtriangle",
category="so",
cjkwd="a",
description="WHITE UP-POINTING TRIANGLE",
direction="on",
linebreak="ai",
mathspec={
- { class="ord", name="triangle" },
- { class="binary", name="bigtriangleup" },
+ {
+ class="ord",
+ name="triangle",
+ },
+ {
+ class="binary",
+ name="bigtriangleup",
+ },
},
unicodeslot=0x25B3,
},
[0x25B4]={
+ adobename="blackuppointingsmalltriangle",
category="so",
description="BLACK UP-POINTING SMALL TRIANGLE",
direction="on",
@@ -59983,6 +61935,7 @@ characters.data={
unicodeslot=0x25B4,
},
[0x25B5]={
+ adobename="whiteuppointingsmalltriangle",
category="so",
description="WHITE UP-POINTING SMALL TRIANGLE",
direction="on",
@@ -59990,6 +61943,7 @@ characters.data={
unicodeslot=0x25B5,
},
[0x25B6]={
+ adobename="blackrightpointingtriangle",
category="so",
cjkwd="a",
description="BLACK RIGHT-POINTING TRIANGLE",
@@ -60000,6 +61954,7 @@ characters.data={
unicodeslot=0x25B6,
},
[0x25B7]={
+ adobename="whiterightpointingtriangle",
category="sm",
cjkwd="a",
description="WHITE RIGHT-POINTING TRIANGLE",
@@ -60017,6 +61972,7 @@ characters.data={
unicodeslot=0x25B8,
},
[0x25B9]={
+ adobename="whiterightpointingsmalltriangle",
category="so",
description="WHITE RIGHT-POINTING SMALL TRIANGLE",
direction="on",
@@ -60048,6 +62004,7 @@ characters.data={
unicodeslot=0x25BC,
},
[0x25BD]={
+ adobename="whitedownpointingtriangle",
category="so",
cjkwd="a",
description="WHITE DOWN-POINTING TRIANGLE",
@@ -60065,6 +62022,7 @@ characters.data={
unicodeslot=0x25BE,
},
[0x25BF]={
+ adobename="whitedownpointingsmalltriangle",
category="so",
description="WHITE DOWN-POINTING SMALL TRIANGLE",
direction="on",
@@ -60072,6 +62030,7 @@ characters.data={
unicodeslot=0x25BF,
},
[0x25C0]={
+ adobename="blackleftpointingtriangle",
category="so",
cjkwd="a",
description="BLACK LEFT-POINTING TRIANGLE",
@@ -60080,6 +62039,7 @@ characters.data={
unicodeslot=0x25C0,
},
[0x25C1]={
+ adobename="whiteleftpointingtriangle",
category="sm",
cjkwd="a",
description="WHITE LEFT-POINTING TRIANGLE",
@@ -60095,6 +62055,7 @@ characters.data={
unicodeslot=0x25C2,
},
[0x25C3]={
+ adobename="whiteleftpointingsmalltriangle",
category="so",
description="WHITE LEFT-POINTING SMALL TRIANGLE",
direction="on",
@@ -60117,6 +62078,7 @@ characters.data={
unicodeslot=0x25C5,
},
[0x25C6]={
+ adobename="blackdiamond",
category="so",
cjkwd="a",
description="BLACK DIAMOND",
@@ -60125,6 +62087,7 @@ characters.data={
unicodeslot=0x25C6,
},
[0x25C7]={
+ adobename="whitediamond",
category="so",
cjkwd="a",
description="WHITE DIAMOND",
@@ -60133,6 +62096,7 @@ characters.data={
unicodeslot=0x25C7,
},
[0x25C8]={
+ adobename="whitediamondcontainingblacksmalldiamond",
category="so",
cjkwd="a",
description="WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND",
@@ -60141,6 +62105,7 @@ characters.data={
unicodeslot=0x25C8,
},
[0x25C9]={
+ adobename="fisheye",
category="so",
description="FISHEYE",
direction="on",
@@ -60158,7 +62123,7 @@ characters.data={
unicodeslot=0x25CA,
},
[0x25CB]={
- adobename="circle",
+ adobename="whitecircle",
category="so",
cjkwd="a",
description="WHITE CIRCLE",
@@ -60167,6 +62132,7 @@ characters.data={
unicodeslot=0x25CB,
},
[0x25CC]={
+ adobename="dottedcircle",
category="so",
description="DOTTED CIRCLE",
direction="on",
@@ -60181,6 +62147,7 @@ characters.data={
unicodeslot=0x25CD,
},
[0x25CE]={
+ adobename="bullseye",
category="so",
cjkwd="a",
description="BULLSEYE",
@@ -60189,7 +62156,7 @@ characters.data={
unicodeslot=0x25CE,
},
[0x25CF]={
- adobename="H18533",
+ adobename="blackcircle",
category="so",
cjkwd="a",
description="BLACK CIRCLE",
@@ -60198,6 +62165,7 @@ characters.data={
unicodeslot=0x25CF,
},
[0x25D0]={
+ adobename="circlewithlefthalfblack",
category="so",
cjkwd="a",
description="CIRCLE WITH LEFT HALF BLACK",
@@ -60206,6 +62174,7 @@ characters.data={
unicodeslot=0x25D0,
},
[0x25D1]={
+ adobename="circlewithrighthalfblack",
category="so",
cjkwd="a",
description="CIRCLE WITH RIGHT HALF BLACK",
@@ -60264,7 +62233,7 @@ characters.data={
unicodeslot=0x25D8,
},
[0x25D9]={
- adobename="invcircle",
+ adobename="whitecircleinverse",
category="so",
description="INVERSE WHITE CIRCLE",
direction="on",
@@ -60328,6 +62297,7 @@ characters.data={
unicodeslot=0x25E1,
},
[0x25E2]={
+ adobename="blacklowerrighttriangle",
category="so",
cjkwd="a",
description="BLACK LOWER RIGHT TRIANGLE",
@@ -60336,6 +62306,7 @@ characters.data={
unicodeslot=0x25E2,
},
[0x25E3]={
+ adobename="blacklowerlefttriangle",
category="so",
cjkwd="a",
description="BLACK LOWER LEFT TRIANGLE",
@@ -60344,6 +62315,7 @@ characters.data={
unicodeslot=0x25E3,
},
[0x25E4]={
+ adobename="blackupperlefttriangle",
category="so",
cjkwd="a",
description="BLACK UPPER LEFT TRIANGLE",
@@ -60352,6 +62324,7 @@ characters.data={
unicodeslot=0x25E4,
},
[0x25E5]={
+ adobename="blackupperrighttriangle",
category="so",
cjkwd="a",
description="BLACK UPPER RIGHT TRIANGLE",
@@ -60360,7 +62333,7 @@ characters.data={
unicodeslot=0x25E5,
},
[0x25E6]={
- adobename="openbullet",
+ adobename="whitebullet",
category="so",
description="WHITE BULLET",
direction="on",
@@ -60424,6 +62397,7 @@ characters.data={
unicodeslot=0x25EE,
},
[0x25EF]={
+ adobename="largecircle",
category="so",
cjkwd="a",
description="LARGE CIRCLE",
@@ -60581,6 +62555,7 @@ characters.data={
unicodeslot=0x2604,
},
[0x2605]={
+ adobename="blackstar",
category="so",
cjkwd="a",
description="BLACK STAR",
@@ -60591,6 +62566,7 @@ characters.data={
unicodeslot=0x2605,
},
[0x2606]={
+ adobename="whitestar",
category="so",
cjkwd="a",
description="WHITE STAR",
@@ -60649,6 +62625,7 @@ characters.data={
unicodeslot=0x260D,
},
[0x260E]={
+ adobename="telephoneblack",
category="so",
cjkwd="a",
description="BLACK TELEPHONE",
@@ -60657,6 +62634,7 @@ characters.data={
unicodeslot=0x260E,
},
[0x260F]={
+ adobename="whitetelephone",
category="so",
cjkwd="a",
description="WHITE TELEPHONE",
@@ -60751,6 +62729,7 @@ characters.data={
unicodeslot=0x261B,
},
[0x261C]={
+ adobename="pointingindexleftwhite",
category="so",
cjkwd="a",
description="WHITE LEFT POINTING INDEX",
@@ -60759,6 +62738,7 @@ characters.data={
unicodeslot=0x261C,
},
[0x261D]={
+ adobename="pointingindexupwhite",
category="so",
description="WHITE UP POINTING INDEX",
direction="on",
@@ -60766,6 +62746,7 @@ characters.data={
unicodeslot=0x261D,
},
[0x261E]={
+ adobename="pointingindexrightwhite",
category="so",
cjkwd="a",
description="WHITE RIGHT POINTING INDEX",
@@ -60774,6 +62755,7 @@ characters.data={
unicodeslot=0x261E,
},
[0x261F]={
+ adobename="pointingindexdownwhite",
category="so",
description="WHITE DOWN POINTING INDEX",
direction="on",
@@ -60886,6 +62868,7 @@ characters.data={
unicodeslot=0x262E,
},
[0x262F]={
+ adobename="yinyang",
category="so",
description="YIN YANG",
direction="on",
@@ -60963,7 +62946,7 @@ characters.data={
unicodeslot=0x2639,
},
[0x263A]={
- adobename="smileface",
+ adobename="whitesmilingface",
category="so",
description="WHITE SMILING FACE",
direction="on",
@@ -61008,7 +62991,7 @@ characters.data={
unicodeslot=0x263F,
},
[0x2640]={
- adobename="female",
+ adobename="venus",
category="so",
cjkwd="a",
description="FEMALE SIGN",
@@ -61017,6 +63000,7 @@ characters.data={
unicodeslot=0x2640,
},
[0x2641]={
+ adobename="earth",
category="so",
description="EARTH",
direction="on",
@@ -61024,7 +63008,7 @@ characters.data={
unicodeslot=0x2641,
},
[0x2642]={
- adobename="male",
+ adobename="mars",
category="so",
cjkwd="a",
description="MALE SIGN",
@@ -61236,7 +63220,7 @@ characters.data={
unicodeslot=0x265F,
},
[0x2660]={
- adobename="spade",
+ adobename="spadesuitblack",
category="so",
cjkwd="a",
description="BLACK SPADE SUIT",
@@ -61247,6 +63231,7 @@ characters.data={
unicodeslot=0x2660,
},
[0x2661]={
+ adobename="heartsuitwhite",
category="so",
cjkwd="a",
description="WHITE HEART SUIT",
@@ -61257,6 +63242,7 @@ characters.data={
unicodeslot=0x2661,
},
[0x2662]={
+ adobename="diamondsuitwhite",
category="so",
description="WHITE DIAMOND SUIT",
direction="on",
@@ -61266,7 +63252,7 @@ characters.data={
unicodeslot=0x2662,
},
[0x2663]={
- adobename="club",
+ adobename="clubsuitblack",
category="so",
cjkwd="a",
description="BLACK CLUB SUIT",
@@ -61277,6 +63263,7 @@ characters.data={
unicodeslot=0x2663,
},
[0x2664]={
+ adobename="spadesuitwhite",
category="so",
cjkwd="a",
description="WHITE SPADE SUIT",
@@ -61285,7 +63272,7 @@ characters.data={
unicodeslot=0x2664,
},
[0x2665]={
- adobename="heart",
+ adobename="heartsuitblack",
category="so",
cjkwd="a",
description="BLACK HEART SUIT",
@@ -61302,6 +63289,7 @@ characters.data={
unicodeslot=0x2666,
},
[0x2667]={
+ adobename="clubsuitwhite",
category="so",
cjkwd="a",
description="WHITE CLUB SUIT",
@@ -61310,6 +63298,7 @@ characters.data={
unicodeslot=0x2667,
},
[0x2668]={
+ adobename="hotsprings",
category="so",
cjkwd="a",
description="HOT SPRINGS",
@@ -61318,6 +63307,7 @@ characters.data={
unicodeslot=0x2668,
},
[0x2669]={
+ adobename="quarternote",
category="so",
cjkwd="a",
description="QUARTER NOTE",
@@ -61343,6 +63333,7 @@ characters.data={
unicodeslot=0x266B,
},
[0x266C]={
+ adobename="beamedsixteenthnotes",
category="so",
cjkwd="a",
description="BEAMED SIXTEENTH NOTES",
@@ -61351,6 +63342,7 @@ characters.data={
unicodeslot=0x266C,
},
[0x266D]={
+ adobename="musicflatsign",
category="so",
cjkwd="a",
description="MUSIC FLAT SIGN",
@@ -61370,6 +63362,7 @@ characters.data={
unicodeslot=0x266E,
},
[0x266F]={
+ adobename="musicsharpsign",
category="sm",
cjkwd="a",
description="MUSIC SHARP SIGN",
@@ -61933,6 +63926,7 @@ characters.data={
unicodeslot=0x2712,
},
[0x2713]={
+ adobename="checkmark",
category="so",
description="CHECK MARK",
direction="on",
@@ -62732,6 +64726,7 @@ characters.data={
unicodeslot=0x2789,
},
[0x278A]={
+ adobename="onecircleinversesansserif",
category="no",
description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE",
direction="on",
@@ -62739,6 +64734,7 @@ characters.data={
unicodeslot=0x278A,
},
[0x278B]={
+ adobename="twocircleinversesansserif",
category="no",
description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO",
direction="on",
@@ -62746,6 +64742,7 @@ characters.data={
unicodeslot=0x278B,
},
[0x278C]={
+ adobename="threecircleinversesansserif",
category="no",
description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE",
direction="on",
@@ -62753,6 +64750,7 @@ characters.data={
unicodeslot=0x278C,
},
[0x278D]={
+ adobename="fourcircleinversesansserif",
category="no",
description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR",
direction="on",
@@ -62760,6 +64758,7 @@ characters.data={
unicodeslot=0x278D,
},
[0x278E]={
+ adobename="fivecircleinversesansserif",
category="no",
description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE",
direction="on",
@@ -62767,6 +64766,7 @@ characters.data={
unicodeslot=0x278E,
},
[0x278F]={
+ adobename="sixcircleinversesansserif",
category="no",
description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX",
direction="on",
@@ -62774,6 +64774,7 @@ characters.data={
unicodeslot=0x278F,
},
[0x2790]={
+ adobename="sevencircleinversesansserif",
category="no",
description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN",
direction="on",
@@ -62781,6 +64782,7 @@ characters.data={
unicodeslot=0x2790,
},
[0x2791]={
+ adobename="eightcircleinversesansserif",
category="no",
description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT",
direction="on",
@@ -62788,6 +64790,7 @@ characters.data={
unicodeslot=0x2791,
},
[0x2792]={
+ adobename="ninecircleinversesansserif",
category="no",
description="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE",
direction="on",
@@ -62851,6 +64854,7 @@ characters.data={
unicodeslot=0x279D,
},
[0x279E]={
+ adobename="arrowrightheavy",
category="so",
description="HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW",
direction="on",
@@ -63385,6 +65389,46 @@ characters.data={
mirror=0x27EA,
unicodeslot=0x27EB,
},
+ [0x27EC]={
+ category="ps",
+ cjkwd="na",
+ description="MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="op",
+ mirror=0x27ED,
+ unicodeslot=0x27EC,
+ },
+ [0x27ED]={
+ category="pe",
+ cjkwd="na",
+ description="MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET",
+ direction="on",
+ linebreak="cl",
+ mirror=0x27EC,
+ unicodeslot=0x27ED,
+ },
+ [0x27EE]={
+ category="ps",
+ cjkwd="na",
+ description="MATHEMATICAL LEFT FLATTENED PARENTHESIS",
+ direction="on",
+ linebreak="op",
+ mathclass="open",
+ mathname="lgroup",
+ mirror=0x27EF,
+ unicodeslot=0x27EE,
+ },
+ [0x27EF]={
+ category="pe",
+ cjkwd="na",
+ description="MATHEMATICAL RIGHT FLATTENED PARENTHESIS",
+ direction="on",
+ linebreak="cl",
+ mathclass="close",
+ mathname="rgroup",
+ mirror=0x27EE,
+ unicodeslot=0x27EF,
+ },
[0x27F0]={
category="sm",
description="UPWARDS QUADRUPLE ARROW",
@@ -63425,7 +65469,6 @@ characters.data={
description="LONG LEFTWARDS ARROW",
direction="on",
linebreak="al",
- fallback=[[\leftarrow\joinrel\relbar]],
mathclass="relation",
mathname="longleftarrow",
unicodeslot=0x27F5,
@@ -63435,7 +65478,6 @@ characters.data={
description="LONG RIGHTWARDS ARROW",
direction="on",
linebreak="al",
- fallback=[[\relbar\joinrel\rightarrow]],
mathclass="relation",
mathname="longrightarrow",
unicodeslot=0x27F6,
@@ -63445,7 +65487,6 @@ characters.data={
description="LONG LEFT RIGHT ARROW",
direction="on",
linebreak="al",
- fallback=[[\leftarrow\joinrel\rightarrow]],
mathclass="relation",
mathname="longleftrightarrow",
unicodeslot=0x27F7,
@@ -63455,7 +65496,6 @@ characters.data={
description="LONG LEFTWARDS DOUBLE ARROW",
direction="on",
linebreak="al",
- fallback=[[\Leftarrow\joinrel\Relbar]],
mathclass="relation",
mathname="Longleftarrow",
unicodeslot=0x27F8,
@@ -63465,7 +65505,6 @@ characters.data={
description="LONG RIGHTWARDS DOUBLE ARROW",
direction="on",
linebreak="al",
- fallback=[[\Relbar\joinrel\Rightarrow]],
mathclass="relation",
mathname="Longrightarrow",
unicodeslot=0x27F9,
@@ -63475,7 +65514,6 @@ characters.data={
description="LONG LEFT RIGHT DOUBLE ARROW",
direction="on",
linebreak="al",
- fallback=[[\Leftarrow\joinrel\Rightarrow]],
mathclass="relation",
mathname="Longleftrightarrow",
unicodeslot=0x27FA,
@@ -63485,7 +65523,6 @@ characters.data={
description="LONG LEFTWARDS ARROW FROM BAR",
direction="on",
linebreak="al",
- fallback=[[\longleftarrow\mapstochar]], -- untested
mathclass="relation",
mathname="longmapsfrom",
unicodeslot=0x27FB,
@@ -63495,7 +65532,6 @@ characters.data={
description="LONG RIGHTWARDS ARROW FROM BAR",
direction="on",
linebreak="al",
- fallback=[[\mapstochar\longrightarrow]],
mathclass="relation",
mathname="longmapsto",
unicodeslot=0x27FC,
@@ -68743,18 +70779,18 @@ characters.data={
category="sm",
description="SUBSET OF ABOVE NOT EQUAL TO",
direction="on",
+ linebreak="al",
mathclass="relation",
mathname="subsetneqq",
- linebreak="al",
unicodeslot=0x2ACB,
},
[0x2ACC]={
category="sm",
description="SUPERSET OF ABOVE NOT EQUAL TO",
direction="on",
+ linebreak="al",
mathclass="relation",
mathname="supsetneqq",
- linebreak="al",
unicodeslot=0x2ACC,
},
[0x2ACD]={
@@ -75530,6 +77566,7 @@ characters.data={
unicodeslot=0x2FFB,
},
[0x3000]={
+ adobename="ideographicspace",
category="zs",
cjkwd="f",
contextname="ideographicspace",
@@ -75540,6 +77577,7 @@ characters.data={
unicodeslot=0x3000,
},
[0x3001]={
+ adobename="ideographiccomma",
category="po",
cjkwd="w",
description="IDEOGRAPHIC COMMA",
@@ -75548,6 +77586,7 @@ characters.data={
unicodeslot=0x3001,
},
[0x3002]={
+ adobename="ideographicperiod",
category="po",
cjkwd="w",
description="IDEOGRAPHIC FULL STOP",
@@ -75556,6 +77595,7 @@ characters.data={
unicodeslot=0x3002,
},
[0x3003]={
+ adobename="dittomark",
category="po",
cjkwd="w",
description="DITTO MARK",
@@ -75564,6 +77604,7 @@ characters.data={
unicodeslot=0x3003,
},
[0x3004]={
+ adobename="jis",
category="so",
cjkwd="w",
description="JAPANESE INDUSTRIAL STANDARD SYMBOL",
@@ -75572,6 +77613,7 @@ characters.data={
unicodeslot=0x3004,
},
[0x3005]={
+ adobename="ideographiciterationmark",
category="lm",
cjkwd="w",
description="IDEOGRAPHIC ITERATION MARK",
@@ -75580,6 +77622,7 @@ characters.data={
unicodeslot=0x3005,
},
[0x3006]={
+ adobename="ideographicclose",
category="lo",
cjkwd="w",
description="IDEOGRAPHIC CLOSING MARK",
@@ -75588,6 +77631,7 @@ characters.data={
unicodeslot=0x3006,
},
[0x3007]={
+ adobename="ideographiczero",
category="nl",
cjkwd="w",
description="IDEOGRAPHIC NUMBER ZERO",
@@ -75596,6 +77640,7 @@ characters.data={
unicodeslot=0x3007,
},
[0x3008]={
+ adobename="anglebracketleft",
category="ps",
cjkwd="w",
description="LEFT ANGLE BRACKET",
@@ -75605,6 +77650,7 @@ characters.data={
unicodeslot=0x3008,
},
[0x3009]={
+ adobename="anglebracketright",
category="pe",
cjkwd="w",
description="RIGHT ANGLE BRACKET",
@@ -75614,6 +77660,7 @@ characters.data={
unicodeslot=0x3009,
},
[0x300A]={
+ adobename="dblanglebracketleft",
category="ps",
cjkwd="w",
description="LEFT DOUBLE ANGLE BRACKET",
@@ -75623,6 +77670,7 @@ characters.data={
unicodeslot=0x300A,
},
[0x300B]={
+ adobename="dblanglebracketright",
category="pe",
cjkwd="w",
description="RIGHT DOUBLE ANGLE BRACKET",
@@ -75632,6 +77680,7 @@ characters.data={
unicodeslot=0x300B,
},
[0x300C]={
+ adobename="cornerbracketleft",
category="ps",
cjkwd="w",
description="LEFT CORNER BRACKET",
@@ -75641,6 +77690,7 @@ characters.data={
unicodeslot=0x300C,
},
[0x300D]={
+ adobename="cornerbracketright",
category="pe",
cjkwd="w",
description="RIGHT CORNER BRACKET",
@@ -75650,6 +77700,7 @@ characters.data={
unicodeslot=0x300D,
},
[0x300E]={
+ adobename="whitecornerbracketleft",
category="ps",
cjkwd="w",
description="LEFT WHITE CORNER BRACKET",
@@ -75659,6 +77710,7 @@ characters.data={
unicodeslot=0x300E,
},
[0x300F]={
+ adobename="whitecornerbracketright",
category="pe",
cjkwd="w",
description="RIGHT WHITE CORNER BRACKET",
@@ -75668,6 +77720,7 @@ characters.data={
unicodeslot=0x300F,
},
[0x3010]={
+ adobename="blacklenticularbracketleft",
category="ps",
cjkwd="w",
description="LEFT BLACK LENTICULAR BRACKET",
@@ -75677,6 +77730,7 @@ characters.data={
unicodeslot=0x3010,
},
[0x3011]={
+ adobename="blacklenticularbracketright",
category="pe",
cjkwd="w",
description="RIGHT BLACK LENTICULAR BRACKET",
@@ -75686,6 +77740,7 @@ characters.data={
unicodeslot=0x3011,
},
[0x3012]={
+ adobename="postalmark",
category="so",
cjkwd="w",
description="POSTAL MARK",
@@ -75694,6 +77749,7 @@ characters.data={
unicodeslot=0x3012,
},
[0x3013]={
+ adobename="getamark",
category="so",
cjkwd="w",
description="GETA MARK",
@@ -75702,28 +77758,27 @@ characters.data={
unicodeslot=0x3013,
},
[0x3014]={
+ adobename="tortoiseshellbracketleft",
category="ps",
cjkwd="w",
description="LEFT TORTOISE SHELL BRACKET",
direction="on",
linebreak="op",
mirror=0x3015,
- mathclass="open",
- mathname="lgroup",
unicodeslot=0x3014,
},
[0x3015]={
+ adobename="tortoiseshellbracketright",
category="pe",
cjkwd="w",
description="RIGHT TORTOISE SHELL BRACKET",
direction="on",
linebreak="cl",
mirror=0x3014,
- mathclass="close",
- mathname="rgroup",
unicodeslot=0x3015,
},
[0x3016]={
+ adobename="whitelenticularbracketleft",
category="ps",
cjkwd="w",
description="LEFT WHITE LENTICULAR BRACKET",
@@ -75733,6 +77788,7 @@ characters.data={
unicodeslot=0x3016,
},
[0x3017]={
+ adobename="whitelenticularbracketright",
category="pe",
cjkwd="w",
description="RIGHT WHITE LENTICULAR BRACKET",
@@ -75742,6 +77798,7 @@ characters.data={
unicodeslot=0x3017,
},
[0x3018]={
+ adobename="whitetortoiseshellbracketleft",
category="ps",
cjkwd="w",
description="LEFT WHITE TORTOISE SHELL BRACKET",
@@ -75751,6 +77808,7 @@ characters.data={
unicodeslot=0x3018,
},
[0x3019]={
+ adobename="whitetortoiseshellbracketright",
category="pe",
cjkwd="w",
description="RIGHT WHITE TORTOISE SHELL BRACKET",
@@ -75778,6 +77836,7 @@ characters.data={
unicodeslot=0x301B,
},
[0x301C]={
+ adobename="wavedash",
category="pd",
cjkwd="w",
description="WAVE DASH",
@@ -75786,6 +77845,7 @@ characters.data={
unicodeslot=0x301C,
},
[0x301D]={
+ adobename="quotedblprimereversed",
category="ps",
cjkwd="w",
description="REVERSED DOUBLE PRIME QUOTATION MARK",
@@ -75794,6 +77854,7 @@ characters.data={
unicodeslot=0x301D,
},
[0x301E]={
+ adobename="quotedblprime",
category="pe",
cjkwd="w",
description="DOUBLE PRIME QUOTATION MARK",
@@ -75810,6 +77871,7 @@ characters.data={
unicodeslot=0x301F,
},
[0x3020]={
+ adobename="postalmarkface",
category="so",
cjkwd="w",
description="POSTAL MARK FACE",
@@ -75818,6 +77880,7 @@ characters.data={
unicodeslot=0x3020,
},
[0x3021]={
+ adobename="onehangzhou",
category="nl",
cjkwd="w",
description="HANGZHOU NUMERAL ONE",
@@ -75826,6 +77889,7 @@ characters.data={
unicodeslot=0x3021,
},
[0x3022]={
+ adobename="twohangzhou",
category="nl",
cjkwd="w",
description="HANGZHOU NUMERAL TWO",
@@ -75834,6 +77898,7 @@ characters.data={
unicodeslot=0x3022,
},
[0x3023]={
+ adobename="threehangzhou",
category="nl",
cjkwd="w",
description="HANGZHOU NUMERAL THREE",
@@ -75842,6 +77907,7 @@ characters.data={
unicodeslot=0x3023,
},
[0x3024]={
+ adobename="fourhangzhou",
category="nl",
cjkwd="w",
description="HANGZHOU NUMERAL FOUR",
@@ -75850,6 +77916,7 @@ characters.data={
unicodeslot=0x3024,
},
[0x3025]={
+ adobename="fivehangzhou",
category="nl",
cjkwd="w",
description="HANGZHOU NUMERAL FIVE",
@@ -75858,6 +77925,7 @@ characters.data={
unicodeslot=0x3025,
},
[0x3026]={
+ adobename="sixhangzhou",
category="nl",
cjkwd="w",
description="HANGZHOU NUMERAL SIX",
@@ -75866,6 +77934,7 @@ characters.data={
unicodeslot=0x3026,
},
[0x3027]={
+ adobename="sevenhangzhou",
category="nl",
cjkwd="w",
description="HANGZHOU NUMERAL SEVEN",
@@ -75874,6 +77943,7 @@ characters.data={
unicodeslot=0x3027,
},
[0x3028]={
+ adobename="eighthangzhou",
category="nl",
cjkwd="w",
description="HANGZHOU NUMERAL EIGHT",
@@ -75882,6 +77952,7 @@ characters.data={
unicodeslot=0x3028,
},
[0x3029]={
+ adobename="ninehangzhou",
category="nl",
cjkwd="w",
description="HANGZHOU NUMERAL NINE",
@@ -75986,6 +78057,7 @@ characters.data={
unicodeslot=0x3035,
},
[0x3036]={
+ adobename="circlepostalmark",
category="so",
cjkwd="w",
description="CIRCLED POSTAL MARK",
@@ -76070,6 +78142,7 @@ characters.data={
unicodeslot=0x303F,
},
[0x3041]={
+ adobename="asmallhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SMALL A",
@@ -76078,6 +78151,7 @@ characters.data={
unicodeslot=0x3041,
},
[0x3042]={
+ adobename="ahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER A",
@@ -76086,6 +78160,7 @@ characters.data={
unicodeslot=0x3042,
},
[0x3043]={
+ adobename="ismallhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SMALL I",
@@ -76094,6 +78169,7 @@ characters.data={
unicodeslot=0x3043,
},
[0x3044]={
+ adobename="ihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER I",
@@ -76102,6 +78178,7 @@ characters.data={
unicodeslot=0x3044,
},
[0x3045]={
+ adobename="usmallhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SMALL U",
@@ -76110,6 +78187,7 @@ characters.data={
unicodeslot=0x3045,
},
[0x3046]={
+ adobename="uhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER U",
@@ -76118,6 +78196,7 @@ characters.data={
unicodeslot=0x3046,
},
[0x3047]={
+ adobename="esmallhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SMALL E",
@@ -76126,6 +78205,7 @@ characters.data={
unicodeslot=0x3047,
},
[0x3048]={
+ adobename="ehiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER E",
@@ -76134,6 +78214,7 @@ characters.data={
unicodeslot=0x3048,
},
[0x3049]={
+ adobename="osmallhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SMALL O",
@@ -76142,6 +78223,7 @@ characters.data={
unicodeslot=0x3049,
},
[0x304A]={
+ adobename="ohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER O",
@@ -76150,6 +78232,7 @@ characters.data={
unicodeslot=0x304A,
},
[0x304B]={
+ adobename="kahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER KA",
@@ -76158,6 +78241,7 @@ characters.data={
unicodeslot=0x304B,
},
[0x304C]={
+ adobename="gahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER GA",
@@ -76167,6 +78251,7 @@ characters.data={
unicodeslot=0x304C,
},
[0x304D]={
+ adobename="kihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER KI",
@@ -76175,6 +78260,7 @@ characters.data={
unicodeslot=0x304D,
},
[0x304E]={
+ adobename="gihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER GI",
@@ -76184,6 +78270,7 @@ characters.data={
unicodeslot=0x304E,
},
[0x304F]={
+ adobename="kuhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER KU",
@@ -76192,6 +78279,7 @@ characters.data={
unicodeslot=0x304F,
},
[0x3050]={
+ adobename="guhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER GU",
@@ -76201,6 +78289,7 @@ characters.data={
unicodeslot=0x3050,
},
[0x3051]={
+ adobename="kehiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER KE",
@@ -76209,6 +78298,7 @@ characters.data={
unicodeslot=0x3051,
},
[0x3052]={
+ adobename="gehiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER GE",
@@ -76218,6 +78308,7 @@ characters.data={
unicodeslot=0x3052,
},
[0x3053]={
+ adobename="kohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER KO",
@@ -76226,6 +78317,7 @@ characters.data={
unicodeslot=0x3053,
},
[0x3054]={
+ adobename="gohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER GO",
@@ -76235,6 +78327,7 @@ characters.data={
unicodeslot=0x3054,
},
[0x3055]={
+ adobename="sahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SA",
@@ -76243,6 +78336,7 @@ characters.data={
unicodeslot=0x3055,
},
[0x3056]={
+ adobename="zahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER ZA",
@@ -76252,6 +78346,7 @@ characters.data={
unicodeslot=0x3056,
},
[0x3057]={
+ adobename="sihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SI",
@@ -76260,6 +78355,7 @@ characters.data={
unicodeslot=0x3057,
},
[0x3058]={
+ adobename="zihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER ZI",
@@ -76269,6 +78365,7 @@ characters.data={
unicodeslot=0x3058,
},
[0x3059]={
+ adobename="suhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SU",
@@ -76277,6 +78374,7 @@ characters.data={
unicodeslot=0x3059,
},
[0x305A]={
+ adobename="zuhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER ZU",
@@ -76286,6 +78384,7 @@ characters.data={
unicodeslot=0x305A,
},
[0x305B]={
+ adobename="sehiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SE",
@@ -76294,6 +78393,7 @@ characters.data={
unicodeslot=0x305B,
},
[0x305C]={
+ adobename="zehiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER ZE",
@@ -76303,6 +78403,7 @@ characters.data={
unicodeslot=0x305C,
},
[0x305D]={
+ adobename="sohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SO",
@@ -76311,6 +78412,7 @@ characters.data={
unicodeslot=0x305D,
},
[0x305E]={
+ adobename="zohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER ZO",
@@ -76320,6 +78422,7 @@ characters.data={
unicodeslot=0x305E,
},
[0x305F]={
+ adobename="tahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER TA",
@@ -76328,6 +78431,7 @@ characters.data={
unicodeslot=0x305F,
},
[0x3060]={
+ adobename="dahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER DA",
@@ -76337,6 +78441,7 @@ characters.data={
unicodeslot=0x3060,
},
[0x3061]={
+ adobename="tihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER TI",
@@ -76345,6 +78450,7 @@ characters.data={
unicodeslot=0x3061,
},
[0x3062]={
+ adobename="dihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER DI",
@@ -76354,6 +78460,7 @@ characters.data={
unicodeslot=0x3062,
},
[0x3063]={
+ adobename="tusmallhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SMALL TU",
@@ -76362,6 +78469,7 @@ characters.data={
unicodeslot=0x3063,
},
[0x3064]={
+ adobename="tuhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER TU",
@@ -76370,6 +78478,7 @@ characters.data={
unicodeslot=0x3064,
},
[0x3065]={
+ adobename="duhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER DU",
@@ -76379,6 +78488,7 @@ characters.data={
unicodeslot=0x3065,
},
[0x3066]={
+ adobename="tehiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER TE",
@@ -76387,6 +78497,7 @@ characters.data={
unicodeslot=0x3066,
},
[0x3067]={
+ adobename="dehiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER DE",
@@ -76396,6 +78507,7 @@ characters.data={
unicodeslot=0x3067,
},
[0x3068]={
+ adobename="tohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER TO",
@@ -76404,6 +78516,7 @@ characters.data={
unicodeslot=0x3068,
},
[0x3069]={
+ adobename="dohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER DO",
@@ -76413,6 +78526,7 @@ characters.data={
unicodeslot=0x3069,
},
[0x306A]={
+ adobename="nahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER NA",
@@ -76421,6 +78535,7 @@ characters.data={
unicodeslot=0x306A,
},
[0x306B]={
+ adobename="nihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER NI",
@@ -76429,6 +78544,7 @@ characters.data={
unicodeslot=0x306B,
},
[0x306C]={
+ adobename="nuhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER NU",
@@ -76437,6 +78553,7 @@ characters.data={
unicodeslot=0x306C,
},
[0x306D]={
+ adobename="nehiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER NE",
@@ -76445,6 +78562,7 @@ characters.data={
unicodeslot=0x306D,
},
[0x306E]={
+ adobename="nohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER NO",
@@ -76453,6 +78571,7 @@ characters.data={
unicodeslot=0x306E,
},
[0x306F]={
+ adobename="hahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER HA",
@@ -76461,6 +78580,7 @@ characters.data={
unicodeslot=0x306F,
},
[0x3070]={
+ adobename="bahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER BA",
@@ -76470,6 +78590,7 @@ characters.data={
unicodeslot=0x3070,
},
[0x3071]={
+ adobename="pahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER PA",
@@ -76479,6 +78600,7 @@ characters.data={
unicodeslot=0x3071,
},
[0x3072]={
+ adobename="hihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER HI",
@@ -76487,6 +78609,7 @@ characters.data={
unicodeslot=0x3072,
},
[0x3073]={
+ adobename="bihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER BI",
@@ -76496,6 +78619,7 @@ characters.data={
unicodeslot=0x3073,
},
[0x3074]={
+ adobename="pihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER PI",
@@ -76505,6 +78629,7 @@ characters.data={
unicodeslot=0x3074,
},
[0x3075]={
+ adobename="huhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER HU",
@@ -76513,6 +78638,7 @@ characters.data={
unicodeslot=0x3075,
},
[0x3076]={
+ adobename="buhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER BU",
@@ -76522,6 +78648,7 @@ characters.data={
unicodeslot=0x3076,
},
[0x3077]={
+ adobename="puhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER PU",
@@ -76531,6 +78658,7 @@ characters.data={
unicodeslot=0x3077,
},
[0x3078]={
+ adobename="hehiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER HE",
@@ -76539,6 +78667,7 @@ characters.data={
unicodeslot=0x3078,
},
[0x3079]={
+ adobename="behiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER BE",
@@ -76548,6 +78677,7 @@ characters.data={
unicodeslot=0x3079,
},
[0x307A]={
+ adobename="pehiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER PE",
@@ -76557,6 +78687,7 @@ characters.data={
unicodeslot=0x307A,
},
[0x307B]={
+ adobename="hohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER HO",
@@ -76565,6 +78696,7 @@ characters.data={
unicodeslot=0x307B,
},
[0x307C]={
+ adobename="bohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER BO",
@@ -76574,6 +78706,7 @@ characters.data={
unicodeslot=0x307C,
},
[0x307D]={
+ adobename="pohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER PO",
@@ -76583,6 +78716,7 @@ characters.data={
unicodeslot=0x307D,
},
[0x307E]={
+ adobename="mahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER MA",
@@ -76591,6 +78725,7 @@ characters.data={
unicodeslot=0x307E,
},
[0x307F]={
+ adobename="mihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER MI",
@@ -76599,6 +78734,7 @@ characters.data={
unicodeslot=0x307F,
},
[0x3080]={
+ adobename="muhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER MU",
@@ -76607,6 +78743,7 @@ characters.data={
unicodeslot=0x3080,
},
[0x3081]={
+ adobename="mehiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER ME",
@@ -76615,6 +78752,7 @@ characters.data={
unicodeslot=0x3081,
},
[0x3082]={
+ adobename="mohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER MO",
@@ -76623,6 +78761,7 @@ characters.data={
unicodeslot=0x3082,
},
[0x3083]={
+ adobename="yasmallhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SMALL YA",
@@ -76631,6 +78770,7 @@ characters.data={
unicodeslot=0x3083,
},
[0x3084]={
+ adobename="yahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER YA",
@@ -76639,6 +78779,7 @@ characters.data={
unicodeslot=0x3084,
},
[0x3085]={
+ adobename="yusmallhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SMALL YU",
@@ -76647,6 +78788,7 @@ characters.data={
unicodeslot=0x3085,
},
[0x3086]={
+ adobename="yuhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER YU",
@@ -76655,6 +78797,7 @@ characters.data={
unicodeslot=0x3086,
},
[0x3087]={
+ adobename="yosmallhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SMALL YO",
@@ -76663,6 +78806,7 @@ characters.data={
unicodeslot=0x3087,
},
[0x3088]={
+ adobename="yohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER YO",
@@ -76671,6 +78815,7 @@ characters.data={
unicodeslot=0x3088,
},
[0x3089]={
+ adobename="rahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER RA",
@@ -76679,6 +78824,7 @@ characters.data={
unicodeslot=0x3089,
},
[0x308A]={
+ adobename="rihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER RI",
@@ -76687,6 +78833,7 @@ characters.data={
unicodeslot=0x308A,
},
[0x308B]={
+ adobename="ruhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER RU",
@@ -76695,6 +78842,7 @@ characters.data={
unicodeslot=0x308B,
},
[0x308C]={
+ adobename="rehiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER RE",
@@ -76703,6 +78851,7 @@ characters.data={
unicodeslot=0x308C,
},
[0x308D]={
+ adobename="rohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER RO",
@@ -76711,6 +78860,7 @@ characters.data={
unicodeslot=0x308D,
},
[0x308E]={
+ adobename="wasmallhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER SMALL WA",
@@ -76719,6 +78869,7 @@ characters.data={
unicodeslot=0x308E,
},
[0x308F]={
+ adobename="wahiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER WA",
@@ -76727,6 +78878,7 @@ characters.data={
unicodeslot=0x308F,
},
[0x3090]={
+ adobename="wihiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER WI",
@@ -76735,6 +78887,7 @@ characters.data={
unicodeslot=0x3090,
},
[0x3091]={
+ adobename="wehiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER WE",
@@ -76743,6 +78896,7 @@ characters.data={
unicodeslot=0x3091,
},
[0x3092]={
+ adobename="wohiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER WO",
@@ -76751,6 +78905,7 @@ characters.data={
unicodeslot=0x3092,
},
[0x3093]={
+ adobename="nhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER N",
@@ -76759,6 +78914,7 @@ characters.data={
unicodeslot=0x3093,
},
[0x3094]={
+ adobename="vuhiragana",
category="lo",
cjkwd="w",
description="HIRAGANA LETTER VU",
@@ -76800,6 +78956,7 @@ characters.data={
unicodeslot=0x309A,
},
[0x309B]={
+ adobename="voicedmarkkana",
category="sk",
cjkwd="w",
description="KATAKANA-HIRAGANA VOICED SOUND MARK",
@@ -76809,6 +78966,7 @@ characters.data={
unicodeslot=0x309B,
},
[0x309C]={
+ adobename="semivoicedmarkkana",
category="sk",
cjkwd="w",
description="KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK",
@@ -76818,6 +78976,7 @@ characters.data={
unicodeslot=0x309C,
},
[0x309D]={
+ adobename="iterationhiragana",
category="lm",
cjkwd="w",
description="HIRAGANA ITERATION MARK",
@@ -76826,6 +78985,7 @@ characters.data={
unicodeslot=0x309D,
},
[0x309E]={
+ adobename="voicediterationhiragana",
category="lm",
cjkwd="w",
description="HIRAGANA VOICED ITERATION MARK",
@@ -76852,6 +79012,7 @@ characters.data={
unicodeslot=0x30A0,
},
[0x30A1]={
+ adobename="asmallkatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SMALL A",
@@ -76860,6 +79021,7 @@ characters.data={
unicodeslot=0x30A1,
},
[0x30A2]={
+ adobename="akatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER A",
@@ -76868,6 +79030,7 @@ characters.data={
unicodeslot=0x30A2,
},
[0x30A3]={
+ adobename="ismallkatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SMALL I",
@@ -76876,6 +79039,7 @@ characters.data={
unicodeslot=0x30A3,
},
[0x30A4]={
+ adobename="ikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER I",
@@ -76884,6 +79048,7 @@ characters.data={
unicodeslot=0x30A4,
},
[0x30A5]={
+ adobename="usmallkatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SMALL U",
@@ -76892,6 +79057,7 @@ characters.data={
unicodeslot=0x30A5,
},
[0x30A6]={
+ adobename="ukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER U",
@@ -76900,6 +79066,7 @@ characters.data={
unicodeslot=0x30A6,
},
[0x30A7]={
+ adobename="esmallkatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SMALL E",
@@ -76908,6 +79075,7 @@ characters.data={
unicodeslot=0x30A7,
},
[0x30A8]={
+ adobename="ekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER E",
@@ -76916,6 +79084,7 @@ characters.data={
unicodeslot=0x30A8,
},
[0x30A9]={
+ adobename="osmallkatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SMALL O",
@@ -76924,6 +79093,7 @@ characters.data={
unicodeslot=0x30A9,
},
[0x30AA]={
+ adobename="okatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER O",
@@ -76932,6 +79102,7 @@ characters.data={
unicodeslot=0x30AA,
},
[0x30AB]={
+ adobename="kakatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER KA",
@@ -76940,6 +79111,7 @@ characters.data={
unicodeslot=0x30AB,
},
[0x30AC]={
+ adobename="gakatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER GA",
@@ -76949,6 +79121,7 @@ characters.data={
unicodeslot=0x30AC,
},
[0x30AD]={
+ adobename="kikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER KI",
@@ -76957,6 +79130,7 @@ characters.data={
unicodeslot=0x30AD,
},
[0x30AE]={
+ adobename="gikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER GI",
@@ -76966,6 +79140,7 @@ characters.data={
unicodeslot=0x30AE,
},
[0x30AF]={
+ adobename="kukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER KU",
@@ -76974,6 +79149,7 @@ characters.data={
unicodeslot=0x30AF,
},
[0x30B0]={
+ adobename="gukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER GU",
@@ -76983,6 +79159,7 @@ characters.data={
unicodeslot=0x30B0,
},
[0x30B1]={
+ adobename="kekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER KE",
@@ -76991,6 +79168,7 @@ characters.data={
unicodeslot=0x30B1,
},
[0x30B2]={
+ adobename="gekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER GE",
@@ -77000,6 +79178,7 @@ characters.data={
unicodeslot=0x30B2,
},
[0x30B3]={
+ adobename="kokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER KO",
@@ -77008,6 +79187,7 @@ characters.data={
unicodeslot=0x30B3,
},
[0x30B4]={
+ adobename="gokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER GO",
@@ -77017,6 +79197,7 @@ characters.data={
unicodeslot=0x30B4,
},
[0x30B5]={
+ adobename="sakatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SA",
@@ -77025,6 +79206,7 @@ characters.data={
unicodeslot=0x30B5,
},
[0x30B6]={
+ adobename="zakatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER ZA",
@@ -77034,6 +79216,7 @@ characters.data={
unicodeslot=0x30B6,
},
[0x30B7]={
+ adobename="sikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SI",
@@ -77042,6 +79225,7 @@ characters.data={
unicodeslot=0x30B7,
},
[0x30B8]={
+ adobename="zikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER ZI",
@@ -77051,6 +79235,7 @@ characters.data={
unicodeslot=0x30B8,
},
[0x30B9]={
+ adobename="sukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SU",
@@ -77059,6 +79244,7 @@ characters.data={
unicodeslot=0x30B9,
},
[0x30BA]={
+ adobename="zukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER ZU",
@@ -77068,6 +79254,7 @@ characters.data={
unicodeslot=0x30BA,
},
[0x30BB]={
+ adobename="sekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SE",
@@ -77076,6 +79263,7 @@ characters.data={
unicodeslot=0x30BB,
},
[0x30BC]={
+ adobename="zekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER ZE",
@@ -77085,6 +79273,7 @@ characters.data={
unicodeslot=0x30BC,
},
[0x30BD]={
+ adobename="sokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SO",
@@ -77093,6 +79282,7 @@ characters.data={
unicodeslot=0x30BD,
},
[0x30BE]={
+ adobename="zokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER ZO",
@@ -77102,6 +79292,7 @@ characters.data={
unicodeslot=0x30BE,
},
[0x30BF]={
+ adobename="takatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER TA",
@@ -77110,6 +79301,7 @@ characters.data={
unicodeslot=0x30BF,
},
[0x30C0]={
+ adobename="dakatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER DA",
@@ -77119,6 +79311,7 @@ characters.data={
unicodeslot=0x30C0,
},
[0x30C1]={
+ adobename="tikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER TI",
@@ -77127,6 +79320,7 @@ characters.data={
unicodeslot=0x30C1,
},
[0x30C2]={
+ adobename="dikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER DI",
@@ -77136,6 +79330,7 @@ characters.data={
unicodeslot=0x30C2,
},
[0x30C3]={
+ adobename="tusmallkatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SMALL TU",
@@ -77144,6 +79339,7 @@ characters.data={
unicodeslot=0x30C3,
},
[0x30C4]={
+ adobename="tukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER TU",
@@ -77152,6 +79348,7 @@ characters.data={
unicodeslot=0x30C4,
},
[0x30C5]={
+ adobename="dukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER DU",
@@ -77161,6 +79358,7 @@ characters.data={
unicodeslot=0x30C5,
},
[0x30C6]={
+ adobename="tekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER TE",
@@ -77169,6 +79367,7 @@ characters.data={
unicodeslot=0x30C6,
},
[0x30C7]={
+ adobename="dekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER DE",
@@ -77178,6 +79377,7 @@ characters.data={
unicodeslot=0x30C7,
},
[0x30C8]={
+ adobename="tokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER TO",
@@ -77186,6 +79386,7 @@ characters.data={
unicodeslot=0x30C8,
},
[0x30C9]={
+ adobename="dokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER DO",
@@ -77195,6 +79396,7 @@ characters.data={
unicodeslot=0x30C9,
},
[0x30CA]={
+ adobename="nakatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER NA",
@@ -77203,6 +79405,7 @@ characters.data={
unicodeslot=0x30CA,
},
[0x30CB]={
+ adobename="nikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER NI",
@@ -77211,6 +79414,7 @@ characters.data={
unicodeslot=0x30CB,
},
[0x30CC]={
+ adobename="nukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER NU",
@@ -77219,6 +79423,7 @@ characters.data={
unicodeslot=0x30CC,
},
[0x30CD]={
+ adobename="nekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER NE",
@@ -77227,6 +79432,7 @@ characters.data={
unicodeslot=0x30CD,
},
[0x30CE]={
+ adobename="nokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER NO",
@@ -77235,6 +79441,7 @@ characters.data={
unicodeslot=0x30CE,
},
[0x30CF]={
+ adobename="hakatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER HA",
@@ -77243,6 +79450,7 @@ characters.data={
unicodeslot=0x30CF,
},
[0x30D0]={
+ adobename="bakatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER BA",
@@ -77252,6 +79460,7 @@ characters.data={
unicodeslot=0x30D0,
},
[0x30D1]={
+ adobename="pakatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER PA",
@@ -77261,6 +79470,7 @@ characters.data={
unicodeslot=0x30D1,
},
[0x30D2]={
+ adobename="hikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER HI",
@@ -77269,6 +79479,7 @@ characters.data={
unicodeslot=0x30D2,
},
[0x30D3]={
+ adobename="bikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER BI",
@@ -77278,6 +79489,7 @@ characters.data={
unicodeslot=0x30D3,
},
[0x30D4]={
+ adobename="pikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER PI",
@@ -77287,6 +79499,7 @@ characters.data={
unicodeslot=0x30D4,
},
[0x30D5]={
+ adobename="hukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER HU",
@@ -77295,6 +79508,7 @@ characters.data={
unicodeslot=0x30D5,
},
[0x30D6]={
+ adobename="bukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER BU",
@@ -77304,6 +79518,7 @@ characters.data={
unicodeslot=0x30D6,
},
[0x30D7]={
+ adobename="pukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER PU",
@@ -77313,6 +79528,7 @@ characters.data={
unicodeslot=0x30D7,
},
[0x30D8]={
+ adobename="hekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER HE",
@@ -77321,6 +79537,7 @@ characters.data={
unicodeslot=0x30D8,
},
[0x30D9]={
+ adobename="bekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER BE",
@@ -77330,6 +79547,7 @@ characters.data={
unicodeslot=0x30D9,
},
[0x30DA]={
+ adobename="pekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER PE",
@@ -77339,6 +79557,7 @@ characters.data={
unicodeslot=0x30DA,
},
[0x30DB]={
+ adobename="hokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER HO",
@@ -77347,6 +79566,7 @@ characters.data={
unicodeslot=0x30DB,
},
[0x30DC]={
+ adobename="bokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER BO",
@@ -77356,6 +79576,7 @@ characters.data={
unicodeslot=0x30DC,
},
[0x30DD]={
+ adobename="pokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER PO",
@@ -77365,6 +79586,7 @@ characters.data={
unicodeslot=0x30DD,
},
[0x30DE]={
+ adobename="makatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER MA",
@@ -77373,6 +79595,7 @@ characters.data={
unicodeslot=0x30DE,
},
[0x30DF]={
+ adobename="mikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER MI",
@@ -77381,6 +79604,7 @@ characters.data={
unicodeslot=0x30DF,
},
[0x30E0]={
+ adobename="mukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER MU",
@@ -77389,6 +79613,7 @@ characters.data={
unicodeslot=0x30E0,
},
[0x30E1]={
+ adobename="mekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER ME",
@@ -77397,6 +79622,7 @@ characters.data={
unicodeslot=0x30E1,
},
[0x30E2]={
+ adobename="mokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER MO",
@@ -77405,6 +79631,7 @@ characters.data={
unicodeslot=0x30E2,
},
[0x30E3]={
+ adobename="yasmallkatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SMALL YA",
@@ -77413,6 +79640,7 @@ characters.data={
unicodeslot=0x30E3,
},
[0x30E4]={
+ adobename="yakatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER YA",
@@ -77421,6 +79649,7 @@ characters.data={
unicodeslot=0x30E4,
},
[0x30E5]={
+ adobename="yusmallkatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SMALL YU",
@@ -77429,6 +79658,7 @@ characters.data={
unicodeslot=0x30E5,
},
[0x30E6]={
+ adobename="yukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER YU",
@@ -77437,6 +79667,7 @@ characters.data={
unicodeslot=0x30E6,
},
[0x30E7]={
+ adobename="yosmallkatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SMALL YO",
@@ -77445,6 +79676,7 @@ characters.data={
unicodeslot=0x30E7,
},
[0x30E8]={
+ adobename="yokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER YO",
@@ -77453,6 +79685,7 @@ characters.data={
unicodeslot=0x30E8,
},
[0x30E9]={
+ adobename="rakatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER RA",
@@ -77461,6 +79694,7 @@ characters.data={
unicodeslot=0x30E9,
},
[0x30EA]={
+ adobename="rikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER RI",
@@ -77469,6 +79703,7 @@ characters.data={
unicodeslot=0x30EA,
},
[0x30EB]={
+ adobename="rukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER RU",
@@ -77477,6 +79712,7 @@ characters.data={
unicodeslot=0x30EB,
},
[0x30EC]={
+ adobename="rekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER RE",
@@ -77485,6 +79721,7 @@ characters.data={
unicodeslot=0x30EC,
},
[0x30ED]={
+ adobename="rokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER RO",
@@ -77493,6 +79730,7 @@ characters.data={
unicodeslot=0x30ED,
},
[0x30EE]={
+ adobename="wasmallkatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SMALL WA",
@@ -77501,6 +79739,7 @@ characters.data={
unicodeslot=0x30EE,
},
[0x30EF]={
+ adobename="wakatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER WA",
@@ -77509,6 +79748,7 @@ characters.data={
unicodeslot=0x30EF,
},
[0x30F0]={
+ adobename="wikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER WI",
@@ -77517,6 +79757,7 @@ characters.data={
unicodeslot=0x30F0,
},
[0x30F1]={
+ adobename="wekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER WE",
@@ -77525,6 +79766,7 @@ characters.data={
unicodeslot=0x30F1,
},
[0x30F2]={
+ adobename="wokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER WO",
@@ -77533,6 +79775,7 @@ characters.data={
unicodeslot=0x30F2,
},
[0x30F3]={
+ adobename="nkatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER N",
@@ -77541,6 +79784,7 @@ characters.data={
unicodeslot=0x30F3,
},
[0x30F4]={
+ adobename="vukatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER VU",
@@ -77550,6 +79794,7 @@ characters.data={
unicodeslot=0x30F4,
},
[0x30F5]={
+ adobename="kasmallkatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SMALL KA",
@@ -77558,6 +79803,7 @@ characters.data={
unicodeslot=0x30F5,
},
[0x30F6]={
+ adobename="kesmallkatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER SMALL KE",
@@ -77566,6 +79812,7 @@ characters.data={
unicodeslot=0x30F6,
},
[0x30F7]={
+ adobename="vakatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER VA",
@@ -77575,6 +79822,7 @@ characters.data={
unicodeslot=0x30F7,
},
[0x30F8]={
+ adobename="vikatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER VI",
@@ -77584,6 +79832,7 @@ characters.data={
unicodeslot=0x30F8,
},
[0x30F9]={
+ adobename="vekatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER VE",
@@ -77593,6 +79842,7 @@ characters.data={
unicodeslot=0x30F9,
},
[0x30FA]={
+ adobename="vokatakana",
category="lo",
cjkwd="w",
description="KATAKANA LETTER VO",
@@ -77602,6 +79852,7 @@ characters.data={
unicodeslot=0x30FA,
},
[0x30FB]={
+ adobename="dotkatakana",
category="po",
cjkwd="w",
description="KATAKANA MIDDLE DOT",
@@ -77610,6 +79861,7 @@ characters.data={
unicodeslot=0x30FB,
},
[0x30FC]={
+ adobename="prolongedkana",
category="lm",
cjkwd="w",
description="KATAKANA-HIRAGANA PROLONGED SOUND MARK",
@@ -77618,6 +79870,7 @@ characters.data={
unicodeslot=0x30FC,
},
[0x30FD]={
+ adobename="iterationkatakana",
category="lm",
cjkwd="w",
description="KATAKANA ITERATION MARK",
@@ -77626,6 +79879,7 @@ characters.data={
unicodeslot=0x30FD,
},
[0x30FE]={
+ adobename="voicediterationkatakana",
category="lm",
cjkwd="w",
description="KATAKANA VOICED ITERATION MARK",
@@ -77644,6 +79898,7 @@ characters.data={
unicodeslot=0x30FF,
},
[0x3105]={
+ adobename="bbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER B",
@@ -77652,6 +79907,7 @@ characters.data={
unicodeslot=0x3105,
},
[0x3106]={
+ adobename="pbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER P",
@@ -77660,6 +79916,7 @@ characters.data={
unicodeslot=0x3106,
},
[0x3107]={
+ adobename="mbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER M",
@@ -77668,6 +79925,7 @@ characters.data={
unicodeslot=0x3107,
},
[0x3108]={
+ adobename="fbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER F",
@@ -77676,6 +79934,7 @@ characters.data={
unicodeslot=0x3108,
},
[0x3109]={
+ adobename="dbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER D",
@@ -77684,6 +79943,7 @@ characters.data={
unicodeslot=0x3109,
},
[0x310A]={
+ adobename="tbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER T",
@@ -77692,6 +79952,7 @@ characters.data={
unicodeslot=0x310A,
},
[0x310B]={
+ adobename="nbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER N",
@@ -77700,6 +79961,7 @@ characters.data={
unicodeslot=0x310B,
},
[0x310C]={
+ adobename="lbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER L",
@@ -77708,6 +79970,7 @@ characters.data={
unicodeslot=0x310C,
},
[0x310D]={
+ adobename="gbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER G",
@@ -77716,6 +79979,7 @@ characters.data={
unicodeslot=0x310D,
},
[0x310E]={
+ adobename="kbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER K",
@@ -77724,6 +79988,7 @@ characters.data={
unicodeslot=0x310E,
},
[0x310F]={
+ adobename="hbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER H",
@@ -77732,6 +79997,7 @@ characters.data={
unicodeslot=0x310F,
},
[0x3110]={
+ adobename="jbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER J",
@@ -77740,6 +80006,7 @@ characters.data={
unicodeslot=0x3110,
},
[0x3111]={
+ adobename="qbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER Q",
@@ -77748,6 +80015,7 @@ characters.data={
unicodeslot=0x3111,
},
[0x3112]={
+ adobename="xbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER X",
@@ -77756,6 +80024,7 @@ characters.data={
unicodeslot=0x3112,
},
[0x3113]={
+ adobename="zhbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER ZH",
@@ -77764,6 +80033,7 @@ characters.data={
unicodeslot=0x3113,
},
[0x3114]={
+ adobename="chbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER CH",
@@ -77772,6 +80042,7 @@ characters.data={
unicodeslot=0x3114,
},
[0x3115]={
+ adobename="shbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER SH",
@@ -77780,6 +80051,7 @@ characters.data={
unicodeslot=0x3115,
},
[0x3116]={
+ adobename="rbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER R",
@@ -77788,6 +80060,7 @@ characters.data={
unicodeslot=0x3116,
},
[0x3117]={
+ adobename="zbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER Z",
@@ -77796,6 +80069,7 @@ characters.data={
unicodeslot=0x3117,
},
[0x3118]={
+ adobename="cbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER C",
@@ -77804,6 +80078,7 @@ characters.data={
unicodeslot=0x3118,
},
[0x3119]={
+ adobename="sbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER S",
@@ -77812,6 +80087,7 @@ characters.data={
unicodeslot=0x3119,
},
[0x311A]={
+ adobename="abopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER A",
@@ -77820,6 +80096,7 @@ characters.data={
unicodeslot=0x311A,
},
[0x311B]={
+ adobename="obopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER O",
@@ -77828,6 +80105,7 @@ characters.data={
unicodeslot=0x311B,
},
[0x311C]={
+ adobename="ebopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER E",
@@ -77836,6 +80114,7 @@ characters.data={
unicodeslot=0x311C,
},
[0x311D]={
+ adobename="ehbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER EH",
@@ -77844,6 +80123,7 @@ characters.data={
unicodeslot=0x311D,
},
[0x311E]={
+ adobename="aibopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER AI",
@@ -77852,6 +80132,7 @@ characters.data={
unicodeslot=0x311E,
},
[0x311F]={
+ adobename="eibopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER EI",
@@ -77860,6 +80141,7 @@ characters.data={
unicodeslot=0x311F,
},
[0x3120]={
+ adobename="aubopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER AU",
@@ -77868,6 +80150,7 @@ characters.data={
unicodeslot=0x3120,
},
[0x3121]={
+ adobename="oubopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER OU",
@@ -77876,6 +80159,7 @@ characters.data={
unicodeslot=0x3121,
},
[0x3122]={
+ adobename="anbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER AN",
@@ -77884,6 +80168,7 @@ characters.data={
unicodeslot=0x3122,
},
[0x3123]={
+ adobename="enbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER EN",
@@ -77892,6 +80177,7 @@ characters.data={
unicodeslot=0x3123,
},
[0x3124]={
+ adobename="angbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER ANG",
@@ -77900,6 +80186,7 @@ characters.data={
unicodeslot=0x3124,
},
[0x3125]={
+ adobename="engbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER ENG",
@@ -77908,6 +80195,7 @@ characters.data={
unicodeslot=0x3125,
},
[0x3126]={
+ adobename="erbopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER ER",
@@ -77916,6 +80204,7 @@ characters.data={
unicodeslot=0x3126,
},
[0x3127]={
+ adobename="ibopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER I",
@@ -77924,6 +80213,7 @@ characters.data={
unicodeslot=0x3127,
},
[0x3128]={
+ adobename="ubopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER U",
@@ -77932,6 +80222,7 @@ characters.data={
unicodeslot=0x3128,
},
[0x3129]={
+ adobename="iubopomofo",
category="lo",
cjkwd="w",
description="BOPOMOFO LETTER IU",
@@ -77964,6 +80255,7 @@ characters.data={
unicodeslot=0x312C,
},
[0x3131]={
+ adobename="kiyeokkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER KIYEOK",
@@ -77973,6 +80265,7 @@ characters.data={
unicodeslot=0x3131,
},
[0x3132]={
+ adobename="ssangkiyeokkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SSANGKIYEOK",
@@ -77982,6 +80275,7 @@ characters.data={
unicodeslot=0x3132,
},
[0x3133]={
+ adobename="kiyeoksioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER KIYEOK-SIOS",
@@ -77991,6 +80285,7 @@ characters.data={
unicodeslot=0x3133,
},
[0x3134]={
+ adobename="nieunkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER NIEUN",
@@ -78000,6 +80295,7 @@ characters.data={
unicodeslot=0x3134,
},
[0x3135]={
+ adobename="nieuncieuckorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER NIEUN-CIEUC",
@@ -78009,6 +80305,7 @@ characters.data={
unicodeslot=0x3135,
},
[0x3136]={
+ adobename="nieunhieuhkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER NIEUN-HIEUH",
@@ -78018,6 +80315,7 @@ characters.data={
unicodeslot=0x3136,
},
[0x3137]={
+ adobename="tikeutkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER TIKEUT",
@@ -78027,6 +80325,7 @@ characters.data={
unicodeslot=0x3137,
},
[0x3138]={
+ adobename="ssangtikeutkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SSANGTIKEUT",
@@ -78036,6 +80335,7 @@ characters.data={
unicodeslot=0x3138,
},
[0x3139]={
+ adobename="rieulkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER RIEUL",
@@ -78045,6 +80345,7 @@ characters.data={
unicodeslot=0x3139,
},
[0x313A]={
+ adobename="rieulkiyeokkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER RIEUL-KIYEOK",
@@ -78054,6 +80355,7 @@ characters.data={
unicodeslot=0x313A,
},
[0x313B]={
+ adobename="rieulmieumkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER RIEUL-MIEUM",
@@ -78063,6 +80365,7 @@ characters.data={
unicodeslot=0x313B,
},
[0x313C]={
+ adobename="rieulpieupkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER RIEUL-PIEUP",
@@ -78072,6 +80375,7 @@ characters.data={
unicodeslot=0x313C,
},
[0x313D]={
+ adobename="rieulsioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER RIEUL-SIOS",
@@ -78081,6 +80385,7 @@ characters.data={
unicodeslot=0x313D,
},
[0x313E]={
+ adobename="rieulthieuthkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER RIEUL-THIEUTH",
@@ -78090,6 +80395,7 @@ characters.data={
unicodeslot=0x313E,
},
[0x313F]={
+ adobename="rieulphieuphkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER RIEUL-PHIEUPH",
@@ -78099,6 +80405,7 @@ characters.data={
unicodeslot=0x313F,
},
[0x3140]={
+ adobename="rieulhieuhkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER RIEUL-HIEUH",
@@ -78108,6 +80415,7 @@ characters.data={
unicodeslot=0x3140,
},
[0x3141]={
+ adobename="mieumkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER MIEUM",
@@ -78117,6 +80425,7 @@ characters.data={
unicodeslot=0x3141,
},
[0x3142]={
+ adobename="pieupkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER PIEUP",
@@ -78126,6 +80435,7 @@ characters.data={
unicodeslot=0x3142,
},
[0x3143]={
+ adobename="ssangpieupkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SSANGPIEUP",
@@ -78135,6 +80445,7 @@ characters.data={
unicodeslot=0x3143,
},
[0x3144]={
+ adobename="pieupsioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER PIEUP-SIOS",
@@ -78144,6 +80455,7 @@ characters.data={
unicodeslot=0x3144,
},
[0x3145]={
+ adobename="sioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SIOS",
@@ -78153,6 +80465,7 @@ characters.data={
unicodeslot=0x3145,
},
[0x3146]={
+ adobename="ssangsioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SSANGSIOS",
@@ -78162,6 +80475,7 @@ characters.data={
unicodeslot=0x3146,
},
[0x3147]={
+ adobename="ieungkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER IEUNG",
@@ -78171,6 +80485,7 @@ characters.data={
unicodeslot=0x3147,
},
[0x3148]={
+ adobename="cieuckorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER CIEUC",
@@ -78180,6 +80495,7 @@ characters.data={
unicodeslot=0x3148,
},
[0x3149]={
+ adobename="ssangcieuckorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SSANGCIEUC",
@@ -78189,6 +80505,7 @@ characters.data={
unicodeslot=0x3149,
},
[0x314A]={
+ adobename="chieuchkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER CHIEUCH",
@@ -78198,6 +80515,7 @@ characters.data={
unicodeslot=0x314A,
},
[0x314B]={
+ adobename="khieukhkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER KHIEUKH",
@@ -78207,6 +80525,7 @@ characters.data={
unicodeslot=0x314B,
},
[0x314C]={
+ adobename="thieuthkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER THIEUTH",
@@ -78216,6 +80535,7 @@ characters.data={
unicodeslot=0x314C,
},
[0x314D]={
+ adobename="phieuphkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER PHIEUPH",
@@ -78225,6 +80545,7 @@ characters.data={
unicodeslot=0x314D,
},
[0x314E]={
+ adobename="hieuhkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER HIEUH",
@@ -78234,6 +80555,7 @@ characters.data={
unicodeslot=0x314E,
},
[0x314F]={
+ adobename="akorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER A",
@@ -78243,6 +80565,7 @@ characters.data={
unicodeslot=0x314F,
},
[0x3150]={
+ adobename="aekorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER AE",
@@ -78252,6 +80575,7 @@ characters.data={
unicodeslot=0x3150,
},
[0x3151]={
+ adobename="yakorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YA",
@@ -78261,6 +80585,7 @@ characters.data={
unicodeslot=0x3151,
},
[0x3152]={
+ adobename="yaekorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YAE",
@@ -78270,6 +80595,7 @@ characters.data={
unicodeslot=0x3152,
},
[0x3153]={
+ adobename="eokorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER EO",
@@ -78279,6 +80605,7 @@ characters.data={
unicodeslot=0x3153,
},
[0x3154]={
+ adobename="ekorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER E",
@@ -78288,6 +80615,7 @@ characters.data={
unicodeslot=0x3154,
},
[0x3155]={
+ adobename="yeokorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YEO",
@@ -78297,6 +80625,7 @@ characters.data={
unicodeslot=0x3155,
},
[0x3156]={
+ adobename="yekorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YE",
@@ -78306,6 +80635,7 @@ characters.data={
unicodeslot=0x3156,
},
[0x3157]={
+ adobename="okorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER O",
@@ -78315,6 +80645,7 @@ characters.data={
unicodeslot=0x3157,
},
[0x3158]={
+ adobename="wakorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER WA",
@@ -78324,6 +80655,7 @@ characters.data={
unicodeslot=0x3158,
},
[0x3159]={
+ adobename="waekorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER WAE",
@@ -78333,6 +80665,7 @@ characters.data={
unicodeslot=0x3159,
},
[0x315A]={
+ adobename="oekorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER OE",
@@ -78342,6 +80675,7 @@ characters.data={
unicodeslot=0x315A,
},
[0x315B]={
+ adobename="yokorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YO",
@@ -78351,6 +80685,7 @@ characters.data={
unicodeslot=0x315B,
},
[0x315C]={
+ adobename="ukorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER U",
@@ -78360,6 +80695,7 @@ characters.data={
unicodeslot=0x315C,
},
[0x315D]={
+ adobename="weokorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER WEO",
@@ -78369,6 +80705,7 @@ characters.data={
unicodeslot=0x315D,
},
[0x315E]={
+ adobename="wekorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER WE",
@@ -78378,6 +80715,7 @@ characters.data={
unicodeslot=0x315E,
},
[0x315F]={
+ adobename="wikorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER WI",
@@ -78387,6 +80725,7 @@ characters.data={
unicodeslot=0x315F,
},
[0x3160]={
+ adobename="yukorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YU",
@@ -78396,6 +80735,7 @@ characters.data={
unicodeslot=0x3160,
},
[0x3161]={
+ adobename="eukorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER EU",
@@ -78405,6 +80745,7 @@ characters.data={
unicodeslot=0x3161,
},
[0x3162]={
+ adobename="yikorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YI",
@@ -78414,6 +80755,7 @@ characters.data={
unicodeslot=0x3162,
},
[0x3163]={
+ adobename="ikorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER I",
@@ -78423,6 +80765,7 @@ characters.data={
unicodeslot=0x3163,
},
[0x3164]={
+ adobename="hangulfiller",
category="lo",
cjkwd="w",
description="HANGUL FILLER",
@@ -78432,6 +80775,7 @@ characters.data={
unicodeslot=0x3164,
},
[0x3165]={
+ adobename="ssangnieunkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SSANGNIEUN",
@@ -78441,6 +80785,7 @@ characters.data={
unicodeslot=0x3165,
},
[0x3166]={
+ adobename="nieuntikeutkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER NIEUN-TIKEUT",
@@ -78450,6 +80795,7 @@ characters.data={
unicodeslot=0x3166,
},
[0x3167]={
+ adobename="nieunsioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER NIEUN-SIOS",
@@ -78459,6 +80805,7 @@ characters.data={
unicodeslot=0x3167,
},
[0x3168]={
+ adobename="nieunpansioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER NIEUN-PANSIOS",
@@ -78468,6 +80815,7 @@ characters.data={
unicodeslot=0x3168,
},
[0x3169]={
+ adobename="rieulkiyeoksioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER RIEUL-KIYEOK-SIOS",
@@ -78477,6 +80825,7 @@ characters.data={
unicodeslot=0x3169,
},
[0x316A]={
+ adobename="rieultikeutkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER RIEUL-TIKEUT",
@@ -78486,6 +80835,7 @@ characters.data={
unicodeslot=0x316A,
},
[0x316B]={
+ adobename="rieulpieupsioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER RIEUL-PIEUP-SIOS",
@@ -78495,6 +80845,7 @@ characters.data={
unicodeslot=0x316B,
},
[0x316C]={
+ adobename="rieulpansioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER RIEUL-PANSIOS",
@@ -78504,6 +80855,7 @@ characters.data={
unicodeslot=0x316C,
},
[0x316D]={
+ adobename="rieulyeorinhieuhkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER RIEUL-YEORINHIEUH",
@@ -78513,6 +80865,7 @@ characters.data={
unicodeslot=0x316D,
},
[0x316E]={
+ adobename="mieumpieupkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER MIEUM-PIEUP",
@@ -78522,6 +80875,7 @@ characters.data={
unicodeslot=0x316E,
},
[0x316F]={
+ adobename="mieumsioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER MIEUM-SIOS",
@@ -78531,6 +80885,7 @@ characters.data={
unicodeslot=0x316F,
},
[0x3170]={
+ adobename="mieumpansioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER MIEUM-PANSIOS",
@@ -78540,6 +80895,7 @@ characters.data={
unicodeslot=0x3170,
},
[0x3171]={
+ adobename="kapyeounmieumkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER KAPYEOUNMIEUM",
@@ -78549,6 +80905,7 @@ characters.data={
unicodeslot=0x3171,
},
[0x3172]={
+ adobename="pieupkiyeokkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER PIEUP-KIYEOK",
@@ -78558,6 +80915,7 @@ characters.data={
unicodeslot=0x3172,
},
[0x3173]={
+ adobename="pieuptikeutkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER PIEUP-TIKEUT",
@@ -78567,6 +80925,7 @@ characters.data={
unicodeslot=0x3173,
},
[0x3174]={
+ adobename="pieupsioskiyeokkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER PIEUP-SIOS-KIYEOK",
@@ -78576,6 +80935,7 @@ characters.data={
unicodeslot=0x3174,
},
[0x3175]={
+ adobename="pieupsiostikeutkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER PIEUP-SIOS-TIKEUT",
@@ -78585,6 +80945,7 @@ characters.data={
unicodeslot=0x3175,
},
[0x3176]={
+ adobename="pieupcieuckorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER PIEUP-CIEUC",
@@ -78594,6 +80955,7 @@ characters.data={
unicodeslot=0x3176,
},
[0x3177]={
+ adobename="pieupthieuthkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER PIEUP-THIEUTH",
@@ -78603,6 +80965,7 @@ characters.data={
unicodeslot=0x3177,
},
[0x3178]={
+ adobename="kapyeounpieupkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER KAPYEOUNPIEUP",
@@ -78612,6 +80975,7 @@ characters.data={
unicodeslot=0x3178,
},
[0x3179]={
+ adobename="kapyeounssangpieupkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER KAPYEOUNSSANGPIEUP",
@@ -78621,6 +80985,7 @@ characters.data={
unicodeslot=0x3179,
},
[0x317A]={
+ adobename="sioskiyeokkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SIOS-KIYEOK",
@@ -78630,6 +80995,7 @@ characters.data={
unicodeslot=0x317A,
},
[0x317B]={
+ adobename="siosnieunkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SIOS-NIEUN",
@@ -78639,6 +81005,7 @@ characters.data={
unicodeslot=0x317B,
},
[0x317C]={
+ adobename="siostikeutkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SIOS-TIKEUT",
@@ -78648,6 +81015,7 @@ characters.data={
unicodeslot=0x317C,
},
[0x317D]={
+ adobename="siospieupkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SIOS-PIEUP",
@@ -78657,6 +81025,7 @@ characters.data={
unicodeslot=0x317D,
},
[0x317E]={
+ adobename="sioscieuckorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SIOS-CIEUC",
@@ -78666,6 +81035,7 @@ characters.data={
unicodeslot=0x317E,
},
[0x317F]={
+ adobename="pansioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER PANSIOS",
@@ -78675,6 +81045,7 @@ characters.data={
unicodeslot=0x317F,
},
[0x3180]={
+ adobename="ssangieungkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SSANGIEUNG",
@@ -78684,6 +81055,7 @@ characters.data={
unicodeslot=0x3180,
},
[0x3181]={
+ adobename="yesieungkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YESIEUNG",
@@ -78693,6 +81065,7 @@ characters.data={
unicodeslot=0x3181,
},
[0x3182]={
+ adobename="yesieungsioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YESIEUNG-SIOS",
@@ -78702,6 +81075,7 @@ characters.data={
unicodeslot=0x3182,
},
[0x3183]={
+ adobename="yesieungpansioskorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YESIEUNG-PANSIOS",
@@ -78711,6 +81085,7 @@ characters.data={
unicodeslot=0x3183,
},
[0x3184]={
+ adobename="kapyeounphieuphkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER KAPYEOUNPHIEUPH",
@@ -78720,6 +81095,7 @@ characters.data={
unicodeslot=0x3184,
},
[0x3185]={
+ adobename="ssanghieuhkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER SSANGHIEUH",
@@ -78729,6 +81105,7 @@ characters.data={
unicodeslot=0x3185,
},
[0x3186]={
+ adobename="yeorinhieuhkorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YEORINHIEUH",
@@ -78738,6 +81115,7 @@ characters.data={
unicodeslot=0x3186,
},
[0x3187]={
+ adobename="yoyakorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YO-YA",
@@ -78747,6 +81125,7 @@ characters.data={
unicodeslot=0x3187,
},
[0x3188]={
+ adobename="yoyaekorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YO-YAE",
@@ -78756,6 +81135,7 @@ characters.data={
unicodeslot=0x3188,
},
[0x3189]={
+ adobename="yoikorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YO-I",
@@ -78765,6 +81145,7 @@ characters.data={
unicodeslot=0x3189,
},
[0x318A]={
+ adobename="yuyeokorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YU-YEO",
@@ -78774,6 +81155,7 @@ characters.data={
unicodeslot=0x318A,
},
[0x318B]={
+ adobename="yuyekorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YU-YE",
@@ -78783,6 +81165,7 @@ characters.data={
unicodeslot=0x318B,
},
[0x318C]={
+ adobename="yuikorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER YU-I",
@@ -78792,6 +81175,7 @@ characters.data={
unicodeslot=0x318C,
},
[0x318D]={
+ adobename="araeakorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER ARAEA",
@@ -78801,6 +81185,7 @@ characters.data={
unicodeslot=0x318D,
},
[0x318E]={
+ adobename="araeaekorean",
category="lo",
cjkwd="w",
description="HANGUL LETTER ARAEAE",
@@ -79400,6 +81785,7 @@ characters.data={
unicodeslot=0x31FF,
},
[0x3200]={
+ adobename="kiyeokparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL KIYEOK",
@@ -79409,6 +81795,7 @@ characters.data={
unicodeslot=0x3200,
},
[0x3201]={
+ adobename="nieunparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL NIEUN",
@@ -79418,6 +81805,7 @@ characters.data={
unicodeslot=0x3201,
},
[0x3202]={
+ adobename="tikeutparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL TIKEUT",
@@ -79427,6 +81815,7 @@ characters.data={
unicodeslot=0x3202,
},
[0x3203]={
+ adobename="rieulparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL RIEUL",
@@ -79436,6 +81825,7 @@ characters.data={
unicodeslot=0x3203,
},
[0x3204]={
+ adobename="mieumparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL MIEUM",
@@ -79445,6 +81835,7 @@ characters.data={
unicodeslot=0x3204,
},
[0x3205]={
+ adobename="pieupparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL PIEUP",
@@ -79454,6 +81845,7 @@ characters.data={
unicodeslot=0x3205,
},
[0x3206]={
+ adobename="siosparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL SIOS",
@@ -79463,6 +81855,7 @@ characters.data={
unicodeslot=0x3206,
},
[0x3207]={
+ adobename="ieungparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL IEUNG",
@@ -79472,6 +81865,7 @@ characters.data={
unicodeslot=0x3207,
},
[0x3208]={
+ adobename="cieucparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL CIEUC",
@@ -79481,6 +81875,7 @@ characters.data={
unicodeslot=0x3208,
},
[0x3209]={
+ adobename="chieuchparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL CHIEUCH",
@@ -79490,6 +81885,7 @@ characters.data={
unicodeslot=0x3209,
},
[0x320A]={
+ adobename="khieukhparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL KHIEUKH",
@@ -79499,6 +81895,7 @@ characters.data={
unicodeslot=0x320A,
},
[0x320B]={
+ adobename="thieuthparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL THIEUTH",
@@ -79508,6 +81905,7 @@ characters.data={
unicodeslot=0x320B,
},
[0x320C]={
+ adobename="phieuphparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL PHIEUPH",
@@ -79517,6 +81915,7 @@ characters.data={
unicodeslot=0x320C,
},
[0x320D]={
+ adobename="hieuhparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL HIEUH",
@@ -79526,6 +81925,7 @@ characters.data={
unicodeslot=0x320D,
},
[0x320E]={
+ adobename="kiyeokaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL KIYEOK A",
@@ -79535,6 +81935,7 @@ characters.data={
unicodeslot=0x320E,
},
[0x320F]={
+ adobename="nieunaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL NIEUN A",
@@ -79544,6 +81945,7 @@ characters.data={
unicodeslot=0x320F,
},
[0x3210]={
+ adobename="tikeutaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL TIKEUT A",
@@ -79553,6 +81955,7 @@ characters.data={
unicodeslot=0x3210,
},
[0x3211]={
+ adobename="rieulaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL RIEUL A",
@@ -79562,6 +81965,7 @@ characters.data={
unicodeslot=0x3211,
},
[0x3212]={
+ adobename="mieumaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL MIEUM A",
@@ -79571,6 +81975,7 @@ characters.data={
unicodeslot=0x3212,
},
[0x3213]={
+ adobename="pieupaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL PIEUP A",
@@ -79580,6 +81985,7 @@ characters.data={
unicodeslot=0x3213,
},
[0x3214]={
+ adobename="siosaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL SIOS A",
@@ -79589,6 +81995,7 @@ characters.data={
unicodeslot=0x3214,
},
[0x3215]={
+ adobename="ieungaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL IEUNG A",
@@ -79598,6 +82005,7 @@ characters.data={
unicodeslot=0x3215,
},
[0x3216]={
+ adobename="cieucaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL CIEUC A",
@@ -79607,6 +82015,7 @@ characters.data={
unicodeslot=0x3216,
},
[0x3217]={
+ adobename="chieuchaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL CHIEUCH A",
@@ -79616,6 +82025,7 @@ characters.data={
unicodeslot=0x3217,
},
[0x3218]={
+ adobename="khieukhaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL KHIEUKH A",
@@ -79625,6 +82035,7 @@ characters.data={
unicodeslot=0x3218,
},
[0x3219]={
+ adobename="thieuthaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL THIEUTH A",
@@ -79634,6 +82045,7 @@ characters.data={
unicodeslot=0x3219,
},
[0x321A]={
+ adobename="phieuphaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL PHIEUPH A",
@@ -79643,6 +82055,7 @@ characters.data={
unicodeslot=0x321A,
},
[0x321B]={
+ adobename="hieuhaparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL HIEUH A",
@@ -79652,6 +82065,7 @@ characters.data={
unicodeslot=0x321B,
},
[0x321C]={
+ adobename="cieucuparenkorean",
category="so",
cjkwd="w",
description="PARENTHESIZED HANGUL CIEUC U",
@@ -79679,6 +82093,7 @@ characters.data={
unicodeslot=0x321E,
},
[0x3220]={
+ adobename="oneideographicparen",
category="no",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH ONE",
@@ -79688,6 +82103,7 @@ characters.data={
unicodeslot=0x3220,
},
[0x3221]={
+ adobename="twoideographicparen",
category="no",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH TWO",
@@ -79697,6 +82113,7 @@ characters.data={
unicodeslot=0x3221,
},
[0x3222]={
+ adobename="threeideographicparen",
category="no",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH THREE",
@@ -79706,6 +82123,7 @@ characters.data={
unicodeslot=0x3222,
},
[0x3223]={
+ adobename="fourideographicparen",
category="no",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH FOUR",
@@ -79715,6 +82133,7 @@ characters.data={
unicodeslot=0x3223,
},
[0x3224]={
+ adobename="fiveideographicparen",
category="no",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH FIVE",
@@ -79724,6 +82143,7 @@ characters.data={
unicodeslot=0x3224,
},
[0x3225]={
+ adobename="sixideographicparen",
category="no",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH SIX",
@@ -79733,6 +82153,7 @@ characters.data={
unicodeslot=0x3225,
},
[0x3226]={
+ adobename="sevenideographicparen",
category="no",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH SEVEN",
@@ -79742,6 +82163,7 @@ characters.data={
unicodeslot=0x3226,
},
[0x3227]={
+ adobename="eightideographicparen",
category="no",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH EIGHT",
@@ -79751,6 +82173,7 @@ characters.data={
unicodeslot=0x3227,
},
[0x3228]={
+ adobename="nineideographicparen",
category="no",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH NINE",
@@ -79760,6 +82183,7 @@ characters.data={
unicodeslot=0x3228,
},
[0x3229]={
+ adobename="tenideographicparen",
category="no",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH TEN",
@@ -79769,6 +82193,7 @@ characters.data={
unicodeslot=0x3229,
},
[0x322A]={
+ adobename="ideographicmoonparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH MOON",
@@ -79778,6 +82203,7 @@ characters.data={
unicodeslot=0x322A,
},
[0x322B]={
+ adobename="ideographicfireparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH FIRE",
@@ -79787,6 +82213,7 @@ characters.data={
unicodeslot=0x322B,
},
[0x322C]={
+ adobename="ideographicwaterparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH WATER",
@@ -79796,6 +82223,7 @@ characters.data={
unicodeslot=0x322C,
},
[0x322D]={
+ adobename="ideographicwoodparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH WOOD",
@@ -79805,6 +82233,7 @@ characters.data={
unicodeslot=0x322D,
},
[0x322E]={
+ adobename="ideographicmetalparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH METAL",
@@ -79814,6 +82243,7 @@ characters.data={
unicodeslot=0x322E,
},
[0x322F]={
+ adobename="ideographicearthparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH EARTH",
@@ -79823,6 +82253,7 @@ characters.data={
unicodeslot=0x322F,
},
[0x3230]={
+ adobename="ideographicsunparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH SUN",
@@ -79832,6 +82263,7 @@ characters.data={
unicodeslot=0x3230,
},
[0x3231]={
+ adobename="ideographicstockparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH STOCK",
@@ -79841,6 +82273,7 @@ characters.data={
unicodeslot=0x3231,
},
[0x3232]={
+ adobename="ideographichaveparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH HAVE",
@@ -79850,6 +82283,7 @@ characters.data={
unicodeslot=0x3232,
},
[0x3233]={
+ adobename="ideographicsocietyparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH SOCIETY",
@@ -79859,6 +82293,7 @@ characters.data={
unicodeslot=0x3233,
},
[0x3234]={
+ adobename="ideographicnameparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH NAME",
@@ -79868,6 +82303,7 @@ characters.data={
unicodeslot=0x3234,
},
[0x3235]={
+ adobename="ideographicspecialparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH SPECIAL",
@@ -79877,6 +82313,7 @@ characters.data={
unicodeslot=0x3235,
},
[0x3236]={
+ adobename="ideographicfinancialparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH FINANCIAL",
@@ -79886,6 +82323,7 @@ characters.data={
unicodeslot=0x3236,
},
[0x3237]={
+ adobename="ideographiccongratulationparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH CONGRATULATION",
@@ -79895,6 +82333,7 @@ characters.data={
unicodeslot=0x3237,
},
[0x3238]={
+ adobename="ideographiclaborparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH LABOR",
@@ -79904,6 +82343,7 @@ characters.data={
unicodeslot=0x3238,
},
[0x3239]={
+ adobename="ideographicrepresentparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH REPRESENT",
@@ -79913,6 +82353,7 @@ characters.data={
unicodeslot=0x3239,
},
[0x323A]={
+ adobename="ideographiccallparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH CALL",
@@ -79922,6 +82363,7 @@ characters.data={
unicodeslot=0x323A,
},
[0x323B]={
+ adobename="ideographicstudyparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH STUDY",
@@ -79931,6 +82373,7 @@ characters.data={
unicodeslot=0x323B,
},
[0x323C]={
+ adobename="ideographicsuperviseparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH SUPERVISE",
@@ -79940,6 +82383,7 @@ characters.data={
unicodeslot=0x323C,
},
[0x323D]={
+ adobename="ideographicenterpriseparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH ENTERPRISE",
@@ -79949,6 +82393,7 @@ characters.data={
unicodeslot=0x323D,
},
[0x323E]={
+ adobename="ideographicresourceparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH RESOURCE",
@@ -79958,6 +82403,7 @@ characters.data={
unicodeslot=0x323E,
},
[0x323F]={
+ adobename="ideographicallianceparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH ALLIANCE",
@@ -79967,6 +82413,7 @@ characters.data={
unicodeslot=0x323F,
},
[0x3240]={
+ adobename="ideographicfestivalparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH FESTIVAL",
@@ -79985,6 +82432,7 @@ characters.data={
unicodeslot=0x3241,
},
[0x3242]={
+ adobename="ideographicselfparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH SELF",
@@ -79994,6 +82442,7 @@ characters.data={
unicodeslot=0x3242,
},
[0x3243]={
+ adobename="ideographicreachparen",
category="so",
cjkwd="w",
description="PARENTHESIZED IDEOGRAPH REACH",
@@ -80147,6 +82596,7 @@ characters.data={
unicodeslot=0x325F,
},
[0x3260]={
+ adobename="kiyeokcirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL KIYEOK",
@@ -80156,6 +82606,7 @@ characters.data={
unicodeslot=0x3260,
},
[0x3261]={
+ adobename="nieuncirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL NIEUN",
@@ -80165,6 +82616,7 @@ characters.data={
unicodeslot=0x3261,
},
[0x3262]={
+ adobename="tikeutcirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL TIKEUT",
@@ -80174,6 +82626,7 @@ characters.data={
unicodeslot=0x3262,
},
[0x3263]={
+ adobename="rieulcirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL RIEUL",
@@ -80183,6 +82636,7 @@ characters.data={
unicodeslot=0x3263,
},
[0x3264]={
+ adobename="mieumcirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL MIEUM",
@@ -80192,6 +82646,7 @@ characters.data={
unicodeslot=0x3264,
},
[0x3265]={
+ adobename="pieupcirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL PIEUP",
@@ -80201,6 +82656,7 @@ characters.data={
unicodeslot=0x3265,
},
[0x3266]={
+ adobename="sioscirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL SIOS",
@@ -80210,6 +82666,7 @@ characters.data={
unicodeslot=0x3266,
},
[0x3267]={
+ adobename="ieungcirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL IEUNG",
@@ -80219,6 +82676,7 @@ characters.data={
unicodeslot=0x3267,
},
[0x3268]={
+ adobename="cieuccirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL CIEUC",
@@ -80228,6 +82686,7 @@ characters.data={
unicodeslot=0x3268,
},
[0x3269]={
+ adobename="chieuchcirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL CHIEUCH",
@@ -80237,6 +82696,7 @@ characters.data={
unicodeslot=0x3269,
},
[0x326A]={
+ adobename="khieukhcirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL KHIEUKH",
@@ -80246,6 +82706,7 @@ characters.data={
unicodeslot=0x326A,
},
[0x326B]={
+ adobename="thieuthcirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL THIEUTH",
@@ -80255,6 +82716,7 @@ characters.data={
unicodeslot=0x326B,
},
[0x326C]={
+ adobename="phieuphcirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL PHIEUPH",
@@ -80264,6 +82726,7 @@ characters.data={
unicodeslot=0x326C,
},
[0x326D]={
+ adobename="hieuhcirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL HIEUH",
@@ -80273,6 +82736,7 @@ characters.data={
unicodeslot=0x326D,
},
[0x326E]={
+ adobename="kiyeokacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL KIYEOK A",
@@ -80282,6 +82746,7 @@ characters.data={
unicodeslot=0x326E,
},
[0x326F]={
+ adobename="nieunacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL NIEUN A",
@@ -80291,6 +82756,7 @@ characters.data={
unicodeslot=0x326F,
},
[0x3270]={
+ adobename="tikeutacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL TIKEUT A",
@@ -80300,6 +82766,7 @@ characters.data={
unicodeslot=0x3270,
},
[0x3271]={
+ adobename="rieulacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL RIEUL A",
@@ -80309,6 +82776,7 @@ characters.data={
unicodeslot=0x3271,
},
[0x3272]={
+ adobename="mieumacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL MIEUM A",
@@ -80318,6 +82786,7 @@ characters.data={
unicodeslot=0x3272,
},
[0x3273]={
+ adobename="pieupacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL PIEUP A",
@@ -80327,6 +82796,7 @@ characters.data={
unicodeslot=0x3273,
},
[0x3274]={
+ adobename="siosacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL SIOS A",
@@ -80336,6 +82806,7 @@ characters.data={
unicodeslot=0x3274,
},
[0x3275]={
+ adobename="ieungacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL IEUNG A",
@@ -80345,6 +82816,7 @@ characters.data={
unicodeslot=0x3275,
},
[0x3276]={
+ adobename="cieucacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL CIEUC A",
@@ -80354,6 +82826,7 @@ characters.data={
unicodeslot=0x3276,
},
[0x3277]={
+ adobename="chieuchacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL CHIEUCH A",
@@ -80363,6 +82836,7 @@ characters.data={
unicodeslot=0x3277,
},
[0x3278]={
+ adobename="khieukhacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL KHIEUKH A",
@@ -80372,6 +82846,7 @@ characters.data={
unicodeslot=0x3278,
},
[0x3279]={
+ adobename="thieuthacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL THIEUTH A",
@@ -80381,6 +82856,7 @@ characters.data={
unicodeslot=0x3279,
},
[0x327A]={
+ adobename="phieuphacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL PHIEUPH A",
@@ -80390,6 +82866,7 @@ characters.data={
unicodeslot=0x327A,
},
[0x327B]={
+ adobename="hieuhacirclekorean",
category="so",
cjkwd="w",
description="CIRCLED HANGUL HIEUH A",
@@ -80426,6 +82903,7 @@ characters.data={
unicodeslot=0x327E,
},
[0x327F]={
+ adobename="koreanstandardsymbol",
category="so",
cjkwd="w",
description="KOREAN STANDARD SYMBOL",
@@ -80524,6 +83002,7 @@ characters.data={
unicodeslot=0x3289,
},
[0x328A]={
+ adobename="ideographmooncircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH MOON",
@@ -80533,6 +83012,7 @@ characters.data={
unicodeslot=0x328A,
},
[0x328B]={
+ adobename="ideographfirecircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH FIRE",
@@ -80542,6 +83022,7 @@ characters.data={
unicodeslot=0x328B,
},
[0x328C]={
+ adobename="ideographwatercircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH WATER",
@@ -80551,6 +83032,7 @@ characters.data={
unicodeslot=0x328C,
},
[0x328D]={
+ adobename="ideographwoodcircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH WOOD",
@@ -80560,6 +83042,7 @@ characters.data={
unicodeslot=0x328D,
},
[0x328E]={
+ adobename="ideographmetalcircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH METAL",
@@ -80569,6 +83052,7 @@ characters.data={
unicodeslot=0x328E,
},
[0x328F]={
+ adobename="ideographearthcircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH EARTH",
@@ -80578,6 +83062,7 @@ characters.data={
unicodeslot=0x328F,
},
[0x3290]={
+ adobename="ideographsuncircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH SUN",
@@ -80614,6 +83099,7 @@ characters.data={
unicodeslot=0x3293,
},
[0x3294]={
+ adobename="ideographnamecircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH NAME",
@@ -80632,6 +83118,7 @@ characters.data={
unicodeslot=0x3295,
},
[0x3296]={
+ adobename="ideographicfinancialcircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH FINANCIAL",
@@ -80650,6 +83137,7 @@ characters.data={
unicodeslot=0x3297,
},
[0x3298]={
+ adobename="ideographiclaborcircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH LABOR",
@@ -80659,6 +83147,7 @@ characters.data={
unicodeslot=0x3298,
},
[0x3299]={
+ adobename="ideographicsecretcircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH SECRET",
@@ -80695,6 +83184,7 @@ characters.data={
unicodeslot=0x329C,
},
[0x329D]={
+ adobename="ideographicexcellentcircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH EXCELLENT",
@@ -80704,6 +83194,7 @@ characters.data={
unicodeslot=0x329D,
},
[0x329E]={
+ adobename="ideographicprintcircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH PRINT",
@@ -80749,6 +83240,7 @@ characters.data={
unicodeslot=0x32A2,
},
[0x32A3]={
+ adobename="ideographiccorrectcircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH CORRECT",
@@ -80758,6 +83250,7 @@ characters.data={
unicodeslot=0x32A3,
},
[0x32A4]={
+ adobename="ideographichighcircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH HIGH",
@@ -80767,6 +83260,7 @@ characters.data={
unicodeslot=0x32A4,
},
[0x32A5]={
+ adobename="ideographiccentrecircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH CENTRE",
@@ -80776,6 +83270,7 @@ characters.data={
unicodeslot=0x32A5,
},
[0x32A6]={
+ adobename="ideographiclowcircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH LOW",
@@ -80785,6 +83280,7 @@ characters.data={
unicodeslot=0x32A6,
},
[0x32A7]={
+ adobename="ideographicleftcircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH LEFT",
@@ -80794,6 +83290,7 @@ characters.data={
unicodeslot=0x32A7,
},
[0x32A8]={
+ adobename="ideographicrightcircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH RIGHT",
@@ -80803,6 +83300,7 @@ characters.data={
unicodeslot=0x32A8,
},
[0x32A9]={
+ adobename="ideographicmedicinecircle",
category="so",
cjkwd="w",
description="CIRCLED IDEOGRAPH MEDICINE",
@@ -81577,6 +84075,7 @@ characters.data={
unicodeslot=0x32FE,
},
[0x3300]={
+ adobename="apaatosquare",
category="so",
cjkwd="w",
description="SQUARE APAATO",
@@ -81604,6 +84103,7 @@ characters.data={
unicodeslot=0x3302,
},
[0x3303]={
+ adobename="aarusquare",
category="so",
cjkwd="w",
description="SQUARE AARU",
@@ -81622,6 +84122,7 @@ characters.data={
unicodeslot=0x3304,
},
[0x3305]={
+ adobename="intisquare",
category="so",
cjkwd="w",
description="SQUARE INTI",
@@ -81694,6 +84195,7 @@ characters.data={
unicodeslot=0x330C,
},
[0x330D]={
+ adobename="karoriisquare",
category="so",
cjkwd="w",
description="SQUARE KARORII",
@@ -81757,6 +84259,7 @@ characters.data={
unicodeslot=0x3313,
},
[0x3314]={
+ adobename="kirosquare",
category="so",
cjkwd="w",
description="SQUARE KIRO",
@@ -81766,6 +84269,7 @@ characters.data={
unicodeslot=0x3314,
},
[0x3315]={
+ adobename="kiroguramusquare",
category="so",
cjkwd="w",
description="SQUARE KIROGURAMU",
@@ -81775,6 +84279,7 @@ characters.data={
unicodeslot=0x3315,
},
[0x3316]={
+ adobename="kiromeetorusquare",
category="so",
cjkwd="w",
description="SQUARE KIROMEETORU",
@@ -81793,6 +84298,7 @@ characters.data={
unicodeslot=0x3317,
},
[0x3318]={
+ adobename="guramusquare",
category="so",
cjkwd="w",
description="SQUARE GURAMU",
@@ -81847,6 +84353,7 @@ characters.data={
unicodeslot=0x331D,
},
[0x331E]={
+ adobename="kooposquare",
category="so",
cjkwd="w",
description="SQUARE KOOPO",
@@ -81883,6 +84390,7 @@ characters.data={
unicodeslot=0x3321,
},
[0x3322]={
+ adobename="sentisquare",
category="so",
cjkwd="w",
description="SQUARE SENTI",
@@ -81892,6 +84400,7 @@ characters.data={
unicodeslot=0x3322,
},
[0x3323]={
+ adobename="sentosquare",
category="so",
cjkwd="w",
description="SQUARE SENTO",
@@ -81919,6 +84428,7 @@ characters.data={
unicodeslot=0x3325,
},
[0x3326]={
+ adobename="dorusquare",
category="so",
cjkwd="w",
description="SQUARE DORU",
@@ -81928,6 +84438,7 @@ characters.data={
unicodeslot=0x3326,
},
[0x3327]={
+ adobename="tonsquare",
category="so",
cjkwd="w",
description="SQUARE TON",
@@ -81955,6 +84466,7 @@ characters.data={
unicodeslot=0x3329,
},
[0x332A]={
+ adobename="haitusquare",
category="so",
cjkwd="w",
description="SQUARE HAITU",
@@ -81964,6 +84476,7 @@ characters.data={
unicodeslot=0x332A,
},
[0x332B]={
+ adobename="paasentosquare",
category="so",
cjkwd="w",
description="SQUARE PAASENTO",
@@ -82018,6 +84531,7 @@ characters.data={
unicodeslot=0x3330,
},
[0x3331]={
+ adobename="birusquare",
category="so",
cjkwd="w",
description="SQUARE BIRU",
@@ -82036,6 +84550,7 @@ characters.data={
unicodeslot=0x3332,
},
[0x3333]={
+ adobename="huiitosquare",
category="so",
cjkwd="w",
description="SQUARE HUIITO",
@@ -82063,6 +84578,7 @@ characters.data={
unicodeslot=0x3335,
},
[0x3336]={
+ adobename="hekutaarusquare",
category="so",
cjkwd="w",
description="SQUARE HEKUTAARU",
@@ -82090,6 +84606,7 @@ characters.data={
unicodeslot=0x3338,
},
[0x3339]={
+ adobename="herutusquare",
category="so",
cjkwd="w",
description="SQUARE HERUTU",
@@ -82108,6 +84625,7 @@ characters.data={
unicodeslot=0x333A,
},
[0x333B]={
+ adobename="peezisquare",
category="so",
cjkwd="w",
description="SQUARE PEEZI",
@@ -82171,6 +84689,7 @@ characters.data={
unicodeslot=0x3341,
},
[0x3342]={
+ adobename="hoonsquare",
category="so",
cjkwd="w",
description="SQUARE HOON",
@@ -82216,6 +84735,7 @@ characters.data={
unicodeslot=0x3346,
},
[0x3347]={
+ adobename="mansyonsquare",
category="so",
cjkwd="w",
description="SQUARE MANSYON",
@@ -82234,6 +84754,7 @@ characters.data={
unicodeslot=0x3348,
},
[0x3349]={
+ adobename="mirisquare",
category="so",
cjkwd="w",
description="SQUARE MIRI",
@@ -82243,6 +84764,7 @@ characters.data={
unicodeslot=0x3349,
},
[0x334A]={
+ adobename="miribaarusquare",
category="so",
cjkwd="w",
description="SQUARE MIRIBAARU",
@@ -82270,6 +84792,7 @@ characters.data={
unicodeslot=0x334C,
},
[0x334D]={
+ adobename="meetorusquare",
category="so",
cjkwd="w",
description="SQUARE MEETORU",
@@ -82279,6 +84802,7 @@ characters.data={
unicodeslot=0x334D,
},
[0x334E]={
+ adobename="yaadosquare",
category="so",
cjkwd="w",
description="SQUARE YAADO",
@@ -82306,6 +84830,7 @@ characters.data={
unicodeslot=0x3350,
},
[0x3351]={
+ adobename="rittorusquare",
category="so",
cjkwd="w",
description="SQUARE RITTORU",
@@ -82360,6 +84885,7 @@ characters.data={
unicodeslot=0x3356,
},
[0x3357]={
+ adobename="wattosquare",
category="so",
cjkwd="w",
description="SQUARE WATTO",
@@ -82684,6 +85210,7 @@ characters.data={
unicodeslot=0x337A,
},
[0x337B]={
+ adobename="heiseierasquare",
category="so",
cjkwd="w",
description="SQUARE ERA NAME HEISEI",
@@ -82693,6 +85220,7 @@ characters.data={
unicodeslot=0x337B,
},
[0x337C]={
+ adobename="syouwaerasquare",
category="so",
cjkwd="w",
description="SQUARE ERA NAME SYOUWA",
@@ -82702,6 +85230,7 @@ characters.data={
unicodeslot=0x337C,
},
[0x337D]={
+ adobename="taisyouerasquare",
category="so",
cjkwd="w",
description="SQUARE ERA NAME TAISYOU",
@@ -82711,6 +85240,7 @@ characters.data={
unicodeslot=0x337D,
},
[0x337E]={
+ adobename="meizierasquare",
category="so",
cjkwd="w",
description="SQUARE ERA NAME MEIZI",
@@ -82720,6 +85250,7 @@ characters.data={
unicodeslot=0x337E,
},
[0x337F]={
+ adobename="corporationsquare",
category="so",
cjkwd="w",
description="SQUARE CORPORATION",
@@ -82729,6 +85260,7 @@ characters.data={
unicodeslot=0x337F,
},
[0x3380]={
+ adobename="paampssquare",
category="so",
cjkwd="w",
description="SQUARE PA AMPS",
@@ -82738,6 +85270,7 @@ characters.data={
unicodeslot=0x3380,
},
[0x3381]={
+ adobename="nasquare",
category="so",
cjkwd="w",
description="SQUARE NA",
@@ -82747,6 +85280,7 @@ characters.data={
unicodeslot=0x3381,
},
[0x3382]={
+ adobename="muasquare",
category="so",
cjkwd="w",
description="SQUARE MU A",
@@ -82756,6 +85290,7 @@ characters.data={
unicodeslot=0x3382,
},
[0x3383]={
+ adobename="masquare",
category="so",
cjkwd="w",
description="SQUARE MA",
@@ -82765,6 +85300,7 @@ characters.data={
unicodeslot=0x3383,
},
[0x3384]={
+ adobename="kasquare",
category="so",
cjkwd="w",
description="SQUARE KA",
@@ -82774,6 +85310,7 @@ characters.data={
unicodeslot=0x3384,
},
[0x3385]={
+ adobename="KBsquare",
category="so",
cjkwd="w",
description="SQUARE KB",
@@ -82783,6 +85320,7 @@ characters.data={
unicodeslot=0x3385,
},
[0x3386]={
+ adobename="MBsquare",
category="so",
cjkwd="w",
description="SQUARE MB",
@@ -82792,6 +85330,7 @@ characters.data={
unicodeslot=0x3386,
},
[0x3387]={
+ adobename="GBsquare",
category="so",
cjkwd="w",
description="SQUARE GB",
@@ -82801,6 +85340,7 @@ characters.data={
unicodeslot=0x3387,
},
[0x3388]={
+ adobename="calsquare",
category="so",
cjkwd="w",
description="SQUARE CAL",
@@ -82810,6 +85350,7 @@ characters.data={
unicodeslot=0x3388,
},
[0x3389]={
+ adobename="kcalsquare",
category="so",
cjkwd="w",
description="SQUARE KCAL",
@@ -82819,6 +85360,7 @@ characters.data={
unicodeslot=0x3389,
},
[0x338A]={
+ adobename="pfsquare",
category="so",
cjkwd="w",
description="SQUARE PF",
@@ -82828,6 +85370,7 @@ characters.data={
unicodeslot=0x338A,
},
[0x338B]={
+ adobename="nfsquare",
category="so",
cjkwd="w",
description="SQUARE NF",
@@ -82837,6 +85380,7 @@ characters.data={
unicodeslot=0x338B,
},
[0x338C]={
+ adobename="mufsquare",
category="so",
cjkwd="w",
description="SQUARE MU F",
@@ -82846,6 +85390,7 @@ characters.data={
unicodeslot=0x338C,
},
[0x338D]={
+ adobename="mugsquare",
category="so",
cjkwd="w",
description="SQUARE MU G",
@@ -82855,6 +85400,7 @@ characters.data={
unicodeslot=0x338D,
},
[0x338E]={
+ adobename="squaremg",
category="so",
cjkwd="w",
description="SQUARE MG",
@@ -82864,6 +85410,7 @@ characters.data={
unicodeslot=0x338E,
},
[0x338F]={
+ adobename="squarekg",
category="so",
cjkwd="w",
description="SQUARE KG",
@@ -82873,6 +85420,7 @@ characters.data={
unicodeslot=0x338F,
},
[0x3390]={
+ adobename="Hzsquare",
category="so",
cjkwd="w",
description="SQUARE HZ",
@@ -82882,6 +85430,7 @@ characters.data={
unicodeslot=0x3390,
},
[0x3391]={
+ adobename="khzsquare",
category="so",
cjkwd="w",
description="SQUARE KHZ",
@@ -82891,6 +85440,7 @@ characters.data={
unicodeslot=0x3391,
},
[0x3392]={
+ adobename="mhzsquare",
category="so",
cjkwd="w",
description="SQUARE MHZ",
@@ -82900,6 +85450,7 @@ characters.data={
unicodeslot=0x3392,
},
[0x3393]={
+ adobename="ghzsquare",
category="so",
cjkwd="w",
description="SQUARE GHZ",
@@ -82909,6 +85460,7 @@ characters.data={
unicodeslot=0x3393,
},
[0x3394]={
+ adobename="thzsquare",
category="so",
cjkwd="w",
description="SQUARE THZ",
@@ -82918,6 +85470,7 @@ characters.data={
unicodeslot=0x3394,
},
[0x3395]={
+ adobename="mulsquare",
category="so",
cjkwd="w",
description="SQUARE MU L",
@@ -82927,6 +85480,7 @@ characters.data={
unicodeslot=0x3395,
},
[0x3396]={
+ adobename="mlsquare",
category="so",
cjkwd="w",
description="SQUARE ML",
@@ -82936,6 +85490,7 @@ characters.data={
unicodeslot=0x3396,
},
[0x3397]={
+ adobename="dlsquare",
category="so",
cjkwd="w",
description="SQUARE DL",
@@ -82945,6 +85500,7 @@ characters.data={
unicodeslot=0x3397,
},
[0x3398]={
+ adobename="klsquare",
category="so",
cjkwd="w",
description="SQUARE KL",
@@ -82954,6 +85510,7 @@ characters.data={
unicodeslot=0x3398,
},
[0x3399]={
+ adobename="fmsquare",
category="so",
cjkwd="w",
description="SQUARE FM",
@@ -82963,6 +85520,7 @@ characters.data={
unicodeslot=0x3399,
},
[0x339A]={
+ adobename="nmsquare",
category="so",
cjkwd="w",
description="SQUARE NM",
@@ -82972,6 +85530,7 @@ characters.data={
unicodeslot=0x339A,
},
[0x339B]={
+ adobename="mumsquare",
category="so",
cjkwd="w",
description="SQUARE MU M",
@@ -82981,6 +85540,7 @@ characters.data={
unicodeslot=0x339B,
},
[0x339C]={
+ adobename="squaremm",
category="so",
cjkwd="w",
description="SQUARE MM",
@@ -82990,6 +85550,7 @@ characters.data={
unicodeslot=0x339C,
},
[0x339D]={
+ adobename="squarecm",
category="so",
cjkwd="w",
description="SQUARE CM",
@@ -82999,6 +85560,7 @@ characters.data={
unicodeslot=0x339D,
},
[0x339E]={
+ adobename="squarekm",
category="so",
cjkwd="w",
description="SQUARE KM",
@@ -83008,6 +85570,7 @@ characters.data={
unicodeslot=0x339E,
},
[0x339F]={
+ adobename="mmsquaredsquare",
category="so",
cjkwd="w",
description="SQUARE MM SQUARED",
@@ -83017,6 +85580,7 @@ characters.data={
unicodeslot=0x339F,
},
[0x33A0]={
+ adobename="cmsquaredsquare",
category="so",
cjkwd="w",
description="SQUARE CM SQUARED",
@@ -83026,6 +85590,7 @@ characters.data={
unicodeslot=0x33A0,
},
[0x33A1]={
+ adobename="squaremsquared",
category="so",
cjkwd="w",
description="SQUARE M SQUARED",
@@ -83035,6 +85600,7 @@ characters.data={
unicodeslot=0x33A1,
},
[0x33A2]={
+ adobename="kmsquaredsquare",
category="so",
cjkwd="w",
description="SQUARE KM SQUARED",
@@ -83044,6 +85610,7 @@ characters.data={
unicodeslot=0x33A2,
},
[0x33A3]={
+ adobename="mmcubedsquare",
category="so",
cjkwd="w",
description="SQUARE MM CUBED",
@@ -83053,6 +85620,7 @@ characters.data={
unicodeslot=0x33A3,
},
[0x33A4]={
+ adobename="cmcubedsquare",
category="so",
cjkwd="w",
description="SQUARE CM CUBED",
@@ -83062,6 +85630,7 @@ characters.data={
unicodeslot=0x33A4,
},
[0x33A5]={
+ adobename="mcubedsquare",
category="so",
cjkwd="w",
description="SQUARE M CUBED",
@@ -83071,6 +85640,7 @@ characters.data={
unicodeslot=0x33A5,
},
[0x33A6]={
+ adobename="kmcubedsquare",
category="so",
cjkwd="w",
description="SQUARE KM CUBED",
@@ -83080,6 +85650,7 @@ characters.data={
unicodeslot=0x33A6,
},
[0x33A7]={
+ adobename="moverssquare",
category="so",
cjkwd="w",
description="SQUARE M OVER S",
@@ -83089,6 +85660,7 @@ characters.data={
unicodeslot=0x33A7,
},
[0x33A8]={
+ adobename="moverssquaredsquare",
category="so",
cjkwd="w",
description="SQUARE M OVER S SQUARED",
@@ -83098,6 +85670,7 @@ characters.data={
unicodeslot=0x33A8,
},
[0x33A9]={
+ adobename="pasquare",
category="so",
cjkwd="w",
description="SQUARE PA",
@@ -83107,6 +85680,7 @@ characters.data={
unicodeslot=0x33A9,
},
[0x33AA]={
+ adobename="kpasquare",
category="so",
cjkwd="w",
description="SQUARE KPA",
@@ -83116,6 +85690,7 @@ characters.data={
unicodeslot=0x33AA,
},
[0x33AB]={
+ adobename="mpasquare",
category="so",
cjkwd="w",
description="SQUARE MPA",
@@ -83125,6 +85700,7 @@ characters.data={
unicodeslot=0x33AB,
},
[0x33AC]={
+ adobename="gpasquare",
category="so",
cjkwd="w",
description="SQUARE GPA",
@@ -83134,6 +85710,7 @@ characters.data={
unicodeslot=0x33AC,
},
[0x33AD]={
+ adobename="radsquare",
category="so",
cjkwd="w",
description="SQUARE RAD",
@@ -83143,6 +85720,7 @@ characters.data={
unicodeslot=0x33AD,
},
[0x33AE]={
+ adobename="radoverssquare",
category="so",
cjkwd="w",
description="SQUARE RAD OVER S",
@@ -83152,6 +85730,7 @@ characters.data={
unicodeslot=0x33AE,
},
[0x33AF]={
+ adobename="radoverssquaredsquare",
category="so",
cjkwd="w",
description="SQUARE RAD OVER S SQUARED",
@@ -83161,6 +85740,7 @@ characters.data={
unicodeslot=0x33AF,
},
[0x33B0]={
+ adobename="pssquare",
category="so",
cjkwd="w",
description="SQUARE PS",
@@ -83170,6 +85750,7 @@ characters.data={
unicodeslot=0x33B0,
},
[0x33B1]={
+ adobename="nssquare",
category="so",
cjkwd="w",
description="SQUARE NS",
@@ -83179,6 +85760,7 @@ characters.data={
unicodeslot=0x33B1,
},
[0x33B2]={
+ adobename="mussquare",
category="so",
cjkwd="w",
description="SQUARE MU S",
@@ -83188,6 +85770,7 @@ characters.data={
unicodeslot=0x33B2,
},
[0x33B3]={
+ adobename="mssquare",
category="so",
cjkwd="w",
description="SQUARE MS",
@@ -83197,6 +85780,7 @@ characters.data={
unicodeslot=0x33B3,
},
[0x33B4]={
+ adobename="pvsquare",
category="so",
cjkwd="w",
description="SQUARE PV",
@@ -83206,6 +85790,7 @@ characters.data={
unicodeslot=0x33B4,
},
[0x33B5]={
+ adobename="nvsquare",
category="so",
cjkwd="w",
description="SQUARE NV",
@@ -83215,6 +85800,7 @@ characters.data={
unicodeslot=0x33B5,
},
[0x33B6]={
+ adobename="muvsquare",
category="so",
cjkwd="w",
description="SQUARE MU V",
@@ -83224,6 +85810,7 @@ characters.data={
unicodeslot=0x33B6,
},
[0x33B7]={
+ adobename="mvsquare",
category="so",
cjkwd="w",
description="SQUARE MV",
@@ -83233,6 +85820,7 @@ characters.data={
unicodeslot=0x33B7,
},
[0x33B8]={
+ adobename="kvsquare",
category="so",
cjkwd="w",
description="SQUARE KV",
@@ -83242,6 +85830,7 @@ characters.data={
unicodeslot=0x33B8,
},
[0x33B9]={
+ adobename="mvmegasquare",
category="so",
cjkwd="w",
description="SQUARE MV MEGA",
@@ -83251,6 +85840,7 @@ characters.data={
unicodeslot=0x33B9,
},
[0x33BA]={
+ adobename="pwsquare",
category="so",
cjkwd="w",
description="SQUARE PW",
@@ -83260,6 +85850,7 @@ characters.data={
unicodeslot=0x33BA,
},
[0x33BB]={
+ adobename="nwsquare",
category="so",
cjkwd="w",
description="SQUARE NW",
@@ -83269,6 +85860,7 @@ characters.data={
unicodeslot=0x33BB,
},
[0x33BC]={
+ adobename="muwsquare",
category="so",
cjkwd="w",
description="SQUARE MU W",
@@ -83278,6 +85870,7 @@ characters.data={
unicodeslot=0x33BC,
},
[0x33BD]={
+ adobename="mwsquare",
category="so",
cjkwd="w",
description="SQUARE MW",
@@ -83287,6 +85880,7 @@ characters.data={
unicodeslot=0x33BD,
},
[0x33BE]={
+ adobename="kwsquare",
category="so",
cjkwd="w",
description="SQUARE KW",
@@ -83296,6 +85890,7 @@ characters.data={
unicodeslot=0x33BE,
},
[0x33BF]={
+ adobename="mwmegasquare",
category="so",
cjkwd="w",
description="SQUARE MW MEGA",
@@ -83305,6 +85900,7 @@ characters.data={
unicodeslot=0x33BF,
},
[0x33C0]={
+ adobename="kohmsquare",
category="so",
cjkwd="w",
description="SQUARE K OHM",
@@ -83314,6 +85910,7 @@ characters.data={
unicodeslot=0x33C0,
},
[0x33C1]={
+ adobename="mohmsquare",
category="so",
cjkwd="w",
description="SQUARE M OHM",
@@ -83323,6 +85920,7 @@ characters.data={
unicodeslot=0x33C1,
},
[0x33C2]={
+ adobename="amsquare",
category="so",
cjkwd="w",
description="SQUARE AM",
@@ -83332,6 +85930,7 @@ characters.data={
unicodeslot=0x33C2,
},
[0x33C3]={
+ adobename="bqsquare",
category="so",
cjkwd="w",
description="SQUARE BQ",
@@ -83341,6 +85940,7 @@ characters.data={
unicodeslot=0x33C3,
},
[0x33C4]={
+ adobename="squarecc",
category="so",
cjkwd="w",
description="SQUARE CC",
@@ -83350,6 +85950,7 @@ characters.data={
unicodeslot=0x33C4,
},
[0x33C5]={
+ adobename="cdsquare",
category="so",
cjkwd="w",
description="SQUARE CD",
@@ -83359,6 +85960,7 @@ characters.data={
unicodeslot=0x33C5,
},
[0x33C6]={
+ adobename="coverkgsquare",
category="so",
cjkwd="w",
description="SQUARE C OVER KG",
@@ -83368,6 +85970,7 @@ characters.data={
unicodeslot=0x33C6,
},
[0x33C7]={
+ adobename="cosquare",
category="so",
cjkwd="w",
description="SQUARE CO",
@@ -83377,6 +85980,7 @@ characters.data={
unicodeslot=0x33C7,
},
[0x33C8]={
+ adobename="dbsquare",
category="so",
cjkwd="w",
description="SQUARE DB",
@@ -83386,6 +85990,7 @@ characters.data={
unicodeslot=0x33C8,
},
[0x33C9]={
+ adobename="gysquare",
category="so",
cjkwd="w",
description="SQUARE GY",
@@ -83395,6 +86000,7 @@ characters.data={
unicodeslot=0x33C9,
},
[0x33CA]={
+ adobename="hasquare",
category="so",
cjkwd="w",
description="SQUARE HA",
@@ -83404,6 +86010,7 @@ characters.data={
unicodeslot=0x33CA,
},
[0x33CB]={
+ adobename="HPsquare",
category="so",
cjkwd="w",
description="SQUARE HP",
@@ -83422,6 +86029,7 @@ characters.data={
unicodeslot=0x33CC,
},
[0x33CD]={
+ adobename="KKsquare",
category="so",
cjkwd="w",
description="SQUARE KK",
@@ -83431,6 +86039,7 @@ characters.data={
unicodeslot=0x33CD,
},
[0x33CE]={
+ adobename="squarekmcapital",
category="so",
cjkwd="w",
description="SQUARE KM CAPITAL",
@@ -83440,6 +86049,7 @@ characters.data={
unicodeslot=0x33CE,
},
[0x33CF]={
+ adobename="ktsquare",
category="so",
cjkwd="w",
description="SQUARE KT",
@@ -83449,6 +86059,7 @@ characters.data={
unicodeslot=0x33CF,
},
[0x33D0]={
+ adobename="lmsquare",
category="so",
cjkwd="w",
description="SQUARE LM",
@@ -83458,6 +86069,7 @@ characters.data={
unicodeslot=0x33D0,
},
[0x33D1]={
+ adobename="squareln",
category="so",
cjkwd="w",
description="SQUARE LN",
@@ -83467,6 +86079,7 @@ characters.data={
unicodeslot=0x33D1,
},
[0x33D2]={
+ adobename="squarelog",
category="so",
cjkwd="w",
description="SQUARE LOG",
@@ -83476,6 +86089,7 @@ characters.data={
unicodeslot=0x33D2,
},
[0x33D3]={
+ adobename="lxsquare",
category="so",
cjkwd="w",
description="SQUARE LX",
@@ -83485,6 +86099,7 @@ characters.data={
unicodeslot=0x33D3,
},
[0x33D4]={
+ adobename="mbsquare",
category="so",
cjkwd="w",
description="SQUARE MB SMALL",
@@ -83494,6 +86109,7 @@ characters.data={
unicodeslot=0x33D4,
},
[0x33D5]={
+ adobename="squaremil",
category="so",
cjkwd="w",
description="SQUARE MIL",
@@ -83503,6 +86119,7 @@ characters.data={
unicodeslot=0x33D5,
},
[0x33D6]={
+ adobename="molsquare",
category="so",
cjkwd="w",
description="SQUARE MOL",
@@ -83521,6 +86138,7 @@ characters.data={
unicodeslot=0x33D7,
},
[0x33D8]={
+ adobename="pmsquare",
category="so",
cjkwd="w",
description="SQUARE PM",
@@ -83548,6 +86166,7 @@ characters.data={
unicodeslot=0x33DA,
},
[0x33DB]={
+ adobename="srsquare",
category="so",
cjkwd="w",
description="SQUARE SR",
@@ -83557,6 +86176,7 @@ characters.data={
unicodeslot=0x33DB,
},
[0x33DC]={
+ adobename="svsquare",
category="so",
cjkwd="w",
description="SQUARE SV",
@@ -83566,6 +86186,7 @@ characters.data={
unicodeslot=0x33DC,
},
[0x33DD]={
+ adobename="wbsquare",
category="so",
cjkwd="w",
description="SQUARE WB",
@@ -83880,15 +86501,6 @@ characters.data={
specials={ "square", 0x0067, 0x0061, 0x006C },
unicodeslot=0x33FF,
},
- [0x3400]={
- category="lo",
- cjkwd="w",
- description="<CJK Ideograph Extension A>",
- direction="l",
- linebreak="id",
- unicodeslot=0x3400,
- range= 0x4DB5,
- },
[0x4DC0]={
category="so",
description="HEXAGRAM FOR THE CREATIVE HEAVEN",
@@ -84337,15 +86949,6 @@ characters.data={
linebreak="al",
unicodeslot=0x4DFF,
},
- [0x4E00]={
- category="lo",
- cjkwd="w",
- description="<CJK Ideograph>",
- direction="l",
- linebreak="id",
- unicodeslot=0x4E00,
- range=0x9FBB,
- },
[0xA000]={
category="lo",
cjkwd="w",
@@ -95009,15 +97612,6 @@ characters.data={
linebreak="ex",
unicodeslot=0xA877,
},
- [0xAC00]={
- category="lo",
- cjkwd="w",
- description="<Hangul Syllable>",
- direction="l",
- linebreak="h2",
- unicodeslot=0xAC00,
- range=0xD7A3,
- },
[0xD800]={
category="cs",
description="<Non Private Use High Surrogate, First>",
@@ -95068,6 +97662,7 @@ characters.data={
unicodeslot=0xE000,
},
[0xF8FF]={
+ adobename="apple",
category="co",
cjkwd="a",
description="<Private Use, Last>",
@@ -99266,6 +101861,7 @@ characters.data={
unicodeslot=0xFAD9,
},
[0xFB00]={
+ adobename="ff",
category="ll",
contextname="ffligature",
description="LATIN SMALL LIGATURE FF",
@@ -99275,6 +101871,7 @@ characters.data={
unicodeslot=0xFB00,
},
[0xFB01]={
+ adobename="fi",
category="ll",
contextname="filigature",
description="LATIN SMALL LIGATURE FI",
@@ -99285,6 +101882,7 @@ characters.data={
unicodeslot=0xFB01,
},
[0xFB02]={
+ adobename="fl",
category="ll",
contextname="flligature",
description="LATIN SMALL LIGATURE FL",
@@ -99295,6 +101893,7 @@ characters.data={
unicodeslot=0xFB02,
},
[0xFB03]={
+ adobename="ffi",
category="ll",
contextname="ffiligature",
description="LATIN SMALL LIGATURE FFI",
@@ -99305,6 +101904,7 @@ characters.data={
unicodeslot=0xFB03,
},
[0xFB04]={
+ adobename="ffl",
category="ll",
contextname="fflligature",
description="LATIN SMALL LIGATURE FFL",
@@ -99389,6 +101989,7 @@ characters.data={
unicodeslot=0xFB1E,
},
[0xFB1F]={
+ adobename="yodyodpatahhebrew",
category="lo",
description="HEBREW LIGATURE YIDDISH YOD YOD PATAH",
direction="r",
@@ -99397,6 +101998,7 @@ characters.data={
unicodeslot=0xFB1F,
},
[0xFB20]={
+ adobename="ayinaltonehebrew",
category="lo",
description="HEBREW LETTER ALTERNATIVE AYIN",
direction="r",
@@ -99477,6 +102079,7 @@ characters.data={
unicodeslot=0xFB29,
},
[0xFB2A]={
+ adobename="shinshindothebrew",
category="lo",
description="HEBREW LETTER SHIN WITH SHIN DOT",
direction="r",
@@ -99486,6 +102089,7 @@ characters.data={
unicodeslot=0xFB2A,
},
[0xFB2B]={
+ adobename="shinsindothebrew",
category="lo",
description="HEBREW LETTER SHIN WITH SIN DOT",
direction="r",
@@ -99495,6 +102099,7 @@ characters.data={
unicodeslot=0xFB2B,
},
[0xFB2C]={
+ adobename="shindageshshindothebrew",
category="lo",
description="HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT",
direction="r",
@@ -99504,6 +102109,7 @@ characters.data={
unicodeslot=0xFB2C,
},
[0xFB2D]={
+ adobename="shindageshsindothebrew",
category="lo",
description="HEBREW LETTER SHIN WITH DAGESH AND SIN DOT",
direction="r",
@@ -99513,6 +102119,7 @@ characters.data={
unicodeslot=0xFB2D,
},
[0xFB2E]={
+ adobename="alefpatahhebrew",
category="lo",
description="HEBREW LETTER ALEF WITH PATAH",
direction="r",
@@ -99522,6 +102129,7 @@ characters.data={
unicodeslot=0xFB2E,
},
[0xFB2F]={
+ adobename="alefqamatshebrew",
category="lo",
description="HEBREW LETTER ALEF WITH QAMATS",
direction="r",
@@ -99531,6 +102139,7 @@ characters.data={
unicodeslot=0xFB2F,
},
[0xFB30]={
+ adobename="alefdageshhebrew",
category="lo",
description="HEBREW LETTER ALEF WITH MAPIQ",
direction="r",
@@ -99540,6 +102149,7 @@ characters.data={
unicodeslot=0xFB30,
},
[0xFB31]={
+ adobename="betdageshhebrew",
category="lo",
description="HEBREW LETTER BET WITH DAGESH",
direction="r",
@@ -99549,6 +102159,7 @@ characters.data={
unicodeslot=0xFB31,
},
[0xFB32]={
+ adobename="gimeldageshhebrew",
category="lo",
description="HEBREW LETTER GIMEL WITH DAGESH",
direction="r",
@@ -99558,6 +102169,7 @@ characters.data={
unicodeslot=0xFB32,
},
[0xFB33]={
+ adobename="daletdageshhebrew",
category="lo",
description="HEBREW LETTER DALET WITH DAGESH",
direction="r",
@@ -99567,6 +102179,7 @@ characters.data={
unicodeslot=0xFB33,
},
[0xFB34]={
+ adobename="hedageshhebrew",
category="lo",
description="HEBREW LETTER HE WITH MAPIQ",
direction="r",
@@ -99576,6 +102189,7 @@ characters.data={
unicodeslot=0xFB34,
},
[0xFB35]={
+ adobename="vavdageshhebrew",
category="lo",
description="HEBREW LETTER VAV WITH DAGESH",
direction="r",
@@ -99585,6 +102199,7 @@ characters.data={
unicodeslot=0xFB35,
},
[0xFB36]={
+ adobename="zayindageshhebrew",
category="lo",
description="HEBREW LETTER ZAYIN WITH DAGESH",
direction="r",
@@ -99594,6 +102209,7 @@ characters.data={
unicodeslot=0xFB36,
},
[0xFB38]={
+ adobename="tetdageshhebrew",
category="lo",
description="HEBREW LETTER TET WITH DAGESH",
direction="r",
@@ -99603,6 +102219,7 @@ characters.data={
unicodeslot=0xFB38,
},
[0xFB39]={
+ adobename="yoddageshhebrew",
category="lo",
description="HEBREW LETTER YOD WITH DAGESH",
direction="r",
@@ -99612,6 +102229,7 @@ characters.data={
unicodeslot=0xFB39,
},
[0xFB3A]={
+ adobename="finalkafdageshhebrew",
category="lo",
description="HEBREW LETTER FINAL KAF WITH DAGESH",
direction="r",
@@ -99620,6 +102238,7 @@ characters.data={
unicodeslot=0xFB3A,
},
[0xFB3B]={
+ adobename="kafdageshhebrew",
category="lo",
description="HEBREW LETTER KAF WITH DAGESH",
direction="r",
@@ -99629,6 +102248,7 @@ characters.data={
unicodeslot=0xFB3B,
},
[0xFB3C]={
+ adobename="lameddageshhebrew",
category="lo",
description="HEBREW LETTER LAMED WITH DAGESH",
direction="r",
@@ -99638,6 +102258,7 @@ characters.data={
unicodeslot=0xFB3C,
},
[0xFB3E]={
+ adobename="memdageshhebrew",
category="lo",
description="HEBREW LETTER MEM WITH DAGESH",
direction="r",
@@ -99647,6 +102268,7 @@ characters.data={
unicodeslot=0xFB3E,
},
[0xFB40]={
+ adobename="nundageshhebrew",
category="lo",
description="HEBREW LETTER NUN WITH DAGESH",
direction="r",
@@ -99656,6 +102278,7 @@ characters.data={
unicodeslot=0xFB40,
},
[0xFB41]={
+ adobename="samekhdageshhebrew",
category="lo",
description="HEBREW LETTER SAMEKH WITH DAGESH",
direction="r",
@@ -99665,6 +102288,7 @@ characters.data={
unicodeslot=0xFB41,
},
[0xFB43]={
+ adobename="pefinaldageshhebrew",
category="lo",
description="HEBREW LETTER FINAL PE WITH DAGESH",
direction="r",
@@ -99673,6 +102297,7 @@ characters.data={
unicodeslot=0xFB43,
},
[0xFB44]={
+ adobename="pedageshhebrew",
category="lo",
description="HEBREW LETTER PE WITH DAGESH",
direction="r",
@@ -99682,6 +102307,7 @@ characters.data={
unicodeslot=0xFB44,
},
[0xFB46]={
+ adobename="tsadidageshhebrew",
category="lo",
description="HEBREW LETTER TSADI WITH DAGESH",
direction="r",
@@ -99691,6 +102317,7 @@ characters.data={
unicodeslot=0xFB46,
},
[0xFB47]={
+ adobename="qofdageshhebrew",
category="lo",
description="HEBREW LETTER QOF WITH DAGESH",
direction="r",
@@ -99700,6 +102327,7 @@ characters.data={
unicodeslot=0xFB47,
},
[0xFB48]={
+ adobename="reshdageshhebrew",
category="lo",
description="HEBREW LETTER RESH WITH DAGESH",
direction="r",
@@ -99709,6 +102337,7 @@ characters.data={
unicodeslot=0xFB48,
},
[0xFB49]={
+ adobename="shindageshhebrew",
category="lo",
description="HEBREW LETTER SHIN WITH DAGESH",
direction="r",
@@ -99718,6 +102347,7 @@ characters.data={
unicodeslot=0xFB49,
},
[0xFB4A]={
+ adobename="tavdageshhebrew",
category="lo",
description="HEBREW LETTER TAV WITH DAGESH",
direction="r",
@@ -99727,6 +102357,7 @@ characters.data={
unicodeslot=0xFB4A,
},
[0xFB4B]={
+ adobename="vavholamhebrew",
category="lo",
description="HEBREW LETTER VAV WITH HOLAM",
direction="r",
@@ -99736,6 +102367,7 @@ characters.data={
unicodeslot=0xFB4B,
},
[0xFB4C]={
+ adobename="betrafehebrew",
category="lo",
description="HEBREW LETTER BET WITH RAFE",
direction="r",
@@ -99745,6 +102377,7 @@ characters.data={
unicodeslot=0xFB4C,
},
[0xFB4D]={
+ adobename="kafrafehebrew",
category="lo",
description="HEBREW LETTER KAF WITH RAFE",
direction="r",
@@ -99754,6 +102387,7 @@ characters.data={
unicodeslot=0xFB4D,
},
[0xFB4E]={
+ adobename="perafehebrew",
category="lo",
description="HEBREW LETTER PE WITH RAFE",
direction="r",
@@ -99763,6 +102397,7 @@ characters.data={
unicodeslot=0xFB4E,
},
[0xFB4F]={
+ adobename="aleflamedhebrew",
category="lo",
description="HEBREW LIGATURE ALEF LAMED",
direction="r",
@@ -99827,6 +102462,7 @@ characters.data={
unicodeslot=0xFB56,
},
[0xFB57]={
+ adobename="pehfinalarabic",
category="lo",
description="ARABIC LETTER PEH FINAL FORM",
direction="al",
@@ -99835,6 +102471,7 @@ characters.data={
unicodeslot=0xFB57,
},
[0xFB58]={
+ adobename="pehinitialarabic",
category="lo",
description="ARABIC LETTER PEH INITIAL FORM",
direction="al",
@@ -99843,6 +102480,7 @@ characters.data={
unicodeslot=0xFB58,
},
[0xFB59]={
+ adobename="pehmedialarabic",
category="lo",
description="ARABIC LETTER PEH MEDIAL FORM",
direction="al",
@@ -99955,6 +102593,7 @@ characters.data={
unicodeslot=0xFB66,
},
[0xFB67]={
+ adobename="ttehfinalarabic",
category="lo",
description="ARABIC LETTER TTEH FINAL FORM",
direction="al",
@@ -99963,6 +102602,7 @@ characters.data={
unicodeslot=0xFB67,
},
[0xFB68]={
+ adobename="ttehinitialarabic",
category="lo",
description="ARABIC LETTER TTEH INITIAL FORM",
direction="al",
@@ -99971,6 +102611,7 @@ characters.data={
unicodeslot=0xFB68,
},
[0xFB69]={
+ adobename="ttehmedialarabic",
category="lo",
description="ARABIC LETTER TTEH MEDIAL FORM",
direction="al",
@@ -99987,6 +102628,7 @@ characters.data={
unicodeslot=0xFB6A,
},
[0xFB6B]={
+ adobename="vehfinalarabic",
category="lo",
description="ARABIC LETTER VEH FINAL FORM",
direction="al",
@@ -99995,6 +102637,7 @@ characters.data={
unicodeslot=0xFB6B,
},
[0xFB6C]={
+ adobename="vehinitialarabic",
category="lo",
description="ARABIC LETTER VEH INITIAL FORM",
direction="al",
@@ -100003,6 +102646,7 @@ characters.data={
unicodeslot=0xFB6C,
},
[0xFB6D]={
+ adobename="vehmedialarabic",
category="lo",
description="ARABIC LETTER VEH MEDIAL FORM",
direction="al",
@@ -100115,6 +102759,7 @@ characters.data={
unicodeslot=0xFB7A,
},
[0xFB7B]={
+ adobename="tchehfinalarabic",
category="lo",
description="ARABIC LETTER TCHEH FINAL FORM",
direction="al",
@@ -100123,6 +102768,7 @@ characters.data={
unicodeslot=0xFB7B,
},
[0xFB7C]={
+ adobename="tchehmeeminitialarabic",
category="lo",
description="ARABIC LETTER TCHEH INITIAL FORM",
direction="al",
@@ -100131,6 +102777,7 @@ characters.data={
unicodeslot=0xFB7C,
},
[0xFB7D]={
+ adobename="tchehmedialarabic",
category="lo",
description="ARABIC LETTER TCHEH MEDIAL FORM",
direction="al",
@@ -100227,6 +102874,7 @@ characters.data={
unicodeslot=0xFB88,
},
[0xFB89]={
+ adobename="ddalfinalarabic",
category="lo",
description="ARABIC LETTER DDAL FINAL FORM",
direction="al",
@@ -100243,6 +102891,7 @@ characters.data={
unicodeslot=0xFB8A,
},
[0xFB8B]={
+ adobename="jehfinalarabic",
category="lo",
description="ARABIC LETTER JEH FINAL FORM",
direction="al",
@@ -100259,6 +102908,7 @@ characters.data={
unicodeslot=0xFB8C,
},
[0xFB8D]={
+ adobename="rrehfinalarabic",
category="lo",
description="ARABIC LETTER RREH FINAL FORM",
direction="al",
@@ -100307,6 +102957,7 @@ characters.data={
unicodeslot=0xFB92,
},
[0xFB93]={
+ adobename="gaffinalarabic",
category="lo",
description="ARABIC LETTER GAF FINAL FORM",
direction="al",
@@ -100315,6 +102966,7 @@ characters.data={
unicodeslot=0xFB93,
},
[0xFB94]={
+ adobename="gafinitialarabic",
category="lo",
description="ARABIC LETTER GAF INITIAL FORM",
direction="al",
@@ -100323,6 +102975,7 @@ characters.data={
unicodeslot=0xFB94,
},
[0xFB95]={
+ adobename="gafmedialarabic",
category="lo",
description="ARABIC LETTER GAF MEDIAL FORM",
direction="al",
@@ -100403,6 +103056,7 @@ characters.data={
unicodeslot=0xFB9E,
},
[0xFB9F]={
+ adobename="noonghunnafinalarabic",
category="lo",
description="ARABIC LETTER NOON GHUNNA FINAL FORM",
direction="al",
@@ -100443,6 +103097,7 @@ characters.data={
unicodeslot=0xFBA3,
},
[0xFBA4]={
+ adobename="hehhamzaaboveisolatedarabic",
category="lo",
description="ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM",
direction="al",
@@ -100452,6 +103107,7 @@ characters.data={
unicodeslot=0xFBA4,
},
[0xFBA5]={
+ adobename="hehhamzaabovefinalarabic",
category="lo",
description="ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM",
direction="al",
@@ -100469,6 +103125,7 @@ characters.data={
unicodeslot=0xFBA6,
},
[0xFBA7]={
+ adobename="hehfinalaltonearabic",
category="lo",
description="ARABIC LETTER HEH GOAL FINAL FORM",
direction="al",
@@ -100477,6 +103134,7 @@ characters.data={
unicodeslot=0xFBA7,
},
[0xFBA8]={
+ adobename="hehinitialaltonearabic",
category="lo",
description="ARABIC LETTER HEH GOAL INITIAL FORM",
direction="al",
@@ -100485,6 +103143,7 @@ characters.data={
unicodeslot=0xFBA8,
},
[0xFBA9]={
+ adobename="hehmedialaltonearabic",
category="lo",
description="ARABIC LETTER HEH GOAL MEDIAL FORM",
direction="al",
@@ -100533,6 +103192,7 @@ characters.data={
unicodeslot=0xFBAE,
},
[0xFBAF]={
+ adobename="yehbarreefinalarabic",
category="lo",
description="ARABIC LETTER YEH BARREE FINAL FORM",
direction="al",
@@ -100982,6 +103642,7 @@ characters.data={
unicodeslot=0xFC07,
},
[0xFC08]={
+ adobename="behmeemisolatedarabic",
category="lo",
description="ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM",
direction="al",
@@ -101006,6 +103667,7 @@ characters.data={
unicodeslot=0xFC0A,
},
[0xFC0B]={
+ adobename="tehjeemisolatedarabic",
category="lo",
description="ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM",
direction="al",
@@ -101014,6 +103676,7 @@ characters.data={
unicodeslot=0xFC0B,
},
[0xFC0C]={
+ adobename="tehhahisolatedarabic",
category="lo",
description="ARABIC LIGATURE TEH WITH HAH ISOLATED FORM",
direction="al",
@@ -101030,6 +103693,7 @@ characters.data={
unicodeslot=0xFC0D,
},
[0xFC0E]={
+ adobename="tehmeemisolatedarabic",
category="lo",
description="ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM",
direction="al",
@@ -101494,6 +104158,7 @@ characters.data={
unicodeslot=0xFC47,
},
[0xFC48]={
+ adobename="meemmeemisolatedarabic",
category="lo",
description="ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM",
direction="al",
@@ -101518,6 +104183,7 @@ characters.data={
unicodeslot=0xFC4A,
},
[0xFC4B]={
+ adobename="noonjeemisolatedarabic",
category="lo",
description="ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM",
direction="al",
@@ -101542,6 +104208,7 @@ characters.data={
unicodeslot=0xFC4D,
},
[0xFC4E]={
+ adobename="noonmeemisolatedarabic",
category="lo",
description="ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM",
direction="al",
@@ -101622,6 +104289,7 @@ characters.data={
unicodeslot=0xFC57,
},
[0xFC58]={
+ adobename="yehmeemisolatedarabic",
category="lo",
description="ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM",
direction="al",
@@ -101670,6 +104338,7 @@ characters.data={
unicodeslot=0xFC5D,
},
[0xFC5E]={
+ adobename="shaddadammatanarabic",
category="lo",
description="ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM",
direction="al",
@@ -101678,6 +104347,7 @@ characters.data={
unicodeslot=0xFC5E,
},
[0xFC5F]={
+ adobename="shaddakasratanarabic",
category="lo",
description="ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM",
direction="al",
@@ -101686,6 +104356,7 @@ characters.data={
unicodeslot=0xFC5F,
},
[0xFC60]={
+ adobename="shaddafathaarabic",
category="lo",
description="ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM",
direction="al",
@@ -101694,6 +104365,7 @@ characters.data={
unicodeslot=0xFC60,
},
[0xFC61]={
+ adobename="shaddadammaarabic",
category="lo",
description="ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM",
direction="al",
@@ -101702,6 +104374,7 @@ characters.data={
unicodeslot=0xFC61,
},
[0xFC62]={
+ adobename="shaddakasraarabic",
category="lo",
description="ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM",
direction="al",
@@ -101790,6 +104463,7 @@ characters.data={
unicodeslot=0xFC6C,
},
[0xFC6D]={
+ adobename="behnoonfinalarabic",
category="lo",
description="ARABIC LIGATURE BEH WITH NOON FINAL FORM",
direction="al",
@@ -101838,6 +104512,7 @@ characters.data={
unicodeslot=0xFC72,
},
[0xFC73]={
+ adobename="tehnoonfinalarabic",
category="lo",
description="ARABIC LIGATURE TEH WITH NOON FINAL FORM",
direction="al",
@@ -102046,6 +104721,7 @@ characters.data={
unicodeslot=0xFC8C,
},
[0xFC8D]={
+ adobename="noonnoonfinalarabic",
category="lo",
description="ARABIC LIGATURE NOON WITH NOON FINAL FORM",
direction="al",
@@ -102102,6 +104778,7 @@ characters.data={
unicodeslot=0xFC93,
},
[0xFC94]={
+ adobename="yehnoonfinalarabic",
category="lo",
description="ARABIC LIGATURE YEH WITH NOON FINAL FORM",
direction="al",
@@ -102190,6 +104867,7 @@ characters.data={
unicodeslot=0xFC9E,
},
[0xFC9F]={
+ adobename="behmeeminitialarabic",
category="lo",
description="ARABIC LIGATURE BEH WITH MEEM INITIAL FORM",
direction="al",
@@ -102206,6 +104884,7 @@ characters.data={
unicodeslot=0xFCA0,
},
[0xFCA1]={
+ adobename="tehjeeminitialarabic",
category="lo",
description="ARABIC LIGATURE TEH WITH JEEM INITIAL FORM",
direction="al",
@@ -102214,6 +104893,7 @@ characters.data={
unicodeslot=0xFCA1,
},
[0xFCA2]={
+ adobename="tehhahinitialarabic",
category="lo",
description="ARABIC LIGATURE TEH WITH HAH INITIAL FORM",
direction="al",
@@ -102230,6 +104910,7 @@ characters.data={
unicodeslot=0xFCA3,
},
[0xFCA4]={
+ adobename="tehmeeminitialarabic",
category="lo",
description="ARABIC LIGATURE TEH WITH MEEM INITIAL FORM",
direction="al",
@@ -102526,6 +105207,7 @@ characters.data={
unicodeslot=0xFCC8,
},
[0xFCC9]={
+ adobename="lamjeeminitialarabic",
category="lo",
description="ARABIC LIGATURE LAM WITH JEEM INITIAL FORM",
direction="al",
@@ -102534,6 +105216,7 @@ characters.data={
unicodeslot=0xFCC9,
},
[0xFCCA]={
+ adobename="lamhahinitialarabic",
category="lo",
description="ARABIC LIGATURE LAM WITH HAH INITIAL FORM",
direction="al",
@@ -102542,6 +105225,7 @@ characters.data={
unicodeslot=0xFCCA,
},
[0xFCCB]={
+ adobename="lamkhahinitialarabic",
category="lo",
description="ARABIC LIGATURE LAM WITH KHAH INITIAL FORM",
direction="al",
@@ -102550,6 +105234,7 @@ characters.data={
unicodeslot=0xFCCB,
},
[0xFCCC]={
+ adobename="lammeeminitialarabic",
category="lo",
description="ARABIC LIGATURE LAM WITH MEEM INITIAL FORM",
direction="al",
@@ -102590,6 +105275,7 @@ characters.data={
unicodeslot=0xFCD0,
},
[0xFCD1]={
+ adobename="meemmeeminitialarabic",
category="lo",
description="ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM",
direction="al",
@@ -102598,6 +105284,7 @@ characters.data={
unicodeslot=0xFCD1,
},
[0xFCD2]={
+ adobename="noonjeeminitialarabic",
category="lo",
description="ARABIC LIGATURE NOON WITH JEEM INITIAL FORM",
direction="al",
@@ -102622,6 +105309,7 @@ characters.data={
unicodeslot=0xFCD4,
},
[0xFCD5]={
+ adobename="noonmeeminitialarabic",
category="lo",
description="ARABIC LIGATURE NOON WITH MEEM INITIAL FORM",
direction="al",
@@ -102686,6 +105374,7 @@ characters.data={
unicodeslot=0xFCDC,
},
[0xFCDD]={
+ adobename="yehmeeminitialarabic",
category="lo",
description="ARABIC LIGATURE YEH WITH MEEM INITIAL FORM",
direction="al",
@@ -103462,6 +106151,7 @@ characters.data={
unicodeslot=0xFD3D,
},
[0xFD3E]={
+ adobename="parenleftaltonearabic",
category="ps",
description="ORNATE LEFT PARENTHESIS",
direction="on",
@@ -103469,6 +106159,7 @@ characters.data={
unicodeslot=0xFD3E,
},
[0xFD3F]={
+ adobename="parenrightaltonearabic",
category="pe",
description="ORNATE RIGHT PARENTHESIS",
direction="on",
@@ -103924,6 +106615,7 @@ characters.data={
unicodeslot=0xFD87,
},
[0xFD88]={
+ adobename="lammeemhahinitialarabic",
category="lo",
description="ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM",
direction="al",
@@ -104436,6 +107128,7 @@ characters.data={
unicodeslot=0xFDF1,
},
[0xFDF2]={
+ adobename="lamlamhehisolatedarabic",
category="lo",
description="ARABIC LIGATURE ALLAH ISOLATED FORM",
direction="al",
@@ -104500,6 +107193,7 @@ characters.data={
unicodeslot=0xFDF9,
},
[0xFDFA]={
+ adobename="sallallahoualayhewasallamarabic",
category="lo",
description="ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM",
direction="al",
@@ -104733,7 +107427,8 @@ characters.data={
[0xFE18]={
category="pe",
cjkwd="w",
- description="PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET",
+ comment="corrected description: brakcet",
+ description="PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET",
direction="on",
linebreak="cl",
specials={ "vertical", 0x3017 },
@@ -104777,6 +107472,7 @@ characters.data={
unicodeslot=0xFE23,
},
[0xFE30]={
+ adobename="twodotleadervertical",
category="po",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL TWO DOT LEADER",
@@ -104786,6 +107482,7 @@ characters.data={
unicodeslot=0xFE30,
},
[0xFE31]={
+ adobename="emdashvertical",
category="pd",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL EM DASH",
@@ -104795,6 +107492,7 @@ characters.data={
unicodeslot=0xFE31,
},
[0xFE32]={
+ adobename="endashvertical",
category="pd",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL EN DASH",
@@ -104804,6 +107502,7 @@ characters.data={
unicodeslot=0xFE32,
},
[0xFE33]={
+ adobename="underscorevertical",
category="pc",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL LOW LINE",
@@ -104813,6 +107512,7 @@ characters.data={
unicodeslot=0xFE33,
},
[0xFE34]={
+ adobename="wavyunderscorevertical",
category="pc",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL WAVY LOW LINE",
@@ -104822,6 +107522,7 @@ characters.data={
unicodeslot=0xFE34,
},
[0xFE35]={
+ adobename="parenleftvertical",
category="ps",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS",
@@ -104831,6 +107532,7 @@ characters.data={
unicodeslot=0xFE35,
},
[0xFE36]={
+ adobename="parenrightvertical",
category="pe",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS",
@@ -104840,26 +107542,31 @@ characters.data={
unicodeslot=0xFE36,
},
[0xFE37]={
+ adobename="braceleftvertical",
category="ps",
cjkwd="w",
+ comment="weird math needed for mathml",
description="PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET",
direction="on",
linebreak="op",
- mathfiller="downbracefill", -- funny, chinese, no math, wrong but for the moment we need it for buggy mathml
+ mathfiller="downbracefill",
specials={ "vertical", 0x007B },
unicodeslot=0xFE37,
},
[0xFE38]={
+ adobename="bracerightvertical",
category="pe",
cjkwd="w",
+ comment="weird math needed for mathml",
description="PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET",
direction="on",
linebreak="cl",
- mathfiller="upbracefill", -- funny, chinese, no math, wrong but for the moment we need it for buggy mathml
+ mathfiller="upbracefill",
specials={ "vertical", 0x007D },
unicodeslot=0xFE38,
},
[0xFE39]={
+ adobename="tortoiseshellbracketleftvertical",
category="ps",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET",
@@ -104869,6 +107576,7 @@ characters.data={
unicodeslot=0xFE39,
},
[0xFE3A]={
+ adobename="tortoiseshellbracketrightvertical",
category="pe",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET",
@@ -104878,6 +107586,7 @@ characters.data={
unicodeslot=0xFE3A,
},
[0xFE3B]={
+ adobename="blacklenticularbracketleftvertical",
category="ps",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET",
@@ -104887,6 +107596,7 @@ characters.data={
unicodeslot=0xFE3B,
},
[0xFE3C]={
+ adobename="blacklenticularbracketrightvertical",
category="pe",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET",
@@ -104896,6 +107606,7 @@ characters.data={
unicodeslot=0xFE3C,
},
[0xFE3D]={
+ adobename="dblanglebracketleftvertical",
category="ps",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET",
@@ -104905,6 +107616,7 @@ characters.data={
unicodeslot=0xFE3D,
},
[0xFE3E]={
+ adobename="dblanglebracketrightvertical",
category="pe",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET",
@@ -104914,6 +107626,7 @@ characters.data={
unicodeslot=0xFE3E,
},
[0xFE3F]={
+ adobename="anglebracketleftvertical",
category="ps",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET",
@@ -104923,6 +107636,7 @@ characters.data={
unicodeslot=0xFE3F,
},
[0xFE40]={
+ adobename="anglebracketrightvertical",
category="pe",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET",
@@ -104932,6 +107646,7 @@ characters.data={
unicodeslot=0xFE40,
},
[0xFE41]={
+ adobename="cornerbracketleftvertical",
category="ps",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET",
@@ -104941,6 +107656,7 @@ characters.data={
unicodeslot=0xFE41,
},
[0xFE42]={
+ adobename="cornerbracketrightvertical",
category="pe",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET",
@@ -104950,6 +107666,7 @@ characters.data={
unicodeslot=0xFE42,
},
[0xFE43]={
+ adobename="whitecornerbracketleftvertical",
category="ps",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET",
@@ -104959,6 +107676,7 @@ characters.data={
unicodeslot=0xFE43,
},
[0xFE44]={
+ adobename="whitecornerbracketrightvertical",
category="pe",
cjkwd="w",
description="PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET",
@@ -105002,6 +107720,7 @@ characters.data={
unicodeslot=0xFE48,
},
[0xFE49]={
+ adobename="overlinedashed",
category="po",
cjkwd="w",
description="DASHED OVERLINE",
@@ -105011,6 +107730,7 @@ characters.data={
unicodeslot=0xFE49,
},
[0xFE4A]={
+ adobename="overlinecenterline",
category="po",
cjkwd="w",
description="CENTRELINE OVERLINE",
@@ -105020,6 +107740,7 @@ characters.data={
unicodeslot=0xFE4A,
},
[0xFE4B]={
+ adobename="overlinewavy",
category="po",
cjkwd="w",
description="WAVY OVERLINE",
@@ -105029,6 +107750,7 @@ characters.data={
unicodeslot=0xFE4B,
},
[0xFE4C]={
+ adobename="overlinedblwavy",
category="po",
cjkwd="w",
description="DOUBLE WAVY OVERLINE",
@@ -105038,6 +107760,7 @@ characters.data={
unicodeslot=0xFE4C,
},
[0xFE4D]={
+ adobename="lowlinedashed",
category="pc",
cjkwd="w",
description="DASHED LOW LINE",
@@ -105047,6 +107770,7 @@ characters.data={
unicodeslot=0xFE4D,
},
[0xFE4E]={
+ adobename="lowlinecenterline",
category="pc",
cjkwd="w",
description="CENTRELINE LOW LINE",
@@ -105056,6 +107780,7 @@ characters.data={
unicodeslot=0xFE4E,
},
[0xFE4F]={
+ adobename="underscorewavy",
category="pc",
cjkwd="w",
description="WAVY LOW LINE",
@@ -105065,6 +107790,7 @@ characters.data={
unicodeslot=0xFE4F,
},
[0xFE50]={
+ adobename="commasmall",
category="po",
cjkwd="w",
description="SMALL COMMA",
@@ -105083,6 +107809,7 @@ characters.data={
unicodeslot=0xFE51,
},
[0xFE52]={
+ adobename="periodsmall",
category="po",
cjkwd="w",
description="SMALL FULL STOP",
@@ -105092,6 +107819,7 @@ characters.data={
unicodeslot=0xFE52,
},
[0xFE54]={
+ adobename="semicolonsmall",
category="po",
cjkwd="w",
description="SMALL SEMICOLON",
@@ -105101,6 +107829,7 @@ characters.data={
unicodeslot=0xFE54,
},
[0xFE55]={
+ adobename="colonsmall",
category="po",
cjkwd="w",
description="SMALL COLON",
@@ -105137,6 +107866,7 @@ characters.data={
unicodeslot=0xFE58,
},
[0xFE59]={
+ adobename="parenleftsmall",
category="ps",
cjkwd="w",
description="SMALL LEFT PARENTHESIS",
@@ -105147,6 +107877,7 @@ characters.data={
unicodeslot=0xFE59,
},
[0xFE5A]={
+ adobename="parenrightsmall",
category="pe",
cjkwd="w",
description="SMALL RIGHT PARENTHESIS",
@@ -105157,6 +107888,7 @@ characters.data={
unicodeslot=0xFE5A,
},
[0xFE5B]={
+ adobename="braceleftsmall",
category="ps",
cjkwd="w",
description="SMALL LEFT CURLY BRACKET",
@@ -105167,6 +107899,7 @@ characters.data={
unicodeslot=0xFE5B,
},
[0xFE5C]={
+ adobename="bracerightsmall",
category="pe",
cjkwd="w",
description="SMALL RIGHT CURLY BRACKET",
@@ -105177,6 +107910,7 @@ characters.data={
unicodeslot=0xFE5C,
},
[0xFE5D]={
+ adobename="tortoiseshellbracketleftsmall",
category="ps",
cjkwd="w",
description="SMALL LEFT TORTOISE SHELL BRACKET",
@@ -105187,6 +107921,7 @@ characters.data={
unicodeslot=0xFE5D,
},
[0xFE5E]={
+ adobename="tortoiseshellbracketrightsmall",
category="pe",
cjkwd="w",
description="SMALL RIGHT TORTOISE SHELL BRACKET",
@@ -105197,6 +107932,7 @@ characters.data={
unicodeslot=0xFE5E,
},
[0xFE5F]={
+ adobename="numbersignsmall",
category="po",
cjkwd="w",
description="SMALL NUMBER SIGN",
@@ -105215,6 +107951,7 @@ characters.data={
unicodeslot=0xFE60,
},
[0xFE61]={
+ adobename="asterisksmall",
category="po",
cjkwd="w",
description="SMALL ASTERISK",
@@ -105224,6 +107961,7 @@ characters.data={
unicodeslot=0xFE61,
},
[0xFE62]={
+ adobename="plussmall",
category="sm",
cjkwd="w",
description="SMALL PLUS SIGN",
@@ -105233,6 +107971,7 @@ characters.data={
unicodeslot=0xFE62,
},
[0xFE63]={
+ adobename="hyphensmall",
category="pd",
cjkwd="w",
description="SMALL HYPHEN-MINUS",
@@ -105242,6 +107981,7 @@ characters.data={
unicodeslot=0xFE63,
},
[0xFE64]={
+ adobename="lesssmall",
category="sm",
cjkwd="w",
description="SMALL LESS-THAN SIGN",
@@ -105252,6 +107992,7 @@ characters.data={
unicodeslot=0xFE64,
},
[0xFE65]={
+ adobename="greatersmall",
category="sm",
cjkwd="w",
description="SMALL GREATER-THAN SIGN",
@@ -105262,6 +108003,7 @@ characters.data={
unicodeslot=0xFE65,
},
[0xFE66]={
+ adobename="equalsmall",
category="sm",
cjkwd="w",
description="SMALL EQUALS SIGN",
@@ -105280,6 +108022,7 @@ characters.data={
unicodeslot=0xFE68,
},
[0xFE69]={
+ adobename="dollarsmall",
category="sc",
cjkwd="w",
description="SMALL DOLLAR SIGN",
@@ -105289,6 +108032,7 @@ characters.data={
unicodeslot=0xFE69,
},
[0xFE6A]={
+ adobename="percentsmall",
category="po",
cjkwd="w",
description="SMALL PERCENT SIGN",
@@ -105298,6 +108042,7 @@ characters.data={
unicodeslot=0xFE6A,
},
[0xFE6B]={
+ adobename="atsmall",
category="po",
cjkwd="w",
description="SMALL COMMERCIAL AT",
@@ -105443,6 +108188,7 @@ characters.data={
unicodeslot=0xFE81,
},
[0xFE82]={
+ adobename="alefmaddaabovefinalarabic",
category="lo",
description="ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM",
direction="al",
@@ -105461,6 +108207,7 @@ characters.data={
unicodeslot=0xFE83,
},
[0xFE84]={
+ adobename="alefhamzaabovefinalarabic",
category="lo",
description="ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM",
direction="al",
@@ -105479,6 +108226,7 @@ characters.data={
unicodeslot=0xFE85,
},
[0xFE86]={
+ adobename="wawhamzaabovefinalarabic",
category="lo",
description="ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM",
direction="al",
@@ -105497,6 +108245,7 @@ characters.data={
unicodeslot=0xFE87,
},
[0xFE88]={
+ adobename="alefhamzabelowfinalarabic",
category="lo",
description="ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM",
direction="al",
@@ -105515,6 +108264,7 @@ characters.data={
unicodeslot=0xFE89,
},
[0xFE8A]={
+ adobename="yehhamzaabovefinalarabic",
category="lo",
description="ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM",
direction="al",
@@ -105524,6 +108274,7 @@ characters.data={
unicodeslot=0xFE8A,
},
[0xFE8B]={
+ adobename="yehhamzaaboveinitialarabic",
category="lo",
description="ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM",
direction="al",
@@ -105533,6 +108284,7 @@ characters.data={
unicodeslot=0xFE8B,
},
[0xFE8C]={
+ adobename="yehhamzaabovemedialarabic",
category="lo",
description="ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM",
direction="al",
@@ -105550,6 +108302,7 @@ characters.data={
unicodeslot=0xFE8D,
},
[0xFE8E]={
+ adobename="aleffinalarabic",
category="lo",
description="ARABIC LETTER ALEF FINAL FORM",
direction="al",
@@ -105566,6 +108319,7 @@ characters.data={
unicodeslot=0xFE8F,
},
[0xFE90]={
+ adobename="behfinalarabic",
category="lo",
description="ARABIC LETTER BEH FINAL FORM",
direction="al",
@@ -105574,6 +108328,7 @@ characters.data={
unicodeslot=0xFE90,
},
[0xFE91]={
+ adobename="behinitialarabic",
category="lo",
description="ARABIC LETTER BEH INITIAL FORM",
direction="al",
@@ -105582,6 +108337,7 @@ characters.data={
unicodeslot=0xFE91,
},
[0xFE92]={
+ adobename="behmedialarabic",
category="lo",
description="ARABIC LETTER BEH MEDIAL FORM",
direction="al",
@@ -105598,6 +108354,7 @@ characters.data={
unicodeslot=0xFE93,
},
[0xFE94]={
+ adobename="tehmarbutafinalarabic",
category="lo",
description="ARABIC LETTER TEH MARBUTA FINAL FORM",
direction="al",
@@ -105614,6 +108371,7 @@ characters.data={
unicodeslot=0xFE95,
},
[0xFE96]={
+ adobename="tehfinalarabic",
category="lo",
description="ARABIC LETTER TEH FINAL FORM",
direction="al",
@@ -105622,6 +108380,7 @@ characters.data={
unicodeslot=0xFE96,
},
[0xFE97]={
+ adobename="tehinitialarabic",
category="lo",
description="ARABIC LETTER TEH INITIAL FORM",
direction="al",
@@ -105630,6 +108389,7 @@ characters.data={
unicodeslot=0xFE97,
},
[0xFE98]={
+ adobename="tehmedialarabic",
category="lo",
description="ARABIC LETTER TEH MEDIAL FORM",
direction="al",
@@ -105646,6 +108406,7 @@ characters.data={
unicodeslot=0xFE99,
},
[0xFE9A]={
+ adobename="thehfinalarabic",
category="lo",
description="ARABIC LETTER THEH FINAL FORM",
direction="al",
@@ -105654,6 +108415,7 @@ characters.data={
unicodeslot=0xFE9A,
},
[0xFE9B]={
+ adobename="thehinitialarabic",
category="lo",
description="ARABIC LETTER THEH INITIAL FORM",
direction="al",
@@ -105662,6 +108424,7 @@ characters.data={
unicodeslot=0xFE9B,
},
[0xFE9C]={
+ adobename="thehmedialarabic",
category="lo",
description="ARABIC LETTER THEH MEDIAL FORM",
direction="al",
@@ -105678,6 +108441,7 @@ characters.data={
unicodeslot=0xFE9D,
},
[0xFE9E]={
+ adobename="jeemfinalarabic",
category="lo",
description="ARABIC LETTER JEEM FINAL FORM",
direction="al",
@@ -105686,6 +108450,7 @@ characters.data={
unicodeslot=0xFE9E,
},
[0xFE9F]={
+ adobename="jeeminitialarabic",
category="lo",
description="ARABIC LETTER JEEM INITIAL FORM",
direction="al",
@@ -105694,6 +108459,7 @@ characters.data={
unicodeslot=0xFE9F,
},
[0xFEA0]={
+ adobename="jeemmedialarabic",
category="lo",
description="ARABIC LETTER JEEM MEDIAL FORM",
direction="al",
@@ -105710,6 +108476,7 @@ characters.data={
unicodeslot=0xFEA1,
},
[0xFEA2]={
+ adobename="hahfinalarabic",
category="lo",
description="ARABIC LETTER HAH FINAL FORM",
direction="al",
@@ -105718,6 +108485,7 @@ characters.data={
unicodeslot=0xFEA2,
},
[0xFEA3]={
+ adobename="hahinitialarabic",
category="lo",
description="ARABIC LETTER HAH INITIAL FORM",
direction="al",
@@ -105726,6 +108494,7 @@ characters.data={
unicodeslot=0xFEA3,
},
[0xFEA4]={
+ adobename="hahmedialarabic",
category="lo",
description="ARABIC LETTER HAH MEDIAL FORM",
direction="al",
@@ -105742,6 +108511,7 @@ characters.data={
unicodeslot=0xFEA5,
},
[0xFEA6]={
+ adobename="khahfinalarabic",
category="lo",
description="ARABIC LETTER KHAH FINAL FORM",
direction="al",
@@ -105750,6 +108520,7 @@ characters.data={
unicodeslot=0xFEA6,
},
[0xFEA7]={
+ adobename="khahinitialarabic",
category="lo",
description="ARABIC LETTER KHAH INITIAL FORM",
direction="al",
@@ -105758,6 +108529,7 @@ characters.data={
unicodeslot=0xFEA7,
},
[0xFEA8]={
+ adobename="khahmedialarabic",
category="lo",
description="ARABIC LETTER KHAH MEDIAL FORM",
direction="al",
@@ -105774,6 +108546,7 @@ characters.data={
unicodeslot=0xFEA9,
},
[0xFEAA]={
+ adobename="dalfinalarabic",
category="lo",
description="ARABIC LETTER DAL FINAL FORM",
direction="al",
@@ -105790,6 +108563,7 @@ characters.data={
unicodeslot=0xFEAB,
},
[0xFEAC]={
+ adobename="thalfinalarabic",
category="lo",
description="ARABIC LETTER THAL FINAL FORM",
direction="al",
@@ -105806,6 +108580,7 @@ characters.data={
unicodeslot=0xFEAD,
},
[0xFEAE]={
+ adobename="rehfinalarabic",
category="lo",
description="ARABIC LETTER REH FINAL FORM",
direction="al",
@@ -105822,6 +108597,7 @@ characters.data={
unicodeslot=0xFEAF,
},
[0xFEB0]={
+ adobename="zainfinalarabic",
category="lo",
description="ARABIC LETTER ZAIN FINAL FORM",
direction="al",
@@ -105838,6 +108614,7 @@ characters.data={
unicodeslot=0xFEB1,
},
[0xFEB2]={
+ adobename="seenfinalarabic",
category="lo",
description="ARABIC LETTER SEEN FINAL FORM",
direction="al",
@@ -105846,6 +108623,7 @@ characters.data={
unicodeslot=0xFEB2,
},
[0xFEB3]={
+ adobename="seeninitialarabic",
category="lo",
description="ARABIC LETTER SEEN INITIAL FORM",
direction="al",
@@ -105854,6 +108632,7 @@ characters.data={
unicodeslot=0xFEB3,
},
[0xFEB4]={
+ adobename="seenmedialarabic",
category="lo",
description="ARABIC LETTER SEEN MEDIAL FORM",
direction="al",
@@ -105870,6 +108649,7 @@ characters.data={
unicodeslot=0xFEB5,
},
[0xFEB6]={
+ adobename="sheenfinalarabic",
category="lo",
description="ARABIC LETTER SHEEN FINAL FORM",
direction="al",
@@ -105878,6 +108658,7 @@ characters.data={
unicodeslot=0xFEB6,
},
[0xFEB7]={
+ adobename="sheeninitialarabic",
category="lo",
description="ARABIC LETTER SHEEN INITIAL FORM",
direction="al",
@@ -105886,6 +108667,7 @@ characters.data={
unicodeslot=0xFEB7,
},
[0xFEB8]={
+ adobename="sheenmedialarabic",
category="lo",
description="ARABIC LETTER SHEEN MEDIAL FORM",
direction="al",
@@ -105902,6 +108684,7 @@ characters.data={
unicodeslot=0xFEB9,
},
[0xFEBA]={
+ adobename="sadfinalarabic",
category="lo",
description="ARABIC LETTER SAD FINAL FORM",
direction="al",
@@ -105910,6 +108693,7 @@ characters.data={
unicodeslot=0xFEBA,
},
[0xFEBB]={
+ adobename="sadinitialarabic",
category="lo",
description="ARABIC LETTER SAD INITIAL FORM",
direction="al",
@@ -105918,6 +108702,7 @@ characters.data={
unicodeslot=0xFEBB,
},
[0xFEBC]={
+ adobename="sadmedialarabic",
category="lo",
description="ARABIC LETTER SAD MEDIAL FORM",
direction="al",
@@ -105934,6 +108719,7 @@ characters.data={
unicodeslot=0xFEBD,
},
[0xFEBE]={
+ adobename="dadfinalarabic",
category="lo",
description="ARABIC LETTER DAD FINAL FORM",
direction="al",
@@ -105942,6 +108728,7 @@ characters.data={
unicodeslot=0xFEBE,
},
[0xFEBF]={
+ adobename="dadinitialarabic",
category="lo",
description="ARABIC LETTER DAD INITIAL FORM",
direction="al",
@@ -105950,6 +108737,7 @@ characters.data={
unicodeslot=0xFEBF,
},
[0xFEC0]={
+ adobename="dadmedialarabic",
category="lo",
description="ARABIC LETTER DAD MEDIAL FORM",
direction="al",
@@ -105966,6 +108754,7 @@ characters.data={
unicodeslot=0xFEC1,
},
[0xFEC2]={
+ adobename="tahfinalarabic",
category="lo",
description="ARABIC LETTER TAH FINAL FORM",
direction="al",
@@ -105974,6 +108763,7 @@ characters.data={
unicodeslot=0xFEC2,
},
[0xFEC3]={
+ adobename="tahinitialarabic",
category="lo",
description="ARABIC LETTER TAH INITIAL FORM",
direction="al",
@@ -105982,6 +108772,7 @@ characters.data={
unicodeslot=0xFEC3,
},
[0xFEC4]={
+ adobename="tahmedialarabic",
category="lo",
description="ARABIC LETTER TAH MEDIAL FORM",
direction="al",
@@ -105998,6 +108789,7 @@ characters.data={
unicodeslot=0xFEC5,
},
[0xFEC6]={
+ adobename="zahfinalarabic",
category="lo",
description="ARABIC LETTER ZAH FINAL FORM",
direction="al",
@@ -106006,6 +108798,7 @@ characters.data={
unicodeslot=0xFEC6,
},
[0xFEC7]={
+ adobename="zahinitialarabic",
category="lo",
description="ARABIC LETTER ZAH INITIAL FORM",
direction="al",
@@ -106014,6 +108807,7 @@ characters.data={
unicodeslot=0xFEC7,
},
[0xFEC8]={
+ adobename="zahmedialarabic",
category="lo",
description="ARABIC LETTER ZAH MEDIAL FORM",
direction="al",
@@ -106030,6 +108824,7 @@ characters.data={
unicodeslot=0xFEC9,
},
[0xFECA]={
+ adobename="ainfinalarabic",
category="lo",
description="ARABIC LETTER AIN FINAL FORM",
direction="al",
@@ -106038,6 +108833,7 @@ characters.data={
unicodeslot=0xFECA,
},
[0xFECB]={
+ adobename="aininitialarabic",
category="lo",
description="ARABIC LETTER AIN INITIAL FORM",
direction="al",
@@ -106046,6 +108842,7 @@ characters.data={
unicodeslot=0xFECB,
},
[0xFECC]={
+ adobename="ainmedialarabic",
category="lo",
description="ARABIC LETTER AIN MEDIAL FORM",
direction="al",
@@ -106062,6 +108859,7 @@ characters.data={
unicodeslot=0xFECD,
},
[0xFECE]={
+ adobename="ghainfinalarabic",
category="lo",
description="ARABIC LETTER GHAIN FINAL FORM",
direction="al",
@@ -106070,6 +108868,7 @@ characters.data={
unicodeslot=0xFECE,
},
[0xFECF]={
+ adobename="ghaininitialarabic",
category="lo",
description="ARABIC LETTER GHAIN INITIAL FORM",
direction="al",
@@ -106078,6 +108877,7 @@ characters.data={
unicodeslot=0xFECF,
},
[0xFED0]={
+ adobename="ghainmedialarabic",
category="lo",
description="ARABIC LETTER GHAIN MEDIAL FORM",
direction="al",
@@ -106094,6 +108894,7 @@ characters.data={
unicodeslot=0xFED1,
},
[0xFED2]={
+ adobename="fehfinalarabic",
category="lo",
description="ARABIC LETTER FEH FINAL FORM",
direction="al",
@@ -106102,6 +108903,7 @@ characters.data={
unicodeslot=0xFED2,
},
[0xFED3]={
+ adobename="fehinitialarabic",
category="lo",
description="ARABIC LETTER FEH INITIAL FORM",
direction="al",
@@ -106110,6 +108912,7 @@ characters.data={
unicodeslot=0xFED3,
},
[0xFED4]={
+ adobename="fehmedialarabic",
category="lo",
description="ARABIC LETTER FEH MEDIAL FORM",
direction="al",
@@ -106126,6 +108929,7 @@ characters.data={
unicodeslot=0xFED5,
},
[0xFED6]={
+ adobename="qaffinalarabic",
category="lo",
description="ARABIC LETTER QAF FINAL FORM",
direction="al",
@@ -106134,6 +108938,7 @@ characters.data={
unicodeslot=0xFED6,
},
[0xFED7]={
+ adobename="qafinitialarabic",
category="lo",
description="ARABIC LETTER QAF INITIAL FORM",
direction="al",
@@ -106142,6 +108947,7 @@ characters.data={
unicodeslot=0xFED7,
},
[0xFED8]={
+ adobename="qafmedialarabic",
category="lo",
description="ARABIC LETTER QAF MEDIAL FORM",
direction="al",
@@ -106158,6 +108964,7 @@ characters.data={
unicodeslot=0xFED9,
},
[0xFEDA]={
+ adobename="kaffinalarabic",
category="lo",
description="ARABIC LETTER KAF FINAL FORM",
direction="al",
@@ -106166,6 +108973,7 @@ characters.data={
unicodeslot=0xFEDA,
},
[0xFEDB]={
+ adobename="kafinitialarabic",
category="lo",
description="ARABIC LETTER KAF INITIAL FORM",
direction="al",
@@ -106174,6 +108982,7 @@ characters.data={
unicodeslot=0xFEDB,
},
[0xFEDC]={
+ adobename="kafmedialarabic",
category="lo",
description="ARABIC LETTER KAF MEDIAL FORM",
direction="al",
@@ -106190,6 +108999,7 @@ characters.data={
unicodeslot=0xFEDD,
},
[0xFEDE]={
+ adobename="lamfinalarabic",
category="lo",
description="ARABIC LETTER LAM FINAL FORM",
direction="al",
@@ -106198,6 +109008,7 @@ characters.data={
unicodeslot=0xFEDE,
},
[0xFEDF]={
+ adobename="lammeemkhahinitialarabic",
category="lo",
description="ARABIC LETTER LAM INITIAL FORM",
direction="al",
@@ -106206,6 +109017,7 @@ characters.data={
unicodeslot=0xFEDF,
},
[0xFEE0]={
+ adobename="lammedialarabic",
category="lo",
description="ARABIC LETTER LAM MEDIAL FORM",
direction="al",
@@ -106222,6 +109034,7 @@ characters.data={
unicodeslot=0xFEE1,
},
[0xFEE2]={
+ adobename="meemfinalarabic",
category="lo",
description="ARABIC LETTER MEEM FINAL FORM",
direction="al",
@@ -106230,6 +109043,7 @@ characters.data={
unicodeslot=0xFEE2,
},
[0xFEE3]={
+ adobename="meeminitialarabic",
category="lo",
description="ARABIC LETTER MEEM INITIAL FORM",
direction="al",
@@ -106238,6 +109052,7 @@ characters.data={
unicodeslot=0xFEE3,
},
[0xFEE4]={
+ adobename="meemmedialarabic",
category="lo",
description="ARABIC LETTER MEEM MEDIAL FORM",
direction="al",
@@ -106254,6 +109069,7 @@ characters.data={
unicodeslot=0xFEE5,
},
[0xFEE6]={
+ adobename="noonfinalarabic",
category="lo",
description="ARABIC LETTER NOON FINAL FORM",
direction="al",
@@ -106262,6 +109078,7 @@ characters.data={
unicodeslot=0xFEE6,
},
[0xFEE7]={
+ adobename="nooninitialarabic",
category="lo",
description="ARABIC LETTER NOON INITIAL FORM",
direction="al",
@@ -106270,6 +109087,7 @@ characters.data={
unicodeslot=0xFEE7,
},
[0xFEE8]={
+ adobename="noonmedialarabic",
category="lo",
description="ARABIC LETTER NOON MEDIAL FORM",
direction="al",
@@ -106286,6 +109104,7 @@ characters.data={
unicodeslot=0xFEE9,
},
[0xFEEA]={
+ adobename="hehfinalarabic",
category="lo",
description="ARABIC LETTER HEH FINAL FORM",
direction="al",
@@ -106294,6 +109113,7 @@ characters.data={
unicodeslot=0xFEEA,
},
[0xFEEB]={
+ adobename="hehinitialarabic",
category="lo",
description="ARABIC LETTER HEH INITIAL FORM",
direction="al",
@@ -106302,6 +109122,7 @@ characters.data={
unicodeslot=0xFEEB,
},
[0xFEEC]={
+ adobename="hehmedialarabic",
category="lo",
description="ARABIC LETTER HEH MEDIAL FORM",
direction="al",
@@ -106318,6 +109139,7 @@ characters.data={
unicodeslot=0xFEED,
},
[0xFEEE]={
+ adobename="wawfinalarabic",
category="lo",
description="ARABIC LETTER WAW FINAL FORM",
direction="al",
@@ -106334,6 +109156,7 @@ characters.data={
unicodeslot=0xFEEF,
},
[0xFEF0]={
+ adobename="alefmaksurafinalarabic",
category="lo",
description="ARABIC LETTER ALEF MAKSURA FINAL FORM",
direction="al",
@@ -106350,6 +109173,7 @@ characters.data={
unicodeslot=0xFEF1,
},
[0xFEF2]={
+ adobename="yehfinalarabic",
category="lo",
description="ARABIC LETTER YEH FINAL FORM",
direction="al",
@@ -106358,6 +109182,7 @@ characters.data={
unicodeslot=0xFEF2,
},
[0xFEF3]={
+ adobename="yehinitialarabic",
category="lo",
description="ARABIC LETTER YEH INITIAL FORM",
direction="al",
@@ -106366,6 +109191,7 @@ characters.data={
unicodeslot=0xFEF3,
},
[0xFEF4]={
+ adobename="yehmedialarabic",
category="lo",
description="ARABIC LETTER YEH MEDIAL FORM",
direction="al",
@@ -106374,6 +109200,7 @@ characters.data={
unicodeslot=0xFEF4,
},
[0xFEF5]={
+ adobename="lamalefmaddaaboveisolatedarabic",
category="lo",
description="ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM",
direction="al",
@@ -106382,6 +109209,7 @@ characters.data={
unicodeslot=0xFEF5,
},
[0xFEF6]={
+ adobename="lamalefmaddaabovefinalarabic",
category="lo",
description="ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM",
direction="al",
@@ -106390,6 +109218,7 @@ characters.data={
unicodeslot=0xFEF6,
},
[0xFEF7]={
+ adobename="lamalefhamzaaboveisolatedarabic",
category="lo",
description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM",
direction="al",
@@ -106398,6 +109227,7 @@ characters.data={
unicodeslot=0xFEF7,
},
[0xFEF8]={
+ adobename="lamalefhamzaabovefinalarabic",
category="lo",
description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM",
direction="al",
@@ -106406,6 +109236,7 @@ characters.data={
unicodeslot=0xFEF8,
},
[0xFEF9]={
+ adobename="lamalefhamzabelowisolatedarabic",
category="lo",
description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM",
direction="al",
@@ -106414,6 +109245,7 @@ characters.data={
unicodeslot=0xFEF9,
},
[0xFEFA]={
+ adobename="lamalefhamzabelowfinalarabic",
category="lo",
description="ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM",
direction="al",
@@ -106422,6 +109254,7 @@ characters.data={
unicodeslot=0xFEFA,
},
[0xFEFB]={
+ adobename="lamalefisolatedarabic",
category="lo",
description="ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM",
direction="al",
@@ -106430,6 +109263,7 @@ characters.data={
unicodeslot=0xFEFB,
},
[0xFEFC]={
+ adobename="lamaleffinalarabic",
category="lo",
description="ARABIC LIGATURE LAM WITH ALEF FINAL FORM",
direction="al",
@@ -106438,6 +109272,7 @@ characters.data={
unicodeslot=0xFEFC,
},
[0xFEFF]={
+ adobename="zerowidthjoiner",
category="cf",
contextname="zerowidthnobreakspace",
description="ZERO WIDTH NO-BREAK SPACE",
@@ -106446,6 +109281,7 @@ characters.data={
unicodeslot=0xFEFF,
},
[0xFF01]={
+ adobename="exclammonospace",
category="po",
cjkwd="f",
description="FULLWIDTH EXCLAMATION MARK",
@@ -106455,6 +109291,7 @@ characters.data={
unicodeslot=0xFF01,
},
[0xFF02]={
+ adobename="quotedblmonospace",
category="po",
cjkwd="f",
description="FULLWIDTH QUOTATION MARK",
@@ -106464,6 +109301,7 @@ characters.data={
unicodeslot=0xFF02,
},
[0xFF03]={
+ adobename="numbersignmonospace",
category="po",
cjkwd="f",
description="FULLWIDTH NUMBER SIGN",
@@ -106473,6 +109311,7 @@ characters.data={
unicodeslot=0xFF03,
},
[0xFF04]={
+ adobename="dollarmonospace",
category="sc",
cjkwd="f",
description="FULLWIDTH DOLLAR SIGN",
@@ -106482,6 +109321,7 @@ characters.data={
unicodeslot=0xFF04,
},
[0xFF05]={
+ adobename="percentmonospace",
category="po",
cjkwd="f",
description="FULLWIDTH PERCENT SIGN",
@@ -106491,6 +109331,7 @@ characters.data={
unicodeslot=0xFF05,
},
[0xFF06]={
+ adobename="ampersandmonospace",
category="po",
cjkwd="f",
description="FULLWIDTH AMPERSAND",
@@ -106500,6 +109341,7 @@ characters.data={
unicodeslot=0xFF06,
},
[0xFF07]={
+ adobename="quotesinglemonospace",
category="po",
cjkwd="f",
description="FULLWIDTH APOSTROPHE",
@@ -106509,6 +109351,7 @@ characters.data={
unicodeslot=0xFF07,
},
[0xFF08]={
+ adobename="parenleftmonospace",
category="ps",
cjkwd="f",
description="FULLWIDTH LEFT PARENTHESIS",
@@ -106519,6 +109362,7 @@ characters.data={
unicodeslot=0xFF08,
},
[0xFF09]={
+ adobename="parenrightmonospace",
category="pe",
cjkwd="f",
description="FULLWIDTH RIGHT PARENTHESIS",
@@ -106529,6 +109373,7 @@ characters.data={
unicodeslot=0xFF09,
},
[0xFF0A]={
+ adobename="asteriskmonospace",
category="po",
cjkwd="f",
description="FULLWIDTH ASTERISK",
@@ -106538,6 +109383,7 @@ characters.data={
unicodeslot=0xFF0A,
},
[0xFF0B]={
+ adobename="plusmonospace",
category="sm",
cjkwd="f",
description="FULLWIDTH PLUS SIGN",
@@ -106547,6 +109393,7 @@ characters.data={
unicodeslot=0xFF0B,
},
[0xFF0C]={
+ adobename="commamonospace",
category="po",
cjkwd="f",
description="FULLWIDTH COMMA",
@@ -106556,6 +109403,7 @@ characters.data={
unicodeslot=0xFF0C,
},
[0xFF0D]={
+ adobename="hyphenmonospace",
category="pd",
cjkwd="f",
description="FULLWIDTH HYPHEN-MINUS",
@@ -106565,6 +109413,7 @@ characters.data={
unicodeslot=0xFF0D,
},
[0xFF0E]={
+ adobename="periodmonospace",
category="po",
cjkwd="f",
description="FULLWIDTH FULL STOP",
@@ -106574,6 +109423,7 @@ characters.data={
unicodeslot=0xFF0E,
},
[0xFF0F]={
+ adobename="slashmonospace",
category="po",
cjkwd="f",
description="FULLWIDTH SOLIDUS",
@@ -106583,6 +109433,7 @@ characters.data={
unicodeslot=0xFF0F,
},
[0xFF10]={
+ adobename="zeromonospace",
category="nd",
cjkwd="f",
description="FULLWIDTH DIGIT ZERO",
@@ -106592,6 +109443,7 @@ characters.data={
unicodeslot=0xFF10,
},
[0xFF11]={
+ adobename="onemonospace",
category="nd",
cjkwd="f",
description="FULLWIDTH DIGIT ONE",
@@ -106601,6 +109453,7 @@ characters.data={
unicodeslot=0xFF11,
},
[0xFF12]={
+ adobename="twomonospace",
category="nd",
cjkwd="f",
description="FULLWIDTH DIGIT TWO",
@@ -106610,6 +109463,7 @@ characters.data={
unicodeslot=0xFF12,
},
[0xFF13]={
+ adobename="threemonospace",
category="nd",
cjkwd="f",
description="FULLWIDTH DIGIT THREE",
@@ -106619,6 +109473,7 @@ characters.data={
unicodeslot=0xFF13,
},
[0xFF14]={
+ adobename="fourmonospace",
category="nd",
cjkwd="f",
description="FULLWIDTH DIGIT FOUR",
@@ -106628,6 +109483,7 @@ characters.data={
unicodeslot=0xFF14,
},
[0xFF15]={
+ adobename="fivemonospace",
category="nd",
cjkwd="f",
description="FULLWIDTH DIGIT FIVE",
@@ -106637,6 +109493,7 @@ characters.data={
unicodeslot=0xFF15,
},
[0xFF16]={
+ adobename="sixmonospace",
category="nd",
cjkwd="f",
description="FULLWIDTH DIGIT SIX",
@@ -106646,6 +109503,7 @@ characters.data={
unicodeslot=0xFF16,
},
[0xFF17]={
+ adobename="sevenmonospace",
category="nd",
cjkwd="f",
description="FULLWIDTH DIGIT SEVEN",
@@ -106655,6 +109513,7 @@ characters.data={
unicodeslot=0xFF17,
},
[0xFF18]={
+ adobename="eightmonospace",
category="nd",
cjkwd="f",
description="FULLWIDTH DIGIT EIGHT",
@@ -106664,6 +109523,7 @@ characters.data={
unicodeslot=0xFF18,
},
[0xFF19]={
+ adobename="ninemonospace",
category="nd",
cjkwd="f",
description="FULLWIDTH DIGIT NINE",
@@ -106673,6 +109533,7 @@ characters.data={
unicodeslot=0xFF19,
},
[0xFF1A]={
+ adobename="colonmonospace",
category="po",
cjkwd="f",
description="FULLWIDTH COLON",
@@ -106682,6 +109543,7 @@ characters.data={
unicodeslot=0xFF1A,
},
[0xFF1B]={
+ adobename="semicolonmonospace",
category="po",
cjkwd="f",
description="FULLWIDTH SEMICOLON",
@@ -106691,6 +109553,7 @@ characters.data={
unicodeslot=0xFF1B,
},
[0xFF1C]={
+ adobename="lessmonospace",
category="sm",
cjkwd="f",
description="FULLWIDTH LESS-THAN SIGN",
@@ -106701,6 +109564,7 @@ characters.data={
unicodeslot=0xFF1C,
},
[0xFF1D]={
+ adobename="equalmonospace",
category="sm",
cjkwd="f",
description="FULLWIDTH EQUALS SIGN",
@@ -106710,6 +109574,7 @@ characters.data={
unicodeslot=0xFF1D,
},
[0xFF1E]={
+ adobename="greatermonospace",
category="sm",
cjkwd="f",
description="FULLWIDTH GREATER-THAN SIGN",
@@ -106720,6 +109585,7 @@ characters.data={
unicodeslot=0xFF1E,
},
[0xFF1F]={
+ adobename="questionmonospace",
category="po",
cjkwd="f",
description="FULLWIDTH QUESTION MARK",
@@ -106729,6 +109595,7 @@ characters.data={
unicodeslot=0xFF1F,
},
[0xFF20]={
+ adobename="atmonospace",
category="po",
cjkwd="f",
description="FULLWIDTH COMMERCIAL AT",
@@ -106738,6 +109605,7 @@ characters.data={
unicodeslot=0xFF20,
},
[0xFF21]={
+ adobename="Amonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER A",
@@ -106748,6 +109616,7 @@ characters.data={
unicodeslot=0xFF21,
},
[0xFF22]={
+ adobename="Bmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER B",
@@ -106758,6 +109627,7 @@ characters.data={
unicodeslot=0xFF22,
},
[0xFF23]={
+ adobename="Cmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER C",
@@ -106768,6 +109638,7 @@ characters.data={
unicodeslot=0xFF23,
},
[0xFF24]={
+ adobename="Dmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER D",
@@ -106778,6 +109649,7 @@ characters.data={
unicodeslot=0xFF24,
},
[0xFF25]={
+ adobename="Emonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER E",
@@ -106788,6 +109660,7 @@ characters.data={
unicodeslot=0xFF25,
},
[0xFF26]={
+ adobename="Fmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER F",
@@ -106798,6 +109671,7 @@ characters.data={
unicodeslot=0xFF26,
},
[0xFF27]={
+ adobename="Gmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER G",
@@ -106808,6 +109682,7 @@ characters.data={
unicodeslot=0xFF27,
},
[0xFF28]={
+ adobename="Hmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER H",
@@ -106818,6 +109693,7 @@ characters.data={
unicodeslot=0xFF28,
},
[0xFF29]={
+ adobename="Imonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER I",
@@ -106828,6 +109704,7 @@ characters.data={
unicodeslot=0xFF29,
},
[0xFF2A]={
+ adobename="Jmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER J",
@@ -106838,6 +109715,7 @@ characters.data={
unicodeslot=0xFF2A,
},
[0xFF2B]={
+ adobename="Kmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER K",
@@ -106848,6 +109726,7 @@ characters.data={
unicodeslot=0xFF2B,
},
[0xFF2C]={
+ adobename="Lmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER L",
@@ -106858,6 +109737,7 @@ characters.data={
unicodeslot=0xFF2C,
},
[0xFF2D]={
+ adobename="Mmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER M",
@@ -106868,6 +109748,7 @@ characters.data={
unicodeslot=0xFF2D,
},
[0xFF2E]={
+ adobename="Nmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER N",
@@ -106878,6 +109759,7 @@ characters.data={
unicodeslot=0xFF2E,
},
[0xFF2F]={
+ adobename="Omonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER O",
@@ -106888,6 +109770,7 @@ characters.data={
unicodeslot=0xFF2F,
},
[0xFF30]={
+ adobename="Pmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER P",
@@ -106898,6 +109781,7 @@ characters.data={
unicodeslot=0xFF30,
},
[0xFF31]={
+ adobename="Qmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER Q",
@@ -106908,6 +109792,7 @@ characters.data={
unicodeslot=0xFF31,
},
[0xFF32]={
+ adobename="Rmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER R",
@@ -106918,6 +109803,7 @@ characters.data={
unicodeslot=0xFF32,
},
[0xFF33]={
+ adobename="Smonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER S",
@@ -106928,6 +109814,7 @@ characters.data={
unicodeslot=0xFF33,
},
[0xFF34]={
+ adobename="Tmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER T",
@@ -106938,6 +109825,7 @@ characters.data={
unicodeslot=0xFF34,
},
[0xFF35]={
+ adobename="Umonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER U",
@@ -106948,6 +109836,7 @@ characters.data={
unicodeslot=0xFF35,
},
[0xFF36]={
+ adobename="Vmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER V",
@@ -106958,6 +109847,7 @@ characters.data={
unicodeslot=0xFF36,
},
[0xFF37]={
+ adobename="Wmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER W",
@@ -106968,6 +109858,7 @@ characters.data={
unicodeslot=0xFF37,
},
[0xFF38]={
+ adobename="Xmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER X",
@@ -106978,6 +109869,7 @@ characters.data={
unicodeslot=0xFF38,
},
[0xFF39]={
+ adobename="Ymonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER Y",
@@ -106988,6 +109880,7 @@ characters.data={
unicodeslot=0xFF39,
},
[0xFF3A]={
+ adobename="Zmonospace",
category="lu",
cjkwd="f",
description="FULLWIDTH LATIN CAPITAL LETTER Z",
@@ -106998,6 +109891,7 @@ characters.data={
unicodeslot=0xFF3A,
},
[0xFF3B]={
+ adobename="bracketleftmonospace",
category="ps",
cjkwd="f",
description="FULLWIDTH LEFT SQUARE BRACKET",
@@ -107008,6 +109902,7 @@ characters.data={
unicodeslot=0xFF3B,
},
[0xFF3C]={
+ adobename="backslashmonospace",
category="po",
cjkwd="f",
description="FULLWIDTH REVERSE SOLIDUS",
@@ -107017,6 +109912,7 @@ characters.data={
unicodeslot=0xFF3C,
},
[0xFF3D]={
+ adobename="bracketrightmonospace",
category="pe",
cjkwd="f",
description="FULLWIDTH RIGHT SQUARE BRACKET",
@@ -107027,6 +109923,7 @@ characters.data={
unicodeslot=0xFF3D,
},
[0xFF3E]={
+ adobename="asciicircummonospace",
category="sk",
cjkwd="f",
description="FULLWIDTH CIRCUMFLEX ACCENT",
@@ -107036,6 +109933,7 @@ characters.data={
unicodeslot=0xFF3E,
},
[0xFF3F]={
+ adobename="underscoremonospace",
category="pc",
cjkwd="f",
description="FULLWIDTH LOW LINE",
@@ -107045,6 +109943,7 @@ characters.data={
unicodeslot=0xFF3F,
},
[0xFF40]={
+ adobename="gravemonospace",
category="sk",
cjkwd="f",
description="FULLWIDTH GRAVE ACCENT",
@@ -107054,6 +109953,7 @@ characters.data={
unicodeslot=0xFF40,
},
[0xFF41]={
+ adobename="amonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER A",
@@ -107064,6 +109964,7 @@ characters.data={
unicodeslot=0xFF41,
},
[0xFF42]={
+ adobename="bmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER B",
@@ -107074,6 +109975,7 @@ characters.data={
unicodeslot=0xFF42,
},
[0xFF43]={
+ adobename="cmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER C",
@@ -107084,6 +109986,7 @@ characters.data={
unicodeslot=0xFF43,
},
[0xFF44]={
+ adobename="dmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER D",
@@ -107094,6 +109997,7 @@ characters.data={
unicodeslot=0xFF44,
},
[0xFF45]={
+ adobename="emonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER E",
@@ -107104,6 +110008,7 @@ characters.data={
unicodeslot=0xFF45,
},
[0xFF46]={
+ adobename="fmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER F",
@@ -107114,6 +110019,7 @@ characters.data={
unicodeslot=0xFF46,
},
[0xFF47]={
+ adobename="gmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER G",
@@ -107124,6 +110030,7 @@ characters.data={
unicodeslot=0xFF47,
},
[0xFF48]={
+ adobename="hmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER H",
@@ -107134,6 +110041,7 @@ characters.data={
unicodeslot=0xFF48,
},
[0xFF49]={
+ adobename="imonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER I",
@@ -107144,6 +110052,7 @@ characters.data={
unicodeslot=0xFF49,
},
[0xFF4A]={
+ adobename="jmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER J",
@@ -107154,6 +110063,7 @@ characters.data={
unicodeslot=0xFF4A,
},
[0xFF4B]={
+ adobename="kmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER K",
@@ -107164,6 +110074,7 @@ characters.data={
unicodeslot=0xFF4B,
},
[0xFF4C]={
+ adobename="lmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER L",
@@ -107174,6 +110085,7 @@ characters.data={
unicodeslot=0xFF4C,
},
[0xFF4D]={
+ adobename="mmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER M",
@@ -107184,6 +110096,7 @@ characters.data={
unicodeslot=0xFF4D,
},
[0xFF4E]={
+ adobename="nmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER N",
@@ -107194,6 +110107,7 @@ characters.data={
unicodeslot=0xFF4E,
},
[0xFF4F]={
+ adobename="omonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER O",
@@ -107204,6 +110118,7 @@ characters.data={
unicodeslot=0xFF4F,
},
[0xFF50]={
+ adobename="pmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER P",
@@ -107214,6 +110129,7 @@ characters.data={
unicodeslot=0xFF50,
},
[0xFF51]={
+ adobename="qmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER Q",
@@ -107224,6 +110140,7 @@ characters.data={
unicodeslot=0xFF51,
},
[0xFF52]={
+ adobename="rmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER R",
@@ -107234,6 +110151,7 @@ characters.data={
unicodeslot=0xFF52,
},
[0xFF53]={
+ adobename="smonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER S",
@@ -107244,6 +110162,7 @@ characters.data={
unicodeslot=0xFF53,
},
[0xFF54]={
+ adobename="tmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER T",
@@ -107254,6 +110173,7 @@ characters.data={
unicodeslot=0xFF54,
},
[0xFF55]={
+ adobename="umonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER U",
@@ -107264,6 +110184,7 @@ characters.data={
unicodeslot=0xFF55,
},
[0xFF56]={
+ adobename="vmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER V",
@@ -107274,6 +110195,7 @@ characters.data={
unicodeslot=0xFF56,
},
[0xFF57]={
+ adobename="wmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER W",
@@ -107284,6 +110206,7 @@ characters.data={
unicodeslot=0xFF57,
},
[0xFF58]={
+ adobename="xmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER X",
@@ -107294,6 +110217,7 @@ characters.data={
unicodeslot=0xFF58,
},
[0xFF59]={
+ adobename="ymonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER Y",
@@ -107304,6 +110228,7 @@ characters.data={
unicodeslot=0xFF59,
},
[0xFF5A]={
+ adobename="zmonospace",
category="ll",
cjkwd="f",
description="FULLWIDTH LATIN SMALL LETTER Z",
@@ -107314,6 +110239,7 @@ characters.data={
unicodeslot=0xFF5A,
},
[0xFF5B]={
+ adobename="braceleftmonospace",
category="ps",
cjkwd="f",
description="FULLWIDTH LEFT CURLY BRACKET",
@@ -107324,6 +110250,7 @@ characters.data={
unicodeslot=0xFF5B,
},
[0xFF5C]={
+ adobename="barmonospace",
category="sm",
cjkwd="f",
description="FULLWIDTH VERTICAL LINE",
@@ -107333,6 +110260,7 @@ characters.data={
unicodeslot=0xFF5C,
},
[0xFF5D]={
+ adobename="bracerightmonospace",
category="pe",
cjkwd="f",
description="FULLWIDTH RIGHT CURLY BRACKET",
@@ -107343,6 +110271,7 @@ characters.data={
unicodeslot=0xFF5D,
},
[0xFF5E]={
+ adobename="asciitildemonospace",
category="sm",
cjkwd="f",
description="FULLWIDTH TILDE",
@@ -107372,6 +110301,7 @@ characters.data={
unicodeslot=0xFF60,
},
[0xFF61]={
+ adobename="periodhalfwidth",
category="po",
cjkwd="h",
description="HALFWIDTH IDEOGRAPHIC FULL STOP",
@@ -107381,6 +110311,7 @@ characters.data={
unicodeslot=0xFF61,
},
[0xFF62]={
+ adobename="cornerbracketlefthalfwidth",
category="ps",
cjkwd="h",
description="HALFWIDTH LEFT CORNER BRACKET",
@@ -107391,6 +110322,7 @@ characters.data={
unicodeslot=0xFF62,
},
[0xFF63]={
+ adobename="cornerbracketrighthalfwidth",
category="pe",
cjkwd="h",
description="HALFWIDTH RIGHT CORNER BRACKET",
@@ -107401,6 +110333,7 @@ characters.data={
unicodeslot=0xFF63,
},
[0xFF64]={
+ adobename="ideographiccommaleft",
category="po",
cjkwd="h",
description="HALFWIDTH IDEOGRAPHIC COMMA",
@@ -107410,6 +110343,7 @@ characters.data={
unicodeslot=0xFF64,
},
[0xFF65]={
+ adobename="middledotkatakanahalfwidth",
category="po",
cjkwd="h",
description="HALFWIDTH KATAKANA MIDDLE DOT",
@@ -107419,6 +110353,7 @@ characters.data={
unicodeslot=0xFF65,
},
[0xFF66]={
+ adobename="wokatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER WO",
@@ -107428,6 +110363,7 @@ characters.data={
unicodeslot=0xFF66,
},
[0xFF67]={
+ adobename="asmallkatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SMALL A",
@@ -107437,6 +110373,7 @@ characters.data={
unicodeslot=0xFF67,
},
[0xFF68]={
+ adobename="ismallkatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SMALL I",
@@ -107446,6 +110383,7 @@ characters.data={
unicodeslot=0xFF68,
},
[0xFF69]={
+ adobename="usmallkatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SMALL U",
@@ -107455,6 +110393,7 @@ characters.data={
unicodeslot=0xFF69,
},
[0xFF6A]={
+ adobename="esmallkatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SMALL E",
@@ -107464,6 +110403,7 @@ characters.data={
unicodeslot=0xFF6A,
},
[0xFF6B]={
+ adobename="osmallkatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SMALL O",
@@ -107473,6 +110413,7 @@ characters.data={
unicodeslot=0xFF6B,
},
[0xFF6C]={
+ adobename="yasmallkatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SMALL YA",
@@ -107482,6 +110423,7 @@ characters.data={
unicodeslot=0xFF6C,
},
[0xFF6D]={
+ adobename="yusmallkatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SMALL YU",
@@ -107491,6 +110433,7 @@ characters.data={
unicodeslot=0xFF6D,
},
[0xFF6E]={
+ adobename="yosmallkatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SMALL YO",
@@ -107500,6 +110443,7 @@ characters.data={
unicodeslot=0xFF6E,
},
[0xFF6F]={
+ adobename="tusmallkatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SMALL TU",
@@ -107509,6 +110453,7 @@ characters.data={
unicodeslot=0xFF6F,
},
[0xFF70]={
+ adobename="katahiraprolongmarkhalfwidth",
category="lm",
cjkwd="h",
description="HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK",
@@ -107518,6 +110463,7 @@ characters.data={
unicodeslot=0xFF70,
},
[0xFF71]={
+ adobename="akatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER A",
@@ -107527,6 +110473,7 @@ characters.data={
unicodeslot=0xFF71,
},
[0xFF72]={
+ adobename="ikatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER I",
@@ -107536,6 +110483,7 @@ characters.data={
unicodeslot=0xFF72,
},
[0xFF73]={
+ adobename="ukatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER U",
@@ -107545,6 +110493,7 @@ characters.data={
unicodeslot=0xFF73,
},
[0xFF74]={
+ adobename="ekatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER E",
@@ -107554,6 +110503,7 @@ characters.data={
unicodeslot=0xFF74,
},
[0xFF75]={
+ adobename="okatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER O",
@@ -107563,6 +110513,7 @@ characters.data={
unicodeslot=0xFF75,
},
[0xFF76]={
+ adobename="kakatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER KA",
@@ -107572,6 +110523,7 @@ characters.data={
unicodeslot=0xFF76,
},
[0xFF77]={
+ adobename="kikatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER KI",
@@ -107581,6 +110533,7 @@ characters.data={
unicodeslot=0xFF77,
},
[0xFF78]={
+ adobename="kukatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER KU",
@@ -107590,6 +110543,7 @@ characters.data={
unicodeslot=0xFF78,
},
[0xFF79]={
+ adobename="kekatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER KE",
@@ -107599,6 +110553,7 @@ characters.data={
unicodeslot=0xFF79,
},
[0xFF7A]={
+ adobename="kokatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER KO",
@@ -107608,6 +110563,7 @@ characters.data={
unicodeslot=0xFF7A,
},
[0xFF7B]={
+ adobename="sakatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SA",
@@ -107617,6 +110573,7 @@ characters.data={
unicodeslot=0xFF7B,
},
[0xFF7C]={
+ adobename="sikatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SI",
@@ -107626,6 +110583,7 @@ characters.data={
unicodeslot=0xFF7C,
},
[0xFF7D]={
+ adobename="sukatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SU",
@@ -107635,6 +110593,7 @@ characters.data={
unicodeslot=0xFF7D,
},
[0xFF7E]={
+ adobename="sekatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SE",
@@ -107644,6 +110603,7 @@ characters.data={
unicodeslot=0xFF7E,
},
[0xFF7F]={
+ adobename="sokatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER SO",
@@ -107653,6 +110613,7 @@ characters.data={
unicodeslot=0xFF7F,
},
[0xFF80]={
+ adobename="takatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER TA",
@@ -107662,6 +110623,7 @@ characters.data={
unicodeslot=0xFF80,
},
[0xFF81]={
+ adobename="tikatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER TI",
@@ -107671,6 +110633,7 @@ characters.data={
unicodeslot=0xFF81,
},
[0xFF82]={
+ adobename="tukatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER TU",
@@ -107680,6 +110643,7 @@ characters.data={
unicodeslot=0xFF82,
},
[0xFF83]={
+ adobename="tekatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER TE",
@@ -107689,6 +110653,7 @@ characters.data={
unicodeslot=0xFF83,
},
[0xFF84]={
+ adobename="tokatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER TO",
@@ -107698,6 +110663,7 @@ characters.data={
unicodeslot=0xFF84,
},
[0xFF85]={
+ adobename="nakatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER NA",
@@ -107707,6 +110673,7 @@ characters.data={
unicodeslot=0xFF85,
},
[0xFF86]={
+ adobename="nikatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER NI",
@@ -107716,6 +110683,7 @@ characters.data={
unicodeslot=0xFF86,
},
[0xFF87]={
+ adobename="nukatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER NU",
@@ -107725,6 +110693,7 @@ characters.data={
unicodeslot=0xFF87,
},
[0xFF88]={
+ adobename="nekatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER NE",
@@ -107734,6 +110703,7 @@ characters.data={
unicodeslot=0xFF88,
},
[0xFF89]={
+ adobename="nokatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER NO",
@@ -107743,6 +110713,7 @@ characters.data={
unicodeslot=0xFF89,
},
[0xFF8A]={
+ adobename="hakatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER HA",
@@ -107752,6 +110723,7 @@ characters.data={
unicodeslot=0xFF8A,
},
[0xFF8B]={
+ adobename="hikatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER HI",
@@ -107761,6 +110733,7 @@ characters.data={
unicodeslot=0xFF8B,
},
[0xFF8C]={
+ adobename="hukatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER HU",
@@ -107770,6 +110743,7 @@ characters.data={
unicodeslot=0xFF8C,
},
[0xFF8D]={
+ adobename="hekatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER HE",
@@ -107779,6 +110753,7 @@ characters.data={
unicodeslot=0xFF8D,
},
[0xFF8E]={
+ adobename="hokatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER HO",
@@ -107788,6 +110763,7 @@ characters.data={
unicodeslot=0xFF8E,
},
[0xFF8F]={
+ adobename="makatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER MA",
@@ -107797,6 +110773,7 @@ characters.data={
unicodeslot=0xFF8F,
},
[0xFF90]={
+ adobename="mikatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER MI",
@@ -107806,6 +110783,7 @@ characters.data={
unicodeslot=0xFF90,
},
[0xFF91]={
+ adobename="mukatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER MU",
@@ -107815,6 +110793,7 @@ characters.data={
unicodeslot=0xFF91,
},
[0xFF92]={
+ adobename="mekatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER ME",
@@ -107824,6 +110803,7 @@ characters.data={
unicodeslot=0xFF92,
},
[0xFF93]={
+ adobename="mokatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER MO",
@@ -107833,6 +110813,7 @@ characters.data={
unicodeslot=0xFF93,
},
[0xFF94]={
+ adobename="yakatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER YA",
@@ -107842,6 +110823,7 @@ characters.data={
unicodeslot=0xFF94,
},
[0xFF95]={
+ adobename="yukatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER YU",
@@ -107851,6 +110833,7 @@ characters.data={
unicodeslot=0xFF95,
},
[0xFF96]={
+ adobename="yokatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER YO",
@@ -107860,6 +110843,7 @@ characters.data={
unicodeslot=0xFF96,
},
[0xFF97]={
+ adobename="rakatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER RA",
@@ -107869,6 +110853,7 @@ characters.data={
unicodeslot=0xFF97,
},
[0xFF98]={
+ adobename="rikatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER RI",
@@ -107878,6 +110863,7 @@ characters.data={
unicodeslot=0xFF98,
},
[0xFF99]={
+ adobename="rukatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER RU",
@@ -107887,6 +110873,7 @@ characters.data={
unicodeslot=0xFF99,
},
[0xFF9A]={
+ adobename="rekatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER RE",
@@ -107896,6 +110883,7 @@ characters.data={
unicodeslot=0xFF9A,
},
[0xFF9B]={
+ adobename="rokatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER RO",
@@ -107905,6 +110893,7 @@ characters.data={
unicodeslot=0xFF9B,
},
[0xFF9C]={
+ adobename="wakatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER WA",
@@ -107914,6 +110903,7 @@ characters.data={
unicodeslot=0xFF9C,
},
[0xFF9D]={
+ adobename="nkatakanahalfwidth",
category="lo",
cjkwd="h",
description="HALFWIDTH KATAKANA LETTER N",
@@ -107923,6 +110913,7 @@ characters.data={
unicodeslot=0xFF9D,
},
[0xFF9E]={
+ adobename="voicedmarkkanahalfwidth",
category="lm",
cjkwd="h",
description="HALFWIDTH KATAKANA VOICED SOUND MARK",
@@ -107932,6 +110923,7 @@ characters.data={
unicodeslot=0xFF9E,
},
[0xFF9F]={
+ adobename="semivoicedmarkkanahalfwidth",
category="lm",
cjkwd="h",
description="HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK",
@@ -108409,6 +111401,7 @@ characters.data={
unicodeslot=0xFFDC,
},
[0xFFE0]={
+ adobename="centmonospace",
category="sc",
cjkwd="f",
description="FULLWIDTH CENT SIGN",
@@ -108418,6 +111411,7 @@ characters.data={
unicodeslot=0xFFE0,
},
[0xFFE1]={
+ adobename="sterlingmonospace",
category="sc",
cjkwd="f",
description="FULLWIDTH POUND SIGN",
@@ -108436,6 +111430,7 @@ characters.data={
unicodeslot=0xFFE2,
},
[0xFFE3]={
+ adobename="macronmonospace",
category="sk",
cjkwd="f",
description="FULLWIDTH MACRON",
@@ -108454,6 +111449,7 @@ characters.data={
unicodeslot=0xFFE4,
},
[0xFFE5]={
+ adobename="yenmonospace",
category="sc",
cjkwd="f",
description="FULLWIDTH YEN SIGN",
@@ -108463,6 +111459,7 @@ characters.data={
unicodeslot=0xFFE5,
},
[0xFFE6]={
+ adobename="wonmonospace",
category="sc",
cjkwd="f",
description="FULLWIDTH WON SIGN",
@@ -108538,25 +111535,25 @@ characters.data={
category="cf",
description="INTERLINEAR ANNOTATION ANCHOR",
direction="on",
- visible="yes",
linebreak="cm",
unicodeslot=0xFFF9,
+ visible="yes",
},
[0xFFFA]={
category="cf",
description="INTERLINEAR ANNOTATION SEPARATOR",
direction="on",
- visible="yes",
linebreak="cm",
unicodeslot=0xFFFA,
+ visible="yes",
},
[0xFFFB]={
category="cf",
description="INTERLINEAR ANNOTATION TERMINATOR",
direction="on",
- visible="yes",
linebreak="cm",
unicodeslot=0xFFFB,
+ visible="yes",
},
[0xFFFC]={
category="so",
@@ -126218,7 +129215,6 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL V",
direction="l",
linebreak="al",
---mathclass="variable",
specials={ "font", 0x0056 },
unicodeslot=0x1D449,
},
@@ -133610,15 +136606,6 @@ characters.data={
specials={ "font", 0x0039 },
unicodeslot=0x1D7FF,
},
- [0x20000]={
- category="lo",
- cjkwd="w",
- description="<CJK Ideograph Extension B>",
- direction="l",
- linebreak="id",
- unicodeslot=0x20000,
- range=0x2A6D6,
- },
[0x2F800]={
category="lo",
cjkwd="w",
@@ -141096,32 +144083,4 @@ characters.data={
linebreak="cm",
unicodeslot=0xE01EF,
},
---~ [0xF0000]={
---~ category="co",
---~ cjkwd="a",
---~ description="<Plane 0x000F Private Use, First>",
---~ direction="l",
---~ unicodeslot=0xF0000,
---~ },
---~ [0xFFFFD]={
---~ category="co",
---~ cjkwd="a",
---~ description="<Plane 0x000F Private Use, Last>",
---~ direction="l",
---~ unicodeslot=0xFFFFD,
---~ },
---~ [0x100000]={
---~ category="co",
---~ cjkwd="a",
---~ description="<Plane 0x0010 Private Use, First>",
---~ direction="l",
---~ unicodeslot=0x100000,
---~ },
---~ [0x10FFFD]={
---~ category="co",
---~ cjkwd="a",
---~ description="<Plane 0x0010 Private Use, Last>",
---~ direction="l",
---~ unicodeslot=0x10FFFD,
---~ },
}
diff --git a/Master/texmf-dist/tex/context/base/char-enc.lua b/Master/texmf-dist/tex/context/base/char-enc.lua
index 45f404ee985..ef6805e54f3 100644
--- a/Master/texmf-dist/tex/context/base/char-enc.lua
+++ b/Master/texmf-dist/tex/context/base/char-enc.lua
@@ -6,11 +6,14 @@ if not modules then modules = { } end modules ['char-syn'] = {
license = "see context related readme files"
}
--- thanks to tex4ht for these mappings
+-- Thanks to tex4ht for these mappings.
-characters = characters or { }
+local allocate, setinitializer = utilities.storage.allocate, utilities.storage.setinitializer
-characters.synonyms = {
+characters = characters or { }
+local characters = characters
+
+characters.synonyms = allocate { -- afm mess
angle = 0x2220,
anticlockwise = 0x21BA,
arrowaxisleft = 0x2190,
@@ -141,23 +144,42 @@ characters.synonyms = {
Yen = 0x00A5,
}
-if not characters.enccodes then
+--~ if not characters.enccodes then
+--~
+--~ local enccodes = { } characters.enccodes = enccodes
+--~
+--~ for unicode, data in next, characters.data do
+--~ local encname = data.adobename or data.contextname
+--~ if encname then
+--~ enccodes[encname] = unicode
+--~ end
+--~ end
+--~
+--~ for name, unicode in next, characters.synonyms do
+--~ if not enccodes[name] then enccodes[name] = unicode end
+--~ end
+--~
+--~
+--~ end
+--~
+--~ storage.register("characters.enccodes", characters.enccodes, "characters.enccodes")
+
+-- As this table is seldom used, we can delay its definition. Beware, this means
+-- that table.print would not work on this file unless it is accessed once. This
+-- why the serializer does a dummy access.
- local enccodes = { }
+local enccodes = allocate() characters.enccodes = enccodes
+local function initialize()
for unicode, data in next, characters.data do
local encname = data.adobename or data.contextname
if encname then
enccodes[encname] = unicode
end
end
-
for name, unicode in next, characters.synonyms do
if not enccodes[name] then enccodes[name] = unicode end
end
-
- characters.enccodes = enccodes
-
end
-storage.register("characters.enccodes", characters.enccodes, "characters.enccodes")
+setinitializer(enccodes,initialize)
diff --git a/Master/texmf-dist/tex/context/base/char-ini.lua b/Master/texmf-dist/tex/context/base/char-ini.lua
index 5c4a40bad51..89f8336f826 100644
--- a/Master/texmf-dist/tex/context/base/char-ini.lua
+++ b/Master/texmf-dist/tex/context/base/char-ini.lua
@@ -6,19 +6,32 @@ if not modules then modules = { } end modules ['char-ini'] = {
license = "see context related readme files"
}
-tex = tex or { }
-xml = xml or { }
+-- todo: make two files, one for format generation, one for format use
+local tex = tex
local utf = unicode.utf8
local utfchar, utfbyte, utfvalues = utf.char, utf.byte, string.utfvalues
-local concat = table.concat
-local next, tonumber = next, tonumber
+local ustring = unicode.ustring
+local concat, unpack = table.concat, table.unpack
+local next, tonumber, type, rawget, rawset = next, tonumber, type, rawget, rawset
local texsprint, texprint = tex.sprint, tex.print
local format, lower, gsub, match, gmatch = string.format, string.lower, string.gsub, string.match, string.match, string.gmatch
+local P, R, lpegmatch = lpeg.P, lpeg.R, lpeg.match
-local ctxcatcodes = tex.ctxcatcodes
-local texcatcodes = tex.texcatcodes
+local allocate = utilities.storage.allocate
+local mark = utilities.storage.mark
+local texsetlccode = tex.setlccode
+local texsetuccode = tex.setuccode
+local texsetsfcode = tex.setsfcode
+local texsetcatcode = tex.setcatcode
+local ctxcatcodes = tex.ctxcatcodes
+local texcatcodes = tex.texcatcodes
+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--
<p>This module implements some methods and creates additional datastructured
@@ -29,215 +42,279 @@ from the big character table that we use for all kind of purposes:
loaded!</p>
--ldx]]--
-characters = characters or { }
-characters.data = characters.data or { }
+characters = characters or { }
+local characters = characters
-local data = characters.data
+local data = characters.data
-if not characters.ranges then
- characters.ranges = { }
- for k, v in next, data do
- characters.ranges[#characters.ranges+1] = k
+if data then
+ mark(data) -- why does this fail
+else
+ report_defining("fatal error: 'char-def.lua' is not loaded")
+ os.exit()
+end
+
+--[[ldx--
+<p>This converts a string (if given) into a number.</p>
+--ldx]]--
+
+local pattern = (P("0x") + P("U+")) * ((R("09","AF")^1 * P(-1)) / function(s) return tonumber(s,16) end)
+
+lpeg.patterns.chartonumber = pattern
+
+local function chartonumber(k)
+ if type(k) == "string" then
+ local u = lpegmatch(pattern,k)
+ if u then
+ return utfbyte(u)
+ else
+ return utfbyte(k) or 0
+ end
+ else
+ return k or 0
end
end
-storage.register("characters/ranges",characters.ranges,"characters.ranges")
+local function charfromnumber(k)
+ if type(k) == "number" then
+ return utfchar(k) or ""
+ else
+ local u = lpegmatch(pattern,k)
+ if u then
+ return utfchar(u)
+ else
+ return k
+ end
+ end
+end
-local ranges = characters.ranges
+--~ print(chartonumber(97), chartonumber("a"), chartonumber("0x61"), chartonumber("U+61"))
-setmetatable(data, {
- __index = function(t,k)
+characters.tonumber = chartonumber
+characters.fromnumber = charfromnumber
+
+local private = {
+ description = "PRIVATE SLOT",
+}
+
+local ranges = allocate()
+characters.ranges = ranges
+
+setmetatableindex(data, function(t,k)
+ local tk = type(k)
+ if tk == "string" then
+ k = lpegmatch(pattern,k) or utfbyte(k)
+ if k then
+ local tk = rawget(t,k)
+ if tk then
+ return tk
+ else
+ -- goes to ranges
+ end
+ else
+ return private
+ end
+ end
+ if tk == "number" and k < 0xF0000 then
for r=1,#ranges do
- local rr = ranges[r] -- first in range
- if k > rr and k <= data[rr].range then
- t[k] = t[rr]
- return t[k]
+ local rr = ranges[r]
+ if k >= rr.first and k <= rr.last then
+ local extender = rr.extender
+ if extender then
+ v = extender(k,v)
+ end
+ t[k] = v
+ return v
end
end
- return nil
end
-})
-
-characters.blocks = {
- ["aegeannumbers"] = { 0x10100, 0x1013F, "Aegean Numbers" },
- ["alphabeticpresentationforms"] = { 0x0FB00, 0x0FB4F, "Alphabetic Presentation Forms" },
- ["ancientgreekmusicalnotation"] = { 0x1D200, 0x1D24F, "Ancient Greek Musical Notation" },
- ["ancientgreeknumbers"] = { 0x10140, 0x1018F, "Ancient Greek Numbers" },
- ["ancientsymbols"] = { 0x10190, 0x101CF, "Ancient Symbols" },
- ["arabic"] = { 0x00600, 0x006FF, "Arabic" },
- ["arabicpresentationformsa"] = { 0x0FB50, 0x0FDFF, "Arabic Presentation Forms-A" },
- ["arabicpresentationformsb"] = { 0x0FE70, 0x0FEFF, "Arabic Presentation Forms-B" },
- ["arabicsupplement"] = { 0x00750, 0x0077F, "Arabic Supplement" },
- ["armenian"] = { 0x00530, 0x0058F, "Armenian" },
- ["arrows"] = { 0x02190, 0x021FF, "Arrows" },
- ["balinese"] = { 0x01B00, 0x01B7F, "Balinese" },
- ["basiclatin"] = { 0x00000, 0x0007F, "Basic Latin" },
- ["bengali"] = { 0x00980, 0x009FF, "Bengali" },
- ["blockelements"] = { 0x02580, 0x0259F, "Block Elements" },
- ["bopomofo"] = { 0x03100, 0x0312F, "Bopomofo" },
- ["bopomofoextended"] = { 0x031A0, 0x031BF, "Bopomofo Extended" },
- ["boxdrawing"] = { 0x02500, 0x0257F, "Box Drawing" },
- ["braillepatterns"] = { 0x02800, 0x028FF, "Braille Patterns" },
- ["buginese"] = { 0x01A00, 0x01A1F, "Buginese" },
- ["buhid"] = { 0x01740, 0x0175F, "Buhid" },
- ["byzantinemusicalsymbols"] = { 0x1D000, 0x1D0FF, "Byzantine Musical Symbols" },
- ["carian"] = { 0x102A0, 0x102DF, "Carian" },
- ["cham"] = { 0x0AA00, 0x0AA5F, "Cham" },
- ["cherokee"] = { 0x013A0, 0x013FF, "Cherokee" },
- ["cjkcompatibility"] = { 0x03300, 0x033FF, "CJK Compatibility" },
- ["cjkcompatibilityforms"] = { 0x0FE30, 0x0FE4F, "CJK Compatibility Forms" },
- ["cjkcompatibilityideographs"] = { 0x0F900, 0x0FAFF, "CJK Compatibility Ideographs" },
- ["cjkcompatibilityideographssupplement"] = { 0x2F800, 0x2FA1F, "CJK Compatibility Ideographs Supplement" },
- ["cjkradicalssupplement"] = { 0x02E80, 0x02EFF, "CJK Radicals Supplement" },
- ["cjkstrokes"] = { 0x031C0, 0x031EF, "CJK Strokes" },
- ["cjksymbolsandpunctuation"] = { 0x03000, 0x0303F, "CJK Symbols and Punctuation" },
- ["cjkunifiedideographs"] = { 0x04E00, 0x09FFF, "CJK Unified Ideographs" },
- ["cjkunifiedideographsextensiona"] = { 0x03400, 0x04DBF, "CJK Unified Ideographs Extension A" },
- ["cjkunifiedideographsextensionb"] = { 0x20000, 0x2A6DF, "CJK Unified Ideographs Extension B" },
- ["combiningdiacriticalmarks"] = { 0x00300, 0x0036F, "Combining Diacritical Marks" },
- ["combiningdiacriticalmarksforsymbols"] = { 0x020D0, 0x020FF, "Combining Diacritical Marks for Symbols" },
- ["combiningdiacriticalmarkssupplement"] = { 0x01DC0, 0x01DFF, "Combining Diacritical Marks Supplement" },
- ["combininghalfmarks"] = { 0x0FE20, 0x0FE2F, "Combining Half Marks" },
- ["controlpictures"] = { 0x02400, 0x0243F, "Control Pictures" },
- ["coptic"] = { 0x02C80, 0x02CFF, "Coptic" },
- ["countingrodnumerals"] = { 0x1D360, 0x1D37F, "Counting Rod Numerals" },
- ["cuneiform"] = { 0x12000, 0x123FF, "Cuneiform" },
- ["cuneiformnumbersandpunctuation"] = { 0x12400, 0x1247F, "Cuneiform Numbers and Punctuation" },
- ["currencysymbols"] = { 0x020A0, 0x020CF, "Currency Symbols" },
- ["cypriotsyllabary"] = { 0x10800, 0x1083F, "Cypriot Syllabary" },
- ["cyrillic"] = { 0x00400, 0x004FF, "Cyrillic" },
- ["cyrillicextendeda"] = { 0x02DE0, 0x02DFF, "Cyrillic Extended-A" },
- ["cyrillicextendedb"] = { 0x0A640, 0x0A69F, "Cyrillic Extended-B" },
- ["cyrillicsupplement"] = { 0x00500, 0x0052F, "Cyrillic Supplement" },
- ["deseret"] = { 0x10400, 0x1044F, "Deseret" },
- ["devanagari"] = { 0x00900, 0x0097F, "Devanagari" },
- ["dingbats"] = { 0x02700, 0x027BF, "Dingbats" },
- ["dominotiles"] = { 0x1F030, 0x1F09F, "Domino Tiles" },
- ["enclosedalphanumerics"] = { 0x02460, 0x024FF, "Enclosed Alphanumerics" },
- ["enclosedcjklettersandmonths"] = { 0x03200, 0x032FF, "Enclosed CJK Letters and Months" },
- ["ethiopic"] = { 0x01200, 0x0137F, "Ethiopic" },
- ["ethiopicextended"] = { 0x02D80, 0x02DDF, "Ethiopic Extended" },
- ["ethiopicsupplement"] = { 0x01380, 0x0139F, "Ethiopic Supplement" },
- ["generalpunctuation"] = { 0x02000, 0x0206F, "General Punctuation" },
- ["geometricshapes"] = { 0x025A0, 0x025FF, "Geometric Shapes" },
- ["georgian"] = { 0x010A0, 0x010FF, "Georgian" },
- ["georgiansupplement"] = { 0x02D00, 0x02D2F, "Georgian Supplement" },
- ["glagolitic"] = { 0x02C00, 0x02C5F, "Glagolitic" },
- ["gothic"] = { 0x10330, 0x1034F, "Gothic" },
- ["greekandcoptic"] = { 0x00370, 0x003FF, "Greek and Coptic" },
- ["greekextended"] = { 0x01F00, 0x01FFF, "Greek Extended" },
- ["gujarati"] = { 0x00A80, 0x00AFF, "Gujarati" },
- ["gurmukhi"] = { 0x00A00, 0x00A7F, "Gurmukhi" },
- ["halfwidthandfullwidthforms"] = { 0x0FF00, 0x0FFEF, "Halfwidth and Fullwidth Forms" },
- ["hangulcompatibilityjamo"] = { 0x03130, 0x0318F, "Hangul Compatibility Jamo" },
- ["hanguljamo"] = { 0x01100, 0x011FF, "Hangul Jamo" },
- ["hangulsyllables"] = { 0x0AC00, 0x0D7AF, "Hangul Syllables" },
- ["hanunoo"] = { 0x01720, 0x0173F, "Hanunoo" },
- ["hebrew"] = { 0x00590, 0x005FF, "Hebrew" },
- ["highprivateusesurrogates"] = { 0x0DB80, 0x0DBFF, "High Private Use Surrogates" },
- ["highsurrogates"] = { 0x0D800, 0x0DB7F, "High Surrogates" },
- ["hiragana"] = { 0x03040, 0x0309F, "Hiragana" },
- ["ideographicdescriptioncharacters"] = { 0x02FF0, 0x02FFF, "Ideographic Description Characters" },
- ["ipaextensions"] = { 0x00250, 0x02AF, "IPA Extensions" },
- ["kanbun"] = { 0x03190, 0x0319F, "Kanbun" },
- ["kangxiradicals"] = { 0x02F00, 0x02FDF, "Kangxi Radicals" },
- ["kannada"] = { 0x00C80, 0x00CFF, "Kannada" },
- ["katakana"] = { 0x030A0, 0x030FF, "Katakana" },
- ["katakanaphoneticextensions"] = { 0x031F0, 0x031FF, "Katakana Phonetic Extensions" },
- ["kayahli"] = { 0x0A900, 0x0A92F, "Kayah Li" },
- ["kharoshthi"] = { 0x10A00, 0x10A5F, "Kharoshthi" },
- ["khmer"] = { 0x01780, 0x017FF, "Khmer" },
- ["khmersymbols"] = { 0x019E0, 0x019FF, "Khmer Symbols" },
- ["lao"] = { 0x00E80, 0x00EFF, "Lao" },
- ["latinextendeda"] = { 0x00100, 0x0017F, "Latin Extended-A" },
- ["latinextendedadditional"] = { 0x01E00, 0x01EFF, "Latin Extended Additional" },
- ["latinextendedb"] = { 0x00180, 0x0024F, "Latin Extended-B" },
- ["latinextendedc"] = { 0x02C60, 0x02C7F, "Latin Extended-C" },
- ["latinextendedd"] = { 0x0A720, 0x0A7FF, "Latin Extended-D" },
- ["latinsupplement"] = { 0x00080, 0x000FF, "Latin-1 Supplement" },
- ["lepcha"] = { 0x01C00, 0x01C4F, "Lepcha" },
- ["letterlikesymbols"] = { 0x02100, 0x0214F, "Letterlike Symbols" },
- ["limbu"] = { 0x01900, 0x0194F, "Limbu" },
- ["linearbideograms"] = { 0x10080, 0x100FF, "Linear B Ideograms" },
- ["linearbsyllabary"] = { 0x10000, 0x1007F, "Linear B Syllabary" },
- ["lowsurrogates"] = { 0x0DC00, 0x0DFFF, "Low Surrogates" },
- ["lycian"] = { 0x10280, 0x1029F, "Lycian" },
- ["lydian"] = { 0x10920, 0x1093F, "Lydian" },
- ["mahjongtiles"] = { 0x1F000, 0x1F02F, "Mahjong Tiles" },
- ["malayalam"] = { 0x00D00, 0x00D7F, "Malayalam" },
- ["mathematicalalphanumericsymbols"] = { 0x1D400, 0x1D7FF, "Mathematical Alphanumeric Symbols" },
- ["mathematicaloperators"] = { 0x02200, 0x022FF, "Mathematical Operators" },
- ["miscellaneousmathematicalsymbolsa"] = { 0x027C0, 0x027EF, "Miscellaneous Mathematical Symbols-A" },
- ["miscellaneousmathematicalsymbolsb"] = { 0x02980, 0x029FF, "Miscellaneous Mathematical Symbols-B" },
- ["miscellaneoussymbols"] = { 0x02600, 0x026FF, "Miscellaneous Symbols" },
- ["miscellaneoussymbolsandarrows"] = { 0x02B00, 0x02BFF, "Miscellaneous Symbols and Arrows" },
- ["miscellaneoustechnical"] = { 0x02300, 0x023FF, "Miscellaneous Technical" },
- ["modifiertoneletters"] = { 0x0A700, 0x0A71F, "Modifier Tone Letters" },
- ["mongolian"] = { 0x01800, 0x018AF, "Mongolian" },
- ["musicalsymbols"] = { 0x1D100, 0x1D1FF, "Musical Symbols" },
- ["myanmar"] = { 0x01000, 0x0109F, "Myanmar" },
- ["newtailue"] = { 0x01980, 0x019DF, "New Tai Lue" },
- ["nko"] = { 0x007C0, 0x007FF, "NKo" },
- ["numberforms"] = { 0x02150, 0x0218F, "Number Forms" },
- ["ogham"] = { 0x01680, 0x0169F, "Ogham" },
- ["olchiki"] = { 0x01C50, 0x01C7F, "Ol Chiki" },
- ["olditalic"] = { 0x10300, 0x1032F, "Old Italic" },
- ["oldpersian"] = { 0x103A0, 0x103DF, "Old Persian" },
- ["opticalcharacterrecognition"] = { 0x02440, 0x0245F, "Optical Character Recognition" },
- ["oriya"] = { 0x00B00, 0x00B7F, "Oriya" },
- ["osmanya"] = { 0x10480, 0x104AF, "Osmanya" },
- ["phagspa"] = { 0x0A840, 0x0A87F, "Phags-pa" },
- ["phaistosdisc"] = { 0x101D0, 0x101FF, "Phaistos Disc" },
- ["phoenician"] = { 0x10900, 0x1091F, "Phoenician" },
- ["phoneticextensions"] = { 0x01D00, 0x01D7F, "Phonetic Extensions" },
- ["phoneticextensionssupplement"] = { 0x01D80, 0x01DBF, "Phonetic Extensions Supplement" },
- ["privateusearea"] = { 0x0E000, 0x0F8FF, "Private Use Area" },
- ["rejang"] = { 0x0A930, 0x0A95F, "Rejang" },
- ["runic"] = { 0x016A0, 0x016FF, "Runic" },
- ["saurashtra"] = { 0x0A880, 0x0A8DF, "Saurashtra" },
- ["shavian"] = { 0x10450, 0x1047F, "Shavian" },
- ["sinhala"] = { 0x00D80, 0x00DFF, "Sinhala" },
- ["smallformvariants"] = { 0x0FE50, 0x0FE6F, "Small Form Variants" },
- ["spacingmodifierletters"] = { 0x002B0, 0x002FF, "Spacing Modifier Letters" },
- ["specials"] = { 0x0FFF0, 0x0FFFF, "Specials" },
- ["sundanese"] = { 0x01B80, 0x01BBF, "Sundanese" },
- ["superscriptsandsubscripts"] = { 0x02070, 0x0209F, "Superscripts and Subscripts" },
- ["supplementalarrowsa"] = { 0x027F0, 0x027FF, "Supplemental Arrows-A" },
- ["supplementalarrowsb"] = { 0x02900, 0x0297F, "Supplemental Arrows-B" },
- ["supplementalmathematicaloperators"] = { 0x02A00, 0x02AFF, "Supplemental Mathematical Operators" },
- ["supplementalpunctuation"] = { 0x02E00, 0x02E7F, "Supplemental Punctuation" },
- ["supplementaryprivateuseareaa"] = { 0xF0000, 0xFFFFF, "Supplementary Private Use Area-A" },
- ["supplementaryprivateuseareab"] = { 0x100000,0x10FFFF,"Supplementary Private Use Area-B" },
- ["sylotinagri"] = { 0x0A800, 0x0A82F, "Syloti Nagri" },
- ["syriac"] = { 0x00700, 0x0074F, "Syriac" },
- ["tagalog"] = { 0x01700, 0x0171F, "Tagalog" },
- ["tagbanwa"] = { 0x01760, 0x0177F, "Tagbanwa" },
- ["tags"] = { 0xE0000, 0xE007F, "Tags" },
- ["taile"] = { 0x01950, 0x0197F, "Tai Le" },
- ["taixuanjingsymbols"] = { 0x1D300, 0x1D35F, "Tai Xuan Jing Symbols" },
- ["tamil"] = { 0x00B80, 0x00BFF, "Tamil" },
- ["telugu"] = { 0x00C00, 0x00C7F, "Telugu" },
- ["thaana"] = { 0x00780, 0x007BF, "Thaana" },
- ["thai"] = { 0x00E00, 0x00E7F, "Thai" },
- ["tibetan"] = { 0x00F00, 0x00FFF, "Tibetan" },
- ["tifinagh"] = { 0x02D30, 0x02D7F, "Tifinagh" },
- ["ugaritic"] = { 0x10380, 0x1039F, "Ugaritic" },
- ["unifiedcanadianaboriginalsyllabics"] = { 0x01400, 0x0167F, "Unified Canadian Aboriginal Syllabics" },
- ["vai"] = { 0x0A500, 0x0A63F, "Vai" },
- ["variationselectors"] = { 0x0FE00, 0x0FE0F, "Variation Selectors" },
- ["variationselectorssupplement"] = { 0xE0100, 0xE01EF, "Variation Selectors Supplement" },
- ["verticalforms"] = { 0x0FE10, 0x0FE1F, "Vertical Forms" },
- ["yijinghexagramsymbols"] = { 0x04DC0, 0x04DFF, "Yijing Hexagram Symbols" },
- ["yiradicals"] = { 0x0A490, 0x0A4CF, "Yi Radicals" },
- ["yisyllables"] = { 0x0A000, 0x0A48F, "Yi Syllables" },
+ return private -- handy for when we loop over characters in fonts and check for a property
+end)
+
+local blocks = allocate {
+ ["aegeannumbers"] = { first = 0x10100, last = 0x1013F, description = "Aegean Numbers" },
+ ["alphabeticpresentationforms"] = { first = 0x0FB00, last = 0x0FB4F, description = "Alphabetic Presentation Forms" },
+ ["ancientgreekmusicalnotation"] = { first = 0x1D200, last = 0x1D24F, description = "Ancient Greek Musical Notation" },
+ ["ancientgreeknumbers"] = { first = 0x10140, last = 0x1018F, description = "Ancient Greek Numbers" },
+ ["ancientsymbols"] = { first = 0x10190, last = 0x101CF, description = "Ancient Symbols" },
+ ["arabic"] = { first = 0x00600, last = 0x006FF, description = "Arabic" },
+ ["arabicpresentationformsa"] = { first = 0x0FB50, last = 0x0FDFF, description = "Arabic Presentation Forms-A" },
+ ["arabicpresentationformsb"] = { first = 0x0FE70, last = 0x0FEFF, description = "Arabic Presentation Forms-B" },
+ ["arabicsupplement"] = { first = 0x00750, last = 0x0077F, description = "Arabic Supplement" },
+ ["armenian"] = { first = 0x00530, last = 0x0058F, description = "Armenian" },
+ ["arrows"] = { first = 0x02190, last = 0x021FF, description = "Arrows" },
+ ["balinese"] = { first = 0x01B00, last = 0x01B7F, description = "Balinese" },
+ ["basiclatin"] = { first = 0x00000, last = 0x0007F, description = "Basic Latin" },
+ ["bengali"] = { first = 0x00980, last = 0x009FF, description = "Bengali" },
+ ["blockelements"] = { first = 0x02580, last = 0x0259F, description = "Block Elements" },
+ ["bopomofo"] = { first = 0x03100, last = 0x0312F, description = "Bopomofo" },
+ ["bopomofoextended"] = { first = 0x031A0, last = 0x031BF, description = "Bopomofo Extended" },
+ ["boxdrawing"] = { first = 0x02500, last = 0x0257F, description = "Box Drawing" },
+ ["braillepatterns"] = { first = 0x02800, last = 0x028FF, description = "Braille Patterns" },
+ ["buginese"] = { first = 0x01A00, last = 0x01A1F, description = "Buginese" },
+ ["buhid"] = { first = 0x01740, last = 0x0175F, description = "Buhid" },
+ ["byzantinemusicalsymbols"] = { first = 0x1D000, last = 0x1D0FF, description = "Byzantine Musical Symbols" },
+ ["carian"] = { first = 0x102A0, last = 0x102DF, description = "Carian" },
+ ["cham"] = { first = 0x0AA00, last = 0x0AA5F, description = "Cham" },
+ ["cherokee"] = { first = 0x013A0, last = 0x013FF, description = "Cherokee" },
+ ["cjkcompatibility"] = { first = 0x03300, last = 0x033FF, description = "CJK Compatibility" },
+ ["cjkcompatibilityforms"] = { first = 0x0FE30, last = 0x0FE4F, description = "CJK Compatibility Forms" },
+ ["cjkcompatibilityideographs"] = { first = 0x0F900, last = 0x0FAFF, description = "CJK Compatibility Ideographs" },
+ ["cjkcompatibilityideographssupplement"] = { first = 0x2F800, last = 0x2FA1F, description = "CJK Compatibility Ideographs Supplement" },
+ ["cjkradicalssupplement"] = { first = 0x02E80, last = 0x02EFF, description = "CJK Radicals Supplement" },
+ ["cjkstrokes"] = { first = 0x031C0, last = 0x031EF, description = "CJK Strokes" },
+ ["cjksymbolsandpunctuation"] = { first = 0x03000, last = 0x0303F, description = "CJK Symbols and Punctuation" },
+ ["cjkunifiedideographs"] = { first = 0x04E00, last = 0x09FFF, description = "CJK Unified Ideographs" },
+ ["cjkunifiedideographsextensiona"] = { first = 0x03400, last = 0x04DBF, description = "CJK Unified Ideographs Extension A" },
+ ["cjkunifiedideographsextensionb"] = { first = 0x20000, last = 0x2A6DF, description = "CJK Unified Ideographs Extension B" },
+ ["combiningdiacriticalmarks"] = { first = 0x00300, last = 0x0036F, description = "Combining Diacritical Marks" },
+ ["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" },
+ ["controlpictures"] = { first = 0x02400, last = 0x0243F, description = "Control Pictures" },
+ ["coptic"] = { first = 0x02C80, last = 0x02CFF, description = "Coptic" },
+ ["countingrodnumerals"] = { first = 0x1D360, last = 0x1D37F, description = "Counting Rod Numerals" },
+ ["cuneiform"] = { first = 0x12000, last = 0x123FF, description = "Cuneiform" },
+ ["cuneiformnumbersandpunctuation"] = { first = 0x12400, last = 0x1247F, description = "Cuneiform Numbers and Punctuation" },
+ ["currencysymbols"] = { first = 0x020A0, last = 0x020CF, description = "Currency Symbols" },
+ ["cypriotsyllabary"] = { first = 0x10800, last = 0x1083F, description = "Cypriot Syllabary" },
+ ["cyrillic"] = { first = 0x00400, last = 0x004FF, description = "Cyrillic" },
+ ["cyrillicextendeda"] = { first = 0x02DE0, last = 0x02DFF, description = "Cyrillic Extended-A" },
+ ["cyrillicextendedb"] = { first = 0x0A640, last = 0x0A69F, description = "Cyrillic Extended-B" },
+ ["cyrillicsupplement"] = { first = 0x00500, last = 0x0052F, description = "Cyrillic Supplement" },
+ ["deseret"] = { first = 0x10400, last = 0x1044F, description = "Deseret" },
+ ["devanagari"] = { first = 0x00900, last = 0x0097F, description = "Devanagari" },
+ ["dingbats"] = { first = 0x02700, last = 0x027BF, description = "Dingbats" },
+ ["dominotiles"] = { first = 0x1F030, last = 0x1F09F, description = "Domino Tiles" },
+ ["enclosedalphanumerics"] = { first = 0x02460, last = 0x024FF, description = "Enclosed Alphanumerics" },
+ ["enclosedcjklettersandmonths"] = { first = 0x03200, last = 0x032FF, description = "Enclosed CJK Letters and Months" },
+ ["ethiopic"] = { first = 0x01200, last = 0x0137F, description = "Ethiopic" },
+ ["ethiopicextended"] = { first = 0x02D80, last = 0x02DDF, description = "Ethiopic Extended" },
+ ["ethiopicsupplement"] = { first = 0x01380, last = 0x0139F, description = "Ethiopic Supplement" },
+ ["generalpunctuation"] = { first = 0x02000, last = 0x0206F, description = "General Punctuation" },
+ ["geometricshapes"] = { first = 0x025A0, last = 0x025FF, description = "Geometric Shapes" },
+ ["georgian"] = { first = 0x010A0, last = 0x010FF, description = "Georgian" },
+ ["georgiansupplement"] = { first = 0x02D00, last = 0x02D2F, description = "Georgian Supplement" },
+ ["glagolitic"] = { first = 0x02C00, last = 0x02C5F, description = "Glagolitic" },
+ ["gothic"] = { first = 0x10330, last = 0x1034F, description = "Gothic" },
+ ["greekandcoptic"] = { first = 0x00370, last = 0x003FF, description = "Greek and Coptic" },
+ ["greekextended"] = { first = 0x01F00, last = 0x01FFF, description = "Greek Extended" },
+ ["gujarati"] = { first = 0x00A80, last = 0x00AFF, description = "Gujarati" },
+ ["gurmukhi"] = { first = 0x00A00, last = 0x00A7F, description = "Gurmukhi" },
+ ["halfwidthandfullwidthforms"] = { first = 0x0FF00, last = 0x0FFEF, description = "Halfwidth and Fullwidth Forms" },
+ ["hangulcompatibilityjamo"] = { first = 0x03130, last = 0x0318F, description = "Hangul Compatibility Jamo" },
+ ["hanguljamo"] = { first = 0x01100, last = 0x011FF, description = "Hangul Jamo" },
+ ["hangulsyllables"] = { first = 0x0AC00, last = 0x0D7AF, description = "Hangul Syllables" },
+ ["hanunoo"] = { first = 0x01720, last = 0x0173F, description = "Hanunoo" },
+ ["hebrew"] = { first = 0x00590, last = 0x005FF, 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, description = "Hiragana" },
+ ["ideographicdescriptioncharacters"] = { first = 0x02FF0, last = 0x02FFF, description = "Ideographic Description Characters" },
+ ["ipaextensions"] = { first = 0x00250, last = 0x002AF, description = "IPA Extensions" },
+ ["kanbun"] = { first = 0x03190, last = 0x0319F, description = "Kanbun" },
+ ["kangxiradicals"] = { first = 0x02F00, last = 0x02FDF, description = "Kangxi Radicals" },
+ ["kannada"] = { first = 0x00C80, last = 0x00CFF, description = "Kannada" },
+ ["katakana"] = { first = 0x030A0, last = 0x030FF, description = "Katakana" },
+ ["katakanaphoneticextensions"] = { first = 0x031F0, last = 0x031FF, description = "Katakana Phonetic Extensions" },
+ ["kayahli"] = { first = 0x0A900, last = 0x0A92F, description = "Kayah Li" },
+ ["kharoshthi"] = { first = 0x10A00, last = 0x10A5F, description = "Kharoshthi" },
+ ["khmer"] = { first = 0x01780, last = 0x017FF, description = "Khmer" },
+ ["khmersymbols"] = { first = 0x019E0, last = 0x019FF, description = "Khmer Symbols" },
+ ["lao"] = { first = 0x00E80, last = 0x00EFF, description = "Lao" },
+ ["latinextendeda"] = { first = 0x00100, last = 0x0017F, description = "Latin Extended-A" },
+ ["latinextendedadditional"] = { first = 0x01E00, last = 0x01EFF, description = "Latin Extended Additional" },
+ ["latinextendedb"] = { first = 0x00180, last = 0x0024F, description = "Latin Extended-B" },
+ ["latinextendedc"] = { first = 0x02C60, last = 0x02C7F, description = "Latin Extended-C" },
+ ["latinextendedd"] = { first = 0x0A720, last = 0x0A7FF, description = "Latin Extended-D" },
+ ["latinsupplement"] = { first = 0x00080, last = 0x000FF, description = "Latin-1 Supplement" },
+ ["lepcha"] = { first = 0x01C00, last = 0x01C4F, description = "Lepcha" },
+ ["letterlikesymbols"] = { first = 0x02100, last = 0x0214F, description = "Letterlike Symbols" },
+ ["limbu"] = { first = 0x01900, last = 0x0194F, description = "Limbu" },
+ ["linearbideograms"] = { first = 0x10080, last = 0x100FF, description = "Linear B Ideograms" },
+ ["linearbsyllabary"] = { first = 0x10000, last = 0x1007F, description = "Linear B Syllabary" },
+ ["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, description = "Malayalam" },
+ ["mathematicalalphanumericsymbols"] = { first = 0x1D400, last = 0x1D7FF, description = "Mathematical Alphanumeric Symbols" },
+ ["mathematicaloperators"] = { first = 0x02200, last = 0x022FF, description = "Mathematical Operators" },
+ ["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" },
+ ["miscellaneoustechnical"] = { first = 0x02300, last = 0x023FF, description = "Miscellaneous Technical" },
+ ["modifiertoneletters"] = { first = 0x0A700, last = 0x0A71F, description = "Modifier Tone Letters" },
+ ["mongolian"] = { first = 0x01800, last = 0x018AF, description = "Mongolian" },
+ ["musicalsymbols"] = { first = 0x1D100, last = 0x1D1FF, description = "Musical Symbols" },
+ ["myanmar"] = { first = 0x01000, last = 0x0109F, description = "Myanmar" },
+ ["newtailue"] = { first = 0x01980, last = 0x019DF, description = "New Tai Lue" },
+ ["nko"] = { first = 0x007C0, last = 0x007FF, description = "NKo" },
+ ["numberforms"] = { first = 0x02150, last = 0x0218F, description = "Number Forms" },
+ ["ogham"] = { first = 0x01680, last = 0x0169F, description = "Ogham" },
+ ["olchiki"] = { first = 0x01C50, last = 0x01C7F, description = "Ol Chiki" },
+ ["olditalic"] = { first = 0x10300, last = 0x1032F, description = "Old Italic" },
+ ["oldpersian"] = { first = 0x103A0, last = 0x103DF, description = "Old Persian" },
+ ["opticalcharacterrecognition"] = { first = 0x02440, last = 0x0245F, description = "Optical Character Recognition" },
+ ["oriya"] = { first = 0x00B00, last = 0x00B7F, description = "Oriya" },
+ ["osmanya"] = { first = 0x10480, last = 0x104AF, description = "Osmanya" },
+ ["phagspa"] = { first = 0x0A840, last = 0x0A87F, description = "Phags-pa" },
+ ["phaistosdisc"] = { first = 0x101D0, last = 0x101FF, description = "Phaistos Disc" },
+ ["phoenician"] = { first = 0x10900, last = 0x1091F, description = "Phoenician" },
+ ["phoneticextensions"] = { first = 0x01D00, last = 0x01D7F, description = "Phonetic Extensions" },
+ ["phoneticextensionssupplement"] = { first = 0x01D80, last = 0x01DBF, description = "Phonetic Extensions Supplement" },
+ ["privateusearea"] = { first = 0x0E000, last = 0x0F8FF, description = "Private Use Area" },
+ ["rejang"] = { first = 0x0A930, last = 0x0A95F, description = "Rejang" },
+ ["runic"] = { first = 0x016A0, last = 0x016FF, description = "Runic" },
+ ["saurashtra"] = { first = 0x0A880, last = 0x0A8DF, description = "Saurashtra" },
+ ["shavian"] = { first = 0x10450, last = 0x1047F, description = "Shavian" },
+ ["sinhala"] = { first = 0x00D80, last = 0x00DFF, description = "Sinhala" },
+ ["smallformvariants"] = { first = 0x0FE50, last = 0x0FE6F, description = "Small Form Variants" },
+ ["spacingmodifierletters"] = { first = 0x002B0, last = 0x002FF, description = "Spacing Modifier Letters" },
+ ["specials"] = { first = 0x0FFF0, last = 0x0FFFF, description = "Specials" },
+ ["sundanese"] = { first = 0x01B80, last = 0x01BBF, description = "Sundanese" },
+ ["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, description = "Syloti Nagri" },
+ ["syriac"] = { first = 0x00700, last = 0x0074F, description = "Syriac" },
+ ["tagalog"] = { first = 0x01700, last = 0x0171F, description = "Tagalog" },
+ ["tagbanwa"] = { first = 0x01760, last = 0x0177F, description = "Tagbanwa" },
+ ["tags"] = { first = 0xE0000, last = 0xE007F, description = "Tags" },
+ ["taile"] = { first = 0x01950, last = 0x0197F, description = "Tai Le" },
+ ["taixuanjingsymbols"] = { first = 0x1D300, last = 0x1D35F, description = "Tai Xuan Jing Symbols" },
+ ["tamil"] = { first = 0x00B80, last = 0x00BFF, description = "Tamil" },
+ ["telugu"] = { first = 0x00C00, last = 0x00C7F, description = "Telugu" },
+ ["thaana"] = { first = 0x00780, last = 0x007BF, description = "Thaana" },
+ ["thai"] = { first = 0x00E00, last = 0x00E7F, description = "Thai" },
+ ["tibetan"] = { first = 0x00F00, last = 0x00FFF, description = "Tibetan" },
+ ["tifinagh"] = { first = 0x02D30, last = 0x02D7F, description = "Tifinagh" },
+ ["ugaritic"] = { first = 0x10380, last = 0x1039F, description = "Ugaritic" },
+ ["unifiedcanadianaboriginalsyllabics"] = { first = 0x01400, last = 0x0167F, description = "Unified Canadian Aboriginal Syllabics" },
+ ["vai"] = { first = 0x0A500, last = 0x0A63F, description = "Vai" },
+ ["variationselectors"] = { first = 0x0FE00, last = 0x0FE0F, description = "Variation Selectors" },
+ ["variationselectorssupplement"] = { first = 0xE0100, last = 0xE01EF, description = "Variation Selectors Supplement" },
+ ["verticalforms"] = { first = 0x0FE10, last = 0x0FE1F, description = "Vertical Forms" },
+ ["yijinghexagramsymbols"] = { first = 0x04DC0, last = 0x04DFF, description = "Yijing Hexagram Symbols" },
+ ["yiradicals"] = { first = 0x0A490, last = 0x0A4CF, description = "Yi Radicals" },
+ ["yisyllables"] = { first = 0x0A000, last = 0x0A48F, description = "Yi Syllables" },
}
-function characters.getrange(name)
- local tag = lower(name)
- tag = gsub(name,"[^a-z]", "")
- local range = characters.blocks[tag]
+characters.blocks = blocks
+
+setmetatableindex(blocks, function(t,k)
+ return k and rawget(t,lower(gsub(k,"[^a-zA-Z]","")))
+end)
+
+function characters.getrange(name) -- used in font fallback definitions (name or range)
+ local range = blocks[name]
if range then
- return range[1], range[2], range[3]
+ return range.first, range.last, range.description
end
name = gsub(name,'"',"0x") -- goodie: tex hex notation
local start, stop = match(name,"^(.-)[%-%:](.-)$")
@@ -251,7 +328,7 @@ function characters.getrange(name)
return slot, slot, nil
end
-characters.categories = {
+local categorytags = allocate {
lu = "Letter Uppercase",
ll = "Letter Lowercase",
lt = "Letter Titlecase",
@@ -284,26 +361,58 @@ characters.categories = {
cn = "Other Not Assigned",
}
+characters.categorytags = categorytags
+
--~ special : cf (softhyphen) zs (emspace)
--~ characters: ll lm lo lt lu mn nl no pc pd pe pf pi po ps sc sk sm so
-characters.is_character = table.tohash {
+local is_character = allocate ( table.tohash {
"lu","ll","lt","lm","lo",
"nd","nl","no",
"mn",
"nl","no",
"pc","pd","ps","pe","pi","pf","po",
"sm","sc","sk","so"
-}
+} )
-characters.is_letter = table.tohash {
+local is_letter = allocate ( table.tohash {
"ll","lm","lo","lt","lu"
-}
+} )
-characters.is_command = table.tohash {
+local is_command = allocate ( table.tohash {
"cf","zs"
+} )
+
+local is_spacing = allocate ( table.tohash {
+ "zs", "zl","zp",
+} )
+
+local is_mark = allocate ( table.tohash {
+ "mn", "ms",
+} )
+
+characters.is_character = is_character
+characters.is_letter = is_letter
+characters.is_command = is_command
+characters.is_spacing = is_spacing
+characters.is_mark = is_mark
+
+local mt = { -- yes or no ?
+ __index = function(t,k)
+ if type(k) == "number" then
+ local c = characters.data[k].category
+ return c and rawget(t,c)
+ else
+ -- avoid auto conversion in data.characters lookups
+ end
+ end
}
+setmetatableindex(characters.is_character, mt)
+setmetatableindex(characters.is_letter, mt)
+setmetatableindex(characters.is_command, mt)
+setmetatableindex(characters.is_spacing, mt)
+
-- linebreak: todo: hash
--
-- normative : BK CR LF CM SG GL CB SP ZW NL WJ JL JV JT H2 H3
@@ -313,7 +422,7 @@ characters.is_command = table.tohash {
--
-- N A H W F Na
-characters.bidi = {
+characters.bidi = allocate {
l = "Left-to-Right",
lre = "Left-to-Right Embedding",
lro = "Left-to-Right Override",
@@ -335,14 +444,6 @@ characters.bidi = {
on = "Other Neutrals",
}
-local _empty_table_ = { __index = function(t,k) return "" end }
-
-function table.set_empty_metatable(t)
- setmetatable(t,_empty_table_)
-end
-
-table.set_empty_metatable(data)
-
--[[ldx--
<p>At this point we assume that the big data table is loaded. From this
table we derive a few more.</p>
@@ -350,6 +451,8 @@ table we derive a few more.</p>
if not characters.fallbacks then
+ -- we could the definition by using a metatable
+
characters.fallbacks = { }
characters.directions = { }
@@ -368,8 +471,8 @@ if not characters.fallbacks then
end
-storage.register("characters.fallbacks", characters.fallbacks, "characters.fallbacks")
-storage.register("characters.directions", characters.directions, "characters.directions")
+storage.register("characters/fallbacks", characters.fallbacks, "characters.fallbacks") -- accents and such
+storage.register("characters/directions", characters.directions, "characters.directions")
--[[ldx--
<p>The <type>context</type> namespace is used to store methods and data
@@ -383,108 +486,149 @@ use the table. After all, we have this information available anyway.</p>
function characters.makeactive(n,name) -- let ?
texsprint(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 tex.uprint(n)
- texsprint(ctxcatcodes,utfchar(n))
+function tex.uprint(c,n)
+ if n then
+ -- texsprint(c,charfromnumber(n))
+ texsprint(c,utfchar(n))
+ else
+ -- texsprint(charfromnumber(c))
+ texsprint(utfchar(c))
+ end
end
-local template_a = "\\startextendcatcodetable{%s}\\chardef\\l=11\\chardef\\a=13\\let\\c\\catcode%s\\let\\a\\undefined\\let\\l\\undefined\\let\\c\\undefined\\stopextendcatcodetable"
-local template_b = "\\chardef\\l=11\\chardef\\a=13\\let\\c\\catcode%s\\let\\a\\undefined\\let\\l\\undefined\\let\\c\\undefined"
+function characters.define(tobelettered, tobeactivated) -- catcodetables
+
+ if trace_defining then
+ report_defining("defining active character commands")
+ end
--- we need a function for setting the codes ....
+ local activated, a = { }, 0
-function characters.define(tobelettered, tobeactivated) -- catcodetables
- local is_character, is_command, is_letter = characters.is_character, characters.is_command, characters.is_letter
- local lettered, activated = { }, { }
- for u, chr in next, data do
- -- we can use a macro instead of direct settings
+ for u, chr in next, data do -- these will be commands
local fallback = chr.fallback
if fallback then
- -- texprint(format("{\\catcode %s=13\\unexpanded\\gdef %s{\\checkedchar{%s}{%s}}}",u,utfchar(u),u,fallback))
texsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\checkedchar{",u,"}{",fallback,"}}}") -- no texprint
- activated[#activated+1] = "\\c"..u.."\\a"
+ a = a + 1
+ activated[a] = u
else
local contextname = chr.contextname
- local category = chr.category
if contextname then
+ local category = chr.category
if is_character[category] then
- -- by this time, we're still in normal catcode mode
- -- subtle: not "\\",contextname but "\\"..contextname
if chr.unicodeslot < 128 then
- -- texprint(ctxcatcodes, "\\chardef\\"..contextname,"=",u)
- texprint(ctxcatcodes,format("\\chardef\\%s=%s",contextname,u))
- else
- -- texprint(ctxcatcodes, "\\let\\"..contextname,"=",utfchar(u))
- texprint(ctxcatcodes,format("\\let\\%s=%s",contextname,utfchar(u)))
if is_letter[category] then
- lettered[#lettered+1] = "\\c"..u.."\\l"
+ texprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,utfchar(u)))
+ else
+ texprint(ctxcatcodes,format("\\chardef\\%s=%s",contextname,u))
end
+ else
+ texprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,utfchar(u)))
end
elseif is_command[category] then
- -- this might change: contextcommand ipv contextname
- -- texprint(format("{\\catcode %s=13\\unexpanded\\gdef %s{\\%s}}",u,utfchar(u),contextname))
texsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\"..contextname,"}}") -- no texprint
- activated[#activated+1] = "\\c"..u.."\\a"
- end
- elseif is_letter[category] then
- if u >= 128 and u <= 65536 then -- catch private mess
- lettered[#lettered+1] = "\\c"..u.."\\l"
+ a = a + 1
+ activated[a] = u
end
end
end
- if chr.range then
- lettered[#lettered+1] = format('\\dofastrecurse{"%05X}{"%05X}{1}{\\c\\fastrecursecounter\\l}',u,chr.range)
- end
end
- -- if false then
- lettered[#lettered+1] = "\\c"..0x200C.."\\l" -- non-joiner
- lettered[#lettered+1] = "\\c"..0x200D.."\\l" -- joiner
- -- fi
- if tobelettered then
- lettered = concat(lettered)
- if true then
- texsprint(ctxcatcodes,format(template_b,lettered))
- else
- for l=1,#tobelettered do
- texsprint(ctxcatcodes,format(template_a,tobelettered[l],lettered))
+
+ 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
+ texsetcatcode(i,11)
+ end
+ end
end
+ texsetcatcode(0x200C,11) -- non-joiner
+ texsetcatcode(0x200D,11) -- joiner
end
+ tex.catcodetable = saved
end
- if tobeactivated then
- activated = concat(activated)
- for a=1,#tobeactivated do
- texsprint(ctxcatcodes,format(template_a,tobeactivated[a],activated))
+
+ local nofactivated = #tobeactivated
+ if tobeactivated and nofactivated > 0 then
+ for i=1,nofactivated do
+ local u = activated[i]
+ report_defining("character 0x%05X is active in sets %s (%s)",u,concat(tobeactivated,","),data[u].description)
+ end
+ local saved = tex.catcodetable
+ for i=1,#tobeactivated do
+ local vector = tobeactivated[i]
+ if trace_defining then
+ report_defining("defining %s active characters in vector %s",nofactivated,vector)
+ end
+ tex.catcodetable = vector
+ for i=1,nofactivated do
+ texsetcatcode(activated[i],13)
+ end
end
+ tex.catcodetable = saved
end
-end
-function characters.charcode(box)
- local b = tex.box[box]
- local l = b.list
- texsprint((l and l.id == node.id('glyph') and l.char) or 0)
end
--[[ldx--
<p>Setting the lccodes is also done in a loop over the data table.</p>
--ldx]]--
+--~ function tex.setsfcode (index,sf) ... end
+--~ function tex.setlccode (index,lc,[uc]) ... end -- optional third value, safes call
+--~ function tex.setuccode (index,uc,[lc]) ... end
+--~ function tex.setcatcode(index,cc) ... end
+
-- we need a function ...
+--~ tex.lccode
+--~ tex.uccode
+--~ tex.sfcode
+--~ tex.catcode
+
function characters.setcodes()
+ if trace_defining then
+ report_defining("defining lc and uc codes")
+ end
for code, chr in next, data do
local cc = chr.category
- if cc == 'll' or cc == 'lu' or cc == 'lt' then
- local lc, uc = chr.lccode, chr.uccode
- if not lc then chr.lccode, lc = code, code end
- if not uc then chr.uccode, uc = code, code end
- texsprint(ctxcatcodes,format("\\setcclcuc{%i}{%i}{%i}",code,lc,uc))
- end
- if cc == "lu" then
- texprint(ctxcatcodes,"\\sfcode ",code,"999 ")
- end
- if cc == "lo" and chr.range then
- texsprint(ctxcatcodes,format('\\dofastrecurse{"%05X}{"%05X}{1}{\\setcclcucself\\fastrecursecounter}',code,chr.range))
+ 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 end
+ if not uc then chr.uccode, uc = code, code end
+ texsetcatcode(code,11) -- letter
+ if type(lc) == "table" then
+ lc = code
+ end
+ if type(uc) == "table" then
+ uc = code
+ end
+ texsetlccode(code,lc,uc)
+ if cc == "lu" then
+ texsetsfcode(code,999)
+ end
+ end
+ elseif is_mark[cc] then
+ texsetlccode(code,code,code) -- for hyphenation
end
end
end
@@ -495,88 +639,236 @@ of the official <l n='api'/>.</p>
--ldx]]--
--[[ldx--
-<p>This converts a string (if given) into a number.</p>
+<p>A couple of convenience methods. Beware, these are slower than directly
+accessing the data table.</p>
--ldx]]--
-function characters.number(n)
- if type(n) == "string" then return tonumber(n,16) else return n end
-end
+-- we could make them virtual: characters.contextnames[n]
---[[ldx--
-<p>Checking for valid characters.</p>
---ldx]]--
+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.is_valid(s)
- return s or ""
+function characters.category(n,verbose)
+ local c = data[n].category
+ if not c then
+ return ""
+ elseif verbose then
+ return categorytags[c]
+ else
+ return c
+ end
end
-function characters.checked(s, default)
- return s or default
+-- xml support (moved)
+
+function characters.remapentity(chr,slot)
+ texsprint(format("{\\catcode%s=13\\xdef%s{\\string%s}}",slot,utfchar(slot),chr))
end
-characters.valid = characters.is_valid
+characters.activeoffset = 0x10000 -- there will be remapped in that byte range
---[[ldx--
-<p></p>
---ldx]]--
--- set a table entry; index is number (can be different from unicodeslot)
+-- 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
+
+-- some day we will make a table
-function characters.set(n, c)
- data[characters.number(n)] = c
+local function utfstring(s)
+ if type(s) == "table" then
+ return utfchar(unpack(s)) -- concat { utfchar( unpack(s) ) }
+ else
+ return utfchar(s)
+ end
end
---[[ldx--
-<p>Get a table entry happens by number. Keep in mind that the unicodeslot
-can be different (not likely).</p>
---ldx]]--
+utf.string = utf.string or utfstring
-function characters.get(n)
- return data[characters.number(n)]
-end
+local categories = allocate() characters.categories = categories -- lazy table
---[[ldx--
-<p>A couple of convenience methods. Beware, these are not that fast due
-to the checking.</p>
---ldx]]--
+setmetatableindex(categories, function(t,u) if u then local c = data[u] c = c and c.category or u t[u] = c return c end end)
-function characters.hexindex(n)
- return format("%04X", characters.valid(data[characters.number(n)].unicodeslot))
-end
+local lccodes = allocate() characters.lccodes = lccodes -- lazy table
+local uccodes = allocate() characters.uccodes = uccodes -- lazy table
+local shcodes = allocate() characters.shcodes = shcodes -- lazy table
+local fscodes = allocate() characters.fscodes = fscodes -- lazy table
+
+setmetatableindex(lccodes, function(t,u) if u then local c = data[u] c = c and c.lccode or (type(u) == "string" and utfbyte(u)) or u t[u] = c return c end end)
+setmetatableindex(uccodes, function(t,u) if u then local c = data[u] c = c and c.uccode or (type(u) == "string" and utfbyte(u)) or u t[u] = c return c end end)
+setmetatableindex(shcodes, function(t,u) if u then local c = data[u] c = c and c.shcode or (type(u) == "string" and utfbyte(u)) or u t[u] = c return c end end)
+setmetatableindex(fscodes, function(t,u) if u then local c = data[u] c = c and c.fscode or (type(u) == "string" and utfbyte(u)) or u t[u] = c return c end end)
+
+local lcchars = allocate() characters.lcchars = lcchars -- lazy table
+local ucchars = allocate() characters.ucchars = ucchars -- lazy table
+local shchars = allocate() characters.shchars = shchars -- lazy table
+local fschars = allocate() characters.fschars = fschars -- lazy table
+
+setmetatableindex(lcchars, function(t,u) if u then local c = data[u] c = c and c.lccode c = c and utfstring(c) or (type(u) == "number" and utfchar(u)) or u t[u] = c return c end end)
+setmetatableindex(ucchars, function(t,u) if u then local c = data[u] c = c and c.uccode c = c and utfstring(c) or (type(u) == "number" and utfchar(u)) or u t[u] = c return c end end)
+setmetatableindex(shchars, function(t,u) if u then local c = data[u] c = c and c.shcode c = c and utfstring(c) or (type(u) == "number" and utfchar(u)) or u t[u] = c return c end end)
+setmetatableindex(fschars, function(t,u) if u then local c = data[u] c = c and c.fscode c = c and utfstring(c) or (type(u) == "number" and utfchar(u)) or u t[u] = c return c end end)
-function characters.contextname(n)
- return characters.valid(data[characters.number(n)].contextname)
+local decomposed = allocate() characters.decomposed = decomposed -- lazy table
+
+setmetatableindex(decomposed, function(t,u) -- either a table or false
+ if u then
+ local c = data[u]
+ local s = c and c.decomposed or false
+ t[u] = s
+ return s
+ end
+end)
+
+local specialchars = allocate() characters.specialchars = specialchars -- lazy table
+local descriptions = allocate() characters.descriptions = descriptions -- lazy table
+
+setmetatableindex(specialchars, function(t,u)
+ if u then
+ local c = data[u]
+ local s = c and c.specials
+ if s then
+ local tt, ttn = { }, 0
+ for i=2,#s do
+ local si = s[i]
+ local c = data[si]
+ if is_letter[c.category] then
+ ttn = ttn + 1
+ tt[ttn] = utfchar(si)
+ end
+ end
+ c = concat(tt)
+ t[u] = c
+ return c
+ else
+ if type(u) == "number" then
+ u = utfchar(u)
+ end
+ t[u] = u
+ return u
+ end
+ end
+end)
+
+setmetatableindex(descriptions, function(t,k)
+ -- 0.05 - 0.10 sec
+ for u, c in next, data do
+ local d = c.description
+ if d then
+ d = gsub(d," ","")
+ d = lower(d)
+ t[d] = u
+ end
+ end
+ local d = rawget(t,k)
+ if not d then
+ t[k] = k
+ end
+ return d
+end)
+
+function characters.unicodechar(asked)
+ local n = tonumber(asked)
+ if n then
+ return n
+ elseif type(asked) == "string" then
+ asked = gsub(asked," ","")
+ return descriptions[asked]
+ end
end
-function characters.adobename(n)
- return characters.valid(data[characters.number(n)].adobename)
+function characters.lower(str)
+ local new, n = { }, 0
+ for u in utfvalues(str) do
+ n = n + 1
+ new[n] = lcchars[u]
+ end
+ return concat(new)
end
-function characters.description(n)
- return characters.valid(data[characters.number(n)].description)
+function characters.upper(str)
+ local new, n = { }, 0
+ for u in utfvalues(str) do
+ n = n + 1
+ new[n] = ucchars[u]
+ end
+ return concat(new)
end
-function characters.category(n)
- return characters.valid(data[characters.number(n)].category)
+function characters.shaped(str)
+ local new, n = { }, 0
+ for u in utfvalues(str) do
+ n = n + 1
+ new[n] = shchars[u]
+ end
+ return concat(new)
end
+function characters.lettered(str,spacing)
+ local new, n = { }, 0
+ if spacing then
+ local done = false
+ for u in utfvalues(str) do
+ local c = data[u].category
+ if is_letter[c] then
+ if done and n > 1 then
+ n = n + 1
+ new[n] = " "
+ done = false
+ end
+ n = n + 1
+ new[n] = utfchar(u)
+ elseif spacing and is_spacing[c] then
+ done = true
+ end
+ end
+ else
+ for u in utfvalues(str) do
+ if is_letter[data[u].category] then
+ n = n + 1
+ new[n] = utfchar(u)
+ end
+ end
+ end
+ return concat(new)
+end
--[[ldx--
<p>Requesting lower and uppercase codes:</p>
--ldx]]--
-function characters.uccode(n) return data[n].uccode or n end
-function characters.lccode(n) return data[n].lccode or n end
+function characters.uccode(n) return uccodes[n] end -- obsolete
+function characters.lccode(n) return lccodes[n] end -- obsolete
-function characters.flush(n)
+function characters.flush(n,direct)
local c = data[n]
if c and c.contextname then
- texsprint(texcatcodes, "\\"..c.contextname)
+ c = "\\" .. c.contextname
else
- texsprint(utfchar(n))
+ c = utfchar(n)
+ end
+ if direct then
+ return c
+ else
+ texsprint(c)
end
end
function characters.shape(n)
- local shcode = data[n].shcode
+ local shcode = shcodes[n]
if not shcode then
return n, nil
elseif type(shcode) == "table" then
@@ -586,72 +878,6 @@ function characters.shape(n)
end
end
---[[ldx--
-<p>Categories play an important role, so here are some checkers.</p>
---ldx]]--
-
-function characters.is_of_category(token,category)
- if type(token) == "string" then
- return data[utfbyte(token)].category == category
- else
- return data[token].category == category
- end
-end
-
-function characters.i_is_of_category(i,category) -- by index (number)
- local cd = data[i]
- return cd and cd.category == category
-end
-
-function characters.n_is_of_category(n,category) -- by name (string)
- local cd = data[utfbyte(n)]
- return cd and cd.category == category
-end
-
--- xml support (moved)
-
-function characters.remapentity(chr,slot)
- texsprint(format("{\\catcode%s=13\\xdef%s{\\string%s}}",slot,utfchar(slot),chr))
-end
-
-characters.active_offset = 0x10000 -- there will be remapped in that byte range
-
--- 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.active_offset + utfbyte("<"))
--- entities.amp = utfchar(characters.active_offset + utfbyte("&"))
--- entities.gt = utfchar(characters.active_offset + utfbyte(">"))
--- end
-
--- some day we will make a table
-
-function characters.lower(str)
- local new = { }
- for u in utfvalues(str) do
- new[#new+1] = utfchar(data[u].lccode or u)
- end
- return concat(new)
-end
-
-function characters.upper(str)
- local new = { }
- for u in utfvalues(str) do
- new[#new+1] = utfchar(data[u].uccode or u)
- end
- return concat(new)
-end
-
-- -- some day we might go this route, but it does not really save that much
-- -- so not now (we can generate a lot using mtx-unicode that operates on the
-- -- database)
@@ -696,3 +922,67 @@ end
-- end
--~ characters.data, characters.groups = chardata, groupdata
+
+--~ [0xF0000]={
+--~ category="co",
+--~ cjkwd="a",
+--~ description="<Plane 0x000F Private Use, First>",
+--~ direction="l",
+--~ unicodeslot=0xF0000,
+--~ },
+--~ [0xFFFFD]={
+--~ category="co",
+--~ cjkwd="a",
+--~ description="<Plane 0x000F Private Use, Last>",
+--~ direction="l",
+--~ unicodeslot=0xFFFFD,
+--~ },
+--~ [0x100000]={
+--~ category="co",
+--~ cjkwd="a",
+--~ description="<Plane 0x0010 Private Use, First>",
+--~ direction="l",
+--~ unicodeslot=0x100000,
+--~ },
+--~ [0x10FFFD]={
+--~ category="co",
+--~ cjkwd="a",
+--~ description="<Plane 0x0010 Private Use, Last>",
+--~ direction="l",
+--~ unicodeslot=0x10FFFD,
+--~ },
+
+if not characters.superscripts then
+
+ local superscripts = allocate() characters.superscripts = superscripts
+ local subscripts = allocate() characters.subscripts = subscripts
+
+ -- skipping U+02120 (service mark) U+02122 (trademark)
+
+ for k, v in next, data do
+ local specials = v.specials
+ if specials then
+ local what = specials[1]
+ if what == "super" then
+ if #specials == 2 then
+ superscripts[k] = specials[2]
+ else
+ report_defining("ignoring superscript %s %s: %s",ustring(k),utfchar(k),v.description)
+ end
+ elseif what == "sub" then
+ if #specials == 2 then
+ subscripts[k] = specials[2]
+ else
+ report_defining("ignoring subscript %s %s: %s",ustring(k),utfchar(k),v.description)
+ end
+ end
+ end
+ end
+
+ -- print(table.serialize(superscripts, "superscripts", { hexify = true }))
+ -- print(table.serialize(subscripts, "subscripts", { hexify = true }))
+
+ storage.register("characters/superscripts", superscripts, "characters.superscripts")
+ storage.register("characters/subscripts", subscripts, "characters.subscripts")
+
+end
diff --git a/Master/texmf-dist/tex/context/base/char-ini.mkiv b/Master/texmf-dist/tex/context/base/char-ini.mkiv
index 0d5e16bb04b..68bc3b49702 100644
--- a/Master/texmf-dist/tex/context/base/char-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/char-ini.mkiv
@@ -15,12 +15,26 @@
\registerctxluafile{char-def}{1.001} % let's load this one first
\registerctxluafile{char-ini}{1.001}
-\registerctxluafile{char-cmp}{1.001} % maybe we will load this someplace else
+\registerctxluafile{char-cjk}{1.001}
\registerctxluafile{char-map}{1.001} % maybe we will load this someplace else
\registerctxluafile{char-tex}{1.001}
\unprotect
+% ¨äëïöüÿ
+% ´áćéíĺńóŕśúýź
+% ˙ċėġiż
+% ¯āēīōū
+% ˝őű
+% ˆâĉêĝĥîĵôŝûŵŷ
+% `àèìòùỳ
+% ¸çķļņŗşţ
+% ˛ąęįų
+% ˚åů
+% ˘ăĕğĭŏŭ
+% ˇčďěľňřšťž
+% ˜ãĩñõũ
+
% \def\checkedchar#1% #2%
% {\relax\iffontchar\font#1 \expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi{\char#1}}
%
@@ -31,21 +45,25 @@
\def\checkedmathchar#1#2{#2}
\def\checkedtextchar #1{\iffontchar\font#1 \expandafter\firstoftwoarguments\else\expandafter\secondoftwoarguments\fi{\char#1}}
+\unexpanded\def\textormathchar#1%
+ {\relax\ifmmode
+ \char#1\relax
+ \else\iffontchar\font#1\relax
+ \char#1\relax
+ \else
+ $\char#1$%
+ \fi\fi}
+
%D The codes are stored in the format, so we don't need to reinitialize
%D them (unless of course we have adapted the table). It is on the agenda
%D to do this with \type {tex.lccode} cum suis once they're available.
-\def\setcclcuc#1#2#3{\global\catcode#1=\@@letter\global\lccode#1=#2\global\uccode#1=#3\relax}
-\def\setcclcucself#1{\global\catcode#1=\@@letter\global\lccode#1=#1\global\uccode#1=#1\relax }
+% \def\setcclcuc#1#2#3{\global\catcode#1=\lettercatcode\global\lccode#1=#2\global\uccode#1=#3\relax}
+% \def\setcclcucself#1{\global\catcode#1=\lettercatcode\global\lccode#1=#1\global\uccode#1=#1\relax }
\ctxlua{characters.setcodes()}
-%D There may be a problem with the turkisch patterns. By now it's taken care of in
-%D ctxtools (thanks to Mojca). There seems to be a bug in the patterns (^^11 refers
-%D to a double quote but it should be ^^19 since the original is in ec encoding).
-
-% \setcclcuc "201C "201C "201C
-% \setcclcuc "201D "201D "201D
+% Is setting up vrb tpa and tpb needed?
\ctxlua {
characters.define(
@@ -53,24 +71,26 @@
\number\texcatcodes,
\number\ctxcatcodes,
\number\notcatcodes,
- \number\mthcatcodes,
+ %number\mthcatcodes,
\number\vrbcatcodes,
\number\prtcatcodes,
- \number\xmlcatcodesn,
- \number\xmlcatcodese,
- \number\xmlcatcodesr,
- \number\typcatcodesa,
- \number\typcatcodesb,
+% \number\xmlcatcodesn,
+% \number\xmlcatcodese,
+% \number\xmlcatcodesr,
+ \number\tpacatcodes,
+ \number\tpbcatcodes,
+ \number\txtcatcodes,
},
{ % activate catcodes
\number\ctxcatcodes,
\number\notcatcodes,
- \number\xmlcatcodesn,
- \number\xmlcatcodese,
- \number\xmlcatcodesr,
+ \number\prtcatcodes, % new
+% \number\xmlcatcodesn,
+% \number\xmlcatcodese,
+% \number\xmlcatcodesr,
}
)
- catcodes.register("xmlcatcodes",\number\xmlcatcodes)
+% catcodes.register("xmlcatcodes",\number\xmlcatcodes)
}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/char-map.lua b/Master/texmf-dist/tex/context/base/char-map.lua
index 3f8cc3b3d3c..376ebf343b9 100644
--- a/Master/texmf-dist/tex/context/base/char-map.lua
+++ b/Master/texmf-dist/tex/context/base/char-map.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['char-map'] = {
license = "see context related readme files"
}
+-- not yet used
+
characters = characters or { }
characters.casemap={
diff --git a/Master/texmf-dist/tex/context/base/char-tex.lua b/Master/texmf-dist/tex/context/base/char-tex.lua
index ed9a244d781..e6d6c41e0fa 100644
--- a/Master/texmf-dist/tex/context/base/char-tex.lua
+++ b/Master/texmf-dist/tex/context/base/char-tex.lua
@@ -6,12 +6,131 @@ if not modules then modules = { } end modules ['char-tex'] = {
license = "see context related readme files"
}
-characters = characters or { }
-characters.tex = characters.tex or { }
+local lpeg = lpeg
local find = string.find
+local P, C, R, S, Cs, Cc = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cs, lpeg.Cc
+local U, lpegmatch = lpeg.patterns.utf8, lpeg.match
+
+local allocate, mark = utilities.storage.allocate, utilities.storage.mark
+
+characters = characters or { }
+local characters = characters
+characters.tex = characters.tex or { }
+
+local accentmapping = allocate {
+ ['"'] = { [""] = "¨",
+ A = "Ä", a = "ä",
+ E = "Ë", e = "ë",
+ I = "Ï", i = "ï", ["ı"] = "ï",
+ O = "Ö", o = "ö",
+ U = "Ü", u = "ü",
+ Y = "Ÿ", y = "ÿ",
+ },
+ ["'"] = { [""] = "´",
+ A = "Á", a = "á",
+ C = "Ć", c = "ć",
+ E = "É", e = "é",
+ I = "Í", i = "í", ["ı"] = "í",
+ L = "Ĺ", l = "ĺ",
+ N = "Ń", n = "ń",
+ O = "Ó", o = "ó",
+ R = "Ŕ", r = "ŕ",
+ S = "Ś", s = "ś",
+ U = "Ú", u = "ú",
+ Y = "Ý", y = "ý",
+ Z = "Ź", z = "ź",
+ },
+ ["."] = { [""] = "˙",
+ C = "Ċ", c = "ċ",
+ E = "Ė", e = "ė",
+ G = "Ġ", g = "ġ",
+ I = "İ", i = "i", ["ı"] = "i",
+ Z = "Ż", z = "ż",
+ },
+ ["="] = { [""] = "¯",
+ A = "Ā", a = "ā",
+ E = "Ē", e = "ē",
+ I = "Ī", i = "ī", ["ı"] = "ī",
+ O = "Ō", o = "ō",
+ U = "Ū", u = "ū",
+ },
+ ["H"] = { [""] = "˝",
+ O = "Ő", o = "ő",
+ U = "Ű", u = "ű",
+ },
+ ["^"] = { [""] = "ˆ",
+ A = "Â", a = "â",
+ C = "Ĉ", c = "ĉ",
+ E = "Ê", e = "ê",
+ G = "Ĝ", g = "ĝ",
+ H = "Ĥ", h = "ĥ",
+ I = "Î", i = "î", ["ı"] = "î",
+ J = "Ĵ", j = "ĵ",
+ O = "Ô", o = "ô",
+ S = "Ŝ", s = "ŝ",
+ U = "Û", u = "û",
+ W = "Ŵ", w = "ŵ",
+ Y = "Ŷ", y = "ŷ",
+ },
+ ["`"] = { [""] = "`",
+ A = "À", a = "à",
+ E = "È", e = "è",
+ I = "Ì", i = "ì", ["ı"] = "ì",
+ O = "Ò", o = "ò",
+ U = "Ù", u = "ù",
+ Y = "Ỳ", y = "ỳ",
+ },
+ ["c"] = { [""] = "¸",
+ C = "Ç", c = "ç",
+ K = "Ķ", k = "ķ",
+ L = "Ļ", l = "ļ",
+ N = "Ņ", n = "ņ",
+ R = "Ŗ", r = "ŗ",
+ S = "Ş", s = "ş",
+ T = "Ţ", t = "ţ",
+ },
+ ["k"] = { [""] = "˛",
+ A = "Ą", a = "ą",
+ E = "Ę", e = "ę",
+ I = "Į", i = "į",
+ U = "Ų", u = "ų",
+ },
+ ["r"] = { [""] = "˚",
+ A = "Å", a = "å",
+ U = "Ů", u = "ů",
+ },
+ ["u"] = { [""] = "˘",
+ A = "Ă", a = "ă",
+ E = "Ĕ", e = "ĕ",
+ G = "Ğ", g = "ğ",
+ I = "Ĭ", i = "ĭ", ["ı"] = "ĭ",
+ O = "Ŏ", o = "ŏ",
+ U = "Ŭ", u = "ŭ",
+ },
+ ["v"] = { [""] = "ˇ",
+ C = "Č", c = "č",
+ D = "Ď", d = "ď",
+ E = "Ě", e = "ě",
+ L = "Ľ", l = "ľ",
+ N = "Ň", n = "ň",
+ R = "Ř", r = "ř",
+ S = "Š", s = "š",
+ T = "Ť", t = "ť",
+ Z = "Ž", z = "ž",
+ },
+ ["~"] = { [""] = "˜",
+ A = "Ã", a = "ã",
+ I = "Ĩ", i = "ĩ", ["ı"] = "ĩ",
+ N = "Ñ", n = "ñ",
+ O = "Õ", o = "õ",
+ U = "Ũ", u = "ũ",
+ },
+}
+
+characters.tex.accentmapping = accentmapping
-local accent_map = {
+local accent_map = allocate { -- incomplete
['~'] = "̃" , -- ̃ Ẽ
['"'] = "̈" , -- ̈ Ë
["`"] = "̀" , -- ̀ È
@@ -44,7 +163,7 @@ local function remap_accents(a,c,braced)
end
end
-local command_map = {
+local command_map = allocate {
["i"] = "ı"
}
@@ -57,9 +176,6 @@ local function remap_commands(c)
end
end
-local P, C, R, S, Cs, Cc = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cs, lpeg.Cc
-local U, lpegmatch = lpeg.patterns.utf8, lpeg.match
-
local accents = (P('\\') * C(S(accents)) * (P("{") * C(U) * P("}" * Cc(true)) + C(U) * Cc(false))) / remap_accents
local commands = (P('\\') * C(R("az","AZ")^1)) / remap_commands
@@ -73,13 +189,11 @@ local convert_accents_strip = Cs((no_l * accents * no_r + accents + P(1))^0)
local convert_commands_strip = Cs((no_l * commands * no_r + commands + P(1))^0)
function characters.tex.toutf(str,strip)
- if find(str,"\\") then -- we can start at teh found position
+ if find(str,"\\") then -- we can start at the found position
if strip then
- str = lpegmatch(convert_commands_strip,str)
- str = lpegmatch(convert_accents_strip,str)
+ return lpegmatch(convert_accents_strip,lpegmatch(convert_commands_strip,str))
else
- str = lpegmatch(convert_commands,str)
- str = lpegmatch(convert_accents,str)
+ return lpegmatch(convert_accents, lpegmatch(convert_commands, str))
end
end
return str
@@ -87,3 +201,12 @@ end
--~ print(characters.tex.toutf([[\"{e}]]),true)
--~ print(characters.tex.toutf([[{\"{e}}]],true))
+
+function characters.tex.defineaccents()
+ for accent, group in next, accentmapping do
+ context.dodefineaccentcommand(accent)
+ for character, mapping in next, group do
+ context.dodefineaccent(accent,character,mapping)
+ end
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/char-utf.lua b/Master/texmf-dist/tex/context/base/char-utf.lua
index 6dd85fdc87d..30124a6a2a6 100644
--- a/Master/texmf-dist/tex/context/base/char-utf.lua
+++ b/Master/texmf-dist/tex/context/base/char-utf.lua
@@ -19,57 +19,118 @@ in special kinds of output (for instance <l n='pdf'/>).</p>
over a string.</p>
--ldx]]--
-local utf = unicode.utf8
-local concat, gmatch = table.concat, string.gmatch
+local utfchar, utfbyte, utfgsub = utf.char, utf.byte, utf.gsub
+local concat, gmatch, gsub, find = table.concat, string.gmatch, string.gsub, string.find
local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
+local allocate = utilities.storage.allocate
-local ctxcatcodes = tex.ctxcatcodes
+local charfromnumber = characters.fromnumber
-characters = characters or { }
-characters.graphemes = characters.graphemes or { }
-characters.filters = characters.filters or { }
-characters.filters.utf = characters.filters.utf or { }
+-- todo: trackers
-characters.filters.utf.initialized = false
-characters.filters.utf.collapsing = true
-characters.filters.utf.expanding = true
+characters = characters or { }
+local characters = characters
-local graphemes = characters.graphemes
-local utffilters = characters.filters.utf
-local utfchar, utfbyte, utfgsub = utf.char, utf.byte, utf.gsub
+characters.graphemes = allocate()
+local graphemes = characters.graphemes
+
+characters.decomposed = allocate()
+local decomposed = characters.decomposed
+
+characters.mathpairs = allocate()
+local mathpairs = characters.mathpairs
+
+characters.filters = allocate()
+local filters = characters.filters
+
+filters.utf = filters.utf or { }
+local utffilters = characters.filters.utf
--[[ldx--
<p>It only makes sense to collapse at runtime, since we don't expect
source code to depend on collapsing.</p>
--ldx]]--
-function utffilters.initialize()
- if utffilters.collapsing and not utffilters.initialized then
- for k,v in next, characters.data do
- -- using vs and first testing for length is faster (.02->.01 s)
- local vs = v.specials
- if vs and #vs == 3 and vs[1] == 'char' then
- local first, second = utfchar(vs[2]), utfchar(vs[3])
- local cgf = graphemes[first]
- if not cgf then
- cgf = { }
- graphemes[first] = cgf
+-- for the moment, will be entries in char-def.lua
+
+local decomposed = allocate {
+ ["IJ"] = "IJ",
+ ["ij"] = "ij",
+ ["և"] = "եւ",
+ ["ff"] = "ff",
+ ["fi"] = "fi",
+ ["fl"] = "fl",
+ ["ffi"] = "ffi",
+ ["ffl"] = "ffl",
+ ["ſt"] = "ſt",
+ ["st"] = "st",
+ ["ﬓ"] = "մն",
+ ["ﬔ"] = "մե",
+ ["ﬕ"] = "մի",
+ ["ﬖ"] = "վն",
+ ["ﬗ"] = "մխ",
+}
+characters.decomposed = decomposed
+
+local function initialize()
+ for unicode, v in next, characters.data do
+ -- using vs and first testing for length is faster (.02->.01 s)
+ local vs = v.specials
+ if vs and #vs == 3 and vs[1] == 'char' then
+ local one, two = vs[2], vs[3]
+ local first, second, combined = utfchar(one), utfchar(two), utfchar(unicode)
+ local cgf = graphemes[first]
+ if not cgf then
+ cgf = { }
+ graphemes[first] = cgf
+ end
+ cgf[second] = combined
+ if v.mathclass or v.mathspec then
+ local mps = mathpairs[two]
+ if not mps then
+ mps = { }
+ mathpairs[two] = mps
+ end
+ mps[one] = unicode -- here unicode
+ local mps = mathpairs[second]
+ if not mps then
+ mps = { }
+ mathpairs[second] = mps
end
- cgf[second] = utfchar(k)
+ mps[first] = combined
end
+ -- 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
- utffilters.initialized = true
end
+ initialize = false
end
--- utffilters.add_grapheme(utfchar(318),'l','\string~')
--- utffilters.add_grapheme('c','a','b')
+-- utffilters.addgrapheme(utfchar(318),'l','\string~')
+-- utffilters.addgrapheme('c','a','b')
-function utffilters.add_grapheme(result,first,second)
- local r, f, s = tonumber(result), tonumber(first), tonumber(second)
- if r then result = utfchar(r) end
- if f then first = utfchar(f) end
- if s then second = utfchar(s) end
+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
@@ -77,31 +138,6 @@ function utffilters.add_grapheme(result,first,second)
end
end
-function utffilters.collapse(str) -- old one
- if utffilters.collapsing and str and #str > 1 then
- if not utffilters.initialized then -- saves a call
- utffilters.initialize()
- end
- local tokens, first, done = { }, false, false
- for second in utfcharacters(str) do
- local cgf = graphemes[first]
- if cgf and cgf[second] then
- first, done = cgf[second], true
- elseif first then
- tokens[#tokens+1] = first
- first = second
- else
- first = second
- end
- end
- if done then
- tokens[#tokens+1] = first
- return concat(tokens)
- end
- end
- return str
-end
-
--[[ldx--
<p>In order to deal with 8-bit output, we need to find a way to
go from <l n='utf'/> to 8-bit. This is handled in the
@@ -120,18 +156,20 @@ to their right glyph there.</p>
0x100000.</p>
--ldx]]--
-utffilters.private = {
- high = { },
- low = { },
- escapes = { },
+local low = allocate({ })
+local high = allocate({ })
+local escapes = allocate({ })
+local special = "~#$%^&_{}\\|"
+
+local private = {
+ low = low,
+ high = high,
+ escapes = escapes,
}
-local low = utffilters.private.low
-local high = utffilters.private.high
-local escapes = utffilters.private.escapes
-local special = "~#$%^&_{}\\|"
+utffilters.private = private
-function utffilters.private.set(ch)
+local function set(ch)
local cb
if type(ch) == "number" then
cb, ch = ch, utfchar(ch)
@@ -145,11 +183,11 @@ function utffilters.private.set(ch)
end
end
-function utffilters.private.replace(str) return utfgsub(str,"(.)", low ) end
-function utffilters.private.revert(str) return utfgsub(str,"(.)", high ) end
-function utffilters.private.escape(str) return utfgsub(str,"(.)", escapes) end
+private.set = set
-local set = utffilters.private.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
for ch in gmatch(special,".") do set(ch) end
@@ -162,12 +200,7 @@ first snippet uses the relocated dollars.</p>
<typing>
[󰀤x󰀤] [$x$]
</typing>
---ldx]]--
-local cr = utffilters.private.high -- kan via een lpeg
-local cf = utffilters
-
---[[ldx--
<p>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 graphmes and
not collecting tokens is not only faster but also saves garbage collecting.
@@ -175,20 +208,129 @@ not collecting tokens is not only faster but also saves garbage collecting.
--ldx]]--
-- lpeg variant is not faster
+--
+-- I might use the combined loop at some point for the filter
+-- some day.
+
+--~ function utffilters.collapse(str) -- not really tested (we could preallocate a table)
+--~ 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
+--~ local dec = decomposed[second]
+--~ if dec then
+--~ if not done then
+--~ if n > 0 then
+--~ for s in utfcharacters(str) do
+--~ if n == 1 then
+--~ break
+--~ else
+--~ t = t + 1
+--~ tokens[t] = s
+--~ n = n - 1
+--~ end
+--~ end
+--~ end
+--~ done = true
+--~ elseif first then
+--~ t = t + 1
+--~ tokens[t] = first
+--~ end
+--~ t = t + 1
+--~ tokens[t] = dec
+--~ first = false
+--~ elseif done then
+--~ local crs = high[second]
+--~ if crs then
+--~ if first then
+--~ t = t + 1
+--~ tokens[t] = first
+--~ end
+--~ first = crs
+--~ else
+--~ local cgf = graphemes[first]
+--~ if cgf and cgf[second] then
+--~ first = cgf[second]
+--~ elseif first then
+--~ t = t + 1
+--~ tokens[t] = first
+--~ first = second
+--~ else
+--~ first = second
+--~ end
+--~ end
+--~ 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
+--~ end
+--~ return str
+--~ end
function utffilters.collapse(str) -- not really tested (we could preallocate a table)
- if cf.collapsing and str then
- if #str > 1 then
- if not cf.initialized then -- saves a call
- cf.initialize()
+ if str and str ~= "" then
+ local nstr = #str
+ if nstr > 1 then
+ if initialize then -- saves a call
+ initialize()
end
- local tokens, first, done, n = { }, false, false, 0
+ local tokens, t, first, done, n = { }, 0, false, false, 0
for second in utfcharacters(str) do
if done then
- local crs = cr[second]
+ local crs = high[second]
if crs then
if first then
- tokens[#tokens+1] = first
+ t = t + 1
+ tokens[t] = first
end
first = crs
else
@@ -196,26 +338,31 @@ function utffilters.collapse(str) -- not really tested (we could preallocate a t
if cgf and cgf[second] then
first = cgf[second]
elseif first then
- tokens[#tokens+1] = first
+ t = t + 1
+ tokens[t] = first
first = second
else
first = second
end
end
else
- local crs = cr[second]
+ local crs = high[second]
if crs then
for s in utfcharacters(str) do
if n == 1 then
break
else
- tokens[#tokens+1], n = s, n - 1
+ t = t + 1
+ tokens[t] = s
+ n = n - 1
end
end
if first then
- tokens[#tokens+1] = first
+ t = t + 1
+ tokens[t] = first
end
- first, done = crs, true
+ first = crs
+ done = true
else
local cgf = graphemes[first]
if cgf and cgf[second] then
@@ -223,51 +370,116 @@ function utffilters.collapse(str) -- not really tested (we could preallocate a t
if n == 1 then
break
else
- tokens[#tokens+1], n = s, n -1
+ t = t + 1
+ tokens[t] = s
+ n = n - 1
end
end
- first, done = cgf[second], true
+ first = cgf[second]
+ done = true
else
- first, n = second, n + 1
+ 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
+ end
+ return str
+end
+
+function utffilters.decompose(str)
+ if str and str ~= "" then
+ local nstr = #str
+ if nstr > 1 then
+ -- if initialize then -- saves a call
+ -- initialize()
+ -- end
+ local tokens, t, done, n = { }, 0, false, 0
+ for s in utfcharacters(str) do
+ local dec = decomposed[s]
+ if dec then
+ if not done then
+ if n > 0 then
+ for s in utfcharacters(str) do
+ if n == 1 then
+ break
+ else
+ t = t + 1
+ tokens[t] = s
+ n = n - 1
+ end
+ end
end
+ done = true
end
+ t = t + 1
+ tokens[t] = dec
+ elseif done then
+ t = t + 1
+ tokens[t] = s
+ else
+ n = n + 1
end
end
if done then
- tokens[#tokens+1] = first
return concat(tokens) -- seldom called
end
- elseif #str > 0 then
- return cr[str] or str
end
end
return str
end
+local textfileactions = resolvers.openers.helpers.textfileactions
+
+utilities.sequencers.appendaction (textfileactions,"system","characters.filters.utf.collapse")
+utilities.sequencers.disableaction(textfileactions,"characters.filters.utf.collapse")
+
+utilities.sequencers.appendaction (textfileactions,"system","characters.filters.utf.decompose")
+utilities.sequencers.disableaction(textfileactions,"characters.filters.utf.decompose")
+
+function characters.filters.utf.enable()
+ utilities.sequencers.enableaction(textfileactions,"characters.filters.utf.collapse")
+ utilities.sequencers.enableaction(textfileactions,"characters.filters.utf.decompose")
+end
+
--[[ldx--
<p>Next we implement some commands that are used in the user interface.</p>
--ldx]]--
-commands = commands or { }
-
-function commands.uchar(first,second)
- tex.sprint(ctxcatcodes,utfchar(first*256+second))
-end
+-- commands = commands or { }
+--
+-- function commands.uchar(first,second)
+-- context(utfchar(first*256+second))
+-- end
--[[ldx--
<p>A few helpers (used to be <t>luat-uni<t/>).</p>
--ldx]]--
-function utf.split(str)
- local t = { }
- for snippet in utfcharacters(str) do
- t[#t+1] = snippet
- end
- return t
-end
-
-function utf.each(str,fnc)
- for snippet in utfcharacters(str) do
- fnc(snippet)
- end
-end
+-- obsolete:
+--
+-- function utf.split(str)
+-- local t, n = { }, 0
+-- for snippet in utfcharacters(str) do
+-- n = n + 1
+-- t[n+1] = snippet
+-- end
+-- return t
+-- end
+--
+-- function utf.each(str,fnc)
+-- for snippet in utfcharacters(str) do
+-- fnc(snippet)
+-- end
+-- end
diff --git a/Master/texmf-dist/tex/context/base/char-utf.mkiv b/Master/texmf-dist/tex/context/base/char-utf.mkiv
index 16b4029d8cb..2617356567d 100644
--- a/Master/texmf-dist/tex/context/base/char-utf.mkiv
+++ b/Master/texmf-dist/tex/context/base/char-utf.mkiv
@@ -28,11 +28,18 @@
%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.collapsing = true
- resolvers.install_text_filter('utf',characters.filters.utf.collapse)
- }%
+ \ctxlua{characters.filters.utf.enable()}%
\to \everyjob
%D The next one influences input parsing.
@@ -42,6 +49,6 @@
%D \stoptyping
\unexpanded\def\definecomposedutf#1 #2 #3 %
- {\ctxlua{characters.filters.utf.add_grapheme("#1","#2","#3")}}
+ {\ctxlua{characters.filters.utf.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 90874909207..4d47982a220 100644
--- a/Master/texmf-dist/tex/context/base/chem-ini.lua
+++ b/Master/texmf-dist/tex/context/base/chem-ini.lua
@@ -6,14 +6,19 @@ if not modules then modules = { } end modules ['chem-ini'] = {
license = "see context related readme files"
}
-local format, texsprint = string.format, tex.sprint
+local format = string.format
local lpegmatch = lpeg.match
+local P, R, V, Cc, Cs = lpeg.P, lpeg.R, lpeg.V, lpeg.Cc, lpeg.Cs
+
local trace_molecules = false trackers.register("chemistry.molecules", function(v) trace_molecules = v end)
-local ctxcatcodes = tex.ctxcatcodes
+local report_chemistry = logs.reporter("chemistry")
+
+local context = context
-chemicals = chemicals or { }
+chemicals = chemicals or { }
+local chemicals = chemicals
--[[
<p>The next code is an adaptation of code from Wolfgang Schuster
@@ -25,38 +30,37 @@ of input then.</p>
-- some lpeg, maybe i'll make an syst-lpg module
-local lowercase = lpeg.R("az")
-local uppercase = lpeg.R("AZ")
-local backslash = lpeg.P("\\")
-local csname = backslash * lpeg.P(1) * (1-backslash)^0
-local plus = lpeg.P("+") / "\\textplus "
-local minus = lpeg.P("-") / "\\textminus "
-local digit = lpeg.R("09")
+local lowercase = R("az")
+local uppercase = R("AZ")
+local backslash = P("\\")
+local csname = backslash * P(1) * (1-backslash)^0
+local plus = P("+") / "\\textplus "
+local minus = P("-") / "\\textminus "
+local digit = R("09")
local sign = plus + minus
local cardinal = digit^1
local integer = sign^0 * cardinal
-local leftbrace = lpeg.P("{")
-local rightbrace = lpeg.P("}")
+local leftbrace = P("{")
+local rightbrace = P("}")
local nobrace = 1 - (leftbrace + rightbrace)
-local nested = lpeg.P { leftbrace * (csname + sign + nobrace + lpeg.V(1))^0 * rightbrace }
-local any = lpeg.P(1)
+local nested = P { leftbrace * (csname + sign + nobrace + V(1))^0 * rightbrace }
+local any = P(1)
-local subscript = lpeg.P("_")
-local superscript = lpeg.P("^")
+local subscript = P("_")
+local superscript = P("^")
local somescript = subscript + superscript
---~ local content = lpeg.Cs(nested + integer + sign + any)
-local content = lpeg.Cs(csname + nested + sign + any)
+local content = Cs(csname + nested + sign + any)
-- could be made more efficient
-local lowhigh = lpeg.Cc("\\lohi{%s}{%s}") * subscript * content * superscript * content / format
-local highlow = lpeg.Cc("\\hilo{%s}{%s}") * superscript * content * subscript * content / format
-local low = lpeg.Cc("\\low{%s}") * subscript * content / format
-local high = lpeg.Cc("\\high{%s}") * superscript * content / format
+local lowhigh = Cc("\\lohi{%s}{%s}") * subscript * content * superscript * content / format
+local highlow = Cc("\\hilo{%s}{%s}") * superscript * content * subscript * content / format
+local low = Cc("\\low{%s}") * subscript * content / format
+local high = Cc("\\high{%s}") * superscript * content / format
local justtext = (1 - somescript)^1
-local parser = lpeg.Cs((csname + lowhigh + highlow + low + high + sign + any)^0)
+local parser = Cs((csname + lowhigh + highlow + low + high + sign + any)^0)
chemicals.moleculeparser = parser -- can be used to avoid functioncall
@@ -67,9 +71,9 @@ end
function commands.molecule(str)
if trace_molecules then
local rep = lpegmatch(parser,str)
- logs.report("chemistry", "molecule %s => %s",str,rep)
- texsprint(ctxcatcodes,rep)
+ report_chemistry("molecule %s => %s",str,rep)
+ context(rep)
else
- texsprint(ctxcatcodes,lpegmatch(parser,str))
+ context(lpegmatch(parser,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 5184fe1a7a0..c64575181db 100644
--- a/Master/texmf-dist/tex/context/base/chem-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/chem-ini.mkiv
@@ -35,7 +35,7 @@
%D
%D \typebuffer \getbuffer
-\def\molecule#1{\ctxlua{commands.molecule(\!!bs#1\!!es)}}
+\def\molecule#1{\ctxcommand{molecule(\!!bs#1\!!es)}}
%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 ad4cc6c1be4..1a6ed4dc213 100644
--- a/Master/texmf-dist/tex/context/base/chem-str.lua
+++ b/Master/texmf-dist/tex/context/base/chem-str.lua
@@ -13,15 +13,21 @@ if not modules then modules = { } end modules ['chem-str'] = {
local trace_structure = false trackers.register("chemistry.structure", function(v) trace_structure = v end)
local trace_textstack = false trackers.register("chemistry.textstack", function(v) trace_textstack = v end)
+local report_chemistry = logs.reporter("chemistry")
+
local format, gmatch, match, lower, gsub = string.format, string.gmatch, string.match, string.lower, string.gsub
local concat, insert, remove = table.concat, table.insert, table.remove
-local apply = structure.processors.apply
-local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local apply = structures.processors.apply
local lpegmatch = lpeg.match
+local settings_to_array = utilities.parsers.settings_to_array
+
+local P, R, S, C, Cs, Ct, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.Cc
local variables = interfaces.variables
+local context = context
chemicals = chemicals or { }
+local chemicals = chemicals
chemicals.instance = "metafun" -- "ppchtex"
chemicals.format = "metafun"
@@ -150,53 +156,52 @@ function chemicals.define(name,spec,text)
local dn = definitions[name]
if not dn then dn = { } definitions[name] = dn end
dn[#dn+1] = {
- spec = aux.settings_to_array(lower(spec)),
- text = aux.settings_to_array(text),
+ spec = settings_to_array(lower(spec)),
+ text = settings_to_array(text),
}
end
-local metacode, kind, keys, bonds, max, txt, textsize, rot, pstack
+local metacode, variant, keys, bonds, max, txt, textsize, rot, pstack
local molecule = chemicals.molecule -- or use lpegmatch(chemicals.moleculeparser,...)
local function fetch(txt)
local st = stack[txt]
local t = st.text[st.n]
---~ st.n = st.n + 1
while not t and txt > 1 do
txt = txt - 1
st = stack[txt]
t = st.text[st.n]
---~ st.n = st.n + 1
end
if t then
if trace_textstack then
- logs.report("chemical", "fetching from stack %s slot %s: %s",txt,st.n,t)
+ report_chemistry("fetching from stack %s slot %s: %s",txt,st.n,t)
end
-st.n = st.n + 1
+ st.n = st.n + 1
end
return txt, t
end
-local digit = lpeg.R("09")/tonumber
-local colon = lpeg.P(":")
-local equal = lpeg.P("=")
+local digit = R("09")/tonumber
+local colon = P(":")
+local equal = P("=")
local other = 1 - digit - colon - equal
-local remapped = lpeg.S("+-") / remapper
-local operation = lpeg.Cs((remapped^0 * other)^1)
+local remapped = S("+-") / remapper
+local operation = Cs((remapped^0 * other)^1)
local amount = digit
local single = digit
-local special = (colon * lpeg.C(other^1)) + lpeg.Cc("")
-local range = digit * lpeg.P("..") * digit
-local set = lpeg.Ct(digit^2)
-local text = (equal * lpeg.C(lpeg.P(1)^0)) + lpeg.Cc(false)
+local special = (colon * C(other^1)) + Cc("")
+local range = digit * P("..") * digit
+local set = Ct(digit^2)
+local text = (equal * C(P(1)^0)) + Cc(false)
+
local pattern =
- (amount + lpeg.Cc(1)) *
+ (amount + Cc(1)) *
operation *
special * (
- range * lpeg.Cc(false) * text +
- lpeg.Cc(false) * lpeg.Cc(false) * set * text +
- single * lpeg.Cc(false) * lpeg.Cc(false) * text +
- lpeg.Cc(false) * lpeg.Cc(false) * lpeg.Cc(false) * text
+ range * Cc(false) * text +
+ Cc(false) * Cc(false) * set * text +
+ single * Cc(false) * Cc(false) * text +
+ Cc(false) * Cc(false) * Cc(false) * text
)
--~ local n, operation, index, upto, set, text = lpegmatch(pattern,"RZ1357")
@@ -209,6 +214,7 @@ local pattern =
local function process(spec,text,n,rulethickness,rulecolor,offset)
insert(stack,{ spec=spec, text=text, n=n })
local txt = #stack
+ local m = #metacode
for i=1,#spec do
local s = spec[i]
local d = definitions[s]
@@ -220,8 +226,8 @@ local function process(spec,text,n,rulethickness,rulecolor,offset)
else
local rep, operation, special, index, upto, set, text = lpegmatch(pattern,s)
if operation == "pb" then
- insert(pstack,kind)
- metacode[#metacode+1] = syntax.pb.direct
+ insert(pstack,variant)
+ m = m + 1 ; metacode[m] = syntax.pb.direct
if keys[special] == "text" and index then
if keys["c"..special] == "text" then -- can be option: auto ...
metacode[#metacode+1] = format('chem_c%s(%s,%s,"");',special,bonds,index)
@@ -230,22 +236,22 @@ local function process(spec,text,n,rulethickness,rulecolor,offset)
end
end
elseif operation == "save" then
- insert(pstack,kind)
- metacode[#metacode+1] = syntax.save.direct
+ insert(pstack,variant)
+ m = m + 1 ; metacode[m] = syntax.save.direct
elseif operation == "pe" or operation == "restore" then
- kind = remove(pstack)
- local ss = syntax[kind]
+ variant = remove(pstack)
+ local ss = syntax[variant]
local prev = bonds or 6
keys, bonds, max, rot = ss.keys, ss.n, ss.max, 1
- metacode[#metacode+1] = syntax[operation].direct
- metacode[#metacode+1] = format("chem_set(%s,%s) ;",prev,bonds)
+ m = m + 1 ; metacode[m] = syntax[operation].direct
+ m = m + 1 ; metacode[m] = format("chem_set(%s,%s) ;",prev,bonds)
elseif operation == "front" then
- if syntax[kind .. "_front"] then
- kind = kind .. "_front"
- local ss = syntax[kind]
+ if syntax[variant .. "_front"] then
+ variant = variant .. "_front"
+ local ss = syntax[variant]
local prev = bonds or 6
keys, bonds, max, rot = ss.keys, ss.n, ss.max, 1
- metacode[#metacode+1] = format("chem_set(%s,%s) ;",prev,bonds)
+ m = m + 1 ; metacode[m] = format("chem_set(%s,%s) ;",prev,bonds)
end
elseif operation then
local ss = syntax[operation]
@@ -255,18 +261,18 @@ local function process(spec,text,n,rulethickness,rulecolor,offset)
local sa = ss.arguments
if sa == 1 then
local one ; txt, one = fetch(txt)
- metacode[#metacode+1] = format(ds,one or "")
+ m = m + 1 ; metacode[m] = format(ds,one or "")
elseif sa ==2 then
local one ; txt, one = fetch(txt)
local two ; txt, two = fetch(txt)
- metacode[#metacode+1] = format(ds,one or "",two or "")
+ m = m + 1 ; metacode[m] = format(ds,one or "",two or "")
else
- metacode[#metacode+1] = ds
+ m = m + 1 ; metacode[m] = ds
end
elseif ss.keys then
local prev = bonds or 6
- kind, keys, bonds, max, rot = s, ss.keys, ss.n, ss.max, 1
- metacode[#metacode+1] = format("chem_set(%s,%s) ;",prev,bonds)
+ variant, keys, bonds, max, rot = s, ss.keys, ss.n, ss.max, 1
+ m = m + 1 ; metacode[m] = format("chem_set(%s,%s) ;",prev,bonds)
end
else
local what = keys[operation]
@@ -274,35 +280,35 @@ local function process(spec,text,n,rulethickness,rulecolor,offset)
if set then
for i=1,#set do
local si = set[i]
- metacode[#metacode+1] = format("chem_%s(%s,%s,%s,%s,%s);",operation,bonds,si,si,rulethickness,rulecolor)
+ m = m + 1 ; metacode[m] = format("chem_%s(%s,%s,%s,%s,%s);",operation,bonds,si,si,rulethickness,rulecolor)
end
elseif upto then
- metacode[#metacode+1] = format("chem_%s(%s,%s,%s,%s,%s);",operation,bonds,index,upto,rulethickness,rulecolor)
+ m = m + 1 ; metacode[m] = format("chem_%s(%s,%s,%s,%s,%s);",operation,bonds,index,upto,rulethickness,rulecolor)
elseif index then
- metacode[#metacode+1] = format("chem_%s(%s,%s,%s,%s,%s);",operation,bonds,index,index,rulethickness,rulecolor)
+ m = m + 1 ; metacode[m] = format("chem_%s(%s,%s,%s,%s,%s);",operation,bonds,index,index,rulethickness,rulecolor)
else
- metacode[#metacode+1] = format("chem_%s(%s,%s,%s,%s,%s);",operation,bonds,1,max,rulethickness,rulecolor)
+ m = m + 1 ; metacode[m] = format("chem_%s(%s,%s,%s,%s,%s);",operation,bonds,1,max,rulethickness,rulecolor)
end
elseif what == "number" then
if set then
for i=1,#set do
local si = set[i]
- metacode[#metacode+1] = format('chem_%s(%s,%s,"\\dochemicaltext{%s}");',operation,bonds,si,si)
+ m = m + 1 ; metacode[m] = format('chem_%s(%s,%s,"\\dochemicaltext{%s}");',operation,bonds,si,si)
end
elseif upto then
for i=index,upto do
local si = set[i]
- metacode[#metacode+1] = format('chem_%s(%s,%s,"\\dochemicaltext{%s}");',operation,bonds,si,si)
+ m = m + 1 ; metacode[m] = format('chem_%s(%s,%s,"\\dochemicaltext{%s}");',operation,bonds,si,si)
end
elseif index then
- metacode[#metacode+1] = format('chem_%s(%s,%s,"\\dochemicaltext{%s}");',operation,bonds,index,index)
+ m = m + 1 ; metacode[m] = format('chem_%s(%s,%s,"\\dochemicaltext{%s}");',operation,bonds,index,index)
else
for i=1,max do
- metacode[#metacode+1] = format('chem_%s(%s,%s,"\\dochemicaltext{%s}");',operation,bonds,i,i)
+ m = m + 1 ; metacode[m] = format('chem_%s(%s,%s,"\\dochemicaltext{%s}");',operation,bonds,i,i)
end
end
elseif what == "text" then
- local align = syntax[kind].align
+ local align = syntax[variant].align
align = align and align[operation]
align = align and align[rot]
if set then
@@ -313,7 +319,7 @@ local function process(spec,text,n,rulethickness,rulecolor,offset)
if t then
local a = align and align[si]
if a then a = "." .. a else a = "" end
- metacode[#metacode+1] = format('chem_%s%s(%s,%s,"\\dochemicaltext{%s}");',operation,a,bonds,si,molecule(apply(t)))
+ m = m + 1 ; metacode[m] = format('chem_%s%s(%s,%s,"\\dochemicaltext{%s}");',operation,a,bonds,si,molecule(apply(t)))
end
end
elseif upto then
@@ -323,14 +329,14 @@ local function process(spec,text,n,rulethickness,rulecolor,offset)
if t then
local s = align and align[i]
if s then s = "." .. s else s = "" end
- metacode[#metacode+1] = format('chem_%s%s(%s,%s,"\\dochemicaltext{%s}");',operation,s,bonds,i,molecule(apply(t)))
+ m = m + 1 ; metacode[m] = format('chem_%s%s(%s,%s,"\\dochemicaltext{%s}");',operation,s,bonds,i,molecule(apply(t)))
end
end
elseif index == 0 then
local t = text
if not t then txt, t = fetch(txt) end
if t then
- metacode[#metacode+1] = format('chem_%s_zero("\\dochemicaltext{%s}");',operation,molecule(apply(t)))
+ m = m + 1 ; metacode[m] = format('chem_%s_zero("\\dochemicaltext{%s}");',operation,molecule(apply(t)))
end
elseif index then
local t = text
@@ -338,7 +344,7 @@ local function process(spec,text,n,rulethickness,rulecolor,offset)
if t then
local s = align and align[index]
if s then s = "." .. s else s = "" end
- metacode[#metacode+1] = format('chem_%s%s(%s,%s,"\\dochemicaltext{%s}");',operation,s,bonds,index,molecule(apply(t)))
+ m = m + 1 ; metacode[m] = format('chem_%s%s(%s,%s,"\\dochemicaltext{%s}");',operation,s,bonds,index,molecule(apply(t)))
end
else
for i=1,max do
@@ -347,21 +353,21 @@ local function process(spec,text,n,rulethickness,rulecolor,offset)
if t then
local s = align and align[i]
if s then s = "." .. s else s = "" end
- metacode[#metacode+1] = format('chem_%s%s(%s,%s,"\\dochemicaltext{%s}");',operation,s,bonds,i,molecule(apply(t)))
+ m = m + 1 ; metacode[m] = format('chem_%s%s(%s,%s,"\\dochemicaltext{%s}");',operation,s,bonds,i,molecule(apply(t)))
end
end
end
elseif what == "transform" then
if index then
for r=1,rep do
- metacode[#metacode+1] = format('chem_%s(%s,%s);',operation,bonds,index)
+ m = m + 1 ; metacode[m] = format('chem_%s(%s,%s);',operation,bonds,index)
end
if operation == "rot" then
rot = index
end
end
elseif what == "fixed" then
- metacode[#metacode+1] = format("chem_%s(%s,%s,%s);",operation,bonds,rulethickness,rulecolor)
+ m = m + 1 ; metacode[m] = format("chem_%s(%s,%s,%s);",operation,bonds,rulethickness,rulecolor)
end
end
end
@@ -434,14 +440,14 @@ function chemicals.start(settings)
l/25, r/25, t/25, b/25, scale,
tostring(settings.axis == variables.on), tostring(width), tostring(height), tostring(offset)
) }
- kind, keys, bonds, stack, rot, pstack = "six", { }, 6, { }, 1, { }
+ variant, keys, bonds, stack, rot, pstack = "six", { }, 6, { }, 1, { }
end
function chemicals.stop()
metacode[#metacode+1] = "chem_stop_structure ;"
local mpcode = concat(metacode,"\n")
if trace_structure then
- logs.report("chemical", "metapost code:\n%s", mpcode)
+ report_chemistry("metapost code:\n%s", mpcode)
end
metapost.graphic(chemicals.instance,chemicals.format,mpcode)
metacode = nil
@@ -449,8 +455,8 @@ end
function chemicals.component(spec,text,settings)
rulethickness, rulecolor, offset = settings.rulethickness, settings.rulecolor
- local spec = aux.settings_to_array(lower(spec))
- local text = aux.settings_to_array(text)
+ local spec = settings_to_array(lower(spec))
+ local text = settings_to_array(text)
metacode[#metacode+1] = "chem_start_component ;"
process(spec,text,1,rulethickness,rulecolor)
metacode[#metacode+1] = "chem_stop_component ;"
@@ -471,14 +477,14 @@ local inline = {
-- todo: top / bottom
function chemicals.inline(spec)
- local spec = aux.settings_to_array(spec)
+ local spec = settings_to_array(spec)
for i=1,#spec do
local s = spec[i]
local inl = inline[lower(s)]
if inl then
- texsprint(ctxcatcodes,inl)
+ context(inl)
else
- texsprint(ctxcatcodes,format("\\chemicalinline{%s}",molecule(s)))
+ context.chemicalinline(molecule(s))
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/chem-str.mkiv b/Master/texmf-dist/tex/context/base/chem-str.mkiv
index 1e17218c875..6430830f73a 100644
--- a/Master/texmf-dist/tex/context/base/chem-str.mkiv
+++ b/Master/texmf-dist/tex/context/base/chem-str.mkiv
@@ -91,9 +91,6 @@
{\dosetfontattribute \??cm\c!style
\dosetcolorattribute\??cm\c!color}
-\def\dochemicaltext#1%
- {\dosetchemicaltext\strut#1} % maybe also \setstrut
-
\edef\chemicaltoplocation{t}
\edef\chemicalbotlocation{b}
@@ -316,9 +313,24 @@
\unexpanded\def\chemicaltopright #1{\chemicalright{\chemicallefttop {#1}{}}}
\unexpanded\def\chemicalbottomright #1{\chemicalright{\chemicalleftbottom {#1}{}}}
-\unexpanded\def\chemicalcentered #1{\setbox\scratchbox\hbox{C}\hbox to \wd\scratchbox{\setstrut\strut\hss#1\hss}}
-\unexpanded\def\chemicalleftcentered #1{\setbox\scratchbox\hbox{C}\hbox to \wd\scratchbox{\setstrut\strut #1\hss}}
-\unexpanded\def\chemicalrightcentered#1{\setbox\scratchbox\hbox{C}\hbox to \wd\scratchbox{\setstrut\strut\hss#1}}
+% \unexpanded\def\chemicalcentered #1{\hbox to \fontcharwd\font`C{\setstrut\strut\hss#1\hss}}
+% \unexpanded\def\chemicalleftcentered #1{\hbox to \fontcharwd\font`C{\setstrut\strut #1\hss}}
+% \unexpanded\def\chemicalrightcentered#1{\hbox to \fontcharwd\font`C{\setstrut\strut\hss#1}}
+
+% \let\chemicalsmashedmiddle\chemicalcentered
+% \let\chemicalsmashedleft \chemicalleftcentered
+% \let\chemicalsmashedright \chemicalrightcentered
+
+\unexpanded\def\chemicalalignedtext#1#2#3%
+ {\dontleavehmode
+ \begingroup
+ \dosetchemicaltext
+ \hbox to \fontcharwd\font`C{\setstrut\strut#1\molecule{#3}#2}%
+ \endgroup}
+
+\unexpanded\def\chemicalcentered {\chemicalalignedtext\hss \hss }
+\unexpanded\def\chemicalleftcentered {\chemicalalignedtext\relax\hss }
+\unexpanded\def\chemicalrightcentered{\chemicalalignedtext\hss \relax}
\let\chemicalsmashedmiddle\chemicalcentered
\let\chemicalsmashedleft \chemicalleftcentered
@@ -391,6 +403,7 @@
{\the\everychemical \everychemical\emptytoks
\quad
\vcenter\bgroup
+ \dosetchemicaltext
\ifthirdargument
\ifsecondargument
\halign{&\hss##\hss\cr#2\cr\molecule{#1}\cr#3\cr}%
@@ -404,7 +417,7 @@
\quad}
\def\inlinechemical#1%
- {\dontleavehmode\hbox{\ctxlua{chemicals.inline(\!!bs#1\!!es)}}}
+ {\dontleavehmode\hbox{\dosetchemicaltext\ctxlua{chemicals.inline(\!!bs#1\!!es)}}}
\def\chemicalbondrule{\hbox{\vrule\!!height.75ex\!!depth-\dimexpr.75ex-\linewidth\relax\!!width1em\relax}}
@@ -458,15 +471,15 @@
\nointerlineskip
\ifconditional\formulachemicalhastop
\ifconditional\formulachemicalhasbot
- \halign{&\hss##\hss\cr\the\formulachemicaltop\cr\the\formulachemicalmid\cr\the\formulachemicalbot\cr}%
+ \halign{&\hss\dosetchemicaltext##\hss\cr\the\formulachemicaltop\cr\the\formulachemicalmid\cr\the\formulachemicalbot\cr}%
\else
- \halign{&\hss##\hss\cr\the\formulachemicaltop\cr\the\formulachemicalmid\cr}%
+ \halign{&\hss\dosetchemicaltext##\hss\cr\the\formulachemicaltop\cr\the\formulachemicalmid\cr}%
\fi
\else
\ifconditional\formulachemicalhasbot
- \halign{&\hss##\hss\cr\the\formulachemicalmid\cr\the\formulachemicalbot\cr}%
+ \halign{&\hss\dosetchemicaltext##\hss\cr\the\formulachemicalmid\cr\the\formulachemicalbot\cr}%
\else
- \halign{&\hss##\hss\cr\the\formulachemicalmid\cr}%
+ \halign{&\hss\dosetchemicaltext##\hss\cr\the\formulachemicalmid\cr}%
\fi
\fi
\egroup}
@@ -474,7 +487,7 @@
\unexpanded\def\formulachemical
{\relax\dotriplegroupempty\doformulachemical}
-\def\doformulachemical#1#2#3%
+\def\doformulachemical#1#2#3% we could do hboxes and measure
{\ifthirdargument
\doifelsenothing{#2}\noformulachemicaltop{\doformulachemicaltop{#2}}%
\doifelsenothing{#3}\noformulachemicalbot{\doformulachemicalbot{#3}}%
diff --git a/Master/texmf-dist/tex/context/base/cldf-com.lua b/Master/texmf-dist/tex/context/base/cldf-com.lua
new file mode 100644
index 00000000000..e966b167b20
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cldf-com.lua
@@ -0,0 +1,105 @@
+if not modules then modules = { } end modules ['cldf-com'] = {
+ version = 1.001,
+ comment = "companion to cldf-com.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local tostring, type = tostring, type
+local format = string.format
+
+local context = context
+local generics = context.generics
+local variables = interfaces.variables
+
+generics.starttabulate = "start" .. variables.tabulate -- todo: e!start
+generics.stoptabulate = "stop" .. variables.tabulate -- todo: e!stop
+
+local NC, NR = context.NC, context.NR
+
+local function tabulaterow(how,...)
+ local t = { ... }
+ for i=1,#t do
+ local ti = tostring(t[i])
+ NC()
+ if how then
+ context[how](ti)
+ else
+ context(ti)
+ end
+ end
+ NC()
+ NR()
+end
+
+function context.tabulaterow (...) tabulaterow(false, ...) end
+function context.tabulaterowbold(...) tabulaterow("bold",...) end
+function context.tabulaterowtype(...) tabulaterow("type",...) end
+function context.tabulaterowtyp (...) tabulaterow("typ", ...) end
+
+-- these will move up, just after cld definitions
+
+function context.char(k) -- todo: if catcode == letter or other then just the utf
+ if type(k) == "table" then
+ for i=1,#k do
+ context(format([[\char%s\relax]],k[i]))
+ end
+ elseif k then
+ context(format([[\char%s\relax]],k))
+ end
+end
+
+function context.utfchar(k)
+ context(utfchar(k))
+end
+
+-- plain variants
+
+function context.chardef(cs,u)
+ context(format([[\chardef\%s=%s\relax]],k)) -- context does already do format
+end
+
+function context.par()
+ context([[\par]]) -- no need to add {} there
+end
+
+function context.bgroup()
+ context("{")
+end
+
+function context.egroup()
+ context("}")
+end
+
+local rule = nodes.pool.rule
+
+function context.hrule(w,h,d,dir)
+ if type(w) == "table" then
+ context(rule(w.width,w.height,w.depth,w.dir))
+ else
+ context(rule(w,h,d,dir))
+ end
+end
+
+context.vrule = context.hrule
+
+--~ local hbox, bgroup, egroup = context.hbox, context.bgroup, context.egroup
+
+--~ function context.hbox(a,...)
+--~ if type(a) == "table" then
+--~ local s = { }
+--~ if a.width then
+--~ s[#s+1] = "to " .. a.width -- todo: check for number
+--~ elseif a.spread then
+--~ s[#s+1] = "spread " .. a.spread -- todo: check for number
+--~ end
+--~ -- todo: dir, attr etc
+--~ hbox(false,table.concat(s," "))
+--~ bgroup()
+--~ context(string.format(...))
+--~ egroup()
+--~ else
+--~ hbox(a,...)
+--~ end
+--~ end
diff --git a/Master/texmf-dist/tex/context/base/cldf-com.mkiv b/Master/texmf-dist/tex/context/base/cldf-com.mkiv
new file mode 100644
index 00000000000..43071a58053
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cldf-com.mkiv
@@ -0,0 +1,19 @@
+%D \module
+%D [ file=cldf-com,
+%D version=2010.10.19,,
+%D title=\CONTEXT\ \LUA\ Document Functions,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=Hans Hagen]
+%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 Documents / Functions}
+
+\registerctxluafile{cldf-com}{1.001}
+\registerctxluafile{cldf-ver}{1.001}
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cldf-ini.lua b/Master/texmf-dist/tex/context/base/cldf-ini.lua
new file mode 100644
index 00000000000..8edc0502321
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cldf-ini.lua
@@ -0,0 +1,755 @@
+if not modules then modules = { } end modules ['cldf-ini'] = {
+ 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"
+}
+
+-- This is an experiment: generating context code at the lua end. After all
+-- it is surprisingly simple to implement due to metatables. I was wondering
+-- if there was a more natural way to deal with commands at the lua end.
+-- Of course it's a bit slower but often more readable when mixed with lua
+-- code. It can also be handy when generating documents from databases or
+-- when constructing large tables or so.
+--
+-- Todo: optional checking against interface
+-- Todo: coroutine trickery
+-- Todo: maybe use txtcatcodes
+
+-- tflush needs checking ... sort of weird that it's not a table
+
+-- __flushlines is an experiment and rather ugly so it will go away
+
+local tex = tex
+
+context = context or { }
+local context = context
+
+local format, find, gmatch, splitlines = string.format, string.find, string.gmatch, string.splitlines
+local next, type, tostring, setmetatable = next, type, tostring, setmetatable
+local insert, remove, concat = table.insert, table.remove, table.concat
+local lpegmatch = lpeg.match
+
+local texsprint = tex.sprint
+local textprint = tex.tprint
+local texprint = tex.print
+local texiowrite = texio.write
+local texcount = tex.count
+
+local isnode = node.is_node -- after 0.65 just node.type
+local writenode = node.write
+local copynodelist = node.copy_list
+
+local ctxcatcodes = tex.ctxcatcodes
+local prtcatcodes = tex.prtcatcodes
+local texcatcodes = tex.texcatcodes
+local txtcatcodes = tex.txtcatcodes
+local vrbcatcodes = tex.vrbcatcodes
+local xmlcatcodes = tex.xmlcatcodes
+
+local flush = texsprint
+
+local report_context = logs.reporter("cld","tex")
+local report_cld = logs.reporter("cld","stack")
+
+local processlines = true -- experiments.register("context.processlines", function(v) processlines = v end)
+
+-- for tracing it's easier to have two stacks
+
+local _stack_f_, _n_f_ = { }, 0
+local _stack_n_, _n_n_ = { }, 0
+
+local function _store_f_(ti)
+ _n_f_ = _n_f_ + 1
+ _stack_f_[_n_f_] = ti
+ return _n_f_
+end
+
+local function _store_n_(ti)
+ _n_n_ = _n_n_ + 1
+ _stack_n_[_n_n_] = ti
+ return _n_n_
+end
+
+local function _flush_f_(n)
+ local sn = _stack_f_[n]
+ if not sn then
+ report_cld("data with id %s cannot be found on stack",n)
+ else
+ local tn = type(sn)
+ if tn == "function" then
+ if not sn() and texcount["@@trialtypesetting"] == 0 then -- @@trialtypesetting is private!
+ _stack_f_[n] = nil
+ else
+ -- keep, beware, that way the stack can grow
+ end
+ else
+ if texcount["@@trialtypesetting"] == 0 then -- @@trialtypesetting is private!
+ writenode(sn)
+ _stack_f_[n] = nil
+ else
+ writenode(copynodelist(sn))
+ -- keep, beware, that way the stack can grow
+ end
+ end
+ end
+end
+
+local function _flush_n_(n)
+ local sn = _stack_n_[n]
+ if not sn then
+ report_cld("data with id %s cannot be found on stack",n)
+ elseif texcount["@@trialtypesetting"] == 0 then -- @@trialtypesetting is private!
+ writenode(sn)
+ _stack_n_[n] = nil
+ else
+ writenode(copynodelist(sn))
+ -- keep, beware, that way the stack can grow
+ end
+end
+
+function context.restart()
+ _stack_f_, _n_f_ = { }, 0
+ _stack_n_, _n_n_ = { }, 0
+end
+
+context._stack_f_ = _stack_f_
+context._store_f_ = _store_f_
+context._flush_f_ = _flush_f_ _cldf_ = _flush_f_
+
+context._stack_n_ = _stack_n_
+context._store_n_ = _store_n_
+context._flush_n_ = _flush_n_ _cldn_ = _flush_n_
+
+-- Should we keep the catcodes with the function?
+
+local catcodestack = { }
+local currentcatcodes = ctxcatcodes
+local contentcatcodes = ctxcatcodes
+
+local catcodes = {
+ ctx = ctxcatcodes, ctxcatcodes = ctxcatcodes, context = ctxcatcodes,
+ prt = prtcatcodes, prtcatcodes = prtcatcodes, protect = prtcatcodes,
+ tex = texcatcodes, texcatcodes = texcatcodes, plain = texcatcodes,
+ txt = txtcatcodes, txtcatcodes = txtcatcodes, text = txtcatcodes,
+ vrb = vrbcatcodes, vrbcatcodes = vrbcatcodes, verbatim = vrbcatcodes,
+ xml = xmlcatcodes, xmlcatcodes = xmlcatcodes,
+}
+
+function context.pushcatcodes(c)
+ insert(catcodestack,currentcatcodes)
+ currentcatcodes = (c and catcodes[c] or tonumber(c)) or currentcatcodes
+ contentcatcodes = currentcatcodes
+end
+
+function context.popcatcodes()
+ currentcatcodes = remove(catcodestack) or currentcatcodes
+ contentcatcodes = currentcatcodes
+end
+
+function tex.fprint(...) -- goodie
+ texsprint(currentcatcodes,format(...))
+end
+
+-- -- -- todo: tracing
+
+local newline = lpeg.patterns.newline
+local space = lpeg.patterns.spacer
+local spacing = newline * space^0
+local content = lpeg.C((1-spacing)^1)
+local emptyline = space^0 * newline^2
+local endofline = space^0 * newline * space^0
+local simpleline = endofline * lpeg.P(-1)
+
+local function n_content(s)
+ flush(contentcatcodes,s)
+end
+
+local function n_endofline()
+ texsprint(" \r")
+end
+
+local function n_emptyline()
+ texprint("\r")
+end
+
+local function n_simpleline()
+ texprint("\r")
+end
+
+function lpeg.texlinesplitter(f_content,f_endofline,f_emptyline,f_simpleline)
+ local splitlines =
+ simpleline / (f_simpleline or n_simpleline)
+ + (
+ emptyline / (f_emptyline or n_emptyline)
+ + endofline / (f_endofline or n_emptyline)
+ + content / (f_content or n_content)
+ )^0
+ return function(str) return lpegmatch(splitlines,str) end
+end
+
+local flushlines = lpeg.texlinesplitter(n_content,n_endofline,n_emptyline,n_simpleline)
+
+context.__flushlines = flushlines -- maybe context.helpers.flushtexlines
+context.__flush = flush
+
+local printlines_ctx = (
+ (newline) / function() texprint("") end +
+ (1-newline)^1 / function(s) texprint(ctxcatcodes,s) end * newline^-1
+)^0
+
+local printlines_raw = (
+ (newline) / function() texprint("") end +
+ (1-newline)^1 / function(s) texprint(s) end * newline^-1
+)^0
+
+function context.printlines(str,raw)
+ if raw then
+ lpegmatch(printlines_raw,str)
+ else
+ lpegmatch(printlines_ctx,str)
+ end
+end
+
+-- -- --
+
+local methodhandler = resolvers.methodhandler
+
+function context.viafile(data)
+ -- this is the only way to deal with nested buffers
+ -- and other catcode sensitive data
+ if data and data ~= "" then
+ local filename = resolvers.savers.byscheme("virtual","viafile",data)
+ context.input(filename)
+ end
+end
+
+-- -- --
+
+local function writer(parent,command,first,...)
+ local t = { first, ... }
+ flush(currentcatcodes,command) -- todo: ctx|prt|texcatcodes
+ local direct = false
+ for i=1,#t do
+ local ti = t[i]
+ local typ = type(ti)
+ if direct then
+ if typ == "string" or typ == "number" then
+ flush(currentcatcodes,ti)
+ else -- node.write
+ report_context("error: invalid use of direct in '%s', only strings and numbers can be flushed directly, not '%s'",command,typ)
+ end
+ direct = false
+ elseif ti == nil then
+ -- nothing
+ elseif ti == "" then
+ flush(currentcatcodes,"{}")
+ elseif typ == "string" then
+ if processlines and find(ti,"[\n\r]") then -- we can check for ti == "\n"
+ flush(currentcatcodes,"{")
+ local flushlines = parent.__flushlines or flushlines
+ flushlines(ti)
+ flush(currentcatcodes,"}")
+ elseif currentcatcodes == contentcatcodes then
+ flush(currentcatcodes,"{",ti,"}")
+ else
+ flush(currentcatcodes,"{")
+ flush(contentcatcodes,ti)
+ flush(currentcatcodes,"}")
+ end
+ elseif typ == "number" then
+ -- numbers never have funny catcodes
+ flush(currentcatcodes,"{",ti,"}")
+ elseif typ == "table" then
+ local tn = #ti
+ if tn == 0 then
+ local done = false
+ for k, v in next, ti do
+ if done then
+ if v == "" then
+ flush(currentcatcodes,",",k,'=')
+ else
+ flush(currentcatcodes,",",k,'=',v)
+ end
+ else
+ if v == "" then
+ flush(currentcatcodes,"[",k,'=')
+ else
+ flush(currentcatcodes,"[",k,'=',v)
+ end
+ done = true
+ end
+ end
+ flush(currentcatcodes,"]")
+ elseif tn == 1 then -- some 20% faster than the next loop
+ local tj = ti[1]
+ if type(tj) == "function" then
+ flush(currentcatcodes,"[\\cldf{",_store_f_(tj),"}]")
+ else
+ flush(currentcatcodes,"[",tj,"]")
+ end
+ else -- is concat really faster than flushes here? probably needed anyway (print artifacts)
+ for j=1,tn do
+ local tj = ti[j]
+ if type(tj) == "function" then
+ ti[j] = "\\cldf{" .. _store_f_(tj) .. "}"
+ end
+ end
+ flush(currentcatcodes,"[",concat(ti,","),"]")
+ end
+ elseif typ == "function" then
+ flush(currentcatcodes,"{\\cldf{",_store_f_(ti),"}}") -- todo: ctx|prt|texcatcodes
+ elseif typ == "boolean" then
+ if ti then
+ -- flush(currentcatcodes,"^^M")
+ texprint("")
+ else
+ direct = true
+ end
+ elseif typ == "thread" then
+ report_context("coroutines not supported as we cannot yield across boundaries")
+ elseif isnode(ti) then -- slow
+ flush(currentcatcodes,"{\\cldn{",_store_n_(ti),"}}")
+ else
+ report_context("error: '%s' gets a weird argument '%s'",command,tostring(ti))
+ end
+ end
+end
+
+local generics = { } context.generics = generics
+
+local function indexer(parent,k)
+ local c = "\\" .. tostring(generics[k] or k)
+ local f = function(first,...)
+ if first == nil then
+ flush(currentcatcodes,c)
+ else
+ return writer(parent,c,first,...)
+ end
+ end
+ parent[k] = f
+ return f
+end
+
+local function caller(parent,f,a,...)
+ if not parent then
+ -- so we don't need to test in the calling (slower but often no issue) (will go)
+ elseif f ~= nil then
+ local typ = type(f)
+ if typ == "string" then
+ if a then
+ flush(contentcatcodes,format(f,a,...)) -- was currentcatcodes
+ elseif processlines and find(f,"[\n\r]") then
+ local flushlines = parent.__flushlines or flushlines
+ flushlines(f)
+ else
+ flush(contentcatcodes,f)
+ end
+ elseif typ == "number" then
+ if a then
+ flush(currentcatcodes,f,a,...)
+ else
+ flush(currentcatcodes,f)
+ end
+ elseif typ == "function" then
+ -- ignored: a ...
+ flush(currentcatcodes,"{\\cldf{",_store_f_(f),"}}") -- todo: ctx|prt|texcatcodes
+ elseif typ == "boolean" then
+ if f then
+ if a ~= nil then
+ local flushlines = parent.__flushlines or flushlines
+ flushlines(f)
+ -- ignore ... maybe some day
+ else
+ -- flush(currentcatcodes,"^^M")
+ texprint("")
+ end
+ else
+ if a ~= nil then
+ -- no command, same as context(a,...)
+ writer(parent,"",a,...)
+ else
+ -- ignored
+ end
+ end
+ elseif typ == "thread" then
+ report_context("coroutines not supported as we cannot yield across boundaries")
+ elseif isnode(f) then -- slow
+ -- writenode(f)
+ flush(currentcatcodes,"\\cldn{",_store_n_(f),"}")
+ else
+ report_context("error: 'context' gets a weird argument '%s'",tostring(f))
+ end
+ end
+end
+
+local defaultcaller = caller
+
+setmetatable(context, { __index = indexer, __call = caller } )
+
+-- now we tweak unprotect and protect
+
+function context.unprotect()
+ -- at the lua end
+ insert(catcodestack,currentcatcodes)
+ currentcatcodes = prtcatcodes
+ contentcatcodes = currentcatcodes
+ -- at the tex end
+ flush("\\unprotect")
+end
+
+function context.protect()
+ -- at the tex end
+ flush("\\protect")
+ -- at the lua end
+ currentcatcodes = remove(catcodestack) or currentcatcodes
+ contentcatcodes = currentcatcodes
+end
+
+-- logging
+
+local trace_stack = { }
+
+local normalflush = flush
+local normalwriter = writer
+local currenttrace = nil
+local nofwriters = 0
+local nofflushes = 0
+
+statistics.register("traced context", function()
+ if nofwriters > 0 or nofflushes > 0 then
+ return format("writers: %s, flushes: %s, maxstack: %s",nofwriters,nofflushes,_n_f_)
+ end
+end)
+
+local tracedwriter = function(parent,...)
+ nofwriters = nofwriters + 1
+ local t, f, n = { "w : " }, flush, 0
+ flush = function(...)
+ n = n + 1
+ t[n] = concat({...},"",2)
+ normalflush(...)
+ end
+ normalwriter(parent,...)
+ flush = f
+ currenttrace(concat(t))
+end
+
+local tracedflush = function(...)
+ nofflushes = nofflushes + 1
+ normalflush(...)
+ local t = { ... }
+ t[1] = "f : " -- replaces the catcode
+ for i=2,#t do
+ local ti = t[i]
+ local tt = type(ti)
+ if tt == "string" then
+ -- ok
+ elseif tt == "number" then
+ -- ok
+ else
+ t[i] = format("<%s>",tostring(ti))
+ end
+ -- currenttrace(format("%02i: %s",i-1,tostring(t[i])))
+ end
+ currenttrace(concat(t))
+end
+
+local function pushlogger(trace)
+ insert(trace_stack,currenttrace)
+ currenttrace = trace
+ flush, writer = tracedflush, tracedwriter
+ context.__flush = flush
+end
+
+local function poplogger()
+ currenttrace = remove(trace_stack)
+ if not currenttrace then
+ flush, writer = normalflush, normalwriter
+ context.__flush = flush
+ end
+end
+
+local function settracing(v)
+ if v then
+ pushlogger(report_context)
+ else
+ poplogger()
+ end
+end
+
+-- todo: share flushers so that we can define in other files
+
+trackers.register("context.trace",settracing)
+
+context.pushlogger = pushlogger
+context.poplogger = poplogger
+context.settracing = settracing
+
+local trace_cld = false trackers.register("context.files", function(v) trace_cld = v end)
+
+function context.runfile(filename)
+ local foundname = resolvers.findtexfile(file.addsuffix(filename,"cld")) or ""
+ if foundname ~= "" then
+ local ok = dofile(foundname)
+ if type(ok) == "function" then
+ if trace_cld then
+ report_context("begin of file '%s' (function call)",foundname)
+ end
+ ok()
+ if trace_cld then
+ report_context("end of file '%s' (function call)",foundname)
+ end
+ elseif ok then
+ report_context("file '%s' is processed and returns true",foundname)
+ else
+ report_context("file '%s' is processed and returns nothing",foundname)
+ end
+ else
+ report_context("unknown file '%s'",filename)
+ end
+end
+
+-- some functions
+
+function context.direct(first,...)
+ if first ~= nil then
+ return writer(context,"",first,...)
+ end
+end
+
+-- context.delayed (todo: lines)
+
+local delayed = { } context.delayed = delayed -- maybe also store them
+
+local function indexer(parent,k)
+ local f = function(...)
+ local a = { ... }
+ return function()
+ return context[k](unpack(a))
+ end
+ end
+ parent[k] = f
+ return f
+end
+
+local function caller(parent,...) -- todo: nodes
+ local a = { ... }
+ return function()
+ return context(unpack(a))
+ end
+end
+
+setmetatable(delayed, { __index = indexer, __call = caller } )
+
+-- context.nested (todo: lines)
+
+local nested = { } context.nested = nested
+
+local function indexer(parent,k)
+ local f = function(...)
+ local t, savedflush, n = { }, flush, 0
+ flush = function(c,f,s,...) -- catcodes are ignored
+ n = n + 1
+ t[n] = s and concat{f,s,...} or f -- optimized for #args == 1
+ end
+ context[k](...)
+ flush = savedflush
+ return concat(t)
+ end
+ parent[k] = f
+ return f
+end
+
+local function caller(parent,...)
+ local t, savedflush, n = { }, flush, 0
+ flush = function(c,f,s,...) -- catcodes are ignored
+ n = n + 1
+ t[n] = s and concat{f,s,...} or f -- optimized for #args == 1
+ end
+ context(...)
+ flush = savedflush
+ return concat(t)
+end
+
+setmetatable(nested, { __index = indexer, __call = caller } )
+
+-- verbatim
+
+local verbatim = { } context.verbatim = verbatim
+
+local function indexer(parent,k)
+ local command = context[k]
+ local f = function(...)
+ local savedcatcodes = contentcatcodes
+ contentcatcodes = vrbcatcodes
+ command(...)
+ contentcatcodes = savedcatcodes
+ end
+ parent[k] = f
+ return f
+end
+
+local function caller(parent,...)
+ local savedcatcodes = contentcatcodes
+ contentcatcodes = vrbcatcodes
+ defaultcaller(parent,...)
+ contentcatcodes = savedcatcodes
+end
+
+setmetatable(verbatim, { __index = indexer, __call = caller } )
+
+-- metafun (this will move to another file)
+
+local metafun = { } context.metafun = metafun
+
+local mpdrawing = "\\MPdrawing"
+
+local function caller(parent,f,a,...)
+ if not parent then
+ -- skip
+ elseif f then
+ local typ = type(f)
+ if typ == "string" then
+ if a then
+ flush(currentcatcodes,mpdrawing,"{",format(f,a,...),"}")
+ else
+ flush(currentcatcodes,mpdrawing,"{",f,"}")
+ end
+ elseif typ == "number" then
+ if a then
+ flush(currentcatcodes,mpdrawing,"{",f,a,...,"}")
+ else
+ flush(currentcatcodes,mpdrawing,"{",f,"}")
+ end
+ elseif typ == "function" then
+ -- ignored: a ...
+ flush(currentcatcodes,mpdrawing,"{\\cldf{",store_(f),"}}")
+ elseif typ == "boolean" then
+ -- ignored: a ...
+ if f then
+ flush(currentcatcodes,mpdrawing,"{^^M}")
+ else
+ report_context("warning: 'metafun' gets argument 'false' which is currently unsupported")
+ end
+ else
+ report_context("error: 'metafun' gets a weird argument '%s'",tostring(f))
+ end
+ end
+end
+
+setmetatable(metafun, { __call = caller } )
+
+function metafun.start()
+ context.resetMPdrawing()
+end
+
+function metafun.stop()
+ context.MPdrawingdonetrue()
+ context.getMPdrawing()
+end
+
+function metafun.color(name)
+ return format([[\MPcolor{%s}]],name)
+end
+
+-- metafun.delayed
+
+local delayed = { } metafun.delayed = delayed
+
+local function indexer(parent,k)
+ local f = function(...)
+ local a = { ... }
+ return function()
+ return metafun[k](unpack(a))
+ end
+ end
+ parent[k] = f
+ return f
+end
+
+
+local function caller(parent,...)
+ local a = { ... }
+ return function()
+ return metafun(unpack(a))
+ end
+end
+
+setmetatable(delayed, { __index = indexer, __call = caller } )
+
+--~ Not that useful yet. Maybe something like this when the main loop
+--~ is a coroutine. It also does not help taking care of nested calls.
+--~ Even worse, it interferes with other mechanisms using context calls.
+--~
+--~ local create, yield, resume = coroutine.create, coroutine.yield, coroutine.resume
+--~ local getflush, setflush = context.getflush, context.setflush
+--~ local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+--~
+--~ function context.getflush()
+--~ return flush
+--~ end
+--~
+--~ function context.setflush(newflush)
+--~ local oldflush = flush
+--~ flush = newflush or flush
+--~ return oldflush
+--~ end
+--~
+--~ function context.direct(f)
+--~ local routine = create(f)
+--~ local oldflush = getflush()
+--~ function newflush(...)
+--~ oldflush(...)
+--~ yield(true)
+--~ end
+--~ setflush(newflush)
+--~
+--~ -- local function resumecontext()
+--~ -- local done = resume(routine)
+--~ -- if not done then
+--~ -- return
+--~ -- end
+--~ -- resumecontext() -- stack overflow ... no tail recursion
+--~ -- end
+--~ -- context.resume = resumecontext
+--~ -- texsprint(ctxcatcodes,"\\ctxlua{context.resume()}")
+--~
+--~ local function resumecontext()
+--~ local done = resume(routine)
+--~ if not done then
+--~ return
+--~ end
+--~ -- texsprint(ctxcatcodes,"\\exitloop")
+--~ texsprint(ctxcatcodes,"\\ctxlua{context.resume()}") -- can be simple macro call
+--~ end
+--~ context.resume = resumecontext
+--~ -- texsprint(ctxcatcodes,"\\doloop{\\ctxlua{context.resume()}}") -- can be fast loop at the tex end
+--~ texsprint(ctxcatcodes,"\\ctxlua{context.resume()}")
+--~
+--~ end
+--~
+--~ function something()
+--~ context("\\setbox0")
+--~ context("\\hbox{hans hagen xx}")
+--~ context("\\the\\wd0/\\box0")
+--~ end
+--~
+--~ context.direct(something)
+
+-- helpers:
+
+function context.concat(t,separator)
+ local done = false
+ for i=1,#t do
+ local ti = t[i]
+ if ti ~= "" then
+ if done then
+ context(separator)
+ end
+ context(ti)
+ done = true
+ end
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/cldf-ini.mkiv b/Master/texmf-dist/tex/context/base/cldf-ini.mkiv
new file mode 100644
index 00000000000..8aef17f9340
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cldf-ini.mkiv
@@ -0,0 +1,40 @@
+%D \module
+%D [ file=cldf-ini,
+%D version=2010.10.19,,
+%D title=\CONTEXT\ \LUA\ Document Functions,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=Hans Hagen]
+%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 Documents / Initialization}
+
+\registerctxluafile{cldf-ini}{1.001}
+
+%D With each new update of \MKIV\ we can join Within Temptation in
+%D singing:
+%D
+%D \startbuffer
+%D \startluacode
+%D context("I go faster%s",string.rep(" and faster",6))
+%D \stopluacode
+%D
+%D \cldcontext{"I go faster\letterpercent s",
+%D string.rep(" and faster",6)}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\cldf#1{\directlua\zerocount{_cldf_(#1)}} % global (functions)
+\def\cldn#1{\directlua\zerocount{_cldn_(#1)}} % global (nodes)
+
+\normalprotected\def\cldprocessfile#1{\directlua\zerocount{context.runfile("#1")}}
+ \def\cldcontext #1{\directlua\zerocount{context(#1)}}
+ \def\cldcommand #1{\directlua\zerocount{context.#1}}
+ % \def\cldverbatim #1{\directlua\zerocount{context.verbatim.#1}} % maybe make verbatim global
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/mult-clm.lua b/Master/texmf-dist/tex/context/base/cldf-int.lua
index 8838ea532d5..2291fd849f0 100644
--- a/Master/texmf-dist/tex/context/base/mult-clm.lua
+++ b/Master/texmf-dist/tex/context/base/cldf-int.lua
@@ -7,6 +7,8 @@ if not modules then modules = { } end modules ['mult-clm'] = {
}
-- another experiment
+-- needs upgrading
+-- needs checking
-- todo: multilingual
local texsprint, ctxcatcodes, vrbcatcodes = tex.sprint, tex.ctxcatcodes, tex.vrbcatcodes
@@ -15,9 +17,10 @@ local unpack = unpack or table.unpack
local trace_define = false trackers.register("context.define", function(v) trace_define = v end)
-mkiv = mkiv or { }
+interfaces = interfaces or { }
-mkiv.h, mkiv.a = aux.settings_to_hash, aux.settings_to_array
+_clmh_ = utilities.parsers.settings_to_array
+_clma_ = utilities.parsers.settings_to_array
local starters, stoppers, macros, stack = { }, { }, { }, { }
@@ -30,17 +33,17 @@ local checkers = {
"\\dosixtupleempty",
}
-function mkiv.m(name,...)
+function _clmm_(name,...)
macros[name](...)
end
-function mkiv.b(name,...)
+function _clmb_(name,...)
local sn = stack[name]
insert(sn,{...})
starters[name](...)
end
-function mkiv.e(name)
+function _clme_(name)
local sn = stack[name]
local sv = remove(sn)
if sv then
@@ -50,9 +53,9 @@ function mkiv.e(name)
end
end
-mkiv.n = tonumber
+_clmn_ = tonumber
-function mkiv.define(name,specification) -- name is optional
+function interfaces.definecommand(name,specification) -- name is optional
if type(name) == "table" then
specification = name
name = specification.name
@@ -63,20 +66,20 @@ function mkiv.define(name,specification) -- name is optional
local environment = specification.environment
if na == 0 then
if environment then
- texsprint(ctxcatcodes,"\\defmkstart{",name,"}{\\ctxlua{mkiv.b('",name,"')}}")
- texsprint(ctxcatcodes,"\\defmkstop{", name,"}{\\ctxlua{mkiv.b('",name,"')}}")
+ texsprint(ctxcatcodes,"\\clmb{",name,"}{\\ctxlua{_clmb_('",name,"')}}")
+ texsprint(ctxcatcodes,"\\clme{",name,"}{\\ctxlua{_clme_('",name,"')}}")
else
- texsprint(ctxcatcodes,"\\defmkiv{", name,"}{\\ctxlua{mkiv.m('",name,"')}}")
+ texsprint(ctxcatcodes,"\\clmm{",name,"}{\\ctxlua{_clmm_('",name,"')}}")
end
else
stack[name] = { }
local opt, done = 0, false
- local mkivdo = "\\mkivdo" .. name
+ local mkivdo = "\\mkivdo" .. name -- maybe clddo
texsprint(ctxcatcodes,"\\def",mkivdo)
for i=1,na do
local a = arguments[i]
- local kind = a[1]
- if kind == "option" then
+ local variant = a[1]
+ if variant == "option" then
texsprint(ctxcatcodes,"[#",i,"]")
if not done then
opt = opt + 1
@@ -87,29 +90,29 @@ function mkiv.define(name,specification) -- name is optional
end
end
if environment then
- texsprint(ctxcatcodes,"{\\ctxlua{mkiv.b('",name,"'")
+ texsprint(ctxcatcodes,"{\\ctxlua{_clmb_('",name,"'")
else
- texsprint(ctxcatcodes,"{\\ctxlua{mkiv.m('",name,"'")
+ texsprint(ctxcatcodes,"{\\ctxlua{_clmm_('",name,"'")
end
for i=1,na do
local a = arguments[i]
- local kind = a[2]
- if kind == "list" then
- texsprint(ctxcatcodes,",mkiv.a([[#",i,"]])")
- elseif kind == "hash" then
- texsprint(ctxcatcodes,",mkiv.h([[#",i,"]])")
- elseif kind == "number" then
- texsprint(ctxcatcodes,",mkiv.n([[#",i,"]])")
+ local variant = a[2]
+ if variant == "list" then
+ texsprint(ctxcatcodes,",_clma_([[#",i,"]])")
+ elseif variant == "hash" then
+ texsprint(ctxcatcodes,",_clmh_([[#",i,"]])")
+ elseif variant == "number" then
+ texsprint(ctxcatcodes,",_clmn_([[#",i,"]])")
else
texsprint(ctxcatcodes,",[[#",i,"]]")
end
end
texsprint(ctxcatcodes,")}}")
if environment then
- texsprint(ctxcatcodes,"\\defmkivstop{" ,name,"}{\\ctxlua{mkiv.e('",name,"')}}")
- texsprint(ctxcatcodes,"\\defmkivstart{",name,"}{",checkers[opt],mkivdo,"}")
+ texsprint(ctxcatcodes,"\\clme{",name,"}{\\ctxlua{_clme_('",name,"')}}")
+ texsprint(ctxcatcodes,"\\clmb{",name,"}{",checkers[opt],mkivdo,"}")
else
- texsprint(ctxcatcodes,"\\defmkiv{", name,"}{",checkers[opt],mkivdo,"}")
+ texsprint(ctxcatcodes,"\\clmm{",name,"}{",checkers[opt],mkivdo,"}")
end
end
if environment then
@@ -121,14 +124,16 @@ function mkiv.define(name,specification) -- name is optional
end
end
-function mkiv.tolist(t)
+function interfaces.tolist(t)
local r = { }
for i=1,#t do
r[i] = t[i]
end
+ local n = #r
for k,v in table.sortedhash(t) do
if type(k) ~= "number" then
- r[#r+1] = k .. "=" .. v
+ n = n + 1
+ r[n] = k .. "=" .. v
end
end
return concat(r,", ")
@@ -137,15 +142,15 @@ end
--~ \startluacode
--~ function test(opt_1, opt_2, arg_1)
--~ context.startnarrower()
---~ context("options 1: %s",mkiv.tolist(opt_1))
+--~ context("options 1: %s",interfaces.tolist(opt_1))
--~ context.par()
---~ context("options 2: %s",mkiv.tolist(opt_2))
+--~ context("options 2: %s",interfaces.tolist(opt_2))
--~ context.par()
--~ context("argument 1: %s",arg_1)
--~ context.stopnarrower()
--~ end
---~ mkiv.define {
+--~ interfaces.definecommand {
--~ name = "test",
--~ arguments = {
--~ { "option", "list" },
@@ -161,17 +166,17 @@ end
--~ \startluacode
--~ local function startmore(opt_1)
--~ context.startnarrower()
---~ context("start more, options: %s",mkiv.tolist(opt_1))
+--~ context("start more, options: %s",interfaces.tolist(opt_1))
--~ context.startnarrower()
--~ end
--~ local function stopmore(opt_1)
--~ context.stopnarrower()
---~ context("stop more, options: %s",mkiv.tolist(opt_1))
+--~ context("stop more, options: %s",interfaces.tolist(opt_1))
--~ context.stopnarrower()
--~ end
---~ mkiv.define ( "more", {
+--~ interfaces.definecommand ( "more", {
--~ environment = true,
--~ arguments = {
--~ { "option", "list" },
diff --git a/Master/texmf-dist/tex/context/base/mult-cld.mkiv b/Master/texmf-dist/tex/context/base/cldf-int.mkiv
index 1c5ebd34af3..cedac8fc0e2 100644
--- a/Master/texmf-dist/tex/context/base/mult-cld.mkiv
+++ b/Master/texmf-dist/tex/context/base/cldf-int.mkiv
@@ -11,19 +11,14 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D This is just an idea, maybe a bad one.
-
\writestatus{loading}{ConTeXt Multilingual Macros / Lua}
-\registerctxluafile{mult-cld}{1.001}
-\registerctxluafile{mult-clm}{1.001}
+\registerctxluafile{cldf-int}{1.001}
\unprotect
-\def\defmkivstart#1{\unexpanded\expandafter\def\csname\e!start#1\endcsname}
-\def\defmkivstop #1{\unexpanded\def\csname\e!stop #1\endcsname}
-\def\defmkiv #1{\unexpanded\def\csname #1\endcsname}
-
-\def\mkivflush #1{\ctxlua{context._flush_(#1)}}
+\unexpanded\def\clmb#1{\unexpanded\expandafter\def\csname\e!start#1\endcsname}
+\unexpanded\def\clme#1{\unexpanded\expandafter\def\csname\e!stop #1\endcsname}
+\unexpanded\def\clmm#1{\unexpanded\expandafter\def\csname #1\endcsname}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/cldf-ver.lua b/Master/texmf-dist/tex/context/base/cldf-ver.lua
new file mode 100644
index 00000000000..fc681e83047
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cldf-ver.lua
@@ -0,0 +1,73 @@
+if not modules then modules = { } end modules ['cldf-ver'] = {
+ version = 1.001,
+ comment = "companion to cldf-ver.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- tex.print == line with endlinechar appended
+
+local concat, tohandle = table.concat, table.tohandle
+local find, splitlines = string.find, string.splitlines
+local tostring, type = tostring, type
+
+local context = context
+
+local function flush(...)
+ context(concat{...,"\r"}) -- was \n
+end
+
+local function t_tocontext(...)
+ context.starttyping { "typing" } -- else [1] is intercepted
+ context.pushcatcodes("verbatim")
+ tohandle(flush,...) -- ok?
+ context.stoptyping()
+ context.popcatcodes()
+end
+
+local function s_tocontext(...) -- we need to catch {\}
+ context.type()
+ context("{")
+ context.pushcatcodes("verbatim")
+ context(concat({...}," "))
+ context.popcatcodes()
+ context("}")
+end
+
+local function b_tocontext(b)
+ s_tocontext(tostring(b))
+end
+
+table .tocontext = t_tocontext
+string .tocontext = s_tocontext
+boolean.tocontext = b_tocontext
+
+function tocontext(first,...)
+ local t = type(first)
+ if t == "string" then
+ s_tocontext(first,...)
+ elseif t == "table" then
+ t_tocontext(first,...)
+ elseif t == "boolean" then
+ b_tocontext(first,...)
+ end
+end
+
+function context.tobuffer(name,str)
+ context.startbuffer { name }
+ context.pushcatcodes("verbatim")
+ local lines = (type(str) == "string" and find(str,"[\n\r]") and splitlines(str)) or str
+ for i=1,#lines do
+ context(lines[i] .. " ")
+ end
+ context.stopbuffer()
+ context.popcatcodes()
+end
+
+function context.tolines(str)
+ local lines = type(str) == "string" and splitlines(str) or str
+ for i=1,#lines do
+ context(lines[i] .. " ")
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/cldf-ver.mkiv b/Master/texmf-dist/tex/context/base/cldf-ver.mkiv
new file mode 100644
index 00000000000..f85b28a0cf0
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cldf-ver.mkiv
@@ -0,0 +1,18 @@
+%D \module
+%D [ file=cldf-com,
+%D version=2010.10.19,,
+%D title=\CONTEXT\ \LUA\ Document Functions,
+%D subtitle=Verbatim,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=Hans Hagen]
+%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 Documents / Verbatim}
+
+\registerctxluafile{cldf-ver}{1.001}
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/colo-ema.tex b/Master/texmf-dist/tex/context/base/colo-ema.mkii
index e5e90b2355e..e5e90b2355e 100644
--- a/Master/texmf-dist/tex/context/base/colo-ema.tex
+++ b/Master/texmf-dist/tex/context/base/colo-ema.mkii
diff --git a/Master/texmf-dist/tex/context/base/colo-ext.mkiv b/Master/texmf-dist/tex/context/base/colo-ext.mkiv
index b17608f59c1..771974d4d4f 100644
--- a/Master/texmf-dist/tex/context/base/colo-ext.mkiv
+++ b/Master/texmf-dist/tex/context/base/colo-ext.mkiv
@@ -76,14 +76,25 @@
\setupcolors[\c!intent=\v!none]
% A goodie that replaces the startMPcolor hackery
-%
+
% \definecolor[red-t] [r=1,t=0.5,a=1]
% \definecolor[green-t][g=1,t=0.5,a=1]
+%
% \defineintermediatecolor[mycolora][0.5,red,green]
% \defineintermediatecolor[mycolorb][0.5,red-t,green-t]
+%
+% \definecolor[mycolorc][.5(blue,red)]
+% \definecolor[mycolord][.5(blue)]
+%
+% \enabledirectives[colors.pgf]
+% \definecolor[mycolorx][magenta!50!yellow]
+%
% \starttext
% test {\mycolora OEPS} test
% test {\mycolorb OEPS} test
+% test {\mycolorc OEPS} test
+% test {\mycolord OEPS} test
+% test {\mycolorx OEPS} test
% \stoptext
\unexpanded\def\defineintermediatecolor
@@ -94,7 +105,7 @@
\def\dododefineintermediatecolor[#1][#2,#3,#4][#5]%
{\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
- \ctxlua{colors.defineintermediatecolor("#1","#2",
+ \ctxcommand{defineintermediatecolor("#1","#2",
\thecolorattribute{#3},\thecolorattribute{#4},
\thetransparencyattribute{#3},\thetransparencyattribute{#4},
"#5",false,\iffreezecolors true\else false\fi)}% not global
diff --git a/Master/texmf-dist/tex/context/base/colo-hex.mkiv b/Master/texmf-dist/tex/context/base/colo-hex.mkiv
deleted file mode 100644
index f661b2445f1..00000000000
--- a/Master/texmf-dist/tex/context/base/colo-hex.mkiv
+++ /dev/null
@@ -1,28 +0,0 @@
-%D \module
-%D [ file=colo-hex,
-%D version=2004.06.23,
-%D title=\CONTEXT\ Color Macros,
-%D subtitle=Hex Colors,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 built in.
-
-% \definecolor[rgbtestcolor] [r=0.87843,g=0.87451,b=0.89020] % RGB(224,223,227)
-% \definecolor[hextestcolor] [\letterhash E0DFE3] % or [h=E0DFE3]
-%
-% \startMPpage
-% path p ; % example by Peter Rolf
-% p := unitsquare xyscaled(5cm,5cm) ;
-% fill (point 0 of p -- point 1 of p -- point 2 of p --cycle) withcolor \MPcolor{rgbtestcolor} ; % bottom right part of the square
-% fill (point 0 of p -- point 3 of p -- point 2 of p --cycle) withcolor \MPcolor{hextestcolor} ; % top left part
-% \stopMPpage
-
-\def\checkhexcolor[#1]{\doifcolorelse{#1}\donothing{\definecolor[#1][x=#1]}} % is this ok?
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/colo-hex.tex b/Master/texmf-dist/tex/context/base/colo-hex.tex
deleted file mode 100644
index 7d223c131d9..00000000000
--- a/Master/texmf-dist/tex/context/base/colo-hex.tex
+++ /dev/null
@@ -1,3 +0,0 @@
-% this is just a stub
-
-\loadmarkfile{colo-hex}
diff --git a/Master/texmf-dist/tex/context/base/colo-icc.lua b/Master/texmf-dist/tex/context/base/colo-icc.lua
new file mode 100644
index 00000000000..904d42143d4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/colo-icc.lua
@@ -0,0 +1,120 @@
+if not modules then modules = { } end modules ['colo-ini'] = {
+ version = 1.000,
+ comment = "companion to colo-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local char, byte, gsub, match, format, strip = string.char, string.byte, string.gsub, string.match, string.format, string.strip
+local readstring, readnumber = io.readstring, io.readnumber
+
+local colors = attributes and attributes.colors or { } -- when used in mtxrun
+
+local report_colors = logs.reporter("colors","icc")
+
+local R, Cs, lpegmatch = lpeg.R, lpeg.Cs, lpeg.match
+
+local invalid = R(char(0)..char(31))
+local cleaned = invalid^0 * Cs((1-invalid)^0)
+
+function colors.iccprofile(filename,verbose)
+ local fullname = resolvers.findfile(filename,"icc") or ""
+ if fullname == "" then
+ local locate = resolvers.finders.byscheme -- not in mtxrun
+ if locate then
+ fullname = locate("loc",filename)
+ end
+ end
+ if fullname == "" then
+ return nil, false, format("profile '%s' cannot be found",filename)
+ end
+ local f = io.open(fullname,"rb")
+ if not f then
+ return nil, false, format("profile '%s'cannot be loaded",fullname)
+ end
+ local header = {
+ size = readnumber(f,4),
+ cmmtype = readnumber(f,4),
+ version = readnumber(f,4),
+ deviceclass = strip(readstring(f,4)),
+ colorspace = strip(readstring(f,4)),
+ connectionspace = strip(readstring(f,4)),
+ datetime = {
+ year = readnumber(f,2),
+ month = readnumber(f,2),
+ day = readnumber(f,2),
+ hour = readnumber(f,2),
+ minutes = readnumber(f,2),
+ seconds = readnumber(f,2),
+ },
+ filesignature = strip(readstring(f,4)),
+ platformsignature = strip(readstring(f,4)),
+ options = readnumber(f,4),
+ devicemanufacturer = strip(readstring(f,4)),
+ devicemodel = strip(readstring(f,4)),
+ deviceattributes = readnumber(f,4),
+ renderingintent = readnumber(f,4),
+ illuminantxyz = {
+ x = readnumber(f,4),
+ y = readnumber(f,4),
+ z = readnumber(f,4),
+ },
+ profilecreator = readnumber(f,4),
+ id = strip(readstring(f,16)),
+ }
+ local tags = { }
+ for i=1,readnumber(f,128,4) do
+ tags[readstring(f,4)] = {
+ offset = readnumber(f,4),
+ length = readnumber(f,4),
+ }
+ end
+ local o = header.options
+ header.options =
+ o == 0 and "embedded" or
+ o == 1 and "dependent" or "unknown"
+ local d = header.deviceattributes
+ header.deviceattributes = {
+ [number.hasbit(d,1) and "transparency" or "reflective"] = true,
+ [number.hasbit(d,2) and "mate" or "glossy" ] = true,
+ [number.hasbit(d,3) and "negative" or "positive" ] = true,
+ [number.hasbit(d,4) and "bw" or "color" ] = true,
+ }
+ local r = header.renderingintent
+ header.renderingintent =
+ r == 0 and "perceptual" or
+ r == 1 and "relative" or
+ r == 2 and "saturation" or
+ r == 3 and "absolute" or "unknown"
+ for tag, spec in next, tags do
+ if tag then
+ local offset, length = spec.offset, spec.length
+ local variant = readstring(f,offset,4)
+ if variant == "text" or variant == "desc" then
+ local str = readstring(f,length-4)
+ tags[tag] = {
+ data = str,
+ cleaned = lpegmatch(cleaned,str),
+ }
+ else
+ if verbose then
+ report_colors("ignoring tag '%s' or type '%s' in profile '%s'",tag,variant,fullname)
+ end
+ tags[tag] = nil
+ end
+ end
+ end
+ f:close()
+ local profile = {
+ filename = filename,
+ fullname = fullname,
+ header = header,
+ tags = tags,
+ }
+ return profile, true, format("profile '%s' loaded",fullname)
+end
+
+--~ local profile, error, message = colors.iccprofile("ussheetfedcoated.icc")
+--~ print(error,message)
+--~ table.print(profile)
diff --git a/Master/texmf-dist/tex/context/base/colo-imp-ema.mkiv b/Master/texmf-dist/tex/context/base/colo-imp-ema.mkiv
new file mode 100644
index 00000000000..e5e90b2355e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/colo-imp-ema.mkiv
@@ -0,0 +1,590 @@
+%D \module
+%D [ file=colo-ema,
+%D version=2003.03.20,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=Emacs Colors,
+%D author=Peter Rolf,
+%D date=\currentdate,
+%D copyright=PRAGMA ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% author : Peter Rolf <peter.rolf@arcor.de>
+% last change : 17 march 2003
+% origin : /emacs/etc/rgb.txt
+%
+% USAGE:
+%
+% - select emacs menu: Edit -> Text Properties -> Display
+% Colors, if you don't know what I'm talking about
+% - copy this file to your /texmf/tex/context/user directory
+% and add "\input colo-emacs" to your tex-file
+%
+% IMPORTANT NOTES:
+%
+% - all color names are written as ONE word in lowercase
+% letters (no redundancy as in rgb.txt) so if you want to
+% use the color "Light Sky Blue"/"light sky blue" it's new
+% name is lightskyblue
+% - the grayX values [X=0..100] can only be used with \color
+% [grayX]
+% - use it at your own risk :)
+%
+% HINT:
+%
+% I only include this file (\showcolor [ema]) until I've
+% found the colors I want. Copy and paste the color
+% definitions to a seperate file, to decrease compilation
+% time (540 color definitions).
+
+\definecolor [snow] [r=1,g=.980392,b=.980392]
+\definecolor [ghostwhite] [r=.972549,g=.972549,b=1]
+\definecolor [whitesmoke] [s=.960784]
+\definecolor [gainsboro] [s=.862745]
+\definecolor [floralwhite] [r=1,g=.980392,b=.941176]
+\definecolor [oldlace] [r=.992157,g=.960784,b=.901961]
+\definecolor [linen] [r=.980392,g=.941176,b=.901961]
+\definecolor [antiquewhite] [r=.980392,g=.921569,b=.843137]
+\definecolor [papayawhip] [r=1,g=.937255,b=.835294]
+\definecolor [blanchedalmond] [r=1,g=.921569,b=.803922]
+\definecolor [bisque] [r=1,g=.894118,b=.768627]
+\definecolor [peachpuff] [r=1,g=.854902,b=.72549]
+\definecolor [navajowhite] [r=1,g=.870588,b=.678431]
+\definecolor [moccasin] [r=1,g=.894118,b=.709804]
+\definecolor [cornsilk] [r=1,g=.972549,b=.862745]
+\definecolor [ivory] [r=1,g=1,b=.941176]
+\definecolor [lemonchiffon] [r=1,g=.980392,b=.803922]
+\definecolor [seashell] [r=1,g=.960784,b=.933333]
+\definecolor [honeydew] [r=.941176,g=1,b=.941176]
+\definecolor [mintcream] [r=.960784,g=1,b=.980392]
+\definecolor [azure] [r=.941176,g=1,b=1]
+\definecolor [aliceblue] [r=.941176,g=.972549,b=1]
+\definecolor [lavender] [r=.901961,g=.901961,b=.980392]
+\definecolor [lavenderblush] [r=1,g=.941176,b=.960784]
+\definecolor [mistyrose] [r=1,g=.894118,b=.882353]
+%definecolor[white] [s=1]
+%definecolor[black] [s=0]
+\definecolor [darkslategray] [r=.184314,g=.309804,b=.309804]
+\definecolor [dimgray] [s=.411765]
+\definecolor [slategray] [r=.439216,g=.501961,b=.564706]
+\definecolor [lightslategray] [r=.466667,g=.533333,b=.6]
+\definecolor [gray] [s=.745098]
+\definecolor [lightgray] [s=.827451]
+\definecolor [midnightblue] [r=.098039,g=.098039,b=.439216]
+\definecolor [navy] [b=.501961]
+\definecolor [navyblue] [navy]
+\definecolor [cornflowerblue] [r=.392157,g=.584314,b=.929412]
+\definecolor [darkslateblue] [r=.282353,g=.239216,b=.545098]
+\definecolor [slateblue] [r=.415686,g=.352941,b=.803922]
+\definecolor [mediumslateblue] [r=.482353,g=.407843,b=.933333]
+\definecolor [lightslateblue] [r=.517647,g=.439216,b=1]
+\definecolor [mediumblue] [b=.803922]
+\definecolor [royalblue] [r=.254902,g=.411765,b=.882353]
+%definecolor[blue] [b=1]
+\definecolor [dodgerblue] [r=.117647,g=.564706,b=1]
+\definecolor [deepskyblue] [g=.74902,b=1]
+\definecolor [skyblue] [r=.529412,g=.807843,b=.921569]
+\definecolor [lightskyblue] [r=.529412,g=.807843,b=.980392]
+\definecolor [steelblue] [r=.27451,g=.509804,b=.705882]
+\definecolor [lightsteelblue] [r=.690196,g=.768627,b=.870588]
+\definecolor [lightblue] [r=.678431,g=.847059,b=.901961]
+\definecolor [powderblue] [r=.690196,g=.878431,b=.901961]
+\definecolor [paleturquoise] [r=.686275,g=.933333,b=.933333]
+\definecolor [darkturquoise] [g=.807843,b=.819608]
+\definecolor [mediumturquoise] [r=.282353,g=.819608,b=.8]
+\definecolor [turquoise] [r=.25098,g=.878431,b=.815686]
+%definecolor[cyan] [g=1,b=1]
+\definecolor [lightcyan] [r=.878431,g=1,b=1]
+\definecolor [cadetblue] [r=.372549,g=.619608,b=.627451]
+\definecolor [mediumaquamarine] [r=.4,g=.803922,b=.666667]
+\definecolor [aquamarine] [r=.498039,g=1,b=.831373]
+\definecolor [darkgreen] [g=.392157]
+\definecolor [darkolivegreen] [r=.333333,g=.419608,b=.184314]
+\definecolor [darkseagreen] [r=.560784,g=.737255,b=.560784]
+\definecolor [seagreen] [r=.180392,g=.545098,b=.341176]
+\definecolor [mediumseagreen] [r=.235294,g=.701961,b=.443137]
+\definecolor [lightseagreen] [r=.12549,g=.698039,b=.666667]
+\definecolor [palegreen] [r=.596078,g=.984314,b=.596078]
+\definecolor [springgreen] [g=1,b=.498039]
+\definecolor [lawngreen] [r=.486275,g=.988235]
+%definecolor[green] [g=1]
+\definecolor [chartreuse] [r=.498039,g=1]
+\definecolor [mediumspringgreen] [g=.980392,b=.603922]
+\definecolor [greenyellow] [r=.678431,g=1,b=.184314]
+\definecolor [limegreen] [r=.196078,g=.803922,b=.196078]
+\definecolor [yellowgreen] [r=.603922,g=.803922,b=.196078]
+\definecolor [forestgreen] [r=.133333,g=.545098,b=.133333]
+\definecolor [olivedrab] [r=.419608,g=.556863,b=.137255]
+\definecolor [darkkhaki] [r=.741176,g=.717647,b=.419608]
+\definecolor [khaki] [r=.941176,g=.901961,b=.54902]
+\definecolor [palegoldenrod] [r=.933333,g=.909804,b=.666667]
+\definecolor [lightgoldenrodyellow] [r=.980392,g=.980392,b=.823529]
+\definecolor [lightyellow] [r=1,g=1,b=.878431]
+%definecolor[yellow] [r=1,g=1]
+\definecolor [gold] [r=1,g=.843137]
+\definecolor [lightgoldenrod] [r=.933333,g=.866667,b=.509804]
+\definecolor [goldenrod] [r=.854902,g=.647059,b=.12549]
+\definecolor [darkgoldenrod] [r=.721569,g=.52549,b=.043137]
+\definecolor [rosybrown] [r=.737255,g=.560784,b=.560784]
+\definecolor [indianred] [r=.803922,g=.360784,b=.360784]
+\definecolor [saddlebrown] [r=.545098,g=.270588,b=.07451]
+\definecolor [sienna] [r=.627451,g=.321569,b=.176471]
+\definecolor [peru] [r=.803922,g=.521569,b=.247059]
+\definecolor [burlywood] [r=.870588,g=.721569,b=.529412]
+\definecolor [beige] [r=.960784,g=.960784,b=.862745]
+\definecolor [wheat] [r=.960784,g=.870588,b=.701961]
+\definecolor [sandybrown] [r=.956863,g=.643137,b=.376471]
+\definecolor [tan] [r=.823529,g=.705882,b=.54902]
+\definecolor [chocolate] [r=.823529,g=.411765,b=.117647]
+\definecolor [firebrick] [r=.698039,g=.133333,b=.133333]
+\definecolor [brown] [r=.647059,g=.164706,b=.164706]
+\definecolor [darksalmon] [r=.913725,g=.588235,b=.478431]
+\definecolor [salmon] [r=.980392,g=.501961,b=.447059]
+\definecolor [lightsalmon] [r=1,g=.627451,b=.478431]
+\definecolor [orange] [r=1,g=.647059]
+\definecolor [darkorange] [r=1,g=.54902]
+\definecolor [coral] [r=1,g=.498039,b=.313725]
+\definecolor [lightcoral] [r=.941176,g=.501961,b=.501961]
+\definecolor [tomato] [r=1,g=.388235,b=.278431]
+\definecolor [orangered] [r=1,g=.270588]
+%definecolor[red] [r=1]
+\definecolor [hotpink] [r=1,g=.411765,b=.705882]
+\definecolor [deeppink] [r=1,g=.078431,b=.576471]
+\definecolor [pink] [r=1,g=.752941,b=.796078]
+\definecolor [lightpink] [r=1,g=.713725,b=.756863]
+\definecolor [palevioletred] [r=.858824,g=.439216,b=.576471]
+\definecolor [maroon] [r=.690196,g=.188235,b=.376471]
+\definecolor [mediumvioletred] [r=.780392,g=.082353,b=.521569]
+\definecolor [violetred] [r=.815686,g=.12549,b=.564706]
+%definecolor[magenta] [r=1,b=1]
+\definecolor [violet] [r=.933333,g=.509804,b=.933333]
+\definecolor [plum] [r=.866667,g=.627451,b=.866667]
+\definecolor [orchid] [r=.854902,g=.439216,b=.839216]
+\definecolor [mediumorchid] [r=.729412,g=.333333,b=.827451]
+\definecolor [darkorchid] [r=.6,g=.196078,b=.8]
+\definecolor [darkviolet] [r=.580392,b=.827451]
+\definecolor [blueviolet] [r=.541176,g=.168627,b=.886275]
+\definecolor [purple] [r=.627451,g=.12549,b=.941176]
+\definecolor [mediumpurple] [r=.576471,g=.439216,b=.858824]
+\definecolor [thistle] [r=.847059,g=.74902,b=.847059]
+\definecolor [snow1] [r=1,g=.980392,b=.980392]
+\definecolor [snow2] [r=.933333,g=.913725,b=.913725]
+\definecolor [snow3] [r=.803922,g=.788235,b=.788235]
+\definecolor [snow4] [r=.545098,g=.537255,b=.537255]
+\definecolor [seashell1] [r=1,g=.960784,b=.933333]
+\definecolor [seashell2] [r=.933333,g=.898039,b=.870588]
+\definecolor [seashell3] [r=.803922,g=.772549,b=.74902]
+\definecolor [seashell4] [r=.545098,g=.52549,b=.509804]
+\definecolor [antiquewhite1] [r=1,g=.937255,b=.858824]
+\definecolor [antiquewhite2] [r=.933333,g=.87451,b=.8]
+\definecolor [antiquewhite3] [r=.803922,g=.752941,b=.690196]
+\definecolor [antiquewhite4] [r=.545098,g=.513725,b=.470588]
+\definecolor [bisque1] [r=1,g=.894118,b=.768627]
+\definecolor [bisque2] [r=.933333,g=.835294,b=.717647]
+\definecolor [bisque3] [r=.803922,g=.717647,b=.619608]
+\definecolor [bisque4] [r=.545098,g=.490196,b=.419608]
+\definecolor [peachpuff1] [r=1,g=.854902,b=.72549]
+\definecolor [peachpuff2] [r=.933333,g=.796078,b=.678431]
+\definecolor [peachpuff3] [r=.803922,g=.686275,b=.584314]
+\definecolor [peachpuff4] [r=.545098,g=.466667,b=.396078]
+\definecolor [navajowhite1] [r=1,g=.870588,b=.678431]
+\definecolor [navajowhite2] [r=.933333,g=.811765,b=.631373]
+\definecolor [navajowhite3] [r=.803922,g=.701961,b=.545098]
+\definecolor [navajowhite4] [r=.545098,g=.47451,b=.368627]
+\definecolor [lemonchiffon1] [r=1,g=.980392,b=.803922]
+\definecolor [lemonchiffon2] [r=.933333,g=.913725,b=.74902]
+\definecolor [lemonchiffon3] [r=.803922,g=.788235,b=.647059]
+\definecolor [lemonchiffon4] [r=.545098,g=.537255,b=.439216]
+\definecolor [cornsilk1] [r=1,g=.972549,b=.862745]
+\definecolor [cornsilk2] [r=.933333,g=.909804,b=.803922]
+\definecolor [cornsilk3] [r=.803922,g=.784314,b=.694118]
+\definecolor [cornsilk4] [r=.545098,g=.533333,b=.470588]
+\definecolor [ivory1] [r=1,g=1,b=.941176]
+\definecolor [ivory2] [r=.933333,g=.933333,b=.878431]
+\definecolor [ivory3] [r=.803922,g=.803922,b=.756863]
+\definecolor [ivory4] [r=.545098,g=.545098,b=.513725]
+\definecolor [honeydew1] [r=.941176,g=1,b=.941176]
+\definecolor [honeydew2] [r=.878431,g=.933333,b=.878431]
+\definecolor [honeydew3] [r=.756863,g=.803922,b=.756863]
+\definecolor [honeydew4] [r=.513725,g=.545098,b=.513725]
+\definecolor [lavenderblush1] [r=1,g=.941176,b=.960784]
+\definecolor [lavenderblush2] [r=.933333,g=.878431,b=.898039]
+\definecolor [lavenderblush3] [r=.803922,g=.756863,b=.772549]
+\definecolor [lavenderblush4] [r=.545098,g=.513725,b=.52549]
+\definecolor [mistyrose1] [r=1,g=.894118,b=.882353]
+\definecolor [mistyrose2] [r=.933333,g=.835294,b=.823529]
+\definecolor [mistyrose3] [r=.803922,g=.717647,b=.709804]
+\definecolor [mistyrose4] [r=.545098,g=.490196,b=.482353]
+\definecolor [azure1] [r=.941176,g=1,b=1]
+\definecolor [azure2] [r=.878431,g=.933333,b=.933333]
+\definecolor [azure3] [r=.756863,g=.803922,b=.803922]
+\definecolor [azure4] [r=.513725,g=.545098,b=.545098]
+\definecolor [slateblue1] [r=.513725,g=.435294,b=1]
+\definecolor [slateblue2] [r=.478431,g=.403922,b=.933333]
+\definecolor [slateblue3] [r=.411765,g=.34902,b=.803922]
+\definecolor [slateblue4] [r=.278431,g=.235294,b=.545098]
+\definecolor [royalblue1] [r=.282353,g=.462745,b=1]
+\definecolor [royalblue2] [r=.262745,g=.431373,b=.933333]
+\definecolor [royalblue3] [r=.227451,g=.372549,b=.803922]
+\definecolor [royalblue4] [r=.152941,g=.25098,b=.545098]
+\definecolor [blue1] [blue]
+\definecolor [blue2] [b=.933333]
+\definecolor [blue3] [b=.803922]
+\definecolor [blue4] [b=.545098]
+\definecolor [dodgerblue1] [r=.117647,g=.564706,b=1]
+\definecolor [dodgerblue2] [r=.109804,g=.52549,b=.933333]
+\definecolor [dodgerblue3] [r=.094118,g=.454902,b=.803922]
+\definecolor [dodgerblue4] [r=.062745,g=.305882,b=.545098]
+\definecolor [steelblue1] [r=.388235,g=.721569,b=1]
+\definecolor [steelblue2] [r=.360784,g=.67451,b=.933333]
+\definecolor [steelblue3] [r=.309804,g=.580392,b=.803922]
+\definecolor [steelblue4] [r=.211765,g=.392157,b=.545098]
+\definecolor [deepskyblue1] [g=.74902,b=1]
+\definecolor [deepskyblue2] [g=.698039,b=.933333]
+\definecolor [deepskyblue3] [g=.603922,b=.803922]
+\definecolor [deepskyblue4] [g=.407843,b=.545098]
+\definecolor [skyblue1] [r=.529412,g=.807843,b=1]
+\definecolor [skyblue2] [r=.494118,g=.752941,b=.933333]
+\definecolor [skyblue3] [r=.423529,g=.65098,b=.803922]
+\definecolor [skyblue4] [r=.290196,g=.439216,b=.545098]
+\definecolor [lightskyblue1] [r=.690196,g=.886275,b=1]
+\definecolor [lightskyblue2] [r=.643137,g=.827451,b=.933333]
+\definecolor [lightskyblue3] [r=.552941,g=.713725,b=.803922]
+\definecolor [lightskyblue4] [r=.376471,g=.482353,b=.545098]
+\definecolor [slategray1] [r=.776471,g=.886275,b=1]
+\definecolor [slategray2] [r=.72549,g=.827451,b=.933333]
+\definecolor [slategray3] [r=.623529,g=.713725,b=.803922]
+\definecolor [slategray4] [r=.423529,g=.482353,b=.545098]
+\definecolor [lightsteelblue1] [r=.792157,g=.882353,b=1]
+\definecolor [lightsteelblue2] [r=.737255,g=.823529,b=.933333]
+\definecolor [lightsteelblue3] [r=.635294,g=.709804,b=.803922]
+\definecolor [lightsteelblue4] [r=.431373,g=.482353,b=.545098]
+\definecolor [lightblue1] [r=.74902,g=.937255,b=1]
+\definecolor [lightblue2] [r=.698039,g=.87451,b=.933333]
+\definecolor [lightblue3] [r=.603922,g=.752941,b=.803922]
+\definecolor [lightblue4] [r=.407843,g=.513725,b=.545098]
+\definecolor [lightcyan1] [r=.878431,g=1,b=1]
+\definecolor [lightcyan2] [r=.819608,g=.933333,b=.933333]
+\definecolor [lightcyan3] [r=.705882,g=.803922,b=.803922]
+\definecolor [lightcyan4] [r=.478431,g=.545098,b=.545098]
+\definecolor [paleturquoise1] [r=.733333,g=1,b=1]
+\definecolor [paleturquoise2] [r=.682353,g=.933333,b=.933333]
+\definecolor [paleturquoise3] [r=.588235,g=.803922,b=.803922]
+\definecolor [paleturquoise4] [r=.4,g=.545098,b=.545098]
+\definecolor [cadetblue1] [r=.596078,g=.960784,b=1]
+\definecolor [cadetblue2] [r=.556863,g=.898039,b=.933333]
+\definecolor [cadetblue3] [r=.478431,g=.772549,b=.803922]
+\definecolor [cadetblue4] [r=.32549,g=.52549,b=.545098]
+\definecolor [turquoise1] [g=.960784,b=1]
+\definecolor [turquoise2] [g=.898039,b=.933333]
+\definecolor [turquoise3] [g=.772549,b=.803922]
+\definecolor [turquoise4] [g=.52549,b=.545098]
+\definecolor [cyan1] [cyan]
+\definecolor [cyan2] [g=.933333,b=.933333]
+\definecolor [cyan3] [g=.803922,b=.803922]
+\definecolor [cyan4] [g=.545098,b=.545098]
+\definecolor [darkslategray1] [r=.592157,g=1,b=1]
+\definecolor [darkslategray2] [r=.552941,g=.933333,b=.933333]
+\definecolor [darkslategray3] [r=.47451,g=.803922,b=.803922]
+\definecolor [darkslategray4] [r=.321569,g=.545098,b=.545098]
+\definecolor [aquamarine1] [r=.498039,g=1,b=.831373]
+\definecolor [aquamarine2] [r=.462745,g=.933333,b=.776471]
+\definecolor [aquamarine3] [r=.4,g=.803922,b=.666667]
+\definecolor [aquamarine4] [r=.270588,g=.545098,b=.454902]
+\definecolor [darkseagreen1] [r=.756863,g=1,b=.756863]
+\definecolor [darkseagreen2] [r=.705882,g=.933333,b=.705882]
+\definecolor [darkseagreen3] [r=.607843,g=.803922,b=.607843]
+\definecolor [darkseagreen4] [r=.411765,g=.545098,b=.411765]
+\definecolor [seagreen1] [r=.329412,g=1,b=.623529]
+\definecolor [seagreen2] [r=.305882,g=.933333,b=.580392]
+\definecolor [seagreen3] [r=.262745,g=.803922,b=.501961]
+\definecolor [seagreen4] [r=.180392,g=.545098,b=.341176]
+\definecolor [palegreen1] [r=.603922,g=1,b=.603922]
+\definecolor [palegreen2] [r=.564706,g=.933333,b=.564706]
+\definecolor [palegreen3] [r=.486275,g=.803922,b=.486275]
+\definecolor [palegreen4] [r=.329412,g=.545098,b=.329412]
+\definecolor [springgreen1] [g=1,b=.498039]
+\definecolor [springgreen2] [g=.933333,b=.462745]
+\definecolor [springgreen3] [g=.803922,b=.4]
+\definecolor [springgreen4] [g=.545098,b=.270588]
+\definecolor [green1] [green]
+\definecolor [green2] [g=.933333]
+\definecolor [green3] [g=.803922]
+\definecolor [green4] [g=.545098]
+\definecolor [chartreuse1] [r=.498039,g=1]
+\definecolor [chartreuse2] [r=.462745,g=.933333]
+\definecolor [chartreuse3] [r=.4,g=.803922]
+\definecolor [chartreuse4] [r=.270588,g=.545098]
+\definecolor [olivedrab1] [r=.752941,g=1,b=.243137]
+\definecolor [olivedrab2] [r=.701961,g=.933333,b=.227451]
+\definecolor [olivedrab3] [r=.603922,g=.803922,b=.196078]
+\definecolor [olivedrab4] [r=.411765,g=.545098,b=.133333]
+\definecolor [darkolivegreen1] [r=.792157,g=1,b=.439216]
+\definecolor [darkolivegreen2] [r=.737255,g=.933333,b=.407843]
+\definecolor [darkolivegreen3] [r=.635294,g=.803922,b=.352941]
+\definecolor [darkolivegreen4] [r=.431373,g=.545098,b=.239216]
+\definecolor [khaki1] [r=1,g=.964706,b=.560784]
+\definecolor [khaki2] [r=.933333,g=.901961,b=.521569]
+\definecolor [khaki3] [r=.803922,g=.776471,b=.45098]
+\definecolor [khaki4] [r=.545098,g=.52549,b=.305882]
+\definecolor [lightgoldenrod1] [r=1,g=.92549,b=.545098]
+\definecolor [lightgoldenrod2] [r=.933333,g=.862745,b=.509804]
+\definecolor [lightgoldenrod3] [r=.803922,g=.745098,b=.439216]
+\definecolor [lightgoldenrod4] [r=.545098,g=.505882,b=.298039]
+\definecolor [lightyellow1] [r=1,g=1,b=.878431]
+\definecolor [lightyellow2] [r=.933333,g=.933333,b=.819608]
+\definecolor [lightyellow3] [r=.803922,g=.803922,b=.705882]
+\definecolor [lightyellow4] [r=.545098,g=.545098,b=.478431]
+\definecolor [yellow1] [yellow]
+\definecolor [yellow2] [r=.933333,g=.933333]
+\definecolor [yellow3] [r=.803922,g=.803922]
+\definecolor [yellow4] [r=.545098,g=.545098]
+\definecolor [gold1] [r=1,g=.843137]
+\definecolor [gold2] [r=.933333,g=.788235]
+\definecolor [gold3] [r=.803922,g=.678431]
+\definecolor [gold4] [r=.545098,g=.458824]
+\definecolor [goldenrod1] [r=1,g=.756863,b=.145098]
+\definecolor [goldenrod2] [r=.933333,g=.705882,b=.133333]
+\definecolor [goldenrod3] [r=.803922,g=.607843,b=.113725]
+\definecolor [goldenrod4] [r=.545098,g=.411765,b=.078431]
+\definecolor [darkgoldenrod1] [r=1,g=.72549,b=.058824]
+\definecolor [darkgoldenrod2] [r=.933333,g=.678431,b=.054902]
+\definecolor [darkgoldenrod3] [r=.803922,g=.584314,b=.047059]
+\definecolor [darkgoldenrod4] [r=.545098,g=.396078,b=.031373]
+\definecolor [rosybrown1] [r=1,g=.756863,b=.756863]
+\definecolor [rosybrown2] [r=.933333,g=.705882,b=.705882]
+\definecolor [rosybrown3] [r=.803922,g=.607843,b=.607843]
+\definecolor [rosybrown4] [r=.545098,g=.411765,b=.411765]
+\definecolor [indianred1] [r=1,g=.415686,b=.415686]
+\definecolor [indianred2] [r=.933333,g=.388235,b=.388235]
+\definecolor [indianred3] [r=.803922,g=.333333,b=.333333]
+\definecolor [indianred4] [r=.545098,g=.227451,b=.227451]
+\definecolor [sienna1] [r=1,g=.509804,b=.278431]
+\definecolor [sienna2] [r=.933333,g=.47451,b=.258824]
+\definecolor [sienna3] [r=.803922,g=.407843,b=.223529]
+\definecolor [sienna4] [r=.545098,g=.278431,b=.14902]
+\definecolor [burlywood1] [r=1,g=.827451,b=.607843]
+\definecolor [burlywood2] [r=.933333,g=.772549,b=.568627]
+\definecolor [burlywood3] [r=.803922,g=.666667,b=.490196]
+\definecolor [burlywood4] [r=.545098,g=.45098,b=.333333]
+\definecolor [wheat1] [r=1,g=.905882,b=.729412]
+\definecolor [wheat2] [r=.933333,g=.847059,b=.682353]
+\definecolor [wheat3] [r=.803922,g=.729412,b=.588235]
+\definecolor [wheat4] [r=.545098,g=.494118,b=.4]
+\definecolor [tan1] [r=1,g=.647059,b=.309804]
+\definecolor [tan2] [r=.933333,g=.603922,b=.286275]
+\definecolor [tan3] [r=.803922,g=.521569,b=.247059]
+\definecolor [tan4] [r=.545098,g=.352941,b=.168627]
+\definecolor [chocolate1] [r=1,g=.498039,b=.141176]
+\definecolor [chocolate2] [r=.933333,g=.462745,b=.129412]
+\definecolor [chocolate3] [r=.803922,g=.4,b=.113725]
+\definecolor [chocolate4] [r=.545098,g=.270588,b=.07451]
+\definecolor [firebrick1] [r=1,g=.188235,b=.188235]
+\definecolor [firebrick2] [r=.933333,g=.172549,b=.172549]
+\definecolor [firebrick3] [r=.803922,g=.14902,b=.14902]
+\definecolor [firebrick4] [r=.545098,g=.101961,b=.101961]
+\definecolor [brown1] [r=1,g=.25098,b=.25098]
+\definecolor [brown2] [r=.933333,g=.231373,b=.231373]
+\definecolor [brown3] [r=.803922,g=.2,b=.2]
+\definecolor [brown4] [r=.545098,g=.137255,b=.137255]
+\definecolor [salmon1] [r=1,g=.54902,b=.411765]
+\definecolor [salmon2] [r=.933333,g=.509804,b=.384314]
+\definecolor [salmon3] [r=.803922,g=.439216,b=.329412]
+\definecolor [salmon4] [r=.545098,g=.298039,b=.223529]
+\definecolor [lightsalmon1] [r=1,g=.627451,b=.478431]
+\definecolor [lightsalmon2] [r=.933333,g=.584314,b=.447059]
+\definecolor [lightsalmon3] [r=.803922,g=.505882,b=.384314]
+\definecolor [lightsalmon4] [r=.545098,g=.341176,b=.258824]
+\definecolor [orange1] [r=1,g=.647059]
+\definecolor [orange2] [r=.933333,g=.603922]
+\definecolor [orange3] [r=.803922,g=.521569]
+\definecolor [orange4] [r=.545098,g=.352941]
+\definecolor [darkorange1] [r=1,g=.498039]
+\definecolor [darkorange2] [r=.933333,g=.462745]
+\definecolor [darkorange3] [r=.803922,g=.4]
+\definecolor [darkorange4] [r=.545098,g=.270588]
+\definecolor [coral1] [r=1,g=.447059,b=.337255]
+\definecolor [coral2] [r=.933333,g=.415686,b=.313725]
+\definecolor [coral3] [r=.803922,g=.356863,b=.270588]
+\definecolor [coral4] [r=.545098,g=.243137,b=.184314]
+\definecolor [tomato1] [r=1,g=.388235,b=.278431]
+\definecolor [tomato2] [r=.933333,g=.360784,b=.258824]
+\definecolor [tomato3] [r=.803922,g=.309804,b=.223529]
+\definecolor [tomato4] [r=.545098,g=.211765,b=.14902]
+\definecolor [orangered1] [r=1,g=.270588]
+\definecolor [orangered2] [r=.933333,g=.25098]
+\definecolor [orangered3] [r=.803922,g=.215686]
+\definecolor [orangered4] [r=.545098,g=.145098]
+\definecolor [red1] [red]
+\definecolor [red2] [r=.933333]
+\definecolor [red3] [r=.803922]
+\definecolor [red4] [r=.545098]
+\definecolor [deeppink1] [r=1,g=.078431,b=.576471]
+\definecolor [deeppink2] [r=.933333,g=.070588,b=.537255]
+\definecolor [deeppink3] [r=.803922,g=.062745,b=.462745]
+\definecolor [deeppink4] [r=.545098,g=.039216,b=.313725]
+\definecolor [hotpink1] [r=1,g=.431373,b=.705882]
+\definecolor [hotpink2] [r=.933333,g=.415686,b=.654902]
+\definecolor [hotpink3] [r=.803922,g=.376471,b=.564706]
+\definecolor [hotpink4] [r=.545098,g=.227451,b=.384314]
+\definecolor [pink1] [r=1,g=.709804,b=.772549]
+\definecolor [pink2] [r=.933333,g=.662745,b=.721569]
+\definecolor [pink3] [r=.803922,g=.568627,b=.619608]
+\definecolor [pink4] [r=.545098,g=.388235,b=.423529]
+\definecolor [lightpink1] [r=1,g=.682353,b=.72549]
+\definecolor [lightpink2] [r=.933333,g=.635294,b=.678431]
+\definecolor [lightpink3] [r=.803922,g=.54902,b=.584314]
+\definecolor [lightpink4] [r=.545098,g=.372549,b=.396078]
+\definecolor [palevioletred1] [r=1,g=.509804,b=.670588]
+\definecolor [palevioletred2] [r=.933333,g=.47451,b=.623529]
+\definecolor [palevioletred3] [r=.803922,g=.407843,b=.537255]
+\definecolor [palevioletred4] [r=.545098,g=.278431,b=.364706]
+\definecolor [maroon1] [r=1,g=.203922,b=.701961]
+\definecolor [maroon2] [r=.933333,g=.188235,b=.654902]
+\definecolor [maroon3] [r=.803922,g=.160784,b=.564706]
+\definecolor [maroon4] [r=.545098,g=.109804,b=.384314]
+\definecolor [violetred1] [r=1,g=.243137,b=.588235]
+\definecolor [violetred2] [r=.933333,g=.227451,b=.54902]
+\definecolor [violetred3] [r=.803922,g=.196078,b=.470588]
+\definecolor [violetred4] [r=.545098,g=.133333,b=.321569]
+\definecolor [magenta1] [magenta]
+\definecolor [magenta2] [r=.933333,b=.933333]
+\definecolor [magenta3] [r=.803922,b=.803922]
+\definecolor [magenta4] [r=.545098,b=.545098]
+\definecolor [orchid1] [r=1,g=.513725,b=.980392]
+\definecolor [orchid2] [r=.933333,g=.478431,b=.913725]
+\definecolor [orchid3] [r=.803922,g=.411765,b=.788235]
+\definecolor [orchid4] [r=.545098,g=.278431,b=.537255]
+\definecolor [plum1] [r=1,g=.733333,b=1]
+\definecolor [plum2] [r=.933333,g=.682353,b=.933333]
+\definecolor [plum3] [r=.803922,g=.588235,b=.803922]
+\definecolor [plum4] [r=.545098,g=.4,b=.545098]
+\definecolor [mediumorchid1] [r=.878431,g=.4,b=1]
+\definecolor [mediumorchid2] [r=.819608,g=.372549,b=.933333]
+\definecolor [mediumorchid3] [r=.705882,g=.321569,b=.803922]
+\definecolor [mediumorchid4] [r=.478431,g=.215686,b=.545098]
+\definecolor [darkorchid1] [r=.74902,g=.243137,b=1]
+\definecolor [darkorchid2] [r=.698039,g=.227451,b=.933333]
+\definecolor [darkorchid3] [r=.603922,g=.196078,b=.803922]
+\definecolor [darkorchid4] [r=.407843,g=.133333,b=.545098]
+\definecolor [purple1] [r=.607843,g=.188235,b=1]
+\definecolor [purple2] [r=.568627,g=.172549,b=.933333]
+\definecolor [purple3] [r=.490196,g=.14902,b=.803922]
+\definecolor [purple4] [r=.333333,g=.101961,b=.545098]
+\definecolor [mediumpurple1] [r=.670588,g=.509804,b=1]
+\definecolor [mediumpurple2] [r=.623529,g=.47451,b=.933333]
+\definecolor [mediumpurple3] [r=.537255,g=.407843,b=.803922]
+\definecolor [mediumpurple4] [r=.364706,g=.278431,b=.545098]
+\definecolor [thistle1] [r=1,g=.882353,b=1]
+\definecolor [thistle2] [r=.933333,g=.823529,b=.933333]
+\definecolor [thistle3] [r=.803922,g=.709804,b=.803922]
+\definecolor [thistle4] [r=.545098,g=.482353,b=.545098]
+\definecolor [gray0] [black]
+\definecolor [gray1] [s=.01]
+\definecolor [gray2] [s=.02]
+\definecolor [gray3] [s=.03]
+\definecolor [gray4] [s=.04]
+\definecolor [gray5] [s=.05]
+\definecolor [gray6] [s=.06]
+\definecolor [gray7] [s=.07]
+\definecolor [gray8] [s=.08]
+\definecolor [gray9] [s=.09]
+\definecolor [gray10] [s=.1]
+\definecolor [gray11] [s=.11]
+\definecolor [gray12] [s=.12]
+\definecolor [gray13] [s=.13]
+\definecolor [gray14] [s=.14]
+\definecolor [gray15] [s=.15]
+\definecolor [gray16] [s=.16]
+\definecolor [gray17] [s=.17]
+\definecolor [gray18] [s=.18]
+\definecolor [gray19] [s=.19]
+\definecolor [gray20] [s=.2]
+\definecolor [gray21] [s=.21]
+\definecolor [gray22] [s=.22]
+\definecolor [gray23] [s=.23]
+\definecolor [gray24] [s=.24]
+\definecolor [gray25] [s=.25]
+\definecolor [gray26] [s=.26]
+\definecolor [gray27] [s=.27]
+\definecolor [gray28] [s=.28]
+\definecolor [gray29] [s=.29]
+\definecolor [gray30] [s=.3]
+\definecolor [gray31] [s=.31]
+\definecolor [gray32] [s=.32]
+\definecolor [gray33] [s=.33]
+\definecolor [gray34] [s=.34]
+\definecolor [gray35] [s=.35]
+\definecolor [gray36] [s=.36]
+\definecolor [gray37] [s=.37]
+\definecolor [gray38] [s=.38]
+\definecolor [gray39] [s=.39]
+\definecolor [gray40] [s=.4]
+\definecolor [gray41] [s=.41]
+\definecolor [gray42] [s=.42]
+\definecolor [gray43] [s=.43]
+\definecolor [gray44] [s=.44]
+\definecolor [gray45] [s=.45]
+\definecolor [gray46] [s=.46]
+\definecolor [gray47] [s=.47]
+\definecolor [gray48] [s=.48]
+\definecolor [gray49] [s=.49]
+\definecolor [gray50] [s=.5]
+\definecolor [gray51] [s=.51]
+\definecolor [gray52] [s=.52]
+\definecolor [gray53] [s=.53]
+\definecolor [gray54] [s=.54]
+\definecolor [gray55] [s=.55]
+\definecolor [gray56] [s=.56]
+\definecolor [gray57] [s=.57]
+\definecolor [gray58] [s=.58]
+\definecolor [gray59] [s=.59]
+\definecolor [gray60] [s=.6]
+\definecolor [gray61] [s=.61]
+\definecolor [gray62] [s=.62]
+\definecolor [gray63] [s=.63]
+\definecolor [gray64] [s=.64]
+\definecolor [gray65] [s=.65]
+\definecolor [gray66] [s=.66]
+\definecolor [gray67] [s=.67]
+\definecolor [gray68] [s=.68]
+\definecolor [gray69] [s=.69]
+\definecolor [gray70] [s=.7]
+\definecolor [gray71] [s=.71]
+\definecolor [gray72] [s=.72]
+\definecolor [gray73] [s=.73]
+\definecolor [gray74] [s=.74]
+\definecolor [gray75] [s=.75]
+\definecolor [gray76] [s=.76]
+\definecolor [gray77] [s=.77]
+\definecolor [gray78] [s=.78]
+\definecolor [gray79] [s=.79]
+\definecolor [gray80] [s=.8]
+\definecolor [gray81] [s=.81]
+\definecolor [gray82] [s=.82]
+\definecolor [gray83] [s=.83]
+\definecolor [gray84] [s=.84]
+\definecolor [gray85] [s=.85]
+\definecolor [gray86] [s=.86]
+\definecolor [gray87] [s=.87]
+\definecolor [gray88] [s=.88]
+\definecolor [gray89] [s=.89]
+\definecolor [gray90] [s=.9]
+\definecolor [gray91] [s=.91]
+\definecolor [gray92] [s=.92]
+\definecolor [gray93] [s=.93]
+\definecolor [gray94] [s=.94]
+\definecolor [gray95] [s=.95]
+\definecolor [gray96] [s=.96]
+\definecolor [gray97] [s=.97]
+\definecolor [gray98] [s=.98]
+\definecolor [gray99] [s=.99]
+\definecolor [gray100] [white]
+\definecolor [darkgray] [s=.662745]
+\definecolor [darkblue] [b=.545098]
+\definecolor [darkcyan] [g=.545098,b=.545098]
+\definecolor [darkmagenta] [r=.545098,b=.545098]
+\definecolor [darkred] [r=.545098]
+\definecolor [lightgreen] [r=.564706,g=.933333,b=.564706]
diff --git a/Master/texmf-dist/tex/context/base/colo-rgb.tex b/Master/texmf-dist/tex/context/base/colo-imp-rgb.mkiv
index 038e0ab0bf1..038e0ab0bf1 100644
--- a/Master/texmf-dist/tex/context/base/colo-rgb.tex
+++ b/Master/texmf-dist/tex/context/base/colo-imp-rgb.mkiv
diff --git a/Master/texmf-dist/tex/context/base/colo-x11.tex b/Master/texmf-dist/tex/context/base/colo-imp-x11.mkiv
index 45d3aac6248..45d3aac6248 100644
--- a/Master/texmf-dist/tex/context/base/colo-x11.tex
+++ b/Master/texmf-dist/tex/context/base/colo-imp-x11.mkiv
diff --git a/Master/texmf-dist/tex/context/base/colo-xwi.tex b/Master/texmf-dist/tex/context/base/colo-imp-xwi.mkiv
index 81e09d871bc..81e09d871bc 100644
--- a/Master/texmf-dist/tex/context/base/colo-xwi.tex
+++ b/Master/texmf-dist/tex/context/base/colo-imp-xwi.mkiv
diff --git a/Master/texmf-dist/tex/context/base/colo-ini.lua b/Master/texmf-dist/tex/context/base/colo-ini.lua
index 342d6110dca..c4e802ff587 100644
--- a/Master/texmf-dist/tex/context/base/colo-ini.lua
+++ b/Master/texmf-dist/tex/context/base/colo-ini.lua
@@ -6,25 +6,31 @@ if not modules then modules = { } end modules ['colo-ini'] = {
license = "see context related readme files"
}
-local type = type
+local type, tonumber = type, tonumber
local concat = table.concat
local format, gmatch, gsub, lower, match, find = string.format, string.gmatch, string.gsub, string.lower, string.match, string.find
-local texsprint = tex.sprint
-local ctxcatcodes = tex.ctxcatcodes
+local P, R, C, Cc = lpeg.P, lpeg.R, lpeg.C, lpeg.Cc
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
local trace_define = false trackers.register("colors.define",function(v) trace_define = v end)
-local settings_to_hash_strict = aux.settings_to_hash_strict
+local report_colors = logs.reporter("colors","defining")
-colors = colors or { }
-transparencies = transparencies or { }
+local attributes, context, commands = attributes, context, commands
-local registrations = backends.registrations
+local settings_to_hash_strict = utilities.parsers.settings_to_hash_strict
-local a_color = attributes.private('color')
-local a_transparency = attributes.private('transparency')
-local a_colorspace = attributes.private('colormodel')
-local a_background = attributes.private('background')
+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 a_color = attributes.private('color')
+local a_transparency = attributes.private('transparency')
+local a_colorspace = attributes.private('colormodel')
+local a_background = attributes.private('background')
local register_color = colors.register
local attributes_list = attributes.list
@@ -33,12 +39,12 @@ local function definecolor(name, ca, global)
if ca and ca > 0 then
if global then
if trace_define then
- commands.writestatus("color","define global color '%s' with attribute: %s",name,ca)
+ report_colors("define global color '%s' with attribute: %s",name,ca)
end
context.colordefagc(name,ca)
else
if trace_define then
- commands.writestatus("color","define local color '%s' with attribute: %s",name,ca)
+ report_colors("define local color '%s' with attribute: %s",name,ca)
end
context.colordefalc(name,ca)
end
@@ -55,12 +61,12 @@ local function inheritcolor(name, ca, global)
if ca and ca ~= "" then
if global then
if trace_define then
- commands.writestatus("color","inherit global color '%s' with attribute: %s",name,ca)
+ report_colors("inherit global color '%s' with attribute: %s",name,ca)
end
- context.colordeffgc(name,ca)
+ context.colordeffgc(name,ca) -- some day we will set the macro directly
else
if trace_define then
- commands.writestatus("color","inherit local color '%s' with attribute: %s",name,ca)
+ report_colors("inherit local color '%s' with attribute: %s",name,ca)
end
context.colordefflc(name,ca)
end
@@ -77,12 +83,12 @@ local function definetransparent(name, ta, global)
if ta and ta > 0 then
if global then
if trace_define then
- commands.writestatus("color","define global transparency '%s' with attribute: %s",name,ta)
+ report_colors("define global transparency '%s' with attribute: %s",name,ta)
end
context.colordefagt(name,ta)
else
if trace_define then
- commands.writestatus("color","define local transparency '%s' with attribute: %s",name,ta)
+ report_colors("define local transparency '%s' with attribute: %s",name,ta)
end
context.colordefalt(name,ta)
end
@@ -99,12 +105,12 @@ local function inherittransparent(name, ta, global)
if ta and ta ~= "" then
if global then
if trace_define then
- commands.writestatus("color","inherit global transparency '%s' with attribute: %s",name,ta)
+ report_colors("inherit global transparency '%s' with attribute: %s",name,ta)
end
context.colordeffgt(name,ta)
else
if trace_define then
- commands.writestatus("color","inherit local transparency '%s' with attribute: %s",name,ta)
+ report_colors("inherit local transparency '%s' with attribute: %s",name,ta)
end
context.colordefflt(name,ta)
end
@@ -133,6 +139,60 @@ local transparent = {
exclusion = 12,
}
+-- backend driven limitations
+
+colors.supported = true -- always true
+transparencies.supported = true
+
+local gray_okay, rgb_okay, cmyk_okay, spot_okay, multichannel_okay, forced = true, true, true, true, true, false
+
+function colors.forcesupport(gray,rgb,cmyk,spot,multichannel) -- pdfx driven
+ gray_okay, rgb_okay, cmyk_okay, spot_okay, multichannel_okay, forced = gray, rgb, cmyk, spot, multichannel, true
+ report_colors("supported models: gray=%s, rgb=%s, cmyk=%s, spot=%s", -- multichannel=%s
+ tostring(gray), tostring(rgb), tostring(cmyk), tostring(spot)) -- tostring(multichannel)
+end
+
+local function forcedmodel(model) -- delayed till the backend but mp directly
+ if not forced then
+ return model
+ elseif model == 2 then -- gray
+ if gray_okay then
+ -- okay
+ elseif cmyk_okay then
+ return 4
+ elseif rgb_okay then
+ return 3
+ end
+ elseif model == 3 then -- rgb
+ if rgb_okay then
+ -- okay
+ elseif cmyk_okay then
+ return 4
+ elseif gray_okay then
+ return 2
+ end
+ elseif model == 4 then -- cmyk
+ if cmyk_okay then
+ -- okay
+ elseif rgb_okay then
+ return 3
+ elseif gray_okay then
+ return 2
+ end
+ elseif model == 5 then -- spot
+ if cmyk_okay then
+ return 4
+ elseif rgb_okay then
+ return 3
+ elseif gray_okay then
+ return 2
+ end
+ end
+ return model
+end
+
+colors.forcedmodel = forcedmodel
+
-- By coupling we are downward compatible. When we decouple we need to do more tricky
-- housekeeping (e.g. persist color independent transparencies when color bound ones
-- are nil.)
@@ -146,41 +206,43 @@ end
local registered = { }
local function do_registerspotcolor(parent,name,parentnumber,e,f,d,p)
- if not registered[parentnumber] then
+ if not registered[parent] then
+--~ print("!!!1",parent)
local v = colors.values[parentnumber]
if v then
- local kind = colors.default -- else problems with shading etc
- if kind == 1 then kind = v[1] end
+ local model = colors.default -- else problems with shading etc
+ if model == 1 then model = v[1] end
if e and e ~= "" then
registrations.spotcolorname(parent,e) -- before registration of the color
end
- if kind == 2 then -- name noffractions names p's r g b
+ if model == 2 then -- name noffractions names p's r g b
registrations.grayspotcolor(parent,f,d,p,v[2])
- elseif kind == 3 then
+ elseif model == 3 then
registrations.rgbspotcolor (parent,f,d,p,v[3],v[4],v[5])
- elseif kind == 4 then
+ elseif model == 4 then
registrations.cmykspotcolor(parent,f,d,p,v[6],v[7],v[8],v[9])
end
end
- registered[parentnumber] = true
+ 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[parentnumber] then
+ if not registered[parent] then
+--~ print("!!!2",parent)
local v = colors.values[parentnumber]
if v then
- local kind = colors.default -- else problems with shading etc
- if kind == 1 then kind = v[1] end
- if kind == 2 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 kind == 3 then
+ elseif model == 3 then
registrations.rgbindexcolor (parent,f,d,p,v[3],v[4],v[5])
- elseif kind == 4 then
+ elseif model == 4 then
registrations.cmykindexcolor(parent,f,d,p,v[6],v[7],v[8],v[9])
end
end
- registered[parentnumber] = true
+ registered[parent] = true
end
end
@@ -188,16 +250,53 @@ function colors.definesimplegray(name,s)
return register_color(name,'gray',s) -- we still need to get rid of 'color'
end
+local hexdigit = R("09","AF","af")
+local hexnumber = hexdigit * hexdigit / function(s) return tonumber(s,16)/255 end + Cc(0)
+local hexpattern = hexnumber^-3 * P(-1)
+local hexcolor = Cc("H") * P("#") * hexpattern
+
+local left = P("(")
+local right = P(")")
+local comma = P(",")
+local mixnumber = lpegpatterns.number / tonumber
+local mixname = C(P(1-left-right-comma)^1)
+local mixcolor = Cc("M") * mixnumber * left * mixname * (comma * mixname)^-1 * right * P(-1)
+
+local exclamation = P("!")
+local pgfnumber = lpegpatterns.digit^0 / function(s) return tonumber(s)/100 end
+local pgfname = C(P(1-exclamation)^1)
+local pgfcolor = Cc("P") * pgfname * exclamation * pgfnumber * (exclamation * pgfname)^-1 * P(-1)
+
+local specialcolor = hexcolor + mixcolor
+
+local l_color = attributes.list[a_color]
+local l_transparency = attributes.list[a_transparency]
+
+directives.register("colors.pgf",function(v)
+ if v then
+ specialcolor = hexcolor + mixcolor + pgfcolor
+ else
+ specialcolor = hexcolor + mixcolor
+ end
+end)
+
function colors.defineprocesscolor(name,str,global,freeze) -- still inconsistent color vs transparent
- local x = match(str,"^#(.+)$") -- for old times sake (if we need to feed from xml or so)
- if x then
- local r, g, b = match(x .. "000000","(..)(..)(..)") -- watch the 255
- definecolor(name, register_color(name,'rgb',(tonumber(r,16) or 0)/255,(tonumber(g,16) or 0)/255,(tonumber(b,16) or 0)/255), global)
+ 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)
+ 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)
else
local settings = settings_to_hash_strict(str)
if settings then
local r, g, b = settings.r, settings.g, settings.b
if r or g or b then
+ -- we can consider a combined rgb cmyk s definition
definecolor(name, register_color(name,'rgb', tonumber(r) or 0, tonumber(g) or 0, tonumber(b) or 0), global)
else
local c, m, y, k = settings.c, settings.m, settings.y, settings.k
@@ -211,8 +310,8 @@ function colors.defineprocesscolor(name,str,global,freeze) -- still inconsistent
else
local x = settings.x or h
if x then
- r, g, b = match(x .. "000000","(..)(..)(..)") -- watch the 255
- definecolor(name, register_color(name,'rgb',(tonumber(r,16) or 0)/255,(tonumber(g,16) or 0)/255,(tonumber(b,16) or 0)/255), global)
+ r, g, b = lpegmatch(hexpattern,x) -- can be inlined
+ definecolor(name, register_color(name,'rgb',r,g,b), global)
else
definecolor(name, register_color(name,'gray',tonumber(s) or 0), global)
end
@@ -289,24 +388,36 @@ function colors.registerspotcolor(parent, str)
end
function colors.definemultitonecolor(name,multispec,colorspec,selfspec)
- local dd, pp, nn = { }, { }, { }
- for k,v in gmatch(multispec,"(%a+)=([^%,]*)") do
- dd[#dd+1] = k
- pp[#pp+1] = v
- nn[#nn+1] = k
- nn[#nn+1] = format("%1.3g",tonumber(v) or 0) -- 0 can't happen
+ local dd, pp, nn, max = { }, { }, { }, 0
+ for k,v in gmatch(multispec,"(%a+)=([^%,]*)") do -- use settings_to_array
+ max = max + 1
+ dd[max] = k
+ pp[max] = v
+ nn[max] = format("%s_%1.3g",k,tonumber(v) or 0) -- 0 can't happen
end
---~ v = tonumber(v) * p
- local nof = #dd
- if nof > 0 then
- dd, pp, nn = concat(dd,','), concat(pp,','), concat(nn,'_')
+ if max > 0 then
+ nn = concat(nn,'_')
local parent = gsub(lower(nn),"[^%d%a%.]+","_")
- colors.defineprocesscolor(parent,colorspec..","..selfspec,true,true)
+--~ if max == 2 and (not colorspec or colorspec == "") then
+--~ colors.defineduocolor(parent,pp[1],l_color[dd[1]],pp[2],l_color[dd[2]],true,true)
+--~ elseif (not colorspec or colorspec == "") then
+ 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
+ else
+ if selfspec ~= "" then
+ colorspec = colorspec .. "," .. selfspec
+ end
+ colors.defineprocesscolor(parent,colorspec,true,true)
+ end
local cp = attributes_list[a_color][parent]
+ dd, pp = concat(dd,','), concat(pp,',')
+--~ print(name,multispec,colorspec,selfspec)
+--~ print(parent,max,cp)
if cp then
- do_registerspotcolor(parent, name, cp, "", nof, dd, pp)
- do_registermultitonecolor(parent, name, cp, "", nof, dd, pp)
- definecolor(name, register_color(name, 'spot', parent, nof, dd, pp), true)
+ do_registerspotcolor(parent, name, cp, "", max, dd, pp)
+--~ do_registermultitonecolor(parent, name, cp, "", max, dd, pp) -- done in previous ... check it
+ 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
definetransparent(name, transparencies.register(name,transparent[t.a] or tonumber(t.a) or 1,tonumber(t.t) or 1), global)
@@ -318,13 +429,14 @@ function colors.definemultitonecolor(name,multispec,colorspec,selfspec)
end
end
-function colors.mp(model,ca,ta,default)
- local cv = colors.value(ca) -- faster when direct colors.values[ca]
+function colors.mpcolor(model,ca,ta,default) -- will move to mlib-col
+ local cv = colors.supported and colors.value(ca) -- faster when direct colors.values[ca]
if cv then
- local tv = transparencies.value(ta)
+ local tv = transparencies.supported and transparencies.value(ta)
if model == 1 then
model = cv[1]
end
+ model = forcedmodel(model)
if tv then
if model == 2 then
return format("transparent(%s,%s,(%s,%s,%s))",tv[1],tv[2],cv[3],cv[4],cv[5])
@@ -355,7 +467,7 @@ end
function colors.formatcolor(ca,separator)
local cv = colors.value(ca)
if cv then
- local c, f, t, model = { }, 13, 13, cv[1]
+ local c, cn, f, t, model = { }, 0, 13, 13, cv[1]
if model == 2 then
f, t = 2, 2
elseif model == 3 then
@@ -364,7 +476,8 @@ function colors.formatcolor(ca,separator)
f, t = 6, 9
end
for i=f,t do
- c[#c+1] = format("%0.3f",cv[i])
+ cn = cn + 1
+ c[cn] = format("%0.3f",cv[i])
end
return concat(c,separator)
else
@@ -451,20 +564,45 @@ end
function colors.defineintermediatecolor(name,fraction,c_one,c_two,a_one,a_two,specs,global,freeze)
fraction = tonumber(fraction) or 1
local one, two = colors.value(c_one), colors.value(c_two)
- if one and two then
- local csone, cstwo = one[1], two[1]
- if csone == cstwo then
- -- actually we can set all 8 values at once here but this is cleaner as we avoid
- -- problems with weighted gray conversions and work with original values
+ if one then
+ if two then
+ local csone, cstwo = one[1], two[1]
+ -- if csone == cstwo then
+ -- actually we can set all 8 values at once here but this is cleaner as we avoid
+ -- problems with weighted gray conversions and work with original values
+ local ca
+ if csone == 2 then
+ ca = register_color(name,'gray',f(one,two,2,fraction))
+ elseif csone == 3 then
+ ca = register_color(name,'rgb', f(one,two,3,fraction),
+ f(one,two,4,fraction),
+ f(one,two,5,fraction))
+ elseif csone == 4 then
+ ca = register_color(name,'cmyk',f(one,two,6,fraction),
+ f(one,two,7,fraction),
+ f(one,two,8,fraction),
+ f(one,two,9,fraction))
+ else
+ ca = register_color(name,'gray',f(one,two,2,fraction))
+ end
+ definecolor(name,ca,global,freeze)
+ -- end
+ else
+ local csone = one[1]
local ca
if csone == 2 then
- ca = register_color(name,'gray',f(one,two,2,fraction))
+ ca = register_color(name,'gray',fraction*one[2])
elseif csone == 3 then
- ca = register_color(name,'rgb',f(one,two,3,fraction),f(one,two,4,fraction),f(one,two,5,fraction))
+ ca = register_color(name,'rgb', fraction*one[3],
+ fraction*one[4],
+ fraction*one[5])
elseif csone == 4 then
- ca = register_color(name,'cmyk',f(one,two,6,fraction),f(one,two,7,fraction),f(one,two,8,fraction),f(one,two,9,fraction))
+ ca = register_color(name,'cmyk',fraction*one[6],
+ fraction*one[7],
+ fraction*one[8],
+ fraction*one[9])
else
- ca = register_color(name,'gray',f(one,two,2,fraction))
+ ca = register_color(name,'gray',fraction*one[2])
end
definecolor(name,ca,global,freeze)
end
@@ -474,7 +612,137 @@ function colors.defineintermediatecolor(name,fraction,c_one,c_two,a_one,a_two,sp
local ta = tonumber((t and t.a) or (one and one[1]) or (two and two[1]))
local tt = tonumber((t and t.t) or (one and two and f(one,two,2,fraction)))
if ta and tt then
---~ print(ta,tt)
definetransparent(name,transparencies.register(name,ta,tt),global)
end
end
+
+--~ local function f(one,two,i,fraction_one,fraction_two)
+--~ local otf = fraction_one * one[i] + fraction_two * two[i]
+--~ if otf > 1 then
+--~ otf = 1
+--~ end
+--~ return otf
+--~ end
+
+--~ function colors.defineduocolor(name,fraction_one,c_one,fraction_two,c_two,global,freeze)
+--~ local one, two = colors.value(c_one), colors.value(c_two)
+--~ if one and two then
+--~ fraction_one = tonumber(fraction_one) or 1
+--~ fraction_two = tonumber(fraction_two) or 1
+--~ local csone, cstwo = one[1], two[1]
+--~ local ca
+--~ if csone == 2 then
+--~ ca = register_color(name,'gray',f(one,two,2,fraction_one,fraction_two))
+--~ elseif csone == 3 then
+--~ ca = register_color(name,'rgb', f(one,two,3,fraction_one,fraction_two),
+--~ f(one,two,4,fraction_one,fraction_two),
+--~ f(one,two,5,fraction_one,fraction_two))
+--~ elseif csone == 4 then
+--~ ca = register_color(name,'cmyk',f(one,two,6,fraction_one,fraction_two),
+--~ f(one,two,7,fraction_one,fraction_two),
+--~ f(one,two,8,fraction_one,fraction_two),
+--~ f(one,two,9,fraction_one,fraction_two))
+--~ else
+--~ ca = register_color(name,'gray',f(one,two,2,fraction_one,fraction_two))
+--~ end
+--~ definecolor(name,ca,global,freeze)
+--~ 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 = colors.value(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
+
+-- for the moment downward compatible
+
+local patterns = { "colo-imp-%s.mkiv", "colo-imp-%s.tex", "colo-%s.mkiv", "colo-%s.tex" }
+
+function colors.usecolors(name)
+ commands.uselibrary(name,patterns,function(name,foundname)
+ context.startreadingfile()
+ context.input(foundname)
+ context.showcolormessage("colors",4,name)
+ context.stopreadingfile()
+ end, function(name)
+ context.showcolormessage("colors",5,name)
+ end)
+end
+
+-- interface
+
+local setcolormodel = colors.setmodel
+
+function commands.setcolormodel(model,weight)
+ settexattribute(a_colorspace,setcolormodel(model,weight))
+end
+
+function commands.setrastercolor(name,s)
+ settexattribute(a_color,colors.definesimplegray(name,s))
+end
+
+function commands.registermaintextcolor(a)
+ colors.main = a
+end
+
+commands.defineprocesscolor = colors.defineprocesscolor
+commands.definespotcolor = colors.definespotcolor
+commands.definemultitonecolor = colors.definemultitonecolor
+commands.definetransparency = colors.definetransparency
+commands.defineintermediatecolor = colors.defineintermediatecolor
+
+function commands.spotcolorname (a) context(colors.spotcolorname (a)) end
+function commands.spotcolorparent (a) context(colors.spotcolorparent (a)) end
+function commands.spotcolorvalue (a) context(colors.spotcolorvalue (a)) end
+function commands.colorcomponents (a) context(colors.colorcomponents (a)) end
+function commands.transparencycomponents(a) context(colors.transparencycomponents(a)) end
+function commands.formatcolor (...) context(colors.formatcolor (...)) end
+function commands.formatgray (...) context(colors.formatgray (...)) end
+
+function commands.mpcolor(model,ca,ta,default)
+ context(colors.mpcolor(model,ca,ta,default))
+end
+
+function commands.doifblackelse(a)
+ commands.doifelse(colors.isblack(a))
+end
+
+function commands.doifdrawingblackelse()
+ commands.doifelse(colors.isblack(gettexattribute(a_color)))
+end
+
+commands.usecolors = colors.usecolors
diff --git a/Master/texmf-dist/tex/context/base/colo-ini.mkii b/Master/texmf-dist/tex/context/base/colo-ini.mkii
index 2d2a7bdaa13..484a085fe2b 100644
--- a/Master/texmf-dist/tex/context/base/colo-ini.mkii
+++ b/Master/texmf-dist/tex/context/base/colo-ini.mkii
@@ -271,9 +271,11 @@
\def\dodosetupcolor#1%
{\makeshortfilename[\truefilename{\f!colorprefix#1}]%
\startreadingfile
- \readsysfile\shortfilename
+ \readsysfile{\shortfilename.\mksuffix}
{\showmessage\m!colors4\colorstyle}
- {\showmessage\m!colors5\colorstyle}%
+ {\readsysfile{\shortfilename.tex}
+ {\showmessage\m!colors4\colorstyle}
+ {\showmessage\m!colors5\colorstyle}}%
\stopreadingfile}
\let\usecolors\setupcolor
diff --git a/Master/texmf-dist/tex/context/base/colo-ini.mkiv b/Master/texmf-dist/tex/context/base/colo-ini.mkiv
index 1bceb5aa70a..45fe1463383 100644
--- a/Master/texmf-dist/tex/context/base/colo-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/colo-ini.mkiv
@@ -20,10 +20,14 @@
%D different approach, this module only implements a few generic mechanisms.
\registerctxluafile{colo-ini}{1.000}
-\registerctxluafile{lpdf-col}{1.000}
+\registerctxluafile{colo-icc}{1.000}
\unprotect
+%D In \MKIV\ we have independent color, colorspace and transparency
+%D but I'm still not sure if I keep it that way as it's probably more
+%D efficient to combine them (less attributes and finalizing).
+%D
%D We use a couple of local registers. That way we don't have
%D to group when converting colors. By the way, this is not
%D really faster. We can sqeeze half a second runtime for 50K
@@ -140,24 +144,33 @@
%D \showsetup{color}
%D \showsetup{graycolor}
- \def\switchtocolor [#1]{\getvalue{#1}}
+\unexpanded\def\switchtocolor [#1]{\csname#1\endcsname}
\unexpanded\def\color [#1]{\groupedcommand{\doactivatecolor{#1}}{}}
\unexpanded\def\startcolor [#1]{\begingroup\doactivatecolor{#1}}
\unexpanded\def\stopcolor {\endgroup}
\unexpanded\def\graycolor [#1]{\groupedcommand{\dosetcolormodel{gray}\getvalue{#1}}{}}
\unexpanded\def\colored [#1]{\groupedcommand{\definecolor[@colored@][#1]\doactivatecolor{@colored@}}{}}
\unexpanded\def\fastcolored [#1]#2{\begingroup\dodefinefastcolor[@colored@][#1]\doactivatecolor{@colored@}#2\endgroup}
- \def\predefinecolor [#1]{\flushatshipout{\hbox{\color[#1]{}}}}
- \def\predefineindexcolor[#1]{\flushatshipout{\hbox{\color[#1]{}}}}
- \unexpanded\def\startcolorpage {\startcolor[\ifx\maintextcolor\empty\defaulttextcolor\else\maintextcolor\fi]}
- \unexpanded\def\stopcolorpage {\stopcolor}
- \unexpanded\def\startraster [#1]{\dosetrastercolor{#1}}
- \unexpanded\def\stopraster {}
- \def\raster [#1]{\groupedcommand{\dosetrastercolor{#1}}{}}
- \def\faststartcolor [#1]{\doactivatecolor{#1}}
- \def\faststopcolor {}
+\unexpanded\def\predefinecolor [#1]{\flushatshipout{\hbox{\color[#1]{}}}}
+\unexpanded\def\predefineindexcolor[#1]{\flushatshipout{\hbox{\color[#1]{}}}}
+
+% some of this will go away
+
+\unexpanded\def\startcolorpage {\startcolor[\ifx\maintextcolor\empty\defaulttextcolor\else\maintextcolor\fi]}
+\unexpanded\def\stopcolorpage {\stopcolor}
+\unexpanded\def\startraster [#1]{\dosetrastercolor{#1}}
+\unexpanded\def\stopraster {}
+\unexpanded\def\raster [#1]{\groupedcommand{\dosetrastercolor{#1}}{}}
+\unexpanded\def\faststartcolor [#1]{\doactivatecolor{#1}}
+\unexpanded\def\faststopcolor {}
\unexpanded\def\dosetcolorattribute#1#2{\ifcsname#1#2\endcsname\doactivatecolor{\csname#1#2\endcsname}\fi}
+\def\getcolorattributevalue#1#2% color macro (obsolete again, we have a better method)
+ {\begingroup
+ \doactivatecolor{#1}%
+ \normalexpanded{\endgroup\edef\noexpand#2%
+ {\ifnum\attribute\colorattribute=\attributeunsetvalue\else\number\attribute\colorattribute\fi}}}
+
\let\grey\graycolor
%D Stacking:
@@ -197,36 +210,18 @@
%D where \type{\f!colorprefix} is \unprotect {\tttf \f!colorprefix}.
%D Loading such a file is done by \protect
%D
-%D \showsetup{setupcolor}
+%D \showsetup{usecolors}
%D
%D Some default colors are specified in \type{colo-rgb.tex},
%D which is loaded into the format by:
%D
%D \starttyping
-%D \setupcolor[rgb]
+%D \usecolors[rgb]
%D \stoptyping
-\let\colorstyle\empty
-
-\unexpanded\def\setupcolor
- {\dosingleargument\dosetupcolor}
-
-\def\dosetupcolor[#1]%
- {\doifnot{#1}\colorstyle
- {\def\colorstyle{#1}%
- \processcommalist[#1]\dodosetupcolor}}
-
-\def\dodosetupcolor#1%
- {\makeshortfilename[\truefilename{\f!colorprefix#1}]%
- \startreadingfile
- \readsysfile\shortfilename
- {\showcolormessage\m!colors4\colorstyle}
- {\showcolormessage\m!colors5\colorstyle}%
- \stopreadingfile}
+\unexpanded\def\usecolors[#1]{\ctxcommand{usecolors(\!!bs#1\!!es)}}
-\let\usecolors\setupcolor
-
-% check: \startcolormode
+\let\setupcolor\usecolors
%D \macros
%D {definetransparency}
@@ -243,6 +238,9 @@
\newtoks\everysetupcolors
+\let\dosetcolorvalue \setvalue
+\def\colorfreezestate{false}
+
\def\dosetupcolors[#1]% some no longer make sense in MkIV
{\getparameters[\??cl][#1]%
\doifelse\@@clspot\v!yes
@@ -254,6 +252,13 @@
\doifelse\@@clexpansion\v!yes
\freezecolorstrue
\freezecolorsfalse
+ \iffreezecolors
+ \let\dosetcolorvalue\setevalue
+ \def\colorfreezestate{true}%
+ \else
+ \let\dosetcolorvalue\setvalue
+ \def\colorfreezestate{false}%
+ \fi
\doifelse\@@clfactor\v!no
\weightGRAYfalse
\weightGRAYtrue
@@ -296,7 +301,7 @@
\fi\fi
\doifelse\@@clstate\v!stop
{\incolorfalse\forcegrayMPcolorstrue}%
- {\ifincolor\else\showcolormessage\m!colors1\colorstyle\fi\incolortrue\let\@@clstate\v!start}%
+ {\incolortrue\let\@@clstate\v!start}%
\dosetupcolormodel
\the\everysetupcolors}
@@ -371,7 +376,7 @@
\def\dodefinepalet[#1][#2]%
{\doifassignmentelse{#2}
{%\showcolormessage\m!colors6{#1}%
- \letvalue{\??pa#1}\empty
+ \letvalueempty{\??pa#1}%
\setevalue{\??pa\??pa#1}{#2}%
\def\dodododefinepalet[##1=##2]%
{\doifvaluesomething{\??pa#1}
@@ -712,19 +717,15 @@
% draw btex test etex withprescript \mptexcolor{blue} ;
% \stopMPpage
-\ifx\currentcolormodel\undefined \newcount\currentcolormodel \fi
+% \ifx\currentcolormodel\undefined \newcount\currentcolormodel \fi
-% \def\setcolormodel#1%
-% {\showcolormessage\m!colors1{#1}%
-% \dosetcolormodel{#1}}
+\def\currentcolormodel{\attribute\colormodelattribute}
\def\dosetcolormodel#1% no message
- {\currentcolormodel\ctxlua{tex.print(colors.setmodel('#1',\ifweightGRAY true\else false\fi))}%
- \attribute\colormodelattribute\currentcolormodel}
+ {\ctxcommand{setcolormodel('#1',\ifweightGRAY true\else false\fi)}} % sets attribute
\dosetcolormodel{all}
-
\def\dosetupcolormodel
{\ifincolor
\ifRGBsupported
@@ -765,10 +766,10 @@
% Since we couple definitions, we could stick to one test. Todo. Same for mpcolor.
-\letvalue{(cs:-}\empty
-\letvalue{(ts:-}\empty
+\letvalueempty{(cs:-}
+\letvalueempty{(ts:-}
-\def\doactivatecolor#1% : in currentpalet, maybe not, ugly
+\def\doactivatecolor#1% : in currentpalet, maybe not, ugly (some day at the lua end)
{\def\currentcolorname{#1}%
\ifcsname(cs:\currentpalet#1)\endcsname
\csname(cs:\currentpalet#1)\endcsname
@@ -782,10 +783,12 @@
% if it becomes a bottleneck we can set up a more complex system with one shared
% attribute for colorspace, color and transparency
+%
+% maybe always on
\def\doactivatecolor
{\ifproductionrun
- \ctxlua{colors.enable() transparencies.enable()}% not that efficient but at least robust
+ \ctxcommand{enablecolor() commands.enabletransparency()}% not that efficient but at least robust
\let\doactivatecolor\normaldoactivatecolor
\expandafter\doactivatecolor
\else
@@ -804,44 +807,45 @@
\setfalse\collectcolorsinlist
\def\collectcolorinlist#1{\doglobal\addtocommalist{#1}\colorlist}
-\def\doregistercolor#1#2{\ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}}
+\def\doregistercolor#1#2%
+ {\ctxcommand{defineprocesscolor("#1","#2",false,\colorfreezestate)}}
\def\dodefinecolor[#1][#2]%
{\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
- \ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
+ \ctxcommand{defineprocesscolor("#1","#2",false,\colorfreezestate)}%
\dodefinecolorcommand\setvalue{#1}}
\def\dodefineglobalcolor[#1][#2]%
{\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
- \ctxlua{colors.defineprocesscolor("#1","#2",true,\iffreezecolors true\else false\fi)}%
+ \ctxcommand{defineprocesscolor("#1","#2",true,\colorfreezestate)}%
\dodefinecolorcommand\setgvalue{#1}}
\def\dodefinenamedcolor[#1][#2]%
{\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
- \ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
+ \ctxcommand{defineprocesscolor("#1","#2",false,\colorfreezestate)}%
\dodefinecolorcommand\setvalue{#1}}
\def\dodefinespotcolor[#1][#2][#3]%
{\ifconditional\collectcolorsinlist\collectcolorinlist{#1}\fi
- \ctxlua{colors.definespotcolor("#1","#2","#3",true)}%
+ \ctxcommand{definespotcolor("#1","#2","#3",true)}%
\dodefinecolorcommand\setxvalue{#1}}
\def\dodefinemultitonecolor[#1][#2][#3][#4]%
- {\ctxlua{colors.definemultitonecolor("#1","#2","#3","#4",true)}%
+ {\ctxcommand{definemultitonecolor("#1","#2","#3","#4",true)}%
\dodefinecolorcommand\setxvalue{#1}}
\def\dodefinetransparency[#1][#2]%
- {\ctxlua{colors.definetransparency("#1",#2)}}
+ {\ctxcommand{definetransparency("#1",#2)}}
\def\dosetrastercolor#1% slow, we need a fast one
{\edef\@@rastervalue{#1}%
\ifx\@@rastervalue\empty
\let\@@rastervalue\@@rsscreen
\fi
- \attribute\colorattribute\ctxlua{tex.sprint(colors.definesimplegray("_raster_",\@@rastervalue))}\relax}
+ \ctxcommand{setrastercolor("_raster_",\@@rastervalue)}} % sets attribute
\def\dodefinefastcolor[#1][#2]% still not fast but ok
- {\ctxlua{colors.defineprocesscolor("#1","#2",false,\iffreezecolors true\else false\fi)}%
+ {\ctxcommand{defineprocesscolor("#1","#2",false,\colorfreezestate)}%
\dodefinecolorcommand\setvalue{#1}}
%D \macros
@@ -875,7 +879,7 @@
%D A bit like \type {\definedfont}:
\unexpanded\def\colored[#1]%
- {\ctxlua{colors.defineprocesscolor("@colored@","#1",false,false)}%
+ {\ctxcommand{defineprocesscolor("@colored@","#1",false,false)}%
\groupedcommand{\doactivatecolor{@colored@}}{}}
%D \macros
@@ -915,7 +919,8 @@
\ifx\maintextcolor\empty\else\doactivatecolor\maintextcolor\fi
\to \everybeforeoutput
-\def\registermaintextcolor{\ctxlua{colors.main = \thecolorattribute\maintextcolor}}
+\def\registermaintextcolor
+ {\ctxcommand{registermaintextcolor(\thecolorattribute\maintextcolor)}}
\unexpanded\def\starttextcolor[#1]%
{\doifsomething{#1}
@@ -937,18 +942,34 @@
\appendtoks \initializemaintextcolor \to \everyjob
\appendtoks \initializemaintextcolor \to \everysetupcolors
+\def\doinheritdirectcs#1{\csname(cs:\ifcsname(cs:#1)\endcsname#1\fi)\endcsname}
+\def\doinheritdirectca#1{\csname(ca:\ifcsname(ca:#1)\endcsname#1\fi)\endcsname}
+\def\doinheritdirectts#1{\csname(ts:\ifcsname(ts:#1)\endcsname#1\fi)\endcsname}
+\def\doinheritdirectta#1{\csname(ta:\ifcsname(ta:#1)\endcsname#1\fi)\endcsname}
+
+\def\doinheritpaletca#1#2{\csname(ca:\ifcsname(ca:\??pa#1:#2)\endcsname\??pa#1:#2\fi)\endcsname}
+\def\doinheritpaletcs#1#2{\csname(cs:\ifcsname(cs:\??pa#1:#2)\endcsname\??pa#1:#2\fi)\endcsname}
+\def\doinheritpaletta#1#2{\csname(ta:\ifcsname(ta:\??pa#1:#2)\endcsname\??pa#1:#2\fi)\endcsname}
+\def\doinheritpaletts#1#2{\csname(ts:\ifcsname(ts:\??pa#1:#2)\endcsname\??pa#1:#2\fi)\endcsname}
+
\def\dodefinepaletcolor#1#2#3%
{\doifassignmentelse{#3}% \definepalet[test][xx={y=.4}]
{\definecolor[\??pa#1:#2][#3]%
- \iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{(cs:#1:#2)}{\csname(cs:\??pa#1:#2)\endcsname}%
- \iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{(ca:#1:#2)}{\csname(ca:\??pa#1:#2)\endcsname}}
+ \dosetcolorvalue{(cs:#1:#2)}{\doinheritpaletca{#1}{#2}}%
+ \dosetcolorvalue{(ca:#1:#2)}{\doinheritpaletcs{#1}{#2}}%
+ \dosetcolorvalue{(ts:#1:#2)}{\doinheritpaletta{#1}{#2}}%
+ \dosetcolorvalue{(ta:#1:#2)}{\doinheritpaletts{#1}{#2}}}
{\ifcsname(cs:#3)\endcsname % \definepalet[test][xx=green]
- \iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{(cs:#1:#2)}{\csname(cs:#3)\endcsname}%
- \iffreezecolors\@EA\setevalue\else\@EA\setvalue\fi{(ca:#1:#2)}{\csname(ca:#3)\endcsname}%
+ \dosetcolorvalue{(cs:#1:#2)}{\doinheritdirectcs{#3}}%
+ \dosetcolorvalue{(ca:#1:#2)}{\doinheritdirectca{#3}}%
+ \dosetcolorvalue{(ts:#1:#2)}{\doinheritdirectts{#3}}%
+ \dosetcolorvalue{(ta:#1:#2)}{\doinheritdirectta{#3}}%
\else
% not entered when making format
\localundefine{(cs:#1:#2)}% \letvalue{(cs:#1:#2)}\undefined
\localundefine{(ca:#1:#2)}% \letvalue{(ca:#1:#2)}\undefined
+ \localundefine{(ts:#1:#2)}% \letvalue{(cs:#1:#2)}\undefined
+ \localundefine{(ta:#1:#2)}% \letvalue{(ca:#1:#2)}\undefined
\fi}}
\setvalue{(cs:)}{} \setvalue{(ca:)}{0}
@@ -962,7 +983,7 @@
%D Low level defs:
\def\colordefalc#1#2{\setevalue{(ca:#1)}{#2}\setvalue {(cs:#1)}{\attribute\colorattribute #2 }}
-\def\colordefagc#1#2{\setxvalue{(ca:#1)}{#2}\setvalue {(cs:#1)}{\attribute\colorattribute #2 }}
+\def\colordefagc#1#2{\setxvalue{(ca:#1)}{#2}\setgvalue{(cs:#1)}{\attribute\colorattribute #2 }} % was not g
\def\colordefalt#1#2{\setevalue{(ta:#1)}{#2}\setvalue {(ts:#1)}{\attribute\transparencyattribute#2 }}
\def\colordefagt#1#2{\setxvalue{(ta:#1)}{#2}\setgvalue{(ts:#1)}{\attribute\transparencyattribute#2 }}
@@ -995,28 +1016,28 @@
%D \getbuffer
%D \stopvoorbeeld
-\def\colorformatseparator{ }
-
-\def\MPcolor#1{\ctxlua{tex.sprint(colors.mp(\number\currentcolormodel,\number\doinheritca{#1},\number\doinheritta{#1}))}}
-
\let\currentcolorname\s!black % todo
\let\outercolorname \s!black % todo
+\let\colorformatseparator\space
+
+\def\MPcolor #1{\ctxcommand{mpcolor(\number\currentcolormodel,\number\doinheritca{#1},\number\doinheritta{#1})}}
+
\def\thecolorattribute #1{\number\csname(ca:\ifcsname(ca:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ca:#1)\endcsname#1\fi\fi)\endcsname}
\def\thetransparencyattribute#1{\number\csname(ta:\ifcsname(ta:\currentpalet#1)\endcsname\currentpalet#1\else\ifcsname(ta:#1)\endcsname#1\fi\fi)\endcsname}
-\def\internalspotcolorname #1{\ctxlua{tex.sprint(colors.spotcolorname (\thecolorattribute{#1}))}}
-\def\internalspotcolorparent#1{\ctxlua{tex.sprint(colors.spotcolorparent(\thecolorattribute{#1}))}}
-\def\internalspotcolorsize #1{\ctxlua{tex.sprint(colors.spotcolorvalue (\thecolorattribute{#1}))}}
+\def\internalspotcolorname #1{\ctxcommand{spotcolorname(\thecolorattribute{#1})}}
+\def\internalspotcolorparent #1{\ctxcommand{spotcolorparent(\thecolorattribute{#1})}}
+\def\internalspotcolorsize #1{\ctxcommand{spotcolorvalue(\thecolorattribute{#1})}}
-\def\colorcomponents #1{\ctxlua{tex.sprint(colors.colorcomponents (\thecolorattribute {#1}))}}
-\def\transparencycomponents#1{\ctxlua{tex.sprint(colors.transparencycomponents(\thetransparencyattribute{#1}))}}
+\def\colorcomponents #1{\ctxcommand{colorcomponents(\thecolorattribute{#1})}}
+\def\transparencycomponents #1{\ctxcommand{transparencycomponents(\thetransparencyattribute{#1})}}
-\def\colorvalue#1{\ctxlua{tex.sprint(colors.formatcolor(\thecolorattribute{#1},"\colorformatseparator"))}}
-\def\grayvalue #1{\ctxlua{tex.sprint(colors.formatgray (\thecolorattribute{#1},"\colorformatseparator"))}}
+\def\colorvalue #1{\ctxcommand{formatcolor(\thecolorattribute{#1},"\colorformatseparator")}}
+\def\grayvalue #1{\ctxcommand{formatgray (\thecolorattribute{#1},"\colorformatseparator")}}
-\def\doifblackelse #1{\ctxlua{commands.doifelse(colors.isblack(\thecolorattribute{#1}))}}
-\def\doifdrawingblackelse {\ctxlua{commands.doifelse(colors.isblack(tex.attribute[attributes.numbers['color']]))}}
+\def\doifblackelse #1{\ctxcommand{doifblackelse(\thecolorattribute{#1})}}
+\def\doifdrawingblackelse {\ctxcommand{doifdrawingblackelse()}}
%D \macros
%D {forcecolorhack}
diff --git a/Master/texmf-dist/tex/context/base/colo-rgb.mkii b/Master/texmf-dist/tex/context/base/colo-rgb.mkii
new file mode 100644
index 00000000000..038e0ab0bf1
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/colo-rgb.mkii
@@ -0,0 +1,530 @@
+%D \module
+%D [ file=colo-rgb,
+%D version=1995.01.01,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=RGB,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Just to give users a start we define some colors. While
+%D switching fonts is as international as can be, thanks to the
+%D mnemonics, naming colors is very interface dependant. To
+%D support international setups, we define both english and
+%D interface dependant colors. We use the color inheritance
+%D mechanisms to implement the interface dependant ones.
+
+%D First we define some simple primary \cap{RGB} and \cap{CMYK}
+%D colors. All colors are defined in \cap{RGB} color space.
+
+\definecolor [red] [r=1, g=0, b=0]
+\definecolor [green] [r=0, g=1, b=0]
+\definecolor [blue] [r=0, g=0, b=1]
+
+\definecolor [cyan] [r=0, g=1, b=1]
+\definecolor [magenta] [r=1, g=0, b=1]
+\definecolor [yellow] [r=1, g=1, b=0]
+
+\definecolor [white] [s=1] % [r=1, g=1, b=1]
+\definecolor [black] [s=0]
+\definecolor [gray] [s=.9]
+
+\definecolor [darkred] [r=.8, g=0, b=0]
+\definecolor [middlered] [r=.9, g=0, b=0]
+\definecolor [lightred] [r=1, g=0, b=0]
+
+\definecolor [darkgreen] [r=0, g=.6, b=0]
+\definecolor [middlegreen] [r=0, g=.8, b=0]
+\definecolor [lightgreen] [r=0, g=1, b=0]
+
+\definecolor [darkblue] [r=0, g=0, b=.8]
+\definecolor [middleblue] [r=0, g=0, b=.9]
+\definecolor [lightblue] [r=0, g=0, b=1]
+
+\definecolor [darkcyan] [r=.6, g=.8, b=.8]
+\definecolor [middlecyan] [r=0, g=.8, b=.8]
+
+\definecolor [darkmagenta] [r=.8, g=.6, b=.8]
+\definecolor [middlemagenta] [r=1, g=0, b=.6]
+
+\definecolor [darkyellow] [r=.8, g=.8, b=.6]
+\definecolor [middleyellow] [r=1, g=1, b=.2]
+
+\definecolor [darkgray] [s=.5]
+\definecolor [middlegray] [s=.7]
+\definecolor [lightgray] [s=.9]
+
+%D These colors are mapped to interface dependant colornames.
+
+\startinterface dutch
+
+ \definecolor [rood] [red]
+ \definecolor [groen] [green]
+ \definecolor [blauw] [blue]
+
+ \definecolor [cyaan] [cyan]
+ \definecolor [magenta] [magenta]
+ \definecolor [geel] [yellow]
+
+ \definecolor [wit] [white]
+ \definecolor [grijs] [gray]
+ \definecolor [zwart] [black]
+
+ \definecolor [donkerrood] [darkred]
+ \definecolor [middelrood] [middlered]
+ \definecolor [lichtrood] [lightred]
+
+ \definecolor [donkergroen] [darkgreen]
+ \definecolor [middelgroen] [middlegreen]
+ \definecolor [lichtgroen] [lightgreen]
+
+ \definecolor [donkerblauw] [darkblue]
+ \definecolor [middelblauw] [middleblue]
+ \definecolor [lichtblauw] [lightblue]
+
+ \definecolor [donkercyaan] [darkcyan]
+ \definecolor [middelcyaan] [middlecyan]
+
+ \definecolor [donkermagenta] [darkmagenta]
+ \definecolor [middelmagenta] [middlemagenta]
+
+ \definecolor [donkergeel] [darkyellow]
+ \definecolor [middelgeel] [middleyellow]
+
+ \definecolor [donkergrijs] [darkgray]
+ \definecolor [middengrijs] [middlegray]
+ \definecolor [lichtgrijs] [lightgray]
+
+\stopinterface
+
+\startinterface german
+
+ \definecolor [rot] [red]
+ \definecolor [gruen] [green]
+ \definecolor [blau] [blue]
+
+ \definecolor [cyan] [cyan]
+ \definecolor [magenta] [magenta]
+ \definecolor [gelb] [yellow]
+
+ \definecolor [weiss] [white]
+ \definecolor [grau] [gray]
+ \definecolor [schwarz] [black]
+
+ \definecolor [dunkelrot] [darkred]
+ \definecolor [mittelrot] [middlered]
+ \definecolor [hellrot] [lightred]
+
+ \definecolor [dunkelgruen] [darkgreen]
+ \definecolor [mittelgruen] [middlegreen]
+ \definecolor [hellgruen] [lightgreen]
+
+ \definecolor [dunkelblau] [darkblue]
+ \definecolor [mittelblau] [middleblue]
+ \definecolor [hellblau] [lightblue]
+
+ \definecolor [dunkelcyan] [darkcyan]
+ \definecolor [mittelcyan] [middlecyan]
+
+ \definecolor [dunkelmagenta] [darkmagenta]
+ \definecolor [mittelmagenta] [middlemagenta]
+
+ \definecolor [dunkelgelb] [darkyellow]
+ \definecolor [mittelgelb] [middleyellow]
+
+ \definecolor [dunkelgrau] [darkgray]
+ \definecolor [mittelgrau] [middlegray]
+ \definecolor [hellgrau] [lightgray]
+
+\stopinterface
+
+\startinterface czech
+
+ \definecolor [cervena] [red]
+ \definecolor [zelena] [green]
+ \definecolor [modra] [blue]
+
+ \definecolor [azurova] [cyan]
+ \definecolor [fialova] [magenta]
+ \definecolor [zluta] [yellow]
+
+ \definecolor [bila] [white]
+ \definecolor [cerna] [black]
+
+ \definecolor [tmavecervena] [darkred]
+ \definecolor [strednecervena] [middlered]
+ \definecolor [svetlecervena] [lightred]
+
+ \definecolor [tmavezelena] [darkgreen]
+ \definecolor [strednezelena] [middlegreen]
+ \definecolor [svetlezelena] [lightgreen]
+
+ \definecolor [tmavemodra] [darkblue]
+ \definecolor [strednemodra] [middleblue]
+ \definecolor [svetlemodra] [lightblue]
+
+ \definecolor [tmaveazurova] [darkcyan]
+ \definecolor [stredneazurova] [middlecyan]
+
+ \definecolor [tmavefialova] [darkmagenta]
+ \definecolor [strednefialova] [middlemagenta]
+
+ \definecolor [tmavezluta] [darkyellow]
+ \definecolor [strednezluta] [middleyellow]
+
+ \definecolor [tmaveseda] [darkgray]
+ \definecolor [stredneseda] [middlegray]
+ \definecolor [svetleseda] [lightgray]
+
+\stopinterface
+
+\startinterface italian
+
+ \definecolor [rosso] [red]
+ \definecolor [verde] [green]
+ \definecolor [blu] [blue]
+
+ \definecolor [azzurro] [cyan]
+ \definecolor [turchino] [cyan]
+ \definecolor [ciano] [cyan]
+ \definecolor [cremisi] [magenta]
+ \definecolor [giallo] [yellow]
+
+ \definecolor [bianco] [white]
+ \definecolor [grigio] [gray]
+ \definecolor [nero] [black]
+
+ \definecolor [rossoscuro] [darkred]
+ \definecolor [rossomedio] [middlered]
+ \definecolor [rossochiaro] [lightred]
+
+ \definecolor [verdescuro] [darkgreen]
+ \definecolor [verdemedio] [middlegreen]
+ \definecolor [verdechiaro] [lightgreen]
+
+ \definecolor [bluscuro] [darkblue]
+ \definecolor [blumedio] [middleblue]
+ \definecolor [bluchiaro] [lightblue]
+
+ \definecolor [azzurroscuro] [darkcyan]
+ \definecolor [azzurrochiaro] [middlecyan]
+
+ \definecolor [cremisiscuro] [darkmagenta]
+ \definecolor [cremisichiaro] [middlemagenta]
+
+
+ \definecolor [gialloscuro] [darkyellow]
+ \definecolor [giallomedio] [middleyellow]
+
+ \definecolor [grigioscuro] [darkgray]
+ \definecolor [grigiomedio] [middlegray]
+ \definecolor [grigiochiaro] [lightgray]
+
+\stopinterface
+
+\startinterface romanian
+
+ \definecolor [rosu] [red]
+ \definecolor [verde] [green]
+ \definecolor [albastru] [blue]
+
+ \definecolor [cian] [cyan]
+ \definecolor [magenta] [magenta]
+ \definecolor [galben] [yellow]
+
+ \definecolor [alb] [white]
+ \definecolor [gri] [gray]
+ \definecolor [negru] [black]
+
+ \definecolor [rosuinchis] [darkred]
+ \definecolor [rosumediu] [middlered]
+ \definecolor [rosudeschis] [lightred]
+
+ \definecolor [verdeinchis] [darkgreen]
+ \definecolor [verdemediu] [middlegreen]
+ \definecolor [verdedeschis] [lightgreen]
+
+ \definecolor [albastruinchis] [darkblue]
+ \definecolor [albastrumediu] [middleblue]
+ \definecolor [albastrudeschis] [lightblue]
+
+ \definecolor [cianinchis] [darkcyan]
+ \definecolor [cianmediu] [middlecyan]
+
+ \definecolor [magentainchis] [darkmagenta]
+ \definecolor [magentamediu] [middlemagenta]
+
+ \definecolor [galbeninchis] [darkyellow]
+ \definecolor [galbenmediu] [middleyellow]
+
+ \definecolor [griinchis] [darkgray]
+ \definecolor [grimediu] [middlegray]
+ \definecolor [grideschis] [lightgray]
+
+\stopinterface
+
+%D Like colors, we first define the english colorgroups. These
+%D colorgroups are tuned for distinctive gray scale printing.
+
+% todo : more efficient and real gray
+
+\definecolorgroup
+ [gray]
+ [0.95:0.95:0.95,
+ 0.90:0.90:0.90,
+ 0.80:0.80:0.80,
+ 0.70:0.70:0.70,
+ 0.60:0.60:0.60,
+ 0.50:0.50:0.50,
+ 0.40:0.40:0.40,
+ 0.30:0.30:0.30,
+ 0.20:0.20:0.20,
+ 0.10:0.10:0.10,
+ 0.00:0.00:0.00]
+
+\definecolorgroup
+ [red]
+ [1.00:0.90:0.90,
+ 1.00:0.80:0.80,
+ 1.00:0.70:0.70,
+ 1.00:0.55:0.55,
+ 1.00:0.40:0.40,
+ 1.00:0.25:0.25,
+ 1.00:0.15:0.15,
+ 0.90:0.00:0.00]
+
+\definecolorgroup
+ [green]
+ [0.90:1.00:0.90,
+ 0.70:1.00:0.70,
+ 0.50:1.00:0.50,
+ 0.30:1.00:0.30,
+ 0.15:0.90:0.15,
+ 0.00:0.80:0.00,
+ 0.00:0.65:0.00,
+ 0.00:0.50:0.00]
+
+\definecolorgroup
+ [blue]
+ [0.90:0.95:1.00,
+ 0.80:0.90:1.00,
+ 0.55:0.85:1.00,
+ 0.30:0.80:1.00,
+ 0.15:0.75:1.00,
+ 0.00:0.70:1.00,
+ 0.00:0.55:1.00,
+ 0.00:0.40:1.00]
+
+\definecolorgroup
+ [cyan]
+ [0.80:1.00:1.00,
+ 0.60:1.00:1.00,
+ 0.30:1.00:1.00,
+ 0.00:0.95:0.95,
+ 0.00:0.85:0.85,
+ 0.00:0.75:0.75,
+ 0.00:0.60:0.60,
+ 0.00:0.50:0.50]
+
+\definecolorgroup
+ [magenta]
+ [1.00:0.90:1.00,
+ 1.00:0.80:1.00,
+ 1.00:0.65:1.00,
+ 1.00:0.50:1.00,
+ 1.00:0.35:1.00,
+ 1.00:0.15:1.00,
+ 0.90:0.05:0.90,
+ 0.80:0.00:0.80]
+
+\definecolorgroup
+ [yellow]
+ [1.00:1.00:0.70,
+ 1.00:1.00:0.00,
+ 1.00:0.85:0.05,
+ 1.00:0.70:0.00,
+ 1.00:0.55:0.00,
+ 0.95:0.40:0.00,
+ 0.80:0.30:0.00,
+ 0.60:0.30:0.00]
+
+\definecolorgroup
+ [red*]
+ [1.00:0.95:0.95,
+ 1.00:0.90:0.90,
+ 1.00:0.80:0.80,
+ 1.00:0.70:0.70,
+ 1.00:0.60:0.60,
+ 1.00:0.50:0.50,
+ 1.00:0.40:0.40,
+ 1.00:0.30:0.30]
+
+\definecolorgroup
+ [green*]
+ [0.95:1.00:0.95,
+ 0.90:1.00:0.90,
+ 0.80:1.00:0.80,
+ 0.70:1.00:0.70,
+ 0.60:1.00:0.60,
+ 0.50:1.00:0.50,
+ 0.40:1.00:0.40,
+ 0.30:1.00:0.30]
+
+\definecolorgroup
+ [blue*]
+ [0.95:0.95:1.00,
+ 0.90:0.90:1.00,
+ 0.80:0.80:1.00,
+ 0.70:0.70:1.00,
+ 0.60:0.60:1.00,
+ 0.50:0.50:1.00,
+ 0.40:0.40:1.00,
+ 0.30:0.30:1.00]
+
+\definecolorgroup
+ [yellow*]
+ [1.00:1.00:0.10,
+ 1.00:1.00:0.00,
+ 0.90:0.90:0.00,
+ 0.80:0.80:0.00,
+ 0.70:0.70:0.00,
+ 0.60:0.60:0.00,
+ 0.50:0.50:0.00,
+ 0.40:0.40:0.00]
+
+%D For the sake of implementing interface dependant color
+%D groups we support colorgroup duplication.
+
+\startinterface dutch
+ \definecolorgroup [grijs] [gray]
+ \definecolorgroup [rood] [red]
+ \definecolorgroup [groen] [green]
+ \definecolorgroup [blauw] [blue]
+ \definecolorgroup [cyaan] [cyan]
+ \definecolorgroup [magenta] [magenta]
+ \definecolorgroup [geel] [yellow]
+ \definecolorgroup [rood*] [red*]
+ \definecolorgroup [groen*] [green*]
+ \definecolorgroup [blauw*] [blue*]
+ \definecolorgroup [geel*] [yellow*]
+\stopinterface
+
+\startinterface german
+ \definecolorgroup [grau] [gray]
+ \definecolorgroup [rot] [red]
+ \definecolorgroup [gruen] [green]
+ \definecolorgroup [blau] [blue]
+ \definecolorgroup [cyan] [cyan]
+ \definecolorgroup [magenta] [magenta]
+ \definecolorgroup [gelb] [yellow]
+ \definecolorgroup [rot*] [red*]
+ \definecolorgroup [gruen*] [green*]
+ \definecolorgroup [blau*] [blue*]
+ \definecolorgroup [gelb*] [yellow*]
+\stopinterface
+
+\startinterface czech
+ \definecolorgroup [seda] [gray]
+ \definecolorgroup [cervena] [red]
+ \definecolorgroup [zelena] [green]
+ \definecolorgroup [modra] [blue]
+ \definecolorgroup [azurova] [cyan]
+ \definecolorgroup [fialova] [magenta]
+ \definecolorgroup [zluta] [yellow]
+ \definecolorgroup [cervena*] [red*]
+ \definecolorgroup [zelena*] [green*]
+ \definecolorgroup [modra*] [blue*]
+ \definecolorgroup [zluta*] [yellow*]
+\stopinterface
+
+\startinterface italian
+ \definecolorgroup [grigio] [gray]
+ \definecolorgroup [rosso] [red]
+ \definecolorgroup [verde] [green]
+ \definecolorgroup [blu] [blue]
+ \definecolorgroup [ciano] [cyan]
+ \definecolorgroup [azzurro] [cyan]
+ \definecolorgroup [turchino][cyan]
+ \definecolorgroup [magenta] [magenta]
+ \definecolorgroup [cremisi] [magenta]
+ \definecolorgroup [giallo] [yellow]
+ \definecolorgroup [rosso*] [red*]
+ \definecolorgroup [verde*] [green*]
+ \definecolorgroup [blu*] [blue*]
+ \definecolorgroup [giallo*] [yellow*]
+\stopinterface
+
+%D The next set of color palets is quite language independant.
+%D These palets are meant as examples.
+
+\definepalet
+ [alfa]
+ [ top=red:7,
+ bottom=green:6,
+ up=blue:5,
+ down=cyan:4,
+ strange=magenta:3,
+ charm=yellow:2]
+
+\definepalet
+ [beta]
+ [ top=red:7,
+ bottom=green:5,
+ up=blue:3,
+ down=cyan:6,
+ strange=magenta:2,
+ charm=yellow:1]
+
+\definepalet
+ [gamma]
+ [ top=red:2,
+ bottom=green:5,
+ up=blue:3,
+ down=cyan:6,
+ strange=magenta:7,
+ charm=yellow:4]
+
+\definepalet
+ [delta]
+ [ top=yellow*:5,
+ bottom=yellow*:3,
+ up=yellow*:2,
+ down=magenta:6,
+ strange=blue:4,
+ charm=blue:1]
+
+\definepalet
+ [epsilon]
+ [ top=cyan:7,
+ bottom=cyan:5,
+ up=blue:3,
+ down=yellow:6,
+ strange=yellow:4,
+ charm=yellow:2]
+
+\definepalet
+ [zeta]
+ [ top=red:6,
+ bottom=green:5,
+ up=blue:7,
+ down=cyan:4,
+ strange=magenta:3,
+ charm=yellow:2]
+
+%D The next four colors are used for typesetting verbatim \TEX\
+%D in color.
+
+\definecolor [texcolorone] [middlered]
+\definecolor [texcolortwo] [middlegreen]
+\definecolor [texcolorthree] [middleblue]
+\definecolor [texcolorfour] [darkyellow]
+
+%D Bonus (needed for FO test):
+
+\definecolor [orange] [r=1,g=.5]
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/colo-run.tex b/Master/texmf-dist/tex/context/base/colo-run.mkii
index d94ea980128..d94ea980128 100644
--- a/Master/texmf-dist/tex/context/base/colo-run.tex
+++ b/Master/texmf-dist/tex/context/base/colo-run.mkii
diff --git a/Master/texmf-dist/tex/context/base/colo-run.mkiv b/Master/texmf-dist/tex/context/base/colo-run.mkiv
new file mode 100644
index 00000000000..d94ea980128
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/colo-run.mkiv
@@ -0,0 +1,257 @@
+%D \module
+%D [ file=colo-run,
+%D version=1997.04.01,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=Runtime loaded commands,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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
+
+% temp hack (not do be documented)
+
+% \gdef\doformatcolorP#1:#2:#3:#4:#5:#6\od % was undefined in colo-ini
+% {#1\colorformatseparator
+% \dodoformatcolor{#2}\colorformatseparator
+% \dodoformatcolor{#3}\colorformatseparator
+% \dodoformatcolor{#4}\colorformatseparator}
+
+% \gdef\doformatgrayP#1:#2:#3:#4:#5:#6\od
+% {todo}
+
+% so far
+
+\gdef\showpalet
+ {\dodoubleargument\doshowpalet}
+
+\gdef\doshowpalet[#1][#2]%
+ {\doifdefined{\??pa#1}
+ {\doifinsetelse\v!vertical{#2}
+ {\showverticalpalet[#1][#2]}
+ {\showhorizontalpalet[#1][#2]}}}
+
+\gdef\showverticalpalet[#1][#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet[#1]
+ \def\rule
+ {\vrule\!!width3em\!!height\strutht\!!depth\strutdp}
+ \tabskip\zeropoint
+ \def\doshowpalet##1%
+ {\doifinsetelse\v!number{#2}{##1\hskip.5em}{}&
+ \color[##1]{\rule}\graycolor[##1]{\rule}&
+ \doifinset\v!value{#2}{\hskip.5em\colorvalue{##1}}\crcr}
+ \halign
+ {\hss##&\hss##\hss&##\cr
+ &\doifinset{\v!name}{#2}{\strut#1}&\cr%
+ \processpalet[#1]\doshowpalet\crcr}}}
+
+\gdef\showhorizontalpalet[#1][#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet[#1]
+ \tabskip\zeropoint
+ \!!widtha\zeropoint
+ \doifinset\v!number{#2}
+ {\def\doshowpalet##1%
+ {\setbox0\hbox{##1}%
+ \ifdim\!!widtha<\wd0\!!widtha\wd0\fi}%
+ \processpalet[#1]\doshowpalet}%
+ \advance\!!widtha 1em
+ \ifdim\!!widtha<5em
+ \!!widtha5em
+ \fi
+ \halign
+ {##&&\hbox to \!!widtha{\hss##\hss}\cr
+ \doifinset\v!number{#2}
+ {\def\doshowpalet##1{&\strut##1}%
+ \processpalet[#1]\doshowpalet}\cr
+ \doifinset\v!name{#2}{#1\hskip.5em}%
+ \def\doshowpalet##1%
+ {&\strut\color[##1]{\vrule\!!width\!!widtha\!!height\strutht\!!depth\zeropoint}}%
+ \processpalet[#1]\doshowpalet\crcr
+ \noalign{\vskip-\strutdepth}%
+ \def\doshowpalet##1%
+ {&\graycolor[##1]{\vrule\!!width\!!widtha\!!height\zeropoint\!!depth\strutdp}}%
+ \processpalet[#1]\doshowpalet\crcr
+ \doifinset\v!value{#2}
+ {\def\doshowpalet##1%
+ {&\vbox
+ {\hsize\!!widtha
+ \vskip.25ex
+ \everypar{\strut}
+ \veryraggedcenter
+ \let\colorformatseparator=\endgraf
+ \colorvalue{##1}}}%
+ \processpalet[#1]\doshowpalet}%
+ \crcr}}}
+
+\gdef\processpalet[#1]%
+ {\expanded{\globalprocesscommalist[\getvalue{\??pa#1}]}}
+
+\gdef\showcolorgroup
+ {\dodoubleargument\doshowcolorgroup}
+
+\gdef\doshowcolorgroup[#1][#2]%
+ {\doifcolor{#1:1}
+ {\doifinsetelse\v!vertical{#2}
+ {\showverticalcolorgroup[#1][#2]}
+ {\showhorizontalcolorgroup[#1][#2]}}}
+
+\gdef\showhorizontalcolorgroup[#1][#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet
+ \tabskip\zeropoint
+ \def\rule
+ {\vrule\!!width4em\!!height\strutht\!!depth\strutdp}
+ \def\colorformatseparator{\strut\cr}
+ \def\dodoshowgroup##1%
+ {\halign
+ {\hss####\hss\cr
+ \doifinset\v!number{#2}{\strut##1}\cr
+ \color[#1:##1]{\vrule\!!width4em\!!height\strutht\!!depth\zeropoint}\cr
+ \graycolor[#1:##1]{\vrule\!!width4em\!!height\zeropoint\!!depth\strutdp}\cr
+ \doifinset\v!value{#2}{\colorvalue{#1:##1}\strut}\crcr}}
+ \def\doshowgroup##1%
+ {\doifcolor{#1:##1}
+ {\vbox{\dodoshowgroup{##1}}}}%
+ \hbox
+ {\doifinset\v!name{#2}
+ {\strut
+ \doifinsetelse\v!value{#2}
+ {\raise3\lineheight\hbox{#1\hskip.5em}}
+ {#1}%
+ \hskip.5em}%
+ \doshowgroup1\doshowgroup2\doshowgroup3\doshowgroup4%
+ \doshowgroup5\doshowgroup6\doshowgroup7\doshowgroup8}}}
+
+\gdef\showverticalcolorgroup[#1][#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet
+ \tabskip\zeropoint
+ \def\rule
+ {\vrule\!!width2.5em\!!height\strutht\!!depth\strutdp}%
+ \def\doshowgroup##1%
+ {\doifcolor{#1:##1}
+ {\doifinset\v!number{#2}{##1\hskip.5em}&
+ \color[#1:##1]{\rule}\graycolor[#1:##1]{\rule}&
+ \doifinset\v!value{#2}{\hskip.5em\colorvalue{#1:##1}}\crcr}}%
+ \halign
+ {\hss##&\hss##\hss&##\hss\cr
+ &\doifinset\v!name{#2}{\strut#1}&\crcr
+ \doshowgroup1\doshowgroup2\doshowgroup3\doshowgroup4%
+ \doshowgroup5\doshowgroup6\doshowgroup7\doshowgroup8}}}
+
+\gdef\showcolor
+ {\dosingleempty\doshowcolor}
+
+\gdef\doshowcolor[#1]%
+ {\bgroup
+ \iffirstargument
+ \let\colorlist\empty % not really used, only for colo-run
+ \let\colorstyle\empty
+ \settrue\collectcolorsinlist
+ \setupcolor[#1]%
+ \fi
+ \def\rule
+ {\vrule\!!width4em\!!height\strutht\!!depth\strutdp}%
+ \def\docommand##1%
+ {\NC\graycolor[##1]{\rule}\NC\color[##1]{\rule}\NC\grayvalue{##1}\NC\colorvalue{##1}\NC##1\NC\NR}%
+ \starttabulate[|l|l|l|l|l|l|l|]
+ \expanded{\globalprocesscommalist[\colorlist]}\docommand
+ \stoptabulate
+ \egroup}
+
+\gdef\comparepalet
+ {\dosingleargument\docomparepalet}
+
+\gdef\docomparepalet[#1]%
+ {\doifdefined{\??pa#1}
+ {\hbox
+ {\dodocomparepalet\color[#1]%
+ \quad
+ \dodocomparepalet\graycolor[#1]}}}
+
+\gdef\dodocomparepalet#1[#2]%
+ {\localvbox
+ {\offinterlineskip
+ \setuppalet[#2]
+ \getcommacommandsize[\getvalue{\??pa#2}]
+ \!!widtha2em\relax
+ \hsize\commalistsize\!!widtha
+ \def\rule%
+ {\vrule\!!width.5\!!widtha\!!height2.25ex\!!depth-.75ex}
+ \def\dododocomparepalet##1%
+ {\hbox
+ {\setbox0\hbox
+ {#1[##1]{\vrule\!!width\hsize\!!height3ex}}%
+ \wd0\zeropoint
+ \box0
+ \hbox to \hsize
+ {\def\dododocomparepalet####1%
+ {\hbox to \!!widtha
+ {\hss#1[####1]{\rule}\hss}}%
+ \processcommacommand[\getvalue{\??pa#2}]\dododocomparepalet}}
+ \endgraf}
+ \processcommacommand[\getvalue{\??pa#2}]\dododocomparepalet}}
+
+\gdef\comparecolorgroup
+ {\dosingleargument\docomparecolorgroup}
+
+\gdef\docomparecolorgroup[#1]%
+ {\doifcolor{#1:1}
+ {\hbox
+ {\dodocomparecolorgroup\color[#1]%
+ \quad
+ \dodocomparecolorgroup\graycolor[#1]}}}
+
+\gdef\dodocomparecolorgroup#1[#2]%
+ {\localvbox
+ {\!!counta\zerocount
+ \dorecurse{15}
+ {\doifcolor{#2:\recurselevel}{\advance\!!counta\plusone}}
+ \!!widtha2em\relax
+ \hsize\!!counta\!!widtha
+ \def\rule
+ {\vrule\!!width.5\!!widtha\!!height2.25ex\!!depth-.75ex}
+ \def\dododocomparecolorgroup##1%
+ {\hbox to \hsize
+ {\setbox0\hbox
+ {#1[#2:##1]{\vrule\!!width\hsize\!!height3ex}}%
+ \wd0\zeropoint
+ \box0
+ \hbox to \hsize
+ {\hss\dorecurse\!!counta{#1[#2:\recurselevel]{\rule}\hss}}}
+ \endgraf}
+ \dorecurse\!!counta{\dododocomparecolorgroup\recurselevel}}}
+
+\gdef\dogetcolorcomponents#1%
+ {\doifelsenothing{#1}
+ {\appendtoks
+ \TB
+ \to \scratchtoks}
+ {\appendtoks
+ \NC\showcolorbar[#1]\NC#1\NC\transparencycomponents{#1}\NC\colorcomponents{#1}\NC \NR
+ \to \scratchtoks}}
+
+\gdef\showcolorbar[#1]%
+ {\backgroundline[#1]{\strut\enspace\color[white]{white}\enspace\color[black]{black}\enspace}}
+
+\gdef\showcolorcomponents[#1]%
+ {\begingroup
+ \scratchtoks{\TB}%
+ \processcommacommand[#1]\dogetcolorcomponents
+ \starttabulate[|lT|lT|lT|lT|]
+ \NC color \NC name \NC transparency \NC specification \NC\NR
+ \the\scratchtoks
+ \stoptabulate
+ \endgroup}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/colo-x11.mkii b/Master/texmf-dist/tex/context/base/colo-x11.mkii
new file mode 100644
index 00000000000..45d3aac6248
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/colo-x11.mkii
@@ -0,0 +1,677 @@
+%D \module
+%D [ file=colo-x11,
+%D version=2009.11.13,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=X11,
+%D author=Alan Braslau]
+%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 Standard X11 rgb colors (from \type {/usr/share/X11/rgb.txt}):
+
+\doifnotmode{mkiv} {
+ \input colo-hex.mkii
+}
+
+\definecolor [snow] [h=fffafa]
+\definecolor [ghostwhite] [h=f8f8ff]
+\definecolor [whitesmoke] [s=0.96]
+\definecolor [gainsboro] [s=0.86]
+\definecolor [floralwhite] [h=fffaf0]
+\definecolor [oldlace] [h=fdf5e6]
+\definecolor [linen] [h=faf0e6]
+\definecolor [antiquewhite] [h=faebd7]
+\definecolor [papayawhip] [h=ffefd5]
+\definecolor [blanchedalmond] [h=ffebcd]
+\definecolor [bisque] [h=ffe4c4]
+\definecolor [peachpuff] [h=ffdab9]
+\definecolor [navajowhite] [h=ffdead]
+\definecolor [moccasin] [h=ffe4b5]
+\definecolor [cornsilk] [h=fff8dc]
+\definecolor [ivory] [h=fffff0]
+\definecolor [lemonchiffon] [h=fffacd]
+\definecolor [seashell] [h=fff5ee]
+\definecolor [honeydew] [h=f0fff0]
+\definecolor [mintcream] [h=f5fffa]
+\definecolor [azure] [h=f0ffff]
+\definecolor [aliceblue] [h=f0f8ff]
+\definecolor [lavender] [h=e6e6fa]
+\definecolor [lavenderblush] [h=fff0f5]
+\definecolor [mistyrose] [h=ffe4e1]
+\definecolor [white] [s=1]
+\definecolor [black] [s=0]
+\definecolor [darkslategray] [h=2f4f4f]
+\definecolor [darkslategrey] [darkslategray]
+\definecolor [dimgray] [s=0.41]
+\definecolor [dimgrey] [dimgray]
+\definecolor [slategray] [h=708090]
+\definecolor [slategrey] [slategray]
+\definecolor [lightslategray] [h=778899]
+\definecolor [lightslategrey] [lightslategray]
+\definecolor [gray] [s=0.75]
+\definecolor [grey] [gray]
+\definecolor [lightgrey] [s=0.83]
+\definecolor [lightgray] [lightgrey]
+\definecolor [midnightblue] [h=191970]
+\definecolor [navy] [h=000080]
+\definecolor [navyblue] [navy]
+\definecolor [cornflowerblue] [h=6495ed]
+\definecolor [darkslateblue] [h=483d8b]
+\definecolor [slateblue] [h=6a5acd]
+\definecolor [mediumslateblue] [h=7b68ee]
+\definecolor [lightslateblue] [h=8470ff]
+\definecolor [mediumblue] [h=0000cd]
+\definecolor [royalblue] [h=4169e1]
+\definecolor [blue] [h=0000ff]
+\definecolor [dodgerblue] [h=1e90ff]
+\definecolor [deepskyblue] [h=00bfff]
+\definecolor [skyblue] [h=87ceeb]
+\definecolor [lightskyblue] [h=87cefa]
+\definecolor [steelblue] [h=4682b4]
+\definecolor [lightsteelblue] [h=b0c4de]
+\definecolor [lightblue] [h=add8e6]
+\definecolor [powderblue] [h=b0e0e6]
+\definecolor [paleturquoise] [h=afeeee]
+\definecolor [darkturquoise] [h=00ced1]
+\definecolor [mediumturquoise] [h=48d1cc]
+\definecolor [turquoise] [h=40e0d0]
+\definecolor [cyan] [h=00ffff]
+\definecolor [lightcyan] [h=e0ffff]
+\definecolor [cadetblue] [h=5f9ea0]
+\definecolor [mediumaquamarine] [h=66cdaa]
+\definecolor [aquamarine] [h=7fffd4]
+\definecolor [darkgreen] [h=006400]
+\definecolor [darkolivegreen] [h=556b2f]
+\definecolor [darkseagreen] [h=8fbc8f]
+\definecolor [seagreen] [h=2e8b57]
+\definecolor [mediumseagreen] [h=3cb371]
+\definecolor [lightseagreen] [h=20b2aa]
+\definecolor [palegreen] [h=98fb98]
+\definecolor [springgreen] [h=00ff7f]
+\definecolor [lawngreen] [h=7cfc00]
+\definecolor [green] [h=00ff00]
+\definecolor [chartreuse] [h=7fff00]
+\definecolor [mediumspringgreen] [h=00fa9a]
+\definecolor [greenyellow] [h=adff2f]
+\definecolor [limegreen] [h=32cd32]
+\definecolor [yellowgreen] [h=9acd32]
+\definecolor [forestgreen] [h=228b22]
+\definecolor [olivedrab] [h=6b8e23]
+\definecolor [darkkhaki] [h=bdb76b]
+\definecolor [khaki] [h=f0e68c]
+\definecolor [palegoldenrod] [h=eee8aa]
+\definecolor [lightgoldenrodyellow] [h=fafad2]
+\definecolor [lightyellow] [h=ffffe0]
+\definecolor [yellow] [h=ffff00]
+\definecolor [gold] [h=ffd700]
+\definecolor [lightgoldenrod] [h=eedd82]
+\definecolor [goldenrod] [h=daa520]
+\definecolor [darkgoldenrod] [h=b8860b]
+\definecolor [rosybrown] [h=bc8f8f]
+\definecolor [indianred] [h=cd5c5c]
+\definecolor [saddlebrown] [h=8b4513]
+\definecolor [sienna] [h=a0522d]
+\definecolor [peru] [h=cd853f]
+\definecolor [burlywood] [h=deb887]
+\definecolor [beige] [h=f5f5dc]
+\definecolor [wheat] [h=f5deb3]
+\definecolor [sandybrown] [h=f4a460]
+\definecolor [tan] [h=d2b48c]
+\definecolor [chocolate] [h=d2691e]
+\definecolor [firebrick] [h=b22222]
+\definecolor [brown] [h=a52a2a]
+\definecolor [darksalmon] [h=e9967a]
+\definecolor [salmon] [h=fa8072]
+\definecolor [lightsalmon] [h=ffa07a]
+\definecolor [orange] [h=ffa500]
+\definecolor [darkorange] [h=ff8c00]
+\definecolor [coral] [h=ff7f50]
+\definecolor [lightcoral] [h=f08080]
+\definecolor [tomato] [h=ff6347]
+\definecolor [orangered] [h=ff4500]
+\definecolor [red] [h=ff0000]
+\definecolor [hotpink] [h=ff69b4]
+\definecolor [deeppink] [h=ff1493]
+\definecolor [pink] [h=ffc0cb]
+\definecolor [lightpink] [h=ffb6c1]
+\definecolor [palevioletred] [h=db7093]
+\definecolor [maroon] [h=b03060]
+\definecolor [mediumvioletred] [h=c71585]
+\definecolor [violetred] [h=d02090]
+\definecolor [magenta] [h=ff00ff]
+\definecolor [violet] [h=ee82ee]
+\definecolor [plum] [h=dda0dd]
+\definecolor [orchid] [h=da70d6]
+\definecolor [mediumorchid] [h=ba55d3]
+\definecolor [darkorchid] [h=9932cc]
+\definecolor [darkviolet] [h=9400d3]
+\definecolor [blueviolet] [h=8a2be2]
+\definecolor [purple] [h=a020f0]
+\definecolor [mediumpurple] [h=9370db]
+\definecolor [thistle] [h=d8bfd8]
+\definecolor [snow1] [h=fffafa]
+\definecolor [snow2] [h=eee9e9]
+\definecolor [snow3] [h=cdc9c9]
+\definecolor [snow4] [h=8b8989]
+\definecolor [seashell1] [h=fff5ee]
+\definecolor [seashell2] [h=eee5de]
+\definecolor [seashell3] [h=cdc5bf]
+\definecolor [seashell4] [h=8b8682]
+\definecolor [antiquewhite1] [h=ffefdb]
+\definecolor [antiquewhite2] [h=eedfcc]
+\definecolor [antiquewhite3] [h=cdc0b0]
+\definecolor [antiquewhite4] [h=8b8378]
+\definecolor [bisque1] [h=ffe4c4]
+\definecolor [bisque2] [h=eed5b7]
+\definecolor [bisque3] [h=cdb79e]
+\definecolor [bisque4] [h=8b7d6b]
+\definecolor [peachpuff1] [h=ffdab9]
+\definecolor [peachpuff2] [h=eecbad]
+\definecolor [peachpuff3] [h=cdaf95]
+\definecolor [peachpuff4] [h=8b7765]
+\definecolor [navajowhite1] [h=ffdead]
+\definecolor [navajowhite2] [h=eecfa1]
+\definecolor [navajowhite3] [h=cdb38b]
+\definecolor [navajowhite4] [h=8b795e]
+\definecolor [lemonchiffon1] [h=fffacd]
+\definecolor [lemonchiffon2] [h=eee9bf]
+\definecolor [lemonchiffon3] [h=cdc9a5]
+\definecolor [lemonchiffon4] [h=8b8970]
+\definecolor [cornsilk1] [h=fff8dc]
+\definecolor [cornsilk2] [h=eee8cd]
+\definecolor [cornsilk3] [h=cdc8b1]
+\definecolor [cornsilk4] [h=8b8878]
+\definecolor [ivory1] [h=fffff0]
+\definecolor [ivory2] [h=eeeee0]
+\definecolor [ivory3] [h=cdcdc1]
+\definecolor [ivory4] [h=8b8b83]
+\definecolor [honeydew1] [h=f0fff0]
+\definecolor [honeydew2] [h=e0eee0]
+\definecolor [honeydew3] [h=c1cdc1]
+\definecolor [honeydew4] [h=838b83]
+\definecolor [lavenderblush1] [h=fff0f5]
+\definecolor [lavenderblush2] [h=eee0e5]
+\definecolor [lavenderblush3] [h=cdc1c5]
+\definecolor [lavenderblush4] [h=8b8386]
+\definecolor [mistyrose1] [h=ffe4e1]
+\definecolor [mistyrose2] [h=eed5d2]
+\definecolor [mistyrose3] [h=cdb7b5]
+\definecolor [mistyrose4] [h=8b7d7b]
+\definecolor [azure1] [h=f0ffff]
+\definecolor [azure2] [h=e0eeee]
+\definecolor [azure3] [h=c1cdcd]
+\definecolor [azure4] [h=838b8b]
+\definecolor [slateblue1] [h=836fff]
+\definecolor [slateblue2] [h=7a67ee]
+\definecolor [slateblue3] [h=6959cd]
+\definecolor [slateblue4] [h=473c8b]
+\definecolor [royalblue1] [h=4876ff]
+\definecolor [royalblue2] [h=436eee]
+\definecolor [royalblue3] [h=3a5fcd]
+\definecolor [royalblue4] [h=27408b]
+\definecolor [blue1] [h=0000ff]
+\definecolor [blue2] [h=0000ee]
+\definecolor [blue3] [h=0000cd]
+\definecolor [blue4] [h=00008b]
+\definecolor [dodgerblue1] [h=1e90ff]
+\definecolor [dodgerblue2] [h=1c86ee]
+\definecolor [dodgerblue3] [h=1874cd]
+\definecolor [dodgerblue4] [h=104e8b]
+\definecolor [steelblue1] [h=63b8ff]
+\definecolor [steelblue2] [h=5cacee]
+\definecolor [steelblue3] [h=4f94cd]
+\definecolor [steelblue4] [h=36648b]
+\definecolor [deepskyblue1] [h=00bfff]
+\definecolor [deepskyblue2] [h=00b2ee]
+\definecolor [deepskyblue3] [h=009acd]
+\definecolor [deepskyblue4] [h=00688b]
+\definecolor [skyblue1] [h=87ceff]
+\definecolor [skyblue2] [h=7ec0ee]
+\definecolor [skyblue3] [h=6ca6cd]
+\definecolor [skyblue4] [h=4a708b]
+\definecolor [lightskyblue1] [h=b0e2ff]
+\definecolor [lightskyblue2] [h=a4d3ee]
+\definecolor [lightskyblue3] [h=8db6cd]
+\definecolor [lightskyblue4] [h=607b8b]
+\definecolor [slategray1] [h=c6e2ff]
+\definecolor [slategray2] [h=b9d3ee]
+\definecolor [slategray3] [h=9fb6cd]
+\definecolor [slategray4] [h=6c7b8b]
+\definecolor [lightsteelblue1] [h=cae1ff]
+\definecolor [lightsteelblue2] [h=bcd2ee]
+\definecolor [lightsteelblue3] [h=a2b5cd]
+\definecolor [lightsteelblue4] [h=6e7b8b]
+\definecolor [lightblue1] [h=bfefff]
+\definecolor [lightblue2] [h=b2dfee]
+\definecolor [lightblue3] [h=9ac0cd]
+\definecolor [lightblue4] [h=68838b]
+\definecolor [lightcyan1] [h=e0ffff]
+\definecolor [lightcyan2] [h=d1eeee]
+\definecolor [lightcyan3] [h=b4cdcd]
+\definecolor [lightcyan4] [h=7a8b8b]
+\definecolor [paleturquoise1] [h=bbffff]
+\definecolor [paleturquoise2] [h=aeeeee]
+\definecolor [paleturquoise3] [h=96cdcd]
+\definecolor [paleturquoise4] [h=668b8b]
+\definecolor [cadetblue1] [h=98f5ff]
+\definecolor [cadetblue2] [h=8ee5ee]
+\definecolor [cadetblue3] [h=7ac5cd]
+\definecolor [cadetblue4] [h=53868b]
+\definecolor [turquoise1] [h=00f5ff]
+\definecolor [turquoise2] [h=00e5ee]
+\definecolor [turquoise3] [h=00c5cd]
+\definecolor [turquoise4] [h=00868b]
+\definecolor [cyan1] [h=00ffff]
+\definecolor [cyan2] [h=00eeee]
+\definecolor [cyan3] [h=00cdcd]
+\definecolor [cyan4] [h=008b8b]
+\definecolor [darkslategray1] [h=97ffff]
+\definecolor [darkslategray2] [h=8deeee]
+\definecolor [darkslategray3] [h=79cdcd]
+\definecolor [darkslategray4] [h=528b8b]
+\definecolor [aquamarine1] [h=7fffd4]
+\definecolor [aquamarine2] [h=76eec6]
+\definecolor [aquamarine3] [h=66cdaa]
+\definecolor [aquamarine4] [h=458b74]
+\definecolor [darkseagreen1] [h=c1ffc1]
+\definecolor [darkseagreen2] [h=b4eeb4]
+\definecolor [darkseagreen3] [h=9bcd9b]
+\definecolor [darkseagreen4] [h=698b69]
+\definecolor [seagreen1] [h=54ff9f]
+\definecolor [seagreen2] [h=4eee94]
+\definecolor [seagreen3] [h=43cd80]
+\definecolor [seagreen4] [h=2e8b57]
+\definecolor [palegreen1] [h=9aff9a]
+\definecolor [palegreen2] [h=90ee90]
+\definecolor [palegreen3] [h=7ccd7c]
+\definecolor [palegreen4] [h=548b54]
+\definecolor [springgreen1] [h=00ff7f]
+\definecolor [springgreen2] [h=00ee76]
+\definecolor [springgreen3] [h=00cd66]
+\definecolor [springgreen4] [h=008b45]
+\definecolor [green1] [h=00ff00]
+\definecolor [green2] [h=00ee00]
+\definecolor [green3] [h=00cd00]
+\definecolor [green4] [h=008b00]
+\definecolor [chartreuse1] [h=7fff00]
+\definecolor [chartreuse2] [h=76ee00]
+\definecolor [chartreuse3] [h=66cd00]
+\definecolor [chartreuse4] [h=458b00]
+\definecolor [olivedrab1] [h=c0ff3e]
+\definecolor [olivedrab2] [h=b3ee3a]
+\definecolor [olivedrab3] [h=9acd32]
+\definecolor [olivedrab4] [h=698b22]
+\definecolor [darkolivegreen1] [h=caff70]
+\definecolor [darkolivegreen2] [h=bcee68]
+\definecolor [darkolivegreen3] [h=a2cd5a]
+\definecolor [darkolivegreen4] [h=6e8b3d]
+\definecolor [khaki1] [h=fff68f]
+\definecolor [khaki2] [h=eee685]
+\definecolor [khaki3] [h=cdc673]
+\definecolor [khaki4] [h=8b864e]
+\definecolor [lightgoldenrod1] [h=ffec8b]
+\definecolor [lightgoldenrod2] [h=eedc82]
+\definecolor [lightgoldenrod3] [h=cdbe70]
+\definecolor [lightgoldenrod4] [h=8b814c]
+\definecolor [lightyellow1] [h=ffffe0]
+\definecolor [lightyellow2] [h=eeeed1]
+\definecolor [lightyellow3] [h=cdcdb4]
+\definecolor [lightyellow4] [h=8b8b7a]
+\definecolor [yellow1] [h=ffff00]
+\definecolor [yellow2] [h=eeee00]
+\definecolor [yellow3] [h=cdcd00]
+\definecolor [yellow4] [h=8b8b00]
+\definecolor [gold1] [h=ffd700]
+\definecolor [gold2] [h=eec900]
+\definecolor [gold3] [h=cdad00]
+\definecolor [gold4] [h=8b7500]
+\definecolor [goldenrod1] [h=ffc125]
+\definecolor [goldenrod2] [h=eeb422]
+\definecolor [goldenrod3] [h=cd9b1d]
+\definecolor [goldenrod4] [h=8b6914]
+\definecolor [darkgoldenrod1] [h=ffb90f]
+\definecolor [darkgoldenrod2] [h=eead0e]
+\definecolor [darkgoldenrod3] [h=cd950c]
+\definecolor [darkgoldenrod4] [h=8b6508]
+\definecolor [rosybrown1] [h=ffc1c1]
+\definecolor [rosybrown2] [h=eeb4b4]
+\definecolor [rosybrown3] [h=cd9b9b]
+\definecolor [rosybrown4] [h=8b6969]
+\definecolor [indianred1] [h=ff6a6a]
+\definecolor [indianred2] [h=ee6363]
+\definecolor [indianred3] [h=cd5555]
+\definecolor [indianred4] [h=8b3a3a]
+\definecolor [sienna1] [h=ff8247]
+\definecolor [sienna2] [h=ee7942]
+\definecolor [sienna3] [h=cd6839]
+\definecolor [sienna4] [h=8b4726]
+\definecolor [burlywood1] [h=ffd39b]
+\definecolor [burlywood2] [h=eec591]
+\definecolor [burlywood3] [h=cdaa7d]
+\definecolor [burlywood4] [h=8b7355]
+\definecolor [wheat1] [h=ffe7ba]
+\definecolor [wheat2] [h=eed8ae]
+\definecolor [wheat3] [h=cdba96]
+\definecolor [wheat4] [h=8b7e66]
+\definecolor [tan1] [h=ffa54f]
+\definecolor [tan2] [h=ee9a49]
+\definecolor [tan3] [h=cd853f]
+\definecolor [tan4] [h=8b5a2b]
+\definecolor [chocolate1] [h=ff7f24]
+\definecolor [chocolate2] [h=ee7621]
+\definecolor [chocolate3] [h=cd661d]
+\definecolor [chocolate4] [h=8b4513]
+\definecolor [firebrick1] [h=ff3030]
+\definecolor [firebrick2] [h=ee2c2c]
+\definecolor [firebrick3] [h=cd2626]
+\definecolor [firebrick4] [h=8b1a1a]
+\definecolor [brown1] [h=ff4040]
+\definecolor [brown2] [h=ee3b3b]
+\definecolor [brown3] [h=cd3333]
+\definecolor [brown4] [h=8b2323]
+\definecolor [salmon1] [h=ff8c69]
+\definecolor [salmon2] [h=ee8262]
+\definecolor [salmon3] [h=cd7054]
+\definecolor [salmon4] [h=8b4c39]
+\definecolor [lightsalmon1] [h=ffa07a]
+\definecolor [lightsalmon2] [h=ee9572]
+\definecolor [lightsalmon3] [h=cd8162]
+\definecolor [lightsalmon4] [h=8b5742]
+\definecolor [orange1] [h=ffa500]
+\definecolor [orange2] [h=ee9a00]
+\definecolor [orange3] [h=cd8500]
+\definecolor [orange4] [h=8b5a00]
+\definecolor [darkorange1] [h=ff7f00]
+\definecolor [darkorange2] [h=ee7600]
+\definecolor [darkorange3] [h=cd6600]
+\definecolor [darkorange4] [h=8b4500]
+\definecolor [coral1] [h=ff7256]
+\definecolor [coral2] [h=ee6a50]
+\definecolor [coral3] [h=cd5b45]
+\definecolor [coral4] [h=8b3e2f]
+\definecolor [tomato1] [h=ff6347]
+\definecolor [tomato2] [h=ee5c42]
+\definecolor [tomato3] [h=cd4f39]
+\definecolor [tomato4] [h=8b3626]
+\definecolor [orangered1] [h=ff4500]
+\definecolor [orangered2] [h=ee4000]
+\definecolor [orangered3] [h=cd3700]
+\definecolor [orangered4] [h=8b2500]
+\definecolor [red1] [h=ff0000]
+\definecolor [red2] [h=ee0000]
+\definecolor [red3] [h=cd0000]
+\definecolor [red4] [h=8b0000]
+\definecolor [debianred] [h=d70751]
+\definecolor [deeppink1] [h=ff1493]
+\definecolor [deeppink2] [h=ee1289]
+\definecolor [deeppink3] [h=cd1076]
+\definecolor [deeppink4] [h=8b0a50]
+\definecolor [hotpink1] [h=ff6eb4]
+\definecolor [hotpink2] [h=ee6aa7]
+\definecolor [hotpink3] [h=cd6090]
+\definecolor [hotpink4] [h=8b3a62]
+\definecolor [pink1] [h=ffb5c5]
+\definecolor [pink2] [h=eea9b8]
+\definecolor [pink3] [h=cd919e]
+\definecolor [pink4] [h=8b636c]
+\definecolor [lightpink1] [h=ffaeb9]
+\definecolor [lightpink2] [h=eea2ad]
+\definecolor [lightpink3] [h=cd8c95]
+\definecolor [lightpink4] [h=8b5f65]
+\definecolor [palevioletred1] [h=ff82ab]
+\definecolor [palevioletred2] [h=ee799f]
+\definecolor [palevioletred3] [h=cd6889]
+\definecolor [palevioletred4] [h=8b475d]
+\definecolor [maroon1] [h=ff34b3]
+\definecolor [maroon2] [h=ee30a7]
+\definecolor [maroon3] [h=cd2990]
+\definecolor [maroon4] [h=8b1c62]
+\definecolor [violetred1] [h=ff3e96]
+\definecolor [violetred2] [h=ee3a8c]
+\definecolor [violetred3] [h=cd3278]
+\definecolor [violetred4] [h=8b2252]
+\definecolor [magenta1] [h=ff00ff]
+\definecolor [magenta2] [h=ee00ee]
+\definecolor [magenta3] [h=cd00cd]
+\definecolor [magenta4] [h=8b008b]
+\definecolor [orchid1] [h=ff83fa]
+\definecolor [orchid2] [h=ee7ae9]
+\definecolor [orchid3] [h=cd69c9]
+\definecolor [orchid4] [h=8b4789]
+\definecolor [plum1] [h=ffbbff]
+\definecolor [plum2] [h=eeaeee]
+\definecolor [plum3] [h=cd96cd]
+\definecolor [plum4] [h=8b668b]
+\definecolor [mediumorchid1] [h=e066ff]
+\definecolor [mediumorchid2] [h=d15fee]
+\definecolor [mediumorchid3] [h=b452cd]
+\definecolor [mediumorchid4] [h=7a378b]
+\definecolor [darkorchid1] [h=bf3eff]
+\definecolor [darkorchid2] [h=b23aee]
+\definecolor [darkorchid3] [h=9a32cd]
+\definecolor [darkorchid4] [h=68228b]
+\definecolor [purple1] [h=9b30ff]
+\definecolor [purple2] [h=912cee]
+\definecolor [purple3] [h=7d26cd]
+\definecolor [purple4] [h=551a8b]
+\definecolor [mediumpurple1] [h=ab82ff]
+\definecolor [mediumpurple2] [h=9f79ee]
+\definecolor [mediumpurple3] [h=8968cd]
+\definecolor [mediumpurple4] [h=5d478b]
+\definecolor [thistle1] [h=ffe1ff]
+\definecolor [thistle2] [h=eed2ee]
+\definecolor [thistle3] [h=cdb5cd]
+\definecolor [thistle4] [h=8b7b8b]
+\definecolor [gray0] [s=0.00]
+\definecolor [grey0] [gray0]
+\definecolor [gray1] [s=0.01]
+\definecolor [grey1] [gray1]
+\definecolor [gray2] [s=0.02]
+\definecolor [grey2] [gray2]
+\definecolor [gray3] [s=0.03]
+\definecolor [grey3] [gray3]
+\definecolor [gray4] [s=0.04]
+\definecolor [grey4] [gray4]
+\definecolor [gray5] [s=0.05]
+\definecolor [grey5] [gray5]
+\definecolor [gray6] [s=0.06]
+\definecolor [grey6] [gray6]
+\definecolor [gray7] [s=0.07]
+\definecolor [grey7] [gray7]
+\definecolor [gray8] [s=0.08]
+\definecolor [grey8] [gray8]
+\definecolor [gray9] [s=0.09]
+\definecolor [grey9] [gray9]
+\definecolor [gray10] [s=0.10]
+\definecolor [grey10] [gray10]
+\definecolor [gray11] [s=0.11]
+\definecolor [grey11] [gray11]
+\definecolor [gray12] [s=0.12]
+\definecolor [grey12] [gray12]
+\definecolor [gray13] [s=0.13]
+\definecolor [grey13] [gray13]
+\definecolor [gray14] [s=0.14]
+\definecolor [grey14] [gray14]
+\definecolor [gray15] [s=0.15]
+\definecolor [grey15] [gray15]
+\definecolor [gray16] [s=0.16]
+\definecolor [grey16] [gray16]
+\definecolor [gray17] [s=0.17]
+\definecolor [grey17] [gray17]
+\definecolor [gray18] [s=0.18]
+\definecolor [grey18] [gray18]
+\definecolor [gray19] [s=0.19]
+\definecolor [grey19] [gray19]
+\definecolor [gray20] [s=0.20]
+\definecolor [grey20] [gray20]
+\definecolor [gray21] [s=0.21]
+\definecolor [grey21] [gray21]
+\definecolor [gray22] [s=0.22]
+\definecolor [grey22] [gray22]
+\definecolor [gray23] [s=0.23]
+\definecolor [grey23] [gray23]
+\definecolor [gray24] [s=0.24]
+\definecolor [grey24] [gray24]
+\definecolor [gray25] [s=0.25]
+\definecolor [grey25] [gray25]
+\definecolor [gray26] [s=0.26]
+\definecolor [grey26] [gray26]
+\definecolor [gray27] [s=0.27]
+\definecolor [grey27] [gray27]
+\definecolor [gray28] [s=0.28]
+\definecolor [grey28] [gray28]
+\definecolor [gray29] [s=0.29]
+\definecolor [grey29] [gray29]
+\definecolor [gray30] [s=0.30]
+\definecolor [grey30] [gray30]
+\definecolor [gray31] [s=0.31]
+\definecolor [grey31] [gray31]
+\definecolor [gray32] [s=0.32]
+\definecolor [grey32] [gray32]
+\definecolor [gray33] [s=0.33]
+\definecolor [grey33] [gray33]
+\definecolor [gray34] [s=0.34]
+\definecolor [grey34] [gray34]
+\definecolor [gray35] [s=0.35]
+\definecolor [grey35] [gray35]
+\definecolor [gray36] [s=0.36]
+\definecolor [grey36] [gray36]
+\definecolor [gray37] [s=0.37]
+\definecolor [grey37] [gray37]
+\definecolor [gray38] [s=0.38]
+\definecolor [grey38] [gray38]
+\definecolor [gray39] [s=0.39]
+\definecolor [grey39] [gray39]
+\definecolor [gray40] [s=0.40]
+\definecolor [grey40] [gray40]
+\definecolor [gray41] [s=0.41]
+\definecolor [grey41] [gray41]
+\definecolor [gray42] [s=0.42]
+\definecolor [grey42] [gray42]
+\definecolor [gray43] [s=0.43]
+\definecolor [grey43] [gray43]
+\definecolor [gray44] [s=0.44]
+\definecolor [grey44] [gray44]
+\definecolor [gray45] [s=0.45]
+\definecolor [grey45] [gray45]
+\definecolor [gray46] [s=0.46]
+\definecolor [grey46] [gray46]
+\definecolor [gray47] [s=0.47]
+\definecolor [grey47] [gray47]
+\definecolor [gray48] [s=0.48]
+\definecolor [grey48] [gray48]
+\definecolor [gray49] [s=0.49]
+\definecolor [grey49] [gray49]
+\definecolor [gray50] [s=0.50]
+\definecolor [grey50] [gray50]
+\definecolor [gray51] [s=0.51]
+\definecolor [grey51] [gray51]
+\definecolor [gray52] [s=0.52]
+\definecolor [grey52] [gray52]
+\definecolor [gray53] [s=0.53]
+\definecolor [grey53] [gray53]
+\definecolor [gray54] [s=0.54]
+\definecolor [grey54] [gray54]
+\definecolor [gray55] [s=0.55]
+\definecolor [grey55] [gray55]
+\definecolor [gray56] [s=0.56]
+\definecolor [grey56] [gray56]
+\definecolor [gray57] [s=0.57]
+\definecolor [grey57] [gray57]
+\definecolor [gray58] [s=0.58]
+\definecolor [grey58] [gray58]
+\definecolor [gray59] [s=0.59]
+\definecolor [grey59] [gray59]
+\definecolor [gray60] [s=0.60]
+\definecolor [grey60] [gray60]
+\definecolor [gray61] [s=0.61]
+\definecolor [grey61] [gray61]
+\definecolor [gray62] [s=0.62]
+\definecolor [grey62] [gray62]
+\definecolor [gray63] [s=0.63]
+\definecolor [grey63] [gray63]
+\definecolor [gray64] [s=0.64]
+\definecolor [grey64] [gray64]
+\definecolor [gray65] [s=0.65]
+\definecolor [grey65] [gray65]
+\definecolor [gray66] [s=0.66]
+\definecolor [grey66] [gray66]
+\definecolor [gray67] [s=0.67]
+\definecolor [grey67] [gray67]
+\definecolor [gray68] [s=0.68]
+\definecolor [grey68] [gray68]
+\definecolor [gray69] [s=0.69]
+\definecolor [grey69] [gray69]
+\definecolor [gray70] [s=0.70]
+\definecolor [grey70] [gray70]
+\definecolor [gray71] [s=0.71]
+\definecolor [grey71] [gray71]
+\definecolor [gray72] [s=0.72]
+\definecolor [grey72] [gray72]
+\definecolor [gray73] [s=0.73]
+\definecolor [grey73] [gray73]
+\definecolor [gray74] [s=0.74]
+\definecolor [grey74] [gray74]
+\definecolor [gray75] [s=0.75]
+\definecolor [grey75] [gray75]
+\definecolor [gray76] [s=0.76]
+\definecolor [grey76] [gray76]
+\definecolor [gray77] [s=0.77]
+\definecolor [grey77] [gray77]
+\definecolor [gray78] [s=0.78]
+\definecolor [grey78] [gray78]
+\definecolor [gray79] [s=0.79]
+\definecolor [grey79] [gray79]
+\definecolor [gray80] [s=0.80]
+\definecolor [grey80] [gray80]
+\definecolor [gray81] [s=0.81]
+\definecolor [grey81] [gray81]
+\definecolor [gray82] [s=0.82]
+\definecolor [grey82] [gray82]
+\definecolor [gray83] [s=0.83]
+\definecolor [grey83] [gray83]
+\definecolor [gray84] [s=0.84]
+\definecolor [grey84] [gray84]
+\definecolor [gray85] [s=0.85]
+\definecolor [grey85] [gray85]
+\definecolor [gray86] [s=0.86]
+\definecolor [grey86] [gray86]
+\definecolor [gray87] [s=0.87]
+\definecolor [grey87] [gray87]
+\definecolor [gray88] [s=0.88]
+\definecolor [grey88] [gray88]
+\definecolor [gray89] [s=0.89]
+\definecolor [grey89] [gray89]
+\definecolor [gray90] [s=0.90]
+\definecolor [grey90] [gray90]
+\definecolor [gray91] [s=0.91]
+\definecolor [grey91] [gray91]
+\definecolor [gray92] [s=0.92]
+\definecolor [grey92] [gray92]
+\definecolor [gray93] [s=0.93]
+\definecolor [grey93] [gray93]
+\definecolor [gray94] [s=0.94]
+\definecolor [grey94] [gray94]
+\definecolor [gray95] [s=0.95]
+\definecolor [grey95] [gray95]
+\definecolor [gray96] [s=0.96]
+\definecolor [grey96] [gray96]
+\definecolor [gray97] [s=0.97]
+\definecolor [grey97] [gray97]
+\definecolor [gray98] [s=0.98]
+\definecolor [grey98] [gray98]
+\definecolor [gray99] [s=0.99]
+\definecolor [grey99] [gray99]
+\definecolor [gray100] [s=1.00]
+\definecolor [grey100] [gray100]
+\definecolor [darkgrey] [s=0.66]
+\definecolor [darkgray] [darkgrey]
+\definecolor [darkblue] [h=00008b]
+\definecolor [darkcyan] [h=008b8b]
+\definecolor [darkmagenta] [h=8b008b]
+\definecolor [darkred] [h=8b0000]
+\definecolor [lightgreen] [h=90ee90]
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/colo-xwi.mkii b/Master/texmf-dist/tex/context/base/colo-xwi.mkii
new file mode 100644
index 00000000000..81e09d871bc
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/colo-xwi.mkii
@@ -0,0 +1,142 @@
+%D \module
+%D [ file=colo-xwi,
+%D version=1995.01.01,
+%D title=\CONTEXT\ Color Macros,
+%D subtitle=X Windows,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 I've forgotten where I got these definitions from, but maybe
+%D they can be of use.
+
+\definecolor [aliceblue] [r=0.94,g=0.97,b=1.00]
+\definecolor [antiquewhite] [r=0.98,g=0.92,b=0.84]
+\definecolor [aquamarine] [r=0.50,g=1.00,b=0.83]
+\definecolor [azure] [r=0.94,g=1.00,b=1.00]
+\definecolor [beige] [r=0.96,g=0.96,b=0.86]
+\definecolor [bisque] [r=1.00,g=0.89,b=0.77]
+\definecolor [black] [s=0] % [r=0.00,g=0.00,b=0.00]
+\definecolor [blanchedalmond] [r=1.00,g=0.92,b=0.80]
+\definecolor [blue] [r=0.00,g=0.00,b=1.00]
+\definecolor [blueviolet] [r=0.54,g=0.17,b=0.89]
+\definecolor [brown] [r=0.65,g=0.16,b=0.16]
+\definecolor [burlywood] [r=0.87,g=0.72,b=0.53]
+\definecolor [cadetblue] [r=0.37,g=0.62,b=0.63]
+\definecolor [chartreuse] [r=0.50,g=1.00,b=0.00]
+\definecolor [chocolate] [r=0.82,g=0.41,b=0.12]
+\definecolor [coral] [r=1.00,g=0.50,b=0.31]
+\definecolor [cornflowerblue] [r=0.39,g=0.58,b=0.93]
+\definecolor [cornsilk] [r=1.00,g=0.97,b=0.86]
+\definecolor [cyan] [r=0.00,g=1.00,b=1.00]
+\definecolor [darkgoldenrod] [r=0.72,g=0.53,b=0.04]
+\definecolor [darkgreen] [r=0.00,g=0.39,b=0.00]
+\definecolor [darkkhaki] [r=0.74,g=0.72,b=0.42]
+\definecolor [darkolivegreen] [r=0.33,g=0.42,b=0.18]
+\definecolor [darkorange] [r=1.00,g=0.55,b=0.00]
+\definecolor [darkorchid] [r=0.60,g=0.20,b=0.80]
+\definecolor [darksalmon] [r=0.91,g=0.59,b=0.48]
+\definecolor [darkseagreen] [r=0.56,g=0.74,b=0.56]
+\definecolor [darkslateblue] [r=0.28,g=0.24,b=0.55]
+\definecolor [darkturquoise] [r=0.00,g=0.81,b=0.82]
+\definecolor [darkviolet] [r=0.58,g=0.00,b=0.83]
+\definecolor [deeppink] [r=1.00,g=0.08,b=0.58]
+\definecolor [deepskyblue] [r=0.00,g=0.75,b=1.00]
+\definecolor [dodgerblue] [r=0.12,g=0.56,b=1.00]
+\definecolor [firebrick] [r=0.70,g=0.13,b=0.13]
+\definecolor [floralwhite] [r=1.00,g=0.98,b=0.94]
+\definecolor [forestgreen] [r=0.13,g=0.55,b=0.13]
+\definecolor [gainsboro] [r=0.86,g=0.86,b=0.86]
+\definecolor [ghostwhite] [r=0.97,g=0.97,b=1.00]
+\definecolor [gold] [r=1.00,g=0.84,b=0.00]
+\definecolor [goldenrod] [r=0.85,g=0.65,b=0.13]
+\definecolor [green] [r=0.00,g=1.00,b=0.00]
+\definecolor [greenyellow] [r=0.68,g=1.00,b=0.18]
+\definecolor [honeydew] [r=0.94,g=1.00,b=0.94]
+\definecolor [hotpink] [r=1.00,g=0.41,b=0.71]
+\definecolor [indianred] [r=0.80,g=0.36,b=0.36]
+\definecolor [ivory] [r=1.00,g=1.00,b=0.94]
+\definecolor [khaki] [r=0.94,g=0.90,b=0.55]
+\definecolor [lavender] [r=0.90,g=0.90,b=0.98]
+\definecolor [lavenderblush] [r=1.00,g=0.94,b=0.96]
+\definecolor [lawngreen] [r=0.49,g=0.99,b=0.00]
+\definecolor [lemonchiffon] [r=1.00,g=0.98,b=0.80]
+\definecolor [lightblue] [r=0.68,g=0.85,b=0.90]
+\definecolor [lightcoral] [r=0.94,g=0.50,b=0.50]
+\definecolor [lightcyan] [r=0.88,g=1.00,b=1.00]
+\definecolor [lightgoldenrod] [r=0.93,g=0.87,b=0.51]
+\definecolor [lightgoldenrodyellow] [r=0.98,g=0.98,b=0.82]
+\definecolor [lightpink] [r=1.00,g=0.71,b=0.76]
+\definecolor [lightsalmon] [r=1.00,g=0.63,b=0.48]
+\definecolor [lightseagreen] [r=0.13,g=0.70,b=0.67]
+\definecolor [lightskyblue] [r=0.53,g=0.81,b=0.98]
+\definecolor [lightslateblue] [r=0.52,g=0.44,b=1.00]
+\definecolor [lightsteelblue] [r=0.69,g=0.77,b=0.87]
+\definecolor [lightyellow] [r=1.00,g=1.00,b=0.88]
+\definecolor [limegreen] [r=0.20,g=0.80,b=0.20]
+\definecolor [linen] [r=0.98,g=0.94,b=0.90]
+\definecolor [magenta] [r=1.00,g=0.00,b=1.00]
+\definecolor [maroon] [r=0.69,g=0.19,b=0.38]
+\definecolor [mediumaquamarine] [r=0.40,g=0.80,b=0.67]
+\definecolor [mediumblue] [r=0.00,g=0.00,b=0.80]
+\definecolor [mediumorchid] [r=0.73,g=0.33,b=0.83]
+\definecolor [mediumpurple] [r=0.58,g=0.44,b=0.86]
+\definecolor [mediumseagreen] [r=0.24,g=0.70,b=0.44]
+\definecolor [mediumslateblue] [r=0.48,g=0.41,b=0.93]
+\definecolor [mediumspringgreen] [r=0.00,g=0.98,b=0.60]
+\definecolor [mediumturquoise] [r=0.28,g=0.82,b=0.80]
+\definecolor [mediumvioletred] [r=0.78,g=0.08,b=0.52]
+\definecolor [midnightblue] [r=0.10,g=0.10,b=0.44]
+\definecolor [mintcream] [r=0.96,g=1.00,b=0.98]
+\definecolor [mistyrose] [r=1.00,g=0.89,b=0.88]
+\definecolor [moccasin] [r=1.00,g=0.89,b=0.71]
+\definecolor [navajowhite] [r=1.00,g=0.87,b=0.68]
+\definecolor [navy] [r=0.00,g=0.00,b=0.50]
+\definecolor [navyblue] [r=0.00,g=0.00,b=0.50]
+\definecolor [oldlace] [r=0.99,g=0.96,b=0.90]
+\definecolor [olivedrab] [r=0.42,g=0.56,b=0.14]
+\definecolor [orange] [r=1.00,g=0.65,b=0.00]
+\definecolor [orangered] [r=1.00,g=0.27,b=0.00]
+\definecolor [orchid] [r=0.85,g=0.44,b=0.84]
+\definecolor [palegoldenrod] [r=0.93,g=0.91,b=0.67]
+\definecolor [palegreen] [r=0.60,g=0.98,b=0.60]
+\definecolor [paleturquoise] [r=0.69,g=0.93,b=0.93]
+\definecolor [palevioletred] [r=0.86,g=0.44,b=0.58]
+\definecolor [papayawhip] [r=1.00,g=0.94,b=0.84]
+\definecolor [peachpuff] [r=1.00,g=0.85,b=0.73]
+\definecolor [peru] [r=0.80,g=0.52,b=0.25]
+\definecolor [pink] [r=1.00,g=0.75,b=0.80]
+\definecolor [plum] [r=0.87,g=0.63,b=0.87]
+\definecolor [powderblue] [r=0.69,g=0.88,b=0.90]
+\definecolor [purple] [r=0.63,g=0.13,b=0.94]
+\definecolor [red ] [r=1.00,g=0.00,b=0.00]
+\definecolor [rosybrown] [r=0.74,g=0.56,b=0.56]
+\definecolor [royalblue] [r=0.25,g=0.41,b=0.88]
+\definecolor [saddlebrown] [r=0.55,g=0.27,b=0.07]
+\definecolor [salmon] [r=0.98,g=0.50,b=0.45]
+\definecolor [sandybrown] [r=0.96,g=0.64,b=0.38]
+\definecolor [seagreen] [r=0.18,g=0.55,b=0.34]
+\definecolor [seashell] [r=1.00,g=0.96,b=0.93]
+\definecolor [sienna] [r=0.63,g=0.32,b=0.18]
+\definecolor [skyblue] [r=0.53,g=0.81,b=0.92]
+\definecolor [slateblue] [r=0.42,g=0.35,b=0.80]
+\definecolor [snow] [r=1.00,g=0.98,b=0.98]
+\definecolor [springgreen] [r=0.00,g=1.00,b=0.50]
+\definecolor [steelblue] [r=0.27,g=0.51,b=0.71]
+\definecolor [tan ] [r=0.82,g=0.71,b=0.55]
+\definecolor [thistle] [r=0.85,g=0.75,b=0.85]
+\definecolor [tomato] [r=1.00,g=0.39,b=0.28]
+\definecolor [turquoise] [r=0.25,g=0.88,b=0.82]
+\definecolor [violet] [r=0.93,g=0.51,b=0.93]
+\definecolor [violetred] [r=0.82,g=0.13,b=0.56]
+\definecolor [wheat] [r=0.96,g=0.87,b=0.70]
+\definecolor [white] [r=1.00,g=1.00,b=1.00]
+\definecolor [whitesmoke] [s=0.96] % [r=0.96,g=0.96,b=0.96]
+\definecolor [yellow] [r=1.00,g=1.00,b=0.00]
+\definecolor [yellowgreen] [r=0.60,g=0.80,b=0.20]
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-cs.mkii b/Master/texmf-dist/tex/context/base/cont-cs.mkii
new file mode 100644
index 00000000000..714bf956869
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-cs.mkii
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-cs,
+%D version=1998.12.02,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Czech Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {czech}
+\def\defaultlanguagetag{cs}
+
+\input context.mkii
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-cs.mkiv b/Master/texmf-dist/tex/context/base/cont-cs.mkiv
new file mode 100644
index 00000000000..e1805b1c9ee
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-cs.mkiv
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-cs,
+%D version=1998.12.02,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Czech Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {czech}
+\def\defaultlanguagetag{cs}
+
+\input context.mkiv
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-cs.tex b/Master/texmf-dist/tex/context/base/cont-cs.tex
deleted file mode 100644
index f878920aac8..00000000000
--- a/Master/texmf-dist/tex/context/base/cont-cs.tex
+++ /dev/null
@@ -1,39 +0,0 @@
-%D \module
-%D [ file=cont-cs,
-%D version=1998.12.02,
-%D title=\CONTEXT,
-%D subtitle=\CONTEXT\ Czech Format Generation,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\catcode`\{=1 \catcode`\}=2 \def\defaultinterface{czech}
-
-\input context.tex
-
-\unprotect
-
-\setupcurrentlanguage[\s!cs]
-
-\loaduserspecifications
-
-\installlanguage [\s!en] [\c!state=\v!start]
-\installlanguage [\s!de] [\c!state=\v!start]
-\installlanguage [\s!sk] [\c!state=\v!start]
-\installlanguage [\s!cs] [\c!state=\v!start]
-
-\ifnum\texengine=\luatexengine
- % will be runtime option: typeface
- \appendtoks
- \usetypescript[modern]
- \setuptypeface[modern]
- \to \everyjob
-\else
- \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
-\fi
-
-\protect \errorstopmode \dump \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-de.mkii b/Master/texmf-dist/tex/context/base/cont-de.mkii
new file mode 100644
index 00000000000..a110f67d2a4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-de.mkii
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-de,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ German Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {german}
+\def\defaultlanguagetag{de}
+
+\input context.mkii
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-de.mkiv b/Master/texmf-dist/tex/context/base/cont-de.mkiv
new file mode 100644
index 00000000000..1f41797816c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-de.mkiv
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-de,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ German Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {german}
+\def\defaultlanguagetag{de}
+
+\input context.mkiv
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-de.tex b/Master/texmf-dist/tex/context/base/cont-de.tex
deleted file mode 100644
index 460ca7eca1a..00000000000
--- a/Master/texmf-dist/tex/context/base/cont-de.tex
+++ /dev/null
@@ -1,44 +0,0 @@
-%D \module
-%D [ file=cont-de,
-%D version=1997.08.19,
-%D title=\CONTEXT,
-%D subtitle=\CONTEXT\ German Format Generation,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\catcode`\{=1 \catcode`\}=2 \def\defaultinterface{german}
-
-\input context.tex
-
-\unprotect
-
-\setupcurrentlanguage[\s!de]
-
-\loaduserspecifications
-
-\installlanguage [\s!us] [\c!state=\v!start]
-\installlanguage [\s!gb] [\c!state=\v!start]
-\installlanguage [\s!de] [\c!state=\v!start]
-\installlanguage [\s!fr] [\c!state=\v!start]
-\installlanguage [\s!es] [\c!state=\v!start]
-\installlanguage [\s!nl] [\c!state=\v!start]
-\installlanguage [\s!it] [\c!state=\v!start]
-
-\installlanguage [deo] [\c!state=\v!start]
-
-\ifnum\texengine=\luatexengine
- % will be runtime option: typeface
- \appendtoks
- \usetypescript[modern]
- \setuptypeface[modern]
- \to \everyjob
-\else
- \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
-\fi
-
-\protect \errorstopmode \dump \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-en.mkii b/Master/texmf-dist/tex/context/base/cont-en.mkii
new file mode 100644
index 00000000000..c3d510f981a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-en.mkii
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-en,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ English Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {english}
+\def\defaultlanguagetag{en}
+
+\input context.mkii
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-en.mkiv b/Master/texmf-dist/tex/context/base/cont-en.mkiv
new file mode 100644
index 00000000000..1bf182cd8d4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-en.mkiv
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-en,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ English Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {english}
+\def\defaultlanguagetag{en}
+
+\input context.mkiv
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-en.tex b/Master/texmf-dist/tex/context/base/cont-en.tex
deleted file mode 100644
index e2b09ecbe54..00000000000
--- a/Master/texmf-dist/tex/context/base/cont-en.tex
+++ /dev/null
@@ -1,46 +0,0 @@
-%D \module
-%D [ file=cont-en,
-%D version=1997.08.19,
-%D title=\CONTEXT,
-%D subtitle=\CONTEXT\ English Format Generation,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\catcode`\{=1 \catcode`\}=2 \def\defaultinterface{english}
-
-\input context.tex
-
-\unprotect
-
-\setupcurrentlanguage[\s!en]
-
-\loaduserspecifications
-
-% Do we need more defaults? or maybe all languages?
-
-\installlanguage [\s!us] [\c!state=\v!start]
-\installlanguage [\s!gb] [\c!state=\v!start]
-\installlanguage [\s!de] [\c!state=\v!start]
-\installlanguage [\s!fr] [\c!state=\v!start]
-\installlanguage [\s!es] [\c!state=\v!start]
-\installlanguage [\s!pt] [\c!state=\v!start]
-\installlanguage [\s!it] [\c!state=\v!start]
-\installlanguage [\s!nl] [\c!state=\v!start]
-\installlanguage [\s!cs] [\c!state=\v!start]
-\installlanguage [\s!sk] [\c!state=\v!start]
-\installlanguage [\s!pl] [\c!state=\v!start]
-
-\ifnum\texengine=\luatexengine
-% \prependtoks
-% \the \everysetupdocument
-% \to \everyjob
-\else
- \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
-\fi
-
-\protect \errorstopmode \dump \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-err.tex b/Master/texmf-dist/tex/context/base/cont-err.mkii
index f01ce87aadb..f01ce87aadb 100644
--- a/Master/texmf-dist/tex/context/base/cont-err.tex
+++ b/Master/texmf-dist/tex/context/base/cont-err.mkii
diff --git a/Master/texmf-dist/tex/context/base/cont-fil.tex b/Master/texmf-dist/tex/context/base/cont-fil.mkii
index b295872ca0c..b295872ca0c 100644
--- a/Master/texmf-dist/tex/context/base/cont-fil.tex
+++ b/Master/texmf-dist/tex/context/base/cont-fil.mkii
diff --git a/Master/texmf-dist/tex/context/base/cont-fil.mkiv b/Master/texmf-dist/tex/context/base/cont-fil.mkiv
new file mode 100644
index 00000000000..2468f299861
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-fil.mkiv
@@ -0,0 +1,96 @@
+%D \module
+%D [ file=cont-fil,
+%D version=1997.11.15,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=File Synonyms,
+%D author=J. Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 File Synonyms}
+
+\definefilesynonym [chemics] [chemic]
+
+\definefilesynonym [unit] [units]
+
+\definefilesynonym [pstric] [pstricks]
+\definefilesynonym [pstrick] [pstricks]
+
+\definefilesynonym [finance] [financ]
+
+\definefilesynonym [dir-make] [dir-01]
+\definefilesynonym [dir-identify] [dir-05]
+
+\definefilesynonym [int-load] [set-11]
+\definefilesynonym [int-make] [set-12]
+
+ \definefilesynonym [fig-base] [fig-00]
+ \definefilesynonym [fig-make] [fig-01]
+ \definefilesynonym [fig-fake] [fig-02]
+ \definefilesynonym [fig-missing] [fig-06]
+
+\definefilesynonym [exi-interface] [exi-21]
+
+ \definefilesynonym [res-make] [res-01]
+ \definefilesynonym [res-base] [res-04]
+ \definefilesynonym [res-crop] [res-07]
+ \definefilesynonym [res-trace] [res-08]
+ \definefilesynonym [res-log] [res-09]
+ \definefilesynonym [res-identify] [res-12]
+
+\definefilesynonym [med-show] [res-50]
+
+\definefilesynonym [pre-general] [pre-00]
+
+\definefilesynonym [pre-original] [pre-01]
+\definefilesynonym [pre-green] [pre-02]
+\definefilesynonym [pre-funny] [pre-03]
+\definefilesynonym [pre-colorful] [pre-04]
+\definefilesynonym [pre-fuzzy] [pre-05]
+\definefilesynonym [pre-polish] [pre-06]
+\definefilesynonym [pre-spider] [pre-07]
+\definefilesynonym [pre-wonder] [pre-08]
+\definefilesynonym [pre-windows] [pre-09]
+\definefilesynonym [pre-grow] [pre-10]
+\definefilesynonym [pre-stack] [pre-11]
+\definefilesynonym [pre-arrows] [pre-12]
+\definefilesynonym [pre-writing] [pre-13]
+\definefilesynonym [pre-split] [pre-14]
+\definefilesynonym [pre-balls] [pre-15]
+\definefilesynonym [pre-knot] [pre-16]
+\definefilesynonym [pre-weird] [pre-17]
+\definefilesynonym [pre-shade] [pre-18]
+\definefilesynonym [pre-organic] [pre-19]
+\definefilesynonym [pre-speckle] [pre-20]
+\definefilesynonym [pre-zoom] [pre-21]
+\definefilesynonym [pre-cycle] [pre-22]
+\definefilesynonym [pre-super] [pre-23]
+
+%definefilesynonym [pre-more] [pre-24]
+%definefilesynonym [pre-more] [pre-25]
+\definefilesynonym [pre-more] [pre-26]
+%definefilesynonym [pre-more] [pre-27]
+%definefilesynonym [pre-more] [pre-28]
+%definefilesynonym [pre-more] [pre-29]
+%definefilesynonym [pre-more] [pre-30]
+
+\definefilesynonym [pre-stepwise] [pre-60]
+\definefilesynonym [pre-stepper] [pre-61]
+
+\definefilesynonym [pre-punk] [pre-70]
+\definefilesynonym [pre-random] [pre-71]
+
+\definefilesynonym [abr-pseudocaps] [abr-01]
+\definefilesynonym [abr-smallcaps] [abr-02]
+
+\definefilesynonym [pracjourn] [ptj-01]
+\definefilesynonym [maps] [map-10]
+
+\definefilesynonym [mml] [mathml]
+\definefilesynonym [cml] [chemml]
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-fr.mkii b/Master/texmf-dist/tex/context/base/cont-fr.mkii
new file mode 100644
index 00000000000..6f1e806ad0e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-fr.mkii
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-de,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ French Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {french}
+\def\defaultlanguagetag{fr}
+
+\input context.mkii
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-fr.mkiv b/Master/texmf-dist/tex/context/base/cont-fr.mkiv
new file mode 100644
index 00000000000..5b0946625e8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-fr.mkiv
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-de,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ French Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {french}
+\def\defaultlanguagetag{fr}
+
+\input context.mkiv
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-fr.tex b/Master/texmf-dist/tex/context/base/cont-fr.tex
deleted file mode 100644
index d812b28f9b0..00000000000
--- a/Master/texmf-dist/tex/context/base/cont-fr.tex
+++ /dev/null
@@ -1,42 +0,0 @@
-%D \module
-%D [ file=cont-de,
-%D version=1997.08.19,
-%D title=\CONTEXT,
-%D subtitle=\CONTEXT\ French Format Generation,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\catcode`\{=1 \catcode`\}=2 \def\defaultinterface{french}
-
-\input context.tex
-
-\unprotect
-
-\setupcurrentlanguage[\s!fr]
-
-\loaduserspecifications
-
-\installlanguage [\s!us] [\c!state=\v!start]
-\installlanguage [\s!gb] [\c!state=\v!start]
-\installlanguage [\s!de] [\c!state=\v!start]
-\installlanguage [\s!fr] [\c!state=\v!start]
-\installlanguage [\s!es] [\c!state=\v!start]
-\installlanguage [\s!nl] [\c!state=\v!start]
-\installlanguage [\s!it] [\c!state=\v!start]
-
-\ifnum\texengine=\luatexengine
- % will be runtime option: typeface
- \appendtoks
- \usetypescript[modern]
- \setuptypeface[modern]
- \to \everyjob
-\else
- \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
-\fi
-
-\protect \errorstopmode \dump \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-gb.mkii b/Master/texmf-dist/tex/context/base/cont-gb.mkii
new file mode 100644
index 00000000000..35b7c85a4e5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-gb.mkii
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-uk,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ English Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {english}
+\def\defaultlanguagetag{gb}
+
+\input context.mkii
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-gb.mkiv b/Master/texmf-dist/tex/context/base/cont-gb.mkiv
new file mode 100644
index 00000000000..3a4ed609bac
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-gb.mkiv
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-uk,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ English Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {english}
+\def\defaultlanguagetag{gb}
+
+\input context.mkiv
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-gb.tex b/Master/texmf-dist/tex/context/base/cont-gb.tex
deleted file mode 100644
index 99d2974257e..00000000000
--- a/Master/texmf-dist/tex/context/base/cont-gb.tex
+++ /dev/null
@@ -1,42 +0,0 @@
-%D \module
-%D [ file=cont-uk,
-%D version=1997.08.19,
-%D title=\CONTEXT,
-%D subtitle=\CONTEXT\ English Format Generation,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\catcode`\{=1 \catcode`\}=2 \def\defaultinterface{english}
-
-\input context.tex
-
-\unprotect
-
-\setupcurrentlanguage[\s!gb]
-
-\loaduserspecifications
-
-\installlanguage [\s!us] [\c!state=\v!start]
-\installlanguage [\s!gb] [\c!state=\v!start]
-\installlanguage [\s!de] [\c!state=\v!start]
-\installlanguage [\s!fr] [\c!state=\v!start]
-\installlanguage [\s!es] [\c!state=\v!start]
-\installlanguage [\s!nl] [\c!state=\v!start]
-\installlanguage [\s!it] [\c!state=\v!start]
-
-\ifnum\texengine=\luatexengine
- % will be runtime option: typeface
- \appendtoks
- \usetypescript[modern]
- \setuptypeface[modern]
- \to \everyjob
-\else
- \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
-\fi
-
-\protect \errorstopmode \dump \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-it.mkii b/Master/texmf-dist/tex/context/base/cont-it.mkii
new file mode 100644
index 00000000000..c594a0659cc
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-it.mkii
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-it,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Italian Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {italian}
+\def\defaultlanguagetag{it}
+
+\input context.mkii
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-it.mkiv b/Master/texmf-dist/tex/context/base/cont-it.mkiv
new file mode 100644
index 00000000000..af7a1149e6f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-it.mkiv
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-it,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Italian Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {italian}
+\def\defaultlanguagetag{it}
+
+\input context.mkiv
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-it.tex b/Master/texmf-dist/tex/context/base/cont-it.tex
deleted file mode 100644
index 2141e3bc91b..00000000000
--- a/Master/texmf-dist/tex/context/base/cont-it.tex
+++ /dev/null
@@ -1,41 +0,0 @@
-%D \module
-%D [ file=cont-it,
-%D version=1997.08.19,
-%D title=\CONTEXT,
-%D subtitle=\CONTEXT\ Italian Format Generation,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\catcode`\{=1 \catcode`\}=2 \def\defaultinterface{italian}
-
-\input context.tex
-
-\unprotect
-
-\setupcurrentlanguage[\s!it]
-
-\loaduserspecifications
-
-\installlanguage [\s!us] [\c!state=\v!start]
-\installlanguage [\s!gb] [\c!state=\v!start]
-\installlanguage [\s!de] [\c!state=\v!start]
-\installlanguage [\s!fr] [\c!state=\v!start]
-\installlanguage [\s!es] [\c!state=\v!start]
-\installlanguage [\s!it] [\c!state=\v!start]
-
-\ifnum\texengine=\luatexengine
- % will be runtime option: typeface
- \appendtoks
- \usetypescript[modern]
- \setuptypeface[modern]
- \to \everyjob
-\else
- \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
-\fi
-
-\protect \errorstopmode \dump \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-log.tex b/Master/texmf-dist/tex/context/base/cont-log.mkii
index 9bfec299992..c89a2dd8f57 100644
--- a/Master/texmf-dist/tex/context/base/cont-log.tex
+++ b/Master/texmf-dist/tex/context/base/cont-log.mkii
@@ -17,28 +17,11 @@
%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 Watch the \type{cmr} detection hack.
-\unprotect
-
-\defconvertedargument\someCMRfont{cmr} % hm, we now have lm
-
-% \def\doifCMRfontelse#1#2%
-% {\doifinstringelse{\someCMRfont}{\fontname\font}
-% {\def\next{#1}}
-% {\def\next{#2}}%
-% \next}
+%D The Computer Modern detection hack is gone as we now have Latin
+%D Modern which has more kerning pairs.
-\def\doifCMRfontelse
- {\doifinstringelse\someCMRfont{\fontname\font}}
-
-\unexpanded\def\CMRkern
- {\doifCMRfontelse\kern{\scratchdimen=}}
-
-% \def\TeX
-% {T%
-% \kern-.1667em\lower.5ex\hbox{E}%
-% \kern-.125emX}
+\unprotect
\def\Mkern#1%
{{\setbox\scratchbox\hbox{M}\kern#1\wd\scratchbox}}
@@ -48,24 +31,9 @@
\Mkern{-.1667}\lower.5ex\hbox{E}%
\Mkern{-.125}X}
-\unexpanded\def\ConTeXt
- {C%
- \CMRkern-.0333emo%
- \CMRkern-.0333emn%
-% \CMRkern-.1667em\TeX%
- \CMRkern-.0667em\TeX%
- \CMRkern-.0333emt}
-
-\unexpanded\def\PPCHTeX
- {ppch\TeX}
-
-\unexpanded\def\PRAGMA
- {Pragma ADE}
-
-%\def\LaTeX
-% {L%
-% \kern-.30em\raise.3ex\hbox{\txx A}%
-% \kern-.18em\TeX}
+\unexpanded\def\ConTeXt{Con\TeX t}
+\unexpanded\def\PPCHTeX{ppch\TeX}
+\unexpanded\def\PRAGMA {Pragma ADE}
\unexpanded\def\LaTeX % requested by erik frambach
{{\setbox\scratchbox\hbox{L}%
@@ -193,7 +161,7 @@
%D CONTEXT, PPCHTEX,
%D AMSTEX, LATEX, LAMSTEX}
%D
-%D We define the funny written ones as well as th eless
+%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 uppercase.)
@@ -216,13 +184,6 @@
%D \PiCTeX, \TaBlE, \ConTeXt, \PPCHTeX, \AmSTeX, \LaTeX,
%D \LamSTeX.
-% \def\TEXEDIT {\TeX edit}
-% \def\TEXFORM {\TeX form}
-% \def\TEXADRES {\TeX adres}
-% \def\TEXSPELL {\TeX spell}
-% \def\TEXUTIL {\TeX util}
-% \def\TEXEXEC {\TeX exec}
-
%D Some placeholders:
\unexpanded\def\eTeX {\mathematics{\varepsilon}-\TeX}
@@ -232,21 +193,6 @@
\unexpanded\def\metaTeX{meta\TeX}
\unexpanded\def\XeTeX {X\lower.5ex\hbox{\kern-.15em\mirror{E}}\kern-.1667em\TeX}
-% Better, since lm has a mirrored E (don't ask me why)
-
-% \unexpanded\def\XeTeX
-% {X\lower.5ex
-% \hbox
-% {\kern-.15em
-% \ifx\XeTeXcharglyph\undefined
-% \mirror{E}%
-% \else\ifcase\XeTeXcharglyph"018E\relax
-% \mirror{E}%
-% \else
-% \char"018E%
-% \fi}%
-% \kern-.1667em \TeX}
-
% Adapted from a patch by Mojca:
\def\@XeTeX@
@@ -294,7 +240,7 @@
\let\LuaTeX \luaTeX
\let\XETEX \XeTeX
-\unexpanded\def\MkApproved
+\unexpanded\def\MkApproved % joke, not used so it might move
{\dontleavehmode\rotate
[\c!rotation={\ifnum\texengine=\luatexengine\ctxlua{tex.write(45-45*\the\luatexversion/100)}\else0\fi},
\c!align=\v!middle,
@@ -308,7 +254,6 @@
\c!rulethickness=2pt]
{Mk\ifnum\texengine=\luatexengine IV\else II\fi\\approved}}
-
% \unexpanded\def\luaTeX
% {\dontleavehmode\begingroup
% Lua%
diff --git a/Master/texmf-dist/tex/context/base/cont-log.mkiv b/Master/texmf-dist/tex/context/base/cont-log.mkiv
new file mode 100644
index 00000000000..171949ba011
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-log.mkiv
@@ -0,0 +1,253 @@
+%D \module
+%D [ file=cont-log,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Miscellaneous Macros,
+%D subtitle=\TEX\ Logos,
+%D author=J. Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 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.
+
+\unprotect
+
+\def\Mkern#1%
+ {{\setbox\scratchbox\hbox{M}\kern#1\wd\scratchbox}}
+
+\unexpanded\def\TeX
+ {T%
+ \Mkern{-.1667}\lower.5ex\hbox{E}%
+ \Mkern{-.125}X}
+
+\unexpanded\def\ConTeXt{Con\TeX t}
+\unexpanded\def\PPCHTeX{ppch\TeX}
+\unexpanded\def\PRAGMA {Pragma ADE}
+
+\unexpanded\def\LaTeX % requested by erik frambach
+ {{\setbox\scratchbox\hbox{L}%
+ \scratchdimen\ht\scratchbox
+ \setbox\scratchbox\hbox{\txx A}%
+ L\kern-.55\wd\scratchbox
+ \raise\scratchdimen\hbox{\lower\ht\scratchbox\copy\scratchbox}%
+ \kern-.2\wd\scratchbox\TeX}}
+
+\unexpanded\def\TaBlE
+ {T%
+ \kern-.27em\lower.5ex\hbox{A}%
+ \kern-.18emB%
+ \kern-.1em\lower.5ex\hbox{L}%
+ \kern-.075emE}
+
+\unexpanded\def\PiCTeX
+ {P%
+ \kern-.12em\lower.5ex\hbox{I}%
+ \kern-.075em C%
+ \kern-.11em\TeX}
+
+\def\AMSswitch#1%
+ {$\cal\ifdim\bodyfontsize>1.1em\scriptstyle\fi#1$}
+
+\unexpanded\def\AmSTeX
+ {\AMSswitch A%
+ \kern-.1667em\lower.5ex\hbox{\AMSswitch M}%
+ \kern-.125em\AMSswitch S%
+ -\TeX}
+
+\unexpanded\def\LamSTeX
+ {L%
+ \kern-.4em\raise.3ex\hbox{\AMSswitch A}%
+ \kern-.25em\lower.4ex\hbox{\AMSswitch M}%
+ \kern-.1em{\AMSswitch S}%
+ -\TeX}
+
+\unexpanded\def\AmSLaTeX
+ {\AMSswitch A%
+ \kern-.1667em\lower.5ex\hbox{\AMSswitch M}%
+ \kern-.125em\AMSswitch S%
+ -\LaTeX}
+
+%D Alternative \CONTEXT\ logo, first Idris S.~Hamid's version:
+%D
+%D \def\Context
+%D {{\sc C\kern -.0667emo\kern -.0667emn\kern -.0549emt\kern
+%D -.1667em\lower.5ex\hbox {e}\kern -.125emx\kern -.0549emt}}
+%D
+%D I changed this into one that adapts itself:
+
+\unexpanded\def\Context
+ {{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}}}
+
+%D The \METAFONT\ and \METAPOST\ logos adapt themselves to the
+%D current fontsize, an ugly but usefull hack.
+
+\let\logofont\nullfont
+
+\loadmapfile[original-base.map]
+
+\unexpanded\def\setMFPfont% more sensitive for low level changes
+ {\font\logofont=logo%
+ \ifx\fontalternative\c!bf\else
+ \ifx\fontalternative\c!it\else
+ \ifx\fontalternative\c!sl\else
+ \ifx\fontalternative\c!bi\else
+ \ifx\fontalternative\c!bs\else
+ \fi\fi\fi\fi\fi
+ 10 at \currentfontscale\bodyfontsize
+ \logofont}
+
+\def\MetaHyphen% there is no hyphenchar in this font
+ {\discretionary{\vrule\!!height.33em\!!depth-.27em\!!width.33em}{}{}}
+
+\unexpanded\def\MetaFont
+ {{\setMFPfont META\MetaHyphen FONT}}
+
+\unexpanded\def\MetaPost
+ {{\setMFPfont META\MetaHyphen POST}}
+
+\unexpanded\def\MetaFun
+ {MetaFun}
+
+%D \macros
+%D {TEX, METAFONT, METAPOST, METAFUN,
+%D PICTEX, TABLE,
+%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 uppercase.)
+
+\unexpanded\def\METAFONT {\MetaFont}
+\unexpanded\def\METAPOST {\MetaPost}
+\unexpanded\def\PPCHTEX {\PPCHTeX}
+\unexpanded\def\CONTEXT {\ConTeXt}
+\unexpanded\def\METAFUN {\MetaFun}
+
+\unexpanded\def\TEX {\TeX}
+\unexpanded\def\LATEX {\LaTeX}
+\unexpanded\def\PICTEX {\PiCTeX}
+\unexpanded\def\TABLE {\TaBlE}
+\unexpanded\def\AMSTEX {\AmSTeX}
+\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 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}
+
+% Adapted from a patch by Mojca:
+
+\def\@XeTeX@
+ {\setbox\scratchbox\hbox{E}%
+ \raise\dimexpr\ht\scratchbox+\dp\scratchbox\relax\hbox{\rotate[\c!rotation=180]{\box\scratchbox}}}
+
+\unexpanded\def\XeTeX
+ {X\lower.5ex
+ \hbox
+ {\kern-.15em
+ \iffontchar\font"018E\relax
+ \char"018E%
+ \else
+ \ifx\fontalternative\c!bf\mirror{E}\else
+ \ifx\fontalternative\c!it \@XeTeX@\else
+ \ifx\fontalternative\c!sl \@XeTeX@\else
+ \ifx\fontalternative\c!bi \@XeTeX@\else
+ \ifx\fontalternative\c!bs \@XeTeX@\else
+ \mirror{E}\fi\fi\fi\fi\fi
+ \fi}%
+ \kern-.1667em \TeX}
+
+\let\ETEX \eTeX
+\let\PDFTEX \pdfTeX
+\let\PDFETEX\pdfeTeX
+\let\LUATEX \luaTeX
+\let\LuaTeX \luaTeX
+\let\XETEX \XeTeX
+
+\unexpanded\def\MkApproved % joke, not used so it might move
+ {\dontleavehmode\rotate
+ [\c!rotation={\ifnum\texengine=\luatexengine\ctxlua{tex.write(45-45*\the\luatexversion/100)}\else0\fi},
+ \c!align=\v!middle,
+ \c!foregroundstyle=\v!type,
+ \c!foregroundcolor=darkred,
+ \c!frame=\v!on,
+ \c!offset=1ex,
+ \c!background=\v!color,
+ \c!backgroundcolor=lightgray,
+ \c!framecolor=darkred,
+ \c!rulethickness=2pt]
+ {Mk\ifnum\texengine=\luatexengine IV\else II\fi\\approved}}
+
+% \unexpanded\def\luaTeX
+% {\dontleavehmode\begingroup
+% Lua%
+% \setbox0\hbox{oT}%
+% \setbox2\hbox{o\kern0ptT}%
+% \ifdim\wd0=\wd2
+% \setbox0\hbox dir TRT{To}%
+% \setbox2\hbox{T\kern0pto}%
+% \hskip\dimexpr\wd0-\wd2\relax
+% \fi
+% \TeX
+% \endgroup}
+%
+% a further iteration from the list, patched again
+
+% \ifx\fontalternative\c!it -\else
+% \ifx\fontalternative\c!sl -\else
+% \ifx\fontalternative\c!bi -\else
+% \ifx\fontalternative\c!bs -\fi\fi\fi\fi
+
+\unexpanded\def\LuaTeX
+ {\dontleavehmode
+ \begingroup
+ Lua%
+ % hope for kerning, try aT
+ \setbox0\hbox{aT}%
+ \setbox2\hbox{a\kern\zeropoint T}%
+ \ifdim\wd0=\wd2 % kerns can go two ways
+ % no aT kerning, try oT as a is not symmetrical
+ \setbox0\hbox{oT}%
+ \setbox2\hbox{o\kern\zeropoint T}%
+ \ifdim\wd0=\wd2 % kerns can go two ways
+ % no aT and oT kerning, try To
+ \setbox0\hbox{To}%
+ \setbox2\hbox{T\kern\zeropoint o}%
+ % maybe we need to compensate for the angle (sl/it/bs/bi)
+ \fi
+ \ifdim\wd0=\wd2\else
+ \kern\dimexpr\wd0-\wd2\relax
+ \fi
+ \fi
+ \TeX
+ \endgroup}
+
+\let\luaTeX \LuaTeX
+\let\LUATEX \LuaTeX
+
+\unexpanded\def\MKII{MkII}
+\unexpanded\def\MKIV{MkIV}
+\unexpanded\def\MKVI{MkVI}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-mtx.tex b/Master/texmf-dist/tex/context/base/cont-mtx.tex
deleted file mode 100644
index 833785a7f2b..00000000000
--- a/Master/texmf-dist/tex/context/base/cont-mtx.tex
+++ /dev/null
@@ -1,25 +0,0 @@
-%D \module
-%D [ file=cont-mtx,
-%D version=2006.01.01, % no date -)
-%D title=\CONTEXT\ Miscellaneous Macros,
-%D subtitle=Experimental MetaTeX Macros,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% format generation : texexec --make --all --luatex
-%
-% pdftex compatible run : texexec --luatex filename
-% aleph compatible run : texexec --luatex --output=dvipdfmx filename
-%
-% or, at top of tex file : % engine=luatex
-
-% \loadcorefile{meta-xxx.tex}
-
-%D Here we load files that are not yet part of the core.
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-new.mkii b/Master/texmf-dist/tex/context/base/cont-new.mkii
index 2defba6d787..1a81454d6c9 100644
--- a/Master/texmf-dist/tex/context/base/cont-new.mkii
+++ b/Master/texmf-dist/tex/context/base/cont-new.mkii
@@ -11,7 +11,928 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\enablemode[mkii]
+\newcontextversion{2011.05.18 18:04}
+
+%D This file is loaded at runtime, thereby providing an
+%D excellent place for hacks, patches, extensions and new
+%D features.
+
+\unprotect
+
+% it's about time to clean up this file ...
+
+\writestatus\m!systems{beware: some patches loaded from cont-new.mkii}
+
+% \ifx\pdfmapfile \undefined \else \pdfmapfile{ } \fi
+
+% \font\f=dummyfont \rpcode\f0=500 \hbox{..}\char0
+% todo: mp-new
+% caption: grid=top|bottom in xml defs
+
+\def\fastscale#1%
+ {\begingroup
+ \ifnum#1=1000\relax
+ \setfalse\scaleboxdone
+ \else
+ \settrue\scaleboxdone
+ \edef\finalscaleboxxscale{\withoutpt\the\dimexpr#1pt/1000\relax}%
+ \let\finalscaleboxyscale\finalscaleboxxscale
+ \fi
+ \dowithnextbox{\doscaleboxindeed\flushnextbox\endgroup}\hbox}
+
+% \setupcaption [figure] [align=flushleft]
+% \setupcaption [figure-1] [align=flushleft,leftmargin=10mm]
+% \setupcaption [figure-2] [align=flushleft,leftmargin=10mm,rightmargin=-10mm,width=\textwidth]
+%
+% \startsetups somefigure
+% \ifdim\floatsetupwidth>\textwidth
+% \placesetupfloat[figure-2]
+% \else
+% \placesetupfloat[figure-1]
+% \fi
+% \stopsetups
+%
+% \placefloatwithsetups[somefigure]{}{\externalfigure[dummy][width=5cm,height=2cm]}
+
+\def\placefloatwithsetups
+ {\dotripleempty\doplacefloatwithsetups}
+
+\long\def\doplacefloatwithsetups[#1][#2][#3]#4%
+ {\def\floatsetupcaption {#4}%
+ \def\floatsetupcontent {\copy\nextbox}%
+ \def\floatsetupwidth {\wd\nextbox}%
+ \def\floatsetupheight {\ht\nextbox}%
+ \def\placesetupfloat[##1]{\placefloat[##1][#2][#3]{#4}{\floatsetupcontent}}% #4 and not \floatsetupcaption (unexpanded)
+ \dowithnextbox{\setups[#1]}\vbox}
+
+\def\dividedsize#1#2#3% size gap n
+ {\dimexpr
+ \ifnum\dimexpr#1\relax>\plusone
+ (\dimexpr#1\relax-\numexpr#3-1\relax\dimexpr#2\relax)/#3\else#1%
+ \fi
+ \relax}
+
+% \setuplabeltext[\s!itemcount1={{I(},{)}}]
+% \def\labeledcountervalue#1{\labeltexts{#1}{\countervalue{#1}}}
+
+\def\singlewidened #1{\hbox spread 1em{\hss#1\hss}}
+\def\complexwidened[#1]#2{\hbox spread #1{\hss#2\hss}}
+
+\definecomplexorsimple\widened
+
+% todo
+%
+% \def\definelocation{\dodoubleargument\dodefinelocation}
+% \def\dodefinelocation[#1][#2]{\setvalue{loc:#1}{#2}}
+%
+% \definelocation[lt] [\v!left\v!top]
+% \definelocation[tl] [\v!left\v!top]
+% \definelocation[\v!top\v!left][\v!left\v!top]
+%
+% \def\getlocation#1{\executeifdefined{loc:#1}{#1}}
+
+% just in case we load something from a file (pdfr-ec for instance)
+
+\prependtoks \restoreendofline \to \everybeforeshipout
+
+% \let\cs\getvalue % no, we want \cs to be czech
+
+% experimental so this may change
+
+\def\startdescriptions
+ {\dosingleempty\dostartdescriptions}
+
+\def\dostartdescriptions[#1]%
+ {\begingroup
+ \def\item{\getvalue{#1}}%
+ \let\dostoppairdescription \donothing
+ \let\@@description \dostartpairdescription
+ \let\@@startsomedescription\dostartsomedescription}
+
+\def\stopdescriptions
+ {\dostoppairdescription
+ \endgroup}
+
+\def\dostartpairdescription[#1][#2]%
+ {\dostoppairdescription
+ \def\dostoppairdescription{\@@stopdescription{#1}}%
+ \bgroup
+ \def\currentdescription{#1}%
+ \doifelse{\descriptionparameter{\s!do\c!state}}\v!start
+ {\@@makedescription{#1}[#2]{}}
+ {\@@makedescription{#1}[#2]}}
+
+\def\dostartsomedescription% #1[#2]#3%
+ {\bgroup
+ \@@makedescription} % {#1}[#2]{#3}}
+
+% \starttext
+%
+% \definedescription[test]
+%
+% \startdescriptions
+% \test{Foo} Bar bar bar
+% \test{Foo} Bar bar bar
+% \test{Foo} Bar bar bar
+% \stopdescriptions
+%
+% \startdescriptions[test]
+% \item{Foo} Bar bar bar
+% \item{Foo} Bar bar bar
+% \item{Foo} Bar bar bar
+% \stopdescriptions
+%
+% \startdescriptions
+% \starttest{Foo} Bar bar bar \stoptest
+% \starttest{Foo} Bar bar bar \stoptest
+% \starttest{Foo} Bar bar bar \stoptest
+% \stopdescriptions
+%
+% \startdescriptions[test]
+% \item{Foo} Bar bar bar
+% \item{Foo} Bar bar bar
+% \item{Foo} Bar bar bar
+% \stopdescriptions
+%
+% \stoptext
+
+% to do:
+%
+% \def\defineshapesynonym
+% {\dodoubleargument\dodefineshapesynonym}
+%
+% \def\dodefineshapesynonym[#1][#2]%
+% {\setvalue{shsy:#1}{#2}}
+%
+% \def\shapesynonym#1%
+% {\ifcsname shsy:#1\endcsname
+% \expandafter\shapesynonym\csname shsy:#1\endcsname\else#1%
+% \fi}
+%
+%\defineshapesynonym[eacute] [e]
+%\defineshapesynonym[egrave] [e]
+%\defineshapesynonym[eumlaut [e]
+%\defineshapesynonym[eogonek][e]
+%
+% more reduction
+%
+%\defineshapesynonym[e][o]
+%\defineshapesynonym[w][v]
+%\defineshapesynonym[m][n]
+%
+% \shapesynonym{eacute}
+
+% this will be activated when
+
+% \newinsert\thispageinsert % <- installinsertion
+
+% \def\flushatthispage
+% {\bgroup
+% \dowithnextbox{\insert\thispageinsert{\box\nextbox}\egroup}%
+% \hbox}
+
+% \appendtoks
+% \ifvoid\thispageinsert\else\hbox{\smashedbox\thispageinsert}\fi
+% \to \everyshipout
+
+% \definemarkedpage[nobackgrounds]
+% \markpage[nobackgrounds]
+% \doifmarkedpageelse{nobackgrounds}
+
+\newcounter\nofmarkedpages
+
+\def\definemarkedpage[#1]%
+ {\definetwopasslist{\v!page:#1}}
+
+\def\markpage[#1]% looks very much like domarginreference
+ {\iftrialtypesetting\else
+ \doglobal\increment\nofmarkedpages\relax
+ \lazysavetwopassdata{\v!page:#1}{\nofmarkedpages}{\noexpand\realfolio}%
+ \fi}
+
+\def\doifmarkedpageelse#1%
+ {\gettwopassdatalist{\v!page:#1}%
+ \expanded{\doifinsetelse{\realfolio}{\twopassdatalist}}}
+
+% Just a simple and fast hanger, for usage in macros.
+
+\def\setuphanging
+ {\dodoubleempty\getparameters[\??ha]}
+
+\setuphanging
+ [\c!distance=.5em]
+
+\def\starthanging
+ {\noindent\bgroup
+ \dowithnextbox
+ {\setbox\nextbox\hbox{\flushnextbox\hskip\@@hadistance}%
+ \hangindent\nextboxwd
+ \hangafter\plusone
+ \flushnextbox\ignorespaces}
+ \hbox}
+
+\def\stophanging
+ {\endgraf
+ \egroup}
+
+% experimental
+
+\def\stophangaround
+ {\endgraf
+ \egroup}
+
+\def\starthangaround
+ {\noindent\bgroup
+ \dowithnextbox
+ {\ifdim\nextboxht>\strutht\setbox\nextbox\tbox{\flushnextbox}\fi
+ \setbox\nextbox\hbox{\flushnextbox\hskip\@@hadistance}%
+ \getboxheight\scratchdimen\of\box\nextbox
+ \getnoflines\scratchdimen
+ \nextboxht\strutht
+ \nextboxdp\strutdp
+ \hangindent\nextboxwd
+ \hangafter-\noflines
+ \llap{\flushnextbox}\ignorespaces}
+ \hbox}
+
+\def\modevalue#1#2#3%
+ {\@EA\ifx\csname\@mode@\systemmodeprefix#1\endcsname\endcsname\enabledmode#2\else#2\fi}
+
+\def\systemmodevalue#1%
+ {\modevalue{\systemmodeprefix#1}}
+
+% \getmulticolumnlines -> now in cont-loc, to be tested and really needed
+
+% \tracefonthandlingtrue
+
+% new, still to be improved
+%
+% \dorecurse{10}
+% {\input thuan
+% \placefigure{}{\framed[height=1.5cm]{test}}
+% \placefloatplaceholder}
+
+\def\placefloatplaceholder
+ {\ifroomforfloat \else
+ \scratchdimen\pagegoal
+ \advance\scratchdimen-\pagetotal
+ \advance\scratchdimen-3\lineheight
+ \ifdim\scratchdimen>\zeropoint
+ \startlinecorrection[blank]
+ \mhbox{\inframed{\labeltexts{placeholder}{\lastcaptiontag}}}%
+ \stoplinecorrection
+ \else
+ \allowbreak
+ \fi
+ \fi}
+
+\setuplabeltext
+ [placeholder={, moved}]
+
+% etex only, of course we could just parse (scan for \% in string)
+
+\newif\ifpercentdimendone
+
+\bgroup % usage: \setpercentdimen\somedimen{% or dimen} todo: pct
+\catcode124=\@@comment
+\catcode 37=\@@active
+\gdef\setpercentdimen#1#2|
+ {\xdef\@@expanded{#2}|
+ \ifx\@@expanded\empty\else
+ \bgroup
+ \global\percentdimendonefalse
+ \def\%{\dimexpr#1/100\relax\global\percentdimendonetrue\ignorespaces}| scantokens add's a space
+ \catcode`%=\@@active
+ \catcode`\\=\@@escape
+ \let%\%|
+ \scratchdimen#1|
+ \xdef\@@expanded{\@@expanded\scratchdimen\!!zeropoint}| trick: when 1.2 => .2\scratchdimen and 0pt typeset
+ \startnointerference
+ \global\globalscratchdimen\scantokens\@EA{\@@expanded}| i'm lazy and use etex
+ \stopnointerference
+ \egroup
+ #1\globalscratchdimen
+ \fi}
+\egroup
+
+% TEX alternative, in principle accurate enough and also a bit faster
+
+% \bgroup
+%
+% \catcode`\%=\@@other
+% \catcode`\|=\@@comment
+%
+% \gdef\setpercentdimen#1#2|
+% {\beforesplitstring#2\at%\to\ascii
+% \doifelse\ascii{#2}
+% {#1=#2}
+% {\divide#1by100\relax#1=\ascii#1\relax}} | or: {#1=\ascii#1\divide#1by100\relax}}
+%
+% \egroup
+%
+% \dimen0=1000pt \setpercentdimen{\dimen0}{10%} \the\dimen0
+% \dimen0= 100pt \setpercentdimen{\dimen0}{10%} \the\dimen0
+% \dimen0= 95pt \setpercentdimen{\dimen0}{10%} \the\dimen0
+% \dimen0= 10pt \setpercentdimen{\dimen0}{10%} \the\dimen0
+% \dimen0= 1pt \setpercentdimen{\dimen0}{10%} \the\dimen0
+
+\bgroup
+
+\obeylines % don't remove %'s !
+
+\gdef\collapsedspace#1%
+ {\ifx#1^^M%
+ \expandafter\collapsedspace
+ \else
+ \space
+ \expandafter#1%
+ \fi}
+
+\gdef\collapsespaces
+ {\prependtoksonce\relax\to\everyeof%
+ \ignorelines%
+ \ignoretabs%
+ \let\obeyedspace\collapsedspace%
+ \obeyspaces}
+
+\egroup
+
+\def\inlinedbox
+ {\bgroup
+ \dowithnextbox
+ {\scratchdimen\nextboxht
+ \advance\scratchdimen\nextboxdp
+ \advance\scratchdimen-\lineheight
+ \divide\scratchdimen\plustwo
+ \advance\scratchdimen\strutdepth
+ \setbox\nextbox\hbox{\lower\scratchdimen\flushnextbox}%
+ \nextboxht\strutht
+ \nextboxdp\strutdp
+ \flushnextbox
+ \egroup}%
+ \hbox}
+
+% \readfile{cont-exp}\donothing\donothing % speed up (5-20%)
+
+\def\dimenratio#1#2% etex only
+ {\withoutpt\the\dimexpr2\dimexpr(#1)/\dimexpr(#2)/32768\relax\relax}
+
+\def\doxprecurse#1#2%
+ {\ifnum#1=\zerocount % no \ifcase
+ \expandafter\gobblethreearguments
+ \else
+ #2\expandafter\expandafter\expandafter\doxprecurse\expandafter
+ \fi\expandafter{\the\numexpr#1-1\relax}{#2}}
+
+\def\buttonframed{\dodoubleempty\localframed[\??bt]} % goodie
+
+\unexpanded\def\asciistr#1{\dontleavehmode{\defconvertedargument\ascii{#1}\verbatimfont\ascii}}
+
+\def\shapefill{\vskip\zeropoint\!!plus\lineheight\!!minus\lineheight\relax}
+
+\let\normaltype\type
+
+\ifx\scantextokens\undefined
+ \ifx\scantokens\undefined
+ \unexpanded\def\retype#1{\dontleavehmode{\defconvertedargument\ascii{#1}\@EA\normaltype\@EA{\ascii}}}
+ \else
+ \unexpanded\def\retype#1{\dontleavehmode\scantokens{\normaltype{#1}\ignorespaces}\relax}
+ \fi
+\else
+ \unexpanded\def\retype#1{\dontleavehmode\scantextokens{\normaltype{#1}}}
+\fi
+
+\def\simplifytype{\let\type\retype}
+
+% \ruledhbox
+% {\startignorespaces
+% \def\oeps{a}
+% \startignorespaces
+% \def\oeps{a}
+% \stopignorespaces
+% \def\oeps{a}
+% \stopignorespaces
+% \oeps}
+
+\newsignal\boissignal
+\newcount \boislevel
+
+\long\def\startignorespaces
+ {\advance\boislevel\plusone
+ \ifcase\boislevel\or \ifhmode
+ \hskip\boissignal
+ \fi \fi
+ \ignorespaces}
+
+\long\def\stopignorespaces
+ {\ifcase\boislevel\or \ifhmode
+ \doloop
+ {\ifdim\lastskip=\zeropoint
+ \exitloop
+ \else\ifdim\lastskip=\boissignal
+ \unskip
+ \exitloop
+ \else
+ \unskip
+ \fi\fi}%
+ \fi \fi
+ \advance\boislevel\minusone}
+
+\def\minimalhbox#1#%
+ {\dowithnextbox
+ {\bgroup
+ \setbox\scratchbox\hbox#1{\hss}%
+ \ifdim\nextboxwd<\wd\scratchbox\nextboxwd\wd\scratchbox\fi
+ \flushnextbox
+ \egroup}
+ \hbox}
+
+% \def\dodimchoice#1#2#3%
+% {\ifx#3\relax
+% #1\@EA\gobbleuntilrelax
+% \else\ifdim#1#2%
+% #3\@EAEAEA\gobbleuntilrelax
+% \else
+% \@EAEAEA\dodimchoice
+% \fi\fi{#1}}
+
+% \def\donumchoice#1#2#3%
+% {\ifx#3\relax
+% #1\@EA\gobbleuntilrelax
+% \else\ifnum#1#2%
+% #3\@EAEAEA\gobbleuntilrelax
+% \else
+% \@EAEAEA\dodimchoice
+% \fi\fi{#1}}
+
+% \def\dimchoice#1#2{\dodimchoice{#1}#2\empty\relax}
+% \def\numchoice#1#2{\donumchoice{#1}#2\empty\relax}
+
+\def\gobbleuntilempty#1\empty{}
+
+\def\dodimchoice#1#2#3%
+ {\ifdim#1#2%
+ #3\@EA\gobbleuntilempty
+ \else
+ \@EA\dodimchoice
+ \fi{#1}}
+
+\def\donumchoice#1#2#3%
+ {\ifnum#1#2%
+ #3\@EA\gobbleuntilempty
+ \else
+ \@EA\dodimchoice
+ \fi{#1}}
+
+\def\dimchoice#1#2{\dodimchoice{#1}#2{=#1}{#1}\empty}
+\def\numchoice#1#2{\donumchoice{#1}#2{=#1}{#1}\empty}
+
+% \the\dimexpr(\dimchoice {7pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
+% \the\dimexpr(\dimchoice{11pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
+% \the\dimexpr(\dimchoice{14pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
+
+\def\showsetupsdefinition[#1]{\showvalue{\??su:#1}} % temp hack for debugging
+
+% will be a MyWay
+%
+% \setuplayout[grid=yes] \setupcaption[figure][inbetween=] \useMPlibrary[dum] \setupcolors[state=start]
+%
+% \starttext \showgrid \showstruts
+%
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=yes]}
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=fit]}
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=height]}
+% \input ward
+% \page
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=yes]}
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=fit]}
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=height]}
+% \input ward
+% \page
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=yes]}
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=fit]}
+% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=height]}
+% \input ward
+% \page
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=yes]}
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=fit]}
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=height]}
+% \input ward
+% \page
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=yes]}
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=fit]}
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=height]}
+% \input ward
+% \page
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=yes]}
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=fit]}
+% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=height]}
+% \input ward
+%
+% \stoptext
+
+% funny, as field action with e.g. dissolve ... only the field dissolves, bug?
+
+\setglobalsystemreference\rt!exec{Transition}{transition}
+
+%def\PDFexecutetransition {/Trans /Trans <</Type /Trans \executeifdefined{PDFpage\argumentA}\PDFpagereplace>>}
+\def\PDFexecutetransition {/Trans /Trans <<\executeifdefined{PDFpage\argumentA}\PDFpagereplace>>}
+
+% new, continuous blocks, \som \par \startdoorlopendblok ...
+
+% \startitemize
+% \item bagger
+% \item bagger
+% \item \startdoorlopendblok bagger \stopdoorlopendblok
+% \item \endgraf \startdoorlopendblok bagger \stopdoorlopendblok
+% \item \endgraf \startdoorlopendblok \strut bagger \stopdoorlopendblok
+% \item \startdoorlopendblok
+% \starttabulate
+% \NC test \NC test \NC \NR
+% \NC test \NC test \NC \NR
+% \NC test \NC test \NC \NR
+% \stoptabulate
+% \stopdoorlopendblok
+% \item test
+% \stopitemize
+
+\def\startdoorlopendblok % for special cases, don't change it too much and don't rely on it
+ {\ifhmode\endgraf\nobreak\fi % don't remove the \nobreak
+ \dowithnextboxcontent
+ {\setlocalhsize \hsize\localhsize \forgetall}
+ {\bgroup
+ \forgeteverypar
+ \forgetparskip
+ \scratchdimen\nextboxht
+ \advance\scratchdimen\nextboxdp
+ \getnoflines\scratchdimen
+ \advance\scratchdimen-\strutheight
+ \setbox\nextbox\hbox{\lower\scratchdimen\box\nextbox}%
+ \ht\nextbox\strutheight
+ \dp\nextbox\strutdepth
+ \setbox\nextbox\vbox
+ {\indent\box\nextbox
+ \endgraf
+ \nobreak
+ \advance\noflines\minusone
+ \dorecurse\noflines{\crlf\nobreak}}%
+ \verticalstrut
+ \endgraf
+ \nobreak
+ \offinterlineskip
+ \kern-2\lineheight % 2\lineheight when no vertical struts in main \vbox
+ \nobreak
+ \unvbox\nextbox
+ \prevdepth\strutdepth
+ % evt (eerst testen) een signal zodat een direct volgend blok goed gaat)
+ \egroup}
+ \vbox\bgroup
+ \vskip-\lineheight \verticalstrut\endgraf
+ \insidefloattrue
+ \doinhibitblank} % beware, no \inhibitblank ! ! ! ! ! !
+
+\def\stopdoorlopendblok
+ {\endgraf\verticalstrut\endgraf\kern-2\lineheight
+ \egroup}
+
+\def\tabulaterule % to be redone, not correct
+ {\dotabulaterule
+ {\hrule\!!height.5\scratchdimen\!!depth.5\scratchdimen\relax
+ \doifvalue{\??tt\currenttabulate\c!distance}\v!grid
+ {\kern-\scratchdimen}}} % experimental tm-prikkels
+
+% experimental: \synchronizegrid bla bla bla
+
+\newcounter\currentgridsync
+
+\def\gridsynctag{grs:\currentgridsync}
+
+\def\synchronizegrid
+ {\doglobal\increment\currentgridsync
+ \par\prevdepth\zeropoint
+ \nointerlineskip
+ \hpos\gridsynctag{\strut}\par
+ \vskip-\lineheight
+ \nointerlineskip
+ % top of text
+ \scratchdimen\MPy{\v!text:\MPp\gridsynctag}%
+ \advance\scratchdimen\MPh{\v!text:\MPp\gridsynctag}%
+ % move to first baseline
+ \advance\scratchdimen-\topskip
+ % subtract wrong baseline
+ \advance\scratchdimen-\MPy\gridsynctag
+ % get minimal number of lines
+ \advance\scratchdimen\lineheight
+ \getnoflines\scratchdimen
+ % calculate difference
+ \advance\scratchdimen-\noflines\lineheight\relax
+ \scratchdimen-\scratchdimen\relax
+ \ifdim\scratchdimen>\zeropoint
+ \nointerlineskip
+ \advance\scratchdimen-\lineheight
+ \vskip\scratchdimen \dontleavehmode \quad \strut
+ \par
+ %\else
+ % \message{no grid correction: \the\scratchdimen}\wait
+ \fi}
+
+% between alignment lines certain rules apply, and even a
+% simple test can mess up a table, which is why we have a
+% special test facility
+%
+% \ruledvbox
+% {\starttabulate[|l|p|]
+% \NC 1test \NC test \NC \NR
+% \tableifelse{\doifelse{a}{a}}{\NC Xtest \NC test \NC \NR}{}%
+% \stoptabulate}
+
+\long\def\tableifelse#1%
+ {\tablenoalign
+ {#1%
+ {\aftergroup \firstoftwoarguments}%
+ {\aftergroup\secondoftwoarguments}}}
+
+\long \def\tableiftextelse#1{\tableifelse{\doiftextelse{#1}}}
+
+% experiment, not yet to be used
+
+\def\displaybreak
+ {\ifhmode
+ \removeunwantedspaces
+ \ifcase\raggedstatus\hfill\fi
+ \strut\penalty-9999 % \break fails on case (3)
+ \fi}
+
+\def\startdisplay{\displaybreak\ignorespaces\startpacked}
+\def\stopdisplay {\stoppacked\displaybreak\ignorespaces}
+
+\def\tightvbox{\dowithnextbox{\nextboxdp\zeropoint\flushnextbox}\vbox}
+\def\tightvtop{\dowithnextbox{\nextboxht\zeropoint\flushnextbox}\vtop}
+
+% what is this stupid macro meant for:
+
+\def\hyphenationpoint
+ {\hskip\zeropoint}
+
+\def\hyphenated#1%
+ {\bgroup
+ \!!counta\zerocount
+ \def\hyphenated##1{\advance\!!counta\plusone}%
+ \handletokens#1\with\hyphenated
+ \!!countb\plusone
+ \def\hyphenated##1%
+ {##1%
+ \advance\!!countb\plusone\relax
+ \ifnum\!!countb>2 \ifnum\!!countb<\!!counta
+ \hyphenationpoint
+ \fi\fi}%
+ \handletokens#1\with\hyphenated
+ \egroup}
+
+\def\obeysupersubletters
+ {\let\super\normalsuper
+ \let\suber\normalsuber
+ \let\normalsuper\letterhat
+ \let\normalsuber\letterunderscore
+ \enablesupersub}
+
+\def\obeysupersubmath
+ {\let\normalsuper\letterhat
+ \let\normalsuber\letterunderscore
+ \enablesupersub}
+
+%\let\normaltype\type
+%
+%\def\type#1%
+% {\expanded{\normaltype{\detokenize{#1}}}}
+
+% {x123 \os x123} {\tfa x123 \os x123} {x123 \tx x123 \os x123}
+% \definefontsynonym[OldStyle][Serif]
+% {x123 \os x123} {\tfa x123 \os x123} {x123 \tx x123 \os x123}
+
+% testen :
+%
+% \appendtoks
+% \let\registerparoptions\relax
+% \to \everyforgetall
+
+\def\startgridcorrection
+ {\dosingleempty\dostartgridcorrection}
+
+\def\dostartgridcorrection[#1]%
+ {\ifgridsnapping
+ \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi
+ \snaptogrid\vbox\bgroup
+ \else
+ \startbaselinecorrection
+ \fi}
+
+\def\stopgridcorrection
+ {\ifgridsnapping
+ \egroup
+ \else
+ \stopbaselinecorrection
+ \fi}
+
+\def\checkgridsnapping
+ {\lineskip\ifgridsnapping\zeropoint\else\normallineskip\fi}
+
+\def\startplaatsen
+ {\dosingleempty\dostartplaatsen}
+
+\def\dostartplaatsen[#1]% tzt n*links etc
+ {\endgraf
+ \noindent\bgroup
+ \setlocalhsize
+ \hbox to \localhsize\bgroup
+ \doifnot{#1}\v!left\hss
+ \def\stopplaatsen
+ {\unskip\unskip\unskip
+ \doifnot{#1}\v!right\hss
+ \egroup
+ \egroup
+ \endgraf}%
+ \gobblespacetokens}
+
+% \startplaatsen[links] bla \stopplaatsen
+
+% we don't register the paragraph characteristics, only the
+% width
+
+\appendtoks
+ \setinnerparpositions % see "techniek" for application
+\to \everytabulate
+
+\def\fontclassname#1#2%
+ {\ifcsname\??ff#1#2\endcsname
+ \fontclassname{#1}{\csname\??ff#1#2\endcsname}%
+ \else\ifcsname\??ff#2\endcsname
+ \fontclassname{#1}{\csname\??ff#2\endcsname}%
+ \else
+ #2%
+ \fi\fi}
+
+\def\defineclassfontsynonym
+ {\dotripleargument\dodefineclassfontsynonym}
+
+\def\dodefineclassfontsynonym[#1][#2][#3]%
+ {\definefontsynonym[#1][\fontclassname{#2}{#3}]}
+
+%\definefontsynonym [KopFont] [\fontclassname{officina}{SerifBold}]
+%
+%\defineclassfontsynonym [KopFont] [officina] [SerifBold]
+
+\def\startcolumnmakeup % don't change
+ {\bgroup
+ \getrawnoflines\textheight % teksthoogte kan topskip hebben, dus raw
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen-\lineheight
+ \advance\scratchdimen\topskip
+ \setbox\scratchbox
+ \ifcase\showgridstate\vbox\else\ruledvbox\fi to \scratchdimen\bgroup
+ \forgetall} % ! don't change
+
+\def\stopcolumnmakeup
+ {\egroup
+ \dp\scratchbox\zeropoint
+ \wd\scratchbox\textwidth
+ \box\scratchbox
+ \egroup
+ \synchronizehsize}
+
+\long\def\startexternalfigure
+ {\dotripleempty\dostartexternalfigure}
+
+\long\def\dostartexternalfigure[#1][#2][#3]#4\stopexternalfigure
+ {\gdef\figuredescription{#4}%
+ \externalfigure[#1][#2][#3]%
+ \globallet\figuredescription\empty}
+
+\let\figuredescription\empty
+
+%% where does this come from, old code probably
+%%
+%%
+%% \newif\ifpagechanged \let\lastchangedpage\empty
+%%
+%% \def\checkpagechange#1%
+%% {\gettwopassdata\s!paragraph
+%% \pagechangedfalse
+%% \iftwopassdatafound
+%% \ifnum\twopassdata>0\getvalue{\s!paragraph:p:#1}\relax
+%% \pagechangedtrue
+%% \fi
+%% \fi
+%% \ifpagechanged
+%% \letgvalue{\s!paragraph:p:#1}\twopassdata
+%% \globallet\lastchangedpage\twopassdata
+%% \else
+%% \globallet\lastchangedpage\realfolio
+%% \fi
+%% \doparagraphreference}
+%%
+%% \def\changedpage#1%
+%% {\getvalue{\s!paragraph:p:#1}}
+
+\newcount\nofprofiled
+
+\def\profilemacro#1%
+ {\nofprofiled\zerocount
+ \letvalue{\string#1\string#1}#1%
+ \appendtoks
+ \normalwritestatus\m!systems{profile \string#1: \number\nofprofiled}%
+ \to \everystoptext
+ \unexpanded\def#1%
+ {\global\advance\nofprofiled\plusone
+ \csname\string#1\string#1\endcsname}}
+
+% incomplete, will be a special case of float placement
+
+\def\startfixed{\dosingleempty\dostartfixed}
+
+\def\dostartfixed[#1]%
+ {\expanded{\dowithnextbox{\noexpand\dodofixed{\ifhmode0\else1\fi}{#1}}}%
+ \vbox\bgroup
+ \setlocalhsize}
+
+\def\stopfixed
+ {\egroup}
+
+\def\dodofixed#1#2%
+ {\ifcase#1\relax
+ \processaction
+ [#2]
+ [ \v!high=>\bbox {\flushnextbox},
+ \v!low=>\tbox {\flushnextbox},
+ \v!middle=>\vcenter{\flushnextbox},
+ \v!lohi=>\vcenter{\flushnextbox},
+ \s!unknown=>\tbox {\flushnextbox},
+ \s!default=>\tbox {\flushnextbox}]%
+ \else
+ \startbaselinecorrection
+ \noindent\flushnextbox
+ \stopbaselinecorrection
+ \fi}
+
+% \startitemize
+%
+% \item \externalfigure[koe][height=2cm]
+% \item \externalfigure[koe][height=2cm]
+% \item \externalfigure[koe][height=2cm]
+% \item \externalfigure[koe][height=2cm]
+%
+% \page
+%
+% \item \startfixed \externalfigure[koe][height=2cm]\stopfixed
+% \item \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
+% \item \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
+% \item \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
+%
+% \page
+%
+% \item test \startfixed \externalfigure[koe][height=2cm]\stopfixed
+% \item test \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
+% \item test \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
+% \item test \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
+%
+% \page
+%
+% \item test \par \startfixed \externalfigure[koe][height=2cm]\stopfixed
+% \item test \par \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
+% \item test \par \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
+% \item test \par \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
+%
+% \stopitemize
+
+\def\obeyfollowingtoken{{}} % end \cs scanning
+
+% \def\comparedimension#1#2%
+% {\chardef\compresult
+% \ifdim#1<#2%
+% \zerocount
+% \else\ifdim#1<#2%
+% \plusone
+% \else
+% \plustwo
+% \fi\fi}
+% \newdimen\roundingeps \roundingeps=10sp
+% \def\comparedimensioneps#1#2%
+% {\chardef\compresult
+% \ifdim\dimexpr(#1-#2)<\roudingeps
+% \zerocount
+% \else\ifdim\dimexpr(#2-#1)<\roudingeps
+% \zerocount
+% \else\ifdim#1<#2%
+% \plusone
+% \else
+% \plustwo
+% \fi\fi\fi}
+
+%D Next we load a few local optimizations and new features. They
+%D live on on my machine and are not distributed, but they may end
+%D up in the distributed files.
+
+\enablemode[mkii] \enablemode[*mkii]
\long\def\startluacode#1\stopluacode{}
\long\def\ctxlua #1{}
@@ -19,4 +940,4 @@
\def\enabletrackers [#1]{}
\def\disabletrackers[#1]{}
-\endinput
+\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 6269e5a6160..3bda269efef 100644
--- a/Master/texmf-dist/tex/context/base/cont-new.mkiv
+++ b/Master/texmf-dist/tex/context/base/cont-new.mkiv
@@ -1,6 +1,6 @@
%D \module
%D [ file=cont-new,
-%D version=2006.10.04,
+%D version=1995.10.10,
%D title=\CONTEXT\ Miscellaneous Macros,
%D subtitle=New Macros,
%D author=Hans Hagen,
@@ -11,29 +11,577 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-% potential new defaults:
-%
-% \setbreakpoints[compound]
+\newcontextversion{2011.05.18 18:04}
+
+%D This file is loaded at runtime, thereby providing an
+%D excellent place for hacks, patches, extensions and new
+%D features.
\unprotect
-\ctxlua{logs.report = commands.report} % this will become default
+\writestatus\m!system{beware: some patches loaded from cont-new.mkiv}
+
+
+\def\fastscale#1%
+ {\begingroup
+ \ifnum#1=1000\relax
+ \setfalse\scaleboxdone
+ \else
+ \settrue\scaleboxdone
+ \edef\finalscaleboxxscale{\withoutpt\the\dimexpr#1pt/1000\relax}%
+ \let\finalscaleboxyscale\finalscaleboxxscale
+ \fi
+ \dowithnextbox{\doscaleboxindeed\flushnextbox\endgroup}\hbox}
+
+% \setupcaption [figure] [align=flushleft]
+% \setupcaption [figure-1] [align=flushleft,leftmargin=10mm]
+% \setupcaption [figure-2] [align=flushleft,leftmargin=10mm,rightmargin=-10mm,width=\textwidth]
+%
+% \startsetups somefigure
+% \ifdim\floatsetupwidth>\textwidth
+% \placesetupfloat[figure-2]
+% \else
+% \placesetupfloat[figure-1]
+% \fi
+% \stopsetups
+%
+% \placefloatwithsetups[somefigure]{}{\externalfigure[dummy][width=5cm,height=2cm]}
+
+\def\placefloatwithsetups
+ {\dotripleempty\doplacefloatwithsetups}
+
+\long\def\doplacefloatwithsetups[#1][#2][#3]#4%
+ {\def\floatsetupcaption {#4}%
+ \def\floatsetupcontent {\copy\nextbox}%
+ \def\floatsetupwidth {\wd\nextbox}%
+ \def\floatsetupheight {\ht\nextbox}%
+ \def\placesetupfloat[##1]{\placefloat[##1][#2][#3]{#4}{\floatsetupcontent}}% #4 and not \floatsetupcaption (unexpanded)
+ \dowithnextbox{\setups[#1]}\vbox}
+
+\def\dividedsize#1#2#3% size gap n
+ {\dimexpr
+ \ifnum\dimexpr#1\relax>\plusone
+ (\dimexpr#1\relax-\numexpr#3-1\relax\dimexpr#2\relax)/#3\else#1%
+ \fi
+ \relax}
+
+\def\singlewidened #1{\hbox spread 1em{\hss#1\hss}}
+\def\complexwidened[#1]#2{\hbox spread #1{\hss#2\hss}}
+
+\definecomplexorsimple\widened
+
+% todo
+%
+% \def\definelocation{\dodoubleargument\dodefinelocation}
+% \def\dodefinelocation[#1][#2]{\setvalue{loc:#1}{#2}}
+%
+% \definelocation[lt] [\v!left\v!top]
+% \definelocation[tl] [\v!left\v!top]
+% \definelocation[\v!top\v!left][\v!left\v!top]
+%
+% \def\getlocation#1{\executeifdefined{loc:#1}{#1}}
+
+% \let\cs\getvalue % no, we want \cs to be czech
+
+% experimental so this may change
+
+\def\startdescriptions
+ {\dosingleempty\dostartdescriptions}
+
+\def\dostartdescriptions[#1]%
+ {\begingroup
+ \def\item{\getvalue{#1}}%
+ \let\dostoppairdescription \donothing
+ \let\@@description \dostartpairdescription
+ \let\@@startsomedescription\dostartsomedescription}
+
+\def\stopdescriptions
+ {\dostoppairdescription
+ \endgroup}
+
+\def\dostartpairdescription[#1][#2]%
+ {\dostoppairdescription
+ \def\dostoppairdescription{\@@stopdescription{#1}}%
+ \bgroup
+ \def\currentdescription{#1}%
+ \doifelse{\descriptionparameter{\s!do\c!state}}\v!start
+ {\@@makedescription{#1}[#2]{}}
+ {\@@makedescription{#1}[#2]}}
+
+\def\dostartsomedescription% #1[#2]#3%
+ {\bgroup
+ \@@makedescription} % {#1}[#2]{#3}}
+
+% \starttext
+%
+% \definedescription[test]
+%
+% \startdescriptions
+% \test{Foo} Bar bar bar
+% \test{Foo} Bar bar bar
+% \test{Foo} Bar bar bar
+% \stopdescriptions
+%
+% \startdescriptions[test]
+% \item{Foo} Bar bar bar
+% \item{Foo} Bar bar bar
+% \item{Foo} Bar bar bar
+% \stopdescriptions
+%
+% \startdescriptions
+% \starttest{Foo} Bar bar bar \stoptest
+% \starttest{Foo} Bar bar bar \stoptest
+% \starttest{Foo} Bar bar bar \stoptest
+% \stopdescriptions
+%
+% \startdescriptions[test]
+% \item{Foo} Bar bar bar
+% \item{Foo} Bar bar bar
+% \item{Foo} Bar bar bar
+% \stopdescriptions
+%
+% \stoptext
+
+% this will be activated when
+%
+% \newinsert\thispageinsert % <- installinsertion
+%
+% \def\flushatthispage
+% {\bgroup
+% \dowithnextbox{\insert\thispageinsert{\box\nextbox}\egroup}%
+% \hbox}
+%
+% \appendtoks
+% \ifvoid\thispageinsert\else\hbox{\smashedbox\thispageinsert}\fi
+% \to \everyshipout
+
+% \definemarkedpage[nobackgrounds]
+% \markpage[nobackgrounds]
+% \doifmarkedpageelse{nobackgrounds}
+
+% Just a simple and fast hanger, for usage in macros.
+
+\def\setuphanging
+ {\dodoubleempty\getparameters[\??ha]}
+
+\setuphanging
+ [\c!distance=.5em]
+
+\def\starthanging
+ {\noindent\bgroup
+ \dowithnextbox
+ {\setbox\nextbox\hbox{\flushnextbox\hskip\@@hadistance}%
+ \hangindent\nextboxwd
+ \hangafter\plusone
+ \flushnextbox\ignorespaces}
+ \hbox}
+
+\def\stophanging
+ {\endgraf
+ \egroup}
+
+% experimental
+
+\def\stophangaround
+ {\endgraf
+ \egroup}
+
+\def\starthangaround
+ {\noindent\bgroup
+ \dowithnextbox
+ {\ifdim\nextboxht>\strutht\setbox\nextbox\tbox{\flushnextbox}\fi
+ \setbox\nextbox\hbox{\flushnextbox\hskip\@@hadistance}%
+ \getboxheight\scratchdimen\of\box\nextbox
+ \getnoflines\scratchdimen
+ \nextboxht\strutht
+ \nextboxdp\strutdp
+ \hangindent\nextboxwd
+ \hangafter-\noflines
+ \llap{\flushnextbox}\ignorespaces}
+ \hbox}
+
+\def\modevalue#1#2#3%
+ {\@EA\ifx\csname\@mode@\systemmodeprefix#1\endcsname\endcsname\enabledmode#2\else#2\fi}
+
+\def\systemmodevalue#1%
+ {\modevalue{\systemmodeprefix#1}}
+
+% new, still to be improved
+%
+% \dorecurse{10}
+% {\input thuan
+% \placefigure{}{\framed[height=1.5cm]{test}}
+% \placefloatplaceholder}
+
+\def\placefloatplaceholder
+ {\ifroomforfloat \else
+ \scratchdimen\pagegoal
+ \advance\scratchdimen-\pagetotal
+ \advance\scratchdimen-3\lineheight
+ \ifdim\scratchdimen>\zeropoint
+ \startlinecorrection[blank]
+ \mhbox{\inframed{\labeltexts{placeholder}{\lastcaptiontag}}}%
+ \stoplinecorrection
+ \else
+ \allowbreak
+ \fi
+ \fi}
+
+\setuplabeltext
+ [placeholder={, moved}]
+
+\startluacode
+ function commands.percentageof(str,dim)
+ local n = str:match("^(.*)%%$")
+ tex.sprint(tex.ctxcatcodes,(n and (tonumber(n)/100)*dim .. "sp") or str)
+ end
+\stopluacode
+
+\gdef\setpercentdimen#1#2%
+ {#1=\ctxcommand{percentageof("#2",\number#1)}\relax}
+
+% \scratchdimen=100pt \setpercentdimen\scratchdimen{10\letterpercent} \the\scratchdimen
+% \scratchdimen=100pt \setpercentdimen\scratchdimen{5pt} \the\scratchdimen
+
+\bgroup \permitcircumflexescape
-\def\immediatemessage#1{\ctxlua{commands.writestatus("message","#1")}}
+\obeylines % don't remove %'s !
-% we need to figure this out (to be discussed)
+\gdef\collapsedspace#1%
+ {\ifx#1^^M%
+ \expandafter\collapsedspace
+ \else
+ \space
+ \expandafter#1%
+ \fi}
-\unexpanded\def\textminus
- {\char \iffontchar\font"2012 "2012 % figuredash
- \else\iffontchar\font"2013 "2013 % endash
- \else\iffontchar\font"2212 "2212 % math minus
- "002D % hyphen
- \fi\fi\fi}
+\gdef\collapsespaces
+ {\prependtoksonce\relax\to\everyeof%
+ \ignorelines%
+ \ignoretabs%
+ \let\obeyedspace\collapsedspace%
+ \obeyspaces}
-\unexpanded\def\textplus
- {\char"002B } % plus
+\egroup
+
+\def\inlinedbox
+ {\bgroup
+ \dowithnextbox
+ {\scratchdimen\nextboxht
+ \advance\scratchdimen\nextboxdp
+ \advance\scratchdimen-\lineheight
+ \divide\scratchdimen\plustwo
+ \advance\scratchdimen\strutdepth
+ \setbox\nextbox\hbox{\lower\scratchdimen\flushnextbox}%
+ \nextboxht\strutht
+ \nextboxdp\strutdp
+ \flushnextbox
+ \egroup}%
+ \hbox}
+
+\def\dimenratio#1#2% etex only
+ {\withoutpt\the\dimexpr2\dimexpr(#1)/\dimexpr(#2)/32768\relax\relax}
+
+\def\doxprecurse#1#2%
+ {\ifnum#1=\zerocount % no \ifcase
+ \expandafter\gobblethreearguments
+ \else
+ #2\expandafter\expandafter\expandafter\doxprecurse\expandafter
+ \fi\expandafter{\the\numexpr#1-1\relax}{#2}}
+
+\def\buttonframed{\dodoubleempty\localframed[\??bt]} % goodie
+
+\unexpanded\def\asciistr#1{\dontleavehmode{\defconvertedargument\ascii{#1}\verbatimfont\ascii}}
+
+\def\shapefill{\vskip\zeropoint\!!plus\lineheight\!!minus\lineheight\relax}
+
+% \ruledhbox
+% {\startignorespaces
+% \def\oeps{a}
+% \startignorespaces
+% \def\oeps{a}
+% \stopignorespaces
+% \def\oeps{a}
+% \stopignorespaces
+% \oeps}
+
+\newsignal\boissignal
+\newcount \boislevel
+
+\long\def\startignorespaces
+ {\advance\boislevel\plusone
+ \ifcase\boislevel\or \ifhmode
+ \hskip\boissignal
+ \fi \fi
+ \ignorespaces}
+
+\long\def\stopignorespaces
+ {\ifcase\boislevel\or \ifhmode
+ \doloop
+ {\ifdim\lastskip=\zeropoint
+ \exitloop
+ \else\ifdim\lastskip=\boissignal
+ \unskip
+ \exitloop
+ \else
+ \unskip
+ \fi\fi}%
+ \fi \fi
+ \advance\boislevel\minusone}
+
+\def\minimalhbox#1#%
+ {\dowithnextbox
+ {\bgroup
+ \setbox\scratchbox\hbox#1{\hss}%
+ \ifdim\nextboxwd<\wd\scratchbox\nextboxwd\wd\scratchbox\fi
+ \flushnextbox
+ \egroup}
+ \hbox}
+
+\def\gobbleuntilempty#1\empty{}
+
+\def\dodimchoice#1#2#3%
+ {\ifdim#1#2%
+ #3\@EA\gobbleuntilempty
+ \else
+ \@EA\dodimchoice
+ \fi{#1}}
+
+\def\donumchoice#1#2#3%
+ {\ifnum#1#2%
+ #3\@EA\gobbleuntilempty
+ \else
+ \@EA\dodimchoice
+ \fi{#1}}
+
+\def\dimchoice#1#2{\dodimchoice{#1}#2{=#1}{#1}\empty}
+\def\numchoice#1#2{\donumchoice{#1}#2{=#1}{#1}\empty}
+
+% \the\dimexpr(\dimchoice {7pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
+% \the\dimexpr(\dimchoice{11pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
+% \the\dimexpr(\dimchoice{14pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
+
+\def\showsetupsdefinition[#1]{\showvalue{\??su:#1}} % temp hack for debugging
+
+\def\tabulaterule % to be redone, not correct
+ {\dotabulaterule
+ {\hrule\!!height.5\scratchdimen\!!depth.5\scratchdimen\relax
+ \doifvalue{\??tt\currenttabulate\c!distance}\v!grid
+ {\kern-\scratchdimen}}} % experimental tm-prikkels
+% so far
+
+% between alignment lines certain rules apply, and even a
+% simple test can mess up a table, which is why we have a
+% special test facility
+%
+% \ruledvbox
+% {\starttabulate[|l|p|]
+% \NC 1test \NC test \NC \NR
+% \tableifelse{\doifelse{a}{a}}{\NC Xtest \NC test \NC \NR}{}%
+% \stoptabulate}
+
+\long\def\tableifelse#1%
+ {\tablenoalign
+ {#1%
+ {\aftergroup \firstoftwoarguments}%
+ {\aftergroup\secondoftwoarguments}}}
+
+\long \def\tableiftextelse#1{\tableifelse{\doiftextelse{#1}}}
+
+\def\tightvbox{\dowithnextbox{\nextboxdp\zeropoint\flushnextbox}\vbox}
+\def\tightvtop{\dowithnextbox{\nextboxht\zeropoint\flushnextbox}\vtop}
+
+% what is this stupid macro meant for:
+
+\def\hyphenationpoint
+ {\hskip\zeropoint}
+
+\def\hyphenated#1%
+ {\bgroup
+ \!!counta\zerocount
+ \def\hyphenated##1{\advance\!!counta\plusone}%
+ \handletokens#1\with\hyphenated
+ \!!countb\plusone
+ \def\hyphenated##1%
+ {##1%
+ \advance\!!countb\plusone\relax
+ \ifnum\!!countb>2 \ifnum\!!countb<\!!counta
+ \hyphenationpoint
+ \fi\fi}%
+ \handletokens#1\with\hyphenated
+ \egroup}
+
+\def\obeysupersubletters
+ {\let\super\normalsuper
+ \let\suber\normalsuber
+ \let\normalsuper\letterhat
+ \let\normalsuber\letterunderscore
+ \enablesupersub}
+
+\def\obeysupersubmath
+ {\let\normalsuper\letterhat
+ \let\normalsuber\letterunderscore
+ \enablesupersub}
+
+\def\startgridcorrection
+ {\dosingleempty\dostartgridcorrection}
+
+\def\dostartgridcorrection[#1]%
+ {\ifgridsnapping
+ \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi
+ \snaptogrid\vbox\bgroup
+ \else
+ \startbaselinecorrection
+ \fi}
+
+\def\stopgridcorrection
+ {\ifgridsnapping
+ \egroup
+ \else
+ \stopbaselinecorrection
+ \fi}
+
+\def\checkgridsnapping
+ {\lineskip\ifgridsnapping\zeropoint\else\normallineskip\fi}
+
+\def\startplaatsen
+ {\dosingleempty\dostartplaatsen}
+
+\def\dostartplaatsen[#1]% tzt n*links etc
+ {\endgraf
+ \noindent\bgroup
+ \setlocalhsize
+ \hbox to \localhsize\bgroup
+ \doifnot{#1}\v!left\hss
+ \def\stopplaatsen
+ {\unskip\unskip\unskip
+ \doifnot{#1}\v!right\hss
+ \egroup
+ \egroup
+ \endgraf}%
+ \gobblespacetokens}
+
+% \startplaatsen[links] bla \stopplaatsen
+
+% we don't register the paragraph characteristics, only the
+% width
+
+\appendtoks
+ \setinnerparpositions % see "techniek" for application
+\to \everytabulate
+
+\def\fontclassname#1#2%
+ {\ifcsname\??ff#1#2\endcsname
+ \fontclassname{#1}{\csname\??ff#1#2\endcsname}%
+ \else\ifcsname\??ff#2\endcsname
+ \fontclassname{#1}{\csname\??ff#2\endcsname}%
+ \else
+ #2%
+ \fi\fi}
+
+\def\defineclassfontsynonym
+ {\dotripleargument\dodefineclassfontsynonym}
+
+\def\dodefineclassfontsynonym[#1][#2][#3]%
+ {\definefontsynonym[#1][\fontclassname{#2}{#3}]}
+
+%\definefontsynonym [KopFont] [\fontclassname{officina}{SerifBold}]
+%
+%\defineclassfontsynonym [KopFont] [officina] [SerifBold]
+
+\def\startcolumnmakeup % don't change
+ {\bgroup
+ \getrawnoflines\textheight % teksthoogte kan topskip hebben, dus raw
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen-\lineheight
+ \advance\scratchdimen\topskip
+ \setbox\scratchbox
+ \ifcase\showgridstate\vbox\else\ruledvbox\fi to \scratchdimen\bgroup
+ \forgetall} % ! don't change
+
+\def\stopcolumnmakeup
+ {\egroup
+ \dp\scratchbox\zeropoint
+ \wd\scratchbox\textwidth
+ \box\scratchbox
+ \egroup
+ \synchronizehsize}
+
+\long\def\startexternalfigure
+ {\dotripleempty\dostartexternalfigure}
+
+\long\def\dostartexternalfigure[#1][#2][#3]#4\stopexternalfigure
+ {\gdef\figuredescription{#4}%
+ \externalfigure[#1][#2][#3]%
+ \globallet\figuredescription\empty}
+
+\let\figuredescription\empty
+
+% incomplete, will be a special case of float placement
+
+\def\startfixed{\dosingleempty\dostartfixed}
+
+\def\dostartfixed[#1]%
+ {\expanded{\dowithnextbox{\noexpand\dodofixed{\ifhmode0\else1\fi}{#1}}}%
+ \vbox\bgroup
+ \setlocalhsize}
+
+\def\stopfixed
+ {\egroup}
+
+\def\dodofixed#1#2%
+ {\ifcase#1\relax
+ \processaction
+ [#2]
+ [ \v!high=>\bbox {\flushnextbox},
+ \v!low=>\tbox {\flushnextbox},
+ \v!middle=>\vcenter{\flushnextbox},
+ \v!lohi=>\vcenter{\flushnextbox},
+ \s!unknown=>\tbox {\flushnextbox},
+ \s!default=>\tbox {\flushnextbox}]%
+ \else
+ \startbaselinecorrection
+ \noindent\flushnextbox
+ \stopbaselinecorrection
+ \fi}
+
+% \startitemize
+%
+% \item \externalfigure[koe][height=2cm]
+% \item \externalfigure[koe][height=2cm]
+% \item \externalfigure[koe][height=2cm]
+% \item \externalfigure[koe][height=2cm]
+%
+% \page
+%
+% \item \startfixed \externalfigure[koe][height=2cm]\stopfixed
+% \item \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
+% \item \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
+% \item \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
+%
+% \page
+%
+% \item test \startfixed \externalfigure[koe][height=2cm]\stopfixed
+% \item test \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
+% \item test \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
+% \item test \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
+%
+% \page
+%
+% \item test \par \startfixed \externalfigure[koe][height=2cm]\stopfixed
+% \item test \par \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
+% \item test \par \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
+% \item test \par \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
+%
+% \stopitemize
+
+\def\obeyfollowingtoken{{}} % end \cs scanning
+
+% potential new defaults:
+%
+% \setbreakpoints[compound]
-% till we fixed all styles
+% till we fixed all styles:
\let\\=\crlf
diff --git a/Master/texmf-dist/tex/context/base/cont-new.tex b/Master/texmf-dist/tex/context/base/cont-new.tex
deleted file mode 100644
index 9c4fdba18f9..00000000000
--- a/Master/texmf-dist/tex/context/base/cont-new.tex
+++ /dev/null
@@ -1,992 +0,0 @@
-%D \module
-%D [ file=cont-new,
-%D version=1995.10.10,
-%D title=\CONTEXT\ Miscellaneous Macros,
-%D subtitle=New Macros,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\newcontextversion{2010.05.24 13:05}
-
-%D This file is loaded at runtime, thereby providing an
-%D excellent place for hacks, patches, extensions and new
-%D features.
-
-\unprotect
-
-% it's about time to clean up this file ...
-
-\writestatus\m!systems{beware: some patches loaded from cont-new.tex}
-
-% \ifx\pdfmapfile \undefined \else \pdfmapfile{ } \fi
-
-% \font\f=dummyfont \rpcode\f0=500 \hbox{..}\char0
-% todo: mp-new
-% caption: grid=top|bottom in xml defs
-
-\def\fastscale#1%
- {\begingroup
- \ifnum#1=1000\relax
- \setfalse\scaleboxdone
- \else
- \settrue\scaleboxdone
- \edef\finalscaleboxxscale{\withoutpt\the\dimexpr#1pt/1000\relax}%
- \let\finalscaleboxyscale\finalscaleboxxscale
- \fi
- \dowithnextbox{\doscaleboxindeed\flushnextbox\endgroup}\hbox}
-
-% \setupcaption [figure] [align=flushleft]
-% \setupcaption [figure-1] [align=flushleft,leftmargin=10mm]
-% \setupcaption [figure-2] [align=flushleft,leftmargin=10mm,rightmargin=-10mm,width=\textwidth]
-%
-% \startsetups somefigure
-% \ifdim\floatsetupwidth>\textwidth
-% \placesetupfloat[figure-2]
-% \else
-% \placesetupfloat[figure-1]
-% \fi
-% \stopsetups
-%
-% \placefloatwithsetups[somefigure]{}{\externalfigure[dummy][width=5cm,height=2cm]}
-
-\def\placefloatwithsetups
- {\dotripleempty\doplacefloatwithsetups}
-
-\long\def\doplacefloatwithsetups[#1][#2][#3]#4%
- {\def\floatsetupcaption {#4}%
- \def\floatsetupcontent {\copy\nextbox}%
- \def\floatsetupwidth {\wd\nextbox}%
- \def\floatsetupheight {\ht\nextbox}%
- \def\placesetupfloat[##1]{\placefloat[##1][#2][#3]{#4}{\floatsetupcontent}}% #4 and not \floatsetupcaption (unexpanded)
- \dowithnextbox{\setups[#1]}\vbox}
-
-\def\dividedsize#1#2#3% size gap n
- {\dimexpr
- \ifnum\dimexpr#1\relax>\plusone
- (\dimexpr#1\relax-\numexpr#3-1\relax\dimexpr#2\relax)/#3\else#1%
- \fi
- \relax}
-
-% \setuplabeltext[\s!itemcount1={{I(},{)}}]
-% \def\labeledcountervalue#1{\labeltexts{#1}{\countervalue{#1}}}
-
-\def\singlewidened #1{\hbox spread 1em{\hss#1\hss}}
-\def\complexwidened[#1]#2{\hbox spread #1{\hss#2\hss}}
-
-\definecomplexorsimple\widened
-
-% todo
-%
-% \def\definelocation{\dodoubleargument\dodefinelocation}
-% \def\dodefinelocation[#1][#2]{\setvalue{loc:#1}{#2}}
-%
-% \definelocation[lt] [\v!left\v!top]
-% \definelocation[tl] [\v!left\v!top]
-% \definelocation[\v!top\v!left][\v!left\v!top]
-%
-% \def\getlocation#1{\executeifdefined{loc:#1}{#1}}
-
-% just in case we load something from a file (pdfr-ec for instance)
-
-\prependtoks \restoreendofline \to \everybeforeshipout
-
-\let\cs\getvalue
-
-% experimental so this may change
-
-\def\startdescriptions
- {\dosingleempty\dostartdescriptions}
-
-\def\dostartdescriptions[#1]%
- {\begingroup
- \def\item{\getvalue{#1}}%
- \let\dostoppairdescription \donothing
- \let\@@description \dostartpairdescription
- \let\@@startsomedescription\dostartsomedescription}
-
-\def\stopdescriptions
- {\dostoppairdescription
- \endgroup}
-
-\def\dostartpairdescription[#1][#2]%
- {\dostoppairdescription
- \def\dostoppairdescription{\@@stopdescription{#1}}%
- \bgroup
- \def\currentdescription{#1}%
- \doifelse{\descriptionparameter{\s!do\c!state}}\v!start
- {\@@makedescription{#1}[#2]{}}
- {\@@makedescription{#1}[#2]}}
-
-\def\dostartsomedescription% #1[#2]#3%
- {\bgroup
- \@@makedescription} % {#1}[#2]{#3}}
-
-% \starttext
-%
-% \definedescription[test]
-%
-% \startdescriptions
-% \test{Foo} Bar bar bar
-% \test{Foo} Bar bar bar
-% \test{Foo} Bar bar bar
-% \stopdescriptions
-%
-% \startdescriptions[test]
-% \item{Foo} Bar bar bar
-% \item{Foo} Bar bar bar
-% \item{Foo} Bar bar bar
-% \stopdescriptions
-%
-% \startdescriptions
-% \starttest{Foo} Bar bar bar \stoptest
-% \starttest{Foo} Bar bar bar \stoptest
-% \starttest{Foo} Bar bar bar \stoptest
-% \stopdescriptions
-%
-% \startdescriptions[test]
-% \item{Foo} Bar bar bar
-% \item{Foo} Bar bar bar
-% \item{Foo} Bar bar bar
-% \stopdescriptions
-%
-% \stoptext
-
-% to do:
-%
-% \def\defineshapesynonym
-% {\dodoubleargument\dodefineshapesynonym}
-%
-% \def\dodefineshapesynonym[#1][#2]%
-% {\setvalue{shsy:#1}{#2}}
-%
-% \def\shapesynonym#1%
-% {\ifcsname shsy:#1\endcsname
-% \expandafter\shapesynonym\csname shsy:#1\endcsname\else#1%
-% \fi}
-%
-%\defineshapesynonym[eacute] [e]
-%\defineshapesynonym[egrave] [e]
-%\defineshapesynonym[eumlaut [e]
-%\defineshapesynonym[eogonek][e]
-%
-% more reduction
-%
-%\defineshapesynonym[e][o]
-%\defineshapesynonym[w][v]
-%\defineshapesynonym[m][n]
-%
-% \shapesynonym{eacute}
-
-% this will be activated when
-
-% \newinsert\thispageinsert % <- installinsertion
-
-% \def\flushatthispage
-% {\bgroup
-% \dowithnextbox{\insert\thispageinsert{\box\nextbox}\egroup}%
-% \hbox}
-
-% \appendtoks
-% \ifvoid\thispageinsert\else\hbox{\smashedbox\thispageinsert}\fi
-% \to \everyshipout
-
-% \definemarkedpage[nobackgrounds]
-% \markpage[nobackgrounds]
-% \doifmarkedpageelse{nobackgrounds}
-
-\newcounter\nofmarkedpages
-
-\def\definemarkedpage[#1]%
- {\definetwopasslist{\v!page:#1}}
-
-\def\markpage[#1]% looks very much like domarginreference
- {\iftrialtypesetting\else
- \doglobal\increment\nofmarkedpages\relax
- \lazysavetwopassdata{\v!page:#1}{\nofmarkedpages}{\noexpand\realfolio}%
- \fi}
-
-\def\doifmarkedpageelse#1%
- {\gettwopassdatalist{\v!page:#1}%
- \expanded{\doifinsetelse{\realfolio}{\twopassdatalist}}}
-
-% Just a simple and fast hanger, for usage in macros.
-
-\def\setuphanging
- {\dodoubleempty\getparameters[\??ha]}
-
-\setuphanging
- [\c!distance=.5em]
-
-\def\starthanging
- {\noindent\bgroup
- \dowithnextbox
- {\setbox\nextbox\hbox{\flushnextbox\hskip\@@hadistance}%
- \hangindent\nextboxwd
- \hangafter\plusone
- \flushnextbox\ignorespaces}
- \hbox}
-
-\def\stophanging
- {\endgraf
- \egroup}
-
-% experimental
-
-\def\stophangaround
- {\endgraf
- \egroup}
-
-\def\starthangaround
- {\noindent\bgroup
- \dowithnextbox
- {\ifdim\nextboxht>\strutht\setbox\nextbox\tbox{\flushnextbox}\fi
- \setbox\nextbox\hbox{\flushnextbox\hskip\@@hadistance}%
- \getboxheight\scratchdimen\of\box\nextbox
- \getnoflines\scratchdimen
- \nextboxht\strutht
- \nextboxdp\strutdp
- \hangindent\nextboxwd
- \hangafter-\noflines
- \llap{\flushnextbox}\ignorespaces}
- \hbox}
-
-\def\modevalue#1#2#3%
- {\@EA\ifx\csname\@mode@\systemmodeprefix#1\endcsname\endcsname\enabledmode#2\else#2\fi}
-
-\def\systemmodevalue#1%
- {\modevalue{\systemmodeprefix#1}}
-
-% \getmulticolumnlines -> now in cont-loc, to be tested and really needed
-
-% \tracefonthandlingtrue
-
-% new, still to be improved
-%
-% \dorecurse{10}
-% {\input thuan
-% \placefigure{}{\framed[height=1.5cm]{test}}
-% \placefloatplaceholder}
-
-\def\placefloatplaceholder
- {\ifroomforfloat \else
- \scratchdimen\pagegoal
- \advance\scratchdimen-\pagetotal
- \advance\scratchdimen-3\lineheight
- \ifdim\scratchdimen>\zeropoint
- \startlinecorrection[blank]
- \mhbox{\inframed{\labeltexts{placeholder}{\lastcaptiontag}}}%
- \stoplinecorrection
- \else
- \allowbreak
- \fi
- \fi}
-
-\setuplabeltext
- [placeholder={, moved}]
-
-% etex only, of course we could just parse (scan for \% in string)
-
-\newif\ifpercentdimendone
-
-\bgroup % usage: \setpercentdimen\somedimen{% or dimen} todo: pct
-\catcode124=\@@comment
-\catcode 37=\@@active
-\gdef\setpercentdimen#1#2|
- {\xdef\@@expanded{#2}|
- \ifx\@@expanded\empty\else
- \bgroup
- \global\percentdimendonefalse
- \def\%{\dimexpr#1/100\relax\global\percentdimendonetrue\ignorespaces}| scantokens add's a space
- \catcode`%=\@@active
- \catcode`\\=\@@escape
- \let%\%|
- \scratchdimen#1|
- \xdef\@@expanded{\@@expanded\scratchdimen\!!zeropoint}| trick: when 1.2 => .2\scratchdimen and 0pt typeset
- \startnointerference
- \global\globalscratchdimen\scantokens\@EA{\@@expanded}| i'm lazy and use etex
- \stopnointerference
- \egroup
- #1\globalscratchdimen
- \fi}
-\egroup
-
-% TEX alternative, in principle accurate enough and also a bit faster
-
-% \bgroup
-%
-% \catcode`\%=\@@other
-% \catcode`\|=\@@comment
-%
-% \gdef\setpercentdimen#1#2|
-% {\beforesplitstring#2\at%\to\ascii
-% \doifelse\ascii{#2}
-% {#1=#2}
-% {\divide#1by100\relax#1=\ascii#1\relax}} | or: {#1=\ascii#1\divide#1by100\relax}}
-%
-% \egroup
-%
-% \dimen0=1000pt \setpercentdimen{\dimen0}{10%} \the\dimen0
-% \dimen0= 100pt \setpercentdimen{\dimen0}{10%} \the\dimen0
-% \dimen0= 95pt \setpercentdimen{\dimen0}{10%} \the\dimen0
-% \dimen0= 10pt \setpercentdimen{\dimen0}{10%} \the\dimen0
-% \dimen0= 1pt \setpercentdimen{\dimen0}{10%} \the\dimen0
-
-\bgroup
-
-\obeylines % don't remove %'s !
-
-\gdef\collapsedspace#1%
- {\ifx#1^^M%
- \expandafter\collapsedspace
- \else
- \space
- \expandafter#1%
- \fi}
-
-\gdef\collapsespaces
- {\prependtoksonce\relax\to\everyeof%
- \ignorelines%
- \ignoretabs%
- \let\obeyedspace\collapsedspace%
- \obeyspaces}
-
-\egroup
-
-\def\inlinedbox
- {\bgroup
- \dowithnextbox
- {\scratchdimen\nextboxht
- \advance\scratchdimen\nextboxdp
- \advance\scratchdimen-\lineheight
- \divide\scratchdimen\plustwo
- \advance\scratchdimen\strutdepth
- \setbox\nextbox\hbox{\lower\scratchdimen\flushnextbox}%
- \nextboxht\strutht
- \nextboxdp\strutdp
- \flushnextbox
- \egroup}%
- \hbox}
-
-% \readfile{cont-exp}\donothing\donothing % speed up (5-20%)
-
-\def\dimenratio#1#2% etex only
- {\withoutpt\the\dimexpr2\dimexpr(#1)/\dimexpr(#2)/32768\relax\relax}
-
-\def\doxprecurse#1#2%
- {\ifnum#1=\zerocount % no \ifcase
- \expandafter\gobblethreearguments
- \else
- #2\expandafter\expandafter\expandafter\doxprecurse\expandafter
- \fi\expandafter{\the\numexpr#1-1\relax}{#2}}
-
-\def\buttonframed{\dodoubleempty\localframed[\??bt]} % goodie
-
-\unexpanded\def\asciistr#1{\dontleavehmode{\defconvertedargument\ascii{#1}\verbatimfont\ascii}}
-
-\def\shapefill{\vskip\zeropoint\!!plus\lineheight\!!minus\lineheight\relax}
-
-\let\normaltype\type
-
-\ifx\scantextokens\undefined
- \ifx\scantokens\undefined
- \unexpanded\def\retype#1{\dontleavehmode{\defconvertedargument\ascii{#1}\@EA\normaltype\@EA{\ascii}}}
- \else
- \unexpanded\def\retype#1{\dontleavehmode\scantokens{\normaltype{#1}\ignorespaces}\relax}
- \fi
-\else
- \unexpanded\def\retype#1{\dontleavehmode\scantextokens{\normaltype{#1}}}
-\fi
-
-\def\simplifytype{\let\type\retype}
-
-% \ruledhbox
-% {\startignorespaces
-% \def\oeps{a}
-% \startignorespaces
-% \def\oeps{a}
-% \stopignorespaces
-% \def\oeps{a}
-% \stopignorespaces
-% \oeps}
-
-\newsignal\boissignal
-\newcount \boislevel
-
-\long\def\startignorespaces
- {\advance\boislevel\plusone
- \ifcase\boislevel\or \ifhmode
- \hskip\boissignal
- \fi \fi
- \ignorespaces}
-
-\long\def\stopignorespaces
- {\ifcase\boislevel\or \ifhmode
- \doloop
- {\ifdim\lastskip=\zeropoint
- \exitloop
- \else\ifdim\lastskip=\boissignal
- \unskip
- \exitloop
- \else
- \unskip
- \fi\fi}%
- \fi \fi
- \advance\boislevel\minusone}
-
-\def\minimalhbox#1#%
- {\dowithnextbox
- {\bgroup
- \setbox\scratchbox\hbox#1{\hss}%
- \ifdim\nextboxwd<\wd\scratchbox\nextboxwd\wd\scratchbox\fi
- \flushnextbox
- \egroup}
- \hbox}
-
-% \def\dodimchoice#1#2#3%
-% {\ifx#3\relax
-% #1\@EA\gobbleuntilrelax
-% \else\ifdim#1#2%
-% #3\@EAEAEA\gobbleuntilrelax
-% \else
-% \@EAEAEA\dodimchoice
-% \fi\fi{#1}}
-
-% \def\donumchoice#1#2#3%
-% {\ifx#3\relax
-% #1\@EA\gobbleuntilrelax
-% \else\ifnum#1#2%
-% #3\@EAEAEA\gobbleuntilrelax
-% \else
-% \@EAEAEA\dodimchoice
-% \fi\fi{#1}}
-
-% \def\dimchoice#1#2{\dodimchoice{#1}#2\empty\relax}
-% \def\numchoice#1#2{\donumchoice{#1}#2\empty\relax}
-
-\def\gobbleuntilempty#1\empty{}
-
-\def\dodimchoice#1#2#3%
- {\ifdim#1#2%
- #3\@EA\gobbleuntilempty
- \else
- \@EA\dodimchoice
- \fi{#1}}
-
-\def\donumchoice#1#2#3%
- {\ifnum#1#2%
- #3\@EA\gobbleuntilempty
- \else
- \@EA\dodimchoice
- \fi{#1}}
-
-\def\dimchoice#1#2{\dodimchoice{#1}#2{=#1}{#1}\empty}
-\def\numchoice#1#2{\donumchoice{#1}#2{=#1}{#1}\empty}
-
-% \the\dimexpr(\dimchoice {7pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
-% \the\dimexpr(\dimchoice{11pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
-% \the\dimexpr(\dimchoice{14pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
-
-\def\showsetupsdefinition[#1]{\showvalue{\??su:#1}} % temp hack for debugging
-
-% documentation : \setupregister[alternative=a|b|A|B]
-\unprotected \def\traceposstring#1#2#3%
- {\iftracepositions
- \smashedhbox%
- {#1{\infofont#2#3}%
- \scratchdimen.5\points
- \kern-2\scratchdimen
- \vrule\!!width4\scratchdimen\!!height\scratchdimen\!!depth\scratchdimen}%
- \fi}
-
-% will be a MyWay
-%
-% \setuplayout[grid=yes] \setupcaption[figure][inbetween=] \useMPlibrary[dum] \setupcolors[state=start]
-%
-% \starttext \showgrid \showstruts
-%
-% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=yes]}
-% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=fit]}
-% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=height]}
-% \input ward
-% \page
-% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=yes]}
-% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=fit]}
-% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=height]}
-% \input ward
-% \page
-% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=yes]}
-% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=fit]}
-% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=height]}
-% \input ward
-% \page
-% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=yes]}
-% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=fit]}
-% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=height]}
-% \input ward
-% \page
-% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=yes]}
-% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=fit]}
-% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=height]}
-% \input ward
-% \page
-% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=yes]}
-% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=fit]}
-% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=height]}
-% \input ward
-%
-% \stoptext
-
-% funny, as field action with e.g. dissolve ... only the field dissolves, bug?
-
-\setglobalsystemreference\rt!exec{Transition}{transition}
-
-%def\PDFexecutetransition {/Trans /Trans <</Type /Trans \executeifdefined{PDFpage\argumentA}\PDFpagereplace>>}
-\def\PDFexecutetransition {/Trans /Trans <<\executeifdefined{PDFpage\argumentA}\PDFpagereplace>>}
-
-% new, continuous blocks, \som \par \startdoorlopendblok ...
-
-% \startitemize
-% \item bagger
-% \item bagger
-% \item \startdoorlopendblok bagger \stopdoorlopendblok
-% \item \endgraf \startdoorlopendblok bagger \stopdoorlopendblok
-% \item \endgraf \startdoorlopendblok \strut bagger \stopdoorlopendblok
-% \item \startdoorlopendblok
-% \starttabulate
-% \NC test \NC test \NC \NR
-% \NC test \NC test \NC \NR
-% \NC test \NC test \NC \NR
-% \stoptabulate
-% \stopdoorlopendblok
-% \item test
-% \stopitemize
-
-\def\startdoorlopendblok % for special cases, don't change it too much and don't rely on it
- {\ifhmode\endgraf\nobreak\fi % don't remove the \nobreak
- \dowithnextboxcontent
- {\setlocalhsize \hsize\localhsize \forgetall}
- {\bgroup
- \forgeteverypar
- \forgetparskip
- \scratchdimen\nextboxht
- \advance\scratchdimen\nextboxdp
- \getnoflines\scratchdimen
- \advance\scratchdimen-\strutheight
- \setbox\nextbox\hbox{\lower\scratchdimen\box\nextbox}%
- \ht\nextbox\strutheight
- \dp\nextbox\strutdepth
- \setbox\nextbox\vbox
- {\indent\box\nextbox
- \endgraf
- \nobreak
- \advance\noflines\minusone
- \dorecurse\noflines{\crlf\nobreak}}%
- \verticalstrut
- \endgraf
- \nobreak
- \offinterlineskip
- \kern-2\lineheight % 2\lineheight when no vertical struts in main \vbox
- \nobreak
- \unvbox\nextbox
- \prevdepth\strutdepth
- % evt (eerst testen) een signal zodat een direct volgend blok goed gaat)
- \egroup}
- \vbox\bgroup
- \vskip-\lineheight \verticalstrut\endgraf
- \insidefloattrue
- \doinhibitblank} % beware, no \inhibitblank ! ! ! ! ! !
-
-\def\stopdoorlopendblok
- {\endgraf\verticalstrut\endgraf\kern-2\lineheight
- \egroup}
-
-\def\tabulaterule % to be redone, not correct
- {\dotabulaterule
- {\hrule\!!height.5\scratchdimen\!!depth.5\scratchdimen\relax
- \doifvalue{\??tt\currenttabulate\c!distance}\v!grid
- {\kern-\scratchdimen}}} % experimental tm-prikkels
-
-% experimental: \synchronizegrid bla bla bla
-
-\newcounter\currentgridsync
-
-\def\gridsynctag{grs:\currentgridsync}
-
-\def\synchronizegrid
- {\doglobal\increment\currentgridsync
- \par\prevdepth\zeropoint
- \nointerlineskip
- \hpos\gridsynctag{\strut}\par
- \vskip-\lineheight
- \nointerlineskip
- % top of text
- \scratchdimen\MPy{\v!text:\MPp\gridsynctag}%
- \advance\scratchdimen\MPh{\v!text:\MPp\gridsynctag}%
- % move to first baseline
- \advance\scratchdimen-\topskip
- % subtract wrong baseline
- \advance\scratchdimen-\MPy\gridsynctag
- % get minimal number of lines
- \advance\scratchdimen\lineheight
- \getnoflines\scratchdimen
- % calculate difference
- \advance\scratchdimen-\noflines\lineheight\relax
- \scratchdimen-\scratchdimen\relax
- \ifdim\scratchdimen>\zeropoint
- \nointerlineskip
- \advance\scratchdimen-\lineheight
- \vskip\scratchdimen \dontleavehmode \quad \strut
- \par
- %\else
- % \message{no grid correction: \the\scratchdimen}\wait
- \fi}
-
-% needed for extreme (will go away)
-
-\definesystemvariable{ie}
-
-\def\definetest
- {\dodoubleempty\dodefinetest}
-
-\def\dodefinetest[#1][#2]#3%
- {\setgvalue{\??ie#1}{#3}%
- \ifsecondargument
- \processaction
- [#2]
- [% first test true, rest depends
- \v!next=>\setgvalue{\??ie#1}{\setgvalue{\??ie#1}{#3}\firstoftwoarguments},
- % rest true if first true
- % \v!first=>\setgvalue{\??ie#1}{#3{\letgvalue{\??ie#1}%
- % \firstoftwoarguments\firstoftwoarguments}%
- % \secondoftwoarguments},
- % always true
- \v!yes=>\letgvalue{\??ie#1}\firstoftwoarguments,
- % always false
- \v!no=>\letgvalue{\??ie#1}\secondoftwoarguments]%
- \fi}
-
-\def\doperformtest#1%
- {\executeifdefined{\??ie#1}\secondoftwoarguments}
-
-\def\definecolumnsethsize#1#2#3#4% will be improved/speed up
- {\bgroup
- \def\OTRSETidentifier{#1}%
- \ifcase\columnsetlevel\relax
- \mofcolumns\plusone
- \OTRSETinitializecolumns
- \OTRSETassignwidths
- \OTRSETsethsize
- \fi
- \!!counta#2\!!countb#3\docalculatecolumnsetspan
- \expandafter\egroup\expandafter\edef\expandafter
- #4\expandafter{\the\!!widtha}}
-
-% so far
-
-% between alignment lines certain rules apply, and even a
-% simple test can mess up a table, which is why we have a
-% special test facility
-%
-% \ruledvbox
-% {\starttabulate[|l|p|]
-% \NC 1test \NC test \NC \NR
-% \tableifelse{\doifelse{a}{a}}{\NC Xtest \NC test \NC \NR}{}%
-% \stoptabulate}
-
-\long\def\tableifelse#1%
- {\TABLEnoalign{#1%
- {\aftergroup \firstoftwoarguments}%
- {\aftergroup\secondoftwoarguments}}}
-
-\long \def\tableiftextelse#1{\tableifelse{\doiftextelse{#1}}}
-
-% experiment, not yet to be used
-
-\def\displaybreak
- {\ifhmode
- \removeunwantedspaces
- \ifcase\raggedstatus\hfill\fi
- \strut\penalty-9999 % \break fails on case (3)
- \fi}
-
-\def\startdisplay{\displaybreak\ignorespaces\startpacked}
-\def\stopdisplay {\stoppacked\displaybreak\ignorespaces}
-
-\def\tightvbox{\dowithnextbox{\nextboxdp\zeropoint\flushnextbox}\vbox}
-\def\tightvtop{\dowithnextbox{\nextboxht\zeropoint\flushnextbox}\vtop}
-
-% what is this stupid macro meant for:
-
-\def\hyphenationpoint
- {\hskip\zeropoint}
-
-\def\hyphenated#1%
- {\bgroup
- \!!counta\zerocount
- \def\hyphenated##1{\advance\!!counta\plusone}%
- \handletokens#1\with\hyphenated
- \!!countb\plusone
- \def\hyphenated##1%
- {##1%
- \advance\!!countb\plusone\relax
- \ifnum\!!countb>2 \ifnum\!!countb<\!!counta
- \hyphenationpoint
- \fi\fi}%
- \handletokens#1\with\hyphenated
- \egroup}
-
-\def\obeysupersubletters
- {\let\super\normalsuper
- \let\suber\normalsuber
- \let\normalsuper\letterhat
- \let\normalsuber\letterunderscore
- \enablesupersub}
-
-\def\obeysupersubmath
- {\let\normalsuper\letterhat
- \let\normalsuber\letterunderscore
- \enablesupersub}
-
-%\let\normaltype\type
-%
-%\def\type#1%
-% {\expanded{\normaltype{\detokenize{#1}}}}
-
-% {x123 \os x123} {\tfa x123 \os x123} {x123 \tx x123 \os x123}
-% \definefontsynonym[OldStyle][Serif]
-% {x123 \os x123} {\tfa x123 \os x123} {x123 \tx x123 \os x123}
-
-% testen :
-%
-% \appendtoks
-% \let\registerparoptions\relax
-% \to \everyforgetall
-
-\def\startgridcorrection
- {\dosingleempty\dostartgridcorrection}
-
-\def\dostartgridcorrection[#1]%
- {\ifgridsnapping
- \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi
- \snaptogrid\vbox\bgroup
- \else
- \startbaselinecorrection
- \fi}
-
-\def\stopgridcorrection
- {\ifgridsnapping
- \egroup
- \else
- \stopbaselinecorrection
- \fi}
-
-\def\checkgridsnapping
- {\lineskip\ifgridsnapping\zeropoint\else\normallineskip\fi}
-
-\def\startplaatsen
- {\dosingleempty\dostartplaatsen}
-
-\def\dostartplaatsen[#1]% tzt n*links etc
- {\endgraf
- \noindent\bgroup
- \setlocalhsize
- \hbox to \localhsize\bgroup
- \doifnot{#1}\v!left\hss
- \def\stopplaatsen
- {\unskip\unskip\unskip
- \doifnot{#1}\v!right\hss
- \egroup
- \egroup
- \endgraf}%
- \gobblespacetokens}
-
-% \startplaatsen[links] bla \stopplaatsen
-
-% we don't register the paragraph characteristics, only the
-% width
-
-\appendtoks
- \setinnerparpositions % see "techniek" for application
-\to \everytabulate
-
-\def\fontclassname#1#2%
- {\ifcsname\??ff#1#2\endcsname
- \fontclassname{#1}{\csname\??ff#1#2\endcsname}%
- \else\ifcsname\??ff#2\endcsname
- \fontclassname{#1}{\csname\??ff#2\endcsname}%
- \else
- #2%
- \fi\fi}
-
-\def\defineclassfontsynonym
- {\dotripleargument\dodefineclassfontsynonym}
-
-\def\dodefineclassfontsynonym[#1][#2][#3]%
- {\definefontsynonym[#1][\fontclassname{#2}{#3}]}
-
-%\definefontsynonym [KopFont] [\fontclassname{officina}{SerifBold}]
-%
-%\defineclassfontsynonym [KopFont] [officina] [SerifBold]
-
-\def\startcolumnmakeup % don't change
- {\bgroup
- \getrawnoflines\textheight % teksthoogte kan topskip hebben, dus raw
- \scratchdimen\noflines\lineheight
- \advance\scratchdimen-\lineheight
- \advance\scratchdimen\topskip
- \setbox\scratchbox
- \ifcase\showgridstate\vbox\else\ruledvbox\fi to \scratchdimen\bgroup
- \forgetall} % ! don't change
-
-\def\stopcolumnmakeup
- {\egroup
- \dp\scratchbox\zeropoint
- \wd\scratchbox\textwidth
- \box\scratchbox
- \egroup
- \synchronizehsize}
-
-\long\def\startexternalfigure
- {\dotripleempty\dostartexternalfigure}
-
-\long\def\dostartexternalfigure[#1][#2][#3]#4\stopexternalfigure
- {\gdef\figuredescription{#4}%
- \externalfigure[#1][#2][#3]%
- \globallet\figuredescription\empty}
-
-\let\figuredescription\empty
-
-%% where does this come from, old code probably
-%%
-%%
-%% \newif\ifpagechanged \let\lastchangedpage\empty
-%%
-%% \def\checkpagechange#1%
-%% {\gettwopassdata\s!paragraph
-%% \pagechangedfalse
-%% \iftwopassdatafound
-%% \ifnum\twopassdata>0\getvalue{\s!paragraph:p:#1}\relax
-%% \pagechangedtrue
-%% \fi
-%% \fi
-%% \ifpagechanged
-%% \letgvalue{\s!paragraph:p:#1}\twopassdata
-%% \globallet\lastchangedpage\twopassdata
-%% \else
-%% \globallet\lastchangedpage\realfolio
-%% \fi
-%% \doparagraphreference}
-%%
-%% \def\changedpage#1%
-%% {\getvalue{\s!paragraph:p:#1}}
-
-\newcount\nofprofiled
-
-\def\profilemacro#1%
- {\nofprofiled\zerocount
- \letvalue{\string#1\string#1}#1%
- \appendtoks
- \normalwritestatus\m!systems{profile \string#1: \number\nofprofiled}%
- \to \everystoptext
- \unexpanded\def#1%
- {\global\advance\nofprofiled\plusone
- \csname\string#1\string#1\endcsname}}
-
-% incomplete, will be a special case of float placement
-
-\def\startfixed{\dosingleempty\dostartfixed}
-
-\def\dostartfixed[#1]%
- {\expanded{\dowithnextbox{\noexpand\dodofixed{\ifhmode0\else1\fi}{#1}}}%
- \vbox\bgroup
- \setlocalhsize}
-
-\def\stopfixed
- {\egroup}
-
-\def\dodofixed#1#2%
- {\ifcase#1\relax
- \processaction
- [#2]
- [ \v!high=>\bbox {\flushnextbox},
- \v!low=>\tbox {\flushnextbox},
- \v!middle=>\vcenter{\flushnextbox},
- \v!lohi=>\vcenter{\flushnextbox},
- \s!unknown=>\tbox {\flushnextbox},
- \s!default=>\tbox {\flushnextbox}]%
- \else
- \startbaselinecorrection
- \noindent\flushnextbox
- \stopbaselinecorrection
- \fi}
-
-% \startitemize
-%
-% \item \externalfigure[koe][height=2cm]
-% \item \externalfigure[koe][height=2cm]
-% \item \externalfigure[koe][height=2cm]
-% \item \externalfigure[koe][height=2cm]
-%
-% \page
-%
-% \item \startfixed \externalfigure[koe][height=2cm]\stopfixed
-% \item \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
-% \item \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
-% \item \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
-%
-% \page
-%
-% \item test \startfixed \externalfigure[koe][height=2cm]\stopfixed
-% \item test \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
-% \item test \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
-% \item test \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
-%
-% \page
-%
-% \item test \par \startfixed \externalfigure[koe][height=2cm]\stopfixed
-% \item test \par \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
-% \item test \par \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
-% \item test \par \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
-%
-% \stopitemize
-
-\def\obeyfollowingtoken{{}} % end \cs scanning
-
-% \def\comparedimension#1#2%
-% {\chardef\compresult
-% \ifdim#1<#2%
-% \zerocount
-% \else\ifdim#1<#2%
-% \plusone
-% \else
-% \plustwo
-% \fi\fi}
-% \newdimen\roundingeps \roundingeps=10sp
-% \def\comparedimensioneps#1#2%
-% {\chardef\compresult
-% \ifdim\dimexpr(#1-#2)<\roudingeps
-% \zerocount
-% \else\ifdim\dimexpr(#2-#1)<\roudingeps
-% \zerocount
-% \else\ifdim#1<#2%
-% \plusone
-% \else
-% \plustwo
-% \fi\fi\fi}
-
-%D Next we load a few local optimizations and new features. They
-%D live on on my machine and are not distributed, but they may end
-%D up in the distributed files.
-
-\loadmarkfile{cont-new}
-
-\readsysfile {cont-loc} {} {} % local improvements, patches, new features
-\readsysfile {cont-exp} {} {} % experimental features (e.g. local speed-ups)
-%readsysfile {cont-mtx} {} {} % experimental metatex features
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-nl.mkii b/Master/texmf-dist/tex/context/base/cont-nl.mkii
new file mode 100644
index 00000000000..925ec899958
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-nl.mkii
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-nl,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Dutch Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {dutch}
+\def\defaultlanguagetag{nl}
+
+\input context.mkii
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-nl.mkiv b/Master/texmf-dist/tex/context/base/cont-nl.mkiv
new file mode 100644
index 00000000000..f6d2671e3fb
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-nl.mkiv
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-nl,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Dutch Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {dutch}
+\def\defaultlanguagetag{nl}
+
+\input context.mkiv
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-nl.tex b/Master/texmf-dist/tex/context/base/cont-nl.tex
deleted file mode 100644
index 32b82b01a68..00000000000
--- a/Master/texmf-dist/tex/context/base/cont-nl.tex
+++ /dev/null
@@ -1,42 +0,0 @@
-%D \module
-%D [ file=cont-nl,
-%D version=1997.08.19,
-%D title=\CONTEXT,
-%D subtitle=\CONTEXT\ Dutch Format Generation,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\catcode`\{=1 \catcode`\}=2 \def\defaultinterface{dutch}
-
-\input context.tex
-
-\unprotect
-
-\setupcurrentlanguage[\s!nl]
-
-\loaduserspecifications
-
-\installlanguage [\s!us] [\c!state=\v!start]
-\installlanguage [\s!gb] [\c!state=\v!start]
-\installlanguage [\s!de] [\c!state=\v!start]
-\installlanguage [\s!fr] [\c!state=\v!start]
-\installlanguage [\s!es] [\c!state=\v!start]
-\installlanguage [\s!nl] [\c!state=\v!start]
-\installlanguage [\s!it] [\c!state=\v!start]
-
-\ifnum\texengine=\luatexengine
- % will be runtime option: typeface
- \appendtoks
- \usetypescript[modern]
- \setuptypeface[modern]
- \to \everyjob
-\else
- \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
-\fi
-
-\protect \errorstopmode \dump \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-old.tex b/Master/texmf-dist/tex/context/base/cont-old.tex
deleted file mode 100644
index 360b5f2e6ae..00000000000
--- a/Master/texmf-dist/tex/context/base/cont-old.tex
+++ /dev/null
@@ -1,48 +0,0 @@
-%D \module
-%D [ file=cont-old,
-%D version=1995.10.10,
-%D title=\CONTEXT\ Miscellaneous Macros,
-%D subtitle=Old Macros,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Old Macros}
-
-\unprotect
-
-\def\middleraggedness {6\bodyfontsize}
-
-\def\dosubstitutecommand#1#2%
- {\writestatus\m!systems{\string#1\normalspace -> \string#2}%
- \gdef#1{#2}%
- #2}
-
-\def\substitutecommand#1#2%
- {\gdef#1{\dosubstitutecommand{#1}{#2}}}
-
-\substitutecommand \volgendehoofdstuk {\setupheadnumber[hoofdstuk][+1]}
-\substitutecommand \volgendeparagraaf {\setupheadnumber[paragraaf][+1]}
-\substitutecommand \volgendesubparagraaf {\setupheadnumber[subparagraaf][+1]}
-\substitutecommand \volgendesubsubparagraaf {\setupheadnumber[subsubparagraaf][+1]}
-
-\substitutecommand \volledigeinhoudsopgave \volledigeinhoud
-\substitutecommand \plaatsinhoudsopgave \plaatsinhoud
-\substitutecommand \stelinhoudsopgavein \stelinhoudin
-
-\substitutecommand \streep \onderstreep
-\substitutecommand \strepen \onderstrepen
-
-\substitutecommand \pragmakenmerk \referral
-
-\substitutecommand \definieersynoniem \definesynonyms
-
-\substitutecommand \setupintermezzos \setupintermezzi
-
-\let \Everybodyfont \EveryBodyFont
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-pe.mkiv b/Master/texmf-dist/tex/context/base/cont-pe.mkiv
new file mode 100644
index 00000000000..e65ad132811
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-pe.mkiv
@@ -0,0 +1,22 @@
+%D \module
+%D [ file=cont-en,
+%D version=1997.08.19,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ English Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {persian}
+\def\messageinterface {english}
+\def\defaultlanguagetag{pe}
+
+\input context.mkiv
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-pe.tex b/Master/texmf-dist/tex/context/base/cont-pe.tex
deleted file mode 100644
index fdf47d680da..00000000000
--- a/Master/texmf-dist/tex/context/base/cont-pe.tex
+++ /dev/null
@@ -1,45 +0,0 @@
-%D \module
-%D [ file=cont-en,
-%D version=1997.08.19,
-%D title=\CONTEXT,
-%D subtitle=\CONTEXT\ English Format Generation,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\catcode`\{=1 \catcode`\}=2 \def\defaultinterface{persian} \def\messageinterface{english}
-
-\input context.tex
-
-\unprotect
-
-\setupcurrentlanguage[\s!pe]
-
-\loaduserspecifications
-
-% Do we need more defaults? or maybe all languages?
-
-\installlanguage [\s!us] [\c!state=\v!start]
-\installlanguage [\s!gb] [\c!state=\v!start]
-\installlanguage [\s!de] [\c!state=\v!start]
-\installlanguage [\s!fr] [\c!state=\v!start]
-\installlanguage [\s!es] [\c!state=\v!start]
-\installlanguage [\s!it] [\c!state=\v!start]
-\installlanguage [\s!nl] [\c!state=\v!start]
-\installlanguage [\s!pe] [\c!state=\v!start]
-
-\ifnum\texengine=\luatexengine
- % will be runtime option: typeface
- \appendtoks
- \usetypescript[modern]
- \setuptypeface[modern]
- \to \everyjob
-\else
- \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
-\fi
-
-\protect \errorstopmode \dump \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-ro.mkii b/Master/texmf-dist/tex/context/base/cont-ro.mkii
new file mode 100644
index 00000000000..59561319457
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-ro.mkii
@@ -0,0 +1,22 @@
+%D \module
+%D [ file=cont-ro,
+%D version=2000.01.09,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Romanian Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {romanian}
+\def\defaultlanguagetag{ro}
+
+\input context.mkii
+
+\endinput
+
diff --git a/Master/texmf-dist/tex/context/base/cont-ro.mkiv b/Master/texmf-dist/tex/context/base/cont-ro.mkiv
new file mode 100644
index 00000000000..90bbc27dce9
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/cont-ro.mkiv
@@ -0,0 +1,21 @@
+%D \module
+%D [ file=cont-ro,
+%D version=2000.01.09,
+%D title=\CONTEXT,
+%D subtitle=\CONTEXT\ Romanian Format Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\catcode`\{=1 \catcode`\}=2
+
+\def\defaultinterface {romanian}
+\def\defaultlanguagetag{ro}
+
+\input context.mkiv
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-ro.tex b/Master/texmf-dist/tex/context/base/cont-ro.tex
deleted file mode 100644
index 9be9b116252..00000000000
--- a/Master/texmf-dist/tex/context/base/cont-ro.tex
+++ /dev/null
@@ -1,38 +0,0 @@
-%D \module
-%D [ file=cont-ro,
-%D version=2000.01.09,
-%D title=\CONTEXT,
-%D subtitle=\CONTEXT\ Romanian Format Generation,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\catcode`\{=1 \catcode`\}=2 \def\defaultinterface{romanian}
-
-\input context.tex
-
-\unprotect
-
-\setupcurrentlanguage[\s!ro]
-
-\loaduserspecifications
-
-\installlanguage [\s!en] [\c!state=\v!start]
-\installlanguage [\s!de] [\c!state=\v!start]
-\installlanguage [\s!ro] [\c!state=\v!start]
-
-\ifnum\texengine=\luatexengine
- % will be runtime option: typeface
- \appendtoks
- \usetypescript[modern]
- \setuptypeface[modern]
- \to \everyjob
-\else
- \setupencoding[default=ec] \usetypescript[fallback][\defaultencoding] \setupbodyfont[rm,12pt]
-\fi
-
-\protect \errorstopmode \dump \endinput
diff --git a/Master/texmf-dist/tex/context/base/cont-sys.ori b/Master/texmf-dist/tex/context/base/cont-sys.ori
index 11c0141e795..fa438a78d4f 100644
--- a/Master/texmf-dist/tex/context/base/cont-sys.ori
+++ b/Master/texmf-dist/tex/context/base/cont-sys.ori
@@ -11,6 +11,10 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D Beware, this is a MkII specific file. In MkIV we only load
+%D cont-sys.mkiv but in MkII we load the first found of
+%D cont-sys.mkii, cont-sys.tex, cont-sys.rme.
+
\unprotect
% Speed up typescript loading, but at the cost of much memory:
diff --git a/Master/texmf-dist/tex/context/base/cont-usr.ori b/Master/texmf-dist/tex/context/base/cont-usr.ori
deleted file mode 100644
index 5a3070362f8..00000000000
--- a/Master/texmf-dist/tex/context/base/cont-usr.ori
+++ /dev/null
@@ -1,109 +0,0 @@
-%D \module
-%D [ file=cont-usr,
-%D version=1997.10.05,
-%D title=\CONTEXT\ User Format Specifications,
-%D subtitle=System Specific Setups,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 User Settings}
-
-\unprotect
-
-%D Additional languages can be defined here. Beware of
-%D encoding incompatibilities. Please take a look at the
-%D \type {cont-en.tex}, \type {cont-nl.tex}, enz.\ files
-%D first. Normally you don't have to change a byte. If you
-%D want to play safe, use \typ {texexec --make --alone
-%D --all}.
-
-% \preloadallpatterns % will load them all
-
-% \installlanguage [\s!af] [\c!state=\v!start] % afrikaans
-% \installlanguage [\s!ca] [\c!state=\v!start] % catalan
-% \installlanguage [\s!cs] [\c!state=\v!start] % czech
-% \installlanguage [\s!da] [\c!state=\v!start] % danish
-% \installlanguage [\s!de] [\c!state=\v!start] % german
-% \installlanguage [\s!en] [\c!state=\v!start] % english us
-% \installlanguage [\s!es] [\c!state=\v!start] % spanish
-% \installlanguage [\s!fi] [\c!state=\v!start] % finnish
-% \installlanguage [\s!fr] [\c!state=\v!start] % french
-% \installlanguage [\s!hr] [\c!state=\v!start] % croatian
-% \installlanguage [\s!hu] [\c!state=\v!start] % hungarian
-% \installlanguage [\s!it] [\c!state=\v!start] % italian
-% \installlanguage [\s!la] [\c!state=\v!start] % latin
-% \installlanguage [\s!nl] [\c!state=\v!start] % dutch
-% \installlanguage [\s!nb] [\c!state=\v!start] % bokmal
-% \installlanguage [\s!nn] [\c!state=\v!start] % nynorsk
-% \installlanguage [\s!pl] [\c!state=\v!start] % polish
-% \installlanguage [\s!pt] [\c!state=\v!start] % portuguese
-% \installlanguage [\s!ro] [\c!state=\v!start] % romanian
-% \installlanguage [\s!ru] [\c!state=\v!start] % russian
-% \installlanguage [\s!sk] [\c!state=\v!start] % slovak
-% \installlanguage [\s!sl] [\c!state=\v!start] % slovenian
-% \installlanguage [\s!sv] [\c!state=\v!start] % swedish
-% \installlanguage [\s!tr] [\c!state=\v!start] % turkish
-% \installlanguage [\s!ua] [\c!state=\v!start] % ukrainian
-% \installlanguage [\s!gb] [\c!state=\v!start] % english uk
-% \installlanguage [\s!vn] [\c!state=\v!start] % vietnamese
-
-% \installlanguage [deo] [\c!state=\v!start] % old german
-
-%D The next lines can be used for setting the language to be
-%D used at startup time.
-
-% \setupcurrentlanguage[\s!af]
-% \setupcurrentlanguage[\s!ca]
-% \setupcurrentlanguage[\s!cs]
-% \setupcurrentlanguage[\s!da]
-% \setupcurrentlanguage[\s!de]
-% \setupcurrentlanguage[\s!en]
-% \setupcurrentlanguage[\s!es]
-% \setupcurrentlanguage[\s!fi]
-% \setupcurrentlanguage[\s!fr]
-% \setupcurrentlanguage[\s!hr]
-% \setupcurrentlanguage[\s!hu]
-% \setupcurrentlanguage[\s!it]
-% \setupcurrentlanguage[\s!la]
-% \setupcurrentlanguage[\s!nl]
-% \setupcurrentlanguage[\s!nb]
-% \setupcurrentlanguage[\s!nn]
-% \setupcurrentlanguage[\s!pl]
-% \setupcurrentlanguage[\s!pt]
-% \setupcurrentlanguage[\s!ro]
-% \setupcurrentlanguage[\s!ru]
-% \setupcurrentlanguage[\s!sk]
-% \setupcurrentlanguage[\s!sl]
-% \setupcurrentlanguage[\s!sv]
-% \setupcurrentlanguage[\s!tr]
-% \setupcurrentlanguage[\s!ua]
-
-%D Local font settings can go here. Normally suitable
-%D defaults are already preloaded, almost certainly the
-%D Computer Modern Roman typefaces or some derivate. So, the
-%D next line is only meant as sample, take a look at the
-%D format related files first.
-
-% This is obsolete due to latin modern:
-%
-% \definefilesynonym [font-cmr] [font-csr] % czech & slovak
-% \definefilesynonym [font-cmr] [font-plr] % polish
-
-%D In some languages, compound characters, like \type {"e}
-%D are used to get accented and non latin characters.
-
-% Per 21/9/2006 one needs to explicitly enable this.
-
-% \useencoding[fde] % german
-% \useencoding[ffr] % french
-% \useencoding[fro] % romanian
-% \useencoding[fpl] % polish
-
-%D Don't remove the next few lines.
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/context.lus b/Master/texmf-dist/tex/context/base/context.lus
new file mode 100644
index 00000000000..960e96adf7c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/context.lus
@@ -0,0 +1,71 @@
+if not modules then modules = { } end modules ['context'] = {
+ version = 1.001,
+ comment = "companion to context.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[<p>This table specifies what stub files are needed in order to create
+the format. These files are loaded before the format is made so that we
+bypass kpse. When the format itself is used, another stub is used (with
+suffix lui). The current format builder is to a large part determined by
+the way luatex evolved and the process will probaby change.</p>]]--
+
+local method = 3
+
+local stubfiles = {
+
+ 'luat-cod.lua',
+
+ -- Here follows a list of trac, luat and data files, but we don't
+ -- it this way any more so there is no need to keep this updated.
+
+}
+
+-- This method will trigger the creation of a stub file with all neccessary
+-- libraries merged. This is how we originally did it.
+
+if method == 1 then
+
+ return stubfiles
+
+end
+
+-- This method will use this file as stub file so no merge is needed.
+
+if method == 2 then
+
+ if resolvers then
+ -- we're loading this file in mtxrun
+ else
+
+ local sourcepath = string.gsub(arg and arg[1] or "","/[^/]+$","")
+ local targetpath = "."
+
+ if sourcepath == "" then sourcepath = targetpath end
+
+ for i=1,#stubfiles do
+ local filename = sourcepath .. "/" .. stubfiles[i]
+ texio.write_nl("preloading " .. filename)
+ dofile(filename)
+ end
+ texio.write_nl("\n")
+
+ end
+
+ return "context.lus"
+
+end
+
+-- Only a simple stub:
+
+if method == 3 then
+
+ return "luat-cod.lua"
+
+end
+
+-- The last resort.
+
+return stubfiles
diff --git a/Master/texmf-dist/tex/context/base/context.mkii b/Master/texmf-dist/tex/context/base/context.mkii
index 4be60cbfcbc..7312bdcf562 100644
--- a/Master/texmf-dist/tex/context/base/context.mkii
+++ b/Master/texmf-dist/tex/context/base/context.mkii
@@ -11,30 +11,67 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+\catcode`\{=1 \catcode`\}=2 \catcode`\#=6
+
+%D From the next string (which is set by the script that assembles the
+%D distribution) later on we will calculate a number that can be used
+%D by use modules to identify the feature level. Starting with version
+%D 2004.8.30 the low level interface is english. Watch out and adapt
+%D your styles an modules.
+
+\edef\contextformat {\jobname}
+\edef\contextversion{2011.05.18 18:04}
+
+%D For those who want to use this:
+
+\let\fmtname \contextformat
+\let\fmtversion\contextversion
+
+%D Loading:
+
+\edef\mksuffix {mkii}
+\edef\contextmark{MKII}
+
+\ifx\normalinput\undefined \let\normalinput\input \fi
+
+\def\loadcorefile#1{\normalinput#1\relax}
+\def\loadmarkfile#1{\normalinput#1.\mksuffix\relax}
+\def\loadmkiifile#1{\normalinput#1\relax}
+\def\loadmkivfile#1{}
+
%D First we load the system modules. These implement a lot of
%D manipulation macros. The first one loads \PLAIN\ \TEX, as
%D minimal as possible.
-\loadcorefile{syst-ini}
-\loadcorefile{syst-pln}
+\loadmarkfile{syst-ini}
+
+%D Some checking (more primitives are now defined):
-\loadcorefile{norm-tex}
-\loadcorefile{norm-etx}
-\loadcorefile{norm-ptx}
-\loadcorefile{norm-xtx}
-\loadcorefile{norm-ctx}
+\ifdefined\defaultinterface \else \def\defaultinterface {english} \fi
+%ifdefined\messageinterface \else \let\messageinterface \defaultinterface \fi
+\ifdefined\defaultlanguagetag \else \def\defaultlanguagetag{en} \fi
+
+%D More core code.
+
+\loadmarkfile{syst-pln}
+
+\loadmarkfile{norm-tex}
+\loadmarkfile{norm-etx}
+\loadmarkfile{norm-ptx}
+\loadmarkfile{norm-xtx}
+\loadmarkfile{norm-ctx}
\loadmarkfile{catc-ini}
-\loadcorefile{catc-act}
-\loadcorefile{catc-def}
-\loadcorefile{catc-ctx}
-\loadcorefile{catc-sym}
+\loadmarkfile{catc-act}
+\loadmarkfile{catc-def}
+\loadmarkfile{catc-ctx}
+\loadmarkfile{catc-sym}
+\loadmarkfile{catc-xml}
\loadmarkfile{syst-gen}
\loadmarkfile{syst-ext}
\loadmarkfile{syst-new}
\loadmarkfile{syst-con}
-\loadcorefile{syst-ltx}
\loadmarkfile{thrd-trg} % based on: David Carlisle
\loadmarkfile{syst-fnt}
@@ -58,14 +95,19 @@
\loadmarkfile{supp-fil}
\loadmarkfile{supp-dir}
+%D This is for mkii bibtex users who expect \LATEX\ commands.
+
+\loadmarkfile{supp-lat}
+
%D After this we're ready for the multi||lingual interface
%D modules.
\loadmarkfile{mult-ini}
-\loadcorefile{mult-fst}
-\loadcorefile{mult-sys}
-\loadcorefile{mult-def}
+\loadmarkfile{mult-fst}
+\loadmarkfile{mult-sys}
+\loadmarkfile{mult-def}
\loadmarkfile{mult-chk}
+\loadmarkfile{mult-aux}
%D Now we're ready for some general support modules. These
%D modules implement some basic typesetting functionality.
@@ -73,18 +115,18 @@
\loadmarkfile{core-var}
\loadmarkfile{core-env}
-\loadcorefile{supp-box}
+\loadmarkfile{supp-box}
\loadmarkfile{supp-mrk}
-\loadcorefile{supp-vis}
-\loadcorefile{supp-fun}
+\loadmarkfile{supp-vis}
+\loadmarkfile{supp-fun}
%loadmarkfile{supp-eps}
\loadmarkfile{supp-spe}
\loadmarkfile{supp-ran}
\loadmarkfile{supp-mps}
\loadmarkfile{supp-tpi}
\loadmarkfile{supp-mat}
-\loadcorefile{supp-ali}
-\loadcorefile{supp-num}
+\loadmarkfile{supp-ali}
+\loadmarkfile{supp-num}
%D Verbatim typesetting is implemented in a separate class of
%D modules. The pretty typesetting modules are loaded at run
@@ -104,16 +146,15 @@
\loadmarkfile{core-fil}
\loadmarkfile{core-con}
-%D We already need some synonyms (patterns). At runtime this
-%D file will be reloaded.
+%D We already need some synonyms (patterns).
-\loadcorefile{cont-fil}
+\loadmarkfile{cont-fil}
%D \CONTEXT\ does not implement its own table handling. We
%D just go for the best there is and load \TABLE. Just to be
%D sure we do it here, before we redefine \type{|}.
-\loadcorefile{thrd-tab} % based on: Michael Wichura / will be reimplemented
+\loadmarkfile{thrd-tab} % based on: Michael Wichura's TaBlE
%D Here comes the last support modules. They take care of
%D some language specific things.
@@ -124,7 +165,7 @@
%D load additional definition modules when needed.
\loadmarkfile{regi-ini}
-\loadcorefile{regi-syn}
+\loadmarkfile{regi-syn}
\loadmarkfile{enco-ini}
%loadmarkfile{filt-ini}
\loadmarkfile{hand-ini}
@@ -154,19 +195,19 @@
\loadmarkfile{lang-mis}
\loadmarkfile{lang-url}
-\loadcorefile{lang-ger}
-\loadcorefile{lang-ita}
-\loadcorefile{lang-sla}
-\loadcorefile{lang-alt}
-\loadcorefile{lang-ana}
-\loadcorefile{lang-art}
-\loadcorefile{lang-bal}
-\loadcorefile{lang-cel}
-\loadcorefile{lang-grk}
-\loadcorefile{lang-ind}
-\loadcorefile{lang-ura}
-\loadcorefile{lang-vn}
-\loadcorefile{lang-cyr}
+\loadmarkfile{lang-ger}
+\loadmarkfile{lang-ita}
+\loadmarkfile{lang-sla}
+\loadmarkfile{lang-alt}
+\loadmarkfile{lang-ana}
+\loadmarkfile{lang-art}
+\loadmarkfile{lang-bal}
+\loadmarkfile{lang-cel}
+\loadmarkfile{lang-grk}
+\loadmarkfile{lang-ind}
+\loadmarkfile{lang-ura}
+\loadmarkfile{lang-vn}
+\loadmarkfile{lang-cyr}
\loadmarkfile{typo-ini}
@@ -278,6 +319,7 @@
\loadmarkfile{type-ini}
\loadmarkfile{type-set}
+\loadmarkfile{type-def}
%D Properties. Don't ask.
@@ -334,7 +376,7 @@
%D Language specific spacing.
-\loadcorefile{lang-spa}
+\loadmarkfile{lang-spa}
%D Bibliographies:
@@ -344,21 +386,21 @@
%D These macros are loaded last since they overload and|/|or
%D extend previously defined ones.
-\loadcorefile{xtag-ini}
-\loadcorefile{xtag-ext}
-\loadcorefile{xtag-exp}
-\loadcorefile{xtag-pre}
-\loadcorefile{xtag-xsd}
-\loadcorefile{xtag-rng}
+\loadmarkfile{xtag-ini}
+\loadmarkfile{xtag-ext}
+\loadmarkfile{xtag-exp}
+\loadmarkfile{xtag-pre}
+\loadmarkfile{xtag-xsd}
+\loadmarkfile{xtag-rng}
%D How about this:
-\loadcorefile{meta-xml}
+\loadmarkfile{meta-xml}
%D \TEX\ related logo's are always typeset in a special way.
%D Here they come:
-\loadcorefile{cont-log}
+\loadmarkfile{cont-log}
%D This one overloads af few things:
@@ -385,7 +427,12 @@
%D \item \type{cont-fil}: filename and module synonyms
%D \stopitemize
-% %D Except from english, no hyphenation patterns are loaded
-% %D yet. Users can specify their needs in the next module:
-%
-% \input cont-usr
+\setupcurrentlanguage[\defaultlanguagetag]
+
+\setupencoding[default=ec]
+
+\usetypescript[fallback][\defaultencoding]
+
+\setupbodyfont[rm,12pt]
+
+\errorstopmode \dump \endinput
diff --git a/Master/texmf-dist/tex/context/base/context.mkiv b/Master/texmf-dist/tex/context/base/context.mkiv
index 33fa3a901ac..8f3586dea98 100644
--- a/Master/texmf-dist/tex/context/base/context.mkiv
+++ b/Master/texmf-dist/tex/context/base/context.mkiv
@@ -11,36 +11,76 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-% syst-cat -> catc-ini + vectors
-% spec-* -> special backends for luatex
+\catcode`\{=1 \catcode`\}=2 \catcode`\#=6
+
+%D From the next string (which is set by the script that assembles the
+%D distribution) later on we will calculate a number that can be used
+%D by use modules to identify the feature level. Starting with version
+%D 2004.8.30 the low level interface is english. Watch out and adapt
+%D your styles an modules.
+
+\edef\contextformat {\jobname}
+\edef\contextversion{2011.05.18 18:04}
+
+%D For those who want to use this:
+
+\let\fmtname \contextformat
+\let\fmtversion\contextversion
+
+%D Loading:
+
+\edef\mksuffix {mkiv}
+\edef\contextmark{MKIV}
+
+\ifx\normalinput\undefined \let\normalinput\input \fi
+
+\def\loadcorefile#1{\normalinput#1\relax}
+\def\loadmarkfile#1{\normalinput#1.\mksuffix\relax}
+\def\loadmkiifile#1{}
+\def\loadmkivfile#1{\normalinput#1.mkiv\relax}
+\def\loadmkvifile#1{\normalinput#1.mkvi\relax}
%D First we load the system modules. These implement a lot of
-%D manipulation macros. The first one loads \PLAIN\ \TEX, as
-%D minimal as possible.
+%D manipulation macros. We start with setting up some basic \TEX\
+%D machinery.
+
+\loadmarkfile{syst-ini}
+
+%D Some checking (more primitives are now defined):
+
+\ifdefined\defaultinterface \else \def\defaultinterface {english} \fi
+%ifdefined\messageinterface \else \let\messageinterface \defaultinterface \fi
+\ifdefined\defaultlanguagetag \else \def\defaultlanguagetag{en} \fi
-\loadcorefile{syst-ini}
+%D We just quit if new functionality is expected.
\ifnum\luatexversion<60 % also change message
\writestatus{!!!!}{Your luatex binary is too old, you need at least version 0.60!}
\expandafter\end
\fi
-\newtoks\contextversiontoks \contextversiontoks\expandafter{\contextversion} % at the lua end
+%D There is only this way to pass the version info
+%D to \LUA\ (currently).
-\loadcorefile{norm-ctx}
-\loadcorefile{syst-pln}
+\newtoks\contextversiontoks \contextversiontoks\expandafter{\contextversion}
-\newif\ifCONTEXT \CONTEXTtrue % will disappear
+%D Now the more fundamnetal code gets defined.
+
+\loadmarkfile{norm-ctx}
+\loadmarkfile{syst-pln}
+\loadmarkfile{syst-mes}
\loadmarkfile{luat-cod}
\loadmarkfile{luat-bas}
\loadmarkfile{luat-lib}
\loadmarkfile{catc-ini}
-\loadcorefile{catc-act}
-\loadcorefile{catc-def}
-\loadcorefile{catc-ctx}
-\loadcorefile{catc-sym}
+\loadmarkfile{catc-act}
+\loadmarkfile{catc-def}
+\loadmarkfile{catc-ctx}
+\loadmarkfile{catc-sym}
+
+\loadmarkfile{cldf-ini}
% From here on we have \unexpanded being \normalprotected, as we
% already had \unexpanded long before etex came around.
@@ -48,10 +88,8 @@
\loadmarkfile{syst-aux}
\loadmarkfile{syst-lua}
\loadmarkfile{syst-con}
-\loadcorefile{syst-ltx}
\loadmarkfile{syst-fnt}
-\loadmarkfile{syst-str}
\loadmarkfile{syst-rtp}
\loadmarkfile{supp-fil}
@@ -62,48 +100,52 @@
\loadmarkfile{char-act}
\loadmarkfile{mult-ini}
-\loadcorefile{mult-fst}
-\loadcorefile{mult-sys}
-\loadcorefile{mult-def}
+%loadmarkfile{mult-fst} % obsolete
+\loadmarkfile{mult-sys}
+\loadmarkfile{mult-def}
\loadmarkfile{mult-chk}
-\loadmarkfile{mult-cld}
+\loadmarkfile{mult-aux}
+
+\loadmarkfile{cldf-int} % interface
\loadmarkfile{luat-ini}
\loadmarkfile{toks-ini}
+\loadmarkfile{attr-ini}
+
+\loadmarkfile{core-var}
+\loadmarkfile{core-env}
+
+\loadmarkfile{layo-ini}
+
\loadmarkfile{node-ini}
\loadmarkfile{node-fin}
\loadmarkfile{node-mig}
\loadmarkfile{node-par}
%loadmarkfile{node-pag}
-\loadmarkfile{core-var}
-
\loadmarkfile{back-ini}
-\loadmarkfile{lpdf-ini} % some day back-ini will load this
-\loadmarkfile{lpdf-pdx} % might be merged into lpdf-ini
-\loadmarkfile{back-pdf} % some day back-ini will load this
-
-\loadmarkfile{attr-ini}
-\loadmarkfile{core-env}
+\loadmarkfile{attr-col}
+\loadmarkfile{attr-lay}
+\loadmarkfile{attr-neg}
+\loadmarkfile{attr-eff}
\loadmarkfile{trac-tex}
-\loadmarkfile{trac-lmx}
\loadmarkfile{trac-deb}
-\loadmarkfile{blob-ini} % not to be used, we only use a helper
+%loadmarkfile{blob-ini} % not to be used, we only use a helper
-\loadcorefile{supp-box}
+\loadmarkfile{supp-box}
-\loadcorefile{supp-vis}
-\loadcorefile{supp-fun}
+\loadmarkfile{supp-vis}
+\loadmarkfile{supp-fun}
\loadmarkfile{supp-ran}
\loadmarkfile{supp-mat}
-\loadcorefile{supp-ali}
-\loadcorefile{supp-num}
+\loadmarkfile{supp-ali}
+\loadmarkfile{supp-num}
\loadmarkfile{typo-ini}
@@ -111,16 +153,14 @@
\loadmarkfile{core-fil}
\loadmarkfile{core-con}
-\loadcorefile{cont-fil}
+\loadmarkfile{cont-fil}
\loadmarkfile{regi-ini}
-\loadcorefile{regi-syn}
\loadmarkfile{enco-ini}
\loadmarkfile{hand-ini}
\loadmarkfile{lang-ini}
\loadmarkfile{lang-lab}
-\loadmarkfile{lang-wrd}
\loadmarkfile{unic-ini}
@@ -131,51 +171,41 @@
\loadmarkfile{colo-ini}
\loadmarkfile{colo-ext}
+\loadmarkfile{node-bck} % overloads anch-pgr (experimental and undocumented)
+
\loadmarkfile{trac-vis}
\loadmarkfile{lang-mis}
\loadmarkfile{lang-url}
-
-\loadcorefile{lang-ger}
-\loadcorefile{lang-ita}
-\loadcorefile{lang-sla}
-\loadcorefile{lang-alt}
-\loadcorefile{lang-ana}
-\loadcorefile{lang-art}
-\loadcorefile{lang-bal}
-\loadcorefile{lang-cel}
-\loadcorefile{lang-grk}
-\loadcorefile{lang-ind}
-\loadcorefile{lang-ura}
-\loadcorefile{lang-vn}
-\loadcorefile{lang-cyr}
-
-\loadmarkfile{lang-ara}
-\loadmarkfile{lang-cjk}
+\loadmarkfile{lang-def}
+\loadmarkfile{lang-wrd} % can be optional
\loadmarkfile{symb-ini}
\loadmarkfile{sort-ini}
+\loadmkvifile{pack-mis}
\loadmarkfile{pack-rul}
\loadmarkfile{lxml-ini}
\loadmarkfile{lxml-sor}
\loadmarkfile{strc-ini}
+\loadmarkfile{strc-tag}
\loadmarkfile{strc-doc}
+\loadmarkfile{strc-num}
\loadmarkfile{strc-mar}
\loadmarkfile{strc-prc}
\loadmarkfile{strc-sbe}
\loadmarkfile{strc-lst}
\loadmarkfile{strc-sec}
-\loadmarkfile{strc-num}
+\loadmarkfile{strc-pag} % hm, depends on core-num
\loadmarkfile{strc-ren}
\loadmarkfile{strc-xml}
-\loadmarkfile{strc-pag} % hm, depends on core-num
\loadmarkfile{strc-def} % might happen later
\loadmarkfile{strc-ref}
\loadmarkfile{strc-reg}
+\loadmarkfile{strc-lev} % experiment
\loadmarkfile{spac-hor}
\loadmarkfile{spac-ver}
@@ -188,7 +218,9 @@
\loadmarkfile{anch-pos}
-\loadmarkfile{scrn-nav}
+\loadmkvifile{scrn-ini}
+\loadmkvifile{scrn-ref}
+
\loadmarkfile{pack-obj}
\loadmarkfile{strc-itm}
@@ -212,31 +244,46 @@
\loadmarkfile{page-mul}
\loadmarkfile{page-set}
\loadmarkfile{pack-lyr}
+\loadmarkfile{pack-pos}
\loadmarkfile{page-mak}
\loadmarkfile{page-lin}
\loadmarkfile{page-par}
-\loadmarkfile{page-mar}
+%loadmarkfile{page-mar} % also commented code in anch-pgr.mkiv
+\loadmarkfile{typo-mar}
\loadmarkfile{core-job} % why so late?
\loadmarkfile{buff-ini}
\loadmarkfile{buff-ver}
+\loadmarkfile{buff-par}
+
+\loadmarkfile{buff-imp-tex} % optional as also runtime if not loaded
+\loadmarkfile{buff-imp-mp} % optional as also runtime if not loaded
+\loadmarkfile{buff-imp-lua} % optional as also runtime if not loaded
+\loadmarkfile{buff-imp-xml} % optional as also runtime if not loaded
+
+\loadmarkfile{buff-imp-parsed-xml} % optional
+%loadmarkfile{buff-imp-parsed-lua} % optional
\loadmarkfile{strc-blk}
\loadmarkfile{page-imp}
+\loadmarkfile{page-sel} % optional
+\loadmarkfile{page-com} % optional
+
+\loadmkvifile{scrn-pag}
+\loadmkvifile{scrn-wid}
+\loadmkvifile{scrn-but}
+\loadmkvifile{scrn-bar}
-\loadmarkfile{scrn-int}
-\loadmarkfile{scrn-men}
-\loadmarkfile{scrn-but}
-\loadmarkfile{scrn-bar}
\loadmarkfile{strc-bkm} % bookmarks
\loadmarkfile{tabl-com}
\loadmarkfile{tabl-pln}
-\loadcorefile{thrd-tab}
-\loadmarkfile{tabl-tab}
+
+\loadmarkfile{tabl-tab} % thrd-tab stripped and merged
+
\loadmarkfile{tabl-tbl}
\loadmarkfile{tabl-ntb}
\loadmarkfile{tabl-nte}
@@ -245,8 +292,8 @@
\loadmarkfile{java-ini}
-\loadmarkfile{scrn-fld}
-\loadmarkfile{scrn-hlp}
+\loadmkvifile{scrn-fld}
+\loadmkvifile{scrn-hlp}
\loadmarkfile{char-enc}
\loadmarkfile{font-ini}
@@ -256,9 +303,12 @@
\loadmarkfile{font-col}
\loadmarkfile{font-gds}
+\loadmarkfile{blob-ini} % not to be used, we only use a helper
+
+\loadmarkfile{typo-cln}
\loadmarkfile{typo-spa}
\loadmarkfile{typo-krn}
-\loadmarkfile{typo-mir}
+\loadmarkfile{typo-dir}
\loadmarkfile{typo-brk}
\loadmarkfile{typo-cap}
\loadmarkfile{typo-dig}
@@ -266,22 +316,18 @@
\loadmarkfile{type-ini}
\loadmarkfile{type-set}
+\loadmarkfile{type-def}
+\loadmarkfile{type-lua}
\loadmarkfile{scrp-ini}
-\loadmarkfile{prop-ini}
-\loadmarkfile{prop-lay}
-\loadmarkfile{prop-mis}
+\loadmarkfile{prop-ini} % only for downward compatibility
\loadmarkfile{mlib-ctx}
-\loadmarkfile{mlib-pdf}
-\loadmarkfile{mlib-pps}
\loadmarkfile{meta-ini}
\loadmarkfile{meta-tex}
-\loadmarkfile{meta-pdf}
\loadmarkfile{meta-fun}
-
\loadmarkfile{meta-pag}
\loadmarkfile{page-flw}
@@ -314,6 +360,7 @@
\loadmarkfile{core-fnt}
\loadmarkfile{node-rul}
+\loadmarkfile{node-spl}
\loadmarkfile{strc-not}
\loadmarkfile{strc-lnt}
@@ -323,27 +370,29 @@
\loadmarkfile{grph-trf}
\loadmarkfile{grph-inc}
\loadmarkfile{grph-fig}
+\loadmarkfile{grph-raw}
\loadmarkfile{pack-box}
\loadmarkfile{pack-bar}
\loadmarkfile{page-app}
\loadmarkfile{meta-fig}
-\loadmarkfile{node-bck} % overloads anch-pgr (experimental and undocumented)
-
-\loadcorefile{lang-spa}
+\loadmarkfile{lang-spa} % will become obsolete
\loadmarkfile{bibl-bib}
\loadmarkfile{bibl-tra}
-\loadmarkfile{x-xtag} % at some point this will not be preloaded
+%loadmarkfile{x-xtag} % no longer preloaded
-\loadcorefile{meta-xml}
+\loadmarkfile{meta-xml}
-\loadcorefile{cont-log}
+\loadmarkfile{cont-log}
\loadmarkfile{task-ini}
+\loadmarkfile{cldf-ver} % verbatim, this can come late
+\loadmarkfile{cldf-com} % commands, this can come late
+
\loadmarkfile{core-ctx}
\loadmarkfile{core-ini}
@@ -353,28 +402,28 @@
%usemodule[x][res-08] % rlx runtime conversion
%usemodule[x][res-12] % rli external indentification
-\unprotect
+% now we hook in backend code (needs checking)
-\setupcurrentlanguage[\s!en]
+\loadmarkfile{back-pdf} % actually, this one should load the next three
+\loadmarkfile{mlib-pdf}
+\loadmarkfile{mlib-pps}
+\loadmarkfile{grph-epd}
+\loadmarkfile{meta-pdf}
+
+\loadmarkfile{back-exp}
+
+\setupcurrentlanguage[\defaultlanguagetag]
\prependtoks
- \ctxlua{statistics.starttiming(ctx)}%
+ \ctxlua{statistics.starttiming(statistics)}%
\to \everyjob
\appendtoks
- \ctxlua{statistics.stoptiming(ctx)}%
+ \ctxlua{statistics.stoptiming(statistics)}%
\to \everyjob
\appendtoks
- \writestatus\m!lua{used config path - \ctxlua{tex.print(caches.configpath())}}%
- \writestatus\m!lua{used cache path - \ctxlua{tex.print(caches.path)}}%
-\to \everydump
-
-\appendtoks
- \ctxlua {
- statistics.report_storage("log")
- statistics.save_fmt_status("\jobname","\contextversion","context.tex")
- }%
+ \ctxlua{statistics.savefmtstatus("\jobname","\contextversion","context.mkiv")}% can become automatic
\to \everydump
-\protect \errorstopmode \dump \endinput
+\errorstopmode \dump \endinput
diff --git a/Master/texmf-dist/tex/context/base/context.rme b/Master/texmf-dist/tex/context/base/context.rme
index 1b1e4890258..1ce6b25c0da 100644
--- a/Master/texmf-dist/tex/context/base/context.rme
+++ b/Master/texmf-dist/tex/context/base/context.rme
@@ -1,85 +1,79 @@
Some Basic information
----------------------
-There are currently three interfaces available:
+The first public versions of ConTeXt date from around 1996. There
+are currently two versions of ConTeXt:
- cont-en the english version
- cont-de the german version
- cont-nl the dutch version
- cont-cz the czech version
- cont-ro the romanian version
- cont-it the italian version
+ MkII: to be used with pdfTeX and XeTeX
+ MkIV: to be used with LuaTeX
-One should compile one of these (or all) into a fmt file.
-When one uses the main file,
+In 2008 at the second ConTeXt conference the decision was made to
+freeze MkII. This means that only bugs are fixed and apart from an
+occasional addition no active development takes place. This is no
+real problem as the engines don't change much either.
- context the undefined version
+Early 2011 the code base between MkII and MkIV got split completely
+and there is no shared code any longer, apart from some styles and
+modules.
-TeX ask for an interface language as well as a message
-language. Here one has to specify the full name (english,
-german, dutch, etc.) or use the default (enter). The \
-savest way to update the TeX and MetaPost format files
-is to use TeXExec:
+The main files context.mkii and context.mkiv are normally not used
+directly but instead we use the interface specific formats:
-texexec --make --alone en nl metafun
+ cont-cs czech
+ cont-de german
+ cont-en english us
+ cont-fr french
+ cont-gb english uk
+ cont-it italian
+ cont-nl dutch
+ cont-pe persian
+ cont-ro romanian
-In the TeXExec manual you can read how to generate a format
-with specific fonts and patterns.
+A MkII format is made with:
-By default only the english hyphenation patterns are loaded,
-unless more are enabled in:
+ texexec --make en nl metafun
- cont-usr the typesetting language specifications
+A MkIV format is made with:
-Furthermore, users can preset commands etc in the file
+ context --make en nl
- cont-sys a system file loaded at runtime
+As MetaPost is part of LuaTeX there is no need for a special MetaFun
+format. Also, when you update ConTeXt, a new format will be generated
+automatically.
-For questions and remarks on ConTeXt, one can subscribe to
-the list:
+You can preset commands etc in the file:
- ntg-context@ntg.nl
+ cont-sys.mkii a system file loaded at runtime
+ cont-sys.mkiv a system file loaded at runtime
-by sending the message
-
- subscribe ntg-context
+In the case of MkII, there is a fallback on cont-sys.tex (backward
+compatibility). If no file is found the file cont-sys.rme is loaded
+(only for MkII). For MkIV this file is normally not needed.
-to the list server:
+For questions and remarks on ConTeXt, one can subscribe to the list:
- majordomo@ntg.nl
+ ntg-context@ntg.nl
-One can find more info at:
-
- www.pragma-ade.com
+by sending the message
-or at the mirror sites mentioned there.
+ subscribe ntg-context
-Don't hesitate to ask questions. ConTeXt can do a lot, and
-the manuals are always a bit behind and incomplete. Also take
-a look at the files
+to the list server:
- mreadme.pdf
- minstall.pdf
- mtexexec.pdf
- mtexutil.pdf
+ majordomo@ntg.nl
-The teTeX, fpTeX, and 4TeX distributions demonstrate how
-ConTeXt can be integrated in a TeX directory structure.
+A good place to get information is the ConTeXt wiki:
--------------------------
+ contextgarden.net
-functionality removed from mkiv:
+One can also find more info at:
-page-log : layers can do teh same and are more flexible
-core-dat : just use lua for database purposes
-core-swd : this was a temporary solution
+ www.pragma-ade.com
-functionality changed in mkii and mkiv:
+or at the mirror sites mentioned there.
-xtag-map : no longer preloaded
-xtag-stk : no longer preloaded
-xtag-prs : no longer preloaded
+Don't hesitate to ask questions. ConTeXt can do a lot, but the manuals
+always lag behind and can be incomplete.
-------------------------
-
Hans Hagen, pragma@wxs.nl
diff --git a/Master/texmf-dist/tex/context/base/context.tex b/Master/texmf-dist/tex/context/base/context.tex
deleted file mode 100644
index 47489658ea6..00000000000
--- a/Master/texmf-dist/tex/context/base/context.tex
+++ /dev/null
@@ -1,225 +0,0 @@
-%D \module
-%D [ file=context,
-%D version=1995.10.10,
-%D title=\CONTEXT,
-%D subtitle=\CONTEXT\ Format Generation,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\catcode`\{=1 \catcode`\}=2 \catcode`\#=6
-
-%D From the next string (which is set by the script that assembles the
-%D distribution) later on we will calculate a number that can be used
-%D by use modules to identify the feature level. Starting with version
-%D 2004.8.30 the low level interface is english. Watch out and adapt
-%D your styles an modules.
-
-\edef\contextformat {\jobname}
-\edef\contextversion{2010.05.24 13:05}
-
-%D For those who want to use this:
-
-\let\fmtname \contextformat
-\let\fmtversion\contextversion
-
-\let\showcontextbanner\relax
-
-%D Here we will test for what branch of source files we will take. The
-%D file suffix depends on the maintream engine: either lua enhanced,
-%D or traditional:
-%D
-%D \starttyping
-%D mki : low level dutch
-%D mkii : low level english
-%D mkiv : lua enhanced
-%D \stoptyping
-%D
-%D There is no \type {mkiii} unless you want to tag the transition
-%D version that way (going completely etex, code cleanup and such).
-
-\ifx\normalinput\undefined \let\normalinput\input \fi
-
-%D We have two versions, one for \PDFTEX\ and \XETEX, and one for
-%D \LUATEX.
-
-\chardef\contextmarkmode = \ifx\directlua\undefined 2 \else 4 \fi
-
-\def\loadcorefile#1{\normalinput#1\relax}
-\def\loadmarkfile#1{\normalinput#1.\mksuffix\relax}
-
-\ifnum\contextmarkmode=4
- \def\loadmarkiifile#1{} \let\loadmarkivfile\loadcorefile \edef\mksuffix {mkiv} \edef\contextmark{MKIV}
-\else
- \def\loadmarkivfile#1{} \let\loadmarkiifile\loadcorefile \edef\mksuffix {mkii} \edef\contextmark{MKII}
-\fi
-
-\let\loadmkiifile\loadmarkiifile
-\let\loadmkivfile\loadmarkivfile
-\let\loadmkfile \loadmarkfile
-
-%D Welcome to the main module. When this module is ran through
-%D \type{initex} or \type {tex -i} or \type {whatevertex} using
-%D \type{whatever switch}, the \CONTEXT\ format file is
-%D generated. During this process the user is asked for an
-%D interface language. Supplying \type{dutch} will generate a
-%D dutch version of \CONTEXT, supplying \type {english} will of
-%D course end op in a english version.
-%D
-%D Another option is to use \TEXEXEC\ (for \MKII):
-%D
-%D \starttyping
-%D texexec --make [--alone] [--engine] [--all]
-%D texexec --make [--alone] [--engine] en nl ... metafun mptopdf
-%D \stoptyping
-%D
-%D More information can be found in the \TEXEXEC\ manual.
-%D
-%D For \MKIV\ you have to do:
-%D
-%D \starttyping
-%D luatools --generate
-%D context --make en nl ...
-%D \stoptyping
-
-%D When you write modules (or extensions) you should avoid
-%D conflicts with existing macro names and mechanisms. If you are
-%D coming from another macro package, don't assume that macros
-%D with the same name are doing the same! \CONTEXT\ was written
-%D from scratch and therefore similarities are often a coincidence
-%D (to some extent one always ends up with the same names for
-%D similar concepts). The underlying models for elementary subsystems
-%D that deal with encodings, languages and fonts probably differ.
-%D
-%D Time has learned that users coming from \LATEX\ should not fall
-%D into thinking that macros like \type {\protect} represent the
-%D same functionality in both systems; actually, due to the way
-%D \CONTEXT\ is set up, some of those macros do complete different
-%D things. Macro packages evolve independent of each other, which
-%D means that code written for one system will not work in another
-%D system, unless it's real generic code.
-%D
-%D An API will become available soon (keep an eye on the ConTeXt
-%D Wiki www.contextgarden.org) and or listen in to the context
-%D mailing list (ntg-context@ntg.nl). Much additional information
-%D can be found at the PRAGMA website (www.pragma-ade.com).
-
-%D We now go either the \MKII\ or \MKIV\ route:
-
-\loadmarkfile{context}
-
-%D Let's quit this file when doing a \type {cont-..} generation.
-
-\doifparentfileelse{context}{\donothing}{\endinput}
-
-%D Unless we're generating a \type {cont-..} format, we also
-%D do the following.
-
-%D Except from english, no hyphenation patterns are loaded
-%D yet. Users can specify their needs in the next module:
-
-\loaduserspecifications
-
-%D Next we default to the same language as the interface.
-
-\unprotect
-
-\installlanguage [\s!us] [\c!state=\v!start]
-
-\startinterface english
- \installlanguage [\s!gb] [\c!state=\v!start]
-\stopinterface
-
-\appendtoks \language [\s!us] \to \everyjob
-\appendtoks \mainlanguage [\s!us] \to \everyjob
-
-\startinterface german
-
- \installlanguage [\s!de] [\c!state=\v!start]
-
- \appendtoks \language [\s!de] \to \everyjob
- \appendtoks \mainlanguage [\s!de] \to \everyjob
-
-\stopinterface
-
-\startinterface dutch
-
- \installlanguage [\s!nl] [\c!state=\v!start]
-
- \appendtoks \language [\s!nl] \to \everyjob
- \appendtoks \mainlanguage [\s!nl] \to \everyjob
-
-\stopinterface
-
-\startinterface czech
-
- \installlanguage [\s!cs] [\c!state=\v!start]
-
- \appendtoks \language [\s!cs] \to \everyjob
- \appendtoks \mainlanguage [\s!cs] \to \everyjob
-
-\stopinterface
-
-\startinterface italian
-
- \installlanguage [\s!it] [\c!state=\v!start]
-
- \appendtoks \language [\s!it] \to \everyjob
- \appendtoks \mainlanguage [\s!it] \to \everyjob
-
-\stopinterface
-
-\startinterface romanian
-
- \installlanguage [\s!ro] [\c!state=\v!start]
-
- \appendtoks \language [\s!ro] \to \everyjob
- \appendtoks \mainlanguage [\s!ro] \to \everyjob
-
-\stopinterface
-
-\startinterface french
-
- \installlanguage [\s!fr] [\c!state=\v!start]
-
- \appendtoks \language [\s!fr] \to \everyjob
- \appendtoks \mainlanguage [\s!fr] \to \everyjob
-
-\stopinterface
-
-\startinterface persian
-
- \installlanguage [\s!pe] [\c!state=\v!start]
-
- \appendtoks \language [\s!pe] \to \everyjob
- \appendtoks \mainlanguage [\s!pe] \to \everyjob
-
-\stopinterface
-
-\protect
-
-%D Finally we (pre)load some fonts.
-
-\setupencoding[default=ec]
-
-\usetypescript[fallback][\defaultencoding]
-
-\setupbodyfont[rm,12pt]
-
-%D The next hook can be used to generate a local (extended)
-%D format. This file is only searched for at the current
-%D path.
-
-% \readlocfile{cont-def.tex}
-% {\writestatus{loading}{adding extensions from cont-def}}
-% {}
-
-%D Now dumping the format is all that's left to be done.
-
-\errorstopmode \dump
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/context.todo b/Master/texmf-dist/tex/context/base/context.todo
new file mode 100644
index 00000000000..27d914a7b6e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/context.todo
@@ -0,0 +1,6 @@
+% marginrules
+
+% consistently use label/name/tag
+% consistently use type/kind
+
+% option vs options
diff --git a/Master/texmf-dist/tex/context/base/core-con.lua b/Master/texmf-dist/tex/context/base/core-con.lua
index dca1c7d10cc..e8ef52d4bf8 100644
--- a/Master/texmf-dist/tex/context/base/core-con.lua
+++ b/Master/texmf-dist/tex/context/base/core-con.lua
@@ -17,25 +17,34 @@ slower but look nicer this way.</p>
local utf = unicode.utf8
local floor, date, time, concat = math.floor, os.date, os.time, table.concat
-local lower, format, rep = string.lower, string.format, string.rep
-local texsprint, utfchar = tex.sprint, utf.char
+local lower, format, rep, match = string.lower, string.format, string.rep, string.match
+local utfchar, utfbyte = utf.char, utf.byte
local tonumber, tostring = tonumber, tostring
-local ctxcatcodes = tex.ctxcatcodes
+local settings_to_array = utilities.parsers.settings_to_array
+local allocate = utilities.storage.allocate
-converters = converters or { }
-languages = languages or { }
+local context = context
---~ ['arabic-digits'] = {
---~ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664,
---~ 0x0665, 0x0666, 0x0667, 0x0668, 0x0669
---~ },
---~ ['persian-digits'] = {
---~ 0x06F0, 0x06F1, 0x06F2, 0x06F3, 0x06F4,
---~ 0x06F5, 0x06F6, 0x06F7, 0x06F8, 0x06F9
---~ },
+local variables = interfaces.variables
-languages.counters = {
+converters = converters or { }
+local converters = converters
+
+languages = languages or { }
+local languages = languages
+
+local function number(n)
+ return tonumber(n)
+end
+
+converters.number = number
+
+function commands.number(n) context(n) end
+
+-- to be reconsidered ... languages namespace here, might become local plus a register command
+
+local counters = allocate {
['**'] = {
0x0061, 0x0062, 0x0063, 0x0064, 0x0065,
0x0066, 0x0067, 0x0068, 0x0069, 0x006A,
@@ -111,132 +120,173 @@ languages.counters = {
},
}
-local counters = languages.counters
+languages.counters = counters
-counters['ar'] = counters['arabic']
-counters['gr'] = counters['greek']
-counters['g'] = counters['greek']
-counters['sl'] = counters['slovenian']
-counters['kr'] = counters['korean']
-counters['kr-p'] = counters['korean-parent']
-counters['kr-c'] = counters['korean-circle']
+counters['ar'] = counters['arabic']
+counters['gr'] = counters['greek']
+counters['g'] = counters['greek']
+counters['sl'] = counters['slovenian']
+counters['kr'] = counters['korean']
+counters['kr-p'] = counters['korean-parent']
+counters['kr-c'] = counters['korean-circle']
local fallback = utf.byte('0')
local function chr(n,m)
- if n > 0 and n < 27 then
- texsprint(utfchar(n+m))
- end
+ return (n > 0 and n < 27 and utfchar(n+m)) or ""
end
-local function chrs(n,m)
+
+local function chrs(n,m,t)
+ if not t then
+ t = { }
+ end
if n > 26 then
- chrs(floor((n-1)/26),m)
+ chrs(floor((n-1)/26),m,t)
n = (n-1)%26 + 1
end
- texsprint(utfchar(n+m))
+ if n ~= 0 then
+ t[#t+1] = utfchar(n+m)
+ end
+ if n <= 26 then
+ return concat(t)
+ end
end
-local function maxchrs(n,m,cmd)
+
+local function maxchrs(n,m,cmd,t)
+ if not t then
+ t = { }
+ end
if n > m then
maxchrs(floor((n-1)/m),m,cmd)
n = (n-1)%m + 1
end
- texsprint(ctxcatcodes, format("%s{%s}",cmd,n))
+ t[#t+1] = format("%s{%s}",cmd,n)
+ if n <= m then
+ return concat(t)
+ end
end
converters.chr = chr
converters.chrs = chrs
converters.maxchrs = maxchrs
---~ more efficient but needs testing
---~
---~ local escapes = utffilters.private.escapes
---~
---~ local function do_alphabetic(n,mapping,chr)
---~ local max = #mapping
---~ if n > max then
---~ do_alphabetic(floor((n-1)/max),max,chr)
---~ n = (n-1)%max+1
---~ end
---~ n = chr(n,mapping)
---~ texsprint(ctxcatcodes,escapes[n] or utfchar(n))
---~ end
-
---~ local lccodes, uccodes = characters.lccode, characters.uccode
-
---~ local function do_alphabetic(n,mapping,chr)
---~ local max = #mapping
---~ if n > max then
---~ do_alphabetic(floor((n-1)/max),mapping,chr)
---~ n = (n-1)%max+1
---~ end
---~ characters.flush(chr(n,mapping))
---~ end
---~
---~ local function lowercased(n,mapping) return characters.lccode(mapping[n] or fallback) end
---~ local function uppercased(n,mapping) return characters.uccode(mapping[n] or fallback) end
---~
---~ function converters.alphabetic(n,code)
---~ do_alphabetic(n,counters[code] or counters['**'],lowercased) -- lccode catches wrong tables
---~ end
---~
---~ function converters.Alphabetic(n,code)
---~ do_alphabetic(n,counters[code] or counters['**'],uppercased)
---~ end
+local lowercharacter = characters.lcchars
+local uppercharacter = characters.ucchars
---
-
-local function do_alphabetic(n,mapping,mapper)
- local chr = mapper(mapping[n] or fallback)
+local function do_alphabetic(n,mapping,mapper,t)
+ if not t then
+ t = { }
+ end
+ local chr = mapping[n] or fallback
+ if mapper then
+ chr = mapper[chr]
+ end
local max = #mapping
if n > max then
- do_alphabetic(floor((n-1)/max),mapping,mapper)
- n = (n-1)%max+1
+ do_alphabetic(floor((n-1)/max),mapping,mapper,t)
+ n = (n-1) % max + 1
+ end
+ t[#t+1] = chr
+ if n <= max then
+ return concat(t)
end
- characters.flush(chr)
end
-function converters.alphabetic(n,code)
- do_alphabetic(n,counters[code] or counters['**'],characters.lccode)
+local function alphabetic(n,code)
+ return do_alphabetic(n,counters[code] or counters['**'],lowercharacter)
end
-function converters.Alphabetic(n,code)
- do_alphabetic(n,counters[code] or counters['**'],characters.uccode)
+local function Alphabetic(n,code)
+ return do_alphabetic(n,counters[code] or counters['**'],uppercharacter)
end
---
+local function character (n) return chr (n,96) end
+local function Character (n) return chr (n,64) end
+local function characters(n) return chrs(n,96) end
+local function Characters(n) return chrs(n,64) end
+
+converters.alphabetic = alphabetic
+converters.Alphabetic = Alphabetic
+converters.character = character
+converters.Character = Character
+converters.characters = characters
+converters.Characters = Characters
+
+function commands.alphabetic(n,c) context(alphabetic(n,c)) end
+function commands.Alphabetic(n,c) context(Alphabetic(n,c)) end
+function commands.character (n) context(character (n)) end
+function commands.Character (n) context(Character (n)) end
+function commands.characters(n) context(characters(n)) end
+function commands.Characters(n) context(Characters(n)) end
-function converters.character (n) chr (n,96) end
-function converters.Character (n) chr (n,64) end
-function converters.characters(n) chrs(n,96) end
-function converters.Characters(n) chrs(n,64) end
+local days = {
+ [false] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+ [true] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+}
-function converters.weekday(day,month,year)
- texsprint(date("%w",time{year=year,month=month,day=day})+1)
+local function weekday(day,month,year)
+ return date("%w",time{year=year,month=month,day=day}) + 1
end
-function converters.isleapyear(year)
+local function isleapyear(year)
return (year % 400 == 0) or ((year % 100 ~= 0) and (year % 4 == 0))
end
-function converters.leapyear(year)
- if converters.isleapyear(year) then texsprint(1) else texsprint(0) end
+local function leapyear(year)
+ return isleapyear(year) and 1 or 0
end
-local days = {
- [false] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
- [true] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
-}
+local function nofdays(year,month)
+ return days[isleapyear(year)][month]
+end
+
+local function year () return date("%Y") end
+local function month () return date("%m") end
+local function hour () return date("%H") end
+local function minute() return date("%M") end
+local function second() return date("%S") end
-function converters.nofdays(year,month)
- texsprint(days[converters.isleapyear(year)][month])
+local function textime()
+ return tonumber(date("%H")) * 60 + tonumber(date("%M"))
end
-function converters.year () texsprint(date("%Y")) end
-function converters.month () texsprint(date("%m")) end
-function converters.hour () texsprint(date("%H")) end
-function converters.minute () texsprint(date("%M")) end
-function converters.second () texsprint(date("%S")) end
-function converters.textime() texsprint(tonumber(date("%H"))*60+tonumber(date("%M"))) end
+converters.weekday = weekday
+converters.isleapyear = isleapyear
+converters.leapyear = leapyear
+converters.nofdays = nofdays
+converters.year = year
+converters.month = month
+converters.hour = hour
+converters.minute = minute
+converters.second = second
+converters.textime = textime
+
+function commands.weekday(day,month,year)
+ context(weekday(day,month,year))
+end
+
+function commands.isleapyear(year)
+ context(isleapyear(year))
+end
+
+function commands.leapyear(year)
+ context(leapyear(year))
+end
+
+function commands.nofdays(year,month)
+ context(nofdays(year,month))
+end
+
+function commands.year () context(year ()) end
+function commands.month () context(month ()) end
+function commands.hour () context(hour ()) end
+function commands.minute () context(minute ()) end
+function commands.second () context(second ()) end
+function commands.textime() context(textime()) end
+
+function commands.doifleapyearelse(year)
+ commands.testcase(leapyear(year))
+end
local roman = {
{ [0] = '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' },
@@ -248,15 +298,20 @@ local function toroman(n)
if n >= 4000 then
return toroman(floor(n/1000)) .. " " .. toroman(n%1000)
else
- return rep("M",floor(n/1000)) .. roman[3][floor((n%1000)/100)] ..
- roman[2][floor((n%100)/10)] .. roman[1][floor((n% 10)/1)]
+ return rep("M",floor(n/1000)) .. roman[3][floor((n%1000)/100)] .. roman[2][floor((n%100)/10)] .. roman[1][floor((n% 10)/1)]
end
end
-function converters.romannumerals(n) return texsprint(lower(toroman(n))) end
-function converters.Romannumerals(n) return texsprint( toroman(n) ) end
+local Romannumerals = toroman
+
+local function romannumerals(n) return lower(toroman(n)) end
+
+converters.toroman = toroman
+converters.Romannumerals = toroman
+converters.romannumerals = romannumerals
-converters.toroman = toroman
+function commands.romannumerals(n) context(lower(toroman(n))) end
+function commands.Romannumerals(n) context( toroman(n)) end
--~ local small = {
--~ 0x0627, 0x066E, 0x062D, 0x062F, 0x0647, 0x0648, 0x0631
@@ -287,7 +342,7 @@ local large = {
{ "غ" },
}
-function converters.toabjad(n,what)
+local function toabjad(n,what)
if n <= 0 or n >= 2000 then
return tostring(n)
elseif what == 2 and n <= 7 then
@@ -304,8 +359,16 @@ function converters.toabjad(n,what)
end
end
-function converters.abjadnumerals (n) return texsprint(converters.toabjad(n,false)) end
-function converters.abjadnodotnumerals(n) return texsprint(converters.toabjad(n,true)) end
+converters.toabjad = toabjad
+
+local function abjadnumerals (n) return toabjad(n,false) end
+local function abjadnodotnumerals(n) return toabjad(n,true ) end
+
+converters.abjadnumerals = abjadnumerals
+converters.abjadnodotnumerals = abjadnodotnumerals
+
+function commands.abjadnumerals (n) context(toabjad(n,false)) end
+function commands.abjadnodotnumerals(n) context(toabjad(n,true )) end
local vector = {
normal = {
@@ -363,128 +426,73 @@ local vector = {
}
}
---~ function tochinese(n,name) -- normal, caps, all
---~ local result = { }
---~ local vector = vector[name] or vector.normal
---~ while true do
---~ if n == 0 then
---~ break
---~ elseif n >= 100000000 then
---~ local m = floor(n/100000000)
---~ if m > 1 then result[#result+1] = tochinese(m) end
---~ result[#result+1] = vector[100000000]
---~ n = n % 100000000
---~ elseif n >= 10000000 then
---~ result[#result+1] = tochinese(floor(n/10000))
---~ result[#result+1] = vector[10000]
---~ n = n % 10000
---~ elseif n >= 1000000 then
---~ result[#result+1] = tochinese(floor(n/10000))
---~ result[#result+1] = vector[10000]
---~ n = n % 10000
---~ elseif n >= 100000 then
---~ result[#result+1] = tochinese(floor(n/10000))
---~ result[#result+1] = vector[10000]
---~ n = n % 10000
---~ elseif n >= 10000 then
---~ local m = floor(n/10000)
---~ if m > 1 then result[#result+1] = vector[m] end
---~ result[#result+1] = vector[10000]
---~ n = n % 10000
---~ elseif n >= 1000 then
---~ local m = floor(n/1000)
---~ if m > 1 then result[#result+1] = vector[m] end
---~ result[#result+1] = vector[1000]
---~ n = n % 1000
---~ elseif n >= 100 then
---~ local m = floor(n/100)
---~ if m > 1 then result[#result+1] = vector[m] end
---~ result[#result+1] = vector[100]
---~ n = n % 100
---~ elseif n >= 10 then
---~ local m = floor(n/10)
---~ if vector[m*10] then
---~ result[#result+1] = vector[m*10]
---~ else
---~ result[#result+1] = vector[m]
---~ result[#result+1] = vector[10]
---~ end
---~ n = n % 10
---~ else
---~ result[#result+1] = vector[n]
---~ break
---~ end
---~ end
---~ return concat(result)
---~ end
-
-function tochinese(n,name) -- normal, caps, all
+local function tochinese(n,name) -- normal, caps, all
-- improved version by Li Yanrui
- local result = { }
+ local result, r = { }, 0
local vector = vector[name] or vector.normal
while true do
if n == 0 then
break
elseif n >= 100000000 then
local m = floor(n/100000000)
- result[#result+1] = tochinese(m,name)
- result[#result+1] = vector[100000000]
+ r = r + 1 ; result[r] = tochinese(m,name)
+ r = r + 1 ; result[r] = vector[100000000]
local z = n - m * 100000000
- if z > 0 and z < 10000000 then result[#result+1] = vector[0] end
+ if z > 0 and z < 10000000 then r = r + 1 ; result[r] = vector[0] end
n = n % 100000000
elseif n >= 10000000 then
local m = floor(n/10000)
- result[#result+1] = tochinese(m,name)
- result[#result+1] = vector[10000]
+ r = r + 1 ; result[r] = tochinese(m,name)
+ r = r + 1 ; result[r] = vector[10000]
local z = n - m * 10000
- if z > 0 and z < 1000 then result[#result+1] = vector[0] end
+ if z > 0 and z < 1000 then r = r + 1 ; result[r] = vector[0] end
n = n % 10000
elseif n >= 1000000 then
local m = floor(n/10000)
- result[#result+1] = tochinese(m,name)
- result[#result+1] = vector[10000]
+ r = r + 1 ; result[r] = tochinese(m,name)
+ r = r + 1 ; result[r] = vector[10000]
local z = n - m * 10000
- if z > 0 and z < 1000 then result[#result+1] = vector[0] end
+ if z > 0 and z < 1000 then r = r + 1 ; result[r] = vector[0] end
n = n % 10000
elseif n >= 100000 then
local m = floor(n/10000)
- result[#result+1] = tochinese(m,name)
- result[#result+1] = vector[10000]
+ r = r + 1 ; result[r] = tochinese(m,name)
+ r = r + 1 ; result[r] = vector[10000]
local z = n - m * 10000
- if z > 0 and z < 1000 then result[#result+1] = vector[0] end
+ if z > 0 and z < 1000 then r = r + 1 ; result[r] = vector[0] end
n = n % 10000
elseif n >= 10000 then
local m = floor(n/10000)
- result[#result+1] = vector[m]
- result[#result+1] = vector[10000]
+ r = r + 1 ; result[r] = vector[m]
+ r = r + 1 ; result[r] = vector[10000]
local z = n - m * 10000
- if z > 0 and z < 1000 then result[#result+1] = vector[0] end
+ if z > 0 and z < 1000 then r = r + 1 ; result[r] = vector[0] end
n = n % 10000
elseif n >= 1000 then
local m = floor(n/1000)
- result[#result+1] = vector[m]
- result[#result+1] = vector[1000]
+ r = r + 1 ; result[r] = vector[m]
+ r = r + 1 ; result[r] = vector[1000]
local z = n - m * 1000
- if z > 0 and z < 100 then result[#result+1] = vector[0] end
+ if z > 0 and z < 100 then r = r + 1 ; result[r] = vector[0] end
n = n % 1000
elseif n >= 100 then
local m = floor(n/100)
- result[#result+1] = vector[m]
- result[#result+1] = vector[100]
+ r = r + 1 ; result[r] = vector[m]
+ r = r + 1 ; result[r] = vector[100]
local z = n - m * 100
- if z > 0 and z < 10 then result[#result+1] = vector[0] end
+ if z > 0 and z < 10 then r = r + 1 ; result[r] = vector[0] end
n = n % 100
elseif n >= 10 then
local m = floor(n/10)
if m > 1 and vector[m*10] then
- result[#result+1] = vector[m*10]
+ r = r + 1 ; result[r] = vector[m*10]
else
- result[#result+1] = vector[m]
- result[#result+1] = vector[10]
+ r = r + 1 ; result[r] = vector[m]
+ r = r + 1 ; result[r] = vector[10]
end
n = n % 10
else
- result[#result+1] = vector[n]
+ r = r + 1 ; result[r] = vector[n]
break
end
end
@@ -494,112 +502,368 @@ function tochinese(n,name) -- normal, caps, all
return concat(result)
end
---~ local t = { 1,10,15,25,35,45,11,100,111,1111,10000,11111,100000,111111,1111111,11111111,111111111,100000000,1111111111,11111111111,111111111111,1111111111111 }
---~ for k=1,#t do
---~ local v = t[k]
---~ print(v,tochinese(v),tochinese(v,"all"),tochinese(v,"cap"))
---~ end
-
-function converters.chinesenumerals (n) return texsprint(tochinese(n,"normal")) end
-function converters.chinesecapnumerals(n) return texsprint(tochinese(n,"cap" )) end
-function converters.chineseallnumerals(n) return texsprint(tochinese(n,"all" )) end
-
---~ Well, since the one asking for this didn't test it the following code is not
---~ enabled.
---~
---~ -- This Lua version is based on a Javascript by Behdad Esfahbod which in turn
---~ -- is based on GPL'd code by Roozbeh Pournader of the The FarsiWeb Project
---~ -- Group: http://www.farsiweb.info/jalali/jalali.js.
---~ --
---~ -- We start tables at one, I kept it zero based in order to stay close to
---~ -- the original.
---~ --
---~ -- Conversion by Hans Hagen
---~
---~ local g_days_in_month = { [0]=31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
---~ local j_days_in_month = { [0]=31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29 }
---~
---~ local function div(a,b)
---~ return math.floor(a/b)
---~ end
---~
---~ local function remainder(a,b)
---~ return a - div(a,b)*b
---~ end
---~
---~ function gregorian_to_jalali(gy,gm,gd)
---~ local jy, jm, jd, g_day_no, j_day_no, j_np, i
---~ gy, gm, gd = gy - 1600, gm - 1, gd - 1
---~ g_day_no = 365*gy + div((gy+3),4) - div((gy+99),100) + div((gy+399),400)
---~ i = 0
---~ while i < gm do
---~ g_day_no = g_day_no + g_days_in_month[i]
---~ i = i + 1
---~ end
---~ if (gm>1 and ((gy%4==0 and gy%100~=0) or (gy%400==0))) then
---~ g_day_no = g_day_no + 1
---~ end
---~ g_day_no = g_day_no + gd
---~ j_day_no = g_day_no - 79
---~ j_np = div(j_day_no,12053)
---~ j_day_no = remainder(j_day_no,12053)
---~ jy = 979 + 33*j_np + 4*div(j_day_no,1461)
---~ j_day_no = remainder(j_day_no,1461)
---~ if j_day_no >= 366 then
---~ jy = jy + div((j_day_no-1),365)
---~ j_day_no = remainder((j_day_no-1),365)
---~ end
---~ i = 0
---~ while i < 11 and j_day_no >= j_days_in_month[i] do
---~ j_day_no = j_day_no - j_days_in_month[i]
---~ i = i + 1
---~ end
---~ jm = i + 1
---~ jd = j_day_no + 1
---~ return jy, jm, jd
---~ end
---~
---~ function jalali_to_gregorian(jy,jm,jd)
---~ local gy, gm, gd, g_day_no, j_day_no, leap, i
---~ jy, jm, jd = jy - 979, jm - 1, jd - 1
---~ j_day_no = 365*jy + div(jy,33)*8 + div((remainder(jy,33)+3),4)
---~ i = 0
---~ while i < jm do
---~ j_day_no = j_day_no + j_days_in_month[i]
---~ i = i + 1
---~ end
---~ j_day_no = j_day_no + jd
---~ g_day_no = j_day_no + 79
---~ gy = 1600 + 400*div(g_day_no,146097)
---~ g_day_no = remainder (g_day_no, 146097)
---~ leap = 1
---~ if g_day_no >= 36525 then
---~ g_day_no = g_day_no - 1
---~ gy = gy + 100*div(g_day_no,36524)
---~ g_day_no = remainder (g_day_no, 36524)
---~ if g_day_no >= 365 then
---~ g_day_no = g_day_no + 1
---~ else
---~ leap = 0
---~ end
---~ end
---~ gy = gy + 4*div(g_day_no,1461)
---~ g_day_no = remainder (g_day_no, 1461)
---~ if g_day_no >= 366 then
---~ leap = 0
---~ g_day_no = g_day_no - 1
---~ gy = gy + div(g_day_no, 365)
---~ g_day_no = remainder(g_day_no, 365)
---~ end
---~ i = 0
---~ while g_day_no >= g_days_in_month[i] + ((i == 1 and leap) or 0) do
---~ g_day_no = g_day_no - g_days_in_month[i] + ((i == 1 and leap) or 0)
---~ i = i + 1
---~ end
---~ gm = i + 1
---~ gd = g_day_no + 1
---~ return gy, gm, gd
---~ end
---~
---~ print(gregorian_to_jalali(2009,02,24))
---~ print(jalali_to_gregorian(1387,12,06))
+-- local t = { 1,10,15,25,35,45,11,100,111,1111,10000,11111,100000,111111,1111111,11111111,111111111,100000000,1111111111,11111111111,111111111111,1111111111111 }
+-- for k=1,#t do
+-- local v = t[k]
+-- print(v,tochinese(v),tochinese(v,"all"),tochinese(v,"cap"))
+-- end
+
+converters.tochinese = tochinese
+
+local function chinesenumerals (n) return tochinese(n,"normal") end
+local function chinesecapnumerals(n) return tochinese(n,"cap" ) end
+local function chineseallnumerals(n) return tochinese(n,"all" ) end
+
+converters.chinesenumerals = chinesenumerals
+converters.chinesecapnumerals = chinesecapnumerals
+converters.chineseallnumerals = 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
+
+converters.sequences = converters.sequences or { }
+
+storage.register("converters/sequences", converters.sequences, "converters.sequences")
+
+local sequences = converters.sequences
+
+function converters.define(name,set)
+ sequences[name] = settings_to_array(set)
+end
+
+commands.defineconversion = converters.define
+
+local function convert(method,n) -- todo: language
+ local converter = converters[method]
+ if converter then
+ return converter(n)
+ else
+ local lowermethod = lower(method)
+ local linguistic = counters[lowermethod]
+ if linguistic then
+ return do_alphabetic(n,linguistic,lowermethod == method and lowercharacter or uppercharacter)
+ end
+ local sequence = sequences[method]
+ if sequence then
+ local max = #sequence
+ if n > max then
+ return sequence[(n-1) % max + 1]
+ else
+ return sequence[n]
+ end
+ else
+ return n
+ end
+ end
+end
+
+converters.convert = convert
+
+function commands.checkedconversion(method,n)
+ context(convert(method,n))
+end
+
+-- Well, since the one asking for this didn't test it the following code is not
+-- enabled.
+--
+-- -- This Lua version is based on a Javascript by Behdad Esfahbod which in turn
+-- -- is based on GPL'd code by Roozbeh Pournader of the The FarsiWeb Project
+-- -- Group: http://www.farsiweb.info/jalali/jalali.js.
+-- --
+-- -- We start tables at one, I kept it zero based in order to stay close to
+-- -- the original.
+-- --
+-- -- Conversion by Hans Hagen
+--
+-- local g_days_in_month = { [0]=31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+-- local j_days_in_month = { [0]=31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29 }
+--
+-- local function div(a,b)
+-- return math.floor(a/b)
+-- end
+--
+-- local function remainder(a,b)
+-- return a - div(a,b)*b
+-- end
+--
+-- function gregorian_to_jalali(gy,gm,gd)
+-- local jy, jm, jd, g_day_no, j_day_no, j_np, i
+-- gy, gm, gd = gy - 1600, gm - 1, gd - 1
+-- g_day_no = 365*gy + div((gy+3),4) - div((gy+99),100) + div((gy+399),400)
+-- i = 0
+-- while i < gm do
+-- g_day_no = g_day_no + g_days_in_month[i]
+-- i = i + 1
+-- end
+-- if (gm>1 and ((gy%4==0 and gy%100~=0) or (gy%400==0))) then
+-- g_day_no = g_day_no + 1
+-- end
+-- g_day_no = g_day_no + gd
+-- j_day_no = g_day_no - 79
+-- j_np = div(j_day_no,12053)
+-- j_day_no = remainder(j_day_no,12053)
+-- jy = 979 + 33*j_np + 4*div(j_day_no,1461)
+-- j_day_no = remainder(j_day_no,1461)
+-- if j_day_no >= 366 then
+-- jy = jy + div((j_day_no-1),365)
+-- j_day_no = remainder((j_day_no-1),365)
+-- end
+-- i = 0
+-- while i < 11 and j_day_no >= j_days_in_month[i] do
+-- j_day_no = j_day_no - j_days_in_month[i]
+-- i = i + 1
+-- end
+-- jm = i + 1
+-- jd = j_day_no + 1
+-- return jy, jm, jd
+-- end
+--
+-- function jalali_to_gregorian(jy,jm,jd)
+-- local gy, gm, gd, g_day_no, j_day_no, leap, i
+-- jy, jm, jd = jy - 979, jm - 1, jd - 1
+-- j_day_no = 365*jy + div(jy,33)*8 + div((remainder(jy,33)+3),4)
+-- i = 0
+-- while i < jm do
+-- j_day_no = j_day_no + j_days_in_month[i]
+-- i = i + 1
+-- end
+-- j_day_no = j_day_no + jd
+-- g_day_no = j_day_no + 79
+-- gy = 1600 + 400*div(g_day_no,146097)
+-- g_day_no = remainder (g_day_no, 146097)
+-- leap = 1
+-- if g_day_no >= 36525 then
+-- g_day_no = g_day_no - 1
+-- gy = gy + 100*div(g_day_no,36524)
+-- g_day_no = remainder (g_day_no, 36524)
+-- if g_day_no >= 365 then
+-- g_day_no = g_day_no + 1
+-- else
+-- leap = 0
+-- end
+-- end
+-- gy = gy + 4*div(g_day_no,1461)
+-- g_day_no = remainder (g_day_no, 1461)
+-- if g_day_no >= 366 then
+-- leap = 0
+-- g_day_no = g_day_no - 1
+-- gy = gy + div(g_day_no, 365)
+-- g_day_no = remainder(g_day_no, 365)
+-- end
+-- i = 0
+-- while g_day_no >= g_days_in_month[i] + ((i == 1 and leap) or 0) do
+-- g_day_no = g_day_no - g_days_in_month[i] + ((i == 1 and leap) or 0)
+-- i = i + 1
+-- end
+-- gm = i + 1
+-- gd = g_day_no + 1
+-- return gy, gm, gd
+-- end
+--
+-- print(gregorian_to_jalali(2009,02,24))
+-- print(jalali_to_gregorian(1387,12,06))
+
+-- more efficient but needs testing
+--
+-- local escapes = utffilters.private.escapes
+--
+-- local function do_alphabetic(n,mapping,chr)
+-- local max = #mapping
+-- if n > max then
+-- do_alphabetic(floor((n-1)/max),max,chr)
+-- n = (n-1)%max+1
+-- end
+-- n = chr(n,mapping)
+-- context(escapes[n] or utfchar(n))
+-- end
+--
+-- local lccodes, uccodes = characters.lccode, characters.uccode
+--
+-- local function do_alphabetic(n,mapping,chr)
+-- local max = #mapping
+-- if n > max then
+-- do_alphabetic(floor((n-1)/max),mapping,chr)
+-- n = (n-1)%max+1
+-- end
+-- characters.flush(chr(n,mapping))
+-- end
+--
+-- local function lowercased(n,mapping) return characters.lccode(mapping[n] or fallback) end
+-- local function uppercased(n,mapping) return characters.uccode(mapping[n] or fallback) end
+--
+-- function converters.alphabetic(n,code)
+-- do_alphabetic(n,counters[code] or counters['**'],lowercased) -- lccode catches wrong tables
+-- end
+--
+-- function converters.Alphabetic(n,code)
+-- do_alphabetic(n,counters[code] or counters['**'],uppercased)
+-- end
+
+-- --
+
+local ordinals = {
+ english = function(n)
+ local two = n % 100
+ if two == 11 or two == 12 or to == 13 then
+ return "th"
+ else
+ local one = n % 10
+ if one == 1 then
+ return "st"
+ elseif one == 2 then
+ return "nd"
+ elseif one == 3 then
+ return "rd"
+ else
+ return "th"
+ end
+ end
+ end,
+ dutch = function(n)
+ return "e"
+ end,
+ french = function(n)
+ if n == 1 then
+ return "er"
+ end
+ end,
+}
+
+ordinals.en = ordinals.english
+ordinals.nl = ordinals.dutch
+ordinals.fr = ordinals.french
+
+function converters.ordinal(n,language)
+ local t = language and ordinals[language]
+ return t and t(n)
+end
+
+function commands.ordinal(n,language)
+ local t = language and ordinals[language]
+ local o = t and t(n)
+ if o then
+ context.highordinalstr(o)
+ end
+end
+
+-- --
+
+local v_day = variables.day
+local v_year = variables.year
+local v_month = variables.month
+local v_weekday = variables.weekday
+local v_referral = variables.referral
+local v_space = variables.space
+
+local convert = converters.convert
+
+local days = {
+ variables.sunday,
+ variables.monday,
+ variables.tuesday,
+ variables.wednesday,
+ variables.thursday,
+ variables.friday,
+ variables.saturday,
+}
+
+local months = {
+ variables.january,
+ variables.february,
+ variables.march,
+ variables.april,
+ variables.may,
+ variables.june,
+ variables.july,
+ variables.august,
+ variables.september,
+ variables.october,
+ variables.november,
+ variables.december,
+}
+
+function commands.dayname(n)
+ context.labeltext(days[n] or "unknown")
+end
+
+function commands.weekdayname(day,month,year)
+ context.labeltext(days[weekday(day,month,year)] or "unknown")
+end
+
+function commands.monthname(n)
+ context.labeltext(months[n] or "unknown")
+end
+
+function commands.monthmnem(n)
+ local m = months[n]
+ context.labeltext(m and (m ..":mnem") or "unknown")
+end
+
+-- a prelude to a function that we can use at the lua end
+
+-- historic : day+ month:mnem
+-- maybe better: day:ord month:mmem
+
+function commands.currentdate(str,currentlanguage) -- j and jj obsolete
+ local list = utilities.parsers.settings_to_array(str)
+ local year, month, day = tex.year, tex.month, tex.day
+ local auto = true
+ for i=1,#list do
+ local entry = list[i]
+ local tag, plus = match(entry,"^([^%+:]+)(.*)$")
+ local ordinal, mnemonic, whatordinal = false, false, nil
+ if not tag then
+ tag = entry
+ elseif plus == "+" or plus == "ord" then
+ ordinal = true
+ elseif plus == "mnem" then
+ mnemonic = true
+ end
+ if not auto and (tag == v_year or tag == v_month or tag == v_day or tag == v_weekday) then
+ context.space()
+ end
+ auto = false
+ if tag == v_year or tag == "y" then
+ context(year)
+ elseif tag == "yy" then
+ context("%02i",year % 100)
+ elseif tag == "Y" then
+ context(year)
+ elseif tag == v_month or tag == "m" then
+ if mnemonic then
+ commands.monthmnem(month)
+ else
+ commands.monthname(month)
+ end
+ elseif tag == "mm" then
+ context("%02i",month)
+ elseif tag == "M" then
+ context(month)
+ elseif tag == v_day or tag == "d" then
+ context.convertnumber(v_day,day)
+ whatordinal = day
+ elseif tag == "dd" then
+ context("%02i",day)
+ whatordinal = day
+ elseif tag == "D" then
+ context(day)
+ whatordinal = day
+ elseif tag == v_weekday or tag == "w" then
+ commands.dayname(weekday(day,month,year))
+ elseif tag == "W" then
+ context(weekday(day,month,year))
+ elseif tag == v_referral then
+ context("%04i%02i%02i",year,month,day)
+ elseif tag == v_space or tag == "\\ " then
+ context.space()
+ auto = true
+ elseif tag ~= "" then
+ context(tag)
+ auto = true
+ end
+ if ordinal and whatordinal then
+ commands.ordinal(whatordinal,currentlanguage)
+ end
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/core-con.mkiv b/Master/texmf-dist/tex/context/base/core-con.mkiv
index 2d2e5d5d78e..e43e4ecda55 100644
--- a/Master/texmf-dist/tex/context/base/core-con.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-con.mkiv
@@ -17,7 +17,7 @@
\unprotect
-\ifx\currentlanguage\undefined \let\currentlanguage\empty \fi
+\ifx\currentlanguage\undefined \let\currentlanguage\empty \fi
\ifx\labeltext \undefined \let\labeltext\firstofoneargument \fi
%D This module deals with all kind of conversions from numbers
@@ -74,41 +74,41 @@
%D \showsetup{romannumerals}
%D \showsetup{Romannumerals}
-\def\romannumerals#1{\ctxlua{converters.romannumerals(\number#1)}}
-\def\Romannumerals#1{\ctxlua{converters.Romannumerals(\number#1)}}
+\def\romannumerals#1{\ctxcommand{romannumerals(\number#1)}}
+\def\Romannumerals#1{\ctxcommand{Romannumerals(\number#1)}}
%D Arabic etc:
-\def\abjadnumerals #1{\ctxlua{converters.abjadnumerals (\number#1)}}
-\def\abjadnodotnumerals#1{\ctxlua{converters.abjadnodotnumerals(\number#1)}}
-\def\abjadnaivenumerals#1{\ctxlua{converters.arabicnumerals (\number#1)}}
+\def\abjadnumerals #1{\ctxcommand{abjadnumerals (\number#1)}}
+\def\abjadnodotnumerals#1{\ctxcommand{abjadnodotnumerals(\number#1)}}
+\def\abjadnaivenumerals#1{\ctxcommand{arabicnumerals (\number#1)}}
-\def\languagecharacters#1{\ctxlua{converters.alphabetic(\number#1,"\currentlanguage")}} % new
-\def\languageCharacters#1{\ctxlua{converters.Alphabetic(\number#1,"\currentlanguage")}} % new
+\def\languagecharacters#1{\ctxcommand{alphabetic(\number#1,"\currentlanguage")}} % new
+\def\languageCharacters#1{\ctxcommand{Alphabetic(\number#1,"\currentlanguage")}} % new
% we could use an auxiliary macro to save some bytes in the format
%
-% \def\dolanguagecharacters#1#2{\ctxlua{converters.alphabetic(\number#2,"#1")}}
+% \def\dolanguagecharacters#1#2{\ctxcommand{alphabetic(\number#2,"#1")}}
-\def\thainumerals #1{\ctxlua{converters.alphabetic(\number#1,"thai")}}
-\def\devanagarinumerals#1{\ctxlua{converters.alphabetic(\number#1,"devanagari")}}
-\def\gurmurkhinumerals #1{\ctxlua{converters.alphabetic(\number#1,"gurmurkhi")}}
-\def\gujaratinumerals #1{\ctxlua{converters.alphabetic(\number#1,"gujarati")}}
-\def\tibetannumerals #1{\ctxlua{converters.alphabetic(\number#1,"tibetan")}}
-\def\greeknumerals #1{\ctxlua{converters.alphabetic(\number#1,"greek")}}
-\def\Greeknumerals #1{\ctxlua{converters.Alphabetic(\number#1,"greek")}}
-\def\arabicnumerals #1{\ctxlua{converters.alphabetic(\number#1,"arabic")}}
-\def\persiannumerals #1{\ctxlua{converters.alphabetic(\number#1,"persian")}}
+\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")}}
-\let\arabicexnumerals \persiannumerals
+\let\arabicexnumerals \persiannumerals
-\def\koreannumerals #1{\ctxlua{converters.alphabetic(\number#1,"korean")}}
-\def\koreannumeralsp#1{\ctxlua{converters.alphabetic(\number#1,"korean-parent")}}
-\def\koreannumeralsc#1{\ctxlua{converters.alphabetic(\number#1,"korean-circle")}}
+\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\chinesenumerals #1{\ctxlua{converters.chinesenumerals (\number#1)}}
-\def\chinesecapnumerals#1{\ctxlua{converters.chinesecapnumerals(\number#1,"cap")}}
-\def\chineseallnumerals#1{\ctxlua{converters.chineseallnumerals(\number#1,"all")}}
+\def\chinesenumerals #1{\ctxcommand{chinesenumerals (\number#1)}}
+\def\chinesecapnumerals#1{\ctxcommand{chinesecapnumerals(\number#1,"cap")}}
+\def\chineseallnumerals#1{\ctxcommand{chineseallnumerals(\number#1,"all")}}
%D \macros
%D {character,Character}
@@ -128,8 +128,8 @@
\def\unknowncharacter{-} % else in lists \relax
-\def\character#1{\ctxlua{converters.character (\number#1)}}
-\def\Character#1{\ctxlua{converters.Character (\number#1)}}
+\def\character#1{\ctxcommand{character(\number#1)}}
+\def\Character#1{\ctxcommand{Character(\number#1)}}
%D \macros
%D {characters,Characters}
@@ -141,16 +141,16 @@
%D \showsetup{characters}
%D \showsetup{Characters}
-\def\characters#1{\ctxlua{converters.characters(\number#1)}}
-\def\Characters#1{\ctxlua{converters.Characters(\number#1)}}
+\def\characters#1{\ctxcommand{characters(\number#1)}}
+\def\Characters#1{\ctxcommand{Characters(\number#1)}}
%D \macros
%D {greeknumerals,Greeknumerals}
%D
%D Why should we only honour the romans, and not the greek?
-\let\greeknumerals\gobbleoneargument
-\let\Greeknumerals\gobbleoneargument
+% \let\greeknumerals\gobbleoneargument
+% \let\Greeknumerals\gobbleoneargument
%D \macros
%D {oldstylenumerals,oldstyleromannumerals}
@@ -202,17 +202,8 @@
%D
%D Anyhow, the conversion looks like:
-\def\domonthtag#1%
- {\ifcase#1%
- \or \v!january \or \v!february \or \v!march \or \v!april
- \or \v!may \or \v!june \or \v!july \or \v!august
- \or \v!september \or \v!october \or \v!november \or \v!december
- \else
- \v!unknown
- \fi}
-
-\def\doconvertmonthlong #1{\labeltext{\domonthtag{#1}}}
-\def\doconvertmonthshort#1{\labeltext{\domonthtag{#1}:\s!mnem}}
+\def\doconvertmonthlong #1{\ctxcommand{month(#1)}}
+\def\doconvertmonthshort#1{\ctxcommand{monthmnem(#1)}}
\let\doconvertmonth\doconvertmonthlong
@@ -225,9 +216,9 @@
\def\monthshort{\doconvertmonthshort}
\def\month {\doconvertmonth}
-\def\MONTH #1{{\let\labeltext\LABELTEXT\month {#1}}}
-\def\MONTHLONG #1{{\let\labeltext\LABELTEXT\monthlong {#1}}}
-\def\MONTHSHORT#1{{\let\labeltext\LABELTEXT\monthshort{#1}}}
+\def\MONTH #1{{\WORD{\month {#1}}}}
+\def\MONTHLONG #1{{\WORD{\monthlong {#1}}}}
+\def\MONTHSHORT#1{{\WORD{\monthshort{#1}}}}
%D We never explicitly needed this, but Tobias Burnus pointed
%D out that it would be handy to convert to the day of the
@@ -245,25 +236,18 @@
%D 2000 into leap years, right? Well, converting to string
%D looks familiar:
-\def\doconvertday#1%
- {\labeltext
- {\ifcase#1
- \or \v!sunday \or \v!monday \or \v!tuesday \or \v!wednesday
- \or \v!thursday \or \v!friday \or \v!saturday \fi}}
+\def\doconvertday#1{\ctxcommand{day(#1)}}
%D \macros
%D {getdayoftheweek, dayoftheweek}
-%D
-%D The conversion algoritm is an old one and a translation from
-%D a procedure written in MODULA~2 back in the 80's. I finaly
-%D found the 4--100-400 rules in some enclopedia. Look at this
-%D messy low level routine that takes the day, month and year
-%D as arguments:
\newcount\normalweekday
-\def\getdayoftheweek#1#2#3{\normalweekday\ctxlua{converters.weekday(\number#1,\number#2,\number#3)}}
-\def\dayoftheweek #1#2#3{\doconvertday{\ctxlua{converters.weekday(\number#1,\number#2,\number#3)}}}
+% \def\getdayoftheweek#1#2#3{\normalweekday\ctxcommand{weekday(\number#1,\number#2,\number#3)}}
+% \def\dayoftheweek #1#2#3{\doconvertday{\ctxcommand{weekday(\number#1,\number#2,\number#3)}}}
+
+\def\getdayoftheweek#1#2#3{\normalweekday\ctxcommand{weekday(\number#1,\number#2,\number#3)}\relax} % number
+\def\dayoftheweek #1#2#3{\ctxcommand{weekdayname(\number#1,\number#2,\number#3)}} % name
%D Using this macro in
%D
@@ -304,7 +288,7 @@
{\doconvertday}
\def\WEEKDAY#1%
- {{\let\labeltext\LABELTEXT\doconvertday{#1}}}
+ {{\WORD{\doconvertday{#1}}}}
%D \macros
%D {weekoftheday}
@@ -337,24 +321,13 @@
%D {\numberofdays}.
\def\doifleapyearelse#1%
- {\ifcase\ctxlua{converters.leapyear(\number#1)}
- \@EA\secondoftwoarguments
- \else
- \@EA\firstoftwoarguments
- \fi}
+ {\ctxcommand{doifleapyearelse(\number#1)}}
\def\getdayspermonth#1#2%
- {\edef\numberofdays{\ctxlua{converters.nofdays(\number#1,\number#2)}}}
+ {\edef\numberofdays{\ctxcommand{nofdays(\number#1,\number#2)}}}
\def\dayspermonth#1#2%
- {\ctxlua{converters.nofdays(\number#1,\number#2)}}
-
-% problem is that we calculate with those numbers
-%
-% \def\time {\numexpr\ctxlua{converters.textime()}\relax}
-% \def\year {\numexpr\ctxlua{converters.year ()}\relax}
-% \def\month{\numexpr\ctxlua{converters.month ()}\relax}
-% \def\day {\numexpr\ctxlua{converters.day ()}\relax}
+ {\ctxcommand{nofdays(\number#1,\number#2)}}
% \dayoftheweek{2006}{9}{15}
% \doifleapyearelse{2000}{OK}{NOT OK}
@@ -423,86 +396,131 @@
%D \getbuffer
%D \stoplines
-\def\kenmerkdatumpatroon{j,mm,dd} % jj,mm,dd changed at januari 1-1-2000
-
-\newsignal\datesignal
-
-\def\dobetweendates
- {\ifdim\lastskip=\datesignal\relax\else
- \unskip\space
- \hskip\datesignal\relax
- \fi}
+% \newtoks \everycurrentdate
+%
+% \newsignal\datesignal
+%
+% \def\dobetweendates
+% {\ifdim\lastskip=\datesignal\relax\else
+% \unskip\space
+% \hskip\datesignal\relax
+% \fi}
+%
+% \def\referraldatepattern{j,mm,dd} % jj,mm,dd changed at januari 1-1-2000
+%
+% \def\dodobetweendates
+% {\let\betweendates\dobetweendates}%
+%
+% \def\dodocurrentdate#1%
+% {\processallactionsinset[#1]
+% [ \v!year=>\betweendates
+% \convertnumber\v!year\normalyear,
+% yy=>\lasttwodigits\normalyear,
+% y=>\convertnumber\v!year\normalyear,
+% Y=>\number\normalyear,
+% \v!month=>\betweendates
+% \month\normalmonth,
+% mm=>\twodigits\normalmonth,
+% m=>\month\normalmonth,
+% M=>\number\normalmonth,
+% \v!day=>\betweendates
+% \convertnumber\v!day\normalday,
+% \v!day+=>\betweendates
+% \convertnumber\v!day\normalday
+% \ordinal\normalday,
+% dd=>\twodigits\normalday,
+% dd+=>\convertnumber\v!day{\twodigits\normalday}%
+% \ordinal\normalday,
+% d=>\convertnumber\v!day\normalday,
+% d+=>\convertnumber\v!day\normalday
+% \ordinal\normalday,
+% d=>\number\normalday,
+% \v!weekday=>\betweendates
+% \convertnumber\v!day{\dayoftheweek\normalday\normalmonth\normalyear},
+% w=>\convertnumber\v!day{\dayoftheweek\normalday\normalmonth\normalyear},
+% W=>\dayoftheweek\normalday\normalmonth\normalyear,
+% \v!referral=>\docomplexcurrentdate\referraldatepattern,
+% \v!space=>\unskip\ \hskip\datesignal,
+% \ =>\unskip\ \hskip\datesignal,
+% \s!default=>,
+% \s!unknown=>\unskip\commalistelement
+% \hskip\datesignal
+% \let\betweendates\dodobetweendates]}
+%
+% \def\docurrentdate[#1]%
+% {\begingroup
+% \the\everycurrentdate
+% \let\betweendates\dodobetweendates
+% \doifsomething{#1}{\edef\currentdatespecification{#1}}%
+% \normalexpanded{\dodocurrentdate{\currentdatespecification}}%
+% \ifdim\lastskip=\datesignal\relax
+% \unskip
+% \fi
+% \endgroup}
+
+%D \starttabulate[|l|l|]
+%D \HL
+%D \NC year \NC (\currentdate[year]) \NC\NR
+%D \NC yy \NC (\currentdate[yy]) \NC\NR
+%D \NC y \NC (\currentdate[y]) \NC\NR
+%D \NC Y \NC (\currentdate[Y]) \NC\NR
+%D \HL
+%D \NC month \NC (\currentdate[month]) \NC\NR
+%D \NC mm \NC (\currentdate[mm]) \NC\NR
+%D \NC m \NC (\currentdate[m]) \NC\NR
+%D \NC M \NC (\currentdate[M]) \NC\NR
+%D \HL
+%D \NC day \NC (\currentdate[day]) \NC\NR
+%D \NC dd \NC (\currentdate[dd]) \NC\NR
+%D \NC d \NC (\currentdate[d]) \NC\NR
+%D \NC D \NC (\currentdate[D]) \NC\NR
+%D \HL
+%D \NC weekday \NC (\currentdate[weekday]) \NC\NR
+%D \NC w \NC (\currentdate[w]) \NC\NR
+%D \NC W \NC (\currentdate[W]) \NC\NR
+%D \HL
+%D \NC referral \NC (\currentdate[referral]) \NC\NR
+%D \HL
+%D \NC day+ \NC (\currentdate[day+]) \NC\NR
+%D \NC dd+ \NC (\currentdate[dd+]) \NC\NR
+%D \NC d+ \NC (\currentdate[d+]) \NC\NR
+%D \NC D+ \NC (\currentdate[D+]) \NC\NR
+%D \HL
+%D \stoptabulate
+%D
+%D \startbuffer
+%D (\currentdate[D,.,M,.,Y])
+%D (\currentdate[day,month,year])
+%D (\currentdate[day,+,month,+,year])
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
\newtoks \everycurrentdate
-\def\complexcurrentdate[#1]%
- {\bgroup
+\unexpanded\def\currentdate
+ {\dosingleempty\docurrentdate}
+
+\def\docurrentdate[#1]%
+ {\begingroup
\the\everycurrentdate
- \def\betweendates{\let\betweendates\dobetweendates}%
- % was \processcommacommandp[#1]\docomplexcurrentdate
- \safeedef\ascii{\empty#1}% keep encoded chars
- \@EA\processcommalist\@EA[\ascii]\docomplexcurrentdate
- \ifdim\lastskip=\datesignal\relax
- \unskip
- \fi
- \egroup}
+ \doifsomething{#1}{\edef\currentdatespecification{#1}}%
+ \ctxcommand{currentdate(\!!bs\currentdatespecification\!!es,"\labellanguage")}%
+ \endgroup}
-\def\docomplexcurrentdate#1%
- {\lowercase{\edef\!!stringa{#1}}% permits usage in \smallcapped
- \expanded{\processaction[\!!stringa]}% [#1]
- [ \v!day=>\betweendates\the\normalday,
- %\v!day+=>\betweendates\ordinaldaynumber\normalday,
- \v!day+=>\betweendates\convertnumber{\v!day+}\normalday,
- \v!month=>\betweendates\month\normalmonth,
- \v!year=>\betweendates\the\normalyear,
- \v!space=>\unskip\ \hskip\datesignal,% optimization -)
- \ =>\unskip\ \hskip\datesignal,% optimization -)
- d=>\convertnumber\v!day\normalday,
- %d+=>\ordinaldaynumber\normalday,
- d+=>\convertnumber{\v!day+}\normalday,
- m=>\convertnumber\v!month\normalmonth,
- j=>\convertnumber\v!year\normalyear,
- y=>\convertnumber\v!year\normalyear,
- w=>\betweendates\dayoftheweek\normalday\normalmonth\normalyear,
- dd=>\ifnum\normalday >9 \else0\fi\the\normalday,
- %dd+=>\ordinaldaynumber{\ifnum\normalday >9 \else0\fi\the\normalday},
- dd+=>\convertnumber{\v!day+}{\ifnum\normalday >9 \else0\fi\the\normalday},
- mm=>\ifnum\normalmonth>9 \else0\fi\the\normalmonth,
- jj=>\expandafter\gobbletwoarguments\the\normalyear,
- yy=>\expandafter\gobbletwoarguments\the\normalyear,
- \v!weekday=>\betweendates\dayoftheweek\normalday\normalmonth\normalyear,
- \v!referral=>\expanded{\complexcurrentdate[\kenmerkdatumpatroon]},
- \s!unknown=>\unskip
- % #1 and not the lowercased \commalistelement, vietnamese has text
- % {} because #1 can have comma, like: {\ ,}
- {#1}%
- \hskip\datesignal
- \def\betweendates{\let\betweendates\dobetweendates}]}
-
-\def\simplecurrentdate
- {\expanded{\complexcurrentdate[\currentdatespecification]}}
-
-\definecomplexorsimple\currentdate
+\unexpanded\def\date
+ {\dodoubleempty\dodate}
\def\dodate[#1][#2]%
- {\bgroup
+ {\begingroup
\iffirstargument
\getparameters[\??da][d=\normalday,m=\normalmonth,y=\normalyear,#1]%
\normalday \@@dad\relax
\normalmonth\@@dam\relax
\normalyear \@@day\relax
- \ifsecondargument
- \currentdate[#2]%
- \else
- \currentdate
- \fi
- \else
- \currentdate
\fi
- \egroup}
-
-\def\date
- {\dodoubleempty\dodate}
+ \docurrentdate[#2]%
+ \endgroup}
%D \macros
%D {currenttime}
@@ -511,10 +529,10 @@
%D a pattern similar to the previous date macro using the
%D keys \type {h}, \type {m} and a separator.
-\def\calculatecurrenttime
- {\edef\currenthour {\ctxlua{converters.hour ()}}%
- \edef\currentminute{\ctxlua{converters.minute()}}%
- \edef\currentsecond{\ctxlua{converters.second()}}}
+\unexpanded\def\calculatecurrenttime
+ {\edef\currenthour {\ctxcommand{hour ()}}%
+ \edef\currentminute{\ctxcommand{minute()}}%
+ \edef\currentsecond{\ctxcommand{second()}}}
\let\currenthour \!!plusone
\let\currentminute\!!plusone
@@ -523,8 +541,7 @@
\def\complexcurrenttime[#1]%
{\calculatecurrenttime
- \processallactionsinset[#1]
- [h=>\currenthour,m=>\currentminute,\s!unknown=>\commalistelement]}
+ \processallactionsinset[#1][h=>\currenthour,m=>\currentminute,\s!unknown=>\commalistelement]}
\def\simplecurrenttime
{\expanded{\complexcurrenttime[\currenttimespecification]}}
@@ -586,83 +603,40 @@
%D \defineconversion [en] [whatever] [\something]
%D \stoptyping
-% \def\dodefineconversion[#1][#2]%
-% {\ConvertConstantAfter\doifinstringelse{,}{#2}
-% {\scratchcounter=0
-% \def\docommand##1%
-% {\advance\scratchcounter 1
-% \setvalue{\??cv#1\the\scratchcounter}{##1}}%
-% \processcommalist[#2]\docommand
-% \setvalue{\??cv#1}##1{\csname\??cv#1##1\endcsname}}
-% {\setvalue{\??cv#1}{#2}}}
-%
-% \unexpanded\def\defineconversion%
-% {\dodoubleargument\dodefineconversion}
-
\unexpanded\def\defineconversion
{\dotripleempty\dodefineconversion}
-\def\dodefineconversion[#1][#2][#3]%
+\def\dodefineconversion[#1][#2][#3]% from now on global (maybe local again some day)
{\ifthirdargument
- \dododefineconversion[#1][#2][#3]%
+ \dododefineconversion{#1#2}{#1:#2}{#3}%
\else
- \dododefineconversion[][#1][#2]%
+ \dododefineconversion{#1}{#1}{#2}%
\fi}
-%D \starttyping
-%D \def\dododefineconversion[#1][#2][#3]%
-%D {\ConvertConstantAfter\doifinstringelse{,}{#3}
-%D {\scratchcounter\zerocount
-%D \def\docommand##1%
-%D {\advance\scratchcounter \plusone
-%D \setvalue{\??cv#1#2\the\scratchcounter}{##1}}%
-%D \processcommalist[#3]\docommand
-%D \setvalue{\??cv#1#2}##1{\executeifdefined{\??cv#1#2##1}\unknown}} % catch out-of-range numbers
-%D {\setvalue{\??cv#1#2}{#3}}}
-%D \stoptyping
-
-%D This approach has the disadvantage that when you run out of
-%D symbols you get unknown results. The following implementation
-%D permits overloading of the converter:
-
-\def\dododefineconversion[#1][#2][#3]%
- {\ConvertConstantAfter\doifinstringelse{,}{#3}
- {\scratchcounter\zerocount
- \def\docommand##1%
- {\advance\scratchcounter \plusone
- \setvalue{\??cv#1#2\the\scratchcounter}{##1}}%
- \processcommalist[#3]\docommand
- \setevalue{\??cv#1#2}##1%
- {\noexpand\docheckedconversion{#1#2}{\the\scratchcounter}{##1}}}
- {\setvalue{\??cv#1#2}{#3}}}
-
-\def\docheckedconversion#1#2#3% class maxnumber number
- {\executeifdefined{\??cv#1#3}\unknown}
-
-%D When Gerben reported problems with footnote numbering per page,
-%D Taco came with the following wrap around solution. So, let's
-%D overload the checked conversion macro:
-
-\def\docheckedconversion#1#2#3% class maxnumber number
- {\executeifdefined{\??cv#1\modulatednumber{#2}{#3}}\unknown}
+\def\dododefineconversion#1#2#3%
+ {\doifinstringelse{,}{\detokenize{#3}}
+ {\ctxcommand{defineconversion("#2",\!!bs\detokenize{#3}\!!es)}%
+ \setgvalue{\??cv#1}{\checkedconversion{#2}}}
+ {\setgvalue{\??cv#1}{#3}}}
-%D Taco's modulo code is implemented in the system module
-%D \type {syst-con}.
+\def\checkedconversion#1#2%
+ {\ctxcommand{checkedconversion("#1",#2)}}
%D If a conversion is just a font switch then we need to make sure
%D that the number is indeed end up as number in the input, so we
%D need to handle the second argument.
\def\convertnumber#1#2%
- {\csname\??cv
- \ifcsname\??cv\currentlanguage#1\endcsname
- \currentlanguage#1%
- \else\ifcsname\??cv#1\endcsname
- #1%
- \else
- \s!default
- \fi\fi
- \endcsname{\number#2}}
+ {\csname
+ \??cv=>% we want a fully expandable (no if interference)
+ \ifcsname\??cv\currentlanguage#1\endcsname1\else
+ \ifcsname\??cv #1\endcsname2\else
+ 3\fi\fi
+ \endcsname{#1}{\number#2}}
+
+\setvalue{\??cv=>1}#1{\csname\??cv\currentlanguage#1\endcsname}
+\setvalue{\??cv=>2}#1{\csname\??cv #1\endcsname}
+\letvalue{\??cv=>3}\checkedconversion
\def\doifconversiondefinedelse#1%
{\ifcsname\??cv\currentlanguage#1\endcsname
@@ -697,14 +671,9 @@
%D difficult to implement. Fortunately dates never exceed the
%D number~31.
-\ifx\high \undefined \let\high \firstofoneargument \fi
-\ifx\notsmallcapped\undefined \let\notsmallcapped\firstofoneargument \fi
-
-\def\highordinalstr#1{\high{\notsmallcapped{#1}}}
-\def\ordinalstr #1{\notsmallcapped{#1}}
-
-\def\ordinaldaynumber#1% \strippedcsname\ordinaldaynumber
- {\expanded{\executeifdefined{\currentlanguage ordinaldaynumber}\noexpand\firstofoneargument{\number#1}}}
+\def\highordinalstr #1{\high{\notsmallcapped{#1}}}
+\def\ordinalstr #1{\notsmallcapped{#1}}
+\def\ordinaldaynumber #1{\ctxcommand{ordinal(#1,"\currentlanguage"}}
%D As longs as symbols are linked to levels or numbers, we can
%D also use the conversion mechanism, but in for instance the
@@ -734,6 +703,7 @@
\defineconversion [AK] [\smallcappedcharacters]
\defineconversion [KA] [\smallcappedcharacters]
+\defineconversion [\v!number] [\numbers]
\defineconversion [\v!numbers] [\numbers]
\defineconversion [\v!Numbers] [\Numbers]
\defineconversion [\v!mediaeval] [\mediaeval]
@@ -762,9 +732,6 @@
\defineconversion [g] [\greeknumerals]
\defineconversion [G] [\Greeknumerals]
-\defineconversion [arabicnumerals] [\arabicnumerals]
-\defineconversion [persiannumerals] [\persiannumerals]
-
\defineconversion [abjadnumerals] [\abjadnumerals]
\defineconversion [abjadnodotnumerals] [\adjadnodotnumerals]
\defineconversion [abjadnaivenumerals] [\adjadnaivenumerals]
@@ -857,4 +824,17 @@
\mathematics{\ast\ast},
\mathematics{\ast\ast\ast}]
+%D Iteration of suggestion by WS on mailinglist 2010.12.22:
+%D
+%D \starttyping
+%D \setupfloatsplitting[conversion=continued]
+%D \stoptyping
+
+\unexpanded\def\continuednumber#1%
+ {\labeltext{\ifcase#1\or\else\v!continued\fi}}
+
+\defineconversion
+ [\v!continued]
+ [\continuednumber]
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/core-ctx.lua b/Master/texmf-dist/tex/context/base/core-ctx.lua
index 1dad7c2d73a..e6fb7bb5fd8 100644
--- a/Master/texmf-dist/tex/context/base/core-ctx.lua
+++ b/Master/texmf-dist/tex/context/base/core-ctx.lua
@@ -6,9 +6,12 @@ if not modules then modules = { } end modules ['core-ctx'] = {
license = "see context related readme files"
}
-local trace_prepfiles = false trackers.register("resolvers.prepfiles", function(v) trace_prepfiles = v end)
+local trace_prepfiles = false trackers.register("system.prepfiles", function(v) trace_prepfiles = v end)
-commands = commands or { }
+local report_prepfiles = logs.reporter("system","prepfiles")
+
+commands = commands or { }
+local commands = commands
local list, suffix, islocal, found = { }, "prep", false, false
@@ -20,9 +23,9 @@ function commands.loadctxpreplist()
islocal = xml.found(x,"ctx:preplist[@local=='yes']")
--~ if trace_prepfiles then
if islocal then
- commands.writestatus("systems","loading ctx log file (local)") -- todo: m!systems
+ report_prepfiles("loading ctx log file (local)") -- todo: m!system
else
- commands.writestatus("systems","loading ctx log file (specified)") -- todo: m!systems
+ report_prepfiles("loading ctx log file (specified)") -- todo: m!system
end
--~ end
for e in xml.collected(x,"ctx:prepfile") do
@@ -32,7 +35,7 @@ function commands.loadctxpreplist()
end
local done = e.at['done'] or 'no'
if trace_prepfiles then
- commands.writestatus("systems","registering %s -> %s",done)
+ report_prepfiles("registering %s -> %s",done)
end
found = true
list[name] = done -- 'yes' or 'no'
@@ -47,7 +50,7 @@ local function found(name) -- used in resolve
local prepname = name .. "." .. suffix
if list[name] and lfs.isfile(prepname) then
if trace_prepfiles then
- commands.writestatus("systems", "preprocessing: using %s",prepname)
+ report_prepfiles("preprocessing: using %s",prepname)
end
return prepname
end
@@ -55,7 +58,7 @@ local function found(name) -- used in resolve
end
local function resolve(name) -- used a few times later on
- local filename = file.collapse_path(name)
+ local filename = file.collapsepath(name)
local prepname = islocal and found(file.basename(name))
if prepname then
return prepname
diff --git a/Master/texmf-dist/tex/context/base/core-ctx.mkiv b/Master/texmf-dist/tex/context/base/core-ctx.mkiv
index 9bf4569520b..f6e5a33f1be 100644
--- a/Master/texmf-dist/tex/context/base/core-ctx.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-ctx.mkiv
@@ -15,14 +15,14 @@
\unprotect
-\chardef\preprocessmethod \plustwo % always check in mkiv
+\setnewconstant\preprocessmethod\plustwo % always check in mkiv
\registerctxluafile{core-ctx}{1.000}
-\def\loadctxpreplist{\ctxlua{commands.loadctxpreplist()}\global\let\loadctxpreplist\relax}
+\def\loadctxpreplist{\ctxcommand{loadctxpreplist()}\global\let\loadctxpreplist\relax}
% \prependtoks\loadctxpreplist\to\everyjob
-\appendtoks\loadctxpreplist\to\everystarttext
+\appendtoks\loadctxpreplist\to\everystarttext % maybe too late but don't change it now
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/core-def.mkii b/Master/texmf-dist/tex/context/base/core-def.mkii
index 840f853a763..ff7283356c1 100644
--- a/Master/texmf-dist/tex/context/base/core-def.mkii
+++ b/Master/texmf-dist/tex/context/base/core-def.mkii
@@ -91,7 +91,7 @@
\def\synctexwarning
{\ifdefined\synctex \ifnum\synctex=\zerocount \else
\writeline
- \writestatus\m!systems{BEWARE: syntex functionality is enabled!}%
+ \writestatus\m!systems{BEWARE: synctex functionality is enabled!}%
\writeline
\globallet\synctexwarning\relax
\fi \fi}
diff --git a/Master/texmf-dist/tex/context/base/core-def.mkiv b/Master/texmf-dist/tex/context/base/core-def.mkiv
index 59451a9141e..59c2c89c1e3 100644
--- a/Master/texmf-dist/tex/context/base/core-def.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-def.mkiv
@@ -18,7 +18,7 @@
\unprotect
-\usesymbols[mis,mvs,nav]
+\usesymbols[mis,nav] % no longer mvs preloaded
\setupsymbolset[navigation 1]
@@ -26,15 +26,19 @@
% initialization order:
+\ifdefined\firststagepreloadfonts \else \let\firststagepreloadfonts \relax \fi
+\ifdefined\secondstagepreloadfonts \else \let\secondstagepreloadfonts\relax \fi
+\ifdefined\thirdstagepreloadfonts \else \let\thirdstagepreloadfonts \relax \fi
+\ifdefined\fourthstagepreloadfonts \else \let\fourthstagepreloadfonts\relax \fi
+
+%prependtoks \preloadtypescript \to \everyjob
\appendtoks \showcontextbanner \to \everyjob
\appendtoks \initializenewlinechar \to \everyjob
\appendtoks \calculatecurrenttime \to \everyjob
\appendtoks \loadsystemfiles \to \everyjob
\appendtoks \loadoptionfile \to \everyjob % can load files !
-\appendtoks \preloadfonts \to \everyjob
+\appendtoks \firststagepreloadfonts \to \everyjob
\appendtoks \settopskip \to \everyjob
-\appendtoks \preloadlanguages \to \everyjob
-\appendtoks \preloadspecials \to \everyjob
\appendtoks \initializeMPgraphics \to \everyjob % after loading system files
\appendtoks \initializemainlanguage \to \everyjob
%appendtoks \MPLIBregister \to \everyjob
@@ -58,6 +62,9 @@
\prependtoks \lefttoright \to \everybeforeoutput
+\appendtoks \secondstagepreloadfonts \to \everystarttext
+\appendtoks \fourthstagepreloadfonts \to \everystoptext
+
% temporary here:
\ifdefined\in \let\normalmathin \in \unexpanded\def\in {\mathortext\normalmathin \dospecialin } \else \let\in \dospecialin \fi
@@ -68,6 +75,12 @@
\unexpanded\def\arg{\mathortext\normalmatharg\normaltextarg}
+% for the moment here
+
+\enablemode[*nofonts]
+
+\nonknuthmode
+
% brrr
\appendtoks
@@ -79,16 +92,4 @@
\synchronizelocallinespecs
\to \everyswitchtobodyfont
-\def\synctexwarning
- {\ifdefined\synctex \ifnum\synctex=\zerocount \else
- \writeline
- \writestatus\m!systems{BEWARE: synctex functionality is enabled!}%
- \writeline
- \globallet\synctexwarning\relax
- \fi \fi}
-
-\prependtoks \synctexwarning \to \everyjob
-\prependtoks \synctexwarning \to \everystarttext
-\appendtoks \synctexwarning \to \everystoptext
-
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/core-env.lua b/Master/texmf-dist/tex/context/base/core-env.lua
new file mode 100644
index 00000000000..694b2f07c42
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/core-env.lua
@@ -0,0 +1,101 @@
+if not modules then modules = { } end modules ['core-env'] = {
+ version = 1.001,
+ comment = "companion to core-env.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- maybe this will move to the context name space although the
+-- plurals are unlikely to clash with future tex primitives
+--
+-- if tex.modes['xxxx'] then .... else .... end
+
+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 texcount = tex.count
+local create = token.create
+
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+
+local undefined = csname_id("*undefined*crap*")
+local iftrue = create("iftrue")[2] -- inefficient hack
+
+tex.modes = allocate { }
+tex.systemmodes = allocate { }
+tex.constants = allocate { }
+tex.conditionals = allocate { }
+tex.ifs = 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
+ else
+ modes[k] = function() return texcount[n] >= 1 end
+ return texcount[n] >= 1
+ 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 texcount[n] >= 1 end
+ return texcount[n] >= 1
+ end
+ end
+end)
+
+setmetatableindex(tex.constants, function(t,k)
+ return csname_id(k) ~= undefined and texcount[k] or 0
+end)
+
+setmetatableindex(tex.conditionals, function(t,k) -- 0 == true
+ return csname_id(k) ~= undefined and texcount[k] == 0
+end)
+
+setmetatableindex(tex.ifs, function(t,k)
+ return csname_id(k) ~= undefined and create(k)[2] == iftrue -- inefficient, this create, we need a helper
+end)
+
+function tex.settrue(name)
+ texcount[name] = 0
+end
+
+function tex.setfalse(name)
+ texcount[name] = 1
+end
+
+---- arg = P("{") * C(patterns.nested) * P("}") + Cc("")
+
+local sep = S("), ")
+local str = C((1-sep)^1)
+local tag = P("(") * C((1-S(")" ))^1) * P(")")
+local arg = P("(") * C((1-S("){"))^1) * P("{") * C((1-P("}"))^0) * P("}") * P(")")
+
+local pattern = (
+ P("lua") * tag / context.luasetup
+ + P("xml") * arg / context.setupwithargument -- or xmlw as xmlsetup has swapped arguments
+ + (P("tex") * tag + str) / context.texsetup
+ + sep^1
+)^1
+
+function commands.autosetups(str)
+ lpegmatch(pattern,str)
+end
diff --git a/Master/texmf-dist/tex/context/base/core-env.mkiv b/Master/texmf-dist/tex/context/base/core-env.mkiv
index d927ff3ad50..2451b59501a 100644
--- a/Master/texmf-dist/tex/context/base/core-env.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-env.mkiv
@@ -13,6 +13,8 @@
\writestatus{loading}{ConTeXt Core Macros / Environments}
+\registerctxluafile{core-env}{1.001}
+
\unprotect
%D Modes:
@@ -39,68 +41,109 @@
%D considered a permanent disabling on forehand.
\def\@mode@{@md@}
+\def\@mode@{mode}
\def\systemmodeprefix{*}
-\def\disabledmode {0} % no chardefs
-\def\enabledmode {1}
-\def\preventedmode{2}
+% todo: check prevent mode, also at the lua end
+
+\setnewconstant\disabledmode \zerocount
+\setnewconstant\enabledmode \plusone
+\setnewconstant\preventedmode\plustwo
% fast internal ones
-\def\setmode #1{\@EA\let\csname\@mode@#1\endcsname\enabledmode }
-\def\resetmode#1{\@EA\let\csname\@mode@#1\endcsname\disabledmode}
+\def\donewmode#1%
+ {\@EA\newcount\csname\@mode@#1\endcsname}
+
+\def\newmode#1%
+ {\ifcsname\@mode@#1\endcsname\else\donewmode{#1}\fi}
+
+\def\setmode#1%
+ {\ifcsname\@mode@#1\endcsname\else\donewmode{#1}\fi
+ \csname\@mode@#1\endcsname\enabledmode}
+
+\def\resetmode#1%
+ {\ifcsname\@mode@#1\endcsname\else\donewmode{#1}\fi
+ \csname\@mode@#1\endcsname\disabledmode}
+
+\def\newsystemmode#1%
+ {\ifcsname\@mode@\systemmodeprefix#1\endcsname\else\donewmode{\systemmodeprefix#1}\fi}
+
+\def\setsystemmode#1%
+ {\ifcsname\@mode@\systemmodeprefix#1\endcsname\else\donewmode{\systemmodeprefix#1}\fi
+ \csname\@mode@\systemmodeprefix#1\endcsname\enabledmode}
+
+\def\resetsystemmode#1%
+ {\ifcsname\@mode@\systemmodeprefix#1\endcsname\else\donewmode{\systemmodeprefix#1}\fi
+ \csname\@mode@\systemmodeprefix#1\endcsname\disabledmode}
+
+% \def\dosetsystemmode#1%
+% {\csname\@mode@\systemmodeprefix#1\endcsname\enabledmode}
+%
+% \def\doresetsystemmode#1%
+% {\csname\@mode@\systemmodeprefix#1\endcsname\disabledmode}
+
+% demo: trialtypesetting is a systemmode as well as an if
+
+\newsystemmode{trialtypesetting}
+
+\expandafter\let\expandafter\@@trialtypesetting\csname\@mode@\systemmodeprefix trialtypesetting\endcsname % private !
-\def\setsystemmode #1{\@EA\let\csname\@mode@\systemmodeprefix#1\endcsname\enabledmode }
-\def\resetsystemmode#1{\@EA\let\csname\@mode@\systemmodeprefix#1\endcsname\disabledmode}
+\appendtoks
+ \@@trialtypesetting\enabledmode
+\to \everysettrialtypesetting
+
+\appendtoks
+ \@@trialtypesetting\disabledmode
+\to \everyresettrialtypesetting
% user ones
-\def\preventmode{\unprotect\dopreventmode}
-\def\enablemode {\unprotect\doenablemode }
-\def\disablemode{\unprotect\dodisablemode}
+\unexpanded\def\preventmode{\unprotect\dopreventmode}
+\unexpanded\def\enablemode {\unprotect\doenablemode }
+\unexpanded\def\disablemode{\unprotect\dodisablemode}
+
+\let\definemode\disablemode % nicer
\def\dopreventmode[#1]{\protect\rawprocesscommacommand[#1]\dodopreventmode}
\def\doenablemode [#1]{\protect\rawprocesscommacommand[#1]\dodoenablemode }
\def\dodisablemode[#1]{\protect\rawprocesscommacommand[#1]\dododisablemode}
\def\dodopreventmode#1%
- {\@EA\let\csname\@mode@#1\endcsname\preventedmode}
+ {\ifcsname\@mode@#1\endcsname\else\donewmode{#1}\fi
+ \csname\@mode@#1\endcsname\preventedmode}
-\def\dodoenablemode#1% mode can be relax
- {\ifcase0\csname\@mode@#1\endcsname\relax
- \@EA\let\csname\@mode@#1\endcsname\enabledmode
+\def\dodoenablemode#1% we can speed it up by moving the new outside
+ {\ifcsname\@mode@#1\endcsname\else\donewmode{#1}\fi
+ \ifnum\csname\@mode@#1\endcsname=\preventedmode \else
+ \csname\@mode@#1\endcsname\enabledmode
\fi}
\def\dododisablemode#1%
- {\ifcase0\csname\@mode@#1\endcsname\or
- \@EA\let\csname\@mode@#1\endcsname\disabledmode
+ {\ifcsname\@mode@#1\endcsname\else\donewmode{#1}\fi
+ \ifnum\csname\@mode@#1\endcsname=\preventedmode \else
+ \csname\@mode@#1\endcsname\disabledmode
\fi}
% handy for mp
-\def\booleanmodevalue#1% can be \relax
- {\expandafter\ifx\csname\@mode@#1\endcsname\relax
- fals%
- \else\ifnum0\csname\@mode@#1\endcsname=0
- fals%
- \else
- tru%
- \fi\fi e}
+\def\booleanmodevalue#1%
+ {\ifcsname\@mode@#1\endcsname\ifcase\csname\@mode@#1\endcsname fals\else tru\fi\else fals\fi e}
% check macros
\newif\ifcheckedmode
\def\dodocheckformode#1%
- {\ifcase0\csname\@mode@#1\endcsname\or\checkedmodetrue\fi}
+ {\ifcsname\@mode@#1\endcsname\ifcase\csname\@mode@#1\endcsname\else\checkedmodetrue\fi\fi}
\def\docheckformode#1#2#3% will be sped up with a quit
{\protect\checkedmodefalse\rawprocesscommacommand[#3]\dodocheckformode
\ifcheckedmode\@EA#1\else\@EA#2\fi}
\def\dodocheckforallmodes#1%
- {\ifcase0\csname\@mode@#1\endcsname\relax\checkedmodefalse\or\or\checkedmodefalse\fi}
+ {\ifcsname\@mode@#1\endcsname\ifcase\csname\@mode@#1\endcsname\checkedmodefalse\fi\else\checkedmodefalse\fi}
\def\docheckforallmodes#1#2#3% will be sped up with a quit
{\protect\checkedmodetrue\rawprocesscommacommand[#3]\dodocheckforallmodes
@@ -164,14 +207,14 @@
%D Lets now set a mode:
-\enablemode[mkiv] \setsystemmode{mkiv}
+\enablemode[mkiv] \newsystemmode{mkiv} \setsystemmode{mkiv}
%D Setups:
\unexpanded\def\startsetups{} % to please dep checker
\unexpanded\def\stopsetups {} % to please dep checker
-\expanded
+\expanded % will become obsolete
{\long\def\@EA\noexpand\csname\e!start\v!setups\endcsname
{\begingroup\noexpand\doifnextoptionalelse
{\noexpand\dostartsetupsA\@EA\noexpand\csname\e!stop\v!setups\endcsname}
@@ -197,6 +240,15 @@
\fi
\endcsname\empty} % takes one argument
+% We can consider:
+%
+% \setvalue{\??su->\v!auto}#1{\ctxcommand{autosetup("#1")}}
+%
+% ":\letterpercent" => "->\v!auto" with "\endcsname{#1}"
+%
+% but it won't work out well with multiple setups (intercepted at the
+% lua end) that then get only one argument.
+
% the next one is meant for \c!setups situations, hence the check for
% a shortcut
@@ -206,47 +258,136 @@
\dodoprocesslocalsetups
\fi}
+% \def\dodoprocesslocalsetups
+% {\@EA\processcommalist\@EA[\tobeprocessedsetups]\dosetups}
+
+% setups=S1
+% setups=lua(S2)
+% setups=S3
+% setups={S1,lua(S2),xml(test{123}),S3}
+
\def\dodoprocesslocalsetups
- {\@EA\processcommalist\@EA[\tobeprocessedsetups]\dosetups}
+ {\ctxcommand{autosetups("\tobeprocessedsetups")}}
+
+\def\autosetups#1%
+ {\ctxcommand{autosetups("#1")}}
\edef\setupwithargument#1% saves a few expansions
{\noexpand\csname\??su:\noexpand\ifcsname\??su:#1\endcsname#1\noexpand\else\letterpercent\noexpand\fi\endcsname}
\let\directsetup\dosetups
+\let\texsetup \dosetups % nicer than \directsetup and more en par with xmlsetup and luasetup
\def\doifsetupselse#1% to be done: grid
- {\doifdefinedelse{\??su:#1}}
-
-\chardef\setupseolmode\plusone
-
-\unexpanded\def\startsetups {\xxstartsetups\plusone \stopsetups } \let\stopsetups \relax
-\unexpanded\def\startlocalsetups{\xxstartsetups\plusone \stoplocalsetups} \let\stoplocalsetups\relax
-\unexpanded\def\startrawsetups {\xxstartsetups\zerocount\stoprawsetups } \let\stoprawsetups \relax
-\unexpanded\def\startxmlsetups {\xxstartsetups\plustwo \stopxmlsetups } \let\stopxmlsetups \relax
-
-\def\xxstartsetups#1#2%
- {\begingroup\let\setupseolmode#1\doifnextoptionalelse{\dostartsetupsA#2}{\dostartsetupsB#2}}
-
-\def\dostartsetupsA#1% [ ] delimited
- {\ifcase\setupseolmode\or\catcode`\^^M\@@ignore\or\catcode`\^^M\@@ignore\catcode`\|\@@other\fi
- \dotripleempty\dostartsetups[#1]}
-
-\def\dostartsetupsB#1#2 % space delimited
- {\ifcase\setupseolmode\or\catcode`\^^M\@@ignore\or\catcode`\^^M\@@ignore\catcode`\|\@@other\fi
- \dodostartsetups#1\empty{#2}}
-
-\def\dostartsetupsC[#1][#2][#3]{\dodostartsetups#1{#2}{#3}} % [..] [..]
-\def\dostartsetupsD[#1][#2][#3]{\dodostartsetups#1\empty{#2}} % [..]
-
-\def\dostartsetups
- {\ifthirdargument\@EA\dostartsetupsC\else\@EA\dostartsetupsD\fi}
+ {\doifdefinedelse{\??su:#1}} % doto: ifcsname
-\long\def\dodostartsetups#1#2#3%
- {\long\def\dododostartsetups##1#1%
- {\endgroup
- \dodoglobal % bah
- \long\expandafter\def\csname\??su#2:#3\expandafter\endcsname\expandafter####\expandafter1\expandafter{##1}}%
- \dododostartsetups\empty} % the empty trick prevents the { } in {arg} from being eaten up
+% \startluasetups oeps
+% tex.print("DONE")
+% a = 1
+% b = 1
+% \stopluasetups
+%
+% \luasetup{oeps}
+%
+% \startsetups xxx
+% ziezo
+% \stopsetups
+%
+% \directsetup{xxx}
+%
+% \startxmlsetups zzz
+% [[#1]]
+% \stopxmlsetups
+%
+% \xmlsetup{123}{zzz}
+%
+% \startbuffer[what]
+% tex.print("DONE")
+% \stopbuffer
+%
+% \startbuffer
+% tex.print("MORE")
+% \stopbuffer
+%
+% \ctxluabuffer[what]
+%
+% \ctxluabuffer
+
+\newtoks\everydefinesetups \appendtoks
+ \catcode\endoflineasciicode \ignorecatcode
+\to \everydefinesetups
+
+\newtoks\everydefinelocalsetups \appendtoks
+ \catcode\endoflineasciicode \ignorecatcode
+\to \everydefinelocalsetups
+
+\newtoks\everydefinerawsetups \appendtoks
+ % nothing
+\to \everydefinerawsetups
+
+\newtoks\everydefinexmlsetups \appendtoks
+ \catcode\endoflineasciicode\ignorecatcode
+ \catcode\barasciicode \othercatcode
+\to \everydefinexmlsetups
+
+\newtoks\everydefineluasetups \appendtoks
+ \obeylualines
+ \obeyluatokens
+\to \everydefineluasetups
+
+\unexpanded\def\startluasetups {\begingroup\doifnextoptionalelse\dostartluasetupsA \dostartluasetupsB }
+\unexpanded\def\startxmlsetups {\begingroup\doifnextoptionalelse\dostartxmlsetupsA \dostartxmlsetupsB }
+\unexpanded\def\startrawsetups {\begingroup\doifnextoptionalelse\dostartrawsetupsA \dostartrawsetupsB }
+\unexpanded\def\startlocalsetups{\begingroup\doifnextoptionalelse\dostartlocalsetupsA\dostartlocalsetupsB}
+\unexpanded\def\startsetups {\begingroup\doifnextoptionalelse\dostartsetupsA \dostartsetupsB }
+
+\let\stopluasetups \relax
+\let\stopxmlsetups \relax
+\let\stoprawsetups \relax
+\let\stoplocalsetups \relax
+\let\stopsetups \relax
+
+\def\dodostartluasetups #1#2#3\stopluasetups {\endgroup\dodoglobal\long\@EA\def\csname\??su#1:#2\@EA\endcsname\@EA##\@EA1\@EA{#3}}
+\def\dodostartxmlsetups #1#2#3\stopxmlsetups {\endgroup\dodoglobal\long\@EA\def\csname\??su#1:#2\@EA\endcsname\@EA##\@EA1\@EA{#3}}
+\def\dodostartrawsetups #1#2#3\stoprawsetups {\endgroup\dodoglobal\long\@EA\def\csname\??su#1:#2\@EA\endcsname\@EA##\@EA1\@EA{#3}}
+\def\dodostartlocalsetups #1#2#3\stoplocalsetups{\endgroup\dodoglobal\long\@EA\def\csname\??su#1:#2\@EA\endcsname\@EA##\@EA1\@EA{#3}}
+\def\dodostartsetups #1#2#3\stopsetups {\endgroup\dodoglobal\long\@EA\def\csname\??su#1:#2\@EA\endcsname\@EA##\@EA1\@EA{#3}}
+
+\def\dostartluasetups {\ifsecondargument\@EA\dostartluasetupsC \else\@EA\dostartluasetupsD \fi}
+\def\dostartxmlsetups {\ifsecondargument\@EA\dostartxmlsetupsC \else\@EA\dostartxmlsetupsD \fi}
+\def\dostartrawsetups {\ifsecondargument\@EA\dostartrawsetupsC \else\@EA\dostartrawsetupsD \fi}
+\def\dostartlocalsetups {\ifsecondargument\@EA\dostartlocalsetupsC\else\@EA\dostartlocalsetupsD\fi}
+\def\dostartsetups {\ifsecondargument\@EA\dostartsetupsC \else\@EA\dostartsetupsD \fi}
+
+\def\dostartluasetupsA {\the\everydefineluasetups \dodoubleempty\dostartluasetups} % [ ] delimited
+\def\dostartxmlsetupsA {\the\everydefinexmlsetups \dodoubleempty\dostartxmlsetups} % [ ] delimited
+\def\dostartrawsetupsA {\the\everydefinerawsetups \dodoubleempty\dostartrawsetups} % [ ] delimited
+\def\dostartlocalsetupsA {\the\everydefinelocalsetups\dodoubleempty\dostartlocalsetups} % [ ] delimited
+\def\dostartsetupsA {\the\everydefinesetups \dodoubleempty\dostartsetups} % [ ] delimited
+
+% empty preserves inner {} (is removed by the \@EA{#3})
+
+\def\dostartluasetupsB #1 {\the\everydefineluasetups \dodostartluasetups \empty{#1}\empty} % space delimited
+\def\dostartxmlsetupsB #1 {\the\everydefinexmlsetups \dodostartxmlsetups \empty{#1}\empty} % space delimited
+\def\dostartrawsetupsB #1 {\the\everydefinerawsetups \dodostartrawsetups \empty{#1}\empty} % space delimited
+\def\dostartlocalsetupsB #1 {\the\everydefinelocalsetups\dodostartlocalsetups\empty{#1}\empty} % space delimited
+\def\dostartsetupsB #1 {\the\everydefinesetups \dodostartsetups \empty{#1}\empty} % space delimited
+
+\def\dostartluasetupsC [#1][#2]{\the\everydefineluasetups \dodostartluasetups {#1}{#2}\empty} % [..] [..]
+\def\dostartxmlsetupsC [#1][#2]{\the\everydefinexmlsetups \dodostartxmlsetups {#1}{#2}\empty} % [..] [..]
+\def\dostartrawsetupsC [#1][#2]{\the\everydefinerawsetups \dodostartrawsetups {#1}{#2}\empty} % [..] [..]
+\def\dostartlocalsetupsC[#1][#2]{\the\everydefinelocalsetups\dodostartlocalsetups{#1}{#2}\empty} % [..] [..]
+\def\dostartsetupsC [#1][#2]{\the\everydefinesetups \dodostartsetups {#1}{#2}\empty} % [..] [..]
+
+\def\dostartluasetupsD [#1][#2]{\the\everydefineluasetups \dodostartluasetups \empty{#1}\empty} % [..]
+\def\dostartxmlsetupsD [#1][#2]{\the\everydefinexmlsetups \dodostartxmlsetups \empty{#1}\empty} % [..]
+\def\dostartrawsetupsD [#1][#2]{\the\everydefinerawsetups \dodostartrawsetups \empty{#1}\empty} % [..]
+\def\dostartlocalsetupsD[#1][#2]{\the\everydefinelocalsetups\dodostartlocalsetups\empty{#1}\empty} % [..]
+\def\dostartsetupsD [#1][#2]{\the\everydefinesetups \dodostartsetups \empty{#1}\empty} % [..]
+
+\def\luasetup#1{\ctxlua{\dosetups{#1}}}
+
+% % % %
\def\systemsetupsprefix{*}
diff --git a/Master/texmf-dist/tex/context/base/core-fil.mkii b/Master/texmf-dist/tex/context/base/core-fil.mkii
index fca253a7b0c..0355920c778 100644
--- a/Master/texmf-dist/tex/context/base/core-fil.mkii
+++ b/Master/texmf-dist/tex/context/base/core-fil.mkii
@@ -128,6 +128,12 @@
%D More information on the specific modules can be found in
%D their dedicated manuals. We use \type {\next} so that we
%D can \type {\end} in modules.
+%D
+%D In \MKIV\ we load the \type {mkiv} file when there is a \type
+%D {tex} file on the same path but in \MKII\ we start with the \type
+%D {tex} file as in many cases a \type {mkii} will be the same as an
+%D (old) \type {tex} one simply because we don't update drastically
+%D (or load a mark file indirectly).
\newconditional\moduleisloaded
@@ -318,7 +324,7 @@
\startreadingfile
\startnointerference % \bgroup
\cleanupfeatures % better \setnormalcatcodes / test first
- \readfile{#2}\donothing\donothing
+ \readfile{#2.\mksuffix}\donothing\donothing
\stopnointerference % \egroup
\stopreadingfile
\doglobal\setflag{#2}}%
diff --git a/Master/texmf-dist/tex/context/base/core-fil.mkiv b/Master/texmf-dist/tex/context/base/core-fil.mkiv
index daef176d2b0..263030a9b75 100644
--- a/Master/texmf-dist/tex/context/base/core-fil.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-fil.mkiv
@@ -75,32 +75,10 @@
%D
%D The implementation shows that nesting is supported.
-\def\truefilename#1%
+\def\truefilename#1% this will move to lua
{\ifcsname\??fs#1\endcsname\expandafter\truefilename\csname\??fs#1\endcsname\else#1\fi}
%D \macros
-%D {makeshortfilename}
-%D
-%D To prevent cross platform problems with filenames, we
-%D lowercase them as well as only use the first 8~characters.
-%D
-%D \starttyping
-%D \def\domakeshortfilename[#1#2#3#4#5#6#7#8#9]%
-%D {\lowercase{\edef\shortfilename{#1#2#3#4#5#6#7#8.}}%
-%D \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
-%D
-%D \def\makeshortfilename[#1]%
-%D {\edef\fullfilename{#1.........}%
-%D \expanded{\domakeshortfilename[\fullfilename]}}
-%D \stoptyping
-%D
-%D In 2005 there is no need for the 8~character limit any more, so:
-
-\def\makeshortfilename[#1]% no need for further cleanup and shortening
- {\lowercase{\edef\shortfilename{#1.}}%
- \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
-
-%D \macros
%D {usemodule}
%D
%D Most of \CONTEXT is preloaded in the format file. Some very
@@ -115,7 +93,7 @@
%D can \type {\end} in modules.
\def\dodousemodules#1#2%
- {\ctxlua{support.usemodules("#1","#2","\truefilename{#2}")}}
+ {\ctxcommand{usemodules("#1","#2","\truefilename{#2}")}}
\def\usemodules
{\dotripleempty\dousemodules}
@@ -175,8 +153,8 @@
\fi
\let\currentmoduleparameters\empty}
-\def\moduleparameter #1#2{\executeifdefined{\??md:#1:#2}\s!empty}
-\def\currentmoduleparameter#1{\executeifdefined{\??md:\currentmodule:#1}\s!empty}
+\def\moduleparameter #1#2{\executeifdefined{\??md:#1:#2}{}}
+\def\currentmoduleparameter#1{\executeifdefined{\??md:\currentmodule:#1}{}}
\def\useluamodule [#1]{\ctxlua{dofile(resolvers.findctxfile("#1"))}}
\def\luaenvironment #1 {\ctxlua{dofile(resolvers.findctxfile("#1"))}}
@@ -215,28 +193,7 @@
%D We also support a singular call, which saves us for
%D frustrations when we do a typo.
-\let\usemodule=\usemodules
-
-% %D The definition shows that the language specific settings
-% %D are activated after loading all the modules specified.
-
-%D \macros
-%D {ifprotectbuffers, bufferprefix,
-%D TEXbufferfile, MPgraphicfile}
-%D
-%D The next switch enables protection of temporary filenames,
-%D which is needed when we process more files on one path at
-%D the same time.
-
-\newif\ifprotectbuffers
-
-\def\bufferprefix{\ifprotectbuffers\jobname-\fi}
-
-% The following filenames are defined here:
-
-\def\TEXbufferfile #1{\bufferprefix#1.\f!temporaryextension}
-\def\MPgraphicfile {\bufferprefix mp\ifMPrun run\else graph\fi} % not needed in luatex
-\def\convertMPcolorfile{\bufferprefix metacmyk.tmp}
+\let\usemodule\usemodules
%D To save memory, we implement some seldomly used commands
%D in a lazy way. Nota bene: such runtime definitions are
@@ -255,13 +212,13 @@
\startreadingfile
\startnointerference % \bgroup
\cleanupfeatures % better \setnormalcatcodes / test first
- \readfile{#2}\donothing\donothing
+ \readfile{#2.\mksuffix}\donothing\donothing
\stopnointerference % \egroup
\stopreadingfile
\doglobal\setflag{#2}}%
\ifx#1\undefined
- \writestatus\m!systems{command \string#1 not found in file #2}%
- \def#1{{\infofont[unknown command \string#1]}}%
+ \writestatus\m!system{command \string#1 not found in file #2}%
+ \gdef#1{{\infofont[unknown command \string#1]}}%
\fi
#1}
@@ -281,4 +238,6 @@
%D This module will be perfected / changed / weeded.
+\let\protectbufferstrue\relax % will go away ... now in cont-sys.tex
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/core-fnt.mkiv b/Master/texmf-dist/tex/context/base/core-fnt.mkiv
index a7c84a5a093..90dd9349649 100644
--- a/Master/texmf-dist/tex/context/base/core-fnt.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-fnt.mkiv
@@ -26,16 +26,19 @@
%D so test\compound{}test can be used instead of test||test
%D \stoptyping
-\bgroup \catcode`\|=\@@active \gdef\compound#1{|#1|} \egroup
+\bgroup \catcode\barasciicode\activecatcode \gdef\compound#1{|#1|} \egroup
%D Here we hook some code into the clean up mechanism needed
%D for verbatim data.
\appendtoks
- \disablecompoundcharacters
- \disablediscretionaries
+ \disablecompoundcharacters
+ \disablediscretionaries
\to \everycleanupfeatures
+%D The following code will me mkiv'd when needed. It's rather easy to
+%D extend the kerner with glue.
+
%D \macros
%D {stretched}
%D
@@ -151,18 +154,6 @@
\fi}
%D \macros
-%D {shiftedword, shiftedwords}
-%D
-%D Used as \type {\shiftedwords {10pt} {some text}} this macro will
-%D move
-
-% \def\shiftedword#1% #2%
-% {\raise#1\hbox} % {#2}} % officially: {\ifdim#1>\zeropoint\raise\else\lower\fi#1\hbox{#2}}
-
-% \def\shiftedwords#1#2%
-% {\processisolatedwords{#2}{\shiftedword{#1}}}
-
-%D \macros
%D {low, high, lohi, hilo}
%D
%D Although \TEX\ is pretty well aware of super- and
diff --git a/Master/texmf-dist/tex/context/base/core-ini.mkiv b/Master/texmf-dist/tex/context/base/core-ini.mkiv
index d6a72bb2614..c823c9594d6 100644
--- a/Master/texmf-dist/tex/context/base/core-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-ini.mkiv
@@ -21,14 +21,15 @@
\everypar \emptytoks
\neverypar \emptytoks
-\appendtoks \flushnotes \to \everypar
+%appendtoks \flushnotes \to \everypar
\appendtoks \synchronizesidefloats \to \everypar
\appendtoks \checkindentation \to \everypar
\appendtoks \showparagraphnumber \to \everypar
\appendtoks \restoreinterlinepenalty \to \everypar
-\appendtoks \flushmargincontents \to \everypar
-\appendtoks \flushcommentanchors \to \everypar
+%appendtoks \flushmargincontents \to \everypar
+%appendtoks \flushcommentanchors \to \everypar
+\appendtoks \flushnotes \to \everypar
\appendtoks \synchronizenotes \to \everypar
\appendtoks \OTRSETshowstatus \to \everypar
\appendtoks \flushpostponedbookmark \to \everypar
@@ -56,11 +57,4 @@
%appendtoks \setlastlinewidth \to \everyendofpar % gone, will be done in lua
\appendtoks \endgraf \to \everyendofpar
-% Todo: verbatim, xml, tex, move code to here
-
-\ifx\normalcompound\undefined \let\normalcompound=| \fi
-
-\appendtoks \catcode`|=\@@active \let|\normalcompound \to \everyTEXinputmode
-\appendtoks \catcode`|=\@@letter \to \everyXMLinputmode
-
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/core-job.lua b/Master/texmf-dist/tex/context/base/core-job.lua
index d557818bb35..f56d2ca1f2e 100644
--- a/Master/texmf-dist/tex/context/base/core-job.lua
+++ b/Master/texmf-dist/tex/context/base/core-job.lua
@@ -11,12 +11,16 @@ local ctxcatcodes, texcatcodes = tex.ctxcatcodes, tex.texcatcodes
local lower, format, find, gmatch, gsub, match = string.lower, string.format, string.find, string.gmatch, string.gsub, string.match
local concat = table.concat
+local commands, resolvers, context = commands, resolvers, context
+
-- main code
resolvers.maxreadlevel = 3
directives.register("resolvers.maxreadlevel", function(v) resolvers.maxreadlevel = tonumber(v) or resolvers.maxreadlevel end)
+local report_examodes = logs.reporter("system","examodes") -- maybe another category
+
local function exists(n)
if io.exists(n) then
return n
@@ -47,7 +51,7 @@ function resolvers.findctxfile(name,maxreadlevel)
end
end
end
- return resolvers.find_file(name) or ""
+ return resolvers.findfile(name) or ""
end
end
@@ -71,12 +75,12 @@ function commands.locatefilepath(name,maxreadlevel)
end
function commands.usepath(paths,maxreadlevel)
- resolvers.register_extra_path(paths)
+ resolvers.registerextrapath(paths)
texsprint(texcatcodes,concat(resolvers.instance.extra_paths or {}, ""))
end
function commands.usesubpath(subpaths,maxreadlevel)
- resolvers.register_extra_path(nil,subpaths)
+ resolvers.registerextrapath(nil,subpaths)
texsprint(texcatcodes,concat(resolvers.instance.extra_paths or {}, ""))
end
@@ -104,38 +108,44 @@ local function convertexamodes(str)
local data = xml.text(e)
local mode = match(label,"^mode:(.+)$")
if mode then
- texsprint(ctxcatcodes,format("\\enablemode[%s:%s]",mode,data))
+ context.enablemode { format("%s:%s",mode,data) }
end
- texsprint(ctxcatcodes,format("\\setvariable{exa:variables}{%s}{%s}",label,gsub(data,"([{}])","\\%1")))
+ context.setvariable("exa:variables",label,(gsub(data,"([{}])","\\%1")))
end
end
end
--- we need a system file option: ,. .. etc + paths but no tex lookup so resolvers.find_file is wrong here
+-- we need a system file option: ,. .. etc + paths but no tex lookup so resolvers.findfile is wrong here
function commands.loadexamodes(filename)
if not filename or filename == "" then
filename = file.removesuffix(tex.jobname)
end
- filename = resolvers.find_file(file.addsuffix(filename,'ctm')) or ""
+ filename = resolvers.findfile(file.addsuffix(filename,'ctm')) or ""
if filename ~= "" then
- commands.writestatus("examodes","loading %s",filename) -- todo: message system
+ report_examodes("loading %s",filename) -- todo: message system
convertexamodes(io.loaddata(filename))
else
- commands.writestatus("examodes","no mode file %s",filename) -- todo: message system
+ report_examodes("no mode file %s",filename) -- todo: message system
end
end
+local report_options = logs.reporter("system","options")
+
function commands.logoptionfile(name)
-- todo: xml if xml logmode
local f = io.open(name)
if f then
- texio.write_nl("log","%\n%\tbegin of optionfile\n%\n")
+ logs.pushtarget("logfile")
+ report_options("begin of optionfile")
+ report_options()
for line in f:lines() do
- texio.write("log",format("%%\t%s\n",line))
+ report_options(line)
end
- texio.write("log","%\n%\tend of optionfile\n%\n")
+ report_options()
+ report_options("end of optionfile")
f:close()
+ logs.poptarget()
end
end
@@ -148,7 +158,7 @@ end
--~ for sa in gmatch(a,"[^ ,]+") do
--~ for sb in gmatch(b,"[^ ,]+") do
--~ if sa == sb then
---~ texsprint(ctxcatcodes,"\\def\\commalistelement{",sa,"}")
+--~ context.setvalue("commalistelement",sa)
--~ return true
--~ end
--~ end
@@ -156,24 +166,24 @@ end
--~ elseif ba then
--~ for sa in gmatch(a,"[^ ,]+") do
--~ if sa == b then
---~ texsprint(ctxcatcodes,"\\def\\commalistelement{",b,"}")
+--~ context.setvalue("commalistelement",b)
--~ return true
--~ end
--~ end
--~ elseif bb then
--~ for sb in gmatch(b,"[^ ,]+") do
--~ if a == sb then
---~ texsprint(ctxcatcodes,"\\def\\commalistelement{",a,"}")
+--~ context.setvalue("commalistelement",sb)
--~ return true
--~ end
--~ end
--~ else
--~ if a == b then
---~ texsprint(ctxcatcodes,"\\def\\commalistelement{",a,"}")
+--~ context.setvalue("commalistelement",a)
--~ return true
--~ end
--~ end
---~ texsprint(ctxcatcodes,"\\let\\commalistelement\\empty")
+--~ context.letvalueempty("commalistelement")
--~ return false
--~ end
--~ local function doifinsetelse(a,b)
diff --git a/Master/texmf-dist/tex/context/base/core-job.mkii b/Master/texmf-dist/tex/context/base/core-job.mkii
index 5c280c15b14..2cd22e409a5 100644
--- a/Master/texmf-dist/tex/context/base/core-job.mkii
+++ b/Master/texmf-dist/tex/context/base/core-job.mkii
@@ -126,39 +126,43 @@
\ifx\preloadfonts \undefined \let\preloadfonts \relax \fi
\ifx\preloadspecials\undefined \let\preloadspecials\relax \fi
-\def\loadallsystemfiles#1#2%
- {\ifx\@@svdirectory\empty
- \readsysfile{#1}{\showmessage\m!systems2{#1}}{#2}%
- \else% yet undocumented
- \def\doloadsystemfile##1%
- {\readsetfile{##1}{#1}{\showmessage\m!systems2{#1}}{#2}}%
- \processcommacommand[\@@svdirectory]\doloadsystemfile
- \fi}
-
\ifx\disableXML\undefined \let\disableXML\relax \fi
+\def\doloadsystemfile#1% mkii with fallback to tex
+ {\readsysfile{#1.\mksuffix}
+ {\showmessage\m!systems2{#1.\mksuffix}}
+ {\readsysfile{#1.tex}{\showmessage\m!systems2{#1.tex}}\donothing}}
+
\def\loadsystemfiles
{\reportprotectionstate
- \readsysfile\f!newfilename{\showmessage\m!systems2\f!newfilename}\donothing
- %\readsysfile\f!oldfilename{\showmessage\m!systems2\f!oldfilename}\donothing
- \loadallsystemfiles\f!filfilename
- \donothing
- \loadallsystemfiles\f!sysfilename
- {\loadallsystemfiles{\f!sysfilename.rme}\donothing % new, fall back
- \doglobal\appendtoks % brrr better \setcatcodetable\ctxcatcodes % % test
- \bgroup\disableXML\loadallsystemfiles\f!errfilename\donothing\egroup
- \to\everygoodbye}}
+ \doloadsystemfile\f!newfilename
+ \doloadsystemfile\f!locfilename
+ \doloadsystemfile\f!expfilename
+ \readsysfile{\f!sysfilename.\mksuffix}
+ {\showmessage\m!systems2{\f!sysfilename.\mksuffix}}
+ {\readsysfile{\f!sysfilename.tex}
+ {\showmessage\m!systems2{\f!sysfilename.tex}}
+ {\readsysfile{\f!sysfilename.rme}
+ {\showmessage\m!systems2{\f!sysfilename.rme}%
+ \doglobal\appendtoks % brrr better \setcatcodetable\ctxcatcodes
+ \bgroup
+ \disableXML
+ \readsysfile{\f!errfilename.\mksuffix}\donothing\donothing
+ \egroup
+ \to\everygoodbye}%
+ \donothing}}}
%D Loading of \type {cont-usr.tex} (edited by the user)
-%D and \type {cont-fmt.tex} (generated by texexec).
-
-\def\loaduserspecifications
- {% this used to be the file where users can tune their system, especially patterns
- \readsysfile\f!usrfilename{\showmessage\m!systems2\f!usrfilename}\donothing
- % this one took care of user preferences (fonts, messages) but lm made this obsolete
- \readjobfile\f!fmtfilename{\showmessage\m!systems2\f!fmtfilename}\donothing
- % from now on we preload all patterns (only in mkii)
- \preloadallpatterns}
+%D and \type {cont-fmt.tex} (generated by texexec). This is
+%S obsolete now that we have enough memory for patterns.
+
+% \def\loaduserspecifications
+% {% this used to be the file where users can tune their system, especially patterns
+% \readsysfile\f!usrfilename{\showmessage\m!systems2\f!usrfilename}\donothing
+% % this one took care of user preferences (fonts, messages) but lm made this obsolete
+% \readjobfile\f!fmtfilename{\showmessage\m!systems2\f!fmtfilename}\donothing
+% % from now on we preload all patterns (only in mkii)
+% \preloadallpatterns}
\let\loaduserspecifications\relax
diff --git a/Master/texmf-dist/tex/context/base/core-job.mkiv b/Master/texmf-dist/tex/context/base/core-job.mkiv
index de328c92bca..db8d3ed933e 100644
--- a/Master/texmf-dist/tex/context/base/core-job.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-job.mkiv
@@ -43,7 +43,7 @@
\def\dostarttextfile#1%
{\global\advance\fileprocesslevel\plusone
\setxvalue{\c!file::\number\fileprocesslevel}{#1}%
- \@EA\doglobal\@EA\addtocommalist\@EA{#1}\processedfiles}
+ \doglobal\addtocommalist{#1}\processedfiles}
\def\dostoptextfile
{\global\advance\fileprocesslevel\minusone}
@@ -51,53 +51,35 @@
\def\processlocalfile#1#2%
{#1{#2}\donothing{\readfile{#2}\donothing\donothing}}
-\def\processfile #1{\ctxlua{commands.processfile("#1")}}
-\def\doifinputfileelse #1{\ctxlua{commands.doifinputfileelse("#1")}}
-\def\locatefilepath #1{\edef\locatedfilepath{\ctxlua{commands.locatefilepath("#1")}}}
-\def\usepath [#1]{\edef\allinputpaths{\ctxlua{commands.usepath("#1")}}}
-\def\usesubpath [#1]{\edef\allinputpaths{\ctxlua{commands.usesubpath("#1")}}}
+\def\processfile #1{\ctxcommand{processfile("#1")}}
+\def\doifinputfileelse #1{\ctxcommand{doifinputfileelse("#1")}}
+\def\locatefilepath #1{\edef\locatedfilepath{\ctxcommand{locatefilepath("#1")}}}
+\def\usepath [#1]{\edef\allinputpaths{\ctxcommand{usepath("#1")}}}
+\def\usesubpath [#1]{\edef\allinputpaths{\ctxcommand{usesubpath("#1")}}}
\def\usezipfile {\dodoubleempty\dousezipfile}
-\def\dousezipfile[#1][#2]{\ctxlua{commands.usezipfile("#1","#2")}} % [filename] [optional subtree]
-
+\def\dousezipfile[#1][#2]{\ctxcommand{usezipfile("#1","#2")}} % [filename] [optional subtree]
\def\loadexamodes {\dosingleempty\doloadexamodes}
-\def\doloadexamodes [#1]{\ctxlua{commands.loadexamodes("#1")}}
+\def\doloadexamodes [#1]{\ctxcommand{loadexamodes("#1")}}
\def\registerfileinfo[#1#2]#3% geen \showmessage ?
- {\writestatus\m!systems{#1#2 file #3 at line \the\inputlineno}}
-
-\ifx\preloadfonts \undefined \let\preloadfonts \relax \fi
-\ifx\preloadspecials\undefined \let\preloadspecials\relax \fi
-
-\def\loadallsystemfiles#1#2%
- {\ifx\@@svdirectory\empty
- \readsysfile{#1}{\showmessage\m!systems2{#1}}{#2}%
- \else% yet undocumented
- \def\doloadsystemfile##1%
- {\readsetfile{##1}{#1}{\showmessage\m!systems2{#1}}{#2}}%
- \processcommacommand[\@@svdirectory]\doloadsystemfile
- \fi}
+ {\writestatus\m!system{#1#2 file #3 at line \the\inputlineno}}
-\ifx\disableXML\undefined \let\disableXML\relax \fi
+\def\doloadsystemfile#1% only mkiv files
+ {\readsysfile{#1.\mksuffix}{\showmessage\m!system2{#1.\mksuffix}}\donothing}
\def\loadsystemfiles
- {\reportprotectionstate
- \readsysfile\f!newfilename{\showmessage\m!systems2\f!newfilename}\donothing
- %\readsysfile\f!oldfilename{\showmessage\m!systems2\f!oldfilename}\donothing
- \loadallsystemfiles\f!filfilename
- \donothing
- \loadallsystemfiles\f!sysfilename
- {\loadallsystemfiles{\f!sysfilename.rme}\donothing % new, fall back
- \doglobal\appendtoks % brrr better \setcatcodetable\ctxcatcodes % % test
- \bgroup\disableXML\loadallsystemfiles\f!errfilename\donothing\egroup
- \to\everygoodbye}}
+ {\doloadsystemfile\f!newfilename % new code, to be integrated at some point, plus fixes posted on the list
+ \doloadsystemfile\f!locfilename % new code, somewhat experimental, not distributed (outside the dev group)
+ \doloadsystemfile\f!expfilename % new code, very experimental, can be engine specific, mostly for me only
+ \doloadsystemfile\f!sysfilename} % local settings, but probably not that good an idea to use
%D We don't want multiple jobfiles to interfere.
-\def\loadoptionfile
+\def\loadoptionfile % todo : mark document.* tables as storage
{\readjobfile{\jobname.\f!optionextension}
- {\showmessage\m!systems2{\jobname.\f!optionextension}%
- \ctxlua{commands.logoptionfile("\jobname.\f!optionextension")}}%
- {\writestatus\m!systems {no \jobname.\f!optionextension}}}
+ {\writestatus\m!system{\jobname.\f!optionextension\space loaded}%
+ \ctxcommand{logoptionfile("\jobname.\f!optionextension")}}%
+ {\writestatus\m!system{no \jobname.\f!optionextension}}}
% Most natural ...
%
@@ -137,7 +119,7 @@
\fi}
\def\forcequitjob#1%
- {\writestatus\m!systems{forcing quit: #1}%
+ {\writestatus\m!system{forcing quit: #1}%
\batchmode
\dorecurse\textlevel{\stoptext}
\normalend}
@@ -147,7 +129,7 @@
\def\autostarttext
{\ifcase\textlevel
\starttext
- \writestatus\m!systems{auto \string\starttext..\string\stoptext}%
+ \writestatus\m!system{auto \string\starttext..\string\stoptext}%
\let\autostoptext\stoptext
\fi}
@@ -164,15 +146,15 @@
\let\end\finalend
\def\emergencyend
- {\writestatus\m!systems{invalid \@EA\string\csname\e!start\v!text\endcsname...\@EA\string\csname\e!stop\v!text\endcsname\space structure}%
+ {\writestatus\m!system{invalid \@EA\string\csname\e!start\v!text\endcsname...\@EA\string\csname\e!stop\v!text\endcsname\space structure}%
\stoptext}
\def\currentfile{\inputfilename}
\def\doexecutefileonce#1%
{\beforesplitstring#1\at.\to\currentfile
- \fullexpandtwoargsafter\doifnotinset\currentfile\loadedfiles
- {\fullexpandoneargafter\addtocommalist\currentfile\loadedfiles
+ \doifnotinset\currentfile\loadedfiles
+ {\addtocommalist\currentfile\loadedfiles
\doexecutefile{#1}}}
\def\doexecutefile#1%
@@ -185,21 +167,34 @@
\def\donotexecutefile#1%
{}
-\def\useenvironment[#1]% maybe commalist
- {\environment #1 \relax}
+\unexpanded\def\project {\doifnextoptionalelse\useproject \redoproject}
+\unexpanded\def\environment{\doifnextoptionalelse\useenvironment\redoenvironment}
+\unexpanded\def\product {\doifnextoptionalelse\useproduct \redoproduct}
+\unexpanded\def\component {\doifnextoptionalelse\usecomponent \redocomponent}
+
+\def\redoproject #1 {\useproject [#1]}
+\def\redoenvironment #1 {\useenvironment[#1]}
+\def\redoproduct #1 {\useproduct [#1]}
+\def\redocomponent #1 {\usecomponent [#1]}
-\def\environment #1 % at outermost level only (load only once)
- {\pushmacro\startenvironment
+\def\useproject[#1]%
+ {}
+
+\def\useenvironment[#1]% maybe commalist
+ {\pushmacro\dostartenvironment % we could use a depth counter
\pushmacro\stopenvironment
- \unexpanded\def\startenvironment ##1 {}%
+ \unexpanded\def\dostartenvironment[##1]{}%
\let\stopenvironment\relax
\startreadingfile
\doexecutefileonce{#1}
\stopreadingfile
\popmacro\stopenvironment
- \popmacro\startenvironment}
+ \popmacro\dostartenvironment}
-\def\component #1 % at outermost level only
+\def\useproduct[#1]%
+ {}
+
+\def\usecomponent[#1]%
{\dostarttextfile{#1}%
\processfile{#1}%
\dostoptextfile}
@@ -209,7 +204,7 @@
\let\currentcomponent \v!text
\let\currentcomponentpath\f!currentpath
-\def\donextlevel#1#2#3#4#5#6#7\\%
+\def\donextlevel#1#2#3#4#5#6#7\\% we will move this to lua
{\pushmacro\currentcomponent
\pushmacro\currentcomponentpath
\let\currentcomponent#1%
@@ -223,13 +218,13 @@
\beforesplitstring#7\at.\to#2\relax % can become path + base
\ifcase\filelevel\relax
\starttext
- \def\project ##1 {#3{##1}}%
- \def\environment ##1 {#4{##1}}%
- \def\product ##1 {#5{##1}}%
- \def\component ##1 {#6{##1}}%
+ \unexpanded\def\useproject [##1]{#3{##1}}%
+ \unexpanded\def\useenvironment[##1]{#4{##1}}%
+ \unexpanded\def\useproduct [##1]{#5{##1}}%
+ \unexpanded\def\usecomponent [##1]{#6{##1}}%
\fi
\advance\filelevel\plusone
- \fullexpandoneargafter\addtocommalist{#1}\loadedfiles}
+ \addtocommalist{#1}\loadedfiles}
\def\doprevlevel
{\popmacro\currentcomponentpath
@@ -242,24 +237,34 @@
\expandafter\endinput
\fi}
-\unexpanded\def\startproject #1 %
+\unexpanded\def\startproject {\doifnextoptionalelse\dostartproject \redostartproject}
+\unexpanded\def\startenvironment{\doifnextoptionalelse\dostartenvironment\redostartenvironment}
+\unexpanded\def\startproduct {\doifnextoptionalelse\dostartproduct \redostartproduct}
+\unexpanded\def\startcomponent {\doifnextoptionalelse\dostartcomponent \redostartcomponent}
+
+\def\redostartproject #1 {\dostartproject [#1]}
+\def\redostartenvironment #1 {\dostartenvironment[#1]}
+\def\redostartproduct #1 {\dostartproduct [#1]}
+\def\redostartcomponent #1 {\dostartcomponent [#1]}
+
+\def\dostartproject[#1]%
{\donextlevel\v!project\currentproject
\donotexecutefile\doexecutefileonce
\doexecutefileonce\doexecutefile#1\\}
-\unexpanded\def\startproduct #1 %
+\def\dostartproduct[#1]%
{\doateverystarttext
\donextlevel\v!product\currentproduct
\doexecutefileonce\doexecutefileonce
\donotexecutefile\doexecutefile#1\\}
-\unexpanded\def\startcomponent #1 %
+\def\dostartcomponent[#1]%
{\doateverystarttext
\donextlevel\v!component\currentcomponent
\doexecutefileonce\doexecutefileonce
\donotexecutefile\doexecutefile#1\\}
-\unexpanded\def\startenvironment #1 %
+\def\dostartenvironment[#1]%
{\donextlevel\v!environment\currentenvironment
\donotexecutefile\doexecutefileonce
\donotexecutefile\donotexecutefile#1\\}
@@ -280,26 +285,25 @@
{\let\loadedlocalenvironments\empty
\def\docommand##1%
{\beforesplitstring##1\at.\to\someevironment
- \fullexpandoneargafter\addtocommalist\someevironment\loadedlocalenvironments}%
+ \addtocommalist\someevironment\loadedlocalenvironments}%
\processcommalist[#1]\docommand
- \fullexpandtwoargsafter\doifcommonelse % no longer next needed
- {\currentproject,\currentproduct,%
- \currentcomponent,\currentenvironment}
- {\loadedlocalenvironments}
+ \doifcommonelse{\currentproject,\currentproduct,\currentcomponent,\currentenvironment}\loadedlocalenvironments
{\letvalue{\e!stop\v!localenvironment}\relax}
- {\grabuntil{\e!stop\v!localenvironment}\gobbleoneargument}} % TH: fixed, was \relax
+ {\grabuntil{\e!stop\v!localenvironment}\gobbleoneargument}}
+
+\setvalue{\v!localenvironment}{\doifnextoptionalelse\uselocalenvironment\redolocalenvironment}
+
+\def\redolocalenvironment#1 {\uselocalenvironment[#1]}
-\setvalue{\v!localenvironment}#1 {\doexecutefileonce{#1}}
-
-% NOT TOEVOEGEN: \the\everytrace
+\def\uselocalenvironment[#1]{\doexecutefileonce{#1}}
-\neverypar\emptytoks
+\neverypar\emptytoks % here ?
% \appendtoks \flushnotes \to \everypar
% \appendtoks \synchronizesidefloats \to \everypar
% \appendtoks \checkindentation \to \everypar
% \appendtoks \showparagraphnumber \to \everypar
-% \appendtoks \flushmargincontents \to \everypar
+% %appendtoks \flushmargincontents \to \everypar
% \appendtoks \flushcommentanchors \to \everypar
% \appendtoks \synchronizenotes \to \everypar
diff --git a/Master/texmf-dist/tex/context/base/core-mis.mkii b/Master/texmf-dist/tex/context/base/core-mis.mkii
index 98079830d16..6d77ef18eca 100644
--- a/Master/texmf-dist/tex/context/base/core-mis.mkii
+++ b/Master/texmf-dist/tex/context/base/core-mis.mkii
@@ -54,6 +54,8 @@
\appendtoks \def\MetaFun{MetaFun}\to\simplifiedcommands
%appendtoks \def||{-}\to\simplifiedcommands
\appendtoks \def|#1|{\ifx#1\empty\empty-\else#1\fi}\to\simplifiedcommands
+\appendtoks \let\crlf\space\to\simplifiedcommands
+\appendtoks \let\\\space\to\simplifiedcommands
\appendtoks\let\buildtextaccent\secondoftwoarguments\to\simplifiedcommands
@@ -1425,12 +1427,12 @@
[\c!bet=\unknown,\c!dat=\unknown,\c!ken=\unknown,
\c!from=,\c!to=,\c!ref=,#1]%
% moet anders, hoort niet in 01b
- \assigntranslation[\s!nl=referentie,\s!en=reference,\s!de=Referenz,\s!sp=referencia]\to\@@@kmref
- \assigntranslation[\s!nl=van,\s!en=from,\s!de=Von,\s!sp=de]\to\@@@kmvan
- \assigntranslation[\s!nl=aan,\s!en=to,\s!de=An,\s!sp=a]\to\@@@kmaan
- \assigntranslation[\s!nl=betreft,\s!en=concerns,\s!de=Betreff,\s!sp=]\to\@@@kmbet
- \assigntranslation[\s!nl=datum,\s!en=date,\s!de=Datum,\s!sp=fecha]\to\@@@kmdat
- \assigntranslation[\s!nl=kenmerk,\s!en=mark,\s!de=Kennzeichen,\s!sp=]\to\@@@kmken
+ \assigntranslation[\s!nl=referentie,\s!en=reference,\s!de=Referenz,\s!hr=referenca,\s!sp=referencia]\to\@@@kmref
+ \assigntranslation[\s!nl=van,\s!en=from,\s!de=Von,\s!hr=od,\s!sp=de]\to\@@@kmvan
+ \assigntranslation[\s!nl=aan,\s!en=to,\s!de=An,\s!hr=za,\s!sp=a]\to\@@@kmaan
+ \assigntranslation[\s!nl=betreft,\s!en=concerns,\s!de=Betreff,\s!hr=predmet,\s!sp=]\to\@@@kmbet
+ \assigntranslation[\s!nl=datum,\s!en=date,\s!de=Datum,\s!hr=datum,\s!sp=fecha]\to\@@@kmdat
+ \assigntranslation[\s!nl=kenmerk,\s!en=mark,\s!de=Kennzeichen,\s!hr=oznaka,\s!sp=]\to\@@@kmken
%
\definetabulate[\s!dummy][|l|p|]
\startdummy
@@ -2697,6 +2699,7 @@
\setuplabeltext [\s!nl] [and-1=\textcomma\ , and-2= en ]
\setuplabeltext [\s!en] [and-1=\textcomma\ , and-2=\textcomma\ and ]
\setuplabeltext [\s!de] [and-1=\textcomma\ , and-2= und ]
+\setuplabeltext [\s!hr] [and-1=\textcomma\ , and-2= i ]
%D \macros
%D {somekindoftab}
diff --git a/Master/texmf-dist/tex/context/base/core-mis.mkiv b/Master/texmf-dist/tex/context/base/core-mis.mkiv
index e2bd28bd511..06ee5b6173d 100644
--- a/Master/texmf-dist/tex/context/base/core-mis.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-mis.mkiv
@@ -21,7 +21,7 @@
% %D
% %D Obsolete now:
% %
-% % \def\documentstyle{\showmessage\m!systems3\empty\stoptekst}
+% % \def\documentstyle{\showmessage\m!system3\empty\stoptekst}
% %
% % \let\documentclass=\documentstyle
% %D \macros
@@ -196,72 +196,6 @@
\c!inbetween={\blank[\v!medium]},
\c!after=\blank]
-% \definieerplaats[naam][instellingen]
-% \stelplaatsin[naam][instellingen]
-% \plaats<naam>[[instellingen]]
-%
-% - still undocumented and also not in setupb yet
-% - kan ook intern/direct (scheelt duplicatie), zie \framedtext
-
-\def\dodefineplacement[#1][#2]%
- {\getparameters
- [\??pl#1]
- [\c!left=\hss,
- \c!right=\hss,
- \c!linecorrection=\v!off,
- \c!depthcorrection=\v!off,
- \c!margin=\v!standard,
- \c!grid=\v!middle,
- %\c!before=,
- %\c!after=,
- #2]%
- \setvalue{\e!place#1}{\doplacement[\??pl#1]}}
-
-\unexpanded\def\defineplacement
- {\dodoubleempty\dodefineplacement}
-
-\unexpanded\def\setupplacement
- {\dodoubleempty\dosetupplacement}
-
-\def\dosetupplacement[#1]%
- {\dodoubleempty\getparameters[\??pl#1]}
-
-\def\doplacement
- {\dodoubleempty\dodoplacement}
-
-\def\dodoplacement[#1][#2]% correctie moet mooier
- {\bgroup
- \dowithnextboxcontent
- {\forgetall}
- {\setlocalhsize
- \getparameters[#1][#2]%
- \getvalue{#1\c!before}%
- \begingroup
- \disableparpositions
- \setbox\nextbox\hbox to \localhsize
- {\getvalue{#1\c!left}%
- \flushnextbox
- \getvalue{#1\c!right}}%
- \ifinsidefloat \else
- \addlocalbackgroundtobox\nextbox
- \fi
- \ifgridsnapping
- \doifundefined{#1\c!grid}{\letvalue{#1\c!grid}\v!middle}%
- % unchecked
- \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent
- \snaptogrid[\getvalue{#1\c!grid}]\hbox{\flushnextbox}%
- \else
- \doifvalue{#1\c!linecorrection}\v!on \startbaselinecorrection
- \doifinset{\getvalue{#1\c!margin}}{\v!standard,\v!yes}\noindent
- \flushnextbox
- \doifvalue{#1\c!depthcorrection}\v!on\baselinecorrection
- \doifvalue{#1\c!linecorrection }\v!on\stopbaselinecorrection
- \fi
- \endgroup
- \getvalue{#1\c!after}%
- \egroup}
- \vbox}
-
% Te zijner tijd [plaats=boven,onder,midden] implementeren,
% in dat geval moet eerst de maximale hoogte worden bepaald.
%
@@ -292,7 +226,7 @@
\setvalue{\e!start\currentparagraph}%
{\bgroup
\edef\currentparagraph{#1}%
- \letvalue{\s!do\s!next\currentparagraph}\empty
+ \letvalueempty{\s!do\s!next\currentparagraph}%
\setvalue{\e!stop\currentparagraph}{\getvalue\currentparagraph\egroup}%
\getvalue\currentparagraph}%
\getparameters[\??al\currentparagraph]%
@@ -576,8 +510,8 @@
\unexpanded\def\ongeveer
{\mathematics\pm}
-
-\chardef\boundarycharactermode\plusone
+
+\setnewconstant\boundarycharactermode\plusone
\def\midboundarycharacter#1#2%
{\ifcase\boundarycharactermode
@@ -590,7 +524,7 @@
\or
\languageparameter#1%
\fi
- \chardef\boundarycharactermode\plusone}
+ \boundarycharactermode\plusone}
\def\leftboundarycharacter#1#2%
{\ifcase\boundarycharactermode
@@ -601,7 +535,7 @@
\or
\languageparameter#1%
\fi
- \chardef\boundarycharactermode\plusone}
+ \boundarycharactermode\plusone}
\def\rightboundarycharacter#1#2%
{\ifcase\boundarycharactermode
@@ -612,7 +546,7 @@
\or
\languageparameter#1%
\fi
- \chardef\boundarycharactermode\plusone}
+ \boundarycharactermode\plusone}
% actually this is pretty old, but temporary moved here
%
@@ -706,11 +640,13 @@
\ifnum\subsentencelevel=\plusone
\dontleavehmode % was \leaveoutervmode
\fi
+ \dostarttagged\t!subsentence\empty
\symbol[\ifodd\subsentencelevel\c!leftsentence\else\c!leftsubsentence\fi]%
}% \ignorespaces}
\def\endofsubsentence % relax prevents space gobbling
{\symbol[\ifodd\subsentencelevel\c!rightsentence\else\c!rightsubsentence\fi]%
+ \dostoptagged
\global\advance\subsentencelevel\minusone
\unskip
\kern\subsentencesignal\relax
@@ -741,23 +677,7 @@
\unexpanded\def\startsubsentence{\beginofsubsentence \prewordbreak\beginofsubsentencespacing}
\unexpanded\def\stopsubsentence {\endofsubsentencespacing\prewordbreak\endofsubsentence}
-
-%D \defineXMLenvironment [subsentence]
-%D {|<|}
-%D {|>|}
-%D \defineXMLenvironment [subsentence]
-%D {\directdiscretionary{<}}
-%D {\directdiscretionary{>}}
-%D \defineXMLenvironment [subsentence]
-%D {\startsubsentence}
-%D {\stopsubsentence}
-%D
-%D \startbuffer
-%D test <subsentence>test</subsentence> test
-%D \stopbuffer
-%D
-%D \typebuffer
-%D \processXMLbuffer
+\unexpanded\def\subsentence {\groupedcommand\startsubsentence\stopsubsentence}
\enableactivediscretionaries
@@ -885,6 +805,7 @@
\unexpanded\def\startdelimitedtext[#1]%
{\bgroup
\pushdelimitedtext{#1}%
+ \dostarttagged\t!delimitedblock\currentdelimitedtext
\doifelse{\delimitedtextparameter\c!method}\s!font
{\def\dostopdelimitedtext
{\removeunwantedspaces\ignoredelimitedtext\c!right}%
@@ -895,39 +816,6 @@
\doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
{\dosingleempty\dostartdelimitedtextpar}\dostartdelimitedtexttxt}}
-% \def\dostartdelimitedtextpar[#1]%
-% {\let\dostopdelimitedtext\dostopdelimitedtextpar
-% \doifsomething{\delimitedtextparameter\c!spacebefore}
-% {\blank[\delimitedtextparameter\c!spacebefore]}%
-% \delimitedtextparameter\c!before
-% % nicer:
-% % \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
-% % \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
-% % backward compatible:
-% \doifelsenothing{#1}
-% {\endgraf
-% \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
-% \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
-% \let\dodostopdelimitedtextpar\endgraf}
-% {\startnarrower[#1]\let\dodostopdelimitedtextpar\stopnarrower}%
-% % so far
-% % \dochecknextindentation{\??ci\currentdelimitedtext}% AM: not here
-% \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
-% \leftdelimitedtextmark
-% \ignorespaces}
-
-% \def\dostopdelimitedtextpar
-% {\removeunwantedspaces
-% \removelastskip
-% \rightdelimitedtextmark
-% \dostopattributes
-% \dodostopdelimitedtextpar
-% \delimitedtextparameter\c!after
-% \doifsomething{\delimitedtextparameter\c!spaceafter}
-% {\blank[\delimitedtextparameter\c!spaceafter]}%
-% \dochecknextindentation{\??ci\currentdelimitedtext}% AM: here
-% \dorechecknextindentation}% AM: This was missing!
-
\def\dostartdelimitedtextpar[#1]%
{\let\dostopdelimitedtext\dostopdelimitedtextpar
\doifsomething{\delimitedtextparameter\c!spacebefore}
@@ -978,6 +866,7 @@
\unexpanded\def\stopdelimitedtext
{\dostopdelimitedtext
+ \dostoptagged
\popdelimitedtext
\egroup}
@@ -1113,35 +1002,56 @@
\def\handlerightdelimitedtext#1%
{\dohandlerightdelimitedtext{#1}\relax}
+% \unexpanded\def\dodelimitedtextpar
+% {\dohandleleftdelimitedtext\c!left\relax
+% \groupedcommand
+% \donothing
+% {\dohandlerightdelimitedtext\c!right\removelastskip
+% \popdelimitedtext}}
+
\unexpanded\def\dodelimitedtextpar
- {\dohandleleftdelimitedtext\c!left\relax
- \groupedcommand
- \donothing
+ {\groupedcommand
+ {\dostarttagged\t!delimited\currentdelimitedtext % block?
+ \dohandleleftdelimitedtext\c!left\relax}
{\dohandlerightdelimitedtext\c!right\removelastskip
+ \dostoptagged
\popdelimitedtext}}
\unexpanded\def\dodelimitedtexttxt
{\doifelse{\delimitedtextparameter\c!style}\v!normal
\doquoteddelimited\doattributeddelimited}
+% \def\doquoteddelimited
+% {\dohandleleftdelimitedtext\c!left\relax
+% \groupedcommand
+% \donothing
+% {\dohandlerightdelimitedtext\c!right
+% \removelastskip
+% \popdelimitedtext}}
+
\def\doquoteddelimited
- {\dohandleleftdelimitedtext\c!left\relax
- \groupedcommand
- \donothing
+ {\groupedcommand
+ {\dostarttagged\t!delimited\currentdelimitedtext
+ \dohandleleftdelimitedtext\c!left\relax}
{\dohandlerightdelimitedtext\c!right
\removelastskip
+ \dostoptagged
\popdelimitedtext}}
\def\doattributeddelimited
{\groupedcommand
- {\dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color}
+ {\dostarttagged\t!delimited\currentdelimitedtext
+ \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color}
{\dostopattributes
+ \dostoptagged
\popdelimitedtext}}
\def\dofontdrivendelimited
{\simplegroupedcommand
- {\languageparameter{\c!left\currentdelimitedtext}}
+ {\dostarttagged\t!delimited\currentdelimitedtext
+ \languageparameter{\c!left\currentdelimitedtext}}
{\languageparameter{\c!right\currentdelimitedtext}%
+ \dostoptagged
\popdelimitedtext}}
% testcase for nesting:
@@ -1330,12 +1240,12 @@
[\c!bet=\unknown,\c!dat=\unknown,\c!ken=\unknown,
\c!from=,\c!to=,\c!ref=,#1]%
% moet anders, hoort niet in 01b
- \assigntranslation[\s!nl=referentie,\s!en=reference,\s!de=Referenz,\s!sp=referencia]\to\@@@kmref
- \assigntranslation[\s!nl=van,\s!en=from,\s!de=Von,\s!sp=de]\to\@@@kmvan
- \assigntranslation[\s!nl=aan,\s!en=to,\s!de=An,\s!sp=a]\to\@@@kmaan
- \assigntranslation[\s!nl=betreft,\s!en=concerns,\s!de=Betreff,\s!sp=]\to\@@@kmbet
- \assigntranslation[\s!nl=datum,\s!en=date,\s!de=Datum,\s!sp=fecha]\to\@@@kmdat
- \assigntranslation[\s!nl=kenmerk,\s!en=mark,\s!de=Kennzeichen,\s!sp=]\to\@@@kmken
+ \assigntranslation[\s!nl=referentie,\s!en=reference,\s!de=Referenz,\s!hr=referenca,\s!sp=referencia]\to\@@@kmref
+ \assigntranslation[\s!nl=van,\s!en=from,\s!de=Von,\s!hr=od,\s!sp=de]\to\@@@kmvan
+ \assigntranslation[\s!nl=aan,\s!en=to,\s!de=An,\s!hr=za,\s!sp=a]\to\@@@kmaan
+ \assigntranslation[\s!nl=betreft,\s!en=concerns,\s!de=Betreff,\s!hr=predmet,\s!sp=]\to\@@@kmbet
+ \assigntranslation[\s!nl=datum,\s!en=date,\s!de=Datum,\s!hr=datum,\s!sp=fecha]\to\@@@kmdat
+ \assigntranslation[\s!nl=kenmerk,\s!en=mark,\s!de=Kennzeichen,\s!hr=oznaka,\s!sp=]\to\@@@kmken
%
\definetabulate[\s!dummy][|l|p|]
\startdummy
@@ -1647,31 +1557,34 @@
\let\next=}
\hbox}
+\setnewconstant\pairedlocationa\plusone
+\setnewconstant\pairedlocationb\plusfour
+
\def\beforefirstpairedbox
- {\chardef\pairedlocationa1 % left
- \chardef\pairedlocationb4 % middle
+ {\pairedlocationa\plusone % left
+ \pairedlocationb\plusfour % middle
\getfromcommacommand[\@@ldlocation][1]%
\processaction
[\commalistelement]
- [ \v!left=>\chardef\pairedlocationa0,
- \v!right=>\chardef\pairedlocationa1,
- \v!top=>\chardef\pairedlocationa2,
- \v!bottom=>\chardef\pairedlocationa3]%
+ [ \v!left=>\pairedlocationa\zerocount,
+ \v!right=>\pairedlocationa\plusone,
+ \v!top=>\pairedlocationa\plustwo,
+ \v!bottom=>\pairedlocationa\plusthree]%
\getfromcommacommand[\@@ldlocation][2]%
\processaction
[\commalistelement]
- [ \v!left=>\chardef\pairedlocationb0,
- \v!right=>\chardef\pairedlocationb1,
- \v!high=>\chardef\pairedlocationb2,
- \v!top=>\chardef\pairedlocationb2,
- \v!low=>\chardef\pairedlocationb3,
- \v!bottom=>\chardef\pairedlocationb3,
- \v!middle=>\chardef\pairedlocationb4]}
+ [ \v!left=>\pairedlocationb\zerocount,
+ \v!right=>\pairedlocationb\plusone,
+ \v!high=>\pairedlocationb\plustwo,
+ \v!top=>\pairedlocationb\plustwo,
+ \v!low=>\pairedlocationb\plusthree,
+ \v!bottom=>\pairedlocationb\plusthree,
+ \v!middle=>\pairedlocationb\plusfour]}
\def\betweenbothpairedboxes
{\switchtobodyfont[\@@ldbodyfont]% split under same regime
\setbox\firstpairedbox\flushnextbox
- \ifnum\pairedlocationa<2
+ \ifnum\pairedlocationa<\plustwo
\hsize\wd\firstpairedbox % trick
\hsize\@@ldwidth
\scratchdimen\wd\firstpairedbox
@@ -1700,9 +1613,9 @@
\else
\flushnextbox
\fi}%
- \ifnum\pairedlocationa<2\hbox\else\vbox\fi\bgroup % hide vsize
+ \ifnum\pairedlocationa<\plustwo\hbox\else\vbox\fi\bgroup % hide vsize
\forgetall
- \ifnum\pairedlocationa<2
+ \ifnum\pairedlocationa<\plustwo
\scratchdimen\maxoftwoboxdimens\ht\firstpairedbox\secondpairedbox
\vsize\scratchdimen
\ifdim\scratchdimen<\@@ldheight\relax % can be \vsize
@@ -1727,9 +1640,9 @@
\fi
\ifdim\scratchdimen>\ht\secondpairedbox
\setbox\secondpairedbox\vbox to \scratchdimen
- {\ifnum\pairedlocationa=3 \vss\fi %
+ {\ifnum\pairedlocationa=\plusthree \vss\fi %
\box\secondpairedbox
- \ifnum\pairedlocationa=2 \vss\fi}% \kern\zeropoint
+ \ifnum\pairedlocationa=\plustwo \vss\fi}% \kern\zeropoint
\fi
\fi
\ifcase\pairedlocationa
@@ -1833,6 +1746,7 @@
\doifelse{\combinationparameter\c!height}\v!fit
\vbox {\vbox to \combinationparameter\c!height}%
\bgroup
+\let\combination\empty % permits \combination{}{} handy for cld
\expanded{\dodostartcombination[\currentcombinationspec]}}
\long\def\dodostartcombination[#1*#2*#3]%
@@ -2011,7 +1925,7 @@
\def\dostartfloatcombination[#1][#2]%
{\vbox\bgroup
%\insidecolumnstrue % trick, forces no centering, todo: proper switch/feature
- \chardef\postcenterfloatmethod\zerocount
+ \postcenterfloatmethod\zerocount
\forcelocalfloats
\unexpanded\def\stopfloatcombination
{\scratchtoks\emptytoks
@@ -2357,7 +2271,7 @@
%D character and the fractional digits (we use 57 as
%D sample). Here we combine all methods in one macros.
-\chardef\vulgarfractionmethod=3
+\setnewconstant\vulgarfractionmethod\plusthree
\definehspace[vulgarfraction][.25em] % [.15em]
\definesymbol[vulgarfraction][/] % [\raise.2ex\hbox{/}]
@@ -2390,10 +2304,10 @@
%D \HL
%D \NC \bf method \NC \bf visualization \NC\NR
%D \HL
-%D \NC 0 \NC \chardef\vulgarfractionmethod0\vulgarfraction{1}{2} \NC\NR
-%D \NC 1 \NC \chardef\vulgarfractionmethod1\vulgarfraction{1}{2} \NC\NR
-%D \NC 2 \NC \chardef\vulgarfractionmethod2\vulgarfraction{1}{2} \NC\NR
-%D \NC 3 \NC \chardef\vulgarfractionmethod3\vulgarfraction{1}{2} \NC\NR
+%D \NC 0 \NC \vulgarfractionmethod0 \vulgarfraction{1}{2} \NC\NR
+%D \NC 1 \NC \vulgarfractionmethod1 \vulgarfraction{1}{2} \NC\NR
+%D \NC 2 \NC \vulgarfractionmethod2 \vulgarfraction{1}{2} \NC\NR
+%D \NC 3 \NC \vulgarfractionmethod3 \vulgarfraction{1}{2} \NC\NR
%D \HL
%D \stoptabulate
@@ -2460,6 +2374,7 @@
\setuplabeltext [\s!nl] [and-1=\textcomma\ , and-2= en ]
\setuplabeltext [\s!en] [and-1=\textcomma\ , and-2=\textcomma\ and ]
\setuplabeltext [\s!de] [and-1=\textcomma\ , and-2= und ]
+\setuplabeltext [\s!hr] [and-1=\textcomma\ , and-2= i ]
%D \macros
%D {somekindoftab}
diff --git a/Master/texmf-dist/tex/context/base/core-sys.lua b/Master/texmf-dist/tex/context/base/core-sys.lua
index c5aa89d98e5..47a5c340df3 100644
--- a/Master/texmf-dist/tex/context/base/core-sys.lua
+++ b/Master/texmf-dist/tex/context/base/core-sys.lua
@@ -8,6 +8,8 @@ if not modules then modules = { } end modules ['core-sys'] = {
local lower, extname, basename, removesuffix = string.lower, file.extname, file.basename, file.removesuffix
+local environment = environment
+
function commands.updatefilenames(inputfilename,outputfilename)
environment.inputfilename = inputfilename or ""
environment.outputfilename = outputfilename or ""
@@ -18,5 +20,6 @@ function commands.updatefilenames(inputfilename,outputfilename)
end
statistics.register("result saved in file", function()
+ -- suffix will be fetched from backend
return string.format( "%s.%s", environment.outputfilename, (tex.pdfoutput>0 and "pdf") or "dvi")
end)
diff --git a/Master/texmf-dist/tex/context/base/core-sys.mkiv b/Master/texmf-dist/tex/context/base/core-sys.mkiv
index 649e5e65c9b..f61cabec3d2 100644
--- a/Master/texmf-dist/tex/context/base/core-sys.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-sys.mkiv
@@ -35,20 +35,14 @@
%D End of lines to the output. \TEX\ will map this onto the platform specific
%D line ending. I hate this mess.
-%newlinechar=10 \def\outputnewlinechar{\rawcharacter{10}}
-\newlinechar=10 \edef\outputnewlinechar{^^J}
+\edef\operatingsystem {\ctxwrite {os.platform}}
-\edef\operatingsystem {\ctxlua{tex.write(os.platform)}}
-
-\def\jobfilename {\ctxlua{tex.sprint(tex.texcatcodes,environment.jobfilename or "")}}
-\def\jobfilesuffix {\ctxlua{tex.sprint(tex.texcatcodes,environment.jobfilesuffix or "")}}
-\def\inputfilebarename{\ctxlua{tex.sprint(tex.texcatcodes,environment.inputfilebarename or "")}}
-\def\inputfilesuffix {\ctxlua{tex.sprint(tex.texcatcodes,environment.inputfilesuffix or "")}}
-\def\inputfilename {\ctxlua{tex.sprint(tex.texcatcodes,environment.inputfilename or "")}}
-\def\outputfilename {\ctxlua{tex.sprint(tex.texcatcodes,environment.outputfilename or "")}}
-
-\def\initializenewlinechar
- {\bgroup\newlinechar=10\xdef\outputnewlinechar{^^J}\egroup}
+\def \jobfilename {\ctxsprint{environment.jobfilename or ""}}
+\def \jobfilesuffix {\ctxsprint{environment.jobfilesuffix or ""}}
+\def \inputfilebarename{\ctxsprint{environment.inputfilebarename or ""}}
+\def \inputfilesuffix {\ctxsprint{environment.inputfilesuffix or ""}}
+\def \inputfilename {\ctxsprint{environment.inputfilename or ""}}
+\def \outputfilename {\ctxsprint{environment.outputfilename or ""}}
\newtoks \everysetupsystem
@@ -106,8 +100,6 @@
{\let\jobfullname\empty}
{\doif\jobfilesuffix\c!tex{\edef\jobfullname{\jobfilename.#1}}}}
-\let\systemendofline\outputnewlinechar % will become obsolete
-
\def\systemparameter#1{\executeifdefined{\??sv#1}\empty}
%D There are a couple of system states avaiable:
@@ -150,7 +142,7 @@
\s!default=>\getnewrandomseed\scratchcounter,
\s!unknown=>\scratchcounter#1]%
\expanded{\setrandomseed{\the\scratchcounter}}%
- % \writestatus\m!systems{randomseed: \the\scratchcounter}%
+ % \writestatus\m!system{randomseed: \the\scratchcounter}%
\egroup}}
\setupsystem
@@ -194,44 +186,79 @@
\definecomplexorsimple\start
\definecomplexorsimple\stop
-\def\dododefinestartstop[#1][#2]% todo: use indirect commands
- {\getparameters
- [\??be#1]
- [\c!before=,
- \c!after=,
- \c!inbetween=,
- \c!commands=,
- \c!style=,
- #2]%
- \setuvalue{#1}%
- {\groupedcommand
- {\getvalue{\??be#1\c!commands}%
- \dostartattributes{\??be#1}\c!style\c!color}
- {\dostopattributes
- \getvalue{\??be#1\c!inbetween}}}%
- \setvalue{\e!start#1}%
- {\getvalue{\??be#1\c!before}%
- \bgroup
- \getvalue{\??be#1\c!commands}%
- \dostartattributes{\??be#1}\c!style\c!color\empty}%
- \setvalue{\e!stop#1}%
- {\dostopattributes
- \egroup
- \getvalue{\??be#1\c!after}}}
+% \def\dododefinestartstop[#1][#2]% todo: use indirect commands
+% {\getparameters
+% [\??be#1]
+% [\c!before=,
+% \c!after=,
+% \c!inbetween=,
+% \c!commands=,
+% \c!style=,
+% #2]%
+% \setuvalue{#1}%
+% {\groupedcommand
+% {\getvalue{\??be#1\c!commands}%
+% \dostarttagged\t!construct{#1}%
+% \dostartattributes{\??be#1}\c!style\c!color}
+% {\dostopattributes
+% \dostoptagged
+% \getvalue{\??be#1\c!inbetween}}}%
+% \setuvalue{\e!start#1}%
+% {\getvalue{\??be#1\c!before}%
+% \bgroup
+% \getvalue{\??be#1\c!commands}%
+% \dostarttagged\t!construct{#1}%
+% \dostartattributes{\??be#1}\c!style\c!color\empty}%
+% \setuvalue{\e!stop#1}%
+% {\dostopattributes
+% \dostoptagged
+% \egroup
+% \getvalue{\??be#1\c!after}}}
+%
+% \def\dodefinestartstop[#1][#2]%
+% {\def\docommand##1{\dododefinestartstop[##1][#2]}%
+% \processcommalist[#1]\docommand}
+%
+% \unexpanded\def\definestartstop
+% {\dodoubleargument\dodefinestartstop}
+%
+% \def\dosetupstartstop[#1][#2]%
+% {\def\docommand##1{\getparameters[\??be##1][#2]}%
+% \processcommalist[#1]\docommand}
+%
+% \unexpanded\def\setupstartstop
+% {\dodoubleargument\dosetupstartstop}
-\def\dodefinestartstop[#1][#2]%
- {\def\docommand##1{\dododefinestartstop[##1][#2]}%
- \processcommalist[#1]\docommand}
-\unexpanded\def\definestartstop
- {\dodoubleargument\dodefinestartstop}
+% \c!before \c!after \c!inbetween \c!commands \c!style \c!color
-\def\dosetupstartstop[#1][#2]%
- {\def\docommand##1{\getparameters[\??be##1][#2]}%
- \processcommalist[#1]\docommand}
+\installcommandhandler{\??be}{startstop}{\??be}
+
+\appendtoks
+ \normalexpanded{\dodefinestartstop{\currentstartstop}}%
+\to \everydefinestartstop
-\unexpanded\def\setupstartstop
- {\dodoubleargument\dosetupstartstop}
+\unexpanded\def\dodefinestartstop#1%
+ {\setuvalue{#1}%
+ {\groupedcommand
+ {\def\currentstartstop{#1}%
+ \startstopparameter\c!commands
+ \dostarttagged\t!construct\currentstartstop
+ \dosetstartstopattributes\c!style\c!color}
+ {\def\currentstartstop{#1}%
+ \dostoptagged
+ \startstopparameter\c!inbetween}}%
+ \setuvalue{\e!start#1}%
+ {\namedstartstopparameter{#1}\c!before
+ \bgroup
+ \def\currentstartstop{#1}%
+ \startstopparameter\c!commands
+ \dostarttagged\t!construct\currentstartstop
+ \dosetstartstopattributes\c!style\c!color}%
+ \setuvalue{\e!stop#1}%
+ {\dostoptagged
+ \egroup
+ \namedstartstopparameter{#1}\c!after}}
% \docommand kan niet worden gebruikt omdat deze macro
% soms lokaal wordt gebruikt
@@ -267,7 +294,7 @@
\def\complexdefine[#1]#2#3%
{\ifx#2\undefined
\else
- \showmessage\m!systems4{\string#2}%
+ \showmessage\m!system4{\string#2}%
\fi
\ifcase0#1\def#2{#3}%
\or\def#2##1{#3}%
@@ -350,7 +377,7 @@
% end
% \stopluacode
%
-% \unexpanded\def\define#1#{\ctxlua{commands.define([[\detokenize{#1}]])}}
+% \unexpanded\def\define#1#{\ctxcommand{define([[\detokenize{#1}]])}}
%
% \starttext
% \define[2]\whatevera{#1+#2}
diff --git a/Master/texmf-dist/tex/context/base/core-two.lua b/Master/texmf-dist/tex/context/base/core-two.lua
index 24a3191a775..51f6dd890b8 100644
--- a/Master/texmf-dist/tex/context/base/core-two.lua
+++ b/Master/texmf-dist/tex/context/base/core-two.lua
@@ -7,25 +7,30 @@ if not modules then modules = { } end modules ['core-two'] = {
}
local remove, concat = table.remove, table.concat
-
local texprint = tex.print
+local allocate = utilities.storage.allocate
--[[ldx--
<p>We save multi-pass information in the main utility table. This is a
bit of a mess because we support old and new methods.</p>
--ldx]]--
-jobpasses = jobpasses or { }
-jobpasses.collected = jobpasses.collected or { }
-jobpasses.tobesaved = jobpasses.tobesaved or { }
+local collected = allocate()
+local tobesaved = allocate()
+
+local jobpasses = {
+ collected = collected,
+ tobesaved = tobesaved,
+}
-local collected, tobesaved = jobpasses.collected, jobpasses.tobesaved
+job.passes = jobpasses
local function initializer()
- collected, tobesaved = jobpasses.collected, jobpasses.tobesaved
+ collected = jobpasses.collected
+ tobesaved = jobpasses.tobesaved
end
-job.register('jobpasses.collected', jobpasses.tobesaved, initializer, nil)
+job.register('job.passes.collected', tobesaved, initializer, nil)
local function allocate(id)
local p = tobesaved[id]
diff --git a/Master/texmf-dist/tex/context/base/core-two.mkiv b/Master/texmf-dist/tex/context/base/core-two.mkiv
index 2cc9412afba..332b2c89bbb 100644
--- a/Master/texmf-dist/tex/context/base/core-two.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-two.mkiv
@@ -79,11 +79,11 @@
%D I'm not that sure if this behaves exactly like mkii. This needs a cleanup.
-\def\immediatesavetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlua {jobpasses.save('#1',"#3")}}}
-\def\savetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlatelua{jobpasses.save('#1',"#3")}}}
-\def\lazysavetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlatelua{jobpasses.save('#1',"#3")}}}
-\def\savetaggedtwopassdata #1#2#3#4{\normalexpanded{\noexpand\ctxlua {jobpasses.savetagged('#1','#3',"#4")}}}
-\def\lazysavetaggedtwopassdata#1#2#3#4{\normalexpanded{\noexpand\ctxlatelua{jobpasses.savetagged('#1','#3',"#4")}}}
+\def\immediatesavetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlua {job.passes.save('#1',"#3")}}}
+\def\savetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlatelua{job.passes.save('#1',"#3")}}}
+\def\lazysavetwopassdata #1#2#3{\normalexpanded{\noexpand\ctxlatelua{job.passes.save('#1',"#3")}}}
+\def\savetaggedtwopassdata #1#2#3#4{\normalexpanded{\noexpand\ctxlua {job.passes.savetagged('#1','#3',"#4")}}}
+\def\lazysavetaggedtwopassdata#1#2#3#4{\normalexpanded{\noexpand\ctxlatelua{job.passes.savetagged('#1','#3',"#4")}}}
% temp hack: needs a proper \starteverytimeluacode
@@ -91,15 +91,15 @@
% todo: move the edef to lua
-\unexpanded\def\definetwopasslist #1{\ctxlua{jobpasses.define('#1')}}
-\def\gettwopassdata #1{\edef\twopassdata{\ctxlua{jobpasses.get("#1")}}\testtwopassdata}
-\def\checktwopassdata #1{\edef\twopassdata{\ctxlua{jobpasses.check("#1")}}\testtwopassdata}
-\def\findtwopassdata #1#2{\edef\twopassdata{\ctxlua{jobpasses.find("#1","#2")}}\testtwopassdata}
-\def\getfirsttwopassdata #1{\edef\twopassdata{\ctxlua{jobpasses.first("#1")}}\testtwopassdata}
-\def\getlasttwopassdata #1{\edef\twopassdata{\ctxlua{jobpasses.last("#1")}}\edef\noftwopassitems{\ctxlua{jobpasses.count("#1")}}\testtwopassdata}
-\def\getnamedtwopassdatalist#1#2{\edef#1{\ctxlua{jobpasses.list("#2")}}}
-\def\gettwopassdatalist #1{\edef\twopassdatalist{\ctxlua{jobpasses.list("#1")}}}
-\def\doifelseintwopassdata #1#2{\ctxlua{jobpasses.doifinlistelse("#1","#2")}}
+\unexpanded\def\definetwopasslist #1{\ctxlua{job.passes.define('#1')}}
+\def\gettwopassdata #1{\edef\twopassdata{\ctxlua{job.passes.get("#1")}}\testtwopassdata}
+\def\checktwopassdata #1{\edef\twopassdata{\ctxlua{job.passes.check("#1")}}\testtwopassdata}
+\def\findtwopassdata #1#2{\edef\twopassdata{\ctxlua{job.passes.find("#1","#2")}}\testtwopassdata}
+\def\getfirsttwopassdata #1{\edef\twopassdata{\ctxlua{job.passes.first("#1")}}\testtwopassdata}
+\def\getlasttwopassdata #1{\edef\twopassdata{\ctxlua{job.passes.last("#1")}}\edef\noftwopassitems{\ctxlua{job.passes.count("#1")}}\testtwopassdata}
+\def\getnamedtwopassdatalist#1#2{\edef#1{\ctxlua{job.passes.list("#2")}}}
+\def\gettwopassdatalist #1{\edef\twopassdatalist{\ctxlua{job.passes.list("#1")}}}
+\def\doifelseintwopassdata #1#2{\ctxlua{job.passes.doifinlistelse("#1","#2")}}
\let\getfromtwopassdata\findtwopassdata
diff --git a/Master/texmf-dist/tex/context/base/core-uti.lua b/Master/texmf-dist/tex/context/base/core-uti.lua
index 01fd8522b10..02411f13d99 100644
--- a/Master/texmf-dist/tex/context/base/core-uti.lua
+++ b/Master/texmf-dist/tex/context/base/core-uti.lua
@@ -17,14 +17,25 @@ utility file under different setups, we now load a table once. This
saves much runtime but at the cost of more memory usage.</p>
--ldx]]--
-local sort, concat, format, match = table.sort, table.concat, string.format, string.match
+local format, match = string.format, string.match
local next, type, tostring = next, type, tostring
-local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
-if not jobs then jobs = { } end
-if not job then jobs['main'] = { } end job = jobs['main']
+local definetable = utilities.tables.definetable
+local accesstable = utilities.tables.accesstable
+local serialize = table.serialize
+local packers = utilities.packers
+local allocate = utilities.storage.allocate
+local mark = utilities.storage.mark
-jobs.version = 1.10
+local report_jobcontrol = logs.reporter("jobcontrol")
+
+job = job or { }
+local job = job
+
+job.version = 1.14
+
+-- some day we will implement loading of other jobs and then we need
+-- job.jobs
--[[ldx--
<p>Variables are saved using in the previously defined table and passed
@@ -38,151 +49,63 @@ function job.comment(str)
comment[#comment+1] = str
end
-job.comment(format("version: %1.2f",jobs.version))
+job.comment(format("version: %1.2f",job.version))
function job.initialize(loadname,savename)
- job.load(loadname)
- main.register_stop_actions(function()
+ job.load(loadname) -- has to come after structure is defined !
+ luatex.registerstopactions(function()
if not status.lasterrorstring or status.lasterrorstring == "" then
job.save(savename)
end
end)
end
-function job.register(...) -- collected, tobesaved, initializer, finalizer
- savelist[#savelist+1] = { ... }
+function job.register(collected, tobesaved, initializer, finalizer)
+ savelist[#savelist+1] = { collected, tobesaved, initializer, finalizer }
end
-- as an example we implement variables
-jobvariables = jobvariables or { }
-jobvariables.collected = jobvariables.collected or { }
-jobvariables.tobesaved = jobvariables.tobesaved or { }
-jobvariables.checksums = jobvariables.checksums or { }
-
-if not jobvariables.checksums.old then jobvariables.checksums.old = md5.HEX("old") end -- used in experiment
-if not jobvariables.checksums.new then jobvariables.checksums.new = md5.HEX("new") end -- used in experiment
-
-job.register('jobvariables.checksums', jobvariables.checksums)
-
-local function initializer()
- local r = jobvariables.collected.randomseed
- if not r then
- r = math.random()
- math.setrandomseedi(r,"initialize")
- else
- math.setrandomseedi(r,"previous run")
- end
- jobvariables.tobesaved.randomseed = r
- for cs, value in next, jobvariables.collected do
- texsprint(ctxcatcodes,format("\\xdef\\%s{%s}",cs,value))
- end
-end
-
-job.register('jobvariables.collected', jobvariables.tobesaved, initializer)
+local tobesaved, collected, checksums = allocate(), allocate(), allocate()
-function jobvariables.save(cs,value)
- jobvariables.tobesaved[cs] = value
-end
+local jobvariables = {
+ collected = collected,
+ tobesaved = tobesaved,
+ checksums = checksums,
+}
--- experiment (bugged: some loop in running)
+job.variables = jobvariables
--- for the moment here, very experimental stuff
+if not checksums.old then checksums.old = md5.HEX("old") end -- used in experiment
+if not checksums.new then checksums.new = md5.HEX("new") end -- used in experiment
-packer = packer or { }
-packer.version = 1.00
+job.register('job.variables.checksums', checksums)
-local function hashed(t)
- local s = { }
- for k, v in next, t do
- if type(v) == "table" then
- s[#s+1] = k.."={"..hashed(v).."}"
- else
- s[#s+1] = k.."="..tostring(v)
- end
- end
- sort(s)
- return concat(s,",")
-end
+local rmethod, rvalue
-local function pack(t,keys,hash,index)
- for k,v in next, t do
- if type(v) == "table" then
- pack(v,keys,hash,index)
- end
- if keys[k] and type(v) == "table" then
- local h = hashed(v)
- local i = hash[h]
- if not i then
- i = #index+1
- index[i] = v
- hash[h] = i
- end
- t[k] = i
- end
- end
-end
-
-local function unpack(t,keys,index)
- for k,v in next, t do
- if keys[k] and type(v) == "number" then
- local iv = index[v]
- if iv then
- v = iv
- t[k] = v
- end
- end
- if type(v) == "table" then
- unpack(v,keys,index)
- end
+local function initializer()
+ tobesaved = jobvariables.tobesaved
+ collected = jobvariables.collected
+ checksums = jobvariables.checksums
+ rvalue = collected.randomseed
+ if not rvalue then
+ rvalue = math.random()
+ math.setrandomseedi(rvalue,"initialize")
+ rmethod = "initialized"
+ else
+ math.setrandomseedi(rvalue,"previous run")
+ rmethod = "resumed"
end
-end
-
-function packer.new(keys,version)
- return {
- version = version or packer.version,
- keys = table.tohash(keys),
- hash = { },
- index = { },
- }
-end
-
-function packer.pack(t,p,shared)
- if shared then
- pack(t,p.keys,p.hash,p.index)
- elseif not t.packer then
- pack(t,p.keys,p.hash,p.index)
- if #p.index > 0 then
- t.packer = {
- version = p.version or packer.version,
- keys = p.keys,
- index = p.index,
- }
- end
- p.hash, p.index = { }, { }
+ tobesaved.randomseed = rvalue
+ for cs, value in next, collected do
+ context.setxvalue(cs,value)
end
end
-function packer.unpack(t,p,shared)
- if shared then
- if p then
- unpack(t,p.keys,p.index)
- end
- else
- local tp = t.packer
- if tp then
- if tp.version == (p and p.version or packer.version) then
- unpack(t,tp.keys,tp.index)
- else
- -- fatal error, wrong version
- end
- t.packer = nil
- end
- end
-end
+job.register('job.variables.collected', tobesaved, initializer)
-function packer.strip(p)
- p.hash = nil
+function jobvariables.save(cs,value)
+ tobesaved[cs] = value
end
local packlist = {
@@ -195,17 +118,17 @@ local packlist = {
"directives",
"specification",
"processors", -- might become key under directives or metadata
--- "references", -- we need to rename of them as only one packs (not structure.lists.references)
+-- "references", -- we need to rename of them as only one packs (not structures.lists.references)
}
-local jobpacker = packer.new(packlist,1.01)
+local jobpacker = packers.new(packlist,1.01)
job.pack = true
-job._save_, job._load_ = { }, { } -- registers timing
+local _save_, _load_ = { }, { } -- registers timing
function job.save(filename)
- statistics.starttiming(job._save_)
+ statistics.starttiming(_save_)
local f = io.open(filename,'w')
if f then
for c=1,#comment do
@@ -219,27 +142,27 @@ function job.save(filename)
finalizer()
end
if job.pack then
- packer.pack(data,jobpacker,true)
+ packers.pack(data,jobpacker,true)
end
- f:write(aux.definetable(target),"\n")
- f:write(table.serialize(data,target,true,true),"\n")
+ f:write(definetable(target),"\n")
+ f:write(serialize(data,target,true,true),"\n")
end
if job.pack then
- packer.strip(jobpacker)
- f:write(table.serialize(jobpacker,"job.packer",true,true),"\n")
+ packers.strip(jobpacker)
+ f:write(serialize(jobpacker,"job.packed",true,true),"\n")
end
f:close()
end
- statistics.stoptiming(job._save_)
+ statistics.stoptiming(_save_)
end
function job.load(filename)
- statistics.starttiming(job._load_)
+ statistics.starttiming(_load_)
local data = io.loaddata(filename)
if data and data ~= "" then
local version = tonumber(match(data,"^-- version: ([%d%.]+)"))
- if version ~= jobs.version then
- logs.report("job","version mismatch with jobfile: %s <> %s", version or "?", jobs.version)
+ if version ~= job.version then
+ report_jobcontrol("version mismatch with jobfile: %s <> %s", version or "?", job.version)
else
local data = loadstring(data)
if data then
@@ -248,26 +171,27 @@ function job.load(filename)
for l=1,#savelist do
local list = savelist[l]
local target, initializer = list[1], list[3]
- packer.unpack(aux.accesstable(target),job.packer,true)
+ local result = mark(accesstable(target))
+ packers.unpack(result,job.packed,true)
if type(initializer) == "function" then
- initializer(aux.accesstable(target))
+ initializer(result)
end
end
- job.packer = nil
+ job.packed = nil
end
end
- statistics.stoptiming(job._load_)
+ statistics.stoptiming(_load_)
end
-- eventually this will end up in strc-ini
statistics.register("startup time", function()
- return statistics.elapsedseconds(ctx,"including runtime option file processing")
+ return statistics.elapsedseconds(statistics,"including runtime option file processing")
end)
statistics.register("jobdata time",function()
- if statistics.elapsedindeed(job._save_) or statistics.elapsedindeed(job._load_) then
- return format("%s seconds saving, %s seconds loading", statistics.elapsedtime(job._save_), statistics.elapsedtime(job._load_))
+ if statistics.elapsedindeed(_save_) or statistics.elapsedindeed(_load_) then
+ return format("%s seconds saving, %s seconds loading", statistics.elapsedtime(_save_), statistics.elapsedtime(_load_))
end
end)
@@ -281,6 +205,12 @@ statistics.register("callbacks", function()
end
end)
+statistics.register("randomizer", function()
+ if rmethod and rvalue then
+ return format("%s with value %s",rmethod,rvalue)
+ end
+end)
+
function statistics.formatruntime(runtime)
local shipped = tex.count['nofshipouts']
local pages = tex.count['realpageno'] - 1
diff --git a/Master/texmf-dist/tex/context/base/core-uti.mkiv b/Master/texmf-dist/tex/context/base/core-uti.mkiv
index 6b2dae2c9c9..46a1e398af1 100644
--- a/Master/texmf-dist/tex/context/base/core-uti.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-uti.mkiv
@@ -18,19 +18,7 @@
\registerctxluafile{core-uti}{1.001}
\def\savecurrentvalue#1#2%
- {\ctxlua{jobvariables.save("\strippedcsname#1","#2")}}
-
-\appendtoks
- \ctxlua{storage.dump()}% will move to lua
-\to \everydump
-
-\appendtoks
- \ctxlua{storage.finalize()}% will move to lua
-\to \everyfinalizeluacode
-
-\appendtoks
- \ctxlua{nodes.cleanup_reserved()}% will move to lua
-\to \everydump
+ {\ctxlua{job.variables.save("\strippedcsname#1","#2")}}
\appendtoks
\ctxlua {
@@ -38,29 +26,20 @@
job.comment("format: \contextformat")
job.comment("stamp: \contextversion")
job.comment("escape: \!!bs\space...\space\!!es")
- job.initialize("\jobname.tuc","\jobname.tua")
}%
\to \everystarttext
-\def\notuccompression{\ctxlua{job.pack=false}}
-
-% cleaner, for the moment
+\appendtoks
+ \ctxlua {
+ job.initialize("\jobname.tuc","\jobname.tua")
+ }%
+\to \everyjob
-% \appendtoks
-% \ctxlua {
-% os.remove("\jobname.tui")
-% os.remove("\jobname.tuo")
-% }%
-% \to \everystarttext
+\def\notuccompression{\ctxlua{job.pack=false}}
%D Some styles might use these use these commands:
-\newif \ifutilitydone
-\let \checkutilities \relax
-\let \currentutilityfilename \jobname
-\def \installprogram {\dosingleempty\doinstallprogram}
-\def \doinstallprogram [#1]{\gobbleoneargument}
-\def \installedprogram [#1]{}
-\let \installplugin \gobblethreearguments
+\def\installprogram {\dosingleempty\doinstallprogram}
+\def\doinstallprogram[#1]{\gobbleoneargument}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/core-var.mkiv b/Master/texmf-dist/tex/context/base/core-var.mkiv
index 62cc9fc5003..45a593ee750 100644
--- a/Master/texmf-dist/tex/context/base/core-var.mkiv
+++ b/Master/texmf-dist/tex/context/base/core-var.mkiv
@@ -139,29 +139,12 @@
\unexpanded\def\stoptextproperties {\the\everystoptextproperties}
%D \macros
-%D {defineinputmode,setinputmode}
-%D
-%D New. Some work needs to be done.
-
-% not in mkiv
-
-\unexpanded\def\defineinputmode[#1]{\@EA\newtoks\csname every#1inputmode\endcsname}
-\def\setinputmode [#1]{\the\executeifdefined{every#1inputmode}\emptytoks}
-
-\defineinputmode [TEX]
-\defineinputmode [XML]
-
-\setinputmode [TEX]
-
-%D \macros
%D {trialtypesetting}
%D
%D We disable trial typesetting in the output routine,
%D just to be sure.
-\newif\iftrialtypesetting
-
-\prependtoks \trialtypesettingfalse \to \everybeforepagebody
+\prependtoks \resettrialtypesetting \to \everybeforepagebody
%D \macros
%D {ifinpagebody,ifinsidecolumns,ifdoublesided,ifsinglesided}
@@ -179,7 +162,7 @@
%D
%D We need this one even if no \XML\ is supported.
-\newif\ifprocessingXML % old way
+% \newif\ifprocessingXML % old way
%D \macros
%D {ifproductionrun}
@@ -258,7 +241,7 @@
%D Concepts:
-\chardef\conceptmode\zerocount
+\newconstant\conceptmode
\def\doifconcepttracing
{\ifnum\conceptmode>\plustwo
diff --git a/Master/texmf-dist/tex/context/base/data-aux.lua b/Master/texmf-dist/tex/context/base/data-aux.lua
index 26e1f551cb0..058033afe09 100644
--- a/Master/texmf-dist/tex/context/base/data-aux.lua
+++ b/Master/texmf-dist/tex/context/base/data-aux.lua
@@ -7,49 +7,54 @@ if not modules then modules = { } end modules ['data-aux'] = {
}
local find = string.find
+local type, next = type, next
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
-function resolvers.update_script(oldname,newname) -- oldname -> own.name, not per se a suffix
+local resolvers = resolvers
+
+local report_scripts = logs.reporter("resolvers","scripts")
+
+function resolvers.updatescript(oldname,newname) -- oldname -> own.name, not per se a suffix
local scriptpath = "scripts/context/lua"
newname = file.addsuffix(newname,"lua")
- local oldscript = resolvers.clean_path(oldname)
+ local oldscript = resolvers.cleanpath(oldname)
if trace_locating then
- logs.report("fileio","to be replaced old script %s", oldscript)
+ report_scripts("to be replaced old script %s", oldscript)
end
- local newscripts = resolvers.find_files(newname) or { }
+ local newscripts = resolvers.findfiles(newname) or { }
if #newscripts == 0 then
if trace_locating then
- logs.report("fileio","unable to locate new script")
+ report_scripts("unable to locate new script")
end
else
for i=1,#newscripts do
- local newscript = resolvers.clean_path(newscripts[i])
+ local newscript = resolvers.cleanpath(newscripts[i])
if trace_locating then
- logs.report("fileio","checking new script %s", newscript)
+ report_scripts("checking new script %s", newscript)
end
if oldscript == newscript then
if trace_locating then
- logs.report("fileio","old and new script are the same")
+ report_scripts("old and new script are the same")
end
elseif not find(newscript,scriptpath) then
if trace_locating then
- logs.report("fileio","new script should come from %s",scriptpath)
+ report_scripts("new script should come from %s",scriptpath)
end
elseif not (find(oldscript,file.removesuffix(newname).."$") or find(oldscript,newname.."$")) then
if trace_locating then
- logs.report("fileio","invalid new script name")
+ report_scripts("invalid new script name")
end
else
local newdata = io.loaddata(newscript)
if newdata then
if trace_locating then
- logs.report("fileio","old script content replaced by new content")
+ report_scripts("old script content replaced by new content")
end
io.savedata(oldscript,newdata)
break
elseif trace_locating then
- logs.report("fileio","unable to load new script")
+ report_scripts("unable to load new script")
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/data-bin.lua b/Master/texmf-dist/tex/context/base/data-bin.lua
index 5e4397a549f..b18526c77b7 100644
--- a/Master/texmf-dist/tex/context/base/data-bin.lua
+++ b/Master/texmf-dist/tex/context/base/data-bin.lua
@@ -6,22 +6,22 @@ if not modules then modules = { } end modules ['data-bin'] = {
license = "see context related readme files"
}
-local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
-local unpack = unpack or table.unpack
+local resolvers = resolvers
+local methodhandler = resolvers.methodhandler
-function resolvers.findbinfile(filename, filetype)
- return resolvers.methodhandler('finders',filename, filetype)
+function resolvers.findbinfile(filename,filetype)
+ return methodhandler('finders',filename,filetype)
end
function resolvers.openbinfile(filename)
- return resolvers.methodhandler('loaders',filename)
+ return methodhandler('loaders',filename)
end
-function resolvers.loadbinfile(filename, filetype)
- local fname = resolvers.methodhandler('finders',filename, filetype)
+function resolvers.loadbinfile(filename,filetype)
+ local fname = methodhandler('finders',filename,filetype)
if fname and fname ~= "" then
return resolvers.openbinfile(fname)
else
- return unpack(loaders.notfound)
+ return resolvers.loaders.notfound()
end
end
diff --git a/Master/texmf-dist/tex/context/base/data-con.lua b/Master/texmf-dist/tex/context/base/data-con.lua
index fabe0baa1b7..ed4f2dec093 100644
--- a/Master/texmf-dist/tex/context/base/data-con.lua
+++ b/Master/texmf-dist/tex/context/base/data-con.lua
@@ -1,5 +1,5 @@
if not modules then modules = { } end modules ['data-con'] = {
- version = 1.001,
+ version = 1.100,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
@@ -25,50 +25,63 @@ table structures without bothering about the disk cache.</p>
<p>Examples of usage can be found in the font related code.</p>
--ldx]]--
-containers = containers or { }
-
+containers = containers or { }
+local containers = containers
containers.usecache = true
+local report_containers = logs.reporter("resolvers","containers")
+
local function report(container,tag,name)
if trace_cache or trace_containers then
- logs.report(format("%s cache",container.subcategory),"%s: %s",tag,name or 'invalid')
+ report_containers("container: %s, tag: %s, name: %s",container.subcategory,tag,name or 'invalid')
end
end
local allocated = { }
--- tracing
+local mt = {
+ __index = function(t,k)
+ if k == "writable" then
+ local writable = caches.getwritablepath(t.category,t.subcategory) or { "." }
+ t.writable = writable
+ return writable
+ elseif k == "readables" then
+ local readables = caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ t.readables = readables
+ return readables
+ end
+ end,
+ __storage__ = true
+}
function containers.define(category, subcategory, version, enabled)
- return function()
- if category and subcategory then
- local c = allocated[category]
- if not c then
- c = { }
- allocated[category] = c
- end
- local s = c[subcategory]
- if not s then
- s = {
- category = category,
- subcategory = subcategory,
- storage = { },
- enabled = enabled,
- version = version or 1.000,
- trace = false,
- path = caches and caches.setpath and caches.setpath(category,subcategory),
- }
- c[subcategory] = s
- end
- return s
- else
- return nil
+ if category and subcategory then
+ local c = allocated[category]
+ if not c then
+ c = { }
+ allocated[category] = c
+ end
+ local s = c[subcategory]
+ if not s then
+ s = {
+ category = category,
+ subcategory = subcategory,
+ storage = { },
+ enabled = enabled,
+ version = version or math.pi, -- after all, this is TeX
+ trace = false,
+ -- writable = caches.getwritablepath and caches.getwritablepath (category,subcategory) or { "." },
+ -- readables = caches.getreadablepaths and caches.getreadablepaths(category,subcategory) or { "." },
+ }
+ setmetatable(s,mt)
+ c[subcategory] = s
end
+ return s
end
end
function containers.is_usable(container, name)
- return container.enabled and caches and caches.iswritable(container.path, name)
+ return container.enabled and caches and caches.is_writable(container.writable, name)
end
function containers.is_valid(container, name)
@@ -81,18 +94,20 @@ function containers.is_valid(container, name)
end
function containers.read(container,name)
- if container.enabled and caches and not container.storage[name] and containers.usecache then
- container.storage[name] = caches.loaddata(container.path,name)
- if containers.is_valid(container,name) then
+ local storage = container.storage
+ local stored = storage[name]
+ if not stored and container.enabled and caches and containers.usecache then
+ stored = caches.loaddata(container.readables,name)
+ if stored and stored.cache_version == container.version then
report(container,"loaded",name)
else
- container.storage[name] = nil
+ stored = nil
end
- end
- if container.storage[name] then
+ storage[name] = stored
+ elseif stored then
report(container,"reusing",name)
end
- return container.storage[name]
+ return stored
end
function containers.write(container, name, data)
@@ -101,7 +116,7 @@ function containers.write(container, name, data)
if container.enabled and caches then
local unique, shared = data.unique, data.shared
data.unique, data.shared = nil, nil
- caches.savedata(container.path, name, data)
+ caches.savedata(container.writable, name, data)
report(container,"saved",name)
data.unique, data.shared = unique, shared
end
diff --git a/Master/texmf-dist/tex/context/base/data-crl.lua b/Master/texmf-dist/tex/context/base/data-crl.lua
index 55b1a8fad9d..445bd5b0a70 100644
--- a/Master/texmf-dist/tex/context/base/data-crl.lua
+++ b/Master/texmf-dist/tex/context/base/data-crl.lua
@@ -6,55 +6,56 @@ if not modules then modules = { } end modules ['data-crl'] = {
license = "see context related readme files"
}
-local gsub = string.gsub
+-- this one is replaced by data-sch.lua --
-curl = curl or { }
+local gsub = string.gsub
-curl.cached = { }
-curl.cachepath = caches.definepath("curl")
+local resolvers = resolvers
local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
-function curl.fetch(protocol, name)
- local cachename = curl.cachepath() .. "/" .. gsub(name,"[^%a%d%.]+","-")
--- cachename = gsub(cachename,"[\\/]", io.fileseparator)
- cachename = gsub(cachename,"[\\]", "/") -- cleanup
- if not curl.cached[name] then
+resolvers.curl = resolvers.curl or { }
+local curl = resolvers.curl
+
+local cached = { }
+
+local function runcurl(specification)
+ local original = specification.original
+ -- local scheme = specification.scheme
+ local cleanname = gsub(original,"[^%a%d%.]+","-")
+ local cachename = caches.setfirstwritablefile(cleanname,"curl")
+ if not cached[original] then
if not io.exists(cachename) then
- curl.cached[name] = cachename
- local command = "curl --silent --create-dirs --output " .. cachename .. " " .. name -- no protocol .. "://"
+ cached[original] = cachename
+ local command = "curl --silent --create-dirs --output " .. cachename .. " " .. original
os.spawn(command)
end
if io.exists(cachename) then
- curl.cached[name] = cachename
+ cached[original] = cachename
else
- curl.cached[name] = ""
+ cached[original] = ""
end
end
- return curl.cached[name]
+ return cached[original]
end
-function finders.curl(protocol,filename)
- local foundname = curl.fetch(protocol, filename)
- return finders.generic(protocol,foundname,filetype)
-end
-
-function openers.curl(protocol,filename)
- return openers.generic(protocol,filename)
-end
+-- old code: we could be cleaner using specification (see schemes)
-function loaders.curl(protocol,filename)
- return loaders.generic(protocol,filename)
+local function finder(specification,filetype)
+ return resolvers.methodhandler("finders",runcurl(specification),filetype)
end
--- todo: metamethod
+local opener = openers.file
+local loader = loaders.file
-function curl.install(protocol)
- finders[protocol] = function (filename,filetype) return finders.curl(protocol,filename) end
- openers[protocol] = function (filename) return openers.curl(protocol,filename) end
- loaders[protocol] = function (filename) return loaders.curl(protocol,filename) end
+local function install(scheme)
+ finders[scheme] = finder
+ openers[scheme] = opener
+ loaders[scheme] = loader
end
-curl.install('http')
-curl.install('https')
-curl.install('ftp')
+resolvers.curl.install = install
+
+install('http')
+install('https')
+install('ftp')
diff --git a/Master/texmf-dist/tex/context/base/data-ctx.lua b/Master/texmf-dist/tex/context/base/data-ctx.lua
index 89eb2742d68..345e9c7411a 100644
--- a/Master/texmf-dist/tex/context/base/data-ctx.lua
+++ b/Master/texmf-dist/tex/context/base/data-ctx.lua
@@ -6,26 +6,4 @@ if not modules then modules = { } end modules ['data-ctx'] = {
license = "see context related readme files"
}
-local format = string.format
-
-function resolvers.save_used_files_in_trees(filename,jobname)
- if not filename then filename = 'luatex.jlg' end
- local found = instance.foundintrees
- local f = io.open(filename,'w')
- if f then
- f:write("<?xml version='1.0' standalone='yes'?>\n")
- f:write("<rl:job>\n")
- if jobname then
- f:write(format("\t<rl:name>%s</rl:name>\n",jobname))
- end
- f:write("\t<rl:files>\n")
- local sorted = table.sortedkeys(found)
- for k=1,#sorted do
- local v = sorted[k]
- f:write(format("\t\t<rl:file n='%s'>%s</rl:file>\n",found[v],v))
- end
- f:write("\t</rl:files>\n")
- f:write("</rl:usedfiles>\n")
- f:close()
- end
-end
+-- empty
diff --git a/Master/texmf-dist/tex/context/base/data-env.lua b/Master/texmf-dist/tex/context/base/data-env.lua
new file mode 100644
index 00000000000..108858ccc14
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/data-env.lua
@@ -0,0 +1,289 @@
+if not modules then modules = { } end modules ['data-env'] = {
+ 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 lower, gsub = string.lower, string.gsub
+
+local resolvers = resolvers
+
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+local fileextname = file.extname
+
+local formats = allocate()
+local suffixes = allocate()
+local dangerous = allocate()
+local suffixmap = allocate()
+
+resolvers.formats = formats
+resolvers.suffixes = suffixes
+resolvers.dangerous = dangerous
+resolvers.suffixmap = suffixmap
+
+local relations = allocate { -- todo: handlers also here
+ core = {
+ ofm = { -- will become obsolete
+ names = { "ofm", "omega font metric", "omega font metrics" },
+ variable = 'OFMFONTS',
+ suffixes = { 'ofm', 'tfm' },
+ },
+ ovf = { -- will become obsolete
+ names = { "ovf", "omega virtual font", "omega virtual fonts" },
+ variable = 'OVFFONTS',
+ suffixes = { 'ovf', 'vf' },
+ },
+ tfm = {
+ names = { "tfm", "tex font metric", "tex font metrics" },
+ variable = 'TFMFONTS',
+ suffixes = { 'tfm' },
+ },
+ vf = {
+ names = { "vf", "virtual font", "virtual fonts" },
+ variable = 'VFFONTS',
+ suffixes = { 'vf' },
+ },
+ otf = {
+ names = { "otf", "opentype", "opentype font", "opentype fonts"},
+ variable = 'OPENTYPEFONTS',
+ suffixes = { 'otf' },
+ },
+ ttf = {
+ names = { "ttf", "truetype", "truetype font", "truetype fonts", "truetype collection", "truetype collections", "truetype dictionary", "truetype dictionaries" },
+ variable = 'TTFONTS',
+ suffixes = { 'ttf', 'ttc', 'dfont' },
+ },
+ afm = {
+ names = { "afm", "adobe font metric", "adobe font metrics" },
+ variable = "AFMFONTS",
+ suffixes = { "afm" },
+ },
+ pfb = {
+ names = { "pfb", "type1", "type 1", "type1 font", "type 1 font", "type1 fonts", "type 1 fonts" },
+ variable = 'T1FONTS',
+ suffixes = { 'pfb', 'pfa' },
+ },
+ fea = {
+ names = { "fea", "font feature", "font features", "font feature file", "font feature files" },
+ variable = 'FONTFEATURES',
+ suffixes = { 'fea' },
+ },
+ cid = {
+ names = { "cid", "cid map", "cid maps", "cid file", "cid files" },
+ variable = 'FONTCIDMAPS',
+ suffixes = { 'cid', 'cidmap' },
+ },
+ fmt = {
+ names = { "fmt", "format", "tex format" },
+ variable = 'TEXFORMATS',
+ suffixes = { 'fmt' },
+ },
+ mem = { -- will become obsolete
+ names = { 'mem', "metapost format" },
+ variable = 'MPMEMS',
+ suffixes = { 'mem' },
+ },
+ mp = {
+ names = { "mp" },
+ variable = 'MPINPUTS',
+ suffixes = { 'mp' },
+ },
+ tex = {
+ names = { "tex" },
+ variable = 'TEXINPUTS',
+ suffixes = { 'tex', "mkiv", "mkiv", "mkii" },
+ },
+ icc = {
+ names = { "icc", "icc profile", "icc profiles" },
+ variable = 'ICCPROFILES',
+ suffixes = { 'icc' },
+ },
+ texmfscripts = {
+ names = { "texmfscript", "texmfscripts", "script", "scripts" },
+ variable = 'TEXMFSCRIPTS',
+ suffixes = { 'rb', 'pl', 'py' },
+ },
+ lua = {
+ names = { "lua" },
+ variable = 'LUAINPUTS',
+ suffixes = { 'lua', 'luc', 'tma', 'tmc' },
+ },
+ lib = {
+ names = { "lib" },
+ variable = 'CLUAINPUTS',
+ suffixes = os.libsuffix and { os.libsuffix } or { 'dll', 'so' },
+ },
+ bib = {
+ names = { 'bib' },
+ suffixes = { 'bib' },
+ },
+ bst = {
+ names = { 'bst' },
+ suffixes = { 'bst' },
+ },
+ fontconfig = {
+ names = { 'fontconfig', 'fontconfig file', 'fontconfig files' },
+ variable = 'FONTCONFIG_PATH',
+ },
+ },
+ obsolete = {
+ enc = {
+ names = { "enc", "enc files", "enc file", "encoding files", "encoding file" },
+ variable = 'ENCFONTS',
+ suffixes = { 'enc' },
+ },
+ map = {
+ names = { "map", "map files", "map file" },
+ variable = 'TEXFONTMAPS',
+ suffixes = { 'map' },
+ },
+ lig = {
+ names = { "lig files", "lig file", "ligature file", "ligature files" },
+ variable = 'LIGFONTS',
+ suffixes = { 'lig' },
+ },
+ opl = {
+ names = { "opl" },
+ variable = 'OPLFONTS',
+ suffixes = { 'opl' },
+ },
+ ovp = {
+ names = { "ovp" },
+ variable = 'OVPFONTS',
+ suffixes = { 'ovp' },
+ },
+ },
+ kpse = { -- subset
+ base = {
+ names = { 'base', "metafont format" },
+ variable = 'MFBASES',
+ suffixes = { 'base', 'bas' },
+ },
+ cmap = {
+ names = { 'cmap', 'cmap files', 'cmap file' },
+ variable = 'CMAPFONTS',
+ suffixes = { 'cmap' },
+ },
+ cnf = {
+ names = { 'cnf' },
+ suffixes = { 'cnf' },
+ },
+ web = {
+ names = { 'web' },
+ suffixes = { 'web', 'ch' }
+ },
+ cweb = {
+ names = { 'cweb' },
+ suffixes = { 'w', 'web', 'ch' },
+ },
+ gf = {
+ names = { 'gf' },
+ suffixes = { '<resolution>gf' },
+ },
+ mf = {
+ names = { 'mf' },
+ variable = 'MFINPUTS',
+ suffixes = { 'mf' },
+ },
+ mft = {
+ names = { 'mft' },
+ suffixes = { 'mft' },
+ },
+ pk = {
+ names = { 'pk' },
+ suffixes = { '<resolution>pk' },
+ },
+ },
+}
+
+resolvers.relations = relations
+
+-- formats: maps a format onto a variable
+
+function resolvers.updaterelations()
+ for category, categories in next, relations do
+ for name, relation in next, categories do
+ local rn = relation.names
+ local rv = relation.variable
+ local rs = relation.suffixes
+ if rn and rv then
+ for i=1,#rn do
+ local rni = lower(gsub(rn[i]," ",""))
+ formats[rni] = rv
+ if rs then
+ suffixes[rni] = rs
+ for i=1,#rs do
+ local rsi = rs[i]
+ suffixmap[rsi] = rni
+ end
+ end
+ end
+ end
+ if rs then
+ end
+ end
+ end
+end
+
+resolvers.updaterelations() -- push this in the metatable -> newindex
+
+local function simplified(t,k)
+ return rawget(t,lower(gsub(k," ","")))
+end
+
+setmetatableindex(formats, simplified)
+setmetatableindex(suffixes, simplified)
+setmetatableindex(suffixmap, simplified)
+
+-- A few accessors, mostly for command line tool.
+
+function resolvers.suffixofformat(str)
+ local s = suffixes[str]
+ return s and s[1] or ""
+end
+
+function resolvers.suffixofformat(str)
+ return suffixes[str] or { }
+end
+
+for name, format in next, formats do
+ dangerous[name] = true -- still needed ?
+end
+
+-- because vf searching is somewhat dangerous, we want to prevent
+-- too liberal searching esp because we do a lookup on the current
+-- path anyway; only tex (or any) is safe
+
+dangerous.tex = nil
+
+--~ print(table.serialize(dangerous))
+
+-- more helpers
+
+function resolvers.formatofvariable(str)
+ return formats[str] or ''
+end
+
+function resolvers.formatofsuffix(str) -- of file
+ return suffixmap[fileextname(str)] or 'tex' -- so many map onto tex (like mkiv, cld etc)
+end
+
+function resolvers.variableofformat(str)
+ return formats[str] or ''
+end
+
+function resolvers.variableofformatorsuffix(str)
+ local v = formats[str]
+ if v then
+ return v
+ end
+ v = suffixmap[fileextname(str)]
+ if v then
+ return formats[v]
+ end
+ return ''
+end
+
diff --git a/Master/texmf-dist/tex/context/base/data-exp.lua b/Master/texmf-dist/tex/context/base/data-exp.lua
new file mode 100644
index 00000000000..e8138968252
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/data-exp.lua
@@ -0,0 +1,330 @@
+if not modules then modules = { } end modules ['data-exp'] = {
+ 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 format, find, gmatch, lower = string.format, string.find, string.gmatch, string.lower
+local concat, sort = table.concat, table.sort
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local Ct, Cs, Cc, P, C, S = lpeg.Ct, lpeg.Cs, lpeg.Cc, lpeg.P, lpeg.C, lpeg.S
+local type, next = type, next
+
+local ostype = os.type
+local collapsepath = file.collapsepath
+
+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 report_expansions = logs.reporter("resolvers","expansions")
+
+local resolvers = resolvers
+
+-- 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
+-- past this every time. See data-obs.lua for the gsub variant.
+
+-- {a,b,c,d}
+-- a,b,c/{p,q,r},d
+-- a,b,c/{p,q,r}/d/{x,y,z}//
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
+-- a{b,c}{d,e}f
+-- {a,b,c,d}
+-- {a,b,c/{p,q,r},d}
+-- {a,b,c/{p,q,r}/d/{x,y,z}//}
+-- {a,b,c/{p,q/{x,y,z}},d/{p,q,r}}
+-- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}}
+-- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}
+
+local function f_first(a,b)
+ local t, n = { }, 0
+ for s in gmatch(b,"[^,]+") do
+ n = n + 1 ; t[n] = a .. s
+ end
+ return concat(t,",")
+end
+
+local function f_second(a,b)
+ local t, n = { }, 0
+ for s in gmatch(a,"[^,]+") do
+ n = n + 1 ; t[n] = s .. b
+ end
+ return concat(t,",")
+end
+
+local function f_both(a,b)
+ local t, n = { }, 0
+ for sa in gmatch(a,"[^,]+") do
+ for sb in gmatch(b,"[^,]+") do
+ n = n + 1 ; t[n] = sa .. sb
+ end
+ end
+ return concat(t,",")
+end
+
+local left = P("{")
+local right = P("}")
+local var = P((1 - S("{}" ))^0)
+local set = P((1 - S("{},"))^0)
+local other = P(1)
+
+local l_first = Cs( ( Cc("{") * (C(set) * left * C(var) * right / f_first) * Cc("}") + other )^0 )
+local l_second = Cs( ( Cc("{") * (left * C(var) * right * C(set) / f_second) * Cc("}") + other )^0 )
+local l_both = Cs( ( Cc("{") * (left * C(var) * right * left * C(var) * right / f_both) * Cc("}") + other )^0 )
+local l_rest = Cs( ( left * var * (left/"") * var * (right/"") * var * right + other )^0 )
+
+local stripper_1 = lpeg.stripper ("{}@")
+local replacer_1 = lpeg.replacer { { ",}", ",@}" }, { "{,", "{@," }, }
+
+local function splitpathexpr(str, newlist, validate) -- I couldn't resist lpegging it (nice exercise).
+ if trace_expansions then
+ report_expansions("expanding variable '%s'",str)
+ end
+ local t, ok, done = newlist or { }, false, false
+ local n = #t
+ str = lpegmatch(replacer_1,str)
+ repeat local old = str
+ repeat local old = str ; str = lpegmatch(l_first, str) until old == str
+ repeat local old = str ; str = lpegmatch(l_second,str) until old == str
+ repeat local old = str ; str = lpegmatch(l_both, str) until old == str
+ repeat local old = str ; str = lpegmatch(l_rest, str) until old == str
+ until old == str -- or not find(str,"{")
+ str = lpegmatch(stripper_1,str)
+ if validate then
+ for s in gmatch(str,"[^,]+") do
+ s = validate(s)
+ if s then
+ n = n + 1 ; t[n] = s
+ end
+ end
+ else
+ for s in gmatch(str,"[^,]+") do
+ n = n + 1 ; t[n] = s
+ end
+ end
+ if trace_expansions then
+ for k=1,#t do
+ report_expansions("% 4i: %s",k,t[k])
+ end
+ end
+ return t
+end
+
+-- We could make the previous one public.
+
+local function validate(s)
+ s = collapsepath(s) -- already keeps the //
+ return s ~= "" and not find(s,"^!*unset/*$") and s
+end
+
+resolvers.validatedpath = validate -- keeps the trailing //
+
+function resolvers.expandedpathfromlist(pathlist)
+ local newlist = { }
+ for k=1,#pathlist do
+ splitpathexpr(pathlist[k],newlist,validate)
+ end
+ return newlist
+end
+
+local cleanup = lpeg.replacer {
+ { "!" , "" },
+ { "\\" , "/" },
+}
+
+local homedir
+
+function resolvers.cleanpath(str)
+ if not homedir then
+ homedir = lpegmatch(cleanup,environment.homedir or "")
+ if homedir == string.char(127) 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 find(str,"~") then
+ return "" -- special case
+ else
+ return str and lpegmatch(cleanup,str)
+ end
+ end
+ else
+ cleanup = lpeg.replacer {
+ { "!" , "" },
+ { "\\" , "/" },
+ { "~" , homedir },
+ }
+ function resolvers.cleanpath(str)
+ return str and lpegmatch(cleanup,str)
+ end
+ end
+ end
+ return resolvers.cleanpath(str)
+end
+
+-- This one strips quotes and funny tokens.
+
+local expandhome = P("~") / "$HOME" -- environment.homedir
+
+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
+)
+
+function resolvers.checkedvariable(str) -- assumes str is a string
+ return lpegmatch(stripper,str) or str
+end
+
+-- The path splitter:
+
+-- A config (optionally) has the paths split in tables. Internally
+-- we join them and split them after the expansion has taken place. This
+-- is more convenient.
+
+local cache = { }
+
+---- splitter = Ct(lpeg.splitat(S(ostype == "windows" and ";" or ":;"))) -- maybe add ,
+local splitter = Ct(lpeg.splitat(";")) -- as we move towards urls, prefixes and use tables we no longer do :
+
+local backslashswapper = lpeg.replacer("\\","/")
+
+local function splitconfigurationpath(str) -- beware, this can be either a path or a { specification }
+ if str then
+ local found = cache[str]
+ if not found then
+ if str == "" then
+ found = { }
+ else
+ local split = lpegmatch(splitter,lpegmatch(backslashswapper,str)) -- can be combined
+ found = { }
+ local noffound = 0
+ for i=1,#split do
+ local s = split[i]
+ if not find(s,"^{*unset}*") then
+ noffound = noffound + 1
+ found[noffound] = s
+ end
+ end
+ if trace_expansions then
+ report_expansions("splitting path specification '%s'",str)
+ for k=1,noffound do
+ report_expansions("% 4i: %s",k,found[k])
+ end
+ end
+ cache[str] = found
+ end
+ end
+ return found
+ end
+end
+
+resolvers.splitconfigurationpath = splitconfigurationpath
+
+function resolvers.splitpath(str)
+ if type(str) == 'table' then
+ return str
+ else
+ return splitconfigurationpath(str)
+ end
+end
+
+function resolvers.joinpath(str)
+ if type(str) == 'table' then
+ return file.joinpath(str)
+ else
+ return str
+ end
+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 weird = P(".")^1 + lpeg.anywhere(S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
+
+local attributes, directory = lfs.attributes, lfs.dir
+
+local function scan(files,spec,path,n,m,r)
+ local full = (path == "" and spec) or (spec .. path .. '/')
+ local dirs, nofdirs = { }, 0
+ for name in directory(full) do
+ if not lpegmatch(weird,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 }
+ else
+ f[#f+1] = path
+ end
+ else -- probably unique anyway
+ files[name] = path
+ local lower = lower(name)
+ if name ~= lower then
+ files["remap:"..lower] = name
+ r = r + 1
+ end
+ end
+ elseif mode == 'directory' then
+ m = m + 1
+ 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, n, m, r = scan(files,spec,dirs[i],n,m,r)
+ end
+ end
+ return files, n, m, r
+end
+
+function resolvers.scanfiles(path,branch)
+ if trace_locating then
+ report_expansions("scanning path '%s', branch '%s'",path, branch or path)
+ end
+ local realpath = resolvers.resolve(path) -- no shortcut
+ 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)
+ end
+ return files
+end
+
+--~ print(table.serialize(resolvers.scanfiles("t:/sources")))
diff --git a/Master/texmf-dist/tex/context/base/data-fil.lua b/Master/texmf-dist/tex/context/base/data-fil.lua
new file mode 100644
index 00000000000..0e82008f35e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/data-fil.lua
@@ -0,0 +1,112 @@
+if not modules then modules = { } end modules ['data-fil'] = {
+ 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 trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+
+local report_files = logs.reporter("resolvers","files")
+
+local resolvers = resolvers
+
+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
+
+local checkgarbage = utilities.garbagecollector and utilities.garbagecollector.check
+
+function locators.file(specification)
+ local name = specification.filename
+ local realname = resolvers.resolve(name) -- no shortcut
+ if realname and realname ~= '' and lfs.isdir(realname) then
+ if trace_locating then
+ report_files("file locator '%s' found as '%s'",name,realname)
+ end
+ resolvers.appendhash('file',name,true) -- cache
+ elseif trace_locating then
+ report_files("file locator '%s' not found",name)
+ end
+end
+
+function hashers.file(specification)
+ local name = specification.filename
+ local content = caches.loadcontent(name,'files')
+ resolvers.registerfilehash(name,content,content==nil)
+end
+
+function generators.file(specification)
+ local path = specification.filename
+ local content = resolvers.scanfiles(path)
+ resolvers.registerfilehash(path,content,true)
+end
+
+concatinators.file = file.join
+
+function finders.file(specification,filetype)
+ local filename = specification.filename
+ local foundname = resolvers.findfile(filename,filetype)
+ if foundname and foundname ~= "" then
+ if trace_locating then
+ report_files("file finder: '%s' found",filename)
+ end
+ return foundname
+ else
+ if trace_locating then
+ report_files("file finder: %s' not found",filename)
+ end
+ return finders.notfound()
+ end
+end
+
+-- The default textopener will be overloaded later on.
+
+function openers.helpers.textopener(tag,filename,f)
+ return {
+ reader = function() return f:read () end,
+ close = function() logs.show_close(filename) return f:close() end,
+ }
+end
+
+function openers.file(specification,filetype)
+ local filename = specification.filename
+ if filename and filename ~= "" then
+ local f = io.open(filename,"r")
+ if f then
+ if trace_locating then
+ report_files("file opener, '%s' opened",filename)
+ end
+ return openers.helpers.textopener("file",filename,f)
+ end
+ end
+ if trace_locating then
+ report_files("file opener, '%s' not found",filename)
+ end
+ return openers.notfound()
+end
+
+function loaders.file(specification,filetype)
+ local filename = specification.filename
+ if filename and filename ~= "" then
+ local f = io.open(filename,"rb")
+ if f then
+ logs.show_load(filename)
+ if trace_locating then
+ report_files("file loader, '%s' loaded",filename)
+ end
+ local s = f:read("*a")
+ if checkgarbage then
+ checkgarbage(#s)
+ end
+ f:close()
+ if s then
+ return true, s, #s
+ end
+ end
+ end
+ if trace_locating then
+ report_files("file loader, '%s' not found",filename)
+ end
+ return loaders.notfound()
+end
diff --git a/Master/texmf-dist/tex/context/base/data-ini.lua b/Master/texmf-dist/tex/context/base/data-ini.lua
new file mode 100644
index 00000000000..7b114e47b6b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/data-ini.lua
@@ -0,0 +1,229 @@
+if not modules then modules = { } end modules ['data-ini'] = {
+ 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 gsub, find, gmatch = string.gsub, string.find, string.gmatch
+local concat = table.concat
+local next, type = next, type
+
+local filedirname, filebasename, fileextname, filejoin = file.dirname, file.basename, file.extname, file.join
+
+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 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.
+
+resolvers = resolvers or { }
+local resolvers = resolvers
+
+-- We don't want the kpse library to kick in. Also, we want to be able to
+-- execute programs. Control over execution is implemented later.
+
+texconfig.kpse_init = false
+texconfig.shell_escape = 't'
+
+kpse = { original = kpse }
+
+setmetatable(kpse, {
+ __index = function(kp,name)
+ report_initialization("fatal error: kpse library is accessed (key: %s)",name)
+ os.exit()
+ end
+} )
+
+-- First we check a couple of environment variables. Some might be
+-- set already but we need then later on. We start with the system
+-- font path.
+
+do
+
+ local osfontdir = osgetenv("OSFONTDIR")
+
+ if osfontdir and osfontdir ~= "" then
+ -- ok
+ elseif osname == "windows" then
+ ossetenv("OSFONTDIR","c:/windows/fonts//")
+ elseif osname == "macosx" then
+ ossetenv("OSFONTDIR","$HOME/Library/Fonts//;/Library/Fonts//;/System/Library/Fonts//")
+ end
+
+end
+
+-- Next comes the user's home path. We need this as later on we have
+-- to replace ~ with its value.
+
+do
+
+ local homedir = osgetenv(ostype == "windows" and 'USERPROFILE' or 'HOME') or ''
+
+ if not homedir or homedir == "" then
+ homedir = string.char(127) -- we need a value, later we wil trigger on it
+ end
+
+ homedir = file.collapsepath(homedir)
+
+ ossetenv("HOME", homedir) -- can be used in unix cnf files
+ ossetenv("USERPROFILE",homedir) -- can be used in windows cnf files
+
+ environment.homedir = homedir
+
+end
+
+-- The following code sets the name of the own binary and its
+-- path. This is fallback code as we have os.selfdir now.
+
+do
+
+ local args = environment.originalarguments or arg -- this needs a cleanup
+
+ local ownbin = environment.ownbin or args[-2] or arg[-2] or args[-1] or arg[-1] or arg[0] or "luatex"
+ local ownpath = environment.ownpath or os.selfdir
+
+ ownbin = file.collapsepath(ownbin)
+ ownpath = file.collapsepath(ownpath)
+
+ if not ownpath or ownpath == "" or ownpath == "unset" then
+ ownpath = args[-1] or arg[-1]
+ ownpath = ownpath and filedirname(gsub(ownpath,"\\","/"))
+ if not ownpath or ownpath == "" then
+ ownpath = args[-0] or arg[-0]
+ ownpath = ownpath and filedirname(gsub(ownpath,"\\","/"))
+ end
+ local binary = ownbin
+ if not ownpath or ownpath == "" then
+ ownpath = ownpath and filedirname(binary)
+ end
+ if not ownpath or ownpath == "" then
+ if os.binsuffix ~= "" then
+ binary = file.replacesuffix(binary,os.binsuffix)
+ end
+ local path = osgetenv("PATH")
+ if path then
+ for p in gmatch(path,"[^"..io.pathseparator.."]+") do
+ local b = filejoin(p,binary)
+ if lfs.isfile(b) then
+ -- we assume that after changing to the path the currentdir function
+ -- resolves to the real location and use this side effect here; this
+ -- trick is needed because on the mac installations use symlinks in the
+ -- path instead of real locations
+ local olddir = lfs.currentdir()
+ if lfs.chdir(p) then
+ local pp = lfs.currentdir()
+ if trace_locating and p ~= pp then
+ report_initialization("following symlink '%s' to '%s'",p,pp)
+ end
+ ownpath = pp
+ lfs.chdir(olddir)
+ else
+ if trace_locating then
+ report_initialization("unable to check path '%s'",p)
+ end
+ ownpath = p
+ end
+ break
+ end
+ end
+ end
+ end
+ if not ownpath or ownpath == "" then
+ ownpath = "."
+ report_initialization("forcing fallback ownpath .")
+ elseif trace_locating then
+ report_initialization("using ownpath '%s'",ownpath)
+ end
+ end
+
+ environment.ownbin = ownbin
+ environment.ownpath = ownpath
+
+end
+
+resolvers.ownpath = environment.ownpath
+
+function resolvers.getownpath()
+ return environment.ownpath
+end
+
+-- The self variables permit us to use only a few (or even no)
+-- environment variables.
+
+do
+
+ local ownpath = environment.ownpath or dir.current()
+
+ if ownpath then
+ ossetenv('SELFAUTOLOC', file.collapsepath(ownpath))
+ ossetenv('SELFAUTODIR', file.collapsepath(ownpath .. "/.."))
+ ossetenv('SELFAUTOPARENT', file.collapsepath(ownpath .. "/../.."))
+ else
+ report_initialization("error: unable to locate ownpath")
+ os.exit()
+ end
+
+end
+
+-- The running os:
+
+-- todo: check is context sits here os.platform is more trustworthy
+-- that the bin check as mtx-update runs from another path
+
+local texos = environment.texos or osgetenv("TEXOS")
+local texmfos = environment.texmfos or osgetenv('SELFAUTODIR')
+
+if not texos or texos == "" then
+ texos = file.basename(texmfos)
+end
+
+ossetenv('TEXMFOS', texmfos) -- full bin path
+ossetenv('TEXOS', texos) -- partial bin parent
+ossetenv('SELFAUTOSYSTEM',os.platform) -- bonus
+
+environment.texos = texos
+environment.texmfos = texmfos
+
+-- The current root:
+
+local texroot = environment.texroot or osgetenv("TEXROOT")
+
+if not texroot or texroot == "" then
+ texroot = osgetenv('SELFAUTOPARENT')
+ ossetenv('TEXROOT',texroot)
+end
+
+environment.texroot = file.collapsepath(texroot)
+
+-- Tracing. Todo ...
+
+function resolvers.settrace(n) -- no longer number but: 'locating' or 'detail'
+ if n then
+ trackers.disable("resolvers.*")
+ trackers.enable("resolvers."..n)
+ end
+end
+
+resolvers.settrace(osgetenv("MTX_INPUT_TRACE"))
+
+-- todo:
+
+-- if profiler and osgetenv("MTX_PROFILE_RUN") == "YES" then
+-- profiler.start("luatex-profile.log")
+-- 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
+end
diff --git a/Master/texmf-dist/tex/context/base/data-inp.lua b/Master/texmf-dist/tex/context/base/data-inp.lua
index b7354e1aef3..97fb8904b91 100644
--- a/Master/texmf-dist/tex/context/base/data-inp.lua
+++ b/Master/texmf-dist/tex/context/base/data-inp.lua
@@ -6,10 +6,20 @@ if not modules then modules = { } end modules ['data-inp'] = {
license = "see context related readme files"
}
-resolvers.finders = resolvers.finders or { }
-resolvers.openers = resolvers.openers or { }
-resolvers.loaders = resolvers.loaders or { }
+local allocate = utilities.storage.allocate
+local resolvers = resolvers
-resolvers.finders.notfound = { nil }
-resolvers.openers.notfound = { nil }
-resolvers.loaders.notfound = { false, nil, 0 }
+local methodhandler = resolvers.methodhandler
+local registermethod = resolvers.registermethod
+
+local finders = allocate { helpers = { }, notfound = function() end }
+local openers = allocate { helpers = { }, notfound = function() end }
+local loaders = allocate { helpers = { }, notfound = function() return false, nil, 0 end }
+
+registermethod("finders", finders, "uri")
+registermethod("openers", openers, "uri")
+registermethod("loaders", loaders, "uri")
+
+resolvers.finders = finders
+resolvers.openers = openers
+resolvers.loaders = loaders
diff --git a/Master/texmf-dist/tex/context/base/data-lst.lua b/Master/texmf-dist/tex/context/base/data-lst.lua
index 82f6754867f..3f94253404f 100644
--- a/Master/texmf-dist/tex/context/base/data-lst.lua
+++ b/Master/texmf-dist/tex/context/base/data-lst.lua
@@ -6,12 +6,16 @@ if not modules then modules = { } end modules ['data-lst'] = {
license = "see context related readme files"
}
--- used in mtxrun
+-- used in mtxrun, can be loaded later .. todo
local find, concat, upper, format = string.find, table.concat, string.upper, string.format
resolvers.listers = resolvers.listers or { }
+local resolvers = resolvers
+
+local report_lists = logs.reporter("resolvers","lists")
+
local function tabstr(str)
if type(str) == 'table' then
return concat(str," | ")
@@ -20,44 +24,42 @@ local function tabstr(str)
end
end
-local function list(list,report)
- local instance = resolvers.instance
- local pat = upper(pattern or "","")
- local report = report or texio.write_nl
- local sorted = table.sortedkeys(list)
- for i=1,#sorted do
- local key = sorted[i]
- if instance.pattern == "" or find(upper(key),pat) then
- if instance.kpseonly then
- if instance.kpsevars[key] then
- report(format("%s=%s",key,tabstr(list[key])))
- end
- else
- report(format('%s %s=%s',(instance.kpsevars[key] and 'K') or 'E',key,tabstr(list[key])))
+function resolvers.listers.variables(pattern)
+ local instance = resolvers.instance
+ local environment = instance.environment
+ local variables = instance.variables
+ local expansions = instance.expansions
+ local pattern = upper(pattern or "")
+ local configured = { }
+ local order = instance.order
+ for i=1,#order do
+ for k, v in next, order[i] do
+ if v ~= nil and configured[k] == nil then
+ configured[k] = v
end
end
end
+ local env = table.fastcopy(environment)
+ local var = table.fastcopy(variables)
+ local exp = table.fastcopy(expansions)
+ for key, value in table.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",resolvers.resolve(expansions[key]) or "unset")
+ end
+ end
+ instance.environment = table.fastcopy(env)
+ instance.variables = table.fastcopy(var)
+ instance.expansions = table.fastcopy(exp)
end
-function resolvers.listers.variables () list(resolvers.instance.variables ) end
-function resolvers.listers.expansions() list(resolvers.instance.expansions) end
-
function resolvers.listers.configurations(report)
+ local configurations = resolvers.instance.specification
local report = report or texio.write_nl
- local instance = resolvers.instance
- local sorted = table.sortedkeys(instance.kpsevars)
- for i=1,#sorted do
- local key = sorted[i]
- if not instance.pattern or (instance.pattern=="") or find(key,instance.pattern) then
- report(format("%s\n",key))
- local order = instance.order
- for i=1,#order do
- local str = order[i][key]
- if str then
- report(format("\t%s\t%s",i,str))
- end
- end
- report("")
- end
+ for i=1,#configurations do
+ report(resolvers.resolve(configurations[i]))
end
end
diff --git a/Master/texmf-dist/tex/context/base/data-lua.lua b/Master/texmf-dist/tex/context/base/data-lua.lua
index 988133fbecf..06571440766 100644
--- a/Master/texmf-dist/tex/context/base/data-lua.lua
+++ b/Master/texmf-dist/tex/context/base/data-lua.lua
@@ -12,9 +12,13 @@ if not modules then modules = { } end modules ['data-lua'] = {
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local report_libraries = logs.reporter("resolvers","libraries")
+
local gsub, insert = string.gsub, table.insert
local unpack = unpack or table.unpack
+local resolvers, package = resolvers, package
+
local libformats = { 'luatexlibs', 'tex', 'texmfscripts', 'othertextfiles' } -- 'luainputs'
local clibformats = { 'lib' }
@@ -23,7 +27,7 @@ local _path_, libpaths, _cpath_, clibpaths
function package.libpaths()
if not _path_ or package.path ~= _path_ then
_path_ = package.path
- libpaths = file.split_path(_path_,";")
+ libpaths = file.splitpath(_path_,";")
end
return libpaths
end
@@ -31,7 +35,7 @@ end
function package.clibpaths()
if not _cpath_ or package.cpath ~= _cpath_ then
_cpath_ = package.cpath
- clibpaths = file.split_path(_cpath_,";")
+ clibpaths = file.splitpath(_cpath_,";")
end
return clibpaths
end
@@ -40,18 +44,18 @@ local function thepath(...)
local t = { ... } t[#t+1] = "?.lua"
local path = file.join(unpack(t))
if trace_locating then
- logs.report("fileio","! appending '%s' to 'package.path'",path)
+ report_libraries("! appending '%s' to 'package.path'",path)
end
return path
end
local p_libpaths, a_libpaths = { }, { }
-function package.append_libpath(...)
+function package.appendtolibpath(...)
insert(a_libpath,thepath(...))
end
-function package.prepend_libpath(...)
+function package.prependtolibpath(...)
insert(p_libpaths,1,thepath(...))
end
@@ -62,31 +66,30 @@ local function loaded(libpaths,name,simple)
local libpath = libpaths[i]
local resolved = gsub(libpath,"%?",simple)
if trace_locating then -- more detail
- logs.report("fileio","! checking for '%s' on 'package.path': '%s' => '%s'",simple,libpath,resolved)
+ report_libraries("! checking for '%s' on 'package.path': '%s' => '%s'",simple,libpath,resolved)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'package.path': '%s'",name,resolved)
+ report_libraries("! lib '%s' located via 'package.path': '%s'",name,resolved)
end
return loadfile(resolved)
end
end
end
-
package.loaders[2] = function(name) -- was [#package.loaders+1]
if trace_locating then -- mode detail
- logs.report("fileio","! locating '%s'",name)
+ report_libraries("! locating '%s'",name)
end
for i=1,#libformats do
local format = libformats[i]
- local resolved = resolvers.find_file(name,format) or ""
+ local resolved = resolvers.findfile(name,format) or ""
if trace_locating then -- mode detail
- logs.report("fileio","! checking for '%s' using 'libformat path': '%s'",name,format)
+ report_libraries("! checking for '%s' using 'libformat path': '%s'",name,format)
end
if resolved ~= "" then
if trace_locating then
- logs.report("fileio","! lib '%s' located via environment: '%s'",name,resolved)
+ report_libraries("! lib '%s' located via environment: '%s'",name,resolved)
end
return loadfile(resolved)
end
@@ -104,16 +107,16 @@ package.loaders[2] = function(name) -- was [#package.loaders+1]
for i=1,#clibformats do
-- better have a dedicated loop
local format = clibformats[i]
- local paths = resolvers.expanded_path_list_from_var(format)
+ local paths = resolvers.expandedpathlistfromvariable(format)
for p=1,#paths do
local path = paths[p]
local resolved = file.join(path,libname)
if trace_locating then -- mode detail
- logs.report("fileio","! checking for '%s' using 'clibformat path': '%s'",libname,path)
+ report_libraries("! checking for '%s' using 'clibformat path': '%s'",libname,path)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'clibformat': '%s'",libname,resolved)
+ report_libraries("! lib '%s' located via 'clibformat': '%s'",libname,resolved)
end
return package.loadlib(resolved,name)
end
@@ -123,30 +126,40 @@ package.loaders[2] = function(name) -- was [#package.loaders+1]
local libpath = clibpaths[i]
local resolved = gsub(libpath,"?",simple)
if trace_locating then -- more detail
- logs.report("fileio","! checking for '%s' on 'package.cpath': '%s'",simple,libpath)
+ report_libraries("! checking for '%s' on 'package.cpath': '%s'",simple,libpath)
end
- if resolvers.isreadable.file(resolved) then
+ if file.is_readable(resolved) then
if trace_locating then
- logs.report("fileio","! lib '%s' located via 'package.cpath': '%s'",name,resolved)
+ report_libraries("! lib '%s' located via 'package.cpath': '%s'",name,resolved)
end
return package.loadlib(resolved,name)
end
end
-- just in case the distribution is messed up
if trace_loading then -- more detail
- logs.report("fileio","! checking for '%s' using 'luatexlibs': '%s'",name)
+ report_libraries("! checking for '%s' using 'luatexlibs': '%s'",name)
end
- local resolved = resolvers.find_file(file.basename(name),'luatexlibs') or ""
+ local resolved = resolvers.findfile(file.basename(name),'luatexlibs') or ""
if resolved ~= "" then
if trace_locating then
- logs.report("fileio","! lib '%s' located by basename via environment: '%s'",name,resolved)
+ report_libraries("! lib '%s' located by basename via environment: '%s'",name,resolved)
end
return loadfile(resolved)
end
if trace_locating then
- logs.report("fileio",'? unable to locate lib: %s',name)
+ report_libraries('? unable to locate lib: %s',name)
end
-- return "unable to locate " .. name
end
resolvers.loadlualib = require
+
+-- -- -- --
+
+package.obsolete = package.obsolete or { }
+
+package.append_libpath = appendtolibpath -- will become obsolete
+package.prepend_libpath = prependtolibpath -- will become obsolete
+
+package.obsolete.append_libpath = appendtolibpath -- will become obsolete
+package.obsolete.prepend_libpath = prependtolibpath -- will become obsolete
diff --git a/Master/texmf-dist/tex/context/base/data-met.lua b/Master/texmf-dist/tex/context/base/data-met.lua
new file mode 100644
index 00000000000..5437d9a294f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/data-met.lua
@@ -0,0 +1,128 @@
+if not modules then modules = { } end modules ['data-met'] = {
+ version = 1.100,
+ 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 find, format = string.find, string.format
+local sequenced = table.sequenced
+local addurlscheme, urlhashed = url.addscheme, url.hashed
+
+local trace_locating = false
+
+trackers.register("resolvers.locating", function(v) trace_methods = v end)
+trackers.register("resolvers.methods", function(v) trace_methods = v end)
+
+--~ trace_methods = true
+
+local report_methods = logs.reporter("resolvers","methods")
+
+local allocate = utilities.storage.allocate
+
+local resolvers = resolvers
+
+local registered = { }
+
+local function splitmethod(filename) -- todo: filetype in specification
+ if not filename then
+ return { scheme = "unknown", original = filename }
+ end
+ if type(filename) == "table" then
+ return filename -- already split
+ end
+ filename = file.collapsepath(filename)
+ if not find(filename,"://") then
+ return { scheme = "file", path = filename, original = filename, filename = filename }
+ end
+ local specification = url.hashed(filename)
+ if not specification.scheme or specification.scheme == "" then
+ return { scheme = "file", path = filename, original = filename, filename = filename }
+ else
+ return specification
+ end
+end
+
+resolvers.splitmethod = splitmethod -- bad name but ok
+
+-- the second argument is always analyzed (saves time later on) and the original
+-- gets passed as original but also as argument
+
+local function methodhandler(what,first,...) -- filename can be nil or false
+ local method = registered[what]
+ if method then
+ local how, namespace = method.how, method.namespace
+ if how == "uri" or how == "url" then
+ local specification = splitmethod(first)
+ local scheme = specification.scheme
+ local resolver = namespace and namespace[scheme]
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, scheme=%s, argument=%s",what,how,scheme,first)
+ end
+ return resolver(specification,...)
+ else
+ resolver = namespace.default or namespace.file
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, default, argument=%s",what,how,first)
+ end
+ return resolver(specification,...)
+ elseif trace_methods then
+ report_methods("resolver: method=%s, how=%s, no handler",what,how)
+ end
+ end
+ elseif how == "tag" then
+ local resolver = namespace and namespace[first]
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, tag=%s",what,how,first)
+ end
+ return resolver(...)
+ else
+ resolver = namespace.default or namespace.file
+ if resolver then
+ if trace_methods then
+ report_methods("resolver: method=%s, how=%s, default",what,how)
+ end
+ return resolver(...)
+ elseif trace_methods then
+ report_methods("resolver: method=%s, how=%s, unknown",what,how)
+ end
+ end
+ end
+ else
+ report_methods("resolver: method=%s, unknown",what)
+ end
+end
+
+resolvers.methodhandler = methodhandler
+
+function resolvers.registermethod(name,namespace,how)
+ registered[name] = { how = how or "tag", namespace = namespace }
+ namespace["byscheme"] = function(scheme,filename,...)
+ if scheme == "file" then
+ return methodhandler(name,filename,...)
+ else
+ return methodhandler(name,addurlscheme(filename,scheme),...)
+ end
+ end
+end
+
+local concatinators = allocate { notfound = file.join } -- concatinate paths
+local locators = allocate { notfound = function() end } -- locate databases
+local hashers = allocate { notfound = function() end } -- load databases
+local generators = allocate { notfound = function() end } -- generate databases
+
+resolvers.concatinators = concatinators
+resolvers.locators = locators
+resolvers.hashers = hashers
+resolvers.generators = generators
+
+local registermethod = resolvers.registermethod
+
+registermethod("concatinators",concatinators,"tag")
+registermethod("locators", locators, "uri")
+registermethod("hashers", hashers, "uri")
+registermethod("generators", generators, "uri")
diff --git a/Master/texmf-dist/tex/context/base/data-out.lua b/Master/texmf-dist/tex/context/base/data-out.lua
index f73ff9bdcf7..11304c2ced3 100644
--- a/Master/texmf-dist/tex/context/base/data-out.lua
+++ b/Master/texmf-dist/tex/context/base/data-out.lua
@@ -6,5 +6,13 @@ if not modules then modules = { } end modules ['data-out'] = {
license = "see context related readme files"
}
-outputs = outputs or { }
+local allocate = utilities.storage.allocate
+local resolvers = resolvers
+local registermethod = resolvers.registermethod
+
+local savers = allocate { helpers = { } }
+
+resolvers.savers = savers
+
+registermethod("savers", savers, "uri")
diff --git a/Master/texmf-dist/tex/context/base/data-pre.lua b/Master/texmf-dist/tex/context/base/data-pre.lua
index 9348f6cd39c..f774ba6eb0d 100644
--- a/Master/texmf-dist/tex/context/base/data-pre.lua
+++ b/Master/texmf-dist/tex/context/base/data-pre.lua
@@ -1,4 +1,4 @@
-if not modules then modules = { } end modules ['data-res'] = {
+if not modules then modules = { } end modules ['data-pre'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -6,17 +6,29 @@ if not modules then modules = { } end modules ['data-res'] = {
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.
+
+-- As we use this beforehand we will move this up in the chain
+-- of loading.
+
--~ 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 upper, lower, gsub = string.upper, string.lower, string.gsub
+local resolvers = resolvers
+local prefixes = utilities.storage.allocate()
+resolvers.prefixes = prefixes
-local prefixes = { }
+local gsub = string.gsub
+local cleanpath, findgivenfile, expansion = resolvers.cleanpath, resolvers.findgivenfile, resolvers.expansion
+local getenv = resolvers.getenv -- we can probably also use resolvers.expansion
+local P, Cs, lpegmatch = lpeg.P, lpeg.Cs, lpeg.match
prefixes.environment = function(str)
- return resolvers.clean_path(os.getenv(str) or os.getenv(upper(str)) or os.getenv(lower(str)) or "")
+ return cleanpath(expansion(str))
end
-prefixes.relative = function(str,n)
+prefixes.relative = function(str,n) -- lfs.isfile
if io.exists(str) then
-- nothing
elseif io.exists("./" .. str) then
@@ -32,7 +44,7 @@ prefixes.relative = function(str,n)
end
end
end
- return resolvers.clean_path(str)
+ return cleanpath(str)
end
prefixes.auto = function(str)
@@ -44,18 +56,34 @@ prefixes.auto = function(str)
end
prefixes.locate = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path((fullname ~= "" and fullname) or str)
+ local fullname = findgivenfile(str) or ""
+ return cleanpath((fullname ~= "" and fullname) or str)
end
prefixes.filename = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path(file.basename((fullname ~= "" and fullname) or str))
+ local fullname = findgivenfile(str) or ""
+ return cleanpath(file.basename((fullname ~= "" and fullname) or str))
end
prefixes.pathname = function(str)
- local fullname = resolvers.find_given_file(str) or ""
- return resolvers.clean_path(file.dirname((fullname ~= "" and fullname) or str))
+ local fullname = findgivenfile(str) or ""
+ return cleanpath(file.dirname((fullname ~= "" and fullname) or str))
+end
+
+prefixes.selfautoloc = function(str)
+ return cleanpath(file.join(getenv('SELFAUTOLOC'),str))
+end
+
+prefixes.selfautoparent = function(str)
+ return cleanpath(file.join(getenv('SELFAUTOPARENT'),str))
+end
+
+prefixes.selfautodir = function(str)
+ return cleanpath(file.join(getenv('SELFAUTODIR'),str))
+end
+
+prefixes.home = function(str)
+ return cleanpath(file.join(getenv('HOME'),str))
end
prefixes.env = prefixes.environment
@@ -84,19 +112,28 @@ local function _resolve_(method,target)
end
end
-local function resolve(str)
- if type(str) == "table" then
- for k=1,#str do
- local v = str[k]
- str[k] = resolve(v) or v
- end
- elseif str and str ~= "" then
- str = gsub(str,"([a-z]+):([^ \"\']*)",_resolve_)
+local resolved, abstract = { }, { }
+
+function resolvers.resetresolve(str)
+ resolved, abstract = { }, { }
+end
+
+local function resolve(str) -- use schemes, this one is then for the commandline only
+ local res = resolved[str]
+ if not res then
+ res = gsub(str,"([a-z][a-z]+):([^ \"\']*)",_resolve_)
+ resolved[str] = res
+ abstract[res] = str
end
- return str
+ return res
+end
+
+local function unresolve(str)
+ return abstract[str] or str
end
-resolvers.resolve = resolve
+resolvers.resolve = resolve
+resolvers.unresolve = unresolve
if os.uname then
@@ -107,3 +144,39 @@ if os.uname then
end
end
+
+if os.type == "unix" then
+
+ local pattern
+
+ local function makepattern(t,k,v)
+ local colon = P(":")
+ local 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)
+ if t then
+ t[k] = v
+ end
+ end
+
+ makepattern()
+
+ getmetatable(prefixes).__newindex = 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-res.lua b/Master/texmf-dist/tex/context/base/data-res.lua
index ac5177f4a24..842eed16940 100644
--- a/Master/texmf-dist/tex/context/base/data-res.lua
+++ b/Master/texmf-dist/tex/context/base/data-res.lua
@@ -1,4 +1,4 @@
-if not modules then modules = { } end modules ['data-inp'] = {
+if not modules then modules = { } end modules ['data-res'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -6,220 +6,218 @@ if not modules then modules = { } end modules ['data-inp'] = {
license = "see context related readme files",
}
--- After a few years using the code the large luat-inp.lua file
--- has been split up a bit. In the process some functionality was
--- dropped:
---
--- * support for reading lsr files
--- * selective scanning (subtrees)
--- * some public auxiliary functions were made private
---
--- TODO: os.getenv -> os.env[]
--- TODO: instances.[hashes,cnffiles,configurations,522]
--- TODO: check escaping in find etc, too much, too slow
-
--- This lib is multi-purpose and can be loaded again later on so that
--- additional functionality becomes available. We will split thislogs.report("fileio",
--- module in components once we're done with prototyping. This is the
--- first code I wrote for LuaTeX, so it needs some cleanup. Before changing
--- something in this module one can best check with Taco or Hans first; there
--- is some nasty trickery going on that relates to traditional kpse support.
-
--- To be considered: hash key lowercase, first entry in table filename
--- (any case), rest paths (so no need for optimization). Or maybe a
--- separate table that matches lowercase names to mixed case when
--- present. In that case the lower() cases can go away. I will do that
--- only when we run into problems with names ... well ... Iwona-Regular.
-
--- Beware, loading and saving is overloaded in luat-tmp!
+-- In practice we will work within one tds tree, but i want to keep
+-- the option open to build tools that look at multiple trees, which is
+-- why we keep the tree specific data in a table. We used to pass the
+-- instance but for practical purposes we now avoid this and use a
+-- instance variable. We always have one instance active (sort of global).
+
+-- todo: cache:/// home:///
local format, gsub, find, lower, upper, match, gmatch = string.format, string.gsub, string.find, string.lower, string.upper, string.match, string.gmatch
local concat, insert, sortedkeys = table.concat, table.insert, table.sortedkeys
-local next, type = next, type
-local lpegmatch = lpeg.match
-
-local trace_locating, trace_detail, trace_expansions = false, false, false
-
-trackers.register("resolvers.locating", function(v) trace_locating = v end)
-trackers.register("resolvers.details", function(v) trace_detail = v end)
-trackers.register("resolvers.expansions", function(v) trace_expansions = v end) -- todo
-
-if not resolvers then
- resolvers = {
- suffixes = { },
- formats = { },
- dangerous = { },
- suffixmap = { },
- alternatives = { },
- locators = { }, -- locate databases
- hashers = { }, -- load databases
- generators = { }, -- generate databases
- }
-end
+local next, type, rawget = next, type, rawget
+local os = os
+
+local P, S, R, C, Cc, Cs, Ct, Carg = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Carg
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+
+local filedirname = file.dirname
+local filebasename = file.basename
+local fileextname = file.extname
+local filejoin = file.join
+local collapsepath = file.collapsepath
+local joinpath = file.joinpath
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+
+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 report_resolving = logs.reporter("resolvers","resolving")
local resolvers = resolvers
-resolvers.locators .notfound = { nil }
-resolvers.hashers .notfound = { nil }
-resolvers.generators.notfound = { nil }
-
-resolvers.cacheversion = '1.0.1'
-resolvers.cnfname = 'texmf.cnf'
-resolvers.luaname = 'texmfcnf.lua'
-resolvers.homedir = os.env[os.type == "windows" and 'USERPROFILE'] or os.env['HOME'] or '~'
-resolvers.cnfdefault = '{$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}'
-
-local dummy_path_expr = "^!*unset/*$"
-
-local formats = resolvers.formats
-local suffixes = resolvers.suffixes
-local dangerous = resolvers.dangerous
-local suffixmap = resolvers.suffixmap
-local alternatives = resolvers.alternatives
-
-formats['afm'] = 'AFMFONTS' suffixes['afm'] = { 'afm' }
-formats['enc'] = 'ENCFONTS' suffixes['enc'] = { 'enc' }
-formats['fmt'] = 'TEXFORMATS' suffixes['fmt'] = { 'fmt' }
-formats['map'] = 'TEXFONTMAPS' suffixes['map'] = { 'map' }
-formats['mp'] = 'MPINPUTS' suffixes['mp'] = { 'mp' }
-formats['ocp'] = 'OCPINPUTS' suffixes['ocp'] = { 'ocp' }
-formats['ofm'] = 'OFMFONTS' suffixes['ofm'] = { 'ofm', 'tfm' }
-formats['otf'] = 'OPENTYPEFONTS' suffixes['otf'] = { 'otf' } -- 'ttf'
-formats['opl'] = 'OPLFONTS' suffixes['opl'] = { 'opl' }
-formats['otp'] = 'OTPINPUTS' suffixes['otp'] = { 'otp' }
-formats['ovf'] = 'OVFFONTS' suffixes['ovf'] = { 'ovf', 'vf' }
-formats['ovp'] = 'OVPFONTS' suffixes['ovp'] = { 'ovp' }
-formats['tex'] = 'TEXINPUTS' suffixes['tex'] = { 'tex' }
-formats['tfm'] = 'TFMFONTS' suffixes['tfm'] = { 'tfm' }
-formats['ttf'] = 'TTFONTS' suffixes['ttf'] = { 'ttf', 'ttc', 'dfont' }
-formats['pfb'] = 'T1FONTS' suffixes['pfb'] = { 'pfb', 'pfa' }
-formats['vf'] = 'VFFONTS' suffixes['vf'] = { 'vf' }
-
-formats['fea'] = 'FONTFEATURES' suffixes['fea'] = { 'fea' }
-formats['cid'] = 'FONTCIDMAPS' suffixes['cid'] = { 'cid', 'cidmap' }
-
-formats ['texmfscripts'] = 'TEXMFSCRIPTS' -- new
-suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -- 'lua'
-
-formats ['lua'] = 'LUAINPUTS' -- new
-suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' }
-
--- backward compatible ones
-
-alternatives['map files'] = 'map'
-alternatives['enc files'] = 'enc'
-alternatives['cid maps'] = 'cid' -- great, why no cid files
-alternatives['font feature files'] = 'fea' -- and fea files here
-alternatives['opentype fonts'] = 'otf'
-alternatives['truetype fonts'] = 'ttf'
-alternatives['truetype collections'] = 'ttc'
-alternatives['truetype dictionary'] = 'dfont'
-alternatives['type1 fonts'] = 'pfb'
-
--- obscure ones
-
-formats ['misc fonts'] = ''
-suffixes['misc fonts'] = { }
-
-formats ['sfd'] = 'SFDFONTS'
-suffixes ['sfd'] = { 'sfd' }
-alternatives['subfont definition files'] = 'sfd'
-
--- lib paths
-
-formats ['lib'] = 'CLUAINPUTS' -- new (needs checking)
-suffixes['lib'] = (os.libsuffix and { os.libsuffix }) or { 'dll', 'so' }
+local expandedpathfromlist = resolvers.expandedpathfromlist
+local checkedvariable = resolvers.checkedvariable
+local splitconfigurationpath = resolvers.splitconfigurationpath
+local methodhandler = resolvers.methodhandler
--- In practice we will work within one tds tree, but i want to keep
--- the option open to build tools that look at multiple trees, which is
--- why we keep the tree specific data in a table. We used to pass the
--- instance but for practical pusposes we now avoid this and use a
--- instance variable.
+local initializesetter = utilities.setters.initialize
--- here we catch a few new thingies (todo: add these paths to context.tmf)
---
--- FONTFEATURES = .;$TEXMF/fonts/fea//
--- FONTCIDMAPS = .;$TEXMF/fonts/cid//
+local ostype, osname, osenv, ossetenv, osgetenv = os.type, os.name, os.env, os.setenv, os.getenv
--- we always have one instance active
+resolvers.cacheversion = '1.0.1'
+resolvers.configbanner = ''
+resolvers.homedir = environment.homedir
+resolvers.criticalvars = allocate { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF", "TEXMF", "TEXOS" }
+resolvers.luacnfname = 'texmfcnf.lua'
+resolvers.luacnfstate = "unknown"
-resolvers.instance = resolvers.instance or nil -- the current one (slow access)
-local instance = resolvers.instance or nil -- the current one (fast access)
+-- resolvers.luacnfspec = '{$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}' -- what a rubish path
+resolvers.luacnfspec = 'selfautoparent:{/texmf{-local,}{,/web2c},}}'
-function resolvers.newinstance()
+--~ -- not yet, some reporters expect strings
- -- store once, freeze and faster (once reset we can best use
- -- instance.environment) maybe better have a register suffix
- -- function
+--~ resolvers.luacnfspec = {
+--~ "selfautoparent:/texmf-local",
+--~ "selfautoparent:/texmf-local/web2c",
+--~ "selfautoparent:/texmf",
+--~ "selfautoparent:/texmf/web2c",
+--~ "selfautoparent:",
+--~ }
- for k, v in next, suffixes do
- for i=1,#v do
- local vi = v[i]
- if vi then
- suffixmap[vi] = k
- end
- end
+local unset_variable = "unset"
+
+local formats = resolvers.formats
+local suffixes = resolvers.suffixes
+local dangerous = resolvers.dangerous
+local suffixmap = resolvers.suffixmap
+
+resolvers.defaultsuffixes = { "tex" } -- "mkiv", "cld" -- too tricky
+
+resolvers.instance = resolvers.instance or nil -- the current one (slow access)
+local instance = resolvers.instance or nil -- the current one (fast access)
+
+-- An instance has an environment (coming from the outside, kept raw), variables
+-- (coming from the configuration file), and expansions (variables with nested
+-- variables replaced). One can push something into the outer environment and
+-- its internal copy, but only the later one will be the raw unprefixed variant.
+
+function resolvers.setenv(key,value,raw)
+ if instance then
+ -- this one will be consulted first when we stay inside
+ -- the current environment
+ instance.environment[key] = value
+ -- 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))
end
+end
- -- because vf searching is somewhat dangerous, we want to prevent
- -- too liberal searching esp because we do a lookup on the current
- -- path anyway; only tex (or any) is safe
+-- Beware we don't want empty here as this one can be called early on
+-- and therefore we use rawget.
- for k, v in next, formats do
- dangerous[k] = true
+local function getenv(key)
+ local value = rawget(instance.environment,key)
+ if value and value ~= "" then
+ return value
+ else
+ local e = osgetenv(key)
+ return e ~= nil and e ~= "" and checkedvariable(e) or ""
end
- dangerous.tex = nil
+end
+
+resolvers.getenv = getenv
+resolvers.env = getenv
- -- the instance
+-- We are going to use some metatable trickery where we backtrack from
+-- expansion to variable to environment.
+
+local function resolve(k)
+ return instance.expansions[k]
+end
+
+local dollarstripper = lpeg.stripper("$")
+local inhibitstripper = P("!")^0 * Cs(P(1)^0)
+local backslashswapper = lpeg.replacer("\\","/")
+
+local somevariable = P("$") / ""
+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 cleaner = P("\\") / "/" + P(";") * S("!{}/\\")^0 * P(";")^1 / ";"
+local variablecleaner = Cs((cleaner + P(1))^0)
+
+local somevariable = R("az","AZ","09","__","--")^1 / resolve
+local variable = (P("$")/"") * (somevariable + (P("{")/"") * somevariable * (P("}")/""))
+local variableresolver = Cs((variable + P(1))^0)
+
+local function expandedvariable(var)
+ return lpegmatch(variableexpander,var) or var
+end
+
+function resolvers.newinstance() -- todo: all vars will become lowercase and alphanum only
+
+ if trace_locating then
+ report_resolving("creating instance")
+ end
+
+ local environment, variables, expansions, order = allocate(), allocate(), allocate(), allocate()
local newinstance = {
- rootpath = '',
- treepath = '',
- progname = 'context',
- engine = 'luatex',
- format = '',
- environment = { },
- variables = { },
- expansions = { },
- files = { },
- remap = { },
- configuration = { },
- setup = { },
- order = { },
- found = { },
- foundintrees = { },
- kpsevars = { },
- hashes = { },
- cnffiles = { },
- luafiles = { },
- lists = { },
+ environment = environment,
+ variables = variables,
+ expansions = expansions,
+ order = order,
+ files = allocate(),
+ setups = allocate(),
+ found = allocate(),
+ foundintrees = allocate(),
+ hashes = allocate(),
+ hashed = allocate(),
+ specification = allocate(),
+ lists = allocate(),
+ data = allocate(), -- only for loading
+ fakepaths = allocate(),
remember = true,
diskcache = true,
renewcache = false,
- scandisk = true,
- cachepath = nil,
loaderror = false,
- sortdata = false,
savelists = true,
- cleanuppaths = true,
- allresults = false,
pattern = nil, -- lists
- data = { }, -- only for loading
force_suffixes = true,
- fakepaths = { },
}
- local ne = newinstance.environment
+ setmetatableindex(variables,function(t,k)
+ local v
+ for i=1,#order do
+ v = order[i][k]
+ if v ~= nil then
+ t[k] = v
+ return v
+ end
+ end
+ if v == nil then
+ v = ""
+ end
+ t[k] = v
+ return v
+ end)
- for k,v in next, os.env do
- ne[k] = resolvers.bare_variable(v)
- end
+ setmetatableindex(environment, function(t,k)
+ local v = osgetenv(k)
+ if v == nil then
+ v = variables[k]
+ end
+ if v ~= nil then
+ v = checkedvariable(v) or ""
+ end
+ v = resolvers.repath(v) -- for taco who has a : separated osfontdir
+ t[k] = v
+ return v
+ end)
+
+ setmetatableindex(expansions, function(t,k)
+ local v = environment[k]
+ if type(v) == "string" then
+ v = lpegmatch(variableresolver,v)
+ v = lpegmatch(variablecleaner,v)
+ end
+ t[k] = v
+ return v
+ end)
return newinstance
end
-function resolvers.setinstance(someinstance)
+function resolvers.setinstance(someinstance) -- only one instance is active
instance = someinstance
resolvers.instance = someinstance
return someinstance
@@ -234,501 +232,271 @@ local function reset_hashes()
instance.found = { }
end
-local function check_configuration() -- not yet ok, no time for debugging now
- if os.env["OSFONTDIR"] then
- -- ok
- elseif os.type == "windows" then
- os.setenv("OSFONTDIR","c:/windows/fonts//")
- elseif os.type == "macosx" then
- os.setenv("OSFONTDIR","$HOME/Library/Fonts//;/Library/Fonts//;/System/Library/Fonts//")
- end
-end
-
-function resolvers.bare_variable(str) -- assumes str is a string
- return (gsub(str,"\s*([\"\']?)(.+)%1\s*", "%2"))
-end
-
-function resolvers.settrace(n) -- no longer number but: 'locating' or 'detail'
- if n then
- trackers.disable("resolvers.*")
- trackers.enable("resolvers."..n)
- end
-end
-
-resolvers.settrace(os.getenv("MTX_INPUT_TRACE"))
-
-function resolvers.osenv(key)
- local ie = instance.environment
- local value = ie[key]
- if value == nil then
- -- local e = os.getenv(key)
- local e = os.env[key]
- if e == nil then
- -- value = "" -- false
- else
- value = resolvers.bare_variable(e)
- end
- ie[key] = value
- end
- return value or ""
-end
-
-function resolvers.env(key)
- return instance.environment[key] or resolvers.osenv(key)
-end
-
---
-
-local function expand_vars(lst) -- simple vars
- local variables, env = instance.variables, resolvers.env
- local function resolve(a)
- return variables[a] or env(a)
- end
- for k=1,#lst do
- lst[k] = gsub(lst[k],"%$([%a%d%_%-]+)",resolve)
- end
-end
+local slash = P("/")
-local function expanded_var(var) -- simple vars
- local function resolve(a)
- return instance.variables[a] or resolvers.env(a)
- end
- return (gsub(var,"%$([%a%d%_%-]+)",resolve))
-end
+local pathexpressionpattern = Cs (
+ Cc("^") * (
+ Cc("%") * S(".-")
+ + slash^2 * P(-1) / "/.*"
+ + slash^2 / "/.-/"
+ + (1-slash) * P(-1) * Cc("/")
+ + P(1)
+ )^1 * Cc("$") -- yes or no $
+)
-local function entry(entries,name)
- if name and (name ~= "") then
- name = gsub(name,'%$','')
- local result = entries[name..'.'..instance.progname] or entries[name]
- if result then
- return result
- else
- result = resolvers.env(name)
- if result then
- instance.variables[name] = result
- resolvers.expand_variables()
- return instance.expansions[name] or ""
- end
- end
- end
- return ""
-end
+local cache = { }
-local function is_entry(entries,name)
- if name and name ~= "" then
- name = gsub(name,'%$','')
- return (entries[name..'.'..instance.progname] or entries[name]) ~= nil
+local function makepathexpression(str)
+ if str == "." then
+ return "^%./$"
else
- return false
- end
-end
-
--- {a,b,c,d}
--- a,b,c/{p,q,r},d
--- a,b,c/{p,q,r}/d/{x,y,z}//
--- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
--- a,b,c/{p,q/{x,y,z},r},d/{p,q,r}
--- a{b,c}{d,e}f
--- {a,b,c,d}
--- {a,b,c/{p,q,r},d}
--- {a,b,c/{p,q,r}/d/{x,y,z}//}
--- {a,b,c/{p,q/{x,y,z}},d/{p,q,r}}
--- {a,b,c/{p,q/{x,y,z},w}v,d/{p,q,r}}
--- {$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,.local,}/web2c}
-
--- this one is better and faster, but it took me a while to realize
--- that this kind of replacement is cleaner than messy parsing and
--- fuzzy concatenating we can probably gain a bit with selectively
--- applying lpeg, but experiments with lpeg parsing this proved not to
--- work that well; the parsing is ok, but dealing with the resulting
--- table is a pain because we need to work inside-out recursively
-
-local function do_first(a,b)
- local t = { }
- for s in gmatch(b,"[^,]+") do t[#t+1] = a .. s end
- return "{" .. concat(t,",") .. "}"
-end
-
-local function do_second(a,b)
- local t = { }
- for s in gmatch(a,"[^,]+") do t[#t+1] = s .. b end
- return "{" .. concat(t,",") .. "}"
-end
-
-local function do_both(a,b)
- local t = { }
- for sa in gmatch(a,"[^,]+") do
- for sb in gmatch(b,"[^,]+") do
- t[#t+1] = sa .. sb
+ local c = cache[str]
+ if not c then
+ c = lpegmatch(pathexpressionpattern,str)
+ cache[str] = c
end
+ return c
end
- return "{" .. concat(t,",") .. "}"
-end
-
-local function do_three(a,b,c)
- return a .. b.. c
end
-local function splitpathexpr(str, t, validate)
- -- no need for further optimization as it is only called a
- -- few times, we can use lpeg for the sub
- if trace_expansions then
- logs.report("fileio","expanding variable '%s'",str)
- end
- t = t or { }
- str = gsub(str,",}",",@}")
- str = gsub(str,"{,","{@,")
- -- str = "@" .. str .. "@"
- local ok, done
- while true do
- done = false
- while true do
- str, ok = gsub(str,"([^{},]+){([^{}]+)}",do_first)
- if ok > 0 then done = true else break end
- end
- while true do
- str, ok = gsub(str,"{([^{}]+)}([^{},]+)",do_second)
- if ok > 0 then done = true else break end
- end
- while true do
- str, ok = gsub(str,"{([^{}]+)}{([^{}]+)}",do_both)
- if ok > 0 then done = true else break end
- end
- str, ok = gsub(str,"({[^{}]*){([^{}]+)}([^{}]*})",do_three)
- if ok > 0 then done = true end
- if not done then break end
- end
- str = gsub(str,"[{}]", "")
- str = gsub(str,"@","")
- if validate then
- for s in gmatch(str,"[^,]+") do
- s = validate(s)
- if s then t[#t+1] = s end
- end
- else
- for s in gmatch(str,"[^,]+") do
- t[#t+1] = s
- end
- end
- if trace_expansions then
- for k=1,#t do
- logs.report("fileio","% 4i: %s",k,t[k])
+local function reportcriticalvariables()
+ if trace_locating then
+ for i=1,#resolvers.criticalvars do
+ local k = resolvers.criticalvars[i]
+ local v = resolvers.getenv(k) or "unknown" -- this one will not resolve !
+ report_resolving("variable '%s' set to '%s'",k,v)
end
+ report_resolving()
end
- return t
+ reportcriticalvariables = function() end
end
-local function expanded_path_from_list(pathlist) -- maybe not a list, just a path
- -- a previous version fed back into pathlist
- local newlist, ok = { }, false
- for k=1,#pathlist do
- if find(pathlist[k],"[{}]") then
- ok = true
- break
- end
- end
- if ok then
- local function validate(s)
- s = file.collapse_path(s)
- return s ~= "" and not find(s,dummy_path_expr) and s
- end
- for k=1,#pathlist do
- splitpathexpr(pathlist[k],newlist,validate)
- end
- else
- for k=1,#pathlist do
- for p in gmatch(pathlist[k],"([^,]+)") do
- p = file.collapse_path(p)
- if p ~= "" then newlist[#newlist+1] = p end
+local function identify_configuration_files()
+ local specification = instance.specification
+ if #specification == 0 then
+ local cnfspec = getenv('TEXMFCNF')
+ if cnfspec == "" then
+ cnfspec = resolvers.luacnfspec
+ resolvers.luacnfstate = "default"
+ else
+ resolvers.luacnfstate = "environment"
+ end
+ reportcriticalvariables()
+ local cnfpaths = expandedpathfromlist(resolvers.splitpath(cnfspec))
+ local luacnfname = resolvers.luacnfname
+ for i=1,#cnfpaths do
+ local filename = collapsepath(filejoin(cnfpaths[i],luacnfname))
+ local realname = resolvers.resolve(filename)
+ if lfs.isfile(realname) then
+ specification[#specification+1] = filename
+ if trace_locating then
+ report_resolving("found configuration file '%s'",realname)
+ end
+ elseif trace_locating then
+ report_resolving("unknown configuration file '%s'",realname)
end
end
- end
- return newlist
-end
-
--- we follow a rather traditional approach:
---
--- (1) texmf.cnf given in TEXMFCNF
--- (2) texmf.cnf searched in default variable
---
--- also we now follow the stupid route: if not set then just assume *one*
--- cnf file under texmf (i.e. distribution)
-
-local args = environment and environment.original_arguments or arg -- this needs a cleanup
-
-resolvers.ownbin = resolvers.ownbin or args[-2] or arg[-2] or args[-1] or arg[-1] or arg[0] or "luatex"
-resolvers.ownbin = gsub(resolvers.ownbin,"\\","/")
-
-function resolvers.getownpath()
- local ownpath = resolvers.ownpath or os.selfdir
- if not ownpath or ownpath == "" or ownpath == "unset" then
- ownpath = args[-1] or arg[-1]
- ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
- if not ownpath or ownpath == "" then
- ownpath = args[-0] or arg[-0]
- ownpath = ownpath and file.dirname(gsub(ownpath,"\\","/"))
- end
- local binary = resolvers.ownbin
- if not ownpath or ownpath == "" then
- ownpath = ownpath and file.dirname(binary)
+ if trace_locating then
+ report_resolving()
end
- if not ownpath or ownpath == "" then
- if os.binsuffix ~= "" then
- binary = file.replacesuffix(binary,os.binsuffix)
- end
- for p in gmatch(os.getenv("PATH"),"[^"..io.pathseparator.."]+") do
- local b = file.join(p,binary)
- if lfs.isfile(b) then
- -- we assume that after changing to the path the currentdir function
- -- resolves to the real location and use this side effect here; this
- -- trick is needed because on the mac installations use symlinks in the
- -- path instead of real locations
- local olddir = lfs.currentdir()
- if lfs.chdir(p) then
- local pp = lfs.currentdir()
- if trace_locating and p ~= pp then
- logs.report("fileio","following symlink '%s' to '%s'",p,pp)
+ elseif trace_locating then
+ report_resolving("configuration files already identified")
+ end
+end
+
+local function load_configuration_files()
+ local specification = instance.specification
+ if #specification > 0 then
+ local luacnfname = resolvers.luacnfname
+ for i=1,#specification do
+ local filename = specification[i]
+ local pathname = filedirname(filename)
+ local filename = filejoin(pathname,luacnfname)
+ local realname = resolvers.resolve(filename) -- no shortcut
+ local blob = loadfile(realname)
+ if blob then
+ local setups = instance.setups
+ local data = blob()
+ data = data and data.content
+ if data then
+ if trace_locating then
+ report_resolving("loading configuration file '%s'",filename)
+ report_resolving()
+ end
+ local variables = data.variables or { }
+ local warning = false
+ for k, v in next, data do
+ local variant = type(v)
+ if variant == "table" then
+ initializesetter(filename,k,v)
+ elseif variables[k] == nil then
+ if trace_locating and not warning then
+ report_resolving("variables like '%s' in configuration file '%s' should move to the 'variables' subtable",
+ k,resolvers.resolve(filename))
+ warning = true
+ end
+ variables[k] = v
end
- ownpath = pp
- lfs.chdir(olddir)
- else
- if trace_locating then
- logs.report("fileio","unable to check path '%s'",p)
+ end
+ setups[pathname] = variables
+ if resolvers.luacnfstate == "default" then
+ -- the following code is not tested
+ local cnfspec = variables["TEXMFCNF"]
+ if cnfspec then
+ if trace_locating then
+ report_resolving("reloading configuration due to TEXMF redefinition")
+ end
+ -- we push the value into the main environment (osenv) so
+ -- that it takes precedence over the default one and therefore
+ -- also over following definitions
+ resolvers.setenv('TEXMFCNF',cnfspec) -- resolves prefixes
+ -- we now identify and load the specified configuration files
+ instance.specification = { }
+ identify_configuration_files()
+ load_configuration_files()
+ -- we prevent further overload of the configuration variable
+ resolvers.luacnfstate = "configuration"
+ -- we quit the outer loop
+ break
end
- ownpath = p
end
- break
+
+ else
+ if trace_locating then
+ report_resolving("skipping configuration file '%s' (no content)",filename)
+ end
+ setups[pathname] = { }
+ instance.loaderror = true
end
+ elseif trace_locating then
+ report_resolving("skipping configuration file '%s' (no file)",filename)
+ end
+ instance.order[#instance.order+1] = instance.setups[pathname]
+ if instance.loaderror then
+ break
end
end
- if not ownpath or ownpath == "" then
- ownpath = "."
- logs.report("fileio","forcing fallback ownpath .")
- elseif trace_locating then
- logs.report("fileio","using ownpath '%s'",ownpath)
- end
- end
- resolvers.ownpath = ownpath
- function resolvers.getownpath()
- return resolvers.ownpath
+ elseif trace_locating then
+ report_resolving("warning: no lua configuration files found")
end
- return ownpath
end
-local own_places = { "SELFAUTOLOC", "SELFAUTODIR", "SELFAUTOPARENT", "TEXMFCNF" }
+-- scheme magic ... database loading
-local function identify_own()
- local ownpath = resolvers.getownpath() or dir.current()
- local ie = instance.environment
- if ownpath then
- if resolvers.env('SELFAUTOLOC') == "" then os.env['SELFAUTOLOC'] = file.collapse_path(ownpath) end
- if resolvers.env('SELFAUTODIR') == "" then os.env['SELFAUTODIR'] = file.collapse_path(ownpath .. "/..") end
- if resolvers.env('SELFAUTOPARENT') == "" then os.env['SELFAUTOPARENT'] = file.collapse_path(ownpath .. "/../..") end
- else
- logs.report("fileio","error: unable to locate ownpath")
- os.exit()
- end
- if resolvers.env('TEXMFCNF') == "" then os.env['TEXMFCNF'] = resolvers.cnfdefault end
- if resolvers.env('TEXOS') == "" then os.env['TEXOS'] = resolvers.env('SELFAUTODIR') end
- if resolvers.env('TEXROOT') == "" then os.env['TEXROOT'] = resolvers.env('SELFAUTOPARENT') end
- if trace_locating then
- for i=1,#own_places do
- local v = own_places[i]
- logs.report("fileio","variable '%s' set to '%s'",v,resolvers.env(v) or "unknown")
- end
- end
- identify_own = function() end
-end
-
-function resolvers.identify_cnf()
- if #instance.cnffiles == 0 then
- -- fallback
- identify_own()
- -- the real search
- resolvers.expand_variables()
- local t = resolvers.split_path(resolvers.env('TEXMFCNF'))
- t = expanded_path_from_list(t)
- expand_vars(t) -- redundant
- local function locate(filename,list)
- for i=1,#t do
- local ti = t[i]
- local texmfcnf = file.collapse_path(file.join(ti,filename))
- if lfs.isfile(texmfcnf) then
- list[#list+1] = texmfcnf
- end
- end
+local function load_file_databases()
+ instance.loaderror, instance.files = false, allocate()
+ if not instance.renewcache then
+ local hashes = instance.hashes
+ for k=1,#hashes do
+ local hash = hashes[k]
+ resolvers.hashers.byscheme(hash.type,hash.name)
+ if instance.loaderror then break end
end
- locate(resolvers.luaname,instance.luafiles)
- locate(resolvers.cnfname,instance.cnffiles)
end
end
-local function load_cnf_file(fname)
- fname = resolvers.clean_path(fname)
- local lname = file.replacesuffix(fname,'lua')
- if lfs.isfile(lname) then
- local dname = file.dirname(fname) -- fname ?
- if not instance.configuration[dname] then
- resolvers.load_data(dname,'configuration',lname and file.basename(lname))
- instance.order[#instance.order+1] = instance.configuration[dname]
- end
- else
- f = io.open(fname)
- if f then
- if trace_locating then
- logs.report("fileio","loading configuration file %s", fname)
- end
- local line, data, n, k, v
- local dname = file.dirname(fname)
- if not instance.configuration[dname] then
- instance.configuration[dname] = { }
- instance.order[#instance.order+1] = instance.configuration[dname]
- end
- local data = instance.configuration[dname]
- while true do
- local line, n = f:read(), 0
- if line then
- while true do -- join lines
- line, n = gsub(line,"\\%s*$", "")
- if n > 0 then
- line = line .. f:read()
- else
- break
- end
- end
- if not find(line,"^[%%#]") then
- local l = gsub(line,"%s*%%.*$","")
- local k, v = match(l,"%s*(.-)%s*=%s*(.-)%s*$")
- if k and v and not data[k] then
- v = gsub(v,"[%%#].*",'')
- data[k] = gsub(v,"~","$HOME")
- instance.kpsevars[k] = true
- end
+local function locate_file_databases()
+ -- todo: cache:// and tree:// (runtime)
+ local texmfpaths = resolvers.expandedpathlist('TEXMF')
+ if #texmfpaths > 0 then
+ for i=1,#texmfpaths do
+ local path = collapsepath(texmfpaths[i])
+ local stripped = lpegmatch(inhibitstripper,path) -- the !! thing
+ if stripped ~= "" then
+ local runtime = stripped == path
+ path = resolvers.cleanpath(path)
+ local spec = resolvers.splitmethod(stripped)
+ if spec.scheme == "cache" or spec.scheme == "file" then
+ stripped = spec.path
+ elseif runtime and (spec.noscheme or spec.scheme == "file") then
+ stripped = "tree:///" .. stripped
+ end
+ if trace_locating then
+ if runtime then
+ report_resolving("locating list of '%s' (runtime)",path)
+ else
+ report_resolving("locating list of '%s' (cached)",path)
end
- else
- break
end
+ methodhandler('locators',stripped)
end
- f:close()
- elseif trace_locating then
- logs.report("fileio","skipping configuration file '%s'", fname)
end
- end
-end
-
-local function collapse_cnf_data() -- potential optimization: pass start index (setup and configuration are shared)
- local order = instance.order
- for i=1,#order do
- local c = order[i]
- for k,v in next, c do
- if not instance.variables[k] then
- if instance.environment[k] then
- instance.variables[k] = instance.environment[k]
- else
- instance.kpsevars[k] = true
- instance.variables[k] = resolvers.bare_variable(v)
- end
- end
+ if trace_locating then
+ report_resolving()
end
+ elseif trace_locating then
+ report_resolving("no texmf paths are defined (using TEXMF)")
end
end
-function resolvers.load_cnf()
- local function loadoldconfigdata()
- local cnffiles = instance.cnffiles
- for i=1,#cnffiles do
- load_cnf_file(cnffiles[i])
- end
+local function generate_file_databases()
+ local hashes = instance.hashes
+ for k=1,#hashes do
+ local hash = hashes[k]
+ methodhandler('generators',hash.name)
end
- -- instance.cnffiles contain complete names now !
- -- we still use a funny mix of cnf and new but soon
- -- we will switch to lua exclusively as we only use
- -- the file to collect the tree roots
- if #instance.cnffiles == 0 then
- if trace_locating then
- logs.report("fileio","no cnf files found (TEXMFCNF may not be set/known)")
- end
- else
- local cnffiles = instance.cnffiles
- instance.rootpath = cnffiles[1]
- for k=1,#cnffiles do
- instance.cnffiles[k] = file.collapse_path(cnffiles[k])
- end
- for i=1,3 do
- instance.rootpath = file.dirname(instance.rootpath)
- end
- instance.rootpath = file.collapse_path(instance.rootpath)
- if instance.diskcache and not instance.renewcache then
- resolvers.loadoldconfig(instance.cnffiles)
- if instance.loaderror then
- loadoldconfigdata()
- resolvers.saveoldconfig()
- end
- else
- loadoldconfigdata()
- if instance.renewcache then
- resolvers.saveoldconfig()
- end
- end
- collapse_cnf_data()
+ if trace_locating then
+ report_resolving()
end
- check_configuration()
end
-function resolvers.load_lua()
- if #instance.luafiles == 0 then
- -- yet harmless
- else
- instance.rootpath = instance.luafiles[1]
- local luafiles = instance.luafiles
- for k=1,#luafiles do
- instance.luafiles[k] = file.collapse_path(luafiles[k])
- end
- for i=1,3 do
- instance.rootpath = file.dirname(instance.rootpath)
+local function save_file_databases() -- will become cachers
+ for i=1,#instance.hashes do
+ local hash = instance.hashes[i]
+ local cachename = hash.name
+ if hash.cache then
+ local content = instance.files[cachename]
+ caches.collapsecontent(content)
+ if trace_locating then
+ report_resolving("saving tree '%s'",cachename)
+ end
+ caches.savecontent(cachename,"files",content)
+ elseif trace_locating then
+ report_resolving("not saving runtime tree '%s'",cachename)
end
- instance.rootpath = file.collapse_path(instance.rootpath)
- resolvers.loadnewconfig()
- collapse_cnf_data()
end
- check_configuration()
end
--- database loading
-
-function resolvers.load_hash()
- resolvers.locatelists()
+local function load_databases()
+ locate_file_databases()
if instance.diskcache and not instance.renewcache then
- resolvers.loadfiles()
+ load_file_databases()
if instance.loaderror then
- resolvers.loadlists()
- resolvers.savefiles()
+ generate_file_databases()
+ save_file_databases()
end
else
- resolvers.loadlists()
+ generate_file_databases()
if instance.renewcache then
- resolvers.savefiles()
+ save_file_databases()
end
end
end
-function resolvers.append_hash(type,tag,name)
- if trace_locating then
- logs.report("fileio","hash '%s' appended",tag)
+function resolvers.appendhash(type,name,cache)
+ -- safeguard ... tricky as it's actually a bug when seen twice
+ if not instance.hashed[name] then
+ if trace_locating then
+ report_resolving("hash '%s' appended",name)
+ end
+ insert(instance.hashes, { type = type, name = name, cache = cache } )
+ instance.hashed[name] = cache
end
- insert(instance.hashes, { ['type']=type, ['tag']=tag, ['name']=name } )
end
-function resolvers.prepend_hash(type,tag,name)
- if trace_locating then
- logs.report("fileio","hash '%s' prepended",tag)
+function resolvers.prependhash(type,name,cache)
+ -- safeguard ... tricky as it's actually a bug when seen twice
+ if not instance.hashed[name] then
+ if trace_locating then
+ report_resolving("hash '%s' prepended",name)
+ end
+ insert(instance.hashes, 1, { type = type, name = name, cache = cache } )
+ instance.hashed[name] = cache
end
- insert(instance.hashes, 1, { ['type']=type, ['tag']=tag, ['name']=name } )
end
-function resolvers.extend_texmf_var(specification) -- crap, we could better prepend the hash
--- local t = resolvers.expanded_path_list('TEXMF') -- full expansion
- local t = resolvers.split_path(resolvers.env('TEXMF'))
+function resolvers.extendtexmfvariable(specification) -- crap, we could better prepend the hash
+ local t = resolvers.splitpath(getenv('TEXMF'))
insert(t,1,specification)
local newspec = concat(t,";")
if instance.environment["TEXMF"] then
@@ -738,249 +506,18 @@ function resolvers.extend_texmf_var(specification) -- crap, we could better prep
else
-- weird
end
- resolvers.expand_variables()
reset_hashes()
end
--- locators
-
-function resolvers.locatelists()
- local texmfpaths = resolvers.clean_path_list('TEXMF')
- for i=1,#texmfpaths do
- local path = texmfpaths[i]
- if trace_locating then
- logs.report("fileio","locating list of '%s'",path)
- end
- resolvers.locatedatabase(file.collapse_path(path))
- end
-end
-
-function resolvers.locatedatabase(specification)
- return resolvers.methodhandler('locators', specification)
-end
-
-function resolvers.locators.tex(specification)
- if specification and specification ~= '' and lfs.isdir(specification) then
- if trace_locating then
- logs.report("fileio","tex locator '%s' found",specification)
- end
- resolvers.append_hash('file',specification,filename)
- elseif trace_locating then
- logs.report("fileio","tex locator '%s' not found",specification)
- end
-end
-
--- hashers
-
-function resolvers.hashdatabase(tag,name)
- return resolvers.methodhandler('hashers',tag,name)
-end
-
-function resolvers.loadfiles()
- instance.loaderror = false
- instance.files = { }
- if not instance.renewcache then
- local hashes = instance.hashes
- for k=1,#hashes do
- local hash = hashes[k]
- resolvers.hashdatabase(hash.tag,hash.name)
- if instance.loaderror then break end
- end
- end
-end
-
-function resolvers.hashers.tex(tag,name)
- resolvers.load_data(tag,'files')
-end
-
--- generators:
-
-function resolvers.loadlists()
- local hashes = instance.hashes
- for i=1,#hashes do
- resolvers.generatedatabase(hashes[i].tag)
- end
-end
-
-function resolvers.generatedatabase(specification)
- return resolvers.methodhandler('generators', specification)
-end
-
--- starting with . or .. etc or funny char
-
-local weird = lpeg.P(".")^1 + lpeg.anywhere(lpeg.S("~`!#$%^&*()={}[]:;\"\'||<>,?\n\r\t"))
-
---~ local l_forbidden = lpeg.S("~`!#$%^&*()={}[]:;\"\'||\\/<>,?\n\r\t")
---~ local l_confusing = lpeg.P(" ")
---~ local l_character = lpeg.patterns.utf8
---~ local l_dangerous = lpeg.P(".")
-
---~ local l_normal = (l_character - l_forbidden - l_confusing - l_dangerous) * (l_character - l_forbidden - l_confusing^2)^0 * lpeg.P(-1)
---~ ----- l_normal = l_normal * lpeg.Cc(true) + lpeg.Cc(false)
-
---~ local function test(str)
---~ print(str,lpeg.match(l_normal,str))
---~ end
---~ test("ヒラギノ明朝 Pro W3")
---~ test("..ヒラギノ明朝 Pro W3")
---~ test(":ヒラギノ明朝 Pro W3;")
---~ test("ヒラギノ明朝 /Pro W3;")
---~ test("ヒラギノ明朝 Pro W3")
-
-function resolvers.generators.tex(specification)
- local tag = specification
- if trace_locating then
- logs.report("fileio","scanning path '%s'",specification)
- end
- instance.files[tag] = { }
- local files = instance.files[tag]
- local n, m, r = 0, 0, 0
- local spec = specification .. '/'
- local attributes = lfs.attributes
- local directory = lfs.dir
- local function action(path)
- local full
- if path then
- full = spec .. path .. '/'
- else
- full = spec
- end
- for name in directory(full) do
- if not lpegmatch(weird,name) then
- -- if lpegmatch(l_normal,name) then
- local mode = attributes(full..name,'mode')
- if mode == 'file' then
- if path then
- n = n + 1
- local f = files[name]
- if f then
- if type(f) == 'string' then
- files[name] = { f, path }
- else
- f[#f+1] = path
- end
- else -- probably unique anyway
- files[name] = path
- local lower = lower(name)
- if name ~= lower then
- files["remap:"..lower] = name
- r = r + 1
- end
- end
- end
- elseif mode == 'directory' then
- m = m + 1
- if path then
- action(path..'/'..name)
- else
- action(name)
- end
- end
- end
- end
- end
- action()
- if trace_locating then
- logs.report("fileio","%s files found on %s directories with %s uppercase remappings",n,m,r)
- end
-end
-
--- savers, todo
-
-function resolvers.savefiles()
- resolvers.save_data('files')
-end
-
--- A config (optionally) has the paths split in tables. Internally
--- we join them and split them after the expansion has taken place. This
--- is more convenient.
-
---~ local checkedsplit = string.checkedsplit
-
-local cache = { }
-
-local splitter = lpeg.Ct(lpeg.splitat(lpeg.S(os.type == "windows" and ";" or ":;")))
-
-local function split_kpse_path(str) -- beware, this can be either a path or a {specification}
- local found = cache[str]
- if not found then
- if str == "" then
- found = { }
- else
- str = gsub(str,"\\","/")
---~ local split = (find(str,";") and checkedsplit(str,";")) or checkedsplit(str,io.pathseparator)
-local split = lpegmatch(splitter,str)
- found = { }
- for i=1,#split do
- local s = split[i]
- if not find(s,"^{*unset}*") then
- found[#found+1] = s
- end
- end
- if trace_expansions then
- logs.report("fileio","splitting path specification '%s'",str)
- for k=1,#found do
- logs.report("fileio","% 4i: %s",k,found[k])
- end
- end
- cache[str] = found
- end
- end
- return found
-end
-
-resolvers.split_kpse_path = split_kpse_path
-
-function resolvers.splitconfig()
- for i=1,#instance do
- local c = instance[i]
- for k,v in next, c do
- if type(v) == 'string' then
- local t = split_kpse_path(v)
- if #t > 1 then
- c[k] = t
- end
- end
- end
- end
-end
-
-function resolvers.joinconfig()
- local order = instance.order
- for i=1,#order do
- local c = order[i]
- for k,v in next, c do -- indexed?
- if type(v) == 'table' then
- c[k] = file.join_path(v)
- end
- end
- end
-end
-
-function resolvers.split_path(str)
- if type(str) == 'table' then
- return str
- else
- return split_kpse_path(str)
- end
-end
-
-function resolvers.join_path(str)
- if type(str) == 'table' then
- return file.join_path(str)
- else
- return str
- end
-end
-
function resolvers.splitexpansions()
local ie = instance.expansions
for k,v in next, ie do
- local t, h, p = { }, { }, split_kpse_path(v)
+ local t, tn, h, p = { }, 0, { }, splitconfigurationpath(v)
for kk=1,#p do
local vv = p[kk]
if vv ~= "" and not h[vv] then
- t[#t+1] = vv
+ tn = tn + 1
+ t[tn] = vv
h[vv] = true
end
end
@@ -994,343 +531,92 @@ end
-- end of split/join code
-function resolvers.saveoldconfig()
- resolvers.splitconfig()
- resolvers.save_data('configuration')
- resolvers.joinconfig()
-end
-
-resolvers.configbanner = [[
--- This is a Luatex configuration file created by 'luatools.lua' or
--- 'luatex.exe' directly. For comment, suggestions and questions you can
--- contact the ConTeXt Development Team. This configuration file is
--- not copyrighted. [HH & TH]
-]]
-
-function resolvers.serialize(files)
- -- This version is somewhat optimized for the kind of
- -- tables that we deal with, so it's much faster than
- -- the generic serializer. This makes sense because
- -- luatools and mtxtools are called frequently. Okay,
- -- we pay a small price for properly tabbed tables.
- local t = { }
- local function dump(k,v,m) -- could be moved inline
- if type(v) == 'string' then
- return m .. "['" .. k .. "']='" .. v .. "',"
- elseif #v == 1 then
- return m .. "['" .. k .. "']='" .. v[1] .. "',"
- else
- return m .. "['" .. k .. "']={'" .. concat(v,"','").. "'},"
- end
- end
- t[#t+1] = "return {"
- if instance.sortdata then
- local sortedfiles = sortedkeys(files)
- for i=1,#sortedfiles do
- local k = sortedfiles[i]
- local fk = files[k]
- if type(fk) == 'table' then
- t[#t+1] = "\t['" .. k .. "']={"
- local sortedfk = sortedkeys(fk)
- for j=1,#sortedfk do
- local kk = sortedfk[j]
- t[#t+1] = dump(kk,fk[kk],"\t\t")
- end
- t[#t+1] = "\t},"
- else
- t[#t+1] = dump(k,fk,"\t")
- end
- end
- else
- for k, v in next, files do
- if type(v) == 'table' then
- t[#t+1] = "\t['" .. k .. "']={"
- for kk,vv in next, v do
- t[#t+1] = dump(kk,vv,"\t\t")
- end
- t[#t+1] = "\t},"
- else
- t[#t+1] = dump(k,v,"\t")
- end
- end
- end
- t[#t+1] = "}"
- return concat(t,"\n")
-end
-
-local data_state = { }
-
-function resolvers.data_state()
- return data_state or { }
-end
-
-function resolvers.save_data(dataname, makename) -- untested without cache overload
- for cachename, files in next, instance[dataname] do
- local name = (makename or file.join)(cachename,dataname)
- local luaname, lucname = name .. ".lua", name .. ".luc"
- if trace_locating then
- logs.report("fileio","preparing '%s' for '%s'",dataname,cachename)
- end
- for k, v in next, files do
- if type(v) == "table" and #v == 1 then
- files[k] = v[1]
- end
- end
- local data = {
- type = dataname,
- root = cachename,
- version = resolvers.cacheversion,
- date = os.date("%Y-%m-%d"),
- time = os.date("%H:%M:%S"),
- content = files,
- uuid = os.uuid(),
- }
- local ok = io.savedata(luaname,resolvers.serialize(data))
- if ok then
- if trace_locating then
- logs.report("fileio","'%s' saved in '%s'",dataname,luaname)
- end
- if utils.lua.compile(luaname,lucname,false,true) then -- no cleanup but strip
- if trace_locating then
- logs.report("fileio","'%s' compiled to '%s'",dataname,lucname)
- end
- else
- if trace_locating then
- logs.report("fileio","compiling failed for '%s', deleting file '%s'",dataname,lucname)
- end
- os.remove(lucname)
- end
- elseif trace_locating then
- logs.report("fileio","unable to save '%s' in '%s' (access error)",dataname,luaname)
- end
- end
-end
-
-function resolvers.load_data(pathname,dataname,filename,makename) -- untested without cache overload
- filename = ((not filename or (filename == "")) and dataname) or filename
- filename = (makename and makename(dataname,filename)) or file.join(pathname,filename)
- local blob = loadfile(filename .. ".luc") or loadfile(filename .. ".lua")
- if blob then
- local data = blob()
- if data and data.content and data.type == dataname and data.version == resolvers.cacheversion then
- data_state[#data_state+1] = data.uuid
- if trace_locating then
- logs.report("fileio","loading '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
- instance[dataname][pathname] = data.content
- else
- if trace_locating then
- logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
- instance[dataname][pathname] = { }
- instance.loaderror = true
- end
- elseif trace_locating then
- logs.report("fileio","skipping '%s' for '%s' from '%s'",dataname,pathname,filename)
- end
-end
-
--- some day i'll use the nested approach, but not yet (actually we even drop
--- engine/progname support since we have only luatex now)
---
--- first texmfcnf.lua files are located, next the cached texmf.cnf files
---
--- return {
--- TEXMFBOGUS = 'effe checken of dit werkt',
--- }
-
-function resolvers.resetconfig()
- identify_own()
- instance.configuration, instance.setup, instance.order, instance.loaderror = { }, { }, { }, false
-end
-
-function resolvers.loadnewconfig()
- local luafiles = instance.luafiles
- for i=1,#luafiles do
- local cnf = luafiles[i]
- local pathname = file.dirname(cnf)
- local filename = file.join(pathname,resolvers.luaname)
- local blob = loadfile(filename)
- if blob then
- local data = blob()
- if data then
- if trace_locating then
- logs.report("fileio","loading configuration file '%s'",filename)
- end
- if true then
- -- flatten to variable.progname
- local t = { }
- for k, v in next, data do -- v = progname
- if type(v) == "string" then
- t[k] = v
- else
- for kk, vv in next, v do -- vv = variable
- if type(vv) == "string" then
- t[vv.."."..v] = kk
- end
- end
- end
- end
- instance['setup'][pathname] = t
- else
- instance['setup'][pathname] = data
- end
- else
- if trace_locating then
- logs.report("fileio","skipping configuration file '%s'",filename)
- end
- instance['setup'][pathname] = { }
- instance.loaderror = true
- end
- elseif trace_locating then
- logs.report("fileio","skipping configuration file '%s'",filename)
- end
- instance.order[#instance.order+1] = instance.setup[pathname]
- if instance.loaderror then break end
- end
-end
+-- we used to have 'files' and 'configurations' so therefore the following
+-- shared function
-function resolvers.loadoldconfig()
- if not instance.renewcache then
- local cnffiles = instance.cnffiles
- for i=1,#cnffiles do
- local cnf = cnffiles[i]
- local dname = file.dirname(cnf)
- resolvers.load_data(dname,'configuration')
- instance.order[#instance.order+1] = instance.configuration[dname]
- if instance.loaderror then break end
- end
- end
- resolvers.joinconfig()
-end
-
-function resolvers.expand_variables()
- local expansions, environment, variables = { }, instance.environment, instance.variables
- local env = resolvers.env
- instance.expansions = expansions
- local engine, progname = instance.engine, instance.progname
- if type(engine) ~= "string" then instance.engine, engine = "", "" end
- if type(progname) ~= "string" then instance.progname, progname = "", "" end
- if engine ~= "" then environment['engine'] = engine end
- if progname ~= "" then environment['progname'] = progname end
- for k,v in next, environment do
- local a, b = match(k,"^(%a+)%_(.*)%s*$")
- if a and b then
- expansions[a..'.'..b] = v
- else
- expansions[k] = v
- end
- end
- for k,v in next, environment do -- move environment to expansions
- if not expansions[k] then expansions[k] = v end
- end
- for k,v in next, variables do -- move variables to expansions
- if not expansions[k] then expansions[k] = v end
- end
- local busy = false
- local function resolve(a)
- busy = true
- return expansions[a] or env(a)
- end
- while true do
- busy = false
- for k,v in next, expansions do
- local s, n = gsub(v,"%$([%a%d%_%-]+)",resolve)
- local s, m = gsub(s,"%$%{([%a%d%_%-]+)%}",resolve)
- if n > 0 or m > 0 then
- expansions[k]= s
- end
- end
- if not busy then break end
- end
- for k,v in next, expansions do
- expansions[k] = gsub(v,"\\", '/')
- end
+function resolvers.datastate()
+ return caches.contentstate()
end
function resolvers.variable(name)
- return entry(instance.variables,name)
+ local name = name and lpegmatch(dollarstripper,name)
+ local result = name and instance.variables[name]
+ return result ~= nil and result or ""
end
function resolvers.expansion(name)
- return entry(instance.expansions,name)
+ local name = name and lpegmatch(dollarstripper,name)
+ local result = name and instance.expansions[name]
+ return result ~= nil and result or ""
end
-function resolvers.is_variable(name)
- return is_entry(instance.variables,name)
-end
-
-function resolvers.is_expansion(name)
- return is_entry(instance.expansions,name)
-end
-
-function resolvers.unexpanded_path_list(str)
+function resolvers.unexpandedpathlist(str)
local pth = resolvers.variable(str)
- local lst = resolvers.split_path(pth)
- return expanded_path_from_list(lst)
+ local lst = resolvers.splitpath(pth)
+ return expandedpathfromlist(lst)
end
-function resolvers.unexpanded_path(str)
- return file.join_path(resolvers.unexpanded_path_list(str))
+function resolvers.unexpandedpath(str)
+ return joinpath(resolvers.unexpandedpathlist(str))
end
-do -- no longer needed
+local done = { }
- local done = { }
-
- function resolvers.reset_extra_path()
- local ep = instance.extra_paths
- if not ep then
- ep, done = { }, { }
- instance.extra_paths = ep
- elseif #ep > 0 then
- instance.lists, done = { }, { }
- end
+function resolvers.resetextrapath()
+ local ep = instance.extra_paths
+ if not ep then
+ ep, done = { }, { }
+ instance.extra_paths = ep
+ elseif #ep > 0 then
+ instance.lists, done = { }, { }
end
+end
- function resolvers.register_extra_path(paths,subpaths)
- local ep = instance.extra_paths or { }
- local n = #ep
- if paths and paths ~= "" then
- if subpaths and subpaths ~= "" then
- for p in gmatch(paths,"[^,]+") do
- -- we gmatch each step again, not that fast, but used seldom
- for s in gmatch(subpaths,"[^,]+") do
- local ps = p .. "/" .. s
- if not done[ps] then
- ep[#ep+1] = resolvers.clean_path(ps)
- done[ps] = true
- end
- end
- end
- else
- for p in gmatch(paths,"[^,]+") do
- if not done[p] then
- ep[#ep+1] = resolvers.clean_path(p)
- done[p] = true
- end
- end
- end
- elseif subpaths and subpaths ~= "" then
- for i=1,n do
+function resolvers.registerextrapath(paths,subpaths)
+ local ep = instance.extra_paths or { }
+ local oldn = #ep
+ local newn = oldn
+ if paths and paths ~= "" then
+ if subpaths and subpaths ~= "" then
+ for p in gmatch(paths,"[^,]+") do
-- we gmatch each step again, not that fast, but used seldom
for s in gmatch(subpaths,"[^,]+") do
- local ps = ep[i] .. "/" .. s
+ local ps = p .. "/" .. s
if not done[ps] then
- ep[#ep+1] = resolvers.clean_path(ps)
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(ps)
done[ps] = true
end
end
end
+ else
+ for p in gmatch(paths,"[^,]+") do
+ if not done[p] then
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(p)
+ done[p] = true
+ end
+ end
end
- if #ep > 0 then
- instance.extra_paths = ep -- register paths
- end
- if #ep > n then
- instance.lists = { } -- erase the cache
+ elseif subpaths and subpaths ~= "" then
+ for i=1,oldn do
+ -- we gmatch each step again, not that fast, but used seldom
+ for s in gmatch(subpaths,"[^,]+") do
+ local ps = ep[i] .. "/" .. s
+ if not done[ps] then
+ newn = newn + 1
+ ep[newn] = resolvers.cleanpath(ps)
+ done[ps] = true
+ end
+ end
end
end
-
+ if newn > 0 then
+ instance.extra_paths = ep -- register paths
+ end
+ if newn > oldn then
+ instance.lists = { } -- erase the cache
+ end
end
local function made_list(instance,list)
@@ -1338,14 +624,15 @@ local function made_list(instance,list)
if not ep or #ep == 0 then
return list
else
- local done, new = { }, { }
+ 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
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
else
break
end
@@ -1356,7 +643,8 @@ local function made_list(instance,list)
local v = ep[k]
if not done[v] then
done[v] = true
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
end
end
-- next the formal paths
@@ -1364,118 +652,95 @@ local function made_list(instance,list)
local v = list[k]
if not done[v] then
done[v] = true
- new[#new+1] = v
+ newn = newn + 1
+ new[newn] = v
end
end
return new
end
end
-function resolvers.clean_path_list(str)
- local t = resolvers.expanded_path_list(str)
+function resolvers.cleanpathlist(str)
+ local t = resolvers.expandedpathlist(str)
if t then
for i=1,#t do
- t[i] = file.collapse_path(resolvers.clean_path(t[i]))
+ t[i] = collapsepath(resolvers.cleanpath(t[i]))
end
end
return t
end
-function resolvers.expand_path(str)
- return file.join_path(resolvers.expanded_path_list(str))
+function resolvers.expandpath(str)
+ return joinpath(resolvers.expandedpathlist(str))
end
-function resolvers.expanded_path_list(str)
+function resolvers.expandedpathlist(str)
if not str then
- return ep or { } -- ep ?
+ return { }
elseif instance.savelists then
- -- engine+progname hash
- str = gsub(str,"%$","")
+ str = lpegmatch(dollarstripper,str)
if not instance.lists[str] then -- cached
- local lst = made_list(instance,resolvers.split_path(resolvers.expansion(str)))
- instance.lists[str] = expanded_path_from_list(lst)
+ local lst = made_list(instance,resolvers.splitpath(resolvers.expansion(str)))
+ instance.lists[str] = expandedpathfromlist(lst)
end
return instance.lists[str]
else
- local lst = resolvers.split_path(resolvers.expansion(str))
- return made_list(instance,expanded_path_from_list(lst))
+ local lst = resolvers.splitpath(resolvers.expansion(str))
+ return made_list(instance,expandedpathfromlist(lst))
end
end
-function resolvers.expanded_path_list_from_var(str) -- brrr
- local tmp = resolvers.var_of_format_or_suffix(gsub(str,"%$",""))
- if tmp ~= "" then
- return resolvers.expanded_path_list(tmp)
- else
- return resolvers.expanded_path_list(str)
- end
-end
-
-function resolvers.expand_path_from_var(str)
- return file.join_path(resolvers.expanded_path_list_from_var(str))
+function resolvers.expandedpathlistfromvariable(str) -- brrr
+ str = lpegmatch(dollarstripper,str)
+ local tmp = resolvers.variableofformatorsuffix(str)
+ return resolvers.expandedpathlist(tmp ~= "" and tmp or str)
end
-function resolvers.format_of_var(str)
- return formats[str] or formats[alternatives[str]] or ''
-end
-function resolvers.format_of_suffix(str)
- return suffixmap[file.extname(str)] or 'tex'
+function resolvers.expandpathfromvariable(str)
+ return joinpath(resolvers.expandedpathlistfromvariable(str))
end
-function resolvers.variable_of_format(str)
- return formats[str] or formats[alternatives[str]] or ''
+function resolvers.expandbraces(str) -- output variable and brace expansion of STRING
+ local ori = resolvers.variable(str)
+ local pth = expandedpathfromlist(resolvers.splitpath(ori))
+ return joinpath(pth)
end
-function resolvers.var_of_format_or_suffix(str)
- local v = formats[str]
- if v then
- return v
- end
- v = formats[alternatives[str]]
- if v then
- return v
- end
- v = suffixmap[file.extname(str)]
- if v then
- return formats[isf]
+function resolvers.registerfilehash(name,content,someerror)
+ if content then
+ instance.files[name] = content
+ else
+ instance.files[name] = { }
+ if somerror == true then -- can be unset
+ instance.loaderror = someerror
+ end
end
- return ''
-end
-
-function resolvers.expand_braces(str) -- output variable and brace expansion of STRING
- local ori = resolvers.variable(str)
- local pth = expanded_path_from_list(resolvers.split_path(ori))
- return file.join_path(pth)
end
-resolvers.isreadable = { }
-
-function resolvers.isreadable.file(name)
- local readable = lfs.isfile(name) -- brrr
+local function isreadable(name)
+ local readable = lfs.isfile(name) -- not file.is_readable(name) asit can be a dir
if trace_detail then
if readable then
- logs.report("fileio","file '%s' is readable",name)
+ report_resolving("file '%s' is readable",name)
else
- logs.report("fileio","file '%s' is not readable", name)
+ report_resolving("file '%s' is not readable", name)
end
end
return readable
end
-resolvers.isreadable.tex = resolvers.isreadable.file
-
-- name
-- name/name
local function collect_files(names)
- local filelist = { }
+ local filelist, noffiles = { }, 0
for k=1,#names do
local fname = names[k]
if trace_detail then
- logs.report("fileio","checking name '%s'",fname)
+ report_resolving("checking name '%s'",fname)
end
- local bname = file.basename(fname)
- local dname = file.dirname(fname)
+ local bname = filebasename(fname)
+ local dname = filedirname(fname)
if dname == "" or find(dname,"^%.") then
dname = false
else
@@ -1484,11 +749,11 @@ local function collect_files(names)
local hashes = instance.hashes
for h=1,#hashes do
local hash = hashes[h]
- local blobpath = hash.tag
+ local blobpath = hash.name
local files = blobpath and instance.files[blobpath]
if files then
if trace_detail then
- logs.report("fileio","deep checking '%s' (%s)",blobpath,bname)
+ report_resolving("deep checking '%s' (%s)",blobpath,bname)
end
local blobfile = files[bname]
if not blobfile then
@@ -1500,62 +765,51 @@ local function collect_files(names)
end
end
if blobfile then
+ local blobroot = files.__path__ or blobpath
if type(blobfile) == 'string' then
if not dname or find(blobfile,dname) then
- filelist[#filelist+1] = {
- hash.type,
- file.join(blobpath,blobfile,bname), -- search
- resolvers.concatinators[hash.type](blobpath,blobfile,bname) -- result
- }
+ 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 '%s', search '%s', result '%s'",variant,search,result)
+ end
+ noffiles = noffiles + 1
+ filelist[noffiles] = { variant, search, result }
end
else
for kk=1,#blobfile do
local vv = blobfile[kk]
if not dname or find(vv,dname) then
- filelist[#filelist+1] = {
- hash.type,
- file.join(blobpath,vv,bname), -- search
- resolvers.concatinators[hash.type](blobpath,vv,bname) -- result
- }
+ 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 '%s', search '%s', result '%s'",variant,search,result)
+ end
+ noffiles = noffiles + 1
+ filelist[noffiles] = { variant, search, result }
end
end
end
end
elseif trace_locating then
- logs.report("fileio","no match in '%s' (%s)",blobpath,bname)
+ report_resolving("no match in '%s' (%s)",blobpath,bname)
end
end
end
- if #filelist > 0 then
- return filelist
- else
- return nil
- end
-end
-
-function resolvers.suffix_of_format(str)
- if suffixes[str] then
- return suffixes[str][1]
- else
- return ""
- end
+ return noffiles > 0 and filelist or nil
end
-function resolvers.suffixes_of_format(str)
- if suffixes[str] then
- return suffixes[str]
- else
- return {}
- end
-end
-
-function resolvers.register_in_trees(name)
+function resolvers.registerintrees(name)
if not find(name,"^%.") then
instance.foundintrees[name] = (instance.foundintrees[name] or 0) + 1 -- maybe only one
end
end
--- split the next one up for readability (bu this module needs a cleanup anyway)
+-- split the next one up for readability (but this module needs a cleanup anyway)
local function can_be_dir(name) -- can become local
local fakepaths = instance.fakepaths
@@ -1566,61 +820,62 @@ local function can_be_dir(name) -- can become local
fakepaths[name] = 2 -- no directory
end
end
- return (fakepaths[name] == 1)
+ return fakepaths[name] == 1
end
-local function collect_instance_files(filename,collected) -- todo : plugin (scanners, checkers etc)
- local result = collected or { }
+local preparetreepattern = Cs((P(".")/"%%." + P("-")/"%%-" + P(1))^0 * Cc("$"))
+
+-- this one is split in smaller functions but it needs testing
+
+local function collect_instance_files(filename,askedformat,allresults) -- todo : plugin (scanners, checkers etc)
+ local result = { }
local stamp = nil
- filename = file.collapse_path(filename)
+ askedformat = askedformat or ""
+ filename = collapsepath(filename)
-- speed up / beware: format problem
- if instance.remember then
- stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format
+ if instance.remember and not allresults then
+ stamp = filename .. "--" .. askedformat
if instance.found[stamp] then
if trace_locating then
- logs.report("fileio","remembering file '%s'",filename)
+ report_resolving("remembered file '%s'",filename)
end
+ resolvers.registerintrees(filename) -- for tracing used files
return instance.found[stamp]
end
end
- if not dangerous[instance.format or "?"] then
- if resolvers.isreadable.file(filename) then
+ if not dangerous[askedformat] then
+ if isreadable(filename) then
if trace_detail then
- logs.report("fileio","file '%s' found directly",filename)
+ report_resolving("file '%s' found directly",filename)
+ end
+ if stamp then
+ instance.found[stamp] = { filename }
end
- instance.found[stamp] = { filename }
return { filename }
end
end
if find(filename,'%*') then
if trace_locating then
- logs.report("fileio","checking wildcard '%s'", filename)
+ report_resolving("checking wildcard '%s'", filename)
end
- result = resolvers.find_wildcard_files(filename)
+ result = resolvers.findwildcardfiles(filename) -- we can use th elocal
elseif file.is_qualified_path(filename) then
- if resolvers.isreadable.file(filename) then
+ if isreadable(filename) then
if trace_locating then
- logs.report("fileio","qualified name '%s'", filename)
+ report_resolving("qualified name '%s'", filename)
end
result = { filename }
else
- local forcedname, ok, suffix = "", false, file.extname(filename)
+ local forcedname, ok, suffix = "", false, fileextname(filename)
if suffix == "" then -- why
- if instance.format == "" then
- forcedname = filename .. ".tex"
- if resolvers.isreadable.file(forcedname) then
- if trace_locating then
- logs.report("fileio","no suffix, forcing standard filetype 'tex'")
- end
- result, ok = { forcedname }, true
- end
- else
- local suffixes = resolvers.suffixes_of_format(instance.format)
- for _, s in next, suffixes do
+ local format_suffixes = askedformat == "" and resolvers.defaultsuffixes or suffixes[askedformat]
+ if format_suffixes then
+ for i=1,#format_suffixes do
+ local s = format_suffixes[i]
forcedname = filename .. "." .. s
- if resolvers.isreadable.file(forcedname) then
+ if isreadable(forcedname) then
if trace_locating then
- logs.report("fileio","no suffix, forcing format filetype '%s'", s)
+ report_resolving("no suffix, forcing format filetype '%s'", s)
end
result, ok = { forcedname }, true
break
@@ -1631,23 +886,24 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
if not ok and suffix ~= "" then
-- try to find in tree (no suffix manipulation), here we search for the
-- matching last part of the name
- local basename = file.basename(filename)
- local pattern = gsub(filename .. "$","([%.%-])","%%%1")
- local savedformat = instance.format
+ local basename = filebasename(filename)
+ local pattern = lpegmatch(preparetreepattern,filename)
+ -- messy .. to be sorted out
+ local savedformat = askedformat
local format = savedformat or ""
if format == "" then
- instance.format = resolvers.format_of_suffix(suffix)
+ askedformat = resolvers.formatofsuffix(suffix)
end
if not format then
- instance.format = "othertextfiles" -- kind of everything, maybe texinput is better
+ askedformat = "othertextfiles" -- kind of everything, maybe texinput is better
end
--
if basename ~= filename then
- local resolved = collect_instance_files(basename)
- if #result == 0 then
+ local resolved = collect_instance_files(basename,askedformat,allresults)
+ if #result == 0 then -- shouldn't this be resolved ?
local lowered = lower(basename)
if filename ~= lowered then
- resolved = collect_instance_files(lowered)
+ resolved = collect_instance_files(lowered,askedformat,allresults)
end
end
resolvers.format = savedformat
@@ -1672,57 +928,60 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
-- end
end
if not ok and trace_locating then
- logs.report("fileio","qualified name '%s'", filename)
+ report_resolving("qualified name '%s'", filename)
end
end
else
-- search spec
- local filetype, extra, done, wantedfiles, ext = '', nil, false, { }, file.extname(filename)
- if ext == "" then
- if not instance.force_suffixes then
- wantedfiles[#wantedfiles+1] = filename
- end
- else
- wantedfiles[#wantedfiles+1] = filename
- end
- if instance.format == "" then
- if ext == "" then
- local forcedname = filename .. '.tex'
- wantedfiles[#wantedfiles+1] = forcedname
- filetype = resolvers.format_of_suffix(forcedname)
- if trace_locating then
- logs.report("fileio","forcing filetype '%s'",filetype)
+ local filetype, done, wantedfiles, ext = '', false, { }, fileextname(filename)
+ -- -- tricky as filename can be bla.1.2.3
+ -- if not suffixmap[ext] then --- probably needs to be done elsewhere too
+ -- wantedfiles[#wantedfiles+1] = filename
+ -- end
+ wantedfiles[#wantedfiles+1] = filename
+ if askedformat == "" then
+ if ext == "" or not suffixmap[ext] then
+ local defaultsuffixes = resolvers.defaultsuffixes
+ for i=1,#defaultsuffixes do
+ local forcedname = filename .. '.' .. defaultsuffixes[i]
+ wantedfiles[#wantedfiles+1] = forcedname
+ filetype = resolvers.formatofsuffix(forcedname)
+ if trace_locating then
+ report_resolving("forcing filetype '%s'",filetype)
+ end
end
else
- filetype = resolvers.format_of_suffix(filename)
+ filetype = resolvers.formatofsuffix(filename)
if trace_locating then
- logs.report("fileio","using suffix based filetype '%s'",filetype)
+ report_resolving("using suffix based filetype '%s'",filetype)
end
end
else
- if ext == "" then
- local suffixes = resolvers.suffixes_of_format(instance.format)
- for _, s in next, suffixes do
- wantedfiles[#wantedfiles+1] = filename .. "." .. s
+ if ext == "" or not suffixmap[ext] then
+ local format_suffixes = suffixes[askedformat]
+ if format_suffixes then
+ for i=1,#format_suffixes do
+ wantedfiles[#wantedfiles+1] = filename .. "." .. format_suffixes[i]
+ end
end
end
- filetype = instance.format
+ filetype = askedformat
if trace_locating then
- logs.report("fileio","using given filetype '%s'",filetype)
+ report_resolving("using given filetype '%s'",filetype)
end
end
- local typespec = resolvers.variable_of_format(filetype)
- local pathlist = resolvers.expanded_path_list(typespec)
+ local typespec = resolvers.variableofformat(filetype)
+ local pathlist = resolvers.expandedpathlist(typespec)
if not pathlist or #pathlist == 0 then
-- no pathlist, access check only / todo == wildcard
if trace_detail then
- logs.report("fileio","checking filename '%s', filetype '%s', wanted files '%s'",filename, filetype or '?',concat(wantedfiles," | "))
+ report_resolving("checking filename '%s', filetype '%s', wanted files '%s'",filename, filetype or '?',concat(wantedfiles," | "))
end
for k=1,#wantedfiles do
local fname = wantedfiles[k]
- if fname and resolvers.isreadable.file(fname) then
+ if fname and isreadable(fname) then
filename, done = fname, true
- result[#result+1] = file.join('.',fname)
+ result[#result+1] = filejoin('.',fname)
break
end
end
@@ -1730,8 +989,8 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
local filelist = collect_files(wantedfiles)
local fl = filelist and filelist[1]
if fl then
- filename = fl[3]
- result[#result+1] = filename
+ filename = fl[3] -- not local?
+ result[#result+1] = resolvers.resolve(filename)
done = true
end
else
@@ -1740,76 +999,65 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
local dirlist = { }
if filelist then
for i=1,#filelist do
- dirlist[i] = file.dirname(filelist[i][2]) .. "/"
+ dirlist[i] = filedirname(filelist[i][3]) .. "/" -- was [2] .. gamble
end
end
if trace_detail then
- logs.report("fileio","checking filename '%s'",filename)
+ report_resolving("checking filename '%s'",filename)
end
- -- a bit messy ... esp the doscan setting here
- local doscan
for k=1,#pathlist do
local path = pathlist[k]
- if find(path,"^!!") then doscan = false else doscan = true end
- local pathname = gsub(path,"^!+", '')
+ local pathname = lpegmatch(inhibitstripper,path)
+ local doscan = path == pathname -- no ^!!
done = false
-- using file list
if filelist then
- local expression
-- compare list entries with permitted pattern -- /xx /xx//
- if not find(pathname,"/$") then
- expression = pathname .. "/"
- else
- expression = pathname
- end
- expression = gsub(expression,"([%-%.])","%%%1") -- this also influences
- expression = gsub(expression,"//+$", '/.*') -- later usage of pathname
- expression = gsub(expression,"//", '/.-/') -- not ok for /// but harmless
- expression = "^" .. expression .. "$"
+ local expression = makepathexpression(pathname)
if trace_detail then
- logs.report("fileio","using pattern '%s' for path '%s'",expression,pathname)
+ report_resolving("using pattern '%s' for path '%s'",expression,pathname)
end
for k=1,#filelist do
local fl = filelist[k]
local f = fl[2]
local d = dirlist[k]
if find(d,expression) then
- --- todo, test for readable
- result[#result+1] = fl[3]
- resolvers.register_in_trees(f) -- for tracing used files
+ -- todo, test for readable
+ result[#result+1] = resolvers.resolve(fl[3]) -- no shortcut
done = true
- if instance.allresults then
+ if allresults then
if trace_detail then
- logs.report("fileio","match in hash for file '%s' on path '%s', continue scanning",f,d)
+ report_resolving("match to '%s' in hash for file '%s' and path '%s', continue scanning",expression,f,d)
end
else
if trace_detail then
- logs.report("fileio","match in hash for file '%s' on path '%s', quit scanning",f,d)
+ report_resolving("match to '%s' in hash for file '%s' and path '%s', quit scanning",expression,f,d)
end
break
end
elseif trace_detail then
- logs.report("fileio","no match in hash for file '%s' on path '%s'",f,d)
+ report_resolving("no match to '%s' in hash for file '%s' and path '%s'",expression,f,d)
end
end
end
if not done and doscan then
-- check if on disk / unchecked / does not work at all / also zips
- if resolvers.splitmethod(pathname).scheme == 'file' then -- ?
+ local scheme = url.hasscheme(pathname)
+ if not scheme or scheme == "file" then
local pname = gsub(pathname,"%.%*$",'')
if not find(pname,"%*") then
local ppname = gsub(pname,"/+$","")
if can_be_dir(ppname) then
for k=1,#wantedfiles do
local w = wantedfiles[k]
- local fname = file.join(ppname,w)
- if resolvers.isreadable.file(fname) then
+ local fname = filejoin(ppname,w)
+ if isreadable(fname) then
if trace_detail then
- logs.report("fileio","found '%s' by scanning",fname)
+ report_resolving("found '%s' by scanning",fname)
end
result[#result+1] = fname
done = true
- if not instance.allresults then break end
+ if not allresults then break end
end
end
else
@@ -1819,56 +1067,357 @@ local function collect_instance_files(filename,collected) -- todo : plugin (scan
end
end
if not done and doscan then
- -- todo: slow path scanning
+ -- todo: slow path scanning ... although we now have tree:// supported in $TEXMF
end
- if done and not instance.allresults then break end
+ if done and not allresults then break end
end
end
end
for k=1,#result do
- result[k] = file.collapse_path(result[k])
+ local rk = collapsepath(result[k])
+ result[k] = rk
+ resolvers.registerintrees(rk) -- for tracing used files
end
- if instance.remember then
+ if stamp then
instance.found[stamp] = result
end
return result
end
-if not resolvers.concatinators then resolvers.concatinators = { } end
+-- -- -- begin of main file search routing -- -- --
-resolvers.concatinators.tex = file.join
-resolvers.concatinators.file = resolvers.concatinators.tex
+--~ local collect_instance_files
-function resolvers.find_files(filename,filetype,mustexist)
- if type(mustexist) == boolean then
- -- all set
- elseif type(filetype) == 'boolean' then
- filetype, mustexist = nil, false
- elseif type(filetype) ~= 'string' then
- filetype, mustexist = nil, false
- end
- instance.format = filetype or ''
- local result = collect_instance_files(filename)
+--~ local function find_direct(filename)
+--~ if not dangerous[askedformat] and isreadable(filename) then
+--~ if trace_detail then
+--~ report_resolving("file '%s' found directly",filename)
+--~ end
+--~ return { filename }
+--~ end
+--~ end
+
+--~ local function find_wildcard(filename)
+--~ if find(filename,'%*') then
+--~ if trace_locating then
+--~ report_resolving("checking wildcard '%s'", filename)
+--~ end
+--~ return resolvers.findwildcardfiles(filename) -- we can use the local
+--~ end
+--~ end
+
+--~ local function find_qualified(filename) -- this one will be split too
+--~ if not file.is_qualified_path(filename) then
+--~ return
+--~ end
+--~ if trace_locating then
+--~ report_resolving("checking qualified name '%s'", filename)
+--~ end
+--~ if isreadable(filename) then
+--~ if trace_detail then
+--~ report_resolving("qualified file '%s' found", filename)
+--~ end
+--~ return { filename }
+--~ else
+--~ if trace_detail then
+--~ report_resolving("locating qualified file '%s'", filename)
+--~ end
+--~ local forcedname, suffix = "", fileextname(filename)
+--~ if suffix == "" then -- why
+--~ local format_suffixes = askedformat == "" and resolvers.defaultsuffixes or suffixes[askedformat]
+--~ if format_suffixes then
+--~ for i=1,#format_suffixes do
+--~ local s = format_suffixes[i]
+--~ forcedname = filename .. "." .. s
+--~ if isreadable(forcedname) then
+--~ if trace_locating then
+--~ report_resolving("no suffix, forcing format filetype '%s'", s)
+--~ end
+--~ return { forcedname }
+--~ end
+--~ end
+--~ end
+--~ end
+--~ if suffix ~= "" then
+--~ -- try to find in tree (no suffix manipulation), here we search for the
+--~ -- matching last part of the name
+--~ local basename = filebasename(filename)
+--~ local pattern = lpegmatch(preparetreepattern,filename)
+--~ -- messy .. to be sorted out
+--~ local savedformat = askedformat
+--~ local format = savedformat or ""
+--~ if format == "" then
+--~ askedformat = resolvers.formatofsuffix(suffix)
+--~ end
+--~ if not format then
+--~ askedformat = "othertextfiles" -- kind of everything, maybe all
+--~ end
+--~ --
+--~ if basename ~= filename then
+--~ local resolved = collect_instance_files(basename,askedformat,allresults)
+--~ if #resolved == 0 then
+--~ local lowered = lower(basename)
+--~ if filename ~= lowered then
+--~ resolved = collect_instance_files(lowered,askedformat,allresults)
+--~ end
+--~ end
+--~ resolvers.format = savedformat
+--~ --
+--~ if #resolved > 0 then
+--~ local result = { }
+--~ for r=1,#resolved do
+--~ local rr = resolved[r]
+--~ if find(rr,pattern) then
+--~ result[#result+1] = rr
+--~ end
+--~ end
+--~ if #result > 0 then
+--~ return result
+--~ end
+--~ end
+--~ end
+--~ -- a real wildcard:
+--~ --
+--~ -- local filelist = collect_files({basename})
+--~ -- result = { }
+--~ -- for f=1,#filelist do
+--~ -- local ff = filelist[f][3] or ""
+--~ -- if find(ff,pattern) then
+--~ -- result[#result+1], ok = ff, true
+--~ -- end
+--~ -- end
+--~ -- if #result > 0 then
+--~ -- return result
+--~ -- end
+--~ end
+--~ end
+--~ end
+
+--~ local function find_analyze(filename,askedformat)
+--~ local filetype, wantedfiles, ext = '', { }, fileextname(filename)
+--~ -- too tricky as filename can be bla.1.2.3:
+--~ --
+--~ -- if not suffixmap[ext] then
+--~ -- wantedfiles[#wantedfiles+1] = filename
+--~ -- end
+--~ wantedfiles[#wantedfiles+1] = filename
+--~ if askedformat == "" then
+--~ if ext == "" or not suffixmap[ext] then
+--~ local defaultsuffixes = resolvers.defaultsuffixes
+--~ for i=1,#defaultsuffixes do
+--~ local forcedname = filename .. '.' .. defaultsuffixes[i]
+--~ wantedfiles[#wantedfiles+1] = forcedname
+--~ filetype = resolvers.formatofsuffix(forcedname)
+--~ if trace_locating then
+--~ report_resolving("forcing filetype '%s'",filetype)
+--~ end
+--~ end
+--~ else
+--~ filetype = resolvers.formatofsuffix(filename)
+--~ if trace_locating then
+--~ report_resolving("using suffix based filetype '%s'",filetype)
+--~ end
+--~ end
+--~ else
+--~ if ext == "" or not suffixmap[ext] then
+--~ local format_suffixes = suffixes[askedformat]
+--~ if format_suffixes then
+--~ for i=1,#format_suffixes do
+--~ wantedfiles[#wantedfiles+1] = filename .. "." .. format_suffixes[i]
+--~ end
+--~ end
+--~ end
+--~ filetype = askedformat
+--~ if trace_locating then
+--~ report_resolving("using given filetype '%s'",filetype)
+--~ end
+--~ end
+--~ return filetype, wantedfiles
+--~ end
+
+--~ local function find_intree(filename,filetype,wantedfiles)
+--~ local typespec = resolvers.variableofformat(filetype)
+--~ local pathlist = resolvers.expandedpathlist(typespec)
+--~ if pathlist and #pathlist > 0 then
+--~ -- list search
+--~ local filelist = collect_files(wantedfiles)
+--~ local dirlist = { }
+--~ 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 '%s'",filename)
+--~ end
+--~ local result = { }
+--~ for k=1,#pathlist do
+--~ local path = pathlist[k]
+--~ local pathname = lpegmatch(inhibitstripper,path)
+--~ local doscan = path == pathname -- no ^!!
+--~ local done = false
+--~ -- using file list
+--~ if filelist then
+--~ -- compare list entries with permitted pattern -- /xx /xx//
+--~ local expression = makepathexpression(pathname)
+--~ if trace_detail then
+--~ report_resolving("using pattern '%s' for path '%s'",expression,pathname)
+--~ end
+--~ for k=1,#filelist do
+--~ local fl = filelist[k]
+--~ local f = fl[2]
+--~ local d = dirlist[k]
+--~ if find(d,expression) then
+--~ -- todo, test for readable
+--~ result[#result+1] = resolvers.resolve(fl[3]) -- no shortcut
+--~ done = true
+--~ if allresults then
+--~ if trace_detail then
+--~ report_resolving("match to '%s' in hash for file '%s' and path '%s', continue scanning",expression,f,d)
+--~ end
+--~ else
+--~ if trace_detail then
+--~ report_resolving("match to '%s' in hash for file '%s' and path '%s', quit scanning",expression,f,d)
+--~ end
+--~ break
+--~ end
+--~ elseif trace_detail then
+--~ report_resolving("no match to '%s' in hash for file '%s' and path '%s'",expression,f,d)
+--~ end
+--~ end
+--~ end
+--~ if not done and doscan then
+--~ -- check if on disk / unchecked / does not work at all / also zips
+--~ local scheme = url.hasscheme(pathname)
+--~ if not scheme or scheme == "file" then
+--~ local pname = gsub(pathname,"%.%*$",'')
+--~ if not find(pname,"%*") then
+--~ local ppname = gsub(pname,"/+$","")
+--~ if can_be_dir(ppname) then
+--~ for k=1,#wantedfiles do
+--~ local w = wantedfiles[k]
+--~ local fname = filejoin(ppname,w)
+--~ if isreadable(fname) then
+--~ if trace_detail then
+--~ report_resolving("found '%s' by scanning",fname)
+--~ end
+--~ result[#result+1] = fname
+--~ done = true
+--~ if not allresults then break end
+--~ end
+--~ end
+--~ else
+--~ -- no access needed for non existing path, speedup (esp in large tree with lots of fake)
+--~ end
+--~ end
+--~ end
+--~ end
+--~ if not done and doscan then
+--~ -- todo: slow path scanning ... although we now have tree:// supported in $TEXMF
+--~ end
+--~ if done and not allresults then
+--~ return #result > 0 and result
+--~ end
+--~ end
+--~ end
+--~ end
+
+--~ local function find_onpath(filename,filetype,wantedfiles)
+--~ local done = nil
+--~ if trace_detail then
+--~ report_resolving("checking filename '%s', filetype '%s', wanted files '%s'",filename, filetype or '?',concat(wantedfiles," | "))
+--~ end
+--~ for k=1,#wantedfiles do
+--~ local fname = wantedfiles[k]
+--~ if fname and isreadable(fname) then
+--~ filename, done = fname, true
+--~ result[#result+1] = filejoin('.',fname)
+--~ break
+--~ end
+--~ end
+--~ end
+
+--~ local function find_otherwise(filename,filetype,wantedfiles) -- other text files | any | whatever
+--~ local filelist = collect_files(wantedfiles)
+--~ local fl = filelist and filelist[1]
+--~ if fl then
+--~ return { resolvers.resolve(fl[3]) } -- filename
+--~ end
+--~ end
+
+--~ collect_instance_files = function(filename,askedformat,allresults) -- uses nested
+--~ local result, stamp, filetype, wantedfiles
+--~ askedformat = askedformat or ""
+--~ filename = collapsepath(filename)
+--~ if instance.remember and not allresults then
+--~ stamp = format("%s--%s", filename, askedformat)
+--~ result = stamp and instance.found[stamp]
+--~ if result then
+--~ if trace_locating then
+--~ report_resolving("remembered file '%s'",filename)
+--~ end
+--~ return result
+--~ end
+--~ end
+--~ result = find_direct (filename,stamp) or
+--~ find_wildcard (filename) or
+--~ find_qualified(filename)
+--~ if not result then
+--~ filetype, wantedfiles = find_analyze(filename,askedformat)
+--~ result = find_intree (filename,filetype,wantedfiles) or
+--~ find_onpath (filename,filetype,wantedfiles) or
+--~ find_otherwise(filename,filetype,wantedfiles)
+--~ end
+--~ if result then
+--~ for k=1,#result do
+--~ local rk = collapsepath(result[k])
+--~ result[k] = rk
+--~ resolvers.registerintrees(rk) -- for tracing used files
+--~ end
+--~ else
+--~ result = { } -- maybe false
+--~ end
+--~ if stamp then
+--~ if trace_locating then
+--~ report_resolving("remembering file '%s'",filename)
+--~ end
+--~ instance.found[stamp] = result
+--~ end
+--~ return result
+--~ end
+
+-- -- -- end of main file search routing -- -- --
+
+local function findfiles(filename,filetype,allresults)
+ local result = collect_instance_files(filename,filetype or "",allresults)
if #result == 0 then
local lowered = lower(filename)
if filename ~= lowered then
- return collect_instance_files(lowered)
+ return collect_instance_files(lowered,filetype or "",allresults)
end
end
- instance.format = ''
return result
end
-function resolvers.find_file(filename,filetype,mustexist)
- return (resolvers.find_files(filename,filetype,mustexist)[1] or "")
+function resolvers.findfiles(filename,filetype)
+ return findfiles(filename,filetype,true)
+end
+
+function resolvers.findfile(filename,filetype)
+ return findfiles(filename,filetype,false)[1] or ""
+end
+
+function resolvers.findpath(filename,filetype)
+ return filedirname(findfiles(filename,filetype,false)[1] or "")
end
-function resolvers.find_given_files(filename)
- local bname, result = file.basename(filename), { }
+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.tag] or { }
+ local files = instance.files[hash.name] or { }
local blist = files[bname]
if not blist then
local rname = "remap:"..bname
@@ -1880,13 +1429,21 @@ function resolvers.find_given_files(filename)
end
if blist then
if type(blist) == 'string' then
- result[#result+1] = resolvers.concatinators[hash.type](hash.tag,blist,bname) or ""
- if not instance.allresults then break end
+ 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
else
for kk=1,#blist do
local vv = blist[kk]
- result[#result+1] = resolvers.concatinators[hash.type](hash.tag,vv,bname) or ""
- if not instance.allresults then break end
+ 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
+ end
end
end
end
@@ -1894,24 +1451,31 @@ function resolvers.find_given_files(filename)
return result
end
-function resolvers.find_given_file(filename)
- return (resolvers.find_given_files(filename)[1] or "")
+function resolvers.findgivenfiles(filename)
+ return findgivenfiles(filename,true)
+end
+
+function resolvers.findgivenfile(filename)
+ return findgivenfiles(filename,false)[1] or ""
end
-local function doit(path,blist,bname,tag,kind,result,allresults)
+local function doit(path,blist,bname,tag,variant,result,allresults)
local done = false
- if blist and kind then
+ 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
- result[#result+1] = resolvers.concatinators[kind](tag,blist,bname) or ""
+ 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
- result[#result+1] = resolvers.concatinators[kind](tag,vv,bname) or ""
+ local full = methodhandler('concatinators',variant,tag,vv,bname) or ""
+ result[#result+1] = resolve(full)
done = true
if not allresults then break end
end
@@ -1921,30 +1485,38 @@ local function doit(path,blist,bname,tag,kind,result,allresults)
return done
end
-function resolvers.find_wildcard_files(filename) -- todo: remap:
- local result = { }
- local bname, dname = file.basename(filename), file.dirname(filename)
- local path = gsub(dname,"^*/","")
- path = gsub(path,"*",".*")
- path = gsub(path,"-","%%-")
- if dname == "" then
- path = ".*"
- end
- local name = bname
- name = gsub(name,"*",".*")
- name = gsub(name,"-","%%-")
- path = lower(path)
- name = lower(name)
- local files, allresults, done = instance.files, instance.allresults, false
+--~ 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
+)
+
+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
if find(name,"%*") then
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- local tag, kind = hash.tag, hash.type
- for kk, hh in next, files[hash.tag] do
+ 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,tag,kind,result,allresults) then done = true end
+ if doit(path,hh,kk,hashname,hashtype,result,allresults) then done = true end
if done and not allresults then break end
end
end
@@ -1954,8 +1526,8 @@ function resolvers.find_wildcard_files(filename) -- todo: remap:
local hashes = instance.hashes
for k=1,#hashes do
local hash = hashes[k]
- local tag, kind = hash.tag, hash.type
- if doit(path,files[tag][bname],bname,tag,kind,result,allresults) then done = true end
+ local hashname, hashtype = hash.name, hash.type
+ if doit(path,files[hashname][bname],bname,hashname,hashtype,result,allresults) then done = true end
if done and not allresults then break end
end
end
@@ -1964,8 +1536,12 @@ function resolvers.find_wildcard_files(filename) -- todo: remap:
return result
end
-function resolvers.find_wildcard_file(filename)
- return (resolvers.find_wildcard_files(filename)[1] or "")
+function resolvers.findwildcardfiles(filename,result)
+ return findwildcardfiles(filename,true,result)
+end
+
+function resolvers.findwildcardfile(filename)
+ return findwildcardfiles(filename,false)[1] or ""
end
-- main user functions
@@ -1976,34 +1552,33 @@ end
function resolvers.load(option)
statistics.starttiming(instance)
- resolvers.resetconfig()
- resolvers.identify_cnf()
- resolvers.load_lua() -- will become the new method
- resolvers.expand_variables()
- resolvers.load_cnf() -- will be skipped when we have a lua file
- resolvers.expand_variables()
+ identify_configuration_files()
+ load_configuration_files()
if option ~= "nofiles" then
- resolvers.load_hash()
+ load_databases()
resolvers.automount()
end
statistics.stoptiming(instance)
+ local files = instance.files
+ return files and next(files) and true
end
-function resolvers.for_files(command, files, filetype, mustexist)
+local function report(str)
+ if trace_locating then
+ report_resolving(str) -- has already verbose
+ else
+ print(str)
+ end
+end
+
+function resolvers.dowithfilesandreport(command, files, ...) -- will move
if files and #files > 0 then
- local function report(str)
- if trace_locating then
- logs.report("fileio",str) -- has already verbose
- else
- print(str)
- end
- end
if trace_locating then
report('') -- ?
end
for f=1,#files do
local file = files[f]
- local result = command(file,filetype,mustexist)
+ local result = command(file,...)
if type(result) == 'string' then
report(result)
else
@@ -2015,21 +1590,16 @@ function resolvers.for_files(command, files, filetype, mustexist)
end
end
--- strtab
+-- obsolete
-resolvers.var_value = resolvers.variable -- output the value of variable $STRING.
-resolvers.expand_var = resolvers.expansion -- output variable expansion of STRING.
+-- resolvers.varvalue = resolvers.variable -- output the value of variable $STRING.
+-- resolvers.expandvar = resolvers.expansion -- output variable expansion of STRING.
-function resolvers.show_path(str) -- output search path for file type NAME
- return file.join_path(resolvers.expanded_path_list(resolvers.format_of_var(str)))
+function resolvers.showpath(str) -- output search path for file type NAME
+ return joinpath(resolvers.expandedpathlist(resolvers.formatofvariable(str)))
end
--- resolvers.find_file(filename)
--- resolvers.find_file(filename, filetype, mustexist)
--- resolvers.find_file(filename, mustexist)
--- resolvers.find_file(filename, filetype)
-
-function resolvers.register_file(files, name, path)
+function resolvers.registerfile(files, name, path)
if files[name] then
if type(files[name]) == 'string' then
files[name] = { files[name], path }
@@ -2041,129 +1611,94 @@ function resolvers.register_file(files, name, path)
end
end
-function resolvers.splitmethod(filename)
- if not filename then
- return { } -- safeguard
- elseif type(filename) == "table" then
- return filename -- already split
- elseif not find(filename,"://") then
- return { scheme="file", path = filename, original=filename } -- quick hack
- else
- return url.hashed(filename)
+function resolvers.dowithpath(name,func)
+ local pathlist = resolvers.expandedpathlist(name)
+ for i=1,#pathlist do
+ func("^"..resolvers.cleanpath(pathlist[i]))
end
end
-function table.sequenced(t,sep) -- temp here
- local s = { }
- for k, v in next, t do -- indexed?
- s[#s+1] = k .. "=" .. tostring(v)
- end
- return concat(s, sep or " | ")
+function resolvers.dowithvariable(name,func)
+ func(expandedvariable(name))
end
-function resolvers.methodhandler(what, filename, filetype) -- ...
- filename = file.collapse_path(filename)
- local specification = (type(filename) == "string" and resolvers.splitmethod(filename)) or filename -- no or { }, let it bomb
- local scheme = specification.scheme
- if resolvers[what][scheme] then
- if trace_locating then
- logs.report("fileio","handler '%s' -> '%s' -> '%s'",specification.original,what,table.sequenced(specification))
+function resolvers.locateformat(name)
+ local barename = file.removesuffix(name) -- gsub(name,"%.%a+$","")
+ local fmtname = caches.getfirstreadablefile(barename..".fmt","formats") or ""
+ if fmtname == "" then
+ fmtname = resolvers.findfile(barename..".fmt")
+ fmtname = resolvers.cleanpath(fmtname)
+ end
+ if fmtname ~= "" then
+ local barename = file.removesuffix(fmtname)
+ local luaname, lucname, luiname = barename .. ".lua", barename .. ".luc", barename .. ".lui"
+ if lfs.isfile(luiname) then
+ return barename, luiname
+ elseif lfs.isfile(lucname) then
+ return barename, lucname
+ elseif lfs.isfile(luaname) then
+ return barename, luaname
end
- return resolvers[what][scheme](filename,filetype) -- todo: specification
- else
- return resolvers[what].tex(filename,filetype) -- todo: specification
end
+ return nil, nil
end
-function resolvers.clean_path(str)
- if str then
- str = gsub(str,"\\","/")
- str = gsub(str,"^!+","")
- str = gsub(str,"^~",resolvers.homedir)
- return str
+function resolvers.booleanvariable(str,default)
+ local b = resolvers.expansion(str)
+ if b == "" then
+ return default
else
- return nil
- end
-end
-
-function resolvers.do_with_path(name,func)
- local pathlist = resolvers.expanded_path_list(name)
- for i=1,#pathlist do
- func("^"..resolvers.clean_path(pathlist[i]))
+ b = toboolean(b)
+ return (b == nil and default) or b
end
end
-function resolvers.do_with_var(name,func)
- func(expanded_var(name))
-end
-
-function resolvers.with_files(pattern,handle)
+function resolvers.dowithfilesintree(pattern,handle,before,after) -- will move, can be a nice iterator instead
+ local instance = resolvers.instance
local hashes = instance.hashes
for i=1,#hashes do
local hash = hashes[i]
- local blobpath = hash.tag
local blobtype = hash.type
+ local blobpath = hash.name
if blobpath then
+ 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 next, files do
+ total = total + 1
if find(k,"^remap:") then
k = files[k]
- v = files[k] -- chained
+ v = k -- files[k] -- chained
end
if find(k,pattern) then
if type(v) == "string" then
- handle(blobtype,blobpath,v,k)
+ checked = checked + 1
+ if handle(blobtype,blobpath,v,k) then
+ done = done + 1
+ end
else
- for _,vv in next, v do -- indexed
- handle(blobtype,blobpath,vv,k)
+ checked = checked + #v
+ for i=1,#v do
+ if handle(blobtype,blobpath,v[i],k) then
+ done = done + 1
+ end
end
end
end
end
end
+ if after then
+ after(blobtype,blobpath,pattern,total,checked,done)
+ end
end
end
end
-function resolvers.locate_format(name)
- local barename, fmtname = gsub(name,"%.%a+$",""), ""
- if resolvers.usecache then
- local path = file.join(caches.setpath("formats")) -- maybe platform
- fmtname = file.join(path,barename..".fmt") or ""
- end
- if fmtname == "" then
- fmtname = resolvers.find_files(barename..".fmt")[1] or ""
- end
- fmtname = resolvers.clean_path(fmtname)
- if fmtname ~= "" then
- local barename = file.removesuffix(fmtname)
- local luaname, lucname, luiname = barename .. ".lua", barename .. ".luc", barename .. ".lui"
- if lfs.isfile(luiname) then
- return barename, luiname
- elseif lfs.isfile(lucname) then
- return barename, lucname
- elseif lfs.isfile(luaname) then
- return barename, luaname
- end
- end
- return nil, nil
-end
-
-function resolvers.boolean_variable(str,default)
- local b = resolvers.expansion(str)
- if b == "" then
- return default
- else
- b = toboolean(b)
- return (b == nil and default) or b
- end
-end
-
-texconfig.kpse_init = false
-
-kpse = { original = kpse } setmetatable(kpse, { __index = function(k,v) return resolvers[v] end } )
-
--- for a while
+resolvers.obsolete = resolvers.obsolete or { }
+local obsolete = resolvers.obsolete
-input = resolvers
+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 e68b6cd01b9..6c905942a23 100644
--- a/Master/texmf-dist/tex/context/base/data-sch.lua
+++ b/Master/texmf-dist/tex/context/base/data-sch.lua
@@ -8,99 +8,127 @@ if not modules then modules = { } end modules ['data-sch'] = {
local http = require("socket.http")
local ltn12 = require("ltn12")
-
local gsub, concat, format = string.gsub, table.concat, string.format
+local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
local trace_schemes = false trackers.register("resolvers.schemes",function(v) trace_schemes = v end)
-schemes = schemes or { }
+local report_schemes = logs.reporter("resolvers","schemes")
+
+local resolvers = resolvers
-schemes.cached = { }
-schemes.cachepath = caches.definepath("schemes")
+resolvers.schemes = resolvers.schemes or { }
+local schemes = resolvers.schemes
schemes.threshold = 24 * 60 * 60
directives.register("schemes.threshold", function(v) schemes.threshold = tonumber(v) or schemes.threshold end)
-local cached, loaded, reused = schemes.cached, { }, { }
+local cleaners = { }
-local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
+schemes.cleaners = cleaners
+
+function cleaners.none(specification)
+ return specification.original
+end
+
+function cleaners.strip(specification)
+ return (gsub(specification.original,"[^%a%d%.]+","-"))
+end
+
+function cleaners.md5(specification)
+ return file.addsuffix(md5.hex(specification.original),file.suffix(specification.path))
+end
+
+local cleaner = cleaners.strip
-function schemes.curl(name,cachename)
- local command = "curl --silent --create-dirs --output " .. cachename .. " " .. name -- no protocol .. "://"
+directives.register("schemes.cleanmethod", function(v) cleaner = cleaners[v] or cleaners.strip end)
+
+function resolvers.schemes.cleanname(specification)
+ local hash = cleaner(specification)
+ if trace_schemes then
+ report_schemes("hashing %s to %s",specification.original,hash)
+ end
+ return hash
+end
+
+local cached, loaded, reused, thresholds, handlers = { }, { }, { }, { }, { }
+
+local function runcurl(name,cachename) -- will use sockets instead or the curl library
+ local command = "curl --silent --create-dirs --output " .. cachename .. " " .. name
os.spawn(command)
end
-function schemes.fetch(protocol,name,handler)
- local cachename = schemes.cachepath() .. "/" .. gsub(name,"[^%a%d%.]+","-")
- cachename = gsub(cachename,"[\\]", "/") -- cleanup
- if not cached[name] then
+local function fetch(specification)
+ local original = specification.original
+ local scheme = specification.scheme
+ local cleanname = schemes.cleanname(specification)
+ local cachename = caches.setfirstwritablefile(cleanname,"schemes")
+ if not cached[original] then
statistics.starttiming(schemes)
- if not io.exists(cachename) or (os.difftime(os.time(),lfs.attributes(cachename).modification) > schemes.threshold) then
- cached[name] = cachename
+ if not io.exists(cachename) or (os.difftime(os.time(),lfs.attributes(cachename).modification) >
+ (thresholds[protocol] or schemes.threshold)) then
+ cached[original] = cachename
+ local handler = handlers[scheme]
if handler then
if trace_schemes then
- logs.report("schemes","fetching '%s', protocol '%s', method 'built-in'",name,protocol)
+ report_schemes("fetching '%s', protocol '%s', method 'built-in'",original,scheme)
end
- io.flush()
- handler(protocol,name,cachename)
+ logs.flush()
+ handler(specification,cachename)
else
if trace_schemes then
- logs.report("schemes","fetching '%s', protocol '%s', method 'curl'",name,protocol)
+ report_schemes("fetching '%s', protocol '%s', method 'curl'",original,scheme)
end
- io.flush()
- schemes.curl(name,cachename)
+ logs.flush()
+ runcurl(original,cachename)
end
end
if io.exists(cachename) then
- cached[name] = cachename
+ cached[original] = cachename
if trace_schemes then
- logs.report("schemes","using cached '%s', protocol '%s', cachename '%s'",name,protocol,cachename)
+ report_schemes("using cached '%s', protocol '%s', cachename '%s'",original,scheme,cachename)
end
else
- cached[name] = ""
+ cached[original] = ""
if trace_schemes then
- logs.report("schemes","using missing '%s', protocol '%s'",name,protocol)
+ report_schemes("using missing '%s', protocol '%s'",original,scheme)
end
end
- loaded[protocol] = loaded[protocol] + 1
+ loaded[scheme] = loaded[scheme] + 1
statistics.stoptiming(schemes)
else
if trace_schemes then
- logs.report("schemes","reusing '%s', protocol '%s'",name,protocol)
+ report_schemes("reusing '%s', protocol '%s'",original,scheme)
end
- reused[protocol] = reused[protocol] + 1
+ reused[scheme] = reused[scheme] + 1
end
- return cached[name]
+ return cached[original]
end
-function finders.schemes(protocol,filename,handler)
- local foundname = schemes.fetch(protocol,filename,handler)
- return finders.generic(protocol,foundname,filetype)
+local function finder(specification,filetype)
+ return resolvers.methodhandler("finders",fetch(specification),filetype)
end
-function openers.schemes(protocol,filename)
- return openers.generic(protocol,filename)
+local opener = openers.file
+local loader = loaders.file
+
+local function install(scheme,handler,threshold)
+ handlers [scheme] = handler
+ loaded [scheme] = 0
+ reused [scheme] = 0
+ finders [scheme] = finder
+ openers [scheme] = opener
+ loaders [scheme] = loader
+ thresholds[scheme] = threshold or schemes.threshold
end
-function loaders.schemes(protocol,filename)
- return loaders.generic(protocol,filename)
-end
-
--- could be metatable
+schemes.install = install
-function schemes.install(protocol,handler)
- loaded [protocol] = 0
- reused [protocol] = 0
- finders[protocol] = function (filename,filetype) return finders.schemes(protocol,filename,handler) end
- openers[protocol] = function (filename) return openers.schemes(protocol,filename) end
- loaders[protocol] = function (filename) return loaders.schemes(protocol,filename) end
-end
-
-local function http_handler(protocol,name,cachename)
+local function http_handler(specification,cachename)
local tempname = cachename .. ".tmp"
local f = io.open(tempname,"wb")
local status, message = http.request {
- url = name,
+ url = specification.original,
sink = ltn12.sink.file(f)
}
if not status then
@@ -109,34 +137,34 @@ local function http_handler(protocol,name,cachename)
os.remove(cachename)
os.rename(tempname,cachename)
end
+ return cachename
end
-schemes.install('http',http_handler)
-schemes.install('https')
-schemes.install('ftp')
+install('http',http_handler)
+install('https') -- see pod
+install('ftp')
statistics.register("scheme handling time", function()
- local l, r = { }, { }
+ local l, r, nl, nr = { }, { }, 0, 0
for k, v in table.sortedhash(loaded) do
if v > 0 then
- l[#l+1] = k .. ":" .. v
+ nl = nl + 1
+ l[nl] = k .. ":" .. v
end
end
for k, v in table.sortedhash(reused) do
if v > 0 then
- r[#r+1] = k .. ":" .. v
+ nr = nr + 1
+ r[nr] = k .. ":" .. v
end
end
- local n = #l + #r
+ local n = nl + nr
if n > 0 then
- l = (#l > 0 and concat(l)) or "none"
- r = (#r > 0 and concat(r)) or "none"
+ l = (nl > 0 and concat(l)) or "none"
+ r = (nr > 0 and concat(r)) or "none"
return format("%s seconds, %s processed, threshold %s seconds, loaded: %s, reused: %s",
statistics.elapsedtime(schemes), n, schemes.threshold, l, r)
else
return nil
end
end)
-
---~ trace_schemes = true
---~ print(schemes.fetch("http","http://www.pragma-ade.com/show-man.pdf",http_handler))
diff --git a/Master/texmf-dist/tex/context/base/data-tex.lua b/Master/texmf-dist/tex/context/base/data-tex.lua
index c9fa3625a66..14148b20ea8 100644
--- a/Master/texmf-dist/tex/context/base/data-tex.lua
+++ b/Master/texmf-dist/tex/context/base/data-tex.lua
@@ -6,221 +6,161 @@ if not modules then modules = { } end modules ['data-tex'] = {
license = "see context related readme files"
}
--- special functions that deal with io
-
-local format, lower = string.format, string.lower
-local unpack = unpack or table.unpack
-
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
-local texiowrite_nl = (texio and texio.write_nl) or print
-local texiowrite = (texio and texio.write) or print
+local report_tex = logs.reporter("resolvers","tex")
-local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
+local resolvers = resolvers
-function finders.generic(tag,filename,filetype)
- local foundname = resolvers.find_file(filename,filetype)
- if foundname and foundname ~= "" then
- if trace_locating then
- logs.report("fileio","%s finder: file '%s' found",tag,filename)
- end
- return foundname
- else
- if trace_locating then
- logs.report("fileio","%s finder: unknown file '%s'",tag,filename)
- end
- return unpack(finders.notfound)
- end
-end
+local sequencers = utilities.sequencers
+local methodhandler = resolvers.methodhandler
+local splitlines = string.splitlines
+local utffiletype = unicode.filetype
---~ local lpegmatch = lpeg.match
---~ local getlines = lpeg.Ct(lpeg.patterns.textline)
+local fileprocessor = nil
+local lineprocessor = nil
-local input_translator, utf_translator, user_translator = nil, nil, nil
+local textfileactions = sequencers.reset {
+ arguments = "str,filename",
+ returnvalues = "str",
+ results = "str",
+}
-function resolvers.install_text_filter(name,func)
- if name == "input" then input_translator = func
- elseif name == "utf" then utf_translator = func
- elseif name == "user" then user_translator = func end
-end
+local textlineactions = sequencers.reset {
+ arguments = "str,filename,linenumber,noflines",
+ returnvalues = "str",
+ results = "str",
+}
-function openers.text_opener(filename,file_handle,tag)
- local u = unicode.utftype(file_handle)
- local t = { }
- if u > 0 then
- if trace_locating then
- logs.report("fileio","%s opener, file '%s' opened using method '%s'",tag,filename,unicode.utfname[u])
- end
- local l
- if u > 2 then
- l = unicode.utf32_to_utf8(file_handle:read("*a"),u==4)
- else
- l = unicode.utf16_to_utf8(file_handle:read("*a"),u==2)
- end
- file_handle:close()
- t = {
- utftype = u, -- may go away
- lines = l,
- current = 0, -- line number, not really needed
- handle = nil,
- noflines = #l,
- close = function()
- if trace_locating then
- logs.report("fileio","%s closer, file '%s' closed",tag,filename)
- end
- logs.show_close(filename)
- t = nil
- end,
- reader = function(self)
- self = self or t
- local current, lines = self.current, self.lines
- if current >= #lines then
- return nil
- else
- current = current + 1
- self.current = current
- local line = lines[current]
- if not line then
- return nil
- elseif line == "" then
- return ""
- else
- if input_translator then
- line = input_translator(line)
- end
- if utf_translator then
- line = utf_translator(line)
- end
- if user_translator then
- line = user_translator(line)
- end
- return line
- end
- end
- end
- }
+local helpers = resolvers.openers.helpers
+local appendgroup = sequencers.appendgroup
+
+helpers.textfileactions = textfileactions
+helpers.textlineactions = textlineactions
+
+appendgroup(textfileactions,"before") -- user
+appendgroup(textfileactions,"system") -- private
+appendgroup(textfileactions,"after" ) -- user
+
+appendgroup(textlineactions,"before") -- user
+appendgroup(textlineactions,"system") -- private
+appendgroup(textlineactions,"after" ) -- user
+
+function helpers.textopener(tag,filename,filehandle)
+ local lines
+ local t_filehandle = type(filehandle)
+ if not filehandle then
+ lines = io.loaddata(filename)
+ elseif t_filehandle == "string" then
+ lines = filehandle
+ elseif t_filehandle == "table" then
+ lines = filehandle
else
+ lines = filehandle:read("*a")
+ filehandle:close()
+ end
+ if type(lines) == "string" then
+ local coding = utffiletype(lines)
if trace_locating then
- logs.report("fileio","%s opener, file '%s' opened",tag,filename)
+ report_tex("%s opener, '%s' opened using method '%s'",tag,filename,coding)
end
- -- todo: file;name -> freeze / eerste regel scannen -> freeze
- --~ local data = lpegmatch(getlines,file_handle:read("*a"))
- --~ local n = 0
- t = {
- reader = function() -- self
- local line = file_handle:read()
- --~ n = n + 1
- --~ local line = data[n]
- --~ print(line)
- if not line then
- return nil
- elseif line == "" then
- return ""
- else
- if input_translator then
- line = input_translator(line)
- end
- if utf_translator then
- line = utf_translator(line)
- end
- if user_translator then
- line = user_translator(line)
- end
- return line
- end
- end,
- close = function()
- if trace_locating then
- logs.report("fileio","%s closer, file '%s' closed",tag,filename)
- end
- logs.show_close(filename)
- file_handle:close()
- t = nil
- collectgarbage("step") -- saves some memory
- end,
- handle = function()
- return file_handle
- end,
- noflines = function()
- t.noflines = io.noflines(file_handle)
- return t.noflines
- end
- }
- end
- return t
-end
-
-function openers.generic(tag,filename)
- if filename and filename ~= "" then
- local f = io.open(filename,"r")
- if f then
- logs.show_open(filename) -- todo
- if trace_locating then
- logs.report("fileio","%s opener, file '%s' opened",tag,filename)
+ if coding == "utf-16-be" then
+ lines = unicode.utf16_to_utf8_be(lines)
+ elseif coding == "utf-16-le" then
+ lines = unicode.utf16_to_utf8_le(lines)
+ elseif coding == "utf-32-be" then
+ lines = unicode.utf32_to_utf8_be(lines)
+ elseif coding == "utf-32-le" then
+ lines = unicode.utf32_to_utf8_le(lines)
+ else -- utf8 or unknown
+ if textfileactions.dirty then -- maybe use autocompile
+ fileprocessor = sequencers.compile(textfileactions)
end
- return openers.text_opener(filename,f,tag)
+ lines = fileprocessor(lines,filename) or lines
+ lines = splitlines(lines)
end
+ elseif trace_locating then
+ report_tex("%s opener, '%s' opened",tag,filename)
end
- if trace_locating then
- logs.report("fileio","%s opener, file '%s' not found",tag,filename)
+ local noflines = #lines
+ if lines[noflines] == "" then -- maybe some special check is needed
+ lines[noflines] = nil
end
- return unpack(openers.notfound)
-end
-
-function loaders.generic(tag,filename)
- if filename and filename ~= "" then
- local f = io.open(filename,"rb")
- if f then
- logs.show_load(filename)
+ logs.show_open(filename)
+ return {
+ filename = filename,
+ noflines = noflines,
+ currentline = 0,
+ close = function()
if trace_locating then
- logs.report("fileio","%s loader, file '%s' loaded",tag,filename)
+ report_tex("%s closer, '%s' closed",tag,filename)
end
- local s = f:read("*a")
- if garbagecollector and garbagecollector.check then garbagecollector.check(#s) end
- f:close()
- if s then
- return true, s, #s
+ logs.show_close(filename)
+ t = nil
+ end,
+ reader = function(self)
+ self = self or t
+ local currentline, noflines = self.currentline, self.noflines
+ if currentline >= noflines then
+ return nil
+ else
+ currentline = currentline + 1
+ self.currentline = currentline
+ local content = lines[currentline]
+ if not content then
+ return nil
+ elseif content == "" then
+ return ""
+ else
+ if textlineactions.dirty then
+ lineprocessor = sequencers.compile(textlineactions) -- maybe use autocompile
+ end
+ return lineprocessor(content,filename,currentline,noflines) or content
+ end
end
end
- end
- if trace_locating then
- logs.report("fileio","%s loader, file '%s' not found",tag,filename)
- end
- return unpack(loaders.notfound)
+ }
end
-function finders.tex(filename,filetype)
- return finders.generic('tex',filename,filetype)
+function resolvers.findtexfile(filename,filetype)
+ return methodhandler('finders',filename,filetype)
end
-function openers.tex(filename)
- return openers.generic('tex',filename)
+function resolvers.opentexfile(filename)
+ return methodhandler('openers',filename)
end
-function loaders.tex(filename)
- return loaders.generic('tex',filename)
+function resolvers.openfile(filename)
+ local fullname = methodhandler('finders',filename)
+ return fullname and fullname ~= "" and methodhandler('openers',fullname) or nil
end
-function resolvers.findtexfile(filename, filetype)
- return resolvers.methodhandler('finders',filename, filetype)
+function resolvers.loadtexfile(filename,filetype)
+ -- todo: optionally apply filters
+ local ok, data, size = resolvers.loadbinfile(filename, filetype)
+ return data or ""
end
-function resolvers.opentexfile(filename)
- return resolvers.methodhandler('openers',filename)
-end
+resolvers.texdatablob = resolvers.loadtexfile
-function resolvers.openfile(filename)
- local fullname = resolvers.findtexfile(filename)
- if fullname and (fullname ~= "") then
- return resolvers.opentexfile(fullname)
+local function installhandler(namespace,what,where,func)
+ if not func then
+ where, func = "after", where
+ end
+ if where == "before" or where == "after" then
+ sequencers.appendaction(namespace,where,func)
else
- return nil
+ report_tex("installing input %s handlers in %s is not possible",what,tostring(where))
end
end
-function resolvers.texdatablob(filename, filetype)
- local ok, data, size = resolvers.loadbinfile(filename, filetype)
- return data or ""
-end
+function resolvers.installinputlinehandler(...) installhandler(helpers.textlineactions,"line",...) end
+function resolvers.installinputfilehandler(...) installhandler(helpers.textfileactions,"file",...) end
-resolvers.loadtexfile = resolvers.texdatablob
+-- local basename = file.basename
+-- resolvers.installinputlinehandler(function(str,filename,linenumber,noflines)
+-- report_tex("[lc] file: %s, line: %s of %s, length: %s",basename(filename),linenumber,noflines,#str)
+-- end)
+-- resolvers.installinputfilehandler(function(str,filename)
+-- report_tex("[fc] file: %s, length: %s",basename(filename),#str)
+-- end)
diff --git a/Master/texmf-dist/tex/context/base/data-tmf.lua b/Master/texmf-dist/tex/context/base/data-tmf.lua
index 7421eacfc6e..9391e881ea7 100644
--- a/Master/texmf-dist/tex/context/base/data-tmf.lua
+++ b/Master/texmf-dist/tex/context/base/data-tmf.lua
@@ -6,70 +6,60 @@ if not modules then modules = { } end modules ['data-tmf'] = {
license = "see context related readme files"
}
-local find, gsub, match = string.find, string.gsub, string.match
-local getenv, setenv = os.getenv, os.setenv
+local resolvers = resolvers
--- loads *.tmf files in minimal tree roots (to be optimized and documented)
+local report_tds = logs.reporter("resolvers","tds")
-function resolvers.check_environment(tree)
- logs.simpleline()
- setenv('TMP', getenv('TMP') or getenv('TEMP') or getenv('TMPDIR') or getenv('HOME'))
- setenv('TEXOS', getenv('TEXOS') or ("texmf-" .. os.platform))
- setenv('TEXPATH', gsub(tree or "tex","\/+$",''))
- setenv('TEXMFOS', getenv('TEXPATH') .. "/" .. getenv('TEXOS'))
- logs.simpleline()
- logs.simple("preset : TEXPATH => %s", getenv('TEXPATH'))
- logs.simple("preset : TEXOS => %s", getenv('TEXOS'))
- logs.simple("preset : TEXMFOS => %s", getenv('TEXMFOS'))
- logs.simple("preset : TMP => %s", getenv('TMP'))
- logs.simple('')
-end
+-- = <<
+-- ? ??
+-- < +=
+-- > =+
-function resolvers.load_environment(name) -- todo: key=value as well as lua
- local f = io.open(name)
- if f then
- for line in f:lines() do
- if find(line,"^[%%%#]") then
- -- skip comment
- else
- local key, how, value = match(line,"^(.-)%s*([<=>%?]+)%s*(.*)%s*$")
- if how then
- value = gsub(value,"%%(.-)%%", function(v) return getenv(v) or "" end)
- if how == "=" or how == "<<" then
- setenv(key,value)
- elseif how == "?" or how == "??" then
- setenv(key,getenv(key) or value)
- elseif how == "<" or how == "+=" then
- if getenv(key) then
- setenv(key,getenv(key) .. io.fileseparator .. value)
- else
- setenv(key,value)
- end
- elseif how == ">" or how == "=+" then
- if getenv(key) then
- setenv(key,value .. io.pathseparator .. getenv(key))
- else
- setenv(key,value)
- end
- end
- end
- end
- end
- f:close()
- end
-end
+function resolvers.load_tree(tree,resolve)
+ if type(tree) == "string" and tree ~= "" then
+
+ local getenv, setenv = resolvers.getenv, resolvers.setenv
+
+ -- later might listen to the raw osenv var as well
+ local texos = "texmf-" .. os.platform
+
+ local oldroot = environment.texroot
+ local newroot = file.collapsepath(tree)
-function resolvers.load_tree(tree)
- if tree and tree ~= "" then
- local setuptex = 'setuptex.tmf'
- if lfs.attributes(tree, "mode") == "directory" then -- check if not nil
- setuptex = tree .. "/" .. setuptex
- else
- setuptex = tree
+ local newtree = file.join(newroot,texos)
+ local newpath = file.join(newtree,"bin")
+
+ if not lfs.isdir(newtree) then
+ report_tds("no '%s' under tree %s",texos,tree)
+ os.exit()
end
- if io.exists(setuptex) then
- resolvers.check_environment(tree)
- resolvers.load_environment(setuptex)
+ if not lfs.isdir(newpath) then
+ report_tds("no '%s/bin' under tree %s",texos,tree)
+ os.exit()
end
+
+ local texmfos = newtree
+
+ environment.texroot = newroot
+ environment.texos = texos
+ environment.texmfos = texmfos
+
+ -- Beware, we need to obey the relocatable autoparent so we
+ -- set TEXMFCNF to its raw value. This is somewhat tricky when
+ -- we run a mkii job from within. Therefore, in mtxrun, there
+ -- is a resolve applied when we're in mkii/kpse mode.
+
+ setenv('SELFAUTOPARENT', newroot)
+ setenv('SELFAUTODIR', newtree)
+ setenv('SELFAUTOLOC', newpath)
+ setenv('TEXROOT', newroot)
+ setenv('TEXOS', texos)
+ setenv('TEXMFOS', texmfos)
+ setenv('TEXMFCNF', resolvers.luacnfspec, not resolve)
+ setenv("PATH", newpath .. io.pathseparator .. getenv("PATH"))
+
+ report_tds("changing from root '%s' to '%s'",oldroot,newroot)
+ report_tds("prepending '%s' to binary path",newpath)
+ report_tds()
end
end
diff --git a/Master/texmf-dist/tex/context/base/data-tmp.lua b/Master/texmf-dist/tex/context/base/data-tmp.lua
index 7196daac035..ec6f91e24da 100644
--- a/Master/texmf-dist/tex/context/base/data-tmp.lua
+++ b/Master/texmf-dist/tex/context/base/data-tmp.lua
@@ -1,5 +1,5 @@
if not modules then modules = { } end modules ['data-tmp'] = {
- version = 1.001,
+ version = 1.100,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
@@ -22,71 +22,176 @@ being written at the same time is small. We also need to extend
luatools with a recache feature.</p>
--ldx]]--
-local format, lower, gsub = string.format, string.lower, string.gsub
+local format, lower, gsub, concat = string.format, string.lower, string.gsub, table.concat
+local mkdirs, isdir = dir.mkdirs, lfs.isdir
-local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end) -- not used yet
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local trace_cache = false trackers.register("resolvers.cache", function(v) trace_cache = v end)
-caches = caches or { }
+local report_caches = logs.reporter("resolvers","caches")
+local report_resolvers = logs.reporter("resolvers","caching")
+
+local resolvers = resolvers
+
+-- intermezzo
+
+local directive_cleanup = false directives.register("system.compile.cleanup", function(v) directive_cleanup = v end)
+local directive_strip = true directives.register("system.compile.strip", function(v) directive_strip = v end)
+
+local compile = utilities.lua.compile
+
+function utilities.lua.compile(luafile,lucfile,cleanup,strip)
+ if cleanup == nil then cleanup = directive_cleanup end
+ if strip == nil then strip = directive_strip end
+ return compile(luafile,lucfile,cleanup,strip)
+end
+
+-- end of intermezzo
+
+caches = caches or { }
+local caches = caches
-caches.path = caches.path or nil
caches.base = caches.base or "luatex-cache"
caches.more = caches.more or "context"
caches.direct = false -- true is faster but may need huge amounts of memory
caches.tree = false
-caches.paths = caches.paths or nil
-caches.force = true -- changed for TEXLIVE by TH
-caches.defaults = { "TEXMFCACHE", "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
-
-function caches.temp()
- local cachepath = nil
- local function check(list,isenv)
- if not cachepath then
- for k=1,#list do
- local v = list[k]
- cachepath = (isenv and (os.env[v] or "")) or v or ""
- if cachepath == "" then
- -- next
- else
- cachepath = resolvers.clean_path(cachepath)
- if lfs.isdir(cachepath) and file.iswritable(cachepath) then -- lfs.attributes(cachepath,"mode") == "directory"
- break
- elseif caches.force or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then
- dir.mkdirs(cachepath)
- if lfs.isdir(cachepath) and file.iswritable(cachepath) then
- break
+caches.force = true
+caches.ask = false
+caches.relocate = false
+caches.defaults = { "TMPDIR", "TEMPDIR", "TMP", "TEMP", "HOME", "HOMEPATH" }
+
+local writable, readables, usedreadables = nil, { }, { }
+
+-- we could use a metatable for writable and readable but not yet
+
+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")
+ if texmfcaches then
+ for k=1,#texmfcaches do
+ local cachepath = texmfcaches[k]
+ if cachepath ~= "" then
+ cachepath = resolvers.resolve(cachepath)
+ cachepath = resolvers.cleanpath(cachepath)
+ cachepath = file.collapsepath(cachepath)
+ local valid = isdir(cachepath)
+ if valid then
+ if file.is_readable(cachepath) then
+ readables[#readables+1] = cachepath
+ if not writable and file.is_writable(cachepath) then
+ writable = cachepath
+ end
+ end
+ elseif not writable and caches.force then
+ local cacheparent = file.dirname(cachepath)
+ if file.is_writable(cacheparent) then
+ if not caches.ask or io.ask(format("\nShould I create the cache path %s?",cachepath), "no", { "yes", "no" }) == "yes" then
+ mkdirs(cachepath)
+ if isdir(cachepath) and file.is_writable(cachepath) then
+ report_caches("created: %s",cachepath)
+ writable = cachepath
+ readables[#readables+1] = cachepath
+ end
end
end
end
- cachepath = nil
end
end
end
- check(resolvers.clean_path_list("TEXMFCACHE") or { })
- check(caches.defaults,true)
- if not cachepath then
- print("\nfatal error: there is no valid (writable) cache path defined\n")
+ -- As a last resort we check some temporary paths but this time we don't
+ -- create them.
+ local texmfcaches = caches.defaults
+ if texmfcaches then
+ for k=1,#texmfcaches do
+ local cachepath = texmfcaches[k]
+ cachepath = resolvers.expansion(cachepath) -- was getenv
+ if cachepath ~= "" then
+ cachepath = resolvers.resolve(cachepath)
+ cachepath = resolvers.cleanpath(cachepath)
+ local valid = isdir(cachepath)
+ if valid and file.is_readable(cachepath) then
+ if not writable and file.is_writable(cachepath) then
+ readables[#readables+1] = cachepath
+ writable = cachepath
+ break
+ end
+ end
+ end
+ end
+ end
+ -- Some extra checking. If we have no writable or readable path then we simply
+ -- quit.
+ if not writable then
+ report_caches("fatal error: there is no valid writable cache path defined")
os.exit()
- elseif not lfs.isdir(cachepath) then -- lfs.attributes(cachepath,"mode") ~= "directory"
- print(format("\nfatal error: cache path %s is not a directory\n",cachepath))
+ elseif #readables == 0 then
+ report_caches("fatal error: there is no valid readable cache path defined")
os.exit()
end
- cachepath = file.collapse_path(cachepath)
- function caches.temp()
- return cachepath
+ -- why here
+ writable = dir.expandname(resolvers.cleanpath(writable)) -- just in case
+ -- moved here
+ local base, more, tree = caches.base, caches.more, caches.tree or caches.treehash() -- we have only one writable tree
+ if tree then
+ caches.tree = tree
+ writable = mkdirs(writable,base,more,tree)
+ for i=1,#readables do
+ readables[i] = file.join(readables[i],base,more,tree)
+ end
+ else
+ writable = mkdirs(writable,base,more)
+ for i=1,#readables do
+ readables[i] = file.join(readables[i],base,more)
+ end
+ end
+ -- end
+ if trace_cache then
+ for i=1,#readables do
+ report_caches("using readable path '%s' (order %s)",readables[i],i)
+ end
+ report_caches("using writable path '%s'",writable)
+ end
+ identify = function()
+ return writable, readables
end
- return cachepath
+ return writable, readables
end
-function caches.configpath()
- return table.concat(resolvers.instance.cnffiles,";")
+function caches.usedpaths()
+ local writable, readables = identify()
+ if #readables > 1 then
+ local result = { }
+ for i=1,#readables do
+ local readable = readables[i]
+ if usedreadables[i] or readable == writable then
+ result[#result+1] = format("readable: '%s' (order %s)",readable,i)
+ end
+ end
+ result[#result+1] = format("writable: '%s'",writable)
+ return result
+ else
+ return writable
+ end
+end
+
+function caches.configfiles()
+ return table.concat(resolvers.instance.specification,";")
end
function caches.hashed(tree)
- return md5.hex(gsub(lower(tree),"[\\\/]+","/"))
+ tree = gsub(tree,"\\$","/")
+ tree = gsub(tree,"/+$","")
+ tree = lower(tree)
+ local hash = md5.hex(tree)
+ if trace_cache or trace_locating then
+ report_caches("hashing tree %s, hash %s",tree,hash)
+ end
+ return hash
end
function caches.treehash()
- local tree = caches.configpath()
+ local tree = caches.configfiles()
if not tree or tree == "" then
return false
else
@@ -94,35 +199,68 @@ function caches.treehash()
end
end
-function caches.setpath(...)
- if not caches.path then
- if not caches.path then
- caches.path = caches.temp()
- end
- caches.path = resolvers.clean_path(caches.path) -- to be sure
- caches.tree = caches.tree or caches.treehash()
- if caches.tree then
- caches.path = dir.mkdirs(caches.path,caches.base,caches.more,caches.tree)
+local r_cache, w_cache = { }, { } -- normally w in in r but who cares
+
+local function getreadablepaths(...) -- we can optimize this as we have at most 2 tags
+ local tags = { ... }
+ local hash = concat(tags,"/")
+ local done = r_cache[hash]
+ if not done then
+ local writable, readables = identify() -- exit if not found
+ if #tags > 0 then
+ done = { }
+ for i=1,#readables do
+ done[i] = file.join(readables[i],...)
+ end
else
- caches.path = dir.mkdirs(caches.path,caches.base,caches.more)
+ done = readables
end
+ r_cache[hash] = done
end
- if not caches.path then
- caches.path = '.'
+ return done
+end
+
+local function getwritablepath(...)
+ local tags = { ... }
+ local hash = concat(tags,"/")
+ local done = w_cache[hash]
+ if not done then
+ local writable, readables = identify() -- exit if not found
+ if #tags > 0 then
+ done = mkdirs(writable,...)
+ else
+ done = writable
+ end
+ w_cache[hash] = done
end
- caches.path = resolvers.clean_path(caches.path)
- local dirs = { ... }
- if #dirs > 0 then
- local pth = dir.mkdirs(caches.path,...)
- return pth
+ return done
+end
+
+caches.getreadablepaths = getreadablepaths
+caches.getwritablepath = getwritablepath
+
+function caches.getfirstreadablefile(filename,...)
+ local rd = getreadablepaths(...)
+ for i=1,#rd do
+ local path = rd[i]
+ local fullname = file.join(path,filename)
+ if file.is_readable(fullname) then
+ usedreadables[i] = true
+ return fullname, path
+ end
end
- caches.path = dir.expand_name(caches.path)
- return caches.path
+ return caches.setfirstwritablefile(filename,...)
end
-function caches.definepath(category,subcategory)
+function caches.setfirstwritablefile(filename,...)
+ local wr = getwritablepath(...)
+ local fullname = file.join(wr,filename)
+ return fullname, wr
+end
+
+function caches.define(category,subcategory) -- for old times sake
return function()
- return caches.setpath(category,subcategory)
+ return getwritablepath(category,subcategory)
end
end
@@ -130,28 +268,30 @@ function caches.setluanames(path,name)
return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc"
end
-function caches.loaddata(path,name)
- local tmaname, tmcname = caches.setluanames(path,name)
- local loader = loadfile(tmcname) or loadfile(tmaname)
- if loader then
- loader = loader()
- collectgarbage("step")
- return loader
- else
- return false
+function caches.loaddata(readables,name)
+ if type(readables) == "string" then
+ readables = { readables }
+ end
+ for i=1,#readables do
+ local path = readables[i]
+ local tmaname, tmcname = caches.setluanames(path,name)
+ local loader = loadfile(tmcname) or loadfile(tmaname)
+ if loader then
+ loader = loader()
+ collectgarbage("step")
+ return loader
+ end
end
+ return false
end
---~ function caches.loaddata(path,name)
---~ local tmaname, tmcname = caches.setluanames(path,name)
---~ return dofile(tmcname) or dofile(tmaname)
---~ end
-
-function caches.iswritable(filepath,filename)
+function caches.is_writable(filepath,filename)
local tmaname, tmcname = caches.setluanames(filepath,filename)
- return file.iswritable(tmaname)
+ return file.is_writable(tmaname)
end
+local saveoptions = { compact = true }
+
function caches.savedata(filepath,filename,data,raw)
local tmaname, tmcname = caches.setluanames(filepath,filename)
local reduce, simplify = true, true
@@ -160,19 +300,92 @@ function caches.savedata(filepath,filename,data,raw)
end
data.cache_uuid = os.uuid()
if caches.direct then
- file.savedata(tmaname, table.serialize(data,'return',false,true,false)) -- no hex
+ file.savedata(tmaname,table.serialize(data,true,saveoptions))
else
- table.tofile(tmaname, data,'return',false,true,false) -- maybe not the last true
+ table.tofile(tmaname,data,true,saveoptions)
end
- local cleanup = resolvers.boolean_variable("PURGECACHE", false)
- local strip = resolvers.boolean_variable("LUACSTRIP", true)
- utils.lua.compile(tmaname, tmcname, cleanup, strip)
+ utilities.lua.compile(tmaname,tmcname)
end
--- here we use the cache for format loading (texconfig.[formatname|jobname])
+-- moved from data-res:
---~ if tex and texconfig and texconfig.formatname and texconfig.formatname == "" then
-if tex and texconfig and (not texconfig.formatname or texconfig.formatname == "") and input and resolvers.instance then
- if not texconfig.luaname then texconfig.luaname = "cont-en.lua" end -- or luc
- texconfig.formatname = caches.setpath("formats") .. "/" .. gsub(texconfig.luaname,"%.lu.$",".fmt")
+local content_state = { }
+
+function caches.contentstate()
+ return content_state or { }
+end
+
+function caches.loadcontent(cachename,dataname)
+ local name = caches.hashed(cachename)
+ local full, path = caches.getfirstreadablefile(name ..".lua","trees")
+ local filename = file.join(path,name)
+ local blob = loadfile(filename .. ".luc") or loadfile(filename .. ".lua")
+ if blob then
+ local data = blob()
+ if data and data.content then
+ if data.type == dataname then
+ if data.version == resolvers.cacheversion then
+ content_state[#content_state+1] = data.uuid
+ if trace_locating then
+ report_resolvers("loading '%s' for '%s' from '%s'",dataname,cachename,filename)
+ end
+ return data.content
+ else
+ report_resolvers("skipping '%s' for '%s' from '%s' (version mismatch)",dataname,cachename,filename)
+ end
+ else
+ report_resolvers("skipping '%s' for '%s' from '%s' (datatype mismatch)",dataname,cachename,filename)
+ end
+ elseif trace_locating then
+ report_resolvers("skipping '%s' for '%s' from '%s' (no content)",dataname,cachename,filename)
+ end
+ elseif trace_locating then
+ report_resolvers("skipping '%s' for '%s' from '%s' (invalid file)",dataname,cachename,filename)
+ end
+end
+
+function caches.collapsecontent(content)
+ for k, v in next, content do
+ if type(v) == "table" and #v == 1 then
+ content[k] = v[1]
+ end
+ end
+end
+
+function caches.savecontent(cachename,dataname,content)
+ local name = caches.hashed(cachename)
+ local full, path = caches.setfirstwritablefile(name ..".lua","trees")
+ local filename = file.join(path,name) -- is full
+ local luaname, lucname = filename .. ".lua", filename .. ".luc"
+ if trace_locating then
+ report_resolvers("preparing '%s' for '%s'",dataname,cachename)
+ end
+ local data = {
+ type = dataname,
+ root = cachename,
+ version = resolvers.cacheversion,
+ date = os.date("%Y-%m-%d"),
+ time = os.date("%H:%M:%S"),
+ content = content,
+ uuid = os.uuid(),
+ }
+ local ok = io.savedata(luaname,table.serialize(data,true))
+ if ok then
+ if trace_locating then
+ report_resolvers("category '%s', cachename '%s' saved in '%s'",dataname,cachename,luaname)
+ end
+ if utilities.lua.compile(luaname,lucname) then
+ if trace_locating then
+ report_resolvers("'%s' compiled to '%s'",dataname,lucname)
+ end
+ return true
+ else
+ if trace_locating then
+ report_resolvers("compiling failed for '%s', deleting file '%s'",dataname,lucname)
+ end
+ os.remove(lucname)
+ end
+ elseif trace_locating then
+ report_resolvers("unable to save '%s' in '%s' (access error)",dataname,luaname)
+ end
end
diff --git a/Master/texmf-dist/tex/context/base/data-tre.lua b/Master/texmf-dist/tex/context/base/data-tre.lua
index d5ca258e47b..88bf4f11275 100644
--- a/Master/texmf-dist/tex/context/base/data-tre.lua
+++ b/Master/texmf-dist/tex/context/base/data-tre.lua
@@ -8,17 +8,20 @@ if not modules then modules = { } end modules ['data-tre'] = {
-- \input tree://oeps1/**/oeps.tex
-local find, gsub = string.find, string.gsub
-local unpack = unpack or table.unpack
+local find, gsub, format = string.find, string.gsub, string.format
-local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
+local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
-local done, found = { }, { }
+local report_trees = logs.reporter("resolvers","trees")
-function finders.tree(specification,filetype)
- local fnd = found[specification]
- if not fnd then
- local spec = resolvers.splitmethod(specification).path or ""
+local resolvers = resolvers
+
+local done, found, notfound = { }, { }, resolvers.finders.notfound
+
+function resolvers.finders.tree(specification)
+ local spec = specification.filename
+ local fnd = found[spec]
+ if fnd == nil then
if spec ~= "" then
local path, name = file.dirname(spec), file.basename(spec)
if path == "" then path = "." end
@@ -32,16 +35,38 @@ function finders.tree(specification,filetype)
for k=1,#hash do
local v = hash[k]
if find(v,pattern) then
- found[specification] = v
+ found[spec] = v
return v
end
end
end
- fnd = unpack(finders.notfound)
- found[specification] = fnd
+ fnd = notfound() -- false
+ found[spec] = fnd
end
return fnd
end
-openers.tree = openers.generic
-loaders.tree = loaders.generic
+function resolvers.locators.tree(specification)
+ local name = specification.filename
+ if name ~= '' and lfs.isdir(name) then
+ if trace_locating then
+ report_trees("locator '%s' found",name)
+ end
+ resolvers.appendhash('tree',name,false) -- don't cache
+ elseif trace_locating then
+ report_trees("locator '%s' not found",name)
+ end
+end
+
+function resolvers.hashers.tree(specification)
+ local name = specification.filename
+ if trace_locating then
+ report_trees("analysing '%s'",name)
+ end
+ resolvers.methodhandler("hashers",name)
+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
diff --git a/Master/texmf-dist/tex/context/base/data-use.lua b/Master/texmf-dist/tex/context/base/data-use.lua
index 5ecd7805f41..d2a9b757191 100644
--- a/Master/texmf-dist/tex/context/base/data-use.lua
+++ b/Master/texmf-dist/tex/context/base/data-use.lua
@@ -10,50 +10,18 @@ local format, lower, gsub, find = string.format, string.lower, string.gsub, stri
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
--- since we want to use the cache instead of the tree, we will now
--- reimplement the saver.
+local report_mounts = logs.reporter("resolvers","mounts")
-local save_data = resolvers.save_data
-local load_data = resolvers.load_data
-
-resolvers.cachepath = nil -- public, for tracing
-resolvers.usecache = true -- public, for tracing
-
-function resolvers.save_data(dataname)
- save_data(dataname, function(cachename,dataname)
- resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
- if resolvers.usecache then
- resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
- return file.join(resolvers.cachepath(),caches.hashed(cachename))
- else
- return file.join(cachename,dataname)
- end
- end)
-end
-
-function resolvers.load_data(pathname,dataname,filename)
- load_data(pathname,dataname,filename,function(dataname,filename)
- resolvers.usecache = not toboolean(resolvers.expansion("CACHEINTDS") or "false",true)
- if resolvers.usecache then
- resolvers.cachepath = resolvers.cachepath or caches.definepath("trees")
- return file.join(resolvers.cachepath(),caches.hashed(pathname))
- else
- if not filename or (filename == "") then
- filename = dataname
- end
- return file.join(pathname,filename)
- end
- end)
-end
+local resolvers = resolvers
-- we will make a better format, maybe something xml or just text or lua
resolvers.automounted = resolvers.automounted or { }
function resolvers.automount(usecache)
- local mountpaths = resolvers.clean_path_list(resolvers.expansion('TEXMFMOUNT'))
+ local mountpaths = resolvers.cleanpathlist(resolvers.expansion('TEXMFMOUNT'))
if (not mountpaths or #mountpaths == 0) and usecache then
- mountpaths = { caches.setpath("mount") }
+ mountpaths = caches.getreadablepaths("mount")
end
if mountpaths and #mountpaths > 0 then
statistics.starttiming(resolvers.instance)
@@ -67,7 +35,7 @@ function resolvers.automount(usecache)
-- skip
elseif find(line,"^zip://") then
if trace_locating then
- logs.report("fileio","mounting %s",line)
+ report_mounts("mounting %s",line)
end
table.insert(resolvers.automounted,line)
resolvers.usezipfile(line)
@@ -83,40 +51,40 @@ end
-- status info
-statistics.register("used config path", function() return caches.configpath() end)
-statistics.register("used cache path", function() return caches.temp() or "?" end)
+statistics.register("used config file", function() return caches.configfiles() end)
+statistics.register("used cache path", function() return caches.usedpaths() end)
-- experiment (code will move)
-function statistics.save_fmt_status(texname,formatbanner,sourcefile) -- texname == formatname
+function statistics.savefmtstatus(texname,formatbanner,sourcefile) -- texname == formatname
local enginebanner = status.list().banner
if formatbanner and enginebanner and sourcefile then
local luvname = file.replacesuffix(texname,"luv")
local luvdata = {
enginebanner = enginebanner,
formatbanner = formatbanner,
- sourcehash = md5.hex(io.loaddata(resolvers.find_file(sourcefile)) or "unknown"),
+ sourcehash = md5.hex(io.loaddata(resolvers.findfile(sourcefile)) or "unknown"),
sourcefile = sourcefile,
}
io.savedata(luvname,table.serialize(luvdata,true))
end
end
-function statistics.check_fmt_status(texname)
+function statistics.checkfmtstatus(texname)
local enginebanner = status.list().banner
if enginebanner and texname then
local luvname = file.replacesuffix(texname,"luv")
if lfs.isfile(luvname) then
local luv = dofile(luvname)
if luv and luv.sourcefile then
- local sourcehash = md5.hex(io.loaddata(resolvers.find_file(luv.sourcefile)) or "unknown")
+ local sourcehash = md5.hex(io.loaddata(resolvers.findfile(luv.sourcefile)) or "unknown")
local luvbanner = luv.enginebanner or "?"
if luvbanner ~= enginebanner then
- return string.format("engine mismatch (luv:%s <> bin:%s)",luvbanner,enginebanner)
+ return format("engine mismatch (luv: %s <> bin: %s)",luvbanner,enginebanner)
end
local luvhash = luv.sourcehash or "?"
if luvhash ~= sourcehash then
- return string.format("source mismatch (luv:%s <> bin:%s)",luvhash,sourcehash)
+ return format("source mismatch (luv: %s <> bin: %s)",luvhash,sourcehash)
end
else
return "invalid status file"
diff --git a/Master/texmf-dist/tex/context/base/data-vir.lua b/Master/texmf-dist/tex/context/base/data-vir.lua
new file mode 100644
index 00000000000..5a288953faa
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/data-vir.lua
@@ -0,0 +1,81 @@
+if not modules then modules = { } end modules ['data-vir'] = {
+ 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 format = string.format
+
+local trace_virtual = false
+local report_virtual = logs.reporter("resolvers","virtual")
+
+trackers.register("resolvers.locating", function(v) trace_virtual = v end)
+trackers.register("resolvers.virtual", function(v) trace_virtual = v end)
+
+local resolvers = resolvers
+
+local finders, openers, loaders, savers = resolvers.finders, resolvers.openers, resolvers.loaders, resolvers.savers
+
+local data, n, template = { }, 0, "virtual://%s.%s" -- hm, number can be query
+
+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)
+ if trace_virtual then
+ report_virtual("saver: file '%s' saved",filename)
+ end
+ data[filename] = content
+ return filename
+end
+
+function finders.virtual(specification)
+ local original = specification.original
+ local d = data[original]
+ if d then
+ if trace_virtual then
+ report_virtual("finder: file '%s' found",original)
+ end
+ return original
+ else
+ if trace_virtual then
+ report_virtual("finder: unknown file '%s'",original)
+ end
+ return finders.notfound()
+ end
+end
+
+function openers.virtual(specification)
+ local original = specification.original
+ local d = data[original]
+ if d then
+ if trace_virtual then
+ report_virtual("opener, file '%s' opened",original)
+ end
+ data[original] = nil
+ return openers.helpers.textopener("virtual",original,d)
+ else
+ if trace_virtual then
+ report_virtual("opener, file '%s' not found",original)
+ end
+ return openers.notfound()
+ end
+end
+
+function loaders.virtual(specification)
+ local original = specification.original
+ local d = data[original]
+ if d then
+ if trace_virtual then
+ report_virtual("loader, file '%s' loaded",original)
+ end
+ data[original] = nil
+ return true, d, #d
+ end
+ if trace_virtual then
+ report_virtual("loader, file '%s' not loaded",original)
+ end
+ return loaders.notfound()
+end
diff --git a/Master/texmf-dist/tex/context/base/data-zip.lua b/Master/texmf-dist/tex/context/base/data-zip.lua
index aa3740a83d1..6a50d2aa942 100644
--- a/Master/texmf-dist/tex/context/base/data-zip.lua
+++ b/Master/texmf-dist/tex/context/base/data-zip.lua
@@ -6,25 +6,30 @@ if not modules then modules = { } end modules ['data-zip'] = {
license = "see context related readme files"
}
+-- partly redone .. needs testing
+
local format, find, match = string.format, string.find, string.match
-local unpack = unpack or table.unpack
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local report_zip = logs.reporter("resolvers","zip")
+
-- zip:///oeps.zip?name=bla/bla.tex
-- zip:///oeps.zip?tree=tex/texmf-local
-- zip:///texmf.zip?tree=/tex/texmf
-- zip:///texmf.zip?tree=/tex/texmf-local
-- zip:///texmf-mine.zip?tree=/tex/texmf-projects
-zip = zip or { }
-zip.archives = zip.archives or { }
-zip.registeredfiles = zip.registeredfiles or { }
+local resolvers = resolvers
+
+zip = zip or { }
+local zip = zip
-local finders, openers, loaders = resolvers.finders, resolvers.openers, resolvers.loaders
-local locators, hashers, concatinators = resolvers.locators, resolvers.hashers, resolvers.concatinators
+zip.archives = zip.archives or { }
+local archives = zip.archives
-local archives = zip.archives
+zip.registeredfiles = zip.registeredfiles or { }
+local registeredfiles = zip.registeredfiles
local function validzip(str) -- todo: use url splitter
if not find(str,"^zip://") then
@@ -40,7 +45,7 @@ function zip.openarchive(name)
else
local arch = archives[name]
if not arch then
- local full = resolvers.find_file(name) or ""
+ local full = resolvers.findfile(name) or ""
arch = (full ~= "" and zip.open(full)) or false
archives[name] = arch
end
@@ -55,163 +60,162 @@ function zip.closearchive(name)
end
end
-function locators.zip(specification) -- where is this used? startup zips (untested)
- specification = resolvers.splitmethod(specification)
- local zipfile = specification.path
- local zfile = zip.openarchive(name) -- tricky, could be in to be initialized tree
+function resolvers.locators.zip(specification)
+ local archive = specification.filename
+ local zipfile = archive and archive ~= "" and zip.openarchive(archive) -- tricky, could be in to be initialized tree
if trace_locating then
- if zfile then
- logs.report("fileio","zip locator, archive '%s' found",specification.original)
+ if zipfile then
+ report_zip("locator, archive '%s' found",archive)
else
- logs.report("fileio","zip locator, archive '%s' not found",specification.original)
+ report_zip("locator, archive '%s' not found",archive)
end
end
end
-function hashers.zip(tag,name)
+function resolvers.hashers.zip(specification)
+ local archive = specification.filename
if trace_locating then
- logs.report("fileio","loading zip file '%s' as '%s'",name,tag)
+ report_zip("loading file '%s'",archive)
end
- resolvers.usezipfile(format("%s?tree=%s",tag,name))
+ resolvers.usezipfile(specification.original)
end
-function concatinators.zip(tag,path,name)
+function resolvers.concatinators.zip(zipfile,path,name) -- ok ?
if not path or path == "" then
- return format('%s?name=%s',tag,name)
+ return format('%s?name=%s',zipfile,name)
else
- return format('%s?name=%s/%s',tag,path,name)
+ return format('%s?name=%s/%s',zipfile,path,name)
end
end
-function resolvers.isreadable.zip(name)
- return true
-end
-
-function finders.zip(specification,filetype)
- specification = resolvers.splitmethod(specification)
- if specification.path then
- local q = url.query(specification.query)
- if q.name then
- local zfile = zip.openarchive(specification.path)
+function resolvers.finders.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip finder, archive '%s' found",specification.path)
+ report_zip("finder, archive '%s' found",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
dfile = zfile:close()
if trace_locating then
- logs.report("fileio","zip finder, file '%s' found",q.name)
+ report_zip("finder, file '%s' found",queryname)
end
return specification.original
elseif trace_locating then
- logs.report("fileio","zip finder, file '%s' not found",q.name)
+ report_zip("finder, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip finder, unknown archive '%s'",specification.path)
+ report_zip("finder, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip finder, '%s' not found",filename)
+ report_zip("finder, '%s' not found",original)
end
- return unpack(finders.notfound)
+ return resolvers.finders.notfound()
end
-function openers.zip(specification)
- local zipspecification = resolvers.splitmethod(specification)
- if zipspecification.path then
- local q = url.query(zipspecification.query)
- if q.name then
- local zfile = zip.openarchive(zipspecification.path)
+function resolvers.openers.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip opener, archive '%s' opened",zipspecification.path)
+ report_zip("opener, archive '%s' opened",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
- logs.show_open(specification)
if trace_locating then
- logs.report("fileio","zip opener, file '%s' found",q.name)
+ report_zip("opener, file '%s' found",queryname)
end
- return openers.text_opener(specification,dfile,'zip')
+ return resolvers.openers.helpers.textopener('zip',original,dfile)
elseif trace_locating then
- logs.report("fileio","zip opener, file '%s' not found",q.name)
+ report_zip("opener, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip opener, unknown archive '%s'",zipspecification.path)
+ report_zip("opener, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip opener, '%s' not found",filename)
+ report_zip("opener, '%s' not found",original)
end
- return unpack(openers.notfound)
+ return resolvers.openers.notfound()
end
-function loaders.zip(specification)
- specification = resolvers.splitmethod(specification)
- if specification.path then
- local q = url.query(specification.query)
- if q.name then
- local zfile = zip.openarchive(specification.path)
+function resolvers.loaders.zip(specification)
+ local original = specification.original
+ local archive = specification.filename
+ if archive then
+ local query = url.query(specification.query)
+ local queryname = query.name
+ if queryname then
+ local zfile = zip.openarchive(archive)
if zfile then
if trace_locating then
- logs.report("fileio","zip loader, archive '%s' opened",specification.path)
+ report_zip("loader, archive '%s' opened",archive)
end
- local dfile = zfile:open(q.name)
+ local dfile = zfile:open(queryname)
if dfile then
- logs.show_load(filename)
+ logs.show_load(original)
if trace_locating then
- logs.report("fileio","zip loader, file '%s' loaded",filename)
+ report_zip("loader, file '%s' loaded",original)
end
local s = dfile:read("*all")
dfile:close()
return true, s, #s
elseif trace_locating then
- logs.report("fileio","zip loader, file '%s' not found",q.name)
+ report_zip("loader, file '%s' not found",queryname)
end
elseif trace_locating then
- logs.report("fileio","zip loader, unknown archive '%s'",specification.path)
+ report_zip("loader, unknown archive '%s'",archive)
end
end
end
if trace_locating then
- logs.report("fileio","zip loader, '%s' not found",filename)
+ report_zip("loader, '%s' not found",original)
end
- return unpack(openers.notfound)
+ return resolvers.openers.notfound()
end
-- zip:///somefile.zip
-- zip:///somefile.zip?tree=texmf-local -> mount
-function resolvers.usezipfile(zipname)
- zipname = validzip(zipname)
- local specification = resolvers.splitmethod(zipname)
- local zipfile = specification.path
- if zipfile and not zip.registeredfiles[zipname] then
- local tree = url.query(specification.query).tree or ""
- local z = zip.openarchive(zipfile)
+function resolvers.usezipfile(archive)
+ local specification = resolvers.splitmethod(archive) -- to be sure
+ local archive = specification.filename
+ if archive and not registeredfiles[archive] then
+ local z = zip.openarchive(archive)
if z then
- local instance = resolvers.instance
+ local tree = url.query(specification.query).tree or ""
if trace_locating then
- logs.report("fileio","zip registering, registering archive '%s'",zipname)
+ report_zip("registering, registering archive '%s'",archive)
end
- statistics.starttiming(instance)
- resolvers.prepend_hash('zip',zipname,zipfile)
- resolvers.extend_texmf_var(zipname) -- resets hashes too
- zip.registeredfiles[zipname] = z
- instance.files[zipname] = resolvers.register_zip_file(z,tree or "")
- statistics.stoptiming(instance)
+ statistics.starttiming(resolvers.instance)
+ resolvers.prependhash('zip',archive)
+ resolvers.extendtexmfvariable(archive) -- resets hashes too
+ registeredfiles[archive] = z
+ instance.files[archive] = resolvers.registerzipfile(z,tree)
+ statistics.stoptiming(resolvers.instance)
elseif trace_locating then
- logs.report("fileio","zip registering, unknown archive '%s'",zipname)
+ report_zip("registering, unknown archive '%s'",archive)
end
elseif trace_locating then
- logs.report("fileio","zip registering, '%s' not found",zipname)
+ report_zip("registering, '%s' not found",archive)
end
end
-function resolvers.register_zip_file(z,tree)
+function resolvers.registerzipfile(z,tree)
local files, filter = { }, ""
if tree == "" then
filter = "^(.+)/(.-)$"
@@ -219,9 +223,9 @@ function resolvers.register_zip_file(z,tree)
filter = format("^%s/(.+)/(.-)$",tree)
end
if trace_locating then
- logs.report("fileio","zip registering, using filter '%s'",filter)
+ report_zip("registering, using filter '%s'",filter)
end
- local register, n = resolvers.register_file, 0
+ local register, n = resolvers.registerfile, 0
for i in z:files() do
local path, name = match(i.filename,filter)
if path then
@@ -236,6 +240,6 @@ function resolvers.register_zip_file(z,tree)
n = n + 1
end
end
- logs.report("fileio","zip registering, %s files registered",n)
+ report_zip("registering, %s files registered",n)
return files
end
diff --git a/Master/texmf-dist/tex/context/base/enco-agr.mkii b/Master/texmf-dist/tex/context/base/enco-agr.mkii
index cfd86dfd344..1dbb9b577af 100644
--- a/Master/texmf-dist/tex/context/base/enco-agr.mkii
+++ b/Master/texmf-dist/tex/context/base/enco-agr.mkii
@@ -16,6 +16,8 @@
\definecasemaps 87 to 90 lc +32 uc 0
\definecasemaps 91 to 255 lc 0 uc 0
+ \definecaseself 4 % apostrofe
+
\stopmapping
\startencoding[agr]
diff --git a/Master/texmf-dist/tex/context/base/enco-ans.mkii b/Master/texmf-dist/tex/context/base/enco-ans.mkii
index 7a48b5b5548..88baf0ad0bb 100644
--- a/Master/texmf-dist/tex/context/base/enco-ans.mkii
+++ b/Master/texmf-dist/tex/context/base/enco-ans.mkii
@@ -40,7 +40,7 @@
% \definecaseself 129 % quotesingle
% \definecaseself 130 % quotesinglebase
% \definecaseself 145 % quoteleft
-% \definecaseself 146 % quoteright
+\definecaseself 146 % quoteright
\stopmapping
diff --git a/Master/texmf-dist/tex/context/base/enco-ec.mkii b/Master/texmf-dist/tex/context/base/enco-ec.mkii
index 1ac41cadf24..f0964897fba 100644
--- a/Master/texmf-dist/tex/context/base/enco-ec.mkii
+++ b/Master/texmf-dist/tex/context/base/enco-ec.mkii
@@ -56,7 +56,7 @@
% \definecaseself 39 % quotesingle
% \definecaseself 13 % quotesinglebase
% \definecaseself 96 % quoteleft
-% \definecaseself 39 % quoteright
+\definecaseself 39 % quoteright
%D So far for the mapping.
diff --git a/Master/texmf-dist/tex/context/base/enco-fde.mkii b/Master/texmf-dist/tex/context/base/enco-fde.mkii
index a7c11abfcfa..da104b802b7 100644
--- a/Master/texmf-dist/tex/context/base/enco-fde.mkii
+++ b/Master/texmf-dist/tex/context/base/enco-fde.mkii
@@ -11,8 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\doifmode{mkiv}{\endinput}
-
\unprotect
\installactivecharacter "
diff --git a/Master/texmf-dist/tex/context/base/enco-ffr.mkii b/Master/texmf-dist/tex/context/base/enco-ffr.mkii
index 093cc6500b8..259b5994959 100644
--- a/Master/texmf-dist/tex/context/base/enco-ffr.mkii
+++ b/Master/texmf-dist/tex/context/base/enco-ffr.mkii
@@ -11,8 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\doifmode{mkiv}{\endinput}
-
% \definehspace[fr][:][.25em]
% \definehspace[fr][;][.25em]
% \definehspace[fr][!][.25em]
diff --git a/Master/texmf-dist/tex/context/base/enco-ini.mkii b/Master/texmf-dist/tex/context/base/enco-ini.mkii
index 33825f94d43..a277e74504f 100644
--- a/Master/texmf-dist/tex/context/base/enco-ini.mkii
+++ b/Master/texmf-dist/tex/context/base/enco-ini.mkii
@@ -747,11 +747,11 @@
%D can be used to check the correct loading of hyphenation
%D patterns.
-\fetchruntimecommand \showaccents {\f!encodingprefix\s!run.mkii}
-\fetchruntimecommand \showcharacters {\f!encodingprefix\s!run.mkii}
-\fetchruntimecommand \showcharacterbounds {\f!encodingprefix\s!run.mkii}
-\fetchruntimecommand \showhyphenations {\f!encodingprefix\s!run.mkii}
-\fetchruntimecommand \showmapping {\f!encodingprefix\s!run.mkii}
+\fetchruntimecommand \showaccents {\f!encodingprefix\s!run}
+\fetchruntimecommand \showcharacters {\f!encodingprefix\s!run}
+\fetchruntimecommand \showcharacterbounds {\f!encodingprefix\s!run}
+\fetchruntimecommand \showhyphenations {\f!encodingprefix\s!run}
+\fetchruntimecommand \showmapping {\f!encodingprefix\s!run}
%D \macros
%D {everyuppercase, EveryUppercase,
diff --git a/Master/texmf-dist/tex/context/base/enco-ini.mkiv b/Master/texmf-dist/tex/context/base/enco-ini.mkiv
index da1892faf2a..491084b8c16 100644
--- a/Master/texmf-dist/tex/context/base/enco-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/enco-ini.mkiv
@@ -36,71 +36,56 @@
\unprotect
-%D Quite some commands are now obsolete. We keep only a few commands
-%D around, just in case they are used in styles (and in for instance
-%D symb and xtag files).
-
-\unexpanded\def\startencoding [#1]{} % used in symb
-\let\stopencoding \relax
-\unexpanded\def\setupencoding [#1]{}
-\def\enablemapping [#1]{}
-\def\enableencoding[#1]{}
-
-\def\currentencoding{utf}
-\def\currentmapping {utf}
-\let\defaultencoding\s!default
-
-% todo:
+%D Obsolete (but sometimes used in styles)
-% \def\showaccents {\f!encodingprefix\s!run}
-% \def\showcharacters {\f!encodingprefix\s!run}
-% \def\showcharacterbounds {\f!encodingprefix\s!run}
-% \def\showhyphenations {\f!encodingprefix\s!run}
-% \def\showmapping {\f!encodingprefix\s!run}
+\let\defaultencoding\s!default
%D \macros
%D {defineaccent, definecharacter, definecommand}
+\unexpanded\def\dodefineaccentcommand#1%
+ {\setevalue{\string#1}{\noexpand\dohandleaccent{\string#1}}}
+
+\unexpanded\def\dodefineaccent#1#2#3% no spaces, used low level
+ {\setvalue{\??ac\string#1\string#2\empty}{#3}}
+
\unexpanded\def\defineaccent#1 #2 #3 %
- {\setevalue{\string#1}{\noexpand\dohandleaccent{\string#1}}%
- \setvalue{\??ac\string#1\string#2}{#3}}
+ {\dodefineaccentcommand{#1}%
+ \dodefineaccent{#1}{#2}{#3}}
\def\dohandleaccent#1#2%
- {\csname\??ac\string#1\string#2\empty\endcsname}
+ {\ifcsname\??ac\string#1#2\empty\endcsname
+ \csname\??ac\string#1#2\empty\endcsname
+ \else\ifcsname\??ac\string#1\string#2\empty\endcsname
+ \csname\??ac\string#1\string#2\empty\endcsname
+ \fi\fi}
\unexpanded\def\definecharacter#1 #2 %
{\doifnumberelse{\string#2}
{\setevalue{\string#1}{\utfchar{#2}}} % or {\expandafter\chardef\csname#1\endcsname#2\relax}
- {\setuvalue {\string#1}{#2}}}
+ {\setuvalue{\string#1}{#2}}}
\unexpanded\def\definecommand#1 #2 %
{\setuvalue{\string#1}{#2}}
%D \macros
-%D {everyuppercase, EveryUppercase,
-%D everyuppercase, EveryUppercase,
-%D everysanitize, EverySanitize}
-
-\newevery \everyuppercase \EveryUppercase
-\newevery \everylowercase \EveryLowercase
-\newevery \everysanitize \EverySanitize
+%D {everyuppercase, everylowercase, everysanitize}
-%D Some saved meanings (not really needed):
-
-\let\textaccent \accent
-\let\normaltextaccent\accent
+\newtoks \everyuppercase
+\newtoks \everylowercase
+\newtoks \everysanitize
%D Accent handling (try to avoid this):
-\newbox\accenttestbox
+\newbox\accenttestbox % no longer global so we could use \scratchbox
\def\buildmathaccent#1%
{\mathaccent#1 }
-\unexpanded\def\buildtextaccent#1#2%
- {\begingroup
- \global\setbox\accenttestbox\hbox{#1}%
- \scratchcounter\ctxlua{characters.charcode(\number\accenttestbox)}%
+\unexpanded\def\buildtextaccent#1#2% we could do all at the lua end
+ {\begingroup % but that's no fun (yet)
+ \setbox\accenttestbox\hbox{#1}%
+ \scratchcounter\cldcontext{nodes.firstcharinbox(\number\accenttestbox)}\relax
\ifcase\scratchcounter\else\accent\scratchcounter\fi
\relax#2%
\endgroup}
@@ -165,83 +150,48 @@
% from enco-com:
-\def\AA{\Aring}
-\def\aa{\aring}
-\def\AE{\AEligature}
-\def\ae{\aeligature}
-\def\CC{\Ccedilla}
-\def\cc{\ccedilla}
-\def \L{\Lstroke}
-\def \l{\lstroke}
-\def \O{\Ostroke}
-\def \o{\ostroke}
-\def\OE{\OEligature}
-\def\oe{\oeligature}
-\def\SZ{\Ssharp}
-\def\sz{\ssharp}
-\def\SS{\ssharp}
-\def\IJ{\IJligature}
-\def\ij{\ijligature}
-\def \i{\dotlessi}
-\def \j{\dotlessj}
+\def\AA{Å} \def\aa{å}
+\def\AE{Æ} \def\ae{æ}
+\def\CC{Ç} \def\cc{ç}
+\def \L{Ł} \def \l{ł}
+\def \O{Ø} \def \o{ø}
+\def\OE{Œ} \def\oe{œ}
+\def\SZ{SS} \def\sz{ß} \def\SS{ß}
+\def\IJ{IJ} \def\ij{ij}
% from enco-def:
-\def\dotlessI {I}
-\def\dotlessJ {J}
-
-\def\Ssharp {SS}
-
-\def\eszett {\ssharp}
-\def\Eszett {\Ssharp}
-
-\def\lslash {\lstroke}
-\def\Lslash {\Lstroke}
-\def\dslash {\dstroke}
-\def\Dslash {\Dstroke}
-\def\oslash {\ostroke}
-\def\Oslash {\Ostroke}
-\def\dcroat {\dstroke}
-\def\Dcroat {\Dstroke}
-
-\def\Kcedilla {\Kcommaaccent}
-\def\kcedilla {\kcommaaccent}
-\def\Lcedilla {\Lcommaaccent}
-\def\lcedilla {\lcommaaccent}
-\def\Ncedilla {\Ncommaaccent}
-\def\ncedilla {\ncommaaccent}
-\def\Rcedilla {\Rcommaaccent}
-\def\rcedilla {\rcommaaccent}
-
-\def\S {\sectionmark}
-\def\P {\paragraphmark}
-
-\def\aumlaut {\adiaeresis}
-\def\eumlaut {\ediaeresis}
-\def\iumlaut {\idiaeresis}
-\def\oumlaut {\odiaeresis}
-\def\uumlaut {\udiaeresis}
-\def\Aumlaut {\Adiaeresis}
-\def\Eumlaut {\Ediaeresis}
-\def\Iumlaut {\Idiaeresis}
-\def\Oumlaut {\Odiaeresis}
-\def\Uumlaut {\Udiaeresis}
-
-% for latex users
-
-\def\textS {\sectionmark}
-\def\textP {\paragraphmark}
-
-% for old times sake
-
-\def\textflorin{\fhook}
-\def\florin {\textflorin}
-\def\dollar {\textdollar}
-\def\pound {\textsterling}
-\def\sterling {\textsterling}
-\def\promille {\perthousand}
-\def\permille {\perthousand}
+\def\i{ı}
+\def\j{ȷ}
+
+\def\S{§} \def\textS {§} % obsolete (surfaced in bibliographic files)
+\def\P{¶} \def\textP {¶} % obsolete (surfaced in bibliographic files)
+
+\def\eszett {ß} \def\Eszett {SS} \def\Ssharp{SS}
+\def\lslash {ł} \def\Lslash {Ł}
+\def\dslash {đ} \def\Dslash {Đ}
+\def\oslash {ø} \def\Oslash {Ø}
+\def\dcroat {đ} \def\Dcroat {Đ}
+\def\kcedilla{ķ} \def\Kcedilla{Ķ}
+\def\lcedilla{ļ} \def\Lcedilla{Ļ}
+\def\ncedilla{ņ} \def\Ncedilla{Ņ}
+\def\rcedilla{ŗ} \def\Rcedilla{Ŗ}
+\def\aumlaut {ä} \def\Aumlaut {Ä}
+\def\eumlaut {ë} \def\Eumlaut {Ë}
+\def\iumlaut {ï} \def\Iumlaut {Ï}
+\def\oumlaut {ö} \def\Oumlaut {Ö}
+\def\uumlaut {ü} \def\Uumlaut {Ü}
+
+% for old times sake (obsolete)
+
+\def\textflorin{ƒ} \def\florin {ƒ}
+\def\pound {£} \def\sterling{£}
+\def\promille {‰} \def\permille{‰}
+
+% tex specific (obsolete)
+
\def\procent {\percent}
+\def\dollar {\textdollar}
\def\permine {\fakepermine}
% some more
@@ -272,52 +222,6 @@
\def\leftsubguillemot {\guilsingleleft}
\def\rightsubguillemot {\guilsingleright}
-% obsolete:
-
-% \greekleftquot {[obsolete]}
-% \greekrightquot {[obsolete]}
-% \greekapostrophos {[obsolete]}
-% \greekupsilondialytika{[obsolete]}
-% \Ycaron {[obsolete]}
-% \ycaron {[obsolete]}
-
-% to be done in char-def:
-
-% \definecharacter cyrillicGUP {GUP}
-% \definecharacter cyrillicGHCRS {GHCRS}
-% \definecharacter cyrillicZHDSC {ZHDSC}
-% \definecharacter cyrillicKDSC {KDSC}
-% \definecharacter cyrillicKBEAK {KBEAK}
-% \definecharacter cyrillicKVCRS {KVCRS}
-% \definecharacter cyrillicNG {NG}
-% \definecharacter cyrillicOTLD {OTLD}
-% \definecharacter cyrillicY {Y}
-% \definecharacter cyrillicYHCRS {YHCRS}
-% \definecharacter cyrillicHDSC {HDSC}
-% \definecharacter cyrillicCHVCRS {CHVCRS}
-% \definecharacter cyrillicCHRDSC {CHRDSC}
-% \definecharacter cyrillicQ {Q}
-% \definecharacter cyrillicW {W}
-%
-% \definecharacter cyrillicgup {gup}
-% \definecharacter cyrillicghcrs {ghcrs}
-% \definecharacter cyrilliczhdsc {zhdsc}
-% \definecharacter cyrillickdsc {kdsc}
-% \definecharacter cyrillickbeak {kbeak}
-% \definecharacter cyrillickvcrs {kvcrs}
-% \definecharacter cyrillicng {ng}
-% \definecharacter cyrillicotld {otld}
-% \definecharacter cyrillicy {y}
-% \definecharacter cyrillicyhcrs {yhcrs}
-% \definecharacter cyrillichdsc {hdsc}
-% \definecharacter cyrillicchvcrs {chvcrs}
-% \definecharacter cyrillicchrdsc {chrdsc}
-% \definecharacter cyrillicq {q}
-% \definecharacter cyrillicw {w}
-
-% \definecharacter softhyphen 45
-% \definecharacter compoundwordmark 23
-
% left-overs (some day in private unicode space, so that we can roundtrip)
\unexpanded\def\textblacksquare {\dontleavehmode\hbox{\vrule\!!width.3\s!em\!!height.4\s!em\!!depth-.1\s!em}}
@@ -364,127 +268,32 @@
{\copy\controlspacebox}
% a few defaults (\<whatever>{}), we really need the verbose \empty as it will be
-% stringified
-
-\defineaccent ^ {\empty} {\textcircumflex}
-\defineaccent ` {\empty} {\textgrave}
-\defineaccent ~ {\empty} {\texttilde}
-\defineaccent " {\empty} {\textdiaeresis}
-\defineaccent ' {\empty} {\textacute}
-\defineaccent . {\empty} {\textdotaccent}
-\defineaccent = {\empty} {\textmacron}
-\defineaccent c {\empty} {\textcedilla}
-\defineaccent H {\empty} {\texthungarumlaut}
-\defineaccent k {\empty} {\textogonek}
-\defineaccent r {\empty} {\textring}
-\defineaccent u {\empty} {\textbreve}
-\defineaccent v {\empty} {\textcaron}
-
-% from enco-acc:
+% stringified .. anyhow, we define this at the lua end now but keep it here as a
+% reference
%
-% we should to this at the lua end and share code ..
-
-\defineaccent ^ A {\Acircumflex} \defineaccent ^ a {\acircumflex}
-\defineaccent ^ C {\Ccircumflex} \defineaccent ^ c {\ccircumflex}
-\defineaccent ^ E {\Ecircumflex} \defineaccent ^ e {\ecircumflex}
-\defineaccent ^ G {\Gcircumflex} \defineaccent ^ g {\gcircumflex}
-\defineaccent ^ H {\Hcircumflex} \defineaccent ^ h {\hcircumflex}
-\defineaccent ^ I {\Icircumflex} \defineaccent ^ i {\icircumflex} \defineaccent ^ {\i} {\icircumflex}
-\defineaccent ^ J {\Jcircumflex} \defineaccent ^ j {\jcircumflex} \defineaccent ^ {\j} {\jcircumflex}
-\defineaccent ^ O {\Ocircumflex} \defineaccent ^ o {\ocircumflex}
-\defineaccent ^ S {\Scircumflex} \defineaccent ^ s {\scircumflex}
-\defineaccent ^ U {\Ucircumflex} \defineaccent ^ u {\ucircumflex}
-\defineaccent ^ W {\Wcircumflex} \defineaccent ^ w {\wcircumflex}
-\defineaccent ^ Y {\Ycircumflex} \defineaccent ^ y {\ycircumflex}
-
-\defineaccent ` A {\Agrave} \defineaccent ` a {\agrave}
-\defineaccent ` E {\Egrave} \defineaccent ` e {\egrave}
-\defineaccent ` I {\Igrave} \defineaccent ` i {\igrave} \defineaccent ` {\i} {\igrave}
-\defineaccent ` O {\Ograve} \defineaccent ` o {\ograve}
-\defineaccent ` U {\Ugrave} \defineaccent ` u {\ugrave}
-\defineaccent ` Y {\Ygrave} \defineaccent ` y {\ygrave}
-
-\defineaccent ~ A {\Atilde} \defineaccent ~ a {\atilde}
-\defineaccent ~ I {\Itilde} \defineaccent ~ i {\itilde} \defineaccent ~ {\i} {\itilde}
-\defineaccent ~ O {\Otilde} \defineaccent ~ o {\otilde}
-\defineaccent ~ U {\Utilde} \defineaccent ~ u {\utilde}
-\defineaccent ~ N {\Ntilde} \defineaccent ~ n {\ntilde}
-
-\defineaccent " A {\Adiaeresis} \defineaccent " a {\adiaeresis}
-\defineaccent " E {\Ediaeresis} \defineaccent " e {\ediaeresis}
-\defineaccent " I {\Idiaeresis} \defineaccent " i {\idiaeresis} \defineaccent " {\i} {\idiaeresis}
-\defineaccent " O {\Odiaeresis} \defineaccent " o {\odiaeresis}
-\defineaccent " U {\Udiaeresis} \defineaccent " u {\udiaeresis}
-\defineaccent " Y {\Ydiaeresis} \defineaccent " y {\ydiaeresis}
-
-\defineaccent ' A {\Aacute} \defineaccent ' a {\aacute}
-\defineaccent ' C {\Cacute} \defineaccent ' c {\cacute}
-\defineaccent ' E {\Eacute} \defineaccent ' e {\eacute}
-\defineaccent ' I {\Iacute} \defineaccent ' i {\iacute} \defineaccent ' {\i} {\iacute}
-\defineaccent ' L {\Lacute} \defineaccent ' l {\lacute}
-\defineaccent ' N {\Nacute} \defineaccent ' n {\nacute}
-\defineaccent ' O {\Oacute} \defineaccent ' o {\oacute}
-\defineaccent ' R {\Racute} \defineaccent ' r {\racute}
-\defineaccent ' S {\Sacute} \defineaccent ' s {\sacute}
-\defineaccent ' U {\Uacute} \defineaccent ' u {\uacute}
-\defineaccent ' Y {\Yacute} \defineaccent ' y {\yacute}
-\defineaccent ' Z {\Zacute} \defineaccent ' z {\zacute}
-
-\defineaccent . C {\Cdotaccent} \defineaccent . c {\cdotaccent}
-\defineaccent . E {\Edotaccent} \defineaccent . e {\edotaccent}
-\defineaccent . G {\Gdotaccent} \defineaccent . g {\gdotaccent}
-\defineaccent . I {\Idotaccent} \defineaccent . i {\idotaccent} \defineaccent . {\i} {\idotaccent}
-\defineaccent . Z {\Zdotaccent} \defineaccent . z {\zdotaccent}
-
-\defineaccent = A {\Amacron} \defineaccent = a {\amacron}
-\defineaccent = E {\Emacron} \defineaccent = e {\emacron}
-\defineaccent = I {\Imacron} \defineaccent = i {\imacron} \defineaccent = {\i} {\imacron}
-\defineaccent = O {\Omacron} \defineaccent = o {\omacron}
-\defineaccent = U {\Umacron} \defineaccent = u {\umacron}
-
-\defineaccent c C {\Ccedilla} \defineaccent c c {\ccedilla}
-\defineaccent c K {\Kcedilla} \defineaccent c k {\kcedilla}
-\defineaccent c L {\Lcedilla} \defineaccent c l {\lcedilla}
-\defineaccent c N {\Ncedilla} \defineaccent c n {\ncedilla}
-\defineaccent c R {\Rcedilla} \defineaccent c r {\rcedilla}
-\defineaccent c S {\Scedilla} \defineaccent c s {\scedilla}
-\defineaccent c T {\Tcedilla} \defineaccent c t {\tcedilla}
-
-\defineaccent H O {\Ohungarumlaut} \defineaccent H o {\ohungarumlaut}
-\defineaccent H u {\uhungarumlaut} \defineaccent H U {\Uhungarumlaut}
-
-\defineaccent k A {\Aogonek} \defineaccent k a {\aogonek}
-\defineaccent k E {\Eogonek} \defineaccent k e {\eogonek}
-\defineaccent k I {\Iogonek} \defineaccent k i {\iogonek}
-\defineaccent k U {\Uogonek} \defineaccent k u {\uogonek}
-
-\defineaccent r A {\Aring} \defineaccent r a {\aring}
-\defineaccent r U {\Uring} \defineaccent r u {\uring}
-
-\defineaccent u A {\Abreve} \defineaccent u a {\abreve}
-\defineaccent u E {\Ebreve} \defineaccent u e {\ebreve}
-\defineaccent u G {\Gbreve} \defineaccent u g {\gbreve}
-\defineaccent u I {\Ibreve} \defineaccent u i {\ibreve} \defineaccent u {\i} {\ibreve}
-\defineaccent u O {\Obreve} \defineaccent u o {\obreve}
-\defineaccent u U {\Ubreve} \defineaccent u u {\ubreve}
-
-\defineaccent v C {\Ccaron} \defineaccent v c {\ccaron}
-\defineaccent v D {\Dcaron} \defineaccent v d {\dcaron}
-\defineaccent v E {\Ecaron} \defineaccent v e {\ecaron}
-\defineaccent v L {\Lcaron} \defineaccent v l {\lcaron}
-\defineaccent v N {\Ncaron} \defineaccent v n {\ncaron}
-\defineaccent v R {\Rcaron} \defineaccent v r {\rcaron}
-\defineaccent v S {\Scaron} \defineaccent v s {\scaron}
-\defineaccent v T {\Tcaron} \defineaccent v t {\tcaron}
-\defineaccent v Z {\Zcaron} \defineaccent v z {\zcaron}
+% \defineaccent ^ {\empty} {\textcircumflex}
+% \defineaccent ` {\empty} {\textgrave}
+% \defineaccent ~ {\empty} {\texttilde}
+% \defineaccent " {\empty} {\textdiaeresis}
+% \defineaccent ' {\empty} {\textacute}
+% \defineaccent . {\empty} {\textdotaccent}
+% \defineaccent = {\empty} {\textmacron}
+% \defineaccent c {\empty} {\textcedilla}
+% \defineaccent H {\empty} {\texthungarumlaut}
+% \defineaccent k {\empty} {\textogonek}
+% \defineaccent r {\empty} {\textring}
+% \defineaccent u {\empty} {\textbreve}
+% \defineaccent v {\empty} {\textcaron}
+
+\ctxlua{characters.tex.defineaccents()}
% from enco-mis:
\def\fakepercent
- {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle0}}}
+ {\mathematics{\normalsuperscript{\scriptscriptstyle0}\kern-.25em/\kern-.2em\normalsubscript{\scriptscriptstyle0}}}
\def\fakeperthousand
- {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle00}}}
+ {\mathematics{\normalsuperscript{\scriptscriptstyle0}\kern-.25em/\kern-.2em\normalsubscript{\scriptscriptstyle00}}}
\def\fakepermine
{\dontleavehmode
@@ -493,27 +302,12 @@
{\mathematics{+}}%
\hbox to \wd\scratchbox
{\hss
- \mathematics{^{\scriptscriptstyle-}\kern-.4em/\kern-.3em_{\scriptscriptstyle-}}%
+ \mathematics{\normalsuperscript{\scriptscriptstyle-}\kern-.4em/\kern-.3em\normalsubscript{\scriptscriptstyle-}}%
\hss}%
\egroup}
%D A smaller and bolder variant, more like the math and monospaced ones.
-% \def\fakeunderscore
-% {\dontleavehmode\hbox % was \leavevmode
-% {\setbox\scratchbox\hbox{(}%
-% \scratchdimen.2\dp\scratchbox
-% \setbox\scratchbox\hbox{\space}%
-% \vrule
-% \!!depth \scratchdimen
-% \!!width \wd\scratchbox
-% \!!height\zeropoint}}
-
-% \startTEXpage
-% \ruledhbox{\strut$1\fakeunderscore^{1\fakeunderscore}$}
-% \ruledhbox{\strut$1\xfakeunderscore^{1\xfakeunderscore}$}
-% \stopTEXpage
-
\def\fakeunderscore
{\relax\ifmmode
\vrule\!!depth .12\fontexheight\mathstylefont\normalmathstyle\!!width \fontinterwordspace\mathstylefont\normalmathstyle\!!height\zeropoint\relax
@@ -533,4 +327,16 @@
\let\_\normalunderscore
+%D To be sorted out:
+
+\unexpanded\def\textminus
+ {\char \iffontchar\font"2012 "2012 % figuredash
+ \else\iffontchar\font"2013 "2013 % endash
+ \else\iffontchar\font"2212 "2212 % math minus
+ "002D % hyphen
+ \fi\fi\fi}
+
+\unexpanded\def\textplus
+ {\char"002B } % plus
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/enco-l7x.mkii b/Master/texmf-dist/tex/context/base/enco-l7x.mkii
index 8f355317b56..776c683c165 100644
--- a/Master/texmf-dist/tex/context/base/enco-l7x.mkii
+++ b/Master/texmf-dist/tex/context/base/enco-l7x.mkii
@@ -17,17 +17,17 @@
\startmapping[l7x]
-\definecaseswap 25 `I % dotless i (TODO - probably wrong; maybe use \defineuppercasecom)
-\definecaseswap 156 140 % oeligature
-\definecaseswap 184 168 % ostroke
-\definecaseswap 186 170 % rcommaaccent
-\definecaseswap 191 175 % aeligature
-\definecaseself 223 % ssharp (this is wrong, but no better way)
+\definecaseswap 25 `I % dotless i (TODO - probably wrong; maybe use \defineuppercasecom)
+\definecaseswap 156 140 % oeligature
+\definecaseswap 184 168 % ostroke
+\definecaseswap 186 170 % rcommaaccent
+\definecaseswap 191 175 % aeligature
+\definecaseself 223 % ssharp (this is wrong, but no better way)
\definecasemaps 192 to 222 lc +32 uc 0
\definecasemaps 224 to 254 lc 0 uc -32
-\resetcaserange 215 to 215 % textmultiply
-\resetcaserange 247 to 247 % textdiv
+\resetcaserange 215 to 215 % textmultiply
+\resetcaserange 247 to 247 % textdiv
\stopmapping
diff --git a/Master/texmf-dist/tex/context/base/enco-qx.mkii b/Master/texmf-dist/tex/context/base/enco-qx.mkii
index 407d60bd736..798a182496a 100644
--- a/Master/texmf-dist/tex/context/base/enco-qx.mkii
+++ b/Master/texmf-dist/tex/context/base/enco-qx.mkii
@@ -75,6 +75,8 @@
\definecasemaps 217 to 222 lc +32 uc 0
\definecasemaps 249 to 254 lc 0 uc -32
+\definecaseself 39 % quoteright
+
\stopmapping
\startencoding[qx]
diff --git a/Master/texmf-dist/tex/context/base/enco-t5.mkii b/Master/texmf-dist/tex/context/base/enco-t5.mkii
index 251c6876591..a8d80be1477 100644
--- a/Master/texmf-dist/tex/context/base/enco-t5.mkii
+++ b/Master/texmf-dist/tex/context/base/enco-t5.mkii
@@ -205,6 +205,8 @@
%
% \stopencoding
%
+% \unprotect
+%
% \def\xfiveencodedaa%
% {\accent23a}
%
@@ -214,7 +216,9 @@
% \dimen@\ht\zerocount
% \advance\dimen@ -1ex
% \rlap{\raise.67\dimen@\hbox{\char23}}A}
-
+%
+% \protect
+%
% \quotesinglbase 13
% \guilsinglleft 14
% \guilsinglright 15
diff --git a/Master/texmf-dist/tex/context/base/enco-x5.mkii b/Master/texmf-dist/tex/context/base/enco-x5.mkii
index f82ec6c5c41..d3b701c1a0e 100644
--- a/Master/texmf-dist/tex/context/base/enco-x5.mkii
+++ b/Master/texmf-dist/tex/context/base/enco-x5.mkii
@@ -179,6 +179,8 @@
%
% \stopencoding
%
+% \unprotect
+%
% \def\xfiveencodedaa%
% {\accent23a}
%
@@ -188,7 +190,9 @@
% \dimen@\ht\zerocount
% \advance\dimen@ -1ex
% \rlap{\raise.67\dimen@\hbox{\char23}}A}
-
+%
+% \protect
+%
% \quotesinglbase 13
% \guilsinglleft 14
% \guilsinglright 15
diff --git a/Master/texmf-dist/tex/context/base/font-afm.lua b/Master/texmf-dist/tex/context/base/font-afm.lua
index 87dec59c6e6..b719a9b3156 100644
--- a/Master/texmf-dist/tex/context/base/font-afm.lua
+++ b/Master/texmf-dist/tex/context/base/font-afm.lua
@@ -17,29 +17,56 @@ where we handles font encodings. Eventually font encoding goes
away.</p>
--ldx]]--
-local trace_features = false trackers.register("afm.features", function(v) trace_features = v end)
-local trace_indexing = false trackers.register("afm.indexing", function(v) trace_indexing = v end)
-local trace_loading = false trackers.register("afm.loading", function(v) trace_loading = v end)
+local trace_features = false trackers.register("afm.features", function(v) trace_features = v end)
+local trace_indexing = false trackers.register("afm.indexing", function(v) trace_indexing = v end)
+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 format, match, gmatch, lower, gsub = string.format, string.match, string.gmatch, string.lower, string.gsub
-local lpegmatch = lpeg.match
+local report_afm = logs.reporter("fonts","afm loading")
+
+local next, type, tonumber = next, type, tonumber
+local format, match, gmatch, lower, gsub, strip = string.format, string.match, string.gmatch, string.lower, string.gsub, string.strip
local abs = math.abs
+local P, S, C, R, lpegmatch, patterns = lpeg.P, lpeg.S, lpeg.C, lpeg.R, lpeg.match, lpeg.patterns
+
+local fonts = fonts
+local afm = { }
+local pfb = { }
+fonts.handlers.afm = afm
+fonts.handlers.pfb = pfb
+
+afm.version = 1.410 -- 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.*)
-fonts = fonts or { }
-fonts.afm = fonts.afm or { }
+afm.syncspace = true -- when true, nicer stretch values
+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 afm = fonts.afm
-local tfm = fonts.tfm
+local definers = fonts.definers
+local readers = fonts.readers
+local constructors = fonts.constructors
-afm.version = 1.402 -- incrementing this number one up will force a re-cache
-afm.syncspace = true -- when true, nicer stretch values
-afm.enhance_data = true -- best leave this set to true
-afm.features = { }
-afm.features.aux = { }
-afm.features.data = { }
-afm.features.list = { }
-afm.features.default = { }
-afm.cache = containers.define("fonts", "afm", afm.version, true)
+local findbinfile = resolvers.findbinfile
+
+local afmfeatures = constructors.newfeatures("afm")
+local registerafmfeature = afmfeatures.register
+
+local function setmode(tfmdata,value)
+ if value then
+ tfmdata.properties.mode = lower(value)
+ end
+end
+
+registerafmfeature {
+ name = "mode",
+ description = "mode",
+ initializers = {
+ base = setmode,
+ node = setmode,
+ }
+}
--[[ldx--
<p>We start with the basic reader which we give a name similar to the
@@ -62,43 +89,51 @@ built in <l n='tfm'/> and <l n='otf'/> reader.</p>
--~ Comment DELIM 2390 1010
--~ Comment AXISHEIGHT 250
-local c = lpeg.P("Comment")
-local s = lpeg.S(" \t")
-local l = lpeg.S("\n\r")
-local w = lpeg.C((1 - l)^1)
-local n = lpeg.C((lpeg.R("09") + lpeg.S("."))^1) / tonumber * s^0
-
-local fd = { }
-
-local pattern = ( c * s^1 * (
- ("CODINGSCHEME" * s^1 * w ) / function(a) end +
- ("DESIGNSIZE" * s^1 * n * w ) / function(a) fd[ 1] = a end +
- ("CHECKSUM" * s^1 * n * w ) / function(a) fd[ 2] = a end +
- ("SPACE" * s^1 * n * "plus" * n * "minus" * n) / function(a,b,c) fd[ 3], fd[ 4], fd[ 5] = a, b, c end +
- ("QUAD" * s^1 * n ) / function(a) fd[ 6] = a end +
- ("EXTRASPACE" * s^1 * n ) / function(a) fd[ 7] = a end +
- ("NUM" * s^1 * n * n * n ) / function(a,b,c) fd[ 8], fd[ 9], fd[10] = a, b, c end +
- ("DENOM" * s^1 * n * n ) / function(a,b ) fd[11], fd[12] = a, b end +
- ("SUP" * s^1 * n * n * n ) / function(a,b,c) fd[13], fd[14], fd[15] = a, b, c end +
- ("SUB" * s^1 * n * n ) / function(a,b) fd[16], fd[17] = a, b end +
- ("SUPDROP" * s^1 * n ) / function(a) fd[18] = a end +
- ("SUBDROP" * s^1 * n ) / function(a) fd[19] = a end +
- ("DELIM" * s^1 * n * n ) / function(a,b) fd[20], fd[21] = a, b end +
- ("AXISHEIGHT" * s^1 * n ) / function(a) fd[22] = a end +
- (1-l)^0
-) + (1-c)^1)^0
+local comment = P("Comment")
+local spacing = patterns.spacer -- S(" \t")^1
+local lineend = patterns.newline -- S("\n\r")
+local words = C((1 - lineend)^1)
+local number = C((R("09") + S("."))^1) / tonumber * spacing^0
+local data = lpeg.Carg(1)
+
+local pattern = ( -- needs testing ... not used anyway as we no longer need math afm's
+ comment * spacing *
+ (
+ data * (
+ ("CODINGSCHEME" * spacing * words ) / function(fd,a) end +
+ ("DESIGNSIZE" * spacing * number * words ) / function(fd,a) fd[ 1] = a end +
+ ("CHECKSUM" * spacing * number * words ) / function(fd,a) fd[ 2] = a end +
+ ("SPACE" * spacing * number * "plus" * number * "minus" * number) / function(fd,a,b,c) fd[ 3], fd[ 4], fd[ 5] = a, b, c end +
+ ("QUAD" * spacing * number ) / function(fd,a) fd[ 6] = a end +
+ ("EXTRASPACE" * spacing * number ) / function(fd,a) fd[ 7] = a end +
+ ("NUM" * spacing * number * number * number ) / function(fd,a,b,c) fd[ 8], fd[ 9], fd[10] = a, b, c end +
+ ("DENOM" * spacing * number * number ) / function(fd,a,b ) fd[11], fd[12] = a, b end +
+ ("SUP" * spacing * number * number * number ) / function(fd,a,b,c) fd[13], fd[14], fd[15] = a, b, c end +
+ ("SUB" * spacing * number * number ) / function(fd,a,b) fd[16], fd[17] = a, b end +
+ ("SUPDROP" * spacing * number ) / function(fd,a) fd[18] = a end +
+ ("SUBDROP" * spacing * number ) / function(fd,a) fd[19] = a end +
+ ("DELIM" * spacing * number * number ) / function(fd,a,b) fd[20], fd[21] = a, b end +
+ ("AXISHEIGHT" * spacing * number ) / function(fd,a) fd[22] = a end
+ )
+ + (1-lineend)^0
+ )
+ + (1-comment)^1
+)^0
local function scan_comment(str)
- fd = { }
- lpegmatch(pattern,str)
+ local fd = { }
+ lpegmatch(pattern,str,1,fd)
return fd
end
--- On a rainy day I will rewrite this in lpeg ...
+-- On a rainy day I will rewrite this in lpeg ... or we can use the (slower) fontloader
+-- as in now supports afm/pfb loading but it's not too bad to have different methods
+-- for testing approaches.
local keys = { }
-function keys.FontName (data,line) data.metadata.fullname = line:strip() end
+function keys.FontName (data,line) data.metadata.fontname = strip (line) -- get rid of spaces
+ data.metadata.fullname = strip (line) end
function keys.ItalicAngle (data,line) data.metadata.italicangle = tonumber (line) end
function keys.IsFixedPitch(data,line) data.metadata.isfixedpitch = toboolean(line,true) end
function keys.CharWidth (data,line) data.metadata.charwidth = tonumber (line) end
@@ -115,35 +150,35 @@ end
local function get_charmetrics(data,charmetrics,vector)
local characters = data.characters
- local chr, str, ind = { }, "", 0
+ local chr, ind = { }, 0
for k,v in gmatch(charmetrics,"([%a]+) +(.-) *;") do
if k == 'C' then
- if str ~= "" then characters[str] = chr end
- chr = { }
- str = ""
v = tonumber(v)
if v < 0 then
- ind = ind + 1
+ ind = ind + 1 -- ?
else
ind = v
end
- chr.index = ind
+ chr = {
+ index = ind
+ }
elseif k == 'WX' then
- chr.width = v
+ chr.width = tonumber(v)
elseif k == 'N' then
- str = v
+ characters[v] = chr
elseif k == 'B' then
local llx, lly, urx, ury = match(v,"^ *(.-) +(.-) +(.-) +(.-)$")
chr.boundingbox = { tonumber(llx), tonumber(lly), tonumber(urx), tonumber(ury) }
elseif k == 'L' then
local plus, becomes = match(v,"^(.-) +(.-)$")
- if not chr.ligatures then chr.ligatures = { } end
- chr.ligatures[plus] = becomes
+ local ligatures = chr.ligatures
+ if ligatures then
+ ligatures[plus] = becomes
+ else
+ chr.ligatures = { [plus] = becomes }
+ end
end
end
- if str ~= "" then
- characters[str] = chr
- end
end
local function get_kernpairs(data,kernpairs)
@@ -151,105 +186,112 @@ local function get_kernpairs(data,kernpairs)
for one, two, value in gmatch(kernpairs,"KPX +(.-) +(.-) +(.-)\n") do
local chr = characters[one]
if chr then
- if not chr.kerns then chr.kerns = { } end
- chr.kerns[two] = tonumber(value)
+ local kerns = chr.kerns
+ if kerns then
+ kerns[two] = tonumber(value)
+ else
+ chr.kerns = { [two] = tonumber(value) }
+ end
end
end
end
local function get_variables(data,fontmetrics)
for key, rest in gmatch(fontmetrics,"(%a+) *(.-)[\n\r]") do
- if keys[key] then keys[key](data,rest) end
+ local keyhandler = keys[key]
+ if keyhandler then
+ keyhandler(data,rest)
+ end
end
end
-local function get_indexes(data,filename)
- local pfbfile = file.replacesuffix(filename,"pfb")
- local pfbname = resolvers.find_file(pfbfile,"pfb") or ""
- if pfbname == "" then
- pfbname = resolvers.find_file(file.basename(pfbfile),"pfb") or ""
- end
- if pfbname ~= "" then
- data.luatex.filename = pfbname
- local pfbblob = fontloader.open(pfbname)
- if pfbblob then
- local characters = data.characters
- local pfbdata = fontloader.to_table(pfbblob)
- --~ print(table.serialize(pfbdata))
- if pfbdata then
- local glyphs = pfbdata.glyphs
- if glyphs then
- if trace_loading then
- logs.report("load afm","getting index data from %s",pfbname)
- end
- -- local offset = (glyphs[0] and glyphs[0] != .notdef) or 0
- for index, glyph in next, glyphs do
- local name = glyph.name
- if name then
- local char = characters[name]
- if char then
- if trace_indexing then
- logs.report("load afm","glyph %s has index %s",name,index)
- end
- char.index = index
+local function get_indexes(data,pfbname)
+ data.resources.filename = resolvers.unresolve(pfbname) -- no shortcut
+ local pfbblob = fontloader.open(pfbname)
+ if pfbblob then
+ local characters = data.characters
+ local pfbdata = fontloader.to_table(pfbblob)
+ if pfbdata then
+ local glyphs = pfbdata.glyphs
+ if glyphs then
+ if trace_loading then
+ report_afm("getting index data from %s",pfbname)
+ end
+ for index, glyph in next, glyphs do
+ local name = glyph.name
+ if name then
+ local char = characters[name]
+ if char then
+ if trace_indexing then
+ report_afm("glyph %s has index %s",name,index)
end
+ char.index = index
end
end
- elseif trace_loading then
- logs.report("load afm","no glyph data in pfb file %s",pfbname)
end
elseif trace_loading then
- logs.report("load afm","no data in pfb file %s",pfbname)
+ report_afm("no glyph data in pfb file %s",pfbname)
end
- fontloader.close(pfbblob)
elseif trace_loading then
- logs.report("load afm","invalid pfb file %s",pfbname)
+ report_afm("no data in pfb file %s",pfbname)
end
+ fontloader.close(pfbblob)
elseif trace_loading then
- logs.report("load afm","no pfb file for %s",filename)
+ report_afm("invalid pfb file %s",pfbname)
end
end
-function afm.read_afm(filename)
+local function readafm(filename)
local ok, afmblob, size = resolvers.loadbinfile(filename) -- has logging
--- local ok, afmblob = true, file.readdata(filename)
if ok and afmblob then
local data = {
- characters = { },
- metadata = {
- version = version or '0', -- hm
+ resources = {
+ filename = resolvers.unresolve(filename),
+ version = afm.version,
+ creator = "context mkiv",
+ },
+ properties = {
+ italic_correction = false,
+ },
+ goodies = {
+ },
+ metadata = {
filename = file.removesuffix(file.basename(filename))
- }
+ },
+ characters = {
+ -- a temporary store
+ },
+ descriptions = {
+ -- the final store
+ },
}
afmblob = gsub(afmblob,"StartCharMetrics(.-)EndCharMetrics", function(charmetrics)
if trace_loading then
- logs.report("load afm","loading char metrics")
+ report_afm("loading char metrics")
end
get_charmetrics(data,charmetrics,vector)
return ""
end)
afmblob = gsub(afmblob,"StartKernPairs(.-)EndKernPairs", function(kernpairs)
if trace_loading then
- logs.report("load afm","loading kern pairs")
+ report_afm("loading kern pairs")
end
get_kernpairs(data,kernpairs)
return ""
end)
afmblob = gsub(afmblob,"StartFontMetrics%s+([%d%.]+)(.-)EndFontMetrics", function(version,fontmetrics)
if trace_loading then
- logs.report("load afm","loading variables")
+ report_afm("loading variables")
end
data.afmversion = version
get_variables(data,fontmetrics)
data.fontdimens = scan_comment(fontmetrics) -- todo: all lpeg, no time now
return ""
end)
- data.luatex = { }
- get_indexes(data,filename)
return data
else
if trace_loading then
- logs.report("load afm","no valid afm file %s",filename)
+ report_afm("no valid afm file %s",filename)
end
return nil
end
@@ -261,35 +303,61 @@ by adding ligatures and kern information to the afm derived data. That
way we can set them faster when defining a font.</p>
--ldx]]--
+local addkerns, addligatures, addtexligatures, unify, normalize -- we will implement these later
+
function afm.load(filename)
-- hm, for some reasons not resolved yet
- filename = resolvers.find_file(filename,'afm') or ""
+ filename = resolvers.findfile(filename,'afm') or ""
if filename ~= "" then
local name = file.removesuffix(file.basename(filename))
- local data = containers.read(afm.cache(),name)
- local size = lfs.attributes(filename,"size") or 0
- if not data or data.verbose ~= fonts.verbose or data.size ~= size then
- logs.report("load afm", "reading %s",filename)
- data = afm.read_afm(filename)
+ local data = containers.read(afm.cache,name)
+ local attr = lfs.attributes(filename)
+ local size, time = attr.size or 0, attr.modification or 0
+ --
+ local pfbfile = file.replacesuffix(name,"pfb")
+ local pfbname = resolvers.findfile(pfbfile,"pfb") or ""
+ if pfbname == "" then
+ pfbname = resolvers.findfile(file.basename(pfbfile),"pfb") or ""
+ end
+ local pfbsize, pfbtime = 0, 0
+ if pfbname ~= "" then
+ local attr = lfs.attributes(pfbname)
+ pfbsize = attr.size or 0
+ pfbtime = attr.modification or 0
+ end
+ if not data or data.size ~= size or data.time ~= time or data.pfbsize ~= pfbsize or data.pfbtime ~= pfbtime then
+ report_afm( "reading %s",filename)
+ data = readafm(filename)
if data then
- -- data.luatex = data.luatex or { }
- logs.report("load afm", "unifying %s",filename)
- afm.unify(data,filename)
- if afm.enhance_data then
- logs.report("load afm", "add ligatures")
- afm.add_ligatures(data,'ligatures') -- easier this way
- logs.report("load afm", "add tex-ligatures")
- afm.add_ligatures(data,'texligatures') -- easier this way
- logs.report("load afm", "add extra kerns")
- afm.add_kerns(data) -- faster this way
+ if pfbname ~= "" then
+ get_indexes(data,pfbname)
+ elseif trace_loading then
+ report_afm("no pfb file for %s",filename)
+ end
+ report_afm( "unifying %s",filename)
+ unify(data,filename)
+ if afm.addligatures then
+ report_afm( "add ligatures")
+ addligatures(data)
+ end
+ if afm.addtexligatures then
+ report_afm( "add tex ligatures")
+ addtexligatures(data)
end
- logs.report("load afm", "add tounicode data")
- fonts.map.add_to_unicode(data,filename)
+ if afm.addkerns then
+ report_afm( "add extra kerns")
+ addkerns(data)
+ end
+ normalize(data)
+ report_afm( "add tounicode data")
+ fonts.mappings.addtounicode(data,filename)
data.size = size
- data.verbose = fonts.verbose
- logs.report("load afm","saving: %s in cache",name)
- data = containers.write(afm.cache(), name, data)
- data = containers.read(afm.cache(),name)
+ data.time = time
+ data.pfbsize = pfbsize
+ data.pfbtime = pfbtime
+ report_afm("saving: %s in cache",name)
+ data = containers.write(afm.cache, name, data)
+ data = containers.read(afm.cache,name)
end
end
return data
@@ -298,49 +366,61 @@ function afm.load(filename)
end
end
-function afm.unify(data, filename)
- local unicodevector = fonts.enc.load('unicode').hash
- local glyphs, indices, unicodes, names = { }, { }, { }, { }
- local verbose, private = fonts.verbose, fonts.private
+local uparser = fonts.mappings.makenameparser()
+
+unify = function(data, filename)
+ local unicodevector = fonts.encodings.agl.unicodes -- loaded runtime in context
+ local unicodes, names = { }, { }
+ local private = constructors.privateoffset
+ local descriptions = data.descriptions
for name, blob in next, data.characters do
local code = unicodevector[name] -- or characters.name_to_unicode[name]
if not code then
- local u = match(name,"^uni(%x+)$")
- code = u and tonumber(u,16)
+ code = lpegmatch(uparser,name)
if not code then
code = private
private = private + 1
- logs.report("afm glyph", "assigning private slot U+%04X for unknown glyph name %s", code, name)
+ report_afm("assigning private slot U+%05X for unknown glyph name %s", code, name)
end
end
local index = blob.index
unicodes[name] = code
- indices[code] = index
- glyphs[index] = blob
names[name] = index
blob.name = name
- if verbose then
- local bu = blob.unicode
- if not bu then
- blob.unicode = code
- elseif type(bu) == "table" then
- bu[#bu+1] = code
- else
- blob.unicode = { bu, code }
+ descriptions[code] = {
+ boundingbox = blob.boundingbox,
+ width = blob.width,
+ kerns = blob.kerns,
+ index = index,
+ name = name,
+ }
+ end
+ for unicode, description in next, descriptions do
+ local kerns = description.kerns
+ if kerns then
+ local krn = { }
+ for name, kern in next, kerns do
+ local unicode = unicodes[name]
+ if unicode then
+ krn[unicode] = kern
+ else
+ print(unicode,name)
+ end
end
- else
- blob.index = nil
+ description.kerns = krn
end
end
- data.glyphs = glyphs
data.characters = nil
- local luatex = data.luatex
- luatex.filename = luatex.filename or file.removesuffix(file.basename(filename))
- luatex.unicodes = unicodes -- name to unicode
- luatex.indices = indices -- unicode to index
- luatex.marks = { } -- todo
- luatex.names = names -- name to index
- luatex.private = private
+ local resources = data.resources
+ local filename = resources.filename or file.removesuffix(file.basename(filename))
+ resources.filename = resolvers.unresolve(filename) -- no shortcut
+ resources.unicodes = unicodes -- name to unicode
+ resources.marks = { } -- todo
+ resources.names = names -- name to index
+ resources.private = private
+end
+
+normalize = function(data)
end
--[[ldx--
@@ -348,22 +428,79 @@ end
and extra kerns. This saves quite some lookups later.</p>
--ldx]]--
-function afm.add_ligatures(afmdata,ligatures)
- local glyphs, luatex = afmdata.glyphs, afmdata.luatex
- local indices, unicodes, names = luatex.indices, luatex.unicodes, luatex.names
- for k,v in next, characters[ligatures] do -- main characters table
- local one = glyphs[names[k]]
+--[[ldx--
+<p>Only characters with a code smaller than 128 make sense,
+anything larger is encoding dependent. An interesting complication
+is that a character can be in an encoding twice but is hashed
+once.</p>
+--ldx]]--
+
+local ligatures = { -- okay, nowadays we could parse the name but type 1 fonts
+ ['f'] = { -- don't have that many ligatures anyway
+ { 'f', 'ff' },
+ { 'i', 'fi' },
+ { 'l', 'fl' },
+ },
+ ['ff'] = {
+ { 'i', 'ffi' }
+ },
+ ['fi'] = {
+ { 'i', 'fii' }
+ },
+ ['fl'] = {
+ { 'i', 'fli' }
+ },
+ ['s'] = {
+ { 't', 'st' }
+ },
+ ['i'] = {
+ { 'j', 'ij' }
+ },
+}
+
+local texligatures = {
+ -- ['space'] = {
+ -- { 'L', 'Lslash' },
+ -- { 'l', 'lslash' }
+ -- },
+ -- ['question'] = {
+ -- { 'quoteleft', 'questiondown' }
+ -- },
+ -- ['exclam'] = {
+ -- { 'quoteleft', 'exclamdown' }
+ -- },
+ ['quoteleft'] = {
+ { 'quoteleft', 'quotedblleft' }
+ },
+ ['quoteright'] = {
+ { 'quoteright', 'quotedblright' }
+ },
+ ['hyphen'] = {
+ { 'hyphen', 'endash' }
+ },
+ ['endash'] = {
+ { 'hyphen', 'emdash' }
+ }
+}
+
+local addthem = function(rawdata,ligatures)
+ 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
- for _, b in next, v do
- two, three = b[1], b[2]
- if two and three and names[two] and names[three] then
- local ol = one[ligatures]
+ for _, pair in next, ligdata do
+ local two, three = unicodes[pair[1]], unicodes[pair[2]]
+ if two and three then
+ local ol = one.ligatures
if ol then
- if not ol[two] then -- was one.ligatures ... bug
+ if not ol[two] then
ol[two] = three
end
else
- one[ligatures] = { [two] = three }
+ one.ligatures = { [two] = three }
end
end
end
@@ -371,50 +508,223 @@ function afm.add_ligatures(afmdata,ligatures)
end
end
+addligatures = function(rawdata) addthem(rawdata,ligatures ) end
+addtexligatures = function(rawdata) addthem(rawdata,texligatures) end
+
--[[ldx--
<p>We keep the extra kerns in separate kerning tables so that we can use
them selectively.</p>
--ldx]]--
-function afm.add_kerns(afmdata)
- local glyphs = afmdata.glyphs
- local names = afmdata.luatex.names
- local uncomposed = characters.uncomposed
+-- This is rather old code (from the beginning when we had only tfm). If
+-- we unify the afm data (now we have names all over the place) then
+-- we can use shcodes but there will be many more looping then. But we
+-- could get rid of the tables in char-cmp then. Als, in the generic version
+-- we don't use the character database. (Ok, we can have a context specific
+-- variant).
+
+-- we can make them numbers
+
+local left = {
+ AEligature = "A", aeligature = "a",
+ OEligature = "O", oeligature = "o",
+ IJligature = "I", ijligature = "i",
+ AE = "A", ae = "a",
+ OE = "O", oe = "o",
+ IJ = "I", ij = "i",
+ Ssharp = "S", ssharp = "s",
+}
+
+local right = {
+ AEligature = "E", aeligature = "e",
+ OEligature = "E", oeligature = "e",
+ IJligature = "J", ijligature = "j",
+ AE = "E", ae = "e",
+ OE = "E", oe = "e",
+ IJ = "J", ij = "j",
+ Ssharp = "S", ssharp = "s",
+}
+
+local both = {
+ Acircumflex = "A", acircumflex = "a",
+ Ccircumflex = "C", ccircumflex = "c",
+ Ecircumflex = "E", ecircumflex = "e",
+ Gcircumflex = "G", gcircumflex = "g",
+ Hcircumflex = "H", hcircumflex = "h",
+ Icircumflex = "I", icircumflex = "i",
+ Jcircumflex = "J", jcircumflex = "j",
+ Ocircumflex = "O", ocircumflex = "o",
+ Scircumflex = "S", scircumflex = "s",
+ Ucircumflex = "U", ucircumflex = "u",
+ Wcircumflex = "W", wcircumflex = "w",
+ Ycircumflex = "Y", ycircumflex = "y",
+
+ Agrave = "A", agrave = "a",
+ Egrave = "E", egrave = "e",
+ Igrave = "I", igrave = "i",
+ Ograve = "O", ograve = "o",
+ Ugrave = "U", ugrave = "u",
+ Ygrave = "Y", ygrave = "y",
+
+ Atilde = "A", atilde = "a",
+ Itilde = "I", itilde = "i",
+ Otilde = "O", otilde = "o",
+ Utilde = "U", utilde = "u",
+ Ntilde = "N", ntilde = "n",
+
+ Adiaeresis = "A", adiaeresis = "a", Adieresis = "A", adieresis = "a",
+ Ediaeresis = "E", ediaeresis = "e", Edieresis = "E", edieresis = "e",
+ Idiaeresis = "I", idiaeresis = "i", Idieresis = "I", idieresis = "i",
+ Odiaeresis = "O", odiaeresis = "o", Odieresis = "O", odieresis = "o",
+ Udiaeresis = "U", udiaeresis = "u", Udieresis = "U", udieresis = "u",
+ Ydiaeresis = "Y", ydiaeresis = "y", Ydieresis = "Y", ydieresis = "y",
+
+ Aacute = "A", aacute = "a",
+ Cacute = "C", cacute = "c",
+ Eacute = "E", eacute = "e",
+ Iacute = "I", iacute = "i",
+ Lacute = "L", lacute = "l",
+ Nacute = "N", nacute = "n",
+ Oacute = "O", oacute = "o",
+ Racute = "R", racute = "r",
+ Sacute = "S", sacute = "s",
+ Uacute = "U", uacute = "u",
+ Yacute = "Y", yacute = "y",
+ Zacute = "Z", zacute = "z",
+
+ Dstroke = "D", dstroke = "d",
+ Hstroke = "H", hstroke = "h",
+ Tstroke = "T", tstroke = "t",
+
+ Cdotaccent = "C", cdotaccent = "c",
+ Edotaccent = "E", edotaccent = "e",
+ Gdotaccent = "G", gdotaccent = "g",
+ Idotaccent = "I", idotaccent = "i",
+ Zdotaccent = "Z", zdotaccent = "z",
+
+ Amacron = "A", amacron = "a",
+ Emacron = "E", emacron = "e",
+ Imacron = "I", imacron = "i",
+ Omacron = "O", omacron = "o",
+ Umacron = "U", umacron = "u",
+
+ Ccedilla = "C", ccedilla = "c",
+ Kcedilla = "K", kcedilla = "k",
+ Lcedilla = "L", lcedilla = "l",
+ Ncedilla = "N", ncedilla = "n",
+ Rcedilla = "R", rcedilla = "r",
+ Scedilla = "S", scedilla = "s",
+ Tcedilla = "T", tcedilla = "t",
+
+ Ohungarumlaut = "O", ohungarumlaut = "o",
+ Uhungarumlaut = "U", uhungarumlaut = "u",
+
+ Aogonek = "A", aogonek = "a",
+ Eogonek = "E", eogonek = "e",
+ Iogonek = "I", iogonek = "i",
+ Uogonek = "U", uogonek = "u",
+
+ Aring = "A", aring = "a",
+ Uring = "U", uring = "u",
+
+ Abreve = "A", abreve = "a",
+ Ebreve = "E", ebreve = "e",
+ Gbreve = "G", gbreve = "g",
+ Ibreve = "I", ibreve = "i",
+ Obreve = "O", obreve = "o",
+ Ubreve = "U", ubreve = "u",
+
+ Ccaron = "C", ccaron = "c",
+ Dcaron = "D", dcaron = "d",
+ Ecaron = "E", ecaron = "e",
+ Lcaron = "L", lcaron = "l",
+ Ncaron = "N", ncaron = "n",
+ Rcaron = "R", rcaron = "r",
+ Scaron = "S", scaron = "s",
+ Tcaron = "T", tcaron = "t",
+ Zcaron = "Z", zcaron = "z",
+
+ dotlessI = "I", dotlessi = "i",
+ dotlessJ = "J", dotlessj = "j",
+
+ AEligature = "AE", aeligature = "ae", AE = "AE", ae = "ae",
+ OEligature = "OE", oeligature = "oe", OE = "OE", oe = "oe",
+ IJligature = "IJ", ijligature = "ij", IJ = "IJ", ij = "ij",
+
+ Lstroke = "L", lstroke = "l", Lslash = "L", lslash = "l",
+ Ostroke = "O", ostroke = "o", Oslash = "O", oslash = "o",
+
+ Ssharp = "SS", ssharp = "ss",
+
+ Aumlaut = "A", aumlaut = "a",
+ Eumlaut = "E", eumlaut = "e",
+ Iumlaut = "I", iumlaut = "i",
+ Oumlaut = "O", oumlaut = "o",
+ Uumlaut = "U", uumlaut = "u",
+
+}
+
+addkerns = function(rawdata) -- using shcodes is not robust here
+ local descriptions = rawdata.descriptions
+ local resources = rawdata.resources
+ local unicodes = resources.unicodes
local function do_it_left(what)
- for index, glyph in next, glyphs do
- local kerns = glyph.kerns
+ for unicode, description in next, descriptions do
+ local kerns = description.kerns
if kerns then
- local extrakerns = glyph.extrakerns or { }
- for complex, simple in next, uncomposed[what] do
- if names[compex] then
+ local extrakerns
+ for complex, simple in next, what do
+ complex = unicodes[complex]
+ simple = unicodes[simple]
+ if complex and simple then
local ks = kerns[simple]
if ks and not kerns[complex] then
- extrakerns[complex] = ks
+ if extrakerns then
+ extrakerns[complex] = ks
+ else
+ extrakerns = { [complex] = ks }
+ end
end
end
end
- if next(extrakerns) then
- glyph.extrakerns = extrakerns
+ if extrakerns then
+ description.extrakerns = extrakerns
end
end
end
end
local function do_it_copy(what)
- for complex, simple in next, uncomposed[what] do
- local c = glyphs[names[complex]]
- if c then -- optional
- local s = glyphs[names[simple]]
- if s then
- if not c.kerns then
- c.extrakerns = s.kerns or { }
- end
- if s.extrakerns then
- local extrakerns = c.extrakerns or { }
- for k, v in next, s.extrakerns do
- extrakerns[k] = v
+ for complex, simple in next, what do
+ complex = unicodes[complex]
+ simple = unicodes[simple]
+ if complex and simple then
+ local complexdescription = descriptions[complex]
+ if complexdescription then -- optional
+ local simpledescription = descriptions[complex]
+ if simpledescription then
+ local extrakerns
+ local kerns = simpledescription.kerns
+ if kerns then
+ for unicode, kern in next, kerns do
+ if extrakerns then
+ extrakerns[unicode] = kern
+ else
+ extrakerns = { [unicode] = kern }
+ end
+ end
+ end
+ local extrakerns = simpledescription.extrakerns
+ if extrakerns then
+ for unicode, kern in next, extrakerns do
+ if extrakerns then
+ extrakerns[unicode] = kern
+ else
+ extrakerns = { [unicode] = kern }
+ end
+ end
end
- if next(extrakerns) then
- s.extrakerns = extrakerns
+ if extrakerns then
+ complexdescription.extrakerns = extrakerns
end
end
end
@@ -422,152 +732,157 @@ function afm.add_kerns(afmdata)
end
end
-- add complex with values of simplified when present
- do_it_left("left")
- do_it_left("both")
+ do_it_left(left)
+ do_it_left(both)
-- copy kerns from simple char to complex char unless set
- do_it_copy("both")
- do_it_copy("right")
+ do_it_copy(both)
+ do_it_copy(right)
end
--[[ldx--
<p>The copying routine looks messy (and is indeed a bit messy).</p>
--ldx]]--
--- once we have otf sorted out (new format) we can try to make the afm
--- cache similar to it (similar tables)
-
-function afm.add_dimensions(data) -- we need to normalize afm to otf i.e. indexed table instead of name
+local function adddimensions(data) -- we need to normalize afm to otf i.e. indexed table instead of name
if data then
- for index, glyph in next, data.glyphs do
- local bb = glyph.boundingbox
+ for unicode, description in next, data.descriptions do
+ local bb = description.boundingbox
if bb then
local ht, dp = bb[4], -bb[2]
if ht == 0 or ht < 0 then
-- no need to set it and no negative heights, nil == 0
else
- glyph.height = ht
+ description.height = ht
end
if dp == 0 or dp < 0 then
-- no negative depths and no negative depths, nil == 0
else
- glyph.depth = dp
+ description.depth = dp
end
end
end
end
end
-fonts.formats.afm = "type1"
-fonts.formats.pfb = "type1"
-
-function afm.copy_to_tfm(data)
- if data then
- local glyphs = data.glyphs
- if glyphs then
- local metadata, luatex = data.metadata, data.luatex
- local unicodes, indices = luatex.unicodes, luatex.indices
- local characters, parameters, descriptions = { }, { }, { }
- -- todo : merge into tfm
- for u, i in next, indices do
- local d = glyphs[i]
- characters[u] = { }
- descriptions[u] = d
+local function copytotfm(data)
+ if data and data.descriptions then
+ local metadata = data.metadata
+ local resources = data.resources
+ local properties = table.derive(data.properties)
+ local descriptions = table.derive(data.descriptions)
+ local goodies = table.derive(data.goodies)
+ local characters = { }
+ local parameters = { }
+ local unicodes = resources.unicodes
+ --
+ for unicode, description in next, data.descriptions do -- use parent table
+ characters[unicode] = { }
+ end
+ --
+ 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 spacer = "space"
+ local spaceunits = 500
+ --
+ local monospaced = metadata.isfixedpitch
+ local charwidth = metadata.charwidth
+ local italicangle = metadata.italicangle
+ local charxheight = metadata.xheight and metadata.xheight > 0 and metadata.xheight
+ properties.monospaced = monospaced
+ parameters.italicangle = italicangle
+ parameters.charwidth = charwidth
+ parameters.charxheight = charxheight
+ -- same as otf
+ if properties.monospaced then
+ if descriptions[endash] then
+ spaceunits, spacer = descriptions[endash].width, "space"
end
- local filename = fonts.tfm.checked_filename(luatex) -- was metadata.filename
- local fontname = metadata.fontname or metadata.fullname
- local fullname = metadata.fullname or metadata.fontname
- local endash, emdash, space, spaceunits = unicodes['space'], unicodes['emdash'], "space", 500
- -- same as otf
- if metadata.isfixedpitch then
- if descriptions[endash] then
- spaceunits, spacer = descriptions[endash].width, "space"
- end
- if not spaceunits and descriptions[emdash] then
- spaceunits, spacer = descriptions[emdash].width, "emdash"
- end
- if not spaceunits and metadata.charwidth then
- spaceunits, spacer = metadata.charwidth, "charwidth"
- end
- else
- if descriptions[endash] then
- spaceunits, spacer = descriptions[endash].width, "space"
- end
- if not spaceunits and metadata.charwidth then
- spaceunits, spacer = metadata.charwidth, "charwidth"
- end
+ if not spaceunits and descriptions[emdash] then
+ spaceunits, spacer = descriptions[emdash].width, "emdash"
end
- spaceunits = tonumber(spaceunits)
- if spaceunits < 200 then
- -- todo: warning
+ if not spaceunits and charwidth then
+ spaceunits, spacer = charwidth, "charwidth"
end
- --
- parameters.slant = 0
- parameters.space = spaceunits
- parameters.space_stretch = 500
- parameters.space_shrink = 333
- parameters.x_height = 400
- parameters.quad = 1000
- local italicangle = data.metadata.italicangle
- if italicangle then
- parameters.slant = parameters.slant - math.round(math.tan(italicangle*math.pi/180))
+ else
+ if descriptions[endash] then
+ spaceunits, spacer = descriptions[endash].width, "space"
end
- if metadata.isfixedpitch then
- parameters.space_stretch = 0
- parameters.space_shrink = 0
- elseif afm.syncspace then
- parameters.space_stretch = spaceunits/2
- parameters.space_shrink = spaceunits/3
+ if not spaceunits and charwidth then
+ spaceunits, spacer = charwidth, "charwidth"
end
- parameters.extra_space = parameters.space_shrink
- if metadata.xheight and metadata.xheight > 0 then
- parameters.x_height = metadata.xheight
- else
- -- same as otf
- local x = unicodes['x']
+ end
+ spaceunits = tonumber(spaceunits)
+ if spaceunits < 200 then
+ -- todo: warning
+ end
+ --
+ parameters.slant = 0
+ parameters.space = spaceunits
+ parameters.space_stretch = 500
+ parameters.space_shrink = 333
+ parameters.x_height = 400
+ parameters.quad = 1000
+ --
+ if italicangle then
+ parameters.italicangle = italicangle
+ parameters.italicfactor = math.cos(math.rad(90+italicangle))
+ parameters.slant = - math.round(math.tan(italicangle*math.pi/180))
+ end
+ if monospaced then
+ parameters.space_stretch = 0
+ parameters.space_shrink = 0
+ elseif afm.syncspace then
+ parameters.space_stretch = spaceunits/2
+ parameters.space_shrink = spaceunits/3
+ end
+ parameters.extra_space = parameters.space_shrink
+ if charxheight then
+ parameters.x_height = charxheight
+ else
+ -- same as otf
+ local x = unicodes['x']
+ if x then
+ local x = descriptions[x]
if x then
- local x = descriptions[x]
- if x then
- parameters.x_height = x.height
- end
- end
- --
- end
- local fd = data.fontdimens
- if fd and fd[8] and fd[9] and fd[10] then -- math
- for k,v in next, fd do
- parameters[k] = v
+ parameters.x_height = x.height
end
end
--
- if next(characters) then
- return {
- characters = characters,
- parameters = parameters,
- descriptions = descriptions,
- indices = indices,
- unicodes = unicodes,
- luatex = luatex,
- encodingbytes = 2,
- filename = filename,
- fontname = fontname,
- fullname = fullname,
- psname = fullname, -- in otf: tfm.fontname or tfm.fullname
- name = filename or fullname or fontname,
- format = fonts.fontformat(filename,"type1"),
- type = 'real',
- units = 1000,
- direction = 0,
- boundarychar_label = 0,
- boundarychar = 65536,
- --~ false_boundarychar = 65536, -- produces invalid tfm in luatex
- designsize = (metadata.designsize or 10)*65536,
- spacer = spacer,
- ascender = abs(metadata.ascender or 0),
- descender = abs(metadata.descender or 0),
- italicangle = italicangle,
- }
+ end
+ local fd = data.fontdimens
+ if fd and fd[8] and fd[9] and fd[10] then -- math
+ for k,v in next, fd do
+ parameters[k] = v
end
end
+ --
+ parameters.designsize = (metadata.designsize or 10)*65536
+ parameters.ascender = abs(metadata.ascender or 0)
+ parameters.descender = abs(metadata.descender or 0)
+ parameters.units = 1000
+ --
+ properties.spacer = spacer
+ properties.encodingbytes = 2
+ properties.format = fonts.formats[filename] or "type1"
+ properties.filename = filename
+ properties.fontname = fontname
+ properties.fullname = fullname
+ properties.psname = fullname
+ properties.name = filename or fullname or fontname
+ --
+ if next(characters) then
+ return {
+ characters = characters,
+ descriptions = descriptions,
+ parameters = parameters,
+ resources = resources,
+ properties = properties,
+ goodies = goodies,
+ }
+ end
end
return nil
end
@@ -579,118 +894,61 @@ to treat this fontformat like any other and handle features in a
more configurable way.</p>
--ldx]]--
-function afm.features.register(name,default)
- afm.features.list[#afm.features.list+1] = name
- afm.features.default[name] = default
-end
-
-function afm.set_features(tfmdata)
- local shared = tfmdata.shared
- local afmdata = shared.afmdata
- local features = shared.features
- if features and next(features) then
- local mode = tfmdata.mode or fonts.mode
- local initializers = fonts.initializers
- local fi = initializers[mode]
- local fiafm = fi and fi.afm
- if fiafm then
- local lists = {
- fonts.triggers,
- afm.features.list,
- fonts.manipulators,
- }
- for l=1,3 do
- local list = lists[l]
- if list then
- for i=1,#list do
- local f = list[i]
- local value = features[f]
- if value and fiafm[f] then -- brr
- if trace_features then
- logs.report("define afm","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown')
- end
- fiafm[f](tfmdata,value)
- mode = tfmdata.mode or fonts.mode
- fiafm = initializers[mode].afm
- end
- end
- end
- end
- end
- local fm = fonts.methods[mode]
- local fmafm = fm and fm.afm
- if fmfm then
- local lists = {
- afm.features.list,
- }
- local sp = shared.processors
- for l=1,1 do
- local list = lists[l]
- if list then
- for i=1,#list do
- local f = list[i]
- if features[f] and fmafm[f] then -- brr
- if not sp then
- sp = { fmafm[f] }
- shared.processors = sp
- else
- sp[#sp+1] = fmafm[f]
- end
- end
- end
- end
- end
- end
+function afm.setfeatures(tfmdata,features)
+ local okay = constructors.initializefeatures("afm",tfmdata,features,trace_features,report_afm)
+ if okay then
+ return constructors.collectprocessors("afm",tfmdata,features,trace_features,report_afm)
+ else
+ return { } -- will become false
end
end
-function afm.check_features(specification)
- local features, done = fonts.define.check(specification.features.normal,afm.features.default)
- if done then
- specification.features.normal = features
- tfm.hash_instance(specification,true)
- end
+local function checkfeatures(specification)
end
-function afm.afm_to_tfm(specification)
+local function afmtotfm(specification)
local afmname = specification.filename or specification.name
if specification.forced == "afm" or specification.format == "afm" then -- move this one up
if trace_loading then
- logs.report("load afm","forcing afm format for %s",afmname)
+ report_afm("forcing afm format for %s",afmname)
end
else
- local tfmname = resolvers.findbinfile(afmname,"ofm") or ""
+ local tfmname = findbinfile(afmname,"ofm") or ""
if tfmname ~= "" then
if trace_loading then
- logs.report("load afm","fallback from afm to tfm for %s",afmname)
+ report_afm("fallback from afm to tfm for %s",afmname)
end
- afmname = ""
+ return -- just that
end
end
- if afmname == "" then
- return nil
- else
- afm.check_features(specification)
- specification = fonts.define.resolve(specification) -- new, was forgotten
- local features = specification.features.normal
+ if afmname ~= "" then
+ -- weird, isn't this already done then?
+ local features = constructors.checkedfeatures("afm",specification.features.normal)
+ specification.features.normal = features
+ constructors.hashinstance(specification,true) -- also weird here
+ --
+ specification = definers.resolve(specification) -- new, was forgotten
local cache_id = specification.hash
- local tfmdata = containers.read(tfm.cache(), cache_id) -- cache with features applied
+ local tfmdata = containers.read(constructors.cache, cache_id) -- cache with features applied
if not tfmdata then
- local afmdata = afm.load(afmname)
- if afmdata and next(afmdata) then
- afm.add_dimensions(afmdata)
- tfmdata = afm.copy_to_tfm(afmdata)
+ local rawdata = afm.load(afmname)
+ if rawdata and next(rawdata) then
+ adddimensions(rawdata)
+ tfmdata = copytotfm(rawdata)
if tfmdata and next(tfmdata) then
- tfmdata.shared = tfmdata.shared or { }
- tfmdata.unique = tfmdata.unique or { }
- tfmdata.shared.afmdata = afmdata
- tfmdata.shared.features = features
- afm.set_features(tfmdata)
+ local shared = tfmdata.shared
+ if not shared then
+ shared = { }
+ tfmdata.shared = shared
+ end
+ shared.rawdata = rawdata
+ shared.features = features
+ shared.processes = afm.setfeatures(tfmdata,features)
end
elseif trace_loading then
- logs.report("load afm","no (valid) afm file found with name %s",afmname)
+ report_afm("no (valid) afm file found with name %s",afmname)
end
- tfmdata = containers.write(tfm.cache(),cache_id,tfmdata)
+ tfmdata = containers.write(constructors.cache,cache_id,tfmdata)
end
return tfmdata
end
@@ -704,37 +962,15 @@ those cases, but now that we can handle <l n='opentype'/> directly we no longer
need this features.</p>
--ldx]]--
-tfm.default_encoding = 'unicode'
-
-function tfm.set_normal_feature(specification,name,value)
- if specification and name then
- specification.features = specification.features or { }
- specification.features.normal = specification.features.normal or { }
- specification.features.normal[name] = value
+local function read_from_afm(specification)
+ local tfmdata = afmtotfm(specification)
+ if tfmdata then
+ tfmdata.properties.name = specification.name
+ tfmdata = constructors.scale(tfmdata, specification)
+ constructors.applymanipulators("afm",tfmdata,specification.features.normal,trace_features,report_afm)
+ fonts.loggers.register(tfmdata,'afm',specification)
end
-end
-
-function tfm.read_from_afm(specification)
- local tfmtable = afm.afm_to_tfm(specification)
- if tfmtable then
- tfmtable.name = specification.name
- tfmtable = tfm.scale(tfmtable, specification.size, specification.relativeid)
- local afmdata = tfmtable.shared.afmdata
---~ local filename = afmdata and afmdata.luatex and afmdata.luatex.filename
---~ if filename then
---~ tfmtable.encodingbytes = 2
---~ tfmtable.filename = resolvers.findbinfile(filename,"") or filename
---~ tfmtable.fontname = afmdata.metadata.fontname or afmdata.metadata.fullname
---~ tfmtable.fullname = afmdata.metadata.fullname or afmdata.metadata.fontname
---~ tfmtable.format = 'type1'
---~ tfmtable.name = afmdata.luatex.filename or tfmtable.fullname
---~ end
- if fonts.dontembed[filename] then
- tfmtable.file = nil -- or filename ?
- end
- fonts.logger.save(tfmtable,'afm',specification)
- end
- return tfmtable
+ return tfmdata
end
--[[ldx--
@@ -742,40 +978,34 @@ end
those that make sense for this format.</p>
--ldx]]--
-function afm.features.prepare_ligatures(tfmdata,ligatures,value)
+local function prepareligatures(tfmdata,ligatures,value)
if value then
- local afmdata = tfmdata.shared.afmdata
- local luatex = afmdata.luatex
- local unicodes = luatex.unicodes
local descriptions = tfmdata.descriptions
- for u, chr in next, tfmdata.characters do
- local d = descriptions[u]
- local l = d[ligatures]
- if l then
- local ligatures = chr.ligatures
- if not ligatures then
- ligatures = { }
- chr.ligatures = ligatures
+ for unicode, character in next, tfmdata.characters do
+ local description = descriptions[unicode]
+ local dligatures = description.ligatures
+ if dligatures then
+ local cligatures = character.ligatures
+ if not cligatures then
+ cligatures = { }
+ character.ligatures = cligatures
end
- for k, v in next, l do
- local uk, uv = unicodes[k], unicodes[v]
- if uk and uv then
- ligatures[uk] = {
- char = uv,
- type = 0
- }
- end
+ for unicode, ligature in next, dligatures do
+ cligatures[unicode] = {
+ char = ligature,
+ type = 0
+ }
end
end
end
end
end
-function afm.features.prepare_kerns(tfmdata,kerns,value)
+local function preparekerns(tfmdata,kerns,value)
if value then
- local afmdata = tfmdata.shared.afmdata
- local luatex = afmdata.luatex
- local unicodes = luatex.unicodes
+ local rawdata = tfmdata.shared.rawdata
+ local resources = rawdata.resources
+ local unicodes = resources.unicodes
local descriptions = tfmdata.descriptions
for u, chr in next, tfmdata.characters do
local d = descriptions[u]
@@ -797,59 +1027,133 @@ function afm.features.prepare_kerns(tfmdata,kerns,value)
end
end
--- hm, register?
-
-function fonts.initializers.base.afm.ligatures (tfmdata,value) afm.features.prepare_ligatures(tfmdata,'ligatures', value) end
-function fonts.initializers.base.afm.texligatures(tfmdata,value) afm.features.prepare_ligatures(tfmdata,'texligatures',value) end
-function fonts.initializers.base.afm.kerns (tfmdata,value) afm.features.prepare_kerns (tfmdata,'kerns', value) end
-function fonts.initializers.base.afm.extrakerns (tfmdata,value) afm.features.prepare_kerns (tfmdata,'extrakerns', value) end
-
-afm.features.register('liga',true)
-afm.features.register('kerns',true)
-afm.features.register('extrakerns') -- needed?
-
-fonts.initializers.node.afm.ligatures = fonts.initializers.base.afm.ligatures
-fonts.initializers.node.afm.texligatures = fonts.initializers.base.afm.texligatures
-fonts.initializers.node.afm.kerns = fonts.initializers.base.afm.kerns
-fonts.initializers.node.afm.extrakerns = fonts.initializers.base.afm.extrakerns
-
-fonts.initializers.base.afm.liga = fonts.initializers.base.afm.ligatures
-fonts.initializers.node.afm.liga = fonts.initializers.base.afm.ligatures
-fonts.initializers.base.afm.tlig = fonts.initializers.base.afm.texligatures
-fonts.initializers.node.afm.tlig = fonts.initializers.base.afm.texligatures
+local list = {
+ -- [0x0022] = 0x201D,
+ [0x0027] = 0x2019,
+ -- [0x0060] = 0x2018,
+}
-fonts.initializers.base.afm.trep = tfm.replacements
-fonts.initializers.node.afm.trep = tfm.replacements
+local function texreplacements(tfmdata,value)
+ local descriptions = tfmdata.descriptions
+ local characters = tfmdata.characters
+ for k, v in next, list do
+ characters [k] = characters [v] -- we forget about kerns
+ descriptions[k] = descriptions[v] -- we forget about kerns
+ end
+end
-afm.features.register('tlig',true) -- todo: also proper features for afm
-afm.features.register('trep',true) -- todo: also proper features for afm
+local function ligatures (tfmdata,value) prepareligatures(tfmdata,'ligatures', value) end
+local function texligatures(tfmdata,value) prepareligatures(tfmdata,'texligatures',value) end
+local function kerns (tfmdata,value) preparekerns (tfmdata,'kerns', value) end
+local function extrakerns (tfmdata,value) preparekerns (tfmdata,'extrakerns', value) end
--- tfm features
+registerafmfeature {
+ name = "liga",
+ description = "traditional ligatures",
+ initializers = {
+ base = ligatures,
+ node = ligatures,
+ }
+}
-fonts.initializers.base.afm.equaldigits = fonts.initializers.common.equaldigits
-fonts.initializers.node.afm.equaldigits = fonts.initializers.common.equaldigits
-fonts.initializers.base.afm.lineheight = fonts.initializers.common.lineheight
-fonts.initializers.node.afm.lineheight = fonts.initializers.common.lineheight
+registerafmfeature {
+ name = "kern",
+ description = "intercharacter kerning",
+ initializers = {
+ base = kerns,
+ node = kerns,
+ }
+}
--- vf features
+registerafmfeature {
+ name = "extrakerns",
+ description = "additional intercharacter kerning",
+ initializers = {
+ base = extrakerns,
+ node = extrakerns,
+ }
+}
-fonts.initializers.base.afm.compose = fonts.initializers.common.compose
-fonts.initializers.node.afm.compose = fonts.initializers.common.compose
+registerafmfeature {
+ name = 'tlig',
+ description = 'tex ligatures',
+ initializers = {
+ base = texligatures,
+ node = texligatures,
+ }
+}
--- afm specific, encodings ...kind of obsolete
+registerafmfeature {
+ name = 'trep',
+ description = 'tex replacements',
+ initializers = {
+ base = texreplacements,
+ node = texreplacements,
+ }
+}
-afm.features.register('encoding')
+-- readers
-fonts.initializers.base.afm.encoding = fonts.initializers.common.encoding
-fonts.initializers.node.afm.encoding = fonts.initializers.common.encoding
+local check_tfm = readers.check_tfm
--- todo: oldstyle smallcaps as features for afm files (use with care)
+fonts.formats.afm = "type1"
+fonts.formats.pfb = "type1"
-fonts.initializers.base.afm.onum = fonts.initializers.common.oldstyle
-fonts.initializers.base.afm.smcp = fonts.initializers.common.smallcaps
-fonts.initializers.base.afm.fkcp = fonts.initializers.common.fakecaps
+local function check_afm(specification,fullname)
+ local foundname = findbinfile(fullname, 'afm') or "" -- just to be sure
+ if foundname == "" then
+ foundname = fonts.names.getfilename(fullname,"afm")
+ end
+ if foundname == "" and afm.autoprefixed then
+ local encoding, shortname = match(fullname,"^(.-)%-(.*)$") -- context: encoding-name.*
+ if encoding and shortname and fonts.encodings.known[encoding] then
+ shortname = findbinfile(shortname,'afm') or "" -- just to be sure
+ if shortname ~= "" then
+ foundname = shortname
+ if trace_defining then
+ report_afm("stripping encoding prefix from filename %s",afmname)
+ end
+ end
+ end
+ end
+ if foundname ~= "" then
+ specification.filename = foundname
+ specification.format = "afm"
+ return read_from_afm(specification)
+ end
+end
-afm.features.register('onum',false)
-afm.features.register('smcp',false)
-afm.features.register('fkcp',false)
+function readers.afm(specification,method)
+ local fullname, tfmdata = specification.filename or "", nil
+ if fullname == "" then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ tfmdata = check_afm(specification,specification.name .. "." .. forced)
+ end
+ if not tfmdata then
+ method = method or definers.method or "afm or tfm"
+ if method == "tfm" then
+ tfmdata = check_tfm(specification,specification.name)
+ elseif method == "afm" then
+ tfmdata = check_afm(specification,specification.name)
+ elseif method == "tfm or afm" then
+ tfmdata = check_tfm(specification,specification.name) or check_afm(specification,specification.name)
+ else -- method == "afm or tfm" or method == "" then
+ tfmdata = check_afm(specification,specification.name) or check_tfm(specification,specification.name)
+ end
+ end
+ else
+ tfmdata = check_afm(specification,fullname)
+ end
+ return tfmdata
+end
+function readers.pfb(specification,method) -- only called when forced
+ local original = specification.specification
+ if trace_defining then
+ report_afm("using afm reader for '%s'",original)
+ end
+ specification.specification = gsub(original,"%.pfb",".afm")
+ specification.forced = "afm"
+ return readers.afm(specification,method)
+end
diff --git a/Master/texmf-dist/tex/context/base/font-age.lua b/Master/texmf-dist/tex/context/base/font-age.lua
new file mode 100644
index 00000000000..741bb475ab2
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/font-age.lua
@@ -0,0 +1,3744 @@
+if not modules then modules = { } end modules ['font-age'] = {
+ version = 1.001,
+ comment = "companion to font-gee.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "derived from http://www.adobe.com/devnet/opentype/archives/glyphlist.txt",
+ original = "Adobe Glyph List, version 2.0, September 20, 2002",
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+return { -- generated
+ ["A"]=65,
+ ["AE"]=198,
+ ["AEacute"]=508,
+ ["AEmacron"]=482,
+ ["Aacute"]=193,
+ ["Abreve"]=258,
+ ["Abreveacute"]=7854,
+ ["Abrevecyrillic"]=1232,
+ ["Abrevedotbelow"]=7862,
+ ["Abrevegrave"]=7856,
+ ["Abrevehookabove"]=7858,
+ ["Abrevetilde"]=7860,
+ ["Acaron"]=461,
+ ["Acircle"]=9398,
+ ["Acircumflex"]=194,
+ ["Acircumflexacute"]=7844,
+ ["Acircumflexdotbelow"]=7852,
+ ["Acircumflexgrave"]=7846,
+ ["Acircumflexhookabove"]=7848,
+ ["Acircumflextilde"]=7850,
+ ["Adblgrave"]=512,
+ ["Adieresis"]=196,
+ ["Adieresiscyrillic"]=1234,
+ ["Adieresismacron"]=478,
+ ["Adotbelow"]=7840,
+ ["Adotmacron"]=480,
+ ["Agrave"]=192,
+ ["Ahookabove"]=7842,
+ ["Aiecyrillic"]=1236,
+ ["Ainvertedbreve"]=514,
+ ["Alpha"]=913,
+ ["Alphatonos"]=902,
+ ["Amacron"]=256,
+ ["Amonospace"]=65313,
+ ["Aogonek"]=260,
+ ["Aring"]=197,
+ ["Aringacute"]=506,
+ ["Aringbelow"]=7680,
+ ["Atilde"]=195,
+ ["Aybarmenian"]=1329,
+ ["B"]=66,
+ ["Bcircle"]=9399,
+ ["Bdotaccent"]=7682,
+ ["Bdotbelow"]=7684,
+ ["Benarmenian"]=1330,
+ ["Beta"]=914,
+ ["Bhook"]=385,
+ ["Blinebelow"]=7686,
+ ["Bmonospace"]=65314,
+ ["Btopbar"]=386,
+ ["C"]=67,
+ ["Caarmenian"]=1342,
+ ["Cacute"]=262,
+ ["Ccaron"]=268,
+ ["Ccedilla"]=199,
+ ["Ccedillaacute"]=7688,
+ ["Ccircle"]=9400,
+ ["Ccircumflex"]=264,
+ ["Cdotaccent"]=266,
+ ["Chaarmenian"]=1353,
+ ["Cheabkhasiancyrillic"]=1212,
+ ["Chedescenderabkhasiancyrillic"]=1214,
+ ["Chedescendercyrillic"]=1206,
+ ["Chedieresiscyrillic"]=1268,
+ ["Cheharmenian"]=1347,
+ ["Chekhakassiancyrillic"]=1227,
+ ["Cheverticalstrokecyrillic"]=1208,
+ ["Chi"]=935,
+ ["Chook"]=391,
+ ["Cmonospace"]=65315,
+ ["Coarmenian"]=1361,
+ ["D"]=68,
+ ["DZ"]=497,
+ ["DZcaron"]=452,
+ ["Daarmenian"]=1332,
+ ["Dafrican"]=393,
+ ["Dcaron"]=270,
+ ["Dcedilla"]=7696,
+ ["Dcircle"]=9401,
+ ["Dcircumflexbelow"]=7698,
+ ["Ddotaccent"]=7690,
+ ["Ddotbelow"]=7692,
+ ["Deicoptic"]=1006,
+ ["Deltagreek"]=916,
+ ["Dhook"]=394,
+ ["Digammagreek"]=988,
+ ["Dlinebelow"]=7694,
+ ["Dmonospace"]=65316,
+ ["Dslash"]=272,
+ ["Dtopbar"]=395,
+ ["Dz"]=498,
+ ["Dzcaron"]=453,
+ ["Dzeabkhasiancyrillic"]=1248,
+ ["E"]=69,
+ ["Eacute"]=201,
+ ["Ebreve"]=276,
+ ["Ecaron"]=282,
+ ["Ecedillabreve"]=7708,
+ ["Echarmenian"]=1333,
+ ["Ecircle"]=9402,
+ ["Ecircumflex"]=202,
+ ["Ecircumflexacute"]=7870,
+ ["Ecircumflexbelow"]=7704,
+ ["Ecircumflexdotbelow"]=7878,
+ ["Ecircumflexgrave"]=7872,
+ ["Ecircumflexhookabove"]=7874,
+ ["Ecircumflextilde"]=7876,
+ ["Edblgrave"]=516,
+ ["Edieresis"]=203,
+ ["Edotaccent"]=278,
+ ["Edotbelow"]=7864,
+ ["Egrave"]=200,
+ ["Eharmenian"]=1335,
+ ["Ehookabove"]=7866,
+ ["Eightroman"]=8551,
+ ["Einvertedbreve"]=518,
+ ["Eiotifiedcyrillic"]=1124,
+ ["Elevenroman"]=8554,
+ ["Emacron"]=274,
+ ["Emacronacute"]=7702,
+ ["Emacrongrave"]=7700,
+ ["Emonospace"]=65317,
+ ["Endescendercyrillic"]=1186,
+ ["Eng"]=330,
+ ["Enghecyrillic"]=1188,
+ ["Enhookcyrillic"]=1223,
+ ["Eogonek"]=280,
+ ["Eopen"]=400,
+ ["Epsilon"]=917,
+ ["Epsilontonos"]=904,
+ ["Ereversed"]=398,
+ ["Esdescendercyrillic"]=1194,
+ ["Esh"]=425,
+ ["Eta"]=919,
+ ["Etarmenian"]=1336,
+ ["Etatonos"]=905,
+ ["Eth"]=208,
+ ["Etilde"]=7868,
+ ["Etildebelow"]=7706,
+ ["Ezh"]=439,
+ ["Ezhcaron"]=494,
+ ["Ezhreversed"]=440,
+ ["F"]=70,
+ ["Fcircle"]=9403,
+ ["Fdotaccent"]=7710,
+ ["Feharmenian"]=1366,
+ ["Feicoptic"]=996,
+ ["Fhook"]=401,
+ ["Fiveroman"]=8548,
+ ["Fmonospace"]=65318,
+ ["Fourroman"]=8547,
+ ["G"]=71,
+ ["GBsquare"]=13191,
+ ["Gacute"]=500,
+ ["Gamma"]=915,
+ ["Gammaafrican"]=404,
+ ["Gangiacoptic"]=1002,
+ ["Gbreve"]=286,
+ ["Gcaron"]=486,
+ ["Gcircle"]=9404,
+ ["Gcircumflex"]=284,
+ ["Gcommaaccent"]=290,
+ ["Gdotaccent"]=288,
+ ["Ghadarmenian"]=1346,
+ ["Ghemiddlehookcyrillic"]=1172,
+ ["Ghestrokecyrillic"]=1170,
+ ["Ghook"]=403,
+ ["Gimarmenian"]=1331,
+ ["Gmacron"]=7712,
+ ["Gmonospace"]=65319,
+ ["Gsmallhook"]=667,
+ ["Gstroke"]=484,
+ ["H"]=72,
+ ["HPsquare"]=13259,
+ ["Haabkhasiancyrillic"]=1192,
+ ["Hadescendercyrillic"]=1202,
+ ["Hbar"]=294,
+ ["Hbrevebelow"]=7722,
+ ["Hcedilla"]=7720,
+ ["Hcircle"]=9405,
+ ["Hcircumflex"]=292,
+ ["Hdieresis"]=7718,
+ ["Hdotaccent"]=7714,
+ ["Hdotbelow"]=7716,
+ ["Hmonospace"]=65320,
+ ["Hoarmenian"]=1344,
+ ["Horicoptic"]=1000,
+ ["Hzsquare"]=13200,
+ ["I"]=73,
+ ["IJ"]=306,
+ ["Iacute"]=205,
+ ["Ibreve"]=300,
+ ["Icaron"]=463,
+ ["Icircle"]=9406,
+ ["Icircumflex"]=206,
+ ["Idblgrave"]=520,
+ ["Idieresis"]=207,
+ ["Idieresisacute"]=7726,
+ ["Idieresiscyrillic"]=1252,
+ ["Idotaccent"]=304,
+ ["Idotbelow"]=7882,
+ ["Iebrevecyrillic"]=1238,
+ ["Ifraktur"]=8465,
+ ["Igrave"]=204,
+ ["Ihookabove"]=7880,
+ ["Iinvertedbreve"]=522,
+ ["Imacron"]=298,
+ ["Imacroncyrillic"]=1250,
+ ["Imonospace"]=65321,
+ ["Iniarmenian"]=1339,
+ ["Iogonek"]=302,
+ ["Iota"]=921,
+ ["Iotaafrican"]=406,
+ ["Iotadieresis"]=938,
+ ["Iotatonos"]=906,
+ ["Istroke"]=407,
+ ["Itilde"]=296,
+ ["Itildebelow"]=7724,
+ ["Izhitsadblgravecyrillic"]=1142,
+ ["J"]=74,
+ ["Jaarmenian"]=1345,
+ ["Jcircle"]=9407,
+ ["Jcircumflex"]=308,
+ ["Jheharmenian"]=1355,
+ ["Jmonospace"]=65322,
+ ["K"]=75,
+ ["KBsquare"]=13189,
+ ["KKsquare"]=13261,
+ ["Kabashkircyrillic"]=1184,
+ ["Kacute"]=7728,
+ ["Kadescendercyrillic"]=1178,
+ ["Kahookcyrillic"]=1219,
+ ["Kappa"]=922,
+ ["Kastrokecyrillic"]=1182,
+ ["Kaverticalstrokecyrillic"]=1180,
+ ["Kcaron"]=488,
+ ["Kcircle"]=9408,
+ ["Kcommaaccent"]=310,
+ ["Kdotbelow"]=7730,
+ ["Keharmenian"]=1364,
+ ["Kenarmenian"]=1343,
+ ["Kheicoptic"]=998,
+ ["Khook"]=408,
+ ["Klinebelow"]=7732,
+ ["Kmonospace"]=65323,
+ ["Koppacyrillic"]=1152,
+ ["Koppagreek"]=990,
+ ["Ksicyrillic"]=1134,
+ ["L"]=76,
+ ["LJ"]=455,
+ ["Lacute"]=313,
+ ["Lambda"]=923,
+ ["Lcaron"]=317,
+ ["Lcircle"]=9409,
+ ["Lcircumflexbelow"]=7740,
+ ["Lcommaaccent"]=315,
+ ["Ldotaccent"]=319,
+ ["Ldotbelow"]=7734,
+ ["Ldotbelowmacron"]=7736,
+ ["Liwnarmenian"]=1340,
+ ["Lj"]=456,
+ ["Llinebelow"]=7738,
+ ["Lmonospace"]=65324,
+ ["Lslash"]=321,
+ ["M"]=77,
+ ["MBsquare"]=13190,
+ ["Macute"]=7742,
+ ["Mcircle"]=9410,
+ ["Mdotaccent"]=7744,
+ ["Mdotbelow"]=7746,
+ ["Menarmenian"]=1348,
+ ["Mmonospace"]=65325,
+ ["Mturned"]=412,
+ ["Mu"]=924,
+ ["N"]=78,
+ ["NJ"]=458,
+ ["Nacute"]=323,
+ ["Ncaron"]=327,
+ ["Ncircle"]=9411,
+ ["Ncircumflexbelow"]=7754,
+ ["Ncommaaccent"]=325,
+ ["Ndotaccent"]=7748,
+ ["Ndotbelow"]=7750,
+ ["Nhookleft"]=413,
+ ["Nineroman"]=8552,
+ ["Nj"]=459,
+ ["Nlinebelow"]=7752,
+ ["Nmonospace"]=65326,
+ ["Nowarmenian"]=1350,
+ ["Ntilde"]=209,
+ ["Nu"]=925,
+ ["O"]=79,
+ ["OE"]=338,
+ ["Oacute"]=211,
+ ["Obarredcyrillic"]=1256,
+ ["Obarreddieresiscyrillic"]=1258,
+ ["Obreve"]=334,
+ ["Ocaron"]=465,
+ ["Ocenteredtilde"]=415,
+ ["Ocircle"]=9412,
+ ["Ocircumflex"]=212,
+ ["Ocircumflexacute"]=7888,
+ ["Ocircumflexdotbelow"]=7896,
+ ["Ocircumflexgrave"]=7890,
+ ["Ocircumflexhookabove"]=7892,
+ ["Ocircumflextilde"]=7894,
+ ["Odblgrave"]=524,
+ ["Odieresis"]=214,
+ ["Odieresiscyrillic"]=1254,
+ ["Odotbelow"]=7884,
+ ["Ograve"]=210,
+ ["Oharmenian"]=1365,
+ ["Ohookabove"]=7886,
+ ["Ohorn"]=416,
+ ["Ohornacute"]=7898,
+ ["Ohorndotbelow"]=7906,
+ ["Ohorngrave"]=7900,
+ ["Ohornhookabove"]=7902,
+ ["Ohorntilde"]=7904,
+ ["Ohungarumlaut"]=336,
+ ["Oi"]=418,
+ ["Oinvertedbreve"]=526,
+ ["Omacron"]=332,
+ ["Omacronacute"]=7762,
+ ["Omacrongrave"]=7760,
+ ["Omega"]=8486,
+ ["Omegacyrillic"]=1120,
+ ["Omegagreek"]=937,
+ ["Omegaroundcyrillic"]=1146,
+ ["Omegatitlocyrillic"]=1148,
+ ["Omegatonos"]=911,
+ ["Omicron"]=927,
+ ["Omicrontonos"]=908,
+ ["Omonospace"]=65327,
+ ["Oneroman"]=8544,
+ ["Oogonek"]=490,
+ ["Oogonekmacron"]=492,
+ ["Oopen"]=390,
+ ["Oslash"]=216,
+ ["Ostrokeacute"]=510,
+ ["Otcyrillic"]=1150,
+ ["Otilde"]=213,
+ ["Otildeacute"]=7756,
+ ["Otildedieresis"]=7758,
+ ["P"]=80,
+ ["Pacute"]=7764,
+ ["Pcircle"]=9413,
+ ["Pdotaccent"]=7766,
+ ["Peharmenian"]=1354,
+ ["Pemiddlehookcyrillic"]=1190,
+ ["Phi"]=934,
+ ["Phook"]=420,
+ ["Pi"]=928,
+ ["Piwrarmenian"]=1363,
+ ["Pmonospace"]=65328,
+ ["Psi"]=936,
+ ["Psicyrillic"]=1136,
+ ["Q"]=81,
+ ["Qcircle"]=9414,
+ ["Qmonospace"]=65329,
+ ["R"]=82,
+ ["Raarmenian"]=1356,
+ ["Racute"]=340,
+ ["Rcaron"]=344,
+ ["Rcircle"]=9415,
+ ["Rcommaaccent"]=342,
+ ["Rdblgrave"]=528,
+ ["Rdotaccent"]=7768,
+ ["Rdotbelow"]=7770,
+ ["Rdotbelowmacron"]=7772,
+ ["Reharmenian"]=1360,
+ ["Rfraktur"]=8476,
+ ["Rho"]=929,
+ ["Rinvertedbreve"]=530,
+ ["Rlinebelow"]=7774,
+ ["Rmonospace"]=65330,
+ ["Rsmallinverted"]=641,
+ ["Rsmallinvertedsuperior"]=694,
+ ["S"]=83,
+ ["SF010000"]=9484,
+ ["SF020000"]=9492,
+ ["SF030000"]=9488,
+ ["SF040000"]=9496,
+ ["SF050000"]=9532,
+ ["SF060000"]=9516,
+ ["SF070000"]=9524,
+ ["SF080000"]=9500,
+ ["SF090000"]=9508,
+ ["SF100000"]=9472,
+ ["SF110000"]=9474,
+ ["SF190000"]=9569,
+ ["SF200000"]=9570,
+ ["SF210000"]=9558,
+ ["SF220000"]=9557,
+ ["SF230000"]=9571,
+ ["SF240000"]=9553,
+ ["SF250000"]=9559,
+ ["SF260000"]=9565,
+ ["SF270000"]=9564,
+ ["SF280000"]=9563,
+ ["SF360000"]=9566,
+ ["SF370000"]=9567,
+ ["SF380000"]=9562,
+ ["SF390000"]=9556,
+ ["SF400000"]=9577,
+ ["SF410000"]=9574,
+ ["SF420000"]=9568,
+ ["SF430000"]=9552,
+ ["SF440000"]=9580,
+ ["SF450000"]=9575,
+ ["SF460000"]=9576,
+ ["SF470000"]=9572,
+ ["SF480000"]=9573,
+ ["SF490000"]=9561,
+ ["SF500000"]=9560,
+ ["SF510000"]=9554,
+ ["SF520000"]=9555,
+ ["SF530000"]=9579,
+ ["SF540000"]=9578,
+ ["Sacute"]=346,
+ ["Sacutedotaccent"]=7780,
+ ["Sampigreek"]=992,
+ ["Scaron"]=352,
+ ["Scarondotaccent"]=7782,
+ ["Scedilla"]=350,
+ ["Schwa"]=399,
+ ["Schwacyrillic"]=1240,
+ ["Schwadieresiscyrillic"]=1242,
+ ["Scircle"]=9416,
+ ["Scircumflex"]=348,
+ ["Scommaaccent"]=536,
+ ["Sdotaccent"]=7776,
+ ["Sdotbelow"]=7778,
+ ["Sdotbelowdotaccent"]=7784,
+ ["Seharmenian"]=1357,
+ ["Sevenroman"]=8550,
+ ["Shaarmenian"]=1351,
+ ["Sheicoptic"]=994,
+ ["Shhacyrillic"]=1210,
+ ["Shimacoptic"]=1004,
+ ["Sigma"]=931,
+ ["Sixroman"]=8549,
+ ["Smonospace"]=65331,
+ ["Stigmagreek"]=986,
+ ["T"]=84,
+ ["Tau"]=932,
+ ["Tbar"]=358,
+ ["Tcaron"]=356,
+ ["Tcircle"]=9417,
+ ["Tcircumflexbelow"]=7792,
+ ["Tcommaaccent"]=354,
+ ["Tdotaccent"]=7786,
+ ["Tdotbelow"]=7788,
+ ["Tedescendercyrillic"]=1196,
+ ["Tenroman"]=8553,
+ ["Tetsecyrillic"]=1204,
+ ["Theta"]=920,
+ ["Thook"]=428,
+ ["Thorn"]=222,
+ ["Threeroman"]=8546,
+ ["Tiwnarmenian"]=1359,
+ ["Tlinebelow"]=7790,
+ ["Tmonospace"]=65332,
+ ["Toarmenian"]=1337,
+ ["Tonefive"]=444,
+ ["Tonesix"]=388,
+ ["Tonetwo"]=423,
+ ["Tretroflexhook"]=430,
+ ["Twelveroman"]=8555,
+ ["Tworoman"]=8545,
+ ["U"]=85,
+ ["Uacute"]=218,
+ ["Ubreve"]=364,
+ ["Ucaron"]=467,
+ ["Ucircle"]=9418,
+ ["Ucircumflex"]=219,
+ ["Ucircumflexbelow"]=7798,
+ ["Udblgrave"]=532,
+ ["Udieresis"]=220,
+ ["Udieresisacute"]=471,
+ ["Udieresisbelow"]=7794,
+ ["Udieresiscaron"]=473,
+ ["Udieresiscyrillic"]=1264,
+ ["Udieresisgrave"]=475,
+ ["Udieresismacron"]=469,
+ ["Udotbelow"]=7908,
+ ["Ugrave"]=217,
+ ["Uhookabove"]=7910,
+ ["Uhorn"]=431,
+ ["Uhornacute"]=7912,
+ ["Uhorndotbelow"]=7920,
+ ["Uhorngrave"]=7914,
+ ["Uhornhookabove"]=7916,
+ ["Uhorntilde"]=7918,
+ ["Uhungarumlaut"]=368,
+ ["Uhungarumlautcyrillic"]=1266,
+ ["Uinvertedbreve"]=534,
+ ["Ukcyrillic"]=1144,
+ ["Umacron"]=362,
+ ["Umacroncyrillic"]=1262,
+ ["Umacrondieresis"]=7802,
+ ["Umonospace"]=65333,
+ ["Uogonek"]=370,
+ ["Upsilon"]=933,
+ ["Upsilonacutehooksymbolgreek"]=979,
+ ["Upsilonafrican"]=433,
+ ["Upsilondieresis"]=939,
+ ["Upsilondieresishooksymbolgreek"]=980,
+ ["Upsilonhooksymbol"]=978,
+ ["Upsilontonos"]=910,
+ ["Uring"]=366,
+ ["Ustraightcyrillic"]=1198,
+ ["Ustraightstrokecyrillic"]=1200,
+ ["Utilde"]=360,
+ ["Utildeacute"]=7800,
+ ["Utildebelow"]=7796,
+ ["V"]=86,
+ ["Vcircle"]=9419,
+ ["Vdotbelow"]=7806,
+ ["Vewarmenian"]=1358,
+ ["Vhook"]=434,
+ ["Vmonospace"]=65334,
+ ["Voarmenian"]=1352,
+ ["Vtilde"]=7804,
+ ["W"]=87,
+ ["Wacute"]=7810,
+ ["Wcircle"]=9420,
+ ["Wcircumflex"]=372,
+ ["Wdieresis"]=7812,
+ ["Wdotaccent"]=7814,
+ ["Wdotbelow"]=7816,
+ ["Wgrave"]=7808,
+ ["Wmonospace"]=65335,
+ ["X"]=88,
+ ["Xcircle"]=9421,
+ ["Xdieresis"]=7820,
+ ["Xdotaccent"]=7818,
+ ["Xeharmenian"]=1341,
+ ["Xi"]=926,
+ ["Xmonospace"]=65336,
+ ["Y"]=89,
+ ["Yacute"]=221,
+ ["Ycircle"]=9422,
+ ["Ycircumflex"]=374,
+ ["Ydieresis"]=376,
+ ["Ydotaccent"]=7822,
+ ["Ydotbelow"]=7924,
+ ["Yerudieresiscyrillic"]=1272,
+ ["Ygrave"]=7922,
+ ["Yhook"]=435,
+ ["Yhookabove"]=7926,
+ ["Yiarmenian"]=1349,
+ ["Yiwnarmenian"]=1362,
+ ["Ymonospace"]=65337,
+ ["Ytilde"]=7928,
+ ["Yusbigcyrillic"]=1130,
+ ["Yusbigiotifiedcyrillic"]=1132,
+ ["Yuslittlecyrillic"]=1126,
+ ["Yuslittleiotifiedcyrillic"]=1128,
+ ["Z"]=90,
+ ["Zaarmenian"]=1334,
+ ["Zacute"]=377,
+ ["Zcaron"]=381,
+ ["Zcircle"]=9423,
+ ["Zcircumflex"]=7824,
+ ["Zdotaccent"]=379,
+ ["Zdotbelow"]=7826,
+ ["Zedescendercyrillic"]=1176,
+ ["Zedieresiscyrillic"]=1246,
+ ["Zeta"]=918,
+ ["Zhearmenian"]=1338,
+ ["Zhebrevecyrillic"]=1217,
+ ["Zhedescendercyrillic"]=1174,
+ ["Zhedieresiscyrillic"]=1244,
+ ["Zlinebelow"]=7828,
+ ["Zmonospace"]=65338,
+ ["Zstroke"]=437,
+ ["a"]=97,
+ ["aabengali"]=2438,
+ ["aacute"]=225,
+ ["aadeva"]=2310,
+ ["aagujarati"]=2694,
+ ["aagurmukhi"]=2566,
+ ["aamatragurmukhi"]=2622,
+ ["aarusquare"]=13059,
+ ["aavowelsignbengali"]=2494,
+ ["aavowelsigndeva"]=2366,
+ ["aavowelsigngujarati"]=2750,
+ ["abbreviationmarkarmenian"]=1375,
+ ["abbreviationsigndeva"]=2416,
+ ["abengali"]=2437,
+ ["abopomofo"]=12570,
+ ["abreve"]=259,
+ ["abreveacute"]=7855,
+ ["abrevecyrillic"]=1233,
+ ["abrevedotbelow"]=7863,
+ ["abrevegrave"]=7857,
+ ["abrevehookabove"]=7859,
+ ["abrevetilde"]=7861,
+ ["acaron"]=462,
+ ["acircle"]=9424,
+ ["acircumflex"]=226,
+ ["acircumflexacute"]=7845,
+ ["acircumflexdotbelow"]=7853,
+ ["acircumflexgrave"]=7847,
+ ["acircumflexhookabove"]=7849,
+ ["acircumflextilde"]=7851,
+ ["acute"]=180,
+ ["acutebelowcmb"]=791,
+ ["acutecomb"]=769,
+ ["acutedeva"]=2388,
+ ["acutelowmod"]=719,
+ ["acutetonecmb"]=833,
+ ["adblgrave"]=513,
+ ["addakgurmukhi"]=2673,
+ ["adeva"]=2309,
+ ["adieresis"]=228,
+ ["adieresiscyrillic"]=1235,
+ ["adieresismacron"]=479,
+ ["adotbelow"]=7841,
+ ["adotmacron"]=481,
+ ["ae"]=230,
+ ["aeacute"]=509,
+ ["aekorean"]=12624,
+ ["aemacron"]=483,
+ ["afii10017"]=1040,
+ ["afii10018"]=1041,
+ ["afii10019"]=1042,
+ ["afii10020"]=1043,
+ ["afii10021"]=1044,
+ ["afii10022"]=1045,
+ ["afii10023"]=1025,
+ ["afii10024"]=1046,
+ ["afii10025"]=1047,
+ ["afii10026"]=1048,
+ ["afii10027"]=1049,
+ ["afii10028"]=1050,
+ ["afii10029"]=1051,
+ ["afii10030"]=1052,
+ ["afii10031"]=1053,
+ ["afii10032"]=1054,
+ ["afii10033"]=1055,
+ ["afii10034"]=1056,
+ ["afii10035"]=1057,
+ ["afii10036"]=1058,
+ ["afii10037"]=1059,
+ ["afii10038"]=1060,
+ ["afii10039"]=1061,
+ ["afii10040"]=1062,
+ ["afii10041"]=1063,
+ ["afii10042"]=1064,
+ ["afii10043"]=1065,
+ ["afii10044"]=1066,
+ ["afii10045"]=1067,
+ ["afii10046"]=1068,
+ ["afii10047"]=1069,
+ ["afii10048"]=1070,
+ ["afii10049"]=1071,
+ ["afii10050"]=1168,
+ ["afii10051"]=1026,
+ ["afii10052"]=1027,
+ ["afii10053"]=1028,
+ ["afii10054"]=1029,
+ ["afii10055"]=1030,
+ ["afii10056"]=1031,
+ ["afii10057"]=1032,
+ ["afii10058"]=1033,
+ ["afii10059"]=1034,
+ ["afii10060"]=1035,
+ ["afii10061"]=1036,
+ ["afii10062"]=1038,
+ ["afii10065"]=1072,
+ ["afii10145"]=1039,
+ ["afii10146"]=1122,
+ ["afii10147"]=1138,
+ ["afii10148"]=1140,
+ ["afii299"]=8206,
+ ["afii300"]=8207,
+ ["afii301"]=8205,
+ ["afii57534"]=1749,
+ ["afii61573"]=8236,
+ ["afii61574"]=8237,
+ ["afii61575"]=8238,
+ ["agrave"]=224,
+ ["agujarati"]=2693,
+ ["agurmukhi"]=2565,
+ ["ahiragana"]=12354,
+ ["ahookabove"]=7843,
+ ["aibengali"]=2448,
+ ["aibopomofo"]=12574,
+ ["aideva"]=2320,
+ ["aiecyrillic"]=1237,
+ ["aigujarati"]=2704,
+ ["aigurmukhi"]=2576,
+ ["aimatragurmukhi"]=2632,
+ ["ainarabic"]=1593,
+ ["ainfinalarabic"]=65226,
+ ["aininitialarabic"]=65227,
+ ["ainmedialarabic"]=65228,
+ ["ainvertedbreve"]=515,
+ ["aivowelsignbengali"]=2504,
+ ["aivowelsigndeva"]=2376,
+ ["aivowelsigngujarati"]=2760,
+ ["akatakana"]=12450,
+ ["akatakanahalfwidth"]=65393,
+ ["akorean"]=12623,
+ ["alefarabic"]=1575,
+ ["alefdageshhebrew"]=64304,
+ ["aleffinalarabic"]=65166,
+ ["alefhamzaabovearabic"]=1571,
+ ["alefhamzaabovefinalarabic"]=65156,
+ ["alefhamzabelowarabic"]=1573,
+ ["alefhamzabelowfinalarabic"]=65160,
+ ["alefhebrew"]=1488,
+ ["aleflamedhebrew"]=64335,
+ ["alefmaddaabovearabic"]=1570,
+ ["alefmaddaabovefinalarabic"]=65154,
+ ["alefmaksuraarabic"]=1609,
+ ["alefmaksurafinalarabic"]=65264,
+ ["alefpatahhebrew"]=64302,
+ ["alefqamatshebrew"]=64303,
+ ["aleph"]=8501,
+ ["allequal"]=8780,
+ ["alpha"]=945,
+ ["alphatonos"]=940,
+ ["amacron"]=257,
+ ["amonospace"]=65345,
+ ["ampersand"]=38,
+ ["ampersandmonospace"]=65286,
+ ["amsquare"]=13250,
+ ["anbopomofo"]=12578,
+ ["angbopomofo"]=12580,
+ ["angkhankhuthai"]=3674,
+ ["angle"]=8736,
+ ["anglebracketleft"]=12296,
+ ["anglebracketleftvertical"]=65087,
+ ["anglebracketright"]=12297,
+ ["anglebracketrightvertical"]=65088,
+ ["angleleft"]=9001,
+ ["angleright"]=9002,
+ ["angstrom"]=8491,
+ ["anoteleia"]=903,
+ ["anudattadeva"]=2386,
+ ["anusvarabengali"]=2434,
+ ["anusvaradeva"]=2306,
+ ["anusvaragujarati"]=2690,
+ ["aogonek"]=261,
+ ["apaatosquare"]=13056,
+ ["aparen"]=9372,
+ ["apostrophearmenian"]=1370,
+ ["apostrophemod"]=700,
+ ["apple"]=63743,
+ ["approaches"]=8784,
+ ["approxequal"]=8776,
+ ["approxequalorimage"]=8786,
+ ["araeaekorean"]=12686,
+ ["araeakorean"]=12685,
+ ["arc"]=8978,
+ ["arighthalfring"]=7834,
+ ["aring"]=229,
+ ["aringacute"]=507,
+ ["aringbelow"]=7681,
+ ["arrowboth"]=8596,
+ ["arrowdashdown"]=8675,
+ ["arrowdashleft"]=8672,
+ ["arrowdashright"]=8674,
+ ["arrowdashup"]=8673,
+ ["arrowdbldown"]=8659,
+ ["arrowdblup"]=8657,
+ ["arrowdown"]=8595,
+ ["arrowdownleft"]=8601,
+ ["arrowdownright"]=8600,
+ ["arrowdownwhite"]=8681,
+ ["arrowheaddownmod"]=709,
+ ["arrowheadleftmod"]=706,
+ ["arrowheadrightmod"]=707,
+ ["arrowheadupmod"]=708,
+ ["arrowleft"]=8592,
+ ["arrowleftdbl"]=8656,
+ ["arrowleftdblstroke"]=8653,
+ ["arrowleftoverright"]=8646,
+ ["arrowleftwhite"]=8678,
+ ["arrowright"]=8594,
+ ["arrowrightdblstroke"]=8655,
+ ["arrowrightheavy"]=10142,
+ ["arrowrightoverleft"]=8644,
+ ["arrowrightwhite"]=8680,
+ ["arrowtableft"]=8676,
+ ["arrowtabright"]=8677,
+ ["arrowup"]=8593,
+ ["arrowupdn"]=8597,
+ ["arrowupdownbase"]=8616,
+ ["arrowupleft"]=8598,
+ ["arrowupleftofdown"]=8645,
+ ["arrowupright"]=8599,
+ ["arrowupwhite"]=8679,
+ ["asciicircum"]=94,
+ ["asciicircummonospace"]=65342,
+ ["asciitilde"]=126,
+ ["asciitildemonospace"]=65374,
+ ["ascript"]=593,
+ ["ascriptturned"]=594,
+ ["asmallhiragana"]=12353,
+ ["asmallkatakana"]=12449,
+ ["asmallkatakanahalfwidth"]=65383,
+ ["asterisk"]=42,
+ ["asteriskarabic"]=1645,
+ ["asteriskmath"]=8727,
+ ["asteriskmonospace"]=65290,
+ ["asterisksmall"]=65121,
+ ["asterism"]=8258,
+ ["asymptoticallyequal"]=8771,
+ ["at"]=64,
+ ["atilde"]=227,
+ ["atmonospace"]=65312,
+ ["atsmall"]=65131,
+ ["aturned"]=592,
+ ["aubengali"]=2452,
+ ["aubopomofo"]=12576,
+ ["audeva"]=2324,
+ ["augujarati"]=2708,
+ ["augurmukhi"]=2580,
+ ["aulengthmarkbengali"]=2519,
+ ["aumatragurmukhi"]=2636,
+ ["auvowelsignbengali"]=2508,
+ ["auvowelsigndeva"]=2380,
+ ["auvowelsigngujarati"]=2764,
+ ["avagrahadeva"]=2365,
+ ["aybarmenian"]=1377,
+ ["ayinaltonehebrew"]=64288,
+ ["ayinhebrew"]=1506,
+ ["b"]=98,
+ ["babengali"]=2476,
+ ["backslash"]=92,
+ ["backslashmonospace"]=65340,
+ ["badeva"]=2348,
+ ["bagujarati"]=2732,
+ ["bagurmukhi"]=2604,
+ ["bahiragana"]=12400,
+ ["bahtthai"]=3647,
+ ["bakatakana"]=12496,
+ ["barmonospace"]=65372,
+ ["bbopomofo"]=12549,
+ ["bcircle"]=9425,
+ ["bdotaccent"]=7683,
+ ["bdotbelow"]=7685,
+ ["beamedsixteenthnotes"]=9836,
+ ["because"]=8757,
+ ["becyrillic"]=1073,
+ ["beharabic"]=1576,
+ ["behfinalarabic"]=65168,
+ ["behinitialarabic"]=65169,
+ ["behiragana"]=12409,
+ ["behmedialarabic"]=65170,
+ ["behmeeminitialarabic"]=64671,
+ ["behmeemisolatedarabic"]=64520,
+ ["behnoonfinalarabic"]=64621,
+ ["bekatakana"]=12505,
+ ["benarmenian"]=1378,
+ ["beta"]=946,
+ ["betasymbolgreek"]=976,
+ ["betdageshhebrew"]=64305,
+ ["bethebrew"]=1489,
+ ["betrafehebrew"]=64332,
+ ["bhabengali"]=2477,
+ ["bhadeva"]=2349,
+ ["bhagujarati"]=2733,
+ ["bhagurmukhi"]=2605,
+ ["bhook"]=595,
+ ["bihiragana"]=12403,
+ ["bikatakana"]=12499,
+ ["bilabialclick"]=664,
+ ["bindigurmukhi"]=2562,
+ ["birusquare"]=13105,
+ ["blackcircle"]=9679,
+ ["blackdiamond"]=9670,
+ ["blackleftpointingtriangle"]=9664,
+ ["blacklenticularbracketleft"]=12304,
+ ["blacklenticularbracketleftvertical"]=65083,
+ ["blacklenticularbracketright"]=12305,
+ ["blacklenticularbracketrightvertical"]=65084,
+ ["blacklowerlefttriangle"]=9699,
+ ["blacklowerrighttriangle"]=9698,
+ ["blackrightpointingtriangle"]=9654,
+ ["blacksmallsquare"]=9642,
+ ["blackstar"]=9733,
+ ["blackupperlefttriangle"]=9700,
+ ["blackupperrighttriangle"]=9701,
+ ["blackuppointingsmalltriangle"]=9652,
+ ["blank"]=9251,
+ ["blinebelow"]=7687,
+ ["block"]=9608,
+ ["bmonospace"]=65346,
+ ["bobaimaithai"]=3610,
+ ["bohiragana"]=12412,
+ ["bokatakana"]=12508,
+ ["bparen"]=9373,
+ ["bqsquare"]=13251,
+ ["braceleft"]=123,
+ ["braceleftmonospace"]=65371,
+ ["braceleftsmall"]=65115,
+ ["braceleftvertical"]=65079,
+ ["braceright"]=125,
+ ["bracerightmonospace"]=65373,
+ ["bracerightsmall"]=65116,
+ ["bracerightvertical"]=65080,
+ ["bracketleft"]=91,
+ ["bracketleftmonospace"]=65339,
+ ["bracketright"]=93,
+ ["bracketrightmonospace"]=65341,
+ ["breve"]=728,
+ ["brevebelowcmb"]=814,
+ ["brevecmb"]=774,
+ ["breveinvertedbelowcmb"]=815,
+ ["breveinvertedcmb"]=785,
+ ["breveinverteddoublecmb"]=865,
+ ["bridgebelowcmb"]=810,
+ ["bridgeinvertedbelowcmb"]=826,
+ ["brokenbar"]=166,
+ ["bstroke"]=384,
+ ["btopbar"]=387,
+ ["buhiragana"]=12406,
+ ["bukatakana"]=12502,
+ ["bullet"]=8226,
+ ["bulletoperator"]=8729,
+ ["bullseye"]=9678,
+ ["c"]=99,
+ ["caarmenian"]=1390,
+ ["cabengali"]=2458,
+ ["cacute"]=263,
+ ["cadeva"]=2330,
+ ["cagujarati"]=2714,
+ ["cagurmukhi"]=2586,
+ ["calsquare"]=13192,
+ ["candrabindubengali"]=2433,
+ ["candrabinducmb"]=784,
+ ["candrabindudeva"]=2305,
+ ["candrabindugujarati"]=2689,
+ ["capslock"]=8682,
+ ["careof"]=8453,
+ ["caron"]=711,
+ ["caronbelowcmb"]=812,
+ ["caroncmb"]=780,
+ ["carriagereturn"]=8629,
+ ["cbopomofo"]=12568,
+ ["ccaron"]=269,
+ ["ccedilla"]=231,
+ ["ccedillaacute"]=7689,
+ ["ccircle"]=9426,
+ ["ccircumflex"]=265,
+ ["ccurl"]=597,
+ ["cdotaccent"]=267,
+ ["cdsquare"]=13253,
+ ["cedilla"]=184,
+ ["cedillacmb"]=807,
+ ["cent"]=162,
+ ["centigrade"]=8451,
+ ["centmonospace"]=65504,
+ ["chaarmenian"]=1401,
+ ["chabengali"]=2459,
+ ["chadeva"]=2331,
+ ["chagujarati"]=2715,
+ ["chagurmukhi"]=2587,
+ ["chbopomofo"]=12564,
+ ["cheabkhasiancyrillic"]=1213,
+ ["checkmark"]=10003,
+ ["checyrillic"]=1095,
+ ["chedescenderabkhasiancyrillic"]=1215,
+ ["chedescendercyrillic"]=1207,
+ ["chedieresiscyrillic"]=1269,
+ ["cheharmenian"]=1395,
+ ["chekhakassiancyrillic"]=1228,
+ ["cheverticalstrokecyrillic"]=1209,
+ ["chi"]=967,
+ ["chieuchacirclekorean"]=12919,
+ ["chieuchaparenkorean"]=12823,
+ ["chieuchcirclekorean"]=12905,
+ ["chieuchkorean"]=12618,
+ ["chieuchparenkorean"]=12809,
+ ["chochangthai"]=3594,
+ ["chochanthai"]=3592,
+ ["chochingthai"]=3593,
+ ["chochoethai"]=3596,
+ ["chook"]=392,
+ ["cieucacirclekorean"]=12918,
+ ["cieucaparenkorean"]=12822,
+ ["cieuccirclekorean"]=12904,
+ ["cieuckorean"]=12616,
+ ["cieucparenkorean"]=12808,
+ ["cieucuparenkorean"]=12828,
+ ["circleot"]=8857,
+ ["circlepostalmark"]=12342,
+ ["circlewithlefthalfblack"]=9680,
+ ["circlewithrighthalfblack"]=9681,
+ ["circumflex"]=710,
+ ["circumflexbelowcmb"]=813,
+ ["circumflexcmb"]=770,
+ ["clear"]=8999,
+ ["clickalveolar"]=450,
+ ["clickdental"]=448,
+ ["clicklateral"]=449,
+ ["clickretroflex"]=451,
+ ["clubsuitblack"]=9827,
+ ["clubsuitwhite"]=9831,
+ ["cmcubedsquare"]=13220,
+ ["cmonospace"]=65347,
+ ["cmsquaredsquare"]=13216,
+ ["coarmenian"]=1409,
+ ["colon"]=58,
+ ["colonmonospace"]=65306,
+ ["colonsign"]=8353,
+ ["colonsmall"]=65109,
+ ["colontriangularhalfmod"]=721,
+ ["colontriangularmod"]=720,
+ ["comma"]=44,
+ ["commaabovecmb"]=787,
+ ["commaaboverightcmb"]=789,
+ ["commaarabic"]=1548,
+ ["commaarmenian"]=1373,
+ ["commamonospace"]=65292,
+ ["commareversedabovecmb"]=788,
+ ["commareversedmod"]=701,
+ ["commasmall"]=65104,
+ ["commaturnedabovecmb"]=786,
+ ["commaturnedmod"]=699,
+ ["congruent"]=8773,
+ ["contourintegral"]=8750,
+ ["control"]=8963,
+ ["controlACK"]=6,
+ ["controlBEL"]=7,
+ ["controlBS"]=8,
+ ["controlCAN"]=24,
+ ["controlCR"]=13,
+ ["controlDC1"]=17,
+ ["controlDC2"]=18,
+ ["controlDC3"]=19,
+ ["controlDC4"]=20,
+ ["controlDEL"]=127,
+ ["controlDLE"]=16,
+ ["controlEM"]=25,
+ ["controlENQ"]=5,
+ ["controlEOT"]=4,
+ ["controlESC"]=27,
+ ["controlETB"]=23,
+ ["controlETX"]=3,
+ ["controlFF"]=12,
+ ["controlFS"]=28,
+ ["controlGS"]=29,
+ ["controlHT"]=9,
+ ["controlLF"]=10,
+ ["controlNAK"]=21,
+ ["controlRS"]=30,
+ ["controlSI"]=15,
+ ["controlSO"]=14,
+ ["controlSOT"]=2,
+ ["controlSTX"]=1,
+ ["controlSUB"]=26,
+ ["controlSYN"]=22,
+ ["controlUS"]=31,
+ ["controlVT"]=11,
+ ["copyright"]=169,
+ ["cornerbracketleft"]=12300,
+ ["cornerbracketlefthalfwidth"]=65378,
+ ["cornerbracketleftvertical"]=65089,
+ ["cornerbracketright"]=12301,
+ ["cornerbracketrighthalfwidth"]=65379,
+ ["cornerbracketrightvertical"]=65090,
+ ["corporationsquare"]=13183,
+ ["cosquare"]=13255,
+ ["coverkgsquare"]=13254,
+ ["cparen"]=9374,
+ ["cruzeiro"]=8354,
+ ["cstretched"]=663,
+ ["curlyand"]=8911,
+ ["curlyor"]=8910,
+ ["currency"]=164,
+ ["d"]=100,
+ ["daarmenian"]=1380,
+ ["dabengali"]=2470,
+ ["dadarabic"]=1590,
+ ["dadeva"]=2342,
+ ["dadfinalarabic"]=65214,
+ ["dadinitialarabic"]=65215,
+ ["dadmedialarabic"]=65216,
+ ["dageshhebrew"]=1468,
+ ["dagger"]=8224,
+ ["daggerdbl"]=8225,
+ ["dagujarati"]=2726,
+ ["dagurmukhi"]=2598,
+ ["dahiragana"]=12384,
+ ["dakatakana"]=12480,
+ ["dalarabic"]=1583,
+ ["daletdageshhebrew"]=64307,
+ ["dalettserehebrew"]=1491,
+ ["dalfinalarabic"]=65194,
+ ["dammalowarabic"]=1615,
+ ["dammatanarabic"]=1612,
+ ["danda"]=2404,
+ ["dargalefthebrew"]=1447,
+ ["dasiapneumatacyrilliccmb"]=1157,
+ ["dblanglebracketleft"]=12298,
+ ["dblanglebracketleftvertical"]=65085,
+ ["dblanglebracketright"]=12299,
+ ["dblanglebracketrightvertical"]=65086,
+ ["dblarchinvertedbelowcmb"]=811,
+ ["dblarrowleft"]=8660,
+ ["dblarrowright"]=8658,
+ ["dbldanda"]=2405,
+ ["dblgravecmb"]=783,
+ ["dblintegral"]=8748,
+ ["dbllowlinecmb"]=819,
+ ["dbloverlinecmb"]=831,
+ ["dblprimemod"]=698,
+ ["dblverticalbar"]=8214,
+ ["dblverticallineabovecmb"]=782,
+ ["dbopomofo"]=12553,
+ ["dbsquare"]=13256,
+ ["dcaron"]=271,
+ ["dcedilla"]=7697,
+ ["dcircle"]=9427,
+ ["dcircumflexbelow"]=7699,
+ ["ddabengali"]=2465,
+ ["ddadeva"]=2337,
+ ["ddagujarati"]=2721,
+ ["ddagurmukhi"]=2593,
+ ["ddalarabic"]=1672,
+ ["ddalfinalarabic"]=64393,
+ ["dddhadeva"]=2396,
+ ["ddhabengali"]=2466,
+ ["ddhadeva"]=2338,
+ ["ddhagujarati"]=2722,
+ ["ddhagurmukhi"]=2594,
+ ["ddotaccent"]=7691,
+ ["ddotbelow"]=7693,
+ ["decimalseparatorpersian"]=1643,
+ ["decyrillic"]=1076,
+ ["degree"]=176,
+ ["dehihebrew"]=1453,
+ ["dehiragana"]=12391,
+ ["deicoptic"]=1007,
+ ["dekatakana"]=12487,
+ ["deleteleft"]=9003,
+ ["deleteright"]=8998,
+ ["delta"]=948,
+ ["deltaturned"]=397,
+ ["denominatorminusonenumeratorbengali"]=2552,
+ ["dezh"]=676,
+ ["dhabengali"]=2471,
+ ["dhadeva"]=2343,
+ ["dhagujarati"]=2727,
+ ["dhagurmukhi"]=2599,
+ ["dhook"]=599,
+ ["dialytikatonoscmb"]=836,
+ ["diamond"]=9830,
+ ["diamondsuitwhite"]=9826,
+ ["dieresis"]=168,
+ ["dieresisbelowcmb"]=804,
+ ["dieresiscmb"]=776,
+ ["dieresistonos"]=901,
+ ["dihiragana"]=12386,
+ ["dikatakana"]=12482,
+ ["dittomark"]=12291,
+ ["divide"]=247,
+ ["divides"]=8739,
+ ["divisionslash"]=8725,
+ ["djecyrillic"]=1106,
+ ["dlinebelow"]=7695,
+ ["dlsquare"]=13207,
+ ["dmacron"]=273,
+ ["dmonospace"]=65348,
+ ["dnblock"]=9604,
+ ["dochadathai"]=3598,
+ ["dodekthai"]=3604,
+ ["dohiragana"]=12393,
+ ["dokatakana"]=12489,
+ ["dollar"]=36,
+ ["dollarmonospace"]=65284,
+ ["dollarsmall"]=65129,
+ ["dong"]=8363,
+ ["dorusquare"]=13094,
+ ["dotaccent"]=729,
+ ["dotaccentcmb"]=775,
+ ["dotbelowcomb"]=803,
+ ["dotkatakana"]=12539,
+ ["dotlessi"]=305,
+ ["dotlessjstrokehook"]=644,
+ ["dotmath"]=8901,
+ ["dottedcircle"]=9676,
+ ["downtackbelowcmb"]=798,
+ ["downtackmod"]=725,
+ ["dparen"]=9375,
+ ["dtail"]=598,
+ ["dtopbar"]=396,
+ ["duhiragana"]=12389,
+ ["dukatakana"]=12485,
+ ["dz"]=499,
+ ["dzaltone"]=675,
+ ["dzcaron"]=454,
+ ["dzcurl"]=677,
+ ["dzeabkhasiancyrillic"]=1249,
+ ["dzecyrillic"]=1109,
+ ["dzhecyrillic"]=1119,
+ ["e"]=101,
+ ["eacute"]=233,
+ ["earth"]=9793,
+ ["ebengali"]=2447,
+ ["ebopomofo"]=12572,
+ ["ebreve"]=277,
+ ["ecandradeva"]=2317,
+ ["ecandragujarati"]=2701,
+ ["ecandravowelsigndeva"]=2373,
+ ["ecandravowelsigngujarati"]=2757,
+ ["ecaron"]=283,
+ ["ecedillabreve"]=7709,
+ ["echarmenian"]=1381,
+ ["echyiwnarmenian"]=1415,
+ ["ecircle"]=9428,
+ ["ecircumflex"]=234,
+ ["ecircumflexacute"]=7871,
+ ["ecircumflexbelow"]=7705,
+ ["ecircumflexdotbelow"]=7879,
+ ["ecircumflexgrave"]=7873,
+ ["ecircumflexhookabove"]=7875,
+ ["ecircumflextilde"]=7877,
+ ["ecyrillic"]=1108,
+ ["edblgrave"]=517,
+ ["edeva"]=2319,
+ ["edieresis"]=235,
+ ["edotaccent"]=279,
+ ["edotbelow"]=7865,
+ ["eegurmukhi"]=2575,
+ ["eematragurmukhi"]=2631,
+ ["efcyrillic"]=1092,
+ ["egrave"]=232,
+ ["egujarati"]=2703,
+ ["eharmenian"]=1383,
+ ["ehbopomofo"]=12573,
+ ["ehiragana"]=12360,
+ ["ehookabove"]=7867,
+ ["eibopomofo"]=12575,
+ ["eight"]=56,
+ ["eightbengali"]=2542,
+ ["eightcircle"]=9319,
+ ["eightcircleinversesansserif"]=10129,
+ ["eightdeva"]=2414,
+ ["eighteencircle"]=9329,
+ ["eighteenparen"]=9349,
+ ["eighteenperiod"]=9369,
+ ["eightgujarati"]=2798,
+ ["eightgurmukhi"]=2670,
+ ["eighthackarabic"]=1640,
+ ["eighthangzhou"]=12328,
+ ["eightideographicparen"]=12839,
+ ["eightinferior"]=8328,
+ ["eightmonospace"]=65304,
+ ["eightparen"]=9339,
+ ["eightperiod"]=9359,
+ ["eightpersian"]=1784,
+ ["eightroman"]=8567,
+ ["eightsuperior"]=8312,
+ ["eightthai"]=3672,
+ ["einvertedbreve"]=519,
+ ["eiotifiedcyrillic"]=1125,
+ ["ekatakana"]=12456,
+ ["ekatakanahalfwidth"]=65396,
+ ["ekonkargurmukhi"]=2676,
+ ["ekorean"]=12628,
+ ["elcyrillic"]=1083,
+ ["element"]=8712,
+ ["elevencircle"]=9322,
+ ["elevenparen"]=9342,
+ ["elevenperiod"]=9362,
+ ["elevenroman"]=8570,
+ ["ellipsis"]=8230,
+ ["ellipsisvertical"]=8942,
+ ["emacron"]=275,
+ ["emacronacute"]=7703,
+ ["emacrongrave"]=7701,
+ ["emcyrillic"]=1084,
+ ["emdash"]=8212,
+ ["emdashvertical"]=65073,
+ ["emonospace"]=65349,
+ ["emphasismarkarmenian"]=1371,
+ ["emptyset"]=8709,
+ ["enbopomofo"]=12579,
+ ["encyrillic"]=1085,
+ ["endash"]=8211,
+ ["endashvertical"]=65074,
+ ["endescendercyrillic"]=1187,
+ ["eng"]=331,
+ ["engbopomofo"]=12581,
+ ["enghecyrillic"]=1189,
+ ["enhookcyrillic"]=1224,
+ ["enspace"]=8194,
+ ["eogonek"]=281,
+ ["eokorean"]=12627,
+ ["eopen"]=603,
+ ["eopenclosed"]=666,
+ ["eopenreversed"]=604,
+ ["eopenreversedclosed"]=606,
+ ["eopenreversedhook"]=605,
+ ["eparen"]=9376,
+ ["epsilon"]=949,
+ ["epsilontonos"]=941,
+ ["equal"]=61,
+ ["equalmonospace"]=65309,
+ ["equalsmall"]=65126,
+ ["equalsuperior"]=8316,
+ ["equivalence"]=8801,
+ ["erbopomofo"]=12582,
+ ["ercyrillic"]=1088,
+ ["ereversed"]=600,
+ ["ereversedcyrillic"]=1101,
+ ["escyrillic"]=1089,
+ ["esdescendercyrillic"]=1195,
+ ["esh"]=643,
+ ["eshcurl"]=646,
+ ["eshortdeva"]=2318,
+ ["eshortvowelsigndeva"]=2374,
+ ["eshreversedloop"]=426,
+ ["eshsquatreversed"]=645,
+ ["esmallhiragana"]=12359,
+ ["esmallkatakana"]=12455,
+ ["esmallkatakanahalfwidth"]=65386,
+ ["estimated"]=8494,
+ ["eta"]=951,
+ ["etarmenian"]=1384,
+ ["etatonos"]=942,
+ ["eth"]=240,
+ ["etilde"]=7869,
+ ["etildebelow"]=7707,
+ ["etnahtalefthebrew"]=1425,
+ ["eturned"]=477,
+ ["eukorean"]=12641,
+ ["euro"]=8364,
+ ["evowelsignbengali"]=2503,
+ ["evowelsigndeva"]=2375,
+ ["evowelsigngujarati"]=2759,
+ ["exclam"]=33,
+ ["exclamarmenian"]=1372,
+ ["exclamdbl"]=8252,
+ ["exclamdown"]=161,
+ ["exclammonospace"]=65281,
+ ["ezh"]=658,
+ ["ezhcaron"]=495,
+ ["ezhcurl"]=659,
+ ["ezhreversed"]=441,
+ ["ezhtail"]=442,
+ ["f"]=102,
+ ["fadeva"]=2398,
+ ["fagurmukhi"]=2654,
+ ["fahrenheit"]=8457,
+ ["fathalowarabic"]=1614,
+ ["fathatanarabic"]=1611,
+ ["fbopomofo"]=12552,
+ ["fcircle"]=9429,
+ ["fdotaccent"]=7711,
+ ["feharabic"]=1601,
+ ["feharmenian"]=1414,
+ ["fehfinalarabic"]=65234,
+ ["fehinitialarabic"]=65235,
+ ["fehmedialarabic"]=65236,
+ ["feicoptic"]=997,
+ ["ff"]=64256,
+ ["ffi"]=64259,
+ ["ffl"]=64260,
+ ["fi"]=64257,
+ ["fifteencircle"]=9326,
+ ["fifteenparen"]=9346,
+ ["fifteenperiod"]=9366,
+ ["figuredash"]=8210,
+ ["filledbox"]=9632,
+ ["filledrect"]=9644,
+ ["finalkafdageshhebrew"]=64314,
+ ["finalkafshevahebrew"]=1498,
+ ["finalmemhebrew"]=1501,
+ ["finalnunhebrew"]=1503,
+ ["finalpehebrew"]=1507,
+ ["finaltsadihebrew"]=1509,
+ ["firsttonechinese"]=713,
+ ["fisheye"]=9673,
+ ["fitacyrillic"]=1139,
+ ["five"]=53,
+ ["fivebengali"]=2539,
+ ["fivecircle"]=9316,
+ ["fivecircleinversesansserif"]=10126,
+ ["fivedeva"]=2411,
+ ["fiveeighths"]=8541,
+ ["fivegujarati"]=2795,
+ ["fivegurmukhi"]=2667,
+ ["fivehackarabic"]=1637,
+ ["fivehangzhou"]=12325,
+ ["fiveideographicparen"]=12836,
+ ["fiveinferior"]=8325,
+ ["fivemonospace"]=65301,
+ ["fiveparen"]=9336,
+ ["fiveperiod"]=9356,
+ ["fivepersian"]=1781,
+ ["fiveroman"]=8564,
+ ["fivesuperior"]=8309,
+ ["fivethai"]=3669,
+ ["fl"]=64258,
+ ["florin"]=402,
+ ["fmonospace"]=65350,
+ ["fmsquare"]=13209,
+ ["fofanthai"]=3615,
+ ["fofathai"]=3613,
+ ["fongmanthai"]=3663,
+ ["four"]=52,
+ ["fourbengali"]=2538,
+ ["fourcircle"]=9315,
+ ["fourcircleinversesansserif"]=10125,
+ ["fourdeva"]=2410,
+ ["fourgujarati"]=2794,
+ ["fourgurmukhi"]=2666,
+ ["fourhackarabic"]=1636,
+ ["fourhangzhou"]=12324,
+ ["fourideographicparen"]=12835,
+ ["fourinferior"]=8324,
+ ["fourmonospace"]=65300,
+ ["fournumeratorbengali"]=2551,
+ ["fourparen"]=9335,
+ ["fourperiod"]=9355,
+ ["fourpersian"]=1780,
+ ["fourroman"]=8563,
+ ["foursuperior"]=8308,
+ ["fourteencircle"]=9325,
+ ["fourteenparen"]=9345,
+ ["fourteenperiod"]=9365,
+ ["fourthai"]=3668,
+ ["fourthtonechinese"]=715,
+ ["fparen"]=9377,
+ ["fraction"]=8260,
+ ["franc"]=8355,
+ ["g"]=103,
+ ["gabengali"]=2455,
+ ["gacute"]=501,
+ ["gadeva"]=2327,
+ ["gafarabic"]=1711,
+ ["gaffinalarabic"]=64403,
+ ["gafinitialarabic"]=64404,
+ ["gafmedialarabic"]=64405,
+ ["gagujarati"]=2711,
+ ["gagurmukhi"]=2583,
+ ["gahiragana"]=12364,
+ ["gakatakana"]=12460,
+ ["gamma"]=947,
+ ["gammalatinsmall"]=611,
+ ["gammasuperior"]=736,
+ ["gangiacoptic"]=1003,
+ ["gbopomofo"]=12557,
+ ["gbreve"]=287,
+ ["gcaron"]=487,
+ ["gcircle"]=9430,
+ ["gcircumflex"]=285,
+ ["gcommaaccent"]=291,
+ ["gdotaccent"]=289,
+ ["gecyrillic"]=1075,
+ ["gehiragana"]=12370,
+ ["gekatakana"]=12466,
+ ["geometricallyequal"]=8785,
+ ["gereshaccenthebrew"]=1436,
+ ["gereshhebrew"]=1523,
+ ["gereshmuqdamhebrew"]=1437,
+ ["germandbls"]=223,
+ ["gershayimaccenthebrew"]=1438,
+ ["gershayimhebrew"]=1524,
+ ["getamark"]=12307,
+ ["ghabengali"]=2456,
+ ["ghadarmenian"]=1394,
+ ["ghadeva"]=2328,
+ ["ghagujarati"]=2712,
+ ["ghagurmukhi"]=2584,
+ ["ghainarabic"]=1594,
+ ["ghainfinalarabic"]=65230,
+ ["ghaininitialarabic"]=65231,
+ ["ghainmedialarabic"]=65232,
+ ["ghemiddlehookcyrillic"]=1173,
+ ["ghestrokecyrillic"]=1171,
+ ["gheupturncyrillic"]=1169,
+ ["ghhadeva"]=2394,
+ ["ghhagurmukhi"]=2650,
+ ["ghook"]=608,
+ ["ghzsquare"]=13203,
+ ["gihiragana"]=12366,
+ ["gikatakana"]=12462,
+ ["gimarmenian"]=1379,
+ ["gimeldageshhebrew"]=64306,
+ ["gimelhebrew"]=1490,
+ ["gjecyrillic"]=1107,
+ ["glottalinvertedstroke"]=446,
+ ["glottalstop"]=660,
+ ["glottalstopinverted"]=662,
+ ["glottalstopmod"]=704,
+ ["glottalstopreversed"]=661,
+ ["glottalstopreversedmod"]=705,
+ ["glottalstopreversedsuperior"]=740,
+ ["glottalstopstroke"]=673,
+ ["glottalstopstrokereversed"]=674,
+ ["gmacron"]=7713,
+ ["gmonospace"]=65351,
+ ["gohiragana"]=12372,
+ ["gokatakana"]=12468,
+ ["gparen"]=9378,
+ ["gpasquare"]=13228,
+ ["grave"]=96,
+ ["gravebelowcmb"]=790,
+ ["gravecomb"]=768,
+ ["gravedeva"]=2387,
+ ["gravelowmod"]=718,
+ ["gravemonospace"]=65344,
+ ["gravetonecmb"]=832,
+ ["greater"]=62,
+ ["greaterequal"]=8805,
+ ["greaterequalorless"]=8923,
+ ["greatermonospace"]=65310,
+ ["greaterorequivalent"]=8819,
+ ["greaterorless"]=8823,
+ ["greateroverequal"]=8807,
+ ["greatersmall"]=65125,
+ ["gscript"]=609,
+ ["gstroke"]=485,
+ ["guhiragana"]=12368,
+ ["guillemotleft"]=171,
+ ["guillemotright"]=187,
+ ["guilsinglleft"]=8249,
+ ["guilsinglright"]=8250,
+ ["gukatakana"]=12464,
+ ["guramusquare"]=13080,
+ ["gysquare"]=13257,
+ ["h"]=104,
+ ["haabkhasiancyrillic"]=1193,
+ ["habengali"]=2489,
+ ["hadescendercyrillic"]=1203,
+ ["hadeva"]=2361,
+ ["hagujarati"]=2745,
+ ["hagurmukhi"]=2617,
+ ["haharabic"]=1581,
+ ["hahfinalarabic"]=65186,
+ ["hahinitialarabic"]=65187,
+ ["hahiragana"]=12399,
+ ["hahmedialarabic"]=65188,
+ ["haitusquare"]=13098,
+ ["hakatakana"]=12495,
+ ["hakatakanahalfwidth"]=65418,
+ ["halantgurmukhi"]=2637,
+ ["hamzasukunarabic"]=1569,
+ ["hangulfiller"]=12644,
+ ["hardsigncyrillic"]=1098,
+ ["harpoonleftbarbup"]=8636,
+ ["harpoonrightbarbup"]=8640,
+ ["hasquare"]=13258,
+ ["hatafpatahwidehebrew"]=1458,
+ ["hatafqamatswidehebrew"]=1459,
+ ["hatafsegolwidehebrew"]=1457,
+ ["hbar"]=295,
+ ["hbopomofo"]=12559,
+ ["hbrevebelow"]=7723,
+ ["hcedilla"]=7721,
+ ["hcircle"]=9431,
+ ["hcircumflex"]=293,
+ ["hdieresis"]=7719,
+ ["hdotaccent"]=7715,
+ ["hdotbelow"]=7717,
+ ["heartsuitblack"]=9829,
+ ["heartsuitwhite"]=9825,
+ ["hedageshhebrew"]=64308,
+ ["hehaltonearabic"]=1729,
+ ["heharabic"]=1607,
+ ["hehebrew"]=1492,
+ ["hehfinalaltonearabic"]=64423,
+ ["hehfinalarabic"]=65258,
+ ["hehhamzaabovefinalarabic"]=64421,
+ ["hehhamzaaboveisolatedarabic"]=64420,
+ ["hehinitialaltonearabic"]=64424,
+ ["hehinitialarabic"]=65259,
+ ["hehiragana"]=12408,
+ ["hehmedialaltonearabic"]=64425,
+ ["hehmedialarabic"]=65260,
+ ["heiseierasquare"]=13179,
+ ["hekatakana"]=12504,
+ ["hekatakanahalfwidth"]=65421,
+ ["hekutaarusquare"]=13110,
+ ["henghook"]=615,
+ ["herutusquare"]=13113,
+ ["hethebrew"]=1495,
+ ["hhook"]=614,
+ ["hhooksuperior"]=689,
+ ["hieuhacirclekorean"]=12923,
+ ["hieuhaparenkorean"]=12827,
+ ["hieuhcirclekorean"]=12909,
+ ["hieuhkorean"]=12622,
+ ["hieuhparenkorean"]=12813,
+ ["hihiragana"]=12402,
+ ["hikatakana"]=12498,
+ ["hikatakanahalfwidth"]=65419,
+ ["hiriqwidehebrew"]=1460,
+ ["hlinebelow"]=7830,
+ ["hmonospace"]=65352,
+ ["hoarmenian"]=1392,
+ ["hohipthai"]=3627,
+ ["hohiragana"]=12411,
+ ["hokatakana"]=12507,
+ ["hokatakanahalfwidth"]=65422,
+ ["holamwidehebrew"]=1465,
+ ["honokhukthai"]=3630,
+ ["hookcmb"]=777,
+ ["hookpalatalizedbelowcmb"]=801,
+ ["hookretroflexbelowcmb"]=802,
+ ["hoonsquare"]=13122,
+ ["horicoptic"]=1001,
+ ["horizontalbar"]=8213,
+ ["horncmb"]=795,
+ ["hotsprings"]=9832,
+ ["house"]=8962,
+ ["hparen"]=9379,
+ ["hsuperior"]=688,
+ ["hturned"]=613,
+ ["huhiragana"]=12405,
+ ["huiitosquare"]=13107,
+ ["hukatakana"]=12501,
+ ["hukatakanahalfwidth"]=65420,
+ ["hungarumlaut"]=733,
+ ["hungarumlautcmb"]=779,
+ ["hv"]=405,
+ ["hyphen"]=45,
+ ["hyphenmonospace"]=65293,
+ ["hyphensmall"]=65123,
+ ["hyphentwo"]=8208,
+ ["i"]=105,
+ ["iacute"]=237,
+ ["iacyrillic"]=1103,
+ ["ibengali"]=2439,
+ ["ibopomofo"]=12583,
+ ["ibreve"]=301,
+ ["icaron"]=464,
+ ["icircle"]=9432,
+ ["icircumflex"]=238,
+ ["icyrillic"]=1110,
+ ["idblgrave"]=521,
+ ["ideographearthcircle"]=12943,
+ ["ideographfirecircle"]=12939,
+ ["ideographicallianceparen"]=12863,
+ ["ideographiccallparen"]=12858,
+ ["ideographiccentrecircle"]=12965,
+ ["ideographicclose"]=12294,
+ ["ideographiccomma"]=12289,
+ ["ideographiccommaleft"]=65380,
+ ["ideographiccongratulationparen"]=12855,
+ ["ideographiccorrectcircle"]=12963,
+ ["ideographicearthparen"]=12847,
+ ["ideographicenterpriseparen"]=12861,
+ ["ideographicexcellentcircle"]=12957,
+ ["ideographicfestivalparen"]=12864,
+ ["ideographicfinancialcircle"]=12950,
+ ["ideographicfinancialparen"]=12854,
+ ["ideographicfireparen"]=12843,
+ ["ideographichaveparen"]=12850,
+ ["ideographichighcircle"]=12964,
+ ["ideographiciterationmark"]=12293,
+ ["ideographiclaborcircle"]=12952,
+ ["ideographiclaborparen"]=12856,
+ ["ideographicleftcircle"]=12967,
+ ["ideographiclowcircle"]=12966,
+ ["ideographicmedicinecircle"]=12969,
+ ["ideographicmetalparen"]=12846,
+ ["ideographicmoonparen"]=12842,
+ ["ideographicnameparen"]=12852,
+ ["ideographicperiod"]=12290,
+ ["ideographicprintcircle"]=12958,
+ ["ideographicreachparen"]=12867,
+ ["ideographicrepresentparen"]=12857,
+ ["ideographicresourceparen"]=12862,
+ ["ideographicrightcircle"]=12968,
+ ["ideographicsecretcircle"]=12953,
+ ["ideographicselfparen"]=12866,
+ ["ideographicsocietyparen"]=12851,
+ ["ideographicspace"]=12288,
+ ["ideographicspecialparen"]=12853,
+ ["ideographicstockparen"]=12849,
+ ["ideographicstudyparen"]=12859,
+ ["ideographicsunparen"]=12848,
+ ["ideographicsuperviseparen"]=12860,
+ ["ideographicwaterparen"]=12844,
+ ["ideographicwoodparen"]=12845,
+ ["ideographiczero"]=12295,
+ ["ideographmetalcircle"]=12942,
+ ["ideographmooncircle"]=12938,
+ ["ideographnamecircle"]=12948,
+ ["ideographsuncircle"]=12944,
+ ["ideographwatercircle"]=12940,
+ ["ideographwoodcircle"]=12941,
+ ["ideva"]=2311,
+ ["idieresis"]=239,
+ ["idieresisacute"]=7727,
+ ["idieresiscyrillic"]=1253,
+ ["idotbelow"]=7883,
+ ["iebrevecyrillic"]=1239,
+ ["iecyrillic"]=1077,
+ ["ieungacirclekorean"]=12917,
+ ["ieungaparenkorean"]=12821,
+ ["ieungcirclekorean"]=12903,
+ ["ieungkorean"]=12615,
+ ["ieungparenkorean"]=12807,
+ ["igrave"]=236,
+ ["igujarati"]=2695,
+ ["igurmukhi"]=2567,
+ ["ihiragana"]=12356,
+ ["ihookabove"]=7881,
+ ["iibengali"]=2440,
+ ["iicyrillic"]=1080,
+ ["iideva"]=2312,
+ ["iigujarati"]=2696,
+ ["iigurmukhi"]=2568,
+ ["iimatragurmukhi"]=2624,
+ ["iinvertedbreve"]=523,
+ ["iishortcyrillic"]=1081,
+ ["iivowelsignbengali"]=2496,
+ ["iivowelsigndeva"]=2368,
+ ["iivowelsigngujarati"]=2752,
+ ["ij"]=307,
+ ["ikatakana"]=12452,
+ ["ikatakanahalfwidth"]=65394,
+ ["ikorean"]=12643,
+ ["iluyhebrew"]=1452,
+ ["imacron"]=299,
+ ["imacroncyrillic"]=1251,
+ ["imageorapproximatelyequal"]=8787,
+ ["imatragurmukhi"]=2623,
+ ["imonospace"]=65353,
+ ["increment"]=8710,
+ ["infinity"]=8734,
+ ["iniarmenian"]=1387,
+ ["integral"]=8747,
+ ["integralbt"]=8993,
+ ["integraltp"]=8992,
+ ["intersection"]=8745,
+ ["intisquare"]=13061,
+ ["invbullet"]=9688,
+ ["invsmileface"]=9787,
+ ["iocyrillic"]=1105,
+ ["iogonek"]=303,
+ ["iota"]=953,
+ ["iotadieresis"]=970,
+ ["iotadieresistonos"]=912,
+ ["iotalatin"]=617,
+ ["iotatonos"]=943,
+ ["iparen"]=9380,
+ ["irigurmukhi"]=2674,
+ ["ismallhiragana"]=12355,
+ ["ismallkatakana"]=12451,
+ ["ismallkatakanahalfwidth"]=65384,
+ ["issharbengali"]=2554,
+ ["istroke"]=616,
+ ["iterationhiragana"]=12445,
+ ["iterationkatakana"]=12541,
+ ["itilde"]=297,
+ ["itildebelow"]=7725,
+ ["iubopomofo"]=12585,
+ ["iucyrillic"]=1102,
+ ["ivowelsignbengali"]=2495,
+ ["ivowelsigndeva"]=2367,
+ ["ivowelsigngujarati"]=2751,
+ ["izhitsacyrillic"]=1141,
+ ["izhitsadblgravecyrillic"]=1143,
+ ["j"]=106,
+ ["jaarmenian"]=1393,
+ ["jabengali"]=2460,
+ ["jadeva"]=2332,
+ ["jagujarati"]=2716,
+ ["jagurmukhi"]=2588,
+ ["jbopomofo"]=12560,
+ ["jcaron"]=496,
+ ["jcircle"]=9433,
+ ["jcircumflex"]=309,
+ ["jcrossedtail"]=669,
+ ["jdotlessstroke"]=607,
+ ["jecyrillic"]=1112,
+ ["jeemarabic"]=1580,
+ ["jeemfinalarabic"]=65182,
+ ["jeeminitialarabic"]=65183,
+ ["jeemmedialarabic"]=65184,
+ ["jeharabic"]=1688,
+ ["jehfinalarabic"]=64395,
+ ["jhabengali"]=2461,
+ ["jhadeva"]=2333,
+ ["jhagujarati"]=2717,
+ ["jhagurmukhi"]=2589,
+ ["jheharmenian"]=1403,
+ ["jis"]=12292,
+ ["jmonospace"]=65354,
+ ["jparen"]=9381,
+ ["jsuperior"]=690,
+ ["k"]=107,
+ ["kabashkircyrillic"]=1185,
+ ["kabengali"]=2453,
+ ["kacute"]=7729,
+ ["kacyrillic"]=1082,
+ ["kadescendercyrillic"]=1179,
+ ["kadeva"]=2325,
+ ["kafarabic"]=1603,
+ ["kafdageshhebrew"]=64315,
+ ["kaffinalarabic"]=65242,
+ ["kafhebrew"]=1499,
+ ["kafinitialarabic"]=65243,
+ ["kafmedialarabic"]=65244,
+ ["kafrafehebrew"]=64333,
+ ["kagujarati"]=2709,
+ ["kagurmukhi"]=2581,
+ ["kahiragana"]=12363,
+ ["kahookcyrillic"]=1220,
+ ["kakatakana"]=12459,
+ ["kakatakanahalfwidth"]=65398,
+ ["kappa"]=954,
+ ["kappasymbolgreek"]=1008,
+ ["kapyeounmieumkorean"]=12657,
+ ["kapyeounphieuphkorean"]=12676,
+ ["kapyeounpieupkorean"]=12664,
+ ["kapyeounssangpieupkorean"]=12665,
+ ["karoriisquare"]=13069,
+ ["kasmallkatakana"]=12533,
+ ["kasquare"]=13188,
+ ["kasraarabic"]=1616,
+ ["kasratanarabic"]=1613,
+ ["kastrokecyrillic"]=1183,
+ ["katahiraprolongmarkhalfwidth"]=65392,
+ ["kaverticalstrokecyrillic"]=1181,
+ ["kbopomofo"]=12558,
+ ["kcalsquare"]=13193,
+ ["kcaron"]=489,
+ ["kcircle"]=9434,
+ ["kcommaaccent"]=311,
+ ["kdotbelow"]=7731,
+ ["keharmenian"]=1412,
+ ["kehiragana"]=12369,
+ ["kekatakana"]=12465,
+ ["kekatakanahalfwidth"]=65401,
+ ["kenarmenian"]=1391,
+ ["kesmallkatakana"]=12534,
+ ["kgreenlandic"]=312,
+ ["khabengali"]=2454,
+ ["khacyrillic"]=1093,
+ ["khadeva"]=2326,
+ ["khagujarati"]=2710,
+ ["khagurmukhi"]=2582,
+ ["khaharabic"]=1582,
+ ["khahfinalarabic"]=65190,
+ ["khahinitialarabic"]=65191,
+ ["khahmedialarabic"]=65192,
+ ["kheicoptic"]=999,
+ ["khhadeva"]=2393,
+ ["khhagurmukhi"]=2649,
+ ["khieukhacirclekorean"]=12920,
+ ["khieukhaparenkorean"]=12824,
+ ["khieukhcirclekorean"]=12906,
+ ["khieukhkorean"]=12619,
+ ["khieukhparenkorean"]=12810,
+ ["khokhaithai"]=3586,
+ ["khokhonthai"]=3589,
+ ["khokhuatthai"]=3587,
+ ["khokhwaithai"]=3588,
+ ["khomutthai"]=3675,
+ ["khook"]=409,
+ ["khorakhangthai"]=3590,
+ ["khzsquare"]=13201,
+ ["kihiragana"]=12365,
+ ["kikatakana"]=12461,
+ ["kikatakanahalfwidth"]=65399,
+ ["kiroguramusquare"]=13077,
+ ["kiromeetorusquare"]=13078,
+ ["kirosquare"]=13076,
+ ["kiyeokacirclekorean"]=12910,
+ ["kiyeokaparenkorean"]=12814,
+ ["kiyeokcirclekorean"]=12896,
+ ["kiyeokkorean"]=12593,
+ ["kiyeokparenkorean"]=12800,
+ ["kiyeoksioskorean"]=12595,
+ ["kjecyrillic"]=1116,
+ ["klinebelow"]=7733,
+ ["klsquare"]=13208,
+ ["kmcubedsquare"]=13222,
+ ["kmonospace"]=65355,
+ ["kmsquaredsquare"]=13218,
+ ["kohiragana"]=12371,
+ ["kohmsquare"]=13248,
+ ["kokaithai"]=3585,
+ ["kokatakana"]=12467,
+ ["kokatakanahalfwidth"]=65402,
+ ["kooposquare"]=13086,
+ ["koppacyrillic"]=1153,
+ ["koreanstandardsymbol"]=12927,
+ ["koroniscmb"]=835,
+ ["kparen"]=9382,
+ ["kpasquare"]=13226,
+ ["ksicyrillic"]=1135,
+ ["ktsquare"]=13263,
+ ["kturned"]=670,
+ ["kuhiragana"]=12367,
+ ["kukatakana"]=12463,
+ ["kukatakanahalfwidth"]=65400,
+ ["kvsquare"]=13240,
+ ["kwsquare"]=13246,
+ ["l"]=108,
+ ["labengali"]=2482,
+ ["lacute"]=314,
+ ["ladeva"]=2354,
+ ["lagujarati"]=2738,
+ ["lagurmukhi"]=2610,
+ ["lakkhangyaothai"]=3653,
+ ["lamaleffinalarabic"]=65276,
+ ["lamalefhamzaabovefinalarabic"]=65272,
+ ["lamalefhamzaaboveisolatedarabic"]=65271,
+ ["lamalefhamzabelowfinalarabic"]=65274,
+ ["lamalefhamzabelowisolatedarabic"]=65273,
+ ["lamalefisolatedarabic"]=65275,
+ ["lamalefmaddaabovefinalarabic"]=65270,
+ ["lamalefmaddaaboveisolatedarabic"]=65269,
+ ["lamarabic"]=1604,
+ ["lambda"]=955,
+ ["lambdastroke"]=411,
+ ["lameddageshhebrew"]=64316,
+ ["lamedholamhebrew"]=1500,
+ ["lamfinalarabic"]=65246,
+ ["lamhahinitialarabic"]=64714,
+ ["lamjeeminitialarabic"]=64713,
+ ["lamkhahinitialarabic"]=64715,
+ ["lamlamhehisolatedarabic"]=65010,
+ ["lammedialarabic"]=65248,
+ ["lammeemhahinitialarabic"]=64904,
+ ["lammeeminitialarabic"]=64716,
+ ["lammeemkhahinitialarabic"]=65247,
+ ["largecircle"]=9711,
+ ["lbar"]=410,
+ ["lbelt"]=620,
+ ["lbopomofo"]=12556,
+ ["lcaron"]=318,
+ ["lcircle"]=9435,
+ ["lcircumflexbelow"]=7741,
+ ["lcommaaccent"]=316,
+ ["ldotaccent"]=320,
+ ["ldotbelow"]=7735,
+ ["ldotbelowmacron"]=7737,
+ ["leftangleabovecmb"]=794,
+ ["lefttackbelowcmb"]=792,
+ ["less"]=60,
+ ["lessequal"]=8804,
+ ["lessequalorgreater"]=8922,
+ ["lessmonospace"]=65308,
+ ["lessorequivalent"]=8818,
+ ["lessorgreater"]=8822,
+ ["lessoverequal"]=8806,
+ ["lesssmall"]=65124,
+ ["lezh"]=622,
+ ["lfblock"]=9612,
+ ["lhookretroflex"]=621,
+ ["lira"]=8356,
+ ["liwnarmenian"]=1388,
+ ["lj"]=457,
+ ["ljecyrillic"]=1113,
+ ["lladeva"]=2355,
+ ["llagujarati"]=2739,
+ ["llinebelow"]=7739,
+ ["llladeva"]=2356,
+ ["llvocalicbengali"]=2529,
+ ["llvocalicdeva"]=2401,
+ ["llvocalicvowelsignbengali"]=2531,
+ ["llvocalicvowelsigndeva"]=2403,
+ ["lmiddletilde"]=619,
+ ["lmonospace"]=65356,
+ ["lmsquare"]=13264,
+ ["lochulathai"]=3628,
+ ["logicaland"]=8743,
+ ["logicalnot"]=172,
+ ["logicalor"]=8744,
+ ["lolingthai"]=3621,
+ ["lowlinecenterline"]=65102,
+ ["lowlinecmb"]=818,
+ ["lowlinedashed"]=65101,
+ ["lozenge"]=9674,
+ ["lparen"]=9383,
+ ["lslash"]=322,
+ ["lsquare"]=8467,
+ ["luthai"]=3622,
+ ["lvocalicbengali"]=2444,
+ ["lvocalicdeva"]=2316,
+ ["lvocalicvowelsignbengali"]=2530,
+ ["lvocalicvowelsigndeva"]=2402,
+ ["lxsquare"]=13267,
+ ["m"]=109,
+ ["mabengali"]=2478,
+ ["macron"]=175,
+ ["macronbelowcmb"]=817,
+ ["macroncmb"]=772,
+ ["macronlowmod"]=717,
+ ["macronmonospace"]=65507,
+ ["macute"]=7743,
+ ["madeva"]=2350,
+ ["magujarati"]=2734,
+ ["magurmukhi"]=2606,
+ ["mahapakhlefthebrew"]=1444,
+ ["mahiragana"]=12414,
+ ["maichattawathai"]=3659,
+ ["maiekthai"]=3656,
+ ["maihanakatthai"]=3633,
+ ["maitaikhuthai"]=3655,
+ ["maithothai"]=3657,
+ ["maitrithai"]=3658,
+ ["maiyamokthai"]=3654,
+ ["makatakana"]=12510,
+ ["makatakanahalfwidth"]=65423,
+ ["mansyonsquare"]=13127,
+ ["maqafhebrew"]=1470,
+ ["mars"]=9794,
+ ["masoracirclehebrew"]=1455,
+ ["masquare"]=13187,
+ ["mbopomofo"]=12551,
+ ["mbsquare"]=13268,
+ ["mcircle"]=9436,
+ ["mcubedsquare"]=13221,
+ ["mdotaccent"]=7745,
+ ["mdotbelow"]=7747,
+ ["meemarabic"]=1605,
+ ["meemfinalarabic"]=65250,
+ ["meeminitialarabic"]=65251,
+ ["meemmedialarabic"]=65252,
+ ["meemmeeminitialarabic"]=64721,
+ ["meemmeemisolatedarabic"]=64584,
+ ["meetorusquare"]=13133,
+ ["mehiragana"]=12417,
+ ["meizierasquare"]=13182,
+ ["mekatakana"]=12513,
+ ["mekatakanahalfwidth"]=65426,
+ ["memdageshhebrew"]=64318,
+ ["memhebrew"]=1502,
+ ["menarmenian"]=1396,
+ ["merkhakefulalefthebrew"]=1446,
+ ["merkhalefthebrew"]=1445,
+ ["mhook"]=625,
+ ["mhzsquare"]=13202,
+ ["middledotkatakanahalfwidth"]=65381,
+ ["mieumacirclekorean"]=12914,
+ ["mieumaparenkorean"]=12818,
+ ["mieumcirclekorean"]=12900,
+ ["mieumkorean"]=12609,
+ ["mieumpansioskorean"]=12656,
+ ["mieumparenkorean"]=12804,
+ ["mieumpieupkorean"]=12654,
+ ["mieumsioskorean"]=12655,
+ ["mihiragana"]=12415,
+ ["mikatakana"]=12511,
+ ["mikatakanahalfwidth"]=65424,
+ ["minus"]=8722,
+ ["minusbelowcmb"]=800,
+ ["minuscircle"]=8854,
+ ["minusmod"]=727,
+ ["minusplus"]=8723,
+ ["minute"]=8242,
+ ["miribaarusquare"]=13130,
+ ["mirisquare"]=13129,
+ ["mlonglegturned"]=624,
+ ["mlsquare"]=13206,
+ ["mmcubedsquare"]=13219,
+ ["mmonospace"]=65357,
+ ["mmsquaredsquare"]=13215,
+ ["mohiragana"]=12418,
+ ["mohmsquare"]=13249,
+ ["mokatakana"]=12514,
+ ["mokatakanahalfwidth"]=65427,
+ ["molsquare"]=13270,
+ ["momathai"]=3617,
+ ["moverssquare"]=13223,
+ ["moverssquaredsquare"]=13224,
+ ["mparen"]=9384,
+ ["mpasquare"]=13227,
+ ["mssquare"]=13235,
+ ["mturned"]=623,
+ ["mu1"]=181,
+ ["muasquare"]=13186,
+ ["muchgreater"]=8811,
+ ["muchless"]=8810,
+ ["mufsquare"]=13196,
+ ["mugreek"]=956,
+ ["mugsquare"]=13197,
+ ["muhiragana"]=12416,
+ ["mukatakana"]=12512,
+ ["mukatakanahalfwidth"]=65425,
+ ["mulsquare"]=13205,
+ ["multiply"]=215,
+ ["mumsquare"]=13211,
+ ["munahlefthebrew"]=1443,
+ ["musicalnote"]=9834,
+ ["musicalnotedbl"]=9835,
+ ["musicflatsign"]=9837,
+ ["musicsharpsign"]=9839,
+ ["mussquare"]=13234,
+ ["muvsquare"]=13238,
+ ["muwsquare"]=13244,
+ ["mvmegasquare"]=13241,
+ ["mvsquare"]=13239,
+ ["mwmegasquare"]=13247,
+ ["mwsquare"]=13245,
+ ["n"]=110,
+ ["nabengali"]=2472,
+ ["nabla"]=8711,
+ ["nacute"]=324,
+ ["nadeva"]=2344,
+ ["nagujarati"]=2728,
+ ["nagurmukhi"]=2600,
+ ["nahiragana"]=12394,
+ ["nakatakana"]=12490,
+ ["nakatakanahalfwidth"]=65413,
+ ["nasquare"]=13185,
+ ["nbopomofo"]=12555,
+ ["ncaron"]=328,
+ ["ncircle"]=9437,
+ ["ncircumflexbelow"]=7755,
+ ["ncommaaccent"]=326,
+ ["ndotaccent"]=7749,
+ ["ndotbelow"]=7751,
+ ["nehiragana"]=12397,
+ ["nekatakana"]=12493,
+ ["nekatakanahalfwidth"]=65416,
+ ["nfsquare"]=13195,
+ ["ngabengali"]=2457,
+ ["ngadeva"]=2329,
+ ["ngagujarati"]=2713,
+ ["ngagurmukhi"]=2585,
+ ["ngonguthai"]=3591,
+ ["nhiragana"]=12435,
+ ["nhookleft"]=626,
+ ["nhookretroflex"]=627,
+ ["nieunacirclekorean"]=12911,
+ ["nieunaparenkorean"]=12815,
+ ["nieuncieuckorean"]=12597,
+ ["nieuncirclekorean"]=12897,
+ ["nieunhieuhkorean"]=12598,
+ ["nieunkorean"]=12596,
+ ["nieunpansioskorean"]=12648,
+ ["nieunparenkorean"]=12801,
+ ["nieunsioskorean"]=12647,
+ ["nieuntikeutkorean"]=12646,
+ ["nihiragana"]=12395,
+ ["nikatakana"]=12491,
+ ["nikatakanahalfwidth"]=65414,
+ ["nikhahitthai"]=3661,
+ ["nine"]=57,
+ ["ninebengali"]=2543,
+ ["ninecircle"]=9320,
+ ["ninecircleinversesansserif"]=10130,
+ ["ninedeva"]=2415,
+ ["ninegujarati"]=2799,
+ ["ninegurmukhi"]=2671,
+ ["ninehackarabic"]=1641,
+ ["ninehangzhou"]=12329,
+ ["nineideographicparen"]=12840,
+ ["nineinferior"]=8329,
+ ["ninemonospace"]=65305,
+ ["nineparen"]=9340,
+ ["nineperiod"]=9360,
+ ["ninepersian"]=1785,
+ ["nineroman"]=8568,
+ ["ninesuperior"]=8313,
+ ["nineteencircle"]=9330,
+ ["nineteenparen"]=9350,
+ ["nineteenperiod"]=9370,
+ ["ninethai"]=3673,
+ ["nj"]=460,
+ ["njecyrillic"]=1114,
+ ["nkatakana"]=12531,
+ ["nkatakanahalfwidth"]=65437,
+ ["nlegrightlong"]=414,
+ ["nlinebelow"]=7753,
+ ["nmonospace"]=65358,
+ ["nmsquare"]=13210,
+ ["nnabengali"]=2467,
+ ["nnadeva"]=2339,
+ ["nnagujarati"]=2723,
+ ["nnagurmukhi"]=2595,
+ ["nnnadeva"]=2345,
+ ["nohiragana"]=12398,
+ ["nokatakana"]=12494,
+ ["nokatakanahalfwidth"]=65417,
+ ["nonbreakingspace"]=160,
+ ["nonenthai"]=3603,
+ ["nonuthai"]=3609,
+ ["noonarabic"]=1606,
+ ["noonfinalarabic"]=65254,
+ ["noonghunnaarabic"]=1722,
+ ["noonghunnafinalarabic"]=64415,
+ ["nooninitialarabic"]=65255,
+ ["noonjeeminitialarabic"]=64722,
+ ["noonjeemisolatedarabic"]=64587,
+ ["noonmedialarabic"]=65256,
+ ["noonmeeminitialarabic"]=64725,
+ ["noonmeemisolatedarabic"]=64590,
+ ["noonnoonfinalarabic"]=64653,
+ ["notcontains"]=8716,
+ ["notelementof"]=8713,
+ ["notequal"]=8800,
+ ["notgreater"]=8815,
+ ["notgreaternorequal"]=8817,
+ ["notgreaternorless"]=8825,
+ ["notidentical"]=8802,
+ ["notless"]=8814,
+ ["notlessnorequal"]=8816,
+ ["notparallel"]=8742,
+ ["notprecedes"]=8832,
+ ["notsubset"]=8836,
+ ["notsucceeds"]=8833,
+ ["notsuperset"]=8837,
+ ["nowarmenian"]=1398,
+ ["nparen"]=9385,
+ ["nssquare"]=13233,
+ ["nsuperior"]=8319,
+ ["ntilde"]=241,
+ ["nu"]=957,
+ ["nuhiragana"]=12396,
+ ["nukatakana"]=12492,
+ ["nukatakanahalfwidth"]=65415,
+ ["nuktabengali"]=2492,
+ ["nuktadeva"]=2364,
+ ["nuktagujarati"]=2748,
+ ["nuktagurmukhi"]=2620,
+ ["numbersign"]=35,
+ ["numbersignmonospace"]=65283,
+ ["numbersignsmall"]=65119,
+ ["numeralsigngreek"]=884,
+ ["numeralsignlowergreek"]=885,
+ ["numero"]=8470,
+ ["nundageshhebrew"]=64320,
+ ["nunhebrew"]=1504,
+ ["nvsquare"]=13237,
+ ["nwsquare"]=13243,
+ ["nyabengali"]=2462,
+ ["nyadeva"]=2334,
+ ["nyagujarati"]=2718,
+ ["nyagurmukhi"]=2590,
+ ["o"]=111,
+ ["oacute"]=243,
+ ["oangthai"]=3629,
+ ["obarred"]=629,
+ ["obarredcyrillic"]=1257,
+ ["obarreddieresiscyrillic"]=1259,
+ ["obengali"]=2451,
+ ["obopomofo"]=12571,
+ ["obreve"]=335,
+ ["ocandradeva"]=2321,
+ ["ocandragujarati"]=2705,
+ ["ocandravowelsigndeva"]=2377,
+ ["ocandravowelsigngujarati"]=2761,
+ ["ocaron"]=466,
+ ["ocircle"]=9438,
+ ["ocircumflex"]=244,
+ ["ocircumflexacute"]=7889,
+ ["ocircumflexdotbelow"]=7897,
+ ["ocircumflexgrave"]=7891,
+ ["ocircumflexhookabove"]=7893,
+ ["ocircumflextilde"]=7895,
+ ["ocyrillic"]=1086,
+ ["odblgrave"]=525,
+ ["odeva"]=2323,
+ ["odieresis"]=246,
+ ["odieresiscyrillic"]=1255,
+ ["odotbelow"]=7885,
+ ["oe"]=339,
+ ["oekorean"]=12634,
+ ["ogonek"]=731,
+ ["ogonekcmb"]=808,
+ ["ograve"]=242,
+ ["ogujarati"]=2707,
+ ["oharmenian"]=1413,
+ ["ohiragana"]=12362,
+ ["ohookabove"]=7887,
+ ["ohorn"]=417,
+ ["ohornacute"]=7899,
+ ["ohorndotbelow"]=7907,
+ ["ohorngrave"]=7901,
+ ["ohornhookabove"]=7903,
+ ["ohorntilde"]=7905,
+ ["ohungarumlaut"]=337,
+ ["oi"]=419,
+ ["oinvertedbreve"]=527,
+ ["okatakana"]=12458,
+ ["okatakanahalfwidth"]=65397,
+ ["okorean"]=12631,
+ ["olehebrew"]=1451,
+ ["omacron"]=333,
+ ["omacronacute"]=7763,
+ ["omacrongrave"]=7761,
+ ["omdeva"]=2384,
+ ["omega"]=969,
+ ["omegacyrillic"]=1121,
+ ["omegalatinclosed"]=631,
+ ["omegaroundcyrillic"]=1147,
+ ["omegatitlocyrillic"]=1149,
+ ["omegatonos"]=974,
+ ["omgujarati"]=2768,
+ ["omicron"]=959,
+ ["omicrontonos"]=972,
+ ["omonospace"]=65359,
+ ["one"]=49,
+ ["onebengali"]=2535,
+ ["onecircle"]=9312,
+ ["onecircleinversesansserif"]=10122,
+ ["onedeva"]=2407,
+ ["onedotenleader"]=8228,
+ ["oneeighth"]=8539,
+ ["onegujarati"]=2791,
+ ["onegurmukhi"]=2663,
+ ["onehackarabic"]=1633,
+ ["onehalf"]=189,
+ ["onehangzhou"]=12321,
+ ["oneideographicparen"]=12832,
+ ["oneinferior"]=8321,
+ ["onemonospace"]=65297,
+ ["onenumeratorbengali"]=2548,
+ ["oneparen"]=9332,
+ ["oneperiod"]=9352,
+ ["onepersian"]=1777,
+ ["onequarter"]=188,
+ ["oneroman"]=8560,
+ ["onesuperior"]=185,
+ ["onethai"]=3665,
+ ["onethird"]=8531,
+ ["oogonek"]=491,
+ ["oogonekmacron"]=493,
+ ["oogurmukhi"]=2579,
+ ["oomatragurmukhi"]=2635,
+ ["oopen"]=596,
+ ["oparen"]=9386,
+ ["option"]=8997,
+ ["ordfeminine"]=170,
+ ["ordmasculine"]=186,
+ ["oshortdeva"]=2322,
+ ["oshortvowelsigndeva"]=2378,
+ ["oslash"]=248,
+ ["osmallhiragana"]=12361,
+ ["osmallkatakana"]=12457,
+ ["osmallkatakanahalfwidth"]=65387,
+ ["ostrokeacute"]=511,
+ ["otcyrillic"]=1151,
+ ["otilde"]=245,
+ ["otildeacute"]=7757,
+ ["otildedieresis"]=7759,
+ ["oubopomofo"]=12577,
+ ["overline"]=8254,
+ ["overlinecenterline"]=65098,
+ ["overlinecmb"]=773,
+ ["overlinedashed"]=65097,
+ ["overlinedblwavy"]=65100,
+ ["overlinewavy"]=65099,
+ ["ovowelsignbengali"]=2507,
+ ["ovowelsigndeva"]=2379,
+ ["ovowelsigngujarati"]=2763,
+ ["p"]=112,
+ ["paampssquare"]=13184,
+ ["paasentosquare"]=13099,
+ ["pabengali"]=2474,
+ ["pacute"]=7765,
+ ["padeva"]=2346,
+ ["pagedown"]=8671,
+ ["pageup"]=8670,
+ ["pagujarati"]=2730,
+ ["pagurmukhi"]=2602,
+ ["pahiragana"]=12401,
+ ["paiyannoithai"]=3631,
+ ["pakatakana"]=12497,
+ ["palatalizationcyrilliccmb"]=1156,
+ ["palochkacyrillic"]=1216,
+ ["pansioskorean"]=12671,
+ ["paragraph"]=182,
+ ["parallel"]=8741,
+ ["parenleft"]=40,
+ ["parenleftaltonearabic"]=64830,
+ ["parenleftinferior"]=8333,
+ ["parenleftmonospace"]=65288,
+ ["parenleftsmall"]=65113,
+ ["parenleftsuperior"]=8317,
+ ["parenleftvertical"]=65077,
+ ["parenright"]=41,
+ ["parenrightaltonearabic"]=64831,
+ ["parenrightinferior"]=8334,
+ ["parenrightmonospace"]=65289,
+ ["parenrightsmall"]=65114,
+ ["parenrightsuperior"]=8318,
+ ["parenrightvertical"]=65078,
+ ["partialdiff"]=8706,
+ ["paseqhebrew"]=1472,
+ ["pashtahebrew"]=1433,
+ ["pasquare"]=13225,
+ ["patahwidehebrew"]=1463,
+ ["pazerhebrew"]=1441,
+ ["pbopomofo"]=12550,
+ ["pcircle"]=9439,
+ ["pdotaccent"]=7767,
+ ["pecyrillic"]=1087,
+ ["pedageshhebrew"]=64324,
+ ["peezisquare"]=13115,
+ ["pefinaldageshhebrew"]=64323,
+ ["peharabic"]=1662,
+ ["peharmenian"]=1402,
+ ["pehebrew"]=1508,
+ ["pehfinalarabic"]=64343,
+ ["pehinitialarabic"]=64344,
+ ["pehiragana"]=12410,
+ ["pehmedialarabic"]=64345,
+ ["pekatakana"]=12506,
+ ["pemiddlehookcyrillic"]=1191,
+ ["perafehebrew"]=64334,
+ ["percent"]=37,
+ ["percentarabic"]=1642,
+ ["percentmonospace"]=65285,
+ ["percentsmall"]=65130,
+ ["period"]=46,
+ ["periodarmenian"]=1417,
+ ["periodcentered"]=183,
+ ["periodhalfwidth"]=65377,
+ ["periodmonospace"]=65294,
+ ["periodsmall"]=65106,
+ ["perispomenigreekcmb"]=834,
+ ["perpendicular"]=8869,
+ ["perthousand"]=8240,
+ ["peseta"]=8359,
+ ["pfsquare"]=13194,
+ ["phabengali"]=2475,
+ ["phadeva"]=2347,
+ ["phagujarati"]=2731,
+ ["phagurmukhi"]=2603,
+ ["phi"]=966,
+ ["phieuphacirclekorean"]=12922,
+ ["phieuphaparenkorean"]=12826,
+ ["phieuphcirclekorean"]=12908,
+ ["phieuphkorean"]=12621,
+ ["phieuphparenkorean"]=12812,
+ ["philatin"]=632,
+ ["phinthuthai"]=3642,
+ ["phisymbolgreek"]=981,
+ ["phook"]=421,
+ ["phophanthai"]=3614,
+ ["phophungthai"]=3612,
+ ["phosamphaothai"]=3616,
+ ["pi"]=960,
+ ["pieupacirclekorean"]=12915,
+ ["pieupaparenkorean"]=12819,
+ ["pieupcieuckorean"]=12662,
+ ["pieupcirclekorean"]=12901,
+ ["pieupkiyeokkorean"]=12658,
+ ["pieupkorean"]=12610,
+ ["pieupparenkorean"]=12805,
+ ["pieupsioskiyeokkorean"]=12660,
+ ["pieupsioskorean"]=12612,
+ ["pieupsiostikeutkorean"]=12661,
+ ["pieupthieuthkorean"]=12663,
+ ["pieuptikeutkorean"]=12659,
+ ["pihiragana"]=12404,
+ ["pikatakana"]=12500,
+ ["pisymbolgreek"]=982,
+ ["piwrarmenian"]=1411,
+ ["plus"]=43,
+ ["plusbelowcmb"]=799,
+ ["pluscircle"]=8853,
+ ["plusminus"]=177,
+ ["plusmod"]=726,
+ ["plusmonospace"]=65291,
+ ["plussmall"]=65122,
+ ["plussuperior"]=8314,
+ ["pmonospace"]=65360,
+ ["pmsquare"]=13272,
+ ["pohiragana"]=12413,
+ ["pointingindexdownwhite"]=9759,
+ ["pointingindexleftwhite"]=9756,
+ ["pointingindexrightwhite"]=9758,
+ ["pointingindexupwhite"]=9757,
+ ["pokatakana"]=12509,
+ ["poplathai"]=3611,
+ ["postalmark"]=12306,
+ ["postalmarkface"]=12320,
+ ["pparen"]=9387,
+ ["precedes"]=8826,
+ ["prescription"]=8478,
+ ["primemod"]=697,
+ ["primereversed"]=8245,
+ ["product"]=8719,
+ ["projective"]=8965,
+ ["prolongedkana"]=12540,
+ ["propellor"]=8984,
+ ["proportion"]=8759,
+ ["proportional"]=8733,
+ ["psi"]=968,
+ ["psicyrillic"]=1137,
+ ["psilipneumatacyrilliccmb"]=1158,
+ ["pssquare"]=13232,
+ ["puhiragana"]=12407,
+ ["pukatakana"]=12503,
+ ["pvsquare"]=13236,
+ ["pwsquare"]=13242,
+ ["q"]=113,
+ ["qadeva"]=2392,
+ ["qadmahebrew"]=1448,
+ ["qafarabic"]=1602,
+ ["qaffinalarabic"]=65238,
+ ["qafinitialarabic"]=65239,
+ ["qafmedialarabic"]=65240,
+ ["qamatswidehebrew"]=1464,
+ ["qarneyparahebrew"]=1439,
+ ["qbopomofo"]=12561,
+ ["qcircle"]=9440,
+ ["qhook"]=672,
+ ["qmonospace"]=65361,
+ ["qofdageshhebrew"]=64327,
+ ["qoftserehebrew"]=1511,
+ ["qparen"]=9388,
+ ["quarternote"]=9833,
+ ["qubutswidehebrew"]=1467,
+ ["question"]=63,
+ ["questionarabic"]=1567,
+ ["questionarmenian"]=1374,
+ ["questiondown"]=191,
+ ["questiongreek"]=894,
+ ["questionmonospace"]=65311,
+ ["quotedbl"]=34,
+ ["quotedblbase"]=8222,
+ ["quotedblleft"]=8220,
+ ["quotedblmonospace"]=65282,
+ ["quotedblprime"]=12318,
+ ["quotedblprimereversed"]=12317,
+ ["quotedblright"]=8221,
+ ["quoteleft"]=8216,
+ ["quotereversed"]=8219,
+ ["quoteright"]=8217,
+ ["quoterightn"]=329,
+ ["quotesinglbase"]=8218,
+ ["quotesingle"]=39,
+ ["quotesinglemonospace"]=65287,
+ ["r"]=114,
+ ["raarmenian"]=1404,
+ ["rabengali"]=2480,
+ ["racute"]=341,
+ ["radeva"]=2352,
+ ["radical"]=8730,
+ ["radoverssquare"]=13230,
+ ["radoverssquaredsquare"]=13231,
+ ["radsquare"]=13229,
+ ["rafehebrew"]=1471,
+ ["ragujarati"]=2736,
+ ["ragurmukhi"]=2608,
+ ["rahiragana"]=12425,
+ ["rakatakana"]=12521,
+ ["rakatakanahalfwidth"]=65431,
+ ["ralowerdiagonalbengali"]=2545,
+ ["ramiddlediagonalbengali"]=2544,
+ ["ramshorn"]=612,
+ ["ratio"]=8758,
+ ["rbopomofo"]=12566,
+ ["rcaron"]=345,
+ ["rcircle"]=9441,
+ ["rcommaaccent"]=343,
+ ["rdblgrave"]=529,
+ ["rdotaccent"]=7769,
+ ["rdotbelow"]=7771,
+ ["rdotbelowmacron"]=7773,
+ ["referencemark"]=8251,
+ ["registered"]=174,
+ ["reharmenian"]=1408,
+ ["rehfinalarabic"]=65198,
+ ["rehiragana"]=12428,
+ ["rehyehaleflamarabic"]=1585,
+ ["rekatakana"]=12524,
+ ["rekatakanahalfwidth"]=65434,
+ ["reshdageshhebrew"]=64328,
+ ["reshtserehebrew"]=1512,
+ ["reversedtilde"]=8765,
+ ["reviamugrashhebrew"]=1431,
+ ["revlogicalnot"]=8976,
+ ["rfishhook"]=638,
+ ["rfishhookreversed"]=639,
+ ["rhabengali"]=2525,
+ ["rhadeva"]=2397,
+ ["rho"]=961,
+ ["rhook"]=637,
+ ["rhookturned"]=635,
+ ["rhookturnedsuperior"]=693,
+ ["rhosymbolgreek"]=1009,
+ ["rhotichookmod"]=734,
+ ["rieulacirclekorean"]=12913,
+ ["rieulaparenkorean"]=12817,
+ ["rieulcirclekorean"]=12899,
+ ["rieulhieuhkorean"]=12608,
+ ["rieulkiyeokkorean"]=12602,
+ ["rieulkiyeoksioskorean"]=12649,
+ ["rieulkorean"]=12601,
+ ["rieulmieumkorean"]=12603,
+ ["rieulpansioskorean"]=12652,
+ ["rieulparenkorean"]=12803,
+ ["rieulphieuphkorean"]=12607,
+ ["rieulpieupkorean"]=12604,
+ ["rieulpieupsioskorean"]=12651,
+ ["rieulsioskorean"]=12605,
+ ["rieulthieuthkorean"]=12606,
+ ["rieultikeutkorean"]=12650,
+ ["rieulyeorinhieuhkorean"]=12653,
+ ["rightangle"]=8735,
+ ["righttackbelowcmb"]=793,
+ ["righttriangle"]=8895,
+ ["rihiragana"]=12426,
+ ["rikatakana"]=12522,
+ ["rikatakanahalfwidth"]=65432,
+ ["ring"]=730,
+ ["ringbelowcmb"]=805,
+ ["ringcmb"]=778,
+ ["ringhalfleft"]=703,
+ ["ringhalfleftarmenian"]=1369,
+ ["ringhalfleftbelowcmb"]=796,
+ ["ringhalfleftcentered"]=723,
+ ["ringhalfright"]=702,
+ ["ringhalfrightbelowcmb"]=825,
+ ["ringhalfrightcentered"]=722,
+ ["rinvertedbreve"]=531,
+ ["rittorusquare"]=13137,
+ ["rlinebelow"]=7775,
+ ["rlongleg"]=636,
+ ["rlonglegturned"]=634,
+ ["rmonospace"]=65362,
+ ["rohiragana"]=12429,
+ ["rokatakana"]=12525,
+ ["rokatakanahalfwidth"]=65435,
+ ["roruathai"]=3619,
+ ["rparen"]=9389,
+ ["rrabengali"]=2524,
+ ["rradeva"]=2353,
+ ["rragurmukhi"]=2652,
+ ["rreharabic"]=1681,
+ ["rrehfinalarabic"]=64397,
+ ["rrvocalicbengali"]=2528,
+ ["rrvocalicdeva"]=2400,
+ ["rrvocalicgujarati"]=2784,
+ ["rrvocalicvowelsignbengali"]=2500,
+ ["rrvocalicvowelsigndeva"]=2372,
+ ["rrvocalicvowelsigngujarati"]=2756,
+ ["rtblock"]=9616,
+ ["rturned"]=633,
+ ["rturnedsuperior"]=692,
+ ["ruhiragana"]=12427,
+ ["rukatakana"]=12523,
+ ["rukatakanahalfwidth"]=65433,
+ ["rupeemarkbengali"]=2546,
+ ["rupeesignbengali"]=2547,
+ ["ruthai"]=3620,
+ ["rvocalicbengali"]=2443,
+ ["rvocalicdeva"]=2315,
+ ["rvocalicgujarati"]=2699,
+ ["rvocalicvowelsignbengali"]=2499,
+ ["rvocalicvowelsigndeva"]=2371,
+ ["rvocalicvowelsigngujarati"]=2755,
+ ["s"]=115,
+ ["sabengali"]=2488,
+ ["sacute"]=347,
+ ["sacutedotaccent"]=7781,
+ ["sadarabic"]=1589,
+ ["sadeva"]=2360,
+ ["sadfinalarabic"]=65210,
+ ["sadinitialarabic"]=65211,
+ ["sadmedialarabic"]=65212,
+ ["sagujarati"]=2744,
+ ["sagurmukhi"]=2616,
+ ["sahiragana"]=12373,
+ ["sakatakana"]=12469,
+ ["sakatakanahalfwidth"]=65403,
+ ["sallallahoualayhewasallamarabic"]=65018,
+ ["samekhdageshhebrew"]=64321,
+ ["samekhhebrew"]=1505,
+ ["saraaathai"]=3634,
+ ["saraaethai"]=3649,
+ ["saraaimaimalaithai"]=3652,
+ ["saraaimaimuanthai"]=3651,
+ ["saraamthai"]=3635,
+ ["saraathai"]=3632,
+ ["saraethai"]=3648,
+ ["saraiithai"]=3637,
+ ["saraithai"]=3636,
+ ["saraothai"]=3650,
+ ["saraueethai"]=3639,
+ ["sarauethai"]=3638,
+ ["sarauthai"]=3640,
+ ["sarauuthai"]=3641,
+ ["sbopomofo"]=12569,
+ ["scaron"]=353,
+ ["scarondotaccent"]=7783,
+ ["scedilla"]=351,
+ ["schwa"]=601,
+ ["schwacyrillic"]=1241,
+ ["schwadieresiscyrillic"]=1243,
+ ["schwahook"]=602,
+ ["scircle"]=9442,
+ ["scircumflex"]=349,
+ ["scommaaccent"]=537,
+ ["sdotaccent"]=7777,
+ ["sdotbelow"]=7779,
+ ["sdotbelowdotaccent"]=7785,
+ ["seagullbelowcmb"]=828,
+ ["second"]=8243,
+ ["secondtonechinese"]=714,
+ ["section"]=167,
+ ["seenarabic"]=1587,
+ ["seenfinalarabic"]=65202,
+ ["seeninitialarabic"]=65203,
+ ["seenmedialarabic"]=65204,
+ ["segoltahebrew"]=1426,
+ ["segolwidehebrew"]=1462,
+ ["seharmenian"]=1405,
+ ["sehiragana"]=12379,
+ ["sekatakana"]=12475,
+ ["sekatakanahalfwidth"]=65406,
+ ["semicolon"]=59,
+ ["semicolonarabic"]=1563,
+ ["semicolonmonospace"]=65307,
+ ["semicolonsmall"]=65108,
+ ["semivoicedmarkkana"]=12444,
+ ["semivoicedmarkkanahalfwidth"]=65439,
+ ["sentisquare"]=13090,
+ ["sentosquare"]=13091,
+ ["seven"]=55,
+ ["sevenbengali"]=2541,
+ ["sevencircle"]=9318,
+ ["sevencircleinversesansserif"]=10128,
+ ["sevendeva"]=2413,
+ ["seveneighths"]=8542,
+ ["sevengujarati"]=2797,
+ ["sevengurmukhi"]=2669,
+ ["sevenhackarabic"]=1639,
+ ["sevenhangzhou"]=12327,
+ ["sevenideographicparen"]=12838,
+ ["seveninferior"]=8327,
+ ["sevenmonospace"]=65303,
+ ["sevenparen"]=9338,
+ ["sevenperiod"]=9358,
+ ["sevenpersian"]=1783,
+ ["sevenroman"]=8566,
+ ["sevensuperior"]=8311,
+ ["seventeencircle"]=9328,
+ ["seventeenparen"]=9348,
+ ["seventeenperiod"]=9368,
+ ["seventhai"]=3671,
+ ["shaarmenian"]=1399,
+ ["shabengali"]=2486,
+ ["shacyrillic"]=1096,
+ ["shaddadammaarabic"]=64609,
+ ["shaddadammatanarabic"]=64606,
+ ["shaddafathaarabic"]=64608,
+ ["shaddafathatanarabic"]=1617,
+ ["shaddakasraarabic"]=64610,
+ ["shaddakasratanarabic"]=64607,
+ ["shadedark"]=9619,
+ ["shadelight"]=9617,
+ ["shademedium"]=9618,
+ ["shadeva"]=2358,
+ ["shagujarati"]=2742,
+ ["shagurmukhi"]=2614,
+ ["shalshelethebrew"]=1427,
+ ["shbopomofo"]=12565,
+ ["shchacyrillic"]=1097,
+ ["sheenarabic"]=1588,
+ ["sheenfinalarabic"]=65206,
+ ["sheeninitialarabic"]=65207,
+ ["sheenmedialarabic"]=65208,
+ ["sheicoptic"]=995,
+ ["sheqelhebrew"]=8362,
+ ["shevawidehebrew"]=1456,
+ ["shhacyrillic"]=1211,
+ ["shimacoptic"]=1005,
+ ["shindageshhebrew"]=64329,
+ ["shindageshshindothebrew"]=64300,
+ ["shindageshsindothebrew"]=64301,
+ ["shindothebrew"]=1473,
+ ["shinhebrew"]=1513,
+ ["shinshindothebrew"]=64298,
+ ["shinsindothebrew"]=64299,
+ ["shook"]=642,
+ ["sigma"]=963,
+ ["sigmafinal"]=962,
+ ["sigmalunatesymbolgreek"]=1010,
+ ["sihiragana"]=12375,
+ ["sikatakana"]=12471,
+ ["sikatakanahalfwidth"]=65404,
+ ["siluqlefthebrew"]=1469,
+ ["sindothebrew"]=1474,
+ ["siosacirclekorean"]=12916,
+ ["siosaparenkorean"]=12820,
+ ["sioscieuckorean"]=12670,
+ ["sioscirclekorean"]=12902,
+ ["sioskiyeokkorean"]=12666,
+ ["sioskorean"]=12613,
+ ["siosnieunkorean"]=12667,
+ ["siosparenkorean"]=12806,
+ ["siospieupkorean"]=12669,
+ ["siostikeutkorean"]=12668,
+ ["six"]=54,
+ ["sixbengali"]=2540,
+ ["sixcircle"]=9317,
+ ["sixcircleinversesansserif"]=10127,
+ ["sixdeva"]=2412,
+ ["sixgujarati"]=2796,
+ ["sixgurmukhi"]=2668,
+ ["sixhackarabic"]=1638,
+ ["sixhangzhou"]=12326,
+ ["sixideographicparen"]=12837,
+ ["sixinferior"]=8326,
+ ["sixmonospace"]=65302,
+ ["sixparen"]=9337,
+ ["sixperiod"]=9357,
+ ["sixpersian"]=1782,
+ ["sixroman"]=8565,
+ ["sixsuperior"]=8310,
+ ["sixteencircle"]=9327,
+ ["sixteencurrencydenominatorbengali"]=2553,
+ ["sixteenparen"]=9347,
+ ["sixteenperiod"]=9367,
+ ["sixthai"]=3670,
+ ["slash"]=47,
+ ["slashmonospace"]=65295,
+ ["slong"]=383,
+ ["slongdotaccent"]=7835,
+ ["smonospace"]=65363,
+ ["sofpasuqhebrew"]=1475,
+ ["softhyphen"]=173,
+ ["softsigncyrillic"]=1100,
+ ["sohiragana"]=12381,
+ ["sokatakana"]=12477,
+ ["sokatakanahalfwidth"]=65407,
+ ["soliduslongoverlaycmb"]=824,
+ ["solidusshortoverlaycmb"]=823,
+ ["sorusithai"]=3625,
+ ["sosalathai"]=3624,
+ ["sosothai"]=3595,
+ ["sosuathai"]=3626,
+ ["space"]=32,
+ ["spadesuitblack"]=9824,
+ ["spadesuitwhite"]=9828,
+ ["sparen"]=9390,
+ ["squarebelowcmb"]=827,
+ ["squarecc"]=13252,
+ ["squarecm"]=13213,
+ ["squarediagonalcrosshatchfill"]=9641,
+ ["squarehorizontalfill"]=9636,
+ ["squarekg"]=13199,
+ ["squarekm"]=13214,
+ ["squarekmcapital"]=13262,
+ ["squareln"]=13265,
+ ["squarelog"]=13266,
+ ["squaremg"]=13198,
+ ["squaremil"]=13269,
+ ["squaremm"]=13212,
+ ["squaremsquared"]=13217,
+ ["squareorthogonalcrosshatchfill"]=9638,
+ ["squareupperlefttolowerrightfill"]=9639,
+ ["squareupperrighttolowerleftfill"]=9640,
+ ["squareverticalfill"]=9637,
+ ["squarewhitewithsmallblack"]=9635,
+ ["srsquare"]=13275,
+ ["ssabengali"]=2487,
+ ["ssadeva"]=2359,
+ ["ssagujarati"]=2743,
+ ["ssangcieuckorean"]=12617,
+ ["ssanghieuhkorean"]=12677,
+ ["ssangieungkorean"]=12672,
+ ["ssangkiyeokkorean"]=12594,
+ ["ssangnieunkorean"]=12645,
+ ["ssangpieupkorean"]=12611,
+ ["ssangsioskorean"]=12614,
+ ["ssangtikeutkorean"]=12600,
+ ["sterling"]=163,
+ ["sterlingmonospace"]=65505,
+ ["strokelongoverlaycmb"]=822,
+ ["strokeshortoverlaycmb"]=821,
+ ["subset"]=8834,
+ ["subsetnotequal"]=8842,
+ ["subsetorequal"]=8838,
+ ["succeeds"]=8827,
+ ["suchthat"]=8715,
+ ["suhiragana"]=12377,
+ ["sukatakana"]=12473,
+ ["sukatakanahalfwidth"]=65405,
+ ["sukunarabic"]=1618,
+ ["summation"]=8721,
+ ["sun"]=9788,
+ ["superset"]=8835,
+ ["supersetnotequal"]=8843,
+ ["supersetorequal"]=8839,
+ ["svsquare"]=13276,
+ ["syouwaerasquare"]=13180,
+ ["t"]=116,
+ ["tabengali"]=2468,
+ ["tackdown"]=8868,
+ ["tackleft"]=8867,
+ ["tadeva"]=2340,
+ ["tagujarati"]=2724,
+ ["tagurmukhi"]=2596,
+ ["taharabic"]=1591,
+ ["tahfinalarabic"]=65218,
+ ["tahinitialarabic"]=65219,
+ ["tahiragana"]=12383,
+ ["tahmedialarabic"]=65220,
+ ["taisyouerasquare"]=13181,
+ ["takatakana"]=12479,
+ ["takatakanahalfwidth"]=65408,
+ ["tatweelarabic"]=1600,
+ ["tau"]=964,
+ ["tavdageshhebrew"]=64330,
+ ["tavhebrew"]=1514,
+ ["tbar"]=359,
+ ["tbopomofo"]=12554,
+ ["tcaron"]=357,
+ ["tccurl"]=680,
+ ["tcheharabic"]=1670,
+ ["tchehfinalarabic"]=64379,
+ ["tchehmedialarabic"]=64381,
+ ["tchehmeeminitialarabic"]=64380,
+ ["tcircle"]=9443,
+ ["tcircumflexbelow"]=7793,
+ ["tcommaaccent"]=355,
+ ["tdieresis"]=7831,
+ ["tdotaccent"]=7787,
+ ["tdotbelow"]=7789,
+ ["tecyrillic"]=1090,
+ ["tedescendercyrillic"]=1197,
+ ["teharabic"]=1578,
+ ["tehfinalarabic"]=65174,
+ ["tehhahinitialarabic"]=64674,
+ ["tehhahisolatedarabic"]=64524,
+ ["tehinitialarabic"]=65175,
+ ["tehiragana"]=12390,
+ ["tehjeeminitialarabic"]=64673,
+ ["tehjeemisolatedarabic"]=64523,
+ ["tehmarbutaarabic"]=1577,
+ ["tehmarbutafinalarabic"]=65172,
+ ["tehmedialarabic"]=65176,
+ ["tehmeeminitialarabic"]=64676,
+ ["tehmeemisolatedarabic"]=64526,
+ ["tehnoonfinalarabic"]=64627,
+ ["tekatakana"]=12486,
+ ["tekatakanahalfwidth"]=65411,
+ ["telephone"]=8481,
+ ["telephoneblack"]=9742,
+ ["telishagedolahebrew"]=1440,
+ ["telishaqetanahebrew"]=1449,
+ ["tencircle"]=9321,
+ ["tenideographicparen"]=12841,
+ ["tenparen"]=9341,
+ ["tenperiod"]=9361,
+ ["tenroman"]=8569,
+ ["tesh"]=679,
+ ["tetdageshhebrew"]=64312,
+ ["tethebrew"]=1496,
+ ["tetsecyrillic"]=1205,
+ ["tevirlefthebrew"]=1435,
+ ["thabengali"]=2469,
+ ["thadeva"]=2341,
+ ["thagujarati"]=2725,
+ ["thagurmukhi"]=2597,
+ ["thalarabic"]=1584,
+ ["thalfinalarabic"]=65196,
+ ["thanthakhatthai"]=3660,
+ ["theharabic"]=1579,
+ ["thehfinalarabic"]=65178,
+ ["thehinitialarabic"]=65179,
+ ["thehmedialarabic"]=65180,
+ ["thereexists"]=8707,
+ ["therefore"]=8756,
+ ["theta"]=952,
+ ["thetasymbolgreek"]=977,
+ ["thieuthacirclekorean"]=12921,
+ ["thieuthaparenkorean"]=12825,
+ ["thieuthcirclekorean"]=12907,
+ ["thieuthkorean"]=12620,
+ ["thieuthparenkorean"]=12811,
+ ["thirteencircle"]=9324,
+ ["thirteenparen"]=9344,
+ ["thirteenperiod"]=9364,
+ ["thonangmonthothai"]=3601,
+ ["thook"]=429,
+ ["thophuthaothai"]=3602,
+ ["thorn"]=254,
+ ["thothahanthai"]=3607,
+ ["thothanthai"]=3600,
+ ["thothongthai"]=3608,
+ ["thothungthai"]=3606,
+ ["thousandcyrillic"]=1154,
+ ["thousandsseparatorpersian"]=1644,
+ ["three"]=51,
+ ["threebengali"]=2537,
+ ["threecircle"]=9314,
+ ["threecircleinversesansserif"]=10124,
+ ["threedeva"]=2409,
+ ["threeeighths"]=8540,
+ ["threegujarati"]=2793,
+ ["threegurmukhi"]=2665,
+ ["threehackarabic"]=1635,
+ ["threehangzhou"]=12323,
+ ["threeideographicparen"]=12834,
+ ["threeinferior"]=8323,
+ ["threemonospace"]=65299,
+ ["threenumeratorbengali"]=2550,
+ ["threeparen"]=9334,
+ ["threeperiod"]=9354,
+ ["threepersian"]=1779,
+ ["threequarters"]=190,
+ ["threeroman"]=8562,
+ ["threesuperior"]=179,
+ ["threethai"]=3667,
+ ["thzsquare"]=13204,
+ ["tihiragana"]=12385,
+ ["tikatakana"]=12481,
+ ["tikatakanahalfwidth"]=65409,
+ ["tikeutacirclekorean"]=12912,
+ ["tikeutaparenkorean"]=12816,
+ ["tikeutcirclekorean"]=12898,
+ ["tikeutkorean"]=12599,
+ ["tikeutparenkorean"]=12802,
+ ["tilde"]=732,
+ ["tildebelowcmb"]=816,
+ ["tildecomb"]=771,
+ ["tildedoublecmb"]=864,
+ ["tildeoperator"]=8764,
+ ["tildeoverlaycmb"]=820,
+ ["tildeverticalcmb"]=830,
+ ["timescircle"]=8855,
+ ["tipehalefthebrew"]=1430,
+ ["tippigurmukhi"]=2672,
+ ["titlocyrilliccmb"]=1155,
+ ["tiwnarmenian"]=1407,
+ ["tlinebelow"]=7791,
+ ["tmonospace"]=65364,
+ ["toarmenian"]=1385,
+ ["tohiragana"]=12392,
+ ["tokatakana"]=12488,
+ ["tokatakanahalfwidth"]=65412,
+ ["tonebarextrahighmod"]=741,
+ ["tonebarextralowmod"]=745,
+ ["tonebarhighmod"]=742,
+ ["tonebarlowmod"]=744,
+ ["tonebarmidmod"]=743,
+ ["tonefive"]=445,
+ ["tonesix"]=389,
+ ["tonetwo"]=424,
+ ["tonos"]=900,
+ ["tonsquare"]=13095,
+ ["topatakthai"]=3599,
+ ["tortoiseshellbracketleft"]=12308,
+ ["tortoiseshellbracketleftsmall"]=65117,
+ ["tortoiseshellbracketleftvertical"]=65081,
+ ["tortoiseshellbracketright"]=12309,
+ ["tortoiseshellbracketrightsmall"]=65118,
+ ["tortoiseshellbracketrightvertical"]=65082,
+ ["totaothai"]=3605,
+ ["tpalatalhook"]=427,
+ ["tparen"]=9391,
+ ["trademark"]=8482,
+ ["tretroflexhook"]=648,
+ ["triagdn"]=9660,
+ ["triaglf"]=9668,
+ ["triagrt"]=9658,
+ ["triagup"]=9650,
+ ["ts"]=678,
+ ["tsadidageshhebrew"]=64326,
+ ["tsadihebrew"]=1510,
+ ["tsecyrillic"]=1094,
+ ["tserewidehebrew"]=1461,
+ ["tshecyrillic"]=1115,
+ ["ttabengali"]=2463,
+ ["ttadeva"]=2335,
+ ["ttagujarati"]=2719,
+ ["ttagurmukhi"]=2591,
+ ["tteharabic"]=1657,
+ ["ttehfinalarabic"]=64359,
+ ["ttehinitialarabic"]=64360,
+ ["ttehmedialarabic"]=64361,
+ ["tthabengali"]=2464,
+ ["tthadeva"]=2336,
+ ["tthagujarati"]=2720,
+ ["tthagurmukhi"]=2592,
+ ["tturned"]=647,
+ ["tuhiragana"]=12388,
+ ["tukatakana"]=12484,
+ ["tukatakanahalfwidth"]=65410,
+ ["tusmallhiragana"]=12387,
+ ["tusmallkatakana"]=12483,
+ ["tusmallkatakanahalfwidth"]=65391,
+ ["twelvecircle"]=9323,
+ ["twelveparen"]=9343,
+ ["twelveperiod"]=9363,
+ ["twelveroman"]=8571,
+ ["twentycircle"]=9331,
+ ["twentyparen"]=9351,
+ ["twentyperiod"]=9371,
+ ["two"]=50,
+ ["twobengali"]=2536,
+ ["twocircle"]=9313,
+ ["twocircleinversesansserif"]=10123,
+ ["twodeva"]=2408,
+ ["twodotleader"]=8229,
+ ["twodotleadervertical"]=65072,
+ ["twogujarati"]=2792,
+ ["twogurmukhi"]=2664,
+ ["twohackarabic"]=1634,
+ ["twohangzhou"]=12322,
+ ["twoideographicparen"]=12833,
+ ["twoinferior"]=8322,
+ ["twomonospace"]=65298,
+ ["twonumeratorbengali"]=2549,
+ ["twoparen"]=9333,
+ ["twoperiod"]=9353,
+ ["twopersian"]=1778,
+ ["tworoman"]=8561,
+ ["twostroke"]=443,
+ ["twosuperior"]=178,
+ ["twothai"]=3666,
+ ["twothirds"]=8532,
+ ["u"]=117,
+ ["uacute"]=250,
+ ["ubar"]=649,
+ ["ubengali"]=2441,
+ ["ubopomofo"]=12584,
+ ["ubreve"]=365,
+ ["ucaron"]=468,
+ ["ucircle"]=9444,
+ ["ucircumflex"]=251,
+ ["ucircumflexbelow"]=7799,
+ ["ucyrillic"]=1091,
+ ["udattadeva"]=2385,
+ ["udblgrave"]=533,
+ ["udeva"]=2313,
+ ["udieresis"]=252,
+ ["udieresisacute"]=472,
+ ["udieresisbelow"]=7795,
+ ["udieresiscaron"]=474,
+ ["udieresiscyrillic"]=1265,
+ ["udieresisgrave"]=476,
+ ["udieresismacron"]=470,
+ ["udotbelow"]=7909,
+ ["ugrave"]=249,
+ ["ugujarati"]=2697,
+ ["ugurmukhi"]=2569,
+ ["uhiragana"]=12358,
+ ["uhookabove"]=7911,
+ ["uhorn"]=432,
+ ["uhornacute"]=7913,
+ ["uhorndotbelow"]=7921,
+ ["uhorngrave"]=7915,
+ ["uhornhookabove"]=7917,
+ ["uhorntilde"]=7919,
+ ["uhungarumlaut"]=369,
+ ["uhungarumlautcyrillic"]=1267,
+ ["uinvertedbreve"]=535,
+ ["ukatakana"]=12454,
+ ["ukatakanahalfwidth"]=65395,
+ ["ukcyrillic"]=1145,
+ ["ukorean"]=12636,
+ ["umacron"]=363,
+ ["umacroncyrillic"]=1263,
+ ["umacrondieresis"]=7803,
+ ["umatragurmukhi"]=2625,
+ ["umonospace"]=65365,
+ ["underscore"]=95,
+ ["underscoredbl"]=8215,
+ ["underscoremonospace"]=65343,
+ ["underscorevertical"]=65075,
+ ["underscorewavy"]=65103,
+ ["union"]=8746,
+ ["universal"]=8704,
+ ["uogonek"]=371,
+ ["uparen"]=9392,
+ ["upblock"]=9600,
+ ["upperdothebrew"]=1476,
+ ["upsilon"]=965,
+ ["upsilondieresis"]=971,
+ ["upsilondieresistonos"]=944,
+ ["upsilonlatin"]=650,
+ ["upsilontonos"]=973,
+ ["uptackbelowcmb"]=797,
+ ["uptackmod"]=724,
+ ["uragurmukhi"]=2675,
+ ["uring"]=367,
+ ["ushortcyrillic"]=1118,
+ ["usmallhiragana"]=12357,
+ ["usmallkatakana"]=12453,
+ ["usmallkatakanahalfwidth"]=65385,
+ ["ustraightcyrillic"]=1199,
+ ["ustraightstrokecyrillic"]=1201,
+ ["utilde"]=361,
+ ["utildeacute"]=7801,
+ ["utildebelow"]=7797,
+ ["uubengali"]=2442,
+ ["uudeva"]=2314,
+ ["uugujarati"]=2698,
+ ["uugurmukhi"]=2570,
+ ["uumatragurmukhi"]=2626,
+ ["uuvowelsignbengali"]=2498,
+ ["uuvowelsigndeva"]=2370,
+ ["uuvowelsigngujarati"]=2754,
+ ["uvowelsignbengali"]=2497,
+ ["uvowelsigndeva"]=2369,
+ ["uvowelsigngujarati"]=2753,
+ ["v"]=118,
+ ["vadeva"]=2357,
+ ["vagujarati"]=2741,
+ ["vagurmukhi"]=2613,
+ ["vakatakana"]=12535,
+ ["vavdageshhebrew"]=64309,
+ ["vavhebrew"]=1493,
+ ["vavholamhebrew"]=64331,
+ ["vavvavhebrew"]=1520,
+ ["vavyodhebrew"]=1521,
+ ["vcircle"]=9445,
+ ["vdotbelow"]=7807,
+ ["vecyrillic"]=1074,
+ ["veharabic"]=1700,
+ ["vehfinalarabic"]=64363,
+ ["vehinitialarabic"]=64364,
+ ["vehmedialarabic"]=64365,
+ ["vekatakana"]=12537,
+ ["venus"]=9792,
+ ["verticalbar"]=124,
+ ["verticallineabovecmb"]=781,
+ ["verticallinebelowcmb"]=809,
+ ["verticallinelowmod"]=716,
+ ["verticallinemod"]=712,
+ ["vewarmenian"]=1406,
+ ["vhook"]=651,
+ ["vikatakana"]=12536,
+ ["viramabengali"]=2509,
+ ["viramadeva"]=2381,
+ ["viramagujarati"]=2765,
+ ["visargabengali"]=2435,
+ ["visargadeva"]=2307,
+ ["visargagujarati"]=2691,
+ ["vmonospace"]=65366,
+ ["voarmenian"]=1400,
+ ["voicediterationhiragana"]=12446,
+ ["voicediterationkatakana"]=12542,
+ ["voicedmarkkana"]=12443,
+ ["voicedmarkkanahalfwidth"]=65438,
+ ["vokatakana"]=12538,
+ ["vparen"]=9393,
+ ["vtilde"]=7805,
+ ["vturned"]=652,
+ ["vuhiragana"]=12436,
+ ["vukatakana"]=12532,
+ ["w"]=119,
+ ["wacute"]=7811,
+ ["waekorean"]=12633,
+ ["wahiragana"]=12431,
+ ["wakatakana"]=12527,
+ ["wakatakanahalfwidth"]=65436,
+ ["wakorean"]=12632,
+ ["wasmallhiragana"]=12430,
+ ["wasmallkatakana"]=12526,
+ ["wattosquare"]=13143,
+ ["wavedash"]=12316,
+ ["wavyunderscorevertical"]=65076,
+ ["wawarabic"]=1608,
+ ["wawfinalarabic"]=65262,
+ ["wawhamzaabovearabic"]=1572,
+ ["wawhamzaabovefinalarabic"]=65158,
+ ["wbsquare"]=13277,
+ ["wcircle"]=9446,
+ ["wcircumflex"]=373,
+ ["wdieresis"]=7813,
+ ["wdotaccent"]=7815,
+ ["wdotbelow"]=7817,
+ ["wehiragana"]=12433,
+ ["weierstrass"]=8472,
+ ["wekatakana"]=12529,
+ ["wekorean"]=12638,
+ ["weokorean"]=12637,
+ ["wgrave"]=7809,
+ ["whitebullet"]=9702,
+ ["whitecircle"]=9675,
+ ["whitecircleinverse"]=9689,
+ ["whitecornerbracketleft"]=12302,
+ ["whitecornerbracketleftvertical"]=65091,
+ ["whitecornerbracketright"]=12303,
+ ["whitecornerbracketrightvertical"]=65092,
+ ["whitediamond"]=9671,
+ ["whitediamondcontainingblacksmalldiamond"]=9672,
+ ["whitedownpointingsmalltriangle"]=9663,
+ ["whitedownpointingtriangle"]=9661,
+ ["whiteleftpointingsmalltriangle"]=9667,
+ ["whiteleftpointingtriangle"]=9665,
+ ["whitelenticularbracketleft"]=12310,
+ ["whitelenticularbracketright"]=12311,
+ ["whiterightpointingsmalltriangle"]=9657,
+ ["whiterightpointingtriangle"]=9655,
+ ["whitesmallsquare"]=9643,
+ ["whitesmilingface"]=9786,
+ ["whitesquare"]=9633,
+ ["whitestar"]=9734,
+ ["whitetelephone"]=9743,
+ ["whitetortoiseshellbracketleft"]=12312,
+ ["whitetortoiseshellbracketright"]=12313,
+ ["whiteuppointingsmalltriangle"]=9653,
+ ["whiteuppointingtriangle"]=9651,
+ ["wihiragana"]=12432,
+ ["wikatakana"]=12528,
+ ["wikorean"]=12639,
+ ["wmonospace"]=65367,
+ ["wohiragana"]=12434,
+ ["wokatakana"]=12530,
+ ["wokatakanahalfwidth"]=65382,
+ ["won"]=8361,
+ ["wonmonospace"]=65510,
+ ["wowaenthai"]=3623,
+ ["wparen"]=9394,
+ ["wring"]=7832,
+ ["wsuperior"]=695,
+ ["wturned"]=653,
+ ["wynn"]=447,
+ ["x"]=120,
+ ["xabovecmb"]=829,
+ ["xbopomofo"]=12562,
+ ["xcircle"]=9447,
+ ["xdieresis"]=7821,
+ ["xdotaccent"]=7819,
+ ["xeharmenian"]=1389,
+ ["xi"]=958,
+ ["xmonospace"]=65368,
+ ["xparen"]=9395,
+ ["xsuperior"]=739,
+ ["y"]=121,
+ ["yaadosquare"]=13134,
+ ["yabengali"]=2479,
+ ["yacute"]=253,
+ ["yadeva"]=2351,
+ ["yaekorean"]=12626,
+ ["yagujarati"]=2735,
+ ["yagurmukhi"]=2607,
+ ["yahiragana"]=12420,
+ ["yakatakana"]=12516,
+ ["yakatakanahalfwidth"]=65428,
+ ["yakorean"]=12625,
+ ["yamakkanthai"]=3662,
+ ["yasmallhiragana"]=12419,
+ ["yasmallkatakana"]=12515,
+ ["yasmallkatakanahalfwidth"]=65388,
+ ["yatcyrillic"]=1123,
+ ["ycircle"]=9448,
+ ["ycircumflex"]=375,
+ ["ydieresis"]=255,
+ ["ydotaccent"]=7823,
+ ["ydotbelow"]=7925,
+ ["yeharabic"]=1610,
+ ["yehbarreearabic"]=1746,
+ ["yehbarreefinalarabic"]=64431,
+ ["yehfinalarabic"]=65266,
+ ["yehhamzaabovearabic"]=1574,
+ ["yehhamzaabovefinalarabic"]=65162,
+ ["yehhamzaaboveinitialarabic"]=65163,
+ ["yehhamzaabovemedialarabic"]=65164,
+ ["yehinitialarabic"]=65267,
+ ["yehmedialarabic"]=65268,
+ ["yehmeeminitialarabic"]=64733,
+ ["yehmeemisolatedarabic"]=64600,
+ ["yehnoonfinalarabic"]=64660,
+ ["yehthreedotsbelowarabic"]=1745,
+ ["yekorean"]=12630,
+ ["yen"]=165,
+ ["yenmonospace"]=65509,
+ ["yeokorean"]=12629,
+ ["yeorinhieuhkorean"]=12678,
+ ["yerahbenyomolefthebrew"]=1450,
+ ["yericyrillic"]=1099,
+ ["yerudieresiscyrillic"]=1273,
+ ["yesieungkorean"]=12673,
+ ["yesieungpansioskorean"]=12675,
+ ["yesieungsioskorean"]=12674,
+ ["yetivhebrew"]=1434,
+ ["ygrave"]=7923,
+ ["yhook"]=436,
+ ["yhookabove"]=7927,
+ ["yiarmenian"]=1397,
+ ["yicyrillic"]=1111,
+ ["yikorean"]=12642,
+ ["yinyang"]=9775,
+ ["yiwnarmenian"]=1410,
+ ["ymonospace"]=65369,
+ ["yoddageshhebrew"]=64313,
+ ["yodhebrew"]=1497,
+ ["yodyodhebrew"]=1522,
+ ["yodyodpatahhebrew"]=64287,
+ ["yohiragana"]=12424,
+ ["yoikorean"]=12681,
+ ["yokatakana"]=12520,
+ ["yokatakanahalfwidth"]=65430,
+ ["yokorean"]=12635,
+ ["yosmallhiragana"]=12423,
+ ["yosmallkatakana"]=12519,
+ ["yosmallkatakanahalfwidth"]=65390,
+ ["yotgreek"]=1011,
+ ["yoyaekorean"]=12680,
+ ["yoyakorean"]=12679,
+ ["yoyakthai"]=3618,
+ ["yoyingthai"]=3597,
+ ["yparen"]=9396,
+ ["ypogegrammeni"]=890,
+ ["ypogegrammenigreekcmb"]=837,
+ ["yr"]=422,
+ ["yring"]=7833,
+ ["ysuperior"]=696,
+ ["ytilde"]=7929,
+ ["yturned"]=654,
+ ["yuhiragana"]=12422,
+ ["yuikorean"]=12684,
+ ["yukatakana"]=12518,
+ ["yukatakanahalfwidth"]=65429,
+ ["yukorean"]=12640,
+ ["yusbigcyrillic"]=1131,
+ ["yusbigiotifiedcyrillic"]=1133,
+ ["yuslittlecyrillic"]=1127,
+ ["yuslittleiotifiedcyrillic"]=1129,
+ ["yusmallhiragana"]=12421,
+ ["yusmallkatakana"]=12517,
+ ["yusmallkatakanahalfwidth"]=65389,
+ ["yuyekorean"]=12683,
+ ["yuyeokorean"]=12682,
+ ["yyabengali"]=2527,
+ ["yyadeva"]=2399,
+ ["z"]=122,
+ ["zaarmenian"]=1382,
+ ["zacute"]=378,
+ ["zadeva"]=2395,
+ ["zagurmukhi"]=2651,
+ ["zaharabic"]=1592,
+ ["zahfinalarabic"]=65222,
+ ["zahinitialarabic"]=65223,
+ ["zahiragana"]=12374,
+ ["zahmedialarabic"]=65224,
+ ["zainarabic"]=1586,
+ ["zainfinalarabic"]=65200,
+ ["zakatakana"]=12470,
+ ["zaqefgadolhebrew"]=1429,
+ ["zaqefqatanhebrew"]=1428,
+ ["zarqahebrew"]=1432,
+ ["zayindageshhebrew"]=64310,
+ ["zayinhebrew"]=1494,
+ ["zbopomofo"]=12567,
+ ["zcaron"]=382,
+ ["zcircle"]=9449,
+ ["zcircumflex"]=7825,
+ ["zcurl"]=657,
+ ["zdotaccent"]=380,
+ ["zdotbelow"]=7827,
+ ["zecyrillic"]=1079,
+ ["zedescendercyrillic"]=1177,
+ ["zedieresiscyrillic"]=1247,
+ ["zehiragana"]=12380,
+ ["zekatakana"]=12476,
+ ["zero"]=48,
+ ["zerobengali"]=2534,
+ ["zerodeva"]=2406,
+ ["zerogujarati"]=2790,
+ ["zerogurmukhi"]=2662,
+ ["zerohackarabic"]=1632,
+ ["zeroinferior"]=8320,
+ ["zeromonospace"]=65296,
+ ["zeropersian"]=1776,
+ ["zerosuperior"]=8304,
+ ["zerothai"]=3664,
+ ["zerowidthjoiner"]=65279,
+ ["zerowidthnonjoiner"]=8204,
+ ["zerowidthspace"]=8203,
+ ["zeta"]=950,
+ ["zhbopomofo"]=12563,
+ ["zhearmenian"]=1386,
+ ["zhebrevecyrillic"]=1218,
+ ["zhecyrillic"]=1078,
+ ["zhedescendercyrillic"]=1175,
+ ["zhedieresiscyrillic"]=1245,
+ ["zihiragana"]=12376,
+ ["zikatakana"]=12472,
+ ["zinorhebrew"]=1454,
+ ["zlinebelow"]=7829,
+ ["zmonospace"]=65370,
+ ["zohiragana"]=12382,
+ ["zokatakana"]=12478,
+ ["zparen"]=9397,
+ ["zretroflexhook"]=656,
+ ["zstroke"]=438,
+ ["zuhiragana"]=12378,
+ ["zukatakana"]=12474,
+
+ -- extras
+
+ ["Dcroat"]=272,
+ ["Delta"]=8710,
+ ["Euro"]=8364,
+ ["H18533"]=9679,
+ ["H18543"]=9642,
+ ["H18551"]=9643,
+ ["H22073"]=9633,
+ ["Ldot"]=319,
+ ["Oslashacute"]=510,
+ ["SF10000"]=9484,
+ ["SF20000"]=9492,
+ ["SF30000"]=9488,
+ ["SF40000"]=9496,
+ ["SF50000"]=9532,
+ ["SF60000"]=9516,
+ ["SF70000"]=9524,
+ ["SF80000"]=9500,
+ ["SF90000"]=9508,
+ ["Upsilon1"]=978,
+ ["afii10066"]=1073,
+ ["afii10067"]=1074,
+ ["afii10068"]=1075,
+ ["afii10069"]=1076,
+ ["afii10070"]=1077,
+ ["afii10071"]=1105,
+ ["afii10072"]=1078,
+ ["afii10073"]=1079,
+ ["afii10074"]=1080,
+ ["afii10075"]=1081,
+ ["afii10076"]=1082,
+ ["afii10077"]=1083,
+ ["afii10078"]=1084,
+ ["afii10079"]=1085,
+ ["afii10080"]=1086,
+ ["afii10081"]=1087,
+ ["afii10082"]=1088,
+ ["afii10083"]=1089,
+ ["afii10084"]=1090,
+ ["afii10085"]=1091,
+ ["afii10086"]=1092,
+ ["afii10087"]=1093,
+ ["afii10088"]=1094,
+ ["afii10089"]=1095,
+ ["afii10090"]=1096,
+ ["afii10091"]=1097,
+ ["afii10092"]=1098,
+ ["afii10093"]=1099,
+ ["afii10094"]=1100,
+ ["afii10095"]=1101,
+ ["afii10096"]=1102,
+ ["afii10097"]=1103,
+ ["afii10098"]=1169,
+ ["afii10099"]=1106,
+ ["afii10100"]=1107,
+ ["afii10101"]=1108,
+ ["afii10102"]=1109,
+ ["afii10103"]=1110,
+ ["afii10104"]=1111,
+ ["afii10105"]=1112,
+ ["afii10106"]=1113,
+ ["afii10107"]=1114,
+ ["afii10108"]=1115,
+ ["afii10109"]=1116,
+ ["afii10110"]=1118,
+ ["afii10193"]=1119,
+ ["afii10194"]=1123,
+ ["afii10195"]=1139,
+ ["afii10196"]=1141,
+ ["afii10846"]=1241,
+ ["afii208"]=8213,
+ ["afii57381"]=1642,
+ ["afii57388"]=1548,
+ ["afii57392"]=1632,
+ ["afii57393"]=1633,
+ ["afii57394"]=1634,
+ ["afii57395"]=1635,
+ ["afii57396"]=1636,
+ ["afii57397"]=1637,
+ ["afii57398"]=1638,
+ ["afii57399"]=1639,
+ ["afii57400"]=1640,
+ ["afii57401"]=1641,
+ ["afii57403"]=1563,
+ ["afii57407"]=1567,
+ ["afii57409"]=1569,
+ ["afii57410"]=1570,
+ ["afii57411"]=1571,
+ ["afii57412"]=1572,
+ ["afii57413"]=1573,
+ ["afii57414"]=1574,
+ ["afii57415"]=1575,
+ ["afii57416"]=1576,
+ ["afii57417"]=1577,
+ ["afii57418"]=1578,
+ ["afii57419"]=1579,
+ ["afii57420"]=1580,
+ ["afii57421"]=1581,
+ ["afii57422"]=1582,
+ ["afii57423"]=1583,
+ ["afii57424"]=1584,
+ ["afii57425"]=1585,
+ ["afii57426"]=1586,
+ ["afii57427"]=1587,
+ ["afii57428"]=1588,
+ ["afii57429"]=1589,
+ ["afii57430"]=1590,
+ ["afii57431"]=1591,
+ ["afii57432"]=1592,
+ ["afii57433"]=1593,
+ ["afii57434"]=1594,
+ ["afii57440"]=1600,
+ ["afii57441"]=1601,
+ ["afii57442"]=1602,
+ ["afii57443"]=1603,
+ ["afii57444"]=1604,
+ ["afii57445"]=1605,
+ ["afii57446"]=1606,
+ ["afii57448"]=1608,
+ ["afii57449"]=1609,
+ ["afii57450"]=1610,
+ ["afii57451"]=1611,
+ ["afii57452"]=1612,
+ ["afii57453"]=1613,
+ ["afii57454"]=1614,
+ ["afii57455"]=1615,
+ ["afii57456"]=1616,
+ ["afii57457"]=1617,
+ ["afii57458"]=1618,
+ ["afii57470"]=1607,
+ ["afii57505"]=1700,
+ ["afii57506"]=1662,
+ ["afii57507"]=1670,
+ ["afii57508"]=1688,
+ ["afii57509"]=1711,
+ ["afii57511"]=1657,
+ ["afii57512"]=1672,
+ ["afii57513"]=1681,
+ ["afii57514"]=1722,
+ ["afii57519"]=1746,
+ ["afii57636"]=8362,
+ ["afii57645"]=1470,
+ ["afii57658"]=1475,
+ ["afii57664"]=1488,
+ ["afii57665"]=1489,
+ ["afii57666"]=1490,
+ ["afii57667"]=1491,
+ ["afii57668"]=1492,
+ ["afii57669"]=1493,
+ ["afii57670"]=1494,
+ ["afii57671"]=1495,
+ ["afii57672"]=1496,
+ ["afii57673"]=1497,
+ ["afii57674"]=1498,
+ ["afii57675"]=1499,
+ ["afii57676"]=1500,
+ ["afii57677"]=1501,
+ ["afii57678"]=1502,
+ ["afii57679"]=1503,
+ ["afii57680"]=1504,
+ ["afii57681"]=1505,
+ ["afii57682"]=1506,
+ ["afii57683"]=1507,
+ ["afii57684"]=1508,
+ ["afii57685"]=1509,
+ ["afii57686"]=1510,
+ ["afii57687"]=1511,
+ ["afii57688"]=1512,
+ ["afii57689"]=1513,
+ ["afii57690"]=1514,
+ ["afii57716"]=1520,
+ ["afii57717"]=1521,
+ ["afii57718"]=1522,
+ ["afii57793"]=1460,
+ ["afii57794"]=1461,
+ ["afii57795"]=1462,
+ ["afii57796"]=1467,
+ ["afii57797"]=1464,
+ ["afii57798"]=1463,
+ ["afii57799"]=1456,
+ ["afii57800"]=1458,
+ ["afii57801"]=1457,
+ ["afii57802"]=1459,
+ ["afii57803"]=1474,
+ ["afii57804"]=1473,
+ ["afii57806"]=1465,
+ ["afii57807"]=1468,
+ ["afii57839"]=1469,
+ ["afii57841"]=1471,
+ ["afii57842"]=1472,
+ ["afii57929"]=700,
+ ["afii61248"]=8453,
+ ["afii61289"]=8467,
+ ["afii61352"]=8470,
+ ["afii61664"]=8204,
+ ["afii63167"]=1645,
+ ["afii64937"]=701,
+ ["arrowdblboth"]=8660,
+ ["arrowdblleft"]=8656,
+ ["arrowdblright"]=8658,
+ ["arrowupdnbse"]=8616,
+ ["bar"]=124,
+ ["circle"]=9675,
+ ["circlemultiply"]=8855,
+ ["circleplus"]=8853,
+ ["club"]=9827,
+ ["colonmonetary"]=8353,
+ ["dcroat"]=273,
+ ["dkshade"]=9619,
+ ["existential"]=8707,
+ ["female"]=9792,
+ ["gradient"]=8711,
+ ["heart"]=9829,
+ ["hookabovecomb"]=777,
+ ["invcircle"]=9689,
+ ["ldot"]=320,
+ ["longs"]=383,
+ ["ltshade"]=9617,
+ ["male"]=9794,
+ ["mu"]=181,
+ ["napostrophe"]=329,
+ ["notelement"]=8713,
+ ["omega1"]=982,
+ ["openbullet"]=9702,
+ ["orthogonal"]=8735,
+ ["oslashacute"]=511,
+ ["phi1"]=981,
+ ["propersubset"]=8834,
+ ["propersuperset"]=8835,
+ ["reflexsubset"]=8838,
+ ["reflexsuperset"]=8839,
+ ["shade"]=9618,
+ ["sigma1"]=962,
+ ["similar"]=8764,
+ ["smileface"]=9786,
+ ["spacehackarabic"]=32,
+ ["spade"]=9824,
+ ["theta1"]=977,
+ ["twodotenleader"]=8229,
+}
diff --git a/Master/texmf-dist/tex/context/base/font-agl.lua b/Master/texmf-dist/tex/context/base/font-agl.lua
index 8a087b12381..a81d3503c42 100644
--- a/Master/texmf-dist/tex/context/base/font-agl.lua
+++ b/Master/texmf-dist/tex/context/base/font-agl.lua
@@ -3,3693 +3,281 @@ if not modules then modules = { } end modules ['font-map'] = {
comment = "companion to font-ini.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "derived from http://www.adobe.com/devnet/opentype/archives/glyphlist.txt",
- comment = "Adobe Glyph List, version 2.0, September 20, 2002",
+ original = "Adobe Glyph List, version 2.0, September 20, 2002",
}
-fonts = fonts or { }
-fonts.map = fonts.map or { }
+local allocate = utilities.storage.allocate
-fonts.map.unicode_to_agl = {
- "controlSTX",
- "controlSOT",
- "controlETX",
- "controlEOT",
- "controlENQ",
- "controlACK",
- "controlBEL",
- "controlBS",
- "controlHT",
- "controlLF",
- "controlVT",
- "controlFF",
- "controlCR",
- "controlSO",
- "controlSI",
- "controlDLE",
- "controlDC1",
- "controlDC2",
- "controlDC3",
- "controlDC4",
- "controlNAK",
- "controlSYN",
- "controlETB",
- "controlCAN",
- "controlEM",
- "controlSUB",
- "controlESC",
- "controlFS",
- "controlGS",
- "controlRS",
- "controlUS",
- "spacehackarabic",
- "exclam",
- "quotedbl",
- "numbersign",
- "dollar",
- "percent",
- "ampersand",
- "quotesingle",
- "parenleft",
- "parenright",
- "asterisk",
- "plus",
- "comma",
- "hyphen",
- "period",
- "slash",
- "zero",
- "one",
- "two",
- "three",
- "four",
- "five",
- "six",
- "seven",
- "eight",
- "nine",
- "colon",
- "semicolon",
- "less",
- "equal",
- "greater",
- "question",
- "at",
- "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",
- "bracketleft",
- "backslash",
- "bracketright",
- "asciicircum",
- "underscore",
- "grave",
- "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",
- "braceleft",
- "verticalbar",
- "braceright",
- "asciitilde",
- "controlDEL",
- [0x00A0] = "nonbreakingspace",
- [0x00A1] = "exclamdown",
- [0x00A2] = "cent",
- [0x00A3] = "sterling",
- [0x00A4] = "currency",
- [0x00A5] = "yen",
- [0x00A6] = "brokenbar",
- [0x00A7] = "section",
- [0x00A8] = "dieresis",
- [0x00A9] = "copyright",
- [0x00AA] = "ordfeminine",
- [0x00AB] = "guillemotleft",
- [0x00AC] = "logicalnot",
- [0x00AD] = "softhyphen",
- [0x00AE] = "registered",
- [0x00AF] = "overscore",
- [0x00B0] = "degree",
- [0x00B1] = "plusminus",
- [0x00B2] = "twosuperior",
- [0x00B3] = "threesuperior",
- [0x00B4] = "acute",
- [0x00B5] = "mu1",
- [0x00B6] = "paragraph",
- [0x00B7] = "periodcentered",
- [0x00B8] = "cedilla",
- [0x00B9] = "onesuperior",
- [0x00BA] = "ordmasculine",
- [0x00BB] = "guillemotright",
- [0x00BC] = "onequarter",
- [0x00BD] = "onehalf",
- [0x00BE] = "threequarters",
- [0x00BF] = "questiondown",
- [0x00C0] = "Agrave",
- [0x00C1] = "Aacute",
- [0x00C2] = "Acircumflex",
- [0x00C3] = "Atilde",
- [0x00C4] = "Adieresis",
- [0x00C5] = "Aring",
- [0x00C6] = "AE",
- [0x00C7] = "Ccedilla",
- [0x00C8] = "Egrave",
- [0x00C9] = "Eacute",
- [0x00CA] = "Ecircumflex",
- [0x00CB] = "Edieresis",
- [0x00CC] = "Igrave",
- [0x00CD] = "Iacute",
- [0x00CE] = "Icircumflex",
- [0x00CF] = "Idieresis",
- [0x00D0] = "Eth",
- [0x00D1] = "Ntilde",
- [0x00D2] = "Ograve",
- [0x00D3] = "Oacute",
- [0x00D4] = "Ocircumflex",
- [0x00D5] = "Otilde",
- [0x00D6] = "Odieresis",
- [0x00D7] = "multiply",
- [0x00D8] = "Oslash",
- [0x00D9] = "Ugrave",
- [0x00DA] = "Uacute",
- [0x00DB] = "Ucircumflex",
- [0x00DC] = "Udieresis",
- [0x00DD] = "Yacute",
- [0x00DE] = "Thorn",
- [0x00DF] = "germandbls",
- [0x00E0] = "agrave",
- [0x00E1] = "aacute",
- [0x00E2] = "acircumflex",
- [0x00E3] = "atilde",
- [0x00E4] = "adieresis",
- [0x00E5] = "aring",
- [0x00E6] = "ae",
- [0x00E7] = "ccedilla",
- [0x00E8] = "egrave",
- [0x00E9] = "eacute",
- [0x00EA] = "ecircumflex",
- [0x00EB] = "edieresis",
- [0x00EC] = "igrave",
- [0x00ED] = "iacute",
- [0x00EE] = "icircumflex",
- [0x00EF] = "idieresis",
- [0x00F0] = "eth",
- [0x00F1] = "ntilde",
- [0x00F2] = "ograve",
- [0x00F3] = "oacute",
- [0x00F4] = "ocircumflex",
- [0x00F5] = "otilde",
- [0x00F6] = "odieresis",
- [0x00F7] = "divide",
- [0x00F8] = "oslash",
- [0x00F9] = "ugrave",
- [0x00FA] = "uacute",
- [0x00FB] = "ucircumflex",
- [0x00FC] = "udieresis",
- [0x00FD] = "yacute",
- [0x00FE] = "thorn",
- [0x00FF] = "ydieresis",
- [0x0100] = "Amacron",
- [0x0101] = "amacron",
- [0x0102] = "Abreve",
- [0x0103] = "abreve",
- [0x0104] = "Aogonek",
- [0x0105] = "aogonek",
- [0x0106] = "Cacute",
- [0x0107] = "cacute",
- [0x0108] = "Ccircumflex",
- [0x0109] = "ccircumflex",
- [0x010A] = "Cdotaccent",
- [0x010B] = "cdotaccent",
- [0x010C] = "Ccaron",
- [0x010D] = "ccaron",
- [0x010E] = "Dcaron",
- [0x010F] = "dcaron",
- [0x0110] = "Dslash",
- [0x0111] = "dmacron",
- [0x0112] = "Emacron",
- [0x0113] = "emacron",
- [0x0114] = "Ebreve",
- [0x0115] = "ebreve",
- [0x0116] = "Edotaccent",
- [0x0117] = "edotaccent",
- [0x0118] = "Eogonek",
- [0x0119] = "eogonek",
- [0x011A] = "Ecaron",
- [0x011B] = "ecaron",
- [0x011C] = "Gcircumflex",
- [0x011D] = "gcircumflex",
- [0x011E] = "Gbreve",
- [0x011F] = "gbreve",
- [0x0120] = "Gdotaccent",
- [0x0121] = "gdotaccent",
- [0x0122] = "Gcommaaccent",
- [0x0123] = "gcommaaccent",
- [0x0124] = "Hcircumflex",
- [0x0125] = "hcircumflex",
- [0x0126] = "Hbar",
- [0x0127] = "hbar",
- [0x0128] = "Itilde",
- [0x0129] = "itilde",
- [0x012A] = "Imacron",
- [0x012B] = "imacron",
- [0x012C] = "Ibreve",
- [0x012D] = "ibreve",
- [0x012E] = "Iogonek",
- [0x012F] = "iogonek",
- [0x0130] = "Idotaccent",
- [0x0131] = "dotlessi",
- [0x0132] = "IJ",
- [0x0133] = "ij",
- [0x0134] = "Jcircumflex",
- [0x0135] = "jcircumflex",
- [0x0136] = "Kcommaaccent",
- [0x0137] = "kcommaaccent",
- [0x0138] = "kgreenlandic",
- [0x0139] = "Lacute",
- [0x013A] = "lacute",
- [0x013B] = "Lcommaaccent",
- [0x013C] = "lcommaaccent",
- [0x013D] = "Lcaron",
- [0x013E] = "lcaron",
- [0x013F] = "Ldotaccent",
- [0x0140] = "ldotaccent",
- [0x0141] = "Lslash",
- [0x0142] = "lslash",
- [0x0143] = "Nacute",
- [0x0144] = "nacute",
- [0x0145] = "Ncommaaccent",
- [0x0146] = "ncommaaccent",
- [0x0147] = "Ncaron",
- [0x0148] = "ncaron",
- [0x0149] = "quoterightn",
- [0x014A] = "Eng",
- [0x014B] = "eng",
- [0x014C] = "Omacron",
- [0x014D] = "omacron",
- [0x014E] = "Obreve",
- [0x014F] = "obreve",
- [0x0150] = "Ohungarumlaut",
- [0x0151] = "ohungarumlaut",
- [0x0152] = "OE",
- [0x0153] = "oe",
- [0x0154] = "Racute",
- [0x0155] = "racute",
- [0x0156] = "Rcommaaccent",
- [0x0157] = "rcommaaccent",
- [0x0158] = "Rcaron",
- [0x0159] = "rcaron",
- [0x015A] = "Sacute",
- [0x015B] = "sacute",
- [0x015C] = "Scircumflex",
- [0x015D] = "scircumflex",
- [0x015E] = "Scedilla",
- [0x015F] = "scedilla",
- [0x0160] = "Scaron",
- [0x0161] = "scaron",
- [0x0162] = "Tcommaaccent",
- [0x0163] = "tcommaaccent",
- [0x0164] = "Tcaron",
- [0x0165] = "tcaron",
- [0x0166] = "Tbar",
- [0x0167] = "tbar",
- [0x0168] = "Utilde",
- [0x0169] = "utilde",
- [0x016A] = "Umacron",
- [0x016B] = "umacron",
- [0x016C] = "Ubreve",
- [0x016D] = "ubreve",
- [0x016E] = "Uring",
- [0x016F] = "uring",
- [0x0170] = "Uhungarumlaut",
- [0x0171] = "uhungarumlaut",
- [0x0172] = "Uogonek",
- [0x0173] = "uogonek",
- [0x0174] = "Wcircumflex",
- [0x0175] = "wcircumflex",
- [0x0176] = "Ycircumflex",
- [0x0177] = "ycircumflex",
- [0x0178] = "Ydieresis",
- [0x0179] = "Zacute",
- [0x017A] = "zacute",
- [0x017B] = "Zdotaccent",
- [0x017C] = "zdotaccent",
- [0x017D] = "Zcaron",
- [0x017E] = "zcaron",
- [0x017F] = "slong",
- [0x0180] = "bstroke",
- [0x0181] = "Bhook",
- [0x0182] = "Btopbar",
- [0x0183] = "btopbar",
- [0x0184] = "Tonesix",
- [0x0185] = "tonesix",
- [0x0186] = "Oopen",
- [0x0187] = "Chook",
- [0x0188] = "chook",
- [0x0189] = "Dafrican",
- [0x018A] = "Dhook",
- [0x018B] = "Dtopbar",
- [0x018C] = "dtopbar",
- [0x018D] = "deltaturned",
- [0x018E] = "Ereversed",
- [0x018F] = "Schwa",
- [0x0190] = "Eopen",
- [0x0191] = "Fhook",
- [0x0192] = "florin",
- [0x0193] = "Ghook",
- [0x0194] = "Gammaafrican",
- [0x0195] = "hv",
- [0x0196] = "Iotaafrican",
- [0x0197] = "Istroke",
- [0x0198] = "Khook",
- [0x0199] = "khook",
- [0x019A] = "lbar",
- [0x019B] = "lambdastroke",
- [0x019C] = "Mturned",
- [0x019D] = "Nhookleft",
- [0x019E] = "nlegrightlong",
- [0x019F] = "Ocenteredtilde",
- [0x01A0] = "Ohorn",
- [0x01A1] = "ohorn",
- [0x01A2] = "Oi",
- [0x01A3] = "oi",
- [0x01A4] = "Phook",
- [0x01A5] = "phook",
- [0x01A6] = "yr",
- [0x01A7] = "Tonetwo",
- [0x01A8] = "tonetwo",
- [0x01A9] = "Esh",
- [0x01AA] = "eshreversedloop",
- [0x01AB] = "tpalatalhook",
- [0x01AC] = "Thook",
- [0x01AD] = "thook",
- [0x01AE] = "Tretroflexhook",
- [0x01AF] = "Uhorn",
- [0x01B0] = "uhorn",
- [0x01B1] = "Upsilonafrican",
- [0x01B2] = "Vhook",
- [0x01B3] = "Yhook",
- [0x01B4] = "yhook",
- [0x01B5] = "Zstroke",
- [0x01B6] = "zstroke",
- [0x01B7] = "Ezh",
- [0x01B8] = "Ezhreversed",
- [0x01B9] = "ezhreversed",
- [0x01BA] = "ezhtail",
- [0x01BB] = "twostroke",
- [0x01BC] = "Tonefive",
- [0x01BD] = "tonefive",
- [0x01BE] = "glottalinvertedstroke",
- [0x01BF] = "wynn",
- [0x01C0] = "clickdental",
- [0x01C1] = "clicklateral",
- [0x01C2] = "clickalveolar",
- [0x01C3] = "clickretroflex",
- [0x01C4] = "DZcaron",
- [0x01C5] = "Dzcaron",
- [0x01C6] = "dzcaron",
- [0x01C7] = "LJ",
- [0x01C8] = "Lj",
- [0x01C9] = "lj",
- [0x01CA] = "NJ",
- [0x01CB] = "Nj",
- [0x01CC] = "nj",
- [0x01CD] = "Acaron",
- [0x01CE] = "acaron",
- [0x01CF] = "Icaron",
- [0x01D0] = "icaron",
- [0x01D1] = "Ocaron",
- [0x01D2] = "ocaron",
- [0x01D3] = "Ucaron",
- [0x01D4] = "ucaron",
- [0x01D5] = "Udieresismacron",
- [0x01D6] = "udieresismacron",
- [0x01D7] = "Udieresisacute",
- [0x01D8] = "udieresisacute",
- [0x01D9] = "Udieresiscaron",
- [0x01DA] = "udieresiscaron",
- [0x01DB] = "Udieresisgrave",
- [0x01DC] = "udieresisgrave",
- [0x01DD] = "eturned",
- [0x01DE] = "Adieresismacron",
- [0x01DF] = "adieresismacron",
- [0x01E0] = "Adotmacron",
- [0x01E1] = "adotmacron",
- [0x01E2] = "AEmacron",
- [0x01E3] = "aemacron",
- [0x01E4] = "Gstroke",
- [0x01E5] = "gstroke",
- [0x01E6] = "Gcaron",
- [0x01E7] = "gcaron",
- [0x01E8] = "Kcaron",
- [0x01E9] = "kcaron",
- [0x01EA] = "Oogonek",
- [0x01EB] = "oogonek",
- [0x01EC] = "Oogonekmacron",
- [0x01ED] = "oogonekmacron",
- [0x01EE] = "Ezhcaron",
- [0x01EF] = "ezhcaron",
- [0x01F0] = "jcaron",
- [0x01F1] = "DZ",
- [0x01F2] = "Dz",
- [0x01F3] = "dz",
- [0x01F4] = "Gacute",
- [0x01F5] = "gacute",
- [0x01FA] = "Aringacute",
- [0x01FB] = "aringacute",
- [0x01FC] = "AEacute",
- [0x01FD] = "aeacute",
- [0x01FE] = "Ostrokeacute",
- [0x01FF] = "ostrokeacute",
- [0x0200] = "Adblgrave",
- [0x0201] = "adblgrave",
- [0x0202] = "Ainvertedbreve",
- [0x0203] = "ainvertedbreve",
- [0x0204] = "Edblgrave",
- [0x0205] = "edblgrave",
- [0x0206] = "Einvertedbreve",
- [0x0207] = "einvertedbreve",
- [0x0208] = "Idblgrave",
- [0x0209] = "idblgrave",
- [0x020A] = "Iinvertedbreve",
- [0x020B] = "iinvertedbreve",
- [0x020C] = "Odblgrave",
- [0x020D] = "odblgrave",
- [0x020E] = "Oinvertedbreve",
- [0x020F] = "oinvertedbreve",
- [0x0210] = "Rdblgrave",
- [0x0211] = "rdblgrave",
- [0x0212] = "Rinvertedbreve",
- [0x0213] = "rinvertedbreve",
- [0x0214] = "Udblgrave",
- [0x0215] = "udblgrave",
- [0x0216] = "Uinvertedbreve",
- [0x0217] = "uinvertedbreve",
- [0x0218] = "Scommaaccent",
- [0x0219] = "scommaaccent",
- [0x0250] = "aturned",
- [0x0251] = "ascript",
- [0x0252] = "ascriptturned",
- [0x0253] = "bhook",
- [0x0254] = "oopen",
- [0x0255] = "ccurl",
- [0x0256] = "dtail",
- [0x0257] = "dhook",
- [0x0258] = "ereversed",
- [0x0259] = "schwa",
- [0x025A] = "schwahook",
- [0x025B] = "eopen",
- [0x025C] = "eopenreversed",
- [0x025D] = "eopenreversedhook",
- [0x025E] = "eopenreversedclosed",
- [0x025F] = "jdotlessstroke",
- [0x0260] = "ghook",
- [0x0261] = "gscript",
- [0x0263] = "gammalatinsmall",
- [0x0264] = "ramshorn",
- [0x0265] = "hturned",
- [0x0266] = "hhook",
- [0x0267] = "henghook",
- [0x0268] = "istroke",
- [0x0269] = "iotalatin",
- [0x026B] = "lmiddletilde",
- [0x026C] = "lbelt",
- [0x026D] = "lhookretroflex",
- [0x026E] = "lezh",
- [0x026F] = "mturned",
- [0x0270] = "mlonglegturned",
- [0x0271] = "mhook",
- [0x0272] = "nhookleft",
- [0x0273] = "nhookretroflex",
- [0x0275] = "obarred",
- [0x0277] = "omegalatinclosed",
- [0x0278] = "philatin",
- [0x0279] = "rturned",
- [0x027A] = "rlonglegturned",
- [0x027B] = "rhookturned",
- [0x027C] = "rlongleg",
- [0x027D] = "rhook",
- [0x027E] = "rfishhook",
- [0x027F] = "rfishhookreversed",
- [0x0281] = "Rsmallinverted",
- [0x0282] = "shook",
- [0x0283] = "esh",
- [0x0284] = "dotlessjstrokehook",
- [0x0285] = "eshsquatreversed",
- [0x0286] = "eshcurl",
- [0x0287] = "tturned",
- [0x0288] = "tretroflexhook",
- [0x0289] = "ubar",
- [0x028A] = "upsilonlatin",
- [0x028B] = "vhook",
- [0x028C] = "vturned",
- [0x028D] = "wturned",
- [0x028E] = "yturned",
- [0x0290] = "zretroflexhook",
- [0x0291] = "zcurl",
- [0x0292] = "ezh",
- [0x0293] = "ezhcurl",
- [0x0294] = "glottalstop",
- [0x0295] = "glottalstopreversed",
- [0x0296] = "glottalstopinverted",
- [0x0297] = "cstretched",
- [0x0298] = "bilabialclick",
- [0x029A] = "eopenclosed",
- [0x029B] = "Gsmallhook",
- [0x029D] = "jcrossedtail",
- [0x029E] = "kturned",
- [0x02A0] = "qhook",
- [0x02A1] = "glottalstopstroke",
- [0x02A2] = "glottalstopstrokereversed",
- [0x02A3] = "dzaltone",
- [0x02A4] = "dezh",
- [0x02A5] = "dzcurl",
- [0x02A6] = "ts",
- [0x02A7] = "tesh",
- [0x02A8] = "tccurl",
- [0x02B0] = "hsuperior",
- [0x02B1] = "hhooksuperior",
- [0x02B2] = "jsuperior",
- [0x02B4] = "rturnedsuperior",
- [0x02B5] = "rhookturnedsuperior",
- [0x02B6] = "Rsmallinvertedsuperior",
- [0x02B7] = "wsuperior",
- [0x02B8] = "ysuperior",
- [0x02B9] = "primemod",
- [0x02BA] = "dblprimemod",
- [0x02BB] = "commaturnedmod",
- [0x02BC] = "apostrophemod",
- [0x02BD] = "commareversedmod",
- [0x02BE] = "ringhalfright",
- [0x02BF] = "ringhalfleft",
- [0x02C0] = "glottalstopmod",
- [0x02C1] = "glottalstopreversedmod",
- [0x02C2] = "arrowheadleftmod",
- [0x02C3] = "arrowheadrightmod",
- [0x02C4] = "arrowheadupmod",
- [0x02C5] = "arrowheaddownmod",
- [0x02C6] = "circumflex",
- [0x02C7] = "caron",
- [0x02C8] = "verticallinemod",
- [0x02C9] = "firsttonechinese",
- [0x02CA] = "secondtonechinese",
- [0x02CB] = "fourthtonechinese",
- [0x02CC] = "verticallinelowmod",
- [0x02CD] = "macronlowmod",
- [0x02CE] = "gravelowmod",
- [0x02CF] = "acutelowmod",
- [0x02D0] = "colontriangularmod",
- [0x02D1] = "colontriangularhalfmod",
- [0x02D2] = "ringhalfrightcentered",
- [0x02D3] = "ringhalfleftcentered",
- [0x02D4] = "uptackmod",
- [0x02D5] = "downtackmod",
- [0x02D6] = "plusmod",
- [0x02D7] = "minusmod",
- [0x02D8] = "breve",
- [0x02D9] = "dotaccent",
- [0x02DA] = "ring",
- [0x02DB] = "ogonek",
- [0x02DC] = "tilde",
- [0x02DD] = "hungarumlaut",
- [0x02DE] = "rhotichookmod",
- [0x02E0] = "gammasuperior",
- [0x02E3] = "xsuperior",
- [0x02E4] = "glottalstopreversedsuperior",
- [0x02E5] = "tonebarextrahighmod",
- [0x02E6] = "tonebarhighmod",
- [0x02E7] = "tonebarmidmod",
- [0x02E8] = "tonebarlowmod",
- [0x02E9] = "tonebarextralowmod",
- [0x0300] = "gravecomb",
- [0x0301] = "acutecomb",
- [0x0302] = "circumflexcmb",
- [0x0303] = "tildecomb",
- [0x0304] = "macroncmb",
- [0x0305] = "overlinecmb",
- [0x0306] = "brevecmb",
- [0x0307] = "dotaccentcmb",
- [0x0308] = "dieresiscmb",
- [0x0309] = "hookcmb",
- [0x030A] = "ringcmb",
- [0x030B] = "hungarumlautcmb",
- [0x030C] = "caroncmb",
- [0x030D] = "verticallineabovecmb",
- [0x030E] = "dblverticallineabovecmb",
- [0x030F] = "dblgravecmb",
- [0x0310] = "candrabinducmb",
- [0x0311] = "breveinvertedcmb",
- [0x0312] = "commaturnedabovecmb",
- [0x0313] = "commaabovecmb",
- [0x0314] = "commareversedabovecmb",
- [0x0315] = "commaaboverightcmb",
- [0x0316] = "gravebelowcmb",
- [0x0317] = "acutebelowcmb",
- [0x0318] = "lefttackbelowcmb",
- [0x0319] = "righttackbelowcmb",
- [0x031A] = "leftangleabovecmb",
- [0x031B] = "horncmb",
- [0x031C] = "ringhalfleftbelowcmb",
- [0x031D] = "uptackbelowcmb",
- [0x031E] = "downtackbelowcmb",
- [0x031F] = "plusbelowcmb",
- [0x0320] = "minusbelowcmb",
- [0x0321] = "hookpalatalizedbelowcmb",
- [0x0322] = "hookretroflexbelowcmb",
- [0x0323] = "dotbelowcomb",
- [0x0324] = "dieresisbelowcmb",
- [0x0325] = "ringbelowcmb",
- [0x0327] = "cedillacmb",
- [0x0328] = "ogonekcmb",
- [0x0329] = "verticallinebelowcmb",
- [0x032A] = "bridgebelowcmb",
- [0x032B] = "dblarchinvertedbelowcmb",
- [0x032C] = "caronbelowcmb",
- [0x032D] = "circumflexbelowcmb",
- [0x032E] = "brevebelowcmb",
- [0x032F] = "breveinvertedbelowcmb",
- [0x0330] = "tildebelowcmb",
- [0x0331] = "macronbelowcmb",
- [0x0332] = "lowlinecmb",
- [0x0333] = "dbllowlinecmb",
- [0x0334] = "tildeoverlaycmb",
- [0x0335] = "strokeshortoverlaycmb",
- [0x0336] = "strokelongoverlaycmb",
- [0x0337] = "solidusshortoverlaycmb",
- [0x0338] = "soliduslongoverlaycmb",
- [0x0339] = "ringhalfrightbelowcmb",
- [0x033A] = "bridgeinvertedbelowcmb",
- [0x033B] = "squarebelowcmb",
- [0x033C] = "seagullbelowcmb",
- [0x033D] = "xabovecmb",
- [0x033E] = "tildeverticalcmb",
- [0x033F] = "dbloverlinecmb",
- [0x0340] = "gravetonecmb",
- [0x0341] = "acutetonecmb",
- [0x0342] = "perispomenigreekcmb",
- [0x0343] = "koroniscmb",
- [0x0344] = "dialytikatonoscmb",
- [0x0345] = "ypogegrammenigreekcmb",
- [0x0360] = "tildedoublecmb",
- [0x0361] = "breveinverteddoublecmb",
- [0x0374] = "numeralsigngreek",
- [0x0375] = "numeralsignlowergreek",
- [0x037A] = "ypogegrammeni",
- [0x037E] = "questiongreek",
- [0x0384] = "tonos",
- [0x0385] = "dieresistonos",
- [0x0386] = "Alphatonos",
- [0x0387] = "anoteleia",
- [0x0388] = "Epsilontonos",
- [0x0389] = "Etatonos",
- [0x038A] = "Iotatonos",
- [0x038C] = "Omicrontonos",
- [0x038E] = "Upsilontonos",
- [0x038F] = "Omegatonos",
- [0x0390] = "iotadieresistonos",
- [0x0391] = "Alpha",
- [0x0392] = "Beta",
- [0x0393] = "Gamma",
- [0x0394] = "Deltagreek",
- [0x0395] = "Epsilon",
- [0x0396] = "Zeta",
- [0x0397] = "Eta",
- [0x0398] = "Theta",
- [0x0399] = "Iota",
- [0x039A] = "Kappa",
- [0x039B] = "Lambda",
- [0x039C] = "Mu",
- [0x039D] = "Nu",
- [0x039E] = "Xi",
- [0x039F] = "Omicron",
- [0x03A0] = "Pi",
- [0x03A1] = "Rho",
- [0x03A3] = "Sigma",
- [0x03A4] = "Tau",
- [0x03A5] = "Upsilon",
- [0x03A6] = "Phi",
- [0x03A7] = "Chi",
- [0x03A8] = "Psi",
- [0x03A9] = "Omegagreek",
- [0x03AA] = "Iotadieresis",
- [0x03AB] = "Upsilondieresis",
- [0x03AC] = "alphatonos",
- [0x03AD] = "epsilontonos",
- [0x03AE] = "etatonos",
- [0x03AF] = "iotatonos",
- [0x03B0] = "upsilondieresistonos",
- [0x03B1] = "alpha",
- [0x03B2] = "beta",
- [0x03B3] = "gamma",
- [0x03B4] = "delta",
- [0x03B5] = "epsilon",
- [0x03B6] = "zeta",
- [0x03B7] = "eta",
- [0x03B8] = "theta",
- [0x03B9] = "iota",
- [0x03BA] = "kappa",
- [0x03BB] = "lambda",
- [0x03BC] = "mugreek",
- [0x03BD] = "nu",
- [0x03BE] = "xi",
- [0x03BF] = "omicron",
- [0x03C0] = "pi",
- [0x03C1] = "rho",
- [0x03C2] = "sigmafinal",
- [0x03C3] = "sigma",
- [0x03C4] = "tau",
- [0x03C5] = "upsilon",
- [0x03C6] = "phi",
- [0x03C7] = "chi",
- [0x03C8] = "psi",
- [0x03C9] = "omega",
- [0x03CA] = "iotadieresis",
- [0x03CB] = "upsilondieresis",
- [0x03CC] = "omicrontonos",
- [0x03CD] = "upsilontonos",
- [0x03CE] = "omegatonos",
- [0x03D0] = "betasymbolgreek",
- [0x03D1] = "thetasymbolgreek",
- [0x03D2] = "Upsilonhooksymbol",
- [0x03D3] = "Upsilonacutehooksymbolgreek",
- [0x03D4] = "Upsilondieresishooksymbolgreek",
- [0x03D5] = "phisymbolgreek",
- [0x03D6] = "pisymbolgreek",
- [0x03DA] = "Stigmagreek",
- [0x03DC] = "Digammagreek",
- [0x03DE] = "Koppagreek",
- [0x03E0] = "Sampigreek",
- [0x03E2] = "Sheicoptic",
- [0x03E3] = "sheicoptic",
- [0x03E4] = "Feicoptic",
- [0x03E5] = "feicoptic",
- [0x03E6] = "Kheicoptic",
- [0x03E7] = "kheicoptic",
- [0x03E8] = "Horicoptic",
- [0x03E9] = "horicoptic",
- [0x03EA] = "Gangiacoptic",
- [0x03EB] = "gangiacoptic",
- [0x03EC] = "Shimacoptic",
- [0x03ED] = "shimacoptic",
- [0x03EE] = "Deicoptic",
- [0x03EF] = "deicoptic",
- [0x03F0] = "kappasymbolgreek",
- [0x03F1] = "rhosymbolgreek",
- [0x03F2] = "sigmalunatesymbolgreek",
- [0x03F3] = "yotgreek",
- [0x0401] = "afii10023",
- [0x0402] = "afii10051",
- [0x0403] = "afii10052",
- [0x0404] = "afii10053",
- [0x0405] = "afii10054",
- [0x0406] = "afii10055",
- [0x0407] = "afii10056",
- [0x0408] = "afii10057",
- [0x0409] = "afii10058",
- [0x040A] = "afii10059",
- [0x040B] = "afii10060",
- [0x040C] = "afii10061",
- [0x040E] = "afii10062",
- [0x040F] = "afii10145",
- [0x0410] = "afii10017",
- [0x0411] = "afii10018",
- [0x0412] = "afii10019",
- [0x0413] = "afii10020",
- [0x0414] = "afii10021",
- [0x0415] = "afii10022",
- [0x0416] = "afii10024",
- [0x0417] = "afii10025",
- [0x0418] = "afii10026",
- [0x0419] = "afii10027",
- [0x041A] = "afii10028",
- [0x041B] = "afii10029",
- [0x041C] = "afii10030",
- [0x041D] = "afii10031",
- [0x041E] = "afii10032",
- [0x041F] = "afii10033",
- [0x0420] = "afii10034",
- [0x0421] = "afii10035",
- [0x0422] = "afii10036",
- [0x0423] = "afii10037",
- [0x0424] = "afii10038",
- [0x0425] = "afii10039",
- [0x0426] = "afii10040",
- [0x0427] = "afii10041",
- [0x0428] = "afii10042",
- [0x0429] = "afii10043",
- [0x042A] = "afii10044",
- [0x042B] = "afii10045",
- [0x042C] = "afii10046",
- [0x042D] = "afii10047",
- [0x042E] = "afii10048",
- [0x042F] = "afii10049",
- [0x0430] = "afii10065",
- [0x0431] = "becyrillic",
- [0x0432] = "vecyrillic",
- [0x0433] = "gecyrillic",
- [0x0434] = "decyrillic",
- [0x0435] = "iecyrillic",
- [0x0436] = "zhecyrillic",
- [0x0437] = "zecyrillic",
- [0x0438] = "iicyrillic",
- [0x0439] = "iishortcyrillic",
- [0x043A] = "kacyrillic",
- [0x043B] = "elcyrillic",
- [0x043C] = "emcyrillic",
- [0x043D] = "encyrillic",
- [0x043E] = "ocyrillic",
- [0x043F] = "pecyrillic",
- [0x0440] = "ercyrillic",
- [0x0441] = "escyrillic",
- [0x0442] = "tecyrillic",
- [0x0443] = "ucyrillic",
- [0x0444] = "efcyrillic",
- [0x0445] = "khacyrillic",
- [0x0446] = "tsecyrillic",
- [0x0447] = "checyrillic",
- [0x0448] = "shacyrillic",
- [0x0449] = "shchacyrillic",
- [0x044A] = "hardsigncyrillic",
- [0x044B] = "yericyrillic",
- [0x044C] = "softsigncyrillic",
- [0x044D] = "ereversedcyrillic",
- [0x044E] = "iucyrillic",
- [0x044F] = "iacyrillic",
- [0x0451] = "iocyrillic",
- [0x0452] = "djecyrillic",
- [0x0453] = "gjecyrillic",
- [0x0454] = "ecyrillic",
- [0x0455] = "dzecyrillic",
- [0x0456] = "icyrillic",
- [0x0457] = "yicyrillic",
- [0x0458] = "jecyrillic",
- [0x0459] = "ljecyrillic",
- [0x045A] = "njecyrillic",
- [0x045B] = "tshecyrillic",
- [0x045C] = "kjecyrillic",
- [0x045E] = "ushortcyrillic",
- [0x045F] = "dzhecyrillic",
- [0x0460] = "Omegacyrillic",
- [0x0461] = "omegacyrillic",
- [0x0462] = "afii10146",
- [0x0463] = "yatcyrillic",
- [0x0464] = "Eiotifiedcyrillic",
- [0x0465] = "eiotifiedcyrillic",
- [0x0466] = "Yuslittlecyrillic",
- [0x0467] = "yuslittlecyrillic",
- [0x0468] = "Yuslittleiotifiedcyrillic",
- [0x0469] = "yuslittleiotifiedcyrillic",
- [0x046A] = "Yusbigcyrillic",
- [0x046B] = "yusbigcyrillic",
- [0x046C] = "Yusbigiotifiedcyrillic",
- [0x046D] = "yusbigiotifiedcyrillic",
- [0x046E] = "Ksicyrillic",
- [0x046F] = "ksicyrillic",
- [0x0470] = "Psicyrillic",
- [0x0471] = "psicyrillic",
- [0x0472] = "afii10147",
- [0x0473] = "fitacyrillic",
- [0x0474] = "afii10148",
- [0x0475] = "izhitsacyrillic",
- [0x0476] = "Izhitsadblgravecyrillic",
- [0x0477] = "izhitsadblgravecyrillic",
- [0x0478] = "Ukcyrillic",
- [0x0479] = "ukcyrillic",
- [0x047A] = "Omegaroundcyrillic",
- [0x047B] = "omegaroundcyrillic",
- [0x047C] = "Omegatitlocyrillic",
- [0x047D] = "omegatitlocyrillic",
- [0x047E] = "Otcyrillic",
- [0x047F] = "otcyrillic",
- [0x0480] = "Koppacyrillic",
- [0x0481] = "koppacyrillic",
- [0x0482] = "thousandcyrillic",
- [0x0483] = "titlocyrilliccmb",
- [0x0484] = "palatalizationcyrilliccmb",
- [0x0485] = "dasiapneumatacyrilliccmb",
- [0x0486] = "psilipneumatacyrilliccmb",
- [0x0490] = "afii10050",
- [0x0491] = "gheupturncyrillic",
- [0x0492] = "Ghestrokecyrillic",
- [0x0493] = "ghestrokecyrillic",
- [0x0494] = "Ghemiddlehookcyrillic",
- [0x0495] = "ghemiddlehookcyrillic",
- [0x0496] = "Zhedescendercyrillic",
- [0x0497] = "zhedescendercyrillic",
- [0x0498] = "Zedescendercyrillic",
- [0x0499] = "zedescendercyrillic",
- [0x049A] = "Kadescendercyrillic",
- [0x049B] = "kadescendercyrillic",
- [0x049C] = "Kaverticalstrokecyrillic",
- [0x049D] = "kaverticalstrokecyrillic",
- [0x049E] = "Kastrokecyrillic",
- [0x049F] = "kastrokecyrillic",
- [0x04A0] = "Kabashkircyrillic",
- [0x04A1] = "kabashkircyrillic",
- [0x04A2] = "Endescendercyrillic",
- [0x04A3] = "endescendercyrillic",
- [0x04A4] = "Enghecyrillic",
- [0x04A5] = "enghecyrillic",
- [0x04A6] = "Pemiddlehookcyrillic",
- [0x04A7] = "pemiddlehookcyrillic",
- [0x04A8] = "Haabkhasiancyrillic",
- [0x04A9] = "haabkhasiancyrillic",
- [0x04AA] = "Esdescendercyrillic",
- [0x04AB] = "esdescendercyrillic",
- [0x04AC] = "Tedescendercyrillic",
- [0x04AD] = "tedescendercyrillic",
- [0x04AE] = "Ustraightcyrillic",
- [0x04AF] = "ustraightcyrillic",
- [0x04B0] = "Ustraightstrokecyrillic",
- [0x04B1] = "ustraightstrokecyrillic",
- [0x04B2] = "Hadescendercyrillic",
- [0x04B3] = "hadescendercyrillic",
- [0x04B4] = "Tetsecyrillic",
- [0x04B5] = "tetsecyrillic",
- [0x04B6] = "Chedescendercyrillic",
- [0x04B7] = "chedescendercyrillic",
- [0x04B8] = "Cheverticalstrokecyrillic",
- [0x04B9] = "cheverticalstrokecyrillic",
- [0x04BA] = "Shhacyrillic",
- [0x04BB] = "shhacyrillic",
- [0x04BC] = "Cheabkhasiancyrillic",
- [0x04BD] = "cheabkhasiancyrillic",
- [0x04BE] = "Chedescenderabkhasiancyrillic",
- [0x04BF] = "chedescenderabkhasiancyrillic",
- [0x04C0] = "palochkacyrillic",
- [0x04C1] = "Zhebrevecyrillic",
- [0x04C2] = "zhebrevecyrillic",
- [0x04C3] = "Kahookcyrillic",
- [0x04C4] = "kahookcyrillic",
- [0x04C7] = "Enhookcyrillic",
- [0x04C8] = "enhookcyrillic",
- [0x04CB] = "Chekhakassiancyrillic",
- [0x04CC] = "chekhakassiancyrillic",
- [0x04D0] = "Abrevecyrillic",
- [0x04D1] = "abrevecyrillic",
- [0x04D2] = "Adieresiscyrillic",
- [0x04D3] = "adieresiscyrillic",
- [0x04D4] = "Aiecyrillic",
- [0x04D5] = "aiecyrillic",
- [0x04D6] = "Iebrevecyrillic",
- [0x04D7] = "iebrevecyrillic",
- [0x04D8] = "Schwacyrillic",
- [0x04D9] = "schwacyrillic",
- [0x04DA] = "Schwadieresiscyrillic",
- [0x04DB] = "schwadieresiscyrillic",
- [0x04DC] = "Zhedieresiscyrillic",
- [0x04DD] = "zhedieresiscyrillic",
- [0x04DE] = "Zedieresiscyrillic",
- [0x04DF] = "zedieresiscyrillic",
- [0x04E0] = "Dzeabkhasiancyrillic",
- [0x04E1] = "dzeabkhasiancyrillic",
- [0x04E2] = "Imacroncyrillic",
- [0x04E3] = "imacroncyrillic",
- [0x04E4] = "Idieresiscyrillic",
- [0x04E5] = "idieresiscyrillic",
- [0x04E6] = "Odieresiscyrillic",
- [0x04E7] = "odieresiscyrillic",
- [0x04E8] = "Obarredcyrillic",
- [0x04E9] = "obarredcyrillic",
- [0x04EA] = "Obarreddieresiscyrillic",
- [0x04EB] = "obarreddieresiscyrillic",
- [0x04EE] = "Umacroncyrillic",
- [0x04EF] = "umacroncyrillic",
- [0x04F0] = "Udieresiscyrillic",
- [0x04F1] = "udieresiscyrillic",
- [0x04F2] = "Uhungarumlautcyrillic",
- [0x04F3] = "uhungarumlautcyrillic",
- [0x04F4] = "Chedieresiscyrillic",
- [0x04F5] = "chedieresiscyrillic",
- [0x04F8] = "Yerudieresiscyrillic",
- [0x04F9] = "yerudieresiscyrillic",
- [0x0531] = "Aybarmenian",
- [0x0532] = "Benarmenian",
- [0x0533] = "Gimarmenian",
- [0x0534] = "Daarmenian",
- [0x0535] = "Echarmenian",
- [0x0536] = "Zaarmenian",
- [0x0537] = "Eharmenian",
- [0x0538] = "Etarmenian",
- [0x0539] = "Toarmenian",
- [0x053A] = "Zhearmenian",
- [0x053B] = "Iniarmenian",
- [0x053C] = "Liwnarmenian",
- [0x053D] = "Xeharmenian",
- [0x053E] = "Caarmenian",
- [0x053F] = "Kenarmenian",
- [0x0540] = "Hoarmenian",
- [0x0541] = "Jaarmenian",
- [0x0542] = "Ghadarmenian",
- [0x0543] = "Cheharmenian",
- [0x0544] = "Menarmenian",
- [0x0545] = "Yiarmenian",
- [0x0546] = "Nowarmenian",
- [0x0547] = "Shaarmenian",
- [0x0548] = "Voarmenian",
- [0x0549] = "Chaarmenian",
- [0x054A] = "Peharmenian",
- [0x054B] = "Jheharmenian",
- [0x054C] = "Raarmenian",
- [0x054D] = "Seharmenian",
- [0x054E] = "Vewarmenian",
- [0x054F] = "Tiwnarmenian",
- [0x0550] = "Reharmenian",
- [0x0551] = "Coarmenian",
- [0x0552] = "Yiwnarmenian",
- [0x0553] = "Piwrarmenian",
- [0x0554] = "Keharmenian",
- [0x0555] = "Oharmenian",
- [0x0556] = "Feharmenian",
- [0x0559] = "ringhalfleftarmenian",
- [0x055A] = "apostrophearmenian",
- [0x055B] = "emphasismarkarmenian",
- [0x055C] = "exclamarmenian",
- [0x055D] = "commaarmenian",
- [0x055E] = "questionarmenian",
- [0x055F] = "abbreviationmarkarmenian",
- [0x0561] = "aybarmenian",
- [0x0562] = "benarmenian",
- [0x0563] = "gimarmenian",
- [0x0564] = "daarmenian",
- [0x0565] = "echarmenian",
- [0x0566] = "zaarmenian",
- [0x0567] = "eharmenian",
- [0x0568] = "etarmenian",
- [0x0569] = "toarmenian",
- [0x056A] = "zhearmenian",
- [0x056B] = "iniarmenian",
- [0x056C] = "liwnarmenian",
- [0x056D] = "xeharmenian",
- [0x056E] = "caarmenian",
- [0x056F] = "kenarmenian",
- [0x0570] = "hoarmenian",
- [0x0571] = "jaarmenian",
- [0x0572] = "ghadarmenian",
- [0x0573] = "cheharmenian",
- [0x0574] = "menarmenian",
- [0x0575] = "yiarmenian",
- [0x0576] = "nowarmenian",
- [0x0577] = "shaarmenian",
- [0x0578] = "voarmenian",
- [0x0579] = "chaarmenian",
- [0x057A] = "peharmenian",
- [0x057B] = "jheharmenian",
- [0x057C] = "raarmenian",
- [0x057D] = "seharmenian",
- [0x057E] = "vewarmenian",
- [0x057F] = "tiwnarmenian",
- [0x0580] = "reharmenian",
- [0x0581] = "coarmenian",
- [0x0582] = "yiwnarmenian",
- [0x0583] = "piwrarmenian",
- [0x0584] = "keharmenian",
- [0x0585] = "oharmenian",
- [0x0586] = "feharmenian",
- [0x0587] = "echyiwnarmenian",
- [0x0589] = "periodarmenian",
- [0x0591] = "etnahtalefthebrew",
- [0x0592] = "segoltahebrew",
- [0x0593] = "shalshelethebrew",
- [0x0594] = "zaqefqatanhebrew",
- [0x0595] = "zaqefgadolhebrew",
- [0x0596] = "tipehalefthebrew",
- [0x0597] = "reviamugrashhebrew",
- [0x0598] = "zarqahebrew",
- [0x0599] = "pashtahebrew",
- [0x059A] = "yetivhebrew",
- [0x059B] = "tevirlefthebrew",
- [0x059C] = "gereshaccenthebrew",
- [0x059D] = "gereshmuqdamhebrew",
- [0x059E] = "gershayimaccenthebrew",
- [0x059F] = "qarneyparahebrew",
- [0x05A0] = "telishagedolahebrew",
- [0x05A1] = "pazerhebrew",
- [0x05A3] = "munahlefthebrew",
- [0x05A4] = "mahapakhlefthebrew",
- [0x05A5] = "merkhalefthebrew",
- [0x05A6] = "merkhakefulalefthebrew",
- [0x05A7] = "dargalefthebrew",
- [0x05A8] = "qadmahebrew",
- [0x05A9] = "telishaqetanahebrew",
- [0x05AA] = "yerahbenyomolefthebrew",
- [0x05AB] = "olehebrew",
- [0x05AC] = "iluyhebrew",
- [0x05AD] = "dehihebrew",
- [0x05AE] = "zinorhebrew",
- [0x05AF] = "masoracirclehebrew",
- [0x05B0] = "shevawidehebrew",
- [0x05B1] = "hatafsegolwidehebrew",
- [0x05B2] = "hatafpatahwidehebrew",
- [0x05B3] = "hatafqamatswidehebrew",
- [0x05B4] = "hiriqwidehebrew",
- [0x05B5] = "tserewidehebrew",
- [0x05B6] = "segolwidehebrew",
- [0x05B7] = "patahwidehebrew",
- [0x05B8] = "qamatswidehebrew",
- [0x05B9] = "holamwidehebrew",
- [0x05BB] = "qubutswidehebrew",
- [0x05BC] = "dageshhebrew",
- [0x05BD] = "siluqlefthebrew",
- [0x05BE] = "maqafhebrew",
- [0x05BF] = "rafehebrew",
- [0x05C0] = "paseqhebrew",
- [0x05C1] = "shindothebrew",
- [0x05C2] = "sindothebrew",
- [0x05C3] = "sofpasuqhebrew",
- [0x05C4] = "upperdothebrew",
- [0x05D0] = "alefhebrew",
- [0x05D1] = "bethebrew",
- [0x05D2] = "gimelhebrew",
- [0x05D3] = "dalettserehebrew",
- [0x05D4] = "hehebrew",
- [0x05D5] = "vavhebrew",
- [0x05D6] = "zayinhebrew",
- [0x05D7] = "hethebrew",
- [0x05D8] = "tethebrew",
- [0x05D9] = "yodhebrew",
- [0x05DA] = "finalkafshevahebrew",
- [0x05DB] = "kafhebrew",
- [0x05DC] = "lamedholamhebrew",
- [0x05DD] = "finalmemhebrew",
- [0x05DE] = "memhebrew",
- [0x05DF] = "finalnunhebrew",
- [0x05E0] = "nunhebrew",
- [0x05E1] = "samekhhebrew",
- [0x05E2] = "ayinhebrew",
- [0x05E3] = "finalpehebrew",
- [0x05E4] = "pehebrew",
- [0x05E5] = "finaltsadihebrew",
- [0x05E6] = "tsadihebrew",
- [0x05E7] = "qoftserehebrew",
- [0x05E8] = "reshtserehebrew",
- [0x05E9] = "shinhebrew",
- [0x05EA] = "tavhebrew",
- [0x05F0] = "vavvavhebrew",
- [0x05F1] = "vavyodhebrew",
- [0x05F2] = "yodyodhebrew",
- [0x05F3] = "gereshhebrew",
- [0x05F4] = "gershayimhebrew",
- [0x060C] = "commaarabic",
- [0x061B] = "semicolonarabic",
- [0x061F] = "questionarabic",
- [0x0621] = "hamzasukunarabic",
- [0x0622] = "alefmaddaabovearabic",
- [0x0623] = "alefhamzaabovearabic",
- [0x0624] = "wawhamzaabovearabic",
- [0x0625] = "alefhamzabelowarabic",
- [0x0626] = "yehhamzaabovearabic",
- [0x0627] = "alefarabic",
- [0x0628] = "beharabic",
- [0x0629] = "tehmarbutaarabic",
- [0x062A] = "teharabic",
- [0x062B] = "theharabic",
- [0x062C] = "jeemarabic",
- [0x062D] = "haharabic",
- [0x062E] = "khaharabic",
- [0x062F] = "dalarabic",
- [0x0630] = "thalarabic",
- [0x0631] = "rehyehaleflamarabic",
- [0x0632] = "zainarabic",
- [0x0633] = "seenarabic",
- [0x0634] = "sheenarabic",
- [0x0635] = "sadarabic",
- [0x0636] = "dadarabic",
- [0x0637] = "taharabic",
- [0x0638] = "zaharabic",
- [0x0639] = "ainarabic",
- [0x063A] = "ghainarabic",
- [0x0640] = "tatweelarabic",
- [0x0641] = "feharabic",
- [0x0642] = "qafarabic",
- [0x0643] = "kafarabic",
- [0x0644] = "lamarabic",
- [0x0645] = "meemarabic",
- [0x0646] = "noonarabic",
- [0x0647] = "heharabic",
- [0x0648] = "wawarabic",
- [0x0649] = "alefmaksuraarabic",
- [0x064A] = "yeharabic",
- [0x064B] = "fathatanarabic",
- [0x064C] = "dammatanarabic",
- [0x064D] = "kasratanarabic",
- [0x064E] = "fathalowarabic",
- [0x064F] = "dammalowarabic",
- [0x0650] = "kasraarabic",
- [0x0651] = "shaddafathatanarabic",
- [0x0652] = "sukunarabic",
- [0x0660] = "zerohackarabic",
- [0x0661] = "onehackarabic",
- [0x0662] = "twohackarabic",
- [0x0663] = "threehackarabic",
- [0x0664] = "fourhackarabic",
- [0x0665] = "fivehackarabic",
- [0x0666] = "sixhackarabic",
- [0x0667] = "sevenhackarabic",
- [0x0668] = "eighthackarabic",
- [0x0669] = "ninehackarabic",
- [0x066A] = "percentarabic",
- [0x066B] = "decimalseparatorpersian",
- [0x066C] = "thousandsseparatorpersian",
- [0x066D] = "asteriskarabic",
- [0x0679] = "tteharabic",
- [0x067E] = "peharabic",
- [0x0686] = "tcheharabic",
- [0x0688] = "ddalarabic",
- [0x0691] = "rreharabic",
- [0x0698] = "jeharabic",
- [0x06A4] = "veharabic",
- [0x06AF] = "gafarabic",
- [0x06BA] = "noonghunnaarabic",
- [0x06C1] = "hehaltonearabic",
- [0x06D1] = "yehthreedotsbelowarabic",
- [0x06D2] = "yehbarreearabic",
- [0x06D5] = "afii57534",
- [0x06F0] = "zeropersian",
- [0x06F1] = "onepersian",
- [0x06F2] = "twopersian",
- [0x06F3] = "threepersian",
- [0x06F4] = "fourpersian",
- [0x06F5] = "fivepersian",
- [0x06F6] = "sixpersian",
- [0x06F7] = "sevenpersian",
- [0x06F8] = "eightpersian",
- [0x06F9] = "ninepersian",
- [0x0901] = "candrabindudeva",
- [0x0902] = "anusvaradeva",
- [0x0903] = "visargadeva",
- [0x0905] = "adeva",
- [0x0906] = "aadeva",
- [0x0907] = "ideva",
- [0x0908] = "iideva",
- [0x0909] = "udeva",
- [0x090A] = "uudeva",
- [0x090B] = "rvocalicdeva",
- [0x090C] = "lvocalicdeva",
- [0x090D] = "ecandradeva",
- [0x090E] = "eshortdeva",
- [0x090F] = "edeva",
- [0x0910] = "aideva",
- [0x0911] = "ocandradeva",
- [0x0912] = "oshortdeva",
- [0x0913] = "odeva",
- [0x0914] = "audeva",
- [0x0915] = "kadeva",
- [0x0916] = "khadeva",
- [0x0917] = "gadeva",
- [0x0918] = "ghadeva",
- [0x0919] = "ngadeva",
- [0x091A] = "cadeva",
- [0x091B] = "chadeva",
- [0x091C] = "jadeva",
- [0x091D] = "jhadeva",
- [0x091E] = "nyadeva",
- [0x091F] = "ttadeva",
- [0x0920] = "tthadeva",
- [0x0921] = "ddadeva",
- [0x0922] = "ddhadeva",
- [0x0923] = "nnadeva",
- [0x0924] = "tadeva",
- [0x0925] = "thadeva",
- [0x0926] = "dadeva",
- [0x0927] = "dhadeva",
- [0x0928] = "nadeva",
- [0x0929] = "nnnadeva",
- [0x092A] = "padeva",
- [0x092B] = "phadeva",
- [0x092C] = "badeva",
- [0x092D] = "bhadeva",
- [0x092E] = "madeva",
- [0x092F] = "yadeva",
- [0x0930] = "radeva",
- [0x0931] = "rradeva",
- [0x0932] = "ladeva",
- [0x0933] = "lladeva",
- [0x0934] = "llladeva",
- [0x0935] = "vadeva",
- [0x0936] = "shadeva",
- [0x0937] = "ssadeva",
- [0x0938] = "sadeva",
- [0x0939] = "hadeva",
- [0x093C] = "nuktadeva",
- [0x093D] = "avagrahadeva",
- [0x093E] = "aavowelsigndeva",
- [0x093F] = "ivowelsigndeva",
- [0x0940] = "iivowelsigndeva",
- [0x0941] = "uvowelsigndeva",
- [0x0942] = "uuvowelsigndeva",
- [0x0943] = "rvocalicvowelsigndeva",
- [0x0944] = "rrvocalicvowelsigndeva",
- [0x0945] = "ecandravowelsigndeva",
- [0x0946] = "eshortvowelsigndeva",
- [0x0947] = "evowelsigndeva",
- [0x0948] = "aivowelsigndeva",
- [0x0949] = "ocandravowelsigndeva",
- [0x094A] = "oshortvowelsigndeva",
- [0x094B] = "ovowelsigndeva",
- [0x094C] = "auvowelsigndeva",
- [0x094D] = "viramadeva",
- [0x0950] = "omdeva",
- [0x0951] = "udattadeva",
- [0x0952] = "anudattadeva",
- [0x0953] = "gravedeva",
- [0x0954] = "acutedeva",
- [0x0958] = "qadeva",
- [0x0959] = "khhadeva",
- [0x095A] = "ghhadeva",
- [0x095B] = "zadeva",
- [0x095C] = "dddhadeva",
- [0x095D] = "rhadeva",
- [0x095E] = "fadeva",
- [0x095F] = "yyadeva",
- [0x0960] = "rrvocalicdeva",
- [0x0961] = "llvocalicdeva",
- [0x0962] = "lvocalicvowelsigndeva",
- [0x0963] = "llvocalicvowelsigndeva",
- [0x0964] = "danda",
- [0x0965] = "dbldanda",
- [0x0966] = "zerodeva",
- [0x0967] = "onedeva",
- [0x0968] = "twodeva",
- [0x0969] = "threedeva",
- [0x096A] = "fourdeva",
- [0x096B] = "fivedeva",
- [0x096C] = "sixdeva",
- [0x096D] = "sevendeva",
- [0x096E] = "eightdeva",
- [0x096F] = "ninedeva",
- [0x0970] = "abbreviationsigndeva",
- [0x0981] = "candrabindubengali",
- [0x0982] = "anusvarabengali",
- [0x0983] = "visargabengali",
- [0x0985] = "abengali",
- [0x0986] = "aabengali",
- [0x0987] = "ibengali",
- [0x0988] = "iibengali",
- [0x0989] = "ubengali",
- [0x098A] = "uubengali",
- [0x098B] = "rvocalicbengali",
- [0x098C] = "lvocalicbengali",
- [0x098F] = "ebengali",
- [0x0990] = "aibengali",
- [0x0993] = "obengali",
- [0x0994] = "aubengali",
- [0x0995] = "kabengali",
- [0x0996] = "khabengali",
- [0x0997] = "gabengali",
- [0x0998] = "ghabengali",
- [0x0999] = "ngabengali",
- [0x099A] = "cabengali",
- [0x099B] = "chabengali",
- [0x099C] = "jabengali",
- [0x099D] = "jhabengali",
- [0x099E] = "nyabengali",
- [0x099F] = "ttabengali",
- [0x09A0] = "tthabengali",
- [0x09A1] = "ddabengali",
- [0x09A2] = "ddhabengali",
- [0x09A3] = "nnabengali",
- [0x09A4] = "tabengali",
- [0x09A5] = "thabengali",
- [0x09A6] = "dabengali",
- [0x09A7] = "dhabengali",
- [0x09A8] = "nabengali",
- [0x09AA] = "pabengali",
- [0x09AB] = "phabengali",
- [0x09AC] = "babengali",
- [0x09AD] = "bhabengali",
- [0x09AE] = "mabengali",
- [0x09AF] = "yabengali",
- [0x09B0] = "rabengali",
- [0x09B2] = "labengali",
- [0x09B6] = "shabengali",
- [0x09B7] = "ssabengali",
- [0x09B8] = "sabengali",
- [0x09B9] = "habengali",
- [0x09BC] = "nuktabengali",
- [0x09BE] = "aavowelsignbengali",
- [0x09BF] = "ivowelsignbengali",
- [0x09C0] = "iivowelsignbengali",
- [0x09C1] = "uvowelsignbengali",
- [0x09C2] = "uuvowelsignbengali",
- [0x09C3] = "rvocalicvowelsignbengali",
- [0x09C4] = "rrvocalicvowelsignbengali",
- [0x09C7] = "evowelsignbengali",
- [0x09C8] = "aivowelsignbengali",
- [0x09CB] = "ovowelsignbengali",
- [0x09CC] = "auvowelsignbengali",
- [0x09CD] = "viramabengali",
- [0x09D7] = "aulengthmarkbengali",
- [0x09DC] = "rrabengali",
- [0x09DD] = "rhabengali",
- [0x09DF] = "yyabengali",
- [0x09E0] = "rrvocalicbengali",
- [0x09E1] = "llvocalicbengali",
- [0x09E2] = "lvocalicvowelsignbengali",
- [0x09E3] = "llvocalicvowelsignbengali",
- [0x09E6] = "zerobengali",
- [0x09E7] = "onebengali",
- [0x09E8] = "twobengali",
- [0x09E9] = "threebengali",
- [0x09EA] = "fourbengali",
- [0x09EB] = "fivebengali",
- [0x09EC] = "sixbengali",
- [0x09ED] = "sevenbengali",
- [0x09EE] = "eightbengali",
- [0x09EF] = "ninebengali",
- [0x09F0] = "ramiddlediagonalbengali",
- [0x09F1] = "ralowerdiagonalbengali",
- [0x09F2] = "rupeemarkbengali",
- [0x09F3] = "rupeesignbengali",
- [0x09F4] = "onenumeratorbengali",
- [0x09F5] = "twonumeratorbengali",
- [0x09F6] = "threenumeratorbengali",
- [0x09F7] = "fournumeratorbengali",
- [0x09F8] = "denominatorminusonenumeratorbengali",
- [0x09F9] = "sixteencurrencydenominatorbengali",
- [0x09FA] = "issharbengali",
- [0x0A02] = "bindigurmukhi",
- [0x0A05] = "agurmukhi",
- [0x0A06] = "aagurmukhi",
- [0x0A07] = "igurmukhi",
- [0x0A08] = "iigurmukhi",
- [0x0A09] = "ugurmukhi",
- [0x0A0A] = "uugurmukhi",
- [0x0A0F] = "eegurmukhi",
- [0x0A10] = "aigurmukhi",
- [0x0A13] = "oogurmukhi",
- [0x0A14] = "augurmukhi",
- [0x0A15] = "kagurmukhi",
- [0x0A16] = "khagurmukhi",
- [0x0A17] = "gagurmukhi",
- [0x0A18] = "ghagurmukhi",
- [0x0A19] = "ngagurmukhi",
- [0x0A1A] = "cagurmukhi",
- [0x0A1B] = "chagurmukhi",
- [0x0A1C] = "jagurmukhi",
- [0x0A1D] = "jhagurmukhi",
- [0x0A1E] = "nyagurmukhi",
- [0x0A1F] = "ttagurmukhi",
- [0x0A20] = "tthagurmukhi",
- [0x0A21] = "ddagurmukhi",
- [0x0A22] = "ddhagurmukhi",
- [0x0A23] = "nnagurmukhi",
- [0x0A24] = "tagurmukhi",
- [0x0A25] = "thagurmukhi",
- [0x0A26] = "dagurmukhi",
- [0x0A27] = "dhagurmukhi",
- [0x0A28] = "nagurmukhi",
- [0x0A2A] = "pagurmukhi",
- [0x0A2B] = "phagurmukhi",
- [0x0A2C] = "bagurmukhi",
- [0x0A2D] = "bhagurmukhi",
- [0x0A2E] = "magurmukhi",
- [0x0A2F] = "yagurmukhi",
- [0x0A30] = "ragurmukhi",
- [0x0A32] = "lagurmukhi",
- [0x0A35] = "vagurmukhi",
- [0x0A36] = "shagurmukhi",
- [0x0A38] = "sagurmukhi",
- [0x0A39] = "hagurmukhi",
- [0x0A3C] = "nuktagurmukhi",
- [0x0A3E] = "aamatragurmukhi",
- [0x0A3F] = "imatragurmukhi",
- [0x0A40] = "iimatragurmukhi",
- [0x0A41] = "umatragurmukhi",
- [0x0A42] = "uumatragurmukhi",
- [0x0A47] = "eematragurmukhi",
- [0x0A48] = "aimatragurmukhi",
- [0x0A4B] = "oomatragurmukhi",
- [0x0A4C] = "aumatragurmukhi",
- [0x0A4D] = "halantgurmukhi",
- [0x0A59] = "khhagurmukhi",
- [0x0A5A] = "ghhagurmukhi",
- [0x0A5B] = "zagurmukhi",
- [0x0A5C] = "rragurmukhi",
- [0x0A5E] = "fagurmukhi",
- [0x0A66] = "zerogurmukhi",
- [0x0A67] = "onegurmukhi",
- [0x0A68] = "twogurmukhi",
- [0x0A69] = "threegurmukhi",
- [0x0A6A] = "fourgurmukhi",
- [0x0A6B] = "fivegurmukhi",
- [0x0A6C] = "sixgurmukhi",
- [0x0A6D] = "sevengurmukhi",
- [0x0A6E] = "eightgurmukhi",
- [0x0A6F] = "ninegurmukhi",
- [0x0A70] = "tippigurmukhi",
- [0x0A71] = "addakgurmukhi",
- [0x0A72] = "irigurmukhi",
- [0x0A73] = "uragurmukhi",
- [0x0A74] = "ekonkargurmukhi",
- [0x0A81] = "candrabindugujarati",
- [0x0A82] = "anusvaragujarati",
- [0x0A83] = "visargagujarati",
- [0x0A85] = "agujarati",
- [0x0A86] = "aagujarati",
- [0x0A87] = "igujarati",
- [0x0A88] = "iigujarati",
- [0x0A89] = "ugujarati",
- [0x0A8A] = "uugujarati",
- [0x0A8B] = "rvocalicgujarati",
- [0x0A8D] = "ecandragujarati",
- [0x0A8F] = "egujarati",
- [0x0A90] = "aigujarati",
- [0x0A91] = "ocandragujarati",
- [0x0A93] = "ogujarati",
- [0x0A94] = "augujarati",
- [0x0A95] = "kagujarati",
- [0x0A96] = "khagujarati",
- [0x0A97] = "gagujarati",
- [0x0A98] = "ghagujarati",
- [0x0A99] = "ngagujarati",
- [0x0A9A] = "cagujarati",
- [0x0A9B] = "chagujarati",
- [0x0A9C] = "jagujarati",
- [0x0A9D] = "jhagujarati",
- [0x0A9E] = "nyagujarati",
- [0x0A9F] = "ttagujarati",
- [0x0AA0] = "tthagujarati",
- [0x0AA1] = "ddagujarati",
- [0x0AA2] = "ddhagujarati",
- [0x0AA3] = "nnagujarati",
- [0x0AA4] = "tagujarati",
- [0x0AA5] = "thagujarati",
- [0x0AA6] = "dagujarati",
- [0x0AA7] = "dhagujarati",
- [0x0AA8] = "nagujarati",
- [0x0AAA] = "pagujarati",
- [0x0AAB] = "phagujarati",
- [0x0AAC] = "bagujarati",
- [0x0AAD] = "bhagujarati",
- [0x0AAE] = "magujarati",
- [0x0AAF] = "yagujarati",
- [0x0AB0] = "ragujarati",
- [0x0AB2] = "lagujarati",
- [0x0AB3] = "llagujarati",
- [0x0AB5] = "vagujarati",
- [0x0AB6] = "shagujarati",
- [0x0AB7] = "ssagujarati",
- [0x0AB8] = "sagujarati",
- [0x0AB9] = "hagujarati",
- [0x0ABC] = "nuktagujarati",
- [0x0ABE] = "aavowelsigngujarati",
- [0x0ABF] = "ivowelsigngujarati",
- [0x0AC0] = "iivowelsigngujarati",
- [0x0AC1] = "uvowelsigngujarati",
- [0x0AC2] = "uuvowelsigngujarati",
- [0x0AC3] = "rvocalicvowelsigngujarati",
- [0x0AC4] = "rrvocalicvowelsigngujarati",
- [0x0AC5] = "ecandravowelsigngujarati",
- [0x0AC7] = "evowelsigngujarati",
- [0x0AC8] = "aivowelsigngujarati",
- [0x0AC9] = "ocandravowelsigngujarati",
- [0x0ACB] = "ovowelsigngujarati",
- [0x0ACC] = "auvowelsigngujarati",
- [0x0ACD] = "viramagujarati",
- [0x0AD0] = "omgujarati",
- [0x0AE0] = "rrvocalicgujarati",
- [0x0AE6] = "zerogujarati",
- [0x0AE7] = "onegujarati",
- [0x0AE8] = "twogujarati",
- [0x0AE9] = "threegujarati",
- [0x0AEA] = "fourgujarati",
- [0x0AEB] = "fivegujarati",
- [0x0AEC] = "sixgujarati",
- [0x0AED] = "sevengujarati",
- [0x0AEE] = "eightgujarati",
- [0x0AEF] = "ninegujarati",
- [0x0E01] = "kokaithai",
- [0x0E02] = "khokhaithai",
- [0x0E03] = "khokhuatthai",
- [0x0E04] = "khokhwaithai",
- [0x0E05] = "khokhonthai",
- [0x0E06] = "khorakhangthai",
- [0x0E07] = "ngonguthai",
- [0x0E08] = "chochanthai",
- [0x0E09] = "chochingthai",
- [0x0E0A] = "chochangthai",
- [0x0E0B] = "sosothai",
- [0x0E0C] = "chochoethai",
- [0x0E0D] = "yoyingthai",
- [0x0E0E] = "dochadathai",
- [0x0E0F] = "topatakthai",
- [0x0E10] = "thothanthai",
- [0x0E11] = "thonangmonthothai",
- [0x0E12] = "thophuthaothai",
- [0x0E13] = "nonenthai",
- [0x0E14] = "dodekthai",
- [0x0E15] = "totaothai",
- [0x0E16] = "thothungthai",
- [0x0E17] = "thothahanthai",
- [0x0E18] = "thothongthai",
- [0x0E19] = "nonuthai",
- [0x0E1A] = "bobaimaithai",
- [0x0E1B] = "poplathai",
- [0x0E1C] = "phophungthai",
- [0x0E1D] = "fofathai",
- [0x0E1E] = "phophanthai",
- [0x0E1F] = "fofanthai",
- [0x0E20] = "phosamphaothai",
- [0x0E21] = "momathai",
- [0x0E22] = "yoyakthai",
- [0x0E23] = "roruathai",
- [0x0E24] = "ruthai",
- [0x0E25] = "lolingthai",
- [0x0E26] = "luthai",
- [0x0E27] = "wowaenthai",
- [0x0E28] = "sosalathai",
- [0x0E29] = "sorusithai",
- [0x0E2A] = "sosuathai",
- [0x0E2B] = "hohipthai",
- [0x0E2C] = "lochulathai",
- [0x0E2D] = "oangthai",
- [0x0E2E] = "honokhukthai",
- [0x0E2F] = "paiyannoithai",
- [0x0E30] = "saraathai",
- [0x0E31] = "maihanakatthai",
- [0x0E32] = "saraaathai",
- [0x0E33] = "saraamthai",
- [0x0E34] = "saraithai",
- [0x0E35] = "saraiithai",
- [0x0E36] = "sarauethai",
- [0x0E37] = "saraueethai",
- [0x0E38] = "sarauthai",
- [0x0E39] = "sarauuthai",
- [0x0E3A] = "phinthuthai",
- [0x0E3F] = "bahtthai",
- [0x0E40] = "saraethai",
- [0x0E41] = "saraaethai",
- [0x0E42] = "saraothai",
- [0x0E43] = "saraaimaimuanthai",
- [0x0E44] = "saraaimaimalaithai",
- [0x0E45] = "lakkhangyaothai",
- [0x0E46] = "maiyamokthai",
- [0x0E47] = "maitaikhuthai",
- [0x0E48] = "maiekthai",
- [0x0E49] = "maithothai",
- [0x0E4A] = "maitrithai",
- [0x0E4B] = "maichattawathai",
- [0x0E4C] = "thanthakhatthai",
- [0x0E4D] = "nikhahitthai",
- [0x0E4E] = "yamakkanthai",
- [0x0E4F] = "fongmanthai",
- [0x0E50] = "zerothai",
- [0x0E51] = "onethai",
- [0x0E52] = "twothai",
- [0x0E53] = "threethai",
- [0x0E54] = "fourthai",
- [0x0E55] = "fivethai",
- [0x0E56] = "sixthai",
- [0x0E57] = "seventhai",
- [0x0E58] = "eightthai",
- [0x0E59] = "ninethai",
- [0x0E5A] = "angkhankhuthai",
- [0x0E5B] = "khomutthai",
- [0x1E00] = "Aringbelow",
- [0x1E01] = "aringbelow",
- [0x1E02] = "Bdotaccent",
- [0x1E03] = "bdotaccent",
- [0x1E04] = "Bdotbelow",
- [0x1E05] = "bdotbelow",
- [0x1E06] = "Blinebelow",
- [0x1E07] = "blinebelow",
- [0x1E08] = "Ccedillaacute",
- [0x1E09] = "ccedillaacute",
- [0x1E0A] = "Ddotaccent",
- [0x1E0B] = "ddotaccent",
- [0x1E0C] = "Ddotbelow",
- [0x1E0D] = "ddotbelow",
- [0x1E0E] = "Dlinebelow",
- [0x1E0F] = "dlinebelow",
- [0x1E10] = "Dcedilla",
- [0x1E11] = "dcedilla",
- [0x1E12] = "Dcircumflexbelow",
- [0x1E13] = "dcircumflexbelow",
- [0x1E14] = "Emacrongrave",
- [0x1E15] = "emacrongrave",
- [0x1E16] = "Emacronacute",
- [0x1E17] = "emacronacute",
- [0x1E18] = "Ecircumflexbelow",
- [0x1E19] = "ecircumflexbelow",
- [0x1E1A] = "Etildebelow",
- [0x1E1B] = "etildebelow",
- [0x1E1C] = "Ecedillabreve",
- [0x1E1D] = "ecedillabreve",
- [0x1E1E] = "Fdotaccent",
- [0x1E1F] = "fdotaccent",
- [0x1E20] = "Gmacron",
- [0x1E21] = "gmacron",
- [0x1E22] = "Hdotaccent",
- [0x1E23] = "hdotaccent",
- [0x1E24] = "Hdotbelow",
- [0x1E25] = "hdotbelow",
- [0x1E26] = "Hdieresis",
- [0x1E27] = "hdieresis",
- [0x1E28] = "Hcedilla",
- [0x1E29] = "hcedilla",
- [0x1E2A] = "Hbrevebelow",
- [0x1E2B] = "hbrevebelow",
- [0x1E2C] = "Itildebelow",
- [0x1E2D] = "itildebelow",
- [0x1E2E] = "Idieresisacute",
- [0x1E2F] = "idieresisacute",
- [0x1E30] = "Kacute",
- [0x1E31] = "kacute",
- [0x1E32] = "Kdotbelow",
- [0x1E33] = "kdotbelow",
- [0x1E34] = "Klinebelow",
- [0x1E35] = "klinebelow",
- [0x1E36] = "Ldotbelow",
- [0x1E37] = "ldotbelow",
- [0x1E38] = "Ldotbelowmacron",
- [0x1E39] = "ldotbelowmacron",
- [0x1E3A] = "Llinebelow",
- [0x1E3B] = "llinebelow",
- [0x1E3C] = "Lcircumflexbelow",
- [0x1E3D] = "lcircumflexbelow",
- [0x1E3E] = "Macute",
- [0x1E3F] = "macute",
- [0x1E40] = "Mdotaccent",
- [0x1E41] = "mdotaccent",
- [0x1E42] = "Mdotbelow",
- [0x1E43] = "mdotbelow",
- [0x1E44] = "Ndotaccent",
- [0x1E45] = "ndotaccent",
- [0x1E46] = "Ndotbelow",
- [0x1E47] = "ndotbelow",
- [0x1E48] = "Nlinebelow",
- [0x1E49] = "nlinebelow",
- [0x1E4A] = "Ncircumflexbelow",
- [0x1E4B] = "ncircumflexbelow",
- [0x1E4C] = "Otildeacute",
- [0x1E4D] = "otildeacute",
- [0x1E4E] = "Otildedieresis",
- [0x1E4F] = "otildedieresis",
- [0x1E50] = "Omacrongrave",
- [0x1E51] = "omacrongrave",
- [0x1E52] = "Omacronacute",
- [0x1E53] = "omacronacute",
- [0x1E54] = "Pacute",
- [0x1E55] = "pacute",
- [0x1E56] = "Pdotaccent",
- [0x1E57] = "pdotaccent",
- [0x1E58] = "Rdotaccent",
- [0x1E59] = "rdotaccent",
- [0x1E5A] = "Rdotbelow",
- [0x1E5B] = "rdotbelow",
- [0x1E5C] = "Rdotbelowmacron",
- [0x1E5D] = "rdotbelowmacron",
- [0x1E5E] = "Rlinebelow",
- [0x1E5F] = "rlinebelow",
- [0x1E60] = "Sdotaccent",
- [0x1E61] = "sdotaccent",
- [0x1E62] = "Sdotbelow",
- [0x1E63] = "sdotbelow",
- [0x1E64] = "Sacutedotaccent",
- [0x1E65] = "sacutedotaccent",
- [0x1E66] = "Scarondotaccent",
- [0x1E67] = "scarondotaccent",
- [0x1E68] = "Sdotbelowdotaccent",
- [0x1E69] = "sdotbelowdotaccent",
- [0x1E6A] = "Tdotaccent",
- [0x1E6B] = "tdotaccent",
- [0x1E6C] = "Tdotbelow",
- [0x1E6D] = "tdotbelow",
- [0x1E6E] = "Tlinebelow",
- [0x1E6F] = "tlinebelow",
- [0x1E70] = "Tcircumflexbelow",
- [0x1E71] = "tcircumflexbelow",
- [0x1E72] = "Udieresisbelow",
- [0x1E73] = "udieresisbelow",
- [0x1E74] = "Utildebelow",
- [0x1E75] = "utildebelow",
- [0x1E76] = "Ucircumflexbelow",
- [0x1E77] = "ucircumflexbelow",
- [0x1E78] = "Utildeacute",
- [0x1E79] = "utildeacute",
- [0x1E7A] = "Umacrondieresis",
- [0x1E7B] = "umacrondieresis",
- [0x1E7C] = "Vtilde",
- [0x1E7D] = "vtilde",
- [0x1E7E] = "Vdotbelow",
- [0x1E7F] = "vdotbelow",
- [0x1E80] = "Wgrave",
- [0x1E81] = "wgrave",
- [0x1E82] = "Wacute",
- [0x1E83] = "wacute",
- [0x1E84] = "Wdieresis",
- [0x1E85] = "wdieresis",
- [0x1E86] = "Wdotaccent",
- [0x1E87] = "wdotaccent",
- [0x1E88] = "Wdotbelow",
- [0x1E89] = "wdotbelow",
- [0x1E8A] = "Xdotaccent",
- [0x1E8B] = "xdotaccent",
- [0x1E8C] = "Xdieresis",
- [0x1E8D] = "xdieresis",
- [0x1E8E] = "Ydotaccent",
- [0x1E8F] = "ydotaccent",
- [0x1E90] = "Zcircumflex",
- [0x1E91] = "zcircumflex",
- [0x1E92] = "Zdotbelow",
- [0x1E93] = "zdotbelow",
- [0x1E94] = "Zlinebelow",
- [0x1E95] = "zlinebelow",
- [0x1E96] = "hlinebelow",
- [0x1E97] = "tdieresis",
- [0x1E98] = "wring",
- [0x1E99] = "yring",
- [0x1E9A] = "arighthalfring",
- [0x1E9B] = "slongdotaccent",
- [0x1EA0] = "Adotbelow",
- [0x1EA1] = "adotbelow",
- [0x1EA2] = "Ahookabove",
- [0x1EA3] = "ahookabove",
- [0x1EA4] = "Acircumflexacute",
- [0x1EA5] = "acircumflexacute",
- [0x1EA6] = "Acircumflexgrave",
- [0x1EA7] = "acircumflexgrave",
- [0x1EA8] = "Acircumflexhookabove",
- [0x1EA9] = "acircumflexhookabove",
- [0x1EAA] = "Acircumflextilde",
- [0x1EAB] = "acircumflextilde",
- [0x1EAC] = "Acircumflexdotbelow",
- [0x1EAD] = "acircumflexdotbelow",
- [0x1EAE] = "Abreveacute",
- [0x1EAF] = "abreveacute",
- [0x1EB0] = "Abrevegrave",
- [0x1EB1] = "abrevegrave",
- [0x1EB2] = "Abrevehookabove",
- [0x1EB3] = "abrevehookabove",
- [0x1EB4] = "Abrevetilde",
- [0x1EB5] = "abrevetilde",
- [0x1EB6] = "Abrevedotbelow",
- [0x1EB7] = "abrevedotbelow",
- [0x1EB8] = "Edotbelow",
- [0x1EB9] = "edotbelow",
- [0x1EBA] = "Ehookabove",
- [0x1EBB] = "ehookabove",
- [0x1EBC] = "Etilde",
- [0x1EBD] = "etilde",
- [0x1EBE] = "Ecircumflexacute",
- [0x1EBF] = "ecircumflexacute",
- [0x1EC0] = "Ecircumflexgrave",
- [0x1EC1] = "ecircumflexgrave",
- [0x1EC2] = "Ecircumflexhookabove",
- [0x1EC3] = "ecircumflexhookabove",
- [0x1EC4] = "Ecircumflextilde",
- [0x1EC5] = "ecircumflextilde",
- [0x1EC6] = "Ecircumflexdotbelow",
- [0x1EC7] = "ecircumflexdotbelow",
- [0x1EC8] = "Ihookabove",
- [0x1EC9] = "ihookabove",
- [0x1ECA] = "Idotbelow",
- [0x1ECB] = "idotbelow",
- [0x1ECC] = "Odotbelow",
- [0x1ECD] = "odotbelow",
- [0x1ECE] = "Ohookabove",
- [0x1ECF] = "ohookabove",
- [0x1ED0] = "Ocircumflexacute",
- [0x1ED1] = "ocircumflexacute",
- [0x1ED2] = "Ocircumflexgrave",
- [0x1ED3] = "ocircumflexgrave",
- [0x1ED4] = "Ocircumflexhookabove",
- [0x1ED5] = "ocircumflexhookabove",
- [0x1ED6] = "Ocircumflextilde",
- [0x1ED7] = "ocircumflextilde",
- [0x1ED8] = "Ocircumflexdotbelow",
- [0x1ED9] = "ocircumflexdotbelow",
- [0x1EDA] = "Ohornacute",
- [0x1EDB] = "ohornacute",
- [0x1EDC] = "Ohorngrave",
- [0x1EDD] = "ohorngrave",
- [0x1EDE] = "Ohornhookabove",
- [0x1EDF] = "ohornhookabove",
- [0x1EE0] = "Ohorntilde",
- [0x1EE1] = "ohorntilde",
- [0x1EE2] = "Ohorndotbelow",
- [0x1EE3] = "ohorndotbelow",
- [0x1EE4] = "Udotbelow",
- [0x1EE5] = "udotbelow",
- [0x1EE6] = "Uhookabove",
- [0x1EE7] = "uhookabove",
- [0x1EE8] = "Uhornacute",
- [0x1EE9] = "uhornacute",
- [0x1EEA] = "Uhorngrave",
- [0x1EEB] = "uhorngrave",
- [0x1EEC] = "Uhornhookabove",
- [0x1EED] = "uhornhookabove",
- [0x1EEE] = "Uhorntilde",
- [0x1EEF] = "uhorntilde",
- [0x1EF0] = "Uhorndotbelow",
- [0x1EF1] = "uhorndotbelow",
- [0x1EF2] = "Ygrave",
- [0x1EF3] = "ygrave",
- [0x1EF4] = "Ydotbelow",
- [0x1EF5] = "ydotbelow",
- [0x1EF6] = "Yhookabove",
- [0x1EF7] = "yhookabove",
- [0x1EF8] = "Ytilde",
- [0x1EF9] = "ytilde",
- [0x2002] = "enspace",
- [0x200B] = "zerowidthspace",
- [0x200C] = "zerowidthnonjoiner",
- [0x200D] = "afii301",
- [0x200E] = "afii299",
- [0x200F] = "afii300",
- [0x2010] = "hyphentwo",
- [0x2012] = "figuredash",
- [0x2013] = "endash",
- [0x2014] = "emdash",
- [0x2015] = "horizontalbar",
- [0x2016] = "dblverticalbar",
- [0x2017] = "underscoredbl",
- [0x2018] = "quoteleft",
- [0x2019] = "quoteright",
- [0x201A] = "quotesinglbase",
- [0x201B] = "quotereversed",
- [0x201C] = "quotedblleft",
- [0x201D] = "quotedblright",
- [0x201E] = "quotedblbase",
- [0x2020] = "dagger",
- [0x2021] = "daggerdbl",
- [0x2022] = "bullet",
- [0x2024] = "onedotenleader",
- [0x2025] = "twodotleader",
- [0x2026] = "ellipsis",
- [0x202C] = "afii61573",
- [0x202D] = "afii61574",
- [0x202E] = "afii61575",
- [0x2030] = "perthousand",
- [0x2032] = "minute",
- [0x2033] = "second",
- [0x2035] = "primereversed",
- [0x2039] = "guilsinglleft",
- [0x203A] = "guilsinglright",
- [0x203B] = "referencemark",
- [0x203C] = "exclamdbl",
- [0x203E] = "overline",
- [0x2042] = "asterism",
- [0x2044] = "fraction",
- [0x2070] = "zerosuperior",
- [0x2074] = "foursuperior",
- [0x2075] = "fivesuperior",
- [0x2076] = "sixsuperior",
- [0x2077] = "sevensuperior",
- [0x2078] = "eightsuperior",
- [0x2079] = "ninesuperior",
- [0x207A] = "plussuperior",
- [0x207C] = "equalsuperior",
- [0x207D] = "parenleftsuperior",
- [0x207E] = "parenrightsuperior",
- [0x207F] = "nsuperior",
- [0x2080] = "zeroinferior",
- [0x2081] = "oneinferior",
- [0x2082] = "twoinferior",
- [0x2083] = "threeinferior",
- [0x2084] = "fourinferior",
- [0x2085] = "fiveinferior",
- [0x2086] = "sixinferior",
- [0x2087] = "seveninferior",
- [0x2088] = "eightinferior",
- [0x2089] = "nineinferior",
- [0x208D] = "parenleftinferior",
- [0x208E] = "parenrightinferior",
- [0x20A1] = "colonsign",
- [0x20A2] = "cruzeiro",
- [0x20A3] = "franc",
- [0x20A4] = "lira",
- [0x20A7] = "peseta",
- [0x20A9] = "won",
- [0x20AA] = "sheqelhebrew",
- [0x20AB] = "dong",
- [0x20AC] = "euro",
- [0x2103] = "centigrade",
- [0x2105] = "careof",
- [0x2109] = "fahrenheit",
- [0x2111] = "Ifraktur",
- [0x2113] = "lsquare",
- [0x2116] = "numero",
- [0x2118] = "weierstrass",
- [0x211C] = "Rfraktur",
- [0x211E] = "prescription",
- [0x2121] = "telephone",
- [0x2122] = "trademark",
- [0x2126] = "Omega",
- [0x212B] = "angstrom",
- [0x212E] = "estimated",
- [0x2135] = "aleph",
- [0x2153] = "onethird",
- [0x2154] = "twothirds",
- [0x215B] = "oneeighth",
- [0x215C] = "threeeighths",
- [0x215D] = "fiveeighths",
- [0x215E] = "seveneighths",
- [0x2160] = "Oneroman",
- [0x2161] = "Tworoman",
- [0x2162] = "Threeroman",
- [0x2163] = "Fourroman",
- [0x2164] = "Fiveroman",
- [0x2165] = "Sixroman",
- [0x2166] = "Sevenroman",
- [0x2167] = "Eightroman",
- [0x2168] = "Nineroman",
- [0x2169] = "Tenroman",
- [0x216A] = "Elevenroman",
- [0x216B] = "Twelveroman",
- [0x2170] = "oneroman",
- [0x2171] = "tworoman",
- [0x2172] = "threeroman",
- [0x2173] = "fourroman",
- [0x2174] = "fiveroman",
- [0x2175] = "sixroman",
- [0x2176] = "sevenroman",
- [0x2177] = "eightroman",
- [0x2178] = "nineroman",
- [0x2179] = "tenroman",
- [0x217A] = "elevenroman",
- [0x217B] = "twelveroman",
- [0x2190] = "arrowleft",
- [0x2191] = "arrowup",
- [0x2192] = "arrowright",
- [0x2193] = "arrowdown",
- [0x2194] = "arrowboth",
- [0x2195] = "arrowupdn",
- [0x2196] = "arrowupleft",
- [0x2197] = "arrowupright",
- [0x2198] = "arrowdownright",
- [0x2199] = "arrowdownleft",
- [0x21A8] = "arrowupdownbase",
- [0x21B5] = "carriagereturn",
- [0x21BC] = "harpoonleftbarbup",
- [0x21C0] = "harpoonrightbarbup",
- [0x21C4] = "arrowrightoverleft",
- [0x21C5] = "arrowupleftofdown",
- [0x21C6] = "arrowleftoverright",
- [0x21CD] = "arrowleftdblstroke",
- [0x21CF] = "arrowrightdblstroke",
- [0x21D0] = "arrowleftdbl",
- [0x21D1] = "arrowdblup",
- [0x21D2] = "dblarrowright",
- [0x21D3] = "arrowdbldown",
- [0x21D4] = "dblarrowleft",
- [0x21DE] = "pageup",
- [0x21DF] = "pagedown",
- [0x21E0] = "arrowdashleft",
- [0x21E1] = "arrowdashup",
- [0x21E2] = "arrowdashright",
- [0x21E3] = "arrowdashdown",
- [0x21E4] = "arrowtableft",
- [0x21E5] = "arrowtabright",
- [0x21E6] = "arrowleftwhite",
- [0x21E7] = "arrowupwhite",
- [0x21E8] = "arrowrightwhite",
- [0x21E9] = "arrowdownwhite",
- [0x21EA] = "capslock",
- [0x2200] = "universal",
- [0x2202] = "partialdiff",
- [0x2203] = "thereexists",
- [0x2205] = "emptyset",
- [0x2206] = "increment",
- [0x2207] = "nabla",
- [0x2208] = "element",
- [0x2209] = "notelementof",
- [0x220B] = "suchthat",
- [0x220C] = "notcontains",
- [0x220F] = "product",
- [0x2211] = "summation",
- [0x2212] = "minus",
- [0x2213] = "minusplus",
- [0x2215] = "divisionslash",
- [0x2217] = "asteriskmath",
- [0x2219] = "bulletoperator",
- [0x221A] = "radical",
- [0x221D] = "proportional",
- [0x221E] = "infinity",
- [0x221F] = "rightangle",
- [0x2220] = "angle",
- [0x2223] = "divides",
- [0x2225] = "parallel",
- [0x2226] = "notparallel",
- [0x2227] = "logicaland",
- [0x2228] = "logicalor",
- [0x2229] = "intersection",
- [0x222A] = "union",
- [0x222B] = "integral",
- [0x222C] = "dblintegral",
- [0x222E] = "contourintegral",
- [0x2234] = "therefore",
- [0x2235] = "because",
- [0x2236] = "ratio",
- [0x2237] = "proportion",
- [0x223C] = "tildeoperator",
- [0x223D] = "reversedtilde",
- [0x2243] = "asymptoticallyequal",
- [0x2245] = "congruent",
- [0x2248] = "approxequal",
- [0x224C] = "allequal",
- [0x2250] = "approaches",
- [0x2251] = "geometricallyequal",
- [0x2252] = "approxequalorimage",
- [0x2253] = "imageorapproximatelyequal",
- [0x2260] = "notequal",
- [0x2261] = "equivalence",
- [0x2262] = "notidentical",
- [0x2264] = "lessequal",
- [0x2265] = "greaterequal",
- [0x2266] = "lessoverequal",
- [0x2267] = "greateroverequal",
- [0x226A] = "muchless",
- [0x226B] = "muchgreater",
- [0x226E] = "notless",
- [0x226F] = "notgreater",
- [0x2270] = "notlessnorequal",
- [0x2271] = "notgreaternorequal",
- [0x2272] = "lessorequivalent",
- [0x2273] = "greaterorequivalent",
- [0x2276] = "lessorgreater",
- [0x2277] = "greaterorless",
- [0x2279] = "notgreaternorless",
- [0x227A] = "precedes",
- [0x227B] = "succeeds",
- [0x2280] = "notprecedes",
- [0x2281] = "notsucceeds",
- [0x2282] = "subset",
- [0x2283] = "superset",
- [0x2284] = "notsubset",
- [0x2285] = "notsuperset",
- [0x2286] = "subsetorequal",
- [0x2287] = "supersetorequal",
- [0x228A] = "subsetnotequal",
- [0x228B] = "supersetnotequal",
- [0x2295] = "pluscircle",
- [0x2296] = "minuscircle",
- [0x2297] = "timescircle",
- [0x2299] = "circleot",
- [0x22A3] = "tackleft",
- [0x22A4] = "tackdown",
- [0x22A5] = "perpendicular",
- [0x22BF] = "righttriangle",
- [0x22C5] = "dotmath",
- [0x22CE] = "curlyor",
- [0x22CF] = "curlyand",
- [0x22DA] = "lessequalorgreater",
- [0x22DB] = "greaterequalorless",
- [0x22EE] = "ellipsisvertical",
- [0x2302] = "house",
- [0x2303] = "control",
- [0x2305] = "projective",
- [0x2310] = "revlogicalnot",
- [0x2312] = "arc",
- [0x2318] = "propellor",
- [0x2320] = "integraltp",
- [0x2321] = "integralbt",
- [0x2325] = "option",
- [0x2326] = "deleteright",
- [0x2327] = "clear",
- [0x2329] = "angleleft",
- [0x232A] = "angleright",
- [0x232B] = "deleteleft",
- [0x2423] = "blank",
- [0x2460] = "onecircle",
- [0x2461] = "twocircle",
- [0x2462] = "threecircle",
- [0x2463] = "fourcircle",
- [0x2464] = "fivecircle",
- [0x2465] = "sixcircle",
- [0x2466] = "sevencircle",
- [0x2467] = "eightcircle",
- [0x2468] = "ninecircle",
- [0x2469] = "tencircle",
- [0x246A] = "elevencircle",
- [0x246B] = "twelvecircle",
- [0x246C] = "thirteencircle",
- [0x246D] = "fourteencircle",
- [0x246E] = "fifteencircle",
- [0x246F] = "sixteencircle",
- [0x2470] = "seventeencircle",
- [0x2471] = "eighteencircle",
- [0x2472] = "nineteencircle",
- [0x2473] = "twentycircle",
- [0x2474] = "oneparen",
- [0x2475] = "twoparen",
- [0x2476] = "threeparen",
- [0x2477] = "fourparen",
- [0x2478] = "fiveparen",
- [0x2479] = "sixparen",
- [0x247A] = "sevenparen",
- [0x247B] = "eightparen",
- [0x247C] = "nineparen",
- [0x247D] = "tenparen",
- [0x247E] = "elevenparen",
- [0x247F] = "twelveparen",
- [0x2480] = "thirteenparen",
- [0x2481] = "fourteenparen",
- [0x2482] = "fifteenparen",
- [0x2483] = "sixteenparen",
- [0x2484] = "seventeenparen",
- [0x2485] = "eighteenparen",
- [0x2486] = "nineteenparen",
- [0x2487] = "twentyparen",
- [0x2488] = "oneperiod",
- [0x2489] = "twoperiod",
- [0x248A] = "threeperiod",
- [0x248B] = "fourperiod",
- [0x248C] = "fiveperiod",
- [0x248D] = "sixperiod",
- [0x248E] = "sevenperiod",
- [0x248F] = "eightperiod",
- [0x2490] = "nineperiod",
- [0x2491] = "tenperiod",
- [0x2492] = "elevenperiod",
- [0x2493] = "twelveperiod",
- [0x2494] = "thirteenperiod",
- [0x2495] = "fourteenperiod",
- [0x2496] = "fifteenperiod",
- [0x2497] = "sixteenperiod",
- [0x2498] = "seventeenperiod",
- [0x2499] = "eighteenperiod",
- [0x249A] = "nineteenperiod",
- [0x249B] = "twentyperiod",
- [0x249C] = "aparen",
- [0x249D] = "bparen",
- [0x249E] = "cparen",
- [0x249F] = "dparen",
- [0x24A0] = "eparen",
- [0x24A1] = "fparen",
- [0x24A2] = "gparen",
- [0x24A3] = "hparen",
- [0x24A4] = "iparen",
- [0x24A5] = "jparen",
- [0x24A6] = "kparen",
- [0x24A7] = "lparen",
- [0x24A8] = "mparen",
- [0x24A9] = "nparen",
- [0x24AA] = "oparen",
- [0x24AB] = "pparen",
- [0x24AC] = "qparen",
- [0x24AD] = "rparen",
- [0x24AE] = "sparen",
- [0x24AF] = "tparen",
- [0x24B0] = "uparen",
- [0x24B1] = "vparen",
- [0x24B2] = "wparen",
- [0x24B3] = "xparen",
- [0x24B4] = "yparen",
- [0x24B5] = "zparen",
- [0x24B6] = "Acircle",
- [0x24B7] = "Bcircle",
- [0x24B8] = "Ccircle",
- [0x24B9] = "Dcircle",
- [0x24BA] = "Ecircle",
- [0x24BB] = "Fcircle",
- [0x24BC] = "Gcircle",
- [0x24BD] = "Hcircle",
- [0x24BE] = "Icircle",
- [0x24BF] = "Jcircle",
- [0x24C0] = "Kcircle",
- [0x24C1] = "Lcircle",
- [0x24C2] = "Mcircle",
- [0x24C3] = "Ncircle",
- [0x24C4] = "Ocircle",
- [0x24C5] = "Pcircle",
- [0x24C6] = "Qcircle",
- [0x24C7] = "Rcircle",
- [0x24C8] = "Scircle",
- [0x24C9] = "Tcircle",
- [0x24CA] = "Ucircle",
- [0x24CB] = "Vcircle",
- [0x24CC] = "Wcircle",
- [0x24CD] = "Xcircle",
- [0x24CE] = "Ycircle",
- [0x24CF] = "Zcircle",
- [0x24D0] = "acircle",
- [0x24D1] = "bcircle",
- [0x24D2] = "ccircle",
- [0x24D3] = "dcircle",
- [0x24D4] = "ecircle",
- [0x24D5] = "fcircle",
- [0x24D6] = "gcircle",
- [0x24D7] = "hcircle",
- [0x24D8] = "icircle",
- [0x24D9] = "jcircle",
- [0x24DA] = "kcircle",
- [0x24DB] = "lcircle",
- [0x24DC] = "mcircle",
- [0x24DD] = "ncircle",
- [0x24DE] = "ocircle",
- [0x24DF] = "pcircle",
- [0x24E0] = "qcircle",
- [0x24E1] = "rcircle",
- [0x24E2] = "scircle",
- [0x24E3] = "tcircle",
- [0x24E4] = "ucircle",
- [0x24E5] = "vcircle",
- [0x24E6] = "wcircle",
- [0x24E7] = "xcircle",
- [0x24E8] = "ycircle",
- [0x24E9] = "zcircle",
- [0x2500] = "SF100000",
- [0x2502] = "SF110000",
- [0x250C] = "SF010000",
- [0x2510] = "SF030000",
- [0x2514] = "SF020000",
- [0x2518] = "SF040000",
- [0x251C] = "SF080000",
- [0x2524] = "SF090000",
- [0x252C] = "SF060000",
- [0x2534] = "SF070000",
- [0x253C] = "SF050000",
- [0x2550] = "SF430000",
- [0x2551] = "SF240000",
- [0x2552] = "SF510000",
- [0x2553] = "SF520000",
- [0x2554] = "SF390000",
- [0x2555] = "SF220000",
- [0x2556] = "SF210000",
- [0x2557] = "SF250000",
- [0x2558] = "SF500000",
- [0x2559] = "SF490000",
- [0x255A] = "SF380000",
- [0x255B] = "SF280000",
- [0x255C] = "SF270000",
- [0x255D] = "SF260000",
- [0x255E] = "SF360000",
- [0x255F] = "SF370000",
- [0x2560] = "SF420000",
- [0x2561] = "SF190000",
- [0x2562] = "SF200000",
- [0x2563] = "SF230000",
- [0x2564] = "SF470000",
- [0x2565] = "SF480000",
- [0x2566] = "SF410000",
- [0x2567] = "SF450000",
- [0x2568] = "SF460000",
- [0x2569] = "SF400000",
- [0x256A] = "SF540000",
- [0x256B] = "SF530000",
- [0x256C] = "SF440000",
- [0x2580] = "upblock",
- [0x2584] = "dnblock",
- [0x2588] = "block",
- [0x258C] = "lfblock",
- [0x2590] = "rtblock",
- [0x2591] = "shadelight",
- [0x2592] = "shademedium",
- [0x2593] = "shadedark",
- [0x25A0] = "filledbox",
- [0x25A1] = "whitesquare",
- [0x25A3] = "squarewhitewithsmallblack",
- [0x25A4] = "squarehorizontalfill",
- [0x25A5] = "squareverticalfill",
- [0x25A6] = "squareorthogonalcrosshatchfill",
- [0x25A7] = "squareupperlefttolowerrightfill",
- [0x25A8] = "squareupperrighttolowerleftfill",
- [0x25A9] = "squarediagonalcrosshatchfill",
- [0x25AA] = "blacksmallsquare",
- [0x25AB] = "whitesmallsquare",
- [0x25AC] = "filledrect",
- [0x25B2] = "triagup",
- [0x25B3] = "whiteuppointingtriangle",
- [0x25B4] = "blackuppointingsmalltriangle",
- [0x25B5] = "whiteuppointingsmalltriangle",
- [0x25B6] = "blackrightpointingtriangle",
- [0x25B7] = "whiterightpointingtriangle",
- [0x25B9] = "whiterightpointingsmalltriangle",
- [0x25BA] = "triagrt",
- [0x25BC] = "triagdn",
- [0x25BD] = "whitedownpointingtriangle",
- [0x25BF] = "whitedownpointingsmalltriangle",
- [0x25C0] = "blackleftpointingtriangle",
- [0x25C1] = "whiteleftpointingtriangle",
- [0x25C3] = "whiteleftpointingsmalltriangle",
- [0x25C4] = "triaglf",
- [0x25C6] = "blackdiamond",
- [0x25C7] = "whitediamond",
- [0x25C8] = "whitediamondcontainingblacksmalldiamond",
- [0x25C9] = "fisheye",
- [0x25CA] = "lozenge",
- [0x25CB] = "whitecircle",
- [0x25CC] = "dottedcircle",
- [0x25CE] = "bullseye",
- [0x25CF] = "blackcircle",
- [0x25D0] = "circlewithlefthalfblack",
- [0x25D1] = "circlewithrighthalfblack",
- [0x25D8] = "invbullet",
- [0x25D9] = "whitecircleinverse",
- [0x25E2] = "blacklowerrighttriangle",
- [0x25E3] = "blacklowerlefttriangle",
- [0x25E4] = "blackupperlefttriangle",
- [0x25E5] = "blackupperrighttriangle",
- [0x25E6] = "whitebullet",
- [0x25EF] = "largecircle",
- [0x2605] = "blackstar",
- [0x2606] = "whitestar",
- [0x260E] = "telephoneblack",
- [0x260F] = "whitetelephone",
- [0x261C] = "pointingindexleftwhite",
- [0x261D] = "pointingindexupwhite",
- [0x261E] = "pointingindexrightwhite",
- [0x261F] = "pointingindexdownwhite",
- [0x262F] = "yinyang",
- [0x263A] = "whitesmilingface",
- [0x263B] = "invsmileface",
- [0x263C] = "sun",
- [0x2640] = "venus",
- [0x2641] = "earth",
- [0x2642] = "mars",
- [0x2660] = "spadesuitblack",
- [0x2661] = "heartsuitwhite",
- [0x2662] = "diamondsuitwhite",
- [0x2663] = "clubsuitblack",
- [0x2664] = "spadesuitwhite",
- [0x2665] = "heartsuitblack",
- [0x2666] = "diamond",
- [0x2667] = "clubsuitwhite",
- [0x2668] = "hotsprings",
- [0x2669] = "quarternote",
- [0x266A] = "musicalnote",
- [0x266B] = "musicalnotedbl",
- [0x266C] = "beamedsixteenthnotes",
- [0x266D] = "musicflatsign",
- [0x266F] = "musicsharpsign",
- [0x2713] = "checkmark",
- [0x278A] = "onecircleinversesansserif",
- [0x278B] = "twocircleinversesansserif",
- [0x278C] = "threecircleinversesansserif",
- [0x278D] = "fourcircleinversesansserif",
- [0x278E] = "fivecircleinversesansserif",
- [0x278F] = "sixcircleinversesansserif",
- [0x2790] = "sevencircleinversesansserif",
- [0x2791] = "eightcircleinversesansserif",
- [0x2792] = "ninecircleinversesansserif",
- [0x279E] = "arrowrightheavy",
- [0x3000] = "ideographicspace",
- [0x3001] = "ideographiccomma",
- [0x3002] = "ideographicperiod",
- [0x3003] = "dittomark",
- [0x3004] = "jis",
- [0x3005] = "ideographiciterationmark",
- [0x3006] = "ideographicclose",
- [0x3007] = "ideographiczero",
- [0x3008] = "anglebracketleft",
- [0x3009] = "anglebracketright",
- [0x300A] = "dblanglebracketleft",
- [0x300B] = "dblanglebracketright",
- [0x300C] = "cornerbracketleft",
- [0x300D] = "cornerbracketright",
- [0x300E] = "whitecornerbracketleft",
- [0x300F] = "whitecornerbracketright",
- [0x3010] = "blacklenticularbracketleft",
- [0x3011] = "blacklenticularbracketright",
- [0x3012] = "postalmark",
- [0x3013] = "getamark",
- [0x3014] = "tortoiseshellbracketleft",
- [0x3015] = "tortoiseshellbracketright",
- [0x3016] = "whitelenticularbracketleft",
- [0x3017] = "whitelenticularbracketright",
- [0x3018] = "whitetortoiseshellbracketleft",
- [0x3019] = "whitetortoiseshellbracketright",
- [0x301C] = "wavedash",
- [0x301D] = "quotedblprimereversed",
- [0x301E] = "quotedblprime",
- [0x3020] = "postalmarkface",
- [0x3021] = "onehangzhou",
- [0x3022] = "twohangzhou",
- [0x3023] = "threehangzhou",
- [0x3024] = "fourhangzhou",
- [0x3025] = "fivehangzhou",
- [0x3026] = "sixhangzhou",
- [0x3027] = "sevenhangzhou",
- [0x3028] = "eighthangzhou",
- [0x3029] = "ninehangzhou",
- [0x3036] = "circlepostalmark",
- [0x3041] = "asmallhiragana",
- [0x3042] = "ahiragana",
- [0x3043] = "ismallhiragana",
- [0x3044] = "ihiragana",
- [0x3045] = "usmallhiragana",
- [0x3046] = "uhiragana",
- [0x3047] = "esmallhiragana",
- [0x3048] = "ehiragana",
- [0x3049] = "osmallhiragana",
- [0x304A] = "ohiragana",
- [0x304B] = "kahiragana",
- [0x304C] = "gahiragana",
- [0x304D] = "kihiragana",
- [0x304E] = "gihiragana",
- [0x304F] = "kuhiragana",
- [0x3050] = "guhiragana",
- [0x3051] = "kehiragana",
- [0x3052] = "gehiragana",
- [0x3053] = "kohiragana",
- [0x3054] = "gohiragana",
- [0x3055] = "sahiragana",
- [0x3056] = "zahiragana",
- [0x3057] = "sihiragana",
- [0x3058] = "zihiragana",
- [0x3059] = "suhiragana",
- [0x305A] = "zuhiragana",
- [0x305B] = "sehiragana",
- [0x305C] = "zehiragana",
- [0x305D] = "sohiragana",
- [0x305E] = "zohiragana",
- [0x305F] = "tahiragana",
- [0x3060] = "dahiragana",
- [0x3061] = "tihiragana",
- [0x3062] = "dihiragana",
- [0x3063] = "tusmallhiragana",
- [0x3064] = "tuhiragana",
- [0x3065] = "duhiragana",
- [0x3066] = "tehiragana",
- [0x3067] = "dehiragana",
- [0x3068] = "tohiragana",
- [0x3069] = "dohiragana",
- [0x306A] = "nahiragana",
- [0x306B] = "nihiragana",
- [0x306C] = "nuhiragana",
- [0x306D] = "nehiragana",
- [0x306E] = "nohiragana",
- [0x306F] = "hahiragana",
- [0x3070] = "bahiragana",
- [0x3071] = "pahiragana",
- [0x3072] = "hihiragana",
- [0x3073] = "bihiragana",
- [0x3074] = "pihiragana",
- [0x3075] = "huhiragana",
- [0x3076] = "buhiragana",
- [0x3077] = "puhiragana",
- [0x3078] = "hehiragana",
- [0x3079] = "behiragana",
- [0x307A] = "pehiragana",
- [0x307B] = "hohiragana",
- [0x307C] = "bohiragana",
- [0x307D] = "pohiragana",
- [0x307E] = "mahiragana",
- [0x307F] = "mihiragana",
- [0x3080] = "muhiragana",
- [0x3081] = "mehiragana",
- [0x3082] = "mohiragana",
- [0x3083] = "yasmallhiragana",
- [0x3084] = "yahiragana",
- [0x3085] = "yusmallhiragana",
- [0x3086] = "yuhiragana",
- [0x3087] = "yosmallhiragana",
- [0x3088] = "yohiragana",
- [0x3089] = "rahiragana",
- [0x308A] = "rihiragana",
- [0x308B] = "ruhiragana",
- [0x308C] = "rehiragana",
- [0x308D] = "rohiragana",
- [0x308E] = "wasmallhiragana",
- [0x308F] = "wahiragana",
- [0x3090] = "wihiragana",
- [0x3091] = "wehiragana",
- [0x3092] = "wohiragana",
- [0x3093] = "nhiragana",
- [0x3094] = "vuhiragana",
- [0x309B] = "voicedmarkkana",
- [0x309C] = "semivoicedmarkkana",
- [0x309D] = "iterationhiragana",
- [0x309E] = "voicediterationhiragana",
- [0x30A1] = "asmallkatakana",
- [0x30A2] = "akatakana",
- [0x30A3] = "ismallkatakana",
- [0x30A4] = "ikatakana",
- [0x30A5] = "usmallkatakana",
- [0x30A6] = "ukatakana",
- [0x30A7] = "esmallkatakana",
- [0x30A8] = "ekatakana",
- [0x30A9] = "osmallkatakana",
- [0x30AA] = "okatakana",
- [0x30AB] = "kakatakana",
- [0x30AC] = "gakatakana",
- [0x30AD] = "kikatakana",
- [0x30AE] = "gikatakana",
- [0x30AF] = "kukatakana",
- [0x30B0] = "gukatakana",
- [0x30B1] = "kekatakana",
- [0x30B2] = "gekatakana",
- [0x30B3] = "kokatakana",
- [0x30B4] = "gokatakana",
- [0x30B5] = "sakatakana",
- [0x30B6] = "zakatakana",
- [0x30B7] = "sikatakana",
- [0x30B8] = "zikatakana",
- [0x30B9] = "sukatakana",
- [0x30BA] = "zukatakana",
- [0x30BB] = "sekatakana",
- [0x30BC] = "zekatakana",
- [0x30BD] = "sokatakana",
- [0x30BE] = "zokatakana",
- [0x30BF] = "takatakana",
- [0x30C0] = "dakatakana",
- [0x30C1] = "tikatakana",
- [0x30C2] = "dikatakana",
- [0x30C3] = "tusmallkatakana",
- [0x30C4] = "tukatakana",
- [0x30C5] = "dukatakana",
- [0x30C6] = "tekatakana",
- [0x30C7] = "dekatakana",
- [0x30C8] = "tokatakana",
- [0x30C9] = "dokatakana",
- [0x30CA] = "nakatakana",
- [0x30CB] = "nikatakana",
- [0x30CC] = "nukatakana",
- [0x30CD] = "nekatakana",
- [0x30CE] = "nokatakana",
- [0x30CF] = "hakatakana",
- [0x30D0] = "bakatakana",
- [0x30D1] = "pakatakana",
- [0x30D2] = "hikatakana",
- [0x30D3] = "bikatakana",
- [0x30D4] = "pikatakana",
- [0x30D5] = "hukatakana",
- [0x30D6] = "bukatakana",
- [0x30D7] = "pukatakana",
- [0x30D8] = "hekatakana",
- [0x30D9] = "bekatakana",
- [0x30DA] = "pekatakana",
- [0x30DB] = "hokatakana",
- [0x30DC] = "bokatakana",
- [0x30DD] = "pokatakana",
- [0x30DE] = "makatakana",
- [0x30DF] = "mikatakana",
- [0x30E0] = "mukatakana",
- [0x30E1] = "mekatakana",
- [0x30E2] = "mokatakana",
- [0x30E3] = "yasmallkatakana",
- [0x30E4] = "yakatakana",
- [0x30E5] = "yusmallkatakana",
- [0x30E6] = "yukatakana",
- [0x30E7] = "yosmallkatakana",
- [0x30E8] = "yokatakana",
- [0x30E9] = "rakatakana",
- [0x30EA] = "rikatakana",
- [0x30EB] = "rukatakana",
- [0x30EC] = "rekatakana",
- [0x30ED] = "rokatakana",
- [0x30EE] = "wasmallkatakana",
- [0x30EF] = "wakatakana",
- [0x30F0] = "wikatakana",
- [0x30F1] = "wekatakana",
- [0x30F2] = "wokatakana",
- [0x30F3] = "nkatakana",
- [0x30F4] = "vukatakana",
- [0x30F5] = "kasmallkatakana",
- [0x30F6] = "kesmallkatakana",
- [0x30F7] = "vakatakana",
- [0x30F8] = "vikatakana",
- [0x30F9] = "vekatakana",
- [0x30FA] = "vokatakana",
- [0x30FB] = "dotkatakana",
- [0x30FC] = "prolongedkana",
- [0x30FD] = "iterationkatakana",
- [0x30FE] = "voicediterationkatakana",
- [0x3105] = "bbopomofo",
- [0x3106] = "pbopomofo",
- [0x3107] = "mbopomofo",
- [0x3108] = "fbopomofo",
- [0x3109] = "dbopomofo",
- [0x310A] = "tbopomofo",
- [0x310B] = "nbopomofo",
- [0x310C] = "lbopomofo",
- [0x310D] = "gbopomofo",
- [0x310E] = "kbopomofo",
- [0x310F] = "hbopomofo",
- [0x3110] = "jbopomofo",
- [0x3111] = "qbopomofo",
- [0x3112] = "xbopomofo",
- [0x3113] = "zhbopomofo",
- [0x3114] = "chbopomofo",
- [0x3115] = "shbopomofo",
- [0x3116] = "rbopomofo",
- [0x3117] = "zbopomofo",
- [0x3118] = "cbopomofo",
- [0x3119] = "sbopomofo",
- [0x311A] = "abopomofo",
- [0x311B] = "obopomofo",
- [0x311C] = "ebopomofo",
- [0x311D] = "ehbopomofo",
- [0x311E] = "aibopomofo",
- [0x311F] = "eibopomofo",
- [0x3120] = "aubopomofo",
- [0x3121] = "oubopomofo",
- [0x3122] = "anbopomofo",
- [0x3123] = "enbopomofo",
- [0x3124] = "angbopomofo",
- [0x3125] = "engbopomofo",
- [0x3126] = "erbopomofo",
- [0x3127] = "ibopomofo",
- [0x3128] = "ubopomofo",
- [0x3129] = "iubopomofo",
- [0x3131] = "kiyeokkorean",
- [0x3132] = "ssangkiyeokkorean",
- [0x3133] = "kiyeoksioskorean",
- [0x3134] = "nieunkorean",
- [0x3135] = "nieuncieuckorean",
- [0x3136] = "nieunhieuhkorean",
- [0x3137] = "tikeutkorean",
- [0x3138] = "ssangtikeutkorean",
- [0x3139] = "rieulkorean",
- [0x313A] = "rieulkiyeokkorean",
- [0x313B] = "rieulmieumkorean",
- [0x313C] = "rieulpieupkorean",
- [0x313D] = "rieulsioskorean",
- [0x313E] = "rieulthieuthkorean",
- [0x313F] = "rieulphieuphkorean",
- [0x3140] = "rieulhieuhkorean",
- [0x3141] = "mieumkorean",
- [0x3142] = "pieupkorean",
- [0x3143] = "ssangpieupkorean",
- [0x3144] = "pieupsioskorean",
- [0x3145] = "sioskorean",
- [0x3146] = "ssangsioskorean",
- [0x3147] = "ieungkorean",
- [0x3148] = "cieuckorean",
- [0x3149] = "ssangcieuckorean",
- [0x314A] = "chieuchkorean",
- [0x314B] = "khieukhkorean",
- [0x314C] = "thieuthkorean",
- [0x314D] = "phieuphkorean",
- [0x314E] = "hieuhkorean",
- [0x314F] = "akorean",
- [0x3150] = "aekorean",
- [0x3151] = "yakorean",
- [0x3152] = "yaekorean",
- [0x3153] = "eokorean",
- [0x3154] = "ekorean",
- [0x3155] = "yeokorean",
- [0x3156] = "yekorean",
- [0x3157] = "okorean",
- [0x3158] = "wakorean",
- [0x3159] = "waekorean",
- [0x315A] = "oekorean",
- [0x315B] = "yokorean",
- [0x315C] = "ukorean",
- [0x315D] = "weokorean",
- [0x315E] = "wekorean",
- [0x315F] = "wikorean",
- [0x3160] = "yukorean",
- [0x3161] = "eukorean",
- [0x3162] = "yikorean",
- [0x3163] = "ikorean",
- [0x3164] = "hangulfiller",
- [0x3165] = "ssangnieunkorean",
- [0x3166] = "nieuntikeutkorean",
- [0x3167] = "nieunsioskorean",
- [0x3168] = "nieunpansioskorean",
- [0x3169] = "rieulkiyeoksioskorean",
- [0x316A] = "rieultikeutkorean",
- [0x316B] = "rieulpieupsioskorean",
- [0x316C] = "rieulpansioskorean",
- [0x316D] = "rieulyeorinhieuhkorean",
- [0x316E] = "mieumpieupkorean",
- [0x316F] = "mieumsioskorean",
- [0x3170] = "mieumpansioskorean",
- [0x3171] = "kapyeounmieumkorean",
- [0x3172] = "pieupkiyeokkorean",
- [0x3173] = "pieuptikeutkorean",
- [0x3174] = "pieupsioskiyeokkorean",
- [0x3175] = "pieupsiostikeutkorean",
- [0x3176] = "pieupcieuckorean",
- [0x3177] = "pieupthieuthkorean",
- [0x3178] = "kapyeounpieupkorean",
- [0x3179] = "kapyeounssangpieupkorean",
- [0x317A] = "sioskiyeokkorean",
- [0x317B] = "siosnieunkorean",
- [0x317C] = "siostikeutkorean",
- [0x317D] = "siospieupkorean",
- [0x317E] = "sioscieuckorean",
- [0x317F] = "pansioskorean",
- [0x3180] = "ssangieungkorean",
- [0x3181] = "yesieungkorean",
- [0x3182] = "yesieungsioskorean",
- [0x3183] = "yesieungpansioskorean",
- [0x3184] = "kapyeounphieuphkorean",
- [0x3185] = "ssanghieuhkorean",
- [0x3186] = "yeorinhieuhkorean",
- [0x3187] = "yoyakorean",
- [0x3188] = "yoyaekorean",
- [0x3189] = "yoikorean",
- [0x318A] = "yuyeokorean",
- [0x318B] = "yuyekorean",
- [0x318C] = "yuikorean",
- [0x318D] = "araeakorean",
- [0x318E] = "araeaekorean",
- [0x3200] = "kiyeokparenkorean",
- [0x3201] = "nieunparenkorean",
- [0x3202] = "tikeutparenkorean",
- [0x3203] = "rieulparenkorean",
- [0x3204] = "mieumparenkorean",
- [0x3205] = "pieupparenkorean",
- [0x3206] = "siosparenkorean",
- [0x3207] = "ieungparenkorean",
- [0x3208] = "cieucparenkorean",
- [0x3209] = "chieuchparenkorean",
- [0x320A] = "khieukhparenkorean",
- [0x320B] = "thieuthparenkorean",
- [0x320C] = "phieuphparenkorean",
- [0x320D] = "hieuhparenkorean",
- [0x320E] = "kiyeokaparenkorean",
- [0x320F] = "nieunaparenkorean",
- [0x3210] = "tikeutaparenkorean",
- [0x3211] = "rieulaparenkorean",
- [0x3212] = "mieumaparenkorean",
- [0x3213] = "pieupaparenkorean",
- [0x3214] = "siosaparenkorean",
- [0x3215] = "ieungaparenkorean",
- [0x3216] = "cieucaparenkorean",
- [0x3217] = "chieuchaparenkorean",
- [0x3218] = "khieukhaparenkorean",
- [0x3219] = "thieuthaparenkorean",
- [0x321A] = "phieuphaparenkorean",
- [0x321B] = "hieuhaparenkorean",
- [0x321C] = "cieucuparenkorean",
- [0x3220] = "oneideographicparen",
- [0x3221] = "twoideographicparen",
- [0x3222] = "threeideographicparen",
- [0x3223] = "fourideographicparen",
- [0x3224] = "fiveideographicparen",
- [0x3225] = "sixideographicparen",
- [0x3226] = "sevenideographicparen",
- [0x3227] = "eightideographicparen",
- [0x3228] = "nineideographicparen",
- [0x3229] = "tenideographicparen",
- [0x322A] = "ideographicmoonparen",
- [0x322B] = "ideographicfireparen",
- [0x322C] = "ideographicwaterparen",
- [0x322D] = "ideographicwoodparen",
- [0x322E] = "ideographicmetalparen",
- [0x322F] = "ideographicearthparen",
- [0x3230] = "ideographicsunparen",
- [0x3231] = "ideographicstockparen",
- [0x3232] = "ideographichaveparen",
- [0x3233] = "ideographicsocietyparen",
- [0x3234] = "ideographicnameparen",
- [0x3235] = "ideographicspecialparen",
- [0x3236] = "ideographicfinancialparen",
- [0x3237] = "ideographiccongratulationparen",
- [0x3238] = "ideographiclaborparen",
- [0x3239] = "ideographicrepresentparen",
- [0x323A] = "ideographiccallparen",
- [0x323B] = "ideographicstudyparen",
- [0x323C] = "ideographicsuperviseparen",
- [0x323D] = "ideographicenterpriseparen",
- [0x323E] = "ideographicresourceparen",
- [0x323F] = "ideographicallianceparen",
- [0x3240] = "ideographicfestivalparen",
- [0x3242] = "ideographicselfparen",
- [0x3243] = "ideographicreachparen",
- [0x3260] = "kiyeokcirclekorean",
- [0x3261] = "nieuncirclekorean",
- [0x3262] = "tikeutcirclekorean",
- [0x3263] = "rieulcirclekorean",
- [0x3264] = "mieumcirclekorean",
- [0x3265] = "pieupcirclekorean",
- [0x3266] = "sioscirclekorean",
- [0x3267] = "ieungcirclekorean",
- [0x3268] = "cieuccirclekorean",
- [0x3269] = "chieuchcirclekorean",
- [0x326A] = "khieukhcirclekorean",
- [0x326B] = "thieuthcirclekorean",
- [0x326C] = "phieuphcirclekorean",
- [0x326D] = "hieuhcirclekorean",
- [0x326E] = "kiyeokacirclekorean",
- [0x326F] = "nieunacirclekorean",
- [0x3270] = "tikeutacirclekorean",
- [0x3271] = "rieulacirclekorean",
- [0x3272] = "mieumacirclekorean",
- [0x3273] = "pieupacirclekorean",
- [0x3274] = "siosacirclekorean",
- [0x3275] = "ieungacirclekorean",
- [0x3276] = "cieucacirclekorean",
- [0x3277] = "chieuchacirclekorean",
- [0x3278] = "khieukhacirclekorean",
- [0x3279] = "thieuthacirclekorean",
- [0x327A] = "phieuphacirclekorean",
- [0x327B] = "hieuhacirclekorean",
- [0x327F] = "koreanstandardsymbol",
- [0x328A] = "ideographmooncircle",
- [0x328B] = "ideographfirecircle",
- [0x328C] = "ideographwatercircle",
- [0x328D] = "ideographwoodcircle",
- [0x328E] = "ideographmetalcircle",
- [0x328F] = "ideographearthcircle",
- [0x3290] = "ideographsuncircle",
- [0x3294] = "ideographnamecircle",
- [0x3296] = "ideographicfinancialcircle",
- [0x3298] = "ideographiclaborcircle",
- [0x3299] = "ideographicsecretcircle",
- [0x329D] = "ideographicexcellentcircle",
- [0x329E] = "ideographicprintcircle",
- [0x32A3] = "ideographiccorrectcircle",
- [0x32A4] = "ideographichighcircle",
- [0x32A5] = "ideographiccentrecircle",
- [0x32A6] = "ideographiclowcircle",
- [0x32A7] = "ideographicleftcircle",
- [0x32A8] = "ideographicrightcircle",
- [0x32A9] = "ideographicmedicinecircle",
- [0x3300] = "apaatosquare",
- [0x3303] = "aarusquare",
- [0x3305] = "intisquare",
- [0x330D] = "karoriisquare",
- [0x3314] = "kirosquare",
- [0x3315] = "kiroguramusquare",
- [0x3316] = "kiromeetorusquare",
- [0x3318] = "guramusquare",
- [0x331E] = "kooposquare",
- [0x3322] = "sentisquare",
- [0x3323] = "sentosquare",
- [0x3326] = "dorusquare",
- [0x3327] = "tonsquare",
- [0x332A] = "haitusquare",
- [0x332B] = "paasentosquare",
- [0x3331] = "birusquare",
- [0x3333] = "huiitosquare",
- [0x3336] = "hekutaarusquare",
- [0x3339] = "herutusquare",
- [0x333B] = "peezisquare",
- [0x3342] = "hoonsquare",
- [0x3347] = "mansyonsquare",
- [0x3349] = "mirisquare",
- [0x334A] = "miribaarusquare",
- [0x334D] = "meetorusquare",
- [0x334E] = "yaadosquare",
- [0x3351] = "rittorusquare",
- [0x3357] = "wattosquare",
- [0x337B] = "heiseierasquare",
- [0x337C] = "syouwaerasquare",
- [0x337D] = "taisyouerasquare",
- [0x337E] = "meizierasquare",
- [0x337F] = "corporationsquare",
- [0x3380] = "paampssquare",
- [0x3381] = "nasquare",
- [0x3382] = "muasquare",
- [0x3383] = "masquare",
- [0x3384] = "kasquare",
- [0x3385] = "KBsquare",
- [0x3386] = "MBsquare",
- [0x3387] = "GBsquare",
- [0x3388] = "calsquare",
- [0x3389] = "kcalsquare",
- [0x338A] = "pfsquare",
- [0x338B] = "nfsquare",
- [0x338C] = "mufsquare",
- [0x338D] = "mugsquare",
- [0x338E] = "squaremg",
- [0x338F] = "squarekg",
- [0x3390] = "Hzsquare",
- [0x3391] = "khzsquare",
- [0x3392] = "mhzsquare",
- [0x3393] = "ghzsquare",
- [0x3394] = "thzsquare",
- [0x3395] = "mulsquare",
- [0x3396] = "mlsquare",
- [0x3397] = "dlsquare",
- [0x3398] = "klsquare",
- [0x3399] = "fmsquare",
- [0x339A] = "nmsquare",
- [0x339B] = "mumsquare",
- [0x339C] = "squaremm",
- [0x339D] = "squarecm",
- [0x339E] = "squarekm",
- [0x339F] = "mmsquaredsquare",
- [0x33A0] = "cmsquaredsquare",
- [0x33A1] = "squaremsquared",
- [0x33A2] = "kmsquaredsquare",
- [0x33A3] = "mmcubedsquare",
- [0x33A4] = "cmcubedsquare",
- [0x33A5] = "mcubedsquare",
- [0x33A6] = "kmcubedsquare",
- [0x33A7] = "moverssquare",
- [0x33A8] = "moverssquaredsquare",
- [0x33A9] = "pasquare",
- [0x33AA] = "kpasquare",
- [0x33AB] = "mpasquare",
- [0x33AC] = "gpasquare",
- [0x33AD] = "radsquare",
- [0x33AE] = "radoverssquare",
- [0x33AF] = "radoverssquaredsquare",
- [0x33B0] = "pssquare",
- [0x33B1] = "nssquare",
- [0x33B2] = "mussquare",
- [0x33B3] = "mssquare",
- [0x33B4] = "pvsquare",
- [0x33B5] = "nvsquare",
- [0x33B6] = "muvsquare",
- [0x33B7] = "mvsquare",
- [0x33B8] = "kvsquare",
- [0x33B9] = "mvmegasquare",
- [0x33BA] = "pwsquare",
- [0x33BB] = "nwsquare",
- [0x33BC] = "muwsquare",
- [0x33BD] = "mwsquare",
- [0x33BE] = "kwsquare",
- [0x33BF] = "mwmegasquare",
- [0x33C0] = "kohmsquare",
- [0x33C1] = "mohmsquare",
- [0x33C2] = "amsquare",
- [0x33C3] = "bqsquare",
- [0x33C4] = "squarecc",
- [0x33C5] = "cdsquare",
- [0x33C6] = "coverkgsquare",
- [0x33C7] = "cosquare",
- [0x33C8] = "dbsquare",
- [0x33C9] = "gysquare",
- [0x33CA] = "hasquare",
- [0x33CB] = "HPsquare",
- [0x33CD] = "KKsquare",
- [0x33CE] = "squarekmcapital",
- [0x33CF] = "ktsquare",
- [0x33D0] = "lmsquare",
- [0x33D1] = "squareln",
- [0x33D2] = "squarelog",
- [0x33D3] = "lxsquare",
- [0x33D4] = "mbsquare",
- [0x33D5] = "squaremil",
- [0x33D6] = "molsquare",
- [0x33D8] = "pmsquare",
- [0x33DB] = "srsquare",
- [0x33DC] = "svsquare",
- [0x33DD] = "wbsquare",
- [0x5344] = "twentyhangzhou",
- [0xF6BE] = "dotlessj",
- [0xF6BF] = "LL",
- [0xF6C0] = "ll",
- [0xF6C3] = "commaaccent",
- [0xF6C4] = "afii10063",
- [0xF6C5] = "afii10064",
- [0xF6C6] = "afii10192",
- [0xF6C7] = "afii10831",
- [0xF6C8] = "afii10832",
- [0xF6C9] = "Acute",
- [0xF6CA] = "Caron",
- [0xF6CB] = "Dieresis",
- [0xF6CC] = "DieresisAcute",
- [0xF6CD] = "DieresisGrave",
- [0xF6CE] = "Grave",
- [0xF6CF] = "Hungarumlaut",
- [0xF6D0] = "Macron",
- [0xF6D1] = "cyrBreve",
- [0xF6D2] = "cyrFlex",
- [0xF6D3] = "dblGrave",
- [0xF6D4] = "cyrbreve",
- [0xF6D5] = "cyrflex",
- [0xF6D6] = "dblgrave",
- [0xF6D7] = "dieresisacute",
- [0xF6D8] = "dieresisgrave",
- [0xF6D9] = "copyrightserif",
- [0xF6DA] = "registerserif",
- [0xF6DB] = "trademarkserif",
- [0xF6DC] = "onefitted",
- [0xF6DD] = "rupiah",
- [0xF6DE] = "threequartersemdash",
- [0xF6DF] = "centinferior",
- [0xF6E0] = "centsuperior",
- [0xF6E1] = "commainferior",
- [0xF6E2] = "commasuperior",
- [0xF6E3] = "dollarinferior",
- [0xF6E4] = "dollarsuperior",
- [0xF6E5] = "hypheninferior",
- [0xF6E6] = "hyphensuperior",
- [0xF6E7] = "periodinferior",
- [0xF6E8] = "periodsuperior",
- [0xF6E9] = "asuperior",
- [0xF6EA] = "bsuperior",
- [0xF6EB] = "dsuperior",
- [0xF6EC] = "esuperior",
- [0xF6ED] = "isuperior",
- [0xF6EE] = "lsuperior",
- [0xF6EF] = "msuperior",
- [0xF6F0] = "osuperior",
- [0xF6F1] = "rsuperior",
- [0xF6F2] = "ssuperior",
- [0xF6F3] = "tsuperior",
- [0xF6F4] = "Brevesmall",
- [0xF6F5] = "Caronsmall",
- [0xF6F6] = "Circumflexsmall",
- [0xF6F7] = "Dotaccentsmall",
- [0xF6F8] = "Hungarumlautsmall",
- [0xF6F9] = "Lslashsmall",
- [0xF6FA] = "OEsmall",
- [0xF6FB] = "Ogoneksmall",
- [0xF6FC] = "Ringsmall",
- [0xF6FD] = "Scaronsmall",
- [0xF6FE] = "Tildesmall",
- [0xF6FF] = "Zcaronsmall",
- [0xF721] = "exclamsmall",
- [0xF724] = "dollaroldstyle",
- [0xF726] = "ampersandsmall",
- [0xF730] = "zerooldstyle",
- [0xF731] = "oneoldstyle",
- [0xF732] = "twooldstyle",
- [0xF733] = "threeoldstyle",
- [0xF734] = "fouroldstyle",
- [0xF735] = "fiveoldstyle",
- [0xF736] = "sixoldstyle",
- [0xF737] = "sevenoldstyle",
- [0xF738] = "eightoldstyle",
- [0xF739] = "nineoldstyle",
- [0xF73F] = "questionsmall",
- [0xF760] = "Gravesmall",
- [0xF761] = "Asmall",
- [0xF762] = "Bsmall",
- [0xF763] = "Csmall",
- [0xF764] = "Dsmall",
- [0xF765] = "Esmall",
- [0xF766] = "Fsmall",
- [0xF767] = "Gsmall",
- [0xF768] = "Hsmall",
- [0xF769] = "Ismall",
- [0xF76A] = "Jsmall",
- [0xF76B] = "Ksmall",
- [0xF76C] = "Lsmall",
- [0xF76D] = "Msmall",
- [0xF76E] = "Nsmall",
- [0xF76F] = "Osmall",
- [0xF770] = "Psmall",
- [0xF771] = "Qsmall",
- [0xF772] = "Rsmall",
- [0xF773] = "Ssmall",
- [0xF774] = "Tsmall",
- [0xF775] = "Usmall",
- [0xF776] = "Vsmall",
- [0xF777] = "Wsmall",
- [0xF778] = "Xsmall",
- [0xF779] = "Ysmall",
- [0xF77A] = "Zsmall",
- [0xF7A1] = "exclamdownsmall",
- [0xF7A2] = "centoldstyle",
- [0xF7A8] = "Dieresissmall",
- [0xF7AF] = "Macronsmall",
- [0xF7B4] = "Acutesmall",
- [0xF7B8] = "Cedillasmall",
- [0xF7BF] = "questiondownsmall",
- [0xF7E0] = "Agravesmall",
- [0xF7E1] = "Aacutesmall",
- [0xF7E2] = "Acircumflexsmall",
- [0xF7E3] = "Atildesmall",
- [0xF7E4] = "Adieresissmall",
- [0xF7E5] = "Aringsmall",
- [0xF7E6] = "AEsmall",
- [0xF7E7] = "Ccedillasmall",
- [0xF7E8] = "Egravesmall",
- [0xF7E9] = "Eacutesmall",
- [0xF7EA] = "Ecircumflexsmall",
- [0xF7EB] = "Edieresissmall",
- [0xF7EC] = "Igravesmall",
- [0xF7ED] = "Iacutesmall",
- [0xF7EE] = "Icircumflexsmall",
- [0xF7EF] = "Idieresissmall",
- [0xF7F0] = "Ethsmall",
- [0xF7F1] = "Ntildesmall",
- [0xF7F2] = "Ogravesmall",
- [0xF7F3] = "Oacutesmall",
- [0xF7F4] = "Ocircumflexsmall",
- [0xF7F5] = "Otildesmall",
- [0xF7F6] = "Odieresissmall",
- [0xF7F8] = "Oslashsmall",
- [0xF7F9] = "Ugravesmall",
- [0xF7FA] = "Uacutesmall",
- [0xF7FB] = "Ucircumflexsmall",
- [0xF7FC] = "Udieresissmall",
- [0xF7FD] = "Yacutesmall",
- [0xF7FE] = "Thornsmall",
- [0xF7FF] = "Ydieresissmall",
- [0xF884] = "maihanakatleftthai",
- [0xF885] = "saraileftthai",
- [0xF886] = "saraiileftthai",
- [0xF887] = "saraueleftthai",
- [0xF888] = "saraueeleftthai",
- [0xF889] = "maitaikhuleftthai",
- [0xF88A] = "maiekupperleftthai",
- [0xF88B] = "maieklowrightthai",
- [0xF88C] = "maieklowleftthai",
- [0xF88D] = "maithoupperleftthai",
- [0xF88E] = "maitholowrightthai",
- [0xF88F] = "maitholowleftthai",
- [0xF890] = "maitriupperleftthai",
- [0xF891] = "maitrilowrightthai",
- [0xF892] = "maitrilowleftthai",
- [0xF893] = "maichattawaupperleftthai",
- [0xF894] = "maichattawalowrightthai",
- [0xF895] = "maichattawalowleftthai",
- [0xF896] = "thanthakhatupperleftthai",
- [0xF897] = "thanthakhatlowrightthai",
- [0xF898] = "thanthakhatlowleftthai",
- [0xF899] = "nikhahitleftthai",
- [0xF8E5] = "radicalex",
- [0xF8E6] = "arrowvertex",
- [0xF8E7] = "arrowhorizex",
- [0xF8E8] = "registersans",
- [0xF8E9] = "copyrightsans",
- [0xF8EA] = "trademarksans",
- [0xF8EB] = "parenlefttp",
- [0xF8EC] = "parenleftex",
- [0xF8ED] = "parenleftbt",
- [0xF8EE] = "bracketlefttp",
- [0xF8EF] = "bracketleftex",
- [0xF8F0] = "bracketleftbt",
- [0xF8F1] = "bracelefttp",
- [0xF8F2] = "braceleftmid",
- [0xF8F3] = "braceleftbt",
- [0xF8F4] = "braceex",
- [0xF8F5] = "integralex",
- [0xF8F6] = "parenrighttp",
- [0xF8F7] = "parenrightex",
- [0xF8F8] = "parenrightbt",
- [0xF8F9] = "bracketrighttp",
- [0xF8FA] = "bracketrightex",
- [0xF8FB] = "bracketrightbt",
- [0xF8FC] = "bracerighttp",
- [0xF8FD] = "bracerightmid",
- [0xF8FE] = "bracerightbt",
- [0xF8FF] = "apple",
- [0xFB00] = "ff",
- [0xFB01] = "fi",
- [0xFB02] = "fl",
- [0xFB03] = "ffi",
- [0xFB04] = "ffl",
- [0xFB1F] = "yodyodpatahhebrew",
- [0xFB20] = "ayinaltonehebrew",
- [0xFB2A] = "shinshindothebrew",
- [0xFB2B] = "shinsindothebrew",
- [0xFB2C] = "shindageshshindothebrew",
- [0xFB2D] = "shindageshsindothebrew",
- [0xFB2E] = "alefpatahhebrew",
- [0xFB2F] = "alefqamatshebrew",
- [0xFB30] = "alefdageshhebrew",
- [0xFB31] = "betdageshhebrew",
- [0xFB32] = "gimeldageshhebrew",
- [0xFB33] = "daletdageshhebrew",
- [0xFB34] = "hedageshhebrew",
- [0xFB35] = "vavdageshhebrew",
- [0xFB36] = "zayindageshhebrew",
- [0xFB38] = "tetdageshhebrew",
- [0xFB39] = "yoddageshhebrew",
- [0xFB3A] = "finalkafdageshhebrew",
- [0xFB3B] = "kafdageshhebrew",
- [0xFB3C] = "lameddageshhebrew",
- [0xFB3E] = "memdageshhebrew",
- [0xFB40] = "nundageshhebrew",
- [0xFB41] = "samekhdageshhebrew",
- [0xFB43] = "pefinaldageshhebrew",
- [0xFB44] = "pedageshhebrew",
- [0xFB46] = "tsadidageshhebrew",
- [0xFB47] = "qofdageshhebrew",
- [0xFB48] = "reshdageshhebrew",
- [0xFB49] = "shindageshhebrew",
- [0xFB4A] = "tavdageshhebrew",
- [0xFB4B] = "vavholamhebrew",
- [0xFB4C] = "betrafehebrew",
- [0xFB4D] = "kafrafehebrew",
- [0xFB4E] = "perafehebrew",
- [0xFB4F] = "aleflamedhebrew",
- [0xFB57] = "pehfinalarabic",
- [0xFB58] = "pehinitialarabic",
- [0xFB59] = "pehmedialarabic",
- [0xFB67] = "ttehfinalarabic",
- [0xFB68] = "ttehinitialarabic",
- [0xFB69] = "ttehmedialarabic",
- [0xFB6B] = "vehfinalarabic",
- [0xFB6C] = "vehinitialarabic",
- [0xFB6D] = "vehmedialarabic",
- [0xFB7B] = "tchehfinalarabic",
- [0xFB7C] = "tchehmeeminitialarabic",
- [0xFB7D] = "tchehmedialarabic",
- [0xFB89] = "ddalfinalarabic",
- [0xFB8B] = "jehfinalarabic",
- [0xFB8D] = "rrehfinalarabic",
- [0xFB93] = "gaffinalarabic",
- [0xFB94] = "gafinitialarabic",
- [0xFB95] = "gafmedialarabic",
- [0xFB9F] = "noonghunnafinalarabic",
- [0xFBA4] = "hehhamzaaboveisolatedarabic",
- [0xFBA5] = "hehhamzaabovefinalarabic",
- [0xFBA7] = "hehfinalaltonearabic",
- [0xFBA8] = "hehinitialaltonearabic",
- [0xFBA9] = "hehmedialaltonearabic",
- [0xFBAF] = "yehbarreefinalarabic",
- [0xFC08] = "behmeemisolatedarabic",
- [0xFC0B] = "tehjeemisolatedarabic",
- [0xFC0C] = "tehhahisolatedarabic",
- [0xFC0E] = "tehmeemisolatedarabic",
- [0xFC48] = "meemmeemisolatedarabic",
- [0xFC4B] = "noonjeemisolatedarabic",
- [0xFC4E] = "noonmeemisolatedarabic",
- [0xFC58] = "yehmeemisolatedarabic",
- [0xFC5E] = "shaddadammatanarabic",
- [0xFC5F] = "shaddakasratanarabic",
- [0xFC60] = "shaddafathaarabic",
- [0xFC61] = "shaddadammaarabic",
- [0xFC62] = "shaddakasraarabic",
- [0xFC6D] = "behnoonfinalarabic",
- [0xFC73] = "tehnoonfinalarabic",
- [0xFC8D] = "noonnoonfinalarabic",
- [0xFC94] = "yehnoonfinalarabic",
- [0xFC9F] = "behmeeminitialarabic",
- [0xFCA1] = "tehjeeminitialarabic",
- [0xFCA2] = "tehhahinitialarabic",
- [0xFCA4] = "tehmeeminitialarabic",
- [0xFCC9] = "lamjeeminitialarabic",
- [0xFCCA] = "lamhahinitialarabic",
- [0xFCCB] = "lamkhahinitialarabic",
- [0xFCCC] = "lammeeminitialarabic",
- [0xFCD1] = "meemmeeminitialarabic",
- [0xFCD2] = "noonjeeminitialarabic",
- [0xFCD5] = "noonmeeminitialarabic",
- [0xFCDD] = "yehmeeminitialarabic",
- [0xFD3E] = "parenleftaltonearabic",
- [0xFD3F] = "parenrightaltonearabic",
- [0xFD88] = "lammeemhahinitialarabic",
- [0xFDF2] = "lamlamhehisolatedarabic",
- [0xFDFA] = "sallallahoualayhewasallamarabic",
- [0xFE30] = "twodotleadervertical",
- [0xFE31] = "emdashvertical",
- [0xFE32] = "endashvertical",
- [0xFE33] = "underscorevertical",
- [0xFE34] = "wavyunderscorevertical",
- [0xFE35] = "parenleftvertical",
- [0xFE36] = "parenrightvertical",
- [0xFE37] = "braceleftvertical",
- [0xFE38] = "bracerightvertical",
- [0xFE39] = "tortoiseshellbracketleftvertical",
- [0xFE3A] = "tortoiseshellbracketrightvertical",
- [0xFE3B] = "blacklenticularbracketleftvertical",
- [0xFE3C] = "blacklenticularbracketrightvertical",
- [0xFE3D] = "dblanglebracketleftvertical",
- [0xFE3E] = "dblanglebracketrightvertical",
- [0xFE3F] = "anglebracketleftvertical",
- [0xFE40] = "anglebracketrightvertical",
- [0xFE41] = "cornerbracketleftvertical",
- [0xFE42] = "cornerbracketrightvertical",
- [0xFE43] = "whitecornerbracketleftvertical",
- [0xFE44] = "whitecornerbracketrightvertical",
- [0xFE49] = "overlinedashed",
- [0xFE4A] = "overlinecenterline",
- [0xFE4B] = "overlinewavy",
- [0xFE4C] = "overlinedblwavy",
- [0xFE4D] = "lowlinedashed",
- [0xFE4E] = "lowlinecenterline",
- [0xFE4F] = "underscorewavy",
- [0xFE50] = "commasmall",
- [0xFE52] = "periodsmall",
- [0xFE54] = "semicolonsmall",
- [0xFE55] = "colonsmall",
- [0xFE59] = "parenleftsmall",
- [0xFE5A] = "parenrightsmall",
- [0xFE5B] = "braceleftsmall",
- [0xFE5C] = "bracerightsmall",
- [0xFE5D] = "tortoiseshellbracketleftsmall",
- [0xFE5E] = "tortoiseshellbracketrightsmall",
- [0xFE5F] = "numbersignsmall",
- [0xFE61] = "asterisksmall",
- [0xFE62] = "plussmall",
- [0xFE63] = "hyphensmall",
- [0xFE64] = "lesssmall",
- [0xFE65] = "greatersmall",
- [0xFE66] = "equalsmall",
- [0xFE69] = "dollarsmall",
- [0xFE6A] = "percentsmall",
- [0xFE6B] = "atsmall",
- [0xFE82] = "alefmaddaabovefinalarabic",
- [0xFE84] = "alefhamzaabovefinalarabic",
- [0xFE86] = "wawhamzaabovefinalarabic",
- [0xFE88] = "alefhamzabelowfinalarabic",
- [0xFE8A] = "yehhamzaabovefinalarabic",
- [0xFE8B] = "yehhamzaaboveinitialarabic",
- [0xFE8C] = "yehhamzaabovemedialarabic",
- [0xFE8E] = "aleffinalarabic",
- [0xFE90] = "behfinalarabic",
- [0xFE91] = "behinitialarabic",
- [0xFE92] = "behmedialarabic",
- [0xFE94] = "tehmarbutafinalarabic",
- [0xFE96] = "tehfinalarabic",
- [0xFE97] = "tehinitialarabic",
- [0xFE98] = "tehmedialarabic",
- [0xFE9A] = "thehfinalarabic",
- [0xFE9B] = "thehinitialarabic",
- [0xFE9C] = "thehmedialarabic",
- [0xFE9E] = "jeemfinalarabic",
- [0xFE9F] = "jeeminitialarabic",
- [0xFEA0] = "jeemmedialarabic",
- [0xFEA2] = "hahfinalarabic",
- [0xFEA3] = "hahinitialarabic",
- [0xFEA4] = "hahmedialarabic",
- [0xFEA6] = "khahfinalarabic",
- [0xFEA7] = "khahinitialarabic",
- [0xFEA8] = "khahmedialarabic",
- [0xFEAA] = "dalfinalarabic",
- [0xFEAC] = "thalfinalarabic",
- [0xFEAE] = "rehfinalarabic",
- [0xFEB0] = "zainfinalarabic",
- [0xFEB2] = "seenfinalarabic",
- [0xFEB3] = "seeninitialarabic",
- [0xFEB4] = "seenmedialarabic",
- [0xFEB6] = "sheenfinalarabic",
- [0xFEB7] = "sheeninitialarabic",
- [0xFEB8] = "sheenmedialarabic",
- [0xFEBA] = "sadfinalarabic",
- [0xFEBB] = "sadinitialarabic",
- [0xFEBC] = "sadmedialarabic",
- [0xFEBE] = "dadfinalarabic",
- [0xFEBF] = "dadinitialarabic",
- [0xFEC0] = "dadmedialarabic",
- [0xFEC2] = "tahfinalarabic",
- [0xFEC3] = "tahinitialarabic",
- [0xFEC4] = "tahmedialarabic",
- [0xFEC6] = "zahfinalarabic",
- [0xFEC7] = "zahinitialarabic",
- [0xFEC8] = "zahmedialarabic",
- [0xFECA] = "ainfinalarabic",
- [0xFECB] = "aininitialarabic",
- [0xFECC] = "ainmedialarabic",
- [0xFECE] = "ghainfinalarabic",
- [0xFECF] = "ghaininitialarabic",
- [0xFED0] = "ghainmedialarabic",
- [0xFED2] = "fehfinalarabic",
- [0xFED3] = "fehinitialarabic",
- [0xFED4] = "fehmedialarabic",
- [0xFED6] = "qaffinalarabic",
- [0xFED7] = "qafinitialarabic",
- [0xFED8] = "qafmedialarabic",
- [0xFEDA] = "kaffinalarabic",
- [0xFEDB] = "kafinitialarabic",
- [0xFEDC] = "kafmedialarabic",
- [0xFEDE] = "lamfinalarabic",
- [0xFEDF] = "lammeemkhahinitialarabic",
- [0xFEE0] = "lammedialarabic",
- [0xFEE2] = "meemfinalarabic",
- [0xFEE3] = "meeminitialarabic",
- [0xFEE4] = "meemmedialarabic",
- [0xFEE6] = "noonfinalarabic",
- [0xFEE7] = "nooninitialarabic",
- [0xFEE8] = "noonmedialarabic",
- [0xFEEA] = "hehfinalarabic",
- [0xFEEB] = "hehinitialarabic",
- [0xFEEC] = "hehmedialarabic",
- [0xFEEE] = "wawfinalarabic",
- [0xFEF0] = "alefmaksurafinalarabic",
- [0xFEF2] = "yehfinalarabic",
- [0xFEF3] = "yehinitialarabic",
- [0xFEF4] = "yehmedialarabic",
- [0xFEF5] = "lamalefmaddaaboveisolatedarabic",
- [0xFEF6] = "lamalefmaddaabovefinalarabic",
- [0xFEF7] = "lamalefhamzaaboveisolatedarabic",
- [0xFEF8] = "lamalefhamzaabovefinalarabic",
- [0xFEF9] = "lamalefhamzabelowisolatedarabic",
- [0xFEFA] = "lamalefhamzabelowfinalarabic",
- [0xFEFB] = "lamalefisolatedarabic",
- [0xFEFC] = "lamaleffinalarabic",
- [0xFEFF] = "zerowidthjoiner",
- [0xFF01] = "exclammonospace",
- [0xFF02] = "quotedblmonospace",
- [0xFF03] = "numbersignmonospace",
- [0xFF04] = "dollarmonospace",
- [0xFF05] = "percentmonospace",
- [0xFF06] = "ampersandmonospace",
- [0xFF07] = "quotesinglemonospace",
- [0xFF08] = "parenleftmonospace",
- [0xFF09] = "parenrightmonospace",
- [0xFF0A] = "asteriskmonospace",
- [0xFF0B] = "plusmonospace",
- [0xFF0C] = "commamonospace",
- [0xFF0D] = "hyphenmonospace",
- [0xFF0E] = "periodmonospace",
- [0xFF0F] = "slashmonospace",
- [0xFF10] = "zeromonospace",
- [0xFF11] = "onemonospace",
- [0xFF12] = "twomonospace",
- [0xFF13] = "threemonospace",
- [0xFF14] = "fourmonospace",
- [0xFF15] = "fivemonospace",
- [0xFF16] = "sixmonospace",
- [0xFF17] = "sevenmonospace",
- [0xFF18] = "eightmonospace",
- [0xFF19] = "ninemonospace",
- [0xFF1A] = "colonmonospace",
- [0xFF1B] = "semicolonmonospace",
- [0xFF1C] = "lessmonospace",
- [0xFF1D] = "equalmonospace",
- [0xFF1E] = "greatermonospace",
- [0xFF1F] = "questionmonospace",
- [0xFF20] = "atmonospace",
- [0xFF21] = "Amonospace",
- [0xFF22] = "Bmonospace",
- [0xFF23] = "Cmonospace",
- [0xFF24] = "Dmonospace",
- [0xFF25] = "Emonospace",
- [0xFF26] = "Fmonospace",
- [0xFF27] = "Gmonospace",
- [0xFF28] = "Hmonospace",
- [0xFF29] = "Imonospace",
- [0xFF2A] = "Jmonospace",
- [0xFF2B] = "Kmonospace",
- [0xFF2C] = "Lmonospace",
- [0xFF2D] = "Mmonospace",
- [0xFF2E] = "Nmonospace",
- [0xFF2F] = "Omonospace",
- [0xFF30] = "Pmonospace",
- [0xFF31] = "Qmonospace",
- [0xFF32] = "Rmonospace",
- [0xFF33] = "Smonospace",
- [0xFF34] = "Tmonospace",
- [0xFF35] = "Umonospace",
- [0xFF36] = "Vmonospace",
- [0xFF37] = "Wmonospace",
- [0xFF38] = "Xmonospace",
- [0xFF39] = "Ymonospace",
- [0xFF3A] = "Zmonospace",
- [0xFF3B] = "bracketleftmonospace",
- [0xFF3C] = "backslashmonospace",
- [0xFF3D] = "bracketrightmonospace",
- [0xFF3E] = "asciicircummonospace",
- [0xFF3F] = "underscoremonospace",
- [0xFF40] = "gravemonospace",
- [0xFF41] = "amonospace",
- [0xFF42] = "bmonospace",
- [0xFF43] = "cmonospace",
- [0xFF44] = "dmonospace",
- [0xFF45] = "emonospace",
- [0xFF46] = "fmonospace",
- [0xFF47] = "gmonospace",
- [0xFF48] = "hmonospace",
- [0xFF49] = "imonospace",
- [0xFF4A] = "jmonospace",
- [0xFF4B] = "kmonospace",
- [0xFF4C] = "lmonospace",
- [0xFF4D] = "mmonospace",
- [0xFF4E] = "nmonospace",
- [0xFF4F] = "omonospace",
- [0xFF50] = "pmonospace",
- [0xFF51] = "qmonospace",
- [0xFF52] = "rmonospace",
- [0xFF53] = "smonospace",
- [0xFF54] = "tmonospace",
- [0xFF55] = "umonospace",
- [0xFF56] = "vmonospace",
- [0xFF57] = "wmonospace",
- [0xFF58] = "xmonospace",
- [0xFF59] = "ymonospace",
- [0xFF5A] = "zmonospace",
- [0xFF5B] = "braceleftmonospace",
- [0xFF5C] = "barmonospace",
- [0xFF5D] = "bracerightmonospace",
- [0xFF5E] = "asciitildemonospace",
- [0xFF61] = "periodhalfwidth",
- [0xFF62] = "cornerbracketlefthalfwidth",
- [0xFF63] = "cornerbracketrighthalfwidth",
- [0xFF64] = "ideographiccommaleft",
- [0xFF65] = "middledotkatakanahalfwidth",
- [0xFF66] = "wokatakanahalfwidth",
- [0xFF67] = "asmallkatakanahalfwidth",
- [0xFF68] = "ismallkatakanahalfwidth",
- [0xFF69] = "usmallkatakanahalfwidth",
- [0xFF6A] = "esmallkatakanahalfwidth",
- [0xFF6B] = "osmallkatakanahalfwidth",
- [0xFF6C] = "yasmallkatakanahalfwidth",
- [0xFF6D] = "yusmallkatakanahalfwidth",
- [0xFF6E] = "yosmallkatakanahalfwidth",
- [0xFF6F] = "tusmallkatakanahalfwidth",
- [0xFF70] = "katahiraprolongmarkhalfwidth",
- [0xFF71] = "akatakanahalfwidth",
- [0xFF72] = "ikatakanahalfwidth",
- [0xFF73] = "ukatakanahalfwidth",
- [0xFF74] = "ekatakanahalfwidth",
- [0xFF75] = "okatakanahalfwidth",
- [0xFF76] = "kakatakanahalfwidth",
- [0xFF77] = "kikatakanahalfwidth",
- [0xFF78] = "kukatakanahalfwidth",
- [0xFF79] = "kekatakanahalfwidth",
- [0xFF7A] = "kokatakanahalfwidth",
- [0xFF7B] = "sakatakanahalfwidth",
- [0xFF7C] = "sikatakanahalfwidth",
- [0xFF7D] = "sukatakanahalfwidth",
- [0xFF7E] = "sekatakanahalfwidth",
- [0xFF7F] = "sokatakanahalfwidth",
- [0xFF80] = "takatakanahalfwidth",
- [0xFF81] = "tikatakanahalfwidth",
- [0xFF82] = "tukatakanahalfwidth",
- [0xFF83] = "tekatakanahalfwidth",
- [0xFF84] = "tokatakanahalfwidth",
- [0xFF85] = "nakatakanahalfwidth",
- [0xFF86] = "nikatakanahalfwidth",
- [0xFF87] = "nukatakanahalfwidth",
- [0xFF88] = "nekatakanahalfwidth",
- [0xFF89] = "nokatakanahalfwidth",
- [0xFF8A] = "hakatakanahalfwidth",
- [0xFF8B] = "hikatakanahalfwidth",
- [0xFF8C] = "hukatakanahalfwidth",
- [0xFF8D] = "hekatakanahalfwidth",
- [0xFF8E] = "hokatakanahalfwidth",
- [0xFF8F] = "makatakanahalfwidth",
- [0xFF90] = "mikatakanahalfwidth",
- [0xFF91] = "mukatakanahalfwidth",
- [0xFF92] = "mekatakanahalfwidth",
- [0xFF93] = "mokatakanahalfwidth",
- [0xFF94] = "yakatakanahalfwidth",
- [0xFF95] = "yukatakanahalfwidth",
- [0xFF96] = "yokatakanahalfwidth",
- [0xFF97] = "rakatakanahalfwidth",
- [0xFF98] = "rikatakanahalfwidth",
- [0xFF99] = "rukatakanahalfwidth",
- [0xFF9A] = "rekatakanahalfwidth",
- [0xFF9B] = "rokatakanahalfwidth",
- [0xFF9C] = "wakatakanahalfwidth",
- [0xFF9D] = "nkatakanahalfwidth",
- [0xFF9E] = "voicedmarkkanahalfwidth",
- [0xFF9F] = "semivoicedmarkkanahalfwidth",
- [0xFFE0] = "centmonospace",
- [0xFFE1] = "sterlingmonospace",
- [0xFFE3] = "macronmonospace",
- [0xFFE5] = "yenmonospace",
- [0xFFE6] = "wonmonospace",
+local names = allocate {
+ -- filled from char-def.lua
}
+local unicodes = allocate {
+ -- filled from char-def.lua
+}
+
+local extras = allocate { -- private extensions
+ Dcroat = 0x0110,
+ Delta = 0x2206,
+ Euro = 0x20AC,
+ H18533 = 0x25CF,
+ H18543 = 0x25AA,
+ H18551 = 0x25AB,
+ H22073 = 0x25A1,
+ Ldot = 0x013F,
+ Oslashacute = 0x01FE,
+ SF10000 = 0x250C,
+ SF20000 = 0x2514,
+ SF30000 = 0x2510,
+ SF40000 = 0x2518,
+ SF50000 = 0x253C,
+ SF60000 = 0x252C,
+ SF70000 = 0x2534,
+ SF80000 = 0x251C,
+ SF90000 = 0x2524,
+ Upsilon1 = 0x03D2,
+ afii10066 = 0x0431,
+ afii10067 = 0x0432,
+ afii10068 = 0x0433,
+ afii10069 = 0x0434,
+ afii10070 = 0x0435,
+ afii10071 = 0x0451,
+ afii10072 = 0x0436,
+ afii10073 = 0x0437,
+ afii10074 = 0x0438,
+ afii10075 = 0x0439,
+ afii10076 = 0x043A,
+ afii10077 = 0x043B,
+ afii10078 = 0x043C,
+ afii10079 = 0x043D,
+ afii10080 = 0x043E,
+ afii10081 = 0x043F,
+ afii10082 = 0x0440,
+ afii10083 = 0x0441,
+ afii10084 = 0x0442,
+ afii10085 = 0x0443,
+ afii10086 = 0x0444,
+ afii10087 = 0x0445,
+ afii10088 = 0x0446,
+ afii10089 = 0x0447,
+ afii10090 = 0x0448,
+ afii10091 = 0x0449,
+ afii10092 = 0x044A,
+ afii10093 = 0x044B,
+ afii10094 = 0x044C,
+ afii10095 = 0x044D,
+ afii10096 = 0x044E,
+ afii10097 = 0x044F,
+ afii10098 = 0x0491,
+ afii10099 = 0x0452,
+ afii10100 = 0x0453,
+ afii10101 = 0x0454,
+ afii10102 = 0x0455,
+ afii10103 = 0x0456,
+ afii10104 = 0x0457,
+ afii10105 = 0x0458,
+ afii10106 = 0x0459,
+ afii10107 = 0x045A,
+ afii10108 = 0x045B,
+ afii10109 = 0x045C,
+ afii10110 = 0x045E,
+ afii10193 = 0x045F,
+ afii10194 = 0x0463,
+ afii10195 = 0x0473,
+ afii10196 = 0x0475,
+ afii10846 = 0x04D9,
+ afii208 = 0x2015,
+ afii57381 = 0x066A,
+ afii57388 = 0x060C,
+ afii57392 = 0x0660,
+ afii57393 = 0x0661,
+ afii57394 = 0x0662,
+ afii57395 = 0x0663,
+ afii57396 = 0x0664,
+ afii57397 = 0x0665,
+ afii57398 = 0x0666,
+ afii57399 = 0x0667,
+ afii57400 = 0x0668,
+ afii57401 = 0x0669,
+ afii57403 = 0x061B,
+ afii57407 = 0x061F,
+ afii57409 = 0x0621,
+ afii57410 = 0x0622,
+ afii57411 = 0x0623,
+ afii57412 = 0x0624,
+ afii57413 = 0x0625,
+ afii57414 = 0x0626,
+ afii57415 = 0x0627,
+ afii57416 = 0x0628,
+ afii57417 = 0x0629,
+ afii57418 = 0x062A,
+ afii57419 = 0x062B,
+ afii57420 = 0x062C,
+ afii57421 = 0x062D,
+ afii57422 = 0x062E,
+ afii57423 = 0x062F,
+ afii57424 = 0x0630,
+ afii57425 = 0x0631,
+ afii57426 = 0x0632,
+ afii57427 = 0x0633,
+ afii57428 = 0x0634,
+ afii57429 = 0x0635,
+ afii57430 = 0x0636,
+ afii57431 = 0x0637,
+ afii57432 = 0x0638,
+ afii57433 = 0x0639,
+ afii57434 = 0x063A,
+ afii57440 = 0x0640,
+ afii57441 = 0x0641,
+ afii57442 = 0x0642,
+ afii57443 = 0x0643,
+ afii57444 = 0x0644,
+ afii57445 = 0x0645,
+ afii57446 = 0x0646,
+ afii57448 = 0x0648,
+ afii57449 = 0x0649,
+ afii57450 = 0x064A,
+ afii57451 = 0x064B,
+ afii57452 = 0x064C,
+ afii57453 = 0x064D,
+ afii57454 = 0x064E,
+ afii57455 = 0x064F,
+ afii57456 = 0x0650,
+ afii57457 = 0x0651,
+ afii57458 = 0x0652,
+ afii57470 = 0x0647,
+ afii57505 = 0x06A4,
+ afii57506 = 0x067E,
+ afii57507 = 0x0686,
+ afii57508 = 0x0698,
+ afii57509 = 0x06AF,
+ afii57511 = 0x0679,
+ afii57512 = 0x0688,
+ afii57513 = 0x0691,
+ afii57514 = 0x06BA,
+ afii57519 = 0x06D2,
+ afii57636 = 0x20AA,
+ afii57645 = 0x05BE,
+ afii57658 = 0x05C3,
+ afii57664 = 0x05D0,
+ afii57665 = 0x05D1,
+ afii57666 = 0x05D2,
+ afii57667 = 0x05D3,
+ afii57668 = 0x05D4,
+ afii57669 = 0x05D5,
+ afii57670 = 0x05D6,
+ afii57671 = 0x05D7,
+ afii57672 = 0x05D8,
+ afii57673 = 0x05D9,
+ afii57674 = 0x05DA,
+ afii57675 = 0x05DB,
+ afii57676 = 0x05DC,
+ afii57677 = 0x05DD,
+ afii57678 = 0x05DE,
+ afii57679 = 0x05DF,
+ afii57680 = 0x05E0,
+ afii57681 = 0x05E1,
+ afii57682 = 0x05E2,
+ afii57683 = 0x05E3,
+ afii57684 = 0x05E4,
+ afii57685 = 0x05E5,
+ afii57686 = 0x05E6,
+ afii57687 = 0x05E7,
+ afii57688 = 0x05E8,
+ afii57689 = 0x05E9,
+ afii57690 = 0x05EA,
+ afii57716 = 0x05F0,
+ afii57717 = 0x05F1,
+ afii57718 = 0x05F2,
+ afii57793 = 0x05B4,
+ afii57794 = 0x05B5,
+ afii57795 = 0x05B6,
+ afii57796 = 0x05BB,
+ afii57797 = 0x05B8,
+ afii57798 = 0x05B7,
+ afii57799 = 0x05B0,
+ afii57800 = 0x05B2,
+ afii57801 = 0x05B1,
+ afii57802 = 0x05B3,
+ afii57803 = 0x05C2,
+ afii57804 = 0x05C1,
+ afii57806 = 0x05B9,
+ afii57807 = 0x05BC,
+ afii57839 = 0x05BD,
+ afii57841 = 0x05BF,
+ afii57842 = 0x05C0,
+ afii57929 = 0x02BC,
+ afii61248 = 0x2105,
+ afii61289 = 0x2113,
+ afii61352 = 0x2116,
+ afii61664 = 0x200C,
+ afii63167 = 0x066D,
+ afii64937 = 0x02BD,
+ arrowdblboth = 0x21D4,
+ arrowdblleft = 0x21D0,
+ arrowdblright = 0x21D2,
+ arrowupdnbse = 0x21A8,
+ bar = 0x007C,
+ circle = 0x25CB,
+ circlemultiply = 0x2297,
+ circleplus = 0x2295,
+ club = 0x2663,
+ colonmonetary = 0x20A1,
+ dcroat = 0x0111,
+ dkshade = 0x2593,
+ existential = 0x2203,
+ female = 0x2640,
+ gradient = 0x2207,
+ heart = 0x2665,
+ hookabovecomb = 0x0309,
+ invcircle = 0x25D9,
+ ldot = 0x0140,
+ longs = 0x017F,
+ ltshade = 0x2591,
+ male = 0x2642,
+ mu = 0x00B5,
+ napostrophe = 0x0149,
+ notelement = 0x2209,
+ omega1 = 0x03D6,
+ openbullet = 0x25E6,
+ orthogonal = 0x221F,
+ oslashacute = 0x01FF,
+ phi1 = 0x03D5,
+ propersubset = 0x2282,
+ propersuperset = 0x2283,
+ reflexsubset = 0x2286,
+ reflexsuperset = 0x2287,
+ shade = 0x2592,
+ sigma1 = 0x03C2,
+ similar = 0x223C,
+ smileface = 0x263A,
+ spacehackarabic = 0x0020,
+ spade = 0x2660,
+ theta1 = 0x03D1,
+ twodotenleader = 0x2025,
+}
+
+for u, c in next, characters.data do
+ local a = c.adobename
+ if a then
+ unicodes[a] = u
+ names [u] = a
+ end
+end
-fonts.map.agl_to_unicode = table.swapped(fonts.map.unicode_to_agl)
+for a, u in next, extras do
+ unicodes[a] = u
+ if not names[u] then
+ names[u] = a
+ end
+end
+
+-- We load this table only when needed. We coul duse a loading mechanism
+-- return the table but there are no more vectors like this so why bother.
+
+fonts.encodings = fonts.encodings or { }
+
+fonts.encodings.agl = {
+ names = names, -- unicode -> name
+ unicodes = unicodes, -- name -> unicode
+ extras = extras, -- merged into the other two
+}
diff --git a/Master/texmf-dist/tex/context/base/font-aux.lua b/Master/texmf-dist/tex/context/base/font-aux.lua
new file mode 100644
index 00000000000..0396554adec
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/font-aux.lua
@@ -0,0 +1,104 @@
+if not modules then modules = { } end modules ['font-aux'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local number = tonumber
+local wrap, yield = coroutine.wrap, coroutine.yield
+
+local fonts, font = fonts, font
+
+local iterators = { }
+fonts.iterators = iterators
+
+local currentfont = font.current
+local identifiers = fonts.hashes.identifiers
+local sortedkeys = table.sortedkeys
+
+-- for unicode, character in fonts.iterators.characters () do print(k,v) end
+-- for unicode, description in fonts.iterators.descriptions() do print(k,v) end
+-- for index, glyph in fonts.iterators.glyphs () do print(k,v) end
+
+local function checkeddata(data) -- beware, nullfont is the fallback in identifiers
+ local t = type(data)
+ if t == "table" then
+ return data
+ elseif t ~= "number" then
+ data = currentfont()
+ end
+ return identifiers[data] -- has nullfont as fallback
+end
+
+function iterators.characters(data)
+ data = checkeddata(data)
+ local characters = data.characters
+ if characters then
+ local collected = sortedkeys(characters)
+ return wrap(function()
+ for c=1,#collected do
+ local cc = collected[c]
+ local dc = characters[cc]
+ if dc then
+ yield(cc,dc)
+ end
+ end
+ end)
+ else
+ return wrap(function() end)
+ end
+end
+
+function iterators.descriptions(data)
+ data = checkeddata(data)
+ local characters = data.characters
+ local descriptions = data.descriptions
+ if characters and descriptions then
+ local collected = sortedkeys(characters)
+ return wrap(function()
+ for c=1,#collected do
+ local cc = collected[c]
+ local dc = descriptions[cc]
+ if dc then
+ yield(cc,dc)
+ end
+ end
+ end)
+ else
+ return wrap(function() end)
+ end
+end
+
+local function getindices(data)
+ data = checkeddata(data)
+ local indices = { }
+ local characters = data.characters
+ if characters then
+ for unicode, character in next, characters do
+ indices[character.index or unicode] = unicode
+ end
+ end
+ return indices
+end
+
+function iterators.glyphs(data)
+ data = checkeddata(data)
+ local descriptions = data.descriptions
+ if descriptions then
+ local indices = getindices(data)
+ local collected = sortedkeys(indices)
+ return wrap(function()
+ for c=1,#collected do
+ local cc = collected[c]
+ local dc = descriptions[indices[cc]]
+ if dc then
+ yield(cc,dc)
+ end
+ end
+ end)
+ else
+ return wrap(function() end)
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/font-chk.lua b/Master/texmf-dist/tex/context/base/font-chk.lua
index 32fdf88940a..e3679f06dba 100644
--- a/Master/texmf-dist/tex/context/base/font-chk.lua
+++ b/Master/texmf-dist/tex/context/base/font-chk.lua
@@ -7,14 +7,19 @@ if not modules then modules = { } end modules ['font-chk'] = {
}
-- possible optimization: delayed initialization of vectors
+-- move to the nodes namespace
-fonts = fonts or { }
-fonts.checkers = fonts.checkers or { }
+local report_fonts = logs.reporter("fonts","checking")
+
+local fonts = fonts
+fonts.checkers = fonts.checkers or { }
local checkers = fonts.checkers
-local fontdata = fonts.ids
+
+local fontdata = fonts.hashes.identifiers
local is_character = characters.is_character
local chardata = characters.data
+local tasks = nodes.tasks
local glyph = node.id('glyph')
local traverse_id = node.traverse_id
@@ -26,7 +31,9 @@ local remove_node = nodes.remove
checkers.enabled = false
checkers.delete = false
-function fonts.register_message(font,char,message)
+-- to tfmdata.properties ?
+
+local function onetimemessage(font,char,message)
local tfmdata = fontdata[font]
local shared = tfmdata.shared
local messages = shared.messages
@@ -40,11 +47,13 @@ function fonts.register_message(font,char,message)
messages[message] = category
end
if not category[char] then
- logs.report("fonts","char U+%04X in font '%s' with id %s: %s",char,tfmdata.fullname,font,message)
+ report_fonts("char U+%05X in font '%s' with id %s: %s",char,tfmdata.properties.fullname,font,message)
category[char] = true
end
end
+fonts.loggers.onetimemessage = onetimemessage
+
function checkers.missing(head)
if checkers.enabled then
local lastfont, characters, found = nil, nil, nil
@@ -55,9 +64,9 @@ function checkers.missing(head)
end
if not characters[char] and is_character[chardata[char].category] then
if checkers.delete then
- fonts.register_message(font,char,"missing (will be deleted)")
+ onetimemessage(font,char,"missing (will be deleted)")
else
- fonts.register_message(font,char,"missing")
+ onetimemessage(font,char,"missing")
end
if not found then
found = { n }
diff --git a/Master/texmf-dist/tex/context/base/font-cid.lua b/Master/texmf-dist/tex/context/base/font-cid.lua
index d1c727af2d9..4a4c4d20916 100644
--- a/Master/texmf-dist/tex/context/base/font-cid.lua
+++ b/Master/texmf-dist/tex/context/base/font-cid.lua
@@ -8,15 +8,19 @@ if not modules then modules = { } end modules ['font-cid'] = {
local format, match, lower = string.format, string.match, string.lower
local tonumber = tonumber
-local lpegmatch = lpeg.match
+local P, S, R, C, V, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.match
-local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
-fonts = fonts or { }
-fonts.cid = fonts.cid or { }
-fonts.cid.map = fonts.cid.map or { }
-fonts.cid.max = fonts.cid.max or 10
+local report_otf = logs.reporter("fonts","otf loading")
+local fonts = fonts
+
+local cid = { }
+fonts.cid = cid
+
+local cidmap = { }
+local cidmax = 10
-- original string parser: 0.109, lpeg parser: 0.036 seconds for Adobe-CNS1-4.cidmap
--
@@ -25,14 +29,14 @@ fonts.cid.max = fonts.cid.max or 10
-- 1..95 0020
-- 99 3000
-local number = lpeg.C(lpeg.R("09","af","AF")^1)
-local space = lpeg.S(" \n\r\t")
+local number = C(R("09","af","AF")^1)
+local space = S(" \n\r\t")
local spaces = space^0
-local period = lpeg.P(".")
+local period = P(".")
local periods = period * period
-local name = lpeg.P("/") * lpeg.C((1-space)^1)
+local name = P("/") * C((1-space)^1)
-local unicodes, names = { }, { }
+local unicodes, names = { }, { } -- we could use Carg now
local function do_one(a,b)
unicodes[tonumber(a)] = tonumber(b,16)
@@ -50,15 +54,15 @@ local function do_name(a,b)
names[tonumber(a)] = b
end
-local grammar = lpeg.P { "start",
- start = number * spaces * number * lpeg.V("series"),
- series = (spaces * (lpeg.V("one") + lpeg.V("range") + lpeg.V("named")) )^1,
+local grammar = P { "start",
+ start = number * spaces * number * V("series"),
+ series = (spaces * (V("one") + V("range") + V("named")))^1,
one = (number * spaces * number) / do_one,
range = (number * periods * number * spaces * number) / do_range,
named = (number * spaces * name) / do_name
}
-function fonts.cid.load(filename)
+local function loadcidfile(filename)
local data = io.loaddata(filename)
if data then
unicodes, names = { }, { }
@@ -72,76 +76,90 @@ function fonts.cid.load(filename)
unicodes = unicodes,
names = names
}
- else
- return nil
end
end
-local template = "%s-%s-%s.cidmap"
+cid.loadfile = loadcidfile -- we use the frozen variant
+local template = "%s-%s-%s.cidmap"
local function locate(registry,ordering,supplement)
local filename = format(template,registry,ordering,supplement)
local hashname = lower(filename)
- local cidmap = fonts.cid.map[hashname]
- if not cidmap then
+ local found = cidmap[hashname]
+ if not found then
if trace_loading then
- logs.report("load otf","checking cidmap, registry: %s, ordering: %s, supplement: %s, filename: %s",registry,ordering,supplement,filename)
+ report_otf("checking cidmap, registry: %s, ordering: %s, supplement: %s, filename: %s",registry,ordering,supplement,filename)
end
- local fullname = resolvers.find_file(filename,'cid') or ""
+ local fullname = resolvers.findfile(filename,'cid') or ""
if fullname ~= "" then
- cidmap = fonts.cid.load(fullname)
- if cidmap then
+ found = loadcidfile(fullname)
+ if found then
if trace_loading then
- logs.report("load otf","using cidmap file %s",filename)
+ report_otf("using cidmap file %s",filename)
end
- fonts.cid.map[hashname] = cidmap
- cidmap.usedname = file.basename(filename)
- return cidmap
+ cidmap[hashname] = found
+ found.usedname = file.basename(filename)
end
end
end
- return cidmap
+ return found
end
-function fonts.cid.getmap(registry,ordering,supplement)
- -- cf Arthur R. we can safely scan upwards since cids are downward compatible
- local supplement = tonumber(supplement)
+-- cf Arthur R. we can safely scan upwards since cids are downward compatible
+
+function cid.getmap(specification)
+ if not specification then
+ report_otf("invalid cidinfo specification (table expected)")
+ return
+ end
+ 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)]
+ if found then
+ return found
+ end
if trace_loading then
- logs.report("load otf","needed cidmap, registry: %s, ordering: %s, supplement: %s",registry,ordering,supplement)
+ report_otf("needed cidmap, registry: %s, ordering: %s, supplement: %s",registry,ordering,supplement)
end
- local cidmap = locate(registry,ordering,supplement)
- if not cidmap then
+ found = locate(registry,ordering,supplement)
+ if not found then
+ local supnum = tonumber(supplement)
local cidnum = nil
-- next highest (alternatively we could start high)
- if supplement < fonts.cid.max then
- for supplement=supplement+1,fonts.cid.max do
- local c = locate(registry,ordering,supplement)
+ if supnum < cidmax then
+ for s=supnum+1,cidmax do
+ local c = locate(registry,ordering,s)
if c then
- cidmap, cidnum = c, supplement
+ found, cidnum = c, s
break
end
end
end
-- next lowest (least worse fit)
- if not cidmap and supplement > 0 then
- for supplement=supplement-1,0,-1 do
- local c = locate(registry,ordering,supplement)
+ if not found and supnum > 0 then
+ for s=supnum-1,0,-1 do
+ local c = locate(registry,ordering,s)
if c then
- cidmap, cidnum = c, supplement
+ found, cidnum = c, s
break
end
end
end
- -- prevent further lookups
- if cidmap and cidnum > 0 then
+ -- prevent further lookups -- somewhat tricky
+ registry = lower(registry)
+ ordering = lower(ordering)
+ if found and cidnum > 0 then
for s=0,cidnum-1 do
- filename = format(template,registry,ordering,s)
- if not fonts.cid.map[filename] then
- fonts.cid.map[filename] = cidmap -- copy of ref
+ local filename = format(template,registry,ordering,s)
+ if not cidmap[filename] then
+ cidmap[filename] = found
end
end
end
end
- return cidmap
+ return found
end
diff --git a/Master/texmf-dist/tex/context/base/font-col.lua b/Master/texmf-dist/tex/context/base/font-col.lua
index d313357a2e0..e0d2fed112d 100644
--- a/Master/texmf-dist/tex/context/base/font-col.lua
+++ b/Master/texmf-dist/tex/context/base/font-col.lua
@@ -8,27 +8,29 @@ if not modules then modules = { } end modules ['font-col'] = {
-- possible optimization: delayed initialization of vectors
-local format, gmatch, texsprint, type = string.format, string.gmatch, tex.sprint, type
-local traverse_id, first_character = node.traverse_id, node.first_character
+local gmatch, type = string.gmatch, type
+local traverse_id = node.traverse_id
local lpegmatch = lpeg.match
-
-local ctxcatcodes = tex.ctxcatcodes
+local settings_to_hash = utilities.parsers.settings_to_hash
local trace_collecting = false trackers.register("fonts.collecting", function(v) trace_collecting = v end)
-local fontdata = fonts.ids
+local report_fonts = logs.reporter("fonts","collections")
-local glyph = node.id('glyph')
+local fonts, context = fonts, context
-fonts.normalizers = fonts.normalizers or { }
+fonts.collections = fonts.collections or { }
+local collections = fonts.collections
-fonts.collections = fonts.collections or { }
-fonts.collections.definitions = fonts.collections.definitions or { }
-fonts.collections.vectors = fonts.collections.vectors or { }
+collections.definitions = collections.definitions or { }
+local definitions = collections.definitions
-local collections = fonts.collections
-local definitions = fonts.collections.definitions
-local vectors = fonts.collections.vectors
+collections.vectors = collections.vectors or { }
+local vectors = collections.vectors
+
+local fontdata = fonts.hashes.identifiers
+
+local glyph = node.id('glyph')
local list, current, active = { }, 0, false
@@ -54,28 +56,28 @@ function collections.define(name,font,ranges,details)
local d = definitions[name]
if d then
if name and trace_collecting then
- logs.report("fonts","def: extending set %s using %s",name, font)
+ report_fonts("def: extending set %s using %s",name, font)
end
else
if name and trace_collecting then
- logs.report("fonts","def: defining set %s using %s",name, font)
+ report_fonts("def: defining set %s using %s",name, font)
end
d = { }
definitions[name] = d
end
- details = aux.settings_to_hash(details)
+ details = settings_to_hash(details)
-- todo, combine per font start/stop as arrays
- for s in gmatch(ranges,"([^, ]+)") do
+ for s in gmatch(ranges,"[^, ]+") do
local start, stop, description = characters.getrange(s)
if start and stop then
if trace_collecting then
if description then
- logs.report("fonts","def: using range %s (U+%04x-U+%04X, %s)",s,start,stop,description)
+ report_fonts("def: using range %s (U+%05x-U+%05X, %s)",s,start,stop,description)
end
for i=1,#d do
local di = d[i]
if (start >= di.start and start <= di.stop) or (stop >= di.start and stop <= di.stop) then
- logs.report("fonts","def: overlapping ranges U+%04x-U+%04X and U+%04x-U+%04X",start,stop,di.start,di.stop)
+ report_fonts("def: overlapping ranges U+%05x-U+%05X and U+%05x-U+%05X",start,stop,di.start,di.stop)
end
end
end
@@ -85,27 +87,27 @@ function collections.define(name,font,ranges,details)
end
end
-function collections.stage_1(name)
+function collections.stage_one(name)
local last = font.current()
if trace_collecting then
- logs.report("fonts","def: registering font %s with name %s",last,name)
+ report_fonts("def: registering font %s with name %s",last,name)
end
list[#list+1] = last
end
-function collections.stage_2(name)
+function collections.stage_two(name)
statistics.starttiming(fonts)
local d = definitions[name]
local t = { }
if trace_collecting then
- logs.report("fonts","def: process collection %s",name)
+ report_fonts("def: process collection %s",name)
end
for i=1,#d do
local f = d[i]
local id = list[i]
local start, stop = f.start, f.stop
if trace_collecting then
- logs.report("fonts","def: remapping font %s to %s for range U+%04X - U+%04X",current,id,start,stop)
+ report_fonts("def: remapping font %s to %s for range U+%05X - U+%05X",current,id,start,stop)
end
local check = toboolean(f.check or "false",true)
local force = toboolean(f.force or "true",true)
@@ -138,12 +140,14 @@ function collections.stage_2(name)
end
vectors[current] = t
if trace_collecting then
- logs.report("fonts","def: activating collection %s for font %s",name,current)
+ report_fonts("def: activating collection %s for font %s",name,current)
end
active = true
statistics.stoptiming(fonts)
end
+-- we already have this parser
+
local P, Cc = lpeg.P, lpeg.Cc
local spec = (P("sa") + P("at") + P("scaled") + P("at") + P("mo")) * P(" ")^1 * (1-P(" "))^1 * P(" ")^0 * -1
local okay = ((1-spec)^1 * spec * Cc(true)) + Cc(false)
@@ -158,37 +162,37 @@ function collections.prepare(name)
local d = definitions[name]
if d then
if trace_collecting then
- local filename = file.basename(fontdata[current].filename or "?")
- logs.report("fonts","def: applying collection %s to %s (file: %s)",name,current,filename)
+ local filename = file.basename(fontdata[current].properties.filename or "?")
+ report_fonts("def: applying collection %s to %s (file: %s)",name,current,filename)
end
list = { }
- texsprint(ctxcatcodes,"\\dostartcloningfonts") -- move this to tex \dostart...
+ context.dostartcloningfonts() -- move this to tex \dostart...
for i=1,#d do
local f = d[i]
local name = f.font
local scale = f.rscale or 1
if lpegmatch(okay,name) then
- texsprint(ctxcatcodes,format("\\doclonefonta{%s}{%s}",name,scale)) -- define with unique specs
+ context.doclonefonta(name,scale) -- define with unique specs
else
- texsprint(ctxcatcodes,format("\\doclonefontb{%s}{%s}",name,scale)) -- define with inherited specs
+ context.doclonefontb(name,scale) -- define with inherited specs
end
- texsprint(ctxcatcodes,format("\\ctxlua{fonts.collections.stage_1('%s')}",name)) -- registering main font
+ context.doclonefontstageone(name) -- registering main font
end
- texsprint(ctxcatcodes,format("\\ctxlua{fonts.collections.stage_2('%s')}",name)) -- preparing clone vectors
- texsprint(ctxcatcodes,"\\dostopcloningfonts")
+ context.doclonefontstagetwo(name) -- preparing clone vectors
+ context.dostopcloningfonts()
elseif trace_collecting then
- local filename = file.basename(fontdata[current].filename or "?")
- logs.report("fonts","def: error in applying collection %s to %s (file: %s)",name,current,filename)
+ local filename = file.basename(fontdata[current].properties.filename or "?")
+ report_fonts("def: error in applying collection %s to %s (file: %s)",name,current,filename)
end
end
function collections.message(message)
if trace_collecting then
- logs.report("fonts","tex: %s",message)
+ report_fonts("tex: %s",message)
end
end
-function collections.process(head)
+function collections.process(head) -- this way we keep feature processing
if active then
local done = false
for n in traverse_id(glyph,head) do
@@ -199,18 +203,20 @@ function collections.process(head)
if type(id) == "table" then
local newid, newchar = id[1], id[2]
if trace_collecting then
- logs.report("fonts","lst: remapping character %s in font %s to character %s in font %s",n.char,n.font,newchar,newid)
+ report_fonts("lst: remapping character %s in font %s to character %s in font %s",n.char,n.font,newchar,newid)
end
n.font, n.char = newid, newchar
else
if trace_collecting then
- logs.report("fonts","lst: remapping font %s to %s for character %s",n.font,id,n.char)
+ report_fonts("lst: remapping font %s to %s for character %s",n.font,id,n.char)
end
n.font = id
end
end
end
end
+ return head, done
+ else
+ return head, false
end
- return head, done
end
diff --git a/Master/texmf-dist/tex/context/base/font-col.mkiv b/Master/texmf-dist/tex/context/base/font-col.mkiv
index 181b985f68e..f4f9a9dc723 100644
--- a/Master/texmf-dist/tex/context/base/font-col.mkiv
+++ b/Master/texmf-dist/tex/context/base/font-col.mkiv
@@ -79,7 +79,7 @@
{\egroup}
\def\doclonefonta#1#2% kind of dododefinefont
- {\ctxlua{fonts.collections.message("defining #1 (relative scale: #2)")}%
+ {\ctxlua{fonts.collections.message("defining #1 (relative scale: #2)")}% brrr
\autofontsizefalse
\let\lastfontidentifier\s!dummy
\def\localrelativefontsize{#2}%
@@ -93,6 +93,12 @@
\def\doclonefontb#1% #2
{\doclonefonta{#1 \savedfontspec}}
+\def\doclonefontstageone#1%
+ {\ctxlua{fonts.collections.stage_one("#1")}}
+
+\def\doclonefontstagetwo#1%
+ {\ctxlua{fonts.collections.stage_two("#1")}}
+
% check : only replace when present in replacement font (default: no)
% force : force replacent even when basefont has glyph (default: yes)
@@ -104,16 +110,7 @@
%
% \definefontsynonym[SerifPlus][Serif][fallbacks=whatever]
%
-% \definefont[MySerif][SerifPlus at 10pt]
-%
-% \startcolumns[n=6]
-% \MySerif
-% \dostepwiserecurse {0} {65000} {1} {
-% \iffontchar\font\recurselevel
-% {\tttf\uchexnumbers\recurselevel:} \char\recurselevel\par
-% \fi
-% }
-% \stopcolumns
+% \showfont[SerifPlus][all]
% \definefontfeature[zh][mode=node,script=hang,lang=zhs]
% \definefontfallback[serifwhatever] [lmroman10-regular] [0x0000-0x0400][force=yes]
diff --git a/Master/texmf-dist/tex/context/base/font-con.lua b/Master/texmf-dist/tex/context/base/font-con.lua
new file mode 100644
index 00000000000..5d30842ef7f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/font-con.lua
@@ -0,0 +1,1135 @@
+if not modules then modules = { } end modules ['font-con'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+
+local utf = unicode.utf8
+
+local next, tostring, rawget = next, tostring, rawget
+local format, match, lower, gsub = string.format, string.match, string.lower, string.gsub
+local utfbyte = utf.byte
+local sort, insert, concat, sortedkeys, serialize, fastcopy = table.sort, table.insert, table.concat, table.sortedkeys, table.serialize, table.fastcopy
+
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+local trace_scaling = false trackers.register("fonts.scaling" , function(v) trace_scaling = v end)
+
+local report_defining = logs.reporter("fonts","defining")
+
+-- watch out: no negative depths and negative eights permitted in regular fonts
+
+--[[ldx--
+<p>Here we only implement a few helper functions.</p>
+--ldx]]--
+
+local fonts = fonts
+local constructors = { }
+fonts.constructors = constructors
+local handlers = { }
+fonts.handlers = handlers
+
+local specifiers = fonts.specifiers
+local contextsetups = specifiers.contextsetups
+local contextnumbers = specifiers.contextnumbers
+
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+
+-- will be directives
+
+constructors.dontembed = allocate()
+constructors.mathactions = { }
+constructors.autocleanup = true
+constructors.namemode = "fullpath" -- will be a function
+
+constructors.version = 1.01
+constructors.cache = containers.define("fonts", "constructors", constructors.version, false)
+
+constructors.privateoffset = 0xF0000 -- 0x10FFFF
+
+-- This might become an interface;
+
+local designsizes = allocate()
+constructors.designsizes = designsizes
+local loadedfonts = allocate()
+constructors.loadedfonts = loadedfonts
+
+--[[ldx--
+<p>We need to normalize the scale factor (in scaled points). This has to
+do with the fact that <l n='tex'/> uses a negative multiple of 1000 as
+a signal for a font scaled based on the design size.</p>
+--ldx]]--
+
+local factors = {
+ pt = 65536.0,
+ bp = 65781.8,
+}
+
+function constructors.setfactor(f)
+ constructors.factor = factors[f or 'pt'] or factors.pt
+end
+
+constructors.setfactor()
+
+function constructors.scaled(scaledpoints, designsize) -- handles designsize in sp as well
+ if scaledpoints < 0 then
+ if designsize then
+ local factor = constructors.factor
+ if designsize > factor then -- or just 1000 / when? mp?
+ return (- scaledpoints/1000) * designsize -- sp's
+ else
+ return (- scaledpoints/1000) * designsize * factor
+ end
+ else
+ return (- scaledpoints/1000) * 10 * factor
+ end
+ else
+ return scaledpoints
+ end
+end
+
+--[[ldx--
+<p>Beware, the boundingbox is passed as reference so we may not overwrite it
+in the process; numbers are of course copies. Here 65536 equals 1pt. (Due to
+excessive memory usage in CJK fonts, we no longer pass the boundingbox.)</p>
+--ldx]]--
+
+-- The scaler is only used for otf and afm and virtual fonts. If
+-- a virtual font has italic correction make sure to set the
+-- italic_correction flag. Some more flags will be added in
+-- the future.
+
+--[[ldx--
+<p>The reason why the scaler was originally split, is that for a while we experimented
+with a helper function. However, in practice the <l n='api'/> calls are too slow to
+make this profitable and the <l n='lua'/> based variant was just faster. A days
+wasted day but an experience richer.</p>
+--ldx]]--
+
+-- we can get rid of the tfm instance when we have fast access to the
+-- scaled character dimensions at the tex end, e.g. a fontobject.width
+-- actually we already have soem of that now as virtual keys in glyphs
+--
+-- flushing the kern and ligature tables from memory saves a lot (only
+-- base mode) but it complicates vf building where the new characters
+-- demand this data .. solution: functions that access them
+
+function constructors.cleanuptable(tfmdata)
+ if constructors.autocleanup and tfmdata.properties.virtualized then
+ for k, v in next, tfmdata.characters do
+ if v.commands then v.commands = nil end
+ -- if v.kerns then v.kerns = nil end
+ end
+ end
+end
+
+-- experimental, sharing kerns (unscaled and scaled) saves memory
+-- local sharedkerns, basekerns = constructors.check_base_kerns(tfmdata)
+-- loop over descriptions (afm and otf have descriptions, tfm not)
+-- there is no need (yet) to assign a value to chr.tonunicode
+
+-- constructors.prepare_base_kerns(tfmdata) -- optimalization
+
+-- we have target.name=metricfile and target.fullname=RealName and target.filename=diskfilename
+-- when collapsing fonts, luatex looks as both target.name and target.fullname as ttc files
+-- can have multiple subfonts
+
+function constructors.calculatescale(tfmdata,scaledpoints)
+ local parameters = tfmdata.parameters
+ if scaledpoints < 0 then
+ scaledpoints = (- scaledpoints/1000) * (tfmdata.designsize or parameters.designsize) -- already in sp
+ end
+ return scaledpoints, scaledpoints / (parameters.units or 1000) -- delta
+end
+
+function constructors.assignmathparameters(target,tfmdata)
+ -- when a tfm file is loaded, it has already been scaled
+ -- and it never enters the scaled so this is otf only
+ local mathparameters = original.mathparameters
+ if mathparameters and next(mathparameters) then
+ local targetparameters = target.parameters
+ local targetmathparameters = { }
+ local factor = targetparameters.factor
+ for name, value in next, mathparameters do
+ if name == "RadicalDegreeBottomRaisePercent" then
+ targetmathparameters[name] = value
+ else
+ targetmathparameters[name] = value * factor
+ end
+ end
+ if not targetmathparameters.AccentBaseHeight then
+ targetmathparameters.AccentBaseHeight = nil -- safeguard, still needed?
+ end
+ if not targetmathparameters.FractionDelimiterSize then
+ targetmathparameters.FractionDelimiterSize = 0
+ end
+ if not mathparameters.FractionDelimiterDisplayStyleSize then
+ targetmathparameters.FractionDelimiterDisplayStyleSize = 0
+ end
+ target.mathparameters = targetmathparameters
+ end
+end
+
+function constructors.scale(tfmdata,specification)
+ local target = { } -- the new table
+ --
+ if tonumber(specification) then
+ specification = { size = specification }
+ end
+ --
+ local scaledpoints = specification.size
+ local relativeid = specification.relativeid
+ --
+ local properties = tfmdata.properties or { }
+ local goodies = tfmdata.goodies or { }
+ local resources = tfmdata.resources or { }
+ local descriptions = tfmdata.descriptions or { } -- bad news if empty
+ local characters = tfmdata.characters or { } -- bad news if empty
+ local changed = tfmdata.changed or { } -- for base mode
+ local shared = tfmdata.shared or { }
+ local parameters = tfmdata.parameters or { }
+ local mathparameters = tfmdata.mathparameters or { }
+ --
+ local targetcharacters = { }
+ local targetdescriptions = table.derive(descriptions)
+ local targetparameters = table.derive(parameters)
+ -- local targetmathparameters = table.fastcopy(mathparameters) -- happens elsewhere
+ local targetproperties = table.derive(properties)
+ local targetgoodies = goodies -- we need to loop so no metatable
+ target.characters = targetcharacters
+ target.descriptions = targetdescriptions
+ target.parameters = targetparameters
+ -- target.mathparameters = targetmathparameters -- happens elsewhere
+ target.properties = targetproperties
+ target.goodies = targetgoodies
+ target.shared = shared
+ target.resources = resources
+ target.unscaled = tfmdata -- the original unscaled one
+ --
+ -- specification.mathsize : 1=text 2=script 3=scriptscript
+ -- specification.textsize : natural (text)size
+ -- parameters.mathsize : 1=text 2=script 3=scriptscript >1000 enforced size (feature value other than yes)
+ --
+ local mathsize = tonumber(specification.mathsize) or 0
+ local textsize = tonumber(specification.textsize) or scaledpoints
+ local forcedsize = tonumber(parameters.mathsize ) or 0
+ if (mathsize == 2 or forcedsize == 2) and parameters.scriptpercentage then
+ scaledpoints = parameters.scriptpercentage * textsize / 100
+ elseif (mathsize == 3 or forcedsize == 3) and parameters.scriptscriptpercentage then
+ scaledpoints = parameters.scriptscriptpercentage * textsize / 100
+ elseif forcedsize > 1000 then -- safeguard
+ scaledpoints = forcedsize
+ end
+ --
+ local tounicode = resources.tounicode
+ local defaultwidth = resources.defaultwidth or 0
+ local defaultheight = resources.defaultheight or 0
+ local defaultdepth = resources.defaultdepth or 0
+ local units = parameters.units or 1000
+ --
+ if target.fonts then
+ target.fonts = fastcopy(target.fonts) -- maybe we virtualize more afterwards
+ end
+ --
+ -- boundary keys are no longer needed as we now have a string 'right_boundary'
+ -- that can be used in relevant tables (kerns and ligatures) ... not that I ever
+ -- used them
+ --
+ -- boundarychar_label = 0, -- not needed
+ -- boundarychar = 65536, -- there is now a string 'right_boundary'
+ -- false_boundarychar = 65536, -- produces invalid tfm in luatex
+ --
+ targetproperties.language = properties.language or "dflt" -- inherited
+ targetproperties.script = properties.script or "dflt" -- inherited
+ targetproperties.mode = properties.mode or "base" -- inherited
+ --
+ local askedscaledpoints = scaledpoints
+ local scaledpoints, delta = constructors.calculatescale(tfmdata,scaledpoints) -- no shortcut, dan be redefined
+ --
+ local hdelta = delta
+ local vdelta = delta
+ --
+ target.designsize = parameters.designsize -- not really needed so it muight become obsolete
+ target.units_per_em = units -- just a trigger for the backend (does luatex use this? if not it will go)
+ --
+ local direction = properties.direction or tfmdata.direction or 0 -- pointless, as we don't use omf fonts at all
+ target.direction = direction
+ properties.direction = direction
+ --
+ target.size = scaledpoints
+ --
+ target.encodingbytes = properties.encodingbytes or 1
+ target.embedding = properties.embedding or "subset"
+ target.tounicode = 1
+ target.cidinfo = properties.cidinfo
+ target.format = properties.format
+ --
+ 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
+ local filename = properties.filename or tfmdata.filename -- that is not the right place to
+ local psname = properties.psname or tfmdata.psname -- pass them
+ local name = properties.name or tfmdata.name
+ --
+ if not psname or psname == "" then
+ -- name used in pdf file as well as for selecting subfont in ttc/dfont
+ psname = fontname or (fullname and fonts.names.cleanname(fullname))
+ end
+ target.fontname = fontname
+ target.fullname = fullname
+ target.filename = filename
+ target.psname = psname
+ target.name = name
+ --
+ properties.fontname = fontname
+ properties.fullname = fullname
+ properties.filename = filename
+ properties.psname = psname
+ properties.name = name
+ -- expansion (hz)
+ local expansion = parameters.expansion
+ if expansion then
+ target.stretch = expansion.stretch
+ target.shrink = expansion.shrink
+ target.step = expansion.step
+ target.auto_expand = expansion.auto
+ end
+ -- protrusion
+ local protrusion = parameters.protrusion
+ if protrusion then
+ target.auto_protrude = protrusion.auto
+ end
+ -- widening
+ local extend_factor = parameters.extend_factor or 0
+ if extend_factor ~= 0 and extend_factor ~= 1 then
+ hdelta = hdelta * extend_factor
+ target.extend = extend_factor * 1000 -- extent ?
+ else
+ target.extend = 1000 -- extent ?
+ end
+ -- slanting
+ local slant_factor = parameters.slant_factor or 0
+ if slant_factor ~= 0 then
+ target.slant = slant_factor * 1000
+ else
+ target.slant = 0
+ end
+ --
+ targetparameters.factor = delta
+ targetparameters.hfactor = hdelta
+ targetparameters.vfactor = vdelta
+ targetparameters.size = scaledpoints
+ targetparameters.units = units
+ targetparameters.scaledpoints = askedscaledpoints
+ --
+ local isvirtual = properties.virtualized or tfmdata.type == "virtual"
+ local hasquality = target.auto_expand or target.auto_protrude
+ local hasitalic = properties.italic_correction
+ local stackmath = not properties.no_stackmath
+ local nonames = properties.noglyphnames
+ local nodemode = properties.mode == "node"
+ --
+ if changed and not next(changed) then
+ changed = false
+ end
+ --
+ target.type = isvirtual and "virtual" or "real"
+ -- this will move to some subtable so that it is copied at once
+ target.postprocessors = tfmdata.postprocessors
+ --
+ local targetslant = (parameters.slant or parameters[1] or 0)
+ local targetspace = (parameters.space or parameters[2] or 0)*hdelta
+ local targetspace_stretch = (parameters.space_stretch or parameters[3] or 0)*hdelta
+ local targetspace_shrink = (parameters.space_shrink or parameters[4] or 0)*hdelta
+ local targetx_height = (parameters.x_height or parameters[5] or 0)*vdelta
+ local targetquad = (parameters.quad or parameters[6] or 0)*hdelta
+ local targetextra_space = (parameters.extra_space or parameters[7] or 0)*hdelta
+ --
+ targetparameters.slant = targetslant
+ targetparameters.space = targetspace
+ targetparameters.space_stretch = targetspace_stretch
+ targetparameters.space_shrink = targetspace_shrink
+ targetparameters.x_height = targetx_height
+ targetparameters.quad = targetquad
+ targetparameters.extra_space = targetextra_space
+ --
+ local ascender = parameters.ascender
+ if ascender then
+ targetparameters.ascender = delta * ascender
+ end
+ local descender = parameters.descender
+ if descender then
+ targetparameters.descender = delta * descender
+ end
+ -- copies, might disappear
+ targetparameters.xheight = targetparameters.xheight or parameters.x_height
+ targetparameters.extraspace = targetparameters.extraspace or parameters.extra_space
+ targetparameters.spacestretch = targetparameters.spacestretch or parameters.space_stretch
+ targetparameters.spaceshrink = targetparameters.spaceshrink or parameters.space_shrink
+ --
+ local protrusionfactor = (targetquad ~= 0 and 1000/targetquad) or 0
+ local scaledwidth = defaultwidth * hdelta
+ local scaledheight = defaultheight * vdelta
+ local scaleddepth = defaultdepth * vdelta
+ --
+ local hasmath = (properties.has_math or next(mathparameters)) and true
+ if hasmath then
+ if trace_defining then
+ report_defining("math enabled for: name '%s', fullname: '%s', filename: '%s'",
+ name or "noname",fullname or "nofullname",filename or "nofilename")
+ end
+ constructors.assignmathparameters(target,tfmdata) -- does scaling and whatever is needed
+ properties.has_math = true
+ target.nomath = false
+ target.MathConstants = target.mathparameters
+ else
+ if trace_defining then
+ report_defining("math disabled for: name '%s', fullname: '%s', filename: '%s'",
+ name or "noname",fullname or "nofullname",filename or "nofilename")
+ end
+ properties.has_math = false
+ target.nomath = true
+ target.mathparameters = nil -- nop
+ end
+ --
+ local sharedkerns = { }
+ --
+ for unicode, character in next, characters do
+ local chr, description, index
+ if changed then
+ -- basemode hack
+ local c = changed[unicode]
+ if c then
+ description = descriptions[c] or character
+ character = characters[c] or character
+ index = description.index or c
+ else
+ description = descriptions[unicode] or character
+ index = description.index or unicode
+ end
+ else
+ description = descriptions[unicode] or character
+ index = description.index or unicode
+ end
+ local width = description.width
+ local height = description.height
+ local depth = description.depth
+ 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
+ if depth and depth ~= 0 then
+ depth = delta*depth
+ if nonames then
+ chr = {
+ index = index,
+ height = height,
+ depth = depth,
+ width = width,
+ }
+ else
+ chr = {
+ name = description.name,
+ index = index,
+ height = height,
+ depth = depth,
+ width = width,
+ }
+ end
+ else
+ -- this saves a little bit of memory time and memory, esp for big cjk fonts
+ if nonames then
+ chr = {
+ index = index,
+ height = height,
+ width = width,
+ }
+ else
+ chr = {
+ name = description.name,
+ index = index,
+ height = height,
+ width = width,
+ }
+ end
+ end
+ -- if trace_scaling then
+ -- report_defining("t=%s, u=%s, i=%s, n=%s c=%s",k,chr.tounicode or "",index or 0,description.name or '-',description.class or '-')
+ -- end
+ if tounicode then
+ local tu = tounicode[index] -- nb: index!
+ if tu then
+ chr.tounicode = tu
+ end
+ end
+ if hasquality then
+ -- we could move these calculations elsewhere (saves calculations)
+ local ve = character.expansion_factor
+ if ve then
+ chr.expansion_factor = ve*1000 -- expansionfactor, hm, can happen elsewhere
+ end
+ local vl = character.left_protruding
+ if vl then
+ chr.left_protruding = protrusionfactor*width*vl
+ end
+ local vr = character.right_protruding
+ if vr then
+ chr.right_protruding = protrusionfactor*width*vr
+ end
+ end
+ -- todo: hasitalic
+ if hasitalic then
+ local vi = description.italic or character.italic
+ if vi and vi ~= 0 then
+ chr.italic = vi*hdelta
+ end
+ end
+ -- to be tested
+ if hasmath then
+ -- todo, just operate on descriptions.math
+ local vn = character.next
+ if vn then
+ chr.next = vn
+ -- if character.vert_variants or character.horiz_variants then
+ -- report_defining("glyph U+%05X has combination of next, vert_variants and horiz_variants",index)
+ -- end
+ else
+ local vv = character.vert_variants
+ if vv then
+ local t = { }
+ for i=1,#vv do
+ local vvi = vv[i]
+ t[i] = {
+ ["start"] = (vvi["start"] or 0)*vdelta,
+ ["end"] = (vvi["end"] or 0)*vdelta,
+ ["advance"] = (vvi["advance"] or 0)*vdelta,
+ ["extender"] = vvi["extender"],
+ ["glyph"] = vvi["glyph"],
+ }
+ end
+ chr.vert_variants = t
+ else
+ local hv = character.horiz_variants
+ if hv then
+ local t = { }
+ for i=1,#hv do
+ local hvi = hv[i]
+ t[i] = {
+ ["start"] = (hvi["start"] or 0)*hdelta,
+ ["end"] = (hvi["end"] or 0)*hdelta,
+ ["advance"] = (hvi["advance"] or 0)*hdelta,
+ ["extender"] = hvi["extender"],
+ ["glyph"] = hvi["glyph"],
+ }
+ end
+ chr.horiz_variants = t
+ end
+ end
+ end
+ local va = character.top_accent
+ if va then
+ chr.top_accent = vdelta*va
+ end
+ if stackmath then
+ local mk = character.mathkerns -- not in math ?
+ if mk then
+ local kerns = { }
+ local v = mk.top_right if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
+ end kerns.top_right = k end
+ local v = mk.top_left if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
+ end kerns.top_left = k end
+ local v = mk.bottom_left if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
+ end kerns.bottom_left = k end
+ local v = mk.bottom_right if v then local k = { } for i=1,#v do local vi = v[i]
+ k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
+ end kerns.bottom_right = k end
+ chr.mathkern = kerns -- singular -> should be patched in luatex !
+ end
+ end
+ end
+ if not nodemode then
+ local vk = character.kerns
+ if vk then
+ local s = sharedkerns[vk]
+ if not s then
+ s = { }
+ for k,v in next, vk do s[k] = v*hdelta end
+ sharedkerns[vk] = s
+ end
+ chr.kerns = s
+ end
+ local vl = character.ligatures
+ if vl then
+ if true then
+ chr.ligatures = vl -- shared
+ else
+ local tt = { }
+ for i,l in next, vl do
+ tt[i] = l
+ end
+ chr.ligatures = tt
+ end
+ end
+ end
+ if isvirtual then
+ local vc = character.commands
+ if vc then
+ -- we assume non scaled commands here
+ -- tricky .. we need to scale pseudo math glyphs too
+ -- which is why we deal with rules too
+ local ok = false
+ for i=1,#vc do
+ local key = vc[i][1]
+ if key == "right" or key == "down" then
+ ok = true
+ break
+ end
+ end
+ if ok then
+ local tt = { }
+ for i=1,#vc do
+ local ivc = vc[i]
+ local key = ivc[1]
+ if key == "right" then
+ tt[i] = { key, ivc[2]*hdelta }
+ elseif key == "down" then
+ tt[i] = { key, ivc[2]*vdelta }
+ elseif key == "rule" then
+ tt[i] = { key, ivc[2]*vdelta, ivc[3]*hdelta }
+ else -- not comment
+ tt[i] = ivc -- shared since in cache and untouched
+ end
+ end
+ chr.commands = tt
+ else
+ chr.commands = vc
+ end
+ chr.index = nil
+ end
+ end
+ targetcharacters[unicode] = chr
+ end
+ return target
+end
+
+function constructors.finalize(tfmdata)
+ if tfmdata.properties and tfmdata.properties.finalized then
+ return
+ end
+ --
+ if not tfmdata.characters then
+ return nil
+ end
+ --
+ if not tfmdata.goodies then
+ tfmdata.goodies = { } -- context specific
+ end
+ --
+ local parameters = tfmdata.parameters
+ if not parameters then
+ return nil
+ end
+ --
+ if not parameters.expansion then
+ parameters.expansion = {
+ stretch = tfmdata.stretch or 0,
+ shrink = tfmdata.shrink or 0,
+ step = tfmdata.step or 0,
+ auto = tfmdata.auto_expand or false,
+ }
+ end
+ --
+ if not parameters.protrusion then
+ parameters.protrusion = {
+ auto = auto_protrude
+ }
+ end
+ --
+ if not parameters.size then
+ parameters.size = tfmdata.size
+ end
+ --
+ if not parameters.extend_factor then
+ parameters.extend_factor = tfmdata.extend or 0
+ end
+ --
+ if not parameters.slant_factor then
+ parameters.slant_factor = tfmdata.slant or 0
+ end
+ --
+ if not parameters.designsize then
+ parameters.designsize = tfmdata.designsize or 655360
+ end
+ --
+ if not parameters.units then
+ parameters.units = tfmdata.units_per_em or 1000
+ end
+ --
+ if not tfmdata.descriptions then
+ local descriptions = { } -- yes or no
+ setmetatableindex(descriptions, function(t,k) local v = { } t[k] = v return v end)
+ tfmdata.descriptions = descriptions
+ end
+ --
+ local properties = tfmdata.properties
+ if not properties then
+ properties = { }
+ tfmdata.properties = properties
+ end
+ --
+ if not properties.virtualized then
+ properties.virtualized = tfmdata.type == "virtual"
+ end
+ --
+ if not tfmdata.properties then
+ tfmdata.properties = {
+ fontname = tfmdata.fontname,
+ filename = tfmdata.filename,
+ fullname = tfmdata.fullname,
+ name = tfmdata.name,
+ psname = tfmdata.psname,
+ --
+ encodingbytes = tfmdata.encodingbytes or 1,
+ embedding = tfmdata.embedding or "subset",
+ tounicode = tfmdata.tounicode or 1,
+ cidinfo = tfmdata.cidinfo or nil,
+ format = tfmdata.format or "type1",
+ direction = tfmdata.direction or 0,
+ }
+ end
+ if not tfmdata.resources then
+ tfmdata.resources = { }
+ end
+ if not tfmdata.shared then
+ tfmdata.shared = { }
+ end
+ --
+ -- tfmdata.fonts
+ -- tfmdata.unscaled
+ --
+ if not properties.has_math then
+ properties.has_math = not tfmdata.nomath
+ end
+ --
+ tfmdata.MathConstants = nil
+ tfmdata.postprocessors = nil
+ --
+ tfmdata.fontname = nil
+ tfmdata.filename = nil
+ tfmdata.fullname = nil
+ tfmdata.name = nil -- most tricky part
+ tfmdata.psname = nil
+ --
+ tfmdata.encodingbytes = nil
+ tfmdata.embedding = nil
+ tfmdata.tounicode = nil
+ tfmdata.cidinfo = nil
+ tfmdata.format = nil
+ tfmdata.direction = nil
+ tfmdata.type = nil
+ tfmdata.nomath = nil
+ tfmdata.designsize = nil
+ --
+ tfmdata.size = nil
+ tfmdata.stretch = nil
+ tfmdata.shrink = nil
+ tfmdata.step = nil
+ tfmdata.auto_expand = nil
+ tfmdata.auto_protrude = nil
+ tfmdata.extend = nil
+ tfmdata.slant = nil
+ tfmdata.units_per_em = nil
+ --
+ properties.finalized = true
+ --
+ return tfmdata
+end
+
+--[[ldx--
+<p>A unique hash value is generated by:</p>
+--ldx]]--
+
+local hashmethods = { }
+constructors.hashmethods = hashmethods
+
+function constructors.hashfeatures(specification) -- will be overloaded
+ local features = specification.features
+ if features then
+ local t, tn = { }, 0
+ for category, list in next, features do
+ if next(list) then
+ local hasher = hashmethods[category]
+ if hasher then
+ local hash = hasher(list)
+ if hash then
+ tn = tn + 1
+ t[tn] = category .. ":" .. hash
+ end
+ end
+ end
+ end
+ if tn > 0 then
+ return concat(t," & ")
+ end
+ end
+ return "unknown"
+end
+
+hashmethods.normal = function(list)
+ local s = { }
+ local n = 0
+ for k, v in next, list do
+ if k ~= "number" and k ~= "features" then -- I need to figure this out, features
+ n = n + 1
+ s[n] = k
+ end
+ end
+ if n > 0 then
+ sort(s)
+ for i=1,n do
+ local k = s[i]
+ s[i] = k .. '=' .. tostring(list[k])
+ end
+ return concat(s,"+")
+ end
+end
+
+--[[ldx--
+<p>In principle we can share tfm tables when we are in node for a font, but then
+we need to define a font switch as an id/attr switch which is no fun, so in that
+case users can best use dynamic features ... so, we will not use that speedup. Okay,
+when we get rid of base mode we can optimize even further by sharing, but then we
+loose our testcases for <l n='luatex'/>.</p>
+--ldx]]--
+
+function constructors.hashinstance(specification,force)
+ local hash, size, fallbacks = specification.hash, specification.size, specification.fallbacks
+ if force or not hash then
+ hash = constructors.hashfeatures(specification)
+ specification.hash = hash
+ end
+ if size < 1000 and designsizes[hash] then
+ size = math.round(constructors.scaled(size,designsizes[hash]))
+ specification.size = size
+ end
+ -- local mathsize = specification.mathsize or 0
+ -- if mathsize > 0 then
+ -- local textsize = specification.textsize
+ -- if fallbacks then
+ -- return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ] @ ' .. fallbacks
+ -- else
+ -- return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ]'
+ -- end
+ -- else
+ if fallbacks then
+ return hash .. ' @ ' .. tostring(size) .. ' @ ' .. fallbacks
+ else
+ return hash .. ' @ ' .. tostring(size)
+ end
+ -- end
+end
+
+function constructors.setname(tfmdata,specification) -- todo: get specification from tfmdata
+ if constructors.namemode == "specification" then
+ -- not to be used in context !
+ local specname = specification.specification
+ if specname then
+ tfmdata.properties.name = specname
+ if trace_defining then
+ report_otf("overloaded fontname: '%s'",specname)
+ end
+ end
+ end
+end
+
+function constructors.checkedfilename(data)
+ local foundfilename = data.foundfilename
+ if not foundfilename then
+ local askedfilename = data.filename or ""
+ if askedfilename ~= "" then
+ askedfilename = resolvers.resolve(askedfilename) -- no shortcut
+ foundfilename = resolvers.findbinfile(askedfilename,"") or ""
+ if foundfilename == "" then
+ report_defining("source file '%s' is not found",askedfilename)
+ foundfilename = resolvers.findbinfile(file.basename(askedfilename),"") or ""
+ if foundfilename ~= "" then
+ report_defining("using source file '%s' (cache mismatch)",foundfilename)
+ end
+ end
+ end
+ data.foundfilename = foundfilename
+ end
+ return foundfilename
+end
+
+local formats = allocate()
+fonts.formats = formats
+
+setmetatableindex(formats, function(t,k)
+ local l = lower(k)
+ if rawget(t,k) then
+ t[k] = l
+ return l
+ end
+ return rawget(t,file.extname(l))
+end)
+
+local locations = { }
+
+local function setindeed(mode,target,group,name,action,position)
+ local t = target[mode]
+ if not t then
+ report_defining("fatal error in setting feature '%s', group '%s', mode '%s'",name or "?",group or "?",mode)
+ os.exit()
+ elseif position then
+ -- todo: remove existing
+ insert(t, position, { name = name, action = action })
+ else
+ for i=1,#t do
+ local ti = t[i]
+ if ti.name == name then
+ ti.action = action
+ return
+ end
+ end
+ insert(t, { name = name, action = action })
+ end
+end
+
+local function set(group,name,target,source)
+ target = target[group]
+ if not target then
+ report_defining("fatal target error in setting feature '%s', group '%s'",name or "?",group or "?")
+ os.exit()
+ end
+ local source = source[group]
+ if not source then
+ report_defining("fatal source error in setting feature '%s', group '%s'",name or "?",group or "?")
+ os.exit()
+ end
+ local node = source.node
+ local base = source.base
+ local position = source.position
+ if node then
+ setindeed("node",target,group,name,node,position)
+ end
+ if base then
+ setindeed("base",target,group,name,base,position)
+ end
+end
+
+local function register(where,specification)
+ local name = specification.name
+ if name and name ~= "" then
+ local default = specification.default
+ local description = specification.description
+ local initializers = specification.initializers
+ local processors = specification.processors
+ local manipulators = specification.manipulators
+ local modechecker = specification.modechecker
+ if default then
+ where.defaults[name] = default
+ end
+ if description and description ~= "" then
+ where.descriptions[name] = description
+ end
+ if initializers then
+ set('initializers',name,where,specification)
+ end
+ if processors then
+ set('processors', name,where,specification)
+ end
+ if manipulators then
+ set('manipulators',name,where,specification)
+ end
+ if modechecker then
+ where.modechecker = modechecker
+ end
+ end
+end
+
+constructors.registerfeature = register
+
+function constructors.getfeatureaction(what,where,mode,name)
+ what = handlers[what].features
+ if what then
+ where = what[where]
+ if where then
+ mode = where[mode]
+ if mode then
+ for i=1,#mode do
+ local m = mode[i]
+ if m.name == name then
+ return m.action
+ end
+ end
+ end
+ end
+ end
+end
+
+function constructors.newfeatures(what)
+ local features = handlers[what].features
+ if not features then
+ local tables = handlers[what].tables -- can be preloaded
+ features = allocate {
+ defaults = { },
+ descriptions = tables and tables.features or { },
+ initializers = { base = { }, node = { } },
+ processors = { base = { }, node = { } },
+ manipulators = { base = { }, node = { } },
+ }
+ features.register = function(specification) return register(features,specification) end
+ handlers[what].features = features -- will also become hidden
+ end
+ return features
+end
+
+--[[ldx--
+<p>We need to check for default features. For this we provide
+a helper function.</p>
+--ldx]]--
+
+function constructors.checkedfeatures(what,features)
+ local defaults = handlers[what].features.defaults
+ if features and next(features) then
+ features = fastcopy(features) -- can be inherited
+ for key, value in next, defaults do
+ if features[key] == nil then
+ features[key] = value
+ end
+ end
+ return features
+ else
+ return fastcopy(defaults) -- we can change features in place
+ end
+end
+
+-- before scaling
+
+function constructors.initializefeatures(what,tfmdata,features,trace,report)
+ if features and next(features) then
+ local properties = tfmdata.properties or { } -- brrr
+ local whathandler = handlers[what]
+ local whatfeatures = whathandler.features
+ local whatinitializers = whatfeatures.initializers
+ local whatmodechecker = whatfeatures.modechecker
+ -- properties.mode can be enforces (for instance in font-otd)
+ local mode = properties.mode or (whatmodechecker and whatmodechecker(tfmdata,features,features.mode)) or features.mode or "base"
+ properties.mode = mode -- also status
+ features.mode = mode -- both properties.mode or features.mode can be changed
+ --
+ local done = { }
+ while true do
+ local redo = false
+ local initializers = whatfeatures.initializers[mode]
+ if initializers then
+ for i=1,#initializers do
+ local step = initializers[i]
+ local feature = step.name
+-- we could intercept mode here .. needs a rewrite of this whole loop then btu it's cleaner that way
+ local value = features[feature]
+ if not value then
+ -- disabled
+ elseif done[feature] then
+ -- already done
+ else
+ local action = step.action
+ if trace then
+ report("initializing feature %s to %s for mode %s for font %s",feature,
+ tostring(value),mode or 'unknown', tfmdata.properties.fullname or 'unknown')
+ end
+ action(tfmdata,value,features) -- can set mode (e.g. goodies) so it can trigger a restart
+ if mode ~= properties.mode or mode ~= features.mode then
+ if whatmodechecker then
+ properties.mode = whatmodechecker(tfmdata,features,properties.mode) -- force checking
+ features.mode = properties.mode
+ end
+ if mode ~= properties.mode then
+ mode = properties.mode
+ redo = true
+ end
+ end
+ done[feature] = true
+ end
+ if redo then
+ break
+ end
+ end
+ if not redo then
+ break
+ end
+ else
+ break
+ end
+ end
+ properties.mode = mode -- to be sure
+ return true
+ else
+ return false
+ end
+end
+
+-- while typesetting
+
+function constructors.collectprocessors(what,tfmdata,features,trace,report)
+ local processes, nofprocesses = { }, 0
+ if features and next(features) then
+ local properties = tfmdata.properties
+ local whathandler = handlers[what]
+ local whatfeatures = whathandler.features
+ local whatprocessors = whatfeatures.processors
+ local processors = whatprocessors[properties.mode]
+ if processors then
+ for i=1,#processors do
+ local step = processors[i]
+ local feature = step.name
+ if features[feature] then
+ local action = step.action
+ if trace then
+ report("installing feature processor %s for mode %s for font %s",feature,
+ mode or 'unknown', tfmdata.properties.fullname or 'unknown')
+ end
+ if action then
+ nofprocesses = nofprocesses + 1
+ processes[nofprocesses] = action
+ end
+ end
+ end
+ end
+ end
+ return processes
+end
+
+-- after scaling
+
+function constructors.applymanipulators(what,tfmdata,features,trace,report)
+ if features and next(features) then
+ local properties = tfmdata.properties
+ local whathandler = handlers[what]
+ local whatfeatures = whathandler.features
+ local whatmanipulators = whatfeatures.manipulators
+ local manipulators = whatmanipulators[properties.mode]
+ if manipulators then
+ for i=1,#manipulators do
+ local step = manipulators[i]
+ local feature = step.name
+ local value = features[feature]
+ if value then
+ local action = step.action
+ if trace then
+ report("applying feature manipulator %s for mode %s for font %s",feature,
+ mode or 'unknown', tfmdata.properties.fullname or 'unknown')
+ end
+ if action then
+ action(tfmdata,feature,value)
+ end
+ end
+ end
+ end
+ 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 76e9f095a48..887aa99841e 100644
--- a/Master/texmf-dist/tex/context/base/font-ctx.lua
+++ b/Master/texmf-dist/tex/context/base/font-ctx.lua
@@ -6,34 +6,221 @@ if not modules then modules = { } end modules ['font-ctx'] = {
license = "see context related readme files"
}
--- needs a cleanup: merge of replace, lang/script etc
+-- At some point I will clean up the code here so that at the tex end
+-- the table interface is used.
-local texsprint, count, texsetcount = tex.sprint, tex.count, tex.setcount
-local format, concat, gmatch, match, find, lower, gsub, byte = string.format, table.concat, string.gmatch, string.match, string.find, string.lower, string.gsub, string.byte
+local texcount, texsetcount = tex.count, tex.setcount
+local format, gmatch, match, find, lower, gsub, byte = string.format, string.gmatch, string.match, string.find, string.lower, string.gsub, string.byte
+local concat, serialize, sort = table.concat, table.serialize, table.sort
+local settings_to_hash, hash_to_string = utilities.parsers.settings_to_hash, utilities.parsers.hash_to_string
+local formatcolumns = utilities.formatters.formatcolumns
local tostring, next, type = tostring, next, type
-local lpegmatch = lpeg.match
+local utfchar, utfbyte = utf.char, utf.byte
local round = math.round
-local ctxcatcodes = tex.ctxcatcodes
+local P, S, C, Cc, Cf, Cg, Ct, lpegmatch = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cf, lpeg.Cg, lpeg.Ct, lpeg.match
+
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+local trace_usage = false trackers.register("fonts.usage", function(v) trace_usage = v end)
+local trace_mapfiles = false trackers.register("fonts.mapfiles", function(v) trace_mapfiles = v end)
+local trace_automode = false trackers.register("fonts.automode", function(v) trace_automode = v end)
+
+local report_defining = logs.reporter("fonts","defining")
+local report_status = logs.reporter("fonts","status")
+local report_mapfiles = logs.reporter("fonts","mapfiles")
+
+local setmetatableindex = table.setmetatableindex
+
+local fonts = fonts
+local handlers = fonts.handlers
+local otf = handlers.otf -- brrr
+local names = fonts.names
+local definers = fonts.definers
+local specifiers = fonts.specifiers
+local constructors = fonts.constructors
+local loggers = fonts.loggers
+local helpers = fonts.helpers
+local hashes = fonts.hashes
+local fontdata = hashes.identifiers
+local currentfont = font.current
+local texattribute = tex.attribute
+
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
+local baseprocessors = otffeatures.processors.base
+local baseinitializers = otffeatures.initializers.base
+
+specifiers.contextsetups = specifiers.contextsetups or { }
+specifiers.contextnumbers = specifiers.contextnumbers or { }
+specifiers.contextmerged = specifiers.contextmerged or { }
+specifiers.synonyms = specifiers.synonyms or { }
+
+local setups = specifiers.contextsetups
+local numbers = specifiers.contextnumbers
+local merged = specifiers.contextmerged
+local synonyms = specifiers.synonyms
+
+storage.register("fonts/setups" , setups , "fonts.specifiers.contextsetups" )
+storage.register("fonts/numbers", numbers, "fonts.specifiers.contextnumbers")
+storage.register("fonts/merged", merged, "fonts.specifiers.contextmerged")
+storage.register("fonts/synonyms", synonyms, "fonts.specifiers.synonyms")
+
+constructors.resolvevirtualtoo = true -- context specific (due to resolver)
+
+local allocate, mark = utilities.storage.allocate, utilities.storage.mark
+
+local nulldata = {
+ name = "nullfont",
+ characters = { },
+ descriptions = { },
+ properties = { },
+ parameters = { -- lmromanregular @ 12pt
+ slant = 0, -- 1
+ space = 256377, -- 2
+ spacestretch = 128188, -- 3
+ spaceshrink = 85459, -- 4
+ xheight = 338952, -- 5
+ quad = 786432, -- 6
+ extraspace = 85459, -- 7
+ },
+}
+
+function definers.resetnullfont()
+ -- resetting is needed because tikz misuses nullfont
+ local parameters = nulldata.parameters
+ parameters.slant = 0 -- 1
+ parameters.space = 0 -- 2
+ parameters.spacestretch = 0 -- 3
+ parameters.spaceshrink = 0 -- 4
+ parameters.xheight = 0 -- 5
+ parameters.quad = 0 -- 6
+ parameters.extraspace = 0 -- 7
+ definers.resetnullfont = function() end
+end
+
+setmetatableindex(fontdata, function(t,k) return nulldata end)
+
+local chardata = allocate() -- chardata
+local parameters = allocate()
+local csnames = allocate() -- namedata
+local quaddata = allocate() -- quaddata
+local xheightdata = allocate() -- xheightdata
+
+hashes.characters = chardata
+hashes.parameters = parameters
+hashes.quads = quaddata
+hashes.xheights = xheightdata
+
+setmetatableindex(chardata, function(t,k)
+ local characters = fontdata[k].characters
+ t[k] = characters
+ return characters
+end)
-local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+setmetatableindex(parameters, function(t,k)
+ local parameters = fontdata[k].parameters
+ t[k] = parameters
+ return parameters
+end)
-local tfm = fonts.tfm
-local define = fonts.define
-local fontdata = fonts.identifiers
-local specify = define.specify
+setmetatableindex(quaddata, function(t,k)
+ local parameters = parameters[k]
+ local quad = parameters and parameters.quad or 0
+ t[k] = quad
+ return quad
+end)
-specify.context_setups = specify.context_setups or { }
-specify.context_numbers = specify.context_numbers or { }
-specify.context_merged = specify.context_merged or { }
-specify.synonyms = specify.synonyms or { }
+setmetatableindex(xheightdata, function(t,k)
+ local parameters = parameters[k]
+ local xheight = parameters and parameters.xheight or 0
+ t[k] = xheight
+ return quad
+end)
-local setups = specify.context_setups
-local numbers = specify.context_numbers
-local merged = specify.context_merged
-local synonyms = specify.synonyms
-local triggers = fonts.triggers
+-- 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
+-- file (features.gpos.mkmk = 1 etc)
+
+local needsnodemode = {
+ gpos_mark2mark = true,
+ gpos_mark2base = true,
+ gpos_mark2ligature = true,
+}
+
+local function modechecker(tfmdata,features,mode) -- we cannot adapt features as they are shared!
+ if mode == "auto" then
+ local rawdata = tfmdata.shared.rawdata
+ local resources = rawdata and rawdata.resources
+ local sequences = resources.sequences
+ if sequences and #sequences > 0 then
+ local script = features.script or "dflt"
+ local language = features.language or "dflt"
+ for feature, value in next, features do
+ if value then
+ local found = false
+ for i=1,#sequences do
+ local sequence = sequences[i]
+ local features = sequence.features
+ if features then
+ local scripts = features[feature]
+ if scripts then
+ local languages = scripts[script]
+ if languages and languages[language] then
+ if found then
+ -- more than one lookup
+ if trace_automode then
+ report_defining("forcing node mode in font %s for feature %s, script %s, language %s (multiple lookups)",file.basename(tfmdata.properties.name),feature,script,language)
+ end
+ features.mode = "node"
+ return "node"
+ elseif needsnodemode[sequence.type] then
+ if trace_automode then
+ report_defining("forcing node mode in font %s for feature %s, script %s, language %s (no base support)",file.basename(tfmdata.properties.name),feature,script,language)
+ end
+ features.mode = "node"
+ return "node"
+ else
+ -- at least one lookup
+ found = true
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ return "base"
+ else
+ return mode
+ end
+end
+
+registerotffeature {
+ -- we only set the checker and leave other settings of the mode
+ -- feature as they are
+ name = "mode",
+ modechecker = modechecker,
+}
+
+-- -- default = true anyway
+--
+-- local normalinitializer = constructors.getfeatureaction("otf","initializers","node","analyze")
+--
+-- local function analyzeinitializer(tfmdata,value,features) -- attr
+-- if value == "auto" and features then
+-- value = features.init or features.medi or features.fina or features.isol or false
+-- end
+-- return normalinitializer(tfmdata,value,features)
+-- end
+--
+-- registerotffeature {
+-- name = "analyze",
+-- initializers = {
+-- node = analyzeinitializer,
+-- },
+-- }
--[[ldx--
<p>So far we haven't really dealt with features (or whatever we want
@@ -48,29 +235,45 @@ name*context specification
</code>
--ldx]]--
-function specify.predefined(specification)
- local detail = specification.detail
- if detail ~= "" then
- -- detail = gsub(detail,"["..define.splitsymbols.."].*$","") -- get rid of *whatever specs and such
- if define.methods[detail] then -- since these may be appended at the
- specification.features.vtf = { preset = detail } -- tex end by default
+-- currently fonts are scaled while constructing the font, so we
+-- have to do scaling of commands in the vf at that point using e.g.
+-- "local scale = g.parameters.factor or 1" after all, we need to
+-- work with copies anyway and scaling needs to be done at some point;
+-- however, when virtual tricks are used as feature (makes more
+-- sense) we scale the commands in fonts.constructors.scale (and set the
+-- factor there)
+
+local loadfont = definers.loadfont
+
+function definers.loadfont(specification,size,id) -- overloads the one in font-def
+ local variants = definers.methods.variants
+ local virtualfeatures = specification.features.virtual
+ if virtualfeatures and virtualfeatures.preset then
+ local variant = variants[virtualfeatures.preset]
+ if variant then
+ return variant(specification,size,id)
end
+ else
+ local tfmdata = loadfont(specification,size,id)
+ -- constructors.checkvirtualid(tfmdata,id)
+ return tfmdata
end
- return specification
end
-define.register_split("@", specify.predefined)
+local function predefined(specification)
+ local variants = definers.methods.variants
+ local detail = specification.detail
+ if detail ~= "" and variants[detail] then
+ specification.features.virtual = { preset = detail }
+ end
+ return specification
+end
-storage.register("fonts/setups" , define.specify.context_setups , "fonts.define.specify.context_setups" )
-storage.register("fonts/numbers", define.specify.context_numbers, "fonts.define.specify.context_numbers")
-storage.register("fonts/merged", define.specify.context_merged, "fonts.define.specify.context_merged")
-storage.register("fonts/synonyms", define.specify.synonyms, "fonts.define.specify.synonyms")
+definers.registersplit("@", predefined,"virtual")
-local normalize_meanings = fonts.otf.meanings.normalize
-local settings_to_hash = aux.settings_to_hash
-local default_features = fonts.otf.features.default
+local normalize_features = otffeatures.normalize -- should be general
-local function preset_context(name,parent,features) -- currently otf only
+local function presetcontext(name,parent,features) -- will go to con and shared
if features == "" and find(parent,"=") then
features = parent
parent = ""
@@ -78,9 +281,9 @@ local function preset_context(name,parent,features) -- currently otf only
if features == "" then
features = { }
elseif type(features) == "string" then
- features = normalize_meanings(settings_to_hash(features))
+ features = normalize_features(settings_to_hash(features))
else
- features = normalize_meanings(features)
+ features = normalize_features(features)
end
-- todo: synonyms, and not otf bound
if parent ~= "" then
@@ -98,10 +301,18 @@ local function preset_context(name,parent,features) -- currently otf only
-- these are auto set so in order to prevent redundant definitions
-- we need to preset them (we hash the features and adding a default
-- setting during initialization may result in a different hash)
- for k,v in next, triggers do
- if features[v] == nil then -- not false !
- local vv = default_features[v]
- if vv then features[v] = vv end
+--~ for k,v in next, triggers do
+--~ if features[v] == nil then -- not false !
+--~ local vv = default_features[v]
+--~ if vv then features[v] = vv end
+--~ end
+--~ end
+ for feature,value in next, features do
+ if value == nil then -- not false !
+ local default = default_features[feature]
+ if default ~= nil then
+ features[feature] = default
+ end
end
end
-- sparse 'm so that we get a better hash and less test (experimental
@@ -111,7 +322,8 @@ local function preset_context(name,parent,features) -- currently otf only
if v then t[k] = v end
end
-- needed for dynamic features
- local number = (setups[name] and setups[name].number) or 0
+ -- maybe number should always be renewed as we can redefine features
+ local number = (setups[name] and setups[name].number) or 0 -- hm, numbers[name]
if number == 0 then
number = #numbers + 1
numbers[number] = name
@@ -121,7 +333,7 @@ local function preset_context(name,parent,features) -- currently otf only
return number, t
end
-local function context_number(name) -- will be replaced
+local function contextnumber(name) -- will be replaced
local t = setups[name]
if not t then
return 0
@@ -152,7 +364,7 @@ local function context_number(name) -- will be replaced
end
end
-local function merge_context(currentnumber,extraname,option)
+local function mergecontext(currentnumber,extraname,option)
local current = setups[numbers[currentnumber]]
local extra = setups[extraname]
if extra then
@@ -182,13 +394,13 @@ local function merge_context(currentnumber,extraname,option)
numbers[number] = mergedname
merged[number] = option
setups[mergedname] = mergedfeatures
- return number -- context_number(mergedname)
+ return number -- contextnumber(mergedname)
else
return currentnumber
end
end
-local function register_context(fontnumber,extraname,option)
+local function registercontext(fontnumber,extraname,option)
local extra = setups[extraname]
if extra then
local mergedfeatures, mergedname = { }, nil
@@ -205,74 +417,152 @@ local function register_context(fontnumber,extraname,option)
numbers[number] = mergedname
merged[number] = option
setups[mergedname] = mergedfeatures
- return number -- context_number(mergedname)
+ return number -- contextnumber(mergedname)
else
return 0
end
end
-specify.preset_context = preset_context
-specify.context_number = context_number
-specify.merge_context = merge_context
-specify.register_context = register_context
+specifiers.presetcontext = presetcontext
+specifiers.contextnumber = contextnumber
+specifiers.mergecontext = mergecontext
+specifiers.registercontext = registercontext
-local current_font = font.current
-local tex_attribute = tex.attribute
+-- we extend the hasher:
+
+constructors.hashmethods.virtual = function(list)
+ local s = { }
+ local n = 0
+ for k, v in next, list do
+ n = n + 1
+ s[n] = k
+ end
+ if n > 0 then
+ sort(s)
+ for i=1,n do
+ local k = s[i]
+ s[i] = k .. '=' .. tostring(list[k])
+ end
+ return concat(s,"+")
+ end
+end
+
+-- end of redefine
local cache = { } -- concat might be less efficient than nested tables
-function fonts.withset(name,what)
- local zero = tex_attribute[0]
+local function withset(name,what)
+ local zero = texattribute[0]
local hash = zero .. "+" .. name .. "*" .. what
local done = cache[hash]
if not done then
- done = merge_context(zero,name,what)
+ done = mergecontext(zero,name,what)
cache[hash] = done
end
- tex_attribute[0] = done
+ texattribute[0] = done
end
-function fonts.withfnt(name,what)
- local font = current_font()
+
+local function withfnt(name,what)
+ local font = currentfont()
local hash = font .. "*" .. name .. "*" .. what
local done = cache[hash]
if not done then
- done = register_context(font,name,what)
+ done = registercontext(font,name,what)
cache[hash] = done
end
- tex_attribute[0] = done
+ texattribute[0] = done
end
-function specify.show_context(name)
+function specifiers.showcontext(name)
return setups[name] or setups[numbers[name]] or setups[numbers[tonumber(name)]] or { }
end
-local function split_context(features)
- return setups[features] or (preset_context(features,"","") and setups[features])
+-- todo: support a,b,c
+
+local function splitcontext(features) -- presetcontext creates dummy here
+ return setups[features] or (presetcontext(features,"","") and setups[features])
end
-specify.split_context = split_context
+--~ local splitter = lpeg.splitat("=")
+
+--~ local function splitcontext(features)
+--~ local setup = setups[features]
+--~ if setup then
+--~ return setup
+--~ elseif find(features,",") then
+--~ -- This is not that efficient but handy anyway for quick and dirty tests
+--~ -- beware, due to the way of caching setups you can get the wrong results
+--~ -- when components change. A safeguard is to nil the cache.
+--~ local merge = nil
+--~ for feature in gmatch(features,"[^, ]+") do
+--~ if find(feature,"=") then
+--~ local k, v = lpegmatch(splitter,feature)
+--~ if k and v then
+--~ if not merge then
+--~ merge = { k = v }
+--~ else
+--~ merge[k] = v
+--~ end
+--~ end
+--~ else
+--~ local s = setups[feature]
+--~ if not s then
+--~ -- skip
+--~ elseif not merge then
+--~ merge = s
+--~ else
+--~ for k, v in next, s do
+--~ merge[k] = v
+--~ end
+--~ end
+--~ end
+--~ end
+--~ setup = merge and presetcontext(features,"",merge) and setups[features]
+--~ -- actually we have to nil setups[features] in order to permit redefinitions
+--~ setups[features] = nil
+--~ end
+--~ return setup or (presetcontext(features,"","") and setups[features]) -- creates dummy
+--~ end
-function specify.context_tostring(name,kind,separator,yes,no,strict,omit) -- not used
- return aux.hash_to_string(table.merged(fonts[kind].features.default or {},setups[name] or {}),separator,yes,no,strict,omit)
-end
+specifiers.splitcontext = splitcontext
-local splitter = lpeg.splitat(",")
+function specifiers.contexttostring(name,kind,separator,yes,no,strict,omit) -- not used
+ return hash_to_string(table.merged(handlers[kind].features.defaults or {},setups[name] or {}),separator,yes,no,strict,omit)
+end
-function specify.starred(features) -- no longer fallbacks here
+local function starred(features) -- no longer fallbacks here
local detail = features.detail
if detail and detail ~= "" then
- features.features.normal = split_context(detail)
+ features.features.normal = splitcontext(detail)
else
features.features.normal = { }
end
return features
end
-define.register_split('*',specify.starred)
+definers.registersplit('*',starred,"featureset")
--- define (two steps)
+-- sort of xetex mode, but without [] and / as we have file: and name: etc
-local P, C, Cc = lpeg.P, lpeg.C, lpeg.Cc
+local space = P(" ")
+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 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 function colonized(specification)
+ specification.features.normal = normalize_features(lpegmatch(pattern,specification.detail))
+ return specification
+end
+
+definers.registersplit(":",colonized,"direct")
+
+-- define (two steps)
local space = P(" ")
local spaces = space^0
@@ -290,56 +580,63 @@ local scale_scaled = P("scaled") * Cc(4) * spaces * dimension -- value
local sizepattern = spaces * (scale_at + scale_sa + scale_mo + scale_scaled + scale_none)
local splitpattern = spaces * value * spaces * rest
-local specification --
+local specification -- still needed as local ?
-local get_specification = define.get_specification
+local getspecification = definers.getspecification
-- we can make helper macros which saves parsing (but normaly not
-- that many calls, e.g. in mk a couple of 100 and in metafun 3500)
-function define.command_1(str)
+local setdefaultfontname = context.fntsetdefname
+local setsomefontname = context.fntsetsomename
+local setemptyfontsize = context.fntsetnopsize
+local setsomefontsize = context.fntsetsomesize
+
+function definers.stage_one(str)
statistics.starttiming(fonts)
local fullname, size = lpegmatch(splitpattern,str)
- local lookup, name, sub, method, detail = get_specification(fullname)
+ local lookup, name, sub, method, detail = getspecification(fullname)
if not name then
- logs.report("define font","strange definition '%s'",str)
- texsprint(ctxcatcodes,"\\fcglet\\somefontname\\defaultfontfile")
+ report_defining("strange definition '%s'",str)
+ setdefaultfontname()
elseif name == "unknown" then
- texsprint(ctxcatcodes,"\\fcglet\\somefontname\\defaultfontfile")
+ setdefaultfontname()
else
- texsprint(ctxcatcodes,"\\fcxdef\\somefontname{",name,"}")
+ setsomefontname(name)
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
- count.scaledfontmode = mode
- texsprint(ctxcatcodes,"\\def\\somefontsize{",size,"}")
+ texcount.scaledfontmode = mode
+ setsomefontsize(size)
else
- count.scaledfontmode = 0
- texsprint(ctxcatcodes,"\\let\\somefontsize\\empty")
+ texcount.scaledfontmode = 0
+ setemptyfontsize()
end
elseif true then
-- so we don't need to check in tex
- count.scaledfontmode = 2
- texsprint(ctxcatcodes,"\\let\\somefontsize\\empty")
+ texcount.scaledfontmode = 2
+ setemptyfontsize()
else
- count.scaledfontmode = 0
- texsprint(ctxcatcodes,"\\let\\somefontsize\\empty")
+ texcount.scaledfontmode = 0
+ setemptyfontsize()
end
- specification = define.makespecification(str,lookup,name,sub,method,detail,size)
+ specification = definers.makespecification(str,lookup,name,sub,method,detail,size)
end
local n = 0
-- we can also move rscale to here (more consistent)
+-- the argument list will become a table
-function define.command_2(global,cs,str,size,classfeatures,fontfeatures,classfallbacks,fontfallbacks,mathsize,textsize,relativeid)
+function definers.stage_two(global,cs,str,size,inheritancemode,classfeatures,fontfeatures,classfallbacks,fontfallbacks,
+ mathsize,textsize,relativeid,classgoodies,goodies)
if trace_defining then
- logs.report("define font","memory usage before: %s",statistics.memused())
+ report_defining("memory usage before: %s",statistics.memused())
end
-- name is now resolved and size is scaled cf sa/mo
- local lookup, name, sub, method, detail = get_specification(str or "")
+ local lookup, name, sub, method, detail = getspecification(str or "")
-- asome settings can be overloaded
if lookup and lookup ~= "" then
specification.lookup = lookup
@@ -348,148 +645,201 @@ function define.command_2(global,cs,str,size,classfeatures,fontfeatures,classfal
local id = tonumber(relativeid) or 0
specification.relativeid = id > 0 and id
end
- specification.name = name
- specification.size = size
- specification.sub = (sub and sub ~= "" and sub) or specification.sub
+ specification.name = name
+ specification.size = size
+ specification.sub = (sub and sub ~= "" and sub) or specification.sub
specification.mathsize = mathsize
specification.textsize = textsize
+ specification.goodies = goodies
+ specification.cs = cs
+ specification.global = global
if detail and detail ~= "" then
- specification.method, specification.detail = method or "*", detail
+ specification.method = method or "*"
+ specification.detail = detail
elseif specification.detail and specification.detail ~= "" then
-- already set
- elseif fontfeatures and fontfeatures ~= "" then
- specification.method, specification.detail = "*", fontfeatures
- elseif classfeatures and classfeatures ~= "" then
- specification.method, specification.detail = "*", classfeatures
+ elseif inheritancemode == 0 then
+ -- nothing
+ elseif inheritancemode == 1 then
+ -- fontonly
+ if fontfeatures and fontfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = fontfeatures
+ end
+ if fontfallbacks and fontfallbacks ~= "" then
+ specification.fallbacks = fontfallbacks
+ end
+ elseif inheritancemode == 2 then
+ -- classonly
+ if classfeatures and classfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = classfeatures
+ end
+ if classfallbacks and classfallbacks ~= "" then
+ specification.fallbacks = classfallbacks
+ end
+ elseif inheritancemode == 3 then
+ -- fontfirst
+ if fontfeatures and fontfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = fontfeatures
+ elseif classfeatures and classfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = classfeatures
+ end
+ if fontfallbacks and fontfallbacks ~= "" then
+ specification.fallbacks = fontfallbacks
+ elseif classfallbacks and classfallbacks ~= "" then
+ specification.fallbacks = classfallbacks
+ end
+ elseif inheritancemode == 4 then
+ -- classfirst
+ if classfeatures and classfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = classfeatures
+ elseif fontfeatures and fontfeatures ~= "" then
+ specification.method = "*"
+ specification.detail = fontfeatures
+ end
+ if classfallbacks and classfallbacks ~= "" then
+ specification.fallbacks = classfallbacks
+ elseif fontfallbacks and fontfallbacks ~= "" then
+ specification.fallbacks = fontfallbacks
+ end
end
- if fontfallbacks and fontfallbacks ~= "" then
- specification.fallbacks = fontfallbacks
- elseif classfallbacks and classfallbacks ~= "" then
- specification.fallbacks = classfallbacks
+ local tfmdata = definers.read(specification,size) -- id not yet known
+ local cs = specification.cs
+ if cs then
+ csnames[cs] = tfmdata -- new (beware: locals can be forgotten)
end
- local tfmdata = define.read(specification,size) -- id not yet known
if not tfmdata then
- logs.report("define font","unable to define %s as \\%s",name,cs)
+ report_defining("unable to define %s as \\%s",name,cs)
texsetcount("global","lastfontid",-1)
+ context.letvaluerelax(cs) -- otherwise the current definition takes the previous one
elseif type(tfmdata) == "number" then
if trace_defining then
- logs.report("define font","reusing %s with id %s as \\%s (features: %s/%s, fallbacks: %s/%s)",name,tfmdata,cs,classfeatures,fontfeatures,classfallbacks,fontfallbacks)
+ report_defining("reusing %s with id %s as \\%s (features: %s/%s, fallbacks: %s/%s, goodies: %s/%s)",
+ name,tfmdata,cs,classfeatures,fontfeatures,classfallbacks,fontfallbacks,classgoodies,goodies)
end
tex.definefont(global,cs,tfmdata)
-- resolved (when designsize is used):
- texsprint(ctxcatcodes,format("\\def\\somefontsize{%isp}",fontdata[tfmdata].size))
+ setsomefontsize(fontdata[tfmdata].parameters.size .. "sp")
texsetcount("global","lastfontid",tfmdata)
else
+tfmdata.characters[0] = nil -- we use char0 as signal
-- local t = os.clock(t)
local id = font.define(tfmdata)
-- print(name,os.clock()-t)
- tfmdata.id = id
- define.register(tfmdata,id)
+ tfmdata.properties.id = id
+ definers.register(tfmdata,id) -- to be sure, normally already done
tex.definefont(global,cs,id)
- tfm.cleanup_table(tfmdata)
+ constructors.cleanuptable(tfmdata)
+ constructors.finalize(tfmdata)
if trace_defining then
- logs.report("define font","defining %s with id %s as \\%s (features: %s/%s, fallbacks: %s/%s)",name,id,cs,classfeatures,fontfeatures,classfallbacks,fontfallbacks)
+ report_defining("defining %s with id %s as \\%s (features: %s/%s, fallbacks: %s/%s)",name,id,cs,classfeatures,fontfeatures,classfallbacks,fontfallbacks)
end
-- resolved (when designsize is used):
- texsprint(ctxcatcodes,format("\\def\\somefontsize{%isp}",tfmdata.size))
+ setsomefontsize((tfmdata.parameters.size or 655360) .. "sp")
--~ if specification.fallbacks then
--~ fonts.collections.prepare(specification.fallbacks)
--~ end
texsetcount("global","lastfontid",id)
end
if trace_defining then
- logs.report("define font","memory usage after: %s",statistics.memused())
+ report_defining("memory usage after: %s",statistics.memused())
end
statistics.stoptiming(fonts)
end
+function definers.define(specification)
+ --
+ local name = specification.name
+ if not name or name == "" then
+ return -1
+ else
+ statistics.starttiming(fonts)
+ --
+ -- following calls expect a few properties to be set:
+ --
+ local lookup, name, sub, method, detail = getspecification(name or "")
+ --
+ specification.name = (name ~= "" and name) or specification.name
+ --
+ specification.lookup = specification.lookup or (lookup ~= "" and lookup) or "file"
+ specification.size = specification.size or 655260
+ specification.sub = specification.sub or (sub ~= "" and sub) or ""
+ specification.method = specification.method or (method ~= "" and method) or "*"
+ specification.detail = specification.detail or (detail ~= "" and detail) or ""
+ --
+ specification.specification = "" -- not used
+ specification.resolved = ""
+ specification.forced = ""
+ specification.features = { } -- via detail, maybe some day
+ --
+ -- we don't care about mathsize textsize goodies fallbacks
+ --
+ if specification.cs == "" then
+ specification.cs = nil
+ specification.global = false
+ elseif specification.global == nil then
+ specification.global = false
+ end
+ --
+ local tfmdata = definers.read(specification,specification.size)
+ if not tfmdata then
+ return -1, nil
+ elseif type(tfmdata) == "number" then
+ if specification.cs then
+ tex.definefont(specification.global,specification.cs,tfmdata)
+ end
+ return tfmdata, fontdata[tfmdata]
+ else
+ local id = font.define(tfmdata)
+ tfmdata.properties.id = id
+ definers.register(tfmdata,id)
+ if specification.cs then
+ tex.definefont(specification.global,specification.cs,id)
+ end
+ constructors.cleanuptable(tfmdata)
+ constructors.finalize(tfmdata)
+ return id, tfmdata
+ end
+ statistics.stoptiming(fonts)
+ end
+end
+
local enable_auto_r_scale = false
experiments.register("fonts.autorscale", function(v)
enable_auto_r_scale = v
end)
-local calculate_scale = fonts.tfm.calculate_scale
-
-function fonts.tfm.calculate_scale(tfmtable, scaledpoints, relativeid)
- local scaledpoints, delta, units = calculate_scale(tfmtable, scaledpoints, relativeid)
- if enable_auto_r_scale and relativeid then -- for the moment this is rather context specific
- local relativedata = fontdata[relativeid]
- local id_x_height = relativedata and relativedata.parameters and relativedata.parameters.x_height
- local tf_x_height = id_x_height and tfmtable.parameters and tfmtable.parameters.x_height * delta
- if tf_x_height then
- scaledpoints = (id_x_height/tf_x_height) * scaledpoints
- delta = scaledpoints/units
- end
- end
- return scaledpoints, delta, units
-end
-
---~ table.insert(readers.sequence,1,'vtf')
-
---~ function readers.vtf(specification)
---~ if specification.features.vtf and specification.features.vtf.preset then
---~ return tfm.make(specification)
---~ else
---~ return nil
+-- Not ok, we can best use a database for this. The problem is that we
+-- have delayed definitions and so we never know what style is taken
+-- as start.
+
+local calculatescale = constructors.calculatescale
+
+function constructors.calculatescale(tfmdata,scaledpoints,relativeid)
+ local scaledpoints, delta = calculatescale(tfmdata,scaledpoints)
+--~ if enable_auto_r_scale and relativeid then -- for the moment this is rather context specific
+--~ local relativedata = fontdata[relativeid]
+--~ local rfmdata = relativedata and relativedata.unscaled and relativedata.unscaled
+--~ local id_x_height = rfmdata and rfmdata.parameters and rfmdata.parameters.x_height
+--~ local tf_x_height = tfmdata and tfmdata.parameters and tfmdata.parameters.x_height
+--~ if id_x_height and tf_x_height then
+--~ local rscale = id_x_height/tf_x_height
+--~ delta = rscale * delta
+--~ scaledpoints = rscale * scaledpoints
+--~ end
--~ end
---~ end
-
--- we need a place for this .. outside the generic scope
-
-local dimenfactors = number.dimenfactors
-
-function fonts.dimenfactor(unit,tfmdata)
- if unit == "ex" then
- return (tfmdata and tfmdata.parameters.x_height) or 655360
- elseif unit == "em" then
- return (tfmdata and tfmdata.parameters.em_height) or 655360
- else
- return dimenfactors[unit] or unit
- end
-end
-
-function fonts.cleanname(name)
- texsprint(ctxcatcodes,fonts.names.cleanname(name))
-end
-
-local p, f = 1, "%0.1fpt" -- normally this value is changed only once
-
-local stripper = lpeg.patterns.strip_zeros
-
-function fonts.nbfs(amount,precision)
- if precision ~= p then
- p = precision
- f = "%0." .. p .. "fpt"
- end
- texsprint(ctxcatcodes,lpegmatch(stripper,format(f,amount/65536)))
-end
-
--- for the moment here, this will become a chain of extras that is
--- hooked into the ctx registration (or scaler or ...)
-
-function fonts.set_digit_width(font)
- local tfmtable = fontdata[font]
- local parameters = tfmtable.parameters
- local width = parameters.digitwidth
- if not width then
- width = round(parameters.quad/2) -- maybe tex.scale
- local characters = tfmtable.characters
- for i=48,57 do
- local wd = round(characters[i].width)
- if wd > width then
- width = wd
- end
- end
- parameters.digitwidth = width
- end
- return width
+ return scaledpoints, delta
end
-fonts.get_digit_width = fonts.set_digit_width
-
-- soon to be obsolete:
+local mappings = fonts.mappings
+
local loaded = { -- prevent loading (happens in cont-sys files)
["original-base.map" ] = true,
["original-ams-base.map" ] = true,
@@ -497,9 +847,12 @@ local loaded = { -- prevent loading (happens in cont-sys files)
["original-public-lm.map"] = true,
}
-function fonts.map.loadfile(name)
+function mappings.loadfile(name)
name = file.addsuffix(name,"map")
if not loaded[name] then
+ if trace_mapfiles then
+ report_mapfiles("loading map file '%s'",name)
+ end
pdf.mapfile(name)
loaded[name] = true
end
@@ -508,117 +861,421 @@ end
local loaded = { -- prevent double loading
}
-function fonts.map.loadline(how,line)
+function mappings.loadline(how,line)
if line then
how = how .. " " .. line
elseif how == "" then
how = "= " .. line
end
if not loaded[how] then
+ if trace_mapfiles then
+ report_mapfiles("processing map line '%s'",line)
+ end
pdf.mapline(how)
loaded[how] = true
end
end
-function fonts.map.reset()
+function mappings.reset()
pdf.mapfile("")
end
-fonts.map.reset() -- resets the default file
+mappings.reset() -- resets the default file
-- we need an 'do after the banner hook'
--- pdf.mapfile("mkiv-base.map") -- loads the default file
+-- => commands
+
+local function nametoslot(name)
+ local t = type(name)
+ if t == "string" then
+ local tfmdata = fonts.hashes.identifiers[currentfont()]
+ local shared = tfmdata and tfmdata.shared
+ local fntdata = shared and shared.rawdata
+ return fntdata and fntdata.resources.unicodes[name]
+ elseif t == "number" then
+ return n
+ end
+end
+
+helpers.nametoslot = nametoslot
-local nounicode = byte("?")
+-- this will change ...
-local function name_to_slot(name) -- maybe some day rawdata
- local tfmdata = fonts.ids[font.current()]
- local shared = tfmdata and tfmdata.shared
- local fntdata = shared and shared.otfdata or shared.afmdata
- if fntdata then
- local unicode = fntdata.luatex.unicodes[name]
- if not unicode then
- return nounicode
- elseif type(unicode) == "number" then
- return unicode
- else -- multiple unicodes
- return unicode[1]
+function loggers.reportdefinedfonts()
+ if trace_usage then
+ local t, tn = { }, 0
+ for id, data in table.sortedhash(fontdata) do
+ local properties = data.properties or { }
+ local parameters = data.parameters or { }
+ tn = tn + 1
+ t[tn] = {
+ format("%03i",id or 0),
+ format("%09i",parameters.size or 0),
+ properties.type or "real",
+ properties.format or "unknown",
+ properties.name or "",
+ properties.psname or "",
+ properties.fullname or "",
+ }
+report_status("%s: %s",properties.name,concat(table.sortedkeys(data)," "))
+ end
+ formatcolumns(t," ")
+ report_status()
+ report_status("defined fonts:")
+ report_status()
+ for k=1,tn do
+ report_status(t[k])
end
end
- return nounicode
end
-fonts.name_to_slot = name_to_slot
-
-function fonts.char(n) -- todo: afm en tfm
- if type(n) == "string" then
- n = name_to_slot(n)
+luatex.registerstopactions(loggers.reportdefinedfonts)
+
+function loggers.reportusedfeatures()
+ -- numbers, setups, merged
+ if trace_usage then
+ local t, n = { }, #numbers
+ for i=1,n do
+ local name = numbers[i]
+ local setup = setups[name]
+ local n = setup.number
+ setup.number = nil -- we have no reason to show this
+ t[i] = { i, name, table.sequenced(setup,false,true) } -- simple mode
+ setup.number = n -- restore it (normally not needed as we're done anyway)
+ end
+ formatcolumns(t," ")
+ report_status()
+ report_status("defined featuresets:")
+ report_status()
+ for k=1,n do
+ report_status(t[k])
+ end
end
- if type(n) == "number" then
- texsprint(ctxcatcodes,format("\\char%s ",n))
+end
+
+luatex.registerstopactions(loggers.reportusedfeatures)
+
+statistics.register("fonts load time", function()
+ return statistics.elapsedseconds(fonts)
+end)
+
+-- experimental mechanism for Mojca:
+--
+-- fonts.definetypeface {
+-- name = "mainbodyfont-light",
+-- preset = "antykwapoltawskiego-light",
+-- }
+--
+-- fonts.definetypeface {
+-- name = "mojcasfavourite",
+-- preset = "antykwapoltawskiego",
+-- normalweight = "light",
+-- boldweight = "bold",
+-- width = "condensed",
+-- }
+
+local Shapes = {
+ serif = "Serif",
+ sans = "Sans",
+ mono = "Mono",
+}
+
+function fonts.definetypeface(name,t)
+ if type(name) == "table" then
+ -- {name=abc,k=v,...}
+ t = name
+ elseif t then
+ if type(t) == "string" then
+ -- "abc", "k=v,..."
+ t = settings_to_hash(name)
+ else
+ -- "abc", {k=v,...}
+ end
+ t.name = t.name or name
+ else
+ -- "name=abc,k=v,..."
+ t = settings_to_hash(name)
end
+ local p = t.preset and fonts.typefaces[t.preset] or { }
+ local name = t.name or "unknowntypeface"
+ local shortcut = t.shortcut or p.shortcut or "rm"
+ local size = t.size or p.size or "default"
+ local shape = t.shape or p.shape or "serif"
+ local fontname = t.fontname or p.fontname or "unknown"
+ local normalweight = t.normalweight or t.weight or p.normalweight or p.weight or "normal"
+ local boldweight = t.boldweight or t.weight or p.boldweight or p.weight or "normal"
+ local normalwidth = t.normalwidth or t.width or p.normalwidth or p.width or "normal"
+ local boldwidth = t.boldwidth or t.width or p.boldwidth or p.width or "normal"
+ Shape = Shapes[shape] or "Serif"
+ context.startfontclass { name }
+ context.definefontsynonym( { format("%s", Shape) }, { format("spec:%s-%s-regular-%s", fontname, normalweight, normalwidth) } )
+ context.definefontsynonym( { format("%sBold", Shape) }, { format("spec:%s-%s-regular-%s", fontname, boldweight, boldwidth ) } )
+ context.definefontsynonym( { format("%sBoldItalic", Shape) }, { format("spec:%s-%s-italic-%s", fontname, boldweight, boldwidth ) } )
+ context.definefontsynonym( { format("%sItalic", Shape) }, { format("spec:%s-%s-italic-%s", fontname, normalweight, normalwidth) } )
+ context.stopfontclass()
+ local settings = table.sequenced({ features= t.features },",")
+ context.dofastdefinetypeface(name, shortcut, shape, size, settings)
end
--- moved from ini:
+function fonts.current() -- todo: also handle name
+ return fontdata[currentfont()] or fontdata[0]
+end
-fonts.color = { } -- dummy in ini
+function fonts.currentid()
+ return currentfont() or 0
+end
-local attribute = attributes.private('color')
-local mapping = (attributes and attributes.list[attribute]) or { }
+-- interfaces
-local set_attribute = node.set_attribute
-local unset_attribute = node.unset_attribute
+function commands.fontchar(n)
+ n = nametoslot(n)
+ if n then
+ context.char(n)
+ end
+end
-function fonts.color.set(n,c)
- local mc = mapping[c]
- if not mc then
- unset_attribute(n,attribute)
- else
- set_attribute(n,attribute,mc)
+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, "%0.1fpt" -- normally this value is changed only once
+
+local stripper = lpeg.patterns.stripzeros
+
+function commands.nbfs(amount,precision)
+ if precision ~= p then
+ p = precision
+ f = "%0." .. p .. "fpt"
end
+ context(lpegmatch(stripper,format(f,amount/65536)))
end
-function fonts.color.reset(n)
- unset_attribute(n,attribute)
+function commands.featureattribute(tag)
+ tex.write(contextnumber(tag))
end
--- this will become obsolete:
+function commands.setfontfeature(tag)
+ texattribute[0] = contextnumber(tag)
+end
-fonts.otf.name_to_slot = name_to_slot
-fonts.afm.name_to_slot = name_to_slot
+function commands.resetfontfeature()
+ texattribute[0] = 0
+end
-fonts.otf.char = fonts.char
-fonts.afm.char = fonts.char
+function commands.addfs(tag) withset(tag, 1) end
+function commands.subfs(tag) withset(tag,-1) end
+function commands.addff(tag) withfnt(tag, 2) end
+function commands.subff(tag) withfnt(tag,-2) end
--- this will change ...
+-- function commands.addfontfeaturetoset (tag) withset(tag, 1) end
+-- function commands.subtractfontfeaturefromset (tag) withset(tag,-1) end
+-- function commands.addfontfeaturetofont (tag) withfnt(tag, 2) end
+-- function commands.subtractfontfeaturefromfont(tag) withfnt(tag,-2) end
-function fonts.show_char_data(n)
- local tfmdata = fonts.ids[font.current()]
+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 = utf.byte(n)
+ n = utfbyte(n)
end
local chr = tfmdata.characters[n]
if chr then
- write_nl(format("%s @ %s => U%04X => %s => ",tfmdata.fullname,tfmdata.size,n,utf.char(n)) .. serialize(chr,false))
+ report_status("%s @ %s => U%05X => %s => %s",tfmdata.properties.fullname,tfmdata.parameters.size,n,utfchar(n),serialize(chr,false))
end
end
end
-function fonts.show_font_parameters()
- local tfmdata = fonts.ids[font.current()]
+function commands.showfontparameters(tfmdata)
+ -- this will become more clever
+ local tfmdata = tfmdata or fontdata[currentfont()]
if tfmdata then
- local parameters, mathconstants = tfmdata.parameters, tfmdata.MathConstants
- local hasparameters, hasmathconstants = parameters and next(parameters), mathconstants and next(mathconstants)
+ 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
- write_nl(format("%s @ %s => parameters => ",tfmdata.fullname,tfmdata.size) .. serialize(parameters,false))
+ 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 ...)
+
+local dimenfactors = number.dimenfactors
+
+function helpers.dimenfactor(unit,tfmdata) -- could be a method of a font instance
+ if unit == "ex" then
+ return (tfmdata and tfmdata.parameters.x_height) or 655360
+ elseif unit == "em" then
+ return (tfmdata and tfmdata.parameters.em_width) or 655360
+ else
+ return dimenfactors[unit] or unit
+ end
+end
+
+local function digitwidth(font) -- max(quad/2,wd(0..9))
+ local tfmdata = fontdata[font]
+ local parameters = tfmdata.parameters
+ local width = parameters.digitwidth
+ if not width then
+ width = round(parameters.quad/2) -- maybe tex.scale
+ local characters = tfmdata.characters
+ for i=48,57 do
+ local wd = round(characters[i].width)
+ if wd > width then
+ width = wd
+ end
end
- if hasmathconstants then
- write_nl(format("%s @ %s => math constants => ",tfmdata.fullname,tfmdata.size) .. serialize(mathconstants,false))
+ parameters.digitwidth = width
+ end
+ return width
+end
+
+helpers.getdigitwidth = digitwidth
+helpers.setdigitwidth = digitwidth
+
+--
+
+function helpers.getparameters(tfmdata)
+ local p = { }
+ local m = p
+ local parameters = tfmdata.parameters
+ while true do
+ for k, v in next, parameters do
+ m[k] = v
end
- if not hasparameters and not hasmathconstants then
- write_nl(format("%s @ %s => no parameters and/or mathconstants",tfmdata.fullname,tfmdata.size))
+ parameters = getmetatable(parameters)
+ parameters = parameters and parameters.__index
+ if type(parameters) == "table" then
+ m = { }
+ p.metatable = m
+ else
+ break
end
end
+ return p
+end
+
+if environment.initex then
+
+ local function names(t)
+ local nt = #t
+ if nt > 0 then
+ local n = { }
+ for i=1,nt do
+ n[i] = t[i].name
+ end
+ return concat(n," ")
+ else
+ return "-"
+ end
+ end
+
+ statistics.register("font processing", function()
+ local l = { }
+ for what, handler in table.sortedpairs(handlers) do
+ local features = handler.features
+ if features then
+ local t = { }
+ t[#t+1] = "["
+ t[#t+1] = what
+ t[#t+1] = format("(base initializers: %s)",names(features.initializers.base))
+ t[#t+1] = format("(base processors: %s)", names(features.processors .base))
+ t[#t+1] = format("(base manipulators: %s)",names(features.manipulators.base))
+ t[#t+1] = format("(node initializers: %s)",names(features.initializers.node))
+ t[#t+1] = format("(node processors: %s)", names(features.processors .node))
+ t[#t+1] = format("(node manipulators: %s)",names(features.manipulators.node))
+ t[#t+1] = "]"
+ l[#l+1] = concat(t, " ")
+ end
+ end
+ return concat(l, " | ")
+ end)
+
end
+
+-- redefinition
+
+local quads = hashes.quads
+local xheights = hashes.xheights
+local currentfont = font.current
+local texdimen = tex.dimen
+
+setmetatableindex(number.dimenfactors, function(t,k)
+ if k == "ex" then
+ return xheigths[currentfont()]
+ elseif k == "em" then
+ return quads[currentfont()]
+ elseif k == "%" then
+ return dimen.hsize/100
+ else
+ -- error("wrong dimension: " .. (s or "?")) -- better a message
+ return false
+ end
+end)
+
+--[[ldx--
+<p>Before a font is passed to <l n='tex'/> we scale it. Here we also need
+to scale virtual characters.</p>
+--ldx]]--
+
+-- function constructors.getvirtualid(tfmdata)
+-- -- since we don't know the id yet, we use 0 as signal
+-- local tf = tfmdata.fonts
+-- if not tf then
+-- local properties = tfmdata.properties
+-- if properties then
+-- properties.virtualized = true
+-- else
+-- tfmdata.properties = { virtualized = true }
+-- end
+-- tf = { }
+-- tfmdata.fonts = tf
+-- end
+-- local ntf = #tf + 1
+-- tf[ntf] = { id = 0 }
+-- return ntf
+-- end
+--
+-- function constructors.checkvirtualid(tfmdata, id) -- will go
+-- local properties = tfmdata.properties
+-- if tfmdata and tfmdata.type == "virtual" or (properties and properties.virtualized) then
+-- local vfonts = tfmdata.fonts
+-- if not vffonts or #vfonts == 0 then
+-- if properties then
+-- properties.virtualized = false
+-- end
+-- tfmdata.fonts = nil
+-- else
+-- for f=1,#vfonts do
+-- local fnt = vfonts[f]
+-- if fnt.id and fnt.id == 0 then
+-- fnt.id = id
+-- end
+-- end
+-- end
+-- end
+-- end
diff --git a/Master/texmf-dist/tex/context/base/font-def.lua b/Master/texmf-dist/tex/context/base/font-def.lua
index c3b10162ce6..182e543b006 100644
--- a/Master/texmf-dist/tex/context/base/font-def.lua
+++ b/Master/texmf-dist/tex/context/base/font-def.lua
@@ -6,58 +6,53 @@ if not modules then modules = { } end modules ['font-def'] = {
license = "see context related readme files"
}
-local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower
+local concat = table.concat
+local format, gmatch, match, find, lower, gsub = string.format, string.gmatch, string.match, string.find, string.lower, string.gsub
local tostring, next = tostring, next
local lpegmatch = lpeg.match
+local allocate = utilities.storage.allocate
+
local trace_defining = false trackers .register("fonts.defining", function(v) trace_defining = v end)
local directive_embedall = false directives.register("fonts.embedall", function(v) directive_embedall = v end)
trackers.register("fonts.loading", "fonts.defining", "otf.loading", "afm.loading", "tfm.loading")
trackers.register("fonts.all", "fonts.*", "otf.*", "afm.*", "tfm.*")
+local report_defining = logs.reporter("fonts","defining")
+
--[[ldx--
<p>Here we deal with defining fonts. We do so by intercepting the
default loader that only handles <l n='tfm'/>.</p>
--ldx]]--
-fonts = fonts or { }
-fonts.define = fonts.define or { }
-fonts.tfm = fonts.tfm or { }
-fonts.ids = fonts.ids or { }
-fonts.vf = fonts.vf or { }
-fonts.used = fonts.used or { }
+local fonts = fonts
+local fontdata = fonts.hashes.identifiers
+local readers = fonts.readers
+local definers = fonts.definers
+local specifiers = fonts.specifiers
+local constructors = fonts.constructors
-local tfm = fonts.tfm
-local vf = fonts.vf
-local define = fonts.define
+readers.sequence = allocate { 'otf', 'ttf', 'afm', 'tfm', 'lua' } -- dfont ttc
-tfm.version = 1.01
-tfm.cache = containers.define("fonts", "tfm", tfm.version, false) -- better in font-tfm
+local variants = allocate()
+specifiers.variants = variants
-define.method = "afm or tfm" -- afm, tfm, afm or tfm, tfm or afm
-define.specify = fonts.define.specify or { }
-define.methods = fonts.define.methods or { }
+definers.methods = definers.methods or { }
-tfm.fonts = tfm.fonts or { }
-tfm.readers = tfm.readers or { }
-tfm.internalized = tfm.internalized or { } -- internal tex numbers
+local internalized = allocate() -- internal tex numbers (private)
-tfm.readers.sequence = { 'otf', 'ttf', 'afm', 'tfm' }
-tfm.auto_afm = true
-
-local readers = tfm.readers
-local sequence = readers.sequence
+local loadedfonts = constructors.loadedfonts
+local designsizes = constructors.designsizes
--[[ldx--
<p>We hardly gain anything when we cache the final (pre scaled)
-<l n='tfm'/> table. But it can be handy for debugging.</p>
+<l n='tfm'/> table. But it can be handy for debugging, so we no
+longer carry this code along. Also, we now have quite some reference
+to other tables so we would end up with lots of catches.</p>
--ldx]]--
-fonts.version = 1.05
-fonts.cache = containers.define("fonts", "def", fonts.version, false)
-
--[[ldx--
<p>We can prefix a font specification by <type>name:</type> or
<type>file:</type>. The first case will result in a lookup in the
@@ -77,7 +72,7 @@ and prepares a table that will move along as we proceed.</p>
-- name name(sub) name(sub)*spec name*spec
-- name@spec*oeps
-local splitter, specifiers = nil, ""
+local splitter, splitspecifiers = nil, ""
local P, C, S, Cc = lpeg.P, lpeg.C, lpeg.S, lpeg.Cc
@@ -86,13 +81,13 @@ local right = P(")")
local colon = P(":")
local space = P(" ")
-define.defaultlookup = "file"
+definers.defaultlookup = "file"
local prefixpattern = P(false)
-function define.add_specifier(symbol)
- specifiers = specifiers .. symbol
- local method = S(specifiers)
+local function addspecifier(symbol)
+ splitspecifiers = splitspecifiers .. symbol
+ local method = S(splitspecifiers)
local lookup = C(prefixpattern) * colon
local sub = left * C(P(1-left-right-method)^1) * right
local specification = C(method) * C(P(1)^1)
@@ -100,36 +95,39 @@ function define.add_specifier(symbol)
splitter = P((lookup + Cc("")) * name * (sub + Cc("")) * (specification + Cc("")))
end
-function define.add_lookup(str,default)
+local function addlookup(str,default)
prefixpattern = prefixpattern + P(str)
end
-define.add_lookup("file")
-define.add_lookup("name")
-define.add_lookup("spec")
+definers.addlookup = addlookup
-function define.get_specification(str)
+addlookup("file")
+addlookup("name")
+addlookup("spec")
+
+local function getspecification(str)
return lpegmatch(splitter,str)
end
-function define.register_split(symbol,action)
- define.add_specifier(symbol)
- define.specify[symbol] = action
+definers.getspecification = getspecification
+
+function definers.registersplit(symbol,action,verbosename)
+ addspecifier(symbol)
+ variants[symbol] = action
+ if verbosename then
+ variants[verbosename] = action
+ end
end
-function define.makespecification(specification, lookup, name, sub, method, detail, size)
+function definers.makespecification(specification, lookup, name, sub, method, detail, size)
size = size or 655360
if trace_defining then
- logs.report("define font","%s -> lookup: %s, name: %s, sub: %s, method: %s, detail: %s",
+ report_defining("%s -> lookup: %s, name: %s, sub: %s, method: %s, detail: %s",
specification, (lookup ~= "" and lookup) or "[file]", (name ~= "" and name) or "-",
(sub ~= "" and sub) or "-", (method ~= "" and method) or "-", (detail ~= "" and detail) or "-")
end
---~ if specification.lookup then
---~ lookup = specification.lookup -- can come from xetex [] syntax
---~ specification.lookup = nil
---~ end
if not lookup or lookup == "" then
- lookup = define.defaultlookup
+ lookup = definers.defaultlookup
end
local t = {
lookup = lookup, -- forced type
@@ -146,112 +144,49 @@ function define.makespecification(specification, lookup, name, sub, method, deta
return t
end
-function define.analyze(specification, size)
+function definers.analyze(specification, size)
-- can be optimized with locals
- local lookup, name, sub, method, detail = define.get_specification(specification or "")
- return define.makespecification(specification, lookup, name, sub, method, detail, size)
+ local lookup, name, sub, method, detail = getspecification(specification or "")
+ return definers.makespecification(specification, lookup, name, sub, method, detail, size)
end
--[[ldx--
-<p>A unique hash value is generated by:</p>
+<p>We can resolve the filename using the next function:</p>
--ldx]]--
-local sortedhashkeys = table.sortedhashkeys
-
-function tfm.hash_features(specification)
- local features = specification.features
- if features then
- local t = { }
- local normal = features.normal
- if normal and next(normal) then
- local f = sortedhashkeys(normal)
- for i=1,#f do
- local v = f[i]
- if v ~= "number" and v ~= "features" then -- i need to figure this out, features
- t[#t+1] = v .. '=' .. tostring(normal[v])
- end
- end
- end
- local vtf = features.vtf
- if vtf and next(vtf) then
- local f = sortedhashkeys(vtf)
- for i=1,#f do
- local v = f[i]
- t[#t+1] = v .. '=' .. tostring(vtf[v])
- end
- end
---~ if specification.mathsize then
---~ t[#t+1] = "mathsize=" .. specification.mathsize
---~ end
- if #t > 0 then
- return concat(t,"+")
- end
- end
- return "unknown"
-end
+definers.resolvers = definers.resolvers or { }
+local resolvers = definers.resolvers
-fonts.designsizes = { }
+-- todo: reporter
---[[ldx--
-<p>In principle we can share tfm tables when we are in node for a font, but then
-we need to define a font switch as an id/attr switch which is no fun, so in that
-case users can best use dynamic features ... so, we will not use that speedup. Okay,
-when we get rid of base mode we can optimize even further by sharing, but then we
-loose our testcases for <l n='luatex'/>.</p>
---ldx]]--
-
-function tfm.hash_instance(specification,force)
- local hash, size, fallbacks = specification.hash, specification.size, specification.fallbacks
- if force or not hash then
- hash = tfm.hash_features(specification)
- specification.hash = hash
- end
- if size < 1000 and fonts.designsizes[hash] then
- size = math.round(tfm.scaled(size, fonts.designsizes[hash]))
- specification.size = size
+function resolvers.file(specification)
+ local suffix = file.suffix(specification.name)
+ if fonts.formats[suffix] then
+ specification.forced = suffix
+ specification.name = file.removesuffix(specification.name)
end
---~ local mathsize = specification.mathsize or 0
---~ if mathsize > 0 then
---~ local textsize = specification.textsize
---~ if fallbacks then
---~ return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ] @ ' .. fallbacks
---~ else
---~ return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ]'
---~ end
---~ else
- if fallbacks then
- return hash .. ' @ ' .. tostring(size) .. ' @ ' .. fallbacks
- else
- return hash .. ' @ ' .. tostring(size)
- end
---~ end
end
---[[ldx--
-<p>We can resolve the filename using the next function:</p>
---ldx]]--
-
-define.resolvers = resolvers
-
-function define.resolvers.file(specification)
- specification.forced = file.extname(specification.name)
- specification.name = file.removesuffix(specification.name)
-end
-
-function define.resolvers.name(specification)
+function resolvers.name(specification)
local resolve = fonts.names.resolve
if resolve then
- specification.resolved, specification.sub = fonts.names.resolve(specification.name,specification.sub)
- if specification.resolved then
- specification.forced = file.extname(specification.resolved)
- specification.name = file.removesuffix(specification.resolved)
+ local resolved, sub = fonts.names.resolve(specification.name,specification.sub)
+ specification.resolved, specification.sub = resolved, sub
+ if resolved then
+ local suffix = file.suffix(resolved)
+ if fonts.formats[suffix] then
+ specification.forced = suffix
+ specification.name = file.removesuffix(resolved)
+ else
+ specification.name = resolved
+ end
end
else
- define.resolvers.file(specification)
+ resolvers.file(specification)
end
end
-function define.resolvers.spec(specification)
+function resolvers.spec(specification)
local resolvespec = fonts.names.resolvespec
if resolvespec then
specification.resolved, specification.sub = fonts.names.resolvespec(specification.name,specification.sub)
@@ -260,13 +195,13 @@ function define.resolvers.spec(specification)
specification.name = file.removesuffix(specification.resolved)
end
else
- define.resolvers.name(specification)
+ resolvers.name(specification)
end
end
-function define.resolve(specification)
+function definers.resolve(specification)
if not specification.resolved or specification.resolved == "" then -- resolved itself not per se in mapping hash
- local r = define.resolvers[specification.lookup]
+ local r = resolvers[specification.lookup]
if r then
r(specification)
end
@@ -276,7 +211,18 @@ function define.resolve(specification)
else
specification.forced = specification.forced
end
- specification.hash = lower(specification.name .. ' @ ' .. tfm.hash_features(specification))
+ -- for the moment here (goodies set outside features)
+ local goodies = specification.goodies
+ if goodies and goodies ~= "" then
+ local normal = specification.features.normal
+ if not normal then
+ specification.features.normal = { goodies = goodies }
+ elseif not normal.goodies then
+ normal.goodies = goodies
+ end
+ end
+ --
+ specification.hash = lower(specification.name .. ' @ ' .. constructors.hashfeatures(specification))
if specification.sub and specification.sub ~= "" then
specification.hash = specification.sub .. ' @ ' .. specification.hash
end
@@ -299,25 +245,48 @@ features (esp in virtual fonts) so let's not do that now.</p>
specification yet.</p>
--ldx]]--
-function tfm.read(specification)
- local hash = tfm.hash_instance(specification)
- local tfmtable = tfm.fonts[hash] -- hashes by size !
- if not tfmtable then
+-- not in context, at least not now:
+--
+-- function definers.applypostprocessors(tfmdata)
+-- local postprocessors = tfmdata.postprocessors
+-- if postprocessors then
+-- for i=1,#postprocessors do
+-- local extrahash = postprocessors[i](tfmdata) -- after scaling etc
+-- if type(extrahash) == "string" and extrahash ~= "" then
+-- -- e.g. a reencoding needs this
+-- extrahash = gsub(lower(extrahash),"[^a-z]","-")
+-- tfmdata.properties.fullname = format("%s-%s",tfmdata.properties.fullname,extrahash)
+-- end
+-- end
+-- end
+-- return tfmdata
+-- end
+
+function definers.applypostprocessors(tfmdata)
+ return tfmdata
+end
+
+function definers.loadfont(specification)
+ local hash = constructors.hashinstance(specification)
+ local tfmdata = loadedfonts[hash] -- hashes by size !
+ if not tfmdata then
local forced = specification.forced or ""
if forced ~= "" then
- tfmtable = readers[lower(forced)](specification)
- if not tfmtable then
- logs.report("define font","forced type %s of %s not found",forced,specification.name)
+ local reader = readers[lower(forced)]
+ tfmdata = reader and reader(specification)
+ if not tfmdata then
+ report_defining("forced type %s of %s not found",forced,specification.name)
end
else
- for s=1,#sequence do -- reader sequence
+ local sequence = readers.sequence -- can be overloaded so only a shortcut here
+ for s=1,#sequence do
local reader = sequence[s]
- if readers[reader] then -- not really needed
+ if readers[reader] then -- we skip not loaded readers
if trace_defining then
- logs.report("define font","trying (reader sequence driven) type %s for %s with file %s",reader,specification.name,specification.filename or "unknown")
+ report_defining("trying (reader sequence driven) type %s for %s with file %s",reader,specification.name,specification.filename or "unknown")
end
- tfmtable = readers[reader](specification)
- if tfmtable then
+ tfmdata = readers[reader](specification)
+ if tfmdata then
break
else
specification.filename = nil
@@ -325,196 +294,60 @@ function tfm.read(specification)
end
end
end
- if tfmtable then
+ if tfmdata then
+ local properties = tfmdata.properties
+ local embedding
if directive_embedall then
- tfmtable.embedding = "full"
- elseif tfmtable.filename and fonts.dontembed[tfmtable.filename] then
- tfmtable.embedding = "no"
+ embedding = "full"
+ elseif properties.filename and constructors.dontembed[properties.filename] then
+ embedding = "no"
else
- tfmtable.embedding = "subset"
+ embedding = "subset"
end
- tfm.fonts[hash] = tfmtable
- fonts.designsizes[specification.hash] = tfmtable.designsize -- we only know this for sure after loading once
- --~ tfmtable.mode = specification.features.normal.mode or "base"
+ if properties then
+ properties.embedding = embedding
+ else
+ tfmdata.properties = { embedding = embedding }
+ end
+ tfmdata = definers.applypostprocessors(tfmdata)
+ loadedfonts[hash] = tfmdata
+ designsizes[specification.hash] = tfmdata.parameters.designsize
end
end
- if not tfmtable then
- logs.report("define font","font with name %s is not found",specification.name)
+ if not tfmdata then
+ report_defining("font with asked name '%s' is not found using lookup '%s'",specification.name,specification.lookup)
end
- return tfmtable
+ return tfmdata
end
--[[ldx--
<p>For virtual fonts we need a slightly different approach:</p>
--ldx]]--
-function tfm.read_and_define(name,size) -- no id
- local specification = define.analyze(name,size)
+function constructors.readanddefine(name,size) -- no id -- maybe a dummy first
+ local specification = definers.analyze(name,size)
local method = specification.method
- if method and define.specify[method] then
- specification = define.specify[method](specification)
+ if method and variants[method] then
+ specification = variants[method](specification)
end
- specification = define.resolve(specification)
- local hash = tfm.hash_instance(specification)
- local id = define.registered(hash)
+ specification = definers.resolve(specification)
+ local hash = constructors.hashinstance(specification)
+ local id = definers.registered(hash)
if not id then
- local fontdata = tfm.read(specification)
- if fontdata then
- fontdata.hash = hash
- id = font.define(fontdata)
- define.register(fontdata,id)
- tfm.cleanup_table(fontdata)
+ local tfmdata = definers.loadfont(specification)
+ if tfmdata then
+ tfmdata.properties.hash = hash
+ id = font.define(tfmdata)
+ definers.register(tfmdata,id)
else
id = 0 -- signal
end
end
- return fonts.ids[id], id
+ return fontdata[id], id
end
--[[ldx--
-<p>Next follow the readers. This code was written while <l n='luatex'/>
-evolved. Each one has its own way of dealing with its format.</p>
---ldx]]--
-
-local function check_tfm(specification,fullname)
- -- ofm directive blocks local path search unless set; btw, in context we
- -- don't support ofm files anyway as this format is obsolete
- local foundname = resolvers.findbinfile(fullname, 'tfm') or "" -- just to be sure
- if foundname == "" then
- foundname = resolvers.findbinfile(fullname, 'ofm') or "" -- bonus for usage outside context
- end
- if foundname ~= "" then
- specification.filename, specification.format = foundname, "ofm"
- return tfm.read_from_tfm(specification)
- end
-end
-
-local function check_afm(specification,fullname)
- local foundname = resolvers.findbinfile(fullname, 'afm') or "" -- just to be sure
- if foundname == "" and tfm.auto_afm then
- local encoding, shortname = match(fullname,"^(.-)%-(.*)$") -- context: encoding-name.*
- if encoding and shortname and fonts.enc.known[encoding] then
- shortname = resolvers.findbinfile(shortname,'afm') or "" -- just to be sure
- if shortname ~= "" then
- foundname = shortname
- -- tfm.set_normal_feature(specification,'encoding',encoding) -- will go away
- if trace_loading then
- logs.report("load afm","stripping encoding prefix from filename %s",afmname)
- end
- end
- end
- end
- if foundname ~= "" then
- specification.filename, specification.format = foundname, "afm"
- return tfm.read_from_afm(specification)
- end
-end
-
-function readers.tfm(specification)
- local fullname, tfmtable = specification.filename or "", nil
- if fullname == "" then
- local forced = specification.forced or ""
- if forced ~= "" then
- tfmtable = check_tfm(specification,specification.name .. "." .. forced)
- end
- if not tfmtable then
- tfmtable = check_tfm(specification,specification.name)
- end
- else
- tfmtable = check_tfm(specification,fullname)
- end
- return tfmtable
-end
-
-function readers.afm(specification,method)
- local fullname, tfmtable = specification.filename or "", nil
- if fullname == "" then
- local forced = specification.forced or ""
- if forced ~= "" then
- tfmtable = check_afm(specification,specification.name .. "." .. forced)
- end
- if not tfmtable then
- method = method or define.method or "afm or tfm"
- if method == "tfm" then
- tfmtable = check_tfm(specification,specification.name)
- elseif method == "afm" then
- tfmtable = check_afm(specification,specification.name)
- elseif method == "tfm or afm" then
- tfmtable = check_tfm(specification,specification.name) or check_afm(specification,specification.name)
- else -- method == "afm or tfm" or method == "" then
- tfmtable = check_afm(specification,specification.name) or check_tfm(specification,specification.name)
- end
- end
- else
- tfmtable = check_afm(specification,fullname)
- end
- return tfmtable
-end
-
--- maybe some day a set of names
-
-local function check_otf(forced,specification,suffix,what)
- local name = specification.name
- if forced then
- name = file.addsuffix(name,suffix)
- end
- local fullname, tfmtable = resolvers.findbinfile(name,suffix) or "", nil -- one shot
- if fullname == "" then
- local fb = fonts.names.old_to_new[name]
- if fb then
- fullname = resolvers.findbinfile(fb,suffix) or ""
- end
- end
- if fullname == "" then
- local fb = fonts.names.new_to_old[name]
- if fb then
- fullname = resolvers.findbinfile(fb,suffix) or ""
- end
- end
- if fullname ~= "" then
- specification.filename, specification.format = fullname, what -- hm, so we do set the filename, then
- tfmtable = tfm.read_from_open_type(specification) -- we need to do it for all matches / todo
- end
- return tfmtable
-end
-
-function readers.opentype(specification,suffix,what)
- local forced = specification.forced or ""
- if forced == "otf" then
- return check_otf(true,specification,forced,"opentype")
- elseif forced == "ttf" or forced == "ttc" or forced == "dfont" then
- return check_otf(true,specification,forced,"truetype")
- else
- return check_otf(false,specification,suffix,what)
- end
-end
-
-function readers.otf (specification) return readers.opentype(specification,"otf","opentype") end
-function readers.ttf (specification) return readers.opentype(specification,"ttf","truetype") end
-function readers.ttc (specification) return readers.opentype(specification,"ttf","truetype") end -- !!
-function readers.dfont(specification) return readers.opentype(specification,"ttf","truetype") end -- !!
-
---[[ldx--
-<p>We need to check for default features. For this we provide
-a helper function.</p>
---ldx]]--
-
-function define.check(features,defaults) -- nb adapts features !
- local done = false
- if features and next(features) then
- for k,v in next, defaults do
- if features[k] == nil then
- features[k], done = v, true
- end
- end
- else
- features, done = table.fastcopy(defaults), true
- end
- return features, done -- done signals a change
-end
-
---[[ldx--
-<p>So far the specifyers. Now comes the real definer. Here we cache
+<p>So far the specifiers. Now comes the real definer. Here we cache
based on id's. Here we also intercept the virtual font handler. Since
it evolved stepwise I may rewrite this bit (combine code).</p>
@@ -525,127 +358,75 @@ not gain much. By the way, passing id's back to in the callback was
introduced later in the development.</p>
--ldx]]--
-define.last = nil
+local lastdefined = nil -- we don't want this one to end up in s-tra-02
+local internalized = { }
-function define.register(fontdata,id)
- if fontdata and id then
- local hash = fontdata.hash
- if not tfm.internalized[hash] then
- if trace_defining then
- logs.report("define font","loading at 2 id %s, hash: %s",id or "?",hash or "?")
- end
- fonts.identifiers[id] = fontdata
- fonts.characters [id] = fontdata.characters
- fonts.quads [id] = fontdata.parameters.quad
- -- todo: extra functions, e.g. setdigitwidth etc in list
- tfm.internalized[hash] = id
- end
- end
+function definers.current() -- or maybe current
+ return lastdefined
end
-function define.registered(hash)
- local id = tfm.internalized[hash]
- return id, id and fonts.ids[id]
+function definers.registered(hash)
+ local id = internalized[hash]
+ return id, id and fontdata[id]
end
-local cache_them = false
-
-function tfm.make(specification)
- -- currently fonts are scaled while constructing the font, so we
- -- have to do scaling of commands in the vf at that point using
- -- e.g. "local scale = g.factor or 1" after all, we need to work
- -- with copies anyway and scaling needs to be done at some point;
- -- however, when virtual tricks are used as feature (makes more
- -- sense) we scale the commands in fonts.tfm.scale (and set the
- -- factor there)
- local fvm = define.methods[specification.features.vtf.preset]
- if fvm then
- return fvm(specification)
- else
- return nil
+function definers.register(tfmdata,id)
+ if tfmdata and id then
+ local hash = tfmdata.properties.hash
+ if not internalized[hash] then
+ internalized[hash] = id
+ if trace_defining then
+ report_defining("registering font, id: %s, hash: %s",id or "?",hash or "?")
+ end
+ fontdata[id] = tfmdata
+ end
end
end
-function define.read(specification,size,id) -- id can be optional, name can already be table
+function definers.read(specification,size,id) -- id can be optional, name can already be table
statistics.starttiming(fonts)
if type(specification) == "string" then
- specification = define.analyze(specification,size)
+ specification = definers.analyze(specification,size)
end
local method = specification.method
- if method and define.specify[method] then
- specification = define.specify[method](specification)
- end
- specification = define.resolve(specification)
- local hash = tfm.hash_instance(specification)
- if cache_them then
- local fontdata = containers.read(fonts.cache(),hash) -- for tracing purposes
- end
- local fontdata = define.registered(hash) -- id
- if not fontdata then
- if specification.features.vtf and specification.features.vtf.preset then
- fontdata = tfm.make(specification)
- else
- fontdata = tfm.read(specification)
- if fontdata then
- tfm.check_virtual_id(fontdata)
- end
- end
- if cache_them then
- fontdata = containers.write(fonts.cache(),hash,fontdata) -- for tracing purposes
- end
- if fontdata then
- fontdata.hash = hash
- fontdata.cache = "no"
+ if method and variants[method] then
+ specification = variants[method](specification)
+ end
+ specification = definers.resolve(specification)
+ local hash = constructors.hashinstance(specification)
+ local tfmdata = definers.registered(hash) -- id
+ if not tfmdata then
+ tfmdata = definers.loadfont(specification) -- can be overloaded
+ if tfmdata then
+--~ constructors.checkvirtualid(tfmdata) -- interferes
+ tfmdata.properties.hash = hash
if id then
- define.register(fontdata,id)
+ definers.register(tfmdata,id)
end
end
end
- define.last = fontdata or id -- todo ! ! ! ! !
- if not fontdata then
- logs.report("define font", "unknown font %s, loading aborted",specification.name)
- elseif trace_defining and type(fontdata) == "table" then
- logs.report("define font","using %s font with id %s, name:%s size:%s bytes:%s encoding:%s fullname:%s filename:%s",
- fontdata.type or "unknown",
- id or "?",
- fontdata.name or "?",
- fontdata.size or "default",
- fontdata.encodingbytes or "?",
- fontdata.encodingname or "unicode",
- fontdata.fullname or "?",
- file.basename(fontdata.filename or "?"))
-
+ lastdefined = tfmdata or id -- todo ! ! ! ! !
+ if not tfmdata then -- or id?
+ report_defining( "unknown font %s, loading aborted",specification.name)
+ 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 %s, name:%s size:%s bytes:%s encoding:%s fullname:%s filename:%s",
+ properties.type or "unknown",
+ id or "?",
+ properties.name or "?",
+ parameters.size or "default",
+ properties.encodingbytes or "?",
+ properties.encodingname or "unicode",
+ properties.fullname or "?",
+ file.basename(properties.filename or "?"))
end
statistics.stoptiming(fonts)
- return fontdata
-end
-
-function vf.find(name)
- name = file.removesuffix(file.basename(name))
- if tfm.resolve_vf then
- local format = fonts.logger.format(name)
- if format == 'tfm' or format == 'ofm' then
- if trace_defining then
- logs.report("define font","locating vf for %s",name)
- end
- return resolvers.findbinfile(name,"ovf")
- else
- if trace_defining then
- logs.report("define font","vf for %s is already taken care of",name)
- end
- return nil -- ""
- end
- else
- if trace_defining then
- logs.report("define font","locating vf for %s",name)
- end
- return resolvers.findbinfile(name,"ovf")
- end
+ return tfmdata
end
--[[ldx--
-<p>We overload both the <l n='tfm'/> and <l n='vf'/> readers.</p>
+<p>We overload the <l n='tfm'/> reader.</p>
--ldx]]--
-callbacks.register('define_font' , define.read, "definition of fonts (tfmtable preparation)")
-callbacks.register('find_vf_file', vf.find , "locating virtual fonts, insofar needed") -- not that relevant any more
+callbacks.register('define_font', definers.read, "definition of fonts (tfmdata preparation)")
diff --git a/Master/texmf-dist/tex/context/base/font-dum.lua b/Master/texmf-dist/tex/context/base/font-dum.lua
deleted file mode 100644
index 0a9bcd301d5..00000000000
--- a/Master/texmf-dist/tex/context/base/font-dum.lua
+++ /dev/null
@@ -1,301 +0,0 @@
-if not modules then modules = { } end modules ['font-dum'] = {
- version = 1.001,
- comment = "companion to luatex-*.tex",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-fonts = fonts or { }
-
--- general
-
-fonts.otf.pack = false -- only makes sense in context
-fonts.tfm.resolve_vf = false -- no sure about this
-fonts.tfm.fontname_mode = "specification" -- somehow latex needs this
-
--- readers
-
-fonts.tfm.readers = fonts.tfm.readers or { }
-fonts.tfm.readers.sequence = { 'otf', 'ttf', 'tfm' }
-fonts.tfm.readers.afm = nil
-
--- define
-
-fonts.define = fonts.define or { }
-
---~ fonts.define.method = "tfm"
-
-fonts.define.specify.colonized_default_lookup = "name"
-
-function fonts.define.get_specification(str)
- return "", str, "", ":", str
-end
-
--- logger
-
-fonts.logger = fonts.logger or { }
-
-function fonts.logger.save()
-end
-
--- names
---
--- Watch out, the version number is the same as the one used in
--- the mtx-fonts.lua function scripts.fonts.names as we use a
--- simplified font database in the plain solution and by using
--- a different number we're less dependent on context.
-
-fonts.names = fonts.names or { }
-
-fonts.names.version = 1.001 -- not the same as in context
-fonts.names.basename = "luatex-fonts-names.lua"
-fonts.names.new_to_old = { }
-fonts.names.old_to_new = { }
-
-local data, loaded = nil, false
-
-local fileformats = { "lua", "tex", "other text files" }
-
-function fonts.names.resolve(name,sub)
- if not loaded then
- local basename = fonts.names.basename
- if basename and basename ~= "" then
- for i=1,#fileformats do
- local format = fileformats[i]
- local foundname = resolvers.find_file(basename,format) or ""
- if foundname ~= "" then
- data = dofile(foundname)
- break
- end
- end
- end
- loaded = true
- end
- if type(data) == "table" and data.version == fonts.names.version then
- local condensed = string.gsub(string.lower(name),"[^%a%d]","")
- local found = data.mappings and data.mappings[condensed]
- if found then
- local fontname, filename, subfont = found[1], found[2], found[3]
- if subfont then
- return filename, fontname
- else
- return filename, false
- end
- else
- return name, false -- fallback to filename
- end
- end
-end
-
-fonts.names.resolvespec = fonts.names.resolve -- only supported in mkiv
-
--- For the moment we put this (adapted) pseudo feature here.
-
-table.insert(fonts.triggers,"itlc")
-
-local function itlc(tfmdata,value)
- if value then
- -- the magic 40 and it formula come from Dohyun Kim
- local metadata = tfmdata.shared.otfdata.metadata
- if metadata then
- local italicangle = metadata.italicangle
- if italicangle and italicangle ~= 0 then
- local uwidth = (metadata.uwidth or 40)/2
- for unicode, d in next, tfmdata.descriptions do
- local it = d.boundingbox[3] - d.width + uwidth
- if it ~= 0 then
- d.italic = it
- end
- end
- tfmdata.has_italic = true
- end
- end
- end
-end
-
-fonts.initializers.base.otf.itlc = itlc
-fonts.initializers.node.otf.itlc = itlc
-
--- slant and extend
-
-function fonts.initializers.common.slant(tfmdata,value)
- value = tonumber(value)
- if not value then
- value = 0
- elseif value > 1 then
- value = 1
- elseif value < -1 then
- value = -1
- end
- tfmdata.slant_factor = value
-end
-
-function fonts.initializers.common.extend(tfmdata,value)
- value = tonumber(value)
- if not value then
- value = 0
- elseif value > 10 then
- value = 10
- elseif value < -10 then
- value = -10
- end
- tfmdata.extend_factor = value
-end
-
-table.insert(fonts.triggers,"slant")
-table.insert(fonts.triggers,"extend")
-
-fonts.initializers.base.otf.slant = fonts.initializers.common.slant
-fonts.initializers.node.otf.slant = fonts.initializers.common.slant
-fonts.initializers.base.otf.extend = fonts.initializers.common.extend
-fonts.initializers.node.otf.extend = fonts.initializers.common.extend
-
--- expansion and protrusion
-
-fonts.protrusions = fonts.protrusions or { }
-fonts.protrusions.setups = fonts.protrusions.setups or { }
-
-local setups = fonts.protrusions.setups
-
-function fonts.initializers.common.protrusion(tfmdata,value)
- if value then
- local setup = setups[value]
- if setup then
- local factor, left, right = setup.factor or 1, setup.left or 1, setup.right or 1
- local emwidth = tfmdata.parameters.quad
- tfmdata.auto_protrude = true
- for i, chr in next, tfmdata.characters do
- local v, pl, pr = setup[i], nil, nil
- if v then
- pl, pr = v[1], v[2]
- end
- if pl and pl ~= 0 then chr.left_protruding = left *pl*factor end
- if pr and pr ~= 0 then chr.right_protruding = right*pr*factor end
- end
- end
- end
-end
-
-fonts.expansions = fonts.expansions or { }
-fonts.expansions.setups = fonts.expansions.setups or { }
-
-local setups = fonts.expansions.setups
-
-function fonts.initializers.common.expansion(tfmdata,value)
- if value then
- local setup = setups[value]
- if setup then
- local stretch, shrink, step, factor = setup.stretch or 0, setup.shrink or 0, setup.step or 0, setup.factor or 1
- tfmdata.stretch, tfmdata.shrink, tfmdata.step, tfmdata.auto_expand = stretch * 10, shrink * 10, step * 10, true
- for i, chr in next, tfmdata.characters do
- local v = setup[i]
- if v and v ~= 0 then
- chr.expansion_factor = v*factor
- else -- can be option
- chr.expansion_factor = factor
- end
- end
- end
- end
-end
-
-table.insert(fonts.manipulators,"protrusion")
-table.insert(fonts.manipulators,"expansion")
-
-fonts.initializers.base.otf.protrusion = fonts.initializers.common.protrusion
-fonts.initializers.node.otf.protrusion = fonts.initializers.common.protrusion
-fonts.initializers.base.otf.expansion = fonts.initializers.common.expansion
-fonts.initializers.node.otf.expansion = fonts.initializers.common.expansion
-
--- left over
-
-function fonts.register_message()
-end
-
--- example vectors
-
-local byte = string.byte
-
-fonts.expansions.setups['default'] = {
-
- stretch = 2, shrink = 2, step = .5, factor = 1,
-
- [byte('A')] = 0.5, [byte('B')] = 0.7, [byte('C')] = 0.7, [byte('D')] = 0.5, [byte('E')] = 0.7,
- [byte('F')] = 0.7, [byte('G')] = 0.5, [byte('H')] = 0.7, [byte('K')] = 0.7, [byte('M')] = 0.7,
- [byte('N')] = 0.7, [byte('O')] = 0.5, [byte('P')] = 0.7, [byte('Q')] = 0.5, [byte('R')] = 0.7,
- [byte('S')] = 0.7, [byte('U')] = 0.7, [byte('W')] = 0.7, [byte('Z')] = 0.7,
- [byte('a')] = 0.7, [byte('b')] = 0.7, [byte('c')] = 0.7, [byte('d')] = 0.7, [byte('e')] = 0.7,
- [byte('g')] = 0.7, [byte('h')] = 0.7, [byte('k')] = 0.7, [byte('m')] = 0.7, [byte('n')] = 0.7,
- [byte('o')] = 0.7, [byte('p')] = 0.7, [byte('q')] = 0.7, [byte('s')] = 0.7, [byte('u')] = 0.7,
- [byte('w')] = 0.7, [byte('z')] = 0.7,
- [byte('2')] = 0.7, [byte('3')] = 0.7, [byte('6')] = 0.7, [byte('8')] = 0.7, [byte('9')] = 0.7,
-}
-
-fonts.protrusions.setups['default'] = {
-
- factor = 1, left = 1, right = 1,
-
- [0x002C] = { 0, 1 }, -- comma
- [0x002E] = { 0, 1 }, -- period
- [0x003A] = { 0, 1 }, -- colon
- [0x003B] = { 0, 1 }, -- semicolon
- [0x002D] = { 0, 1 }, -- hyphen
- [0x2013] = { 0, 0.50 }, -- endash
- [0x2014] = { 0, 0.33 }, -- emdash
- [0x3001] = { 0, 1 }, -- ideographic comma 、
- [0x3002] = { 0, 1 }, -- ideographic full stop 。
- [0x060C] = { 0, 1 }, -- arabic comma ،
- [0x061B] = { 0, 1 }, -- arabic semicolon ؛
- [0x06D4] = { 0, 1 }, -- arabic full stop ۔
-
-}
-
--- normalizer
-
-fonts.otf.meanings = fonts.otf.meanings or { }
-
-fonts.otf.meanings.normalize = fonts.otf.meanings.normalize or function(t)
- if t.rand then
- t.rand = "random"
- end
-end
-
--- bonus
-
-function fonts.otf.name_to_slot(name)
- local tfmdata = fonts.ids[font.current()]
- if tfmdata and tfmdata.shared then
- local otfdata = tfmdata.shared.otfdata
- local unicode = otfdata.luatex.unicodes[name]
- return unicode and (type(unicode) == "number" and unicode or unicode[1])
- end
-end
-
-function fonts.otf.char(n)
- if type(n) == "string" then
- n = fonts.otf.name_to_slot(n)
- end
- if type(n) == "number" then
- tex.sprint("\\char" .. n)
- end
-end
-
--- another one:
-
-fonts.strippables = table.tohash {
- 0x000AD, 0x017B4, 0x017B5, 0x0200B, 0x0200C, 0x0200D, 0x0200E, 0x0200F, 0x0202A, 0x0202B,
- 0x0202C, 0x0202D, 0x0202E, 0x02060, 0x02061, 0x02062, 0x02063, 0x0206A, 0x0206B, 0x0206C,
- 0x0206D, 0x0206E, 0x0206F, 0x0FEFF, 0x1D173, 0x1D174, 0x1D175, 0x1D176, 0x1D177, 0x1D178,
- 0x1D179, 0x1D17A, 0xE0001, 0xE0020, 0xE0021, 0xE0022, 0xE0023, 0xE0024, 0xE0025, 0xE0026,
- 0xE0027, 0xE0028, 0xE0029, 0xE002A, 0xE002B, 0xE002C, 0xE002D, 0xE002E, 0xE002F, 0xE0030,
- 0xE0031, 0xE0032, 0xE0033, 0xE0034, 0xE0035, 0xE0036, 0xE0037, 0xE0038, 0xE0039, 0xE003A,
- 0xE003B, 0xE003C, 0xE003D, 0xE003E, 0xE003F, 0xE0040, 0xE0041, 0xE0042, 0xE0043, 0xE0044,
- 0xE0045, 0xE0046, 0xE0047, 0xE0048, 0xE0049, 0xE004A, 0xE004B, 0xE004C, 0xE004D, 0xE004E,
- 0xE004F, 0xE0050, 0xE0051, 0xE0052, 0xE0053, 0xE0054, 0xE0055, 0xE0056, 0xE0057, 0xE0058,
- 0xE0059, 0xE005A, 0xE005B, 0xE005C, 0xE005D, 0xE005E, 0xE005F, 0xE0060, 0xE0061, 0xE0062,
- 0xE0063, 0xE0064, 0xE0065, 0xE0066, 0xE0067, 0xE0068, 0xE0069, 0xE006A, 0xE006B, 0xE006C,
- 0xE006D, 0xE006E, 0xE006F, 0xE0070, 0xE0071, 0xE0072, 0xE0073, 0xE0074, 0xE0075, 0xE0076,
- 0xE0077, 0xE0078, 0xE0079, 0xE007A, 0xE007B, 0xE007C, 0xE007D, 0xE007E, 0xE007F,
-}
-
diff --git a/Master/texmf-dist/tex/context/base/font-enc.lua b/Master/texmf-dist/tex/context/base/font-enc.lua
index 874f7c3f4ed..a6f9250e758 100644
--- a/Master/texmf-dist/tex/context/base/font-enc.lua
+++ b/Master/texmf-dist/tex/context/base/font-enc.lua
@@ -6,18 +6,25 @@ if not modules then modules = { } end modules ['font-enc'] = {
license = "see context related readme files"
}
+-- this module is obsolete
+
local match, gmatch, gsub = string.match, string.gmatch, string.gsub
+local setmetatableindex = table.setmetatableindex
+
--[[ldx--
<p>Because encodings are going to disappear, we don't bother defining
them in tables. But we may do so some day, for consistency.</p>
--ldx]]--
-fonts.enc = fonts.enc or { }
-fonts.enc.version = 1.03
-fonts.enc.cache = containers.define("fonts", "enc", fonts.enc.version, true)
+local report_encoding = logs.reporter("fonts","encoding")
+
+local encodings = { }
+fonts.encodings = encodings
-fonts.enc.known = { -- sort of obsolete
+encodings.version = 1.03
+encodings.cache = containers.define("fonts", "enc", fonts.encodings.version, true)
+encodings.known = utilities.storage.allocate { -- sort of obsolete
texnansi = true,
ec = true,
qx = true,
@@ -25,11 +32,11 @@ fonts.enc.known = { -- sort of obsolete
t2a = true,
t2b = true,
t2c = true,
- unicode = true
+ unicode = true,
}
-function fonts.enc.is_known(encoding)
- return containers.is_valid(fonts.enc.cache(),encoding)
+function encodings.is_known(encoding)
+ return containers.is_valid(encodings.cache,encoding)
end
--[[ldx--
@@ -51,24 +58,25 @@ Latin Modern or <l n='tex'> Gyre) come in OpenType variants too, so these
will be used.</p>
--ldx]]--
-function fonts.enc.load(filename)
+local enccodes = characters.enccodes or { }
+
+function encodings.load(filename)
local name = file.removesuffix(filename)
- local data = containers.read(fonts.enc.cache(),name)
+ local data = containers.read(encodings.cache,name)
if data then
return data
end
if name == "unicode" then
- data = fonts.enc.make_unicode_vector() -- special case, no tex file for this
+ data = encodings.make_unicode_vector() -- special case, no tex file for this
end
if data then
return data
end
local vector, tag, hash, unicodes = { }, "", { }, { }
- local foundname = resolvers.find_file(filename,'enc')
+ local foundname = resolvers.findfile(filename,'enc')
if foundname and foundname ~= "" then
local ok, encoding, size = resolvers.loadbinfile(foundname)
if ok and encoding then
- local enccodes = characters.enccodes
encoding = gsub(encoding,"%%(.-)\n","")
local tag, vec = match(encoding,"/(%w+)%s*%[(.*)%]%s*def")
local i = 0
@@ -89,13 +97,13 @@ function fonts.enc.load(filename)
end
end
local data = {
- name=name,
- tag=tag,
- vector=vector,
- hash=hash,
- unicodes=unicodes
+ name = name,
+ tag = tag,
+ vector = vector,
+ hash = hash,
+ unicodes = unicodes
}
- return containers.write(fonts.enc.cache(), name, data)
+ return containers.write(encodings.cache, name, data)
end
--[[ldx--
@@ -105,12 +113,13 @@ one.</p>
-- maybe make this a function:
-function fonts.enc.make_unicode_vector()
+function encodings.make_unicode_vector()
local vector, hash = { }, { }
for code, v in next, characters.data do
local name = v.adobename
if name then
- vector[code], hash[name] = name, code
+ vector[code] = name
+ hash[name] = code
else
vector[code] = '.notdef'
end
@@ -118,5 +127,21 @@ function fonts.enc.make_unicode_vector()
for name, code in next, characters.synonyms do
vector[code], hash[name] = name, code
end
- return containers.write(fonts.enc.cache(), 'unicode', { name='unicode', tag='unicode', vector=vector, hash=hash })
+ return containers.write(encodings.cache, 'unicode', { name='unicode', tag='unicode', vector=vector, hash=hash })
+end
+
+if not encodings.agl then
+
+ -- We delay delay loading this rather big vector that is only needed when a
+ -- font is loaded for caching. Once we're further along the route we can also
+ -- delay it in the generic version (which doesn't use this file).
+
+ encodings.agl = { }
+
+ setmetatableindex(encodings.agl, function(t,k)
+ report_encoding("loading (extended) adobe glyph list")
+ dofile(resolvers.findfile("font-agl.lua"))
+ return rawget(encodings.agl,k)
+ end)
+
end
diff --git a/Master/texmf-dist/tex/context/base/font-enh.lua b/Master/texmf-dist/tex/context/base/font-enh.lua
index fc70c04c566..ca9893e3d84 100644
--- a/Master/texmf-dist/tex/context/base/font-enh.lua
+++ b/Master/texmf-dist/tex/context/base/font-enh.lua
@@ -6,196 +6,172 @@ if not modules then modules = { } end modules ['font-enh'] = {
license = "see context related readme files"
}
-local next, match = next, string.match
+local next = next
-local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+local report_defining = logs.reporter("fonts","defining")
--- tfmdata has also fast access to indices and unicodes
--- to be checked: otf -> tfm -> tfmscaled
---
--- watch out: no negative depths and negative eights permitted in regular fonts
-
---[[ldx--
-<p>Here we only implement a few helper functions.</p>
---ldx]]--
-
-local tfm = fonts.tfm
-
---[[ldx--
-<p>The next function encapsulates the standard <l n='tfm'/> loader as
-supplied by <l n='luatex'/>.</p>
---ldx]]--
-
--- auto complete font with missing composed characters
+local fonts = fonts
+local constructors = fonts.constructors
-table.insert(fonts.manipulators,"compose")
+local tfmfeatures = constructors.newfeatures("tfm")
+local registertfmfeature = tfmfeatures.register
-function fonts.initializers.common.compose(tfmdata,value)
- if value then
- fonts.vf.aux.compose_characters(tfmdata)
- end
-end
-
--- tfm features, experimental
+local afmfeatures = fonts.constructors.newfeatures("afm")
+local registerafmfeature = afmfeatures.register
-tfm.features = tfm.features or { }
-tfm.features.list = tfm.features.list or { }
-tfm.features.default = tfm.features.default or { }
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
-function tfm.enhance(tfmdata,specification)
- -- we don't really share tfm data because we always reload
- -- but this is more in sycn with afm and such
- local features = (specification.features and specification.features.normal ) or { }
- tfmdata.shared = tfmdata.shared or { }
- tfmdata.shared.features = features
- -- tfmdata.shared.tfmdata = tfmdata -- circular
- tfmdata.filename = specification.name
- if not features.encoding then
- local name, size = specification.name, specification.size
- local encoding, filename = match(name,"^(.-)%-(.*)$") -- context: encoding-name.*
- if filename and encoding and fonts.enc.known[encoding] then
- features.encoding = encoding
+-- -- these will become goodies (when needed at all)
+--
+-- local fontencodings = fonts.encodings
+-- fontencodings.remappings = fontencodings.remappings or { }
+--
+-- local function reencode(tfmdata,encoding)
+-- if encoding and fontencodings.known[encoding] then
+-- local data = fontencodings.load(encoding)
+-- if data then
+-- tfmdata.properties.encoding = encoding
+-- local characters = tfmdata.characters
+-- local original = { }
+-- local vector = data.vector
+-- for unicode, character in next, characters do
+-- character.name = vector[unicode]
+-- character.index = unicode, character
+-- original[unicode] = character
+-- end
+-- for newcode, oldcode in next, data.unicodes do
+-- if newcode ~= oldcode then
+-- if trace_defining then
+-- report_defining("reencoding U+%05X to U+%05X",oldcode,newcode)
+-- end
+-- characters[newcode] = original[oldcode]
+-- end
+-- end
+-- end
+-- end
+-- end
+--
+-- registertfmfeature {
+-- name = "reencode",
+-- description = "reencode",
+-- manipulators = {
+-- base = reencode,
+-- node = reencode,
+-- }
+-- }
+--
+-- local function remap(tfmdata,remapping)
+-- local vector = remapping and fontencodings.remappings[remapping]
+-- if vector then
+-- local characters, original = tfmdata.characters, { }
+-- for k, v in next, characters do
+-- original[k], characters[k] = v, nil
+-- end
+-- for k,v in next, vector do
+-- if k ~= v then
+-- if trace_defining then
+-- report_defining("remapping U+%05X to U+%05X",k,v)
+-- end
+-- local c = original[k]
+-- characters[v] = c
+-- c.index = k
+-- end
+-- end
+-- local properties = tfmdata.properties
+-- if not properties then
+-- properties = { }
+-- tfmdata.properties = properties
+-- else
+-- properties.encodingbytes = 2
+-- properties.format = properties.format or 'type1'
+-- end
+-- end
+-- end
+--
+-- registertfmfeature {
+-- name = "remap",
+-- description = "remap",
+-- manipulators = {
+-- base = remap,
+-- node = remap,
+-- }
+-- }
+
+-- \definefontfeature[dingbats][goodies=dingbats,unicoding=yes]
+
+-- we only add and don't replace
+-- we could also add kerns but we asssume symbols
+-- todo: complain if not basemode
+
+-- remapping = {
+-- tounicode = true,
+-- unicodes = {
+-- a1 = 0x2701,
+
+local tosixteen = fonts.mappings.tounicode16
+
+local function initializeunicoding(tfmdata)
+ local goodies = tfmdata.goodies
+ local newcoding = nil
+ 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
end
end
- tfm.set_features(tfmdata)
-end
-
-function tfm.set_features(tfmdata)
- -- todo: no local functions
- local shared = tfmdata.shared
--- local tfmdata = shared.tfmdata
- local features = shared.features
- if features and next(features) then
- local mode = tfmdata.mode or fonts.mode
- local fi = fonts.initializers[mode]
- if fi and fi.tfm then
- local function initialize(list) -- using tex lig and kerning
- if list then
- for i=1,#list do
- local f = list[i]
- local value = features[f]
- if value and fi.tfm[f] then -- brr
- if tfm.trace_features then
- logs.report("define font","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown')
- end
- fi.tfm[f](tfmdata,value)
- mode = tfmdata.mode or fonts.mode
- fi = fonts.initializers[mode]
- end
- 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 originals = { }
+ for name, newcode in next, newcoding do
+ local oldcode = oldcoding[name]
+ if characters[newcode] and not originals[newcode] then
+ originals[newcode] = {
+ character = characters [newcode],
+ description = descriptions[newcode],
+ }
end
- initialize(fonts.triggers)
- initialize(tfm.features.list)
- initialize(fonts.manipulators)
- end
- local fm = fonts.methods[mode]
- if fm and fm.tfm then
- local function register(list) -- node manipulations
- if list then
- for i=1,#list do
- local f = list[i]
- if features[f] and fm.tfm[f] then -- brr
- if not shared.processors then -- maybe also predefine
- shared.processors = { fm.tfm[f] }
- else
- shared.processors[#shared.processors+1] = fm.tfm[f]
- end
- end
- end
- end
+ local original = originals[oldcode]
+ if original then
+ characters [newcode] = original.character
+ descriptions[newcode] = original.description
+ else
+ characters [newcode] = characters [oldcode]
+ descriptions[newcode] = descriptions[oldcode]
end
- register(tfm.features.list)
- end
- end
-end
-
-function tfm.features.register(name,default)
- tfm.features.list[#tfm.features.list+1] = name
- tfm.features.default[name] = default
-end
-
-function tfm.reencode(tfmdata,encoding)
- if encoding and fonts.enc.known[encoding] then
- local data = fonts.enc.load(encoding)
- if data then
- local characters, original, vector = tfmdata.characters, { }, data.vector
- tfmdata.encoding = encoding -- not needed
- for k, v in next, characters do
- v.name, v.index, original[k] = vector[k], k, v
- end
- for k,v in next, data.unicodes do
- if k ~= v then
- if trace_defining then
- logs.report("define font","reencoding U+%04X to U+%04X",k,v)
- end
- characters[k] = original[v]
+ if tounicode then
+ local index = descriptions[newcode].index
+ if not tounicodes[index] then
+ tounicodes[index] = tosixteen(newcode) -- shared (we could have a metatable)
end
end
- end
- end
-end
-
-tfm.features.register('reencode')
-
-fonts.initializers.base.tfm.reencode = tfm.reencode
-fonts.initializers.node.tfm.reencode = tfm.reencode
-
-fonts.enc = fonts.enc or { }
-fonts.enc.remappings = fonts.enc.remappings or { }
-
-function tfm.remap(tfmdata,remapping)
- local vector = remapping and fonts.enc.remappings[remapping]
- if vector then
- local characters, original = tfmdata.characters, { }
- for k, v in next, characters do
- original[k], characters[k] = v, nil
- end
- for k,v in next, vector do
- if k ~= v then
- if trace_defining then
- logs.report("define font","remapping U+%04X to U+%04X",k,v)
- end
- local c = original[k]
- characters[v] = c
- c.index = k
+ if trace_defining then
+ report_defining("aliasing glyph '%s' from U+%05X to U+%05X",name,oldcode,newcode)
end
end
- tfmdata.encodingbytes = 2
- tfmdata.format = 'type1'
end
end
-tfm.features.register('remap')
-
-fonts.initializers.base.tfm.remap = tfm.remap
-fonts.initializers.node.tfm.remap = tfm.remap
+registerafmfeature {
+ name = "unicoding",
+ description = "adapt unicode table",
+ initializers = {
+ base = initializeunicoding,
+ node = initializeunicoding,
+ }
+}
---~ obsolete
---~
---~ function tfm.enhance(tfmdata,specification)
---~ local name, size = specification.name, specification.size
---~ local encoding, filename = match(name,"^(.-)%-(.*)$") -- context: encoding-name.*
---~ if filename and encoding and fonts.enc.known[encoding] then
---~ local data = fonts.enc.load(encoding)
---~ if data then
---~ local characters = tfmdata.characters
---~ tfmdata.encoding = encoding
---~ local vector = data.vector
---~ local original = { }
---~ for k, v in next, characters do
---~ v.name = vector[k]
---~ v.index = k
---~ original[k] = v
---~ end
---~ for k,v in next, data.unicodes do
---~ if k ~= v then
---~ if trace_defining then
---~ logs.report("define font","mapping %s onto %s",k,v)
---~ end
---~ characters[k] = original[v]
---~ end
---~ end
---~ end
---~ end
---~ end
+registerotffeature {
+ name = "unicoding",
+ description = "adapt unicode table",
+ initializers = {
+ base = initializeunicoding,
+ node = initializeunicoding,
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/font-ext.lua b/Master/texmf-dist/tex/context/base/font-ext.lua
index 05bdaf2fc3a..4ea9cf3caa0 100644
--- a/Master/texmf-dist/tex/context/base/font-ext.lua
+++ b/Master/texmf-dist/tex/context/base/font-ext.lua
@@ -10,11 +10,15 @@ local utf = unicode.utf8
local next, type, byte = next, type, string.byte
local gmatch, concat = string.gmatch, table.concat
local utfchar = utf.char
+local getparameters = utilities.parsers.getparameters
+
+local allocate = utilities.storage.allocate
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)
-commands = commands or { }
+local report_expansions = logs.reporter("fonts","expansions")
+local report_protrusions = logs.reporter("fonts","protrusions")
--[[ldx--
<p>When we implement functions that deal with features, most of them
@@ -22,74 +26,13 @@ will depend of the font format. Here we define the few that are kind
of neutral.</p>
--ldx]]--
-fonts.triggers = fonts.triggers or { }
-fonts.initializers = fonts.initializers or { }
-fonts.methods = fonts.methods or { }
-fonts.initializers.common = fonts.initializers.common or { }
-
-local initializers = fonts.initializers
-local methods = fonts.methods
-
---[[ldx--
-<p>This feature will remove inter-digit kerns.</p>
---ldx]]--
-
-table.insert(fonts.triggers,"equaldigits")
-
-function initializers.common.equaldigits(tfmdata,value)
- if value then
- local chr = tfmdata.characters
- for i = utfbyte('0'), utfbyte('9') do
- local c = chr[i]
- if c then
- c.kerns = nil
- end
- end
- end
-end
+local fonts = fonts
---[[ldx--
-<p>This feature will give all glyphs an equal height and/or depth. Valid
-values are <type>none</type>, <type>height</type>, <type>depth</type> and
-<type>both</type>.</p>
---ldx]]--
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
-table.insert(fonts.triggers,"lineheight")
-
-function initializers.common.lineheight(tfmdata,value)
- if value and type(value) == "string" then
- if value == "none" then
- for _,v in next, tfmdata.characters do
- v.height, v.depth = 0, 0
- end
- else
- local ascender, descender = tfmdata.ascender, tfmdata.descender
- if ascender and descender then
- local ht, dp = ascender or 0, descender or 0
- if value == "height" then
- dp = 0
- elseif value == "depth" then
- ht = 0
- end
- if ht > 0 then
- if dp > 0 then
- for _,v in next, tfmdata.characters do
- v.height, v.depth = ht, dp
- end
- else
- for _,v in next, tfmdata.characters do
- v.height = ht
- end
- end
- elseif dp > 0 then
- for _,v in next, tfmdata.characters do
- v.depth = dp
- end
- end
- end
- end
- end
-end
+local afmfeatures = fonts.constructors.newfeatures("afm")
+local registerafmfeature = afmfeatures.register
-- -- -- -- -- --
-- shared
@@ -99,11 +42,13 @@ local function get_class_and_vector(tfmdata,value,where) -- "expansions"
local g_where = tfmdata.goodies and tfmdata.goodies[where]
local f_where = fonts[where]
local g_classes = g_where and g_where.classes
- local class = g_where and g_where[value] or f_where.classes[value]
+ local f_classes = f_where and f_where.classes
+ local class = (g_classes and g_classes[value]) or (f_classes and f_classes[value])
if class then
local class_vector = class.vector
local g_vectors = g_where and g_where.vectors
- local vector = g_vectors and g_vectors[class_vector] or f_where.vectors[class_vector]
+ local f_vectors = f_where and f_where.vectors
+ local vector = (g_vectors and g_vectors[class_vector]) or (f_vectors and f_vectors[class_vector])
return class, vector
end
end
@@ -112,20 +57,21 @@ end
-- expansion (hz)
-- -- -- -- -- --
-fonts.expansions = fonts.expansions or { }
-fonts.expansions.classes = fonts.expansions.classes or { }
-fonts.expansions.vectors = fonts.expansions.vectors or { }
+fonts.expansions = allocate()
+local expansions = fonts.expansions
-local expansions = fonts.expansions
-local classes = fonts.expansions.classes
-local vectors = fonts.expansions.vectors
+expansions.classes = allocate()
+local classes = expansions.classes
+
+expansions.vectors = allocate()
+local vectors = expansions.vectors
-- beware, pdftex itself uses percentages * 10
classes.preset = { stretch = 2, shrink = 2, step = .5, factor = 1 }
function commands.setupfontexpansion(class,settings)
- aux.getparameters(classes,class,'preset',settings)
+ getparameters(classes,class,'preset',settings)
end
classes['quality'] = {
@@ -146,31 +92,26 @@ vectors['default'] = {
vectors['quality'] = vectors['default'] -- metatable ?
---~ function table.locator(...)
---~ local k = { ... }
---~ return function(t)
---~ for i=1,#k do
---~ t = t[k[i]]
---~ if not k then
---~ return false
---~ end
---~ end
---~ return t
---~ end
---~ end
-
---~ local locate = table.locator { "goodies", "expansions" }
-
-function initializers.common.expansion(tfmdata,value)
+local function initializeexpansion(tfmdata,value)
if value then
local class, vector = get_class_and_vector(tfmdata,value,"expansions")
if class then
if vector then
- local stretch, shrink, step, factor = class.stretch or 0, class.shrink or 0, class.step or 0, class.factor or 1
+ local stretch = class.stretch or 0
+ local shrink = class.shrink or 0
+ local step = class.step or 0
+ local factor = class.factor or 1
if trace_expansion then
- logs.report("fonts","set expansion class %s, vector: %s, factor: %s, stretch: %s, shrink: %s, step: %s",value,class_vector,factor,stretch,shrink,step)
+ report_expansions("setting class %s, vector: %s, factor: %s, stretch: %s, shrink: %s, step: %s",
+ value,class.vector,factor,stretch,shrink,step)
end
- tfmdata.stretch, tfmdata.shrink, tfmdata.step, tfmdata.auto_expand = stretch * 10, shrink * 10, step * 10, true
+ tfmdata.parameters.expansion = {
+ stretch = 10 * stretch,
+ shrink = 10 * shrink,
+ step = 10 * step,
+ factor = factor,
+ auto = true,
+ }
local data = characters and characters.data
for i, chr in next, tfmdata.characters do
local v = vector[i]
@@ -194,42 +135,55 @@ function initializers.common.expansion(tfmdata,value)
end
end
elseif trace_expansion then
- logs.report("fonts","unknown expansion vector '%s' in class '%s",class_vector,value)
+ report_expansions("unknown vector '%s' in class '%s",class.vector,value)
end
elseif trace_expansion then
- logs.report("fonts","unknown expansion class '%s'",value)
+ report_expansions("unknown class '%s'",value)
end
end
end
-table.insert(fonts.manipulators,"expansion")
-
-initializers.base.otf.expansion = initializers.common.expansion
-initializers.node.otf.expansion = initializers.common.expansion
+registerotffeature {
+ name = "expansion",
+ description = "apply hz optimization",
+ initializers = {
+ base = initializeexpansion,
+ node = initializeexpansion,
+ }
+}
-initializers.base.afm.expansion = initializers.common.expansion
-initializers.node.afm.expansion = initializers.common.expansion
+registerafmfeature {
+ name = "expansion",
+ description = "apply hz optimization",
+ initializers = {
+ base = initializeexpansion,
+ node = initializeexpansion,
+ }
+}
fonts.goodies.register("expansions", function(...) return fonts.goodies.report("expansions", trace_expansion, ...) end)
+local report_opbd = logs.reporter("fonts","otf opbd")
+
-- -- -- -- -- --
-- protrusion
-- -- -- -- -- --
-fonts.protrusions = fonts.protrusions or { }
-fonts.protrusions.classes = fonts.protrusions.classes or { }
-fonts.protrusions.vectors = fonts.protrusions.vectors or { }
+fonts.protrusions = allocate()
+local protrusions = fonts.protrusions
+
+protrusions.classes = allocate()
+protrusions.vectors = allocate()
-local protrusions = fonts.protrusions
-local classes = fonts.protrusions.classes
-local vectors = fonts.protrusions.vectors
+local classes = protrusions.classes
+local vectors = protrusions.vectors
-- the values need to be revisioned
classes.preset = { factor = 1, left = 1, right = 1 }
function commands.setupfontprotrusion(class,settings)
- aux.getparameters(classes,class,'preset',settings)
+ getparameters(classes,class,'preset',settings)
end
classes['pure'] = {
@@ -252,6 +206,7 @@ vectors['pure'] = {
[0x003A] = { 0, 1 }, -- colon
[0x003B] = { 0, 1 }, -- semicolon
[0x002D] = { 0, 1 }, -- hyphen
+ [0x00AD] = { 0, 1 }, -- also hyphen
[0x2013] = { 0, 0.50 }, -- endash
[0x2014] = { 0, 0.33 }, -- emdash
[0x3001] = { 0, 1 }, -- ideographic comma 、
@@ -277,6 +232,7 @@ vectors['punctuation'] = {
[0x003A] = { 0, 0.50 }, -- colon
[0x003B] = { 0, 0.50 }, -- semicolon
[0x002D] = { 0, 0.70 }, -- hyphen
+ [0x00AD] = { 0, 0.70 }, -- also hyphen
[0x2013] = { 0, 0.30 }, -- endash
[0x2014] = { 0, 0.20 }, -- emdash
[0x060C] = { 0, 0.70 }, -- arabic comma
@@ -325,7 +281,7 @@ vectors['alpha'] = {
}
-vectors['quality'] = table.merge( {},
+vectors['quality'] = table.merged(
vectors['punctuation'],
vectors['alpha']
)
@@ -360,10 +316,13 @@ classes['double'] = { -- for testing opbd
}
local function map_opbd_onto_protrusion(tfmdata,value,opbd)
- local characters, descriptions = tfmdata.characters, tfmdata.descriptions
- local otfdata = tfmdata.shared.otfdata
- local singles = otfdata.shared.featuredata.gpos_single
- local script, language = tfmdata.script, tfmdata.language
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local properties = tfmdata.properties
+ local rawdata = tfmdata.shared.rawdata
+ local lookuphash = rawdata.lookuphash
+ local script = properties.script
+ local language = properties.language
local done, factor, left, right = false, 1, 1, 1
local class = classes[value]
if class then
@@ -374,21 +333,21 @@ local function map_opbd_onto_protrusion(tfmdata,value,opbd)
factor = tonumber(value) or 1
end
if opbd ~= "right" then
- local validlookups, lookuplist = fonts.otf.collect_lookups(otfdata,"lfbd",script,language)
+ local validlookups, lookuplist = otf.collectlookups(rawdata,"lfbd",script,language)
if validlookups then
for i=1,#lookuplist do
local lookup = lookuplist[i]
- local data = singles[lookup]
+ local data = lookuphash[lookup]
if data then
if trace_protrusion then
- logs.report("fonts","set left protrusion using lfbd lookup '%s'",lookup)
+ report_protrusions("setting left using lfbd lookup '%s'",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
- logs.report("opbd","lfbd -> %s -> 0x%05X (%s) -> %0.03f (%s)",lookup,k,utfchar(k),p,concat(v," "))
+ report_protrusions("lfbd -> %s -> U+%05X (%s) -> %0.03f (%s)",lookup,k,utfchar(k),p,concat(v," "))
end
end
done = true
@@ -397,21 +356,21 @@ local function map_opbd_onto_protrusion(tfmdata,value,opbd)
end
end
if opbd ~= "left" then
- local validlookups, lookuplist = fonts.otf.collect_lookups(otfdata,"rtbd",script,language)
+ local validlookups, lookuplist = otf.collectlookups(rawdata,"rtbd",script,language)
if validlookups then
for i=1,#lookuplist do
local lookup = lookuplist[i]
- local data = singles[lookup]
+ local data = lookuphash[lookup]
if data then
if trace_protrusion then
- logs.report("fonts","set right protrusion using rtbd lookup '%s'",lookup)
+ report_protrusions("setting right using rtbd lookup '%s'",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
- logs.report("opbd","rtbd -> %s -> 0x%05X (%s) -> %0.03f (%s)",lookup,k,utfchar(k),p,concat(v," "))
+ report_protrusions("rtbd -> %s -> U+%05X (%s) -> %0.03f (%s)",lookup,k,utfchar(k),p,concat(v," "))
end
end
end
@@ -419,7 +378,9 @@ local function map_opbd_onto_protrusion(tfmdata,value,opbd)
end
end
end
- tfmdata.auto_protrude = done
+ tfmdata.parameters.protrusion {
+ auto = true
+ }
end
-- The opbd test is just there because it was discussed on the
@@ -427,7 +388,7 @@ end
-- only has some kerns for digits. So, consider this feature not
-- supported till we have a proper test font.
-function initializers.common.protrusion(tfmdata,value)
+local function initializeprotrusion(tfmdata,value)
if value then
local opbd = tfmdata.shared.features.opbd
if opbd then
@@ -441,11 +402,17 @@ function initializers.common.protrusion(tfmdata,value)
local left = class.left or 1
local right = class.right or 1
if trace_protrusion then
- logs.report("fonts","set protrusion class %s, vector: %s, factor: %s, left: %s, right: %s",value,class_vector,factor,left,right)
+ report_protrusions("setting class %s, vector: %s, factor: %s, left: %s, right: %s",
+ value,class.vector,factor,left,right)
end
local data = characters.data
local emwidth = tfmdata.parameters.quad
- tfmdata.auto_protrude = true
+ tfmdata.parameters.protrusion = {
+ factor = factor,
+ left = left,
+ right = right,
+ auto = true,
+ }
for i, chr in next, tfmdata.characters do
local v, pl, pr = vector[i], nil, nil
if v then
@@ -476,70 +443,89 @@ function initializers.common.protrusion(tfmdata,value)
end
end
elseif trace_protrusion then
- logs.report("fonts","unknown protrusion vector '%s' in class '%s",class_vector,value)
+ report_protrusions("unknown vector '%s' in class '%s",class.vector,value)
end
elseif trace_protrusion then
- logs.report("fonts","unknown protrusion class '%s'",value)
+ report_protrusions("unknown class '%s'",value)
end
end
end
end
-table.insert(fonts.manipulators,"protrusion")
-
-initializers.base.otf.protrusion = initializers.common.protrusion
-initializers.node.otf.protrusion = initializers.common.protrusion
+registerotffeature {
+ name = "protrusion",
+ description = "shift characters into the left and or right margin",
+ initializers = {
+ base = initializeprotrusion,
+ node = initializeprotrusion,
+ }
+}
-initializers.base.afm.protrusion = initializers.common.protrusion
-initializers.node.afm.protrusion = initializers.common.protrusion
+registerafmfeature {
+ name = "protrusion",
+ description = "shift characters into the left and or right margin",
+ initializers = {
+ base = initializeprotrusion,
+ node = initializeprotrusion,
+ }
+}
fonts.goodies.register("protrusions", function(...) return fonts.goodies.report("protrusions", trace_protrusion, ...) end)
-- -- --
-function initializers.common.nostackmath(tfmdata,value)
- tfmdata.ignore_stack_math = value
+local function initializenostackmath(tfmdata,value)
+ tfmdata.properties.no_stackmath = value and true
end
-table.insert(fonts.manipulators,"nostackmath")
-
-initializers.base.otf.nostackmath = initializers.common.nostackmath
-initializers.node.otf.nostackmath = initializers.common.nostackmath
-
-table.insert(fonts.triggers,"itlc")
+registerotffeature {
+ name = "nostackmath",
+ description = "disable math stacking mechanism",
+ initializers = {
+ base = initializenostackmath,
+ node = initializenostackmath,
+ }
+}
-function initializers.common.itlc(tfmdata,value)
+local function initializeitlc(tfmdata,value)
if value then
-- the magic 40 and it formula come from Dohyun Kim
- local fontdata = tfmdata.shared.otfdata or tfmdata.shared.afmdata
- local metadata = fontdata and fontdata.metadata
- if metadata then
- local italicangle = metadata.italicangle
- if italicangle and italicangle ~= 0 then
- local uwidth = (metadata.uwidth or 40)/2
- for unicode, d in next, tfmdata.descriptions do
- local it = d.boundingbox[3] - d.width + uwidth
- if it ~= 0 then
- d.italic = it
- end
+ local parameters = tfmdata.parameters
+ local italicangle = parameters.italicangle
+ if italicangle and italicangle ~= 0 then
+ local uwidth = (parameters.uwidth or 40)/2
+ for unicode, d in next, tfmdata.descriptions do
+ local it = d.boundingbox[3] - d.width + uwidth
+ if it ~= 0 then
+ d.italic = it
end
- tfmdata.has_italic = true
end
+ tfmdata.properties.italic_correction = true
end
end
end
-initializers.base.otf.itlc = initializers.common.itlc
-initializers.node.otf.itlc = initializers.common.itlc
+registerotffeature {
+ name = "itlc",
+ description = "italic correction",
+ initializers = {
+ base = initializeitlc,
+ node = initializeitlc,
+ }
+}
-initializers.base.afm.itlc = initializers.common.itlc
-initializers.node.afm.itlc = initializers.common.itlc
+registerafmfeature {
+ name = "itlc",
+ description = "italic correction",
+ initializers = {
+ base = initializeitlc,
+ node = initializeitlc,
+ }
+}
-- slanting
-table.insert(fonts.triggers,"slant")
-
-function initializers.common.slant(tfmdata,value)
+local function initializeslant(tfmdata,value)
value = tonumber(value)
if not value then
value = 0
@@ -548,18 +534,28 @@ function initializers.common.slant(tfmdata,value)
elseif value < -1 then
value = -1
end
- tfmdata.slant_factor = value
+ tfmdata.parameters.slant_factor = value
end
-initializers.base.otf.slant = initializers.common.slant
-initializers.node.otf.slant = initializers.common.slant
-
-initializers.base.afm.slant = initializers.common.slant
-initializers.node.afm.slant = initializers.common.slant
+registerotffeature {
+ name = "slant",
+ description = "slant glyphs",
+ initializers = {
+ base = initializeslant,
+ node = initializeslant,
+ }
+}
-table.insert(fonts.triggers,"extend")
+registerafmfeature {
+ name = "slant",
+ description = "slant glyphs",
+ initializers = {
+ base = initializeslant,
+ node = initializeslant,
+ }
+}
-function initializers.common.extend(tfmdata,value)
+local function initializeextend(tfmdata,value)
value = tonumber(value)
if not value then
value = 0
@@ -568,56 +564,90 @@ function initializers.common.extend(tfmdata,value)
elseif value < -10 then
value = -10
end
- tfmdata.extend_factor = value
+ tfmdata.parameters.extend_factor = value
end
-initializers.base.otf.extend = initializers.common.extend
-initializers.node.otf.extend = initializers.common.extend
-
-initializers.base.afm.extend = initializers.common.extend
-initializers.node.afm.extend = initializers.common.extend
-
--- historic stuff, move from font-ota
-
-local delete_node = nodes.delete
-local glyph = node.id("glyph")
-local fontdata = fonts.ids
-
-fonts.strippables = fonts.strippables or { -- just a placeholder
- [0x200C] = true, -- zwnj
- [0x200D] = true, -- zwj
+registerotffeature {
+ name = "extend",
+ description = "scale glyphs horizontally",
+ initializers = {
+ base = initializeextend,
+ node = initializeextend,
+ }
}
-local strippables = fonts.strippables
-
-local function processformatters(head,font)
- local how = fontdata[font].shared.features.formatters
- if how == nil or how == "strip" then -- nil when forced
- local current, done = head, false
- while current do
- if current.id == glyph and current.subtype<256 and current.font == font then
- local char = current.char
- if strippables[char] then
- head, current = delete_node(head,current)
- done = true
- else
- current = current.next
- end
- else
- current = current.next
- end
- end
- return head, done
- else
- return head, false
- end
-end
-
-methods.node.otf.formatters = processformatters
-methods.base.otf.formatters = processformatters
-
-fonts.otf.tables.features['formatters'] = 'Hide Formatting Characters'
-
-fonts.otf.features.register("formatters")
+registerafmfeature {
+ name = "extend",
+ description = "scale glyphs horizontally",
+ initializers = {
+ base = initializeextend,
+ node = initializeextend,
+ }
+}
-table.insert(fonts.manipulators,"formatters") -- at end
+-- -- historic stuff, move from font-ota (handled differently, typo-rep)
+--
+-- local delete_node = nodes.delete
+-- local fontdata = fonts.hashes.identifiers
+--
+-- local nodecodes = nodes.nodecodes
+-- local glyph_code = nodecodes.glyph
+--
+-- local strippables = allocate()
+-- fonts.strippables = strippables
+--
+-- strippables.joiners = table.tohash {
+-- 0x200C, -- zwnj
+-- 0x200D, -- zwj
+-- }
+--
+-- strippables.all = table.tohash {
+-- 0x000AD, 0x017B4, 0x017B5, 0x0200B, 0x0200C, 0x0200D, 0x0200E, 0x0200F, 0x0202A, 0x0202B,
+-- 0x0202C, 0x0202D, 0x0202E, 0x02060, 0x02061, 0x02062, 0x02063, 0x0206A, 0x0206B, 0x0206C,
+-- 0x0206D, 0x0206E, 0x0206F, 0x0FEFF, 0x1D173, 0x1D174, 0x1D175, 0x1D176, 0x1D177, 0x1D178,
+-- 0x1D179, 0x1D17A, 0xE0001, 0xE0020, 0xE0021, 0xE0022, 0xE0023, 0xE0024, 0xE0025, 0xE0026,
+-- 0xE0027, 0xE0028, 0xE0029, 0xE002A, 0xE002B, 0xE002C, 0xE002D, 0xE002E, 0xE002F, 0xE0030,
+-- 0xE0031, 0xE0032, 0xE0033, 0xE0034, 0xE0035, 0xE0036, 0xE0037, 0xE0038, 0xE0039, 0xE003A,
+-- 0xE003B, 0xE003C, 0xE003D, 0xE003E, 0xE003F, 0xE0040, 0xE0041, 0xE0042, 0xE0043, 0xE0044,
+-- 0xE0045, 0xE0046, 0xE0047, 0xE0048, 0xE0049, 0xE004A, 0xE004B, 0xE004C, 0xE004D, 0xE004E,
+-- 0xE004F, 0xE0050, 0xE0051, 0xE0052, 0xE0053, 0xE0054, 0xE0055, 0xE0056, 0xE0057, 0xE0058,
+-- 0xE0059, 0xE005A, 0xE005B, 0xE005C, 0xE005D, 0xE005E, 0xE005F, 0xE0060, 0xE0061, 0xE0062,
+-- 0xE0063, 0xE0064, 0xE0065, 0xE0066, 0xE0067, 0xE0068, 0xE0069, 0xE006A, 0xE006B, 0xE006C,
+-- 0xE006D, 0xE006E, 0xE006F, 0xE0070, 0xE0071, 0xE0072, 0xE0073, 0xE0074, 0xE0075, 0xE0076,
+-- 0xE0077, 0xE0078, 0xE0079, 0xE007A, 0xE007B, 0xE007C, 0xE007D, 0xE007E, 0xE007F,
+-- }
+--
+-- strippables[true] = strippables.joiners
+--
+-- local function processformatters(head,font)
+-- local subset = fontdata[font].shared.features.formatters
+-- local vector = subset and strippables[subset]
+-- if vector then
+-- local current, done = head, false
+-- while current do
+-- if current.id == glyph_code and current.subtype<256 and current.font == font then
+-- local char = current.char
+-- if vector[char] then
+-- head, current = delete_node(head,current)
+-- done = true
+-- else
+-- current = current.next
+-- end
+-- else
+-- current = current.next
+-- end
+-- end
+-- return head, done
+-- else
+-- return head, false
+-- end
+-- end
+--
+-- registerotffeature {
+-- name = "formatters",
+-- description = "hide formatting characters",
+-- methods = {
+-- base = processformatters,
+-- node = processformatters,
+-- }
+-- }
diff --git a/Master/texmf-dist/tex/context/base/font-fbk.lua b/Master/texmf-dist/tex/context/base/font-fbk.lua
index 1ad1cc781a8..6712fbe888e 100644
--- a/Master/texmf-dist/tex/context/base/font-fbk.lua
+++ b/Master/texmf-dist/tex/context/base/font-fbk.lua
@@ -7,146 +7,79 @@ if not modules then modules = { } end modules ['font-fbk'] = {
}
local cos, tan, rad, format = math.cos, math.tan, math.rad, string.format
+local utfbyte, utfchar = utf.byte, utf.char
-local trace_combining = false trackers.register("fonts.combining", function(v) trace_combining = v end)
+local trace_combining = false trackers.register("fonts.combining", function(v) trace_combining = v end)
+local trace_combining_all = false trackers.register("fonts.combining.all", function(v) trace_combining_all = v end)
---[[ldx--
-<p>This is very experimental code!</p>
---ldx]]--
-
-fonts.fallbacks = fonts.fallbacks or { }
-
-local vf = fonts.vf
-local tfm = fonts.tfm
-
-vf.aux.combine.commands["enable-tracing"] = function(g,v)
- trace_combining = true
-end
-
-vf.aux.combine.commands["disable-tracing"] = function(g,v)
- trace_combining = false
-end
-
-vf.aux.combine.commands["set-tracing"] = function(g,v)
- if v[2] == nil then
- trace_combining = true
- else
- trace_combining = v[2]
- end
-end
+local force_combining = false -- just for demo purposes (see mk)
-function vf.aux.combine.initialize_trace()
- if trace_combining then
- return "special", "pdf: .8 0 0 rg .8 0 0 RG", "pdf: 0 .8 0 rg 0 .8 0 RG", "pdf: 0 0 .8 rg 0 0 .8 RG", "pdf: 0 g 0 G"
- else
- return "comment", "", "", "", ""
- end
-end
+trackers.register("fonts.composing", "fonts.combining")
-vf.aux.combine.force_fallback = false
+local report_combining = logs.reporter("fonts","combining")
-vf.aux.combine.commands["fake-character"] = function(g,v) -- g, nr, fallback_id
- local index, fallback = v[2], v[3]
- if vf.aux.combine.force_fallback or not g.characters[index] then
- if fonts.fallbacks[fallback] then
- g.characters[index], g.descriptions[index] = fonts.fallbacks[fallback](g)
- end
- end
-end
+local allocate = utilities.storage.allocate
-fonts.fallbacks['textcent'] = function (g)
- local c = ("c"):byte()
- local t = table.fastcopy(g.characters[c])
- local a = - tan(rad(g.italicangle or 0))
- local special, red, green, blue, black = vf.aux.combine.initialize_trace()
- local quad = g.parameters.quad
- if a == 0 then
- t.commands = {
- {"push"}, {"slot", 1, c}, {"pop"},
- {"right", .5*t.width},
- {"down", .2*t.height},
- {special, green},
- {"rule", 1.4*t.height, .02*quad},
- {special, black},
- }
- else
- t.commands = {
- {"push"},
- {"right", .5*t.width-.025*quad},
- {"down", .2*t.height},
- {"special",format("pdf: q 1 0 %s 1 0 0 cm",a)},
- {special, green},
- {"rule", 1.4*t.height, .025*quad},
- {special, black},
- {"special","pdf: Q"},
- {"pop"},
- {"slot", 1, c} -- last else problems with cm
- }
- end
- -- somehow the width is messed up now
- -- todo: set height
- t.height = 1.2*t.height
- t.depth = 0.2*t.height
- g.virtualized = true
- local d = g.descriptions
- return t, d and d[c]
-end
+--[[ldx--
+<p>This is very experimental code!</p>
+--ldx]]--
-fonts.fallbacks['texteuro'] = function (g)
- local c = ("C"):byte()
- local t = table.fastcopy(g.characters[c])
- local d = cos(rad(90+(g.italicangle)))
- local special, red, green, blue, black = vf.aux.combine.initialize_trace()
- local quad = g.parameters.quad
- t.width = 1.05*t.width
- t.commands = {
- {"right", .05*t.width},
- {"push"}, {"slot", 1, c}, {"pop"},
- {"right", .5*t.width*d},
- {"down", -.5*t.height},
- {special, green},
- {"rule", .05*quad, .4*quad},
- {special, black},
- }
- g.virtualized = true
- return t, g.descriptions[c]
-end
+local fonts = fonts
+local handlers = fonts.handlers
+local constructors = fonts.constructors
+local vf = handlers.vf
+local commands = vf.combiner.commands
--- maybe store llx etc instead of bbox in tfm blob / more efficient
+local otffeatures = constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
-vf.aux.combine.force_composed = false
+local afmfeatures = constructors.newfeatures("afm")
+local registerafmfeature = afmfeatures.register
-local push, pop = { "push" }, { "pop" }
+local unicodecharacters = characters.data
+local unicodefallbacks = characters.fallbacks
-local cache = { } -- we could make these weak
+local push = vf.predefined.push
+local pop = vf.predefined.pop
+local force_composed = false
+local cache = { } -- we could make these weak
+local fraction = 0.15 -- 30 units for lucida
-function vf.aux.compose_characters(g) -- todo: scaling depends on call location
+local function composecharacters(tfmdata)
-- this assumes that slot 1 is self, there will be a proper self some day
- local chars, descs = g.characters, g.descriptions
- local X = ("X"):byte()
- local xchar = chars[X]
- local xdesc = descs[X]
- if xchar and xdesc then
- local scale = g.factor or 1
- local cap_lly = scale*xdesc.boundingbox[4]
- local ita_cor = cos(rad(90+(g.italicangle or 0)))
- local force = vf.aux.combine.force_composed
- local fallbacks = characters.fallbacks
- local special, red, green, blue, black
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local parameters = tfmdata.parameters
+ local properties = tfmdata.properties
+ local Xdesc = descriptions[utfbyte("X")]
+ local xdesc = descriptions[utfbyte("x")]
+ if Xdesc and xdesc then
+ local scale = parameters.factor or 1
+ local deltaxheight = scale * (Xdesc.boundingbox[4] - xdesc.boundingbox[4])
+ local extraxheight = fraction * deltaxheight -- maybe use compose value
+ local italicfactor = parameters.italicfactor or 0
+ local vfspecials = backends.tables.vfspecials --brr
+ local red, green, blue, black
if trace_combining then
- special, red, green, blue, black = vf.aux.combine.initialize_trace()
- red, green, blue, black = { special, red }, { special, green }, { special, blue }, { special, black }
+ red = vfspecials.red
+ green = vfspecials.green
+ blue = vfspecials.blue
+ black = vfspecials.black
+ end
+ local compose = fonts.goodies.getcompositions(tfmdata)
+ if compose and trace_combining then
+ report_combining("using compose information from goodies file")
end
local done = false
- for i,c in next, characters.data do
- if force or not chars[i] then
+ for i,c in next, unicodecharacters do -- loop over all characters ... not that efficient but a specials hash takes memory
+ if force_combining or not characters[i] then
local s = c.specials
if s and s[1] == 'char' then
local chr = s[2]
- local charschr = chars[chr]
+ local charschr = characters[chr]
if charschr then
local cc = c.category
- if cc == 'll' or cc == 'lu' or cc == 'lt' then
+ if cc == 'll' or cc == 'lu' or cc == 'lt' then -- characters.is_letter[cc]
local acc = s[3]
local t = { }
for k, v in next, charschr do
@@ -154,163 +87,172 @@ function vf.aux.compose_characters(g) -- todo: scaling depends on call location
t[k] = v
end
end
- local charsacc = chars[acc]
---~ local ca = charsacc.category
---~ if ca == "mn" then
---~ -- mark nonspacing
---~ elseif ca == "ms" then
---~ -- mark spacing combining
---~ elseif ca == "me" then
---~ -- mark enclosing
---~ else
- if not charsacc then
- acc = fallbacks[acc]
- charsacc = acc and chars[acc]
+ local charsacc = characters[acc]
+ --~ local ca = charsacc.category
+ --~ if ca == "mn" then
+ --~ -- mark nonspacing
+ --~ elseif ca == "ms" then
+ --~ -- mark spacing combining
+ --~ elseif ca == "me" then
+ --~ -- mark enclosing
+ --~ else
+ if not charsacc then -- fallback accents
+ acc = unicodefallbacks[acc]
+ charsacc = acc and characters[acc]
+ end
+ local chr_t = cache[chr]
+ if not chr_t then
+ chr_t = {"slot", 1, chr}
+ cache[chr] = chr_t
end
if charsacc then
- local chr_t = cache[chr]
- if not cht_t then
- chr_t = {"slot", 1, chr}
- cache[chr] = chr_t
+ if trace_combining_all then
+ report_combining("%s (U+%05X) = %s (U+%05X) + %s (U+%05X)",utfchar(i),i,utfchar(chr),chr,utfchar(acc),acc)
end
local acc_t = cache[acc]
if not acc_t then
acc_t = {"slot", 1, acc}
cache[acc] = acc_t
end
- local cb = descs[chr].boundingbox
- local ab = descs[acc].boundingbox
+ local cb = descriptions[chr].boundingbox
+ local ab = descriptions[acc].boundingbox
+ -- todo: adapt height
if cb and ab then
-- can be sped up for scale == 1
local c_llx, c_lly, c_urx, c_ury = scale*cb[1], scale*cb[2], scale*cb[3], scale*cb[4]
local a_llx, a_lly, a_urx, a_ury = scale*ab[1], scale*ab[2], scale*ab[3], scale*ab[4]
local dx = (c_urx - a_urx - a_llx + c_llx)/2
- local dd = (c_urx - c_llx)*ita_cor
+ local dd = (c_urx - c_llx)*italicfactor
if a_ury < 0 then
if trace_combining then
- t.commands = {
- push,
- {"right", dx-dd},
- red,
- acc_t,
- black,
- pop,
- chr_t,
- }
+ t.commands = { push, {"right", dx-dd}, red, acc_t, black, pop, chr_t }
+ else
+ t.commands = { push, {"right", dx-dd}, acc_t, pop, chr_t }
+ end
+ elseif c_ury > a_lly then -- messy test
+ local dy
+ if compose then
+ -- experimental: we could use sx but all that testing
+ -- takes time and code
+ dy = compose[i]
+ if dy then
+ dy = dy.DY
+ end
+ if not dy then
+ dy = compose[acc]
+ if dy then
+ dy = dy and dy.DY
+ end
+ end
+ if not dy then
+ dy = compose.DY
+ end
+ if not dy then
+ dy = - deltaxheight + extraxheight
+ elseif dy > -1.5 and dy < 1.5 then
+ -- we assume a fraction of (percentage)
+ dy = - dy * deltaxheight
+ else
+ -- we assume fontunits (value smaller than 2 make no sense)
+ dy = - dy * scale
+ end
else
- t.commands = {
- push,
- {"right", dx-dd},
- acc_t,
- pop,
- chr_t,
- }
+ dy = - deltaxheight + extraxheight
end
- elseif c_ury > a_lly then
- local dy = cap_lly-a_lly
if trace_combining then
- t.commands = {
- push,
- {"right", dx+dd},
- {"down", -dy},
- green,
- acc_t,
- black,
- pop,
- chr_t,
- }
+ t.commands = { push, {"right", dx+dd}, {"down", dy}, green, acc_t, black, pop, chr_t }
else
- t.commands = {
- push,
- {"right", dx+dd},
- {"down", -dy},
- acc_t,
- pop,
- chr_t,
- }
+ t.commands = { push, {"right", dx+dd}, {"down", dy}, acc_t, pop, chr_t }
end
else
if trace_combining then
- t.commands = {
- {"push"},
- {"right", dx+dd},
- blue,
- acc_t,
- black,
- {"pop"},
- chr_t,
- }
+ t.commands = { push, {"right", dx+dd}, blue, acc_t, black, pop, chr_t }
else
- t.commands = {
- {"push"},
- {"right", dx+dd},
- acc_t,
- {"pop"},
- chr_t,
- }
+ t.commands = { push, {"right", dx+dd}, acc_t, pop, chr_t }
end
end
- done = true
+ else
+ t.commands = { chr_t } -- else index mess
+ end
+ else
+ if trace_combining_all then
+ report_combining("%s (U+%05X) = %s (U+%05X) (simplified)",utfchar(i),i,utfchar(chr),chr)
end
+ t.commands = { chr_t } -- else index mess
end
- chars[i] = t
+ done = true
+ characters[i] = t
local d = { }
- for k, v in next, descs[chr] do
+ for k, v in next, descriptions[chr] do
d[k] = v
end
- d.name = c.adobename or "unknown"
- -- d.unicode = i
- descs[i] = d
+ descriptions[i] = d
end
end
end
end
end
if done then
- g.virtualized = true
+ properties.virtualized = true
end
end
end
-vf.aux.combine.commands["complete-composed-characters"] = function(g,v)
- vf.aux.compose_characters(g)
+registerotffeature {
+ name = "compose",
+ description = "additional composed characters",
+ manipulators = {
+ base = composecharacters,
+ node = composecharacters,
+ }
+}
+
+registerafmfeature {
+ name = "compose",
+ description = "additional composed characters",
+ manipulators = {
+ base = composecharacters,
+ node = composecharacters,
+ }
+}
+
+vf.helpers.composecharacters = composecharacters
+
+-- This installs the builder into the regular virtual font builder,
+-- which only makes sense as demo.
+
+commands["compose.trace.enable"] = function()
+ trace_combining = true
end
---~ {'special', 'pdf: q ' .. s .. ' 0 0 '.. s .. ' 0 0 cm'},
---~ {'special', 'pdf: q 1 0 0 1 ' .. -w .. ' ' .. -h .. ' cm'},
---~ -- {'special', 'pdf: /Fm\XX\space Do'},
---~ {'special', 'pdf: Q'},
---~ {'special', 'pdf: Q'},
+commands["compose.trace.disable"] = function()
+ trace_combining = false
+end
--- for documentation purposes we provide:
+commands["compose.force.enable"] = function()
+ force_combining = true
+end
-fonts.define.methods.install("fallback", { -- todo: auto-fallback with loop over data.characters
- { "fake-character", 0x00A2, 'textcent' },
- { "fake-character", 0x20AC, 'texteuro' }
-})
+commands["compose.force.disable"] = function()
+ force_combining = false
+end
-vf.aux.combine.commands["enable-force"] = function(g,v)
- vf.aux.combine.force_composed = true
- vf.aux.combine.force_fallback = true
+commands["compose.trace.set"] = function(g,v)
+ if v[2] == nil then
+ trace_combining = true
+ else
+ trace_combining = v[2]
+ end
end
-vf.aux.combine.commands["disable-force"] = function(g,v)
- vf.aux.combine.force_composed = false
- vf.aux.combine.force_fallback = false
+
+commands["compose.apply"] = function(g,v)
+ composecharacters(g)
end
-fonts.define.methods.install("demo-2", {
- { "enable-tracing" },
- { "enable-force" },
- { "initialize" },
- { "include-method", "fallback" },
- { "complete-composed-characters" },
- { "disable-tracing" },
- { "disable-force" },
-})
+-- vf builder
-fonts.define.methods.install("demo-3", {
- { "enable-tracing" },
- { "initialize" },
- { "complete-composed-characters" },
- { "disable-tracing" },
-})
+-- {'special', 'pdf: q ' .. s .. ' 0 0 '.. s .. ' 0 0 cm'},
+-- {'special', 'pdf: q 1 0 0 1 ' .. -w .. ' ' .. -h .. ' cm'},
+-- {'special', 'pdf: /Fm\XX\space Do'},
+-- {'special', 'pdf: Q'},
+-- {'special', 'pdf: Q'},
diff --git a/Master/texmf-dist/tex/context/base/font-gds.lua b/Master/texmf-dist/tex/context/base/font-gds.lua
index e3db8c816f8..a5c60d252ab 100644
--- a/Master/texmf-dist/tex/context/base/font-gds.lua
+++ b/Master/texmf-dist/tex/context/base/font-gds.lua
@@ -6,29 +6,47 @@ if not modules then modules = { } end modules ['font-gds'] = {
license = "see context related readme files"
}
+-- depends on ctx
+
local type, next = type, next
-local gmatch = string.gmatch
+local gmatch, format = string.gmatch, string.format
-local trace_goodies = false trackers.register("fonts.goodies", function(v) trace_goodies = v end)
+local fonts, nodes, attributes, node = fonts, nodes, attributes, node
--- goodies=name,colorscheme=,featureset=
---
--- goodies=auto
+local trace_goodies = false trackers.register("fonts.goodies", function(v) trace_goodies = v end)
+local report_fonts = logs.reporter("fonts","goodies")
+
+local allocate = utilities.storage.allocate
+
+local otf = fonts.handlers.otf
+local addotffeature = otf.enhancers.addfeature
+
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
--- goodies
+local afmfeatures = fonts.constructors.newfeatures("afm")
+local registerafmfeature = afmfeatures.register
-fonts.goodies = fonts.goodies or { }
-fonts.goodies.data = fonts.goodies.data or { }
-fonts.goodies.list = fonts.goodies.list or { }
+local tfmfeatures = fonts.constructors.newfeatures("tfm")
+local registertfmfeature = tfmfeatures.register
-local data = fonts.goodies.data
-local list = fonts.goodies.list
+local fontgoodies = { }
+fonts.goodies = fontgoodies
-function fonts.goodies.report(what,trace,goodies)
+local typefaces = allocate()
+fonts.typefaces = typefaces
+
+local data = allocate()
+fontgoodies.data = fontgoodies.data
+
+local list = { }
+fontgoodies.list = list -- no allocate as we want to see what is there
+
+function fontgoodies.report(what,trace,goodies)
if trace_goodies or trace then
local whatever = goodies[what]
if whatever then
- logs.report("fonts", "goodie '%s' found in '%s'",what,goodies.name)
+ report_fonts("goodie '%s' found in '%s'",what,goodies.name)
end
end
end
@@ -38,20 +56,20 @@ local function getgoodies(filename) -- maybe a merge is better
if goodies ~= nil then
-- found or tagged unfound
elseif type(filename) == "string" then
- local fullname = resolvers.find_file(file.addsuffix(filename,"lfg")) or "" -- prefered suffix
+ local fullname = resolvers.findfile(file.addsuffix(filename,"lfg")) or "" -- prefered suffix
if fullname == "" then
- fullname = resolvers.find_file(file.addsuffix(filename,"lua")) or "" -- fallback suffix
+ fullname = resolvers.findfile(file.addsuffix(filename,"lua")) or "" -- fallback suffix
end
if fullname == "" then
- logs.report("fonts", "goodie file '%s.lfg' is not found",filename)
+ report_fonts("goodie file '%s.lfg' is not found",filename)
data[filename] = false -- signal for not found
else
goodies = dofile(fullname) or false
if not goodies then
- logs.report("fonts", "goodie file '%s' is invalid",fullname)
+ report_fonts("goodie file '%s' is invalid",fullname)
return nil
elseif trace_goodies then
- logs.report("fonts", "goodie file '%s' is loaded",fullname)
+ report_fonts("goodie file '%s' is loaded",fullname)
end
goodies.name = goodies.name or "no name"
for name, fnc in next, list do
@@ -64,18 +82,20 @@ local function getgoodies(filename) -- maybe a merge is better
return goodies
end
-function fonts.goodies.register(name,fnc)
+function fontgoodies.register(name,fnc) -- will be a proper sequencer
list[name] = fnc
end
-fonts.goodies.get = getgoodies
+fontgoodies.get = getgoodies
-- register goodies file
-local preset_context = fonts.define.specify.preset_context
-
-function fonts.initializers.common.goodies(tfmdata,value)
- local goodies = tfmdata.goodies or { } -- future versions might store goodies in the cached instance
+local function setgoodies(tfmdata,value)
+ local goodies = tfmdata.goodies
+ if not goodies then -- actually an error
+ goodies = { }
+ tfmdata.goodies = goodies
+ end
for filename in gmatch(value,"[^, ]+") do
-- we need to check for duplicates
local ok = getgoodies(filename)
@@ -83,26 +103,27 @@ function fonts.initializers.common.goodies(tfmdata,value)
goodies[#goodies+1] = ok
end
end
- tfmdata.goodies = goodies -- shared ?
end
+-- this will be split into good-* files and this file might become good-ini.lua
+
-- featuresets
-local function flattened(t,tt)
+local function flattenedfeatures(t,tt)
-- first set value dominates
local tt = tt or { }
for i=1,#t do
local ti = t[i]
if type(ti) == "table" then
- flattened(ti,tt)
+ flattenedfeatures(ti,tt)
elseif tt[ti] == nil then
tt[ti] = true
end
end
for k, v in next, t do
- if type(k) ~= "number" then
+ if type(k) ~= "number" then -- not tonumber(k)
if type(v) == "table" then
- flattened(v,tt)
+ flattenedfeatures(v,tt)
elseif tt[k] == nil then
tt[k] = v
end
@@ -111,16 +132,16 @@ local function flattened(t,tt)
return tt
end
-fonts.flattened_features = flattened
+-- fonts.features.flattened = flattenedfeatures
-function fonts.goodies.prepare_features(goodies,name,set)
+function fontgoodies.prepare_features(goodies,name,set)
if set then
- local ff = fonts.flattened_features(set)
+ local ff = flattenedfeatures(set)
local fullname = goodies.name .. "::" .. name
- local n, s = preset_context(fullname,"",ff)
+ local n, s = fonts.specifiers.presetcontext(fullname,"",ff)
goodies.featuresets[name] = s -- set
if trace_goodies then
- logs.report("fonts", "feature set '%s' gets number %s and name '%s'",name,n,fullname)
+ report_fonts("feature set '%s' gets number %s and name '%s'",name,n,fullname)
end
return n
end
@@ -131,20 +152,21 @@ local function initialize(goodies,tfmdata)
local goodiesname = goodies.name
if featuresets then
if trace_goodies then
- logs.report("fonts", "checking featuresets in '%s'",goodies.name)
+ report_fonts("checking featuresets in '%s'",goodies.name)
end
for name, set in next, featuresets do
- fonts.goodies.prepare_features(goodies,name,set)
+ fontgoodies.prepare_features(goodies,name,set)
end
end
end
-fonts.goodies.register("featureset",initialize)
+fontgoodies.register("featureset",initialize)
-function fonts.initializers.common.featureset(tfmdata,set)
+local function setfeatureset(tfmdata,set)
local goodies = tfmdata.goodies -- shared ?
if goodies then
local features = tfmdata.shared.features
+ local properties = tfmdata.properties
local what
for i=1,#goodies do
-- last one counts
@@ -157,19 +179,69 @@ function fonts.initializers.common.featureset(tfmdata,set)
features[feature] = value
end
end
- tfmdata.mode = features.mode or tfmdata.mode
+ properties.mode = features.mode or properties.mode
end
end
end
--- colorschemes
+-- postprocessors (we could hash processor and share code)
+
+local function setpostprocessor(tfmdata,processor)
+ local goodies = tfmdata.goodies
+ if goodies and type(processor) == "string" then
+ local found = { }
+ local asked = utilities.parsers.settings_to_array(processor)
+ for i=1,#goodies do
+ local g = goodies[i]
+ local p = g.postprocessors
+ if p then
+ for i=1,#asked do
+ local a = asked[i]
+ local f = p[a]
+ if type(f) == "function" then
+ found[a] = f
+ end
+ end
+ end
+ end
+ local postprocessors = { }
+ for i=1,#asked do
+ local a = asked[i]
+ local f = found[a]
+ if f then
+ postprocessors[#postprocessors+1] = f
+ end
+ end
+ if #postprocessors > 0 then
+ tfmdata.postprocessors = postprocessors
+ end
+ end
+end
+
+-- fontgoodies.postprocessors = fontgoodies.postprocessors or { }
+-- local postprocessors = fontgoodies.postprocessors
+--
+-- function postprocessors.apply(tfmdata)
+-- local postprocessors = tfmdata.postprocessors
+-- if postprocessors then
+-- for i=1,#postprocessors do
+-- postprocessors[i](tfmdata)
+-- end
+-- end
+-- end
+--
+-- function definers.applypostprocessors(tfmdata)
+-- fonts.goodies.postprocessors.apply(tfmdata) -- only here
+-- return tfmdata
+-- end
-fonts.goodies.colorschemes = fonts.goodies.colorschemes or { }
-fonts.goodies.colorschemes.data = fonts.goodies.colorschemes.data or { }
+-- colorschemes
-local colorschemes = fonts.goodies.colorschemes
+local colorschemes = { }
+fontgoodies.colorschemes = colorschemes
+colorschemes.data = { }
-function fonts.initializers.common.colorscheme(tfmdata,scheme)
+local function setcolorscheme(tfmdata,scheme)
if type(scheme) == "string" then
local goodies = tfmdata.goodies
-- todo : check for already defined in shared
@@ -183,7 +255,7 @@ function fonts.initializers.common.colorscheme(tfmdata,scheme)
if what then
-- this is font bound but we can share them if needed
-- just as we could hash the conversions (per font)
- local hash, reverse = tfmdata.luatex.unicodes, { }
+ local hash, reverse = tfmdata.resources.unicodes, { }
for i=1,#what do
local w = what[i]
for j=1,#w do
@@ -194,94 +266,237 @@ function fonts.initializers.common.colorscheme(tfmdata,scheme)
end
end
end
- tfmdata.colorscheme = reverse
+ tfmdata.properties.colorscheme = reverse
return
end
end
end
- tfmdata.colorscheme = false
+ tfmdata.properties.colorscheme = false
end
-local fontdata = fonts.ids
-local fcs = fonts.color.set
+local fontdata = fonts.hashes.identifiers
+local setnodecolor = nodes.tracers.colors.set
local has_attribute = node.has_attribute
local traverse_id = node.traverse_id
local a_colorscheme = attributes.private('colorscheme')
local glyph = node.id("glyph")
-function fonts.goodies.colorschemes.coloring(head)
+function colorschemes.coloring(head)
local lastfont, lastscheme
+ local done = false
for n in traverse_id(glyph,head) do
local a = has_attribute(n,a_colorscheme)
if a then
local f = n.font
if f ~= lastfont then
- lastscheme, lastfont = fontdata[f].colorscheme, f
+ lastscheme, lastfont = fontdata[f].properties.colorscheme, f
end
if lastscheme then
local sc = lastscheme[n.char]
if sc then
- fcs(n,"colorscheme:"..a..":"..sc) -- slow
+ done = true
+ setnodecolor(n,"colorscheme:"..a..":"..sc) -- slow
end
end
end
end
+ return head, done
+end
+
+function colorschemes.enable()
+ nodes.tasks.appendaction("processors","fonts","fonts.goodies.colorschemes.coloring")
+ function colorschemes.enable() end
end
-function fonts.goodies.colorschemes.enable()
- tasks.appendaction("processors","fonts","fonts.goodies.colorschemes.coloring")
- function fonts.goodies.colorschemes.enable() end
+local function setextrafeatures(tfmdata)
+ local goodies = tfmdata.goodies
+ if goodies then
+ for i=1,#goodies do
+ local g = goodies[i]
+ local f = g.features
+ if f then
+ for feature, specification in next, f do
+ addotffeature(tfmdata.shared.rawdata,feature,specification)
+ registerotffeature {
+ name = feature,
+ description = format("extra: %s",feature)
+ }
+ end
+ end
+ end
+ end
end
--- installation (collected to keep the overview)
+-- installation (collected to keep the overview) -- also for type 1
-fonts.otf.tables.features['goodies'] = 'Goodies on top of built in features'
-fonts.otf.tables.features['featurset'] = 'Goodie Feature Set'
-fonts.otf.tables.features['colorscheme'] = 'Goodie Color Scheme'
+registerotffeature {
+ name = "goodies",
+ description = "goodies on top of built in features",
+ initializers = {
+ position = 1,
+ base = setgoodies,
+ node = setgoodies,
+ }
+}
-fonts.otf.features.register('goodies')
-fonts.otf.features.register('featureset')
-fonts.otf.features.register('colorscheme')
+registerotffeature {
+ name = "extrafeatures",
+ description = "extra features",
+ default = true,
+ initializers = {
+ position = 2,
+ base = setextrafeatures,
+ node = setextrafeatures,
+ }
+}
+
+registerotffeature {
+ name = "featureset",
+ description = "goodie feature set",
+ initializers = {
+ position = 3,
+ base = setfeatureset,
+ node = setfeatureset,
+ }
+}
+
+registerotffeature {
+ name = "colorscheme",
+ description = "goodie color scheme",
+ initializers = {
+ base = setcolorscheme,
+ node = setcolorscheme,
+ }
+}
+
+registerotffeature {
+ name = "postprocessor",
+ description = "goodie postprocessor",
+ initializers = {
+ base = setpostprocessor,
+ node = setpostprocessor,
+ }
+}
-table.insert(fonts.triggers, 1, "goodies")
-table.insert(fonts.triggers, 2, "featureset") -- insert after
-table.insert(fonts.triggers, "colorscheme")
+-- afm
-fonts.initializers.base.otf.goodies = fonts.initializers.common.goodies
-fonts.initializers.node.otf.goodies = fonts.initializers.common.goodies
+registerafmfeature {
+ name = "goodies",
+ description = "goodies on top of built in features",
+ initializers = {
+ position = 1,
+ base = setgoodies,
+ node = setgoodies,
+ }
+}
-fonts.initializers.base.otf.featureset = fonts.initializers.common.featureset
-fonts.initializers.node.otf.featureset = fonts.initializers.common.featureset
+-- tfm
-fonts.initializers.base.otf.colorscheme = fonts.initializers.common.colorscheme
-fonts.initializers.node.otf.colorscheme = fonts.initializers.common.colorscheme
+registertfmfeature {
+ name = "goodies",
+ description = "goodies on top of built in features",
+ initializers = {
+ position = 1,
+ base = setgoodies,
+ node = setgoodies,
+ }
+}
-- experiment, we have to load the definitions immediately as they precede
-- the definition so they need to be initialized in the typescript
local function initialize(goodies)
local mathgoodies = goodies.mathematics
- local virtuals = mathgoodies and mathgoodies.virtuals
- local mapfiles = mathgoodies and mathgoodies.mapfiles
- local maplines = mathgoodies and mathgoodies.maplines
- if virtuals then
- for name, specification in next, virtuals do
- mathematics.make_font(name,specification)
+ if mathgoodies then
+ local virtuals = mathgoodies.virtuals
+ local mapfiles = mathgoodies.mapfiles
+ local maplines = mathgoodies.maplines
+ if virtuals then
+ for name, specification in next, virtuals do
+ -- beware, they are all constructed
+ mathematics.makefont(name,specification,goodies)
+ end
+ end
+ if mapfiles then
+ for i=1,#mapfiles do
+ fonts.mappings.loadfile(mapfiles[i]) -- todo: backend function
+ end
end
+ if maplines then
+ for i=1,#maplines do
+ fonts.mappings.loadline(maplines[i]) -- todo: backend function
+ end
+ end
+ end
+end
+
+fontgoodies.register("mathematics", initialize)
+
+-- the following takes care of explicit file specifications
+--
+-- files = {
+-- name = "antykwapoltawskiego",
+-- list = {
+-- ["AntPoltLtCond-Regular.otf"] = {
+-- -- name = "antykwapoltawskiego",
+-- style = "regular",
+-- weight = "light",
+-- width = "condensed",
+-- },
+-- },
+-- }
+
+local function initialize(goodies)
+ local files = goodies.files
+ if files then
+ fonts.names.register(files)
end
- if mapfiles then
- for i=1,#mapfiles do
- fonts.map.loadfile(mapfiles[i]) -- todo: backend function
+end
+
+fontgoodies.register("files", initialize)
+
+-- some day we will have a define command and then we can also do some
+-- proper tracing
+--
+-- fonts.typefaces["antykwapoltawskiego-condensed"] = {
+-- shortcut = "rm",
+-- shape = "serif",
+-- fontname = "antykwapoltawskiego",
+-- normalweight = "light",
+-- boldweight = "medium",
+-- width = "condensed",
+-- size = "default",
+-- features = "default",
+-- }
+
+local function initialize(goodies)
+ local typefaces = goodies.typefaces
+ if typefaces then
+ local ft = fonts.typefaces
+ for k, v in next, typefaces do
+ ft[k] = v
end
end
- if maplines then
- for i=1,#maplines do
- fonts.map.loadline(maplines[i]) -- todo: backend function
+end
+
+fontgoodies.register("typefaces", initialize)
+
+local compositions = { }
+
+function fontgoodies.getcompositions(tfmdata)
+ return compositions[file.nameonly(tfmdata.properties.filename or "")]
+end
+
+local function initialize(goodies)
+ local gc = goodies.compositions
+ if gc then
+ for k, v in next, gc do
+ compositions[k] = v
end
end
end
-fonts.goodies.register("mathematics", initialize)
+fontgoodies.register("compositions", initialize)
-- The following file (husayni.lfg) is the experimental setup that we used
-- for Idris font. For the moment we don't store this in the cache and quite
diff --git a/Master/texmf-dist/tex/context/base/font-gds.mkiv b/Master/texmf-dist/tex/context/base/font-gds.mkiv
index e36116283e0..083cd9128ad 100644
--- a/Master/texmf-dist/tex/context/base/font-gds.mkiv
+++ b/Master/texmf-dist/tex/context/base/font-gds.mkiv
@@ -13,14 +13,13 @@
\writestatus{loading}{ConTeXt Font Support / Colorschemes}
-% \registerctxluafile{font-gds}{1.001}
+%registerctxluafile{font-gds}{1.001}
\unprotect
\def\loadfontgoodies[#1]%
{\ctxlua{fonts.goodies.get("#1")}}
-
% this will become colorgroups and move to font-col or so
\definecolor[colorscheme:1:1][s=.75]
@@ -39,7 +38,7 @@
\definecolor[colorscheme:2:2][m=.75]
\definecolor[colorscheme:2:1][y=.75]
-\definesystemattribute[colorscheme] \chardef\colorschemeattribute \dogetattributeid{colorscheme}
+\definesystemattribute[colorscheme][public]
\def\setfontcolorscheme
{\ctxlua{fonts.goodies.colorschemes.enable()}%
diff --git a/Master/texmf-dist/tex/context/base/font-ini.lua b/Master/texmf-dist/tex/context/base/font-ini.lua
index a8a311e1875..8eeba0ce7f6 100644
--- a/Master/texmf-dist/tex/context/base/font-ini.lua
+++ b/Master/texmf-dist/tex/context/base/font-ini.lua
@@ -6,90 +6,33 @@ if not modules then modules = { } end modules ['font-ini'] = {
license = "see context related readme files"
}
+-- basemethods -> can also be in list
+-- presetcontext -> defaults
+-- hashfeatures -> ctx version
+
--[[ldx--
<p>Not much is happening here.</p>
--ldx]]--
-local utf = unicode.utf8
-local format, serialize = string.format, table.serialize
-local write_nl = texio.write_nl
+local lower = string.lower
+local allocate, mark = utilities.storage.allocate, utilities.storage.mark
-if not fontloader then fontloader = fontforge end
+local report_defining = logs.reporter("fonts","defining")
fontloader.totable = fontloader.to_table
--- vtf comes first
--- fix comes last
-
-fonts = fonts or { }
-
-fonts.ids = fonts.ids or { } fonts.identifiers = fonts.ids -- aka fontdata
-fonts.chr = fonts.chr or { } fonts.characters = fonts.chr -- aka chardata
-fonts.qua = fonts.qua or { } fonts.quads = fonts.qua -- aka quaddata
-
-fonts.tfm = fonts.tfm or { }
-
-fonts.mode = 'base'
-fonts.private = 0xF0000 -- 0x10FFFF
-fonts.verbose = false -- more verbose cache tables
-
-fonts.ids[0] = { -- nullfont
- characters = { },
- descriptions = { },
- name = "nullfont",
-}
-
-fonts.chr[0] = { }
-
-fonts.methods = fonts.methods or {
- base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
- node = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
-}
-
-fonts.initializers = fonts.initializers or {
- base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
- node = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } }
-}
-
-fonts.triggers = fonts.triggers or {
- 'mode',
- 'language',
- 'script',
- 'strategy',
-}
-
-fonts.processors = fonts.processors or {
-}
-
-fonts.manipulators = fonts.manipulators or {
-}
-
-fonts.define = fonts.define or { }
-fonts.define.specify = fonts.define.specify or { }
-fonts.define.specify.synonyms = fonts.define.specify.synonyms or { }
-
--- tracing
-
-if not fonts.color then
-
- fonts.color = {
- set = function() end,
- reset = function() end,
- }
-
-end
+fonts = fonts or { } -- already defined in context
+local fonts = fonts
--- format identification
+-- some of these might move to where they are used first:
-fonts.formats = { }
+fonts.hashes = { identifiers = allocate() }
+fonts.analyzers = { } -- not needed here
+fonts.readers = { }
+fonts.tables = { }
+fonts.definers = { methods = { } }
+fonts.specifiers = fonts.specifiers or { } -- in format !
+fonts.loggers = { register = function() end }
+fonts.helpers = { }
-function fonts.fontformat(filename,default)
- local extname = string.lower(file.extname(filename))
- local format = fonts.formats[extname]
- if format then
- return format
- else
- logs.report("fonts define","unable to determine font format for '%s'",filename)
- return default
- end
-end
+fonts.tracers = { } -- for the moment till we have move to moduledata
diff --git a/Master/texmf-dist/tex/context/base/font-ini.mkii b/Master/texmf-dist/tex/context/base/font-ini.mkii
index 89fbb5d0720..7b84125fa5a 100644
--- a/Master/texmf-dist/tex/context/base/font-ini.mkii
+++ b/Master/texmf-dist/tex/context/base/font-ini.mkii
@@ -639,7 +639,7 @@
% \def\normalmbox
% {\dowithnextboxcontent\mf\flushnextbox\normalhbox}
-\def\mbox
+\def\mbox % we cannot add \dontleavehmode ... else no \setbox0\mbox possible
{\ifmmode\normalmbox\else\normalhbox\fi}
\def\enablembox
@@ -1157,8 +1157,6 @@
\let\fontfile\s!unknown
-\ifx\checkfontfilename\undefined \let\checkfontfilename\relax \fi
-
% \definefontsynonym
% [blabla]
% [name:Latin Modern Something]
@@ -1194,88 +1192,6 @@
\edef\checkedfontfile{\!!stringb}%
\fi\fi\fi}
-% \definefontfeature[default] [liga=yes,texligatures=yes,texquotes=yes]
-% \definefontfeature[default-caps][liga=yes,texligatures=yes,texquotes=yes,smcp=yes,script=latn]
-%
-% \starttypescript [serif] [palatino-nova-regular] [name]
-% \definefontsynonym[Serif] [palatinonova-regular][features=default]
-% \definefontsynonym[SerifCaps][palatinonova-regular][features=default-caps] % also sets Serif
-% \stoptypescript
-%
-% \starttypescript [serif] [palatino-nova-regular] [name]
-% \definefontsynonym[Serif] [palatinonova-regular*default]
-% \definefontsynonym[SerifCaps] [palatinonova-regular*default-caps]
-% \stoptypescript
-
-% \definetypeface[mainface][rm][serif][palatino-nova-regular][default] \setupbodyfont[mainface]
-%
-% \starttext
-% ``Test'' -- --- ff fi fl \sc ``Test'' -- --- ff fi fl
-% \stoptext
-
-% \starttext
-% \definefont
-% [blabla]
-% [name:Latin Modern Something]
-% \definefont
-% [blabla]
-% [file:texnansi-lmr10]
-% \blabla test
-% \definefont
-% [blabla]
-% [texnansi-lmtt10]
-% \blabla test
-% \stoptext
-
-% \starttext
-%
-% \setupcolors[state=start]
-%
-% \definefontfeature
-% [default-base]
-% [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes]
-% \definefontfeature
-% [default-node]
-% [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes,mode=node]
-% \definefontfeature
-% [default-none]
-% [script=latn,language=dflt,liga=yes,kern=no, tlig=yes,trep=yes]
-%
-% \startoverlay
-% {\vtop{\color[red] {\font\test=name:lmroman12regular*default-node \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[green]{\font\test=name:lmroman12regular*default-base \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[blue] {\font\test=name:lmroman12regular*default-none \test \input ward \input zapf \input linden }}}
-% \stopoverlay
-%
-% \blank
-%
-% \startoverlay
-% {\vtop{\color[red] {\font\test=name:texgyrepagella*default-node \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[green]{\font\test=name:texgyrepagella*default-base \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[blue] {\font\test=name:texgyrepagella*default-none \test \input ward \input zapf \input linden }}}
-% \stopoverlay
-%
-% \blank
-%
-% \startoverlay
-% {\vtop{\color[red] {\font\test=name:palatinonovaregular*default-node \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[green]{\font\test=name:palatinonovaregular*default-base \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[blue] {\font\test=name:palatinonovaregular*default-none \test \input ward \input zapf \input linden }}}
-% \stopoverlay
-%
-% \startoverlay
-% {\vtop{\color[red] {\font\test=name:OfficinaSerifBookITC*default-node \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[green]{\font\test=name:OfficinaSerifBookITC*default-base \test \input ward \input zapf \input linden }}}
-% {\vtop{\color[blue] {\font\test=name:OfficinaSerifBookITC*default-none \test \input ward \input zapf \input linden }}}
-% \stopoverlay
-%
-% \definefontfeature[superdefault][default][compose=yes]
-%
-% {\font\oeps=name:lmroman10regular*default at 30pt \oeps test \char7683}
-% {\font\oeps=name:lmroman10regular*superdefault at 30pt \oeps test \char7683}
-%
-% \stoptext
-
\let\doshowcheckedfontfeatures\relax
\def\showcheckedfontfeatures
@@ -1546,18 +1462,11 @@
%D \def\currentfontfileencoding{texnansi}
%D \stoptyping
-% \def\@@currentfontfile{currentfontfile}
-%
-% \def\getfontfileparameters#1%
-% {\edef\fontdata{\truefontdata{\truefontname{#1}}}%
-% \expanded{\getparameters[\@@currentfontfile][\fontdata]}}
-
-\def\getfontfileparameters#1% can be simpler for mkii
+\def\getfontfileparameters#1% can be simpler for mkii (no features)
{\edef\@@truefontname{\truefontname{#1}}%
\edef\currentfontfileencoding{\truefontdata\@@truefontname\s!encoding}%
\edef\currentfontfilemapping {\truefontdata\@@truefontname\s!mapping }%
- \edef\currentfontfilehandling{\truefontdata\@@truefontname\s!handling}%
- \edef\currentfontfilefeatures{\truefontdata\@@truefontname\s!features}}
+ \edef\currentfontfilehandling{\truefontdata\@@truefontname\s!handling}}
%D \macros
%D {definefont}
@@ -3129,7 +3038,6 @@
{\edef\@@fontencoding{\truefontdata\fontfile \s!encoding}%
\edef\@@fontmapping {\truefontdata\fontfile \s!mapping }%
\edef\@@fonthandling{\truefontdata\somefontname\s!handling}%
- \edef\@@fontfeatures{\truefontdata\fontfile \s!features}%
\edef\@@fontskewchar{\truefontdata\fontfile \s!skewchar}}
\def\setfontcharacteristics
@@ -3158,43 +3066,14 @@
\def\synchronizepatternswithfont{\synchronizepatterns}
\fi
-%D Experimental:
+%D Experimental: (should move to font-xtx)
-\def\definefontfeature
- {\dotripleargument\dodefinefontfeature}
+\ifdefined \definefontfeature \else
-\def\dododefinefontfeature#1%
- {\edef\!!stringa{\ifx\!!stringa\empty\else\!!stringa,\fi\executeifdefined{\??fa#1}\empty}}
+ \def\definefontfeature {\dotripleargument\dodefinefontfeature}
+ \def\dodefinefontfeature[#1][#2][#3]{}
-\def\dodefinefontfeature[#1][#2][#3]%
- {\doifassignmentelse{#2}
- {\setevalue{\??fa#1}{#2}}
- {\let\!!stringa\empty
- \processcommalist[#2]\dododefinefontfeature
- \setevalue{\??fa#1}{\ifx\!!stringa\empty\else\!!stringa,\fi#3}}}
-
-\definefontfeature
- [default]
- [liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes
-
-\definefontfeature
- [smallcaps]
- [liga=yes,kern=yes,tlig=yes,trep=yes,smcp=yes] % texligatures=yes,texquotes=yes
-
-\definefontfeature
- [oldstyle]
- [liga=yes,kern=yes,tlig=yes,trep=yes,onum=yes] % texligatures=yes,texquotes=yes
-
-\definefontfeature % no calt
- [arabic]
- [language=dflt,script=arab,
- init=yes,medi=yes,fina=yes,isol=yes,
- liga=yes,dlig=yes,rlig=yes,clig=yes,
- mark=yes,mkmk=yes,kern=yes,curs=yes]
-
-\definefontfeature
- [none]
- [features=no]
+\fi
%D The next auxilliary macro is an alternative to \type
%D {\fontname}.
@@ -3784,7 +3663,7 @@
%D The implementation is rather straightforward in using
%D \type{\halign}.
-\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run}
%D \macros
%D {showfontstrip, testminimalbaseline, showminimalbaseline}
@@ -3795,9 +3674,9 @@
%D
%D \showfontstrip \blank \showminimalbaseline
-\fetchruntimecommand \showfontstrip {\f!fontprefix\s!run.mkii}
-\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run.mkii}
-\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showfontstrip {\f!fontprefix\s!run}
+\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run}
+\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run}
%D \macros
%D {showkerning}
@@ -3806,7 +3685,7 @@
%D
%D \showkerning{Can you guess what kerning is?}
-\fetchruntimecommand \showkerning {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showkerning {\f!fontprefix\s!run}
%D \macros
%D {showbodyfontenvironment}
@@ -3819,7 +3698,7 @@
%D
%D \showsetup{showbodyfontenvironment}
-\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run}
%D \macros
%D {showfont,showfontstyle,showligatures}
@@ -3840,11 +3719,11 @@
% to be internationalized
-\fetchruntimecommand \showfont {\f!fontprefix\s!run.mkii}
-\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run.mkii}
-\fetchruntimecommand \showligature {\f!fontprefix\s!run.mkii}
-\fetchruntimecommand \showligatures {\f!fontprefix\s!run.mkii}
-\fetchruntimecommand \showcharratio {\f!fontprefix\s!run.mkii}
+\fetchruntimecommand \showfont {\f!fontprefix\s!run}
+\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run}
+\fetchruntimecommand \showligature {\f!fontprefix\s!run}
+\fetchruntimecommand \showligatures {\f!fontprefix\s!run}
+\fetchruntimecommand \showcharratio {\f!fontprefix\s!run}
%D \macros
%D {getglyph, symbolicfont}
diff --git a/Master/texmf-dist/tex/context/base/font-ini.mkiv b/Master/texmf-dist/tex/context/base/font-ini.mkiv
index c7d515cca36..1c9cdcd321a 100644
--- a/Master/texmf-dist/tex/context/base/font-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/font-ini.mkiv
@@ -14,9 +14,12 @@
% runtime commands will move to modules
+% todo: (so that we can delay font loading to \starttext
+
% simplification ... we no longer deal with specific mmtfa specifications
-% todo: always fontclass, then less testing
+% todo: always fontclass, then less testing
+% todo: bodyfontvariable: parent
% \definefontfeature[smallcaps][smcp=yes,script=latn]
% \definefontfeature[smallcaps][SmallCapitals=yes,script=latn]
@@ -55,34 +58,49 @@
\writestatus{loading}{ConTeXt Font Macros / Initialization}
\registerctxluafile{font-ini}{1.001}
-\registerctxluafile{node-fnt}{1.001} % here
+\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-cid}{1.001} % cid maps
\registerctxluafile{font-map}{1.001}
\registerctxluafile{font-syn}{1.001}
-\registerctxluafile{font-log}{1.001}
+
\registerctxluafile{font-tfm}{1.001}
-\registerctxluafile{font-enh}{1.001}
+
\registerctxluafile{font-afm}{1.001}
-\registerctxluafile{font-cid}{1.001} % cid maps
-\registerctxluafile{font-ott}{1.001} % otf tables
-\registerctxluafile{font-otf}{1.001} % otf main
-\registerctxluafile{font-otd}{1.001} % otf dynamics
+
\registerctxluafile{font-oti}{1.001} % otf initialization
+\registerctxluafile{font-ott}{1.001} % otf tables (first)
+\registerctxluafile{font-otf}{1.001} % otf main
\registerctxluafile{font-otb}{1.001} % otf main base
+\registerctxluafile{node-inj}{1.001} % we might split it off
\registerctxluafile{font-otn}{1.001} % otf main node
-\registerctxluafile{font-ota}{1.001} % otf analyzers
+\registerctxluafile{font-otd}{1.001} % otf dynamics (does an overload)
+\registerctxluafile{font-ota}{1.001} % otf analyzers (needs dynamics)
\registerctxluafile{font-otp}{1.001} % otf pack
\registerctxluafile{font-otc}{1.001} % otf context
+\registerctxluafile{font-oth}{1.001} % otf helpers
+
+\registerctxluafile{font-pat}{1.001} % patchers
+
+\registerctxluafile{node-fnt}{1.001} % here
+
+\registerctxluafile{font-lua}{1.001}
+
\registerctxluafile{font-vf} {1.001}
+\registerctxluafile{font-enh}{1.001}
+
+\registerctxluafile{font-gds}{1.001} % currently only otf
+
\registerctxluafile{font-def}{1.001}
-\registerctxluafile{font-ctx}{1.001}
-\registerctxluafile{font-xtx}{1.001}
-\registerctxluafile{font-fbk}{1.001}
-\registerctxluafile{font-gds}{1.001}
+\registerctxluafile{font-ctx}{1.001} % after def as it overloads
+
\registerctxluafile{font-ext}{1.001}
-\registerctxluafile{font-pat}{1.001}
+\registerctxluafile{font-fbk}{1.001}
\registerctxluafile{font-chk}{1.001}
-\registerctxluafile{font-agl}{1.001}
+
+\registerctxluafile{font-aux}{1.001}
\unprotect
@@ -160,9 +178,12 @@
% \newtoks \everydefinedfont % not ot be confused with \everydefinefont
+\let\thedefinedfont\relax
+
\def\dodefinedfont[#1]%
- {\iffirstargument\definefont[thedefinedfont][#1]\fi % we can speed this one up
- \csname thedefinedfont\endcsname
+ {\featureinheritancemode\featureinheritancefontonly
+ \iffirstargument\definefont[thedefinedfont][#1]\fi % we can speed this one up
+ \thedefinedfont
\the\everydefinedfont}
\unexpanded\def\definedfont
@@ -471,11 +492,11 @@
%D check for fontclass being default or empty and save a few
%D tests but it does not help us when no math is defined.
-\chardef\mrfam\zerocount % math regular
-\chardef\mbfam\plusone % math bold
+\let\mrfam\zerocount % math regular
+\let\mbfam\plusone % math bold
-\unexpanded\def\mr{\ifmmode\fam\zerocount\else\setcurrentfontalternative\c!mr\fi} % \fam\csname\c!mr fam\endcsname
-\unexpanded\def\mb{\ifmmode\fam\plusone \else\setcurrentfontalternative\c!mb\fi} % \fam\csname\c!mb fam\endcsname
+\unexpanded\def\mr{\ifmmode\fam\mrfam\else\setcurrentfontalternative\c!mr\fi}
+\unexpanded\def\mb{\ifmmode\fam\mbfam\else\setcurrentfontalternative\c!mb\fi}
\def\mathtextsuffix {-text}
\def\mathscriptsuffix {-script}
@@ -515,6 +536,11 @@
\def\dosetmathfamily#1#2%
{\let\savedfontbody\fontbody % op hoger plan
\let\fontfamily#2%
+ % new per 20100817
+ \checkbodyfontenvironment[\scriptscriptface]%
+ \checkbodyfontenvironment[\scriptface]%
+ \checkbodyfontenvironment[\textface]%
+ %
\let\currentmathsize\!!plusthree\let\fontbody\scriptscriptface\dodosetmathfamily\scriptscriptfont#1%
\let\currentmathsize\!!plustwo \let\fontbody\scriptface \dodosetmathfamily\scriptfont #1%
\let\currentmathsize\!!plusone \let\fontbody\textface \dodosetmathfamily\textfont #1%
@@ -528,29 +554,14 @@
% not official !
-\chardef\boldmathmode\zerocount % might change ... maybe \mathfontsupport 1 (normal) 2 (bold too)
+\newconditional\boldmathmode % might change ... maybe \mathfontsupport 1 (normal) 2 (bold too)
-\def\enableboldmath {\chardef\boldmathmode\plusone } % todo: \setupbodyfont[boldmath,...]
-\def\disableboldmath{\chardef\boldmathmode\zerocount}
+\def\enableboldmath {\settrue \boldmathmode} % todo: \setupbodyfont[boldmath,...]
+\def\disableboldmath{\setfalse\boldmathmode}
\appendtoks
- \ifcase\boldmathmode\or\dosetmathfamily\mbfam\c!mb\fi
+ \ifconditional\boldmathmode\dosetmathfamily\mbfam\c!mb\fi
\to \mathstrategies
-
-% \chardef\msfam\plustwo % math symbol
-%
-% \def\c!ms{ms}
-%
-% \unexpanded\def\ms{\ifmmode\fam\plustwo\else\setcurrentfontalternative\c!ms\fi}
-%
-% \chardef\symbolmathmode\zerocount
-%
-% \def\enablesymbolmath {\chardef\symbolmathmode\plusone }
-% \def\disablesymbolmath{\chardef\symbolmathmode\zerocount}
-%
-% \appendtoks
-% \ifcase\symbolmathmode\or\dosetmathfamily\msfam\c!ms\fi
-% \to \mathstrategies
%D All used styles, like rm, ss and tt, are saved in a comma
%D separated list. Appart from practical limitations one can
@@ -614,6 +625,10 @@
\let\relativefontid\empty
\fi}
+\def\checkrelativefontid % not yet supported as we then need to trigger \rm\tf or so first
+ {\let\relativefontsize\minusone
+ \let\relativefontsize\defaultrelativefontsize}
+
\def\checkrelativefontsize#1%
{\edef\relativefontsize
{\ifcsname\fontclass#1\s!rscale\endcsname
@@ -685,9 +700,24 @@
\let\relativefontid\empty
-\def\lowleveldefinefont#1#2% #2 = cs
- {%
- \ctxlua{fonts.define.command_1("\luaescapestring{#1}")}% the escapestring catches at \somedimen
+% 0 = none
+% 1 = fontonly
+% 2 = classonly
+% 3 = fontfirst
+% 4 = classfirst
+
+\setnewconstant\featureinheritancefontnone \zerocount
+\setnewconstant\featureinheritancefontonly \plusone
+\setnewconstant\featureinheritanceclassonly \plustwo
+\setnewconstant\featureinheritancefontfirst \plusthree
+\setnewconstant\featureinheritanceclassfirst\plusfour
+
+\setnewconstant\featureinheritancedefault \featureinheritancefontfirst
+\setnewconstant\featureinheritancemode \featureinheritancedefault
+
+\unexpanded\def\lowleveldefinefont#1#2% #2 = cs
+ {% we can now set more at the lua end
+ \ctxlua{fonts.definers.stage_one("\luaescapestring{#1}")}% the escapestring catches at \somedimen
% sets \scaledfontmode and \somefontname and \somefontsize
\ifcase\scaledfontmode\relax
% none, avoid the designsize if possible
@@ -707,6 +737,7 @@
% scaled, don't use this one as it's unpredictable
\scaledfontsize-\somefontsize\scaledpoint
\fi
+ \relax
\scaledfontsize\localrelativefontsize\scaledfontsize
\ifautofontsize
\scaledfontsize\currentfontbodyscale\scaledfontsize
@@ -718,26 +749,32 @@
\fi
\updatefontparameters
\updatefontclassparameters
- \ctxlua{fonts.define.command_2(
+ \ctxlua{fonts.definers.stage_two(
\ifx\fontclass\empty false\else true\fi,
"#2", % cs, trailing % is gone
"\somefontfile",
\number\scaledfontsize,
+ \number\featureinheritancemode,
"\@@fontclassfeatures",
"\@@fontfeatures",
"\@@fontclassfallbacks",
"\@@fontfallbacks",
0\currentmathsize,
\number\dimexpr\textface\relax,
- "\relativefontid" % experiment
+ "\relativefontid", % experiment
+ "\@@fontclassgoodies", % experiment (not yet used)
+ "\@@fontgoodies" % experiment
)}%
- \edef\somefontspec{at \somefontsize}% we need the resolved designsize (for fallbacks)
+% \edef\somefontspec{at \somefontsize}% we need the resolved designsize (for fallbacks)
+ \edef\somefontspec{at \number\scaledfontsize sp}% we need the resolved designsize (for fallbacks)
\expandafter\let\expandafter\lastrawfontcall\csname#2\endcsname
- \the\everydefinefont}
+ \the\everydefinefont
+ \featureinheritancemode\featureinheritancedefault}
\def\updatefontclassparameters
{\edef\@@fontclassfeatures {\ifcsname\fontclass\fontstyle\s!features \endcsname\csname\fontclass\fontstyle\s!features \endcsname\fi}%
- \edef\@@fontclassfallbacks{\ifcsname\fontclass\fontstyle\s!fallbacks\endcsname\csname\fontclass\fontstyle\s!fallbacks\endcsname\fi}}
+ \edef\@@fontclassfallbacks{\ifcsname\fontclass\fontstyle\s!fallbacks\endcsname\csname\fontclass\fontstyle\s!fallbacks\endcsname\fi}%
+ \edef\@@fontclassgoodies {\ifcsname\fontclass\fontstyle\s!goodies \endcsname\csname\fontclass\fontstyle\s!goodies \endcsname\fi}}
% resolve
@@ -755,6 +792,13 @@
\ifcsname\??ff #1\endcsname\@EA \@@thefallbacksyes\csname\??ff #1\endcsname\else
\let \@@fontfallbacks \empty \fi\fi\fi\fi}
+\def\@@thegoodiesyes#1%
+ {\ifcsname\??ff\fontclass#1\s!goodies \endcsname\@EA\let\@EA\@@fontgoodies \csname\??ff\fontclass#1\s!goodies \endcsname\else
+ \ifcsname\??ff #1\s!goodies \endcsname\@EA\let\@EA\@@fontgoodies \csname\??ff #1\s!goodies \endcsname\else
+ \ifcsname\??ff\fontclass #1\endcsname\@EA \@@thegoodiesyes \csname\??ff\fontclass #1\endcsname\else
+ \ifcsname\??ff #1\endcsname\@EA \@@thegoodiesyes \csname\??ff #1\endcsname\else
+ \let \@@fontgoodies \empty \fi\fi\fi\fi}
+
\def\@@thefeaturesnop#1%
{\ifcsname\??ff#1\s!features \endcsname\@EA\let\@EA\@@fontfeatures \csname\??ff#1\s!features \endcsname\else
\ifcsname\??ff #1\endcsname\@EA \@@thefeaturesnop \csname\??ff #1\endcsname\else
@@ -765,13 +809,20 @@
\ifcsname\??ff #1\endcsname\@EA \@@thefallbacksnop\csname\??ff #1\endcsname\else
\let \@@fontfallbacks \empty \fi\fi}
+\def\@@thegoodiesnop#1%
+ {\ifcsname\??ff#1\s!goodies \endcsname\@EA\let\@EA\@@fontgoodies \csname\??ff#1\s!goodies \endcsname\else
+ \ifcsname\??ff #1\endcsname\@EA \@@thegoodiesnop \csname\??ff #1\endcsname\else
+ \let \@@fontgoodies \empty \fi\fi}
+
\def\updatefontparametersyes
{\@@thefeaturesyes \somefontname
- \@@thefallbacksyes\somefontname}
+ \@@thefallbacksyes\somefontname
+ \@@thegoodiesyes \somefontname}
\def\updatefontparametersnop
{\@@thefeaturesnop \somefontname
- \@@thefallbacksnop\somefontname}
+ \@@thefallbacksnop\somefontname
+ \@@thegoodiesnop \somefontname}
\def\updatefontparameters
{\ifx\fontclass\empty\updatefontparametersnop\else\updatefontparametersyes\fi}
@@ -781,6 +832,8 @@
\let\@@fontfallbacks\empty
\let\@@fontfeatures \empty
+\let\@@fontgoodies \empty
+
\let\@@hyphenchar \empty % todo, will go to encoding
%D This brings down maps processing from 466 to 309 seconds
@@ -915,6 +968,8 @@
% We could use an indirect method ... store in 'array' and refer to
% slot.
+%
+% or nicer .. use parent chain
\unexpanded\def\definefontsynonym[#1]#2[#3]%
{\edef\@@fontname{#1}%
@@ -936,11 +991,13 @@
\def\dododefinefontsynonymnop[#1]%
{\let\@@ff@@features \undefined
\let\@@ff@@fallbacks\undefined
+ \let\@@ff@@goodies \undefined
\expandafter\dogetfontparameternop#1,]=,}
\def\dododefinefontsynonymyes[#1]%
{\let\@@ff@@features \undefined
\let\@@ff@@fallbacks\undefined
+ \let\@@ff@@goodies \undefined
\expandafter\dogetfontparameteryes#1,]=,}
\def\dogetfontparameternop#1=#2,%
@@ -959,27 +1016,34 @@
\expandafter\dogetfontparameteryes
\fi}
-% hm, was wrong, class/global reversed
+% helpers, some day these will be toks and counts
+
+\def\fntsetdefname {\global\let\somefontname\defaultfontfile}
+\def\fntsetsomename{\gdef\somefontname} % {#1}
+\def\fntsetnopsize {\let\somefontsize\empty}
+\def\fntsetsomesize{\def\somefontsize} % {#1}
-\let\fcglobal\global
-\let\fcxdef \xdef
-\let\fcglet \glet
+% end of helpers
\def\nonodefinefontsynonymnop
{\@EA\let\csname\??ff\@@fontname\s!features \endcsname\undefined
- \@EA\let\csname\??ff\@@fontname\s!fallbacks\endcsname\undefined}
+ \@EA\let\csname\??ff\@@fontname\s!fallbacks\endcsname\undefined
+ \@EA\let\csname\??ff\@@fontname\s!goodies \endcsname\undefined}
\def\nonodefinefontsynonymyes
- {\fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\undefined
- \fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\undefined}
+ {\global\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\undefined
+ \global\@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\undefined
+ \global\@EA\let\csname\??ff\fontclass\@@fontname\s!goodies \endcsname\undefined}
\def\dodododefinefontsynonymnop
{\@EA\let\csname\??ff\@@fontname\s!features \endcsname\@@ff@@features
- \@EA\let\csname\??ff\@@fontname\s!fallbacks\endcsname\@@ff@@fallbacks}
+ \@EA\let\csname\??ff\@@fontname\s!fallbacks\endcsname\@@ff@@fallbacks
+ \@EA\let\csname\??ff\@@fontname\s!goodies \endcsname\@@ff@@goodies}
\def\dodododefinefontsynonymyes
- {\fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\@@ff@@features
- \fcglobal\@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\@@ff@@fallbacks}
+ {\global\@EA\let\csname\??ff\fontclass\@@fontname\s!features \endcsname\@@ff@@features
+ \global\@EA\let\csname\??ff\fontclass\@@fontname\s!fallbacks\endcsname\@@ff@@fallbacks
+ \global\@EA\let\csname\??ff\fontclass\@@fontname\s!goodies \endcsname\@@ff@@goodies}
\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater
@@ -1135,7 +1199,8 @@
\def\newfontidentifier{*\fontclass\lastfontidentifier\fontstyle\fontsize*}
\def\dododefinefont#1#2%
- {\edef\lastfontidentifier{#1}%
+ {\featureinheritancemode\featureinheritancefontonly
+ \edef\lastfontidentifier{#1}%
\let\localrelativefontsize\defaultrelativefontsize
\let\localabsolutefontsize\fontbody
\lowleveldefinefont{#2}\rawfontidentifier
@@ -1260,6 +1325,12 @@
%D expands to the current size in terms of \type {a} \unknown
%D \type {d}, nothing, or \type {x} \unknown \type {xx}.
+%D In the following macros we use \type{\currentxfontsize} to
+%D hold the current x||size of the font. This enables us to
+%D support for instance \type{\sl} inside a \type{\tx} switch.
+
+\newconstant\currentxfontsize
+
\def\xfontsize{\ifcase\currentxfontsize\fontsize\or\c!x\else\c!xx\fi}
%D A typical use of this command is in commands that switch
@@ -1334,24 +1405,81 @@
\newcount\@@fontdefhack % check if this is still needed
+% \def\@@beginfontdef
+% {\ifcase\@@fontdefhack
+% \let\k!savedtext \k!text \let\k!text \s!text
+% \let\k!saveddefault \k!default \let\k!default \s!default
+% \fi
+% \advance\@@fontdefhack \plusone }
+
+% \def\@@endfontdef
+% {\advance\@@fontdefhack \minusone
+% \ifcase\@@fontdefhack
+% \let\k!default \k!saveddefault
+% \let\k!text \k!savedtext
+% \fi}
+
+%%%%%%%%%%%%%%%%%%%%%%%%
+
+% The problem is that the key in a getparameters is resolved
+% to the underlying interface language (english). But values
+% are kept as they are. However, some of the keys in a font
+% definition are used as values later on.
+%
+% The only place where this happens (for historical reason mostly)
+% is in the bodyfont definitions and setup, so we can use a limited
+% case.
+%
+% \let \c!big \v!big : expansion time (user)
+% \let \c!small \v!small : expansion time (user)
+% \let \c!text \s!text : definition time
+% % \c!script \s!script : definition time
+% % \c!scriptscript \s!scriptscript : definition time
+% % \c!em : definition time
+% % \c!interlineskip : definition time
+% \let \c!default \s!default : definition time
+% \let \k!default \s!default : definition time
+%
+% Doing the k! definitions local will save us 500 has entries.
+
+\letvalue{\k!prefix!\v!big }\c!big
+\letvalue{\k!prefix!\v!small }\c!small
+\letvalue{\k!prefix!\v!text }\s!text
+\letvalue{\k!prefix!\v!default}\s!default
+
+\let\normalc!big \c!big
+\let\normalc!small \c!small
+\let\normalc!text \c!text % should not happen as we expect text
+\let\normalc!default \c!default
+\let\normalk!default \k!default
+
+\newtoks\everybeginfontdef
+\newtoks\everyendfontdef
+
+\appendtoks
+ \let\c!text \s!text
+ \let\c!default\s!default
+\to \everybeginfontdef
+
+\appendtoks
+ \let\c!text \normalc!text
+ \let\c!default\normalc!default
+\to \everyendfontdef
+
\def\@@beginfontdef
{\ifcase\@@fontdefhack
- \let\k!savedtext \k!text \let\k!text \s!text
- \let\k!k!savedtext \k!k!text \let\k!k!text \!!plusone
- \let\k!saveddefault \k!default \let\k!default \s!default
- \let\k!k!saveddefault\k!k!default \let\k!k!default \!!plusone
+ \the\everybeginfontdef
\fi
- \advance\@@fontdefhack \plusone }
+ \advance\@@fontdefhack\plusone}
\def\@@endfontdef
{\advance\@@fontdefhack \minusone
\ifcase\@@fontdefhack
- \let\k!k!default\k!k!saveddefault
- \let\k!default \k!saveddefault
- \let\k!k!text \k!k!savedtext
- \let\k!text \k!savedtext
+ \the\everyendfontdef
\fi}
+%%%%%%%%%%%%%%%%%%%%%%%%
+
\unexpanded\def\definebodyfontenvironment
{\dotripleempty\dodefinebodyfontenvironment}
@@ -1360,7 +1488,7 @@
\@@beginfontdef
\doifelse{#2}\s!default
{\getparameters[\??ft\s!default][#3]}
- {\normalizebodyfontsize#2\to\tempbodyfontsize
+ {\edef\tempbodyfontsize{\thenormalizedbodyfontsize{#2}}%
\addtocommalist\tempbodyfontsize\bodyfontenvironmentlist
\@EA\dododefinebodyfontenvironment\@EA[\tempbodyfontsize][#1][#3]}%
\@@endfontdef
@@ -1375,13 +1503,15 @@
\fi}
\def\dododefinebodyfontenvironment[#1][#2][#3]% size class settings
- {\@@beginfontdef % \s!text goes wrong in testing because the 12pt alternative will called when typesetting the test (or so)
+ {%\@@beginfontdef % \s!text goes wrong in testing because the 12pt alternative will called when typesetting the test (or so)
\ifcsname\??ft#2#1\c!em\endcsname
% we test for em as we assume it to be set
\else
+ % speeding this up saves 0.01 sec on a run (tested 20100817)
+ % but some day we will clean this up anyway
\def\docommand##1%
{\scratchdimen\csname\??ft\s!default##1\endcsname\dimexpr#1\relax
- \normalizebodyfontsize\scratchdimen\to\tempbodyfontsize
+ \edef\tempbodyfontsize{\thenormalizedbodyfontsize\scratchdimen}%
\letvalue{\??ft#2#1##1}\tempbodyfontsize}%
\processcommacommand[\fontrelativesizelist]\docommand
\copyparameters
@@ -1389,20 +1519,20 @@
[\c!interlinespace,\c!em]%
\fi
\getparameters[\??ft#2#1][#3]%
- \@@endfontdef
+ %\@@endfontdef
% new code, see remark
- \ifloadingfonts
- % only runtime
- \else\ifcsname\@size@#1\endcsname
- % only once
- \else
- % prevent loop (hence \empty)
- \letvalue{\@size@#1}\empty
- \pushmacro\fontclass % new per 26102009
- \edef\fontclass{#2}% % new per 26102009
- \defineunknownfont{#1}%
- \popmacro\fontclass % new per 26102009
- \fi\fi
+ \ifproductionrun
+ \ifcsname\@size@#1\endcsname
+ % only once
+ \else
+ % prevent loop (hence \empty)
+ \letvalueempty{\@size@#1}%
+ \pushmacro\fontclass % new per 26102009
+ \edef\fontclass{#2}% % new per 26102009
+ \defineunknownfont{#1}%
+ \popmacro\fontclass % new per 26102009
+ \fi
+ \fi
% so far
\setvalue{\@size@#1}{\docompletefontswitch[#1]}}
@@ -1426,15 +1556,44 @@
%D So, apart from an occasional switch, one should define an
%D environment at the outer level.
-\def\checkbodyfontenvironment[#1]%
- {\definebodyfontenvironment[\fontclass][#1][]}
+% \def\checkbodyfontenvironment[#1]%
+% {\definebodyfontenvironment[\fontclass][#1][]}
+%
+% \def\checkbodyfontenvironment[#1]%
+% {\ifcsname\??ft\fontclass#1\c!em\endcsname
+% % we test for em as we assume it to be set
+% \else
+% \definebodyfontenvironment[\fontclass][#1][]%
+% \fi}
+%
+% will be adapted with parent chain:
\def\checkbodyfontenvironment[#1]%
- {\ifcsname\??ft\fontclass#1\c!em\endcsname
- % we test for em as we assume it to be set
- \else
- \definebodyfontenvironment[\fontclass][#1][]%
- \fi}
+ {\ifcsname\??ft #1\c!em\endcsname\else\docheckbodyfontenvironment\empty {#1}\fi
+ \ifcsname\??ft\fontclass#1\c!em\endcsname\else\docheckbodyfontenvironment\fontclass{#1}\fi}
+
+\def\docheckbodyfontenvironment#1#2% class size (simplified version of definebodyfontenvironment)
+ {\@@beginfontdef
+ \edef\tempbodyfontsize{\thenormalizedbodyfontsize{#2}}%
+ \addtocommalist\tempbodyfontsize\bodyfontenvironmentlist
+ \def\docommand##1% text script scriptscript x xx big small
+ {\setevalue{\??ft#1\tempbodyfontsize##1}%
+ {\thenormalizedbodyfontsize{\csname\??ft\s!default##1\endcsname\dimexpr\tempbodyfontsize\relax}}}%
+ \processcommacommand[\fontrelativesizelist]\docommand
+ \copyparameters % can inherit
+ [\??ft#1\tempbodyfontsize][\??ft\s!default]
+ [\c!interlinespace,\c!em]%
+% \ifproductionrun
+ \ifcsname\@size@\tempbodyfontsize\endcsname \else
+ \letvalueempty{\@size@\tempbodyfontsize}% prevent loop
+ \pushmacro\fontclass
+ \edef\fontclass{#1}%
+ \normalexpanded{\defineunknownfont{\tempbodyfontsize}}% we can also inherit here
+ \popmacro\fontclass
+ \fi
+% \fi
+ \setevalue{\@size@#1}{\noexpand\docompletefontswitch[#1]}%
+ \@@endfontdef}
% this one already catches both define/setup
@@ -1442,6 +1601,16 @@
%D Just a couple of interface macros:
+% todo:
+%
+% \letvalueempty{\??ft\s!empty}
+%
+% \def\currentbodyfontvariable#1%
+% {\csname\??ft
+% \ifcsname\??ft\fontclass#1\endcsname\fontclass#1\else
+% \ifcsname\??ft #1\endcsname #1\else \s!empty \fi
+% \fi}
+
\def\bodyfontvariable#1%
{\??ft\ifcsname\??ft\fontclass#1\endcsname\fontclass\fi#1}
@@ -1580,7 +1749,7 @@
\let\relativefontsize\defaultrelativefontsize}
\def\dododefinebodyfont#1#2#3% style defs body
- {\checkbodyfontenvironment[#3]% just to be sure.
+ {\checkbodyfontenvironment[#3]% just to be sure; can probably be omited now
\processcommalist[#2]{\dodododefinebodyfont{#1}{#3}}}
\def\dodododefinebodyfont#1#2#3% style body def
@@ -1616,8 +1785,8 @@
\def\dodefinebodyfontyesxx#1#2[#3#4#5=#6]% style body def
{\ifcsname#1#3#4#5\endcsname\else\checkbodyfont{#1}{#3#4}{#5}\fi% not \definefontsize[#5]
- \fcglobal\@EA\let\csname*\fontclass#2#1#3#4#5*\endcsname\undefined
- \unexpanded\@EA\fcxdef\csname\fontclass#2#1#3#4#5\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#5}{\normalunexpanded{#6}}}}
+ \global\@EA\let\csname*\fontclass#2#1#3#4#5*\endcsname\undefined
+ \unexpanded\@EA\xdef\csname\fontclass#2#1#3#4#5\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#5}{\normalunexpanded{#6}}}}
\def\dodefinebodyfontnopmm#1#2[#3#4#5=#6]% style body def
{\ifcsname#1#3#4#5\endcsname\else\checkbodyfont{#1}{#3#4}{#5}\fi% not \definefontsize[#5]
@@ -1630,12 +1799,12 @@
\def\dodefinebodyfontyesmm#1#2[#3#4#5=#6]% style body def
{\ifcsname#1#3#4#5\endcsname\else\checkbodyfont{#1}{#3#4}{#5}\fi% not \definefontsize[#5]
- \fcglobal\@EA\let\csname*\fontclass#2#1#3#4#51*\endcsname\undefined
- \fcglobal\@EA\let\csname*\fontclass#2#1#3#4#52*\endcsname\undefined
- \fcglobal\@EA\let\csname*\fontclass#2#1#3#4#53*\endcsname\undefined
- \unexpanded\@EA\fcxdef\csname\fontclass#2#1#3#4#51\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#51}{\normalunexpanded{#6}}}%
- \unexpanded\@EA\fcxdef\csname\fontclass#2#1#3#4#52\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#52}{\normalunexpanded{#6}}}%
- \unexpanded\@EA\fcxdef\csname\fontclass#2#1#3#4#53\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#53}{\normalunexpanded{#6}}}}
+ \global\@EA\let\csname*\fontclass#2#1#3#4#51*\endcsname\undefined
+ \global\@EA\let\csname*\fontclass#2#1#3#4#52*\endcsname\undefined
+ \global\@EA\let\csname*\fontclass#2#1#3#4#53*\endcsname\undefined
+ \unexpanded\@EA\xdef\csname\fontclass#2#1#3#4#51\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#51}{\normalunexpanded{#6}}}%
+ \unexpanded\@EA\xdef\csname\fontclass#2#1#3#4#52\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#52}{\normalunexpanded{#6}}}%
+ \unexpanded\@EA\xdef\csname\fontclass#2#1#3#4#53\endcsname{\noexpand\xxdododefinefont{\number\relativefontsize}{#2}{#2#1#3#4#53}{\normalunexpanded{#6}}}}
\def\checkbodyfont#1% tests for ttsl mmbf
{\edef\c!!mm{#1}%
@@ -1647,24 +1816,49 @@
% some day we can do an auto-fam if needed
-\def\checkmathbodyfont#1#2#3% style alt size / gdef % #3 can be empty
- {%\message{!m #1 #2 #3!}%
- % #1 #2 #3 = signal
- %setugvalue {#2}{\setcurrentfontalternative {#2}}% \mr \mb
- \setugvalue {#1}{\setcurrentfontstyle {#1}}}% \mm
-
-\def\checktextbodyfont#1#2#3% style alt size / gdef % #3 can be empty
- {%\message{!t #1 #2 #3!}%
- \setugvalue {#1#3}{\setcurrentfontstylesize {#1}{#3}}% \rma
- \setugvalue {#2#3}{\setcurrentfontalternativesize {#2}{#3}}% \sla
- \setugvalue {#1#2#3}{\setcurrentfontstylealternativesize{#1}{#2}{#3}}% \rmsla
- \setugvalue {#1}{\setcurrentfontstyle {#1}}% \rm
- \setugvalue {#2}{\setcurrentfontalternative {#2}}% \sl
- \setugvalue {#1\c!x}{\setcurrentfontxstylealternative {#1}}% \rmx
- \setugvalue{#1\c!xx}{\setcurrentfontxxstylealternative {#1}}% \rmxx
- \setugvalue {#2\c!x}{\setcurrentfontxalternative {#2}}% \slx
- \setugvalue{#2\c!xx}{\setcurrentfontxxalternative {#2}}% \slxx
- \setugvalue {#1#2}{\setcurrentfontstylealternative {#1}{#2}}}% \rmsl
+% \def\checkmathbodyfont#1#2#3% style alt size / gdef % #3 can be empty (checking needed as \bf is already defined)
+% {%\message{!m #1 #2 #3!}% #1 #2 #3 = signal
+% %ifcsname #2\endcsname\else\setugvalue {#2}{\setcurrentfontalternative {#2}}\fi % \mr \mb
+% \ifcsname #1\endcsname\else\setugvalue {#1}{\setcurrentfontstyle {#1}}\fi} % \mm
+
+% \def\checktextbodyfont#1#2#3% style alt size / gdef % #3 can be empty (checking needed as \bf is already defined)
+% {%\message{!t #1 #2 #3!}%
+% \ifcsname #1#3\endcsname\else\setugvalue {#1#3}{\setcurrentfontstylesize {#1}{#3}}\fi % \rma
+% \ifcsname #2#3\endcsname\else\setugvalue {#2#3}{\setcurrentfontalternativesize {#2}{#3}}\fi % \sla
+% \ifcsname #1#2#3\endcsname\else\setugvalue {#1#2#3}{\setcurrentfontstylealternativesize{#1}{#2}{#3}}\fi % \rmsla
+% \ifcsname #1\endcsname\else\setugvalue {#1}{\setcurrentfontstyle {#1}}\fi % \rm
+% \ifcsname #2\endcsname\else\setugvalue {#2}{\setcurrentfontalternative {#2}}\fi % \sl
+% \ifcsname #1\c!x\endcsname\else\setugvalue {#1\c!x}{\setcurrentfontxstylealternative {#1}}\fi % \rmx
+% \ifcsname#1\c!xx\endcsname\else\setugvalue{#1\c!xx}{\setcurrentfontxxstylealternative {#1}}\fi % \rmxx
+% \ifcsname #2\c!x\endcsname\else\setugvalue {#2\c!x}{\setcurrentfontxalternative {#2}}\fi % \slx
+% \ifcsname#2\c!xx\endcsname\else\setugvalue{#2\c!xx}{\setcurrentfontxxalternative {#2}}\fi % \slxx
+% \ifcsname #1#2\endcsname\else\setugvalue {#1#2}{\setcurrentfontstylealternative {#1}{#2}}\fi} % \rmsl
+
+\def\checkmathbodyfont#1#2#3% style alt size / gdef % #3 can be empty (checking needed as \bf is already defined)
+ {%\message{!m #1 #2 #3!}% #1 #2 #3 = signal
+ %setugvalue {#2}{\setcurrentfontalternative {#2}}% % \mr \mb
+ \setugvalue {#1}{\setcurrentfontstyle {#1}}} % \mm
+
+\def\checktextbodyfont#1#2#3% style alt size / gdef % #3 can be empty (checking needed as \bf is already defined)
+ {%\message{!t #1 #2 #3!}% % beware, some can be defined already
+ \setugvalue {#1#3}{\setcurrentfontstylesize {#1}{#3}}% % \rma
+ \setugvalue {#2#3}{\setcurrentfontalternativesize {#2}{#3}}% % \sla
+ \setugvalue {#1#2#3}{\setcurrentfontstylealternativesize{#1}{#2}{#3}}% % \rmsla
+ \ifcsname\s!normal#1\endcsname % text/math check
+ \expandafter\let\csname#1\expandafter\endcsname\csname\s!normal#1\endcsname
+ \else
+ \setugvalue {#1}{\setcurrentfontstyle {#1}}% % \rm
+ \fi
+ \ifcsname\s!normal#2\endcsname % text/math check
+ \expandafter\let\csname#2\expandafter\endcsname\csname\s!normal#2\endcsname
+ \else
+ \setugvalue {#2}{\setcurrentfontalternative {#2}}% % \sl
+ \fi
+ \setugvalue {#1\c!x}{\setcurrentfontxstylealternative {#1}}% % \rmx
+ \setugvalue{#1\c!xx}{\setcurrentfontxxstylealternative {#1}}% % \rmxx
+ \setugvalue {#2\c!x}{\setcurrentfontxalternative {#2}}% % \slx
+ \setugvalue{#2\c!xx}{\setcurrentfontxxalternative {#2}}% % \slxx
+ \setugvalue {#1#2}{\setcurrentfontstylealternative {#1}{#2}}} % \rmsl
\def\dodefinedefaultbodyfont[#1][#2][#3]% sizes styles identifier
{\def\dododefinedefaultbodyfont##1%
@@ -1688,7 +1882,7 @@
\def\dodefineunknownfont#1#2%
{\ifcsname\??ft\s!default#2\endcsname
\donetrue
- \normalizebodyfontsize\csname\??ft\s!default#2\endcsname\dimexpr#1\relax\to\tempbodyfontsize
+ \edef\tempbodyfontsize{\thenormalizedbodyfontsize{\csname\??ft\s!default#2\endcsname\dimexpr#1\relax}}%
\letvalue{\??ft#1#2}\tempbodyfontsize
\fi}
@@ -1705,9 +1899,10 @@
\defineunknownfont{\csname\??ft#1#2\endcsname}%
\fi}
+\let\c!savedtext\c!text
+
\unexpanded\def\defineunknownfont#1%
- {\let\c!savedtext\c!text
- \let\c!text\s!text
+ {\let\c!text\s!text
\donefalse
\processcommacommand[\fontrelativesizelist]{\dodefineunknownfont{#1}}%
\let\c!text\c!savedtext
@@ -1791,7 +1986,7 @@
%D often not the way users specify the bodyfont size. Therefore
%D we also store the normalized value.
-\chardef\fontdigits=2 % was 1
+\setnewconstant\fontdigits\plustwo % was 1
% \def\normalizebodyfontsize#1\to#2%
% {\@EA\@EA\@EA\donormalizedbodyfontsize\@EA\WITHOUTPT\the\dimexpr#1+\ifcase\fontdigits.5\or.05\or.005\fi\points\relax000\to#2}
@@ -1807,14 +2002,14 @@
% \s!pt}}
\def\normalizebodyfontsize#1\to#2%
- {\edef#2{\ctxlua{fonts.nbfs(\number\dimexpr#1\relax,\number\fontdigits)}}}
+ {\edef#2{\ctxcommand{nbfs(\number\dimexpr#1\relax,\number\fontdigits)}}}
\def\thenormalizedbodyfontsize#1%
- {\ctxlua{fonts.nbfs(\number\dimexpr#1\relax,\number\fontdigits)}}
+ {\ctxcommand{nbfs(\number\dimexpr#1\relax,\number\fontdigits)}}
-\normalizebodyfontsize\bodyfontsize\to\normalizedglobalbodyfontsize
-\normalizebodyfontsize\bodyfontsize\to\normalizedlocalbodyfontsize
-\normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize
+\edef\normalizedglobalbodyfontsize{\thenormalizedbodyfontsize\bodyfontsize}
+\edef\normalizedlocalbodyfontsize {\thenormalizedbodyfontsize\bodyfontsize}
+\edef\normalizedbodyfontsize {\thenormalizedbodyfontsize\bodyfontsize}
%D \macros
%D {fontstyle,fontalternative,fontsize}
@@ -1850,7 +2045,7 @@
\def\doswitchpoints[#1]%
{\normalexpanded{\dodoswitchpoints{#1}}}
-\unexpanded \def\dodoswitchpoints#1%
+\unexpanded\def\dodoswitchpoints#1%
{\ifcsname\@size@#1\endcsname \else
\defineunknownfont{#1}%
\fi%
@@ -1858,14 +2053,14 @@
\ifcsname\@size@#1\endcsname
\csname\@size@#1\endcsname
\localbodyfontsize#1\relax
- \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
% \edef\fontbody{\fontbody}% to be tested but we can clean up mkiv further
+ \edef\normalizedbodyfontsize{\thenormalizedbodyfontsize\localbodyfontsize}%
\checkbodyfontenvironment[\normalizedbodyfontsize]%
\else
\showmessage\m!fonts4{#1}%
\fi}
-\unexpanded \def\doswitchstyle[#1]%
+\unexpanded\def\doswitchstyle[#1]%
{\ifcsname\@style@#1\endcsname
\csname\@style@#1\endcsname
\edef\fontstyle{#1}%
@@ -1914,11 +2109,8 @@
%D we start typesetting.
%D
%D Therefore we have to signal the font switching macros that
-%D we are preloading fonts. As long as the next boolean is,
-%D true, no loading is done.
-
-\newif\ifloadingfonts \loadingfontstrue
-
+%D we are preloading fonts.
+%D
%D \macros
%D {preloadfonts}
%D
@@ -1926,29 +2118,115 @@
%D sequence of a session. After the loading job is done, the
%D macro relaxes itself and reset the signal.
-% \appendtoks
-% \to \everysetupdocument
+% \fontdimen1\nullfont 0\scaledpoint
+% \fontdimen2\nullfont 256377\scaledpoint
+% \fontdimen3\nullfont 128188\scaledpoint
+% \fontdimen4\nullfont 85459\scaledpoint
+% \fontdimen5\nullfont 338952\scaledpoint
+% \fontdimen6\nullfont 786432\scaledpoint
+% \fontdimen7\nullfont 85459\scaledpoint
+
+\fontslantperpoint \nullfont 0\scaledpoint
+\fontinterwordspace \nullfont 256377\scaledpoint
+\fontinterwordstretch\nullfont 128188\scaledpoint
+\fontinterwordshrink \nullfont 85459\scaledpoint
+\fontexheight \nullfont 338952\scaledpoint
+\fontemwidth \nullfont 786432\scaledpoint
+\fontextraspace \nullfont 85459\scaledpoint
+
+\fetchruntimecommand \showfontparameters {\f!fontprefix\s!run}
+
+\def\resetnullfont % this is needed because some macro packages (tikz) misuse \nullfont
+ {\dorecurse7{\fontdimen\recurselevel\nullfont\zeropoint}%
+ \ctxlua{fonts.definers.resetnullfont()}% in luatex 0.70 this will also do the previous
+ \globallet\resetnullfont\relax}
+
+\def\preloaddefaultfonts
+ {\resetpreloadfonts
+ \setupbodyfont[modern,\fontstyle,\fontbody]%
+ \showmessage\m!fonts6{fallback modern \fontstyle\normalspace\normalizedbodyfontsize}}
+
+\def\preloaddefaultfontsmm
+ {\writestatus\m!fonts{preloading latin modern fonts (math)}%
+ \definetypeface[\fontclass][\c!mm][\s!math][modern][\s!default]%
+ \showmessage\m!fonts6{fallback modern mm \normalizedbodyfontsize}}
+
+\def\preloaddefaultfontstt
+ {\writestatus\m!fonts{preloading latin modern fonts (mono)}%
+ \definetypeface[\fontclass][\c!tt][\s!mono][modern][\s!default]%
+ \showmessage\m!fonts6{fallback modern tt \normalizedbodyfontsize}}
+
+\def\resetpreloadfonts
+ {\glet\preloaddefaultfonts \relax
+ %\glet\preloaddefaultfontstt \relax
+ %\glet\preloaddefaultfontsmm \relax
+ \glet\zerostagepreloadfonts \relax
+ \glet\firststagepreloadfonts \relax
+ \glet\secondstagepreloadfonts\relax
+ %\glet\thirdstagepreloadfonts \relax
+ \glet\fourthstagepreloadfonts\relax
+ \global\everyhbox\emptytoks
+ \global\everyvbox\emptytoks
+ \resetnullfont}
+
+\def\resetcheckedfonts
+ {\glet\preloaddefaultfontstt \relax
+ \glet\preloaddefaultfontsmm \relax
+ \glet\thirdstagepreloadfonts \relax}
+
+\def\dozerostagepreloadfonts
+ {\definedfont[\s!file:lmmono10-regular sa 1]}
+
+\def\zerostagepreloadfonts
+ {\writestatus\m!fonts{beware: no fonts are loaded yet, using 'lm mono' in box}%
+ \glet\zerostagepreloadfonts\dozerostagepreloadfonts
+ \zerostagepreloadfonts}
-\newconditional\fontsareloaded
+\appendtoks
+ \everyhbox{\zerostagepreloadfonts}
+ \everyvbox{\zerostagepreloadfonts}
+\to \everydump
-\def\preloadfonts % never called, needs a clean up
- {\global\loadingfontsfalse
- \ifconditional\fontsareloaded \else
- \doifmodeelse {*nofonts}
- {\writestatus\m!fonts{latin modern fonts are not preloaded}}
- {\writestatus\m!fonts{preloading latin modern fonts}%
- \usetypescript[modern]%
- \setuptypeface[modern]%
- \showmessage\m!fonts6{\normalizedbodyfontsize\normalspace\fontstyle}}%
- \fi
- \global\let\preloadfonts\relax}
+\def\firststagepreloadfonts % see core-def.mkiv
+ {\doifmodeelse{*nofonts}
+ {\writestatus\m!fonts{latin modern fonts are not preloaded}}
+ {\preloaddefaultfonts
+ \writestatus\m!fonts{preloading latin modern fonts (first stage)}}}
-% maybe add this to \everystarttext
-%
-% \ifconditional\fontsareloaded\else
-% \usetypescript[modern]%
-% \setuptypeface[modern]%
-% \fi
+\def\secondstagepreloadfonts % see core-def.mkiv
+ {\writestatus\m!fonts{preloading latin modern fonts (second stage)}%
+ \preloaddefaultfonts}
+
+\def\thirdstagepreloadfonts % always
+ {\ifx\fontclass\empty
+ \writestatus\m!fonts{preloading latin modern fonts (third stage)}%
+ \preloaddefaultfonts
+ \else
+ \resetpreloadfonts
+ \pushmacro\fontstyle
+ \ifcsname\fontclass\c!mm\s!features\endcsname \else
+ \preloaddefaultfontsmm
+ \fi
+ \ifcsname\fontclass\c!tt\s!features\endcsname \else
+ \preloaddefaultfontstt
+ \fi
+ \popmacro\fontstyle
+ \resetcheckedfonts % reset third, mm and tt
+ \setupbodyfont[\fontstyle]%
+ \fi}
+
+\def\fourthstagepreloadfonts
+ {\begingroup
+ %ifzeropt\fontcharwd\font\number`!\relax
+ \setbox\scratchbox\hbox{context}%
+ \ifzeropt\wd\scratchbox
+ \writeline
+ \writestatus\m!fonts{!! No bodyfont has been defined and no defaults have been}%
+ \writestatus\m!fonts{!! loaded (maybe due to a missing \string\starttext).}%
+ \writeline
+ \fi
+ \resetpreloadfonts
+ \endgroup}
%D Here comes the main font switching macros. These macros
%D handle changes in size as well as returning to the global
@@ -1957,25 +2235,24 @@
\def\dosetfont#1#2% #1 = set/switch state
{\doifelse{#2}\v!global
{\restoreglobalbodyfont}
- {\processcommacommand[#2]{\dodosetfont{#1}}% ##1 get also passed
- \ifloadingfonts\else
- \global\settrue\fontsareloaded
+ {\processcommacommand[#2]{\dodocheckfontsize}%
+ \processcommacommand[#2]{\dodosetfont{#1}}%
+ \ifproductionrun
+ \thirdstagepreloadfonts
\doswitchpoints[\normalizedbodyfontsize]%
\doswitchstyle[\fontstyle]%
\ifx\defaultfontclass\empty
\let\defaultfontclass\fontclass
\fi
\fi}%
- \chardef\currentxfontsize\zerocount}
+ \currentxfontsize\zerocount}
+
+\def\dodocheckfontsize#1%
+ {\doifnumberelse{#1}{\checkbodyfontenvironment[#1]}\donothing}
\def\dodosetfont#1#2% #1 = set/switch state | check fo rempty, else space
{\doifsomething{#2}{\dododosetfont{#1}{#2}{\showmessage\m!fonts4{#2}}}}
-% % % this can be retrofitted in mkii code % % %
-
-% \def\normalizebodyfontsize#1\to#2%
-% {\@EA\@EA\@EA\donormalizedbodyfontsize\@EA\WITHOUTPT\the\dimexpr#1+\ifcase\fontdigits.5\or.05\or.005\fi\points\relax000\to#2}
-
\def\dododosetfont#1#2#3% #1 = set/switch state ! ! ! !could also be used for mkii
{\doifnumberelse{#2}\dodododosetfont\redododosetfont{#1}{#2}{#3}}
@@ -2009,7 +2286,7 @@
\fi\fi}
\def\dodododosetfont#1#2#3% #1 = set/switch state
- {\normalizebodyfontsize#2\to\normalizedsetfont
+ {\edef\normalizedsetfont{\thenormalizedbodyfontsize{#2}}%
\ifcsname\@size@\normalizedsetfont\endcsname \else
\defineunknownfont{#2}%
\fi
@@ -2020,14 +2297,6 @@
#3\dosetsubstitutefont{#1}{#2}%
\fi}
-% % %
-
-%D In the previous macros we use \type{\currentxfontsize} to
-%D hold the current x||size of the font. This enables us to
-%D support for instance \type{\sl} inside a \type{\tx} switch.
-
-\chardef\currentxfontsize=0
-
%D When users specify for instance a 13 point bodyfont while no
%D such bodyfont is defined, the system automatically tries to
%D find a best fit, that is the nearest smaller defined
@@ -2076,25 +2345,14 @@
\trycurrentfontclass{#1}%
\fi\fi\fi}
-\def\savefontclassparameters#1#2#3#4% #1=rm|ss|.. rscale features fallbacks
+\def\savefontclassparameters#1#2#3#4#5% #1=rm|ss|.. rscale features fallbacks goodies
{\setxvalue{\fontclass#1\s!rscale }{#2}%
\setxvalue{\fontclass#1\s!features }{#3}%
- \setxvalue{\fontclass#1\s!fallbacks}{#4}}
+ \setxvalue{\fontclass#1\s!fallbacks}{#4}%
+ \setxvalue{\fontclass#1\s!goodies }{#5}}
\settrue\autotypescripts
-% \def\trycurrentfontclass#1%
-% {\ifconditional\autotypescripts
-% \usetypescript[#1]%
-% \ifcsname\@fontclass@#1\endcsname
-% \edef\fontclass{#1}%
-% \else
-% \letvalue{\@no@fontclass@#1}\empty
-% \fi
-% \else
-% \letvalue{\@no@fontclass@#1}\empty
-% \fi}
-
\def\trycurrentfontclass#1%
{\ifconditional\autotypescripts
% try to load typescript #1
@@ -2110,12 +2368,12 @@
\edef\fontclass{#1}%
\else
% todo: message
- \letvalue{\@no@fontclass@#1}\empty
+ \letvalueempty{\@no@fontclass@#1}%
\fi
\fi
\else
% todo: message
- \letvalue{\@no@fontclass@#1}\empty
+ \letvalueempty{\@no@fontclass@#1}%
\fi}
\let\defaultfontstyle \c!rm
@@ -2131,7 +2389,7 @@
% 0=never 1=everymath 2=always
-\chardef\synchronizebigmathflag=1
+\setnewconstant\synchronizebigmathflag\plusone
\appendtoks
\ifcase\synchronizebigmathflag
@@ -2143,9 +2401,9 @@
\fi
\to \everymathematics
-\def\nobigmath {\chardef\synchronizebigmathflag\zerocount}
-\def\autobigmath{\chardef\synchronizebigmathflag\plusone\synchronizebigmath}
-\def\bigmath {\chardef\synchronizebigmathflag\plustwo\synchronizebigmath}
+\def\nobigmath {\synchronizebigmathflag\zerocount}
+\def\autobigmath{\synchronizebigmathflag\plusone\synchronizebigmath}
+\def\bigmath {\synchronizebigmathflag\plustwo\synchronizebigmath}
\let\bigmathfontsize\empty
@@ -2386,7 +2644,7 @@
%D used. Here we also set \type{\currentxfontsize}.
\def\dosetcurrentfontxxxalternative#1#2#3#4%
- {\chardef\currentxfontsize#2\relax
+ {\currentxfontsize#2\relax
\ifmmode
#4%
\else\ifcsname\bodyfontvariable{\normalizedbodyfontsize#3}\endcsname
@@ -2404,7 +2662,7 @@
\def\checknestedxfontsize % option
{\ifcase\currentxfontsize\else\ifx\fontsize\empty\else
- \chardef\currentxfontsize\zeropoint
+ \currentxfontsize\zerocount
\let\fontsize\empty
\let\tx\normaltx
\let\txx\normaltxx
@@ -2506,7 +2764,7 @@
{\bodyfontsize#1\relax
\dimensiontocount\bodyfontsize\bodyfontpoints % rounded, still used in m-chart
\edef\bodyfontfactor{\withoutpt\the\bodyfontsize}%
- \normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize
+ \edef\normalizedbodyfontsize{\thenormalizedbodyfontsize\bodyfontsize}%
\dosetbodyfontface \textface \s!text
\dosetbodyfontface \scriptface \s!script
\dosetbodyfontface \scriptscriptface \s!scriptscript}
@@ -2545,8 +2803,6 @@
% \newtoks \everysetupbodyfont
% \newtoks \everyswitchtobodyfont
-\chardef\bodyfontsetstate=0
-
\definecomplexorsimple\setupbodyfont
\def\simplesetupbodyfont
@@ -2557,9 +2813,9 @@
{\doifsomething{#1}
{\dosetfont1{#1}%
\globalbodyfontsize\localbodyfontsize
- \normalizebodyfontsize\globalbodyfontsize\to\normalizedglobalbodyfontsize
+ \edef\normalizedglobalbodyfontsize{\thenormalizedbodyfontsize\globalbodyfontsize}%
\let\globalfontstyle\fontstyle
- \ifloadingfonts\else
+ \ifproductionrun
\the\everybodyfont
\the\everyglobalbodyfont
\saveinterlinespace
@@ -2602,10 +2858,6 @@
% \installfontfeature[otf][tlig]
% \installfontfeature[otf][trep]
-%D tricky but ok:
-
-\appendtoks\ctxlua{fonts.tfm.cleanup()}\to\everyshipout
-
%D Todo:
% \def\os{\groupedcommand{\setfontfeature{oldstyle}}{}}
@@ -2617,52 +2869,94 @@
\def\dodefinefontfeature[#1][#2][#3]%
{\global\expandafter\chardef\csname\??fq=#1\endcsname % beware () needed as we get two values returned
- \ctxlua{tex.write((fonts.define.specify.preset_context("#1","#2","#3")))}\relax}
+ \ctxsprint{((fonts.specifiers.presetcontext("#1","#2","#3")))}\relax}
+
+\definefontfeature % experiment, this might move to the lua code
+ [always]
+ [mode=auto,
+ kern=yes,
+ mark=yes,
+ mkmk=yes,
+ curs=yes]
\definefontfeature
[default]
- [%mode=node,
- liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes
+ [always]
+ [liga=yes,
+ tlig=yes,
+ trep=yes] % texligatures=yes,texquotes=yes
\definefontfeature
[smallcaps]
- [%mode=node,liga=yes,
- smcp=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes
+ [always]
+ [smcp=yes,
+ tlig=yes,
+ trep=yes] % texligatures=yes,texquotes=yes
\definefontfeature
[oldstyle]
- [%mode=node,
- onum=yes,liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes
+ [always]
+ [onum=yes,
+ liga=yes,
+ tlig=yes,
+ trep=yes] % texligatures=yes,texquotes=yes
\definefontfeature % == default unless redefined
[ligatures]
- [%mode=node,
- liga=yes,kern=yes,tlig=yes,trep=yes]
+ [always]
+ [liga=yes,
+ tlig=yes,
+ trep=yes]
\definefontfeature % can be used for type1 fonts
[complete]
- [liga=yes,kern=yes,compose=yes,tlig=yes,trep=yes]
+ [always]
+ [compose=yes,
+ liga=yes,
+ tlig=yes,
+ trep=yes]
\definefontfeature
+ [none]
+ [mode=none,
+ features=no]
+
+\definefontfeature % might move
[arabic]
[mode=node,language=dflt,script=arab,ccmp=yes,
init=yes,medi=yes,fina=yes,isol=yes,
liga=yes,dlig=yes,rlig=yes,clig=yes,calt=yes,
mark=yes,mkmk=yes,kern=yes,curs=yes]
-\definefontfeature
- [none]
- [mode=none,features=no]
+\definefontfeature % might move
+ [simplearabic]
+ [mode=node,language=dflt,script=arab,
+ init=yes,medi=yes,fina=yes,calt=yes,
+ rlig=yes,curs=yes,mark=yes,mkmk=yes]
+
+% symbols:
\definefontfeature
- [virtualmath]
- [mode=base,liga=yes,kern=yes,tlig=yes,trep=yes]
+ [dingbats]
+ [mode=base,
+ goodies=dingbats,
+ unicoding=yes]
-% for the moment here, this will change but we need it for mk.tex
+% math:
-\definefontfeature[math-text] [virtualmath][ssty=no]
-\definefontfeature[math-script] [virtualmath][ssty=1,mathsize=yes]
-\definefontfeature[math-scriptscript][virtualmath][ssty=2,mathsize=yes]
+\definefontfeature
+ [virtualmath]
+ [mode=base,
+ liga=yes,
+ kern=yes,
+ tlig=yes,
+ trep=yes,
+ language=dflt,
+ script=math]
+
+\definefontfeature[math-text] [virtualmath][mathalternates=yes,ssty=no]
+\definefontfeature[math-script] [virtualmath][mathalternates=yes,ssty=1,mathsize=yes]
+\definefontfeature[math-scriptscript][virtualmath][mathalternates=yes,ssty=2,mathsize=yes]
\definefontfeature [math-nostack-text] [math-text] [nostackmath=yes]
\definefontfeature [math-nostack-script] [math-script] [nostackmath=yes]
@@ -2674,13 +2968,21 @@
%D Also new, handy for manuals:
-\unexpanded\def\fontchar#1{\ctxlua{fonts.char("#1")}}
-
-\let\otfchar\fontchar % will disappear, for compatibility only
-\let\afmchar\fontchar % will disappear, for compatibility only
+\unexpanded\def\fontchar#1{\ctxcommand{fontchar("#1")}}
%D: We cannot yet inherit because no colors are predefined.
+\definecolor[trace:0][s=.6]
+\definecolor[trace:1][r=.6]
+\definecolor[trace:2][g=.6]
+\definecolor[trace:3][b=.6]
+\definecolor[trace:4][r=.6,g=.6]
+\definecolor[trace:5][r=.6,b=.6]
+\definecolor[trace:6][g=.6,b=.6]
+\definecolor[trace:7][r=.8,g=.4]
+\definecolor[trace:8][r=.8,b=.4]
+\definecolor[trace:9][g=.4,b=.8]
+
\definecolor[font:init][r=.75]
\definecolor[font:medi][g=.75]
\definecolor[font:fina][b=.75]
@@ -2702,7 +3004,7 @@
{\dodoubleargument\dofontfeatureslist}
\def\dofontfeatureslist[#1][#2]% todo: arg voor type
- {\ctxlua{tex.sprint(tex.ctxcatcodes,fonts.define.specify.context_tostring("#1","otf","\luaescapestring{#2}","yes","no",true,{"number"}))}}
+ {\ctxsprint{fonts.specifiers.contexttostring("#1","otf","\luaescapestring{#2}","yes","no",true,{"number"})}}
\attribute\zerocount\zerocount % first in list, so fast match
@@ -2723,14 +3025,24 @@
%
% \typebuffer \getbuffer
-\def\featureattribute#1{\ctxlua{tex.sprint(fonts.define.specify.context_number("#1"))}}
-\def\setfontfeature #1{\edef\currentfeature{#1}\attribute\zerocount\featureattribute{#1}\relax}
-\def\resetfontfeature#1{\let\currentfeature\empty\attribute\zerocount\zerocount} % initial value
+% \unexpanded\def\featureattribute#1{\ctxsprint{fonts.specifiers.contextnumber("#1"))}}
+% \unexpanded\def\setfontfeature #1{\edef\currentfeature{#1}\attribute\zerocount\featureattribute{#1}\relax}
+% \unexpanded\def\resetfontfeature#1{\let\currentfeature\empty\attribute\zerocount\zerocount} % initial value
-\def\addfontfeaturetoset #1{\ctxlua{fonts.withset("#1", 1)}} % merge
-\def\subtractfontfeaturefromset #1{\ctxlua{fonts.withset("#1",-1)}} % merge
-\def\addfontfeaturetofont #1{\ctxlua{fonts.withfnt("#1", 2)}} % overload
-\def\subtractfontfeaturefromfont#1{\ctxlua{fonts.withfnt("#1",-2)}} % overload
+% \def\addfontfeaturetoset #1{\ctxlua{fonts.withset("#1", 1)}} % merge
+% \def\subtractfontfeaturefromset #1{\ctxlua{fonts.withset("#1",-1)}} % merge
+% \def\addfontfeaturetofont #1{\ctxlua{fonts.withfnt("#1", 2)}} % overload
+% \def\subtractfontfeaturefromfont#1{\ctxlua{fonts.withfnt("#1",-2)}} % overload
+
+\unexpanded\def\featureattribute#1{\ctxcommand{featureattribute("#1")}}
+\unexpanded\def\setfontfeature #1{\ctxcommand{setfontfeature("#1")}\edef\currentfeature{#1}}
+\unexpanded\def\resetfontfeature#1{\ctxcommand{resetfontfeature()}\let\currentfeature\empty} % initial value
+\unexpanded\def\resetfontfeature#1{\attribute\zerocount\zerocount\let\currentfeature\empty} % initial value
+
+\unexpanded\def\addfontfeaturetoset #1{\ctxcommand{addfs("#1")}} % merge
+\unexpanded\def\subtractfontfeaturefromset #1{\ctxcommand{subfs("#1")}} % merge
+\unexpanded\def\addfontfeaturetofont #1{\ctxcommand{addff("#1")}} % overload
+\unexpanded\def\subtractfontfeaturefromfont#1{\ctxcommand{subff("#1")}} % overload
\let\setff\setfontfeature
\let\addfs\addfontfeaturetoset
@@ -2842,7 +3154,7 @@
\def\fullrestoreglobalbodyfont
{\let\fontsize\defaultfontsize
\let\fontbody\defaultfontbody
- \chardef\currentxfontsize\zerocount
+ \currentxfontsize\zerocount
\let\fontclass\globalfontclass
\doswitchpoints[\normalizedglobalbodyfontsize]%
\doswitchstyle[\globalfontstyle]%
@@ -2855,7 +3167,7 @@
\def\partialrestoreglobalbodyfont
{\let\fontsize\defaultfontsize
\let\fontbody\defaultfontbody
- \chardef\currentxfontsize\zerocount
+ \currentxfontsize\zerocount
\redoconvertfont
\tf
\the\everybodyfont % indeed needed
@@ -2939,17 +3251,44 @@
%D text and headings, which is accomplished by assigning both
%D arguments.
+% \def\dodefinealternativestyle[#1][#2][#3]%
+% {\def\docommand##1%
+% {\ifcsname##1\endcsname\else\setuvalue{##1}{\groupedcommand{#2}{}}\fi
+% \setvalue{\@letter@ ##1}{#2}%
+% \setvalue{\@noletter@##1}{#3}}%
+% \processcommalist[#1]\docommand}
+
+\setnewconstant \currentalternativestyleindex \plusone
+
+\def\dododefinealternativestyle#1#2#3%
+ {\ifcsname#3\endcsname
+ % no redefinition
+ \else
+ \setuvalue{#3}{\groupedcommand{#1}{}}%
+ \fi
+ \setvalue{\??ft:as:#3}{\doapplyalternativestyle{#1}{#2}}}%
+
\def\dodefinealternativestyle[#1][#2][#3]%
- {\def\docommand##1%
- {\ifcsname##1\endcsname\else\setuvalue{##1}{\groupedcommand{#2}{}}\fi
- \setvalue{\@letter@ ##1}{#2}%
- \setvalue{\@noletter@##1}{#3}}%
- \processcommalist[#1]\docommand}
+ {\processcommalist[#1]{\dododefinealternativestyle{#2}{#3}}} % also gets {##1}
+
+\def\applyalternativestyle#1%
+ {\ifcsname\??ft:as:#1\endcsname\csname\??ft:as:#1\expandafter\endcsname\fi}
+
+\def\doapplyalternativestyle
+ {\ifcase\currentalternativestyleindex
+ \expandafter\gobbletwoarguments
+ \or
+ \expandafter\firstoftwoarguments
+ \or
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
\unexpanded\def\definealternativestyle
{\dotripleempty\dodefinealternativestyle}
-\unexpanded\def\definestyle{\definealternativestyle}
+\unexpanded\def\definestyle{\definealternativestyle} % later redefined
%D Maybe too geneneric, but probably ok is the following. (Maybe one
%D day we will use a dedicated grouped command for styles.)
@@ -3005,51 +3344,74 @@
%D conversion by saying \type{\redoconvertfont}.
% subtle ... \expandafter is needed else problems with lookahead caps
-
-\def\@@dodoconvertfont{\csname\@letter@ \p!defined\expandafter\endcsname\gobbleoneargument}
-\def\@@donoconvertfont{\csname\@noletter@\p!defined\endcsname}
-\def\@@redoconvertfont{\csname \p!defined\expandafter\endcsname\gobbleoneargument}
-
+%
+% this will be cleaned up
+%
% beware: p!defined can contain crap like \edef crap {...} and such
-% so we need to pass #1 as well
-
-\unexpanded\def\dodoconvertfont#1% #2% we need the protection
- {\edef\p!defined{#1}%
- \ifx\p!defined\empty\else
- \@EA\dododoconvertfont
- \fi{#1}}
-
-\def\dododoconvertfont % #1
- {\ifcsname\@letter@\detokenize\@EA{\p!defined}\endcsname
- \@EA\@@dodoconvertfont
- \else\ifcsname\detokenize\@EA{\p!defined}\endcsname
- \@EAEAEA\@@redoconvertfont
- \else
- \@EAEAEA\firstofoneargument
- \fi\fi} % {#1}
+% so we need to pass #1 as well .. no longer needed in luatex
-\let\doconvertfont\dodoconvertfont
+% \def\@@dodoconvertfont{\csname\@letter@ \p!defined\expandafter\endcsname\gobbleoneargument}
+% \def\@@donoconvertfont{\csname\@noletter@\p!defined\endcsname}
+% \def\@@redoconvertfont{\csname \p!defined\expandafter\endcsname\gobbleoneargument}
+%
+% \unexpanded\def\dodoconvertfont#1% #2% we need the protection
+% {\edef\p!defined{#1}%
+% \ifx\p!defined\empty\else
+% \@EA\dododoconvertfont
+% \fi{#1}}
+%
+% \def\dododoconvertfont % #1 (detokenize no longer needed in luatex)
+% {\ifcsname\@letter@\detokenize\@EA{\p!defined}\endcsname
+% \@EA\@@dodoconvertfont
+% \else\ifcsname\detokenize\@EA{\p!defined}\endcsname
+% \@EAEAEA\@@redoconvertfont
+% \else
+% \@EAEAEA\firstofoneargument
+% \fi\fi} % {#1}
+%
+% \let\doconvertfont\dodoconvertfont
+%
+% \unexpanded\def\noconvertfont#1% #2%
+% {\edef\p!defined{#1}%
+% \ifx\p!defined\empty
+% \else
+% \@EA\nononoconvertfont
+% \fi}
+%
+% \def\nononoconvertfont
+% {\ifcsname\@noletter@\detokenize\@EA{\p!defined}\endcsname
+% \@EA\@@donoconvertfont
+% \fi}
+%
+% %D Extras:
+%
+% \unexpanded\def\dontconvertfont{\let\doconvertfont\noconvertfont}
+% \unexpanded\def\redoconvertfont{\let\doconvertfont\dodoconvertfont}
-\unexpanded\def\noconvertfont#1% #2%
- {\edef\p!defined{#1}%
- \ifx\p!defined\empty
- \else
- \@EA\nononoconvertfont
- \fi}
+%D These commands are not grouped! Grouping is most probably
+%D done by the calling macro's and would lead to unnecessary
+%D overhead.
-\def\nononoconvertfont
- {\ifcsname\@noletter@\detokenize\@EA{\p!defined}\endcsname
- \@EA\@@donoconvertfont
+\unexpanded\def\doconvertfont#1% #2% we need the protection
+ {\edef\currentconvertfont{#1}%
+ \ifx\currentconvertfont\empty \else
+ \@EA\dodoconvertfont
\fi}
-%D Extras:
+\def\dodoconvertfont
+ {\edef\dtcurrentconvertfont{\detokenize\@EA{\currentconvertfont}}%
+ \ifcsname\??ft:as:\dtcurrentconvertfont\endcsname
+ \csname\??ft:as:\dtcurrentconvertfont\expandafter\endcsname
+ \else\ifcsname\dtcurrentconvertfont\endcsname
+ \csname\dtcurrentconvertfont\expandafter\endcsname
+ \else
+ \@EAEAEA\currentconvertfont
+ \fi\fi}
-\unexpanded\def\dontconvertfont{\let\doconvertfont\noconvertfont}
-\unexpanded\def\redoconvertfont{\let\doconvertfont\dodoconvertfont}
+%D Low level switches (downward compatible):
-%D These commands are not grouped! Grouping is most probably
-%D done by the calling macro's and would lead to unnecessary
-%D overhead.
+\unexpanded\def\dontconvertfont{\currentalternativestyleindex\plustwo}
+\unexpanded\def\redoconvertfont{\currentalternativestyleindex\plusone}
%D \macros
%D {em,emphasistypeface,emphasisboldface}
@@ -3093,12 +3455,38 @@
\getvalue\emphasizedtypeface
\fi\fi\fi}
-\def\emphasistypeface{\doemphasistypeface\sl\it}
-\def\emphasisboldface{\doemphasistypeface\bs\bi}
+\unexpanded\def\emphasistypeface{\doemphasistypeface\sl\it}
+\unexpanded\def\emphasisboldface{\doemphasistypeface\bs\bi}
+
+\unexpanded\def\normalboldface
+ {\relax\ifx\fontalternative\c!it \bi
+ \else \ifx\fontalternative\c!sl \bs
+ \else \bf \fi\fi}
+
+\unexpanded\def\normaltypeface
+ {\relax
+ \ifx\fontalternative\c!bi \it \else
+ \ifx\fontalternative\c!bs \sl \else
+ \tf \fi\fi}
+
+\unexpanded\def\swaptypeface
+ {\relax
+ \ifx\fontalternative\c!it \tf \else
+ \ifx\fontalternative\c!sl \tf \else
+ \ifx\fontalternative\c!bf \emphasisboldface \else
+ \ifx\fontalternative\c!bs \bf \else
+ \ifx\fontalternative\c!bi \bf \else
+ \emphasistypeface \fi\fi\fi\fi\fi}
+
+\let\typeface\normaltypeface
+\let\boldface\normalboldface
+\let\swapface\swaptypeface
%D To be set with the default body font environment: \type
%D {em} being \type {slanted} or \type {italic}.
+% maybe a \csname...\fontalternative\endcsname
+
\newconditional\emneeded
\newtoks\everyemphasized
@@ -3125,8 +3513,7 @@
\emphasistypeface
\fi\fi\fi\fi\fi
\the\everyemphasized
- \ifconditional\emneeded\relax
- \else
+ \ifconditional\emneeded\else
\expandafter\aftergroup
\fi
\emphasiscorrection}
@@ -3137,7 +3524,7 @@
% \setupbodyfontenvironment [default] [em={\italic\color[red]}]
%D The next feature was not present in previous versions. It
-%D takes care of \type {\em \bf ...} sitiations.
+%D takes care of \type {\em \bf ...} situations.
\def\setemphasisboldface
{\let\savedemphasisboldface\bf
@@ -3161,10 +3548,10 @@
\let\italiccorrection=\/ % tex primitive
-\def\emphasiscorrection
- {\ifhmode
- \expandafter\emphasislook
- \fi}
+\def\emphasiscorrection % not in raw alignment groups, else omit problem
+ {\ifhmode\ifnum\currentgrouptype=\@@aligngroup\else
+ \expandafter\expandafter\expandafter\emphasislook
+ \fi\fi}
\def\emphasislook
{\begingroup
@@ -3284,7 +3671,7 @@
%D The implementation is rather straightforward in using
%D \type{\halign}.
-\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run.mkiv}
+\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run}
%D \macros
%D {showfontstrip, testminimalbaseline, showminimalbaseline}
@@ -3295,9 +3682,9 @@
%D
%D \showfontstrip \blank \showminimalbaseline
-\fetchruntimecommand \showfontstrip {\f!fontprefix\s!run.mkiv}
-\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run.mkiv}
-\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run.mkiv}
+\fetchruntimecommand \showfontstrip {\f!fontprefix\s!run}
+\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run}
+\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run}
%D \macros
%D {showkerning}
@@ -3306,7 +3693,7 @@
%D
%D \showkerning{Can you guess what kerning is?}
-\fetchruntimecommand \showkerning {\f!fontprefix\s!run.mkiv}
+\fetchruntimecommand \showkerning {\f!fontprefix\s!run}
%D \macros
%D {showbodyfontenvironment}
@@ -3319,7 +3706,7 @@
%D
%D \showsetup{showbodyfontenvironment}
-\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run.mkiv}
+\fetchruntimecommand \showbodyfontenvironment {\f!fontprefix\s!run}
%D \macros
%D {showfont,showfontstyle,showligatures}
@@ -3335,11 +3722,11 @@
% to be internationalized
-\fetchruntimecommand \showfont {\f!fontprefix\s!run.mkiv}
-\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run.mkiv}
-\fetchruntimecommand \showligature {\f!fontprefix\s!run.mkiv}
-\fetchruntimecommand \showligatures {\f!fontprefix\s!run.mkiv}
-\fetchruntimecommand \showcharratio {\f!fontprefix\s!run.mkiv}
+\fetchruntimecommand \showfont {\f!fontprefix\s!run}
+\fetchruntimecommand \showfontstyle {\f!fontprefix\s!run}
+\fetchruntimecommand \showligature {\f!fontprefix\s!run}
+\fetchruntimecommand \showligatures {\f!fontprefix\s!run}
+\fetchruntimecommand \showcharratio {\f!fontprefix\s!run}
%D \macros
%D {getglyph, symbolicfont}
@@ -3437,36 +3824,90 @@
\let\thedefinedfont\relax
-\def\symbolicsizedfont#1#2#3%
- {\scaledfontsize#1%
- \scaledfontsize#2\scaledfontsize
- \font\thedefinedfont=\truefontname{\glyphfontfile{#3}} at \currentfontbodyscale\scaledfontsize\relax
- \thedefinedfont}
+% \def\symbolicsizedfont#1#2#3%
+% {\scaledfontsize#1%
+% \scaledfontsize#2\scaledfontsize
+% \font\thedefinedfont=\truefontname{\glyphfontfile{#3}} at \currentfontbodyscale\scaledfontsize\relax
+% \thedefinedfont}
+%
+% \def\symbolicscaledfont
+% {\symbolicsizedfont\fontbody}
+%
+% \unexpanded\def\symbolicfont
+% {\symbolicsizedfont\fontbody\plusone}
+%
+% \unexpanded\def\getglyph#1#2% slow, faster, much faster
+% %{{\definefont[\s!dummy][\glyphfontfile{#1} sa \currentfontscale]\dummy#2}}
+% %{{\definefont[\s!dummy][\glyphfontfile{#1} sa *]\dummy#2}}
+% %{{\symbolicfont{#1}#2}}
+% {{\symbolicfont{#1}\doifnumberelse{#2}\char\donothing#2}}
+%
+% \unexpanded\def\getscaledglyph#1#2#3%
+% {{\symbolicscaledfont{#1}{#2}\doifnumberelse{#3}\char\donothing#3}}
+%
+% \unexpanded\def\getrawglyph#1#2% for simple symbols
+% {{\scaledfontsize\fontbody
+% \font\thedefinedfont=#1 at \currentfontbodyscale\scaledfontsize\relax
+% \thedefinedfont\doifnumberelse{#2}\char\donothing#2}}
+%
+% \unexpanded\def\getfontchar#1#2%
+% {{\symbolicfont{#1}\fontchar{#2}}}
+
+\def\setscaledstyledsymbolicfont#1#2#3% quite a slowdown, glyphfontfile
+ {\edef\askedsymbolfont{\truefontname{\glyphfontfile{#3}} at \the\dimexpr#2\dimexpr\currentfontbodyscale\dimexpr#1}%
+ \ifcsname\??ss->\askedsymbolfont\endcsname
+ \csname\??ss->\askedsymbolfont\endcsname
+ \else
+ \dodefinesymbolicfont
+ \fi}
+
+\def\setscaleddirectsymbolicfont#1#2#3% quite a slowdown, glyphfontfile
+ {\edef\askedsymbolfont{\truefontname{#3} at \the\dimexpr#2\dimexpr\currentfontbodyscale\dimexpr#1}%
+ \ifcsname\??ss->\askedsymbolfont\endcsname
+ \csname\??ss->\askedsymbolfont\endcsname
+ \else
+ \dodefinesymbolicfont
+ \fi}
+
+\def\setstyledsymbolicfont#1% quite a slowdown, glyphfontfile
+ {\edef\askedsymbolfont{\truefontname{\glyphfontfile{#1}} at \the\dimexpr\currentfontbodyscale\dimexpr\fontbody}%
+ \ifcsname\??ss->\askedsymbolfont\endcsname
+ \csname\??ss->\askedsymbolfont\endcsname
+ \else
+ \dodefinesymbolicfont
+ \fi}
-\def\symbolicscaledfont
- {\symbolicsizedfont\fontbody}
+\def\setdirectsymbolicfont#1%
+ {\edef\askedsymbolfont{\truefontname{#1} at \the\dimexpr\currentfontbodyscale\dimexpr\fontbody}%
+ \ifcsname\??ss->\askedsymbolfont\endcsname
+ \csname\??ss->\askedsymbolfont\endcsname
+ \else
+ \dodefinesymbolicfont
+ \fi}
-\unexpanded\def\symbolicfont
- {\symbolicsizedfont\fontbody\plusone}
+\def\dodefinesymbolicfont
+ {\definefont[currentsymbolfont][\askedsymbolfont]%
+ \currentsymbolfont
+ \global\expandafter\let\csname\??ss->\askedsymbolfont\endcsname\lastrawfontcall}
-\unexpanded\def\getglyph#1#2% slow, faster, much faster
- %{{\definefont[\s!dummy][\glyphfontfile{#1} sa \currentfontscale]\dummy#2}}
- %{{\definefont[\s!dummy][\glyphfontfile{#1} sa *]\dummy#2}}
- %{{\symbolicfont{#1}#2}}
- {{\symbolicfont{#1}\doifnumberelse{#2}\char\donothing#2}}
+\unexpanded\def\getnamedglyphstyled#1#2{{\setstyledsymbolicfont{#1}\ctxcommand{fontchar("#2")}}}
+\unexpanded\def\getnamedglyphdirect#1#2{{\setdirectsymbolicfont{#1}\ctxcommand{fontchar("#2")}}}
+\unexpanded\def\getglyphstyled #1#2{{\setstyledsymbolicfont{#1}\doifnumberelse{#2}\char\donothing#2}}
+\unexpanded\def\getglyphdirect #1#2{{\setdirectsymbolicfont{#1}\doifnumberelse{#2}\char\donothing#2}}
+\unexpanded\def\getscaledglyph #1#2#3{{\setscaledstyledsymbolicfont{#1}{#2}\doifnumberelse{#3}\char\donothing#3}}
-\unexpanded\def\getscaledglyph#1#2#3%
- {{\symbolicscaledfont{#1}{#2}\doifnumberelse{#3}\char\donothing#3}}
+\let\getglyph \getglyphstyled % old
+\let\getrawglyph \getglyphdirect % old
+\let\symbolicsizedfont\setscaledstyledsymbolicfont % old
+\let\symbolicfont \setstyledsymbolicfont % old
-\unexpanded\def\getrawglyph#1#2% for simple symbols
- {{\scaledfontsize\fontbody
- \font\thedefinedfont=#1 at \currentfontbodyscale\scaledfontsize\relax
- \thedefinedfont\doifnumberelse{#2}\char\donothing#2}}
+\unexpanded\def\symbolicscaledfont{\setsscaledstyledsymbolicfont\fontbody}
+\unexpanded\def\symbolicscaledfont{\setscaledstyledsymbolicfont\fontbody}
%D The last implementation of \type {\getglyph} permits
%D definitions like:
%D
-%D \starttyping
+%D \starttypings
%D \definefontsynonym [EuroSans] [eurose]
%D \definefontsynonym [EuroSansBold] [euroseb]
%D \definefontsynonym [EuroSansItalic] [eurosei]
@@ -3693,24 +4134,43 @@
\definefontsize[\c!a] \definefontsize[\c!b]
\definefontsize[\c!c] \definefontsize[\c!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!small,\v!smallnormal] [\tfx] []
-\definealternativestyle [\v!smallbold] [\bfx] []
-\definealternativestyle [\v!smalltype] [\ttx] []
-\definealternativestyle [\v!smallslanted] [\slx] []
-\definealternativestyle [\v!smallboldslanted,\v!smallslantedbold] [\bsx] []
-\definealternativestyle [\v!smallbolditalic,\v!smallitalicbold] [\bix] []
-
-\definealternativestyle [\v!sans,\v!sansserif] [\ss] []
-\definealternativestyle [\v!sansbold] [\ss\bf] []
+\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!small,\v!smallnormal] [\tfx] []
+% \definealternativestyle [\v!smallbold] [\bfx] []
+% \definealternativestyle [\v!smalltype] [\ttx] []
+% \definealternativestyle [\v!smallslanted] [\slx] []
+% \definealternativestyle [\v!smallboldslanted,\v!smallslantedbold] [\bsx] []
+% \definealternativestyle [\v!smallbolditalic,\v!smallitalicbold] [\bix] []
+
+\definealternativestyle [\v!small,\v!smallnormal] [\setsmallbodyfont\tf] []
+\definealternativestyle [\v!smallbold] [\setsmallbodyfont\bf] []
+\definealternativestyle [\v!smalltype] [\setsmallbodyfont\tt] []
+\definealternativestyle [\v!smallslanted] [\setsmallbodyfont\sl] []
+\definealternativestyle [\v!smallboldslanted,\v!smallslantedbold] [\setsmallbodyfont\bs] []
+\definealternativestyle [\v!smallbolditalic,\v!smallitalicbold] [\setsmallbodyfont\bi] []
+
+\definealternativestyle [\v!bigger] [\setbigbodyfont \tf] []
+\definealternativestyle [\v!smaller] [\setsmallbodyfont\tf] []
+
+\definealternativestyle [\v!sans,\v!sansserif] [\ss] []
+\definealternativestyle [\v!sansbold] [\ss\bf] []
+
+%D We can go on and on and on:
+%D
+%D \starttyping
+%D \setupbodyfontenvironment[default][p=0.8,q=0.6]
+%D \definefontsize[p]
+%D \definefontsize[q]
+%D \stoptyping
%D Slow but handy:
@@ -3774,15 +4234,83 @@
%D New commands (not yet interfaced):
-\def\style[#1]% for inline usage, like \color
- {\groupedcommand{\ifcsname#1\endcsname\csname#1\endcsname\else\definedfont[#1]\fi}{}}
+% \def\style[#1]% for inline usage, like \color
+% {\groupedcommand{\ifcsname#1\endcsname\csname#1\endcsname\else\definedfont[#1]\fi}{}}
+%
+% \unexpanded\def\startstyle[#1]%
+% {\begingroup
+% \ifcsname#1\endcsname\csname#1\endcsname\else\definedfont[#1]\fi}
+%
+% \unexpanded\def\stopstyle
+% {\endgroup}
+
+% definitions
+
+\def\definestyle
+ {\dotripleargument\dodefinestyle}
+
+\def\dodefinestyle[#1][#2][#3]%
+ {\doifassignmentelse{#2}\dododefinestyle\definealternativestyle[#1][#2][#3]}
+
+\def\dododefinestyle[#1][#2][#3]% no commalist and for the moment #3 is ignored
+ {\getparameters[\??cf:#1][\c!style=,\c!color=,#2]%
+ \setuvalue{\e!start#1}{\begingroup\dostartattributes{\??cf:#1}\c!style\c!color}%
+ \setuvalue{\e!stop #1}{\dostopattributes\endgroup}%
+ \setuvalue {#1}{\groupedcommand{\dostartattributes{\??cf:#1}\c!style\c!color}\dostopattributes}}
+
+\def\setupstyle
+ {\dotripleargument\dosetupstyle}
+
+\def\dosetupstyle[#1][#2][#3]% no commalist and for the moment #3 is ignored
+ {\ifcsname\??cf:#1\c!style\endcsname
+ \getparameters[\??cf:#1][#2]%
+ \else
+ \getparameters[\??cf:#1][\c!style=,\c!color=,#2]% so we define but without commands (todo for all define related things)
+ \fi}
+
+% commands
+
+\unexpanded\def\style[#1]%
+ {\csname\ifcsname#1\endcsname n\else\ifcsname\??cf:#1\c!style\endcsname c\else d\fi\fi ostyle\endcsname{#1}}
+
+\def\nostyle#1{\csname#1\endcsname}
+\def\costyle#1{\groupedcommand{\dostartattributes{\??cf:#1}\c!style\c!color}\dostopattributes}
+\def\dostyle#1{\doifassignmentelse{#1}\dostyleassignment\dostyledirect{#1}}
+
+\def\dostyleassignment#1%
+ {\groupedcommand
+ {\getparameters[\??cf][\c!style=,\c!color=,#1]%
+ \dostartattributes\??cf\c!style\c!color}
+ {\dostopattributes}}
+
+\def\dostyledirect#1%
+ {\groupedcommand
+ {\definedfont[#1]}
+ {}}
+
+% environments
\unexpanded\def\startstyle[#1]%
{\begingroup
- \ifcsname#1\endcsname\csname#1\endcsname\else\definedfont[#1]\fi}
+ \csname\ifcsname#1\endcsname n\else\ifcsname\??cf:#1\c!style\endcsname c\else d\fi\fi ostyless\endcsname{#1}}
\unexpanded\def\stopstyle
- {\endgroup}
+ {\dostopstyle
+ \endgroup
+ \autoinsertnextspace} % will be configurable, maybe also in \definestartstop
+
+\def\nostyless#1{\let\dostopstyle\donothing\csname#1\endcsname}
+\def\costyless#1{\let\dostopstyle\dostopattributes\dostartattributes{\??cf:#1}\c!style\c!color}
+\def\dostyless#1{\doifassignmentelse{#1}\dostylessassignment\dostylessdirect{#1}}
+
+\def\dostylessassignment#1%
+ {\let\dostopstyle\dostopattributes
+ \getparameters[\??cf][\c!style,\c!color=,#1]%
+ \dostartattributes\??cf\c!style\c!color}
+
+\def\dostylessdirect#1%
+ {\let\dostopstyle\donothing
+ \definedfont[#1]\relax}
%D Still experimental (might even go away).
@@ -3820,7 +4348,7 @@
\else\ifthirdargument
\setvalue{\??sx#1::#2}{#3}%
\else\ifsecondargument
- \letvalue{\??sx#1::#2}\empty
+ \letvalueempty{\??sx#1::#2}%
\fi\fi\fi}
\unexpanded\def\styleinstance[#1]% will be made faster
@@ -3847,8 +4375,8 @@
%D goodies:
-\def\showchardata#1{\ctxlua{fonts.show_char_data("#1")}}
-\def\showfontdata {\ctxlua{fonts.show_font_parameters()}}
+\unexpanded\def\showchardata#1{\ctxcommand{showchardata("#1")}}
+\unexpanded\def\showfontdata {\ctxcommand{showfontparameters()}}
%D some low level helpers
%D
@@ -3869,28 +4397,18 @@
% we can also move the lookups to the fonts.namespace (of commands)
-\def\dolookupfontbyspec #1{\ctxlua{fonts.names.lookup("#1")}}
-\def\dolookupnoffound {\ctxlua{tex.write(fonts.names.noflookups())}}
-\def\dolookupgetkeyofindex#1#2{\ctxlua{tex.write(fonts.names.getlookupkey("#1",#2))}}
-\def\dolookupgetkey #1{\ctxlua{tex.write(fonts.names.getlookupkey("#1"))}}
-\def\cleanfontname #1{\ctxlua{fonts.cleanname("#1")}}
-
-\protect \endinput
-
-% \startluacode
-% function commands.doifelsecurrentfonthasfeature(name)
-% local f = fonts.ids[font.current()]
-% f = f and f.shared
-% f = f and f.otfdata
-% f = f and f.luatex
-% f = f and f.features
-% commands.doifelse(f and (f.gpos[name] or f.gsub[name]))
-% end
-% \stopluacode
-
-% \def\doifelsecurrentfonthasfeature#1%
-% {\ctxlua{commands.doifelsecurrentfonthasfeature("#1")}}
+\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")}}
% \doifelsecurrentfonthasfeature{smcp}{YES}{NO}
% \doifelsecurrentfonthasfeature{crap}{YES}{NO}
% \doifelsecurrentfonthasfeature{kern}{YES}{NO}
+
+\def\doifelsecurrentfonthasfeature#1%
+ {\ctxcommand{doifelsecurrentfonthasfeature("#1")}}
+
+\protect \endinput
+
diff --git a/Master/texmf-dist/tex/context/base/font-ldr.lua b/Master/texmf-dist/tex/context/base/font-ldr.lua
new file mode 100644
index 00000000000..ca4e3f98a3d
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/font-ldr.lua
@@ -0,0 +1,70 @@
+if not modules then modules = { } end modules ['font-ldr'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This module provides a replacement for fontloader.to_table
+-- and will be loaded in due time.
+
+local fields = fontloader.fields
+
+if fields then
+
+ local glyphfields
+
+ local function get_glyphs(r)
+ local t = { }
+ local g = r.glyphs
+ for i=1,r.glyphmax-1 do
+ local gi = g[i]
+ if gi then
+ if not glyphfields then
+ glyphfields = fields(gi)
+ end
+ local h = { }
+ for i=1,#glyphfields do
+ local s = glyphfields[i]
+ h[s] = gi[s]
+ end
+ t[i] = h
+ end
+ end
+ return t
+ end
+
+ local function to_table(r)
+ local f = fields(r)
+ if f then
+ local t = { }
+ for i=1,#f do
+ local fi = f[i]
+ local ri = r[fi]
+ if not ri then
+ -- skip
+ elseif fi == "glyphs" then
+ t.glyphs = get_glyphs(r)
+ elseif fi == "subfonts" then
+ t[fi] = ri
+ ri.glyphs = get_glyphs(ri)
+ else
+ t[fi] = r[fi]
+ end
+ end
+ return t
+ end
+ end
+
+ -- currently glyphs, subfont-glyphs and the main table are userdata
+
+ function fonts.to_table(raw)
+ return to_table(raw)
+ end
+
+else
+
+ fonts.to_table = fontloader.to_table
+
+end
diff --git a/Master/texmf-dist/tex/context/base/font-log.lua b/Master/texmf-dist/tex/context/base/font-log.lua
index 97cb4ff7c1a..8bc12a2159a 100644
--- a/Master/texmf-dist/tex/context/base/font-log.lua
+++ b/Master/texmf-dist/tex/context/base/font-log.lua
@@ -8,9 +8,16 @@ if not modules then modules = { } end modules ['font-log'] = {
local next, format, lower, concat = next, string.format, string.lower, table.concat
-local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+local report_defining = logs.reporter("fonts","defining")
-fonts.logger = fonts.logger or { }
+local basename = file.basename
+
+local fonts = fonts
+local loggers = { }
+fonts.loggers = loggers
+local usedfonts = utilities.storage.allocate()
+----- loadedfonts = utilities.storage.allocate()
--[[ldx--
<p>The following functions are used for reporting about the fonts
@@ -19,40 +26,55 @@ we now have several readers it may be handy to know what reader is
used for which font.</p>
--ldx]]--
-function fonts.logger.save(tfmtable,source,specification) -- save file name in spec here ! ! ! ! ! !
- if tfmtable and specification and specification.specification then
- local name = lower(specification.name)
- if trace_defining and not fonts.used[name] then
- logs.report("define font","registering %s as %s (used: %s)",file.basename(specification.name),source,file.basename(specification.filename))
+function loggers.onetimemessage(font,char,message,reporter)
+ local tfmdata = fonts.hashes.identifiers[font]
+ local shared = tfmdata.shared
+ local messages = shared.messages
+ if not messages then
+ messages = { }
+ shared.messages = messages
+ end
+ local category = messages[message]
+ if not category then
+ category = { }
+ messages[message] = category
+ end
+ if not category[char] then
+ if not reporter then
+ reporter = report_defining
end
- specification.source = source
- fonts.loaded[lower(specification.specification)] = specification
- -- fonts.used[name] = source
- fonts.used[lower(specification.filename or specification.name)] = source
+ reporter("char U+%05X in font '%s' with id %s: %s",char,tfmdata.properties.fullname,font,message)
+ category[char] = true
end
end
-function fonts.logger.report(complete)
- local t = { }
- for name, used in table.sortedhash(fonts.used) do
- if complete then
- t[#t+1] = used .. "->" .. file.basename(name)
- else
- t[#t+1] = file.basename(name)
+function loggers.register(tfmdata,source,specification) -- save file name in spec here ! ! ! ! ! !
+ if tfmdata and specification and specification.specification then
+ local name = lower(specification.name)
+ if trace_defining and not usedfonts[name] then
+ report_defining("registering %s as %s (used: %s)",file.basename(specification.name),source,file.basename(specification.filename))
end
+ specification.source = source
+ -- loadedfonts[lower(specification.specification)] = specification
+ usedfonts[lower(specification.filename or specification.name)] = source
end
- return t
end
-function fonts.logger.format(name)
- return fonts.used[name] or "unknown"
+function loggers.format(name) -- should be avoided
+ return usedfonts[name] or "unknown"
end
statistics.register("loaded fonts", function()
- if next(fonts.used) then
- local t = fonts.logger.report()
- return (#t > 0 and format("%s files: %s",#t,concat(t,separator or " "))) or "none"
- else
- return nil
+ if next(usedfonts) then
+ local t, n = { }, 0
+ for name, used in table.sortedhash(usedfonts) do
+ n = n + 1
+ if complete then
+ t[n] = used .. "->" .. basename(name)
+ else
+ t[n] = basename(name)
+ end
+ end
+ return (n > 0 and format("%s files: %s",n,concat(t," "))) or "none"
end
end)
diff --git a/Master/texmf-dist/tex/context/base/font-lua.lua b/Master/texmf-dist/tex/context/base/font-lua.lua
new file mode 100644
index 00000000000..48ce3c2f53c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/font-lua.lua
@@ -0,0 +1,46 @@
+if not modules then modules = { } end modules ['font-lua'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+
+local report_lua = logs.reporter("fonts","lua loading")
+
+local fonts = fonts
+local readers = fonts.readers
+fonts.formats.lua = "lua"
+
+-- we could add support for features here
+
+local function check_lua(specification,fullname)
+ -- standard tex file lookup
+ local fullname = resolvers.findfile(fullname) or ""
+ if fullname ~= "" then
+ local loader = loadfile(fullname)
+ loader = loader and loader()
+ return loader and loader(specification)
+ end
+end
+
+readers.check_lua = check_lua
+
+function readers.lua(specification)
+ local original = specification.specification
+ if trace_defining then
+ report_lua("using lua reader for '%s'",original)
+ end
+ local fullname = specification.filename or ""
+ if fullname == "" then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ fullname = specification.name .. "." .. forced
+ else
+ fullname = specification.name
+ end
+ end
+ return check_lua(specification,fullname)
+end
diff --git a/Master/texmf-dist/tex/context/base/font-map.lua b/Master/texmf-dist/tex/context/base/font-map.lua
index 299508764a1..76733adeac6 100644
--- a/Master/texmf-dist/tex/context/base/font-map.lua
+++ b/Master/texmf-dist/tex/context/base/font-map.lua
@@ -6,15 +6,18 @@ if not modules then modules = { } end modules ['font-map'] = {
license = "see context related readme files"
}
-local utf = unicode.utf8
local match, format, find, concat, gsub, lower = string.match, string.format, string.find, table.concat, string.gsub, string.lower
-local lpegmatch = lpeg.match
+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 trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
-local trace_unimapping = false trackers.register("otf.unimapping", function(v) trace_unimapping = v end)
+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 ctxcatcodes = tex and tex.ctxcatcodes
+local report_fonts = logs.reporter("fonts","loading") -- not otf only
+
+local fonts = fonts
+local mappings = { }
+fonts.mappings = mappings
--[[ldx--
<p>Eventually this code will disappear because map files are kind
@@ -22,50 +25,46 @@ of obsolete. Some code may move to runtime or auxiliary modules.</p>
<p>The name to unciode related code will stay of course.</p>
--ldx]]--
-fonts = fonts or { }
-fonts.map = fonts.map or { }
-
-local function load_lum_table(filename) -- will move to font goodies
+local function loadlumtable(filename) -- will move to font goodies
local lumname = file.replacesuffix(file.basename(filename),"lum")
- local lumfile = resolvers.find_file(lumname,"map") or ""
+ local lumfile = resolvers.findfile(lumname,"map") or ""
if lumfile ~= "" and lfs.isfile(lumfile) then
- if trace_loading or trace_unimapping then
- logs.report("load otf","enhance: loading %s ",lumfile)
+ if trace_loading or trace_mapping then
+ report_fonts("enhance: loading %s ",lumfile)
end
lumunic = dofile(lumfile)
return lumunic, lumfile
end
end
-local hex = lpeg.R("AF","09")
+local hex = R("AF","09")
local hexfour = (hex*hex*hex*hex) / function(s) return tonumber(s,16) end
local hexsix = (hex^1) / function(s) return tonumber(s,16) end
-local dec = (lpeg.R("09")^1) / tonumber
-local period = lpeg.P(".")
-
-local unicode = lpeg.P("uni") * (hexfour * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexfour^1) * lpeg.Cc(true))
-local ucode = lpeg.P("u") * (hexsix * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexsix ^1) * lpeg.Cc(true))
-local index = lpeg.P("index") * dec * lpeg.Cc(false)
+local dec = (R("09")^1) / tonumber
+local period = P(".")
+local unicode = P("uni") * (hexfour * (period + P(-1)) * Cc(false) + Ct(hexfour^1) * Cc(true))
+local ucode = P("u") * (hexsix * (period + P(-1)) * Cc(false) + Ct(hexsix ^1) * Cc(true))
+local index = P("index") * dec * Cc(false)
local parser = unicode + ucode + index
local parsers = { }
-local function make_name_parser(str)
+local function makenameparser(str)
if not str or str == "" then
return parser
else
local p = parsers[str]
if not p then
- p = lpeg.P(str) * period * dec * lpeg.Cc(false)
+ p = P(str) * period * dec * Cc(false)
parsers[str] = p
end
return p
end
end
---~ local parser = fonts.map.make_name_parser("Japan1")
---~ local parser = fonts.map.make_name_parser()
+--~ local parser = mappings.makenameparser("Japan1")
+--~ local parser = mappings.makenameparser()
--~ local function test(str)
--~ local b, a = lpegmatch(parser,str)
--~ print((a and table.serialize(b)) or b)
@@ -106,7 +105,7 @@ end
--~
--~ local cache = { }
--~
---~ function fonts.map.tounicode16(unicode)
+--~ function mappings.tounicode16(unicode)
--~ local s = cache[unicode]
--~ if not s then
--~ if unicode < 0x10000 then
@@ -119,14 +118,14 @@ end
--~ return s
--~ end
-fonts.map.load_lum_table = load_lum_table
-fonts.map.make_name_parser = make_name_parser
-fonts.map.tounicode16 = tounicode16
-fonts.map.tounicode16sequence = tounicode16sequence
+mappings.loadlumtable = loadlumtable
+mappings.makenameparser = makenameparser
+mappings.tounicode16 = tounicode16
+mappings.tounicode16sequence = tounicode16sequence
-local separator = lpeg.S("_.")
-local other = lpeg.C((1 - separator)^1)
-local ligsplitter = lpeg.Ct(other * (separator * other)^0)
+local separator = S("_.")
+local other = C((1 - separator)^1)
+local ligsplitter = Ct(other * (separator * other)^0)
--~ print(table.serialize(lpegmatch(ligsplitter,"this")))
--~ print(table.serialize(lpegmatch(ligsplitter,"this.that")))
@@ -134,8 +133,11 @@ local ligsplitter = lpeg.Ct(other * (separator * other)^0)
--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more")))
--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more.that")))
-fonts.map.add_to_unicode = function(data,filename)
- local unicodes = data.luatex and data.luatex.unicodes
+function mappings.addtounicode(data,filename)
+ local resources = data.resources
+ local properties = data.properties
+ local descriptions = data.descriptions
+ local unicodes = resources.unicodes
if not unicodes then
return
end
@@ -145,28 +147,35 @@ fonts.map.add_to_unicode = function(data,filename)
unicodes['zwj'] = unicodes['zwj'] or 0x200D
unicodes['zwnj'] = unicodes['zwnj'] or 0x200C
-- the tounicode mapping is sparse and only needed for alternatives
- local tounicode, originals, ns, nl, private, unknown = { }, { }, 0, 0, fonts.private, format("%04X",utfbyte("?"))
- data.luatex.tounicode, data.luatex.originals = tounicode, originals
+ 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
local lumunic, uparser, oparser
+ local cidinfo, cidnames, cidcodes, usedmap
if false then -- will become an option
- lumunic = load_lum_table(filename)
+ lumunic = loadlumtable(filename)
lumunic = lumunic and lumunic.tounicode
end
- local cidinfo, cidnames, cidcodes = data.cidinfo
- local usedmap = cidinfo and cidinfo.usedname
- usedmap = usedmap and lower(usedmap)
- usedmap = usedmap and fonts.cid.map[usedmap]
+ --
+ cidinfo = properties.cidinfo
+ usedmap = cidinfo and fonts.cid.getmap(cidinfo)
+ --
if usedmap then
- oparser = usedmap and make_name_parser(cidinfo.ordering)
+ oparser = usedmap and makenameparser(cidinfo.ordering)
cidnames = usedmap.names
cidcodes = usedmap.unicodes
end
- uparser = make_name_parser()
- local aglmap = fonts.map and fonts.map.agl_to_unicode
- for index, glyph in next, data.glyphs do
- local name, unic = glyph.name, glyph.unicode or -1 -- play safe
+ uparser = makenameparser()
+ local ns, nl = 0, 0
+ 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 unicode = (lumunic and lumunic[name]) or (aglmap and aglmap[name])
+ local unicode = lumunic and lumunic[name] or unicodevector[name]
if unicode then
originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
end
@@ -210,7 +219,7 @@ fonts.map.add_to_unicode = function(data,filename)
-- skip
elseif nplit == 1 then
local base = split[1]
- unicode = unicodes[base] or (aglmap and aglmap[base])
+ unicode = unicodes[base] or unicodevector[base]
if unicode then
if type(unicode) == "table" then
unicode = unicode[1]
@@ -218,19 +227,25 @@ fonts.map.add_to_unicode = function(data,filename)
originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
end
else
- local t = { }
+ local t, n = { }, 0
for l=1,nplit do
local base = split[l]
- local u = unicodes[base] or (aglmap and aglmap[base])
+ local u = unicodes[base] or unicodevector[base]
if not u then
break
elseif type(u) == "table" then
- t[#t+1] = u[1]
+ n = n + 1
+ t[n] = u[1]
else
- t[#t+1] = u
+ n = n + 1
+ t[n] = u
end
end
- if #t > 0 then -- done then
+ if n == 0 then -- done then
+ -- nothing
+ elseif n == 1 then
+ originals[index], tounicode[index], nl, unicode = t[1], tounicode16(t[1]), nl + 1, true
+ else
originals[index], tounicode[index], nl, unicode = t, tounicode16sequence(t), nl + 1, true
end
end
@@ -251,120 +266,19 @@ fonts.map.add_to_unicode = function(data,filename)
end
end
end
- if trace_unimapping then
- for index, glyph in table.sortedhash(data.glyphs) do
- local toun, name, unic = tounicode[index], glyph.name, glyph.unicode or -1 -- play safe
+ 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
- logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X, tounicode: %s",index,name,unic,toun)
+ report_fonts("internal: 0x%05X, name: %s, unicode: U+%05X, tounicode: %s",index,name,unic,toun)
else
- logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X",index,name,unic)
+ report_fonts("internal: 0x%05X, name: %s, unicode: U+%05X",index,name,unic)
end
end
end
if trace_loading and (ns > 0 or nl > 0) then
- logs.report("load otf","enhance: %s tounicode entries added (%s ligatures)",nl+ns, ns)
+ report_fonts("enhance: %s tounicode entries added (%s ligatures)",nl+ns, ns)
end
end
-
--- the following is sort of obsolete
---
--- fonts.map.data = fonts.map.data or { }
--- fonts.map.encodings = fonts.map.encodings or { }
--- fonts.map.loaded = fonts.map.loaded or { }
--- fonts.map.line = fonts.map.line or { }
---
--- function fonts.map.line.pdftex(e)
--- if e.name and e.fontfile then
--- local fullname = e.fullname or ""
--- if e.slant and e.slant ~= 0 then
--- if e.encoding then
--- pdf.mapline(format('= %s %s "%g SlantFont" <%s <%s',e.name,fullname,e.slant,e.encoding,e.fontfile)))
--- else
--- pdf.mapline(format('= %s %s "%g SlantFont" <%s',e.name,fullname,e.slant,e.fontfile)))
--- end
--- elseif e.extend and e.extend ~= 1 and e.extend ~= 0 then
--- if e.encoding then
--- pdf.mapline(format('= %s %s "%g ExtendFont" <%s <%s',e.name,fullname,e.extend,e.encoding,e.fontfile)))
--- else
--- pdf.mapline(format('= %s %s "%g ExtendFont" <%s',e.name,fullname,e.extend,e.fontfile)))
--- end
--- else
--- if e.encoding then
--- pdf.mapline(format('= %s %s <%s <%s',e.name,fullname,e.encoding,e.fontfile)))
--- else
--- pdf.mapline(format('= %s %s <%s',e.name,fullname,e.fontfile)))
--- end
--- end
--- else
--- return nil
--- end
--- end
---
--- function fonts.map.flush(backend) -- will also erase the accumulated data
--- local flushline = fonts.map.line[backend or "pdftex"] or fonts.map.line.pdftex
--- for _, e in next, fonts.map.data do
--- flushline(e)
--- end
--- fonts.map.data = { }
--- end
---
--- fonts.map.line.dvips = fonts.map.line.pdftex
--- fonts.map.line.dvipdfmx = function() end
---
--- function fonts.map.convert_entries(filename)
--- if not fonts.map.loaded[filename] then
--- fonts.map.data, fonts.map.encodings = fonts.map.load_file(filename,fonts.map.data, fonts.map.encodings)
--- fonts.map.loaded[filename] = true
--- end
--- end
---
--- function fonts.map.load_file(filename, entries, encodings)
--- entries = entries or { }
--- encodings = encodings or { }
--- local f = io.open(filename)
--- if f then
--- local data = f:read("*a")
--- if data then
--- for line in gmatch(data,"(.-)[\n\t]") do
--- if find(line,"^[%#%%%s]") then
--- -- print(line)
--- else
--- local extend, slant, name, fullname, fontfile, encoding
--- line = gsub(line,'"(.+)"', function(s)
--- extend = find(s,'"([^"]+) ExtendFont"')
--- slant = find(s,'"([^"]+) SlantFont"')
--- return ""
--- end)
--- if not name then
--- -- name fullname encoding fontfile
--- name, fullname, encoding, fontfile = match(line,"^(%S+)%s+(%S*)[%s<]+(%S*)[%s<]+(%S*)%s*$")
--- end
--- if not name then
--- -- name fullname (flag) fontfile encoding
--- name, fullname, fontfile, encoding = match(line,"^(%S+)%s+(%S*)[%d%s<]+(%S*)[%s<]+(%S*)%s*$")
--- end
--- if not name then
--- -- name fontfile
--- name, fontfile = match(line,"^(%S+)%s+[%d%s<]+(%S*)%s*$")
--- end
--- if name then
--- if encoding == "" then encoding = nil end
--- entries[name] = {
--- name = name, -- handy
--- fullname = fullname,
--- encoding = encoding,
--- fontfile = fontfile,
--- slant = tonumber(slant),
--- extend = tonumber(extend)
--- }
--- encodings[name] = encoding
--- elseif line ~= "" then
--- -- print(line)
--- end
--- end
--- end
--- end
--- f:close()
--- end
--- return entries, encodings
--- end
diff --git a/Master/texmf-dist/tex/context/base/font-mis.lua b/Master/texmf-dist/tex/context/base/font-mis.lua
index 80a56332aca..198293ba132 100644
--- a/Master/texmf-dist/tex/context/base/font-mis.lua
+++ b/Master/texmf-dist/tex/context/base/font-mis.lua
@@ -1,6 +1,6 @@
if not modules then modules = { } end modules ['font-mis'] = {
version = 1.001,
- comment = "companion to luatex-fonts.tex",
+ comment = "companion to mtx-fonts",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
@@ -9,13 +9,23 @@ if not modules then modules = { } end modules ['font-mis'] = {
local next = next
local lower, strip = string.lower, string.strip
-fonts.otf = fonts.otf or { }
+-- also used in other scripts so we need to check some tables:
-fonts.otf.version = fonts.otf.version or 2.650
-fonts.otf.pack = true
-fonts.otf.cache = containers.define("fonts", "otf", fonts.otf.version, true)
+fonts = fonts or { }
-function fonts.otf.loadcached(filename,format,sub)
+fonts.helpers = fonts.helpers or { }
+local helpers = fonts.helpers
+
+fonts.handlers = fonts.handlers or { }
+local handlers = fonts.handlers
+
+handlers.otf = handlers.otf or { }
+local otf = handlers.otf
+
+otf.version = otf.version or 2.730
+otf.cache = otf.cache or containers.define("fonts", "otf", otf.version, true)
+
+function otf.loadcached(filename,format,sub)
-- no recache when version mismatch
local name = file.basename(file.removesuffix(filename))
if sub == "" then sub = false end
@@ -24,9 +34,9 @@ function fonts.otf.loadcached(filename,format,sub)
hash = hash .. "-" .. sub
end
hash = containers.cleanname(hash)
- local data = containers.read(fonts.otf.cache(), hash)
+ local data = containers.read(otf.cache, hash)
if data and not data.verbose then
- fonts.otf.enhancers.unpack(data)
+ otf.enhancers.unpack(data)
return data
else
return nil
@@ -35,14 +45,14 @@ end
local featuregroups = { "gsub", "gpos" }
-function fonts.get_features(name,t,script,language)
+function fonts.helpers.getfeatures(name,t,script,language) -- maybe per font type
local t = lower(t or (name and file.extname(name)) or "")
if t == "otf" or t == "ttf" or t == "ttc" or t == "dfont" then
- local filename = resolvers.find_file(name,t) or ""
+ local filename = resolvers.findfile(name,t) or ""
if filename ~= "" then
- local data = fonts.otf.loadcached(filename)
- if data and data.luatex and data.luatex.features then
- return data.luatex.features
+ local data = otf.loadcached(filename)
+ if data and data.resources and data.resources.features then
+ return data.resources.features
else
local ff = fontloader.open(filename)
if ff then
diff --git a/Master/texmf-dist/tex/context/base/font-ota.lua b/Master/texmf-dist/tex/context/base/font-ota.lua
index 0b61e17d1e0..1bf73653198 100644
--- a/Master/texmf-dist/tex/context/base/font-ota.lua
+++ b/Master/texmf-dist/tex/context/base/font-ota.lua
@@ -13,49 +13,109 @@ local type, tostring, match, format, concat = type, tostring, string.match, stri
if not trackers then trackers = { register = function() end } end
local trace_analyzing = false trackers.register("otf.analyzing", function(v) trace_analyzing = v end)
-local trace_cjk = false trackers.register("cjk.injections", function(v) trace_cjk = v end)
-trackers.register("cjk.analyzing","otf.analyzing")
+local fonts, nodes, node = fonts, nodes, node
-fonts = fonts or { }
-fonts.analyzers = fonts.analyzers or { }
-fonts.analyzers.initializers = fonts.analyzers.initializers or { node = { otf = { } } }
-fonts.analyzers.methods = fonts.analyzers.methods or { node = { otf = { } } }
+local allocate = utilities.storage.allocate
-local otf = fonts.otf
-local tfm = fonts.tfm
+local otf = fonts.handlers.otf
-local initializers = fonts.analyzers.initializers
-local methods = fonts.analyzers.methods
+local analyzers = fonts.analyzers
+local initializers = allocate()
+local methods = allocate()
-local glyph = node.id('glyph')
-local glue = node.id('glue')
-local penalty = node.id('penalty')
+analyzers.initializers = initializers
+analyzers.methods = methods
+analyzers.useunicodemarks = false
-local set_attribute = node.set_attribute
-local has_attribute = node.has_attribute
-local traverse_id = node.traverse_id
-local traverse_node_list = node.traverse
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
-local fontdata = fonts.ids
-local state = attributes.private('state')
+local set_attribute = node.set_attribute
+local has_attribute = node.has_attribute
+local traverse_id = node.traverse_id
+local traverse_node_list = node.traverse
-local fcs = (fonts.color and fonts.color.set) or function() end
-local fcr = (fonts.color and fonts.color.reset) or function() end
+local fontdata = fonts.hashes.identifiers
+local state = attributes.private('state')
+local categories = characters and characters.categories or { } -- sorry, only in context
-local a_to_script = otf.a_to_script
-local a_to_language = otf.a_to_language
+local tracers = nodes.tracers
+local colortracers = tracers and tracers.colors
+local setnodecolor = colortracers and colortracers.set or function() end
+local resetnodecolor = colortracers and colortracers.reset or function() end
+
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
+
+--[[ldx--
+<p>Analyzers run per script and/or language and are needed in order to
+process features right.</p>
+--ldx]]--
+
+-- 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
+
+local state = attributes.private('state')
+
+function analyzers.setstate(head,font)
+ local useunicodemarks = analyzers.useunicodemarks
+ local tfmdata = fontdata[font]
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean
+ while current do
+ local id = current.id
+ if id == glyph_code and current.font == font then
+ local char = current.char
+ local d = descriptions[char]
+ if d then
+ if d.class == "mark" or (useunicodemarks and categories[char] == "mn") then
+ done = true
+ set_attribute(current,state,5) -- mark
+ elseif n == 0 then
+ first, last, n = current, current, 1
+ set_attribute(current,state,1) -- init
+ else
+ last, n = current, n+1
+ set_attribute(current,state,2) -- medi
+ end
+ else -- finish
+ if first and first == last then
+ set_attribute(last,state,4) -- isol
+ elseif last then
+ set_attribute(last,state,3) -- fina
+ end
+ first, last, n = nil, nil, 0
+ end
+ elseif id == disc_code then
+ -- always in the middle
+ set_attribute(current,state,2) -- midi
+ last = current
+ else -- finish
+ if first and first == last then
+ set_attribute(last,state,4) -- isol
+ elseif last then
+ set_attribute(last,state,3) -- fina
+ end
+ first, last, n = nil, nil, 0
+ end
+ current = current.next
+ end
+ if first and first == last then
+ set_attribute(last,state,4) -- isol
+ elseif last then
+ set_attribute(last,state,3) -- 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
-function fonts.initializers.node.otf.analyze(tfmdata,value,attr)
- if attr and attr > 0 then
- script, language = a_to_script[attr], a_to_language[attr]
- else
- script, language = tfmdata.script, tfmdata.language
- end
+local function analyzeinitializer(tfmdata,value) -- attr
+ local script, language = otf.scriptandlanguage(tfmdata) -- attr
local action = initializers[script]
if action then
if type(action) == "function" then
@@ -67,17 +127,11 @@ function fonts.initializers.node.otf.analyze(tfmdata,value,attr)
end
end
end
- return nil
end
-function fonts.methods.node.otf.analyze(head,font,attr)
+local function analyzeprocessor(head,font,attr)
local tfmdata = fontdata[font]
- local script, language
- if attr and attr > 0 then
- script, language = a_to_script[attr], a_to_language[attr]
- else
- script, language = tfmdata.script, tfmdata.language
- end
+ local script, language = otf.scriptandlanguage(tfmdata,attr)
local action = methods[script]
if action then
if type(action) == "function" then
@@ -92,14 +146,25 @@ function fonts.methods.node.otf.analyze(head,font,attr)
return head, false
end
-otf.features.register("analyze",true) -- we always analyze
-table.insert(fonts.triggers,"analyze") -- we need a proper function for doing this
+registerotffeature {
+ name = "analyze",
+ description = "analysis of (for instance) character classes",
+ default = true,
+ initializers = {
+ node = analyzeinitializer,
+ },
+ processors = {
+ position = 1,
+ node = analyzeprocessor,
+ }
+}
-- latin
-fonts.analyzers.methods.latn = fonts.analyzers.aux.setstate
+methods.latn = analyzers.setstate
--- this info eventually will go into char-def
+-- this info eventually will go into char-def adn we will have a state
+-- table for generic then
local zwnj = 0x200C
local zwj = 0x200D
@@ -174,15 +239,15 @@ local arab_warned = { }
local function warning(current,what)
local char = current.char
if not arab_warned[char] then
- log.report("analyze","arab: character %s (U+%04X) has no %s class", char, char, what)
+ log.report("analyze","arab: character %s (U+%05X) has no %s class", char, char, what)
arab_warned[char] = true
end
end
-function fonts.analyzers.methods.nocolor(head,font,attr)
- for n in traverse_node_list(head,glyph) do
+function methods.nocolor(head,font,attr)
+ for n in traverse_id(glyph_code,head) do
if not font or n.font == font then
- fcr(n)
+ resetnodecolor(n)
end
end
return head, true
@@ -194,22 +259,22 @@ local function finish(first,last)
local fc = first.char
if isol_fina_medi_init[fc] or isol_fina[fc] then
set_attribute(first,state,4) -- isol
- if trace_analyzing then fcs(first,"font:isol") end
+ if trace_analyzing then setnodecolor(first,"font:isol") end
else
warning(first,"isol")
set_attribute(first,state,0) -- error
- if trace_analyzing then fcr(first) end
+ if trace_analyzing then resetnodecolor(first) end
end
else
local lc = last.char
if isol_fina_medi_init[lc] or isol_fina[lc] then -- why isol here ?
-- if laststate == 1 or laststate == 2 or laststate == 4 then
set_attribute(last,state,3) -- fina
- if trace_analyzing then fcs(last,"font:fina") end
+ if trace_analyzing then setnodecolor(last,"font:fina") end
else
warning(last,"fina")
set_attribute(last,state,0) -- error
- if trace_analyzing then fcr(last) end
+ if trace_analyzing then resetnodecolor(last) end
end
end
first, last = nil, nil
@@ -218,41 +283,42 @@ local function finish(first,last)
local fc = first.char
if isol_fina_medi_init[fc] or isol_fina[fc] then
set_attribute(first,state,4) -- isol
- if trace_analyzing then fcs(first,"font:isol") end
+ if trace_analyzing then setnodecolor(first,"font:isol") end
else
warning(first,"isol")
set_attribute(first,state,0) -- error
- if trace_analyzing then fcr(first) end
+ if trace_analyzing then resetnodecolor(first) end
end
first = nil
end
return first, last
end
-function fonts.analyzers.methods.arab(head,font,attr) -- maybe make a special version with no trace
+function methods.arab(head,font,attr) -- maybe make a special version with no trace
+ local useunicodemarks = analyzers.useunicodemarks
local tfmdata = fontdata[font]
- local marks = tfmdata.marks
+ local marks = tfmdata.resources.marks
local first, last, current, done = nil, nil, head, false
while current do
- if current.id == glyph and current.subtype<256 and current.font == font and not has_attribute(current,state) then
+ if current.id == glyph_code and current.subtype<256 and current.font == font and not has_attribute(current,state) then
done = true
local char = current.char
- if marks[char] then
+ if marks[char] or (useunicodemarks and categories[char] == "mn") then
set_attribute(current,state,5) -- mark
- if trace_analyzing then fcs(current,"font:mark") end
+ if trace_analyzing then setnodecolor(current,"font:mark") end
elseif isol[char] then -- can be zwj or zwnj too
first, last = finish(first,last)
set_attribute(current,state,4) -- isol
- if trace_analyzing then fcs(current,"font:isol") end
+ if trace_analyzing then setnodecolor(current,"font:isol") end
first, last = nil, nil
elseif not first then
if isol_fina_medi_init[char] then
set_attribute(current,state,1) -- init
- if trace_analyzing then fcs(current,"font:init") end
+ if trace_analyzing then setnodecolor(current,"font:init") end
first, last = first or current, current
elseif isol_fina[char] then
set_attribute(current,state,4) -- isol
- if trace_analyzing then fcs(current,"font:isol") end
+ if trace_analyzing then setnodecolor(current,"font:isol") end
first, last = nil, nil
else -- no arab
first, last = finish(first,last)
@@ -260,18 +326,18 @@ function fonts.analyzers.methods.arab(head,font,attr) -- maybe make a special ve
elseif isol_fina_medi_init[char] then
first, last = first or current, current
set_attribute(current,state,2) -- medi
- if trace_analyzing then fcs(current,"font:medi") end
+ if trace_analyzing then setnodecolor(current,"font:medi") end
elseif isol_fina[char] then
if not has_attribute(last,state,1) then
-- tricky, we need to check what last may be !
set_attribute(last,state,2) -- medi
- if trace_analyzing then fcs(last,"font:medi") end
+ if trace_analyzing then setnodecolor(last,"font:medi") end
end
set_attribute(current,state,3) -- fina
- if trace_analyzing then fcs(current,"font:fina") end
+ if trace_analyzing then setnodecolor(current,"font:fina") end
first, last = nil, nil
elseif char >= 0x0600 and char <= 0x06FF then
- if trace_analyzing then fcs(current,"font:rest") end
+ if trace_analyzing then setnodecolor(current,"font:rest") end
first, last = finish(first,last)
else --no
first, last = finish(first,last)
@@ -284,3 +350,7 @@ function fonts.analyzers.methods.arab(head,font,attr) -- maybe make a special ve
first, last = finish(first,last)
return head, done
end
+
+directives.register("otf.analyze.useunicodemarks",function(v)
+ analyzers.useunicodemarks = v
+end)
diff --git a/Master/texmf-dist/tex/context/base/font-otb.lua b/Master/texmf-dist/tex/context/base/font-otb.lua
index a3d347737c8..1a812c328cb 100644
--- a/Master/texmf-dist/tex/context/base/font-otb.lua
+++ b/Master/texmf-dist/tex/context/base/font-otb.lua
@@ -5,43 +5,44 @@ if not modules then modules = { } end modules ['font-otb'] = {
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
-
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 lpegmatch = lpeg.match
+local utfchar = utf.char
-local otf = fonts.otf
-local tfm = fonts.tfm
+local trace_baseinit = false trackers.register("otf.baseinit", function(v) trace_baseinit = v end)
+local trace_singles = false trackers.register("otf.singles", function(v) trace_singles = v end)
+local trace_multiples = false trackers.register("otf.multiples", function(v) trace_multiples = v end)
+local trace_alternatives = false trackers.register("otf.alternatives", function(v) trace_alternatives = v end)
+local trace_ligatures = false trackers.register("otf.ligatures", function(v) trace_ligatures = v end)
+local trace_kerns = false trackers.register("otf.kerns", function(v) trace_kerns = v end)
+local trace_preparing = false trackers.register("otf.preparing", function(v) trace_preparing = v end)
-local trace_baseinit = false trackers.register("otf.baseinit", function(v) trace_baseinit = v end)
-local trace_singles = false trackers.register("otf.singles", function(v) trace_singles = v end)
-local trace_multiples = false trackers.register("otf.multiples", function(v) trace_multiples = v end)
-local trace_alternatives = false trackers.register("otf.alternatives", function(v) trace_alternatives = v end)
-local trace_ligatures = false trackers.register("otf.ligatures", function(v) trace_ligatures = v end)
-local trace_kerns = false trackers.register("otf.kerns", function(v) trace_kerns = v end)
-local trace_preparing = false trackers.register("otf.preparing", function(v) trace_preparing = v end)
+local report_prepare = logs.reporter("fonts","otf prepare")
-local wildcard = "*"
-local default = "dflt"
+local fonts = fonts
+local otf = fonts.handlers.otf
-local split_at_space = lpeg.Ct(lpeg.splitat(" ")) -- no trailing or multiple spaces anyway
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
-local pcache, fcache = { }, { } -- could be weak
+local wildcard = "*"
+local default = "dflt"
local function gref(descriptions,n)
if type(n) == "number" then
local name = descriptions[n].name
if name then
- return format("U+%04X (%s)",n,name)
+ return format("U+%05X (%s)",n,name)
else
- return format("U+%04X")
+ return format("U+%05X")
end
elseif n then
local num, nam = { }, { }
- for i=1,#n do
+ for i=2,#n do -- first is likely a key
local ni = n[i]
- num[i] = format("U+%04X",ni)
+ num[i] = format("U+%05X",ni)
nam[i] = descriptions[ni].name or "?"
end
return format("%s (%s)",concat(num," "), concat(nam," "))
@@ -50,324 +51,531 @@ local function gref(descriptions,n)
end
end
-local function cref(kind,lookupname)
+local function cref(feature,lookupname)
if lookupname then
- return format("feature %s, lookup %s",kind,lookupname)
+ return format("feature %s, lookup %s",feature,lookupname)
else
- return format("feature %s",kind)
+ return format("feature %s",feature)
end
end
-local function resolve_ligatures(tfmdata,ligatures,kind)
- kind = kind or "unknown"
- local unicodes = tfmdata.unicodes
- local characters = tfmdata.characters
- local descriptions = tfmdata.descriptions
- local changed = tfmdata.changed
- local done = { }
- while true do
- local ok = false
- for k,v in next, ligatures do
- local lig = v[1]
- if not done[lig] then
- local ligs = lpegmatch(split_at_space,lig)
- if #ligs == 2 then
- local uc = v[2]
- local c, f, s = characters[uc], ligs[1], ligs[2]
- local uft, ust = unicodes[f] or 0, unicodes[s] or 0
- if not uft or not ust then
- logs.report("define otf","%s: unicode problem with base ligature %s = %s + %s",cref(kind),gref(descriptions,uc),gref(descriptions,uft),gref(descriptions,ust))
- -- some kind of error
- else
- if type(uft) == "number" then uft = { uft } end
- if type(ust) == "number" then ust = { ust } end
- for ufi=1,#uft do
- local uf = uft[ufi]
- for usi=1,#ust do
- local us = ust[usi]
- if changed[uf] or changed[us] then
- if trace_baseinit and trace_ligatures then
- logs.report("define otf","%s: base ligature %s + %s ignored",cref(kind),gref(descriptions,uf),gref(descriptions,us))
- end
- else
- local first, second = characters[uf], us
- if first and second then
- local t = first.ligatures
- if not t then
- t = { }
- first.ligatures = t
- end
- if type(uc) == "number" then
- t[second] = { type = 0, char = uc }
- else
- t[second] = { type = 0, char = uc[1] } -- can this still happen?
- end
- if trace_baseinit and trace_ligatures then
- logs.report("define otf","%s: base ligature %s + %s => %s",cref(kind),gref(descriptions,uf),gref(descriptions,us),gref(descriptions,uc))
- end
- end
+local basemethods = { }
+local basemethod = "<unset>"
+
+local function applybasemethod(what,...)
+ local m = basemethods[basemethod][what]
+ if m then
+ return m(...)
+ end
+end
+
+-- We need to make sure that luatex sees the difference between
+-- base fonts that have different glyphs in the same slots in fonts
+-- that have the same fullname (or filename). LuaTeX will merge fonts
+-- eventually (and subset later on). If needed we can use a more
+-- verbose name as long as we don't use <()<>[]{}/%> and the length
+-- is < 128.
+
+local basehash, basehashes, applied = { }, 1, { }
+
+local function registerbasehash(tfmdata)
+ local properties = tfmdata.properties
+ local hash = concat(applied," ")
+ local base = basehash[hash]
+ if not base then
+ basehashes = basehashes + 1
+ base = basehashes
+ basehash[hash] = base
+ end
+ properties.basehash = base
+ properties.fullname = properties.fullname .. "-" .. base
+ -- report_prepare("fullname base hash: '%s', featureset '%s'",tfmdata.properties.fullname,hash)
+ applied = { }
+end
+
+local function registerbasefeature(feature,value)
+ applied[#applied+1] = feature .. "=" .. tostring(value)
+end
+
+-- The original basemode ligature builder used the names of components
+-- and did some expression juggling to get the chain right. The current
+-- variant starts with unicodes but still uses names to make the chain.
+-- This is needed because we have to create intermediates when needed
+-- but use predefined snippets when available. To some extend the
+-- current builder is more stupid but I don't worry that much about it
+-- as ligatures are rather predicatable.
+--
+-- Personally I think that an ff + i == ffi rule as used in for instance
+-- latin modern is pretty weird as no sane person will key that in and
+-- expect a glyph for that ligature plus the following character. Anyhow,
+-- as we need to deal with this, we do, but no guarantes are given.
+--
+-- latin modern dejavu
+--
+-- f+f 102 102 102 102
+-- f+i 102 105 102 105
+-- f+l 102 108 102 108
+-- f+f+i 102 102 105
+-- f+f+l 102 102 108 102 102 108
+-- ff+i 64256 105 64256 105
+-- ff+l 64256 108
+--
+-- As you can see here, latin modern is less complete than dejavu but
+-- in practice one will not notice it.
+--
+-- The while loop is needed because we need to resolve for instance
+-- pseudo names like hyphen_hyphen to endash so in practice we end
+-- up with a bit too many definitions but the overhead is neglectable.
+--
+-- Todo: if changed[first] or changed[second] then ... end
+
+local trace = false
+
+local function finalize_ligatures(tfmdata,ligatures)
+ local nofligatures = #ligatures
+ if nofligatures > 0 then
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local resources = tfmdata.resources
+ local unicodes = resources.unicodes
+ local private = resources.private
+ local alldone = false
+ while not alldone do
+ local done = 0
+ for i=1,nofligatures do
+ local ligature = ligatures[i]
+ if ligature then
+ local unicode, lookupdata = ligature[1], ligature[2]
+ if trace then
+ print("BUILDING",concat(lookupdata," "),unicode)
+ end
+ local size = #lookupdata
+ local firstcode = lookupdata[1] -- [2]
+ local firstdata = characters[firstcode]
+ local okay = false
+ if firstdata then
+ local firstname = "ctx_" .. firstcode
+ for i=1,size-1 do -- for i=2,size-1 do
+ local firstdata = characters[firstcode]
+ if not firstdata then
+ firstcode = private
+ if trace then
+ print(" DEFINING",firstname,firstcode)
+ end
+ unicodes[firstname] = firstcode
+ firstdata = { intermediate = true, ligatures = { } }
+ characters[firstcode] = firstdata
+ descriptions[firstcode] = { name = firstname }
+ private = private + 1
+ end
+ local target
+ local secondcode = lookupdata[i+1]
+ local secondname = firstname .. "_" .. secondcode
+ if i == size - 1 then
+ target = unicode
+ if not unicodes[secondname] then
+ unicodes[secondname] = unicode -- map final ligature onto intermediates
+ end
+ okay = true
+ else
+ target = unicodes[secondname]
+ if not target then
+ break
end
end
+ if trace then
+ print("CODES",firstname,firstcode,secondname,secondcode,target)
+ end
+ local firstligs = firstdata.ligatures
+ if firstligs then
+ firstligs[secondcode] = { char = target }
+ else
+ firstdata.ligatures = { [secondcode] = { char = target } }
+ end
+ firstcode = target
+ firstname = secondname
end
end
- ok, done[lig] = true, descriptions[uc].name
+ if okay then
+ ligatures[i] = false
+ done = done + 1
+ end
end
end
+ alldone = done == 0
end
- if ok then
- -- done has "a b c" = "a_b_c" and ligatures the already set ligatures: "a b" = 123
- -- and here we add extras (f i i = fi + i and alike)
- --
- -- we could use a hash for fnc and pattern
- --
- -- this might be interfering !
- for d,n in next, done do
- local pattern = pcache[d] if not pattern then pattern = "^(" .. d .. ") " pcache[d] = pattern end
- local fnc = fcache[n] if not fnc then fnc = function() return n .. " " end fcache[n] = fnc end
- for k,v in next, ligatures do
- v[1] = gsub(v[1],pattern,fnc)
- end
+ if trace then
+ for k, v in next, characters do
+ if v.ligatures then table.print(v,k) end
end
- else
- break
end
+ tfmdata.resources.private = private
end
end
-local splitter = lpeg.splitat(" ")
-
-function prepare_base_substitutions(tfmdata,kind,value) -- we can share some code with the node features
- if value then
- local otfdata = tfmdata.shared.otfdata
- local validlookups, lookuplist = otf.collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language)
- if validlookups then
- local ligatures = { }
- local unicodes = tfmdata.unicodes -- names to unicodes
- local indices = tfmdata.indices
- local characters = tfmdata.characters
- local descriptions = tfmdata.descriptions
- local changed = tfmdata.changed
- --
- local actions = {
- substitution = function(p,lookup,k,glyph,unicode)
- local pv = p[2] -- p.variant
- if pv then
- local upv = unicodes[pv]
- if upv then
- if type(upv) == "table" then
- upv = upv[1]
- end
- if characters[upv] then
- if trace_baseinit and trace_singles then
- logs.report("define otf","%s: base substitution %s => %s",cref(kind,lookup),gref(descriptions,k),gref(descriptions,upv))
- end
- changed[k] = upv
- end
- end
- end
- end,
- alternate = function(p,lookup,k,glyph,unicode)
- local pc = p[2] -- p.components
- if pc then
- -- a bit optimized ugliness
- if value == 1 then
- pc = lpegmatch(splitter,pc)
- elseif value == 2 then
- local a, b = lpegmatch(splitter,pc)
- pc = b or a
- else
- pc = { lpegmatch(splitter,pc) }
- pc = pc[value] or pc[#pc]
- end
- if pc then
- local upc = unicodes[pc]
- if upc then
- if type(upc) == "table" then
- upc = upc[1]
- end
- if characters[upc] then
- if trace_baseinit and trace_alternatives then
- logs.report("define otf","%s: base alternate %s %s => %s",cref(kind,lookup),tostring(value),gref(descriptions,k),gref(descriptions,upc))
- end
- changed[k] = upc
- end
- end
- end
- end
- end,
- ligature = function(p,lookup,k,glyph,unicode)
- local pc = p[2]
- if pc then
- if trace_baseinit and trace_ligatures then
- local upc = { lpegmatch(splitter,pc) }
- for i=1,#upc do upc[i] = unicodes[upc[i]] end
- -- we assume that it's no table
- logs.report("define otf","%s: base ligature %s => %s",cref(kind,lookup),gref(descriptions,upc),gref(descriptions,k))
- end
- ligatures[#ligatures+1] = { pc, k }
- end
- end,
- }
- --
- for k,c in next, characters do
- local glyph = descriptions[k]
- local lookups = glyph.slookups
- if lookups then
- for l=1,#lookuplist do
- local lookup = lookuplist[l]
- local p = lookups[lookup]
- if p then
- local a = actions[p[1]]
- if a then
- a(p,lookup,k,glyph,unicode)
- end
- end
+local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist)
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local resources = tfmdata.resources
+ local changed = tfmdata.changed
+ local unicodes = resources.unicodes
+ local lookuphash = resources.lookuphash
+ local lookuptypes = resources.lookuptypes
+
+ local ligatures = { }
+
+ local actions = {
+ substitution = function(lookupdata,lookupname,description,unicode)
+ if trace_baseinit and trace_singles then
+ report_prepare("%s: base substitution %s => %s",cref(feature,lookupname),
+ gref(descriptions,unicode),gref(descriptions,replacement))
+ end
+ changed[unicode] = lookupdata
+ end,
+ alternate = function(lookupdata,lookupname,description,unicode)
+ local replacement = lookupdata[value] or lookupdata[#lookupdata]
+ if trace_baseinit and trace_alternatives then
+ report_prepare("%s: base alternate %s %s => %s",cref(feature,lookupname),
+ tostring(value),gref(descriptions,unicode),gref(descriptions,replacement))
+ end
+ changed[unicode] = replacement
+ end,
+ ligature = function(lookupdata,lookupname,description,unicode)
+ if trace_baseinit and trace_alternatives then
+ report_prepare("%s: base ligature %s %s => %s",cref(feature,lookupname),
+ tostring(value),gref(descriptions,lookupdata),gref(descriptions,unicode))
+ end
+ ligatures[#ligatures+1] = { unicode, lookupdata }
+ end,
+ }
+
+ for unicode, character in next, characters do
+ local description = descriptions[unicode]
+ local lookups = description.slookups
+ if lookups then
+ for l=1,#lookuplist do
+ local lookupname = lookuplist[l]
+ local lookupdata = lookups[lookupname]
+ if lookupdata then
+ local lookuptype = lookuptypes[lookupname]
+ local action = actions[lookuptype]
+ if action then
+ action(lookupdata,lookupname,description,unicode)
end
end
- local lookups = glyph.mlookups
- if lookups then
- for l=1,#lookuplist do
- local lookup = lookuplist[l]
- local ps = lookups[lookup]
- if ps then
- for i=1,#ps do
- local p = ps[i]
- local a = actions[p[1]]
- if a then
- a(p,lookup,k,glyph,unicode)
- end
- end
+ end
+ end
+ local lookups = description.mlookups
+ if lookups then
+ for l=1,#lookuplist do
+ local lookupname = lookuplist[l]
+ local lookuplist = lookups[lookupname]
+ if lookuplist then
+ local lookuptype = lookuptypes[lookupname]
+ local action = actions[lookuptype]
+ if action then
+ for i=1,#lookuplist do
+ action(lookuplist[i],lookupname,description,unicode)
end
end
end
end
- resolve_ligatures(tfmdata,ligatures,kind)
end
- else
- tfmdata.ligatures = tfmdata.ligatures or { } -- left over from what ?
end
+
+ finalize_ligatures(tfmdata,ligatures)
end
-local function prepare_base_kerns(tfmdata,kind,value) -- todo what kind of kerns, currently all
- if value then
- local otfdata = tfmdata.shared.otfdata
- local validlookups, lookuplist = otf.collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language)
- if validlookups then
- local unicodes = tfmdata.unicodes -- names to unicodes
- local indices = tfmdata.indices
- local characters = tfmdata.characters
- local descriptions = tfmdata.descriptions
- local sharedkerns = { }
- for u, chr in next, characters do
- local d = descriptions[u]
- if d then
- local dk = d.mykerns -- shared
- if dk then
- local s = sharedkerns[dk]
- if s == false then
- -- skip
- elseif s then
- chr.kerns = s
- else
- local t, done = chr.kerns or { }, false
- for l=1,#lookuplist do
- local lookup = lookuplist[l]
- local kerns = dk[lookup]
- if kerns then
- for k, v in next, kerns do
- if v ~= 0 and not t[k] then -- maybe no 0 test here
- t[k], done = v, true
- if trace_baseinit and trace_kerns then
- logs.report("define otf","%s: base kern %s + %s => %s",cref(kind,lookup),gref(descriptions,u),gref(descriptions,k),v)
- end
- end
- 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 sharedkerns = { }
+ local traceindeed = trace_baseinit and trace_kerns
+ for unicode, character in next, characters do
+ local description = descriptions[unicode]
+ local rawkerns = description.kerns -- shared
+ if rawkerns then
+ local s = sharedkerns[rawkerns]
+ if s == false then
+ -- skip
+ elseif s then
+ character.kerns = s
+ else
+ local newkerns = character.kerns
+ local done = false
+ for l=1,#lookuplist do
+ local lookup = lookuplist[l]
+ local kerns = rawkerns[lookup]
+ if kerns then
+ for otherunicode, value in next, kerns do
+ if value == 0 then
+ -- maybe no 0 test here
+ elseif not newkerns then
+ newkerns = { [otherunicode] = value }
+ done = true
+ if traceindeed then
+ report_prepare("%s: base kern %s + %s => %s",cref(feature,lookup),
+ gref(descriptions,unicode),gref(descriptions,otherunicode),value)
+ end
+ elseif not newkerns[otherunicode] then -- first wins
+ newkerns[otherunicode] = value
+ done = true
+ if traceindeed then
+ report_prepare("%s: base kern %s + %s => %s",cref(feature,lookup),
+ gref(descriptions,unicode),gref(descriptions,otherunicode),value)
end
- end
- if done then
- sharedkerns[dk] = t
- chr.kerns = t -- no empty assignments
- else
- sharedkerns[dk] = false
end
end
end
end
+ if done then
+ sharedkerns[rawkerns] = newkerns
+ character.kerns = newkerns -- no empty assignments
+ else
+ sharedkerns[rawkerns] = false
+ end
end
end
end
end
--- In principle we could register each feature individually which was
--- what we did in earlier versions. However, after the rewrite it
--- made more sense to collect them in an overall features initializer
--- just as with the node variant. There it was needed because we need
--- to do complete mixed runs and not run featurewise (as we did before).
-
-local supported_gsub = {
- 'liga', 'dlig', 'rlig', 'hlig',
- 'pnum', 'onum', 'tnum', 'lnum',
- 'zero',
- 'smcp', 'cpsp', 'c2sc', 'ornm', 'aalt',
- 'hwid', 'fwid',
- 'ssty', 'rtlm', -- math
--- 'tlig', 'trep',
+basemethods.independent = {
+ preparesubstitutions = preparesubstitutions,
+ preparepositionings = preparepositionings,
}
-local supported_gpos = {
- 'kern'
-}
+local function makefake(tfmdata,name,present)
+ local resources = tfmdata.resources
+ local private = resources.private
+ local character = { intermediate = true, ligatures = { } }
+ resources.unicodes[name] = private
+ tfmdata.characters[private] = character
+ tfmdata.descriptions[private] = { name = name }
+ resources.private = private + 1
+ present[name] = private
+ return character
+end
+
+local function make_1(present,tree,name)
+ for k, v in next, tree do
+ if k == "ligature" then
+ present[name] = v
+ else
+ make_1(present,v,name .. "_" .. k)
+ end
+ end
+end
+
+local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,done,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 %s: U+%05X (%s), preceding U+%05X (%s)",lookupname,v,utfchar(v),preceding,utfchar(preceding))
+ end
+ character = makefake(tfmdata,name,present)
+ end
+ local ligatures = character.ligatures
+ if ligatures then
+ ligatures[unicode] = { char = v }
+ else
+ character.ligatures = { [unicode] = { char = v } }
+ end
+ if done then
+ local d = done[lookupname]
+ if not d then
+ done[lookupname] = { "dummy", v }
+ else
+ d[#d+1] = v
+ end
+ end
+ else
+ local code = present[name] or unicode
+ local name = name .. "_" .. k
+ make_2(present,tfmdata,characters,v,name,code,k,done,lookupname)
+ end
+ end
+end
+
+local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist)
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local resources = tfmdata.resources
+ local changed = tfmdata.changed
+ local lookuphash = resources.lookuphash
+ local lookuptypes = resources.lookuptypes
+
+ local ligatures = { }
+
+ for l=1,#lookuplist do
+ local lookupname = lookuplist[l]
+ local lookupdata = lookuphash[lookupname]
+ local lookuptype = lookuptypes[lookupname]
+ for unicode, data in next, lookupdata do
+ if lookuptype == "substitution" then
+ if trace_baseinit and trace_singles then
+ report_prepare("%s: base substitution %s => %s",cref(feature,lookupname),
+ gref(descriptions,unicode),gref(descriptions,data))
+ end
+ changed[unicode] = data
+ elseif lookuptype == "alternate" then
+ local replacement = data[value] or data[#data]
+ if trace_baseinit and trace_alternatives then
+ report_prepare("%s: base alternate %s %s => %s",cref(feature,lookupname),
+ tostring(value),gref(descriptions,unicode),gref(descriptions,replacement))
+ end
+ changed[unicode] = replacement
+ elseif lookuptype == "ligature" then
+ ligatures[#ligatures+1] = { unicode, data, lookupname }
+ end
+ end
+ end
+
+ local nofligatures = #ligatures
+
+ if nofligatures > 0 then
+
+ local characters = tfmdata.characters
+ local present = { }
+ local done = trace_baseinit and trace_ligatures and { }
+
+ for i=1,nofligatures do
+ local ligature = ligatures[i]
+ local unicode, tree = ligature[1], ligature[2]
+ make_1(present,tree,"ctx_"..unicode)
+ end
+
+ 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)
+ end
+
+ if done then
+ for lookupname, list in next, done do
+ report_prepare("%s: base ligatures %s => %s",cref(feature,lookupname),
+ tostring(value),gref(descriptions,done))
+ end
+ end
+
+ end
+
+end
+
+local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist)
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local resources = tfmdata.resources
+ local lookuphash = resources.lookuphash
+ 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]
+ for unicode, data in next, lookupdata do
+ local character = characters[unicode]
+ local kerns = character.kerns
+ if not kerns then
+ kerns = { }
+ character.kerns = kerns
+ end
+ if traceindeed then
+ for otherunicode, kern in next, data do
+ if not kerns[otherunicode] and kern ~= 0 then
+ kerns[otherunicode] = kern
+ report_prepare("%s: base kern %s + %s => %s",cref(feature,lookup),
+ gref(descriptions,unicode),gref(descriptions,otherunicode),kern)
+ end
+ end
+ else
+ for otherunicode, kern in next, data do
+ if not kerns[otherunicode] and kern ~= 0 then
+ kerns[otherunicode] = kern
+ end
+ end
+ end
+ end
+ end
-function otf.features.register_base_substitution(tag)
- supported_gsub[#supported_gsub+1] = tag
end
-function otf.features.register_base_kern(tag)
- supported_gsub[#supported_gpos+1] = tag
+
+local function initializehashes(tfmdata)
+ nodeinitializers.features(tfmdata)
end
-local basehash, basehashes = { }, 1
+basemethods.shared = {
+ initializehashes = initializehashes,
+ preparesubstitutions = preparesubstitutions,
+ preparepositionings = preparepositionings,
+}
+
+basemethod = "independent"
-function fonts.initializers.base.otf.features(tfmdata,value)
+local function featuresinitializer(tfmdata,value)
if true then -- value then
- -- not shared
local t = trace_preparing and os.clock()
local features = tfmdata.shared.features
if features then
- local h = { }
- for f=1,#supported_gsub do
- local feature = supported_gsub[f]
- local value = features[feature]
- prepare_base_substitutions(tfmdata,feature,value)
- if value then
- h[#h+1] = feature .. "=" .. tostring(value)
+ applybasemethod("initializehashes",tfmdata)
+ local collectlookups = otf.collectlookups
+ local rawdata = tfmdata.shared.rawdata
+ local properties = tfmdata.properties
+ local script = properties.script
+ local language = properties.language
+ local basesubstitutions = rawdata.resources.features.gsub
+ local basepositionings = rawdata.resources.features.gpos
+ if basesubstitutions then
+ for feature, data in next, basesubstitutions do
+ local value = features[feature]
+ if value then
+ local validlookups, lookuplist = collectlookups(rawdata,feature,script,language)
+ if validlookups then
+ applybasemethod("preparesubstitutions",tfmdata,feature,value,validlookups,lookuplist)
+ registerbasefeature(feature,value)
+ end
+ end
end
end
- for f=1,#supported_gpos do
- local feature = supported_gpos[f]
- local value = features[feature]
- prepare_base_kerns(tfmdata,feature,features[feature])
- if value then
- h[#h+1] = feature .. "=" .. tostring(value)
+ if basepositions then
+ for feature, data in next, basepositions do
+ local value = features[feature]
+ if value then
+ local validlookups, lookuplist = collectlookups(rawdata,feature,script,language)
+ if validlookups then
+ applybasemethod("preparepositionings",tfmdata,feature,features[feature],validlookups,lookuplist)
+ registerbasefeature(feature,value)
+ end
+ end
end
end
- local hash = concat(h," ")
- local base = basehash[hash]
- if not base then
- basehashes = basehashes + 1
- base = basehashes
- basehash[hash] = base
- end
- -- We need to make sure that luatex sees the difference between
- -- base fonts that have different glyphs in the same slots in fonts
- -- that have the same fullname (or filename). LuaTeX will merge fonts
- -- eventually (and subset later on). If needed we can use a more
- -- verbose name as long as we don't use <()<>[]{}/%> and the length
- -- is < 128.
- tfmdata.fullname = tfmdata.fullname .. "-" .. base -- tfmdata.psname is the original
- --~ logs.report("otf define","fullname base hash: '%s', featureset '%s'",tfmdata.fullname,hash)
+ registerbasehash(tfmdata)
end
if trace_preparing then
- logs.report("otf define","preparation time is %0.3f seconds for %s",os.clock()-t,tfmdata.fullname or "?")
+ report_prepare("preparation time is %0.3f seconds for %s",os.clock()-t,tfmdata.properties.fullname or "?")
end
end
end
+
+registerotffeature {
+ name = "features",
+ description = "features",
+ default = true,
+ initializers = {
+--~ position = 1, -- after setscript (temp hack ... we need to force script / language to 1
+ base = featuresinitializer,
+ }
+}
+
+-- independent : collect lookups independently (takes more runtime ... neglectable)
+-- shared : shares lookups with node mode (takes more memory ... noticeable)
+
+directives.register("fonts.otf.loader.basemethod", function(v)
+ if basemethods[v] then
+ basemethod = v
+ end
+end)
diff --git a/Master/texmf-dist/tex/context/base/font-otc.lua b/Master/texmf-dist/tex/context/base/font-otc.lua
index 357d347b18c..1b4983ce01a 100644
--- a/Master/texmf-dist/tex/context/base/font-otc.lua
+++ b/Master/texmf-dist/tex/context/base/font-otc.lua
@@ -8,206 +8,257 @@ if not modules then modules = { } end modules ['font-otc'] = {
local format, insert = string.format, table.insert
local type, next = type, next
+local lpegmatch = lpeg.match
-- we assume that the other otf stuff is loaded already
-local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
-
-local otf = fonts.otf
-local tfm = fonts.tfm
-
--- instead of "script = "DFLT", langs = { 'dflt' }" we now use wildcards (we used to
--- have always); some day we can write a "force always when true" trick for other
--- features as well
---
--- we could have a tnum variant as well
-
-local extra_lists = {
- tlig = {
- {
- endash = "hyphen hyphen",
- emdash = "hyphen hyphen hyphen",
- -- quotedblleft = "quoteleft quoteleft",
- -- quotedblright = "quoteright quoteright",
- -- quotedblleft = "grave grave",
- -- quotedblright = "quotesingle quotesingle",
- -- quotedblbase = "comma comma",
- },
- },
- trep = {
- {
- -- [0x0022] = 0x201D,
- [0x0027] = 0x2019,
- -- [0x0060] = 0x2018,
- },
- },
- anum = {
- { -- arabic
- [0x0030] = 0x0660,
- [0x0031] = 0x0661,
- [0x0032] = 0x0662,
- [0x0033] = 0x0663,
- [0x0034] = 0x0664,
- [0x0035] = 0x0665,
- [0x0036] = 0x0666,
- [0x0037] = 0x0667,
- [0x0038] = 0x0668,
- [0x0039] = 0x0669,
- },
- { -- persian
- [0x0030] = 0x06F0,
- [0x0031] = 0x06F1,
- [0x0032] = 0x06F2,
- [0x0033] = 0x06F3,
- [0x0034] = 0x06F4,
- [0x0035] = 0x06F5,
- [0x0036] = 0x06F6,
- [0x0037] = 0x06F7,
- [0x0038] = 0x06F8,
- [0x0039] = 0x06F9,
- },
- },
-}
+local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+local report_otf = logs.reporter("fonts","otf loading")
-local extra_features = { -- maybe just 1..n so that we prescribe order
- tlig = {
- {
- features = { { scripts = { { script = "*", langs = { "*" }, } }, tag = "tlig", comment = "added bij mkiv" }, },
- name = "ctx_tlig_1",
- subtables = { { name = "ctx_tlig_1_s" } },
- type = "gsub_ligature",
- flags = { },
- },
- },
- trep = {
- {
- features = { { scripts = { { script = "*", langs = { "*" }, } }, tag = "trep", comment = "added bij mkiv" }, },
- name = "ctx_trep_1",
- subtables = { { name = "ctx_trep_1_s" } },
- type = "gsub_single",
- flags = { },
- },
- },
- anum = {
- {
- features = { { scripts = { { script = "arab", langs = { "dflt", "FAR" }, } }, tag = "anum", comment = "added bij mkiv" }, },
- name = "ctx_anum_1",
- subtables = { { name = "ctx_anum_1_s" } },
- type = "gsub_single",
- flags = { },
- },
- {
- features = { { scripts = { { script = "arab", langs = { "URD" }, } }, tag = "anum", comment = "added bij mkiv" }, },
- name = "ctx_anum_2",
- subtables = { { name = "ctx_anum_2_s" } },
- type = "gsub_single",
- flags = { },
- },
- },
+local fonts = fonts
+local otf = fonts.handlers.otf
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
+local setmetatableindex = table.setmetatableindex
+
+-- In the userdata interface we can not longer tweak the loaded font as
+-- conveniently as before. For instance, instead of pushing extra data in
+-- in the table using the original structure, we now have to operate on
+-- the mkiv representation. And as the fontloader interface is modelled
+-- after fontforge we cannot change that one too much either.
+
+local types = {
+ substitution = "gsub_single",
+ ligature = "gsub_ligature",
+ alternate = "gsub_alternate",
}
-fonts.otf.enhancers["add some missing characters"] = function(data,filename)
- -- todo
-end
+setmetatableindex(types, function(t,k) t[k] = k return k end) -- "key"
-fonts.otf.enhancers["enrich with features"] = function(data,filename)
- -- could be done elsewhere (true can be #)
- local used = { }
- for i=1,#otf.glists do
- local g = data[otf.glists[i]]
- if g then
- for i=1,#g do
- local f = g[i].features
- if f then
- for i=1,#f do
- local t = f[i].tag
- if t then used[t] = true end
- end
- end
- end
+local everywhere = { ["*"] = { ["*"] = true } } -- or: { ["*"] = { "*" } }
+local noflags = { }
+
+local function addfeature(data,feature,specifications)
+ local descriptions = data.descriptions
+ local resources = data.resources
+ local lookups = resources.lookups
+ local gsubfeatures = resources.features.gsub
+ if gsubfeatures and gsubfeatures[feature] then
+ -- already present
+ else
+ local sequences = resources.sequences
+ local fontfeatures = resources.features
+ local unicodes = resources.unicodes
+ local lookuptypes = resources.lookuptypes
+ local splitter = lpeg.splitter(" ",unicodes)
+ local done = 0
+ if not specifications[1] then
+ -- so we accept a one entry specification
+ specifications = { specifications }
end
- end
- --
- local glyphs = data.glyphs
- local indices = data.map.map
- data.gsub = data.gsub or { }
- for kind, specifications in next, extra_features do
- if not used[kind] then
- local done = 0
- for s=1,#specifications do
- local added = false
- local specification = specifications[s]
- local list = extra_lists[kind][s]
- local name = specification.name .. "_s"
- if specification.type == "gsub_ligature" then
- for unicode, index in next, indices do
- local glyph = glyphs[index]
- local ligature = list[glyph.name]
- if ligature then
- local o = glyph.lookups or { }
- -- o[name] = { "ligature", ligature, glyph.name }
- o[name] = {
- {
- ["type"] = "ligature",
- ["specification"] = {
- char = glyph.name,
- components = ligature,
- }
- }
- }
- glyph.lookups, done, added = o, done+1, true
+ -- subtables are tables themselves but we also accept flattened singular subtables
+ for s=1,#specifications do
+ local specification = specifications[s]
+ local askedfeatures = specification.features or everywhere
+ local subtables = specification.subtables or { specification.data } or { }
+ local featuretype = types[specification.type or "substitution"]
+ local featureflags = specification.flags or noflags
+ local added = false
+ local featurename = format("ctx_%s_%s",feature,s)
+ local st = { }
+ for t=1,#subtables do
+ local list = subtables[t]
+ local full = format("%s_%s",featurename,t)
+ st[t] = full
+ if featuretype == "gsub_ligature" then
+ lookuptypes[full] = "ligature"
+ for code, ligature in next, list do
+ local unicode = tonumber(code) or unicodes[code]
+ local description = descriptions[unicode]
+ if description then
+ local slookups = description.slookups
+ if type(ligature) == "string" then
+ ligature = { lpegmatch(splitter,ligature) }
+ end
+ if slookups then
+ slookups[full] = ligature
+ else
+ description.slookups = { [full] = ligature }
+ end
+ done, added = done + 1, true
end
end
- elseif specification.type == "gsub_single" then
- for unicode, index in next, indices do
- local glyph = glyphs[index]
- local r = list[unicode]
- if r then
- local replacement = indices[r]
- if replacement and glyphs[replacement] then
- local o = glyph.lookups or { }
- -- o[name] = { { "substitution", glyphs[replacement].name } }
- o[name] = {
- {
- ["type"] = "substitution",
- ["specification"] = {
- variant = glyphs[replacement].name,
- }
- }
- }
- glyph.lookups, done, added = o, done+1, true
+ elseif featuretype == "gsub_single" then
+ lookuptypes[full] = "substitution"
+ for code, replacement in next, list do
+ local unicode = tonumber(code) or unicodes[code]
+ local description = descriptions[unicode]
+ if description then
+ local slookups = description.slookups
+ replacement = tonumber(replacement) or unicodes[replacement]
+ if slookups then
+ slookups[full] = replacement
+ else
+ description.slookups = { [full] = replacement }
end
+ done, added = done + 1, true
end
end
end
- if added then
- insert(data.gsub,s,table.fastcopy(specification)) -- right order
- end
end
- if done > 0 then
- if trace_loading then
- logs.report("load otf","enhance: registering %s feature (%s glyphs affected)",kind,done)
+ if added then
+ -- script = { lang1, lang2, lang3 } or script = { lang1 = true, ... }
+ for k, v in next, askedfeatures do
+ if v[1] then
+ askedfeatures[k] = table.tohash(v)
+ end
+ end
+ sequences[#sequences+1] = {
+ chain = 0,
+ features = { [feature] = askedfeatures },
+ flags = featureflags,
+ name = featurename,
+ subtables = st,
+ type = featuretype,
+ }
+ -- register in metadata (merge as there can be a few)
+ if not gsubfeatures then
+ gsubfeatures = { }
+ fontfeatures.gsub = gsubfeatures
+ end
+ local k = gsubfeatures[feature]
+ if not k then
+ k = { }
+ gsubfeatures[feature] = k
+ end
+ for script, languages in next, askedfeatures do
+ local kk = k[script]
+ if not kk then
+ kk = { }
+ k[script] = kk
+ end
+ for language, value in next, languages do
+ kk[language] = value
+ end
end
end
end
+ if done > 0 and trace_loading then
+ report_otf("enhance: registering %s feature (%s glyphs affected)",feature,done)
+ end
end
end
-otf.tables.features['tlig'] = 'TeX Ligatures'
-otf.tables.features['trep'] = 'TeX Replacements'
-otf.tables.features['anum'] = 'Arabic Digits'
+otf.enhancers.addfeature = addfeature
-otf.features.register_base_substitution('tlig')
-otf.features.register_base_substitution('trep')
-otf.features.register_base_substitution('anum')
+local extrafeatures = { }
--- the functionality is defined elsewhere
+function otf.addfeature(name,specification)
+ extrafeatures[name] = specification
+end
-fonts.initializers.base.otf.equaldigits = fonts.initializers.common.equaldigits
-fonts.initializers.node.otf.equaldigits = fonts.initializers.common.equaldigits
+local function enhance(data,filename,raw)
+ for feature, specification in next, extrafeatures do
+ addfeature(data,feature,specification)
+ end
+end
-fonts.initializers.base.otf.lineheight = fonts.initializers.common.lineheight
-fonts.initializers.node.otf.lineheight = fonts.initializers.common.lineheight
+otf.enhancers.register("check extra features",enhance)
-fonts.initializers.base.otf.compose = fonts.initializers.common.compose
-fonts.initializers.node.otf.compose = fonts.initializers.common.compose
+-- tlig --
+
+local tlig = {
+ endash = "hyphen hyphen",
+ emdash = "hyphen hyphen hyphen",
+ -- quotedblleft = "quoteleft quoteleft",
+ -- quotedblright = "quoteright quoteright",
+ -- quotedblleft = "grave grave",
+ -- quotedblright = "quotesingle quotesingle",
+ -- quotedblbase = "comma comma",
+}
+
+local tlig_specification = {
+ type = "ligature",
+ features = everywhere, -- { ["*"] = { ["*"] = true } },
+ data = tlig,
+ flags = noflags, -- { },
+}
+
+otf.addfeature("tlig",tlig_specification)
+
+registerotffeature {
+ name = 'tlig',
+ description = 'tex ligatures',
+}
+
+-- trep
+
+local trep = {
+ -- [0x0022] = 0x201D,
+ [0x0027] = 0x2019,
+ -- [0x0060] = 0x2018,
+}
+
+local trep_specification = {
+ type = "substitution",
+ features = everywhere, -- { ["*"] = { ["*"] = true } },
+ data = trep,
+ flags = noflags, -- { },
+}
+
+otf.addfeature("trep",trep_specification)
+
+registerotffeature {
+ name = 'trep',
+ description = 'tex replacements',
+}
+
+-- anum
+
+local anum_arabic = {
+ [0x0030] = 0x0660,
+ [0x0031] = 0x0661,
+ [0x0032] = 0x0662,
+ [0x0033] = 0x0663,
+ [0x0034] = 0x0664,
+ [0x0035] = 0x0665,
+ [0x0036] = 0x0666,
+ [0x0037] = 0x0667,
+ [0x0038] = 0x0668,
+ [0x0039] = 0x0669,
+}
+
+local anum_persian = {
+ [0x0030] = 0x06F0,
+ [0x0031] = 0x06F1,
+ [0x0032] = 0x06F2,
+ [0x0033] = 0x06F3,
+ [0x0034] = 0x06F4,
+ [0x0035] = 0x06F5,
+ [0x0036] = 0x06F6,
+ [0x0037] = 0x06F7,
+ [0x0038] = 0x06F8,
+ [0x0039] = 0x06F9,
+}
+
+local anum_specification = {
+ {
+ type = "substitution",
+ features = { arab = { URD = true, dflt = true } },
+ data = anum_arabic,
+ flags = noflags, -- { },
+ },
+ {
+ type = "substitution",
+ features = { arab = { URD = true } },
+ data = anum_persian,
+ flags = noflags, -- { },
+ },
+}
+
+otf.addfeature("anum",anum_specification)
+
+registerotffeature {
+ name = 'anum',
+ description = 'arabic digits',
+}
diff --git a/Master/texmf-dist/tex/context/base/font-otd.lua b/Master/texmf-dist/tex/context/base/font-otd.lua
index 41e8853316c..b22889217cb 100644
--- a/Master/texmf-dist/tex/context/base/font-otd.lua
+++ b/Master/texmf-dist/tex/context/base/font-otd.lua
@@ -6,29 +6,49 @@ if not modules then modules = { } end modules ['font-otd'] = {
license = "see context related readme files"
}
-local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end)
+local match = string.match
-fonts = fonts or { }
-fonts.otf = fonts.otf or { }
+local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end)
+local trace_applied = false trackers.register("otf.applied", function(v) trace_applied = v end)
-local otf = fonts.otf
-local fontdata = fonts.ids
+local report_otf = logs.reporter("fonts","otf loading")
+local report_process = logs.reporter("fonts","otf process")
-otf.features = otf.features or { }
-otf.features.default = otf.features.default or { }
+local fonts = fonts
+local otf = fonts.handlers.otf
+local fontdata = fonts.hashes.identifiers
+local definers = fonts.definers
+local constructors = fonts.constructors
+local specifiers = fonts.specifiers
-local context_setups = fonts.define.specify.context_setups
-local context_numbers = fonts.define.specify.context_numbers
+local contextsetups = specifiers.contextsetups
+local contextnumbers = specifiers.contextnumbers
+local contextmerged = specifiers.contextmerged
-local a_to_script = { } otf.a_to_script = a_to_script
-local a_to_language = { } otf.a_to_language = a_to_language
+local setmetatableindex = table.setmetatableindex
-function otf.set_dynamics(font,dynamics,attribute)
- features = context_setups[context_numbers[attribute]] -- can be moved to caller
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
+
+local fontdynamics = { }
+fonts.hashes.dynamics = fontdynamics
+
+local a_to_script = { }
+local a_to_language = { }
+
+setmetatableindex(fontdynamics, function(t,font)
+ local d = fontdata[font].shared.dynamics or false
+ t[font] = d
+ return d
+end)
+
+function otf.setdynamics(font,attribute)
+ local features = contextsetups[contextnumbers[attribute]] -- can be moved to caller
if features then
+ local dynamics = fontdynamics[font]
local script = features.script or 'dflt'
local language = features.language or 'dflt'
- local ds = dynamics[script]
+ local ds = dynamics[script] -- can be metatable magic (less testing)
if not ds then
ds = { }
dynamics[script] = ds
@@ -39,40 +59,161 @@ function otf.set_dynamics(font,dynamics,attribute)
ds[language] = dsl
end
local dsla = dsl[attribute]
- if dsla then
- -- if trace_dynamics then
- -- logs.report("otf define","using dynamics %s: attribute %s, script %s, language %s",context_numbers[attribute],attribute,script,language)
- -- end
- return dsla
- else
+ if not dsla then
local tfmdata = fontdata[font]
a_to_script [attribute] = script
a_to_language[attribute] = language
-- we need to save some values
- local saved = {
- script = tfmdata.script,
- language = tfmdata.language,
- mode = tfmdata.mode,
- features = tfmdata.shared.features
- }
- tfmdata.mode = "node"
- tfmdata.language = language
- tfmdata.script = script
- tfmdata.shared.features = { }
+ local properties = tfmdata.properties
+ local shared = tfmdata.shared
+ local s_script = properties.script
+ local s_language = properties.language
+ local s_mode = properties.mode
+ local s_features = shared.features
+ properties.mode = "node"
+ properties.language = language
+ properties.script = script
+ properties.dynamics = true -- handy for tracing
+ shared.features = { }
-- end of save
- dsla = otf.set_features(tfmdata,fonts.define.check(features,otf.features.default))
+ local set = constructors.checkedfeatures("otf",features)
+set.mode = "node" -- really needed
+ dsla = otf.setfeatures(tfmdata,set)
if trace_dynamics then
- logs.report("otf define","setting dynamics %s: attribute %s, script %s, language %s",context_numbers[attribute],attribute,script,language)
+ report_otf("setting dynamics %s: attribute %s, script %s, language %s, set: %s",contextnumbers[attribute],attribute,script,language,table.sequenced(set))
end
-- we need to restore some values
- tfmdata.script = saved.script
- tfmdata.language = saved.language
- tfmdata.mode = saved.mode
- tfmdata.shared.features = saved.features
+ properties.script = s_script
+ properties.language = s_language
+ properties.mode = s_mode
+ shared.features = s_features
-- end of restore
dynamics[script][language][attribute] = dsla -- cache
- return dsla
+ elseif trace_dynamics then
+ -- report_otf("using dynamics %s: attribute %s, script %s, language %s",contextnumbers[attribute],attribute,script,language)
end
+ return dsla
end
- return nil -- { }
+end
+
+function otf.scriptandlanguage(tfmdata,attr)
+ local properties = tfmdata.properties
+ if attr and attr > 0 then
+ return a_to_script[attr] or properties.script or "dflt", a_to_language[attr] or properties.language or "dflt"
+ else
+ return properties.script or "dflt", properties.language or "dflt"
+ end
+end
+
+-- we reimplement the dataset resolver
+
+local special_attributes = {
+ init = 1,
+ medi = 2,
+ fina = 3,
+ isol = 4
+}
+
+local resolved = { } -- we only resolve a font,script,language,attribute pair once
+local wildcard = "*"
+local default = "dflt"
+
+local function initialize(sequence,script,language,s_enabled,a_enabled,font,attr,dynamic)
+ local features = sequence.features
+ if features then
+ for kind, scripts in next, features do
+ local s_e = s_enabled and s_enabled[kind]
+ local a_e = a_enabled and a_enabled[kind]
+ local e_e = s_e or a_e
+ if e_e then
+ local languages = scripts[script] or scripts[wildcard]
+ if languages then
+ local valid, what = false
+ -- not languages[language] or languages[default] or languages[wildcard] because we want tracing
+ -- only first attribute match check, so we assume simple fina's
+ -- default can become a font feature itself
+ if languages[language] then
+ valid = true
+ what = language
+ -- elseif languages[default] then
+ -- valid = true
+ -- what = default
+ elseif languages[wildcard] then
+ valid = true
+ what = wildcard
+ end
+ if valid then
+ local attribute = special_attributes[kind] or false
+ if a_e and dynamic < 0 then
+ valid = false
+ end
+ if trace_applied then
+ local typ, action = match(sequence.type,"(.*)_(.*)") -- brrr
+ report_process(
+ "%s font: %03i, dynamic: %03i, kind: %s, script: %-4s, language: %-4s (%-4s), type: %s, action: %s, name: %s",
+ (valid and "+") or "-",font,attr or 0,kind,script,language,what,typ,action,sequence.name)
+ end
+ return { valid, attribute, sequence.chain or 0, kind }
+ end
+ end
+ end
+ end
+ return false -- { valid, attribute, chain, "generic" } -- false anyway, could be flag instead of table
+ else
+ return false -- { false, false, chain } -- indirect lookup, part of chain (todo: make this a separate table)
+ end
+end
+
+function otf.dataset(tfmdata,sequences,font,attr)
+
+ local shared = tfmdata.shared
+ local properties = tfmdata.properties
+
+ local script, language, s_enabled, a_enabled, dynamic
+
+ if attr and attr ~= 0 then
+ local features = contextsetups[contextnumbers[attr]] -- could be a direct list
+ language = features.language or "dflt"
+ script = features.script or "dflt"
+ a_enabled = features
+ dynamic = contextmerged[attr] or 0
+ if dynamic == 2 or dynamic == -2 then
+ -- font based
+ s_enabled = shared.features
+ end
+ else
+ language = properties.language or "dflt"
+ script = properties.script or "dflt"
+ s_enabled = shared.features -- can be made local to the resolver
+ dynamic = 0
+ end
+
+ local res = resolved[font]
+ if not res then
+ res = { }
+ resolved[font] = res
+ end
+ local rs = res[script]
+ if not rs then
+ rs = { }
+ res[script] = rs
+ end
+ local rl = rs[language]
+ if not rl then
+ rl = { }
+ rs[language] = rl
+ end
+ local ra = rl[attr]
+ if ra == nil then -- attr can be false
+ ra = { }
+ rl[attr] = ra
+ setmetatableindex(ra, function(t,k)
+ local v = initialize(sequences[k],script,language,s_enabled,a_enabled,font,attr,dynamic)
+ t[k] = v
+ return v
+ end)
+ end
+
+ return ra
+
end
diff --git a/Master/texmf-dist/tex/context/base/font-otf.lua b/Master/texmf-dist/tex/context/base/font-otf.lua
index 9cecf21f055..36d18a2365f 100644
--- a/Master/texmf-dist/tex/context/base/font-otf.lua
+++ b/Master/texmf-dist/tex/context/base/font-otf.lua
@@ -6,120 +6,146 @@ if not modules then modules = { } end modules ['font-otf'] = {
license = "see context related readme files"
}
+-- langs -> languages enz
+-- anchor_classes vs kernclasses
+-- modification/creationtime in subfont is runtime dus zinloos
+-- to_table -> totable
+-- ascent descent
+
local utf = unicode.utf8
-local concat, getn, utfbyte = table.concat, table.getn, utf.byte
+local utfbyte = utf.byte
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 abs = math.abs
+local getn = table.getn
local lpegmatch = lpeg.match
+local reversed, concat, remove = table.reversed, table.concat, table.remove
+local ioflush = io.flush
+local fastcopy, tohash = table.fastcopy, table.tohash
+
+local allocate = utilities.storage.allocate
+local registertracker = trackers.register
+local registerdirective = directives.register
+local starttiming = statistics.starttiming
+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 report_otf = logs.reporter("fonts","otf loading")
+
+local fonts = fonts
+local otf = fonts.handlers.otf
+
+otf.glists = { "gsub", "gpos" }
+
+otf.version = 2.730 -- beware: also sync font-mis.lua
+otf.cache = containers.define("fonts", "otf", otf.version, true)
+
+local fontdata = fonts.hashes.identifiers
+local chardata = characters and characters.data -- not used
+
+local otffeatures = fonts.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 -- 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
+
+local wildcard = "*"
+local default = "dflt"
+
+local fontloaderfields = fontloader.fields
+local mainfields = nil
+local glyphfields = nil -- not used yet
+
+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)
+
+local function load_featurefile(raw,featurefile)
+ if featurefile and featurefile ~= "" then
+ if trace_loading then
+ report_otf("featurefile: %s", featurefile)
+ end
+ fontloader.apply_featurefile(raw, featurefile)
+ end
+end
-local trace_private = false trackers.register("otf.private", function(v) trace_private = v end)
-local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
-local trace_features = false trackers.register("otf.features", function(v) trace_features = v end)
-local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end)
-local trace_sequences = false trackers.register("otf.sequences", function(v) trace_sequences = v end)
-local trace_math = false trackers.register("otf.math", function(v) trace_math = v end)
-local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
-
---~ trackers.enable("otf.loading")
-
---[[ldx--
-<p>The fontforge table has organized lookups in a certain way. A first implementation
-of this code was organized featurewise: information related to features was
-collected and processing boiled down to a run over the features. The current
-implementation honors the order in the main feature table. Since we can reorder this
-table as we want, we can eventually support several models of processing. We kept
-the static as well as dynamic feature processing, because it had proved to be
-rather useful. The formerly three loop variants have beem discarded but will
-reapear at some time.</p>
-
-<itemize>
-<item>we loop over all lookups</item>
-<item>for each lookup we do a run over the list of glyphs</item>
-<item>but we only process them for features that are enabled</item>
-<item>if we're dealing with a contextual lookup, we loop over all contexts</item>
-<item>in that loop we quit at a match and then process the list of sublookups</item>
-<item>we always continue after the match</item>
-</itemize>
-
-<p>In <l n='context'/> we do this for each font that is used in a list, so in
-practice we have quite some nested loops.</p>
-
-<p>We process the whole list and then consult the glyph nodes. An alternative approach
-is to collect strings of characters using the same font including spaces (because some
-lookups involve spaces). However, we then need to reconstruct the list which is no fun.
-Also, we need to carry quite some information, like attributes, so eventually we don't
-gain much (if we gain something at all).</p>
-
-<p>Another consideration has been to operate on sublists (subhead, subtail) but again
-this would complicate matters as we then neext to keep track of a changing subhead
-and subtail. On the other hand, this might save some runtime. The number of changes
-involved is not that large. This only makes sense when we have many fonts in a list
-and don't change to frequently.</p>
---ldx]]--
-
-fonts = fonts or { }
-fonts.otf = fonts.otf or { }
-fonts.tfm = fonts.tfm or { }
-
-local otf = fonts.otf
-local tfm = fonts.tfm
-
-local fontdata = fonts.ids
-
-otf.tables = otf.tables or { } -- defined in font-ott.lua
-otf.meanings = otf.meanings or { } -- defined in font-ott.lua
-otf.tables.features = otf.tables.features or { } -- defined in font-ott.lua
-otf.tables.languages = otf.tables.languages or { } -- defined in font-ott.lua
-otf.tables.scripts = otf.tables.scripts or { } -- defined in font-ott.lua
-
-otf.features = otf.features or { }
-otf.features.list = otf.features.list or { }
-otf.features.default = otf.features.default or { }
-
-otf.enhancers = otf.enhancers or { }
-otf.glists = { "gsub", "gpos" }
-
-otf.version = 2.650 -- beware: also sync font-mis.lua
-otf.pack = true -- beware: also sync font-mis.lua
-otf.syncspace = true
-otf.notdef = false
-otf.cache = containers.define("fonts", "otf", otf.version, true)
-otf.cleanup_aat = false -- only context
-
-local wildcard = "*"
-local default = "dflt"
+local function showfeatureorder(rawdata,filename)
+ local sequences = rawdata.resources.sequences
+ if sequences and #sequences > 0 then
+ if trace_loading then
+ report_otf("font %s has %s sequences",filename,#sequences)
+ report_otf(" ")
+ end
+ for nos=1,#sequences do
+ local sequence = sequences[nos]
+ local typ = sequence.type or "no-type"
+ local name = sequence.name or "no-name"
+ local subtables = sequence.subtables or { "no-subtables" }
+ local features = sequence.features
+ if trace_loading then
+ report_otf("%3i %-15s %-20s [%s]",nos,name,typ,concat(subtables,","))
+ end
+ if features then
+ for feature, scripts in next, features do
+ local tt = { }
+ for script, languages in next, scripts do
+ local ttt = { }
+ for language, _ in next, languages do
+ ttt[#ttt+1] = language
+ end
+ tt[#tt+1] = format("[%s: %s]",script,concat(ttt," "))
+ end
+ if trace_loading then
+ report_otf(" %s: %s",feature,concat(tt," "))
+ end
+ end
+ end
+ end
+ if trace_loading then
+ report_otf("\n")
+ end
+ elseif trace_loading then
+ report_otf("font %s has no sequences",filename)
+ end
+end
--[[ldx--
<p>We start with a lot of tables and related functions.</p>
--ldx]]--
-otf.tables.global_fields = table.tohash {
- "lookups",
- "glyphs",
- "subfonts",
- "luatex",
- "pfminfo",
- "cidinfo",
- "tables",
- "names",
- "unicodes",
- "names",
---~ "math",
- "anchor_classes",
- "kern_classes",
- "gpos",
- "gsub"
-}
-
-otf.tables.valid_fields = {
- "anchor_classes",
+local valid_fields = table.tohash {
+ -- "anchor_classes",
"ascent",
- "cache_version",
+ -- "cache_version",
"cidinfo",
"copyright",
- "creationtime",
+ -- "creationtime",
"descent",
"design_range_bottom",
"design_range_top",
@@ -128,32 +154,32 @@ otf.tables.valid_fields = {
"extrema_bound",
"familyname",
"fontname",
+ "fontname",
"fontstyle_id",
"fontstyle_name",
"fullname",
- "glyphs",
+ -- "glyphs",
"hasvmetrics",
- "head_optimized_for_cleartype",
+ -- "head_optimized_for_cleartype",
"horiz_base",
"issans",
"isserif",
"italicangle",
- "kerns",
- "lookups",
- -- "luatex",
+ -- "kerns",
+ -- "lookups",
"macstyle",
- "modificationtime",
+ -- "modificationtime",
"onlybitmaps",
"origname",
"os2_version",
"pfminfo",
- "private",
+ -- "private",
"serifcheck",
"sfd_version",
-- "size",
"strokedfont",
"strokewidth",
- "subfonts",
+ -- "subfonts",
"table_version",
-- "tables",
-- "ttf_tab_saved",
@@ -164,282 +190,704 @@ otf.tables.valid_fields = {
"upos",
"use_typo_metrics",
"uwidth",
- "validation_state",
- "verbose",
+ -- "validation_state",
"version",
"vert_base",
"weight",
"weight_width_slope_only",
- "xuid",
+ -- "xuid",
+}
+
+local ordered_enhancers = {
+ "prepare tables",
+ "prepare glyphs",
+ "prepare lookups",
+
+ "analyze glyphs",
+ "analyze math",
+
+ "prepare tounicode", -- maybe merge with prepare
+
+ "reorganize lookups",
+ "reorganize mark classes",
+ "reorganize anchor classes",
+
+ "reorganize glyph kerns",
+ "reorganize glyph lookups",
+ "reorganize glyph anchors",
+
+ "merge kern classes",
+
+ "reorganize features",
+ "reorganize subtables",
+
+ "check glyphs",
+ "check metadata",
+ "check extra features", -- after metadata
+
+ "add duplicates",
+ "check encoding",
+
+ "cleanup tables",
}
--[[ldx--
<p>Here we go.</p>
--ldx]]--
-local function load_featurefile(ff,featurefile)
- if featurefile then
- featurefile = resolvers.find_file(file.addsuffix(featurefile,'fea'),'fea')
- if featurefile and featurefile ~= "" then
- if trace_loading then
- logs.report("load otf", "featurefile: %s", featurefile)
- end
- fontloader.apply_featurefile(ff, featurefile)
+local actions = allocate()
+local before = allocate()
+local after = allocate()
+
+patches.before = before
+patches.after = after
+
+local function enhance(name,data,filename,raw)
+ local enhancer = actions[name]
+ if enhancer then
+ if trace_loading then
+ report_otf("enhance: %s (%s)",name,filename)
+ ioflush()
end
+ enhancer(data,filename,raw)
+ elseif trace_loading then
+ -- report_otf("enhance: %s is undefined",name)
end
end
-function otf.enhance(name,data,filename,verbose)
- local enhancer = otf.enhancers[name]
- if enhancer then
- if (verbose ~= nil and verbose) or trace_loading then
- logs.report("load otf","enhance: %s (%s)",name,filename)
+function enhancers.apply(data,filename,raw)
+ local basename = file.basename(lower(filename))
+ if trace_loading then
+ report_otf("start enhancing: %s",filename)
+ end
+ ioflush() -- we want instant messages
+ for e=1,#ordered_enhancers do
+ local enhancer = ordered_enhancers[e]
+ local b = before[enhancer]
+ if b then
+ for pattern, action in next, b do
+ if find(basename,pattern) then
+ action(data,filename,raw)
+ end
+ end
end
- enhancer(data,filename)
+ enhance(enhancer,data,filename,raw)
+ local a = after[enhancer]
+ if a then
+ for pattern, action in next, a do
+ if find(basename,pattern) then
+ action(data,filename,raw)
+ end
+ end
+ end
+ ioflush() -- we want instant messages
+ end
+ if trace_loading then
+ report_otf("stop enhancing")
end
+ ioflush() -- we want instant messages
end
-local enhancers = {
- -- pack and unpack are handled separately; they might even be moved
- -- away from the enhancers namespace
- "patch bugs",
- "merge cid fonts", "prepare unicode", "cleanup ttf tables", "compact glyphs", "reverse coverage",
- "cleanup aat", "enrich with features", "add some missing characters",
- "reorganize mark classes",
- "reorganize kerns", -- moved here
- "flatten glyph lookups", "flatten anchor tables", "flatten feature tables",
- "simplify glyph lookups", -- some saving
- "prepare luatex tables",
- "analyse features", "rehash features",
- "analyse anchors", "analyse marks", "analyse unicodes", "analyse subtables",
- "check italic correction","check math",
- "share widths",
- "strip not needed data",
- "migrate metadata",
- "check math parameters",
-}
+-- patches.register("before","migrate metadata","cambria",function() end)
+
+function patches.register(what,where,pattern,action)
+ local ww = what[where]
+ if ww then
+ ww[pattern] = action
+ else
+ ww = { [pattern] = action}
+ end
+end
+
+function patches.report(fmt,...)
+ if trace_loading then
+ report_otf("patching: " ..fmt,...)
+ end
+end
+
+function enhancers.register(what,action) -- only already registered can be overloaded
+ actions[what] = action
+end
function otf.load(filename,format,sub,featurefile)
local name = file.basename(file.removesuffix(filename))
+ local attr = lfs.attributes(filename)
+ local size = attr and attr.size or 0
+ local time = attr and attr.modification or 0
if featurefile then
name = name .. "@" .. file.removesuffix(file.basename(featurefile))
end
- if sub == "" then sub = false end
+ if sub == "" then
+ sub = false
+ end
local hash = name
if sub then
hash = hash .. "-" .. sub
end
hash = containers.cleanname(hash)
- local data = containers.read(otf.cache(), hash)
- local size = lfs.attributes(filename,"size") or 0
- if not data or data.verbose ~= fonts.verbose or data.size ~= size then
- logs.report("load otf","loading: %s (hash: %s)",filename,hash)
- local ff, messages
+ local featurefiles
+ if featurefile then
+ featurefiles = { }
+ for s in gmatch(featurefile,"[^,]+") do
+ local name = resolvers.findfile(file.addsuffix(s,'fea'),'fea') or ""
+ if name == "" then
+ report_otf("loading: no featurefile '%s'",s)
+ else
+ local attr = lfs.attributes(name)
+ featurefiles[#featurefiles+1] = {
+ name = name,
+ size = size,
+ time = time,
+ }
+ end
+ end
+ if #featurefiles == 0 then
+ featurefiles = nil
+ end
+ end
+ local data = containers.read(otf.cache,hash)
+ local reload = not data or data.size ~= size or data.time ~= time
+ if forceload then
+ report_otf("loading: forced reload due to hard coded flag")
+ reload = true
+ end
+ if not reload then
+ local featuredata = data.featuredata
+ if featurefiles then
+ if not featuredata or #featuredata ~= #featurefiles then
+ reload = true
+ else
+ for i=1,#featurefiles do
+ local fi, fd = featurefiles[i], featuredata[i]
+ if fi.name ~= fd.name or fi.size ~= fd.size or fi.time ~= fd.time then
+ reload = true
+ break
+ end
+ end
+ end
+ elseif featuredata then
+ reload = true
+ end
+ if reload then
+ report_otf("loading: forced reload due to changed featurefile specification: %s",featurefile or "--")
+ end
+ end
+ if reload then
+ report_otf("loading: %s (hash: %s)",filename,hash)
+ local fontdata, messages
if sub then
- ff, messages = fontloader.open(filename,sub)
+ fontdata, messages = fontloader.open(filename,sub)
else
- ff, messages = fontloader.open(filename)
+ fontdata, messages = fontloader.open(filename)
+ end
+ if fontdata then
+ mainfields = mainfields or (fontloaderfields and fontloaderfields(fontdata))
end
if trace_loading and messages and #messages > 0 then
if type(messages) == "string" then
- logs.report("load otf","warning: %s",messages)
+ report_otf("warning: %s",messages)
else
for m=1,#messages do
- logs.report("load otf","warning: %s",tostring(messages[m]))
+ report_otf("warning: %s",tostring(messages[m]))
end
end
else
- logs.report("load otf","font loaded okay")
+ report_otf("font loaded okay")
end
- if ff then
- load_featurefile(ff,featurefile)
- data = fontloader.to_table(ff)
- fontloader.close(ff)
- if data then
- logs.report("load otf","file size: %s", size)
- logs.report("load otf","enhancing ...")
- for e=1,#enhancers do
- otf.enhance(enhancers[e],data,filename)
- io.flush() -- we want instant messages
+ if fontdata then
+ if featurefiles then
+ for i=1,#featurefiles do
+ load_featurefile(fontdata,featurefiles[i].name)
end
- if otf.pack and not fonts.verbose then
- otf.enhance("pack",data,filename)
+ end
+ local unicodes = {
+ -- names to unicodes
+ }
+ local splitter = lpeg.splitter(" ",unicodes)
+ data = {
+ size = size,
+ time = time,
+ format = format,
+ featuredata = featurefiles,
+ resources = {
+ filename = resolvers.unresolve(filename), -- no shortcut
+ version = otf.version,
+ creator = "context mkiv",
+ unicodes = unicodes,
+ indices = {
+ -- index to unicodes
+ },
+ duplicates = {
+ -- alternative unicodes
+ },
+ lookuptypes = {
+ },
+ },
+ metadata = {
+ -- raw metadata, not to be used
+ },
+ properties = {
+ -- normalized metadata
+ },
+ descriptions = {
+ },
+ goodies = {
+ },
+ helpers = {
+ tounicodelist = splitter,
+ tounicodetable = lpeg.Ct(splitter),
+ },
+ }
+ starttiming(data)
+ report_otf("file size: %s", size)
+ enhancers.apply(data,filename,fontdata)
+ if packdata then
+ if cleanup > 0 then
+ collectgarbage("collect")
end
- data.size = size
- data.verbose = fonts.verbose
- logs.report("load otf","saving in cache: %s",filename)
- data = containers.write(otf.cache(), hash, data)
+ enhance("pack",data,filename,nil)
+ end
+ report_otf("saving in cache: %s",filename)
+ data = containers.write(otf.cache, hash, data)
+ if cleanup > 1 then
collectgarbage("collect")
- data = containers.read(otf.cache(), hash) -- this frees the old table and load the sparse one
+ end
+ stoptiming(data)
+ if elapsedtime then -- not in generic
+ report_otf("preprocessing and caching took %s seconds",elapsedtime(data))
+ end
+ fontloader.close(fontdata) -- free memory
+ if cleanup > 3 then
+ collectgarbage("collect")
+ end
+ data = containers.read(otf.cache, hash) -- this frees the old table and load the sparse one
+ if cleanup > 2 then
collectgarbage("collect")
- else
- logs.report("load otf","loading failed (table conversion error)")
end
else
- logs.report("load otf","loading failed (file read error)")
+ data = nil
+ report_otf("loading failed (file read error)")
end
end
if data then
if trace_defining then
- logs.report("define font","loading from cache: %s",hash)
+ report_otf("loading from cache: %s",hash)
end
- otf.enhance("unpack",data,filename,false) -- no message here
- otf.add_dimensions(data)
+ enhance("unpack",data,filename,nil,false)
+ enhance("add dimensions",data,filename,nil,false)
if trace_sequences then
- otf.show_feature_order(data,filename)
+ showfeatureorder(data,filename)
end
end
return data
end
-function otf.add_dimensions(data)
+local mt = {
+ __index = function(t,k) -- maybe set it
+ if k == "height" then
+ local ht = t.boundingbox[4]
+ return ht < 0 and 0 or ht
+ elseif k == "depth" then
+ local dp = -t.boundingbox[2]
+ return dp < 0 and 0 or dp
+ elseif k == "width" then
+ return 0
+ elseif k == "name" then -- or maybe uni*
+ return forcenotdef and ".notdef"
+ end
+ end
+}
+
+actions["prepare tables"] = function(data,filename,raw)
+ data.properties.italic_correction = false
+end
+
+actions["add dimensions"] = function(data,filename)
-- todo: forget about the width if it's the defaultwidth (saves mem)
-- we could also build the marks hash here (instead of storing it)
if data then
- local force = otf.notdef
- local luatex = data.luatex
- local defaultwidth = luatex.defaultwidth or 0
- local defaultheight = luatex.defaultheight or 0
- local defaultdepth = luatex.defaultdepth or 0
- for _, d in next, data.glyphs do
- local bb, wd = d.boundingbox, d.width
- if not wd then
- d.width = defaultwidth
- elseif wd ~= 0 and d.class == "mark" then
- d.width = -wd
+ local descriptions = data.descriptions
+ local resources = data.resources
+ local defaultwidth = resources.defaultwidth or 0
+ local defaultheight = resources.defaultheight or 0
+ local defaultdepth = resources.defaultdepth or 0
+ 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 with width %s (%s) in %s",wd,d.name or "<noname>",file.basename(filename))
+ -- d.width = -wd
+ end
+ setmetatable(d,mt)
end
- if force and not d.name then
- d.name = ".notdef"
+ 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 with width %s (%s) in %s",wd,d.name or "<noname>",file.basename(filename))
+ -- 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 ht == 0 or ht < 0 then
+ -- not set
+ else
+ d.height = ht
+ end
+ if dp == 0 or dp < 0 then
+ -- not set
+ else
+ d.depth = dp
+ end
+ end
end
- if bb then
- local ht, dp = bb[4], -bb[2]
- if ht == 0 or ht < 0 then
- -- no need to set it and no negative heights, nil == 0
+ end
+ end
+end
+
+local function somecopy(old) -- fast one
+ if old then
+ local new = { }
+ if type(old) == "table" then
+ for k, v in next, old do
+ if k == "glyphs" then
+ -- skip
+ elseif type(v) == "table" then
+ new[k] = somecopy(v)
else
- d.height = ht
+ new[k] = v
end
- if dp == 0 or dp < 0 then
- -- no negative depths and no negative depths, nil == 0
+ end
+ else
+ for i=1,#mainfields do
+ local k = mainfields[i]
+ local v = old[k]
+ if k == "glyphs" then
+ -- skip
+ elseif type(v) == "table" then
+ new[k] = somecopy(v)
else
- d.depth = dp
+ new[k] = v
end
end
end
+ return new
+ else
+ return { }
end
end
-function otf.show_feature_order(otfdata,filename)
- local sequences = otfdata.luatex.sequences
- if sequences and #sequences > 0 then
- if trace_loading then
- logs.report("otf check","font %s has %s sequences",filename,#sequences)
- logs.report("otf check"," ")
- end
- for nos=1,#sequences do
- local sequence = sequences[nos]
- local typ = sequence.type or "no-type"
- local name = sequence.name or "no-name"
- local subtables = sequence.subtables or { "no-subtables" }
- local features = sequence.features
- if trace_loading then
- logs.report("otf check","%3i %-15s %-20s [%s]",nos,name,typ,concat(subtables,","))
- end
- if features then
- for feature, scripts in next, features do
- local tt = { }
- for script, languages in next, scripts do
- local ttt = { }
- for language, _ in next, languages do
- ttt[#ttt+1] = language
+-- not setting italic_correction and class (when nil) during
+-- table cronstruction can save some mem
+
+actions["prepare glyphs"] = function(data,filename,raw)
+ local rawglyphs = raw.glyphs
+ local rawsubfonts = raw.subfonts
+ local rawcidinfo = raw.cidinfo
+ local criterium = constructors.privateoffset
+ local private = criterium
+ local resources = data.resources
+ local metadata = data.metadata
+ local properties = data.properties
+ local descriptions = data.descriptions
+ local unicodes = resources.unicodes -- name to unicode
+ local indices = resources.indices -- index to unicode
+ local duplicates = resources.duplicates
+
+ if rawsubfonts then
+
+ metadata.subfonts = { }
+ properties.cidinfo = rawcidinfo
+
+ if rawcidinfo.registry then
+ local cidmap = fonts.cid.getmap(rawcidinfo)
+ if cidmap then
+ rawcidinfo.usedname = cidmap.usedname
+ local nofnames, nofunicodes = 0, 0
+ local cidunicodes, cidnames = cidmap.unicodes, cidmap.names
+ for cidindex=1,#rawsubfonts do
+ local subfont = rawsubfonts[cidindex]
+ local cidglyphs = subfont.glyphs
+ metadata.subfonts[cidindex] = somecopy(subfont)
+ 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
+ local name = glyph.name or cidnames[index]
+ if not unicode or unicode == -1 or unicode >= criterium then
+ unicode = cidunicodes[index]
+ end
+ if not unicode or unicode == -1 or unicode >= criterium then
+ if not name then
+ name = format("u%06X",private)
+ end
+ unicode = private
+ unicodes[name] = private
+ if trace_private then
+ report_otf("enhance: glyph %s at index 0x%04X is moved to private unicode slot U+%05X",name,index,private)
+ end
+ private = private + 1
+ nofnames = nofnames + 1
+ else
+ if not name then
+ name = format("u%06X",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,
+ name = glyph.name or name or "unknown", -- uniXXXX
+ cidindex = cidindex,
+ index = index,
+ glyph = glyph,
+ }
+
+ descriptions[unicode] = description
+ else
+ -- report_otf("potential problem: glyph 0x%04X is used but empty",index)
end
- tt[#tt+1] = format("[%s: %s]",script,concat(ttt," "))
- end
- if trace_loading then
- logs.report("otf check"," %s: %s",feature,concat(tt," "))
end
end
+ if trace_loading then
+ report_otf("cid font remapped, %s unicode points, %s symbolic names, %s glyphs",nofunicodes, nofnames, nofunicodes+nofnames)
+ end
+ elseif trace_loading then
+ report_otf("unable to remap cid font, missing cid file for %s",filename)
end
+ elseif trace_loading then
+ report_otf("font %s has no glyphs",filename)
end
- if trace_loading then
- logs.report("otf check","\n")
- end
- elseif trace_loading then
- logs.report("otf check","font %s has no sequences",filename)
- end
-end
--- todo: normalize, design_size => designsize
+ else
-otf.enhancers["reorganize mark classes"] = function(data,filename)
- if data.mark_classes then
- local unicodes = data.luatex.unicodes
- local reverse = { }
- for name, class in next, data.mark_classes do
- local t = { }
- for s in gmatch(class,"[^ ]+") do
- local us = unicodes[s]
- if type(us) == "table" then
- for u=1,#us do
- t[us[u]] = true
+ for index=0,raw.glyphcnt-1 do -- not raw.glyphmax-1 (as that will crash)
+ local glyph = rawglyphs[index]
+ if glyph then
+ local unicode = glyph.unicode
+ local name = glyph.name
+ if not unicode or unicode == -1 or unicode >= criterium then
+ unicode = private
+ unicodes[name] = private
+ if trace_private then
+ report_otf("enhance: glyph %s at index 0x%04X is moved to private unicode slot U+%05X",name,index,private)
end
+ private = private + 1
else
- t[us] = true
+ unicodes[name] = unicode
+ end
+ indices[index] = unicode
+ if not name then
+ name = format("u%06X",unicode)
+ end
+ descriptions[unicode] = {
+ -- width = glyph.width,
+ boundingbox = glyph.boundingbox,
+ name = name,
+ index = index,
+ glyph = glyph,
+ }
+ local altuni = glyph.altuni
+ if altuni then
+ local d = { }
+ for i=1,#altuni do
+ d[#d+1] = altuni[i].unicode
+ end
+ duplicates[unicode] = d
end
+ else
+ report_otf("potential problem: glyph 0x%04X is used but empty",index)
end
- reverse[name] = t
end
- data.luatex.markclasses = reverse
- data.mark_classes = nil
+
end
-end
-otf.enhancers["prepare luatex tables"] = function(data,filename)
- data.luatex = data.luatex or { }
- local luatex = data.luatex
- luatex.filename = filename
- luatex.version = otf.version
- luatex.creator = "context mkiv"
+ resources.private = private
+
end
-otf.enhancers["cleanup aat"] = function(data,filename)
- if otf.cleanup_aat then
+-- the next one is still messy but will get better when we have
+-- flattened map/enc tables in the font loader
+
+actions["check encoding"] = function(data,filename,raw)
+ local descriptions = data.descriptions
+ local resources = data.resources
+ local properties = data.properties
+ local unicodes = resources.unicodes -- name to unicode
+ local indices = resources.indices -- index to unicodes
+ local duplicates = resources.duplicates
+
+ -- begin of messy (not needed whwn cidmap)
+
+ local mapdata = raw.map or { }
+ local unicodetoindex = mapdata and mapdata.map or { }
+ -- local encname = lower(data.enc_name or raw.enc_name or mapdata.enc_name or "")
+ local encname = lower(data.enc_name or mapdata.enc_name or "")
+ local criterium = 0xFFFF -- for instance cambria has a lot of mess up there
+
+ -- end of messy
+
+ if find(encname,"unicode") then -- unicodebmp, unicodefull, ...
+ if trace_loading then
+ report_otf("checking embedded unicode map '%s'",encname)
+ end
+ for unicode, index in next, unicodetoindex do -- altuni already covers this
+ if unicode <= criterium and not descriptions[unicode] then
+ local parent = indices[index] -- why nil?
+ if parent then
+ report_otf("weird, unicode U+%05X points to U+%05X with index 0x%04X",unicode,parent,index)
+ else
+ report_otf("weird, unicode U+%05X points to nowhere with index 0x%04X",unicode,index)
+ end
+ end
+ end
+ elseif properties.cidinfo then
+ report_otf("warning: no unicode map, used cidmap '%s'",properties.cidinfo.usedname or "?")
+ else
+ report_otf("warning: non unicode map '%s', only using glyph unicode data",encname or "whatever")
+ end
+
+ if mapdata then
+ mapdata.map = { } -- clear some memory
end
end
-local function analyze_features(g, features)
- if g then
- local t, done = { }, { }
- for k=1,#g do
- local f = features or g[k].features
- if f then
- for k=1,#f do
- -- scripts and tag
- local tag = f[k].tag
- if not done[tag] then
- t[#t+1] = tag
- done[tag] = true
+-- for the moment we assume that a fotn with lookups will not use
+-- altuni so we stick to kerns only
+
+actions["add duplicates"] = function(data,filename,raw)
+ local descriptions = data.descriptions
+ local resources = data.resources
+ local properties = data.properties
+ local unicodes = resources.unicodes -- name to unicode
+ local indices = resources.indices -- index to unicodes
+ local duplicates = resources.duplicates
+
+ for unicode, d in next, duplicates do
+ for i=1,#d do
+ local u = d[i]
+ if not descriptions[u] then
+ local description = descriptions[unicode]
+ local duplicate = table.copy(description) -- else packing problem
+ duplicate.comment = format("copy of U+%05X", unicode)
+ descriptions[u] = duplicate
+ local n = 0
+ for _, description in next, descriptions do
+ if kerns then
+ local kerns = description.kerns
+ for _, k in next, kerns do
+ local ku = k[unicode]
+ if ku then
+ k[u] = ku
+ n = n + 1
+ end
+ end
end
+ -- todo: lookups etc
+ end
+ if trace_loading then
+ report_otf("duplicating U+%05X to U+%05X with index 0x%04X (%s kerns)",unicode,u,description.index,n)
end
end
end
- if #t > 0 then
- return t
+ end
+
+end
+
+-- class : nil base mark ligature component (maybe we don't need it in description)
+-- boundingbox: split into ht/dp takes more memory (larger tables and less sharing)
+
+actions["analyze glyphs"] = function(data,filename,raw) -- maybe integrate this in the previous
+ local descriptions = data.descriptions
+ local resources = data.resources
+ local metadata = data.metadata
+ local properties = data.properties
+ local italic_correction = false
+ local widths = { }
+ local marks = { }
+ for unicode, description in next, descriptions do
+ local glyph = description.glyph
+ local italic = glyph.italic_correction
+ if not italic then
+ -- skip
+ elseif italic == 0 then
+ -- skip
+ else
+ description.italic = italic
+ italic_correction = true
+ end
+ local width = glyph.width
+ widths[width] = (widths[width] or 0) + 1
+ local class = glyph.class
+ if class then
+ if class == "mark" then
+ marks[unicode] = true
+ end
+ description.class = class
+ end
+ end
+ -- flag italic
+ properties.italic_correction = italic_correction
+ -- flag marks
+ resources.marks = marks
+ -- share most common width for cjk fonts
+ local wd, most = 0, 1
+ for k,v in next, widths do
+ if v > most then
+ wd, most = k, v
+ end
+ end
+ if most > 1000 then -- maybe 500
+ if trace_loading then
+ report_otf("most common width: %s (%s times), sharing (cjk font)",wd,most)
+ end
+ for unicode, description in next, descriptions do
+ if description.width == wd then
+ -- description.width = nil
+ else
+ description.width = description.glyph.width
+ end
+ end
+ resources.defaultwidth = wd
+ else
+ for unicode, description in next, descriptions do
+ description.width = description.glyph.width
end
end
- return nil
end
-otf.enhancers["analyse features"] = function(data,filename)
- -- local luatex = data.luatex
- -- luatex.gposfeatures = analyze_features(data.gpos)
- -- luatex.gsubfeatures = analyze_features(data.gsub)
+actions["reorganize mark classes"] = function(data,filename,raw)
+ local mark_classes = raw.mark_classes
+ if mark_classes then
+ local resources = data.resources
+ local unicodes = resources.unicodes
+ local markclasses = { }
+ resources.markclasses = markclasses -- reversed
+ for name, class in next, mark_classes do
+ local t = { }
+ for s in gmatch(class,"[^ ]+") do
+ t[unicodes[s]] = true
+ end
+ markclasses[name] = t
+ end
+ end
end
-otf.enhancers["rehash features"] = function(data,filename)
+actions["reorganize features"] = function(data,filename,raw) -- combine with other
local features = { }
- data.luatex.features = features
+ data.resources.features = features
for k, what in next, otf.glists do
- local dw = data[what]
+ local dw = raw[what]
if dw then
local f = { }
features[what] = f
@@ -450,10 +898,16 @@ otf.enhancers["rehash features"] = function(data,filename)
for i=1,#dfeatures do
local df = dfeatures[i]
local tag = strip(lower(df.tag))
- local ft = f[tag] if not ft then ft = {} f[tag] = ft end
+ local ft = f[tag]
+ if not ft then
+ ft = { }
+ f[tag] = ft
+ end
local dscripts = df.scripts
- for script, languages in next, dscripts do
- script = strip(lower(script))
+ for i=1,#dscripts do
+ local d = dscripts[i]
+ local languages = d.langs
+ local script = strip(lower(d.script))
local fts = ft[script] if not fts then fts = {} ft[script] = fts end
for i=1,#languages do
fts[strip(lower(languages[i]))] = true
@@ -466,665 +920,572 @@ otf.enhancers["rehash features"] = function(data,filename)
end
end
-otf.enhancers["analyse anchors"] = function(data,filename)
- local classes = data.anchor_classes
- local luatex = data.luatex
- local anchor_to_lookup, lookup_to_anchor = { }, { }
- luatex.anchor_to_lookup, luatex.lookup_to_anchor = anchor_to_lookup, lookup_to_anchor
+actions["reorganize anchor classes"] = function(data,filename,raw)
+ local resources = data.resources
+ local anchor_to_lookup = { }
+ local lookup_to_anchor = { }
+ resources.anchor_to_lookup = anchor_to_lookup
+ resources.lookup_to_anchor = lookup_to_anchor
+ local classes = raw.anchor_classes -- anchor classes not in final table
if classes then
for c=1,#classes do
- local class = classes[c]
- local anchor = class.name
+ local class = classes[c]
+ local anchor = class.name
local lookups = class.lookup
if type(lookups) ~= "table" then
lookups = { lookups }
end
local a = anchor_to_lookup[anchor]
- if not a then a = { } anchor_to_lookup[anchor] = a end
+ if not a then
+ a = { }
+ anchor_to_lookup[anchor] = a
+ end
for l=1,#lookups do
local lookup = lookups[l]
local l = lookup_to_anchor[lookup]
- if not l then l = { } lookup_to_anchor[lookup] = l end
- l[anchor] = true
+ if l then
+ l[anchor] = true
+ else
+ l = { [anchor] = true }
+ lookup_to_anchor[lookup] = l
+ end
a[lookup] = true
end
end
end
end
-otf.enhancers["analyse marks"] = function(data,filename)
- local glyphs = data.glyphs
- local marks = { }
- data.luatex.marks = marks
- for unicode, index in next, data.luatex.indices do
- local glyph = glyphs[index]
- if glyph.class == "mark" then
- marks[unicode] = true
- end
- end
+actions["prepare tounicode"] = function(data,filename,raw)
+ fonts.mappings.addtounicode(data,filename)
end
-otf.enhancers["analyse unicodes"] = fonts.map.add_to_unicode
-
-otf.enhancers["analyse subtables"] = function(data,filename)
- data.luatex = data.luatex or { }
- local luatex = data.luatex
- local sequences = { }
- local lookups = { }
- luatex.sequences = sequences
- luatex.lookups = lookups
- for _, g in next, { data.gsub, data.gpos } do
- for k=1,#g do
- local gk = g[k]
- local typ = gk.type
- if typ == "gsub_contextchain" or typ == "gpos_contextchain" then
- gk.chain = 1
- elseif typ == "gsub_reversecontextchain" or typ == "gpos_reversecontextchain" then
- gk.chain = -1
- else
- gk.chain = 0
- end
- local features = gk.features
- if features then
- sequences[#sequences+1] = gk
- -- scripts, tag, ismac
- local t = { }
- for f=1,#features do
- local feature = features[f]
- local hash = { }
- -- only script and langs matter
- for s, languages in next, feature.scripts do
- s = lower(s)
- local h = hash[s]
- if not h then h = { } hash[s] = h end
- for l=1,#languages do
- h[strip(lower(languages[l]))] = true
- end
+actions["reorganize subtables"] = function(data,filename,raw)
+ local resources = data.resources
+ local sequences = { }
+ local lookups = { }
+ local chainedfeatures = { }
+ resources.sequences = sequences
+ resources.lookups = lookups
+ for _, what in next, otf.glists do
+ local dw = raw[what]
+ if dw then
+ for k=1,#dw do
+ local gk = dw[k]
+ local typ = gk.type
+ local chain =
+ (typ == "gsub_contextchain" or typ == "gpos_contextchain") and 1 or
+ (typ == "gsub_reversecontextchain" or typ == "gpos_reversecontextchain") and -1 or 0
+ --
+ local subtables = gk.subtables
+ if subtables then
+ local t = { }
+ for s=1,#subtables do
+ t[s] = subtables[s].name
end
- t[feature.tag] = hash
- end
- gk.features = t
- else
- lookups[gk.name] = gk
- gk.name = nil
- end
- local subtables = gk.subtables
- if subtables then
- local t = { }
- for s=1,#subtables do
- local subtable = subtables[s]
- local name = subtable.name
- t[#t+1] = name
+ subtables = t
end
- gk.subtables = t
- end
- local flags = gk.flags
- if flags then
- gk.flags = { -- forcing false packs nicer
- (flags.ignorecombiningmarks and "mark") or false,
- (flags.ignoreligatures and "ligature") or false,
- (flags.ignorebaseglyphs and "base") or false,
- flags.r2l or false,
- }
- if flags.mark_class then
- gk.markclass = luatex.markclasses[flags.mark_class]
+ local flags, markclass = gk.flags, nil
+ if flags then
+ local t = { -- forcing false packs nicer
+ (flags.ignorecombiningmarks and "mark") or false,
+ (flags.ignoreligatures and "ligature") or false,
+ (flags.ignorebaseglyphs and "base") or false,
+ flags.r2l or false,
+ }
+ markclass = flags.mark_class
+ if markclass then
+ markclass = resources.markclasses[markclass]
+ end
+ flags = t
end
- end
- end
- end
-end
-
-otf.enhancers["merge cid fonts"] = function(data,filename)
- -- we can also move the names to data.luatex.names which might
- -- save us some more memory (at the cost of harder tracing)
- if data.subfonts then
- if data.glyphs and next(data.glyphs) then
- logs.report("load otf","replacing existing glyph table due to subfonts")
- end
- local cidinfo = data.cidinfo
- local verbose = fonts.verbose
- if cidinfo.registry then
- local cidmap, cidname = fonts.cid.getmap(cidinfo.registry,cidinfo.ordering,cidinfo.supplement)
- if cidmap then
- cidinfo.usedname = cidmap.usedname
- local glyphs, uni_to_int, int_to_uni, nofnames, nofunicodes = { }, { }, { }, 0, 0
- local unicodes, names = cidmap.unicodes, cidmap.names
- for n, subfont in next, data.subfonts do
- for index, g in next, subfont.glyphs do
- if not next(g) then
- -- dummy entry
- else
- local unicode, name = unicodes[index], names[index]
- g.cidindex = n
- g.boundingbox = g.boundingbox -- or zerobox
- g.name = g.name or name or "unknown"
- if unicode then
- uni_to_int[unicode] = index
- int_to_uni[index] = unicode
- nofunicodes = nofunicodes + 1
- g.unicode = unicode
- elseif name then
- nofnames = nofnames + 1
- g.unicode = -1
+ --
+ local name = gk.name
+ --
+ local features = gk.features
+ if features then
+ -- scripts, tag, ismac
+ local f = { }
+ for i=1,#features do
+ local df = features[i]
+ local tag = strip(lower(df.tag))
+ local ft = f[tag] if not ft then ft = {} f[tag] = ft end
+ local dscripts = df.scripts
+ for i=1,#dscripts do
+ local d = dscripts[i]
+ local languages = d.langs
+ local script = strip(lower(d.script))
+ local fts = ft[script] if not fts then fts = {} ft[script] = fts end
+ for i=1,#languages do
+ fts[strip(lower(languages[i]))] = true
end
- glyphs[index] = g
end
end
- subfont.glyphs = nil
- end
- if trace_loading then
- logs.report("load otf","cid font remapped, %s unicode points, %s symbolic names, %s glyphs",nofunicodes, nofnames, nofunicodes+nofnames)
+ sequences[#sequences+1] = {
+ type = typ,
+ chain = chain,
+ flags = flags,
+ name = name,
+ subtables = subtables,
+ markclass = markclass,
+ features = f,
+ }
+ else
+ lookups[name] = {
+ type = typ,
+ chain = chain,
+ flags = flags,
+ subtables = subtables,
+ markclass = markclass,
+ }
end
- data.glyphs = glyphs
- data.map = data.map or { }
- data.map.map = uni_to_int
- data.map.backmap = int_to_uni
- elseif trace_loading then
- logs.report("load otf","unable to remap cid font, missing cid file for %s",filename)
end
- elseif trace_loading then
- logs.report("load otf","font %s has no glyphs",filename)
end
end
end
-otf.enhancers["prepare unicode"] = function(data,filename)
- local luatex = data.luatex
- if not luatex then luatex = { } data.luatex = luatex end
- local indices, unicodes, multiples, internals = { }, { }, { }, { }
- local glyphs = data.glyphs
- local mapmap = data.map
- if not mapmap then
- logs.report("load otf","no map in %s",filename)
- mapmap = { }
- data.map = { map = mapmap }
- elseif not mapmap.map then
- logs.report("load otf","no unicode map in %s",filename)
- mapmap = { }
- data.map.map = mapmap
- else
- mapmap = mapmap.map
- end
- local criterium = fonts.private
- local private = fonts.private
- for index, glyph in next, glyphs do
- if index > 0 then
- local name = glyph.name
- if name then
- local unicode = glyph.unicode
- if unicode == -1 or unicode >= criterium then
- glyph.unicode = private
- indices[private] = index
- unicodes[name] = private
- internals[index] = true
- if trace_private then
- logs.report("load otf","enhance: glyph %s at index U+%04X is moved to private unicode slot U+%04X",name,index,private)
- end
- private = private + 1
- else
- indices[unicode] = index
- unicodes[name] = unicode
- end
- end
- end
- end
- -- beware: the indices table is used to initialize the tfm table
- for unicode, index in next, mapmap do
- if not internals[index] then
- local name = glyphs[index].name
- if name then
- local un = unicodes[name]
- if not un then
- unicodes[name] = unicode -- or 0
- elseif type(un) == "number" then
- if un ~= unicode then
- multiples[#multiples+1] = name
- unicodes[name] = { un, unicode }
- indices[unicode] = index
- end
- else
- local ok = false
- for u=1,#un do
- if un[u] == unicode then
- ok = true
- break
- end
- end
- if not ok then
- multiples[#multiples+1] = name
- un[#un+1] = unicode
- indices[unicode] = index
- end
- end
- end
- end
- end
- if trace_loading then
- if #multiples > 0 then
- logs.report("load otf","%s glyph are reused: %s",#multiples, concat(multiples," "))
- else
- logs.report("load otf","no glyph are reused")
- end
+-- test this:
+--
+-- for _, what in next, otf.glists do
+-- raw[what] = nil
+-- end
+
+actions["prepare lookups"] = function(data,filename,raw)
+ local lookups = raw.lookups
+ if lookups then
+ data.lookups = lookups
end
- luatex.indices = indices
- luatex.unicodes = unicodes
- luatex.private = private
end
-otf.enhancers["cleanup ttf tables"] = function(data,filename)
- local ttf_tables = data.ttf_tables
- if ttf_tables then
- for k=1,#ttf_tables do
- if ttf_tables[k].data then ttf_tables[k].data = "deleted" end
+-- The reverse handler does a bit redundant splitting but it's seldom
+-- seen so we don' tbother too much. We could store the replacement
+-- in the current list (value instead of true) but it makes other code
+-- uglier. Maybe some day.
+
+local function t_uncover(splitter,cache,covers)
+ local result = { }
+ for n=1,#covers do
+ local cover = covers[n]
+ local uncovered = cache[cover]
+ if not uncovered then
+ uncovered = lpegmatch(splitter,cover)
+ cache[cover] = uncovered
end
+ result[n] = uncovered
end
- data.ttf_tab_saved = nil
+ return result
end
-otf.enhancers["compact glyphs"] = function(data,filename)
- table.compact(data.glyphs) -- needed?
- if data.subfonts then
- for _, subfont in next, data.subfonts do
- table.compact(subfont.glyphs) -- needed?
+local function t_hashed(t,cache)
+ if t then
+ local h = { }
+ for i=1,#t do
+ local ti = t[i]
+ local h = cache[ti]
+ if not h then
+ h = { }
+ for i=1,#ti do
+ h[ti] = true
+ end
+ end
+ cache[ti] = h
end
+ return h
+ else
+ return nil
end
end
-otf.enhancers["reverse coverage"] = function(data,filename)
- -- we prefer the before lookups in a normal order
- if data.lookups then
- for _, v in next, data.lookups do
- if v.rules then
- for _, vv in next, v.rules do
- local c = vv.coverage
- if c and c.before then
- c.before = table.reverse(c.before)
- end
- end
+local function s_uncover(splitter,cache,cover)
+ if cover == "" then
+ return nil
+ else
+ local uncovered = cache[cover]
+ if not uncovered then
+ uncovered = lpegmatch(splitter,cover)
+ for i=1,#uncovered do
+ uncovered[i] = { [uncovered[i]] = true }
end
+ cache[cover] = uncovered
end
+ return uncovered
end
end
-otf.enhancers["check italic correction"] = function(data,filename)
- local glyphs = data.glyphs
- local ok = false
- for index, glyph in next, glyphs do
- local ic = glyph.italic_correction
- if ic then
- if ic ~= 0 then
- glyph.italic = ic
+local s_hashed = t_hashed
+
+local function r_uncover(splitter,cache,cover,replacements)
+ if cover == "" then
+ return nil
+ else
+ -- we always have current as { } even in the case of one
+ local uncovered = cover[1]
+ local replaced = cache[replacements]
+ if not replaced then
+ replaced = lpegmatch(splitter,replacements)
+ cache[replacements] = replaced
+ end
+ local nu, nr = #uncovered, #replaced
+ local r = { }
+ if nu == nr then
+ for i=1,nu do
+ r[uncovered[i]] = replaced[i]
end
- glyph.italic_correction = nil
- ok = true
end
+ return r
end
- -- we can use this to avoid calculations
- otf.tables.valid_fields[#otf.tables.valid_fields+1] = "has_italic"
- data.has_italic = true
end
-otf.enhancers["check math"] = function(data,filename)
- if data.math then
- -- we move the math stuff into a math subtable because we then can
- -- test faster in the tfm copy
- local glyphs = data.glyphs
- local unicodes = data.luatex.unicodes
- for index, glyph in next, glyphs do
- local mk = glyph.mathkern
- local hv = glyph.horiz_variants
- local vv = glyph.vert_variants
- if mk or hv or vv then
- local math = { }
- glyph.math = math
- if mk then
- for k, v in next, mk do
- if not next(v) then
- mk[k] = nil
- end
+actions["reorganize lookups"] = function(data,filename,raw)
+ -- we prefer the before lookups in a normal order
+ if data.lookups then
+ local splitter = data.helpers.tounicodetable
+ local cache, h_cache = { }, { }
+ for _, lookup in next, data.lookups do
+ local rules = lookup.rules
+ if rules then
+ local format = lookup.format
+ if format == "class" then
+ local before_class = lookup.before_class
+ if before_class then
+ before_class = t_uncover(splitter,cache,reversed(before_class))
end
- math.kerns = mk
- glyph.mathkern = nil
- end
- if hv then
- math.horiz_variants = hv.variants
- local p = hv.parts
- if p then
- if #p>0 then
- for i=1,#p do
- local pi = p[i]
- pi.glyph = unicodes[pi.component] or 0
+ local current_class = lookup.current_class
+ if current_class then
+ current_class = t_uncover(splitter,cache,current_class)
+ end
+ local after_class = lookup.after_class
+ if after_class then
+ after_class = t_uncover(splitter,cache,after_class)
+ end
+ for i=1,#rules do
+ local rule = rules[i]
+ local class = rule.class
+ local before = class.before
+ if before then
+ for i=1,#before do
+ before[i] = before_class[before[i]] or { }
end
- math.horiz_parts = p
+ rule.before = t_hashed(before,h_cache)
end
+ local current = class.current
+ local lookups = rule.lookups
+ if current then
+ for i=1,#current do
+ current[i] = current_class[current[i]] or { }
+ if lookups and not lookups[i] then
+ lookups[i] = false
+ end
+ end
+ rule.current = t_hashed(current,h_cache)
+ end
+ local after = class.after
+ if after then
+ for i=1,#after do
+ after[i] = after_class[after[i]] or { }
+ end
+ rule.after = t_hashed(after,h_cache)
+ end
+ rule.class = nil
end
- local ic = hv.italic_correction
- if ic and ic ~= 0 then
- math.horiz_italic_correction = ic
- end
- glyph.horiz_variants = nil
- end
- if vv then
- local uc = unicodes[index]
- math.vert_variants = vv.variants
- local p = vv.parts
- if p then
- if #p>0 then
- for i=1,#p do
- local pi = p[i]
- pi.glyph = unicodes[pi.component] or 0
+ lookup.before_class = nil
+ lookup.current_class = nil
+ lookup.after_class = nil
+ lookup.format = "coverage"
+ elseif format == "coverage" then
+ for i=1,#rules do
+ local rule = rules[i]
+ local coverage = rule.coverage
+ if coverage then
+ local before = coverage.before
+ if before then
+ before = t_uncover(splitter,cache,reversed(before))
+ rule.before = t_hashed(before,h_cache)
+ end
+ local current = coverage.current
+ if current then
+ current = t_uncover(splitter,cache,current)
+ rule.current = t_hashed(current,h_cache)
end
- math.vert_parts = p
+ local after = coverage.after
+ if after then
+ after = t_uncover(splitter,cache,after)
+ rule.after = t_hashed(after,h_cache)
+ end
+ rule.coverage = nil
end
end
- local ic = vv.italic_correction
- if ic and ic ~= 0 then
- math.vert_italic_correction = ic
+ elseif format == "reversecoverage" then -- special case, single substitution only
+ for i=1,#rules do
+ local rule = rules[i]
+ local reversecoverage = rule.reversecoverage
+ if reversecoverage then
+ local before = reversecoverage.before
+ if before then
+ before = t_uncover(splitter,cache,reversed(before))
+ rule.before = t_hashed(before,h_cache)
+ end
+ local current = reversecoverage.current
+ if current then
+ current = t_uncover(splitter,cache,current)
+ rule.current = t_hashed(current,h_cache)
+ end
+ local after = reversecoverage.after
+ if after then
+ after = t_uncover(splitter,cache,after)
+ rule.after = t_hashed(after,h_cache)
+ end
+ local replacements = reversecoverage.replacements
+ if replacements then
+ rule.replacements = r_uncover(splitter,cache,current,replacements)
+ end
+ rule.reversecoverage = nil
+ end
end
- glyph.vert_variants = nil
- end
- local ic = glyph.italic_correction
- if ic then
- if ic ~= 0 then
- math.italic_correction = ic
+ elseif format == "glyphs" then
+ for i=1,#rules do
+ local rule = rules[i]
+ local glyphs = rule.glyphs
+ if glyphs then
+ local fore = glyphs.fore
+ if fore then
+ fore = s_uncover(splitter,cache,fore)
+ rule.before = s_hashed(fore,h_cache)
+ end
+ local back = glyphs.back
+ if back then
+ back = s_uncover(splitter,cache,back)
+ rule.after = s_hashed(back,h_cache)
+ end
+ local names = glyphs.names
+ if names then
+ names = s_uncover(splitter,cache,names)
+ rule.current = s_hashed(names,h_cache)
+ end
+ rule.glyphs = nil
+ end
end
- glyph.italic_correction = nil
end
end
end
end
end
-otf.enhancers["share widths"] = function(data,filename)
- local glyphs = data.glyphs
- local widths = { }
- for index, glyph in next, glyphs do
- local width = glyph.width
- widths[width] = (widths[width] or 0) + 1
- end
- -- share width for cjk fonts
- local wd, most = 0, 1
- for k,v in next, widths do
- if v > most then
- wd, most = k, v
+-- to be checked italic_correction
+
+local function check_variants(unicode,the_variants,splitter,unicodes)
+ local variants = the_variants.variants
+ if variants then -- use splitter
+ local glyphs = lpegmatch(splitter,variants)
+ local done = { [unicode] = true }
+ local n = 0
+ for i=1,#glyphs do
+ local g = glyphs[i]
+ if done[g] then
+ report_otf("skipping cyclic reference U+%05X in math variant U+%05X",g,unicode)
+ elseif n == 0 then
+ n = 1
+ variants = { g }
+ else
+ n = n + 1
+ variants[n] = g
+ end
end
- end
- if most > 1000 then
- if trace_loading then
- logs.report("load otf", "most common width: %s (%s times), sharing (cjk font)",wd,most)
+ if n == 0 then
+ variants = nil
end
- for k, v in next, glyphs do
- if v.width == wd then
- v.width = nil
+ end
+ local parts = the_variants.parts
+ if parts then
+ local p = #parts
+ if p > 0 then
+ for i=1,p do
+ local pi = parts[i]
+ pi.glyph = unicodes[pi.component] or 0
+ pi.component = nil
end
+ else
+ parts = nil
end
- data.luatex.defaultwidth = wd
end
+ local italic_correction = the_variants.italic_correction
+ if italic_correction and italic_correction == 0 then
+ italic_correction = nil
+ end
+ return variants, parts, italic_correction
end
--- kern: ttf has a table with kerns
-
---~ otf.enhancers["reorganize kerns"] = function(data,filename)
---~ local glyphs, mapmap, unicodes = data.glyphs, data.luatex.indices, data.luatex.unicodes
---~ local mkdone = false
---~ for index, glyph in next, data.glyphs do
---~ if glyph.kerns then
---~ local mykerns = { }
---~ for k,v in next, glyph.kerns do
---~ local vc, vo, vl = v.char, v.off, v.lookup
---~ if vc and vo and vl then -- brrr, wrong! we miss the non unicode ones
---~ local uvc = unicodes[vc]
---~ if not uvc then
---~ if trace_loading then
---~ logs.report("load otf","problems with unicode %s of kern %s at glyph %s",vc,k,index)
---~ end
---~ else
---~ if type(vl) ~= "table" then
---~ vl = { vl }
---~ end
---~ for l=1,#vl do
---~ local vll = vl[l]
---~ local mkl = mykerns[vll]
---~ if not mkl then
---~ mkl = { }
---~ mykerns[vll] = mkl
---~ end
---~ if type(uvc) == "table" then
---~ for u=1,#uvc do
---~ mkl[uvc[u]] = vo
---~ end
---~ else
---~ mkl[uvc] = vo
---~ end
---~ end
---~ end
---~ end
---~ end
---~ glyph.mykerns = mykerns
---~ glyph.kerns = nil -- saves space and time
---~ mkdone = true
---~ end
---~ end
---~ if trace_loading and mkdone then
---~ logs.report("load otf", "replacing 'kerns' tables by 'mykerns' tables")
---~ end
---~ if data.kerns then
---~ if trace_loading then
---~ logs.report("load otf", "removing global 'kern' table")
---~ end
---~ data.kerns = nil
---~ end
---~ local dgpos = data.gpos
---~ if dgpos then
---~ for gp=1,#dgpos do
---~ local gpos = dgpos[gp]
---~ local subtables = gpos.subtables
---~ if subtables then
---~ for s=1,#subtables do
---~ local subtable = subtables[s]
---~ local kernclass = subtable.kernclass -- name is inconsistent with anchor_classes
---~ if kernclass then -- the next one is quite slow
---~ for k=1,#kernclass do
---~ local kcl = kernclass[k]
---~ local firsts, seconds, offsets, lookups = kcl.firsts, kcl.seconds, kcl.offsets, kcl.lookup -- singular
---~ if type(lookups) ~= "table" then
---~ lookups = { lookups }
---~ end
---~ for l=1,#lookups do
---~ local lookup = lookups[l]
---~ -- weird, as maxfirst and maxseconds can have holes
---~ local maxfirsts, maxseconds = getn(firsts), getn(seconds)
---~ if trace_loading then
---~ logs.report("load otf", "adding kernclass %s with %s times %s pairs",lookup, maxfirsts, maxseconds)
---~ end
---~ for fk, fv in next, firsts do
---~ for first in gmatch(fv,"[^ ]+") do
---~ local first_unicode = unicodes[first]
---~ if type(first_unicode) == "number" then
---~ first_unicode = { first_unicode }
---~ end
---~ for f=1,#first_unicode do
---~ local glyph = glyphs[mapmap[first_unicode[f]]]
---~ if glyph then
---~ local mykerns = glyph.mykerns
---~ if not mykerns then
---~ mykerns = { } -- unicode indexed !
---~ glyph.mykerns = mykerns
---~ end
---~ local lookupkerns = mykerns[lookup]
---~ if not lookupkerns then
---~ lookupkerns = { }
---~ mykerns[lookup] = lookupkerns
---~ end
---~ for sk, sv in next, seconds do
---~ local offset = offsets[(fk-1) * maxseconds + sk]
---~ --~ local offset = offsets[sk] -- (fk-1) * maxseconds + sk]
---~ for second in gmatch(sv,"[^ ]+") do
---~ local second_unicode = unicodes[second]
---~ if type(second_unicode) == "number" then
---~ lookupkerns[second_unicode] = offset
---~ else
---~ for s=1,#second_unicode do
---~ lookupkerns[second_unicode[s]] = offset
---~ end
---~ end
---~ end
---~ end
---~ elseif trace_loading then
---~ logs.report("load otf", "no glyph data for U+%04X", first_unicode[f])
---~ end
---~ end
---~ end
---~ end
---~ end
---~ end
---~ subtable.comment = "The kernclass table is merged into mykerns in the indexed glyph tables."
---~ subtable.kernclass = { }
---~ end
---~ end
---~ end
---~ end
---~ end
---~ end
-
-otf.enhancers["reorganize kerns"] = function(data,filename)
- local glyphs, mapmap, unicodes = data.glyphs, data.luatex.indices, data.luatex.unicodes
- local mkdone = false
- for index, glyph in next, data.glyphs do
- if glyph.kerns then
- local mykerns = { }
- for k,v in next, glyph.kerns do
- local vc, vo, vl = v.char, v.off, v.lookup
- if vc and vo and vl then -- brrr, wrong! we miss the non unicode ones
- local uvc = unicodes[vc]
- if not uvc then
- if trace_loading then
- logs.report("load otf","problems with unicode %s of kern %s at glyph %s",vc,k,index)
- end
- else
- if type(vl) ~= "table" then
- vl = { vl }
- end
- for l=1,#vl do
- local vll = vl[l]
- local mkl = mykerns[vll]
- if not mkl then
- mkl = { }
- mykerns[vll] = mkl
- end
- if type(uvc) == "table" then
- for u=1,#uvc do
- mkl[uvc[u]] = vo
+actions["analyze math"] = function(data,filename,raw)
+ if raw.math then
+ data.metadata.math = raw.math
+ local unicodes = data.resources.unicodes
+ local splitter = data.helpers.tounicodetable
+ for unicode, description in next, data.descriptions do
+ local glyph = description.glyph
+ local mathkerns = glyph.mathkern -- singular
+ local horiz_variants = glyph.horiz_variants
+ local vert_variants = glyph.vert_variants
+ local top_accent = glyph.top_accent
+ if mathkerns or horiz_variants or vert_variants or top_accent then
+ local math = { }
+ if top_accent then
+ math.top_accent = top_accent
+ end
+ if mathkerns then
+ for k, v in next, mathkerns do
+ if not next(v) then
+ mathkerns[k] = nil
+ else
+ for k, v in next, v do
+ if v == 0 then
+ k[v] = nil -- height / kern can be zero
end
- else
- mkl[uvc] = vo
end
end
end
+ math.kerns = mathkerns
+ end
+ if horiz_variants then
+ math.horiz_variants, math.horiz_parts, math.horiz_italic_correction = check_variants(unicode,horiz_variants,splitter,unicodes)
end
+ if vert_variants then
+ math.vert_variants, math.vert_parts, math.vert_italic_correction = check_variants(unicode,vert_variants,splitter,unicodes)
+ end
+ local italic_correction = description.italic
+ if italic_correction and italic_correction ~= 0 then
+ math.italic_correction = italic_correction
+ end
+ description.math = math
end
- glyph.mykerns = mykerns
- glyph.kerns = nil -- saves space and time
- mkdone = true
end
end
- if trace_loading and mkdone then
- logs.report("load otf", "replacing 'kerns' tables by 'mykerns' tables")
- end
- if data.kerns then
- if trace_loading then
- logs.report("load otf", "removing global 'kern' table")
+end
+
+actions["reorganize glyph kerns"] = function(data,filename,raw)
+ local descriptions = data.descriptions
+ local resources = data.resources
+ local unicodes = resources.unicodes
+ for unicode, description in next, descriptions do
+ local kerns = description.glyph.kerns
+ if kerns then
+ local newkerns = { }
+ for k, kern in next, kerns do
+ local name = kern.char
+ local offset = kern.off
+ local lookup = kern.lookup
+ if name and offset and lookup then
+ local unicode = unicodes[name]
+ if unicode then
+ if type(lookup) == "table" then
+ for l=1,#lookup do
+ local lookup = lookup[l]
+ local lookupkerns = newkerns[lookup]
+ if lookupkerns then
+ lookupkerns[unicode] = offset
+ else
+ newkerns[lookup] = { [unicode] = offset }
+ end
+ end
+ else
+ local lookupkerns = newkerns[lookup]
+ if lookupkerns then
+ lookupkerns[unicode] = offset
+ else
+ newkerns[lookup] = { [unicode] = offset }
+ end
+ end
+ elseif trace_loading then
+ report_otf("problems with unicode %s of kern %s of glyph U+%05X",name,k,unicode)
+ end
+ end
+ end
+ description.kerns = newkerns
end
- data.kerns = nil
end
- local dgpos = data.gpos
- if dgpos then
- local separator = lpeg.P(" ")
- local other = ((1 - separator)^0) / unicodes
- local splitter = lpeg.Ct(other * (separator * other)^0)
- for gp=1,#dgpos do
- local gpos = dgpos[gp]
+end
+
+actions["merge kern classes"] = function(data,filename,raw)
+ local gposlist = raw.gpos
+ if gposlist then
+ local descriptions = data.descriptions
+ local resources = data.resources
+ local unicodes = resources.unicodes
+ local splitter = data.helpers.tounicodetable
+ for gp=1,#gposlist do
+ local gpos = gposlist[gp]
local subtables = gpos.subtables
if subtables then
for s=1,#subtables do
local subtable = subtables[s]
local kernclass = subtable.kernclass -- name is inconsistent with anchor_classes
if kernclass then -- the next one is quite slow
+ local split = { } -- saves time
for k=1,#kernclass do
local kcl = kernclass[k]
- local firsts, seconds, offsets, lookups = kcl.firsts, kcl.seconds, kcl.offsets, kcl.lookup -- singular
+ local firsts = kcl.firsts
+ local seconds = kcl.seconds
+ local offsets = kcl.offsets
+ local lookups = kcl.lookup -- singular
if type(lookups) ~= "table" then
lookups = { lookups }
end
- local split = { }
+ -- we can check the max in the loop
+ -- local maxseconds = getn(seconds)
+ for n, s in next, firsts do
+ split[s] = split[s] or lpegmatch(splitter,s)
+ end
+ local maxseconds = 0
+ for n, s in next, seconds do
+ if n > maxseconds then
+ maxseconds = n
+ end
+ split[s] = split[s] or lpegmatch(splitter,s)
+ end
for l=1,#lookups do
local lookup = lookups[l]
- -- weird, as maxfirst and maxseconds can have holes, first seems to be indexed, seconds starts at 2
- local maxfirsts, maxseconds = getn(firsts), getn(seconds)
- for _, s in next, firsts do
- split[s] = split[s] or lpegmatch(splitter,s)
- end
- for _, s in next, seconds do
- split[s] = split[s] or lpegmatch(splitter,s)
- end
- if trace_loading then
- logs.report("load otf", "adding kernclass %s with %s times %s pairs",lookup, maxfirsts, maxseconds)
- end
- local function do_it(fk,first_unicode)
- local glyph = glyphs[mapmap[first_unicode]]
- if glyph then
- local mykerns = glyph.mykerns
- if not mykerns then
- mykerns = { } -- unicode indexed !
- glyph.mykerns = mykerns
- end
- local lookupkerns = mykerns[lookup]
- if not lookupkerns then
- lookupkerns = { }
- mykerns[lookup] = lookupkerns
- end
+ for fk=1,#firsts do -- maxfirsts ?
+ local fv = firsts[fk]
+ local splt = split[fv]
+ if splt then
+ local extrakerns = { }
local baseoffset = (fk-1) * maxseconds
- for sk=2,maxseconds do
- local sv = seconds[sk]
- local offset = offsets[baseoffset + sk]
- --~ local offset = offsets[sk] -- (fk-1) * maxseconds + sk]
+ -- for sk=2,maxseconds do
+ -- local sv = seconds[sk]
+ for sk, sv in next, seconds do
local splt = split[sv]
- if splt then
- for i=1,#splt do
- local second_unicode = splt[i]
- if tonumber(second_unicode) then
- lookupkerns[second_unicode] = offset
- else
- for s=1,#second_unicode do
- lookupkerns[second_unicode[s]] = offset
- end
+ if splt then -- redundant test
+ local offset = offsets[baseoffset + sk]
+ if offset then
+ for i=1,#splt do
+ extrakerns[splt[i]] = offset
end
end
end
end
- elseif trace_loading then
- logs.report("load otf", "no glyph data for U+%04X", first_unicode)
- end
- end
- for fk=1,#firsts do
- local fv = firsts[fk]
- local splt = split[fv]
- if splt then
for i=1,#splt do
local first_unicode = splt[i]
- if tonumber(first_unicode) then
- do_it(fk,first_unicode)
- else
- for f=1,#first_unicode do
- do_it(fk,first_unicode[f])
+ local description = descriptions[first_unicode]
+ if description then
+ local kerns = description.kerns
+ if not kerns then
+ kerns = { } -- unicode indexed !
+ description.kerns = kerns
+ end
+ local lookupkerns = kerns[lookup]
+ if not lookupkerns then
+ lookupkerns = { }
+ kerns[lookup] = lookupkerns
end
+ for second_unicode, kern in next, extrakerns do
+ lookupkerns[second_unicode] = kern
+ end
+ elseif trace_loading then
+ report_otf("no glyph data for U+%05X", first_unicode)
end
end
end
end
end
end
- subtable.comment = "The kernclass table is merged into mykerns in the indexed glyph tables."
subtable.kernclass = { }
end
end
@@ -1133,470 +1494,311 @@ otf.enhancers["reorganize kerns"] = function(data,filename)
end
end
-otf.enhancers["strip not needed data"] = function(data,filename)
- local verbose = fonts.verbose
- local int_to_uni = data.luatex.unicodes
- for k, v in next, data.glyphs do
- local d = v.dependents
- if d then v.dependents = nil end
- local a = v.altuni
- if a then v.altuni = nil end
- if verbose then
- local code = int_to_uni[k]
- -- looks like this is done twice ... bug?
- if code then
- local vu = v.unicode
- if not vu then
- v.unicode = code
- elseif type(vu) == "table" then
- if vu[#vu] == code then
- -- weird
- else
- vu[#vu+1] = code
- end
- elseif vu ~= code then
- v.unicode = { vu, code }
- end
+actions["check glyphs"] = function(data,filename,raw)
+ for unicode, description in next, data.descriptions do
+ description.glyph = nil
+ end
+end
+
+-- future versions will remove _
+
+actions["check metadata"] = function(data,filename,raw)
+ local metadata = data.metadata
+ for _, k in next, mainfields do
+ if valid_fields[k] then
+ local v = raw[k]
+ if not metadata[k] then
+ metadata[k] = v
end
- else
- v.unicode = nil
- v.index = nil
end
end
- data.luatex.comment = "Glyph tables have their original index. When present, mykern tables are indexed by unicode."
- data.map = nil
- data.names = nil -- funny names for editors
- data.glyphcnt = nil
- data.glyphmax = nil
- if true then
- data.gpos = nil
- data.gsub = nil
- data.anchor_classes = nil
+ -- metadata.pfminfo = raw.pfminfo -- not already done?
+ local ttftables = metadata.ttf_tables
+ if ttftables then
+ for i=1,#ttftables do
+ ttftables[i].data = "deleted"
+ end
end
end
-otf.enhancers["migrate metadata"] = function(data,filename)
- local global_fields = otf.tables.global_fields
- local metadata = { }
- for k,v in next, data do
- if not global_fields[k] then
- metadata[k] = v
- data[k] = nil
- end
- end
- data.metadata = metadata
- -- goodies
- local pfminfo = data.pfminfo
- metadata.isfixedpitch = metadata.isfixedpitch or (pfminfo.panose and pfminfo.panose["proportion"] == "Monospaced")
- metadata.charwidth = pfminfo and pfminfo.avgwidth
+actions["cleanup tables"] = function(data,filename,raw)
+ data.resources.indices = nil -- not needed
+ data.helpers = nil
end
-local private_math_parameters = {
- "FractionDelimiterSize",
- "FractionDelimiterDisplayStyleSize",
-}
+-- kern: ttf has a table with kerns
+--
+-- Weird, as maxfirst and maxseconds can have holes, first seems to be indexed, but
+-- seconds can start at 2 .. this need to be fixed as getn as well as # are sort of
+-- unpredictable alternatively we could force an [1] if not set (maybe I will do that
+-- anyway).
-otf.enhancers["check math parameters"] = function(data,filename)
- local mathdata = data.metadata.math
- if mathdata then
- for m=1,#private_math_parameters do
- local pmp = private_math_parameters[m]
- if not mathdata[pmp] then
- if trace_loading then
- logs.report("load otf", "setting math parameter '%s' to 0", pmp)
- end
- mathdata[pmp] = 0
- end
- end
- end
-end
+-- we can share { } as it is never set
+
+--- ligatures have an extra specification.char entry that we don't use
-otf.enhancers["flatten glyph lookups"] = function(data,filename)
- for k, v in next, data.glyphs do
- local lookups = v.lookups
+actions["reorganize glyph lookups"] = function(data,filename,raw)
+ local resources = data.resources
+ local unicodes = resources.unicodes
+ local descriptions = data.descriptions
+ local splitter = data.helpers.tounicodelist
+
+ local lookuptypes = resources.lookuptypes
+
+ for unicode, description in next, descriptions do
+ local lookups = description.glyph.lookups
if lookups then
- for kk, vv in next, lookups do
- for kkk=1,#vv do
- local vvv = vv[kkk]
- local s = vvv.specification
- if s then
- local t = vvv.type
- if t == "ligature" then
- vv[kkk] = { "ligature", s.components, s.char }
- elseif t == "alternate" then
- vv[kkk] = { "alternate", s.components }
- elseif t == "substitution" then
- vv[kkk] = { "substitution", s.variant }
- elseif t == "multiple" then
- vv[kkk] = { "multiple", s.components }
- elseif t == "position" then
- vv[kkk] = { "position", { s.x or 0, s.y or 0, s.h or 0, s.v or 0 } }
- elseif t == "pair" then
- local one, two, paired = s.offsets[1], s.offsets[2], s.paired or ""
- if one then
- if two then
- vv[kkk] = { "pair", paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0 } }
- else
- vv[kkk] = { "pair", paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 } }
- end
+ for tag, lookuplist in next, lookups do
+ for l=1,#lookuplist do
+ local lookup = lookuplist[l]
+ local specification = lookup.specification
+ local lookuptype = lookup.type
+ local lt = lookuptypes[tag]
+ if not lt then
+ lookuptypes[tag] = lookuptype
+ elseif lt ~= lookuptype then
+ report_otf("conflicting lookuptypes: %s => %s and %s",tag,lt,lookuptype)
+ end
+ if lookuptype == "ligature" then
+ lookuplist[l] = { lpegmatch(splitter,specification.components) }
+ elseif lookuptype == "alternate" then
+ lookuplist[l] = { lpegmatch(splitter,specification.components) }
+ elseif lookuptype == "substitution" then
+ lookuplist[l] = unicodes[specification.variant]
+ elseif lookuptype == "multiple" then
+ lookuplist[l] = { lpegmatch(splitter,specification.components) }
+ elseif lookuptype == "position" then
+ lookuplist[l] = {
+ specification.x or 0,
+ specification.y or 0,
+ specification.h or 0,
+ specification.v or 0
+ }
+ elseif lookuptype == "pair" then
+ local one = specification.offsets[1]
+ local two = specification.offsets[2]
+ local paired = unicodes[specification.paired]
+ if one then
+ if two then
+ lookuplist[l] = { paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0 } }
else
- if two then
- vv[kkk] = { "pair", paired, { }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0} } -- maybe nil instead of { }
- else
- vv[kkk] = { "pair", paired }
- end
+ lookuplist[l] = { paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 } }
end
else
- if trace_loading then
- logs.report("load otf", "flattening needed, report to context list")
- end
- for a, b in next, s do
- if trace_loading and vvv[a] then
- logs.report("load otf", "flattening conflict, report to context list")
- end
- vvv[a] = b
+ if two then
+ lookuplist[l] = { paired, { }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0} } -- maybe nil instead of { }
+ else
+ lookuplist[l] = { paired }
end
- vvv.specification = nil
end
end
end
end
- end
- end
-end
-
-otf.enhancers["simplify glyph lookups"] = function(data,filename)
- for k, v in next, data.glyphs do
- local lookups = v.lookups
- if lookups then
local slookups, mlookups
- for kk, vv in next, lookups do
- if #vv == 1 then
- if not slookups then
- slookups = { }
- v.slookups = slookups
+ for tag, lookuplist in next, lookups do
+ if #lookuplist == 1 then
+ if slookups then
+ slookups[tag] = lookuplist[1]
+ else
+ slookups = { [tag] = lookuplist[1] }
end
- slookups[kk] = vv[1]
else
- if not mlookups then
- mlookups = { }
- v.mlookups = mlookups
- end
- mlookups[kk] = vv
- end
- end
- v.lookups = nil
- end
- end
-end
-
-otf.enhancers["flatten anchor tables"] = function(data,filename)
- for k, v in next, data.glyphs do
- if v.anchors then
- for kk, vv in next, v.anchors do
- for kkk, vvv in next, vv do
- if vvv.x or vvv.y then
- vv[kkk] = { vvv.x or 0, vvv.y or 0 }
+ if mlookups then
+ mlookups[tag] = lookuplist
else
- for kkkk=1,#vvv do
- local vvvv = vvv[kkkk]
- vvv[kkkk] = { vvvv.x or 0, vvvv.y or 0 }
- end
+ mlookups = { [tag] = lookuplist }
end
end
end
- end
- end
-end
-
-otf.enhancers["flatten feature tables"] = function(data,filename)
- -- is this needed? do we still use them at all?
- for _, tag in next, otf.glists do
- if data[tag] then
- if trace_loading then
- logs.report("load otf", "flattening %s table", tag)
+ if slookups then
+ description.slookups = slookups
end
- for k, v in next, data[tag] do
- local features = v.features
- if features then
- for kk=1,#features do
- local vv = features[kk]
- local t = { }
- local scripts = vv.scripts
- for kkk=1,#scripts do
- local vvv = scripts[kkk]
- t[vvv.script] = vvv.langs
- end
- vv.scripts = t
- end
- end
+ if mlookups then
+ description.mlookups = mlookups
end
end
end
-end
-
-otf.enhancers.patches = otf.enhancers.patches or { }
-
-otf.enhancers["patch bugs"] = function(data,filename)
- local basename = file.basename(lower(filename))
- for pattern, action in next, otf.enhancers.patches do
- if find(basename,pattern) then
- action(data,filename)
- end
- end
-end
--- tex features
-
-fonts.otf.enhancers["enrich with features"] = function(data,filename)
- -- later, ctx only
-end
-
-function otf.features.register(name,default)
- otf.features.list[#otf.features.list+1] = name
- otf.features.default[name] = default
end
--- for context this will become a task handler
-
-function otf.set_features(tfmdata,features)
- local processes = { }
- if features and next(features) then
- local lists = { -- why local
- fonts.triggers,
- fonts.processors,
- fonts.manipulators,
- }
- local mode = tfmdata.mode or fonts.mode -- or features.mode
- local initializers = fonts.initializers
- local fi = initializers[mode]
- if fi then
- local fiotf = fi.otf
- if fiotf then
- local done = { }
- for l=1,4 do
- local list = lists[l]
- if list then
- for i=1,#list do
- local f = list[i]
- local value = features[f]
- if value and fiotf[f] then -- brr
- if not done[f] then -- so, we can move some to triggers
- if trace_features then
- logs.report("define otf","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown', tfmdata.fullname or 'unknown')
- end
- fiotf[f](tfmdata,value) -- can set mode (no need to pass otf)
- mode = tfmdata.mode or fonts.mode -- keep this, mode can be set local !
- local im = initializers[mode]
- if im then
- fiotf = initializers[mode].otf
- end
- done[f] = true
- end
- end
+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
+ local anchors = description.glyph.anchors
+ if anchors then
+ 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 }
end
end
- end
- end
- end
- local fm = fonts.methods[mode] -- todo: zonder node/mode otf/...
- if fm then
- local fmotf = fm.otf
- if fmotf then
- for l=1,4 do
- local list = lists[l]
- if list then
- for i=1,#list do
- local f = list[i]
- if fmotf[f] then -- brr
- if trace_features then
- logs.report("define otf","installing feature handler %s for mode %s for font %s",f,mode or 'unknown', tfmdata.fullname or 'unknown')
- end
- processes[#processes+1] = fmotf[f]
- end
- end
+ else
+ for tag, specification in next, data do
+ data[tag] = { specification.x or 0, specification.y or 0 }
end
end
end
- else
- -- message
+ description.anchors = anchors
end
end
- return processes, features
end
-function otf.otf_to_tfm(specification)
- local name = specification.name
- local sub = specification.sub
- local filename = specification.filename
- local format = specification.format
- local features = specification.features.normal
- local cache_id = specification.hash
- local tfmdata = containers.read(tfm.cache(),cache_id)
---~ print(cache_id)
- if not tfmdata then
- local otfdata = otf.load(filename,format,sub,features and features.featurefile)
- if otfdata and next(otfdata) then
- otfdata.shared = otfdata.shared or {
- featuredata = { },
- anchorhash = { },
- initialized = false,
- }
- tfmdata = otf.copy_to_tfm(otfdata,cache_id)
- if tfmdata and next(tfmdata) then
- tfmdata.unique = tfmdata.unique or { }
- tfmdata.shared = tfmdata.shared or { } -- combine
- local shared = tfmdata.shared
- shared.otfdata = otfdata
- shared.features = features -- default
- shared.dynamics = { }
- shared.processes = { }
- shared.set_dynamics = otf.set_dynamics -- fast access and makes other modules independent
- -- this will be done later anyway, but it's convenient to have
- -- them already for fast access
- tfmdata.luatex = otfdata.luatex
- tfmdata.indices = otfdata.luatex.indices
- tfmdata.unicodes = otfdata.luatex.unicodes
- tfmdata.marks = otfdata.luatex.marks
- tfmdata.originals = otfdata.luatex.originals
- tfmdata.changed = { }
- tfmdata.has_italic = otfdata.metadata.has_italic
- if not tfmdata.language then tfmdata.language = 'dflt' end
- if not tfmdata.script then tfmdata.script = 'dflt' end
- shared.processes, shared.features = otf.set_features(tfmdata,fonts.define.check(features,otf.features.default))
- end
- end
- containers.write(tfm.cache(),cache_id,tfmdata)
+-- modes: node, base, none
+
+function otf.setfeatures(tfmdata,features)
+ local okay = constructors.initializefeatures("otf",tfmdata,features,trace_features,report_otf)
+ if okay then
+ return constructors.collectprocessors("otf",tfmdata,features,trace_features,report_otf)
+ else
+ return { } -- will become false
end
- return tfmdata
end
---~ {
---~ ['boundingbox']={ 95, -458, 733, 1449 },
---~ ['class']="base",
---~ ['name']="braceleft",
---~ ['unicode']=123,
---~ ['vert_variants']={
---~ ['italic_correction']=0,
---~ ['parts']={
---~ { ['component']="uni23A9", ['endConnectorLength']=1000, ['fullAdvance']=2546, ['is_extender']=0, ['startConnectorLength']=0, }, -- bot
---~ { ['component']="uni23AA", ['endConnectorLength']=2500, ['fullAdvance']=2501, ['is_extender']=1, ['startConnectorLength']=2500, }, -- rep
---~ { ['component']="uni23A8", ['endConnectorLength']=1000, ['fullAdvance']=4688, ['is_extender']=0, ['startConnectorLength']=1000, }, -- mid
---~ { ['component']="uni23AA", ['endConnectorLength']=2500, ['fullAdvance']=2501, ['is_extender']=1, ['startConnectorLength']=2500, }, -- rep
---~ { ['component']="uni23A7", ['endConnectorLength']=0, ['fullAdvance']=2546, ['is_extender']=0, ['startConnectorLength']=1000, }, -- top
---~ },
---~ ['variants']="braceleft braceleft.vsize1 braceleft.vsize2 braceleft.vsize3 braceleft.vsize4 braceleft.vsize5 braceleft.vsize6 braceleft.vsize7",
---~ },
---~ ['width']=793,
---~ },
-
--- the first version made a top/mid/not extensible table, now we just pass on the variants data
--- and deal with it in the tfm scaler (there is no longer an extensible table anyway)
-
--- we cannot share descriptions as virtual fonts might extend them (ok, we could
--- use a cache with a hash
-
-fonts.formats.dfont = "truetype"
-fonts.formats.ttc = "truetype"
-fonts.formats.ttf = "truetype"
-fonts.formats.otf = "opentype"
-
-function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder the tma to unicode (nasty due to one->many)
+-- the first version made a top/mid/not extensible table, now we just
+-- pass on the variants data and deal with it in the tfm scaler (there
+-- is no longer an extensible table anyway)
+--
+-- we cannot share descriptions as virtual fonts might extend them (ok,
+-- we could use a cache with a hash
+--
+-- we already assing an empty tabel to characters as we can add for
+-- instance protruding info and loop over characters; one is not supposed
+-- to change descriptions and if one does so one should make a copy!
+
+local function copytotfm(data,cache_id)
if data then
- local glyphs, pfminfo, metadata = data.glyphs or { }, data.pfminfo or { }, data.metadata or { }
- local luatex = data.luatex
- local unicodes = luatex.unicodes -- names to unicodes
- local indices = luatex.indices
- local characters, parameters, math_parameters, descriptions = { }, { }, { }, { }
- local designsize = metadata.designsize or metadata.design_size or 100
+ local metadata = data.metadata
+ local resources = data.resources
+ local properties = table.derive(data.properties)
+ local descriptions = table.derive(data.descriptions)
+ local goodies = table.derive(data.goodies)
+ local characters = { }
+ local parameters = { }
+ local mathparameters = { }
+ --
+ local pfminfo = metadata.pfminfo or { }
+ local resources = data.resources
+ local unicodes = resources.unicodes
+ -- local mode = data.mode or "base"
+ local spaceunits = 500
+ local spacer = "space"
+ local designsize = metadata.designsize or metadata.design_size or 100
+ local mathspecs = metadata.math
+ --
if designsize == 0 then
designsize = 100
end
- local spaceunits = 500
- -- indices maps from unicodes to indices
- for u, i in next, indices do
- characters[u] = { } -- we need this because for instance we add protruding info and loop over characters
- descriptions[u] = glyphs[i]
- end
- -- math
- if metadata.math then
- -- parameters
- for name, value in next, metadata.math do
- math_parameters[name] = value
+ if mathspecs then
+ for name, value in next, mathspecs do
+ mathparameters[name] = value
end
- -- we could use a subset
- for u, char in next, characters do
- local d = descriptions[u]
+ end
+ for unicode, _ in next, data.descriptions do -- use parent table
+ characters[unicode] = { }
+ end
+ if mathspecs then
+ -- we could move this to the scaler but not that much is saved
+ -- and this is cleaner
+ for unicode, character in next, characters do
+ local d = descriptions[unicode]
local m = d.math
- -- we have them shared because that packs nicer
- -- we could prepare the variants and keep 'm in descriptions
if m then
+ -- watch out: luatex uses horiz_variants for the parts
local variants = m.horiz_variants
+ local parts = m.horiz_parts
+ -- local done = { [unicode] = true }
if variants then
- local c = char
- for n in gmatch(variants,"[^ ]+") do
- local un = unicodes[n]
- if un and u ~= un then
+ local c = character
+ for i=1,#variants do
+ local un = variants[i]
+ -- if done[un] then
+ -- -- report_otf("skipping cyclic reference U+%05X in math variant U+%05X",un,unicode)
+ -- else
c.next = un
c = characters[un]
- end
- end
- c.horiz_variants = m.horiz_parts
- else
- local variants = m.vert_variants
- if variants then
- local c = char
- for n in gmatch(variants,"[^ ]+") do
- local un = unicodes[n]
- if un and u ~= un then
- c.next = un
- c = characters[un]
- end
- end
- c.vert_variants = m.vert_parts
- c.vert_italic_correction = m.vert_italic_correction
- end
+ -- done[un] = true
+ -- end
+ end -- c is now last in chain
+ c.horiz_variants = parts
+ elseif parts then
+ character.horiz_variants = parts
+ end
+ local variants = m.vert_variants
+ local parts = m.vert_parts
+ -- local done = { [unicode] = true }
+ if variants then
+ local c = character
+ for i=1,#variants do
+ local un = variants[i]
+ -- if done[un] then
+ -- -- report_otf("skipping cyclic reference U+%05X in math variant U+%05X",un,unicode)
+ -- else
+ c.next = un
+ c = characters[un]
+ -- done[un] = true
+ -- end
+ end -- c is now last in chain
+ c.vert_variants = parts
+ elseif parts then
+ character.vert_variants = parts
+ end
+ local italic_correction = m.vert_italic_correction
+ if italic_correction then
+ character.vert_italic_correction = italic_correction -- was c.
+ end
+ local top_accent = m.top_accent
+ if top_accent then
+ character.top_accent = top_accent
end
local kerns = m.kerns
if kerns then
- char.mathkerns = kerns
+ character.mathkerns = kerns
end
end
end
end
-- end math
- local endash, emdash, space = 0x20, 0x2014, "space" -- unicodes['space'], unicodes['emdash']
- if metadata.isfixedpitch then
- if descriptions[endash] then
- spaceunits, spacer = descriptions[endash].width, "space"
+ local monospaced = metadata.isfixedpitch or (pfminfo.panose and pfminfo.panose.proportion == "Monospaced")
+ local charwidth = pfminfo.avgwidth -- or unset
+ local italicangle = metadata.italicangle
+ local charxheight = pfminfo.os2_xheight and pfminfo.os2_xheight > 0 and pfminfo.os2_xheight
+ properties.monospaced = monospaced
+ parameters.italicangle = italicangle
+ parameters.charwidth = charwidth
+ parameters.charxheight = charxheight
+ --
+ local space = 0x0020 -- unicodes['space'], unicodes['emdash']
+ local emdash = 0x2014 -- unicodes['space'], unicodes['emdash']
+ if monospaced then
+ if descriptions[space] then
+ spaceunits, spacer = descriptions[space].width, "space"
end
if not spaceunits and descriptions[emdash] then
spaceunits, spacer = descriptions[emdash].width, "emdash"
end
- if not spaceunits and metadata.charwidth then
- spaceunits, spacer = metadata.charwidth, "charwidth"
+ if not spaceunits and charwidth then
+ spaceunits, spacer = charwidth, "charwidth"
end
else
- if descriptions[endash] then
- spaceunits, spacer = descriptions[endash].width, "space"
+ if descriptions[space] then
+ spaceunits, spacer = descriptions[space].width, "space"
end
if not spaceunits and descriptions[emdash] then
spaceunits, spacer = descriptions[emdash].width/2, "emdash/2"
end
- if not spaceunits and metadata.charwidth then
- spaceunits, spacer = metadata.charwidth, "charwidth"
+ if not spaceunits and charwidth then
+ spaceunits, spacer = charwidth, "charwidth"
end
end
- spaceunits = tonumber(spaceunits) or tfm.units/2 -- 500 -- brrr
+ spaceunits = tonumber(spaceunits) or 500 -- brrr
-- we need a runtime lookup because of running from cdrom or zip, brrr (shouldn't we use the basename then?)
- local filename = fonts.tfm.checked_filename(luatex)
+ local filename = constructors.checkedfilename(resources)
local fontname = metadata.fontname
local fullname = metadata.fullname or fontname
- local cidinfo = data.cidinfo
local units = metadata.units_per_em or 1000
--
- cidinfo.registry = cidinfo and cidinfo.registry or "" -- weird here, fix upstream
- --
parameters.slant = 0
parameters.space = spaceunits -- 3.333 (cmr10)
parameters.space_stretch = units/2 -- 500 -- 1.666 (cmr10)
@@ -1606,20 +1808,21 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th
if spaceunits < 2*units/5 then
-- todo: warning
end
- local italicangle = metadata.italicangle
- if italicangle then -- maybe also in afm _
- parameters.slant = parameters.slant - math.round(math.tan(italicangle*math.pi/180))
+ if italicangle then
+ parameters.italicangle = italicangle
+ parameters.italicfactor = math.cos(math.rad(90+italicangle))
+ parameters.slant = - math.round(math.tan(italicangle*math.pi/180))
end
- if metadata.isfixedpitch then
+ if monospaced then
parameters.space_stretch = 0
parameters.space_shrink = 0
- elseif otf.syncspace then --
+ elseif syncspace then --
parameters.space_stretch = spaceunits/2
parameters.space_shrink = spaceunits/3
end
parameters.extra_space = parameters.space_shrink -- 1.111 (cmr10)
- if pfminfo.os2_xheight and pfminfo.os2_xheight > 0 then
- parameters.x_height = pfminfo.os2_xheight
+ if charxheight then
+ parameters.x_height = charxheight
else
local x = 0x78 -- unicodes['x']
if x then
@@ -1630,99 +1833,109 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th
end
end
--
+ parameters.designsize = (designsize/10)*65536
+ parameters.ascender = abs(metadata.ascent or 0)
+ parameters.descender = abs(metadata.descent or 0)
+ parameters.units = units
+ --
+ properties.space = spacer
+ properties.encodingbytes = 2
+ properties.format = data.format or fonts.formats[filename] or "opentype"
+ properties.noglyphnames = true
+ properties.filename = filename
+ properties.fontname = fontname
+ properties.fullname = fullname
+ properties.psname = fontname or fullname
+ properties.name = filename or fullname
+ --
+ -- properties.name = specification.name
+ -- properties.sub = specification.sub
return {
- characters = characters,
- parameters = parameters,
- math_parameters = math_parameters,
- descriptions = descriptions,
- indices = indices,
- unicodes = unicodes,
- type = "real",
- direction = 0,
- boundarychar_label = 0,
- boundarychar = 65536,
- designsize = (designsize/10)*65536,
- spacer = "500 units",
- encodingbytes = 2,
- filename = filename,
- fontname = fontname,
- fullname = fullname,
- psname = fontname or fullname,
- name = filename or fullname,
- units = units,
- format = fonts.fontformat(filename,"opentype"),
- cidinfo = cidinfo,
- ascender = abs(metadata.ascent or 0),
- descender = abs(metadata.descent or 0),
- spacer = spacer,
- italicangle = italicangle,
+ characters = characters,
+ descriptions = descriptions,
+ parameters = parameters,
+ mathparameters = mathparameters,
+ resources = resources,
+ properties = properties,
+ goodies = goodies,
}
- else
- return nil
end
end
-otf.features.register('mathsize')
-
-function tfm.read_from_open_type(specification)
- local tfmtable = otf.otf_to_tfm(specification)
- if tfmtable then
- local otfdata = tfmtable.shared.otfdata
- tfmtable.name = specification.name
- tfmtable.sub = specification.sub
- local s = specification.size
- local m = otfdata.metadata.math
- if m then
- -- this will move to a function
- local f = specification.features
- if f then
- local f = f.normal
- if f and f.mathsize then
- local mathsize = specification.mathsize or 0
- if mathsize == 2 then
- local p = m.ScriptPercentScaleDown
- if p then
- local ps = p * specification.textsize / 100
- if trace_math then
- logs.report("define font","asked script size: %s, used: %s (%2.2f %%)",s,ps,(ps/s)*100)
- end
- s = ps
- end
- elseif mathsize == 3 then
- local p = m.ScriptScriptPercentScaleDown
- if p then
- local ps = p * specification.textsize / 100
- if trace_math then
- logs.report("define font","asked scriptscript size: %s, used: %s (%2.2f %%)",s,ps,(ps/s)*100)
- end
- s = ps
- end
- end
- end
- end
- end
- tfmtable = tfm.scale(tfmtable,s,specification.relativeid)
- if tfm.fontname_mode == "specification" then
- -- not to be used in context !
- local specname = specification.specification
- if specname then
- tfmtable.name = specname
- if trace_defining then
- logs.report("define font","overloaded fontname: '%s'",specname)
+local function otftotfm(specification)
+ local cache_id = specification.hash
+ local tfmdata = containers.read(constructors.cache,cache_id)
+ if not tfmdata then
+ local name = specification.name
+ local sub = specification.sub
+ local filename = specification.filename
+ local format = specification.format
+ local features = specification.features.normal
+ local rawdata = otf.load(filename,format,sub,features and features.featurefile)
+ if rawdata and next(rawdata) then
+ rawdata.lookuphash = { }
+ tfmdata = copytotfm(rawdata,cache_id)
+ if tfmdata and next(tfmdata) then
+ -- at this moment no characters are assigned yet, only empty slots
+ local features = constructors.checkedfeatures("otf",features)
+ local shared = tfmdata.shared
+ if not shared then
+ shared = { }
+ tfmdata.shared = shared
end
+ shared.rawdata = rawdata
+ shared.features = features -- default
+ shared.dynamics = { }
+ shared.processes = { }
+ tfmdata.changed = { }
+ shared.features = features
+ shared.processes = otf.setfeatures(tfmdata,features)
end
end
- fonts.logger.save(tfmtable,file.extname(specification.filename),specification)
+ containers.write(constructors.cache,cache_id,tfmdata)
+ end
+ return tfmdata
+end
+
+local function read_from_otf(specification)
+ local tfmdata = otftotfm(specification)
+ if tfmdata then
+ -- this late ? .. needs checking
+ tfmdata.properties.name = specification.name
+ tfmdata.properties.sub = specification.sub
+ --
+ tfmdata = constructors.scale(tfmdata,specification)
+ constructors.applymanipulators("otf",tfmdata,specification.features.normal,trace_features,report_otf)
+ constructors.setname(tfmdata,specification) -- only otf?
+ fonts.loggers.register(tfmdata,file.extname(specification.filename),specification)
end
---~ print(tfmtable.fullname)
- return tfmtable
+ return tfmdata
end
+local function checkmathsize(tfmdata,mathsize)
+ local mathdata = tfmdata.shared.rawdata.metadata.math
+ local mathsize = tonumber(mathsize)
+ if mathdata then -- we cannot use mathparameters as luatex will complain
+ local parameters = tfmdata.parameters
+ parameters.scriptpercentage = mathdata.ScriptPercentScaleDown
+ parameters.scriptscriptpercentage = mathdata.ScriptScriptPercentScaleDown
+ parameters.mathsize = mathsize
+ end
+end
+
+registerotffeature {
+ name = "mathsize",
+ description = "apply mathsize as specified in the font",
+ initializers = {
+ base = checkmathsize,
+ node = checkmathsize,
+ }
+}
+
-- helpers
-function otf.collect_lookups(otfdata,kind,script,language)
- -- maybe store this in the font
- local sequences = otfdata.luatex.sequences
+function otf.collectlookups(rawdata,kind,script,language)
+ local sequences = rawdata.resources.sequences
if sequences then
local featuremap, featurelist = { }, { }
for s=1,#sequences do
@@ -1750,3 +1963,53 @@ function otf.collect_lookups(otfdata,kind,script,language)
end
return nil, nil
end
+
+-- readers
+
+local function check_otf(forced,specification,suffix,what)
+ local name = specification.name
+ if forced then
+ name = file.addsuffix(name,suffix,true)
+ end
+ local fullname, tfmdata = findbinfile(name,suffix) or "", nil -- one shot
+ if fullname == "" then
+ fullname = fonts.names.getfilename(name,suffix)
+ end
+ if fullname ~= "" then
+ specification.filename, specification.format = fullname, what -- hm, so we do set the filename, then
+ tfmdata = read_from_otf(specification) -- we need to do it for all matches / todo
+ end
+ return tfmdata
+end
+
+local function opentypereader(specification,suffix,what)
+ local forced = specification.forced or ""
+ if forced == "otf" then
+ return check_otf(true,specification,forced,"opentype")
+ elseif forced == "ttf" or forced == "ttc" or forced == "dfont" then
+ return check_otf(true,specification,forced,"truetype")
+ else
+ return check_otf(false,specification,suffix,what)
+ end
+end
+
+readers.opentype = opentypereader
+
+local formats = fonts.formats
+
+formats.otf = "opentype"
+formats.ttf = "truetype"
+formats.ttc = "truetype"
+formats.dfont = "truetype"
+
+function readers.otf (specification) return opentypereader(specification,"otf",formats.otf ) end
+function readers.ttf (specification) return opentypereader(specification,"ttf",formats.ttf ) end
+function readers.ttc (specification) return opentypereader(specification,"ttf",formats.ttc ) end
+function readers.dfont(specification) return opentypereader(specification,"ttf",formats.dfont) end
+
+-- this will be overloaded
+
+function otf.scriptandlanguage(tfmdata,attr)
+ local properties = tfmdata.properties
+ return properties.script or "dflt", properties.language or "dflt"
+end
diff --git a/Master/texmf-dist/tex/context/base/font-oth.lua b/Master/texmf-dist/tex/context/base/font-oth.lua
new file mode 100644
index 00000000000..59dca31d918
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/font-oth.lua
@@ -0,0 +1,51 @@
+if not modules then modules = { } end modules ['font-oth'] = {
+ version = 1.001,
+ comment = "companion to font-oth.lua (helpers)",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local fonts = fonts
+local otf = fonts.handlers.otf
+
+-- todo: use nodemode data is available
+
+function otf.getalternate(tfmdata,k,kind,value) -- just initialize nodemode and use that (larger mem print)
+ if value then
+ local description = tfmdata.descriptions[k]
+ if description then
+ local slookups = description.slookups -- we assume only slookups (we can always extend)
+ if slookups then
+ local shared = tfmdata.shared
+ local rawdata = shared and shared.rawdata
+ if rawdata then
+ local lookuptypes = rawdata.resources.lookuptypes
+ if lookuptypes then
+ local properties = tfmdata.properties
+ -- we could cache these
+ local validlookups, lookuplist = otf.collectlookups(rawdata,kind,properties.script,properties.language)
+ if validlookups then
+ local choice = tonumber(value) or 1 -- no random here (yet)
+ for l=1,#lookuplist do
+ local lookup = lookuplist[l]
+ local found = slookups[lookup]
+ if found then
+ local lookuptype = lookuptypes[lookup]
+ if lookuptype == "substitution" then
+ return found
+ elseif lookuptype == "alternate" then
+ return found[choice] or found[#found]
+ else
+ -- ignore
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ return k
+end
diff --git a/Master/texmf-dist/tex/context/base/font-oti.lua b/Master/texmf-dist/tex/context/base/font-oti.lua
index 4cb27062623..d6853db31f3 100644
--- a/Master/texmf-dist/tex/context/base/font-oti.lua
+++ b/Master/texmf-dist/tex/context/base/font-oti.lua
@@ -6,52 +6,87 @@ if not modules then modules = { } end modules ['font-oti'] = {
license = "see context related readme files"
}
--- i need to check features=yes|no also in relation to hashing
-
local lower = string.lower
-local otf = fonts.otf
+local allocate = utilities.storage.allocate
+
+local fonts = fonts
+local otf = { }
+fonts.handlers.otf = otf
+
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
+
+registerotffeature {
+ name = "features",
+ description = "initialization of feature handler",
+ default = true,
+}
-otf.default_language = 'latn'
-otf.default_script = 'dflt'
+-- these are later hooked into node and base initializaters
-local languages = otf.tables.languages
-local scripts = otf.tables.scripts
+local otftables = otf.tables -- not always defined
-function otf.features.language(tfmdata,value)
+local function setmode(tfmdata,value)
if value then
- value = lower(value)
- if languages[value] then
- tfmdata.language = value
- end
+ tfmdata.properties.mode = lower(value)
end
end
-function otf.features.script(tfmdata,value)
+local function setlanguage(tfmdata,value)
if value then
- value = lower(value)
- if scripts[value] then
- tfmdata.script = value
+ local cleanvalue = lower(value)
+ local languages = otftables and otftables.languages
+ local properties = tfmdata.properties
+ if not languages then
+ properties.language = cleanvalue
+ elseif languages[value] then
+ properties.language = cleanvalue
+ else
+ properties.language = "dflt"
end
end
end
-function otf.features.mode(tfmdata,value)
+local function setscript(tfmdata,value)
if value then
- tfmdata.mode = lower(value)
+ local cleanvalue = lower(value)
+ local scripts = otftables and otftables.scripts
+ local properties = tfmdata.properties
+ if not scripts then
+ properties.script = cleanvalue
+ elseif scripts[value] then
+ properties.script = cleanvalue
+ else
+ properties.script = "dflt"
+ end
end
end
-fonts.initializers.base.otf.language = otf.features.language
-fonts.initializers.base.otf.script = otf.features.script
-fonts.initializers.base.otf.mode = otf.features.mode
-fonts.initializers.base.otf.method = otf.features.mode
+registerotffeature {
+ name = "mode",
+ description = "mode",
+ initializers = {
+ base = setmode,
+ node = setmode,
+ }
+}
-fonts.initializers.node.otf.language = otf.features.language
-fonts.initializers.node.otf.script = otf.features.script
-fonts.initializers.node.otf.mode = otf.features.mode
-fonts.initializers.node.otf.method = otf.features.mode
+registerotffeature {
+ name = "language",
+ description = "language",
+ initializers = {
+ base = setlanguage,
+ node = setlanguage,
+ }
+}
-otf.features.register("features",true) -- we always do features
-table.insert(fonts.processors,"features") -- we need a proper function for doing this
+registerotffeature {
+ name = "script",
+ description = "script",
+ initializers = {
+ base = setscript,
+ node = setscript,
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/font-otn.lua b/Master/texmf-dist/tex/context/base/font-otn.lua
index d4f89adc6ec..81b3fd267cc 100644
--- a/Master/texmf-dist/tex/context/base/font-otn.lua
+++ b/Master/texmf-dist/tex/context/base/font-otn.lua
@@ -10,14 +10,6 @@ if not modules then modules = { } end modules ['font-otn'] = {
-- much functionality could only be implemented thanks to the husayni font
-- of Idris Samawi Hamid to who we dedicate this module.
--- I'm in the process of cleaning up the code (which happens in another
--- file) so don't rely on things staying the same.
-
--- some day when we can jit this, we can use more functions
-
--- we can use more lpegs when lpeg is extended with function args and so
--- resolving to unicode does not gain much
-
-- in retrospect it always looks easy but believe it or not, it took a lot
-- of work to get proper open type support done: buggy fonts, fuzzy specs,
-- special made testfonts, many skype sessions between taco, idris and me,
@@ -32,10 +24,7 @@ if not modules then modules = { } end modules ['font-otn'] = {
-- alternative loop quitters
-- check cursive and r2l
-- find out where ignore-mark-classes went
--- remove unused tables
--- slide tail (always glue at the end so only needed once
-- default features (per language, script)
--- cleanup kern(class) code, remove double info
-- handle positions (we need example fonts)
-- handle gpos_single (we might want an extra width field in glyph nodes because adding kerns might interfere)
@@ -111,6 +100,8 @@ results in different tables.</p>
-- gpos_context ok --
-- gpos_contextchain ok --
--
+-- todo: contextpos and contextsub and class stuff
+--
-- actions:
--
-- handler : actions triggered by lookup
@@ -120,13 +111,20 @@ results in different tables.</p>
-- 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
+-- case I will probably prefix (i.e. rename) the lookups in the cached font file.
+
local concat, insert, remove = table.concat, table.insert, table.remove
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 lpegmatch = lpeg.match
+local random = math.random
+
+local logs, trackers, nodes, attributes = logs, trackers, nodes, attributes
-local otf = fonts.otf
-local tfm = fonts.tfm
+local fonts = fonts
+local otf = fonts.handlers.otf
local trace_lookups = false trackers.register("otf.lookups", function(v) trace_lookups = v end)
local trace_singles = false trackers.register("otf.singles", function(v) trace_singles = v end)
@@ -145,6 +143,12 @@ local trace_steps = false trackers.register("otf.steps", function
local trace_skips = false trackers.register("otf.skips", function(v) trace_skips = v end)
local trace_directions = false trackers.register("otf.directions", function(v) trace_directions = v 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")
+
trackers.register("otf.verbose_chain", function(v) otf.setcontextchain(v and "verbose") end)
trackers.register("otf.normal_chain", function(v) otf.setcontextchain(v and "normal") end)
@@ -155,83 +159,84 @@ trackers.register("otf.injections","nodes.injections")
trackers.register("*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 set_attribute = node.set_attribute
-local has_attribute = node.has_attribute
+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 set_attribute = node.set_attribute
+local has_attribute = node.has_attribute
+
+local setmetatableindex = table.setmetatableindex
+
+local zwnj = 0x200C
+local zwj = 0x200D
+local wildcard = "*"
+local default = "dflt"
+
+local nodecodes = nodes.nodecodes
+local whatcodes = nodes.whatcodes
+local glyphcodes = nodes.glyphcodes
+
+local glyph_code = nodecodes.glyph
+local glue_code = nodecodes.glue
+local disc_code = nodecodes.disc
+local whatsit_code = nodecodes.whatsit
-local zwnj = 0x200C
-local zwj = 0x200D
-local wildcard = "*"
-local default = "dflt"
+local dir_code = whatcodes.dir
+local localpar_code = whatcodes.localpar
-local split_at_space = lpeg.splitters[" "] or lpeg.Ct(lpeg.splitat(" ")) -- no trailing or multiple spaces anyway
+local ligature_code = glyphcodes.ligature
-local glyph = node.id('glyph')
-local glue = node.id('glue')
-local kern = node.id('kern')
-local disc = node.id('disc')
-local whatsit = node.id('whatsit')
+local privateattribute = attributes.private
-local state = attributes.private('state')
-local markbase = attributes.private('markbase')
-local markmark = attributes.private('markmark')
-local markdone = attributes.private('markdone')
-local cursbase = attributes.private('cursbase')
-local curscurs = attributes.private('curscurs')
-local cursdone = attributes.private('cursdone')
-local kernpair = attributes.private('kernpair')
+local state = privateattribute('state')
+local markbase = privateattribute('markbase')
+local markmark = privateattribute('markmark')
+local markdone = privateattribute('markdone')
+local cursbase = privateattribute('cursbase')
+local curscurs = privateattribute('curscurs')
+local cursdone = privateattribute('cursdone')
+local kernpair = privateattribute('kernpair')
-local set_mark = nodes.set_mark
-local set_cursive = nodes.set_cursive
-local set_kern = nodes.set_kern
-local set_pair = nodes.set_pair
+local injections = nodes.injections
+local setmark = injections.setmark
+local setcursive = injections.setcursive
+local setkern = injections.setkern
+local setpair = injections.setpair
-local markonce = true
-local cursonce = true
-local kernonce = true
+local markonce = true
+local cursonce = true
+local kernonce = true
-local fontdata = fonts.ids
+local fonthashes = fonts.hashes
+local fontdata = fonthashes.identifiers
-otf.features.process = { }
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
+
+local onetimemessage = fonts.loggers.onetimemessage
-- we share some vars here, after all, we have no nested lookups and
-- less code
-local tfmdata = false
-local otfdata = false
-local characters = false
-local descriptions = false
-local marks = false
-local indices = false
-local unicodes = false
-local currentfont = false
-local lookuptable = false
-local anchorlookups = false
-local handlers = { }
-local rlmode = 0
-local featurevalue = false
-
--- we cheat a bit and assume that a font,attr combination are kind of ranged
-
-local context_setups = fonts.define.specify.context_setups
-local context_numbers = fonts.define.specify.context_numbers
-local context_merged = fonts.define.specify.context_merged
-
--- we cannot optimize with "start = first_character(head)" because then we don't
+local tfmdata = false
+local characters = false
+local descriptions = false
+local resources = false
+local marks = false
+local currentfont = false
+local lookuptable = false
+local anchorlookups = false
+local lookuptypes = false
+local handlers = { }
+local rlmode = 0
+local featurevalue = false
+
+-- we cannot optimize with "start = first_glyph(head)" because then we don't
-- know which rlmode we're in which messes up cursive handling later on
--
-- head is always a whatsit so we can safely assume that head is not changed
-local special_attributes = {
- init = 1,
- medi = 2,
- fina = 3,
- isol = 4
-}
-
-- we use this for special testing and documentation
local checkstep = (nodes and nodes.tracers and nodes.tracers.steppers.check) or function() end
@@ -242,10 +247,11 @@ local function logprocess(...)
if trace_steps then
registermessage(...)
end
- logs.report("otf direct",...)
+ report_direct(...)
end
+
local function logwarning(...)
- logs.report("otf direct",...)
+ report_direct(...)
end
local function gref(n)
@@ -253,9 +259,9 @@ local function gref(n)
local description = descriptions[n]
local name = description and description.name
if name then
- return format("U+%04X (%s)",n,name)
+ return format("U+%05X (%s)",n,name)
else
- return format("U+%04X",n)
+ return format("U+%05X",n)
end
elseif not n then
return "<error in tracing>"
@@ -263,9 +269,11 @@ local function gref(n)
local num, nam = { }, { }
for i=1,#n do
local ni = n[i]
- num[#num+1] = format("U+%04X",ni)
- local dni = descriptions[ni]
- nam[#num] = (dni and dni.name) or "?"
+ if tonumber(ni) then -- later we will start at 2
+ local di = descriptions[ni]
+ num[i] = format("U+%05X",ni)
+ nam[i] = di and di.name or "?"
+ end
end
return format("%s (%s)",concat(num," "), concat(nam," "))
end
@@ -303,89 +311,77 @@ local function markstoligature(kind,lookupname,start,stop,char)
snext.prev = current
end
start.prev, stop.next = nil, nil
- current.char, current.subtype, current.components = char, 2, start
+ current.char, current.subtype, current.components = char, ligature_code, start
return keep
end
local function toligature(kind,lookupname,start,stop,char,markflag,discfound) -- brr head
- if start ~= stop then
---~ if discfound then
---~ local lignode = copy_node(start)
---~ lignode.font = start.font
---~ lignode.char = char
---~ lignode.subtype = 2
---~ start = node.do_ligature_n(start, stop, lignode)
---~ if start.id == disc then
---~ local prev = start.prev
---~ start = start.next
---~ end
- if discfound then
- -- print("start->stop",nodes.tosequence(start,stop))
- local lignode = copy_node(start)
- lignode.font, lignode.char, lignode.subtype = start.font, char, 2
- local next, prev = stop.next, start.prev
- stop.next = nil
- lignode = node.do_ligature_n(start, stop, lignode)
- prev.next = lignode
- if next then
- next.prev = lignode
- end
- lignode.next, lignode.prev = next, prev
- start = lignode
- -- print("start->end",nodes.tosequence(start))
- else -- start is the ligature
- local deletemarks = markflag ~= "mark"
- local n = copy_node(start)
- local current
- current, start = insert_node_after(start,start,n)
- local snext = stop.next
- current.next = snext
- if snext then
- snext.prev = current
- end
- start.prev, stop.next = nil, nil
- current.char, current.subtype, current.components = char, 2, start
- local head = current
- if deletemarks then
- if trace_marks then
- while start do
- if marks[start.char] then
- logwarning("%s: remove mark %s",pref(kind,lookupname),gref(start.char))
- end
- start = start.next
- end
- end
- else
- local i = 0
+ if start == stop then
+ start.char = char
+ elseif discfound then
+ -- print("start->stop",nodes.tosequence(start,stop))
+ local lignode = copy_node(start)
+ lignode.font, lignode.char, lignode.subtype = start.font, char, ligature_code
+ local next, prev = stop.next, start.prev
+ stop.next = nil
+ lignode = node.do_ligature_n(start, stop, lignode)
+ prev.next = lignode
+ if next then
+ next.prev = lignode
+ end
+ lignode.next, lignode.prev = next, prev
+ start = lignode
+ -- print("start->end",nodes.tosequence(start))
+ else -- start is the ligature
+ local deletemarks = markflag ~= "mark"
+ local n = copy_node(start)
+ local current
+ current, start = insert_node_after(start,start,n)
+ local snext = stop.next
+ current.next = snext
+ if snext then
+ snext.prev = current
+ end
+ start.prev, stop.next = nil, nil
+ current.char, current.subtype, current.components = char, ligature_code, start
+ local head = current
+ if deletemarks then
+ if trace_marks then
while start do
if marks[start.char] then
- set_attribute(start,markdone,i)
- if trace_marks then
- logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(start.char),i)
- end
- head, current = insert_node_after(head,current,copy_node(start))
- else
- i = i + 1
+ logwarning("%s: remove mark %s",pref(kind,lookupname),gref(start.char))
end
start = start.next
end
- start = current.next
- while start and start.id == glyph do
- if marks[start.char] then
- set_attribute(start,markdone,i)
- if trace_marks then
- logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(start.char),i)
- end
- else
- break
+ end
+ else
+ local i = 0
+ while start do
+ if marks[start.char] then
+ set_attribute(start,markdone,i)
+ if trace_marks then
+ logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(start.char),i)
end
- start = start.next
+ head, current = insert_node_after(head,current,copy_node(start))
+ else
+ i = i + 1
end
+ start = start.next
+ end
+ start = current.next
+ while start and start.id == glyph_code do
+ if marks[start.char] then
+ set_attribute(start,markdone,i)
+ if trace_marks then
+ logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(start.char),i)
+ end
+ else
+ break
+ end
+ start = start.next
end
- return head
end
- else
- start.char = char
+ return head
end
return start
end
@@ -401,7 +397,7 @@ end
local function alternative_glyph(start,alternatives,kind,chainname,chainlookupname,lookupname) -- chainname and chainlookupname optional
local value, choice, n = featurevalue or tfmdata.shared.features[kind], nil, #alternatives -- global value, brrr
if value == "random" then
- local r = math.random(1,n)
+ local r = random(1,n)
value, choice = format("random, choice %s",r), alternatives[r]
elseif value == "first" then
value, choice = format("first, choice %s",1), alternatives[1]
@@ -428,6 +424,33 @@ local function alternative_glyph(start,alternatives,kind,chainname,chainlookupna
return choice, value
end
+local function multiple_glyphs(start,multiple)
+ local nofmultiples = #multiple
+ if nofmultiples > 0 then
+ start.char = multiple[1]
+ if nofmultiples > 1 then
+ local sn = start.next
+ for k=2,nofmultiples do -- todo: use insert_node
+ local n = copy_node(start)
+ n.char = multiple[k]
+ n.next = sn
+ n.prev = start
+ if sn then
+ sn.prev = n
+ end
+ start.next = n
+ start = n
+ end
+ end
+ return start, true
+ else
+ if trace_multiples then
+ logprocess("no multiple for %s",gref(start.char))
+ end
+ return start, false
+ end
+end
+
function handlers.gsub_alternate(start,kind,lookupname,alternative,sequence)
local choice, index = alternative_glyph(start,alternative,kind,lookupname)
if trace_alternatives then
@@ -441,41 +464,21 @@ function handlers.gsub_multiple(start,kind,lookupname,multiple)
if trace_multiples then
logprocess("%s: replacing %s by multiple %s",pref(kind,lookupname),gref(start.char),gref(multiple))
end
- start.char = multiple[1]
- if #multiple > 1 then
- for k=2,#multiple do
- local n = copy_node(start)
- n.char = multiple[k]
- local sn = start.next
- n.next = sn
- n.prev = start
- if sn then
- sn.prev = n
- end
- start.next = n
- start = n
- end
- end
- return start, true
+ return multiple_glyphs(start,multiple)
end
-function handlers.gsub_ligature(start,kind,lookupname,ligature,sequence) --or maybe pass lookup ref
+function handlers.gsub_ligature(start,kind,lookupname,ligature,sequence)
local s, stop, discfound = start.next, nil, false
local startchar = start.char
if marks[startchar] then
while s do
local id = s.id
- if id == glyph and s.subtype<256 then
- if s.font == currentfont then
- local char = s.char
- local lg = ligature[1][char]
- if not lg then
- break
- else
- stop = s
- ligature = lg
- s = s.next
- end
+ if id == glyph_code and s.subtype<256 and s.font == currentfont then
+ local lg = ligature[s.char]
+ if lg then
+ stop = s
+ ligature = lg
+ s = s.next
else
break
end
@@ -483,54 +486,64 @@ function handlers.gsub_ligature(start,kind,lookupname,ligature,sequence) --or ma
break
end
end
- if stop and ligature[2] then
- if trace_ligatures then
- local stopchar = stop.char
- start = markstoligature(kind,lookupname,start,stop,ligature[2])
- logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ if stop then
+ local lig = ligature.ligature
+ if lig then
+ if trace_ligatures then
+ local stopchar = stop.char
+ start = markstoligature(kind,lookupname,start,stop,lig)
+ logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ else
+ start = markstoligature(kind,lookupname,start,stop,lig)
+ end
+ return start, true
else
- start = markstoligature(kind,lookupname,start,stop,ligature[2])
+ -- ok, goto next lookup
end
- return start, true
end
else
local skipmark = sequence.flags[1]
while s do
local id = s.id
- if id == glyph and s.subtype<256 then
+ if id == glyph_code and s.subtype<256 then
if s.font == currentfont then
local char = s.char
if skipmark and marks[char] then
s = s.next
else
- local lg = ligature[1][char]
- if not lg then
- break
- else
+ local lg = ligature[char]
+ if lg then
stop = s
ligature = lg
s = s.next
+ else
+ break
end
end
else
break
end
- elseif id == disc then
+ elseif id == disc_code then
discfound = true
s = s.next
else
break
end
end
- if stop and ligature[2] then
- if trace_ligatures then
- local stopchar = stop.char
- start = toligature(kind,lookupname,start,stop,ligature[2],skipmark,discfound)
- logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ if stop then
+ local lig = ligature.ligature
+ if lig then
+ if trace_ligatures then
+ local stopchar = stop.char
+ start = toligature(kind,lookupname,start,stop,lig,skipmark,discfound)
+ logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ else
+ start = toligature(kind,lookupname,start,stop,lig,skipmark,discfound)
+ end
+ return start, true
else
- start = toligature(kind,lookupname,start,stop,ligature[2],skipmark,discfound)
+ -- ok, goto next lookup
end
- return start, true
end
end
return start, false
@@ -545,12 +558,12 @@ function handlers.gpos_mark2base(start,kind,lookupname,markanchors,sequence)
local markchar = start.char
if marks[markchar] then
local base = start.prev -- [glyph] [start=mark]
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
local basechar = base.char
if marks[basechar] then
while true do
base = base.prev
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
basechar = base.char
if not marks[basechar] then
break
@@ -575,7 +588,7 @@ function handlers.gpos_mark2base(start,kind,lookupname,markanchors,sequence)
if al[anchor] then
local ma = markanchors[anchor]
if ma then
- local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%s,%s)",
pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -590,7 +603,7 @@ function handlers.gpos_mark2base(start,kind,lookupname,markanchors,sequence)
end
else -- if trace_bugs then
-- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar))
- fonts.register_message(currentfont,basechar,"no base anchors")
+ onetimemessage(currentfont,basechar,"no base anchors",report_fonts)
end
elseif trace_bugs then
logwarning("%s: prev node is no char",pref(kind,lookupname))
@@ -607,13 +620,13 @@ function handlers.gpos_mark2ligature(start,kind,lookupname,markanchors,sequence)
if marks[markchar] then
local base = start.prev -- [glyph] [optional marks] [start=mark]
local index = 1
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
local basechar = base.char
if marks[basechar] then
index = index + 1
while true do
base = base.prev
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
basechar = base.char
if marks[basechar] then
index = index + 1
@@ -643,7 +656,7 @@ function handlers.gpos_mark2ligature(start,kind,lookupname,markanchors,sequence)
if ma then
ba = ba[index]
if ba then
- local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma,index)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,index)
if trace_marks then
logprocess("%s, anchor %s, index %s, bound %s: anchoring mark %s to baselig %s at index %s => (%s,%s)",
pref(kind,lookupname),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy)
@@ -660,7 +673,7 @@ function handlers.gpos_mark2ligature(start,kind,lookupname,markanchors,sequence)
end
else -- if trace_bugs then
-- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar))
- fonts.register_message(currentfont,basechar,"no base anchors")
+ onetimemessage(currentfont,basechar,"no base anchors",report_fonts)
end
elseif trace_bugs then
logwarning("%s: prev node is no char",pref(kind,lookupname))
@@ -677,7 +690,7 @@ function handlers.gpos_mark2mark(start,kind,lookupname,markanchors,sequence)
--~ local alreadydone = markonce and has_attribute(start,markmark)
--~ if not alreadydone then
local base = start.prev -- [glyph] [basemark] [start=mark]
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then -- subtype test can go
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then -- subtype test can go
local basechar = base.char
local baseanchors = descriptions[basechar]
if baseanchors then
@@ -690,7 +703,7 @@ function handlers.gpos_mark2mark(start,kind,lookupname,markanchors,sequence)
if al[anchor] then
local ma = markanchors[anchor]
if ma then
- local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%s,%s)",
pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -706,7 +719,7 @@ function handlers.gpos_mark2mark(start,kind,lookupname,markanchors,sequence)
end
else -- if trace_bugs then
-- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar))
- fonts.register_message(currentfont,basechar,"no base anchors")
+ onetimemessage(currentfont,basechar,"no base anchors",report_fonts)
end
elseif trace_bugs then
logwarning("%s: prev node is no mark",pref(kind,lookupname))
@@ -731,7 +744,7 @@ function handlers.gpos_cursive(start,kind,lookupname,exitanchors,sequence) -- to
end
else
local nxt = start.next
- while not done and nxt and nxt.id == glyph and nxt.subtype<256 and nxt.font == currentfont do
+ while not done and nxt and nxt.id == glyph_code and nxt.subtype<256 and nxt.font == currentfont do
local nextchar = nxt.char
if marks[nextchar] then
-- should not happen (maybe warning)
@@ -748,7 +761,7 @@ function handlers.gpos_cursive(start,kind,lookupname,exitanchors,sequence) -- to
if al[anchor] then
local exit = exitanchors[anchor]
if exit then
- local dx, dy, bound = set_cursive(start,nxt,tfmdata.factor,rlmode,exit,entry,characters[startchar],characters[nextchar])
+ local dx, dy, bound = setcursive(start,nxt,tfmdata.parameters.factor,rlmode,exit,entry,characters[startchar],characters[nextchar])
if trace_cursive then
logprocess("%s: moving %s to %s cursive (%s,%s) using anchor %s and bound %s in rlmode %s",pref(kind,lookupname),gref(startchar),gref(nextchar),dx,dy,anchor,bound,rlmode)
end
@@ -761,7 +774,7 @@ function handlers.gpos_cursive(start,kind,lookupname,exitanchors,sequence) -- to
end
else -- if trace_bugs then
-- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(startchar))
- fonts.register_message(currentfont,startchar,"no entry anchors")
+ onetimemessage(currentfont,startchar,"no entry anchors",report_fonts)
end
break
end
@@ -778,7 +791,7 @@ end
function handlers.gpos_single(start,kind,lookupname,kerns,sequence)
local startchar = start.char
- local dx, dy, w, h = set_pair(start,tfmdata.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 (%s,%s) and correction (%s,%s)",pref(kind,lookupname),gref(startchar),dx,dy,w,h)
end
@@ -793,10 +806,11 @@ function handlers.gpos_pair(start,kind,lookupname,kerns,sequence)
return start, false
else
local prev, done = start, false
- local factor = tfmdata.factor
- while snext and snext.id == glyph and snext.subtype<256 and snext.font == currentfont do
+ local factor = tfmdata.parameters.factor
+ local lookuptype = lookuptypes[lookupname]
+ while snext and snext.id == glyph_code and snext.subtype<256 and snext.font == currentfont do
local nextchar = snext.char
-local krn = kerns[nextchar]
+ local krn = kerns[nextchar]
if not krn and marks[nextchar] then
prev = snext
snext = snext.next
@@ -805,38 +819,38 @@ local krn = kerns[nextchar]
if not krn then
-- skip
elseif type(krn) == "table" then
- if krn[1] == "pair" then
- local a, b = krn[3], krn[4]
+ 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 x, y, w, h = set_pair(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 (%s,%s) and correction (%s,%s)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
end
if b and #b > 0 then
local startchar = start.char
- local x, y, w, h = set_pair(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 (%s,%s) and correction (%s,%s)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
end
- else
- logs.report("%s: check this out (old kern stuff)",pref(kind,lookupname))
- local a, b = krn[3], krn[7]
- if a and a ~= 0 then
- local k = set_kern(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))
- end
- end
- if b and b ~= 0 then
- logwarning("%s: ignoring second kern xoff %s",pref(kind,lookupname),b*factor)
- end
+ else -- wrong ... position has different entries
+ report_process("%s: check this out (old kern stuff)",pref(kind,lookupname))
+ -- local a, b = krn[2], krn[6]
+ -- 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))
+ -- end
+ -- end
+ -- if b and b ~= 0 then
+ -- logwarning("%s: ignoring second kern xoff %s",pref(kind,lookupname),b*factor)
+ -- end
end
done = true
elseif krn ~= 0 then
- local k = set_kern(snext,factor,rlmode,krn)
+ 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))
end
@@ -861,59 +875,51 @@ local function logprocess(...)
if trace_steps then
registermessage(...)
end
- logs.report("otf subchain",...)
-end
-local function logwarning(...)
- logs.report("otf subchain",...)
+ report_subchain(...)
end
--- ['coverage']={
--- ['after']={ "r" },
--- ['before']={ "q" },
--- ['current']={ "a", "b", "c" },
--- },
--- ['lookups']={ "ls_l_1", "ls_l_1", "ls_l_1" },
+local logwarning = report_subchain
-function chainmores.chainsub(start,stop,kind,chainname,currentcontext,cache,lookuplist,chainlookupname,n)
+function chainmores.chainsub(start,stop,kind,chainname,currentcontext,lookuphash,lookuplist,chainlookupname,n)
logprocess("%s: a direct call to chainsub cannot happen",cref(kind,chainname,chainlookupname))
return start, false
end
-- handled later:
--
--- function chainmores.gsub_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
--- return chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+-- function chainmores.gsub_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n)
+-- return chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n)
-- end
-function chainmores.gsub_multiple(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+function chainmores.gsub_multiple(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n)
logprocess("%s: gsub_multiple not yet supported",cref(kind,chainname,chainlookupname))
return start, false
end
-function chainmores.gsub_alternate(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+
+function chainmores.gsub_alternate(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n)
logprocess("%s: gsub_alternate not yet supported",cref(kind,chainname,chainlookupname))
return start, false
end
-- handled later:
--
--- function chainmores.gsub_ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
--- return chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+-- function chainmores.gsub_ligature(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n)
+-- return chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n)
-- end
local function logprocess(...)
if trace_steps then
registermessage(...)
end
- logs.report("otf chain",...)
-end
-local function logwarning(...)
- logs.report("otf chain",...)
+ report_chain(...)
end
+local logwarning = report_chain
+
-- We could share functions but that would lead to extra function calls with many
-- arguments, redundant tests and confusing messages.
-function chainprocs.chainsub(start,stop,kind,chainname,currentcontext,cache,lookuplist,chainlookupname)
+function chainprocs.chainsub(start,stop,kind,chainname,currentcontext,lookuphash,lookuplist,chainlookupname)
logwarning("%s: a direct call to chainsub cannot happen",cref(kind,chainname,chainlookupname))
return start, false
end
@@ -922,7 +928,7 @@ end
-- in a bit weird way. There is no lookup and the replacement comes from the lookup
-- itself. It is meant mostly for dealing with Urdu.
-function chainprocs.reversesub(start,stop,kind,chainname,currentcontext,cache,replacements)
+function chainprocs.reversesub(start,stop,kind,chainname,currentcontext,lookuphash,replacements)
local char = start.char
local replacement = replacements[char]
if replacement then
@@ -955,11 +961,10 @@ as less as needed but that would also mke the code even more messy.</p>
local function delete_till_stop(start,stop,ignoremarks)
if start ~= stop then
-- todo keep marks
- local done = false
- while not done do
- done = start == stop
- delete_node(start,start.next)
- end
+ repeat
+ local next = start.next
+ delete_node(start,next)
+ until next == stop
end
end
@@ -968,18 +973,22 @@ end
match.</p>
--ldx]]--
-function chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex)
+function chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex)
-- todo: marks ?
- if not chainindex then
- delete_till_stop(start,stop) -- ,currentlookup.flags[1])
- end
+--~ if not chainindex then
+--~ delete_till_stop(start,stop) -- ,currentlookup.flags[1]
+--~ stop = start
+--~ end
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," "))
+ end
while current do
- if current.id == glyph then
+ if current.id == glyph_code then
local currentchar = current.char
- local lookupname = subtables[1]
- local replacement = cache.gsub_single[lookupname]
+ local lookupname = subtables[1] -- only 1
+ local replacement = lookuphash[lookupname]
if not replacement then
if trace_bugs then
logwarning("%s: no single hits",cref(kind,chainname,chainlookupname,lookupname,chainindex))
@@ -1014,12 +1023,12 @@ chainmores.gsub_single = chainprocs.gsub_single
the match.</p>
--ldx]]--
-function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
delete_till_stop(start,stop)
local startchar = start.char
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local replacements = cache.gsub_multiple[lookupname]
+ local replacements = lookuphash[lookupname]
if not replacements then
if trace_bugs then
logwarning("%s: no multiple hits",cref(kind,chainname,chainlookupname,lookupname))
@@ -1034,21 +1043,7 @@ function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,cache
if trace_multiples then
logprocess("%s: replacing %s by multiple characters %s",cref(kind,chainname,chainlookupname,lookupname),gref(startchar),gref(replacements))
end
- local sn = start.next
- for k=1,#replacements do
- if k == 1 then
- start.char = replacements[k]
- else
- local n = copy_node(start) -- maybe delete the components and such
- n.char = replacements[k]
- n.next, n.prev = sn, start
- if sn then
- sn.prev = n
- end
- start.next, start = n, n
- end
- end
- return start, true
+ return multiple_glyphs(start,replacements)
end
end
return start, false
@@ -1058,16 +1053,16 @@ end
<p>Here we replace start by new glyph. First we delete the rest of the match.</p>
--ldx]]--
-function chainprocs.gsub_alternate(start,stop,kind,lookupname,currentcontext,cache,currentlookup)
+function chainprocs.gsub_alternate(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
-- todo: marks ?
delete_till_stop(start,stop)
local current = start
local subtables = currentlookup.subtables
while current do
- if current.id == glyph then
+ if current.id == glyph_code then
local currentchar = current.char
local lookupname = subtables[1]
- local alternatives = cache.gsub_alternate[lookupname]
+ local alternatives = lookuphash[lookupname]
if not alternatives then
if trace_bugs then
logwarning("%s: no alternative hits",cref(kind,chainname,chainlookupname,lookupname))
@@ -1102,11 +1097,11 @@ this function (move code inline and handle the marks by a separate function). We
assume rather stupid ligatures (no complex disc nodes).</p>
--ldx]]--
-function chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex)
+function chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex)
local startchar = start.char
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local ligatures = cache.gsub_ligature[lookupname]
+ local ligatures = lookuphash[lookupname]
if not ligatures then
if trace_bugs then
logwarning("%s: no ligature hits",cref(kind,chainname,chainlookupname,lookupname,chainindex))
@@ -1121,7 +1116,7 @@ function chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache
local s, discfound, last, nofreplacements = start.next, false, stop, 0
while s do
local id = s.id
- if id == disc then
+ if id == disc_code then
s = s.next
discfound = true
else
@@ -1129,21 +1124,21 @@ function chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache
if marks[schar] then -- marks
s = s.next
else
- local lg = ligatures[1][schar]
- if not lg then
- break
- else
+ local lg = ligatures[schar]
+ if lg then
ligatures, last, nofreplacements = lg, s, nofreplacements + 1
if s == stop then
break
else
s = s.next
end
+ else
+ break
end
end
end
end
- local l2 = ligatures[2]
+ local l2 = ligatures.ligature
if l2 then
if chainindex then
stop = last
@@ -1155,7 +1150,7 @@ function chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache
logprocess("%s: replacing character %s upto %s by ligature %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char),gref(l2))
end
end
- start = toligature(kind,lookup,start,stop,l2,currentlookup.flags[1],discfound)
+ start = toligature(kind,lookupname,start,stop,l2,currentlookup.flags[1],discfound)
return start, true, nofreplacements
elseif trace_bugs then
if start == stop then
@@ -1171,23 +1166,23 @@ end
chainmores.gsub_ligature = chainprocs.gsub_ligature
-function chainprocs.gpos_mark2base(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+function chainprocs.gpos_mark2base(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
local markchar = start.char
if marks[markchar] then
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local markanchors = cache.gpos_mark2base[lookupname]
+ local markanchors = lookuphash[lookupname]
if markanchors then
markanchors = markanchors[markchar]
end
if markanchors then
local base = start.prev -- [glyph] [start=mark]
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
local basechar = base.char
if marks[basechar] then
while true do
base = base.prev
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
basechar = base.char
if not marks[basechar] then
break
@@ -1209,7 +1204,7 @@ function chainprocs.gpos_mark2base(start,stop,kind,chainname,currentcontext,cach
if al[anchor] then
local ma = markanchors[anchor]
if ma then
- local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%s,%s)",
cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -1235,25 +1230,25 @@ function chainprocs.gpos_mark2base(start,stop,kind,chainname,currentcontext,cach
return start, false
end
-function chainprocs.gpos_mark2ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+function chainprocs.gpos_mark2ligature(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
local markchar = start.char
if marks[markchar] then
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local markanchors = cache.gpos_mark2ligature[lookupname]
+ local markanchors = lookuphash[lookupname]
if markanchors then
markanchors = markanchors[markchar]
end
if markanchors then
local base = start.prev -- [glyph] [optional marks] [start=mark]
local index = 1
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
local basechar = base.char
if marks[basechar] then
index = index + 1
while true do
base = base.prev
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
basechar = base.char
if marks[basechar] then
index = index + 1
@@ -1282,7 +1277,7 @@ function chainprocs.gpos_mark2ligature(start,stop,kind,chainname,currentcontext,
if ma then
ba = ba[index]
if ba then
- local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma,index)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,index)
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to baselig %s at index %s => (%s,%s)",
cref(kind,chainname,chainlookupname,lookupname),anchor,a or bound,gref(markchar),gref(basechar),index,dx,dy)
@@ -1309,7 +1304,7 @@ function chainprocs.gpos_mark2ligature(start,stop,kind,chainname,currentcontext,
return start, false
end
-function chainprocs.gpos_mark2mark(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+function chainprocs.gpos_mark2mark(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
local markchar = start.char
if marks[markchar] then
--~ local alreadydone = markonce and has_attribute(start,markmark)
@@ -1317,13 +1312,13 @@ function chainprocs.gpos_mark2mark(start,stop,kind,chainname,currentcontext,cach
-- local markanchors = descriptions[markchar].anchors markanchors = markanchors and markanchors.mark
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local markanchors = cache.gpos_mark2mark[lookupname]
+ local markanchors = lookuphash[lookupname]
if markanchors then
markanchors = markanchors[markchar]
end
if markanchors then
local base = start.prev -- [glyph] [basemark] [start=mark]
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then -- subtype test can go
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then -- subtype test can go
local basechar = base.char
local baseanchors = descriptions[basechar].anchors
if baseanchors then
@@ -1334,7 +1329,7 @@ function chainprocs.gpos_mark2mark(start,stop,kind,chainname,currentcontext,cach
if al[anchor] then
local ma = markanchors[anchor]
if ma then
- local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%s,%s)",
cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -1365,13 +1360,13 @@ end
-- ! ! ! untested ! ! !
-function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
local alreadydone = cursonce and has_attribute(start,cursbase)
if not alreadydone then
local startchar = start.char
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local exitanchors = cache.gpos_cursive[lookupname]
+ local exitanchors = lookuphash[lookupname]
if exitanchors then
exitanchors = exitanchors[startchar]
end
@@ -1383,7 +1378,7 @@ function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,cache,
end
else
local nxt = start.next
- while not done and nxt and nxt.id == glyph and nxt.subtype<256 and nxt.font == currentfont do
+ while not done and nxt and nxt.id == glyph_code and nxt.subtype<256 and nxt.font == currentfont do
local nextchar = nxt.char
if marks[nextchar] then
-- should not happen (maybe warning)
@@ -1400,7 +1395,7 @@ function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,cache,
if al[anchor] then
local exit = exitanchors[anchor]
if exit then
- local dx, dy, bound = set_cursive(start,nxt,tfmdata.factor,rlmode,exit,entry,characters[startchar],characters[nextchar])
+ local dx, dy, bound = setcursive(start,nxt,tfmdata.parameters.factor,rlmode,exit,entry,characters[startchar],characters[nextchar])
if trace_cursive then
logprocess("%s: moving %s to %s cursive (%s,%s) using anchor %s and bound %s in rlmode %s",pref(kind,lookupname),gref(startchar),gref(nextchar),dx,dy,anchor,bound,rlmode)
end
@@ -1413,7 +1408,7 @@ function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,cache,
end
else -- if trace_bugs then
-- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(startchar))
- fonts.register_message(currentfont,startchar,"no entry anchors")
+ onetimemessage(currentfont,startchar,"no entry anchors",report_fonts)
end
break
end
@@ -1430,16 +1425,16 @@ function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,cache,
return start, false
end
-function chainprocs.gpos_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex,sequence)
- -- untested
+function chainprocs.gpos_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence)
+ -- untested .. needs checking for the new model
local startchar = start.char
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local kerns = cache.gpos_single[lookupname]
+ local kerns = lookuphash[lookupname]
if kerns then
- kerns = kerns[startchar]
+ kerns = kerns[startchar] -- needed ?
if kerns then
- local dx, dy, w, h = set_pair(start,tfmdata.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 (%s,%s) and correction (%s,%s)",cref(kind,chainname,chainlookupname),gref(startchar),dx,dy,w,h)
end
@@ -1450,20 +1445,21 @@ end
-- when machines become faster i will make a shared function
-function chainprocs.gpos_pair(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex,sequence)
+function chainprocs.gpos_pair(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence)
-- logwarning("%s: gpos_pair not yet supported",cref(kind,chainname,chainlookupname))
local snext = start.next
if snext then
local startchar = start.char
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local kerns = cache.gpos_pair[lookupname]
+ local kerns = lookuphash[lookupname]
if kerns then
kerns = kerns[startchar]
if kerns then
+ local lookuptype = lookuptypes[lookupname]
local prev, done = start, false
- local factor = tfmdata.factor
- while snext and snext.id == glyph and snext.subtype<256 and snext.font == currentfont do
+ local factor = tfmdata.parameters.factor
+ while snext and snext.id == glyph_code and snext.subtype<256 and snext.font == currentfont do
local nextchar = snext.char
local krn = kerns[nextchar]
if not krn and marks[nextchar] then
@@ -1473,27 +1469,27 @@ function chainprocs.gpos_pair(start,stop,kind,chainname,currentcontext,cache,cur
if not krn then
-- skip
elseif type(krn) == "table" then
- if krn[1] == "pair" then
- local a, b = krn[3], krn[4]
+ if lookuptype == "pair" then
+ local a, b = krn[2], krn[3]
if a and #a > 0 then
local startchar = start.char
- local x, y, w, h = set_pair(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 (%s,%s) and correction (%s,%s)",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 x, y, w, h = set_pair(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 (%s,%s) and correction (%s,%s)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
end
else
- logs.report("%s: check this out (old kern stuff)",cref(kind,chainname,chainlookupname))
- local a, b = krn[3], krn[7]
+ report_process("%s: check this out (old kern stuff)",cref(kind,chainname,chainlookupname))
+ local a, b = krn[2], krn[6]
if a and a ~= 0 then
- local k = set_kern(snext,factor,rlmode,a)
+ 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))
end
@@ -1504,7 +1500,7 @@ function chainprocs.gpos_pair(start,stop,kind,chainname,currentcontext,cache,cur
end
done = true
elseif krn ~= 0 then
- local k = set_kern(snext,factor,rlmode,krn)
+ 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))
end
@@ -1536,7 +1532,7 @@ local function show_skip(kind,chainname,char,ck,class)
end
end
-local function normal_handle_contextchain(start,kind,chainname,contexts,sequence,cache)
+local function normal_handle_contextchain(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, done = sequence.flags, false
local skipmark, skipligature, skipbase = flags[1], flags[2], flags[3]
@@ -1551,11 +1547,12 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
-- f..l = mid string
if s == 1 then
-- never happens
- match = current.id == glyph and current.subtype<256 and current.font == currentfont and seq[1][current.char]
+ match = current.id == glyph_code and current.subtype<256 and current.font == currentfont and seq[1][current.char]
else
-- todo: better space check (maybe check for glue)
local f, l = ck[4], ck[5]
- if f == l then
+ -- current match
+ if f == 1 and f == l then
-- already a hit
match = true
else
@@ -1565,12 +1562,12 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
-- we cannot optimize for n=2 because there can be disc nodes
-- if not someskip and n == l then
-- -- n=2 and no skips then faster loop
- -- match = last and last.id == glyph and last.subtype<256 and last.font == currentfont and seq[n][last.char]
+ -- match = last and last.id == glyph_code and last.subtype<256 and last.font == currentfont and seq[n][last.char]
-- else
while n <= l do
if last then
local id = last.id
- if id == glyph then
+ if id == glyph_code then
if last.subtype<256 and last.font == currentfont then
local char = last.char
local ccd = descriptions[char]
@@ -1596,7 +1593,7 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
else
match = false break
end
- elseif id == disc then -- what to do with kerns?
+ elseif id == disc_code then -- what to do with kerns?
last = last.next
else
match = false break
@@ -1607,15 +1604,15 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
end
-- end
end
+ -- before
if match and f > 1 then
- -- before
local prev = start.prev
if prev then
local n = f-1
while n >= 1 do
if prev then
local id = prev.id
- if id == glyph then
+ if id == glyph_code then
if prev.subtype<256 and prev.font == currentfont then -- normal char
local char = prev.char
local ccd = descriptions[char]
@@ -1637,7 +1634,7 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
else
match = false break
end
- elseif id == disc then
+ elseif id == disc_code then
-- skip 'm
elseif seq[n][32] then
n = n -1
@@ -1645,7 +1642,7 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
match = false break
end
prev = prev.prev
- elseif seq[n][32] then
+ elseif seq[n][32] then -- somehat special, as zapfino can have many preceding spaces
n = n -1
else
match = false break
@@ -1661,16 +1658,16 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
end
end
end
+ -- after
if match and s > l then
- -- after
- local current = last.next
+ local current = last and last.next
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
- if id == glyph then
+ if id == glyph_code then
if current.subtype<256 and current.font == currentfont then -- normal char
local char = current.char
local ccd = descriptions[char]
@@ -1692,7 +1689,7 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
else
match = false break
end
- elseif id == disc then
+ elseif id == disc_code then
-- skip 'm
elseif seq[n][32] then -- brrr
n = n + 1
@@ -1723,9 +1720,11 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
local rule, lookuptype, f, l = ck[1], ck[2], ck[4], ck[5]
local char = start.char
if ck[9] then
- logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %s (%s=>%s)",cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype,ck[9],ck[10])
+ logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %s (%s=>%s)",
+ cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype,ck[9],ck[10])
else
- logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %s",cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype)
+ logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %s",
+ cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype)
end
end
local chainlookups = ck[6]
@@ -1737,59 +1736,35 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
local chainlookup = lookuptable[chainlookupname]
local cp = chainprocs[chainlookup.type]
if cp then
- start, done = cp(start,last,kind,chainname,ck,cache,chainlookup,chainlookupname,nil,sequence)
+ start, done = cp(start,last,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,nil,sequence)
else
logprocess("%s: %s is not yet supported",cref(kind,chainname,chainlookupname),chainlookup.type)
end
else
- -- actually this needs a more complex treatment for which we will use chainmores
---~ local i = 1
---~ repeat
---~ local chainlookupname = chainlookups[i]
---~ local chainlookup = lookuptable[chainlookupname]
---~ local cp = chainmores[chainlookup.type]
---~ if cp then
---~ local ok, n
---~ start, ok, n = cp(start,last,kind,chainname,ck,cache,chainlookup,chainlookupname,i,sequence)
---~ -- messy since last can be changed !
---~ if ok then
---~ done = true
---~ start = start.next
---~ if n then
---~ -- skip next one(s) if ligature
---~ i = i + n - 1
---~ end
---~ end
---~ else
---~ logprocess("%s: multiple subchains for %s are not yet supported",cref(kind,chainname,chainlookupname),chainlookup.type)
---~ end
---~ i = i + 1
---~ until i > nofchainlookups
-
local i = 1
repeat
-if skipped then
- while true do
- local char = start.char
- 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
- else
- break
- end
- else
- break
- end
- end
-end
+ if skipped then
+ while true do
+ local char = start.char
+ 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
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ end
local chainlookupname = chainlookups[i]
local chainlookup = lookuptable[chainlookupname]
local cp = chainmores[chainlookup.type]
if cp then
local ok, n
- start, ok, n = cp(start,last,kind,chainname,ck,cache,chainlookup,chainlookupname,i,sequence)
+ start, ok, n = cp(start,last,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,i,sequence)
-- messy since last can be changed !
if ok then
done = true
@@ -1804,12 +1779,11 @@ end
end
start = start.next
until i > nofchainlookups
-
end
else
local replacements = ck[7]
if replacements then
- start, done = chainprocs.reversesub(start,last,kind,chainname,ck,cache,replacements) -- sequence
+ start, done = chainprocs.reversesub(start,last,kind,chainname,ck,lookuphash,replacements) -- sequence
else
done = true -- can be meant to be skipped
if trace_contexts then
@@ -1864,18 +1838,17 @@ local function logprocess(...)
if trace_steps then
registermessage(...)
end
- logs.report("otf process",...)
-end
-local function logwarning(...)
- logs.report("otf process",...)
+ report_process(...)
end
+local logwarning = report_process
+
local function report_missing_cache(typ,lookup)
local f = missing[currentfont] if not f then f = { } missing[currentfont] = f end
local t = f[typ] if not t then t = { } f[typ] = t end
if not t[lookup] then
t[lookup] = true
- logwarning("missing cache for lookup %s of type %s in font %s (%s)",lookup,typ,currentfont,tfmdata.fullname)
+ logwarning("missing cache for lookup %s of type %s in font %s (%s)",lookup,typ,currentfont,tfmdata.properties.fullname)
end
end
@@ -1883,135 +1856,144 @@ local resolved = { } -- we only resolve a font,script,language pair once
-- todo: pass all these 'locals' in a table
-function fonts.methods.node.otf.features(head,font,attr)
- if trace_steps then
- checkstep(head)
+local lookuphashes = { }
+
+setmetatableindex(lookuphashes, function(t,font)
+ local lookuphash = fontdata[font].resources.lookuphash
+ if not lookuphash or not next(lookuphash) then
+ lookuphash = false
end
- tfmdata = fontdata[font]
- local shared = tfmdata.shared
- otfdata = shared.otfdata
- local luatex = otfdata.luatex
- descriptions = tfmdata.descriptions
- characters = tfmdata.characters
- indices = tfmdata.indices
- unicodes = tfmdata.unicodes
- marks = tfmdata.marks
- anchorlookups = luatex.lookup_to_anchor
- currentfont = font
- rlmode = 0
- local featuredata = otfdata.shared.featuredata -- can be made local to closure
- local sequences = luatex.sequences
- lookuptable = luatex.lookups
- local done = false
- local script, language, s_enabled, a_enabled, dyn
- local attribute_driven = attr and attr ~= 0
- if attribute_driven then
- local features = context_setups[context_numbers[attr]] -- could be a direct list
- dyn = context_merged[attr] or 0
- language, script = features.language or "dflt", features.script or "dflt"
- a_enabled = features -- shared.features -- can be made local to the resolver
- if dyn == 2 or dyn == -2 then
- -- font based
- s_enabled = shared.features
+ t[font] = lookuphash
+ return lookuphash
+end)
+
+-- fonts.hashes.lookups = lookuphashes
+
+local special_attributes = {
+ init = 1,
+ medi = 2,
+ fina = 3,
+ isol = 4
+}
+
+local function initialize(sequence,script,language,enabled)
+ local features = sequence.features
+ if features then
+ for kind, scripts in next, features do
+ local valid = enabled[kind]
+ if valid then
+ local languages = scripts[script] or scripts[wildcard]
+ if languages and (languages[language] or languages[wildcard]) then
+ return { valid, special_attributes[kind] or false, sequence.chain or 0, kind }
+ end
+ end
end
- else
- language, script = tfmdata.language or "dflt", tfmdata.script or "dflt"
- s_enabled = shared.features -- can be made local to the resolver
- dyn = 0
end
- -- we can save some runtime by caching feature tests
- local res = resolved[font] if not res then res = { } resolved[font] = res end
- local rs = res [script] if not rs then rs = { } res [script] = rs end
- local rl = rs [language] if not rl then rl = { } rs [language] = rl end
- local ra = rl [attr] if ra == nil then ra = { } rl [attr] = ra end -- attr can be false
- -- sequences always > 1 so no need for optimization
+ return false
+end
+
+function otf.dataset(ftfmdata,sequences,font) -- generic variant, overloaded in context
+ local shared = tfmdata.shared
+ local properties = tfmdata.properties
+ local language = properties.language or "dflt"
+ local script = properties.script or "dflt"
+ local enabled = shared.features
+ local res = resolved[font]
+ if not res then
+ res = { }
+ resolved[font] = res
+ end
+ local rs = res[script]
+ if not rs then
+ rs = { }
+ res[script] = rs
+ end
+ local rl = rs[language]
+ if not rl then
+ rl = { }
+ rs[language] = rl
+ setmetatableindex(rl, function(t,k)
+ local v = enabled and initialize(sequences[k],script,language,enabled)
+ t[k] = v
+ return v
+ end)
+ end
+ return rl
+end
+
+local function featuresprocessor(head,font,attr)
+
+ local lookuphash = lookuphashes[font] -- we can also check sequences here
+
+ if not lookuphash then
+ return head, false
+ end
+
+ if trace_steps then
+ checkstep(head)
+ end
+
+ tfmdata = fontdata[font]
+ descriptions = tfmdata.descriptions
+ characters = tfmdata.characters
+ resources = tfmdata.resources
+
+ marks = resources.marks
+ anchorlookups = resources.lookup_to_anchor
+ lookuptable = resources.lookups
+ lookuptypes = resources.lookuptypes
+
+ currentfont = font
+ rlmode = 0
+
+ local sequences = resources.sequences
+ local done = false
+ local datasets = otf.dataset(tfmdata,sequences,font,attr)
+
for s=1,#sequences do
- local pardir, txtdir = 0, { }
- local success = false
+ local pardir, txtdir, success = 0, { }, false -- we could reuse txtdir and use a top pointer
local sequence = sequences[s]
- local r = ra[s] -- cache
- if r == nil then
- --
- -- this bit will move to font-ctx and become a function
- ---
- local chain = sequence.chain or 0
- local features = sequence.features
- if not features then
- -- indirect lookup, part of chain (todo: make this a separate table)
- r = false -- { false, false, chain }
- else
- local valid, attribute, kind, what = false, false
- for k,v in next, features do
- -- we can quit earlier but for the moment we want the tracing
- local s_e = s_enabled and s_enabled[k]
- local a_e = a_enabled and a_enabled[k]
- if s_e or a_e then
- local l = v[script] or v[wildcard]
- if l then
- -- not l[language] or l[default] or l[wildcard] because we want tracing
- -- only first attribute match check, so we assume simple fina's
- -- default can become a font feature itself
- if l[language] then
- valid, what = s_e or a_e, language
- -- elseif l[default] then
- -- valid, what = true, default
- elseif l[wildcard] then
- valid, what = s_e or a_e, wildcard
- end
- if valid then
- kind, attribute = k, special_attributes[k] or false
- if a_e and dyn < 0 then
- valid = false
- end
- if trace_applied then
- local typ, action = match(sequence.type,"(.*)_(.*)")
- logs.report("otf node mode",
- "%s font: %03i, dynamic: %03i, kind: %s, lookup: %3i, script: %-4s, language: %-4s (%-4s), type: %s, action: %s, name: %s",
- (valid and "+") or "-",font,attr or 0,kind,s,script,language,what,typ,action,sequence.name)
- end
- break
- end
- end
- end
- end
- if valid then
- r = { valid, attribute, chain, kind }
- else
- r = false -- { valid, attribute, chain, "generic" } -- false anyway, could be flag instead of table
- end
- end
- ra[s] = r
- end
- featurevalue = r and r[1] -- todo: pass to function instead of using a global
+ local dataset = datasets[s] -- cache
+ featurevalue = dataset and dataset[1] -- todo: pass to function instead of using a global
if featurevalue then
- local attribute, chain, typ, subtables = r[2], r[3], sequence.type, sequence.subtables
+ local attribute, chain, typ, subtables = dataset[2], dataset[3], sequence.type, sequence.subtables
+--~ print(typ)
+--~ table.print(table.keys(sequence))
if chain < 0 then
-- this is a limited case, no special treatments like 'init' etc
local handler = handlers[typ]
- local thecache = featuredata[typ] or { }
-- we need to get rid of this slide !
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
- if id == glyph then
- if start.subtype<256 and start.font == font and (not attr or has_attribute(start,0,attr)) then
---~ if start.subtype<256 and start.font == font and has_attribute(start,0,attr) then
- for i=1,#subtables do
- local lookupname = subtables[i]
- local lookupcache = thecache[lookupname]
- if lookupcache then
- local lookupmatch = lookupcache[start.char]
- if lookupmatch then
- start, success = handler(start,r[4],lookupname,lookupmatch,sequence,featuredata,i)
- if success then
- break
+ if id == glyph_code then
+ if start.subtype<256 and start.font == font then
+ local a = has_attribute(start,0)
+ if a then
+ a = a == attr
+ else
+ a = true
+ end
+ if a then
+ for i=1,#subtables do
+ local lookupname = subtables[i]
+ local lookupcache = lookuphash[lookupname]
+ if lookupcache then
+ local lookupmatch = lookupcache[start.char]
+ if lookupmatch then
+ start, success = handler(start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
+ if success then
+ break
+ end
end
+ else
+ report_missing_cache(typ,lookupname)
end
- else
- report_missing_cache(typ,lookupname)
end
+ if start then start = start.prev end
+ else
+ start = start.prev
end
- if start then start = start.prev end
else
start = start.prev
end
@@ -2022,34 +2004,42 @@ function fonts.methods.node.otf.features(head,font,attr)
else
local handler = handlers[typ]
local ns = #subtables
- local thecache = featuredata[typ] or { }
local start = head -- local ?
rlmode = 0 -- to be checked ?
if ns == 1 then
local lookupname = subtables[1]
- local lookupcache = thecache[lookupname]
+ local lookupcache = lookuphash[lookupname]
if not lookupcache then
report_missing_cache(typ,lookupname)
else
while start do
local id = start.id
- if id == glyph then
---~ if start.font == font and start.subtype<256 and has_attribute(start,0,attr) and (not attribute or has_attribute(start,state,attribute)) then
- if start.font == font and start.subtype<256 and (not attr or has_attribute(start,0,attr)) and (not attribute or has_attribute(start,state,attribute)) then
- local lookupmatch = lookupcache[start.char]
- if lookupmatch then
- -- sequence kan weg
- local ok
- start, ok = handler(start,r[4],lookupname,lookupmatch,sequence,featuredata,1)
- if ok then
- success = true
+ if id == glyph_code then
+ if start.subtype<256 and start.font == font then
+ local a = has_attribute(start,0)
+ if a then
+ a = (a == attr) and (not attribute or has_attribute(start,state,attribute))
+ else
+ a = not attribute or has_attribute(start,state,attribute)
+ end
+ if a then
+ local lookupmatch = lookupcache[start.char]
+ if lookupmatch then
+ -- sequence kan weg
+ local ok
+ start, ok = handler(start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1)
+ if ok then
+ success = true
+ end
end
+ if start then start = start.next end
+ else
+ start = start.next
end
- if start then start = start.next end
else
start = start.next
end
- -- elseif id == glue then
+ -- elseif id == glue_code then
-- if p[5] then -- chain
-- local pc = pp[32]
-- if pc then
@@ -2064,9 +2054,9 @@ function fonts.methods.node.otf.features(head,font,attr)
-- else
-- start = start.next
-- end
- elseif id == whatsit then
+ elseif id == whatsit_code then
local subtype = start.subtype
- if subtype == 7 then
+ if subtype == dir_code then
local dir = start.dir
if dir == "+TRT" or dir == "+TLT" then
insert(txtdir,dir)
@@ -2082,9 +2072,9 @@ function fonts.methods.node.otf.features(head,font,attr)
rlmode = pardir
end
if trace_directions then
- logs.report("fonts","directions after textdir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ report_process("directions after textdir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
end
- elseif subtype == 6 then
+ elseif subtype == localpar_code then
local dir = start.dir
if dir == "TRT" then
pardir = -1
@@ -2096,7 +2086,7 @@ function fonts.methods.node.otf.features(head,font,attr)
rlmode = pardir
--~ txtdir = { }
if trace_directions then
- logs.report("fonts","directions after pardir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ report_process("directions after pardir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
end
end
start = start.next
@@ -2108,32 +2098,41 @@ function fonts.methods.node.otf.features(head,font,attr)
else
while start do
local id = start.id
- if id == glyph then
- if start.subtype<256 and start.font == font and (not attr or has_attribute(start,0,attr)) and (not attribute or has_attribute(start,state,attribute)) then
---~ if start.subtype<256 and start.font == font and has_attribute(start,0,attr) and (not attribute or has_attribute(start,state,attribute)) then
- for i=1,ns do
- local lookupname = subtables[i]
- local lookupcache = thecache[lookupname]
- if lookupcache then
- local lookupmatch = lookupcache[start.char]
- if lookupmatch then
- -- we could move all code inline but that makes things even more unreadable
- local ok
- start, ok = handler(start,r[4],lookupname,lookupmatch,sequence,featuredata,i)
- if ok then
- success = true
- break
+ if id == glyph_code then
+ if start.subtype<256 and start.font == font then
+ local a = has_attribute(start,0)
+ if a then
+ a = (a == attr) and (not attribute or has_attribute(start,state,attribute))
+ else
+ a = not attribute or has_attribute(start,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]
+ if lookupmatch then
+ -- we could move all code inline but that makes things even more unreadable
+ local ok
+ start, ok = handler(start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
+ if ok then
+ success = true
+ break
+ end
end
+ else
+ report_missing_cache(typ,lookupname)
end
- else
- report_missing_cache(typ,lookupname)
end
+ if start then start = start.next end
+ else
+ start = start.next
end
- if start then start = start.next end
else
start = start.next
end
- -- elseif id == glue then
+ -- elseif id == glue_code then
-- if p[5] then -- chain
-- local pc = pp[32]
-- if pc then
@@ -2148,10 +2147,9 @@ function fonts.methods.node.otf.features(head,font,attr)
-- else
-- start = start.next
-- end
- elseif id == whatsit then
+ elseif id == whatsit_code then
local subtype = start.subtype
- local subtype = start.subtype
- if subtype == 7 then
+ if subtype == dir_code then
local dir = start.dir
if dir == "+TRT" or dir == "+TLT" then
insert(txtdir,dir)
@@ -2167,9 +2165,9 @@ function fonts.methods.node.otf.features(head,font,attr)
rlmode = pardir
end
if trace_directions then
- logs.report("fonts","directions after textdir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ report_process("directions after textdir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
end
- elseif subtype == 6 then
+ elseif subtype == localpar_code then
local dir = start.dir
if dir == "TRT" then
pardir = -1
@@ -2181,7 +2179,7 @@ function fonts.methods.node.otf.features(head,font,attr)
rlmode = pardir
--~ txtdir = { }
if trace_directions then
- logs.report("fonts","directions after pardir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ report_process("directions after pardir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
end
end
start = start.next
@@ -2202,459 +2200,422 @@ function fonts.methods.node.otf.features(head,font,attr)
return head, done
end
-otf.features.prepare = { }
-
--- we used to share code in the following functions but that costs a lot of
--- memory due to extensive calls to functions (easily hundreds of thousands per
--- document)
-
-local function split(replacement,original,cache,unicodes)
- -- we can cache this too, but not the same (although unicode is a unique enough hash)
- local o, t, n = { }, { }, 0
- for s in gmatch(original,"[^ ]+") do
- local us = unicodes[s]
- if type(us) == "number" then -- tonumber(us)
- o[#o+1] = us
- else
- o[#o+1] = us[1]
- end
- end
- for s in gmatch(replacement,"[^ ]+") do
- n = n + 1
- local us = unicodes[s]
- if type(us) == "number" then -- tonumber(us)
- t[o[n]] = us
- else
- t[o[n]] = us[1]
- end
+local function generic(lookupdata,lookupname,unicode,lookuphash)
+ local target = lookuphash[lookupname]
+ if target then
+ target[unicode] = lookupdata
+ else
+ lookuphash[lookupname] = { [unicode] = lookupdata }
end
- return t
end
-local function uncover(covers,result,cache,unicodes)
- -- lpeg hardly faster (.005 sec on mk)
- for n=1,#covers do
- local c = covers[n]
- local cc = cache[c]
- if not cc then
- local t = { }
- for s in gmatch(c,"[^ ]+") do
- local us = unicodes[s]
- if type(us) == "number" then
- t[us] = true
- else
- for i=1,#us do
- t[us[i]] = true
- end
- end
+local action = {
+
+ substitution = generic,
+ multiple = generic,
+ alternate = generic,
+ position = generic,
+
+ ligature = function(lookupdata,lookupname,unicode,lookuphash)
+ local target = lookuphash[lookupname]
+ if not target then
+ target = { }
+ lookuphash[lookupname] = target
+ end
+ for i=1,#lookupdata do
+ local li = lookupdata[i]
+ local tu = target[li]
+ if not tu then
+ tu = { }
+ target[li] = tu
end
- cache[c] = t
- result[#result+1] = t
+ target = tu
+ end
+ target.ligature = unicode
+ end,
+
+ pair = function(lookupdata,lookupname,unicode,lookuphash)
+ local target = lookuphash[lookupname]
+ if not target then
+ target = { }
+ lookuphash[lookupname] = target
+ end
+ local others = target[unicode]
+ local paired = lookupdata[1]
+ if others then
+ others[paired] = lookupdata
else
- result[#result+1] = cc
+ others = { [paired] = lookupdata }
+ target[unicode] = others
end
- end
-end
+ end,
+
+}
local function prepare_lookups(tfmdata)
- local otfdata = tfmdata.shared.otfdata
- local featuredata = otfdata.shared.featuredata
- local anchor_to_lookup = otfdata.luatex.anchor_to_lookup
- local lookup_to_anchor = otfdata.luatex.lookup_to_anchor
- --
- local multiple = featuredata.gsub_multiple
- local alternate = featuredata.gsub_alternate
- local single = featuredata.gsub_single
- local ligature = featuredata.gsub_ligature
- local pair = featuredata.gpos_pair
- local position = featuredata.gpos_single
- local kerns = featuredata.gpos_pair
- local mark = featuredata.gpos_mark2mark
- local cursive = featuredata.gpos_cursive
- --
- local unicodes = tfmdata.unicodes -- names to unicodes
- local indices = tfmdata.indices
- local descriptions = tfmdata.descriptions
- --
- -- we can change the otf table after loading but then we need to adapt base mode
- -- as well (no big deal)
- --
- local action = {
- substitution = function(p,lookup,k,glyph,unicode)
- local old, new = unicode, unicodes[p[2]]
- if type(new) == "table" then
- new = new[1]
- end
- local s = single[lookup]
- if not s then s = { } single[lookup] = s end
- s[old] = new
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: substitution %s => %s",lookup,old,new)
- --~ end
- end,
- multiple = function (p,lookup,k,glyph,unicode)
- local old, new = unicode, { }
- local m = multiple[lookup]
- if not m then m = { } multiple[lookup] = m end
- m[old] = new
- for pc in gmatch(p[2],"[^ ]+") do
- local upc = unicodes[pc]
- if type(upc) == "number" then
- new[#new+1] = upc
- else
- new[#new+1] = upc[1]
- end
- end
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: multiple %s => %s",lookup,old,concat(new," "))
- --~ end
- end,
- alternate = function(p,lookup,k,glyph,unicode)
- local old, new = unicode, { }
- local a = alternate[lookup]
- if not a then a = { } alternate[lookup] = a end
- a[old] = new
- for pc in gmatch(p[2],"[^ ]+") do
- local upc = unicodes[pc]
- if type(upc) == "number" then
- new[#new+1] = upc
- else
- new[#new+1] = upc[1]
- end
- end
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: alternate %s => %s",lookup,old,concat(new,"|"))
- --~ end
- end,
- ligature = function (p,lookup,k,glyph,unicode)
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: ligature %s => %s",lookup,p[2],glyph.name)
- --~ end
- local first = true
- local t = ligature[lookup]
- if not t then t = { } ligature[lookup] = t end
- for s in gmatch(p[2],"[^ ]+") do
- if first then
- local u = unicodes[s]
- if not u then
- logs.report("define otf","lookup %s: ligature %s => %s ignored due to invalid unicode",lookup,p[2],glyph.name)
- break
- elseif type(u) == "number" then
- if not t[u] then
- t[u] = { { } }
- end
- t = t[u]
- else
- local tt = t
- local tu
- for i=1,#u do
- local u = u[i]
- if i==1 then
- if not t[u] then
- t[u] = { { } }
- end
- tu = t[u]
- t = tu
- else
- if not t[u] then
- tt[u] = tu
- end
- end
- end
- end
- first = false
- else
- s = unicodes[s]
- local t1 = t[1]
- if not t1[s] then
- t1[s] = { { } }
- end
- t = t1[s]
- end
- end
- t[2] = unicode
- end,
- position = function(p,lookup,k,glyph,unicode)
- -- not used
- local s = position[lookup]
- if not s then s = { } position[lookup] = s end
- s[unicode] = p[2] -- direct pointer to kern spec
- end,
- pair = function(p,lookup,k,glyph,unicode)
- local s = pair[lookup]
- if not s then s = { } pair[lookup] = s end
- local others = s[unicode]
- if not others then others = { } s[unicode] = others end
- -- todo: fast check for space
- local two = p[2]
- local upc = unicodes[two]
- if not upc then
- for pc in gmatch(two,"[^ ]+") do
- local upc = unicodes[pc]
- if type(upc) == "number" then
- others[upc] = p -- direct pointer to main table
- else
- for i=1,#upc do
- others[upc[i]] = p -- direct pointer to main table
- end
- end
- end
- elseif type(upc) == "number" then
- others[upc] = p -- direct pointer to main table
- else
- for i=1,#upc do
- others[upc[i]] = p -- direct pointer to main table
- end
- end
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: pair for U+%04X",lookup,unicode)
- --~ end
- end,
- }
- --
- for unicode, glyph in next, descriptions do
- local lookups = glyph.slookups
+
+ local rawdata = tfmdata.shared.rawdata
+ local resources = rawdata.resources
+ local lookuphash = resources.lookuphash
+ local anchor_to_lookup = resources.anchor_to_lookup
+ local lookup_to_anchor = resources.lookup_to_anchor
+ local lookuptypes = resources.lookuptypes
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+
+ -- we cannot free the entries in the descriptions as sometimes we access
+ -- then directly (for instance anchors) ... selectively freeing does save
+ -- much memory as it's only a reference to a table and the slot in the
+ -- description hash is not freed anyway
+
+ for unicode, character in next, characters do -- we cannot loop over descriptions !
+
+ local description = descriptions[unicode]
+
+ local lookups = description.slookups
if lookups then
- for lookup, p in next, lookups do
- action[p[1]](p,lookup,k,glyph,unicode)
+ for lookupname, lookupdata in next, lookups do
+ action[lookuptypes[lookupname]](lookupdata,lookupname,unicode,lookuphash)
end
end
- local lookups = glyph.mlookups
+
+ local lookups = description.mlookups
if lookups then
- for lookup, whatever in next, lookups do
- for i=1,#whatever do -- normaly one
- local p = whatever[i]
- action[p[1]](p,lookup,k,glyph,unicode)
+ for lookupname, lookuplist in next, lookups do
+ local lookuptype = lookuptypes[lookupname]
+ for l=1,#lookuplist do
+ local lookupdata = lookuplist[l]
+ action[lookuptype](lookupdata,lookupname,unicode,lookuphash)
end
end
end
- local list = glyph.mykerns
+
+ local list = description.kerns
if list then
- for lookup, krn in next, list do
- local k = kerns[lookup]
- if not k then k = { } kerns[lookup] = k end
- k[unicode] = krn -- ref to glyph, saves lookup
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: kern for U+%04X",lookup,unicode)
- --~ end
+ for lookup, krn in next, list do -- ref to glyph, saves lookup
+ local target = lookuphash[lookup]
+ if target then
+ target[unicode] = krn
+ else
+ lookuphash[lookup] = { [unicode] = krn }
+ end
end
end
- local oanchor = glyph.anchors
- if oanchor then
- for typ, anchors in next, oanchor do -- types
- if typ == "mark" then
- for name, anchor in next, anchors do
- local lookups = anchor_to_lookup[name]
- if lookups then
- for lookup, _ in next, lookups do
- local f = mark[lookup]
- if not f then f = { } mark[lookup] = f end
- f[unicode] = anchors -- ref to glyph, saves lookup
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: mark anchor %s for U+%04X",lookup,name,unicode)
- --~ end
- end
- end
- end
- elseif typ == "cexit" then -- or entry?
+
+ local list = description.anchors
+ if list then
+ for typ, anchors in next, list do -- types
+ if typ == "mark" or typ == "cexit" then -- or entry?
for name, anchor in next, anchors do
local lookups = anchor_to_lookup[name]
if lookups then
for lookup, _ in next, lookups do
- local f = cursive[lookup]
- if not f then f = { } cursive[lookup] = f end
- f[unicode] = anchors -- ref to glyph, saves lookup
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: exit anchor %s for U+%04X",lookup,name,unicode)
- --~ end
+ local target = lookuphash[lookup]
+ if target then
+ target[unicode] = anchors
+ else
+ lookuphash[lookup] = { [unicode] = anchors }
+ end
end
end
end
end
end
end
+
+ end
+
+end
+
+local function split(replacement,original)
+ local result = { }
+ for i=1,#replacement do
+ result[original[i]] = replacement[i]
end
+ return result
end
--- local cache = { }
-luatex = luatex or {} -- this has to change ... we need a better one
+-- not shared as we hook into lookups now
+
+--~ local function uncover_1(covers,result) -- multiple covers
+--~ local nofresults = #result
+--~ for n=1,#covers do
+--~ nofresults = nofresults + 1
+--~ local u = { }
+--~ local c = covers[n]
+--~ for i=1,#c do
+--~ u[c[i]] = true
+--~ end
+--~ result[nofresults] = u
+--~ end
+--~ end
+
+--~ local function uncover_2(covers,result) -- single covers (turned into multiple with n=1)
+--~ local nofresults = #result
+--~ for n=1,#covers do
+--~ nofresults = nofresults + 1
+--~ result[nofresults] = { [covers[n]] = true }
+--~ end
+--~ end
+
+--~ local function uncover_1(covers,result) -- multiple covers
+--~ local nofresults = #result
+--~ for n=1,#covers do
+--~ nofresults = nofresults + 1
+--~ result[nofresults] = covers[n]
+--~ end
+--~ end
+
+--~ local function prepare_contextchains(tfmdata)
+--~ local rawdata = tfmdata.shared.rawdata
+--~ local resources = rawdata.resources
+--~ local lookuphash = resources.lookuphash
+--~ local lookups = rawdata.lookups
+--~ if lookups then
+--~ for lookupname, lookupdata in next, rawdata.lookups do
+--~ local lookuptype = lookupdata.type
+--~ if not lookuptype then
+--~ report_prepare("missing lookuptype for %s",lookupname)
+--~ else -- => lookuphash[lookupname][unicode]
+--~ local rules = lookupdata.rules
+--~ if rules then
+--~ local fmt = lookupdata.format
+--~ -- if fmt == "coverage" then
+--~ if fmt == "coverage" or fmt == "glyphs" then
+--~ if lookuptype ~= "chainsub" and lookuptype ~= "chainpos" then
+--~ -- todo: dejavu-serif has one (but i need to see what use it has)
+--~ report_prepare("unsupported coverage %s for %s",lookuptype,lookupname)
+--~ else
+--~ local contexts = lookuphash[lookupname]
+--~ if not contexts then
+--~ contexts = { }
+--~ lookuphash[lookupname] = contexts
+--~ end
+--~ local t, nt = { }, 0
+--~ for nofrules=1,#rules do -- does #rules>1 happen often?
+--~ local rule = rules[nofrules]
+--~ local current = rule.current
+--~ local before = rule.before
+--~ local after = rule.after
+--~ local sequence = { }
+--~ if before then
+--~ uncover_1(before,sequence)
+--~ end
+--~ local start = #sequence + 1
+--~ uncover_1(current,sequence)
+--~ local stop = #sequence
+--~ if after then
+--~ uncover_1(after,sequence)
+--~ end
+--~ if sequence[1] then
+--~ nt = nt + 1
+--~ t[nt] = { nofrules, lookuptype, sequence, start, stop, rule.lookups }
+--~ for unic, _ in next, sequence[start] do
+--~ local cu = contexts[unic]
+--~ if not cu then
+--~ contexts[unic] = t
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ elseif fmt == "reversecoverage" then -- we could combine both branches (only dufference is replacements)
+--~ if lookuptype ~= "reversesub" then
+--~ report_prepare("unsupported reverse coverage %s for %s",lookuptype,lookupname)
+--~ else
+--~ local contexts = lookuphash[lookupname]
+--~ if not contexts then
+--~ contexts = { }
+--~ lookuphash[lookupname] = contexts
+--~ end
+--~ local t, nt = { }, 0
+--~ for nofrules=1,#rules do
+--~ local rule = rules[nofrules]
+--~ local current = rule.current
+--~ local before = rule.before
+--~ local after = rule.after
+--~ local replacements = rule.replacements
+--~ local sequence = { }
+--~ if before then
+--~ uncover_1(before,sequence)
+--~ end
+--~ local start = #sequence + 1
+--~ uncover_1(current,sequence)
+--~ local stop = #sequence
+--~ if after then
+--~ uncover_1(after,sequence)
+--~ end
+--~ if sequence[1] then
+--~ nt = nt + 1
+--~ t[nt] = { nofrules, lookuptype, sequence, start, stop, rule.lookups, replacements }
+--~ for unic, _ in next, sequence[start] do
+--~ local cu = contexts[unic]
+--~ if not cu then
+--~ contexts[unic] = t
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ -- elseif fmt == "glyphs" then --maybe just make then before = { fore } and share with coverage
+--~ -- if lookuptype ~= "chainsub" and lookuptype ~= "chainpos" then
+--~ -- report_prepare("unsupported coverage %s for %s",lookuptype,lookupname)
+--~ -- else
+--~ -- local contexts = lookuphash[lookupname]
+--~ -- if not contexts then
+--~ -- contexts = { }
+--~ -- lookuphash[lookupname] = contexts
+--~ -- end
+--~ -- local t, nt = { }, 0
+--~ -- for nofrules=1,#rules do -- we can make glyphs a special case (less tables)
+--~ -- local rule = rules[nofrules]
+--~ -- local current = rule.names
+--~ -- local before = rule.fore
+--~ -- local after = rule.back
+--~ -- local sequence = { }
+--~ -- if before then
+--~ -- uncover_1(before,sequence)
+--~ -- end
+--~ -- local start = #sequence + 1
+--~ -- uncover_1(current,sequence)
+--~ -- local stop = #sequence
+--~ -- if after then
+--~ -- uncover_1(after,sequence)
+--~ -- end
+--~ -- if sequence then
+--~ -- nt = nt + 1
+--~ -- t[nt] = { nofrules, lookuptype, sequence, start, stop, rule.lookups }
+--~ -- for unic, _ in next, sequence[start] do
+--~ -- local cu = contexts[unic]
+--~ -- if not cu then
+--~ -- contexts[unic] = t
+--~ -- end
+--~ -- end
+--~ -- end
+--~ -- end
+--~ -- end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+
+local valid = {
+ coverage = { chainsub = true, chainpos = true },
+ reversecoverage = { reversesub = true },
+ glyphs = { chainsub = true, chainpos = true },
+}
-function prepare_contextchains(tfmdata)
- local otfdata = tfmdata.shared.otfdata
- local lookups = otfdata.lookups
+local function prepare_contextchains(tfmdata)
+ local rawdata = tfmdata.shared.rawdata
+ local resources = rawdata.resources
+ local lookuphash = resources.lookuphash
+ local lookups = rawdata.lookups
if lookups then
- local featuredata = otfdata.shared.featuredata
- local contextchain = featuredata.gsub_contextchain -- shared with gpos
- local reversecontextchain = featuredata.gsub_reversecontextchain -- shared with gpos
- local characters = tfmdata.characters
- local unicodes = tfmdata.unicodes
- local indices = tfmdata.indices
- local cache = luatex.covers
- if not cache then
- cache = { }
- luatex.covers = cache
- end
- --
- for lookupname, lookupdata in next, otfdata.lookups do
+ for lookupname, lookupdata in next, rawdata.lookups do
local lookuptype = lookupdata.type
- if not lookuptype then
- logs.report("otf process","missing lookuptype for %s",lookupname)
- else
+ if lookuptype then
local rules = lookupdata.rules
if rules then
- local fmt = lookupdata.format
- -- contextchain[lookupname][unicode]
- if fmt == "coverage" then
- if lookuptype ~= "chainsub" and lookuptype ~= "chainpos" then
- logs.report("otf process","unsupported coverage %s for %s",lookuptype,lookupname)
- else
- local contexts = contextchain[lookupname]
- if not contexts then
- contexts = { }
- contextchain[lookupname] = contexts
- end
- local t = { }
- for nofrules=1,#rules do -- does #rules>1 happen often?
- local rule = rules[nofrules]
- local coverage = rule.coverage
- if coverage and coverage.current then
- local current, before, after, sequence = coverage.current, coverage.before, coverage.after, { }
- if before then
- uncover(before,sequence,cache,unicodes)
- end
- local start = #sequence + 1
- uncover(current,sequence,cache,unicodes)
- local stop = #sequence
- if after then
- uncover(after,sequence,cache,unicodes)
- end
- if sequence[1] then
- t[#t+1] = { nofrules, lookuptype, sequence, start, stop, rule.lookups }
- for unic, _ in next, sequence[start] do
- local cu = contexts[unic]
- if not cu then
- contexts[unic] = t
- end
- end
- end
+ local format = lookupdata.format
+ local validformat = valid[format]
+ if not validformat then
+ report_prepare("unsupported format %s",format)
+ elseif not validformat[lookuptype] then
+ -- todo: dejavu-serif has one (but i need to see what use it has)
+ report_prepare("unsupported %s %s for %s",format,lookuptype,lookupname)
+ else
+ local contexts = lookuphash[lookupname]
+ if not contexts then
+ contexts = { }
+ lookuphash[lookupname] = contexts
+ end
+ local t, nt = { }, 0
+ for nofrules=1,#rules do
+ local rule = rules[nofrules]
+ local current = rule.current
+ local before = rule.before
+ local after = rule.after
+ local replacements = rule.replacements
+ local sequence = { }
+ local nofsequences = 0
+ -- Wventually we can store start, stop and sequence in the cached file
+ -- but then less sharing takes place so best not do that without a lot
+ -- of profiling so let's forget about it.
+ if before then
+ for n=1,#before do
+ nofsequences = nofsequences + 1
+ sequence[nofsequences] = before[n]
end
end
- end
- elseif fmt == "reversecoverage" then
- if lookuptype ~= "reversesub" then
- logs.report("otf process","unsupported reverse coverage %s for %s",lookuptype,lookupname)
- else
- local contexts = reversecontextchain[lookupname]
- if not contexts then
- contexts = { }
- reversecontextchain[lookupname] = contexts
+ local start = nofsequences + 1
+ for n=1,#current do
+ nofsequences = nofsequences + 1
+ sequence[nofsequences] = current[n]
end
- local t = { }
- for nofrules=1,#rules do
- local rule = rules[nofrules]
- local reversecoverage = rule.reversecoverage
- if reversecoverage and reversecoverage.current then
- local current, before, after, replacements, sequence = reversecoverage.current, reversecoverage.before, reversecoverage.after, reversecoverage.replacements, { }
- if before then
- uncover(before,sequence,cache,unicodes)
- end
- local start = #sequence + 1
- uncover(current,sequence,cache,unicodes)
- local stop = #sequence
- if after then
- uncover(after,sequence,cache,unicodes)
- end
- if replacements then
- replacements = split(replacements,current[1],cache,unicodes)
- end
- if sequence[1] then
- -- this is different from normal coverage, we assume only replacements
- t[#t+1] = { nofrules, lookuptype, sequence, start, stop, rule.lookups, replacements }
- for unic, _ in next, sequence[start] do
- local cu = contexts[unic]
- if not cu then
- contexts[unic] = t
- end
- end
- end
+ local stop = nofsequences
+ if after then
+ for n=1,#after do
+ nofsequences = nofsequences + 1
+ sequence[nofsequences] = after[n]
end
end
- end
- elseif fmt == "glyphs" then
- if lookuptype ~= "chainsub" and lookuptype ~= "chainpos" then
- logs.report("otf process","unsupported coverage %s for %s",lookuptype,lookupname)
- else
- local contexts = contextchain[lookupname]
- if not contexts then
- contexts = { }
- contextchain[lookupname] = contexts
- end
- local t = { }
- for nofrules=1,#rules do
- -- nearly the same as coverage so we could as well rename it
- local rule = rules[nofrules]
- local glyphs = rule.glyphs
- if glyphs and glyphs.names then
- local fore, back, names, sequence = glyphs.fore, glyphs.back, glyphs.names, { }
- if fore and fore ~= "" then
- fore = lpegmatch(split_at_space,fore)
- uncover(fore,sequence,cache,unicodes)
- end
- local start = #sequence + 1
- names = lpegmatch(split_at_space,names)
- uncover(names,sequence,cache,unicodes)
- local stop = #sequence
- if back and back ~= "" then
- back = lpegmatch(split_at_space,back)
- uncover(back,sequence,cache,unicodes)
- end
- if sequence[1] then
- t[#t+1] = { nofrules, lookuptype, sequence, start, stop, rule.lookups }
- for unic, _ in next, sequence[start] do
- local cu = contexts[unic]
- if not cu then
- contexts[unic] = t
- end
- end
+ if sequence[1] then
+ -- Replacements only happen with reverse lookups as they are single only. We
+ -- could pack them into current (replacement value instead of true) and then
+ -- use sequence[start] instead but it's somewhat ugly.
+ nt = nt + 1
+ t[nt] = { nofrules, lookuptype, sequence, start, stop, rule.lookups, replacements }
+ for unic, _ in next, sequence[start] do
+ local cu = contexts[unic]
+ if not cu then
+ contexts[unic] = t
end
end
end
end
end
+ else
+ -- no rules
end
+ else
+ report_prepare("missing lookuptype for %s",lookupname)
end
end
end
end
-function fonts.initializers.node.otf.features(tfmdata,value)
+-- we can consider lookuphash == false (initialized but empty) vs lookuphash == table
+
+local function featuresinitializer(tfmdata,value)
if true then -- value then
- if not tfmdata.shared.otfdata.shared.initialized then
- local t = trace_preparing and os.clock()
- local otfdata = tfmdata.shared.otfdata
- local featuredata = otfdata.shared.featuredata
- -- caches
- featuredata.gsub_multiple = { }
- featuredata.gsub_alternate = { }
- featuredata.gsub_single = { }
- featuredata.gsub_ligature = { }
- featuredata.gsub_contextchain = { }
- featuredata.gsub_reversecontextchain = { }
- featuredata.gpos_pair = { }
- featuredata.gpos_single = { }
- featuredata.gpos_mark2base = { }
- featuredata.gpos_mark2ligature = featuredata.gpos_mark2base
- featuredata.gpos_mark2mark = featuredata.gpos_mark2base
- featuredata.gpos_cursive = { }
- featuredata.gpos_contextchain = featuredata.gsub_contextchain
- featuredata.gpos_reversecontextchain = featuredata.gsub_reversecontextchain
- --
+ -- beware we need to use the topmost properties table
+ local rawdata = tfmdata.shared.rawdata
+ local properties = rawdata.properties
+ if not properties.initialized then
+ local starttime = trace_preparing and os.clock()
+ local resources = rawdata.resources
+ resources.lookuphash = resources.lookuphash or { }
prepare_contextchains(tfmdata)
prepare_lookups(tfmdata)
- otfdata.shared.initialized = true
+ properties.initialized = true
if trace_preparing then
- logs.report("otf process","preparation time is %0.3f seconds for %s",os.clock()-t,tfmdata.fullname or "?")
+ report_prepare("preparation time is %0.3f seconds for %s",os.clock()-starttime,tfmdata.properties.fullname or "?")
end
end
end
end
+
+registerotffeature {
+ name = "features",
+ description = "features",
+ default = true,
+ initializers = {
+ position = 1,
+ node = featuresinitializer,
+ },
+ processors = {
+ node = featuresprocessor,
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/font-otp.lua b/Master/texmf-dist/tex/context/base/font-otp.lua
index a80c515ad6e..f019ade7f48 100644
--- a/Master/texmf-dist/tex/context/base/font-otp.lua
+++ b/Master/texmf-dist/tex/context/base/font-otp.lua
@@ -8,41 +8,57 @@ if not modules then modules = { } end modules ['font-otp'] = {
-- todo: pack math (but not that much to share)
-local next, type, tostring = next, type, tostring
+local next, type = next, type
local sort, concat = table.sort, table.concat
local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+local report_otf = logs.reporter("fonts","otf loading")
-fonts = fonts or { }
-fonts.otf = fonts.otf or { }
-fonts.otf.enhancers = fonts.otf.enhancers or { }
-fonts.otf.glists = fonts.otf.glists or { "gsub", "gpos" }
+-- also used in other scripts so we need to check some tables:
-local criterium, threshold, tabstr = 1, 0, table.serialize
+fonts = fonts or { }
+fonts.handlers = fonts.handlers or { }
+local handlers = fonts.handlers
+handlers.otf = handlers.otf or { }
+local otf = handlers.otf
+otf.enhancers = otf.enhancers or { }
+local enhancers = otf.enhancers
+otf.glists = otf.glists or { "gsub", "gpos" }
+local glists = otf.glists
-local function tabstr(t) -- hashed from core-uti / experiment
- local s = { }
+local criterium = 1
+local threshold = 0
+
+local function tabstr(t)
+ local s, n = { }, 0
for k, v in next, t do
+ n = n + 1
if type(v) == "table" then
- s[#s+1] = k.."={"..tabstr(v).."}"
+ s[n] = k .. "={" .. tabstr(v) .. "}"
+ elseif v == true then
+ s[n] = k .. "=true"
+ elseif v then
+ s[n] = k .. "=" .. v
else
- s[#s+1] = k.."="..tostring(v)
+ s[n] = k .. "=false"
end
end
sort(s)
return concat(s,",")
end
-function fonts.otf.enhancers.pack(data)
+local function packdata(data)
if data then
local h, t, c = { }, { }, { }
local hh, tt, cc = { }, { }, { }
- local function pack_1(v)
+ local nt, ntt = 0, 0
+ local function pack_1(v,indexed)
-- v == table
- local tag = tabstr(v)
+ local tag = indexed and concat(v," ") or tabstr(v)
local ht = h[tag]
if not ht then
- ht = #t+1
+ nt = nt + 1
+ ht = nt
t[ht] = v
h[tag] = ht
c[ht] = 1
@@ -51,7 +67,7 @@ function fonts.otf.enhancers.pack(data)
end
return ht
end
- local function pack_2(v)
+ local function pack_2(v,indexed)
-- v == number
if c[v] <= criterium then
return t[v]
@@ -59,7 +75,8 @@ function fonts.otf.enhancers.pack(data)
-- compact hash
local hv = hh[v]
if not hv then
- hv = #tt+1
+ ntt = ntt + 1
+ hv = ntt
tt[hv] = t[v]
hh[v] = hv
cc[hv] = c[v]
@@ -68,12 +85,12 @@ function fonts.otf.enhancers.pack(data)
end
end
local function success(stage,pass)
- if #t == 0 then
+ if nt == 0 then
if trace_loading then
- logs.report("load otf","pack quality: nothing to pack")
+ report_otf("pack quality: nothing to pack")
end
return false
- elseif #t >= threshold then
+ elseif nt >= threshold then
local one, two, rest = 0, 0, 0
if pass == 1 then
for k,v in next, c do
@@ -87,9 +104,9 @@ function fonts.otf.enhancers.pack(data)
end
else
for k,v in next, cc do
- if v >20 then
+ if v > 20 then
rest = rest + 1
- elseif v >10 then
+ elseif v > 10 then
two = two + 1
else
one = one + 1
@@ -98,157 +115,164 @@ function fonts.otf.enhancers.pack(data)
data.tables = tt
end
if trace_loading then
- logs.report("load otf","pack quality: stage %s, pass %s, %s packed, 1-10:%s, 11-20:%s, rest:%s (criterium: %s)", stage, pass, one+two+rest, one, two, rest, criterium)
+ report_otf("pack quality: stage %s, pass %s, %s packed, 1-10:%s, 11-20:%s, rest:%s (criterium: %s)", stage, pass, one+two+rest, one, two, rest, criterium)
end
return true
else
if trace_loading then
- logs.report("load otf","pack quality: stage %s, pass %s, %s packed, aborting pack (threshold: %s)", stage, pass, #t, threshold)
+ report_otf("pack quality: stage %s, pass %s, %s packed, aborting pack (threshold: %s)", stage, pass, nt, threshold)
end
return false
end
end
+ local resources = data.resources
+ local lookuptypes = resources.lookuptypes
for pass=1,2 do
local pack = (pass == 1 and pack_1) or pack_2
- for k, v in next, data.glyphs do
- v.boundingbox = pack(v.boundingbox)
- local l = v.slookups
- if l then
- for k,v in next, l do
- l[k] = pack(v)
- end
- end
- local l = v.mlookups
- if l then
- for k,v in next, l do
- for kk=1,#v do
- local vkk = v[kk]
- local what = vkk[1]
- if what == "pair" then
- local t = vkk[3] if t then vkk[3] = pack(t) end
- local t = vkk[4] if t then vkk[4] = pack(t) end
- elseif what == "position" then
- local t = vkk[2] if t then vkk[2] = pack(t) end
+ for unicode, description in next, data.descriptions do
+ local boundingbox = description.boundingbox
+ if boundingbox then
+ description.boundingbox = pack(boundingbox,true)
+ end
+ local slookups = description.slookups
+ if slookups then
+ for tag, slookup in next, slookups do
+ local what = lookuptypes[tag]
+ if what == "pair" then
+ local t = slookup[2] if t then slookup[2] = pack(t,true) end
+ local t = slookup[3] if t then slookup[3] = pack(t,true) end
+ elseif what ~= "substitution" then
+ slookups[tag] = pack(slookup)
+ end
+ end
+ end
+ local mlookups = description.mlookups
+ if mlookups then
+ for tag, mlookup in next, mlookups do
+ local what = lookuptypes[tag]
+ if what == "pair" then
+ for i=1,#mlookup do
+ local lookup = mlookup[i]
+ local t = lookup[2] if t then lookup[2] = pack(t,true) end
+ local t = lookup[3] if t then lookup[3] = pack(t,true) end
+ end
+ elseif what ~= "substitution" then
+ for i=1,#mlookup do
+ mlookup[i] = pack(mlookup[i]) -- true
end
- -- v[kk] = pack(vkk)
end
end
end
- local m = v.mykerns
- if m then
- for k,v in next, m do
- m[k] = pack(v)
+ local kerns = description.kerns
+ if kerns then
+ for tag, kern in next, kerns do
+ kerns[tag] = pack(kern)
end
end
- local m = v.math
- if m then
- local mk = m.kerns
- if mk then
- for k,v in next, mk do
- mk[k] = pack(v)
+ local math = description.math
+ if math then
+ local kerns = math.kerns
+ if kerns then
+ for tag, kern in next, kerns do
+ kerns[tag] = pack(kern)
end
end
end
- local a = v.anchors
- if a then
- for k,v in next, a do
- if k == "baselig" then
- for kk, vv in next, v do
- for kkk=1,#vv do
- vv[kkk] = pack(vv[kkk])
+ local anchors = description.anchors
+ if anchors then
+ for what, anchor in next, anchors do
+ if what == "baselig" then
+ for _, a in next, anchor do
+ for k=1,#a do
+ a[k] = pack(a[k])
end
end
else
- for kk, vv in next, v do
- v[kk] = pack(vv)
+ for k, v in next, anchor do
+ anchor[k] = pack(v)
end
end
end
end
end
- if data.lookups then
- for k, v in next, data.lookups do
- if v.rules then
- for kk, vv in next, v.rules do
- local l = vv.lookups
- if l then
- vv.lookups = pack(l)
- end
- local c = vv.coverage
- if c then
- local cc = c.before if cc then c.before = pack(cc) end
- local cc = c.after if cc then c.after = pack(cc) end
- local cc = c.current if cc then c.current = pack(cc) end
- end
- local c = vv.reversecoverage
- if c then
- local cc = c.before if cc then c.before = pack(cc) end
- local cc = c.after if cc then c.after = pack(cc) end
- local cc = c.current if cc then c.current = pack(cc) end
- end
- -- no need to pack vv.glyphs
- local c = vv.glyphs
- if c then
- if c.fore == "" then c.fore = nil end
- if c.back == "" then c.back = nil end
- end
+ local lookups = data.lookups
+ if lookups then
+ for _, lookup in next, lookups do
+ local rules = lookup.rules
+ if rules then
+ for i=1,#rules do -- was next loop
+ local rule = rules[i]
+--~ local r = rule.before if r then for i=1,#r do r[i] = pack(r[i],true) end end
+--~ local r = rule.after if r then for i=1,#r do r[i] = pack(r[i],true) end end
+--~ local r = rule.current if r then for i=1,#r do r[i] = pack(r[i],true) end end
+--~ local r = rule.replacements if r then rule.replacements = pack(r, true) end
+--~ local r = rule.fore if r then rule.fore = pack(r, true) end
+--~ local r = rule.back if r then rule.back = pack(r, true) end
+--~ local r = rule.names if r then rule.names = pack(r, true) end
+--~ local r = rule.lookups if r then rule.lookups = pack(r) end
+ local r = rule.before if r then for i=1,#r do r[i] = pack(r[i]) end end
+ local r = rule.after if r then for i=1,#r do r[i] = pack(r[i]) end end
+ local r = rule.current if r then for i=1,#r do r[i] = pack(r[i]) end end
+ local r = rule.replacements if r then rule.replacements = pack(r) end
+ -- local r = rule.fore if r then rule.fore = pack(r) end
+ -- local r = rule.back if r then rule.back = pack(r) end
+ -- local r = rule.names if r then rule.names = pack(r) end
+ local r = rule.lookups if r then rule.lookups = pack(r) end
end
end
end
end
- if data.luatex then
- local la = data.luatex.anchor_to_lookup
- if la then
- for lookup, ldata in next, la do
- la[lookup] = pack(ldata)
- end
+ local anchor_to_lookup = resources.anchor_to_lookup
+ if anchor_to_lookup then
+ for anchor, lookup in next, anchor_to_lookup do
+ anchor_to_lookup[anchor] = pack(lookup)
end
- local la = data.luatex.lookup_to_anchor
- if la then
- for lookup, ldata in next, la do
- la[lookup] = pack(ldata)
- end
+ end
+ local lookup_to_anchor = resources.lookup_to_anchor
+ if lookup_to_anchor then
+ for lookup, anchor in next, lookup_to_anchor do
+ lookup_to_anchor[lookup] = pack(anchor)
end
- local ls = data.luatex.sequences
- if ls then
- for feature, fdata in next, ls do
- local flags = fdata.flags
- if flags then
- fdata.flags = pack(flags)
- end
- local subtables = fdata.subtables
- if subtables then
- fdata.subtables = pack(subtables)
- end
- local features = fdata.features
- if features then
- for script, sdata in next, features do
- features[script] = pack(sdata)
- end
+ end
+ local sequences = resources.sequences
+ if sequences then
+ for feature, sequence in next, sequences do
+ local flags = sequence.flags
+ if flags then
+ sequence.flags = pack(flags)
+ end
+ local subtables = sequence.subtables
+ if subtables then
+ sequence.subtables = pack(subtables)
+ end
+ local features = sequence.features
+ if features then
+ for script, feature in next, features do
+ features[script] = pack(feature)
end
end
end
- local ls = data.luatex.lookups
- if ls then
- for lookup, fdata in next, ls do
- local flags = fdata.flags
- if flags then
- fdata.flags = pack(flags)
- end
- local subtables = fdata.subtables
- if subtables then
- fdata.subtables = pack(subtables)
- end
+ end
+ local lookups = resources.lookups
+ if lookups then
+ for name, lookup in next, lookups do
+ local flags = lookup.flags
+ if flags then
+ lookup.flags = pack(flags)
+ end
+ local subtables = lookup.subtables
+ if subtables then
+ lookup.subtables = pack(subtables)
end
end
- local lf = data.luatex.features
- if lf then
- for _, g in next, fonts.otf.glists do
- local gl = lf[g]
- if gl then
- for feature, spec in next, gl do
- gl[feature] = pack(spec)
- end
+ end
+ local features = resources.features
+ if features then
+ for _, what in next, glists do
+ local list = features[what]
+ if list then
+ for feature, spec in next, list do
+ list[feature] = pack(spec)
end
end
end
@@ -257,242 +281,404 @@ function fonts.otf.enhancers.pack(data)
return
end
end
- if #t > 0 then
+ if nt > 0 then
for pass=1,2 do
local pack = (pass == 1 and pack_1) or pack_2
- for k, v in next, data.glyphs do
- local m = v.mykerns
- if m then
- v.mykerns = pack(m)
- end
- local m = v.math
- if m then
- local mk = m.kerns
- if mk then
- m.kerns = pack(mk)
+ for unicode, description in next, data.descriptions do
+ local kerns = description.kerns
+ if kerns then
+ description.kerns = pack(kerns)
+ end
+ local math = description.math
+ if math then
+ local kerns = math.kerns
+ if kerns then
+ math.kerns = pack(kerns)
end
end
- local a = v.anchors
- if a then
- v.anchors = pack(a)
+ local anchors = description.anchors
+ if anchors then
+ description.anchors = pack(anchors)
+ end
+ local mlookups = description.mlookups
+ if mlookups then
+ for tag, mlookup in next, mlookups do
+ mlookups[tag] = pack(mlookup)
+ end
end
- local l = v.mlookups
- if l then
- for k,v in next, l do
- for kk=1,#v do
- v[kk] = pack(v[kk])
+ end
+ local lookups = data.lookups
+ if lookups then
+ for _, lookup in next, lookups do
+ local rules = lookup.rules
+ if rules then
+ for i=1,#rules do -- was next loop
+ local rule = rules[i]
+ local r = rule.before if r then rule.before = pack(r) end
+ local r = rule.after if r then rule.after = pack(r) end
+ local r = rule.current if r then rule.current = pack(r) end
end
end
end
end
- local ls = data.luatex.sequences
- if ls then
- for feature, fdata in next, ls do
- fdata.features = pack(fdata.features)
+ local sequences = resources.sequences
+ if sequences then
+ for feature, sequence in next, sequences do
+ sequence.features = pack(sequence.features)
end
end
if not success(2,pass) then
---~ return
+ -- return
+ end
+ end
+
+ for pass=1,2 do
+ local pack = (pass == 1 and pack_1) or pack_2
+ for unicode, description in next, data.descriptions do
+ local slookups = description.slookups
+ if slookups then
+ description.slookups = pack(slookups)
+ end
+ local mlookups = description.mlookups
+ if mlookups then
+ description.mlookups = pack(mlookups)
+ end
end
end
+
end
end
end
-function fonts.otf.enhancers.unpack(data)
+local unpacked_mt = {
+ __index =
+ function(t,k)
+ t[k] = false
+ return k -- next time true
+ end
+}
+
+local function unpackdata(data)
if data then
- local t = data.tables
- if t then
+ local tables = data.tables
+ if tables then
+ local resources = data.resources
+ local lookuptypes = resources.lookuptypes
local unpacked = { }
- for k, v in next, data.glyphs do
- local tv = t[v.boundingbox] if tv then v.boundingbox = tv end
- local l = v.slookups
- if l then
- for k,v in next, l do
- local tv = t[v] if tv then l[k] = tv end
- end
- end
- local l = v.mlookups
- if l then
- for k,v in next, l do
- for i=1,#v do
- local vi = v[i]
- local tv = t[vi]
- if tv then
- v[i] = tv
- if unpacked[tv] then
- vi = false
- else
- unpacked[tv], vi = true, tv
+ setmetatable(unpacked,unpacked_mt)
+ for unicode, description in next, data.descriptions do
+ local tv = tables[description.boundingbox]
+ if tv then
+ description.boundingbox = tv
+ end
+ local slookups = description.slookups
+ if slookups then
+ local tv = tables[slookups]
+ if tv then
+ description.slookups = tv
+ slookups = unpacked[tv]
+ end
+ if slookups then
+ for tag, lookup in next, slookups do
+ local what = lookuptypes[tag]
+ if what == "pair" then
+ local tv = tables[lookup[2]]
+ if tv then
+ lookup[2] = tv
+ end
+ local tv = tables[lookup[3]]
+ if tv then
+ lookup[3] = tv
+ end
+ elseif what ~= "substitution" then
+ local tv = tables[lookup]
+ if tv then
+ slookups[tag] = tv
end
end
- if vi then
- local what = vi[1]
+ end
+ end
+ end
+ local mlookups = description.mlookups
+ if mlookups then
+ local tv = tables[mlookups]
+ if tv then
+ description.mlookups = tv
+ mlookups = unpacked[tv]
+ end
+ if mlookups then
+ for tag, list in next, mlookups do
+ local tv = tables[list]
+ if tv then
+ mlookups[tag] = tv
+ list = unpacked[tv]
+ end
+ if list then
+ local what = lookuptypes[tag]
if what == "pair" then
- local tv = t[vi[3]] if tv then vi[3] = tv end
- local tv = t[vi[4]] if tv then vi[4] = tv end
- elseif what == "position" then
- local tv = t[vi[2]] if tv then vi[2] = tv end
+ for i=1,#list do
+ local lookup = list[i]
+ local tv = tables[lookup[2]]
+ if tv then
+ lookup[2] = tv
+ end
+ local tv = tables[lookup[3]]
+ if tv then
+ lookup[3] = tv
+ end
+ end
+ elseif what ~= "substitution" then
+ for i=1,#list do
+ local tv = tables[list[i]]
+ if tv then
+ list[i] = tv
+ end
+ end
end
end
end
end
end
- local m = v.mykerns
- if m then
- local tm = t[m]
+ local kerns = description.kerns
+ if kerns then
+ local tm = tables[kerns]
if tm then
- v.mykerns = tm
- if unpacked[tm] then
- m = false
- else
- unpacked[tm], m = true, tm
- end
+ description.kerns = tm
+ kerns = unpacked[tm]
end
- if m then
- for k,v in next, m do
- local tv = t[v] if tv then m[k] = tv end
+ if kerns then
+ for k, kern in next, kerns do
+ local tv = tables[kern]
+ if tv then
+ kerns[k] = tv
+ end
end
end
end
- local m = v.math
- if m then
- local mk = m.kerns
- if mk then
- local tm = t[mk]
+ local math = description.math
+ if math then
+ local kerns = math.kerns
+ if kerns then
+ local tm = tables[kerns]
if tm then
- m.kerns = tm
- if unpacked[tm] then
- mk = false
- else
- unpacked[tm], mk = true, tm
- end
+ math.kerns = tm
+ kerns = unpacked[tm]
end
- if mk then
- for k,v in next, mk do
- local tv = t[v] if tv then mk[k] = tv end
+ if kerns then
+ for k, kern in next, kerns do
+ local tv = tables[kern]
+ if tv then
+ kerns[k] = tv
+ end
end
end
end
end
- local a = v.anchors
- if a then
- local ta = t[a]
+ local anchors = description.anchors
+ if anchors then
+ local ta = tables[anchors]
if ta then
- v.anchors = ta
- if not unpacked[ta] then
- unpacked[ta], a = true, ta
- else
- a = false
- end
+ description.anchors = ta
+ anchors = unpacked[ta]
end
- if a then
- for k,v in next, a do
- if k == "baselig" then
- for kk, vv in next, v do
- for kkk=1,#vv do
- local tv = t[vv[kkk]] if tv then vv[kkk] = tv end
+ if anchors then
+ for tag, anchor in next, anchors do
+ if tag == "baselig" then
+ for _, list in next, anchor do
+ for i=1,#list do
+ local tv = tables[list[i]]
+ if tv then
+ list[i] = tv
+ end
end
end
else
- for kk, vv in next, v do
- local tv = t[vv] if tv then v[kk] = tv end
+ for a, data in next, anchor do
+ local tv = tables[data]
+ if tv then
+ anchor[a] = tv
+ end
end
end
end
end
end
end
- if data.lookups then
- for k, v in next, data.lookups do
- local r = v.rules
- if r then
- for kk, vv in next, r do
- local l = vv.lookups
- if l then
- local tv = t[l] if tv then vv.lookups = tv end
+ local lookups = data.lookups
+ if lookups then
+ for _, lookup in next, lookups do
+ local rules = lookup.rules
+ if rules then
+ for i=1,#rules do -- was next loop
+ local rule = rules[i]
+ local before = rule.before
+ if before then
+ local tv = tables[before]
+ if tv then
+ rule.before = tv
+ before = unpacked[tv]
+ end
+ if before then
+ for i=1,#before do
+ local tv = tables[before[i]]
+ if tv then
+ before[i] = tv
+ end
+ end
+ end
end
- local c = vv.coverage
- if c then
- local cc = c.before if cc then local tv = t[cc] if tv then c.before = tv end end
- cc = c.after if cc then local tv = t[cc] if tv then c.after = tv end end
- cc = c.current if cc then local tv = t[cc] if tv then c.current = tv end end
+ local after = rule.after
+ if after then
+ local tv = tables[after]
+ if tv then
+ rule.after = tv
+ after = unpacked[tv]
+ end
+ if after then
+ for i=1,#after do
+ local tv = tables[after[i]]
+ if tv then
+ after[i] = tv
+ end
+ end
+ end
end
- local c = vv.reversecoverage
- if c then
- local cc = c.before if cc then local tv = t[cc] if tv then c.before = tv end end
- cc = c.after if cc then local tv = t[cc] if tv then c.after = tv end end
- cc = c.current if cc then local tv = t[cc] if tv then c.current = tv end end
+ local current = rule.current
+ if current then
+ local tv = tables[current]
+ if tv then
+ rule.current = tv
+ current = unpacked[tv]
+ end
+ if current then
+ for i=1,#current do
+ local tv = tables[current[i]]
+ if tv then
+ current[i] = tv
+ end
+ end
+ end
+ end
+ local replacements = rule.replacements
+ if replacements then
+ local tv = tables[replacements]
+ if tv then
+ 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]
+ if tv then
+ rule.lookups = tv
+ end
end
- -- no need to unpack vv.glyphs
end
end
end
end
- local luatex = data.luatex
- if luatex then
- local la = luatex.anchor_to_lookup
- if la then
- for lookup, ldata in next, la do
- local tv = t[ldata] if tv then la[lookup] = tv end
- end
- end
- local la = luatex.lookup_to_anchor
- if la then
- for lookup, ldata in next, la do
- local tv = t[ldata] if tv then la[lookup] = tv end
- end
- end
- local ls = luatex.sequences
- if ls then
- for feature, fdata in next, ls do
- local flags = fdata.flags
- if flags then
- local tv = t[flags] if tv then fdata.flags = tv end
+ local anchor_to_lookup = resources.anchor_to_lookup
+ if anchor_to_lookup then
+ for anchor, lookup in next, anchor_to_lookup do
+ local tv = tables[lookup]
+ if tv then
+ anchor_to_lookup[anchor] = tv
+ end
+ end
+ end
+ local lookup_to_anchor = resources.lookup_to_anchor
+ if lookup_to_anchor then
+ for lookup, anchor in next, lookup_to_anchor do
+ local tv = tables[anchor]
+ if tv then
+ lookup_to_anchor[lookup] = tv
+ end
+ end
+ end
+ local ls = resources.sequences
+ if ls then
+ for _, feature in next, ls do
+ local flags = feature.flags
+ if flags then
+ local tv = tables[flags]
+ if tv then
+ feature.flags = tv
end
- local subtables = fdata.subtables
- if subtables then
- local tv = t[subtables] if tv then fdata.subtables = tv end
+ end
+ local subtables = feature.subtables
+ if subtables then
+ local tv = tables[subtables]
+ if tv then
+ feature.subtables = tv
+ end
+ end
+ local features = feature.features
+ if features then
+ local tv = tables[features]
+ if tv then
+ feature.features = tv
+ features = unpacked[tv]
end
- local features = fdata.features
if features then
- local tv = t[features]
- if tv then
- fdata.features = tv
- if not unpacked[tv] then
- unpacked[tv], features = true, tv
- else
- features = false
- end
- end
- if features then
- for script, sdata in next, features do
- local tv = t[sdata] if tv then features[script] = tv end
+ for script, data in next, features do
+ local tv = tables[data]
+ if tv then
+ features[script] = tv
end
end
end
end
end
- local ls = luatex.lookups
- if ls then
- for lookups, fdata in next, ls do
- local flags = fdata.flags
- if flags then
- local tv = t[flags] if tv then fdata.flags = tv end
+ end
+ local lookups = resources.lookups
+ if lookups then
+ for _, lookup in next, lookups do
+ local flags = lookup.flags
+ if flags then
+ local tv = tables[flags]
+ if tv then
+ lookup.flags = tv
end
- local subtables = fdata.subtables
- if subtables then
- local tv = t[subtables] if tv then fdata.subtables = tv end
+ end
+ local subtables = lookup.subtables
+ if subtables then
+ local tv = tables[subtables]
+ if tv then
+ lookup.subtables = tv
end
end
end
- local lf = luatex.features
- if lf then
- for _, g in next, fonts.otf.glists do
- local gl = lf[g]
- if gl then
- for feature, spec in next, gl do
- local tv = t[spec] if tv then gl[feature] = tv end
+ end
+ local features = resources.features
+ if features then
+ for _, what in next, glists do
+ local feature = features[what]
+ if feature then
+ for tag, spec in next, feature do
+ local tv = tables[spec]
+ if tv then
+ feature[tag] = tv
end
end
end
@@ -502,3 +688,14 @@ function fonts.otf.enhancers.unpack(data)
end
end
end
+
+if otf.enhancers.register then
+
+ otf.enhancers.register( "pack", packdata)
+ otf.enhancers.register("unpack",unpackdata)
+
+-- todo: directive
+
+end
+
+otf.enhancers.unpack = unpackdata -- 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 2be1bf06c00..800fd3c65e8 100644
--- a/Master/texmf-dist/tex/context/base/font-ott.lua
+++ b/Master/texmf-dist/tex/context/base/font-ott.lua
@@ -6,729 +6,782 @@ if not modules then modules = { } end modules ['font-otf'] = {
license = "see context related readme files"
}
-local type, next, tonumber, tostring = type, next, tonumber, tostring
-local gsub, lower = string.gsub, string.lower
+local type, next, tonumber, tostring, rawget = type, next, tonumber, tostring, rawget
+local gsub, lower, format, match = string.gsub, string.lower, string.format, string.match
+local is_boolean = string.is_boolean
-fonts = fonts or { }
-fonts.otf = fonts.otf or { }
+local setmetatableindex = table.setmetatableindex
+local setmetatablenewindex = table.setmetatablenewindex
+local allocate = utilities.storage.allocate
-local otf = fonts.otf
+local fonts = fonts
+local otf = fonts.handlers.otf
+local tables = { }
+otf.tables = tables
-otf.tables = otf.tables or { }
-otf.meanings = otf.meanings or { }
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
-otf.tables.scripts = {
- ['dflt'] = 'Default',
-
- ['arab'] = 'Arabic',
- ['armn'] = 'Armenian',
- ['bali'] = 'Balinese',
- ['beng'] = 'Bengali',
- ['bopo'] = 'Bopomofo',
- ['brai'] = 'Braille',
- ['bugi'] = 'Buginese',
- ['buhd'] = 'Buhid',
- ['byzm'] = 'Byzantine Music',
- ['cans'] = 'Canadian Syllabics',
- ['cher'] = 'Cherokee',
- ['copt'] = 'Coptic',
- ['cprt'] = 'Cypriot Syllabary',
- ['cyrl'] = 'Cyrillic',
- ['deva'] = 'Devanagari',
- ['dsrt'] = 'Deseret',
- ['ethi'] = 'Ethiopic',
- ['geor'] = 'Georgian',
- ['glag'] = 'Glagolitic',
- ['goth'] = 'Gothic',
- ['grek'] = 'Greek',
- ['gujr'] = 'Gujarati',
- ['guru'] = 'Gurmukhi',
- ['hang'] = 'Hangul',
- ['hani'] = 'CJK Ideographic',
- ['hano'] = 'Hanunoo',
- ['hebr'] = 'Hebrew',
- ['ital'] = 'Old Italic',
- ['jamo'] = 'Hangul Jamo',
- ['java'] = 'Javanese',
- ['kana'] = 'Hiragana and Katakana',
- ['khar'] = 'Kharosthi',
- ['khmr'] = 'Khmer',
- ['knda'] = 'Kannada',
- ['lao' ] = 'Lao',
- ['latn'] = 'Latin',
- ['limb'] = 'Limbu',
- ['linb'] = 'Linear B',
- ['math'] = 'Mathematical Alphanumeric Symbols',
- ['mlym'] = 'Malayalam',
- ['mong'] = 'Mongolian',
- ['musc'] = 'Musical Symbols',
- ['mymr'] = 'Myanmar',
- ['nko' ] = "N'ko",
- ['ogam'] = 'Ogham',
- ['orya'] = 'Oriya',
- ['osma'] = 'Osmanya',
- ['phag'] = 'Phags-pa',
- ['phnx'] = 'Phoenician',
- ['runr'] = 'Runic',
- ['shaw'] = 'Shavian',
- ['sinh'] = 'Sinhala',
- ['sylo'] = 'Syloti Nagri',
- ['syrc'] = 'Syriac',
- ['tagb'] = 'Tagbanwa',
- ['tale'] = 'Tai Le',
- ['talu'] = 'Tai Lu',
- ['taml'] = 'Tamil',
- ['telu'] = 'Telugu',
- ['tfng'] = 'Tifinagh',
- ['tglg'] = 'Tagalog',
- ['thaa'] = 'Thaana',
- ['thai'] = 'Thai',
- ['tibt'] = 'Tibetan',
- ['ugar'] = 'Ugaritic Cuneiform',
- ['xpeo'] = 'Old Persian Cuneiform',
- ['xsux'] = 'Sumero-Akkadian Cuneiform',
- ['yi' ] = 'Yi',
+local scripts = allocate {
+ ['arab'] = 'arabic',
+ ['armn'] = 'armenian',
+ ['bali'] = 'balinese',
+ ['beng'] = 'bengali',
+ ['bopo'] = 'bopomofo',
+ ['brai'] = 'braille',
+ ['bugi'] = 'buginese',
+ ['buhd'] = 'buhid',
+ ['byzm'] = 'byzantine music',
+ ['cans'] = 'canadian syllabics',
+ ['cher'] = 'cherokee',
+ ['copt'] = 'coptic',
+ ['cprt'] = 'cypriot syllabary',
+ ['cyrl'] = 'cyrillic',
+ ['deva'] = 'devanagari',
+ ['dsrt'] = 'deseret',
+ ['ethi'] = 'ethiopic',
+ ['geor'] = 'georgian',
+ ['glag'] = 'glagolitic',
+ ['goth'] = 'gothic',
+ ['grek'] = 'greek',
+ ['gujr'] = 'gujarati',
+ ['guru'] = 'gurmukhi',
+ ['hang'] = 'hangul',
+ ['hani'] = 'cjk ideographic',
+ ['hano'] = 'hanunoo',
+ ['hebr'] = 'hebrew',
+ ['ital'] = 'old italic',
+ ['jamo'] = 'hangul jamo',
+ ['java'] = 'javanese',
+ ['kana'] = 'hiragana and katakana',
+ ['khar'] = 'kharosthi',
+ ['khmr'] = 'khmer',
+ ['knda'] = 'kannada',
+ ['lao' ] = 'lao',
+ ['latn'] = 'latin',
+ ['limb'] = 'limbu',
+ ['linb'] = 'linear b',
+ ['math'] = 'mathematical alphanumeric symbols',
+ ['mlym'] = 'malayalam',
+ ['mong'] = 'mongolian',
+ ['musc'] = 'musical symbols',
+ ['mymr'] = 'myanmar',
+ ['nko' ] = "n'ko",
+ ['ogam'] = 'ogham',
+ ['orya'] = 'oriya',
+ ['osma'] = 'osmanya',
+ ['phag'] = 'phags-pa',
+ ['phnx'] = 'phoenician',
+ ['runr'] = 'runic',
+ ['shaw'] = 'shavian',
+ ['sinh'] = 'sinhala',
+ ['sylo'] = 'syloti nagri',
+ ['syrc'] = 'syriac',
+ ['tagb'] = 'tagbanwa',
+ ['tale'] = 'tai le',
+ ['talu'] = 'tai lu',
+ ['taml'] = 'tamil',
+ ['telu'] = 'telugu',
+ ['tfng'] = 'tifinagh',
+ ['tglg'] = 'tagalog',
+ ['thaa'] = 'thaana',
+ ['thai'] = 'thai',
+ ['tibt'] = 'tibetan',
+ ['ugar'] = 'ugaritic cuneiform',
+ ['xpeo'] = 'old persian cuneiform',
+ ['xsux'] = 'sumero-akkadian cuneiform',
+ ['yi' ] = 'yi',
}
-otf.tables.languages = {
- ['dflt'] = 'Default',
-
- ['aba'] = 'Abaza',
- ['abk'] = 'Abkhazian',
- ['ady'] = 'Adyghe',
- ['afk'] = 'Afrikaans',
- ['afr'] = 'Afar',
- ['agw'] = 'Agaw',
- ['als'] = 'Alsatian',
- ['alt'] = 'Altai',
- ['amh'] = 'Amharic',
- ['ara'] = 'Arabic',
- ['ari'] = 'Aari',
- ['ark'] = 'Arakanese',
- ['asm'] = 'Assamese',
- ['ath'] = 'Athapaskan',
- ['avr'] = 'Avar',
- ['awa'] = 'Awadhi',
- ['aym'] = 'Aymara',
- ['aze'] = 'Azeri',
- ['bad'] = 'Badaga',
- ['bag'] = 'Baghelkhandi',
- ['bal'] = 'Balkar',
- ['bau'] = 'Baule',
- ['bbr'] = 'Berber',
- ['bch'] = 'Bench',
- ['bcr'] = 'Bible Cree',
- ['bel'] = 'Belarussian',
- ['bem'] = 'Bemba',
- ['ben'] = 'Bengali',
- ['bgr'] = 'Bulgarian',
- ['bhi'] = 'Bhili',
- ['bho'] = 'Bhojpuri',
- ['bik'] = 'Bikol',
- ['bil'] = 'Bilen',
- ['bkf'] = 'Blackfoot',
- ['bli'] = 'Balochi',
- ['bln'] = 'Balante',
- ['blt'] = 'Balti',
- ['bmb'] = 'Bambara',
- ['bml'] = 'Bamileke',
- ['bos'] = 'Bosnian',
- ['bre'] = 'Breton',
- ['brh'] = 'Brahui',
- ['bri'] = 'Braj Bhasha',
- ['brm'] = 'Burmese',
- ['bsh'] = 'Bashkir',
- ['bti'] = 'Beti',
- ['cat'] = 'Catalan',
- ['ceb'] = 'Cebuano',
- ['che'] = 'Chechen',
- ['chg'] = 'Chaha Gurage',
- ['chh'] = 'Chattisgarhi',
- ['chi'] = 'Chichewa',
- ['chk'] = 'Chukchi',
- ['chp'] = 'Chipewyan',
- ['chr'] = 'Cherokee',
- ['chu'] = 'Chuvash',
- ['cmr'] = 'Comorian',
- ['cop'] = 'Coptic',
- ['cos'] = 'Corsican',
- ['cre'] = 'Cree',
- ['crr'] = 'Carrier',
- ['crt'] = 'Crimean Tatar',
- ['csl'] = 'Church Slavonic',
- ['csy'] = 'Czech',
- ['dan'] = 'Danish',
- ['dar'] = 'Dargwa',
- ['dcr'] = 'Woods Cree',
- ['deu'] = 'German',
- ['dgr'] = 'Dogri',
- ['div'] = 'Divehi',
- ['djr'] = 'Djerma',
- ['dng'] = 'Dangme',
- ['dnk'] = 'Dinka',
- ['dri'] = 'Dari',
- ['dun'] = 'Dungan',
- ['dzn'] = 'Dzongkha',
- ['ebi'] = 'Ebira',
- ['ecr'] = 'Eastern Cree',
- ['edo'] = 'Edo',
- ['efi'] = 'Efik',
- ['ell'] = 'Greek',
- ['eng'] = 'English',
- ['erz'] = 'Erzya',
- ['esp'] = 'Spanish',
- ['eti'] = 'Estonian',
- ['euq'] = 'Basque',
- ['evk'] = 'Evenki',
- ['evn'] = 'Even',
- ['ewe'] = 'Ewe',
- ['fan'] = 'French Antillean',
- ['far'] = 'Farsi',
- ['fin'] = 'Finnish',
- ['fji'] = 'Fijian',
- ['fle'] = 'Flemish',
- ['fne'] = 'Forest Nenets',
- ['fon'] = 'Fon',
- ['fos'] = 'Faroese',
- ['fra'] = 'French',
- ['fri'] = 'Frisian',
- ['frl'] = 'Friulian',
- ['fta'] = 'Futa',
- ['ful'] = 'Fulani',
- ['gad'] = 'Ga',
- ['gae'] = 'Gaelic',
- ['gag'] = 'Gagauz',
- ['gal'] = 'Galician',
- ['gar'] = 'Garshuni',
- ['gaw'] = 'Garhwali',
- ['gez'] = "Ge'ez",
- ['gil'] = 'Gilyak',
- ['gmz'] = 'Gumuz',
- ['gon'] = 'Gondi',
- ['grn'] = 'Greenlandic',
- ['gro'] = 'Garo',
- ['gua'] = 'Guarani',
- ['guj'] = 'Gujarati',
- ['hai'] = 'Haitian',
- ['hal'] = 'Halam',
- ['har'] = 'Harauti',
- ['hau'] = 'Hausa',
- ['haw'] = 'Hawaiin',
- ['hbn'] = 'Hammer-Banna',
- ['hil'] = 'Hiligaynon',
- ['hin'] = 'Hindi',
- ['hma'] = 'High Mari',
- ['hnd'] = 'Hindko',
- ['ho'] = 'Ho',
- ['hri'] = 'Harari',
- ['hrv'] = 'Croatian',
- ['hun'] = 'Hungarian',
- ['hye'] = 'Armenian',
- ['ibo'] = 'Igbo',
- ['ijo'] = 'Ijo',
- ['ilo'] = 'Ilokano',
- ['ind'] = 'Indonesian',
- ['ing'] = 'Ingush',
- ['inu'] = 'Inuktitut',
- ['iri'] = 'Irish',
- ['irt'] = 'Irish Traditional',
- ['isl'] = 'Icelandic',
- ['ism'] = 'Inari Sami',
- ['ita'] = 'Italian',
- ['iwr'] = 'Hebrew',
- ['jan'] = 'Japanese',
- ['jav'] = 'Javanese',
- ['jii'] = 'Yiddish',
- ['jud'] = 'Judezmo',
- ['jul'] = 'Jula',
- ['kab'] = 'Kabardian',
- ['kac'] = 'Kachchi',
- ['kal'] = 'Kalenjin',
- ['kan'] = 'Kannada',
- ['kar'] = 'Karachay',
- ['kat'] = 'Georgian',
- ['kaz'] = 'Kazakh',
- ['keb'] = 'Kebena',
- ['kge'] = 'Khutsuri Georgian',
- ['kha'] = 'Khakass',
- ['khk'] = 'Khanty-Kazim',
- ['khm'] = 'Khmer',
- ['khs'] = 'Khanty-Shurishkar',
- ['khv'] = 'Khanty-Vakhi',
- ['khw'] = 'Khowar',
- ['kik'] = 'Kikuyu',
- ['kir'] = 'Kirghiz',
- ['kis'] = 'Kisii',
- ['kkn'] = 'Kokni',
- ['klm'] = 'Kalmyk',
- ['kmb'] = 'Kamba',
- ['kmn'] = 'Kumaoni',
- ['kmo'] = 'Komo',
- ['kms'] = 'Komso',
- ['knr'] = 'Kanuri',
- ['kod'] = 'Kodagu',
- ['koh'] = 'Korean Old Hangul',
- ['kok'] = 'Konkani',
- ['kon'] = 'Kikongo',
- ['kop'] = 'Komi-Permyak',
- ['kor'] = 'Korean',
- ['koz'] = 'Komi-Zyrian',
- ['kpl'] = 'Kpelle',
- ['kri'] = 'Krio',
- ['krk'] = 'Karakalpak',
- ['krl'] = 'Karelian',
- ['krm'] = 'Karaim',
- ['krn'] = 'Karen',
- ['krt'] = 'Koorete',
- ['ksh'] = 'Kashmiri',
- ['ksi'] = 'Khasi',
- ['ksm'] = 'Kildin Sami',
- ['kui'] = 'Kui',
- ['kul'] = 'Kulvi',
- ['kum'] = 'Kumyk',
- ['kur'] = 'Kurdish',
- ['kuu'] = 'Kurukh',
- ['kuy'] = 'Kuy',
- ['kyk'] = 'Koryak',
- ['lad'] = 'Ladin',
- ['lah'] = 'Lahuli',
- ['lak'] = 'Lak',
- ['lam'] = 'Lambani',
- ['lao'] = 'Lao',
- ['lat'] = 'Latin',
- ['laz'] = 'Laz',
- ['lcr'] = 'L-Cree',
- ['ldk'] = 'Ladakhi',
- ['lez'] = 'Lezgi',
- ['lin'] = 'Lingala',
- ['lma'] = 'Low Mari',
- ['lmb'] = 'Limbu',
- ['lmw'] = 'Lomwe',
- ['lsb'] = 'Lower Sorbian',
- ['lsm'] = 'Lule Sami',
- ['lth'] = 'Lithuanian',
- ['ltz'] = 'Luxembourgish',
- ['lub'] = 'Luba',
- ['lug'] = 'Luganda',
- ['luh'] = 'Luhya',
- ['luo'] = 'Luo',
- ['lvi'] = 'Latvian',
- ['maj'] = 'Majang',
- ['mak'] = 'Makua',
- ['mal'] = 'Malayalam Traditional',
- ['man'] = 'Mansi',
- ['map'] = 'Mapudungun',
- ['mar'] = 'Marathi',
- ['maw'] = 'Marwari',
- ['mbn'] = 'Mbundu',
- ['mch'] = 'Manchu',
- ['mcr'] = 'Moose Cree',
- ['mde'] = 'Mende',
- ['men'] = "Me'en",
- ['miz'] = 'Mizo',
- ['mkd'] = 'Macedonian',
- ['mle'] = 'Male',
- ['mlg'] = 'Malagasy',
- ['mln'] = 'Malinke',
- ['mlr'] = 'Malayalam Reformed',
- ['mly'] = 'Malay',
- ['mnd'] = 'Mandinka',
- ['mng'] = 'Mongolian',
- ['mni'] = 'Manipuri',
- ['mnk'] = 'Maninka',
- ['mnx'] = 'Manx Gaelic',
- ['moh'] = 'Mohawk',
- ['mok'] = 'Moksha',
- ['mol'] = 'Moldavian',
- ['mon'] = 'Mon',
- ['mor'] = 'Moroccan',
- ['mri'] = 'Maori',
- ['mth'] = 'Maithili',
- ['mts'] = 'Maltese',
- ['mun'] = 'Mundari',
- ['nag'] = 'Naga-Assamese',
- ['nan'] = 'Nanai',
- ['nas'] = 'Naskapi',
- ['ncr'] = 'N-Cree',
- ['ndb'] = 'Ndebele',
- ['ndg'] = 'Ndonga',
- ['nep'] = 'Nepali',
- ['new'] = 'Newari',
- ['ngr'] = 'Nagari',
- ['nhc'] = 'Norway House Cree',
- ['nis'] = 'Nisi',
- ['niu'] = 'Niuean',
- ['nkl'] = 'Nkole',
- ['nko'] = "N'ko",
- ['nld'] = 'Dutch',
- ['nog'] = 'Nogai',
- ['nor'] = 'Norwegian',
- ['nsm'] = 'Northern Sami',
- ['nta'] = 'Northern Tai',
- ['nto'] = 'Esperanto',
- ['nyn'] = 'Nynorsk',
- ['oci'] = 'Occitan',
- ['ocr'] = 'Oji-Cree',
- ['ojb'] = 'Ojibway',
- ['ori'] = 'Oriya',
- ['oro'] = 'Oromo',
- ['oss'] = 'Ossetian',
- ['paa'] = 'Palestinian Aramaic',
- ['pal'] = 'Pali',
- ['pan'] = 'Punjabi',
- ['pap'] = 'Palpa',
- ['pas'] = 'Pashto',
- ['pgr'] = 'Polytonic Greek',
- ['pil'] = 'Pilipino',
- ['plg'] = 'Palaung',
- ['plk'] = 'Polish',
- ['pro'] = 'Provencal',
- ['ptg'] = 'Portuguese',
- ['qin'] = 'Chin',
- ['raj'] = 'Rajasthani',
- ['rbu'] = 'Russian Buriat',
- ['rcr'] = 'R-Cree',
- ['ria'] = 'Riang',
- ['rms'] = 'Rhaeto-Romanic',
- ['rom'] = 'Romanian',
- ['roy'] = 'Romany',
- ['rsy'] = 'Rusyn',
- ['rua'] = 'Ruanda',
- ['rus'] = 'Russian',
- ['sad'] = 'Sadri',
- ['san'] = 'Sanskrit',
- ['sat'] = 'Santali',
- ['say'] = 'Sayisi',
- ['sek'] = 'Sekota',
- ['sel'] = 'Selkup',
- ['sgo'] = 'Sango',
- ['shn'] = 'Shan',
- ['sib'] = 'Sibe',
- ['sid'] = 'Sidamo',
- ['sig'] = 'Silte Gurage',
- ['sks'] = 'Skolt Sami',
- ['sky'] = 'Slovak',
- ['sla'] = 'Slavey',
- ['slv'] = 'Slovenian',
- ['sml'] = 'Somali',
- ['smo'] = 'Samoan',
- ['sna'] = 'Sena',
- ['snd'] = 'Sindhi',
- ['snh'] = 'Sinhalese',
- ['snk'] = 'Soninke',
- ['sog'] = 'Sodo Gurage',
- ['sot'] = 'Sotho',
- ['sqi'] = 'Albanian',
- ['srb'] = 'Serbian',
- ['srk'] = 'Saraiki',
- ['srr'] = 'Serer',
- ['ssl'] = 'South Slavey',
- ['ssm'] = 'Southern Sami',
- ['sur'] = 'Suri',
- ['sva'] = 'Svan',
- ['sve'] = 'Swedish',
- ['swa'] = 'Swadaya Aramaic',
- ['swk'] = 'Swahili',
- ['swz'] = 'Swazi',
- ['sxt'] = 'Sutu',
- ['syr'] = 'Syriac',
- ['tab'] = 'Tabasaran',
- ['taj'] = 'Tajiki',
- ['tam'] = 'Tamil',
- ['tat'] = 'Tatar',
- ['tcr'] = 'TH-Cree',
- ['tel'] = 'Telugu',
- ['tgn'] = 'Tongan',
- ['tgr'] = 'Tigre',
- ['tgy'] = 'Tigrinya',
- ['tha'] = 'Thai',
- ['tht'] = 'Tahitian',
- ['tib'] = 'Tibetan',
- ['tkm'] = 'Turkmen',
- ['tmn'] = 'Temne',
- ['tna'] = 'Tswana',
- ['tne'] = 'Tundra Nenets',
- ['tng'] = 'Tonga',
- ['tod'] = 'Todo',
- ['trk'] = 'Turkish',
- ['tsg'] = 'Tsonga',
- ['tua'] = 'Turoyo Aramaic',
- ['tul'] = 'Tulu',
- ['tuv'] = 'Tuvin',
- ['twi'] = 'Twi',
- ['udm'] = 'Udmurt',
- ['ukr'] = 'Ukrainian',
- ['urd'] = 'Urdu',
- ['usb'] = 'Upper Sorbian',
- ['uyg'] = 'Uyghur',
- ['uzb'] = 'Uzbek',
- ['ven'] = 'Venda',
- ['vit'] = 'Vietnamese',
- ['wa' ] = 'Wa',
- ['wag'] = 'Wagdi',
- ['wcr'] = 'West-Cree',
- ['wel'] = 'Welsh',
- ['wlf'] = 'Wolof',
- ['xbd'] = 'Tai Lue',
- ['xhs'] = 'Xhosa',
- ['yak'] = 'Yakut',
- ['yba'] = 'Yoruba',
- ['ycr'] = 'Y-Cree',
- ['yic'] = 'Yi Classic',
- ['yim'] = 'Yi Modern',
- ['zhh'] = 'Chinese Hong Kong',
- ['zhp'] = 'Chinese Phonetic',
- ['zhs'] = 'Chinese Simplified',
- ['zht'] = 'Chinese Traditional',
- ['znd'] = 'Zande',
- ['zul'] = 'Zulu'
+local languages = allocate {
+ ['aba'] = 'abaza',
+ ['abk'] = 'abkhazian',
+ ['ady'] = 'adyghe',
+ ['afk'] = 'afrikaans',
+ ['afr'] = 'afar',
+ ['agw'] = 'agaw',
+ ['als'] = 'alsatian',
+ ['alt'] = 'altai',
+ ['amh'] = 'amharic',
+ ['ara'] = 'arabic',
+ ['ari'] = 'aari',
+ ['ark'] = 'arakanese',
+ ['asm'] = 'assamese',
+ ['ath'] = 'athapaskan',
+ ['avr'] = 'avar',
+ ['awa'] = 'awadhi',
+ ['aym'] = 'aymara',
+ ['aze'] = 'azeri',
+ ['bad'] = 'badaga',
+ ['bag'] = 'baghelkhandi',
+ ['bal'] = 'balkar',
+ ['bau'] = 'baule',
+ ['bbr'] = 'berber',
+ ['bch'] = 'bench',
+ ['bcr'] = 'bible cree',
+ ['bel'] = 'belarussian',
+ ['bem'] = 'bemba',
+ ['ben'] = 'bengali',
+ ['bgr'] = 'bulgarian',
+ ['bhi'] = 'bhili',
+ ['bho'] = 'bhojpuri',
+ ['bik'] = 'bikol',
+ ['bil'] = 'bilen',
+ ['bkf'] = 'blackfoot',
+ ['bli'] = 'balochi',
+ ['bln'] = 'balante',
+ ['blt'] = 'balti',
+ ['bmb'] = 'bambara',
+ ['bml'] = 'bamileke',
+ ['bos'] = 'bosnian',
+ ['bre'] = 'breton',
+ ['brh'] = 'brahui',
+ ['bri'] = 'braj bhasha',
+ ['brm'] = 'burmese',
+ ['bsh'] = 'bashkir',
+ ['bti'] = 'beti',
+ ['cat'] = 'catalan',
+ ['ceb'] = 'cebuano',
+ ['che'] = 'chechen',
+ ['chg'] = 'chaha gurage',
+ ['chh'] = 'chattisgarhi',
+ ['chi'] = 'chichewa',
+ ['chk'] = 'chukchi',
+ ['chp'] = 'chipewyan',
+ ['chr'] = 'cherokee',
+ ['chu'] = 'chuvash',
+ ['cmr'] = 'comorian',
+ ['cop'] = 'coptic',
+ ['cos'] = 'corsican',
+ ['cre'] = 'cree',
+ ['crr'] = 'carrier',
+ ['crt'] = 'crimean tatar',
+ ['csl'] = 'church slavonic',
+ ['csy'] = 'czech',
+ ['dan'] = 'danish',
+ ['dar'] = 'dargwa',
+ ['dcr'] = 'woods cree',
+ ['deu'] = 'german',
+ ['dgr'] = 'dogri',
+ ['div'] = 'divehi',
+ ['djr'] = 'djerma',
+ ['dng'] = 'dangme',
+ ['dnk'] = 'dinka',
+ ['dri'] = 'dari',
+ ['dun'] = 'dungan',
+ ['dzn'] = 'dzongkha',
+ ['ebi'] = 'ebira',
+ ['ecr'] = 'eastern cree',
+ ['edo'] = 'edo',
+ ['efi'] = 'efik',
+ ['ell'] = 'greek',
+ ['eng'] = 'english',
+ ['erz'] = 'erzya',
+ ['esp'] = 'spanish',
+ ['eti'] = 'estonian',
+ ['euq'] = 'basque',
+ ['evk'] = 'evenki',
+ ['evn'] = 'even',
+ ['ewe'] = 'ewe',
+ ['fan'] = 'french antillean',
+ ['far'] = 'farsi',
+ ['fin'] = 'finnish',
+ ['fji'] = 'fijian',
+ ['fle'] = 'flemish',
+ ['fne'] = 'forest nenets',
+ ['fon'] = 'fon',
+ ['fos'] = 'faroese',
+ ['fra'] = 'french',
+ ['fri'] = 'frisian',
+ ['frl'] = 'friulian',
+ ['fta'] = 'futa',
+ ['ful'] = 'fulani',
+ ['gad'] = 'ga',
+ ['gae'] = 'gaelic',
+ ['gag'] = 'gagauz',
+ ['gal'] = 'galician',
+ ['gar'] = 'garshuni',
+ ['gaw'] = 'garhwali',
+ ['gez'] = "ge'ez",
+ ['gil'] = 'gilyak',
+ ['gmz'] = 'gumuz',
+ ['gon'] = 'gondi',
+ ['grn'] = 'greenlandic',
+ ['gro'] = 'garo',
+ ['gua'] = 'guarani',
+ ['guj'] = 'gujarati',
+ ['hai'] = 'haitian',
+ ['hal'] = 'halam',
+ ['har'] = 'harauti',
+ ['hau'] = 'hausa',
+ ['haw'] = 'hawaiin',
+ ['hbn'] = 'hammer-banna',
+ ['hil'] = 'hiligaynon',
+ ['hin'] = 'hindi',
+ ['hma'] = 'high mari',
+ ['hnd'] = 'hindko',
+ ['ho'] = 'ho',
+ ['hri'] = 'harari',
+ ['hrv'] = 'croatian',
+ ['hun'] = 'hungarian',
+ ['hye'] = 'armenian',
+ ['ibo'] = 'igbo',
+ ['ijo'] = 'ijo',
+ ['ilo'] = 'ilokano',
+ ['ind'] = 'indonesian',
+ ['ing'] = 'ingush',
+ ['inu'] = 'inuktitut',
+ ['iri'] = 'irish',
+ ['irt'] = 'irish traditional',
+ ['isl'] = 'icelandic',
+ ['ism'] = 'inari sami',
+ ['ita'] = 'italian',
+ ['iwr'] = 'hebrew',
+ ['jan'] = 'japanese',
+ ['jav'] = 'javanese',
+ ['jii'] = 'yiddish',
+ ['jud'] = 'judezmo',
+ ['jul'] = 'jula',
+ ['kab'] = 'kabardian',
+ ['kac'] = 'kachchi',
+ ['kal'] = 'kalenjin',
+ ['kan'] = 'kannada',
+ ['kar'] = 'karachay',
+ ['kat'] = 'georgian',
+ ['kaz'] = 'kazakh',
+ ['keb'] = 'kebena',
+ ['kge'] = 'khutsuri georgian',
+ ['kha'] = 'khakass',
+ ['khk'] = 'khanty-kazim',
+ ['khm'] = 'khmer',
+ ['khs'] = 'khanty-shurishkar',
+ ['khv'] = 'khanty-vakhi',
+ ['khw'] = 'khowar',
+ ['kik'] = 'kikuyu',
+ ['kir'] = 'kirghiz',
+ ['kis'] = 'kisii',
+ ['kkn'] = 'kokni',
+ ['klm'] = 'kalmyk',
+ ['kmb'] = 'kamba',
+ ['kmn'] = 'kumaoni',
+ ['kmo'] = 'komo',
+ ['kms'] = 'komso',
+ ['knr'] = 'kanuri',
+ ['kod'] = 'kodagu',
+ ['koh'] = 'korean old hangul',
+ ['kok'] = 'konkani',
+ ['kon'] = 'kikongo',
+ ['kop'] = 'komi-permyak',
+ ['kor'] = 'korean',
+ ['koz'] = 'komi-zyrian',
+ ['kpl'] = 'kpelle',
+ ['kri'] = 'krio',
+ ['krk'] = 'karakalpak',
+ ['krl'] = 'karelian',
+ ['krm'] = 'karaim',
+ ['krn'] = 'karen',
+ ['krt'] = 'koorete',
+ ['ksh'] = 'kashmiri',
+ ['ksi'] = 'khasi',
+ ['ksm'] = 'kildin sami',
+ ['kui'] = 'kui',
+ ['kul'] = 'kulvi',
+ ['kum'] = 'kumyk',
+ ['kur'] = 'kurdish',
+ ['kuu'] = 'kurukh',
+ ['kuy'] = 'kuy',
+ ['kyk'] = 'koryak',
+ ['lad'] = 'ladin',
+ ['lah'] = 'lahuli',
+ ['lak'] = 'lak',
+ ['lam'] = 'lambani',
+ ['lao'] = 'lao',
+ ['lat'] = 'latin',
+ ['laz'] = 'laz',
+ ['lcr'] = 'l-cree',
+ ['ldk'] = 'ladakhi',
+ ['lez'] = 'lezgi',
+ ['lin'] = 'lingala',
+ ['lma'] = 'low mari',
+ ['lmb'] = 'limbu',
+ ['lmw'] = 'lomwe',
+ ['lsb'] = 'lower sorbian',
+ ['lsm'] = 'lule sami',
+ ['lth'] = 'lithuanian',
+ ['ltz'] = 'luxembourgish',
+ ['lub'] = 'luba',
+ ['lug'] = 'luganda',
+ ['luh'] = 'luhya',
+ ['luo'] = 'luo',
+ ['lvi'] = 'latvian',
+ ['maj'] = 'majang',
+ ['mak'] = 'makua',
+ ['mal'] = 'malayalam traditional',
+ ['man'] = 'mansi',
+ ['map'] = 'mapudungun',
+ ['mar'] = 'marathi',
+ ['maw'] = 'marwari',
+ ['mbn'] = 'mbundu',
+ ['mch'] = 'manchu',
+ ['mcr'] = 'moose cree',
+ ['mde'] = 'mende',
+ ['men'] = "me'en",
+ ['miz'] = 'mizo',
+ ['mkd'] = 'macedonian',
+ ['mle'] = 'male',
+ ['mlg'] = 'malagasy',
+ ['mln'] = 'malinke',
+ ['mlr'] = 'malayalam reformed',
+ ['mly'] = 'malay',
+ ['mnd'] = 'mandinka',
+ ['mng'] = 'mongolian',
+ ['mni'] = 'manipuri',
+ ['mnk'] = 'maninka',
+ ['mnx'] = 'manx gaelic',
+ ['moh'] = 'mohawk',
+ ['mok'] = 'moksha',
+ ['mol'] = 'moldavian',
+ ['mon'] = 'mon',
+ ['mor'] = 'moroccan',
+ ['mri'] = 'maori',
+ ['mth'] = 'maithili',
+ ['mts'] = 'maltese',
+ ['mun'] = 'mundari',
+ ['nag'] = 'naga-assamese',
+ ['nan'] = 'nanai',
+ ['nas'] = 'naskapi',
+ ['ncr'] = 'n-cree',
+ ['ndb'] = 'ndebele',
+ ['ndg'] = 'ndonga',
+ ['nep'] = 'nepali',
+ ['new'] = 'newari',
+ ['ngr'] = 'nagari',
+ ['nhc'] = 'norway house cree',
+ ['nis'] = 'nisi',
+ ['niu'] = 'niuean',
+ ['nkl'] = 'nkole',
+ ['nko'] = "n'ko",
+ ['nld'] = 'dutch',
+ ['nog'] = 'nogai',
+ ['nor'] = 'norwegian',
+ ['nsm'] = 'northern sami',
+ ['nta'] = 'northern tai',
+ ['nto'] = 'esperanto',
+ ['nyn'] = 'nynorsk',
+ ['oci'] = 'occitan',
+ ['ocr'] = 'oji-cree',
+ ['ojb'] = 'ojibway',
+ ['ori'] = 'oriya',
+ ['oro'] = 'oromo',
+ ['oss'] = 'ossetian',
+ ['paa'] = 'palestinian aramaic',
+ ['pal'] = 'pali',
+ ['pan'] = 'punjabi',
+ ['pap'] = 'palpa',
+ ['pas'] = 'pashto',
+ ['pgr'] = 'polytonic greek',
+ ['pil'] = 'pilipino',
+ ['plg'] = 'palaung',
+ ['plk'] = 'polish',
+ ['pro'] = 'provencal',
+ ['ptg'] = 'portuguese',
+ ['qin'] = 'chin',
+ ['raj'] = 'rajasthani',
+ ['rbu'] = 'russian buriat',
+ ['rcr'] = 'r-cree',
+ ['ria'] = 'riang',
+ ['rms'] = 'rhaeto-romanic',
+ ['rom'] = 'romanian',
+ ['roy'] = 'romany',
+ ['rsy'] = 'rusyn',
+ ['rua'] = 'ruanda',
+ ['rus'] = 'russian',
+ ['sad'] = 'sadri',
+ ['san'] = 'sanskrit',
+ ['sat'] = 'santali',
+ ['say'] = 'sayisi',
+ ['sek'] = 'sekota',
+ ['sel'] = 'selkup',
+ ['sgo'] = 'sango',
+ ['shn'] = 'shan',
+ ['sib'] = 'sibe',
+ ['sid'] = 'sidamo',
+ ['sig'] = 'silte gurage',
+ ['sks'] = 'skolt sami',
+ ['sky'] = 'slovak',
+ ['sla'] = 'slavey',
+ ['slv'] = 'slovenian',
+ ['sml'] = 'somali',
+ ['smo'] = 'samoan',
+ ['sna'] = 'sena',
+ ['snd'] = 'sindhi',
+ ['snh'] = 'sinhalese',
+ ['snk'] = 'soninke',
+ ['sog'] = 'sodo gurage',
+ ['sot'] = 'sotho',
+ ['sqi'] = 'albanian',
+ ['srb'] = 'serbian',
+ ['srk'] = 'saraiki',
+ ['srr'] = 'serer',
+ ['ssl'] = 'south slavey',
+ ['ssm'] = 'southern sami',
+ ['sur'] = 'suri',
+ ['sva'] = 'svan',
+ ['sve'] = 'swedish',
+ ['swa'] = 'swadaya aramaic',
+ ['swk'] = 'swahili',
+ ['swz'] = 'swazi',
+ ['sxt'] = 'sutu',
+ ['syr'] = 'syriac',
+ ['tab'] = 'tabasaran',
+ ['taj'] = 'tajiki',
+ ['tam'] = 'tamil',
+ ['tat'] = 'tatar',
+ ['tcr'] = 'th-cree',
+ ['tel'] = 'telugu',
+ ['tgn'] = 'tongan',
+ ['tgr'] = 'tigre',
+ ['tgy'] = 'tigrinya',
+ ['tha'] = 'thai',
+ ['tht'] = 'tahitian',
+ ['tib'] = 'tibetan',
+ ['tkm'] = 'turkmen',
+ ['tmn'] = 'temne',
+ ['tna'] = 'tswana',
+ ['tne'] = 'tundra nenets',
+ ['tng'] = 'tonga',
+ ['tod'] = 'todo',
+ ['trk'] = 'turkish',
+ ['tsg'] = 'tsonga',
+ ['tua'] = 'turoyo aramaic',
+ ['tul'] = 'tulu',
+ ['tuv'] = 'tuvin',
+ ['twi'] = 'twi',
+ ['udm'] = 'udmurt',
+ ['ukr'] = 'ukrainian',
+ ['urd'] = 'urdu',
+ ['usb'] = 'upper sorbian',
+ ['uyg'] = 'uyghur',
+ ['uzb'] = 'uzbek',
+ ['ven'] = 'venda',
+ ['vit'] = 'vietnamese',
+ ['wa' ] = 'wa',
+ ['wag'] = 'wagdi',
+ ['wcr'] = 'west-cree',
+ ['wel'] = 'welsh',
+ ['wlf'] = 'wolof',
+ ['xbd'] = 'tai lue',
+ ['xhs'] = 'xhosa',
+ ['yak'] = 'yakut',
+ ['yba'] = 'yoruba',
+ ['ycr'] = 'y-cree',
+ ['yic'] = 'yi classic',
+ ['yim'] = 'yi modern',
+ ['zhh'] = 'chinese hong kong',
+ ['zhp'] = 'chinese phonetic',
+ ['zhs'] = 'chinese simplified',
+ ['zht'] = 'chinese traditional',
+ ['znd'] = 'zande',
+ ['zul'] = 'zulu'
}
-otf.tables.features = {
- ['aalt'] = 'Access All Alternates',
- ['abvf'] = 'Above-Base Forms',
- ['abvm'] = 'Above-Base Mark Positioning',
- ['abvs'] = 'Above-Base Substitutions',
- ['afrc'] = 'Alternative Fractions',
- ['akhn'] = 'Akhands',
- ['blwf'] = 'Below-Base Forms',
- ['blwm'] = 'Below-Base Mark Positioning',
- ['blws'] = 'Below-Base Substitutions',
- ['c2pc'] = 'Petite Capitals From Capitals',
- ['c2sc'] = 'Small Capitals From Capitals',
- ['calt'] = 'Contextual Alternates',
- ['case'] = 'Case-Sensitive Forms',
- ['ccmp'] = 'Glyph Composition/Decomposition',
- ['cjct'] = 'Conjunct Forms',
- ['clig'] = 'Contextual Ligatures',
- ['cpsp'] = 'Capital Spacing',
- ['cswh'] = 'Contextual Swash',
- ['curs'] = 'Cursive Positioning',
- ['dflt'] = 'Default Processing',
- ['dist'] = 'Distances',
- ['dlig'] = 'Discretionary Ligatures',
- ['dnom'] = 'Denominators',
- ['dtls'] = 'Dotless Forms', -- math
- ['expt'] = 'Expert Forms',
- ['falt'] = 'Final glyph Alternates',
- ['fin2'] = 'Terminal Forms #2',
- ['fin3'] = 'Terminal Forms #3',
- ['fina'] = 'Terminal Forms',
- ['flac'] = 'Flattened Accents Over Capitals', -- math
- ['frac'] = 'Fractions',
- ['fwid'] = 'Full Width',
- ['half'] = 'Half Forms',
- ['haln'] = 'Halant Forms',
- ['halt'] = 'Alternate Half Width',
- ['hist'] = 'Historical Forms',
- ['hkna'] = 'Horizontal Kana Alternates',
- ['hlig'] = 'Historical Ligatures',
- ['hngl'] = 'Hangul',
- ['hojo'] = 'Hojo Kanji Forms',
- ['hwid'] = 'Half Width',
- ['init'] = 'Initial Forms',
- ['isol'] = 'Isolated Forms',
- ['ital'] = 'Italics',
- ['jalt'] = 'Justification Alternatives',
- ['jp04'] = 'JIS2004 Forms',
- ['jp78'] = 'JIS78 Forms',
- ['jp83'] = 'JIS83 Forms',
- ['jp90'] = 'JIS90 Forms',
- ['kern'] = 'Kerning',
- ['lfbd'] = 'Left Bounds',
- ['liga'] = 'Standard Ligatures',
- ['ljmo'] = 'Leading Jamo Forms',
- ['lnum'] = 'Lining Figures',
- ['locl'] = 'Localized Forms',
- ['mark'] = 'Mark Positioning',
- ['med2'] = 'Medial Forms #2',
- ['medi'] = 'Medial Forms',
- ['mgrk'] = 'Mathematical Greek',
- ['mkmk'] = 'Mark to Mark Positioning',
- ['mset'] = 'Mark Positioning via Substitution',
- ['nalt'] = 'Alternate Annotation Forms',
- ['nlck'] = 'NLC Kanji Forms',
- ['nukt'] = 'Nukta Forms',
- ['numr'] = 'Numerators',
- ['onum'] = 'Old Style Figures',
- ['opbd'] = 'Optical Bounds',
- ['ordn'] = 'Ordinals',
- ['ornm'] = 'Ornaments',
- ['palt'] = 'Proportional Alternate Width',
- ['pcap'] = 'Petite Capitals',
- ['pnum'] = 'Proportional Figures',
- ['pref'] = 'Pre-base Forms',
- ['pres'] = 'Pre-base Substitutions',
- ['pstf'] = 'Post-base Forms',
- ['psts'] = 'Post-base Substitutions',
- ['pwid'] = 'Proportional Widths',
- ['qwid'] = 'Quarter Widths',
- ['rand'] = 'Randomize',
- ['rkrf'] = 'Rakar Forms',
- ['rlig'] = 'Required Ligatures',
- ['rphf'] = 'Reph Form',
- ['rtbd'] = 'Right Bounds',
- ['rtla'] = 'Right-To-Left Alternates',
- ['rtlm'] = 'Right To Left Math', -- math
- ['ruby'] = 'Ruby Notation Forms',
- ['salt'] = 'Stylistic Alternates',
- ['sinf'] = 'Scientific Inferiors',
- ['size'] = 'Optical Size',
- ['smcp'] = 'Small Capitals',
- ['smpl'] = 'Simplified Forms',
- ['ss01'] = 'Stylistic Set 1',
- ['ss02'] = 'Stylistic Set 2',
- ['ss03'] = 'Stylistic Set 3',
- ['ss04'] = 'Stylistic Set 4',
- ['ss05'] = 'Stylistic Set 5',
- ['ss06'] = 'Stylistic Set 6',
- ['ss07'] = 'Stylistic Set 7',
- ['ss08'] = 'Stylistic Set 8',
- ['ss09'] = 'Stylistic Set 9',
- ['ss10'] = 'Stylistic Set 10',
- ['ss11'] = 'Stylistic Set 11',
- ['ss12'] = 'Stylistic Set 12',
- ['ss13'] = 'Stylistic Set 13',
- ['ss14'] = 'Stylistic Set 14',
- ['ss15'] = 'Stylistic Set 15',
- ['ss16'] = 'Stylistic Set 16',
- ['ss17'] = 'Stylistic Set 17',
- ['ss18'] = 'Stylistic Set 18',
- ['ss19'] = 'Stylistic Set 19',
- ['ss20'] = 'Stylistic Set 20',
- ['ssty'] = 'Script Style', -- math
- ['subs'] = 'Subscript',
- ['sups'] = 'Superscript',
- ['swsh'] = 'Swash',
- ['titl'] = 'Titling',
- ['tjmo'] = 'Trailing Jamo Forms',
- ['tnam'] = 'Traditional Name Forms',
- ['tnum'] = 'Tabular Figures',
- ['trad'] = 'Traditional Forms',
- ['twid'] = 'Third Widths',
- ['unic'] = 'Unicase',
- ['valt'] = 'Alternate Vertical Metrics',
- ['vatu'] = 'Vattu Variants',
- ['vert'] = 'Vertical Writing',
- ['vhal'] = 'Alternate Vertical Half Metrics',
- ['vjmo'] = 'Vowel Jamo Forms',
- ['vkna'] = 'Vertical Kana Alternates',
- ['vkrn'] = 'Vertical Kerning',
- ['vpal'] = 'Proportional Alternate Vertical Metrics',
- ['vrt2'] = 'Vertical Rotation',
- ['zero'] = 'Slashed Zero',
+local features = allocate {
+ ['aalt'] = 'access all alternates',
+ ['abvf'] = 'above-base forms',
+ ['abvm'] = 'above-base mark positioning',
+ ['abvs'] = 'above-base substitutions',
+ ['afrc'] = 'alternative fractions',
+ ['akhn'] = 'akhands',
+ ['blwf'] = 'below-base forms',
+ ['blwm'] = 'below-base mark positioning',
+ ['blws'] = 'below-base substitutions',
+ ['c2pc'] = 'petite capitals from capitals',
+ ['c2sc'] = 'small capitals from capitals',
+ ['calt'] = 'contextual alternates',
+ ['case'] = 'case-sensitive forms',
+ ['ccmp'] = 'glyph composition/decomposition',
+ ['cjct'] = 'conjunct forms',
+ ['clig'] = 'contextual ligatures',
+ ['cpsp'] = 'capital spacing',
+ ['cswh'] = 'contextual swash',
+ ['curs'] = 'cursive positioning',
+ ['dflt'] = 'default processing',
+ ['dist'] = 'distances',
+ ['dlig'] = 'discretionary ligatures',
+ ['dnom'] = 'denominators',
+ ['dtls'] = 'dotless forms', -- math
+ ['expt'] = 'expert forms',
+ ['falt'] = 'final glyph alternates',
+ ['fin2'] = 'terminal forms #2',
+ ['fin3'] = 'terminal forms #3',
+ ['fina'] = 'terminal forms',
+ ['flac'] = 'flattened accents over capitals', -- math
+ ['frac'] = 'fractions',
+ ['fwid'] = 'full width',
+ ['half'] = 'half forms',
+ ['haln'] = 'halant forms',
+ ['halt'] = 'alternate half width',
+ ['hist'] = 'historical forms',
+ ['hkna'] = 'horizontal kana alternates',
+ ['hlig'] = 'historical ligatures',
+ ['hngl'] = 'hangul',
+ ['hojo'] = 'hojo kanji forms',
+ ['hwid'] = 'half width',
+ ['init'] = 'initial forms',
+ ['isol'] = 'isolated forms',
+ ['ital'] = 'italics',
+ ['jalt'] = 'justification alternatives',
+ ['jp04'] = 'jis2004 forms',
+ ['jp78'] = 'jis78 forms',
+ ['jp83'] = 'jis83 forms',
+ ['jp90'] = 'jis90 forms',
+ ['kern'] = 'kerning',
+ ['lfbd'] = 'left bounds',
+ ['liga'] = 'standard ligatures',
+ ['ljmo'] = 'leading jamo forms',
+ ['lnum'] = 'lining figures',
+ ['locl'] = 'localized forms',
+ ['mark'] = 'mark positioning',
+ ['med2'] = 'medial forms #2',
+ ['medi'] = 'medial forms',
+ ['mgrk'] = 'mathematical greek',
+ ['mkmk'] = 'mark to mark positioning',
+ ['mset'] = 'mark positioning via substitution',
+ ['nalt'] = 'alternate annotation forms',
+ ['nlck'] = 'nlc kanji forms',
+ ['nukt'] = 'nukta forms',
+ ['numr'] = 'numerators',
+ ['onum'] = 'old style figures',
+ ['opbd'] = 'optical bounds',
+ ['ordn'] = 'ordinals',
+ ['ornm'] = 'ornaments',
+ ['palt'] = 'proportional alternate width',
+ ['pcap'] = 'petite capitals',
+ ['pnum'] = 'proportional figures',
+ ['pref'] = 'pre-base forms',
+ ['pres'] = 'pre-base substitutions',
+ ['pstf'] = 'post-base forms',
+ ['psts'] = 'post-base substitutions',
+ ['pwid'] = 'proportional widths',
+ ['qwid'] = 'quarter widths',
+ ['rand'] = 'randomize',
+ ['rkrf'] = 'rakar forms',
+ ['rlig'] = 'required ligatures',
+ ['rphf'] = 'reph form',
+ ['rtbd'] = 'right bounds',
+ ['rtla'] = 'right-to-left alternates',
+ ['rtlm'] = 'right to left math', -- math
+ ['ruby'] = 'ruby notation forms',
+ ['salt'] = 'stylistic alternates',
+ ['sinf'] = 'scientific inferiors',
+ ['size'] = 'optical size',
+ ['smcp'] = 'small capitals',
+ ['smpl'] = 'simplified forms',
+ ['ss01'] = 'stylistic set 1',
+ ['ss02'] = 'stylistic set 2',
+ ['ss03'] = 'stylistic set 3',
+ ['ss04'] = 'stylistic set 4',
+ ['ss05'] = 'stylistic set 5',
+ ['ss06'] = 'stylistic set 6',
+ ['ss07'] = 'stylistic set 7',
+ ['ss08'] = 'stylistic set 8',
+ ['ss09'] = 'stylistic set 9',
+ ['ss10'] = 'stylistic set 10',
+ ['ss11'] = 'stylistic set 11',
+ ['ss12'] = 'stylistic set 12',
+ ['ss13'] = 'stylistic set 13',
+ ['ss14'] = 'stylistic set 14',
+ ['ss15'] = 'stylistic set 15',
+ ['ss16'] = 'stylistic set 16',
+ ['ss17'] = 'stylistic set 17',
+ ['ss18'] = 'stylistic set 18',
+ ['ss19'] = 'stylistic set 19',
+ ['ss20'] = 'stylistic set 20',
+ ['ssty'] = 'script style', -- math
+ ['subs'] = 'subscript',
+ ['sups'] = 'superscript',
+ ['swsh'] = 'swash',
+ ['titl'] = 'titling',
+ ['tjmo'] = 'trailing jamo forms',
+ ['tnam'] = 'traditional name forms',
+ ['tnum'] = 'tabular figures',
+ ['trad'] = 'traditional forms',
+ ['twid'] = 'third widths',
+ ['unic'] = 'unicase',
+ ['valt'] = 'alternate vertical metrics',
+ ['vatu'] = 'vattu variants',
+ ['vert'] = 'vertical writing',
+ ['vhal'] = 'alternate vertical half metrics',
+ ['vjmo'] = 'vowel jamo forms',
+ ['vkna'] = 'vertical kana alternates',
+ ['vkrn'] = 'vertical kerning',
+ ['vpal'] = 'proportional alternate vertical metrics',
+ ['vrt2'] = 'vertical rotation',
+ ['zero'] = 'slashed zero',
+
+ ['trep'] = 'traditional tex replacements',
+ ['tlig'] = 'traditional tex ligatures',
- ['trep'] = 'Traditional TeX Replacements',
- ['tlig'] = 'Traditional TeX Ligatures',
+ ['ss'] = 'stylistic set %s',
}
-otf.tables.baselines = {
- ['hang'] = 'Hanging baseline',
- ['icfb'] = 'Ideographic character face bottom edge baseline',
- ['icft'] = 'Ideographic character face tope edige baseline',
- ['ideo'] = 'Ideographic em-box bottom edge baseline',
- ['idtp'] = 'Ideographic em-box top edge baseline',
- ['math'] = 'Mathmatical centered baseline',
- ['romn'] = 'Roman baseline'
+local baselines = allocate {
+ ['hang'] = 'hanging baseline',
+ ['icfb'] = 'ideographic character face bottom edge baseline',
+ ['icft'] = 'ideographic character face tope edige baseline',
+ ['ideo'] = 'ideographic em-box bottom edge baseline',
+ ['idtp'] = 'ideographic em-box top edge baseline',
+ ['math'] = 'mathmatical centered baseline',
+ ['romn'] = 'roman baseline'
}
--- can be sped up by local tables
+tables.scripts = scripts
+tables.languages = languages
+tables.features = features
+tables.baselines = baselines
-function otf.tables.to_tag(id)
- return stringformat("%4s",lower(id))
+if otffeatures.features then
+ for k, v in next, otffeatures.features do
+ features[k] = v
+ end
+ otffeatures.features = features
end
-local function resolve(tab,id)
- if tab and id then
- id = lower(id)
- return tab[id] or tab[gsub(id," ","")] or tab['dflt'] or ''
- else
- return "unknown"
+local function swapped(h)
+ local r = { }
+ for k, v in next, h do
+ r[gsub(v,"[^a-z0-9]","")] = k -- is already lower
end
+ return r
end
-function otf.meanings.script(id)
- return resolve(otf.tables.scripts,id)
-end
-function otf.meanings.language(id)
- return resolve(otf.tables.languages,id)
-end
-function otf.meanings.feature(id)
- return resolve(otf.tables.features,id)
-end
-function otf.meanings.baseline(id)
- return resolve(otf.tables.baselines,id)
+local verbosescripts = allocate(swapped(scripts ))
+local verboselanguages = allocate(swapped(languages))
+local verbosefeatures = allocate(swapped(features ))
+local verbosebaselines = allocate(swapped(baselines))
+
+-- lets forget about trailing spaces
+
+local function resolve(t,k)
+ if k then
+ k = gsub(lower(k),"[^a-z0-9]","")
+ local v = rawget(t,k)
+ if v then
+ return v
+ end
+ end
+ return "dflt"
end
-otf.tables.to_scripts = table.reverse_hash(otf.tables.scripts )
-otf.tables.to_languages = table.reverse_hash(otf.tables.languages)
-otf.tables.to_features = table.reverse_hash(otf.tables.features )
+setmetatableindex(verbosescripts, resolve)
+setmetatableindex(verboselanguages, resolve)
+setmetatableindex(verbosefeatures, resolve)
+setmetatableindex(verbosebaselines, resolve)
-local scripts = otf.tables.scripts
-local languages = otf.tables.languages
-local features = otf.tables.features
+local function resolve(t,k)
+ if k then
+ k = lower(k)
+ local v = rawget(t,k) or rawget(t,gsub(k," ",""))
+ if v then
+ return v
+ end
+ end
+ return "dflt"
+end
-local to_scripts = otf.tables.to_scripts
-local to_languages = otf.tables.to_languages
-local to_features = otf.tables.to_features
+setmetatableindex(scripts, resolve)
+setmetatableindex(scripts, resolve)
+setmetatableindex(languages, resolve)
-for k, v in next, to_features do
- local stripped = gsub(k,"%-"," ")
- to_features[stripped] = v
- local stripped = gsub(k,"[^a-zA-Z0-9]","")
- to_features[stripped] = v
+setmetatablenewindex(languages, "ignore")
+setmetatablenewindex(baselines, "ignore")
+setmetatablenewindex(baselines, "ignore")
+
+local function resolve(t,k)
+ if k then
+ k = lower(k)
+ local v = rawget(t,k)
+ if v then
+ return v
+ end
+ k = gsub(k," ","")
+ local v = rawget(t,k)
+ if v then
+ return v
+ end
+ local tag, dd = match(k,"(..)(%d+)")
+ if tag and dd then
+ local v = rawget(t,tag)
+ if v then
+ return format(v,tonumber(dd))
+ end
+ end
+ end
+ return "dflt"
end
-for k, v in next, to_features do
- to_features[lower(k)] = v
+
+setmetatableindex(features, resolve)
+
+local function assign(t,k,v)
+ if k then
+ v = lower(v)
+ rawset(t,k,v)
+ rawset(features,gsub(v,"[^a-z0-9]",""),k)
+ end
end
-otf.meanings.checkers = {
+setmetatablenewindex(features, assign)
+
+local checkers = {
rand = function(v)
return v and "random"
end
}
-local checkers = otf.meanings.checkers
-
-function otf.meanings.normalize(features)
- local h = { }
- for k,v in next, features do
- k = lower(k)
- if k == "language" or k == "lang" then
- v = gsub(lower(v),"[^a-z0-9%-]","")
- k = language
- if not languages[v] then
- h.language = to_languages[v] or "dflt"
- else
- h.language = v
- end
- elseif k == "script" then
- v = gsub(lower(v),"[^a-z0-9%-]","")
- if not scripts[v] then
- h.script = to_scripts[v] or "dflt"
- else
- h.script = v
- end
- else
- if type(v) == "string" then
- local b = v:is_boolean()
- if type(b) == "nil" then
- v = tonumber(v) or lower(v)
+function otf.features.normalize(features) -- no longer 'lang'
+ if features then
+ local h = { }
+ for k,v in next, features do
+ k = lower(k)
+ if k == "language" then
+ v = gsub(lower(v),"[^a-z0-9]","")
+ if rawget(languages,v) then
+ h.language = v
+ else
+ h.language = rawget(verboselanguages,v) or "dflt"
+ end
+ elseif k == "script" then
+ v = gsub(lower(v),"[^a-z0-9]","")
+ if rawget(scripts,v) then
+ h.script = v
else
- v = b
+ h.script = rawget(verbosescripts,v) or "dflt"
end
+ else
+ if type(v) == "string" then
+ local b = is_boolean(v)
+ if type(b) == "nil" then
+ v = tonumber(v) or lower(v)
+ else
+ v = b
+ end
+ end
+ if not rawget(features,k) then
+ k = rawget(verbosefeatures,k) or k
+ end
+ local c = checkers[k]
+ h[k] = c and c(v) or v
end
- k = to_features[k] or k
- local c = checkers[k]
- h[k] = c and c(v) or v
end
+ return h
end
- return h
end
+--~ table.print(otf.features.normalize({ language = "dutch", liga = "yes", ss99 = true, aalt = 3, abcd = "yes" } ))
+
-- When I feel the need ...
---~ otf.tables.aat = {
+--~ tables.aat = {
--~ [ 0] = {
--~ name = "allTypographicFeaturesType",
--~ [ 0] = "allTypeFeaturesOnSelector",
diff --git a/Master/texmf-dist/tex/context/base/font-pat.lua b/Master/texmf-dist/tex/context/base/font-pat.lua
index 6aba4d47e3d..b91502c74e5 100644
--- a/Master/texmf-dist/tex/context/base/font-pat.lua
+++ b/Master/texmf-dist/tex/context/base/font-pat.lua
@@ -6,63 +6,31 @@ if not modules then modules = { } end modules ['font-pat'] = {
license = "see context related readme files"
}
-local match, lower, find = string.match, string.lower, string.find
+local match, lower = string.match, string.lower
-local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
-
--- this will become a per font patch file
---
-- older versions of latin modern didn't have the designsize set
-- so for them we get it from the name
+-- reporter moved to elsewhere
-local patches = fonts.otf.enhancers.patches
+local fonts = fonts
+local otf = fonts.handlers.otf
+local patches = otf.enhancers.patches
+local register = patches.register
+local report = patches.report
local function patch(data,filename)
if data.design_size == 0 then
local ds = match(file.basename(lower(filename)),"(%d+)")
if ds then
- if trace_loading then
- logs.report("load otf","patching design size (%s)",ds)
- end
+ report("design size (%s)",ds)
data.design_size = tonumber(ds) * 10
end
end
- local uni_to_ind = data.map.map
- if not uni_to_ind[0x391] then
- -- beware, this is a hack, features for latin often don't apply to greek
- -- but lm has not much features anyway (and only greek for math)
- if trace_loading then
- logs.report("load otf","adding 13 greek capitals")
- end
- uni_to_ind[0x391] = uni_to_ind[0x41]
- uni_to_ind[0x392] = uni_to_ind[0x42]
- uni_to_ind[0x395] = uni_to_ind[0x45]
- uni_to_ind[0x397] = uni_to_ind[0x48]
- uni_to_ind[0x399] = uni_to_ind[0x49]
- uni_to_ind[0x39A] = uni_to_ind[0x4B]
- uni_to_ind[0x39C] = uni_to_ind[0x4D]
- uni_to_ind[0x39D] = uni_to_ind[0x4E]
- uni_to_ind[0x39F] = uni_to_ind[0x4F]
- uni_to_ind[0x3A1] = uni_to_ind[0x52]
- uni_to_ind[0x3A4] = uni_to_ind[0x54]
- uni_to_ind[0x3A7] = uni_to_ind[0x58]
- uni_to_ind[0x396] = uni_to_ind[0x5A]
- end
- -- better make this into a feature
- --
- -- local glyphs = data.glyphs
- -- for i=0x300,0x36F do
- -- local c = glyphs[uni_to_ind[i]]
- -- if c and c.width == 0 then
- -- local boundingbox = c.boundingbox
- -- c.width = boundingbox[3] - boundingbox[1]
- -- end
- -- end
end
-patches["^lmroman"] = patch
-patches["^lmsans"] = patch
-patches["^lmtypewriter"] = patch
+register("after","migrate metadata","^lmroman", patch)
+register("after","migrate metadata","^lmsans", patch)
+register("after","migrate metadata","^lmtypewriter",patch)
-- for some reason (either it's a bug in the font, or it's
-- a problem in the library) the palatino arabic fonts don't
@@ -74,18 +42,18 @@ local function patch(data,filename)
for k=1,#gpos do
local v = gpos[k]
if not v.features and v.type == "gpos_mark2mark" then
- if trace_loading then
- logs.report("load otf","patching mkmk feature (name: %s)", v.name or "?")
- end
+ report("mkmk feature (name: %s)", v.name or "?")
v.features = {
{
scripts = {
- {
- langs = { "ARA ", "FAR ", "URD ", "dflt" },
- script = "arab",
- },
+ arab = {
+ ["ARA "] = true,
+ ["FAR "] = true,
+ ["URD "] = true,
+ ["dflt"] = true,
+ }
},
- tag = "mkmk"
+ tag = "mkmk",
}
}
end
@@ -93,34 +61,49 @@ local function patch(data,filename)
end
end
-patches["palatino.*arabic"] = patch
+register("after","rehash features","palatino.*arabic",patch)
-local function patch_domh(data,filename,threshold)
- local m = data.math
- if m then
- local d = m.DisplayOperatorMinHeight or 0
- if d < threshold then
- if trace_loading then
- logs.report("load otf","patching DisplayOperatorMinHeight(%s -> %s)",d,threshold)
- end
- m.DisplayOperatorMinHeight = threshold
- end
- end
- if tex.luatexversion < 48 then
- for _, g in next, data.glyphs do
- local name = g.name
- if find(name,"^integral$") or find(name,"^integral%.vsize") then
- local width, italic = g.width or 0, g.italic_correction or 0
- local newwidth = width - italic
- if trace_loading then
- logs.report("load otf","patching width of %s: %s (width) - %s (italic) = %s",name,width,italic,newwidth)
- end
- g.width = newwidth
- end
- end
- end
-end
-
-patches["cambria"] = function(data,filename) patch_domh(data,filename,2800) end
-patches["cambmath"] = function(data,filename) patch_domh(data,filename,2800) end
-patches["asana"] = function(data,filename) patch_domh(data,filename,1350) end
+-- -- this code is now in lm-math.lfg
+--
+-- local function patch(data,filename)
+-- local uni_to_ind = data.map.map
+-- if not uni_to_ind[0x391] then
+-- -- beware, this is a hack, features for latin often don't apply to greek
+-- -- but lm has not much features anyway (and only greek for math)
+-- report("adding 13 greek capitals")
+-- uni_to_ind[0x391] = uni_to_ind[0x41]
+-- uni_to_ind[0x392] = uni_to_ind[0x42]
+-- uni_to_ind[0x395] = uni_to_ind[0x45]
+-- uni_to_ind[0x397] = uni_to_ind[0x48]
+-- uni_to_ind[0x399] = uni_to_ind[0x49]
+-- uni_to_ind[0x39A] = uni_to_ind[0x4B]
+-- uni_to_ind[0x39C] = uni_to_ind[0x4D]
+-- uni_to_ind[0x39D] = uni_to_ind[0x4E]
+-- uni_to_ind[0x39F] = uni_to_ind[0x4F]
+-- uni_to_ind[0x3A1] = uni_to_ind[0x52]
+-- uni_to_ind[0x3A4] = uni_to_ind[0x54]
+-- uni_to_ind[0x3A7] = uni_to_ind[0x58]
+-- uni_to_ind[0x396] = uni_to_ind[0x5A]
+-- end
+-- end
+--
+-- register("after","prepare glyphs","^lmroman", patch)
+-- register("after","prepare glyphs","^lmsans", patch)
+-- register("after","prepare glyphs","^lmtypewriter",patch)
+--
+-- -- this code is now in cambria-math.lfg and asana-math.lfg
+--
+-- local function patch_domh(data,filename,threshold)
+-- local m = data.metadata.math
+-- if m then
+-- local d = m.DisplayOperatorMinHeight or 0
+-- if d < threshold then
+-- report("DisplayOperatorMinHeight(%s -> %s)",d,threshold)
+-- m.DisplayOperatorMinHeight = threshold
+-- end
+-- end
+-- end
+--
+-- register("after","check math parameters","cambria", function(data,filename) patch_domh(data,filename,2800) end)
+-- register("after","check math parameters","cambmath",function(data,filename) patch_domh(data,filename,2800) end)
+-- register("after","check math parameters","asana", function(data,filename) patch_domh(data,filename,1350) end)
diff --git a/Master/texmf-dist/tex/context/base/font-run.mkiv b/Master/texmf-dist/tex/context/base/font-run.mkiv
index aad6bebe88e..7a6764ac8a0 100644
--- a/Master/texmf-dist/tex/context/base/font-run.mkiv
+++ b/Master/texmf-dist/tex/context/base/font-run.mkiv
@@ -140,7 +140,7 @@
\ifinsidefloat\else\startbaselinecorrection\fi
\vbox\bgroup
\forgetall
- \startoverlay
+ \startoverlay % easier in cld
{\vbox
{\tf \setstrut \dummy
\offinterlineskip
@@ -203,33 +203,57 @@
\ifinsidefloat\else\stopbaselinecorrection\fi
\egroup}
-\gdef\showfontstyle
- {\dotripleempty\doshowfontstyle}
+% \showfontstyle[modern][rm][tf][all] % #2, #3 and #4 can be 'all'
-\gdef\doshowfontstyle[#1][#2][#3]%
- {\ifthirdargument
- \bgroup
- \raggedright
- \switchtobodyfont[#1]
- \def\dodocommand##1##2%
- {\starttextrule{\tttf #1 ##1 ##2}
- \nobreak \getvalue{##2}%
- \dorecurse{255}
- {\iffontchar\font\recurselevel\relax
- \char\recurselevel\relax\space
- \fi}
- \par \nobreak
- \stoptextrule}
- \def\docommand##1%
- {\getvalue{##1}\processcommacommand[#3]{\dodocommand{##1}}}
- \processcommalist[#2]\docommand
- \egroup
- \else\ifsecondargument
- \showfontstyle[#1][#2][\fontalternativelist]% math is gone
- \else
- \showfontstyle[#1][\c!rm]\showfontstyle[#1][\c!ss]
- \showfontstyle[#1][\c!tt]\showfontstyle[#1][\c!mm]
- \fi\fi}
+\gdef\showfontstyle {\dodoubleempty \dodoshowfontstyle}
+\gdef\redoshowfontstyle {\dotripleempty \dododoshowfontstyle}
+\gdef\redodoshowfontstyle{\doquadrupleempty\dodododoshowfontstyle}
+
+\gdef\dodoshowfontstyle[#1][#2]%
+ {\doifelse{#2}\v!all
+ {\dodoshowfontstyle[#1][\c!rm,\c!ss,\c!tt,\c!mm]}
+ {\doifelsenothing{#2}
+ {\redoshowfontstyle[#1][\c!rm,\c!ss,\c!tt,\c!mm]}
+ {\redoshowfontstyle[#1][#2]}}}
+
+\gdef\dododoshowfontstyle[#1][#2][#3]%
+ {\doifelse{#3}\v!all
+ {\redodoshowfontstyle[#1][#2][\fontalternativelist]}
+ {\doifelsenothing{#3}
+ {\redodoshowfontstyle[#1][#2][\fontalternativelist]}
+ {\redodoshowfontstyle[#1][#2][#3]}}}
+
+\gdef\dodododoshowfontstyle[#1][#2][#3][#4]%
+ {\doifelsenothing{#4}
+ {\doshowfontstyleindeed[#1][#2][#3][\v!all]}
+ {\doshowfontstyleindeed[#1][#2][#3][#4]}}
+
+\gdef\doshowfontstyleindeed[#1][#2][#3][#4]%
+ {\bgroup
+ \raggedright
+ \switchtobodyfont[#1]
+ \def\dododocommand##1%
+ {\dostepwiserecurse{0}{255}{1}
+ {\scratchcounter\numexpr##1*256+\recurselevel\relax
+ \iffontchar\font\scratchcounter\relax
+ \char\scratchcounter
+ \space
+ \fi}}%
+ \def\dodocommand##1##2%
+ {\starttextrule{\tttf #1 ##1 ##2}
+ \nobreak\getvalue{##2}%
+ \doifelsenothing{#4}
+ {\dododocommand{0}}
+ {\doifelse{#4}\v!all
+ {\dostepwiserecurse{0}{255}{1}{\expanded{\dododocommand{\recurselevel}}}}
+ {\processcommalist[#4]{\dododocommand}}}%
+ \par \nobreak
+ \stoptextrule}
+ \def\docommand##1%
+ {\getvalue{##1}%
+ \processcommacommand[#3]{\dodocommand{##1}}}
+ \processcommalist[#2]\docommand
+ \egroup}
\gdef\showligature#1%
{\hbox{\type{#1}\enspace\red\ruledhbox{\black#1}}}
@@ -316,7 +340,7 @@
\starttabulate[||T|T|T|T|T|T|T|T|T|]
\testminimalbaseline{\hbox to 1em{\hss\showstruts\strut\hss}}%
\testminimalbaseline{(/)}%
- \testminimalbaseline{$\frac{1}{2}x^2_3$}
+ \testminimalbaseline{$\frac{1}{2}x\normalsuperscript2\normalsubscript3$}
\stoptabulate
\fi}
@@ -330,8 +354,18 @@
\gdef\showcharratio
{\dowithnextboxcontent
{\switchtobodyfont[10pt]}%
- {(\expanded{\withoutpt\the\nextboxht},%
- \expanded{\withoutpt\the\nextboxdp})}%
+ {(\withoutpt\the\nextboxht,\withoutpt\the\nextboxdp)}%
\hbox}
+\gdef\showfontparameters
+ {\starttabulate[|tl|l|]
+ \NC slantperpoint \NC \the\fontslantperpoint \font \NC\NR
+ \NC interwordspace \NC \the\fontinterwordspace \font \NC\NR
+ \NC interwordstretch\NC \the\fontinterwordstretch\font \NC\NR
+ \NC interwordshrink \NC \the\fontinterwordshrink \font \NC\NR
+ \NC exheight \NC \the\fontexheight \font \NC\NR
+ \NC emwidth \NC \the\fontemwidth \font \NC\NR
+ \NC extraspace \NC \the\fontextraspace \font \NC\NR
+ \stoptabulate}
+
\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 5ad92e0022d..1d444cdc705 100644
--- a/Master/texmf-dist/tex/context/base/font-syn.lua
+++ b/Master/texmf-dist/tex/context/base/font-syn.lua
@@ -17,8 +17,14 @@ local lpegmatch = lpeg.match
local utfgsub, utflower = utf.gsub, utf.lower
local unpack = unpack or table.unpack
-local trace_names = false trackers.register("fonts.names", function(v) trace_names = v end)
-local trace_warnings = false trackers.register("fonts.warnings", function(v) trace_warnings = v end)
+local allocate = utilities.storage.allocate
+local sparse = utilities.storage.sparse
+
+local trace_names = false trackers.register("fonts.names", function(v) trace_names = v end)
+local trace_warnings = false trackers.register("fonts.warnings", function(v) trace_warnings = v end)
+local trace_specifications = false trackers.register("fonts.specifications", function(v) trace_specifications = v end)
+
+local report_names = logs.reporter("fonts","names")
--[[ldx--
<p>This module implements a name to filename resolver. Names are resolved
@@ -27,31 +33,33 @@ using a table that has keys filtered from the font related files.</p>
local texsprint = (tex and tex.sprint) or print
-fonts = fonts or { }
-input = input or { }
-texmf = texmf or { }
+fonts = fonts or { } -- also used elsewhere
+
+local names = { }
+fonts.names = names
-fonts.names = fonts.names or { }
-fonts.names.filters = fonts.names.filters or { }
-fonts.names.data = fonts.names.data or { }
+names.filters = names.filters or { }
+local filters = names.filters
-local names = fonts.names
-local filters = fonts.names.filters
+names.data = names.data or { }
-names.version = 1.103
+names.version = 1.110
names.basename = "names"
names.saved = false
names.loaded = false
names.be_clever = true
names.enabled = true
-names.autoreload = toboolean(os.env['MTX.FONTS.AUTOLOAD'] or os.env['MTX_FONTS_AUTOLOAD'] or "no")
names.cache = containers.define("fonts","data",names.version,true)
+local autoreload = true
+
+directives.register("fonts.autoreload", function(v) autoreload = toboolean(v) end)
+
--[[ldx--
<p>A few helpers.</p>
--ldx]]--
-local P, C, Cc, Cs, Carg = lpeg.P, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Carg
+local P, C, Cc, Cs = lpeg.P, lpeg.C, lpeg.Cc, lpeg.Cs
-- what to do with 'thin'
@@ -74,6 +82,10 @@ local weights = Cs ( -- not extra
+ P("regular") / "normal"
)
+local normalized_weights = sparse {
+ regular = "normal",
+}
+
local styles = Cs (
P("reverseoblique") / "reverseitalic"
+ P("regular") / "normal"
@@ -85,6 +97,12 @@ local styles = Cs (
+ P("ita") / "italic"
)
+local normalized_styles = sparse {
+ reverseoblique = "reverseitalic",
+ regular = "normal",
+ oblique = "italic",
+}
+
local widths = Cs(
P("condensed")
+ P("thin")
@@ -94,22 +112,26 @@ local widths = Cs(
+ P("book") / "normal"
)
+local normalized_widths = sparse()
+
local variants = Cs( -- fax casual
P("smallcaps")
+ P("oldstyle")
+ P("caps") / "smallcaps"
)
+local normalized_variants = sparse()
+
local any = P(1)
-local analysed_table
+local analyzed_table
-local analyser = Cs (
+local analyzer = Cs (
(
- weights / function(s) analysed_table[1] = s return "" end
- + styles / function(s) analysed_table[2] = s return "" end
- + widths / function(s) analysed_table[3] = s return "" end
- + variants / function(s) analysed_table[4] = s return "" end
+ weights / function(s) analyzed_table[1] = s return "" end
+ + styles / function(s) analyzed_table[2] = s return "" end
+ + widths / function(s) analyzed_table[3] = s return "" end
+ + variants / function(s) analyzed_table[4] = s return "" end
+ any
)^0
)
@@ -123,24 +145,24 @@ function names.splitspec(askedname)
width = width and lpegmatch(widths, width) or width
variant = variant and lpegmatch(variants,variant) or variant
if trace_names then
- logs.report("fonts","requested name '%s' split in name '%s', weight '%s', style '%s', width '%s' and variant '%s'",
+ report_names("requested name '%s' split in name '%s', weight '%s', style '%s', width '%s' and variant '%s'",
askedname,name or '',weight or '',style or '',width or '',variant or '')
end
if not weight or not weight or not width or not variant then
weight, style, width, variant = weight or "normal", style or "normal", width or "normal", variant or "normal"
if trace_names then
- logs.report("fonts","request '%s' normalized to '%s-%s-%s-%s-%s'",
+ report_names("request '%s' normalized to '%s-%s-%s-%s-%s'",
askedname,name,weight,style,width,variant)
end
end
return name or askedname, weight, style, width, variant
end
-local function analysespec(somename)
+local function analyzespec(somename)
if somename then
- analysed_table = { }
- local name = lpegmatch(analyser,somename)
- return name, analysed_table[1], analysed_table[2], analysed_table[3], analysed_table[4]
+ analyzed_table = { }
+ local name = lpegmatch(analyzer,somename)
+ return name, analyzed_table[1], analyzed_table[2], analyzed_table[3], analyzed_table[4]
end
end
@@ -171,9 +193,9 @@ filters.otf = fontloader.fullinfo
function filters.afm(name)
-- we could parse the afm file as well, and then report an error but
-- it's not worth the trouble
- local pfbname = resolvers.find_file(file.removesuffix(name)..".pfb","pfb") or ""
+ local pfbname = resolvers.findfile(file.removesuffix(name)..".pfb","pfb") or ""
if pfbname == "" then
- pfbname = resolvers.find_file(file.removesuffix(file.basename(name))..".pfb","pfb") or ""
+ pfbname = resolvers.findfile(file.removesuffix(file.basename(name))..".pfb","pfb") or ""
end
if pfbname ~= "" then
local f = io.open(name)
@@ -210,33 +232,39 @@ filters.list = {
--~ "ttc", "otf", "ttf", "dfont", "afm",
}
-names.xml_configuration_file = "fonts.conf" -- a bit weird format, bonus feature
-names.environment_path_variable = "OSFONTDIR" -- the official way, in minimals etc
+names.fontconfigfile = "fonts.conf" -- a bit weird format, bonus feature
+names.osfontdirvariable = "OSFONTDIR" -- the official way, in minimals etc
filters.paths = { }
filters.names = { }
function names.getpaths(trace)
- local hash, result = { }, { }
- local function collect(t)
+ local hash, result, r = { }, { }, 0
+ local function collect(t,where)
for i=1, #t do
- local v = resolvers.clean_path(t[i])
- v = gsub(v,"/+$","")
+ local v = resolvers.cleanpath(t[i])
+ v = gsub(v,"/+$","") -- not needed any more
local key = lower(v)
+ report_names("adding path from %s: %s",where,v)
if not hash[key] then
- hash[key], result[#result+1] = true, v
+ r = r + 1
+ result[r] = v
+ hash[key] = true
end
end
end
- local path = names.environment_path_variable or ""
+ local path = names.osfontdirvariable or ""
if path ~= "" then
- collect(resolvers.expanded_path_list(path))
+ collect(resolvers.expandedpathlist(path),path)
end
if xml then
- local confname = names.xml_configuration_file or ""
+ local confname = resolvers.expansion("FONTCONFIG_FILE") or ""
+ if confname == "" then
+ confname = names.fontconfigfile or ""
+ end
if confname ~= "" then
-- first look in the tex tree
- local name = resolvers.find_file(confname,"other")
+ local name = resolvers.findfile(confname,"fontconfig files") or ""
if name == "" then
-- after all, fontconfig is a unix thing
name = file.join("/etc",confname)
@@ -246,7 +274,7 @@ function names.getpaths(trace)
end
if name ~= "" and lfs.isfile(name) then
if trace_names then
- logs.report("fontnames","loading fontconfig file: %s",name)
+ report_names("loading fontconfig file: %s",name)
end
local xmldata = xml.load(name)
-- begin of untested mess
@@ -259,19 +287,19 @@ function names.getpaths(trace)
end
if lfs.isfile(incname) then
if trace_names then
- logs.report("fontnames","merging included fontconfig file: %s",incname)
+ report_names("merging included fontconfig file: %s",incname)
end
return io.loaddata(incname)
elseif trace_names then
- logs.report("fontnames","ignoring included fontconfig file: %s",incname)
+ report_names("ignoring included fontconfig file: %s",incname)
end
end)
-- end of untested mess
local fontdirs = xml.collect_texts(xmldata,"dir",true)
if trace_names then
- logs.report("fontnames","%s dirs found in fontconfig",#fontdirs)
+ report_names("%s dirs found in fontconfig",#fontdirs)
end
- collect(fontdirs)
+ collect(fontdirs,"fontconfig file")
end
end
end
@@ -287,7 +315,20 @@ local function cleanname(name)
-- return (utfgsub(utfgsub(lower(str),"[^%a%A%d]",""),"%s",""))
end
-names.cleanname = cleanname
+local function cleanfilename(fullname,defaultsuffix)
+ local _, _, name, suffix = file.splitname(fullname)
+ name = gsub(lower(name),"[^%a%d]","")
+ if suffix and suffix ~= "" then
+ return name .. ".".. suffix
+ elseif defaultsuffix and defaultsuffix ~= "" then
+ return name .. ".".. defaultsuffix
+ else
+ return name
+ end
+end
+
+names.cleanname = cleanname
+names.cleanfilename = cleanfilename
local function check_names(result)
local names = result.names
@@ -305,10 +346,10 @@ local function walk_tree(pathlist,suffix,identify)
if pathlist then
for i=1,#pathlist do
local path = pathlist[i]
- path = resolvers.clean_path(path .. "/")
+ path = resolvers.cleanpath(path .. "/")
path = gsub(path,"/+","/")
local pattern = path .. "**." .. suffix -- ** forces recurse
- logs.report("fontnames", "globbing path %s",pattern)
+ report_names( "globbing path %s",pattern)
local t = dir.glob(pattern)
sort(t,sorter)
for j=1,#t do
@@ -343,8 +384,8 @@ local function check_name(data,result,filename,suffix,subfont)
modifiers = modifiers and cleanname(modifiers)
weight = weight and cleanname(weight)
italicangle = (italicangle == 0) and nil
- -- analyse
- local a_name, a_weight, a_style, a_width, a_variant = analysespec(fullname or fontname or familyname)
+ -- analyze
+ local a_name, a_weight, a_style, a_width, a_variant = analyzespec(fullname or fontname or familyname)
-- check
local width = a_width
local variant = a_variant
@@ -368,7 +409,7 @@ local function check_name(data,result,filename,suffix,subfont)
fullname = fullname or fontname
familyname = familyname or fontname
specifications[#specifications + 1] = {
- filename = filename,
+ filename = filename, -- unresolved
format = lower(suffix),
subfont = subfont,
rawname = rawname,
@@ -395,11 +436,11 @@ local function cleanupkeywords()
for i=1,#specifications do
local s = specifications[i]
-- fix (sofar styles are taken from the name, and widths from the specification)
- local _, b_weight, b_style, b_width, b_variant = analysespec(s.weight)
- local _, c_weight, c_style, c_width, c_variant = analysespec(s.style)
- local _, d_weight, d_style, d_width, d_variant = analysespec(s.width)
- local _, e_weight, e_style, e_width, e_variant = analysespec(s.variant)
- local _, f_weight, f_style, f_width, f_variant = analysespec(s.fullname or "")
+ local _, b_weight, b_style, b_width, b_variant = analyzespec(s.weight)
+ local _, c_weight, c_style, c_width, c_variant = analyzespec(s.style)
+ local _, d_weight, d_style, d_width, d_variant = analyzespec(s.width)
+ local _, e_weight, e_style, e_width, e_variant = analyzespec(s.variant)
+ local _, f_weight, f_style, f_width, f_variant = analyzespec(s.fullname or "")
local weight = b_weight or c_weight or d_weight or e_weight or f_weight or "normal"
local style = b_style or c_style or d_style or e_style or f_style or "normal"
local width = b_width or c_width or d_width or e_width or f_width or "normal"
@@ -529,12 +570,12 @@ local function checkduplicate(where) -- fails on "Romantik" but that's a border
local nv = #v
if nv > 1 then
if trace_warnings then
- logs.report("fontnames", "double lookup: %s => %s",k,concat(v," | "))
+ report_names( "double lookup: %s => %s",k,concat(v," | "))
end
n = n + nv
end
end
- logs.report("fontnames", "%s double lookups in %s",n,where)
+ report_names( "%s double lookups in %s",n,where)
end
local function checkduplicates()
@@ -588,28 +629,42 @@ local function unpackreferences()
end
end
-local function analysefiles()
+local function analyzefiles()
local data = names.data
- local done, totalnofread, totalnofskipped = { }, 0, 0
+ local done, totalnofread, totalnofskipped, totalnofduplicates, nofread, nofskipped, nofduplicates = { }, 0, 0, 0, 0, 0, 0
local skip_paths, skip_names = filters.paths, filters.names
+--~ local trace_warnings = true
local function identify(completename,name,suffix,storedname)
local basename = file.basename(completename)
local basepath = file.dirname(completename)
+ nofread = nofread + 1
if done[name] then
-- already done (avoid otf afm clash)
+ if trace_names then
+ report_names("%s font %s already done",suffix,completename)
+ end
+ nofduplicates = nofduplicates + 1
+ nofskipped = nofskipped + 1
elseif not io.exists(completename) then
-- weird error
- elseif not file.is_qualified_path(completename) and resolvers.find_file(completename,suffix) == "" then
+ if trace_names then
+ report_names("%s font %s does not really exist",suffix,completename)
+ end
+ nofskipped = nofskipped + 1
+ elseif not file.is_qualified_path(completename) and resolvers.findfile(completename,suffix) == "" then
-- not locateble by backend anyway
+ if trace_names then
+ report_names("%s font %s cannot be found by backend",suffix,completename)
+ end
+ nofskipped = nofskipped + 1
else
- nofread = nofread + 1
if #skip_paths > 0 then
for i=1,#skip_paths do
if find(basepath,skip_paths[i]) then
if trace_names then
- logs.report("fontnames","rejecting path of %s font %s",suffix,completename)
- logs.push()
+ report_names("rejecting path of %s font %s",suffix,completename)
end
+ nofskipped = nofskipped + 1
return
end
end
@@ -619,77 +674,84 @@ local function analysefiles()
if find(basename,skip_names[i]) then
done[name] = true
if trace_names then
- logs.report("fontnames","rejecting name of %s font %s",suffix,completename)
- logs.push()
+ report_names("rejecting name of %s font %s",suffix,completename)
end
+ nofskipped = nofskipped + 1
return
end
end
end
if trace_names then
- logs.report("fontnames","identifying %s font %s",suffix,completename)
- logs.push()
+ report_names("identifying %s font %s",suffix,completename)
end
local result, message = filters[lower(suffix)](completename)
- if trace_names then
- logs.pop()
- end
if result then
- if not result[1] then
- local ok = check_name(data,result,storedname,suffix)
- if not ok then
- nofskipped = nofskipped + 1
- end
- else
+ if result[1] then
for r=1,#result do
local ok = check_name(data,result[r],storedname,suffix,r-1) -- subfonts start at zero
- if not ok then
- nofskipped = nofskipped + 1
- end
+ -- if not ok then
+ -- nofskipped = nofskipped + 1
+ -- end
end
+ else
+ local ok = check_name(data,result,storedname,suffix)
+ -- if not ok then
+ -- nofskipped = nofskipped + 1
+ -- end
end
if trace_warnings and message and message ~= "" then
- logs.report("fontnames","warning when identifying %s font %s: %s",suffix,completename,message)
+ report_names("warning when identifying %s font %s: %s",suffix,completename,message)
end
elseif trace_warnings then
- logs.report("fontnames","error when identifying %s font %s: %s",suffix,completename,message or "unknown")
+ nofskipped = nofskipped + 1
+ report_names("error when identifying %s font %s: %s",suffix,completename,message or "unknown")
end
done[name] = true
end
+ logs.flush() -- a bit overkill for each font, maybe not needed here
end
local function traverse(what, method)
local list = filters.list
for n=1,#list do
local suffix = list[n]
local t = os.gettimeofday() -- use elapser
- nofread, nofskipped = 0, 0
+ nofread, nofskipped, nofduplicates = 0, 0, 0
suffix = lower(suffix)
- logs.report("fontnames", "identifying %s font files with suffix %s",what,suffix)
+ report_names( "identifying %s font files with suffix %s",what,suffix)
method(suffix)
suffix = upper(suffix)
- logs.report("fontnames", "identifying %s font files with suffix %s",what,suffix)
+ report_names( "identifying %s font files with suffix %s",what,suffix)
method(suffix)
- totalnofread, totalnofskipped = totalnofread + nofread, totalnofskipped + nofskipped
+ totalnofread, totalnofskipped, totalnofduplicates = totalnofread + nofread, totalnofskipped + nofskipped, totalnofduplicates + nofduplicates
local elapsed = os.gettimeofday() - t
- logs.report("fontnames", "%s %s files identified, %s hash entries added, runtime %0.3f seconds",nofread,what,nofread-nofskipped,elapsed)
+ report_names( "%s %s files identified, %s skipped, %s duplicates, %s hash entries added, runtime %0.3f seconds",nofread,what,nofskipped,nofduplicates,nofread-nofskipped,elapsed)
end
+ logs.flush()
end
if not trace_warnings then
- logs.report("fontnames", "warnings are disabled (tracker 'fonts.warnings')")
+ report_names( "warnings are disabled (tracker 'fonts.warnings')")
end
traverse("tree", function(suffix) -- TEXTREE only
- resolvers.with_files(".*%." .. suffix .. "$", function(method,root,path,name)
- if method == "file" then
+ resolvers.dowithfilesintree(".*%." .. suffix .. "$", function(method,root,path,name)
+ if method == "file" or method == "tree" then
local completename = root .."/" .. path .. "/" .. name
- identify(completename,name,suffix,name,name)
+ completename = resolvers.resolve(completename) -- no shortcut
+ identify(completename,name,suffix,name)
+ return true
end
+ end, function(blobtype,blobpath,pattern)
+ blobpath = resolvers.resolve(blobpath) -- no shortcut
+ report_names( "scanning %s for %s files",blobpath,suffix)
+ end, function(blobtype,blobpath,pattern,total,checked,done)
+ blobpath = resolvers.resolve(blobpath) -- no shortcut
+ report_names( "%s entries found, %s %s files checked, %s okay",total,checked,suffix,done)
end)
end)
if texconfig.kpse_init then
-- we do this only for a stupid names run, not used for context itself,
-- using the vars is to clumsy so we just stick to a full scan instead
traverse("lsr", function(suffix) -- all trees
- local pathlist = resolvers.split_path(resolvers.show_path("ls-R") or "")
+ local pathlist = resolvers.splitpath(resolvers.showpath("ls-R") or "")
walk_tree(pathlist,suffix,identify)
end)
else
@@ -697,11 +759,22 @@ local function analysefiles()
walk_tree(names.getpaths(trace),suffix,identify)
end)
end
- data.statistics.readfiles, data.statistics.skippedfiles = totalnofread, totalnofskipped
+ data.statistics.readfiles, data.statistics.skippedfiles, data.statistics.duplicatefiles = totalnofread, totalnofskipped, totalnofduplicates
+end
+
+local function addfilenames()
+ local data = names.data
+ local specifications = data.specifications
+ local files = { }
+ for i=1,#specifications do
+ local fullname = specifications[i].filename
+ files[cleanfilename(fullname)] = fullname
+ end
+ data.files = files
end
local function rejectclashes() -- just to be sure, so no explicit afm will be found then
- local specifications, used, okay = names.data.specifications, { }, { }
+ local specifications, used, okay, o = names.data.specifications, { }, { }, 0
for i=1,#specifications do
local s = specifications[i]
local f = s.fontname
@@ -709,18 +782,21 @@ local function rejectclashes() -- just to be sure, so no explicit afm will be fo
local fnd, fnm = used[f], s.filename
if fnd then
if trace_warnings then
- logs.report("fontnames", "fontname '%s' clashes, rejecting '%s' in favor of '%s'",f,fnm,fnd)
+ report_names( "fontname '%s' clashes, rejecting '%s' in favor of '%s'",f,fnm,fnd)
end
else
- used[f], okay[#okay+1] = fnm, s
+ used[f] = fnm
+ o = o + 1
+ okay[o] = s
end
else
- okay[#okay+1] = s
+ o = o + 1
+ okay[o] = s
end
end
local d = #specifications - #okay
if d > 0 then
- logs.report("fontnames", "%s files rejected due to clashes",d)
+ report_names( "%s files rejected due to clashes",d)
end
names.data.specifications = okay
end
@@ -737,30 +813,31 @@ local function resetdata()
specifications = { },
families = { },
statistics = { },
- data_state = resolvers.data_state(),
+ datastate = resolvers.datastate(),
}
end
function names.identify()
resetdata()
- analysefiles()
+ analyzefiles()
rejectclashes()
collectfamilies()
collectstatistics()
cleanupkeywords()
collecthashes()
checkduplicates()
+ addfilenames()
-- sorthashes() -- will be resorted when saved
end
function names.is_permitted(name)
- return containers.is_usable(names.cache(), name)
+ return containers.is_usable(names.cache, name)
end
-function names.write_data(name,data)
- containers.write(names.cache(),name,data)
+function names.writedata(name,data)
+ containers.write(names.cache,name,data)
end
-function names.read_data(name)
- return containers.read(names.cache(),name)
+function names.readdata(name)
+ return containers.read(names.cache,name)
end
function names.load(reload,verbose)
@@ -768,13 +845,13 @@ function names.load(reload,verbose)
if reload then
if names.is_permitted(names.basename) then
names.identify(verbose)
- names.write_data(names.basename,names.data)
+ names.writedata(names.basename,names.data)
else
- logs.report("font table", "unable to access database cache")
+ report_names("unable to access database cache")
end
names.saved = true
end
- local data = names.read_data(names.basename)
+ local data = names.readdata(names.basename)
names.data = data
if not names.saved then
if not data or not next(data) or not data.specifications or not next(data.specifications) then
@@ -783,7 +860,7 @@ function names.load(reload,verbose)
names.saved = true
end
if not data then
- logs.report("font table", "accessing the data table failed")
+ report_names("accessing the data table failed")
else
unpackreferences()
sorthashes()
@@ -809,7 +886,7 @@ local function list_them(mapping,sorted,pattern,t,all)
end
function names.list(pattern,reload,all) -- here?
- names.load(reload)
+ names.load() -- todo reload
if names.loaded then
local t = { }
local data = names.data
@@ -838,19 +915,21 @@ local reloaded = false
local function is_reloaded()
if not reloaded then
local data = names.data
- if names.autoreload then
- local c_status = table.serialize(resolvers.data_state())
- local f_status = table.serialize(data.data_state)
+ if autoreload then
+ local c_status = table.serialize(resolvers.datastate())
+ local f_status = table.serialize(data.datastate)
if c_status == f_status then
- -- logs.report("fonts","font database matches configuration and file hashes")
+ report_names("font database has matching configuration and file hashes")
return
else
- logs.report("fonts","font database does not match configuration and file hashes")
+ report_names("font database has mismatching configuration and file hashes")
end
+ else
+ report_names("font database is regenerated (controlled by directive 'fonts.autoreload')")
end
names.loaded = false
reloaded = true
- io.flush()
+ logs.flush()
names.load(true)
end
end
@@ -886,7 +965,7 @@ local function foundname(name,sub) -- sub is not used currently
local found = mappings[l][name]
if found then
if trace_names then
- logs.report("fonts","resolved via direct name match: '%s'",name)
+ report_names("resolved via direct name match: '%s'",name)
end
return found
end
@@ -896,7 +975,7 @@ local function foundname(name,sub) -- sub is not used currently
local found, fname = fuzzy(mappings[l],sorted_mappings[l],name,sub)
if found then
if trace_names then
- logs.report("fonts","resolved via fuzzy name match: '%s' => '%s'",name,fname)
+ report_names("resolved via fuzzy name match: '%s' => '%s'",name,fname)
end
return found
end
@@ -906,7 +985,7 @@ local function foundname(name,sub) -- sub is not used currently
local found = fallbacks[l][name]
if found then
if trace_names then
- logs.report("fonts","resolved via direct fallback match: '%s'",name)
+ report_names("resolved via direct fallback match: '%s'",name)
end
return found
end
@@ -916,11 +995,14 @@ local function foundname(name,sub) -- sub is not used currently
local found, fname = fuzzy(sorted_mappings[l],sorted_fallbacks[l],name,sub)
if found then
if trace_names then
- logs.report("fonts","resolved via fuzzy fallback match: '%s' => '%s'",name,fname)
+ report_names("resolved via fuzzy fallback match: '%s' => '%s'",name,fname)
end
return found
end
end
+ if trace_names then
+ report_names("font with name '%s' cannot be found",name)
+ end
end
function names.resolvedspecification(askedname,sub)
@@ -942,6 +1024,17 @@ function names.resolve(askedname,sub)
end
end
+function names.getfilename(askedname,suffix) -- last resort, strip funny chars
+ names.load()
+ local files = names.data.files
+ askedname = files and files[cleanfilename(askedname,suffix)] or ""
+ if askedname == "" then
+ return ""
+ else
+ return resolvers.findbinfile(askedname,suffix) or ""
+ end
+end
+
-- specified search
local function s_collect_weight_style_width_variant(found,done,all,weight,style,width,variant,family)
@@ -1144,7 +1237,7 @@ local function collect(stage,found,done,name,weight,style,width,variant,all)
strictname = "^".. name -- to be checked
local family = families[name]
if trace_names then
- logs.report("fonts","resolving name '%s', weight '%s', style '%s', width '%s', variant '%s'",
+ report_names("resolving name '%s', weight '%s', style '%s', width '%s', variant '%s'",
name or "?",tostring(weight),tostring(style),tostring(width),tostring(variant))
end
--~ print(name,table.serialize(family))
@@ -1153,27 +1246,27 @@ local function collect(stage,found,done,name,weight,style,width,variant,all)
if width and width ~= "" then
if variant and variant ~= "" then
if trace_names then
- logs.report("fonts","resolving stage %s, name '%s', weight '%s', style '%s', width '%s', variant '%s'",stage,name,weight,style,width,variant)
+ report_names("resolving stage %s, name '%s', weight '%s', style '%s', width '%s', variant '%s'",stage,name,weight,style,width,variant)
end
s_collect_weight_style_width_variant(found,done,all,weight,style,width,variant,family)
m_collect_weight_style_width_variant(found,done,all,weight,style,width,variant,families,sorted,strictname)
else
if trace_names then
- logs.report("fonts","resolving stage %s, name '%s', weight '%s', style '%s', width '%s'",stage,name,weight,style,width)
+ report_names("resolving stage %s, name '%s', weight '%s', style '%s', width '%s'",stage,name,weight,style,width)
end
s_collect_weight_style_width(found,done,all,weight,style,width,family)
m_collect_weight_style_width(found,done,all,weight,style,width,families,sorted,strictname)
end
else
if trace_names then
- logs.report("fonts","resolving stage %s, name '%s', weight '%s', style '%s'",stage,name,weight,style)
+ report_names("resolving stage %s, name '%s', weight '%s', style '%s'",stage,name,weight,style)
end
s_collect_weight_style(found,done,all,weight,style,family)
m_collect_weight_style(found,done,all,weight,style,families,sorted,strictname)
end
else
if trace_names then
- logs.report("fonts","resolving stage %s, name '%s', weight '%s'",stage,name,weight)
+ report_names("resolving stage %s, name '%s', weight '%s'",stage,name,weight)
end
s_collect_weight(found,done,all,weight,family)
m_collect_weight(found,done,all,weight,families,sorted,strictname)
@@ -1181,33 +1274,33 @@ local function collect(stage,found,done,name,weight,style,width,variant,all)
elseif style and style ~= "" then
if width and width ~= "" then
if trace_names then
- logs.report("fonts","resolving stage %s, name '%s', style '%s', width '%s'",stage,name,style,width)
+ report_names("resolving stage %s, name '%s', style '%s', width '%s'",stage,name,style,width)
end
s_collect_style_width(found,done,all,style,width,family)
m_collect_style_width(found,done,all,style,width,families,sorted,strictname)
else
if trace_names then
- logs.report("fonts","resolving stage %s, name '%s', style '%s'",stage,name,style)
+ report_names("resolving stage %s, name '%s', style '%s'",stage,name,style)
end
s_collect_style(found,done,all,style,family)
m_collect_style(found,done,all,style,families,sorted,strictname)
end
elseif width and width ~= "" then
if trace_names then
- logs.report("fonts","resolving stage %s, name '%s', width '%s'",stage,name,width)
+ report_names("resolving stage %s, name '%s', width '%s'",stage,name,width)
end
s_collect_width(found,done,all,width,family)
m_collect_width(found,done,all,width,families,sorted,strictname)
else
if trace_names then
- logs.report("fonts","resolving stage %s, name '%s'",stage,name)
+ report_names("resolving stage %s, name '%s'",stage,name)
end
s_collect(found,done,all,family)
m_collect(found,done,all,families,sorted,strictname)
end
end
-function heuristic(name,weight,style,width,variant,all) -- todo: fallbacks
+local function heuristic(name,weight,style,width,variant,all) -- todo: fallbacks
local found, done = { }, { }
--~ print(name,weight,style,width,variant)
weight, style, width, variant = weight or "normal", style or "normal", width or "normal", variant or "normal"
@@ -1236,11 +1329,11 @@ function heuristic(name,weight,style,width,variant,all) -- todo: fallbacks
if nf then
local t = { }
for i=1,nf do
- t[#t+1] = format("'%s'",found[i].fontname)
+ t[i] = format("'%s'",found[i].fontname)
end
- logs.report("fonts","name '%s' resolved to %s instances: %s",name,nf,concat(t," "))
+ report_names("name '%s' resolved to %s instances: %s",name,nf,concat(t," "))
else
- logs.report("fonts","name '%s' unresolved",name)
+ report_names("name '%s' unresolved",name)
end
end
if all then
@@ -1252,7 +1345,7 @@ end
function names.specification(askedname,weight,style,width,variant,reload,all)
if askedname and askedname ~= "" and names.enabled then
- askedname = lower(askedname) -- or cleanname
+ askedname = cleanname(askedname) -- or cleanname
names.load(reload)
local found = heuristic(askedname,weight,style,width,variant,all)
if not found and is_reloaded() then
@@ -1267,7 +1360,7 @@ end
function names.collect(askedname,weight,style,width,variant,reload,all)
if askedname and askedname ~= "" and names.enabled then
- askedname = lower(askedname) -- or cleanname
+ askedname = cleanname(askedname) -- or cleanname
names.load(reload)
local list = heuristic(askedname,weight,style,width,variant,true)
if not list or #list == 0 and is_reloaded() then
@@ -1282,7 +1375,7 @@ function names.collectspec(askedname,reload,all)
return names.collect(name,weight,style,width,variant,reload,all)
end
-function names.resolvespec(askedname,sub)
+function names.resolvespec(askedname,sub) -- redefined later
local found = names.specification(names.splitspec(askedname))
if found then
return found.filename, found.subfont and found.rawname
@@ -1291,14 +1384,14 @@ end
function names.collectfiles(askedname,reload) -- no all
if askedname and askedname ~= "" and names.enabled then
- askedname = lower(askedname) -- or cleanname
+ askedname = cleanname(askedname) -- or cleanname
names.load(reload)
local list = { }
local basename = file.basename
local specifications = names.data.specifications
for i=1,#specifications do
local s = specifications[i]
- if find(lower(basename(s.filename)),askedname) then
+ if find(cleanname(basename(s.filename)),askedname) then
list[#list+1] = s
end
end
@@ -1306,65 +1399,71 @@ function names.collectfiles(askedname,reload) -- no all
end
end
---[[ldx--
-<p>Fallbacks, not permanent but a transition thing.</p>
---ldx]]--
-
-names.new_to_old = {
- ["lmroman10-capsregular"] = "lmromancaps10-oblique",
- ["lmroman10-capsoblique"] = "lmromancaps10-regular",
- ["lmroman10-demi"] = "lmromandemi10-oblique",
- ["lmroman10-demioblique"] = "lmromandemi10-regular",
- ["lmroman8-oblique"] = "lmromanslant8-regular",
- ["lmroman9-oblique"] = "lmromanslant9-regular",
- ["lmroman10-oblique"] = "lmromanslant10-regular",
- ["lmroman12-oblique"] = "lmromanslant12-regular",
- ["lmroman17-oblique"] = "lmromanslant17-regular",
- ["lmroman10-boldoblique"] = "lmromanslant10-bold",
- ["lmroman10-dunhill"] = "lmromandunh10-oblique",
- ["lmroman10-dunhilloblique"] = "lmromandunh10-regular",
- ["lmroman10-unslanted"] = "lmromanunsl10-regular",
- ["lmsans10-demicondensed"] = "lmsansdemicond10-regular",
- ["lmsans10-demicondensedoblique"] = "lmsansdemicond10-oblique",
- ["lmsansquotation8-bold"] = "lmsansquot8-bold",
- ["lmsansquotation8-boldoblique"] = "lmsansquot8-boldoblique",
- ["lmsansquotation8-oblique"] = "lmsansquot8-oblique",
- ["lmsansquotation8-regular"] = "lmsansquot8-regular",
- ["lmtypewriter8-regular"] = "lmmono8-regular",
- ["lmtypewriter9-regular"] = "lmmono9-regular",
- ["lmtypewriter10-regular"] = "lmmono10-regular",
- ["lmtypewriter12-regular"] = "lmmono12-regular",
- ["lmtypewriter10-italic"] = "lmmono10-italic",
- ["lmtypewriter10-oblique"] = "lmmonoslant10-regular",
- ["lmtypewriter10-capsoblique"] = "lmmonocaps10-oblique",
- ["lmtypewriter10-capsregular"] = "lmmonocaps10-regular",
- ["lmtypewriter10-light"] = "lmmonolt10-regular",
- ["lmtypewriter10-lightoblique"] = "lmmonolt10-oblique",
- ["lmtypewriter10-lightcondensed"] = "lmmonoltcond10-regular",
- ["lmtypewriter10-lightcondensedoblique"] = "lmmonoltcond10-oblique",
- ["lmtypewriter10-dark"] = "lmmonolt10-bold",
- ["lmtypewriter10-darkoblique"] = "lmmonolt10-boldoblique",
- ["lmtypewritervarwd10-regular"] = "lmmonoproplt10-regular",
- ["lmtypewritervarwd10-oblique"] = "lmmonoproplt10-oblique",
- ["lmtypewritervarwd10-light"] = "lmmonoprop10-regular",
- ["lmtypewritervarwd10-lightoblique"] = "lmmonoprop10-oblique",
- ["lmtypewritervarwd10-dark"] = "lmmonoproplt10-bold",
- ["lmtypewritervarwd10-darkoblique"] = "lmmonoproplt10-boldoblique",
-}
-
-names.old_to_new = table.swapped(names.new_to_old)
+--~ --[[ldx--
+--~ <p>Fallbacks, not permanent but a transition thing.</p>
+--~ --ldx]]--
+--~
+--~ names.new_to_old = allocate {
+--~ ["lmroman10-capsregular"] = "lmromancaps10-oblique",
+--~ ["lmroman10-capsoblique"] = "lmromancaps10-regular",
+--~ ["lmroman10-demi"] = "lmromandemi10-oblique",
+--~ ["lmroman10-demioblique"] = "lmromandemi10-regular",
+--~ ["lmroman8-oblique"] = "lmromanslant8-regular",
+--~ ["lmroman9-oblique"] = "lmromanslant9-regular",
+--~ ["lmroman10-oblique"] = "lmromanslant10-regular",
+--~ ["lmroman12-oblique"] = "lmromanslant12-regular",
+--~ ["lmroman17-oblique"] = "lmromanslant17-regular",
+--~ ["lmroman10-boldoblique"] = "lmromanslant10-bold",
+--~ ["lmroman10-dunhill"] = "lmromandunh10-oblique",
+--~ ["lmroman10-dunhilloblique"] = "lmromandunh10-regular",
+--~ ["lmroman10-unslanted"] = "lmromanunsl10-regular",
+--~ ["lmsans10-demicondensed"] = "lmsansdemicond10-regular",
+--~ ["lmsans10-demicondensedoblique"] = "lmsansdemicond10-oblique",
+--~ ["lmsansquotation8-bold"] = "lmsansquot8-bold",
+--~ ["lmsansquotation8-boldoblique"] = "lmsansquot8-boldoblique",
+--~ ["lmsansquotation8-oblique"] = "lmsansquot8-oblique",
+--~ ["lmsansquotation8-regular"] = "lmsansquot8-regular",
+--~ ["lmtypewriter8-regular"] = "lmmono8-regular",
+--~ ["lmtypewriter9-regular"] = "lmmono9-regular",
+--~ ["lmtypewriter10-regular"] = "lmmono10-regular",
+--~ ["lmtypewriter12-regular"] = "lmmono12-regular",
+--~ ["lmtypewriter10-italic"] = "lmmono10-italic",
+--~ ["lmtypewriter10-oblique"] = "lmmonoslant10-regular",
+--~ ["lmtypewriter10-capsoblique"] = "lmmonocaps10-oblique",
+--~ ["lmtypewriter10-capsregular"] = "lmmonocaps10-regular",
+--~ ["lmtypewriter10-light"] = "lmmonolt10-regular",
+--~ ["lmtypewriter10-lightoblique"] = "lmmonolt10-oblique",
+--~ ["lmtypewriter10-lightcondensed"] = "lmmonoltcond10-regular",
+--~ ["lmtypewriter10-lightcondensedoblique"] = "lmmonoltcond10-oblique",
+--~ ["lmtypewriter10-dark"] = "lmmonolt10-bold",
+--~ ["lmtypewriter10-darkoblique"] = "lmmonolt10-boldoblique",
+--~ ["lmtypewritervarwd10-regular"] = "lmmonoproplt10-regular",
+--~ ["lmtypewritervarwd10-oblique"] = "lmmonoproplt10-oblique",
+--~ ["lmtypewritervarwd10-light"] = "lmmonoprop10-regular",
+--~ ["lmtypewritervarwd10-lightoblique"] = "lmmonoprop10-oblique",
+--~ ["lmtypewritervarwd10-dark"] = "lmmonoproplt10-bold",
+--~ ["lmtypewritervarwd10-darkoblique"] = "lmmonoproplt10-boldoblique",
+--~ }
+--~
+--~ names.old_to_new = allocate(table.swapped(names.new_to_old))
+
+--~ todo:
+--~
+--~ blacklisted = {
+--~ ["cmr10.ttf"] = "completely messed up",
+--~ }
function names.exists(name)
local found = false
local list = filters.list
for k=1,#list do
local v = list[k]
- found = (resolvers.find_file(name,v) or "") ~= ""
+ found = (resolvers.findfile(name,v) or "") ~= ""
if found then
return found
end
end
- return ((resolvers.find_file(name,"tfm") or "") ~= "") or ((names.resolve(name) or "") ~= "")
+ return ((resolvers.findfile(name,"tfm") or "") ~= "") or ((names.resolve(name) or "") ~= "")
end
-- for i=1,fonts.names.lookup(pattern) do
@@ -1385,19 +1484,31 @@ function names.lookup(pattern,name,reload) -- todo: find
lookups = families[pattern]
end
if trace_names then
- logs.report("fonts","starting with %s lookups for '%s'",#lookups,pattern)
+ report_names("starting with %s lookups for '%s'",#lookups,pattern)
end
if lookups then
for key, value in gmatch(pattern,"([^=,]+)=([^=,]+)") do
- local t = { }
- for i=1,#lookups do
- local s = lookups[i]
- if s[key] == value then
- t[#t+1] = lookups[i]
+ local t, n = { }, 0
+ if find(value,"*") then
+ value = string.topattern(value)
+ for i=1,#lookups do
+ local s = lookups[i]
+ if find(s[key],value) then
+ n = n + 1
+ t[n] = lookups[i]
+ end
+ end
+ else
+ for i=1,#lookups do
+ local s = lookups[i]
+ if s[key] == value then
+ n = n + 1
+ t[n] = lookups[i]
+ end
end
end
if trace_names then
- logs.report("fonts","%s matches for key '%s' with value '%s'",#t,key,value)
+ report_names("%s matches for key '%s' with value '%s'",#t,key,value)
end
lookups = t
end
@@ -1424,31 +1535,91 @@ function names.getlookups(pattern,name,reload)
return lastlookups
end
-function table.formatcolumns(result)
- if result and #result > 0 then
- local widths = { }
- local first = result[1]
- local n = #first
- for i=1,n do
- widths[i] = 0
- end
- for i=1,#result do
- local r = result[i]
- for j=1,n do
- local w = #r[j]
- if w > widths[j] then
- widths[j] = w
+-- The following is new ... watch the overload!
+
+local specifications = allocate()
+names.specifications = specifications
+
+-- files = {
+-- name = "antykwapoltawskiego",
+-- list = {
+-- ["AntPoltLtCond-Regular.otf"] = {
+-- -- name = "antykwapoltawskiego",
+-- style = "regular",
+-- weight = "light",
+-- width = "condensed",
+-- },
+-- },
+-- }
+
+function names.register(files)
+ if files then
+ local list, commonname = files.list, files.name
+ if list then
+ local n, m = 0, 0
+ for filename, filespec in next, list do
+ local name = lower(filespec.name or commonname)
+ if name and name ~= "" then
+ local style = normalized_styles [lower(filespec.style or "normal")]
+ local width = normalized_widths [lower(filespec.width or "normal")]
+ local weight = normalized_weights [lower(filespec.weight or "normal")]
+ local variant = normalized_variants[lower(filespec.variant or "normal")]
+ local weights = specifications[name ] if not weights then weights = { } specifications[name ] = weights end
+ local styles = weights [weight] if not styles then styles = { } weights [weight] = styles end
+ local widths = styles [style ] if not widths then widths = { } styles [style ] = widths end
+ local variants = widths [width ] if not variants then variants = { } widths [width ] = variants end
+ variants[variant] = filename
+ n = n + 1
+ else
+ m = m + 1
end
end
+ if trace_specifications then
+ report_names("%s filenames registered, %s filenames rejected",n,m)
+ end
end
- for i=1,n do
- widths[i] = "%-" .. widths[i] .. "s"
+ end
+end
+
+function names.registered(name,weight,style,width,variant)
+ local ok = specifications[name]
+ ok = ok and (ok[(weight and weight ~= "" and weight ) or "normal"] or ok.normal)
+ ok = ok and (ok[(style and style ~= "" and style ) or "normal"] or ok.normal)
+ ok = ok and (ok[(width and width ~= "" and width ) or "normal"] or ok.normal)
+ ok = ok and (ok[(variant and variant ~= "" and variant) or "normal"] or ok.normal)
+ --
+ -- todo: same fallbacks as with database
+ --
+ if ok then
+ return {
+ filename = ok,
+ subname = "",
+ -- rawname = nil,
+ }
+ end
+end
+
+function names.resolvespec(askedname,sub) -- overloads previous definition
+ local name, weight, style, width, variant = names.splitspec(askedname)
+ if trace_specifications then
+ report_names("resolving specification: %s -> name=%s, weight=%s, style=%s, width=%s, variant=%s",askedname,name,weight,style,width,variant)
+ end
+ local found = names.registered(name,weight,style,width,variant)
+ if found and found.filename then
+ if trace_specifications then
+ report_names("resolved by registered names: %s -> %s",askedname,found.filename)
end
- local template = concat(widths," ")
- for i=1,#result do
- local str = format(template,unpack(result[i]))
- result[i] = string.strip(str)
+ return found.filename, found.subname, found.rawname
+ else
+ found = names.specification(name,weight,style,width,variant)
+ if found and found.filename then
+ if trace_specifications then
+ report_names("resolved by font database: %s -> %s",askedname,found.filename)
+ end
+ return found.filename, found.subfont and found.rawname
end
end
- return result
+ if trace_specifications then
+ report_names("unresolved: %s",askedname)
+ 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 31ae2cae1c2..8f0a99d5aee 100644
--- a/Master/texmf-dist/tex/context/base/font-tfm.lua
+++ b/Master/texmf-dist/tex/context/base/font-tfm.lua
@@ -6,731 +6,137 @@ if not modules then modules = { } end modules ['font-tfm'] = {
license = "see context related readme files"
}
-local utf = unicode.utf8
+local next = next
+local match = string.match
-local next, format, match, lower, gsub = next, string.format, string.match, string.lower, string.gsub
-local concat, sortedkeys, utfbyte, serialize = table.concat, table.sortedkeys, utf.byte, table.serialize
+local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+local trace_features = false trackers.register("tfm.features", function(v) trace_features = v end)
-local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
-local trace_scaling = false trackers.register("fonts.scaling" , function(v) trace_scaling = v end)
+local report_defining = logs.reporter("fonts","defining")
+local report_tfm = logs.reporter("fonts","tfm loading")
--- tfmdata has also fast access to indices and unicodes
--- to be checked: otf -> tfm -> tfmscaled
---
--- watch out: no negative depths and negative eights permitted in regular fonts
+local fonts = fonts
+local handlers = fonts.handlers
+local readers = fonts.readers
+local constructors = fonts.constructors
+local encodings = fonts.encodings
---[[ldx--
-<p>Here we only implement a few helper functions.</p>
---ldx]]--
+local tfm = { }
+handlers.tfm = tfm
-fonts = fonts or { }
-fonts.tfm = fonts.tfm or { }
-fonts.ids = fonts.ids or { }
+constructors.resolvevirtualtoo = false -- wil be set in font-ctx.lua
-local tfm = fonts.tfm
+local findbinfile = resolvers.findbinfile
-fonts.loaded = fonts.loaded or { }
-fonts.dontembed = fonts.dontembed or { }
-fonts.triggers = fonts.triggers or { } -- brrr
-fonts.initializers = fonts.initializers or { }
-fonts.initializers.common = fonts.initializers.common or { }
+local tfmfeatures = fonts.constructors.newfeatures("tfm")
+local registertfmfeature = tfmfeatures.register
-local fontdata = fonts.ids
-local disc = node.id('disc')
-local glyph = node.id('glyph')
-local set_attribute = node.set_attribute
+fonts.formats.tfm = "type1" -- we need to have at least a value here
--[[ldx--
<p>The next function encapsulates the standard <l n='tfm'/> loader as
supplied by <l n='luatex'/>.</p>
--ldx]]--
-tfm.resolve_vf = true -- false
-tfm.share_base_kerns = false -- true (.5 sec slower on mk but brings down mem from 410M to 310M, beware: then script/lang share too)
-tfm.mathactions = { }
-tfm.fontname_mode = "fullpath"
+-- this might change: not scaling and then apply features and do scaling in the
+-- usual way with dummy descriptions but on the other hand .. we no longer use
+-- tfm so why bother
-tfm.enhance = tfm.enhance or function() end
+-- ofm directive blocks local path search unless set; btw, in context we
+-- don't support ofm files anyway as this format is obsolete
-function tfm.read_from_tfm(specification)
- local fname, tfmdata = specification.filename or "", nil
- if fname ~= "" then
- if trace_defining then
- logs.report("define font","loading tfm file %s at size %s",fname,specification.size)
- end
- tfmdata = font.read_tfm(fname,specification.size) -- not cached, fast enough
- if tfmdata then
- tfmdata.descriptions = tfmdata.descriptions or { }
- if tfm.resolve_vf then
- fonts.logger.save(tfmdata,file.extname(fname),specification) -- strange, why here
- fname = resolvers.findbinfile(specification.name, 'ovf')
- if fname and fname ~= "" then
- local vfdata = font.read_vf(fname,specification.size) -- not cached, fast enough
- if vfdata then
- local chars = tfmdata.characters
- for k,v in next, vfdata.characters do
- chars[k].commands = v.commands
- end
- tfmdata.type = 'virtual'
- tfmdata.fonts = vfdata.fonts
- end
- end
- end
- tfm.enhance(tfmdata,specification)
- end
- elseif trace_defining then
- logs.report("define font","loading tfm with name %s fails",specification.name)
- end
- return tfmdata
-end
-
---[[ldx--
-<p>We need to normalize the scale factor (in scaled points). This has to
-do with the fact that <l n='tex'/> uses a negative multiple of 1000 as
-a signal for a font scaled based on the design size.</p>
---ldx]]--
-
-local factors = {
- pt = 65536.0,
- bp = 65781.8,
-}
-
-function tfm.setfactor(f)
- tfm.factor = factors[f or 'pt'] or factors.pt
-end
-
-tfm.setfactor()
-
-function tfm.scaled(scaledpoints, designsize) -- handles designsize in sp as well
- if scaledpoints < 0 then
- if designsize then
- if designsize > tfm.factor then -- or just 1000 / when? mp?
- return (- scaledpoints/1000) * designsize -- sp's
- else
- return (- scaledpoints/1000) * designsize * tfm.factor
- end
- else
- return (- scaledpoints/1000) * 10 * tfm.factor
- end
- else
- return scaledpoints
- end
-end
-
---[[ldx--
-<p>Before a font is passed to <l n='tex'/> we scale it. Here we also need
-to scale virtual characters.</p>
---ldx]]--
-
-function tfm.get_virtual_id(tfmdata)
- -- since we don't know the id yet, we use 0 as signal
- if not tfmdata.fonts then
- tfmdata.type = "virtual"
- tfmdata.fonts = { { id = 0 } }
- return 1
+function tfm.setfeatures(tfmdata,features)
+ local okay = constructors.initializefeatures("tfm",tfmdata,features,trace_features,report_tfm)
+ if okay then
+ return constructors.collectprocessors("tfm",tfmdata,features,trace_features,report_tfm)
else
- tfmdata.fonts[#tfmdata.fonts+1] = { id = 0 }
- return #tfmdata.fonts
- end
-end
-
-function tfm.check_virtual_id(tfmdata, id)
- if tfmdata and tfmdata.type == "virtual" then
- if not tfmdata.fonts or #tfmdata.fonts == 0 then
- tfmdata.type, tfmdata.fonts = "real", nil
- else
- local vfonts = tfmdata.fonts
- for f=1,#vfonts do
- local fnt = vfonts[f]
- if fnt.id and fnt.id == 0 then
- fnt.id = id
- end
- end
- end
+ return { } -- will become false
end
end
---[[ldx--
-<p>Beware, the boundingbox is passed as reference so we may not overwrite it
-in the process; numbers are of course copies. Here 65536 equals 1pt. (Due to
-excessive memory usage in CJK fonts, we no longer pass the boundingbox.)</p>
---ldx]]--
-
-fonts.trace_scaling = false
-
--- the following hack costs a bit of runtime but safes memory
---
--- basekerns are scaled and will be hashed by table id
--- sharedkerns are unscaled and are be hashed by concatenated indexes
-
---~ function tfm.check_base_kerns(tfmdata)
---~ if tfm.share_base_kerns then
---~ local sharedkerns = tfmdata.sharedkerns
---~ if sharedkerns then
---~ local basekerns = { }
---~ tfmdata.basekerns = basekerns
---~ return sharedkerns, basekerns
---~ end
---~ end
---~ return nil, nil
---~ end
-
---~ function tfm.prepare_base_kerns(tfmdata)
---~ if tfm.share_base_kerns and not tfmdata.sharedkerns then
---~ local sharedkerns = { }
---~ tfmdata.sharedkerns = sharedkerns
---~ for u, chr in next, tfmdata.characters do
---~ local kerns = chr.kerns
---~ if kerns then
---~ local hash = concat(sortedkeys(kerns), " ")
---~ local base = sharedkerns[hash]
---~ if not base then
---~ sharedkerns[hash] = kerns
---~ else
---~ chr.kerns = base
---~ end
---~ end
---~ end
---~ end
---~ end
-
--- we can have cache scaled characters when we are in node mode and don't have
--- protruding and expansion: hash == fullname @ size @ protruding @ expansion
--- but in practice (except from mk) the otf hash will be enough already so it
--- makes no sense to mess up the code now
-
-local charactercache = { }
-
--- The scaler is only used for otf and afm and virtual fonts. If
--- a virtual font has italic correction make sure to set the
--- has_italic flag. Some more flags will be added in the future.
-
-function tfm.calculate_scale(tfmtable, scaledpoints, relativeid)
- if scaledpoints < 0 then
- scaledpoints = (- scaledpoints/1000) * tfmtable.designsize -- already in sp
- end
- local units = tfmtable.units or 1000
- local delta = scaledpoints/units -- brr, some open type fonts have 2048
- return scaledpoints, delta, units
-end
-
-function tfm.do_scale(tfmtable, scaledpoints, relativeid)
- -- tfm.prepare_base_kerns(tfmtable) -- optimalization
- local t = { } -- the new table
- local scaledpoints, delta, units = tfm.calculate_scale(tfmtable, scaledpoints, relativeid)
- t.units_per_em = units or 1000
- local hdelta, vdelta = delta, delta
- -- unicoded unique descriptions shared cidinfo characters changed parameters indices
- for k,v in next, tfmtable do
- if type(v) == "table" then
- -- print(k)
- else
- t[k] = v
- end
- end
- local extend_factor = tfmtable.extend_factor or 0
- if extend_factor ~= 0 and extend_factor ~= 1 then
- hdelta = hdelta * extend_factor
- t.extend = extend_factor * 1000
- else
- t.extend = 1000
- end
- local slant_factor = tfmtable.slant_factor or 0
- if slant_factor ~= 0 then
- t.slant = slant_factor * 1000
- else
- t.slant = 0
- end
- -- status
- local isvirtual = tfmtable.type == "virtual" or tfmtable.virtualized
- local hasmath = (tfmtable.math_parameters ~= nil and next(tfmtable.math_parameters) ~= nil) or (tfmtable.MathConstants ~= nil and next(tfmtable.MathConstants) ~= nil)
- local nodemode = tfmtable.mode == "node"
- local hasquality = tfmtable.auto_expand or tfmtable.auto_protrude
- local hasitalic = tfmtable.has_italic
- --
- t.parameters = { }
- t.characters = { }
- t.MathConstants = { }
- -- fast access
- local descriptions = tfmtable.descriptions or { }
- t.unicodes = tfmtable.unicodes
- t.indices = tfmtable.indices
- t.marks = tfmtable.marks
-t.goodies = tfmtable.goodies
-t.colorscheme = tfmtable.colorscheme
---~ t.embedding = tfmtable.embedding
- t.descriptions = descriptions
- if tfmtable.fonts then
- t.fonts = table.fastcopy(tfmtable.fonts) -- hm also at the end
- end
- local tp = t.parameters
- local mp = t.math_parameters
- local tfmp = tfmtable.parameters -- let's check for indexes
- --
- tp.slant = (tfmp.slant or tfmp[1] or 0)
- tp.space = (tfmp.space or tfmp[2] or 0)*hdelta
- tp.space_stretch = (tfmp.space_stretch or tfmp[3] or 0)*hdelta
- tp.space_shrink = (tfmp.space_shrink or tfmp[4] or 0)*hdelta
- tp.x_height = (tfmp.x_height or tfmp[5] or 0)*vdelta
- tp.quad = (tfmp.quad or tfmp[6] or 0)*hdelta
- tp.extra_space = (tfmp.extra_space or tfmp[7] or 0)*hdelta
- local protrusionfactor = (tp.quad ~= 0 and 1000/tp.quad) or 0
- local tc = t.characters
- local characters = tfmtable.characters
- local nameneeded = not tfmtable.shared.otfdata --hack
- local changed = tfmtable.changed or { } -- for base mode
- local ischanged = changed and next(changed)
- local indices = tfmtable.indices
- local luatex = tfmtable.luatex
- local tounicode = luatex and luatex.tounicode
- local defaultwidth = luatex and luatex.defaultwidth or 0
- local defaultheight = luatex and luatex.defaultheight or 0
- local defaultdepth = luatex and luatex.defaultdepth or 0
- -- experimental, sharing kerns (unscaled and scaled) saves memory
- -- local sharedkerns, basekerns = tfm.check_base_kerns(tfmtable)
- -- loop over descriptions (afm and otf have descriptions, tfm not)
- -- there is no need (yet) to assign a value to chr.tonunicode
- local scaledwidth = defaultwidth * hdelta
- local scaledheight = defaultheight * vdelta
- local scaleddepth = defaultdepth * vdelta
- local stackmath = tfmtable.ignore_stack_math ~= true
- local private = fonts.private
- local sharedkerns = { }
- for k,v in next, characters do
- local chr, description, index
- if ischanged then
- -- basemode hack
- local c = changed[k]
- if c then
- description = descriptions[c] or v
- v = characters[c] or v
- index = (indices and indices[c]) or c
- else
- description = descriptions[k] or v
- index = (indices and indices[k]) or k
- end
- else
- description = descriptions[k] or v
- index = (indices and indices[k]) or k
- end
- local width = description.width
- local height = description.height
- local depth = description.depth
- 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
- if depth and depth ~= 0 then
- depth = delta*depth
- if nameneeded then
- chr = {
- name = description.name,
- index = index,
- height = height,
- depth = depth,
- width = width,
- }
- else
- chr = {
- index = index,
- height = height,
- depth = depth,
- width = width,
- }
- end
- else
- -- this saves a little bit of memory time and memory, esp for big cjk fonts
- if nameneeded then
- chr = {
- name = description.name,
- index = index,
- height = height,
- width = width,
- }
- else
- chr = {
- index = index,
- height = height,
- width = width,
- }
- end
- end
- -- if trace_scaling then
- -- logs.report("define font","t=%s, u=%s, i=%s, n=%s c=%s",k,chr.tounicode or k,description.index,description.name or '-',description.class or '-')
- -- end
- if tounicode then
- local tu = tounicode[index] -- nb: index!
- if tu then
- chr.tounicode = tu
- end
- end
- if hasquality then
- -- we could move these calculations elsewhere (saves calculations)
- local ve = v.expansion_factor
- if ve then
- chr.expansion_factor = ve*1000 -- expansionfactor, hm, can happen elsewhere
- end
- local vl = v.left_protruding
- if vl then
- chr.left_protruding = protrusionfactor*width*vl
- end
- local vr = v.right_protruding
- if vr then
- chr.right_protruding = protrusionfactor*width*vr
- end
- end
- -- todo: hasitalic
- if hasitalic then
- local vi = description.italic or v.italic
- if vi and vi ~= 0 then
- chr.italic = vi*hdelta
- end
- end
- -- to be tested
- if hasmath then
- -- todo, just operate on descriptions.math
- local vn = v.next
- if vn then
- chr.next = vn
- else
- local vv = v.vert_variants
- if vv then
- local t = { }
- for i=1,#vv do
- local vvi = vv[i]
- t[i] = {
- ["start"] = (vvi["start"] or 0)*vdelta,
- ["end"] = (vvi["end"] or 0)*vdelta,
- ["advance"] = (vvi["advance"] or 0)*vdelta,
- ["extender"] = vvi["extender"],
- ["glyph"] = vvi["glyph"],
- }
- end
- chr.vert_variants = t
- --~ local ic = v.vert_italic_correction
- --~ if ic then
- --~ chr.italic = ic * hdelta
- --~ print(format("0x%05X -> %s",k,chr.italic))
- --~ end
- else
- local hv = v.horiz_variants
- if hv then
- local t = { }
- for i=1,#hv do
- local hvi = hv[i]
- t[i] = {
- ["start"] = (hvi["start"] or 0)*hdelta,
- ["end"] = (hvi["end"] or 0)*hdelta,
- ["advance"] = (hvi["advance"] or 0)*hdelta,
- ["extender"] = hvi["extender"],
- ["glyph"] = hvi["glyph"],
- }
- end
- chr.horiz_variants = t
+local function read_from_tfm(specification)
+ local filename = specification.filename
+ local size = specification.size
+ if trace_defining then
+ report_defining("loading tfm file %s at size %s",filename,size)
+ end
+ local tfmdata = font.read_tfm(filename,size) -- not cached, fast enough
+ if tfmdata then
+ local features = specification.features and specification.features.normal or { }
+ local properties = tfmdata.properties or { }
+ local parameters = tfmdata.parameters or { }
+ local shared = tfmdata.shared or { }
+ properties.name = tfmdata.name
+ properties.fontname = tfmdata.fontname
+ properties.psname = tfmdata.psname
+ properties.filename = specification.filename
+ parameters.size = size
+ shared.rawdata = { }
+ shared.features = features
+ shared.processes = next(features) and tfm.setfeatures(tfmdata,features) or nil
+ --
+ tfmdata.properties = properties
+ tfmdata.parameters = parameters
+ tfmdata.shared = shared
+ --
+ if constructors.resolvevirtualtoo then
+ fonts.loggers.register(tfmdata,file.extname(filename),specification) -- strange, why here
+ local vfname = findbinfile(specification.name, 'ovf')
+ if vfname and vfname ~= "" then
+ local vfdata = font.read_vf(vfname,size) -- not cached, fast enough
+ if vfdata then
+ local chars = tfmdata.characters
+ for k,v in next, vfdata.characters do
+ chars[k].commands = v.commands
end
- end
- end
- local vt = description.top_accent
- if vt then
- chr.top_accent = vdelta*vt
- end
- if stackmath then
- local mk = v.mathkerns
- if mk then
- local kerns = { }
- local v = mk.top_right if v then local k = { } for i=1,#v do local vi = v[i]
- k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
- end kerns.top_right = k end
- local v = mk.top_left if v then local k = { } for i=1,#v do local vi = v[i]
- k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
- end kerns.top_left = k end
- local v = mk.bottom_left if v then local k = { } for i=1,#v do local vi = v[i]
- k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
- end kerns.bottom_left = k end
- local v = mk.bottom_right if v then local k = { } for i=1,#v do local vi = v[i]
- k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
- end kerns.bottom_right = k end
- chr.mathkern = kerns -- singular
+ properties.virtualized = true
+ tfmdata.fonts = vfdata.fonts
end
end
end
- if not nodemode then
- local vk = v.kerns
- if vk then
- --~ if sharedkerns then
- --~ local base = basekerns[vk] -- hashed by table id, not content
- --~ if not base then
- --~ base = {}
- --~ for k,v in next, vk do base[k] = v*hdelta end
- --~ basekerns[vk] = base
- --~ end
- --~ chr.kerns = base
- --~ else
- --~ local tt = {}
- --~ for k,v in next, vk do tt[k] = v*hdelta end
- --~ chr.kerns = tt
- --~ end
- local s = sharedkerns[vk]
- if not s then
- s = { }
- for k,v in next, vk do s[k] = v*hdelta end
- sharedkerns[vk] = s
- end
- chr.kerns = s
- end
- local vl = v.ligatures
- if vl then
- if true then
- chr.ligatures = vl -- shared
- else
- local tt = { }
- for i,l in next, vl do
- tt[i] = l
- end
- chr.ligatures = tt
- end
- end
+ --
+ if next(features) then
+ constructors.applymanipulators("tfm",tfmdata,specification.features.normal,trace_features,report_tfm)
end
- if isvirtual then
- local vc = v.commands
- if vc then
- -- we assume non scaled commands here
- -- tricky .. we need to scale pseudo math glyphs too
- -- which is why we deal with rules too
- local ok = false
- for i=1,#vc do
- local key = vc[i][1]
- if key == "right" or key == "down" then
- ok = true
- break
- end
- end
- if ok then
- local tt = { }
- for i=1,#vc do
- local ivc = vc[i]
- local key = ivc[1]
- if key == "right" then
- tt[#tt+1] = { key, ivc[2]*hdelta }
- elseif key == "down" then
- tt[#tt+1] = { key, ivc[2]*vdelta }
- elseif key == "rule" then
- tt[#tt+1] = { key, ivc[2]*vdelta, ivc[3]*hdelta }
- else -- not comment
- tt[#tt+1] = ivc -- shared since in cache and untouched
- end
- end
- chr.commands = tt
- else
- chr.commands = vc
- end
+ if not features.encoding then
+ local encoding, filename = match(properties.filename,"^(.-)%-(.*)$") -- context: encoding-name.*
+ if filename and encoding and encodings.known[encoding] then
+ features.encoding = encoding
end
end
- tc[k] = chr
- end
- -- t.encodingbytes, t.filename, t.fullname, t.name: elsewhere
- t.size = scaledpoints
- t.factor = delta
- t.hfactor = hdelta
- t.vfactor = vdelta
- if t.fonts then
- t.fonts = table.fastcopy(t.fonts) -- maybe we virtualize more afterwards
- end
- if hasmath then
- -- mathematics.extras.copy(t) -- can be done elsewhere if needed
- local ma = tfm.mathactions
- for i=1,#ma do
- ma[i](t,tfmtable,delta,hdelta,vdelta) -- what delta?
- end
- end
- -- needed for \high cum suis
- local tpx = tp.x_height
- if hasmath then
- if not tp[13] then tp[13] = .86*tpx end -- mathsupdisplay
- if not tp[14] then tp[14] = .86*tpx end -- mathsupnormal
- if not tp[15] then tp[15] = .86*tpx end -- mathsupcramped
- if not tp[16] then tp[16] = .48*tpx end -- mathsubnormal
- if not tp[17] then tp[17] = .48*tpx end -- mathsubcombined
- if not tp[22] then tp[22] = 0 end -- mathaxisheight
- if t.MathConstants then t.MathConstants.AccentBaseHeight = nil end -- safeguard
- end
- t.tounicode = 1
- t.cidinfo = tfmtable.cidinfo
- -- we have t.name=metricfile and t.fullname=RealName and t.filename=diskfilename
- -- when collapsing fonts, luatex looks as both t.name and t.fullname as ttc files
- -- can have multiple subfonts
- if hasmath then
- if trace_defining then
- logs.report("define font","math enabled for: name '%s', fullname: '%s', filename: '%s'",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename")
- end
- else
- if trace_defining then
- logs.report("define font","math disabled for: name '%s', fullname: '%s', filename: '%s'",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename")
- end
- t.nomath, t.MathConstants = true, nil
- end
- if not t.psname then
- -- name used in pdf file as well as for selecting subfont in ttc/dfont
- t.psname = t.fontname or (t.fullname and fonts.names.cleanname(t.fullname))
+ --
+ return tfmdata
end
- if trace_defining then
- logs.report("define font","used for accesing subfont: '%s'",t.psname or "nopsname")
- logs.report("define font","used for subsetting: '%s'",t.fontname or "nofontname")
- end
---~ print(t.fontname,table.serialize(t.MathConstants))
- return t, delta
end
---[[ldx--
-<p>The reason why the scaler is split, is that for a while we experimented
-with a helper function. However, in practice the <l n='api'/> calls are too slow to
-make this profitable and the <l n='lua'/> based variant was just faster. A days
-wasted day but an experience richer.</p>
---ldx]]--
-
-tfm.auto_cleanup = true
-
-local lastfont = nil
-
--- we can get rid of the tfm instance when we have fast access to the
--- scaled character dimensions at the tex end, e.g. a fontobject.width
---
--- flushing the kern and ligature tables from memory saves a lot (only
--- base mode) but it complicates vf building where the new characters
--- demand this data .. solution: functions that access them
-
-function tfm.cleanup_table(tfmdata) -- we need a cleanup callback, now we miss the last one
- if tfm.auto_cleanup then -- ok, we can hook this into everyshipout or so ... todo
- if tfmdata.type == 'virtual' or tfmdata.virtualized then
- for k, v in next, tfmdata.characters do
- if v.commands then v.commands = nil end
- -- if v.kerns then v.kerns = nil end
- end
- else
- -- for k, v in next, tfmdata.characters do
- -- if v.kerns then v.kerns = nil end
- -- end
- end
+local function check_tfm(specification,fullname) -- we could split up like afm/otf
+ local foundname = findbinfile(fullname, 'tfm') or ""
+ if foundname == "" then
+ foundname = findbinfile(fullname, 'ofm') or "" -- not needed in context
end
-end
-
-function tfm.cleanup(tfmdata) -- we need a cleanup callback, now we miss the last one
-end
-
-function tfm.scale(tfmtable, scaledpoints, relativeid)
- local t, factor = tfm.do_scale(tfmtable, scaledpoints, relativeid)
- t.factor = factor
- t.ascender = factor*(tfmtable.ascender or 0)
- t.descender = factor*(tfmtable.descender or 0)
- t.shared = tfmtable.shared or { }
- t.unique = table.fastcopy(tfmtable.unique or {})
---~ print("scaling", t.name, t.factor) -- , tfm.hash_features(tfmtable.specification))
- tfm.cleanup(t)
- return t
-end
-
---[[ldx--
-<p>Analyzers run per script and/or language and are needed in order to
-process features right.</p>
---ldx]]--
-
-fonts.analyzers = fonts.analyzers or { }
-fonts.analyzers.aux = fonts.analyzers.aux or { }
-fonts.analyzers.methods = fonts.analyzers.methods or { }
-fonts.analyzers.initializers = fonts.analyzers.initializers or { }
-
--- todo: analyzers per script/lang, cross font, so we need an font id hash -> script
--- e.g. latin -> hyphenate, arab -> 1/2/3 analyze
-
--- an example analyzer (should move to font-ota.lua)
-
-local state = attributes.private('state')
-
-function fonts.analyzers.aux.setstate(head,font)
- local tfmdata = fontdata[font]
- local characters = tfmdata.characters
- local descriptions = tfmdata.descriptions
- local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean
- while current do
- local id = current.id
- if id == glyph and current.font == font then
- local d = descriptions[current.char]
- if d then
- if d.class == "mark" then
- done = true
- set_attribute(current,state,5) -- mark
- elseif n == 0 then
- first, last, n = current, current, 1
- set_attribute(current,state,1) -- init
- else
- last, n = current, n+1
- set_attribute(current,state,2) -- medi
- end
- else -- finish
- if first and first == last then
- set_attribute(last,state,4) -- isol
- elseif last then
- set_attribute(last,state,3) -- fina
- end
- first, last, n = nil, nil, 0
- end
- elseif id == disc then
- -- always in the middle
- set_attribute(current,state,2) -- midi
- last = current
- else -- finish
- if first and first == last then
- set_attribute(last,state,4) -- isol
- elseif last then
- set_attribute(last,state,3) -- fina
- end
- first, last, n = nil, nil, 0
- end
- current = current.next
+ if foundname == "" then
+ foundname = fonts.names.getfilename(fullname,"tfm")
end
- if first and first == last then
- set_attribute(last,state,4) -- isol
- elseif last then
- set_attribute(last,state,3) -- fina
+ if foundname ~= "" then
+ specification.filename = foundname
+ specification.format = "ofm"
+ return read_from_tfm(specification)
+ elseif trace_defining then
+ report_defining("loading tfm with name %s fails",specification.name)
end
- return head, done
-end
-
-function tfm.replacements(tfm,value)
- -- tfm.characters[0x0022] = table.fastcopy(tfm.characters[0x201D])
- -- tfm.characters[0x0027] = table.fastcopy(tfm.characters[0x2019])
- -- tfm.characters[0x0060] = table.fastcopy(tfm.characters[0x2018])
- -- tfm.characters[0x0022] = tfm.characters[0x201D]
- tfm.characters[0x0027] = tfm.characters[0x2019]
- -- tfm.characters[0x0060] = tfm.characters[0x2018]
end
--- checking
+readers.check_tfm = check_tfm
-function tfm.checked_filename(metadata,whatever)
- local foundfilename = metadata.foundfilename
- if not foundfilename then
- local askedfilename = metadata.filename or ""
- if askedfilename ~= "" then
- foundfilename = resolvers.findbinfile(askedfilename,"") or ""
- if foundfilename == "" then
- logs.report("fonts","source file '%s' is not found",askedfilename)
- foundfilename = resolvers.findbinfile(file.basename(askedfilename),"") or ""
- if foundfilename ~= "" then
- logs.report("fonts","using source file '%s' (cache mismatch)",foundfilename)
- end
- end
- elseif whatever then
- logs.report("fonts","no source file for '%s'",whatever)
- foundfilename = ""
+function readers.tfm(specification)
+ local fullname = specification.filename or ""
+ if fullname == "" then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ fullname = specification.name .. "." .. forced
+ else
+ fullname = specification.name
end
- metadata.foundfilename = foundfilename
- -- logs.report("fonts","using source file '%s'",foundfilename)
end
- return foundfilename
+ return check_tfm(specification,fullname)
end
-
--- status info
-
-statistics.register("fonts load time", function()
- return statistics.elapsedseconds(fonts)
-end)
diff --git a/Master/texmf-dist/tex/context/base/font-tra.mkiv b/Master/texmf-dist/tex/context/base/font-tra.mkiv
index e47c8c49d48..37ea4541a0f 100644
--- a/Master/texmf-dist/tex/context/base/font-tra.mkiv
+++ b/Master/texmf-dist/tex/context/base/font-tra.mkiv
@@ -21,7 +21,7 @@
%D \doiffontpresentelse{adam-lindsay-modern-serif}{YES}{NO}
%D \stoptyping
-\def\doiffontpresentelse#1{\ctxlua{commands.doifelse(fonts.names.exists("#1"))}}
+\def\doiffontpresentelse#1{\ctxcommand{doifelse(fonts.names.exists("#1"))}}
% experimental, maybe this becomes a module
@@ -40,10 +40,10 @@
{\ctxlua{nodes.tracers.steppers.glyphs(\number\otfcollector,#1)}%
\unhbox\otfcollector}
-\def\otfstepcharcommand#1#2% font char
+\def\otfstepcharcommand#1#2#3% font char class
{\removeunwantedspaces
\hskip.5em plus .125em\relax
- U+\hexnumber{#2}:\ruledhbox{\ctxlua{nodes.tracers.fontchar(#1,#2)}}%
+ \doif{#3}{mark}{\underbar}{U+\hexnumber{#2}}:\ruledhbox{\ctxlua{nodes.tracers.fontchar(#1,#2)}}%
\hskip.5em plus .125em\relax}
\def\otfstepmessagecommand#1#2%
@@ -58,10 +58,10 @@
\blank}
\def\showotfstepchars#1%
- {\ctxlua{nodes.tracers.steppers.codes(#1,\!!bs\detokenize{\otfstepcharcommand}\!!es)}}
+ {\ctxlua{nodes.tracers.steppers.codes(#1,"otfstepcharcommand")}}
\def\showotfstepmessages#1%
- {\ctxlua{nodes.tracers.steppers.messages(#1,\!!bs\detokenize{\otfstepmessagecommand}\!!es,true)}}
+ {\ctxlua{nodes.tracers.steppers.messages(#1,"otfstepmessagecommand",true)}}
\def\showotfstepfeatures
{\ctxlua{nodes.tracers.steppers.features()}}
diff --git a/Master/texmf-dist/tex/context/base/font-uni.mkiv b/Master/texmf-dist/tex/context/base/font-uni.mkiv
index 40ab75ed6c2..8fb5d099691 100644
--- a/Master/texmf-dist/tex/context/base/font-uni.mkiv
+++ b/Master/texmf-dist/tex/context/base/font-uni.mkiv
@@ -19,7 +19,8 @@
\unprotect
-\def\uchar#1#2{\ctxlua{commands.uchar(\number#1,\number#2)}}
+%def\uchar#1#2{\ctxcommand{uchar(,)}}
+\def\uchar#1#2{\cldcontext{utf.char(\number\numexpr#1*256+#2\relax)}}
\let\uc\uchar
diff --git a/Master/texmf-dist/tex/context/base/font-vf.lua b/Master/texmf-dist/tex/context/base/font-vf.lua
index 4f99c47b94b..287d073d6bd 100644
--- a/Master/texmf-dist/tex/context/base/font-vf.lua
+++ b/Master/texmf-dist/tex/context/base/font-vf.lua
@@ -11,30 +11,97 @@ if not modules then modules = { } end modules ['font-vf'] = {
changes. This will change.</p>
--ldx]]--
--- define.methods elsewhere !
+local next = next
+
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+local fastcopy = table.fastcopy
+
+local fonts = fonts
+local constructors = fonts.constructors
+local vf = { }
+fonts.handlers.vf = vf
+
+-- general code
+
+function vf.find(name)
+ name = file.removesuffix(file.basename(name))
+ if constructors.resolvevirtualtoo then
+ local format = fonts.loggers.format(name)
+ if format == 'tfm' or format == 'ofm' then
+ if trace_defining then
+ report_defining("locating vf for %s",name)
+ end
+ return findbinfile(name,"ovf")
+ else
+ if trace_defining then
+ report_defining("vf for %s is already taken care of",name)
+ end
+ return nil -- ""
+ end
+ else
+ if trace_defining then
+ report_defining("locating vf for %s",name)
+ end
+ return findbinfile(name,"ovf")
+ end
+end
+
+--[[ldx--
+<p>We overload the <l n='vf'/> reader.</p>
+--ldx]]--
+
+callbacks.register('find_vf_file', vf.find, "locating virtual fonts, insofar needed") -- not that relevant any more
-fonts = fonts or { }
-fonts.vf = fonts.vf or { }
+-- specific code (will move to other module)
-local vf = fonts.vf
-local tfm = fonts.tfm
+local definers = fonts.definers
+local methods = definers.methods
-fonts.define = fonts.define or { }
-fonts.define.methods = fonts.define.methods or { }
+local variants = allocate()
+local combinations = { }
+local combiner = { }
+local whatever = allocate()
+local helpers = allocate()
+local predefined = allocate {
+ dummy = { "comment" },
+ push = { "push" },
+ pop = { "pop" },
+}
+
+methods.variants = variants -- todo .. wrong namespace
+vf.combinations = combinations
+vf.combiner = combiner
+vf.whatever = whatever
+vf.helpers = helpers
+vf.predefined = predefined
+
+setmetatableindex(whatever, function(t,k) local v = { } t[k] = v return v end)
-vf.combinations = vf.combinations or { }
-vf.aux = vf.aux or { }
-vf.aux.combine = vf.aux.combine or { }
+local function checkparameters(g,f)
+ if f and g and not g.parameters and #g.fonts > 0 then
+ local p = { }
+ for k,v in next, f.parameters do
+ p[k] = v
+ end
+ g.parameters = p
+ setmetatable(p, getmetatable(f.parameters))
+ end
+end
-function fonts.define.methods.install(tag, rules)
+function methods.install(tag, rules)
vf.combinations[tag] = rules
- fonts.define.methods[tag] = function(specification)
+ variants[tag] = function(specification)
return vf.combine(specification,tag)
end
end
-function vf.aux.combine.assign(g, name, from, to, start, force)
- local f, id = vf.aux.combine.load(g,name)
+local function combine_load(g,name)
+ return constructors.readanddefine(name or g.specification.name,g.specification.size)
+end
+
+local function combine_assign(g, name, from, to, start, force)
+ local f, id = combine_load(g,name)
if f and id then
-- optimize for whole range, then just g = f
if not from then from, to = 0, 0xFF00 end
@@ -46,36 +113,26 @@ function vf.aux.combine.assign(g, name, from, to, start, force)
g.fonts[hn] = { id = id } -- no need to be sparse
for i=from,to do
if fc[i] and (force or not gc[i]) then
- gc[i] = table.fastcopy(fc[i]) -- can be optimized
+ gc[i] = fastcopy(fc[i],true) -- can be optimized
gc[i].commands = { { 'slot', hn, start } }
gd[i] = fd[i]
end
start = start + 1
end
- if not g.parameters and #g.fonts > 0 then -- share this code !
- g.parameters = table.fastcopy(f.parameters)
- g.italicangle = f.italicangle
- g.ascender = f.ascender
- g.descender = f.descender
- g.factor = f.factor -- brrr
- end
+ checkparameters(g,f)
end
end
-function vf.aux.combine.process(g,list)
+local function combine_process(g,list)
if list then
for _,v in next, list do
- (vf.aux.combine.commands[v[1]] or nop)(g,v)
+ (combiner.commands[v[1]] or nop)(g,v)
end
end
end
-function vf.aux.combine.load(g,name)
- return tfm.read_and_define(name or g.specification.name,g.specification.size)
-end
-
-function vf.aux.combine.names(g,name,force)
- local f, id = tfm.read_and_define(name,g.specification.size)
+local function combine_names(g,name,force)
+ local f, id = constructors.readanddefine(name,g.specification.size)
if f and id then
local fc, gc = f.characters, g.characters
local fd, gd = f.descriptions, g.descriptions
@@ -83,131 +140,64 @@ function vf.aux.combine.names(g,name,force)
local hn = #g.fonts
for k, v in next, fc do
if force or not gc[k] then
- gc[k] = table.fastcopy(v)
+ gc[k] = fastcopy(v,true)
gc[k].commands = { { 'slot', hn, k } }
gd[i] = fd[i]
end
end
- if not g.parameters and #g.fonts > 0 then -- share this code !
- g.parameters = table.fastcopy(f.parameters)
- g.italicangle = f.italicangle
- g.ascender = f.ascender
- g.descender = f.descender
- g.factor = f.factor -- brrr
- end
+ checkparameters(g,f)
end
end
-vf.aux.combine.commands = {
- ["initialize"] = function(g,v) vf.aux.combine.assign (g,g.name) end,
- ["include-method"] = function(g,v) vf.aux.combine.process (g,vf.combinations[v[2]]) end, -- name
- ["copy-parameters"] = function(g,v) vf.aux.combine.parameters(g,v[2]) end, -- name
- ["copy-range"] = function(g,v) vf.aux.combine.assign (g,v[2],v[3],v[4],v[5],true) end, -- name, from-start, from-end, to-start
- ["copy-char"] = function(g,v) vf.aux.combine.assign (g,v[2],v[3],v[3],v[4],true) end, -- name, from, to
- ["fallback-range"] = function(g,v) vf.aux.combine.assign (g,v[2],v[3],v[4],v[5],false) end, -- name, from-start, from-end, to-start
- ["fallback-char"] = function(g,v) vf.aux.combine.assign (g,v[2],v[3],v[3],v[4],false) end, -- name, from, to
- ["copy_names"] = function(g,v) vf.aux.combine.names (g,v[2],true) end,
- ["fallback_names"] = function(g,v) vf.aux.combine.names (g,v[2],false) end,
-}
-
-function vf.combine(specification,tag)
- local g = {
- name = specification.name,
- -- type = 'virtual',
- virtualized = true,
- fonts = { },
- characters = { },
- descriptions = { },
- specification = table.fastcopy(specification)
- }
- vf.aux.combine.process(g,vf.combinations[tag])
- return g
-end
-
-vf.aux.combine.commands["feature"] = function(g,v)
+local combine_feature = function(g,v)
local key, value = v[2], v[3]
if key then
if value == nil then
value = true
end
- if g.specification and g.specification.features.normal then
- g.specification.features.normal[key] = value -- otf?
+ local specification = g.specification
+ if specification then
+ local normalfeatures = specification.features.normal
+ if normalfeatures then
+ normalfeatures[key] = value -- otf?
+ end
end
end
end
--- simple example with features
+--~ combiner.load = combine_load
+--~ combiner.assign = combine_assign
+--~ combiner.process = combine_process
+--~ combiner.names = combine_names
+--~ combiner.feature = combine_feature
+
+combiner.commands = allocate {
+ ["initialize"] = function(g,v) combine_assign (g,g.properties.name) end,
+ ["include-method"] = function(g,v) combine_process (g,combinations[v[2]]) end, -- name
+ -- ["copy-parameters"] = function(g,v) combine_parameters(g,v[2]) end, -- name
+ ["copy-range"] = function(g,v) combine_assign (g,v[2],v[3],v[4],v[5],true) end, -- name, from-start, from-end, to-start
+ ["copy-char"] = function(g,v) combine_assign (g,v[2],v[3],v[3],v[4],true) end, -- name, from, to
+ ["fallback-range"] = function(g,v) combine_assign (g,v[2],v[3],v[4],v[5],false) end, -- name, from-start, from-end, to-start
+ ["fallback-char"] = function(g,v) combine_assign (g,v[2],v[3],v[3],v[4],false) end, -- name, from, to
+ ["copy-names"] = function(g,v) combine_names (g,v[2],true) end,
+ ["fallback-names"] = function(g,v) combine_names (g,v[2],false) end,
+ ["feature"] = combine_feature,
+}
-fonts.define.methods.install(
- "ligatures", {
- { "feature", "liga" } ,
- { "feature", "dlig" } ,
- { "initialize" } ,
+function vf.combine(specification,tag)
+ local g = {
+ name = specification.name,
+ properties = {
+ virtualized = true,
+ },
+ fonts = {
+ },
+ characters = {
+ },
+ descriptions = {
+ },
+ specification = fastcopy(specification),
}
-)
-
---~ fonts.define.methods.install (
---~ "ligatures-x", {
---~ { "feature", "liga" } ,
---~ { "feature", "dlig" } ,
---~ { "initialize" } ,
---~ { "lineheight" }
---~ }
---~ )
-
---~ fonts.define.methods.install(
---~ "lmsymbol10", {
---~ { "fallback_names", "lmsy10.afm" } ,
---~ { "fallback_names", "msam10.afm" } ,
---~ { "fallback_names", "msbm10.afm" }
---~ }
---~ )
---~ \font\TestFont=dummy@lmsymbol10 at 24pt
-
--- docu case
-
---~ fonts.define.methods.install(
---~ "weird", {
---~ { "copy-range", "lmroman10-regular" } ,
---~ { "copy-char", "lmroman10-regular", 65, 66 } ,
---~ { "copy-range", "lmsans10-regular", 0x0100, 0x01FF } ,
---~ { "copy-range", "lmtypewriter10-regular", 0x0200, 0xFF00 } ,
---~ { "fallback-range", "lmtypewriter10-regular", 0x0000, 0x0200 }
---~ }
---~ )
-
--- demo case -> move to module
-
-fonts.define.methods["demo-1"] = function(specification)
- local name = specification.name -- symbolic name
- local size = specification.size -- given size
- local f, id = tfm.read_and_define('lmroman10-regular',size)
- if f and id then
- local capscale, digscale = 0.85, 0.75
- -- f.name, f.type = name, 'virtual'
- f.name, f.virtualized = name, true
- f.fonts = {
- { id = id },
- { name = 'lmsans10-regular' , size = size*capscale }, -- forced extra name
- { name = 'lmtypewriter10-regular', size = size*digscale } -- forced extra name
- }
- local i_is_of_category = characters.i_is_of_category
- local characters, descriptions = f.characters, f.descriptions
- local red = {'special','pdf: 1 0 0 rg'}
- local green = {'special','pdf: 0 1 0 rg'}
- local blue = {'special','pdf: 0 0 1 rg'}
- local black = {'special','pdf: 0 g'}
- for u,v in next, characters do
- if u and i_is_of_category(u,'lu') then
- v.width = capscale*v.width
- v.commands = { red, {'slot',2,u}, black }
- elseif u and i_is_of_category(u,'nd') then
- v.width = digscale*v.width
- v.commands = { blue, {'slot',3,u}, black }
- else
- v.commands = { green, {'slot',1,u}, black }
- end
- end
- end
- return f
+ combine_process(g,combinations[tag])
+ return g
end
diff --git a/Master/texmf-dist/tex/context/base/font-xtx.lua b/Master/texmf-dist/tex/context/base/font-xtx.lua
deleted file mode 100644
index eac75dd2901..00000000000
--- a/Master/texmf-dist/tex/context/base/font-xtx.lua
+++ /dev/null
@@ -1,122 +0,0 @@
-if not modules then modules = { } end modules ['font-xtx'] = {
- version = 1.001,
- comment = "companion to font-ini.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local texsprint, count = tex.sprint, tex.count
-local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower
-local tostring, next = tostring, next
-local lpegmatch = lpeg.match
-
-local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
-
---[[ldx--
-<p>Choosing a font by name and specififying its size is only part of the
-game. In order to prevent complex commands, <l n='xetex'/> introduced
-a method to pass feature information as part of the font name. At the
-risk of introducing nasty parsing and compatinility problems, this
-syntax was expanded over time.</p>
-
-<p>For the sake of users who have defined fonts using that syntax, we
-will support it, but we will provide additional methods as well.
-Normally users will not use this direct way, but use a more abstract
-interface.</p>
-
-<p>The next one is the official one. However, in the plain
-variant we need to support the crappy [] specification as
-well and that does not work too well with the general design
-of the specifier.</p>
---ldx]]--
-
---~ function fonts.define.specify.colonized(specification) -- xetex mode
---~ local list = { }
---~ if specification.detail and specification.detail ~= "" then
---~ for v in gmatch(specification.detail,"%s*([^;]+)%s*") do
---~ local a, b = match(v,"^(%S*)%s*=%s*(%S*)$")
---~ if a and b then
---~ list[a] = b:is_boolean()
---~ if type(list[a]) == "nil" then
---~ list[a] = b
---~ end
---~ else
---~ local a, b = match(v,"^([%+%-]?)%s*(%S+)$")
---~ if a and b then
---~ list[b] = a ~= "-"
---~ end
---~ end
---~ end
---~ end
---~ specification.features.normal = list
---~ return specification
---~ end
-
---~ check("oeps/BI:+a;-b;c=d")
---~ check("[oeps]/BI:+a;-b;c=d")
---~ check("file:oeps/BI:+a;-b;c=d")
---~ check("name:oeps/BI:+a;-b;c=d")
-
-local list = { }
-
-fonts.define.specify.colonized_default_lookup = "file"
-
-local function issome () list.lookup = fonts.define.specify.colonized_default_lookup end
-local function isfile () list.lookup = 'file' end
-local function isname () list.lookup = 'name' end
-local function thename(s) list.name = s end
-local function issub (v) list.sub = v end
-local function iscrap (s) list.crap = string.lower(s) end
-local function istrue (s) list[s] = 'yes' end
-local function isfalse(s) list[s] = 'no' end
-local function iskey (k,v) list[k] = v end
-
-local function istrue (s) list[s] = true end
-local function isfalse(s) list[s] = false end
-
-local spaces = lpeg.P(" ")^0
-local namespec = (1-lpeg.S("/:("))^0 -- was: (1-lpeg.S("/: ("))^0
-local crapspec = spaces * lpeg.P("/") * (((1-lpeg.P(":"))^0)/iscrap) * spaces
-local filename = (lpeg.P("file:")/isfile * (namespec/thename)) + (lpeg.P("[") * lpeg.P(true)/isname * (((1-lpeg.P("]"))^0)/thename) * lpeg.P("]"))
-local fontname = (lpeg.P("name:")/isname * (namespec/thename)) + lpeg.P(true)/issome * (namespec/thename)
-local sometext = (lpeg.R("az","AZ","09") + lpeg.S("+-."))^1
-local truevalue = lpeg.P("+") * spaces * (sometext/istrue)
-local falsevalue = lpeg.P("-") * spaces * (sometext/isfalse)
-local keyvalue = (lpeg.C(sometext) * spaces * lpeg.P("=") * spaces * lpeg.C(sometext))/iskey
-local somevalue = sometext/istrue
-local subvalue = lpeg.P("(") * (lpeg.C(lpeg.P(1-lpeg.S("()"))^1)/issub) * lpeg.P(")") -- for Kim
-local option = spaces * (keyvalue + falsevalue + truevalue + somevalue) * spaces
-local options = lpeg.P(":") * spaces * (lpeg.P(";")^0 * option)^0
-local pattern = (filename + fontname) * subvalue^0 * crapspec^0 * options^0
-
-local normalize_meanings = fonts.otf.meanings.normalize
-
-function fonts.define.specify.colonized(specification) -- xetex mode
- list = { }
- lpegmatch(pattern,specification.specification)
---~ for k, v in next, list do
---~ list[k] = v:is_boolean()
---~ if type(list[a]) == "nil" then
---~ list[k] = v
---~ end
---~ end
- list.crap = nil -- style not supported, maybe some day
- if list.name then
- specification.name = list.name
- list.name = nil
- end
- if list.lookup then
- specification.lookup = list.lookup
- list.lookup = nil
- end
- if list.sub then
- specification.sub = list.sub
- list.sub = nil
- end
--- specification.features.normal = list
- specification.features.normal = normalize_meanings(list)
- return specification
-end
-
-fonts.define.register_split(":", fonts.define.specify.colonized)
diff --git a/Master/texmf-dist/tex/context/base/font-xtx.mkii b/Master/texmf-dist/tex/context/base/font-xtx.mkii
index d6086b44e64..9930124be20 100644
--- a/Master/texmf-dist/tex/context/base/font-xtx.mkii
+++ b/Master/texmf-dist/tex/context/base/font-xtx.mkii
@@ -19,8 +19,95 @@
\unprotect
-%D Loading:
+%D Features:
+
+% \definefontfeature[default] [liga=yes,texligatures=yes,texquotes=yes]
+% \definefontfeature[default-caps][liga=yes,texligatures=yes,texquotes=yes,smcp=yes,script=latn]
+%
+% \starttypescript [serif] [palatino-nova-regular] [name]
+% \definefontsynonym[Serif] [palatinonova-regular][features=default]
+% \definefontsynonym[SerifCaps][palatinonova-regular][features=default-caps] % also sets Serif
+% \stoptypescript
+%
+% \starttypescript [serif] [palatino-nova-regular] [name]
+% \definefontsynonym[Serif] [palatinonova-regular*default]
+% \definefontsynonym[SerifCaps] [palatinonova-regular*default-caps]
+% \stoptypescript
+
+% \definetypeface[mainface][rm][serif][palatino-nova-regular][default] \setupbodyfont[mainface]
+%
+% \starttext
+% ``Test'' -- --- ff fi fl \sc ``Test'' -- --- ff fi fl
+% \stoptext
+
+% \starttext
+% \definefont
+% [blabla]
+% [name:Latin Modern Something]
+% \definefont
+% [blabla]
+% [file:texnansi-lmr10]
+% \blabla test
+% \definefont
+% [blabla]
+% [texnansi-lmtt10]
+% \blabla test
+% \stoptext
+
+\def\definefontfeature
+ {\dotripleargument\dodefinefontfeature}
+
+\def\dododefinefontfeature#1%
+ {\edef\!!stringa{\ifx\!!stringa\empty\else\!!stringa,\fi\executeifdefined{\??fa#1}\empty}}
+
+\def\dodefinefontfeature[#1][#2][#3]%
+ {\doifassignmentelse{#2}
+ {\setevalue{\??fa#1}{#2}}
+ {\let\!!stringa\empty
+ \processcommalist[#2]\dododefinefontfeature
+ \setevalue{\??fa#1}{\ifx\!!stringa\empty\else\!!stringa,\fi#3}}}
+
+\definefontfeature
+ [default]
+ [liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature
+ [smallcaps]
+ [liga=yes,kern=yes,tlig=yes,trep=yes,smcp=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature
+ [oldstyle]
+ [liga=yes,kern=yes,tlig=yes,trep=yes,onum=yes] % texligatures=yes,texquotes=yes
+
+\definefontfeature % no calt
+ [arabic]
+ [language=dflt,script=arab,
+ init=yes,medi=yes,fina=yes,isol=yes,
+ liga=yes,dlig=yes,rlig=yes,clig=yes,
+ mark=yes,mkmk=yes,kern=yes,curs=yes]
+
+\definefontfeature
+ [none]
+ [features=no]
+
+%D Overloaded:
+
+\def\getfontfileparameters#1% can be simpler for mkii (no features)
+ {\edef\@@truefontname{\truefontname{#1}}%
+ \edef\currentfontfileencoding{\truefontdata\@@truefontname\s!encoding}%
+ \edef\currentfontfilemapping {\truefontdata\@@truefontname\s!mapping }%
+ \edef\currentfontfilehandling{\truefontdata\@@truefontname\s!handling}%
+ \edef\currentfontfilefeatures{\truefontdata\@@truefontname\s!features}}
+
+\def\updatefontparameters
+ {\edef\@@fontencoding{\truefontdata\fontfile \s!encoding}%
+ \edef\@@fontmapping {\truefontdata\fontfile \s!mapping }%
+ \edef\@@fonthandling{\truefontdata\somefontname\s!handling}%
+ \edef\@@fontfeatures{\truefontdata\fontfile \s!features}%
+ \edef\@@fontskewchar{\truefontdata\fontfile \s!skewchar}}
+%D Loading:
+%D
%D for some reason xetex does not support [filename] for tfm files and
%D quotes also behave kind of strange " vs ' vs [ vs ...
%D
@@ -219,7 +306,9 @@
\doifnextoptionalelse\dodefinefontsynonym\nodefinefontsynonym}
\def\nodefinefontsynonym
- {\@EA\let\csname\??ff\fontclass\@@fontname\endcsname\@@fontfile}
+ {\@EA\let\csname\??ff\fontclass\@@fontname\endcsname\@@fontfile
+% \@EA\let\csname\??ff\@@fontfile\s!features\endcsname\undefined
+}
\def\dodefinefontsynonym[#1]%
{\edef\@@fontdata{#1}%
diff --git a/Master/texmf-dist/tex/context/base/grph-epd.lua b/Master/texmf-dist/tex/context/base/grph-epd.lua
new file mode 100644
index 00000000000..130907d4e6a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/grph-epd.lua
@@ -0,0 +1,26 @@
+if not modules then modules = { } end modules ['grph-epd'] = {
+ version = 1.001,
+ comment = "companion to grph-epd.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local variables = interfaces.variables
+local settings_to_hash = utilities.parsers.settings_to_hash
+
+-- todo: page, name, file, url
+
+local codeinjections = backends.codeinjections
+
+function figures.mergegoodies(optionlist)
+ local options = settings_to_hash(optionlist)
+ local all = options[variables.all] or options[variables.yes]
+ if all or options[variables.reference] then
+ codeinjections.mergereferences()
+ end
+ if all or options[variables.layer] then
+ codeinjections.mergeviewerlayers()
+ end
+
+end
diff --git a/Master/texmf-dist/tex/context/base/grph-epd.mkiv b/Master/texmf-dist/tex/context/base/grph-epd.mkiv
new file mode 100644
index 00000000000..b066e1adcbd
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/grph-epd.mkiv
@@ -0,0 +1,56 @@
+%D \module
+%D [ file=grph-epd,
+%D version=2010.07.29,
+%D title=\CONTEXT\ Graphic Macros,
+%D subtitle=Merging Goodies,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Graphic Macros / Merging Coodies}
+
+\unprotect
+
+\registerctxluafile{grph-epd}{1.001}
+
+\def\figurereference {\ctxlua{figures.tprint("status","reference")}}
+
+\defineoverlay[epdf-overlay][\directsetup{epdf-overlay}]
+
+\startsetups epdf-overlay
+ \ctxlua{figures.mergegoodies("\@@efinteraction")}%
+ \reference[\figurereference]{}% todo: dest area
+\stopsetups
+
+\def\doaddpdffiguregoodies
+ {\global\setbox\foundexternalfigure\vbox\bgroup
+ \framed[\c!offset=\v!overlay,\c!background={\v!foreground,epdf-overlay}]{\box\foundexternalfigure}%
+ \egroup}
+
+\appendtoks
+ \iflocation\doif\figurefiletype{pdf}{\doifnot\@@efinteraction\v!none\doaddpdffiguregoodies}\fi
+\to \externalfigurepostprocessors
+
+\protect \endinput
+
+% /Properties << /xxxx 22 0 R >>
+% 21 0 obj << /Type /OCG /Name (xxxx) >> endobj
+% 22 0 obj << /OCGs [ 21 0 R ] /Type /OCMD >> endobj
+
+% \def\setepdflayer#1#2#3#4#5#6% x y w h (in bp) 0/1 destination
+% {\setlayer
+% [epdflinks]
+% [\c!x=#1bp,\c!y=#1\s!bp,\c!preset=\v!leftbottom]
+% {\button
+% [\c!width=#3\s!bp,\c!height=#4\s!bp,\c!offset=\v!overlay,\c!frame=\ifnum#5=1 on\else\v!off]%
+% {}[#6]}}
+
+% \def\setepdflayer#1#2#3#4#5#6% x y w h (in bp) 0/1 destination
+% {\setlayer
+% [epdflinks]
+% [\c!x=#1bp,\c!y=#1\s!bp,\c!preset=\v!leftbottom]
+% {\gotowdhtbox{#3\s!bp}{#4\s!bp}[#6]}}
diff --git a/Master/texmf-dist/tex/context/base/grph-fig.mkiv b/Master/texmf-dist/tex/context/base/grph-fig.mkiv
index e10dc0a32c6..fad1c864a6f 100644
--- a/Master/texmf-dist/tex/context/base/grph-fig.mkiv
+++ b/Master/texmf-dist/tex/context/base/grph-fig.mkiv
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% ex => ef with proper parent
+
\writestatus{loading}{ConTeXt Graphic Macros / Figure Handling}
\unprotect
@@ -41,23 +43,23 @@
\def\dodoplaceexternalfigure[#1][#2][#3][#4][#5]%
{\bgroup
- \pushmacro\textunderscore
- \edef\textunderscore{\string_}% brrr, temp hack, still needed?
+ \dostarttagged\t!image\empty
+ \let\textunderscore\letterunderscore % {\string _} % space needed as _ is now letter in unprotected mode
\calculateexternalfigure[][#1][#2][#3][#4][#5]% [] is dummy dwcomp
- \popmacro\textunderscore
- \box\foundexternalfigure
+ \naturalvbox attr \imageattribute 2 {\box\foundexternalfigure}%
+ \dostoptagged
\egroup}
\def\externalfigurereplacement#1#2#3%
{\setupcolors
[\c!state=\v!local]%
- \expanded{\localframed
+ \normalexpanded{\localframed
[\??ef]
[\c!width=\figurewidth,
\c!height=\figureheight,
\c!background=\v!color,
\c!backgroundcolor=missingfigurecolor,
- \c!frame=\@@efframe]}%
+ \c!frame=\@@efframe]}% we need to expand this in order to prevent a loop
{\tt\tfxx \nohyphens
name: \expanded{\verbatimstring{#1}}\\%
file: \expanded{\verbatimstring{#2}}\\%
@@ -160,7 +162,7 @@
\def\dodouseexternalfigure#1#2#3#4%
{\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[#1][#2][#3][#4]}%
- \doanalyseexternalfigurecollection[#2][#4]}
+ \doanalyzeexternalfigurecollection[#2][#4]}
\newconditional\inexternalfigurecollection
\newdimen\xexternalfigurecollectionminwidth
@@ -168,7 +170,7 @@
\newdimen\xexternalfigurecollectionminheight
\newdimen\xexternalfigurecollectionmaxheight
-\def\doanalyseexternalfigurecollection[#1][#2]%
+\def\doanalyzeexternalfigurecollection[#1][#2]%
{\ifconditional\inexternalfigurecollection
\setfalse\inexternalfigurecollection
\getfiguredimensions[#1][#2]%
@@ -259,7 +261,7 @@
\let\currentresourcecomment\empty
\def\showexternalfigures % maybe run time command is better, but no core-run, unless figs-run ...
- {%\writestatus\m!systems{for \string\showexternalfigures\space see \truefilename{x-res-20}.tex}
+ {%\writestatus\m!system{for \string\showexternalfigures\space see \truefilename{x-res-20}.tex}
\usemodule[res-20]\showexternalfigures} % so for the moment we do it this way
\def\overlayfigure#1%
@@ -513,21 +515,11 @@
\dodotypesetbuffer[\jobname][]
\fi\fi}
-% \def\dodotypesetbuffer[#1][#2]%
-% {\bgroup
-% \global\advance\noftypesetbuffers\plusone
-% \edef\bufferfilename{\jobname-buffer-\the\noftypesetbuffers}%
-% \doifmode{*\v!first}
-% {\ctxlua{buffers.save("\bufferfilename.tmp","#1",true)}%
-% \executesystemcommand{context \bufferfilename.tmp}}%
-% \externalfigure[\bufferfilename.pdf][#2]%
-% \egroup}
-
\def\dodotypesetbuffer[#1][#2]%
{\bgroup
\global\advance\noftypesetbuffers\plusone
\edef\bufferfilename{\jobname-buffer-\the\noftypesetbuffers}%
- \ctxlua{buffers.run("\bufferfilename.tmp","#1",true)}%
+ \ctxcommand{runbuffer("\bufferfilename.tmp","#1",true)}%
\externalfigure[\bufferfilename.pdf][#2]%
\egroup}
@@ -551,10 +543,7 @@
\definesystemvariable{tz}
\unexpanded\def\definetypesetting{\dotripleempty\dodefinetypesetting}
-\def\typesetfile {\dotripleempty\dotypesetfile}
-
-\unexpanded\def\definetypesetting{\dotripleempty\dodefinetypesetting}
-\def\typesetfile {\dotripleempty\dotypesetfile}
+\unexpanded\def\typesetfile {\dotripleempty\dotypesetfile}
\def\dodefinetypesetting[#1][#2][#3]% <name> options settings-a
{\doifsomething{#1}{\setvalue{\??tz#1}{\dodotypesetfile{#2}{#3}}}}
@@ -569,13 +558,14 @@
\fi\fi\fi}
\def\dodotypesetfile#1#2#3#4% options settings-a filename settings-b
- {\edef\typesetfilename{\ctxlua{tex.write(jobfiles.run("#3","#1"))}}%
+ {\edef\typesetfilename{\ctxlua{tex.write(job.files.context("#3","#1"))}}%
\expanded{\externalfigure[\typesetfilename]}[#2,#4]}
\setupexternalfigures
[\c!option=,
\c!object=\v!yes, % we only check for no
\c!reset=\v!no,
+ \c!interaction=\v!none,
\c!maxwidth=\@@efwidth,
\c!maxheight=\@@efheight,
\c!bodyfont=\bodyfontsize,
@@ -587,6 +577,7 @@
\c!background=, % new
\c!splitcolor=\s!white,
\c!conversion=,
+ \c!resolution=,
\c!prefix=,
\c!cache=,
% \c!grid=,
diff --git a/Master/texmf-dist/tex/context/base/grph-fil.lua b/Master/texmf-dist/tex/context/base/grph-fil.lua
index 2e32c7a6066..0856f5b0854 100644
--- a/Master/texmf-dist/tex/context/base/grph-fil.lua
+++ b/Master/texmf-dist/tex/context/base/grph-fil.lua
@@ -8,35 +8,58 @@ if not modules then modules = { } end modules ['grph-fil'] = {
local format, concat = string.format, table.concat
-local trace_run = false trackers.register("files.run",function(v) trace_run = v end)
+local trace_run = false trackers.register("graphic.runfile",function(v) trace_run = v end)
-local command = "context %s"
+local report_run = logs.reporter("graphics","run")
-jobfiles = jobfiles or { }
-jobfiles.collected = jobfiles.collected or { }
-jobfiles.tobesaved = jobfiles.tobesaved or { }
+local allocate = utilities.storage.allocate
-local tobesaved, collected = jobfiles.tobesaved, jobfiles.collected
+local collected = allocate()
+local tobesaved = allocate()
+
+local jobfiles = {
+ collected = collected,
+ tobesaved = tobesaved,
+}
+
+job.files = jobfiles
local function initializer()
- tobesaved, collected = jobfiles.tobesaved, jobfiles.collected
+ tobesaved = jobfiles.tobesaved
+ collected = jobfiles.collected
end
-job.register('jobfiles.collected', jobfiles.tobesaved, initializer)
+job.register('job.files.collected', tobesaved, initializer)
jobfiles.forcerun = false
-function jobfiles.run(name,...)
+function jobfiles.run(name,command)
local oldchecksum = collected[name]
local newchecksum = file.checksum(name)
if jobfiles.forcerun or not oldchecksum or oldchecksum ~= newchecksum then
if trace_run then
- commands.writestatus("buffers","changes in '%s', processing forced",name)
+ report_run("processing file, changes in '%s', processing forced",name)
+ end
+ if command and command ~= "" then
+ os.execute(command)
+ else
+ report_run("processing file, no command given for processing '%s'",name)
end
- os.execute(format(command,concat({ name, ... }," ")))
elseif trace_run then
- commands.writestatus("buffers","no changes in '%s', not processed",name)
+ report_run("processing file, no changes in '%s', not processed",name)
end
tobesaved[name] = newchecksum
- return file.replacesuffix(name,"pdf")
+end
+
+function jobfiles.context(name,options)
+ if type(name) == "table" then
+ local result = { }
+ for i=1,#name do
+ result[#result+1] = jobfiles.context(name[i],options)
+ end
+ return result
+ else
+ jobfiles.run(name,"context ".. (options or "") .. " " .. name)
+ return file.replacesuffix(name,"pdf")
+ end
end
diff --git a/Master/texmf-dist/tex/context/base/grph-inc.lua b/Master/texmf-dist/tex/context/base/grph-inc.lua
index 508240a3bc4..7dee63eaf5f 100644
--- a/Master/texmf-dist/tex/context/base/grph-inc.lua
+++ b/Master/texmf-dist/tex/context/base/grph-inc.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['grph-inc'] = {
license = "see context related readme files"
}
+-- figures -> managers.figures
+
-- lowercase types
-- mps tex tmp svg
-- partly qualified
@@ -14,6 +16,8 @@ if not modules then modules = { } end modules ['grph-inc'] = {
-- figures.boxnumber can go as we now can use names
+-- avoid push
+
--[[
The ConTeXt figure inclusion mechanisms are among the oldest code
in ConTeXt and evolve dinto a complex whole. One reason is that we
@@ -36,19 +40,29 @@ run TeX code from within Lua. Some more functionality will move to Lua.
]]--
local format, lower, find, match, gsub, gmatch = string.format, string.lower, string.find, string.match, string.gsub, string.gmatch
-local texsprint, texbox = tex.sprint, tex.box
+local texbox = tex.box
local contains = table.contains
-local concat = table.concat
+local concat, insert, remove = table.concat, table.insert, table.remove
local todimen = string.todimen
-local ctxcatcodes = tex.ctxcatcodes
-local variables = interfaces.variables
+local settings_to_array = utilities.parsers.settings_to_array
+local settings_to_hash = utilities.parsers.settings_to_hash
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+
+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("figures.locating", function(v) trace_figures = v end)
-local trace_bases = false trackers.register("figures.bases", function(v) trace_bases = v end)
-local trace_programs = false trackers.register("figures.programs", function(v) trace_programs = v end)
-local trace_conversion = false trackers.register("figures.conversion", function(v) trace_conversion = v end)
-local trace_inclusion = false trackers.register("figures.inclusion", function(v) trace_inclusion = v end)
+local report_inclusion = logs.reporter("graphics","inclusion")
+
+local context, img = context, img
--- some extra img functions ---
@@ -63,8 +77,12 @@ function img.totable(imgtable)
return result
end
-function img.serialize(i)
- return table.serialize(img.totable(i))
+function img.serialize(i,...)
+ return table.serialize(img.totable(i),...)
+end
+
+function img.print(i,...)
+ return table.print(img.totable(i),...)
end
function img.clone(i,data)
@@ -77,7 +95,7 @@ end
local validsizes = table.tohash(img.boxes())
local validtypes = table.tohash(img.types())
-function img.check_size(size)
+function img.checksize(size)
if size then
size = gsub(size,"box","")
return (validsizes[size] and size) or "crop"
@@ -86,56 +104,74 @@ function img.check_size(size)
end
end
----
+local indexed = { }
+
+function img.ofindex(n)
+ return indexed[n]
+end
+
+--- we can consider an grph-ini file
+
+figures = figures or { }
+local figures = figures
+
+figures.loaded = allocate()
+figures.used = allocate()
+figures.found = allocate()
+figures.suffixes = allocate()
+figures.patterns = allocate()
-figures = figures or { }
-figures.loaded = figures.loaded or { }
-figures.used = figures.used or { }
-figures.found = figures.found or { }
-figures.suffixes = figures.suffixes or { }
-figures.patterns = figures.patterns or { }
figures.boxnumber = figures.boxnumber or 0
figures.defaultsearch = true
figures.defaultwidth = 0
figures.defaultheight = 0
figures.defaultdepth = 0
-figures.n = 0
-figures.prefer_quality = true -- quality over location
+figures.nofprocessed = 0
+figures.preferquality = true -- quality over location
-figures.localpaths = {
+figures.existers = allocate() local existers = figures.existers
+figures.checkers = allocate() local checkers = figures.checkers
+figures.includers = allocate() local includers = figures.includers
+figures.converters = allocate() local converters = figures.converters
+figures.identifiers = allocate() local identifiers = figures.identifiers
+figures.programs = allocate() local programs = figures.programs
+
+figures.localpaths = allocate {
".", "..", "../.."
}
-figures.cachepaths = {
+figures.cachepaths = allocate {
prefix = "",
path = ".",
subpath = ".",
}
-figures.paths = table.copy(figures.localpaths)
+figures.paths = allocate(table.copy(figures.localpaths))
-figures.order = {
- "pdf", "mps", "jpg", "png", "jbig", "svg", "eps", "gif", "mov", "buffer", "tex",
+figures.order = allocate{
+ "pdf", "mps", "jpg", "png", "jp2", "jbig", "svg", "eps", "gif", "mov", "buffer", "tex", "cld",
}
-figures.formats = {
+figures.formats = allocate{
["pdf"] = { list = { "pdf" } },
["mps"] = { patterns = { "mps", "%d+" } },
["jpg"] = { list = { "jpg", "jpeg" } },
+ ["jp2"] = { list = { "jp2" } },
["png"] = { list = { "png" } },
["jbig"] = { list = { "jbig", "jbig2", "jb2" } },
["svg"] = { list = { "svg", "svgz" } },
["eps"] = { list = { "eps", "ai" } },
["gif"] = { list = { "gif" } },
- ["mov"] = { list = { "mov", "avi" } },
+ ["mov"] = { list = { "mov", "flv", "mp4" } }, -- "avi" is not supported
["buffer"] = { list = { "tmp", "buffer", "buf" } },
["tex"] = { list = { "tex" } },
+ ["cld"] = { list = { "cld" } },
}
function figures.setlookups()
- figures.suffixes, figures.patterns = { }, { }
+ local fs, fp = allocate(), allocate()
+ figures.suffixes, figures.patterns = fs, fp
for _, format in next, figures.order do
local data = figures.formats[format]
- local fs, fp = figures.suffixes, figures.patterns
local list = data.list
if list then
for i=1,#list do
@@ -183,7 +219,7 @@ function figures.setpaths(locationset,pathlist)
-- this function can be called each graphic so we provide this optimization
return
end
- local iv, t, h = interfaces.variables, figures.paths, locationset:tohash()
+ local iv, t, h = interfaces.variables, figures.paths, settings_to_hash(locationset)
if last_locationset ~= locationset then
-- change == reset (actually, a 'reset' would indeed reset
if h[iv["local"]] then
@@ -195,8 +231,7 @@ function figures.setpaths(locationset,pathlist)
last_locationset = locationset
end
if h[iv["global"]] then
- -- for s in gmatch(pathlist,",* *([^,]+)") do
- local list = aux.settings_to_array(pathlist)
+ local list = settings_to_array(pathlist)
for i=1,#list do
local s = list[i]
if not contains(t,s) then
@@ -206,8 +241,8 @@ function figures.setpaths(locationset,pathlist)
end
figures.paths, last_pathlist = t, pathlist
if trace_figures then
- commands.writestatus("figures","locations: %s",last_locationset)
- commands.writestatus("figures","path list: %s",concat(figures.paths, " "))
+ report_inclusion("locations: %s",last_locationset)
+ report_inclusion("path list: %s",concat(figures.paths, " "))
end
end
@@ -220,195 +255,245 @@ end
-- interfacing to tex
-do
-
- local figuredata = { }
- local callstack = { }
-
- function figures.new()
- figuredata = {
- request = {
- name = false,
- label = false,
- format = false,
- page = false,
- width = false,
- height = false,
- preview = false,
- ["repeat"] = false,
- controls = false,
- display = false,
- conversion = false,
- cache = false,
- prefix = false,
- size = false,
- },
- used = {
- fullname = false,
- format = false,
- name = false,
- path = false,
- suffix = false,
- width = false,
- height = false,
- },
- status = {
- status = 0,
- converted = false,
- cached = false,
- fullname = false,
- format = false,
- },
- }
- return figuredata
- end
+local function new() -- we could use metatables status -> used -> request but it needs testing
+ local request = {
+ name = false,
+ label = false,
+ format = false,
+ page = false,
+ width = false,
+ height = false,
+ preview = false,
+ ["repeat"] = false,
+ controls = false,
+ display = false,
+ mask = false,
+ conversion = false,
+ resolution = false,
+ cache = false,
+ prefix = false,
+ size = false,
+ }
+ local used = {
+ fullname = false,
+ format = false,
+ name = false,
+ path = false,
+ suffix = false,
+ width = false,
+ height = false,
+ }
+ local status = {
+ status = 0,
+ converted = false,
+ cached = false,
+ fullname = false,
+ format = false,
+ }
+ -- this needs checking because we might check for nil, the test case
+ -- is getfiguredimensions which then should return ~= 0
+ -- setmetatableindex(status, used)
+ -- setmetatableindex(used, request)
+ return {
+ request = request,
+ used = used,
+ status = status,
+ }
+end
- function figures.push(request)
- local ncs = #callstack + 1
- if ncs == 1 then
- statistics.starttiming(figures)
- end
- local figuredata = figures.new()
- if request then
- local iv = interfaces.variables
- -- request.width/height are strings and are only used when no natural dimensions
- -- can be determined; at some point the handlers might set them to numbers instead
- -- local w, h = tonumber(request.width), tonumber(request.height)
- request.page = math.max(tonumber(request.page) or 1,1)
- request.size = img.check_size(request.size)
- request.object = iv[request.object] == variables.yes
- request["repeat"] = iv[request["repeat"]] == variables.yes
- request.preview = iv[request.preview] == variables.yes
- request.cache = request.cache ~= "" and request.cache
- request.prefix = request.prefix ~= "" and request.prefix
- request.format = request.format ~= "" and request.format
- -- request.width = (w and w > 0) or false
- -- request.height = (h and h > 0) or false
- table.merge(figuredata.request,request)
- end
- callstack[ncs] = figuredata
- return figuredata
- end
- function figures.pop()
- local ncs = #callstack
- figuredata = callstack[ncs]
- callstack[ncs] = nil
- if ncs == 1 then
- statistics.stoptiming(figures)
- end
- end
- -- maybe move texsprint to tex
- function figures.get(category,tag,default)
- local value = figuredata[category]
- value = value and value[tag]
- if not value or value == "" or value == true then
- return default or ""
- else
- return value
- end
- end
- function figures.tprint(category,tag,default)
- texsprint(ctxcatcodes,figures.get(category,tag,default))
+ -- use table.insert|remove
+
+local lastfiguredata = nil -- will be topofstack or last so no { } (else problems with getfiguredimensions)
+local callstack = { }
+
+function figures.initialize(request)
+ local figuredata = new()
+ if request then
+ -- request.width/height are strings and are only used when no natural dimensions
+ -- can be determined; at some point the handlers might set them to numbers instead
+ -- local w, h = tonumber(request.width), tonumber(request.height)
+ request.page = math.max(tonumber(request.page) or 1,1)
+ request.size = img.checksize(request.size)
+ request.object = request.object == variables.yes
+ request["repeat"] = request["repeat"] == variables.yes
+ request.preview = request.preview == variables.yes
+ request.cache = request.cache ~= "" and request.cache
+ request.prefix = request.prefix ~= "" and request.prefix
+ request.format = request.format ~= "" and request.format
+ -- request.width = (w and w > 0) or false
+ -- request.height = (h and h > 0) or false
+ table.merge(figuredata.request,request)
end
- function figures.current()
- return callstack[#callstack]
+ return figuredata
+end
+
+function figures.push(request)
+ statistics.starttiming(figures)
+ local figuredata = figures.initialize(request)
+ insert(callstack,figuredata)
+ lastfiguredata = figuredata
+ return figuredata
+end
+
+function figures.pop()
+ lastfiguredata = remove(callstack) or lastfiguredata
+ statistics.stoptiming(figures)
+end
+
+function figures.current()
+ return callstack[#callstack] or lastfiguredata
+end
+
+function figures.get(category,tag,default)
+ local value = lastfiguredata and lastfiguredata[category]
+ value = value and value[tag]
+ if not value or value == "" or value == true then
+ return default or ""
+ else
+ return value
end
+end
+--
+
+function figures.tprint(category,tag,default)
+ context(figures.get(category,tag,default))
end
local defaultformat = "pdf"
-local defaultprefix = "m_k_v_i_"
+local defaultprefix = "m_k_i_v_"
+
+-- todo: local path or cache path
+
+local function forbiddenname(filename)
+ if not filename or filename == "" then
+ return false
+ end
+ local expandedfullname = file.collapsepath(filename,true)
+ local expandedinputname = file.collapsepath(file.addsuffix(environment.jobfilename,environment.jobfilesuffix),true)
+ if expandedfullname == expandedinputname then
+ report_inclusion("skipping graphic with same name as input filename (%s), enforce suffix",expandedinputname)
+ return true
+ end
+ local expandedoutputname = file.collapsepath(codeinjections.getoutputfilename(),true)
+ if expandedfullname == expandedoutputname then
+ report_inclusion("skipping graphic with same name as output filename (%s), enforce suffix",expandedoutputname)
+ return true
+ end
+end
local function register(askedname,specification)
if specification then
- local format = specification.format
- if format then
- local conversion = specification.conversion
- if conversion == "" then
- conversion = nil
- end
- local newformat = conversion
- if not newformat or newformat == "" then
- newformat = defaultformat
- end
- local converter = (newformat ~= format) and figures.converters[format]
- if trace_conversion then
- logs.report("figures","checking conversion of '%s': old format '%s', new format '%s', conversion '%s'",
- askedname,format,newformat,conversion or "default")
- end
- if converter then
- if converter[newformat] then
- converter = converter[newformat]
- else
+ if forbiddenname(specification.fullname) then
+ specification = { }
+ else
+ local format = specification.format
+ if format then
+ local conversion = specification.conversion
+ local resolution = specification.resolution
+ if conversion == "" then
+ conversion = nil
+ end
+ if resolution == "" then
+ resolution = nil
+ end
+ local newformat = conversion
+ if not newformat or newformat == "" then
newformat = defaultformat
+ end
+ if trace_conversion then
+ report_inclusion("checking conversion of '%s': old format '%s', new format '%s', conversion '%s', resolution '%s'",
+ askedname,format,newformat,conversion or "default",resolution or "default")
+ end
+ local converter = (newformat ~= format) and converters[format]
+ if converter then
if converter[newformat] then
converter = converter[newformat]
else
newformat = defaultformat
+ if converter[newformat] then
+ converter = converter[newformat]
+ else
+ converter = nil
+ newformat = defaultformat
+ end
end
+ elseif trace_conversion then
+ report_inclusion("no converter for '%s' -> '%s'",format,newformat)
end
- end
- if converter then
- local oldname = specification.fullname
- local newpath = file.dirname(oldname)
- local oldbase = file.basename(oldname)
- local newbase = file.replacesuffix(oldbase,newformat)
- local fc = specification.cache or figures.cachepaths.path
- if fc and fc ~= "" and fc ~= "." then
- newpath = fc
- else
- newbase = defaultprefix .. newbase
- end
- local subpath = specification.subpath or figures.cachepaths.subpath
- if subpath and subpath ~= "" and subpath ~= "." then
- newpath = newpath .. "/" .. subpath
- end
- local prefix = specification.prefix or figures.cachepaths.prefix
- if prefix and prefix ~= "" then
- newbase = prefix .. newbase
- end
- local newname = file.join(newpath,newbase)
- dir.makedirs(newpath)
- oldname = file.collapse_path(oldname)
- newname = file.collapse_path(newname)
- local oldtime = lfs.attributes(oldname,'modification') or 0
- local newtime = lfs.attributes(newname,'modification') or 0
- if oldtime > newtime then
- if trace_conversion then
- logs.report("figures","converting '%s' from '%s' to '%s'",askedname,format,newformat)
+ if converter then
+ -- local oldname = specification.fullname
+ local oldname = specification.foundname
+ local newpath = file.dirname(oldname)
+ local oldbase = file.basename(oldname)
+ local newbase = file.removesuffix(oldbase)
+ local fc = specification.cache or figures.cachepaths.path
+ if fc and fc ~= "" and fc ~= "." then
+ newpath = fc
+ else
+ newbase = defaultprefix .. newbase
end
- converter(oldname,newname)
- else
- if trace_conversion then
- logs.report("figures","no need to convert '%s' from '%s' to '%s'",askedname,format,newformat)
+ if not file.is_writable(newpath) then
+ if trace_conversion then
+ report_inclusion("[ath '%s'is not writable, forcing conversion path '.' ",newpath)
+ end
+ newpath = "."
+ end
+ local subpath = specification.subpath or figures.cachepaths.subpath
+ if subpath and subpath ~= "" and subpath ~= "." then
+ newpath = newpath .. "/" .. subpath
+ end
+ local prefix = specification.prefix or figures.cachepaths.prefix
+ if prefix and prefix ~= "" then
+ newbase = prefix .. newbase
+ end
+ if resolution and resolution ~= "" then -- the order might change
+ newbase = newbase .. "_" .. resolution
+ end
+ local newbase = file.addsuffix(newbase,newformat)
+ local newname = file.join(newpath,newbase)
+ dir.makedirs(newpath)
+ oldname = file.collapsepath(oldname)
+ newname = file.collapsepath(newname)
+ local oldtime = lfs.attributes(oldname,'modification') or 0
+ local newtime = lfs.attributes(newname,'modification') or 0
+ if newtime == 0 or oldtime > newtime then
+ if trace_conversion then
+ report_inclusion("converting '%s' from '%s' to '%s'",askedname,format,newformat)
+ end
+ converter(oldname,newname,resolution or "")
+ else
+ if trace_conversion then
+ report_inclusion("no need to convert '%s' from '%s' to '%s'",askedname,format,newformat)
+ end
+ end
+ if io.exists(newname) then
+ specification.foundname = oldname
+ specification.fullname = newname
+ specification.prefix = prefix
+ specification.subpath = subpath
+ specification.converted = true
+ format = newformat
+ elseif io.exists(oldname) then
+ specification.fullname = newname
+ specification.converted = false
end
end
- if io.exists(newname) then
- specification.foundname = oldname
- specification.fullname = newname
- specification.prefix = prefix
- specification.subpath = subpath
- specification.converted = true
- format = newformat
- elseif io.exists(oldname) then
- specification.fullname = newname
- specification.converted = false
- end
- end
- end
- local found = figures.suffixes[format] -- validtypes[format]
- if not found then
- specification.found = false
- if trace_figures then
- commands.writestatus("figures","format not supported: %s",format)
end
- else
- specification.found = true
- if trace_figures then
- if validtypes[format] then
- commands.writestatus("figures","format natively supported by backend: %s",format)
- else
- commands.writestatus("figures","format supported by output file format: %s",format)
+ local found = figures.suffixes[format] -- validtypes[format]
+ if not found then
+ specification.found = false
+ if trace_figures then
+ report_inclusion("format not supported: %s",format)
+ end
+ else
+ specification.found = true
+ if trace_figures then
+ if validtypes[format] then
+ report_inclusion("format natively supported by backend: %s",format)
+ else
+ report_inclusion("format supported by output file format: %s",format)
+ end
end
end
end
@@ -416,24 +501,31 @@ local function register(askedname,specification)
specification = { }
end
specification.foundname = specification.foundname or specification.fullname
- figures.found[askedname .. "->" .. (specification.conversion or "default")] = specification
+ figures.found[askedname .. "->" .. (specification.conversion or "default") .. "->" .. (specification.resolution or "default")] = specification
return specification
end
local resolve_too = true -- urls
local function locate(request) -- name, format, cache
- local askedname = resolvers.clean_path(request.name)
- local foundname = figures.found[askedname .. "->" .. (request.conversion or "default")]
+ local askedname = resolvers.cleanpath(request.name)
+ local foundname = figures.found[askedname .. "->" .. (request.conversion or "default") .. "->" .. (request.resolution or "default")]
if foundname then
return foundname
end
-- protocol check
local hashed = url.hashed(askedname)
- if hashed and hashed.scheme ~= "file" then
- local foundname = resolvers.findbinfile(askedname)
- if foundname then
- askedname = foundname
+ if hashed then
+ if hashed.scheme == "file" then
+ local path = hashed.path
+ if path and path ~= "" then
+ askedname = path
+ end
+ else
+ local foundname = resolvers.findbinfile(askedname)
+ if foundname then
+ askedname = foundname
+ end
end
end
-- we could use the hashed data instead
@@ -442,11 +534,12 @@ local function locate(request) -- name, format, cache
local askedformat = (request.format ~= "" and request.format ~= "unknown" and request.format) or file.extname(askedname) or ""
local askedcache = request.cache
local askedconversion = request.conversion
+ local askedresolution = request.resolution
if askedformat ~= "" then
+ askedformat = lower(askedformat)
if trace_figures then
- commands.writestatus("figures","strategy: forced format")
+ report_inclusion("strategy: forced format %s",askedformat)
end
- askedformat = lower(askedformat)
local format = figures.suffixes[askedformat]
if not format then
local figurepatterns = figures.patterns
@@ -459,27 +552,33 @@ local function locate(request) -- name, format, cache
end
end
if format then
- local foundname = figures.exists(askedname,format,resolve_too) -- not askedformat
+ local foundname, quitscanning = figures.exists(askedname,format,resolve_too) -- not askedformat
if foundname then
return register(askedname, {
- askedname = askedname,
- fullname = askedname,
- format = format,
- cache = askedcache,
- foundname = foundname,
+ askedname = askedname,
+ fullname = askedname,
+ format = format,
+ cache = askedcache,
+ foundname = foundname,
conversion = askedconversion,
+ resolution = askedresolution,
})
+ elseif quitscanning then
+ return register(askedname)
end
+ elseif trace_figures then
+ report_inclusion("strategy: unknown format %s",askedformat)
end
if askedpath then
-- path and type given, todo: strip pieces of path
if figures.exists(askedname,askedformat,resolve_too) then
return register(askedname, {
- askedname = askedname,
- fullname = askedname,
- format = askedformat,
- cache = askedcache,
+ askedname = askedname,
+ fullname = askedname,
+ format = askedformat,
+ cache = askedcache,
conversion = askedconversion,
+ resolution = askedresolution,
})
end
else
@@ -492,30 +591,32 @@ local function locate(request) -- name, format, cache
-- is given we don't waste much time
if figures.exists(check,askedformat,resolve_too) then
return register(check, {
- askedname = askedname,
- fullname = check,
- format = askedformat,
- cache = askedcache,
+ askedname = askedname,
+ fullname = check,
+ format = askedformat,
+ cache = askedcache,
conversion = askedconversion,
+ resolution = askedresolution,
})
end
end
if figures.defaultsearch then
- local check = resolvers.find_file(askedname)
+ local check = resolvers.findfile(askedname)
if check and check ~= "" then
return register(askedname, {
- askedname = askedname,
- fullname = check,
- format = askedformat,
- cache = askedcache,
+ askedname = askedname,
+ fullname = check,
+ format = askedformat,
+ cache = askedcache,
conversion = askedconversion,
+ resolution = askedresolution,
})
end
end
end
elseif askedpath then
if trace_figures then
- commands.writestatus("figures","strategy: rootbased path")
+ report_inclusion("strategy: rootbased path")
end
local figureorder = figures.order
for i=1,#figureorder do
@@ -526,19 +627,20 @@ local function locate(request) -- name, format, cache
local check = file.addsuffix(askedname,suffix)
if figures.exists(check,format,resolve_too) then
return register(askedname, {
- askedname = askedname,
- fullname = check,
- format = format,
- cache = askedcache,
+ askedname = askedname,
+ fullname = check,
+ format = format,
+ cache = askedcache,
conversion = askedconversion,
+ resolution = askedresolution,
})
end
end
end
else
- if figures.prefer_quality then
+ if figures.preferquality then
if trace_figures then
- commands.writestatus("figures","strategy: unknown format, prefer quality")
+ report_inclusion("strategy: unknown format, prefer quality")
end
local figurepaths = figures.paths
local figureorder = figures.order
@@ -555,15 +657,16 @@ local function locate(request) -- name, format, cache
local isfile = url.hashed(check).scheme == "file"
if not isfile then
if trace_figures then
- commands.writestatus("figures","warning: skipping path %s",path)
+ report_inclusion("warning: skipping path %s",path)
end
elseif figures.exists(check,format,true) then
return register(askedname, {
- askedname = askedname,
- fullname = check,
- format = format,
- cache = askedcache,
+ askedname = askedname,
+ fullname = check,
+ format = format,
+ cache = askedcache,
conversion = askedconversion,
+ resolution = askedresolution,
})
end
end
@@ -571,7 +674,7 @@ local function locate(request) -- name, format, cache
end
else -- 'location'
if trace_figures then
- commands.writestatus("figures","strategy: unknown format, prefer path")
+ report_inclusion("strategy: unknown format, prefer path")
end
local figurepaths = figures.paths
local figureorder = figures.order
@@ -585,11 +688,12 @@ local function locate(request) -- name, format, cache
local check = path .. "/" .. file.replacesuffix(askedbase,suffix)
if figures.exists(check,format,resolve_too) then
return register(askedname, {
- askedname = askedname,
- fullname = check,
- format = format,
- cache = askedcache,
+ askedname = askedname,
+ fullname = check,
+ format = format,
+ cache = askedcache,
conversion = askedconversion,
+ resolution = askedresolution,
})
end
end
@@ -598,7 +702,7 @@ local function locate(request) -- name, format, cache
end
if figures.defaultsearch then
if trace_figures then
- commands.writestatus("figures","strategy: default tex path")
+ report_inclusion("strategy: default tex path")
end
local figureorder = figures.order
for j=1,#figureorder do
@@ -606,14 +710,15 @@ local function locate(request) -- name, format, cache
local list = figures.formats[format].list or { format }
for k=1,#list do
local suffix = list[k]
- local check = resolvers.find_file(file.replacesuffix(askedname,suffix))
+ local check = resolvers.findfile(file.replacesuffix(askedname,suffix))
if check and check ~= "" then
return register(askedname, {
- askedname = askedname,
- fullname = check,
- format = format,
- cache = askedcache,
+ askedname = askedname,
+ fullname = check,
+ format = format,
+ cache = askedcache,
conversion = askedconversion,
+ resolution = askedresolution,
})
end
end
@@ -625,35 +730,24 @@ end
-- -- -- plugins -- -- --
-figures.existers = figures.existers or { }
-figures.checkers = figures.checkers or { }
-figures.includers = figures.includers or { }
-figures.converters = figures.converters or { }
-figures.identifiers = figures.identifiers or { }
-figures.programs = figures.programs or { }
-
-figures.identifiers.list = {
- figures.identifiers.default
-}
-
-function figures.identifiers.default(data)
+function identifiers.default(data)
local dr, du, ds = data.request, data.used, data.status
local l = locate(dr)
local foundname = l.foundname
- local fullname = l.fullname or foundname
+ local fullname = l.fullname or foundname
if fullname then
- du.format = l.format or false
+ du.format = l.format or false
du.fullname = fullname -- can be cached
ds.fullname = foundname -- original
- ds.format = l.format
- ds.status = (l.found and 10) or 0
+ ds.format = l.format
+ ds.status = (l.found and 10) or 0
end
return data
end
function figures.identify(data)
data = data or figures.current()
- local list = figures.identifiers.list
+ local list = identifiers.list -- defined at the end
for i=1,#list do
local identifier = list[i]
data = identifier(data)
@@ -663,25 +757,28 @@ function figures.identify(data)
end
return data
end
+
function figures.exists(askedname,format,resolve)
- return (figures.existers[format] or figures.existers.generic)(askedname,resolve)
+ return (existers[format] or existers.generic)(askedname,resolve)
end
+
function figures.check(data)
data = data or figures.current()
- local dr, du, ds = data.request, data.used, data.status
- return (figures.checkers[ds.format] or figures.checkers.generic)(data)
+ return (checkers[data.status.format] or checkers.generic)(data)
end
+
function figures.include(data)
data = data or figures.current()
- local dr, du, ds = data.request, data.used, data.status
- return (figures.includers[ds.format] or figures.includers.generic)(data)
+ return (includers[data.status.format] or includers.generic)(data)
end
+
function figures.scale(data) -- will become lua code
- texsprint(ctxcatcodes,"\\doscalefigure")
+ context.doscalefigure()
return data
end
+
function figures.done(data)
- figures.n = figures.n + 1
+ figures.nofprocessed = figures.nofprocessed + 1
data = data or figures.current()
--~ print(table.serialize(figures.current()))
local dr, du, ds, nr = data.request, data.used, data.status, figures.boxnumber
@@ -690,13 +787,14 @@ function figures.done(data)
ds.height = box.height
ds.xscale = ds.width /(du.width or 1)
ds.yscale = ds.height/(du.height or 1)
+ ds.page = ds.page or du.page or dr.page -- sort of redundant but can be limited
--~ print(table.serialize(figures.current()))
return data
end
function figures.dummy(data)
data = data or figures.current()
- local dr, du, ds, nr = data.request, data.used, data.status, figures.boxnumber
+ local dr, du, nr = data.request, data.used, figures.boxnumber
local box = node.hpack(node.new("hlist")) -- we need to set the dir (luatex 0.60 buglet)
du.width = du.width or figures.defaultwidth
du.height = du.height or figures.defaultheight
@@ -710,7 +808,7 @@ end
-- -- -- generic -- -- --
-function figures.existers.generic(askedname,resolve)
+function existers.generic(askedname,resolve)
-- not findbinfile
local result
if lfs.isfile(askedname) then
@@ -721,47 +819,66 @@ function figures.existers.generic(askedname,resolve)
end
if trace_figures then
if result then
- commands.writestatus("figures","found: %s -> %s",askedname,result)
+ report_inclusion("found: %s -> %s",askedname,result)
else
- commands.writestatus("figures","not found: %s",askedname)
+ report_inclusion("not found: %s",askedname)
end
end
return result
end
-function figures.checkers.generic(data)
+
+function checkers.generic(data)
local dr, du, ds = data.request, data.used, data.status
local name, page, size, color = du.fullname or "unknown generic", du.page or dr.page, dr.size or "crop", dr.color or "natural"
+ local mask = dr.mask or "none"
local conversion = dr.conversion
+ local resolution = dr.resolution
if not conversion or conversion == "" then
conversion = "unknown"
end
- local hash = name .. "->" .. page .. "->" .. size .. "->" .. color .. "->" .. conversion
+ if not resolution or resolution == "" then
+ resolution = "unknown"
+ end
+ local hash = name .. "->" .. page .. "->" .. size .. "->" .. color .. "->" .. conversion .. "->" .. resolution
+ .. "->" .. mask
local figure = figures.loaded[hash]
if figure == nil then
- figure = img.new { filename = name, page = page, pagebox = dr.size }
- backends.codeinjections.setfigurecolorspace(data,figure)
+ figure = img.new {
+ filename = name,
+ page = page,
+ pagebox = dr.size,
+ }
+ codeinjections.setfigurecolorspace(data,figure)
+ codeinjections.setfiguremask(data,figure)
figure = (figure and img.scan(figure)) or false
- local f, d = backends.codeinjections.setfigurealternative(data,figure)
+ local f, d = codeinjections.setfigurealternative(data,figure)
figure, data = f or figure, d or data
figures.loaded[hash] = figure
if trace_conversion then
- logs.report("figures","new graphic, hash: %s",hash)
+ report_inclusion("new graphic, hash: %s",hash)
end
else
if trace_conversion then
- logs.report("figures","existing graphic, hash: %s",hash)
+ report_inclusion("existing graphic, hash: %s",hash)
end
end
if figure then
du.width = figure.width
du.height = figure.height
du.pages = figure.pages
+ du.depth = figure.depth or 0
+ du.colordepth = figure.colordepth or 0
+ du.xresolution = figure.xres or 0
+ du.yresolution = figure.yres or 0
+ du.xsize = figure.xsize or 0
+ du.ysize = figure.ysize or 0
ds.private = figure
ds.hash = hash
end
return data
end
-function figures.includers.generic(data)
+
+function includers.generic(data)
local dr, du, ds = data.request, data.used, data.status
-- here we set the 'natural dimensions'
dr.width = du.width
@@ -780,39 +897,43 @@ function figures.includers.generic(data)
local nr = figures.boxnumber
-- it looks like we have a leak in attributes here .. todo
local box = node.hpack(img.node(figure)) -- img.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)
texbox[nr] = box
ds.objectnumber = figure.objnum
- texsprint(ctxcatcodes,"\\relocateexternalfigure")
+ context.relocateexternalfigure()
end
return data
end
-- -- -- nongeneric -- -- --
-function figures.checkers.nongeneric(data,command)
+function checkers.nongeneric(data,command) -- todo: macros and context.*
local dr, du, ds = data.request, data.used, data.status
local name = du.fullname or "unknown nongeneric"
local hash = name
if dr.object then
- -- hm, bugged
- if not jobobjects.get("FIG::"..hash) then
- texsprint(ctxcatcodes,command)
- texsprint(ctxcatcodes,format("\\setobject{FIG}{%s}\\vbox{\\box\\foundexternalfigure}",hash))
+ -- hm, bugged ... waiting for an xform interface
+ if not job.objects.get("FIG::"..hash) then
+ if type(command) == "function" then
+ command()
+ end
+ context.dosetfigureobject(hash)
end
- texsprint(ctxcatcodes,format("\\global\\setbox\\foundexternalfigure\\vbox{\\getobject{FIG}{%s}}",hash))
- else
- texsprint(ctxcatcodes,command)
+ context.doboxfigureobject(hash)
+ elseif type(command) == "function" then
+ command()
end
return data
end
-function figures.includers.nongeneric(data)
+
+function includers.nongeneric(data)
return data
end
-- -- -- mov -- -- --
-function figures.checkers.mov(data)
+function checkers.mov(data)
local dr, du, ds = data.request, data.used, data.status
local width = todimen(dr.width or figures.defaultwidth)
local height = todimen(dr.height or figures.defaultheight)
@@ -820,12 +941,12 @@ function figures.checkers.mov(data)
dr.width, dr.height = width, height
du.width, du.height, du.foundname = width, height, foundname
if trace_inclusion then
- logs.report("figures","including movie '%s': width %s, height %s",foundname,width,height)
+ report_inclusion("including movie '%s': width %s, height %s",foundname,width,height)
end
-- we need to push the node.write in between ... we could make a shared helper for this
context.startfoundexternalfigure(width .. "sp",height .. "sp")
context(function()
- backends.codeinjections.insertmovie {
+ nodeinjections.insertmovie {
width = width,
height = height,
factor = number.dimenfactors.bp,
@@ -840,7 +961,7 @@ function figures.checkers.mov(data)
return data
end
-figures.includers.mov = figures.includers.nongeneric
+includers.mov = includers.nongeneric
-- -- -- mps -- -- --
@@ -853,49 +974,66 @@ local function internal(askedname)
end
end
-function figures.existers.mps(askedname)
+function existers.mps(askedname)
local mprun, mpnum = internal(askedname)
if mpnum then
return askedname
else
- return figures.existers.generic(askedname)
+ return existers.generic(askedname)
end
end
-function figures.checkers.mps(data)
+
+function checkers.mps(data)
local mprun, mpnum = internal(data.used.fullname)
if mpnum then
- return figures.checkers.nongeneric(data,format("\\docheckfiguremprun{%s}{%s}",mprun,mpnum))
+ return checkers.nongeneric(data,function() context.docheckfiguremprun(mprun,mpnum) end)
else
- return figures.checkers.nongeneric(data,format("\\docheckfiguremps{%s}",data.used.fullname))
+ return checkers.nongeneric(data,function() context.docheckfiguremps(data.used.fullname) end)
end
end
-figures.includers.mps = figures.includers.nongeneric
--- -- -- buffer -- -- --
+includers.mps = includers.nongeneric
-function figures.existers.buffer(askedname)
- askedname = file.nameonly(askedname)
- return buffers.exists(askedname) and askedname
+-- -- -- tex -- -- --
+
+function existers.tex(askedname)
+ askedname = resolvers.findfile(askedname)
+ return (askedname ~= "" and askedname) or false
end
-function figures.checkers.buffer(data)
- return figures.checkers.nongeneric(data,format("\\docheckfigurebuffer{%s}", file.nameonly(data.used.fullname)))
+
+function checkers.tex(data)
+ return checkers.nongeneric(data,function() context.docheckfiguretex(data.used.fullname) end)
end
-figures.includers.buffers = figures.includers.nongeneric
--- -- -- tex -- -- --
+includers.tex = includers.nongeneric
-function figures.existers.tex(askedname)
- askedname = resolvers.find_file(askedname)
- return (askedname ~= "" and askedname) or false
+-- -- -- buffer -- -- --
+
+function existers.buffer(askedname)
+ local name = file.nameonly(askedname)
+ local okay = buffers.exists(name)
+ return okay and name, true -- always quit scanning
end
-function figures.checkers.tex(data)
- return figures.checkers.nongeneric(data,format("\\docheckfiguretex{%s}", data.used.fullname))
+
+function checkers.buffer(data)
+ return checkers.nongeneric(data,function() context.docheckfigurebuffer(file.nameonly(data.used.fullname)) end)
+end
+
+includers.buffers = includers.nongeneric
+
+-- -- -- cld -- -- --
+
+existers.cld = existers.tex
+
+function checkers.cld(data)
+ return checkers.nongeneric(data,function() context.docheckfigurecld(data.used.fullname) end)
end
-figures.includers.tex = figures.includers.nongeneric
+
+includers.cld = includers.nongeneric
-- -- -- converters -- -- --
-local function makeoptions(program)
+local function makeoptions(options)
local to = type(options)
return (to == "table" and concat(options," ")) or (to == "string" and options) or ""
end
@@ -903,7 +1041,7 @@ end
local function runprogram(...)
local command = format(...)
if trace_conversion or trace_programs then
- logs.report("figures","running %s",command)
+ report_inclusion("running %s",command)
end
os.spawn(command)
end
@@ -911,22 +1049,30 @@ end
-- -- -- eps -- -- --
local epsconverter = { }
-figures.converters.eps = epsconverter
+converters.eps = epsconverter
-figures.programs.gs = {
+programs.gs = {
+ resolutions = {
+ [variables.low] = "screen",
+ [variables.medium] = "ebook",
+ [variables.high] = "prepress",
+ },
options = {
"-dAutoRotatePages=/None",
- "-dPDFSETTINGS=/prepress",
+ "-dPDFSETTINGS=/%s",
"-dEPSCrop",
},
- command = (os.type == "windows" and "gswin32") or "gs"
+ command = (os.type == "windows" and "gswin32c") or "gs"
}
-function epsconverter.pdf(oldname,newname)
- local gs = figures.programs.gs
+function epsconverter.pdf(oldname,newname,resolution) -- the resolution interface might change
+ local gs = programs.gs
runprogram (
'%s -q -sDEVICE=pdfwrite -dNOPAUSE -dNOCACHE -dBATCH %s -sOutputFile="%s" "%s" -c quit',
- gs.command, makeoptions(gs.options), newname, oldname
+ gs.command,
+ format(makeoptions(gs.options),gs.resolutions[resolution or ""] or "prepress"),
+ newname,
+ oldname
)
end
@@ -935,12 +1081,12 @@ epsconverter.default = epsconverter.pdf
-- -- -- svg -- -- --
local svgconverter = { }
-figures.converters.svg = svgconverter
-figures.converters.svgz = svgconverter
+converters.svg = svgconverter
+converters.svgz = svgconverter
-- inkscape on windows only works with complete paths
-figures.programs.inkscape = {
+programs.inkscape = {
options = {
"--export-dpi=600"
},
@@ -948,15 +1094,17 @@ figures.programs.inkscape = {
}
function svgconverter.pdf(oldname,newname)
- local inkscape = figures.programs.inkscape
+ local inkscape = programs.inkscape
+ local oldname = dir.expandname(oldname)
+ local newname = dir.expandname(newname)
runprogram (
- '%s "%s" --export-pdf="%s" %s',
- inkscape.command, oldname, newname, makeoptions(inkscape.options)
+ '%s "%s" %s -A "%s"',
+ inkscape.command, oldname, makeoptions(inkscape.options), newname
)
end
function svgconverter.png(oldname,newname)
- local inkscape = figures.programs.inkscape
+ local inkscape = programs.inkscape
runprogram (
'%s "%s" --export-png="%s" %s',
inkscape.command, oldname, newname, makeoptions(inkscape.options)
@@ -968,16 +1116,17 @@ svgconverter.default = svgconverter.pdf
-- -- -- gif -- -- --
local gifconverter = { }
-figures.converters.gif = gifconverter
+converters.gif = gifconverter
-figures.programs.convert = {
- command = "convert" -- imagemagick
+programs.convert = {
+ command = "convert" -- imagemagick
+ -- command = "gm convert" -- graphicmagick
}
function gifconverter.pdf(oldname,newname)
- local convert = figures.programs.convert
+ local convert = programs.convert
runprogram (
- "convert %s %s",
+ "%s %s %s %s",
convert.command, makeoptions(convert.options), oldname, newname
)
end
@@ -1010,7 +1159,7 @@ function bases.use(basename)
xml.registerns("rlx","http://www.pragma-ade.com/schemas/rlx") -- we should be able to do this per xml file
end
if trace_bases then
- commands.writestatus("figures","registering base '%s'",basename)
+ report_inclusion("registering base '%s'",basename)
end
end
end
@@ -1018,7 +1167,7 @@ end
function bases.find(basename,askedlabel)
if trace_bases then
- commands.writestatus("figures","checking for '%s' in base '%s'",askedlabel,basename)
+ report_inclusion("checking for '%s' in base '%s'",askedlabel,basename)
end
basename = file.addsuffix(basename,"xml")
local t = bases.found[askedlabel]
@@ -1035,7 +1184,7 @@ function bases.find(basename,askedlabel)
base[2] = xmlfile
base[3] = xml.load(xmlfile)
if trace_bases then
- commands.writestatus("figures","base '%s' loaded",xmlfile)
+ report_inclusion("base '%s' loaded",xmlfile)
end
break
end
@@ -1054,13 +1203,13 @@ function bases.find(basename,askedlabel)
}
bases.found[askedlabel] = t
if trace_bases then
- commands.writestatus("figures","figure '%s' found in base '%s'",askedlabel,base[2])
+ report_inclusion("figure '%s' found in base '%s'",askedlabel,base[2])
end
return t
end
end
if trace_bases and not t then
- commands.writestatus("figures","figure '%s' not found in base '%s'",askedlabel,base[2])
+ report_inclusion("figure '%s' not found in base '%s'",askedlabel,base[2])
end
end
end
@@ -1081,7 +1230,7 @@ function bases.locate(askedlabel)
return false
end
-function figures.identifiers.base(data)
+function identifiers.base(data)
if bases.enabled then
local dr, du, ds = data.request, data.used, data.status
local fbl = bases.locate(dr.name or dr.label)
@@ -1098,18 +1247,46 @@ function figures.identifiers.base(data)
return data
end
-figures.identifiers.list = {
- figures.identifiers.base,
- figures.identifiers.default
+identifiers.list = {
+ identifiers.base,
+ identifiers.default
}
-- tracing
statistics.register("graphics processing time", function()
- local n = figures.n
- if n > 0 then
- return format("%s seconds including tex, n=%s", statistics.elapsedtime(figures),n)
+ local nofprocessed = figures.nofprocessed
+ if nofprocessed > 0 then
+ return format("%s seconds including tex, %s processed images", statistics.elapsedtime(figures),nofprocessed)
else
return nil
end
end)
+
+-- helper
+
+function figures.applyratio(width,height,w,h) -- width and height are strings and w and h are numbers
+ if not width or width == "" then
+ if not height or height == "" then
+ return figures.defaultwidth, figures.defaultheight
+ else
+ height = string.todimen(height)
+ if w and h then
+ return height * w/h, height
+ else
+ return figures.defaultwidth, height
+ end
+ end
+ else
+ width = string.todimen(width)
+ if not height or height == "" then
+ if w and h then
+ return width, width * h/w
+ else
+ return width, figures.defaultheight
+ end
+ else
+ return width, string.todimen(height)
+ end
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/grph-inc.mkiv b/Master/texmf-dist/tex/context/base/grph-inc.mkiv
index 16ee1097a2f..aa2157b9fa8 100644
--- a/Master/texmf-dist/tex/context/base/grph-inc.mkiv
+++ b/Master/texmf-dist/tex/context/base/grph-inc.mkiv
@@ -77,6 +77,7 @@
\def\figurexscale {\ctxlua{figures.tprint("status","xscale",1)}}
\def\figureyscale {\ctxlua{figures.tprint("status","yscale",1)}}
+\def\figuresize {\ctxlua{figures.tprint("request","size")}}
\def\figurelabel {\ctxlua{figures.tprint("request","label")}}
\def\figurefileoriginal {\ctxlua{figures.tprint("request","name")}}
\def\figurefilepage {\ctxlua{figures.tprint("request","page",1)}}
@@ -87,13 +88,20 @@
\def\figurenaturalwidth {\ctxlua{figures.tprint("used","width", \number\dimexpr\defaultfigurewidth \relax)}sp}
\def\figurenaturalheight {\ctxlua{figures.tprint("used","height",\number\dimexpr\defaultfigureheight\relax)}sp}
+\def\figurexresolution {\ctxlua{figures.tprint("used","xresolution",0)}}
+\def\figureyresolution {\ctxlua{figures.tprint("used","yresolution",0)}}
+\def\figurexsize {\ctxlua{figures.tprint("used","xsize",0)}}
+\def\figureysize {\ctxlua{figures.tprint("used","ysize",0)}}
+\def\figurecolordepth {\ctxlua{figures.tprint("used","colordepth",0)}}
+\def\figuredepth {\ctxlua{figures.tprint("used","depth",0)}}
-\def\figurefilepath {\ctxlua{tex.sprint(tex.ctxcatcodes,file.dirname (figures.get("used","fullname")))}}
-\def\figurefilename {\ctxlua{tex.sprint(tex.ctxcatcodes,file.nameonly(figures.get("used","fullname")))}}
-\def\figurefiletype {\ctxlua{tex.sprint(tex.ctxcatcodes,file.extname (figures.get("used","fullname")))}}
\def\figurefullname {\ctxlua{figures.tprint("used","fullname")}}
\def\noffigurepages {\ctxlua{figures.tprint("used","pages",0)}}
+\def\figurefilepath {\ctxsprint{file.dirname (figures.get("used","fullname"))}}
+\def\figurefilename {\ctxsprint{file.nameonly(figures.get("used","fullname"))}}
+\def\figurefiletype {\ctxsprint{file.extname (figures.get("used","fullname"))}}
+
\let\naturalfigurewidth \figurenaturalwidth
\let\naturalfigureheight \figurenaturalheight
@@ -122,7 +130,8 @@
\let\@@efforegroundcolor\empty
\let\@@efcolor \empty
\let\@@efconversion \empty
- \let\@@efbackground \empty}
+ \let\@@efbackground \empty
+ \let\@@efresolution \empty}
\appendtoks \resetexternalfigures \to \everyoverlay
\appendtoks \resetexternalfigures \to \everybeforepagebody % not really needed
@@ -133,11 +142,13 @@
\let\@@eflabel \empty
\let\@@efsize \empty
\let\@@efconversion\@@exconversion
+ \let\@@efresolution\@@exresolution
\let\@@efprefix \@@exprefix
\let\@@efcache \@@excache
\let\@@efpage \!!zerocount
\let\@@efobject \@@exobject
\let\@@efdisplay \empty
+ \let\@@efmask \empty
%
\let\@@efpreset \v!yes
\let\@@efsplit \empty
@@ -146,11 +157,14 @@
\let\@@efsymbol \v!no
%
\let\@@efcontrols \v!no
+ \let\@@efresources \empty
\let\@@efpreview \v!no
\let\@@efrepeat \v!no
%
\let\@@efforegroundcolor\empty
%
+ \let\@@efinteraction\@@exinteraction
+ %
\let\@@efhfactor \empty
\let\@@efwfactor \empty
\let\@@effactor \empty
@@ -202,8 +216,12 @@
\def\doprocessmpslikefigure#1% retrofit into mkii
{\global\setbox\foundexternalfigure\vbox{\convertMPtoPDF{#1}11}}
+\def\doprocesscldlikefigure#1%
+ {\global\setbox\foundexternalfigure\vbox{\cldprocessfile{#1}}}
+
\def\docheckfigurebuffer #1{\doprocesstexlikefigure{\getbuffer[#1]}}
-\def\docheckfiguretex #1{\doprocesstexlikefigure{\input#1\relax}}
+\def\docheckfiguretex #1{\doprocesstexlikefigure{\input{#1}}}
+\def\docheckfigurecld #1{\doprocesscldlikefigure{#1}} % we can always add cldrun
\def\docheckfiguremps #1{\doprocessmpslikefigure{#1}}
\def\docheckfiguremprun #1#2{\doprocesstexlikefigure{\useMPrun{#1}{#2}}}
@@ -227,23 +245,26 @@
% \color[\@@efcolor]{\xdef\globcolorattr{\internalspotcolorname}}
% \endgroup
\ctxlua{figures.push {
- name="#3",
- label="#2", % todo: \@eflabel
- page="\@@efpage",
- size="\@@efsize",
- object="\@@efobject",
- prefix="\@@efprefix",
- cache="\@@efcache",
- format="\@@efmethod",
- preset="\@@efprefix",
- controls="\@@efcontrols",
- preview="\@@efpreview",
- display="\@@efdisplay",
- conversion="\@@efconversion",
- color="\internalspotcolorparent\@@efcolor", % hack is needed
- ["repeat"]="\@@efrepeat",
- width="\@@efwidth", % can be crap
- height="\@@efheight", % can be crap
+ name = "#3",
+ label = "#2", % todo: \@eflabel
+ page = "\@@efpage",
+ size = "\@@efsize",
+ object = "\@@efobject",
+ prefix = "\@@efprefix",
+ cache = "\@@efcache",
+ format = "\@@efmethod",
+ preset = "\@@efprefix",
+ controls = "\@@efcontrols",
+ resources = "\@@efresources",
+ preview = "\@@efpreview",
+ display = "\@@efdisplay",
+ mask = "\@@efmask",
+ conversion = "\@@efconversion",
+ resolution = "\@@efresolution",
+ color = "\internalspotcolorparent\@@efcolor", % hack is needed
+ ["repeat"] = "\@@efrepeat",
+ width = "\@@efwidth", % can be crap
+ height = "\@@efheight", % can be crap
} }%
\ctxlua{figures.identify()}%
\ifconditional\testexternalfigureonly
@@ -355,7 +376,7 @@
\def\dogetfiguredimensions[#1][#2]%
{\startnointerference
\settrue\testexternalfigureonly
- \externalfigure[#1][#2,\c!display=,\c!object=\v!no]%
+ \externalfigure[#1][#2,\c!display=,\c!mask=,\c!object=\v!no]%
\stopnointerference}
\let\getfiguredimensionsonly\getfiguredimensions
@@ -376,9 +397,17 @@
\testexternalfigureonly
\setfalse\externalfigureflush % == test ?
\externalfigure[#1][#2][#3]% or \doexternalfigure
- \externalfigure[#1][#2,\c!display=,\c!object=\v!no]%
+ \externalfigure[#1][#2,\c!display=,\c!mask=,\c!object=\v!no]%
\stopnointerference}
+% helpers (will be replaced when xforms are accessible at the lua end)
+
+\def\dosetfigureobject#1%
+ {\setobject{FIG}{#1}\vbox{\box\foundexternalfigure}}
+
+\def\doboxfigureobject#1%
+ {\global\setbox\foundexternalfigure\vbox{\getobject{FIG}{#1}}} % probably one vbox too many
+
% figurebases
\def\usefigurebase[#1]%
diff --git a/Master/texmf-dist/tex/context/base/grph-raw.lua b/Master/texmf-dist/tex/context/base/grph-raw.lua
new file mode 100644
index 00000000000..361f6944d78
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/grph-raw.lua
@@ -0,0 +1,39 @@
+if not modules then modules = { } end modules ['grph-raw'] = {
+ version = 1.001,
+ comment = "companion to grph-raw.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This module is for Mojca, who wanted something like this for
+-- her gnuplot project. It's somewhat premliminary code but it
+-- works ok for that purpose.
+
+local report_bitmap = logs.reporter("graphics","bitmaps")
+
+local texsp = tex.sp
+
+function figures.bitmapimage(t)
+ local data = t.data
+ local xresolution = tonumber(t.xresolution)
+ local yresolution = tonumber(t.yresolution)
+ if data and xresolution and yresolution then
+ local width, height = t.width or "", t.height or ""
+ local n = backends.nodeinjections.injectbitmap {
+ xresolution = xresolution,
+ yresolution = yresolution,
+ width = width ~= "" and texsp(width) or nil,
+ height = height ~= "" and texsp(height) or nil,
+ data = data,
+ colorspace = t.colorspace,
+ }
+ if n then
+ context.hbox(n)
+ else
+ report_bitmap("format no supported by backend")
+ end
+ else
+ report_bitmap("invalid specification")
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/grph-raw.mkiv b/Master/texmf-dist/tex/context/base/grph-raw.mkiv
new file mode 100644
index 00000000000..426262b4f8e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/grph-raw.mkiv
@@ -0,0 +1,64 @@
+%D \module
+%D [ file=grph-raw,
+%D version=2006.08.26, % overhaul of 1997.03.31
+%D title=\CONTEXT\ Graphic Macros,
+%D subtitle=Raw Bitmaps,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Graphic Macros / Raw Bitmaps}
+
+%D \startluacode
+%D function document.TestBitmap(nx,ny)
+%D local random = math.random
+%D local maxbit = 2^24
+%D for i=1,nx do
+%D for i=1,ny do
+%D context("%06x",random(0,maxbit))
+%D end
+%D end
+%D end
+%D \stopluacode
+%D
+%D \def\TestBitmap#1#2{\ctxlua{document.TestBitmap(#1,#2)}}
+%D
+%D \blank
+%D
+%D \startMPcode
+%D draw textext("\bitmapimage[x=100,y=100]{\TestBitmap{100}{100}}") xsized 10cm ;
+%D \stopMPcode
+%D
+%D \blank
+%D
+%D \startMPcode
+%D draw textext("\bitmapimage[x=200,y=50]{\TestBitmap{50}{200}}") xsized 10cm ;
+%D \stopMPcode
+
+\registerctxluafile{grph-raw}{1.001}
+
+\unprotect
+
+\unexpanded\def\bitmapimage[#1]#2%
+ {\hbox\bgroup
+ \getparameters[@@im][\c!color=rgb,\c!width=,\c!height=,\c!x=,\c!y=,#1]%
+ \ctxlua{figures.bitmapimage {
+ data = \!!bs#2\!!es,
+ xresolution = "\@@imx",
+ yresolution = "\@@imy",
+ colorspace = "\@@imcolor",
+ width = "\@@imwidth",
+ height = "\@@imheight"
+ }}%
+ \egroup}
+
+\unexpanded\def\startbitmapimage[#1]#2\stopbitmapimage
+ {\bitmapimage[#1]{#2}}
+
+\let\stopbitmapimage\relax
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/grph-swf.lua b/Master/texmf-dist/tex/context/base/grph-swf.lua
index e55454b52b5..88eed021a22 100644
--- a/Master/texmf-dist/tex/context/base/grph-swf.lua
+++ b/Master/texmf-dist/tex/context/base/grph-swf.lua
@@ -6,35 +6,85 @@ if not modules then modules = { } end modules ['grph-swf'] = {
license = "see context related readme files"
}
-local format = string.format
+local sub, format, match, byte = string.sub, string.format, string.match, string.byte
+local readstring, readnumber = io.readstring, io.readnumber
+local concat = table.concat
+local floor = math.floor
+local tonumber = tonumber
+local tobitstring = number.tobitstring
-local texsprint = tex.sprint
-local ctxcatcodes = tex.ctxcatcodes
-local pdfannotation = nodes.pdfannotation
+local todimen = number.todimen
+
+local nodeinjections = backends.nodeinjections
+
+local figures = figures
+local context = context
+
+local function getheader(name)
+ local f = io.open(name,"rb")
+ if not f then
+ return
+ end
+ local signature = readstring(f,3) -- F=uncompressed, C=compressed (zlib)
+ local version = readnumber(f,1)
+ local filelength = readnumber(f,-4)
+ local compressed = sub(signature,1,1) == "C"
+ local buffer
+ if compressed then
+ buffer = zlib.decompress(f:read('*a'))
+ else
+ buffer = f:read(20) -- ('*a')
+ end
+ f:close()
+ buffer = { match(buffer,"(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)") }
+ for i=1,9 do
+ buffer[i] = tobitstring(byte(buffer[i]))
+ end
+ local framebits = concat(buffer,"",1,9)
+ local n = tonumber(sub(framebits,1,5),2)
+ local frame = { } -- xmin xmax ymin ymax
+ local xmin = tonumber(sub(framebits,6, 5 + n),2)
+ local xmax = tonumber(sub(framebits,6 + 1*n,5 + 2*n),2)
+ local ymin = tonumber(sub(framebits,6 + 2*n,5 + 3*n),2)
+ local ymax = tonumber(sub(framebits,6 + 3*n,5 + 4*n),2)
+ return {
+ filename = name,
+ version = version,
+ filelength = filelength,
+ framerate = tonumber(byte(buffer[10]) * 256 + byte(buffer[11])),
+ framecount = tonumber(byte(buffer[12]) * 256 + byte(buffer[13])),
+ -- framebits = framebits,
+ compressed = compressed,
+ width = floor((xmax - xmin) / 20),
+ height = floor((ymax - ymin) / 20),
+ rectangle = {
+ xmin = xmin,
+ xmax = xmax,
+ ymin = ymin,
+ ymax = ymax,
+ }
+ }
+end
function figures.checkers.swf(data)
local dr, du, ds = data.request, data.used, data.status
- local width = (dr.width or figures.defaultwidth):todimen()
- local height = (dr.height or figures.defaultheight):todimen()
local foundname = du.fullname
+ local header = getheader(foundname)
+ local width, height = figures.applyratio(dr.width,dr.height,header.width,header.height)
dr.width, dr.height = width, height
du.width, du.height, du.foundname = width, height, foundname
- texsprint(ctxcatcodes,format("\\startfoundexternalfigure{%ssp}{%ssp}",width,height))
- local annot, preview, ref = backends.pdf.helpers.insertswf {
+ context.startfoundexternalfigure(todimen(width),todimen(height))
+ nodeinjections.insertswf {
foundname = foundname,
width = width,
height = height,
-- factor = number.dimenfactors.bp,
- -- display = dr.display,
- -- controls = dr.controls,
+ display = dr.display,
+ controls = dr.controls,
-- label = dr.label,
+ resources = dr.resources,
}
- -- node.write(pdfannotation(width,-height,0,annot()))
- texsprint(ctxcatcodes,format("\\pdfannot width %ssp height %ssp {%s}",width,height,annot())) -- brrrr
---~ if ref then -- wrong ! a direct ref should work
---~ texsprint(ctxcatcodes,format("\\smash{\\pdfrefximage%s\\relax}",ref)) -- brrrr
---~ end
- texsprint(ctxcatcodes,"\\stopfoundexternalfigure")
+ context.stopfoundexternalfigure()
return data
end
diff --git a/Master/texmf-dist/tex/context/base/grph-u3d.lua b/Master/texmf-dist/tex/context/base/grph-u3d.lua
index f3bf1763115..f2baac2f316 100644
--- a/Master/texmf-dist/tex/context/base/grph-u3d.lua
+++ b/Master/texmf-dist/tex/context/base/grph-u3d.lua
@@ -10,7 +10,11 @@ if not modules then modules = { } end modules ['grph-u3d'] = {
local trace_inclusion = false trackers.register("figures.inclusion", function(v) trace_inclusion = v end)
-local pdfannotation = nodes.pdfannotation
+local report_u3d = logs.reporter("graphics","u3d")
+
+local figures = figures
+
+local nodeinjections = backends.nodeinjections
local todimen = string.todimen
-- maybe todo: backends.codeinjections.insertu3d
@@ -23,21 +27,19 @@ function figures.checkers.u3d(data)
dr.width, dr.height = width, height
du.width, du.height, du.foundname = width, height, foundname
if trace_inclusion then
- logs.report("figures","including u3d '%s': width %s, height %s",foundname,width,height)
+ report_u3d("including u3d '%s': width %s, height %s",foundname,width,height)
end
context.startfoundexternalfigure(width .. "sp",height .. "sp")
context(function()
- local annotation, preview, ref = backends.pdf.helpers.insert3d {
- foundname = foundname,
- width = width,
- height = height,
- factor = number.dimenfactors.bp,
- display = dr.display,
- controls = dr.controls,
- label = dr.label,
+ nodeinjections.insertu3d {
+ foundname = foundname,
+ width = width,
+ height = height,
+ factor = number.dimenfactors.bp,
+ display = dr.display,
+ controls = dr.controls,
+ label = dr.label,
}
---~ print(annotation, preview, ref)
- node.write(pdfannotation(width,height,0,annotation()))
end)
context.stopfoundexternalfigure()
return data
diff --git a/Master/texmf-dist/tex/context/base/grph-wnd.lua b/Master/texmf-dist/tex/context/base/grph-wnd.lua
new file mode 100644
index 00000000000..0ea3f8c43d9
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/grph-wnd.lua
@@ -0,0 +1,47 @@
+if not modules then modules = { } end modules ['grph-wnd'] = {
+ version = 1.001,
+ comment = "companion to grph-inc.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- Thanks to Luigi Scarso for making graphic magic work in luatex.
+--
+-- \externalfigure[hacker.jpeg][width=4cm,conversion=gray.jpg]
+
+local converters, suffixes = figures.converters, figures.suffixes
+
+local trace_conversion = false trackers.register("figures.conversion", function(v) trace_conversion = v end)
+
+local report_wand = logs.reporter("graphics","wand")
+
+local function togray(oldname,newname)
+ if lfs.isfile(oldname) then
+ require("gmwand")
+ if trace_conversion then
+ report_wand("converting '%s' to '%s' using gmwand",oldname,newname)
+ end
+ gmwand.InitializeMagick("./") -- What does this path do?
+ local wand = gmwand.NewMagickWand()
+ gmwand.MagickReadImage(wand,oldname)
+ gmwand.MagickSetImageColorspace(wand,gmwand.GRAYColorspace)
+ gmwand.MagickWriteImages(wand,newname,1)
+ gmwand.DestroyMagickWand(wand)
+ else
+ report_wand("unable to convert '%s' to '%s' using gmwand",oldname,newname)
+ end
+end
+
+local formats = { "png", "jpg", "gif" }
+
+for i=1,#formats do
+ local oldformat = formats[i]
+ local newformat = "gray." .. oldformat
+ if trace_conversion then
+ report_wand("installing converter: %s -> %s",oldformat,newformat)
+ end
+ converters[oldformat] = converters[oldformat] or { }
+ converters[oldformat][newformat] = togray
+ suffixes [newformat] = oldformat
+end
diff --git a/Master/texmf-dist/tex/context/base/hand-ini.mkiv b/Master/texmf-dist/tex/context/base/hand-ini.mkiv
index 0285b10cbb1..7b973205992 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\dosetupfontexpansion }
\unexpanded\def\setupfontprotrusion{\dodoubleargument\dosetupfontprotrusion}
-\def\dosetupfontexpansion [#1][#2]{\ctxlua{commands.setupfontexpansion ("#1","#2")}}
-\def\dosetupfontprotrusion[#1][#2]{\ctxlua{commands.setupfontprotrusion("#1","#2")}}
+\def\dosetupfontexpansion [#1][#2]{\ctxcommand{setupfontexpansion ("#1","#2")}}
+\def\dosetupfontprotrusion[#1][#2]{\ctxcommand{setupfontprotrusion("#1","#2")}}
% \setupfontprotrusion[quality-upright][vector=quality]
% \setupfontprotrusion[quality-slanted][vector=quality,right=1.5]
diff --git a/Master/texmf-dist/tex/context/base/java-ans.tex b/Master/texmf-dist/tex/context/base/java-ans.mkii
index 636c894f931..636c894f931 100644
--- a/Master/texmf-dist/tex/context/base/java-ans.tex
+++ b/Master/texmf-dist/tex/context/base/java-ans.mkii
diff --git a/Master/texmf-dist/tex/context/base/java-exa.tex b/Master/texmf-dist/tex/context/base/java-exa.mkii
index f40f70f84df..f40f70f84df 100644
--- a/Master/texmf-dist/tex/context/base/java-exa.tex
+++ b/Master/texmf-dist/tex/context/base/java-exa.mkii
diff --git a/Master/texmf-dist/tex/context/base/java-fil.tex b/Master/texmf-dist/tex/context/base/java-fil.mkii
index 4d79a2ace9e..4d79a2ace9e 100644
--- a/Master/texmf-dist/tex/context/base/java-fil.tex
+++ b/Master/texmf-dist/tex/context/base/java-fil.mkii
diff --git a/Master/texmf-dist/tex/context/base/java-fld.tex b/Master/texmf-dist/tex/context/base/java-fld.mkii
index 3c24b7e02db..93a90dc0afc 100644
--- a/Master/texmf-dist/tex/context/base/java-fld.tex
+++ b/Master/texmf-dist/tex/context/base/java-fld.mkii
@@ -229,54 +229,247 @@ function ForgetChanges ()
\startJSpreamble FieldStack used later
-function Reset_Fields ( FieldSet )
- { var i = 1 ;
- while (true)
- { v = this.getField(FieldSet+":"+i) ;
- if (!v)
- { break }
- else
- { v.value = "Off" }
- i++ } }
-
-function Set_Fields ( FieldSet )
- { var i = 1 ;
- while (true)
- { v = this.getField(FieldSet+":"+i) ;
- if (!v)
- { break }
- else
- { v.value = "On" }
- i++ } }
-
-function Set_Field ( FieldSet, FieldName )
- { Reset_Fields(FieldSet) ;
+function Reset_Fields ( FieldSet ) {
+ var i = 1 ;
+ while (true) {
+ v = this.getField(FieldSet+":"+i) ;
+ if (!v) {
+ break ;
+ } else {
+ v.value = "Off" ;
+ }
+ i++ ;
+ }
+}
+
+function Set_Fields ( FieldSet ) {
+ var i = 1 ;
+ while (true) {
+ v = this.getField(FieldSet+":"+i) ;
+ if (!v) {
+ break ;
+ } else {
+ v.value = "On" ;
+ }
+ i++ ;
+ }
+}
+
+function Set_Field ( FieldSet, FieldName ) {
+ Reset_Fields(FieldSet) ;
v = this.getField(FieldSet+":"+FieldName) ;
- if (v) { v.value = "On" } }
+ if (v) {
+ v.value = "On" ;
+ }
+}
-function Reset_Field ( FieldSet, FieldName )
- { Set_Fields(FieldSet) ;
+function Reset_Field ( FieldSet, FieldName ) {
+ Set_Fields(FieldSet) ;
v = this.getField(FieldSet+":"+FieldName) ;
- if (v) { v.value = "Off" } }
-
-function Walk_Field ( FieldSet )
- { var i = 1 ;
- while (true)
- { v = this.getField(FieldSet+":"+i) ;
- if (v)
- { if (v.value=="On")
- { v.value = "Off" ;
- var ii = i ; ii++ ;
+ if (v) {
+ v.value = "Off" ;
+ }
+}
+
+function Walk_Field ( FieldSet ) {
+ var i = 1 ;
+ while (true) {
+ v = this.getField(FieldSet+":"+i) ;
+ if (v) {
+ if (v.value=="On") {
+ v.value = "Off" ;
+ var ii = i ;
+ ii++ ;
v = this.getField(FieldSet+":"+ii) ;
- if (!v)
- { v = this.getField(FieldSet+":"+1) }
- if (v)
- { v.value = "On" }
- break }
- i++ }
- else
- { break } } }
+ if (!v) {
+ v = this.getField(FieldSet+":"+1) ;
+ }
+ if (v) {
+ v.value = "On" ;
+ }
+ break ;
+ }
+ i++ ;
+ } else {
+ break ;
+ }
+ }
+}
+
+var FieldSets = new Array() ;
+
+function Do_Get_Check_Walk_Field ( FieldSet ) {
+ var f = FieldSets[FieldSet]
+ if (! f) {
+ f = new Array() ;
+ f.number = 0 ;
+ f.delay = 500 ;
+ f.paused = false ;
+ f.running = false ;
+ f.name = FieldSet ;
+ f.timeout = null ;
+ FieldSets[FieldSet] = f ;
+ }
+ return f
+}
+
+function Do_Next_Auto_Walk_Field ( FieldSet ) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ var v = this.getField(FieldSet + ":" + fieldset.number) ;
+ if (v) {
+ if (v.value == "On") {
+ v.value = "Off" ;
+ }
+ }
+ fieldset.number++ ;
+ v = this.getField(FieldSet + ":" + fieldset.number) ;
+ if (! v) {
+ fieldset.number = 1 ;
+ v = this.getField(FieldSet + ":" + fieldset.number) ;
+ }
+ if (v) {
+ v.value = "On"
+ }
+ }
+}
+
+function Do_Stop_Auto_Walk_Field ( FieldSet ) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ try {
+ app.clearInterval(fieldset.timeout) ;
+ app.clearTimeOut(fieldset.timeout) ;
+ } catch (e) {
+ }
+ }
+}
+
+function Do_Start_Auto_Walk_Field ( FieldSet ) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ fieldset.timeout = app.setInterval("Do_Next_Auto_Walk_Field('"+FieldSet+"')", fieldset.delay) ;
+ }
+}
+
+function Start_Walk_Field ( FieldSet, Delay ) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ fieldset.number = 0 ;
+ if (Delay) {
+ fieldset.delay = Delay ;
+ }
+ Reset_Fields(FieldSet) ;
+ Do_Start_Auto_Walk_Field(FieldSet) ;
+ fieldset.running = true ;
+ fieldset.paused = false ;
+ }
+}
+
+function Pause_Walk_Field ( FieldSet ) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ if (fieldset.running) {
+ if (fieldset.paused) {
+ Do_Start_Auto_Walk_Field(FieldSet) ;
+ fieldset.paused = false ;
+ } else {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ fieldset.paused = true ;
+ }
+ }
+ }
+}
+
+function Stop_Walk_Field ( FieldSet ) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ fieldset.running = false ;
+ fieldset.paused = false ;
+ }
+}
+
+function Reset_Walk_Field ( FieldSet ) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ fieldset.number = 0 ;
+ fieldset.running = false ;
+ fieldset.paused = false ;
+ Reset_Fields(FieldSet) ;
+ }
+}
+
+function Previous_Walk_Field ( FieldSet ) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ fieldset.running = false ;
+ fieldset.paused = false ;
+ if (fieldset.number>0) {
+ var v = this.getField(FieldSet + ":" + fieldset.number) ;
+ if (v) {
+ if (v.value == "On") {
+ v.value = "Off" ;
+ }
+ }
+ fieldset.number-- ;
+ v = this.getField(FieldSet + ":" + fieldset.number) ;
+ if (v) {
+ v.value = "On" ;
+ }
+ }
+ }
+}
+
+function Next_Walk_Field ( FieldSet ) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ fieldset.running = false ;
+ fieldset.paused = false ;
+ var f = fieldset.number + 1 ;
+ var v = this.getField(FieldSet + ":" + f) ;
+ if (v) {
+ var v = this.getField(FieldSet + ":" + fieldset.number) ;
+ if (v) {
+ if (v.value == "On") {
+ v.value = "Off" ;
+ }
+ }
+ fieldset.number++ ;
+ v = this.getField(FieldSet + ":" + fieldset.number) ;
+ if (v) {
+ v.value = "On" ;
+ }
+ }
+ }
+}
+
+function Set_Walk_Field_Delay ( FieldSet, Delay ) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ if (Delay) {
+ fieldset.delay = Delay ;
+ if (fieldset.running) {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ Do_Start_Auto_Walk_Field(FieldSet) ;
+ }
+ }
+ }
+}
\stopJSpreamble
+\definereference[Walk] [JS(Walk_Field)]
+\definereference[StartWalk] [JS(Start_Walk_Field)]
+\definereference[StopWalk] [JS(Stop_Walk_Field)]
+\definereference[PauseWalk] [JS(Pause_Walk_Field)]
+\definereference[ResetWalk] [JS(Reset_Walk_Field)]
+\definereference[PreviousWalk][JS(Previous_Walk_Field)]
+\definereference[NextWalk] [JS(Next_Walk_Field)]
+\definereference[SetWalkDelay][JS(Set_Walk_Field_Delay)]
+
\endinput
diff --git a/Master/texmf-dist/tex/context/base/java-imp-exa.mkiv b/Master/texmf-dist/tex/context/base/java-imp-exa.mkiv
new file mode 100644
index 00000000000..f40f70f84df
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/java-imp-exa.mkiv
@@ -0,0 +1,395 @@
+%D \module
+%D [ file=java-exa,
+%D version=2002.??.??,
+%D title=\CONTEXT\ JavaScript Macros,
+%D subtitle=Example Support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% XFDF versus HTML
+% localhost versus remote versus set
+
+% filename | filename-nr => name
+% fakename | fakename-nr => file upload, unless localhost
+%
+% we erase the list because otherwise we end up in browser remembering
+% problems; also, it is not possible to set upload fields 'manually'
+
+\startJSpreamble request_1 used now
+
+ var example_method = "HTML" ;
+ var example_host = "" ;
+ var example_port = "" ;
+ var example_url = "" ;
+ var example_file = "" ;
+
+ var example_log = true ; % false
+
+ function stripped_exa_value( name ) {
+ f = this.getField(name) ;
+ if (f) {
+ str = f.value ;
+ if (str.indexOf(name+'-')==0) {
+ str = str.substr(name.length+1) ;
+ }
+ return str ;
+ } else {
+ return "" ;
+ }
+ }
+
+ function identify_example_url ( ) {
+ if (example_log) {
+ console.clear ;
+ console.println("base url: "+this.baseURL) ;
+ console.println("this url: "+this.URL) ;
+ }
+ if (this.baseURL != "") {
+ example_url = this.baseURL ;
+ } else {
+ if (this.URL != "") {
+ example_url = this.URL
+ }
+ }
+ if (example_url.indexOf("file://")>=0) {
+ example_url = "" ;
+ }
+ str = stripped_exa_value("examplehost") ;
+ if (str != "auto") {
+ example_host = str ;
+ if (str == "localhost") {
+ example_port = "8061"
+ }
+ }
+ str = stripped_exa_value("exampleport") ;
+ if (str != "auto") {
+ example_port = str ;
+ }
+ if (example_log) {
+ console.println("example_url: "+example_url) ;
+ console.println("example_host: "+example_host) ;
+ console.println("example_port: "+example_port) ;
+ }
+ }
+
+ function check_example_url ( url ) {
+ if (url.indexOf("file://")>=0) {
+ url = "http://localhost:8061" ;
+ console.println("file url replaced by: "+url) ;
+ } else {
+ if (url.indexOf("://")<0) {
+ url = "http://" + url ;
+ }
+ if (example_log) {
+ console.println("url before check: "+url) ;
+ }
+% url = url.replace(/(http:\\\/\\\/.+)(\\\/.*$)/, "$1") ;
+ url = url.replace(/(https*:\\\/\\\/.+?)(\\\/.*$)/, "$1/exarequest") ;
+ if (example_log) {
+ console.println("url after check: "+url) ;
+ }
+ }
+ return url ;
+ }
+
+ function set_example_xfdf ( method ) {
+ example_method = method ;
+ }
+
+ function set_example_file ( file ) {
+ example_method = file ;
+ }
+
+ function set_example_host ( host ) {
+ example_host = host ;
+ }
+
+ function set_example_port ( port ) {
+ example_host = host ;
+ }
+
+ function do_erase_example_file(tag) {
+ f = this.getField(tag) ;
+ if (f) {
+ f.value = "" ;
+ }
+ }
+
+ function do_erase_example_list(tag) {
+ for (i=1;i<=100;i++) {
+ f = this.getField(tag+"-"+i) ;
+ if (f) {
+ f.value = "" ;
+ } else {
+ return
+ }
+ }
+ }
+
+ function do_submit_example_url ( url ) {
+ if ((example_method == "XFDF" ) || (url.indexOf("localhost")>=0)) {
+ do_erase_example_file("fakename") ;
+ do_erase_example_list("fakename") ;
+ }
+ url = check_example_url(url) ;
+ if (example_log) {
+ console.println("submitting form to "+url+" using method "+example_method) ;
+ }
+ if (example_file != "") {
+ url = url + "/" + example_file ;
+ }
+ % we need the bFDF for acrobat 5
+ this.submitForm({cURL : url, bFDF : false, cSubmitAs : example_method}) ;
+ }
+
+ function submit_example_form ( ) {
+ identify_example_url() ;
+ if (example_host != "") {
+ if (example_port != "") {
+ do_submit_example_url(example_host+":"+example_port) ;
+ } else {
+ do_submit_example_url(example_host) ;
+ }
+ } else {
+ if (example_url != "") {
+ do_submit_example_url(example_url) ;
+ } else {
+ if (example_port != "") {
+ do_submit_example_url("localhost"+":"+example_port) ;
+ } else {
+ do_submit_example_url("localhost:8061") ; % local exampler
+ }
+ }
+ }
+ resetfilename () ;
+ }
+
+ function submit_form ( host, port) {
+ set_example_host(host) ;
+ set_example_post(post) ;
+ submit_example_form ;
+ }
+
+\stopJSpreamble
+
+\startJSpreamble request_2 used now
+
+ var exa_command = "" ;
+ var exa_option = "" ;
+ var exa_filename = "" ;
+ var exa_filelist = "" ;
+ var exa_registered = "" ;
+
+ function set_request (command,option) {
+ exa_command = command ;
+ if (exa_command == "") {
+ exa_option = option ;
+ } else { if (option == "") {
+ exa_option = "" ;
+ } else { if (option.indexOf("--")<0) {
+ exa_option = "--action=" + option ;
+ } else {
+ exa_option = option ;
+ } } }
+ }
+
+ function assemble_request ( ) {
+ v = this.getField('filename') ;
+ if (v) {
+ exa_filename = v.value ;
+ }
+ v = this.getField('filelist') ;
+ if (v) {
+ exa_filelist = v.value ;
+ }
+% exa_filename = exa_filename.replace(/\\\\/g,'/') ;
+% exa_filelist = exa_filelist.replace(/\\\\/g,'/') ;
+ str = "<?xml version='1.0' ?>\\n" ;
+ str = str+"<exa:request xmlns:exa='http://www.pragma-ade.com/schemas/example.rng'><exa:application>" ;
+ if (exa_filelist == "") {
+ exa_filelist = exa_registered ;
+ } else { if (exa_registered != "") {
+ exa_filelist = exa_filelist + "\\n" + exa_registered ;
+ } }
+ if (exa_command != "") {
+ str = str+"<exa:command>"+exa_command+"</exa:command>" ;
+ }
+ if (exa_option != "") {
+ str = str+"<exa:option>"+exa_option+"</exa:option>" ;
+ }
+ if (exa_filename != "") {
+ str = str+"<exa:filename>"+exa_filename+"</exa:filename>" ;
+ }
+ var fls = "" ;
+ if (exa_filelist != "") {
+ % old method, soon obsolete
+ lst = exa_filelist.split(/\\s/) ;
+ for (i=0;i<lst.length;i++) {
+ fls = fls+"<exa:entry>"+lst[i]+"</exa:entry>" ;
+ }
+ } else { if (exa_multiple) {
+ for (i=1;i<=100;i++) {
+ % console.println("file field "+i) ;
+ f = this.getField("filename-"+ i) ;
+% if (f) { if (f.value != "") {
+% if (g) { if (g.value == "") {
+% fls = fls+"<exa:entry>"+f.value+"</exa:entry>" ;
+% } else {
+% fls = fls+"<exa:entry label='" + g.value + "'>"+f.value+"</exa:entry>" ;
+% } } else {
+% fls = fls+"<exa:entry>"+f.value+"</exa:entry>" ;
+% }
+% } }
+ if (f) { if (f.value != "") {
+ fls = fls + "<exa:entry" ;
+ g = this.getField("dataname-"+ i) ;
+ if (g) { if (g.value == "") {
+ % console.println("a") ;
+ fls = fls + ">" ;
+ } else {
+ % console.println("b") ;
+ fls = fls + " label='" + g.value + "'>" ;
+ } } else {
+ % console.println("c") ;
+ fls = fls + ">" ;
+ }
+ fls = fls + f.value + "</exa:entry>" ;
+ } }
+ }
+ } }
+ if (fls != "") {
+ str = str + "<exa:filelist>" + fls + "</exa:filelist>" ;
+ }
+ str = str + "</exa:application></exa:request>" ;
+ v = this.getField('exa:request') ;
+ if (v) {
+ v.value = str ;
+ }
+ }
+
+\stopJSpreamble
+
+\startJSpreamble request_3 used now
+
+ var exa_multiple = false ;
+
+ function setfilename ( suffixes ) {
+ if (event.targetName) {
+ var name = event.targetName ;
+ var fake = name.replace(/filename/,"fakename") ;
+ } else {
+ var name = 'filename' ;
+ var fake = 'fakename' ;
+ }
+ f = this.getField(fake) ;
+ if (f) {
+ f.browseForFileToSubmit() ;
+ if ((suffixes != "") && (f.value != "")) {
+ %
+ s = suffixes.replace(/,/g,"|") ;
+ r = new RegExp() ;
+ s = "\\\\.(" + s + ")$" ;
+ r.compile(s, "i") ;
+ if (f.value.search(r)<=0) {
+ f.value = "" ;
+ app.alert('This filetype is not permitted.') ;
+ %
+ % lst = suffixes.split(/,/) ;
+ % ok = false ;
+ % for (i=0;i<lst.length;i++) {
+ % if (f.value == lst[i]) {
+ % ok = true ;
+ % }
+ % }
+ % if (! ok) {
+ % f.value = "" ;
+ % app.alert('This filetype is not permitted.') ;
+ %
+ }
+ }
+ g = this.getField(name) ;
+ if (g) {
+ g.value = f.value ;
+ }
+% we need to set the value of the selector to empty else
+% we get some funny preloading of multimeg files in spite
+% of the specs that say that xml fields will not get sent
+% if (example_method == "XFDF" ) {
+% f.value = "" ;
+% } else {
+% identify_example_url ;
+% if (example_url.indexOf("localhost")>=0) {
+% f.value = "" ;
+% }
+% }
+ }
+ this.dirty = false ;
+ }
+
+ function addfilename () {
+ if (exa_multiple) {
+ h = this.getField("filelist") ;
+ g = this.getField("filename") ;
+ if ((g) && (h)) {
+ str = g.value ;
+ if (h.value == "") {
+ h.value = str ;
+ } else {
+ h.value = h.value + "\\n" + str ;
+ }
+ g.value = "" ;
+ this.value = "" ;
+ }
+ }
+ this.dirty = false ;
+ }
+
+ % this only works with client that assembles request
+
+ function registerfilename (str) {
+ if (str!="") {
+ h = this.getField("filelist") ;
+ if (h) {
+ if (h.value != "") {
+ h.value = h.value + "\\n" ;
+ }
+ h.value = h.value + str ;
+ } else {
+ if (exa_registered != "") {
+ exa_registered = exa_registered + "\\n" ;
+ }
+ exa_registered = exa_registered + str ;
+ }
+ }
+ console.show ;
+ console.println('registered files') ;
+ console.println("file: "+str) ;
+ console.println("list: "+exa_registered) ;
+ this.dirty = false ;
+ }
+
+ function checkfilename () {
+ }
+
+ function getfilename ( suffixes ) {
+ setfilename(suffixes) ;
+ checkfilename() ;
+ addfilename() ;
+ }
+
+ function resetfilename () {
+ do_erase_example_file("fakename") ;
+ do_erase_example_file("filename") ;
+ do_erase_example_file("filelist") ;
+ do_erase_example_list("filename") ;
+ do_erase_example_list("fakename") ;
+ }
+
+\stopJSpreamble
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/java-imp-fil.mkiv b/Master/texmf-dist/tex/context/base/java-imp-fil.mkiv
new file mode 100644
index 00000000000..592e9460d45
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/java-imp-fil.mkiv
@@ -0,0 +1,52 @@
+%D \module
+%D [ file=java-fil,
+%D version=1998.06.01,
+%D title=\CONTEXT\ JavaScript Macros,
+%D subtitle=Filing and Printing,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startJSpreamble Auxiliary used now
+
+ function DocumentFileName() {
+ var Paths = this.path.split("/") ;
+ Paths = Paths[Paths.length-1].split(".") ;
+ return(Paths[0])
+ }
+
+ function Print_Page_Range(From,To) {
+ if ((Number(From)>0) && (Number(To) >= Number(From))) {
+ var myFrom = Number(From)-1 ;
+ var myTo = Number(To)-1 ;
+ this.print(false,myFrom,myTo,true) ;
+ }
+ }
+
+ function Print_This_Page() {
+ this.print(false,this.pageNum,this.pageNum,true) ;
+ }
+
+\stopJSpreamble
+
+\definereference
+ [PrintSubPaginas]
+ [JS(Print_Page_Range{\firstsubpage,\lastsubpage})]
+
+\definereference
+ [PrintSubPages]
+ [JS(Print_Page_Range{\firstsubpage,\lastsubpage})]
+
+\definereference
+ [PrintDezePagina]
+ [JS(Print_This_Page)]
+
+\definereference
+ [PrintThisPage]
+ [JS(Print_This_Page)]
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/java-imp-fld.mkiv b/Master/texmf-dist/tex/context/base/java-imp-fld.mkiv
new file mode 100644
index 00000000000..a0909f59496
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/java-imp-fld.mkiv
@@ -0,0 +1,536 @@
+%D \module
+%D [ file=java-fld,
+%D version=1998.05.20,
+%D title=\CONTEXT\ JavaScript Macros,
+%D subtitle=Field Support,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 In \LUATEX\ the following does not work out well:
+%D
+%D \starttyping
+%D v = v.replace(/\\\\"e/g,"\\353") ;
+%D \stoptyping
+%D
+%D But this does:
+%D
+%D \starttyping
+%D v = String(v).replace(/\\\\"e/g,"\\353") ;
+%D \stoptyping
+%D
+%D Probably a \UNICODE\ issue. Beware, in \MKIV\ we have a
+%D different escaping of \type {\\}.
+%D
+%D Watch out: cf. the latest pdf specification we've changed
+%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.
+
+\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
+ if character == "" then
+ character = " "
+ end
+ if accent == '"' then
+ verbatim(" '\\\\%s%s' : '\\u%04X',\n",accent,character,utf.byte(mapping))
+ else
+ verbatim(' "\\\\%s%s" : "\\u%04X",\n',accent,character,utf.byte(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")
+\stopluasetups
+
+% maybe make { } tex braces in javascript code so that we can call lua
+
+\def\JavaScriptTeXAccentMapping{\luasetup{javascript:pdfencoding}}
+
+\startJSpreamble SanitizeTeXInput used later
+
+var TeXAccentMapping = \JavaScriptTeXAccentMapping
+
+function TeX_Replacer(original,str) {
+ return (TeXAccentMapping[str] || str) ;
+}
+
+function Sanitized_TeX_String(value) {
+ return (value.replace(/(\\..)/g, TeX_Replacer)) ;
+}
+
+var TeX_Key_Mode = 0 ;
+var TeX_Key_Char = "" ;
+
+function Initialize_TeX_Keystroke() {
+ TeX_Key_Char = "" ;
+ TeX_Key_Mode = 0 ;
+}
+
+function Sanitized_TeX_Keystroke(change) {
+ if (!event.willCommit) {
+ if (change=="\\") {
+ TeX_Key_Mode = 1 ;
+ return ("")
+ } else if (TeX_Key_Mode == 1) {
+ TeX_Key_Mode = 2 ;
+ TeX_Key_Char = change ;
+ return ("")
+ } else if (TeX_Key_Mode == 2) {
+ TeX_Key_Mode = 0 ;
+ TeX_Key_Char = "\\"+TeX_Key_Char+change ;
+ return (Sanitized_TeX_String(TeX_Key_Char))
+ } else {
+ TeX_Key_Mode = 0 ;
+ return (change)
+ }
+ }
+}
+
+function Initialize_TeX_Key() {
+ Initialize_TeX_Keystroke() ;
+}
+
+function Convert_TeX_Key() {
+ if (!event.willCommit) {
+ event.change = Sanitized_TeX_Keystroke(event.change) ;
+ }
+}
+
+function Convert_TeX_String() {
+ event.value = Sanitized_TeX_String(event.value) ;
+}
+
+\stopJSpreamble
+
+% \startJScode {Initialize_TeX_Key} uses {SanitizeTeXInput}
+% Initialize_TeX_Keystroke() ;
+% \stopJScode
+%
+% \startJScode {Convert_TeX_Key} uses {SanitizeTeXInput}
+% if (!event.willCommit) {
+% event.change = Sanitized_TeX_Keystroke(event.change) ;
+% }
+% \stopJScode
+%
+% \startJScode{Convert_TeX_String} uses {SanitizeTeXInput}
+% event.value = Sanitized_TeX_String(event.value) ;
+% \stopJScode
+
+% was used now but we autocheck anyway so lets test this for a while
+
+\startJSpreamble FieldsStates used later
+
+var visible_field = new Array() ;
+var visible_fields = 0 ;
+
+function PresetFields() {
+ this.syncAnnotScan() ;
+}
+
+function Preset_Fields() {
+ this.syncAnnotScan() ;
+}
+
+function Hide_When_Down() {
+ event.target.hidden = true ;
+}
+
+function Hide_Field(Name) {
+ var v = this.getField(Name) ;
+ if (v) {
+ v.hidden = true ;
+ v.readonly = true ;
+ this.dirty = false ;
+ }
+}
+
+function Do_Vide_Field(Name, Closable) {
+ var v = this.getField(Name) ;
+ if (v) {
+ ++visible_fields ;
+ visible_field[visible_fields] = Name ;
+ v.hidden = false ;
+ if (Closable) {
+ v.readonly = false ;
+ v.value = "Yes" ;
+ }
+ this.dirty = false ;
+ }
+}
+
+function Vide_Field(Name) {
+ Do_Vide_Field(Name,false) ;
+}
+
+function Vide_Hide_Field(Name) {
+ Do_Vide_Field(Name,true) ;
+}
+
+function Hide_Fields() {
+ while (visible_fields>0) {
+ Hide_Field(visible_field[visible_fields]) ;
+ --visible_fields ;
+ }
+}
+
+function Vide_Fields(Name) {
+ Hide_Fields() ;
+ Vide_Field(Name) ;
+}
+
+function Vide_Hide_Fields(Name) {
+ Hide_Fields() ;
+ Vide_Hide_Field(Name) ;
+}
+
+function Toggle_Hide(Name) {
+ var v = this.getField(Name) ;
+ if (v) {
+ v.hidden = !v.hidden ;
+ this.dirty = false ;
+ }
+}
+
+function Field_On(Name) {
+ v = this.getField(Name) ;
+ if (v) {
+ v.value = "Yes" ;
+ this.dirty = false ;
+ }
+}
+
+function Field_Off(Name) {
+ var v = this.getField(Name) ;
+ if (v) {
+ v.value = "Off" ;
+ this.dirty = false ;
+ }
+}
+
+function Toggle_Value(Name) {
+ var v = this.getField(Name) ;
+ if (v) {
+ if (v.value != "Off") {
+ v.value = "Off" ;
+ } else {
+ v.value = "Yes" ;
+ }
+ }
+ this.dirty = false ;
+}
+
+function Toggle_Read(Name) {
+ var v = this.getField(Name);
+ if (v) {
+ v.readonly = !v.readonly ;
+ }
+}
+
+function Flip_Fields(Name) {
+ var Names = Name.split(",") ;
+ for (var i=0; i < Names.length; i++) {
+ v = this.getField(Names[i]) ;
+ if (v) {
+ v.hidden = !v.hidden ;
+ v.value = "Yes" ;
+ }
+ }
+}
+
+function Forget_Changes() {
+ this.dirty = false ;
+}
+
+function ForgetChanges() {
+ this.dirty = false ;
+}
+\stopJSpreamble
+
+\definereference[ForgetChanges][JS(Forget_Changes)]
+
+% This can be done more efficient, by keeping track of the
+% current top of the stack.
+
+\startJSpreamble FieldStack used later
+
+function Reset_Fields(FieldSet) {
+ var i = 1 ;
+ while (true) {
+ v = this.getField(FieldSet+":"+i) ;
+ if (!v) {
+ break ;
+ } else {
+ v.value = "Off" ;
+ }
+ i++ ;
+ }
+}
+
+function Set_Fields(FieldSet) {
+ var i = 1 ;
+ while (true) {
+ v = this.getField(FieldSet+":"+i) ;
+ if (!v) {
+ break ;
+ } else {
+ v.value = "Yes" ;
+ }
+ i++ ;
+ }
+}
+
+function Set_Field(FieldSet, FieldName) {
+ Reset_Fields(FieldSet) ;
+ v = this.getField(FieldSet+":"+FieldName) ;
+ if (v) {
+ v.value = "Yes" ;
+ }
+}
+
+function Reset_Field(FieldSet, FieldName) {
+ Set_Fields(FieldSet) ;
+ v = this.getField(FieldSet+":"+FieldName) ;
+ if (v) {
+ v.value = "Off" ;
+ }
+}
+
+function Walk_Field(FieldSet) {
+ var i = 1 ;
+ while (true) {
+ v = this.getField(FieldSet + ":" + i) ;
+ if (v) {
+ if (v.value != "Off") {
+ v.value = "Off" ;
+ var ii = i ;
+ ii++ ;
+ v = this.getField(FieldSet + ":" + ii) ;
+ if (! v) {
+ v = this.getField(FieldSet + ":" + 1) ;
+ }
+ if (v) {
+ v.value = "Yes" ;
+ }
+ break ;
+ }
+ i++ ;
+ } else {
+ break ;
+ }
+ }
+}
+
+var FieldSets = new Array() ;
+
+function Do_Get_Check_Walk_Field(FieldSet) {
+ var f = FieldSets[FieldSet]
+ if (! f) {
+ f = new Array() ;
+ f.number = 0 ;
+ f.delay = 500 ;
+ f.paused = false ;
+ f.running = false ;
+ f.name = FieldSet ;
+ f.timeout = null ;
+ FieldSets[FieldSet] = f ;
+ }
+ return f
+}
+
+function Do_Next_Auto_Walk_Field(FieldSet) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ var v = this.getField(FieldSet + ":" + fieldset.number) ;
+ if (v) {
+ if (v.value != "Off") {
+ v.value = "Off" ;
+ }
+ }
+ fieldset.number++ ;
+ v = this.getField(FieldSet + ":" + fieldset.number) ;
+ if (! v) {
+ fieldset.number = 1 ;
+ v = this.getField(FieldSet + ":" + fieldset.number) ;
+ }
+ if (v) {
+ v.value = "Yes" ;
+ }
+ }
+}
+
+function Do_Stop_Auto_Walk_Field(FieldSet) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ try {
+ app.clearInterval(fieldset.timeout) ;
+ app.clearTimeOut(fieldset.timeout) ;
+ } catch (e) {
+ }
+ }
+}
+
+function Do_Start_Auto_Walk_Field(FieldSet) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ fieldset.timeout = app.setInterval("Do_Next_Auto_Walk_Field('"+FieldSet+"')", fieldset.delay) ;
+ }
+}
+
+function Start_Walk_Field(FieldSet, Delay) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ fieldset.number = 0 ;
+ if (Delay) {
+ fieldset.delay = Delay ;
+ }
+ Reset_Fields(FieldSet) ;
+ Do_Start_Auto_Walk_Field(FieldSet) ;
+ fieldset.running = true ;
+ fieldset.paused = false ;
+ }
+}
+
+function Pause_Walk_Field(FieldSet) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ if (fieldset.running) {
+ if (fieldset.paused) {
+ Do_Start_Auto_Walk_Field(FieldSet) ;
+ fieldset.paused = false ;
+ } else {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ fieldset.paused = true ;
+ }
+ }
+ }
+}
+
+function Start_Pause_Walk_Field(FieldSet, Delay) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ if (fieldset.running) {
+ if (fieldset.paused) {
+ Do_Start_Auto_Walk_Field(FieldSet) ;
+ fieldset.paused = false ;
+ } else {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ fieldset.paused = true ;
+ }
+ } else {
+ fieldset.number = 0 ;
+ if (Delay) {
+ fieldset.delay = Delay ;
+ }
+ Reset_Fields(FieldSet) ;
+ Do_Start_Auto_Walk_Field(FieldSet) ;
+ fieldset.running = true ;
+ fieldset.paused = false ;
+ }
+ }
+}
+
+function Stop_Walk_Field(FieldSet) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ fieldset.running = false ;
+ fieldset.paused = false ;
+ }
+}
+
+function Reset_Walk_Field(FieldSet) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ fieldset.number = 0 ;
+ fieldset.running = false ;
+ fieldset.paused = false ;
+ Reset_Fields(FieldSet) ;
+ }
+}
+
+function Previous_Walk_Field(FieldSet) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ fieldset.running = false ;
+ fieldset.paused = false ;
+ if (fieldset.number>0) {
+ var v = this.getField(FieldSet + ":" + fieldset.number) ;
+ if (v) {
+ if (v.value != "Off") {
+ v.value = "Off" ;
+ }
+ }
+ fieldset.number-- ;
+ v = this.getField(FieldSet + ":" + fieldset.number) ;
+ if (v) {
+ v.value = "Yes" ;
+ }
+ }
+ }
+}
+
+function Next_Walk_Field(FieldSet) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ fieldset.running = false ;
+ fieldset.paused = false ;
+ var f = fieldset.number + 1 ;
+ var v = this.getField(FieldSet + ":" + f) ;
+ if (v) {
+ var v = this.getField(FieldSet + ":" + fieldset.number) ;
+ if (v) {
+ if (v.value != "Off") {
+ v.value = "Off" ;
+ }
+ }
+ fieldset.number++ ;
+ v = this.getField(FieldSet + ":" + fieldset.number) ;
+ if (v) {
+ v.value = "Yes" ;
+ }
+ }
+ }
+}
+
+function Set_Walk_Field_Delay(FieldSet, Delay) {
+ var fieldset = Do_Get_Check_Walk_Field(FieldSet) ;
+ if (fieldset) {
+ if (Delay) {
+ fieldset.delay = Delay ;
+ if (fieldset.running) {
+ Do_Stop_Auto_Walk_Field(FieldSet) ;
+ Do_Start_Auto_Walk_Field(FieldSet) ;
+ }
+ }
+ }
+}
+
+\stopJSpreamble
+
+\definereference[Walk] [JS(Walk_Field)]
+\definereference[StartWalk] [JS(Start_Walk_Field)]
+\definereference[StopWalk] [JS(Stop_Walk_Field)]
+\definereference[PauseWalk] [JS(Pause_Walk_Field)]
+\definereference[ResetWalk] [JS(Reset_Walk_Field)]
+\definereference[PreviousWalk][JS(Previous_Walk_Field)]
+\definereference[NextWalk] [JS(Next_Walk_Field)]
+\definereference[SetWalkDelay][JS(Set_Walk_Field_Delay)]
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/java-imp-stp.mkiv b/Master/texmf-dist/tex/context/base/java-imp-stp.mkiv
new file mode 100644
index 00000000000..ebddd8cc6f6
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/java-imp-stp.mkiv
@@ -0,0 +1,123 @@
+%D \module
+%D [ file=java-stp,
+%D version=2004.03.15,
+%D title=\CONTEXT\ JavaScript Macros,
+%D subtitle=Stepping,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% we define ocglist global, otherwise we quickly run into a memory hog (even
+% out of memory in a 512 Meg machine)
+
+% we cannot use doc_visited[this.pageNum] instead of doc_currentstep because
+% of some funny side effect (i.e. dup or so)
+
+% todo: test with later as we do autoinsert now
+
+\startJSpreamble Steps used now
+
+var doc_ocglist = this.getOCGs() ;
+var doc_stepname = "step" ;
+var doc_currentstep = 0 ;
+var doc_maxstep = 50 ;
+var doc_visited = new Array() ;
+var doc_busy = new Array() ;
+
+function SetupStepper(layername,laststep) {
+ doc_stepname = layername ;
+ doc_maxstep = laststep ;
+ for (var i=0; i<=this.numPages; i++) {
+ doc_visited[i] = 0 ;
+ doc_busy[i] = 0 ;
+ }
+}
+
+for (var i=0; i<=this.numPages; i++) {
+ doc_visited[i] = 0 ;
+ doc_busy[i] = 0 ;
+}
+
+function GetOCG(name) {
+ for (var i=0; i < doc_ocglist.length; i++) {
+ if (doc_ocglist[i].name == name) {
+ return doc_ocglist[i] ;
+ }
+ }
+ return null ;
+}
+
+function CheckBusy() {
+ var ocg = GetOCG("step:busy") ;
+ if (ocg != null) {
+ if (doc_visited[this.pageNum]==0) {
+ ocg.state = true ;
+ } else {
+ if (doc_visited[this.pageNum]<doc_busy[this.pageNum]) {
+ ocg.state = true ;
+ } else {
+ ocg.state = false ;
+ }
+ }
+ }
+}
+
+function SetStepper(maxstep,state) {
+ for (var i=1; i<=maxstep; i++) {
+ try {
+ var ocg = GetOCG(doc_stepname + ':' + String(i)) ;
+ if (ocg != null) {
+ ocg.state = state ;
+ }
+ } catch (e) {
+ return ;
+ }
+ }
+}
+
+function CheckStepper(maxsteps) {
+ SetStepper(doc_visited[this.pageNum], true) ;
+ doc_busy[this.pageNum] = Number(maxsteps) ;
+ doc_currentstep = doc_visited[this.pageNum] ;
+ CheckBusy() ;
+}
+
+function ResetStepper() {
+ SetStepper(doc_maxstep, false) ;
+ doc_currentstep = 0 ;
+}
+
+function InvokeStepper() {
+ try {
+ if (doc_currentstep<doc_busy[this.pageNum]) {
+ doc_currentstep += 1 ;
+ doc_visited[this.pageNum] = doc_currentstep ;
+ var ocg = GetOCG(doc_stepname + ':' + String(doc_currentstep)) ;
+ if (ocg != null) {
+ ocg.state = true ;
+ }
+ } else {
+ if (this.pageNum+1==this.numPages) {
+ this.pageNum = 0 ;
+ } else {
+ this.pageNum += 1 ;
+ }
+ }
+ CheckBusy() ;
+ } catch (e) {
+ return ;
+ }
+}
+
+\stopJSpreamble
+
+% \definereference [SetupStepper] [JS(SetupStepper{step,50})]
+% \definereference [ResetStepper] [JS(ResetStepper)]
+% \definereference [CheckStepper] [JS(CheckStepper{\StepCounter})]
+% \definereference [InvokeStepper] [JS(InvokeStepper)]
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/java-ini.lua b/Master/texmf-dist/tex/context/base/java-ini.lua
index f64a8a18fb0..b3b06667815 100644
--- a/Master/texmf-dist/tex/context/base/java-ini.lua
+++ b/Master/texmf-dist/tex/context/base/java-ini.lua
@@ -7,36 +7,49 @@ if not modules then modules = { } end modules ['java-ini'] = {
}
local format = string.format
-local lpegmatch = lpeg.match
+local concat = table.concat
+local lpegmatch, lpegP, lpegR, lpegS, lpegC, lpegCarg = lpeg.match, lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Carg
-javascripts = javascripts or { }
-javascripts.codes = javascripts.codes or { }
-javascripts.preambles = javascripts.preambles or { }
-javascripts.functions = javascripts.functions or { }
+local allocate = utilities.storage.allocate
+local variables = interfaces.variables
+
+-- todo: don't flush scripts if no JS key
+
+local trace_javascript = false trackers.register("backends.javascript", function(v) trace_javascript = v end)
+
+local report_javascripts = logs.reporter ("interactions","javascripts")
+local status_javascripts = logs.messenger("interactions","javascripts")
+
+interactions.javascripts = interactions.javascripts or { }
+local javascripts = interactions.javascripts
+
+javascripts.codes = allocate()
+javascripts.preambles = allocate()
+javascripts.functions = allocate()
local codes, preambles, functions = javascripts.codes, javascripts.preambles, javascripts.functions
local preambled = { }
-local function storefunction(s)
- functions[s] = true
+local function storefunction(s,preamble)
+ functions[s] = preamble
end
-local uses = lpeg.P("uses")
-local used = lpeg.P("used")
-local left = lpeg.P("{")
-local right = lpeg.P("}")
-local space = lpeg.S(" \r\n")
+local uses = lpegP("uses")
+local used = lpegP("used")
+local left = lpegP("{")
+local right = lpegP("}")
+local space = lpegS(" \r\n")
local spaces = space^0
-local braced = left * lpeg.C((1-right-space)^1) * right
-local unbraced = lpeg.C((1-space)^1)
+local braced = left * lpegC((1-right-space)^1) * right
+local unbraced = lpegC((1-space)^1)
local name = spaces * (braced + unbraced) * spaces
-local any = lpeg.P(1)
-local script = lpeg.C(any^1)
-local funct = lpeg.P("function")
-local leftp = lpeg.P("(")
-local rightp = lpeg.P(")")
-local fname = spaces * funct * spaces * (((1-space-left)^1)/storefunction) * spaces * leftp
+local any = lpegP(1)
+local script = lpegC(any^1)
+local funct = lpegP("function")
+local leftp = lpegP("(")
+local rightp = lpegP(")")
+local fname = spaces * funct * spaces * (lpegC((1-space-left-leftp)^1) * lpegCarg(1) / storefunction) * spaces * leftp
local parsecode = name * ((uses * name) + lpeg.Cc("")) * spaces * script
local parsepreamble = name * ((used * name) + lpeg.Cc("")) * spaces * script
@@ -45,46 +58,74 @@ local parsefunctions = (fname + any)^0
function javascripts.storecode(str)
local name, uses, script = lpegmatch(parsecode,str)
if name and name ~= "" then
- javascripts.codes[name] = { uses, script }
+ codes[name] = { uses, script }
end
end
function javascripts.storepreamble(str) -- now later
local name, used, script = lpegmatch(parsepreamble,str)
- if name and name ~= "" then
- preambles[#preambles+1] = { name, used, script }
- preambled[name] = #preambles
- lpegmatch(parsefunctions,script)
+ if name and name ~= "" and not preambled[name] then
+ local n = #preambles + 1
+ preambles[n] = { name, used, script }
+ preambled[name] = n
+ if trace_javascript then
+ report_javascripts("stored: preamble '%s', state '%s', order '%s'",name,used,n)
+ end
+ lpegmatch(parsefunctions,script,1,n)
end
end
function javascripts.setpreamble(name,script) -- now later
- if name and name ~= "" then
- preambles[#preambles+1] = { name, "now", script }
- preambled[name] = #preambles
- lpegmatch(parsefunctions,script)
+ if name and name ~= "" and not preambled[name] then
+ local n = #preambles + 1
+ preambles[n] = { name, "now", script }
+ preambled[name] = n
+ if trace_javascript then
+ report_javascripts("adapted: preamble '%s', state '%s', order '%s'",name,"now",n)
+ end
+ lpegmatch(parsefunctions,script,1,n)
end
end
-function javascripts.addtopreamble(name,script) -- now later
+function javascripts.addtopreamble(name,script)
if name and name ~= "" then
local p = preambled[name]
if p then
preambles[p] = { "now", preambles[p] .. " ;\n" .. script }
+ if trace_javascript then
+ report_javascripts("extended: preamble '%s', state '%s', order '%s'",name,"now",p)
+ end
else
- preambles[#preambles+1] = { name, "now", script }
- preambled[name] = #preambles
- lpegmatch(parsefunctions,script)
+ local n = #preambles + 1
+ preambles[n] = { name, "now", script }
+ preambled[name] = n
+ if trace_javascript then
+ report_javascripts("stored: preamble '%s', state '%s', order '%s'",name,"now",n)
+ end
+ lpegmatch(parsefunctions,script,1,n)
end
end
end
function javascripts.usepreamblenow(name) -- now later
- if name and name ~= "" and preambled[name] then
- preambles[preambled[name]][2] = "now"
+ if name and name ~= "" and name ~= variables.reset then -- todo: reset
+ local names = utilities.parsers.settings_to_array(name)
+ for i=1,#names do
+ local somename = names[i]
+ if not preambled[somename] then
+ preambles[preambled[somename]][2] = "now"
+ if trace_javascript then
+ report_javascripts("used: preamble '%s', state '%s', order '%s'",somename,"now","auto")
+ end
+ end
+ end
end
end
+local splitter = lpeg.Ct(lpeg.splitat(lpeg.patterns.commaspacer))
+
+local used, reported = false, { } -- we can cache more
+
function javascripts.code(name,arguments)
local c = codes[name]
if c then
@@ -92,16 +133,36 @@ function javascripts.code(name,arguments)
if u ~= "" then
local p = preambled[u]
if p then
- preambles[p][1] = "now"
+ preambles[p][2] = "now"
+ if trace_javascript and not reported[name] then
+ reported[name] = true
+ report_javascripts("used: code '%s', preamble '%s'",name,u)
+ end
+ elseif trace_javascript and not reported[name] then
+ reported[name] = true
+ report_javascripts("used: code '%s'",name)
end
+ elseif trace_javascript and not reported[name] then
+ reported[name] = true
+ report_javascripts("used: code '%s'",name)
end
+ used = true
return code
end
local f = functions[name]
if f then
- -- temporary hack, i need a more clever approach
+ used = true
+ if trace_javascript and not reported[name] then
+ reported[name] = true
+ report_javascripts("used: function '%s'",name)
+ end
+ preambles[f][2] = "now" -- automatically tag preambles that define the function (as later)
if arguments then
- return format("%s(%s)",name,'"' .. arguments.gsub(arguments,'%s*,%s*','"%1",') .. '"')
+ local args = lpegmatch(splitter,arguments)
+ for i=1,#args do -- can be a helper
+ args[i] = format("%q",args[i])
+ end
+ return format("%s(%s)",name,concat(args,","))
else
return format("%s()",name)
end
@@ -110,11 +171,34 @@ end
function javascripts.flushpreambles()
local t = { }
- for i=1,#preambles do
- local preamble = preambles[i]
- if preamble[2] == "now" then
- t[#t+1] = { preamble[1], preamble[3] }
+ if used then
+ for i=1,#preambles do
+ local preamble = preambles[i]
+ if preamble[2] == "now" then
+ if trace_javascript then
+ report_javascripts("flushed: preamble '%s'",preamble[1])
+ end
+ t[#t+1] = { preamble[1], preamble[3] }
+ end
end
end
return t
end
+
+local patterns = { "java-imp-%s.mkiv", "java-imp-%s.tex", "java-%s.mkiv", "java-%s.tex" }
+
+function javascripts.usescripts(name)
+ -- this will become pure lua, no context
+ if name ~= variables.reset then -- reset is obsolete
+ commands.uselibrary(name,patterns,function(name,foundname)
+ context.startnointerference()
+ context.startreadingfile()
+ context.input(foundname)
+ status_javascripts("loaded: library '%s'",name)
+ context.stopreadingfile()
+ context.stopnointerference()
+ end, function(name)
+ report_javascripts("unknown: library '%s'",name)
+ end)
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/java-ini.mkii b/Master/texmf-dist/tex/context/base/java-ini.mkii
index e929da10811..68516ec4e8d 100644
--- a/Master/texmf-dist/tex/context/base/java-ini.mkii
+++ b/Master/texmf-dist/tex/context/base/java-ini.mkii
@@ -33,24 +33,7 @@
%D \JAVA\ support is not implemented as a generic support
%D module. The main reason for this is that passing system
%D variables to a \JAVASCRIPT\ is closely related to other core
-%D macros. First some messages:
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
+%D macros.
%D \TEX\ is not the right tool to check the \JAVA\ code; the
%D most we can do is reporting some passed variables:
@@ -125,13 +108,6 @@
%D JS_R_3="overflow";
%D JS_P_3=3;
%D \stoptyping
-% %D
-% %D Finally we have a counter that tells\JAVA\ how many
-% %D arguments were passed,
-% %D
-% %D \starttyping
-% %D JS_N
-% %D \stoptyping
%D We will also support direct function calls. In that case
%D no intermediate variables are used.
@@ -699,7 +675,11 @@
\letgvalueempty{\c!file\f!javascriptprefix#1}%
\makeshortfilename[\f!javascriptprefix#1]%
\startreadingfile
- \readsysfile\shortfilename{\showmessage\m!javascript1{#1}}\donothing
+ \readsysfile{\shortfilename.\mksuffix}
+ {\showmessage\m!javascript1{#1}}
+ {\readsysfile{\shortfilename.tex}
+ {\showmessage\m!javascript1{#1}}
+ \donothing}%
\stopreadingfile
\stopnointerference}}}
diff --git a/Master/texmf-dist/tex/context/base/java-ini.mkiv b/Master/texmf-dist/tex/context/base/java-ini.mkiv
index 6536ced48e9..4013d82af51 100644
--- a/Master/texmf-dist/tex/context/base/java-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/java-ini.mkiv
@@ -106,25 +106,32 @@
%D \JAVASCRIPT\ preambles.
\unexpanded\def\startJScode
- {\begingroup\obeylualines\obeyluatokens\dostartJScode}
+ {\begingroup
+ \obeylualines
+ \obeyluatokens
+ \def\u{\letterbackslash u}%
+ \dostartJScode}
\long\def\dostartJScode#1\stopJScode
- {\normalexpanded{\endgroup\ctxlua{javascripts.storecode(\!!bs#1\!!es)}}}
+ {\normalexpanded{\endgroup\ctxlua{interactions.javascripts.storecode(\!!bs#1\!!es)}}}
\let\stopJScode\relax
\unexpanded\def\startJSpreamble
- {\begingroup\obeylualines\obeyluatokens\dostartJSpreamble}
+ {\begingroup
+ \obeylualines
+ \obeyluatokens
+ \def\u{\letterbackslash u}%
+ \dostartJSpreamble}
\long\def\dostartJSpreamble#1\stopJSpreamble
- {\normalexpanded{\endgroup\ctxlua{javascripts.storepreamble(\!!bs#1\!!es)}}}
+ {\normalexpanded{\endgroup\ctxlua{interactions.javascripts.storepreamble(\!!bs#1\!!es)}}}
\let\stopJSpreamble\relax
-\def\setJSpreamble #1#2{\ctxlua{javascripts.storepreamble ("#1",\!!bs#2\!!es)}}
-\def\addtoJSpreamble #1#2{\ctxlua{javascripts.addtopreamble ("#1",\!!bs#2\!!es)}}
-\def\useJSpreamblenow #1{\ctxlua{javascripts.usepreamblenow("#1")}}
-\def\finalflushJSpreamble{\iflocation\ctxlua{javascripts.flushpreambles()}\fi}
+\def\setJSpreamble #1#2{\ctxlua{interactions.javascripts.storepreamble ("#1",\!!bs#2\!!es)}}
+\def\addtoJSpreamble #1#2{\ctxlua{interactions.javascripts.addtopreamble ("#1",\!!bs#2\!!es)}}
+\def\douseJSpreamblenow#1{\ctxlua{interactions.javascripts.usepreamblenow("#1")}}
%D \macros
%D {useJSscripts}
@@ -141,22 +148,9 @@
%D
%D The not so complicated implementation of this macro is:
-\def\dodouseJSscripts#1%
- {\doifelse{#1}\v!reset
- {\let\allJSpreambles\empty}
- {\ifcsname\c!file\f!javascriptprefix#1\endcsname \else
- \startnointerference
- \letgvalueempty{\c!file\f!javascriptprefix#1}%
- \makeshortfilename[\f!javascriptprefix#1]%
- \startreadingfile
- \readsysfile\shortfilename{\showmessage\m!javascript1{#1}}\donothing
- \stopreadingfile
- \stopnointerference
- \fi}}
-
\def\douseJSscripts[#1][#2]%
- {\processcommalist[#1]\dodouseJSscripts
- \processcommalist[#2]\useJSpreamblenow}
+ {\ctxlua{interactions.javascripts.usescripts(\!!bs#1\!!es)}%
+ \douseJSpreamblenow{#2}}
\def\useJSscripts
{\dodoubleempty\douseJSscripts}
diff --git a/Master/texmf-dist/tex/context/base/java-stp.tex b/Master/texmf-dist/tex/context/base/java-stp.mkii
index df4fbcc2f4e..df4fbcc2f4e 100644
--- a/Master/texmf-dist/tex/context/base/java-stp.tex
+++ b/Master/texmf-dist/tex/context/base/java-stp.mkii
diff --git a/Master/texmf-dist/tex/context/base/l-aux.lua b/Master/texmf-dist/tex/context/base/l-aux.lua
index 97063e3bca9..aa04951bfbf 100644
--- a/Master/texmf-dist/tex/context/base/l-aux.lua
+++ b/Master/texmf-dist/tex/context/base/l-aux.lua
@@ -6,256 +6,8 @@ if not modules then modules = { } end modules ['l-aux'] = {
license = "see context related readme files"
}
--- for inline, no store split : for s in string.gmatch(str,",* *([^,]+)") do .. end
-
aux = aux or { }
-local concat, format, gmatch = table.concat, string.format, string.gmatch
-local tostring, type = tostring, type
-local lpegmatch = lpeg.match
-
-local P, R, V = lpeg.P, lpeg.R, lpeg.V
-
-local escape, left, right = P("\\"), P('{'), P('}')
-
-lpeg.patterns.balanced = P {
- [1] = ((escape * (left+right)) + (1 - (left+right)) + V(2))^0,
- [2] = left * V(1) * right
-}
-
-local space = lpeg.P(' ')
-local equal = lpeg.P("=")
-local comma = lpeg.P(",")
-local lbrace = lpeg.P("{")
-local rbrace = lpeg.P("}")
-local nobrace = 1 - (lbrace+rbrace)
-local nested = lpeg.P { lbrace * (nobrace + lpeg.V(1))^0 * rbrace }
-local spaces = space^0
-
-local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
-
-local key = lpeg.C((1-equal-comma)^1)
-local pattern_a = (space+comma)^0 * (key * equal * value + key * lpeg.C(""))
-local pattern_c = (space+comma)^0 * (key * equal * value)
-
-local key = lpeg.C((1-space-equal-comma)^1)
-local pattern_b = spaces * comma^0 * spaces * (key * ((spaces * equal * spaces * value) + lpeg.C("")))
-
--- "a=1, b=2, c=3, d={a{b,c}d}, e=12345, f=xx{a{b,c}d}xx, g={}" : outer {} removes, leading spaces ignored
-
-local hash = { }
-
-local function set(key,value) -- using Carg is slower here
- hash[key] = value
-end
-
-local pattern_a_s = (pattern_a/set)^1
-local pattern_b_s = (pattern_b/set)^1
-local pattern_c_s = (pattern_c/set)^1
-
-aux.settings_to_hash_pattern_a = pattern_a_s
-aux.settings_to_hash_pattern_b = pattern_b_s
-aux.settings_to_hash_pattern_c = pattern_c_s
-
-function aux.make_settings_to_hash_pattern(set,how)
- if how == "strict" then
- return (pattern_c/set)^1
- elseif how == "tolerant" then
- return (pattern_b/set)^1
- else
- return (pattern_a/set)^1
- end
-end
-
-function aux.settings_to_hash(str,existing)
- if str and str ~= "" then
- hash = existing or { }
- if moretolerant then
- lpegmatch(pattern_b_s,str)
- else
- lpegmatch(pattern_a_s,str)
- end
- return hash
- else
- return { }
- end
-end
-
-function aux.settings_to_hash_tolerant(str,existing)
- if str and str ~= "" then
- hash = existing or { }
- lpegmatch(pattern_b_s,str)
- return hash
- else
- return { }
- end
-end
-
-function aux.settings_to_hash_strict(str,existing)
- if str and str ~= "" then
- hash = existing or { }
- lpegmatch(pattern_c_s,str)
- return next(hash) and hash
- else
- return nil
- end
-end
-
-local separator = comma * space^0
-local value = lpeg.P(lbrace * lpeg.C((nobrace + nested)^0) * rbrace) + lpeg.C((nested + (1-comma))^0)
-local pattern = lpeg.Ct(value*(separator*value)^0)
-
--- "aap, {noot}, mies" : outer {} removes, leading spaces ignored
-
-aux.settings_to_array_pattern = pattern
-
--- we could use a weak table as cache
-
-function aux.settings_to_array(str)
- if not str or str == "" then
- return { }
- else
- return lpegmatch(pattern,str)
- end
-end
-
-local function set(t,v)
- t[#t+1] = v
-end
-
-local value = lpeg.P(lpeg.Carg(1)*value) / set
-local pattern = value*(separator*value)^0 * lpeg.Carg(1)
-
-function aux.add_settings_to_array(t,str)
- return lpegmatch(pattern,str,nil,t)
-end
-
-function aux.hash_to_string(h,separator,yes,no,strict,omit)
- if h then
- local t, s = { }, table.sortedkeys(h)
- omit = omit and table.tohash(omit)
- for i=1,#s do
- local key = s[i]
- if not omit or not omit[key] then
- local value = h[key]
- if type(value) == "boolean" then
- if yes and no then
- if value then
- t[#t+1] = key .. '=' .. yes
- elseif not strict then
- t[#t+1] = key .. '=' .. no
- end
- elseif value or not strict then
- t[#t+1] = key .. '=' .. tostring(value)
- end
- else
- t[#t+1] = key .. '=' .. value
- end
- end
- end
- return concat(t,separator or ",")
- else
- return ""
- end
-end
-
-function aux.array_to_string(a,separator)
- if a then
- return concat(a,separator or ",")
- else
- return ""
- end
-end
-
-function aux.settings_to_set(str,t)
- t = t or { }
- for s in gmatch(str,"%s*([^,]+)") do
- t[s] = true
- end
- return t
-end
-
-local value = lbrace * lpeg.C((nobrace + nested)^0) * rbrace
-local pattern = lpeg.Ct((space + value)^0)
-
-function aux.arguments_to_table(str)
- return lpegmatch(pattern,str)
-end
-
--- temporary here
-
-function aux.getparameters(self,class,parentclass,settings)
- local sc = self[class]
- if not sc then
- sc = table.clone(self[parent])
- self[class] = sc
- end
- aux.settings_to_hash(settings,sc)
-end
-
--- temporary here
-
-local digit = lpeg.R("09")
-local period = lpeg.P(".")
-local zero = lpeg.P("0")
-local trailingzeros = zero^0 * -digit -- suggested by Roberto R
-local case_1 = period * trailingzeros / ""
-local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
-local number = digit^1 * (case_1 + case_2)
-local stripper = lpeg.Cs((number + 1)^0)
-
---~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
---~ collectgarbage("collect")
---~ str = string.rep(sample,10000)
---~ local ts = os.clock()
---~ lpegmatch(stripper,str)
---~ print(#str, os.clock()-ts, lpegmatch(stripper,sample))
-
-lpeg.patterns.strip_zeros = stripper
-
-function aux.strip_zeros(str)
- return lpegmatch(stripper,str)
-end
-
-function aux.definetable(target) -- defines undefined tables
- local composed, t = nil, { }
- for name in gmatch(target,"([^%.]+)") do
- if composed then
- composed = composed .. "." .. name
- else
- composed = name
- end
- t[#t+1] = format("%s = %s or { }",composed,composed)
- end
- return concat(t,"\n")
-end
-
-function aux.accesstable(target)
- local t = _G
- for name in gmatch(target,"([^%.]+)") do
- t = t[name]
- end
- return t
-end
-
---~ function string.commaseparated(str)
---~ return gmatch(str,"([^,%s]+)")
---~ end
-
--- as we use this a lot ...
-
---~ function aux.cachefunction(action,weak)
---~ local cache = { }
---~ if weak then
---~ setmetatable(cache, { __mode = "kv" } )
---~ end
---~ local function reminder(str)
---~ local found = cache[str]
---~ if not found then
---~ found = action(str)
---~ cache[str] = found
---~ end
---~ return found
---~ end
---~ return reminder, cache
---~ end
+require("util-int") for k, v in next, utilities.interfaces do aux[k] = v end
+require("util-tab") for k, v in next, utilities.tables do aux[k] = v end
+require("util-fmt") for k, v in next, utilities.formatters do aux[k] = v end
diff --git a/Master/texmf-dist/tex/context/base/l-boolean.lua b/Master/texmf-dist/tex/context/base/l-boolean.lua
index be7ec7d5705..3fff7c1263f 100644
--- a/Master/texmf-dist/tex/context/base/l-boolean.lua
+++ b/Master/texmf-dist/tex/context/base/l-boolean.lua
@@ -6,12 +6,17 @@ if not modules then modules = { } end modules ['l-boolean'] = {
license = "see context related readme files"
}
+local type, tonumber = type, tonumber
+
boolean = boolean or { }
+local boolean = boolean
-local type, tonumber = type, tonumber
+-- function boolean.tonumber(b)
+-- return b and 1 or 0 -- test and test and return or return
+-- end
function boolean.tonumber(b)
- if b then return 1 else return 0 end
+ if b then return 1 else return 0 end -- test and return or return
end
function toboolean(str,tolerant)
@@ -35,7 +40,9 @@ function toboolean(str,tolerant)
end
end
-function string.is_boolean(str)
+string.toboolean = toboolean
+
+function string.is_boolean(str,default)
if type(str) == "string" then
if str == "true" or str == "yes" or str == "on" or str == "t" then
return true
@@ -43,13 +50,5 @@ function string.is_boolean(str)
return false
end
end
- return nil
-end
-
-function boolean.alwaystrue()
- return true
-end
-
-function boolean.falsetrue()
- return false
+ return default
end
diff --git a/Master/texmf-dist/tex/context/base/l-dir.lua b/Master/texmf-dist/tex/context/base/l-dir.lua
index 2643f538b94..1d59b9220d9 100644
--- a/Master/texmf-dist/tex/context/base/l-dir.lua
+++ b/Master/texmf-dist/tex/context/base/l-dir.lua
@@ -6,35 +6,75 @@ if not modules then modules = { } end modules ['l-dir'] = {
license = "see context related readme files"
}
--- dir.expand_name will be merged with cleanpath and collapsepath
+-- dir.expandname will be merged with cleanpath and collapsepath
local type = type
local find, gmatch, match, gsub = string.find, string.gmatch, string.match, string.gsub
+local concat, insert, remove = table.concat, table.insert, table.remove
local lpegmatch = lpeg.match
+local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
+
dir = dir or { }
+local dir = dir
+local lfs = lfs
+
+local attributes = lfs.attributes
+local walkdir = lfs.dir
+local isdir = lfs.isdir
+local isfile = lfs.isfile
+local mkdir = lfs.mkdir
+local chdir = lfs.chdir
+local currentdir = lfs.currentdir
-- handy
function dir.current()
- return (gsub(lfs.currentdir(),"\\","/"))
+ return (gsub(currentdir(),"\\","/"))
end
--- optimizing for no string.find (*) does not save time
+-- 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
-local attributes = lfs.attributes
-local walkdir = lfs.dir
+lfs.isdir = isdir
-local function glob_pattern(path,patt,recurse,action)
- local ok, scanner
+local function globpattern(path,patt,recurse,action)
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
+ path = path .. "."
+ elseif not find(path,"/$") then
+ path = path .. '/'
end
- if ok and type(scanner) == "function" then
- if not find(path,"/$") then path = path .. '/' end
- for name in scanner do
+ 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
@@ -42,15 +82,15 @@ local function glob_pattern(path,patt,recurse,action)
action(full)
end
elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
- glob_pattern(full,patt,recurse,action)
+ globpattern(full,patt,recurse,action)
end
end
end
end
-dir.glob_pattern = glob_pattern
+dir.globpattern = globpattern
-local function collect_pattern(path,patt,recurse,result)
+local function collectpattern(path,patt,recurse,result)
local ok, scanner
result = result or { }
if path == "/" then
@@ -69,7 +109,7 @@ local function collect_pattern(path,patt,recurse,result)
result[name] = attr
end
elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then
- attr.list = collect_pattern(full,patt,recurse)
+ attr.list = collectpattern(full,patt,recurse)
result[name] = attr
end
end
@@ -77,9 +117,7 @@ local function collect_pattern(path,patt,recurse,result)
return result
end
-dir.collect_pattern = collect_pattern
-
-local P, S, R, C, Cc, Cs, Ct, Cv, V = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Ct, lpeg.Cv, lpeg.V
+dir.collectpattern = collectpattern
local pattern = Ct {
[1] = (C(P(".") + P("/")^1) + C(R("az","AZ") * P(":") * P("/")^0) + Cc("./")) * V(2) * V(3),
@@ -103,16 +141,16 @@ local function glob(str,t)
for s=1,#str do
glob(str[s],t)
end
- elseif lfs.isfile(str) then
+ elseif isfile(str) then
t(str)
else
- local split = lpegmatch(pattern,str)
+ 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 recurse = find(base,"%*%*")
local start = root .. path
local result = lpegmatch(filter,start .. base)
- glob_pattern(start,result,recurse,t)
+ globpattern(start,result,recurse,t)
end
end
else
@@ -122,12 +160,15 @@ local function glob(str,t)
glob(str[s],t)
end
return t
- elseif lfs.isfile(str) then
- local t = t or { }
- t[#t+1] = str
- return t
+ elseif isfile(str) then
+ if t then
+ t[#t+1] = str
+ return t
+ else
+ return { str }
+ end
else
- local split = lpegmatch(pattern,str)
+ 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
@@ -135,7 +176,7 @@ local function glob(str,t)
local recurse = find(base,"%*%*")
local start = root .. path
local result = lpegmatch(filter,start .. base)
- glob_pattern(start,result,recurse,action)
+ globpattern(start,result,recurse,action)
return t
else
return { }
@@ -154,10 +195,11 @@ dir.glob = glob
local function globfiles(path,recurse,func,files) -- func == pattern or function
if type(func) == "string" then
- local s = func -- alas, we need this indirect way
+ local s = func
func = function(name) return find(name,s) end
end
files = files or { }
+ local noffiles = #files
for name in walkdir(path) do
if find(name,"^%.") then
--- skip
@@ -168,12 +210,9 @@ local function globfiles(path,recurse,func,files) -- func == pattern or function
globfiles(path .. "/" .. name,recurse,func,files)
end
elseif mode == "file" then
- if func then
- if func(name) then
- files[#files+1] = path .. "/" .. name
- end
- else
- files[#files+1] = path .. "/" .. name
+ if not func or func(name) then
+ noffiles = noffiles + 1
+ files[noffiles] = path .. "/" .. name
end
end
end
@@ -191,7 +230,7 @@ dir.globfiles = globfiles
-- print(dir.ls("*.tex"))
function dir.ls(pattern)
- return table.concat(glob(pattern),"\n")
+ return concat(glob(pattern),"\n")
end
--~ mkdirs("temp")
@@ -201,7 +240,9 @@ end
local make_indeed = true -- false
-if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
+local onwindows = os.type == "windows" or find(os.getenv("PATH"),";")
+
+if onwindows then
function dir.mkdirs(...)
local str, pth, t = "", "", { ... }
@@ -250,56 +291,24 @@ if string.find(os.getenv("PATH"),";") then -- os.type == "windows"
else
pth = pth .. "/" .. s
end
- if make_indeed and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not isdir(pth) then
+ mkdir(pth)
end
end
- return pth, (lfs.isdir(pth) == true)
+ 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/"))
-
- function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
- local first, nothing, last = match(str,"^(//)(//*)(.*)$")
- if first then
- first = dir.current() .. "/"
- 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 = lfs.currentdir()
- if lfs.chdir(first) then
- first = dir.current()
- end
- lfs.chdir(d)
- 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 == "" then
- return first
- else
- return first .. "/" .. last
- end
- 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/"))
else
@@ -307,7 +316,7 @@ else
local str, pth, t = "", "", { ... }
for i=1,#t do
local s = t[i]
- if s ~= "" then
+ if s and s ~= "" then -- we catch nil and false
if str ~= "" then
str = str .. "/" .. s
else
@@ -325,39 +334,96 @@ else
else
pth = pth .. "/" .. s
end
- if make_indeed and not first and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not first and not isdir(pth) then
+ mkdir(pth)
end
end
else
pth = "."
for s in gmatch(str,"[^/]+") do
pth = pth .. "/" .. s
- if make_indeed and not lfs.isdir(pth) then
- lfs.mkdir(pth)
+ if make_indeed and not isdir(pth) then
+ mkdir(pth)
end
end
end
- return pth, (lfs.isdir(pth) == true)
+ 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
- function dir.expand_name(str) -- will be merged with cleanpath and collapsepath
+-- we can only define it here as it uses dir.current
+
+if onwindows then
+
+ function dir.expandname(str) -- will be merged with cleanpath and collapsepath
+ local first, nothing, last = match(str,"^(//)(//*)(.*)$")
+ if first then
+ first = dir.current() .. "/"
+ 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()
+ end
+ chdir(d)
+ 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
+
+ function dir.expandname(str) -- will be merged with cleanpath and collapsepath
if not find(str,"^/") then
- str = lfs.currentdir() .. "/" .. str
+ str = currentdir() .. "/" .. str
end
str = gsub(str,"//","/")
str = gsub(str,"/%./","/")
+ str = gsub(str,"(.)/%.$","%1")
return str
end
end
-dir.makedirs = dir.mkdirs
+file.expandname = dir.expandname -- for convenience
+
+local stack = { }
+
+function dir.push(newdir)
+ insert(stack,lfs.currentdir())
+end
+
+function dir.pop()
+ local d = remove(stack)
+ if d then
+ lfs.chdir(d)
+ end
+ return d
+end
diff --git a/Master/texmf-dist/tex/context/base/l-file.lua b/Master/texmf-dist/tex/context/base/l-file.lua
index 212318fb751..c3199f0229e 100644
--- a/Master/texmf-dist/tex/context/base/l-file.lua
+++ b/Master/texmf-dist/tex/context/base/l-file.lua
@@ -8,47 +8,93 @@ if not modules then modules = { } end modules ['l-file'] = {
-- needs a cleanup
-file = file or { }
+file = file or { }
+local file = file
-local concat = table.concat
-local find, gmatch, match, gsub, sub, char = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char
+local insert, concat = table.insert, table.concat
+local find, gmatch, match, gsub, sub, char, lower = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char, string.lower
local lpegmatch = lpeg.match
+local getcurrentdir, attributes = lfs.currentdir, lfs.attributes
-function file.removesuffix(filename)
- return (gsub(filename,"%.[%a%d]+$",""))
+local P, R, S, C, Cs, Cp, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc
+
+local function dirname(name,default)
+ return match(name,"^(.+)[/\\].-$") or (default or "")
end
-function file.addsuffix(filename, suffix)
- if not suffix or suffix == "" then
- return filename
- elseif not find(filename,"%.[%a%d]+$") then
- return filename .. "." .. suffix
- else
- return filename
- end
+local function basename(name)
+ return match(name,"^.+[/\\](.-)$") or name
end
-function file.replacesuffix(filename, suffix)
- return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+local function nameonly(name)
+ return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
end
-function file.dirname(name,default)
- return match(name,"^(.+)[/\\].-$") or (default or "")
+local function extname(name,default)
+ return match(name,"^.+%.([^/\\]-)$") or default or ""
end
-function file.basename(name)
- return match(name,"^.+[/\\](.-)$") or name
+local function splitname(name)
+ local n, s = match(name,"^(.+)%.([^/\\]-)$")
+ return n or name, s or ""
end
-function file.nameonly(name)
- return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
+file.basename = basename
+file.dirname = dirname
+file.nameonly = nameonly
+file.extname = extname
+file.suffix = extname
+
+function file.removesuffix(filename)
+ return (gsub(filename,"%.[%a%d]+$",""))
end
-function file.extname(name,default)
- return match(name,"^.+%.([^/\\]-)$") or default or ""
+function file.addsuffix(filename, suffix, criterium)
+ if not suffix or suffix == "" then
+ return filename
+ elseif criterium == true then
+ return filename .. "." .. suffix
+ elseif not criterium then
+ local n, s = splitname(filename)
+ if not s or s == "" then
+ return filename .. "." .. suffix
+ else
+ return filename
+ end
+ else
+ local n, s = splitname(filename)
+ if s and s ~= "" then
+ local t = type(criterium)
+ if t == "table" then
+ -- keep if in criterium
+ for i=1,#criterium do
+ if s == criterium[i] then
+ return filename
+ end
+ end
+ elseif t == "string" then
+ -- keep if criterium
+ if s == criterium then
+ return filename
+ end
+ end
+ end
+ return n .. "." .. suffix
+ end
end
-file.suffix = file.extname
+--~ print("1 " .. file.addsuffix("name","new") .. " -> name.new")
+--~ print("2 " .. file.addsuffix("name.old","new") .. " -> name.old")
+--~ print("3 " .. file.addsuffix("name.old","new",true) .. " -> name.old.new")
+--~ print("4 " .. file.addsuffix("name.old","new","new") .. " -> name.new")
+--~ print("5 " .. file.addsuffix("name.old","new","old") .. " -> name.old")
+--~ print("6 " .. file.addsuffix("name.old","new","foo") .. " -> name.new")
+--~ print("7 " .. file.addsuffix("name.old","new",{"foo","bar"}) .. " -> name.new")
+--~ print("8 " .. file.addsuffix("name.old","new",{"old","bar"}) .. " -> name.old")
+
+function file.replacesuffix(filename, suffix)
+ return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+end
--~ function file.join(...)
--~ local pth = concat({...},"/")
@@ -100,50 +146,59 @@ end
--~ print(file.join("http:///a","/y"))
--~ print(file.join("//nas-1","/y"))
-function file.iswritable(name)
- local a = lfs.attributes(name) or lfs.attributes(file.dirname(name,"."))
+function file.is_writable(name)
+ local a = attributes(name) or attributes(dirname(name,"."))
return a and sub(a.permissions,2,2) == "w"
end
-function file.isreadable(name)
- local a = lfs.attributes(name)
+function file.is_readable(name)
+ local a = attributes(name)
return a and sub(a.permissions,1,1) == "r"
end
-file.is_readable = file.isreadable
-file.is_writable = file.iswritable
+file.isreadable = file.is_readable -- depricated
+file.iswritable = file.is_writable -- depricated
--- todo: lpeg
-
---~ function file.split_path(str)
---~ local t = { }
---~ str = gsub(str,"\\", "/")
---~ str = gsub(str,"(%a):([;/])", "%1\001%2")
---~ for name in gmatch(str,"([^;:]+)") do
---~ if name ~= "" then
---~ t[#t+1] = gsub(name,"\001",":")
---~ end
---~ end
---~ return t
---~ end
+-- todo: lpeg \\ / .. does not save much
local checkedsplit = string.checkedsplit
-function file.split_path(str,separator)
+function file.splitpath(str,separator) -- string
str = gsub(str,"\\","/")
return checkedsplit(str,separator or io.pathseparator)
end
-function file.join_path(tab)
- return concat(tab,io.pathseparator) -- can have trailing //
+function file.joinpath(tab,separator) -- table
+ return concat(tab,separator or io.pathseparator) -- can have trailing //
end
-- we can hash them weakly
+--~ function file.collapsepath(str) -- fails on b.c/..
+--~ str = gsub(str,"\\","/")
+--~ if find(str,"/") then
+--~ str = gsub(str,"^%./",(gsub(getcurrentdir(),"\\","/")) .. "/") -- ./xx in qualified
+--~ str = gsub(str,"/%./","/")
+--~ local n, m = 1, 1
+--~ while n > 0 or m > 0 do
+--~ str, n = gsub(str,"[^/%.]+/%.%.$","")
+--~ str, m = gsub(str,"[^/%.]+/%.%./","")
+--~ end
+--~ str = gsub(str,"([^/])/$","%1")
+--~ -- str = gsub(str,"^%./","") -- ./xx in qualified
+--~ str = gsub(str,"/%.$","")
+--~ end
+--~ if str == "" then str = "." end
+--~ return str
+--~ end
+--~
+--~ The previous one fails on "a.b/c" so Taco came up with a split based
+--~ variant. After some skyping we got it sort of compatible with the old
+--~ one. After that the anchoring to currentdir was added in a better way.
+--~ Of course there are some optimizations too. Finally we had to deal with
+--~ windows drive prefixes and thinsg like sys://.
-local insert = table.insert
-
-function file.collapse_path(str,anchor)
+function file.collapsepath(str,anchor)
if anchor and not find(str,"^/") and not find(str,"^%a:") then
str = getcurrentdir() .. "/" .. str
end
@@ -197,64 +252,26 @@ function file.collapse_path(str,anchor)
return concat(newelements, '/')
end
end
-function file.xcollapse_path(str)
- print('collapse', str)
- if str == "" or str =="." then
- return "."
- elseif find(str,"^%.%.") then
- return str
- elseif not find(str,"%.") then
- return str
- end
- str = gsub(str,"^%./",lfs.currentdir() .. "/") -- ./xx in qualified
- str = gsub(str,"\\","/")
- local oldelements = checkedsplit(str,"/")
- local newelements = { }
- local i = #oldelements
- while i > 0 do
- local element = oldelements[i]
- if element == '.' then
- -- do nothing
- elseif element == '..' then
- local n = i -1
- while n > 0 do
- local element = oldelements[n]
- if element ~= '..' and element ~= '.' then
- oldelements[n] = '.'
- break
- else
- n = n - 1
- end
- end
- if n<1 then
- insert(newelements,1,'..')
- end
- elseif element ~= "" then
- insert(newelements,1,element)
- end
- i = i - 1
- end
- if #newelements == 0 then
- return "."
- elseif find(str,"^/") then
- return "/" .. concat(newelements,'/')
+
+--~ local function test(str)
+--~ print(string.format("%-20s %-15s %-15s",str,file.collapsepath(str),file.collapsepath(str,true)))
+--~ end
+--~ test("a/b.c/d") test("b.c/d") test("b.c/..")
+--~ test("/") test("c:/..") test("sys://..")
+--~ test("") test("./") test(".") test("..") test("./..") test("../..")
+--~ test("a") test("./a") test("/a") test("a/../..")
+--~ test("a/./b/..") test("a/aa/../b/bb") test("a/.././././b/..") test("a/./././b/..")
+--~ test("a/b/c/../..") test("./a/b/c/../..") test("a/b/c/../..")
+
+function file.robustname(str,strict)
+ str = gsub(str,"[^%a%d%/%-%.\\]+","-")
+ if strict then
+ return lower(gsub(str,"^%-*(.-)%-*$","%1"))
else
- return concat(newelements, '/')
+ return str
end
end
---~ print(file.collapse_path("/a"))
---~ print(file.collapse_path("a/./b/.."))
---~ print(file.collapse_path("a/aa/../b/bb"))
---~ print(file.collapse_path("a/../.."))
---~ print(file.collapse_path("a/.././././b/.."))
---~ print(file.collapse_path("a/./././b/.."))
---~ print(file.collapse_path("a/b/c/../.."))
-
-function file.robustname(str)
- return (gsub(str,"[^%a%d%/%-%.\\]+","-"))
-end
-
file.readdata = io.loaddata
file.savedata = io.savedata
@@ -264,31 +281,31 @@ end
-- lpeg variants, slightly faster, not always
---~ local period = lpeg.P(".")
---~ local slashes = lpeg.S("\\/")
+--~ local period = P(".")
+--~ local slashes = S("\\/")
--~ local noperiod = 1-period
--~ local noslashes = 1-slashes
--~ local name = noperiod^1
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.C(noperiod^1) * -1
+--~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * C(noperiod^1) * -1
--~ function file.extname(name)
--~ return lpegmatch(pattern,name) or ""
--~ end
---~ local pattern = lpeg.Cs(((period * noperiod^1 * -1)/"" + 1)^1)
+--~ local pattern = Cs(((period * noperiod^1 * -1)/"" + 1)^1)
--~ function file.removesuffix(name)
--~ return lpegmatch(pattern,name)
--~ end
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.C(noslashes^1) * -1
+--~ local pattern = (noslashes^0 * slashes)^1 * C(noslashes^1) * -1
--~ function file.basename(name)
--~ return lpegmatch(pattern,name) or name
--~ end
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.Cp() * noslashes^1 * -1
+--~ local pattern = (noslashes^0 * slashes)^1 * Cp() * noslashes^1 * -1
--~ function file.dirname(name)
--~ local p = lpegmatch(pattern,name)
@@ -299,7 +316,7 @@ end
--~ end
--~ end
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
+--~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * Cp() * noperiod^1 * -1
--~ function file.addsuffix(name, suffix)
--~ local p = lpegmatch(pattern,name)
@@ -310,7 +327,7 @@ end
--~ end
--~ end
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
+--~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * Cp() * noperiod^1 * -1
--~ function file.replacesuffix(name,suffix)
--~ local p = lpegmatch(pattern,name)
@@ -321,7 +338,7 @@ end
--~ end
--~ end
---~ local pattern = (noslashes^0 * slashes)^0 * lpeg.Cp() * ((noperiod^1 * period)^1 * lpeg.Cp() + lpeg.P(true)) * noperiod^1 * -1
+--~ local pattern = (noslashes^0 * slashes)^0 * Cp() * ((noperiod^1 * period)^1 * Cp() + P(true)) * noperiod^1 * -1
--~ function file.nameonly(name)
--~ local a, b = lpegmatch(pattern,name)
@@ -353,11 +370,14 @@ end
-- also rewrite previous
-local letter = lpeg.R("az","AZ") + lpeg.S("_-+")
-local separator = lpeg.P("://")
+local letter = R("az","AZ") + S("_-+")
+local separator = P("://")
-local qualified = lpeg.P(".")^0 * lpeg.P("/") + letter*lpeg.P(":") + letter^1*separator + letter^1 * lpeg.P("/")
-local rootbased = lpeg.P("/") + letter*lpeg.P(":")
+local qualified = P(".")^0 * P("/") + letter*P(":") + letter^1*separator + letter^1 * P("/")
+local rootbased = P("/") + letter*P(":")
+
+lpeg.patterns.qualified = qualified
+lpeg.patterns.rootbased = rootbased
-- ./name ../name /name c: :// name/name
@@ -369,14 +389,16 @@ function file.is_rootbased_path(filename)
return lpegmatch(rootbased,filename) ~= nil
end
-local slash = lpeg.S("\\/")
-local period = lpeg.P(".")
-local drive = lpeg.C(lpeg.R("az","AZ")) * lpeg.P(":")
-local path = lpeg.C(((1-slash)^0 * slash)^0)
-local suffix = period * lpeg.C(lpeg.P(1-period)^0 * lpeg.P(-1))
-local base = lpeg.C((1-suffix)^0)
+-- actually these are schemes
+
+local slash = S("\\/")
+local period = P(".")
+local drive = C(R("az","AZ")) * P(":")
+local path = C(((1-slash)^0 * slash)^0)
+local suffix = period * C(P(1-period)^0 * P(-1))
+local base = C((1-suffix)^0)
-local pattern = (drive + lpeg.Cc("")) * (path + lpeg.Cc("")) * (base + lpeg.Cc("")) * (suffix + lpeg.Cc(""))
+local pattern = (drive + Cc("")) * (path + Cc("")) * (base + Cc("")) * (suffix + Cc(""))
function file.splitname(str) -- returns drive, path, base, suffix
return lpegmatch(pattern,str)
@@ -392,8 +414,15 @@ end
--~ -- todo:
--~
--~ if os.type == "windows" then
---~ local currentdir = lfs.currentdir
---~ function lfs.currentdir()
+--~ local currentdir = getcurrentdir
+--~ function getcurrentdir()
--~ return (gsub(currentdir(),"\\","/"))
--~ end
--~ end
+
+-- for myself:
+
+function file.strip(name,dir)
+ local b, a = match(name,"^(.-)" .. dir .. "(.*)$")
+ return a ~= "" and a or name
+end
diff --git a/Master/texmf-dist/tex/context/base/l-io.lua b/Master/texmf-dist/tex/context/base/l-io.lua
index 66e279309fb..a740996c68c 100644
--- a/Master/texmf-dist/tex/context/base/l-io.lua
+++ b/Master/texmf-dist/tex/context/base/l-io.lua
@@ -6,7 +6,10 @@ if not modules then modules = { } end modules ['l-io'] = {
license = "see context related readme files"
}
-local byte, find, gsub = string.byte, string.find, string.gsub
+local io = io
+local byte, find, gsub, format = string.byte, string.find, string.gsub, string.format
+local concat = table.concat
+local type = type
if string.find(os.getenv("PATH"),";") then
io.fileseparator, io.pathseparator = "\\", ";"
@@ -17,9 +20,7 @@ end
function io.loaddata(filename,textmode)
local f = io.open(filename,(textmode and 'r') or 'rb')
if f then
- -- collectgarbage("step") -- sometimes makes a big difference in mem consumption
local data = f:read('*all')
- -- garbagecollector.check(data)
f:close()
return data
else
@@ -31,13 +32,14 @@ function io.savedata(filename,data,joiner)
local f = io.open(filename,"wb")
if f then
if type(data) == "table" then
- f:write(table.join(data,joiner or ""))
+ f:write(concat(data,joiner or ""))
elseif type(data) == "function" then
data(f)
else
f:write(data or "")
end
f:close()
+ io.flush()
return true
else
return false
@@ -66,12 +68,19 @@ function io.size(filename)
end
function io.noflines(f)
- local n = 0
- for _ in f:lines() do
- n = n + 1
+ if type(f) == "string" then
+ local f = io.open(filename)
+ local n = f and io.noflines(f) or 0
+ assert(f:close())
+ return n
+ else
+ local n = 0
+ for _ in f:lines() do
+ n = n + 1
+ end
+ f:seek('set',0)
+ return n
end
- f:seek('set',0)
- return n
end
local nextchar = {
@@ -97,8 +106,6 @@ local nextchar = {
function io.characters(f,n)
if f then
return nextchar[n or 1], f
- else
- return nil, nil
end
end
@@ -107,40 +114,42 @@ local nextbyte = {
local a, b, c, d = f:read(1,1,1,1)
if d then
return byte(a), byte(b), byte(c), byte(d)
- else
- return nil, nil, nil, nil
+ end
+ end,
+ [3] = function(f)
+ local a, b, c = f:read(1,1,1)
+ if b then
+ return byte(a), byte(b), byte(c)
end
end,
[2] = function(f)
local a, b = f:read(1,1)
if b then
return byte(a), byte(b)
- else
- return nil, nil
end
end,
[1] = function (f)
local a = f:read(1)
if a then
return byte(a)
- else
- return nil
end
end,
[-2] = function (f)
local a, b = f:read(1,1)
if b then
return byte(b), byte(a)
- else
- return nil, nil
+ end
+ end,
+ [-3] = function(f)
+ local a, b, c = f:read(1,1,1)
+ if b then
+ return byte(c), byte(b), byte(a)
end
end,
[-4] = function(f)
local a, b, c, d = f:read(1,1,1,1)
if d then
return byte(d), byte(c), byte(b), byte(a)
- else
- return nil, nil, nil, nil
end
end
}
@@ -157,12 +166,13 @@ function io.ask(question,default,options)
while true do
io.write(question)
if options then
- io.write(string.format(" [%s]",table.concat(options,"|")))
+ io.write(format(" [%s]",concat(options,"|")))
end
if default then
- io.write(string.format(" [%s]",default))
+ io.write(format(" [%s]",default))
end
- io.write(string.format(" "))
+ io.write(format(" "))
+ io.flush()
local answer = io.read()
answer = gsub(answer,"^%s*(.*)%s*$","%1")
if answer == "" and default then
@@ -185,3 +195,60 @@ function io.ask(question,default,options)
end
end
end
+
+local function readnumber(f,n,m)
+ if m then
+ f:seek("set",n)
+ n = m
+ end
+ if n == 1 then
+ return byte(f:read(1))
+ elseif n == 2 then
+ local a, b = byte(f:read(2),1,2)
+ return 256 * a + b
+ elseif n == 3 then
+ local a, b, c = byte(f:read(3),1,3)
+ return 256*256 * a + 256 * b + c
+ elseif n == 4 then
+ local a, b, c, d = byte(f:read(4),1,4)
+ return 256*256*256 * a + 256*256 * b + 256 * c + d
+ elseif n == 8 then
+ local a, b = readnumber(f,4), readnumber(f,4)
+ return 256 * a + b
+ elseif n == 12 then
+ local a, b, c = readnumber(f,4), readnumber(f,4), readnumber(f,4)
+ return 256*256 * a + 256 * b + c
+ elseif n == -2 then
+ local b, a = byte(f:read(2),1,2)
+ return 256*a + b
+ elseif n == -3 then
+ local c, b, a = byte(f:read(3),1,3)
+ return 256*256 * a + 256 * b + c
+ elseif n == -4 then
+ local d, c, b, a = byte(f:read(4),1,4)
+ return 256*256*256 * a + 256*256 * b + 256*c + d
+ elseif n == -8 then
+ local h, g, f, e, d, c, b, a = byte(f:read(8),1,8)
+ return 256*256*256*256*256*256*256 * a +
+ 256*256*256*256*256*256 * b +
+ 256*256*256*256*256 * c +
+ 256*256*256*256 * d +
+ 256*256*256 * e +
+ 256*256 * f +
+ 256 * g +
+ h
+ else
+ return 0
+ end
+end
+
+io.readnumber = readnumber
+
+function io.readstring(f,n,m)
+ if m then
+ f:seek("set",n)
+ n = m
+ end
+ local str = gsub(f:read(n),"%z","")
+ return str
+end
diff --git a/Master/texmf-dist/tex/context/base/l-lpeg.lua b/Master/texmf-dist/tex/context/base/l-lpeg.lua
index b107a8e6432..ce0cc67efe7 100644
--- a/Master/texmf-dist/tex/context/base/l-lpeg.lua
+++ b/Master/texmf-dist/tex/context/base/l-lpeg.lua
@@ -8,28 +8,75 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
local lpeg = require("lpeg")
+local type = type
+
+-- Beware, we predefine a bunch of patterns here and one reason for doing so
+-- is that we get consistent behaviour in some of the visualizers.
+
lpeg.patterns = lpeg.patterns or { } -- so that we can share
local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
-local match = lpeg.match
+local P, R, S, V, match = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.match
+local Ct, C, Cs, Cc = lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local lpegtype = lpeg.type
+
+local utfcharacters = string.utfcharacters
+local utfgmatch = unicode and unicode.utf8.gmatch
+
+local anything = P(1)
+local endofstring = P(-1)
+local alwaysmatched = P(true)
+
+patterns.anything = anything
+patterns.endofstring = endofstring
+patterns.beginofstring = alwaysmatched
+patterns.alwaysmatched = alwaysmatched
local digit, sign = R('09'), S('+-')
local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
-local utf8byte = R("\128\191")
+local newline = crlf + cr + lf
+local escaped = P("\\") * anything
+local squote = P("'")
+local dquote = P('"')
+local space = P(" ")
+
+local utfbom_32_be = P('\000\000\254\255')
+local utfbom_32_le = P('\255\254\000\000')
+local utfbom_16_be = P('\255\254')
+local utfbom_16_le = P('\254\255')
+local utfbom_8 = P('\239\187\191')
+local utfbom = utfbom_32_be + utfbom_32_le
+ + utfbom_16_be + utfbom_16_le
+ + utfbom_8
+local utftype = utfbom_32_be / "utf-32-be" + utfbom_32_le / "utf-32-le"
+ + utfbom_16_be / "utf-16-be" + utfbom_16_le / "utf-16-le"
+ + utfbom_8 / "utf-8" + alwaysmatched / "unknown"
+
+local utf8next = R("\128\191")
-patterns.utf8byte = utf8byte
patterns.utf8one = R("\000\127")
-patterns.utf8two = R("\194\223") * utf8byte
-patterns.utf8three = R("\224\239") * utf8byte * utf8byte
-patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+patterns.utf8two = R("\194\223") * utf8next
+patterns.utf8three = R("\224\239") * utf8next * utf8next
+patterns.utf8four = R("\240\244") * utf8next * utf8next * utf8next
+patterns.utfbom = utfbom
+patterns.utftype = utftype
+
+local utf8char = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+local validutf8char = utf8char^0 * endofstring * Cc(true) + Cc(false)
+
+patterns.utf8 = utf8char
+patterns.utf8char = utf8char
+patterns.validutf8 = validutf8char
+patterns.validutf8char = validutf8char
patterns.digit = digit
patterns.sign = sign
patterns.cardinal = sign^0 * digit^1
patterns.integer = sign^0 * digit^1
patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.cfloat = sign^0 * digit^0 * P(',') * digit^1
patterns.number = patterns.float + patterns.integer
+patterns.cnumber = patterns.cfloat + patterns.integer
patterns.oct = P("0") * R("07")^1
patterns.octal = patterns.oct
patterns.HEX = P("0x") * R("09","AF")^1
@@ -38,16 +85,46 @@ patterns.hexadecimal = P("0x") * R("09","AF","af")^1
patterns.lowercase = R("az")
patterns.uppercase = R("AZ")
patterns.letter = patterns.lowercase + patterns.uppercase
-patterns.space = S(" ")
+patterns.space = space
+patterns.tab = P("\t")
+patterns.spaceortab = patterns.space + patterns.tab
patterns.eol = S("\n\r")
patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-patterns.newline = crlf + cr + lf
-patterns.nonspace = 1 - patterns.space
+patterns.newline = newline
+patterns.emptyline = newline^1
patterns.nonspacer = 1 - patterns.spacer
patterns.whitespace = patterns.eol + patterns.spacer
patterns.nonwhitespace = 1 - patterns.whitespace
-patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
-patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
+patterns.equal = P("=")
+patterns.comma = P(",")
+patterns.commaspacer = P(",") * patterns.spacer^0
+patterns.period = P(".")
+patterns.colon = P(":")
+patterns.semicolon = P(";")
+patterns.underscore = P("_")
+patterns.escaped = escaped
+patterns.squote = squote
+patterns.dquote = dquote
+patterns.nosquote = (escaped + (1-squote))^0
+patterns.nodquote = (escaped + (1-dquote))^0
+patterns.unsingle = (squote/"") * patterns.nosquote * (squote/"")
+patterns.undouble = (dquote/"") * patterns.nodquote * (dquote/"")
+patterns.unquoted = patterns.undouble + patterns.unsingle -- more often undouble
+patterns.unspacer = ((patterns.spacer^1)/"")^0
+
+patterns.somecontent = (anything - newline - space)^1 -- (utf8char - newline - space)^1
+patterns.beginline = #(1-newline)
+
+local unquoted = Cs(patterns.unquoted * endofstring) -- not C
+
+function string.unquoted(str)
+ return match(unquoted,str) or str
+end
+
+--~ print(string.unquoted("test"))
+--~ print(string.unquoted([["t\"est"]]))
+--~ print(string.unquoted([["t\"est"x]]))
+--~ print(string.unquoted("\'test\'"))
function lpeg.anywhere(pattern) --slightly adapted from website
return P { P(pattern) + 1 * V(1) } -- why so complex?
@@ -57,36 +134,18 @@ function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
-local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
-local empty = spacing * Cc("")
-local nonempty = Cs((1-spacing)^1) * spacing^-1
-local content = (empty + nonempty)^1
-
-local capture = Ct(content^0)
-
-function string:splitlines()
- return match(capture,self)
-end
-
-patterns.textline = content
-
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps")) -- oeps
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps")) -- oeps
-
local splitters_s, splitters_m = { }, { }
local function splitat(separator,single)
local splitter = (single and splitters_s[separator]) or splitters_m[separator]
if not splitter then
separator = P(separator)
+ local other = C((1 - separator)^0)
if single then
- local other, any = C((1 - separator)^0), P(1)
+ local any = anything
splitter = other * (separator * C(any^0) + "") -- ?
splitters_s[separator] = splitter
else
- local other = C((1 - separator)^0)
splitter = other * (separator * other)^0
splitters_m[separator] = splitter
end
@@ -96,6 +155,11 @@ end
lpeg.splitat = splitat
+--~ local p = splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
+--~ local p = splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
+--~ local p = splitat("->",false) print(match(p,"oeps")) -- oeps
+--~ local p = splitat("->",true) print(match(p,"oeps")) -- oeps
+
local cache = { }
function lpeg.split(separator,str)
@@ -107,16 +171,45 @@ function lpeg.split(separator,str)
return match(c,str)
end
-function string:split(separator)
+function string.split(str,separator)
local c = cache[separator]
if not c then
c = Ct(splitat(separator))
cache[separator] = c
end
- return match(c,self)
+ return match(c,str)
+end
+
+local spacing = patterns.spacer^0 * newline -- sort of strip
+local empty = spacing * Cc("")
+local nonempty = Cs((1-spacing)^1) * spacing^-1
+local content = (empty + nonempty)^1
+
+patterns.textline = content
+
+--~ local linesplitter = Ct(content^0)
+--~
+--~ function string.splitlines(str)
+--~ return match(linesplitter,str)
+--~ end
+
+local linesplitter = Ct(splitat(newline))
+
+patterns.linesplitter = linesplitter
+
+function string.splitlines(str)
+ return match(linesplitter,str)
+end
+
+local utflinesplitter = utfbom^-1 * Ct(splitat(newline))
+
+patterns.utflinesplitter = utflinesplitter
+
+function string.utfsplitlines(str)
+ return match(utflinesplitter,str)
end
-lpeg.splitters = cache
+--~ lpeg.splitters = cache -- no longer public
local cache = { }
@@ -124,36 +217,24 @@ function lpeg.checkedsplit(separator,str)
local c = cache[separator]
if not c then
separator = P(separator)
- local other = C((1 - separator)^0)
+ local other = C((1 - separator)^1)
c = Ct(separator^0 * other * (separator^1 * other)^0)
cache[separator] = c
end
return match(c,str)
end
-function string:checkedsplit(separator)
+function string.checkedsplit(str,separator)
local c = cache[separator]
if not c then
separator = P(separator)
- local other = C((1 - separator)^0)
+ local other = C((1 - separator)^1)
c = Ct(separator^0 * other * (separator^1 * other)^0)
cache[separator] = c
end
- return match(c,self)
+ return match(c,str)
end
---~ function lpeg.append(list,pp)
---~ local p = pp
---~ for l=1,#list do
---~ if p then
---~ p = p + P(list[l])
---~ else
---~ p = P(list[l])
---~ end
---~ end
---~ return p
---~ end
-
--~ from roberto's site:
local f1 = string.byte
@@ -162,4 +243,299 @@ local function f2(s) local c1, c2 = f1(s,1,2) return c1 * 64 + c2
local function f3(s) local c1, c2, c3 = f1(s,1,3) return (c1 * 64 + c2) * 64 + c3 - 925824 end
local function f4(s) local c1, c2, c3, c4 = f1(s,1,4) return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168 end
-patterns.utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
+local utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
+
+patterns.utf8byte = utf8byte
+
+--~ local str = " a b c d "
+
+--~ local s = lpeg.stripper(lpeg.R("az")) print("["..lpeg.match(s,str).."]")
+--~ local s = lpeg.keeper(lpeg.R("az")) print("["..lpeg.match(s,str).."]")
+--~ local s = lpeg.stripper("ab") print("["..lpeg.match(s,str).."]")
+--~ local s = lpeg.keeper("ab") print("["..lpeg.match(s,str).."]")
+
+local cache = { }
+
+function lpeg.stripper(str)
+ if type(str) == "string" then
+ local s = cache[str]
+ if not s then
+ s = Cs(((S(str)^1)/"" + 1)^0)
+ cache[str] = s
+ end
+ return s
+ else
+ return Cs(((str^1)/"" + 1)^0)
+ end
+end
+
+local cache = { }
+
+function lpeg.keeper(str)
+ if type(str) == "string" then
+ local s = cache[str]
+ if not s then
+ s = Cs((((1-S(str))^1)/"" + 1)^0)
+ cache[str] = s
+ end
+ return s
+ else
+ return Cs((((1-str)^1)/"" + 1)^0)
+ end
+end
+
+function lpeg.frontstripper(str) -- or pattern (yet undocumented)
+ return (P(str) + P(true)) * Cs(P(1)^0)
+end
+
+function lpeg.endstripper(str) -- or pattern (yet undocumented)
+ return Cs((1 - P(str) * P(-1))^0)
+end
+
+-- Just for fun I looked at the used bytecode and
+-- p = (p and p + pp) or pp gets one more (testset).
+
+function lpeg.replacer(one,two)
+ if type(one) == "table" then
+ local no = #one
+ if no > 0 then
+ local p
+ for i=1,no do
+ local o = one[i]
+ local pp = P(o[1]) / o[2]
+ if p then
+ p = p + pp
+ else
+ p = pp
+ end
+ end
+ return Cs((p + 1)^0)
+ end
+ else
+ two = two or ""
+ return Cs((P(one)/two + 1)^0)
+ end
+end
+
+local splitters_f, splitters_s = { }, { }
+
+function lpeg.firstofsplit(separator) -- always return value
+ local splitter = splitters_f[separator]
+ if not splitter then
+ separator = P(separator)
+ splitter = C((1 - separator)^0)
+ splitters_f[separator] = splitter
+ end
+ return splitter
+end
+
+function lpeg.secondofsplit(separator) -- nil if not split
+ local splitter = splitters_s[separator]
+ if not splitter then
+ separator = P(separator)
+ splitter = (1 - separator)^0 * separator * C(anything^0)
+ splitters_s[separator] = splitter
+ end
+ return splitter
+end
+
+function lpeg.balancer(left,right)
+ left, right = P(left), P(right)
+ return P { left * ((1 - left - right) + V(1))^0 * right }
+end
+
+--~ print(1,match(lpeg.firstofsplit(":"),"bc:de"))
+--~ print(2,match(lpeg.firstofsplit(":"),":de")) -- empty
+--~ print(3,match(lpeg.firstofsplit(":"),"bc"))
+--~ print(4,match(lpeg.secondofsplit(":"),"bc:de"))
+--~ print(5,match(lpeg.secondofsplit(":"),"bc:")) -- empty
+--~ print(6,match(lpeg.secondofsplit(":",""),"bc"))
+--~ print(7,match(lpeg.secondofsplit(":"),"bc"))
+--~ print(9,match(lpeg.secondofsplit(":","123"),"bc"))
+
+--~ -- slower:
+--~
+--~ function lpeg.counter(pattern)
+--~ local n, pattern = 0, (lpeg.P(pattern)/function() n = n + 1 end + lpeg.anything)^0
+--~ return function(str) n = 0 ; lpegmatch(pattern,str) ; return n end
+--~ end
+
+local nany = utf8char/""
+
+function lpeg.counter(pattern)
+ pattern = Cs((P(pattern)/" " + nany)^0)
+ return function(str)
+ return #match(pattern,str)
+ end
+end
+
+if utfgmatch then
+
+ function lpeg.count(str,what) -- replaces string.count
+ if type(what) == "string" then
+ local n = 0
+ for _ in utfgmatch(str,what) do
+ n = n + 1
+ end
+ return n
+ else -- 4 times slower but still faster than / function
+ return #match(Cs((P(what)/" " + nany)^0),str)
+ end
+ end
+
+else
+
+ local cache = { }
+
+ function lpeg.count(str,what) -- replaces string.count
+ if type(what) == "string" then
+ local p = cache[what]
+ if not p then
+ p = Cs((P(what)/" " + nany)^0)
+ cache[p] = p
+ end
+ return #match(p,str)
+ else -- 4 times slower but still faster than / function
+ return #match(Cs((P(what)/" " + nany)^0),str)
+ end
+ end
+
+end
+
+local patterns_escapes = { -- also defines in l-string
+ ["%"] = "%%",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%)", [")"] = "%)",
+ -- ["{"] = "%{", ["}"] = "%}"
+ -- ["^"] = "%^", ["$"] = "%$",
+}
+
+local simple_escapes = { -- also defines in l-string
+ ["-"] = "%-",
+ ["."] = "%.",
+ ["?"] = ".",
+ ["*"] = ".*",
+}
+
+local p = Cs((S("-.+*%()[]") / patterns_escapes + anything)^0)
+local s = Cs((S("-.+*%()[]") / simple_escapes + anything)^0)
+
+function string.escapedpattern(str,simple)
+ return match(simple and s or p,str)
+end
+
+-- utf extensies
+
+lpeg.UP = lpeg.P
+
+if utfcharacters then
+
+ function lpeg.US(str)
+ local p
+ for uc in utfcharacters(str) do
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ return p
+ end
+
+
+elseif utfgmatch then
+
+ function lpeg.US(str)
+ local p
+ for uc in utfgmatch(str,".") do
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ return p
+ end
+
+else
+
+ function lpeg.US(str)
+ local p
+ local f = function(uc)
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ match((utf8char/f)^0,str)
+ return p
+ end
+
+end
+
+local range = Cs(utf8byte) * (Cs(utf8byte) + Cc(false))
+
+local utfchar = unicode and unicode.utf8 and unicode.utf8.char
+
+function lpeg.UR(str,more)
+ local first, last
+ if type(str) == "number" then
+ first = str
+ last = more or first
+ else
+ first, last = match(range,str)
+ if not last then
+ return P(str)
+ end
+ end
+ if first == last then
+ return P(str)
+ elseif utfchar and last - first < 8 then -- a somewhat arbitrary criterium
+ local p
+ for i=first,last do
+ if p then
+ p = p + P(utfchar(i))
+ else
+ p = P(utfchar(i))
+ end
+ end
+ return p -- nil when invalid range
+ else
+ local f = function(b)
+ return b >= first and b <= last
+ end
+ return utf8byte / f -- nil when invalid range
+ end
+end
+
+--~ lpeg.print(lpeg.R("ab","cd","gh"))
+--~ lpeg.print(lpeg.P("a","b","c"))
+--~ lpeg.print(lpeg.S("a","b","c"))
+
+--~ print(lpeg.count("äáàa",lpeg.P("á") + lpeg.P("à")))
+--~ print(lpeg.count("äáàa",lpeg.UP("áà")))
+--~ print(lpeg.count("äáàa",lpeg.US("àá")))
+--~ print(lpeg.count("äáàa",lpeg.UR("aá")))
+--~ print(lpeg.count("äáàa",lpeg.UR("àá")))
+--~ print(lpeg.count("äáàa",lpeg.UR(0x0000,0xFFFF)))
+
+function lpeg.oneof(list,...) -- lpeg.oneof("elseif","else","if","then")
+ if type(list) ~= "table" then
+ list = { list, ... }
+ end
+ -- sort(list) -- longest match first
+ local p = P(list[1])
+ for l=2,#list do
+ p = p + P(list[l])
+ end
+ return p
+end
+
+function lpeg.is_lpeg(p)
+ return p and lpegtype(p) == "pattern"
+end
+
+--~ Cf(Ct("") * (Cg(C(...) * "=" * Cs(...)))^0, rawset)
diff --git a/Master/texmf-dist/tex/context/base/l-math.lua b/Master/texmf-dist/tex/context/base/l-math.lua
index fc8db472142..48089957f71 100644
--- a/Master/texmf-dist/tex/context/base/l-math.lua
+++ b/Master/texmf-dist/tex/context/base/l-math.lua
@@ -9,33 +9,26 @@ 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.round then
- function math.round(x)
- return floor(x + 0.5)
- end
+ function math.round(x) return floor(x + 0.5) end
end
if not math.div then
- function math.div(n,m)
- return floor(n/m)
- end
+ function math.div(n,m) return floor(n/m) end
end
if not math.mod then
- function math.mod(n,m)
- return n % m
- end
+ function math.mod(n,m) return n % m end
end
local pipi = 2*math.pi/360
-function math.sind(d)
- return sin(d*pipi)
+if not math.sind then
+ function math.sind(d) return sin(d*pipi) end
+ function math.cosd(d) return cos(d*pipi) end
+ function math.tand(d) return tan(d*pipi) end
end
-function math.cosd(d)
- return cos(d*pipi)
-end
-
-function math.tand(d)
- return tan(d*pipi)
+if not math.odd then
+ function math.odd (n) return n % 2 == 0 end
+ function math.even(n) return n % 2 ~= 0 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 27955ef9b9e..1d471c966ca 100644
--- a/Master/texmf-dist/tex/context/base/l-md5.lua
+++ b/Master/texmf-dist/tex/context/base/l-md5.lua
@@ -7,6 +7,7 @@ if not modules then modules = { } end modules ['l-md5'] = {
-- This also provides file checksums and checkers.
+local md5, file = md5, file
local gsub, format, byte = string.gsub, string.format, string.byte
local function convert(str,fmt)
@@ -30,14 +31,12 @@ if not md5.dec then function md5.dec(str) return convert(str,"%03i") end end
--~ function md5.dec(str) return (gsub(md5.sum(str),".",remap)) end
--~ end
-file.needs_updating_threshold = 1
-
-function file.needs_updating(oldname,newname) -- size modification access change
+function file.needs_updating(oldname,newname,threshold) -- size modification access change
local oldtime = lfs.attributes(oldname, modification)
local newtime = lfs.attributes(newname, modification)
if newtime >= oldtime then
return false
- elseif oldtime - newtime < file.needs_updating_threshold then
+ elseif oldtime - newtime < (threshold or 1) then
return false
else
return true
diff --git a/Master/texmf-dist/tex/context/base/l-number.lua b/Master/texmf-dist/tex/context/base/l-number.lua
index a1249f0556a..b1ffb9ca990 100644
--- a/Master/texmf-dist/tex/context/base/l-number.lua
+++ b/Master/texmf-dist/tex/context/base/l-number.lua
@@ -6,11 +6,15 @@ if not modules then modules = { } end modules ['l-number'] = {
license = "see context related readme files"
}
+-- this module will be replaced when we have the bit library
+
local tostring = tostring
-local format, floor, insert, match = string.format, math.floor, table.insert, string.match
+local format, floor, match, rep = string.format, math.floor, string.match, string.rep
+local concat, insert = table.concat, table.insert
local lpegmatch = lpeg.match
-number = number or { }
+number = number or { }
+local number = number
-- a,b,c,d,e,f = number.toset(100101)
@@ -56,3 +60,71 @@ function number.bits(n,zero)
end
return t
end
+
+--~ http://ricilake.blogspot.com/2007/10/iterating-bits-in-lua.html
+
+function number.bit(p)
+ return 2 ^ (p - 1) -- 1-based indexing
+end
+
+function number.hasbit(x, p) -- typical call: if hasbit(x, bit(3)) then ...
+ return x % (p + p) >= p
+end
+
+function number.setbit(x, p)
+ return hasbit(x, p) and x or x + p
+end
+
+function number.clearbit(x, p)
+ return hasbit(x, p) and x - p or x
+end
+
+--~ function number.tobitstring(n)
+--~ if n == 0 then
+--~ return "0"
+--~ else
+--~ local t = { }
+--~ while n > 0 do
+--~ insert(t,1,n % 2 > 0 and 1 or 0)
+--~ n = floor(n/2)
+--~ end
+--~ return concat(t)
+--~ end
+--~ end
+
+function number.tobitstring(n,m)
+ if n == 0 then
+ if m then
+ rep("00000000",m)
+ else
+ return "00000000"
+ end
+ else
+ local t = { }
+ while n > 0 do
+ insert(t,1,n % 2 > 0 and 1 or 0)
+ n = floor(n/2)
+ end
+ local nn = 8 - #t % 8
+ if nn > 0 and nn < 8 then
+ for i=1,nn do
+ insert(t,1,0)
+ end
+ end
+ if m then
+ m = m * 8 - #t
+ if m > 0 then
+ insert(t,1,rep("0",m))
+ end
+ end
+ return concat(t)
+ end
+end
+
+--~ print(number.tobitstring(8))
+--~ print(number.tobitstring(14))
+--~ print(number.tobitstring(66))
+--~ print(number.tobitstring(0x00))
+--~ print(number.tobitstring(0xFF))
+--~ print(number.tobitstring(46260767936,8))
+--~ print(#number.tobitstring(46260767936,6))
diff --git a/Master/texmf-dist/tex/context/base/l-os.lua b/Master/texmf-dist/tex/context/base/l-os.lua
index fba2cd31770..91150623945 100644
--- a/Master/texmf-dist/tex/context/base/l-os.lua
+++ b/Master/texmf-dist/tex/context/base/l-os.lua
@@ -6,32 +6,119 @@ if not modules then modules = { } end modules ['l-os'] = {
license = "see context related readme files"
}
+-- This file deals with some operating system issues. Please don't bother me
+-- with the pros and cons of operating systems as they all have their flaws
+-- and benefits. Bashing one of them won't help solving problems and fixing
+-- bugs faster and is a waste of time and energy.
+--
+-- path separators: / or \ ... we can use / everywhere
+-- suffixes : dll so exe <none> ... no big deal
+-- quotes : we can use "" in most cases
+-- expansion : unless "" are used * might give side effects
+-- piping/threads : somewhat different for each os
+-- locations : specific user file locations and settings can change over time
+--
+-- os.type : windows | unix (new, we already guessed os.platform)
+-- os.name : windows | msdos | linux | macosx | solaris | .. | generic (new)
+-- os.platform : extended os.name with architecture
+
-- maybe build io.flush in os.execute
-local find, format, gsub = string.find, string.format, string.gsub
+local os = os
+local find, format, gsub, upper = string.find, string.format, string.gsub, string.upper
+local concat = table.concat
local random, ceil = math.random, math.ceil
+local rawget, rawset, type, getmetatable, setmetatable, tonumber = rawget, rawset, type, getmetatable, setmetatable, tonumber
+
+-- The following code permits traversing the environment table, at least
+-- in luatex. Internally all environment names are uppercase.
+
+if not os.__getenv__ then
+
+ os.__getenv__ = os.getenv
+ os.__setenv__ = os.setenv
-local execute, spawn, exec, ioflush = os.execute, os.spawn or os.execute, os.exec or os.execute, io.flush
+ if os.env then
+
+ local osgetenv = os.getenv
+ local ossetenv = os.setenv
+ local osenv = os.env local _ = osenv.PATH -- initialize the table
+
+ function os.setenv(k,v)
+ if v == nil then
+ v = ""
+ end
+ local K = upper(k)
+ osenv[K] = v
+ if type(v) == "table" then
+ v = concat(v,";") -- path
+ end
+ ossetenv(K,v)
+ end
+
+ function os.getenv(k)
+ local K = upper(k)
+ local v = osenv[K] or osenv[k] or osgetenv(K) or osgetenv(k)
+ if v == "" then
+ return nil
+ else
+ return v
+ end
+ end
+
+ else
+
+ local ossetenv = os.setenv
+ local osgetenv = os.getenv
+ local osenv = { }
+
+ function os.setenv(k,v)
+ if v == nil then
+ v = ""
+ end
+ local K = upper(k)
+ osenv[K] = v
+ end
+
+ function os.getenv(k)
+ local K = upper(k)
+ local v = osenv[K] or osgetenv(K) or osgetenv(k)
+ if v == "" then
+ return nil
+ else
+ return v
+ end
+ end
+
+ local function __index(t,k)
+ return os.getenv(k)
+ end
+ local function __newindex(t,k,v)
+ os.setenv(k,v)
+ end
+
+ os.env = { }
+
+ setmetatable(os.env, { __index = __index, __newindex = __newindex } )
+
+ end
+
+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
function os.resultof(command)
- ioflush() -- else messed up logging
local handle = io.popen(command,"r")
- if not handle then
- -- print("unknown command '".. command .. "' in os.resultof")
- return ""
- else
- return handle:read("*all") or ""
- end
+ return handle and handle:read("*all") or ""
end
---~ os.type : windows | unix (new, we already guessed os.platform)
---~ os.name : windows | msdos | linux | macosx | solaris | .. | generic (new)
---~ os.platform : extended os.name with architecture
-
if not io.fileseparator then
if find(os.getenv("PATH"),";") then
io.fileseparator, io.pathseparator, os.type = "\\", ";", os.type or "mswin"
@@ -89,7 +176,7 @@ end
-- no need for function anymore as we have more clever code and helpers now
-- this metatable trickery might as well disappear
-os.resolvers = os.resolvers or { }
+os.resolvers = os.resolvers or { } -- will become private
local resolvers = os.resolvers
@@ -102,24 +189,6 @@ end
setmetatable(os,osmt)
-if not os.setenv then
-
- -- we still store them but they won't be seen in
- -- child processes although we might pass them some day
- -- using command concatination
-
- local env, getenv = { }, os.getenv
-
- function os.setenv(k,v)
- env[k] = v
- end
-
- function os.getenv(k)
- return env[k] or getenv(k)
- end
-
-end
-
-- we can use HOSTTYPE on some platforms
local name, platform = os.name or "linux", os.getenv("MTX_PLATFORM") or ""
@@ -159,7 +228,7 @@ elseif os.type == "windows" then
elseif name == "linux" then
function os.resolvers.platform(t,k)
- -- we sometims have HOSTTYPE set so let's check that first
+ -- we sometimes have HOSTTYPE set so let's check that first
local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
if find(architecture,"x86_64") then
platform = "linux-64"
@@ -237,10 +306,10 @@ elseif name == "freebsd" then
elseif name == "kfreebsd" then
function os.resolvers.platform(t,k)
- -- we sometims have HOSTTYPE set so let's check that first
+ -- we sometimes have HOSTTYPE set so let's check that first
local platform, architecture = "", os.getenv("HOSTTYPE") or os.resultof("uname -m") or ""
if find(architecture,"x86_64") then
- platform = "kfreebsd-64"
+ platform = "kfreebsd-amd64"
else
platform = "kfreebsd-i386"
end
diff --git a/Master/texmf-dist/tex/context/base/l-pdfview.lua b/Master/texmf-dist/tex/context/base/l-pdfview.lua
index 627477ee823..6fd3ac24686 100644
--- a/Master/texmf-dist/tex/context/base/l-pdfview.lua
+++ b/Master/texmf-dist/tex/context/base/l-pdfview.lua
@@ -6,41 +6,54 @@ if not modules then modules = { } end modules ['l-pdfview'] = {
license = "see context related readme files"
}
-local format, getenv = string.format, os.getenv
+-- Todo: figure out pdfopen/pdfclose on linux. Calling e.g. okular directly
+-- doesn't work in linux when issued from scite as it blocks the editor (no
+-- & possible or so).
+
+local format, concat = string.format, table.concat
pdfview = pdfview or { }
local opencalls = {
- ['default'] = "pdfopen --file", -- "pdfopen --back --file"
+ ['default'] = "pdfopen --ax --file", -- "pdfopen --back --file"
['xpdf'] = "xpdfopen",
}
local closecalls= {
- ['default'] = "pdfclose --file",
+ ['default'] = "pdfclose --ax --file",
['xpdf'] = nil,
}
local allcalls = {
- ['default'] = "pdfclose --all",
+ ['default'] = "pdfclose --ax --all",
['xpdf'] = nil,
}
if os.type == "windows" then
- opencalls['okular'] = 'start "test" "c:/program files/kde/bin/okular.exe" --unique' -- todo: get focus
+ -- opencalls['okular'] = 'start "test" "c:/program files/kde/bin/okular.exe" --unique' -- todo: get focus
+ opencalls['okular'] = 'start "test" "c:/data/system/kde/bin/okular.exe" --unique' -- todo: get focus
else
- opencalls['okular'] = 'okular --unique'
+ opencalls['okular'] = 'okular --unique'
end
-pdfview.METHOD = "MTX_PDFVIEW_METHOD"
-pdfview.method = getenv(pdfview.METHOD) or 'default'
-pdfview.method = (opencalls[pdfview.method] and pdfview.method) or 'default'
+pdfview.method = "default"
+
+directives.register("pdfview.method", function(v)
+ pdfview.method = (opencalls[v] and v) or 'default'
+end)
+
+function pdfview.setmethod(method)
+ if method and opencalls[method] then
+ pdfview.method = method
+ end
+end
function pdfview.methods()
- return table.concat(table.sortedkeys(opencalls), " ")
+ return concat(table.sortedkeys(opencalls), " ")
end
function pdfview.status()
- return format("pdfview methods: %s, current method: %s, MTX_PDFVIEW_METHOD=%s",pdfview.methods(),pdfview.method,getenv(pdfview.METHOD) or "<unset>")
+ return format("pdfview methods: %s, current method: %s (directives_pdfview_method)",pdfview.methods(),tostring(pdfview.method))
end
local openedfiles = { }
diff --git a/Master/texmf-dist/tex/context/base/l-set.lua b/Master/texmf-dist/tex/context/base/l-set.lua
index f844d0b4004..2370f0139ff 100644
--- a/Master/texmf-dist/tex/context/base/l-set.lua
+++ b/Master/texmf-dist/tex/context/base/l-set.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['l-set'] = {
license = "see context related readme files"
}
+-- This will become obsolete when we have the bitset library embedded.
+
set = set or { }
local nums = { }
@@ -49,10 +51,11 @@ function set.tolist(n)
if n == 0 or not tabs[n] then
return ""
else
- local t = { }
+ local t, n = { }, 0
for k, v in next, tabs[n] do
if v then
- t[#t+1] = k
+ n = n + 1
+ t[n] = k
end
end
return concat(t," ")
diff --git a/Master/texmf-dist/tex/context/base/l-string.lua b/Master/texmf-dist/tex/context/base/l-string.lua
index 9856d521249..989e57f753b 100644
--- a/Master/texmf-dist/tex/context/base/l-string.lua
+++ b/Master/texmf-dist/tex/context/base/l-string.lua
@@ -6,8 +6,9 @@ if not modules then modules = { } end modules ['l-string'] = {
license = "see context related readme files"
}
+local string = string
local sub, gsub, find, match, gmatch, format, char, byte, rep, lower = string.sub, string.gsub, string.find, string.match, string.gmatch, string.format, string.char, string.byte, string.rep, string.lower
-local lpegmatch = lpeg.match
+local lpegmatch, S, C, Ct = lpeg.match, lpeg.S, lpeg.C, lpeg.Ct
-- some functions may disappear as they are not used anywhere
@@ -15,196 +16,75 @@ if not string.split then
-- this will be overloaded by a faster lpeg variant
- function string:split(pattern)
- if #self > 0 then
- local t = { }
- for s in gmatch(self..pattern,"(.-)"..pattern) do
- t[#t+1] = s
+ function string.split(str,pattern)
+ local t = { }
+ if #str > 0 then
+ local n = 1
+ for s in gmatch(str..pattern,"(.-)"..pattern) do
+ t[n] = s
+ n = n + 1
end
- return t
- else
- return { }
end
+ return t
end
end
-local chr_to_esc = {
- ["%"] = "%%",
- ["."] = "%.",
- ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
- ["^"] = "%^", ["$"] = "%$",
- ["["] = "%[", ["]"] = "%]",
- ["("] = "%(", [")"] = "%)",
- ["{"] = "%{", ["}"] = "%}"
-}
-
-string.chr_to_esc = chr_to_esc
-
-function string:esc() -- variant 2
- return (gsub(self,"(.)",chr_to_esc))
-end
-
-function string:unquote()
- return (gsub(self,"^([\"\'])(.*)%1$","%2"))
+function string.unquoted(str)
+ return (gsub(str,"^([\"\'])(.*)%1$","%2"))
end
---~ function string:unquote()
---~ if find(self,"^[\'\"]") then
---~ return sub(self,2,-2)
+--~ function stringunquoted(str)
+--~ if find(str,"^[\'\"]") then
+--~ return sub(str,2,-2)
--~ else
---~ return self
+--~ return str
--~ end
--~ end
-function string:quote() -- we could use format("%q")
- return format("%q",self)
+function string.quoted(str)
+ return format("%q",str) -- always "
end
-function string:count(pattern) -- variant 3
+function string.count(str,pattern) -- variant 3
local n = 0
- for _ in gmatch(self,pattern) do
+ for _ in gmatch(str,pattern) do -- not for utf
n = n + 1
end
return n
end
-function string:limit(n,sentinel)
- if #self > n then
- sentinel = sentinel or " ..."
- return sub(self,1,(n-#sentinel)) .. sentinel
- else
- return self
- end
-end
-
---~ function string:strip() -- the .- is quite efficient
---~ -- return match(self,"^%s*(.-)%s*$") or ""
---~ -- return match(self,'^%s*(.*%S)') or '' -- posted on lua list
---~ return find(s,'^%s*$') and '' or match(s,'^%s*(.*%S)')
---~ end
-
-do -- roberto's variant:
- local space = lpeg.S(" \t\v\n")
- local nospace = 1 - space
- local stripper = space^0 * lpeg.C((space^0 * nospace^1)^0)
- function string.strip(str)
- return lpegmatch(stripper,str) or ""
- end
-end
-
-function string:is_empty()
- return not find(self,"%S")
-end
-
-function string:enhance(pattern,action)
- local ok, n = true, 0
- while ok do
- ok = false
- self = gsub(self,pattern, function(...)
- ok, n = true, n + 1
- return action(...)
- end)
- end
- return self, n
-end
-
-local chr_to_hex, hex_to_chr = { }, { }
-
-for i=0,255 do
- local c, h = char(i), format("%02X",i)
- chr_to_hex[c], hex_to_chr[h] = h, c
-end
-
-function string:to_hex()
- return (gsub(self or "","(.)",chr_to_hex))
-end
-
-function string:from_hex()
- return (gsub(self or "","(..)",hex_to_chr))
-end
-
-if not string.characters then
-
- local function nextchar(str, index)
- index = index + 1
- return (index <= #str) and index or nil, sub(str,index,index)
- end
- function string:characters()
- return nextchar, self, 0
- end
- local function nextbyte(str, index)
- index = index + 1
- return (index <= #str) and index or nil, byte(sub(str,index,index))
- end
- function string:bytes()
- return nextbyte, self, 0
- end
-
-end
-
--- we can use format for this (neg n)
-
-function string:rpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return self .. rep(chr or " ",m)
- else
- return self
- end
-end
-
-function string:lpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return rep(chr or " ",m) .. self
+function string.limit(str,n,sentinel) -- not utf proof
+ if #str > n then
+ sentinel = sentinel or "..."
+ return sub(str,1,(n-#sentinel)) .. sentinel
else
- return self
+ return str
end
end
-string.padd = string.rpadd
+local space = S(" \t\v\n")
+local nospace = 1 - space
+local stripper = space^0 * C((space^0 * nospace^1)^0) -- roberto's code
-function is_number(str) -- tonumber
- return find(str,"^[%-%+]?[%d]-%.?[%d+]$") == 1
+function string.strip(str)
+ return lpegmatch(stripper,str) or ""
end
---~ print(is_number("1"))
---~ print(is_number("1.1"))
---~ print(is_number(".1"))
---~ print(is_number("-0.1"))
---~ print(is_number("+0.1"))
---~ print(is_number("-.1"))
---~ print(is_number("+.1"))
-
-function string:split_settings() -- no {} handling, see l-aux for lpeg variant
- if find(self,"=") then
- local t = { }
- for k,v in gmatch(self,"(%a+)=([^%,]*)") do
- t[k] = v
- end
- return t
- else
- return nil
- end
+function string.is_empty(str)
+ return not find(str,"%S")
end
local patterns_escapes = {
- ["-"] = "%-",
- ["."] = "%.",
- ["+"] = "%+",
- ["*"] = "%*",
["%"] = "%%",
- ["("] = "%)",
- [")"] = "%)",
- ["["] = "%[",
- ["]"] = "%]",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%(", [")"] = "%)",
+ -- ["{"] = "%{", ["}"] = "%}"
+ -- ["^"] = "%^", ["$"] = "%$",
}
-function string:pattesc()
- return (gsub(self,".",patterns_escapes))
-end
-
local simple_escapes = {
["-"] = "%-",
["."] = "%.",
@@ -212,77 +92,27 @@ local simple_escapes = {
["*"] = ".*",
}
-function string:simpleesc()
- return (gsub(self,".",simple_escapes))
-end
-
-function string:tohash()
- local t = { }
- for s in gmatch(self,"([^, ]+)") do -- lpeg
- t[s] = true
- end
- return t
-end
-
-local pattern = lpeg.Ct(lpeg.C(1)^0)
-
-function string:totable()
- return lpegmatch(pattern,self)
+function string.escapedpattern(str,simple)
+ return (gsub(str,".",simple and simple_escapes or patterns_escapes))
end
---~ local t = {
---~ "1234567123456712345671234567",
---~ "a\tb\tc",
---~ "aa\tbb\tcc",
---~ "aaa\tbbb\tccc",
---~ "aaaa\tbbbb\tcccc",
---~ "aaaaa\tbbbbb\tccccc",
---~ "aaaaaa\tbbbbbb\tcccccc",
---~ }
---~ for k,v do
---~ print(string.tabtospace(t[k]))
---~ end
-
-function string.tabtospace(str,tab)
- -- we don't handle embedded newlines
- while true do
- local s = find(str,"\t")
- if s then
- if not tab then tab = 7 end -- only when found
- local d = tab-(s-1) % tab
- if d > 0 then
- str = gsub(str,"\t",rep(" ",d),1)
- else
- str = gsub(str,"\t","",1)
- end
+function string.topattern(str,lowercase,strict)
+ if str == "" then
+ return ".*"
+ else
+ str = gsub(str,".",simple_escapes)
+ if lowercase then
+ str = lower(str)
+ end
+ if strict then
+ return "^" .. str .. "$"
else
- break
+ return str
end
end
- return str
end
-function string:compactlong() -- strips newlines and leading spaces
- self = gsub(self,"[\n\r]+ *","")
- self = gsub(self,"^ *","")
- return self
-end
+-- obsolete names:
-function string:striplong() -- strips newlines and leading spaces
- self = gsub(self,"^%s*","")
- self = gsub(self,"[\n\r]+ *","\n")
- return self
-end
-
-function string:topattern(lowercase,strict)
- if lowercase then
- self = lower(self)
- end
- self = gsub(self,".",simple_escapes)
- if self == "" then
- self = ".*"
- elseif strict then
- self = "^" .. self .. "$"
- end
- return self
-end
+string.quote = string.quoted
+string.unquote = string.unquoted
diff --git a/Master/texmf-dist/tex/context/base/l-table.lua b/Master/texmf-dist/tex/context/base/l-table.lua
index ee395d0f140..8fdb36a7f71 100644
--- a/Master/texmf-dist/tex/context/base/l-table.lua
+++ b/Master/texmf-dist/tex/context/base/l-table.lua
@@ -6,12 +6,10 @@ if not modules then modules = { } end modules ['l-table'] = {
license = "see context related readme files"
}
-table.join = table.concat
-
+local type, next, tostring, tonumber, ipairs, table, string = type, next, tostring, tonumber, ipairs, table, string
local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove
local format, find, gsub, lower, dump, match = string.format, string.find, string.gsub, string.lower, string.dump, string.match
local getmetatable, setmetatable = getmetatable, setmetatable
-local type, next, tostring, tonumber, ipairs = type, next, tostring, tonumber, ipairs
-- Starting with version 5.2 Lua no longer provide ipairs, which makes
-- sense. As we already used the for loop and # in most places the
@@ -63,50 +61,56 @@ end
-- extra functions, some might go (when not used)
function table.strip(tab)
- local lst = { }
+ local lst, l = { }, 0
for i=1,#tab do
local s = gsub(tab[i],"^%s*(.-)%s*$","%1")
if s == "" then
-- skip this one
else
- lst[#lst+1] = s
+ l = l + 1
+ lst[l] = s
end
end
return lst
end
function table.keys(t)
- local k = { }
+ local keys, k = { }, 0
for key, _ in next, t do
- k[#k+1] = key
+ k = k + 1
+ keys[k] = key
end
- return k
+ return keys
end
local function compare(a,b)
- return (tostring(a) < tostring(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)
+ end
end
local function sortedkeys(tab)
- local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
+ local srt, category, s = { }, 0, 0 -- 0=unknown 1=string, 2=number 3=mixed
for key,_ in next, tab do
- srt[#srt+1] = key
- if kind == 3 then
+ s = s + 1
+ srt[s] = key
+ if category == 3 then
-- no further check
else
local tkey = type(key)
if tkey == "string" then
- -- if kind == 2 then kind = 3 else kind = 1 end
- kind = (kind == 2 and 3) or 1
+ category = (category == 2 and 3) or 1
elseif tkey == "number" then
- -- if kind == 1 then kind = 3 else kind = 2 end
- kind = (kind == 1 and 3) or 2
+ category = (category == 1 and 3) or 2
else
- kind = 3
+ category = 3
end
end
end
- if kind == 0 or kind == 3 then
+ if category == 0 or category == 3 then
sort(srt,compare)
else
sort(srt)
@@ -115,9 +119,12 @@ local function sortedkeys(tab)
end
local function sortedhashkeys(tab) -- fast one
- local srt = { }
+ local srt, s = { }, 0
for key,_ in next, tab do
- srt[#srt+1] = key
+ if key then
+ s= s + 1
+ srt[s] = key
+ end
end
sort(srt)
return srt
@@ -126,34 +133,50 @@ end
table.sortedkeys = sortedkeys
table.sortedhashkeys = sortedhashkeys
-function table.sortedhash(t)
- local s = sortedhashkeys(t) -- maybe just sortedkeys
- local n = 0
- local function kv(s)
- n = n + 1
- local k = s[n]
- return k, t[k]
+local function nothing() end
+
+local function sortedhash(t)
+ if t then
+ local n, s = 0, sortedkeys(t) -- the robust one
+ local function kv(s)
+ n = n + 1
+ local k = s[n]
+ return k, t[k]
+ end
+ return kv, s
+ else
+ return nothing
end
- return kv, s
end
-table.sortedpairs = table.sortedhash
+table.sortedhash = sortedhash
+table.sortedpairs = sortedhash
function table.append(t, list)
- for _,v in next, list do
- insert(t,v)
+ local n = #t
+ for i=1,#list do
+ n = n + 1
+ t[n] = list[i]
end
+ return t
end
function table.prepend(t, list)
- for k,v in next, list do
- insert(t,k,v)
+ local nl = #list
+ local nt = nl + #t
+ for i=#t,1,-1 do
+ t[nt] = t[i]
+ nt = nt - 1
end
+ for i=1,#list do
+ t[i] = list[i]
+ end
+ return t
end
function table.merge(t, ...) -- first one is target
- t = t or {}
- local lst = {...}
+ t = t or { }
+ local lst = { ... }
for i=1,#lst do
for k, v in next, lst[i] do
t[k] = v
@@ -163,7 +186,7 @@ function table.merge(t, ...) -- first one is target
end
function table.merged(...)
- local tmp, lst = { }, {...}
+ local tmp, lst = { }, { ... }
for i=1,#lst do
for k, v in next, lst[i] do
tmp[k] = v
@@ -173,41 +196,45 @@ function table.merged(...)
end
function table.imerge(t, ...)
- local lst = {...}
+ local lst, nt = { ... }, #t
for i=1,#lst do
local nst = lst[i]
for j=1,#nst do
- t[#t+1] = nst[j]
+ nt = nt + 1
+ t[nt] = nst[j]
end
end
return t
end
function table.imerged(...)
- local tmp, lst = { }, {...}
+ local tmp, ntmp, lst = { }, 0, {...}
for i=1,#lst do
local nst = lst[i]
for j=1,#nst do
- tmp[#tmp+1] = nst[j]
+ ntmp = ntmp + 1
+ tmp[ntmp] = nst[j]
end
end
return tmp
end
-local function fastcopy(old) -- fast one
+local function fastcopy(old,metatabletoo) -- fast one
if old then
local new = { }
for k,v in next, old do
if type(v) == "table" then
- new[k] = fastcopy(v) -- was just table.copy
+ new[k] = fastcopy(v,metatabletoo) -- was just table.copy
else
new[k] = v
end
end
- -- optional second arg
- local mt = getmetatable(old)
- if mt then
- setmetatable(new,mt)
+ if metatabletoo then
+ -- optional second arg
+ local mt = getmetatable(old)
+ if mt then
+ setmetatable(new,mt)
+ end
end
return new
else
@@ -215,6 +242,8 @@ local function fastcopy(old) -- fast one
end
end
+-- todo : copy without metatable
+
local function copy(t, tables) -- taken from lua wiki, slightly adapted
tables = tables or { }
local tcopy = {}
@@ -247,33 +276,14 @@ end
table.fastcopy = fastcopy
table.copy = copy
--- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
-
-function table.sub(t,i,j)
- return { unpack(t,i,j) }
-end
-
-function table.replace(a,b)
- for k,v in next, b do
- a[k] = v
+function table.derive(parent)
+ local child = { }
+ if parent then
+ setmetatable(child,{ __index = parent })
end
+ return child
end
--- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice)
-
-function table.is_empty(t) -- obolete, use inline code instead
- return not t or not next(t)
-end
-
-function table.one_entry(t) -- obolete, use inline code instead
- local n = next(t)
- return n and not next(t,n)
-end
-
---~ function table.starts_at(t) -- obsolete, not nice anyway
---~ return ipairs(t,1)(t,0)
---~ end
-
function table.tohash(t,value)
local h = { }
if t then
@@ -286,27 +296,19 @@ function table.tohash(t,value)
end
function table.fromhash(t)
- local h = { }
+ local hsh, h = { }, 0
for k, v in next, t do -- no ipairs here
- if v then h[#h+1] = k end
+ if v then
+ h = h + 1
+ hsh[h] = k
+ end
end
- return h
+ return hsh
end
---~ print(table.serialize(t), "\n")
---~ print(table.serialize(t,"name"), "\n")
---~ print(table.serialize(t,false), "\n")
---~ print(table.serialize(t,true), "\n")
---~ print(table.serialize(t,"name",true), "\n")
---~ print(table.serialize(t,"name",true,true), "\n")
-
-table.serialize_functions = true
-table.serialize_compact = true
-table.serialize_inline = true
-
local noquotes, hexify, handle, reduce, compact, inline, functions
-local reserved = table.tohash { -- intercept a language flaw, no reserved words as key
+local reserved = table.tohash { -- intercept a language inconvenience: no reserved words as key
'and', 'break', 'do', 'else', 'elseif', 'end', 'false', 'for', 'function', 'if',
'in', 'local', 'nil', 'not', 'or', 'repeat', 'return', 'then', 'true', 'until', 'while',
}
@@ -318,20 +320,23 @@ local function simple_table(t)
n = n + 1
end
if n == #t then
- local tt = { }
+ local tt, nt = { }, 0
for i=1,#t do
local v = t[i]
local tv = type(v)
if tv == "number" then
+ nt = nt + 1
if hexify then
- tt[#tt+1] = format("0x%04X",v)
+ tt[nt] = format("0x%04X",v)
else
- tt[#tt+1] = tostring(v) -- tostring not needed
+ tt[nt] = tostring(v) -- tostring not needed
end
elseif tv == "boolean" then
- tt[#tt+1] = tostring(v)
+ nt = nt + 1
+ tt[nt] = tostring(v)
elseif tv == "string" then
- tt[#tt+1] = format("%q",v)
+ nt = nt + 1
+ tt[nt] = format("%q",v)
else
tt = nil
break
@@ -357,21 +362,25 @@ local function do_serialize(root,name,depth,level,indexed)
depth = depth .. " "
if indexed then
handle(format("%s{",depth))
- elseif name then
- --~ handle(format("%s%s={",depth,key(name)))
- if type(name) == "number" then -- or find(k,"^%d+$") then
+ else
+ local tn = type(name)
+ if tn == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s[0x%04X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
- elseif noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
- handle(format("%s%s={",depth,name))
+ elseif tn == "string" then
+ if noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
+ handle(format("%s%s={",depth,name))
+ else
+ handle(format("%s[%q]={",depth,name))
+ end
+ elseif tn == "boolean" then
+ handle(format("%s[%s]={",depth,tostring(name)))
else
- handle(format("%s[%q]={",depth,name))
+ handle(format("%s{",depth))
end
- else
- handle(format("%s{",depth))
end
end
-- we could check for k (index) being number (cardinal)
@@ -391,8 +400,8 @@ local function do_serialize(root,name,depth,level,indexed)
--~ if v == root then
-- circular
--~ else
- local t = type(v)
- if compact and first and type(k) == "number" and k >= first and k <= last then
+ local t, tk = type(v), type(k)
+ if compact and first and tk == "number" and k >= first and k <= last then
if t == "number" then
if hexify then
handle(format("%s 0x%04X,",depth,v))
@@ -434,17 +443,18 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s __p__=nil,",depth))
end
elseif t == "number" then
- --~ if hexify then
- --~ handle(format("%s %s=0x%04X,",depth,key(k),v))
- --~ else
- --~ handle(format("%s %s=%s,",depth,key(k),v)) -- %.99g
- --~ end
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=0x%04X,",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,tostring(k),v))
+ else
+ handle(format("%s [%s]=%s,",depth,tostring(k),v)) -- %.99g
+ end
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
if hexify then
handle(format("%s %s=0x%04X,",depth,k,v))
@@ -460,26 +470,28 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "string" then
if reduce and tonumber(v) then
- --~ handle(format("%s %s=%s,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=%s,",depth,tostring(k),v))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%s,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
else
- --~ handle(format("%s %s=%q,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=%q,",depth,tostring(k),v))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%q,",depth,k,v))
else
@@ -488,13 +500,14 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "table" then
if not next(v) then
- --~ handle(format("%s %s={},",depth,key(k)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]={},",depth,tostring(k)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s={},",depth,k))
else
@@ -503,13 +516,14 @@ local function do_serialize(root,name,depth,level,indexed)
elseif inline then
local st = simple_table(v)
if st then
- --~ handle(format("%s %s={ %s },",depth,key(k),concat(st,", ")))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]={ %s },",depth,tostring(k),concat(st,", ")))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s={ %s },",depth,k,concat(st,", ")))
else
@@ -522,13 +536,14 @@ local function do_serialize(root,name,depth,level,indexed)
do_serialize(v,k,depth,level+1)
end
elseif t == "boolean" then
- --~ handle(format("%s %s=%s,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%s,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%s,",depth,k,tostring(v)))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]=%s,",depth,tostring(k),tostring(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%s,",depth,k,tostring(v)))
else
@@ -536,27 +551,30 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "function" then
if functions then
- --~ handle(format('%s %s=loadstring(%q),',depth,key(k),dump(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v)))
else
handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v)))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=loadstring(%q),",depth,tostring(k),dump(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=loadstring(%q),",depth,k,dump(v)))
else
- handle(format("%s [%q]=loadstring(%q),",depth,k,dump(v)))
+ -- handle(format("%s [%q]=loadstring(%q),",depth,k,dump(v)))
+ handle(format("%s [%q]=loadstring(%q),",depth,k,debug.getinfo(v).what == "C" and "C code" or dump(v)))
end
end
else
- --~ handle(format("%s %s=%q,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]=%q,",depth,tostring(k),tostring(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%q,",depth,k,tostring(v)))
else
@@ -574,15 +592,34 @@ end
-- replacing handle by a direct t[#t+1] = ... (plus test) is not much
-- faster (0.03 on 1.00 for zapfino.tma)
-local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
- noquotes = _noquotes
- hexify = _hexify
- handle = _handle or print
- reduce = _reduce or false
- compact = table.serialize_compact
- inline = compact and table.serialize_inline
- functions = table.serialize_functions
+local function serialize(_handle,root,name,specification) -- handle wins
local tname = type(name)
+ if type(specification) == "table" then
+ noquotes = specification.noquotes
+ hexify = specification.hexify
+ handle = _handle or specification.handle or print
+ reduce = specification.reduce or false
+ functions = specification.functions
+ compact = specification.compact
+ inline = specification.inline and compact
+ if functions == nil then
+ functions = true
+ end
+ if compact == nil then
+ compact = true
+ end
+ if inline == nil then
+ inline = compact
+ end
+ else
+ noquotes = false
+ hexify = false
+ handle = _handle or print
+ reduce = false
+ compact = true
+ inline = true
+ functions = true
+ end
if tname == "string" then
if name == "return" then
handle("return {")
@@ -604,8 +641,17 @@ local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
else
handle("t={")
end
- if root and next(root) then
- do_serialize(root,name,"",0,indexed)
+ if root then
+ -- The dummy access will initialize a table that has a delayed initialization
+ -- using a metatable. (maybe explicitly test for metatable)
+ if getmetatable(root) then -- todo: make this an option, maybe even per subtable
+ local dummy = root._w_h_a_t_e_v_e_r_
+ root._w_h_a_t_e_v_e_r_ = nil
+ end
+ -- Let's forget about empty tables.
+ if next(root) then
+ do_serialize(root,name,"",0)
+ end
end
handle("}")
end
@@ -619,18 +665,17 @@ end
--~ 'return' : return { }
--~ number : [number] = { }
-function table.serialize(root,name,reduce,noquotes,hexify)
- local t = { }
+function table.serialize(root,name,specification)
+ local t, n = { }, 0
local function flush(s)
- t[#t+1] = s
+ n = n + 1
+ t[n] = s
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
return concat(t,"\n")
end
-function table.tohandle(handle,root,name,reduce,noquotes,hexify)
- serialize(root,name,handle,reduce,noquotes,hexify)
-end
+table.tohandle = serialize
-- sometimes tables are real use (zapfino extra pro is some 85M) in which
-- case a stepwise serialization is nice; actually, we could consider:
@@ -641,73 +686,63 @@ end
--
-- so this is on the todo list
-table.tofile_maxtab = 2*1024
+local maxtab = 2*1024
-function table.tofile(filename,root,name,reduce,noquotes,hexify)
+function table.tofile(filename,root,name,specification)
local f = io.open(filename,'w')
if f then
- local maxtab = table.tofile_maxtab
if maxtab > 1 then
- local t = { }
+ local t, n = { }, 0
local function flush(s)
- t[#t+1] = s
- if #t > maxtab then
+ n = n + 1
+ t[n] = s
+ if n > maxtab then
f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
- t = { }
+ t, n = { }, 0 -- we could recycle t if needed
end
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
f:write(concat(t,"\n"),"\n")
else
local function flush(s)
f:write(s,"\n")
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
end
f:close()
+ io.flush()
end
end
-local function flatten(t,f,complete) -- is this used? meybe a variant with next, ...
- for i=1,#t do
- local v = t[i]
- if type(v) == "table" then
- if complete or type(v[1]) == "table" then
- flatten(v,f,complete)
+local function flattened(t,f,depth)
+ if f == nil then
+ f = { }
+ depth = 0xFFFF
+ elseif tonumber(f) then
+ -- assume then only two arguments are given
+ depth = f
+ f = { }
+ elseif not depth then
+ depth = 0xFFFF
+ end
+ for k, v in next, t do
+ if type(k) ~= "number" then
+ if depth > 0 and type(v) == "table" then
+ flattened(v,f,depth-1)
else
- f[#f+1] = v
+ f[k] = v
end
- else
- f[#f+1] = v
end
end
-end
-
-function table.flatten(t)
- local f = { }
- flatten(t,f,true)
- return f
-end
-
-function table.unnest(t) -- bad name
- local f = { }
- flatten(t,f,false)
- return f
-end
-
-table.flatten_one_level = table.unnest
-
--- a better one:
-
-local function flattened(t,f)
- if not f then
- f = { }
- end
- for k, v in next, t do
- if type(v) == "table" then
- flattened(v,f)
+ local n = #f
+ for k=1,#t do
+ local v = t[k]
+ if depth > 0 and type(v) == "table" then
+ flattened(v,f,depth-1)
+ n = #f
else
- f[k] = v
+ n = n + 1
+ f[n] = v
end
end
return f
@@ -715,49 +750,27 @@ end
table.flattened = flattened
--- the next three may disappear
-
-function table.remove_value(t,value) -- todo: n
- if value then
- for i=1,#t do
- if t[i] == value then
- remove(t,i)
- -- remove all, so no: return
- end
- end
+local function unnest(t,f) -- only used in mk, for old times sake
+ if not f then -- and only relevant for token lists
+ f = { }
end
-end
-
-function table.insert_before_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i,str)
- return
- end
+ for i=1,#t do
+ local v = t[i]
+ if type(v) == "table" then
+ if type(v[1]) == "table" then
+ unnest(v,f)
+ else
+ f[#f+1] = v
end
+ else
+ f[#f+1] = v
end
- insert(t,1,str)
- elseif value then
- insert(t,1,value)
end
+ return f
end
-function table.insert_after_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,str)
- return
- end
- end
- end
- t[#t+1] = str
- elseif value then
- t[#t+1] = value
- end
+function table.unnest(t) -- bad name
+ return unnest(t)
end
local function are_equal(a,b,n,m) -- indexed
@@ -784,7 +797,7 @@ end
local function identical(a,b) -- assumes same structure
for ka, va in next, a do
- local vb = b[k]
+ local vb = b[ka]
if va == vb then
-- same
elseif type(va) == "table" and type(vb) == "table" then
@@ -798,8 +811,8 @@ local function identical(a,b) -- assumes same structure
return true
end
-table.are_equal = are_equal
table.identical = identical
+table.are_equal = are_equal
-- maybe also make a combined one
@@ -825,86 +838,90 @@ function table.contains(t, v)
end
function table.count(t)
- local n, e = 0, next(t)
- while e do
- n, e = n + 1, next(t,e)
+ local n = 0
+ for k, v in next, t do
+ n = n + 1
end
return n
end
-function table.swapped(t)
- local s = { }
+function table.swapped(t,s) -- hash
+ local n = { }
+ if s then
+--~ for i=1,#s do
+--~ n[i] = s[i]
+--~ end
+ for k, v in next, s do
+ n[k] = v
+ end
+ end
+--~ for i=1,#t do
+--~ local ti = t[i] -- don't ask but t[i] can be nil
+--~ if ti then
+--~ n[ti] = i
+--~ end
+--~ end
for k, v in next, t do
- s[v] = k
+ n[v] = k
end
- return s
+ return n
end
---~ function table.are_equal(a,b)
---~ return table.serialize(a) == table.serialize(b)
---~ end
-
-function table.clone(t,p) -- t is optional or nil or table
- if not p then
- t, p = { }, t or { }
- elseif not t then
- t = { }
+function table.reversed(t)
+ if t then
+ local tt, tn = { }, #t
+ if tn > 0 then
+ local ttn = 0
+ for i=tn,1,-1 do
+ ttn = ttn + 1
+ tt[ttn] = t[i]
+ end
+ end
+ return tt
end
- setmetatable(t, { __index = function(_,key) return p[key] end }) -- why not __index = p ?
- return t
-end
-
-function table.hexed(t,seperator)
- local tt = { }
- for i=1,#t do tt[i] = format("0x%04X",t[i]) end
- return concat(tt,seperator or " ")
end
-function table.reverse_hash(h)
- local r = { }
- for k,v in next, h do
- r[v] = lower(gsub(k," ",""))
+function table.sequenced(t,sep,simple) -- hash only
+ local s, n = { }, 0
+ for k, v in sortedhash(t) do
+ if simple then
+ if v == true then
+ n = n + 1
+ s[n] = k
+ elseif v and v~= "" then
+ n = n + 1
+ s[n] = k .. "=" .. tostring(v)
+ end
+ else
+ n = n + 1
+ s[n] = k .. "=" .. tostring(v)
+ end
end
- return r
+ return concat(s, sep or " | ")
end
-function table.reverse(t)
- local tt = { }
- if #t > 0 then
- for i=#t,1,-1 do
- tt[#tt+1] = t[i]
- end
+function table.print(t,...)
+ if type(t) ~= "table" then
+ print(tostring(t))
+ else
+ table.tohandle(print,t,...)
end
- return tt
end
-function table.insert_before_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i,extra)
- return
- end
- end
- insert(t,1,extra)
+-- -- -- obsolete but we keep them for a while and might comment them later -- -- --
+
+-- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
+
+function table.sub(t,i,j)
+ return { unpack(t,i,j) }
end
-function table.insert_after_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,extra)
- return
- end
- end
- insert(t,#t+1,extra)
+-- 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)
end
+function table.has_one_entry(t)
+ return t and not next(t,next(t))
+end
diff --git a/Master/texmf-dist/tex/context/base/l-unicode.lua b/Master/texmf-dist/tex/context/base/l-unicode.lua
index 0c5a60142ae..2fa50282fe0 100644
--- a/Master/texmf-dist/tex/context/base/l-unicode.lua
+++ b/Master/texmf-dist/tex/context/base/l-unicode.lua
@@ -16,23 +16,47 @@ if not unicode then
if n < 0x80 then
return char(n)
elseif n < 0x800 then
- return char(0xC0 + floor(n/0x40)) .. char(0x80 + (n % 0x40))
+ return char(
+ 0xC0 + floor(n/0x40),
+ 0x80 + (n % 0x40)
+ )
elseif n < 0x10000 then
- return char(0xE0 + floor(n/0x1000)) .. char(0x80 + (floor(n/0x40) % 0x40)) .. char(0x80 + (n % 0x40))
+ return char(
+ 0xE0 + floor(n/0x1000),
+ 0x80 + (floor(n/0x40) % 0x40),
+ 0x80 + (n % 0x40)
+ )
elseif n < 0x40000 then
- return char(0xF0 + floor(n/0x40000)) .. char(0x80 + floor(n/0x1000)) .. char(0x80 + (floor(n/0x40) % 0x40)) .. char(0x80 + (n % 0x40))
- else -- wrong:
- -- return char(0xF1 + floor(n/0x1000000)) .. char(0x80 + floor(n/0x40000)) .. char(0x80 + floor(n/0x1000)) .. char(0x80 + (floor(n/0x40) % 0x40)) .. char(0x80 + (n % 0x40))
+ return char(
+ 0xF0 + floor(n/0x40000),
+ 0x80 + floor(n/0x1000),
+ 0x80 + (floor(n/0x40) % 0x40),
+ 0x80 + (n % 0x40)
+ )
+ else
+ -- return char(
+ -- 0xF1 + floor(n/0x1000000),
+ -- 0x80 + floor(n/0x40000),
+ -- 0x80 + floor(n/0x1000),
+ -- 0x80 + (floor(n/0x40) % 0x40),
+ -- 0x80 + (n % 0x40)
+ -- )
return "?"
end
end
end
+local unicode = unicode
+
utf = utf or unicode.utf8
-local concat, utfchar, utfgsub = table.concat, utf.char, utf.gsub
-local char, byte, find, bytepairs = string.char, string.byte, string.find, string.bytepairs
+local concat = table.concat
+local utfchar, utfbyte, utfgsub = utf.char, utf.byte, utf.gsub
+local char, byte, find, bytepairs, utfvalues, format = string.char, string.byte, string.find, string.bytepairs, string.utfvalues, string.format
+local type = type
+
+local utfsplitlines = string.utfsplitlines
-- 0 EF BB BF UTF-8
-- 1 FF FE UTF-16-little-endian
@@ -78,98 +102,236 @@ function unicode.utftype(f)
end
end
-function unicode.utf16_to_utf8(str, endian) -- maybe a gsub is faster or an lpeg
- local result, tmp, n, m, p = { }, { }, 0, 0, 0
- -- lf | cr | crlf / (cr:13, lf:10)
- local function doit()
- if n == 10 then
- if p ~= 13 then
- result[#result+1] = concat(tmp)
- tmp = { }
- p = 0
+--~ function unicode.utf16_to_utf8(str, endian) -- maybe a gsub is faster or an lpeg
+--~ local result, tmp, n, m, p, r, t = { }, { }, 0, 0, 0, 0, 0 -- we reuse tmp
+--~ -- lf | cr | crlf / (cr:13, lf:10)
+--~ local function doit() -- inline this
+--~ if n == 10 then
+--~ if p ~= 13 then
+--~ if t > 0 then
+--~ r = r + 1
+--~ result[r] = concat(tmp,"",1,t)
+--~ t = 0
+--~ end
+--~ p = 0
+--~ end
+--~ elseif n == 13 then
+--~ if t > 0 then
+--~ r = r + 1
+--~ result[r] = concat(tmp,"",1,t)
+--~ t = 0
+--~ end
+--~ p = n
+--~ else
+--~ t = t + 1
+--~ tmp[t] = utfchar(n)
+--~ p = 0
+--~ end
+--~ end
+--~ for l,r in bytepairs(str) do
+--~ if r then
+--~ if endian then -- maybe make two loops
+--~ n = 256*l + r
+--~ else
+--~ n = 256*r + l
+--~ end
+--~ if m > 0 then
+--~ n = (m-0xD800)*0x400 + (n-0xDC00) + 0x10000
+--~ m = 0
+--~ doit()
+--~ elseif n >= 0xD800 and n <= 0xDBFF then
+--~ m = n
+--~ else
+--~ doit()
+--~ end
+--~ end
+--~ end
+--~ if t > 0 then
+--~ r = r + 1
+--~ result[r] = concat(tmp,"",1,t) -- we reused tmp, hence t
+--~ end
+--~ return result
+--~ end
+
+--~ function unicode.utf32_to_utf8(str, endian)
+--~ local result, tmp, n, m, p, r, t = { }, { }, 0, -1, 0, 0, 0
+--~ -- lf | cr | crlf / (cr:13, lf:10)
+--~ local function doit() -- inline this
+--~ if n == 10 then
+--~ if p ~= 13 then
+--~ if t > 0 then
+--~ r = r + 1
+--~ result[r] = concat(tmp,"",1,t)
+--~ t = 0
+--~ end
+--~ p = 0
+--~ end
+--~ elseif n == 13 then
+--~ if t > 0 then
+--~ r = r + 1
+--~ result[r] = concat(tmp,"",1,t)
+--~ t = 0
+--~ end
+--~ p = n
+--~ else
+--~ t = t + 1
+--~ tmp[t] = utfchar(n)
+--~ p = 0
+--~ end
+--~ end
+--~ for a,b in bytepairs(str) do
+--~ if a and b then
+--~ if m < 0 then
+--~ if endian then -- maybe make two loops
+--~ m = 256*256*256*a + 256*256*b
+--~ else
+--~ m = 256*b + a
+--~ end
+--~ else
+--~ if endian then -- maybe make two loops
+--~ n = m + 256*a + b
+--~ else
+--~ n = m + 256*256*256*b + 256*256*a
+--~ end
+--~ m = -1
+--~ doit()
+--~ end
+--~ else
+--~ break
+--~ end
+--~ end
+--~ if #tmp > 0 then
+--~ r = r + 1
+--~ result[r] = concat(tmp,"",1,t) -- we reused tmp, hence t
+--~ end
+--~ return result
+--~ end
+
+local function utf16_to_utf8_be(t)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ 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
+ 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
- elseif n == 13 then
- result[#result+1] = concat(tmp)
- tmp = { }
- p = n
- else
- tmp[#tmp+1] = utfchar(n)
- p = 0
end
+ t[i] = concat(result,"",1,r) -- we reused tmp, hence t
end
- for l,r in bytepairs(str) do
- if r then
- if endian then
- n = l*256 + r
- else
- n = r*256 + l
+ return t
+end
+
+local function utf16_to_utf8_le(t)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ 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
+ 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
- if m > 0 then
- n = (m-0xD800)*0x400 + (n-0xDC00) + 0x10000
- m = 0
- doit()
- elseif n >= 0xD800 and n <= 0xDBFF then
- m = n
+ end
+ t[i] = concat(result,"",1,r) -- we reused tmp, hence t
+ end
+ return t
+end
+
+local function utf32_to_utf8_be(str)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
+ end
+ local result = { } -- we reuse result
+ for i=1,#t do
+ local r, more = 0, -1
+ for a,b in bytepairs(str) 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
- doit()
+ break
end
end
- end
- if #tmp > 0 then
- result[#result+1] = concat(tmp)
+ t[i] = concat(result,"",1,r)
end
return result
end
-function unicode.utf32_to_utf8(str, endian)
- local result = { }
- local tmp, n, m, p = { }, 0, -1, 0
- -- lf | cr | crlf / (cr:13, lf:10)
- local function doit()
- if n == 10 then
- if p ~= 13 then
- result[#result+1] = concat(tmp)
- tmp = { }
- p = 0
- end
- elseif n == 13 then
- result[#result+1] = concat(tmp)
- tmp = { }
- p = n
- else
- tmp[#tmp+1] = utfchar(n)
- p = 0
- end
+local function utf32_to_utf8_le(str)
+ if type(t) == "string" then
+ t = utfsplitlines(str)
end
- for a,b in bytepairs(str) do
- if a and b then
- if m < 0 then
- if endian then
- m = a*256*256*256 + b*256*256
+ local result = { } -- we reuse result
+ for i=1,#t do
+ local r, more = 0, -1
+ for a,b in bytepairs(str) do
+ if a and b then
+ if more < 0 then
+ more = 256*b + a
else
- m = b*256 + a
+ r = r + 1
+ result[t] = utfchar(more + 256*256*256*b + 256*256*a)
+ more = -1
end
else
- if endian then
- n = m + a*256 + b
- else
- n = m + b*256*256*256 + a*256*256
- end
- m = -1
- doit()
+ break
end
- else
- break
end
- end
- if #tmp > 0 then
- result[#result+1] = concat(tmp)
+ t[i] = concat(result,"",1,r)
end
return result
end
+unicode.utf32_to_utf8_be = utf32_to_utf8_be
+unicode.utf32_to_utf8_le = utf32_to_utf8_le
+unicode.utf16_to_utf8_be = utf16_to_utf8_be
+unicode.utf16_to_utf8_le = utf16_to_utf8_le
+
+function unicode.utf8_to_utf8(t)
+ return type(t) == "string" and utfsplitlines(t) or t
+end
+
+function unicode.utf16_to_utf8(t,endian)
+ return endian and utf16_to_utf8_be(t) or utf16_to_utf8_le(t) or t
+end
+
+function unicode.utf32_to_utf8(t,endian)
+ return endian and utf32_to_utf8_be(t) or utf32_to_utf8_le(t) or t
+end
+
local function little(c)
- local b = byte(c) -- b = c:byte()
+ local b = byte(c)
if b < 0x10000 then
return char(b%256,b/256)
else
@@ -197,3 +359,52 @@ function unicode.utf8_to_utf16(str,littleendian)
return char(254,255) .. utfgsub(str,".",big)
end
end
+
+function unicode.utfcodes(str)
+ local t, n = { }, 0
+ for u in utfvalues(str) do
+ n = n + 1
+ t[n] = format("0x%04X",u)
+ end
+ return concat(t,separator or " ")
+end
+
+function unicode.ustring(s)
+ return format("U+%05X",type(s) == "number" and s or utfbyte(s))
+end
+
+function unicode.xstring(s)
+ return format("0x%05X",type(s) == "number" and s or utfbyte(s))
+end
+
+--~ print(unicode.utfcodes(str))
+
+local lpegmatch = lpeg.match
+local utftype = lpeg.patterns.utftype
+
+function unicode.filetype(data)
+ return data and lpegmatch(utftype,data) or "unknown"
+end
+
+--~ local utfchr = { } -- 60K -> 2.638 M extra mem but currently not called that often (on latin)
+--~
+--~ setmetatable(utfchr, { __index = function(t,k) local v = utfchar(k) t[k] = v return v end } )
+--~
+--~ collectgarbage("collect")
+--~ local u = collectgarbage("count")*1024
+--~ local t = os.clock()
+--~ for i=1,1000 do
+--~ for i=1,600 do
+--~ local a = utfchr[i]
+--~ end
+--~ end
+--~ print(os.clock()-t,collectgarbage("count")*1024-u)
+
+--~ collectgarbage("collect")
+--~ local t = os.clock()
+--~ for i=1,1000 do
+--~ for i=1,600 do
+--~ local a = utfchar(i)
+--~ end
+--~ end
+--~ print(os.clock()-t,collectgarbage("count")*1024-u)
diff --git a/Master/texmf-dist/tex/context/base/l-url.lua b/Master/texmf-dist/tex/context/base/l-url.lua
index e3e6f81302c..d75135a2abe 100644
--- a/Master/texmf-dist/tex/context/base/l-url.lua
+++ b/Master/texmf-dist/tex/context/base/l-url.lua
@@ -6,86 +6,179 @@ if not modules then modules = { } end modules ['l-url'] = {
license = "see context related readme files"
}
-local char, gmatch, gsub = string.char, string.gmatch, string.gsub
+local char, gmatch, gsub, format, byte, find = string.char, string.gmatch, string.gsub, string.format, string.byte, string.find
+local concat = table.concat
local tonumber, type = tonumber, type
-local lpegmatch = lpeg.match
+local P, C, R, S, Cs, Cc, Ct = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cs, lpeg.Cc, lpeg.Ct
+local lpegmatch, lpegpatterns, replacer = lpeg.match, lpeg.patterns, lpeg.replacer
--- from the spec (on the web):
+-- from wikipedia:
--
--- foo://example.com:8042/over/there?name=ferret#nose
--- \_/ \______________/\_________/ \_________/ \__/
--- | | | | |
--- scheme authority path query fragment
--- | _____________________|__
--- / \ / \
--- urn:example:animal:ferret:nose
-
-url = url or { }
-
-local function tochar(s)
- return char(tonumber(s,16))
-end
+-- foo://username:password@example.com:8042/over/there/index.dtb?type=animal;name=narwhal#nose
+-- \_/ \_______________/ \_________/ \__/ \___/ \_/ \______________________/ \__/
+-- | | | | | | | |
+-- | userinfo hostname port | | query fragment
+-- | \________________________________/\_____________|____|/
+-- scheme | | | |
+-- | authority path | |
+-- | | |
+-- | path interpretable as filename
+-- | ___________|____________ |
+-- / \ / \ |
+-- urn:example:animal:ferret:nose interpretable as extension
+
+url = url or { }
+local url = url
+
+local tochar = function(s) return char(tonumber(s,16)) end
+
+local colon = P(":")
+local qmark = P("?")
+local hash = P("#")
+local slash = P("/")
+local percent = P("%")
+local endofstring = P(-1)
+
+local hexdigit = R("09","AF","af")
+local plus = P("+")
+local nothing = Cc("")
+local escaped = (plus / " ") + (percent * C(hexdigit * hexdigit) / tochar)
+
+-- we assume schemes with more than 1 character (in order to avoid problems with windows disks)
-local colon, qmark, hash, slash, percent, endofstring = lpeg.P(":"), lpeg.P("?"), lpeg.P("#"), lpeg.P("/"), lpeg.P("%"), lpeg.P(-1)
+local scheme = Cs((escaped+(1-colon-slash-qmark-hash))^2) * colon + nothing
+local authority = slash * slash * Cs((escaped+(1- slash-qmark-hash))^0) + nothing
+local path = slash * Cs((escaped+(1- qmark-hash))^0) + nothing
+local query = qmark * Cs((escaped+(1- hash))^0) + nothing
+local fragment = hash * Cs((escaped+(1- endofstring))^0) + nothing
-local hexdigit = lpeg.R("09","AF","af")
-local plus = lpeg.P("+")
-local escaped = (plus / " ") + (percent * lpeg.C(hexdigit * hexdigit) / tochar)
+local validurl = scheme * authority * path * query * fragment
+local parser = Ct(validurl)
--- we assume schemes with more than 1 character (in order to avoid problems with windows disks)
+lpegpatterns.url = validurl
+lpegpatterns.urlsplitter = parser
-local scheme = lpeg.Cs((escaped+(1-colon-slash-qmark-hash))^2) * colon + lpeg.Cc("")
-local authority = slash * slash * lpeg.Cs((escaped+(1- slash-qmark-hash))^0) + lpeg.Cc("")
-local path = slash * lpeg.Cs((escaped+(1- qmark-hash))^0) + lpeg.Cc("")
-local query = qmark * lpeg.Cs((escaped+(1- hash))^0) + lpeg.Cc("")
-local fragment = hash * lpeg.Cs((escaped+(1- endofstring))^0) + lpeg.Cc("")
+local escapes = { } ; for i=0,255 do escapes[i] = format("%%%02X",i) end
-local parser = lpeg.Ct(scheme * authority * path * query * fragment)
+local escaper = Cs((R("09","AZ","az") + S("-./_") + P(1) / escapes)^0)
+
+lpegpatterns.urlescaper = escaper
-- todo: reconsider Ct as we can as well have five return values (saves a table)
-- so we can have two parsers, one with and one without
-function url.split(str)
+local function split(str)
return (type(str) == "string" and lpegmatch(parser,str)) or str
end
+local function hasscheme(str)
+ local scheme = lpegmatch(scheme,str) -- at least one character
+ return scheme and scheme ~= ""
+end
+
-- todo: cache them
-function url.hashed(str)
- local s = url.split(str)
+local rootletter = R("az","AZ")
+ + S("_-+")
+local separator = P("://")
+local qualified = P(".")^0 * P("/")
+ + rootletter * P(":")
+ + rootletter^1 * separator
+ + rootletter^1 * P("/")
+local rootbased = P("/")
+ + rootletter * P(":")
+
+local barswapper = replacer("|",":")
+local backslashswapper = replacer("\\","/")
+
+local function hashed(str) -- not yet ok (/test?test)
+ local s = split(str)
local somescheme = s[1] ~= ""
- return {
- scheme = (somescheme and s[1]) or "file",
- authority = s[2],
- path = s[3],
- query = s[4],
- fragment = s[5],
- original = str,
- noscheme = not somescheme,
- }
+ local somequery = s[4] ~= ""
+ if not somescheme and not somequery then
+ s = {
+ scheme = "file",
+ authority = "",
+ path = str,
+ query = "",
+ fragment = "",
+ original = str,
+ 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
+ else
+ filename = authority .. "/" .. path
+ end
+ s = {
+ scheme = s[1],
+ authority = authority,
+ path = path,
+ query = s[4],
+ fragment = s[5],
+ original = str,
+ noscheme = false,
+ filename = filename,
+ }
+ end
+ return s
end
-function url.hasscheme(str)
- return url.split(str)[1] ~= ""
-end
+-- Here we assume:
+--
+-- files: /// = relative
+-- files: //// = absolute (!)
+
+--~ table.print(hashed("file://c:/opt/tex/texmf-local")) -- c:/opt/tex/texmf-local
+--~ table.print(hashed("file://opt/tex/texmf-local" )) -- opt/tex/texmf-local
+--~ table.print(hashed("file:///opt/tex/texmf-local" )) -- opt/tex/texmf-local
+--~ table.print(hashed("file:////opt/tex/texmf-local" )) -- /opt/tex/texmf-local
+--~ table.print(hashed("file:///./opt/tex/texmf-local" )) -- ./opt/tex/texmf-local
+
+--~ table.print(hashed("c:/opt/tex/texmf-local" )) -- c:/opt/tex/texmf-local
+--~ table.print(hashed("opt/tex/texmf-local" )) -- opt/tex/texmf-local
+--~ table.print(hashed("/opt/tex/texmf-local" )) -- /opt/tex/texmf-local
+
+url.split = split
+url.hasscheme = hasscheme
+url.hashed = hashed
-function url.addscheme(str,scheme)
- return (url.hasscheme(str) and str) or ((scheme or "file:///") .. str)
+function url.addscheme(str,scheme) -- no authority
+ if hasscheme(str) then
+ return str
+ elseif not scheme then
+ return "file:///" .. str
+ else
+ return scheme .. ":///" .. str
+ end
end
-function url.construct(hash)
- local fullurl = hash.sheme .. "://".. hash.authority .. hash.path
- if hash.query then
- fullurl = fullurl .. "?".. hash.query
+function url.construct(hash) -- dodo: we need to escape !
+ local fullurl, f = { }, 0
+ local scheme, authority, path, query, fragment = hash.scheme, hash.authority, hash.path, hash.query, hash.fragment
+ if scheme and scheme ~= "" then
+ f = f + 1 ; fullurl[f] = scheme .. "://"
+ end
+ if authority and authority ~= "" then
+ f = f + 1 ; fullurl[f] = authority
end
- if hash.fragment then
- fullurl = fullurl .. "?".. hash.fragment
+ if path and path ~= "" then
+ f = f + 1 ; fullurl[f] = "/" .. path
end
- return fullurl
+ if query and query ~= "" then
+ f = f + 1 ; fullurl[f] = "?".. query
+ end
+ if fragment and fragment ~= "" then
+ f = f + 1 ; fullurl[f] = "#".. fragment
+ end
+ return lpegmatch(escaper,concat(fullurl))
end
function url.filename(filename)
- local t = url.hashed(filename)
+ local t = hashed(filename)
return (t.scheme == "file" and (gsub(t.path,"^/([a-zA-Z])([:|])/)","%1:"))) or filename
end
@@ -108,12 +201,27 @@ end
--~ print(url.filename("/oeps.txt"))
--~ from the spec on the web (sort of):
---~
---~ function test(str)
---~ print(table.serialize(url.hashed(str)))
+
+--~ local function test(str)
+--~ local t = url.hashed(str)
+--~ t.constructed = url.construct(t)
+--~ print(table.serialize(t))
--~ end
---~
---~ test("%56pass%20words")
+
+--~ test("sys:///./colo-rgb")
+
+--~ test("/data/site/output/q2p-develop/resources/ecaboperception4_res/topicresources/58313733/figuur-cow.jpg")
+--~ test("file:///M:/q2p/develop/output/q2p-develop/resources/ecaboperception4_res/topicresources/58313733")
+--~ test("M:/q2p/develop/output/q2p-develop/resources/ecaboperception4_res/topicresources/58313733")
+--~ test("file:///q2p/develop/output/q2p-develop/resources/ecaboperception4_res/topicresources/58313733")
+--~ test("/q2p/develop/output/q2p-develop/resources/ecaboperception4_res/topicresources/58313733")
+
+--~ test("file:///cow%20with%20spaces")
+--~ test("file:///cow%20with%20spaces.pdf")
+--~ test("cow%20with%20spaces.pdf")
+--~ test("some%20file")
+--~ test("/etc/passwords")
+--~ test("http://www.myself.com/some%20words.html")
--~ test("file:///c:/oeps.txt")
--~ test("file:///c|/oeps.txt")
--~ test("file:///etc/oeps.txt")
@@ -127,8 +235,9 @@ end
--~ test("tel:+1-816-555-1212")
--~ test("telnet://192.0.2.16:80/")
--~ test("urn:oasis:names:specification:docbook:dtd:xml:4.1.2")
---~ test("/etc/passwords")
--~ test("http://www.pragma-ade.com/spaced%20name")
--~ test("zip:///oeps/oeps.zip#bla/bla.tex")
--~ test("zip:///oeps/oeps.zip?bla/bla.tex")
+
+--~ table.print(url.hashed("/test?test"))
diff --git a/Master/texmf-dist/tex/context/base/l-utils.lua b/Master/texmf-dist/tex/context/base/l-utils.lua
index ebc27b8cfcd..30df04694c5 100644
--- a/Master/texmf-dist/tex/context/base/l-utils.lua
+++ b/Master/texmf-dist/tex/context/base/l-utils.lua
@@ -1,176 +1,12 @@
if not modules then modules = { } end modules ['l-utils'] = {
version = 1.001,
- comment = "companion to luat-lib.mkiv",
+ comment = "this module is replaced by the util-* ones",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
--- hm, quite unreadable
-
-local gsub = string.gsub
-local concat = table.concat
-local type, next = type, next
-
-if not utils then utils = { } end
-if not utils.merger then utils.merger = { } end
-if not utils.lua then utils.lua = { } end
-
-utils.merger.m_begin = "begin library merge"
-utils.merger.m_end = "end library merge"
-utils.merger.pattern =
- "%c+" ..
- "%-%-%s+" .. utils.merger.m_begin ..
- "%c+(.-)%c+" ..
- "%-%-%s+" .. utils.merger.m_end ..
- "%c+"
-
-function utils.merger._self_fake_()
- return
- "-- " .. "created merged file" .. "\n\n" ..
- "-- " .. utils.merger.m_begin .. "\n\n" ..
- "-- " .. utils.merger.m_end .. "\n\n"
-end
-
-function utils.report(...)
- print(...)
-end
-
-utils.merger.strip_comment = true
-
-function utils.merger._self_load_(name)
- local f, data = io.open(name), ""
- if f then
- utils.report("reading merge from %s",name)
- data = f:read("*all")
- f:close()
- else
- utils.report("unknown file to merge %s",name)
- end
- if data and utils.merger.strip_comment then
- -- saves some 20K
- data = gsub(data,"%-%-~[^\n\r]*[\r\n]", "")
- end
- return data or ""
-end
-
-function utils.merger._self_save_(name, data)
- if data ~= "" then
- local f = io.open(name,'w')
- if f then
- utils.report("saving merge from %s",name)
- f:write(data)
- f:close()
- end
- end
-end
-
-function utils.merger._self_swap_(data,code)
- if data ~= "" then
- return (gsub(data,utils.merger.pattern, function(s)
- return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n"
- end, 1))
- else
- return ""
- end
-end
-
---~ stripper:
---~
---~ data = gsub(data,"%-%-~[^\n]*\n","")
---~ data = gsub(data,"\n\n+","\n")
-
-function utils.merger._self_libs_(libs,list)
- local result, f, frozen = { }, nil, false
- result[#result+1] = "\n"
- if type(libs) == 'string' then libs = { libs } end
- if type(list) == 'string' then list = { list } end
- local foundpath = nil
- for i=1,#libs do
- local lib = libs[i]
- for j=1,#list do
- local pth = gsub(list[j],"\\","/") -- file.clean_path
- utils.report("checking library path %s",pth)
- local name = pth .. "/" .. lib
- if lfs.isfile(name) then
- foundpath = pth
- end
- end
- if foundpath then break end
- end
- if foundpath then
- utils.report("using library path %s",foundpath)
- local right, wrong = { }, { }
- for i=1,#libs do
- local lib = libs[i]
- local fullname = foundpath .. "/" .. lib
- if lfs.isfile(fullname) then
- -- right[#right+1] = lib
- utils.report("merging library %s",fullname)
- result[#result+1] = "do -- create closure to overcome 200 locals limit"
- result[#result+1] = io.loaddata(fullname,true)
- result[#result+1] = "end -- of closure"
- else
- -- wrong[#wrong+1] = lib
- utils.report("no library %s",fullname)
- end
- end
- if #right > 0 then
- utils.report("merged libraries: %s",concat(right," "))
- end
- if #wrong > 0 then
- utils.report("skipped libraries: %s",concat(wrong," "))
- end
- else
- utils.report("no valid library path found")
- end
- return concat(result, "\n\n")
-end
-
-function utils.merger.selfcreate(libs,list,target)
- if target then
- utils.merger._self_save_(
- target,
- utils.merger._self_swap_(
- utils.merger._self_fake_(),
- utils.merger._self_libs_(libs,list)
- )
- )
- end
-end
-
-function utils.merger.selfmerge(name,libs,list,target)
- utils.merger._self_save_(
- target or name,
- utils.merger._self_swap_(
- utils.merger._self_load_(name),
- utils.merger._self_libs_(libs,list)
- )
- )
-end
-
-function utils.merger.selfclean(name)
- utils.merger._self_save_(
- name,
- utils.merger._self_swap_(
- utils.merger._self_load_(name),
- ""
- )
- )
-end
-
-function utils.lua.compile(luafile, lucfile, cleanup, strip) -- defaults: cleanup=false strip=true
- -- utils.report("compiling",luafile,"into",lucfile)
- os.remove(lucfile)
- local command = "-o " .. string.quote(lucfile) .. " " .. string.quote(luafile)
- if strip ~= false then
- command = "-s " .. command
- end
- local done = (os.spawn("texluac " .. command) == 0) or (os.spawn("luac " .. command) == 0)
- if done and cleanup == true and lfs.isfile(lucfile) and lfs.isfile(luafile) then
- -- utils.report("removing",luafile)
- os.remove(luafile)
- end
- return done
-end
+utils = utils or { }
+require("util-mrg") for k, v in next, utilities.merger do utils[k] = v end
+require("util-lua") for k, v in next, utilities.lua do utils[k] = v end
diff --git a/Master/texmf-dist/tex/context/base/lang-alt.tex b/Master/texmf-dist/tex/context/base/lang-alt.mkii
index f65acbda3ba..f65acbda3ba 100644
--- a/Master/texmf-dist/tex/context/base/lang-alt.tex
+++ b/Master/texmf-dist/tex/context/base/lang-alt.mkii
diff --git a/Master/texmf-dist/tex/context/base/lang-ana.tex b/Master/texmf-dist/tex/context/base/lang-ana.mkii
index c108655c474..c108655c474 100644
--- a/Master/texmf-dist/tex/context/base/lang-ana.tex
+++ b/Master/texmf-dist/tex/context/base/lang-ana.mkii
diff --git a/Master/texmf-dist/tex/context/base/lang-ara.mkiv b/Master/texmf-dist/tex/context/base/lang-ara.mkiv
deleted file mode 100644
index 3c4d3c52284..00000000000
--- a/Master/texmf-dist/tex/context/base/lang-ara.mkiv
+++ /dev/null
@@ -1,150 +0,0 @@
-%D \module
-%D [ file=lang-ara,
-%D version=2008.06.20,
-%D title=\CONTEXT\ Language Macros,
-%D subtitle=Arabic Languages,
-%D author=Khaled Hosny,
-%D date=\currentdate,
-%D copyright=PRAGMA-ADE]
-%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 Language Macros / Arabic Languages}
-
-\unprotect
-
-\definesystemconstant {arabic}
-\definesystemvariable {ar}
-
-\installlanguage
- [\s!ar]
- [\c!spacing=\v!broad,
- \c!leftsentence=---,
- \c!rightsentence=---,
- \c!leftsubsentence=---,
- \c!rightsubsentence=---,
- \c!leftquote=\upperleftsinglesixquote,
- \c!rightquote=\upperrightsingleninequote,
- \c!leftquotation=\upperleftdoublesixquote,
- \c!rightquotation=\upperrightdoubleninequote,
- \c!date={\v!day,\ ,\v!month,{،\ },\v!year}]
-
-\installlanguage [\s!arabic] [\s!ar]
-
-% Just aliases to "ar" for now
-
-\installlanguage[\s!ar-ae][\c!default=\s!ar] % U.A.E.
-\installlanguage[\s!ar-bh][\c!default=\s!ar] % Bahrain
-\installlanguage[\s!ar-eg][\c!default=\s!ar] % Egypt
-\installlanguage[\s!ar-in][\c!default=\s!ar] % India?
-\installlanguage[\s!ar-kw][\c!default=\s!ar] % Kuwait
-\installlanguage[\s!ar-ly][\c!default=\s!ar] % Libya
-\installlanguage[\s!ar-om][\c!default=\s!ar] % Oman
-\installlanguage[\s!ar-qa][\c!default=\s!ar] % Qatar
-\installlanguage[\s!ar-sa][\c!default=\s!ar] % Saudi Arabia
-\installlanguage[\s!ar-sd][\c!default=\s!ar] % Sudan
-\installlanguage[\s!ar-tn][\c!default=\s!ar] % Tunisia
-\installlanguage[\s!ar-ye][\c!default=\s!ar] % Yemen
-
-% Syriac months
-
-\installlanguage[\s!ar-sy][\c!default=\s!ar] % Syria
-\installlanguage[\s!ar-iq][\c!default=\s!ar-sy] % Iraq
-\installlanguage[\s!ar-jo][\c!default=\s!ar-sy] % Jordan
-\installlanguage[\s!ar-lb][\c!default=\s!ar-sy] % Lebanon
-
-% Maghribi months
-
-\installlanguage[\s!ar-dz][\c!default=\s!ar] % Algeria
-\installlanguage[\s!ar-ma][\c!default=\s!ar] % Morocco
-
-\setupheadtext [\s!ar] [\v!content=المحتويات]
-\setupheadtext [\s!ar] [\v!tables=الجداول]
-\setupheadtext [\s!ar] [\v!figures=الأشكال]
-\setupheadtext [\s!ar] [\v!graphics=الرسوم]
-\setupheadtext [\s!ar] [\v!intermezzi=فسح]
-\setupheadtext [\s!ar] [\v!index=الفهرس]
-\setupheadtext [\s!ar] [\v!abbreviations=الاختصارات]
-\setupheadtext [\s!ar] [\v!logos=الشعارات]
-\setupheadtext [\s!ar] [\v!units=الوحدات]
-\setuplabeltext [\s!ar] [\v!table=جدول ]
-\setuplabeltext [\s!ar] [\v!figure=شكل ]
-\setuplabeltext [\s!ar] [\v!intermezzo=فسحة ]
-\setuplabeltext [\s!ar] [\v!graphic=رسم ]
-
-%D We don't set these here. One can do that in a style.
-
-\setuplabeltext [\s!ar] [\v!chapter=] % باب
-\setuplabeltext [\s!ar] [\v!section=] % فصل or قسم
-\setuplabeltext [\s!ar] [\v!subsection=] % فصل أدنى
-\setuplabeltext [\s!ar] [\v!subsubsection=] % فصل أ دنى أدنى
-\setuplabeltext [\s!ar] [\v!subsubsubsection=] % فصل أدنى أدنى أدنى
-\setuplabeltext [\s!ar] [\v!appendix=] % ملحق
-\setuplabeltext [\s!ar] [\v!part=جزء ]
-\setuplabeltext [\s!ar] [\v!line=سطر ]
-\setuplabeltext [\s!ar] [\v!lines=السطور ]
-
-\setuplabeltext [\s!ar] [\v!january=يناير]
-\setuplabeltext [\s!ar] [\v!february=فبراير]
-\setuplabeltext [\s!ar] [\v!march=مارس]
-\setuplabeltext [\s!ar] [\v!april=أبريل]
-\setuplabeltext [\s!ar] [\v!may=مايو]
-\setuplabeltext [\s!ar] [\v!june=يونيو]
-\setuplabeltext [\s!ar] [\v!july=يوليو]
-\setuplabeltext [\s!ar] [\v!august=أغسطس]
-\setuplabeltext [\s!ar] [\v!september=سبتمبر]
-\setuplabeltext [\s!ar] [\v!october=أكتوبر]
-\setuplabeltext [\s!ar] [\v!november=نوفمبر]
-\setuplabeltext [\s!ar] [\v!december=ديسمبر]
-
-\setuplabeltext [\s!ar-sy] [\v!january=كانون الثاني]
-\setuplabeltext [\s!ar-sy] [\v!february=شباط]
-\setuplabeltext [\s!ar-sy] [\v!march=آذار]
-\setuplabeltext [\s!ar-sy] [\v!april=نيسان]
-\setuplabeltext [\s!ar-sy] [\v!may=أيار]
-\setuplabeltext [\s!ar-sy] [\v!june=حزيران]
-\setuplabeltext [\s!ar-sy] [\v!july=تموز]
-\setuplabeltext [\s!ar-sy] [\v!august=آب]
-\setuplabeltext [\s!ar-sy] [\v!september=أيلول]
-\setuplabeltext [\s!ar-sy] [\v!october=تشرين الأول]
-\setuplabeltext [\s!ar-sy] [\v!november=تشرين الثاني]
-\setuplabeltext [\s!ar-sy] [\v!december=كانون الأول]
-
-\setuplabeltext [\s!ar-ma] [\v!may=ماي]
-\setuplabeltext [\s!ar-ma] [\v!july=يوليوز]
-\setuplabeltext [\s!ar-ma] [\v!august=غشت]
-\setuplabeltext [\s!ar-ma] [\v!september=شتنبر]
-\setuplabeltext [\s!ar-ma] [\v!november=نونبر]
-\setuplabeltext [\s!ar-ma] [\v!december=دجنبر]
-
-\setuplabeltext [\s!ar-dz] [\v!january=جانفي]
-\setuplabeltext [\s!ar-dz] [\v!february=فيفري]
-\setuplabeltext [\s!ar-dz] [\v!april=أفريل]
-\setuplabeltext [\s!ar-dz] [\v!may=ماي]
-\setuplabeltext [\s!ar-dz] [\v!june=جوان]
-\setuplabeltext [\s!ar-dz] [\v!july=جويلة]
-\setuplabeltext [\s!ar-dz] [\v!august=أوت]
-
-\setuplabeltext [\s!ar] [\v!sunday=الأحد]
-\setuplabeltext [\s!ar] [\v!monday=الاثنين]
-\setuplabeltext [\s!ar] [\v!tuesday=الثلاثاء]
-\setuplabeltext [\s!ar] [\v!wednesday=الأربعاء]
-\setuplabeltext [\s!ar] [\v!thursday=الخميس]
-\setuplabeltext [\s!ar] [\v!friday=الجمعة]
-\setuplabeltext [\s!ar] [\v!saturday=السبت]
-
-%D Rather new ...
-
-\setuplabeltext [\s!ar] [\v!page=صفحة ]
-\setuplabeltext [\s!ar] [\v!atpage=في صفحة ]
-\setuplabeltext [\s!ar] [\v!hencefore=كما وضحنا سابقا]
-\setuplabeltext [\s!ar] [\v!hereafter=كما نوضح لاحقا]
-\setuplabeltext [\s!ar] [\v!see=انظر ]
-
-%D ... and to be completed!
-
-%D \ShowAllLanguageValues [\s!ar] [arabic] {Arabic} {horn} % engelse humor
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/lang-art.tex b/Master/texmf-dist/tex/context/base/lang-art.mkii
index e8be91630a6..e8be91630a6 100644
--- a/Master/texmf-dist/tex/context/base/lang-art.tex
+++ b/Master/texmf-dist/tex/context/base/lang-art.mkii
diff --git a/Master/texmf-dist/tex/context/base/lang-bal.tex b/Master/texmf-dist/tex/context/base/lang-bal.mkii
index 394e9d93c1f..394e9d93c1f 100644
--- a/Master/texmf-dist/tex/context/base/lang-bal.tex
+++ b/Master/texmf-dist/tex/context/base/lang-bal.mkii
diff --git a/Master/texmf-dist/tex/context/base/lang-cel.tex b/Master/texmf-dist/tex/context/base/lang-cel.mkii
index 4d93957f102..4d93957f102 100644
--- a/Master/texmf-dist/tex/context/base/lang-cel.tex
+++ b/Master/texmf-dist/tex/context/base/lang-cel.mkii
diff --git a/Master/texmf-dist/tex/context/base/lang-cjk.mkiv b/Master/texmf-dist/tex/context/base/lang-cjk.mkiv
deleted file mode 100644
index 5f736d4a165..00000000000
--- a/Master/texmf-dist/tex/context/base/lang-cjk.mkiv
+++ /dev/null
@@ -1,328 +0,0 @@
-%D \module
-%D [ file=lang-chi,
-%D version=2009.03.02,
-%D title=\CONTEXT\ Language Macros,
-%D subtitle=Chinese,
-%D author={Hans Hagen \& Wang Lei},
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Derived from \MKII\ files.
-
-\writestatus{loading}{ConTeXt Language Macros / CJK}
-
-\definesystemconstant {chinese} \definesystemconstant {cn}
-\definesystemconstant {japanese} \definesystemconstant {ja}
-\definesystemconstant {korean} \definesystemconstant {kr}
-
-\unprotect
-
-% Chinese
-
-\installlanguage
- [\s!cn]
- [\c!leftsentence=——,
- \c!rightsentence=——,
- \c!leftsubsentence=——,
- \c!rightsubsentence=——,
- \c!leftquote=‘,
- \c!rightquote=’,
- \c!leftquotation=“,
- \c!rightquotation=”,
- \c!date={\v!year,年,\ ,\v!month,\v!day,日}]
-
-\setupheadtext [\s!cn] [\v!content=目录]
-\setupheadtext [\s!cn] [\v!tables=表格]
-\setupheadtext [\s!cn] [\v!figures=图形]
-\setupheadtext [\s!cn] [\v!graphics=图]
-\setupheadtext [\s!cn] [\v!intermezzi=퉣]
-\setupheadtext [\s!cn] [\v!index=索引]
-\setupheadtext [\s!cn] [\v!abbreviations=缩略语]
-\setupheadtext [\s!cn] [\v!logos=徽贬]
-\setupheadtext [\s!cn] [\v!units=计量单位]
-
-\setuplabeltext [\s!cn] [\v!table=表]
-\setuplabeltext [\s!cn] [\v!figure=图]
-\setuplabeltext [\s!cn] [\v!intermezzo=퉣]
-\setuplabeltext [\s!cn] [\v!graphic=插图]
-\setuplabeltext [\s!cn] [\v!appendix=附录]
-\setuplabeltext [\s!cn] [\v!part={第,部分}]
-\setuplabeltext [\s!cn] [\v!chapter={第,章}]
-\setuplabeltext [\s!cn] [\v!section={第,节}]
-\setuplabeltext [\s!cn] [\v!line=行]
-\setuplabeltext [\s!cn] [\v!lines=行]
-
-\setuplabeltext [\s!cn] [\v!subsection=]
-\setuplabeltext [\s!cn] [\v!subsubsection=]
-\setuplabeltext [\s!cn] [\v!subsubsubsection=]
-
-\setuplabeltext [\s!cn] [\v!january=一月]
-\setuplabeltext [\s!cn] [\v!february=二月]
-\setuplabeltext [\s!cn] [\v!march=三月]
-\setuplabeltext [\s!cn] [\v!april=四月]
-\setuplabeltext [\s!cn] [\v!may=五月]
-\setuplabeltext [\s!cn] [\v!june=六月]
-\setuplabeltext [\s!cn] [\v!july=七月]
-\setuplabeltext [\s!cn] [\v!august=八月]
-\setuplabeltext [\s!cn] [\v!september=九月]
-\setuplabeltext [\s!cn] [\v!october=十月]
-\setuplabeltext [\s!cn] [\v!november=十一月]
-\setuplabeltext [\s!cn] [\v!december=十二月]
-
-\setuplabeltext [\s!cn] [\v!sunday=星期日]
-\setuplabeltext [\s!cn] [\v!monday=星期一]
-\setuplabeltext [\s!cn] [\v!tuesday=星期二]
-\setuplabeltext [\s!cn] [\v!wednesday=星期三]
-\setuplabeltext [\s!cn] [\v!thursday=星期四]
-\setuplabeltext [\s!cn] [\v!friday=星期五]
-\setuplabeltext [\s!cn] [\v!saturday=星期六]
-
-%D Japanese
-
-\installlanguage
- [\s!ja]
- [\c!leftsentence=——,
- \c!rightsentence=——,
- \c!leftsubsentence=——,
- \c!rightsubsentence=——,
- \c!leftquote=‘,
- \c!rightquote=’,
- \c!leftquotation=「,
- \c!rightquotation=」,
- \c!date={西暦,\v!year,年,\v!month,月,\v!day,日}]
-
-\setupheadtext [\s!ja] [\v!content=目次]
-\setupheadtext [\s!ja] [\v!tables=机]
-\setupheadtext [\s!ja] [\v!figures=図]
-\setupheadtext [\s!ja] [\v!graphics=グラフ]
-\setupheadtext [\s!ja] [\v!intermezzi=間奏曲]
-\setupheadtext [\s!ja] [\v!index=目次]
-\setupheadtext [\s!ja] [\v!abbreviations=略語]
-\setupheadtext [\s!ja] [\v!logos=理性]
-\setupheadtext [\s!ja] [\v!units=ユニッツ]
-
-\setuplabeltext [\s!ja] [\v!table=表]
-\setuplabeltext [\s!ja] [\v!figure=図]
-\setuplabeltext [\s!ja] [\v!intermezzo=間奏曲]
-\setuplabeltext [\s!ja] [\v!graphic=イラスト]
-\setuplabeltext [\s!ja] [\v!appendix=付録]
-\setuplabeltext [\s!ja] [\v!part={第,パート}]
-\setuplabeltext [\s!ja] [\v!chapter={第,章}]
-\setuplabeltext [\s!ja] [\v!section={第,項}]
-\setuplabeltext [\s!ja] [\v!line=線]
-\setuplabeltext [\s!ja] [\v!lines=線]
-
-\setuplabeltext [\s!ja] [\v!subsection=]
-\setuplabeltext [\s!ja] [\v!subsubsection=]
-\setuplabeltext [\s!ja] [\v!subsubsubsection=]
-
-\setuplabeltext [\s!ja] [\v!january=1]
-\setuplabeltext [\s!ja] [\v!february=2]
-\setuplabeltext [\s!ja] [\v!march=3]
-\setuplabeltext [\s!ja] [\v!april=4]
-\setuplabeltext [\s!ja] [\v!may=5]
-\setuplabeltext [\s!ja] [\v!june=6]
-\setuplabeltext [\s!ja] [\v!july=7]
-\setuplabeltext [\s!ja] [\v!august=8]
-\setuplabeltext [\s!ja] [\v!september=9]
-\setuplabeltext [\s!ja] [\v!october=10]
-\setuplabeltext [\s!ja] [\v!november=11]
-\setuplabeltext [\s!ja] [\v!december=12]
-
-\setuplabeltext [\s!ja] [\v!monday=月曜日]
-\setuplabeltext [\s!ja] [\v!tuesday=火曜日]
-\setuplabeltext [\s!ja] [\v!wednesday=水曜日]
-\setuplabeltext [\s!ja] [\v!thursday=木曜日]
-\setuplabeltext [\s!ja] [\v!friday=金曜日]
-\setuplabeltext [\s!ja] [\v!saturday=土曜日]
-\setuplabeltext [\s!ja] [\v!sunday=日曜日]
-
-%D Korean
-
-% todo
-
-\protect \endinput
-
-cn={
- ["abbreviations"]="缩略语",
- ["appendix"]="附录",
- ["april"]="四月",
- ["august"]="八月",
- ["chapter"]="章",
- ["contents"]="目录",
- ["day"]="日",
- ["december"]="十二月",
- ["febrary"]="二月",
- ["figure"]="图",
- ["figures"]="图形",
- ["friday"]="星期五",
- ["graphics"]="图",
- ["illustration"]="插图",
- ["index"]="索引",
- ["intermezzo"]="퉣",
- ["intro"]="第",
- ["january"]="一月",
- ["july"]="七月",
- ["june"]="六月",
- ["leftsentence"]="——",
- ["leftsubsentence"]="——",
- ["line"]="行",
- ["logos"]="徽贬",
- ["march"]="三月",
- ["may"]="五月",
- ["monday"]="星期一",
- ["month"]="月",
- ["november"]="十一月",
- ["october"]="十月",
- ["part"]="部分",
- ["rightsentence"]="——",
- ["rightsubsentence"]="——",
- ["saturday"]="星期六",
- ["section"]="节",
- ["september"]="九月",
- ["sunday"]="星期日",
- ["table"]="表",
- ["tables"]="表格",
- ["thursday"]="星期四",
- ["tuesday"]="星期二",
- ["units"]="计量单位",
- ["upperleftdoublequote"]="“",
- ["upperleftdoublequote-v"]="『",
- ["upperleftsinglequote"]="‘",
- ["upperleftsinglequote-v"]="「",
- ["upperrightdoublequote"]="”",
- ["upperrightdoublequote-v"]="』",
- ["upperrightsinglequote"]="’",
- ["upperrightsinglequote-v"]="」",
- ["wednesday"]="星期三",
- ["year"]="年",
-}
-
-ja={
- ["abbreviations"]="略語",
- ["abstract"]="概要",
- ["and"]="、",
- ["answer"]="答:",
- ["appendix"]="付録",
- ["april"]="四月",
- ["article"]="項目",
- ["august"]="八月",
- ["bibliography"]="参考文献",
- ["book"]="ブック",
- ["bridgehead"]="項",
- ["bullet"]="●",
- ["by"]=":",
- ["caution"]="注意",
- ["chapter"]="章",
- ["christiandate"]="西暦",
- ["colophon"]="奥付",
- ["copyright"]="製作著作",
- ["day"]="日",
- ["december"]="十二月",
- ["dedication"]="謝辞",
- ["edited"]="編者",
- ["editedby"]="編者:",
- ["edition"]="編集",
- ["endquote"]="」",
- ["equation"]="式",
- ["example"]="例",
- ["february"]="二月",
- ["figure"]="図",
- ["figures"]="図",
- ["friday"]="土曜日",
- ["glossary"]="用語集",
- ["glosssee"]="参照",
- ["glossseealso"]="参照",
- ["graphics"]="グラフ",
- ["illustration"]="イラスト",
- ["important"]="重要項目",
- ["index"]="目次",
- ["indexsymbols"]="シンボル",
- ["intermezzo"]="間奏曲",
- ["intermezzos"]="間奏曲",
- ["intro"]="第",
- ["january"]="一月",
- ["july"]="七月",
- ["june"]="六月",
- ["leftsentence"]="——",
- ["leftsubsentence"]="——",
- ["line"]="線",
- ["lines"]="線",
- ["listofequations"]="式目次",
- ["listofexamples"]="例目次",
- ["listoffigures"]="図目次",
- ["listoftables"]="表目次",
- ["listofunknown"]="不明目次",
- ["logos"]="理性",
- ["march"]="三月",
- ["may"]="五月",
- ["monday"]="火曜日",
- ["month"]="月",
- ["msgaud"]="対象者",
- ["msglevel"]="レベル",
- ["msgorig"]="発信元",
- ["navhome"]="ホーム",
- ["navnext"]="次のページ",
- ["navnextsibling"]="早送り",
- ["navprev"]="前のページ",
- ["navprevsibling"]="巻戻し",
- ["navup"]="上に戻る",
- ["nestedendquote"]="』",
- ["nestedstartquote"]="『",
- ["nonexistantelement"]="要素が存在しません",
- ["note"]="注意",
- ["notes"]="注意",
- ["november"]="十一月",
- ["october"]="十月",
- ["pages"]="偧献",
- ["part"]="パート",
- ["preface"]="序文",
- ["procedure"]="手順",
- ["procedureformal"]="手順",
- ["productionset"]="プロダクション",
- ["productionsetformal"]="プロダクション",
- ["published"]="発行",
- ["qandadiv"]="問:、答:",
- ["qandaentry"]="問:",
- ["question"]="問:",
- ["reference"]="参照",
- ["refname"]="名前",
- ["refsection"]="項",
- ["refsynopsisdiv"]="概要",
- ["revhistory"]="改訂履歴",
- ["revision"]="改訂",
- ["rightsentence"]="——",
- ["rightsubsentence"]="——",
- ["saturday"]="日曜日",
- ["section"]="項",
- ["see"]="参照",
- ["seealso"]="参照",
- ["separator"]="、",
- ["september"]="九月",
- ["set"]="設定",
- ["setindex"]="目次設定",
- ["sidebar"]="サイドバー",
- ["simplesect"]="項",
- ["singleendquote"]="’",
- ["singlestartquote"]="‘",
- ["startquote"]="「",
- ["step"]="ステップ",
- ["sunday"]="月曜日",
- ["table"]="表",
- ["tablenotes"]="注意",
- ["tableofcontents"]="目次",
- ["tables"]="机",
- ["thursday"]="金曜日",
- ["tip"]="ティップ",
- ["tuesday"]="水曜日",
- ["unexpectedelementname"]="不明な要素名",
- ["units"]="ユニッツ",
- ["unsupported"]="サポートしません",
- ["warning"]="警告",
- ["wednesday"]="木曜日",
- ["year"]="年",
-}
diff --git a/Master/texmf-dist/tex/context/base/lang-cyr.tex b/Master/texmf-dist/tex/context/base/lang-cyr.mkii
index 470402bb10e..470402bb10e 100644
--- a/Master/texmf-dist/tex/context/base/lang-cyr.tex
+++ b/Master/texmf-dist/tex/context/base/lang-cyr.mkii
diff --git a/Master/texmf-dist/tex/context/base/lang-def.lua b/Master/texmf-dist/tex/context/base/lang-def.lua
new file mode 100644
index 00000000000..78c8eecbdd9
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lang-def.lua
@@ -0,0 +1,416 @@
+if not modules then modules = { } end modules ['lang-ini'] = {
+ 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 lower = string.lower
+
+languages = languages or { }
+local languages = languages
+local data = languages.data
+
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+
+-- The specifications are based on an analysis done by Arthur. The
+-- names of tags were changed by Hans. The data is not yet used but
+-- will be some day.
+--
+-- description
+--
+-- The description is only meant as an indication; for example 'no' is
+-- "Norwegian, undetermined" because that's really what it is.
+--
+-- script
+--
+-- This is the 4-letter script tag according to ISO 15924, the
+-- official standard.
+--
+-- bibliographical and terminological
+--
+-- Then we have *two* ISO-639 3-letter tags: one is supposed to be used
+-- for "bibliographical" purposes, the other for "terminological". The
+-- first one is quite special (and mostly used in American libraries),
+-- and the more interesting one is the other (apparently it's that one
+-- we find everywhere).
+--
+-- context
+--
+-- These are the ones used in ConteXt. Kind of numberplate ones.
+--
+-- opentype
+--
+-- This is the 3-letter OpenType language tag, obviously.
+--
+-- variant
+--
+-- This is actually the rfc4646: an extension of ISO-639 that also defines
+-- codes for variants like de-1901 for "German, 1901 orthography" or zh-Hans for
+-- "Chinese, simplified characters" ('Hans' is the ISO-15924 tag for
+-- "HAN ideographs, Simplified" :-) As I said yesterday, I think this
+-- should be the reference since it's exactly what we want: it's really
+-- standard (it's a RFC) and it's more than simply languages. To my
+-- knowledge this is the only system that addresses this issue.
+--
+-- Warning: it's not unique! Because we have two "German" languages
+-- (and could, potentially, have two Chinese, etc.)
+--
+-- Beware: the abbreviations are lowercased, which makes it more
+-- convenient to use them.
+--
+-- todo: add default features
+
+local specifications = allocate {
+ {
+ ["description"] = "Basque",
+ ["script"] = "latn",
+ ["bibliographical"] = "baq",
+ ["terminological"] = "eus",
+ ["context"] = "ba",
+ ["opentype"] = "euq",
+ ["variant"] = "eu",
+ },
+ {
+ ["description"] = "Welsh",
+ ["script"] = "latn",
+ ["bibliographical"] = "wel",
+ ["terminological"] = "cym",
+ ["context"] = "cy",
+ ["opentype"] = "wel",
+ ["variant"] = "cy",
+ },
+ {
+ ["description"] = "Icelandic",
+ ["script"] = "latn",
+ ["bibliographical"] = "ice",
+ ["terminological"] = "isl",
+ ["context"] = "is",
+ ["opentype"] = "isl",
+ ["variant"] = "is",
+ },
+ {
+ ["description"] = "Norwegian, undetermined",
+ ["script"] = "latn",
+ ["bibliographical"] = "nor",
+ ["terminological"] = "nor",
+ ["context"] = "no",
+ ["variant"] = "no",
+ },
+ {
+ ["description"] = "Norwegian bokmal",
+ ["script"] = "latn",
+ ["bibliographical"] = "nob",
+ ["terminological"] = "nob",
+ ["opentype"] = "nor", -- not sure!
+ ["variant"] = "nb",
+ },
+ {
+ ["description"] = "Norwegian nynorsk",
+ ["script"] = "latn",
+ ["bibliographical"] = "nno",
+ ["terminological"] = "nno",
+ ["opentype"] = "nny",
+ ["variant"] = "nn",
+ },
+ {
+ ["description"] = "Ancient Greek",
+ ["script"] = "grek",
+ ["bibliographical"] = "grc",
+ ["terminological"] = "grc",
+ ["context"] = "agr",
+ ["variant"] = "grc",
+ },
+ {
+ ["description"] = "German, 1901 orthography",
+ ["script"] = "latn",
+ ["terminological"] = "deu",
+ ["context"] = "deo",
+ ["opentype"] = "deu",
+ ["variant"] = "de-1901",
+ },
+ {
+ ["description"] = "German, 1996 orthography",
+ ["script"] = "latn",
+ ["bibliographical"] = "ger",
+ ["terminological"] = "deu",
+ ["context"] = "de",
+ ["opentype"] = "deu",
+ ["variant"] = "de-1996",
+ },
+ {
+ ["description"] = "Afrikaans",
+ ["script"] = "latn",
+ ["bibliographical"] = "afr",
+ ["terminological"] = "afr",
+ ["context"] = "af",
+ ["opentype"] = "afk",
+ ["variant"] = "af",
+ },
+ {
+ ["description"] = "Catalan",
+ ["script"] = "latn",
+ ["bibliographical"] = "cat",
+ ["terminological"] = "cat",
+ ["context"] = "ca",
+ ["opentype"] = "cat",
+ ["variant"] = "ca",
+ },
+ {
+ ["description"] = "Czech",
+ ["script"] = "latn",
+ ["bibliographical"] = "cze",
+ ["terminological"] = "ces",
+ ["context"] = "cz",
+ ["opentype"] = "csy",
+ ["variant"] = "cs",
+ },
+ {
+ ["description"] = "Greek",
+ ["script"] = "grek",
+ ["bibliographical"] = "gre",
+ ["terminological"] = "ell",
+ ["context"] = "gr",
+ ["opentype"] = "ell",
+ ["variant"] = "el",
+ },
+ {
+ ["description"] = "American English",
+ ["script"] = "latn",
+ ["bibliographical"] = "eng",
+ ["terminological"] = "eng",
+ ["context"] = "us",
+ ["opentype"] = "eng",
+ ["variant"] = "en-US",
+ },
+ {
+ ["description"] = "British English",
+ ["script"] = "latn",
+ ["bibliographical"] = "eng",
+ ["terminological"] = "eng",
+ ["context"] = "uk",
+ ["opentype"] = "eng",
+ ["variant"] = "en-UK", -- Could be en-GB as well ...
+ },
+ {
+ ["description"] = "Spanish",
+ ["script"] = "latn",
+ ["bibliographical"] = "spa",
+ ["terminological"] = "spa",
+ ["context"] = "es",
+ ["opentype"] = "esp",
+ ["variant"] = "es",
+ },
+ {
+ ["description"] = "Finnish",
+ ["script"] = "latn",
+ ["bibliographical"] = "fin",
+ ["terminological"] = "fin",
+ ["context"] = "fi",
+ ["opentype"] = "fin",
+ ["variant"] = "fi",
+ },
+ {
+ ["description"] = "French",
+ ["script"] = "latn",
+ ["bibliographical"] = "fre",
+ ["terminological"] = "fra",
+ ["context"] = "fr",
+ ["opentype"] = "fra",
+ ["variant"] = "fr",
+ },
+ {
+ ["description"] = "Croatian",
+ ["script"] = "latn",
+ ["bibliographical"] = "scr",
+ ["terminological"] = "hrv",
+ ["context"] = "hr",
+ ["opentype"] = "hrv",
+ ["variant"] = "hr",
+ },
+ {
+ ["description"] = "Hungarian",
+ ["script"] = "latn",
+ ["bibliographical"] = "hun",
+ ["terminological"] = "hun",
+ ["context"] = "hu",
+ ["opentype"] = "hun",
+ ["variant"] = "hu",
+ },
+ {
+ ["description"] = "Italian",
+ ["script"] = "latn",
+ ["bibliographical"] = "ita",
+ ["terminological"] = "ita",
+ ["context"] = "it",
+ ["opentype"] = "ita",
+ ["variant"] = "it",
+ },
+ {
+ ["description"] = "Japanese",
+ ["script"] = "jpan",
+ ["bibliographical"] = "jpn",
+ ["terminological"] = "jpn",
+ ["context"] = "ja",
+ ["opentype"] = "jan",
+ ["variant"] = "ja",
+ },
+ {
+ ["description"] = "Latin",
+ ["script"] = "latn",
+ ["bibliographical"] = "lat",
+ ["terminological"] = "lat",
+ ["context"] = "la",
+ ["opentype"] = "lat",
+ ["variant"] = "la",
+ },
+ {
+ ["description"] = "Portuguese",
+ ["script"] = "latn",
+ ["bibliographical"] = "por",
+ ["terminological"] = "por",
+ ["context"] = "pt",
+ ["opentype"] = "ptg",
+ ["variant"] = "pt",
+ },
+ {
+ ["description"] = "Polish",
+ ["script"] = "latn",
+ ["bibliographical"] = "pol",
+ ["terminological"] = "pol",
+ ["context"] = "pl",
+ ["opentype"] = "plk",
+ ["variant"] = "pl",
+ },
+ {
+ ["description"] = "Romanian",
+ ["script"] = "latn",
+ ["bibliographical"] = "rum",
+ ["terminological"] = "ron",
+ ["context"] = "ro",
+ ["opentype"] = "rom",
+ ["variant"] = "ro",
+ },
+ {
+ ["description"] = "Russian",
+ ["script"] = "cyrl",
+ ["bibliographical"] = "rus",
+ ["terminological"] = "rus",
+ ["context"] = "ru",
+ ["opentype"] = "rus",
+ ["variant"] = "ru",
+ },
+ {
+ ["description"] = "Slovak",
+ ["script"] = "latn",
+ ["bibliographical"] = "slo",
+ ["terminological"] = "slk",
+ ["context"] = "sk",
+ ["opentype"] = "sky",
+ ["variant"] = "sk",
+ },
+ {
+ ["description"] = "Slovenian",
+ ["script"] = "latn",
+ ["bibliographical"] = "slv",
+ ["terminological"] = "slv",
+ ["context"] = "sl",
+ ["opentype"] = "slv",
+ ["variant"] = "sl",
+ },
+ {
+ ["description"] = "Swedish",
+ ["script"] = "latn",
+ ["bibliographical"] = "swe",
+ ["terminological"] = "swe",
+ ["context"] = "sv",
+ ["opentype"] = "sve",
+ ["variant"] = "sv",
+ },
+ {
+ ["description"] = "Turkish",
+ ["script"] = "latn",
+ ["bibliographical"] = "tur",
+ ["terminological"] = "tur",
+ ["context"] = "tr",
+ ["opentype"] = "trk",
+ ["variant"] = "tr",
+ },
+ {
+ ["description"] = "Vietnamese",
+ ["script"] = "latn",
+ ["bibliographical"] = "vie",
+ ["terminological"] = "vie",
+ ["context"] = "vn",
+ ["opentype"] = "vit",
+ ["variant"] = "vi",
+ },
+ {
+ ["description"] = "Chinese, simplified",
+ ["script"] = "hans",
+ ["opentype-script"] = "hani",
+ ["bibliographical"] = "chi",
+ ["terminological"] = "zho",
+ ["context"] = "cn",
+ ["opentype"] = "zhs",
+ ["variant"] = "zh-hans",
+ },
+}
+
+data.specifications = specifications
+
+local variants = { } data.variants = variants
+local opentypes = { } data.opentypes = opentypes
+local contexts = { } data.contexts = contexts
+local records = { } data.records = records
+
+for k=1,#specifications do
+ local v = specifications[k]
+ if v.variant then
+ variants[v.variant] = v
+ end
+ if v.opentype then
+ opentypes[v.opentype] = v
+ end
+ local vc = v.context
+ if vc then
+ if type(vc) == "table" then
+ for k=1,#vc do
+ contexts[v] = vc[k]
+ end
+ else
+ contexts[vc] = v
+ end
+ end
+end
+
+setmetatableindex(variants, function(t,k)
+ str = lower(str)
+ local v = (l_variant[str] or l_opentype[str] or l_context[str] or l_variant.en).language
+ t[k] = v
+ return v
+end)
+
+setmetatableindex(opentypes, function(t,k)
+ str = lower(str)
+ local v = (l_variant[str] or l_opentype[str] or l_context[str] or l_variant.en).opentype
+ t[k] = v
+ return v
+end)
+
+setmetatableindex(contexts, function(t,k)
+ str = lower(str)
+ local v = (l_variant[str] or l_opentype[str] or l_context[str] or l_variant[languages.default]).context
+ v = (type(v) == "table" and v[1]) or v
+ t[k] = v
+ return v
+end)
+
+setmetatableindex(records, function(t,k) -- how useful is this one?
+ str = lower(str)
+ local v = variants[str] or opentypes[str] or contexts[str] or variants.en
+ t[k] = v
+ return v
+end)
diff --git a/Master/texmf-dist/tex/context/base/lang-def.mkiv b/Master/texmf-dist/tex/context/base/lang-def.mkiv
new file mode 100644
index 00000000000..359006fefb4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lang-def.mkiv
@@ -0,0 +1,689 @@
+%D \module
+%D [ file=lang-def,
+%D version=2011.01.24, % merge of language files
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Languages Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Language Macros / Definitions}
+
+%D See \type {lang-*.tex} for some historic notes.
+
+\unprotect
+
+% Germanic Languages: Danish, Faeroese, Icelandic, Norwegian,
+% Swedish, German, Yiddish, Afrikaans, Dutch, English, Flemush,
+% Frisian, Plattdeutsch
+
+\installlanguage
+ [\s!nl]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,\space,\v!month,\space,\v!year}]
+
+\installlanguage
+ [\s!en]
+ [\c!spacing=\v!broad,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!month,\space,\v!day,{,\space},\v!year},
+ \s!patterns=\s!us,
+ \s!lefthyphenmin=2,
+ \s!righthyphenmin=3]
+
+\installlanguage
+ [\s!de]
+ [\c!spacing=\v!packed,
+ \s!lefthyphenmin=3,
+ \s!righthyphenmin=3,
+ \c!leftsentence=\hbox{\endash\space},
+ \c!rightsentence=\hbox{\space\endash},
+ \c!leftsubsentence=\endash,
+ \c!rightsubsentence=\endash,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsinglesixquote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoublesixquote,
+ \c!date={\v!day,{.\space},\v!month,\space,\v!year}]
+
+\installlanguage
+ [\s!da]
+ [\c!spacing=\v!packed,
+ \c!leftsentence={\hbox{\endash\enskip}},
+ \c!rightsentence={\hbox{\enskip\endash}},
+ \c!leftsubsentence=\endash,
+ \c!rightsubsentence=\endash,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsinglesixquote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoublesixquote,
+ \c!date={\v!day,{.\space},\v!month,\space,\v!year}]
+
+\installlanguage
+ [\s!sv]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\hbox{\endash\space},
+ \c!rightsentence=\hbox{\space\endash},
+ \c!leftsubsentence=\endash,
+ \c!rightsubsentence=\endash,
+ \c!leftquote=\upperrightsingleninequote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperrightdoubleninequote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,\space,\v!month,\space,\v!year}]
+
+\installlanguage
+ [\s!af]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!year,\space,\v!month,\space,\v!day}]
+
+\installlanguage
+ [\s!nb]
+ [spacing=packed,
+ lefthyphenmin=2,
+ righthyphenmin=2,
+ leftsentence=\emdash,
+ rightsentence=\emdash,
+ leftsubsentence=\emdash,
+ rightsubsentence=\emdash,
+ leftquote=\upperleftsinglesixquote,
+ rightquote=\upperrightsingleninequote,
+ leftquotation=\leftguillemot,
+ rightquotation=\rightguillemot,
+ date={day,{.},\space,month,\space,year}]
+
+\installlanguage
+ [\s!nn]
+ [spacing=packed,
+ lefthyphenmin=2,
+ righthyphenmin=2,
+ leftsentence=\emdash,
+ rightsentence=\emdash,
+ leftsubsentence=\emdash,
+ rightsubsentence=\emdash,
+ leftquote=\upperleftsinglesixquote,
+ rightquote=\upperrightsingleninequote,
+ leftquotation=\leftguillemot,
+ rightquotation=\rightguillemot,
+ date={day,{.},\space,month,\space,year}]
+
+
+\installlanguage [\s!no] [\s!nb]
+\installlanguage [\s!norwegian] [\s!nb]
+\installlanguage [\s!bokmal] [\s!nb]
+\installlanguage [\s!nynorsk] [\s!nn]
+
+\installlanguage % old german
+ [deo]
+ [\c!spacing=\v!packed,
+ \c!default=\s!de]
+
+\installlanguage
+ [de-de]
+ [\c!spacing=\v!packed,
+ \c!default=\s!de]
+
+\installlanguage
+ [de-at]
+ [\c!spacing=\v!packed,
+ \c!default=\s!de,
+ \c!leftquote=\leftguillemot,
+ \c!rightquote=\rightguillemot,
+ \c!leftquotation=\leftguillemot,
+ \c!rightquotation=\rightguillemot]
+
+\installlanguage
+ [de-ch]
+ [\c!spacing=\v!packed,
+ \c!default=\s!de]
+
+%D And some alternative (but very real) english patterns:
+
+\installlanguage
+ [en-gb]
+ [\c!default=\s!en,
+ \s!patterns=\s!gb,
+ \s!lefthyphenmin=3,
+ \s!righthyphenmin=3]
+
+\installlanguage
+ [en-us]
+ [\c!default=\s!en,
+ \s!patterns=\s!us]
+
+\installlanguage [\s!uk] [\s!en-\s!gb]
+\installlanguage [\s!us] [\s!en-\s!us]
+
+\installlanguage [usenglish] [\s!en-\s!us]
+\installlanguage [ukenglish] [\s!en-\s!gb]
+\installlanguage [english] [\s!en]
+\installlanguage [dutch] [\s!nl]
+\installlanguage [german] [\s!de]
+\installlanguage [danish] [\s!da]
+\installlanguage [swedish] [\s!sv]
+\installlanguage [afrikaans] [\s!af]
+
+% Slavic Languages: Belarussian, Russian, Ukrainian, Bulgarian,
+% Macedonian, Serbian, Croatian, Slovenian, Czech, Kushubian,
+% Lusatian/Sorbian/Wendish, Polish, Slovak, Albanian, Illyrian,
+% Armenian
+
+\installlanguage
+ [\s!pl]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,{.\space},\v!month,\space,\v!year}]
+
+\installlanguage
+ [\s!cs]
+ [\c!spacing=\v!packed,
+ \c!leftsentence={\thickglue\endash\thickglue\penalty-20\relax},
+ \c!rightsentence={\thickglue\endash\thickglue\penalty-20\relax},
+ \c!leftsubsentence={\nobreakspace\emdash\nobreakspace\penalty-20\relax},
+ \c!rightsubsentence={\nobreakspace\emdash\nobreakspace\penalty-20\relax},
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsinglesixquote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoublesixquote,
+ \c!date={\v!day,{.\thinspace},\v!month,\space,\v!year}]
+
+\installlanguage
+ [\s!sk]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,{.\thinspace},\v!month,\space,\v!year}]
+
+\installlanguage
+ [\s!hr]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\hbox{\endash\space},
+ \c!rightsentence=\hbox{\space\endash},
+ \c!leftsubsentence=\endash,
+ \c!rightsubsentence=\endash,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,{.},\space,\v!month,\space,\v!year}]
+
+\installlanguage
+ [\s!sl]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\hbox{\endash\space},
+ \c!rightsentence=\hbox{\space\endash},
+ \c!leftsubsentence=\endash,
+ \c!rightsubsentence=\endash,
+ \c!leftquote=\guilsingleright,
+ \c!rightquote=\guilsingleleft,
+ \c!leftquotation=\rightguillemot,
+ \c!rightquotation=\leftguillemot,
+ \c!date={\v!day,{.},\space,\v!month,\space,\v!year}]
+
+\installlanguage [polish] [\s!pl]
+\installlanguage [czech] [\s!cs]
+\installlanguage [slovak] [\s!sk]
+\installlanguage [croatian] [\s!hr]
+\installlanguage [slovenian] [\s!sl]
+\installlanguage [slovene] [\s!sl] % both possible (mojca: still needed?)
+
+\installlanguage [cz] [\s!cs]
+
+\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 [sl] [character] [\sloveniancharacter]
+\defineconversion [sl] [Character] [\slovenianCharacter]
+
+\defineconversion [sl] [characters] [\sloveniancharacters]
+\defineconversion [sl] [Characters] [\slovenianCharacters]
+
+\defineconversion [sl] [a] [\sloveniancharacters]
+\defineconversion [sl] [A] [\slovenianCharacters]
+\defineconversion [sl] [AK] [\smallcapped\sloveniancharacters]
+\defineconversion [sl] [KA] [\smallcapped\sloveniancharacters]
+
+\def\sloveniancharacters#1{\ctxcommand{alphabetic(\number#1,"sl")}}
+\def\slovenianCharacters#1{\ctxcommand{Alphabetic(\number#1,"sl")}}
+
+% Cyrillic Languages
+
+\installlanguage
+ [\s!ru]
+ [\s!lefthyphenmin=2,
+ \s!righthyphenmin=2,
+ \c!spacing=\v!packed,
+ \c!leftsentence=\leftguillemot,
+ \c!rightsentence=\rightguillemot,
+ \c!leftsubsentence=\lowerleftdoubleninequote,
+ \c!rightsubsentence=\upperrightdoubleninequote,
+ \c!leftquote=\lowerleftdoubleninequote,
+ \c!rightquote=\upperrightdoubleninequote,
+ \c!leftquotation=\leftguillemot,
+ \c!rightquotation=\rightguillemot,
+ \c!date={\v!day,\space,\v!month,\space,\v!year}]
+
+\installlanguage
+ [\s!ua]
+ [\s!lefthyphenmin=2,
+ \s!righthyphenmin=2,
+ \c!spacing=\v!packed,
+ \c!leftsentence=\leftguillemot,
+ \c!rightsentence=\rightguillemot,
+ \c!leftsubsentence=\lowerleftdoubleninequote,
+ \c!rightsubsentence=\upperrightdoubleninequote,
+ \c!leftquote=\lowerleftdoubleninequote,
+ \c!rightquote=\upperrightdoubleninequote,
+ \c!leftquotation=\leftguillemot,
+ \c!rightquotation=\rightguillemot,
+ \c!date={\v!day,\space,\v!month,\space,\v!year},
+ \s!patterns=\s!uk]
+
+\installlanguage [russian] [\s!ru]
+\installlanguage [ukrainian] [\s!ua]
+
+% Uralic Languages: Cheremiss, Estonian, Finnish, Karelian, Laap,
+% Mordvinian, Permian tongues, Hungarian, Ostyak, Vogul, Samoyed
+
+\installlanguage
+ [\s!fi]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!year,\space,\v!month,\space,\v!day}]
+
+\installlanguage
+ [\s!hu]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!year,.,\space,\v!month,\space,\v!day,.}]
+
+\installlanguage [finish] [\s!fi]
+\installlanguage [hungarian] [\s!hu]
+
+% Altaic Languages: Uigur, Uzbek, Azeri/Azerbaijani, Chuvash,
+% Turkish, Turkmen, Kazakh, Kazar, Kireghiz, Noghay, Talar,
+% Buryat, Kalmuck, Khalkha
+
+\installlanguage
+ [\s!tr]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!year,\space,\v!month,\space,\v!day}]
+
+\installlanguage
+ [\s!tk]
+ [\c!spacing=\v!broad,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!year,\space,\v!month,\space,\v!day}
+ \s!patterns=\s!tk,
+ \s!lefthyphenmin=1,
+ \s!righthyphenmin=2]
+
+\installlanguage [turkish] [\s!tr]
+\installlanguage [turkmen] [\s!tk]
+
+% Anatolian Languages
+
+% Arabic Languages
+
+\definesystemconstant {arabic}
+\definesystemvariable {ar}
+
+\installlanguage
+ [\s!ar]
+ [\c!spacing=\v!broad,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,\space,\v!month,{،\space},\v!year}]
+
+\installlanguage [\s!arabic] [\s!ar]
+
+% Just aliases to "ar" for now
+
+\installlanguage[\s!ar-ae][\c!default=\s!ar] % U.A.E.
+\installlanguage[\s!ar-bh][\c!default=\s!ar] % Bahrain
+\installlanguage[\s!ar-eg][\c!default=\s!ar] % Egypt
+\installlanguage[\s!ar-in][\c!default=\s!ar] % India?
+\installlanguage[\s!ar-kw][\c!default=\s!ar] % Kuwait
+\installlanguage[\s!ar-ly][\c!default=\s!ar] % Libya
+\installlanguage[\s!ar-om][\c!default=\s!ar] % Oman
+\installlanguage[\s!ar-qa][\c!default=\s!ar] % Qatar
+\installlanguage[\s!ar-sa][\c!default=\s!ar] % Saudi Arabia
+\installlanguage[\s!ar-sd][\c!default=\s!ar] % Sudan
+\installlanguage[\s!ar-tn][\c!default=\s!ar] % Tunisia
+\installlanguage[\s!ar-ye][\c!default=\s!ar] % Yemen
+
+% Syriac months
+
+\installlanguage[\s!ar-sy][\c!default=\s!ar] % Syria
+\installlanguage[\s!ar-iq][\c!default=\s!ar-sy] % Iraq
+\installlanguage[\s!ar-jo][\c!default=\s!ar-sy] % Jordan
+\installlanguage[\s!ar-lb][\c!default=\s!ar-sy] % Lebanon
+
+% Maghribi months
+
+\installlanguage[\s!ar-dz][\c!default=\s!ar] % Algeria
+\installlanguage[\s!ar-ma][\c!default=\s!ar] % Morocco
+
+% Artificial Languages: Esperanto
+
+% Baltic Languages: Lettish/Latvian, Lietuvių/Lithuanian
+
+\installlanguage
+ [\s!lt]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\lowerleftdoubleninequote,
+ \c!rightquote=\upperrightdoublesixquote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoublesixquote,
+ \c!date={\v!year,~m.,\space,\v!month,\space,\v!day,~d.},
+ \s!patterns=\s!lt,
+ \s!lefthyphenmin=2,
+ \s!righthyphenmin=2]
+
+\installlanguage [lithuanian] [\s!lt]
+
+% Celtic: Breton, Welsh, Irish, Manx, Scottish Gaelic
+
+% CJK
+
+\definesystemconstant {chinese} \definesystemconstant {cn}
+\definesystemconstant {japanese} \definesystemconstant {ja}
+\definesystemconstant {korean} \definesystemconstant {kr}
+
+\installlanguage
+ [\s!cn]
+ [\c!leftsentence=——,
+ \c!rightsentence=——,
+ \c!leftsubsentence=——,
+ \c!rightsubsentence=——,
+ \c!leftquote=‘,
+ \c!rightquote=’,
+ \c!leftquotation=“,
+ \c!rightquotation=”,
+ \c!date={\v!year,年,\space,\v!month,\v!day,日}]
+
+\installlanguage
+ [\s!ja]
+ [\c!leftsentence=——,
+ \c!rightsentence=——,
+ \c!leftsubsentence=——,
+ \c!rightsubsentence=——,
+ \c!leftquote=‘,
+ \c!rightquote=’,
+ \c!leftquotation=「,
+ \c!rightquotation=」,
+ \c!date={西暦,\v!year,年,\v!month,月,\v!day,日}]
+
+\installlanguage
+ [\s!kr]
+ [\c!leftsentence=——,
+ \c!rightsentence=——,
+ \c!leftsubsentence=——,
+ \c!rightsubsentence=——,
+ \c!leftquote=‘,
+ \c!rightquote=’,
+ \c!leftquotation=“,
+ \c!rightquotation=”,
+ \c!date={서기,\v!year,년,\v!month,월,\v!day,일}]
+
+% Greek
+
+\installlanguage
+ [\s!gr]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\greekleftquot,
+ \c!rightquote=\greekrightquot,
+ \c!leftquotation=\greekleftquot,
+ \c!rightquotation=\greekrightquot,
+ \c!date={\v!day\space\v!month\space\v!year},
+ \s!patterns=\s!agr] % ok?
+
+\installlanguage [greek] [\s!gr]
+
+\installlanguage
+ [\s!agr]
+ [\s!default=\s!gr,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote]
+
+\installlanguage [ancientgreek] [\s!agr]
+\installlanguage [grk] [\s!agr]
+
+% Indo-Iranian Languages: 34.
+
+% Italic Languages: Latin, Italian, Rhaeto-Romanic, Rumanian,
+% Sardian, Catalan, French, Ladino, Portuguese, Proven\c{c}al,
+% Spanish
+
+\ifx\guillemotspace\undefined \let\guillemotspace\empty \fi
+\ifx\sentencespace \undefined \let\sentencespace \empty \fi
+
+\installlanguage
+ [\s!fr]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\leftguillemot,
+ \c!rightquote=\rightguillemot,
+ \c!leftquotation=\leftguillemot,
+ \c!rightquotation=\rightguillemot,
+ \c!date={\v!day+,\v!space,\v!month,\v!space,\v!year}]
+
+\installlanguage
+ [\s!es]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,\space,\v!month,\space,\v!year}]
+
+\installlanguage [sp] [\s!es] % old times context
+
+\installlanguage
+ [\s!ca]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,\space,\v!month,\space,\v!year}]
+
+% Note GB left|/|right (sub)sentences are for \quote {incisi}.
+
+\installlanguage
+ [\s!it]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\endash,
+ \c!rightsubsentence=\endash,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!leftspeech=\leftguillemot,
+ \c!middlespeech=\leftguillemot,
+ \c!rightspeech=\rightguillemot,
+ \c!date={\v!day,\space,\v!month,\space,\v!year}]
+
+\installlanguage % the same as italian
+ [\s!la]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,\space,\v!month,\space,\v!year}]
+
+\installlanguage
+ [\s!pt]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!year,\space,\v!month,\space,\v!day}]
+
+\installlanguage
+ [\s!ro]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\leftguillemot,
+ \c!rightquote=\rightguillemot,
+ \c!leftquotation=\lowerrightdoubleninequote,
+ \c!rightquotation=\upperleftdoublesixquote,
+ \c!date={\v!day,\space,\v!month,\space,\v!year}]
+
+%D For compatibility reasons we also define:
+
+\installlanguage [fa] [\s!fr] % for dutchies only
+
+\installlanguage [french] [\s!fr]
+\installlanguage [spanish] [\s!es]
+\installlanguage [catalan] [\s!ca]
+\installlanguage [italian] [\s!it]
+\installlanguage [latin] [\s!la]
+\installlanguage [portuguese] [\s!pt]
+\installlanguage [romanian] [\s!ro]
+
+\defineconversion [\s!fr] [\v!day+] [\frordinaldaynumber]
+
+% Vietnamese Language
+
+\installlanguage
+ [\s!vi]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\emdash,
+ \c!rightsentence=\emdash,
+ \c!leftsubsentence=\emdash,
+ \c!rightsubsentence=\emdash,
+ \c!leftquote=\quoteleft,
+ \c!rightquote=\quoteright,
+ \c!leftquotation=\quotedblleft,
+ \c!rightquotation=\quotedblright,
+ \c!date={{ },dd,{/},mm,{/},yy}]
+
+\installlanguage [vietnamese] [\s!vi]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/lang-frd.tex b/Master/texmf-dist/tex/context/base/lang-frd.mkii
index 6cc27080b78..6cc27080b78 100644
--- a/Master/texmf-dist/tex/context/base/lang-frd.tex
+++ b/Master/texmf-dist/tex/context/base/lang-frd.mkii
diff --git a/Master/texmf-dist/tex/context/base/lang-frq.tex b/Master/texmf-dist/tex/context/base/lang-frq.mkii
index 773230e6c86..773230e6c86 100644
--- a/Master/texmf-dist/tex/context/base/lang-frq.tex
+++ b/Master/texmf-dist/tex/context/base/lang-frq.mkii
diff --git a/Master/texmf-dist/tex/context/base/lang-ger.tex b/Master/texmf-dist/tex/context/base/lang-ger.mkii
index 1ffbb33e68c..04551a891df 100644
--- a/Master/texmf-dist/tex/context/base/lang-ger.tex
+++ b/Master/texmf-dist/tex/context/base/lang-ger.mkii
@@ -116,39 +116,39 @@
\c!leftquotation=\upperleftdoublesixquote,
\c!rightquotation=\upperrightdoubleninequote,
\c!date={\v!year,\ ,\v!month,\ ,\v!day},
- \s!patterns=\s!nl]
+ \s!patterns=\s!af] % was nl
\installlanguage
- [\s!nb]
- [spacing=packed,
- lefthyphenmin=2,
- righthyphenmin=2,
- leftsentence=---,
- rightsentence=---,
- leftsubsentence=---,
- rightsubsentence=---,
- leftquote=\upperleftsinglesixquote,
- rightquote=\upperrightsingleninequote,
- leftquotation=\leftguillemot,
- rightquotation=\rightguillemot,
- date={day,{.},\ ,month,\ ,year},
- state=stop]
+ [\s!nb]
+ [spacing=packed,
+ lefthyphenmin=2,
+ righthyphenmin=2,
+ leftsentence=---,
+ rightsentence=---,
+ leftsubsentence=---,
+ rightsubsentence=---,
+ leftquote=\upperleftsinglesixquote,
+ rightquote=\upperrightsingleninequote,
+ leftquotation=\leftguillemot,
+ rightquotation=\rightguillemot,
+ date={day,{.},\ ,month,\ ,year},
+ state=stop]
\installlanguage
- [\s!nn]
- [spacing=packed,
- lefthyphenmin=2,
- righthyphenmin=2,
- leftsentence=---,
- rightsentence=---,
- leftsubsentence=---,
- rightsubsentence=---,
- leftquote=\upperleftsinglesixquote,
- rightquote=\upperrightsingleninequote,
- leftquotation=\leftguillemot,
- rightquotation=\rightguillemot,
- date={day,{.},\ ,month,\ ,year},
- state=stop]
+ [\s!nn]
+ [spacing=packed,
+ lefthyphenmin=2,
+ righthyphenmin=2,
+ leftsentence=---,
+ rightsentence=---,
+ leftsubsentence=---,
+ rightsubsentence=---,
+ leftquote=\upperleftsinglesixquote,
+ rightquote=\upperrightsingleninequote,
+ leftquotation=\leftguillemot,
+ rightquotation=\rightguillemot,
+ date={day,{.},\ ,month,\ ,year},
+ state=stop]
\installlanguage [\s!no] [\s!nb]
\installlanguage [\s!norwegian] [\s!nb]
@@ -215,19 +215,20 @@
\installlanguage
[en-us]
- [\c!default=\s!en]
+ [\c!default=\s!en,
+ \s!patterns=\s!us]
-\installlanguage [\s!uk] [en-gb]
-\installlanguage [\s!us] [en-us]
+\installlanguage [\s!uk] [\s!en-\s!gb]
+\installlanguage [\s!us] [\s!en-\s!us]
%D For compatibility reasons we also define:
%installlanguage [du] [\s!de] % old times context
%installlanguage [sp] [\s!es] % old times context /lang-ita
-\installlanguage [usenglish] [en-us]
-\installlanguage [ukenglish] [en-gb]
-\installlanguage [english] [en-us]
+\installlanguage [usenglish] [\s!en-\s!us]
+\installlanguage [ukenglish] [\s!en-\s!gb]
+\installlanguage [english] [\s!en]
\installlanguage [dutch] [\s!nl]
\installlanguage [german] [\s!de]
\installlanguage [danish] [\s!da]
@@ -618,18 +619,23 @@
\setuplabeltext [\s!nl] [\v!hencefore=hierboven]
\setuplabeltext [\s!nl] [\v!hereafter=hieronder]
\setuplabeltext [\s!nl] [\v!see=zie ]
+\setuplabeltext [\s!nl] [\v!and= en ]
+\setuplabeltext [\s!nl] [\v!continued={ (vervolged)}]
\setuplabeltext [\s!en] [\v!page=page ]
\setuplabeltext [\s!en] [\v!atpage=at page ]
\setuplabeltext [\s!en] [\v!hencefore=as we show above]
\setuplabeltext [\s!en] [\v!hereafter=as we show below]
\setuplabeltext [\s!en] [\v!see=see ]
+\setuplabeltext [\s!en] [\v!and= and ]
+\setuplabeltext [\s!en] [\v!continued={ (continued)}]
\setuplabeltext [\s!de] [\v!page=Seite ]
\setuplabeltext [\s!de] [\v!atpage=auf Seite ]
\setuplabeltext [\s!de] [\v!hencefore=siehe oben]
\setuplabeltext [\s!de] [\v!hereafter=siehe unten]
\setuplabeltext [\s!de] [\v!see=siehe ]
+\setuplabeltext [\s!de] [\v!and= und ]
\setuplabeltext [\s!da] [\v!page=Side ]
\setuplabeltext [\s!da] [\v!atpage=p\aring\ side ]
diff --git a/Master/texmf-dist/tex/context/base/lang-grk.tex b/Master/texmf-dist/tex/context/base/lang-grk.mkii
index e4ba781ebd8..862f3c5f41e 100644
--- a/Master/texmf-dist/tex/context/base/lang-grk.tex
+++ b/Master/texmf-dist/tex/context/base/lang-grk.mkii
@@ -85,10 +85,15 @@
\installlanguage
[\s!agr]
[\s!default=\s!gr,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
\s!patterns=\s!agr,
- \s!mapping=\s!agr,
- \s!encoding=\s!agr]
+ \s!mapping=\s!agr, % not needed for mkiv
+ \s!encoding=\s!agr] % not needed for mkiv
\installlanguage [ancientgreek] [\s!agr]
+\installlanguage [grk] [\s!agr]
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/lang-ind.tex b/Master/texmf-dist/tex/context/base/lang-ind.mkii
index 9b6e5ff1dbe..9b6e5ff1dbe 100644
--- a/Master/texmf-dist/tex/context/base/lang-ind.tex
+++ b/Master/texmf-dist/tex/context/base/lang-ind.mkii
diff --git a/Master/texmf-dist/tex/context/base/lang-ini.lua b/Master/texmf-dist/tex/context/base/lang-ini.lua
index 239e5390c55..525e0f17a12 100644
--- a/Master/texmf-dist/tex/context/base/lang-ini.lua
+++ b/Master/texmf-dist/tex/context/base/lang-ini.lua
@@ -7,209 +7,181 @@ if not modules then modules = { } end modules ['lang-ini'] = {
}
-- needs a cleanup (share locals)
+-- discard language when redefined
+-- 002D : hyphen-minus (ascii)
+-- 2010 : hyphen
+-- 2011 : nonbreakable hyphen
+-- 2013 : endash (compound hyphen)
+
+--~ lang:hyphenation(string) string = lang:hyphenation() lang:clear_hyphenation()
+
+local type, tonumber = type, tonumber
local utf = unicode.utf8
local utfbyte = utf.byte
-local format = string.format
+local format, gsub = string.format, string.gsub
local concat = table.concat
local lpegmatch = lpeg.match
+local texwrite = tex.write
-local trace_patterns = false trackers.register("languages.patterns", function(v) trace_patterns = v end)
+local settings_to_array = utilities.parsers.settings_to_array
-languages = languages or {}
-languages.version = 1.009
-languages.hyphenation = languages.hyphenation or { }
-languages.hyphenation.data = languages.hyphenation.data or { }
+local trace_patterns = false trackers.register("languages.patterns", function(v) trace_patterns = v end)
-local langdata = languages.hyphenation.data
+local report_initialization = logs.reporter("languages","initialization")
--- 002D : hyphen-minus (ascii)
--- 2010 : hyphen
--- 2011 : nonbreakable hyphen
--- 2013 : endash (compound hyphen)
+local prehyphenchar = lang.prehyphenchar -- global per language
+local posthyphenchar = lang.posthyphenchar -- global per language
+local lefthyphenmin = lang.lefthyphenmin
+local righthyphenmin = lang.righthyphenmin
+
+lang.exceptions = lang.hyphenation
---~ lang:hyphenation(string)
---~ string =lang:hyphenation()
---~ lang:clear_hyphenation()
+languages = languages or {}
+local languages = languages
--- we can consider hiding data (faster access too)
+languages.version = 1.010
--- loading the 26 languages that we normally load in mkiv, the string based variant
--- takes .84 seconds (probably due to the sub's) while the lpeg variant takes .78
--- seconds
---
--- the following lpeg can probably be improved (it was one of the first I made)
+languages.registered = languages.registered or { }
+local registered = languages.registered
-local leftbrace = lpeg.P("{")
-local rightbrace = lpeg.P("}")
-local spaces = lpeg.S(" \r\n\t\f")
-local spacing = spaces^0
-local validchar = 1-(spaces+rightbrace+leftbrace)
-local validword = validchar^1
-local content = spacing * leftbrace * spacing * lpeg.C((spacing * validword)^0) * spacing * rightbrace * lpeg.P(true)
+languages.associated = languages.associated or { }
+local associated = languages.associated
-local command = lpeg.P("\\patterns")
-local parser = (1-command)^0 * command * content
+languages.numbers = languages.numbers or { }
+local numbers = languages.numbers
-local function filterpatterns(filename)
- if file.extname(filename) == "rpl" then
- return io.loaddata(resolvers.find_file(filename)) or ""
- else
- return lpegmatch(parser,io.loaddata(resolvers.find_file(filename)) or "")
- end
-end
+languages.data = languages.data or { }
+local data = languages.data
-local command = lpeg.P("\\hyphenation")
-local parser = (1-command)^0 * command * content
+storage.register("languages/numbers", numbers, "languages.numbers")
+storage.register("languages/registered",registered,"languages.registered")
+storage.register("languages/associated",associated,"languages.associated")
+storage.register("languages/data", data, "languages.data")
-local function filterexceptions(filename)
- if file.extname(filename) == "rhl" then
- return io.loaddata(resolvers.find_file(filename)) or ""
- else
- return lpegmatch(parser,io.loaddata(resolvers.find_file(filename)) or {}) -- "" ?
- end
-end
+local nofloaded = 0
-local function record(tag)
- local data = langdata[tag]
- if not data then
- data = lang.new()
- langdata[tag] = data or 0
+local function resolve(tag)
+ local data, instance = registered[tag], nil
+ if data then
+ instance = data.instance
+ if not instance then
+ instance = lang.new(data.number)
+ data.instance = instance
+ end
end
- return data
+ return data, instance
end
-languages.hyphenation.record = record
-
-function languages.hyphenation.define(tag)
- local data = record(tag)
- return data:id()
+local function tolang(what) -- returns lang object
+ local tag = numbers[what]
+ local data = tag and registered[tag] or registered[what]
+ if data then
+ local instance = data.lang
+ if not instance then
+ instance = lang.new(data.number)
+ data.instance = instance
+ end
+ return instance
+ end
end
-function languages.hyphenation.number(tag)
- local d = langdata[tag]
- return (d and d:id()) or 0
-end
+-- languages.tolang = tolang
-lang.exceptions = lang.hyphenation
+-- todo: en+de => merge
-local function loadthem(tag, filename, filter, target)
+local function loaddefinitions(tag,specification)
statistics.starttiming(languages)
- local data = record(tag)
- local fullname = (filename and filename ~= "" and resolvers.find_file(filename)) or ""
- local ok = fullname ~= ""
- if ok then
+ local data, instance = resolve(tag)
+ local definitions = settings_to_array(specification.patterns or "")
+ if #definitions > 0 then
if trace_patterns then
- logs.report("languages","filtering %s for language '%s' from '%s'",target,tag,fullname)
+ report_initialization("pattern specification for language '%s': %s",tag,specification.patterns)
end
- lang[target](data,filterpatterns(fullname))
- else
- if trace_patterns then
- logs.report("languages","no %s for language '%s' in '%s'",target,tag,filename or "?")
+ local dataused, ok = data.used, false
+ for i=1,#definitions do
+ local definition = definitions[i]
+ if definition ~= "" then
+ if definition == "reset" then -- interfaces.variables.reset
+ if trace_patterns then
+ report_initialization("clearing patterns for language '%s'",tag)
+ end
+ instance:clear_patterns()
+ elseif not dataused[definition] then
+ dataused[definition] = definition
+ local filename = "lang-" .. definition .. ".lua"
+ local fullname = resolvers.findfile(filename) or ""
+ if fullname ~= "" then
+ if trace_patterns then
+ report_initialization("loading definition '%s' for language '%s' from '%s'",definition,tag,fullname)
+ end
+ local defs = dofile(fullname) -- use regular loader instead
+ if defs then -- todo: version test
+ ok, nofloaded = true, nofloaded + 1
+ instance:patterns (defs.patterns and defs.patterns.data or "")
+ instance:hyphenation(defs.exceptions and defs.exceptions.data or "")
+ else
+ report_initialization("invalid definition '%s' for language '%s' in '%s'",definition,tag,filename)
+ end
+ elseif trace_patterns then
+ report_initialization("invalid definition '%s' for language '%s' in '%s'",definition,tag,filename)
+ end
+ elseif trace_patterns then
+ report_initialization("definition '%s' for language '%s' already loaded",definition,tag)
+ end
+ end
end
- lang[target](data,"")
+ return ok
+ elseif trace_patterns then
+ report_initialization("no definitions for language '%s'",tag)
end
- langdata[tag] = data
statistics.stoptiming(languages)
- return ok
-end
-
-function languages.hyphenation.loadpatterns(tag, patterns)
- return loadthem(tag, patterns, filterpatterns, "patterns")
-end
-
-function languages.hyphenation.loadexceptions(tag, exceptions)
- return loadthem(tag, patterns, filterexceptions, "exceptions")
end
-function languages.hyphenation.exceptions(tag, ...)
- local data = record(tag)
- data:hyphenation(...)
-end
-
-function languages.hyphenation.hyphenate(tag, str)
- return lang.hyphenate(record(tag), str)
-end
-
-function languages.hyphenation.lefthyphenmin(tag, value)
- local data = record(tag)
- if value then data:lefthyphenmin(value) end
- return data:lefthyphenmin()
-end
-function languages.hyphenation.righthyphenmin(tag, value)
- local data = record(tag)
- if value then data:righthyphenmin(value) end
- return data:righthyphenmin()
-end
-
-function languages.hyphenation.n()
- return table.count(langdata)
-end
-
-languages.registered = languages.registered or { }
-languages.associated = languages.associated or { }
-languages.numbers = languages.numbers or { }
-
-storage.register("languages/registered",languages.registered,"languages.registered")
-storage.register("languages/associated",languages.associated,"languages.associated")
+storage.shared.noflanguages = storage.shared.noflanguages or 0
-local numbers = languages.numbers
-local registered = languages.registered
-local associated = languages.associated
+local noflanguages = storage.shared.noflanguages
--- we can speed this one up with locals if needed
-
-local function tolang(what)
- local kind = type(what)
- if kind == "number" then
- local w = what >= 0 and what <= 0x7FFF and numbers[what]
- return (w and langdata[w]) or 0
- elseif kind == "string" then
- return langdata[what]
- else
- return what
+function languages.define(tag,parent)
+ noflanguages = noflanguages + 1
+ if trace_patterns then
+ report_initialization("assigning number %s to %s",noflanguages,tag)
end
+ numbers[noflanguages] = tag
+ registered[tag] = {
+ tag = tag,
+ parent = parent or "",
+ patterns = "",
+ loaded = false,
+ used = { },
+ dirty = true,
+ number = noflanguages,
+ instance = nil, -- luatex data structure
+ synonyms = { },
+ }
+ storage.shared.noflanguages = noflanguages
end
-function languages.setup(what,settings)
- what = languages.tolang(what or tex.language)
- local lefthyphen = settings.lefthyphen
- local righthyphen = settings.righthyphen
- lefthyphen = lefthyphen ~= "" and lefthyphen or nil
- righthyphen = righthyphen ~= "" and righthyphen or nil
- lefthyphen = lefthyphen and utfbyte(lefthyphen) or 0
- righthyphen = righthyphen and utfbyte(righthyphen) or 0
- lang.posthyphenchar(what,lefthyphen)
- lang.prehyphenchar (what,righthyphen)
- lang.postexhyphenchar(what,lefthyphen)
- lang.preexhyphenchar (what,righthyphen)
+function languages.synonym(synonym,tag) -- convenience function
+ local l = registered[tag]
+ if l then
+ l.synonyms[synonym] = true -- maybe some day more info
+ end
end
-function languages.prehyphenchar(what)
- return lang.prehyphenchar(tolang(what))
+function languages.installed(separator)
+ context(concat(table.sortedkeys(registered),separator or ","))
end
-function languages.posthyphenchar(what)
- return lang.posthyphenchar(tolang(what))
-end
-
-languages.tolang = tolang
-function languages.register(tag,parent,patterns,exceptions)
- parent = parent or tag
- registered[tag] = {
- parent = parent,
- patterns = patterns or format("lang-%s.pat",parent),
- exceptions = exceptions or format("lang-%s.hyp",parent),
- loaded = false,
- number = 0,
- }
+function languages.current(n)
+ return numbers[n and tonumber(n) or tex.language]
end
-function languages.associate(tag,script,language)
+function languages.associate(tag,script,language) -- not yet used
associated[tag] = { script, language }
end
-function languages.association(tag)
+function languages.association(tag) -- not yet used
if type(tag) == "number" then
tag = numbers[tag]
end
@@ -221,84 +193,143 @@ function languages.association(tag)
end
end
-function languages.loadable(tag)
- local l = registered[tag]
- if l and l.patterns and resolvers.find_file(patterns) then
+function languages.loadable(tag,defaultlanguage) -- hack
+ local l = registered[tag] -- no synonyms
+ if l and resolvers.findfile("lang-"..l.patterns..".lua") then
return true
else
return false
end
end
-languages.share = false -- we don't share language numbers
+-- a bit messy, we will do all language setting in lua as we can now assign
+-- and 'patterns' will go away here.
-function languages.enable(tags)
- -- beware: we cannot set tex.language, but need tex.normallanguage
- for i=1,#tags do
- local tag = tags[i]
+function languages.setdirty(tag)
+ local l = registered[tag]
+ if l then
+ l.dirty = true
+ end
+end
+
+if environment.initex then
+
+ function languages.getnumber()
+ return 0
+ end
+
+ function commands.languagenumber()
+ texwrite(0)
+ end
+
+else
+
+ local function getnumber(tag,default,patterns)
local l = registered[tag]
- if l and l ~= "" then
- if not l.loaded then
- local tag = l.parent
- local number = languages.hyphenation.number(tag)
- if languages.share and number > 0 then
- l.number = number
- else
- -- we assume the same filenames
- l.number = languages.hyphenation.define(tag)
- languages.hyphenation.loadpatterns(tag,l.patterns)
- languages.hyphenation.loadexceptions(tag,l.exceptions)
- numbers[l.number] = tag
- end
- l.loaded = true
+ if l then
+ if l.dirty then
if trace_patterns then
- logs.report("languages","assigning number %s",l.number)
+ report_initialization("checking patterns for %s (%s)",tag,default)
end
+ -- patterns is already resolved to parent patterns if applicable
+ if patterns and patterns ~= "" then
+ if l.patterns ~= patterns then
+ l.patterns = patterns
+ if trace_patterns then
+ report_initialization("loading patterns for '%s' using specification '%s'",tag,patterns)
+ end
+ loaddefinitions(tag,l)
+ else
+ -- unchanged
+ end
+ elseif l.patterns == "" then
+ l.patterns = tag
+ if trace_patterns then
+ report_initialization("loading patterns for '%s' using tag",tag)
+ end
+ local ok = loaddefinitions(tag,l)
+ if not ok and tag ~= default then
+ l.patterns = default
+ if trace_patterns then
+ report_initialization("loading patterns for '%s' using default",tag)
+ end
+ loaddefinitions(tag,l)
+ end
+ end
+ l.loaded = true
+ l.dirty = false
end
- if l.number > 0 then
- return l.number
- end
+ return l.number
+ else
+ return 0
end
end
- return 0
+
+ languages.getnumber = getnumber
+
+ function commands.languagenumber(tag,default,patterns)
+ texwrite(getnumber(tag,default,patterns))
+ end
+
end
+-- not that usefull, global values
+
+function languages.prehyphenchar (what) return prehyphenchar (tolang(what)) end
+function languages.posthyphenchar(what) return posthyphenchar(tolang(what)) end
+function languages.lefthyphenmin (what) return lefthyphenmin (tolang(what)) end
+function languages.righthyphenmin(what) return righthyphenmin(tolang(what)) end
+
-- e['implementer']= 'imple{m}{-}{-}menter'
-- e['manual'] = 'man{}{}{}'
-- e['as'] = 'a-s'
-- e['user-friendly'] = 'user=friend-ly'
-- e['exceptionally-friendly'] = 'excep-tionally=friend-ly'
-function languages.hyphenation.loadwords(tag, filename)
- local id = languages.hyphenation.number(tag)
- if id > 0 then
- local l = lang.new(id) or 0
+function languages.loadwords(tag,filename)
+ local data, instance = resolve(tag)
+ if data then
statistics.starttiming(languages)
- local data = io.loaddata(filename) or ""
- l:hyphenation(data)
+ instance:hyphenation(io.loaddata(filename) or "")
statistics.stoptiming(languages)
end
end
-languages.hyphenation.define ("zerolanguage")
-languages.hyphenation.loadpatterns ("zerolanguage") -- else bug
-languages.hyphenation.loadexceptions("zerolanguage") -- else bug
+function languages.exceptions(tag,str)
+ local data, instance = resolve(tag)
+ if data then
+ instance:hyphenation(string.strip(str)) -- we need to strip leading spaces
+ end
+end
+
+function languages.hyphenate(tag,str)
+ -- todo: does this still work?
+ local data, instance = resolve(tag)
+ if data then
+ return instance:hyphenate(str)
+ else
+ return str
+ end
+end
+
+--~ hyphenation.define ("zerolanguage")
+--~ hyphenation.loadpatterns ("zerolanguage") -- else bug
+--~ hyphenation.loadexceptions("zerolanguage") -- else bug
languages.logger = languages.logger or { }
function languages.logger.report()
- local result = { }
+ local result, r = { }, 0
local sorted = table.sortedkeys(registered)
for i=1,#sorted do
local tag = sorted[i]
local l = registered[tag]
if l.loaded then
- local p = (l.patterns and "pat") or '-'
- local e = (l.exceptions and "exc") or '-'
- result[#result+1] = format("%s:%s:%s:%s:%s", tag, l.parent, p, e, l.number)
+ r = r + 1
+ result[r] = format("%s:%s:%s", tag, l.parent, l.number)
end
end
- return (#result > 0 and concat(result," ")) or "none"
+ return (r > 0 and concat(result," ")) or "none"
end
-- must happen at the tex end
@@ -317,5 +348,63 @@ statistics.register("loaded patterns", function()
end)
statistics.register("language load time", function()
- return statistics.elapsedseconds(languages, format(", n=%s",languages.hyphenation.n()))
+ return statistics.elapsedseconds(languages, format(", nofpatterns: %s",nofloaded))
end)
+
+--~ -- obsolete
+--~ --
+--~ -- loading the 26 languages that we normally load in mkiv, the string based variant
+--~ -- takes .84 seconds (probably due to the sub's) while the lpeg variant takes .78
+--~ -- seconds
+--~ --
+--~ -- the following lpeg can probably be improved (it was one of the first I made)
+
+--~ local leftbrace = lpeg.P("{")
+--~ local rightbrace = lpeg.P("}")
+--~ local spaces = lpeg.S(" \r\n\t\f")
+--~ local spacing = spaces^0
+--~ local validchar = 1-(spaces+rightbrace+leftbrace)
+--~ local validword = validchar^1
+--~ local content = spacing * leftbrace * spacing * lpeg.C((spacing * validword)^0) * spacing * rightbrace * lpeg.P(true)
+--~
+--~ local command = lpeg.P("\\patterns")
+--~ local parser = (1-command)^0 * command * content
+--~
+--~ local function filterpatterns(filename)
+--~ return lpegmatch(parser,io.loaddata(resolvers.findfile(filename)) or "")
+--~ end
+--~
+--~ local command = lpeg.P("\\hyphenation")
+--~ local parser = (1-command)^0 * command * content
+--~
+--~ local function filterexceptions(filename)
+--~ return lpegmatch(parser,io.loaddata(resolvers.findfile(filename)) or "") -- "" ?
+--~ end
+--~
+--~ local function loadthem(tag, filename, filter, target)
+--~ statistics.starttiming(languages)
+--~ local data, instance = resolve(tag)
+--~ local fullname = (filename and filename ~= "" and resolvers.findfile(filename)) or ""
+--~ local ok = fullname ~= ""
+--~ if ok then
+--~ if trace_patterns then
+--~ report_initialization("filtering %s for language '%s' from '%s'",target,tag,fullname)
+--~ end
+--~ lang[target](data,filter(fullname) or "")
+--~ else
+--~ if trace_patterns then
+--~ report_initialization("no %s for language '%s' in '%s'",target,tag,filename or "?")
+--~ end
+--~ lang[target](instance,"")
+--~ end
+--~ statistics.stoptiming(languages)
+--~ return ok
+--~ end
+--~
+--~ function hyphenation.loadpatterns(tag, patterns)
+--~ return loadthem(tag, patterns, filterpatterns, "patterns")
+--~ end
+--~
+--~ function hyphenation.loadexceptions(tag, exceptions)
+--~ return loadthem(tag, exceptions, filterexceptions, "exceptions")
+--~ end
diff --git a/Master/texmf-dist/tex/context/base/lang-ini.mkii b/Master/texmf-dist/tex/context/base/lang-ini.mkii
index 91ac5984767..50a3689cfb3 100644
--- a/Master/texmf-dist/tex/context/base/lang-ini.mkii
+++ b/Master/texmf-dist/tex/context/base/lang-ini.mkii
@@ -265,7 +265,7 @@
\fi
\egroup}
-\fetchruntimecommand \showpatterns {\f!languageprefix\s!run.mkii}
+\fetchruntimecommand \showpatterns {\f!languageprefix\s!run}
%D Since we can only load patterns in ini\TeX, we nil the
%D loading before dumping (which saves a bit of memory, but
diff --git a/Master/texmf-dist/tex/context/base/lang-ini.mkiv b/Master/texmf-dist/tex/context/base/lang-ini.mkiv
index 45bb71b85d9..5dccab4dc82 100644
--- a/Master/texmf-dist/tex/context/base/lang-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/lang-ini.mkiv
@@ -13,6 +13,8 @@
%D This module needs a further cleanup (real split between ii/iv).
+% \ctxlua{tex.sprint(languages.numbers[tex.count.mainlanguagenumber])}
+
%D This module implements the (for the moment still simple)
%D multi||language support of \CONTEXT, which should not be
%D confused with the multi||lingual interface. This support
@@ -21,6 +23,7 @@
\writestatus{loading}{ConTeXt Language Macros / Initialization}
\registerctxluafile{lang-ini}{1.001}
+\registerctxluafile{lang-def}{1.001}
\unprotect
@@ -73,6 +76,34 @@
\let\currentlanguage \empty
\let\currentmainlanguage\empty
+%D \macros
+%D {defaultlanguage,languageparameter,specificlanguageparameter}
+
+\def\defaultlanguage#1%
+ {\ifcsname\??la#1\s!default\endcsname
+ \expandafter\defaultlanguage\csname\??la#1\s!default\endcsname
+ \else
+ #1%
+ \fi}
+
+\def\languageparameter#1%
+ {\ifcsname\??la\currentlanguage#1\endcsname
+ \csname\??la\currentlanguage#1\endcsname
+ \else\ifcsname\??la\currentlanguage\s!default\endcsname
+ \expandafter\specificlanguageparameter\csname\??la\currentlanguage\s!default\endcsname{#1}%
+ \else\ifcsname\??la\s!default#1\endcsname
+ \csname\??la\s!default#1\endcsname
+ \fi\fi\fi}
+
+\def\specificlanguageparameter#1#2%
+ {\ifcsname\??la#1#2\endcsname
+ \csname\??la#1#2\endcsname
+ \else\ifcsname\??la#1\s!default\endcsname
+ \expandafter\specificlanguageparameter\csname\??la#1\s!default\endcsname{#2}%
+ \else\ifcsname\??la\s!default#2\endcsname
+ \csname\??la\s!default#2\endcsname
+ \fi\fi\fi}
+
\unexpanded\def\setupcurrentlanguage[#1]{\setcurrentlanguage\currentmainlanguage{#1}}
\def\setcurrentlanguage#1#2% sets modes: **id (currentmain) *id (current)
@@ -123,10 +154,10 @@
%D implementations support run time addition of patterns to a
%D preloaded format).
-\def\dodoinstalllanguage#1#2% #2 added
- {\expanded{\noexpand\uppercase{\noexpand\edef\noexpand\ascii{#1}}}%
- \ifcsname #1\endcsname\else\setvalue {#1}{\complexlanguage[#2]}\fi
- \ifcsname\ascii\endcsname\else\setvalue\ascii{\complexlanguage[#2]}\fi}
+% move to lua end
+
+\def\dodoinstalllanguage#1#2%
+ {\ifcsname#1\endcsname\else\setuvalue{#1}{\complexlanguage[#2]}\fi}
%D \macros
%D {preloadlanguages}
@@ -137,47 +168,31 @@
%D reports which patterns are loaded and what hyphenmin
%D values are set.
-\let\installedlanguages\empty
+\newtoks \everysetuplanguage
-\def\doiflanguageelse#1{\doifdefinedelse{\??la#1\c!state}}
+\def\installedlanguages{\ctxlua{languages.installed()}}
-\def\doloadpatterns#1#2%
- {\ctxlua{languages.register(
- "#1",
- "#2",
- "\truefilename{\f!languageprefix#2.\f!patternsextension}",
- "\truefilename{\f!languageprefix#2.\f!hyphensextension }")
- }}
-
-\def\doloadlanguagefiles#1%
- {\edef\languagesuffix{\specificlanguageparameter{#1}\s!patterns}%
- \ifx\languagesuffix\empty
- \edef\languagesuffix{\defaultlanguage{#1}}%
- \else\ifx\languagesuffix\relax
- \edef\languagesuffix{\defaultlanguage{#1}}%
- \fi\fi
- \ifx\languagesuffix\empty
- \edef\languagesuffix{#1}%
- \fi
- \doloadpatterns{#1}\languagesuffix}
+\def\doiflanguageelse#1{\doifdefinedelse{\??la#1\c!state}}
\def\doinstalllanguage[#1][#2]%
{\doifassignmentelse{#2}
{\doiflanguageelse{#1}
{\getparameters[\??la#1][#2]}
{\setvalue{\l!prefix!#1}{#1}%
- \addtocommalist{#1}\installedlanguages
\dodoinstalllanguage{#1}{#1}%
\getparameters[\??la#1][\c!state=\v!start,#2]}%
- \doloadlanguagefiles{#1}}
+ \edef\currentsetuplanguage{#1}%
+ \ctxlua{languages.define("#1","\specificlanguageparameter{#1}\s!default")}%
+ \the\everysetuplanguage}
{\setvalue{\l!prefix!#1}{#2}%
- \getparameters[\??la#1][\s!default=#2]%
+ \ctxlua{languages.synonym("#1","#2")}%
+ %\getparameters[\??la#1][\s!default=#2]%
\dodoinstalllanguage{#1}{#2}}}
\def\reallanguagetag#1%
{\ifcsname\l!prefix!#1\endcsname\csname\l!prefix!#1\endcsname\else#1\fi}
-% ^^ \language[#1] gave unwanted side effect of loading language specifics
+% \language[#1] gave unwanted side effect of loading language specifics
\def\installlanguage
{\dodoubleargument\doinstalllanguage}
@@ -188,7 +203,13 @@
%D conform a standard.
\def\doifpatternselse#1%
- {\ctxlua{cs.testcase(languages.loadable("#1"))}}
+ {\bgroup % will change
+ \language[#1]%
+ \ifnum\normallanguage>\zerocount
+ \bgroup\expandafter\firstoftwoarguments
+ \else
+ \bgroup\expandafter\secondoftwoarguments
+ \fi}
%D \macros
%D {setuplanguage}
@@ -202,24 +223,40 @@
\unexpanded\def\setuplanguage
{\dodoubleempty\dosetuplanguage}
-\def\dosetuplanguage[#1][#2]% handy patch for testing
+\ifdefined\docomplexlanguage \else \let\docomplexlanguage\relax \fi
+
+\def\dosetuplanguage[#1][#2]%
{\ifsecondargument
- \getparameters[\??la#1][#2]%
- \doif{#1}\currentlanguage\docomplexlanguage
+ \pushmacro\currentlanguage % can be default
+ \edef\currentsetuplanguage{\reallanguagetag{#1}}%
+ \getparameters[\??la\currentsetuplanguage][#2]%
+ \the\everysetuplanguage
+ \popmacro\currentlanguage
+ %\doif\currentsetuplanguage\currentlanguage we can have influenced inheritance (default)
+ \docomplexlanguage
\else
- \getparameters[\??la\currentlanguage][#1]%
+ \let\currentsetuplanguage\currentlanguage
+ \getparameters[\??la\currentsetuplanguage][#1]%
+ \the\everysetuplanguage
\docomplexlanguage
\fi}
+\appendtoks
+ \ctxlua{languages.setdirty("\currentsetuplanguage")}%
+\to \everysetuplanguage
+
\setuplanguage
[\s!default]
- [\s!lefthyphenmin=2,
+ [\s!patterns=,
+ \s!lefthyphenmin=2,
\s!righthyphenmin=2,
- \s!patterns=,
- \c!spacing=\v!packed,
+ \s!lefthyphenchar=-1,
+ \s!righthyphenchar=45,
+ % used in compound i.e. interfaced with c! and can be anything so no numbers
\c!lefthyphen=,
\c!righthyphen=-,
\c!hyphen=-,
+ \c!spacing=\v!packed,
\c!midsentence=---,
\c!leftsentence=---,
\c!rightsentence=---,
@@ -244,6 +281,12 @@
\c!rightcompoundhyphen=\compoundhyphen,
\c!leftcompoundhyphen=]
+% to be tested:
+%
+% \setuplanguage
+% [\s!default]
+% [\c!righthyphenchar="AD]
+
%D The values \type {leftsentence} and \type
%D {rightsentence} can be (and are) used to implement
%D automatic subsentence boundary glyphs, like in {\fr
@@ -301,38 +344,30 @@
%D We take care of local as well as standardized language
%D switching (fr and fa, de and du, but nl and nl).
-\def\dosetnormallanguage#1#2% current default
- {\edef\askedlanguagepatterns{\specificlanguageparameter{#1}\s!patterns}%
- \normallanguage=\ctxlua{tex.sprint(languages.enable({"\askedlanguagepatterns","#1","#2"}))}%
- \ifproductionrun
- \setxvalue{\??la\??la#1#2}{\number\normallanguage}%
- \fi}
-
-\def\setnormallanguage#1#2% current default / we can freeze the number here
- {\ifcsname\??la\??la#1#2\endcsname
- \normallanguage\csname\??la\??la#1#2\endcsname % todo: we can set language at the lua end now
- \else
- \dosetnormallanguage{#1}{#2}%
- \fi}
-
\newtoks \everylanguage
-\def\sethyphenationvariables % as we can have cloning we need to set it each time, unless we move all to lua
- {\ctxlua{languages.setup(tex.language, {
- lefthyphen = "\languageparameter\c!lefthyphen",
- righthyphen = "\languageparameter\c!righthyphen",
- } )}%
- \lefthyphenmin \numexpr0\languageparameter\s!lefthyphenmin +\hyphenminoffset\relax
- \righthyphenmin\numexpr0\languageparameter\s!righthyphenmin+\hyphenminoffset\relax}
-
-\def\docomplexlanguage% assumes that \currentlanguage is set
- {\edef\currentdefaultlanguage{\defaultlanguage\currentlanguage}%
- \setnormallanguage\currentlanguage\currentdefaultlanguage
- \the\everylanguage
- \sethyphenationvariables
- \relax
- % will be definable and move to core-spa !
- \doifelse{\languageparameter\c!spacing}\v!broad\nonfrenchspacing\frenchspacing}
+\def\docomplexlanguage% assumes that \currentlanguage is set % % % use different name as complex
+ {\normallanguage\ctxlua{commands.languagenumber(%
+ "\currentlanguage",%
+ "\defaultlanguage\currentlanguage",%
+ "\languageparameter\s!patterns"%
+ )}\relax
+ \the\everylanguage\relax}
+
+\appendtoks
+ % these values are stored along with glyph nodes
+ \lefthyphenmin \numexpr0\languageparameter\s!lefthyphenmin +\hyphenminoffset\relax
+ \righthyphenmin\numexpr0\languageparameter\s!righthyphenmin+\hyphenminoffset\relax
+ % these values are stored with the language (global!)
+ \prehyphenchar \languageparameter\s!righthyphenchar\relax
+ \posthyphenchar\languageparameter\s!lefthyphenchar \relax
+\to \everylanguage
+
+% this will move to core-spa !
+
+\appendtoks
+ \doifelse{\languageparameter\c!spacing}\v!broad\nonfrenchspacing\frenchspacing
+\to \everylanguage
% \mainlanguage[nl] \setuplanguage[nl][lefthyphen=,righthyphen=?]
%
@@ -352,7 +387,7 @@
\docomplexlanguage
\fi
\else
- \showmessage\m!linguals6{#1}%
+ \showmessage\m!languages6{#1}%
\fi
\fi}
@@ -360,6 +395,8 @@
\definecomplexorsimple\language
+\newcount\mainlanguagenumber
+
\def\mainlanguage[#1]%
{\edef\askedlanguage{#1}%
\ifx\askedlanguage\empty \else
@@ -376,35 +413,8 @@
\docomplexlanguage
\fi
\fi
- \fi}
-
-%D \macros
-%D {defaultlanguage,languageparameter,specificlanguageparameter}
-
-\def\defaultlanguage#1%
- {\ifcsname\??la#1\s!default\endcsname
- \expandafter\defaultlanguage\csname\??la#1\s!default\endcsname
- \else
- #1%
- \fi}
-
-\def\languageparameter#1%
- {\ifcsname\??la\currentlanguage#1\endcsname
- \csname\??la\currentlanguage#1\endcsname
- \else\ifcsname\??la\currentlanguage\s!default\endcsname
- \expandafter\specificlanguageparameter\csname\??la\currentlanguage\s!default\endcsname{#1}%
- \else\ifcsname\??la\s!default#1\endcsname
- \csname\??la\s!default#1\endcsname
- \fi\fi\fi}
-
-\def\specificlanguageparameter#1#2%
- {\ifcsname\??la#1#2\endcsname
- \csname\??la#1#2\endcsname
- \else\ifcsname\??la#1\s!default\endcsname
- \expandafter\specificlanguageparameter\csname\??la#1\s!default\endcsname{#2}%
- \else\ifcsname\??la\s!default#2\endcsname
- \csname\??la\s!default#2\endcsname
- \fi\fi\fi}
+ \fi
+ \mainlanguagenumber\normallanguage}
%D New (see nomarking and nolist):
@@ -422,19 +432,11 @@
%D {\blank
%D \startlinecorrection
%D \vbox\bgroup
-%D \language[#1]%
-%D \setbox0=\hbox to \hsize{\hss\bf#2 subsentence symbol and quotes\hss}
-%D \dp0=0pt
-%D \box0
-%D \vskip.5em
-%D \hrule
-%D \vskip.5em
-%D \let\normalbar=|
-%D \hbox to \hsize
+%D \language[#1]
+%D \midaligned{\bf#2 subsentence symbol and quotes}
+%D \framed[width=\hsize,frame=off,topframe=on,bottomframe=on,offset=.5ex]
%D {\hfil\quotation{#3 #4}\hfil\quote{#2}\hfil
-%D \let|=\normalbar\strut|<||<|#3|>|#4|>|\hfil}
-%D \vskip.5em
-%D \hrule
+%D \startsubsentence\startsubsentence#3\stopsubsentence#4\stopsubsentence\hfil}
%D \egroup
%D \stoplinecorrection
%D \blank}
@@ -531,9 +533,6 @@
%D \stoptable
%D \protect
-% \bgroup \normallanguage255 \patterns{} \egroup
-% \def\nopatterns{\normallanguage255 }
-
\def\nopatterns{\normallanguage\minusone}
%D We default to the language belonging to the interface. This
@@ -546,15 +545,27 @@
\def\initializemainlanguage
{\mainlanguage[\currentlanguage]%
- \showmessage\m!linguals9\currentlanguage}
+ \showmessage\m!languages9\currentlanguage}
+
+%D New:
-%D Might be in use:
+\let\stopexceptions\relax
-\let\preloadallpatterns\relax % just for old times sake
-\let\preloadlanguages \relax % just for old times sake
+\unexpanded\def\startexceptions
+ {\dosingleempty\dostartexceptions}
+
+\long\def\dostartexceptions[#1]#2\stopexceptions % multilingual or not?
+ {\begingroup
+ \edef\askedlanguage{\reallanguagetag{#1}}%
+ \ifx\askedlanguage\empty
+ \let\askedlanguage\currentlanguage
+ \fi
+ \ctxlua{languages.exceptions("\askedlanguage",\!!bs#2\!!es)}%
+ \endgroup}
-\uchyph=1
+%D For the moment here:
+\uchyph = 1 % also treat uppercase
\exhyphenchar=45 % to permit breaking at explicit hyphens
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/lang-ita.tex b/Master/texmf-dist/tex/context/base/lang-ita.mkii
index 03efb0614fe..03efb0614fe 100644
--- a/Master/texmf-dist/tex/context/base/lang-ita.tex
+++ b/Master/texmf-dist/tex/context/base/lang-ita.mkii
diff --git a/Master/texmf-dist/tex/context/base/lang-lab.lua b/Master/texmf-dist/tex/context/base/lang-lab.lua
new file mode 100644
index 00000000000..1947616a99c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lang-lab.lua
@@ -0,0 +1,130 @@
+if not modules then modules = { } end modules ['lang-lab'] = {
+ version = 1.001,
+ comment = "companion to lang-lab.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--~ local function complete()
+--~ local function process(what)
+--~ for tag, data in next, what do
+--~ for k, v in next, data.labels do
+--~ languages[k] = true
+--~ end
+--~ end
+--~ end
+--~ process(languages.labels.data.titles)
+--~ process(languages.labels.data.texts)
+--~ process(languages.labels.data.functions)
+--~ process(languages.labels.data.tags)
+--~ local function process(what)
+--~ for tag, data in next, what do
+--~ local labels = data.labels
+--~ for k, v in next, languages do
+--~ if not labels[k] then
+--~ labels[k] = ""
+--~ end
+--~ end
+--~ end
+--~ end
+--~ process(languages.data.labels.titles)
+--~ process(languages.data.labels.texts)
+--~ process(languages.data.labels.functions)
+--~ process(languages.data.labels.tags)
+--~ end
+--~
+--~ local function strip(default)
+--~ local function process(what)
+--~ for tag, data in next, what do
+--~ local labels = data.labels
+--~ for k, v in next, labels do
+--~ if v == "" then
+--~ labels[k] = default
+--~ end
+--~ end
+--~ end
+--~ end
+--~ process(languages.data.labels.titles)
+--~ process(languages.data.labels.texts)
+--~ process(languages.data.labels.functions)
+--~ process(languages.data.labels.tags)
+--~ end
+--~
+--~ complete()
+--~ strip(false)
+--~ strip()
+
+--~ table.print(languages.data.labels,"languages.data.labels",false,true,true)
+
+-- this will move
+
+local format, find = string.format, string.find
+local next, rawget, type = next, rawget, type
+local texsprint = tex.sprint
+local prtcatcodes = tex.prtcatcodes
+
+languages.labels = languages.labels or { }
+
+local trace_labels = false trackers.register("languages.labels", function(v) trace_labels = v end)
+
+local report_labels = logs.reporter("languages","labels")
+
+function languages.labels.define()
+ local variables = interfaces.variables
+ local data = languages.data.labels
+ local function define(command,list,prefixed)
+ if list then
+ for tag, data in next, list do
+ if data.hidden then
+ -- skip
+ else
+ for language, text in next, data.labels do
+ if text == "" then
+ -- skip
+ elseif prefixed and rawget(variables,tag) then
+ if type(text) == "table" then
+ texsprint(prtcatcodes,format("\\%s[%s][\\v!%s={{%s},{%s}}]",command,language,tag,text[1],text[2]))
+ else
+ texsprint(prtcatcodes,format("\\%s[%s][\\v!%s={{%s},}]",command,language,tag,text))
+ end
+ else
+ if type(text) == "table" then
+ texsprint(prtcatcodes,format("\\%s[%s][%s={{%s},{%s}}]",command,language,tag,text[1],text[2]))
+ else
+ texsprint(prtcatcodes,format("\\%s[%s][%s={{%s},}]",command,language,tag,text))
+ end
+ end
+ if trace_labels then
+ if type(text) == "table" then
+ report_labels("language '%s', defining label '%s' as '%s' and '%s'",language,tag,text[1],text[2])
+ else
+ report_labels("language '%s', defining label '%s' as '%s'",language,tag,text)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ define("setupheadtext", data.titles, true)
+ define("setuplabeltext", data.texts, true)
+ define("setupmathlabeltext", data.functions)
+ define("setuptaglabeltext", data.tags)
+end
+
+--~ function languages.labels.check()
+--~ for category, list in next, languages.data.labels do
+--~ for tag, specification in next, list do
+--~ for language, text in next, specification.labels do
+--~ if type(text) == "string" and find(text,",") then
+--~ report_labels("label with comma: category '%s', language '%s', tag '%s', text '%s'",
+--~ category, language, tag, text)
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~
+--~ languages.labels.check()
+
diff --git a/Master/texmf-dist/tex/context/base/lang-lab.mkiv b/Master/texmf-dist/tex/context/base/lang-lab.mkiv
index 42f2db8ff45..025958ade6a 100644
--- a/Master/texmf-dist/tex/context/base/lang-lab.mkiv
+++ b/Master/texmf-dist/tex/context/base/lang-lab.mkiv
@@ -11,8 +11,16 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+\writestatus{loading}{ConTeXt Language Macros / Labels}
+
+\registerctxluafile{lang-lab}{1.001}
+\registerctxluafile{lang-txt}{1.001}
+
\unprotect
+%C The UPPERCASE variants are obsolete as we can now use \WORD
+%C in an non-interfering way.
+
%D In this module we deal with language dependant labels and
%D prefixes, like in {\em Figure~12} and {\em Chapter 1}. In
%D this file we set the default values. Users can easily
@@ -28,6 +36,9 @@
%D in front as well as after a part number. This is why the
%D current implementation of labels supports two labels too.
+\ifdefined\simplifiedcommands \else \newtoks\simplifiedcommands \fi
+\ifdefined\Word \else \let\Word\relax \fi
+
%D \macros
%D {setupheadtext, setuplabeltext}
%D
@@ -38,18 +49,138 @@
%D \showsetup{setuplabeltext}
%D
%D A regular \CONTEXT\ stores some 1500 labels at most.
+%D
+%D These commands accept all kind of inputs:
+%D
+%D \starttyping
+%D \setuplabeltext [language] [labellabel=text]
+%D \setuplabeltext [language] [labellabel=text,labellabel=text,...]
+%D \setuplabeltext [labellabel=text]
+%D \setuplabeltext [labellabel=text,labellabel=text,...]
+%D \stoptyping
+%D
+%D The last two cases concern the current language.
+
+\def\definelabelclass
+ {\dodoubleempty\dodefinelabelclass}
+
+\def\dodefinelabelclass[#1][#2]%
+ {\normalexpanded
+ {\noexpand\dododefinelabelclass
+ {#1}%
+ {\ifsecondargument#2\else\zerocount\fi}%
+ \expandafter\noexpand\csname dogetupsome#1text\endcsname
+ \expandafter\noexpand\csname #1language\endcsname
+ \expandafter\noexpand\csname dodogetupsome#1text\endcsname
+ \expandafter\noexpand\csname left#1text\endcsname
+ \expandafter\noexpand\csname right#1text\endcsname
+ \expandafter\noexpand\csname #1texts\endcsname
+ \expandafter\noexpand\csname #1text\endcsname}}
+
+\let\currentlabelcategory\empty
+
+\def\dododefinelabelclass#1#2#3#4#5#6#7#8#9%
+ {\setuvalue{setup#1text}{\protecttextprefixes#2\def\currenttextprefixclass{#1}\dodoubleempty\dosetupsometextprefix}%
+ \setuvalue{preset#1text}{\protecttextprefixes1\def\currenttextprefixclass{#1}\dodoubleempty\dosetupsometextprefix}%
+ \def#4{\reallanguagetag{\defaultlanguage\currentmainlanguage}}%
+ \ifnum#2=\plustwo
+ \def#3{#5#4}%
+% \def#5##1##2% ##1=language
+% {\ifcsname\??ml:#1:##1:##2\endcsname
+% \csname\??ml:#1:##1:##2\endcsname
+% \else\ifcsname\??la#4\s!default\endcsname
+% \expandafter#5\csname\??la#4\s!default\endcsname{##2}%
+% \else\ifcsname\??ml:#1:##2\endcsname
+% \csname\??ml:#1:##2\endcsname
+% \else\ifcsname\??ml:#1:\s!en:##2\endcsname
+% \csname\??ml:#1:\s!en:##2\endcsname
+% \else
+% ##2%
+% \fi\fi\fi\fi}%
+ \def#5##1##2% ##1=language
+ {\ifcsname\??ml:\currentlabelcategory#1:##1:##2\endcsname
+ \csname\??ml:\currentlabelcategory#1:##1:##2\endcsname
+ \else\ifcsname\??ml:#1:##1:##2\endcsname
+ \csname\??ml:#1:##1:##2\endcsname
+ \else\ifcsname\??la#4\s!default\endcsname
+ \expandafter#5\csname\??la#4\s!default\endcsname{##2}%
+ \else\ifcsname\??ml:\currentlabelcategory#1:##2\endcsname
+ \csname\??ml:\currentlabelcategory#1:##2\endcsname
+ \else\ifcsname\??ml:#1:##2\endcsname
+ \csname\??ml:#1:##2\endcsname
+ \else\ifcsname\??ml:\currentlabelcategory#1:\s!en:##2\endcsname
+ \csname\??ml:\currentlabelcategory#1:\s!en:##2\endcsname
+ \else\ifcsname\??ml:#1:\s!en:##2\endcsname
+ \csname\??ml:#1:\s!en:##2\endcsname
+ \else
+ ##2%
+ \fi\fi\fi\fi\fi\fi\fi}%
+ \let#6\gobbleoneargument
+ \let#7\gobbleoneargument
+ \let#8\gobbletwoarguments
+ \let#9#3%
+ \else
+ \unexpanded\def#3{#5#4}%
+ \unexpanded\def#5##1##2%
+ {\ifcsname\??ml:#1:##1:##2\endcsname
+ \expandafter\let\expandafter\thetextprefix\csname\??ml:#1:##1:##2\endcsname
+ \else\ifcsname\??la#4\s!default\endcsname
+ \expandafter#5\csname\??la#4\s!default\endcsname{##2}%
+ \else\ifcsname\??ml:#1:##2\endcsname
+ \expandafter\let\expandafter\thetextprefix\csname\??ml:#1:##2\endcsname
+ \else\ifcsname\??ml:#1:\s!en:##2\endcsname
+ \expandafter\let\expandafter\thetextprefix\csname\??ml:#1:\s!en:##2\endcsname
+ \else
+ \let\thetextprefix\dummytextprefix
+ \fi\fi\fi\fi}%
+ \unexpanded\def#6##1{#3{##1}\expandafter\flushleftlabelclass \thetextprefix}%
+ \unexpanded\def#7##1{#3{##1}\expandafter\flushrightlabelclass\thetextprefix}%
+ \unexpanded\def#8##1{#3{##1}\expandafter\flushbothlabelclass \thetextprefix}% #2
+ \unexpanded\def#9##1{#3{##1}\expandafter\flushleftlabelclass \thetextprefix}%
+ \fi
+ \appendtoks
+ \let#6\firstofoneargument % to be checked
+ \let#7\firstofoneargument % to be checked
+ \let#8\firstofoneargument % to be checked
+ \let#9\firstofoneargument % to be checked
+ \to \simplifiedcommands
+ }
+
+\let\flushleftlabelclass \firstoftwoarguments
+\let\flushrightlabelclass\secondoftwoarguments
+\def\flushbothlabelclass #1#2#3{#1#3#2}
+\def\dummytextprefix {\empty\empty}
+
+%D \macros
+%D {headtext,
+%D labeltext, leftlabeltext, rightlabeltext, labeltexts,
+%D LABELTEXT, LEFTLABELTEXT, RIGHTLABELTEXT, LABELTEXTS}
+%D
+%D Once defined, head and label texts can be called upon using:
+%D
+%D \showsetup{headtext}
+%D \showsetup{labeltext}
+%D
+%D The latter one has an upcased alternative \type{\LABELTEXT}.
+%D
+%D \macros
+%D {presetheadtext,presetlabeltext}
+%D
+%D These macros enable us to automatically define head and label
+%D texts without replacing predefined ones. They are internal macros.
-\let\handletextprefix\relax
+\definelabelclass [head] [0] % titles
+\definelabelclass [label] [0] % texts
+\definelabelclass [mathlabel] [0] % functions
+\definelabelclass [taglabel] [2] % tags
+
+\appendtoks \let\labellanguage\currentlanguage \to \everycurrentdate
-\newconditional\protecttextprefixes
+\newconstant\protecttextprefixes
\let\currenttextprefixtag \s!unknown
\let\currenttextprefixclass\s!unknown
-\unexpanded\def\setupheadtext {\setfalse\protecttextprefixes\let\currenttextprefixclass\??mh\dodoubleempty\dosetupsometextprefix}
-\unexpanded\def\setuplabeltext {\setfalse\protecttextprefixes\let\currenttextprefixclass\??ml\dodoubleempty\dosetupsometextprefix}
-\unexpanded\def\setupmathlabeltext{\setfalse\protecttextprefixes\let\currenttextprefixclass\??mm\dodoubleempty\dosetupsometextprefix}
-
\def\dosetupsometextprefix[#1][#2]%
{\ifsecondargument
\edef\currenttextprefixtag{\reallanguagetag{#1}}%
@@ -66,172 +197,44 @@
{\doassignsometextprefix{#1}[#2,,]}
\def\doassignsometextprefix#1%
- {\ifconditional\protecttextprefixes
- \ifcsname\currenttextprefixclass\currenttextprefixtag#1\endcsname
+ {\ifcase\protecttextprefixes
+ % no checking
+ \expandafter\doassignsometextprefixyes
+ \or
+ % checking
+ \ifcsname\??ml:\currenttextprefixclass:\currenttextprefixtag:#1\endcsname
\expandafter\expandafter\expandafter\doassignsometextprefixnop
\else
\expandafter\expandafter\expandafter\doassignsometextprefixyes
\fi
- \else
- \expandafter\doassignsometextprefixyes
+ \or
+ % simple assignment (a bit overkill but it fits in the whole)
+ \expandafter\doassignsometextprefixdumb
\fi{#1}}
-\ifdefined\Word\else \let\Word\relax \fi
-
-% Checking saves some 8K in the compressed format and getting rid of the embedded
-% \handletextprefix was good for another 6K. In the end the new solution is not
-% even that inefficient. And the checking is done at format generation time anyway.
-
\def\doassignsometextprefixyes#1[#2,#3,#4]%
{\edef\!!stringa{#2}%
\edef\!!stringb{#3}%
\ifx\!!stringb\empty
\ifx\!!stringa\empty
- \expandafter\def\csname\currenttextprefixclass\currenttextprefixtag#1\endcsname{\empty\empty}%
+ \expandafter\def\csname\??ml:\currenttextprefixclass:\currenttextprefixtag:#1\endcsname{\empty\empty}%
\else
- \expandafter\def\csname\currenttextprefixclass\currenttextprefixtag#1\endcsname{{#2}\empty}%
+ \expandafter\def\csname\??ml:\currenttextprefixclass:\currenttextprefixtag:#1\endcsname{{#2}\empty}%
\fi
\else
- \expandafter\def\csname\currenttextprefixclass\currenttextprefixtag#1\endcsname{{#2}{#3}}%
+ \expandafter\def\csname\??ml:\currenttextprefixclass:\currenttextprefixtag:#1\endcsname{{#2}{#3}}%
\fi}
\def\doassignsometextprefixnop#1[#2]%
{}
-%D By changing the meaning of \type {\handletextprefix} we
-%D can filter the left and right labeltext as well as convert
-%D labels to uppercase.
-%D
-%D These commands accept all kind of inputs:
-%D
-%D \starttyping
-%D \setuplabeltext [language] [labellabel=text]
-%D \setuplabeltext [language] [labellabel=text,labellabel=text,...]
-%D \setuplabeltext [labellabel=text]
-%D \setuplabeltext [labellabel=text,labellabel=text,...]
-%D \stoptyping
-%D
-%D The last two cases concern the current language.
-
-%D \macros
-%D {headtext,
-%D labeltext, leftlabeltext, rightlabeltext, labeltexts,
-%D LABELTEXT, LEFTLABELTEXT, RIGHTLABELTEXT, LABELTEXTS}
-%D
-%D Once defined, head and label texts can be called upon using:
-%D
-%D \showsetup{headtext}
-%D \showsetup{labeltext}
-%D
-%D The latter one has an upcased alternative \type{\LABELTEXT}.
-
-\def\labellanguage {\reallanguagetag{\defaultlanguage\currentmainlanguage}}
-\def\headlanguage {\reallanguagetag{\defaultlanguage\currentmainlanguage}}
-\def\mathlabellanguage{\reallanguagetag{\defaultlanguage\currentmainlanguage}}
-
-\appendtoks \let\labellanguage\currentlanguage \to \everycurrentdate
-
-\def\dummytextprefix{\empty\empty}
-
-\def\dogetupsomelabeltext {\dodogetupsomelabeltext \labellanguage } % second argument is textlabel
-\def\dogetupsomeheadtext {\dodogetupsomeheadtext \headlanguage } % second argument is headlabel
-\def\dogetupsomemathlabeltext{\dodogetupsomemathlabeltext\mathlabellanguage } % second argument is headlabel
-
-\def\dodogetupsomelabeltext#1#2%
- {\ifcsname\??ml#1#2\endcsname
- \expandafter\let\expandafter\thetextprefix\csname\??ml#1#2\endcsname
- \else\ifcsname\??la\labellanguage\s!default\endcsname
- \expandafter\dodogetupsomelabeltext\csname\??la\labellanguage\s!default\endcsname{#2}%
- \else\ifcsname\??ml#2\endcsname
- \expandafter\let\expandafter\thetextprefix\csname\??ml#2\endcsname
- \else\ifcsname\??ml\s!en#2\endcsname
- \expandafter\let\expandafter\thetextprefix\csname\??ml\s!en#2\endcsname
- \else
- \let\thetextprefix\dummytextprefix
- \fi\fi\fi\fi}
-
-\def\dodogetupsomeheadtext#1#2%
- {\ifcsname\??mh#1#2\endcsname
- \expandafter\let\expandafter\thetextprefix\csname\??mh#1#2\endcsname
- \else\ifcsname\??la\headlanguage\s!default\endcsname
- \expandafter\dodogetupsomeheadtext\csname\??la\headlanguage\s!default\endcsname{#2}%
- \else\ifcsname\??mh#2\endcsname
- \expandafter\let\expandafter\thetextprefix\csname\??mh#2\endcsname
- \else\ifcsname\??mh\s!en#2\endcsname
- \expandafter\let\expandafter\thetextprefix\csname\??mh\s!en#2\endcsname
- \else
- \let\thetextprefix\dummytextprefix
- \fi\fi\fi\fi}
-
-\def\dodogetupsomemathlabeltext#1#2%
- {\ifcsname\??mm#1#2\endcsname
- \expandafter\let\expandafter\thetextprefix\csname\??mm#1#2\endcsname
- \else\ifcsname\??la\mathlabellanguage\s!default\endcsname
- \expandafter\dodogetupsomemathlabeltext\csname\??la\mathlabellanguage\s!default\endcsname{#2}%
- \else\ifcsname\??mm#2\endcsname
- \expandafter\let\expandafter\thetextprefix\csname\??mm#2\endcsname
- \else\ifcsname\??mm\s!en#2\endcsname
- \expandafter\let\expandafter\thetextprefix\csname\??mm\s!en#2\endcsname
- \else
- \let\thetextprefix\dummytextprefix
- \fi\fi\fi\fi}
-
-% The WORD variants are a bit inefficient when #1/#2 are empty but they are
-% seldom used (one can better set the style).
-
-\let\flushleftlabeltext \firstoftwoarguments
-\let\flushrightlabeltext \secondoftwoarguments
-\let\flushleftmathlabeltext \firstoftwoarguments
-\let\flushrightmathlabeltext\secondoftwoarguments
-
-\def\flushleftlabelWORD #1#2{\WORD{#1}}
-\def\flushrightlabelWORD #1#2{\WORD{#2}}
-\def\flushbothlabeltexts #1#2#3{#1#3#2}
-\def\flushbothlabelTEXTS #1#2#3{\WORD{#1}#3\WORD{#2}}
-
-\unexpanded\def\headtext #1{\dogetupsomeheadtext {#1}\expandafter\flushleftlabeltext \thetextprefix}
-\unexpanded\def\leftlabeltext #1{\dogetupsomelabeltext {#1}\expandafter\flushleftlabeltext \thetextprefix}
-\unexpanded\def\rightlabeltext #1{\dogetupsomelabeltext {#1}\expandafter\flushrightmathlabeltext\thetextprefix}
-\unexpanded\def\LEFTLABELTEXT #1{\dogetupsomelabeltext {#1}\expandafter\flushleftlabelWORD \thetextprefix}
-\unexpanded\def\RIGHTLABELTEXT #1{\dogetupsomelabeltext {#1}\expandafter\flushrightlabelWORD \thetextprefix}
-\unexpanded\def\labeltexts #1{\dogetupsomelabeltext {#1}\expandafter\flushbothlabeltexts \thetextprefix} % #2
-\unexpanded\def\LABELTEXTS #1{\dogetupsomelabeltext {#1}\expandafter\flushbothlabelTEXTS \thetextprefix} % #2
-\unexpanded\def\leftmathlabeltext #1{\dogetupsomemathlabeltext{#1}\expandafter\flushleftmathlabeltext \thetextprefix}
-\unexpanded\def\rightmathlabeltext#1{\dogetupsomemathlabeltext{#1}\expandafter\flushrightlabeltext \thetextprefix}
-
-\let\labeltext \leftlabeltext
-\let\LABELTEXT \LEFTLABELTEXT
-\let\mathlabeltext\leftmathlabeltext
-
-\ifx\simplifiedcommands\undefined \newtoks\simplifiedcommands \fi
-
-\appendtoks
- \let \headtext \firstofoneargument
- \let \labeltext \firstofoneargument
- \let \leftlabeltext \firstofoneargument
- \let \rightlabeltext \firstofoneargument
- \let \HEADTEXT \firstofoneargument
- \let \LABELTEXT \firstofoneargument
- \let \LEFTLABELTEXT \firstofoneargument
- \let \RIGHTLABELTEXT \firstofoneargument
- \let \mathlabeltext \firstofoneargument
-\to \simplifiedcommands
-
-%D \macros
-%D {presetheadtext,presetlabeltext}
-%D
-%D The next two macros enable us to automatically define
-%D head and label texts without replacing predefined ones.
-%D These are internal macros.
-
-\def\presetheadtext {\settrue\protecttextprefixes\let\currenttextprefixclass\??mh\dodoubleempty\dosetupsometextprefix}
-\def\presetlabeltext {\settrue\protecttextprefixes\let\currenttextprefixclass\??ml\dodoubleempty\dosetupsometextprefix}
-\def\presetmathlabeltext{\settrue\protecttextprefixes\let\currenttextprefixclass\??mm\dodoubleempty\dosetupsometextprefix}
+\def\doassignsometextprefixdumb#1[#2,#3]%
+ {\expandafter\def\csname\??ml:\currenttextprefixclass:\currenttextprefixtag:#1\endcsname{#2}}
%D \macros
%D {translate}
%D
-%D Sometismes macros contain language specific words that are to
+%D Sometimes macros contain language specific words that are to
%D be typeset. Such macros can be made (more) language
%D independant by using:
%D
@@ -280,4 +283,12 @@
{\getparameters[\??lg][#1]%
\edef#2{\csname\??lg\currentlanguage\endcsname}}
+%D Now we load the labels:
+
+\ifdefined\sixperemspace \else \def\sixperemspace{ } \fi % we could embed 0x2006 but it does not show up in a editor
+
+%D Now we can load the labels:
+
+\ctxlua{languages.labels.define()}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/lang-mis.mkiv b/Master/texmf-dist/tex/context/base/lang-mis.mkiv
index 0df45877b0d..231697c7ee7 100644
--- a/Master/texmf-dist/tex/context/base/lang-mis.mkiv
+++ b/Master/texmf-dist/tex/context/base/lang-mis.mkiv
@@ -221,12 +221,12 @@
\def\handlemathmodediscretionary#1{\executeifdefined{\@tmd@math@\detokenize{#1}}\donothing}
\def\handletextmodediscretionary#1{\executeifdefined{\@tmd@text@\detokenize{#1}}\donothing}
-\def\installdiscretionaries#1#2{\writestatus\m!systems{use \string \installdiscretionary}} % obsolete
+\def\installdiscretionaries#1#2{\writestatus\m!system{use \string \installdiscretionary}} % obsolete
-\chardef\discretionarymode\plusone
+\setnewconstant\discretionarymode\plusone
\def\ignorediscretionaries
- {\chardef\discretionarymode\zerocount}
+ {\discretionarymode\zerocount}
\def\discretionarycommand
{% if direct if, we need \relax for lookahead in math mode
@@ -277,7 +277,7 @@
\let\domathmodediscretionary\handlemathmodediscretionary
-\def\dotextmodediscretionary#1%
+\def\dotextmodediscretionary#1% grouped !
{\bgroup
\let\nextnextnext\egroup
\def\next##1#1%
@@ -542,7 +542,7 @@
%D approach for defining the active character itself. In MK II as
%D well as in MK IV we now use the catcode vectors.
-\chardef\compoundcharactermode\plusone
+\setnewconstant\compoundcharactermode\plusone
\def\installcompoundcharacter #1#2#3 #4% {#4} no grouping
{\ifcase\compoundcharactermode
@@ -553,8 +553,6 @@
\def\!!stringa{#3}%
\@EA\def\csname\ifx\!!stringa\empty\@cc@\else\@cs@\fi\detokenize{#1#2#3}\endcsname{#4}%
\setevalue{\@cx@\detokenize{#1}}{\noexpand\handlecompoundcharacter{\detokenize{#1}}}% beter nr's
-% \@EA\letcatcodecommand\@EA\prtcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
-% \@EA\letcatcodecommand\@EA\texcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
\@EA\letcatcodecommand\@EA\ctxcatcodes\@EA\thecompoundcharacter\csname\@cx@\detokenize{#1}\endcsname
\fi}
@@ -574,7 +572,7 @@
%D this macro is supposed to be used grouped!
\def\ignorecompoundcharacter
- {\chardef\compoundcharactermode\zerocount}
+ {\compoundcharactermode\zerocount}
\let\restorecompoundcharacter \gobbleoneargument % obsolete
\let\enableactivediscretionaries\relax % obsolete
diff --git a/Master/texmf-dist/tex/context/base/lang-sla.mkii b/Master/texmf-dist/tex/context/base/lang-sla.mkii
index 62483aeb689..2834b652f6a 100644
--- a/Master/texmf-dist/tex/context/base/lang-sla.mkii
+++ b/Master/texmf-dist/tex/context/base/lang-sla.mkii
@@ -11,6 +11,461 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% Todo: replace \'.. by \namedglyph
+
+%D The framework of this module is set up by Hans Hagen while
+%D many of the first translations were done by Tobias. Later
+%D on, corrections were made by users. If you have suggestions,
+%D or feel that your name missing here, don't hesitate to send
+%D us an email.
+%D
+%D \starttabulate[|lB|l|]
+%D \NC Czech \NC Tom Hudec, Petr Sojka \NC \NR
+%D \NC Polish \NC Grzegorz Sapijaszko \NC \NR
+%D \NC Croatian \NC \Zcaron eljko Vrba \NC \NR
+%D \NC Slovenian \NC Mojca Miklavec \NC \NR
+%D \NC Cz and Sk \NC Richard Gabriel \NC \NR
+%D \stoptabulate
+
+% Belarussian, Russian, Ukrainian, Bulgarian, Macedonian,
+% Serbian, Croatian, Slovenian, Czech, Kushubian,
+% Lusatian/Sorbian/Wendish, Polish, Slovak, Albanian,
+% Illyrian, Armenian
+
+\writestatus{loading}{ConTeXt Language Macros / Slavic Languages}
+
+\unprotect
+
+\installlanguage
+ [\s!pl]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,{.},\ ,\v!month,\ ,\v!year},
+ \s!mapping={pl0,ec,qx},
+ \s!encoding={pl0,ec,qx}]
+
+\installlanguage
+ [\s!cs]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=\thickglue--\thickglue\penalty-20\relax, % hh, \relax added
+ \c!rightsentence=\thickglue--\thickglue\penalty-20\relax,
+ \c!leftsubsentence=~---~\penalty-20\relax,
+ \c!rightsubsentence=~---~\penalty-20\relax,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsinglesixquote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoublesixquote,
+ \c!date={\v!day,{.\,},\v!month,\ ,\v!year},
+ \s!mapping={il2,ec},
+ \s!encoding={il2,ec}]
+
+\installlanguage
+ [\s!sk]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\upperleftsinglesixquote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\upperleftdoublesixquote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,{.\,},\v!month,\ ,\v!year},
+ \s!mapping={il2,ec},
+ \s!encoding={il2,ec}]
+
+\installlanguage
+ [\s!hr]
+ [\c!spacing=\v!packed,
+ \c!leftsentence=---,
+ \c!rightsentence=---,
+ \c!leftsubsentence=---,
+ \c!rightsubsentence=---,
+ \c!leftquote=\lowerleftsingleninequote,
+ \c!rightquote=\upperrightsingleninequote,
+ \c!leftquotation=\lowerleftdoubleninequote,
+ \c!rightquotation=\upperrightdoubleninequote,
+ \c!date={\v!day,{.},\ ,\v!month,\ ,\v!year},
+ \s!mapping=ec,
+ \s!encoding=ec]
+
+%D The default quotation marks for Slovenian were chosen as
+%D \lowerleftdoubleninequote these ones\upperrightdoublesixquote\
+%D which was probably due to the strong influence computers
+%D had on typesetting, but \rightguillemot these ones\leftguillemot\
+%D are \quotation{more correct}.
+%D
+%D If you still want the other quotation marks, use this:
+%D
+%D \starttyping
+%D \installlanguage
+%D [sl]
+%D [leftquote=\lowerleftsingleninequote,
+%D rightquote=\upperrightsinglesixquote,
+%D leftquotation=\lowerleftdoubleninequote,
+%D rightquotation=\upperrightdoublesixquote]
+%D \stoptyping
+%D
+%D If you disagree with the change, please send an email to Mojca, but
+%D best use some pretty strong arguments because she loves S{\sl love}nia
+%D too much to compromise on this.
+%D
+%D German faces approximately the same problem. I (MM) would prefer to
+%D have something like:
+%D
+%D \starttyping
+%D \mainlanguage[sl][quotationstyle=guillemot|doublequote] % better name needed
+%D \stoptyping
+%D
+%D but users are expected to respect the rules of nice and correct
+%D typography anyway.
+
+\installlanguage
+ [\s!sl]
+ [\c!spacing=\v!packed,
+ \c!leftsentence={\hbox{--~}},
+ \c!rightsentence={\hbox{~--}},
+ \c!leftsubsentence={--},
+ \c!rightsubsentence={--},
+ %\c!leftquote=\lowerleftsingleninequote,
+ %\c!rightquote=\upperrightsinglesixquote,
+ %\c!leftquotation=\lowerleftdoubleninequote,
+ %\c!rightquotation=\upperrightdoublesixquote,
+ \c!leftquote=\guilsingleright,
+ \c!rightquote=\guilsingleleft,
+ \c!leftquotation=\rightguillemot,
+ \c!rightquotation=\leftguillemot,
+ \c!date={\v!day,{.},\ ,\v!month,\ ,\v!year},
+ \s!mapping=ec,
+ \s!encoding=ec]
+
+\installlanguage [polish] [\s!pl]
+\installlanguage [czech] [\s!cs]
+\installlanguage [slovak] [\s!sk]
+\installlanguage [croatian] [\s!hr]
+\installlanguage [slovenian] [\s!sl]
+\installlanguage [slovene] [\s!sl] % both possible (mojca: still needed?)
+
+\installlanguage [cz] [\s!cs]
+
+% labels
+
+\setupheadtext [\s!pl] [\v!content=Spis tre\sacute ci]
+\setupheadtext [\s!cs] [\v!content=Obsah]
+\setupheadtext [\s!sk] [\v!content=Obsah]
+\setupheadtext [\s!hr] [\v!content=Sadr\zcaron aj]
+\setupheadtext [\s!sl] [\v!content=Kazalo]
+
+\setupheadtext [\s!pl] [\v!tables=Tabele]
+\setupheadtext [\s!cs] [\v!tables=Tabulky]
+\setupheadtext [\s!sk] [\v!tables=Tabuliek]
+\setupheadtext [\s!hr] [\v!tables=Tablice]
+\setupheadtext [\s!sl] [\v!tables=Tabele]
+
+\setupheadtext [\s!pl] [\v!figures=Ilustracje]
+\setupheadtext [\s!cs] [\v!figures=Obr\aacute zky]
+\setupheadtext [\s!sk] [\v!figures=Obr\aacute zkov]
+\setupheadtext [\s!hr] [\v!figures=Slike]
+\setupheadtext [\s!sl] [\v!figures=Slike]
+
+\setupheadtext [\s!pl] [\v!graphics=Grafika]
+\setupheadtext [\s!cs] [\v!graphics=Grafy]
+\setupheadtext [\s!sk] [\v!graphics=Graf]
+\setupheadtext [\s!hr] [\v!graphics=Slike]
+\setupheadtext [\s!sl] [\v!graphics=Slike]
+
+\setupheadtext [\s!pl] [\v!intermezzi=Intermezza]
+\setupheadtext [\s!cs] [\v!intermezzi=Intermezza]
+\setupheadtext [\s!sk] [\v!intermezzi=Intermezz\aacute]
+\setupheadtext [\s!hr] [\v!intermezzi=Intermeci]
+\setupheadtext [\s!sl] [\v!intermezzi=Intermezzi]
+
+\setupheadtext [\s!pl] [\v!index=Indeks]
+\setupheadtext [\s!cs] [\v!index=Rejst\rcaron\iacute k]
+\setupheadtext [\s!sk] [\v!index=Zoznam]
+\setupheadtext [\s!hr] [\v!index=Indeks]
+\setupheadtext [\s!sl] [\v!index=Stvarno kazalo]
+
+\setupheadtext [\s!pl] [\v!abbreviations=Skr\oacute cenie]
+\setupheadtext [\s!cs] [\v!abbreviations=Zkratky]
+\setupheadtext [\s!sk] [\v!abbreviations=Skratky]
+\setupheadtext [\s!hr] [\v!abbreviations=Kratice]
+\setupheadtext [\s!sl] [\v!abbreviations=Kratice]
+
+\setupheadtext [\s!pl] [\v!logos=Znaki]
+\setupheadtext [\s!cs] [\v!logos=Loga]
+\setupheadtext [\s!sk] [\v!logos=Log\aacute]
+\setupheadtext [\s!hr] [\v!logos=Znakovi]
+\setupheadtext [\s!sl] [\v!logos=Logotipi]
+
+\setupheadtext [\s!pl] [\v!units=Jednostki]
+\setupheadtext [\s!cs] [\v!units=Jednotky]
+\setupheadtext [\s!sk] [\v!units=Jednotky]
+\setupheadtext [\s!hr] [\v!units=Jedinice]
+\setupheadtext [\s!sl] [\v!units=Enote]
+
+%setupheadtext [\s!pl] [pubs=?]
+\setupheadtext [\s!cs] [pubs=Literatura]
+%setupheadtext [\s!sk] [pubs=?]
+\setupheadtext [\s!hr] [pubs=Literatura]
+\setupheadtext [\s!sl] [pubs=Literatura]
+
+\setuplabeltext [\s!pl] [\v!table=Tabela ]
+\setuplabeltext [\s!cs] [\v!table=Tabulka ]
+\setuplabeltext [\s!sk] [\v!table=Tabu\lcaron ka ]
+\setuplabeltext [\s!hr] [\v!table=Tablica ]
+\setuplabeltext [\s!sl] [\v!table=Tabela ]
+
+\setuplabeltext [\s!pl] [\v!figure=Ilustracja ]
+\setuplabeltext [\s!cs] [\v!figure=Obr\aacute zek ]
+\setuplabeltext [\s!sk] [\v!figure=Obr\aacute zok ]
+\setuplabeltext [\s!hr] [\v!figure=Slika ]
+\setuplabeltext [\s!sl] [\v!figure=Slika ]
+
+\setuplabeltext [\s!pl] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!cs] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!sk] [\v!intermezzo=Intermezzo ]
+\setuplabeltext [\s!hr] [\v!intermezzo=Intermeco ]
+\setuplabeltext [\s!sl] [\v!intermezzo=Intermezzo ]
+
+\setuplabeltext [\s!pl] [\v!graphic=Grafika ]
+\setuplabeltext [\s!cs] [\v!graphic=Graf ]
+\setuplabeltext [\s!sk] [\v!graphic=Graf ]
+\setuplabeltext [\s!hr] [\v!graphic=Slika ]
+\setuplabeltext [\s!sl] [\v!graphic=Slika ]
+
+\setuplabeltext [\s!pl] [\v!chapter=] % Rozdzia\l
+\setuplabeltext [\s!cs] [\v!chapter=] % Kapitola
+\setuplabeltext [\s!sk] [\v!chapter=] % Kapitola
+\setuplabeltext [\s!hr] [\v!chapter=] % Poglavlje
+\setuplabeltext [\s!sl] [\v!chapter=] % Poglavje
+
+\setuplabeltext [\s!pl] [\v!section=] % Podrozdzia\l
+\setuplabeltext [\s!cs] [\v!section=] % Sekce
+\setuplabeltext [\s!sk] [\v!section=] % Sekcia
+\setuplabeltext [\s!hr] [\v!section=] % Odjeljak
+\setuplabeltext [\s!sl] [\v!section=]
+
+\setuplabeltext [\s!pl] [\v!subsection=]
+\setuplabeltext [\s!cs] [\v!subsection=] % Podsekce
+\setuplabeltext [\s!sk] [\v!subsection=] % Podsekcia
+\setuplabeltext [\s!hr] [\v!subsection=] % Pododjeljak
+\setuplabeltext [\s!sl] [\v!subsection=]
+
+\setuplabeltext [\s!pl] [\v!subsubsection=]
+\setuplabeltext [\s!cs] [\v!subsubsection=] % Podpodsekce
+\setuplabeltext [\s!sk] [\v!subsubsection=] % Podpodsekcia
+\setuplabeltext [\s!hr] [\v!subsubsection=] % Podpododjeljak
+\setuplabeltext [\s!sl] [\v!subsubsection=]
+
+\setuplabeltext [\s!pl] [\v!subsubsubsection=]
+\setuplabeltext [\s!cs] [\v!subsubsubsection=] % Podpodpodsekce
+\setuplabeltext [\s!sk] [\v!subsubsubsection=] % Podpodpodsekcia
+\setuplabeltext [\s!hr] [\v!subsubsubsection=] % Podpodpododjeljak
+\setuplabeltext [\s!sl] [\v!subsubsubsection=]
+
+\setuplabeltext [\s!pl] [\v!appendix=] % Dodatek
+\setuplabeltext [\s!cs] [\v!appendix=] % P\rcaron\iacute loha
+\setuplabeltext [\s!sk] [\v!appendix=] % Pr\iacute loha
+\setuplabeltext [\s!hr] [\v!appendix=] % Dodatak
+\setuplabeltext [\s!sl] [\v!appendix=] % Dodatek
+
+\setuplabeltext [\s!pl] [\v!part=Ust\eogonek p ]
+\setuplabeltext [\s!cs] [\v!part=\Ccaron \aacute st ]
+\setuplabeltext [\s!sk] [\v!part=\Ccaron as\tcaron{} ]
+\setuplabeltext [\s!hr] [\v!part=Dio ]
+\setuplabeltext [\s!sl] [\v!part=Del ]
+
+\setuplabeltext [\s!pl] [\v!line=wiersz ]
+\setuplabeltext [\s!cs] [\v!line=\rcaron\aacute dek ]
+\setuplabeltext [\s!sk] [\v!line=riadok ]
+\setuplabeltext [\s!hr] [\v!line=redak ]
+\setuplabeltext [\s!sl] [\v!line=vrstica ]
+
+\setuplabeltext [\s!pl] [\v!lines=wiersze ]
+\setuplabeltext [\s!cs] [\v!lines=\rcaron\aacute dky ]
+\setuplabeltext [\s!sk] [\v!lines=riadky ]
+\setuplabeltext [\s!hr] [\v!lines=retci ]
+\setuplabeltext [\s!sl] [\v!lines=vrstice ]
+
+\setuplabeltext [\s!pl] [\v!january=stycznia]
+\setuplabeltext [\s!pl] [\v!february=lutego]
+\setuplabeltext [\s!pl] [\v!march=marca]
+\setuplabeltext [\s!pl] [\v!april=kwietnia]
+\setuplabeltext [\s!pl] [\v!may=maja]
+\setuplabeltext [\s!pl] [\v!june=czerwca]
+\setuplabeltext [\s!pl] [\v!july=lipca]
+\setuplabeltext [\s!pl] [\v!august=sierpnia]
+\setuplabeltext [\s!pl] [\v!september=wrze\sacute nia]
+\setuplabeltext [\s!pl] [\v!october=pa\zacute dziernika]
+\setuplabeltext [\s!pl] [\v!november=listopada]
+\setuplabeltext [\s!pl] [\v!december=grudnia]
+
+\setuplabeltext [\s!cs] [\v!january=ledna]
+\setuplabeltext [\s!cs] [\v!february=\uacute nora]
+\setuplabeltext [\s!cs] [\v!march=b\rcaron ezna]
+\setuplabeltext [\s!cs] [\v!april=dubna]
+\setuplabeltext [\s!cs] [\v!may=kv\ecaron tna]
+\setuplabeltext [\s!cs] [\v!june=\ccaron ervna]
+\setuplabeltext [\s!cs] [\v!july=\ccaron ervence]
+\setuplabeltext [\s!cs] [\v!august=srpna]
+\setuplabeltext [\s!cs] [\v!september=z\aacute\rcaron\iacute{}]
+\setuplabeltext [\s!cs] [\v!october=\rcaron\iacute jna]
+\setuplabeltext [\s!cs] [\v!november=listopadu]
+\setuplabeltext [\s!cs] [\v!december=prosince]
+
+\setuplabeltext [\s!sk] [\v!january=janu\aacute ra]
+\setuplabeltext [\s!sk] [\v!february=febru\aacute ra]
+\setuplabeltext [\s!sk] [\v!march=marca]
+\setuplabeltext [\s!sk] [\v!april=apr\iacute la]
+\setuplabeltext [\s!sk] [\v!may=m\aacute ja]
+\setuplabeltext [\s!sk] [\v!june=j\uacute na]
+\setuplabeltext [\s!sk] [\v!july=j\uacute la]
+\setuplabeltext [\s!sk] [\v!august=augusta]
+\setuplabeltext [\s!sk] [\v!september=septembra]
+\setuplabeltext [\s!sk] [\v!october=okt\oacute bra]
+\setuplabeltext [\s!sk] [\v!november=novembra]
+\setuplabeltext [\s!sk] [\v!december=decembra]
+
+\setuplabeltext [\s!hr] [\v!january=sije\ccaron anj]
+\setuplabeltext [\s!hr] [\v!february=velja\ccaron a]
+\setuplabeltext [\s!hr] [\v!march=o\zcaron ujak]
+\setuplabeltext [\s!hr] [\v!april=travanj]
+\setuplabeltext [\s!hr] [\v!may=svibanj]
+\setuplabeltext [\s!hr] [\v!june=lipanj]
+\setuplabeltext [\s!hr] [\v!july=srpanj]
+\setuplabeltext [\s!hr] [\v!august=kolovoz]
+\setuplabeltext [\s!hr] [\v!september=rujan]
+\setuplabeltext [\s!hr] [\v!october=listopad]
+\setuplabeltext [\s!hr] [\v!november=studeni]
+\setuplabeltext [\s!hr] [\v!december=prosinac]
+
+\setuplabeltext [\s!sl] [\v!january=januar]
+\setuplabeltext [\s!sl] [\v!february=februar]
+\setuplabeltext [\s!sl] [\v!march=marec]
+\setuplabeltext [\s!sl] [\v!april=april]
+\setuplabeltext [\s!sl] [\v!may=maj]
+\setuplabeltext [\s!sl] [\v!june=junij]
+\setuplabeltext [\s!sl] [\v!july=julij]
+\setuplabeltext [\s!sl] [\v!august=avgust]
+\setuplabeltext [\s!sl] [\v!september=september]
+\setuplabeltext [\s!sl] [\v!october=oktober]
+\setuplabeltext [\s!sl] [\v!november=november]
+\setuplabeltext [\s!sl] [\v!december=december]
+
+\setuplabeltext [\s!pl] [\v!sunday=niedziela]
+\setuplabeltext [\s!pl] [\v!monday=poniedzia\lstroke ek]
+\setuplabeltext [\s!pl] [\v!tuesday=wtorek]
+\setuplabeltext [\s!pl] [\v!wednesday=\sacute roda]
+\setuplabeltext [\s!pl] [\v!thursday=czwartek]
+\setuplabeltext [\s!pl] [\v!friday=pi\aogonek tek]
+\setuplabeltext [\s!pl] [\v!saturday=sobota]
+
+\setuplabeltext [\s!cs] [\v!sunday=ned\ecaron le]
+\setuplabeltext [\s!cs] [\v!monday=pond\ecaron l\iacute]
+\setuplabeltext [\s!cs] [\v!tuesday=\uacute ter\yacute]
+\setuplabeltext [\s!cs] [\v!wednesday=st\rcaron eda]
+\setuplabeltext [\s!cs] [\v!thursday=\ccaron tvrtek]
+\setuplabeltext [\s!cs] [\v!friday=p\aacute tek]
+\setuplabeltext [\s!cs] [\v!saturday=sobota]
+
+% Slovakian missing
+
+\setuplabeltext [\s!hr] [\v!sunday=nedjelja]
+\setuplabeltext [\s!hr] [\v!monday=ponedjeljak]
+\setuplabeltext [\s!hr] [\v!tuesday=utorak]
+\setuplabeltext [\s!hr] [\v!wednesday=srijeda]
+\setuplabeltext [\s!hr] [\v!thursday=\ccaron etvrtak]
+\setuplabeltext [\s!hr] [\v!friday=petak]
+\setuplabeltext [\s!hr] [\v!saturday=subota]
+
+\setuplabeltext [\s!sl] [\v!sunday=nedelja]
+\setuplabeltext [\s!sl] [\v!monday=ponedeljek]
+\setuplabeltext [\s!sl] [\v!tuesday=torek]
+\setuplabeltext [\s!sl] [\v!wednesday=sreda]
+\setuplabeltext [\s!sl] [\v!thursday=\ccaron etrtek]
+\setuplabeltext [\s!sl] [\v!friday=petek]
+\setuplabeltext [\s!sl] [\v!saturday=sobota]
+
+%D Rather new ...
+%\installlanguage
+% [\s!cs]
+% [\c!spacing=\v!packed,
+% \c!leftsentence=---,
+% \c!rightsentence=---,
+% \c!leftsubsentence=---,
+% \c!rightsubsentence=---,
+% \c!leftquote=\lowerleftsingleninequote,
+% \c!rightquote=\upperrightsinglesixquote,
+% \c!leftquotation=\lowerleftdoubleninequote,
+% \c!rightquotation=\upperrightdoublesixquote,
+% \c!date={\v!day,\ ,\v!month,\ ,\v!year}]
+
+% Polish missing
+
+\setuplabeltext [\s!cs] [\v!page=strana ]
+\setuplabeltext [\s!cs] [\v!atpage=na stran\ecaron\ ]
+\setuplabeltext [\s!cs] [\v!hencefore=viz v\yacute\scaron e ]
+\setuplabeltext [\s!cs] [\v!hereafter=viz n\iacute\zcaron e ]
+\setuplabeltext [\s!cs] [\v!see=viz ]
+
+% Slovakian missing
+
+\setuplabeltext [\s!hr] [\v!page=stranica ]
+\setuplabeltext [\s!hr] [\v!atpage=na stranici ]
+\setuplabeltext [\s!hr] [\v!hencefore=vidi gore ]
+\setuplabeltext [\s!hr] [\v!hereafter=vidi ispod ]
+\setuplabeltext [\s!hr] [\v!see=vidi ]
+
+\setuplabeltext [\s!sl] [\v!page=stran ]
+\setuplabeltext [\s!sl] [\v!atpage=na strani ]
+\setuplabeltext [\s!sl] [\v!hencefore=glej zgoraj ]
+\setuplabeltext [\s!sl] [\v!hereafter=glej spodaj ]
+\setuplabeltext [\s!sl] [\v!see=glej ]
+
+%D \ShowAllLanguageValues [\s!pl] [polish] {Polish} {furniture}
+%D \ShowAllLanguageValues [\s!cs] [czech] {Czech} {mate}
+%D \ShowAllLanguageValues [\s!sk] [slovak] {Slovakian} {face}
+%D \ShowAllLanguageValues [\s!hr] [croatian] {Croatian} {heartthrob}
+%D \ShowAllLanguageValues [\s!sl] [slovenian] {Slovenian} {mountains}
+
+%D A present from Brooks Moses and Hans Hagen for Mojca Miklavec:
+
+\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 [sl] [character] [\sloveniancharacter]
+\defineconversion [sl] [Character] [\slovenianCharacter]
+
+\defineconversion [sl] [characters] [\sloveniancharacters]
+\defineconversion [sl] [Characters] [\slovenianCharacters]
+
+\defineconversion [sl] [a] [\sloveniancharacters]
+\defineconversion [sl] [A] [\slovenianCharacters]
+\defineconversion [sl] [AK] [\smallcapped\sloveniancharacters]
+\defineconversion [sl] [KA] [\smallcapped\sloveniancharacters]
+
\def\sloveniancharacter#1%
{\ifcase#1\unknowncharacter
\or a\or b\or c\or \ccaron\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m%
@@ -27,4 +482,4 @@
\unknowncharacter
\fi}
-\endinput
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/lang-sla.mkiv b/Master/texmf-dist/tex/context/base/lang-sla.mkiv
deleted file mode 100644
index 47901261570..00000000000
--- a/Master/texmf-dist/tex/context/base/lang-sla.mkiv
+++ /dev/null
@@ -1,17 +0,0 @@
-%D \module
-%D [ file=lang-sla,
-%D version=2006.09.16,
-%D title=\CONTEXT\ Language Macros,
-%D subtitle=Slavic Languages,
-%D author=Hans Hagen / Tobias Burnus,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\def\sloveniancharacters#1{\ctxlua{converters.alphabetic(\number#1,"sl")}}
-\def\slovenianCharacters#1{\ctxlua{converters.Alphabetic(\number#1,"sl")}}
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/lang-sla.tex b/Master/texmf-dist/tex/context/base/lang-sla.tex
deleted file mode 100644
index 2c645af5a6f..00000000000
--- a/Master/texmf-dist/tex/context/base/lang-sla.tex
+++ /dev/null
@@ -1,497 +0,0 @@
-%D \module
-%D [ file=lang-sla,
-%D version=1999.09.13, % 1997.09.03
-%D title=\CONTEXT\ Language Macros,
-%D subtitle=Slavic Languages,
-%D author=Hans Hagen / Tobias Burnus,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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: replace \'.. by \namedglyph
-
-%D The framework of this module is set up by Hans Hagen while
-%D many of the first translations were done by Tobias. Later
-%D on, corrections were made by users. If you have suggestions,
-%D or feel that your name missing here, don't hesitate to send
-%D us an email.
-%D
-%D \starttabulate[|lB|l|]
-%D \NC Czech \NC Tom Hudec, Petr Sojka \NC \NR
-%D \NC Polish \NC Grzegorz Sapijaszko \NC \NR
-%D \NC Croatian \NC \Zcaron eljko Vrba \NC \NR
-%D \NC Slovenian \NC Mojca Miklavec \NC \NR
-%D \NC Cz and Sk \NC Richard Gabriel \NC \NR
-%D \stoptabulate
-
-% Belarussian, Russian, Ukrainian, Bulgarian, Macedonian,
-% Serbo-Croatian, Slovenian, Czech, Kushubian,
-% Lusatian/Sorbian/Wendish, Polish, Slovak, Albanian,
-% Illyrian, Armenian
-
-\writestatus{loading}{ConTeXt Language Macros / Slavic Languages}
-
-\unprotect
-
-% \unexpanded\def\textormathglue#1#2#3% submitted original
-% {\begingroup
-% \scratchdimen=#1\hspaceamount\empty{#3}%
-% \scratchskip=\zeropoint\!!plus.5\scratchdimen\!!minus.3\scratchdimen\relax
-% \ifmmode
-% \mskip#1#2%
-% \else
-% \kern#1\hspaceamount\empty{#3}%
-% \hskip\scratchskip
-% \fi
-% \endgroup}
-
-% actually we could use the new pdftex features
-
-\unexpanded\def\textormathglue#1#2#3% cleaned up one
- {\begingroup
- \ifmmode
- \mskip#1#2%
- \else
- \scratchdimen#1\hspaceamount\empty{#3}%
- \scratchskip\scratchdimen\!!plus.5\scratchdimen\!!minus.3\scratchdimen
- \hskip\scratchskip
- \fi
- \endgroup}
-
-\def\thinglue {\textormathglue+\thinmuskip 1}
-\def\medglue {\textormathglue+\medmuskip 2}
-\def\thickglue{\textormathglue+\thickmuskip3}
-
-\installlanguage
- [\s!pl]
- [\c!spacing=\v!packed,
- \c!leftsentence=---,
- \c!rightsentence=---,
- \c!leftsubsentence=---,
- \c!rightsubsentence=---,
- \c!leftquote=\lowerleftsingleninequote,
- \c!rightquote=\upperrightsingleninequote,
- \c!leftquotation=\lowerleftdoubleninequote,
- \c!rightquotation=\upperrightdoubleninequote,
- \c!date={\v!day,{.},\ ,\v!month,\ ,\v!year},
- \s!mapping={pl0,ec,qx},
- \s!encoding={pl0,ec,qx}]
-
-\installlanguage
- [\s!cs]
- [\c!spacing=\v!packed,
- \c!leftsentence=\thickglue--\thickglue\penalty-20\relax, % hh, \relax added
- \c!rightsentence=\thickglue--\thickglue\penalty-20\relax,
- \c!leftsubsentence=~---~\penalty-20\relax,
- \c!rightsubsentence=~---~\penalty-20\relax,
- \c!leftquote=\lowerleftsingleninequote,
- \c!rightquote=\upperrightsinglesixquote,
- \c!leftquotation=\lowerleftdoubleninequote,
- \c!rightquotation=\upperrightdoublesixquote,
- \c!date={\v!day,{.\,},\v!month,\ ,\v!year},
- \s!mapping={il2,ec},
- \s!encoding={il2,ec}]
-
-\installlanguage
- [\s!sk]
- [\c!spacing=\v!packed,
- \c!leftsentence=---,
- \c!rightsentence=---,
- \c!leftsubsentence=---,
- \c!rightsubsentence=---,
- \c!leftquote=\upperleftsinglesixquote,
- \c!rightquote=\upperrightsingleninequote,
- \c!leftquotation=\upperleftdoublesixquote,
- \c!rightquotation=\upperrightdoubleninequote,
- \c!date={\v!day,{.\,},\v!month,\ ,\v!year},
- \s!mapping={il2,ec},
- \s!encoding={il2,ec}]
-
-\installlanguage
- [\s!hr]
- [\c!spacing=\v!packed,
- \c!leftsentence=---,
- \c!rightsentence=---,
- \c!leftsubsentence=---,
- \c!rightsubsentence=---,
- \c!leftquote=\upperleftsinglesixquote,
- \c!rightquote=\upperrightsingleninequote,
- \c!leftquotation=\upperleftdoublesixquote,
- \c!rightquotation=\upperrightdoubleninequote,
- \c!date={\v!day,\ ,\v!month,\ ,\v!year},
- \s!mapping=ec,
- \s!encoding=ec]
-
-%D The default quotation marks for Slovenian were chosen as
-%D \lowerleftdoubleninequote these ones\upperrightdoublesixquote\
-%D which was probably due to the strong influence computers
-%D had on typesetting, but \rightguillemot these ones\leftguillemot\
-%D are \quotation{more correct}.
-%D
-%D If you still want the other quotation marks, use this:
-%D
-%D \starttyping
-%D \installlanguage
-%D [sl]
-%D [leftquote=\lowerleftsingleninequote,
-%D rightquote=\upperrightsinglesixquote,
-%D leftquotation=\lowerleftdoubleninequote,
-%D rightquotation=\upperrightdoublesixquote]
-%D \stoptyping
-%D
-%D If you disagree with the change, please send an email to Mojca, but
-%D best use some pretty strong arguments because she loves S{\sl love}nia
-%D to much to comprimise on this.
-%D
-%D German faces approximately the same problem. I (MM) would prefer to
-%D have something like:
-%D
-%D \starttyping
-%D \mainlanguage[sl][quotationstyle=guillemot|doublequote] % better name needed
-%D \stoptyping
-%D
-%D but users are expected to respect the rules of nice and correct
-%D typography anyway.
-
-\installlanguage
- [\s!sl]
- [\c!spacing=\v!packed,
- \c!leftsentence={\hbox{--~}},
- \c!rightsentence={\hbox{~--}},
- \c!leftsubsentence={--},
- \c!rightsubsentence={--},
- %\c!leftquote=\lowerleftsingleninequote,
- %\c!rightquote=\upperrightsinglesixquote,
- %\c!leftquotation=\lowerleftdoubleninequote,
- %\c!rightquotation=\upperrightdoublesixquote,
- \c!leftquote=\guilsingleright,
- \c!rightquote=\guilsingleleft,
- \c!leftquotation=\rightguillemot,
- \c!rightquotation=\leftguillemot,
- \c!date={\v!day,{.},\ ,\v!month,\ ,\v!year},
- \s!mapping=ec,
- \s!encoding=ec]
-
-\installlanguage [polish] [\s!pl]
-\installlanguage [czech] [\s!cs]
-\installlanguage [slovak] [\s!sk]
-\installlanguage [croatian] [\s!hr]
-\installlanguage [slovenian] [\s!sl]
-\installlanguage [slovene] [\s!sl] % both possible (mojca: still needed?)
-
-\installlanguage [cz] [\s!cs]
-
-% labels
-
-\setupheadtext [\s!pl] [\v!content=Spis tre\sacute ci]
-\setupheadtext [\s!cs] [\v!content=Obsah]
-\setupheadtext [\s!sk] [\v!content=Obsah]
-\setupheadtext [\s!hr] [\v!content=Sadr\zcaron aj]
-\setupheadtext [\s!sl] [\v!content=Kazalo]
-
-\setupheadtext [\s!pl] [\v!tables=Tabele]
-\setupheadtext [\s!cs] [\v!tables=Tabulky]
-\setupheadtext [\s!sk] [\v!tables=Tabuliek]
-\setupheadtext [\s!hr] [\v!tables=Tablice]
-\setupheadtext [\s!sl] [\v!tables=Tabele]
-
-\setupheadtext [\s!pl] [\v!figures=Ilustracje]
-\setupheadtext [\s!cs] [\v!figures=Obr\aacute zky]
-\setupheadtext [\s!sk] [\v!figures=Obr\aacute zkov]
-\setupheadtext [\s!hr] [\v!figures=Slike]
-\setupheadtext [\s!sl] [\v!figures=Slike]
-
-\setupheadtext [\s!pl] [\v!graphics=Grafika]
-\setupheadtext [\s!cs] [\v!graphics=Grafy]
-\setupheadtext [\s!sk] [\v!graphics=Graf]
-\setupheadtext [\s!hr] [\v!graphics=Slike]
-\setupheadtext [\s!sl] [\v!graphics=Slike]
-
-\setupheadtext [\s!pl] [\v!intermezzi=Intermezza]
-\setupheadtext [\s!cs] [\v!intermezzi=Intermezza]
-\setupheadtext [\s!sk] [\v!intermezzi=Intermezz\aacute]
-\setupheadtext [\s!hr] [\v!intermezzi=Intermezza]
-\setupheadtext [\s!sl] [\v!intermezzi=Intermezzi]
-
-\setupheadtext [\s!pl] [\v!index=Indeks]
-\setupheadtext [\s!cs] [\v!index=Rejst\rcaron\iacute k]
-\setupheadtext [\s!sk] [\v!index=Zoznam]
-\setupheadtext [\s!hr] [\v!index=Indeks]
-\setupheadtext [\s!sl] [\v!index=Stvarno kazalo]
-
-\setupheadtext [\s!pl] [\v!abbreviations=Skr\oacute cenie]
-\setupheadtext [\s!cs] [\v!abbreviations=Zkratky]
-\setupheadtext [\s!sk] [\v!abbreviations=Skratky]
-\setupheadtext [\s!hr] [\v!abbreviations=Kratice]
-\setupheadtext [\s!sl] [\v!abbreviations=Kratice]
-
-\setupheadtext [\s!pl] [\v!logos=Znaki]
-\setupheadtext [\s!cs] [\v!logos=Loga]
-\setupheadtext [\s!sk] [\v!logos=Log\aacute]
-\setupheadtext [\s!hr] [\v!logos=Znakovi]
-\setupheadtext [\s!sl] [\v!logos=Logotipi]
-
-\setupheadtext [\s!pl] [\v!units=Jednostki]
-\setupheadtext [\s!cs] [\v!units=Jednotky]
-\setupheadtext [\s!sk] [\v!units=Jednotky]
-\setupheadtext [\s!hr] [\v!units=Jednostki]
-\setupheadtext [\s!sl] [\v!units=Enote]
-
-%setupheadtext [\s!pl] [pubs=?]
-\setupheadtext [\s!cs] [pubs=Literatura]
-%setupheadtext [\s!sk] [pubs=?]
-%setupheadtext [\s!hr] [pubs=?]
-\setupheadtext [\s!sl] [pubs=Literatura]
-
-\setuplabeltext [\s!pl] [\v!table=Tabela ]
-\setuplabeltext [\s!cs] [\v!table=Tabulka ]
-\setuplabeltext [\s!sk] [\v!table=Tabu\lcaron ka ]
-\setuplabeltext [\s!hr] [\v!table=T\aacute bl\aacute zat ] % [\v!table=Tablica ]
-\setuplabeltext [\s!sl] [\v!table=Tabela ]
-
-\setuplabeltext [\s!pl] [\v!figure=Ilustracja ]
-\setuplabeltext [\s!cs] [\v!figure=Obr\aacute zek ]
-\setuplabeltext [\s!sk] [\v!figure=Obr\aacute zok ]
-\setuplabeltext [\s!hr] [\v!figure=Slika ]
-\setuplabeltext [\s!sl] [\v!figure=Slika ]
-
-\setuplabeltext [\s!pl] [\v!intermezzo=Intermezzo ]
-\setuplabeltext [\s!cs] [\v!intermezzo=Intermezzo ]
-\setuplabeltext [\s!sk] [\v!intermezzo=Intermezzo ]
-\setuplabeltext [\s!hr] [\v!intermezzo=Intermezzo ]
-\setuplabeltext [\s!sl] [\v!intermezzo=Intermezzo ]
-
-\setuplabeltext [\s!pl] [\v!graphic=Grafika ]
-\setuplabeltext [\s!cs] [\v!graphic=Graf ]
-\setuplabeltext [\s!sk] [\v!graphic=Graf ]
-\setuplabeltext [\s!hr] [\v!graphic=Slika ]
-\setuplabeltext [\s!sl] [\v!graphic=Slika ]
-
-\setuplabeltext [\s!pl] [\v!chapter=] % Rozdzia\l
-\setuplabeltext [\s!cs] [\v!chapter=] % Kapitola
-\setuplabeltext [\s!sk] [\v!chapter=] % Kapitola
-\setuplabeltext [\s!hr] [\v!chapter=] % Rozdzia\l
-\setuplabeltext [\s!sl] [\v!chapter=] % Poglavje
-
-\setuplabeltext [\s!pl] [\v!section=] % Podrozdzia\l
-\setuplabeltext [\s!cs] [\v!section=] % Sekce
-\setuplabeltext [\s!sk] [\v!section=] % Sekcia
-\setuplabeltext [\s!hr] [\v!section=] % Podrozdzia\l
-\setuplabeltext [\s!sl] [\v!section=]
-
-\setuplabeltext [\s!pl] [\v!subsection=]
-\setuplabeltext [\s!cs] [\v!subsection=] % Podsekce
-\setuplabeltext [\s!sk] [\v!subsection=] % Podsekcia
-\setuplabeltext [\s!hr] [\v!subsection=]
-\setuplabeltext [\s!sl] [\v!subsection=]
-
-\setuplabeltext [\s!pl] [\v!subsubsection=]
-\setuplabeltext [\s!cs] [\v!subsubsection=] % Podpodsekce
-\setuplabeltext [\s!sk] [\v!subsubsection=] % Podpodsekcia
-\setuplabeltext [\s!hr] [\v!subsubsection=]
-\setuplabeltext [\s!sl] [\v!subsubsection=]
-
-\setuplabeltext [\s!pl] [\v!subsubsubsection=]
-\setuplabeltext [\s!cs] [\v!subsubsubsection=] % Podpodpodsekce
-\setuplabeltext [\s!sk] [\v!subsubsubsection=] % Podpodpodsekcia
-\setuplabeltext [\s!hr] [\v!subsubsubsection=]
-\setuplabeltext [\s!sl] [\v!subsubsubsection=]
-
-\setuplabeltext [\s!pl] [\v!appendix=] % Dodatek
-\setuplabeltext [\s!cs] [\v!appendix=P\rcaron\iacute loha ]
-\setuplabeltext [\s!sk] [\v!appendix=Pr\iacute loha ]
-\setuplabeltext [\s!hr] [\v!appendix=Dodatak ]
-\setuplabeltext [\s!sl] [\v!appendix=Dodatek ]
-
-\setuplabeltext [\s!pl] [\v!part=Ust\eogonek p ]
-\setuplabeltext [\s!cs] [\v!part=\Ccaron \aacute st ]
-\setuplabeltext [\s!sk] [\v!part=\Ccaron as\tcaron{} ]
-\setuplabeltext [\s!hr] [\v!part=Dio ]
-\setuplabeltext [\s!sl] [\v!part=Del ]
-
-\setuplabeltext [\s!pl] [\v!line=wiersz ]
-\setuplabeltext [\s!cs] [\v!line=\rcaron\aacute dek ]
-\setuplabeltext [\s!sk] [\v!line=riadok ]
-\setuplabeltext [\s!hr] [\v!line=red ]
-\setuplabeltext [\s!sl] [\v!line=vrstica ]
-
-\setuplabeltext [\s!pl] [\v!lines=wiersze ]
-\setuplabeltext [\s!cs] [\v!lines=\rcaron\aacute dky ]
-\setuplabeltext [\s!sk] [\v!lines=riadky ]
-\setuplabeltext [\s!hr] [\v!lines=redovi ]
-\setuplabeltext [\s!sl] [\v!lines=vrstice ]
-
-\setuplabeltext [\s!pl] [\v!january=stycznia]
-\setuplabeltext [\s!pl] [\v!february=lutego]
-\setuplabeltext [\s!pl] [\v!march=marca]
-\setuplabeltext [\s!pl] [\v!april=kwietnia]
-\setuplabeltext [\s!pl] [\v!may=maja]
-\setuplabeltext [\s!pl] [\v!june=czerwca]
-\setuplabeltext [\s!pl] [\v!july=lipca]
-\setuplabeltext [\s!pl] [\v!august=sierpnia]
-\setuplabeltext [\s!pl] [\v!september=wrze\sacute nia]
-\setuplabeltext [\s!pl] [\v!october=pa\zacute dziernika]
-\setuplabeltext [\s!pl] [\v!november=listopada]
-\setuplabeltext [\s!pl] [\v!december=grudnia]
-
-\setuplabeltext [\s!cs] [\v!january=ledna]
-\setuplabeltext [\s!cs] [\v!february=\uacute nora]
-\setuplabeltext [\s!cs] [\v!march=b\rcaron ezna]
-\setuplabeltext [\s!cs] [\v!april=dubna]
-\setuplabeltext [\s!cs] [\v!may=kv\ecaron tna]
-\setuplabeltext [\s!cs] [\v!june=\ccaron ervna]
-\setuplabeltext [\s!cs] [\v!july=\ccaron ervence]
-\setuplabeltext [\s!cs] [\v!august=srpna]
-\setuplabeltext [\s!cs] [\v!september=z\aacute\rcaron\iacute{}]
-\setuplabeltext [\s!cs] [\v!october=\rcaron\iacute jna]
-\setuplabeltext [\s!cs] [\v!november=listopadu]
-\setuplabeltext [\s!cs] [\v!december=prosince]
-
-\setuplabeltext [\s!sk] [\v!january=janu\aacute ra]
-\setuplabeltext [\s!sk] [\v!february=febru\aacute ra]
-\setuplabeltext [\s!sk] [\v!march=marca]
-\setuplabeltext [\s!sk] [\v!april=apr\iacute la]
-\setuplabeltext [\s!sk] [\v!may=m\aacute ja]
-\setuplabeltext [\s!sk] [\v!june=j\uacute na]
-\setuplabeltext [\s!sk] [\v!july=j\uacute la]
-\setuplabeltext [\s!sk] [\v!august=augusta]
-\setuplabeltext [\s!sk] [\v!september=septembra]
-\setuplabeltext [\s!sk] [\v!october=okt\oacute bra]
-\setuplabeltext [\s!sk] [\v!november=novembra]
-\setuplabeltext [\s!sk] [\v!december=decembra]
-
-\setuplabeltext [\s!hr] [\v!january=sije\ccaron anj]
-\setuplabeltext [\s!hr] [\v!february=velja\ccaron a]
-\setuplabeltext [\s!hr] [\v!march=o\zcaron ujak]
-\setuplabeltext [\s!hr] [\v!april=travanj]
-\setuplabeltext [\s!hr] [\v!may=svibanj]
-\setuplabeltext [\s!hr] [\v!june=lipanj]
-\setuplabeltext [\s!hr] [\v!july=srpanj]
-\setuplabeltext [\s!hr] [\v!august=kolovoz]
-\setuplabeltext [\s!hr] [\v!september=rujan]
-\setuplabeltext [\s!hr] [\v!october=listopad]
-\setuplabeltext [\s!hr] [\v!november=studeni]
-\setuplabeltext [\s!hr] [\v!december=prosinac]
-
-\setuplabeltext [\s!sl] [\v!january=januar]
-\setuplabeltext [\s!sl] [\v!february=februar]
-\setuplabeltext [\s!sl] [\v!march=marec]
-\setuplabeltext [\s!sl] [\v!april=april]
-\setuplabeltext [\s!sl] [\v!may=maj]
-\setuplabeltext [\s!sl] [\v!june=junij]
-\setuplabeltext [\s!sl] [\v!july=julij]
-\setuplabeltext [\s!sl] [\v!august=avgust]
-\setuplabeltext [\s!sl] [\v!september=september]
-\setuplabeltext [\s!sl] [\v!october=oktober]
-\setuplabeltext [\s!sl] [\v!november=november]
-\setuplabeltext [\s!sl] [\v!december=december]
-
-\setuplabeltext [\s!pl] [\v!sunday=niedziela]
-\setuplabeltext [\s!pl] [\v!monday=poniedzia\lstroke ek]
-\setuplabeltext [\s!pl] [\v!tuesday=wtorek]
-\setuplabeltext [\s!pl] [\v!wednesday=\sacute roda]
-\setuplabeltext [\s!pl] [\v!thursday=czwartek]
-\setuplabeltext [\s!pl] [\v!friday=pi\aogonek tek]
-\setuplabeltext [\s!pl] [\v!saturday=sobota]
-
-% new
-\setuplabeltext [\s!cs] [\v!sunday=ned\ecaron le]
-\setuplabeltext [\s!cs] [\v!monday=pond\ecaron l\iacute]
-\setuplabeltext [\s!cs] [\v!tuesday=\uacute ter\yacute]
-\setuplabeltext [\s!cs] [\v!wednesday=st\rcaron eda]
-\setuplabeltext [\s!cs] [\v!thursday=\ccaron tvrtek]
-\setuplabeltext [\s!cs] [\v!friday=p\aacute tek]
-\setuplabeltext [\s!cs] [\v!saturday=sobota]
-
-\setuplabeltext [\s!hr] [\v!sunday=nedjelja]
-\setuplabeltext [\s!hr] [\v!monday=ponedjeljak]
-\setuplabeltext [\s!hr] [\v!tuesday=utorak]
-\setuplabeltext [\s!hr] [\v!wednesday=srijeda]
-\setuplabeltext [\s!hr] [\v!thursday=\ccaron etvrtak]
-\setuplabeltext [\s!hr] [\v!friday=petak]
-\setuplabeltext [\s!hr] [\v!saturday=subota]
-
-\setuplabeltext [\s!sl] [\v!sunday=nedelja]
-\setuplabeltext [\s!sl] [\v!monday=ponedeljek]
-\setuplabeltext [\s!sl] [\v!tuesday=torek]
-\setuplabeltext [\s!sl] [\v!wednesday=sreda]
-\setuplabeltext [\s!sl] [\v!thursday=\ccaron etrtek]
-\setuplabeltext [\s!sl] [\v!friday=petek]
-\setuplabeltext [\s!sl] [\v!saturday=sobota]
-
-%D Rather new ...
-%\installlanguage
-% [\s!cs]
-% [\c!spacing=\v!packed,
-% \c!leftsentence=---,
-% \c!rightsentence=---,
-% \c!leftsubsentence=---,
-% \c!rightsubsentence=---,
-% \c!leftquote=\lowerleftsingleninequote,
-% \c!rightquote=\upperrightsinglesixquote,
-% \c!leftquotation=\lowerleftdoubleninequote,
-% \c!rightquotation=\upperrightdoublesixquote,
-% \c!date={\v!day,\ ,\v!month,\ ,\v!year}]
-
-\setuplabeltext [\s!sl] [\v!page=stran ]
-\setuplabeltext [\s!sl] [\v!atpage=na strani ]
-\setuplabeltext [\s!sl] [\v!hencefore=glej zgoraj]
-\setuplabeltext [\s!sl] [\v!hereafter=glej spodaj]
-\setuplabeltext [\s!sl] [\v!see=glej ]
-
-% new
-\setuplabeltext [\s!cs] [\v!page=strana ]
-\setuplabeltext [\s!cs] [\v!atpage=na stran\ecaron\ ]
-\setuplabeltext [\s!cs] [\v!hencefore=viz v\yacute\scaron e ]
-\setuplabeltext [\s!cs] [\v!hereafter=viz n\iacute\zcaron e ]
-\setuplabeltext [\s!cs] [\v!see=viz ]
-
-%D \ShowAllLanguageValues [\s!pl] [polish] {Polish} {furniture}
-%D \ShowAllLanguageValues [\s!cs] [czech] {Czech} {mate}
-%D \ShowAllLanguageValues [\s!sk] [slovak] {Slovakian} {face}
-%D \ShowAllLanguageValues [\s!hr] [croatian] {Croatian} {heartthrob}
-%D \ShowAllLanguageValues [\s!sl] [slovenian] {Slovenian} {mountains}
-
-%D A present from Brooks Moses and Hans Hagen for Mojca Miklavec:
-
-\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 [sl] [character] [\sloveniancharacter]
-\defineconversion [sl] [Character] [\slovenianCharacter]
-
-\defineconversion [sl] [characters] [\sloveniancharacters]
-\defineconversion [sl] [Characters] [\slovenianCharacters]
-
-\defineconversion [sl] [a] [\sloveniancharacters]
-\defineconversion [sl] [A] [\slovenianCharacters]
-\defineconversion [sl] [AK] [\smallcapped\sloveniancharacters]
-\defineconversion [sl] [KA] [\smallcapped\sloveniancharacters]
-
-% this will become more generic : \languagecharacters{sl}{..}
-
-\let\sloveniancharacter\gobbleoneargument
-\let\slovenianCharacter\gobbleoneargument
-
-%D Plugins:
-
-\loadmarkfile{lang-sla}
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/lang-spa.tex b/Master/texmf-dist/tex/context/base/lang-spa.mkii
index f6e22aa5190..f6e22aa5190 100644
--- a/Master/texmf-dist/tex/context/base/lang-spa.tex
+++ b/Master/texmf-dist/tex/context/base/lang-spa.mkii
diff --git a/Master/texmf-dist/tex/context/base/lang-spa.mkiv b/Master/texmf-dist/tex/context/base/lang-spa.mkiv
new file mode 100644
index 00000000000..2cc88b84fcf
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lang-spa.mkiv
@@ -0,0 +1,76 @@
+%D \module
+%D [ file=lang-spa,
+%D version=2002.04.17,
+%D title=\CONTEXT\ Language Macros,
+%D subtitle=Spacing,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Language Macros / Spacing}
+
+%D This module was created in the process of enhancing
+%D support for French (with the help of Daniel Flipo).
+%D
+%D This will (or already has) become obsolete!
+
+\unprotect
+
+\definehspace [\s!fr] [quotation] [\flexiblespaceamount{.8}{.3}{.8}]
+\definehspace [\s!fr] [sentence] [\fixedspaceamount{1}]
+
+%definehspace [\s!fr] [quote] [\flexiblespaceamount{.8}{.3}{.8}]
+%definehspace [\s!fr] [speech] [\flexiblespaceamount{.8}{.3}{.8}]
+
+\definehspace [\s!fr] [interquotation] [\zeropoint]
+\definehspace [\s!fr] [intersentence] [\zeropoint]
+
+\definehspace [\string :] [\zeropoint]
+\definehspace [\string ;] [\zeropoint]
+\definehspace [\string !] [\zeropoint]
+\definehspace [\string ?] [\zeropoint]
+
+\definehspace [\s!fr] [\string :] [\spaceamount]
+\definehspace [\s!fr] [\string ;] [.16667em]
+\definehspace [\s!fr] [\string !] [.16667em]
+\definehspace [\s!fr] [\string ?] [.16667em]
+
+%D Alternative discretionary handlers:
+
+\definetextmodediscretionary :
+ {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentlanguage{:}:}
+
+\definetextmodediscretionary ;
+ {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentlanguage{;};}
+
+\definetextmodediscretionary ?
+ {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentlanguage{?}?}
+
+\definetextmodediscretionary !
+ {\removeunwantedspaces\prewordbreak\kern\hspaceamount\currentlanguage{!}!}
+
+%D \startbuffer
+%D \mainlanguage[en] \quotation{test \quotation{test} test}\par
+%D \mainlanguage[nl] \quotation{test \quotation{test} test}\par
+%D \mainlanguage[fr] \quotation{test \quotation{test} test}\par
+%D
+%D \mainlanguage[en] \quotation{\quotation{test} test}\par
+%D \mainlanguage[nl] \quotation{\quotation{test} test}\par
+%D \mainlanguage[fr] \quotation{\quotation{test} test}\par
+%D
+%D \mainlanguage[en] |<|test |<|test|>| test|>| \par
+%D \mainlanguage[nl] |<|test |<|test|>| test|>| \par
+%D \mainlanguage[fr] |<|test |<|test|>| test|>| \par
+%D
+%D \mainlanguage[en] |<||<|test|>| test|>| \par
+%D \mainlanguage[nl] |<||<|test|>| test|>| \par
+%D \mainlanguage[fr] |<||<|test|>| test|>| \par
+%D \stopbuffer
+%D
+%D \typebuffer {\getbuffer}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/lang-txt.lua b/Master/texmf-dist/tex/context/base/lang-txt.lua
new file mode 100644
index 00000000000..fc3a55170fd
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lang-txt.lua
@@ -0,0 +1,2510 @@
+if not modules then modules = { } end modules ['lang-txt'] = {
+ version = 1.001,
+ comment = "companion to lang-lab.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- The content of this file is derived from the mkii lang-* files and
+-- early 2011 the mkii labels are generated from this file. The
+-- translations have been collected over years by users, using named
+-- glyphs. This file uses utf exclusively.
+--
+-- Many of the initial translations were done by Tobias Burnus but
+-- completed by numerous users. The following list is incomplete so feel
+-- free to send me corrections.
+--
+-- af Afrikaans ...
+-- ar Arabic Idris Samawi Hamid, Khaled Hosny
+-- ca Catalan ...
+-- cn Chinese Wang Lei, ...
+-- cs Czech Tom Hudec, Petr Sojka, Richard Gabriel
+-- da Danish Arne Jorgensen
+-- de German Tobias Burnus, ...
+-- en English Hans Hagen, ...
+-- es Spanish ...
+-- fi Finish ...
+-- fr French Daniel Flipo, Arthur Reutenauer
+-- gr Greek Apostolos Syropoulos, Thomas Schmitz
+-- hr Croatian Željko Vrba, Richard Gabriel, Vedran Miletić
+-- hu Hungarian Adam Reviczky
+-- it Italian Giuseppe Bilotta, Luigi Scarso
+-- ja Japanese Richard Gabriel
+-- kr Korean Jeong Dalyoung
+-- la Latin ...
+-- lt Lithuanian Marius Aleknevičius
+-- nb Norwegian Hans Fredrik Nordhaug, ...
+-- nn Norwegian Hans Fredrik Nordhaug, ...
+-- nl Dutch Hans Hagen
+-- pl Polish Grzegorz Sapijaszko
+-- pt Portuguese Pedro F. M. Mendonça
+-- ro Romanian Dan Seracu, ...
+-- ru Russian Olga Briginets, Alexander Bokovoy, Victor Figurnov, ...
+-- sk Slovak ...
+-- sl Slovenian Mojca Miklavec
+-- sv Swedish ...
+-- tk Turkish Tobias Burnus
+-- tr Turkmen Nazar Annagurban
+-- ua Ukrainian Olga Briginets, Alexander Bokovoy, Victor Figurnov, ...
+-- vi Vietnamese Han The Thanh
+
+-- For the moment we keep this table in memory. In the future we can then
+-- enable labels.
+
+-- thinspace == sixperemspace = 0x2006
+-- print("!"..utf.char(0x2006).."!")
+
+languages = languages or { }
+local languages = languages
+
+languages.data = languages.data or utilities.storage.allocate { }
+local data = languages.data
+
+data.labels={
+ functions={
+ Pr={
+ labels={
+ en="Pr",
+ },
+ },
+ arccos={
+ labels={
+ en="arccos",
+ hr="arc\\sixperemspace cos",
+ pl="arc\\sixperemspace cos",
+ },
+ },
+ arcctg={
+ labels={
+ en="arccot",
+ hr="arc\\sixperemspace ctg",
+ pl="arc\\sixperemspace ctg",
+ },
+ },
+ arcsin={
+ labels={
+ en="arcsin",
+ hr="arc\\sixperemspace sin",
+ pl="arc\\sixperemspace sin",
+ },
+ },
+ arctan={
+ labels={
+ en="arctan",
+ hr="arc\\sixperemspace tg",
+ pl="arc\\sixperemspace tg",
+ },
+ },
+ arctg={
+ labels={
+ en="arctan",
+ hr="arc\\sixperemspace tg",
+ pl="arc\\sixperemspace tg",
+ },
+ },
+ arg={
+ labels={
+ en="arg",
+ },
+ },
+ cos={
+ labels={
+ en="cos",
+ },
+ },
+ cosh={
+ labels={
+ en="cosh",
+ },
+ },
+ cot={
+ labels={
+ en="cot",
+ hr="ctg",
+ pl="ctg",
+ },
+ },
+ coth={
+ labels={
+ en="coth",
+ },
+ },
+ csc={
+ labels={
+ en="csc",
+ },
+ },
+ ctg={
+ labels={
+ en="cot",
+ hr="ctg",
+ pl="ctg",
+ },
+ },
+ deg={
+ labels={
+ en="deg",
+ },
+ },
+ det={
+ labels={
+ en="det",
+ },
+ },
+ dim={
+ labels={
+ en="dim",
+ },
+ },
+ exp={
+ labels={
+ en="exp",
+ },
+ },
+ gcd={
+ labels={
+ en="gcd",
+ hr="nzd",
+ nl="ggd",
+ },
+ },
+ hom={
+ labels={
+ en="hom",
+ },
+ },
+ inf={
+ labels={
+ en="inf",
+ },
+ },
+ injlim={
+ labels={
+ en="inj\\sixperemspace lim",
+ },
+ },
+ ker={
+ labels={
+ en="ker",
+ },
+ },
+ lcm={
+ labels={
+ en="lcm",
+ hr="nzv",
+ nl="kgv",
+ },
+ },
+ lg={
+ labels={
+ en="lg",
+ },
+ },
+ lim={
+ labels={
+ en="lim",
+ },
+ },
+ liminf={
+ labels={
+ en="lim\\sixperemspace inf",
+ },
+ },
+ limsup={
+ labels={
+ en="lim\\sixperemspace sup",
+ },
+ },
+ ln={
+ labels={
+ en="ln",
+ },
+ },
+ log={
+ labels={
+ en="log",
+ },
+ },
+ max={
+ labels={
+ en="max",
+ },
+ },
+ median={
+ labels={
+ en="median",
+ },
+ },
+ min={
+ labels={
+ en="min",
+ },
+ },
+ mod={
+ labels={
+ en="mod",
+ },
+ },
+ projlim={
+ labels={
+ en="proj\\sixperemspace lim",
+ },
+ },
+ sec={
+ labels={
+ en="sec",
+ },
+ },
+ sin={
+ labels={
+ en="sin",
+ },
+ },
+ sinh={
+ labels={
+ en="sinh",
+ },
+ },
+ sup={
+ labels={
+ en="sup",
+ },
+ },
+ tan={
+ labels={
+ en="tan",
+ hr="tg",
+ pl="tg",
+ },
+ },
+ tanh={
+ labels={
+ en="tanh",
+ },
+ },
+ tg={
+ labels={
+ en="tan",
+ hr="tg",
+ pl="tg",
+ },
+ },
+ },
+ texts={
+ ["and"]={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="und",
+ en="and",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr="i",
+ hu="és",
+ it="",
+ la="",
+ lt="",
+ nb="",
+ nl="en",
+ nn="",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ appendix={
+ hidden=true,
+ labels={
+ af="Bylae ",
+ ar="ملحق ",
+ ca="Apèndix ",
+ cn="附录",
+ cs="Příloha ",
+ da="Bilag ",
+ de="Anhang ",
+ en="Appendix ",
+ es="Apéndice ",
+ fi="",
+ fr="Annexe ",
+ gr="Παράρτημα",
+ hr="Dodatak ",
+ hu="Melléklet ",
+ it="",
+ ja="付録",
+ kr="부록",
+ la="",
+ lt="",
+ nb="Tillegg ",
+ nl="",
+ nn="Tillegg ",
+ pl="Dodatek ",
+ pt="",
+ ro="",
+ ru="",
+ sk="Príloha ",
+ sl="Dodatek ",
+ sv="",
+ tk="Goşmaça",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ april={
+ labels={
+ af="april",
+ ar="أبريل",
+ ["ar-dz"]="أفريل",
+ ["ar-sy"]="نيسان",
+ ca="abril",
+ cn="四月",
+ cs="dubna",
+ da="april",
+ de="April",
+ en="April",
+ es="abril",
+ fi="huhtikuu",
+ fr="avril",
+ gr="Απρίλιος",
+ hr="travnja",
+ hu="április",
+ it="aprile",
+ ja="4",
+ kr="4월",
+ la="Aprilis",
+ lt="balandžio",
+ nb="april",
+ nl="april",
+ nn="april",
+ pl="kwietnia",
+ pt="abril",
+ ro="aprilie",
+ ru="апреля",
+ sk="apríla",
+ sl="april",
+ sv="april",
+ tk="aprel",
+ tr="nisan",
+ ua="квітня",
+ vi="tháng tư",
+ },
+ },
+ ["april:mnem"]={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="",
+ en="apr",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr="tra",
+ hu="ápr.",
+ it="",
+ la="",
+ lt="apr",
+ nb="april",
+ nl="",
+ nn="april",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ atpage={
+ labels={
+ af="",
+ ar="في صفحة ",
+ ca="",
+ cs="na straně ",
+ da="på side ",
+ de="auf Seite ",
+ en="at page ",
+ es="",
+ fi="",
+ fr="à la page ",
+ gr="",
+ hr="na stranici ",
+ hu="oldal ",
+ it="a pagina ",
+ la="",
+ lt="puslapyje ",
+ nb="på side ",
+ nl="op pagina ",
+ nn="på side ",
+ pl="",
+ pt="",
+ ro="",
+ ru="на странице ",
+ sk="",
+ sl="na strani ",
+ sv="på sida ",
+ tk="",
+ tr="",
+ ua="на сторінці ",
+ vi="",
+ },
+ },
+ august={
+ labels={
+ af="augustus",
+ ar="أغسطس",
+ ["ar-dz"]="أوت",
+ ["ar-ma"]="غشت",
+ ["ar-sy"]="آب",
+ ca="agost",
+ cn="八月",
+ cs="srpna",
+ da="august",
+ de="August",
+ en="August",
+ es="agosto",
+ fi="elokuu",
+ fr="août",
+ gr="Αύγουστος",
+ hr="kolovoza",
+ hu="augusztus",
+ it="agosto",
+ ja="8",
+ kr="8월",
+ la="Augustus",
+ lt="rugpjūčio",
+ nb="august",
+ nl="augustus",
+ nn="august",
+ pl="sierpnia",
+ pt="agosto",
+ ro="august",
+ ru="августа",
+ sk="augusta",
+ sl="avgust",
+ sv="augusti",
+ tk="awgust",
+ tr="ağustos",
+ ua="серпня",
+ vi="tháng tám",
+ },
+ },
+ ["august:mnem"]={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="",
+ en="aug",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr="kol",
+ hu="aug.",
+ it="",
+ la="",
+ lt="aug",
+ nb="aug.",
+ nl="",
+ nn="aug.",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ chapter={
+ hidden=true,
+ labels={
+ af="Hoofstuk ",
+ ar="باب ",
+ ca="Capítol ",
+ cn={"第","章"},
+ cs="Kapitola ",
+ da="",
+ de="Kapitel ",
+ en="Chapter ",
+ es="Capítulo ",
+ fi="",
+ fr="Chapitre ",
+ gr="Κεφάλαιο",
+ hr="Poglavlje ",
+ hu=",. fejezet:",
+ it="",
+ ja={"第","章"},
+ kr={"제","장"},
+ la="",
+ lt="",
+ nb="",
+ nl="",
+ nn="",
+ pl="Rozdział ",
+ pt="",
+ ro="",
+ ru="",
+ sk="Kapitola ",
+ sl="Poglavje ",
+ sv="",
+ tk="Bap",
+ tr="",
+ ua="",
+ vi="Chương ",
+ },
+ },
+ continued={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="",
+ en=" (continued)",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr=" (nastavak)",
+ hu=" (folytatás)",
+ it="",
+ la="",
+ lt="",
+ nb="",
+ nl=" (vervolgd)",
+ nn="",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ december={
+ labels={
+ af="desember",
+ ar="ديسمبر",
+ ["ar-ma"]="دجنبر",
+ ["ar-sy"]="كانون الأول",
+ ca="desembre",
+ cn="十二月",
+ cs="prosince",
+ da="december",
+ de="Dezember",
+ en="December",
+ es="diciembre",
+ fi="joulukuu",
+ fr="décembre",
+ gr="Δεκέμβριος",
+ hr="prosinca",
+ hu="december",
+ it="dicembre",
+ ja="12",
+ kr="12월",
+ la="December",
+ lt="gruodžio",
+ nb="desember",
+ nl="december",
+ nn="desember",
+ pl="grudnia",
+ pt="dezembro",
+ ro="decembrie",
+ ru="декабря",
+ sk="decembra",
+ sl="december",
+ sv="december",
+ tk="dekabr",
+ tr="aralık",
+ ua="грудня",
+ vi="tháng mười hai",
+ },
+ },
+ ["december:mnem"]={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="",
+ en="dec",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr="pro",
+ hu="dec.",
+ it="",
+ la="",
+ lt="dec",
+ nb="des.",
+ nl="",
+ nn="des.",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ february={
+ labels={
+ af="februarie",
+ ar="فبراير",
+ ["ar-dz"]="فيفري",
+ ["ar-sy"]="شباط",
+ ca="febrer",
+ cn="二月",
+ cs="února",
+ da="februar",
+ de="Februar",
+ en="February",
+ es="febrero",
+ fi="helmikuu",
+ fr="février",
+ gr="Φεβρουάριος",
+ hr="veljače",
+ hu="február",
+ it="febbraio",
+ ja="2",
+ kr="2월",
+ la="Februarius",
+ lt="vasario",
+ nb="februar",
+ nl="februari",
+ nn="februar",
+ pl="lutego",
+ pt="fevereiro",
+ ro="februarie",
+ ru="февраля",
+ sk="februára",
+ sl="februar",
+ sv="februari",
+ tk="fewral",
+ tr="Şubat",
+ ua="лютого",
+ vi="tháng hai",
+ },
+ },
+ ["february:mnem"]={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="",
+ en="feb",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr="velj",
+ hu="feb.",
+ it="",
+ la="",
+ lt="feb",
+ nb="feb.",
+ nl="",
+ nn="feb.",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ figure={
+ labels={
+ af="Figuur ",
+ ar="شكل ",
+ ca="Figura ",
+ cn="图",
+ cs="Obrázek ",
+ da="Figur ",
+ de="Abbildung ",
+ en="Figure ",
+ es="Ilustración ",
+ fi="Kuva ",
+ fr="Figure ",
+ gr="Σχήμα",
+ hr="Slika ",
+ hu=",. ábra:",
+ it="Fig. ",
+ ja="図",
+ kr="그림",
+ la="Imago ",
+ lt=", pav.",
+ nb="Figur ",
+ nl="Figuur ",
+ nn="Figur ",
+ pl="Ilustracja ",
+ pt="Figura ",
+ ro="Figura ",
+ ru="Рисунок ",
+ sk="Obrázok ",
+ sl="Slika ",
+ sv="Figur ",
+ tk="Surat",
+ tr="Şekil ",
+ ua="Малюнок ",
+ vi="Hình ",
+ },
+ },
+ friday={
+ labels={
+ af="vrydag",
+ ar="الجمعة",
+ ca="divendres",
+ cn="星期五",
+ cs="pátek",
+ da="fredag",
+ de="Freitag",
+ en="Friday",
+ es="viernes",
+ fi="perjantai",
+ fr="vendredi",
+ gr="Παρασκευή",
+ hr="petak",
+ hu="péntek",
+ it="venerdì",
+ ja="金曜日",
+ kr="금요일",
+ la="Dies Veneris",
+ lt="penktadienis",
+ nb="fredag",
+ nl="vrijdag",
+ nn="fredag",
+ pl="piątek",
+ pt="sexta-feira",
+ ro="vineri",
+ ru="пятница",
+ sk="",
+ sl="petek",
+ sv="fredag",
+ tk="bäşinji gün",
+ tr="cuma",
+ ua="п'ятниця",
+ vi="thứ sáu",
+ },
+ },
+ graphic={
+ labels={
+ af="Grafiek ",
+ ar="رسم ",
+ ca="Gràfica ",
+ cn="插图",
+ cs="Graf ",
+ da="Grafik ",
+ de="Graphik ",
+ en="Graphic ",
+ es="Gráfico ",
+ fi="Grafiikka ",
+ fr="Illustration ",
+ gr="Γραφικό",
+ hr="Slika ",
+ hu=",. kép:",
+ it="Grafico ",
+ ja="イラスト",
+ la="Typus ",
+ lt="Graphic ",
+ nb="Bilde ",
+ nl="Grafiek ",
+ nn="Bilete ",
+ pl="Grafika ",
+ pt="Gráfico ",
+ ro="Graficul ",
+ ru="График ",
+ sk="Graf ",
+ sl="Slika ",
+ sv="Grafik ",
+ tk="Grafik",
+ tr="Grafik",
+ ua="График ",
+ vi="Đồ thị",
+ },
+ },
+ hencefore={
+ labels={
+ af="",
+ ar="كما وضحنا سابقا",
+ ca="",
+ cs="viz výše",
+ da="se foroven",
+ de="siehe oben",
+ en="as we show above",
+ es="",
+ fi="",
+ fr="ci-dessus",
+ gr="",
+ hr="vidi gore",
+ hu="lásd feljebb",
+ kr="그러므로",
+ it="come mostrato sopra",
+ la="",
+ lt="kaip parodyta aukščiau",
+ nb="som vist over",
+ nl="hierboven",
+ nn="som vist over",
+ pl="",
+ pt="",
+ ro="",
+ ru="см. выше",
+ sk="",
+ sl="glej zgoraj",
+ sv="se ovan",
+ tk="",
+ tr="",
+ ua="як показано вище",
+ vi="",
+ },
+ },
+ hereafter={
+ labels={
+ af="",
+ ar="كما نوضح لاحقا",
+ ca="",
+ cs="viz níže",
+ da="se forneden",
+ de="siehe unten",
+ en="as we show below",
+ es="",
+ fi="",
+ fr="ci-dessous",
+ gr="",
+ hr="vidi ispod",
+ hu="lásd lejjebb",
+ it="come mostrato sotto",
+ la="",
+ lt="kaip parodyta žemiau",
+ nb="som vist under",
+ nl="hieronder",
+ nn="som vist under",
+ pl="",
+ pt="",
+ ro="",
+ ru="см. ниже",
+ sk="",
+ sl="glej spodaj",
+ sv="se nedan",
+ tk="",
+ tr="",
+ ua="як показано нижче",
+ vi="",
+ },
+ },
+ intermezzo={
+ labels={
+ af="Intermezzo ",
+ ar="فسحة ",
+ ca="Intermedi ",
+ cn="퉣",
+ cs="Intermezzo ",
+ da="Intermezzo ",
+ de="Intermezzo ",
+ en="Intermezzo ",
+ es="Intermedio ",
+ fi="Intermezzo ",
+ fr="Intermède ",
+ gr="Παύση",
+ hr="Intermeco ",
+ hu=",. intermezzo:",
+ it="Intermezzo ",
+ ja="間奏曲",
+ kr="간주곡",
+ la="Intermissum ",
+ lt="Intermezzo ",
+ nb="Intermesso ",
+ nl="Intermezzo ",
+ nn="Intermesso ",
+ pl="Intermezzo ",
+ pt="Intermédio ",
+ ro="Intermezzo ",
+ ru="Вставка ",
+ sk="Intermezzo ",
+ sl="Intermezzo ",
+ sv="Intermezzo ",
+ tk="Arakesme",
+ tr="",
+ ua="Вставка ",
+ vi="intermezzo",
+ },
+ },
+ january={
+ labels={
+ af="januarie",
+ ar="يناير",
+ ["ar-dz"]="جانفي",
+ ["ar-sy"]="كانون الثاني",
+ ca="gener",
+ cn="一月",
+ cs="ledna",
+ da="januar",
+ de="Januar",
+ en="January",
+ es="enero",
+ fi="tammikuu",
+ fr="janvier",
+ gr="Ιανουάριος",
+ hr="siječnja",
+ hu="január",
+ it="gennaio",
+ ja="1",
+ kr="1월",
+ la="Ianuarius",
+ lt="sausio",
+ nb="januar",
+ nl="januari",
+ nn="januar",
+ pl="stycznia",
+ pt="janeiro",
+ ro="ianuarie",
+ ru="января",
+ sk="januára",
+ sl="januar",
+ sv="januari",
+ tk="ýanwar",
+ tr="ocak",
+ ua="січня",
+ vi="tháng giêng",
+ },
+ },
+ ["january:mnem"]={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="",
+ en="jan",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr="sij",
+ hu="jan.",
+ it="",
+ la="",
+ lt="jan",
+ nb="jan.",
+ nl="",
+ nn="jan.",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ july={
+ labels={
+ af="julie",
+ ar="يوليو",
+ ["ar-dz"]="جويلة",
+ ["ar-ma"]="يوليوز",
+ ["ar-sy"]="تموز",
+ ca="juliol",
+ cn="七月",
+ cs="července",
+ da="juli",
+ de="Juli",
+ en="July",
+ es="julio",
+ fi="heinäkuu",
+ fr="juillet",
+ gr="Ιούλιος",
+ hr="srpnja",
+ hu="július",
+ it="luglio",
+ ja="7",
+ kr="7월",
+ la="Iulius",
+ lt="liepos",
+ nb="juli",
+ nl="juli",
+ nn="juli",
+ pl="lipca",
+ pt="julho",
+ ro="iulie",
+ ru="июля",
+ sk="júla",
+ sl="julij",
+ sv="juli",
+ tk="iýul",
+ tr="temmuz",
+ ua="липня",
+ vi="tháng bảy",
+ },
+ },
+ ["july:mnem"]={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="",
+ en="jul",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr="srp",
+ hu="júl.",
+ it="",
+ la="",
+ lt="jul",
+ nb="juli",
+ nl="",
+ nn="juli",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ june={
+ labels={
+ af="junie",
+ ar="يونيو",
+ ["ar-dz"]="جوان",
+ ["ar-sy"]="حزيران",
+ ca="juny",
+ cn="六月",
+ cs="června",
+ da="juni",
+ de="Juni",
+ en="June",
+ es="junio",
+ fi="kesäkuu",
+ fr="juin",
+ gr="Ιούνιος",
+ hr="lipnja",
+ hu="június",
+ it="giugno",
+ ja="6",
+ kr="6월",
+ la="Iunius",
+ lt="birželio",
+ nb="juni",
+ nl="juni",
+ nn="juni",
+ pl="czerwca",
+ pt="junho",
+ ro="iunie",
+ ru="июня",
+ sk="júna",
+ sl="junij",
+ sv="juni",
+ tk="iýun",
+ tr="haziran",
+ ua="червня",
+ vi="tháng sáu",
+ },
+ },
+ ["june:mnem"]={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="",
+ en="jun",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr="lip",
+ hu="jún.",
+ it="",
+ la="",
+ lt="jun",
+ nb="juni",
+ nl="",
+ nn="juni",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ line={
+ labels={
+ af="reël ",
+ ar="سطر ",
+ ca="línia ",
+ cn="行",
+ cs="řádek ",
+ da="linie ",
+ de="Zeile ",
+ en="line ",
+ es="línea ",
+ fi="rivi ",
+ fr="ligne ",
+ gr="Γραμμή",
+ hr="redak ",
+ hu=",. sor:",
+ it="riga ",
+ ja="線",
+ kr="행",
+ la="versus ",
+ lt="line ",
+ nb="linje ",
+ nl="regel ",
+ nn="linje ",
+ pl="wiersz ",
+ pt="linha ",
+ ro="linia ",
+ ru="строка ",
+ sk="riadok ",
+ sl="vrstica ",
+ sv="rad ",
+ tk="setir",
+ tr="satır ",
+ ua="рядок ",
+ vi="dòng ",
+ },
+ },
+ lines={
+ labels={
+ af="reëls ",
+ ar="السطور ",
+ ca="línies ",
+ cn="行",
+ cs="řádky ",
+ da="linier ",
+ de="Zeilen ",
+ en="lines ",
+ es="líneas ",
+ fi="rivie ",
+ fr="lignes ",
+ gr="Γραμμές",
+ hr="retci ",
+ hu="sorok ",
+ it="righe ",
+ ja="線",
+ kr="행",
+ la="versus ",
+ lt="lines ",
+ nb="linjer ",
+ nl="regels ",
+ nn="linjer ",
+ pl="wiersze ",
+ pt="linhas ",
+ ro="liniile ",
+ ru="строки ",
+ sk="riadky ",
+ sl="vrstice ",
+ sv="rader ",
+ tk="setirler",
+ tr="satırlar ",
+ ua="рядки ",
+ vi="dòng ",
+ },
+ },
+ march={
+ labels={
+ af="maart",
+ ar="مارس",
+ ["ar-sy"]="آذار",
+ ca="març",
+ cn="三月",
+ cs="března",
+ da="marts",
+ de="März",
+ en="March",
+ es="marzo",
+ fi="maaliskuu",
+ fr="mars",
+ gr="Μάρτιος",
+ hr="ožujka",
+ hu="március",
+ it="marzo",
+ ja="3",
+ kr="3월",
+ la="Martius",
+ lt="kovo",
+ nb="mars",
+ nl="maart",
+ nn="mars",
+ pl="marca",
+ pt="março",
+ ro="martie",
+ ru="марта",
+ sk="marca",
+ sl="marec",
+ sv="mars",
+ tk="mart",
+ tr="mart",
+ ua="березня",
+ vi="tháng ba",
+ },
+ },
+ ["march:mnem"]={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="",
+ en="mar",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr="ožu",
+ hu="már.",
+ it="",
+ la="",
+ lt="mar",
+ nb="mars",
+ nl="",
+ nn="mars",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ may={
+ labels={
+ af="mei",
+ ar="مايو",
+ ["ar-dz"]="ماي",
+ ["ar-ma"]="ماي",
+ ["ar-sy"]="أيار",
+ ca="maig",
+ cn="五月",
+ cs="května",
+ da="maj",
+ de="Mai",
+ en="May",
+ es="mayo",
+ fi="toukokuu",
+ fr="mai",
+ gr="Μάιος",
+ hr="svibnja",
+ hu="május",
+ it="maggio",
+ ja="5",
+ kr="5월",
+ la="Maius",
+ lt="gegužės",
+ nb="mai",
+ nl="mei",
+ nn="mai",
+ pl="maja",
+ pt="maio",
+ ro="mai",
+ ru="мая",
+ sk="mája",
+ sl="maj",
+ sv="maj",
+ tk="maý",
+ tr="mayıs",
+ ua="травня",
+ vi="tháng năm",
+ },
+ },
+ ["may:mnem"]={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="",
+ en="may",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr="svi",
+ hu="máj.",
+ it="",
+ la="",
+ lt="may",
+ nb="mai",
+ nl="",
+ nn="mai",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ monday={
+ labels={
+ af="maandag",
+ ar="الاثنين",
+ ca="dilluns",
+ cn="星期一",
+ cs="pondělí",
+ da="mandag",
+ de="Montag",
+ en="Monday",
+ es="lunes",
+ fi="maanantai",
+ fr="lundi",
+ gr="Δευτέρα",
+ hr="ponedjeljak",
+ hu="hétfő",
+ it="lunedì",
+ ja="月曜日",
+ kr="월요일",
+ la="Dies Lunae",
+ lt="pirmadienis",
+ nb="mandag",
+ nl="maandag",
+ nn="måndag",
+ pl="poniedziałek",
+ pt="segunda-feira",
+ ro="luni",
+ ru="понедельник",
+ sk="",
+ sl="ponedeljek",
+ sv="måndag",
+ tk="birinji gün",
+ tr="pazartesi",
+ ua="понеділок",
+ vi="thứ hai",
+ },
+ },
+ november={
+ labels={
+ af="november",
+ ar="نوفمبر",
+ ["ar-ma"]="نونبر",
+ ["ar-sy"]="تشرين الثاني",
+ ca="novembre",
+ cn="十一月",
+ cs="listopadu",
+ da="november",
+ de="November",
+ en="November",
+ es="noviembre",
+ fi="marraskuu",
+ fr="novembre",
+ gr="Νοέμβριος",
+ hr="studenog",
+ hu="november",
+ it="novembre",
+ ja="11",
+ kr="11월",
+ la="November",
+ lt="lapkričio",
+ nb="november",
+ nl="november",
+ nn="november",
+ pl="listopada",
+ pt="novembro",
+ ro="noiembrie",
+ ru="ноября",
+ sk="novembra",
+ sl="november",
+ sv="november",
+ tk="noýabr",
+ tr="kasım",
+ ua="листопада",
+ vi="tháng mười một",
+ },
+ },
+ ["november:mnem"]={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="",
+ en="nov",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr="stu",
+ hu="nov.",
+ it="",
+ la="",
+ lt="nov",
+ nb="nov.",
+ nl="",
+ nn="nov.",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ october={
+ labels={
+ af="oktober",
+ ar="أكتوبر",
+ ["ar-sy"]="تشرين الأول",
+ ca="octubre",
+ cn="十月",
+ cs="října",
+ da="oktober",
+ de="Oktober",
+ en="October",
+ es="octubre",
+ fi="lokakuu",
+ fr="octobre",
+ gr="Οκτώβριος",
+ hr="listopada",
+ hu="október",
+ it="ottobre",
+ ja="10",
+ kr="10월",
+ la="October",
+ lt="spalio",
+ nb="oktober",
+ nl="oktober",
+ nn="oktober",
+ pl="października",
+ pt="outubro",
+ ro="octombrie",
+ ru="октября",
+ sk="októbra",
+ sl="oktober",
+ sv="oktober",
+ tk="oktýabr",
+ tr="ekim",
+ ua="жовтня",
+ vi="tháng mười",
+ },
+ },
+ ["october:mnem"]={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="",
+ en="oct",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr="lis",
+ hu="okt.",
+ it="",
+ la="",
+ lt="oct",
+ nb="okt.",
+ nl="",
+ nn="okt.",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ page={
+ labels={
+ af="",
+ ar="صفحة ",
+ ca="",
+ cs="strana ",
+ da="Side ",
+ de="Seite ",
+ en="page ",
+ es="",
+ fi="",
+ fr="page ",
+ gr="",
+ hr="stranica ",
+ hu="oldal ",
+ it="pagina ",
+ kr="쪽",
+ la="",
+ lt="puslapis ",
+ nb="side ",
+ nl="pagina ",
+ nn="side ",
+ pl="",
+ pt="",
+ ro="",
+ ru="страница ",
+ sk="",
+ sl="stran ",
+ sv="Sida ",
+ tk="",
+ tr="",
+ ua="сторінка ",
+ vi="",
+ },
+ },
+ part={
+ labels={
+ af="Deel ",
+ ar="جزء ",
+ ca="Part ",
+ cn={"第","部分"},
+ cs="Část ",
+ da="Del ",
+ de="Teil ",
+ en="Part ",
+ es="Parte ",
+ fi="Osa ",
+ fr="Partie ",
+ gr="Μέρος",
+ hr="Dio ",
+ hu=",. rész:",
+ it="Parte ",
+ ja={"第","パート"},
+ kr={"제","부"},
+ la="Pars ",
+ lt=", dalis",
+ nb="Del",
+ nl="Deel ",
+ nn="Del",
+ pl="Ustęp ",
+ pt="Parte ",
+ ro="Partea ",
+ ru="Часть ",
+ sk="Časť ",
+ sl="Del ",
+ sv="Del ",
+ tk="Bölüm",
+ tr="Cilt ",
+ ua="Частина ",
+ vi="Phần ",
+ },
+ },
+ saturday={
+ labels={
+ af="saterdag",
+ ar="السبت",
+ ca="dissabte",
+ cn="星期六",
+ cs="sobota",
+ da="lørdag",
+ de="Samstag",
+ en="Saturday",
+ es="sábado",
+ fi="lauantai",
+ fr="samedi",
+ gr="Σάββατο",
+ hr="subota",
+ hu="szombat",
+ it="sabato",
+ ja="土曜日",
+ kr="토요일",
+ la="Dies Saturni",
+ lt="šeštadienis",
+ nb="lørdag",
+ nl="zaterdag",
+ nn="laurdag",
+ pl="sobota",
+ pt="sábado",
+ ro="sâmbătă",
+ ru="суббота",
+ sk="",
+ sl="sobota",
+ sv="lördag",
+ tk="altynjy gün",
+ tr="cumartesi",
+ ua="субота",
+ vi="thứ bảy",
+ },
+ },
+ section={
+ hidden=true,
+ labels={
+ af="Paragraaf ",
+ ar="فصل ",
+ ca="Secció ",
+ cn={"第","节"},
+ cs="Sekce ",
+ da="",
+ de="",
+ en="",
+ es="Sección ",
+ fi="",
+ fr="Section ",
+ gr="Ενότητα",
+ hr="Odjeljak ",
+ hu="Fejezet ",
+ it="",
+ ja={"第","項"},
+ kr={"제","절"},
+ la="",
+ lt="",
+ nb="",
+ nl="",
+ nn="",
+ pl="Podrozdział ",
+ pt="",
+ ro="",
+ ru="",
+ sk="Sekcia ",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ see={
+ labels={
+ af="",
+ ar="انظر ",
+ ca="",
+ cs="viz ",
+ da="se ",
+ de="siehe ",
+ en="see ",
+ es="",
+ fi="",
+ fr="cf. ",
+ gr="",
+ hr="vidi ",
+ hu="lásd ",
+ it="cf. ",
+ kr="",
+ la="",
+ lt="žiūrėti ",
+ nb="se ",
+ nl="zie ",
+ nn="sjå ",
+ pl="",
+ pt="",
+ ro="",
+ ru="см. ",
+ sk="",
+ sl="glej ",
+ sv="se ",
+ tk="",
+ tr="",
+ ua="див. ",
+ vi="",
+ },
+ },
+ september={
+ labels={
+ af="september",
+ ar="سبتمبر",
+ ["ar-ma"]="شتنبر",
+ ["ar-sy"]="أيلول",
+ ca="setembre",
+ cn="九月",
+ cs="září",
+ da="september",
+ de="September",
+ en="September",
+ es="septiembre",
+ fi="syyskuu",
+ fr="septembre",
+ gr="Σεπτέμβριος",
+ hr="rujna",
+ hu="szeptember",
+ it="settembre",
+ ja="9",
+ kr="9월",
+ la="September",
+ lt="rugsėjo",
+ nb="september",
+ nl="september",
+ nn="september",
+ pl="września",
+ pt="setembro",
+ ro="septembrie",
+ ru="сентября",
+ sk="septembra",
+ sl="september",
+ sv="september",
+ tk="sentýabr",
+ tr="eylül",
+ ua="вересня",
+ vi="tháng chín",
+ },
+ },
+ ["september:mnem"]={
+ labels={
+ af="",
+ ca="",
+ cs="",
+ da="",
+ de="",
+ en="sep",
+ es="",
+ fi="",
+ fr="",
+ gr="",
+ hr="ruj",
+ hu="szep.",
+ it="",
+ la="",
+ lt="sep",
+ nb="sep.",
+ nl="",
+ nn="sep.",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ subsection={
+ hidden=true,
+ labels={
+ af="",
+ ar="فصل أدنى ",
+ ca="Subsecció ",
+ cn="",
+ cs="Podsekce ",
+ da="",
+ de="",
+ en="",
+ es="Subsección ",
+ fi="",
+ fr="Soussection ",
+ gr="Υπόενότητα",
+ hr="Pododjeljak ",
+ hu="Alfejezet ",
+ it="",
+ ja="",
+ la="",
+ lt="",
+ nb="",
+ nl="",
+ nn="",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="Podsekcia ",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ subsubsection={
+ hidden=true,
+ labels={
+ af="",
+ ar="فصل أ دنى أدنى ",
+ ca="Subsubsecció ",
+ cn="",
+ cs="Podpodsekce ",
+ da="",
+ de="",
+ en="",
+ es="Subsubsección ",
+ fi="",
+ fr="Soussoussection ",
+ gr="",
+ hr="Podpododjeljak ",
+ hu="Al-alfejezet ",
+ it="",
+ ja="",
+ la="",
+ lt="",
+ nb="",
+ nl="",
+ nn="",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="Podpodsekcia ",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ subsubsubsection={
+ hidden=true,
+ labels={
+ af="",
+ ar="فصل أدنى أدنى أدنى ",
+ ca="Subsubsubsecció ",
+ cn="",
+ cs="Podpodpodsekce ",
+ da="",
+ de="",
+ en="",
+ es="Subsubsubsección ",
+ fi="",
+ fr="Soussoussoussection ",
+ gr="",
+ hr="Podpodpododjeljak ",
+ hu="Al-al-alfejezet ",
+ it="",
+ ja="",
+ la="",
+ lt="",
+ nb="",
+ nl="",
+ nn="",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="Podpodpodsekcia ",
+ sl="",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ sunday={
+ labels={
+ af="sondag",
+ ar="الأحد",
+ ca="diumenge",
+ cn="星期日",
+ cs="neděle",
+ da="søndag",
+ de="Sonntag",
+ en="Sunday",
+ es="domingo",
+ fi="sunnuntai",
+ fr="dimanche",
+ gr="Κυριακή",
+ hr="nedjelja",
+ hu="vasárnap",
+ it="domenica",
+ ja="日曜日",
+ kr="일요일",
+ la="Dies Solis",
+ lt="sekmadienis",
+ nb="søndag",
+ nl="zondag",
+ nn="sundag",
+ pl="niedziela",
+ pt="domingo",
+ ro="duminică",
+ ru="воскресенье",
+ sk="",
+ sl="nedelja",
+ sv="söndag",
+ tk="dynç gün",
+ tr="pazar",
+ ua="неділя",
+ vi="chủ nhật",
+ },
+ },
+ table={
+ labels={
+ af="Tabel",
+ ar="جدول ",
+ ca="Taula ",
+ cn="表",
+ cs="Tabulka ",
+ da="Tabel ",
+ de="Tabelle ",
+ en="Table ",
+ es="Tabla ",
+ fi="Taulukko ",
+ fr="Tableau ",
+ gr="Πίνακας",
+ hr="Tablica ",
+ hu=",. táblázat:",
+ it="Tabella ",
+ ja="表",
+ kr="표",
+ la="Tabula ",
+ lt=", lentelė.",
+ nb="Tabell ",
+ nl="Tabel ",
+ nn="Tabell ",
+ pl="Tabela ",
+ pt="Tabela ",
+ ro="Tabelul ",
+ ru="Таблица ",
+ sk="Tabuľka ",
+ sl="Tabela ",
+ sv="Tabell ",
+ tk="Tablisa",
+ tr="Tablo ",
+ ua="Таблиця ",
+ vi="Bảng ",
+ },
+ },
+ thursday={
+ labels={
+ af="donderdag",
+ ar="الخميس",
+ ca="dijous",
+ cn="星期四",
+ cs="čtvrtek",
+ da="torsdag",
+ de="Donnerstag",
+ en="Thursday",
+ es="jueves",
+ fi="torstai",
+ fr="jeudi",
+ gr="Πέμπτη",
+ hr="četvrtak",
+ hu="csütörtök",
+ it="giovedì",
+ ja="木曜日",
+ kr="목요일",
+ la="Dies Iovis",
+ lt="ketvirtadienis",
+ nb="torsdag",
+ nl="donderdag",
+ nn="torsdag",
+ pl="czwartek",
+ pt="quinta-feira",
+ ro="joi",
+ ru="четверг",
+ sk="",
+ sl="četrtek",
+ sv="torsdag",
+ tk="dördünji gün",
+ tr="perşembe",
+ ua="четвер",
+ vi="thứ năm",
+ },
+ },
+ tuesday={
+ labels={
+ af="dinsdag",
+ ar="الثلاثاء",
+ ca="dimarts",
+ cn="星期二",
+ cs="úterý",
+ da="tirsdag",
+ de="Dienstag",
+ en="Tuesday",
+ es="martes",
+ fi="tiistai",
+ fr="mardi",
+ gr="Τρίτη",
+ hr="utorak",
+ hu="kedd",
+ it="martedì",
+ ja="火曜日",
+ kr="화요일",
+ la="Dies Martis",
+ lt="antradienis",
+ nb="tirsdag",
+ nl="dinsdag",
+ nn="tysdag",
+ pl="wtorek",
+ pt="terça-feira",
+ ro="marți",
+ ru="вторник",
+ sk="",
+ sl="torek",
+ sv="tisdag",
+ tk="ikinji gün",
+ tr="salı",
+ ua="вівторок",
+ vi="thứ ba",
+ },
+ },
+ wednesday={
+ labels={
+ af="woensdag",
+ ar="الأربعاء",
+ ca="dimecres",
+ cn="星期三",
+ cs="středa",
+ da="onsdag",
+ de="Mittwoch",
+ en="Wednesday",
+ es="miércoles",
+ fi="keskiviikko",
+ fr="mercredi",
+ gr="Τετάρτη",
+ hr="srijeda",
+ hu="szerda",
+ it="mercoledì",
+ ja="水曜日",
+ kr="수요일",
+ la="Dies Mercuri",
+ lt="trečiadienis",
+ nb="onsdag",
+ nl="woensdag",
+ nn="onsdag",
+ pl="środa",
+ pt="quarta-feira",
+ ro="miercuri",
+ ru="среда",
+ sk="",
+ sl="sreda",
+ sv="onsdag",
+ tk="üçünji",
+ tr="çarşamba",
+ ua="середа",
+ vi="thứ tư",
+ },
+ },
+ },
+ titles={
+ abbreviations={
+ labels={
+ af="Afkortings",
+ ar="الاختصارات",
+ ca="Abreviacions",
+ cn="缩略语",
+ cs="Zkratky",
+ da="Forkortelser",
+ de="Abkürzungen",
+ en="Abbreviations",
+ es="Abreviaturas",
+ fi="Lyhennyksi",
+ fr="Abréviations",
+ gr="Συντομογραφίες",
+ hr="Kratice",
+ hu="Rövidítések",
+ it="Abbreviazioni",
+ ja="略語",
+ kr="약어",
+ la="Notae",
+ lt="Santrumpos",
+ nb="Forkortelser",
+ nl="Afkortingen",
+ nn="Forkortingar",
+ pl="Skrócenie",
+ pt="Abreviaturas",
+ ro="Abrevieri",
+ ru="Список сокращений",
+ sk="Skratky",
+ sl="Kratice",
+ sv="Förkortningar",
+ tk="Gysgaltmalar",
+ tr="Kısaltmalar",
+ ua="Перелік скорочень",
+ vi="Chữ viết tắt",
+ },
+ },
+ content={
+ labels={
+ af="Inhoud",
+ ar="المحتويات",
+ ca="Índex de continguts",
+ cn="目录",
+ cs="Obsah",
+ da="Indhold",
+ de="Inhalt",
+ en="Contents",
+ es="Índice",
+ fi="Sisällys",
+ fr="Table des matières",
+ gr="Περιεχόμενα",
+ hr="Sadržaj",
+ hu="Tartalom",
+ it="Indice",
+ ja="目次",
+ kr="목차",
+ la="Quod in libro continetur",
+ lt="Turinys",
+ nb="Innhold",
+ nl="Inhoud",
+ nn="Innhald",
+ pl="Spis treści",
+ pt="Conteúdo",
+ ro="Cuprins",
+ ru="Содержание",
+ sk="Obsah",
+ sl="Kazalo",
+ sv="Innehåll",
+ tk="Mazmuny",
+ tr="Fihrist",
+ ua="Зміст",
+ vi="Mục lục",
+ },
+ },
+ figures={
+ labels={
+ af="Figure",
+ ar="الأشكال",
+ ca="Figures",
+ cn="图形",
+ cs="Obrázky",
+ da="Figurer",
+ de="Abbildungen",
+ en="Figures",
+ es="Ilustraciones",
+ fi="Kuvi",
+ fr="Figures",
+ gr="Σχήματα",
+ hr="Slike",
+ hu="Ábrák",
+ it="Figure",
+ ja="図",
+ kr="그림",
+ la="Imagines",
+ lt="Iliustracijos",
+ nb="Figurer",
+ nl="Figuren",
+ nn="Figurar",
+ pl="Ilustracje",
+ pt="Figuras",
+ ro="Figuri",
+ ru="Список иллюстраций",
+ sk="Obrázkov",
+ sl="Slike",
+ sv="Figurer",
+ tk="Suratlar",
+ tr="Şekiller",
+ ua="Перелік ілюстрацій",
+ vi="Danh sách hình vẽ",
+ },
+ },
+ graphics={
+ labels={
+ af="Grafieke",
+ ar="الرسوم",
+ ca="Gràfiques",
+ cn="图",
+ cs="Grafy",
+ da="Grafik",
+ de="Graphiken",
+ en="Graphics",
+ es="Gráficos",
+ fi="Grafiikkaoi",
+ fr="Graphiques",
+ gr="Γραφικά",
+ hr="Slike",
+ hu="Grafikák",
+ it="Grafici",
+ ja="グラフ",
+ kr="그래픽",
+ la="Typi",
+ lt="Graphics",
+ nb="Bilde",
+ nl="Grafieken",
+ nn="Bilete",
+ pl="Grafika",
+ pt="Gráficos",
+ ro="Grafice",
+ ru="Список графиков",
+ sk="Graf",
+ sl="Slike",
+ sv="Grafik",
+ tk="Grafikler",
+ tr="Grafikler",
+ ua="Перелік графіков",
+ vi="Đồ thị",
+ },
+ },
+ index={
+ labels={
+ af="Indeks",
+ ar="الفهرس",
+ ca="Índex alfabètic",
+ cn="索引",
+ cs="Rejstřík",
+ da="Indeks",
+ de="Index",
+ en="Index",
+ es="Índice alfabético",
+ fi="Indeksiluku",
+ fr="Index",
+ gr="Ευρετήριο",
+ hr="Indeks",
+ hu="Index",
+ it="Indice",
+ ja="目次",
+ kr="색인",
+ la="Indices",
+ lt="Rodyklė",
+ nb="Register",
+ nl="Index",
+ nn="Register",
+ pl="Indeks",
+ pt="Índice",
+ ro="Index",
+ ru="Алфавитный указатель",
+ sk="Zoznam",
+ sl="Stvarno kazalo",
+ sv="Sakregister",
+ tk="Indeks",
+ tr="İndex",
+ ua="Покажчик",
+ vi="Chỉ số",
+ },
+ },
+ intermezzi={
+ labels={
+ af="Intermezzos",
+ ar="فسح",
+ ca="Intermedis",
+ cn="퉣",
+ cs="Intermezza",
+ da="Intermezzoer",
+ de="Intermezzi",
+ en="Intermezzos",
+ es="Intermedios",
+ fi="Intermezzos",
+ fr="Intermèdes",
+ gr="Παύσεις",
+ hr="Intermeci",
+ hu="Intermezzok",
+ it="Intermezzi",
+ ja="間奏曲",
+ kr="간주곡",
+ la="Intermissa",
+ lt="Intermezzos",
+ nb="Intermesso",
+ nl="Intermezzo's",
+ nn="Intermesso",
+ pl="Intermezza",
+ pt="Intermédios",
+ ro="Intermzzo",
+ ru="Список вставок",
+ sk="Intermezzá",
+ sl="Intermezzi",
+ sv="Intermezzon",
+ tk="Arakesmeler",
+ tr="",
+ ua="Перелік вставок",
+ vi="Intermezzos",
+ },
+ },
+ logos={
+ labels={
+ af="Logos",
+ ar="الشعارات",
+ ca="Logotips",
+ cn="徽贬",
+ cs="Loga",
+ da="Logoer",
+ de="Logos",
+ en="Logos",
+ es="Logotipos",
+ fi="Vertauskuva",
+ fr="Logos",
+ gr="Λογότυπα",
+ hr="Logotipi",
+ hu="Fejlécek",
+ it="Logotipi",
+ ja="理性",
+ kr="이성",
+ la="Typi negotiales",
+ lt="Logos",
+ nb="Logoer",
+ nl="Logo's",
+ nn="Logoar",
+ pl="Znaki",
+ pt="Logotipos",
+ ro="Logo-uri",
+ ru="Логотипы",
+ sk="Logá",
+ sl="Logotipi",
+ sv="Loggor",
+ tk="Logolar",
+ tr="Logolar",
+ ua="Логотипи",
+ vi="Biểu tượng",
+ },
+ },
+ pubs={
+ labels={
+ af="",
+ ca="Referències",
+ cs="Literatura",
+ da="",
+ de="Literatur",
+ en="References",
+ es="Bibliografía",
+ fi="",
+ fr="Bibliographie",
+ gr="",
+ hr="Literatura",
+ hu="Bibliográfia",
+ it="Bibliografia",
+ la="",
+ lt="Literatūra",
+ nb="",
+ nl="Literatuur",
+ nn="",
+ pl="",
+ pt="",
+ ro="",
+ ru="",
+ sk="",
+ sl="Literatura",
+ sv="",
+ tk="",
+ tr="",
+ ua="",
+ vi="",
+ },
+ },
+ tables={
+ labels={
+ af="Tabelle",
+ ar="الجداول",
+ ca="Taules",
+ cn="表格",
+ cs="Tabulky",
+ da="Tabeller",
+ de="Tabellen",
+ en="Tables",
+ es="Tablas",
+ fi="Taulukkoj",
+ fr="Tableaux",
+ gr="Πίνακες",
+ hr="Tablice",
+ hu="Táblázatok",
+ it="Tabelle",
+ ja="机",
+ kr="표",
+ la="Tabulae",
+ lt="Lentelės",
+ nb="Tabeller",
+ nl="Tabellen",
+ nn="Tabellar",
+ pl="Tabele",
+ pt="Tabelas",
+ ro="Tabele",
+ ru="Список таблиц",
+ sk="Tabuliek",
+ sl="Tabele",
+ sv="Tabeller",
+ tk="Tablisalar",
+ tr="Tablolar",
+ ua="Перелік таблиць",
+ vi="Danh sách bảng",
+ },
+ },
+ units={
+ labels={
+ af="Eenhede",
+ ar="الوحدات",
+ ca="Unitats",
+ cn="计量单位",
+ cs="Jednotky",
+ da="Enheder",
+ de="Einheiten",
+ en="Units",
+ es="Unidades",
+ fi="Yksiköt",
+ fr="Unités",
+ gr="Μονάδες",
+ hr="Jedinice",
+ hu="Mértékegységek",
+ it="Unità",
+ ja="ユニッツ",
+ kr="측정단위",
+ la="Modi",
+ lt="Units",
+ nb="Enheter",
+ nl="Eenheden",
+ nn="Einingar",
+ pl="Jednostki",
+ pt="Unidades",
+ ro="Unități",
+ ru="Единицы измерения",
+ sk="Jednotky",
+ sl="Enote",
+ sv="Enheter",
+ tk="Birlikler",
+ tr="Birimler",
+ ua="Одиниці виміру",
+ vi="Đơn vị",
+ },
+ },
+ },
+}
diff --git a/Master/texmf-dist/tex/context/base/lang-ura.tex b/Master/texmf-dist/tex/context/base/lang-ura.mkii
index a2bcd3d2bf2..a2bcd3d2bf2 100644
--- a/Master/texmf-dist/tex/context/base/lang-ura.tex
+++ b/Master/texmf-dist/tex/context/base/lang-ura.mkii
diff --git a/Master/texmf-dist/tex/context/base/lang-url.lua b/Master/texmf-dist/tex/context/base/lang-url.lua
index b0a71ec679e..e401e41484d 100644
--- a/Master/texmf-dist/tex/context/base/lang-url.lua
+++ b/Master/texmf-dist/tex/context/base/lang-url.lua
@@ -11,9 +11,10 @@ local utf = unicode.utf8
local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
local utfbyte, utfgsub = utf.byte, utf.gsub
-local ctxcatcodes, texsprint = tex.ctxcatcodes, tex.sprint
+context = context
-commands = commands or { }
+commands = commands or { }
+local commands = commands
--[[
<p>Hyphenating <l n='url'/>'s is somewhat tricky and a matter of taste. I did
@@ -23,10 +24,9 @@ dealing with <l n='ascii'/> characters.</p>
]]--
commands.hyphenatedurl = commands.hyphenatedurl or { }
+local hyphenatedurl = commands.hyphenatedurl
-local hyphenatedurl = commands.hyphenatedurl
-
-hyphenatedurl.characters = {
+hyphenatedurl.characters = utilities.storage.allocate {
["!"] = 1,
["\""] = 1,
["#"] = 1,
@@ -68,7 +68,7 @@ hyphenatedurl.discretionary = nil
local chars = hyphenatedurl.characters
-function hyphenatedurl.action(str, left, right, disc)
+local function action(hyphenatedurl, str, left, right, disc)
local n = 0
local b = math.max( left or hyphenatedurl.lefthyphenmin, 2)
local e = math.min(#str-(right or hyphenatedurl.righthyphenmin)+2,#str)
@@ -76,20 +76,24 @@ function hyphenatedurl.action(str, left, right, disc)
for s in utfcharacters(str) do
n = n + 1
if s == d then
- texsprint(ctxcatcodes,"\\d{",utfbyte(s),"}")
+ context.d(utfbyte(s))
else
local c = chars[s]
if not c or n<=b or n>=e then
- texsprint(ctxcatcodes,"\\n{",utfbyte(s),"}")
+ context.n(utfbyte(s))
elseif c == 1 then
- texsprint(ctxcatcodes,"\\b{",utfbyte(s),"}")
+ context.b(utfbyte(s))
elseif c == 2 then
- texsprint(ctxcatcodes,"\\a{",utfbyte(s),"}")
+ context.a(utfbyte(s))
end
end
end
end
+-- hyphenatedurl.action = function(_,...) action(...) end -- sort of obsolete
+
+table.setmetatablecall(hyphenatedurl,action)
+
-- todo, no interface in mkiv yet
function hyphenatedurl.setcharacters(str,value) -- 1, 2 == before, after
diff --git a/Master/texmf-dist/tex/context/base/lang-url.mkiv b/Master/texmf-dist/tex/context/base/lang-url.mkiv
index 0f6b23d0552..cba013324c7 100644
--- a/Master/texmf-dist/tex/context/base/lang-url.mkiv
+++ b/Master/texmf-dist/tex/context/base/lang-url.mkiv
@@ -38,8 +38,6 @@
%D
%D \typebuffer
-\ifx\urlsplitmode\undefined \chardef\urlsplitmode\zerocount \fi % not supported in mkiv
-
\newtoks\everyhyphenatedurl
\appendtoks
@@ -64,16 +62,16 @@
\def\dohyphenatedurlnormal#1{\char#1\relax}%
\def\dohyphenatedurldisc #1{\discretionary{}{}{}}
-\def\sethyphenatedurlnormal #1{\ctxlua{commands.hyphenatedurl.setcharacters(\!!bs#1\!!es,0)}}
-\def\sethyphenatedurlbefore #1{\ctxlua{commands.hyphenatedurl.setcharacters(\!!bs#1\!!es,1)}}
-\def\sethyphenatedurlafter #1{\ctxlua{commands.hyphenatedurl.setcharacters(\!!bs#1\!!es,2)}}
+\def\sethyphenatedurlnormal #1{\ctxcommand{hyphenatedurl.setcharacters(\!!bs#1\!!es,0)}}
+\def\sethyphenatedurlbefore #1{\ctxcommand{hyphenatedurl.setcharacters(\!!bs#1\!!es,1)}}
+\def\sethyphenatedurlafter #1{\ctxcommand{hyphenatedurl.setcharacters(\!!bs#1\!!es,2)}}
\def\hyphenatedurldiscretionary{}
% \sethyphenatedurlafter{ABCDEF}
-\chardef\hyphenatedurllefthyphenmin = 3
-\chardef\hyphenatedurlrighthyphenmin = 3
+\setnewconstant\hyphenatedurllefthyphenmin \plusthree
+\setnewconstant\hyphenatedurlrighthyphenmin\plusthree
\unexpanded \def\hyphenatedurl#1%
{\dontleavehmode
@@ -83,7 +81,7 @@
\let\b\dohyphenatedurlbefore
\let\a\dohyphenatedurlafter
\let\d\dohyphenatedurldisc
- \normalexpanded{\noexpand\ctxlua{commands.hyphenatedurl.action(
+ \normalexpanded{\noexpand\ctxcommand{hyphenatedurl(
\!!bs\noexpand\detokenize{#1}\!!es,
\number\hyphenatedurllefthyphenmin,
\number\hyphenatedurlrighthyphenmin,
diff --git a/Master/texmf-dist/tex/context/base/lang-vn.tex b/Master/texmf-dist/tex/context/base/lang-vn.mkii
index 27d2a48a16f..27d2a48a16f 100644
--- a/Master/texmf-dist/tex/context/base/lang-vn.tex
+++ b/Master/texmf-dist/tex/context/base/lang-vn.mkii
diff --git a/Master/texmf-dist/tex/context/base/lang-wrd.lua b/Master/texmf-dist/tex/context/base/lang-wrd.lua
index 095e44443d9..558d5744faf 100644
--- a/Master/texmf-dist/tex/context/base/lang-wrd.lua
+++ b/Master/texmf-dist/tex/context/base/lang-wrd.lua
@@ -8,44 +8,59 @@ if not modules then modules = { } end modules ['lang-ini'] = {
local utf = unicode.utf8
local lower, utfchar = string.lower, utf.char
+local concat = table.concat
local lpegmatch = lpeg.match
+local P, S, Cs = lpeg.P, lpeg.S, lpeg.Cs
-languages.words = languages.words or { }
+local report_words = logs.reporter("languages","words")
-local words = languages.words
+local nodes, node, languages = nodes, node, languages
-words.data = words.data or { }
-words.enables = false
-words.threshold = 4
+languages.words = languages.words or { }
+local words = languages.words
+
+words.data = words.data or { }
+words.enables = false
+words.threshold = 4
+
+local numbers = languages.numbers
+local registered = languages.registered
local set_attribute = node.set_attribute
local unset_attribute = node.unset_attribute
local traverse_nodes = node.traverse
-local node_id = node.id
local wordsdata = words.data
local chardata = characters.data
+local tasks = nodes.tasks
-local glyph_node = node_id('glyph')
-local disc_node = node_id('disc')
-local kern_node = node_id('kern')
+local nodecodes = nodes.nodecodes
+local kerncodes = nodes.kerncodes
-words.colors = {
- ["known"] = "green",
- ["unknown"] = "red",
-}
+local glyph_code = nodecodes.glyph
+local disc_code = nodecodes.disc
+local kern_code = nodecodes.kern
+
+local kerning_code = kerncodes.kerning
+local lowerchar = characters.lower
-local spacing = lpeg.S(" \n\r\t")
-local markup = lpeg.S("-=")
-local lbrace = lpeg.P("{")
-local rbrace = lpeg.P("}")
+local a_color = attributes.private('color')
+local colist = attributes.list[a_color]
+
+local is_letter = characters.is_letter -- maybe is_character as variant
+
+local spacing = S(" \n\r\t")
+local markup = S("-=")
+local lbrace = P("{")
+local rbrace = P("}")
local disc = (lbrace * (1-rbrace)^0 * rbrace)^1 -- or just 3 times, time this
-local word = lpeg.Cs((markup/"" + disc/"" + (1-spacing))^1)
+local word = Cs((markup/"" + disc/"" + (1-spacing))^1)
local loaded = { } -- we share lists
function words.load(tag,filename)
- local fullname = resolvers.find_file(filename,'other text file') or ""
+ local fullname = resolvers.findfile(filename,'other text file') or ""
if fullname ~= "" then
+ report_words("loading word file '%s'",fullname)
statistics.starttiming(languages)
local list = loaded[fullname]
if not list then
@@ -57,7 +72,7 @@ function words.load(tag,filename)
wordsdata[tag] = list
statistics.stoptiming(languages)
else
- logs.report("languages","missing words file '%s'",filename)
+ report_words("missing word file '%s'",filename)
end
end
@@ -65,149 +80,323 @@ function words.found(id, str)
local tag = languages.numbers[id]
if tag then
local data = wordsdata[tag]
- return data and (data[str] or data[lower(str)])
- else
- return false
+ if data then
+ if data[str] then
+ return 1
+ elseif data[lower(str)] then
+ return 2
+ end
+ end
end
end
-- The following code is an adaption of experimental code for
-- hyphenating and spell checking.
-local function mark_words(head,whenfound) -- can be optimized
- local current, start, str, language, n = head, nil, "", nil, 0
+-- there is an n=1 problem somewhere in nested boxes
+
+--~ local function mark_words(head,whenfound) -- can be optimized and shared
+--~ local current, start, str, language, n, done = head, nil, "", nil, 0, false
+--~ local function action()
+--~ if #str > 0 then
+--~ local f = whenfound(language,str)
+--~ if f then
+--~ done = true
+--~ for i=1,n do
+--~ f(start)
+--~ start = start.next
+--~ end
+--~ end
+--~ end
+--~ str, start, n = "", nil, 0
+--~ end
+--~ while current do
+--~ local id = current.id
+--~ if id == glyph_code then
+--~ local a = current.lang
+--~ if a then
+--~ if a ~= language then
+--~ if start then
+--~ action()
+--~ end
+--~ language = a
+--~ end
+--~ elseif start then
+--~ action()
+--~ language = a
+--~ end
+--~ local components = current.components
+--~ if components then
+--~ start = start or current
+--~ n = n + 1
+--~ for g in traverse_nodes(components) do
+--~ str = str .. utfchar(g.char)
+--~ end
+--~ else
+--~ local code = current.char
+--~ local data = chardata[code]
+--~ if is_letter[data.category] then
+--~ start = start or current
+--~ n = n + 1
+--~ str = str .. utfchar(code) -- slow, maybe str should be a table (and given max)
+--~ elseif start then
+--~ action()
+--~ end
+--~ end
+--~ elseif id == disc_code then
+--~ if n > 0 then
+--~ n = n + 1
+--~ end
+--~ elseif id == kern_code and current.subtype == kerning_code and start then
+--~ -- ok
+--~ elseif start then
+--~ action()
+--~ end
+--~ current = current.next
+--~ end
+--~ if start then
+--~ action()
+--~ end
+--~ return head, done
+--~ end
+
+local function mark_words(head,whenfound) -- can be optimized and shared
+ local current, language, done = head, nil, nil, 0, false
+ local str, s, nds, n = { }, 0, { }, 0 -- n could also be a table, saves calls
local function action()
- if #str > 0 then
- local f = whenfound(language,str)
- if f then
+ if s > 0 then
+ local word = concat(str,"",1,s)
+ local mark = whenfound(language,word)
+ if mark then
+ done = true
for i=1,n do
- f(start)
- start = start.next
+ mark(nds[i])
end
end
end
- str, start, n = "", nil, 0
+ n, s = 0, 0
end
while current do
local id = current.id
- if id == glyph_node then
+ if id == glyph_code then
local a = current.lang
if a then
if a ~= language then
- if start then
+ if s > 0 then
action()
end
language = a
end
- elseif start then
+ elseif s > 0 then
action()
language = a
end
local components = current.components
if components then
- start = start or current
n = n + 1
+ nds[n] = current
for g in traverse_nodes(components) do
- str = str .. utfchar(g.char)
+ s = s + 1
+ str[s] = utfchar(g.char)
end
else
local code = current.char
- if chardata[code].uccode or chardata[code].lccode then
- start = start or current
+ local data = chardata[code]
+ if is_letter[data.category] then
n = n + 1
- str = str .. utfchar(code)
- elseif start then
+ nds[n] = current
+ s = s + 1
+ str[s] = utfchar(code)
+ elseif s > 0 then
action()
end
end
- elseif id == disc_node then
+ elseif id == disc_code then -- take the replace
if n > 0 then
n = n + 1
+ nds[n] = current
end
- elseif id == kern_node and current.subtype == 0 and start then
+ elseif id == kern_code and current.subtype == kerning_code and s > 0 then
-- ok
- elseif start then
+ elseif s > 0 then
action()
end
current = current.next
end
- if start then
+ if s > 0 then
action()
end
- return head
+ return head, done
end
-words.methods = { }
-words.method = 1
+local methods = { }
+words.methods = methods
-local methods = words.methods
+local enablers = { }
+words.enablers = enablers
-methods[1] = function(head, attribute, yes, nop)
- local right, wrong = false, false
- if yes then right = function(n) set_attribute(n,attribute,yes) end end
- if nop then wrong = function(n) set_attribute(n,attribute,nop) end end
- for n in traverse_nodes(head) do
- unset_attribute(n,attribute) -- hm, not that selective (reset color)
+local wordmethod = 1
+local enabled = false
+
+function words.check(head)
+ if enabled then
+ return methods[wordmethod](head)
+ else
+ return head, false
end
- local found, done = words.found, false
- mark_words(head, function(language,str)
- if #str < words.threshold then
- return false
- elseif found(language,str) then
- done = true
- return right
- else
- done = true
- return wrong
- end
- end)
- return head, done
end
-local list, dump = { }, false -- todo: per language
+function words.enable(settings)
+ local method = settings.method
+ wordmethod = method and tonumber(method) or wordmethod or 1
+ local e = enablers[wordmethod]
+ if e then e(settings) end
+ tasks.enableaction("processors","languages.words.check")
+ enabled = true
+end
-local lower = characters.lower
+function words.disable()
+ enabled = false
+end
+
+-- colors
+
+local cache = { } -- can also be done with method 1 -- frozen colors once used
-methods[2] = function(head, attribute)
- dump = true
- mark_words(head, function(language,str)
- if #str >= words.threshold then
- str = lower(str)
- list[str] = (list[str] or 0) + 1
+setmetatable(cache, {
+ __index = function(t,k) -- k == language, numbers[k] == tag
+ local c
+ if type(k) == "string" then
+ c = colist[k]
+ elseif k < 0 then
+ c = colist["word:unset"]
+ else
+ c = colist["word:" .. (numbers[k] or "unset")] or colist["word:unknown"]
end
- end)
- return head, true
+ local v = c and function(n) set_attribute(n,a_color,c) end or false
+ t[k] = v
+ return v
+ end
+} )
+
+-- method 1
+
+local function sweep(language,str)
+ if #str < words.threshold then
+ return false
+ elseif words.found(language,str) then -- can become a local wordsfound
+ return cache["word:yes"] -- maybe variables.yes
+ else
+ return cache["word:no"]
+ end
+end
+
+methods[1] = function(head)
+ for n in traverse_nodes(head) do
+ unset_attribute(n,a_color) -- hm, not that selective (reset color)
+ end
+ return mark_words(head,sweep)
end
-words.used = list
+-- method 2
+
+local dumpname = nil
+local dumpthem = false
+local listname = "document"
+
+local category = { }
+local categories = { }
+
+setmetatable(categories, {
+ __index = function(t,k)
+ local languages = { }
+ setmetatable(languages, {
+ __index = function(t,k)
+ local r = registered[k]
+ local v = {
+ number = language,
+ parent = r and r.parent or nil,
+ patterns = r and r.patterns or nil,
+ tag = r and r.tag or nil,
+ list = { },
+ total = 0,
+ unique = 0,
+ }
+ t[k] = v
+ return v
+ end
+ } )
+ local v = {
+ languages = languages,
+ total = 0,
+ }
+ t[k] = v
+ return v
+ end
+} )
+
+local collected = {
+ total = 0,
+ version = 1.000,
+ categories = categories,
+}
+
+enablers[2] = function(settings)
+ local name = settings.list
+ listname = name and name ~= "" and name or "document"
+ category = collected.categories[listname]
+end
-function words.dump_used_words(name)
- if dump then
- logs.report("languages","saving list of used words in '%s'",name)
- io.savedata(name,table.serialize(list))
+local function sweep(language,str)
+ if #str >= words.threshold then
+ str = lowerchar(str)
+ local words = category.languages[numbers[language] or "unset"]
+ local list = words.list
+ local ls = list[str]
+ if ls then
+ list[str] = ls + 1
+ else
+ list[str] = 1
+ words.unique = words.unique + 1
+ end
+ collected.total = collected.total + 1
+ category.total = category.total + 1
+ words.total = words.total + 1
end
end
-local color = attributes.private('color')
+methods[2] = function(head)
+ dumpthem = true
+ return mark_words(head,sweep)
+end
-function words.check(head)
- if words.enabled and head.next then
- local colors = words.colors
- local alc = attributes.list[color]
- return methods[words.method](head, color, alc[colors.known], alc[colors.unknown])
- else
- return head, false
+local function dumpusedwords()
+ if dumpthem then
+ collected.threshold = words.threshold
+ dumpname = dumpname or file.addsuffix(tex.jobname,"words")
+ report_words("saving list of used words in '%s'",dumpname)
+ io.savedata(dumpname,table.serialize(collected,true))
+ -- table.tofile(dumpname,list,true)
end
end
-function words.enable(method)
- tasks.enableaction("processors","languages.words.check")
- words.method = method or words.method or 1
- words.enabled = true
+directives.register("languages.words.dump", function(v)
+ dumpname = type(v) == "string" and v ~= "" and v
+end)
+
+luatex.registerstopactions(dumpusedwords)
+
+-- method 3
+
+local function sweep(language,str)
+ return cache[language]
end
-function words.disable()
- words.enabled = false
+methods[3] = function(head)
+ for n in traverse_nodes(head) do
+ unset_attribute(n,a_color)
+ end
+ return mark_words(head,sweep)
end
-- for the moment we hook it into the attribute handler
diff --git a/Master/texmf-dist/tex/context/base/lang-wrd.mkiv b/Master/texmf-dist/tex/context/base/lang-wrd.mkiv
index b6fc6a9d30f..22c234d0c6d 100644
--- a/Master/texmf-dist/tex/context/base/lang-wrd.mkiv
+++ b/Master/texmf-dist/tex/context/base/lang-wrd.mkiv
@@ -37,18 +37,36 @@
\unexpanded\def\setupspellchecking
{\dosingleargument\dosetupspellchecking}
+\newtoks\everysetupspellchecking
+
\unexpanded\def\setupspellchecking[#1]% todo colors
{\getparameters[\??wl][#1]%
+ \the\everysetupspellchecking}
+
+\appendtoks
\doifelse\@@wlstate\v!start
- {\ctxlua{languages.words.enable(\@@wlmethod)}}
- {\ctxlua{languages.words.disable()}}}
+ {\ctxlua{languages.words.enable { method = "\@@wlmethod", list = "\@@wllist" }}}
+ {\ctxlua{languages.words.disable()}}%
+\to \everysetupspellchecking
+
+% beware, maybe some day we will honour grouping
+
+% 1: spell checking
+% 2: word counting
+% 3: language coloring
\setupspellchecking
[\c!state=\v!stop,
- \c!method=1]
+ \c!method=1,
+ \c!list=]
-\appendtoks
- \ctxlua{languages.words.dump_used_words("\jobname.words")}%
-\to \everybye
+\definecolor[word:yes] [g=.75]
+\definecolor[word:no] [r=.75]
+
+%definecolor[word:unset] [s=.75]
+\definecolor[word:en] [b=.75]
+\definecolor[word:de] [r=.75]
+\definecolor[word:nl] [g=.75]
+\definecolor[word:unknown][r=.75,g=.75]
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/layo-ini.lua b/Master/texmf-dist/tex/context/base/layo-ini.lua
new file mode 100644
index 00000000000..56ced2c0bc8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/layo-ini.lua
@@ -0,0 +1,61 @@
+if not modules then modules = { } end modules ['layo-ini'] = {
+ version = 1.001,
+ comment = "companion to layo-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- We need to share information between the TeX and Lua end
+-- about the typographical model. This happens here.
+--
+-- Code might move.
+
+-- conditionals.layoutisdoublesided
+-- conditionals.layoutissinglesided
+-- texcount.pagenoshift
+-- texcount.realpageno
+
+local texcount = tex.count
+local conditionals = tex.conditionals
+
+layouts = {
+ status = { },
+}
+
+local status = layouts.status
+
+function status.leftorrightpagection(left,right)
+ if left == nil then
+ left, right = false, true
+ end
+ if not conditionals.layoutisdoublesided then
+ return left, right
+ elseif conditionals.layoutissinglesided then
+ return left, right
+ elseif texcount.pagenoshift % 2 == 0 then
+ if texcount.realpageno % 2 == 0 then
+ return right, left
+ else
+ return left, right
+ end
+ else
+ if texcount.realpageno % 2 == 0 then
+ return left, right
+ else
+ return right, left
+ end
+ end
+end
+
+function status.isleftpage()
+ if not conditionals.layoutisdoublesided then
+ return false
+ elseif conditionals.layoutissinglesided then
+ return false
+ elseif texcount.pagenoshift % 2 == 0 then
+ return texcount.realpageno % 2 == 0
+ else
+ return not texcount.realpageno % 2 == 0
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/layo-ini.mkiv b/Master/texmf-dist/tex/context/base/layo-ini.mkiv
new file mode 100644
index 00000000000..46361297851
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/layo-ini.mkiv
@@ -0,0 +1,31 @@
+%D \module
+%D [ file=layo-ini,
+%D version=2011.02.18,
+%D title=\CONTEXT\ Layout Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%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 Layout Macros / Initialization}
+
+%D This module deals with the basic variables etc. for layout
+%D and code from other modules will move here. This will make
+%D the dependencies somewhat cleaner.
+
+\unprotect
+
+%D We need to check this in case a smaller format is loaded.
+
+\ifdefined\layoutisdoublesided \else \newconditional\layoutisdoublesided \fi
+\ifdefined\layoutissinglesided \else \newconditional\layoutissinglesided \fi
+\ifdefined\pagenoshift \else \newcount \pagenoshift \fi
+\ifdefined\realpageno \else \newcount \realpageno \fi
+
+\registerctxluafile{layo-ini}{1.001}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/lpdf-ano.lua b/Master/texmf-dist/tex/context/base/lpdf-ano.lua
index e9e67e16319..9f452c34d12 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-ano.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-ano.lua
@@ -6,43 +6,59 @@ if not modules then modules = { } end modules ['lpdf-ano'] = {
license = "see context related readme files"
}
-local tostring, format, rep = tostring, string.rep, string.format
+local next, tostring = next, tostring
+local rep, format = string.rep, string.format
local texcount = tex.count
+local backends, lpdf = backends, lpdf
+
local trace_references = false trackers.register("references.references", function(v) trace_references = v end)
local trace_destinations = false trackers.register("references.destinations", function(v) trace_destinations = v end)
local trace_bookmarks = false trackers.register("references.bookmarks", function(v) trace_bookmarks = v end)
+local report_reference = logs.reporter("backend","references")
+local report_destination = logs.reporter("backend","destinations")
+local report_bookmark = logs.reporter("backend","bookmarks")
+
local variables = interfaces.variables
local constants = interfaces.constants
-local nodeinjections = backends.pdf.nodeinjections
-local codeinjections = backends.pdf.codeinjections
-local registrations = backends.pdf.registrations
-
-jobreferences = jobreferences or { }
-jobreferences.runners = jobreferences.runners or { }
-jobreferences.specials = jobreferences.specials or { }
-jobreferences.handlers = jobreferences.handlers or { }
-jobreferences.executers = jobreferences.executers or { }
-
-local runners = jobreferences.runners
-local specials = jobreferences.specials
-local handlers = jobreferences.handlers
-local executers = jobreferences.executers
-
-local pdfdictionary = lpdf.dictionary
-local pdfarray = lpdf.array
-local pdfreference = lpdf.reference
-local pdfunicode = lpdf.unicode
-local pdfconstant = lpdf.constant
-local pdfflushobject = lpdf.flushobject
-local pdfreserveobject = lpdf.reserveobject
-local pdfannotation = nodes.pdfannotation
-local pdfdestination = nodes.pdfdestination
-
-local pdfpagereference = tex.pdfpageref
+local settings_to_array = utilities.parsers.settings_to_array
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations = backends.pdf.registrations
+
+local javascriptcode = interactions.javascripts.code
+
+local references = structures.references
+local bookmarks = structures.bookmarks
+
+local runners = references.runners
+local specials = references.specials
+local handlers = references.handlers
+local executers = references.executers
+local nodepool = nodes.pool
+
+local pdfannotation_node = nodepool.pdfannotation
+local pdfdestination_node = nodepool.pdfdestination
+local latelua_node = nodepool.latelua
+
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfreference = lpdf.reference
+local pdfunicode = lpdf.unicode
+local pdfconstant = lpdf.constant
+local pdfflushobject = lpdf.flushobject
+local pdfshareobjectreference = lpdf.shareobjectreference
+local pdfimmediateobject = lpdf.immediateobject
+local pdfreserveobject = lpdf.reserveobject
+local pdfpagereference = lpdf.pagereference
+local pdfdelayedobject = lpdf.delayedobject
+local pdfregisterannotation = lpdf.registerannotation
+
+local pdf_annot = pdfconstant("Annot")
local pdf_uri = pdfconstant("URI")
local pdf_gotor = pdfconstant("GoToR")
local pdf_goto = pdfconstant("GoTo")
@@ -51,26 +67,35 @@ local pdf_javascript = pdfconstant("JavaScript")
local pdf_link = pdfconstant("Link")
local pdf_n = pdfconstant("N")
local pdf_t = pdfconstant("T")
+local pdf_fit = pdfconstant("Fit")
+local pdf_named = pdfconstant("Named")
+
+-- todo: 3dview
+
local pdf_border = pdfarray { 0, 0, 0 }
+local getinnermethod = references.getinnermethod
+
local cache = { }
-local function pagedest(n)
- local pd = cache[n]
- if not pd then
- local a = pdfarray {
- pdfreference(pdfpagereference(n)),
- pdfconstant("Fit")
- }
- pd = pdfreference(pdfflushobject(a))
- cache[n] = pd
+local function pagedestination(n) -- only cache fit
+ if n > 0 then
+ local pd = cache[n]
+ if not pd then
+ local a = pdfarray {
+ pdfreference(pdfpagereference(n)),
+ pdf_fit,
+ }
+ pd = pdfshareobjectreference(a)
+ cache[n] = pd
+ end
+ return pd
end
- return pd
end
-lpdf.pagedest = pagedest
+lpdf.pagedestination = pagedestination
-local defaultdestination = pdfarray { 0, pdfconstant("Fit") }
+local defaultdestination = pdfarray { 0, pdf_fit }
local function link(url,filename,destination,page,actions)
if filename and filename ~= "" then
@@ -93,43 +118,36 @@ local function link(url,filename,destination,page,actions)
URI = url,
}
elseif filename and filename ~= "" then
+ -- no page ?
+ if destination == "" then
+ destination = nil
+ end
+ if not destination and page then
+ destination = pdfarray { page - 1, pdf_fit }
+ end
return pdfdictionary {
S = pdf_gotor, -- can also be pdf_launch
F = filename,
- D = (destination and destination ~= "" and destination), -- or defaultdestination,
+ D = destination or defaultdestination, -- D is mandate
NewWindow = (actions.newwindow and true) or nil,
}
elseif destination and destination ~= "" then
- local realpage, p = texcount.realpageno, tonumber(page)
- if not p then
- -- sorry
- elseif p > realpage then
- texcount.referencepagestate = 3
- elseif p < realpage then
- texcount.referencepagestate = 2
- else
- texcount.referencepagestate = 1
- end
- return pdfdictionary {
+ return pdfdictionary { -- can be cached
S = pdf_goto,
D = destination,
}
- elseif page and page ~= "" then
- local realpage, p = texcount.realpageno, tonumber(page)
- if p then
- if p > realpage then
- texcount.referencepagestate = 3
- elseif p < realpage then
- texcount.referencepagestate = 2
- else
- texcount.referencepagestate = 1
- end
- return pdfdictionary {
+ else
+ local p = tonumber(page)
+ if p and p > 0 then
+ return pdfdictionary { -- can be cached
S = pdf_goto,
- D = pagedest(p),
+ D = pdfarray {
+ pdfreference(pdfpagereference(p)),
+ pdf_fit,
+ }
}
else
- commands.writestatus("references","invalid page reference: %s",page or "?")
+ report_reference("invalid page reference: %s",tostring(page))
end
end
return false
@@ -152,7 +170,7 @@ function lpdf.launch(program,parameters)
end
function lpdf.javascript(name,arguments)
- local script = javascripts.code(name,arguments) -- make into object (hash)
+ local script = javascriptcode(name,arguments) -- make into object (hash)
if script then
return pdfdictionary {
S = pdf_javascript,
@@ -179,105 +197,158 @@ local function pdfaction(actions)
what = what(a,actions)
end
if what then
- action.next = what
+ action.Next = what
action = what
else
-- error
return nil
end
end
- return first
+ return first, actions.n
end
end
end
-lpdf.pdfaction = pdfaction
+lpdf.action = pdfaction
-function codeinjections.prerollreference(actions)
- local main = actions and pdfaction(actions)
- if main then
- main = pdfdictionary {
- Subtype = pdf_link,
- Border = pdf_border,
- H = (not actions.highlight and pdf_n) or nil,
- A = main,
- -- does not work at all in spite of specification
- -- OC = (actions.layer and lpdf.layerreferences[actions.layer]) or nil,
- -- OC = backends.pdf.layerreference(actions.layer),
- }
- return main("A") -- todo: cache this, maybe weak
+function codeinjections.prerollreference(actions) -- share can become option
+ if actions then
+ local main, n = pdfaction(actions)
+ if main then
+ main = pdfdictionary {
+ Subtype = pdf_link,
+ Border = pdf_border,
+ H = (not actions.highlight and pdf_n) or nil,
+ A = pdfshareobjectreference(main),
+ F = 4, -- print (mandate in pdf/a)
+ }
+ return main("A"), n
+ end
+ end
+end
+
+local function use_normal_annotations()
+
+ local function reference(width,height,depth,prerolled) -- keep this one
+ if prerolled then
+ if trace_references then
+ report_reference("w=%s, h=%s, d=%s, a=%s",width,height,depth,prerolled)
+ end
+ return pdfannotation_node(width,height,depth,prerolled)
+ end
+ end
+
+ local function finishreference()
end
+
+ return reference, finishreference
+
end
--- local cache = { } -- no real gain in thsi
---
--- function codeinjections.prerollreference(actions)
--- local main = actions and pdfaction(actions)
--- if main then
--- main = pdfdictionary {
--- Subtype = pdf_link,
--- Border = pdf_border,
--- H = (not actions.highlight and pdf_n) or nil,
--- A = main,
--- }
--- local cm = cache[main]
--- if not cm then
--- cm = "/A ".. tostring(pdfreference(pdfflushobject(main))
--- cache[main] = cm
--- end
--- return cm
--- end
--- end
-
-function nodeinjections.reference(width,height,depth,prerolled)
- if prerolled then
- if swapdir then
- width = - width
+-- evenrually we can do this for special refs only
+
+local hashed, nofunique, nofused = { }, 0, 0
+
+local function use_shared_annotations()
+
+ local factor = number.dimenfactors.bp
+
+ local function finishreference(width,height,depth,prerolled) -- %0.2f looks okay enough (no scaling anyway)
+ local h, v = pdf.h, pdf.v
+ local llx, lly = h*factor, (v - depth)*factor
+ local urx, ury = (h + width)*factor, (v + height)*factor
+ local annot = format("<< /Type /Annot %s /Rect [%0.2f %0.2f %0.2f %0.2f] >>",prerolled,llx,lly,urx,ury)
+ local n = hashed[annot]
+ if not n then
+ n = pdfdelayedobject(annot)
+ hashed[annot] = n
+ nofunique = nofunique + 1
end
- if trace_references then
- logs.report("references","w=%s, h=%s, d=%s, a=%s",width,height,depth,prerolled)
+ nofused = nofused + 1
+ pdfregisterannotation(n)
+ end
+
+ _bpnf_ = finishreference
+
+ local function reference(width,height,depth,prerolled)
+ if prerolled then
+ if trace_references then
+ report_reference("w=%s, h=%s, d=%s, a=%s",width,height,depth,prerolled)
+ end
+ local luacode = format("_bpnf_(%s,%s,%s,'%s')",width,height,depth,prerolled)
+ return latelua_node(luacode)
end
- return pdfannotation(width,height,depth,prerolled)
end
+
+ statistics.register("pdf annotations", function()
+ if nofused > 0 then
+ -- table.print(hashed,"hashed_annotations")
+ return string.format("%s embedded, %s unique",nofused,nofunique)
+ else
+ return nil
+ end
+ end)
+
+
+ return reference, finishreference
+
end
+local lln = latelua_node() if node.has_field(lln,'string') then
+
+ directives.register("refences.sharelinks", function(v)
+ if v then
+ nodeinjections.reference, codeinjections.finishreference = use_shared_annotations()
+ else
+ nodeinjections.reference, codeinjections.finishreference = use_normal_annotations()
+ end
+ end)
+
+ nodeinjections.reference, codeinjections.finishreference = use_shared_annotations()
+
+else
+
+ nodeinjections.reference, codeinjections.finishreference = use_normal_annotations()
+
+end node.free(lln)
+
+-- -- -- --
+-- -- -- --
+
function nodeinjections.destination(width,height,depth,name,view)
- if swapdir then
- width = - width
- end
if trace_destinations then
- logs.report("destinations","w=%s, h=%s, d=%s, n=%s, v=%s",width,height,depth,name,view or "no view")
+ report_destination("w=%s, h=%s, d=%s, n=%s, v=%s",width,height,depth,name,view or "no view")
end
- return pdfdestination(width,height,depth,name,view)
+ return pdfdestination_node(width,height,depth,name,view)
end
-- runners and specials
-local method = "internal"
-
runners["inner"] = function(var,actions)
- if method == "internal" then
+ if getinnermethod() == "names" then
local vir = var.i.references
local internal = vir and vir.internal
if internal then
- var.inner = "aut:"..internal
+ var.inner = "aut:" .. internal
end
+ else
+ var.inner = nil
end
return link(nil,nil,var.inner,var.r,actions)
end
runners["inner with arguments"] = function(var,actions)
- logs.report("references","todo: inner with arguments")
+ report_reference("todo: inner with arguments")
return false
end
runners["outer"] = function(var,actions)
- local file, url = jobreferences.checkedfileorurl(var.outer,var.outer)
+ local file, url = references.checkedfileorurl(var.outer,var.outer)
return link(url,file,var.arguments,nil,actions)
end
runners["outer with inner"] = function(var,actions)
- local file = jobreferences.checkedfile(var.f)
+ local file = references.checkedfile(var.f)
return link(nil,file,var.inner,var.r,actions)
end
@@ -287,7 +358,7 @@ runners["special outer with operation"] = function(var,actions)
end
runners["special outer"] = function(var,actions)
- logs.report("references","todo: special outer")
+ report_reference("todo: special outer")
return false
end
@@ -297,22 +368,22 @@ runners["special"] = function(var,actions)
end
runners["outer with inner with arguments"] = function(var,actions)
- logs.report("references","todo: outer with inner with arguments")
+ report_reference("todo: outer with inner with arguments")
return false
end
runners["outer with special and operation and arguments"] = function(var,actions)
- logs.report("references","todo: outer with special and operation and arguments")
+ report_reference("todo: outer with special and operation and arguments")
return false
end
runners["outer with special"] = function(var,actions)
- logs.report("references","todo: outer with special")
+ report_reference("todo: outer with special")
return false
end
runners["outer with special and operation"] = function(var,actions)
- logs.report("references","todo: outer with special and operation")
+ report_reference("todo: outer with special and operation")
return false
end
@@ -321,10 +392,11 @@ runners["special operation with arguments"] = runners["special"]
function specials.internal(var,actions) -- better resolve in strc-ref
local i = tonumber(var.operation)
- local v = jobreferences.internals[i]
+ local v = references.internals[i]
if not v then
-- error
- elseif method == "internal" then
+ report_reference("no internal reference '%s'",var.operation)
+ elseif getinnermethod() == "names" then
-- named
return link(nil,nil,"aut:"..i,v.references.realpage,actions)
else
@@ -333,27 +405,60 @@ function specials.internal(var,actions) -- better resolve in strc-ref
end
end
+-- realpage already resolved
+
specials.i = specials.internal
-function specials.page(var,actions) -- better resolve in strc-ref
+local pages = references.pages
+
+function specials.page(var,actions)
local file = var.f
if file then
- file = jobreferences.checkedfile(file)
- return link(nil,file,nil,p or var.operation,actions)
+ file = references.checkedfile(file)
+ return link(nil,file,nil,var.operation,actions)
else
- local p = jobreferences.pages[var.operation]
- if type(p) == "function" then
- p = p()
+ local p = var.r
+ if not p then -- todo: call special from reference code
+ p = pages[var.operation]
+ if type(p) == "function" then -- double
+ p = p()
+ else
+ p = tonumber(references.realpageofpage(tonumber(o)))
+ end
end
return link(nil,nil,nil,p or var.operation,actions)
end
end
+function specials.realpage(var,actions)
+ local file = var.f
+ if file then
+ file = references.checkedfile(file)
+ return link(nil,file,nil,var.operation,actions)
+ else
+ return link(nil,nil,nil,var.operation,actions)
+ end
+end
+
+function specials.userpage(var,actions)
+ local file = var.f
+ if file then
+ file = references.checkedfile(file)
+ return link(nil,file,nil,var.operation,actions)
+ else
+ local p = var.r
+ if not p then -- todo: call special from reference code
+ p = tonumber(references.realpageofpage(var.operation))
+ end
+ return link(nil,nil,nil,p,actions)
+ end
+end
+
-- todo, do this in references namespace ordered instead (this is an experiment)
local splitter = lpeg.splitat(":")
-function specials.order(var,actions) -- jobreferences.specials !
+function specials.order(var,actions) -- references.specials !
local operation = var.operation
if operation then
local kind, name, n = lpegmatch(splitter,operation)
@@ -369,22 +474,22 @@ function specials.order(var,actions) -- jobreferences.specials !
end
function specials.url(var,actions)
- local url = jobreferences.checkedurl(var.operation)
+ local url = references.checkedurl(var.operation)
return link(url,nil,var.arguments,nil,actions)
end
function specials.file(var,actions)
- local file = jobreferences.checkedfile(var.operation)
+ local file = references.checkedfile(var.operation)
return link(nil,file,var.arguments,nil,actions)
end
function specials.fileorurl(var,actions)
- local file, url = jobreferences.checkedfileorurl(var.operation,var.operation)
+ local file, url = references.checkedfileorurl(var.operation,var.operation)
return link(url,file,var.arguments,nil,actions)
end
function specials.program(var,content)
- local program = jobreferences.checkedprogram(var.operation)
+ local program = references.checkedprogram(var.operation)
return lpdf.launch(program,var.arguments)
end
@@ -394,8 +499,6 @@ end
specials.JS = specials.javascript
-local pdf_named = pdfconstant("Named")
-
executers.importform = pdfdictionary { S = pdf_named, N = pdfconstant("AcroForm:ImportFDF") }
executers.exportform = pdfdictionary { S = pdf_named, N = pdfconstant("AcroForm:ExportFDF") }
executers.first = pdfdictionary { S = pdf_named, N = pdfconstant("FirstPage") }
@@ -426,7 +529,7 @@ local function fieldset(arguments)
end
function executers.resetform(arguments)
- arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments)
+ arguments = (type(arguments) == "table" and arguments) or settings_to_array(arguments)
return pdfdictionary {
S = pdfconstant("ResetForm"),
Field = fieldset(arguments[1])
@@ -448,7 +551,7 @@ local flags = {
}
function executers.submitform(arguments)
- arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments)
+ arguments = (type(arguments) == "table" and arguments) or settings_to_array(arguments)
local flag = flags[formmethod] or flags.post
flag = (flag and (flag[formformat] or flag.xml)) or 32 -- default: post, xml
return pdfdictionary {
@@ -483,7 +586,7 @@ local pdf_resume = pdfconstant("Resume")
local pdf_pause = pdfconstant("Pause")
local function movie_or_sound(operation,arguments)
- arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments)
+ arguments = (type(arguments) == "table" and arguments) or settings_to_array(arguments)
return pdfdictionary {
S = pdf_movie,
T = format("movie %s",arguments[1] or "noname"),
@@ -522,13 +625,15 @@ local function build(levels,start,parent,method)
local startlevel = levels[start][1]
local i, n = start, 0
local child, entry, m, prev, first, last, f, l
--- to be tested: i can be nil
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
+ if level < startlevel then
+ pdfflushobject(child,entry)
+ return i, n, first, last
+ elseif level == startlevel then
if trace_bookmarks then
- logs.report("bookmark","%3i %s%s %s",reference.realpage,rep(" ",level-1),(open and "+") or "-",title)
+ report_bookmark("%3i %s%s %s",reference.realpage,rep(" ",level-1),(open and "+") or "-",title)
end
local prev = child
child = pdfreserveobject()
@@ -544,16 +649,13 @@ local function build(levels,start,parent,method)
if method == "internal" then
entry.Dest = "aut:" .. reference.internal
else -- if method == "page" then
- entry.Dest = pagedest(reference.realpage)
+ entry.Dest = pagedestination(reference.realpage)
end
if not first then first, last = child, child end
prev = child
last = prev
n = n + 1
i = i + 1
- elseif level < startlevel then
- pdfflushobject(child,entry)
- return i, n, first, last
elseif i < #levels and level > startlevel then
i, m, f, l = build(levels,i,pdfreference(child),method)
entry.Count = (open and m) or -m
@@ -576,14 +678,21 @@ local function build(levels,start,parent,method)
end
function codeinjections.addbookmarks(levels,method)
- local parent = pdfreserveobject()
- local _, m, first, last = build(levels,1,pdfreference(parent),method or "internal")
- local dict = pdfdictionary {
- Type = pdfconstant("Outlines"),
- First = pdfreference(first),
- Last = pdfreference(last),
- Count = m,
- }
- pdfflushobject(parent,dict)
- lpdf.addtocatalog("Outlines",lpdf.reference(parent))
+ if #levels > 0 then
+ structures.bookmarks.flatten(levels) -- dirty trick for lack of structure
+ local parent = pdfreserveobject()
+ local _, m, first, last = build(levels,1,pdfreference(parent),method or "internal")
+ local dict = pdfdictionary {
+ Type = pdfconstant("Outlines"),
+ First = pdfreference(first),
+ Last = pdfreference(last),
+ Count = m,
+ }
+ pdfflushobject(parent,dict)
+ lpdf.addtocatalog("Outlines",lpdf.reference(parent))
+ end
end
+
+-- this could also be hooked into the frontend finalizer
+
+lpdf.registerdocumentfinalizer(function() bookmarks.place() end,1,"bookmarks")
diff --git a/Master/texmf-dist/tex/context/base/lpdf-col.lua b/Master/texmf-dist/tex/context/base/lpdf-col.lua
index 18aa848ffea..dc40e555c2f 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-col.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-col.lua
@@ -9,56 +9,73 @@ if not modules then modules = { } end modules ['lpdf-mis'] = {
local type = type
local format, gsub = string.format, string.gsub
--- colors = colors or { }
--- transparencies = transparencies or { }
+local backends, lpdf = backends, lpdf
-local registercolor = colors.register
+local colors = attributes.colors
+local transparencies = attributes.transparencies
local registertransparancy = transparencies.register
+local registercolor = colors.register
local colorsvalue = colors.value
local transparenciesvalue = transparencies.value
+local forcedmodel = colors.forcedmodel
-- Literals needed to inject code in the mp stream, we cannot use attributes there
-- since literals may have qQ's, much may go away once we have mplib code in place.
--
-- This module assumes that some functions are defined in the colors namespace
--- which mostlikely will be loaded later.
+-- which most likely will be loaded later.
-function lpdf.color(model,ca,default) -- todo: use gray when no color
- local cv = colorsvalue(ca)
- if cv then
- if model == 1 then
- model = cv[1]
- end
- if model == 2 then
- local s = cv[2]
- return format("%s g %s G",s,s)
- elseif model == 3 then
- local r, g, b = cv[3], cv[4], cv[5]
- return format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b)
- elseif model == 4 then
- local c, m, y, k = cv[6],cv[7],cv[8],cv[9]
- return format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k)
- else
- local n,f,d,p = cv[10],cv[11],cv[12],cv[13]
- if type(p) == "string" then
- p = gsub(p,","," ") -- brr misuse of spot
+local function lpdfcolor(model,ca,default) -- todo: use gray when no color
+ if colors.supported then
+ local cv = colorsvalue(ca)
+ if cv then
+ if model == 1 then
+ model = cv[1]
+ end
+ model = forcedmodel(model)
+ if model == 2 then
+ local s = cv[2]
+ return format("%s g %s G",s,s)
+ elseif model == 3 then
+ local r, g, b = cv[3], cv[4], cv[5]
+ return format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b)
+ elseif model == 4 then
+ local c, m, y, k = cv[6],cv[7],cv[8],cv[9]
+ return format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k)
+ else
+ local n,f,d,p = cv[10],cv[11],cv[12],cv[13]
+ if type(p) == "string" then
+ p = gsub(p,","," ") -- brr misuse of spot
+ end
+ return format("/%s cs /%s CS %s SCN %s scn",n,n,p,p)
end
- return format("/%s cs /%s CS %s SCN %s scn",n,n,p,p)
+ else
+ return format("%s g %s G",default or 0,default or 0)
end
else
- return format("%s g %s G",default or 0,default or 0)
+ return ""
end
end
+lpdf.color = lpdfcolor
+
+function lpdf.pdfcolor(attribute) -- bonus, for pgf and friends
+ context(lpdfcolor(1,attribute))
+end
+
function lpdf.transparency(ct,default) -- kind of overlaps with transparencycode
-- beware, we need this hack because normally transparencies are not
-- yet registered and therefore the number is not not known ... we
-- might use the attribute number itself in the future
- local ct = transparenciesvalue(ct)
- if ct then
- return format("/Tr%s gs",registertransparancy(nil,ct[1],ct[2],true))
+ if transparencies.supported then
+ local ct = transparenciesvalue(ct)
+ if ct then
+ return format("/Tr%s gs",registertransparancy(nil,ct[1],ct[2],true))
+ else
+ return "/Tr0 gs"
+ end
else
- return "/Tr0 gs"
+ return ""
end
end
@@ -68,6 +85,7 @@ function lpdf.colorvalue(model,ca,default)
if model == 1 then
model = cv[1]
end
+ model = forcedmodel(model)
if model == 2 then
return format("%s",cv[2])
elseif model == 3 then
@@ -82,23 +100,54 @@ function lpdf.colorvalue(model,ca,default)
end
end
-function lpdf.fdfcolor(model,ca,default)
+--~ function lpdf.fdfcolor(model,ca,default)
+--~ local cv = colorsvalue(ca)
+--~ if cv then
+--~ if model == 1 then
+--~ model = cv[1]
+--~ end
+--~ model = forcedmodel(model)
+--~ if model == 2 then
+--~ return format("[%s]",cv[2])
+--~ elseif model == 3 then
+--~ return format("[%s %s %s]",cv[3],cv[4],cv[5])
+--~ elseif model == 4 then
+--~ return format("[%s %s %s %s]",cv[6],cv[7],cv[8],cv[9])
+--~ elseif model == 4 then
+--~ return format("[%s]",cv[13])
+--~ end
+--~ else
+--~ return format("[%s]",default or 0)
+--~ end
+--~ end
+
+function lpdf.colorvalues(model,ca,default)
local cv = colorsvalue(ca)
if cv then
if model == 1 then
model = cv[1]
end
+ model = forcedmodel(model)
if model == 2 then
- return format("[%s]",cv[2])
+ return cv[2]
elseif model == 3 then
- return format("[%s %s %s]",cv[3],cv[4],cv[5])
+ return cv[3], cv[4], cv[5]
elseif model == 4 then
- return format("[%s %s %s %s]",cv[6],cv[7],cv[8],cv[9])
+ return cv[6], cv[7], cv[8], cv[9]
elseif model == 4 then
- return format("[%s]",cv[13])
+ return cv[13]
end
else
- return format("[%s]",default or 0)
+ return default or 0
+ end
+end
+
+function lpdf.transparencyvalue(ta,default)
+ local tv = transparenciesvalue(ta)
+ if tv then
+ return tv[2]
+ else
+ return default or 1
end
end
@@ -108,6 +157,7 @@ function lpdf.colorspace(model,ca)
if model == 1 then
model = cv[1]
end
+ model = forcedmodel(model)
if model == 2 then
return "DeviceGray"
elseif model == 3 then
@@ -125,26 +175,64 @@ local intransparency = false
local pdfcolor = lpdf.color
function lpdf.rgbcode(model,r,g,b)
- return pdfcolor(model,registercolor(nil,'rgb',r,g,b))
+ if colors.supported then
+ return pdfcolor(model,registercolor(nil,'rgb',r,g,b))
+ else
+ return ""
+ end
end
+
function lpdf.cmykcode(model,c,m,y,k)
- return pdfcolor(model,registercolor(nil,'cmyk',c,m,y,k))
+ if colors.supported then
+ return pdfcolor(model,registercolor(nil,'cmyk',c,m,y,k))
+ else
+ return ""
+ end
end
+
function lpdf.graycode(model,s)
- return pdfcolor(model,registercolor(nil,'gray',s))
+ if colors.supported then
+ return pdfcolor(model,registercolor(nil,'gray',s))
+ else
+ return ""
+ end
end
+
function lpdf.spotcode(model,n,f,d,p)
- return pdfcolor(model,registercolor(nil,'spot',n,f,d,p)) -- incorrect
+ if colors.supported then
+ return pdfcolor(model,registercolor(nil,'spot',n,f,d,p)) -- incorrect
+ else
+ return ""
+ end
end
+
function lpdf.transparencycode(a,t)
- intransparency = true
- return format("/Tr%s gs",registertransparancy(nil,a,t,true)) -- true forces resource
+ if transparencies.supported then
+ intransparency = true
+ return format("/Tr%s gs",registertransparancy(nil,a,t,true)) -- true forces resource
+ else
+ return ""
+ end
end
function lpdf.finishtransparencycode()
- if intransparency then
+ if transparencies.supported and intransparency then
intransparency = false
return "/Tr0 gs" -- we happen to know this -)
else
return ""
end
end
+
+-- this will move to lpdf-spe.lua
+
+backends.pdf.tables.vfspecials = { -- todo: distinguish between glyph and rule color
+
+ red = { "special", 'pdf: 1 0 0 rg 1 0 0 RG' },
+ green = { "special", 'pdf: 0 1 0 rg 0 1 0 RG' },
+ blue = { "special", 'pdf: 0 0 1 rg 0 0 1 RG' },
+ black = { "special", 'pdf: 0 g 0 G' },
+
+ startslant = function(a) return { "special", format("pdf: q 1 0 %s 1 0 0 cm",a) } end,
+ stopslant = { "special", "pdf: Q" },
+
+}
diff --git a/Master/texmf-dist/tex/context/base/lpdf-enc.lua b/Master/texmf-dist/tex/context/base/lpdf-enc.lua
new file mode 100644
index 00000000000..090fb15cd5d
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lpdf-enc.lua
@@ -0,0 +1,157 @@
+if not modules then modules = { } end modules ['lpdf-enc'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- delayed loading
+
+local pdfconstant = lpdf.constant
+
+return lpdf.dictionary {
+ Type = pdfconstant("Encoding"),
+ Differences = lpdf.array {
+ 24,
+ pdfconstant("breve"),
+ pdfconstant("caron"),
+ pdfconstant("circumflex"),
+ pdfconstant("dotaccent"),
+ pdfconstant("hungarumlaut"),
+ pdfconstant("ogonek"),
+ pdfconstant("ring"),
+ pdfconstant("tilde"),
+ 39,
+ pdfconstant("quotesingle"),
+ 96,
+ pdfconstant("grave"),
+ 128,
+ pdfconstant("bullet"),
+ pdfconstant("dagger"),
+ pdfconstant("daggerdbl"),
+ pdfconstant("ellipsis"),
+ pdfconstant("emdash"),
+ pdfconstant("endash"),
+ pdfconstant("florin"),
+ pdfconstant("fraction"),
+ pdfconstant("guilsinglleft"),
+ pdfconstant("guilsinglright"),
+ pdfconstant("minus"),
+ pdfconstant("perthousand"),
+ pdfconstant("quotedblbase"),
+ pdfconstant("quotedblleft"),
+ pdfconstant("quotedblright"),
+ pdfconstant("quoteleft"),
+ pdfconstant("quoteright"),
+ pdfconstant("quotesinglbase"),
+ pdfconstant("trademark"),
+ pdfconstant("fi"),
+ pdfconstant("fl"),
+ pdfconstant("Lslash"),
+ pdfconstant("OE"),
+ pdfconstant("Scaron"),
+ pdfconstant("Ydieresis"),
+ pdfconstant("Zcaron"),
+ pdfconstant("dotlessi"),
+ pdfconstant("lslash"),
+ pdfconstant("oe"),
+ pdfconstant("scaron"),
+ pdfconstant("zcaron"),
+ 160,
+ pdfconstant("Euro"),
+ 164,
+ pdfconstant("currency"),
+ 166,
+ pdfconstant("brokenbar"),
+ 168,
+ pdfconstant("dieresis"),
+ pdfconstant("copyright"),
+ pdfconstant("ordfeminine"),
+ 172,
+ pdfconstant("logicalnot"),
+ pdfconstant(".notdef"),
+ pdfconstant("registered"),
+ pdfconstant("macron"),
+ pdfconstant("degree"),
+ pdfconstant("plusminus"),
+ pdfconstant("twosuperior"),
+ pdfconstant("threesuperior"),
+ pdfconstant("acute"),
+ pdfconstant("mu"),
+ 183,
+ pdfconstant("periodcentered"),
+ pdfconstant("cedilla"),
+ pdfconstant("onesuperior"),
+ pdfconstant("ordmasculine"),
+ 188,
+ pdfconstant("onequarter"),
+ pdfconstant("onehalf"),
+ pdfconstant("threequarters"),
+ 192,
+ pdfconstant("Agrave"),
+ pdfconstant("Aacute"),
+ pdfconstant("Acircumflex"),
+ pdfconstant("Atilde"),
+ pdfconstant("Adieresis"),
+ pdfconstant("Aring"),
+ pdfconstant("AE"),
+ pdfconstant("Ccedilla"),
+ pdfconstant("Egrave"),
+ pdfconstant("Eacute"),
+ pdfconstant("Ecircumflex"),
+ pdfconstant("Edieresis"),
+ pdfconstant("Igrave"),
+ pdfconstant("Iacute"),
+ pdfconstant("Icircumflex"),
+ pdfconstant("Idieresis"),
+ pdfconstant("Eth"),
+ pdfconstant("Ntilde"),
+ pdfconstant("Ograve"),
+ pdfconstant("Oacute"),
+ pdfconstant("Ocircumflex"),
+ pdfconstant("Otilde"),
+ pdfconstant("Odieresis"),
+ pdfconstant("multiply"),
+ pdfconstant("Oslash"),
+ pdfconstant("Ugrave"),
+ pdfconstant("Uacute"),
+ pdfconstant("Ucircumflex"),
+ pdfconstant("Udieresis"),
+ pdfconstant("Yacute"),
+ pdfconstant("Thorn"),
+ pdfconstant("germandbls"),
+ pdfconstant("agrave"),
+ pdfconstant("aacute"),
+ pdfconstant("acircumflex"),
+ pdfconstant("atilde"),
+ pdfconstant("adieresis"),
+ pdfconstant("aring"),
+ pdfconstant("ae"),
+ pdfconstant("ccedilla"),
+ pdfconstant("egrave"),
+ pdfconstant("eacute"),
+ pdfconstant("ecircumflex"),
+ pdfconstant("edieresis"),
+ pdfconstant("igrave"),
+ pdfconstant("iacute"),
+ pdfconstant("icircumflex"),
+ pdfconstant("idieresis"),
+ pdfconstant("eth"),
+ pdfconstant("ntilde"),
+ pdfconstant("ograve"),
+ pdfconstant("oacute"),
+ pdfconstant("ocircumflex"),
+ pdfconstant("otilde"),
+ pdfconstant("odieresis"),
+ pdfconstant("divide"),
+ pdfconstant("oslash"),
+ pdfconstant("ugrave"),
+ pdfconstant("uacute"),
+ pdfconstant("ucircumflex"),
+ pdfconstant("udieresis"),
+ pdfconstant("yacute"),
+ pdfconstant("thorn"),
+ pdfconstant("ydieresis"),
+ },
+}
diff --git a/Master/texmf-dist/tex/context/base/lpdf-epa.lua b/Master/texmf-dist/tex/context/base/lpdf-epa.lua
new file mode 100644
index 00000000000..17c55eb0c90
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lpdf-epa.lua
@@ -0,0 +1,193 @@
+if not modules then modules = { } end modules ['lpdf-epa'] = {
+ version = 1.001,
+ comment = "companion to lpdf-epa.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This is a rather experimental feature and the code will probably
+-- change.
+
+local type, tonumber = type, tonumber
+local format = string.format
+
+local trace_links = false trackers.register("figures.links", function(v) trace_links = v end)
+
+local report_link = logs.reporter("backend","merging")
+
+local backends, lpdf = backends, lpdf
+
+local variables = interfaces.variables
+local codeinjections = backends.pdf.codeinjections
+
+local layerspec = { -- predefining saves time
+ "epdflinks"
+}
+
+local function makenamespace(filename)
+ return format("lpdf-epa-%s-",file.removesuffix(file.basename(filename)))
+end
+
+local function add_link(x,y,w,h,destination,what)
+ if trace_links then
+ report_link("dx: % 4i, dy: % 4i, wd: % 4i, ht: % 4i, destination: %s, type: %s",x,y,w,h,destination,what)
+ end
+ local locationspec = { -- predefining saves time
+ x = x .. "bp",
+ y = y .. "bp",
+ preset = "leftbottom",
+ }
+ local buttonspec = {
+ width = w .. "bp",
+ height = h .. "bp",
+ offset = variables.overlay,
+ frame = trace_links and variables.on or variables.off,
+ }
+ context.setlayer (
+ layerspec,
+ locationspec,
+ function() context.button ( buttonspec, "", { destination } ) end
+ -- context.nested.button(buttonspec, "", { destination }) -- time this
+ )
+end
+
+local function link_goto(x,y,w,h,document,annotation,pagedata,namespace)
+ local destination = annotation.A.D -- [ 18 0 R /Fit ]
+ local what = "page"
+ if type(destination) == "string" then
+ local destinations = document.destinations
+ local wanted = destinations[destination]
+ destination = wanted and wanted.D
+ if destination then what = "named" end
+ end
+ local pagedata = destination and destination[1]
+ if pagedata then
+ local destinationpage = pagedata.number
+ if destinationpage then
+ add_link(x,y,w,h,namespace .. destinationpage,what)
+ end
+ end
+end
+
+local function link_uri(x,y,w,h,document,annotation)
+ local url = annotation.A.URI
+ if url then
+ add_link(x,y,w,h,format("url(%s)",url),"url")
+ end
+end
+
+local function link_file(x,y,w,h,document,annotation)
+ local filename = annotation.A.F
+ if filename then
+ local destination = annotation.A.D
+ if not destination then
+ add_link(x,y,w,h,format("file(%s)",filename),"file")
+ elseif type(destination) == "string" then
+ add_link(x,y,w,h,format("%s::%s",filename,destination),"file (named)")
+ else
+ destination = destination[1] -- array
+ if tonumber(destination) then
+ add_link(x,y,w,h,format("%s::page(%s)",filename,destination),"file (page)")
+ else
+ add_link(x,y,w,h,format("file(%s)",filename),"file")
+ end
+ end
+ end
+end
+
+function codeinjections.mergereferences(specification)
+ if figures and not specification then
+ specification = figures and figures.current()
+ specification = specification and specification.status
+ end
+ if specification then
+ local fullname = specification.fullname
+ local document = lpdf.epdf.load(fullname)
+ if document then
+ local pagenumber = specification.page or 1
+ local xscale = specification.yscale or 1
+ local yscale = specification.yscale or 1
+ local size = specification.size or "crop" -- todo
+ local pagedata = document.pages[pagenumber]
+ local annotations = pagedata.Annots
+ local namespace = format("lpdf-epa-%s-",file.removesuffix(file.basename(fullname)))
+ local reference = namespace .. pagenumber
+ if annotations.n > 0 then
+ 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
+ context.definelayer( { "epdflinks" }, { height = height.."bp" , width = width.."bp" })
+ for i=1,annotations.n do
+ local annotation = annotations[i]
+ 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 linktype = annotation.A.S
+ if linktype == "GoTo" then
+ link_goto(x,y,w,h,document,annotation,pagedata,namespace)
+ elseif linktype == "GoToR" then
+ link_file(x,y,w,h,document,annotation)
+ elseif linktype == "URI" then
+ link_uri(x,y,w,h,document,annotation)
+ elseif trace_links then
+ report_link("unsupported link annotation '%s'",linktype)
+ end
+ elseif trace_links then
+ report_link("unsupported annotation '%s'",subtype)
+ 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 '%s'",reference)
+ end
+ specification.reference = reference
+ return namespace
+ end
+ end
+ end
+ return ""-- no namespace, empty, not nil
+end
+
+function codeinjections.mergeviewerlayers(specification)
+ -- todo: parse included page for layers
+ if true then
+ return
+ end
+ if not specification then
+ specification = figures and figures.current()
+ specification = specification and specification.status
+ end
+ if specification then
+ local fullname = specification.fullname
+ local document = lpdf.epdf.load(fullname)
+ if document then
+ local namespace = format("lpdf:epa:%s:",file.removesuffix(file.basename(fullname)))
+ local layers = document.layers
+ if layers then
+ for i=1,layers.n do
+ local tag = layers[i]
+tag = namespace .. string.gsub(tag," ",":")
+local title = tag
+if trace_links then
+ report_link("using layer '%s'",tag)
+end
+ attributes.viewerlayers.define { -- also does some cleaning
+ tag = tag, -- todo: #3A or so
+ title = title,
+ visible = variables.start,
+ editable = variables.yes,
+ printable = variables.yes,
+ }
+ codeinjections.useviewerlayer(tag)
+ 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
new file mode 100644
index 00000000000..19c1f9bd8d9
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lpdf-epd.lua
@@ -0,0 +1,308 @@
+if not modules then modules = { } end modules ['lpdf-epd'] = {
+ version = 1.001,
+ comment = "companion to lpdf-epa.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ 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 = string.lower, string.match, string.char
+local concat = table.concat
+
+function epdf.type(o)
+ local t = lower(match(tostring(o),"[^ :]+"))
+ return t or "?"
+end
+
+lpdf = lpdf or { }
+local lpdf = lpdf
+
+lpdf.epdf = { }
+
+local checked_access
+
+local function prepare(document,d,t,n,k)
+ for i=1,n do
+ local v = d:getVal(i)
+ local r = d:getValNF(i)
+ if r:getTypeName() ~= "ref" then
+ t[d:getKey(i)] = checked_access[v:getTypeName()](v,document)
+ else
+ r = r:getRef().num
+ local c = document.cache[r]
+ if c then
+ --
+ else
+ c = checked_access[v:getTypeName()](v,document,r)
+ document.cache[r] = c
+ document.xrefs[c] = r
+ end
+ t[d:getKey(i)] = c
+ end
+ end
+ getmetatable(t).__index = nil
+ return t[k]
+end
+
+local function some_dictionary(d,document,r)
+ local n = d and d:getLength() or 0
+ if n > 0 then
+ local t = { }
+ setmetatable(t, { __index = function(t,k) return prepare(document,d,t,n,k) end } )
+ return t
+ end
+end
+
+local done = { }
+
+local function prepare(document,a,t,n,k)
+ for i=1,n do
+ local v = a:get(i)
+ local r = a:getNF(i)
+ if r:getTypeName() ~= "ref" then
+ t[i] = checked_access[v:getTypeName()](v,document)
+ else
+ r = r:getRef().num
+ local c = document.cache[r]
+ if c then
+ --
+ else
+ c = checked_access[v:getTypeName()](v,document,r)
+ document.cache[r] = c
+ document.xrefs[c] = r
+ end
+ t[i] = c
+ 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
+ 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
+
+local function streamaccess(s,_,what)
+ if not what or what == "all" or what == "*all" then
+ local t, n = { }, 0
+ s:streamReset()
+ while true do
+ local c = s:streamGetChar()
+ if c < 0 then
+ break
+ else
+ n = n + 1
+ t[n] = char(c)
+ end
+ end
+ return concat(t)
+ end
+end
+
+local function some_stream(d,document,r)
+ if d then
+ d:streamReset()
+ local s = some_dictionary(d:streamGetDict(),document,r)
+ getmetatable(s).__call = function(...) return streamaccess(d,...) end
+ return s
+ end
+end
+
+-- we need epdf.getBool
+
+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 v:getString()
+ end,
+ boolean = function(v)
+ return v:getBool()
+ end,
+ name = function(v)
+ return v:getName()
+ end,
+ ref = function(v)
+ return v:getRef()
+ end,
+}
+
+--~ 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
+
+local function getnames(document,n,target) -- direct
+ if n then
+ local Names = n.Names
+ if Names then
+ if not target then
+ target = { }
+ end
+ for i=1,Names.n,2 do
+ target[Names[i]] = Names[i+1]
+ end
+ else
+ local Kids = n.Kids
+ if Kids then
+ for i=1,Kids.n do
+ target = getnames(document,Kids[i],target)
+ end
+ end
+ end
+ return target
+ end
+end
+
+local function getkids(document,n,target) -- direct
+ if n then
+ local Kids = n.Kids
+ if Kids then
+ for i=1,Kids.n do
+ target = getkids(document,Kids[i],target)
+ end
+ elseif target then
+ target[#target+1] = n
+ else
+ target = { n }
+ end
+ return target
+ end
+end
+
+-- /OCProperties <<
+-- /OCGs [ 15 0 R 17 0 R 19 0 R 21 0 R 23 0 R 25 0 R 27 0 R ]
+-- /D <<
+-- /Order [ 15 0 R 17 0 R 19 0 R 21 0 R 23 0 R 25 0 R 27 0 R ]
+-- /ON [ 15 0 R 17 0 R 19 0 R 21 0 R 23 0 R 25 0 R 27 0 R ]
+-- /OFF [ ]
+-- >>
+-- >>
+
+local function getlayers(document)
+ local properties = document.Catalog.OCProperties
+ if properties then
+ local layers = properties.OCGs
+ if layers then
+ local t = { }
+ 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
+ return t
+ end
+ end
+end
+
+local function getpages(document)
+ local data = document.data
+ local xrefs = document.xrefs
+ local cache = document.cache
+ local cata = data:getCatalog()
+ local xref = data:getXRef()
+ local pages = { }
+ for pagenumber=1,cata:getNumPages() do
+ local pagereference = cata:getPageRef(pagenumber).num
+ local pagedata = some_dictionary(xref:fetch(pagereference,0):getDict(),document,pagereference)
+ pagedata.number = pagenumber
+ pages[pagenumber] = pagedata
+ xrefs[pagedata] = pagereference
+ cache[pagereference] = pagedata
+ end
+ return pages
+end
+
+-- loader
+
+local function delayed(document,tag,f)
+ local t = { }
+ setmetatable(t, { __index = function(t,k)
+ local result = f()
+ if result then
+ document[tag] = result
+ return result[k]
+ end
+ end } )
+ return t
+end
+
+local loaded = { }
+
+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
+ document = {
+ filename = filename,
+ cache = { },
+ xrefs = { },
+ data = data,
+ }
+ local Catalog = some_dictionary(data:getXRef():getCatalog():getDict(),document)
+ document.Catalog = Catalog
+ -- document.catalog = Catalog
+ -- a few handy helper tables
+ document.pages = delayed(document,"pages", function() return getpages(document) end)
+ document.destinations = delayed(document,"destinations", function() return getnames(document,Catalog.Names.Dests) end)
+ document.javascripts = delayed(document,"javascripts", function() return getnames(document,Catalog.Names.JS) end)
+ document.widgets = delayed(document,"widgets", function() return getnames(document,Catalog.Names.AcroForm) end)
+ document.embeddedfiles = delayed(document,"embeddedfiles",function() return getnames(document,Catalog.Names.EmbeddedFiles) end)
+ document.layers = delayed(document,"layers", function() return getlayers(document) end)
+ else
+ document = false
+ end
+ loaded[filename] = document
+ statistics.stoptiming(lpdf.epdf)
+ -- print(statistics.elapsedtime(lpdf.epdf))
+ end
+ return document
+end
+
+-- helpers
+
+-- 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 c034aec6c91..590aee1abe5 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-fld.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-fld.lua
@@ -6,38 +6,78 @@ if not modules then modules = { } end modules ['lpdf-fld'] = {
license = "see context related readme files"
}
--- cleaned up, e.g. no longer older viewers
--- always kids so no longer explicit main / clone / copy
--- some optimizations removed (will come bakc if needed)
+-- The problem with widgets is that so far each version of acrobat
+-- has some rendering problem. I tried to keep up with this but
+-- it makes no sense to do so as one cannot rely on the viewer
+-- not changing. Especially Btn fields are tricky as their appearences
+-- need to be synchronized in the case of children but e.g. acrobat
+-- 10 does not retain the state and forces a check symbol. If you
+-- make a file in acrobat then it has MK entries that seem to overload
+-- the already present appearance streams (they're probably only meant for
+-- printing) as it looks like the viewer has some fallback on (auto
+-- generated) MK behaviour built in. So ... hard to test. Unfortunately
+-- not even the default appearance is generated. This will probably be
+-- solved at some point.
local gmatch, lower, format = string.gmatch, string.lower, string.format
local lpegmatch = lpeg.match
+local utfchar = utf.char
+local bpfactor, todimen = number.dimenfactors.bp, string.todimen
-local trace_fields = false trackers.register("widgets.fields", function(v) trace_fields = v end)
+local trace_fields = false trackers.register("backends.fields", function(v) trace_fields = v end)
-local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local report_fields = logs.reporter("backend","fields")
-local variables = interfaces.variables
+local backends, lpdf = backends, lpdf
-local nodeinjections = backends.pdf.nodeinjections
-local codeinjections = backends.pdf.codeinjections
-local registrations = backends.pdf.registrations
+local variables = interfaces.variables
+local context = context
-local registeredsymbol = codeinjections.registeredsymbol
+local references = structures.references
+local settings_to_array = utilities.parsers.settings_to_array
-local pdfstream = lpdf.stream
-local pdfdictionary = lpdf.dictionary
-local pdfarray = lpdf.array
-local pdfreference = lpdf.reference
-local pdfunicode = lpdf.unicode
-local pdfstring = lpdf.string
-local pdfconstant = lpdf.constant
-local pdftoeight = lpdf.toeight
-local pdfflushobject = lpdf.flushobject
-local pdfreserveobject = lpdf.reserveobject
-local pdfannotation = nodes.pdfannotation
+local pdfbackend = backends.pdf
-local submitoutputformat = 0 -- 0=unknown 1=HTML 2=FDF 3=XML => not yet used, needs to be checked
+local nodeinjections = pdfbackend.nodeinjections
+local codeinjections = pdfbackend.codeinjections
+local registrations = pdfbackend.registrations
+
+local registeredsymbol = codeinjections.registeredsymbol
+
+local pdfstream = lpdf.stream
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfreference = lpdf.reference
+local pdfunicode = lpdf.unicode
+local pdfstring = lpdf.string
+local pdfconstant = lpdf.constant
+local pdftoeight = lpdf.toeight
+local pdfflushobject = lpdf.flushobject
+local pdfimmediateobject = lpdf.immediateobject
+local pdfshareobjectreference = lpdf.shareobjectreference
+local pdfshareobject = lpdf.shareobject
+local pdfreserveobject = lpdf.reserveobject
+local pdfreserveannotation = lpdf.reserveannotation
+local pdfaction = lpdf.action
+
+local hpack_node = node.hpack
+
+local nodepool = nodes.pool
+
+local pdfannotation_node = nodepool.pdfannotation
+
+local submitoutputformat = 0 -- 0=unknown 1=HTML 2=FDF 3=XML => not yet used, needs to be checked
+
+local pdf_widget = pdfconstant("Widget")
+local pdf_tx = pdfconstant("Tx")
+local pdf_ch = pdfconstant("Ch")
+local pdf_btn = pdfconstant("Btn")
+local pdf_yes = pdfconstant("Yes")
+local pdf_off = pdfconstant("Off")
+local pdf_p = pdfconstant("P") -- None Invert Outline Push
+local pdf_n = pdfconstant("N") -- None Invert Outline Push
+--
+local pdf_no_rect = pdfarray { 0, 0, 0, 0 }
local splitter = lpeg.splitat("=>")
@@ -46,7 +86,7 @@ local formats = {
}
function codeinjections.setformsmethod(name)
- submitoutputformat = formats[lower(name)] or 3
+ submitoutputformat = formats[lower(name)] or formats.xml
end
local flag = {
@@ -94,7 +134,7 @@ plus.auto = plus.AutoView
-- some day .. lpeg with function or table
local function fieldflag(specification)
- local o, n = specification.options, 0
+ local o, n = specification.option, 0
if o and o ~= "" then
for f in gmatch(o,"[^, ]+") do
n = n + (flag[f] or 0)
@@ -104,7 +144,7 @@ local function fieldflag(specification)
end
local function fieldplus(specification)
- local o, n = specification.options, 0
+ local o, n = specification.option, 0
if o and o ~= "" then
for p in gmatch(o,"[^, ]+") do
n = n + (plus[p] or 0)
@@ -113,29 +153,30 @@ local function fieldplus(specification)
return n
end
-
local function checked(what)
- if what and what ~= "" then
- local set, bug = jobreferences.identify("",what)
- return not bug and #set > 0 and lpdf.pdfaction(set)
+ local set, bug = references.identify("",what)
+ if not bug and #set > 0 then
+ local r, n = pdfaction(set)
+ return pdfshareobjectreference(r)
end
end
local function fieldactions(specification) -- share actions
---~ print(table.serialize(specification))
local d, a = { }, nil
- a = specification.mousedown if a and a ~= "" then d.D = checked(a) end
- a = specification.mouseup if a and a ~= "" then d.U = checked(a) end
+ a = specification.mousedown
+ or specification.clickin if a and a ~= "" then d.D = checked(a) end
+ a = specification.mouseup
+ or specification.clickout if a and a ~= "" then d.U = checked(a) end
a = specification.regionin if a and a ~= "" then d.E = checked(a) end -- Enter
a = specification.regionout if a and a ~= "" then d.X = checked(a) end -- eXit
- a = specification.afterkeystroke if a and a ~= "" then d.K = checked(a) end
- a = specification.formatresult if a and a ~= "" then d.F = checked(a) end
- a = specification.validateresult if a and a ~= "" then d.V = checked(a) end
- a = specification.calculatewhatever if a and a ~= "" then d.C = checked(a) end
+ a = specification.afterkey if a and a ~= "" then d.K = checked(a) end
+ a = specification.format if a and a ~= "" then d.F = checked(a) end
+ a = specification.validate if a and a ~= "" then d.V = checked(a) end
+ a = specification.calculate if a and a ~= "" then d.C = checked(a) end
a = specification.focusin if a and a ~= "" then d.Fo = checked(a) end
a = specification.focusout if a and a ~= "" then d.Bl = checked(a) end
- -- a = specification.openpage if a and a ~= "" then d.PO = checked(a) end
- -- a = specification.closepage if a and a ~= "" then d.PC = checked(a) end
+ a = specification.openpage if a and a ~= "" then d.PO = checked(a) end
+ a = specification.closepage if a and a ~= "" then d.PC = checked(a) end
-- a = specification.visiblepage if a and a ~= "" then d.PV = checked(a) end
-- a = specification.invisiblepage if a and a ~= "" then d.PI = checked(a) end
return next(d) and pdfdictionary(d)
@@ -143,6 +184,26 @@ end
-- fonts and color
+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.
+
+-- To be checked: only when text/line fields.
+
+local function checkpdfdocencoding()
+ report_fields("adding pdfdoc encoding vector")
+ local encoding = dofile(resolvers.findfile("lpdf-enc.lua")) -- no checking, fatal if not present
+ pdfdocencodingvector = pdfreference(pdfflushobject(encoding))
+ local capsule = pdfdictionary {
+ PDFDocEncoding = pdfdocencodingvector
+ }
+ pdfdocencodingcapsule = pdfreference(pdfflushobject(capsule))
+ checkpdfdocencoding = function() end
+end
+
local fontnames = {
rm = {
tf = "Times-Roman",
@@ -167,44 +228,59 @@ local fontnames = {
sl = "Courier-Oblique",
bi = "Courier-BoldOblique",
bs = "Courier-BoldOblique",
+ },
+ symbol = {
+ dingbats = "ZapfDingbats",
}
}
local usedfonts = { }
local function fieldsurrounding(specification)
- local size = specification.fontsize or "12pt"
- local style = specification.fontstyle or "rm"
- local alternative = specification.fontalternative or "tf"
- local s = fontnames[style]
+ local fontsize = specification.fontsize or "12pt"
+ local fontstyle = specification.fontstyle or "rm"
+ local fontalternative = specification.fontalternative or "tf"
+ local colorvalue = specification.colorvalue
+ local s = fontnames[fontstyle]
if not s then
- style, s = "rm", fontnames.rm
+ fontstyle, s = "rm", fontnames.rm
end
- local a = s[alternative]
+ local a = s[fontalternative]
if not a then
alternative, a = "tf", s.tf
end
- local tag = style .. alternative
- size = string.todimen(size)
+ local tag = fontstyle .. fontalternative
+ fontsize = todimen(fontsize)
+ fontsize = fontsize and (bpfactor * fontsize) or 12
+ fontraise = 0.1 * fontsize -- todo: figure out what the natural one is and compensate for strutdp
+ local fontcode = format("%0.4f Tf %0.4f Ts",fontsize,fontraise)
+ -- we could test for colorvalue being 1 (black) and omit it then
+ local colorcode = lpdf.color(3,colorvalue) -- we force an rgb color space
+ if trace_fields then
+ report_fields("fontcode : %s %s @ %s => %s => %s",fontstyle,fontalternative,fontsize,tag,fontcode)
+ report_fields("colorcode: %s => %s",colorvalue,colorcode)
+ end
local stream = pdfstream {
pdfconstant(tag),
- format("%0.4f Tf",(size and (number.dimenfactors.bp * size)) or 12),
+ format("%s %s",fontcode,colorcode)
}
usedfonts[tag] = a -- the name
- -- add color to stream: 0 g
-- move up with "x.y Ts"
return tostring(stream)
end
local function registerfonts()
if next(usedfonts) then
+ checkpdfdocencoding() -- already done
local d = pdfdictionary()
+ local pdffonttype, pdffontsubtype = pdfconstant("Font"), pdfconstant("Type1")
for tag, name in next, usedfonts do
local f = pdfdictionary {
- Type = pdfconstant("Font"),
- Subtype = pdfconstant("Type1"), -- todo
+ Type = pdffonttype,
+ Subtype = pdffontsubtype,
Name = pdfconstant(tag),
BaseFont = pdfconstant(name),
+ Encoding = pdfdocencodingvector,
}
d[tag] = pdfreference(pdfflushobject(f))
end
@@ -212,16 +288,6 @@ local function registerfonts()
end
end
--- cache
-
-local function fieldattributes(specification)
---~ return pdfarray {
---~ -- BG = -- backgroundcolor
---~ -- BC = -- framecolor
---~ }
- return nil
-end
-
-- symbols
local function fieldappearances(specification)
@@ -232,7 +298,7 @@ local function fieldappearances(specification)
-- error
return
end
- local v = aux.settings_to_array(values)
+ local v = settings_to_array(values)
local n, r, d
if #v == 1 then
n, r, d = v[1], v[1], v[1]
@@ -241,21 +307,23 @@ local function fieldappearances(specification)
else
n, r, d = v[1], v[2], v[3]
end
- local appearance = pdfdictionary { -- cache this one
+ local appearance = pdfdictionary {
N = registeredsymbol(n), R = registeredsymbol(r), D = registeredsymbol(d),
}
- return lpdf.sharedobj(tostring(appearance))
+ return pdfshareobjectreference(appearance)
end
+local YesorOn = "Yes" -- somehow On is not always working out well any longer (why o why this change)
+
local function fieldstates(specification,forceyes,values,default)
-- we don't use Opt here (too messy for radio buttons)
local values, default = values or specification.values, default or specification.default
- if not values then
+ if not values or values == "" then
-- error
return
end
- local v = aux.settings_to_array(values)
- local yes, off
+ local v = settings_to_array(values)
+ local yes, off, yesn, yesr, yesd, offn, offr, offd
if #v == 1 then
yes, off = v[1], v[1]
else
@@ -265,12 +333,12 @@ local function fieldstates(specification,forceyes,values,default)
if not (yesshown and yesvalue) then
yesshown = yes, yes
end
- yes = aux.settings_to_array(yesshown)
+ yes = settings_to_array(yesshown)
local offshown, offvalue = lpegmatch(splitter,off)
if not (offshown and offvalue) then
offshown = off, off
end
- off = aux.settings_to_array(offshown)
+ off = settings_to_array(offshown)
if #yes == 1 then
yesn, yesr, yesd = yes[1], yes[1], yes[1]
elseif #yes == 2 then
@@ -292,29 +360,42 @@ local function fieldstates(specification,forceyes,values,default)
offvalue = offn
end
if forceyes == true then
- forceyes = forceyes and "On" -- spec likes Yes more but we've used On for ages now
+ forceyes = forceyes and YesorOn -- spec likes Yes more but we've used On for ages now
else
-- false or string
end
if default == yesn then
default = pdfconstant(forceyes or yesn)
else
- default = pdfconstant("Off")
+ default = pdf_off
end
local appearance = pdfdictionary { -- maybe also cache components
N = pdfdictionary { [forceyes or yesn] = registeredsymbol(yesn), Off = registeredsymbol(offn) },
R = pdfdictionary { [forceyes or yesr] = registeredsymbol(yesr), Off = registeredsymbol(offr) },
D = pdfdictionary { [forceyes or yesd] = registeredsymbol(yesd), Off = registeredsymbol(offd) }
}
- local appearanceref = lpdf.sharedobj(tostring(appearance))
- return appearanceref, default
+ local appearanceref = pdfshareobjectreference(appearance)
+ return appearanceref, default, yesvalue
+end
+
+local function fielddefault(field)
+ local default = field.default
+ if not default or default == "" then
+ local values = settings_to_array(field.values)
+ default = values[1]
+ end
+ if not default or default == "" then
+ return pdf_off
+ else
+ return pdfconstant(default)
+ end
end
local function fieldoptions(specification)
local values = specification.values
local default = specification.default
if values then
- local v = aux.settings_to_array(values)
+ local v = settings_to_array(values)
for i=1,#v do
local vi = v[i]
local shown, value = lpegmatch(splitter,vi)
@@ -328,21 +409,32 @@ local function fieldoptions(specification)
end
end
-local function radiodefault(parent,field,forceyes)
- local default, values = parent.default, parent.values
- if not default or default == "" then
- values = aux.settings_to_array(values)
- default = values[1]
+local mapping = {
+ -- acrobat compliant (messy, probably some pdfdoc encoding interference here)
+ check = "4", -- 0x34
+ circle = "l", -- 0x6C
+ cross = "8", -- 0x38
+ diamond = "u", -- 0x75
+ square = "n", -- 0x6E
+ star = "H", -- 0x48
+}
+
+local function todingbat(n)
+ if n and n ~= "" then
+ return mapping[n] or ""
end
- local name = field.name
- local fieldvalues = aux.settings_to_array(field.values)
- local yes, off = fieldvalues[1], fieldvalues[2] or fieldvalues[1]
- if not default then
- return pdfconstant((forceyes and "On") or yes)
- elseif default == name then
- return pdfconstant((forceyes and "On") or default)
- else
- return pdfconstant("Off")
+end
+
+local function fieldrendering(specification)
+ local bvalue = tonumber(specification.backgroundcolorvalue)
+ local fvalue = tonumber(specification.framecolorvalue)
+ local svalue = specification.fontsymbol
+ if bvalue or fvalue or (svalue and svalue ~= "") then
+ return pdfdictionary {
+ BG = bvalue and pdfarray { lpdf.colorvalues(3,bvalue) } or nil,
+ BC = fvalue and pdfarray { lpdf.colorvalues(3,fvalue) } or nil,
+ CA = svalue and pdfstring (svalue) or nil,
+ }
end
end
@@ -350,7 +442,7 @@ end
local function fieldlayer(specification) -- we can move this in line
local layer = specification.layer
- return (layer and lpdf.layerreferences[layer]) or nil
+ return (layer and lpdf.layerreference(layer)) or nil
end
-- defining
@@ -388,7 +480,7 @@ end
local function predefinesymbols(specification)
local values = specification.values
if values then
- local symbols = aux.settings_to_array(values)
+ local symbols = settings_to_array(values)
for i=1,#symbols do
local symbol = symbols[i]
local a, b = lpegmatch(splitter,symbol)
@@ -403,16 +495,14 @@ function codeinjections.getdefaultfieldvalue(name)
local values = f.values
local default = f.default
if not default or default == "" then
- local symbols = aux.settings_to_array(values)
+ local symbols = settings_to_array(values)
local symbol = symbols[1]
if symbol then
local a, b = lpegmatch(splitter,symbol) -- splits at =>
default = a or symbol
end
end
- if default then
- tex.sprint(ctxcatcodes,default)
- end
+ return default
end
end
@@ -420,26 +510,26 @@ function codeinjections.definefield(specification)
local n = specification.name
local f = fields[n]
if not f then
- local kind = specification.kind
- if not kind then
+ local fieldtype = specification.type
+ if not fieldtype then
if trace_fields then
- logs.report("fields","invalid definition of '%s': unknown type",n)
+ report_fields("invalid definition of '%s': unknown type",n)
end
- elseif kind == "radio" then
+ elseif fieldtype == "radio" then
local values = specification.values
if values and values ~= "" then
- values = aux.settings_to_array(values)
+ values = settings_to_array(values)
for v=1,#values do
radios[values[v]] = { parent = n }
end
fields[n] = specification
if trace_fields then
- logs.report("fields","defining '%s' as radio",n or "?")
+ report_fields("defining '%s' as radio",n or "?")
end
elseif trace_fields then
- logs.report("fields","invalid definition of radio '%s': missing values",n)
+ report_fields("invalid definition of radio '%s': missing values",n)
end
- elseif kind == "sub" then
+ elseif fieldtype == "sub" then
-- not in main field list !
local radio = radios[n]
if radio then
@@ -449,16 +539,16 @@ function codeinjections.definefield(specification)
end
if trace_fields then
local p = radios[n] and radios[n].parent
- logs.report("fields","defining '%s' as sub of radio '%s'",n or "?",p or "?")
+ report_fields("defining '%s' as sub of radio '%s'",n or "?",p or "?")
end
elseif trace_fields then
- logs.report("fields","invalid definition of radio sub '%s': no parent",n)
+ report_fields("invalid definition of radio sub '%s': no parent",n)
end
predefinesymbols(specification)
- elseif kind == "text" or kind == "line" then
+ elseif fieldtype == "text" or fieldtype == "line" then
fields[n] = specification
if trace_fields then
- logs.report("fields","defining '%s' as %s",n,kind)
+ report_fields("defining '%s' as %s",n,fieldtype)
end
if specification.values ~= "" and specification.default == "" then
specification.default, specification.values = specification.values, nil
@@ -466,69 +556,76 @@ function codeinjections.definefield(specification)
else
fields[n] = specification
if trace_fields then
- logs.report("fields","defining '%s' as %s",n,kind)
+ report_fields("defining '%s' as %s",n,fieldtype)
end
predefinesymbols(specification)
end
elseif trace_fields then
- logs.report("fields","invalid definition of '%s': already defined",n)
+ report_fields("invalid definition of '%s': already defined",n)
end
end
-function codeinjections.clonefield(specification)
- local p, c, v = specification.parent, specification.children, specification.variant
+function codeinjections.clonefield(specification) -- obsolete
+ local p, c, v = specification.parent, specification.children, specification.alternative
if not p or not c then
if trace_fields then
- logs.report("fields","invalid clone: children: '%s', parent '%s', variant: '%s'",p or "?",c or "?", v or "?")
+ report_fields("invalid clone: children: '%s', parent '%s', alternative: '%s'",p or "?",c or "?", v or "?")
end
- else
- for n in gmatch(c,"[^, ]+") do
- local f, r, c, x = fields[n], radios[n], clones[n], fields[p]
- if f or r or c then
- if trace_fields then
- logs.report("fields","already cloned: child: '%s', parent '%s', variant: '%s'",p or "?",n or "?", v or "?")
- end
- elseif x then
- if trace_fields then
- logs.report("fields","invalid clone: child: '%s', variant: '%s', no parent",n or "?", v or "?")
- end
- else
- if trace_fields then
- logs.report("fields","cloning: child: '%s', parent '%s', variant: '%s'",p or "?",n or "?", v or "?")
- end
- clones[n] = specification
- predefinesymbols(specification)
+ return
+ end
+ local x = fields[p]
+ if not x then
+ if trace_fields then
+ report_fields("cloning: unknown parent '%s'",p)
+ end
+ return
+ end
+ for n in gmatch(c,"[^, ]+") do
+ local f, r, c = fields[n], radios[n], clones[n]
+ if f or r or c then
+ if trace_fields then
+ report_fields("already cloned: child: '%s', parent '%s', alternative: '%s'",p,n, v or "?")
end
+ else
+ if trace_fields then
+ report_fields("cloning: child: '%s', parent '%s', alternative: '%s'",p,n, v or "?")
+ end
+ clones[n] = specification
+ predefinesymbols(specification)
end
end
end
-function codeinjections.getfieldgroup(name)
+function codeinjections.getfieldcategory(name)
local f = fields[name] or radios[name] or clones[name]
- local g = f and f.group
- if not g or g == "" then
- local v, p, k = f.variant, f.parent, f.kind
- if v == "clone" or v == "copy" then
- f = fields[p] or radios[p]
- g = f and f.group
- elseif k == "sub" then
- f = fields[p]
- g = f and f.group
+ if f then
+ local g = f.category
+ if not g or g == "" then
+ local v, p, t = f.alternative, f.parent, f.type
+ if v == "clone" or v == "copy" then
+ f = fields[p] or radios[p]
+ g = f and f.category
+ elseif t == "sub" then
+ f = fields[p]
+ g = f and f.category
+ end
end
- end
- if g then
- texsprint(ctxcatcodes,g)
+ return g
end
end
--
-function codeinjections.doiffieldset(tag)
- commands.testcase(fieldsets[tag])
+function codeinjections.validfieldcategory(name)
+ return fields[name] or radios[name] or clones[name]
+end
+
+function codeinjections.validfieldset(name)
+ return fieldsets[tag]
end
-function codeinjections.doiffieldelse(name)
- commands.testcase(fields[name])
+function codeinjections.validfield(name)
+ return fields[name]
end
--
@@ -544,342 +641,428 @@ local function fieldalignment(specification)
end
local function enhance(specification,option)
- local so = specification.options
+ local so = specification.option
if so and so ~= "" then
- specification.options = so .. "," .. option
+ specification.option = so .. "," .. option
else
- specification.options = option
+ specification.option = option
end
return specification
end
-- finish
-local collected = pdfarray()
+local collected = pdfarray()
+local forceencoding = false
local function finishfields()
+ local sometext = forceencoding
for name, field in next, fields do
local kids = field.kids
if kids then
- pdfflushobject(field.kobj,kids)
+ pdfflushobject(field.kidsnum,kids)
+ end
+ local opt = field.opt
+ if opt then
+ pdfflushobject(field.optnum,opt)
+ end
+ local type = field.type
+ if not sometext and (type == "text" or type == "line") then
+ sometext = true
end
- local pobj = field.pobj
end
for name, field in next, radios do
local kids = field.kids
if kids then
- pdfflushobject(field.kobj,kids)
+ pdfflushobject(field.kidsnum,kids)
+ end
+ local opt = field.opt
+ if opt then
+ pdfflushobject(field.optnum,opt)
end
end
if #collected > 0 then
- usedfonts.tttf = fontnames.tt.tf
local acroform = pdfdictionary {
NeedAppearances = true,
- Fields = pdfreference(pdfflushobject(collected)),
- DR = pdfdictionary { Font = registerfonts() },
- CO = fieldsetlist(calculationset),
- DA = "/tttf 12 Tf 0 g",
+ Fields = pdfreference(pdfflushobject(collected)),
+ CO = fieldsetlist(calculationset),
}
+ if sometext then
+ checkpdfdocencoding()
+ usedfonts.tttf = fontnames.tt.tf
+ acroform.DA = "/tttf 12 Tf 0 g"
+ acroform.DR = pdfdictionary {
+ Font = registerfonts(),
+ Encoding = pdfdocencodingcapsule,
+ }
+ end
lpdf.addtocatalog("AcroForm",pdfreference(pdfflushobject(acroform)))
end
end
-lpdf.registerdocumentfinalizer(finishfields)
-
-local pdf_widget = pdfconstant("Widget")
-local pdf_tx = pdfconstant("Tx")
-local pdf_ch = pdfconstant("Ch")
-local pdf_btn = pdfconstant("Btn")
-local pdf_yes = pdfconstant("Yes")
-local pdf_p = pdfconstant("P") -- None Invert Outline Push
-local pdf_n = pdfconstant("N") -- None Invert Outline Push
---
-local pdf_no_rect = pdfarray { 0, 0, 0, 0 }
+lpdf.registerdocumentfinalizer(finishfields,"form fields")
local methods = { }
-function codeinjections.typesetfield(name,specification)
+function nodeinjections.typesetfield(name,specification)
local field = fields[name] or radios[name] or clones[name]
if not field then
- logs.report("fields", "unknown child '%s'",name)
+ report_fields( "unknown child '%s'",name)
-- unknown field
return
end
- local variant, parent = field.variant, field.parent
- if variant == "copy" or variant == "clone" then -- only in clones
+ local alternative, parent = field.alternative, field.parent
+ if alternative == "copy" or alternative == "clone" then -- only in clones
field = fields[parent] or radios[parent]
end
- local method = methods[field.kind]
+ local method = methods[field.type]
if method then
- method(name,specification,variant)
+ return method(name,specification,alternative)
else
- logs.report("fields", "unknown method '%s' for child '%s'",field.kind,name)
+ report_fields( "unknown method '%s' for child '%s'",field.type,name)
end
end
--- can be optional multipass optimization (share objects)
-
-local function save_parent(field,specification,d)
- local kn = pdfreserveobject()
- d.Kids = pdfreference(kn)
- field.kobj = kn
+local function save_parent(field,specification,d,hasopt)
+ local kidsnum = pdfreserveobject()
+ d.Kids = pdfreference(kidsnum)
+ field.kidsnum = kidsnum
field.kids = pdfarray()
- local pn = pdfflushobject(d)
- field.pobj = pn
- collected[#collected+1] = pdfreference(pn)
+ if hasopt then
+ local optnum = pdfreserveobject()
+ d.Opt = pdfreference(optnum)
+ field.optnum = optnum
+ field.opt = pdfarray()
+ end
+ local pnum = pdfflushobject(d)
+ field.pobj = pnum
+ collected[#collected+1] = pdfreference(pnum)
end
-local function save_kid(field,specification,d)
- local kn = pdfreserveobject()
+local function save_kid(field,specification,d,optname)
+ local kn = pdfreserveannotation()
field.kids[#field.kids+1] = pdfreference(kn)
- node.write(pdfannotation(specification.width,specification.height,0,d(),kn))
+ if optname then
+ field.opt[#field.opt+1] = optname
+ end
+ local width, height, depth = specification.width or 0, specification.height or 0, specification.depth
+ local box = hpack_node(pdfannotation_node(width,height,depth,d(),kn))
+ box.width, box.height, box.depth = width, height, depth -- redundant
+ return box
end
-function methods.line(name,specification,variant,extras)
- local field = fields[name]
- if variant == "copy" or variant == "clone" then
- logs.report("fields","todo: clones of text fields")
- end
- local kind = field.kind
- if not field.pobj then
- if trace_fields then
- logs.report("fields","using parent text '%s'",name)
+local function makelineparent(field,specification)
+ local text = pdfunicode(field.default)
+ local length = tonumber(specification.length or 0) or 0
+ local d = pdfdictionary {
+ Subtype = pdf_widget,
+ T = pdfunicode(specification.title),
+ F = fieldplus(specification),
+ Ff = fieldflag(specification),
+ OC = fieldlayer(specification),
+ DA = fieldsurrounding(specification),
+ AA = fieldactions(specification),
+ FT = pdf_tx,
+ Q = fieldalignment(specification),
+ MaxLen = length == 0 and 1000 or length,
+ DV = text,
+ V = text,
+ }
+ save_parent(field,specification,d)
+end
+
+local function makelinechild(name,specification)
+ local field, parent = clones[name], nil
+ if field then
+ parent = fields[field.parent]
+ if not parent.pobj then
+ if trace_fields then
+ report_fields("forcing parent text '%s'",parent.name)
+ end
+ makelineparent(parent,specification)
end
- if extras then
- enhance(specification,extras)
+ else
+ parent = fields[name]
+ field = parent
+ if not parent.pobj then
+ if trace_fields then
+ report_fields("using parent text '%s'",name)
+ end
+ makelineparent(parent,specification)
end
- local text = pdfunicode(field.default)
- local d = pdfdictionary {
- Subtype = pdf_widget,
- T = pdfunicode(specification.title),
- F = fieldplus(specification),
- Ff = fieldflag(specification),
- OC = fieldlayer(specification),
- MK = fieldsurrounding(specification), -- needed ?
- DA = fieldsurrounding(specification),
- AA = fieldactions(specification),
- FT = pdf_tx,
- Q = fieldalignment(specification),
- MaxLen = (specification.length == 0 and 1000) or specification.length,
- DV = text,
- V = text,
- }
- save_parent(field,specification,d)
- field.specification = specification
end
- specification = field.specification or { } -- todo: radio spec
if trace_fields then
- logs.report("fields","using child text '%s'",name)
+ report_fields("using child text '%s'",name)
end
local d = pdfdictionary {
Subtype = pdf_widget,
- Parent = pdfreference(field.pobj),
+ Parent = pdfreference(parent.pobj),
F = fieldplus(specification),
- DA = fieldattributes(specification),
OC = fieldlayer(specification),
- MK = fieldsurrounding(specification),
DA = fieldsurrounding(specification),
AA = fieldactions(specification),
+ MK = fieldrendering(specification),
Q = fieldalignment(specification),
}
- save_kid(field,specification,d)
+ return save_kid(parent,specification,d)
end
-function methods.text(name,specification,variant)
- methods.line(name,specification,variant,"MultiLine")
+function methods.line(name,specification)
+ return makelinechild(name,specification)
end
-function methods.choice(name,specification,variant,extras)
- local field = fields[name]
- if variant == "copy" or variant == "clone" then
- logs.report("fields","todo: clones of choice fields")
- end
- local kind = field.kind
- local d
- if not field.pobj then
- if trace_fields then
- logs.report("fields","using parent choice '%s'",name)
+function methods.text(name,specification)
+ return makelinechine(name,enhance(specification,"MultiLine"))
+end
+
+local function makechoiceparent(field,specification)
+ local d = pdfdictionary {
+ Subtype = pdf_widget,
+ T = pdfunicode(specification.title),
+ F = fieldplus(specification),
+ Ff = fieldflag(specification),
+ OC = fieldlayer(specification),
+ AA = fieldactions(specification),
+ FT = pdf_ch,
+ Opt = fieldoptions(field), -- todo
+ }
+ save_parent(field,specification,d)
+end
+
+local function makechoicechild(name,specification)
+ local field, parent = clones[name], nil
+ if field then
+ parent = fields[field.parent]
+ if not parent.pobj then
+ if trace_fields then
+ report_fields("forcing parent choice '%s'",parent.name)
+ end
+ makechoiceparent(parent,specification,extras)
end
- if extras then
- enhance(specification,extras)
+ else
+ parent = fields[name]
+ field = parent
+ if not parent.pobj then
+ if trace_fields then
+ report_fields("using parent choice '%s'",name)
+ end
+ makechoiceparent(parent,specification,extras)
end
- local d = pdfdictionary {
- Subtype = pdf_widget,
- T = pdfunicode(specification.title),
- F = fieldplus(specification),
- Ff = fieldflag(specification),
- OC = fieldlayer(specification),
- AA = fieldactions(specification),
- FT = pdf_ch,
- Opt = fieldoptions(field),
- }
- save_parent(field,specification,d)
- field.specification = specification
end
- specification = field.specification or { }
if trace_fields then
- logs.report("fields","using child choice '%s'",name)
+ report_fields("using child choice '%s'",name)
end
local d = pdfdictionary {
Subtype = pdf_widget,
- Parent = pdfreference(field.pobj),
+ Parent = pdfreference(parent.pobj),
F = fieldplus(specification),
- DA = fieldattributes(specification),
OC = fieldlayer(specification),
AA = fieldactions(specification),
}
- save_kid(field,specification,d)
+ return save_kid(parent,specification,d) -- do opt here
+end
+
+function methods.choice(name,specification)
+ return makechoicechild(name,specification)
end
-function methods.popup(name,specification,variant)
- methods.choice(name,specification,variant,"PopUp")
+function methods.popup(name,specification)
+ return makechoicechild(name,enhance(specification,"PopUp"))
end
-function methods.combo(name,specification,variant)
- methods.choice(name,specification,variant,"PopUp,Edit")
+
+function methods.combo(name,specification)
+ return makechoicechild(name,enhance(specification,"PopUp,Edit"))
end
--- Probably no default appearance needed for first kid and no javascripts for the
--- parent ... I will look into it when I have to make a complex document.
+local function makecheckparent(field,specification)
+ local d = pdfdictionary {
+ T = pdfunicode(specification.title),
+ F = fieldplus(specification),
+ Ff = fieldflag(specification),
+ OC = fieldlayer(specification),
+ AA = fieldactions(specification),
+ FT = pdf_btn,
+ V = fielddefault(field),
+ }
+ save_parent(field,specification,d,true)
+end
-function methods.check(name,specification,variant)
- -- no /Opt because (1) it's messy - see pdf spec, (2) it discouples kids and
- -- contrary to radio there is no way to associate then
- local field = fields[name]
- if variant == "copy" or variant == "clone" then
- logs.report("fields","todo: clones of check fields")
- end
- local kind = field.kind
- local appearance, default = fieldstates(field,true)
- if not field.pobj then
- if trace_fields then
- logs.report("fields","using parent check '%s'",name)
+local function makecheckchild(name,specification)
+ local field, parent = clones[name], nil
+ if field then
+ parent = fields[field.parent]
+ if not parent.pobj then
+ if trace_fields then
+ report_fields("forcing parent check '%s'",parent.name)
+ end
+ makecheckparent(parent,specification,extras)
+ end
+ else
+ parent = fields[name]
+ field = parent
+ if not parent.pobj then
+ if trace_fields then
+ report_fields("using parent check '%s'",name)
+ end
+ makecheckparent(parent,specification,extras)
end
- local d = pdfdictionary {
- Subtype = pdf_widget,
- T = pdfunicode(specification.title),
- F = fieldplus(specification),
- Ff = fieldflag(specification),
- OC = fieldlayer(specification),
- AA = fieldactions(specification),
- FT = pdf_btn,
- DV = default,
- V = default,
- AS = default,
- AP = appearance,
- H = pdf_n,
- }
- save_parent(field,specification,d)
- field.specification = specification
end
- specification = field.specification or { } -- todo: radio spec
if trace_fields then
- logs.report("fields","using child check '%s'",name)
+ report_fields("using child check '%s'",name)
end
local d = pdfdictionary {
Subtype = pdf_widget,
- Parent = pdfreference(field.pobj),
+ Parent = pdfreference(parent.pobj),
F = fieldplus(specification),
- DA = fieldattributes(specification),
OC = fieldlayer(specification),
AA = fieldactions(specification),
- DV = default,
- V = default,
- AS = default,
- AP = appearance,
H = pdf_n,
}
- save_kid(field,specification,d)
+ local fontsymbol = specification.fontsymbol
+ if fontsymbol and fontsymbol ~= "" then
+ specification.fontsymbol = todingbat(fontsymbol)
+ specification.fontstyle = "symbol"
+ specification.fontalternative = "dingbats"
+ d.DA = fieldsurrounding(specification)
+ d.MK = fieldrendering(specification)
+ return save_kid(parent,specification,d)
+ else
+ local appearance, default, value = fieldstates(field,true)
+ d.AS = default
+ d.AP = appearance
+ return save_kid(parent,specification,d,value)
+ end
end
-function methods.push(name,specification,variant)
- local field = fields[name]
- if variant == "copy" or variant == "clone" then
- logs.report("fields","todo: clones of push fields")
- end
- local kind = field.kind
- if not field.pobj then
- if trace_fields then
- logs.report("fields","using parent push '%s'",name)
+function methods.check(name,specification)
+ return makecheckchild(name,specification)
+end
+
+local function makepushparent(field,specification) -- check if we can share with the previous
+ local d = pdfdictionary {
+ Subtype = pdf_widget,
+ T = pdfunicode(specification.title),
+ F = fieldplus(specification),
+ Ff = fieldflag(specification),
+ OC = fieldlayer(specification),
+ AA = fieldactions(specification),
+ FT = pdf_btn,
+ AP = fieldappearances(field),
+ H = pdf_p,
+ }
+ save_parent(field,specification,d)
+end
+
+local function makepushchild(name,specification)
+ local field, parent = clones[name], nil
+ if field then
+ parent = fields[field.parent]
+ if not parent.pobj then
+ if trace_fields then
+ report_fields("forcing parent push '%s'",parent.name)
+ end
+ makepushparent(parent,specification)
+ end
+ else
+ parent = fields[name]
+ field = parent
+ if not parent.pobj then
+ if trace_fields then
+ report_fields("using parent push '%s'",name)
+ end
+ makepushparent(parent,specification)
end
- enhance(specification,"PushButton")
- local d = pdfdictionary {
- Subtype = pdf_widget,
- T = pdfunicode(specification.title),
- F = fieldplus(specification),
- Ff = fieldflag(specification),
- OC = fieldlayer(specification),
- AA = fieldactions(specification),
- FT = pdf_btn,
- AP = fieldappearances(field),
- H = pdf_p,
- }
- save_parent(field,specification,d)
- field.specification = specification
end
- specification = field.specification or { } -- todo: radio spec
if trace_fields then
- logs.report("fields","using child push '%s'",name)
+ report_fields("using child push '%s'",name)
end
+ local fontsymbol = specification.fontsymbol
local d = pdfdictionary {
Subtype = pdf_widget,
Parent = pdfreference(field.pobj),
F = fieldplus(specification),
- DA = fieldattributes(specification),
OC = fieldlayer(specification),
AA = fieldactions(specification),
- AP = fieldappearances(field),
H = pdf_p,
}
- save_kid(field,specification,d)
+ if fontsymbol and fontsymbol ~= "" then
+ specification.fontsymbol = todingbat(fontsymbol)
+ specification.fontstyle = "symbol"
+ specification.fontalternative = "dingbats"
+ d.DA = fieldsurrounding(specification)
+ d.MK = fieldrendering(specification)
+ else
+ d.AP = fieldappearances(field)
+ end
+ return save_kid(parent,specification,d)
+end
+
+function methods.push(name,specification)
+ return makepushchild(name,enhance(specification,"PushButton"))
+end
+
+local function makeradioparent(field,specification)
+ specification = enhance(specification,"Radio,RadiosInUnison")
+ local d = pdfdictionary {
+ T = field.name,
+ FT = pdf_btn,
+ F = fieldplus(specification),
+ Ff = fieldflag(specification),
+ H = pdf_n,
+ V = fielddefault(field),
+ }
+ save_parent(field,specification,d,true)
end
-function methods.sub(name,specification,variant)
- local field = radios[name] or fields[name] or clones[name] -- fields in case of a clone, maybe use dedicated clones
- local values
- if variant == "copy" or variant == "clone" then
- name = field.parent
- values = field.values -- clone only, copy has nil so same as parent
+local function makeradiochild(name,specification)
+ local field, parent = clones[name], nil
+ if field then
+ field = radios[field.parent]
+ parent = fields[field.parent]
+ if not parent.pobj then
+ if trace_fields then
+ report_fields("forcing parent radio '%s'",parent.name)
+ end
+ makeradioparent(parent,parent)
+ end
field = radios[name]
else
- values = field.values
- end
- local parent = fields[field.parent]
- if not parent then
- return
- end
- local appearance = fieldstates(field,name,values) -- we need to force the 'On' name
- local default = radiodefault(parent,field)
- if not parent.pobj then
- if trace_fields then
- logs.report("fields","using parent '%s' of radio '%s' with values '%s' and default '%s'",parent.name,name,parent.values or "?",parent.default or "?")
+ field = radios[name]
+ parent = fields[field.parent]
+ if not parent.pobj then
+ if trace_fields then
+ report_fields("using parent radio '%s'",name)
+ end
+ makeradioparent(parent,parent)
end
- local specification = parent.specification or { }
- -- enhance(specification,"Radio,RadiosInUnison")
- enhance(specification,"RadiosInUnison") -- maybe also PushButton as acrobat does
- local d = pdfdictionary {
- T = parent.name,
- FT = pdf_btn,
- Rect = pdf_no_rect,
- F = fieldplus(specification),
- Ff = fieldflag(specification),
- H = pdf_n,
- V = default,
- }
- save_parent(parent,specification,d)
end
if trace_fields then
- logs.report("fields","using child radio '%s' with values '%s'",name,values or "?")
+ report_fields("using child radio '%s' with values '%s' and default '%s'",name,field.values or "?",field.default or "?")
end
+ local fontsymbol = specification.fontsymbol
local d = pdfdictionary {
Subtype = pdf_widget,
Parent = pdfreference(parent.pobj),
F = fieldplus(specification),
- DA = fieldattributes(specification),
OC = fieldlayer(specification),
AA = fieldactions(specification),
- AS = default,
- AP = appearance,
H = pdf_n,
}
- save_kid(parent,specification,d)
+ if fontsymbol and fontsymbol ~= "" then
+ specification.fontsymbol = todingbat(fontsymbol)
+ specification.fontstyle = "symbol"
+ specification.fontalternative = "dingbats"
+ d.DA = fieldsurrounding(specification)
+ d.MK = fieldrendering(specification)
+ return save_kid(parent,specification,d)
+ else
+ local appearance, default, value = fieldstates(field,true) -- false is also ok
+ d.AS = default -- needed ?
+ d.AP = appearance
+ return save_kid(parent,specification,d,value)
+ end
+end
+
+function methods.sub(name,specification)
+ return makeradiochild(name,enhance(specification,"Radio,RadiosInUnison"))
end
diff --git a/Master/texmf-dist/tex/context/base/lpdf-fmt.lua b/Master/texmf-dist/tex/context/base/lpdf-fmt.lua
new file mode 100644
index 00000000000..017e28ebb23
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lpdf-fmt.lua
@@ -0,0 +1,758 @@
+if not modules then modules = { } end modules ['lpdf-fmt'] = {
+ version = 1.001,
+ comment = "companion to lpdf-ini.mkiv",
+ author = "Peter Rolf and Hans Hagen",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files",
+}
+
+-- Thanks to Luigi and Steffen for testing.
+
+-- context --directives="backend.format=PDF/X-1a:2001" --trackers=backend.format yourfile
+
+local trace_format = false trackers.register("backend.format", function(v) trace_format = v end)
+local trace_variables = false trackers.register("backend.variables", function(v) trace_variables = v end)
+
+local report_backend = logs.reporter("backend","profiles")
+
+local backends, lpdf = backends, lpdf
+
+local codeinjections = backends.pdf.codeinjections
+
+local variables = interfaces.variables
+local viewerlayers = attributes.viewerlayers
+local colors = attributes.colors
+local transparencies = attributes.transparencies
+
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfconstant = lpdf.constant
+local pdfreference = lpdf.reference
+local pdfflushobject = lpdf.flushobject
+local pdfstring = lpdf.string
+local pdfverbose = lpdf.verbose
+local pdfobject = lpdf.object
+
+local addtoinfo, injectxmpinfo, insertxmpinfo = lpdf.addtoinfo, lpdf.injectxmpinfo, lpdf.insertxmpinfo
+
+local lower, gmatch, format, find = string.lower, string.gmatch, string.format, string.find
+local concat, serialize = table.concat, table.serialize
+local settings_to_array, settings_to_hash = utilities.parsers.settings_to_array, utilities.parsers.settings_to_hash
+
+--[[
+ Comments by Peter:
+
+ output intent : only one profile per color space (and device class)
+ default color space : (theoretically) several profiles per color space possible
+
+ The default color space profiles define the current gamuts (part of/all the
+ colors we have in the document), while the output intent profile declares the
+ gamut of the output devices (the colors that we get normally a printer or
+ monitor).
+
+ Example:
+
+ I have two RGB pictures (both 'painted' in /DeviceRGB) and I declare sRGB as
+ default color space for one picture and AdobeRGB for the other. As output
+ intent I use ISO_coated_v2_eci.icc.
+
+ If I had more than one output intent profile for the combination CMYK/printer I
+ can't decide which one to use. But it is no problem to use several default color
+ space profiles for the same color space as it's just a different color
+ transformation. The relation between picture and profile is clear.
+]]--
+
+local channels = {
+ gray = 1,
+ grey = 1,
+ rgb = 3,
+ cmyk = 4,
+}
+
+local prefixes = {
+ gray = "DefaultGray",
+ grey = "DefaultGray",
+ rgb = "DefaultRGB",
+ cmyk = "DefaultCMYK",
+}
+
+local formatspecification, formatname = nil, nil
+
+-- * correspondent document wide flags (write once) needed for permission tests
+
+local formats = utilities.storage.allocate {
+ ["version"] = {
+ external_icc_profiles = 1.4, -- 'p' in name; URL reference of output intent
+ jbig2_compression = 1.4,
+ jpeg2000_compression = 1.5, -- not supported yet
+ nchannel_colorspace = 1.6, -- 'n' in name; n-channel colorspace support
+ open_prepress_interface = 1.3, -- 'g' in name; reference to external graphics
+ optional_content = 1.5,
+ transparency = 1.4,
+ object_compression = 1.5,
+ },
+ ["default"] = {
+ pdf_version = 1.7, -- todo: block tex primitive
+ format_name = "default",
+ xmp_file = "lpdf-pdx.xml",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ spot_colors = true,
+ calibrated_rgb_colors = true, -- unknown
+ cielab_colors = true, -- unknown
+ nchannel_colorspace = true, -- unknown
+ internal_icc_profiles = true, -- controls profile inclusion
+ external_icc_profiles = true, -- controls profile inclusion
+ include_intents = true,
+ open_prepress_interface = true, -- unknown
+ optional_content = true, -- todo: block at lua level
+ transparency = true, -- todo: block at lua level
+ jbig2_compression = true, -- todo: block at lua level
+ jpeg2000_compression = true, -- todo: block at lua level
+ inject_metadata = function()
+ -- nothing
+ end
+ },
+ ["pdf/x-1a:2001"] = {
+ pdf_version = 1.3,
+ format_name = "PDF/X-1a:2001",
+ xmp_file = "lpdf-pdx.xml",
+ gts_flag = "GTS_PDFX",
+ gray_scale = true,
+ cmyk_colors = true,
+ spot_colors = true,
+ internal_icc_profiles = true,
+ inject_metadata = function()
+ addtoinfo("GTS_PDFXVersion","PDF/X-1a:2001")
+ injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfxid='http://www.npes.org/pdfx/ns/id/'><pdfxid:GTS_PDFXVersion>PDF/X-1a:2001</pdfxid:GTS_PDFXVersion></rdf:Description>",false)
+ end
+ },
+ ["pdf/x-1a:2003"] = {
+ pdf_version = 1.4,
+ format_name = "PDF/X-1a:2003",
+ xmp_file = "lpdf-pdx.xml",
+ gts_flag = "GTS_PDFX",
+ gray_scale = true,
+ cmyk_colors = true,
+ spot_colors = true,
+ internal_icc_profiles = true,
+ inject_metadata = function()
+ addtoinfo("GTS_PDFXVersion","PDF/X-1a:2003")
+ injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfxid='http://www.npes.org/pdfx/ns/id/'><pdfxid:GTS_PDFXVersion>PDF/X-1a:2003</pdfxid:GTS_PDFXVersion></rdf:Description>",false)
+ end
+ },
+ ["pdf/x-3:2002"] = {
+ pdf_version = 1.3,
+ format_name = "PDF/X-3:2002",
+ xmp_file = "lpdf-pdx.xml",
+ gts_flag = "GTS_PDFX",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ calibrated_rgb_colors = true,
+ spot_colors = true,
+ cielab_colors = true,
+ internal_icc_profiles = true,
+ include_intents = true,
+ inject_metadata = function()
+ addtoinfo("GTS_PDFXVersion","PDF/X-3:2002")
+ end
+ },
+ ["pdf/x-3:2003"] = {
+ pdf_version = 1.4,
+ format_name = "PDF/X-3:2003",
+ xmp_file = "lpdf-pdx.xml",
+ gts_flag = "GTS_PDFX",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ calibrated_rgb_colors = true,
+ spot_colors = true,
+ cielab_colors = true,
+ internal_icc_profiles = true,
+ include_intents = true,
+ jbig2_compression = true,
+ inject_metadata = function()
+ addtoinfo("GTS_PDFXVersion","PDF/X-3:2003")
+ end
+ },
+ ["pdf/x-4"] = {
+ pdf_version = 1.6,
+ format_name = "PDF/X-4",
+ xmp_file = "lpdf-pdx.xml",
+ gts_flag = "GTS_PDFX",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ calibrated_rgb_colors = true,
+ spot_colors = true,
+ cielab_colors = true,
+ internal_icc_profiles = true,
+ include_intents = true,
+ optional_content = true,
+ transparency = true,
+ jbig2_compression = true,
+ jpeg2000_compression = true,
+ object_compression = true,
+ inject_metadata = function()
+ injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfxid='http://www.npes.org/pdfx/ns/id/'><pdfxid:GTS_PDFXVersion>PDF/X-4</pdfxid:GTS_PDFXVersion></rdf:Description>",false)
+ insertxmpinfo("xml://rdf:Description/xmpMM:InstanceID","<xmpMM:VersionID>1</xmpMM:VersionID>",false)
+ insertxmpinfo("xml://rdf:Description/xmpMM:InstanceID","<xmpMM:RenditionClass>default</xmpMM:RenditonClass>",false)
+ end
+ },
+ ["pdf/x-4p"] = {
+ pdf_version = 1.6,
+ format_name = "PDF/X-4p",
+ xmp_file = "lpdf-pdx.xml",
+ gts_flag = "GTS_PDFX",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ calibrated_rgb_colors = true,
+ spot_colors = true,
+ cielab_colors = true,
+ internal_icc_profiles = true,
+ external_icc_profiles = true,
+ include_intents = true,
+ optional_content = true,
+ transparency = true,
+ jbig2_compression = true,
+ jpeg2000_compression = true,
+ object_compression = true,
+ inject_metadata = function()
+ injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfxid='http://www.npes.org/pdfx/ns/id/'><pdfxid:GTS_PDFXVersion>PDF/X-4p</pdfxid:GTS_PDFXVersion></rdf:Description>",false)
+ insertxmpinfo("xml://rdf:Description/xmpMM:InstanceID","<xmpMM:VersionID>1</xmpMM:VersionID>",false)
+ insertxmpinfo("xml://rdf:Description/xmpMM:InstanceID","<xmpMM:RenditionClass>default</xmpMM:RenditonClass>",false)
+ end
+ },
+ ["pdf/x-5g"] = {
+ pdf_version = 1.6,
+ format_name = "PDF/X-5g",
+ xmp_file = "lpdf-pdx.xml",
+ gts_flag = "GTS_PDFX",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ calibrated_rgb_colors = true,
+ spot_colors = true,
+ cielab_colors = true,
+ internal_icc_profiles = true,
+ include_intents = true,
+ open_prepress_interface = true,
+ optional_content = true,
+ transparency = true,
+ jbig2_compression = true,
+ jpeg2000_compression = true,
+ object_compression = true,
+ inject_metadata = function()
+ -- todo
+ end
+ },
+ ["pdf/x-5pg"] = {
+ pdf_version = 1.6,
+ format_name = "PDF/X-5pg",
+ xmp_file = "lpdf-pdx.xml",
+ gts_flag = "GTS_PDFX",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ calibrated_rgb_colors = true,
+ spot_colors = true,
+ cielab_colors = true,
+ internal_icc_profiles = true,
+ external_icc_profiles = true,
+ include_intents = true,
+ open_prepress_interface = true,
+ optional_content = true,
+ transparency = true,
+ jbig2_compression = true,
+ jpeg2000_compression = true,
+ object_compression = true,
+ inject_metadata = function()
+ -- todo
+ end
+ },
+ ["pdf/x-5n"] = {
+ pdf_version = 1.6,
+ format_name = "PDF/X-5n",
+ xmp_file = "lpdf-pdx.xml",
+ gts_flag = "GTS_PDFX",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ calibrated_rgb_colors = true,
+ spot_colors = true,
+ cielab_colors = true,
+ internal_icc_profiles = true,
+ include_intents = true,
+ optional_content = true,
+ transparency = true,
+ jbig2_compression = true,
+ jpeg2000_compression = true,
+ nchannel_colorspace = true,
+ object_compression = true,
+ inject_metadata = function()
+ -- todo
+ end
+ },
+ ["pdf/a-1a:2005"] = {
+ pdf_version = 1.4,
+ format_name = "pdf/a-1a:2005",
+ xmp_file = "lpdf-pda.xml",
+ gts_flag = "GTS_PDFA1",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ spot_colors = true,
+ calibrated_rgb_colors = true, -- unknown
+ cielab_colors = true, -- unknown
+ include_intents = true,
+ forms = true, -- NEW; forms are allowed (with limitations); no JS, other restrictions are unknown (TODO)
+ tagging = true, -- NEW; the only difference to PDF/A-1b
+ internal_icc_profiles = true,
+ inject_metadata = function()
+ injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfaid='http://www.aiim.org/pdfa/ns/id/'><pdfaid:part>1</pdfaid:part><pdfaid:conformance>A</pdfaid:conformance></rdf:Description>",false)
+ end
+ },
+ ["pdf/a-1b:2005"] = {
+ pdf_version = 1.4,
+ format_name = "pdf/a-1b:2005",
+ xmp_file = "lpdf-pda.xml",
+ gts_flag = "GTS_PDFA1",
+ gray_scale = true,
+ cmyk_colors = true,
+ rgb_colors = true,
+ spot_colors = true,
+ calibrated_rgb_colors = true, -- unknown
+ cielab_colors = true, -- unknown
+ include_intents = true,
+ forms = true,
+ internal_icc_profiles = true,
+ inject_metadata = function()
+ injectxmpinfo("xml://rdf:RDF","<rdf:Description rdf:about='' xmlns:pdfaid='http://www.aiim.org/pdfa/ns/id/'><pdfaid:part>1</pdfaid:part><pdfaid:conformance>B</pdfaid:conformance></rdf:Description>",false)
+ end
+ },
+}
+
+lpdf.formats = formats -- it does not hurt to have this one visible
+
+local filenames = {
+ "colorprofiles.xml",
+ "colorprofiles.lua",
+}
+
+local function locatefile(filename)
+ local fullname = resolvers.findfile(filename,"icc")
+ if not fullname or fullname == "" then
+ fullname = resolvers.finders.byscheme("loc",filename) -- could be specific to the project
+ end
+ return fullname or ""
+end
+
+local function loadprofile(name,filename)
+ local profile = false
+ local databases = filename and filename ~= "" and settings_to_array(filename) or filenames
+ for i=1,#databases do
+ local filename = locatefile(databases[i])
+ if filename and filename ~= "" then
+ local suffix = file.extname(filename)
+ local lname = lower(name)
+ if suffix == "xml" then
+ local xmldata = xml.load(filename) -- no need for caching it
+ if xmldata then
+ profile = xml.filter(xmldata,format('xml://profiles/profile/(info|filename)[lower(text())=="%s"]/../table()',lname))
+ end
+ elseif suffix == "lua" then
+ local luadata = loadfile(filename)
+ luadata = ludata and luadata()
+ if luadata then
+ profile = luadata[name] or luadata[lname] -- hashed
+ if not profile then
+ for i=1,#luadata do
+ local li = luadata[i]
+ if lower(li.info) == lname then -- indexed
+ profile = li
+ break
+ end
+ end
+ end
+ end
+ end
+ if profile then
+ if next(profile) then
+ report_backend("profile specification '%s' loaded from '%s'",name,filename)
+ return profile
+ elseif trace_format then
+ report_backend("profile specification '%s' loaded from '%s' but empty",name,filename)
+ end
+ return false
+ end
+ end
+ end
+ report_backend("profile specification '%s' not found in '%s'",name,concat(filenames, ", "))
+end
+
+local function urls(url)
+ if not url or url == "" then
+ return nil
+ else
+ local u = pdfarray()
+ for url in gmatch(url,"([^, ]+)") do
+ if find(url,"^http") then
+ u[#u+1] = pdfdictionary {
+ FS = pdfconstant("URL"),
+ F = pdfstring(url),
+ }
+ end
+ end
+ return u
+ end
+end
+
+local function profilename(filename)
+ return lower(file.basename(filename))
+end
+
+local internalprofiles = { }
+
+local function handleinternalprofile(s,include)
+ local filename, colorspace = s.filename or "", s.colorspace or ""
+ if filename == "" or colorspace == "" then
+ report_backend("error in internal profile specification: %s",serialize(s,false))
+ else
+ local tag = profilename(filename)
+ local profile = internalprofiles[tag]
+ if not profile then
+ local colorspace = lower(colorspace)
+ if include then
+ -- local fullname = resolvers.findctxfile(filename) or ""
+ local fullname = locatefile(filename)
+ local channel = channels[colorspace] or nil
+ if fullname == "" then
+ report_backend("error, couldn't locate profile '%s'",filename)
+ elseif not channel then
+ report_backend("error, couldn't resolve channel entry for colorspace '%s'",colorspace)
+ else
+ local a = pdfdictionary { N = channel }
+ profile = pdfobject { -- does a flush too
+ compresslevel = 0,
+ immediate = true, -- !
+ type = "stream",
+ file = fullname,
+ attr = a(),
+ }
+ internalprofiles[tag] = profile
+ if trace_format then
+ report_backend("including '%s' color profile from '%s'",colorspace,fullname)
+ end
+ end
+ else
+ internalprofiles[tag] = true
+ if trace_format then
+ report_backend("not including '%s' color profile '%s'",colorspace,filename)
+ end
+ end
+ end
+ return profile
+ end
+end
+
+local externalprofiles = { }
+
+local function handleexternalprofile(s,include) -- specification (include ignored here)
+ local name, url, filename, checksum, version, colorspace =
+ s.info or s.filename or "", s.url or "", s.filename or "", s.checksum or "", s.version or "", s.colorspace or ""
+ if false then -- somehow leads to invalid pdf
+ local iccprofile = colors.iccprofile(filename)
+ if iccprofile then
+ name = name ~= "" and name or iccprofile.tags.desc.cleaned or ""
+ url = url ~= "" and url or iccprofile.tags.dmnd.cleaned or ""
+ checksum = checksum ~= "" and checksum or file.checksum(iccprofile.fullname) or ""
+ version = version ~= "" and version or iccprofile.header.version or ""
+ colorspace = colorspace ~= "" and colorspace or iccprofile.header.colorspace or ""
+ end
+ -- table.print(iccprofile)
+ end
+ if name == "" or url == "" or checksum == "" or version == "" or colorspace == "" or filename == "" then
+ local profile = handleinternalprofile(s)
+ if profile then
+ report_backend("incomplete external profile specification, falling back to internal")
+ else
+ report_backend("error in external profile specification: %s",serialize(s,false))
+ end
+ else
+ local tag = profilename(filename)
+ local profile = externalprofiles[tag]
+ if not profile then
+ local d = pdfdictionary {
+ ProfileName = name, -- not file name!
+ ProfileCS = colorspace,
+ URLs = urls(url), -- array containing at least one URL
+ CheckSum = pdfverbose { "<", lower(checksum), ">" }, -- 16byte MD5 hash
+ ICCVersion = pdfverbose { "<", version, ">" }, -- bytes 8..11 from the header of the ICC profile, as a hex string
+ }
+ profile = pdfflushobject(d)
+ externalprofiles[tag] = profile
+ end
+ return profile
+ end
+end
+
+local loadeddefaults = { }
+
+local function handledefaultprofile(s,spec) -- specification
+ local filename, colorspace = s.filename or "", lower(s.colorspace or "")
+ if filename == "" or colorspace == "" then
+ report_backend("error in default profile specification: %s",serialize(s,false))
+ elseif not loadeddefaults[colorspace] then
+ local tag = profilename(filename)
+ local n = internalprofiles[tag] -- or externalprofiles[tag]
+ if n == true then -- not internalized
+ report_backend("no default profile '%s' for colorspace '%s'",filename,colorspace)
+ elseif n then
+ local a = pdfarray {
+ pdfconstant("ICCBased"),
+ pdfreference(n),
+ }
+ -- used in page /Resources, so this must be inserted at runtime
+ lpdf.adddocumentcolorspace(prefixes[colorspace],pdfreference(pdfflushobject(a)))
+ loadeddefaults[colorspace] = true
+ report_backend("setting '%s' as default '%s' color space",filename,colorspace)
+ else
+ report_backend("no default profile '%s' for colorspace '%s'",filename,colorspace)
+ end
+ elseif trace_format then
+ report_backend("a default '%s' colorspace is already in use",colorspace)
+ end
+end
+
+local loadedintents, intents = { }, pdfarray()
+
+local function handleoutputintent(s,spec)
+ local name, url, filename, id, outputcondition, info = s.info or s.filename or "", s.url or "", s.filename or "", s.id or "", s.outputcondition or "", s.info or ""
+ if name == "" or id == "" then
+ report_backend("error in output intent specification: %s",serialize(s,false))
+ elseif not loadedintents[name] then
+ local tag = profilename(filename)
+ local internal, external = internalprofiles[tag], externalprofiles[tag]
+ if internal or external then
+ local d = {
+ Type = pdfconstant("OutputIntent"),
+ S = pdfconstant(spec.gts_flag or "GTS_PDFX"),
+ OutputConditionIdentifier = id,
+ RegistryName = url,
+ OutputCondition = outputcondition,
+ Info = info,
+ }
+ if internal and internal ~= true then
+ d.DestOutputProfile = pdfreference(internal)
+ elseif external and external ~= true then
+ d.DestOutputProfileRef = pdfreference(external)
+ else
+ report_backend("omitting reference to profile for intent '%s'",name)
+ end
+ intents[#intents+1] = pdfreference(pdfflushobject(pdfdictionary(d)))
+ if trace_format then
+ report_backend("setting output intent to '%s' with id '%s' (entry %s)",name,id,#intents)
+ end
+ else
+ report_backend("invalid output intent '%s'",name)
+ end
+ loadedintents[name] = true
+ elseif trace_format then
+ report_backend("an output intent with name '%s' is already in use",name)
+ end
+end
+
+local function handleiccprofile(message,spec,name,filename,how,options,alwaysinclude,gts_flag)
+ if name and name ~= "" then
+ local list = settings_to_array(name)
+ for i=1,#list do
+ local name = list[i]
+ local profile = loadprofile(name,filename)
+ if trace_format then
+ report_backend("handling %s '%s'",message,name)
+ end
+ if profile then
+ if formatspecification.cmyk_colors then
+ profile.colorspace = profile.colorspace or "CMYK"
+ else
+ profile.colorspace = profile.colorspace or "RGB"
+ end
+ local external = formatspecification.external_icc_profiles
+ local internal = formatspecification.internal_icc_profiles
+ local include = formatspecification.include_intents
+ local always, never = options[variables.always], options[variables.never]
+ if always or alwaysinclude then
+ if trace_format then
+ report_backend("forcing internal profiles") -- can make preflight unhappy
+ end
+ -- internal, external = true, false
+ internal, external = not never, false
+ elseif never then
+ if trace_format then
+ report_backend("forcing external profiles") -- can make preflight unhappy
+ end
+ internal, external = false, true
+ end
+ if external then
+ if trace_format then
+ report_backend("handling external profiles cf. '%s'",name)
+ end
+ handleexternalprofile(profile,false)
+ else
+ if trace_format then
+ report_backend("handling internal profiles cf. '%s'",name)
+ end
+ if internal then
+ handleinternalprofile(profile,always or include)
+ else
+ report_backend("no profile inclusion for '%s'",formatname)
+ end
+ end
+ how(profile,spec)
+ elseif trace_format then
+ report_backend("unknown profile '%s'",name)
+ end
+ end
+ end
+end
+
+local function flushoutputintents()
+ if #intents > 0 then
+ lpdf.addtocatalog("OutputIntents",pdfreference(pdfflushobject(intents)))
+ end
+end
+
+lpdf.registerdocumentfinalizer(flushoutputintents,2,"output intents")
+
+function codeinjections.setformat(s)
+ local format, level, profile, intent, option, filename =
+ s.format or "", s.level or "", s.profile or "", s.intent or "", s.option or "", s.file or ""
+ if format == "" then
+ -- we ignore this as we hook it in \everysetupbackend
+ else
+ local spec = formats[lower(format)]
+ if spec then
+ formatspecification, formatname = spec, spec.format_name
+ level = level and tonumber(level)
+ report_backend("setting format to '%s'",formatname)
+ local xmp_file = formatspecification.xmp_file or ""
+ if xmp_file == "" then
+ -- weird error
+ else
+ codeinjections.setxmpfile(xmp_file)
+ end
+ local pdf_version, inject_metadata = spec.pdf_version * 10, spec.inject_metadata
+ local majorversion, minorversion = math.div(pdf_version,10), math.mod(pdf_version,10)
+ local objectcompression = spec.object_compression and pdf_version >= 15
+ local compresslevel = level or tex.pdfcompresslevel -- keep default
+ local objectcompresslevel = (objectcompression and (level or tex.pdfobjcompresslevel)) or 0
+ tex.pdfcompresslevel, tex.pdfobjcompresslevel = compresslevel, objectcompresslevel
+ tex.pdfmajorversion, tex.pdfminorversion = majorversion, minorversion
+ if objectcompression then
+ report_backend("forcing pdf version %s.%s, compression level %s, object compression level %s",
+ majorversion,minorversion,compresslevel,objectcompresslevel)
+ elseif compresslevel > 0 then
+ report_backend("forcing pdf version %s.%s, compression level %s, object compression disabled",
+ majorversion,minorversion,compresslevel)
+ else
+ report_backend("forcing pdf version %s.%s, compression disabled",
+ majorversion,minorversion)
+ end
+ --
+ -- context.setupcolors { -- not this way
+ -- cmyk = spec.cmyk_colors and variables.yes or variables.no,
+ -- rgb = spec.rgb_colors and variables.yes or variables.no,
+ -- }
+ --
+ colors.forcesupport(
+ spec.gray_scale or false,
+ spec.rgb_colors or false,
+ spec.cmyk_colors or false,
+ spec.spot_colors or false,
+ spec.nchannel_colorspace or false
+ )
+ transparencies.forcesupport(
+ spec.transparency or false
+ )
+ viewerlayers.forcesupport(
+ spec.optional_content or false
+ )
+ viewerlayers.setfeatures(
+ spec.has_order or false -- new
+ )
+ --
+ -- spec.jbig2_compression : todo, block in image inclusion
+ -- spec.jpeg2000_compression : todo, block in image inclusion
+ --
+ if type(inject_metadata) == "function" then
+ inject_metadata()
+ end
+ local options = settings_to_hash(option)
+ handleiccprofile("color profile",spec,profile,filename,handledefaultprofile,options,true)
+ handleiccprofile("output intent",spec,intent,filename,handleoutputintent,options,false)
+ if trace_variables then
+ for k, v in table.sortedhash(formats.default) do
+ local v = formatspecification[k]
+ if type(v) ~= "function" then
+ report_backend("%s = %s",k,tostring(v or false))
+ end
+ end
+ end
+ function codeinjections.setformat(noname)
+ report_backend("error, format is already set to '%s', ignoring '%s'",formatname,noname.format)
+ end
+ else
+ report_backend("error, format '%s' is not supported",format)
+ end
+ end
+end
+
+directives.register("backend.format", function(v) -- table !
+ local tv = type(v)
+ if tv == "table" then
+ codeinjections.setformat(v)
+ elseif tv == "string" then
+ codeinjections.setformat { format = v }
+ end
+end)
+
+function commands.setformat(s)
+ codeinjections.setformat(s)
+end
+
+function codeinjections.getformatoption(key)
+ return formatspecification and formatspecification[key]
+end
+
+function codeinjections.supportedformats()
+ local t = { }
+ for k, v in table.sortedhash(formats) do
+ if find(k,"pdf") then
+ t[#t+1] = k
+ end
+ end
+ return t
+end
+
+--~ The following is somewhat cleaner but then we need to flag that there are
+--~ color spaces set so that the page flusher does not optimize the (at that
+--~ moment) still empty array away. So, next(d_colorspaces) should then become
+--~ a different test, i.e. also on flag. I'll add that when we need more forward
+--~ referencing.
+--~
+--~ local function embedprofile = handledefaultprofile
+--~
+--~ local function flushembeddedprofiles()
+--~ for colorspace, filename in next, defaults do
+--~ embedprofile(colorspace,filename)
+--~ end
+--~ end
+--~
+--~ local function handledefaultprofile(s)
+--~ defaults[lower(s.colorspace)] = s.filename
+--~ end
+--~
+--~ lpdf.registerdocumentfinalizer(flushembeddedprofiles,1,"embedded color profiles")
diff --git a/Master/texmf-dist/tex/context/base/lpdf-grp.lua b/Master/texmf-dist/tex/context/base/lpdf-grp.lua
index ad01e4d4f5a..2f7684a4da8 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-grp.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-grp.lua
@@ -8,6 +8,14 @@ if not modules then modules = { } end modules ['lpdf-grp'] = {
local format = string.format
+local backends, lpdf = backends, lpdf
+
+local nodeinjections = backends.pdf.nodeinjections
+
+local colors = attributes.colors
+local basepoints = number.dimenfactors["bp"]
+local inches = number.dimenfactors["in"]
+
local nodeinjections = backends.pdf.nodeinjections
local codeinjections = backends.pdf.codeinjections
local registrations = backends.pdf.registrations
@@ -15,10 +23,17 @@ local registrations = backends.pdf.registrations
local pdfdictionary = lpdf.dictionary
local pdfarray = lpdf.array
local pdfconstant = lpdf.constant
+local pdfboolean = lpdf.boolean
local pdfreference = lpdf.reference
local pdfflushobject = lpdf.flushobject
-local function shade(stype,name,domain,color_a,color_b,n,colorspace,coordinates)
+-- can also be done indirectly:
+--
+-- 12 : << /AntiAlias false /ColorSpace 8 0 R /Coords [ 0.0 0.0 1.0 0.0 ] /Domain [ 0.0 1.0 ] /Extend [ true true ] /Function 22 0 R /ShadingType 2 >>
+-- 22 : << /Bounds [ ] /Domain [ 0.0 1.0 ] /Encode [ 0.0 1.0 ] /FunctionType 3 /Functions [ 31 0 R ] >>
+-- 31 : << /C0 [ 1.0 0.0 ] /C1 [ 0.0 1.0 ] /Domain [ 0.0 1.0 ] /FunctionType 2 /N 1.0 >>
+
+local function shade(stype,name,domain,color_a,color_b,n,colorspace,coordinates,separation)
local f = pdfdictionary {
FunctionType = 2,
Domain = pdfarray(domain), -- domain is actually a string
@@ -26,22 +41,24 @@ local function shade(stype,name,domain,color_a,color_b,n,colorspace,coordinates)
C1 = pdfarray(color_b),
N = tonumber(n),
}
+ separation = separation and registrations.getspotcolorreference(separation)
local s = pdfdictionary {
ShadingType = stype,
- ColorSpace = pdfconstant(colorspace),
+ ColorSpace = separation and pdfreference(separation) or pdfconstant(colorspace),
Function = pdfreference(pdfflushobject(f)),
Coords = pdfarray(coordinates),
Extend = pdfarray { true, true },
+ AntiAlias = pdfboolean(true),
}
lpdf.adddocumentshade(name,pdfreference(pdfflushobject(s)))
end
-function lpdf.circularshade(name,domain,color_a,color_b,n,colorspace,coordinates)
- shade(3,name,domain,color_a,color_b,n,colorspace,coordinates)
+function lpdf.circularshade(name,domain,color_a,color_b,n,colorspace,coordinates,separation)
+ shade(3,name,domain,color_a,color_b,n,colorspace,coordinates,separation)
end
-function lpdf.linearshade(name,domain,color_a,color_b,n,colorspace,coordinates)
- shade(2,name,domain,color_a,color_b,n,colorspace,coordinates)
+function lpdf.linearshade(name,domain,color_a,color_b,n,colorspace,coordinates,separation)
+ shade(2,name,domain,color_a,color_b,n,colorspace,coordinates,separation)
end
function lpdf.colorspec(model,ca,default)
@@ -66,3 +83,68 @@ function lpdf.colorspec(model,ca,default)
return default
end
end
+
+-- inline bitmaps but xform'd
+--
+-- we could derive the colorspace if we strip the data
+-- and divide by x*y
+
+local template = "q BI %s ID %s > EI Q"
+local factor = 72/300
+
+function nodeinjections.injectbitmap(t)
+ -- encoding is ascii hex, no checking here
+ local xresolution, yresolution = t.xresolution or 0, t.yresolution or 0
+ if xresolution == 0 or yresolution == 0 then
+ return -- fatal error
+ end
+ local colorspace = t.colorspace
+ if colorspace ~= "rgb" and colorspace ~= "cmyk" and colorspace ~= "gray" then
+ -- not that efficient but ok
+ local d = string.gsub(t.data,"[^0-9a-f]","")
+ local b = math.round(#d / (xresolution * yresolution))
+ if b == 2 then
+ colorspace = "gray"
+ elseif b == 6 then
+ colorspace = "rgb"
+ elseif b == 8 then
+ colorspace = "cmyk"
+ end
+ end
+ if colorspace == "gray" then
+ colorspace = pdfconstant("DeviceGray")
+ elseif colorspace == "rgb" then
+ colorspace = pdfconstant("DeviceRGB")
+ elseif colorspace == "cmyk" then
+ colorspace = pdfconstant("DeviceCMYK")
+ else
+ return -- fatal error
+ end
+ local d = pdfdictionary {
+ W = xresolution,
+ H = yresolution,
+ CS = colorspace,
+ BPC = 8,
+ F = pdfconstant("AHx"),
+ }
+ -- for some reasons it only works well if we take a 1bp boundingbox
+ local urx, ury = 1/basepoints, 1/basepoints
+ -- urx = (xresolution/300)/basepoints
+ -- ury = (yresolution/300)/basepoints
+ local width, height = t.width or 0, t.height or 0
+ if width == 0 and height == 0 then
+ width = factor * xresolution / basepoints
+ height = factor * yresolution / basepoints
+ elseif width == 0 then
+ width = height * xresolution / yresolution
+ elseif height == 0 then
+ height = width * yresolution / xresolution
+ end
+ local image = img.new {
+ stream = format(template,d(),t.data),
+ width = width,
+ height = height,
+ bbox = { 0, 0, urx, ury },
+ }
+ return img.node(image)
+end
diff --git a/Master/texmf-dist/tex/context/base/lpdf-ini.lua b/Master/texmf-dist/tex/context/base/lpdf-ini.lua
index e0ffd40521b..74ecb36de74 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-ini.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-ini.lua
@@ -9,33 +9,54 @@ if not modules then modules = { } end modules ['lpdf-ini'] = {
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 utfvalues = string.utfvalues
-local texwrite, texset, texsprint, ctxcatcodes = tex.write, tex.set, tex.sprint, tex.ctxcatcodes
+local texset = tex.set
local sind, cosd = math.sind, math.cosd
local lpegmatch = lpeg.match
-local pdfreserveobj = pdf and pdf.reserveobj or function() return 1 end -- for testing
-local pdfimmediateobj = pdf and pdf.immediateobj or function() return 2 end -- for testing
+--~ local pdfreserveobject = pdf and pdf.reserveobj or function() return 1 end -- for testing
+--~ local pdfimmediateobject = pdf and pdf.immediateobj or function() return 2 end -- for testing
+
+local pdfreserveobject = pdf.reserveobj
+local pdfimmediateobject = pdf.immediateobj
+local pdfdeferredobject = pdf.obj
+local pdfreferenceobject = pdf.refobj
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)
local trace_objects = false trackers.register("backend.objects", function(v) trace_objects = v end)
local trace_detail = false trackers.register("backend.detail", function(v) trace_detail = v end)
-lpdf = lpdf or { }
+local report_objects = logs.reporter("backend","objects")
+local report_finalizing = logs.reporter("backend","finalizing")
+
+local backends, context = backends, context
+
+backends.pdf = backends.pdf or {
+ comment = "backend for directly generating pdf output",
+ nodeinjections = { },
+ codeinjections = { },
+ registrations = { },
+ tables = { },
+}
+
+lpdf = lpdf or { }
+local lpdf = lpdf
local function tosixteen(str)
if not str or str == "" then
- return "()"
+ return "<feff>" -- not () as we want an indication that it's unicode
else
- local r = { "<feff" }
+ local r, n = { "<feff" }, 1
for b in utfvalues(str) do
+ n = n + 1
if b < 0x10000 then
- r[#r+1] = format("%04x",b)
+ r[n] = format("%04x",b)
else
- r[#r+1] = format("%04x%04x",b/1024+0xD800,b%1024+0xDC00)
+ r[n] = format("%04x%04x",b/1024+0xD800,b%1024+0xDC00)
end
end
- r[#r+1] = ">"
+ n = n + 1
+ r[n] = ">"
return concat(r)
end
end
@@ -72,12 +93,12 @@ end
lpdf.toeight = toeight
---~ local escaped = lpeg.Cs((lpeg.S("\0\t\n\r\f ()[]{}/%")/"#" + lpeg.P(1))^0)
---~
+--~ 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
local function merge_t(a,b)
@@ -97,24 +118,25 @@ tostring_d = function(t,contentonly,key)
return "<< >>"
end
else
- local r = { }
+ local r, rn = { }, 0
for k, v in next, t do
+ rn = rn + 1
local tv = type(v)
if tv == "string" then
- r[#r+1] = format("/%s %s",k,toeight(v))
+ r[rn] = format("/%s %s",k,toeight(v))
elseif tv == "unicode" then
- r[#r+1] = format("/%s %s",k,tosixteen(v))
+ r[rn] = format("/%s %s",k,tosixteen(v))
elseif tv == "table" then
local mv = getmetatable(v)
if mv and mv.__lpdftype then
- r[#r+1] = format("/%s %s",k,tostring(v))
+ r[rn] = format("/%s %s",k,tostring(v))
elseif v[1] then
- r[#r+1] = format("/%s %s",k,tostring_a(v))
+ r[rn] = format("/%s %s",k,tostring_a(v))
else
- r[#r+1] = format("/%s %s",k,tostring_d(v))
+ r[rn] = format("/%s %s",k,tostring_d(v))
end
else
- r[#r+1] = format("/%s %s",k,tostring(v))
+ r[rn] = format("/%s %s",k,tostring(v))
end
end
if contentonly then
@@ -128,7 +150,8 @@ tostring_d = function(t,contentonly,key)
end
tostring_a = function(t,contentonly,key)
- if #t == 0 then
+ local tn = #t
+ if tn == 0 then
if contentonly then
return ""
else
@@ -136,24 +159,25 @@ tostring_a = function(t,contentonly,key)
end
else
local r = { }
- for k, v in next, t do
+ for k=1,tn do
+ local v = t[k]
local tv = type(v)
if tv == "string" then
- r[#r+1] = toeight(v)
+ r[k] = toeight(v)
elseif tv == "unicode" then
- r[#r+1] = tosixteen(v)
+ r[k] = tosixteen(v)
elseif tv == "table" then
local mv = getmetatable(v)
local mt = mv and mv.__lpdftype
if mt then
- r[#r+1] = tostring(v)
+ r[k] = tostring(v)
elseif v[1] then
- r[#r+1] = tostring_a(v)
+ r[k] = tostring_a(v)
else
- r[#r+1] = tostring_d(v)
+ r[k] = tostring_d(v)
end
else
- r[#r+1] = tostring(v)
+ r[k] = tostring(v)
end
end
if contentonly then
@@ -174,7 +198,7 @@ local tostring_c = function(t) return t[1] end -- already prefixed (h
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) return t[1] .. " 0 R" 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]
@@ -185,18 +209,18 @@ 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,key) end -- the call is experimental
-local function value_a(t) return tostring_a(t,true,key) 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] end -- the call is experimental
-local function value_v() return t[1] end -- the call is experimental
+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 add_x(t,k,v) rawset(t,k,tostring(v)) end
@@ -305,7 +329,7 @@ local function pdfverbose(t) -- maybe check for type
return setmetatable({ t or "" },mt_v)
end
-lpdf.stream = pdfstream
+lpdf.stream = pdfstream -- THIS WILL PROBABLY CHANGE
lpdf.dictionary = pdfdictionary
lpdf.array = pdfarray
lpdf.string = pdfstring
@@ -329,55 +353,91 @@ lpdf.verbose = pdfverbose
local names, cache = { }, { }
function lpdf.reserveobject(name)
- local r = pdfreserveobj()
- if name then
- names[name] = r
- if trace_objects then
- logs.report("backends", "reserving object number %s under name '%s'",r,name)
+ if name == "annot" then
+ -- catch misuse
+ return pdfreserveobject("annot")
+ else
+ local r = pdfreserveobject()
+ if name then
+ names[name] = r
+ if trace_objects then
+ report_objects("reserving number %s under name '%s'",r,name)
+ end
+ elseif trace_objects then
+ report_objects("reserving number %s",r)
end
- elseif trace_objects then
- logs.report("backends", "reserving object number %s",r)
+ return r
end
- return r
end
---~ local pdfreserveobject = lpdf.reserveobject
+function lpdf.reserveannotation()
+ return pdfreserveobject("annot")
+end
+
+lpdf.immediateobject = pdfimmediateobject
+lpdf.object = pdfdeferredobject -- the table interface, todo: auto attr() and so
+lpdf.deferredobject = pdfdeferredobject
+lpdf.referenceobject = pdfreferenceobject
+lpdf.pagereference = pdf.pageref or tex.pdfpageref
+lpdf.registerannotation = pdf.registerannot
+
+function lpdf.delayedobject(data)
+ local n = pdfdeferredobject(data)
+ pdfreferenceobject(n)
+ return n
+end
function lpdf.flushobject(name,data)
if data then
- name = names[name] or name
- if name then
- if trace_objects then
- if trace_detail then
- logs.report("backends", "flushing object data to reserved object with name '%s' -> %s",name,tostring(data))
- else
- logs.report("backends", "flushing object data to reserved object with name '%s'",name)
- end
+ local named = names[name]
+ if named then
+ if not trace_objects then
+ elseif trace_detail then
+ report_objects("flushing data to reserved object with name '%s' -> %s",name,tostring(data))
+ else
+ report_objects("flushing data to reserved object with name '%s'",name)
end
- return pdfimmediateobj(name,tostring(data))
+ return pdfimmediateobject(named,tostring(data))
else
- if trace_objects then
- if trace_detail then
- logs.report("backends", "flushing object data to reserved object with number %s -> %s",name,tostring(data))
- else
- logs.report("backends", "flushing object data to reserved object with number %s",name)
- end
+ if not trace_objects then
+ elseif trace_detail then
+ report_objects("flushing data to reserved object with number %s -> %s",name,tostring(data))
+ else
+ report_objects("flushing data to reserved object with number %s",name)
end
- return pdfimmediateobj(tostring(data))
+ return pdfimmediateobject(name,tostring(data))
end
else
if trace_objects and trace_detail then
- logs.report("backends", "flushing object data -> %s",tostring(name))
+ report_objects("flushing data -> %s",tostring(name))
end
- return pdfimmediateobj(tostring(name))
+ return pdfimmediateobject(tostring(name))
+ end
+end
+
+local shareobjectcache, shareobjectreferencecache = { }, { }
+
+function lpdf.shareobject(content)
+ content = tostring(content)
+ local o = shareobjectcache[content]
+ if not o then
+ o = pdfimmediateobject(content)
+ shareobjectcache[content] = o
end
+ return o
end
-function lpdf.sharedobj(content)
- local r = cache[content]
+function lpdf.shareobjectreference(content)
+ content = tostring(content)
+ local r = shareobjectreferencecache[content]
if not r then
- r = pdfreference(pdfimmediateobj(content))
- cache[content] = r
+ local o = shareobjectcache[content]
+ if not o then
+ o = pdfimmediateobject(content)
+ shareobjectcache[content] = o
+ end
+ r = pdfreference(o)
+ shareobjectreferencecache[content] = r
end
return r
end
@@ -445,53 +505,71 @@ local function resetpageproperties()
pagesattributes = pdfdictionary()
end
+resetpageproperties()
+
local function setpageproperties()
---~ texset("global", "pdfpageresources", pageresources ())
---~ texset("global", "pdfpageattr", pageattributes ())
---~ texset("global", "pdfpagesattr", pagesattributes())
pdf.pageresources = pageresources ()
pdf.pageattributes = pageattributes ()
pdf.pagesattributes = pagesattributes()
end
-function lpdf.addtopageresources (k,v) pageresources [k] = v end
-function lpdf.addtopageattributes (k,v) pageattributes [k] = v end
-function lpdf.addtopagesattributes(k,v) pagesattributes[k] = v end
+local function addtopageresources (k,v) pageresources [k] = v end
+local function addtopageattributes (k,v) pageattributes [k] = v end
+local function addtopagesattributes(k,v) pagesattributes[k] = v end
-local function set(where,f,when,what)
- when = when or 2
+lpdf.addtopageresources = addtopageresources
+lpdf.addtopageattributes = addtopageattributes
+lpdf.addtopagesattributes = addtopagesattributes
+
+local function set(where,what,f,when,comment)
+ if type(when) == "string" then
+ when, comment = 2, when
+ elseif not when then
+ when = 2
+ end
local w = where[when]
- w[#w+1] = f
+ w[#w+1] = { f, comment }
if trace_finalizers then
- logs.report("backend","%s set: [%s,%s]",what,when,#w)
+ report_finalizing("%s set: [%s,%s]",what,when,#w)
end
end
local function run(where,what)
+ if trace_finalizers then
+ report_finalizing("start backend: category=%s, n=%s",what,#where)
+ end
for i=1,#where do
local w = where[i]
for j=1,#w do
+ local wj = w[j]
if trace_finalizers then
- logs.report("backend","%s finalizer: [%s,%s]",what,i,j)
+ report_finalizing("%s finalizer: [%s,%s] %s",what,i,j,wj[2] or "")
end
- w[j]()
+ wj[1]()
end
end
+ if trace_finalizers then
+ report_finalizing("stop finalizing")
+ end
end
-function lpdf.registerpagefinalizer(f,when)
- set(pagefinalizers,f,when,"page")
+local function registerpagefinalizer(f,when,comment)
+ set(pagefinalizers,"page",f,when,comment)
end
-function lpdf.registerdocumentfinalizer(f,when)
- set(documentfinalizers,f,when,"document")
+local function registerdocumentfinalizer(f,when,comment)
+ set(documentfinalizers,"document",f,when,comment)
end
+lpdf.registerpagefinalizer = registerpagefinalizer
+lpdf.registerdocumentfinalizer = registerdocumentfinalizer
+
function lpdf.finalizepage()
if not environment.initex then
- resetpageproperties()
+ -- resetpageproperties() -- maybe better before
run(pagefinalizers,"page")
setpageproperties()
+ resetpageproperties() -- maybe better before
end
end
@@ -499,63 +577,89 @@ function lpdf.finalizedocument()
if not environment.initex then
run(documentfinalizers,"document")
function lpdf.finalizedocument()
- logs.report("backend","serious error: the document is finalized multiple times")
+ report_finalizing("serious error: the document is finalized multiple times")
function lpdf.finalizedocument() end
end
end
end
+backends.pdf.codeinjections.finalizepage = lpdf.finalizepage -- will go when we have hook
+
+--~ callbacks.register("finish_pdfpage", lpdf.finalizepage)
+callbacks.register("finish_pdffile", lpdf.finalizedocument)
+
-- some minimal tracing, handy for checking the order
local function trace_set(what,key)
if trace_resources then
- logs.report("backend", "setting key '%s' in '%s'",key,what)
+ report_finalizing("setting key '%s' in '%s'",key,what)
end
end
local function trace_flush(what)
if trace_resources then
- logs.report("backend", "flushing '%s'",what)
+ report_finalizing("flushing '%s'",what)
end
end
lpdf.protectresources = true
-local catalog, info, names = pdfdictionary(), pdfdictionary(), pdfdictionary()
+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
+local names = pdfdictionary { Type = pdfconstant("Names") } -- nicer, but when we assign we nil the Type
-local function flushcatalog() if not environment.initex then trace_flush("catalog") pdf.catalog = catalog() end end
-local function flushinfo () if not environment.initex then trace_flush("info") pdf.info = info () end end
-local function flushnames () if not environment.initex then trace_flush("names") pdf.names = names () end end
+local function flushcatalog() if not environment.initex then trace_flush("catalog") catalog.Type = nil pdf.catalog = catalog() end end
+local function flushinfo () if not environment.initex then trace_flush("info") info .Type = nil pdf.info = info () end end
+local function flushnames () if not environment.initex then trace_flush("names") names .Type = nil pdf.names = 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
function lpdf.addtoinfo (k,v) if not (lpdf.protectresources and info [k]) then trace_set("info", k) info [k] = v end end
function lpdf.addtonames (k,v) if not (lpdf.protectresources and names [k]) then trace_set("names", k) names [k] = v end end
-local dummy = pdfreserveobj() -- else bug in hvmd due so some internal luatex conflict
+local dummy = pdfreserveobject() -- else bug in hvmd due so some internal luatex conflict
+
+-- Some day I will implement a proper minimalized resource management.
-local r_extgstates, d_extgstates = pdfreserveobj(), pdfdictionary() local p_extgstates = pdfreference(r_extgstates)
-local r_colorspaces, d_colorspaces = pdfreserveobj(), pdfdictionary() local p_colorspaces = pdfreference(r_colorspaces)
-local r_patterns, d_patterns = pdfreserveobj(), pdfdictionary() local p_patterns = pdfreference(r_patterns)
-local r_shades, d_shades = pdfreserveobj(), pdfdictionary() local p_shades = pdfreference(r_shades)
+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 lpdf.addtopageresources("ExtGState", p_extgstates ) end end
-local function checkcolorspaces() if next(d_colorspaces) then lpdf.addtopageresources("ColorSpace",p_colorspaces) end end
-local function checkpatterns () if next(d_patterns ) then lpdf.addtopageresources("Pattern", p_patterns ) end end
-local function checkshades () if next(d_shades ) then lpdf.addtopageresources("Shading", p_shades ) 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 function flushextgstates () if next(d_extgstates ) then trace_flush("extgstates") pdfimmediateobj(r_extgstates, tostring(d_extgstates )) end end
-local function flushcolorspaces() if next(d_colorspaces) then trace_flush("colorspaces") pdfimmediateobj(r_colorspaces,tostring(d_colorspaces)) end end
-local function flushpatterns () if next(d_patterns ) then trace_flush("patterns") pdfimmediateobj(r_patterns, tostring(d_patterns )) end end
-local function flushshades () if next(d_shades ) then trace_flush("shades") pdfimmediateobj(r_shades, tostring(d_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
-local collected = pdfdictionary {
- ExtGState = p_extgstates,
- ColorSpace = p_colorspaces,
- Pattern = p_patterns,
- Shading = p_shades,
-} ; collected = collected()
+--~ local collected = pdfdictionary {
+--~ ExtGState = p_extgstates,
+--~ ColorSpace = p_colorspaces,
+--~ Pattern = p_patterns,
+--~ Shading = p_shades,
+--~ } ; collected = collected()
+
+--~ function lpdf.collectedresources()
+--~ context(collected)
+--~ end
function lpdf.collectedresources()
- tex.sprint(tex.ctxcatcodes,collected)
+ 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") },
+ }
+ context(collected())
+ end
end
function lpdf.adddocumentextgstate (k,v) d_extgstates [k] = v end
@@ -563,25 +667,25 @@ 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
-lpdf.registerdocumentfinalizer(flushextgstates,3)
-lpdf.registerdocumentfinalizer(flushcolorspaces,3)
-lpdf.registerdocumentfinalizer(flushpatterns,3)
-lpdf.registerdocumentfinalizer(flushshades,3)
+registerdocumentfinalizer(flushextgstates,3,"extended graphic states")
+registerdocumentfinalizer(flushcolorspaces,3,"color spaces")
+registerdocumentfinalizer(flushpatterns,3,"patterns")
+registerdocumentfinalizer(flushshades,3,"shades")
-lpdf.registerdocumentfinalizer(flushcatalog,3)
-lpdf.registerdocumentfinalizer(flushinfo,3)
-lpdf.registerdocumentfinalizer(flushnames,3)
+registerdocumentfinalizer(flushcatalog,3,"catalog")
+registerdocumentfinalizer(flushinfo,3,"info")
+registerdocumentfinalizer(flushnames,3,"names") -- before catalog
-lpdf.registerpagefinalizer(checkextgstates,3)
-lpdf.registerpagefinalizer(checkcolorspaces,3)
-lpdf.registerpagefinalizer(checkpatterns,3)
-lpdf.registerpagefinalizer(checkshades,3)
+registerpagefinalizer(checkextgstates,3,"extended graphic states")
+registerpagefinalizer(checkcolorspaces,3,"color spaces")
+registerpagefinalizer(checkpatterns,3,"patterns")
+registerpagefinalizer(checkshades,3,"shades")
--- in strc-bkm: lpdf.registerdocumentfinalizer(function() structure.bookmarks.place() end,1)
+-- in strc-bkm: lpdf.registerdocumentfinalizer(function() structures.bookmarks.place() end,1)
function lpdf.rotationcm(a)
local s, c = sind(a), cosd(a)
- texwrite(format("%s %s %s %s 0 0 cm",c,s,-s,c))
+ context("%s %s %s %s 0 0 cm",c,s,-s,c)
end
-- ! -> universaltime
@@ -601,36 +705,36 @@ function lpdf.id()
return format("%s.%s",tex.jobname,timestamp)
end
-function lpdf.checkedkey(t,key,kind)
+function lpdf.checkedkey(t,key,variant)
local pn = t[key]
if pn then
local tn = type(pn)
- if tn == kind then
- if kind == "string" then
- return pn ~= "" and pn
- elseif kind == "table" then
- return next(pn) and pn
+ if tn == variant then
+ if variant == "string" then
+ return pn ~= "" and pn or nil
+ elseif variant == "table" then
+ return next(pn) and pn or nil
else
return pn
end
- elseif tn == "string" and kind == "number" then
+ elseif tn == "string" and variant == "number" then
return tonumber(pn)
end
end
end
-function lpdf.checkedvalue(value,kind) -- code not shared
+function lpdf.checkedvalue(value,variant) -- code not shared
if value then
local tv = type(value)
- if tv == kind then
- if kind == "string" then
+ if tv == variant then
+ if variant == "string" then
return value ~= "" and value
- elseif kind == "table" then
+ elseif variant == "table" then
return next(value) and value
else
return value
end
- elseif tv == "string" and kind == "number" then
+ elseif tv == "string" and variant == "number" then
return tonumber(value)
end
end
@@ -658,13 +762,29 @@ end
-- lpdf.addtoinfo("ConTeXt.Jobname", tex.jobname)
-- lpdf.addtoinfo("ConTeXt.Url", "www.pragma-ade.com")
--- saves definitions later on
+if not pdfreferenceobject then
-backends = backends or { }
-backends.pdf = backends.pdf or {
- comment = "backend for directly generating pdf output",
- nodeinjections = { },
- codeinjections = { },
- registrations = { },
- helpers = { },
-}
+ local delayed = { }
+
+ local function flush()
+ local n = 0
+ for k,v in next, delayed do
+ pdfimmediateobject(k,v)
+ n = n + 1
+ end
+ if trace_objects then
+ report_objects("%s objects flushed",n)
+ end
+ delayed = { }
+ end
+
+ lpdf.registerdocumentfinalizer(flush,3,"objects") -- so we need a final flush too
+ lpdf.registerpagefinalizer (flush,3,"objects") -- somehow this lags behind .. I need to look into that some day
+
+ function lpdf.delayedobject(data)
+ local n = pdfreserveobject()
+ delayed[n] = data
+ return n
+ end
+
+end
diff --git a/Master/texmf-dist/tex/context/base/lpdf-ini.mkiv b/Master/texmf-dist/tex/context/base/lpdf-ini.mkiv
deleted file mode 100644
index 7c7dce3efb3..00000000000
--- a/Master/texmf-dist/tex/context/base/lpdf-ini.mkiv
+++ /dev/null
@@ -1,271 +0,0 @@
-%D \module
-%D [ file=lpdf-ini,
-%D version=2009.04.15,
-%D title=\CONTEXT\ Backend Macros,
-%D subtitle=PDF,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright=\PRAGMA]
-%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 Backend Macros / PDF}
-
-\registerctxluafile{lpdf-ini}{1.001}
-\registerctxluafile{lpdf-xmp}{1.001}
-\registerctxluafile{lpdf-nod}{1.001}
-%registerctxluafile{lpdf-col}{1.001} % will be loaded later
-\registerctxluafile{lpdf-mis}{1.001}
-\registerctxluafile{lpdf-ano}{1.001}
-\registerctxluafile{lpdf-ren}{1.001}
-\registerctxluafile{lpdf-grp}{1.001}
-\registerctxluafile{lpdf-wid}{1.001}
-\registerctxluafile{lpdf-fld}{1.001}
-\registerctxluafile{lpdf-u3d}{1.001}
-\registerctxluafile{lpdf-swf}{1.001}
-
-\unprotect
-
-% for the moment here
-
-%D \macros
-%D {doovalbox}
-%D
-%D Drawing frames with round corners is inherited from the
-%D main module.
-%D
-%D For drawing ovals we use quite raw \PDF\ code. The next
-%D implementation does not differ that much from the one
-%D implemented in the \POSTSCRIPT\ driver. This code is
-%D somewhat obsolete as we now have metapost embedded.
-
-\def\doPDFovalcalc#1#2#3%
- {\PointsToBigPoints{\dimexpr#1+#2\relax}#3}
-
-\def\doovalbox#1#2#3#4#5#6#7#8% todo: \scratchdimen/\scatchbox
- {\forcecolorhack
- \bgroup
- \dimen0=#4\divide\dimen0 \plustwo
- \doPDFovalcalc{0pt}{+\dimen0}\xmin
- \doPDFovalcalc{#1}{-\dimen0}\xmax
- \doPDFovalcalc{#2}{-\dimen0}\ymax
- \doPDFovalcalc{-#3}{+\dimen0}\ymin
- \advance\dimen0 by #5%
- \doPDFovalcalc{0pt}{+\dimen0}\xxmin
- \doPDFovalcalc{#1}{-\dimen0}\xxmax
- \doPDFovalcalc{#2}{-\dimen0}\yymax
- \doPDFovalcalc{-#3}{+\dimen0}\yymin
- \doPDFovalcalc{#4}{\zeropoint}\stroke
- \doPDFovalcalc{#5}{\zeropoint}\radius
- \edef\dostroke{#6}%
- \edef\dofill{#7}%
- \edef\mode{\number#8 \space}%
- % no \ifcase, else \relax in pdfcode
- \setbox\scratchbox\hbox
- {\ifnum\dostroke\dofill>\zerocount
- \pdfliteral
- {q
- \stroke\space w
- \ifcase\mode
- \xxmin\space \ymin \space m
- \xxmax\space \ymin \space l
- \xmax \space \ymin \space \xmax \space \yymin\space y
- \xmax \space \yymax\space l
- \xmax \space \ymax \space \xxmax\space \ymax \space y
- \xxmin\space \ymax \space l
- \xmin \space \ymax \space \xmin \space \yymax\space y
- \xmin \space \yymin\space l
- \xmin \space \ymin \space \xxmin\space \ymin \space y
- h
- \or % 1
- \xxmin\space \ymin \space m
- \xxmax\space \ymin \space l
- \xmax \space \ymin \space \xmax \space \yymin\space y
- \xmax \space \ymax \space l
- \xmin \space \ymax \space l
- \xmin \space \yymin\space l
- \xmin \space \ymin \space \xxmin\space \ymin \space y
- h
- \or % 2
- \xxmin\space \ymin \space m
- \xmax \space \ymin \space l
- \xmax \space \ymax \space l
- \xxmin\space \ymax \space l
- \xmin \space \ymax \space \xmin \space \yymax\space y
- \xmin \space \yymin\space l
- \xmin \space \ymin \space \xxmin\space \ymin \space y
- h
- \or % 3
- \xmin \space \ymin \space m
- \xmax \space \ymin \space l
- \xmax \space \yymax\space l
- \xmax \space \ymax \space \xxmax\space \ymax \space y
- \xxmin\space \ymax \space l
- \xmin \space \ymax \space \xmin \space \yymax\space y
- \xmin \space \ymin \space l
- h
- \or % 4
- \xmin \space \ymin \space m
- \xxmax\space \ymin \space l
- \xmax \space \ymin \space \xmax \space \yymin\space y
- \xmax \space \yymax\space l
- \xmax \space \ymax \space \xxmax\space \ymax \space y
- \xmin \space \ymax \space l
- \xmin \space \ymin\space l
- h
- \or % 5
- \xmin \space \ymin \space m
- \xmax \space \ymin \space l
- \xmax \space \yymax\space l
- \xmax \space \ymax \space \xxmax\space \ymax \space y
- \xmin \space \ymax \space l
- \xmin \space \ymin \space l
- h
- \or % 6
- \xmin \space \ymin \space m
- \xxmax\space \ymin \space l
- \xmax \space \ymin \space \xmax \space \yymin\space y
- \xmax \space \ymax \space l
- \xmin \space \ymax \space l
- \xmin \space \ymin \space l
- h
- \or
- \xxmin\space \ymin \space m
- \xmax \space \ymin \space l
- \xmax \space \ymax \space l
- \xmin \space \ymax \space l
- \xmin \space \yymin\space l
- \xmin \space \ymin \space \xxmin\space \ymin \space y
- h
- \or
- \xmin \space \ymin \space m
- \xmax \space \ymin \space l
- \xmax \space \ymax \space l
- \xxmin\space \ymax \space l
- \xmin \space \ymax \space \xmin \space \yymax\space y
- \xmin \space \ymin \space l
- h
- \or % 9 top open
- \xmin \space \ymax \space m
- \xmin \space \yymin\space l
- \xmin \space \ymin \space \xxmin\space \ymin \space y
- \xxmax\space \ymin \space l
- \xmax \space \ymin \space \xmax \space \yymin\space y
- \xmax \space \ymax \space l
- \or % 10 right open
- \xmax \space \ymax \space m
- \xxmin\space \ymax \space l
- \xmin \space \ymax \space \xmin \space \yymax\space y
- \xmin \space \yymin\space l
- \xmin \space \ymin \space \xxmin\space \ymin \space y
- \xmax\space \ymin \space l
- \or % 11 bottom open
- \xmax \space \ymin \space m
- \xmax \space \yymax\space l
- \xmax \space \ymax \space \xxmax \space \ymax\space y
- \xxmin\space \ymax \space l
- \xmin \space \ymax \space \xmin \space \yymax\space y
- \xmin \space \ymin \space l
- \or % 12 left open
- \xmin \space \ymax \space m
- \xxmax\space \ymax \space l
- \xmax \space \ymax \space \xmax \space \yymax\space y
- \xmax \space \yymin\space l
- \xmax \space \ymin \space \xxmax\space \ymin \space y
- \xmin \space \ymin \space l
- \or % 13
- \xmin \space \ymax \space m
- \xxmax\space \ymax \space l
- \xmax \space \ymax \space \xmax \space \yymax\space y
- \xmax\space \ymin \space l
- \or % 14
- \xmax \space \ymax \space m
- \xmax \space \yymin\space l
- \xmax \space \ymin \space \xxmax\space \ymin \space y
- \xmin \space \ymin \space l
- \or % 15
- \xmax \space \ymin \space m
- \xxmin\space \ymin \space l
- \xmin \space \ymin \space \xmin \space \yymin\space y
- \xmin \space \ymax \space l
- \or % 16
- \xmin \space \ymin \space m
- \xmin \space \yymax\space l
- \xmin \space \ymax \space \xxmin\space \ymax \space y
- \xmax \space \ymax \space l
- \or % 17
- \xxmax\space \ymax \space m
- \xmax \space \ymax \space \xmax \space \yymax\space y
- \or % 18
- \xmax \space \yymin\space m
- \xmax \space \ymin \space \xxmax\space \ymin \space y
- \or % 19
- \xxmin\space \ymin \space m
- \xmin \space \ymin \space \xmin \space \yymin\space y
- \or % 20
- \xmin \space \yymax\space m
- \xmin \space \ymax \space \xxmin\space \ymax \space y
- \or % 21
- \xxmax\space \ymax \space m
- \xmax \space \ymax \space \xmax \space \yymax\space y
- \xmin \space \yymax\space m
- \xmin \space \ymax \space \xxmin\space \ymax \space y
- \or % 22
- \xxmax\space \ymax \space m
- \xmax \space \ymax \space \xmax \space \yymax\space y
- \xmax \space \yymin\space m
- \xmax \space \ymin \space \xxmax\space \ymin \space y
- \or % 23
- \xmax \space \yymin\space m
- \xmax \space \ymin \space \xxmax\space \ymin \space y
- \xxmin\space \ymin \space m
- \xmin \space \ymin \space \xmin \space \yymin\space y
- \or % 24
- \xxmin\space \ymin \space m
- \xmin \space \ymin \space \xmin \space \yymin\space y
- \xmin \space \yymax\space m
- \xmin \space \ymax \space \xxmin\space \ymax \space y
- \or % 25
- \xxmax\space \ymax \space m
- \xmax \space \ymax \space \xmax \space \yymax\space y
- \xmax \space \yymin\space m
- \xmax \space \ymin \space \xxmax\space \ymin \space y
- \xxmin\space \ymin \space m
- \xmin \space \ymin \space \xmin \space \yymin\space y
- \xmin \space \yymax\space m
- \xmin \space \ymax \space \xxmin\space \ymax \space y
- \or % 26
- \xmax \space \yymin\space m
- \xmax \space \ymin \space \xxmax\space \ymin \space y
- \xmin \space \yymax\space m
- \xmin \space \ymax \space \xxmin\space \ymax \space y
- \or % 27
- \xxmax\space \ymax \space m
- \xmax \space \ymax \space \xmax \space \yymax\space y
- \xxmin\space \ymin \space m
- \xmin \space \ymin \space \xmin \space \yymin\space y
- \or % 28
- \fi
- \ifnum\mode>8
- S
- \else
- \ifnum\dostroke=\plusone S \fi
- \ifnum\dofill =\plusone f \fi
- \fi
- Q}%
- \fi}%
- \wd\scratchbox#1\ht\scratchbox#2\dp\scratchbox#3\box\scratchbox
- \egroup}
-
-\unexpanded\def\pdfactualtext#1#2%
- {\pdfliteral direct{/Span <</ActualText \ctxlua{tex.write(lpdf.tosixteen("#2"))} >> BDC}%
- #1%
- \pdfliteral direct{EMC}}
-
-% \starttext
-% text \pdfactualtext{Meier}{Müller} text
-% \stoptext
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/lpdf-mis.lua b/Master/texmf-dist/tex/context/base/lpdf-mis.lua
index a68c7b4873d..426c00286a9 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-mis.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-mis.lua
@@ -17,8 +17,9 @@ if not modules then modules = { } end modules ['lpdf-mis'] = {
local next, tostring = next, tostring
local format = string.format
-local texsprint, texset = tex.sprint, tex.set
-local ctxcatcodes = tex.ctxcatcodes
+local texset = tex.set
+
+local backends, lpdf, nodes = backends, lpdf, nodes
local nodeinjections = backends.pdf.nodeinjections
local codeinjections = backends.pdf.codeinjections
@@ -26,22 +27,22 @@ local registrations = backends.pdf.registrations
local copy_node = node.copy
-local pdfliteral, register = nodes.pdfliteral, nodes.register
+local nodepool = nodes.pool
-local pdfdictionary = lpdf.dictionary
-local pdfarray = lpdf.array
-local pdfboolean = lpdf.boolean
-local pdfconstant = lpdf.constant
-local pdfreference = lpdf.reference
-local pdfunicode = lpdf.unicode
-local pdfverbose = lpdf.verbose
-local pdfstring = lpdf.string
-local pdfflushobject = lpdf.flushobject
+local pdfliteral, register = nodepool.pdfliteral, nodepool.register
-local pdfimmediateobj = pdf.immediateobj
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfboolean = lpdf.boolean
+local pdfconstant = lpdf.constant
+local pdfreference = lpdf.reference
+local pdfunicode = lpdf.unicode
+local pdfverbose = lpdf.verbose
+local pdfstring = lpdf.string
+local pdfflushobject = lpdf.flushobject
+local pdfimmediateobject = lpdf.immediateobject
-local tobasepoints = number.tobasepoints
-local variables = interfaces.variables
+local variables = interfaces.variables
--
@@ -58,7 +59,7 @@ local function initializenegative()
Range = a,
Domain = a,
}
- local negative = pdfdictionary { Type = g, TR = pdfreference(pdf.immediateobj("stream","1 exch sub",d())) }
+ local negative = pdfdictionary { Type = g, TR = pdfreference(pdfimmediateobject("stream","1 exch sub",d())) }
local positive = pdfdictionary { Type = g, TR = pdfconstant("Identity") }
lpdf.adddocumentextgstate("GSnegative", pdfreference(pdfflushobject(negative)))
lpdf.adddocumentextgstate("GSPositive", pdfreference(pdfflushobject(positive)))
@@ -108,20 +109,28 @@ end
local openpage, closepage, opendocument, closedocument
-function codeinjections.flushdocumentactions(open,close)
- opendocument, closedocument = open, close
+function codeinjections.registerdocumentopenaction(open)
+ opendocument = open
+end
+
+function codeinjections.registerdocumentcloseaction(close)
+ closedocument = close
end
-function codeinjections.flushpageactions(open,close)
- openpage, closepage = open, close
+function codeinjections.registerpageopenaction(open)
+ openpage = open
+end
+
+function codeinjections.registerpagecloseaction(close)
+ closepage = close
end
local function flushdocumentactions()
if opendocument then
- lpdf.addtocatalog("OpenAction",lpdf.pdfaction(opendocument))
+ lpdf.addtocatalog("OpenAction",lpdf.action(opendocument))
end
if closedocument then
- lpdf.addtocatalog("CloseAction",lpdf.pdfaction(closedocument))
+ lpdf.addtocatalog("CloseAction",lpdf.action(closedocument))
end
end
@@ -129,39 +138,50 @@ local function flushpageactions()
if openpage or closepage then
local d = pdfdictionary()
if openpage then
- d.O = lpdf.pdfaction(openpage)
+ d.O = lpdf.action(openpage)
end
if closepage then
- d.C = lpdf.pdfaction(closepage)
+ d.C = lpdf.action(closepage)
end
lpdf.addtopageattributes("AA",d)
end
end
-lpdf.registerpagefinalizer(flushpageactions)
-lpdf.registerdocumentfinalizer(flushdocumentactions)
+lpdf.registerpagefinalizer (flushpageactions, "page actions")
+lpdf.registerdocumentfinalizer(flushdocumentactions,"document actions")
+
+--- info : this can change and move elsewhere
---- info
+local identity = { }
function codeinjections.setupidentity(specification)
- local title = specification.title or ""
- if title ~= "" then
- lpdf.addtoinfo("Title", pdfunicode(title), title)
+ for k, v in next, specification do
+ if v ~= "" then
+ identity[k] = v
+ end
end
- local subject = specification.subject or ""
- if subject ~= "" then
- lpdf.addtoinfo("Subject", pdfunicode(subject), subject)
+end
+
+local function setupidentity()
+ local title = identity.title
+ if not title or title == "" then
+ title = tex.jobname
end
- local author = specification.author or ""
+ lpdf.addtoinfo("Title", pdfunicode(title), title)
+ local subtitle = identity.subtitle or ""
+ if subtitle ~= "" then
+ lpdf.addtoinfo("Subject", pdfunicode(subtitle), subtitle)
+ end
+ local author = identity.author or ""
if author ~= "" then
lpdf.addtoinfo("Author", pdfunicode(author), author) -- '/Author' in /Info, 'Creator' in XMP
end
- local creator = specification.creator or ""
+ local creator = identity.creator or ""
if creator ~= "" then
lpdf.addtoinfo("Creator", pdfunicode(creator), creator) -- '/Creator' in /Info, 'CreatorTool' in XMP
end
lpdf.addtoinfo("CreationDate", pdfstring(lpdf.pdftimestamp(lpdf.timestamp())))
- local date = specification.date or ""
+ local date = identity.date or ""
local pdfdate = lpdf.pdftimestamp(date)
if pdfdate then
lpdf.addtoinfo("ModDate", pdfstring(pdfdate), date)
@@ -171,17 +191,20 @@ function codeinjections.setupidentity(specification)
date = lpdf.timestamp()
lpdf.addtoinfo("ModDate", pdfstring(lpdf.pdftimestamp(date)), date)
end
- local keywords = specification.keywords or ""
+ local keywords = identity.keywords or ""
if keywords ~= "" then
keywords = string.gsub(keywords, "[%s,]+", " ")
lpdf.addtoinfo("Keywords",pdfunicode(keywords), keywords)
end
local id = lpdf.id()
lpdf.addtoinfo("ID", pdfstring(id), id) -- needed for pdf/x
+ setupidentity = function() end
end
+lpdf.registerpagefinalizer(setupidentity,"identity")
+
local function flushjavascripts()
- local t = javascripts.flushpreambles()
+ local t = interactions.javascripts.flushpreambles()
if #t > 0 then
local a = pdfarray()
local pdf_javascript = pdfconstant("JavaScript")
@@ -189,7 +212,7 @@ local function flushjavascripts()
local name, script = t[i][1], t[i][2]
local j = pdfdictionary {
S = pdf_javascript,
- JS = pdfreference(pdfimmediateobj("stream",script)),
+ JS = pdfreference(pdfimmediateobject("stream",script)),
}
a[#a+1] = pdfstring(name)
a[#a+1] = pdfreference(pdfflushobject(j))
@@ -198,7 +221,7 @@ local function flushjavascripts()
end
end
-lpdf.registerdocumentfinalizer(flushjavascripts)
+lpdf.registerdocumentfinalizer(flushjavascripts,"javascripts")
-- -- --
@@ -278,7 +301,7 @@ local function pagespecification()
local pageheight = tex.pdfpageheight
local box = pdfarray { -- can be cached
boxvalue(leftoffset),
- boxvalue(pageheight-topoffset-height),
+ boxvalue(pageheight+topoffset-height),
boxvalue(width-leftoffset),
boxvalue(pageheight-topoffset),
}
@@ -288,5 +311,52 @@ local function pagespecification()
-- lpdf.addtopageattributes("ArtBox",box)
end
-lpdf.registerpagefinalizer(pagespecification)
-lpdf.registerdocumentfinalizer(documentspecification)
+lpdf.registerpagefinalizer(pagespecification,"page specification")
+lpdf.registerdocumentfinalizer(documentspecification,"document specification")
+
+-- Page Label support ...
+--
+-- In principle we can also support /P (prefix) as we can just use the verbose form
+-- and we can then forget about the /St (start) as we don't care about those few
+-- extra bytes due to lack of collapsing. Anyhow, for that we need a stupid prefix
+-- variant and that's not on the agenda now.
+
+local map = {
+ numbers = "D",
+ Romannumerals = "R",
+ romannumerals = "r",
+ Characters = "A",
+ characters = "a",
+}
+
+local function featurecreep()
+ local pages, lastconversion, list = structures.pages.tobesaved, nil, pdfarray()
+ local getstructureset = structures.sets.get
+ for i=1,#pages do
+ local p = pages[i]
+ if not p then
+ return -- fatal error
+ else
+ local numberdata = p.numberdata
+ if numberdata then
+ local conversionset = numberdata.conversionset
+ if conversionset then
+ local conversion = getstructureset("structure:conversions",p.block,conversionset,1,"numbers")
+ if conversion ~= lastconversion then
+ lastconversion = conversion
+ list[#list+1] = i - 1 -- pdf starts numbering at 0
+ list[#list+1] = pdfdictionary { S = pdfconstant(map[conversion] or map.numbers) }
+ end
+ end
+ end
+ if not lastconversion then
+ lastconversion = "numbers"
+ list[#list+1] = i - 1 -- pdf starts numbering at 0
+ list[#list+1] = pdfdictionary { S = pdfconstant(map.numbers) }
+ end
+ end
+ end
+ lpdf.addtocatalog("PageLabels", pdfdictionary { Nums = list })
+end
+
+lpdf.registerdocumentfinalizer(featurecreep,"featurecreep")
diff --git a/Master/texmf-dist/tex/context/base/lpdf-nod.lua b/Master/texmf-dist/tex/context/base/lpdf-nod.lua
index 0ae9001232a..39bba2d6364 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-nod.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-nod.lua
@@ -8,9 +8,13 @@ if not modules then modules = { } end modules ['lpdf-nod'] = {
local copy_node, new_node = node.copy, node.new
-local pdfliteral = nodes.register(new_node("whatsit", 8)) pdfliteral.mode = 1
-local pdfdest = nodes.register(new_node("whatsit",19)) pdfdest.named_id = 1 -- xyz_zoom untouched
-local pdfannot = nodes.register(new_node("whatsit",15))
+local nodepool = nodes.pool
+
+local register = nodepool.register
+
+local pdfliteral = register(new_node("whatsit", 8)) pdfliteral.mode = 1
+local pdfdest = register(new_node("whatsit",19)) pdfdest.named_id = 1 -- xyz_zoom untouched
+local pdfannot = register(new_node("whatsit",15))
local variables = interfaces.variables
@@ -25,13 +29,20 @@ local views = { -- beware, we do support the pdf keys but this is *not* official
fitr = 7,
}
-function nodes.pdfliteral(str)
+function nodepool.pdfliteral(str)
+ local t = copy_node(pdfliteral)
+ t.data = str
+ return t
+end
+
+function nodepool.pdfdirect(str)
local t = copy_node(pdfliteral)
t.data = str
+ t.mode = 1
return t
end
-function nodes.pdfannotation(w,h,d,data,n)
+function nodepool.pdfannotation(w,h,d,data,n)
local t = copy_node(pdfannot)
if w and w ~= 0 then t.width = w end
if h and h ~= 0 then t.height = h end
@@ -41,7 +52,7 @@ function nodes.pdfannotation(w,h,d,data,n)
return t
end
-function nodes.pdfdestination(w,h,d,name,view,n)
+function nodepool.pdfdestination(w,h,d,name,view,n)
local t = copy_node(pdfdest)
if w and w ~= 0 then t.width = w end
if h and h ~= 0 then t.height = h end
diff --git a/Master/texmf-dist/tex/context/base/lpdf-pda.xml b/Master/texmf-dist/tex/context/base/lpdf-pda.xml
new file mode 100644
index 00000000000..2d8e7b6f59f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lpdf-pda.xml
@@ -0,0 +1,171 @@
+<?xml version="1.0"?>
+
+<!-- lpdf-pda.xml -->
+
+<x:xmpmeta xmlns:x="adobe:ns:meta/">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>application/pdf</dc:format>
+ <dc:creator>
+ <rdf:Seq>
+ <rdf:li/>
+ </rdf:Seq>
+ </dc:creator>
+ <dc:description/>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default"/>
+ </rdf:Alt>
+ </dc:title>
+ </rdf:Description>
+ <rdf:Description rdf:about="" xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/">
+ <pdfx:ConTeXt.Jobname/>
+ <pdfx:ConTeXt.Time/>
+ <pdfx:ConTeXt.Url/>
+ <pdfx:ConTeXt.Version/>
+ <pdfx:ID/>
+ <pdfx:PTEX.Fullbanner/>
+ </rdf:Description>
+ <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/">
+ <xmp:CreateDate/>
+ <xmp:CreatorTool/>
+ <xmp:ModifyDate/>
+ <xmp:MetadataDate/>
+ </rdf:Description>
+ <rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+ <pdf:Keywords/>
+ <pdf:Producer/>
+ <pdf:Trapped>False</pdf:Trapped>
+ </rdf:Description>
+ <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
+ <xmpMM:DocumentID/>
+ <xmpMM:InstanceID/>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/"
+ xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#"
+ xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#">
+ <pdfaExtension:schemas>
+ <rdf:Bag>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaSchema:namespaceURI>http://ns.adobe.com/pdf/1.3/</pdfaSchema:namespaceURI>
+ <pdfaSchema:prefix>pdf</pdfaSchema:prefix>
+ <pdfaSchema:schema>Adobe PDF Schema</pdfaSchema:schema>
+ <pdfaSchema:property>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:category>internal</pdfaProperty:category>
+ <pdfaProperty:description>A name object indicating whether the document has been modified to include trapping information</pdfaProperty:description>
+ <pdfaProperty:name>Trapped</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ </rdf:li>
+ </rdf:Seq>
+ </pdfaSchema:property>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaSchema:namespaceURI>http://purl.org/dc/elements/1.1/</pdfaSchema:namespaceURI>
+ <pdfaSchema:prefix>pdf</pdfaSchema:prefix>
+ <pdfaSchema:schema>Dubline Core Schema</pdfaSchema:schema>
+ <pdfaSchema:property>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:category>internal</pdfaProperty:category>
+ <pdfaProperty:description>Subject in Document Properties</pdfaProperty:description>
+ <pdfaProperty:name>description</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ </rdf:li>
+ </rdf:Seq>
+ </pdfaSchema:property>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaSchema:namespaceURI>http://ns.adobe.com/pdfx/1.3/</pdfaSchema:namespaceURI>
+ <pdfaSchema:prefix>pdfx</pdfaSchema:prefix>
+ <pdfaSchema:schema>PDF/X ID Schema</pdfaSchema:schema>
+ <pdfaSchema:property>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:category>external</pdfaProperty:category>
+ <pdfaProperty:description>Name of the ConTeXt job</pdfaProperty:description>
+ <pdfaProperty:name>ConTeXt.Jobname</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:category>external</pdfaProperty:category>
+ <pdfaProperty:description>Time stamp of ConTeXt version</pdfaProperty:description>
+ <pdfaProperty:name>ConTeXt.Time</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:category>external</pdfaProperty:category>
+ <pdfaProperty:description>ConTeXt website</pdfaProperty:description>
+ <pdfaProperty:name>ConTeXt.Url</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:category>external</pdfaProperty:category>
+ <pdfaProperty:description>ConTeXt version</pdfaProperty:description>
+ <pdfaProperty:name>ConTeXt.Version</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:category>external</pdfaProperty:category>
+ <pdfaProperty:description>Banner of pdftex or one of its successors</pdfaProperty:description>
+ <pdfaProperty:name>PTEX.Fullbanner</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:category>external</pdfaProperty:category>
+ <pdfaProperty:description>Document identifier</pdfaProperty:description>
+ <pdfaProperty:name>ID</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ </rdf:li>
+ </rdf:Seq>
+ </pdfaSchema:property>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaSchema:namespaceURI>http://ns.adobe.com/xap/1.0/mm/</pdfaSchema:namespaceURI>
+ <pdfaSchema:prefix>xmpMM</pdfaSchema:prefix>
+ <pdfaSchema:schema>XMP Media Management Schema</pdfaSchema:schema>
+ <pdfaSchema:property>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:category>internal</pdfaProperty:category>
+ <pdfaProperty:description>UUID based identifier for specific incarnation of a document</pdfaProperty:description>
+ <pdfaProperty:name>InstanceID</pdfaProperty:name>
+ <pdfaProperty:valueType>URI</pdfaProperty:valueType>
+ </rdf:li>
+ </rdf:Seq>
+ </pdfaSchema:property>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaSchema:namespaceURI>http://www.aiim.org/pdfa/ns/id/</pdfaSchema:namespaceURI>
+ <pdfaSchema:prefix>pdfaid</pdfaSchema:prefix>
+ <pdfaSchema:schema>PDF/A ID Schema</pdfaSchema:schema>
+ <pdfaSchema:property>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:category>internal</pdfaProperty:category>
+ <pdfaProperty:description>Part of PDF/A standard</pdfaProperty:description>
+ <pdfaProperty:name>part</pdfaProperty:name>
+ <pdfaProperty:valueType>Integer</pdfaProperty:valueType>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:category>internal</pdfaProperty:category>
+ <pdfaProperty:description>Amendment of PDF/A standard</pdfaProperty:description>
+ <pdfaProperty:name>amd</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <pdfaProperty:category>internal</pdfaProperty:category>
+ <pdfaProperty:description>Conformance level of PDF/A standard</pdfaProperty:description>
+ <pdfaProperty:name>conformance</pdfaProperty:name>
+ <pdfaProperty:valueType>Text</pdfaProperty:valueType>
+ </rdf:li>
+ </rdf:Seq>
+ </pdfaSchema:property>
+ </rdf:li>
+ </rdf:Bag>
+ </pdfaExtension:schemas>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
diff --git a/Master/texmf-dist/tex/context/base/lpdf-pdx.lua b/Master/texmf-dist/tex/context/base/lpdf-pdx.lua
deleted file mode 100644
index 0a440c1e665..00000000000
--- a/Master/texmf-dist/tex/context/base/lpdf-pdx.lua
+++ /dev/null
@@ -1,139 +0,0 @@
-if not modules then modules = { } end modules ['lpdf-pdx'] = {
- version = 1.001,
- comment = "companion to lpdf-ini.mkiv",
- author = "Peter Rold and Hans Hagen",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files",
-}
-
-local codeinjections = backends.codeinjections -- normally it is registered
-local variables = interfaces.variables
-
-local pdfdictionary = lpdf.dictionary
-local pdfarray = lpdf.array
-local pdfconstant = lpdf.constant
-local pdfreference = lpdf.reference
-local pdfflushobject = lpdf.flushobject
-local pdfstring = lpdf.string
-local pdfverbose = lpdf.verbose
-
-local lower, gmatch = string.lower, string.gmatch
-
-local channels = {
- gray = 1,
- grey = 1,
- rgb = 3,
- cmyk = 4,
-}
-
-local prefixes = {
- gray = "DefaultGray",
- grey = "DefaultGray",
- rgb = "DefaultRGB",
- cmyk = "DefaultCMYK",
-}
-
-local profiles = { }
-local defaults = { }
-local intents = pdfarray()
-local lastprofile = nil
-
-function codeinjections.useinternalICCprofile(colorspace,filename)
- local name = lower(file.basename(filename))
- local profile = profiles[name]
- if not profile then
- local colorspace = lower(colorspace)
- local filename = resolvers.findctxfile(filename) or ""
- local channel = channels[colorspace]
- if channel and filename ~= "" then
- local a = pdfdictionary { N = channel }
- profile = pdf.obj {
- compresslevel = 0,
- immediate = true,
- type = "stream",
- file = filename,
- attr = a(),
- }
- profiles[name] = profile
- end
- end
- lastprofile = profile
- return profile
-end
-
-function codeinjections.useexternalICCprofile(colorspace,name,urls,checksum,version)
- local profile = profiles[name]
- if not profile then
- local u = pdfarray()
- for url in gmatch(urls,"([^, ]+)") do
- u[#u+1] = pdfdictionary {
- FS = pdfconstant("URL"),
- F = pdfstring(url),
- }
- end
- local d = pdfdictionary {
- ProfileName = name, -- not file name!
- ProfileCS = colorspace,
- URLs = u, -- array containing at least one URL
- CheckSum = pdfverbose { "<", checksum, ">" }, -- 16byte MD5 hash
- ICCVersion = pdfverbose { "<", version, ">" }, -- bytes 8..11 from the header of the ICC profile, as a hex string
- }
- local n = pdfflushobject(d)
- profiles[name] = n
- lastprofile = n
- return n
- end
-end
-
-local function embedprofile(colorspace,filename)
- local colorspace = lower(colorspace)
- local n = codeinjections.useinternaliccprofile(colorspace,filename)
- if n then
- local a = pdfarray {
- pdfconstant("ICCBased"),
- pdfreference(n),
- }
- lpdf.adddocumentcolorspace(prefixes[colorspace],pdfreference(pdfflushobject(a))) -- part of page /Resources
- defaults[lower(colorspace)] = filename
- end
-end
-
-
-function codeinjections.useICCdefaultprofile(colorspace,filename)
- defaults[lower(colorspace)] = filename
-end
-
-local function flushembeddedprofiles()
- for colorspace, filename in next, defaults do
- embedprofile(colorspace,filename)
- end
-end
-
-function codeinjections.usePDFXoutputintent(id,name,reference,outputcondition,info)
- local d = {
- Type = pdfconstant("OutputIntent"),
- S = pdfconstant("GTS_PDFX"),
- OutputConditionIdentifier = id,
- RegistryName = name,
- OutputCondition = outputcondition,
- Info = info,
- }
- local icc = lastprofile
- if reference == variables.yes then
- d["DestOutputProfileRef"] = pdfreference(icc)
- else
- d["DestOutputProfile"] = pdfreference(icc)
- end
- -- intents[#intents+1] = pdfdictionary(d)
- intents[#intents+1] = pdfreference(pdfflushobject(pdfdictionary(d))) -- nicer as separate object
-end
-
-local function flushoutputintents()
- if #intents > 0 then
- lpdf.addtocatalog("OutputIntents",pdfreference(pdfflushobject(intents)))
- end
-end
-
-
-lpdf.registerdocumentfinalizer(flushoutputintents,1)
-lpdf.registerdocumentfinalizer(flushembeddedprofiles,1)
diff --git a/Master/texmf-dist/tex/context/base/lpdf-pdx.mkiv b/Master/texmf-dist/tex/context/base/lpdf-pdx.mkiv
deleted file mode 100644
index ffb7f526976..00000000000
--- a/Master/texmf-dist/tex/context/base/lpdf-pdx.mkiv
+++ /dev/null
@@ -1,71 +0,0 @@
-%D \module
-%D [ file=lpdf-pdx,
-%D version=2010.02.11,
-%D title=\CONTEXT\ Backend Macros,
-%D subtitle=PDF-X,
-%D author=Peter Rolf \& Hans Hagen,
-%D date=\currentdate,
-%D copyright=\PRAGMA] % and peter
-%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 Backend Macros / PDF-X}
-
-\unprotect
-
-% declare default color space
-% all device based entries of the same CS are mapped to the defined ICCprofile then;
-% i.e. /DeviceRGB --> /ICCBased RGB profile
-% TODO: allow multiple default profiles (one per CS)
-%
-% external ICC profile dictionary (PDF/X-4p and PDF/X-5p)
-%
-% - ProfileName (not file name!)
-% - URLs (array containing at least one URL); the keyword FSA is wrong!
-% - CheckSum (16byte MD5 hash)
-% - ProfileCS (GRAY,RGB,CMYK)
-% - ICCVersion (bytes 8..11 from the header of the ICC profile, as a hex string)
-
-\registerctxluafile{lpdf-pdx} {}
-
-% \def\embedICCprofile#1#2% colorspace, name
-% {\ctxlua{backends.codeinjections.addiccprofile("#1","#2")}}
-
-\def\douseinternalICCprofile[#1]%
- {\getparameters[\??ic][colorspace=,filename=,#1]%
- \ctxlua{backends.codeinjections.useinternalICCprofile(
- "\@@iccolorspace","\@@icfilename")}}
-
-% create a dictionary for an external ICC profile (PDF/X-4p and PDF/X-5pg only)
-% the referenced ICC profile is not embedded
-
-\def\douseexternalICCprofile[#1]%
- {\getparameters[\??ic][colorspace=,name=,url=,checksum=,version=,#1]%
- \ctxlua{backends.codeinjections.useexternalICCprofile(
- "\@@iccolorspace","\@@icname","\@@icurl","\@@icchecksum","\@@icversion")}}
-
-% use an ICC profile as default colorspace for all device dependend colors;
-% all device based entries of the same CS are mapped to the defined ICCprofile then;
-% i.e. /DeviceRGB --> /ICCBased RGB profile always embed the profile!
-
-\def\douseICCdefaultprofile[#1]%
- {\getparameters[\??ic][colorspace=,filename=,#1]%
- \ctxlua{backends.codeinjections.useICCdefaultprofile(
- "\@@iccolorspace","\@@icfilename")}}
-
-% embedding rules for output intent profile differ for the PDF/X versions
-
-\def\dousePDFXoutputintent[#1]%
- {\getparameters[\??ic][reference=\v!yes,outputcondition=,info=,id=,name=,#1]%
- \ctxlua{backends.codeinjections.usePDFXoutputintent(
- "\@@icid","\@@icname","\@@icreference","\@@icoutputcondition","\@@icinfo")}}
-
-\def\useinternalICCprofile{\dosingleempty\douseinternalICCprofile}
-\def\useexternalICCprofile{\dosingleempty\douseexternalICCprofile}
-\def\useICCdefaultprofile {\dosingleempty\douseICCdefaultprofile }
-\def\usePDFXoutputintent {\dosingleempty\dousePDFXoutputintent }
-
-\protect \endinput
-
diff --git a/Master/texmf-dist/tex/context/base/lpdf-xmp.xml b/Master/texmf-dist/tex/context/base/lpdf-pdx.xml
index 2947211bd8e..42e11650e71 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-xmp.xml
+++ b/Master/texmf-dist/tex/context/base/lpdf-pdx.xml
@@ -1,6 +1,8 @@
<?xml version="1.0"?>
-<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:08:04">
+<!-- lpdf-pdx.xml -->
+
+<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:format>application/pdf</dc:format>
diff --git a/Master/texmf-dist/tex/context/base/lpdf-ren.lua b/Master/texmf-dist/tex/context/base/lpdf-ren.lua
index e6bbd67fe2e..54c78845ed4 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-ren.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-ren.lua
@@ -10,70 +10,97 @@ if not modules then modules = { } end modules ['lpdf-ren'] = {
local tostring, tonumber, next = tostring, tonumber, next
local format = string.format
-local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local settings_to_array = utilities.parsers.settings_to_array
-local nodeinjections = backends.pdf.nodeinjections
-local codeinjections = backends.pdf.codeinjections
-local registrations = backends.pdf.registrations
+local backends, lpdf = backends, lpdf
-jobreferences = jobreferences or { }
---~ jobreferences.runners = jobreferences.runners or { }
---~ jobreferences.specials = jobreferences.specials or { }
---~ jobreferences.handlers = jobreferences.handlers or { }
-jobreferences.executers = jobreferences.executers or { }
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations = backends.pdf.registrations
+local viewerlayers = attributes.viewerlayers
---~ local runners = jobreferences.runners
---~ local specials = jobreferences.specials
---~ local handlers = jobreferences.handlers
-local executers = jobreferences.executers
+local references = structures.references
-local variables = interfaces.variables
+references.executers = references.executers or { }
+local executers = references.executers
-local pdfconstant = lpdf.constant
-local pdfdictionary = lpdf.dictionary
-local pdfarray = lpdf.array
-local pdfreference = lpdf.reference
-local pdfflushobject = lpdf.flushobject
+local variables = interfaces.variables
-local pdf_ocg = pdfconstant("OCG")
-local pdf_ocmd = pdfconstant("OCMD")
-local pdf_off = pdfconstant("OFF")
-local pdf_on = pdfconstant("ON")
-local pdf_toggle = pdfconstant("Toggle")
-local pdf_setocgstate = pdfconstant("SetOCGState")
+local v_no = variables.no
+local v_yes = variables.yes
+local v_start = variables.start
+local v_stop = variables.stop
+local v_reset = variables.reset
+local v_auto = variables.auto
+local v_random = variables.random
-local lpdf_usage = pdfdictionary { Print = pdfdictionary { PrintState = pdfconstant("OFF") } }
+local pdfconstant = lpdf.constant
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfreference = lpdf.reference
+local pdfflushobject = lpdf.flushobject
+local pdfreserveobject = lpdf.reserveobject
+
+local pdf_ocg = pdfconstant("OCG")
+local pdf_ocmd = pdfconstant("OCMD")
+local pdf_off = pdfconstant("OFF")
+local pdf_on = pdfconstant("ON")
+local pdf_toggle = pdfconstant("Toggle")
+local pdf_setocgstate = pdfconstant("SetOCGState")
+
+local lpdf_usage = pdfdictionary { Print = pdfdictionary { PrintState = 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
+-- at several moments.
local pdfln, pdfld = { }, { }
local textlayers, hidelayers, videlayers = pdfarray(), pdfarray(), pdfarray()
-local pagelayers = pdfdictionary()
+local pagelayers, pagelayersreference, cache = nil, nil, { }
-lpdf.layerreferences = pdfln
+local specifications = { }
+local initialized = { }
-function backends.pdf.layerreference(name)
- return pdfln[name]
+function codeinjections.defineviewerlayer(specification)
+ if viewerlayers.supported and textlayers then
+ local tag = specification.tag
+ if not specifications[tag] then
+ specifications[tag] = specification
+ end
+ end
end
-function codeinjections.defineviewerlayer(specification)
- if textlayers then
+local function useviewerlayer(name)
+ local specification = specifications[name]
+ if not environment.initex and specification and not initialized[name] then
+ specifications[name] = nil -- or not
+ initialized [name] = true
+ if not pagelayers then
+ pagelayers = pdfdictionary()
+ pagelayersreference = pdfreserveobject()
+ end
local tag = specification.tag
-- todo: reserve
- local n = pdfdictionary {
+ local nn = pdfreserveobject()
+ local nr = pdfreference(nn)
+ local nd = pdfdictionary {
Type = pdf_ocg,
Name = specification.title or "unknown",
- Intent = ((specification.kind > 0) and pdf_design) or nil, -- disable layer hiding by user
- Usage = ((specification.printable == variables.no) and lpdf_usage) or nil , -- printable or not
+ 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
}
- local nr = pdfreference(pdfflushobject(n))
+ cache[#cache+1] = { nn, nd }
pdfln[tag] = nr -- was n
- local d = pdfdictionary {
+ local dn = pdfreserveobject()
+ local dr = pdfreference(dn)
+ local dd = pdfdictionary {
Type = pdf_ocmd,
OCGs = pdfarray { nr },
}
- local dr = pdfreference(pdfflushobject(d))
+ cache[#cache+1] = { dn, dd }
pdfld[tag] = dr
textlayers[#textlayers+1] = nr
- if specification.visible == variables.start then
+ if specification.visible == v_start then
videlayers[#videlayers+1] = nr
else
hidelayers[#hidelayers+1] = nr
@@ -82,36 +109,61 @@ function codeinjections.defineviewerlayer(specification)
end
end
+codeinjections.useviewerlayer = useviewerlayer
+
+local function layerreference(name)
+ local r = pdfln[name]
+ if r then
+ return r
+ else
+ useviewerlayer(name)
+ return pdfln[name]
+ end
+end
+
+lpdf.layerreference = layerreference -- also triggered when a hide or vide happens
+
local function flushtextlayers()
- if textlayers and #textlayers > 0 then
- local d = pdfdictionary {
- OCGs = textlayers,
- D = pdfdictionary {
- Order = textlayers,
- ON = videlayers,
- OFF = hidelayers,
- },
- }
- lpdf.addtocatalog("OCProperties",d)
- textlayers = nil
+ if viewerlayers.supported then
+ if pagelayers then
+ pdfflushobject(pagelayersreference,pagelayers)
+ end
+ for i=1,#cache do
+ local ci = cache[i]
+ pdfflushobject(ci[1],ci[2])
+ end
+ if textlayers and #textlayers > 0 then -- we can group them if needed, like: layout
+ local d = pdfdictionary {
+ OCGs = textlayers,
+ D = pdfdictionary {
+ Name = "Document",
+ Order = (viewerlayers.hasorder and textlayers) or nil,
+ ON = videlayers,
+ OFF = hidelayers,
+ BaseState = pdf_on,
+ },
+ }
+ lpdf.addtocatalog("OCProperties",d)
+ textlayers = nil
+ end
end
end
-local function flushpagelayers()
- if next(pagelayers) then
- lpdf.addtopageresources("Properties",pagelayers)
+local function flushpagelayers() -- we can share these
+ if pagelayers then
+ lpdf.addtopageresources("Properties",pdfreference(pagelayersreference)) -- we could cache this
end
end
-lpdf.registerpagefinalizer (flushpagelayers)
-lpdf.registerdocumentfinalizer(flushtextlayers)
+lpdf.registerpagefinalizer (flushpagelayers,"layers")
+lpdf.registerdocumentfinalizer(flushtextlayers,"layers")
local function setlayer(what,arguments)
-- maybe just a gmatch of even better, earlier in lpeg
- arguments = (type(arguments) == "table" and arguments) or aux.settings_to_array(arguments)
+ arguments = (type(arguments) == "table" and arguments) or settings_to_array(arguments)
local state = pdfarray { what }
for i=1,#arguments do
- local p = pdfln[arguments[i]]
+ local p = layerreference(arguments[i])
if p then
state[#state+1] = p
end
@@ -122,9 +174,9 @@ local function setlayer(what,arguments)
}
end
-function executers.hidelayer (arguments) setlayer(pdf_off, arguments) end
-function executers.videlayer (arguments) setlayer(pdf_on, arguments) end
-function executers.togglelayer(arguments) setlayer(pdf_toggle,arguments) end
+function executers.hidelayer (arguments) return setlayer(pdf_off, arguments) end
+function executers.videlayer (arguments) return setlayer(pdf_on, arguments) end
+function executers.togglelayer(arguments) return setlayer(pdf_toggle,arguments) end
-- transitions
@@ -173,24 +225,26 @@ local last = 0
function codeinjections.setpagetransition(specification)
local n, delay = specification.n, specification.delay
- if n == variables.auto then
+ if not n or n == "" then
+ return -- let's forget about it
+ elseif n == v_auto then
if last >= #pagetransitions then
last = 0
end
n = last + 1
- elseif n == variables.stop then
+ elseif n == v_stop then
return
- elseif n == variables.reset then
+ elseif n == v_reset then
last = 0
return
- elseif n == variables.random then
+ elseif n == v_random then
n = math.random(1,#pagetransitions)
else
n = tonumber(n)
end
local t = n and pagetransitions[n] or pagetransitions[1]
if not t then
- t = aux.settings_to_array(n)
+ t = settings_to_array(n)
end
if t and #t > 0 then
local d = pdfdictionary()
diff --git a/Master/texmf-dist/tex/context/base/lpdf-swf.lua b/Master/texmf-dist/tex/context/base/lpdf-swf.lua
index 9fe0cd09fc8..04825446c3e 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-swf.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-swf.lua
@@ -9,101 +9,195 @@ if not modules then modules = { } end modules ['lpdf-swf'] = {
-- The following code is based on tests by Luigi Scarso. His prototype
-- was using tex code. This is the official implementation.
-local format = string.format
+local format, gsub = string.format, string.gsub
-local pdfconstant = lpdf.constant
-local pdfboolean = lpdf.boolean
-local pdfstring = lpdf.string
-local pdfunicode = lpdf.unicode
-local pdfdictionary = lpdf.dictionary
-local pdfarray = lpdf.array
-local pdfnull = lpdf.null
-local pdfreference = lpdf.reference
+local backends, lpdf = backends, lpdf
-function backends.pdf.helpers.insertswf(spec)
+local pdfconstant = lpdf.constant
+local pdfboolean = lpdf.boolean
+local pdfstring = lpdf.string
+local pdfunicode = lpdf.unicode
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfnull = lpdf.null
+local pdfreference = lpdf.reference
+local pdfimmediateobject = lpdf.immediateobject
- local width, height, filename = spec.width, spec.height, spec.foundname
+local checkedkey = lpdf.checkedkey
- local eref = backends.codeinjections.embedfile(filename)
+local codeinjections = backends.pdf.codeinjections
+local nodeinjections = backends.pdf.nodeinjections
+
+local pdfannotation_node = nodes.pool.pdfannotation
+
+local activations = {
+ click = "XA",
+ page = "PO",
+ focus = "PV",
+}
+
+local deactivations = {
+ click = "XD",
+ page = "PI",
+ focus = "PC",
+}
+
+table.setmetatableindex(activations, function() return activations .click end)
+table.setmetatableindex(deactivations,function() return deactivations.focus end)
+
+local function insertswf(spec)
+
+ local width = spec.width
+ local height = spec.height
+ local filename = spec.foundname
+ local resources = spec.resources
+ local display = spec.display
+ local controls = spec.controls
+
+ local resources = resources and parametersets[resources]
+ local display = display and parametersets[display]
+ local controls = controls and parametersets[controls] -- not yet used
+
+ local preview = checkedkey(display,"preview","string")
+ local toolbar = checkedkey(display,"toolbar","boolean")
+
+ local embeddedreference = codeinjections.embedfile { file = filename }
local flash = pdfdictionary {
Subtype = pdfconstant("Flash"),
Instances = pdfarray {
pdfdictionary {
- Asset = eref,
+ Asset = embeddedreference,
Params = pdfdictionary {
- Binding = pdfconstant("Foreground")
+ Binding = pdfconstant("Background") -- Foreground makes swf behave erratic
}
},
},
}
- local fref = pdfreference(pdf.immediateobj(tostring(flash)))
+ local flashreference = pdfreference(pdfimmediateobject(tostring(flash)))
local configuration = pdfdictionary {
- Configurations = pdfarray { fref },
+ Configurations = pdfarray { flashreference },
Assets = pdfdictionary {
Names = pdfarray {
pdfstring(filename),
- eref,
+ embeddedreference,
}
},
}
- local cref = pdfreference(pdf.immediateobj(tostring(configuration)))
+ if resources then
+ local names = configuration.Assets.Names
+ local function add(filename)
+ local filename = gsub(filename,"%./","")
+ local embeddedreference = codeinjections.embedfile { file = filename, keepdir = true }
+ names[#names+1] = pdfstring(filename)
+ names[#names+1] = embeddedreference
+ end
+ local paths = resources.paths
+ if paths then
+ for i=1,#paths do
+ local files = dir.glob(paths[i] .. "/**")
+ for i=1,#files do
+ add(files[i])
+ end
+ end
+ end
+ local files = resources.files
+ if files then
+ for i=1,#files do
+ add(files[i])
+ end
+ end
+ end
+
+ local configurationreference = pdfreference(pdfimmediateobject(tostring(configuration)))
local activation = pdfdictionary {
- Activation = pdfdictionary {
- Type = pdfconstant("RichMediaActivation"),
- Condition = pdfconstant("PO"),
- Configuration = fref,
- Animation = pdfdictionary {
- Subtype = pdfconstant("Linear"),
- Speed = 1,
- Playcount = 1,
- },
- Deactivation = pdfdictionary {
- Type = pdfconstant("RichMediaDeactivation"),
- Condition = pdfconstant("XD"),
- },
- Presentation = pdfdictionary {
- PassContextClick = false,
- Style = pdfconstant("Embedded"),
- Toolbar = false,
- NavigationPane = false,
- Transparent = true,
- Window = pdfdictionary {
- Type = pdfconstant("RichMediaWindow"),
- Width = pdfdictionary {
- Default = 100,
- Min = 100,
- Max = 100,
- },
- Height = pdfdictionary {
- Default = 100,
- Min = 100,
- Max = 100,
- },
- Position = pdfdictionary {
- Type = pdfconstant("RichMediaPosition"),
- HAlign = pdfconstant("Near"),
- VAlign = pdfconstant("Near"),
- HOffset = 0,
- VOffset = 0,
- }
+ Type = pdfconstant("RichMediaActivation"),
+ Condition = pdfconstant(activations[display.open]),
+ Configuration = flashreference,
+ Animation = pdfdictionary {
+ Subtype = pdfconstant("Linear"),
+ Speed = 1,
+ Playcount = 1,
+ },
+ Presentation = pdfdictionary {
+ PassContextClick = false,
+ Style = pdfconstant("Embedded"),
+ Toolbar = toolbar,
+ NavigationPane = false,
+ Transparent = true,
+ Window = pdfdictionary {
+ Type = pdfconstant("RichMediaWindow"),
+ Width = pdfdictionary {
+ Default = 100,
+ Min = 100,
+ Max = 100,
+ },
+ Height = pdfdictionary {
+ Default = 100,
+ Min = 100,
+ Max = 100,
+ },
+ Position = pdfdictionary {
+ Type = pdfconstant("RichMediaPosition"),
+ HAlign = pdfconstant("Near"),
+ VAlign = pdfconstant("Near"),
+ HOffset = 0,
+ VOffset = 0,
}
}
- }
+ },
+ -- View
+ -- Scripts
+ }
+
+ local deactivation = pdfdictionary {
+ Type = pdfconstant("RichMediaDeactivation"),
+ Condition = pdfconstant(deactivations[display.close]),
+ }
+
+ local richmediasettings = pdfdictionary {
+ Type = pdfconstant("RichMediaSettings"),
+ Activation = activation,
+ Deactivation = deactivation,
}
- local aref = pdfreference(pdf.immediateobj(tostring(activation)))
+ local settingsreference = pdfreference(pdfimmediateobject(tostring(richmediasettings)))
+
+ local appearance
+
+ if preview then
+ local figure = codeinjections.getpreviewfigure { name = preview, width = width, height = height }
+ if figure then
+ local image = img.package(figure.status.private)
+ appearance = pdfdictionary { N = pdfreference(image.objnum) }
+ end
+ end
local annotation = pdfdictionary {
- Subtype = pdfconstant("RichMedia"),
- RichMediaContent = cref,
- RichMediaSettings = aref,
+ Subtype = pdfconstant("RichMedia"),
+ RichMediaContent = configurationreference,
+ RichMediaSettings = settingsreference,
+ AP = appearance,
}
return annotation, nil, nil
end
+
+function backends.pdf.nodeinjections.insertswf(spec)
+ local annotation, preview, ref = insertswf {
+ foundname = spec.foundname,
+ width = spec.width,
+ height = spec.height,
+ display = spec.display,
+ controls = spec.controls,
+ resources = spec.resources,
+ -- factor = spec.factor,
+ -- label = spec.label,
+ }
+ node.write(pdfannotation_node(spec.width,spec.height,0,annotation()))
+end
diff --git a/Master/texmf-dist/tex/context/base/lpdf-tag.lua b/Master/texmf-dist/tex/context/base/lpdf-tag.lua
new file mode 100644
index 00000000000..06f3377bceb
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/lpdf-tag.lua
@@ -0,0 +1,308 @@
+if not modules then modules = { } end modules ['lpdf-tag'] = {
+ version = 1.001,
+ comment = "companion to lpdf-tag.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format, match, concat = string.format, string.match, table.concat
+local lpegmatch = lpeg.match
+local utfchar = utf.char
+
+local trace_tags = false trackers.register("structures.tags", function(v) trace_tags = v end)
+
+local report_tags = logs.reporter("backend","tags")
+
+local backends, lpdf, nodes = backends, lpdf, nodes
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+
+local tasks = nodes.tasks
+
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfboolean = lpdf.boolean
+local pdfconstant = lpdf.constant
+local pdfreference = lpdf.reference
+local pdfunicode = lpdf.unicode
+local pdfstring = lpdf.string
+local pdfflushobject = lpdf.flushobject
+local pdfreserveobject = lpdf.reserveobject
+local pdfpagereference = lpdf.pagereference
+
+local nodepool = nodes.pool
+
+local pdfliteral = nodepool.pdfliteral
+
+local nodecodes = nodes.nodecodes
+
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local glyph_code = nodecodes.glyph
+
+local a_tagged = attributes.private('tagged')
+local a_image = attributes.private('image')
+
+local has_attribute, set_attribute, traverse_nodes, traverse_id = node.has_attribute, node.set_attribute, node.traverse, node.traverse_id
+local tosequence = nodes.tosequence
+local copy_node, slide_nodelist = node.copy, node.slide
+
+local structure_stack = { }
+local structure_kids = pdfarray()
+local structure_ref = pdfreserveobject()
+local parent_ref = pdfreserveobject()
+local root = { pref = pdfreference(structure_ref), kids = structure_kids }
+local tree = { }
+local elements = { }
+local names = pdfarray()
+local taglist = structures.tags.taglist
+local usedlabels = structures.tags.labels
+local properties = structures.tags.properties
+local usedmapping = { }
+
+local colonsplitter = lpeg.splitat(":")
+local dashsplitter = lpeg.splitat("-")
+
+local add_ids = false -- true
+
+
+--~ function codeinjections.maptag(original,target,kind)
+--~ mapping[original] = { target, kind or "inline" }
+--~ end
+
+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] = pdfreference(pdfflushobject(tree[i]))
+ end
+ local parenttree = pdfdictionary {
+ Nums = nums
+ }
+ -- we need to split names into smaller parts (e.g. alphabetic or so)
+ if add_ids then
+ local kids = pdfdictionary {
+ Limits = pdfarray { names[1], names[#names-1] },
+ Names = names,
+ }
+ local idtree = pdfdictionary {
+ Kids = pdfarray { pdfreference(pdfflushobject(kids)) },
+ }
+ end
+ --
+ local rolemap = pdfdictionary()
+ for k, v in next, usedmapping do
+ k = usedlabels[k] or k
+ local p = properties[k]
+ rolemap[k] = pdfconstant(p and p.pdf or "Span") -- or "Div"
+ end
+ local structuretree = pdfdictionary {
+ Type = pdfconstant("StructTreeRoot"),
+ K = pdfreference(pdfflushobject(structure_kids)),
+ ParentTree = pdfreference(pdfflushobject(parent_ref,parenttree)),
+ IDTree = (add_ids and pdfreference(pdfflushobject(idtree))) or nil,
+ RoleMap = rolemap,
+ }
+ pdfflushobject(structure_ref,structuretree)
+ lpdf.addtocatalog("StructTreeRoot",pdfreference(structure_ref))
+ --
+ local markinfo = pdfdictionary {
+ Marked = pdfboolean(true),
+ -- UserProperties = pdfboolean(true),
+ -- Suspects = pdfboolean(true),
+ }
+ lpdf.addtocatalog("MarkInfo",pdfreference(pdfflushobject(markinfo)))
+ --
+ for fulltag, element in next, elements do
+ pdfflushobject(element.knum,element.kids)
+ end
+ end
+end
+
+lpdf.registerdocumentfinalizer(finishstructure,"document structure")
+
+local index, pageref, pagenum, list = 0, nil, 0, nil
+
+local pdf_mcr = pdfconstant("MCR")
+local pdf_struct_element = pdfconstant("StructElem")
+
+local function initializepage()
+ index = 0
+ pagenum = tex.count.realpageno
+ pageref = pdfreference(pdfpagereference(pagenum))
+ list = pdfarray()
+ tree[pagenum] = list -- we can flush after done, todo
+end
+
+local function finishpage()
+ -- flush what can be flushed
+ lpdf.addtopageattributes("StructParents",pagenum-1)
+end
+
+-- here we can flush and free elements that are finished
+
+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 d = pdfdictionary {
+ Type = pdf_struct_element,
+ S = pdfconstant(tg),
+ ID = (add_ids and fulltag) or nil,
+ T = detail and detail or nil,
+ P = parent.pref,
+ Pg = pageref,
+ K = pdfreference(r),
+ -- Alt = " Who cares ",
+ -- ActualText = " Hi Hans ",
+ }
+ local s = pdfreference(pdfflushobject(d))
+ if add_ids then
+ names[#names+1] = fulltag
+ names[#names+1] = s
+ end
+ local kids = parent.kids
+ kids[#kids+1] = s
+ elements[fulltag] = { tag = tag, pref = s, kids = k, knum = r, pnum = pagenum }
+end
+
+local function makecontent(parent,start,stop,slist,id)
+ local tag, kids = parent.tag, parent.kids
+ local last = index
+ if id == "image" then
+ local d = pdfdictionary {
+ Type = pdf_mcr,
+ Pg = pageref,
+ MCID = last,
+ Alt = "image",
+ }
+ kids[#kids+1] = d
+ elseif pagenum == parent.pnum then
+ kids[#kids+1] = last
+ else
+ local d = pdfdictionary {
+ Type = pdf_mcr,
+ Pg = pageref,
+ MCID = last,
+ }
+ -- kids[#kids+1] = pdfreference(pdfflushobject(d))
+ kids[#kids+1] = d
+ end
+ --
+ local bliteral = pdfliteral(format("/%s <</MCID %s>>BDC",tag,last))
+ local prev = start.prev
+ if prev then
+ prev.next, bliteral.prev = bliteral, prev
+ end
+ start.prev, bliteral.next = bliteral, start
+ if slist and slist.list == start then
+ slist.list = bliteral
+ elseif not prev then
+ report_tags("this can't happen: injection in front of nothing")
+ end
+ --
+ local eliteral = pdfliteral("EMC")
+ local next = stop.next
+ if next then
+ next.prev, eliteral.next = eliteral, next
+ end
+ stop.next, eliteral.prev = eliteral, stop
+ --
+ index = index + 1
+ list[index] = parent.pref
+ return bliteral, eliteral
+end
+
+-- -- --
+
+local level, last, ranges, range = 0, nil, { }, nil
+
+local function collectranges(head,list)
+ for n in traverse_nodes(head) do
+ local id = n.id -- 14: image, 8: literal (mp)
+ if id == glyph_code then
+ local at = has_attribute(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 = has_attribute(n,a_image)
+ if at then
+ local at = has_attribute(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 = n.list
+ 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()
+ 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]
+ if tags then -- not ok ... only first lines
+ report_tags("%s => %s : %05i %s",tosequence(start,start),tosequence(stop,stop),attr,concat(tags," "))
+ end
+ end
+ end
+ 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)
+ 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
+ end
+ end
+ finishpage()
+ -- can be separate feature
+ --
+ -- injectspans(head) -- does to work yet
+ --
+ return head, true
+end
+
+function codeinjections.enabletags(tg,lb)
+ structures.tags.handler = nodeinjections.addtags
+ tasks.enableaction("shipouts","structures.tags.handler")
+ tasks.enableaction("shipouts","nodes.handlers.accessibility")
+ tasks.enableaction("math","noads.handlers.tags")
+ if trace_tags then
+ report_tags("enabling structure tags")
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/lpdf-u3d.lua b/Master/texmf-dist/tex/context/base/lpdf-u3d.lua
index f7a62c6c904..f5a2bc2fa9a 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-u3d.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-u3d.lua
@@ -13,22 +13,31 @@ if not modules then modules = { } end modules ['lpdf-u3d'] = {
-- an overhaul. There are some messy leftovers that will be
-- removed in future versions.
+-- For some reason no one really tested this code so at some
+-- point we will end up with a reimplementation. For instance
+-- it makes sense to add the same activation code as with swf.
+
local format, find = string.format, string.find
local cos, sin, sqrt, pi, atan2, abs = math.cos, math.sin, math.sqrt, math.pi, math.atan2, math.abs
-local pdfconstant = lpdf.constant
-local pdfboolean = lpdf.boolean
-local pdfnumber = lpdf.number
-local pdfunicode = lpdf.unicode
-local pdfdictionary = lpdf.dictionary
-local pdfarray = lpdf.array
-local pdfnull = lpdf.null
-local pdfreference = lpdf.reference
+local backends, lpdf = backends, lpdf
+
+local nodeinjections = backends.pdf.nodeinjections
+
+local pdfconstant = lpdf.constant
+local pdfboolean = lpdf.boolean
+local pdfnumber = lpdf.number
+local pdfunicode = lpdf.unicode
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfnull = lpdf.null
+local pdfreference = lpdf.reference
+local pdfimmediateobject = lpdf.immediateobject
-local pdfimmediateobj = pdf.immediateobj
+local checkedkey = lpdf.checkedkey
+local limited = lpdf.limited
-local checkedkey = lpdf.checkedkey
-local limited = lpdf.limited
+local pdfannotation_node = nodes.pool.pdfannotation
local schemes = table.tohash {
"Artwork", "None", "White", "Day", "Night", "Hard",
@@ -338,7 +347,7 @@ end
local stored_js, stored_3d, stored_pr, streams = { }, { }, { }, { }
-function backends.pdf.helpers.insert3d(spec) -- width, height, factor, display, controls, label, foundname
+local function insert3d(spec) -- width, height, factor, display, controls, label, foundname
local width, height, factor = spec.width, spec.height, spec.factor or number.dimenfactors.bp
local display, controls, label, foundname = spec.display, spec.controls, spec.label, spec.foundname
@@ -388,12 +397,12 @@ function backends.pdf.helpers.insert3d(spec) -- width, height, factor, display,
if js then
local jsref = stored_js[js]
if not jsref then
- jsref = pdfimmediateobj("streamfile",js)
+ jsref = pdfimmediateobject("streamfile",js)
stored_js[js] = jsref
end
attr.OnInstantiate = pdfreference(jsref)
end
- stored_3d[label] = pdfimmediateobj("streamfile",foundname,attr())
+ stored_3d[label] = pdfimmediateobject("streamfile",foundname,attr())
stream = 1
else
stream = stream + 1
@@ -456,7 +465,7 @@ function backends.pdf.helpers.insert3d(spec) -- width, height, factor, display,
},
ProcSet = pdfarray { pdfconstant("PDF"), pdfconstant("ImageC") },
}
- local pwd = pdfimmediateobj(
+ local pwd = pdfimmediateobject(
"stream",
format("q /GS gs %s 0 0 %s 0 0 cm /IM Do Q",
factor*width,factor*height),
@@ -472,3 +481,16 @@ function backends.pdf.helpers.insert3d(spec) -- width, height, factor, display,
return annot, nil, nil
end
end
+
+function nodeinjections.insertu3d(spec)
+ local annotation, preview, ref = insert3d { -- just spec
+ foundname = spec.foundname,
+ width = spec.width,
+ height = spec.height,
+ factor = spec.factor,
+ display = spec.display,
+ controls = spec.controls,
+ label = spec.label,
+ }
+ node.write(pdfannotation_node(spec.width,spec.height,0,annotation()))
+end
diff --git a/Master/texmf-dist/tex/context/base/lpdf-wid.lua b/Master/texmf-dist/tex/context/base/lpdf-wid.lua
index 40a81e7d4d9..d0247f49a73 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-wid.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-wid.lua
@@ -6,102 +6,154 @@ if not modules then modules = { } end modules ['lpdf-wid'] = {
license = "see context related readme files"
}
-local format, gmatch, gsub, find = string.format, string.gmatch, string.gsub, string.find
-local texsprint, ctxcatcodes, texbox, texcount = tex.sprint, tex.ctxcatcodes, tex.box, tex.count
-
-local nodeinjections = backends.pdf.nodeinjections
-local codeinjections = backends.pdf.codeinjections
-local registrations = backends.pdf.registrations
-
-local executers = jobreferences.executers
-local variables = interfaces.variables
-
-local pdfconstant = lpdf.constant
-local pdfdictionary = lpdf.dictionary
-local pdfarray = lpdf.array
-local pdfreference = lpdf.reference
-local pdfunicode = lpdf.unicode
-local pdfstring = lpdf.string
-local pdfcolorspec = lpdf.colorspec
-local pdfflushobject = lpdf.flushobject
-local pdfreserveobject = lpdf.reserveobject
-
-local pdfreserveobj = pdf.reserveobj
-local pdfimmediateobj = pdf.immediateobj
-
-local pdfannotation = nodes.pdfannotation
-
-local hpack_node, write_node = node.hpack, node.write
+local gmatch, gsub, find, lower, format = string.gmatch, string.gsub, string.find, string.lower, string.format
+local texbox, texcount = tex.box, tex.count
+local settings_to_array = utilities.parsers.settings_to_array
+local settings_to_hash = utilities.parsers.settings_to_hash
+
+local report_media = logs.reporter("backend","media")
+local report_attachment = logs.reporter("backend","attachment")
+
+local backends, lpdf, nodes = backends, lpdf, nodes
+
+local nodeinjections = backends.pdf.nodeinjections
+local codeinjections = backends.pdf.codeinjections
+local registrations = backends.pdf.registrations
+
+local executers = structures.references.executers
+local variables = interfaces.variables
+
+local v_hidden = variables.hidden
+local v_normal = variables.normal
+local v_auto = variables.auto
+local v_embed = variables.embed
+local v_unknown = variables.unknown
+local v_max = variables.max
+
+local pdfconstant = lpdf.constant
+local pdfdictionary = lpdf.dictionary
+local pdfarray = lpdf.array
+local pdfreference = lpdf.reference
+local pdfunicode = lpdf.unicode
+local pdfstring = lpdf.string
+local pdfboolean = lpdf.boolean
+local pdfcolorspec = lpdf.colorspec
+local pdfflushobject = lpdf.flushobject
+local pdfreserveannotation = lpdf.reserveannotation
+local pdfreserveobject = lpdf.reserveobject
+local pdfimmediateobject = lpdf.immediateobject
+local pdfpagereference = lpdf.pagereference
+local pdfshareobjectreference = lpdf.shareobjectreference
+
+local nodepool = nodes.pool
+
+local pdfannotation_node = nodepool.pdfannotation
+
+local hpack_node = node.hpack
+local write_node = node.write
+
+local pdf_border = pdfarray { 0, 0, 0 } -- can be shared
-- symbols
local presets = { } -- xforms
-function codeinjections.registersymbol(name,n)
+local function registersymbol(name,n)
presets[name] = pdfreference(n)
end
-function codeinjections.registeredsymbol(name)
+local function registeredsymbol(name)
return presets[name]
end
-function codeinjections.presetsymbol(symbol)
+local function presetsymbol(symbol)
if not presets[symbol] then
- texsprint(ctxcatcodes,format("\\predefinesymbol[%s]",symbol))
+ context.predefinesymbol { symbol }
end
end
-function codeinjections.presetsymbollist(list)
+local function presetsymbollist(list)
if list then
for symbol in gmatch(list,"[^, ]+") do
- codeinjections.presetsymbol(symbol)
+ presetsymbol(symbol)
end
end
end
+codeinjections.registersymbol = registersymbol
+codeinjections.registeredsymbol = registeredsymbol
+codeinjections.presetsymbol = presetsymbol
+codeinjections.presetsymbollist = presetsymbollist
+
-- comments
-local symbols = {
- New = pdfconstant("Insert"),
- Insert = pdfconstant("Insert"),
- Balloon = pdfconstant("Comment"),
+-- local symbols = {
+-- Addition = pdfconstant("NewParagraph"),
+-- Attachment = pdfconstant("Attachment"),
+-- Balloon = pdfconstant("Comment"),
+-- Check = pdfconstant("Check Mark"),
+-- CheckMark = pdfconstant("Check Mark"),
+-- Circle = pdfconstant("Circle"),
+-- Cross = pdfconstant("Cross"),
+-- CrossHairs = pdfconstant("Cross Hairs"),
+-- Graph = pdfconstant("Graph"),
+-- InsertText = pdfconstant("Insert Text"),
+-- New = pdfconstant("Insert"),
+-- Paperclip = pdfconstant("Paperclip"),
+-- RightArrow = pdfconstant("Right Arrow"),
+-- RightPointer = pdfconstant("Right Pointer"),
+-- Star = pdfconstant("Star"),
+-- Tag = pdfconstant("Tag"),
+-- Text = pdfconstant("Note"),
+-- TextNote = pdfconstant("Text Note"),
+-- UpArrow = pdfconstant("Up Arrow"),
+-- UpLeftArrow = pdfconstant("Up-Left Arrow"),
+-- }
+
+local attachment_symbols = {
+ Graph = pdfconstant("GraphPushPin"),
+ Paperclip = pdfconstant("PaperclipTag"),
+ Pushpin = pdfconstant("PushPin"),
+}
+
+attachment_symbols.PushPin = attachment_symbols.Pushpin
+attachment_symbols.Default = attachment_symbols.Pushpin
+
+local comment_symbols = {
Comment = pdfconstant("Comment"),
- Text = pdfconstant("Note"),
- Addition = pdfconstant("NewParagraph"),
- NewParagraph = pdfconstant("NewParagraph"),
Help = pdfconstant("Help"),
- Paragraph = pdfconstant("Paragraph"),
+ Insert = pdfconstant("Insert"),
Key = pdfconstant("Key"),
- Graph = pdfconstant("Graph"),
- Paperclip = pdfconstant("Paperclip"),
- Attachment = pdfconstant("Attachment"),
- Tag = pdfconstant("Tag"),
+ Newparagraph = pdfconstant("NewParagraph"),
+ Note = pdfconstant("Note"),
+ Paragraph = pdfconstant("Paragraph"),
}
-symbols[variables.normal] = pdfconstant("Note")
+comment_symbols.NewParagraph = Newparagraph
+comment_symbols.Default = Note
-local nofcomments, usepopupcomments, stripleading = 0, true, true
-
-local function analyzesymbol(symbol)
+local function analyzesymbol(symbol,collection)
if not symbol or symbol == "" then
- return symbols.normal, nil
- elseif symbols[symbol] then
- return symbols[symbol], nil
+ return collection.Default, nil
+ elseif collection[symbol] then
+ return collection[symbol], nil
else
- local set = aux.settings_to_array(symbol)
- local normal, down = set[1], set[2]
- if normal then
- normal = codeinjections.registeredsymbol(down or normal)
- end
- if down then
- down = codeinjections.registeredsymbol(normal)
- end
- if down or normal then
- return nil, pdfdictionary {
- N = normal,
- D = down,
- }
+ local setn, setr, setd
+ local set = settings_to_array(symbol)
+ if #set == 1 then
+ setn, setr, setd = set[1], set[1], set[1]
+ elseif #set == 2 then
+ setn, setr, setd = set[1], set[1], set[2]
+ else
+ setn, setr, setd = set[1], set[2], set[3]
end
+ local appearance = pdfdictionary {
+ N = setn and registeredsymbol(setn),
+ R = setr and registeredsymbol(setr),
+ D = setd and registeredsymbol(setd),
+ }
+ local appearanceref = pdfshareobjectreference(appearance)
+ return nil, appearanceref
end
end
@@ -109,113 +161,279 @@ local function analyzelayer(layer)
-- todo: (specification.layer ~= "" and pdfreference(specification.layer)) or nil, -- todo: ref to layer
end
-function codeinjections.registercomment(specification)
+local function analyzecolor(colorvalue,colormodel)
+ local cvalue = colorvalue and tonumber(colorvalue)
+ local cmodel = colormodel and tonumber(colormodel) or 3
+ return cvalue and pdfarray { lpdf.colorvalues(cmodel,cvalue) } or nil
+end
+
+local function analyzetransparency(transparencyvalue)
+ local tvalue = transparencyvalue and tonumber(transparencyvalue)
+ return tvalue and lpdf.transparencyvalue(tvalue) or nil
+end
+
+-- Attachments
+
+local nofattachments, attachments, filestreams, referenced = 0, { }, { }, { }
+
+local ignorereferenced = true -- fuzzy pdf spec .. twice in attachment list, can become an option
+
+local function flushembeddedfiles()
+ if next(filestreams) then
+ local e = pdfarray()
+ for tag, reference in next, filestreams do
+ if not reference then
+ report_attachment("unreferenced file: tag '%s'",tag)
+ elseif referenced[tag] == "hidden" then
+ e[#e+1] = pdfstring(tag)
+ e[#e+1] = reference -- already a reference
+ else
+ -- messy spec ... when annot not in named else twice in menu list acrobat
+ end
+ end
+ lpdf.addtonames("EmbeddedFiles",pdfreference(pdfflushobject(pdfdictionary{ Names = e })))
+ end
+end
+
+lpdf.registerdocumentfinalizer(flushembeddedfiles,"embeddedfiles")
+
+function codeinjections.embedfile(specification)
+ local data = specification.data
+ local filename = specification.file
+ local name = specification.name or ""
+ local title = specification.title or ""
+ local hash = specification.hash or filename
+ local keepdir = specification.keepdir -- can change
+ if filename == "" then
+ filename = nil
+ end
+ if data then
+ local r = filestreams[hash]
+ if r == false then
+ return nil
+ elseif r then
+ return r
+ elseif not filename then
+ filename = specification.tag
+ if not filename or filename == "" then
+ filename = specification.registered
+ end
+ if not filename or filename == "" then
+ filename = hash
+ end
+ end
+ else
+ if not filename then
+ return nil
+ end
+ local r = filestreams[hash]
+ if r == false then
+ return nil
+ elseif r then
+ return r
+ else
+ local foundname = resolvers.findbinfile(filename) or ""
+ if foundname == "" or not lfs.isfile(foundname) then
+ filestreams[filename] = false
+ return nil
+ else
+ specification.foundname = foundname
+ end
+ end
+ end
+ local basename = keepdir == true and filename or file.basename(filename)
+local basename = string.gsub(basename,"%./","")
+ local savename = file.addsuffix(name ~= "" and name or basename,"txt") -- else no valid file
+ local a = pdfdictionary { Type = pdfconstant("EmbeddedFile") }
+ local f
+ if data then
+ f = pdfimmediateobject("stream",data,a())
+ specification.data = true -- signal that still data but already flushed
+ else
+ local foundname = specification.foundname or filename
+ f = pdfimmediateobject("streamfile",foundname,a())
+ end
+ local d = pdfdictionary {
+ Type = pdfconstant("Filespec"),
+ F = pdfstring(savename),
+ UF = pdfstring(savename),
+ EF = pdfdictionary { F = pdfreference(f) },
+ Desc = title ~= "" and pdfunicode(title) or nil,
+ }
+ local r = pdfreference(pdfflushobject(d))
+ filestreams[hash] = r
+ return r
+end
+
+function nodeinjections.attachfile(specification)
+ local registered = specification.registered or "<unset>"
+ local data = specification.data
+ local hash
+ if data then
+ hash = md5.HEX(data)
+ else
+ local filename = specification.file
+ if not filename or filename == "" then
+ report_attachment("missing file specification: registered '%s', using registered instead",registered)
+ filename = registered
+ specification.file = registered
+ end
+ local foundname = resolvers.findbinfile(filename) or ""
+ if foundname == "" or not lfs.isfile(foundname) then
+ report_attachment("invalid file specification: registered '%s', filename '%s'",registered,filename)
+ return nil
+ else
+ specification.foundname = foundname
+ end
+ hash = filename
+ end
+ specification.hash = hash
+ nofattachments = nofattachments + 1
+ local registered = specification.registered or ""
+ local title = specification.title or ""
+ local subtitle = specification.subtitle or ""
+ local author = specification.author or ""
+ if registered == "" then
+ registered = filename
+ end
+ if author == "" then
+ author = title
+ title = ""
+ end
+ if author == "" then
+ author = v_unknown
+ end
+ if title == "" then
+ title = registered
+ end
+ local aref = attachments[registered]
+ if not aref then
+ aref = codeinjections.embedfile(specification)
+ attachments[registered] = aref
+ end
+ if not aref then
+ report_attachment("skipping: registered '%s'",registered)
+ -- already reported
+ elseif specification.method == v_hidden then
+ referenced[hash] = "hidden"
+ else
+ referenced[hash] = "annotation"
+ local name, appearance = analyzesymbol(specification.symbol,attachment_symbols)
+ local d = pdfdictionary {
+ Subtype = pdfconstant("FileAttachment"),
+ FS = aref,
+ Contents = pdfunicode(title),
+ Name = name,
+ NM = pdfstring(format("attachment:%s",nofattachments)),
+ T = author ~= "" and pdfunicode(author) or nil,
+ Subj = subtitle ~= "" and pdfunicode(subtitle) or nil,
+ C = analyzecolor(specification.colorvalue,specification.colormodel),
+ CA = analyzetransparency(specification.transparencyvalue),
+ AP = appearance,
+ OC = analyzelayer(specification.layer),
+ }
+ local width, height, depth = specification.width or 0, specification.height or 0, specification.depth
+ local box = hpack_node(pdfannotation_node(width,height,depth,d()))
+ box.width, box.height, box.depth = width, height, depth
+ return box
+ end
+end
+
+function codeinjections.attachmentid(filename) -- not used in context
+ return filestreams[filename]
+end
+
+local nofcomments, usepopupcomments, stripleading = 0, false, true
+
+local defaultattributes = {
+ ["xmlns"] = "http://www.w3.org/1999/xhtml",
+ ["xmlns:xfa"] = "http://www.xfa.org/schema/xfa-data/1.0/",
+ ["xfa:contentType"] = "text/html",
+ ["xfa:APIVersion"] = "Acrobat:8.0.0",
+ ["xfa:spec"] = "2.4",
+}
+
+local function checkcontent(text,option)
+ if option and option.xml then
+ local root = xml.convert(text)
+ if root and not root.er then
+ xml.checkbom(root)
+ local body = xml.first(root,"/body")
+ if body then
+ local at = body.at
+ for k, v in next, defaultattributes do
+ if not at[k] then
+ at[k] = v
+ end
+ end
+ -- local content = xml.textonly(root)
+ local richcontent = xml.tostring(root)
+ return nil, pdfunicode(richcontent)
+ end
+ end
+ end
+ return pdfunicode(text)
+end
+
+function nodeinjections.comment(specification) -- brrr: seems to be done twice
nofcomments = nofcomments + 1
- local text = buffers.collect(specification.buffer)
+ local text = string.strip(specification.data or "")
if stripleading then
text = gsub(text,"[\n\r] *","\n")
end
- local name, appearance = analyzesymbol(specification.symbol)
+ local name, appearance = analyzesymbol(specification.symbol,comment_symbols)
+ local tag = specification.tag or "" -- this is somewhat messy as recent
+ local title = specification.title or "" -- versions of acrobat see the title
+ local subtitle = specification.subtitle or "" -- as author
+ local author = specification.author or ""
+ local option = settings_to_hash(specification.option or "")
+ if author == "" then
+ if title == "" then
+ title = tag
+ end
+ else
+ if subtitle == "" then
+ subtitle = title
+ elseif title ~= "" then
+ subtitle = subtitle .. ", " .. title
+ end
+ title = author
+ end
+ local content, richcontent = checkcontent(text,option)
local d = pdfdictionary {
Subtype = pdfconstant("Text"),
- Open = specification.open,
- Contents = pdfunicode(text),
- T = (specification.title ~= "" and pdfunicode(specification.title)) or nil,
- C = pdfcolorspec(specification.colormodel,specification.colorvalue),
+ Open = option[v_max] and pdfboolean(true) or nil,
+ Contents = content,
+ RC = richcontent,
+ T = title ~= "" and pdfunicode(title) or nil,
+ Subj = subtitle ~= "" and pdfunicode(subtitle) or nil,
+ C = analyzecolor(specification.colorvalue,specification.colormodel),
+ CA = analyzetransparency(specification.transparencyvalue),
OC = analyzelayer(specification.layer),
Name = name,
+ NM = pdfstring(format("comment:%s",nofcomments)),
AP = appearance,
}
- -- watch the nice feed back to tex hack
+ local width, height, depth = specification.width or 0, specification.height or 0, specification.depth
+ local box
if usepopupcomments then
- local nd = pdfreserveobject()
- local nc = pdfreserveobject()
+ -- rather useless as we can hide/vide
+ local nd = pdfreserveannotation()
+ local nc = pdfreserveannotation()
local c = pdfdictionary {
Subtype = pdfconstant("Popup"),
Parent = pdfreference(nd),
}
d.Popup = pdfreference(nc)
- texbox["commentboxone"] = hpack_node(pdfannotation(0,0,0,d(),nd)) -- current dir
- texbox["commentboxtwo"] = hpack_node(pdfannotation(specification.width,specification.height,0,c(),nc)) -- current dir
+ box = hpack_node(
+ pdfannotation_node(0,0,0,d(),nd),
+ pdfannotation_node(width,height,depth,c(),nc)
+ )
else
- texbox["commentboxone"] = hpack_node(pdfannotation(0,0,0,d())) -- current dir
- texbox["commentboxtwo"] = nil
+ box = hpack_node(pdfannotation_node(width,height,depth,d()))
end
-end
-
---
-
-local nofattachments, attachments, filestreams = 0, { }, { }
-
-function codeinjections.embedfile(filename)
- local r = filestreams[filename]
- if r == false then
- return nil
- elseif r then
- return r
- elseif not lfs.isfile(filename) then
- interfaces.showmessage("interactions",5,filename)
- filestreams[filename] = false
- return nil
- else
- local basename = file.basename(filename)
- local a = pdfdictionary { Type = pdfconstant("EmbeddedFile") }
- local f = pdfimmediateobj("streamfile",filename,a())
- local d = pdfdictionary {
- Type = pdfconstant("Filespec"),
- F = pdfstring(newname or basename),
- UF = pdfstring(newname or basename),
- EF = pdfdictionary { F = pdfreference(f) },
- }
- local r = pdfreference(pdfflushobject(d))
- filestreams[filename] = r
- return r
- end
-end
-
-function codeinjections.attachfile(specification)
- local attachment = interactions.attachment(specification.label)
- if not attachment then
- -- todo: message
- return
- end
- local filename = attachment.filename
- if not filename or filename == "" then
- -- todo: message
- return
- end
- nofattachments = nofattachments + 1
- local label = attachment.label or ""
- local title = attachment.title or ""
- local newname = attachment.newname or ""
- if label == "" then label = filename end
- if title == "" then title = label end
- if newname == "" then newname = filename end
- local aref = attachments[label]
- if not aref then
- aref = codeinjections.embedfile(filename,newname)
- attachments[label] = aref
- end
- local name, appearance = analyzesymbol(specification.symbol)
- local d = pdfdictionary {
- Subtype = pdfconstant("FileAttachment"),
- FS = aref,
- Contents = pdfunicode(title),
- Name = name,
- AP = appearance,
- OC = analyzelayer(specification.layer),
- C = pdfcolorspec(specification.colormodel,specification.colorvalue),
- }
- -- as soon as we can ask for the dimensions of an xform we can
- -- use them here
- local width = specification.width or 0
- local height = specification.height or 0
- local depth = specification.depth or 0
- write_node(pdfannotation(width,height,depth,d()))
-end
-
-function codeinjections.attachmentid(filename)
- return filestreams[filename]
+ box.width, box.height, box.depth = width, height, depth -- redundant
+ return box
end
-- rendering stuff
@@ -239,12 +457,34 @@ end
-- smil application/smil
-- swf application/x-shockwave-flash
+-- P media play parameters (evt /BE for controls etc
+-- A boolean (audio)
+-- C boolean (captions)
+-- O boolean (overdubs)
+-- S boolean (subtitles)
+-- PL pdfconstant("ADBE_MCI"),
+
+-- F = flags,
+-- T = title,
+-- Contents = rubish,
+-- AP = irrelevant,
+
+-- sound is different, no window (or zero) so we need to collect them and
+-- force them if not set
+
local ms, mu, mf = { }, { }, { }
-local delayed = { }
+local function delayed(label)
+ local a = pdfreserveannotation()
+ mu[label] = a
+ return pdfreference(a)
+end
-local function insertrenderingwindow(label,width,height,specification)
- if options == variables.auto then
+local function insertrenderingwindow(specification)
+ local label = specification.label
+--~ local openpage = specification.openpage
+--~ local closepage = specification.closepage
+ if specification.option == v_auto then
if openpageaction then
-- \handlereferenceactions{\v!StartRendering{#2}}
end
@@ -255,97 +495,137 @@ local function insertrenderingwindow(label,width,height,specification)
local actions = nil
if openpage or closepage then
actions = pdfdictionary {
- PO = (openpage and lpdf.pdfaction(openpage )) or nil,
- PC = (closepage and lpdf.pdfaction(closepage)) or nil,
+ PO = (openpage and lpdf.action(openpage )) or nil,
+ PC = (closepage and lpdf.action(closepage)) or nil,
}
end
- local page = tonumber(specification.page) or texcount.realpageno
+ local page = tonumber(specification.page) or texcount.realpageno -- todo
+ local r = mu[label] or pdfreserveannotation() -- why the reserve here?
+ local a = pdfdictionary {
+ S = pdfconstant("Rendition"),
+ R = mf[label],
+ OP = 0,
+ AN = pdfreference(r),
+ }
local d = pdfdictionary {
Subtype = pdfconstant("Screen"),
- P = pdfreference(tex.pdfpageref(page)),
- A = mf[label],
- Border = pdfarray { 0, 0, 0 } ,
+ P = pdfreference(pdfpagereference(page)),
+ A = a, -- needed in order to make the annotation clickable (i.e. don't bark)
+ Border = pdf_border,
AA = actions,
}
- local r = pdfreserveobj("annot")
- write_node(pdfannotation(width,height,0,d(),r)) -- save ref
+ write_node(pdfannotation_node(specification.width or 0,specification.height or 0,0,d(),r)) -- save ref
return pdfreference(r)
end
+-- some dictionaries can have a MH (must honor) or BE (best effort) capsule
+
local function insertrendering(specification)
local label = specification.label
+ local option = settings_to_hash(specification.option)
if not mf[label] then
local filename = specification.filename
local isurl = find(filename,"://")
- local d = pdfdictionary {
+ --~ local start = pdfdictionary {
+ --~ Type = pdfconstant("MediaOffset"),
+ --~ S = pdfconstant("T"), -- time
+ --~ T = pdfdictionary { -- time
+ --~ Type = pdfconstant("Timespan"),
+ --~ S = pdfconstant("S"),
+ --~ V = 3, -- time in seconds
+ --~ },
+ --~ }
+ --~ local start = pdfdictionary {
+ --~ Type = pdfconstant("MediaOffset"),
+ --~ S = pdfconstant("F"), -- frame
+ --~ F = 100 -- framenumber
+ --~ }
+ --~ local start = pdfdictionary {
+ --~ Type = pdfconstant("MediaOffset"),
+ --~ S = pdfconstant("M"), -- mark
+ --~ M = "somemark",
+ --~ }
+ --~ local parameters = pdfdictionary {
+ --~ BE = pdfdictionary {
+ --~ B = start,
+ --~ }
+ --~ }
+ --~ local parameters = pdfdictionary {
+ --~ Type = pdfconstant(MediaPermissions),
+ --~ TF = pdfstring("TEMPALWAYS") }, -- TEMPNEVER TEMPEXTRACT TEMPACCESS TEMPALWAYS
+ --~ }
+ local descriptor = pdfdictionary {
+ Type = pdfconstant("Filespec"),
+ F = filename,
+ }
+ if isurl then
+ descriptor.FS = pdfconstant("URL")
+ elseif option[v_embed] then
+ descriptor.EF = codeinjections.embedfile { file = filename }
+ end
+ local clip = pdfdictionary {
+ Type = pdfconstant("MediaClip"),
+ S = pdfconstant("MCD"),
+ N = label,
+ CT = specification.mime,
+ Alt = pdfarray { "", "file not found" }, -- language id + message
+ D = pdfreference(pdfflushobject(descriptor)),
+ -- P = pdfreference(pdfflushobject(parameters)),
+ }
+ local rendition = pdfdictionary {
Type = pdfconstant("Rendition"),
S = pdfconstant("MR"),
- C = pdfdictionary {
- Type = pdfconstant("MediaClip"),
- S = pdfconstant("MCD"),
- N = label,
- CT = specification.mime,
- Alt = pdfarray {
- "", "file not found", -- language id + message
- },
- D = pdfdictionary {
- Type = pdfconstant("Filespec"),
- F = filename,
- FS = (isurl and pdfconstant("URL")) or nil,
- }
- }
+ N = label,
+ C = pdfreference(pdfflushobject(clip)),
}
- mf[label] = pdfreference(pdfflushobject(d))
- if not ms[label] then
- mu[label] = insertrenderingwindow(label,0,0,specification.options)
- end
+ mf[label] = pdfreference(pdfflushobject(rendition))
end
end
-local function insertrenderingobject(specification)
+local function insertrenderingobject(specification) -- todo
local label = specification.label
if not mf[label] then
- local d = pdfdictionary {
+ report_media("todo: unknown medium '%s'",label or "?")
+ local clip = pdfdictionary { -- does not work that well one level up
+ Type = pdfconstant("MediaClip"),
+ S = pdfconstant("MCD"),
+ N = label,
+ D = pdfreference(unknown), -- not label but objectname, hm .. todo?
+ }
+ local rendition = pdfdictionary {
Type = pdfconstant("Rendition"),
S = pdfconstant("MR"),
- C = pdfdictionary {
- Type = pdfconstant("MediaClip"),
- S = pdfconstant("MCD"),
- N = label,
- D = pdfreference(unknown), -- not label but objectname, hm
- }
+ N = label,
+ C = pdfreference(pdfflushobject(clip)),
}
- mf[label] = pdfreference(pdfflushobject(d))
- if ms[label] then
- insertrenderingwindow(label,0,0,specification)
- end
+ mf[label] = pdfreference(pdfflushobject(rendition))
end
end
-function codeinjections.insertrenderingwindow(specification)
- local label = specification.label
- codeinjections.processrendering(label) -- was check at tex end
- ms[label] = insertrenderingwindow(label,specification.width,specification.height,specification)
-end
-
function codeinjections.processrendering(label)
- local specification = interactions.rendering(label)
- if specification then
- if specification.kind == "external" then
- insertrendering(specification)
- else
- insertrenderingobject(specification)
- end
+ local specification = interactions.renderings.rendering(label)
+ if not specification then
+ -- error
+ elseif specification.type == "external" then
+ insertrendering(specification)
+ else
+ insertrenderingobject(specification)
end
end
+function codeinjections.insertrenderingwindow(specification)
+ local label = specification.label
+ codeinjections.processrendering(label)
+ ms[label] = insertrenderingwindow(specification)
+end
+
local function set(operation,arguments)
- codeinjections.processrendering(arguments) -- was check at the tex end
+ codeinjections.processrendering(arguments)
return pdfdictionary {
S = pdfconstant("Rendition"),
OP = operation,
R = mf[arguments],
- AN = ms[arguments] or mu[arguments],
+ AN = ms[arguments] or delayed(arguments),
}
end
diff --git a/Master/texmf-dist/tex/context/base/lpdf-xmp.lua b/Master/texmf-dist/tex/context/base/lpdf-xmp.lua
index c8e7b2b5733..c9bead8a5b3 100644
--- a/Master/texmf-dist/tex/context/base/lpdf-xmp.lua
+++ b/Master/texmf-dist/tex/context/base/lpdf-xmp.lua
@@ -12,8 +12,16 @@ local xmlfillin = xml.fillin
local trace_xmp = false trackers.register("backend.xmp", function(v) trace_xmp = v end)
+local report_xmp = logs.reporter("backend","xmp")
+
+local backends, lpdf = backends, lpdf
+
+local codeinjections = backends.pdf.codeinjections -- normally it is registered
+
local pdfdictionary = lpdf.dictionary
local pdfconstant = lpdf.constant
+local pdfreference = lpdf.reference
+local pdfobject = lpdf.object
-- i wonder why this begin end is empty / w (no time now to look into it)
@@ -69,18 +77,31 @@ local mapping = {
-- maybe some day we will load the xmp file at runtime
-local xmp, xmpfile, xmpname = nil, nil, "lpdf-xmp.xml"
+local xmp, xmpfile, xmpname = nil, nil, "lpdf-pdx.xml"
-function lpdf.setxmpfile(name)
- xmpfile = resolvers.findctxfile(name) or ""
- if xmpfile == "" then
- xmpfile = nil
+local function setxmpfile(name)
+ if xmp then
+ report_xmp("discarding loaded file '%s'",xmpfile)
+ xmp = nil
end
+ xmpfile = name ~= "" and name
end
+codeinjections.setxmpfile = setxmpfile
+commands.setxmpfile = setxmpfile
+
local function valid_xmp()
if not xmp then
- local xmpfile = xmpfile or resolvers.find_file(xmpname) or ""
+ -- local xmpfile = xmpfile or resolvers.findfile(xmpname) or ""
+ if xmpfile and xmpfile ~= "" then
+ xmpfile = resolvers.findfile(xmpfile) or ""
+ end
+ if not xmpfile or xmpfile == "" then
+ xmpfile = resolvers.findfile(xmpname) or ""
+ end
+ if xmpfile ~= "" then
+ report_xmp("using file '%s'",xmpfile)
+ end
local xmpdata = (xmpfile ~= "" and io.loaddata(xmpfile)) or ""
xmp = xml.convert(xmpdata)
end
@@ -119,47 +140,64 @@ end
local t = { } for i=1,24 do t[i] = random() end
local function flushxmpinfo()
-
commands.freezerandomseed(os.clock()) -- hack
local t = { } for i=1,24 do t[i] = char(96 + random(26)) end
local packetid = concat(t)
- local time = lpdf.timestamp()
- addxmpinfo("Producer",format("LuaTeX-%0.2f.%s",tex.luatexversion/100,tex.luatexrevision))
- addxmpinfo("DocumentID",format("uuid:%s",os.uuid()))
- addxmpinfo("InstanceID",format("uuid:%s",os.uuid()))
- addxmpinfo("CreatorTool","LuaTeX + ConTeXt MkIV")
- addxmpinfo("CreateDate",time)
- addxmpinfo("ModifyDate",time)
- addxmpinfo("MetadataDate",time)
- addxmpinfo("PTEX.Fullbanner", tex.pdftexbanner)
+
+ local documentid = format("uuid:%s",os.uuid())
+ local instanceid = format("uuid:%s",os.uuid())
+ 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.*","")
+
+ addxmpinfo("DocumentID", documentid)
+ addxmpinfo("InstanceID", instanceid)
+ addxmpinfo("Producer", producer)
+ addxmpinfo("CreatorTool", creator)
+ addxmpinfo("CreateDate", time)
+ addxmpinfo("ModifyDate", time)
+ addxmpinfo("MetadataDate", time)
+ addxmpinfo("PTEX.Fullbanner", fullbanner)
+
+ addtoinfo("Producer", producer)
+ addtoinfo("Creator", creator)
+ addtoinfo("CreationDate", time)
+ addtoinfo("ModDate", time)
+-- addtoinfo("PTEX.Fullbanner", fullbanner) -- no checking done on existence
+
local blob = xml.tostring(xml.first(xmp or valid_xmp(),"/x:xmpmeta"))
local md = pdfdictionary {
Subtype = pdfconstant("XML"),
Type = pdfconstant("Metadata"),
}
if trace_xmp then
- commands.writestatus("system","xmp data flushed (see log file)")
+ report_xmp("data flushed (see log file)")
texio.write_nl("log","")
texio.write("log","\n% ",(gsub(blob,"[\r\n]","\n%% ")),"\n")
end
blob = format(xpacket,packetid,blob)
- if tex.pdfcompresslevel > 0 then
+ if not verbose and tex.pdfcompresslevel > 0 then
blob = gsub(blob,">%s+<","><")
end
- local r = pdf.obj {
+ local r = pdfobject {
immediate = true,
compresslevel = 0,
type = "stream",
string = blob,
attr = md(),
}
- lpdf.addtocatalog("Metadata",lpdf.reference(r))
+ lpdf.addtocatalog("Metadata",pdfreference(r))
commands.defrostrandomseed() -- hack
-
end
-- his will be enabled when we can inhibit compression for a stream at the lua end
-lpdf.registerdocumentfinalizer(flushxmpinfo,1)
+lpdf.registerdocumentfinalizer(flushxmpinfo,1,"metadata")
+
+directives.register("backend.verbosexmp", function(v)
+ verbose = v
+end)
diff --git a/Master/texmf-dist/tex/context/base/luat-bas.mkiv b/Master/texmf-dist/tex/context/base/luat-bas.mkiv
index 581a5d95a09..d5075b4cbd9 100644
--- a/Master/texmf-dist/tex/context/base/luat-bas.mkiv
+++ b/Master/texmf-dist/tex/context/base/luat-bas.mkiv
@@ -11,28 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-% \writestatus{loading}{ConTeXt Lua Macros / Basic Lua Libraries}
-
-%D This will move cq. become configurable. The XML like output is just
-%D an example.
-
-% todo \let\normaleverytoks\everytoks \newtoks\everytoke \normaleverytoks{\the\everytoks}
-
-\chardef\statuswidth=15
-\chardef\statuswrite=16
-
-\newtoks\everywritestring
-
-\def\writedirect {\immediate\write\statuswrite}
-\def\writeline {\writedirect{}}
-\def\writestring#1{\begingroup\the\everywritestring\writedirect{#1}\endgroup}
-
-\ifx\normalwritestatus\undefined \def\normalwritestatus#1#2{\writedirect{#1 : #2}} \fi
-
-% Because all libs are also on bytecodes we can start without stub. However,
-% some initializations need to take place before the \TEX\ engine itself
-% kicks in, especially memory settings and so. In due time we might make the
-% stub smaller and just create a configuration startup file.
+\writestatus{loading}{ConTeXt Lua Macros / Basic Lua Libraries}
\registerctxluafile{l-string} {1.001}
\registerctxluafile{l-lpeg} {1.001}
@@ -40,18 +19,16 @@
\registerctxluafile{l-number} {1.001}
\registerctxluafile{l-math} {1.001}
\registerctxluafile{l-table} {1.001}
-\registerctxluafile{l-aux} {1.001}
+%registerctxluafile{l-aux} {1.001}
\registerctxluafile{l-io} {1.001}
\registerctxluafile{l-os} {1.001}
\registerctxluafile{l-file} {1.001}
\registerctxluafile{l-md5} {1.001}
\registerctxluafile{l-dir} {1.001}
\registerctxluafile{l-unicode}{1.001}
-\registerctxluafile{l-utils} {1.001}
-\registerctxluafile{l-dimen} {1.001}
+%registerctxluafile{l-utils} {1.001}
\registerctxluafile{l-url} {1.001}
\registerctxluafile{l-set} {1.001}
-\registerctxluafile{l-dimen} {1.001}
% \registerctxluafile{socket.lua}{}
% \registerctxluafile{ltn12.lua} {}
diff --git a/Master/texmf-dist/tex/context/base/luat-bwc.lua b/Master/texmf-dist/tex/context/base/luat-bwc.lua
new file mode 100644
index 00000000000..f893c7c5b5d
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/luat-bwc.lua
@@ -0,0 +1,32 @@
+if not modules then modules = { } end modules ['luat-bwc'] = {
+ 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"
+}
+
+-- backward compatibility
+
+if not tex.wd then
+
+ local box = tex.box
+
+ local wd = { } setmetatable(wd, {
+ __index = function(t,k) local bk = box[k] return bk and bk.width or 0 end,
+ __newindex = function(t,k,v) local bk = box[k] if bk then bk.width = v end end,
+ } )
+
+ local ht = { } setmetatable(ht, {
+ __index = function(t,k) local bk = box[k] return bk and bk.height or 0 end,
+ __newindex = function(t,k,v) local bk = box[k] if bk then bk.height = v end end,
+ } )
+
+ local dp = { } setmetatable(dp, {
+ __index = function(t,k) local bk = box[k] return bk and bk.depth or 0 end,
+ __newindex = function(t,k,v) local bk = box[k] if bk then bk.depth = v end end,
+ } )
+
+--~ tex.wd, tex.ht, tex.dp = wd, ht, dp
+
+end
diff --git a/Master/texmf-dist/tex/context/base/luat-cbk.lua b/Master/texmf-dist/tex/context/base/luat-cbk.lua
index 3cb63ad6ec5..031a24e0d85 100644
--- a/Master/texmf-dist/tex/context/base/luat-cbk.lua
+++ b/Master/texmf-dist/tex/context/base/luat-cbk.lua
@@ -6,19 +6,23 @@ if not modules then modules = { } end modules ['luat-cbk'] = {
license = "see context related readme files"
}
-local insert, remove, find = table.insert, table.remove, string.find
+local insert, remove, find, format = table.insert, table.remove, string.find, string.format
local collectgarbage, type, next = collectgarbage, type, next
local round = math.round
local trace_checking = false trackers.register("memory.checking", function(v) trace_checking = v end)
+local report_callbacks = logs.reporter("system","callbacks")
+local report_memory = logs.reporter("system","memory")
+
--[[ldx--
<p>Callbacks are the real asset of <l n='luatex'/>. They permit you to hook
your own code into the <l n='tex'/> engine. Here we implement a few handy
auxiliary functions.</p>
--ldx]]--
-callbacks = callbacks or { }
+callbacks = callbacks or { }
+local callbacks = callbacks
--[[ldx--
<p>When you (temporarily) want to install a callback function, and after a
@@ -27,14 +31,55 @@ functions.</p>
--ldx]]--
local trace_callbacks = false trackers.register("system.callbacks", function(v) trace_callbacks = v end)
+local trace_calls = false -- only used when analyzing performance and initializations
+
+local register_callback, find_callback, list_callbacks = callback.register, callback.find, callback.list
+local frozen, stack, list = { }, { }, callbacks.list
+
+if not callbacks.list then -- otherwise counters get reset
+
+ list = utilities.storage.allocate(list_callbacks())
+
+ for k, _ in next, list do
+ list[k] = 0
+ end
+
+ callbacks.list = list
+
+end
+
+local delayed = table.tohash {
+ "buildpage_filter",
+}
+
+
+if trace_calls then
+
+ local functions = { }
+ local original = register_callback
-local register_callback, find_callback = callback.register, callback.find
-local frozen, stack = { }, { }
+ register_callback = function(name,func)
+ if type(func) == "function" then
+ if functions[name] then
+ functions[name] = func
+ return find_callback(name)
+ else
+ functions[name] = func
+ local cnuf = function(...)
+ list[name] = list[name] + 1
+ return functions[name](...)
+ end
+ return original(name,cnuf)
+ end
+ else
+ return original(name,func)
+ end
+ end
-callback.original_register_callback = register_callback
+end
local function frozen_message(what,name)
- logs.report("callbacks","not %s frozen '%s' (%s)",what,name,frozen[name])
+ report_callbacks("not %s frozen '%s' (%s)",what,name,frozen[name])
end
local function frozen_callback(name)
@@ -52,14 +97,17 @@ local function state(name)
end
end
+function callbacks.known(name)
+ return list[name]
+end
+
function callbacks.report()
- local list = callback.list()
- for name, func in table.sortedhash(list) do
+ for name, _ in table.sortedhash(list) do
local str = frozen[name]
if str then
- logs.report("callbacks","%s: %s -> %s",state(name),name,str)
+ report_callbacks("%s: %s -> %s",state(name),name,str)
else
- logs.report("callbacks","%s: %s",state(name),name)
+ report_callbacks("%s: %s",state(name),name)
end
end
end
@@ -67,7 +115,7 @@ end
function callbacks.table()
local NC, NR, verbatim = context.NC, context.NR, context.type
context.starttabulate { "|l|l|p|" }
- for name, func in table.sortedhash(callback.list()) do
+ for name, _ in table.sortedhash(list) do
NC() verbatim(name) NC() verbatim(state(name)) NC() context(frozen[name] or "") NC() NR()
end
context.stoptabulate()
@@ -75,11 +123,9 @@ end
function callbacks.freeze(name,freeze)
freeze = type(freeze) == "string" and freeze
---~ print(name)
if find(name,"%*") then
- local pattern = name -- string.simpleesc(name)
- local list = callback.list()
- for name, func in next, list do
+ local pattern = name
+ for name, _ in next, list do
if find(name,pattern) then
frozen[name] = freeze or frozen[name] or "frozen"
end
@@ -98,6 +144,9 @@ function callbacks.register(name,func,freeze)
elseif freeze then
frozen[name] = (type(freeze) == "string" and freeze) or "registered"
end
+ if delayed[name] and environment.initex then
+ return nil
+ end
return register_callback(name,func)
end
@@ -138,6 +187,18 @@ function callbacks.pop(name)
end
end
+if trace_calls then
+ statistics.register("callback details", function()
+ local t = { } -- todo: pass function to register and quit at nil
+ for name, n in table.sortedhash(list) do
+ if n > 0 then
+ t[#t+1] = format("%s -> %s",name,n)
+ end
+ end
+ return t
+ end)
+end
+
--~ -- somehow crashes later on
--~
--~ callbacks.freeze("find_.*_file","finding file")
@@ -203,9 +264,13 @@ restart the collector. Okay, experimental code has been removed,
because messing aroudn with the gc is too unpredictable.</p>
--ldx]]--
-garbagecollector = garbagecollector or { }
+-- For the moment we keep this here and not in util-gbc.lua or so.
+
+utilities = utilities or { }
+utilities.garbagecollector = utilities.garbagecollector or { }
+local garbagecollector = utilities.garbagecollector
-garbagecollector.enabled = false
+garbagecollector.enabled = false -- could become a directive
garbagecollector.criterium = 4*1024*1024
-- Lua allocates up to 12 times the amount of memory needed for
@@ -238,7 +303,7 @@ function garbagecollector.check(size,criterium)
local b = collectgarbage("count")
collectgarbage("collect")
local a = collectgarbage("count")
- logs.report("memory","forced sweep, collected: %s MB, used: %s MB",round((b-a)/1000),round(a/1000))
+ report_memory("forced sweep, collected: %s MB, used: %s MB",round((b-a)/1000),round(a/1000))
else
collectgarbage("collect")
end
diff --git a/Master/texmf-dist/tex/context/base/luat-cnf.lua b/Master/texmf-dist/tex/context/base/luat-cnf.lua
index e45aceb79f4..609dc412bcf 100644
--- a/Master/texmf-dist/tex/context/base/luat-cnf.lua
+++ b/Master/texmf-dist/tex/context/base/luat-cnf.lua
@@ -6,41 +6,49 @@ if not modules then modules = { } end modules ['luat-cnf'] = {
license = "see context related readme files"
}
+local type, next, tostring, tonumber = type, next, tostring, tonumber
local format, concat, find = string.format, table.concat, string.find
-luatex = luatex or { }
-
-luatex.variablenames = {
- 'main_memory', 'extra_mem_bot', 'extra_mem_top',
- 'buf_size','expand_depth',
- 'font_max', 'font_mem_size',
- 'hash_extra', 'max_strings', 'pool_free', 'pool_size', 'string_vacancies',
- 'obj_tab_size', 'pdf_mem_size', 'dest_names_size',
- 'nest_size', 'param_size', 'save_size', 'stack_size','expand_depth',
- 'trie_size', 'hyph_size', 'max_in_open',
- 'ocp_stack_size', 'ocp_list_size', 'ocp_buf_size',
- 'max_print_line',
-}
+local allocate = utilities.storage.allocate
-function luatex.variables()
- local t, x = { }, nil
- for _,v in next, luatex.variablenames do
- x = resolvers.var_value(v)
- if x and find(x,"^%d+$") then
- t[v] = tonumber(x)
- end
- end
- return t
-end
+texconfig.kpse_init = false
+texconfig.shell_escape = 't'
-if not luatex.variables_set then
- for k, v in next, luatex.variables() do
- texconfig[k] = v
- end
- luatex.variables_set = true
-end
+luatex = luatex or { }
+local luatex = luatex
+
+texconfig.error_line = 79 -- 79 -- obsolete
+texconfig.half_error_line = 50 -- 50 -- obsolete
+
+texconfig.expand_depth = 10000 -- 10000
+texconfig.hash_extra = 100000 -- 0
+texconfig.nest_size = 1000 -- 50
+texconfig.max_in_open = 500 -- 15
+texconfig.max_print_line = 10000 -- 79
+texconfig.max_strings = 500000 -- 15000
+texconfig.param_size = 25000 -- 60
+texconfig.save_size = 50000 -- 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
storage = storage or { }
@@ -48,7 +56,7 @@ luatex = luatex or { }
-- we provide our own file handling
-texconfig.kpse_init = false
+texconfig.kpse_init = false
texconfig.shell_escape = 't'
-- as soon as possible
@@ -59,14 +67,66 @@ luatex.starttime = os.gettimeofday()
function texconfig.init()
- -- shortcut and helper
+ -- development
+
+ local builtin, globals = { }, { }
+
+ libraries = { -- we set it her as we want libraries also 'indexed'
+ basiclua = {
+ "string", "table", "coroutine", "debug", "file", "io", "lpeg", "math", "os", "package",
+ },
+ basictex = { -- noad
+ "callback", "font", "img", "lang", "lua", "node", "pdf", "status", "tex", "texconfig", "texio", "token",
+ },
+ extralua = {
+ "gzip", "zip", "zlib", "lfs", "ltn12", "mime", "socket", "md5", "profiler", "unicode", "utf",
+ },
+ extratex = {
+ "epdf", "fontloader", "kpse", "mplib",
+ },
+ obsolete = {
+ "fontforge", -- can be filled by luat-log
+ "kpse",
+ },
+ builtin = builtin, -- to be filled
+ globals = globals, -- to be filled
+ }
+
+ for k, v in next, _G do
+ globals[k] = tostring(v)
+ end
- local b = lua.bytecode
+ local function collect(t)
+ local lib = { }
+ for k, v in next, t do
+ local keys = { }
+ local gv = _G[v]
+ if type(gv) == "table" then
+ for k, v in next, gv do
+ keys[k] = tostring(v) -- true -- by tostring we cannot call overloades functions (security)
+ end
+ end
+ lib[v] = keys
+ builtin[v] = keys
+ end
+ return lib
+ end
+
+ libraries.basiclua = collect(libraries.basiclua)
+ libraries.basictex = collect(libraries.basictex)
+ libraries.extralua = collect(libraries.extralua)
+ libraries.extratex = collect(libraries.extratex)
+ libraries.obsolete = collect(libraries.obsolete)
+
+ -- shortcut and helper
local function init(start)
+ local b = lua.bytecode
local i = start
while b[i] do
- b[i]() ; b[i] = nil ; i = i + 1
+ b[i]() ;
+ b[i] = nil ;
+ i = i + 1
-- collectgarbage('step')
end
return i - start
@@ -89,27 +149,28 @@ end)
-- done, from now on input and callbacks are internal
]]
-function luatex.dumpstate(name,firsttable)
- if tex and tex.luatexversion < 38 then
- os.remove(name)
- elseif true then
- local t = {
- "-- this file is generated, don't change it\n",
- "-- configuration (can be overloaded later)\n"
- }
- for _,v in next, luatex.variablenames do
- local tv = texconfig[v]
- if tv then
- t[#t+1] = format("texconfig.%s=%s",v,tv)
- 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",
+}
+
+local function makestub()
+ name = name or (environment.jobname .. ".lui")
+ 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
+ local tv = texconfig[v]
+ if tv and tv ~= "" then
+ t[#t+1] = format("texconfig.%s=%s",v,tv)
end
- io.savedata(name,format("%s\n\n%s",concat(t,"\n"),format(stub,firsttable or 501)))
- else
- io.savedata(name,format(stub,firsttable or 501))
end
+ io.savedata(name,format("%s\n\n%s",concat(t,"\n"),format(stub,firsttable)))
end
-texconfig.kpse_init = false
-texconfig.max_print_line = 100000
-texconfig.max_in_open = 127
-texconfig.shell_escape = 't'
+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
new file mode 100644
index 00000000000..a9cd4551b3b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/luat-cod.lua
@@ -0,0 +1,167 @@
+if not modules then modules = { } end modules ['luat-cod'] = {
+ version = 1.001,
+ comment = "companion to luat-cod.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local match, gsub, find = string.match, string.gsub, string.find
+
+local texconfig, lua = texconfig, lua
+
+-- some basic housekeeping
+
+texconfig.kpse_init = false
+texconfig.shell_escape = 't'
+texconfig.max_print_line = 100000
+texconfig.max_in_open = 127
+
+-- registering bytecode chunks
+
+lua.bytecode = lua.bytecode or { } -- built in anyway
+lua.bytedata = lua.bytedata or { }
+lua.bytedone = lua.bytedone or { }
+
+local bytecode, bytedata, bytedone = lua.bytecode, lua.bytedata, lua.bytedone
+
+lua.firstbytecode = 501
+lua.lastbytecode = lua.lastbytecode or (lua.firstbytecode - 1) -- as we load ourselves again ... maybe return earlier
+
+function lua.registeredcodes()
+ return lua.lastbytecode - lua.firstbytecode + 1
+end
+
+function lua.registercode(filename,version)
+ local barename = gsub(filename,"%.[%a%d]+$","")
+ if barename == filename then filename = filename .. ".lua" end
+ local basename = match(barename,"^.+[/\\](.-)$") or barename
+ if not bytedone[barename] then
+ local code = environment.luafilechunk(filename)
+ if code then
+ assert(code)()
+ bytedone[barename] = true
+ if environment.initex then
+ local n = lua.lastbytecode + 1
+ bytedata[n] = { barename, version }
+ bytecode[n] = code
+ lua.lastbytecode = n
+ end
+ end
+ end
+end
+
+local finalizers = { }
+
+function lua.registerfinalizer(f,comment)
+ if type(f) == "function" then
+ finalizers[#finalizers+1] = { action = f, comment = comment }
+ else
+ print(string.format("fatal error: invalid finalizer, action: %s",finalizer.comment or "unknown"))
+ os.exit()
+ end
+end
+
+function lua.finalize(logger)
+ for i=1,#finalizers do
+ local finalizer = finalizers[i]
+ finalizer.action()
+ if logger then
+ logger("finalizing lua", "action: %s",finalizer.comment)
+ end
+ end
+end
+
+-- A first start with environments. This will be overloaded later.
+
+environment = environment or { }
+local environment = environment
+
+local sourcefile = arg and arg[1] or ""
+local sourcepath = find(sourcefile,"/") and gsub(sourcefile,"/[^/]+$","") or ""
+local targetpath = "."
+
+-- delayed (via metatable):
+--
+-- environment.jobname = tex.jobname
+-- environment.version = tostring(tex.toks.contextversiontoks)
+
+environment.initex = tex.formatname == ""
+
+if not environment.luafilechunk then
+
+ function environment.luafilechunk(filename)
+ if sourcepath ~= "" then
+ filename = sourcepath .. "/" .. filename
+ end
+ local data = loadfile(filename)
+ texio.write("<",data and "+ " or "- ",filename,">")
+ return data
+ end
+
+end
+
+if not environment.engineflags then
+ local engineflags = { }
+ for i=-10,#arg do
+ local a = arg[i]
+ if a then
+ local flag, content = match(a,"^%-%-([^=]+)=?(.-)$")
+ if flag then
+ engineflags[flag] = content or ""
+ end
+ end
+ end
+ environment.engineflags = engineflags
+end
+
+-- We need a few premature callbacks in the format generator. We
+-- also do this when the format is loaded as otherwise we get
+-- a kpse error when disabled. This is an engine issue that will
+-- be sorted out in due time.
+
+local isfile = lfs.isfile
+
+local function source_file(name)
+ local fullname = sourcepath .. "/" .. name
+ if isfile(fullname) then
+ return fullname
+ end
+ fullname = fullname .. ".tex"
+ if isfile(fullname) then
+ return fullname
+ end
+ if isfile(name) then
+ return name
+ end
+ name = name .. ".tex"
+ if isfile(name) then
+ return name
+ end
+ return nil
+end
+
+local function target_file(name)
+ return targetpath .. "/" .. name
+end
+
+local function find_read_file (id,name)
+ return source_file(name)
+end
+
+local function find_write_file(id,name)
+ return target_file(name)
+end
+
+local function open_read_file(name)
+ local f = io.open(name,'rb')
+ return {
+ reader = function()
+ return f:read("*line")
+ end
+ }
+end
+
+callback.register('find_read_file' , find_read_file )
+callback.register('open_read_file' , open_read_file )
+callback.register('find_write_file', find_write_file)
diff --git a/Master/texmf-dist/tex/context/base/luat-cod.mkiv b/Master/texmf-dist/tex/context/base/luat-cod.mkiv
index d3b37d0e145..47a89844082 100644
--- a/Master/texmf-dist/tex/context/base/luat-cod.mkiv
+++ b/Master/texmf-dist/tex/context/base/luat-cod.mkiv
@@ -13,13 +13,20 @@
% \writestatus{loading}{ConTeXt Lua Macros / Code}
+\unprotect
+
+\long\def\expanded#1{\long\xdef\lastexpanded{\noexpand#1}\lastexpanded}
+%long\def\expanded#1{\normalexpanded{\noexpand#1}} % compatible ## mess
+
+\newif\ifproductionrun
+
%D Originally we compiled the lua files externally and loaded
%D then at runtime, but when the amount grew, we realized that
%D we needed away to store them in the format, which is what
%D bytecode arrays do. And so the following is obsolete:
%D
%D \starttyping
-%D \chardef\ctxluaembeddingmode \plusone
+%D \setnewconstant\ctxluaembeddingmode \plusone
%D
%D 0 = external compilation and loading
%D 1 = runtime compilation and embedding
@@ -31,9 +38,17 @@
%D scripts need to share data anyway. So eventually \LUATEX\ got only
%D one instance. Because each call is reentrant there is not much
%D danger for crashes.
+%D
+%D Most code here has changed after version 0.60 as part of adaption to
+%D new functionality. We no longer support the hooks for initializing
+%D code as this can be done at the \LUA\ end.
\def\ctxdirectlua{\directlua\zerocount}
\def\ctxlatelua {\latelua \zerocount}
+\def\ctxsprint #1{\directlua\zerocount{tex.sprint(tex.ctxcatcodes,#1)}} % saves tokens
+\def\ctxwrite #1{\directlua\zerocount{tex.write(#1)}} % saves tokens
+\def\ctxcommand#1{\directlua\zerocount{commands.#1}} % saves tokens
+\def\ctxreport #1{\directlua\zerocount{logs.writer[[#1]]}}
%D Take your choice \unknown
@@ -46,116 +61,11 @@
\edef\luaversion{\ctxlua{tex.print(_VERSION)}}
-%D We want to define \LUA\ related things in the format but
-%D need to reload code because \LUA\ instances themselves are
-%D not dumped into the format.
-
-\newtoks\everyloadluacode
-\newtoks\everyfinalizeluacode
-
-\normaleveryjob{\the\everyloadluacode\the\everyfinalizeluacode\the\everyjob}
-
-\newif\ifproductionrun
-
-%D Here we operate in the \TEX\ catcode regime as we haven't yet defined
-%D catcode regimes. A chicken or egg problem.
-
-\normalprotected\long\def\startruntimeluacode#1\stopruntimeluacode % only simple code (load +init)
- {\ifproductionrun
- \global\let\startruntimeluacode\relax
- \global\let\stopruntimeluacode \relax
- \else
- \global\everyloadluacode\expandafter{\the\everyloadluacode#1}%
- \fi
- #1} % maybe no interference
-
-\normalprotected\long\def\startruntimectxluacode#1\stopruntimectxluacode
- {\startruntimeluacode\ctxlua{#1}\stopruntimeluacode}
-
-%D Next we load the initialization code.
-
-\startruntimectxluacode
- environment = environment or { }
- environment.jobname = "\jobname" % tex.jobname
- environment.initex = \ifproductionrun false \else true \fi % tex.formatname == ""
- environment.version = "\fmtversion"
-\stopruntimectxluacode
-
-% we start at 500, below this, we store predefined data (dumps)
-
-\newcount\luabytecodecounter \luabytecodecounter=500
-
-\startruntimectxluacode
- lua.bytedata = lua.bytedata or { }
-\stopruntimectxluacode
-
-%D Handy when we expand:
-
-\let\stopruntimeluacode \relax
-\let\stopruntimectxluacode\relax
-
-\long\def\lastexpanded{} % todo: elsewhere we use \@@expanded
-
-\long\def\expanded#1{\long\xdef\lastexpanded{\noexpand#1}\lastexpanded}
-
-%D More code:
-
-% \def\ctxluabytecode#1% executes an already loaded chunk
-% {\ctxlua {
-% local str = ''
-% if lua.bytedata[#1] then
-% str = " from file " .. lua.bytedata[#1][1] .. " version " .. lua.bytedata[#1][2]
-% end
-% if lua.bytecode[#1] then
-% if environment.initex then
-% texio.write_nl("bytecode: executing blob " .. "#1" .. str)
-% assert(lua.bytecode[#1])()
-% else
-% texio.write_nl("bytecode: initializing blob " .. "#1" .. str)
-% assert(lua.bytecode[#1])()
-% lua.bytecode[#1] = nil
-% end
-% else
-% texio.write_nl("bytecode: invalid blob " .. "#1" .. str)
-% end
-% }}
-
-\def\ctxluabytecode#1% executes an already loaded chunk
- {\ctxlua {
- local lbc = lua.bytecode
- if lbc[#1] then
- assert(lbc[#1])()
- if not environment.initex then
- lbc[#1] = nil
- end
- end
- }}
-
-\def\ctxluabyteload#1#2% registers and compiles chunk
- {\global\advance\luabytecodecounter \plusone
- \normalexpanded{\startruntimectxluacode
- lua.bytedata[\the\luabytecodecounter] = { "#1", "#2" }
- \stopruntimectxluacode}%
- \ctxlua {
- lua.bytedata[\the\luabytecodecounter] = { "#1", "#2" }
- lua.bytecode[\the\luabytecodecounter] = environment.luafilechunk("#1")
- }}
-
-\def\ctxloadluafile#1#2% load a (either not compiled) chunk at runtime
- {\doifelsenothing{#2}
- {\ctxlua{environment.loadluafile("#1")}}
- {\ctxlua{environment.loadluafile("#1",#2)}}}
+\def\registerctxluafile#1#2{\ctxlua{lua.registercode("#1","#2")}}
+\def\ctxloadluafile #1{\ctxlua{lua.registercode("#1")}}
-\def\registerctxluafile#1#2% name version (modules and core code)
- {\ifproductionrun
- \ctxloadluafile{#1}{#2}%
- \else
- \ctxluabyteload{#1}{#2}% can go away
- \fi
- \global\everyloadluacode\expandafter\expandafter\expandafter{\expandafter\the\expandafter\everyloadluacode
- \expandafter\ctxluabytecode\expandafter{\the\luabytecodecounter}}%
- \ctxluabytecode{\the\luabytecodecounter}}
+\registerctxluafile{luat-cod}{1.001}
-\everydump\expandafter{\the\everydump\ctxlua{luatex.dumpstate(environment.jobname..".lui",501)}}
+% \everydump\expandafter{\the\everydump\ctxlua{lua.finalize()}}
-\endinput
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/luat-dum.lua b/Master/texmf-dist/tex/context/base/luat-dum.lua
deleted file mode 100644
index 4530c2ef34e..00000000000
--- a/Master/texmf-dist/tex/context/base/luat-dum.lua
+++ /dev/null
@@ -1,126 +0,0 @@
-if not modules then modules = { } end modules ['luat-dum'] = {
- version = 1.001,
- comment = "companion to luatex-*.tex",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local dummyfunction = function() end
-
-statistics = {
- register = dummyfunction,
- starttiming = dummyfunction,
- stoptiming = dummyfunction,
-}
-directives = {
- register = dummyfunction,
- enable = dummyfunction,
- disable = dummyfunction,
-}
-trackers = {
- register = dummyfunction,
- enable = dummyfunction,
- disable = dummyfunction,
-}
-experiments = {
- register = dummyfunction,
- enable = dummyfunction,
- disable = dummyfunction,
-}
-storage = {
- register = dummyfunction,
- shared = { },
-}
-logs = {
- report = dummyfunction,
- simple = dummyfunction,
-}
-tasks = {
- new = dummyfunction,
- actions = dummyfunction,
- appendaction = dummyfunction,
- prependaction = dummyfunction,
-}
-callbacks = {
- register = function(n,f) return callback.register(n,f) end,
-}
-
--- we need to cheat a bit here
-
-texconfig.kpse_init = true
-
-resolvers = resolvers or { } -- no fancy file helpers used
-
-local remapper = {
- otf = "opentype fonts",
- ttf = "truetype fonts",
- ttc = "truetype fonts",
- dfont = "truetype dictionary",
- cid = "cid maps",
- fea = "font feature files",
-}
-
-function resolvers.find_file(name,kind)
- name = string.gsub(name,"\\","\/")
- kind = string.lower(kind)
- return kpse.find_file(name,(kind and kind ~= "" and (remapper[kind] or kind)) or file.extname(name,"tex"))
-end
-
-function resolvers.findbinfile(name,kind)
- if not kind or kind == "" then
- kind = file.extname(name) -- string.match(name,"%.([^%.]-)$")
- end
- return resolvers.find_file(name,(kind and remapper[kind]) or kind)
-end
-
--- Caches ... I will make a real stupid version some day when I'm in the
--- mood. After all, the generic code does not need the more advanced
--- ConTeXt features. Cached data is not shared between ConTeXt and other
--- usage as I don't want any dependency at all. Also, ConTeXt might have
--- different needs and tricks added.
-
-caches = { }
-
---~ containers.usecache = true
-
-function caches.setpath(category,subcategory)
- local root = kpse.var_value("TEXMFCACHE") or ""
- if root == "" then
- root = kpse.var_value("VARTEXMF") or ""
- end
- if root ~= "" then
- root = file.join(root,category)
- lfs.mkdir(root)
- root = file.join(root,subcategory)
- lfs.mkdir(root)
- return lfs.isdir(root) and root
- end
-end
-
-local function makefullname(path,name)
- if path and path ~= "" then
- name = "temp-" and name -- clash prevention
- return file.addsuffix(file.join(path,name),"lua")
- end
-end
-
-function caches.iswritable(path,name)
- local fullname = makefullname(path,name)
- return fullname and file.iswritable(fullname)
-end
-
-function caches.loaddata(path,name)
- local fullname = makefullname(path,name)
- if fullname then
- local data = loadfile(fullname)
- return data and data()
- end
-end
-
-function caches.savedata(path,name,data)
- local fullname = makefullname(path,name)
- if fullname then
- table.tofile(fullname,data,'return',false,true,false)
- end
-end
diff --git a/Master/texmf-dist/tex/context/base/luat-env.lua b/Master/texmf-dist/tex/context/base/luat-env.lua
index 0e21fca31e9..4f1b661c218 100644
--- a/Master/texmf-dist/tex/context/base/luat-env.lua
+++ b/Master/texmf-dist/tex/context/base/luat-env.lua
@@ -14,8 +14,13 @@ if not modules then modules = { } end modules ['luat-env'] = {
local trace_locating = false trackers.register("resolvers.locating", function(v) trace_locating = v end)
+local report_lua = logs.reporter("resolvers","lua")
+
+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 unquote, quote = string.unquote, string.quote
+local unquoted, quoted = string.unquoted, string.quoted
+local concat = table.concat
-- precautions
@@ -28,25 +33,53 @@ end
-- dirty tricks
if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then
- arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil
-end
-
-if profiler and os.env["MTX_PROFILE_RUN"] == "YES" then
- profiler.start("luatex-profile.log")
+ arg[-1] = arg[0]
+ arg[ 0] = arg[2]
+ for k=3,#arg do
+ arg[k-2] = arg[k]
+ end
+ arg[#arg] = nil -- last
+ arg[#arg] = nil -- pre-last
end
-- environment
environment = environment or { }
-environment.arguments = { }
-environment.files = { }
+local environment = environment
+
+environment.arguments = allocate()
+environment.files = allocate()
environment.sortedflags = nil
-if not environment.jobname or environment.jobname == "" then if tex then environment.jobname = tex.jobname end end
-if not environment.version or environment.version == "" then environment.version = "unknown" end
-if not environment.jobname then environment.jobname = "unknown" end
+local mt = {
+ __index = function(_,k)
+ if k == "version" then
+ local version = tex.toks and tex.toks.contextversiontoks
+ if version and version ~= "" then
+ rawset(environment,"version",version)
+ return version
+ else
+ return "unknown"
+ end
+ elseif k == "jobname" or k == "formatname" then
+ local name = tex and tex[k]
+ if name or name== "" then
+ rawset(environment,k,name)
+ return name
+ else
+ return "unknown"
+ end
+ elseif k == "outputfilename" then
+ local name = environment.jobname
+ rawset(environment,k,name)
+ return name
+ end
+ end
+}
+
+setmetatable(environment,mt)
-function environment.initialize_arguments(arg)
+function environment.initializearguments(arg)
local arguments, files = { }, { }
environment.arguments, environment.files, environment.sortedflags = arguments, files, nil
for index=1,#arg do
@@ -54,7 +87,7 @@ function environment.initialize_arguments(arg)
if index > 0 then
local flag, value = match(argument,"^%-+(.-)=(.-)$")
if flag then
- arguments[flag] = unquote(value or "")
+ arguments[flag] = unquoted(value or "")
else
flag = match(argument,"^%-+(.+)")
if flag then
@@ -83,7 +116,7 @@ function environment.argument(name,partial)
return arguments[name]
elseif partial then
if not sortedflags then
- sortedflags = table.sortedkeys(arguments)
+ sortedflags = allocate(table.sortedkeys(arguments))
for k=1,#sortedflags do
sortedflags[k] = "^" .. sortedflags[k]
end
@@ -100,13 +133,11 @@ function environment.argument(name,partial)
return nil
end
-environment.argument("x",true)
-
-function environment.split_arguments(separator) -- rather special, cut-off before separator
+function environment.splitarguments(separator) -- rather special, cut-off before separator
local done, before, after = false, { }, { }
- local original_arguments = environment.original_arguments
- for k=1,#original_arguments do
- local v = original_arguments[k]
+ local originalarguments = environment.originalarguments
+ for k=1,#originalarguments do
+ local v = originalarguments[k]
if not done and v == separator then
done = true
elseif done then
@@ -118,32 +149,51 @@ function environment.split_arguments(separator) -- rather special, cut-off befor
return before, after
end
-function environment.reconstruct_commandline(arg,noquote)
- arg = arg or environment.original_arguments
+function environment.reconstructcommandline(arg,noquote)
+ 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 = unquote(a)
+ a = unquoted(a)
return a
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 = unquote(a)
+ a = unquoted(a)
a = gsub(a,'"','\\"') -- tricky
if find(a," ") then
- result[#result+1] = quote(a)
+ result[#result+1] = quoted(a)
else
result[#result+1] = a
end
end
- return table.join(result," ")
+ return concat(result," ")
else
return ""
end
end
+--~ -- 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)
@@ -169,9 +219,10 @@ if arg then
newarg[i] = arg[i]
end
- environment.initialize_arguments(newarg)
- environment.original_arguments = newarg
- environment.raw_arguments = arg
+ environment.initializearguments(newarg)
+
+ environment.originalarguments = mark(newarg)
+ environment.rawarguments = mark(arg)
arg = { } -- prevent duplicate handling
@@ -180,45 +231,37 @@ end
-- weird place ... depends on a not yet loaded module
function environment.texfile(filename)
- return resolvers.find_file(filename,'tex')
+ return resolvers.findfile(filename,'tex')
end
function environment.luafile(filename)
- local resolved = resolvers.find_file(filename,'tex') or ""
+ local resolved = resolvers.findfile(filename,'tex') or ""
if resolved ~= "" then
return resolved
end
- resolved = resolvers.find_file(filename,'texmfscripts') or ""
+ resolved = resolvers.findfile(filename,'texmfscripts') or ""
if resolved ~= "" then
return resolved
end
- return resolvers.find_file(filename,'luatexlibs') or ""
+ return resolvers.findfile(filename,'luatexlibs') or ""
end
environment.loadedluacode = loadfile -- can be overloaded
---~ function environment.loadedluacode(name)
---~ if os.spawn("texluac -s -o texluac.luc " .. name) == 0 then
---~ local chunk = loadstring(io.loaddata("texluac.luc"))
---~ os.remove("texluac.luc")
---~ return chunk
---~ else
---~ environment.loadedluacode = loadfile -- can be overloaded
---~ return loadfile(name)
---~ end
---~ end
-
-function environment.luafilechunk(filename) -- used for loading lua bytecode in the format
+function environment.luafilechunk(filename,silent) -- used for loading lua bytecode in the format
filename = file.replacesuffix(filename, "lua")
local fullname = environment.luafile(filename)
if fullname and fullname ~= "" then
+ local data = environment.loadedluacode(fullname)
if trace_locating then
- logs.report("fileio","loading file %s", fullname)
+ report_lua("loading file %s%s", fullname, not data and " failed" or "")
+ elseif not silent then
+ texio.write("<",data and "+ " or "- ",fullname,">")
end
- return environment.loadedluacode(fullname)
+ return data
else
if trace_locating then
- logs.report("fileio","unknown file %s", filename)
+ report_lua("unknown file %s", filename)
end
return nil
end
@@ -238,7 +281,7 @@ function environment.loadluafile(filename, version)
local fullname = (lucname and environment.luafile(lucname)) or ""
if fullname ~= "" then
if trace_locating then
- logs.report("fileio","loading %s", fullname)
+ report_lua("loading %s", fullname)
end
chunk = loadfile(fullname) -- this way we don't need a file exists check
end
@@ -256,7 +299,7 @@ function environment.loadluafile(filename, version)
return true
else
if trace_locating then
- logs.report("fileio","version mismatch for %s: lua=%s, luc=%s", filename, v, version)
+ report_lua("version mismatch for %s: lua=%s, luc=%s", filename, v, version)
end
environment.loadluafile(filename)
end
@@ -267,12 +310,12 @@ function environment.loadluafile(filename, version)
fullname = (luaname and environment.luafile(luaname)) or ""
if fullname ~= "" then
if trace_locating then
- logs.report("fileio","loading %s", fullname)
+ report_lua("loading %s", fullname)
end
chunk = loadfile(fullname) -- this way we don't need a file exists check
if not chunk then
if trace_locating then
- logs.report("fileio","unknown file %s", filename)
+ report_lua("unknown file %s", filename)
end
else
assert(chunk)()
diff --git a/Master/texmf-dist/tex/context/base/luat-exe.lua b/Master/texmf-dist/tex/context/base/luat-exe.lua
index ca3b751623b..42c17ded58d 100644
--- a/Master/texmf-dist/tex/context/base/luat-exe.lua
+++ b/Master/texmf-dist/tex/context/base/luat-exe.lua
@@ -6,66 +6,93 @@ if not modules then modules = { } end modules ['luat-exe'] = {
license = "see context related readme files"
}
-local match, find = string.match, string.find
+-- this module needs checking (very old and never really used, not even enabled)
+
+local match, find, gmatch = string.match, string.find, string.gmatch
local concat = table.concat
-if not executer then executer = { } end
+local report_executers = logs.reporter("system","executers")
+
+resolvers.executers = resolvers.executers or { }
+local executers = resolvers.executers
-executer.permitted = { }
-executer.execute = os.execute
+local permitted = { }
+local osexecute = os.execute
+local execute = osexecute
-function executer.register(...)
- local ep = executer.permitted
+local function register(...)
local t = { ... }
for k=1,#t do
local v = t[k]
- ep[#ep+1] = (v == "*" and ".*") or v
+ permitted[#permitted+1] = (v == "*" and ".*") or v
end
end
-function executer.finalize() -- todo: os.exec, todo: report ipv print
- local execute = os.execute
- function executer.execute(...)
- local t, name, arguments = {...}, "", ""
+local function finalize() -- todo: os.exec, todo: report ipv print
+ execute = function(...)
+ -- todo: make more clever first split
+ local t, name, arguments = { ... }, "", ""
+ local one = t[1]
if #t == 1 then
- if type(t[1]) == 'table' then
- name, arguments = t[1], concat(t," ",2,#t)
+ if type(one) == 'table' then
+ name, arguments = one, concat(t," ",2,#t)
else
- name, arguments = match(t[1],"^(.-)%s+(.+)$")
+ name, arguments = match(one,"^(.-)%s+(.+)$")
if not (name and arguments) then
- name, arguments = t[1], ""
+ name, arguments = one, ""
end
end
else
- name, arguments = t[1], concat(t," ",2,#t)
+ name, arguments = one, concat(t," ",2,#t)
end
- local permitted = executer.permitted
for k=1,#permitted do
local v = permitted[k]
if find(name,v) then
- execute(name .. " " .. arguments)
+ osexecute(name .. " " .. arguments)
-- print("executed: " .. name .. " " .. arguments)
else
- print("not permitted: " .. name .. " " .. arguments)
+ report_executers("not permitted: %s %s",name,arguments)
end
end
end
- function executer.finalize()
- print("executer is already finalized")
+ finalize = function()
+ report_executers("already finalized")
end
- function executer.register(name)
- print("executer is already finalized")
+ register = function()
+ report_executers("already finalized, no registration permitted")
end
- os.execute = executer.execute
+ os.execute = execute
end
---~ executer.register('.*')
---~ executer.register('*')
---~ executer.register('dir','ls')
---~ executer.register('dir')
+executers.finalize = function(...) finalize(...) end
+executers.register = function(...) register(...) end
+executers.execute = function(...) execute (...) 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)
---~ executer.finalize()
---~ executer.execute('dir',"*.tex")
---~ executer.execute("dir *.tex")
---~ executer.execute("ls *.tex")
+function executers.check()
+ 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
+ end
+end
+
+--~ resolvers.executers.register('.*')
+--~ resolvers.executers.register('*')
+--~ resolvers.executers.register('dir','ls')
+--~ resolvers.executers.register('dir')
+
+--~ resolvers.executers.finalize()
+--~ resolvers.executers.execute('dir',"*.tex")
+--~ resolvers.executers.execute("dir *.tex")
+--~ resolvers.executers.execute("ls *.tex")
--~ os.execute('ls')
+
+--~ resolvers.executers.check()
diff --git a/Master/texmf-dist/tex/context/base/luat-fio.lua b/Master/texmf-dist/tex/context/base/luat-fio.lua
index 0d1bd18087b..5deb704f607 100644
--- a/Master/texmf-dist/tex/context/base/luat-fio.lua
+++ b/Master/texmf-dist/tex/context/base/luat-fio.lua
@@ -11,68 +11,71 @@ local texiowrite = (texio and texio.write) or print
local format = string.format
-texconfig.kpse_init = false
-texconfig.trace_file_names = true -- also influences pdf fonts reporting .. todo
-texconfig.max_print_line = 100000
-
-kpse = { } setmetatable(kpse, { __index = function(k,v) return input[v] end } )
-
--- if still present, we overload kpse (put it off-line so to say)
+texconfig.kpse_init = false
+texconfig.shell_escape = 't'
+texconfig.max_in_open = 127
+texconfig.max_print_line = 100000
if not resolvers.instance then
resolvers.reset()
- resolvers.instance.progname = 'context'
- resolvers.instance.engine = 'luatex'
resolvers.instance.validfile = resolvers.validctxfile
+ -- we now load the file database as we might need files other than
+ -- tex and lua file on the given path
+
+ -- trackers.enable("resolvers.*")
resolvers.load()
+ -- trackers.disable("resolvers.*")
+
+ local findbinfile, loadbinfile = resolvers.findbinfile, resolvers.loadbinfile
+ local findtexfile, opentexfile = resolvers.findtexfile, resolvers.opentexfile
if callback then
- callback.register('find_read_file' , function(id,name) return resolvers.findtexfile(name) end)
- callback.register('open_read_file' , function( name) return resolvers.opentexfile(name) end)
-
- callback.register('find_data_file' , function(name) return resolvers.findbinfile(name,"tex") end)
- callback.register('find_enc_file' , function(name) return resolvers.findbinfile(name,"enc") end)
- callback.register('find_font_file' , function(name) return resolvers.findbinfile(name,"tfm") end)
- callback.register('find_format_file' , function(name) return resolvers.findbinfile(name,"fmt") end)
- callback.register('find_image_file' , function(name) return resolvers.findbinfile(name,"tex") end)
- callback.register('find_map_file' , function(name) return resolvers.findbinfile(name,"map") end)
- callback.register('find_ocp_file' , function(name) return resolvers.findbinfile(name,"ocp") end)
- callback.register('find_opentype_file' , function(name) return resolvers.findbinfile(name,"otf") end)
- callback.register('find_output_file' , function(name) return name end)
- callback.register('find_pk_file' , function(name) return resolvers.findbinfile(name,"pk") end)
- callback.register('find_sfd_file' , function(name) return resolvers.findbinfile(name,"sfd") end)
- callback.register('find_truetype_file' , function(name) return resolvers.findbinfile(name,"ttf") end)
- callback.register('find_type1_file' , function(name) return resolvers.findbinfile(name,"pfb") end)
- callback.register('find_vf_file' , function(name) return resolvers.findbinfile(name,"vf") end)
-
- callback.register('read_data_file' , function(file) return resolvers.loadbinfile(file,"tex") end)
- callback.register('read_enc_file' , function(file) return resolvers.loadbinfile(file,"enc") end)
- callback.register('read_font_file' , function(file) return resolvers.loadbinfile(file,"tfm") end)
+ local register = callbacks.register
+
+ register('find_read_file' , function(id,name) return findtexfile(name) end, true)
+ register('open_read_file' , function( name) return opentexfile(name) end, true)
+
+ register('find_data_file' , function(name) return findbinfile(name,"tex") end, true)
+ register('find_enc_file' , function(name) return findbinfile(name,"enc") end, true)
+ register('find_font_file' , function(name) return findbinfile(name,"tfm") end, true)
+ register('find_format_file' , function(name) return findbinfile(name,"fmt") end, true)
+ register('find_image_file' , function(name) return findbinfile(name,"tex") end, true)
+ register('find_map_file' , function(name) return findbinfile(name,"map") end, true)
+ register('find_opentype_file' , function(name) return findbinfile(name,"otf") end, true)
+ register('find_output_file' , function(name) return name end, true)
+ register('find_pk_file' , function(name) return findbinfile(name,"pk") end, true)
+ register('find_sfd_file' , function(name) return findbinfile(name,"sfd") end, true)
+ register('find_truetype_file' , function(name) return findbinfile(name,"ttf") end, true)
+ register('find_type1_file' , function(name) return findbinfile(name,"pfb") end, true)
+ register('find_vf_file' , function(name) return findbinfile(name,"vf") end, true)
+
+ register('read_data_file' , function(file) return loadbinfile(file,"tex") end, true)
+ register('read_enc_file' , function(file) return loadbinfile(file,"enc") end, true)
+ register('read_font_file' , function(file) return loadbinfile(file,"tfm") end, true)
-- format
-- image
- callback.register('read_map_file' , function(file) return resolvers.loadbinfile(file,"map") end)
- callback.register('read_ocp_file' , function(file) return resolvers.loadbinfile(file,"ocp") end)
+ register('read_map_file' , function(file) return loadbinfile(file,"map") end, true)
-- output
- callback.register('read_pk_file' , function(file) return resolvers.loadbinfile(file,"pk") end) -- 600dpi/manfnt.720pk
- callback.register('read_sfd_file' , function(file) return resolvers.loadbinfile(file,"sfd") end)
- callback.register('read_vf_file' , function(file) return resolvers.loadbinfile(file,"vf" ) end)
+ register('read_pk_file' , function(file) return loadbinfile(file,"pk") end, true) -- 600dpi/manfnt.720pk
+ register('read_sfd_file' , function(file) return loadbinfile(file,"sfd") end, true)
+ register('read_vf_file' , function(file) return loadbinfile(file,"vf" ) end, true)
- callback.register('find_font_file' , function(name) return resolvers.findbinfile(name,"ofm") end)
- callback.register('find_vf_file' , function(name) return resolvers.findbinfile(name,"ovf") end)
+ register('find_font_file' , function(name) return findbinfile(name,"ofm") end, true)
+ register('find_vf_file' , function(name) return findbinfile(name,"ovf") end, true)
- callback.register('read_font_file' , function(file) return resolvers.loadbinfile(file,"ofm") end)
- callback.register('read_vf_file' , function(file) return resolvers.loadbinfile(file,"ovf") end)
+ register('read_font_file' , function(file) return loadbinfile(file,"ofm") end, true)
+ register('read_vf_file' , function(file) return loadbinfile(file,"ovf") end, true)
- -- callback.register('read_opentype_file' , function(file) return resolvers.loadbinfile(file,"otf") end)
- -- callback.register('read_truetype_file' , function(file) return resolvers.loadbinfile(file,"ttf") end)
- -- callback.register('read_type1_file' , function(file) return resolvers.loadbinfile(file,"pfb") end)
+ -- register('read_opentype_file' , function(file) return loadbinfile(file,"otf") end, true)
+ -- register('read_truetype_file' , function(file) return loadbinfile(file,"ttf") end, true)
+ -- register('read_type1_file' , function(file) return loadbinfile(file,"pfb") end, true)
- callback.register('find_write_file' , function(id,name) return name end)
- callback.register('find_format_file' , function(name) return name end)
+ register('find_write_file' , function(id,name) return name end, true)
+ register('find_format_file' , function(name) return name end, true)
end
diff --git a/Master/texmf-dist/tex/context/base/luat-fmt.lua b/Master/texmf-dist/tex/context/base/luat-fmt.lua
new file mode 100644
index 00000000000..cfb9a0bb776
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/luat-fmt.lua
@@ -0,0 +1,139 @@
+if not modules then modules = { } end modules ['luat-fmt'] = {
+ version = 1.001,
+ comment = "companion to mtxrun",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+
+local format = string.format
+
+local report_format = logs.reporter("resolvers","formats")
+
+-- helper for mtxrun
+
+local quoted = string.quoted
+
+local function primaryflags() -- not yet ok
+ local trackers = environment.argument("trackers")
+ local directives = environment.argument("directives")
+ local flags = ""
+ if trackers and trackers ~= "" then
+ flags = flags .. "--trackers=" .. quoted(trackers)
+ end
+ if directives and directives ~= "" then
+ flags = flags .. "--directives=" .. quoted(directives)
+ end
+ return flags
+end
+
+function environment.make_format(name)
+ -- change to format path (early as we need expanded paths)
+ local olddir = lfs.currentdir()
+ local path = caches.getwritablepath("formats") or "" -- maybe platform
+ if path ~= "" then
+ lfs.chdir(path)
+ end
+ report_format("format path: %s",lfs.currentdir())
+ -- check source file
+ local texsourcename = file.addsuffix(name,"mkiv")
+ local fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
+ if fulltexsourcename == "" then
+ texsourcename = file.addsuffix(name,"tex")
+ fulltexsourcename = resolvers.findfile(texsourcename,"tex") or ""
+ end
+ if fulltexsourcename == "" then
+ report_format("no tex source file with name: %s (mkiv or tex)",name)
+ lfs.chdir(olddir)
+ return
+ else
+ report_format("using tex source file: %s",fulltexsourcename)
+ end
+ local texsourcepath = dir.expandname(file.dirname(fulltexsourcename)) -- really needed
+ -- check specification
+ local specificationname = file.replacesuffix(fulltexsourcename,"lus")
+ local fullspecificationname = resolvers.findfile(specificationname,"tex") or ""
+ if fullspecificationname == "" then
+ specificationname = file.join(texsourcepath,"context.lus")
+ fullspecificationname = resolvers.findfile(specificationname,"tex") or ""
+ end
+ if fullspecificationname == "" then
+ report_format("unknown stub specification: %s",specificationname)
+ lfs.chdir(olddir)
+ return
+ end
+ local specificationpath = file.dirname(fullspecificationname)
+ -- load specification
+ local usedluastub = nil
+ local usedlualibs = dofile(fullspecificationname)
+ if type(usedlualibs) == "string" then
+ usedluastub = file.join(file.dirname(fullspecificationname),usedlualibs)
+ elseif type(usedlualibs) == "table" then
+ report_format("using stub specification: %s",fullspecificationname)
+ local texbasename = file.basename(name)
+ local luastubname = file.addsuffix(texbasename,"lua")
+ local lucstubname = file.addsuffix(texbasename,"luc")
+ -- pack libraries in stub
+ report_format("creating initialization file: %s",luastubname)
+ utilities.merger.selfcreate(usedlualibs,specificationpath,luastubname)
+ -- compile stub file (does not save that much as we don't use this stub at startup any more)
+ local strip = resolvers.booleanvariable("LUACSTRIP", true)
+ if utilities.lua.compile(luastubname,lucstubname) and lfs.isfile(lucstubname) then
+ report_format("using compiled initialization file: %s",lucstubname)
+ usedluastub = lucstubname
+ else
+ report_format("using uncompiled initialization file: %s",luastubname)
+ usedluastub = luastubname
+ end
+ else
+ report_format("invalid stub specification: %s",fullspecificationname)
+ lfs.chdir(olddir)
+ return
+ end
+ -- generate format
+ local command = format("luatex --ini %s --lua=%s %s %sdump",primaryflags(),quoted(usedluastub),quoted(fulltexsourcename),os.platform == "unix" and "\\\\" or "\\")
+ report_format("running command: %s\n",command)
+ os.spawn(command)
+ -- remove related mem files
+ local pattern = file.removesuffix(file.basename(usedluastub)).."-*.mem"
+ -- report_format("removing related mplib format with pattern '%s'", pattern)
+ local mp = dir.glob(pattern)
+ if mp then
+ for i=1,#mp do
+ local name = mp[i]
+ report_format("removing related mplib format %s", file.basename(name))
+ os.remove(name)
+ end
+ end
+ lfs.chdir(olddir)
+end
+
+function environment.run_format(name,data,more)
+ -- hm, rather old code here; we can now use the file.whatever functions
+ if name and name ~= "" then
+ local barename = file.removesuffix(name)
+ local fmtname = caches.getfirstreadablefile(file.addsuffix(barename,"fmt"),"formats")
+ if fmtname == "" then
+ fmtname = resolvers.findfile(file.addsuffix(barename,"fmt")) or ""
+ end
+ fmtname = resolvers.cleanpath(fmtname)
+ if fmtname == "" then
+ report_format("no format with name: %s",name)
+ else
+ local barename = file.removesuffix(name) -- expanded name
+ local luaname = file.addsuffix(barename,"luc")
+ if not lfs.isfile(luaname) then
+ luaname = file.addsuffix(barename,"lua")
+ end
+ if not lfs.isfile(luaname) then
+ report_format("using format name: %s",fmtname)
+ report_format("no luc/lua with name: %s",barename)
+ else
+ local command = format("luatex %s --fmt=%s --lua=%s %s %s",primaryflags(),quoted(barename),quoted(luaname),quoted(data),more ~= "" and quoted(more) or "")
+ report_format("running command: %s",command)
+ os.spawn(command)
+ end
+ 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 e6a715c07fa..9a8651a9cbd 100644
--- a/Master/texmf-dist/tex/context/base/luat-ini.lua
+++ b/Master/texmf-dist/tex/context/base/luat-ini.lua
@@ -6,26 +6,37 @@ if not modules then modules = { } end modules ['luat-ini'] = {
license = "see context related readme files"
}
+-- rather experimental down here ... will change with lua 5.2 --
+
--~ local ctxcatcodes = tex.ctxcatcodes
+local debug = require "debug"
+local string, table, lpeg, math, io, system = string, table, lpeg, math, io, system
+local next, setfenv = next, setfenv or debug.setfenv
+local format = string.format
+
+local mark = utilities.storage.mark
+
--[[ldx--
<p>We cannot load anything yet. However what we will do us reserve a fewtables.
These can be used for runtime user data or third party modules and will not be
cluttered by macro package code.</p>
--ldx]]--
-userdata = userdata or { } -- might be used
-thirddata = thirddata or { } -- might be used
-moduledata = moduledata or { } -- might be used
-document = document or { }
-parametersets = parametersets or { } -- experimental
+userdata = userdata or { } -- for users (e.g. functions etc)
+thirddata = thirddata or { } -- only for third party modules
+moduledata = moduledata or { } -- only for development team
+documentdata = documentdata or { } -- for users (e.g. raw data)
+parametersets = parametersets or { } -- experimental for team
+
+document = document or { } -- only for context itself
--[[ldx--
<p>These can be used/set by the caller program; <t>mtx-context.lua</t> does it.</p>
--ldx]]--
-document.arguments = document.arguments or { }
-document.files = document.files or { }
+document.arguments = mark(document.arguments or { })
+document.files = mark(document.files or { })
--[[ldx--
<p>Please create a namespace within these tables before using them!</p>
@@ -44,66 +55,81 @@ just a lightweight suggestive system, not a watertight
one.</p>
--ldx]]--
-local debug = require "debug"
-
-local string, table, lpeg, math, io, system = string, table, lpeg, math, io, system
-local next, setfenv = next, setfenv or debug.setfenv
-local format = string.format
+-- this will change when we move on to lua 5.2+
local global = _G
global.global = global
+--~ rawset(global,"global",global)
local dummy = function() end
+-- another approach is to freeze tables by using a metatable, this will be
+-- implemented stepwise
+
local protected = {
-- global table
- global = global,
+ global = global,
-- user tables
- userdata = userdata,
- moduledata = moduledata,
- thirddata = thirddata,
- document = document,
+ -- moduledata = moduledata,
+ userdata = userdata,
+ thirddata = thirddata,
+ documentdata = documentdata,
-- reserved
- protect = dummy,
- unprotect = dummy,
+ protect = dummy,
+ unprotect = dummy,
-- luatex
- tex = tex,
+ tex = tex,
-- lua
- string = string,
- table = table,
- lpeg = lpeg,
- math = math,
- io = io,
- system = system,
+ string = string,
+ table = table,
+ lpeg = lpeg,
+ math = math,
+ io = io,
+ --
+ -- maybe other l-*, xml etc
}
-userdata, thirddata, moduledata = nil, nil, nil
+-- moduledata : no need for protection (only for developers)
+-- isolatedata : full protection
+-- userdata : protected
+-- thirddata : protected
+
+userdata, thirddata = nil, nil
+
+-- we could have a metatable that automaticaly creates a top level namespace
if not setfenv then
texio.write_nl("warning: we need to fix setfenv by using 'load in' or '_ENV'")
end
-function protect(name)
- if name == "isolateddata" then
- local t = { }
+local function protect_full(name)
+ local t = { }
+ for k, v in next, protected do
+ t[k] = v
+ end
+ return t
+end
+
+local function protect_part(name)
+--~ local t = global[name]
+ local t = rawget(global,name)
+ if not t then
+ t = { }
for k, v in next, protected do
t[k] = v
end
- setfenv(2,t)
+--~ global[name] = t
+ rawset(global,name,t)
+ end
+ return t
+end
+
+function protect(name)
+ if name == "isolateddata" then
+ setfenv(2,protect_full(name))
else
- if not name then
- name = "shareddata"
- end
- local t = global[name]
- if not t then
- t = { }
- for k, v in next, protected do
- t[k] = v
- end
- global[name] = t
- end
- setfenv(2,t)
+ setfenv(2,protect_part(name or "shareddata"))
end
end
@@ -119,6 +145,10 @@ function lua.registername(name,message)
end
lua.name[lnn] = message
tex.write(lnn)
+ -- initialize once
+ if name ~= "isolateddata" then
+ protect_full(name or "shareddata")
+ end
end
--~ function lua.checknames()
diff --git a/Master/texmf-dist/tex/context/base/luat-ini.mkiv b/Master/texmf-dist/tex/context/base/luat-ini.mkiv
index c9d88bf4fcf..a79ef6a02ac 100644
--- a/Master/texmf-dist/tex/context/base/luat-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/luat-ini.mkiv
@@ -53,30 +53,6 @@
\ifx\obeyedline \undefined \let\obeyedline \relax \fi
\ifx\obeyspaces \undefined \let\obeyspaces \relax \fi
\ifx\obeyedspace \undefined \let\obeyedspace \relax \fi
-\ifx\outputnewlinechar\undefined \let\outputnewlinechar\relax \fi
-
-%D A previous version used a bit less code and no catcode table,
-%D simply becaus ethey were not around at the time of writing.
-%
-% we keep it around for archival purposes
-%
-% \def\obeylualines
-% {\obeylines \let\obeyedline \outputnewlinechar
-% \obeyspaces \let\obeyedspace\space}
-%
-% \def\obeyluatokens % todo: make this a proper catcode table, use let's
-% {\catcode`\%=12 \catcode`\#=12
-% \catcode`\_=12 \catcode`\^=12
-% \catcode`\&=12 \catcode`\|=12
-% \catcode`\{=12 \catcode`\}=12
-% \catcode`\~=12 \catcode`\$=12
-% \def\\{\string\\}\def\|{\string\|}\def\-{\string\-}%
-% \def\({\string\(}\def\){\string\)}\def\{{\string\{}\def\}{\string\}}%
-% \def\'{\string\'}\def\"{\string\"}%
-% \def\n{\string\n}\def\r{\string\r}\def\f{\string\f}\def\t{\string\t}%
-% \def\a{\string\a}\def\b{\string\b}\def\v{\string\v}\def\s{\string\s}%
-% \def\1{\string\1}\def\2{\string\2}\def\3{\string\3}\def\4{\string\4}\def\5{\string\5}%
-% \def\6{\string\6}\def\7{\string\7}\def\8{\string\8}\def\9{\string\9}\def\0{\string\0}}
\let\obeylualines\relax
@@ -135,17 +111,20 @@
\csname dodostartnamed#1\v!code\endcsname}
\unexpanded\def\definenamedlua[#1]#2[#3]% no optional arg handling here yet
- {\scratchcounter\ctxlua{lua.registername("#1","#3")}%
- \normalexpanded{\long\edef\csname dodostartnamed#1\v!code\endcsname##1\csname\e!stop#1\v!code\endcsname}%
- {\endgroup\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}%
- \long\expandafter\def \csname\e!start#1\v!code\endcsname {\dostartnamedluacode{#1}}%
- \long\expandafter\edef\csname #1\v!code\endcsname##1{\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}}
+ {\ifcsname dodostartnamed#1\v!code\endcsname\else
+ \scratchcounter\ctxlua{lua.registername("#1","#3")}%
+ \normalexpanded{\long\edef\csname dodostartnamed#1\v!code\endcsname##1\csname\e!stop#1\v!code\endcsname}%
+ {\endgroup\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}%
+ \long\expandafter\def \csname\e!start#1\v!code\endcsname {\dostartnamedluacode{#1}}%
+ \long\expandafter\edef\csname #1\v!code\endcsname##1{\noexpand\directlua\the\scratchcounter{protect("#1\s!data")##1}}%
+ \fi}
%D We predefine a few.
+% \definenamedlua[module][module instance] % not needed
+
\definenamedlua[user] [private user instance]
\definenamedlua[third] [third party module instance]
-\definenamedlua[module] [module instance]
\definenamedlua[isolated][isolated instance]
%D In practice this works out as follows:
@@ -230,14 +209,33 @@
% tree=true
% \stopluaparameterset
%
-% options=u3d:myset:display:1
+% option=u3d:myset:display:1
%
% or:
%
-% options=\luaparameterset{u3d:myset:display:1}{toolbar=false,tree=true}
+% option=\luaparameterset{u3d:myset:display:1}{toolbar=false,tree=true}
%D A Handy helper:
\def\luaconditional#1{\ifcase#1tru\else fals\fi e}
+%D Goodie:
+%D
+%D \starttyping
+%D \ctxluacode{context("%0.5f",1/3)}
+%D \stoptyping
+
+\long\def\ctxluacode
+ {\begingroup
+ \obeylualines
+ \obeyluatokens
+ \catcode\leftbraceasciicode \plusone
+ \catcode\rightbraceasciicode\plustwo
+ \afterassignment\doctxluacode
+ \scratchtoks=}
+
+\def\doctxluacode
+ {\normalexpanded{\endgroup\noexpand\directlua\zerocount\expandafter{\the\scratchtoks}}}
+
+
\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 e5722d2bd7f..091639de231 100644
--- a/Master/texmf-dist/tex/context/base/luat-iop.lua
+++ b/Master/texmf-dist/tex/context/base/luat-iop.lua
@@ -13,10 +13,12 @@ if not modules then modules = { } end modules ['luat-iop'] = {
local lower, find, sub = string.lower, string.find, string.sub
+local allocate = utilities.storage.allocate
+
local ioinp = io.inp if not ioinp then ioinp = { } io.inp = ioinp end
local ioout = io.out if not ioout then ioout = { } io.out = ioout end
-ioinp.modes, ioout.modes = { }, { } -- functions
+ioinp.modes, ioout.modes = allocate(), allocate()
local inp_blocked, inp_permitted = { }, { }
local out_blocked, out_permitted = { }, { }
@@ -29,10 +31,10 @@ local function o_permit (name) out_permitted[#out_permitted+1] = name end
ioinp.inhibit, ioinp.permit = i_inhibit, o_permit
ioout.inhibit, ioout.permit = o_inhibit, o_permit
-local blocked_openers = { } -- *.open(name,method)
+local blockedopeners = { } -- *.open(name,method)
-function io.register_opener(func)
- blocked_openers[#blocked_openers+1] = func
+function io.registeropener(func)
+ blockedopeners[#blockedopeners+1] = func
end
local function checked(name,blocked,permitted)
@@ -50,7 +52,7 @@ local function checked(name,blocked,permitted)
return true
end
-function io.finalize_openers(func)
+function io.finalizeopeners(func)
if #out_blocked > 0 or #inp_blocked > 0 then
local open = func -- why not directly?
return function(name,method)
@@ -78,7 +80,7 @@ end
--~ io.inp.inhibit('/winnt/')
--~ io.inp.permit('c:/windows/wmsetup.log')
---~ io.open = io.finalize_openers(io.open)
+--~ io.open = io.finalizeopeners(io.open)
--~ f = io.open('.tex') print(f)
--~ f = io.open('tufte.tex') print(f)
@@ -87,18 +89,6 @@ end
--~ f = io.open('c:/windows/crap.log') print(f)
--~ f = io.open('c:/windows/wmsetup.log') print(f)
-local inpout = { 'inp', 'out' }
-
-function io.set_opener_modes(i,o)
- local first = sub(i,1,1)
- for k=1,#inpout do
- local iov = io[inpout[k]]
- local f = iov[i] or iov[first]
- if f then f() end
- end
- io.open = io.finalize_openers(io.open)
-end
-
-- restricted
function ioinp.modes.restricted()
@@ -116,12 +106,12 @@ function ioinp.modes.paranoid()
i_inhibit('%.%.')
i_permit('^%./')
i_permit('[^/]')
- resolvers.do_with_path('TEXMF',i_permit)
+ resolvers.dowithpath('TEXMF',i_permit)
end
function ioout.modes.paranoid()
o_inhibit('.*')
- resolvers.do_with_path('TEXMFOUTPUT',o_permit)
+ resolvers.dowithpath('TEXMFOUTPUT',o_permit)
end
-- handy
@@ -143,6 +133,16 @@ function ioout.modes.handy()
o_permit('[^/]')
end
---~ io.set_opener_modes('p','p')
---~ io.set_opener_modes('r','r')
---~ io.set_opener_modes('h','h')
+local input_mode directives.register("system.inputmode", function(v) input_mode = v end)
+local output_mode directives.register("system.outputmode", function(v) output_mode = v end)
+
+function io.checkopeners()
+ local inp = input_mode or resolvers.variable("input_mode") -- or ... will become obsolete
+ local out = output_mode or resolvers.variable("output_mode") -- or ... will become obsolete
+ inp = inp and ioinp.modes[inp]
+ out = out and ioinp.modes[out]
+ if inp then inp() end
+ if out then out() end
+end
+
+--~ io.checkopeners()
diff --git a/Master/texmf-dist/tex/context/base/luat-lib.mkiv b/Master/texmf-dist/tex/context/base/luat-lib.mkiv
index 91ddec0aa62..83b96639b79 100644
--- a/Master/texmf-dist/tex/context/base/luat-lib.mkiv
+++ b/Master/texmf-dist/tex/context/base/luat-lib.mkiv
@@ -11,60 +11,66 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-% \writestatus{loading}{ConTeXt Lua Macros / Libraries}
+\writestatus{loading}{ConTeXt Lua Macros / Libraries}
-\registerctxluafile{trac-inf} {1.001}
-\registerctxluafile{trac-tra} {1.001}
-\registerctxluafile{trac-log} {1.001}
+\registerctxluafile{util-str}{1.001}
+\registerctxluafile{util-tab}{1.001}
+\registerctxluafile{util-pck}{1.001}
+\registerctxluafile{util-sto}{1.001} % could also be done in trac-deb.mkiv
+\registerctxluafile{util-seq}{1.001}
+%registerctxluafile{util-mrg}{1.001} % not needed in context itself, only mtxrun
+\registerctxluafile{util-lua}{1.001}
+\registerctxluafile{util-prs}{1.001}
+\registerctxluafile{util-fmt}{1.001}
+\registerctxluafile{util-deb}{1.001} % could also be done in trac-deb.mkiv
+\registerctxluafile{util-dim}{1.001}
-\registerctxluafile{luat-cbk} {1.001}
+\registerctxluafile{trac-inf}{1.001}
+\registerctxluafile{trac-set}{1.001}
+\registerctxluafile{trac-log}{1.001}
+%registerctxluafile{trac-pro}{1.001}
-\registerctxluafile{data-res} {1.001}
-\registerctxluafile{data-tmp} {1.001}
-\registerctxluafile{data-pre} {1.001}
-\registerctxluafile{data-inp} {1.001}
-\registerctxluafile{data-out} {1.001}
-\registerctxluafile{data-tex} {1.001}
-\registerctxluafile{data-bin} {1.001}
-\registerctxluafile{data-zip} {1.001}
-%registerctxluafile{data-crl} {1.001}
-\registerctxluafile{data-sch} {1.001}
-\registerctxluafile{data-tre} {1.001}
-\registerctxluafile{data-lua} {1.001}
-\registerctxluafile{data-ctx} {1.001}
-\registerctxluafile{data-con} {1.001}
-\registerctxluafile{data-use} {1.001}
+\registerctxluafile{data-ini}{1.001}
+\registerctxluafile{data-exp}{1.001}
+\registerctxluafile{data-env}{1.001}
+\registerctxluafile{data-tmp}{1.001}
+\registerctxluafile{data-met}{1.001}
+\registerctxluafile{data-res}{1.001}
+\registerctxluafile{data-inp}{1.001}
+\registerctxluafile{data-out}{1.001}
+\registerctxluafile{data-fil}{1.001}
-\registerctxluafile{luat-run} {1.001}
-\registerctxluafile{luat-fio} {1.001} % not needed, part of startup file
-\registerctxluafile{luat-cnf} {1.001} % not needed, part of startup file
-\registerctxluafile{luat-lua} {1.001}
-\registerctxluafile{luat-sto} {1.001}
-\registerctxluafile{luat-ini} {1.001}
-\registerctxluafile{luat-env} {1.001}
+\registerctxluafile{data-pre}{1.001}
+\registerctxluafile{data-tex}{1.001}
+\registerctxluafile{data-vir}{1.001}
+\registerctxluafile{data-bin}{1.001}
+\registerctxluafile{data-zip}{1.001}
+%registerctxluafile{data-crl}{1.001}
+\registerctxluafile{data-sch}{1.001}
+\registerctxluafile{data-tre}{1.001}
+\registerctxluafile{data-lua}{1.001}
+\registerctxluafile{data-ctx}{1.001}
+\registerctxluafile{data-con}{1.001}
+\registerctxluafile{data-use}{1.001}
+\registerctxluafile{data-aux}{1.001}
-\registerctxluafile{lxml-tab} {1.001}
-\registerctxluafile{lxml-lpt} {1.001}
-\registerctxluafile{lxml-xml} {1.001}
-\registerctxluafile{lxml-aux} {1.001}
-\registerctxluafile{lxml-mis} {1.001}
-
-\startruntimeluacode
- \edef\asciia{\ctxlua{tex.sprint(logs.mode)}}
- \edef\asciib{xml}
- \ifx\asciia\asciib % brrr
- \long\def\writebanner #1{\writestring {<m t='banner'>#1</m>}}
- \long\def\writestatus#1#2{\writestring {<m t='#1'>#2</m>}}
- \long\def\message #1{\normalmessage{<m t='message'>#1</m>}}
- \else
- \let\writebanner\writestring
- %\let\writestatus\normalwritestatus
- \let\message \normalmessage
- \fi
-\stopruntimeluacode
-
-%registerctxluafile{luat-tmp}{1.001}
+\registerctxluafile{luat-cbk}{1.001}
+\registerctxluafile{luat-run}{1.001}
+\registerctxluafile{luat-fio}{1.001}
+\registerctxluafile{luat-cnf}{1.001}
+\registerctxluafile{luat-lua}{1.001}
+\registerctxluafile{luat-sto}{1.001}
+\registerctxluafile{luat-ini}{1.001}
+\registerctxluafile{luat-env}{1.001}
\registerctxluafile{luat-exe}{1.001}
\registerctxluafile{luat-iop}{1.001}
+\registerctxluafile{luat-bwc}{1.001}
+\registerctxluafile{luat-mac}{1.001}
+
+\registerctxluafile{lxml-tab}{1.001}
+\registerctxluafile{lxml-lpt}{1.001}
+\registerctxluafile{lxml-xml}{1.001}
+\registerctxluafile{lxml-aux}{1.001}
+\registerctxluafile{lxml-mis}{1.001}
\endinput
diff --git a/Master/texmf-dist/tex/context/base/luat-lua.lua b/Master/texmf-dist/tex/context/base/luat-lua.lua
index b964bf8e80d..50492540d25 100644
--- a/Master/texmf-dist/tex/context/base/luat-lua.lua
+++ b/Master/texmf-dist/tex/context/base/luat-lua.lua
@@ -10,11 +10,7 @@ if lua then do
local delayed = { }
- function lua.delay(f)
- delayed[#delayed+1] = f
- end
-
- function lua.flush_delayed(...)
+ local function flushdelayed(...)
local t = delayed
delayed = { }
for i=1, #t do
@@ -22,8 +18,12 @@ if lua then do
end
end
+ function lua.delay(f)
+ delayed[#delayed+1] = f
+ end
+
function lua.flush(...)
- tex.sprint("\\directlua0{lua.flush_delayed(",table.concat({...},','),")}")
+ tex.sprint("\\directlua{flushdelayed(",table.concat({...},','),")}")
end
end end
diff --git a/Master/texmf-dist/tex/context/base/luat-mac.lua b/Master/texmf-dist/tex/context/base/luat-mac.lua
new file mode 100644
index 00000000000..0dc6593c659
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/luat-mac.lua
@@ -0,0 +1,271 @@
+if not modules then modules = { } end modules ['luat-mac'] = {
+ 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 P, V, S, R, C, Cs, Cmt, Carg = lpeg.P, lpeg.V, lpeg.S, lpeg.R, lpeg.C, lpeg.Cs, lpeg.Cmt, lpeg.Carg
+local lpegmatch, patterns = lpeg.match, lpeg.patterns
+
+local insert, remove = table.insert, table.remove
+local rep, sub = string.rep, string.sub
+local setmetatable = setmetatable
+
+local pushtarget, poptarget = logs.pushtarget, logs.poptarget
+
+local report_macros = logs.reporter("interface","macros")
+
+local stack, top, n, hashes = { }, nil, 0, { }
+
+local function set(s)
+ if top then
+ n = n + 1
+ if n > 9 then
+ report_macros("number of arguments > 9, ignoring %s",s)
+ else
+ local ns = #stack
+ local h = hashes[ns]
+ if not h then
+ h = rep("#",ns)
+ hashes[ns] = h
+ end
+ m = h .. n
+ top[s] = m
+ return m
+ end
+ end
+end
+
+local function get(s)
+ if not top then
+ report_macros("keeping #%s, no stack",s)
+ return "#" .. s -- can be lua
+ end
+ local m = top[s]
+ if m then
+ return m
+ else
+ report_macros("keeping #%s, not on stack",s)
+ return "#" .. s -- quite likely an error
+ end
+end
+
+local function push()
+ top = { }
+ n = 0
+ local s = stack[#stack]
+ if s then
+ setmetatable(top,{ __index = s })
+ end
+ insert(stack,top)
+end
+
+local function pop()
+ top = remove(stack)
+end
+
+local leftbrace = P("{") -- will be in patterns
+local rightbrace = P("}")
+local escape = P("\\")
+
+local space = patterns.space
+local spaces = space^1
+local newline = patterns.newline
+local nobrace = 1 - leftbrace - rightbrace
+
+local longleft = leftbrace -- P("(")
+local longright = rightbrace -- P(")")
+local nolong = 1 - longleft - longright
+
+local name = R("AZ","az")^1
+local csname = (R("AZ","az") + S("@?!_"))^1
+local longname = (longleft/"") * (nolong^1) * (longright/"")
+local variable = P("#") * Cs(name + longname)
+local escapedname = escape * csname
+local definer = escape * (P("def") + P("egx") * P("def")) -- tex
+local setter = escape * P("set") * (P("u")^-1 * P("egx")^-1) * P("value") -- context specific
+--- + escape * P("install") * (1-P("handler"))^1 * P("handler") -- context specific
+local startcode = P("\\starttexdefinition") -- context specific
+local stopcode = P("\\stoptexdefinition") -- context specific
+local anything = patterns.anything
+local always = patterns.alwaysmatched
+
+-- The comment nilling can become an option but it nicely compensates the Lua
+-- parsing here with less parsing at the TeX end. We keep lines so the errors
+-- get reported all right, but comments are never seen there anyway. We keep
+-- comment that starts inline as it can be something special with a % (at some
+-- point we can do that as well, esp if we never use \% or `% somewhere
+-- unpredictable). We need to skip comments anyway. Hm, too tricky, this
+-- stripping as we can have Lua code etc.
+
+local commenttoken = P("%")
+local crorlf = S("\n\r")
+local commentline = commenttoken * ((Carg(1) * C((1-crorlf)^0))/function(strip,s) return strip and "" or s end)
+local commentline = commenttoken * ((1-crorlf)^0)
+local leadingcomment = (commentline * crorlf^1)^1
+local furthercomment = (crorlf^1 * commentline)^1
+
+local pushlocal = always / push
+local poplocal = always / pop
+local declaration = variable / set
+local identifier = variable / get
+
+local argument = leftbrace * ((identifier + (1-rightbrace))^0) * rightbrace
+
+local function matcherror(str,pos)
+ report_macros("runaway definition at: %s",sub(str,pos-30,pos))
+end
+
+local grammar = { "converter",
+ texcode = pushlocal
+ * startcode
+ * spaces
+ * name
+ * spaces
+ * (declaration + furthercomment + (1 - newline - space))^0
+ * V("texbody")
+ * stopcode
+ * poplocal,
+ texbody = ( V("definition")
+ + identifier
+ + V("braced")
+ + (1 - stopcode)
+ )^0,
+ definition = pushlocal
+ * definer
+ * escapedname
+ * (declaration + furthercomment + commentline + (1-leftbrace))^0
+ * V("braced")
+ * poplocal,
+ setcode = pushlocal
+ * setter
+ * argument
+ * (declaration + furthercomment + commentline + (1-leftbrace))^0
+ * V("braced")
+ * poplocal,
+ braced = leftbrace
+ * ( V("definition")
+ + identifier
+ + V("setcode")
+ + V("texcode")
+ + V("braced")
+ + furthercomment
+ + nobrace
+ )^0
+ -- * rightbrace^-1, -- the -1 catches errors
+ * (rightbrace + Cmt(always,matcherror)),
+
+ pattern = leadingcomment
+ + V("definition")
+ + V("setcode")
+ + V("texcode")
+ + furthercomment
+ + anything,
+
+ converter = V("pattern")^1,
+}
+
+local parser = Cs(grammar)
+
+local checker = P("%") * (1 - newline - P("macros"))^0
+ * P("macros") * space^0 * P("=") * space^0 * C(patterns.letter^1)
+
+-- maybe namespace
+
+local macros = { } resolvers.macros = macros
+
+function macros.preprocessed(str,strip)
+ return lpegmatch(parser,str,1,strip)
+end
+
+function macros.convertfile(oldname,newname) -- beware, no testing on oldname == newname
+ local data = resolvers.loadtexfile(oldname)
+ data = interfaces.preprocessed(data) or ""
+ io.savedata(newname,data)
+end
+
+function macros.version(data)
+ return lpegmatch(checker,data)
+end
+
+function macros.processmkvi(str,filename)
+ if (filename and file.suffix(filename) == "mkvi") or lpegmatch(checker,str) == "mkvi" then
+ local result = lpegmatch(parser,str,1,true) or str
+ pushtarget("log")
+ report_macros("processed file '%s', delta %s",filename,#str-#result)
+ poptarget("log")
+ return result
+ else
+ return str
+ end
+end
+
+if resolvers.schemes then
+
+ local function handler(protocol,name,cachename)
+ local hashed = url.hashed(name)
+ local path = hashed.path
+ if path and path ~= "" then
+ local str = resolvers.loadtexfile(path)
+ if file.suffix(path) == "mkvi" or lpegmatch(checker,str) == "mkvi" then
+ -- already done automatically
+ io.savedata(cachename,str)
+ else
+ local result = lpegmatch(parser,str,1,true) or str
+ pushtarget("log")
+ report_macros("processed scheme '%s', delta %s",filename,#str-#result)
+ poptarget("log")
+ io.savedata(cachename,result)
+ end
+ end
+ return cachename
+ end
+
+ resolvers.schemes.install('mkvi',handler,1) -- this will cache !
+
+ utilities.sequencers.appendaction(resolvers.openers.helpers.textfileactions,"system","resolvers.macros.processmkvi")
+ -- utilities.sequencers.disableaction(resolvers.openers.helpers.textfileactions,"resolvers.macros.processmkvi")
+
+end
+
+--~ print(macros.preprocessed([[\def\bla#bla{bla#{bla}}]]))
+--~ print(macros.preprocessed([[\def\bla#bla{#{bla}bla}]]))
+--~ print(macros.preprocessed([[\def\blä#{blá}{blà:#{blá}}]]))
+--~ print(macros.preprocessed([[\def\blä#bla{blà:#bla}]]))
+--~ print(macros.preprocessed([[\setvalue{xx}#bla{blà:#bla}]]))
+--~ print(macros.preprocessed([[\def\foo#bar{\setvalue{xx#bar}{#bar}}]]))
+--~ print(macros.preprocessed([[\def\bla#bla{bla:#{bla}}]]))
+--~ print(macros.preprocessed([[\def\bla_bla#bla{bla:#bla}]]))
+--~ print(macros.preprocessed([[\def\test#oeps{test:#oeps}]]))
+--~ print(macros.preprocessed([[\def\test_oeps#oeps{test:#oeps}]]))
+--~ print(macros.preprocessed([[\def\test#oeps{test:#{oeps}}]]))
+--~ print(macros.preprocessed([[\def\test#{oeps:1}{test:#{oeps:1}}]]))
+--~ print(macros.preprocessed([[\def\test#{oeps}{test:#oeps}]]))
+--~ print(macros.preprocessed([[\def\test#{oeps}{test:#oeps \halign{##\cr #oeps\cr}]]))
+--~ print(macros.preprocessed([[\def\test#{oeps}{test:#oeps \halign{##\cr #oeps\cr}}]]))
+--~ print(macros.preprocessed([[% test
+--~ \def\test#oeps{#oeps} % {test}
+--~ % test
+--~
+--~ % test
+--~ two
+--~ %test]]))
+--~ print(macros.preprocessed([[
+--~ \def\scrn_button_make_normal#namespace#current#currentparameter#text%
+--~ {\ctxlua{structures.references.injectcurrentset(nil,nil)}%
+--~ % \hbox attr \referenceattribute \lastreferenceattribute {\localframed[#namespace:#current]{#text}}}
+--~ \hbox attr \referenceattribute \lastreferenceattribute {\directlocalframed[#namespace:#current]{#text}}}
+--~ ]]))
+--~
+--~ print(macros.preprocessed([[
+--~ \def\definefoo[#name]%
+--~ {\setvalue{start#name}{\dostartfoo{#name}}}
+--~ \def\dostartfoo#name%
+--~ {\def\noexpand\next#content\expandafter\noexpand\csname stop#name\endcsname{#name : #content}%
+--~ \next}
+--~ \def\dostartfoo#name%
+--~ {\normalexpanded{\def\noexpand\next#content\expandafter\noexpand\csname stop#name\endcsname}{#name : #content}%
+--~ \next}
+--~ ]]))
diff --git a/Master/texmf-dist/tex/context/base/luat-run.lua b/Master/texmf-dist/tex/context/base/luat-run.lua
index b64a99fc6b8..51856640d2d 100644
--- a/Master/texmf-dist/tex/context/base/luat-run.lua
+++ b/Master/texmf-dist/tex/context/base/luat-run.lua
@@ -6,36 +6,44 @@ if not modules then modules = { } end modules ['luat-run'] = {
license = "see context related readme files"
}
-local format, rpadd = string.format, string.rpadd
+local format = string.format
+local insert = table.insert
-main = main or { }
+local trace_lua_dump = false trackers.register("system.dump", function(v) trace_lua_dump = v end)
+local trace_temp_files = false trackers.register("system.tempfiles", function(v) trace_temp_files = v end)
-local start_actions = { }
-local stop_actions = { }
+local report_lua = logs.reporter("system","lua")
+local report_tempfiles = logs.reporter("resolvers","tempfiles")
-function main.register_start_actions(...) table.insert(start_actions, ...) end
-function main.register_stop_actions (...) table.insert(stop_actions, ...) end
+luatex = luatex or { }
+local luatex = luatex
-main.show_tex_stat = main.show_tex_stat or function() end
-main.show_job_stat = main.show_job_stat or statistics.show_job_stat
+local startactions = { }
+local stopactions = { }
-function main.start()
+function luatex.registerstartactions(...) insert(startactions, ...) end
+function luatex.registerstopactions (...) insert(stopactions, ...) end
+
+luatex.showtexstat = luatex.showtexstat or function() end
+luatex.showjobstat = luatex.showjobstat or statistics.showjobstat
+
+local function start_run()
if logs.start_run then
logs.start_run()
end
- for _, action in next, start_actions do
- action()
+ for i=1,#startactions do
+ startactions[i]()
end
end
-function main.stop()
- for _, action in next, stop_actions do
- action()
+local function stop_run()
+ for i=1,#stopactions do
+ stopactions[i]()
end
- if main.show_job_stat then
+ if luatex.showjobstat then
statistics.show(logs.report_job_stat)
end
- if main.show_tex_stat then
+ if luatex.showtexstat then
for k,v in next, status.list() do
logs.report_tex_stat(k,v)
end
@@ -45,30 +53,103 @@ function main.stop()
end
end
-function main.start_shipout_page()
+local function start_shipout_page()
logs.start_page_number()
end
-function main.stop_shipout_page()
+local function stop_shipout_page()
logs.stop_page_number()
end
-function main.report_output_pages()
+local function report_output_pages()
end
-function main.report_output_log()
+local function report_output_log()
+end
+
+--~ local function show_open()
+--~ end
+
+--~ local function show_close()
+--~ end
+
+local function pre_dump_actions()
+ lua.finalize(trace_lua_dump and report_lua or nil)
+ statistics.reportstorage("log")
+ -- statistics.savefmtstatus("\jobname","\contextversion","context.tex")
end
-- this can be done later
-callbacks.register('start_run', main.start, "actions performed at the beginning of a run")
-callbacks.register('stop_run', main.stop, "actions performed at the end of a run")
+callbacks.register('start_run', start_run, "actions performed at the beginning of a run")
+callbacks.register('stop_run', stop_run, "actions performed at the end of a run")
+
+--~ callbacks.register('show_open', show_open, "actions performed when opening a file")
+--~ callbacks.register('show_close', show_close, "actions performed when closing a file")
-callbacks.register('report_output_pages', main.report_output_pages, "actions performed when reporting pages")
-callbacks.register('report_output_log', main.report_output_log, "actions performed when reporting log file")
+callbacks.register('report_output_pages', report_output_pages, "actions performed when reporting pages")
+callbacks.register('report_output_log', report_output_log, "actions performed when reporting log file")
-callbacks.register('start_page_number', main.start_shipout_page, "actions performed at the beginning of a shipout")
-callbacks.register('stop_page_number', main.stop_shipout_page, "actions performed at the end of a shipout")
+callbacks.register('start_page_number', start_shipout_page, "actions performed at the beginning of a shipout")
+callbacks.register('stop_page_number', stop_shipout_page, "actions performed at the end of a shipout")
-callbacks.register('process_input_buffer', false, "actions performed when reading data")
-callbacks.register('process_output_buffer', false, "actions performed when writing data")
+callbacks.register('process_input_buffer', false, "actions performed when reading data")
+callbacks.register('process_output_buffer', false, "actions performed when writing data")
+
+callbacks.register("pre_dump", pre_dump_actions, "lua related finalizers called before we dump the format") -- comes after \everydump
+
+-- an example:
+
+local tempfiles = { }
+
+function luatex.registertempfile(name,extrasuffix)
+ if extrasuffix then
+ name = name .. ".mkiv-tmp" -- maybe just .tmp
+ end
+ if trace_temp_files and not tempfiles[name] then
+ report_tempfiles("registering temporary file: %s",name)
+ end
+ tempfiles[name] = true
+ return name
+end
+
+function luatex.cleanuptempfiles()
+ for name, _ in next, tempfiles do
+ if trace_temp_files then
+ report_tempfiles("removing temporary file: %s",name)
+ end
+ os.remove(name)
+ end
+ tempfiles = { }
+end
+
+luatex.registerstopactions(luatex.cleanuptempfiles)
+
+-- for the moment here
+
+local synctex = false
+
+local report_system = logs.reporter("system")
+
+directives.register("system.synctex", function(v)
+ synctex = v
+ if v then
+ report_system("synctex functionality is enabled!")
+ else
+ report_system("synctex functionality is disabled!")
+ end
+ -- current this is bugged:
+ tex.synctex = synctex and 1 or 0
+ -- so for the moment we need:
+ if synctex then
+ tex.print("\\normalsynctex\\plusone")
+ else
+ tex.print("\\normalsynctex\\zerocount")
+ end
+end)
+
+statistics.register("synctex tracing",function()
+ if synctex or tex.synctex > 0 then
+ return "synctex has been enabled (extra log file generated)"
+ end
+end)
diff --git a/Master/texmf-dist/tex/context/base/luat-sta.lua b/Master/texmf-dist/tex/context/base/luat-sta.lua
index a81b0c206fc..8b58774d357 100644
--- a/Master/texmf-dist/tex/context/base/luat-sta.lua
+++ b/Master/texmf-dist/tex/context/base/luat-sta.lua
@@ -10,9 +10,15 @@ if not modules then modules = { } end modules ['luat-sta'] = {
local gmatch, match = string.gmatch, string.match
local type = type
-states = states or { }
-states.data = states.data or { }
-states.hash = states.hash or { }
+states = states or { }
+local states = states
+
+states.data = states.data or { }
+local data = states.data
+
+states.hash = states.hash or { }
+local hash = states.hash
+
states.tag = states.tag or ""
states.filename = states.filename or ""
@@ -22,7 +28,7 @@ function states.save(filename,tag)
io.savedata(filename,
"-- generator : luat-sta.lua\n" ..
"-- state tag : " .. tag .. "\n\n" ..
- table.serialize(states.data[tag or states.tag] or {},true)
+ table.serialize(data[tag or states.tag] or {},true)
)
end
@@ -30,11 +36,11 @@ function states.load(filename,tag)
states.filename = filename
states.tag = tag or "whatever"
states.filename = file.addsuffix(states.filename,'lus')
- states.data[states.tag], states.hash[states.tag] = (io.exists(filename) and dofile(filename)) or { }, { }
+ data[states.tag], hash[states.tag] = (io.exists(filename) and dofile(filename)) or { }, { }
end
-function states.set_by_tag(tag,key,value,default,persistent)
- local d, h = states.data[tag], states.hash[tag]
+local function set_by_tag(tag,key,value,default,persistent)
+ local d, h = data[tag], hash[tag]
if d then
if type(d) == "table" then
local dkey, hkey = key, key
@@ -54,8 +60,10 @@ function states.set_by_tag(tag,key,value,default,persistent)
end
dkey, hkey = post, key
end
- if type(value) == nil then
- value = value or default
+ if value == nil then
+ value = default
+ elseif value == false then
+ -- special case
elseif persistent then
value = value or d[dkey] or default
else
@@ -64,40 +72,47 @@ function states.set_by_tag(tag,key,value,default,persistent)
d[dkey], h[hkey] = value, value
elseif type(d) == "string" then
-- weird
- states.data[tag], states.hash[tag] = value, value
+ data[tag], hash[tag] = value, value
end
end
end
-function states.get_by_tag(tag,key,default)
- local h = states.hash[tag]
+local function get_by_tag(tag,key,default)
+ local h = hash[tag]
if h and h[key] then
return h[key]
else
- local d = states.data[tag]
+ local d = data[tag]
if d then
for k in gmatch(key,"[^%.]+") do
local dk = d[k]
- if dk then
+ if dk ~= nil then
d = dk
else
return default
end
end
- return d or default
+ if d == false then
+ return false
+ else
+ return d or default
+ end
end
end
end
+states.set_by_tag = set_by_tag
+states.get_by_tag = get_by_tag
+
function states.set(key,value,default,persistent)
- states.set_by_tag(states.tag,key,value,default,persistent)
+ set_by_tag(states.tag,key,value,default,persistent)
end
function states.get(key,default)
- return states.get_by_tag(states.tag,key,default)
+ return get_by_tag(states.tag,key,default)
end
---~ states.data.update = {
+--~ data.update = {
--~ ["version"] = {
--~ ["major"] = 0,
--~ ["minor"] = 1,
diff --git a/Master/texmf-dist/tex/context/base/luat-sto.lua b/Master/texmf-dist/tex/context/base/luat-sto.lua
index 08da735db31..946ce375607 100644
--- a/Master/texmf-dist/tex/context/base/luat-sto.lua
+++ b/Master/texmf-dist/tex/context/base/luat-sto.lua
@@ -6,96 +6,86 @@ if not modules then modules = { } end modules ['luat-sto'] = {
license = "see context related readme files"
}
-local type, next = type, next
+local type, next, setmetatable, getmetatable = type, next, setmetatable, getmetatable
local gmatch, format, write_nl = string.gmatch, string.format, texio.write_nl
+local serialize, concat = table.serialize, table.concat
+local bytecode = lua.bytecode
+
+local report_storage = logs.reporter("system","storage")
storage = storage or { }
+local storage = storage
+
+local data = { }
+storage.data = data
+
+local evaluators = { }
+storage.evaluators = evaluators
+
storage.min = 0 -- 500
storage.max = storage.min - 1
storage.noftables = storage.noftables or 0
storage.nofmodules = storage.nofmodules or 0
-storage.data = { }
-storage.evaluators = { }
-local evaluators = storage.evaluators -- (evaluate,message,names)
-local data = storage.data
+storage.mark = utilities.storage.mark
+storage.allocate = utilities.storage.allocate
+storage.marked = utilities.storage.marked
function storage.register(...)
- data[#data+1] = { ... }
-end
-
--- evaluators .. messy .. to be redone
-
-function storage.evaluate(name)
- evaluators[#evaluators+1] = name
-end
-
-function storage.finalize() -- we can prepend the string with "evaluate:"
- for i=1,#evaluators do
- local t = evaluators[i]
- for i, v in next, t do
- local tv = type(v)
- if tv == "string" then
- t[i] = loadstring(v)()
- elseif tv == "table" then
- for _, vv in next, v do
- if type(vv) == "string" then
- t[i] = loadstring(vv)()
- end
- end
- elseif tv == "function" then
- t[i] = v()
- end
- end
+ local t = { ... }
+ local d = t[2]
+ if d then
+ storage.mark(d)
+ else
+ report_storage("fatal error: invalid storage '%s'",t[1])
+ os.exit()
end
+ data[#data+1] = t
+ return t
end
-function storage.dump()
+local function dump()
+ local max = storage.max
for i=1,#data do
local d = data[i]
- local message, original, target, evaluate = d[1], d[2] ,d[3] ,d[4]
- local name, initialize, finalize, code = nil, "", "", ""
+ local message, original, target = d[1], d[2] ,d[3]
+ local c, code, name = 0, { }, nil
for str in gmatch(target,"([^%.]+)") do
if name then
name = name .. "." .. str
else
name = str
end
- initialize = format("%s %s = %s or {} ", initialize, name, name)
- end
- if evaluate then
- finalize = "storage.evaluate(" .. name .. ")"
+ c = c + 1 ; code[c] = format("%s = %s or { }",name,name)
end
- storage.max = storage.max + 1
+ max = max + 1
if trace_storage then
- logs.report('storage','saving %s in slot %s',message,storage.max)
- code =
- initialize ..
- format("logs.report('storage','restoring %s from slot %s') ",message,storage.max) ..
- table.serialize(original,name) ..
- finalize
- else
- code = initialize .. table.serialize(original,name) .. finalize
+ report_storage('saving %s in slot %s',message,max)
+ c = c + 1 ; code[c] = format("report_storage('restoring %s from slot %s')",message,max)
end
- lua.bytecode[storage.max] = loadstring(code)
+ c = c + 1 ; code[c] = serialize(original,name)
+ bytecode[max] = loadstring(concat(code,"\n"))
collectgarbage("step")
end
+ storage.max = max
end
+lua.registerfinalizer(dump,"dump storage")
+
-- we also need to count at generation time (nicer for message)
-if lua.bytecode then -- from 0 upwards
- local i, b = storage.min, lua.bytecode
- while b[i] do
- storage.noftables = i
- b[i]()
- b[i] = nil
- i = i + 1
- end
-end
+--~ if lua.bytecode then -- from 0 upwards
+--~ local i, b = storage.min, lua.bytecode
+--~ while b[i] do
+--~ storage.noftables = i
+--~ b[i]()
+--~ b[i] = nil
+--~ i = i + 1
+--~ end
+--~ end
statistics.register("stored bytecode data", function()
- local modules = (storage.nofmodules > 0 and storage.nofmodules) or (status.luabytecodes - 500)
+ local modules = (storage.nofmodules > 0 and storage.nofmodules) or (status.luabytecodes - lua.firstbytecode - 1)
local dumps = (storage.noftables > 0 and storage.noftables) or storage.max-storage.min + 1
return format("%s modules, %s tables, %s chunks",modules,dumps,modules+dumps)
end)
@@ -104,9 +94,7 @@ if lua.bytedata then
storage.register("lua/bytedata",lua.bytedata,"lua.bytedata")
end
--- wrong place, kind of forward reference
-
-function statistics.report_storage(whereto)
+function statistics.reportstorage(whereto)
whereto = whereto or "term and log"
write_nl(whereto," ","stored tables:"," ")
for k,v in table.sortedhash(storage.data) do
@@ -133,3 +121,11 @@ storage.shared = storage.shared or { }
-- (non table) values.
storage.register("storage/shared", storage.shared, "storage.shared")
+
+local mark = storage.mark
+
+if string.patterns then mark(string.patterns) end
+if lpeg.patterns then mark(lpeg.patterns) end
+if os.env then mark(os.env) end
+if number.dimenfactors then mark(number.dimenfactors) end
+if libraries then for k,v in next, libraries do mark(v) end end
diff --git a/Master/texmf-dist/tex/context/base/lxml-aux.lua b/Master/texmf-dist/tex/context/base/lxml-aux.lua
index 00f7919098f..4798fe06a7a 100644
--- a/Master/texmf-dist/tex/context/base/lxml-aux.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-aux.lua
@@ -11,15 +11,20 @@ if not modules then modules = { } end modules ['lxml-aux'] = {
local trace_manipulations = false trackers.register("lxml.manipulations", function(v) trace_manipulations = v end)
-local xmlparseapply, xmlconvert, xmlcopy, xmlname = xml.parse_apply, xml.convert, xml.copy, xml.name
+local report_xml = logs.reporter("xml")
+
+local xml = xml
+
+local xmlconvert, xmlcopy, xmlname = xml.convert, xml.copy, xml.name
local xmlinheritedconvert = xml.inheritedconvert
+local xmlapplylpath = xml.applylpath
-local type = type
-local insert, remove = table.insert, table.remove
+local type, setmetatable, getmetatable = type, setmetatable, getmetatable
+local insert, remove, fastcopy = table.insert, table.remove, table.fastcopy
local gmatch, gsub = string.gmatch, string.gsub
local function report(what,pattern,c,e)
- logs.report("xml","%s element '%s' (root: '%s', position: %s, index: %s, pattern: %s)",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
+ report_xml("%s element '%s' (root: '%s', position: %s, index: %s, pattern: %s)",what,xmlname(e),xmlname(e.__p__),c,e.ni,pattern)
end
local function withelements(e,handle,depth)
@@ -73,10 +78,8 @@ function xml.withelement(e,n,handle) -- slow
end
end
-xml.elements_only = xml.collected
-
-function xml.each_element(root,pattern,handle,reverse)
- local collected = xmlparseapply({ root },pattern)
+function xml.each(root,pattern,handle,reverse)
+ local collected = xmlapplylpath(root,pattern)
if collected then
if reverse then
for c=#collected,1,-1 do
@@ -91,10 +94,8 @@ function xml.each_element(root,pattern,handle,reverse)
end
end
-xml.process_elements = xml.each_element
-
-function xml.process_attributes(root,pattern,handle)
- local collected = xmlparseapply({ root },pattern)
+function xml.processattributes(root,pattern,handle)
+ local collected = xmlapplylpath(root,pattern)
if collected and handle then
for c=1,#collected do
handle(collected[c].at)
@@ -109,12 +110,12 @@ end
-- are these still needed -> lxml-cmp.lua
-function xml.collect_elements(root, pattern)
- return xmlparseapply({ root },pattern)
+function xml.collect(root, pattern)
+ return xmlapplylpath(root,pattern)
end
-function xml.collect_texts(root, pattern, flatten) -- todo: variant with handle
- local collected = xmlparseapply({ root },pattern)
+function xml.collecttexts(root, pattern, flatten) -- todo: variant with handle
+ local collected = xmlapplylpath(root,pattern)
if collected and flatten then
local xmltostring = xml.tostring
for c=1,#collected do
@@ -125,18 +126,19 @@ function xml.collect_texts(root, pattern, flatten) -- todo: variant with handle
end
function xml.collect_tags(root, pattern, nonamespace)
- local collected = xmlparseapply({ root },pattern)
+ local collected = xmlapplylpath(root,pattern)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
local e = collected[c]
local ns, tg = e.ns, e.tg
+ n = n + 1
if nonamespace then
- t[#t+1] = tg
+ t[n] = tg
elseif ns == "" then
- t[#t+1] = tg
+ t[n] = tg
else
- t[#t+1] = ns .. ":" .. tg
+ t[n] = ns .. ":" .. tg
end
end
return t
@@ -149,7 +151,7 @@ end
local no_root = { no_root = true }
-function xml.redo_ni(d)
+local function redo_ni(d)
for k=1,#d do
local dk = d[k]
if type(dk) == "table" then
@@ -195,8 +197,8 @@ local function copiedelement(element,newparent)
end
end
-function xml.delete_element(root,pattern)
- local collected = xmlparseapply({ root },pattern)
+function xml.delete(root,pattern)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -207,15 +209,15 @@ function xml.delete_element(root,pattern)
end
local d = p.dt
remove(d,e.ni)
- xml.redo_ni(d) -- can be made faster and inlined
+ redo_ni(d) -- can be made faster and inlined
end
end
end
end
-function xml.replace_element(root,pattern,whatever)
+function xml.replace(root,pattern,whatever)
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -226,15 +228,50 @@ function xml.replace_element(root,pattern,whatever)
end
local d = p.dt
d[e.ni] = copiedelement(element,p)
- xml.redo_ni(d) -- probably not needed
+ redo_ni(d) -- probably not needed
end
end
end
end
+local function wrap(e,wrapper)
+ local t = {
+ rn = e.rn,
+ tg = e.tg,
+ ns = e.ns,
+ at = e.at,
+ dt = e.dt,
+ __p__ = e,
+ }
+ setmetatable(t,getmetatable(e))
+ e.rn = wrapper.rn or e.rn or ""
+ e.tg = wrapper.tg or e.tg or ""
+ e.ns = wrapper.ns or e.ns or ""
+ e.at = fastcopy(wrapper.at)
+ e.dt = { t }
+end
+
+function xml.wrap(root,pattern,whatever)
+ if whatever then
+ local wrapper = xmltoelement(whatever,root)
+ local collected = xmlapplylpath(root,pattern)
+ if collected then
+ for c=1,#collected do
+ local e = collected[c]
+ if trace_manipulations then
+ report('wrapping',pattern,c,e)
+ end
+ wrap(e,wrapper)
+ end
+ end
+ else
+ wrap(root,xmltoelement(pattern))
+ end
+end
+
local function inject_element(root,pattern,whatever,prepend)
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -249,15 +286,17 @@ local function inject_element(root,pattern,whatever,prepend)
else
be, af = edt, cp
end
+ local bn = #be
for i=1,#af do
- be[#be+1] = af[i]
+ bn = bn + 1
+ be[bn] = af[i]
end
if rri then
r.dt[rri].dt = be
else
d[k].dt = be
end
- xml.redo_ni(d)
+ redo_ni(d)
end
end
end
@@ -265,7 +304,7 @@ end
local function insert_element(root,pattern,whatever,before) -- todo: element als functie
local element = root and xmltoelement(whatever,root)
- local collected = element and xmlparseapply({ root },pattern)
+ local collected = element and xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -275,24 +314,23 @@ local function insert_element(root,pattern,whatever,before) -- todo: element als
k = k + 1
end
insert(d,k,copiedelement(element,r))
- xml.redo_ni(d)
+ redo_ni(d)
end
end
end
-xml.insert_element = insert_element
-xml.insert_element_after = insert_element
-xml.insert_element_before = function(r,p,e) insert_element(r,p,e,true) end
-xml.inject_element = inject_element
-xml.inject_element_after = inject_element
-xml.inject_element_before = function(r,p,e) inject_element(r,p,e,true) end
+xml.insert_element = insert_element
+xml.insertafter = insert_element
+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 collected = xmlparseapply({ xmldata },pattern)
+ local collected = xmlapplylpath(xmldata,pattern)
if collected then
for c=1,#collected do
local ek = collected[c]
@@ -301,7 +339,7 @@ local function include(xmldata,pattern,attribute,recursive,loaddata)
local ekat = ek.at
local epdt = ek.__p__.dt
if not attribute or attribute == "" then
- name = (type(ekdt) == "table" and ekdt[1]) or ekdt -- ckeck, probably always tab or str
+ 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
@@ -335,136 +373,88 @@ end
xml.include = include
---~ local function manipulate(xmldata,pattern,manipulator) -- untested and might go away
---~ local collected = xmlparseapply({ xmldata },pattern)
---~ if collected then
---~ local xmltostring = xml.tostring
---~ for c=1,#collected do
---~ local e = collected[c]
---~ local data = manipulator(xmltostring(e))
---~ if data == "" then
---~ epdt[e.ni] = ""
---~ else
---~ local xi = xmlinheritedconvert(data,xmldata)
---~ if not xi then
---~ epdt[e.ni] = ""
---~ else
---~ epdt[e.ni] = xml.body(xi) -- xml.assign(d,k,xi)
---~ end
---~ end
---~ end
---~ end
---~ end
-
---~ xml.manipulate = manipulate
-
-function xml.strip_whitespace(root, pattern, nolines) -- strips all leading and trailing space !
- local collected = xmlparseapply({ root },pattern)
- if collected then
- for i=1,#collected do
- local e = collected[i]
- local edt = e.dt
- if edt then
- local t = { }
- for i=1,#edt do
- local str = edt[i]
- if type(str) == "string" then
- if str == "" then
- -- stripped
- else
- if nolines then
- str = gsub(str,"[ \n\r\t]+"," ")
- end
- if str == "" then
- -- stripped
- else
- t[#t+1] = str
- end
- end
+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 str = edt[e]
+ if type(str) ~= "string" then
+ n = n + 1
+ t[n] = str
+ elseif str ~= "" then
+ -- todo: lpeg for each case
+ if nolines then
+ str = gsub(str,"%s+"," ")
+ end
+ str = gsub(str,"^%s*(.-)%s*$","%1")
+ if str ~= "" then
+ n = n + 1
+ t[n] = 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
+ remove(edt,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
+ 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 str == "" then
+ remove(edt)
else
- --~ str.ni = i
- t[#t+1] = str
+ edt[nedt] = str
end
end
- e.dt = t
end
end
end
+ return e -- convenient
end
-function xml.strip_whitespace(root, pattern, nolines, anywhere) -- strips all leading and trailing spacing
- local collected = xmlparseapply({ root },pattern) -- beware, indices no longer are valid now
+xml.stripelement = stripelement
+
+function xml.strip(root,pattern,nolines,anywhere) -- strips all leading and trailing spacing
+ local collected = xmlapplylpath(root,pattern) -- beware, indices no longer are valid now
if collected then
for i=1,#collected do
- local e = collected[i]
- local edt = e.dt
- if edt then
- if anywhere then
- local t = { }
- for e=1,#edt do
- local str = edt[e]
- if type(str) ~= "string" then
- t[#t+1] = str
- elseif str ~= "" then
- -- todo: lpeg for each case
- if nolines then
- str = gsub(str,"%s+"," ")
- end
- str = gsub(str,"^%s*(.-)%s*$","%1")
- if str ~= "" then
- t[#t+1] = 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
- remove(edt,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
- end
- end
- if #edt > 1 then
- -- strip end
- local str = edt[#edt]
- 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 str == "" then
- remove(edt)
- else
- edt[#edt] = str
- end
- end
- end
- end
- end
+ stripelement(collected[i],nolines,anywhere)
end
end
end
-local function rename_space(root, oldspace, newspace) -- fast variant
+local function renamespace(root, oldspace, newspace) -- fast variant
local ndt = #root.dt
for i=1,ndt or 0 do
local e = root[i]
@@ -477,16 +467,16 @@ local function rename_space(root, oldspace, newspace) -- fast variant
end
local edt = e.dt
if edt then
- rename_space(edt, oldspace, newspace)
+ renamespace(edt, oldspace, newspace)
end
end
end
end
-xml.rename_space = rename_space
+xml.renamespace = renamespace
-function xml.remap_tag(root, pattern, newtg)
- local collected = xmlparseapply({ root },pattern)
+function xml.remaptag(root, pattern, newtg)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
collected[c].tg = newtg
@@ -494,8 +484,8 @@ function xml.remap_tag(root, pattern, newtg)
end
end
-function xml.remap_namespace(root, pattern, newns)
- local collected = xmlparseapply({ root },pattern)
+function xml.remapnamespace(root, pattern, newns)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
collected[c].ns = newns
@@ -503,8 +493,8 @@ function xml.remap_namespace(root, pattern, newns)
end
end
-function xml.check_namespace(root, pattern, newns)
- local collected = xmlparseapply({ root },pattern)
+function xml.checknamespace(root, pattern, newns)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -515,8 +505,8 @@ function xml.check_namespace(root, pattern, newns)
end
end
-function xml.remap_name(root, pattern, newtg, newns, newrn)
- local collected = xmlparseapply({ root },pattern)
+function xml.remapname(root, pattern, newtg, newns, newrn)
+ local collected = xmlapplylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -529,15 +519,31 @@ end
<p>Here are a few synonyms.</p>
--ldx]]--
-xml.each = xml.each_element
-xml.process = xml.process_element
-xml.strip = xml.strip_whitespace
-xml.collect = xml.collect_elements
-xml.all = xml.collect_elements
-
-xml.insert = xml.insert_element_after
-xml.inject = xml.inject_element_after
-xml.after = xml.insert_element_after
-xml.before = xml.insert_element_before
-xml.delete = xml.delete_element
-xml.replace = xml.replace_element
+xml.all = xml.each
+xml.insert = xml.insertafter
+xml.inject = xml.injectafter
+xml.after = xml.insertafter
+xml.before = xml.insertbefore
+xml.process = xml.each
+
+-- obsolete
+
+xml.obsolete = xml.obsolete or { }
+local obsolete = xml.obsolete
+
+xml.strip_whitespace = xml.strip obsolete.strip_whitespace = xml.strip
+xml.collect_elements = xml.collect obsolete.collect_elements = xml.collect
+xml.delete_element = xml.delete obsolete.delete_element = xml.delete
+xml.replace_element = xml.replace obsolete.replace_element = xml.replacet
+xml.each_element = xml.each obsolete.each_element = xml.each
+xml.process_elements = xml.process obsolete.process_elements = xml.process
+xml.insert_element_after = xml.insertafter obsolete.insert_element_after = xml.insertafter
+xml.insert_element_before = xml.insertbefore obsolete.insert_element_before = xml.insertbefore
+xml.inject_element_after = xml.injectafter obsolete.inject_element_after = xml.injectafter
+xml.inject_element_before = xml.injectbefore obsolete.inject_element_before = xml.injectbefore
+xml.process_attributes = xml.processattributes obsolete.process_attributes = xml.processattributes
+xml.collect_texts = xml.collecttexts obsolete.collect_texts = xml.collecttexts
+xml.inject_element = xml.inject obsolete.inject_element = xml.inject
+xml.remap_tag = xml.remaptag obsolete.remap_tag = xml.remaptag
+xml.remap_name = xml.remapname obsolete.remap_name = xml.remapname
+xml.remap_namespace = xml.remapnamespace obsolete.remap_namespace = xml.remapnamespace
diff --git a/Master/texmf-dist/tex/context/base/lxml-ctx.lua b/Master/texmf-dist/tex/context/base/lxml-ctx.lua
index 765754953e9..1f6f6ffd3b8 100644
--- a/Master/texmf-dist/tex/context/base/lxml-ctx.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-ctx.lua
@@ -8,6 +8,8 @@ if not modules then modules = { } end modules ['lxml-ctx'] = {
-- is this still used?
+local xml = xml
+
xml.ctx = { }
xml.ctx.enhancers = { }
@@ -39,8 +41,8 @@ function xml.ctx.tshow(specification)
if not string.find(xmlpattern,"^[%a]+://") then
xmlpattern = "xml://" .. pattern
end
- parsed = xml.parse_pattern(xmlpattern)
- titlecommand = specification.title or "type"
+ local parsed = xml.lpath(xmlpattern)
+ local titlecommand = specification.title or "type"
if parsed.state then
context[titlecommand]("pattern: " .. pattern .. " (".. parsed.state .. ")")
else
@@ -86,9 +88,9 @@ function xml.ctx.tshow(specification)
context.stoptabulate()
if xmlroot and xmlroot ~= "" then
if not loaded[xmlroot] then
- loaded[xmlroot] = { xml.convert(buffers.content(xmlroot) or "") }
+ loaded[xmlroot] = xml.convert(buffers.getcontent(xmlroot))
end
- local collected = xml.parse_apply(loaded[xmlroot],xmlpattern)
+ local collected = xml.filter(loaded[xmlroot],xmlpattern)
if collected then
local tc = type(collected)
if not tc then
diff --git a/Master/texmf-dist/tex/context/base/lxml-dir.lua b/Master/texmf-dist/tex/context/base/lxml-dir.lua
index 617ce3e20e2..0924931c1b5 100644
--- a/Master/texmf-dist/tex/context/base/lxml-dir.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-dir.lua
@@ -7,9 +7,8 @@ if not modules then modules = { } end modules ['lxml-dir'] = {
}
local format, gsub = string.format, string.gsub
-local get_id = lxml.id
+local getid = lxml.getid
local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
-local xmlparseapply = xml.parse_apply
--~ <?xml version="1.0" standalone="yes"?>
--~ <!-- demo.cdx -->
@@ -26,12 +25,13 @@ local xmlparseapply = xml.parse_apply
--~ <directive attribute='cdx' value="*" element="cals:table" setup="cdx:cals:table:*"/>
--~ </directives>
+local lxml = lxml
-
-lxml.directives = lxml.directives or { }
-
+lxml.directives = lxml.directives or { }
local directives = lxml.directives
+local report_lxml = logs.reporter("xml","tex")
+
local data = {
setup = { },
before = { },
@@ -43,7 +43,7 @@ local function load_setup(filename)
if fullname ~= "" then
filename = fullname
end
- local collection = xmlparseapply({ get_id(xml.load(filename)) },"directive")
+ local collection = xml.applylpath({ getid(xml.load(filename)) },"directive") -- is { } needed ?
if collection then
local valid = 0
for i=1,#collection do
@@ -60,14 +60,14 @@ local function load_setup(filename)
valid = valid + 1
end
end
- commands.writestatus("lxml","%s directives found in '%s', %s valid",#collection,filename,valid)
+ report_lxml("%s directives found in '%s', %s valid",#collection,filename,valid)
else
- commands.writestatus("lxml","no directives found in '%s'",filename)
+ report_lxml("no directives found in '%s'",filename)
end
end
local function handle_setup(category,root,attribute,element)
- root = get_id(root)
+ root = getid(root)
if attribute then
local value = root.at[attribute]
if value then
diff --git a/Master/texmf-dist/tex/context/base/lxml-ent.lua b/Master/texmf-dist/tex/context/base/lxml-ent.lua
index 19361193745..5b24d9d6846 100644
--- a/Master/texmf-dist/tex/context/base/lxml-ent.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-ent.lua
@@ -24,24 +24,28 @@ original entity is returned.</p>
local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end)
+local report_xml = logs.reporter("xml")
+
+local xml = xml
+
xml.entities = xml.entities or { } -- xml.entity_handler == function
storage.register("xml/entities",xml.entities,"xml.entities") -- this will move to lxml
local entities = xml.entities -- this is a shared hash
-xml.unknown_any_entity_format = nil -- has to be per xml
+xml.placeholders.unknown_any_entity = nil -- has to be per xml
local parsedentity = xml.parsedentitylpeg
-function xml.register_entity(key,value)
+function xml.registerentity(key,value)
entities[key] = value
if trace_entities then
- logs.report("xml","registering entity '%s' as: %s",key,value)
+ report_xml("registering entity '%s' as: %s",key,value)
end
end
-function xml.resolved_entity(str)
+function xml.resolvedentity(str)
local e = entities[str]
if e then
local te = type(e)
diff --git a/Master/texmf-dist/tex/context/base/lxml-inf.lua b/Master/texmf-dist/tex/context/base/lxml-inf.lua
index 629c869eca9..834d152fde9 100644
--- a/Master/texmf-dist/tex/context/base/lxml-inf.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-inf.lua
@@ -8,6 +8,9 @@ if not modules then modules = { } end modules ['lxml-inf'] = {
-- This file will be loaded runtime by x-pending.tex.
+local xmlwithelements = xml.withelements
+local getid = lxml.getid
+
local status, stack
local function get(e,d)
@@ -39,7 +42,7 @@ end
local function get_command_status(id)
status, stack = {}, {}
if id then
- xmlwithelements(get_id(id),get)
+ xmlwithelements(getid(id),get)
return status
else
local t = { }
diff --git a/Master/texmf-dist/tex/context/base/lxml-ini.mkiv b/Master/texmf-dist/tex/context/base/lxml-ini.mkiv
index 0f04d048808..a1d6b50a878 100644
--- a/Master/texmf-dist/tex/context/base/lxml-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/lxml-ini.mkiv
@@ -28,88 +28,91 @@
\def\c!entities{entities} % to be internationalized
-\def\xmlmain #1{\ctxlua{lxml.main("#1")}}
-\def\xmlmatch #1{\ctxlua{lxml.match("#1")}}
-\def\xmlall #1#2{\ctxlua{lxml.all("#1","#2")}}
-\def\xmlatt #1#2{\ctxlua{lxml.att("#1","#2")}}
-\def\xmlattdef #1#2#3{\ctxlua{lxml.att("#1","#2","#3")}}
-\def\xmlchainatt #1#2{\ctxlua{lxml.chainattribute("#1","/","#2")}}
-\def\xmlchainattdef #1#2#3{\ctxlua{lxml.chainattribute("#1","/","#2","#3")}}
-\def\xmlattribute #1#2#3{\ctxlua{lxml.attribute("#1","#2","#3")}}
-\def\xmlattributedef #1#2#3#4{\ctxlua{lxml.attribute("#1","#2","#3","#4")}}
-\def\xmlcommand #1#2#3{\ctxlua{lxml.command("#1","#2","#3")}}
-\def\xmlconcat #1#2#3{\ctxlua{lxml.concat("#1","#2",[[\detokenize{#3}]])}}
-\def\xmlconcatrange#1#2#3#4#5{\ctxlua{lxml.concatrange("#1","#2","#3","#4",[[\detokenize{#5}]])}}
-\def\xmlcount #1#2{\ctxlua{lxml.count("#1","#2")}}
-\def\xmldelete #1#2{\ctxlua{lxml.delete("#1","#2")}}
-\def\xmldirectives #1{\ctxlua{lxml.directives.setup("#1")}}
-\def\xmldirectivesbefore #1{\ctxlua{lxml.directives.before("#1")}}
-\def\xmldirectivesafter #1{\ctxlua{lxml.directives.after("#1")}}
-\def\xmlfilter #1#2{\ctxlua{lxml.filter("#1",\!!bs#2\!!es)}}
-\def\xmlfilterlist #1#2{\ctxlua{lxml.filterlist("#1",\!!bs#2\!!es)}}
-\def\xmlfunction #1#2{\ctxlua{lxml["function"]("#1",\!!bs#2\!!es)}}
-\def\xmlfirst #1#2{\ctxlua{lxml.first("#1","#2")}}
-\def\xmlflush #1{\ctxlua{lxml.flush("#1")}}
-%def\xmlcontent #1{\ctxlua{lxml.content("#1")}}
-%def\xmlflushstripped #1{\ctxlua{lxml.strip("#1",true)}}
-\def\xmldirect #1{\ctxlua{lxml.direct("#1")}} % in loops, not dt but root
-\def\xmlidx #1#2#3{\ctxlua{lxml.idx("#1","#2",\number#3)}}
-\def\xmlinclude #1#2#3{\ctxlua{lxml.include("#1","#2","#3",true)}}
-\def\xmlindex #1#2#3{\ctxlua{lxml.index("#1","#2",\number#3)}}
-\def\xmlinfo #1{\hbox{\ttxx[\ctxlua{lxml.info("#1")}]}}
+\def\ctxlxml #1{\directlua\zerocount{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\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\xmlindex #1#2#3{\ctxlxml{index("#1","#2",\number#3)}}
+\def\xmlinfo #1{\hbox{\ttxx[\ctxlxml{info("#1")}]}}
\def\xmlshow #1{\startpacked\ttx\xmlverbatim{#1}\stoppacked}
-\def\xmllast #1#2{\ctxlua{lxml.last("#1","#2")}}
-\def\xmlname #1{\ctxlua{lxml.name("#1")}}
-\def\xmlnamespace #1{\ctxlua{lxml.namespace("#1")}}
-\def\xmlnonspace #1#2{\ctxlua{lxml.nonspace("#1","#2")}}
-\def\xmlraw #1#2{\ctxlua{lxml.raw("#1","#2")}}
-\def\xmlcontext #1#2{\ctxlua{lxml.context("#1","#2")}}
-\def\xmlflushcontext #1{\ctxlua{lxml.context("#1")}}
-\def\xmlsnippet #1#2{\ctxlua{lxml.snippet("#1",#2)}}
-\def\xmlelement #1#2{\ctxlua{lxml.element("#1",#2)}}
+\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.rename_space(lxml.id("#1"),"#2","#3")}} % document
-\def\xmlchecknamespace #1#2#3{\ctxlua{xml.check_namespace(lxml.id("#1"),"#2","#3")}} % element
-\def\xmlsetfunction #1#2#3{\ctxlua{lxml.setaction("#1","#2",#3)}}
-\def\xmlsetsetup #1#2#3{\ctxlua{lxml.setsetup("#1","#2","#3")}}
-\def\xmlstrip #1#2{\ctxlua{lxml.strip("#1","#2")}}
-\def\xmlstripnolines #1#2{\ctxlua{lxml.strip("#1","#2",true)}}
-\def\xmlstripanywhere #1#2{\ctxlua{lxml.strip("#1","#2",true,true)}}
-\def\xmlstripped #1#2{\ctxlua{lxml.stripped("#1","#2")}}
-\def\xmlstrippednolines #1#2{\ctxlua{lxml.stripped("#1","#2",true)}}
-\def\xmltag #1{\ctxlua{lxml.tag("#1")}}
-\def\xmltext #1#2{\ctxlua{lxml.text("#1","#2")}}
-\def\xmlverbatim #1{\ctxlua{lxml.verbatim("#1")}}
-\def\xmldisplayverbatim #1{\ctxlua{lxml.displayverbatim("#1")}}
-\def\xmlinlineverbatim #1{\ctxlua{lxml.inlineverbatim("#1")}}
-
-\def\xmlload #1#2{\ctxlua{lxml.load("#1","#2","\@@xmentities","\@@xmcompress")}}
-\def\xmlloadbuffer #1#2{\ctxlua{lxml.loadbuffer("#1","#2","\@@xmentities","\@@xmcompress")}}
-\def\xmlloaddata #1#2{\ctxlua{lxml.loaddata("#1",\!!bs#2\!!es,"\@@xmentities","\@@xmcompress")}}
-\def\xmlloadregistered #1#2{\ctxlua{lxml.loadregistered("#1","\@@xmentities","\@@xmcompress")}}
-\def\xmlloaddirectives #1{\ctxlua{lxml.directives.load("any:///#1")}}
-\def\xmlpos #1{\ctxlua{lxml.pos("#1")}}
-
-%def\xmldoifelse #1#2{\ctxlua{cs.testcase(xml.found(lxml.id("#1"),"#2",false))}}
-%def\xmldoifelsetext #1#2{\ctxlua{cs.testcase(xml.found(lxml.id("#1"),"#2",true ))}}
+\def\xmlremapnamespace #1#2#3{\ctxlua{xml.renamespace(lxml.id("#1"),"#2","#3")}} % document
+\def\xmlchecknamespace #1#2#3{\ctxlua{xml.checknamespace(lxml.id("#1"),"#2","#3")}} % element
+\def\xmlsetfunction #1#2#3{\ctxlxml{setaction("#1","#2",#3)}}
+\def\xmlsetsetup #1#2#3{\ctxlxml{setsetup("#1","#2","#3")}}
+\def\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","\@@xmentities","\@@xmcompress")}}
+\def\xmlloadbuffer #1#2{\ctxlxml{loadbuffer("#1","#2","\@@xmentities","\@@xmcompress")}}
+\def\xmlloaddata #1#2{\ctxlxml{loaddata("#1",\!!bs#2\!!es,"\@@xmentities","\@@xmcompress")}}
+\def\xmlloadregistered #1#2{\ctxlxml{loadregistered("#1","\@@xmentities","\@@xmcompress")}}
+\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
% kind of special:
-\def\xmlstartraw{\ctxlua{lxml.startraw()}}
-\def\xmlstopraw {\ctxlua{lxml.stopraw()}}
+\def\xmlstartraw{\ctxlxml{startraw()}}
+\def\xmlstopraw {\ctxlxml{stopraw()}}
% todo: \xmldoifelseattribute
-\def\xmldoif #1#2{\ctxlua{lxml.doif (\!!bs#1\!!es,\!!bs#2\!!es)}}
-\def\xmldoifnot #1#2{\ctxlua{lxml.doifnot (\!!bs#1\!!es,\!!bs#2\!!es)}}
-\def\xmldoifelse #1#2{\ctxlua{lxml.doifelse (\!!bs#1\!!es,\!!bs#2\!!es)}}
-\def\xmldoiftext #1#2{\ctxlua{lxml.doiftext (\!!bs#1\!!es,\!!bs#2\!!es)}}
-\def\xmldoifnottext #1#2{\ctxlua{lxml.doifnottext (\!!bs#1\!!es,\!!bs#2\!!es)}}
-\def\xmldoifelsetext #1#2{\ctxlua{lxml.doifelsetext(\!!bs#1\!!es,\!!bs#2\!!es)}}
+\def\xmldoif #1#2{\ctxlxml{doif (\!!bs#1\!!es,\!!bs#2\!!es)}}
+\def\xmldoifnot #1#2{\ctxlxml{doifnot (\!!bs#1\!!es,\!!bs#2\!!es)}}
+\def\xmldoifelse #1#2{\ctxlxml{doifelse (\!!bs#1\!!es,\!!bs#2\!!es)}}
+\def\xmldoiftext #1#2{\ctxlxml{doiftext (\!!bs#1\!!es,\!!bs#2\!!es)}}
+\def\xmldoifnottext #1#2{\ctxlxml{doifnottext (\!!bs#1\!!es,\!!bs#2\!!es)}}
+\def\xmldoifelsetext #1#2{\ctxlxml{doifelsetext(\!!bs#1\!!es,\!!bs#2\!!es)}}
-%def\xmldoifelseempty #1#2{\ctxlua{lxml.doifelseempty("#1","#2")}} % #2, "*" or "" == self not yet implemented
-%def\xmldoifelseselfempty #1{\ctxlua{lxml.doifelseempty("#1")}}
+%def\xmldoifelseempty #1#2{\ctxlxml{doifelseempty("#1","#2")}} % #2, "*" or "" == self not yet implemented
+%def\xmldoifelseselfempty #1{\ctxlxml{doifelseempty("#1")}}
% \startxmlsetups xml:include
% \xmlinclude{main}{include}{filename|href}
@@ -129,21 +132,21 @@
% todo: 1:xml:whatever always before 3:xml:something
-\def\xmlprependsetup #1{\ctxlua{lxml.installsetup(1,"*","#1")}}
-\def\xmlappendsetup #1{\ctxlua{lxml.installsetup(2,"*","#1")}}
-\def\xmlbeforesetup #1#2{\ctxlua{lxml.installsetup(3,"*","#1","#2"))}}
-\def\xmlaftersetup #1#2{\ctxlua{lxml.installsetup(4,"*","#1","#2"))}}
+\def\xmlprependsetup #1{\ctxlxml{installsetup(1,"*","#1")}}
+\def\xmlappendsetup #1{\ctxlxml{installsetup(2,"*","#1")}}
+\def\xmlbeforesetup #1#2{\ctxlxml{installsetup(3,"*","#1","#2"))}}
+\def\xmlaftersetup #1#2{\ctxlxml{installsetup(4,"*","#1","#2"))}}
-\def\xmlprependdocumentsetup #1#2{\ctxlua{lxml.installsetup(1,"#1","#2")}}
-\def\xmlappenddocumentsetup #1#2{\ctxlua{lxml.installsetup(2,"#1","#2")}}
-\def\xmlbeforedocumentsetup#1#2#3{\ctxlua{lxml.installsetup(3,"#1","#2","#3"))}}
-\def\xmlafterdocumentsetup #1#2#3{\ctxlua{lxml.installsetup(4,"#1","#2","#3"))}}
+\def\xmlprependdocumentsetup #1#2{\ctxlxml{installsetup(1,"#1","#2")}}
+\def\xmlappenddocumentsetup #1#2{\ctxlxml{installsetup(2,"#1","#2")}}
+\def\xmlbeforedocumentsetup#1#2#3{\ctxlxml{installsetup(3,"#1","#2","#3"))}}
+\def\xmlafterdocumentsetup #1#2#3{\ctxlxml{installsetup(4,"#1","#2","#3"))}}
-\def\xmlremovesetup #1{\ctxlua{lxml.removesetup("*","#1")}}
-\def\xmlremovedocumentsetup #1#2{\ctxlua{lxml.removesetup("#1","#2")}}
+\def\xmlremovesetup #1{\ctxlxml{removesetup("*","#1")}}
+\def\xmlremovedocumentsetup #1#2{\ctxlxml{removesetup("#1","#2")}}
-\def\xmlflushdocumentsetups #1#2{\ctxlua{lxml.flushsetups("#1","*","#2")}} % #1 == id where to apply * and #2
-\def\xmlresetdocumentsetups #1{\ctxlua{lxml.resetsetups("#1")}}
+\def\xmlflushdocumentsetups #1#2{\ctxlxml{flushsetups("#1","*","#2")}} % #1 == id where to apply * and #2
+\def\xmlresetdocumentsetups #1{\ctxlxml{resetsetups("#1")}}
\let\xmlregistersetup \xmlappendsetup
\let\xmlregisterdocumentsetup\xmlappenddocumentsetup
@@ -266,9 +269,9 @@
\def\inlinemessage #1{\dontleavehmode{\tttf#1}}
\def\displaymessage#1{\blank\inlinemessage{#1}\blank}
-\def\xmltraceentities
- {\ctxlua{xml.set_text_cleanup(lxml.trace_text_entities)}%
- \appendtoks\ctxlua{lxml.show_text_entities()}\to\everygoodbye}
+% \def\xmltraceentities % settextcleanup is not defined
+% {\ctxlua{xml.settextcleanup(lxml.trace_text_entities)}%
+% \appendtoks\ctxlxml{showtextentities()}\to\everygoodbye}
% processing instructions
@@ -283,13 +286,12 @@
% \def\xmlctxdirective#1#2#3{\doif{#1}{clue}{\doif{#2}{page}}{\page[#3]}}
-\chardef\xmlprocessingmode=0 % 0=unset, 1=text, 2=hidden
+\newconstant\xmlprocessingmode % 0=unset, 1=text, 2=hidden
\newtoks\everysetupxml
\unexpanded\def\setupxml[#1]{\getparameters[\??xm][#1]\the\everysetupxml}
-
\letvalue{\??xm:\s!default:\v!normal}\zerocount
\letvalue{\??xm:\s!default:\v!none }\zerocount
\letvalue{\??xm:\s!default:\v!text }\plusone
@@ -299,15 +301,15 @@
{\ifcase\xmlprocessingmode
% unset
\or
- \ctxlua{lxml.set_command_to_text("#1")}% 1
+ \ctxlxml{setcommandtotext("#1")}% 1
\or
- \ctxlua{lxml.set_command_to_none("#1")}% 2
+ \ctxlxml{setcommandtonone("#1")}% 2
\else
% unset
\fi}
\appendtoks
- \chardef\xmlprocessingmode\executeifdefined{\??xm:\s!default:\@@xmdefault}\plusone
+ \xmlprocessingmode\executeifdefined{\??xm:\s!default:\@@xmdefault}\plusone
\to \everysetupxml
\def\xmlinitialize{\the\everysetupxml}
@@ -317,24 +319,6 @@
\c!compress=\v!no, % strip comment
\c!entities=\v!yes] % replace entities
-% \defineXMLenvironment[y]{(}{)}
-%
-% \startxmlsetups x
-% /\xmlflush{#1}/
-% \stopxmlsetups
-%
-% \startxmlsetups xx
-% \xmlsetsetup{main}{x}{*}
-% \stopxmlsetups
-%
-% \xmlregistersetup{xx}
-%
-% \startbuffer
-% <x>a &lt;&amp;&gt;<y>{b}</y> c</x>
-% \stopbuffer
-%
-% mkii: [\processXMLbuffer]\quad mkiv: [\xmlprocessbuffer{main}{}{}]
-
\def\xmlmapvalue #1#2#3{\setvalue{\??xm:v:#1:#2}{#3}} % keep #3 to grab spaces
\def\xmlvalue #1#2#3{\executeifdefined{\??xm:v:#1:#2}{#3}}
%def\xmlvalue #1#2{\ifcsname\??xm:v:#1:#2\endcsname\csname\??xm:v:#1:#2\expandafter\expandafter\gobbleoneargument\expandafter\endcsname\else\expandafter\firstofoneargument\fi}
@@ -345,19 +329,19 @@
%D Experimental:
-\def\xmlgetindex #1{\ctxlua{lxml.getindex("\xmldocument","#1")}}
-\def\xmlrawindex #1{\ctxlua{lxml.rawindex("#1")}}
-\def\xmlwithindex #1#2{\ctxlua{lxml.withindex("\xmldocument","#1","#2")}}
+\def\xmlgetindex #1{\ctxlxml{getindex("\xmldocument","#1")}}
+\def\xmlrawindex #1{\ctxlxml{rawindex("#1")}}
+\def\xmlwithindex #1#2{\ctxlxml{withindex("\xmldocument","#1","#2")}}
\def\xmlreference #1#2{\string\xmlwithindex{#1}{#2}}
%D Entities:
-\chardef\xmlautoentities=1 % 0=off, 1=upper, 2=upper,lower
+\setnewconstant\xmlautoentities\plusone % 0=off, 1=upper, 2=upper,lower
\let\isolatedentity\firstofoneargument
-\def\xmlsetentity#1#2{\ctxlua{xml.register_entity('#1',\!!bs\detokenize{#2}\!!es)}}
-\def\xmltexentity#1#2{\ctxlua{xml.register_entity('#1',\!!bs\detokenize{\isolatedentity{#2}}\!!es)}}
+\def\xmlsetentity#1#2{\ctxlua{xml.registerentity('#1',\!!bs\detokenize{#2}\!!es)}}
+\def\xmltexentity#1#2{\ctxlua{xml.registerentity('#1',\!!bs\detokenize{\isolatedentity{#2}}\!!es)}}
% \xmlsetentity{tex}{\TEX{}} % {} needed
@@ -408,7 +392,7 @@
% \stopextendcatcodetable
%
% \ctxlua { % entities are remembered in the format
-% characters.remapentity("<",characters.active_offset + utf.byte("<"))
-% characters.remapentity("&",characters.active_offset + utf.byte("&"))
-% characters.remapentity(">",characters.active_offset + utf.byte(">"))
+% characters.remapentity("<",characters.activeoffset + utf.byte("<"))
+% characters.remapentity("&",characters.activeoffset + utf.byte("&"))
+% characters.remapentity(">",characters.activeoffset + utf.byte(">"))
% }
diff --git a/Master/texmf-dist/tex/context/base/lxml-lpt.lua b/Master/texmf-dist/tex/context/base/lxml-lpt.lua
index bddbe48685c..aa0b0a22ecc 100644
--- a/Master/texmf-dist/tex/context/base/lxml-lpt.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-lpt.lua
@@ -7,11 +7,14 @@ if not modules then modules = { } end modules ['lxml-pth'] = {
}
-- e.ni is only valid after a filter run
+-- todo: B/C/[get first match]
local concat, remove, insert = table.concat, table.remove, table.insert
local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring
local format, upper, lower, gmatch, gsub, find, rep = string.format, string.upper, string.lower, string.gmatch, string.gsub, string.find, string.rep
-local lpegmatch = lpeg.match
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+
+local setmetatableindex = table.setmetatableindex
-- beware, this is not xpath ... e.g. position is different (currently) and
-- we have reverse-sibling as reversed preceding sibling
@@ -43,23 +46,33 @@ local trace_lpath = false if trackers then trackers.register("xml.path",
local trace_lparse = false if trackers then trackers.register("xml.parse", function(v) trace_lparse = v end) end
local trace_lprofile = false if trackers then trackers.register("xml.profile", function(v) trace_lpath = v trace_lparse = v trace_lprofile = v end) end
+local report_lpath = logs.reporter("xml","lpath")
+
--[[ldx--
<p>We've now arrived at an interesting part: accessing the tree using a subset
of <l n='xpath'/> and since we're not compatible we call it <l n='lpath'/>. We
will explain more about its usage in other documents.</p>
--ldx]]--
+local xml = xml
+
local lpathcalls = 0 function xml.lpathcalls () return lpathcalls end
local lpathcached = 0 function xml.lpathcached() return lpathcached end
-xml.functions = xml.functions or { } -- internal
-xml.expressions = xml.expressions or { } -- in expressions
-xml.finalizers = xml.finalizers or { } -- fast do-with ... (with return value other than collection)
-xml.specialhandler = xml.specialhandler or { }
+xml.functions = xml.functions or { } -- internal
+local functions = xml.functions
+
+xml.expressions = xml.expressions or { } -- in expressions
+local expressions = xml.expressions
-local functions = xml.functions
-local expressions = xml.expressions
-local finalizers = xml.finalizers
+xml.finalizers = xml.finalizers or { } -- fast do-with ... (with return value other than collection)
+local finalizers = xml.finalizers
+
+xml.specialhandler = xml.specialhandler or { }
+local specialhandler = xml.specialhandler
+
+lpegpatterns.xml = lpegpatterns.xml or { }
+local xmlpatterns = lpegpatterns.xml
finalizers.xml = finalizers.xml or { }
finalizers.tex = finalizers.tex or { }
@@ -69,14 +82,14 @@ local function fallback (t, name)
if fn then
t[name] = fn
else
- logs.report("xml","unknown sub finalizer '%s'",tostring(name))
+ report_lpath("unknown sub finalizer '%s'",tostring(name))
fn = function() end
end
return fn
end
-setmetatable(finalizers.xml, { __index = fallback })
-setmetatable(finalizers.tex, { __index = fallback })
+setmetatableindex(finalizers.xml, fallback)
+setmetatableindex(finalizers.tex, fallback)
xml.defaultprotocol = "xml"
@@ -124,7 +137,7 @@ apply_axis['root'] = function(list)
rt = ll
end
end
- collected[#collected+1] = rt
+ collected[l] = rt
end
return collected
end
@@ -132,94 +145,103 @@ end
apply_axis['self'] = function(list)
--~ local collected = { }
--~ for l=1,#list do
---~ collected[#collected+1] = list[l]
+--~ collected[l] = list[l]
--~ end
--~ return collected
return list
end
apply_axis['child'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local dt = ll.dt
- local en = 0
- for k=1,#dt do
- local dk = dt[k]
- if dk.tg then
- collected[#collected+1] = dk
- dk.ni = k -- refresh
- en = en + 1
- dk.ei = en
+ if dt then -- weird that this is needed
+ local en = 0
+ for k=1,#dt do
+ local dk = dt[k]
+ if dk.tg then
+ c = c + 1
+ collected[c] = dk
+ dk.ni = k -- refresh
+ en = en + 1
+ dk.ei = en
+ end
end
+ ll.en = en
end
- ll.en = en
end
return collected
end
-local function collect(list,collected)
+local function collect(list,collected,c)
local dt = list.dt
if dt then
local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
- collected[#collected+1] = dk
+ c = c + 1
+ collected[c] = dk
dk.ni = k -- refresh
en = en + 1
dk.ei = en
- collect(dk,collected)
+ c = collect(dk,collected,c)
end
end
list.en = en
end
+ return c
end
apply_axis['descendant'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
- collect(list[l],collected)
+ c = collect(list[l],collected,c)
end
return collected
end
-local function collect(list,collected)
+local function collect(list,collected,c)
local dt = list.dt
if dt then
local en = 0
for k=1,#dt do
local dk = dt[k]
if dk.tg then
- collected[#collected+1] = dk
+ c = c + 1
+ collected[c] = dk
dk.ni = k -- refresh
en = en + 1
dk.ei = en
- collect(dk,collected)
+ c = collect(dk,collected,c)
end
end
list.en = en
end
+ return c
end
apply_axis['descendant-or-self'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
if ll.special ~= true then -- catch double root
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
- collect(ll,collected)
+ c = collect(ll,collected,c)
end
return collected
end
apply_axis['ancestor'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
while ll do
ll = ll.__p__
if ll then
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
end
end
@@ -227,14 +249,16 @@ apply_axis['ancestor'] = function(list)
end
apply_axis['ancestor-or-self'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
while ll do
ll = ll.__p__
if ll then
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
end
end
@@ -242,11 +266,12 @@ apply_axis['ancestor-or-self'] = function(list)
end
apply_axis['parent'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local pl = list[l].__p__
if pl then
- collected[#collected+1] = pl
+ c = c + 1
+ collected[c] = pl
end
end
return collected
@@ -261,7 +286,7 @@ apply_axis['namespace'] = function(list)
end
apply_axis['following'] = function(list) -- incomplete
---~ local collected = { }
+--~ local collected, c = { }, 0
--~ for l=1,#list do
--~ local ll = list[l]
--~ local p = ll.__p__
@@ -269,7 +294,8 @@ apply_axis['following'] = function(list) -- incomplete
--~ for i=ll.ni+1,#d do
--~ local di = d[i]
--~ if type(di) == "table" then
---~ collected[#collected+1] = di
+--~ c = c + 1
+--~ collected[c] = di
--~ break
--~ end
--~ end
@@ -279,7 +305,7 @@ apply_axis['following'] = function(list) -- incomplete
end
apply_axis['preceding'] = function(list) -- incomplete
---~ local collected = { }
+--~ local collected, c = { }, 0
--~ for l=1,#list do
--~ local ll = list[l]
--~ local p = ll.__p__
@@ -287,7 +313,8 @@ apply_axis['preceding'] = function(list) -- incomplete
--~ for i=ll.ni-1,1,-1 do
--~ local di = d[i]
--~ if type(di) == "table" then
---~ collected[#collected+1] = di
+--~ c = c + 1
+--~ collected[c] = di
--~ break
--~ end
--~ end
@@ -297,7 +324,7 @@ apply_axis['preceding'] = function(list) -- incomplete
end
apply_axis['following-sibling'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -305,7 +332,8 @@ apply_axis['following-sibling'] = function(list)
for i=ll.ni+1,#d do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -313,7 +341,7 @@ apply_axis['following-sibling'] = function(list)
end
apply_axis['preceding-sibling'] = function(list)
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -321,7 +349,8 @@ apply_axis['preceding-sibling'] = function(list)
for i=1,ll.ni-1 do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -329,7 +358,7 @@ apply_axis['preceding-sibling'] = function(list)
end
apply_axis['reverse-sibling'] = function(list) -- reverse preceding
- local collected = { }
+ local collected, c = { }, 0
for l=1,#list do
local ll = list[l]
local p = ll.__p__
@@ -337,7 +366,8 @@ apply_axis['reverse-sibling'] = function(list) -- reverse preceding
for i=ll.ni-1,1,-1 do
local di = d[i]
if type(di) == "table" then
- collected[#collected+1] = di
+ c = c + 1
+ collected[c] = di
end
end
end
@@ -363,7 +393,7 @@ local function apply_nodes(list,directive,nodes)
return { }
end
else
- local collected, m, p = { }, 0, nil
+ local collected, c, m, p = { }, 0, 0, nil
if not nns then -- only check tag
for l=1,#list do
local ll = list[l]
@@ -372,11 +402,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ntg == ltg then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif ntg ~= ltg then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -388,11 +420,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if lns == nns then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif lns ~= nns then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -406,11 +440,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif not ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -418,7 +454,7 @@ local function apply_nodes(list,directive,nodes)
return collected
end
else
- local collected, m, p = { }, 0, nil
+ local collected, c, m, p = { }, 0, 0, nil
for l=1,#list do
local ll = list[l]
local ltg = ll.tg
@@ -435,11 +471,13 @@ local function apply_nodes(list,directive,nodes)
if directive then
if ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
elseif not ok then
local llp = ll.__p__ ; if llp ~= p then p, m = llp, 1 else m = m + 1 end
- collected[#collected+1], ll.mi = ll, m
+ c = c + 1
+ collected[c], ll.mi = ll, m
end
end
end
@@ -450,12 +488,13 @@ end
local quit_expression = false
local function apply_expression(list,expression,order)
- local collected = { }
+ local collected, c = { }, 0
quit_expression = false
for l=1,#list do
local ll = list[l]
if expression(list,ll,l,order) then -- nasty, order alleen valid als n=1
- collected[#collected+1] = ll
+ c = c + 1
+ collected[c] = ll
end
if quit_expression then
break
@@ -494,7 +533,9 @@ local lp_builtin = P (
P("ns") / "ll.ns"
) * ((spaces * P("(") * spaces * P(")"))/"")
-local lp_attribute = (P("@") + P("attribute::")) / "" * Cc("(ll.at and ll.at['") * R("az","AZ","--","__")^1 * Cc("'])")
+-- for the moment we keep namespaces with attributes
+
+local lp_attribute = (P("@") + P("attribute::")) / "" * Cc("(ll.at and ll.at['") * ((R("az","AZ") + S("-_:"))^1) * Cc("'])")
local lp_fastpos_p = ((P("+")^0 * R("09")^1 * P(-1)) / function(s) return "l==" .. s end)
local lp_fastpos_n = ((P("-") * R("09")^1 * P(-1)) / function(s) return "(" .. s .. "<0 and (#list+".. s .. "==l))" end)
local lp_fastpos = lp_fastpos_n + lp_fastpos_p
@@ -613,13 +654,13 @@ local skip = { }
local function errorrunner_e(str,cnv)
if not skip[str] then
- logs.report("lpath","error in expression: %s => %s",str,cnv)
+ report_lpath("error in expression: %s => %s",str,cnv)
skip[str] = cnv or str
end
return false
end
local function errorrunner_f(str,arg)
- logs.report("lpath","error in finalizer: %s(%s)",str,arg or "")
+ report_lpath("error in finalizer: %s(%s)",str,arg or "")
return false
end
@@ -670,7 +711,7 @@ local special_1 = P("*") * Cc(register_auto_descendant) * Cc(register_all_nodes
local special_2 = P("/") * Cc(register_auto_self)
local special_3 = P("") * Cc(register_auto_self)
-local parser = Ct { "patterns", -- can be made a bit faster by moving pattern outside
+local pathparser = Ct { "patterns", -- can be made a bit faster by moving pattern outside
patterns = spaces * V("protocol") * spaces * (
( V("special") * spaces * P(-1) ) +
@@ -742,6 +783,8 @@ local parser = Ct { "patterns", -- can be made a bit faster by moving pattern ou
}
+xmlpatterns.pathparser = pathparser
+
local cache = { }
local function nodesettostring(set,nodetest)
@@ -751,7 +794,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[#t+1] = (directive and tg) or format("not(%s)",tg)
+ t[i] = (directive and tg) or format("not(%s)",tg)
end
if nodetest == false then
return format("not(%s)",concat(t,"|"))
@@ -770,7 +813,7 @@ local function tagstostring(list)
local ns, tg = li.ns, li.tg
if not ns or ns == "" then ns = "*" end
if not tg or tg == "" then tg = "*" end
- t[#t+1] = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg)
+ t[i] = (tg == "@rt@" and "[root]") or format("%s:%s",ns,tg)
end
return concat(t," ")
end
@@ -778,16 +821,16 @@ end
xml.nodesettostring = nodesettostring
-local parse_pattern -- we have a harmless kind of circular reference
+local lpath -- we have a harmless kind of circular reference
+
+local lshowoptions = { functions = false }
local function lshow(parsed)
if type(parsed) == "string" then
- parsed = parse_pattern(parsed)
+ parsed = lpath(parsed)
end
- local s = table.serialize_functions -- ugly
- table.serialize_functions = false -- ugly
- logs.report("lpath","%s://%s => %s",parsed.protocol or xml.defaultprotocol,parsed.pattern,table.serialize(parsed,false))
- table.serialize_functions = s -- ugly
+ report_lpath("%s://%s => %s",parsed.protocol or xml.defaultprotocol,parsed.pattern,
+ table.serialize(parsed,false,lshowoptions))
end
xml.lshow = lshow
@@ -801,7 +844,7 @@ local function add_comment(p,str)
end
end
-parse_pattern = function (pattern) -- the gain of caching is rather minimal
+lpath = function (pattern) -- the gain of caching is rather minimal
lpathcalls = lpathcalls + 1
if type(pattern) == "table" then
return pattern
@@ -810,13 +853,13 @@ parse_pattern = function (pattern) -- the gain of caching is rather minimal
if parsed then
lpathcached = lpathcached + 1
else
- parsed = lpegmatch(parser,pattern)
+ parsed = lpegmatch(pathparser,pattern)
if parsed then
parsed.pattern = pattern
local np = #parsed
if np == 0 then
parsed = { pattern = pattern, register_self, state = "parsing error" }
- logs.report("lpath","parsing error in '%s'",pattern)
+ report_lpath("parsing error in '%s'",pattern)
lshow(parsed)
else
-- we could have done this with a more complex parser but this
@@ -858,6 +901,8 @@ parse_pattern = function (pattern) -- the gain of caching is rather minimal
end
end
+xml.lpath = lpath
+
-- we can move all calls inline and then merge the trace back
-- technically we can combine axis and the next nodes which is
-- what we did before but this a bit cleaner (but slower too)
@@ -920,32 +965,32 @@ local function traced_apply(list,parsed,nofparsed,order)
if trace_lparse then
lshow(parsed)
end
- logs.report("lpath", "collecting : %s",parsed.pattern)
- logs.report("lpath", " root tags : %s",tagstostring(list))
- logs.report("lpath", " order : %s",order or "unset")
+ report_lpath("collecting: %s",parsed.pattern)
+ report_lpath("root tags : %s",tagstostring(list))
+ report_lpath("order : %s",order or "unset")
local collected = list
for i=1,nofparsed do
local pi = parsed[i]
local kind = pi.kind
if kind == "axis" then
collected = apply_axis[pi.axis](collected)
- logs.report("lpath", "% 10i : ax : %s",(collected and #collected) or 0,pi.axis)
+ report_lpath("% 10i : ax : %s",(collected and #collected) or 0,pi.axis)
elseif kind == "nodes" then
collected = apply_nodes(collected,pi.nodetest,pi.nodes)
- logs.report("lpath", "% 10i : ns : %s",(collected and #collected) or 0,nodesettostring(pi.nodes,pi.nodetest))
+ report_lpath("% 10i : ns : %s",(collected and #collected) or 0,nodesettostring(pi.nodes,pi.nodetest))
elseif kind == "expression" then
collected = apply_expression(collected,pi.evaluator,order)
- logs.report("lpath", "% 10i : ex : %s -> %s",(collected and #collected) or 0,pi.expression,pi.converted)
+ report_lpath("% 10i : ex : %s -> %s",(collected and #collected) or 0,pi.expression,pi.converted)
elseif kind == "finalizer" then
collected = pi.finalizer(collected)
- logs.report("lpath", "% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pi.name,pi.arguments or "")
+ report_lpath("% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pi.name,pi.arguments or "")
return collected
end
if not collected or #collected == 0 then
local pn = i < nofparsed and parsed[nofparsed]
if pn and pn.kind == "finalizer" then
collected = pn.finalizer(collected)
- logs.report("lpath", "% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pn.name,pn.arguments or "")
+ report_lpath("% 10i : fi : %s : %s(%s)",(type(collected) == "table" and #collected) or 0,parsed.protocol or xml.defaultprotocol,pn.name,pn.arguments or "")
return collected
end
return nil
@@ -982,8 +1027,41 @@ local function normal_apply(list,parsed,nofparsed,order)
return collected
end
-local function parse_apply(list,pattern)
- -- we avoid an extra call
+--~ local function applylpath(list,pattern)
+--~ -- we avoid an extra call
+--~ local parsed = cache[pattern]
+--~ if parsed then
+--~ lpathcalls = lpathcalls + 1
+--~ lpathcached = lpathcached + 1
+--~ elseif type(pattern) == "table" then
+--~ lpathcalls = lpathcalls + 1
+--~ parsed = pattern
+--~ else
+--~ parsed = lpath(pattern) or pattern
+--~ end
+--~ if not parsed then
+--~ return
+--~ end
+--~ local nofparsed = #parsed
+--~ if nofparsed == 0 then
+--~ return -- something is wrong
+--~ end
+--~ local one = list[1] -- we could have a third argument: isroot and list or list[1] or whatever we like ... todo
+--~ if not one then
+--~ return -- something is wrong
+--~ elseif not trace_lpath then
+--~ return normal_apply(list,parsed,nofparsed,one.mi)
+--~ elseif trace_lprofile then
+--~ return profiled_apply(list,parsed,nofparsed,one.mi)
+--~ else
+--~ return traced_apply(list,parsed,nofparsed,one.mi)
+--~ end
+--~ end
+
+local function applylpath(list,pattern)
+ if not list then
+ return
+ end
local parsed = cache[pattern]
if parsed then
lpathcalls = lpathcalls + 1
@@ -992,7 +1070,7 @@ local function parse_apply(list,pattern)
lpathcalls = lpathcalls + 1
parsed = pattern
else
- parsed = parse_pattern(pattern) or pattern
+ parsed = lpath(pattern) or pattern
end
if not parsed then
return
@@ -1001,25 +1079,32 @@ local function parse_apply(list,pattern)
if nofparsed == 0 then
return -- something is wrong
end
- local one = list[1]
- if not one then
- return -- something is wrong
- elseif not trace_lpath then
- return normal_apply(list,parsed,nofparsed,one.mi)
+ if not trace_lpath then
+ return normal_apply ({ list },parsed,nofparsed,list.mi)
elseif trace_lprofile then
- return profiled_apply(list,parsed,nofparsed,one.mi)
+ return profiled_apply({ list },parsed,nofparsed,list.mi)
else
- return traced_apply(list,parsed,nofparsed,one.mi)
+ return traced_apply ({ list },parsed,nofparsed,list.mi)
end
end
+xml.applylpath = applylpath -- takes a table as first argment, which is what xml.filter will do
+
+--[[ldx--
+<p>This is the main filter function. It returns whatever is asked for.</p>
+--ldx]]--
+
+function xml.filter(root,pattern) -- no longer funny attribute handling here
+ return applylpath(root,pattern)
+end
+
-- internal (parsed)
expressions.child = function(e,pattern)
- return parse_apply({ e },pattern) -- todo: cache
+ return applylpath(e,pattern) -- todo: cache
end
expressions.count = function(e,pattern)
- local collected = parse_apply({ e },pattern) -- todo: cache
+ local collected = applylpath(e,pattern) -- todo: cache
return (collected and #collected) or 0
end
@@ -1029,7 +1114,7 @@ expressions.oneof = function(s,...) -- slow
local t = {...} for i=1,#t do if s == t[i] then return true end end return false
end
expressions.error = function(str)
- xml.error_handler("unknown function in lpath expression",tostring(str or "?"))
+ xml.errorhandler("unknown function in lpath expression",tostring(str or "?"))
return false
end
expressions.undefined = function(s)
@@ -1058,8 +1143,8 @@ expressions.boolean = toboolean
-- user interface
local function traverse(root,pattern,handle)
- logs.report("xml","use 'xml.selection' instead for '%s'",pattern)
- local collected = parse_apply({ root },pattern)
+ report_lpath("use 'xml.selection' instead for '%s'",pattern)
+ local collected = applylpath(root,pattern)
if collected then
for c=1,#collected do
local e = collected[c]
@@ -1070,7 +1155,7 @@ local function traverse(root,pattern,handle)
end
local function selection(root,pattern,handle)
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if handle then
for c=1,#collected do
@@ -1082,19 +1167,12 @@ local function selection(root,pattern,handle)
end
end
-xml.parse_parser = parser
-xml.parse_pattern = parse_pattern
-xml.parse_apply = parse_apply
xml.traverse = traverse -- old method, r, d, k
xml.selection = selection -- new method, simple handle
-local lpath = parse_pattern
-
-xml.lpath = lpath
-
-function xml.cached_patterns()
- return cache
-end
+--~ function xml.cachedpatterns()
+--~ return cache
+--~ end
-- generic function finalizer (independant namespace)
@@ -1106,13 +1184,13 @@ local function dofunction(collected,fnc)
f(collected[c])
end
else
- logs.report("xml","unknown function '%s'",fnc)
+ report_lpath("unknown function '%s'",fnc)
end
end
end
-xml.finalizers.xml["function"] = dofunction
-xml.finalizers.tex["function"] = dofunction
+finalizers.xml["function"] = dofunction
+finalizers.tex["function"] = dofunction
-- functions
@@ -1205,14 +1283,6 @@ expressions.tag = function(e,n) -- only tg
end
--[[ldx--
-<p>This is the main filter function. It returns whatever is asked for.</p>
---ldx]]--
-
-function xml.filter(root,pattern) -- no longer funny attribute handling here
- return parse_apply({ root },pattern)
-end
-
---[[ldx--
<p>Often using an iterators looks nicer in the code than passing handler
functions. The <l n='lua'/> book describes how to use coroutines for that
purpose (<url href='http://www.lua.org/pil/9.3.html'/>). This permits
@@ -1231,7 +1301,7 @@ end
local wrap, yield = coroutine.wrap, coroutine.yield
function xml.elements(root,pattern,reverse) -- r, d, k
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if reverse then
return wrap(function() for c=#collected,1,-1 do
@@ -1247,7 +1317,7 @@ function xml.elements(root,pattern,reverse) -- r, d, k
end
function xml.collected(root,pattern,reverse) -- e
- local collected = parse_apply({ root },pattern)
+ local collected = applylpath(root,pattern)
if collected then
if reverse then
return wrap(function() for c=#collected,1,-1 do yield(collected[c]) end end)
@@ -1257,3 +1327,12 @@ function xml.collected(root,pattern,reverse) -- e
end
return wrap(function() end)
end
+
+-- handy
+
+function xml.inspect(collection,pattern)
+ pattern = pattern or "."
+ for e in xml.collected(collection,pattern or ".") do
+ report_lpath("pattern %q\n\n%s\n",pattern,xml.tostring(e))
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/lxml-mis.lua b/Master/texmf-dist/tex/context/base/lxml-mis.lua
index 9fd4270af4a..94a26b97414 100644
--- a/Master/texmf-dist/tex/context/base/lxml-mis.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-mis.lua
@@ -6,10 +6,16 @@ if not modules then modules = { } end modules ['lxml-mis'] = {
license = "see context related readme files"
}
+local xml, lpeg, string = xml, lpeg, string
+
local concat = table.concat
local type, next, tonumber, tostring, setmetatable, loadstring = type, next, tonumber, tostring, setmetatable, loadstring
local format, gsub, match = string.format, string.gsub, string.match
-local lpegmatch = lpeg.match
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs
+
+lpegpatterns.xml = lpegpatterns.xml or { }
+local xmlpatterns = lpegpatterns.xml
--[[ldx--
<p>The following helper functions best belong to the <t>lxml-ini</t>
@@ -35,7 +41,7 @@ end
--~ xml.gsub = xmlgsub
-function xml.strip_leading_spaces(dk,d,k) -- cosmetic, for manual
+function xml.stripleadingspaces(dk,d,k) -- cosmetic, for manual
if d and k then
local dkm = d[k-1]
if dkm and type(dkm) == "string" then
@@ -52,8 +58,6 @@ end
--~ function xml.unescaped(str) return (gsub(str,"(&.-;)", xml.unescapes)) end
--~ function xml.cleansed (str) return (gsub(str,"<.->" , '' )) end -- "%b<>"
-local P, S, R, C, V, Cc, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.Cc, lpeg.Cs
-
-- 100 * 2500 * "oeps< oeps> oeps&" : gsub:lpeg|lpeg|lpeg
--
-- 1021:0335:0287:0247
@@ -78,9 +82,9 @@ local unescaped = Cs(normal * (special * normal)^0)
local cleansed = Cs(((P("<") * (1-P(">"))^0 * P(">"))/"" + 1)^0)
-xml.escaped_pattern = escaped
-xml.unescaped_pattern = unescaped
-xml.cleansed_pattern = cleansed
+xmlpatterns.escaped = escaped
+xmlpatterns.unescaped = unescaped
+xmlpatterns.cleansed = cleansed
function xml.escaped (str) return lpegmatch(escaped,str) end
function xml.unescaped(str) return lpegmatch(unescaped,str) end
diff --git a/Master/texmf-dist/tex/context/base/lxml-sor.lua b/Master/texmf-dist/tex/context/base/lxml-sor.lua
index e220bfad616..a159fd4e00f 100644
--- a/Master/texmf-dist/tex/context/base/lxml-sor.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-sor.lua
@@ -10,6 +10,8 @@ local format, concat = string.format, table.concat
local lpegmatch = lpeg.match
local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local xml, lxml = xml, lxml
+
lxml.sorters = lxml.sorters or { }
if not lxml.splitid then
diff --git a/Master/texmf-dist/tex/context/base/lxml-sor.mkiv b/Master/texmf-dist/tex/context/base/lxml-sor.mkiv
index 14425967bd9..a3fc83dd128 100644
--- a/Master/texmf-dist/tex/context/base/lxml-sor.mkiv
+++ b/Master/texmf-dist/tex/context/base/lxml-sor.mkiv
@@ -19,11 +19,11 @@
\unprotect
-\def\xmlresetsorter #1{\ctxlua{lxml.sorters.reset("#1")}}
-\def\xmladdsortentry#1#2#3{\ctxlua{lxml.sorters.add("#1","#2",\!!bs#3\!!es)}}
-\def\xmlshowsorter #1{\ctxlua{lxml.sorters.show("#1")}}
-\def\xmlflushsorter #1#2{\ctxlua{lxml.sorters.flush("#1","#2")}}
-\def\xmlsortentries #1{\ctxlua{lxml.sorters.sort("#1")}}
+\def\xmlresetsorter #1{\ctxlxml{sorters.reset("#1")}}
+\def\xmladdsortentry#1#2#3{\ctxlxml{sorters.add("#1","#2",\!!bs#3\!!es)}}
+\def\xmlshowsorter #1{\ctxlxml{sorters.show("#1")}}
+\def\xmlflushsorter #1#2{\ctxlxml{sorters.flush("#1","#2")}}
+\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 23cd1cf0471..7d38a8d5abc 100644
--- a/Master/texmf-dist/tex/context/base/lxml-tab.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-tab.lua
@@ -12,6 +12,8 @@ if not modules then modules = { } end modules ['lxml-tab'] = {
local trace_entities = false trackers.register("xml.entities", function(v) trace_entities = v end)
+local report_xml = logs and logs.reporter("xml","core") or function(...) print(format(...)) end
+
--[[ldx--
<p>The parser used here is inspired by the variant discussed in the lua book, but
handles comment and processing instructions, has a different structure, provides
@@ -22,9 +24,14 @@ The find based parser can be found in l-xml-edu.lua along with other older code.
<p>Beware, the interface may change. For instance at, ns, tg, dt may get more
verbose names. Once the code is stable we will also remove some tracing and
optimize the code.</p>
+
+<p>I might even decide to reimplement the parser using the latest <l n='lpeg'/> trickery
+as the current variant was written when <l n='lpeg'/> showed up and it's easier now to
+build tables in one go.</p>
--ldx]]--
xml = xml or { }
+local xml = xml
--~ local xml = xml
@@ -150,7 +157,7 @@ local dcache, hcache, acache = { }, { }, { }
local mt = { }
-function initialize_mt(root)
+local function initialize_mt(root)
mt = { __index = root } -- will be redefined later
end
@@ -158,8 +165,8 @@ function xml.setproperty(root,k,v)
getmetatable(root).__index[k] = v
end
-function xml.check_error(top,toclose)
- return ""
+function xml.checkerror(top,toclose)
+ return "" -- can be set
end
local function add_attribute(namespace,tag,value)
@@ -215,9 +222,9 @@ local function add_end(spacing, namespace, tag)
local toclose = remove(stack)
top = stack[#stack]
if #stack < 1 then
- errorstr = format("nothing to close with %s %s", tag, xml.check_error(top,toclose) or "")
+ errorstr = format("nothing to close with %s %s", tag, xml.checkerror(top,toclose) or "")
elseif toclose.tg ~= tag then -- no namespace check
- errorstr = format("unable to close %s with %s %s", toclose.tg, tag, xml.check_error(top,toclose) or "")
+ errorstr = format("unable to close %s with %s %s", toclose.tg, tag, xml.checkerror(top,toclose) or "")
end
dt = top.dt
dt[#dt+1] = toclose
@@ -254,24 +261,29 @@ local reported_attribute_errors = { }
local function attribute_value_error(str)
if not reported_attribute_errors[str] then
- logs.report("xml","invalid attribute value: %q",str)
+ report_xml("invalid attribute value: %q",str)
reported_attribute_errors[str] = true
at._error_ = str
end
return str
end
+
local function attribute_specification_error(str)
if not reported_attribute_errors[str] then
- logs.report("xml","invalid attribute specification: %q",str)
+ report_xml("invalid attribute specification: %q",str)
reported_attribute_errors[str] = true
at._error_ = str
end
return str
end
-function xml.unknown_dec_entity_format(str) return (str == "" and "&error;") or format("&%s;",str) end
-function xml.unknown_hex_entity_format(str) return format("&#x%s;",str) end
-function xml.unknown_any_entity_format(str) return format("&#x%s;",str) end
+xml.placeholders = {
+ unknown_dec_entity = function(str) return (str == "" and "&error;") or format("&%s;",str) end,
+ unknown_hex_entity = function(str) return format("&#x%s;",str) end,
+ unknown_any_entity = function(str) return format("&#x%s;",str) end,
+}
+
+local placeholders = xml.placeholders
local function fromhex(s)
local n = tonumber(s,16)
@@ -325,18 +337,18 @@ local function handle_hex_entity(str)
h = unify_predefined and predefined_unified[n]
if h then
if trace_entities then
- logs.report("xml","utfize, converting hex entity &#x%s; into %s",str,h)
+ report_xml("utfize, converting hex entity &#x%s; into %s",str,h)
end
elseif utfize then
- h = (n and utfchar(n)) or xml.unknown_hex_entity_format(str) or ""
+ h = (n and utfchar(n)) or xml.unknown_hex_entity(str) or ""
if not n then
- logs.report("xml","utfize, ignoring hex entity &#x%s;",str)
+ report_xml("utfize, ignoring hex entity &#x%s;",str)
elseif trace_entities then
- logs.report("xml","utfize, converting hex entity &#x%s; into %s",str,h)
+ report_xml("utfize, converting hex entity &#x%s; into %s",str,h)
end
else
if trace_entities then
- logs.report("xml","found entity &#x%s;",str)
+ report_xml("found entity &#x%s;",str)
end
h = "&#x" .. str .. ";"
end
@@ -352,18 +364,18 @@ local function handle_dec_entity(str)
d = unify_predefined and predefined_unified[n]
if d then
if trace_entities then
- logs.report("xml","utfize, converting dec entity &#%s; into %s",str,d)
+ report_xml("utfize, converting dec entity &#%s; into %s",str,d)
end
elseif utfize then
- d = (n and utfchar(n)) or xml.unknown_dec_entity_format(str) or ""
+ d = (n and utfchar(n)) or placeholders.unknown_dec_entity(str) or ""
if not n then
- logs.report("xml","utfize, ignoring dec entity &#%s;",str)
+ report_xml("utfize, ignoring dec entity &#%s;",str)
elseif trace_entities then
- logs.report("xml","utfize, converting dec entity &#%s; into %s",str,h)
+ report_xml("utfize, converting dec entity &#%s; into %s",str,h)
end
else
if trace_entities then
- logs.report("xml","found entity &#%s;",str)
+ report_xml("found entity &#%s;",str)
end
d = "&#" .. str .. ";"
end
@@ -388,20 +400,21 @@ local function handle_any_entity(str)
end
if a then
if trace_entities then
- logs.report("xml","resolved entity &%s; -> %s (internal)",str,a)
+ report_xml("resolved entity &%s; -> %s (internal)",str,a)
end
a = lpegmatch(parsedentity,a) or a
else
- if xml.unknown_any_entity_format then
- a = xml.unknown_any_entity_format(str) or ""
+ local unknown_any_entity = placeholders.unknown_any_entity
+ if unknown_any_entity then
+ a = unknown_any_entity(str) or ""
end
if a then
if trace_entities then
- logs.report("xml","resolved entity &%s; -> %s (external)",str,a)
+ report_xml("resolved entity &%s; -> %s (external)",str,a)
end
else
if trace_entities then
- logs.report("xml","keeping entity &%s;",str)
+ report_xml("keeping entity &%s;",str)
end
if str == "" then
a = "&error;"
@@ -413,7 +426,7 @@ local function handle_any_entity(str)
acache[str] = a
elseif trace_entities then
if not acache[str] then
- logs.report("xml","converting entity &%s; into %s",str,a)
+ report_xml("converting entity &%s; into %s",str,a)
acache[str] = a
end
end
@@ -422,7 +435,7 @@ local function handle_any_entity(str)
local a = acache[str]
if not a then
if trace_entities then
- logs.report("xml","found entity &%s;",str)
+ report_xml("found entity &%s;",str)
end
a = resolve_predefined and predefined_simplified[str]
if a then
@@ -441,7 +454,7 @@ local function handle_any_entity(str)
end
local function handle_end_entity(chr)
- logs.report("xml","error in entity, %q found instead of ';'",chr)
+ report_xml("error in entity, %q found instead of ';'",chr)
end
local space = S(' \r\n\t')
@@ -576,7 +589,7 @@ local function xmlconvert(data, settings)
resolve_predefined = settings.resolve_predefined_entities -- in case we have escaped entities
unify_predefined = settings.unify_predefined_entities -- &#038; -> &amp;
cleanup = settings.text_cleanup
- stack, top, at, xmlns, errorstr, result, entities = { }, { }, { }, { }, nil, nil, settings.entities or { }
+ stack, top, at, xmlns, errorstr, entities = { }, { }, { }, { }, nil, settings.entities or { }
acache, hcache, dcache = { }, { }, { } -- not stored
reported_attribute_errors = { }
if settings.parent_root then
@@ -604,16 +617,17 @@ local function xmlconvert(data, settings)
else
errorstr = "invalid xml file - no text at all"
end
+ local result
if errorstr and errorstr ~= "" then
result = { dt = { { ns = "", tg = "error", dt = { errorstr }, at={ }, er = true } } }
setmetatable(stack, mt)
- local error_handler = settings.error_handler
- if error_handler == false then
+ local errorhandler = settings.error_handler
+ if errorhandler == false then
-- no error message
else
- error_handler = error_handler or xml.error_handler
- if error_handler then
- xml.error_handler("load",errorstr)
+ errorhandler = errorhandler or xml.errorhandler
+ if errorhandler then
+ xml.errorhandler("load",errorstr)
end
end
else
@@ -673,7 +687,7 @@ function xml.is_valid(root)
return root and not root.error
end
-xml.error_handler = (logs and logs.report) or (input and logs.report) or print
+xml.errorhandler = report
--[[ldx--
<p>We cannot load an <l n='lpeg'/> from a filehandle so we need to load
@@ -784,7 +798,7 @@ local function verbose_element(e,handlers)
ats[#ats+1] = format('%s=%q',k,v)
end
end
- if ern and trace_remap and ern ~= ens then
+ if ern and trace_entities and ern ~= ens then
ens = ern
end
if ens ~= "" then
@@ -889,7 +903,7 @@ local function serialize(e,handlers,...)
-- elseif type(e) == "string" then
-- functions["@tx@"](e,handlers)
else
- functions["@dc@"](e,handlers)
+ functions["@dc@"](e,handlers) -- dc ?
end
if finalize then
return finalize()
@@ -915,7 +929,7 @@ local function newhandlers(settings)
if settings then
for k,v in next, settings do
if type(v) == "table" then
- tk = t[k] if not tk then tk = { } t[k] = tk end
+ local tk = t[k] if not tk then tk = { } t[k] = tk end
for kk,vv in next, v do
tk[kk] = vv
end
@@ -927,6 +941,7 @@ local function newhandlers(settings)
handlers[settings.name] = t
end
end
+ utilities.storage.mark(t)
return t
end
@@ -1026,7 +1041,7 @@ local function xmltext(root) -- inline
return (root and xmltostring(root)) or ""
end
-function initialize_mt(root)
+initialize_mt = function(root) -- redefinition
mt = { __tostring = xmltext, __index = root }
end
@@ -1171,4 +1186,5 @@ function xml.makestandalone(root)
end
end
end
+ return root
end
diff --git a/Master/texmf-dist/tex/context/base/lxml-tex.lua b/Master/texmf-dist/tex/context/base/lxml-tex.lua
index aaa90217fec..26a8b29962e 100644
--- a/Master/texmf-dist/tex/context/base/lxml-tex.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-tex.lua
@@ -9,33 +9,30 @@ if not modules then modules = { } end modules ['lxml-tst'] = {
local utf = unicode.utf8
local utfchar = utf.char
-local concat, insert, remove, gsub, find = table.concat, table.insert, table.remove
+local concat, insert, remove = table.concat, table.insert, table.remove
local format, sub, gsub, find, gmatch, match = string.format, string.sub, string.gsub, string.find, string.gmatch, string.match
local type, next, tonumber, tostring = type, next, tonumber, tostring
local lpegmatch = lpeg.match
local P, S, C, Cc = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc
-if not tex and not tex.sprint then
- tex = {
- sprint = function(catcodes,...) texio.write(table.concat{...}) end,
- print = function(catcodes,...) texio.write(table.concat{...}) end,
- write = function( ...) texio.write(table.concat{...}) end,
- }
- commands = {
- writestatus = logs.report
- }
- resolvers.loadbinfile = function(filename) return true, io.loaddata(filename) end
-end
+local tex, xml = tex, xml
+local lowerchars, upperchars, lettered = characters.lower, characters.upper, characters.lettered
+
+lxml = lxml or { }
+local lxml = lxml
local texsprint, texprint, texwrite = tex.sprint, tex.print, tex.write
local texcatcodes, ctxcatcodes, vrbcatcodes, notcatcodes = tex.texcatcodes, tex.ctxcatcodes, tex.vrbcatcodes, tex.notcatcodes
local xmlelements, xmlcollected, xmlsetproperty = xml.elements, xml.collected, xml.setproperty
-local xmlparseapply, xmlwithelements = xml.parse_apply, xml.withelements
+local xmlwithelements = xml.withelements
local xmlserialize, xmlcollect, xmltext, xmltostring = xml.serialize, xml.collect, xml.text, xml.tostring
+local xmlapplylpath = xml.applylpath
local variables = (interfaces and interfaces.variables) or { }
+local insertbeforevalue, insertaftervalue = utilities.tables.insertbeforevalue, utilities.tables.insertaftervalue
+
local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
local trace_setups = false trackers.register("lxml.setups", function(v) trace_setups = v end)
@@ -43,9 +40,9 @@ local trace_loading = false trackers.register("lxml.loading", function(v) tra
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)
-lxml = lxml or { }
-lxml.loaded = lxml.loaded or { }
+local report_lxml = logs.reporter("xml","tex")
+lxml.loaded = lxml.loaded or { }
local loaded = lxml.loaded
-- print(contextdirective("context-mathml-directive function reduction yes "))
@@ -75,14 +72,14 @@ local xmltextcapture = (
space^0 * newline^2 * Cc("") / texprint + -- better ^-2 ?
space^0 * newline * space^0 * Cc(" ") / texsprint +
content / function(str) return texsprint(notcatcodes,str) end + -- was just texsprint, current catcodes regime is notcatcodes
- entity / xml.resolved_entity
+ entity / xml.resolvedentity
)^0
local ctxtextcapture = (
space^0 * newline^2 * Cc("") / texprint + -- better ^-2 ?
space^0 * newline * space^0 * Cc(" ") / texsprint +
content / function(str) return texsprint(ctxcatcodes,str) end + -- was just texsprint, current catcodes regime is notcatcodes
- entity / xml.resolved_entity
+ entity / xml.resolvedentity
)^0
local forceraw, rawroot = false, nil
@@ -137,23 +134,23 @@ local function toverbatim(str)
if aftercommand then texsprint(texcatcodes,aftercommand,"{}") end
end
-function lxml.set_verbatim(before,after,obeyedline,obeyedspace)
+function lxml.setverbatim(before,after,obeyedline,obeyedspace)
beforecommand, aftercommand, linecommand, spacecommand = before, after, obeyedline, obeyedspace
end
local obeycdata = true
-function lxml.set_cdata()
+function lxml.setcdata()
obeycdata = true
end
-function lxml.reset_cdata()
+function lxml.resetcdata()
obeycdata = false
end
-- cdata and verbatim
-lxml.set_verbatim("\\xmlcdatabefore", "\\xmlcdataafter", "\\xmlcdataobeyedline", "\\xmlcdataobeyedspace")
+lxml.setverbatim("\\xmlcdatabefore", "\\xmlcdataafter", "\\xmlcdataobeyedline", "\\xmlcdataobeyedspace")
-- local capture = (space^0*newline)^0 * capture * (space+newline)^0 * -1
@@ -189,7 +186,7 @@ function lxml.splitid(id)
end
end
-local function get_id(id, qualified)
+local function getid(id, qualified)
if id then
local lid = loaded[id]
if lid then
@@ -211,25 +208,25 @@ local function get_id(id, qualified)
return root
end
elseif trace_access then
- logs.report("lxml","'%s' has no index entry '%s'",d,i)
+ report_lxml("'%s' has no index entry '%s'",d,i)
end
elseif trace_access then
- logs.report("lxml","'%s' has no index",d)
+ report_lxml("'%s' has no index",d)
end
elseif trace_access then
- logs.report("lxml","'%s' is not loaded",d)
+ report_lxml("'%s' is not loaded",d)
end
elseif trace_access then
- logs.report("lxml","'%s' is not loaded",i)
+ report_lxml("'%s' is not loaded",i)
end
end
elseif trace_access then
- logs.report("lxml","invalid id (nil)")
+ report_lxml("invalid id (nil)")
end
end
-lxml.id = get_id
-lxml.get_id = get_id
+lxml.id = getid -- we provide two names as locals can already use such
+lxml.getid = getid -- names and we don't want clashes
function lxml.root(id)
return loaded[id]
@@ -240,7 +237,7 @@ end
local nofindices = 0
local function addindex(name,check_sum,force)
- local root = get_id(name)
+ local root = getid(name)
if root and (not root.index or force) then -- weird, only called once
local n, index, maxindex, check = 0, root.index or { }, root.maxindex or 0, root.check or { }
local function nest(root)
@@ -270,7 +267,7 @@ local function addindex(name,check_sum,force)
root.index = index
root.maxindex = maxindex
if trace_access then
- logs.report("lxml","%s indexed, %s nodes",tostring(name),maxindex)
+ report_lxml("%s indexed, %s nodes",tostring(name),maxindex)
end
end
end
@@ -279,27 +276,27 @@ lxml.addindex = addindex
-- another cache
-local function lxmlparseapply(id,pattern) -- better inline, saves call
- return xmlparseapply({ get_id(id) }, pattern)
+local function lxmlapplylpath(id,pattern) -- better inline, saves call
+ return xmlapplylpath(getid(id),pattern)
end
-lxml.filter = lxmlparseapply
+lxml.filter = lxmlapplylpath
function lxml.filterlist(list,pattern)
for s in gmatch(list,"[^, ]+") do -- we could cache a table
- lxmlparseapply(s,pattern)
+ xmlapplylpath(getid(s),pattern)
end
end
-lxml["function"] = function(id,name)
+function lxml.applyfunction(id,name)
local f = xml.functions[name]
- return f and f(get_id(id))
+ return f and f(getid(id))
end
-- rather new, indexed storage (backward refs), maybe i will merge this
function lxml.checkindex(name)
- local root = get_id(name)
+ local root = getid(name)
return (root and root.index) or 0
end
@@ -359,12 +356,14 @@ end
function lxml.load(id,filename,compress,entities)
filename = commands.preparedfile(filename)
if trace_loading then
- commands.writestatus("lxml","loading file '%s' as '%s'",filename,id)
+ report_lxml("loading file '%s' as '%s'",filename,id)
end
noffiles, nofconverted = noffiles + 1, nofconverted + 1
-- local xmltable = xml.load(filename)
+ starttiming(xml)
local ok, data = resolvers.loadbinfile(filename)
local xmltable = lxml.convert(id,(ok and data) or "",compress,entities)
+ stoptiming(xml)
lxml.store(id,xmltable,filename)
return xmltable, filename
end
@@ -376,7 +375,7 @@ end
function lxml.include(id,pattern,attribute,recurse)
starttiming(xml)
- local root = get_id(id)
+ local root = getid(id)
xml.include(root,pattern,attribute,recurse,function(filename)
if filename then
filename = commands.preparedfile(filename)
@@ -387,7 +386,7 @@ function lxml.include(id,pattern,attribute,recurse)
end
end
if trace_loading then
- commands.writestatus("lxml","including file: %s",filename)
+ report_lxml("including file: %s",filename)
end
noffiles, nofconverted = noffiles + 1, nofconverted + 1
return resolvers.loadtexfile(filename) or ""
@@ -403,7 +402,8 @@ function xml.getbuffer(name,compress,entities) -- we need to make sure that comm
name = tex.jobname
end
nofconverted = nofconverted + 1
- xmltostring(lxml.convert(name,concat(buffers.data[name] or {},""),compress,entities))
+ local data = buffers.getcontent(name)
+ xmltostring(lxml.convert(name,data,compress,entities)) -- one buffer
end
function lxml.loadbuffer(id,name,compress,entities)
@@ -412,7 +412,8 @@ function lxml.loadbuffer(id,name,compress,entities)
end
starttiming(xml)
nofconverted = nofconverted + 1
- local xmltable = lxml.convert(id,buffers.collect(name or id,"\n"),compress,entities)
+ local data = buffers.getcontent(name or id)
+ local xmltable = lxml.convert(id,data,compress,entities)
lxml.store(id,xmltable)
stoptiming(xml)
return xmltable, name or id
@@ -444,7 +445,7 @@ end
local function tex_comment(e,handlers)
if trace_comments then
- logs.report("lxml","comment: %s",e.dt[1])
+ report_lxml("comment: %s",e.dt[1])
end
end
@@ -470,7 +471,7 @@ local function tex_element(e,handlers)
end
texsprint(ctxcatcodes,"\\xmlw{",command,"}{",rootname,"::",ix,"}")
else
- logs.report("lxml", "fatal error: no index for '%s'",command)
+ report_lxml( "fatal error: no index for '%s'",command)
texsprint(ctxcatcodes,"\\xmlw{",command,"}{",ix or 0,"}")
end
elseif tc == "function" then
@@ -481,17 +482,16 @@ end
local pihandlers = { } xml.pihandlers = pihandlers
-local kind = 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 value = C(P(1-(space * -1))^0)
+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 value = C(P(1-(space * -1))^0)
-local parser = kind * spaces * class * spaces * key * spaces * value
+local parser = category * spaces * class * spaces * key * spaces * value
pihandlers[#pihandlers+1] = function(str)
--- local kind, class, key, value = lpegmatch(parser,str)
if str then
local a, b, c, d = lpegmatch(parser,str)
if d then
@@ -522,7 +522,7 @@ local function ctx_text(e)
end
local function tex_handle(...)
--- logs.report("lxml", "error while flushing: %s", concat { ... })
+-- report_lxml( "error while flushing: %s", concat { ... })
texsprint(...) -- notcatcodes is active anyway
end
@@ -548,7 +548,7 @@ function lxml.serialize(root)
end
function lxml.setaction(id,pattern,action)
- local collected = lxmlparseapply(id,pattern)
+ local collected = xmlapplylpath(getid(id),pattern)
if collected then
for c=1,#collected do
collected[c].command = action
@@ -614,7 +614,7 @@ xml.cprint = cprint local xmlcprint = cprint
-- now we can flush
function lxml.main(id)
- xmlserialize(get_id(id),xmltexhandler) -- the real root (@rt@)
+ xmlserialize(getid(id),xmltexhandler) -- the real root (@rt@)
end
--~ -- lines (untested)
@@ -670,12 +670,12 @@ end
local setups = { }
-function lxml.set_command_to_text(id)
- xmlwithelements(get_id(id),to_text)
+function lxml.setcommandtotext(id)
+ xmlwithelements(getid(id),to_text)
end
-function lxml.set_command_to_none(id)
- xmlwithelements(get_id(id),to_none)
+function lxml.setcommandtonone(id)
+ xmlwithelements(getid(id),to_none)
end
function lxml.installsetup(what,document,setup,where)
@@ -687,24 +687,24 @@ function lxml.installsetup(what,document,setup,where)
end
if what == 1 then
if trace_loading then
- commands.writestatus("lxml","prepending setup %s for %s",setup,document)
+ report_lxml("prepending setup %s for %s",setup,document)
end
insert(sd,1,setup)
elseif what == 2 then
if trace_loading then
- commands.writestatus("lxml","appending setup %s for %s",setup,document)
+ report_lxml("appending setup %s for %s",setup,document)
end
insert(sd,setup)
elseif what == 3 then
if trace_loading then
- commands.writestatus("lxml","inserting setup %s for %s before %s",setup,document,where)
+ report_lxml("inserting setup %s for %s before %s",setup,document,where)
end
- table.insert_before_value(sd,setup,where)
+ insertbeforevalue(sd,setup,where)
elseif what == 4 then
if trace_loading then
- commands.writestatus("lxml","inserting setup %s for %s after %s",setup,document,where)
+ report_lxml("inserting setup %s for %s after %s",setup,document,where)
end
- table.insert_after_value(sd,setup,where)
+ insertaftervalue(sd,setup,where)
end
end
@@ -718,21 +718,21 @@ function lxml.flushsetups(id,...)
local v= sd[k]
if not done[v] then
if trace_loading then
- commands.writestatus("lxml","applying setup %02i = %s to %s",k,v,document)
+ report_lxml("applying setup %02i = %s to %s",k,v,document)
end
texsprint(ctxcatcodes,"\\xmlsetup{",id,"}{",v,"}")
done[v] = true
end
end
elseif trace_loading then
- commands.writestatus("lxml","no setups for %s",document)
+ report_lxml("no setups for %s",document)
end
end
end
function lxml.resetsetups(document)
if trace_loading then
- commands.writestatus("lxml","resetting all setups for %s",document)
+ report_lxml("resetting all setups for %s",document)
end
setups[document] = { }
end
@@ -743,7 +743,7 @@ function lxml.removesetup(document,setup)
for i=1,#s do
if s[i] == setup then
if trace_loading then
- commands.writestatus("lxml","removing setup %s for %s",setup,document)
+ report_lxml("removing setup %s for %s",setup,document)
end
remove(t,i)
break
@@ -754,7 +754,7 @@ end
function lxml.setsetup(id,pattern,setup)
if not setup or setup == "" or setup == "*" or setup == "-" or setup == "+" then
- local collected = lxmlparseapply(id,pattern)
+ local collected = xmlapplylpath(getid(id),pattern)
if collected then
if trace_setups then
for c=1, #collected do
@@ -762,19 +762,19 @@ function lxml.setsetup(id,pattern,setup)
local ix = e.ix or 0
if setup == "-" then
e.command = false
- logs.report("lxml","lpath matched (a) %5i: %s = %s -> skipped",c,ix,setup)
+ report_lxml("lpath matched (a) %5i: %s = %s -> skipped",c,ix,setup)
elseif setup == "+" then
e.command = true
- logs.report("lxml","lpath matched (b) %5i: %s = %s -> text",c,ix,setup)
+ report_lxml("lpath matched (b) %5i: %s = %s -> text",c,ix,setup)
else
local tg = e.tg
if tg then -- to be sure
e.command = tg
local ns = e.rn or e.ns
if ns == "" then
- logs.report("lxml","lpath matched (c) %5i: %s = %s -> %s",c,ix,tg,tg)
+ report_lxml("lpath matched (c) %5i: %s = %s -> %s",c,ix,tg,tg)
else
- logs.report("lxml","lpath matched (d) %5i: %s = %s:%s -> %s",c,ix,ns,tg,tg)
+ report_lxml("lpath matched (d) %5i: %s = %s:%s -> %s",c,ix,ns,tg,tg)
end
end
end
@@ -792,12 +792,12 @@ function lxml.setsetup(id,pattern,setup)
end
end
elseif trace_setups then
- logs.report("lxml","no lpath matches for %s",pattern)
+ report_lxml("no lpath matches for %s",pattern)
end
else
local a, b = match(setup,"^(.+:)([%*%-])$")
if a and b then
- local collected = lxmlparseapply(id,pattern)
+ local collected = xmlapplylpath(getid(id),pattern)
if collected then
if trace_setups then
for c=1, #collected do
@@ -806,23 +806,23 @@ function lxml.setsetup(id,pattern,setup)
if b == "-" then
e.command = false
if ns == "" then
- logs.report("lxml","lpath matched (e) %5i: %s = %s -> skipped",c,ix,tg)
+ report_lxml("lpath matched (e) %5i: %s = %s -> skipped",c,ix,tg)
else
- logs.report("lxml","lpath matched (f) %5i: %s = %s:%s -> skipped",c,ix,ns,tg)
+ report_lxml("lpath matched (f) %5i: %s = %s:%s -> skipped",c,ix,ns,tg)
end
elseif b == "+" then
e.command = true
if ns == "" then
- logs.report("lxml","lpath matched (g) %5i: %s = %s -> text",c,ix,tg)
+ report_lxml("lpath matched (g) %5i: %s = %s -> text",c,ix,tg)
else
- logs.report("lxml","lpath matched (h) %5i: %s = %s:%s -> text",c,ix,ns,tg)
+ report_lxml("lpath matched (h) %5i: %s = %s:%s -> text",c,ix,ns,tg)
end
else
e.command = a .. tg
if ns == "" then
- logs.report("lxml","lpath matched (i) %5i: %s = %s -> %s",c,ix,tg,e.command)
+ report_lxml("lpath matched (i) %5i: %s = %s -> %s",c,ix,tg,e.command)
else
- logs.report("lxml","lpath matched (j) %5i: %s = %s:%s -> %s",c,ix,ns,tg,e.command)
+ report_lxml("lpath matched (j) %5i: %s = %s:%s -> %s",c,ix,ns,tg,e.command)
end
end
end
@@ -839,10 +839,10 @@ function lxml.setsetup(id,pattern,setup)
end
end
elseif trace_setups then
- logs.report("lxml","no lpath matches for %s",pattern)
+ report_lxml("no lpath matches for %s",pattern)
end
else
- local collected = lxmlparseapply(id,pattern)
+ local collected = xmlapplylpath(getid(id),pattern)
if collected then
if trace_setups then
for c=1, #collected do
@@ -850,9 +850,9 @@ function lxml.setsetup(id,pattern,setup)
e.command = setup
local ns, tg, ix = e.rn or e.ns, e.tg, e.ix or 0
if ns == "" then
- logs.report("lxml","lpath matched (k) %5i: %s = %s -> %s",c,ix,tg,setup)
+ report_lxml("lpath matched (k) %5i: %s = %s -> %s",c,ix,tg,setup)
else
- logs.report("lxml","lpath matched (l) %5i: %s = %s:%s -> %s",c,ix,ns,tg,setup)
+ report_lxml("lpath matched (l) %5i: %s = %s:%s -> %s",c,ix,ns,tg,setup)
end
end
else
@@ -861,7 +861,7 @@ function lxml.setsetup(id,pattern,setup)
end
end
elseif trace_setups then
- logs.report("lxml","no lpath matches for %s",pattern)
+ report_lxml("no lpath matches for %s",pattern)
end
end
end
@@ -917,7 +917,8 @@ local function position(collected,n)
end
local function match(collected) -- is match in preceding collected, never change, see bibxml
- texwrite((collected and collected[1].mi) or 0)
+ local m = collected and collected[1]
+ texwrite(m and m.mi or 0)
end
local function index(collected,n)
@@ -932,9 +933,10 @@ local function index(collected,n)
end
end
-local function command(collected,cmd)
- if collected then
- for c=1,#collected do
+local function command(collected,cmd,otherwise)
+ local n = collected and #collected
+ if n and n > 0 then
+ for c=1,n do
local e = collected[c]
local ix = e.ix
if not ix then
@@ -943,6 +945,8 @@ local function command(collected,cmd)
end
texsprint(ctxcatcodes,"\\xmlw{",cmd,"}{",e.name,"::",ix,"}")
end
+ elseif otherwise then
+ texsprint(ctxcatcodes,"\\xmlw{",otherwise,"}{#1}")
end
end
@@ -995,7 +999,19 @@ local function ctxtext(collected)
end
end
-local lowerchars, upperchars = characters.lower, characters.upper
+--~ local str = xmltext(getid(id),pattern) or ""
+--~ str = gsub(str,"^%s*(.-)%s*$","%1")
+--~ if nolines then
+--~ str = gsub(str,"%s+"," ")
+--~ end
+
+local function stripped(collected) -- tricky as we strip in place
+ if collected then
+ for c=1,#collected do
+ cprint(xml.stripelement(collected[c]))
+ end
+ end
+end
local function lower(collected)
if collected then
@@ -1059,6 +1075,7 @@ finalizers.count = count
finalizers.command = command
finalizers.attribute = attribute
finalizers.text = text
+finalizers.stripped = stripped
finalizers.lower = lower
finalizers.upper = upper
finalizers.ctxtext = ctxtext
@@ -1126,7 +1143,7 @@ end
--
local function verbatim(id,before,after)
- local root = get_id(id)
+ local root = getid(id)
if root then
if before then texsprint(ctxcatcodes,before,"[",root.tg or "?","]") end
lxml.toverbatim(xmltostring(root.dt))
@@ -1145,21 +1162,21 @@ lxml.verbatim = verbatim
-- helpers
function lxml.first(id,pattern)
- local collected = lxmlparseapply(id,pattern)
+ local collected = xmlapplylpath(getid(id),pattern)
if collected then
first(collected)
end
end
function lxml.last(id,pattern)
- local collected = lxmlparseapply(id,pattern)
+ local collected = xmlapplylpath(getid(id),pattern)
if collected then
last(collected)
end
end
function lxml.all(id,pattern)
- local collected = lxmlparseapply(id,pattern)
+ local collected = xmlapplylpath(getid(id),pattern)
if collected then
all(collected)
end
@@ -1167,18 +1184,18 @@ end
function lxml.count(id,pattern)
-- always needs to produce a result so no test here
- count(lxmlparseapply(id,pattern))
+ count(xmlapplylpath(getid(id),pattern))
end
function lxml.attribute(id,pattern,a,default)
- local collected = lxmlparseapply(id,pattern)
+ local collected = xmlapplylpath(getid(id),pattern)
if collected then
attribute(collected,a,default)
end
end
function lxml.raw(id,pattern) -- the content, untouched by commands
- local collected = (pattern and lxmlparseapply(id,pattern)) or get_id(id)
+ local collected = (pattern and xmlapplylpath(getid(id),pattern)) or getid(id)
if collected then
texsprint(xmltostring(collected[1].dt))
end
@@ -1186,11 +1203,11 @@ end
function lxml.context(id,pattern) -- the content, untouched by commands
if not pattern then
- local collected = get_id(id)
+ local collected = getid(id)
-- texsprint(ctxcatcodes,collected.dt[1])
ctx_text(collected.dt[1])
else
- local collected = lxmlparseapply(id,pattern) or get_id(id)
+ local collected = xmlapplylpath(getid(id),pattern) or getid(id)
if collected and #collected > 0 then
texsprint(ctxcatcodes,collected[1].dt)
end
@@ -1198,7 +1215,7 @@ function lxml.context(id,pattern) -- the content, untouched by commands
end
function lxml.text(id,pattern)
- local collected = (pattern and lxmlparseapply(id,pattern)) or get_id(id)
+ local collected = (pattern and xmlapplylpath(getid(id),pattern)) or getid(id)
if collected then
text(collected)
end
@@ -1207,40 +1224,40 @@ end
lxml.content = text
function lxml.position(id,pattern,n)
- local collected = lxmlparseapply(id,pattern)
+ local collected = xmlapplylpath(getid(id),pattern)
if collected then
position(collected,n)
end
end
function lxml.chainattribute(id,pattern,a,default)
- local collected = lxmlparseapply(id,pattern)
+ local collected = xmlapplylpath(getid(id),pattern)
if collected then
chainattribute(collected,a,default)
end
end
function lxml.concatrange(id,pattern,start,stop,separator,lastseparator,textonly) -- test this on mml
- concatrange(lxmlparseapply(id,pattern),start,stop,separator,lastseparator,textonly)
+ concatrange(xmlapplylpath(getid(id),pattern),start,stop,separator,lastseparator,textonly)
end
function lxml.concat(id,pattern,separator,lastseparator,textonly)
- concatrange(lxmlparseapply(id,pattern),false,false,separator,lastseparator,textonly)
+ concatrange(xmlapplylpath(getid(id),pattern),false,false,separator,lastseparator,textonly)
end
function lxml.element(id,n)
- position(lxmlparseapply(id,"/*"),n)
+ position(xmlapplylpath(getid(id),"/*"),n)
end
lxml.index = lxml.position
function lxml.pos(id)
- local root = get_id(id)
+ local root = getid(id)
texwrite((root and root.ni) or 0)
end
function lxml.att(id,a,default)
- local root = get_id(id)
+ local root = getid(id)
if root then
local at = root.at
local str = (at and at[a]) or default
@@ -1253,7 +1270,7 @@ function lxml.att(id,a,default)
end
function lxml.name(id) -- or remapped name? -> lxml.info, combine
- local r = get_id(id)
+ local r = getid(id)
local ns = r.rn or r.ns or ""
if ns ~= "" then
texsprint(ns,":",r.tg)
@@ -1263,20 +1280,20 @@ function lxml.name(id) -- or remapped name? -> lxml.info, combine
end
function lxml.match(id) -- or remapped name? -> lxml.info, combine
- texsprint(get_id(id).mi or 0)
+ texsprint(getid(id).mi or 0)
end
function lxml.tag(id) -- tag vs name -> also in l-xml tag->name
- texsprint(get_id(id).tg or "")
+ texsprint(getid(id).tg or "")
end
function lxml.namespace(id) -- or remapped name?
- local root = get_id(id)
+ local root = getid(id)
texsprint(root.rn or root.ns or "")
end
function lxml.flush(id)
- id = get_id(id)
+ id = getid(id)
local dt = id and id.dt
if dt then
xmlsprint(dt)
@@ -1284,7 +1301,7 @@ function lxml.flush(id)
end
function lxml.snippet(id,i)
- local e = get_id(id)
+ local e = getid(id)
if e then
local edt = e.dt
if edt then
@@ -1294,12 +1311,12 @@ function lxml.snippet(id,i)
end
function lxml.direct(id)
- xmlsprint(get_id(id))
+ xmlsprint(getid(id))
end
function lxml.command(id,pattern,cmd)
- local i, p = get_id(id,true)
- local collected = lxmlparseapply(i,pattern)
+ local i, p = getid(id,true)
+ local collected = xmlapplylpath(getid(i),pattern)
if collected then
local rootname = p or i.name
for c=1,#collected do
@@ -1317,11 +1334,11 @@ end
-- loops
function lxml.collected(id,pattern,reverse)
- return xmlcollected(get_id(id),pattern,reverse)
+ return xmlcollected(getid(id),pattern,reverse)
end
function lxml.elements(id,pattern,reverse)
- return xmlelements(get_id(id),pattern,reverse)
+ return xmlelements(getid(id),pattern,reverse)
end
-- obscure ones
@@ -1334,16 +1351,16 @@ local found, empty = xml.found, xml.empty
local doif, doifnot, doifelse = commands.doif, commands.doifnot, commands.doifelse
-function lxml.doif (id,pattern) doif (found(get_id(id),pattern)) end
-function lxml.doifnot (id,pattern) doifnot (found(get_id(id),pattern)) end
-function lxml.doifelse (id,pattern) doifelse(found(get_id(id),pattern)) end
-function lxml.doiftext (id,pattern) doif (not empty(get_id(id),pattern)) end
-function lxml.doifnottext (id,pattern) doifnot (not empty(get_id(id),pattern)) end
-function lxml.doifelsetext (id,pattern) doifelse(not empty(get_id(id),pattern)) end
+function lxml.doif (id,pattern) doif (found(getid(id),pattern)) end
+function lxml.doifnot (id,pattern) doifnot (found(getid(id),pattern)) end
+function lxml.doifelse (id,pattern) doifelse(found(getid(id),pattern)) end
+function lxml.doiftext (id,pattern) doif (not empty(getid(id),pattern)) end
+function lxml.doifnottext (id,pattern) doifnot (not empty(getid(id),pattern)) end
+function lxml.doifelsetext (id,pattern) doifelse(not empty(getid(id),pattern)) end
-- special case: "*" and "" -> self else lpath lookup
---~ function lxml.doifelseempty(id,pattern) doifelse(isempty(get_id(id),pattern ~= "" and pattern ~= nil)) end -- not yet done, pattern
+--~ function lxml.doifelseempty(id,pattern) doifelse(isempty(getid(id),pattern ~= "" and pattern ~= nil)) end -- not yet done, pattern
-- status info
@@ -1389,15 +1406,15 @@ end)
-- misc
function lxml.nonspace(id,pattern) -- slow, todo loop
- xmltprint(xmlcollect(get_id(id),pattern,true))
+ xmltprint(xmlcollect(getid(id),pattern,true))
end
function lxml.strip(id,pattern,nolines,anywhere)
- xml.strip(get_id(id),pattern,nolines,anywhere)
+ xml.strip(getid(id),pattern,nolines,anywhere)
end
function lxml.stripped(id,pattern,nolines)
- local str = xmltext(get_id(id),pattern) or ""
+ local str = xmltext(getid(id),pattern) or ""
str = gsub(str,"^%s*(.-)%s*$","%1")
if nolines then
str = gsub(str,"%s+"," ")
@@ -1406,5 +1423,55 @@ function lxml.stripped(id,pattern,nolines)
end
function lxml.delete(id,pattern)
- xml.delete(get_id(id),pattern)
+ xml.delete(getid(id),pattern)
+end
+
+lxml.obsolete = { }
+
+lxml.get_id = getid lxml.obsolete.get_id = getid
+
+-- goodies:
+
+function xml.finalizers.tex.lettered(collected)
+ if collected then
+ for c=1,#collected do
+ texsprint(ctxcatcodes,lettered(collected[1].dt[1]))
+ end
+ end
+end
+
+--~ function xml.finalizers.tex.apply(collected,what) -- to be tested
+--~ if collected then
+--~ for c=1,#collected do
+--~ texsprint(ctxcatcodes,what(collected[1].dt[1]))
+--~ end
+--~ end
+--~ end
+
+function lxml.toparameters(id)
+ local e = getid(id)
+ if e then
+ local a = e.at
+ if a and next(a) then
+ local setups, s = { }, 0
+ for k, v in next, a do
+ s = s + 1
+ setups[s] = k .. "=" .. v
+ end
+ setups = concat(setups,",")
+ -- tracing
+ context(setups)
+ end
+ end
+end
+
+local template = '<?xml version="1.0" ?>\n\n<!-- %s -->\n\n%s'
+
+function lxml.tofile(id,pattern,filename,comment)
+ local collected = xmlapplylpath(getid(id),pattern)
+ if collected then
+ io.savedata(filename,format(template,comment or "exported fragment",tostring(collected[1])))
+ else
+ os.remove(filename) -- get rid of old content
+ end
end
diff --git a/Master/texmf-dist/tex/context/base/lxml-xml.lua b/Master/texmf-dist/tex/context/base/lxml-xml.lua
index f791ec0f83f..89fcba871bd 100644
--- a/Master/texmf-dist/tex/context/base/lxml-xml.lua
+++ b/Master/texmf-dist/tex/context/base/lxml-xml.lua
@@ -6,10 +6,15 @@ if not modules then modules = { } end modules ['lxml-xml'] = {
license = "see context related readme files"
}
+local concat = string.concat
+
+local xml = xml
+
local finalizers = xml.finalizers.xml
local xmlfilter = xml.filter -- we could inline this one for speed
local xmltostring = xml.tostring
local xmlserialize = xml.serialize
+local xmlcollected = xml.collected
local function first(collected) -- wrong ?
return collected and collected[1]
@@ -23,15 +28,18 @@ local function all(collected)
return collected
end
-local function reverse(collected)
- if collected then
- local reversed = { }
- for c=#collected,1,-1 do
- reversed[#reversed+1] = collected[c]
- end
- return reversed
- end
-end
+--~ local function reverse(collected)
+--~ if collected then
+--~ local reversed, r = { }, 0
+--~ for c=#collected,1,-1 do
+--~ r = r + 1
+--~ reversed[r] = collected[c]
+--~ end
+--~ return reversed
+--~ end
+--~ end
+
+local reverse = table.reversed
local function attribute(collected,name)
if collected and #collected > 0 then
@@ -122,11 +130,12 @@ end
local function texts(collected)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
- local e = collection[c]
+ local e = collected[c]
if e and e.dt then
- t[#t+1] = e.dt
+ n = n + 1
+ t[n] = e.dt
end
end
return t
@@ -169,14 +178,15 @@ end
local function tags(collected,nonamespace)
if collected then
- local t = { }
+ local t, n = { }, 0
for c=1,#collected do
local e = collected[c]
local ns, tg = e.ns, e.tg
+ n = n + 1
if nonamespace or ns == "" then
- t[#t+1] = tg
+ t[n] = tg
else
- t[#t+1] = ns .. ":" .. tg
+ t[n] = ns .. ":" .. tg
end
end
return t
@@ -286,3 +296,37 @@ end
xml.all = xml.filter
xml.index = xml.position
xml.found = xml.filter
+
+-- a nice one:
+
+local function totable(x)
+ local t = { }
+ for e in xmlcollected(x[1] or x,"/*") do
+ t[e.tg] = xmltostring(e.dt) or ""
+ end
+ return next(t) and t or nil
+end
+
+xml.table = totable
+finalizers.table = totable
+
+local function textonly(e,t)
+ if e then
+ local edt = e.dt
+ if edt then
+ for i=1,#edt do
+ local e = edt[i]
+ if type(e) == "table" then
+ textonly(e,t)
+ else
+ t[#t+1] = e
+ end
+ end
+ end
+ end
+ return t
+end
+
+function xml.textonly(e) -- no pattern
+ return concat(textonly(e,{}))
+end
diff --git a/Master/texmf-dist/tex/context/base/m-arabtex.tex b/Master/texmf-dist/tex/context/base/m-arabtex.mkii
index 61e56e93aca..61e56e93aca 100644
--- a/Master/texmf-dist/tex/context/base/m-arabtex.tex
+++ b/Master/texmf-dist/tex/context/base/m-arabtex.mkii
diff --git a/Master/texmf-dist/tex/context/base/m-barcodes.mkiv b/Master/texmf-dist/tex/context/base/m-barcodes.mkiv
index b0eae148558..b6a54089f4f 100644
--- a/Master/texmf-dist/tex/context/base/m-barcodes.mkiv
+++ b/Master/texmf-dist/tex/context/base/m-barcodes.mkiv
@@ -1,5 +1,5 @@
%D \module
-%D [ file=m-pstricks,
+%D [ file=m-barcodes,
%D version=2010.03.14,
%D title=\CONTEXT\ Extra Modules,
%D subtitle=Barcodes,
@@ -35,7 +35,7 @@
% \definefont[barcodefont][file:texgyreheros-regular]
\startluacode
-plugins.barcodes = { }
+moduledata.barcodes = { }
local function split(code)
local t = { string.byte(code,1,#code) }
@@ -53,7 +53,7 @@ local function split(code)
end
end
-function plugins.barcodes.isbn_1(original)
+function moduledata.barcodes.isbn_1(original)
local code = string.gsub(original,"%-","")
local t, s, m, c = split(code)
if t then
@@ -68,7 +68,7 @@ function plugins.barcodes.isbn_1(original)
tex.sprint(code)
end
-function plugins.barcodes.isbn_2(original)
+function moduledata.barcodes.isbn_2(original)
local code = string.gsub(original,"%-","")
local t, s, m, c = split(code)
if t and #t == 12 then
@@ -85,13 +85,13 @@ end
\vbox {
\hbox {
\hskip3.7mm
- \scale[width=34mm]{\barcodefont ISBN \ctxlua{plugins.barcodes.isbn_2("\getvariable{barcode}{code}")}}
+ \scale[width=34mm]{\barcodefont ISBN \ctxlua{moduledata.barcodes.isbn_2("\getvariable{barcode}{code}")}}
}
\par
\normalexpanded { \noexpand \setPSTRICKS {
\noexpand \pspicture(-4mm,-1mm)(38mm,26mm)
\noexpand \psbarcode {
- \ctxlua{plugins.barcodes.isbn_1("\getvariable{barcode}{code}")}
+ \ctxlua{moduledata.barcodes.isbn_1("\getvariable{barcode}{code}")}
} {
includetext guardwhitespace
} {
@@ -111,12 +111,12 @@ end
\egroup}
% \usemodule[barcodes]
-%
-% \starttext
-% \startTEXpage
-% \barcode[type=isbn,code=978-94-90688-01-1]
-% \stopTEXpage
-% \stoptext
-\endinput
+\doifnotmode{demo}{\endinput}
+
+\starttext
+ \startTEXpage
+ \barcode[type=isbn,code=978-94-90688-01-1]
+ \stopTEXpage
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/m-chart.mkii b/Master/texmf-dist/tex/context/base/m-chart.mkii
index 2554fa2d4b7..bddd435efb5 100644
--- a/Master/texmf-dist/tex/context/base/m-chart.mkii
+++ b/Master/texmf-dist/tex/context/base/m-chart.mkii
@@ -11,10 +11,1277 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D The \XML\ interface:
+% todo: \localpushmacro/\localpopmacro (dohandleflowchart etc)
+% todo: make mkiv variant
+% todo: use dimexpr/numspr
+
+% will be redone with layers and dimexpr or even better, by just using
+% textext .. a nice example of old code
+
+%D This is an experimental module. Pieces of code will be moved
+%D to other modules. More features are possible but will be
+%D interfaces later.
+%D
+%D When finished this module will be documented. The main macro
+%D is still a rather big one and there is some redundant and
+%D slow code that needs a clean up.
+
+% arrow, dash
+% crossing
+% \goto -> \normalgoto
+% class -> class:name (ref prefix)
+% c, automatisch geen overlap zoeken
+% eind eerder chart connecties
+% relateren aan korps
+% check op bestaan naam, bestaan shape
+% auto als extern figuur
+% subchart
+% pijlen
+% focus
+% ook nog \MPmessage
+% areapath -> krappe vlak
+% clippath -> gehele vlak
+%
+% offset : clip offset
+% breedte : breedte cel
+% hoogte : hoogte cel
+% dx : halve afstand in breedte (grid breedte = breedte + 2dx)
+% dy : halve afstand in hoogte (grid hoogte = hoogte + 2dy)
+% x : x offset (clipping)
+% y : y offset (clipping)
+% nx : minimaal aantal cellen horizontaal
+% ny : minimaal aantal cellen vertikaal
+%
+% shape none en geen equivalent maken
+%
+% kaderkleur achtergrondkleur
+% lijnkleur lijndikte
+% focus focuskaderkleur focusachtergrondkleur
+% richting
+%
+% focus koppelen aan kleur
\unprotect
+\definesorting [flowchart] [flowcharts] [\v!none] % no access
+\setupsorting [flowchart] [\c!state=\v!stop] % off by default
+
+\def\@FLOW@{@FLOW@}
+\def\@FLOC@{@FLOC@}
+\def\@FLOX@{@FLOX@}
+
+\def\@@FLOW{@@FLOW}
+\def\@@FLOL{@@FLOL}
+\def\@@FLOS{@@FLOS}
+\def\@@FLOF{@@FLOF}
+\def\@@FLOT{@@FLOT}
+\def\@@FLOX{@@FLOX}
+
+\def\@@MPx {@@MPx}
+\def\@@MPy {@@MPy}
+
+\def\FLOWbufferprefix{flw-}
+
+\def\processFLOWbuffer#1{\getbuffer[\FLOWbufferprefix#1]}
+\def\typeFLOWbuffer #1{\typebuffer[\FLOWbufferprefix#1]}
+
+\def\setFLOWname#1#2% funny hack that makes sure that we get
+ {\bgroup % names that are acceptable for METAPOST
+ \lccode`0=`a\lccode`1=`b\lccode`2=`c\lccode`3=`d\lccode`4=`e%
+ \lccode`5=`f\lccode`6=`g\lccode`7=`h\lccode`8=`i\lccode`9=`j%
+ \lccode` =`\_\lccode`-=`\_\lccode`_=`\_%
+ \lowercase{\gdef#1{#2}}%
+ \egroup}
+
+% een gobble als default is sneller, en dan alleen setten als
+% nodig
+
+\def\resetFLOWcell
+ {% variables
+ \global\let\FLOWname \empty
+ \global\let\FLOWalign \empty
+ \global\let\FLOWshape \empty
+ \global\let\FLOWlocation \empty
+ \global\let\FLOWtext \empty
+ \global\let\FLOWhelp \empty
+ \global\let\FLOWdestination\empty
+ \global\let\FLOWoverlay \empty
+ \global\let\FLOWfocus \empty
+ \global\let\tFLOWlabel \empty
+ \global\let\bFLOWlabel \empty
+ \global\let\lFLOWlabel \empty
+ \global\let\rFLOWlabel \empty
+ \global\let\bcFLOWlabel \empty
+ \global\let\tcFLOWlabel \empty
+ \global\let\lcFLOWlabel \empty
+ \global\let\rcFLOWlabel \empty
+ \global\let\tFLOWexit \empty
+ \global\let\bFLOWexit \empty
+ \global\let\lFLOWexit \empty
+ \global\let\rFLOWexit \empty
+ % commands
+ \let\name \doFLOWname
+ \let\shape \doFLOWshape
+ \let\destination\doFLOWdestination
+ \let\location \doFLOWlocation
+ \let\focus \doFLOWfocus
+ \let\overlay \doFLOWoverlay
+ \let\figure \doFLOWfigure
+ \let\text \doFLOWtext
+ \let\comment \doFLOWcomment
+ \let\label \doFLOWlabel
+ \let\help \doFLOWhelp
+ \let\connection \doFLOWconnection
+ \let\exit \doFLOWexit
+ % convenience commands
+ \let\locate \doFLOWlocate
+ \let\connect \doFLOWconnect}
+
+\let\FLOWcell \s!unknown
+\let\FLOWshape \s!unknown
+\let\FLOWdestination\s!unknown
+\let\FLOWfocus \s!unknown
+\let\FLOWoverlay \empty
+\let\FLOWtext \empty
+
+\def\doFLOWname#1%
+ {\def\FLOWcell{#1}\setFLOWname\FLOWname{name_#1}\ignorespaces}
+
+\def\doFLOWshape#1%
+ {\gdef\FLOWshape{#1}\ignorespaces}
+
+\def\doFLOWdestination#1%
+ {\gdef\FLOWdestination{#1}\ignorespaces}
+
+\def\doFLOWlocation#1%
+ {\setFLOWlocation#1\end\ignorespaces}
+
+\def\doFLOWfocus#1%
+ {\gdef\FLOWfocus{#1}\ignorespaces}
+
+\def\doFLOWoverlay#1%
+ {\gdef\FLOWoverlay{#1}\ignorespaces}
+
+\def\doFLOWfigure#1%
+ {\defineoverlay[\s!dummy][\overlayfigure{#1}]%
+ \overlay\s!dummy}
+
+\def\doFLOWtext
+ {\dosingleempty\dodoFLOWtext}
+
+\def\dodoFLOWtext[#1]% % #2%
+ {\gdef\FLOWalign{#1}\gdef\FLOWtext}% {#2}}
+
+\def\doFLOWcomment[#1]#2%
+ {\ignorespaces\dogobblesingleempty}
+
+\def\doFLOWlabel[#1]#2% wordt dit gebruikt ?
+ {\setgvalue{#1FLOWlabel}{#2}\ignorespaces}
+
+\def\doFLOWhelp#1%
+ {\gdef\FLOWhelp{#1}\ignorespaces}
+
+\def\doFLOWconnection
+ {\dodoubleempty\dodoFLOWconnection}
+
+\def\dodoFLOWconnection[#1][#2]#3%
+ {\ignorespaces}
+
+\def\doFLOWconnect
+ {\connection}
+
+\def\doFLOWlocate
+ {\location}
+
+\def\doFLOWexit[#1]#2%
+ {\setgvalue{#1FLOWexit}{#2}\ignorespaces}
+
+\def\startFLOWchart
+ {\bgroup
+ \let\stopFLOWchart\egroup
+ \obeylines % lelijk, buffers nog eens fatsoeneren
+ \dodoubleempty\dostartFLOWchart}
+
+\def\dostartFLOWchart[#1][#2]%
+ {\preparenextFLOWchart{#1}{#2}%
+ \dostartbuffer[\FLOWbufferprefix\nofFLOWcharts][startFLOWchart][stopFLOWchart]}
+
+\def\defineFLOWchart%
+ {\dodoubleempty\dodefineFLOWchart}
+
+\long\def\dodefineFLOWchart[#1][#2]#3%
+ {\preparenextFLOWchart{#1}{#2}%
+ \setbuffer[\FLOWbufferprefix\nofFLOWcharts]#3\endbuffer}
+
+\def\preparenextFLOWchart#1#2%
+ {\doglobal\increment\nofFLOWcharts
+ \flowchart{#1}%
+ \setxvalue{\@FLOW@-#1}{\noexpand\dohandleflowchart[\nofFLOWcharts][#2]}}
+
+\def\setupFLOWcharts{\dodoubleargument\getparameters[\@@FLOW]}
+\def\setupFLOWlines {\dodoubleargument\getparameters[\@@FLOL]}
+\def\setupFLOWshapes{\dodoubleargument\getparameters[\@@FLOS]}
+\def\setupFLOWfocus {\dodoubleargument\getparameters[\@@FLOF]}
+\def\setupFLOWsets {\dodoubleargument\getparameters[\@@FLOX]}
+
+\setupFLOWcharts
+ [\c!option=,
+ \c!bodyfont=,
+ \c!dot=, % private option
+ \c!width=12\bodyfontsize,
+ \c!height=7\bodyfontsize,
+ \c!maxwidth=,
+ \c!maxheight=,
+ \c!offset=\v!standard, % == auto offset
+ \c!dx=2\bodyfontsize,
+ \c!dy=2\bodyfontsize,
+ \c!nx=0, % 1,
+ \c!ny=0, % 1,
+ \c!x=1,
+ \c!y=1,
+ \c!autofocus=,
+ \c!focus=,
+ \c!background=, % \v!color,
+ \c!backgroundcolor=\s!white,
+ \c!rulethickness=\linewidth,
+ \c!frame=\v!off,
+ \c!framecolor=]
+
+\setupFLOWlines
+ [\c!corner=\v!round,
+ \c!arrow=\v!yes,
+ \c!dash=\v!no,
+ \c!radius=.375\bodyfontsize, % 2.5\c!rulethickness
+ \c!color=FLOWlinecolor,
+ \c!rulethickness=.15\bodyfontsize, % 2pt,
+ \c!offset=\v!none]
+
+\setupFLOWshapes
+ [\c!default=action,
+ \c!framecolor=FLOWframecolor,
+ \c!background=\v!color,
+ \c!backgroundcolor=FLOWbackgroundcolor,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!rulethickness=.15\bodyfontsize, % 2pt,
+ \c!offset=.5\bodyfontsize]
+
+\setupFLOWfocus
+ [\c!framecolor=FLOWfocuscolor,
+ \c!background=\@@FLOSbackground,
+ \c!backgroundcolor=\@@FLOSbackgroundcolor,
+ \c!backgroundscreen=\@@FLOSbackgroundscreen,
+ \c!rulethickness=\@@FLOSrulethickness,
+ \c!offset=\@@FLOSoffset]
+
+\definecolor [FLOWfocuscolor] [s=.2]
+\definecolor [FLOWlinecolor] [s=.5]
+\definecolor [FLOWframecolor] [s=.7]
+\definecolor [FLOWbackgroundcolor] [s=.9]
+
+\newcounter\includeFLOWx
+\newcounter\includeFLOWy
+
+\def\includeFLOWchart
+ {\dodoubleempty\doincludeFLOWchart}
+
+\def\doincludeFLOWchart[#1][#2]%
+ {\pushmacro\includeFLOWx
+ \pushmacro\includeFLOWy
+ \getparameters[FLOWi][x=1,y=1,#2]%
+ \increment(\includeFLOWx,0\FLOWix)\decrement\includeFLOWx
+ \increment(\includeFLOWy,0\FLOWiy)\decrement\includeFLOWy
+ \def\dodoincludeFLOWchart##1%
+ {\doifdefined{\@FLOW@-##1}
+ {\globalpushmacro\dohandleflowchart % was local
+ \gdef\dohandleflowchart[####1][####2]%
+ {\globalpopmacro\dohandleflowchart % was local
+ \resetFLOWlocation
+ \processFLOWbuffer{####1}}%
+ \getvalue{\@FLOW@-##1}}}%
+ \processcommalist[#1]\dodoincludeFLOWchart
+ \popmacro\includeFLOWx
+ \popmacro\includeFLOWy}
+
+\def\resetFLOWlocation
+ {\globallet\lastFLOWx\!!zerocount
+ \globallet\lastFLOWy\!!zerocount}
+
+\def\dosetFLOWlocation[#1#2]#3#4%
+ {\processaction
+ [#1#2]
+ [ +=>\scratchcounter\numexpr#4+ 1+#3\relax,
+ -=>\scratchcounter\numexpr#4- 1+#3\relax,
+ +#2=>\scratchcounter\numexpr#4+#2+#3\relax,
+ -#2=>\scratchcounter\numexpr#4-#2+#3\relax,
+ \s!default=>\scratchcounter\numexpr#4 +#3\relax,
+ \s!unknown=>\scratchcounter\numexpr0#1#2+#3\relax]%
+ \xdef#4{\the\scratchcounter}}
+
+\def\setFLOWlocation#1,#2\end
+ {\dosetFLOWlocation[#1\empty]\includeFLOWx\lastFLOWx
+ \dosetFLOWlocation[#2\empty]\includeFLOWy\lastFLOWy
+ \xdef\FLOWlocation{\lastFLOWx,\lastFLOWy}}
+
+\def\FLOWshapes
+ {node, action, procedure, product, decision, archive,
+ loop, wait, subprocedure, singledocument, multidocument,
+ sub procedure, single document, multi document, up, down,
+ left, right}
+
+\def\FLOWlines
+ {up, down, left, right}
+
+\def\FLOWsetconnect#1%
+ {\donefalse
+ \let\cFLOWfrom\empty
+ \let\cFLOWto\empty
+ \let\zFLOWfrom\!!zerocount
+ \let\zFLOWto\!!zerocount
+ \handletokens#1\with\doFLOWsetconnect
+ \ifx\cFLOWto\empty\let\cFLOWfrom\empty\fi}
+
+\def\doFLOWsetconnect#1%
+ {\ifx #1p%
+ \ifdone\def\zFLOWto{+1}\else\def\zFLOWfrom{+1}\fi
+ \else\ifx#1+%
+ \ifdone\def\zFLOWto{+1}\else\def\zFLOWfrom{+1}\fi
+ \else\ifx#1n%
+ \ifdone\def\zFLOWto{-1}\else\def\zFLOWfrom{-1}\fi
+ \else\ifx#1-%
+ \ifdone\def\zFLOWto{-1}\else\def\zFLOWfrom{-1}\fi
+ \else\ifdone
+ \edef\cFLOWto{\FLOWconnector#1}%
+ \else
+ \edef\cFLOWfrom{\FLOWconnector#1}%
+ \donetrue
+ \fi\fi\fi\fi\fi}
+
+\def\FLOWconnector#1%
+ {\if#1bbottom\else\if#1ttop\else\if#1lleft\else\if#1rright\fi\fi\fi\fi}
+
+\newif\ifFLOWscaling \FLOWscalingtrue
+
+\def\@@FLOW@@offset{\@@FLOWoffset}
+
+\def\getFLOWchart
+ {\dodoubleempty\dogetFLOWchart}
+
+\def\dogetFLOWchart[#1][#2]%
+ {\doifundefinedelse{\@FLOW@-#1}
+ {\writestatus{FLOW}{unknown chart #1}%
+ \framed
+ [\c!width=12\bodyfontsize,\c!height=8\bodyfontsize]
+ {\tttf [chart #1]}}
+ {\dodogetFLOWchart[#1][#2]}}
+
+\def\dodogetFLOWchart[#1][#2]% to be split a bit more
+ {\vbox\bgroup
+ \insidefloattrue
+ \forgetall
+ \dontcomplain
+ % \offinterlineskip % we now explicitly use \nointerlineskip later on
+ \def\dohandleflowchart[##1][##2]%
+ {\def\currentFLOWnumber{##1}%
+ \getparameters[\@@FLOW][##2]}%
+ \getvalue{\@FLOW@-#1}%
+ \getparameters[\@@FLOW][#2]% dubbelop ?
+ \doifsomething{\@@FLOWautofocus}
+ {\checkFLOWautofocus}%
+ %\message{AUTOSHAPE 3: (\@@FLOWx,\@@FLOWy)->(\@@FLOWnx,\@@FLOWny)}\wait
+ \global\let\FLOWwidth \@@FLOWnx
+ \global\let\FLOWheight\@@FLOWny
+ \let\startFLOWcell\startFLOWcellA
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+ \ifcase\@@FLOWnx\relax \let\@@FLOWnx\FLOWwidth \fi
+ \ifcase\@@FLOWny\relax \let\@@FLOWny\FLOWheight \fi
+ \doifnothing{\@@FLOWmaxwidth\@@FLOWmaxheight}{\FLOWscalingfalse}%
+ \ifFLOWscaling
+ \doifnothing{\@@FLOWmaxwidth }{\let\@@FLOWmaxwidth \maxdimen}%
+ \doifnothing{\@@FLOWmaxheight}{\let\@@FLOWmaxheight\maxdimen}%
+ \scratchcounter\bodyfontpoints
+ \doloop % NOG FONTSWITCH OM EX EN EM TE LATEN WERKEN
+ {\ifnum\scratchcounter>1 % NU DIMENSIONS IN TERMS OF BODYFONTSIZE
+ \bodyfontsize=\the\scratchcounter pt
+ \dimen0=\@@FLOWmaxwidth
+ \dimen2=\@@FLOWwidth
+ \dimen4=\@@FLOWdx
+ \advance\dimen2 2\dimen4
+ \dimen2=\@@FLOWnx\dimen2
+ \advance\dimen2 2\dimen4
+ \ifdim\dimen2>\dimen0
+ \advance\scratchcounter \minusone
+ \else
+ \dimen0=\@@FLOWmaxheight
+ \dimen2=\@@FLOWheight
+ \dimen4=\@@FLOWdy
+ \advance\dimen2 2\dimen4
+ \dimen2=\@@FLOWny\dimen2
+ \advance\dimen2 2\dimen4
+ \ifdim\dimen2>\dimen0
+ \advance\scratchcounter \minusone
+ \else
+ \exitloop
+ \fi
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ \expanded{\switchtobodyfont[\the\scratchcounter pt]}%
+ \forgetall
+ % \offinterlineskip % needed ?
+ \else\ifx\@@FLOWbodyfont\empty\else
+ \expanded{\switchtobodyfont[\@@FLOWbodyfont]}% \expanded ?
+ \fi\fi
+ \global\let\FLOWcells\empty
+ \dimen0=\@@FLOWwidth
+ \edef\FLOWshapewidth{\the\dimen0}%
+ \dimen2=\@@FLOWdx
+ \advance\dimen0 2\dimen2
+ \edef\FLOWgridwidth{\the\dimen0}%
+ \dimen0=\@@FLOWheight
+ \edef\FLOWshapeheight{\the\dimen0}%
+ \dimen2=\@@FLOWdy
+ \advance\dimen0 2\dimen2
+ \edef\FLOWgridheight{\the\dimen0}%
+ \scratchdimen=\@@FLOSrulethickness
+ \edef\@@FLOSrulethickness{\the\scratchdimen}%
+ \scratchdimen=\@@FLOFrulethickness
+ \edef\@@FLOFrulethickness{\the\scratchdimen}%
+ \scratchdimen=\@@FLOLrulethickness
+ \edef\@@FLOLrulethickness{\the\scratchdimen}%
+ \ifdim\@@FLOLradius<2.5\scratchdimen
+ \scratchdimen=2.5\scratchdimen
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \ifdim\@@FLOLradius>\@@FLOWdx
+ \scratchdimen=\@@FLOWdx
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \fi
+ \ifdim\@@FLOLradius>\@@FLOWdy
+ \scratchdimen=\@@FLOWdy
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \fi
+ \else
+ \scratchdimen=\@@FLOLradius
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \fi
+ \processaction % magic 2.5
+ [\@@FLOWoffset]
+ [ \v!none=>\scratchdimen=-2.5\scratchdimen,
+ \v!overlay=>\scratchdimen=-2.5\scratchdimen,
+ \v!standard=>\scratchdimen=\scratchdimen,
+ \s!unknown=>\scratchdimen=\@@FLOWoffset,
+ \s!default=>\scratchdimen=-2.5\scratchdimen]%
+ \edef\@@FLOW@@offset{\the\scratchdimen}%
+ \forgetall
+ \offinterlineskip
+ \resetMPdrawing
+ \doglobal\newcounter\FLOWcomment
+ \startMPdrawing
+ if unknown context_char : input mp-char.mp ; fi ;
+ grid_width := \FLOWgridwidth ;
+ grid_height := \FLOWgridheight ;
+ shape_width := \FLOWshapewidth ;
+ shape_height := \FLOWshapeheight ;
+ connection_line_width := \@@FLOLrulethickness ;
+ connection_smooth_size := \@@FLOLradius ;
+ connection_arrow_size := \@@FLOLradius ;
+ connection_dash_size := \@@FLOLradius ;
+ currentpicture := nullpicture ;
+ begin_chart(0,\FLOWwidth,\FLOWheight);
+ reverse_y := true ;
+ chart_offset := \@@FLOW@@offset ;
+ \stopMPdrawing
+ \doifelsenothing\@@FLOWbackgroundcolor
+ {\startMPdrawing
+ chart_background_color := white ;
+ \stopMPdrawing}
+ {\startMPdrawing
+ chart_background_color := \MPcolor{\@@FLOWbackgroundcolor} ;
+ \stopMPdrawing}%
+ \doif\@@FLOWoption\v!test
+ {\startMPdrawing
+ show_con_points := true ;
+ show_mid_points := true ;
+ show_all_points := true ;
+ \stopMPdrawing}%
+ \processaction % private
+ [\@@FLOWdot]
+ [ \v!yes=>\startMPdrawing
+ show_con_points := true ;
+ show_mid_points := true ;
+ show_all_points := true ;
+ \stopMPdrawing,
+ \s!unknown=>\startMPdrawing
+ show_\@@FLOWdot_points := true ;
+ \stopMPdrawing]%
+\doglobal\newcounter\FLOWcomment
+ \let\startFLOWcell\startFLOWcellB
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+\doglobal\newcounter\FLOWcomment
+ \let\startFLOWcell\startFLOWcellC
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+ \startMPdrawing
+ clip_chart(\@@FLOWx,\@@FLOWy,\@@FLOWnx,\@@FLOWny) ;
+ end_chart ;
+ \stopMPdrawing
+ \MPdrawingdonetrue
+ \setbox0\hbox
+ {\MPstaticgraphictrue
+ \MPshiftdrawingfalse
+ \getMPdrawing}%
+ \def\MPmessage##1%
+ {\writestatus{MP charts}{##1}}%
+ \def\MPposition##1##2##3%
+ {\setvalue{\@@MPx##1}{##2}\setvalue{\@@MPy##1}{##3}}%
+ \def\MPclippath##1##2##3##4%
+ {\def\clipMPllx{##1bp}\def\clipMPlly{##2bp}%
+ \def\clipMPurx{##3bp}\def\clipMPury{##4bp}}%
+ \def\MPareapath##1##2##3##4%
+ {\def\areaMPllx{##1bp}\def\areaMPlly{##2bp}%
+ \def\areaMPurx{##3bp}\def\areaMPury{##4bp}}%
+ \getMPdata
+ \doglobal\newcounter\FLOWcomment
+ \let\startFLOWcell\startFLOWcellD
+ \setbox2\vbox to \ht0
+ {\forgetall % \offinterlineskip
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber\vss}%
+ \setbox2\hbox
+ {\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box2}%
+ \wd2\wd0\ht2\ht0\dp2\dp0
+ \let\startFLOWcell\startFLOWcellE
+ \setbox4\vbox to \ht0
+ {\forgetall % \offinterlineskip
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber\vss}%
+ \setbox4\hbox
+ {\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box4}%
+ \wd4\wd0\ht4\ht0\dp4\dp0
+ \doifelse\@@FLOWoption\v!test
+ {\setbox6\vbox
+ {\forgetall
+ \vskip\@@FLOW@@offset
+ \hskip\@@FLOW@@offset
+ \basegrid
+ [\c!x=\@@FLOWx,\c!nx=\@@FLOWnx,\c!dx=\withoutpt\FLOWgridwidth,
+ \c!y=\@@FLOWy,\c!ny=\@@FLOWny,\c!dy=\withoutpt\FLOWgridheight,
+ \c!xstep=1,\c!ystep=1,
+ \c!unit=pt,\c!location=\v!middle]}%
+ \wd6\wd0\ht6\ht0\dp6\dp0
+ \setbox8\vbox
+ {\forgetall
+ \offinterlineskip
+ \vskip\@@FLOW@@offset
+ \dostepwiserecurse\@@FLOWy\@@FLOWny\plusone
+ {\vbox to \FLOWgridheight
+ {\vfill
+ \hskip\@@FLOW@@offset
+ \hbox
+ {\dostepwiserecurse\@@FLOWx\@@FLOWnx\plusone
+ {\hbox to \FLOWgridwidth
+ {\hfill
+ \framed
+ [\c!framecolor=red,
+ \c!width=\FLOWshapewidth,
+ \c!height=\FLOWshapeheight]
+ {}%
+ \hfill}}}
+ \vfill}}}%
+ \wd8\wd0\ht8\ht0\dp8\dp0
+ \framed
+ [\c!offset=\v!overlay,\c!framecolor=green]
+ {\hbox{\box4\hskip-\wd0\box0\hskip-\wd2\box2\hskip-\wd6\box6\hskip-\wd8\box8}}}
+ {\framed
+ [\c!offset=\v!overlay,
+ \c!frame=\@@FLOWframe,
+ \c!rulethickness=\@@FLOWrulethickness,
+ \c!framecolor=\@@FLOWframecolor,
+ \c!background=\@@FLOWbackground,
+ \c!backgroundcolor=\@@FLOWbackgroundcolor]
+ {\hbox{\box4\hskip-\wd0\box0\hskip-\wd2\box2}}}%
+ %\message{[\FLOWcells]}\wait
+ \egroup}
+
+% Pass A
+
+\long\def\startFLOWcellA#1\stopFLOWcell%
+ {\resetFLOWcell
+ \ignorespaces#1\unskip
+ \expandafter\getFLOWlocationA\FLOWlocation\end
+ \ignorespaces}
+
+\def\getFLOWlocationA#1,#2\end
+ {\ifnum0#1>\FLOWwidth \xdef\FLOWwidth {#1}\fi
+ \ifnum0#2>\FLOWheight\xdef\FLOWheight{#2}\fi}
+
+% Pass B
+%
+% beware: the - after \@FLOC@ is needed since name can be
+% empty and we don't want to redefine \@FLOC@ itself by
+% mistake
+
+\long\def\startFLOWcellB#1\stopFLOWcell
+ {\resetFLOWcell\ignorespaces#1\unskip
+ \setxvalue{\@FLOC@-\FLOWname}{\FLOWlocation}% kost veel cs's
+ \ifx\FLOWshape\empty
+ \global\let\FLOWshape\@@FLOSdefault
+ \fi
+ \doifnot\FLOWshape{none} % {\v!none}
+ {\ExpandBothAfter\doifinsetelse{\FLOWshape}{\FLOWshapes}
+ {\edef\FLOWshapetag{shape_\FLOWshape}% beter \expanded
+ \@EA\setFLOWname\@EA\FLOWshapetag\@EA{\FLOWshapetag}}
+ {\doifnumberelse\FLOWshape
+ {\let\FLOWshapetag\FLOWshape}
+ {\let\FLOWshapetag\empty}}%
+ \ifx\FLOWshapetag\empty \else
+ \ExpandBothAfter\doifinsetelse{\FLOWshape}{\FLOWlines}
+ {\chardef\FLOWstate0 }
+ {\ExpandBothAfter\doifcommonelse{\FLOWcell,\FLOWfocus}{\@@FLOWfocus}
+ {\chardef\FLOWstate1 }
+ {\chardef\FLOWstate2 }}%
+ \startMPdrawing
+ begin_sub_chart ;
+ \ifcase\FLOWstate
+ shape_line_color := \MPcolor{\@@FLOLcolor} ;
+ shape_fill_color := \MPcolor{\@@FLOLcolor} ;
+ shape_line_width := \@@FLOLrulethickness ;
+ \or
+ shape_line_color := \MPcolor{\@@FLOFframecolor} ;
+ shape_fill_color := \MPcolor{\@@FLOFbackgroundcolor} ;
+ shape_line_width := \@@FLOFrulethickness ;
+ \or
+ shape_line_color := \MPcolor{\@@FLOSframecolor} ;
+ shape_fill_color := \MPcolor{\@@FLOSbackgroundcolor} ;
+ shape_line_width := \@@FLOSrulethickness ;
+ \fi
+ %\ifx\FLOWoverlay\empty
+ % peepshape := false ;
+ %\else
+ % peepshape := true ;
+ %\fi
+ peepshape := \ifx\FLOWoverlay\empty false \else true \fi ;
+ new_shape(\FLOWlocation,\FLOWshapetag) ;
+ end_sub_chart ;
+ \stopMPdrawing
+ \fi}%
+ \ignorespaces}
+
+% Pass C
+
+\long\def\startFLOWcellC#1\stopFLOWcell%
+ {\resetFLOWcell
+\pushmacro\lastFLOWx
+\pushmacro\lastFLOWy
+ \ignorespaces#1\unskip % makes sure that vars are set
+\popmacro\lastFLOWy
+\popmacro\lastFLOWx
+ \let\connection\doFLOWconnectionC
+ \ignorespaces#1\unskip}
+
+\def\FLOWorigin{0,0}
+
+\def\doFLOWdisplace[#1,#2,#3]% experiment
+ {dsp_x := #1 ; dsp_y := #2 ;}
+
+\def\doFLOWconnectionC
+ {\dodoubleempty\dodoFLOWconnectionC}
+
+\def\dodoFLOWconnectionC[#1][#2]#3%
+ {\doglobal\increment\FLOWcomment
+ \setFLOWname\otherFLOWname{name_#3}%
+ \doifdefinedelse{\@FLOC@-\FLOWname}
+ {\edef\FLOWfrom{\getvalue{\@FLOC@-\FLOWname}}}
+ {\let \FLOWfrom \FLOWorigin}%
+ \ifx\FLOWfrom\FLOWorigin \else
+ \doifdefinedelse{\@FLOC@-\otherFLOWname}
+ {\edef\FLOWto {\getvalue{\@FLOC@-\otherFLOWname}}}
+ {\let \FLOWto \FLOWorigin}%
+ \ifx\FLOWto\FLOWorigin \else
+ \FLOWsetconnect{#1}%
+ \ifx\cFLOWfrom\empty \else
+ \doifelse\@@FLOLcorner\v!round
+ {\startMPdrawing smooth := true ; \stopMPdrawing}
+ {\startMPdrawing smooth := false ; \stopMPdrawing}%
+ \doifelse\@@FLOLdash\v!yes
+ {\startMPdrawing dashline := true ; \stopMPdrawing}
+ {\startMPdrawing dashline := false ; \stopMPdrawing}%
+ \doifelse\@@FLOLarrow\v!yes
+ {\startMPdrawing arrowtip := true ; \stopMPdrawing}
+ {\startMPdrawing arrowtip := false ; \stopMPdrawing}%
+ \doifelse\@@FLOLoffset\v!none
+ {\startMPdrawing touchshape := true ; \stopMPdrawing}
+ {\startMPdrawing touchshape := false ; \stopMPdrawing}%
+%\doifsomething{#2}
+% {\startMPdrawing
+% \doFLOWdisplace[0#2,0,0]%
+% \stopMPdrawing}%
+ \startMPdrawing
+\doFLOWdisplace[0#2,0,0]%
+ connection_line_color := \MPcolor{\@@FLOLcolor} ;
+ connection_line_width := \@@FLOLrulethickness ;
+ connect_\cFLOWfrom_\cFLOWto (\FLOWfrom,\zFLOWfrom) (\FLOWto,\zFLOWto) ;
+\doFLOWdisplace[0,0,0]%
+ \stopMPdrawing
+ \fi
+ \fi
+ \fi
+ \ignorespaces}
+
+% Pass D
+
+\long\def\startFLOWcellD#1\stopFLOWcell
+ {\resetFLOWcell
+\pushmacro\lastFLOWx
+\pushmacro\lastFLOWy
+ \ignorespaces#1\unskip % presets vars
+\popmacro\lastFLOWy
+\popmacro\lastFLOWx
+ \let\doprocessFLOWcell\doprocessFLOWcellD
+ \expandafter\doprocessFLOWcellD\FLOWlocation\end
+ \let\connection\doFLOWconnectionD
+ \let\comment\doFLOWcommentD
+ \ignorespaces#1\unskip\ignorespaces}
+
+\def\doFLOWconnectionD
+ {\dodoubleempty\dodoFLOWconnectionD}
+
+\def\dodoFLOWconnectionD[#1][#2]#3%
+ {\doglobal\increment\FLOWcomment
+ \ignorespaces}
+
+\def\doFLOWcommentD[#1]#2%
+ {\bgroup
+ \let\FLOW \middlebox
+ \let\FLOWb \bottombox
+ \let\FLOWbl\bottomleftbox
+ \let\FLOWbr\bottomrightbox
+ \let\FLOWt \topbox
+ \let\FLOWtl\topleftbox
+ \let\FLOWtr\toprightbox
+ \let\FLOWl \leftbox
+ \let\FLOWlt\lefttopbox
+ \let\FLOWlb\leftbottombox
+ \let\FLOWr \rightbox
+ \let\FLOWrt\righttopbox
+ \let\FLOWrb\rightbottombox
+ \let\FLOWc \middlebox
+%\ifdefined{FLOW#1}%
+ \ifcase0\getvalue{\@@MPx\FLOWcomment}\getvalue{\@@MPy\FLOWcomment}\relax
+ \else
+ \ifdim\getvalue{\@@MPx\FLOWcomment}\s!bp<\areaMPllx\relax\else
+ \ifdim\getvalue{\@@MPx\FLOWcomment}\s!bp>\areaMPurx\relax\else
+ \ifdim\getvalue{\@@MPy\FLOWcomment}\s!bp<\areaMPlly\relax\else
+ \ifdim\getvalue{\@@MPy\FLOWcomment}\s!bp>\areaMPury\relax\else
+ \dimen0=\getvalue{\@@MPx\FLOWcomment}\s!bp
+ \advance\dimen0 -\@@FLOW@@offset
+ \advance\dimen0 -\clipMPllx
+ \dimen2=\clipMPury
+ \advance\dimen2 -\@@FLOW@@offset
+ \advance\dimen2 -\getvalue{\@@MPy\FLOWcomment}\s!bp
+ \setbox\scratchbox\hbox{\strut#2}%
+ \boxoffset.5\bodyfontsize
+ \setbox\scratchbox\hbox{\hskip\dimen0\lower\dimen2\getvalue{FLOW#1}{\box\scratchbox}}%
+ \smashbox\scratchbox
+ \box\scratchbox
+ \boxoffset\zeropoint
+ \nointerlineskip % really needed
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+%\fi
+ \egroup
+ \ignorespaces}
+
+% pass D
+
+\def\dophaseoneFLOWcellX#1#2%
+ {\!!counta#1\relax
+ \!!countb#2\relax
+ \!!countc\@@FLOWx
+ \!!countd\@@FLOWy
+ \advance\!!countc \@@FLOWnx
+ \advance\!!countd \@@FLOWny
+ \advance\!!countc \minusone
+ \advance\!!countd \minusone
+ \ifnum\!!counta<\@@FLOWx\relax \donefalse
+ \else\ifnum\!!counta>\!!countc \donefalse
+ \else\ifnum\!!countb<\@@FLOWy\relax \donefalse
+ \else\ifnum\!!countb>\!!countd \donefalse
+ \else \donetrue
+ \fi\fi\fi\fi}
+
+\def\dophasetwoFLOWcellX
+ {\advance\!!counta -\@@FLOWx
+ \advance\!!counta \plusone
+ \advance\!!countb -\@@FLOWy
+ \advance\!!countb \plusone
+ \dimen0=\FLOWgridwidth
+ \dimen0=\!!counta\dimen0
+ \advance\dimen0 -\FLOWgridwidth
+ \dimen4=\FLOWgridwidth
+ \advance\dimen4 -\FLOWshapewidth
+ \advance\dimen0 .5\dimen4
+ \dimen2=\FLOWgridheight
+ \dimen2=\!!countb\dimen2
+ \dimen4=\FLOWgridheight
+ \advance\dimen4 -\FLOWshapeheight
+ \advance\dimen2 -.5\dimen4
+ \edef\FLOWdx{\the\dimen0}%
+ \edef\FLOWdy{\the\dimen2}}
+
+\def\positionFLOWzero% assumes \FLOWdx and \FLOWdy are set
+ {\setbox0\hbox{\hskip\FLOWdx\lower\FLOWdy\box0}%
+ \smashbox0\box0
+ \nointerlineskip} % new, needed since we somehow reset that
+
+\def\doFLOWtlabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdy\fi
+ \setbox0\hbox{\hskip\dimen2\raise\scratchdimen
+ \hbox{\raise\dimen4\hbox{#1{\strut#3}}}}%
+ \positionFLOWzero}%
+
+\def\doFLOWblabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdy\fi
+ \setbox0\hbox{\hskip\dimen2\raise-\scratchdimen
+ \hbox{#1{\strut#3}}}%
+ \positionFLOWzero}%
+
+\def\doFLOWllabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdx\fi
+ \setbox0\hbox{\hskip-\scratchdimen\raise\dimen6
+ \hbox{#1{\strut#3}}}%
+ \positionFLOWzero}%
+
+\def\doFLOWrlabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdx\fi
+ \setbox0\hbox{\hskip\dimen0\hskip\scratchdimen
+ \hbox{\raise\dimen6\hbox{#1{\strut#3}}}}%
+ \positionFLOWzero}
+
+\def\doprocessFLOWcellD#1,#2\end
+ {\dophaseoneFLOWcellX{#1}{#2}%
+ \ifdone
+ \dophasetwoFLOWcellX
+ \doglobal\addtocommalist\FLOWcell\FLOWcells
+ \def\FLOWx{#1}%
+ \def\FLOWy{#2}%
+ \directsetup{flowcell}%
+ \setbox0\hbox
+ {\ifx\FLOWalign\empty\else
+ \setupframed
+ [\c!align=\v!normal,\c!bottom=\vfill,\c!top=\vfill]%
+ \@EA\processallactionsinset\@EA
+ [\FLOWalign]
+ [t=>{\setupframed[\c!bottom=\vfill,\c!top=]},
+ b=>{\setupframed[\c!bottom=,\c!top=\vfill]},
+ l=>{\setupframed[\c!align=\v!right]},
+ r=>{\setupframed[\c!align=\v!left]},
+ m=>{\setupframed[\c!align=\v!middle]},
+ c=>{\setupframed[\c!align=\v!middle]}]%
+ \fi
+ \doifelse\FLOWshape{none} % {\v!none}
+ {\setupframed[\c!offset=\v!overlay]}
+ {\setupframed[\c!offset=\@@FLOSoffset]}%
+ \framed
+ [\c!frame=\v!off,\c!background=flowcell,
+ \c!width=\FLOWshapewidth,\c!height=\FLOWshapeheight]
+ {\FLOWtext}}%
+ \showFLOWhelp0
+ \ifx\FLOWdestination\empty\else
+ \setbox0\hbox
+ {\setupinteraction[\c!color=,\c!contrastcolor=]%
+ \gotobox{\box0}[\FLOWdestination]}%
+ \fi
+ \positionFLOWzero
+ \dimen0=\FLOWshapewidth \dimen2=.5\dimen0
+ \dimen4=\FLOWshapeheight\dimen6=.5\dimen4
+ \boxoffset.5\bodyfontsize
+ \doFLOWtlabel \righttopbox0\tFLOWlabel
+ \doFLOWblabel\rightbottombox0\bFLOWlabel
+ \doFLOWllabel \lefttopbox0\lFLOWlabel
+ \doFLOWrlabel \righttopbox0\rFLOWlabel
+ \doFLOWtlabel \topbox0\tcFLOWlabel % for me only
+ \doFLOWblabel \bottombox0\bcFLOWlabel % for me only
+ \doFLOWllabel \leftbox0\lcFLOWlabel % for me only
+ \doFLOWrlabel \rightbox0\rcFLOWlabel % for me only
+ \ifnum#1=\@@FLOWx\relax \doFLOWllabel \leftbox1\lFLOWexit \fi
+ \ifnum#1=\!!countc \doFLOWrlabel \rightbox1\rFLOWexit \fi
+ \ifnum#2=\@@FLOWy\relax \doFLOWtlabel \topbox1\tFLOWexit \fi
+ \ifnum#2=\!!countd \doFLOWblabel \bottombox1\bFLOWexit \fi
+ \boxoffset\zeropoint
+ \fi}
+
+% For Willy Egger:
+%
+% \startsetups flowcell
+% \definelayer
+% [flowcell]
+% [width=\FLOWshapewidth,
+% height=\FLOWshapeheight]
+% \setlayerframed
+% [flowcell]
+% [preset=rightbottom,offset=1ex]
+% [frame=off]
+% {\tx(\FLOWx,\FLOWy)}
+% \stopsetups
+
+% Pass E
+
+\long\def\startFLOWcellE#1\stopFLOWcell
+ {\resetFLOWcell
+ \ignorespaces#1\unskip
+ \let\doprocessFLOWcell\doprocessFLOWcellE
+ \expandafter\doprocessFLOWcell\FLOWlocation\end}
+
+\def\doprocessFLOWcellE#1,#2\end % redundant
+ {\ifx\FLOWoverlay\empty \else
+ \dophaseoneFLOWcellX{#1}{#2}%
+ \ifdone
+ \dophasetwoFLOWcellX
+ \edef\FLOWdx{\the\dimen0}%
+ \edef\FLOWdy{\the\dimen2}%
+ \setbox0\hbox
+ {\framed
+ [%\c!frame=\v!off,
+ \c!background={\@@FLOWbackground,\FLOWoverlay},
+ \c!backgroundcolor=\@@FLOSbackgroundcolor,
+ \c!width=\FLOWshapewidth,\c!height=\FLOWshapeheight]
+ {}}%
+ \positionFLOWzero
+ \fi
+ \fi}
+
+% Pass F
+
+\def\checkFLOWautofocus
+ {\def\@@FLOWminx{100}\let\@@FLOWminy\@@FLOWminx
+ \def\@@FLOWmaxx {0}\let\@@FLOWmaxy\@@FLOWmaxx
+ \def\@@FLOWabsx {0}\let\@@FLOWabsy\@@FLOWabsx
+ \let\startFLOWcell\startFLOWcellF
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+ %\message{AUTOSHAPE 1: (\@@FLOWminx,\@@FLOWminy)->(\@@FLOWmaxx,\@@FLOWmaxy)}%
+ \ifnum\@@FLOWabsx<\@@FLOWmaxx\let\@@FLOWmaxx\@@FLOWabsx\fi
+ \ifnum\@@FLOWabsy<\@@FLOWmaxy\let\@@FLOWmaxy\@@FLOWabsy\fi
+ %\message{AUTOSHAPE 2: (\@@FLOWminx,\@@FLOWminy)->(\@@FLOWmaxx,\@@FLOWmaxy)}%
+ \donetrue
+ \ifnum\@@FLOWminx=100 \donefalse\fi
+ \ifnum\@@FLOWminy=100 \donefalse\fi
+ \ifnum\@@FLOWmaxx=0 \donefalse\fi
+ \ifnum\@@FLOWmaxy=0 \donefalse\fi
+ \doFLOWcheckF\@@FLOWx\@@FLOWminx\@@FLOWmaxx\@@FLOWnx
+ \doFLOWcheckF\@@FLOWy\@@FLOWminy\@@FLOWmaxy\@@FLOWny}
+
+\def\startFLOWcellF#1\stopFLOWcell%
+ {\resetFLOWcell
+ \ignorespaces#1\unskip
+ \expandafter\doFLOWlocationF\FLOWlocation\end}%
+
+\def\doFLOWlocationF#1,#2\end%
+ {\ifnum#1>\@@FLOWabsx\def\@@FLOWabsx{#1}\fi
+ \ifnum#2>\@@FLOWabsy\def\@@FLOWabsy{#2}\fi
+ \ExpandBothAfter\doifinset{\FLOWcell}{\@@FLOWautofocus}
+ {\dodoFLOWlocationF{#1}<-\@@FLOWminx
+ \dodoFLOWlocationF{#1}>+\@@FLOWmaxx
+ \dodoFLOWlocationF{#2}<-\@@FLOWminy
+ \dodoFLOWlocationF{#2}>+\@@FLOWmaxy}}
+
+\def\dodoFLOWlocationF#1#2#3#4%
+ {\ifnum#1#2#4\relax
+ \!!counta=#1\advance\!!counta #31\relax
+ \edef#4{\ifnum\!!counta<1 1\else\the\!!counta\fi}%
+ \fi}
+
+\def\doFLOWcheckF#1#2#3#4%
+ {\ifdone
+ \let#1=#2%
+ \!!counta=#3%
+ \advance\!!counta \plusone\advance\!!counta -#2\relax
+ \ifnum\!!counta<1 \!!counta=1 \fi
+ \edef#4{\the\!!counta}%
+ \else
+ \let#1\!!plusone
+ \let#4\!!zerocount % no {1}
+ \fi}
+
+% \useFLOWchart[name][parent][setting,setting][additional settings]
+% \useFLOWchart[name][parent][additional settings]
+
+\let\currentFLOWchart\empty
+
+\def\useFLOWchart
+ {\doquadrupleempty\douseFLOWchart}
+
+\def\douseFLOWchart[#1][#2][#3][#4]% name parent sets mainsettings
+ {\iffourthargument
+ \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][#3][#4,##1]}%
+ \else
+ \checkparameters[#3]%
+ \ifparameters
+ \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][][#3,##1]}%
+ \else
+ \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][#3][##1]}%
+ \fi
+ \fi}
+
+\def\setgetFLOWchart[#1][#2][#3]%
+ {\def\docommand##1{}% cell line focus ?
+ \processcommalist[#2]\docommand
+ \getFLOWchart[#1][#3]}
+
+\def\doFLOWchart[#1][#2]%
+ {\hbox\bgroup\vbox\bgroup % vmode suppresses spaces
+\def\currentFLOWchart{#1}%
+ \doifundefinedelse{\@FLOW@--#1}
+ {\getFLOWchart[#1][#2]}
+ {\getvalue{\@FLOW@--#1}[#2]}%
+ \egroup\egroup}
+
+\def\FLOWchart%
+ {\dodoubleempty\doFLOWchart}
+
+%D A hook into the help system.
+
+\def\showFLOWhelp#1%
+ {\doifhelpinfo\FLOWhelp
+ {\setbox#1=\hbox
+ {\setbox\scratchbox=\hbox{\lower\@@FLOWdy\hbox
+ {\helpbutton
+ [\c!width=\wd0,\c!color=,\c!height=\@@FLOWdy,\c!frame=\v!no]%
+ [\FLOWhelp]}}%
+ \smashbox\scratchbox
+ \setbox#1=\vbox
+ {\forgetall\offinterlineskip\box#1\box\scratchbox}%
+ \box#1}}}
+
+%D The next section is dedicated to splitting up charts.
+
+\def\getFLOWsize[#1]%
+ {\bgroup\let\dodogetFLOWchart\dogetFLOWsize\FLOWchart[#1]\egroup}
+
+\def\dogetFLOWsize[#1][#2]%
+ {\setbox\scratchbox=\vbox
+ {\globallet\FLOWmaxwidth \!!zerocount
+ \globallet\FLOWmaxheight\!!zerocount
+ \def\getFLOWlocation##1,##2\end
+ {\ifnum0##1>\FLOWmaxwidth \xdef\FLOWmaxwidth {##1}\fi
+ \ifnum0##2>\FLOWmaxheight\xdef\FLOWmaxheight{##2}\fi}%
+ \resetFLOWcell
+ \long\def\startFLOWcell##1\stopFLOWcell
+ {{##1\expandafter\getFLOWlocation\FLOWlocation\end}}%
+ \def\dohandleflowchart[##1][##2]%
+ {\resetFLOWlocation
+ \processFLOWbuffer{##1}}%
+ \getvalue{\@FLOW@-#1}}}
+
+\def\setupFLOWsplit%
+ {\dodoubleargument\getparameters[\@@FLOT]}
+
+\setupFLOWsplit%
+ [\c!nx=3,\c!ny=3,
+ \c!dx=1,\c!dy=1,
+ \c!command=,
+ \c!marking=\v!on,
+ \c!before=,\c!after=]
+
+\def\FLOWsplitx {1}
+\def\FLOWsplity {1}
+\def\FLOWsplitnx{1}
+\def\FLOWsplitny{1}
+
+\def\FLOWcharts%
+ {\dodoubleempty\doFLOWcharts}
+
+%D While splitting, the following variables are available:
+%D
+%D \starttyping
+%D \FLOWsplitnx \FLOWsplitny \FLOWsplitx \FLOWsplity
+%D \stoptyping
+
+\def\doFLOWcharts[#1][#2]%
+ {\bgroup
+ \getFLOWsize[#1]%
+ \dodoFLOWcharts\relax
+ \global\let\FLOWsplitnx\FLOWsplitx
+ \global\let\FLOWsplitny\FLOWsplity
+ \dodoFLOWcharts{\dododoFLOWcharts[#1][#2]}%
+ \egroup}
+
+\def\dodoFLOWcharts#1%
+ {\def\@@FLOTx{1}%
+ \global\let\FLOWsplitx\@@FLOTx
+ \doloop
+ {\def\@@FLOTy{1}%
+ \global\let\FLOWsplity\@@FLOTy
+ \doloop
+ {\bgroup
+ \scratchcounter\FLOWmaxwidth
+ \advance\scratchcounter -\@@FLOTx
+ \advance\scratchcounter \plusone
+ \ifnum\scratchcounter<\@@FLOTnx\edef\@@FLOTnx{\the\scratchcounter}\fi
+ \scratchcounter\FLOWmaxheight
+ \advance\scratchcounter -\@@FLOTy
+ \advance\scratchcounter \plusone
+ \ifnum\scratchcounter<\@@FLOTny\edef\@@FLOTny{\the\scratchcounter}\fi
+ #1% does something with the float, or not
+ \egroup
+ \increment(\@@FLOTy,\@@FLOTny)%
+ \ifnum\@@FLOTy>\FLOWmaxheight
+ \exitloop
+ \else
+ \doglobal\increment\FLOWsplity
+ \decrement(\@@FLOTy,\@@FLOTdy)%
+ \fi}%
+ \increment(\@@FLOTx,\@@FLOTnx)%
+ \ifnum\@@FLOTx>\FLOWmaxwidth
+ \exitloop
+ \else
+ \doglobal\increment\FLOWsplitx
+ \decrement(\@@FLOTx,\@@FLOTdx)%
+ \fi}}
+
+\def\dododoFLOWcharts[#1][#2]%
+ {\bgroup
+ \@@FLOTbefore
+ \doifnot\@@FLOTmarking\v!on{\let\cuthbox\hbox}%
+ \cuthbox
+ {\@@FLOTcommand
+ {\FLOWchart[#1][#2,
+ \c!x=\@@FLOTx,\c!nx=\@@FLOTnx,
+ \c!y=\@@FLOTy,\c!ny=\@@FLOTny]}}%
+ \@@FLOTafter
+ \egroup}
+
+%D An example of splitting is given below:
+%D
+%D \starttyping
+%D \setupFLOWsplit
+%D [nx=5,ny=10,
+%D dx=0,dy=0,
+%D before=,
+%D after=\page]
+%D
+%D \FLOWcharts[mybigflow]
+%D \stoptyping
+%D
+%D Or, one can say:
+%D
+%D \starttyping
+%D \splitfloat
+%D {\placefigure{What a big flowchart this is!}}
+%D {\FLOWcharts[mybigflow]}
+%D \stoptyping
+
+%D \macros
+%D {typeFLOWchart}
+%D
+%D For documentation purposes the following macro is
+%D provided. Watch the use of the first and last line hooks,
+%D which is needed because the start and stop commands are
+%D not part of the buffer.
+
+\def\typeFLOWchart[#1]%
+ {\bgroup
+ \def\dohandleflowchart[##1][##2]{\typeFLOWbuffer{##1}}%
+ \defconvertedargument\firstverbatimfileline{\startFLOWchart[#1]}%
+ \defconvertedargument\lastverbatimfileline {\stopFLOWchart}%
+ \getvalue{\@FLOW@-#1}
+ \egroup}
+
+%D New:
+%D
+%D \starttyping
+%D \setupFLOWcharts[command=\Whow]
+%D
+%D \startFLOWset[convert-en] % [tag][convert-en]
+%D \subFLOWchart[a][x=1,y=1,nx=3,ny=3]
+%D \subFLOWchart[b][x=1,y=2,nx=3,ny=3]
+%D \subFLOWchart[c][x=2,y=1,nx=3,ny=3]
+%D \stopFLOWset
+%D
+%D \def\Whow#1%
+%D {\ifnum\currentFLOWset=1 \framed{Some Chart}\fi}
+%D
+%D \FLOWset[convert-en] % [tag]
+%D
+%D \def\Whow#1%
+%D {\setuphead[state=high]
+%D \startstandardmakeup
+%D \centerbox{#1}
+%D \stopstandardmakeup}
+%D
+%D \FLOWset[convert-en] % [tag]
+%D \stoptyping
+
+\def\startFLOWset
+ {\dodoubleempty\dostartFLOWset}
+
+\def\dostartFLOWset[#1][#2]#3\stopFLOWset % tag name data
+ {\ifsecondargument
+ \long\setvalue{\@FLOX@#1}{\dohandleFLOWset{#1}{#2}{#3}}%
+ \else
+ \long\setvalue{\@FLOX@#1}{\dohandleFLOWset{#1}{#1}{#3}}%
+ \fi}
+
+\long\def\dohandleFLOWset#1#2#3% tag name data
+ {\bgroup
+ \def\subFLOWchart
+ {\dodoubleempty\dosubFLOWchart}%
+ \def\dosubFLOWchart[##1][##2]% subtag settings
+ {\ifsecondargument
+ \dodohandleFLOWset{#1}{##1}{#2}{##2}%
+ \else
+ \subFLOWchart[][##1]%
+ \fi}%
+ #3%
+ \egroup}
+
+\def\dodohandleFLOWset#1#2#3#4% tag subtag name settings
+ {\increment\currentFLOWset
+ \bgroup
+ \@@FLOXcommand
+ {\ifnum\currentFLOWset=1 \pagereference[#1]\fi
+ \doifsomething{#2}
+ {\setupreferencing[\c!prefix=]%
+ \pagereference[#1:#2]% -:#1:#2
+ \setupreferencing[\c!prefix=#1:#2]}%
+ \FLOWchart[#3][#4]}%
+ \egroup}
+
+\def\FLOWset[#1]%
+ {\newcounter\currentFLOWset
+ \doifdefinedelse{\@FLOX@#1}
+ {\getvalue{\@FLOX@#1}}
+ {\dodohandleFLOWset{#1}{}{#1}{}}}
+
+\newcounter\currentFLOWset
+
+\setupFLOWsets
+ [\c!command=]
+
+%D This will be an option:
+
+% \def\startFLOWchart%
+% {\dodoubleempty\dostartFLOWchart}
+%
+% \long\def\dostartFLOWchart[#1][#2]#3\stopFLOWchart
+% {\preparenextFLOWchart{#1}{#2}%
+% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}}
+%
+% \long\def\dodefineFLOWchart[#1][#2]#3%
+% {\preparenextFLOWchart{#1}{#2}%
+% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}}
+%
+% \def\processFLOWbuffer#1{\getvalue{\FLOWbufferprefix#1}}
+% \def\typeFLOWbuffer #1{[Sorry, no verbatim chart #1 available.]}
+
+%D The \XML\ interface:
+
\startXMLdefinitions flowchart
\defineXMLargument [flowchartdefinition]
diff --git a/Master/texmf-dist/tex/context/base/m-chart.mkiv b/Master/texmf-dist/tex/context/base/m-chart.mkiv
index 4c008a5eef3..114e7d5530c 100644
--- a/Master/texmf-dist/tex/context/base/m-chart.mkiv
+++ b/Master/texmf-dist/tex/context/base/m-chart.mkiv
@@ -11,10 +11,2536 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D The \XML\ interface:
+%D This module will be reimplemented as it can be done much more
+%D simple now in mkiv,.
+
+
+% todo: \localpushmacro/\localpopmacro (dohandleflowchart etc)
+% todo: make mkiv variant
+% todo: use dimexpr/numspr
+
+% will be redone with layers and dimexpr or even better, by just using
+% textext .. a nice example of old code
+
+%D This is an experimental module. Pieces of code will be moved
+%D to other modules. More features are possible but will be
+%D interfaces later.
+%D
+%D When finished this module will be documented. The main macro
+%D is still a rather big one and there is some redundant and
+%D slow code that needs a clean up.
+
+% arrow, dash
+% crossing
+% \goto -> \normalgoto
+% class -> class:name (ref prefix)
+% c, automatisch geen overlap zoeken
+% eind eerder chart connecties
+% relateren aan korps
+% check op bestaan naam, bestaan shape
+% auto als extern figuur
+% subchart
+% pijlen
+% focus
+% ook nog \MPmessage
+% areapath -> krappe vlak
+% clippath -> gehele vlak
+%
+% offset : clip offset
+% breedte : breedte cel
+% hoogte : hoogte cel
+% dx : halve afstand in breedte (grid breedte = breedte + 2dx)
+% dy : halve afstand in hoogte (grid hoogte = hoogte + 2dy)
+% x : x offset (clipping)
+% y : y offset (clipping)
+% nx : minimaal aantal cellen horizontaal
+% ny : minimaal aantal cellen vertikaal
+%
+% shape none en geen equivalent maken
+%
+% kaderkleur achtergrondkleur
+% lijnkleur lijndikte
+% focus focuskaderkleur focusachtergrondkleur
+% richting
+%
+% focus koppelen aan kleur
\unprotect
-\writestatus\m!systems{The chart mkiv xml interface is not yet defined!}
+\definesorting [flowchart] [flowcharts] [\v!none] % no access
+\setupsorting [flowchart] [\c!state=\v!stop] % off by default
+
+\def\@FLOW@{@FLOW@}
+\def\@FLOC@{@FLOC@}
+\def\@FLOX@{@FLOX@}
+
+\def\@@FLOW{@@FLOW}
+\def\@@FLOL{@@FLOL}
+\def\@@FLOS{@@FLOS}
+\def\@@FLOF{@@FLOF}
+\def\@@FLOT{@@FLOT}
+\def\@@FLOX{@@FLOX}
+
+\def\@@MPx {@@MPx}
+\def\@@MPy {@@MPy}
+
+\def\FLOWbufferprefix{flw-}
+
+\def\processFLOWbuffer#1{\getbuffer[\FLOWbufferprefix#1]}
+\def\typeFLOWbuffer #1{\typebuffer[\FLOWbufferprefix#1]}
+
+\def\setFLOWname#1#2% funny hack that makes sure that we get
+ {\bgroup % names that are acceptable for METAPOST
+ \lccode`0=`a\lccode`1=`b\lccode`2=`c\lccode`3=`d\lccode`4=`e%
+ \lccode`5=`f\lccode`6=`g\lccode`7=`h\lccode`8=`i\lccode`9=`j%
+ \lccode` =`\_\lccode`-=`\_\lccode`_=`\_%
+ \lowercase{\gdef#1{#2}}% todo: make a ctxlua call of this
+ \egroup}
+
+% een gobble als default is sneller, en dan alleen setten als
+% nodig
+
+\def\resetFLOWcell
+ {% variables
+ \global\let\FLOWname \empty
+ \global\let\FLOWalign \empty
+ \global\let\FLOWshape \empty
+ \global\let\FLOWlocation \empty
+ \global\let\FLOWtext \empty
+ \global\let\FLOWhelp \empty
+ \global\let\FLOWdestination\empty
+ \global\let\FLOWoverlay \empty
+ \global\let\FLOWfocus \empty
+ \global\let\tFLOWlabel \empty
+ \global\let\bFLOWlabel \empty
+ \global\let\lFLOWlabel \empty
+ \global\let\rFLOWlabel \empty
+ \global\let\bcFLOWlabel \empty
+ \global\let\tcFLOWlabel \empty
+ \global\let\lcFLOWlabel \empty
+ \global\let\rcFLOWlabel \empty
+ \global\let\tFLOWexit \empty
+ \global\let\bFLOWexit \empty
+ \global\let\lFLOWexit \empty
+ \global\let\rFLOWexit \empty
+ % commands
+ \let\name \doFLOWname
+ \let\shape \doFLOWshape
+ \let\destination\doFLOWdestination
+ \let\location \doFLOWlocation
+ \let\focus \doFLOWfocus
+ \let\overlay \doFLOWoverlay
+ \let\figure \doFLOWfigure
+ \let\text \doFLOWtext
+ \let\comment \doFLOWcomment
+ \let\label \doFLOWlabel
+ \let\help \doFLOWhelp
+ \let\connection \doFLOWconnection
+ \let\exit \doFLOWexit
+ % convenience commands
+ \let\locate \doFLOWlocate
+ \let\connect \doFLOWconnect}
+
+\let\FLOWcell \s!unknown
+\let\FLOWshape \s!unknown
+\let\FLOWdestination\s!unknown
+\let\FLOWfocus \s!unknown
+\let\FLOWoverlay \empty
+\let\FLOWtext \empty
+
+\def\doFLOWname#1%
+ {\def\FLOWcell{#1}\setFLOWname\FLOWname{name_#1}\ignorespaces}
+
+\def\doFLOWshape#1%
+ {\gdef\FLOWshape{#1}\ignorespaces}
+
+\def\doFLOWdestination#1%
+ {\gdef\FLOWdestination{#1}\ignorespaces}
+
+\def\doFLOWlocation#1%
+ {\setFLOWlocation#1\end\ignorespaces}
+
+\def\doFLOWfocus#1%
+ {\gdef\FLOWfocus{#1}\ignorespaces}
+
+\def\doFLOWoverlay#1%
+ {\gdef\FLOWoverlay{#1}\ignorespaces}
+
+\def\doFLOWfigure#1%
+ {\defineoverlay[\s!dummy][\overlayfigure{#1}]%
+ \overlay\s!dummy}
+
+\def\doFLOWtext
+ {\dosingleempty\dodoFLOWtext}
+
+\def\dodoFLOWtext[#1]% % #2%
+ {\gdef\FLOWalign{#1}\gdef\FLOWtext}% {#2}}
+
+\def\doFLOWcomment[#1]#2%
+ {\ignorespaces\dogobblesingleempty}
+
+\def\doFLOWlabel[#1]#2% wordt dit gebruikt ?
+ {\setgvalue{#1FLOWlabel}{#2}\ignorespaces}
+
+\def\doFLOWhelp#1%
+ {\gdef\FLOWhelp{#1}\ignorespaces}
+
+\def\doFLOWconnection
+ {\dodoubleempty\dodoFLOWconnection}
+
+\def\dodoFLOWconnection[#1][#2]#3%
+ {\ignorespaces}
+
+\def\doFLOWconnect
+ {\connection}
+
+\def\doFLOWlocate
+ {\location}
+
+\def\doFLOWexit[#1]#2%
+ {\setgvalue{#1FLOWexit}{#2}\ignorespaces}
+
+\def\startFLOWchart
+ {\bgroup
+ \let\stopFLOWchart\egroup
+ \obeylines % lelijk, buffers nog eens fatsoeneren
+ \dodoubleempty\dostartFLOWchart}
+
+\def\dostartFLOWchart[#1][#2]%
+ {\preparenextFLOWchart{#1}{#2}%
+ \dostartbuffer[\FLOWbufferprefix\nofFLOWcharts][startFLOWchart][stopFLOWchart]}
+
+\def\defineFLOWchart%
+ {\dodoubleempty\dodefineFLOWchart}
+
+\long\def\dodefineFLOWchart[#1][#2]#3%
+ {\preparenextFLOWchart{#1}{#2}%
+ \setbuffer[\FLOWbufferprefix\nofFLOWcharts]#3\endbuffer}
+
+\def\preparenextFLOWchart#1#2%
+ {\doglobal\increment\nofFLOWcharts
+ \flowchart{#1}%
+ \setxvalue{\@FLOW@-#1}{\noexpand\dohandleflowchart[\nofFLOWcharts][#2]}}
+
+\def\setupFLOWcharts{\dodoubleargument\getparameters[\@@FLOW]}
+\def\setupFLOWlines {\dodoubleargument\getparameters[\@@FLOL]}
+\def\setupFLOWshapes{\dodoubleargument\getparameters[\@@FLOS]}
+\def\setupFLOWfocus {\dodoubleargument\getparameters[\@@FLOF]}
+\def\setupFLOWsets {\dodoubleargument\getparameters[\@@FLOX]}
+
+\setupFLOWcharts
+ [\c!option=,
+ \c!bodyfont=,
+ \c!dot=, % private option
+ \c!width=12\bodyfontsize,
+ \c!height=7\bodyfontsize,
+ \c!maxwidth=,
+ \c!maxheight=,
+ \c!offset=\v!standard, % == auto offset
+ \c!dx=2\bodyfontsize,
+ \c!dy=2\bodyfontsize,
+ \c!nx=0, % 1,
+ \c!ny=0, % 1,
+ \c!x=1,
+ \c!y=1,
+ \c!autofocus=,
+ \c!focus=,
+ \c!background=, % \v!color,
+ \c!backgroundcolor=\s!white,
+ \c!rulethickness=\linewidth,
+ \c!frame=\v!off,
+ \c!framecolor=]
+
+\setupFLOWlines
+ [\c!corner=\v!round,
+ \c!arrow=\v!yes,
+ \c!dash=\v!no,
+ \c!radius=.375\bodyfontsize, % 2.5\c!rulethickness
+ \c!color=FLOWlinecolor,
+ \c!rulethickness=.15\bodyfontsize, % 2pt,
+ \c!offset=\v!none]
+
+\setupFLOWshapes
+ [\c!default=action,
+ \c!framecolor=FLOWframecolor,
+ \c!background=\v!color,
+ \c!backgroundcolor=FLOWbackgroundcolor,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!rulethickness=.15\bodyfontsize, % 2pt,
+ \c!offset=.5\bodyfontsize]
+
+\setupFLOWfocus
+ [\c!framecolor=FLOWfocuscolor,
+ \c!background=\@@FLOSbackground,
+ \c!backgroundcolor=\@@FLOSbackgroundcolor,
+ \c!backgroundscreen=\@@FLOSbackgroundscreen,
+ \c!rulethickness=\@@FLOSrulethickness,
+ \c!offset=\@@FLOSoffset]
+
+\definecolor [FLOWfocuscolor] [s=.2]
+\definecolor [FLOWlinecolor] [s=.5]
+\definecolor [FLOWframecolor] [s=.7]
+\definecolor [FLOWbackgroundcolor] [s=.9]
+
+\newcounter\includeFLOWx
+\newcounter\includeFLOWy
+
+\def\includeFLOWchart
+ {\dodoubleempty\doincludeFLOWchart}
+
+\def\doincludeFLOWchart[#1][#2]%
+ {\pushmacro\includeFLOWx
+ \pushmacro\includeFLOWy
+ \getparameters[FLOWi][x=1,y=1,#2]%
+ \increment(\includeFLOWx,0\FLOWix)\decrement\includeFLOWx
+ \increment(\includeFLOWy,0\FLOWiy)\decrement\includeFLOWy
+ \def\dodoincludeFLOWchart##1%
+ {\doifdefined{\@FLOW@-##1}
+ {\globalpushmacro\dohandleflowchart % was local
+ \gdef\dohandleflowchart[####1][####2]%
+ {\globalpopmacro\dohandleflowchart % was local
+ \resetFLOWlocation
+ \processFLOWbuffer{####1}}%
+ \getvalue{\@FLOW@-##1}}}%
+ \processcommalist[#1]\dodoincludeFLOWchart
+ \popmacro\includeFLOWx
+ \popmacro\includeFLOWy}
+
+\def\resetFLOWlocation
+ {\globallet\lastFLOWx\!!zerocount
+ \globallet\lastFLOWy\!!zerocount}
+
+\def\dosetFLOWlocation[#1#2]#3#4%
+ {\processaction
+ [#1#2]
+ [ +=>\scratchcounter\numexpr#4+ 1+#3\relax,
+ -=>\scratchcounter\numexpr#4- 1+#3\relax,
+ +#2=>\scratchcounter\numexpr#4+#2+#3\relax,
+ -#2=>\scratchcounter\numexpr#4-#2+#3\relax,
+ \s!default=>\scratchcounter\numexpr#4 +#3\relax,
+ \s!unknown=>\scratchcounter\numexpr0#1#2+#3\relax]%
+ \xdef#4{\the\scratchcounter}}
+
+\def\setFLOWlocation#1,#2\end
+ {\dosetFLOWlocation[#1\empty]\includeFLOWx\lastFLOWx
+ \dosetFLOWlocation[#2\empty]\includeFLOWy\lastFLOWy
+ \xdef\FLOWlocation{\lastFLOWx,\lastFLOWy}}
+
+\def\FLOWshapes
+ {node, action, procedure, product, decision, archive,
+ loop, wait, subprocedure, singledocument, multidocument,
+ sub procedure, single document, multi document, up, down,
+ left, right}
+
+\def\FLOWlines
+ {up, down, left, right}
+
+\def\FLOWsetconnect#1%
+ {\donefalse
+ \let\cFLOWfrom\empty
+ \let\cFLOWto\empty
+ \let\zFLOWfrom\!!zerocount
+ \let\zFLOWto\!!zerocount
+ \handletokens#1\with\doFLOWsetconnect
+ \ifx\cFLOWto\empty\let\cFLOWfrom\empty\fi}
+
+\def\doFLOWsetconnect#1%
+ {\ifx #1p%
+ \ifdone\def\zFLOWto{+1}\else\def\zFLOWfrom{+1}\fi
+ \else\ifx#1+%
+ \ifdone\def\zFLOWto{+1}\else\def\zFLOWfrom{+1}\fi
+ \else\ifx#1n%
+ \ifdone\def\zFLOWto{-1}\else\def\zFLOWfrom{-1}\fi
+ \else\ifx#1-%
+ \ifdone\def\zFLOWto{-1}\else\def\zFLOWfrom{-1}\fi
+ \else\ifdone
+ \edef\cFLOWto{\FLOWconnector#1}%
+ \else
+ \edef\cFLOWfrom{\FLOWconnector#1}%
+ \donetrue
+ \fi\fi\fi\fi\fi}
+
+\def\FLOWconnector#1%
+ {\if#1bbottom\else\if#1ttop\else\if#1lleft\else\if#1rright\fi\fi\fi\fi}
+
+\newif\ifFLOWscaling \FLOWscalingtrue
+
+\def\@@FLOW@@offset{\@@FLOWoffset}
+
+\def\getFLOWchart
+ {\dodoubleempty\dogetFLOWchart}
+
+\def\dogetFLOWchart[#1][#2]%
+ {\doifundefinedelse{\@FLOW@-#1}
+ {\writestatus{FLOW}{unknown chart #1}%
+ \framed
+ [\c!width=12\bodyfontsize,\c!height=8\bodyfontsize]
+ {\tttf [chart #1]}}
+ {\dodogetFLOWchart[#1][#2]}}
+
+\def\dodogetFLOWchart[#1][#2]% to be split a bit more
+ {\vbox\bgroup
+ \insidefloattrue
+ \forgetall
+ \dontcomplain
+ % \offinterlineskip % we now explicitly use \nointerlineskip later on
+ \def\dohandleflowchart[##1][##2]%
+ {\def\currentFLOWnumber{##1}%
+ \getparameters[\@@FLOW][##2]}%
+ \getvalue{\@FLOW@-#1}%
+ \getparameters[\@@FLOW][#2]% dubbelop ?
+ \doifsomething{\@@FLOWautofocus}
+ {\checkFLOWautofocus}%
+ %\message{AUTOSHAPE 3: (\@@FLOWx,\@@FLOWy)->(\@@FLOWnx,\@@FLOWny)}\wait
+ \global\let\FLOWwidth \@@FLOWnx
+ \global\let\FLOWheight\@@FLOWny
+ \let\startFLOWcell\startFLOWcellA
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+ \ifcase\@@FLOWnx\relax \let\@@FLOWnx\FLOWwidth \fi
+ \ifcase\@@FLOWny\relax \let\@@FLOWny\FLOWheight \fi
+ \doifnothing{\@@FLOWmaxwidth\@@FLOWmaxheight}{\FLOWscalingfalse}%
+ \ifFLOWscaling
+ \doifnothing{\@@FLOWmaxwidth }{\let\@@FLOWmaxwidth \maxdimen}%
+ \doifnothing{\@@FLOWmaxheight}{\let\@@FLOWmaxheight\maxdimen}%
+ \scratchcounter\bodyfontpoints
+ \doloop % NOG FONTSWITCH OM EX EN EM TE LATEN WERKEN
+ {\ifnum\scratchcounter>1 % NU DIMENSIONS IN TERMS OF BODYFONTSIZE
+ \bodyfontsize=\the\scratchcounter pt
+ \dimen0=\@@FLOWmaxwidth
+ \dimen2=\@@FLOWwidth
+ \dimen4=\@@FLOWdx
+ \advance\dimen2 2\dimen4
+ \dimen2=\@@FLOWnx\dimen2
+ \advance\dimen2 2\dimen4
+ \ifdim\dimen2>\dimen0
+ \advance\scratchcounter \minusone
+ \else
+ \dimen0=\@@FLOWmaxheight
+ \dimen2=\@@FLOWheight
+ \dimen4=\@@FLOWdy
+ \advance\dimen2 2\dimen4
+ \dimen2=\@@FLOWny\dimen2
+ \advance\dimen2 2\dimen4
+ \ifdim\dimen2>\dimen0
+ \advance\scratchcounter \minusone
+ \else
+ \exitloop
+ \fi
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ \expanded{\switchtobodyfont[\the\scratchcounter pt]}%
+ \forgetall
+ % \offinterlineskip % needed ?
+ \else\ifx\@@FLOWbodyfont\empty\else
+ \expanded{\switchtobodyfont[\@@FLOWbodyfont]}% \expanded ?
+ \fi\fi
+ \global\let\FLOWcells\empty
+ \dimen0=\@@FLOWwidth
+ \edef\FLOWshapewidth{\the\dimen0}%
+ \dimen2=\@@FLOWdx
+ \advance\dimen0 2\dimen2
+ \edef\FLOWgridwidth{\the\dimen0}%
+ \dimen0=\@@FLOWheight
+ \edef\FLOWshapeheight{\the\dimen0}%
+ \dimen2=\@@FLOWdy
+ \advance\dimen0 2\dimen2
+ \edef\FLOWgridheight{\the\dimen0}%
+ \scratchdimen=\@@FLOSrulethickness
+ \edef\@@FLOSrulethickness{\the\scratchdimen}%
+ \scratchdimen=\@@FLOFrulethickness
+ \edef\@@FLOFrulethickness{\the\scratchdimen}%
+ \scratchdimen=\@@FLOLrulethickness
+ \edef\@@FLOLrulethickness{\the\scratchdimen}%
+ \ifdim\@@FLOLradius<2.5\scratchdimen
+ \scratchdimen=2.5\scratchdimen
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \ifdim\@@FLOLradius>\@@FLOWdx
+ \scratchdimen=\@@FLOWdx
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \fi
+ \ifdim\@@FLOLradius>\@@FLOWdy
+ \scratchdimen=\@@FLOWdy
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \fi
+ \else
+ \scratchdimen=\@@FLOLradius
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \fi
+ \processaction % magic 2.5
+ [\@@FLOWoffset]
+ [ \v!none=>\scratchdimen=-2.5\scratchdimen,
+ \v!overlay=>\scratchdimen=-2.5\scratchdimen,
+ \v!standard=>\scratchdimen=\scratchdimen,
+ \s!unknown=>\scratchdimen=\@@FLOWoffset,
+ \s!default=>\scratchdimen=-2.5\scratchdimen]%
+ \edef\@@FLOW@@offset{\the\scratchdimen}%
+ \forgetall
+ \offinterlineskip
+ \resetMPdrawing
+ \doglobal\newcounter\FLOWcomment
+ \startMPdrawing
+ if unknown context_char : input mp-char.mp ; fi ;
+ grid_width := \FLOWgridwidth ;
+ grid_height := \FLOWgridheight ;
+ shape_width := \FLOWshapewidth ;
+ shape_height := \FLOWshapeheight ;
+ connection_line_width := \@@FLOLrulethickness ;
+ connection_smooth_size := \@@FLOLradius ;
+ connection_arrow_size := \@@FLOLradius ;
+ connection_dash_size := \@@FLOLradius ;
+ currentpicture := nullpicture ;
+ begin_chart(0,\FLOWwidth,\FLOWheight);
+ reverse_y := true ;
+ chart_offset := \@@FLOW@@offset ;
+ \stopMPdrawing
+ \doifelsenothing\@@FLOWbackgroundcolor
+ {\startMPdrawing
+ chart_background_color := white ;
+ \stopMPdrawing}
+ {\startMPdrawing
+ chart_background_color := \MPcolor{\@@FLOWbackgroundcolor} ;
+ \stopMPdrawing}%
+ \doif\@@FLOWoption\v!test
+ {\startMPdrawing
+ show_con_points := true ;
+ show_mid_points := true ;
+ show_all_points := true ;
+ \stopMPdrawing}%
+ \processaction % private
+ [\@@FLOWdot]
+ [ \v!yes=>\startMPdrawing
+ show_con_points := true ;
+ show_mid_points := true ;
+ show_all_points := true ;
+ \stopMPdrawing,
+ \s!unknown=>\startMPdrawing
+ show_\@@FLOWdot _points := true ;
+ \stopMPdrawing]%
+\doglobal\newcounter\FLOWcomment
+ \let\startFLOWcell\startFLOWcellB
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+\doglobal\newcounter\FLOWcomment
+ \let\startFLOWcell\startFLOWcellC
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+ \startMPdrawing
+ clip_chart(\@@FLOWx,\@@FLOWy,\@@FLOWnx,\@@FLOWny) ;
+ end_chart ;
+ \stopMPdrawing
+ \MPdrawingdonetrue
+ \setbox0\hbox
+ {\MPstaticgraphictrue
+ \MPshiftdrawingfalse
+ \getMPdrawing}%
+ \def\MPmessage##1%
+ {\writestatus{MP charts}{##1}}%
+ \def\MPposition##1##2##3%
+ {\setvalue{\@@MPx##1}{##2}\setvalue{\@@MPy##1}{##3}}%
+ \def\MPclippath##1##2##3##4%
+ {\def\clipMPllx{##1bp}\def\clipMPlly{##2bp}%
+ \def\clipMPurx{##3bp}\def\clipMPury{##4bp}}%
+ \def\MPareapath##1##2##3##4%
+ {\def\areaMPllx{##1bp}\def\areaMPlly{##2bp}%
+ \def\areaMPurx{##3bp}\def\areaMPury{##4bp}}%
+ \getMPdata
+ \doglobal\newcounter\FLOWcomment
+ \let\startFLOWcell\startFLOWcellD
+ \setbox2\vbox to \ht0
+ {\forgetall % \offinterlineskip
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber\vss}%
+ \setbox2\hbox
+ {\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box2}%
+ \wd2\wd0\ht2\ht0\dp2\dp0
+ \let\startFLOWcell\startFLOWcellE
+ \setbox4\vbox to \ht0
+ {\forgetall % \offinterlineskip
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber\vss}%
+ \setbox4\hbox
+ {\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box4}%
+ \wd4\wd0\ht4\ht0\dp4\dp0
+ \doifelse\@@FLOWoption\v!test
+ {\setbox6\vbox
+ {\forgetall
+ \vskip\@@FLOW@@offset
+ \hskip\@@FLOW@@offset
+ \basegrid
+ [\c!x=\@@FLOWx,\c!nx=\@@FLOWnx,\c!dx=\withoutpt\FLOWgridwidth,
+ \c!y=\@@FLOWy,\c!ny=\@@FLOWny,\c!dy=\withoutpt\FLOWgridheight,
+ \c!xstep=1,\c!ystep=1,
+ \c!unit=pt,\c!location=\v!middle]}%
+ \wd6\wd0\ht6\ht0\dp6\dp0
+ \setbox8\vbox
+ {\forgetall
+ \offinterlineskip
+ \vskip\@@FLOW@@offset
+ \dostepwiserecurse\@@FLOWy\@@FLOWny\plusone
+ {\vbox to \FLOWgridheight
+ {\vfill
+ \hskip\@@FLOW@@offset
+ \hbox
+ {\dostepwiserecurse\@@FLOWx\@@FLOWnx\plusone
+ {\hbox to \FLOWgridwidth
+ {\hfill
+ \framed
+ [\c!framecolor=red,
+ \c!width=\FLOWshapewidth,
+ \c!height=\FLOWshapeheight]
+ {}%
+ \hfill}}}
+ \vfill}}}%
+ \wd8\wd0\ht8\ht0\dp8\dp0
+ \framed
+ [\c!offset=\v!overlay,\c!framecolor=green]
+ {\hbox{\box4\hskip-\wd0\box0\hskip-\wd2\box2\hskip-\wd6\box6\hskip-\wd8\box8}}}
+ {\framed
+ [\c!offset=\v!overlay,
+ \c!frame=\@@FLOWframe,
+ \c!rulethickness=\@@FLOWrulethickness,
+ \c!framecolor=\@@FLOWframecolor,
+ \c!background=\@@FLOWbackground,
+ \c!backgroundcolor=\@@FLOWbackgroundcolor]
+ {\hbox{\box4\hskip-\wd0\box0\hskip-\wd2\box2}}}%
+ %\message{[\FLOWcells]}\wait
+ \egroup}
+
+% Pass A
+
+\long\def\startFLOWcellA#1\stopFLOWcell%
+ {\resetFLOWcell
+ \ignorespaces#1\unskip
+ \expandafter\getFLOWlocationA\FLOWlocation\end
+ \ignorespaces}
+
+\def\getFLOWlocationA#1,#2\end
+ {\ifnum0#1>\FLOWwidth \xdef\FLOWwidth {#1}\fi
+ \ifnum0#2>\FLOWheight\xdef\FLOWheight{#2}\fi}
+
+% Pass B
+%
+% beware: the - after \@FLOC@ is needed since name can be
+% empty and we don't want to redefine \@FLOC@ itself by
+% mistake
+
+\long\def\startFLOWcellB#1\stopFLOWcell
+ {\resetFLOWcell\ignorespaces#1\unskip
+ \setxvalue{\@FLOC@-\FLOWname}{\FLOWlocation}% kost veel cs's
+ \ifx\FLOWshape\empty
+ \global\let\FLOWshape\@@FLOSdefault
+ \fi
+ \doifnot\FLOWshape{none} % {\v!none}
+ {\doifinsetelse\FLOWshape\FLOWshapes
+ {\edef\FLOWshapetag{shape_ \FLOWshape}% beter \expanded
+ \@EA\setFLOWname\@EA\FLOWshapetag\@EA{\FLOWshapetag}}
+ {\doifnumberelse\FLOWshape
+ {\let\FLOWshapetag\FLOWshape}
+ {\let\FLOWshapetag\empty}}%
+ \ifx\FLOWshapetag\empty \else
+ \doifinsetelse\FLOWshape\FLOWlines
+ {\chardef\FLOWstate0 }
+ {\doifcommonelse{\FLOWcell,\FLOWfocus}\@@FLOWfocus
+ {\chardef\FLOWstate1 }
+ {\chardef\FLOWstate2 }}%
+ \startMPdrawing
+ begin_sub_chart ;
+ \ifcase\FLOWstate
+ shape_line_color := \MPcolor{\@@FLOLcolor} ;
+ shape_fill_color := \MPcolor{\@@FLOLcolor} ;
+ shape_line_width := \@@FLOLrulethickness ;
+ \or
+ shape_line_color := \MPcolor{\@@FLOFframecolor} ;
+ shape_fill_color := \MPcolor{\@@FLOFbackgroundcolor} ;
+ shape_line_width := \@@FLOFrulethickness ;
+ \or
+ shape_line_color := \MPcolor{\@@FLOSframecolor} ;
+ shape_fill_color := \MPcolor{\@@FLOSbackgroundcolor} ;
+ shape_line_width := \@@FLOSrulethickness ;
+ \fi
+ %\ifx\FLOWoverlay\empty
+ % peepshape := false ;
+ %\else
+ % peepshape := true ;
+ %\fi
+ peepshape := \ifx\FLOWoverlay\empty false \else true \fi ;
+ new_shape(\FLOWlocation,\FLOWshapetag) ;
+ end_sub_chart ;
+ \stopMPdrawing
+ \fi}%
+ \ignorespaces}
+
+% Pass C
+
+\long\def\startFLOWcellC#1\stopFLOWcell%
+ {\resetFLOWcell
+\pushmacro\lastFLOWx
+\pushmacro\lastFLOWy
+ \ignorespaces#1\unskip % makes sure that vars are set
+\popmacro\lastFLOWy
+\popmacro\lastFLOWx
+ \let\connection\doFLOWconnectionC
+ \ignorespaces#1\unskip}
+
+\def\FLOWorigin{0,0}
+
+\def\doFLOWdisplace[#1,#2,#3]% experiment
+ {dsp_x := #1 ; dsp_y := #2 ;}
+
+\def\doFLOWconnectionC
+ {\dodoubleempty\dodoFLOWconnectionC}
+
+\def\dodoFLOWconnectionC[#1][#2]#3%
+ {\doglobal\increment\FLOWcomment
+ \setFLOWname\otherFLOWname{name_#3}%
+ \doifdefinedelse{\@FLOC@-\FLOWname}
+ {\edef\FLOWfrom{\getvalue{\@FLOC@-\FLOWname}}}
+ {\let \FLOWfrom \FLOWorigin}%
+ \ifx\FLOWfrom\FLOWorigin \else
+ \doifdefinedelse{\@FLOC@-\otherFLOWname}
+ {\edef\FLOWto {\getvalue{\@FLOC@-\otherFLOWname}}}
+ {\let \FLOWto \FLOWorigin}%
+ \ifx\FLOWto\FLOWorigin \else
+ \FLOWsetconnect{#1}%
+ \ifx\cFLOWfrom\empty \else
+ \doifelse\@@FLOLcorner\v!round
+ {\startMPdrawing smooth := true ; \stopMPdrawing}
+ {\startMPdrawing smooth := false ; \stopMPdrawing}%
+ \doifelse\@@FLOLdash\v!yes
+ {\startMPdrawing dashline := true ; \stopMPdrawing}
+ {\startMPdrawing dashline := false ; \stopMPdrawing}%
+ \doifelse\@@FLOLarrow\v!yes
+ {\startMPdrawing arrowtip := true ; \stopMPdrawing}
+ {\startMPdrawing arrowtip := false ; \stopMPdrawing}%
+ \doifelse\@@FLOLoffset\v!none
+ {\startMPdrawing touchshape := true ; \stopMPdrawing}
+ {\startMPdrawing touchshape := false ; \stopMPdrawing}%
+%\doifsomething{#2}
+% {\startMPdrawing
+% \doFLOWdisplace[0#2,0,0]%
+% \stopMPdrawing}%
+ \startMPdrawing
+\doFLOWdisplace[0#2,0,0]%
+ connection_line_color := \MPcolor{\@@FLOLcolor} ;
+ connection_line_width := \@@FLOLrulethickness ;
+ connect_\cFLOWfrom _\cFLOWto (\FLOWfrom,\zFLOWfrom) (\FLOWto,\zFLOWto) ;
+\doFLOWdisplace[0,0,0]%
+ \stopMPdrawing
+ \fi
+ \fi
+ \fi
+ \ignorespaces}
+
+% Pass D
+
+\long\def\startFLOWcellD#1\stopFLOWcell
+ {\resetFLOWcell
+\pushmacro\lastFLOWx
+\pushmacro\lastFLOWy
+ \ignorespaces#1\unskip % presets vars
+\popmacro\lastFLOWy
+\popmacro\lastFLOWx
+ \let\doprocessFLOWcell\doprocessFLOWcellD
+ \expandafter\doprocessFLOWcellD\FLOWlocation\end
+ \let\connection\doFLOWconnectionD
+ \let\comment\doFLOWcommentD
+ \ignorespaces#1\unskip\ignorespaces}
+
+\def\doFLOWconnectionD
+ {\dodoubleempty\dodoFLOWconnectionD}
+
+\def\dodoFLOWconnectionD[#1][#2]#3%
+ {\doglobal\increment\FLOWcomment
+ \ignorespaces}
+
+\def\doFLOWcommentD[#1]#2%
+ {\bgroup
+ \let\FLOW \middlebox
+ \let\FLOWb \bottombox
+ \let\FLOWbl\bottomleftbox
+ \let\FLOWbr\bottomrightbox
+ \let\FLOWt \topbox
+ \let\FLOWtl\topleftbox
+ \let\FLOWtr\toprightbox
+ \let\FLOWl \leftbox
+ \let\FLOWlt\lefttopbox
+ \let\FLOWlb\leftbottombox
+ \let\FLOWr \rightbox
+ \let\FLOWrt\righttopbox
+ \let\FLOWrb\rightbottombox
+ \let\FLOWc \middlebox
+%\ifdefined{FLOW#1}%
+ \ifcase0\getvalue{\@@MPx\FLOWcomment}\getvalue{\@@MPy\FLOWcomment}\relax
+ \else
+ \ifdim\getvalue{\@@MPx\FLOWcomment}\s!bp<\areaMPllx\relax\else
+ \ifdim\getvalue{\@@MPx\FLOWcomment}\s!bp>\areaMPurx\relax\else
+ \ifdim\getvalue{\@@MPy\FLOWcomment}\s!bp<\areaMPlly\relax\else
+ \ifdim\getvalue{\@@MPy\FLOWcomment}\s!bp>\areaMPury\relax\else
+ \dimen0=\getvalue{\@@MPx\FLOWcomment}\s!bp
+ \advance\dimen0 -\@@FLOW@@offset
+ \advance\dimen0 -\clipMPllx
+ \dimen2=\clipMPury
+ \advance\dimen2 -\@@FLOW@@offset
+ \advance\dimen2 -\getvalue{\@@MPy\FLOWcomment}\s!bp
+ \setbox\scratchbox\hbox{\strut#2}%
+ \boxoffset.5\bodyfontsize
+ \setbox\scratchbox\hbox{\hskip\dimen0\lower\dimen2\getvalue{FLOW#1}{\box\scratchbox}}%
+ \smashbox\scratchbox
+ \box\scratchbox
+ \boxoffset\zeropoint
+ \nointerlineskip % really needed
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+%\fi
+ \egroup
+ \ignorespaces}
+
+% pass D
+
+\def\dophaseoneFLOWcellX#1#2%
+ {\!!counta#1\relax
+ \!!countb#2\relax
+ \!!countc\@@FLOWx
+ \!!countd\@@FLOWy
+ \advance\!!countc \@@FLOWnx
+ \advance\!!countd \@@FLOWny
+ \advance\!!countc \minusone
+ \advance\!!countd \minusone
+ \ifnum\!!counta<\@@FLOWx\relax \donefalse
+ \else\ifnum\!!counta>\!!countc \donefalse
+ \else\ifnum\!!countb<\@@FLOWy\relax \donefalse
+ \else\ifnum\!!countb>\!!countd \donefalse
+ \else \donetrue
+ \fi\fi\fi\fi}
+
+\def\dophasetwoFLOWcellX
+ {\advance\!!counta -\@@FLOWx
+ \advance\!!counta \plusone
+ \advance\!!countb -\@@FLOWy
+ \advance\!!countb \plusone
+ \dimen0=\FLOWgridwidth
+ \dimen0=\!!counta\dimen0
+ \advance\dimen0 -\FLOWgridwidth
+ \dimen4=\FLOWgridwidth
+ \advance\dimen4 -\FLOWshapewidth
+ \advance\dimen0 .5\dimen4
+ \dimen2=\FLOWgridheight
+ \dimen2=\!!countb\dimen2
+ \dimen4=\FLOWgridheight
+ \advance\dimen4 -\FLOWshapeheight
+ \advance\dimen2 -.5\dimen4
+ \edef\FLOWdx{\the\dimen0}%
+ \edef\FLOWdy{\the\dimen2}}
+
+\def\positionFLOWzero% assumes \FLOWdx and \FLOWdy are set
+ {\setbox0\hbox{\hskip\FLOWdx\lower\FLOWdy\box0}%
+ \smashbox0\box0
+ \nointerlineskip} % new, needed since we somehow reset that
+
+\def\doFLOWtlabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdy\fi
+ \setbox0\hbox{\hskip\dimen2\raise\scratchdimen
+ \hbox{\raise\dimen4\hbox{#1{\strut#3}}}}%
+ \positionFLOWzero}%
+
+\def\doFLOWblabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdy\fi
+ \setbox0\hbox{\hskip\dimen2\raise-\scratchdimen
+ \hbox{#1{\strut#3}}}%
+ \positionFLOWzero}%
+
+\def\doFLOWllabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdx\fi
+ \setbox0\hbox{\hskip-\scratchdimen\raise\dimen6
+ \hbox{#1{\strut#3}}}%
+ \positionFLOWzero}%
+
+\def\doFLOWrlabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdx\fi
+ \setbox0\hbox{\hskip\dimen0\hskip\scratchdimen
+ \hbox{\raise\dimen6\hbox{#1{\strut#3}}}}%
+ \positionFLOWzero}
+
+\def\doprocessFLOWcellD#1,#2\end
+ {\dophaseoneFLOWcellX{#1}{#2}%
+ \ifdone
+ \dophasetwoFLOWcellX
+ \doglobal\addtocommalist\FLOWcell\FLOWcells
+ \def\FLOWx{#1}%
+ \def\FLOWy{#2}%
+ \directsetup{flowcell}%
+ \setbox0\hbox
+ {\ifx\FLOWalign\empty\else
+ \setupframed
+ [\c!align=\v!normal,\c!bottom=\vfill,\c!top=\vfill]%
+ \@EA\processallactionsinset\@EA
+ [\FLOWalign]
+ [t=>{\setupframed[\c!bottom=\vfill,\c!top=]},
+ b=>{\setupframed[\c!bottom=,\c!top=\vfill]},
+ l=>{\setupframed[\c!align=\v!right]},
+ r=>{\setupframed[\c!align=\v!left]},
+ m=>{\setupframed[\c!align=\v!middle]},
+ c=>{\setupframed[\c!align=\v!middle]}]%
+ \fi
+ \doifelse\FLOWshape{none} % {\v!none}
+ {\setupframed[\c!offset=\v!overlay]}
+ {\setupframed[\c!offset=\@@FLOSoffset]}%
+ \framed
+ [\c!frame=\v!off,\c!background=flowcell,
+ \c!width=\FLOWshapewidth,\c!height=\FLOWshapeheight]
+ {\FLOWtext}}%
+ \showFLOWhelp0
+ \ifx\FLOWdestination\empty\else
+ \setbox0\hbox
+ {\setupinteraction[\c!color=,\c!contrastcolor=]%
+ \gotobox{\box0}[\FLOWdestination]}%
+ \fi
+ \positionFLOWzero
+ \dimen0=\FLOWshapewidth \dimen2=.5\dimen0
+ \dimen4=\FLOWshapeheight\dimen6=.5\dimen4
+ \boxoffset.5\bodyfontsize
+ \doFLOWtlabel \righttopbox0\tFLOWlabel
+ \doFLOWblabel\rightbottombox0\bFLOWlabel
+ \doFLOWllabel \lefttopbox0\lFLOWlabel
+ \doFLOWrlabel \righttopbox0\rFLOWlabel
+ \doFLOWtlabel \topbox0\tcFLOWlabel % for me only
+ \doFLOWblabel \bottombox0\bcFLOWlabel % for me only
+ \doFLOWllabel \leftbox0\lcFLOWlabel % for me only
+ \doFLOWrlabel \rightbox0\rcFLOWlabel % for me only
+ \ifnum#1=\@@FLOWx\relax \doFLOWllabel \leftbox1\lFLOWexit \fi
+ \ifnum#1=\!!countc \doFLOWrlabel \rightbox1\rFLOWexit \fi
+ \ifnum#2=\@@FLOWy\relax \doFLOWtlabel \topbox1\tFLOWexit \fi
+ \ifnum#2=\!!countd \doFLOWblabel \bottombox1\bFLOWexit \fi
+ \boxoffset\zeropoint
+ \fi}
+
+% For Willy Egger:
+%
+% \startsetups flowcell
+% \definelayer
+% [flowcell]
+% [width=\FLOWshapewidth,
+% height=\FLOWshapeheight]
+% \setlayerframed
+% [flowcell]
+% [preset=rightbottom,offset=1ex]
+% [frame=off]
+% {\tx(\FLOWx,\FLOWy)}
+% \stopsetups
+
+% Pass E
+
+\long\def\startFLOWcellE#1\stopFLOWcell
+ {\resetFLOWcell
+ \ignorespaces#1\unskip
+ \let\doprocessFLOWcell\doprocessFLOWcellE
+ \expandafter\doprocessFLOWcell\FLOWlocation\end}
+
+\def\doprocessFLOWcellE#1,#2\end % redundant
+ {\ifx\FLOWoverlay\empty \else
+ \dophaseoneFLOWcellX{#1}{#2}%
+ \ifdone
+ \dophasetwoFLOWcellX
+ \edef\FLOWdx{\the\dimen0}%
+ \edef\FLOWdy{\the\dimen2}%
+ \setbox0\hbox
+ {\framed
+ [%\c!frame=\v!off,
+ \c!background={\@@FLOWbackground,\FLOWoverlay},
+ \c!backgroundcolor=\@@FLOSbackgroundcolor,
+ \c!width=\FLOWshapewidth,\c!height=\FLOWshapeheight]
+ {}}%
+ \positionFLOWzero
+ \fi
+ \fi}
+
+% Pass F
+
+\def\checkFLOWautofocus
+ {\def\@@FLOWminx{100}\let\@@FLOWminy\@@FLOWminx
+ \def\@@FLOWmaxx {0}\let\@@FLOWmaxy\@@FLOWmaxx
+ \def\@@FLOWabsx {0}\let\@@FLOWabsy\@@FLOWabsx
+ \let\startFLOWcell\startFLOWcellF
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+ %\message{AUTOSHAPE 1: (\@@FLOWminx,\@@FLOWminy)->(\@@FLOWmaxx,\@@FLOWmaxy)}%
+ \ifnum\@@FLOWabsx<\@@FLOWmaxx\let\@@FLOWmaxx\@@FLOWabsx\fi
+ \ifnum\@@FLOWabsy<\@@FLOWmaxy\let\@@FLOWmaxy\@@FLOWabsy\fi
+ %\message{AUTOSHAPE 2: (\@@FLOWminx,\@@FLOWminy)->(\@@FLOWmaxx,\@@FLOWmaxy)}%
+ \donetrue
+ \ifnum\@@FLOWminx=100 \donefalse\fi
+ \ifnum\@@FLOWminy=100 \donefalse\fi
+ \ifnum\@@FLOWmaxx=0 \donefalse\fi
+ \ifnum\@@FLOWmaxy=0 \donefalse\fi
+ \doFLOWcheckF\@@FLOWx\@@FLOWminx\@@FLOWmaxx\@@FLOWnx
+ \doFLOWcheckF\@@FLOWy\@@FLOWminy\@@FLOWmaxy\@@FLOWny}
+
+\def\startFLOWcellF#1\stopFLOWcell%
+ {\resetFLOWcell
+ \ignorespaces#1\unskip
+ \expandafter\doFLOWlocationF\FLOWlocation\end}%
+
+\def\doFLOWlocationF#1,#2\end%
+ {\ifnum#1>\@@FLOWabsx\def\@@FLOWabsx{#1}\fi
+ \ifnum#2>\@@FLOWabsy\def\@@FLOWabsy{#2}\fi
+ \doifinset\FLOWcell\@@FLOWautofocus
+ {\dodoFLOWlocationF{#1}<-\@@FLOWminx
+ \dodoFLOWlocationF{#1}>+\@@FLOWmaxx
+ \dodoFLOWlocationF{#2}<-\@@FLOWminy
+ \dodoFLOWlocationF{#2}>+\@@FLOWmaxy}}
+
+\def\dodoFLOWlocationF#1#2#3#4%
+ {\ifnum#1#2#4\relax
+ \!!counta=#1\advance\!!counta #31\relax
+ \edef#4{\ifnum\!!counta<1 1\else\the\!!counta\fi}%
+ \fi}
+
+\def\doFLOWcheckF#1#2#3#4%
+ {\ifdone
+ \let#1=#2%
+ \!!counta=#3%
+ \advance\!!counta \plusone\advance\!!counta -#2\relax
+ \ifnum\!!counta<1 \!!counta=1 \fi
+ \edef#4{\the\!!counta}%
+ \else
+ \let#1\!!plusone
+ \let#4\!!zerocount % no {1}
+ \fi}
+
+% \useFLOWchart[name][parent][setting,setting][additional settings]
+% \useFLOWchart[name][parent][additional settings]
+
+\let\currentFLOWchart\empty
+
+\def\useFLOWchart
+ {\doquadrupleempty\douseFLOWchart}
+
+\def\douseFLOWchart[#1][#2][#3][#4]% name parent sets mainsettings
+ {\iffourthargument
+ \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][#3][#4,##1]}%
+ \else
+ \checkparameters[#3]%
+ \ifparameters
+ \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][][#3,##1]}%
+ \else
+ \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][#3][##1]}%
+ \fi
+ \fi}
+
+\def\setgetFLOWchart[#1][#2][#3]%
+ {\def\docommand##1{}% cell line focus ?
+ \processcommalist[#2]\docommand
+ \getFLOWchart[#1][#3]}
+
+\def\doFLOWchart[#1][#2]%
+ {\hbox\bgroup\vbox\bgroup % vmode suppresses spaces
+\def\currentFLOWchart{#1}%
+ \doifundefinedelse{\@FLOW@--#1}
+ {\getFLOWchart[#1][#2]}
+ {\getvalue{\@FLOW@--#1}[#2]}%
+ \egroup\egroup}
+
+\def\FLOWchart%
+ {\dodoubleempty\doFLOWchart}
+
+%D A hook into the help system.
+
+% \def\showFLOWhelp#1%
+% {\doifhelpinfo\FLOWhelp
+% {\setbox#1=\hbox
+% {\setbox\scratchbox=\hbox{\lower\@@FLOWdy\hbox
+% {\helpbutton
+% [\c!width=\wd0,\c!color=,\c!height=\@@FLOWdy,\c!frame=\v!no]%
+% [\FLOWhelp]}}%
+% \smashbox\scratchbox
+% \setbox#1=\vbox
+% {\forgetall\offinterlineskip\box#1\box\scratchbox}%
+% \box#1}}}
+
+\def\showFLOWhelp#1%
+ {}
+
+%D The next section is dedicated to splitting up charts.
+
+\def\getFLOWsize[#1]%
+ {\bgroup\let\dodogetFLOWchart\dogetFLOWsize\FLOWchart[#1]\egroup}
+
+\def\dogetFLOWsize[#1][#2]%
+ {\setbox\scratchbox=\vbox
+ {\globallet\FLOWmaxwidth \!!zerocount
+ \globallet\FLOWmaxheight\!!zerocount
+ \def\getFLOWlocation##1,##2\end
+ {\ifnum0##1>\FLOWmaxwidth \xdef\FLOWmaxwidth {##1}\fi
+ \ifnum0##2>\FLOWmaxheight\xdef\FLOWmaxheight{##2}\fi}%
+ \resetFLOWcell
+ \long\def\startFLOWcell##1\stopFLOWcell
+ {{##1\expandafter\getFLOWlocation\FLOWlocation\end}}%
+ \def\dohandleflowchart[##1][##2]%
+ {\resetFLOWlocation
+ \processFLOWbuffer{##1}}%
+ \getvalue{\@FLOW@-#1}}}
+
+\def\setupFLOWsplit%
+ {\dodoubleargument\getparameters[\@@FLOT]}
+
+\setupFLOWsplit%
+ [\c!nx=3,\c!ny=3,
+ \c!dx=1,\c!dy=1,
+ \c!command=,
+ \c!marking=\v!on,
+ \c!before=,\c!after=]
+
+\def\FLOWsplitx {1}
+\def\FLOWsplity {1}
+\def\FLOWsplitnx{1}
+\def\FLOWsplitny{1}
+
+\def\FLOWcharts%
+ {\dodoubleempty\doFLOWcharts}
+
+%D While splitting, the following variables are available:
+%D
+%D \starttyping
+%D \FLOWsplitnx \FLOWsplitny \FLOWsplitx \FLOWsplity
+%D \stoptyping
+
+\def\doFLOWcharts[#1][#2]%
+ {\bgroup
+ \getFLOWsize[#1]%
+ \dodoFLOWcharts\relax
+ \global\let\FLOWsplitnx\FLOWsplitx
+ \global\let\FLOWsplitny\FLOWsplity
+ \dodoFLOWcharts{\dododoFLOWcharts[#1][#2]}%
+ \egroup}
+
+\def\dodoFLOWcharts#1%
+ {\def\@@FLOTx{1}%
+ \global\let\FLOWsplitx\@@FLOTx
+ \doloop
+ {\def\@@FLOTy{1}%
+ \global\let\FLOWsplity\@@FLOTy
+ \doloop
+ {\bgroup
+ \scratchcounter\FLOWmaxwidth
+ \advance\scratchcounter -\@@FLOTx
+ \advance\scratchcounter \plusone
+ \ifnum\scratchcounter<\@@FLOTnx\edef\@@FLOTnx{\the\scratchcounter}\fi
+ \scratchcounter\FLOWmaxheight
+ \advance\scratchcounter -\@@FLOTy
+ \advance\scratchcounter \plusone
+ \ifnum\scratchcounter<\@@FLOTny\edef\@@FLOTny{\the\scratchcounter}\fi
+ #1% does something with the float, or not
+ \egroup
+ \increment(\@@FLOTy,\@@FLOTny)%
+ \ifnum\@@FLOTy>\FLOWmaxheight
+ \exitloop
+ \else
+ \doglobal\increment\FLOWsplity
+ \decrement(\@@FLOTy,\@@FLOTdy)%
+ \fi}%
+ \increment(\@@FLOTx,\@@FLOTnx)%
+ \ifnum\@@FLOTx>\FLOWmaxwidth
+ \exitloop
+ \else
+ \doglobal\increment\FLOWsplitx
+ \decrement(\@@FLOTx,\@@FLOTdx)%
+ \fi}}
+
+\def\dododoFLOWcharts[#1][#2]%
+ {\bgroup
+ \@@FLOTbefore
+ \doifnot\@@FLOTmarking\v!on{\let\cuthbox\hbox}%
+ \cuthbox
+ {\@@FLOTcommand
+ {\FLOWchart[#1][#2,
+ \c!x=\@@FLOTx,\c!nx=\@@FLOTnx,
+ \c!y=\@@FLOTy,\c!ny=\@@FLOTny]}}%
+ \@@FLOTafter
+ \egroup}
+
+%D An example of splitting is given below:
+%D
+%D \starttyping
+%D \setupFLOWsplit
+%D [nx=5,ny=10,
+%D dx=0,dy=0,
+%D before=,
+%D after=\page]
+%D
+%D \FLOWcharts[mybigflow]
+%D \stoptyping
+%D
+%D Or, one can say:
+%D
+%D \starttyping
+%D \splitfloat
+%D {\placefigure{What a big flowchart this is!}}
+%D {\FLOWcharts[mybigflow]}
+%D \stoptyping
+
+%D \macros
+%D {typeFLOWchart}
+%D
+%D For documentation purposes the following macro is
+%D provided. Watch the use of the first and last line hooks,
+%D which is needed because the start and stop commands are
+%D not part of the buffer.
+
+\def\typeFLOWchart[#1]%
+ {\bgroup
+ \def\dohandleflowchart[##1][##2]{\typeFLOWbuffer{##1}}%
+ \defconvertedargument\firstverbatimfileline{\startFLOWchart[#1]}%
+ \defconvertedargument\lastverbatimfileline {\stopFLOWchart}%
+ \getvalue{\@FLOW@-#1}
+ \egroup}
+
+%D New:
+%D
+%D \starttyping
+%D \setupFLOWcharts[command=\Whow]
+%D
+%D \startFLOWset[convert-en] % [tag][convert-en]
+%D \subFLOWchart[a][x=1,y=1,nx=3,ny=3]
+%D \subFLOWchart[b][x=1,y=2,nx=3,ny=3]
+%D \subFLOWchart[c][x=2,y=1,nx=3,ny=3]
+%D \stopFLOWset
+%D
+%D \def\Whow#1%
+%D {\ifnum\currentFLOWset=1 \framed{Some Chart}\fi}
+%D
+%D \FLOWset[convert-en] % [tag]
+%D
+%D \def\Whow#1%
+%D {\setuphead[state=high]
+%D \startstandardmakeup
+%D \centerbox{#1}
+%D \stopstandardmakeup}
+%D
+%D \FLOWset[convert-en] % [tag]
+%D \stoptyping
+
+\def\startFLOWset
+ {\dodoubleempty\dostartFLOWset}
+
+\def\dostartFLOWset[#1][#2]#3\stopFLOWset % tag name data
+ {\ifsecondargument
+ \long\setvalue{\@FLOX@#1}{\dohandleFLOWset{#1}{#2}{#3}}%
+ \else
+ \long\setvalue{\@FLOX@#1}{\dohandleFLOWset{#1}{#1}{#3}}%
+ \fi}
+
+\long\def\dohandleFLOWset#1#2#3% tag name data
+ {\bgroup
+ \def\subFLOWchart
+ {\dodoubleempty\dosubFLOWchart}%
+ \def\dosubFLOWchart[##1][##2]% subtag settings
+ {\ifsecondargument
+ \dodohandleFLOWset{#1}{##1}{#2}{##2}%
+ \else
+ \subFLOWchart[][##1]%
+ \fi}%
+ #3%
+ \egroup}
+
+\def\dodohandleFLOWset#1#2#3#4% tag subtag name settings
+ {\increment\currentFLOWset
+ \bgroup
+ \@@FLOXcommand
+ {\ifnum\currentFLOWset=1 \pagereference[#1]\fi
+ \doifsomething{#2}
+ {\setupreferencing[\c!prefix=]%
+ \pagereference[#1:#2]% -:#1:#2
+ \setupreferencing[\c!prefix=#1:#2]}%
+ \FLOWchart[#3][#4]}%
+ \egroup}
+
+\def\FLOWset[#1]%
+ {\newcounter\currentFLOWset
+ \doifdefinedelse{\@FLOX@#1}
+ {\getvalue{\@FLOX@#1}}
+ {\dodohandleFLOWset{#1}{}{#1}{}}}
+
+\newcounter\currentFLOWset
+
+\setupFLOWsets
+ [\c!command=]
+
+%D This will be an option:
+
+% \def\startFLOWchart%
+% {\dodoubleempty\dostartFLOWchart}
+%
+% \long\def\dostartFLOWchart[#1][#2]#3\stopFLOWchart
+% {\preparenextFLOWchart{#1}{#2}%
+% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}}
+%
+% \long\def\dodefineFLOWchart[#1][#2]#3%
+% {\preparenextFLOWchart{#1}{#2}%
+% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}}
+%
+% \def\processFLOWbuffer#1{\getvalue{\FLOWbufferprefix#1}}
+% \def\typeFLOWbuffer #1{[Sorry, no verbatim chart #1 available.]}
+% todo: \localpushmacro/\localpopmacro (dohandleflowchart etc)
+% todo: make mkiv variant
+% todo: use dimexpr/numspr
+
+% will be redone with layers and dimexpr or even better, by just using
+% textext .. a nice example of old code
+
+%D This is an experimental module. Pieces of code will be moved
+%D to other modules. More features are possible but will be
+%D interfaces later.
+%D
+%D When finished this module will be documented. The main macro
+%D is still a rather big one and there is some redundant and
+%D slow code that needs a clean up.
+
+% arrow, dash
+% crossing
+% \goto -> \normalgoto
+% class -> class:name (ref prefix)
+% c, automatisch geen overlap zoeken
+% eind eerder chart connecties
+% relateren aan korps
+% check op bestaan naam, bestaan shape
+% auto als extern figuur
+% subchart
+% pijlen
+% focus
+% ook nog \MPmessage
+% areapath -> krappe vlak
+% clippath -> gehele vlak
+%
+% offset : clip offset
+% breedte : breedte cel
+% hoogte : hoogte cel
+% dx : halve afstand in breedte (grid breedte = breedte + 2dx)
+% dy : halve afstand in hoogte (grid hoogte = hoogte + 2dy)
+% x : x offset (clipping)
+% y : y offset (clipping)
+% nx : minimaal aantal cellen horizontaal
+% ny : minimaal aantal cellen vertikaal
+%
+% shape none en geen equivalent maken
+%
+% kaderkleur achtergrondkleur
+% lijnkleur lijndikte
+% focus focuskaderkleur focusachtergrondkleur
+% richting
+%
+% focus koppelen aan kleur
+
+\unprotect
+
+\definesorting [flowchart] [flowcharts] [\v!none] % no access
+\setupsorting [flowchart] [\c!state=\v!stop] % off by default
+
+\def\@FLOW@{@FLOW@}
+\def\@FLOC@{@FLOC@}
+\def\@FLOX@{@FLOX@}
+
+\def\@@FLOW{@@FLOW}
+\def\@@FLOL{@@FLOL}
+\def\@@FLOS{@@FLOS}
+\def\@@FLOF{@@FLOF}
+\def\@@FLOT{@@FLOT}
+\def\@@FLOX{@@FLOX}
+
+\def\@@MPx {@@MPx}
+\def\@@MPy {@@MPy}
+
+\def\FLOWbufferprefix{flw-}
+
+\def\processFLOWbuffer#1{\getbuffer[\FLOWbufferprefix#1]}
+\def\typeFLOWbuffer #1{\typebuffer[\FLOWbufferprefix#1]}
+
+\def\setFLOWname#1#2% funny hack that makes sure that we get
+ {\bgroup % names that are acceptable for METAPOST
+ \lccode`0=`a\lccode`1=`b\lccode`2=`c\lccode`3=`d\lccode`4=`e%
+ \lccode`5=`f\lccode`6=`g\lccode`7=`h\lccode`8=`i\lccode`9=`j%
+ \lccode` =`\_\lccode`-=`\_\lccode`_=`\_%
+ \lowercase{\gdef#1{#2}}%
+ \egroup}
+
+% een gobble als default is sneller, en dan alleen setten als
+% nodig
+
+\def\resetFLOWcell
+ {% variables
+ \global\let\FLOWname \empty
+ \global\let\FLOWalign \empty
+ \global\let\FLOWshape \empty
+ \global\let\FLOWlocation \empty
+ \global\let\FLOWtext \empty
+ \global\let\FLOWhelp \empty
+ \global\let\FLOWdestination\empty
+ \global\let\FLOWoverlay \empty
+ \global\let\FLOWfocus \empty
+ \global\let\tFLOWlabel \empty
+ \global\let\bFLOWlabel \empty
+ \global\let\lFLOWlabel \empty
+ \global\let\rFLOWlabel \empty
+ \global\let\bcFLOWlabel \empty
+ \global\let\tcFLOWlabel \empty
+ \global\let\lcFLOWlabel \empty
+ \global\let\rcFLOWlabel \empty
+ \global\let\tFLOWexit \empty
+ \global\let\bFLOWexit \empty
+ \global\let\lFLOWexit \empty
+ \global\let\rFLOWexit \empty
+ % commands
+ \let\name \doFLOWname
+ \let\shape \doFLOWshape
+ \let\destination\doFLOWdestination
+ \let\location \doFLOWlocation
+ \let\focus \doFLOWfocus
+ \let\overlay \doFLOWoverlay
+ \let\figure \doFLOWfigure
+ \let\text \doFLOWtext
+ \let\comment \doFLOWcomment
+ \let\label \doFLOWlabel
+ \let\help \doFLOWhelp
+ \let\connection \doFLOWconnection
+ \let\exit \doFLOWexit
+ % convenience commands
+ \let\locate \doFLOWlocate
+ \let\connect \doFLOWconnect}
+
+\let\FLOWcell \s!unknown
+\let\FLOWshape \s!unknown
+\let\FLOWdestination\s!unknown
+\let\FLOWfocus \s!unknown
+\let\FLOWoverlay \empty
+\let\FLOWtext \empty
+
+\def\doFLOWname#1%
+ {\def\FLOWcell{#1}\setFLOWname\FLOWname{name_#1}\ignorespaces}
+
+\def\doFLOWshape#1%
+ {\gdef\FLOWshape{#1}\ignorespaces}
+
+\def\doFLOWdestination#1%
+ {\gdef\FLOWdestination{#1}\ignorespaces}
+
+\def\doFLOWlocation#1%
+ {\setFLOWlocation#1\end\ignorespaces}
+
+\def\doFLOWfocus#1%
+ {\gdef\FLOWfocus{#1}\ignorespaces}
+
+\def\doFLOWoverlay#1%
+ {\gdef\FLOWoverlay{#1}\ignorespaces}
+
+\def\doFLOWfigure#1%
+ {\defineoverlay[\s!dummy][\overlayfigure{#1}]%
+ \overlay\s!dummy}
+
+\def\doFLOWtext
+ {\dosingleempty\dodoFLOWtext}
+
+\def\dodoFLOWtext[#1]% % #2%
+ {\gdef\FLOWalign{#1}\gdef\FLOWtext}% {#2}}
+
+\def\doFLOWcomment[#1]#2%
+ {\ignorespaces\dogobblesingleempty}
+
+\def\doFLOWlabel[#1]#2% wordt dit gebruikt ?
+ {\setgvalue{#1FLOWlabel}{#2}\ignorespaces}
+
+\def\doFLOWhelp#1%
+ {\gdef\FLOWhelp{#1}\ignorespaces}
+
+\def\doFLOWconnection
+ {\dodoubleempty\dodoFLOWconnection}
+
+\def\dodoFLOWconnection[#1][#2]#3%
+ {\ignorespaces}
+
+\def\doFLOWconnect
+ {\connection}
+
+\def\doFLOWlocate
+ {\location}
+
+\def\doFLOWexit[#1]#2%
+ {\setgvalue{#1FLOWexit}{#2}\ignorespaces}
+
+\def\startFLOWchart
+ {\bgroup
+ \let\stopFLOWchart\egroup
+ \obeylines % lelijk, buffers nog eens fatsoeneren
+ \dodoubleempty\dostartFLOWchart}
+
+\def\dostartFLOWchart[#1][#2]%
+ {\preparenextFLOWchart{#1}{#2}%
+ \dostartbuffer[\FLOWbufferprefix\nofFLOWcharts][startFLOWchart][stopFLOWchart]}
+
+\def\defineFLOWchart%
+ {\dodoubleempty\dodefineFLOWchart}
+
+\long\def\dodefineFLOWchart[#1][#2]#3%
+ {\preparenextFLOWchart{#1}{#2}%
+ \setbuffer[\FLOWbufferprefix\nofFLOWcharts]#3\endbuffer}
+
+\def\preparenextFLOWchart#1#2%
+ {\doglobal\increment\nofFLOWcharts
+ \flowchart{#1}%
+ \setxvalue{\@FLOW@-#1}{\noexpand\dohandleflowchart[\nofFLOWcharts][#2]}}
+
+\def\setupFLOWcharts{\dodoubleargument\getparameters[\@@FLOW]}
+\def\setupFLOWlines {\dodoubleargument\getparameters[\@@FLOL]}
+\def\setupFLOWshapes{\dodoubleargument\getparameters[\@@FLOS]}
+\def\setupFLOWfocus {\dodoubleargument\getparameters[\@@FLOF]}
+\def\setupFLOWsets {\dodoubleargument\getparameters[\@@FLOX]}
+
+\setupFLOWcharts
+ [\c!option=,
+ \c!bodyfont=,
+ \c!dot=, % private option
+ \c!width=12\bodyfontsize,
+ \c!height=7\bodyfontsize,
+ \c!maxwidth=,
+ \c!maxheight=,
+ \c!offset=\v!standard, % == auto offset
+ \c!dx=2\bodyfontsize,
+ \c!dy=2\bodyfontsize,
+ \c!nx=0, % 1,
+ \c!ny=0, % 1,
+ \c!x=1,
+ \c!y=1,
+ \c!autofocus=,
+ \c!focus=,
+ \c!background=, % \v!color,
+ \c!backgroundcolor=\s!white,
+ \c!rulethickness=\linewidth,
+ \c!frame=\v!off,
+ \c!framecolor=]
+
+\setupFLOWlines
+ [\c!corner=\v!round,
+ \c!arrow=\v!yes,
+ \c!dash=\v!no,
+ \c!radius=.375\bodyfontsize, % 2.5\c!rulethickness
+ \c!color=FLOWlinecolor,
+ \c!rulethickness=.15\bodyfontsize, % 2pt,
+ \c!offset=\v!none]
+
+\setupFLOWshapes
+ [\c!default=action,
+ \c!framecolor=FLOWframecolor,
+ \c!background=\v!color,
+ \c!backgroundcolor=FLOWbackgroundcolor,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!rulethickness=.15\bodyfontsize, % 2pt,
+ \c!offset=.5\bodyfontsize]
+
+\setupFLOWfocus
+ [\c!framecolor=FLOWfocuscolor,
+ \c!background=\@@FLOSbackground,
+ \c!backgroundcolor=\@@FLOSbackgroundcolor,
+ \c!backgroundscreen=\@@FLOSbackgroundscreen,
+ \c!rulethickness=\@@FLOSrulethickness,
+ \c!offset=\@@FLOSoffset]
+
+\definecolor [FLOWfocuscolor] [s=.2]
+\definecolor [FLOWlinecolor] [s=.5]
+\definecolor [FLOWframecolor] [s=.7]
+\definecolor [FLOWbackgroundcolor] [s=.9]
+
+\newcounter\includeFLOWx
+\newcounter\includeFLOWy
+
+\def\includeFLOWchart
+ {\dodoubleempty\doincludeFLOWchart}
+
+\def\doincludeFLOWchart[#1][#2]%
+ {\pushmacro\includeFLOWx
+ \pushmacro\includeFLOWy
+ \getparameters[FLOWi][x=1,y=1,#2]%
+ \increment(\includeFLOWx,0\FLOWix)\decrement\includeFLOWx
+ \increment(\includeFLOWy,0\FLOWiy)\decrement\includeFLOWy
+ \def\dodoincludeFLOWchart##1%
+ {\doifdefined{\@FLOW@-##1}
+ {\globalpushmacro\dohandleflowchart % was local
+ \gdef\dohandleflowchart[####1][####2]%
+ {\globalpopmacro\dohandleflowchart % was local
+ \resetFLOWlocation
+ \processFLOWbuffer{####1}}%
+ \getvalue{\@FLOW@-##1}}}%
+ \processcommalist[#1]\dodoincludeFLOWchart
+ \popmacro\includeFLOWx
+ \popmacro\includeFLOWy}
+
+\def\resetFLOWlocation
+ {\globallet\lastFLOWx\!!zerocount
+ \globallet\lastFLOWy\!!zerocount}
+
+\def\dosetFLOWlocation[#1#2]#3#4%
+ {\processaction
+ [#1#2]
+ [ +=>\scratchcounter\numexpr#4+ 1+#3\relax,
+ -=>\scratchcounter\numexpr#4- 1+#3\relax,
+ +#2=>\scratchcounter\numexpr#4+#2+#3\relax,
+ -#2=>\scratchcounter\numexpr#4-#2+#3\relax,
+ \s!default=>\scratchcounter\numexpr#4 +#3\relax,
+ \s!unknown=>\scratchcounter\numexpr0#1#2+#3\relax]%
+ \xdef#4{\the\scratchcounter}}
+
+\def\setFLOWlocation#1,#2\end
+ {\dosetFLOWlocation[#1\empty]\includeFLOWx\lastFLOWx
+ \dosetFLOWlocation[#2\empty]\includeFLOWy\lastFLOWy
+ \xdef\FLOWlocation{\lastFLOWx,\lastFLOWy}}
+
+\def\FLOWshapes
+ {node, action, procedure, product, decision, archive,
+ loop, wait, subprocedure, singledocument, multidocument,
+ sub procedure, single document, multi document, up, down,
+ left, right}
+
+\def\FLOWlines
+ {up, down, left, right}
+
+\def\FLOWsetconnect#1%
+ {\donefalse
+ \let\cFLOWfrom\empty
+ \let\cFLOWto\empty
+ \let\zFLOWfrom\!!zerocount
+ \let\zFLOWto\!!zerocount
+ \handletokens#1\with\doFLOWsetconnect
+ \ifx\cFLOWto\empty\let\cFLOWfrom\empty\fi}
+
+\def\doFLOWsetconnect#1%
+ {\ifx #1p%
+ \ifdone\def\zFLOWto{+1}\else\def\zFLOWfrom{+1}\fi
+ \else\ifx#1+%
+ \ifdone\def\zFLOWto{+1}\else\def\zFLOWfrom{+1}\fi
+ \else\ifx#1n%
+ \ifdone\def\zFLOWto{-1}\else\def\zFLOWfrom{-1}\fi
+ \else\ifx#1-%
+ \ifdone\def\zFLOWto{-1}\else\def\zFLOWfrom{-1}\fi
+ \else\ifdone
+ \edef\cFLOWto{\FLOWconnector#1}%
+ \else
+ \edef\cFLOWfrom{\FLOWconnector#1}%
+ \donetrue
+ \fi\fi\fi\fi\fi}
+
+\def\FLOWconnector#1%
+ {\if#1bbottom\else\if#1ttop\else\if#1lleft\else\if#1rright\fi\fi\fi\fi}
+
+\newif\ifFLOWscaling \FLOWscalingtrue
+
+\def\@@FLOW@@offset{\@@FLOWoffset}
+
+\def\getFLOWchart
+ {\dodoubleempty\dogetFLOWchart}
+
+\def\dogetFLOWchart[#1][#2]%
+ {\doifundefinedelse{\@FLOW@-#1}
+ {\writestatus{FLOW}{unknown chart #1}%
+ \framed
+ [\c!width=12\bodyfontsize,\c!height=8\bodyfontsize]
+ {\tttf [chart #1]}}
+ {\dodogetFLOWchart[#1][#2]}}
+
+\def\dodogetFLOWchart[#1][#2]% to be split a bit more
+ {\vbox\bgroup
+ \insidefloattrue
+ \forgetall
+ \dontcomplain
+ % \offinterlineskip % we now explicitly use \nointerlineskip later on
+ \def\dohandleflowchart[##1][##2]%
+ {\def\currentFLOWnumber{##1}%
+ \getparameters[\@@FLOW][##2]}%
+ \getvalue{\@FLOW@-#1}%
+ \getparameters[\@@FLOW][#2]% dubbelop ?
+ \doifsomething{\@@FLOWautofocus}
+ {\checkFLOWautofocus}%
+ %\message{AUTOSHAPE 3: (\@@FLOWx,\@@FLOWy)->(\@@FLOWnx,\@@FLOWny)}\wait
+ \global\let\FLOWwidth \@@FLOWnx
+ \global\let\FLOWheight\@@FLOWny
+ \let\startFLOWcell\startFLOWcellA
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+ \ifcase\@@FLOWnx\relax \let\@@FLOWnx\FLOWwidth \fi
+ \ifcase\@@FLOWny\relax \let\@@FLOWny\FLOWheight \fi
+ \doifnothing{\@@FLOWmaxwidth\@@FLOWmaxheight}{\FLOWscalingfalse}%
+ \ifFLOWscaling
+ \doifnothing{\@@FLOWmaxwidth }{\let\@@FLOWmaxwidth \maxdimen}%
+ \doifnothing{\@@FLOWmaxheight}{\let\@@FLOWmaxheight\maxdimen}%
+ \scratchcounter\bodyfontpoints
+ \doloop % NOG FONTSWITCH OM EX EN EM TE LATEN WERKEN
+ {\ifnum\scratchcounter>1 % NU DIMENSIONS IN TERMS OF BODYFONTSIZE
+ \bodyfontsize=\the\scratchcounter pt
+ \dimen0=\@@FLOWmaxwidth
+ \dimen2=\@@FLOWwidth
+ \dimen4=\@@FLOWdx
+ \advance\dimen2 2\dimen4
+ \dimen2=\@@FLOWnx\dimen2
+ \advance\dimen2 2\dimen4
+ \ifdim\dimen2>\dimen0
+ \advance\scratchcounter \minusone
+ \else
+ \dimen0=\@@FLOWmaxheight
+ \dimen2=\@@FLOWheight
+ \dimen4=\@@FLOWdy
+ \advance\dimen2 2\dimen4
+ \dimen2=\@@FLOWny\dimen2
+ \advance\dimen2 2\dimen4
+ \ifdim\dimen2>\dimen0
+ \advance\scratchcounter \minusone
+ \else
+ \exitloop
+ \fi
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ \expanded{\switchtobodyfont[\the\scratchcounter pt]}%
+ \forgetall
+ % \offinterlineskip % needed ?
+ \else\ifx\@@FLOWbodyfont\empty\else
+ \expanded{\switchtobodyfont[\@@FLOWbodyfont]}% \expanded ?
+ \fi\fi
+ \global\let\FLOWcells\empty
+ \dimen0=\@@FLOWwidth
+ \edef\FLOWshapewidth{\the\dimen0}%
+ \dimen2=\@@FLOWdx
+ \advance\dimen0 2\dimen2
+ \edef\FLOWgridwidth{\the\dimen0}%
+ \dimen0=\@@FLOWheight
+ \edef\FLOWshapeheight{\the\dimen0}%
+ \dimen2=\@@FLOWdy
+ \advance\dimen0 2\dimen2
+ \edef\FLOWgridheight{\the\dimen0}%
+ \scratchdimen=\@@FLOSrulethickness
+ \edef\@@FLOSrulethickness{\the\scratchdimen}%
+ \scratchdimen=\@@FLOFrulethickness
+ \edef\@@FLOFrulethickness{\the\scratchdimen}%
+ \scratchdimen=\@@FLOLrulethickness
+ \edef\@@FLOLrulethickness{\the\scratchdimen}%
+ \ifdim\@@FLOLradius<2.5\scratchdimen
+ \scratchdimen=2.5\scratchdimen
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \ifdim\@@FLOLradius>\@@FLOWdx
+ \scratchdimen=\@@FLOWdx
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \fi
+ \ifdim\@@FLOLradius>\@@FLOWdy
+ \scratchdimen=\@@FLOWdy
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \fi
+ \else
+ \scratchdimen=\@@FLOLradius
+ \edef\@@FLOLradius{\the\scratchdimen}%
+ \fi
+ \processaction % magic 2.5
+ [\@@FLOWoffset]
+ [ \v!none=>\scratchdimen=-2.5\scratchdimen,
+ \v!overlay=>\scratchdimen=-2.5\scratchdimen,
+ \v!standard=>\scratchdimen=\scratchdimen,
+ \s!unknown=>\scratchdimen=\@@FLOWoffset,
+ \s!default=>\scratchdimen=-2.5\scratchdimen]%
+ \edef\@@FLOW@@offset{\the\scratchdimen}%
+ \forgetall
+ \offinterlineskip
+ \resetMPdrawing
+ \doglobal\newcounter\FLOWcomment
+ \startMPdrawing
+ if unknown context_char : input mp-char.mp ; fi ;
+ grid_width := \FLOWgridwidth ;
+ grid_height := \FLOWgridheight ;
+ shape_width := \FLOWshapewidth ;
+ shape_height := \FLOWshapeheight ;
+ connection_line_width := \@@FLOLrulethickness ;
+ connection_smooth_size := \@@FLOLradius ;
+ connection_arrow_size := \@@FLOLradius ;
+ connection_dash_size := \@@FLOLradius ;
+ currentpicture := nullpicture ;
+ begin_chart(0,\FLOWwidth,\FLOWheight);
+ reverse_y := true ;
+ chart_offset := \@@FLOW@@offset ;
+ \stopMPdrawing
+ \doifelsenothing\@@FLOWbackgroundcolor
+ {\startMPdrawing
+ chart_background_color := white ;
+ \stopMPdrawing}
+ {\startMPdrawing
+ chart_background_color := \MPcolor{\@@FLOWbackgroundcolor} ;
+ \stopMPdrawing}%
+ \doif\@@FLOWoption\v!test
+ {\startMPdrawing
+ show_con_points := true ;
+ show_mid_points := true ;
+ show_all_points := true ;
+ \stopMPdrawing}%
+ \processaction % private
+ [\@@FLOWdot]
+ [ \v!yes=>\startMPdrawing
+ show_con_points := true ;
+ show_mid_points := true ;
+ show_all_points := true ;
+ \stopMPdrawing,
+ \s!unknown=>\startMPdrawing
+ show_\@@FLOWdot _points := true ;
+ \stopMPdrawing]%
+\doglobal\newcounter\FLOWcomment
+ \let\startFLOWcell\startFLOWcellB
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+\doglobal\newcounter\FLOWcomment
+ \let\startFLOWcell\startFLOWcellC
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+ \startMPdrawing
+ clip_chart(\@@FLOWx,\@@FLOWy,\@@FLOWnx,\@@FLOWny) ;
+ end_chart ;
+ \stopMPdrawing
+ \MPdrawingdonetrue
+ \setbox0\hbox
+ {\MPstaticgraphictrue
+ \MPshiftdrawingfalse
+ \getMPdrawing}%
+ \def\MPmessage##1%
+ {\writestatus{MP charts}{##1}}%
+ \def\MPposition##1##2##3%
+ {\setvalue{\@@MPx##1}{##2}\setvalue{\@@MPy##1}{##3}}%
+ \def\MPclippath##1##2##3##4%
+ {\def\clipMPllx{##1bp}\def\clipMPlly{##2bp}%
+ \def\clipMPurx{##3bp}\def\clipMPury{##4bp}}%
+ \def\MPareapath##1##2##3##4%
+ {\def\areaMPllx{##1bp}\def\areaMPlly{##2bp}%
+ \def\areaMPurx{##3bp}\def\areaMPury{##4bp}}%
+ \getMPdata
+ \doglobal\newcounter\FLOWcomment
+ \let\startFLOWcell\startFLOWcellD
+ \setbox2\vbox to \ht0
+ {\forgetall % \offinterlineskip
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber\vss}%
+ \setbox2\hbox
+ {\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box2}%
+ \wd2\wd0\ht2\ht0\dp2\dp0
+ \let\startFLOWcell\startFLOWcellE
+ \setbox4\vbox to \ht0
+ {\forgetall % \offinterlineskip
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber\vss}%
+ \setbox4\hbox
+ {\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box4}%
+ \wd4\wd0\ht4\ht0\dp4\dp0
+ \doifelse\@@FLOWoption\v!test
+ {\setbox6\vbox
+ {\forgetall
+ \vskip\@@FLOW@@offset
+ \hskip\@@FLOW@@offset
+ \basegrid
+ [\c!x=\@@FLOWx,\c!nx=\@@FLOWnx,\c!dx=\withoutpt\FLOWgridwidth,
+ \c!y=\@@FLOWy,\c!ny=\@@FLOWny,\c!dy=\withoutpt\FLOWgridheight,
+ \c!xstep=1,\c!ystep=1,
+ \c!unit=pt,\c!location=\v!middle]}%
+ \wd6\wd0\ht6\ht0\dp6\dp0
+ \setbox8\vbox
+ {\forgetall
+ \offinterlineskip
+ \vskip\@@FLOW@@offset
+ \dostepwiserecurse\@@FLOWy\@@FLOWny\plusone
+ {\vbox to \FLOWgridheight
+ {\vfill
+ \hskip\@@FLOW@@offset
+ \hbox
+ {\dostepwiserecurse\@@FLOWx\@@FLOWnx\plusone
+ {\hbox to \FLOWgridwidth
+ {\hfill
+ \framed
+ [\c!framecolor=red,
+ \c!width=\FLOWshapewidth,
+ \c!height=\FLOWshapeheight]
+ {}%
+ \hfill}}}
+ \vfill}}}%
+ \wd8\wd0\ht8\ht0\dp8\dp0
+ \framed
+ [\c!offset=\v!overlay,\c!framecolor=green]
+ {\hbox{\box4\hskip-\wd0\box0\hskip-\wd2\box2\hskip-\wd6\box6\hskip-\wd8\box8}}}
+ {\framed
+ [\c!offset=\v!overlay,
+ \c!frame=\@@FLOWframe,
+ \c!rulethickness=\@@FLOWrulethickness,
+ \c!framecolor=\@@FLOWframecolor,
+ \c!background=\@@FLOWbackground,
+ \c!backgroundcolor=\@@FLOWbackgroundcolor]
+ {\hbox{\box4\hskip-\wd0\box0\hskip-\wd2\box2}}}%
+ %\message{[\FLOWcells]}\wait
+ \egroup}
+
+% Pass A
+
+\long\def\startFLOWcellA#1\stopFLOWcell%
+ {\resetFLOWcell
+ \ignorespaces#1\unskip
+ \expandafter\getFLOWlocationA\FLOWlocation\end
+ \ignorespaces}
+
+\def\getFLOWlocationA#1,#2\end
+ {\ifnum0#1>\FLOWwidth \xdef\FLOWwidth {#1}\fi
+ \ifnum0#2>\FLOWheight\xdef\FLOWheight{#2}\fi}
+
+% Pass B
+%
+% beware: the - after \@FLOC@ is needed since name can be
+% empty and we don't want to redefine \@FLOC@ itself by
+% mistake
+
+\long\def\startFLOWcellB#1\stopFLOWcell
+ {\resetFLOWcell\ignorespaces#1\unskip
+ \setxvalue{\@FLOC@-\FLOWname}{\FLOWlocation}% kost veel cs's
+ \ifx\FLOWshape\empty
+ \global\let\FLOWshape\@@FLOSdefault
+ \fi
+ \doifnot\FLOWshape{none} % {\v!none}
+ {\doifinsetelse\FLOWshape\FLOWshapes
+ {\edef\FLOWshapetag{shape_\FLOWshape}% beter \expanded
+ \@EA\setFLOWname\@EA\FLOWshapetag\@EA{\FLOWshapetag}}
+ {\doifnumberelse\FLOWshape
+ {\let\FLOWshapetag\FLOWshape}
+ {\let\FLOWshapetag\empty}}%
+ \ifx\FLOWshapetag\empty \else
+ \doifinsetelse\FLOWshape\FLOWlines
+ {\chardef\FLOWstate0 }
+ {\doifcommonelse{\FLOWcell,\FLOWfocus}\@@FLOWfocus
+ {\chardef\FLOWstate1 }
+ {\chardef\FLOWstate2 }}%
+ \startMPdrawing
+ begin_sub_chart ;
+ \ifcase\FLOWstate
+ shape_line_color := \MPcolor{\@@FLOLcolor} ;
+ shape_fill_color := \MPcolor{\@@FLOLcolor} ;
+ shape_line_width := \@@FLOLrulethickness ;
+ \or
+ shape_line_color := \MPcolor{\@@FLOFframecolor} ;
+ shape_fill_color := \MPcolor{\@@FLOFbackgroundcolor} ;
+ shape_line_width := \@@FLOFrulethickness ;
+ \or
+ shape_line_color := \MPcolor{\@@FLOSframecolor} ;
+ shape_fill_color := \MPcolor{\@@FLOSbackgroundcolor} ;
+ shape_line_width := \@@FLOSrulethickness ;
+ \fi
+ %\ifx\FLOWoverlay\empty
+ % peepshape := false ;
+ %\else
+ % peepshape := true ;
+ %\fi
+ peepshape := \ifx\FLOWoverlay\empty false \else true \fi ;
+ new_shape(\FLOWlocation,\FLOWshapetag) ;
+ end_sub_chart ;
+ \stopMPdrawing
+ \fi}%
+ \ignorespaces}
+
+% Pass C
+
+\long\def\startFLOWcellC#1\stopFLOWcell%
+ {\resetFLOWcell
+\pushmacro\lastFLOWx
+\pushmacro\lastFLOWy
+ \ignorespaces#1\unskip % makes sure that vars are set
+\popmacro\lastFLOWy
+\popmacro\lastFLOWx
+ \let\connection\doFLOWconnectionC
+ \ignorespaces#1\unskip}
+
+\def\FLOWorigin{0,0}
+
+\def\doFLOWdisplace[#1,#2,#3]% experiment
+ {dsp_x := #1 ; dsp_y := #2 ;}
+
+\def\doFLOWconnectionC
+ {\dodoubleempty\dodoFLOWconnectionC}
+
+\def\dodoFLOWconnectionC[#1][#2]#3%
+ {\doglobal\increment\FLOWcomment
+ \setFLOWname\otherFLOWname{name_#3}%
+ \doifdefinedelse{\@FLOC@-\FLOWname}
+ {\edef\FLOWfrom{\getvalue{\@FLOC@-\FLOWname}}}
+ {\let \FLOWfrom \FLOWorigin}%
+ \ifx\FLOWfrom\FLOWorigin \else
+ \doifdefinedelse{\@FLOC@-\otherFLOWname}
+ {\edef\FLOWto {\getvalue{\@FLOC@-\otherFLOWname}}}
+ {\let \FLOWto \FLOWorigin}%
+ \ifx\FLOWto\FLOWorigin \else
+ \FLOWsetconnect{#1}%
+ \ifx\cFLOWfrom\empty \else
+ \doifelse\@@FLOLcorner\v!round
+ {\startMPdrawing smooth := true ; \stopMPdrawing}
+ {\startMPdrawing smooth := false ; \stopMPdrawing}%
+ \doifelse\@@FLOLdash\v!yes
+ {\startMPdrawing dashline := true ; \stopMPdrawing}
+ {\startMPdrawing dashline := false ; \stopMPdrawing}%
+ \doifelse\@@FLOLarrow\v!yes
+ {\startMPdrawing arrowtip := true ; \stopMPdrawing}
+ {\startMPdrawing arrowtip := false ; \stopMPdrawing}%
+ \doifelse\@@FLOLoffset\v!none
+ {\startMPdrawing touchshape := true ; \stopMPdrawing}
+ {\startMPdrawing touchshape := false ; \stopMPdrawing}%
+%\doifsomething{#2}
+% {\startMPdrawing
+% \doFLOWdisplace[0#2,0,0]%
+% \stopMPdrawing}%
+ \startMPdrawing
+\doFLOWdisplace[0#2,0,0]%
+ connection_line_color := \MPcolor{\@@FLOLcolor} ;
+ connection_line_width := \@@FLOLrulethickness ;
+ connect_\cFLOWfrom _\cFLOWto (\FLOWfrom,\zFLOWfrom) (\FLOWto,\zFLOWto) ;
+\doFLOWdisplace[0,0,0]%
+ \stopMPdrawing
+ \fi
+ \fi
+ \fi
+ \ignorespaces}
+
+% Pass D
+
+\long\def\startFLOWcellD#1\stopFLOWcell
+ {\resetFLOWcell
+\pushmacro\lastFLOWx
+\pushmacro\lastFLOWy
+ \ignorespaces#1\unskip % presets vars
+\popmacro\lastFLOWy
+\popmacro\lastFLOWx
+ \let\doprocessFLOWcell\doprocessFLOWcellD
+ \expandafter\doprocessFLOWcellD\FLOWlocation\end
+ \let\connection\doFLOWconnectionD
+ \let\comment\doFLOWcommentD
+ \ignorespaces#1\unskip\ignorespaces}
+
+\def\doFLOWconnectionD
+ {\dodoubleempty\dodoFLOWconnectionD}
+
+\def\dodoFLOWconnectionD[#1][#2]#3%
+ {\doglobal\increment\FLOWcomment
+ \ignorespaces}
+
+\def\doFLOWcommentD[#1]#2%
+ {\bgroup
+ \let\FLOW \middlebox
+ \let\FLOWb \bottombox
+ \let\FLOWbl\bottomleftbox
+ \let\FLOWbr\bottomrightbox
+ \let\FLOWt \topbox
+ \let\FLOWtl\topleftbox
+ \let\FLOWtr\toprightbox
+ \let\FLOWl \leftbox
+ \let\FLOWlt\lefttopbox
+ \let\FLOWlb\leftbottombox
+ \let\FLOWr \rightbox
+ \let\FLOWrt\righttopbox
+ \let\FLOWrb\rightbottombox
+ \let\FLOWc \middlebox
+%\ifdefined{FLOW#1}%
+ \ifcase0\getvalue{\@@MPx\FLOWcomment}\getvalue{\@@MPy\FLOWcomment}\relax
+ \else
+ \ifdim\getvalue{\@@MPx\FLOWcomment}\s!bp<\areaMPllx\relax\else
+ \ifdim\getvalue{\@@MPx\FLOWcomment}\s!bp>\areaMPurx\relax\else
+ \ifdim\getvalue{\@@MPy\FLOWcomment}\s!bp<\areaMPlly\relax\else
+ \ifdim\getvalue{\@@MPy\FLOWcomment}\s!bp>\areaMPury\relax\else
+ \dimen0=\getvalue{\@@MPx\FLOWcomment}\s!bp
+ \advance\dimen0 -\@@FLOW@@offset
+ \advance\dimen0 -\clipMPllx
+ \dimen2=\clipMPury
+ \advance\dimen2 -\@@FLOW@@offset
+ \advance\dimen2 -\getvalue{\@@MPy\FLOWcomment}\s!bp
+ \setbox\scratchbox\hbox{\strut#2}%
+ \boxoffset.5\bodyfontsize
+ \setbox\scratchbox\hbox{\hskip\dimen0\lower\dimen2\getvalue{FLOW#1}{\box\scratchbox}}%
+ \smashbox\scratchbox
+ \box\scratchbox
+ \boxoffset\zeropoint
+ \nointerlineskip % really needed
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+%\fi
+ \egroup
+ \ignorespaces}
+
+% pass D
+
+\def\dophaseoneFLOWcellX#1#2%
+ {\!!counta#1\relax
+ \!!countb#2\relax
+ \!!countc\@@FLOWx
+ \!!countd\@@FLOWy
+ \advance\!!countc \@@FLOWnx
+ \advance\!!countd \@@FLOWny
+ \advance\!!countc \minusone
+ \advance\!!countd \minusone
+ \ifnum\!!counta<\@@FLOWx\relax \donefalse
+ \else\ifnum\!!counta>\!!countc \donefalse
+ \else\ifnum\!!countb<\@@FLOWy\relax \donefalse
+ \else\ifnum\!!countb>\!!countd \donefalse
+ \else \donetrue
+ \fi\fi\fi\fi}
+
+\def\dophasetwoFLOWcellX
+ {\advance\!!counta -\@@FLOWx
+ \advance\!!counta \plusone
+ \advance\!!countb -\@@FLOWy
+ \advance\!!countb \plusone
+ \dimen0=\FLOWgridwidth
+ \dimen0=\!!counta\dimen0
+ \advance\dimen0 -\FLOWgridwidth
+ \dimen4=\FLOWgridwidth
+ \advance\dimen4 -\FLOWshapewidth
+ \advance\dimen0 .5\dimen4
+ \dimen2=\FLOWgridheight
+ \dimen2=\!!countb\dimen2
+ \dimen4=\FLOWgridheight
+ \advance\dimen4 -\FLOWshapeheight
+ \advance\dimen2 -.5\dimen4
+ \edef\FLOWdx{\the\dimen0}%
+ \edef\FLOWdy{\the\dimen2}}
+
+\def\positionFLOWzero% assumes \FLOWdx and \FLOWdy are set
+ {\setbox0\hbox{\hskip\FLOWdx\lower\FLOWdy\box0}%
+ \smashbox0\box0
+ \nointerlineskip} % new, needed since we somehow reset that
+
+\def\doFLOWtlabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdy\fi
+ \setbox0\hbox{\hskip\dimen2\raise\scratchdimen
+ \hbox{\raise\dimen4\hbox{#1{\strut#3}}}}%
+ \positionFLOWzero}%
+
+\def\doFLOWblabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdy\fi
+ \setbox0\hbox{\hskip\dimen2\raise-\scratchdimen
+ \hbox{#1{\strut#3}}}%
+ \positionFLOWzero}%
+
+\def\doFLOWllabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdx\fi
+ \setbox0\hbox{\hskip-\scratchdimen\raise\dimen6
+ \hbox{#1{\strut#3}}}%
+ \positionFLOWzero}%
+
+\def\doFLOWrlabel#1#2#3%
+ {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdx\fi
+ \setbox0\hbox{\hskip\dimen0\hskip\scratchdimen
+ \hbox{\raise\dimen6\hbox{#1{\strut#3}}}}%
+ \positionFLOWzero}
+
+\def\doprocessFLOWcellD#1,#2\end
+ {\dophaseoneFLOWcellX{#1}{#2}%
+ \ifdone
+ \dophasetwoFLOWcellX
+ \doglobal\addtocommalist\FLOWcell\FLOWcells
+ \def\FLOWx{#1}%
+ \def\FLOWy{#2}%
+ \directsetup{flowcell}%
+ \setbox0\hbox
+ {\ifx\FLOWalign\empty\else
+ \setupframed
+ [\c!align=\v!normal,\c!bottom=\vfill,\c!top=\vfill]%
+ \@EA\processallactionsinset\@EA
+ [\FLOWalign]
+ [t=>{\setupframed[\c!bottom=\vfill,\c!top=]},
+ b=>{\setupframed[\c!bottom=,\c!top=\vfill]},
+ l=>{\setupframed[\c!align=\v!right]},
+ r=>{\setupframed[\c!align=\v!left]},
+ m=>{\setupframed[\c!align=\v!middle]},
+ c=>{\setupframed[\c!align=\v!middle]}]%
+ \fi
+ \doifelse\FLOWshape{none} % {\v!none}
+ {\setupframed[\c!offset=\v!overlay]}
+ {\setupframed[\c!offset=\@@FLOSoffset]}%
+ \framed
+ [\c!frame=\v!off,\c!background=flowcell,
+ \c!width=\FLOWshapewidth,\c!height=\FLOWshapeheight]
+ {\FLOWtext}}%
+ \showFLOWhelp0
+ \ifx\FLOWdestination\empty\else
+ \setbox0\hbox
+ {\setupinteraction[\c!color=,\c!contrastcolor=]%
+ \gotobox{\box0}[\FLOWdestination]}%
+ \fi
+ \positionFLOWzero
+ \dimen0=\FLOWshapewidth \dimen2=.5\dimen0
+ \dimen4=\FLOWshapeheight\dimen6=.5\dimen4
+ \boxoffset.5\bodyfontsize
+ \doFLOWtlabel \righttopbox0\tFLOWlabel
+ \doFLOWblabel\rightbottombox0\bFLOWlabel
+ \doFLOWllabel \lefttopbox0\lFLOWlabel
+ \doFLOWrlabel \righttopbox0\rFLOWlabel
+ \doFLOWtlabel \topbox0\tcFLOWlabel % for me only
+ \doFLOWblabel \bottombox0\bcFLOWlabel % for me only
+ \doFLOWllabel \leftbox0\lcFLOWlabel % for me only
+ \doFLOWrlabel \rightbox0\rcFLOWlabel % for me only
+ \ifnum#1=\@@FLOWx\relax \doFLOWllabel \leftbox1\lFLOWexit \fi
+ \ifnum#1=\!!countc \doFLOWrlabel \rightbox1\rFLOWexit \fi
+ \ifnum#2=\@@FLOWy\relax \doFLOWtlabel \topbox1\tFLOWexit \fi
+ \ifnum#2=\!!countd \doFLOWblabel \bottombox1\bFLOWexit \fi
+ \boxoffset\zeropoint
+ \fi}
+
+% For Willy Egger:
+%
+% \startsetups flowcell
+% \definelayer
+% [flowcell]
+% [width=\FLOWshapewidth,
+% height=\FLOWshapeheight]
+% \setlayerframed
+% [flowcell]
+% [preset=rightbottom,offset=1ex]
+% [frame=off]
+% {\tx(\FLOWx,\FLOWy)}
+% \stopsetups
+
+% Pass E
+
+\long\def\startFLOWcellE#1\stopFLOWcell
+ {\resetFLOWcell
+ \ignorespaces#1\unskip
+ \let\doprocessFLOWcell\doprocessFLOWcellE
+ \expandafter\doprocessFLOWcell\FLOWlocation\end}
+
+\def\doprocessFLOWcellE#1,#2\end % redundant
+ {\ifx\FLOWoverlay\empty \else
+ \dophaseoneFLOWcellX{#1}{#2}%
+ \ifdone
+ \dophasetwoFLOWcellX
+ \edef\FLOWdx{\the\dimen0}%
+ \edef\FLOWdy{\the\dimen2}%
+ \setbox0\hbox
+ {\framed
+ [%\c!frame=\v!off,
+ \c!background={\@@FLOWbackground,\FLOWoverlay},
+ \c!backgroundcolor=\@@FLOSbackgroundcolor,
+ \c!width=\FLOWshapewidth,\c!height=\FLOWshapeheight]
+ {}}%
+ \positionFLOWzero
+ \fi
+ \fi}
+
+% Pass F
+
+\def\checkFLOWautofocus
+ {\def\@@FLOWminx{100}\let\@@FLOWminy\@@FLOWminx
+ \def\@@FLOWmaxx {0}\let\@@FLOWmaxy\@@FLOWmaxx
+ \def\@@FLOWabsx {0}\let\@@FLOWabsy\@@FLOWabsx
+ \let\startFLOWcell\startFLOWcellF
+ \resetFLOWlocation
+ \processFLOWbuffer\currentFLOWnumber
+ %\message{AUTOSHAPE 1: (\@@FLOWminx,\@@FLOWminy)->(\@@FLOWmaxx,\@@FLOWmaxy)}%
+ \ifnum\@@FLOWabsx<\@@FLOWmaxx\let\@@FLOWmaxx\@@FLOWabsx\fi
+ \ifnum\@@FLOWabsy<\@@FLOWmaxy\let\@@FLOWmaxy\@@FLOWabsy\fi
+ %\message{AUTOSHAPE 2: (\@@FLOWminx,\@@FLOWminy)->(\@@FLOWmaxx,\@@FLOWmaxy)}%
+ \donetrue
+ \ifnum\@@FLOWminx=100 \donefalse\fi
+ \ifnum\@@FLOWminy=100 \donefalse\fi
+ \ifnum\@@FLOWmaxx=0 \donefalse\fi
+ \ifnum\@@FLOWmaxy=0 \donefalse\fi
+ \doFLOWcheckF\@@FLOWx\@@FLOWminx\@@FLOWmaxx\@@FLOWnx
+ \doFLOWcheckF\@@FLOWy\@@FLOWminy\@@FLOWmaxy\@@FLOWny}
+
+\def\startFLOWcellF#1\stopFLOWcell%
+ {\resetFLOWcell
+ \ignorespaces#1\unskip
+ \expandafter\doFLOWlocationF\FLOWlocation\end}%
+
+\def\doFLOWlocationF#1,#2\end%
+ {\ifnum#1>\@@FLOWabsx\def\@@FLOWabsx{#1}\fi
+ \ifnum#2>\@@FLOWabsy\def\@@FLOWabsy{#2}\fi
+ \doifinset\FLOWcell\@@FLOWautofocus
+ {\dodoFLOWlocationF{#1}<-\@@FLOWminx
+ \dodoFLOWlocationF{#1}>+\@@FLOWmaxx
+ \dodoFLOWlocationF{#2}<-\@@FLOWminy
+ \dodoFLOWlocationF{#2}>+\@@FLOWmaxy}}
+
+\def\dodoFLOWlocationF#1#2#3#4%
+ {\ifnum#1#2#4\relax
+ \!!counta=#1\advance\!!counta #31\relax
+ \edef#4{\ifnum\!!counta<1 1\else\the\!!counta\fi}%
+ \fi}
+
+\def\doFLOWcheckF#1#2#3#4%
+ {\ifdone
+ \let#1=#2%
+ \!!counta=#3%
+ \advance\!!counta \plusone\advance\!!counta -#2\relax
+ \ifnum\!!counta<1 \!!counta=1 \fi
+ \edef#4{\the\!!counta}%
+ \else
+ \let#1\!!plusone
+ \let#4\!!zerocount % no {1}
+ \fi}
+
+% \useFLOWchart[name][parent][setting,setting][additional settings]
+% \useFLOWchart[name][parent][additional settings]
+
+\let\currentFLOWchart\empty
+
+\def\useFLOWchart
+ {\doquadrupleempty\douseFLOWchart}
+
+\def\douseFLOWchart[#1][#2][#3][#4]% name parent sets mainsettings
+ {\iffourthargument
+ \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][#3][#4,##1]}%
+ \else
+ \checkparameters[#3]%
+ \ifparameters
+ \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][][#3,##1]}%
+ \else
+ \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][#3][##1]}%
+ \fi
+ \fi}
+
+\def\setgetFLOWchart[#1][#2][#3]%
+ {\def\docommand##1{}% cell line focus ?
+ \processcommalist[#2]\docommand
+ \getFLOWchart[#1][#3]}
+
+\def\doFLOWchart[#1][#2]%
+ {\hbox\bgroup\vbox\bgroup % vmode suppresses spaces
+\def\currentFLOWchart{#1}%
+ \doifundefinedelse{\@FLOW@--#1}
+ {\getFLOWchart[#1][#2]}
+ {\getvalue{\@FLOW@--#1}[#2]}%
+ \egroup\egroup}
+
+\def\FLOWchart%
+ {\dodoubleempty\doFLOWchart}
+
+%D The next section is dedicated to splitting up charts.
+
+\def\getFLOWsize[#1]%
+ {\bgroup\let\dodogetFLOWchart\dogetFLOWsize\FLOWchart[#1]\egroup}
+
+\def\dogetFLOWsize[#1][#2]%
+ {\setbox\scratchbox=\vbox
+ {\globallet\FLOWmaxwidth \!!zerocount
+ \globallet\FLOWmaxheight\!!zerocount
+ \def\getFLOWlocation##1,##2\end
+ {\ifnum0##1>\FLOWmaxwidth \xdef\FLOWmaxwidth {##1}\fi
+ \ifnum0##2>\FLOWmaxheight\xdef\FLOWmaxheight{##2}\fi}%
+ \resetFLOWcell
+ \long\def\startFLOWcell##1\stopFLOWcell
+ {{##1\expandafter\getFLOWlocation\FLOWlocation\end}}%
+ \def\dohandleflowchart[##1][##2]%
+ {\resetFLOWlocation
+ \processFLOWbuffer{##1}}%
+ \getvalue{\@FLOW@-#1}}}
+
+\def\setupFLOWsplit%
+ {\dodoubleargument\getparameters[\@@FLOT]}
+
+\setupFLOWsplit%
+ [\c!nx=3,\c!ny=3,
+ \c!dx=1,\c!dy=1,
+ \c!command=,
+ \c!marking=\v!on,
+ \c!before=,\c!after=]
+
+\def\FLOWsplitx {1}
+\def\FLOWsplity {1}
+\def\FLOWsplitnx{1}
+\def\FLOWsplitny{1}
+
+\def\FLOWcharts%
+ {\dodoubleempty\doFLOWcharts}
+
+%D While splitting, the following variables are available:
+%D
+%D \starttyping
+%D \FLOWsplitnx \FLOWsplitny \FLOWsplitx \FLOWsplity
+%D \stoptyping
+
+\def\doFLOWcharts[#1][#2]%
+ {\bgroup
+ \getFLOWsize[#1]%
+ \dodoFLOWcharts\relax
+ \global\let\FLOWsplitnx\FLOWsplitx
+ \global\let\FLOWsplitny\FLOWsplity
+ \dodoFLOWcharts{\dododoFLOWcharts[#1][#2]}%
+ \egroup}
+
+\def\dodoFLOWcharts#1%
+ {\def\@@FLOTx{1}%
+ \global\let\FLOWsplitx\@@FLOTx
+ \doloop
+ {\def\@@FLOTy{1}%
+ \global\let\FLOWsplity\@@FLOTy
+ \doloop
+ {\bgroup
+ \scratchcounter\FLOWmaxwidth
+ \advance\scratchcounter -\@@FLOTx
+ \advance\scratchcounter \plusone
+ \ifnum\scratchcounter<\@@FLOTnx\edef\@@FLOTnx{\the\scratchcounter}\fi
+ \scratchcounter\FLOWmaxheight
+ \advance\scratchcounter -\@@FLOTy
+ \advance\scratchcounter \plusone
+ \ifnum\scratchcounter<\@@FLOTny\edef\@@FLOTny{\the\scratchcounter}\fi
+ #1% does something with the float, or not
+ \egroup
+ \increment(\@@FLOTy,\@@FLOTny)%
+ \ifnum\@@FLOTy>\FLOWmaxheight
+ \exitloop
+ \else
+ \doglobal\increment\FLOWsplity
+ \decrement(\@@FLOTy,\@@FLOTdy)%
+ \fi}%
+ \increment(\@@FLOTx,\@@FLOTnx)%
+ \ifnum\@@FLOTx>\FLOWmaxwidth
+ \exitloop
+ \else
+ \doglobal\increment\FLOWsplitx
+ \decrement(\@@FLOTx,\@@FLOTdx)%
+ \fi}}
+
+\def\dododoFLOWcharts[#1][#2]%
+ {\bgroup
+ \@@FLOTbefore
+ \doifnot\@@FLOTmarking\v!on{\let\cuthbox\hbox}%
+ \cuthbox
+ {\@@FLOTcommand
+ {\FLOWchart[#1][#2,
+ \c!x=\@@FLOTx,\c!nx=\@@FLOTnx,
+ \c!y=\@@FLOTy,\c!ny=\@@FLOTny]}}%
+ \@@FLOTafter
+ \egroup}
+
+%D An example of splitting is given below:
+%D
+%D \starttyping
+%D \setupFLOWsplit
+%D [nx=5,ny=10,
+%D dx=0,dy=0,
+%D before=,
+%D after=\page]
+%D
+%D \FLOWcharts[mybigflow]
+%D \stoptyping
+%D
+%D Or, one can say:
+%D
+%D \starttyping
+%D \splitfloat
+%D {\placefigure{What a big flowchart this is!}}
+%D {\FLOWcharts[mybigflow]}
+%D \stoptyping
+
+%D \macros
+%D {typeFLOWchart}
+%D
+%D For documentation purposes the following macro is
+%D provided. Watch the use of the first and last line hooks,
+%D which is needed because the start and stop commands are
+%D not part of the buffer.
+
+\def\typeFLOWchart[#1]%
+ {\bgroup
+ \def\dohandleflowchart[##1][##2]{\typeFLOWbuffer{##1}}%
+ \defconvertedargument\firstverbatimfileline{\startFLOWchart[#1]}%
+ \defconvertedargument\lastverbatimfileline {\stopFLOWchart}%
+ \getvalue{\@FLOW@-#1}
+ \egroup}
+
+%D New:
+%D
+%D \starttyping
+%D \setupFLOWcharts[command=\Whow]
+%D
+%D \startFLOWset[convert-en] % [tag][convert-en]
+%D \subFLOWchart[a][x=1,y=1,nx=3,ny=3]
+%D \subFLOWchart[b][x=1,y=2,nx=3,ny=3]
+%D \subFLOWchart[c][x=2,y=1,nx=3,ny=3]
+%D \stopFLOWset
+%D
+%D \def\Whow#1%
+%D {\ifnum\currentFLOWset=1 \framed{Some Chart}\fi}
+%D
+%D \FLOWset[convert-en] % [tag]
+%D
+%D \def\Whow#1%
+%D {\setuphead[state=high]
+%D \startstandardmakeup
+%D \centerbox{#1}
+%D \stopstandardmakeup}
+%D
+%D \FLOWset[convert-en] % [tag]
+%D \stoptyping
+
+\def\startFLOWset
+ {\dodoubleempty\dostartFLOWset}
+
+\def\dostartFLOWset[#1][#2]#3\stopFLOWset % tag name data
+ {\ifsecondargument
+ \long\setvalue{\@FLOX@#1}{\dohandleFLOWset{#1}{#2}{#3}}%
+ \else
+ \long\setvalue{\@FLOX@#1}{\dohandleFLOWset{#1}{#1}{#3}}%
+ \fi}
+
+\long\def\dohandleFLOWset#1#2#3% tag name data
+ {\bgroup
+ \def\subFLOWchart
+ {\dodoubleempty\dosubFLOWchart}%
+ \def\dosubFLOWchart[##1][##2]% subtag settings
+ {\ifsecondargument
+ \dodohandleFLOWset{#1}{##1}{#2}{##2}%
+ \else
+ \subFLOWchart[][##1]%
+ \fi}%
+ #3%
+ \egroup}
+
+\def\dodohandleFLOWset#1#2#3#4% tag subtag name settings
+ {\increment\currentFLOWset
+ \bgroup
+ \@@FLOXcommand
+ {\ifnum\currentFLOWset=1 \pagereference[#1]\fi
+ \doifsomething{#2}
+ {\setupreferencing[\c!prefix=]%
+ \pagereference[#1:#2]% -:#1:#2
+ \setupreferencing[\c!prefix=#1:#2]}%
+ \FLOWchart[#3][#4]}%
+ \egroup}
+
+\def\FLOWset[#1]%
+ {\newcounter\currentFLOWset
+ \doifdefinedelse{\@FLOX@#1}
+ {\getvalue{\@FLOX@#1}}
+ {\dodohandleFLOWset{#1}{}{#1}{}}}
+
+\newcounter\currentFLOWset
+
+\setupFLOWsets
+ [\c!command=]
+
+%D This will be an option:
+
+% \def\startFLOWchart%
+% {\dodoubleempty\dostartFLOWchart}
+%
+% \long\def\dostartFLOWchart[#1][#2]#3\stopFLOWchart
+% {\preparenextFLOWchart{#1}{#2}%
+% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}}
+%
+% \long\def\dodefineFLOWchart[#1][#2]#3%
+% {\preparenextFLOWchart{#1}{#2}%
+% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}}
+%
+% \def\processFLOWbuffer#1{\getvalue{\FLOWbufferprefix#1}}
+% \def\typeFLOWbuffer #1{[Sorry, no verbatim chart #1 available.]}
+
+\writestatus\m!system{The chart mkiv xml interface is not yet defined!}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/m-chart.tex b/Master/texmf-dist/tex/context/base/m-chart.tex
index 5ccf4c2ad2b..c4e279d5476 100644
--- a/Master/texmf-dist/tex/context/base/m-chart.tex
+++ b/Master/texmf-dist/tex/context/base/m-chart.tex
@@ -11,1274 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-% todo: \localpushmacro/\localpopmacro (dohandleflowchart etc)
-% todo: make mkiv variant
-% todo: use dimexpr/numspr
-
-% will be redone with layers and dimexpr or even better, by just using
-% textext .. a nice example of old code
-
-%D This is an experimental module. Pieces of code will be moved
-%D to other modules. More features are possible but will be
-%D interfaces later.
-%D
-%D When finished this module will be documented. The main macro
-%D is still a rather big one and there is some redundant and
-%D slow code that needs a clean up.
-
-% arrow, dash
-% crossing
-% \goto -> \normalgoto
-% class -> class:name (ref prefix)
-% c, automatisch geen overlap zoeken
-% eind eerder chart connecties
-% relateren aan korps
-% check op bestaan naam, bestaan shape
-% auto als extern figuur
-% subchart
-% pijlen
-% focus
-% ook nog \MPmessage
-% areapath -> krappe vlak
-% clippath -> gehele vlak
-%
-% offset : clip offset
-% breedte : breedte cel
-% hoogte : hoogte cel
-% dx : halve afstand in breedte (grid breedte = breedte + 2dx)
-% dy : halve afstand in hoogte (grid hoogte = hoogte + 2dy)
-% x : x offset (clipping)
-% y : y offset (clipping)
-% nx : minimaal aantal cellen horizontaal
-% ny : minimaal aantal cellen vertikaal
-%
-% shape none en geen equivalent maken
-%
-% kaderkleur achtergrondkleur
-% lijnkleur lijndikte
-% focus focuskaderkleur focusachtergrondkleur
-% richting
-%
-% focus koppelen aan kleur
-
-\unprotect
-
-\definesorting [flowchart] [flowcharts] [\v!none] % no access
-\setupsorting [flowchart] [\c!state=\v!stop] % off by default
-
-\def\@FLOW@{@FLOW@}
-\def\@FLOC@{@FLOC@}
-\def\@FLOX@{@FLOX@}
-
-\def\@@FLOW{@@FLOW}
-\def\@@FLOL{@@FLOL}
-\def\@@FLOS{@@FLOS}
-\def\@@FLOF{@@FLOF}
-\def\@@FLOT{@@FLOT}
-\def\@@FLOX{@@FLOX}
-
-\def\@@MPx {@@MPx}
-\def\@@MPy {@@MPy}
-
-\def\FLOWbufferprefix{flw-}
-
-\def\processFLOWbuffer#1{\getbuffer[\FLOWbufferprefix#1]}
-\def\typeFLOWbuffer #1{\typebuffer[\FLOWbufferprefix#1]}
-
-\def\setFLOWname#1#2% funny hack that makes sure that we get
- {\bgroup % names that are acceptable for METAPOST
- \lccode`0=`a\lccode`1=`b\lccode`2=`c\lccode`3=`d\lccode`4=`e%
- \lccode`5=`f\lccode`6=`g\lccode`7=`h\lccode`8=`i\lccode`9=`j%
- \lccode` =`\_\lccode`-=`\_\lccode`_=`\_%
- \lowercase{\gdef#1{#2}}%
- \egroup}
-
-% een gobble als default is sneller, en dan alleen setten als
-% nodig
-
-\def\resetFLOWcell
- {% variables
- \global\let\FLOWname \empty
- \global\let\FLOWalign \empty
- \global\let\FLOWshape \empty
- \global\let\FLOWlocation \empty
- \global\let\FLOWtext \empty
- \global\let\FLOWhelp \empty
- \global\let\FLOWdestination\empty
- \global\let\FLOWoverlay \empty
- \global\let\FLOWfocus \empty
- \global\let\tFLOWlabel \empty
- \global\let\bFLOWlabel \empty
- \global\let\lFLOWlabel \empty
- \global\let\rFLOWlabel \empty
- \global\let\bcFLOWlabel \empty
- \global\let\tcFLOWlabel \empty
- \global\let\lcFLOWlabel \empty
- \global\let\rcFLOWlabel \empty
- \global\let\tFLOWexit \empty
- \global\let\bFLOWexit \empty
- \global\let\lFLOWexit \empty
- \global\let\rFLOWexit \empty
- % commands
- \let\name \doFLOWname
- \let\shape \doFLOWshape
- \let\destination\doFLOWdestination
- \let\location \doFLOWlocation
- \let\focus \doFLOWfocus
- \let\overlay \doFLOWoverlay
- \let\figure \doFLOWfigure
- \let\text \doFLOWtext
- \let\comment \doFLOWcomment
- \let\label \doFLOWlabel
- \let\help \doFLOWhelp
- \let\connection \doFLOWconnection
- \let\exit \doFLOWexit
- % convenience commands
- \let\locate \doFLOWlocate
- \let\connect \doFLOWconnect}
-
-\let\FLOWcell \s!unknown
-\let\FLOWshape \s!unknown
-\let\FLOWdestination\s!unknown
-\let\FLOWfocus \s!unknown
-\let\FLOWoverlay \empty
-\let\FLOWtext \empty
-
-\def\doFLOWname#1%
- {\def\FLOWcell{#1}\setFLOWname\FLOWname{name_#1}\ignorespaces}
-
-\def\doFLOWshape#1%
- {\gdef\FLOWshape{#1}\ignorespaces}
-
-\def\doFLOWdestination#1%
- {\gdef\FLOWdestination{#1}\ignorespaces}
-
-\def\doFLOWlocation#1%
- {\setFLOWlocation#1\end\ignorespaces}
-
-\def\doFLOWfocus#1%
- {\gdef\FLOWfocus{#1}\ignorespaces}
-
-\def\doFLOWoverlay#1%
- {\gdef\FLOWoverlay{#1}\ignorespaces}
-
-\def\doFLOWfigure#1%
- {\defineoverlay[\s!dummy][\overlayfigure{#1}]%
- \overlay\s!dummy}
-
-\def\doFLOWtext
- {\dosingleempty\dodoFLOWtext}
-
-\def\dodoFLOWtext[#1]% % #2%
- {\gdef\FLOWalign{#1}\gdef\FLOWtext}% {#2}}
-
-\def\doFLOWcomment[#1]#2%
- {\ignorespaces\dogobblesingleempty}
-
-\def\doFLOWlabel[#1]#2% wordt dit gebruikt ?
- {\setgvalue{#1FLOWlabel}{#2}\ignorespaces}
-
-\def\doFLOWhelp#1%
- {\gdef\FLOWhelp{#1}\ignorespaces}
-
-\def\doFLOWconnection
- {\dodoubleempty\dodoFLOWconnection}
-
-\def\dodoFLOWconnection[#1][#2]#3%
- {\ignorespaces}
-
-\def\doFLOWconnect
- {\connection}
-
-\def\doFLOWlocate
- {\location}
-
-\def\doFLOWexit[#1]#2%
- {\setgvalue{#1FLOWexit}{#2}\ignorespaces}
-
-\def\startFLOWchart
- {\bgroup
- \let\stopFLOWchart\egroup
- \obeylines % lelijk, buffers nog eens fatsoeneren
- \dodoubleempty\dostartFLOWchart}
-
-\def\dostartFLOWchart[#1][#2]%
- {\preparenextFLOWchart{#1}{#2}%
- \dostartbuffer[\FLOWbufferprefix\nofFLOWcharts][startFLOWchart][stopFLOWchart]}
-
-\def\defineFLOWchart%
- {\dodoubleempty\dodefineFLOWchart}
-
-\long\def\dodefineFLOWchart[#1][#2]#3%
- {\preparenextFLOWchart{#1}{#2}%
- \setbuffer[\FLOWbufferprefix\nofFLOWcharts]#3\endbuffer}
-
-\def\preparenextFLOWchart#1#2%
- {\doglobal\increment\nofFLOWcharts
- \flowchart{#1}%
- \setxvalue{\@FLOW@-#1}{\noexpand\dohandleflowchart[\nofFLOWcharts][#2]}}
-
-\def\setupFLOWcharts{\dodoubleargument\getparameters[\@@FLOW]}
-\def\setupFLOWlines {\dodoubleargument\getparameters[\@@FLOL]}
-\def\setupFLOWshapes{\dodoubleargument\getparameters[\@@FLOS]}
-\def\setupFLOWfocus {\dodoubleargument\getparameters[\@@FLOF]}
-\def\setupFLOWsets {\dodoubleargument\getparameters[\@@FLOX]}
-
-\setupFLOWcharts
- [\c!option=,
- \c!bodyfont=,
- \c!dot=, % private option
- \c!width=12\bodyfontsize,
- \c!height=7\bodyfontsize,
- \c!maxwidth=,
- \c!maxheight=,
- \c!offset=\v!standard, % == auto offset
- \c!dx=2\bodyfontsize,
- \c!dy=2\bodyfontsize,
- \c!nx=0, % 1,
- \c!ny=0, % 1,
- \c!x=1,
- \c!y=1,
- \c!autofocus=,
- \c!focus=,
- \c!background=, % \v!color,
- \c!backgroundcolor=\s!white,
- \c!rulethickness=\linewidth,
- \c!frame=\v!off,
- \c!framecolor=]
-
-\setupFLOWlines
- [\c!corner=\v!round,
- \c!arrow=\v!yes,
- \c!dash=\v!no,
- \c!radius=.375\bodyfontsize, % 2.5\c!rulethickness
- \c!color=FLOWlinecolor,
- \c!rulethickness=.15\bodyfontsize, % 2pt,
- \c!offset=\v!none]
-
-\setupFLOWshapes
- [\c!default=action,
- \c!framecolor=FLOWframecolor,
- \c!background=\v!color,
- \c!backgroundcolor=FLOWbackgroundcolor,
- \c!backgroundscreen=\@@rsscreen,
- \c!rulethickness=.15\bodyfontsize, % 2pt,
- \c!offset=.5\bodyfontsize]
-
-\setupFLOWfocus
- [\c!framecolor=FLOWfocuscolor,
- \c!background=\@@FLOSbackground,
- \c!backgroundcolor=\@@FLOSbackgroundcolor,
- \c!backgroundscreen=\@@FLOSbackgroundscreen,
- \c!rulethickness=\@@FLOSrulethickness,
- \c!offset=\@@FLOSoffset]
-
-\definecolor [FLOWfocuscolor] [s=.2]
-\definecolor [FLOWlinecolor] [s=.5]
-\definecolor [FLOWframecolor] [s=.7]
-\definecolor [FLOWbackgroundcolor] [s=.9]
-
-\newcounter\includeFLOWx
-\newcounter\includeFLOWy
-
-\def\includeFLOWchart
- {\dodoubleempty\doincludeFLOWchart}
-
-\def\doincludeFLOWchart[#1][#2]%
- {\pushmacro\includeFLOWx
- \pushmacro\includeFLOWy
- \getparameters[FLOWi][x=1,y=1,#2]%
- \increment(\includeFLOWx,0\FLOWix)\decrement\includeFLOWx
- \increment(\includeFLOWy,0\FLOWiy)\decrement\includeFLOWy
- \def\dodoincludeFLOWchart##1%
- {\doifdefined{\@FLOW@-##1}
- {\globalpushmacro\dohandleflowchart % was local
- \gdef\dohandleflowchart[####1][####2]%
- {\globalpopmacro\dohandleflowchart % was local
- \resetFLOWlocation
- \processFLOWbuffer{####1}}%
- \getvalue{\@FLOW@-##1}}}%
- \processcommalist[#1]\dodoincludeFLOWchart
- \popmacro\includeFLOWx
- \popmacro\includeFLOWy}
-
-\def\resetFLOWlocation
- {\globallet\lastFLOWx\!!zerocount
- \globallet\lastFLOWy\!!zerocount}
-
-\def\dosetFLOWlocation[#1#2]#3#4%
- {\processaction
- [#1#2]
- [ +=>\scratchcounter\numexpr#4+ 1+#3\relax,
- -=>\scratchcounter\numexpr#4- 1+#3\relax,
- +#2=>\scratchcounter\numexpr#4+#2+#3\relax,
- -#2=>\scratchcounter\numexpr#4-#2+#3\relax,
- \s!default=>\scratchcounter\numexpr#4 +#3\relax,
- \s!unknown=>\scratchcounter\numexpr0#1#2+#3\relax]%
- \xdef#4{\the\scratchcounter}}
-
-\def\setFLOWlocation#1,#2\end
- {\dosetFLOWlocation[#1\empty]\includeFLOWx\lastFLOWx
- \dosetFLOWlocation[#2\empty]\includeFLOWy\lastFLOWy
- \xdef\FLOWlocation{\lastFLOWx,\lastFLOWy}}
-
-\def\FLOWshapes
- {node, action, procedure, product, decision, archive,
- loop, wait, subprocedure, singledocument, multidocument,
- sub procedure, single document, multi document, up, down,
- left, right}
-
-\def\FLOWlines
- {up, down, left, right}
-
-\def\FLOWsetconnect#1%
- {\donefalse
- \let\cFLOWfrom\empty
- \let\cFLOWto\empty
- \let\zFLOWfrom\!!zerocount
- \let\zFLOWto\!!zerocount
- \handletokens#1\with\doFLOWsetconnect
- \ifx\cFLOWto\empty\let\cFLOWfrom\empty\fi}
-
-\def\doFLOWsetconnect#1%
- {\ifx #1p%
- \ifdone\def\zFLOWto{+1}\else\def\zFLOWfrom{+1}\fi
- \else\ifx#1+%
- \ifdone\def\zFLOWto{+1}\else\def\zFLOWfrom{+1}\fi
- \else\ifx#1n%
- \ifdone\def\zFLOWto{-1}\else\def\zFLOWfrom{-1}\fi
- \else\ifx#1-%
- \ifdone\def\zFLOWto{-1}\else\def\zFLOWfrom{-1}\fi
- \else\ifdone
- \edef\cFLOWto{\FLOWconnector#1}%
- \else
- \edef\cFLOWfrom{\FLOWconnector#1}%
- \donetrue
- \fi\fi\fi\fi\fi}
-
-\def\FLOWconnector#1%
- {\if#1bbottom\else\if#1ttop\else\if#1lleft\else\if#1rright\fi\fi\fi\fi}
-
-\newif\ifFLOWscaling \FLOWscalingtrue
-
-\def\@@FLOW@@offset{\@@FLOWoffset}
-
-\def\getFLOWchart
- {\dodoubleempty\dogetFLOWchart}
-
-\def\dogetFLOWchart[#1][#2]%
- {\doifundefinedelse{\@FLOW@-#1}
- {\writestatus{FLOW}{unknown chart #1}%
- \framed
- [\c!width=12\bodyfontsize,\c!height=8\bodyfontsize]
- {\tttf [chart #1]}}
- {\dodogetFLOWchart[#1][#2]}}
-
-\def\dodogetFLOWchart[#1][#2]% to be split a bit more
- {\vbox\bgroup
- \insidefloattrue
- \forgetall
- \dontcomplain
- % \offinterlineskip % we now explicitly use \nointerlineskip later on
- \def\dohandleflowchart[##1][##2]%
- {\def\currentFLOWnumber{##1}%
- \getparameters[\@@FLOW][##2]}%
- \getvalue{\@FLOW@-#1}%
- \getparameters[\@@FLOW][#2]% dubbelop ?
- \doifsomething{\@@FLOWautofocus}
- {\checkFLOWautofocus}%
- %\message{AUTOSHAPE 3: (\@@FLOWx,\@@FLOWy)->(\@@FLOWnx,\@@FLOWny)}\wait
- \global\let\FLOWwidth \@@FLOWnx
- \global\let\FLOWheight\@@FLOWny
- \let\startFLOWcell\startFLOWcellA
- \resetFLOWlocation
- \processFLOWbuffer\currentFLOWnumber
- \ifcase\@@FLOWnx\relax \let\@@FLOWnx\FLOWwidth \fi
- \ifcase\@@FLOWny\relax \let\@@FLOWny\FLOWheight \fi
- \doifnothing{\@@FLOWmaxwidth\@@FLOWmaxheight}{\FLOWscalingfalse}%
- \ifFLOWscaling
- \doifnothing{\@@FLOWmaxwidth }{\let\@@FLOWmaxwidth \maxdimen}%
- \doifnothing{\@@FLOWmaxheight}{\let\@@FLOWmaxheight\maxdimen}%
- \scratchcounter\bodyfontpoints
- \doloop % NOG FONTSWITCH OM EX EN EM TE LATEN WERKEN
- {\ifnum\scratchcounter>1 % NU DIMENSIONS IN TERMS OF BODYFONTSIZE
- \bodyfontsize=\the\scratchcounter pt
- \dimen0=\@@FLOWmaxwidth
- \dimen2=\@@FLOWwidth
- \dimen4=\@@FLOWdx
- \advance\dimen2 2\dimen4
- \dimen2=\@@FLOWnx\dimen2
- \advance\dimen2 2\dimen4
- \ifdim\dimen2>\dimen0
- \advance\scratchcounter \minusone
- \else
- \dimen0=\@@FLOWmaxheight
- \dimen2=\@@FLOWheight
- \dimen4=\@@FLOWdy
- \advance\dimen2 2\dimen4
- \dimen2=\@@FLOWny\dimen2
- \advance\dimen2 2\dimen4
- \ifdim\dimen2>\dimen0
- \advance\scratchcounter \minusone
- \else
- \exitloop
- \fi
- \fi
- \else
- \exitloop
- \fi}%
- \expanded{\switchtobodyfont[\the\scratchcounter pt]}%
- \forgetall
- % \offinterlineskip % needed ?
- \else\ifx\@@FLOWbodyfont\empty\else
- \expanded{\switchtobodyfont[\@@FLOWbodyfont]}% \expanded ?
- \fi\fi
- \global\let\FLOWcells\empty
- \dimen0=\@@FLOWwidth
- \edef\FLOWshapewidth{\the\dimen0}%
- \dimen2=\@@FLOWdx
- \advance\dimen0 2\dimen2
- \edef\FLOWgridwidth{\the\dimen0}%
- \dimen0=\@@FLOWheight
- \edef\FLOWshapeheight{\the\dimen0}%
- \dimen2=\@@FLOWdy
- \advance\dimen0 2\dimen2
- \edef\FLOWgridheight{\the\dimen0}%
- \scratchdimen=\@@FLOSrulethickness
- \edef\@@FLOSrulethickness{\the\scratchdimen}%
- \scratchdimen=\@@FLOFrulethickness
- \edef\@@FLOFrulethickness{\the\scratchdimen}%
- \scratchdimen=\@@FLOLrulethickness
- \edef\@@FLOLrulethickness{\the\scratchdimen}%
- \ifdim\@@FLOLradius<2.5\scratchdimen
- \scratchdimen=2.5\scratchdimen
- \edef\@@FLOLradius{\the\scratchdimen}%
- \ifdim\@@FLOLradius>\@@FLOWdx
- \scratchdimen=\@@FLOWdx
- \edef\@@FLOLradius{\the\scratchdimen}%
- \fi
- \ifdim\@@FLOLradius>\@@FLOWdy
- \scratchdimen=\@@FLOWdy
- \edef\@@FLOLradius{\the\scratchdimen}%
- \fi
- \else
- \scratchdimen=\@@FLOLradius
- \edef\@@FLOLradius{\the\scratchdimen}%
- \fi
- \processaction % magic 2.5
- [\@@FLOWoffset]
- [ \v!none=>\scratchdimen=-2.5\scratchdimen,
- \v!overlay=>\scratchdimen=-2.5\scratchdimen,
- \v!standard=>\scratchdimen=\scratchdimen,
- \s!unknown=>\scratchdimen=\@@FLOWoffset,
- \s!default=>\scratchdimen=-2.5\scratchdimen]%
- \edef\@@FLOW@@offset{\the\scratchdimen}%
- \forgetall
- \offinterlineskip
- \resetMPdrawing
- \doglobal\newcounter\FLOWcomment
- \startMPdrawing
- if unknown context_char : input mp-char.mp ; fi ;
- grid_width := \FLOWgridwidth ;
- grid_height := \FLOWgridheight ;
- shape_width := \FLOWshapewidth ;
- shape_height := \FLOWshapeheight ;
- connection_line_width := \@@FLOLrulethickness ;
- connection_smooth_size := \@@FLOLradius ;
- connection_arrow_size := \@@FLOLradius ;
- connection_dash_size := \@@FLOLradius ;
- currentpicture := nullpicture ;
- begin_chart(0,\FLOWwidth,\FLOWheight);
- reverse_y := true ;
- chart_offset := \@@FLOW@@offset ;
- \stopMPdrawing
- \doifelsenothing\@@FLOWbackgroundcolor
- {\startMPdrawing
- chart_background_color := white ;
- \stopMPdrawing}
- {\startMPdrawing
- chart_background_color := \MPcolor{\@@FLOWbackgroundcolor} ;
- \stopMPdrawing}%
- \doif\@@FLOWoption\v!test
- {\startMPdrawing
- show_con_points := true ;
- show_mid_points := true ;
- show_all_points := true ;
- \stopMPdrawing}%
- \processaction % private
- [\@@FLOWdot]
- [ \v!yes=>\startMPdrawing
- show_con_points := true ;
- show_mid_points := true ;
- show_all_points := true ;
- \stopMPdrawing,
- \s!unknown=>\startMPdrawing
- show_\@@FLOWdot_points := true ;
- \stopMPdrawing]%
-\doglobal\newcounter\FLOWcomment
- \let\startFLOWcell\startFLOWcellB
- \resetFLOWlocation
- \processFLOWbuffer\currentFLOWnumber
-\doglobal\newcounter\FLOWcomment
- \let\startFLOWcell\startFLOWcellC
- \resetFLOWlocation
- \processFLOWbuffer\currentFLOWnumber
- \startMPdrawing
- clip_chart(\@@FLOWx,\@@FLOWy,\@@FLOWnx,\@@FLOWny) ;
- end_chart ;
- \stopMPdrawing
- \MPdrawingdonetrue
- \setbox0\hbox
- {\MPstaticgraphictrue
- \MPshiftdrawingfalse
- \getMPdrawing}%
- \def\MPmessage##1%
- {\writestatus{MP charts}{##1}}%
- \def\MPposition##1##2##3%
- {\setvalue{\@@MPx##1}{##2}\setvalue{\@@MPy##1}{##3}}%
- \def\MPclippath##1##2##3##4%
- {\def\clipMPllx{##1bp}\def\clipMPlly{##2bp}%
- \def\clipMPurx{##3bp}\def\clipMPury{##4bp}}%
- \def\MPareapath##1##2##3##4%
- {\def\areaMPllx{##1bp}\def\areaMPlly{##2bp}%
- \def\areaMPurx{##3bp}\def\areaMPury{##4bp}}%
- \getMPdata
- \doglobal\newcounter\FLOWcomment
- \let\startFLOWcell\startFLOWcellD
- \setbox2\vbox to \ht0
- {\forgetall % \offinterlineskip
- \resetFLOWlocation
- \processFLOWbuffer\currentFLOWnumber\vss}%
- \setbox2\hbox
- {\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box2}%
- \wd2\wd0\ht2\ht0\dp2\dp0
- \let\startFLOWcell\startFLOWcellE
- \setbox4\vbox to \ht0
- {\forgetall % \offinterlineskip
- \resetFLOWlocation
- \processFLOWbuffer\currentFLOWnumber\vss}%
- \setbox4\hbox
- {\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box4}%
- \wd4\wd0\ht4\ht0\dp4\dp0
- \doifelse\@@FLOWoption\v!test
- {\setbox6\vbox
- {\forgetall
- \vskip\@@FLOW@@offset
- \hskip\@@FLOW@@offset
- \basegrid
- [\c!x=\@@FLOWx,\c!nx=\@@FLOWnx,\c!dx=\withoutpt\FLOWgridwidth,
- \c!y=\@@FLOWy,\c!ny=\@@FLOWny,\c!dy=\withoutpt\FLOWgridheight,
- \c!xstep=1,\c!ystep=1,
- \c!unit=pt,\c!location=\v!middle]}%
- \wd6\wd0\ht6\ht0\dp6\dp0
- \setbox8\vbox
- {\forgetall
- \offinterlineskip
- \vskip\@@FLOW@@offset
- \dostepwiserecurse\@@FLOWy\@@FLOWny\plusone
- {\vbox to \FLOWgridheight
- {\vfill
- \hskip\@@FLOW@@offset
- \hbox
- {\dostepwiserecurse\@@FLOWx\@@FLOWnx\plusone
- {\hbox to \FLOWgridwidth
- {\hfill
- \framed
- [\c!framecolor=red,
- \c!width=\FLOWshapewidth,
- \c!height=\FLOWshapeheight]
- {}%
- \hfill}}}
- \vfill}}}%
- \wd8\wd0\ht8\ht0\dp8\dp0
- \framed
- [\c!offset=\v!overlay,\c!framecolor=green]
- {\hbox{\box4\hskip-\wd0\box0\hskip-\wd2\box2\hskip-\wd6\box6\hskip-\wd8\box8}}}
- {\framed
- [\c!offset=\v!overlay,
- \c!frame=\@@FLOWframe,
- \c!rulethickness=\@@FLOWrulethickness,
- \c!framecolor=\@@FLOWframecolor,
- \c!background=\@@FLOWbackground,
- \c!backgroundcolor=\@@FLOWbackgroundcolor]
- {\hbox{\box4\hskip-\wd0\box0\hskip-\wd2\box2}}}%
- %\message{[\FLOWcells]}\wait
- \egroup}
-
-% Pass A
-
-\long\def\startFLOWcellA#1\stopFLOWcell%
- {\resetFLOWcell
- \ignorespaces#1\unskip
- \expandafter\getFLOWlocationA\FLOWlocation\end
- \ignorespaces}
-
-\def\getFLOWlocationA#1,#2\end
- {\ifnum0#1>\FLOWwidth \xdef\FLOWwidth {#1}\fi
- \ifnum0#2>\FLOWheight\xdef\FLOWheight{#2}\fi}
-
-% Pass B
-%
-% beware: the - after \@FLOC@ is needed since name can be
-% empty and we don't want to redefine \@FLOC@ itself by
-% mistake
-
-\long\def\startFLOWcellB#1\stopFLOWcell
- {\resetFLOWcell\ignorespaces#1\unskip
- \setxvalue{\@FLOC@-\FLOWname}{\FLOWlocation}% kost veel cs's
- \ifx\FLOWshape\empty
- \global\let\FLOWshape\@@FLOSdefault
- \fi
- \doifnot\FLOWshape{none} % {\v!none}
- {\ExpandBothAfter\doifinsetelse{\FLOWshape}{\FLOWshapes}
- {\edef\FLOWshapetag{shape_\FLOWshape}% beter \expanded
- \@EA\setFLOWname\@EA\FLOWshapetag\@EA{\FLOWshapetag}}
- {\doifnumberelse\FLOWshape
- {\let\FLOWshapetag\FLOWshape}
- {\let\FLOWshapetag\empty}}%
- \ifx\FLOWshapetag\empty \else
- \ExpandBothAfter\doifinsetelse{\FLOWshape}{\FLOWlines}
- {\chardef\FLOWstate0 }
- {\ExpandBothAfter\doifcommonelse{\FLOWcell,\FLOWfocus}{\@@FLOWfocus}
- {\chardef\FLOWstate1 }
- {\chardef\FLOWstate2 }}%
- \startMPdrawing
- begin_sub_chart ;
- \ifcase\FLOWstate
- shape_line_color := \MPcolor{\@@FLOLcolor} ;
- shape_fill_color := \MPcolor{\@@FLOLcolor} ;
- shape_line_width := \@@FLOLrulethickness ;
- \or
- shape_line_color := \MPcolor{\@@FLOFframecolor} ;
- shape_fill_color := \MPcolor{\@@FLOFbackgroundcolor} ;
- shape_line_width := \@@FLOFrulethickness ;
- \or
- shape_line_color := \MPcolor{\@@FLOSframecolor} ;
- shape_fill_color := \MPcolor{\@@FLOSbackgroundcolor} ;
- shape_line_width := \@@FLOSrulethickness ;
- \fi
- %\ifx\FLOWoverlay\empty
- % peepshape := false ;
- %\else
- % peepshape := true ;
- %\fi
- peepshape := \ifx\FLOWoverlay\empty false \else true \fi ;
- new_shape(\FLOWlocation,\FLOWshapetag) ;
- end_sub_chart ;
- \stopMPdrawing
- \fi}%
- \ignorespaces}
-
-% Pass C
-
-\long\def\startFLOWcellC#1\stopFLOWcell%
- {\resetFLOWcell
-\pushmacro\lastFLOWx
-\pushmacro\lastFLOWy
- \ignorespaces#1\unskip % makes sure that vars are set
-\popmacro\lastFLOWy
-\popmacro\lastFLOWx
- \let\connection\doFLOWconnectionC
- \ignorespaces#1\unskip}
-
-\def\FLOWorigin{0,0}
-
-\def\doFLOWdisplace[#1,#2,#3]% experiment
- {dsp_x := #1 ; dsp_y := #2 ;}
-
-\def\doFLOWconnectionC
- {\dodoubleempty\dodoFLOWconnectionC}
-
-\def\dodoFLOWconnectionC[#1][#2]#3%
- {\doglobal\increment\FLOWcomment
- \setFLOWname\otherFLOWname{name_#3}%
- \doifdefinedelse{\@FLOC@-\FLOWname}
- {\edef\FLOWfrom{\getvalue{\@FLOC@-\FLOWname}}}
- {\let \FLOWfrom \FLOWorigin}%
- \ifx\FLOWfrom\FLOWorigin \else
- \doifdefinedelse{\@FLOC@-\otherFLOWname}
- {\edef\FLOWto {\getvalue{\@FLOC@-\otherFLOWname}}}
- {\let \FLOWto \FLOWorigin}%
- \ifx\FLOWto\FLOWorigin \else
- \FLOWsetconnect{#1}%
- \ifx\cFLOWfrom\empty \else
- \doifelse\@@FLOLcorner\v!round
- {\startMPdrawing smooth := true ; \stopMPdrawing}
- {\startMPdrawing smooth := false ; \stopMPdrawing}%
- \doifelse\@@FLOLdash\v!yes
- {\startMPdrawing dashline := true ; \stopMPdrawing}
- {\startMPdrawing dashline := false ; \stopMPdrawing}%
- \doifelse\@@FLOLarrow\v!yes
- {\startMPdrawing arrowtip := true ; \stopMPdrawing}
- {\startMPdrawing arrowtip := false ; \stopMPdrawing}%
- \doifelse\@@FLOLoffset\v!none
- {\startMPdrawing touchshape := true ; \stopMPdrawing}
- {\startMPdrawing touchshape := false ; \stopMPdrawing}%
-%\doifsomething{#2}
-% {\startMPdrawing
-% \doFLOWdisplace[0#2,0,0]%
-% \stopMPdrawing}%
- \startMPdrawing
-\doFLOWdisplace[0#2,0,0]%
- connection_line_color := \MPcolor{\@@FLOLcolor} ;
- connection_line_width := \@@FLOLrulethickness ;
- connect_\cFLOWfrom_\cFLOWto (\FLOWfrom,\zFLOWfrom) (\FLOWto,\zFLOWto) ;
-\doFLOWdisplace[0,0,0]%
- \stopMPdrawing
- \fi
- \fi
- \fi
- \ignorespaces}
-
-% Pass D
-
-\long\def\startFLOWcellD#1\stopFLOWcell
- {\resetFLOWcell
-\pushmacro\lastFLOWx
-\pushmacro\lastFLOWy
- \ignorespaces#1\unskip % presets vars
-\popmacro\lastFLOWy
-\popmacro\lastFLOWx
- \let\doprocessFLOWcell\doprocessFLOWcellD
- \expandafter\doprocessFLOWcellD\FLOWlocation\end
- \let\connection\doFLOWconnectionD
- \let\comment\doFLOWcommentD
- \ignorespaces#1\unskip\ignorespaces}
-
-\def\doFLOWconnectionD
- {\dodoubleempty\dodoFLOWconnectionD}
-
-\def\dodoFLOWconnectionD[#1][#2]#3%
- {\doglobal\increment\FLOWcomment
- \ignorespaces}
-
-\def\doFLOWcommentD[#1]#2%
- {\bgroup
- \let\FLOW \middlebox
- \let\FLOWb \bottombox
- \let\FLOWbl\bottomleftbox
- \let\FLOWbr\bottomrightbox
- \let\FLOWt \topbox
- \let\FLOWtl\topleftbox
- \let\FLOWtr\toprightbox
- \let\FLOWl \leftbox
- \let\FLOWlt\lefttopbox
- \let\FLOWlb\leftbottombox
- \let\FLOWr \rightbox
- \let\FLOWrt\righttopbox
- \let\FLOWrb\rightbottombox
- \let\FLOWc \middlebox
-%\ifdefined{FLOW#1}%
- \ifcase0\getvalue{\@@MPx\FLOWcomment}\getvalue{\@@MPy\FLOWcomment}\relax
- \else
- \ifdim\getvalue{\@@MPx\FLOWcomment}\s!bp<\areaMPllx\relax\else
- \ifdim\getvalue{\@@MPx\FLOWcomment}\s!bp>\areaMPurx\relax\else
- \ifdim\getvalue{\@@MPy\FLOWcomment}\s!bp<\areaMPlly\relax\else
- \ifdim\getvalue{\@@MPy\FLOWcomment}\s!bp>\areaMPury\relax\else
- \dimen0=\getvalue{\@@MPx\FLOWcomment}\s!bp
- \advance\dimen0 -\@@FLOW@@offset
- \advance\dimen0 -\clipMPllx
- \dimen2=\clipMPury
- \advance\dimen2 -\@@FLOW@@offset
- \advance\dimen2 -\getvalue{\@@MPy\FLOWcomment}\s!bp
- \setbox\scratchbox\hbox{\strut#2}%
- \boxoffset.5\bodyfontsize
- \setbox\scratchbox\hbox{\hskip\dimen0\lower\dimen2\getvalue{FLOW#1}{\box\scratchbox}}%
- \smashbox\scratchbox
- \box\scratchbox
- \boxoffset\zeropoint
- \nointerlineskip % really needed
- \fi
- \fi
- \fi
- \fi
- \fi
-%\fi
- \egroup
- \ignorespaces}
-
-% pass D
-
-\def\dophaseoneFLOWcellX#1#2%
- {\!!counta#1\relax
- \!!countb#2\relax
- \!!countc\@@FLOWx
- \!!countd\@@FLOWy
- \advance\!!countc \@@FLOWnx
- \advance\!!countd \@@FLOWny
- \advance\!!countc \minusone
- \advance\!!countd \minusone
- \ifnum\!!counta<\@@FLOWx\relax \donefalse
- \else\ifnum\!!counta>\!!countc \donefalse
- \else\ifnum\!!countb<\@@FLOWy\relax \donefalse
- \else\ifnum\!!countb>\!!countd \donefalse
- \else \donetrue
- \fi\fi\fi\fi}
-
-\def\dophasetwoFLOWcellX
- {\advance\!!counta -\@@FLOWx
- \advance\!!counta \plusone
- \advance\!!countb -\@@FLOWy
- \advance\!!countb \plusone
- \dimen0=\FLOWgridwidth
- \dimen0=\!!counta\dimen0
- \advance\dimen0 -\FLOWgridwidth
- \dimen4=\FLOWgridwidth
- \advance\dimen4 -\FLOWshapewidth
- \advance\dimen0 .5\dimen4
- \dimen2=\FLOWgridheight
- \dimen2=\!!countb\dimen2
- \dimen4=\FLOWgridheight
- \advance\dimen4 -\FLOWshapeheight
- \advance\dimen2 -.5\dimen4
- \edef\FLOWdx{\the\dimen0}%
- \edef\FLOWdy{\the\dimen2}}
-
-\def\positionFLOWzero% assumes \FLOWdx and \FLOWdy are set
- {\setbox0\hbox{\hskip\FLOWdx\lower\FLOWdy\box0}%
- \smashbox0\box0
- \nointerlineskip} % new, needed since we somehow reset that
-
-\def\doFLOWtlabel#1#2#3%
- {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdy\fi
- \setbox0\hbox{\hskip\dimen2\raise\scratchdimen
- \hbox{\raise\dimen4\hbox{#1{\strut#3}}}}%
- \positionFLOWzero}%
-
-\def\doFLOWblabel#1#2#3%
- {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdy\fi
- \setbox0\hbox{\hskip\dimen2\raise-\scratchdimen
- \hbox{#1{\strut#3}}}%
- \positionFLOWzero}%
-
-\def\doFLOWllabel#1#2#3%
- {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdx\fi
- \setbox0\hbox{\hskip-\scratchdimen\raise\dimen6
- \hbox{#1{\strut#3}}}%
- \positionFLOWzero}%
-
-\def\doFLOWrlabel#1#2#3%
- {\scratchdimen\ifcase#2 \zeropoint\else\@@FLOWdx\fi
- \setbox0\hbox{\hskip\dimen0\hskip\scratchdimen
- \hbox{\raise\dimen6\hbox{#1{\strut#3}}}}%
- \positionFLOWzero}
-
-\def\doprocessFLOWcellD#1,#2\end
- {\dophaseoneFLOWcellX{#1}{#2}%
- \ifdone
- \dophasetwoFLOWcellX
- \doglobal\addtocommalist\FLOWcell\FLOWcells
- \def\FLOWx{#1}%
- \def\FLOWy{#2}%
- \directsetup{flowcell}%
- \setbox0\hbox
- {\ifx\FLOWalign\empty\else
- \setupframed
- [\c!align=\v!normal,\c!bottom=\vfill,\c!top=\vfill]%
- \@EA\processallactionsinset\@EA
- [\FLOWalign]
- [t=>{\setupframed[\c!bottom=\vfill,\c!top=]},
- b=>{\setupframed[\c!bottom=,\c!top=\vfill]},
- l=>{\setupframed[\c!align=\v!right]},
- r=>{\setupframed[\c!align=\v!left]},
- m=>{\setupframed[\c!align=\v!middle]},
- c=>{\setupframed[\c!align=\v!middle]}]%
- \fi
- \doifelse\FLOWshape{none} % {\v!none}
- {\setupframed[\c!offset=\v!overlay]}
- {\setupframed[\c!offset=\@@FLOSoffset]}%
- \framed
- [\c!frame=\v!off,\c!background=flowcell,
- \c!width=\FLOWshapewidth,\c!height=\FLOWshapeheight]
- {\FLOWtext}}%
- \showFLOWhelp0
- \ifx\FLOWdestination\empty\else
- \setbox0\hbox
- {\setupinteraction[\c!color=,\c!contrastcolor=]%
- \gotobox{\box0}[\FLOWdestination]}%
- \fi
- \positionFLOWzero
- \dimen0=\FLOWshapewidth \dimen2=.5\dimen0
- \dimen4=\FLOWshapeheight\dimen6=.5\dimen4
- \boxoffset.5\bodyfontsize
- \doFLOWtlabel \righttopbox0\tFLOWlabel
- \doFLOWblabel\rightbottombox0\bFLOWlabel
- \doFLOWllabel \lefttopbox0\lFLOWlabel
- \doFLOWrlabel \righttopbox0\rFLOWlabel
- \doFLOWtlabel \topbox0\tcFLOWlabel % for me only
- \doFLOWblabel \bottombox0\bcFLOWlabel % for me only
- \doFLOWllabel \leftbox0\lcFLOWlabel % for me only
- \doFLOWrlabel \rightbox0\rcFLOWlabel % for me only
- \ifnum#1=\@@FLOWx\relax \doFLOWllabel \leftbox1\lFLOWexit \fi
- \ifnum#1=\!!countc \doFLOWrlabel \rightbox1\rFLOWexit \fi
- \ifnum#2=\@@FLOWy\relax \doFLOWtlabel \topbox1\tFLOWexit \fi
- \ifnum#2=\!!countd \doFLOWblabel \bottombox1\bFLOWexit \fi
- \boxoffset\zeropoint
- \fi}
-
-% For Willy Egger:
-%
-% \startsetups flowcell
-% \definelayer
-% [flowcell]
-% [width=\FLOWshapewidth,
-% height=\FLOWshapeheight]
-% \setlayerframed
-% [flowcell]
-% [preset=rightbottom,offset=1ex]
-% [frame=off]
-% {\tx(\FLOWx,\FLOWy)}
-% \stopsetups
-
-% Pass E
-
-\long\def\startFLOWcellE#1\stopFLOWcell
- {\resetFLOWcell
- \ignorespaces#1\unskip
- \let\doprocessFLOWcell\doprocessFLOWcellE
- \expandafter\doprocessFLOWcell\FLOWlocation\end}
-
-\def\doprocessFLOWcellE#1,#2\end % redundant
- {\ifx\FLOWoverlay\empty \else
- \dophaseoneFLOWcellX{#1}{#2}%
- \ifdone
- \dophasetwoFLOWcellX
- \edef\FLOWdx{\the\dimen0}%
- \edef\FLOWdy{\the\dimen2}%
- \setbox0\hbox
- {\framed
- [%\c!frame=\v!off,
- \c!background={\@@FLOWbackground,\FLOWoverlay},
- \c!backgroundcolor=\@@FLOSbackgroundcolor,
- \c!width=\FLOWshapewidth,\c!height=\FLOWshapeheight]
- {}}%
- \positionFLOWzero
- \fi
- \fi}
-
-% Pass F
-
-\def\checkFLOWautofocus
- {\def\@@FLOWminx{100}\let\@@FLOWminy\@@FLOWminx
- \def\@@FLOWmaxx {0}\let\@@FLOWmaxy\@@FLOWmaxx
- \def\@@FLOWabsx {0}\let\@@FLOWabsy\@@FLOWabsx
- \let\startFLOWcell\startFLOWcellF
- \resetFLOWlocation
- \processFLOWbuffer\currentFLOWnumber
- %\message{AUTOSHAPE 1: (\@@FLOWminx,\@@FLOWminy)->(\@@FLOWmaxx,\@@FLOWmaxy)}%
- \ifnum\@@FLOWabsx<\@@FLOWmaxx\let\@@FLOWmaxx\@@FLOWabsx\fi
- \ifnum\@@FLOWabsy<\@@FLOWmaxy\let\@@FLOWmaxy\@@FLOWabsy\fi
- %\message{AUTOSHAPE 2: (\@@FLOWminx,\@@FLOWminy)->(\@@FLOWmaxx,\@@FLOWmaxy)}%
- \donetrue
- \ifnum\@@FLOWminx=100 \donefalse\fi
- \ifnum\@@FLOWminy=100 \donefalse\fi
- \ifnum\@@FLOWmaxx=0 \donefalse\fi
- \ifnum\@@FLOWmaxy=0 \donefalse\fi
- \doFLOWcheckF\@@FLOWx\@@FLOWminx\@@FLOWmaxx\@@FLOWnx
- \doFLOWcheckF\@@FLOWy\@@FLOWminy\@@FLOWmaxy\@@FLOWny}
-
-\def\startFLOWcellF#1\stopFLOWcell%
- {\resetFLOWcell
- \ignorespaces#1\unskip
- \expandafter\doFLOWlocationF\FLOWlocation\end}%
-
-\def\doFLOWlocationF#1,#2\end%
- {\ifnum#1>\@@FLOWabsx\def\@@FLOWabsx{#1}\fi
- \ifnum#2>\@@FLOWabsy\def\@@FLOWabsy{#2}\fi
- \ExpandBothAfter\doifinset{\FLOWcell}{\@@FLOWautofocus}
- {\dodoFLOWlocationF{#1}<-\@@FLOWminx
- \dodoFLOWlocationF{#1}>+\@@FLOWmaxx
- \dodoFLOWlocationF{#2}<-\@@FLOWminy
- \dodoFLOWlocationF{#2}>+\@@FLOWmaxy}}
-
-\def\dodoFLOWlocationF#1#2#3#4%
- {\ifnum#1#2#4\relax
- \!!counta=#1\advance\!!counta #31\relax
- \edef#4{\ifnum\!!counta<1 1\else\the\!!counta\fi}%
- \fi}
-
-\def\doFLOWcheckF#1#2#3#4%
- {\ifdone
- \let#1=#2%
- \!!counta=#3%
- \advance\!!counta \plusone\advance\!!counta -#2\relax
- \ifnum\!!counta<1 \!!counta=1 \fi
- \edef#4{\the\!!counta}%
- \else
- \let#1\!!plusone
- \let#4\!!zerocount % no {1}
- \fi}
-
-% \useFLOWchart[name][parent][setting,setting][additional settings]
-% \useFLOWchart[name][parent][additional settings]
-
-\let\currentFLOWchart\empty
-
-\def\useFLOWchart
- {\doquadrupleempty\douseFLOWchart}
-
-\def\douseFLOWchart[#1][#2][#3][#4]% name parent sets mainsettings
- {\iffourthargument
- \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][#3][#4,##1]}%
- \else
- \checkparameters[#3]%
- \ifparameters
- \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][][#3,##1]}%
- \else
- \setvalue{\@FLOW@--#1}[##1]{\setgetFLOWchart[#2][#3][##1]}%
- \fi
- \fi}
-
-\def\setgetFLOWchart[#1][#2][#3]%
- {\def\docommand##1{}% cell line focus ?
- \processcommalist[#2]\docommand
- \getFLOWchart[#1][#3]}
-
-\def\doFLOWchart[#1][#2]%
- {\hbox\bgroup\vbox\bgroup % vmode suppresses spaces
-\def\currentFLOWchart{#1}%
- \doifundefinedelse{\@FLOW@--#1}
- {\getFLOWchart[#1][#2]}
- {\getvalue{\@FLOW@--#1}[#2]}%
- \egroup\egroup}
-
-\def\FLOWchart%
- {\dodoubleempty\doFLOWchart}
-
-%D A hook into the help system.
-
-\def\showFLOWhelp#1%
- {\doifhelpinfo\FLOWhelp
- {\setbox#1=\hbox
- {\setbox\scratchbox=\hbox{\lower\@@FLOWdy\hbox
- {\helpbutton
- [\c!width=\wd0,\c!color=,\c!height=\@@FLOWdy,\c!frame=\v!no]%
- [\FLOWhelp]}}%
- \smashbox\scratchbox
- \setbox#1=\vbox
- {\forgetall\offinterlineskip\box#1\box\scratchbox}%
- \box#1}}}
-
-%D The next section is dedicated to splitting up charts.
-
-\def\getFLOWsize[#1]%
- {\bgroup\let\dodogetFLOWchart\dogetFLOWsize\FLOWchart[#1]\egroup}
-
-\def\dogetFLOWsize[#1][#2]%
- {\setbox\scratchbox=\vbox
- {\globallet\FLOWmaxwidth \!!zerocount
- \globallet\FLOWmaxheight\!!zerocount
- \def\getFLOWlocation##1,##2\end
- {\ifnum0##1>\FLOWmaxwidth \xdef\FLOWmaxwidth {##1}\fi
- \ifnum0##2>\FLOWmaxheight\xdef\FLOWmaxheight{##2}\fi}%
- \resetFLOWcell
- \long\def\startFLOWcell##1\stopFLOWcell
- {{##1\expandafter\getFLOWlocation\FLOWlocation\end}}%
- \def\dohandleflowchart[##1][##2]%
- {\resetFLOWlocation
- \processFLOWbuffer{##1}}%
- \getvalue{\@FLOW@-#1}}}
-
-\def\setupFLOWsplit%
- {\dodoubleargument\getparameters[\@@FLOT]}
-
-\setupFLOWsplit%
- [\c!nx=3,\c!ny=3,
- \c!dx=1,\c!dy=1,
- \c!command=,
- \c!marking=\v!on,
- \c!before=,\c!after=]
-
-\def\FLOWsplitx {1}
-\def\FLOWsplity {1}
-\def\FLOWsplitnx{1}
-\def\FLOWsplitny{1}
-
-\def\FLOWcharts%
- {\dodoubleempty\doFLOWcharts}
-
-%D While splitting, the following variables are available:
-%D
-%D \starttyping
-%D \FLOWsplitnx \FLOWsplitny \FLOWsplitx \FLOWsplity
-%D \stoptyping
-
-\def\doFLOWcharts[#1][#2]%
- {\bgroup
- \getFLOWsize[#1]%
- \dodoFLOWcharts\relax
- \global\let\FLOWsplitnx\FLOWsplitx
- \global\let\FLOWsplitny\FLOWsplity
- \dodoFLOWcharts{\dododoFLOWcharts[#1][#2]}%
- \egroup}
-
-\def\dodoFLOWcharts#1%
- {\def\@@FLOTx{1}%
- \global\let\FLOWsplitx\@@FLOTx
- \doloop
- {\def\@@FLOTy{1}%
- \global\let\FLOWsplity\@@FLOTy
- \doloop
- {\bgroup
- \scratchcounter\FLOWmaxwidth
- \advance\scratchcounter -\@@FLOTx
- \advance\scratchcounter \plusone
- \ifnum\scratchcounter<\@@FLOTnx\edef\@@FLOTnx{\the\scratchcounter}\fi
- \scratchcounter\FLOWmaxheight
- \advance\scratchcounter -\@@FLOTy
- \advance\scratchcounter \plusone
- \ifnum\scratchcounter<\@@FLOTny\edef\@@FLOTny{\the\scratchcounter}\fi
- #1% does something with the float, or not
- \egroup
- \increment(\@@FLOTy,\@@FLOTny)%
- \ifnum\@@FLOTy>\FLOWmaxheight
- \exitloop
- \else
- \doglobal\increment\FLOWsplity
- \decrement(\@@FLOTy,\@@FLOTdy)%
- \fi}%
- \increment(\@@FLOTx,\@@FLOTnx)%
- \ifnum\@@FLOTx>\FLOWmaxwidth
- \exitloop
- \else
- \doglobal\increment\FLOWsplitx
- \decrement(\@@FLOTx,\@@FLOTdx)%
- \fi}}
-
-\def\dododoFLOWcharts[#1][#2]%
- {\bgroup
- \@@FLOTbefore
- \doifnot\@@FLOTmarking\v!on{\let\cuthbox\hbox}%
- \cuthbox
- {\@@FLOTcommand
- {\FLOWchart[#1][#2,
- \c!x=\@@FLOTx,\c!nx=\@@FLOTnx,
- \c!y=\@@FLOTy,\c!ny=\@@FLOTny]}}%
- \@@FLOTafter
- \egroup}
-
-%D An example of splitting is given below:
-%D
-%D \starttyping
-%D \setupFLOWsplit
-%D [nx=5,ny=10,
-%D dx=0,dy=0,
-%D before=,
-%D after=\page]
-%D
-%D \FLOWcharts[mybigflow]
-%D \stoptyping
-%D
-%D Or, one can say:
-%D
-%D \starttyping
-%D \splitfloat
-%D {\placefigure{What a big flowchart this is!}}
-%D {\FLOWcharts[mybigflow]}
-%D \stoptyping
-
-%D \macros
-%D {typeFLOWchart}
-%D
-%D For documentation purposes the following macro is
-%D provided. Watch the use of the first and last line hooks,
-%D which is needed because the start and stop commands are
-%D not part of the buffer.
-
-\def\typeFLOWchart[#1]%
- {\bgroup
- \def\dohandleflowchart[##1][##2]{\typeFLOWbuffer{##1}}%
- \defconvertedargument\firstverbatimfileline{\startFLOWchart[#1]}%
- \defconvertedargument\lastverbatimfileline {\stopFLOWchart}%
- \getvalue{\@FLOW@-#1}
- \egroup}
-
-%D New:
-%D
-%D \starttyping
-%D \setupFLOWcharts[command=\Whow]
-%D
-%D \startFLOWset[convert-en] % [tag][convert-en]
-%D \subFLOWchart[a][x=1,y=1,nx=3,ny=3]
-%D \subFLOWchart[b][x=1,y=2,nx=3,ny=3]
-%D \subFLOWchart[c][x=2,y=1,nx=3,ny=3]
-%D \stopFLOWset
-%D
-%D \def\Whow#1%
-%D {\ifnum\currentFLOWset=1 \framed{Some Chart}\fi}
-%D
-%D \FLOWset[convert-en] % [tag]
-%D
-%D \def\Whow#1%
-%D {\setuphead[state=high]
-%D \startstandardmakeup
-%D \centerbox{#1}
-%D \stopstandardmakeup}
-%D
-%D \FLOWset[convert-en] % [tag]
-%D \stoptyping
-
-\def\startFLOWset
- {\dodoubleempty\dostartFLOWset}
-
-\def\dostartFLOWset[#1][#2]#3\stopFLOWset % tag name data
- {\ifsecondargument
- \long\setvalue{\@FLOX@#1}{\dohandleFLOWset{#1}{#2}{#3}}%
- \else
- \long\setvalue{\@FLOX@#1}{\dohandleFLOWset{#1}{#1}{#3}}%
- \fi}
-
-\long\def\dohandleFLOWset#1#2#3% tag name data
- {\bgroup
- \def\subFLOWchart
- {\dodoubleempty\dosubFLOWchart}%
- \def\dosubFLOWchart[##1][##2]% subtag settings
- {\ifsecondargument
- \dodohandleFLOWset{#1}{##1}{#2}{##2}%
- \else
- \subFLOWchart[][##1]%
- \fi}%
- #3%
- \egroup}
-
-\def\dodohandleFLOWset#1#2#3#4% tag subtag name settings
- {\increment\currentFLOWset
- \bgroup
- \@@FLOXcommand
- {\ifnum\currentFLOWset=1 \pagereference[#1]\fi
- \doifsomething{#2}
- {\setupreferencing[\c!prefix=]%
- \pagereference[#1:#2]% -:#1:#2
- \setupreferencing[\c!prefix=#1:#2]}%
- \FLOWchart[#3][#4]}%
- \egroup}
-
-\def\FLOWset[#1]%
- {\newcounter\currentFLOWset
- \doifdefinedelse{\@FLOX@#1}
- {\getvalue{\@FLOX@#1}}
- {\dodohandleFLOWset{#1}{}{#1}{}}}
-
-\newcounter\currentFLOWset
-
-\setupFLOWsets
- [\c!command=]
-
-%D This will be an option:
-
-% \def\startFLOWchart%
-% {\dodoubleempty\dostartFLOWchart}
-%
-% \long\def\dostartFLOWchart[#1][#2]#3\stopFLOWchart
-% {\preparenextFLOWchart{#1}{#2}%
-% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}}
-%
-% \long\def\dodefineFLOWchart[#1][#2]#3%
-% {\preparenextFLOWchart{#1}{#2}%
-% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}}
-%
-% \def\processFLOWbuffer#1{\getvalue{\FLOWbufferprefix#1}}
-% \def\typeFLOWbuffer #1{[Sorry, no verbatim chart #1 available.]}
+%D This file will become obsolete.
\loadmarkfile{m-chart}
diff --git a/Master/texmf-dist/tex/context/base/m-chemic.tex b/Master/texmf-dist/tex/context/base/m-chemic.tex
deleted file mode 100644
index 7bacf4a9048..00000000000
--- a/Master/texmf-dist/tex/context/base/m-chemic.tex
+++ /dev/null
@@ -1,17 +0,0 @@
-%D \module
-%D [ file=ppchtex (m-chemic),
-%D version=1997.03.19,
-%D title=\CONTEXT\ Extra Modules,
-%D subtitle=\PPCHTEX\ (Plain Pictex Context cHemie \TEX),
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten},
-%D suggestions={Tobias Burnus, Dirk Kuypers \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\loadmarkfile{m-chemic}
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/m-database.lua b/Master/texmf-dist/tex/context/base/m-database.lua
new file mode 100644
index 00000000000..8dde9690e96
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/m-database.lua
@@ -0,0 +1,108 @@
+if not modules then modules = { } end modules ['m-database'] = {
+ version = 1.001,
+ comment = "companion to m-database.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local sub, gmatch, format = string.sub, string.gmatch, string.format
+local concat = table.concat
+local lpegpatterns, lpegmatch, lpegsplitat = lpeg.patterns, lpeg.match, lpeg.splitat
+local lpegP, lpegC, lpegS, lpegCt = lpeg.P, lpeg.C, lpeg.S, lpeg.Ct
+local sprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+
+local trace_flush = false trackers.register("module.database.flush", function(v) trace_flush = v end)
+
+local report_database = logs.reporter("database")
+
+buffers.database = buffers.database or { }
+
+local separators = { -- not interfaced
+ tab = lpegpatterns.tab,
+ tabs = lpegpatterns.tab^1,
+ comma = lpegpatterns.comma,
+ space = lpegpatterns.space,
+ spaces = lpegpatterns.space^1,
+}
+
+local function tracedsprint(c,str)
+ report_database("snippet: %s",str)
+ sprint(c,str)
+end
+
+function buffers.database.process(settings)
+ local data
+ local sprint = trace_flush and tracedsprint or sprint
+ if settings.type == "file" then
+ local filename = resolvers.finders.byscheme("any",settings.database)
+ data = filename ~= "" and io.loaddata(filename)
+ data = data and string.splitlines(data)
+ else
+ data = buffers.getlines(settings.database)
+ end
+ if data and #data > 0 then
+ local separatorchar, quotechar, commentchar = settings.separator, settings.quotechar, settings.commentchar
+ local before, after = settings.before or "", settings.after or ""
+ local first, last = settings.first or "", settings.last or ""
+ local left, right = settings.left or "", settings.right or ""
+ local setups = settings.setups or ""
+ local command = settings.command
+ separatorchar = (not separatorchar and ",") or separators[separatorchar] or separatorchar
+ local separator = type(separatorchar) == "string" and lpegS(separatorchar) or separatorchar
+ local whatever = lpegC((1 - separator)^0)
+ if quotechar and quotechar ~= "" then
+ local quotedata = nil
+ for chr in gmatch(quotechar,".") do
+ local quotechar = lpegP(chr)
+ local quoteword = quotechar * lpeg.C((1 - quotechar)^0) * quotechar
+ if quotedata then
+ quotedata = quotedata + quoteword
+ else
+ quotedata = quoteword
+ end
+ end
+ whatever = quotedata + whatever
+ end
+ local checker = commentchar ~= "" and lpeg.S(commentchar)
+ local splitter = lpegCt(whatever * (separator * whatever)^0)
+ local found = false
+ for i=1,#data do
+ local line = data[i]
+ if line ~= "" and (not checker or not lpegmatch(checker,line)) then
+ local result, r = { }, 0 -- we collect as this is nicer in tracing
+ local list = lpegmatch(splitter,line)
+ if not found then
+ if setups ~= "" then
+ sprint(ctxcatcodes,format("\\begingroup\\setups[%s]",setups))
+ end
+ sprint(ctxcatcodes,before)
+ found = true
+ end
+ r = r + 1 ; result[r] = first
+ for j=1,#list do
+ r = r + 1 ; result[r] = left
+ if command == "" then
+ r = r + 1 ; result[r] = list[j]
+ else
+ r = r + 1 ; result[r] = command
+ r = r + 1 ; result[r] = "{"
+ r = r + 1 ; result[r] = list[j]
+ r = r + 1 ; result[r] = "}"
+ end
+ r = r + 1 ; result[r] = right
+ end
+ r = r + 1 ; result[r] = last
+ sprint(ctxcatcodes,concat(result))
+ end
+ end
+ if found then
+ sprint(ctxcatcodes,after)
+ if setups ~= "" then
+ sprint(ctxcatcodes,"\\endgroup")
+ end
+ end
+ else
+ -- message
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/m-database.tex b/Master/texmf-dist/tex/context/base/m-database.mkii
index 3bb050f142a..3bb050f142a 100644
--- a/Master/texmf-dist/tex/context/base/m-database.tex
+++ b/Master/texmf-dist/tex/context/base/m-database.mkii
diff --git a/Master/texmf-dist/tex/context/base/m-database.mkiv b/Master/texmf-dist/tex/context/base/m-database.mkiv
new file mode 100644
index 00000000000..0653bfa0e94
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/m-database.mkiv
@@ -0,0 +1,241 @@
+%D \module
+%D [ file=m-database,
+%D version=2010.08.04,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Database Thingies,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA
+%D ]
+
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D For Mojca.
+
+\registerctxluafile{m-database}{1.001}
+
+\unprotect
+
+\def\c!first {first}
+\def\c!last {last}
+\def\c!quotechar {quotechar}
+\def\c!commentchar {commentchar}
+
+% \def\????db{@@@@db}
+%
+% \installparameterhandler \????db {database}
+% \installcommandhandler \????db {database} \????db % #3 == defaultroot
+% \installattributehandler \????db {database}
+%
+% or:
+%
+% \installnamespace{db} \installcommandhandler\????db{database}\????db
+%
+% \appendtoks
+% \getparameters
+% [\????db\currentdatabase]
+% [\c!separator={,},
+% \c!quotechar=,
+% \c!commentchar=,
+% \c!setups=,
+% \c!before=,
+% \c!after=,
+% \c!first=,
+% \c!last=,
+% \c!left=,
+% \c!right=,
+% \c!command=]%
+% \to \everypresetdatabase
+%
+% or:
+
+\definenamespace
+ [db]
+ [type=module,
+ comment=database module,
+ version=1,
+ name=database,
+ parent=db,
+ setup=yes,
+ command=yes]
+
+\setupdatabase
+ [\c!separator={,},
+ \c!quotechar=,
+ \c!commentchar=,
+ \c!before=,
+ \c!after=,
+ \c!first=,
+ \c!last=,
+ \c!left=,
+ \c!right=]
+
+% \let\currentdatabase\empty \the\everypresetdatabase % or just:
+
+\setupdatabase
+ [\c!separator={,}]
+
+\def\doprocessdatabase#1#2#3%
+ {\edef\currentdatabasetype{#1}%
+ \edef\currentdatabase {#2}%
+ \edef\currentdatabasename{#3}%
+ \ifx\currentdatabasename\empty
+ \let\currentdatabasename\currentdatabase
+ \let\currentdatabase\empty
+ \fi
+ \ctxlua{buffers.database.process {
+ name = "\currentdatabase",
+ type = "\currentdatabasetype",
+ database = "\currentdatabasename",
+ separator = \!!bs\databaseparameter\c!separator \!!es,
+ quotechar = \!!bs\databaseparameter\c!quotechar \!!es,
+ commentchar = \!!bs\databaseparameter\c!commentchar\!!es,
+ setups = \!!bs\databaseparameter\c!setups \!!es,
+ before = \!!bs\databaseparameter\c!before \!!es,
+ after = \!!bs\databaseparameter\c!after \!!es,
+ first = \!!bs\databaseparameter\c!first \!!es,
+ last = \!!bs\databaseparameter\c!last \!!es,
+ left = \!!bs\databaseparameter\c!left \!!es,
+ right = \!!bs\databaseparameter\c!right \!!es,
+ command = \!!bs\databaseparameter\c!command \!!es,
+ }}}
+
+\unexpanded\def\processdatabasebuffer{\dodoubleempty\doprocessdatabasebuffer}
+\unexpanded\def\processdatabasefile {\dodoubleempty\doprocessdatabasefile }
+
+\def\doprocessdatabasebuffer[#1][#2]{\doprocessdatabase{buffer}{#1}{#2}}
+\def\doprocessdatabasefile [#1][#2]{\doprocessdatabase{file} {#1}{#2}}
+
+% for old times sake:
+
+\def\defineseparatedlist {\dodoubleempty\dodefineseparatedlist }
+\def\processseparatedfile{\dodoubleempty\doprocessseparatedfile}
+
+\def\dodefineseparatedlist[#1][#2]%
+ {\definedatabase[#1][#2]%
+ \setuvalue{\e!start#1}{\dostartbuffer[#1][\e!start#1][\e!stop#1]}%
+ \setuvalue{\e!stop#1}{\processdatabasebuffer[#1][#1]}}
+
+\def\processseparatedfile[#1][#2]%
+ {\processdatabasefile[#1][#2]}
+
+\def\startseparatedlist[#1]% to be interfaced
+ {\def\stopseparatedlist{\processdatabasebuffer[#1][#1]}%
+ \dostartbuffer[#1][startseparatedlist][stopseparatedlist]}
+
+\protect
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+% m-database.txt
+%
+% 1,2,3,4,5
+% 6,7,8,"9,x",0
+% A,B,C,D
+% E,,F
+% G
+
+\definedatabase[test]
+
+\setupdatabase
+ [test]
+ [separator={,},
+ quotechar={"},
+ before={<},
+ after={>},
+ first={\endgraf[},
+ last={]\endgraf},
+ left={ (},
+ right={) },
+ command=\ruledhbox]
+
+\startbuffer[testbuffer]
+1,2,3,4,5
+6,7,8,"9,x",0
+A,B,C,D
+E,,F
+G
+\stopbuffer
+
+\processdatabasebuffer[test][testbuffer]
+
+\processdatabasefile[test][m-database.txt]
+
+\defineseparatedlist
+ [CSV]
+ [separator={,},
+ before=\bTABLE,after=\eTABLE,
+ first=\bTR,last=\eTR,
+ left=\bTD,right=\eTD]
+
+% \startseparatedlist[CSV]
+% a,b,c
+% d,e,f
+% \stopseparatedlist
+
+\startCSV
+a,b,c
+d,e,f
+\stopCSV
+
+\defineseparatedlist
+ [CSV]
+ [separator={,+},quotechar={"'},commentchar=\letterhash,
+ before={\starttabulate[|l|l|l|]},after=\stoptabulate,
+ first=\NC,last=\NR,
+ left=,right=\NC]
+
+\startCSV
+#a,b,"c,d"
+a,b,"c,d"
+a,'b,c',d
+"a,b"+c+d
+\stopCSV
+
+\defineseparatedlist
+ [CSV]
+ [separator=space,
+ first=\NC,last=\NR,
+ left=,right=\NC,
+ before={\starttabulate[|l|l|l|]},after=\stoptabulate]
+
+\startCSV
+a b c
+d e f
+\stopCSV
+
+\startsetups csv:unix
+ \catcode\hashasciicode\commentcatcode
+\stopsetups
+
+\defineseparatedlist
+ [CSV]
+ [setups=csv:unix,
+ separator={,},
+ first=\NC,last=\NR,
+ left=,right=\NC,
+ before={\starttabulate[|l|l|l|]},after=\stoptabulate]
+
+\processseparatedfile[CSV][m-database.txt]
+
+\defineseparatedlist[CSV]
+ [separator=comma,
+ before=\bTABLE, after=\eTABLE,
+ first=\bTR, last=\eTR,
+ left=\bTD, right=\eTD]
+
+\startCSV
+a,b,c,č
+d,e,f,š
+\stopCSV
+
+\startseparatedlist[CSV]
+a,b,c,č
+d,e,f,š
+\stopseparatedlist
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/m-directives.tex b/Master/texmf-dist/tex/context/base/m-directives.mkiv
index c958f6cad51..8b551b27abd 100644
--- a/Master/texmf-dist/tex/context/base/m-directives.tex
+++ b/Master/texmf-dist/tex/context/base/m-directives.mkiv
@@ -1,5 +1,3 @@
-\doifnotmode{mkiv} {\endinput}
-
\starttext
\showdirectives
\stoptext
diff --git a/Master/texmf-dist/tex/context/base/m-dratex.tex b/Master/texmf-dist/tex/context/base/m-dratex.mkii
index 6c088daf98a..6c088daf98a 100644
--- a/Master/texmf-dist/tex/context/base/m-dratex.tex
+++ b/Master/texmf-dist/tex/context/base/m-dratex.mkii
diff --git a/Master/texmf-dist/tex/context/base/m-edtsnc.tex b/Master/texmf-dist/tex/context/base/m-edtsnc.mkii
index 0926f44886a..0926f44886a 100644
--- a/Master/texmf-dist/tex/context/base/m-edtsnc.tex
+++ b/Master/texmf-dist/tex/context/base/m-edtsnc.mkii
diff --git a/Master/texmf-dist/tex/context/base/m-fields.mkiv b/Master/texmf-dist/tex/context/base/m-fields.mkiv
new file mode 100644
index 00000000000..cd840f377d4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/m-fields.mkiv
@@ -0,0 +1,70 @@
+%D \module
+%D [ file=m-fields,
+%D version=2010.03.14,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Fields,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%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
+
+%D A rather old example of field usage is the following. It
+%D makes no sense to have this in the core.
+%D
+%D \starttyping
+%D before \fillinfield[oeps]{whatever} after
+%D \stoptyping
+
+\startJSpreamble{FillInField} used later
+ function CheckFillInField(right) {
+ if (event.value.toLowerCase() == right.toLowerCase()) {
+ event.target.hidden = true ;
+ }
+ event.value = ""
+ }
+\stopJSpreamble
+
+\newcount\noffillinfields
+
+\definefieldcategory
+ [fillinfield]
+ [\c!n=1024,
+ \c!height=\strutht,
+ \c!depth=\strutdp,
+ \c!align=\v!middle,
+ \c!color=red,
+ \c!fieldframecolor=blue,
+ \c!fieldbackgroundcolor=\s!white,
+ \c!validate=JS(CheckFillInField{\therightanswer})]
+
+\def\fillinfield
+ {\dosingleempty\dofillinfield}
+
+\def\dofillinfield[#1]#2%
+ {\dontleavehmode
+ \hbox
+ {\forgetall
+ \global\advance\noffillinfields\plusone
+ \edef\currentfillinfieldname{fillinfield:\number\noffillinfields}%
+ \useJSscripts[ans]%
+ \definefieldbody
+ [\currentfillinfieldname]
+ [\c!type=\v!line,
+ \c!category=fillinfield]%
+ \doifelsenothing{#1}
+ {\def\therightanswer{#2}}
+ {\def\therightanswer{#1}}%
+ \setbox0\hbox{\strut#2}%
+ \setbox2\hbox{\strut\therightanswer}%
+ \dimen0=\dimexpr\ifdim\wd0>\wd2 \wd0 \else \wd2 \fi + .2em\relax
+ \hbox to \wd0
+ {\wd0\zeropoint
+ \box0
+ \hss\fieldbody[\currentfillinfieldname][\c!width=\dimen0]\hss}}}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/m-graph.mkii b/Master/texmf-dist/tex/context/base/m-graph.mkii
index db7538e9807..69d1d3d57ef 100644
--- a/Master/texmf-dist/tex/context/base/m-graph.mkii
+++ b/Master/texmf-dist/tex/context/base/m-graph.mkii
@@ -69,4 +69,163 @@
enddef ;
\stopMPinclusions
-\endinput
+\doifnotmode {demo} {\endinput}
+
+%D You need to have the data files in your path,
+%D otherwise the run is aborted.
+
+\doiffileelse {agepop91.d} {} {\writestatus{graph}{no data files found}\wait\end}
+
+%D The test:
+
+\starttext
+
+\startMPpage
+draw begingraph(3in,2in);
+ gdraw "agepop91.d";
+ endgraph;
+\stopMPpage
+
+\startMPpage
+draw begingraph(3in,2in);
+ gdraw "agepop91.d" plot btex$\bullet$etex;
+ endgraph;
+\stopMPpage
+
+\startMPpage
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ glabel.bot(btex Age in years etex, OUT);
+ gdraw "agepopm.d";
+ endgraph;
+\stopMPpage
+
+\startMPpage
+draw begingraph(3in,2in);
+ glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+ glabel.bot(btex Age in years etex, OUT);
+ setrange(origin, whatever,whatever);
+ gdraw "agepopm.d";
+ endgraph;
+\stopMPpage
+
+\startMPpage
+draw begingraph(2.3in,2in);
+ setcoords(log,log);
+ glabel.lft(btex Seconds etex,OUT);
+ glabel.bot(btex Matrix size etex,
+ OUT);
+ gdraw "matmul.d" dashed evenly;
+ glabel.ulft(btex Standard etex,8);
+ gdraw "matmul.d";
+ glabel.lrt(btex Strassen etex,7);
+ endgraph;
+\stopMPpage
+
+\startMPpage
+draw begingraph(6.5cm,4.5cm);
+ setrange(80,0, 90,whatever);
+ glabel.bot(btex Year etex, OUT);
+ glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of}
+ \hbox{metric tons} \hbox{(heavy line)}}etex, OUT);
+ gdraw "lead.d" withpen pencircle scaled 1.5pt;
+ autogrid(,otick.lft);
+ setcoords(linear,linear);
+ setrange(80,0, 90,whatever);
+ glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic}
+ \hbox{meter of air} \hbox{(thin line)}}etex, OUT);
+ gdraw "lead.d";
+ autogrid(otick.bot,otick.rt);
+ endgraph;
+\stopMPpage
+
+\stoptext
+
+% No longer needed, since John will fix it.
+%
+% %D For the moment we need the following patch. Adam T. Lindsay
+% %D found out that the following code produced an error:
+% %D
+% %D \starttyping
+% %D \startMPcode
+% %D draw begingraph(130mm,35mm);
+% %D setrange(0,0,10,22000);
+% %D glabel.lft(btex {correct 0--22000} etex rotated 90, OUT);
+% %D autogrid(itick.bot,grid.lft) withcolor .75white ;
+% %D endgraph;
+% %D \stopMPcode
+% %D
+% %D \startMPcode
+% %D draw begingraph(130mm,35mm);
+% %D setrange(0,50,10,22000);
+% %D glabel.lft(btex {wrong 50--22000} etex rotated 90, OUT);
+% %D autogrid(itick.bot,grid.lft) withcolor .75white ;
+% %D endgraph;
+% %D \stopMPcode
+% %D
+% %D \startMPcode
+% %D draw begingraph(130mm,35mm);
+% %D setrange(0,110,10,30000);
+% %D glabel.lft(btex {failed 110--22000} etex rotated 90, OUT);
+% %D autogrid(itick.bot,grid.lft) withcolor .75white ;
+% %D endgraph;
+% %D \stopMPcode
+% %D \stoptyping
+% %D
+% %D The bug is a rather nasty one and needs some tweaking in
+% %D the low level graph code. John Hobby suggested for the
+% %D moment to initialize \type {setrange} as follows:
+% %D
+% %D \starttyping
+% %D setrange(0,0,"22000","22000")
+% %D \stoptyping
+% %D
+% %D Folowing this suggesion, I provide the following
+% %D extension:
+
+% def begingraph(expr w, h) =
+% begingroup
+% save X_, Y_, Gfin_, Gcur_, Gcbb_, Gneedgr_, Gneedfr_, Gdidsc_;
+% save Gdpic_, Gppic_, Ggl_, Garw_;
+% picture Gfin_, Gcur_, Gcbb_, Gdpic_, Gppic_, Ggl_[];
+% boolean Gneedgr_, Gneedfr_, Gdidsc_;
+% Gfin_ = nullpicture;
+% Gcur_ = nullpicture;
+% Gcbb_ = nullpicture;
+% X_.ctyp = Y_.ctyp = linear;
+% Z_.gdim = (w,h);
+% X_.sc = Y_.sc = 0;
+% Gneedgr_ = true;
+% Gneedfr_ = true;
+% Gdidsc_ = false;
+% Gdpic_ = nullpicture;
+% Garw_ = 0;
+% scantokens everybegingraph ;
+% enddef;
+%
+% boolean fixsetrange ; fixsetrange := true ;
+%
+% vardef dosetrange(text t) =
+% interim warningcheck:=0;
+% save r_; r_=0;
+% string r_[]s;
+% for x_=
+% for p_=t: if pair p_: xpart p_, ypart fi p_, endfor:
+% r_[incr r_] if string x_: s fi = x_;
+% if r_>2:
+% Gsetr_ if r_=3: X_(Gxcvlin_) else: Y_(Gycvlin_) fi(
+% r_[r_-2] if unknown r_[r_-2]: s fi, x_);
+% fi
+% exitif r_=4;
+% endfor
+% enddef;
+%
+% vardef setrange(text t) =
+% if fixsetrange : dosetrange(0,0,20000,20000) ; fi ;
+% dosetrange(t) ;
+% enddef ;
+%
+% if unknown everybegingraph :
+% string everybegingraph ;
+% % everybegingraph := "setrange(0,0,20000,20000)" ;
+% fi ;
diff --git a/Master/texmf-dist/tex/context/base/m-graph.mkiv b/Master/texmf-dist/tex/context/base/m-graph.mkiv
index c9223488480..e8aeb237519 100644
--- a/Master/texmf-dist/tex/context/base/m-graph.mkiv
+++ b/Master/texmf-dist/tex/context/base/m-graph.mkiv
@@ -37,8 +37,44 @@
\unexpanded\long\def\MPgraphformat#1#2{\ctxlua{metapost.format_n("#1","#2")}}
+% We could also delegate parsing using lower level plugins.
+
\startMPinclusions
+ % input string ;
+ % input marith ;
input graph.mp ;
+
+ vardef roundd(expr x, d) =
+ if abs d > 4 :
+ if d > 0 :
+ x
+ else :
+ 0
+ fi
+ elseif d > 0 :
+ save i ; i = floor x ;
+ i + round(Ten_to[d]*(x-i))/Ten_to[d]
+ else :
+ round(x/Ten_to[-d])*Ten_to[-d]
+ fi
+ enddef ;
+
+ Ten_to0 = 1 ;
+ Ten_to1 = 10 ;
+ Ten_to2 = 100 ;
+ Ten_to3 = 1000 ;
+ Ten_to4 = 10000 ;
+
+ def sFe_base =
+ enddef ;
+
+ picture Fe_plus ; Fe_plus := btex + etex ;
+
+ vardef format (expr f,x) = dofmt_.Feform_(f,x) enddef ;
+ vardef Mformat (expr f,x) = dofmt_.Meform (f,x) enddef ;
+ vardef formatstr (expr f,x) = dofmt_.Feform_(f,x) enddef ;
+ vardef Mformatstr(expr f,x) = dofmt_.Meform(f,x) enddef ;
+
vardef escaped_format(expr s) =
"" for n=1 upto length(s) : &
if ASCII substring (n,n+1) of s = 37 :
@@ -48,8 +84,9 @@
fi
endfor
enddef ;
+
vardef dofmt_@\#(expr f, x) =
- textext("\MPgraphformat{"&escaped_format(f)&"}{"&(if string x : x else: decimal x fi)&"}")
+ textext("\MPgraphformat{" & escaped_format(f) & "}{" & (if string x : x else: decimal x fi) & "}")
enddef ;
% vardef format(expr f, x) =
@@ -58,6 +95,74 @@
% vardef Mformat(expr f, x) =
% format(f,x)
% enddef;
+
\stopMPinclusions
-\endinput
+\doifnotmode {demo} {\endinput}
+
+\doiffileelse {agepop91.d} {} {\writestatus{graph}{no data files found}\wait\end}
+
+%D The test:
+
+\starttext
+
+% \startMPpage
+% draw begingraph(3in,2in);
+% gdraw "t:/metapost/grphdata/agepop91.d";
+% endgraph;
+% \stopMPpage
+
+% \startMPpage
+% draw begingraph(3in,2in);
+% gdraw "agepop91.d" plot btex $\bullet$ etex;
+% endgraph;
+% \stopMPpage
+
+% \startMPpage
+% draw begingraph(3in,2in);
+% glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+% glabel.bot(btex Age in years etex, OUT);
+% gdraw "agepopm.d";
+% endgraph;
+% \stopMPpage
+
+% \startMPpage
+% draw begingraph(3in,2in);
+% glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
+% glabel.bot(btex Age in years etex, OUT);
+% setrange(origin, whatever,whatever);
+% gdraw "agepopm.d";
+% endgraph;
+% \stopMPpage
+
+% \startMPpage
+% draw begingraph(2.3in,2in);
+% setcoords(log,log);
+% glabel.lft(btex Seconds etex,OUT);
+% glabel.bot(btex Matrix size etex,
+% OUT);
+% gdraw "matmul.d" dashed evenly;
+% glabel.ulft(btex Standard etex,8);
+% gdraw "matmul.d";
+% glabel.lrt(btex Strassen etex,7);
+% endgraph;
+% \stopMPpage
+
+% \startMPpage
+% draw begingraph(6.5cm,4.5cm);
+% setrange(80,0, 90,whatever);
+% glabel.bot(btex Year etex, OUT);
+% glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of}
+% \hbox{metric tons} \hbox{(heavy line)}}etex, OUT);
+% gdraw "lead.d" withpen pencircle scaled 1.5pt;
+% autogrid(,otick.lft);
+% setcoords(linear,linear);
+% setrange(80,0, 90,whatever);
+% glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic}
+% \hbox{meter of air} \hbox{(thin line)}}etex, OUT);
+% gdraw "lead.d";
+% autogrid(otick.bot,otick.rt);
+% endgraph;
+% \stopMPpage
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/m-graph.tex b/Master/texmf-dist/tex/context/base/m-graph.tex
deleted file mode 100644
index 6f71cca3c57..00000000000
--- a/Master/texmf-dist/tex/context/base/m-graph.tex
+++ /dev/null
@@ -1,175 +0,0 @@
-%D \module
-%D [ file=m-graph,
-%D version=2000.08.06,
-%D title=\CONTEXT\ Extra Modules,
-%D subtitle=\METAPOST\ graph module support,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\loadmarkfile{m-graph}
-
-\doifnotmode {demo} {\endinput}
-
-%D You need to have the data files in your path,
-%D otherwise the run is aborted.
-
-\doiffileelse {agepop91.d} {} {\writestatus{graph}{no data files found}\wait\end}
-
-%D The test:
-
-\starttext
-
-\startMPpage
-draw begingraph(3in,2in);
- gdraw "agepop91.d";
- endgraph;
-\stopMPpage
-
-\startMPpage
-draw begingraph(3in,2in);
- gdraw "agepop91.d" plot btex$\bullet$etex;
- endgraph;
-\stopMPpage
-
-\startMPpage
-draw begingraph(3in,2in);
- glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
- glabel.bot(btex Age in years etex, OUT);
- gdraw "agepopm.d";
- endgraph;
-\stopMPpage
-
-\startMPpage
-draw begingraph(3in,2in);
- glabel.lft(btex \vbox{\hbox{Population} \hbox{in millions}} etex, OUT);
- glabel.bot(btex Age in years etex, OUT);
- setrange(origin, whatever,whatever);
- gdraw "agepopm.d";
- endgraph;
-\stopMPpage
-
-\startMPpage
-draw begingraph(2.3in,2in);
- setcoords(log,log);
- glabel.lft(btex Seconds etex,OUT);
- glabel.bot(btex Matrix size etex,
- OUT);
- gdraw "matmul.d" dashed evenly;
- glabel.ulft(btex Standard etex,8);
- gdraw "matmul.d";
- glabel.lrt(btex Strassen etex,7);
- endgraph;
-\stopMPpage
-
-\startMPpage
-draw begingraph(6.5cm,4.5cm);
- setrange(80,0, 90,whatever);
- glabel.bot(btex Year etex, OUT);
- glabel.lft(btex \vbox{\hbox{Emissions in} \hbox{thousands of}
- \hbox{metric tons} \hbox{(heavy line)}}etex, OUT);
- gdraw "lead.d" withpen pencircle scaled 1.5pt;
- autogrid(,otick.lft);
- setcoords(linear,linear);
- setrange(80,0, 90,whatever);
- glabel.rt(btex \vbox{\hbox{Micrograms} \hbox{per cubic}
- \hbox{meter of air} \hbox{(thin line)}}etex, OUT);
- gdraw "lead.d";
- autogrid(otick.bot,otick.rt);
- endgraph;
-\stopMPpage
-
-\stoptext
-
-% No longer needed, since John will fix it.
-%
-% %D For the moment we need the following patch. Adam T. Lindsay
-% %D found out that the following code produced an error:
-% %D
-% %D \starttyping
-% %D \startMPcode
-% %D draw begingraph(130mm,35mm);
-% %D setrange(0,0,10,22000);
-% %D glabel.lft(btex {correct 0--22000} etex rotated 90, OUT);
-% %D autogrid(itick.bot,grid.lft) withcolor .75white ;
-% %D endgraph;
-% %D \stopMPcode
-% %D
-% %D \startMPcode
-% %D draw begingraph(130mm,35mm);
-% %D setrange(0,50,10,22000);
-% %D glabel.lft(btex {wrong 50--22000} etex rotated 90, OUT);
-% %D autogrid(itick.bot,grid.lft) withcolor .75white ;
-% %D endgraph;
-% %D \stopMPcode
-% %D
-% %D \startMPcode
-% %D draw begingraph(130mm,35mm);
-% %D setrange(0,110,10,30000);
-% %D glabel.lft(btex {failed 110--22000} etex rotated 90, OUT);
-% %D autogrid(itick.bot,grid.lft) withcolor .75white ;
-% %D endgraph;
-% %D \stopMPcode
-% %D \stoptyping
-% %D
-% %D The bug is a rather nasty one and needs some tweaking in
-% %D the low level graph code. John Hobby suggested for the
-% %D moment to initialize \type {setrange} as follows:
-% %D
-% %D \starttyping
-% %D setrange(0,0,"22000","22000")
-% %D \stoptyping
-% %D
-% %D Folowing this suggesion, I provide the following
-% %D extension:
-
-% def begingraph(expr w, h) =
-% begingroup
-% save X_, Y_, Gfin_, Gcur_, Gcbb_, Gneedgr_, Gneedfr_, Gdidsc_;
-% save Gdpic_, Gppic_, Ggl_, Garw_;
-% picture Gfin_, Gcur_, Gcbb_, Gdpic_, Gppic_, Ggl_[];
-% boolean Gneedgr_, Gneedfr_, Gdidsc_;
-% Gfin_ = nullpicture;
-% Gcur_ = nullpicture;
-% Gcbb_ = nullpicture;
-% X_.ctyp = Y_.ctyp = linear;
-% Z_.gdim = (w,h);
-% X_.sc = Y_.sc = 0;
-% Gneedgr_ = true;
-% Gneedfr_ = true;
-% Gdidsc_ = false;
-% Gdpic_ = nullpicture;
-% Garw_ = 0;
-% scantokens everybegingraph ;
-% enddef;
-%
-% boolean fixsetrange ; fixsetrange := true ;
-%
-% vardef dosetrange(text t) =
-% interim warningcheck:=0;
-% save r_; r_=0;
-% string r_[]s;
-% for x_=
-% for p_=t: if pair p_: xpart p_, ypart fi p_, endfor:
-% r_[incr r_] if string x_: s fi = x_;
-% if r_>2:
-% Gsetr_ if r_=3: X_(Gxcvlin_) else: Y_(Gycvlin_) fi(
-% r_[r_-2] if unknown r_[r_-2]: s fi, x_);
-% fi
-% exitif r_=4;
-% endfor
-% enddef;
-%
-% vardef setrange(text t) =
-% if fixsetrange : dosetrange(0,0,20000,20000) ; fi ;
-% dosetrange(t) ;
-% enddef ;
-%
-% if unknown everybegingraph :
-% string everybegingraph ;
-% % everybegingraph := "setrange(0,0,20000,20000)" ;
-% fi ;
diff --git a/Master/texmf-dist/tex/context/base/m-level.tex b/Master/texmf-dist/tex/context/base/m-level.mkii
index 67d5987332d..67d5987332d 100644
--- a/Master/texmf-dist/tex/context/base/m-level.tex
+++ b/Master/texmf-dist/tex/context/base/m-level.mkii
diff --git a/Master/texmf-dist/tex/context/base/m-logcategories.mkiv b/Master/texmf-dist/tex/context/base/m-logcategories.mkiv
new file mode 100644
index 00000000000..954cd58c483
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/m-logcategories.mkiv
@@ -0,0 +1,3 @@
+\starttext
+ \showlogcategories
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/m-mathcrap.mkiv b/Master/texmf-dist/tex/context/base/m-mathcrap.mkiv
new file mode 100644
index 00000000000..0c187155b79
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/m-mathcrap.mkiv
@@ -0,0 +1,76 @@
+%D \module
+%D [ file=m-mathcrap,
+%D version=2010.05.30,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Math Crap,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA ADE]
+%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 meant for those who want to use the (incomplete and sort of useless)
+%D unicode superscripts and subscripts. We should look ahead and collapse them
+%D but I will only implement that in calcmath when the need is there. Now the
+%D spacing can be somewhat non optimal but probably that does not matter here.
+%D
+%D \startbuffer
+%D $a₀₁₂₃₄₅₆₇₈₉₋₌₊$
+%D \stopbuffer
+%D
+%D \typebuffer \blank \getbuffer \blank
+
+\unprotect
+
+\unexpanded\def\mathunicodesupercrap#1{\mathortext{{\normalsuperscript{#1}}}{\high{#1}}}
+\unexpanded\def\mathunicodesubcrap #1{\mathortext{{\normalsubscript {#1}}}{\low {#1}}}
+
+\ifdefined\installanddefineactivecharacter\else
+
+ \def\installanddefineactivecharacter #1 #2% we need this as command
+ {\normalexpanded{\noexpand\installactivecharacter \utfchar{#1} }%
+ \defineactivecharacter #1 {#2}}
+
+\fi
+
+\installanddefineactivecharacter "2070 {\mathunicodesupercrap 0}
+\installanddefineactivecharacter "00B9 {\mathunicodesupercrap 1}₀
+\installanddefineactivecharacter "00B2 {\mathunicodesupercrap 2}₀
+\installanddefineactivecharacter "00B3 {\mathunicodesupercrap 3}₀
+\installanddefineactivecharacter "2074 {\mathunicodesupercrap 4}
+\installanddefineactivecharacter "2075 {\mathunicodesupercrap 5}
+\installanddefineactivecharacter "2076 {\mathunicodesupercrap 6}
+\installanddefineactivecharacter "2077 {\mathunicodesupercrap 7}
+\installanddefineactivecharacter "2078 {\mathunicodesupercrap 8}
+\installanddefineactivecharacter "2079 {\mathunicodesupercrap 9}
+\installanddefineactivecharacter "207A {\mathunicodesupercrap +}
+\installanddefineactivecharacter "207B {\mathunicodesupercrap -}
+\installanddefineactivecharacter "207C {\mathunicodesupercrap =}
+\installanddefineactivecharacter "207D {\mathunicodesupercrap (}
+\installanddefineactivecharacter "207E {\mathunicodesupercrap )}
+\installanddefineactivecharacter "207F {\mathunicodesupercrap n}
+
+\installanddefineactivecharacter "2080 {\mathunicodesubcrap 0}
+\installanddefineactivecharacter "2081 {\mathunicodesubcrap 1}
+\installanddefineactivecharacter "2082 {\mathunicodesubcrap 2}
+\installanddefineactivecharacter "2083 {\mathunicodesubcrap 3}
+\installanddefineactivecharacter "2084 {\mathunicodesubcrap 4}
+\installanddefineactivecharacter "2085 {\mathunicodesubcrap 5}
+\installanddefineactivecharacter "2086 {\mathunicodesubcrap 6}
+\installanddefineactivecharacter "2087 {\mathunicodesubcrap 7}
+\installanddefineactivecharacter "2088 {\mathunicodesubcrap 8}
+\installanddefineactivecharacter "2089 {\mathunicodesubcrap 9}
+\installanddefineactivecharacter "208A {\mathunicodesubcrap +}
+\installanddefineactivecharacter "208B {\mathunicodesubcrap -}
+\installanddefineactivecharacter "208C {\mathunicodesubcrap =}
+\installanddefineactivecharacter "208D {\mathunicodesubcrap (}
+\installanddefineactivecharacter "208E {\mathunicodesubcrap )}
+\installanddefineactivecharacter "2090 {\mathunicodesubcrap A}
+\installanddefineactivecharacter "2091 {\mathunicodesubcrap E}
+\installanddefineactivecharacter "2092 {\mathunicodesubcrap O}
+\installanddefineactivecharacter "2093 {\mathunicodesubcrap X}
+%installanddefineactivecharacter "2094 {\mathunicodesubcrap ?} % SCHWAA
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/m-mkii.mkiv b/Master/texmf-dist/tex/context/base/m-mkii.mkiv
index cb0da6fcb9e..dcfd29d2092 100644
--- a/Master/texmf-dist/tex/context/base/m-mkii.mkiv
+++ b/Master/texmf-dist/tex/context/base/m-mkii.mkiv
@@ -2,7 +2,7 @@
\unprotect
-\writestatus\m!systems{loading some mkii compatibility hacks}
+\writestatus\m!system{loading some mkii compatibility hacks}
% Compatibility for font-ini
diff --git a/Master/texmf-dist/tex/context/base/m-mkivhacks.tex b/Master/texmf-dist/tex/context/base/m-mkivhacks.mkiv
index f4765873947..0e959110e0d 100644
--- a/Master/texmf-dist/tex/context/base/m-mkivhacks.tex
+++ b/Master/texmf-dist/tex/context/base/m-mkivhacks.mkiv
@@ -11,8 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\doifnotmode{mkiv}{\endinput}
-
%D For Aditya, who needed it for his thesis.
\startluacode
diff --git a/Master/texmf-dist/tex/context/base/m-morse.mkvi b/Master/texmf-dist/tex/context/base/m-morse.mkvi
new file mode 100644
index 00000000000..d106acfdefb
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/m-morse.mkvi
@@ -0,0 +1,264 @@
+%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]
+%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
+
+setmetatable(codes, { __index = function(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
+ else
+ return false
+ end
+end })
+
+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}]}
+
+\def\MorseCode #text{\ctxlua{moduledata.morse.tomorse(\!!bs#text\!!es,true)}}
+\def\MorseString #text{\ctxlua{moduledata.morse.tomorse(\!!bs#text\!!es)}}
+\def\MorseFile #text{\ctxlua{moduledata.morse.filetomorse("#text")}}
+\def\MorseTable {\ctxlua{moduledata.morse.showtable()}}
+
+\let\Morse \MorseString
+
+\protect
+
+\doifnotmode{demo}{\endinput}
+
+\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-newmat.tex b/Master/texmf-dist/tex/context/base/m-newmat.tex
index 08ce33b4ce5..3fb75df5d3e 100644
--- a/Master/texmf-dist/tex/context/base/m-newmat.tex
+++ b/Master/texmf-dist/tex/context/base/m-newmat.tex
@@ -11,6 +11,12 @@
%C therefore copyrighted by \PRAGMA. See licen-en.pdf for
%C details.
+\unprotect
+
+%D Code has been integrated.
+
+\protect \endinput
+
%D This module collects macros that \TEX\ users kind of expect
%D to be available when typesetting math. Most of them
%D originate in the \AMS\ macro packages. We have taken the
@@ -19,269 +25,6 @@
%D derived from AMS math modules) and adapted|/|extended by
%D Hans Hagen.
-%D Here we will add code on demand. So, just let us know what
-%D should go in here.
-
-%M \usemodule[newmat]
-
-\unprotect
-
-%D \macros
-%D {qedsymbol}
-%D
-%D [HH] The general Quod Erat Domonstrandum symbol is defined
-%D in such a way that we can configure it. Because this symbol
-%D is also used in text mode, we make it a normal text symbol
-%D with special behavior.
-
-\def\qedsymbol#1%
- {\ifhmode
- \unskip~\hfill#1\par
- \else\ifmmode
- \eqno#1\relax % Do we really need the \eqno here?
- \else
- \leavevmode\hbox{}\hfill#1\par
- \fi\fi}
-
-\definesymbol [qed] [\qedsymbol{\mathematics{\square}}]
-
-%D \macros
-%D {QED}
-%D
-%D [HH] For compatbility reasons we also provide the \type
-%D {\QED} command. In case this command is overloaded, we still
-%D have the symbol available. \symbol[qed]
-
-\def\QED{\symbol[qed]}
-
-%D \macros
-%D {genfrac}
-%D
-%D [TH] The definition of \type {\genfrac} \& co. is not
-%D trivial, because it allows some flexibility. This is
-%D supposed to be a user||level command, but will fail quite
-%D desparately if called outside math mode (\CONTEXT\ redefines
-%D \type {\over})
-%D
-%D [HH] We clean up this macro a bit and (try) to make it
-%D understandable. The expansion is needed for generating
-%D the second argument to \type {\dogenfrac}, which is to
-%D be a control sequence like \type {\over}.
-
-\unexpanded\def\genfrac#1#2#3#4%
- {\edef\!!stringa
- {#1#2}%
- \expanded
- {\dogenfrac{#4}%
- \csname
- \ifx @#3@%
- \ifx\!!stringa\empty
- \strippedcsname\normalover
- \else
- \strippedcsname\normaloverwithdelims
- \fi
- \else
- \ifx\!!stringa\empty
- \strippedcsname\normalabove
- \else
- \strippedcsname\normalabovewithdelims
- \fi
- \fi
- \endcsname}%
- {#1#2#3}}
-
-\def\dogenfrac#1#2#3#4#5%
- {{#1{\begingroup#4\endgroup#2#3\relax#5}}}
-
-%D \macros
-%D {dfrac, tfrac, frac, dbinom, tbinom, binom}
-%D
-%D [TH] No need to make these \type {\unexpanded} as well.
-
-%\def\dfrac {\genfrac\empty\empty\empty\displaystyle}
-%\def\tfrac {\genfrac\empty\empty\empty\textstyle}
-%\def\frac {\genfrac\empty\empty\empty\donothing}
-
-\def\dfrac {\genfrac\empty\empty{}\displaystyle}
-\def\tfrac {\genfrac\empty\empty{}\textstyle}
-\def\frac {\genfrac\empty\empty{}\donothing}
-
-\def\dbinom{\genfrac()\zeropoint\displaystyle}
-\def\tbinom{\genfrac()\zeropoint\textstyle}
-\def\binom {\genfrac()\zeropoint\donothing}
-
-\def\xfrac {\genfrac\empty\empty{}\scriptstyle}
-\def\xxfrac{\genfrac\empty\empty{}\scriptscriptstyle}
-
-%D Better:
-
-\unexpanded\def\frac#1#2{\mathematics{\genfrac\empty\empty{}\donothing{#1}{#2}}}
-
-%D [HH] This shows up as:
-%D
-%D \startbuffer
-%D $\dfrac {1}{2} \tfrac {1}{2} \frac {1}{2}$
-%D $\dbinom{1}{2} \tbinom{1}{2} \binom{1}{2}$
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D \getbuffer
-
-%D \macros
-%D {text}
-%D
-%D [TH] \type {\text} is a command to typeset more or less
-%D ordinary text inside of super- and sub|-|scripts. It has to
-%D do a full font switch to get the sides right, so it will be
-%D quite slow. \type {\text} kind of replaces \CONTEXT's \type
-%D {\mathstyle} command.
-
-%D [HH] This macro is now also moved to the core, but we
-%D keep it here as well for completeness.
-%D
-%D \starttyping
-%D \unexpanded\def\mathtext
-%D {\mathortext\domathtext\hbox} % {\ifmmode\@EA\dotext\else\@EA\hbox\fi}
-%D
-%D \def\domathtext#1%
-%D {\mathchoice
-%D {\dodomathtext\displaystyle\textface {#1}}%
-%D {\dodomathtext\textstyle \textface {#1}}%
-%D {\dodomathtext\textstyle \scriptface {#1}}%
-%D {\dodomathtext\textstyle \scriptscriptface{#1}}}
-%D
-%D \def\dodomathtext#1#2#3% no \everymath !
-%D %{\hbox{\everymath{#1}\switchtobodyfont [#2]#3}} % 15 sec
-%D {\hbox{\everymath{#1}\setcurrentfontbody{#2}#3}} % 3 sec (no math)
-%D \stoptyping
-
-%D [HH] We use the following indirectness because \type {\text}
-%D is a natural candidate for user macros (actually, it is
-%D used in some modules).
-%D
-%D \starttyping
-%D \let\text\mathtext
-%D \stoptyping
-
-%D [HH] Actually, the font switch is not that slow when
-%D typefaces are used. If needed this macro can be sped up.
-%D
-%D \startbuffer
-%D ordinary text $x^{\text{extra ordinary text}}$
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D \getbuffer
-
-%D \macros
-%D {mathhexbox}
-%D
-%D [TH] \type {\mathhexbox} is also user||level (already
-%D defined in Plain \TEX). It allows to get a math character
-%D inserted as if it was a text character.
-
-\gdef\mathhexbox#1#2#3{\mathtext{$\mathsurround\zeropoint\mathchar"#1#2#3$}}
-
-%D \macros
-%D {boxed}
-%D
-%D [HH] Another macro that users expect (slightly adapted):
-
-\def\boxed
- {\ifmmode\expandafter\mframed\else\expandafter\framed\fi}
-
-%D \macros
-%D {cfrac}
-%D
-%D [HH] Now let us see what this one does:
-%D
-%D \startbuffer
-%D $\cfrac{12}{3} \cfrac[l]{12}{3} \cfrac[c]{12}{3} \cfrac[r]{12}{3}$
-%D $\cfrac{1}{23} \cfrac[l]{1}{23} \cfrac[c]{1}{23} \cfrac[r]{1}{23}$
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D \getbuffer
-
-\definecomplexorsimple\cfrac
-
-\def\simplecfrac
- {\complexcfrac[c]}
-
-\def\complexcfrac[#1]#2#3%
- {{\displaystyle
- \frac
- {\strut\ifx r#1\hfill\fi#2\ifx l#1\hfill\fi}%
- {#3}}%
- \kern-\nulldelimiterspace}
-
-%D [HH] The next alternative is nicer:
-
-\def\simplecfrac {\docfrac[cc]}
-\def\complexcfrac[#1]{\docfrac[#1cc]}
-
-\def\docfrac[#1#2#3]#4#5%
- {{\displaystyle
- \frac
- {\strut
- \ifx r#1\hfill\fi#4\ifx l#1\hfill\fi}%
- {\ifx r#2\hfill\fi#5\ifx l#2\hfill\fi}%
- \kern-\nulldelimiterspace}}
-
-%D [HH] Now we can align every combination we want:
-%D
-%D \startbuffer
-%D $\cfrac{12}{3} \cfrac[l]{12}{3} \cfrac[c]{12}{3} \cfrac[r]{12}{3}$
-%D $\cfrac{1}{23} \cfrac[l]{1}{23} \cfrac[c]{1}{23} \cfrac[r]{1}{23}$
-%D $\cfrac[cl]{12}{3} \cfrac[cc]{12}{3} \cfrac[cr]{12}{3}$
-%D $\cfrac[lc]{1}{23} \cfrac[cc]{1}{23} \cfrac[rc]{1}{23}$
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D \getbuffer
-
-%D \macros
-%D {splitfrac, splitdfrac}
-%D
-%D Occasionally one needs to typeset multi||line fractions.
-%D These commands use \tex{genfrac} to create such fractions.
-%D
-%D \startbuffer
-%D \startformula
-%D a=\frac{
-%D \splitfrac{xy + xy + xy + xy + xy}
-%D {+ xy + xy + xy + xy}
-%D }
-%D {z}
-%D =\frac{
-%D \splitdfrac{xy + xy + xy + xy + xy}
-%D {+ xy + xy + xy + xy}
-%D }
-%D {z}
-%D \stopformula
-%D \stopbuffer
-%D
-%D \typebuffer \getbuffer
-%D
-%D These macros are based on Michael J.~Downes posting on
-%D comp.text.tex on 2001/12/06
-
-\def\splitfrac#1#2%
- {\genfrac\empty\empty\zeropoint\textstyle%
- {\textstyle#1\quad\hfill}%
- {\textstyle\hfill\quad\mathstrut#2}}
-
-\def\splitdfrac#1#2%
- {\genfrac\empty\empty\zeropoint\displaystyle%
- {#1\quad\hfill}
- {\hfill\quad\mathstrut #2}}
-
-\protect \endinput
-
%D \macros
%D {startsubarray,substack,startsmallmatrix}
%D
diff --git a/Master/texmf-dist/tex/context/base/m-obsolete.tex b/Master/texmf-dist/tex/context/base/m-obsolete.mkii
index a97002cf64c..a97002cf64c 100644
--- a/Master/texmf-dist/tex/context/base/m-obsolete.tex
+++ b/Master/texmf-dist/tex/context/base/m-obsolete.mkii
diff --git a/Master/texmf-dist/tex/context/base/m-obsolete.mkiv b/Master/texmf-dist/tex/context/base/m-obsolete.mkiv
new file mode 100644
index 00000000000..2d4518181e6
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/m-obsolete.mkiv
@@ -0,0 +1,5 @@
+\unprotect
+
+\writestatus\m!system{skipping obsolete module}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/m-pdfsnc.tex b/Master/texmf-dist/tex/context/base/m-pdfsnc.mkii
index da59ab5d800..da59ab5d800 100644
--- a/Master/texmf-dist/tex/context/base/m-pdfsnc.tex
+++ b/Master/texmf-dist/tex/context/base/m-pdfsnc.mkii
diff --git a/Master/texmf-dist/tex/context/base/m-pictex.tex b/Master/texmf-dist/tex/context/base/m-pictex.tex
index abb81b76ef9..71b0a78fe72 100644
--- a/Master/texmf-dist/tex/context/base/m-pictex.tex
+++ b/Master/texmf-dist/tex/context/base/m-pictex.tex
@@ -27,7 +27,7 @@
\fi
\ifx\beginpicture\undefined
\ifx\newenvironment\undefined
- \readfile{thrd-pic.tex}{}{}
+ \loadmarkfile{thrd-pic}%
\else
\input prepictex.tex \relax
\input pictex.tex \relax
diff --git a/Master/texmf-dist/tex/context/base/m-plus.tex b/Master/texmf-dist/tex/context/base/m-plus.tex
deleted file mode 100644
index 312d9f93105..00000000000
--- a/Master/texmf-dist/tex/context/base/m-plus.tex
+++ /dev/null
@@ -1,30 +0,0 @@
-%D \module
-%D [ file=m-plus,
-%D version=2003.03.16,
-%D title=\CONTEXT\ Extra Modules,
-%D subtitle=Loading extra features,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright=PRAGMA-ADE]
-%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 Somewhere in 2001 I started collecting new functionality
-%D in a module \type {m-yesno}. As the name suggests, I was
-%D not entirely sure if this functionality belonged in the
-%D kernel. When (again) on the \CONTEXT\ list a request for
-%D side bars was posted, I decided to move such code to plus
-%D modules. Users who want this additional functionality can
-%D put the following call in their \type {cont-sys.tex} file:
-%D
-%D \starttyping
-%D \usemodule[plus]
-%D \stoptyping
-
-% \readfile {plus-rul} \donothing \donothing
-% \readfile {page-str} \donothing \donothing
-% \readfile {page-plg} \donothing \donothing
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/m-pstricks.lua b/Master/texmf-dist/tex/context/base/m-pstricks.lua
index 35cae93f65f..ab271908496 100644
--- a/Master/texmf-dist/tex/context/base/m-pstricks.lua
+++ b/Master/texmf-dist/tex/context/base/m-pstricks.lua
@@ -17,8 +17,9 @@ if not modules then modules = { } end modules ['m-pstricks'] = {
local format, lower, concat, gmatch = string.format, string.lower, table.concat, string.gmatch
local variables = interfaces.variables
-plugins = plugins or { }
-plugins.pstricks = plugins.pstricks or { }
+moduledata.pstricks = moduledata.pstricks or { }
+
+local report_pstricks = logs.reporter("pstricks")
local template = [[
\starttext
@@ -41,16 +42,16 @@ local template = [[
local modules = { }
local graphics = 0
-function plugins.pstricks.usemodule(names)
+function moduledata.pstricks.usemodule(names)
for name in gmatch(names,"([^%s,]+)") do
modules[#modules+1] = format([[\readfile{%s}{}{}]],name)
end
end
-function plugins.pstricks.process(n)
+function moduledata.pstricks.process(n)
graphics = graphics + 1
local name = string.format("%s-pstricks-%04i",tex.jobname,graphics)
- local data = buffers.collect("def-"..n)
+ local data = buffers.collectcontent("def-"..n)
local tmpfile = name .. ".tmp"
local epsfile = name .. ".ps"
local pdffile = name .. ".pdf"
@@ -65,9 +66,9 @@ function plugins.pstricks.process(n)
if lfs.isfile(pdffile) then
context.externalfigure( { pdffile }, { object = variables.no } )
else
- logs.report("plugins","pstricks run failed, no pdf file")
+ report_pstricks("run failed, no pdf file")
end
else
- logs.report("plugins","pstricks run failed, no ps file")
+ report_pstricks("run failed, no ps file")
end
end
diff --git a/Master/texmf-dist/tex/context/base/m-pstricks.mkiv b/Master/texmf-dist/tex/context/base/m-pstricks.mkiv
index c800ec19935..c976982a6a0 100644
--- a/Master/texmf-dist/tex/context/base/m-pstricks.mkiv
+++ b/Master/texmf-dist/tex/context/base/m-pstricks.mkiv
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\ctxloadluafile{m-pstricks}{}
+\registerctxluafile{m-pstricks}{}
%D \startbuffer
%D \usePSTRICKSmodule[pst-barcode]
@@ -57,8 +57,8 @@
\definebuffer[PSTRICKS]
-\unexpanded\def\processPSTRICKS {\ctxlua{plugins.pstricks.process(\thebuffernumber{PSTRICKS})}}
-\unexpanded\def\usePSTRICKSmodule[#1]{\ctxlua{plugins.pstricks.usemodule("#1")}}
+\unexpanded\def\processPSTRICKS {\ctxlua{moduledata.pstricks.process(\thebuffernumber{PSTRICKS})}}
+\unexpanded\def\usePSTRICKSmodule[#1]{\ctxlua{moduledata.pstricks.usemodule("#1")}}
\unexpanded\def\setPSTRICKS #1{\setbuffer[def-\thebuffernumber{PSTRICKS}]#1\endbuffer}
\let\stopPSTRICKS\processPSTRICKS
diff --git a/Master/texmf-dist/tex/context/base/m-punk.mkiv b/Master/texmf-dist/tex/context/base/m-punk.mkiv
index 65bf0397419..71158d2a638 100644
--- a/Master/texmf-dist/tex/context/base/m-punk.mkiv
+++ b/Master/texmf-dist/tex/context/base/m-punk.mkiv
@@ -17,190 +17,193 @@
% ConTeXt MkIV kernel.
\startluacode
-do
- local concat = table.concat
- local chardata = characters.data
- local fontdata = fonts.ids
+local concat = table.concat
+local chardata = characters.data
+local fontdata = fonts.hashes.identifiers
- fonts.mp = fonts.mp or { }
+fonts.mp = fonts.mp or { }
- fonts.mp.version = fonts.mp.version or 1.11
- fonts.mp.inline = true
- fonts.mp.cache = containers.define("fonts", "mp", fonts.mp.version, true)
+fonts.mp.version = fonts.mp.version or 1.15
+fonts.mp.inline = true
+fonts.mp.cache = containers.define("fonts", "mp", fonts.mp.version, true)
- metapost.characters = metapost.characters or { }
+metapost.characters = metapost.characters or { }
-- todo: use table share as in otf
- local characters, descriptions = { }, { }
- local factor, l, n, w, h, d, total, variants = 100, { }, 0, 0, 0, 0, 0, 0, true
-
- -- A next version of mplib will provide the tfm font information which
- -- gives better glyph dimensions, plus additional kerning information.
-
- local flusher = {
- startfigure = function(chrnum,llx,lly,urx,ury)
- l, n = { }, chrnum
- w, h, d = urx - llx, ury, -lly
- total = total + 1
- inline = fonts.mp.inline
- end,
- flushfigure = function(t)
- for i=1, #t do
- l[#l+1] = t[i]
- end
- end,
- stopfigure = function()
- local cd = chardata[n]
- if inline then
- descriptions[n] = {
- -- unicode = n,
- name = cd and cd.adobename,
- width = w*100,
- height = h*100,
- depth = d*100,
- boundingbox = { 0, -d, w, h },
- }
- characters[n] = {
- commands = { -- todo: xforms, should happen in backend
- { "special", "pdf: " .. concat(l," ") },
- }
- }
- else
- descriptions[n] = {
- -- unicode = n,
- name = cd and cd.adobename,
- width = w*100,
- height = h*100,
- depth = d*100,
- boundingbox = { 0, -d, w, h },
+local characters, descriptions = { }, { }
+local factor, l, n, w, h, d, total, variants = 100, { }, 0, 0, 0, 0, 0, 0, true
+
+-- A next version of mplib will provide the tfm font information which
+-- gives better glyph dimensions, plus additional kerning information.
+
+local flusher = {
+ startfigure = function(chrnum,llx,lly,urx,ury)
+ l, n = { }, chrnum
+ w, h, d = urx - llx, ury, -lly
+ total = total + 1
+ inline = fonts.mp.inline
+ end,
+ flushfigure = function(t)
+ for i=1, #t do
+ l[#l+1] = t[i]
+ end
+ end,
+ stopfigure = function()
+ local cd = chardata[n]
+ if inline then
+ descriptions[n] = {
+ -- unicode = n,
+ name = cd and cd.adobename,
+ width = w*100,
+ height = h*100,
+ depth = d*100,
+ boundingbox = { 0, -d, w, h },
+ }
+ characters[n] = {
+ commands = { -- todo: xforms, should happen in backend
+ { "special", "pdf: " .. concat(l," ") },
}
- characters[n] = {
- commands = {
- { "image", { stream = concat(l," "), bbox = { 0, -d*65536, w*65536, h*65536 } } },
- }
+ }
+ else
+ descriptions[n] = {
+ -- unicode = n,
+ name = cd and cd.adobename,
+ width = w*100,
+ height = h*100,
+ depth = d*100,
+ boundingbox = { 0, -d, w, h },
+ }
+ characters[n] = {
+ commands = {
+ { "image", { stream = concat(l," "), bbox = { 0, -d*65536, w*65536, h*65536 } } },
}
- end
+ }
end
- }
-
- metapost.characters.instances = metapost.characters.instances or 10
-
- function metapost.characters.process(mpxformat, name, instances, scalefactor)
- statistics.starttiming(metapost.characters)
- scalefactor = scalefactor or 1
- instances = instances or metapost.characters.instances or 10
- local fontname = file.removesuffix(file.basename(name))
- local hash = file.robustname(string.format("%s %05i %03i", fontname, scalefactor*1000, instances))
- local lists = containers.read(fonts.mp.cache(), hash)
- if not lists then
- statistics.starttiming(flusher)
- -- we can use a format per font
- local data = io.loaddata(resolvers.find_file(name))
- metapost.reset(mpxformat)
- metapost.set_outer_color(2) -- no outer color and no reset either
- lists = { }
- for i=1,instances do
- list = { }
- characters, descriptions = { }, { }
- metapost.process(
- mpxformat,
- {
- "randomseed := " .. i*10 .. ";",
- "scale_factor := " .. scalefactor .. " ;",
- data
- },
- false,
- flusher
- )
- lists[i] = {
- designsize = 655360,
- name = string.format("%s-%03i",hash,i),
- parameters = {
- slant = 0,
- space = 333 * scalefactor,
- space_stretch = 166.5 * scalefactor,
- space_shrink = 111 * scalefactor,
- x_height = 431 * scalefactor,
- quad =1000 * scalefactor,
- extra_space = 0
- },
- ["type"] = "virtual",
- characters = characters,
- descriptions = descriptions,
- -- embedding = "subset",
- -- mkiv:
- spacer = "space",
- unit = 1000,
- shared = { },
- unique = { },
+ end
+}
+
+metapost.characters.instances = metapost.characters.instances or 10
+
+function metapost.characters.process(mpxformat, name, instances, scalefactor)
+ statistics.starttiming(metapost.characters)
+ scalefactor = scalefactor or 1
+ instances = instances or metapost.characters.instances or 10
+ local fontname = file.removesuffix(file.basename(name))
+ local hash = file.robustname(string.format("%s %05i %03i", fontname, scalefactor*1000, instances))
+ local lists = containers.read(fonts.mp.cache, hash)
+ if not lists then
+ statistics.starttiming(flusher)
+ -- we can use a format per font
+ local data = io.loaddata(resolvers.findfile(name))
+ metapost.reset(mpxformat)
+ metapost.setoutercolor(2) -- no outer color and no reset either
+ lists = { }
+ for i=1,instances do
+ characters = { }
+ descriptions = { }
+ metapost.process(
+ mpxformat,
+ {
+ "randomseed := " .. i*10 .. ";",
+ "scale_factor := " .. scalefactor .. " ;",
+ data
+ },
+ false,
+ flusher
+ )
+ lists[i] = {
+ characters = characters,
+ descriptions = descriptions,
+ parameters = {
+ designsize = 655360,
+ slant = 0,
+ space = 333 * scalefactor,
+ space_stretch = 166.5 * scalefactor,
+ space_shrink = 111 * scalefactor,
+ x_height = 431 * scalefactor,
+ quad = 1000 * scalefactor,
+ extra_space = 0,
+ },
+ properties = {
+ name = string.format("%s-%03i",hash,i),
+ virtualized = true,
+ spacer = "space",
}
- end
- metapost.reset(mpxformat) -- saves memory
- lists = containers.write(fonts.mp.cache(), hash, lists)
- statistics.stoptiming(flusher)
+ }
end
- variants = variants + #lists
- statistics.stoptiming(metapost.characters)
- return lists
+ metapost.reset(mpxformat) -- saves memory
+ lists = containers.write(fonts.mp.cache, hash, lists)
+ statistics.stoptiming(flusher)
end
+ variants = variants + #lists
+ statistics.stoptiming(metapost.characters)
+ return lists
+end
- function fonts.vf.aux.combine.commands.metafont(g,v)
- local size = g.specification.size
- local data = metapost.characters.process(v[2],v[3],v[4],size/655360)
- local list, t = { }, { }
- for d=1,#data do
- t = data[d]
- t = fonts.tfm.scale(t, -1000)
- local id = font.nextid()
- t.fonts = { { id = id } }
- fontdata[id] = t
- fonts.vf.aux.compose_characters(t)
- list[d] = font.define(t)
- end
- for k=1,#t do
- g[k] = t[k] -- kind of replace, when not present, make nil
- end
- g.virtualized = true
- g.variants = list
+function fonts.handlers.vf.combiner.commands.metafont(g,v)
+ local size = g.specification.size
+ local data = metapost.characters.process(v[2],v[3],v[4],size/655360)
+ local list, t = { }, { }
+ for d=1,#data do
+ t = data[d]
+ t = fonts.constructors.scale(t, -1000)
+ local id = font.nextid()
+ t.fonts = { { id = id } }
+ fontdata[id] = t
+ fonts.handlers.vf.helpers.composecharacters(t)
+ list[d] = font.define(t)
end
-
- fonts.define.methods.install( "punk", {
- { "metafont", "mfplain", "punkfont.mp", 10 },
- } )
-
- cases.actions[99] = function(current)
- local used = fontdata[current.font].variants
- if used then
- local f = math.random(1,#used)
- current.font = used[f]
- return current, true
- else
- return current, false
- end
+ for k, v in next, t do
+ g[k] = v -- kind of replace, when not present, make nil
end
+ g.properties.virtualized = true
+ g.variants = list
+end
- metapost.characters.flusher = flusher
-
- statistics.register("metapost font generation", function()
- local time = statistics.elapsedtime(flusher)
- if total > 0 then
- return string.format("%i glyphs, %.3f seconds runtime, %i glyphs/second", total, time, total/time)
- else
- return string.format("%i glyphs, %.3f seconds runtime", total, time)
- end
- end)
+fonts.definers.methods.install( "punk", {
+ { "metafont", "mfplain", "punkfont.mp", 10 },
+} )
+fonts.definers.methods.install( "punkbold", {
+ { "metafont", "mfplain", "punkfont-bold.mp", 10 },
+} )
+fonts.definers.methods.install( "punkslanted", {
+ { "metafont", "mfplain", "punkfont-slanted.mp", 10 },
+} )
+fonts.definers.methods.install( "punkboldslanted", {
+ { "metafont", "mfplain", "punkfont-boldslanted.mp", 10 },
+} )
+
+typesetters.cases.actions[99] = function(current)
+ local used = fontdata[current.font].variants
+ if used then
+ local f = math.random(1,#used)
+ current.font = used[f]
+ return current, true
+ else
+ return current, false
+ end
+end
- statistics.register("metapost font loading",function()
- local time = statistics.elapsedtime(metapost.characters)
- if variants > 0 then
- return string.format("%.3f seconds, %i instances, %0.3f instances/second", time, variants, variants/time)
- else
- return string.format("%.3f seconds, %i instances", time, variants)
- end
- end)
+metapost.characters.flusher = flusher
-end
+statistics.register("metapost font generation", function()
+ local time = statistics.elapsedtime(flusher)
+ if total > 0 then
+ return string.format("%i glyphs, %.3f seconds runtime, %i glyphs/second", total, time, total/time)
+ else
+ return string.format("%i glyphs, %.3f seconds runtime", total, time)
+ end
+end)
+
+statistics.register("metapost font loading",function()
+ local time = statistics.elapsedtime(metapost.characters)
+ if variants > 0 then
+ return string.format("%.3f seconds, %i instances, %0.3f instances/second", time, variants, variants/time)
+ else
+ return string.format("%.3f seconds, %i instances", time, variants)
+ end
+end)
\stopluacode
\unexpanded\def\EnableRandomPunk {\setcharactercasing[99]}
@@ -209,25 +212,18 @@ end
\unexpanded\def\StopRandomPunk {\endgroup}
\starttypescript [serif] [punk] [default]
- \setups[font:fallback:serif] % no style variants yet
- \definefontsynonym [Serif] [demo@punk]
+ \definefontsynonym [Serif] [demo@punk]
+ \definefontsynonym [SerifBold] [demobold@punkbold]
+ \definefontsynonym [SerifSlanted] [demoslanted@punkslanted]
+ \definefontsynonym [SerifBoldSlanted] [demoboldslanted@punkboldslanted]
+ \definefontsynonym [SerifItalic] [SerifSlanted]
+ \definefontsynonym [SerifBoldItalic] [SerifBoldSlanted]
\stoptypescript
\starttypescript [punk]
\definetypeface [punk] [rm] [serif] [punk] [default]
\stoptypescript
-\definefontfeature[punknova][mode=node,script=latn,rand=yes,kern=yes,liga=yes,tlig=yes]
-
-\starttypescript [serif] [punknova]
- \setups[font:fallback:serif] % no style variants yet, actually it's a sans
- \definefontsynonym [Serif] [file:punknova] [features=punknova]
-\stoptypescript
-
-\starttypescript [punknova]
- \definetypeface [punknova] [rm] [serif] [punknova] [default]
-\stoptypescript
-
\endinput
\usetypescript[punk]
diff --git a/Master/texmf-dist/tex/context/base/m-punk.tex b/Master/texmf-dist/tex/context/base/m-punk.tex
deleted file mode 100644
index fe7ec85ccdb..00000000000
--- a/Master/texmf-dist/tex/context/base/m-punk.tex
+++ /dev/null
@@ -1,3 +0,0 @@
-% this file will disasppear but we need it as it is still in tex live
-
-\loadmarkfile{m-punk}
diff --git a/Master/texmf-dist/tex/context/base/m-spreadsheet.mkiv b/Master/texmf-dist/tex/context/base/m-spreadsheet.mkiv
new file mode 100644
index 00000000000..49f59ded9ef
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/m-spreadsheet.mkiv
@@ -0,0 +1,265 @@
+%D \module
+%D [ file=m-spreadsheet,
+%D version=2011.02.21,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Spreadsheets,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%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 an experimental follow up on discussion on the mailing list.
+
+\startluacode
+local byte, format = string.byte, string.format
+local R, P, C, Cs, Cc, Carg, lpegmatch = lpeg.R, lpeg.P, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.Carg, lpeg.match
+
+local spreadsheets = { }
+moduledata.spreadsheets = spreadsheets
+
+local data = { }
+spreadsheets.data = data
+
+local stack, current = { }, "default"
+
+local mt ; mt = {
+ __index = function(t,k)
+ local v = { }
+ setmetatable(v,mt)
+ t[k] = v
+ return v
+ end,
+}
+
+function spreadsheets.reset(name)
+ if not name or name == "" then name = "default" end
+ local d = { }
+ setmetatable(d,mt)
+ data[name] = d
+end
+
+function spreadsheets.start(name)
+ if not name or name == "" then name = "default" end
+ table.insert(stack,current)
+ current = name
+ if not data[current] then
+ local d = { }
+ setmetatable(d,mt)
+ data[current] = d
+ end
+end
+
+function spreadsheets.stop()
+ current = table.remove(stack)
+end
+
+spreadsheets.reset()
+
+local offset = byte("A") - 1
+
+local function assign(s,n)
+ return format("moduledata.spreadsheets.data['%s'][%s]",n,byte(s)-offset)
+end
+
+-------- datacell(name,a,b,...)
+function datacell(a,b,...)
+ local n = 0
+ if b then
+ local t = { a, b, ... }
+ for i=1,#t do
+ n = n * (i-1) * 26 + byte(t[i]) - offset
+ end
+ else
+ n = byte(a) - offset
+ end
+ -- return format("dat['%s'][%s]",name,n)
+ return format("dat[%s]",n)
+end
+
+----- cell = (Carg(1) * C(R("AZ"))^1) / datacell * (Cc("[") * (R("09")^1) * Cc("]") + #P(1))
+local cell = C(R("AZ"))^1 / datacell * (Cc("[") * (R("09")^1) * Cc("]") + #P(1))
+local pattern = Cs(Cc("return ") * (cell + P(1))^0)
+
+local functions = { }
+spreadsheets.functions = functions
+
+function functions.sum(c,f,t)
+ if f and t then
+ local r = 0
+ for i=f,t do
+ r = r + c[i]
+ end
+ return r
+ else
+ return 0
+ end
+end
+
+function functions.fmt(pattern,n)
+ return format("%"..pattern,n)
+end
+
+local template = [[
+ local spr = moduledata.spreadsheets.functions
+ local dat = moduledata.spreadsheets.data['%s']
+ local sum = spr.sum
+ local fmt = spr.fmt
+ %s
+]]
+
+local function execute(name,r,c,str)
+ if name == "" then name = current if name == "" then name = "default" end end
+ str = lpegmatch(pattern,str,1,name)
+ str = format(template,name,str)
+ -- print(str)
+ local result = loadstring(str)
+ result = result and result() or 0
+ data[name][c][r] = result
+ return result
+end
+
+function spreadsheets.set(name,r,c,str)
+ if name == "" then name = current if name == "" then name = "default" end end
+ execute(name,r,c,str)
+end
+
+function spreadsheets.get(name,r,c,str)
+ if name == "" then name = current if name == "" then name = "default" end end
+ if not str or str == "" then
+ context(data[name][c][r] or 0)
+ else
+ local result = execute(name,r,c,str)
+ if result then
+ if type(result) == "number" then
+ data[name][c][r] = result
+ end
+ context(result)
+ end
+ end
+end
+
+function spreadsheets.doifelsecell(name,r,c)
+ if name == "" then name = current if name == "" then name = "default" end end
+ local d = data[name]
+ commands.testcase(d and d[c][r])
+end
+
+function spreadsheets.show(name)
+ if name == "" then name = current if name == "" then name = "default" end end
+ table.print(data[name],name)
+end
+\stopluacode
+
+\unprotect
+
+% todo: get(...) set(..) ctx(...)
+
+\unexpanded\def\resetspreadsheet {\dosingleempty\doresetspreadsheet}
+\unexpanded\def\doresetspreadsheet [#1]{\ctxlua{moduledata.spreadsheets.reset("#1")}}
+\unexpanded\def\startspreadsheet {\dosingleempty\dostartspreadsheet}
+\unexpanded\def\dostartspreadsheet [#1]{\ctxlua{moduledata.spreadsheets.start("#1")}}
+\unexpanded\def\stopspreadsheet {\ctxlua{moduledata.spreadsheets.stop()}}
+\unexpanded\def\showspreadsheet {\dosingleempty\doshowspreadsheet}
+\unexpanded\def\doshowspreadsheet [#1]{\ctxlua{moduledata.spreadsheets.show("#1")}}
+\unexpanded\def\getspreadsheet {\dosingleempty\dogetspreadsheet}
+\unexpanded\def\dosetspreadsheet [#1]#2#3#4{\ctxlua{moduledata.spreadsheets.set ("#1",\number#2,\number#3,"#4")}}
+\unexpanded\def\setspreadsheet {\dosingleempty\dosetspreadsheet}
+\unexpanded\def\dogetspreadsheet [#1]#2#3#4{\ctxlua{moduledata.spreadsheets.get ("#1",\number#2,\number#3,"#4")}}
+\unexpanded\def\doifelsespreadsheetcell {\dosingleempty\dodoifelsespreadsheetcell}
+\unexpanded\def\dodoifelsespreadsheetcell[#1]#2#3{\ctxlua{moduledata.spreadsheets.doifelsecell("#1","#2","#3")}}
+
+\def\TABLEsetspreadsheet#1{\ctxlua{moduledata.spreadsheets.set("",\number\tblrow+1,\number\tblcol,\!!bs#1\!!es)}}
+\def\TABLEgetspreadsheet#1{\ctxlua{moduledata.spreadsheets.get("",\number\tblrow+1,\number\tblcol,\!!bs#1\!!es)}}
+
+\appendtoks
+ \resetspreadsheet
+ \let\setspr\TABLEsetspreadsheet
+ \let\getspr\TABLEgetspreadsheet
+\to \everyTABLEpass
+
+\unexpanded\def\startspreadsheettable % quick and dirty
+ {\dosingleempty\dostartspreadsheettable}
+
+\unexpanded\def\dostartspreadsheettable[#1]%
+ {\bgroup
+ \startspreadsheet[#1]%%
+ \def\startrow{\bTR}%
+ \def\stoprow {\eTR}%
+ \def\startcell##1\stopcell{\bTD\getspr{##1}\eTD}%
+ \bTABLE[\c!align=flushright]}
+
+\unexpanded\def\stopspreadsheettable
+ {\eTABLE
+ \stopspreadsheet
+ \egroup}
+
+\protect
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\bTABLE[align=middle]
+ \bTR
+ \bTD \getspr{100} \eTD \bTD test \setspr{30} \eTD
+ \eTR
+ \bTR
+ \bTD \getspr{20} \eTD \bTD \getspr{4+3} \eTD
+ \eTR
+ \bTR
+ \bTD \getspr{A[1] + A[2]} \eTD
+ \bTD \getspr{B1 + B2} \eTD
+ \eTR
+ \bTR
+ \bTD[nx=2] \bf \getspr{(A[3] + B[3]) /100} \eTD
+ \eTR
+ \bTR
+ \bTD[nx=2] \bf \getspr{string.format("\letterpercent0.3f",(A[3] + B[3]) /100)} \eTD
+ \eTR
+ \bTR
+ \bTD[nx=2] \bf \getspr{fmt("0.3f",(sum(A,1,2)) / 10)} \eTD
+ \eTR
+\eTABLE
+
+\startspreadsheet[mysheet]
+
+\bTABLE[align=middle]
+ \bTR
+ \bTD \getspr{100} \eTD \bTD test \setspr{30} \eTD
+ \eTR
+ \bTR
+ \bTD \getspr{20} \eTD \bTD \getspr{4+3} \eTD
+ \eTR
+ \bTR
+ \bTD \getspr{A[1] + A[2]} \eTD
+ \bTD \getspr{B[1] + B[2]} \eTD
+ \eTR
+ \bTR
+ \bTD[nx=2] \bf \getspr{A[3] + B[3]} \eTD
+ \eTR
+\eTABLE
+
+\stopspreadsheet
+
+\startspreadsheettable
+ \startrow
+ \startcell 3 \stopcell
+ \startcell 9 \stopcell
+ \startcell A[1] + B[1] \stopcell
+ \stoprow
+\stopspreadsheettable
+
+bla bla \getspreadsheet[mysheet]{2}{2}{}
+
+bla bla \getspreadsheet[mysheet]{4}{1}{}
+
+% \showspreadsheet
+% \showspreadsheet[mysheet]
+
+\doifelsespreadsheetcell[mysheet]{1}{2}{YES}{NOP}
+\doifelsespreadsheetcell[myshoot]{1}{2}{YES}{NOP}
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/m-steps.mkiv b/Master/texmf-dist/tex/context/base/m-steps.mkiv
deleted file mode 100644
index 9bb56c53228..00000000000
--- a/Master/texmf-dist/tex/context/base/m-steps.mkiv
+++ /dev/null
@@ -1,20 +0,0 @@
-%D \module
-%D [ file=m-steps,
-%D version=2001.05.28,
-%D title=\CONTEXT\ Modules,
-%D subtitle=Step Charts \& Tables,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-%D The \XML\ interface:
-
-\unprotect
-
-\writestatus\m!systems{The steps mkiv xml interface is not yet defined!}
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/m-steps.tex b/Master/texmf-dist/tex/context/base/m-steps.tex
index 1f6a374033c..55e13b97d3b 100644
--- a/Master/texmf-dist/tex/context/base/m-steps.tex
+++ b/Master/texmf-dist/tex/context/base/m-steps.tex
@@ -454,8 +454,8 @@
\ifcase\somestepboxone \box\stepboxone \vskip\@@STPCvoffset \fi
\ifcase\somestepboxtwo \box\stepboxtwo \vskip\scratchdimen \fi
\ifcase\sometextboxtwo \box\textboxtwo \vskip\@@STPCvoffset \fi
- \global\resetbox\stepboxone \global\resetbox\stepboxtwo % needed indeed
- \global\resetbox\textboxone \global\resetbox\textboxtwo % needed indeed
+ \global\setbox\stepboxone\emptybox \global\setbox\stepboxtwo\emptybox % needed indeed
+ \global\setbox\textboxone\emptybox \global\setbox\textboxtwo\emptybox % needed indeed
%\kern-\scratchdimen % no, instead:
\vskip-\lastskip}
\hbox
diff --git a/Master/texmf-dist/tex/context/base/m-tex4ht.tex b/Master/texmf-dist/tex/context/base/m-tex4ht.mkii
index 8a3dc9dbb03..8a3dc9dbb03 100644
--- a/Master/texmf-dist/tex/context/base/m-tex4ht.tex
+++ b/Master/texmf-dist/tex/context/base/m-tex4ht.mkii
diff --git a/Master/texmf-dist/tex/context/base/m-timing.tex b/Master/texmf-dist/tex/context/base/m-timing.mkiv
index f02a900871b..a91891a1b2f 100644
--- a/Master/texmf-dist/tex/context/base/m-timing.tex
+++ b/Master/texmf-dist/tex/context/base/m-timing.mkiv
@@ -11,8 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\doifnotmode{mkiv}{\endinput}
-
\ifx\ShowNamedUsage\undefined \else \endinput \fi
%D Written at the end of 2007, this module is dedicated to Taco. Reaching this
@@ -36,14 +34,14 @@
\ctxloadluafile{trac-tim}{}
\startluacode
-local progress = plugins.progress
+local progress = moduledata.progress
function progress.show(filename,parameters,nodes,other)
for n, name in pairs(parameters or progress.parameters(filename)) do
- tex.sprint(tex.ctxcatcodes,string.format("\\ShowNamedUsage{%s}{%s}{%s}",filename or progress.defaultfilename,name,other or ""))
+ context.ShowNamedUsage(filename or progress.defaultfilename,name,other or "")
end
for n, name in pairs(nodes or progress.nodes(filename)) do
- tex.sprint(tex.ctxcatcodes,string.format("\\ShowNamedUsage{%s}{%s}{%s}",filename or progress.defaultfilename,name,other or ""))
+ context.ShowNamedUsage(filename or progress.defaultfilename,name,other or "")
end
end
\stopluacode
@@ -51,16 +49,16 @@ end
% \everyfirstshipout
\startnotmode[no-timing]
- \appendtoks\ctxlua{plugins.progress.store()}\to\everystarttext
- \appendtoks\ctxlua{plugins.progress.store()}\to\everyshipout
- \ctxlua{main.register_stop_actions(function() plugins.progress.save() end)}
+ \appendtoks\ctxlua{moduledata.progress.store()}\to\everystarttext
+ \appendtoks\ctxlua{moduledata.progress.store()}\to\everyshipout
+ \ctxlua{luatex.registerstopactions(function() moduledata.progress.save() end)}
\stopnotmode
\def\ShowNamedUsage#1#2#3%
{\setbox\scratchbox\vbox\bgroup\startMPcode
begingroup ; save p, q, b, h, w ;
path p, q, b ; numeric h, w ;
- p := \ctxlua{tex.sprint(plugins.progress.path("#1","#2"))} ;
+ p := \ctxlua{tex.sprint(moduledata.progress.path("#1","#2"))} ;
% p := p shifted -llcorner p ;
if bbwidth(p) > 1 :
h := 100 ; w := 2 * h ;
@@ -71,7 +69,7 @@ end
draw b withcolor \MPcolor{usage:frame} ;
draw p withcolor \MPcolor{usage:line} ;
if ("#3" <> "") and ("#3" <> "#2") :
- q := \ctxlua{tex.sprint(plugins.progress.path("#1","#3"))} ;
+ q := \ctxlua{tex.sprint(moduledata.progress.path("#1","#3"))} ;
% q := q shifted -llcorner q ;
if bbwidth(q) > 1 :
q := q xstretched w ;
@@ -87,16 +85,16 @@ end
\startlinecorrection
\box\scratchbox \endgraf
\hbox to \scratchdimen{\tttf\strut\detokenize{#2}\hss
- min:\ctxlua{tex.sprint(plugins.progress.bot("#1","\detokenize{#2}"))}, %
- max:\ctxlua{tex.sprint(plugins.progress.top("#1","\detokenize{#2}"))}, %
- pages:\ctxlua{tex.sprint(plugins.progress.pages("#1"))}%
+ min:\ctxlua{tex.sprint(moduledata.progress.bot("#1","\detokenize{#2}"))}, %
+ max:\ctxlua{tex.sprint(moduledata.progress.top("#1","\detokenize{#2}"))}, %
+ pages:\ctxlua{tex.sprint(moduledata.progress.pages("#1"))}%
}%
\stoplinecorrection
\fi}
-\def\LoadUsage #1{\ctxlua{plugins.progress.convert("#1")}}
-\def\ShowUsage #1{\ctxlua{plugins.progress.show("#1",nil,nil,"elapsed_time")}}
-\def\ShowMemoryUsage#1{\ctxlua{plugins.progress.show("#1",nil,{}, "elapsed_time")}}
-\def\ShowNodeUsage #1{\ctxlua{plugins.progress.show("#1",{},nil, "elapsed_time")}}
+\def\LoadUsage #1{\ctxlua{moduledata.progress.convert("#1")}}
+\def\ShowUsage #1{\ctxlua{moduledata.progress.show("#1",nil,nil,"elapsed_time")}}
+\def\ShowMemoryUsage#1{\ctxlua{moduledata.progress.show("#1",nil,{}, "elapsed_time")}}
+\def\ShowNodeUsage #1{\ctxlua{moduledata.progress.show("#1",{},nil, "elapsed_time")}}
\endinput
diff --git a/Master/texmf-dist/tex/context/base/m-trackers.tex b/Master/texmf-dist/tex/context/base/m-trackers.mkiv
index cfcbbabffbe..95c34b16f65 100644
--- a/Master/texmf-dist/tex/context/base/m-trackers.tex
+++ b/Master/texmf-dist/tex/context/base/m-trackers.mkiv
@@ -1,5 +1,3 @@
-\doifnotmode{mkiv} {\endinput}
-
\starttext
\showtrackers
\stoptext
diff --git a/Master/texmf-dist/tex/context/base/m-translate.tex b/Master/texmf-dist/tex/context/base/m-translate.mkiv
index 9c550eca705..c0e4aad7240 100644
--- a/Master/texmf-dist/tex/context/base/m-translate.tex
+++ b/Master/texmf-dist/tex/context/base/m-translate.mkiv
@@ -11,14 +11,14 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\doifnotmode{mkiv}{\endinput}
-
%D We can make this module more clever (wildcards and such) but since
%D it's only a demo we stick to the simple case for now. After all, it's
%D better to fix your source.
\startluacode
- translators = { }
+ local translators = { }
+
+ moduledata.translators = translators
local compiled, list = nil, nil
@@ -43,27 +43,35 @@
end
end
- function translators.reset(s)
- resolvers.install_text_filter("user",nil)
- list, compiled = nil, nil
+ local textlineactions = resolvers.openers.helpers.textlineactions
+
+ utilities.sequencers.appendaction(textlineactions,"after","moduledata.translators.translate")
+
+ function translators.enable()
+ utilities.sequencers.enableaction(textlineactions,"moduledata.translators.translate")
end
- function translators.enable(s)
- resolvers.install_text_filter("user",translators.translate)
+
+ function translators.disable()
+ utilities.sequencers.disableaction(textlineactions,"moduledata.translators.translate")
end
- function translators.disable(s)
- resolvers.install_text_filter("user",nil)
+
+ function translators.reset(s)
+ translators.enable()
+ list, compiled = nil, nil
end
+
+ translators.disable()
\stopluacode
\unprotect
\def\translateinput{\dodoubleargument\dotranslateinput}
-\def\dotranslateinput[#1][#2]{\ctxlua{translators.register(\!!bs#1\!!es,\!!bs#2\!!es)}}
+\def\dotranslateinput[#1][#2]{\ctxlua{moduledata.translators.register(\!!bs#1\!!es,\!!bs#2\!!es)}}
-\def\resetinputtranslation {\ctxlua{translators.reset()}}
-\def\enableinputtranslation {\ctxlua{translators.enable()}}
-\def\disableinputtranslation{\ctxlua{translators.disable()}}
+\def\resetinputtranslation {\ctxlua{moduledata.translators.reset()}}
+\def\enableinputtranslation {\ctxlua{moduledata.translators.enable()}}
+\def\disableinputtranslation{\ctxlua{moduledata.translators.disable()}}
\def\readtranslatedfile#1%
{\enableinputtranslation
diff --git a/Master/texmf-dist/tex/context/base/m-tryout.tex b/Master/texmf-dist/tex/context/base/m-tryout.tex
deleted file mode 100644
index 4aa50376d42..00000000000
--- a/Master/texmf-dist/tex/context/base/m-tryout.tex
+++ /dev/null
@@ -1,55 +0,0 @@
-%D \module
-%D [ file=m-tryout,
-%D version=2002.05.10,
-%D title=\CONTEXT\ Extra Modules,
-%D subtitle=Tryout Features,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\endinput
-
-\unprotect
-
-%D The following macros make sure that active colons work well
-%D in French, a feature enabled with:
-%D
-%D \starttyping
-%D \useencoding[ffr] \mainlanguage[fr]
-%D \stoptyping
-%D
-%D This trick will disappear when proved robust.
-
-\startmode[activecolon]
-
-% this is now default
-
-\gdef\sectionseparator{-}
-
-\gdef\@@filterfirstpart [#1--#2]{#1}
-\gdef\@@filtersecondpart [#1--#2]{#2}
-
-\gdef\@@filterblockpart [#1--#2--#3]{#1}
-\gdef\@@filternumberpart [#1--#2--#3]{#2}
-\gdef\@@filterpagepart [#1--#2--#3]{#3}
-\gdef\@@filterblocknumberpart[#1--#2--#3]{#1--#2}
-
-\gdef\@@filterheadpart[#1]{\@EA\@@dofilterheadpart\@EA[#1-0]}
-\gdef\@@filtertailpart[#1]{\@EA\@@dofiltertailpart\@EA[#1-0]}
-
-\gdef\@@dofilterheadpart[#1-#2]{#1}
-\gdef\@@dofiltertailpart[#1-#2]{#2}
-
-\gdef\@@filterlevelpart[#1--#2--#3]{\@@dofilterlevelpart[#2-0-0-0-0]}
-
-\gdef\@@dofilterlevelpart[#1-0-0-0-#2]{#1}
-
-\reopenutilities
-
-\stopmode
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/m-units.tex b/Master/texmf-dist/tex/context/base/m-units.mkii
index d186c542b57..6a899736bb5 100644
--- a/Master/texmf-dist/tex/context/base/m-units.tex
+++ b/Master/texmf-dist/tex/context/base/m-units.mkii
@@ -367,15 +367,33 @@
\def\Micro {\dimensionprefix{\iftextdimensions u\else\mu\fi}}
\def\Milli {\dimensionprefix{m}}
\def\Centi {\dimensionprefix{c}}
-\def\Deci {\dimensionprefix{d}}
-\def\Hecto {\dimensionprefix{h}}
-\def\Kilo {\dimensionprefix{k}}
-\def\Mega {\dimensionprefix{M}}
-\def\Giga {\dimensionprefix{G}}
-\def\Terra {\dimensionprefix{T}} % for old times sake
-\def\Tera {\dimensionprefix{T}}
-\def\Peta {\dimensionprefix{P}}
-\def\Exa {\dimensionprefix{E}}
+\def\Deci {\dimensionprefix{d}} % 10^01
+\def\Hecto {\dimensionprefix{h}} % 10^02
+\def\Kilo {\dimensionprefix{k}} % 10^03
+\def\Mega {\dimensionprefix{M}} % 10^06
+\def\Giga {\dimensionprefix{G}} % 10^09
+\def\Tera {\dimensionprefix{T}} % 10^12
+\def\Peta {\dimensionprefix{P}} % 10^15
+\def\Exa {\dimensionprefix{E}} % 10^18
+
+%def\Terra {\dimensionprefix{T}} % for old times sake
+
+\def\Kibi {\dimensionprefix{ki}} % 2^10
+\def\Mebi {\dimensionprefix{Mi}} % 2^20
+\def\Gibi {\dimensionprefix{Gi}} % 2^30
+\def\Tebi {\dimensionprefix{Ti}} % 2^40
+\def\Pebi {\dimensionprefix{Pi}} % 2^50
+
+%D and binary prefixes:
+
+\def\Kibi {\dimensionprefix{Ki}}
+\def\Mebi {\dimensionprefix{Mi}}
+\def\Gibi {\dimensionprefix{Gi}}
+\def\Tebi {\dimensionprefix{Ti}}
+\def\Pebi {\dimensionprefix{Pi}}
+\def\Exbi {\dimensionprefix{Ei}}
+\def\Zebi {\dimensionprefix{Zi}}
+\def\Yobi {\dimensionprefix{Yi}}
%D and operators:
@@ -384,7 +402,7 @@
\def\Per {\dimensionmidfix{/}}
\def\OutOf {\dimensionnopfix{:}}
-%D and suffixes:
+%D and suffixes:
\def\Linear {\dimensionpower{1}}
\def\Square {\dimensionpower{2}}
@@ -479,6 +497,21 @@
u:min=Minuten]
\setuplabeltext
+ [\s!hr]
+ [u:sec=sekunda,
+ u:fsec=femtosekunda,
+ u:psec=pikosekunda,
+ u:nsec=nanosekunda,
+ u:usec=mikrosekunda,
+ u:msec=milisekunda,
+ u:year=godina,
+ u:month=mjesec,
+ u:week=tjedan,
+ u:day=dan,
+ u:hour=sat,
+ u:min=minuta]
+
+\setuplabeltext
[\s!it]
[u:sec=secondo,
u:fsec=femtosecondo,
@@ -514,6 +547,11 @@
u:deg=Gradma\SS]
\setuplabeltext
+ [\s!hr]
+ [u:rad=radijani,
+ u:deg=kutni stupnjevi]
+
+\setuplabeltext
[\s!it]
[u:rad=radianti,
u:deg=angoli sessagesimali]
@@ -546,6 +584,11 @@
u:rpm=Umdrehungen pro Minute]
\setuplabeltext
+ [\s!hr]
+ [u:rps=okretaji po sekundi,
+ u:rpm=okretaji po minuti]
+
+\setuplabeltext
[\s!it]
[u:rps=giri al secondo,
u:rpm=giri al minuto]
@@ -578,6 +621,10 @@
[u:u=Atomare Masseneinheit]
\setuplabeltext
+ [\s!hr]
+ [u:u=unificirana atomska jedinica mase]
+
+\setuplabeltext
[\s!it]
[u:u=unit\`a di massa atomica]
@@ -659,21 +706,42 @@
u:vdc=Gleichspannung]
\setuplabeltext
+ [\s!hr]
+ [u:vac=izmjeni\ccaron ni napon,
+ u:vdc=istosmjerni napon]
+
+\setuplabeltext
[\s!it]
[u:vac=corrente alternata,
u:vdc=corrente continua]
-%D Computer memory is specified in Bytes:
+%D Network bandwidth is specified in Bits:
+
+\getvalue{\v!unit} [Bit] {bit} {\labeltext{u:bit}}
+\getvalue{\v!unit} [Baud] {Bd} {Baud (Bit/s)}
-\getvalue{\v!unit} [Baud] {Baud} {Baud (Bit/s)}
-\getvalue{\v!unit} [Bit] {Bit} {Bit}
+%D Computer memory size is specified in Bytes:
-\getvalue{\v!unit} [Byte] {Byte} {Byte}
+\getvalue{\v!unit} [Byte] {B} {\labeltext{u:byte}}
\getvalue{\v!unit} [kByte] {\Kilo \Byte} {kilo Byte}
\getvalue{\v!unit} [MByte] {\Mega \Byte} {mega Byte}
\getvalue{\v!unit} [GByte] {\Giga \Byte} {giga Byte}
\getvalue{\v!unit} [TByte] {\Tera \Byte} {tera Byte}
+\setuplabeltext
+ [\s!en]
+ [u:bit=Bit,
+ u:byte=Byte]
+
+\setuplabeltext
+ [\s!hr]
+ [u:bit=bit,
+ u:byte=bajt]
+
+%D Telecommunication call density is specified in Erlangs:
+
+\getvalue{\v!unit} [Erlang] {E} {Erlang}
+
%D Some radiation related units:
\getvalue{\v!unit} [Bequerel] {Bq} {Bequerel}
@@ -698,7 +766,7 @@
\getvalue{\v!unit} [Bar] {bar} {bar (100 \Kilo \Pascal)}
\getvalue{\v!unit} [EVolt] {eV} {electronvolt}
\getvalue{\v!unit} [Foot] {ft} {\labeltext{u:ft}}
-\getvalue{\v!unit} [Inch] {inch} {inch}
+\getvalue{\v!unit} [Inch] {inch} {\labeltext{u:inch}}
\getvalue{\v!unit} [Cal] {cal} {\labeltext{u:cal}}
\getvalue{\v!unit} [Force] {f} {\labeltext{u:f}}
\getvalue{\v!unit} [kCal] {\Kilo \Cal} {\labeltext{u:kcal}}
@@ -732,9 +800,10 @@
\setuplabeltext
[\s!en]
- [u:at=technical atmosferic pressure,
- u:atm=physical atmosferic pressure,
+ [u:at=technical atmospheric pressure,
+ u:atm=physical atmospheric pressure,
u:ft=foot,
+ u:inch=inch,
u:cal=calory,
u:f=force,
u:kcal=kilocalory]
@@ -742,13 +811,23 @@
\setuplabeltext
[\s!de]
[u:at=Technischer atmosph\"arischer Druck,
- u:atm=physkalischer atmosph\"arischer Druck
+ u:atm=physkalischer atmosph\"arischer Druck,
u:ft=Fu\SS,
u:cal=Kalorien,
u:f=Force,
u:kcal=Kilokalorien]
\setuplabeltext
+ [\s!hr]
+ [u:at=tehni\ccaron ka atmosfera,
+ u:atm=standardna atmosfera,
+ u:ft=stopa,
+ u:inch=in\ccaron a,
+ u:cal=kalorija,
+ u:f=Force,
+ u:kcal=Kilokalorien]
+
+\setuplabeltext
[\s!it]
[u:at=pressione atmosferica tecnica,
u:atm=pressione atmosfera fisica,
diff --git a/Master/texmf-dist/tex/context/base/m-units.mkiv b/Master/texmf-dist/tex/context/base/m-units.mkiv
new file mode 100644
index 00000000000..a7653c56677
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/m-units.mkiv
@@ -0,0 +1,912 @@
+%D \module
+%D [ file=m-units,
+%D version=1997.03.19,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Scientific Units,
+%D author={Hans Hagen \& Ton Otten},
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Scientific units can be typeset in math mode pretty well,
+%D but occasionally one has to take care of spacing.
+%D Furthermore, entering these units is not that natural as
+%D wanted. Therefore this module presents a more natural way of
+%D doing things, like:
+%D
+%D \starttyping
+%D 1.23 \Cubic \Meter \Per \Second
+%D \stoptyping
+%D
+%D This example shows that we use the order in which we say
+%D things, instead of typeset things. There is a separate
+%D manual for this module.
+
+%D Message number~1 deals with overruling the \type {\Degrees}
+%D macro defined in the core modules. Let's say that this is
+%D an upward compatibility issue.
+
+% \registerctxluafile{x-units}{}
+
+\startmessages dutch library: units
+ title: eenheden
+ 1: gebruik \string\Degrees\space\string\Celsius\space in plaats van \string\Celsius !
+\stopmessages
+
+\startmessages english library: units
+ title: units
+ 1: use \string\Degrees\space\string\Celsius\space instead of \string\Celsius !
+\stopmessages
+
+\startmessages german library: units
+ title: Einheiten
+ 1: Verwende \string\Degrees\space\string\Celsius\space statt \string\Celsius !
+\stopmessages
+
+\startmessages italian library: units
+ title: unita
+ 1: usare \string\Degrees\space\string\Celsius\space invece di \string\Celsius !
+\stopmessages
+
+\startmessages norwegian library: units
+ title: enheter
+ 1: bruk \string\Degrees\space\string\Celsius\space istedenfor \string\Celsius !
+\stopmessages
+
+\startmessages romanian library: units
+ title: unitati
+ 1: folositi \string\Degrees\space\string\Celsius\space in locul \string\Celsius !
+\stopmessages
+
+\startmessages french library: units
+ title: unitas
+ 1: utilisez \string\Degrees\space\string\Celsius\space A la place de \string\Celsius !
+\stopmessages
+
+\registerctxluafile{x-mathml}{}
+
+\unprotect
+
+\startmodule[units]
+
+%D This runtime loadable module implements a way of defining
+%D units. The core macro is \type {\dimension}, a rather clever
+%D one that is able to cooperate with some other dimension
+%D related macros. As said, this module enables user to enter:
+%D
+%D \startbuffer
+%D some 10 \Square \Meter \Per \Second or more
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D as:
+%D
+%D \typebuffer
+%D
+%D The units itself are implemented as synonyms.
+%D
+%D \starttyping
+%D \definesynonyms [unit] [units] [\unitmeaning]
+%D \setupsynonyms [unit] [textstyle=\dimension]
+%D \stoptyping
+%D
+%D This definition means that we can ask for the meaning of a
+%D unit using \type {\unitmeaning} and get a list of used
+%D units by saying \type {\placelistofunits}
+%D
+%D We have to use the command \type {\unitmeaning} instead
+%D of \type {\meaning}, simply because the latter is a \TEX\
+%D primitive we don't want to loose. We use the label text
+%D mechanism for translations.
+
+%D \macros
+%D {dimension}
+%D
+%D The core of this module is the low level macro \type
+%D {\dimension}. Before presenting this macro, it's best to
+%D look at some applications, because it's supposed to show
+%D some intelligence that can beter be understood from the
+%D context.
+%D
+%D The next useless examples show some of the cases we want
+%D to handle in a proper way.
+%D
+%D \startbuffer
+%D ... 10 \Square \Meter \Per \Volt \
+%D ... 10 \Square \Meter \Volt \
+%D ... 10 \Meter \Volt \
+%D ... 10 \Milli \Square \Meter \Per \Volt \
+%D ... 10 \Square \Milli \Meter \Per \Volt \
+%D ... 10 \Meter \Times \Meter \
+%D ... 10 \Square \Meter \Times \Meter \
+%D ... 10 \Square \Milli \Meter \Times \Meter \
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Becomes:
+%D
+%D \getbuffer
+
+%D \macros
+%D {mathematicstypeface, dimensiontypeface,
+%D dimensionhalfspace, dimensionbackspace}
+%D
+%D There are some low level constants, that can be changed
+%D when needed. Some day I will write a decent setup command.
+
+\def\mathematicstypeface{\rm}
+\def\dimensiontypeface {\tf}
+
+\def\dimensionhalfspace {\ifmmode\,\else\hskip+.1em\relax\fi}
+\def\dimensionbackspace {\ifmmode\!\else\hskip-.1em\relax\fi}
+
+%D \macros
+%D {smashdimensionpower}
+%D
+%D Sometimes the baseline distance is not enough to provide
+%D for superscripts, so we smash their height by default.
+
+\newif\ifsmashdimensionpower \smashdimensionpowertrue
+
+%D The dimension mechanism uses a lot of signals to keep
+%D track if the current state.
+
+\newsignal\dimensionsignal
+\newsignal\dimensionpowersignal
+\newsignal\dimensionmidfixsignal
+\newsignal\dimensionaddfixsignal
+
+\let\thedimensionprefix = \empty
+\let\thedimensionpower = \empty
+
+%D \macros
+%D {spaceddimensions,textdimensions}
+%D
+%D The actual definition of \type {\dimension} overruled the
+%D one in the core modules. The boolean can be used to
+%D force spacing between units. Vergelijk {\Newton \Meter}
+%D eens met {\spaceddimensionstrue \Newton \Meter}. The
+%D rather ugly test prevents problems with nested dimensions.
+
+\newif\ifspaceddimensions \spaceddimensionsfalse % user switch
+\newif\iftextdimensions \textdimensionsfalse % user switch
+
+%D You can see the consequence of forcing text dimensions
+%D when you compare the following code:
+%D
+%D \starttyping
+%D {\rm test \Square \Meter \Per \Second\ ziezo\Degrees} \par
+%D {\ss test \Square \Meter \Per \Second\ ziezo} \par
+%D {\tt test \Square \Meter \Per \Second\ ziezo}
+%D
+%D \textdimensionstrue
+%D
+%D {\rm test \Square \Meter \Per \Second\ ziezo} \par
+%D {\ss test \Square \Meter \Per \Second\ ziezo} \par
+%D {\tt test \Square \Meter \Per \Second\ ziezo}
+%D \stoptyping
+
+\newif\ifnesteddimension \nesteddimensionfalse % local switch
+
+\def\dodimensionpower#1%
+ {\iftextdimensions\expandafter\high\else\expandafter\normalsuperscript\fi{#1}}
+
+\def\ustartmathmode {\iftextdimensions\else\expandafter\startmathmode \fi}
+\def\ustopmathmode {\iftextdimensions\else\expandafter\stopmathmode \fi}
+\def\umathematicstypeface{\iftextdimensions\else\expandafter\mathematicstypeface\fi}
+
+%D In forced text mode, we ignore spacing in monospaced fonts.
+
+\def\udimensionhalfspace {\dodimensionspace\dimensionhalfspace}
+\def\udimensionbackspace {\dodimensionspace\dimensionbackspace}
+
+\def\dodimensionspace
+ {\iftextdimensions
+ \begingroup
+ \setbox0\hbox{i}%
+ \setbox2\hbox{m}%
+ \ifdim\wd0=\wd2
+ \endgroup
+ \@EAEAEA\gobbleoneargument
+ \else
+ \endgroup
+ \fi
+ \fi}
+
+\unexpanded\def\dimension#1%
+ {\begingroup
+ \global\let\savedthedimensionprefix\thedimensionprefix
+ \global\let\savedthedimensionpower\thedimensionpower
+ \unexpanded\def\dimension##1{\global\nesteddimensiontrue}%
+ \let\dimensionprefix\dimension
+ \let\dimensionmidfix\dimension
+ \let\dimensionsuffix\dimension
+ \let\dimensionpower \dimension
+ \global\nesteddimensionfalse
+ \setbox\scratchbox\hbox{\ustartmathmode#1\ustopmathmode}% pre-roll
+ \global\let\thedimensionprefix\savedthedimensionprefix
+ \global\let\thedimensionpower \savedthedimensionpower
+ \endgroup
+ \ifnesteddimension#1\else\dodimension{#1}\fi}
+
+\def\dodimension#1%
+ {\dontbreakdimension
+ \ifdim\scratchdimen=\zeropoint\relax
+ \ifmmode
+ \udimensionhalfspace
+ \udimensionhalfspace
+ \fi
+ \ustartmathmode\dimensiontypeface
+ \else
+ \ustartmathmode\dimensiontypeface
+ \ifspaceddimensions
+ \ifdim\scratchdimen=\dimensionsignal\relax
+ \udimensionhalfspace
+ \else\ifdim\scratchdimen=\dimensionpowersignal\relax
+ \udimensionhalfspace
+ \fi
+ \fi
+ \fi
+ \fi
+ \umathematicstypeface\thedimensionprefix#1%
+ \ifx\thedimensionpower\empty
+ \else\ifsmashdimensionpower
+ \setbox\scratchbox=\hbox
+ {\iftextdimensions
+ \tx\thedimensionpower
+ \else
+ $\scriptstyle\thedimensionpower$%
+ \fi}%
+ \ht\scratchbox=\zeropoint
+ \dodimensionpower{\box\scratchbox}%
+ \else
+ \dodimensionpower{\thedimensionpower}%
+ \fi\fi
+ \ustopmathmode
+ % otherwise nobreak before space in 2 \Milli \Meter\ blabla
+ \doifnotmode{atpragma}{\nobreak}% this was always \nobreak
+ % only test this at pragma
+ \ifx\thedimensionpower\empty
+ \hskip\dimensionsignal
+ \else
+ \hskip\dimensionpowersignal
+ \fi
+ \global\let\thedimensionprefix\empty
+ \global\let\thedimensionpower\empty}
+
+%D \macros
+%D {dontbreakdimension,
+%D dimensionprefix, dimensionaddfix,
+%D dimensionnopfix, dimensionmidfix,
+%D dimensionpower}
+%D
+%D Here are some auxilliary macros.
+
+\def\dontbreakdimension
+ {\scratchdimen\lastskip
+ \unskip
+ \nobreak
+ \hskip\scratchdimen
+ \nobreak}
+
+\def\dimensionprefix#1%
+ {\gdef\thedimensionprefix{#1}}
+
+\def\dimensionaddfix#1%
+ {\unskip
+ %\mathematics{\umathematicstypeface#1}%
+ \ustartmathmode\umathematicstypeface#1\ustopmathmode
+ \nobreak
+ \hskip\dimensionaddfixsignal}
+
+\def\dimensionnopfix#1%
+ {\dontbreakdimension
+ \ifdim\scratchdimen=\dimensionpowersignal\relax
+ \ustartmathmode
+ \else
+ \ustartmathmode
+ \udimensionhalfspace
+ \nobreak
+ \fi
+ \umathematicstypeface#1%
+ \ustopmathmode
+ \nobreak
+ \hskip\dimensionsignal}
+
+\def\dimensionmidfix#1%
+ {\dontbreakdimension
+ \ifdim\scratchdimen=\dimensionpowersignal\relax
+ \ustartmathmode
+ \udimensionbackspace
+ \nobreak
+ \else
+ \ustartmathmode
+ \fi
+ \umathematicstypeface#1%
+ \ustopmathmode
+ \nobreak
+ \hskip\dimensionmidfixsignal}
+
+\def\dimensionpower#1%
+ {\gdef\thedimensionpower{#1}}
+
+%D \macros
+%D {SIunits, noSI, doSI}
+%D
+%D Some low level unit switching macros:
+
+\newif\ifSIunits \SIunitstrue
+
+\def\noSI#1{\begingroup\SIunitsfalse#1\endgroup}
+\def\doSI#1{\begingroup\SIunitstrue #1\endgroup}
+
+%D \macros
+%D {Degrees}
+%D
+%D We can fake the degrees symbol with:
+
+\def\Degrees{\dimensionaddfix{\mathematics{\normalsuperscript\circ}}}
+
+%D \macros
+%D {Unit, NoUnit}
+%D
+%D When a dimension has no leading number, we can use \type
+%D {\Unit}, and when no unit is appended, \type {\NoUnit} is
+%D to be used, just to prevent the prefix migrating to the
+%D next occasion.
+
+\def\Unit {\hskip\dimensionsignal}
+\def\NoUnit {\dimension{}}
+
+%D The mechanism described at the top of this module, depends
+%D on several dimensional components, like prefixes:
+
+\def\Atto {\dimensionprefix{a}}
+\def\Femto {\dimensionprefix{f}}
+\def\Pico {\dimensionprefix{p}}
+\def\Nano {\dimensionprefix{n}}
+\def\Micro {\dimensionprefix{\iftextdimensions u\else\mu\fi}}
+\def\Milli {\dimensionprefix{m}}
+\def\Centi {\dimensionprefix{c}}
+\def\Deci {\dimensionprefix{d}} % 10^{01}
+\def\Hecto {\dimensionprefix{h}} % 10^{02}
+\def\Kilo {\dimensionprefix{k}} % 10^{03}
+\def\Mega {\dimensionprefix{M}} % 10^{06}
+\def\Giga {\dimensionprefix{G}} % 10^{09}
+\def\Tera {\dimensionprefix{T}} % 10^{12}
+\def\Peta {\dimensionprefix{P}} % 10^{15}
+\def\Exa {\dimensionprefix{E}} % 10^{18}
+
+%def\Terra {\dimensionprefix{T}} % for old times sake
+
+\def\Kibi {\dimensionprefix{ki}} % 2^{10}
+\def\Mebi {\dimensionprefix{Mi}} % 2^{20}
+\def\Gibi {\dimensionprefix{Gi}} % 2^{30}
+\def\Tebi {\dimensionprefix{Ti}} % 2^{40}
+\def\Pebi {\dimensionprefix{Pi}} % 2^{50}
+
+%D and binary prefixes:
+
+\def\Kibi {\dimensionprefix{Ki}}
+\def\Mebi {\dimensionprefix{Mi}}
+\def\Gibi {\dimensionprefix{Gi}}
+\def\Tebi {\dimensionprefix{Ti}}
+\def\Pebi {\dimensionprefix{Pi}}
+\def\Exbi {\dimensionprefix{Ei}}
+\def\Zebi {\dimensionprefix{Zi}}
+\def\Yobi {\dimensionprefix{Yi}}
+
+%D and operators:
+
+\def\Times {\dimensionnopfix{\iftextdimensions.\else\cdot\fi}}
+\def\Solidus {\dimensionmidfix{/}}
+\def\Per {\dimensionmidfix{/}}
+\def\OutOf {\dimensionnopfix{:}}
+
+%D and suffixes:
+
+\def\Linear {\dimensionpower{1}}
+\def\Square {\dimensionpower{2}}
+\def\Cubic {\dimensionpower{3}}
+
+\def\Inverse {\dimensionpower{-1}}
+\def\ILinear {\dimensionpower{-1}}
+\def\ISquare {\dimensionpower{-2}}
+\def\ICubic {\dimensionpower{-3}}
+
+%D Apart from these components, the units themselves are
+%D defined using the synonym mechanism. First we define some
+%D length and volume related units.
+
+\getvalue{\v!unit} [Meter] {m} {meter}
+\getvalue{\v!unit} [pMeter] {\Pico \Meter} {picometer}
+\getvalue{\v!unit} [nMeter] {\Nano \Meter} {nanometer}
+\getvalue{\v!unit} [uMeter] {\Micro \Meter} {micrometer}
+\getvalue{\v!unit} [mMeter] {\Milli \Meter} {millimeter}
+\getvalue{\v!unit} [cMeter] {\Centi \Meter} {centimeter}
+\getvalue{\v!unit} [dMeter] {\Deci \Meter} {decimeter}
+\getvalue{\v!unit} [hMeter] {\Hecto \Meter} {hectometer}
+\getvalue{\v!unit} [kMeter] {\Kilo \Meter} {kilometer}
+
+%D After some discussion on the \CONTEXT\ mailing list in
+%D february 2002 it was decided to go from L to l for liters
+%D (Karel Wesselings alternative: \mathematics{\ell}).
+
+\getvalue{\v!unit} [Liter] {l} {liter}
+\getvalue{\v!unit} [mLiter] {\Milli \Liter} {milliliter}
+\getvalue{\v!unit} [cLiter] {\Centi \Liter} {centiliter}
+\getvalue{\v!unit} [dLiter] {\Deci \Liter} {deciliter}
+
+%D Next we define time related units (\type {\ifSI} still dutch only).
+
+\getvalue{\v!unit} [Sec] {s} {\labeltext{u:sec}}
+\getvalue{\v!unit} [fSec] {\Femto \Sec} {\labeltext{u:fsec}}
+\getvalue{\v!unit} [pSec] {\Pico \Sec} {\labeltext{u:psec}}
+\getvalue{\v!unit} [nSec] {\Nano \Sec} {\labeltext{u:nsec}}
+\getvalue{\v!unit} [uSec] {\Micro \Sec} {\labeltext{u:usec}}
+\getvalue{\v!unit} [mSec] {\Milli \Sec} {\labeltext{u:msec}}
+\getvalue{\v!unit} [Year] {\ifSIunits a \else j\fi} {\labeltext{u:year}}
+\getvalue{\v!unit} [Month] {m} {\labeltext{u:month}}
+\getvalue{\v!unit} [Week] {w} {\labeltext{u:week}}
+\getvalue{\v!unit} [Day] {d} {\labeltext{u:day}}
+\getvalue{\v!unit} [Hour] {\ifSIunits h \else u\fi} {\labeltext{u:hour}}
+\getvalue{\v!unit} [Min] {min} {\labeltext{u:min}}
+
+\setuplabeltext
+ [\s!nl]
+ [u:sec=seconde,
+ u:psec=picoseconde,
+ u:fsec=femtoseconde,
+ u:nsec=nanoseconde,
+ u:usec=microseconde,
+ u:msec=milliseconde,
+ u:year=jaar,
+ u:month=maand,
+ u:week=week,
+ u:day=dag,
+ u:hour=uur,
+ u:min=minuten]
+
+\setuplabeltext
+ [\s!en]
+ [u:sec=second,
+ u:fsec=femtosecond,
+ u:psec=picosecond,
+ u:nsec=nanosecond,
+ u:usec=microsecond,
+ u:msec=millisecond,
+ u:year=year,
+ u:month=month,
+ u:week=week,
+ u:day=day,
+ u:hour=hour,
+ u:min=minutes]
+
+\setuplabeltext
+ [\s!de]
+ [u:sec=Sekunde,
+ u:fsec=Femtosekunde,
+ u:psec=Picosekunde,
+ u:nsec=Nanosekunde,
+ u:usec=Microsekunde,
+ u:msec=Millisekunde,
+ u:year=Jahr,
+ u:month=Monat,
+ u:week=Woche,
+ u:day=Tag,
+ u:hour=Stunde,
+ u:min=Minuten]
+
+\setuplabeltext
+ [\s!hr]
+ [u:sec=sekunda,
+ u:fsec=femtosekunda,
+ u:psec=pikosekunda,
+ u:nsec=nanosekunda,
+ u:usec=mikrosekunda,
+ u:msec=milisekunda,
+ u:year=godina,
+ u:month=mjesec,
+ u:week=tjedan,
+ u:day=dan,
+ u:hour=sat,
+ u:min=minuta]
+
+\setuplabeltext
+ [\s!it]
+ [u:sec=secondo,
+ u:fsec=femtosecondo,
+ u:psec=picosecondo,
+ u:nsec=nanosecondo,
+ u:usec=microsecondo,
+ u:msec=millisecondo,
+ u:year=anno,
+ u:month=mese,
+ u:week=settimana,
+ u:day=giorno,
+ u:hour=ora,
+ u:min=minuti]
+
+%D Then we define some angles.
+
+\getvalue{\v!unit} [Rad] {rad} {\labeltext{u:rad}}
+\getvalue{\v!unit} [Deg] {{\mathematics{\normalsuperscript\circ}}} {\labeltext{u:deg}}
+
+\setuplabeltext
+ [\s!nl]
+ [u:rad=hoek radialen,
+ u:deg=hoek graden]
+
+\setuplabeltext
+ [\s!en]
+ [u:rad=angle radians,
+ u:deg=angle degrees]
+
+\setuplabeltext
+ [\s!de]
+ [u:rad=Bogenma\SS,
+ u:deg=Gradma\SS]
+
+\setuplabeltext
+ [\s!hr]
+ [u:rad=radijani,
+ u:deg=kutni stupnjevi]
+
+\setuplabeltext
+ [\s!it]
+ [u:rad=radianti,
+ u:deg=angoli sessagesimali]
+
+%D Rotation and frequency related units are defined by:
+
+\getvalue{\v!unit} [Hertz] {Hz} {Hertz}
+\getvalue{\v!unit} [kHertz] {\Kilo \Hertz} {kilo Hertz}
+\getvalue{\v!unit} [MHertz] {\Mega \Hertz} {mega Hertz}
+\getvalue{\v!unit} [GHertz] {\Giga \Hertz} {giga Hertz}
+\getvalue{\v!unit} [THertz] {\Tera \Hertz} {tera Hertz}
+\getvalue{\v!unit} [mHertz] {\Milli \Hertz} {milli Hertz}
+
+\getvalue{\v!unit} [RevPerSec] {RPS} {\labeltext{u:rps}}
+\getvalue{\v!unit} [RevPerMin] {RPM} {\labeltext{u:rpm}}
+
+\setuplabeltext
+ [\s!nl]
+ [u:rps=omwentelingen per seconde,
+ u:rpm=omwentelingen per minuut]
+
+\setuplabeltext
+ [\s!en]
+ [u:rps=revolutions per second,
+ u:rpm=revolutions per minute]
+
+\setuplabeltext
+ [\s!de]
+ [u:rps=Umdrehungen pro Sekunde,
+ u:rpm=Umdrehungen pro Minute]
+
+\setuplabeltext
+ [\s!hr]
+ [u:rps=okretaji po sekundi,
+ u:rpm=okretaji po minuti]
+
+\setuplabeltext
+ [\s!it]
+ [u:rps=giri al secondo,
+ u:rpm=giri al minuto]
+
+%D Mass and force:
+
+\getvalue{\v!unit} [Gram] {g} {gram}
+\getvalue{\v!unit} [uGram] {\Micro \Gram} {microgram}
+\getvalue{\v!unit} [mGram] {\Milli \Gram} {milligram}
+\getvalue{\v!unit} [kGram] {\Kilo \Gram} {kilogram}
+\getvalue{\v!unit} [Atom] {u} {\labeltext{u:u}}
+
+\getvalue{\v!unit} [Newton] {N} {Newton}
+\getvalue{\v!unit} [kNewton] {\Kilo \Newton} {kilo Newton}
+
+\getvalue{\v!unit} [Pascal] {Pa} {Pascal}
+\getvalue{\v!unit} [mPascal] {\Milli \Pascal} {milli Pascal}
+\getvalue{\v!unit} [kPascal] {\Kilo \Pascal} {kilo Pascal}
+
+\setuplabeltext
+ [\s!nl]
+ [u:u=atomaire massa eenheid]
+
+\setuplabeltext
+ [\s!en]
+ [u:u=atom mass unit]
+
+\setuplabeltext
+ [\s!de]
+ [u:u=Atomare Masseneinheit]
+
+\setuplabeltext
+ [\s!hr]
+ [u:u=unificirana atomska jedinica mase]
+
+\setuplabeltext
+ [\s!it]
+ [u:u=unit\`a di massa atomica]
+
+%D Energy units comes in two alternatives:
+
+\getvalue{\v!unit} [Joule] {J} {Joule}
+\getvalue{\v!unit} [mJoule] {\Milli \Joule} {milli Joule}
+\getvalue{\v!unit} [kJoule] {\Kilo \Joule} {kilo Joule}
+\getvalue{\v!unit} [MJoule] {\Mega \Joule} {mega Joule}
+\getvalue{\v!unit} [GJoule] {\Giga \Joule} {giga Joule}
+
+\getvalue{\v!unit} [Watt] {W} {Watt}
+\getvalue{\v!unit} [mWatt] {\Milli \Watt} {milli Watt}
+\getvalue{\v!unit} [kWatt] {\Kilo \Watt} {kilo Watt}
+\getvalue{\v!unit} [MWatt] {\Mega \Watt} {mega Watt}
+\getvalue{\v!unit} [GWatt] {\Giga \Watt} {giga Watt}
+\getvalue{\v!unit} [TWatt] {\Tera \Watt} {tera Watt}
+
+%D Although Celsius is no longer permitted, we define it by
+%D saying:
+
+\getvalue{\v!unit} [Celsius] {C} {Celsius}
+\getvalue{\v!unit} [Kelvin] {K} {Kelvin}
+\getvalue{\v!unit} [Fahrenheit] {F} {Fahrenheit}
+
+%D Some chemic related units are:
+
+\getvalue{\v!unit} [Mol] {mol} {mol}
+\getvalue{\v!unit} [mMol] {\Milli \Mol} {millimol}
+\getvalue{\v!unit} [kMol] {\Kilo \Mol} {kilomol}
+\getvalue{\v!unit} [Molair] {M} {molair (\Mol \Per \Liter)}
+\getvalue{\v!unit} [Equivalent] {eq} {equivalent}
+\getvalue{\v!unit} [mEquivalent] {\Milli \Equivalent} {milli equivalent}
+
+%D There are quite a lot units related to electricity and
+%D magnetism:
+
+\getvalue{\v!unit} [Farad] {F} {Farad}
+\getvalue{\v!unit} [pFarad] {\Pico \Farad} {pico Farad}
+\getvalue{\v!unit} [nFarad] {\Nano \Farad} {nano Farad}
+\getvalue{\v!unit} [uFarad] {\Micro \Farad} {micro Farad}
+\getvalue{\v!unit} [mFarad] {\Milli \Farad} {milli Farad}
+
+\getvalue{\v!unit} [Ohm] {\Omega} {Ohm}
+\getvalue{\v!unit} [kOhm] {\Kilo \Ohm} {kilo Ohm}
+
+\getvalue{\v!unit} [Siemens] {S} {Siemens}
+
+\getvalue{\v!unit} [Ampere] {A} {Amp\`ere}
+\getvalue{\v!unit} [mAmpere] {\Milli \Ampere} {milli Amp\`ere}
+
+\getvalue{\v!unit} [Coulomb] {C} {Coulomb}
+
+\getvalue{\v!unit} [Volt] {V} {Volt}
+\getvalue{\v!unit} [mVolt] {\Milli \Volt} {milli Volt}
+\getvalue{\v!unit} [kVolt] {\Kilo \Volt} {kilo Volt}
+\getvalue{\v!unit} [eVolt] {eV} {electronvolt}
+\getvalue{\v!unit} [keVolt] {\Kilo \eVolt} {kilo electronvolt}
+\getvalue{\v!unit} [MeVolt] {\Mega \eVolt} {mega electronvolt}
+
+\getvalue{\v!unit} [Tesla] {T} {Tesla}
+
+\getvalue{\v!unit} [VoltAC] {V\normalsubscript{\xbox{ac}}} {\labeltext{u:vac}}
+\getvalue{\v!unit} [VoltDC] {V\normalsubscript{\xbox{dc}}} {\labeltext{u:vdc}}
+
+\setuplabeltext
+ [\s!nl]
+ [u:vac=wisselspanning,
+ u:vdc=gelijkspanning]
+
+\setuplabeltext
+ [\s!en]
+ [u:vac=alternating current,
+ u:vdc=direct current]
+
+\setuplabeltext
+ [\s!de]
+ [u:vac=Wechselspannung,
+ u:vdc=Gleichspannung]
+
+\setuplabeltext
+ [\s!hr]
+ [u:vac=izmjeni\ccaron ni napon,
+ u:vdc=istosmjerni napon]
+
+\setuplabeltext
+ [\s!it]
+ [u:vac=corrente alternata,
+ u:vdc=corrente continua]
+
+%D Network bandwidth is specified in Bits:
+
+\getvalue{\v!unit} [Bit] {bit} {\labeltext{u:bit}}
+\getvalue{\v!unit} [Baud] {Bd} {Baud (Bit/s)}
+
+%D Computer memory size is specified in Bytes:
+
+\getvalue{\v!unit} [Byte] {B} {\labeltext{u:byte}}
+\getvalue{\v!unit} [kByte] {\Kilo \Byte} {kilo Byte}
+\getvalue{\v!unit} [MByte] {\Mega \Byte} {mega Byte}
+\getvalue{\v!unit} [GByte] {\Giga \Byte} {giga Byte}
+\getvalue{\v!unit} [TByte] {\Tera \Byte} {tera Byte}
+
+\setuplabeltext
+ [\s!en]
+ [u:bit=Bit,
+ u:byte=Byte]
+
+\setuplabeltext
+ [\s!hr]
+ [u:bit=bit,
+ u:byte=bajt]
+
+%D Telecommunication call density is specified in Erlangs:
+
+\getvalue{\v!unit} [Erlang] {E} {Erlang}
+
+%D Some radiation related units:
+
+\getvalue{\v!unit} [Bequerel] {Bq} {Bequerel}
+\getvalue{\v!unit} [MBequerel] {\Mega \Bequerel} {Bequerel}
+\getvalue{\v!unit} [Sievert] {Sv} {Sievert}
+\getvalue{\v!unit} [mSievert] {\Milli \Sievert} {milli Sievert}
+
+%D Light:
+
+\getvalue{\v!unit} [Candela] {cd} {Candela}
+
+%D and some sound ones:
+
+\getvalue{\v!unit} [Bell] {B} {Bell}
+\getvalue{\v!unit} [dBell] {\Deci \Bell} {decibel}
+
+%D We also define some non||regular, sometimes even forbidden,
+%D units:
+
+\getvalue{\v!unit} [At] {at} {\labeltext{u:at}}
+\getvalue{\v!unit} [Atm] {atm} {\labeltext{u:atm}}
+\getvalue{\v!unit} [Bar] {bar} {bar (100 \Kilo \Pascal)}
+\getvalue{\v!unit} [EVolt] {eV} {electronvolt}
+\getvalue{\v!unit} [Foot] {ft} {\labeltext{u:ft}}
+\getvalue{\v!unit} [Inch] {inch} {\labeltext{u:inch}}
+\getvalue{\v!unit} [Cal] {cal} {\labeltext{u:cal}}
+\getvalue{\v!unit} [Force] {f} {\labeltext{u:f}}
+\getvalue{\v!unit} [kCal] {\Kilo \Cal} {\labeltext{u:kcal}}
+\getvalue{\v!unit} [Lux] {lux} {lux}
+
+
+\def\xPercent {\dimensionaddfix{\percent }}
+\def\xPromille{\dimensionaddfix{\promille}}
+
+\getvalue{\v!unit} [Percent] {\xPercent } {percent}
+\getvalue{\v!unit} [Permille] {\xPromille} {promille}
+\getvalue{\v!unit} [Promille] {\xPromille} {promille}
+
+%D Some more, thanks to Tobias:
+
+\getvalue{\v!unit} [Gray] {Gr} {Gray}
+\getvalue{\v!unit} [Weber] {Wb} {Weber}
+\getvalue{\v!unit} [Henry] {H} {Henry}
+\getvalue{\v!unit} [Sterant] {sr} {Sterant}
+\getvalue{\v!unit} [Angstrom] {\hbox{\Aring}} {\Aring ngstr\"om}
+\getvalue{\v!unit} [Gauss] {G} {Gauss}
+
+\setuplabeltext
+ [\s!nl]
+ [u:at=technische atmosfeer,
+ u:atm=fysische atmosfeer,
+ u:ft=voet,
+ u:cal=calorie,
+ u:f=kracht (force),
+ u:kcal=kilocalorie]
+
+\setuplabeltext
+ [\s!en]
+ [u:at=technical atmospheric pressure,
+ u:atm=physical atmospheric pressure,
+ u:ft=foot,
+ u:inch=inch,
+ u:cal=calory,
+ u:f=force,
+ u:kcal=kilocalory]
+
+\setuplabeltext
+ [\s!de]
+ [u:at=Technischer atmosph\"arischer Druck,
+ u:atm=physkalischer atmosph\"arischer Druck,
+ u:ft=Fu\SS,
+ u:cal=Kalorien,
+ u:f=Force,
+ u:kcal=Kilokalorien]
+
+\setuplabeltext
+ [\s!hr]
+ [u:at=tehni\ccaron ka atmosfera,
+ u:atm=standardna atmosfera,
+ u:ft=stopa,
+ u:inch=in\ccaron a,
+ u:cal=kalorija,
+ u:f=Force,
+ u:kcal=Kilokalorien]
+
+\setuplabeltext
+ [\s!it]
+ [u:at=pressione atmosferica tecnica,
+ u:atm=pressione atmosfera fisica,
+ u:ft=piede,
+ u:cal=caloria,
+ u:f=forza,
+ u:kcal=chilocaloria]
+
+%D Here are some old ones, still there for compatibility
+%D reasons. These will probably be obsolete in a few years.
+
+\def\MeterTwee {\Square \Meter}
+\def\mMeterTwee {\Square \Milli \Meter}
+\def\cMeterTwee {\Square \Centi \Meter}
+\def\dMeterTwee {\Square \Deci \Meter}
+\def\kMeterTwee {\Square \Kilo \Meter}
+
+\def\MeterDrie {\Cubic \Meter}
+\def\mMeterDrie {\Cubic \Milli \Meter}
+\def\cMeterDrie {\Kubic \Centi \Meter}
+\def\dMeterDrie {\Cubic \Deci \Meter}
+\def\kMeterDrie {\Cubic \Kilo \Meter}
+
+\def\LiterTwee {\Square \Liter}
+\def\SecTwee {\Square \Sec}
+\def\SecMinEen {\Inverse \Sec}
+
+%D To make ourselves happy, we define some dutch specific
+%D units:
+
+\startinterface dutch
+
+ \getvalue{\v!unit} [PaardenKracht] {pk} {paardenkracht}
+ \getvalue{\v!unit} [Duits] {D} {duits}
+ \getvalue{\v!unit} [Kwik] {Hg} {kwikkolom}
+ \getvalue{\v!unit} [Hectare] {ha} {hectare}
+ \getvalue{\v!unit} [kGramForce] {\Kilo \Gram \Force} {kilogramforce}
+ \getvalue{\v!unit} [kWattUur] {\Kilo \Watt \Uur} {kilowattuur}
+ \getvalue{\v!unit} [MeterKwik] {\Meter \Kwik} {meter kwikkolom}
+ \getvalue{\v!unit} [Waterkolom] {WK} {waterkolom}
+ \getvalue{\v!unit} [MeterWater] {\Meter \Waterkolom} {meter waterkolom}
+ \getvalue{\v!unit} [DrogeStof] {ds} {droge stof}
+ \getvalue{\v!unit} [Normaal] {N} {normaal}
+
+ \getvalue{\v!unit} [Ton] {t} {ton}
+ \getvalue{\v!unit} [kTon] {\Kilo \Ton} {kiloton}
+
+ \let \OmwPerSec \RevPerSec
+ \let \OmwPerMin \RevPerMin
+ \let \Graden \Deg
+ \let \PaardeKracht \PaardenKracht
+ \let \Atoom \Atom
+ \let \Heure \Hour
+ \let \Jaar \Year
+ \let \Maand \Month
+ \let \Dag \Day
+ \let \Uur \Hour
+
+\stopinterface
+
+%D Finally we define some equivalents. By using \type {\let}
+%D we can be sure that they don't end up double in the lists of
+%D units.
+
+\let \Second \Sec
+\let \Kubic \Cubic
+\let \IKubic \ICubic
+
+%D Option:
+
+% \def\Micro{\dimensionprefix{\iftextdimensions\mathematics\mu \else\mu \fi}}
+% \def\Times{\dimensionnopfix{\iftextdimensions\mathematics\cdot\else\cdot\fi}}
+
+\stopmodule
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/m-zint.mkiv b/Master/texmf-dist/tex/context/base/m-zint.mkiv
new file mode 100644
index 00000000000..3e6f7ab4366
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/m-zint.mkiv
@@ -0,0 +1,87 @@
+%D \module
+%D [ file=m-zint,
+%D version=2010.12.07,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Zint Barcode Generator,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%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 Using \type {zint} seems to be the easiest way to generate
+%D (PDF417) barcodes so therefore we now have this module. There
+%D are proper (also windows) binaries at:
+%D
+%D \starttyping
+%D http://www.zint.org.uk
+%D \stoptyping
+%D
+%D There is a bit more code than needed as we want to be able to
+%D feed names.
+
+\startluacode
+
+moduledata.zint = { }
+
+local format, lower, gsub = string.format, string.lower, string.gsub
+local patterns = lpeg.patterns
+
+local zint = "zint" -- '"c:/program files/zint/zint.exe"'
+
+local whitespace = patterns.whitespace
+local spaces = whitespace^0
+local key = (spaces / "") * patterns.digit^0 * (patterns.colon * spaces / "")
+local value = (whitespace / "" + (1 - key))^1
+local pattern = lpeg.Cf(lpeg.Ct("") * (lpeg.Cg((lpeg.Cs(key) / tonumber) * (lpeg.Cs(value) / lower)) + patterns.anything)^0,rawset)
+
+local reverse
+
+local function cleancode(code)
+ return lower(gsub(code," ",""))
+end
+
+local function numberofcode(code)
+ if not reverse then
+ local types = os.resultof(format("%s --types",zint)) or ""
+ local formats = lpeg.match(pattern,types)
+ reverse = table.swapped(formats) or { }
+ end
+ code = cleancode(code)
+ return reverse[code] or code
+end
+
+function moduledata.zint.generate(code,data,suffix,options)
+ if not data or data == "" then
+ data = "unset"
+ end
+ local code = cleancode(code)
+ local base = format("zint-%s-%s",code,md5.hex(data))
+ local name = file.addsuffix(base,suffix or "eps")
+ if not lfs.isfile(name) then
+ local temp = file.addsuffix(base,"tmp")
+ local code = numberofcode(code)
+ logs.simple("using 'zint' to generate '%s'",base)
+ io.savedata(temp,data)
+ os.execute(format('%s --barcode=%s --output="%s" --input="%s"',zint,code,name,temp,options or ""))
+ end
+ return name
+end
+
+\stopluacode
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+ \externalfigure[\cldcontext{moduledata.zint.generate("PDF417",[[Hans Hagen]])}]
+ \blank
+ \externalfigure[\cldcontext{moduledata.zint.generate("PDF417","Ton Otten")}]
+ \blank
+ \externalfigure[\cldcontext{moduledata.zint.generate("ISBN","9789490688011")}]
+
+\stoptext
+
+
diff --git a/Master/texmf-dist/tex/context/base/math-act.lua b/Master/texmf-dist/tex/context/base/math-act.lua
new file mode 100644
index 00000000000..03675933e8a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/math-act.lua
@@ -0,0 +1,142 @@
+if not modules then modules = { } end modules ['math-act'] = {
+ version = 1.001,
+ comment = "companion to math-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end)
+local report_math = logs.reporter("mathematics","initializing")
+
+local mathematics = mathematics
+
+local sequencers = utilities.sequencers
+local appendgroup = sequencers.appendgroup
+local appendaction = sequencers.appendaction
+local mathprocessor = nil
+
+local mathactions = sequencers.reset {
+ arguments = "target,original",
+}
+
+function fonts.constructors.assignmathparameters(original,target)
+ if mathactions.dirty then -- maybe use autocompile
+ mathprocessor = sequencers.compile(mathactions)
+ end
+ mathprocessor(original,target)
+end
+
+appendgroup(mathactions,"before") -- user
+appendgroup(mathactions,"system") -- private
+appendgroup(mathactions,"after" ) -- user
+
+function mathematics.initializeparameters(target,original)
+ local mathparameters = original.mathparameters
+ if mathparameters and next(mathparameters) then
+ target.mathparameters = mathematics.dimensions(mathparameters)
+ end
+end
+
+sequencers.appendaction(mathactions,"system","mathematics.initializeparameters")
+
+local how = {
+ -- RadicalKernBeforeDegree = "horizontal",
+ -- RadicalKernAfterDegree = "horizontal",
+ RadicalDegreeBottomRaisePercent = "unscaled"
+}
+
+function mathematics.scaleparameters(target,original)
+ if not target.properties.math_is_scaled then
+ local mathparameters = target.mathparameters
+ if mathparameters and next(mathparameters) then
+ local parameters = target.parameters
+ local factor = parameters.factor
+ local hfactor = parameters.hfactor
+ local vfactor = parameters.vfactor
+ for name, value in next, mathparameters do
+ local h = how[name]
+ if h == "unscaled" then
+ mathparameters[name] = value
+ elseif h == "horizontal" then
+ mathparameters[name] = value * hfactor
+ elseif h == "vertical"then
+ mathparameters[name] = value * vfactor
+ else
+ mathparameters[name] = value * factor
+ end
+ end
+ end
+ target.properties.math_is_scaled = true
+ end
+end
+
+sequencers.appendaction(mathactions,"system","mathematics.scaleparameters")
+
+function mathematics.checkaccentbaseheight(target,original)
+ local mathparameters = target.mathparameters
+ if mathparameters then
+ mathparameters.AccentBaseHeight = nil -- safeguard
+ end
+end
+
+sequencers.appendaction(mathactions,"system","mathematics.checkaccentbaseheight")
+
+function mathematics.checkprivateparameters(target,original)
+ local mathparameters = target.mathparameters
+ if mathparameters then
+ if not mathparameters.FractionDelimiterSize then
+ mathparameters.FractionDelimiterSize = 0
+ end
+ if not mathparameters.FractionDelimiterDisplayStyleSize then
+ mathparameters.FractionDelimiterDisplayStyleSize = 0
+ end
+ end
+end
+
+sequencers.appendaction(mathactions,"system","mathematics.checkprivateparameters")
+
+function mathematics.overloadparameters(target,original)
+ local mathparameters = target.mathparameters
+ if mathparameters and next(mathparameters) then
+ local goodies = target.goodies
+ if goodies then
+ for i=1,#goodies do
+ local goodie = goodies[i]
+ local mathematics = goodie.mathematics
+ local parameters = mathematics and mathematics.parameters
+ if parameters then
+ if trace_defining then
+ report_math("overloading math parameters in '%s' @ %s",target.properties.fullname,target.parameters.size)
+ end
+ for name, value in next, parameters do
+ local tvalue = type(value)
+ if tvalue == "string" then
+ report_math("comment for math parameter '%s': %s",name,value)
+ else
+ local oldvalue = mathparameters[name]
+ local newvalue = oldvalue
+ if oldvalue then
+ if tvalue == "number" then
+ newvalue = value
+ elseif tvalue == "function" then
+ newvalue = value(oldvalue,target,original)
+ elseif not tvalue then
+ newvalue = nil
+ end
+ if trace_defining and oldvalue ~= newvalue then
+ report_math("overloading math parameter '%s': %s => %s",name,tostring(oldvalue),tostring(newvalue))
+ end
+ else
+ report_math("invalid math parameter '%s'",name)
+ end
+ mathparameters[name] = newvalue
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+sequencers.appendaction(mathactions,"system","mathematics.overloadparameters")
diff --git a/Master/texmf-dist/tex/context/base/math-ali.mkiv b/Master/texmf-dist/tex/context/base/math-ali.mkiv
index 31f71219a44..f83619a2271 100644
--- a/Master/texmf-dist/tex/context/base/math-ali.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-ali.mkiv
@@ -53,7 +53,7 @@
\def\textineqalign#1{$\forgetalign#1$}
\def\eqalign#1% why no halign here, probably because of displaywidth
- {\null\,\vcenter
+ {\emptyhbox\,\vcenter
{\openup.25\bodyfontsize% was: \openup\jot
\mathsurround\zeropoint
\ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##{}}$\hfil\crcr#1\crcr}%
@@ -61,7 +61,7 @@
% preamble is scanned for tabskips so we need the span to prevent an error message
-\chardef\eqalignmode\plusone
+\setnewconstant\eqalignmode\plusone
\def\preparereqalignno
{\!!toksa{\strut\firstineqalign\hfil\leftofeqalign\span\mathineqalign{##}\rightofeqalign\tabskip\zeropoint}%
@@ -73,7 +73,7 @@
\else
\!!toksc{\hfil\tabskip\centering&\llap{\span\textineqalign{##}}\tabskip\zeropoint}%
\fi\fi
- \global\chardef\mathnumberstatus\zerocount
+ \global\mathnumberstatus\zerocount
\buildeqalign
\presetdisplaymath
\tabskip\centering}
@@ -89,7 +89,7 @@
\else
\!!toksc{\hfil\tabskip\centering&\kern-\displaywidth\rlap{\span\textineqalign{##}}\tabskip\displaywidth}%
\fi\fi
- \global\chardef\mathnumberstatus\zerocount
+ \global\mathnumberstatus\zerocount
\buildeqalign
\presetdisplaymath
\tabskip\centering}
@@ -109,7 +109,7 @@
\def\dobothaligneqalignno#1%
{\ifmmode
\displ@y
- \global\chardef\mathnumberstatus\plusone
+ \global\mathnumberstatus\plusone
\ifcase\mathraggedstatus
\def\finishalignno{\crcr\egroup}%
\else
@@ -127,12 +127,12 @@
\xdef\mathnumbercorrection{\the\wd\scratchbox}%
\fi
\box\scratchbox
- \global\chardef\mathnumberstatus\plustwo}
+ \global\mathnumberstatus\plustwo}
% \def\dobothaligneqalignno#1%
% {\ifmmode
% \displ@y
-% \global\chardef\mathnumberstatus\plusone
+% \global\mathnumberstatus\plusone
% we're in a mathbox
% \vcenter\bgroup
% \def\finishalignno{\crcr\egroup\egroup}%
@@ -193,8 +193,8 @@
\def\rightofeqalign{\getvalue{\??eq:\v!right:\number\eqaligncolumn}}
\def\doseteqaligncolumn#1%
- {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\empty
- \letvalue{\??eq:\v!right:\number\eqaligncolumn}\empty
+ {\letvalueempty{\??eq:\v!left :\number\eqaligncolumn}%
+ \letvalueempty{\??eq:\v!right:\number\eqaligncolumn}%
\doif{#1}\v!left {\letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfill}%
\doif{#1}\v!right {\letvalue{\??eq:\v!left :\number\eqaligncolumn}\hfill}%
\doif{#1}\v!middle{\letvalue{\??eq:\v!right:\number\eqaligncolumn}\hfill
@@ -611,7 +611,7 @@
\def\dodefinemathmatrix[#1]% [#2]%
{\setuvalue{\e!start#1}{\dodoubleempty\dostartmathmatrix[#1]}%
- \setuvalue{\e!stop #1}{\dostopmathmatrix}%
+ \setvalue {\e!stop #1}{\dostopmathmatrix}% no u else lookahead problem
\setupmathmatrix[#1]}% [#2]
\definemathmatrix[matrix]
@@ -696,7 +696,7 @@
{\begingroup
\edef\currentmathmatrix{#1}%
\doifassignmentelse{#2}{\setupmathmatrix[#1][#2]}\donothing
- \null
+ \emptyhbox
\executeifdefined{\??mx:\mathmatrixparameter\c!location}{\getvalue{\??mx:\v!lohi}}%
\mathmatrixleft
\mathmatrixbox\bgroup
@@ -857,8 +857,13 @@
%D Preliminary feature:
%D
%D {\em example code}
+%D
+%D The intertext commands have to be expandable (in aligment lookahead) so
+%D we cannot use \type {\unexpanded}.
+
+\let\stopintertext\relax
-\unexpanded\def\startintertext#1\stopintertext
+\def\startintertext#1\stopintertext
{\noalign{\dointertext{#1}}}
\def\intertext#1%
@@ -890,7 +895,7 @@
% \unexpanded\def\startsubstack
% {\begingroup
-% \null
+% \emptyhbox
% \vcenter\bgroup
% \pushmacro\domatrixNC
% \let\stopmathmode\relax
@@ -1038,11 +1043,11 @@
\unexpanded\def\overset#1#2%
{\preparebinrel{#2}%
- \currentbinrel{\mathop{\kern\zeropoint#2}\limits^{#1}}}
+ \currentbinrel{\mathop{\kern\zeropoint#2}\limits\normalsuperscript{#1}}}
\unexpanded\def\underset#1#2%
{\preparebinrel{#2}%
- \currentbinrel{\mathop{\kern\zeropoint#2}\limits_{#1}}}
+ \currentbinrel{\mathop{\kern\zeropoint#2}\limits\normalsubscript{#1}}}
%D The following code comes from \type {math-str.mkiv}.
@@ -1069,14 +1074,15 @@
\def\mathhbox
{\iftracemath\ruledhbox\else\hbox\fi}
-\chardef\mathraggedstatus=0 % normal left center right
-\chardef\mathnumberstatus=0 % nothing normal shift_right
+\newconstant\mathraggedstatus % normal left center right
+\newconstant\mathnumberstatus % nothing normal shift_right
+
\let\mathnumbercorrection\!!zeropoint
\unexpanded\def\startmathbox#1%
{\hsize\displaywidth
- \global\chardef\mathnumberstatus\plusone
- \chardef\mathraggedstatus#1\relax
+ \global\mathnumberstatus\plusone
+ \mathraggedstatus#1\relax
\let\mathnumbercorrection\!!zeropoint
\global\let\@eqno \empty \def\eqno {\gdef\@eqno }%
\global\let\@leqno\empty \def\leqno{\gdef\@leqno}%
diff --git a/Master/texmf-dist/tex/context/base/math-arr.mkiv b/Master/texmf-dist/tex/context/base/math-arr.mkiv
index 389112b1694..31f8a66eba5 100644
--- a/Master/texmf-dist/tex/context/base/math-arr.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-arr.mkiv
@@ -52,15 +52,15 @@
\endgroup}
\def\mthfrac#1#2#3#4#5{\mathchoice
- {\domthfrac\displaystyle \textface {#1}{#2}{#3}{#4}{#5}}
- {\domthfrac\textstyle \textface {#1}{#2}{#3}{#4}{#5}}
- {\domthfrac\scriptstyle \scriptface {#1}{#2}{#3}{#4}{#5}}
+ {\domthfrac\displaystyle \textface {#1}{#2}{#3}{#4}{#5}}%
+ {\domthfrac\textstyle \textface {#1}{#2}{#3}{#4}{#5}}%
+ {\domthfrac\scriptstyle \scriptface {#1}{#2}{#3}{#4}{#5}}%
{\domthfrac\scriptscriptstyle\scriptscriptface{#1}{#2}{#3}{#4}{#5}}}
\def\mthsqrt#1#2#3{\mathchoice
- {\domthsqrt\displaystyle \textface {#1}{#2}{#3}}
- {\domthsqrt\textstyle \textface {#1}{#2}{#3}}
- {\domthsqrt\scriptstyle \textface {#1}{#2}{#3}}
+ {\domthsqrt\displaystyle \textface {#1}{#2}{#3}}%
+ {\domthsqrt\textstyle \textface {#1}{#2}{#3}}%
+ {\domthsqrt\scriptstyle \textface {#1}{#2}{#3}}%
{\domthsqrt\scriptscriptstyle\textface {#1}{#2}{#3}}}
% temp here
@@ -114,7 +114,7 @@
$}%
\ifdim\wd2>\dimen0 \dimen0\wd2 \fi
\setbox4\hbox to \dimen0{#3\displaystyle}%
- \mathrel{\mathop{\hbox to \dimen0{\hss\copy4\hss}}\limits^{\box0}_{\box2}}
+ \mathrel{\mathop{\hbox to \dimen0{\hss\copy4\hss}}\limits\normalsuperscript{\box0}\normalsubscript{\box2}}%
\endgroup}
\let\domthxarrsingle\domthxarr
diff --git a/Master/texmf-dist/tex/context/base/math-def.mkiv b/Master/texmf-dist/tex/context/base/math-def.mkiv
index 50c9902dde8..a7e0df94030 100644
--- a/Master/texmf-dist/tex/context/base/math-def.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-def.mkiv
@@ -15,16 +15,14 @@
\unprotect
-\ifx\mrfam\undefined \chardef\mrfam\plusone \fi
+% this will be done at the lua end
\startluacode
mathematics.define()
- mathematics.register_xml_entities()
+ mathematics.xml.registerentities()
\stopluacode
-% special .. todo
-
-\mathcode`\ ="8000 \mathcode`\_="8000 \mathcode`\'="8000
+\activatemathcharacters
% will be attributes
@@ -108,10 +106,12 @@
% using attributes
-\chardef\bigmathdelimitermethod\plusone
+\setnewconstant\bigmathdelimitermethod\plusone
\def\plainbigdelimiters % traditional method
- {\chardef\bigmathdelimitermethod\plustwo}
+ {\bigmathdelimitermethod\plustwo}
+
+\plainbigdelimiters % is default for the moment but not so nice
\def\doplainbigmath#1#2%
{{\hbox{$%
@@ -234,7 +234,7 @@
\def\rootwithoutdegree {\rootradical {}}
\def\PLAINmatrix#1%
- {\null\,\vcenter{\normalbaselines\mathsurround\zeropoint
+ {\emptyhbox\,\vcenter{\normalbaselines\mathsurround\zeropoint
\ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
\mathstrut\crcr\noalign{\kern-\baselineskip}
#1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
diff --git a/Master/texmf-dist/tex/context/base/math-dim.lua b/Master/texmf-dist/tex/context/base/math-dim.lua
index 62d805126f8..7b4b49f6860 100644
--- a/Master/texmf-dist/tex/context/base/math-dim.lua
+++ b/Master/texmf-dist/tex/context/base/math-dim.lua
@@ -6,12 +6,20 @@ if not modules then modules = { } end modules ['math-dim'] = {
license = "see context related readme files"
}
--- Beware: only Taco really understands in depth what these dimensions do so
--- if you run into problems ...
+-- Beware: only Taco and Ulrik really understands in depth what these dimensions
+-- do so if you run into problems ask on the context list.
-local abs, next = math.abs, next
+-- The radical_rule value is also used as a trigger. In luatex the accent
+-- placement happens either the opentype way (using top_accent cum suis) or the
+-- traditional way. In order to determine what method to use the \Umathradicalrule
+-- setting is consulted to determine what method to use. This is more efficient
+-- than analyzing the (potentially spread over multiple families) situation. For
+-- this reason we need to set the radical_rule here. It used to be "<unset>" in
+-- which case the engine takes the rulethickness. In c-speak:
+--
+-- int compat_mode = (radical_rule(cur_style) == undefined_math_parameter) ;
-mathematics = mathematics or { }
+local abs, next = math.abs, next
local defaults = {
['axis']={
@@ -87,7 +95,8 @@ local defaults = {
['default']={ "RadicalExtraAscender", "default_rule_thickness" },
},
['radical_rule']={
- ['default']={ "RadicalRuleThickness", "<not set>" },
+ ['default']={ "RadicalRuleThickness", "default_rule_thickness" },
+ -- ['default']={ "surd_height(f)", "default_rule_thickness" },
},
['radical_vgap']={
['default']={ "RadicalVerticalGap", "default_rule_thickness+(abs(default_rule_thickness)/4)" },
@@ -207,10 +216,10 @@ end
-- return t.default or t.text_style or 0
-- end
-function mathematics.dimensions(dimens)
+function mathematics.dimensions(dimens) -- beware, dimens get spoiled
if dimens.SpaceAfterScript then
dimens.SubscriptShiftDownWithSuperscript = dimens.SubscriptShiftDown * 1.5
- return { }, table.fastcopy(dimens)
+ return table.fastcopy(dimens), { }
elseif dimens.AxisHeight or dimens.axis_height then
local t = { }
local math_x_height = dimens.x_height or 10*65526
@@ -249,10 +258,12 @@ function mathematics.dimensions(dimens)
end
t[variable] = tt
end
---~ logs.report("warning", "version 0.47 is needed for proper delimited math")
local d = {
- AxisHeight = t . axis . text_style,
AccentBaseHeight = t . accent_base_height . text_style,
+ AxisHeight = t . axis . text_style,
+ -- DelimitedSubFormulaMinHeight
+ -- DisplayOperatorMinHeight
+ -- FlattenedAccentBaseHeight
FractionDenominatorDisplayStyleGapMin = t . fraction_denom_vgap . display_style,
FractionDenominatorDisplayStyleShiftDown = t . fraction_denom_down . display_style,
FractionDenominatorGapMin = t . fraction_denom_vgap . text_style,
@@ -266,6 +277,8 @@ function mathematics.dimensions(dimens)
FractionDelimiterDisplayStyleSize = t . fraction_del_size . display_style,
LowerLimitBaselineDropMin = t . limit_below_bgap . text_style,
LowerLimitGapMin = t . limit_below_vgap . text_style,
+ -- MathLeading
+ MinConnectorOverlap = t . connector_overlap_min . text_style,
OverbarExtraAscender = t . overbar_kern . text_style,
OverbarRuleThickness = t . overbar_rule . text_style,
OverbarVerticalGap = t . overbar_vgap . text_style,
@@ -276,6 +289,10 @@ function mathematics.dimensions(dimens)
RadicalKernBeforeDegree = t . radical_degree_before . display_style,
RadicalKernAfterDegree = t . radical_degree_after . display_style,
RadicalDegreeBottomRaisePercent = t . radical_degree_raise . display_style,
+ -- ScriptPercentScaleDown
+ -- ScriptScriptPercentScaleDown
+ -- SkewedFractionHorizontalGap
+ -- SkewedFractionVerticalGap
SpaceAfterScript = t . space_after_script . text_style,
StackBottomDisplayStyleShiftDown = t . stack_denom_down . display_style,
StackBottomShiftDown = t . stack_denom_down . text_style,
@@ -283,11 +300,15 @@ function mathematics.dimensions(dimens)
StackGapMin = t . stack_vgap . text_style,
StackTopDisplayStyleShiftUp = t . stack_num_up . display_style,
StackTopShiftUp = t . stack_num_up . text_style,
+ StretchStackGapBelowMin = t . over_delimiter_vgap . text_style,
+ StretchStackTopShiftUp = t . over_delimiter_bgap . text_style,
+ StretchStackGapAboveMin = t . under_delimiter_vgap . text_style,
+ StretchStackBottomShiftDown = t . under_delimiter_bgap . text_style,
+ SubSuperscriptGapMin = t . subsup_vgap . text_style,
SubscriptBaselineDropMin = t . sub_shift_drop . text_style,
SubscriptShiftDown = t . sub_shift_down . text_style,
SubscriptShiftDownWithSuperscript = t . sub_sup_shift_down . text_style,
SubscriptTopMax = t . sub_top_max . text_style,
- SubSuperscriptGapMin = t . subsup_vgap . text_style,
SuperscriptBaselineDropMax = t . sup_shift_drop . text_style,
SuperscriptBottomMaxWithSubscript = t . sup_sub_bottom_max . text_style,
SuperscriptBottomMin = t . sup_bottom_min . text_style,
@@ -298,14 +319,9 @@ function mathematics.dimensions(dimens)
UnderbarVerticalGap = t . underbar_vgap . text_style,
UpperLimitBaselineRiseMin = t . limit_above_bgap . text_style,
UpperLimitGapMin = t . limit_above_vgap . text_style,
- MinConnectorOverlap = t . connector_overlap_min . text_style,
- StretchStackGapBelowMin = t . over_delimiter_vgap . text_style,
- StretchStackTopShiftUp = t . over_delimiter_bgap . text_style,
- StretchStackGapAboveMin = t . under_delimiter_vgap . text_style,
- StretchStackBottomShiftDown = t . under_delimiter_bgap . text_style,
}
- d.AccentBaseHeight = 0
- return t, d -- this might change
+ d.AccentBaseHeight = 0 -- here? still?
+ return d, t -- t only for diagnostics
else
return { }, { }
end
diff --git a/Master/texmf-dist/tex/context/base/math-ent.lua b/Master/texmf-dist/tex/context/base/math-ent.lua
index e5e5b98f004..0eaa02939fe 100644
--- a/Master/texmf-dist/tex/context/base/math-ent.lua
+++ b/Master/texmf-dist/tex/context/base/math-ent.lua
@@ -5,7 +5,9 @@ if not modules then modules = { } end modules ['math-ent'] = {
copyright = "derived from the mathml 2.0 specification",
}
-mathematics.entities={
+-- this might go into char-def
+
+mathematics.xml.entities = utilities.storage.allocate {
["Aacute"]=0x000C1,
["aacute"]=0x000E1,
["Abreve"]=0x00102,
@@ -2098,5 +2100,4 @@ mathematics.entities={
["plusminus"]=0x000B1,
["minusplus"]=0x02213,
["cdots"]=0x2026,
-
}
diff --git a/Master/texmf-dist/tex/context/base/math-ext.lua b/Master/texmf-dist/tex/context/base/math-ext.lua
index 673103677e0..da00c7a9ea8 100644
--- a/Master/texmf-dist/tex/context/base/math-ext.lua
+++ b/Master/texmf-dist/tex/context/base/math-ext.lua
@@ -8,72 +8,73 @@ if not modules then modules = { } end modules ['math-ext'] = {
local trace_virtual = false trackers.register("math.virtual", function(v) trace_virtual = v end)
-mathematics = mathematics or { }
-characters = characters or { }
+local mathematics = mathematics
+local characters = characters
+
+local report_math = logs.reporter("mathematics")
mathematics.extras = mathematics.extras or { }
-characters.math = characters.math or { }
+local extras = mathematics.extras
-local chardata = characters.data
-local mathdata = characters.math
+characters.math = characters.math or { }
+local mathdata = characters.math
+local chardata = characters.data
-function mathematics.extras.add(unicode,t)
+function extras.add(unicode,t)
local min, max = mathematics.extrabase, mathematics.privatebase - 1
if unicode >= min and unicode <= max then
mathdata[unicode], chardata[unicode] = t, t
else
- logs.report("math extra","extra U+%04X should be in range U+%04X - U+%04X",unicode,min,max)
+ report_math("extra U+%05X should be in range U+%05X - U+%05X",unicode,min,max)
end
end
-function mathematics.extras.copy(tfmdata)
- local math_parameters = tfmdata.math_parameters
- local MathConstants = tfmdata.MathConstants
- if (math_parameters and next(math_parameters)) or (MathConstants and next(MathConstants)) then
- local characters = tfmdata.characters
- for unicode, extradesc in next, mathdata do
- -- always, because in an intermediate step we can have a non math font
- local extrachar = characters[unicode]
- local nextinsize = extradesc.nextinsize
- if nextinsize then
- for i=1,#nextinsize do
- local nextslot = nextinsize[i]
- local nextbase = characters[nextslot]
- if nextbase then
- local nextnext = nextbase and nextbase.next
- if nextnext then
- local nextchar = characters[nextnext]
- if nextchar then
- if trace_virtual then
- logs.report("math extra","extra U+%04X in %s at %s maps on U+%04X (class: %s, name: %s)",unicode,file.basename(tfmdata.fullname),tfmdata.size,nextslot,extradesc.mathclass or "?",extradesc.mathname or "?")
- end
- characters[unicode] = nextchar
- break
+function extras.copy(target,original)
+ local characters = target.characters
+ local properties = target.properties
+ local parameters = target.parameters
+ for unicode, extradesc in next, mathdata do
+ -- always, because in an intermediate step we can have a non math font
+ local extrachar = characters[unicode]
+ local nextinsize = extradesc.nextinsize
+ if nextinsize then
+ for i=1,#nextinsize do
+ local nextslot = nextinsize[i]
+ local nextbase = characters[nextslot]
+ if nextbase then
+ local nextnext = nextbase and nextbase.next
+ if nextnext then
+ local nextchar = characters[nextnext]
+ if nextchar then
+ if trace_virtual then
+ report_math("extra U+%05X in %s at %s maps on U+%05X (class: %s, name: %s)",unicode,
+ file.basename(properties.fullname),parameters.size,nextslot,extradesc.mathclass or "?",extradesc.mathname or "?")
end
- end
- end
- end
- if not characters[unicode] then
- for i=1,#nextinsize do
- local nextbase = characters[nextinsize[i]]
- if nextbase then
characters[unicode] = nextchar
break
end
end
end
end
+ if not characters[unicode] then -- can be set in previous loop
+ for i=1,#nextinsize do
+ local nextslot = nextinsize[i]
+ local nextbase = characters[nextslot]
+ if nextbase then
+ characters[unicode] = nextbase -- still ok?
+ break
+ end
+ end
+ end
end
- else
- -- let's not waste time on non-math
end
end
-table.insert(fonts.tfm.mathactions,mathematics.extras.copy)
+utilities.sequencers.appendaction(mathactions,"system","mathematics.extras.copy")
-- 0xFE302 -- 0xFE320 for accents
-mathematics.extras.add(0xFE302, {
+extras.add(0xFE302, {
category="mn",
description="WIDE MATHEMATICAL HAT",
direction="nsm",
@@ -85,7 +86,7 @@ mathematics.extras.add(0xFE302, {
nextinsize={ 0x00302, 0x0005E },
} )
-mathematics.extras.add(0xFE303, {
+extras.add(0xFE303, {
category="mn",
cjkwd="a",
description="WIDE MATHEMATICAL TILDE",
@@ -100,7 +101,7 @@ mathematics.extras.add(0xFE303, {
-- 0xFE321 -- 0xFE340 for missing characters
-mathematics.extras.add(0xFE321, {
+extras.add(0xFE321, {
category="sm",
description="MATHEMATICAL SHORT BAR",
-- direction="on",
@@ -110,7 +111,7 @@ mathematics.extras.add(0xFE321, {
unicodeslot=0xFE321,
} )
-mathematics.extras.add(0xFE322, {
+extras.add(0xFE322, {
category="sm",
description="MATHEMATICAL LEFT HOOK",
mathclass="relation",
@@ -118,7 +119,7 @@ mathematics.extras.add(0xFE322, {
unicodeslot=0xFE322,
} )
-mathematics.extras.add(0xFE323, {
+extras.add(0xFE323, {
category="sm",
description="MATHEMATICAL RIGHT HOOK",
mathclass="relation",
@@ -126,7 +127,17 @@ mathematics.extras.add(0xFE323, {
unicodeslot=0xFE323,
} )
---~ mathematics.extras.add(0xFE304, {
+extras.add(0xFE324, {
+ category="sm",
+ description="MATHEMATICAL SHORT BAR MIRRORED",
+-- direction="on",
+-- linebreak="nu",
+ mathclass="relation",
+ mathname="mapsfromchar",
+ unicodeslot=0xFE324,
+} )
+
+--~ extras.add(0xFE304, {
--~ category="sm",
--~ description="TOP AND BOTTOM PARENTHESES",
--~ direction="on",
@@ -137,7 +148,7 @@ mathematics.extras.add(0xFE323, {
--~ accents={ 0x023DC, 0x023DD },
--~ } )
---~ mathematics.extras.add(0xFE305, {
+--~ extras.add(0xFE305, {
--~ category="sm",
--~ description="TOP AND BOTTOM BRACES",
--~ direction="on",
diff --git a/Master/texmf-dist/tex/context/base/math-frc.mkii b/Master/texmf-dist/tex/context/base/math-frc.mkii
index fa319bc4ad4..767c5ec5cea 100644
--- a/Master/texmf-dist/tex/context/base/math-frc.mkii
+++ b/Master/texmf-dist/tex/context/base/math-frc.mkii
@@ -15,7 +15,8 @@
\unprotect
-\def\exmthfont#1{\symbolicsizedfont#1\plusone{MathExtension}}
+\unexpanded\def\exmthfont#1%
+ {\symbolicsizedfont#1\plusone{MathExtension}}
\def\domthfrac#1#2#3#4#5#6#7%
{\begingroup
@@ -49,18 +50,204 @@
\rlap{\raise\dimexpr\ht2-\ht4\relax\copy4}\copy0}}}%
\endgroup}
-\def\mthfrac#1#2#3#4#5{\mathchoice
+\unexpanded\def\mthfrac#1#2#3#4#5{\mathchoice
{\domthfrac\displaystyle \textface {#1}{#2}{#3}{#4}{#5}}
{\domthfrac\textstyle \textface {#1}{#2}{#3}{#4}{#5}}
{\domthfrac\scriptstyle \scriptface {#1}{#2}{#3}{#4}{#5}}
{\domthfrac\scriptscriptstyle\scriptscriptface{#1}{#2}{#3}{#4}{#5}}}
-\def\mthsqrt#1#2#3{\mathchoice
+\unexpanded\def\mthsqrt#1#2#3{\mathchoice
{\domthsqrt\displaystyle \textface {#1}{#2}{#3}}
{\domthsqrt\textstyle \textface {#1}{#2}{#3}}
{\domthsqrt\scriptstyle \textface {#1}{#2}{#3}}
{\domthsqrt\scriptscriptstyle\textface {#1}{#2}{#3}}}
-% temp here
+%D Moved from math-new.tex (not that new anyway:
+
+%D \macros
+%D {genfrac}
+%D
+%D [TH] The definition of \type {\genfrac} \& co. is not
+%D trivial, because it allows some flexibility. This is
+%D supposed to be a user||level command, but will fail quite
+%D desparately if called outside math mode (\CONTEXT\ redefines
+%D \type {\over})
+%D
+%D [HH] We clean up this macro a bit and (try) to make it
+%D understandable. The expansion is needed for generating
+%D the second argument to \type {\dogenfrac}, which is to
+%D be a control sequence like \type {\over}.
+
+\unexpanded\def\genfrac#1#2#3#4%
+ {\edef\!!stringa
+ {#1#2}%
+ \expanded
+ {\dogenfrac{#4}%
+ \csname
+ \ifx @#3@%
+ \ifx\!!stringa\empty
+ \strippedcsname\normalover
+ \else
+ \strippedcsname\normaloverwithdelims
+ \fi
+ \else
+ \ifx\!!stringa\empty
+ \strippedcsname\normalabove
+ \else
+ \strippedcsname\normalabovewithdelims
+ \fi
+ \fi
+ \endcsname}%
+ {#1#2#3}}
+
+\def\dogenfrac#1#2#3#4#5%
+ {{#1{\begingroup#4\endgroup#2#3\relax#5}}}
+
+%D \macros
+%D {dfrac, tfrac, frac, dbinom, tbinom, binom}
+%D
+%D \startbuffer
+%D $\dfrac {1}{2} \tfrac {1}{2} \frac {1}{2}$
+%D $\dbinom{1}{2} \tbinom{1}{2} \binom{1}{2}$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+
+\unexpanded\def\dfrac {\genfrac\empty\empty{}\displaystyle}
+\unexpanded\def\tfrac {\genfrac\empty\empty{}\textstyle}
+\unexpanded\def\frac {\genfrac\empty\empty{}\donothing}
+
+\unexpanded\def\dbinom{\genfrac()\zeropoint\displaystyle}
+\unexpanded\def\tbinom{\genfrac()\zeropoint\textstyle}
+\unexpanded\def\binom {\genfrac()\zeropoint\donothing}
+
+\unexpanded\def\xfrac {\genfrac\empty\empty{}\scriptstyle}
+\unexpanded\def\xxfrac{\genfrac\empty\empty{}\scriptscriptstyle}
+
+\unexpanded\def\frac#1#2{\mathematics{\genfrac\empty\empty{}\donothing{#1}{#2}}}
+
+%D \macros
+%D {cfrac}
+%D
+%D \startbuffer
+%D $\cfrac{12}{3} \cfrac[l]{12}{3} \cfrac[c]{12}{3} \cfrac[r]{12}{3}$
+%D $\cfrac{1}{23} \cfrac[l]{1}{23} \cfrac[c]{1}{23} \cfrac[r]{1}{23}$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D Now we can align every combination we want:
+%D
+%D \startbuffer
+%D $\cfrac{12}{3} \cfrac[l]{12}{3} \cfrac[c]{12}{3} \cfrac[r]{12}{3}$
+%D $\cfrac{1}{23} \cfrac[l]{1}{23} \cfrac[c]{1}{23} \cfrac[r]{1}{23}$
+%D $\cfrac[cl]{12}{3} \cfrac[cc]{12}{3} \cfrac[cr]{12}{3}$
+%D $\cfrac[lc]{1}{23} \cfrac[cc]{1}{23} \cfrac[rc]{1}{23}$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+
+\definecomplexorsimple\cfrac
+
+\def\simplecfrac {\docfrac[cc]}
+\def\complexcfrac[#1]{\docfrac[#1cc]}
+
+\def\docfrac[#1#2#3]#4#5%
+ {{\displaystyle
+ \frac
+ {\strut
+ \ifx r#1\hfill\fi#4\ifx l#1\hfill\fi}%
+ {\ifx r#2\hfill\fi#5\ifx l#2\hfill\fi}%
+ \kern-\nulldelimiterspace}}
+
+%D \macros
+%D {splitfrac, splitdfrac}
+%D
+%D Occasionally one needs to typeset multi||line fractions.
+%D These commands use \tex{genfrac} to create such fractions.
+%D
+%D \startbuffer
+%D \startformula
+%D a=\frac{
+%D \splitfrac{xy + xy + xy + xy + xy}
+%D {+ xy + xy + xy + xy}
+%D }
+%D {z}
+%D =\frac{
+%D \splitdfrac{xy + xy + xy + xy + xy}
+%D {+ xy + xy + xy + xy}
+%D }
+%D {z}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D These macros are based on Michael J.~Downes posting on
+%D comp.text.tex on 2001/12/06
+
+\unexpanded\def\splitfrac#1#2%
+ {\genfrac\empty\empty\zeropoint\textstyle%
+ {\textstyle#1\quad\hfill}%
+ {\textstyle\hfill\quad\mathstrut#2}}
+
+\unexpanded\def\splitdfrac#1#2%
+ {\genfrac\empty\empty\zeropoint\displaystyle%
+ {#1\quad\hfill}
+ {\hfill\quad\mathstrut #2}}
+
+%D For thee moment here, but it might move:
+
+%D \macros
+%D {qedsymbol}
+%D
+%D [HH] The general Quod Erat Domonstrandum symbol is defined
+%D in such a way that we can configure it. Because this symbol
+%D is also used in text mode, we make it a normal text symbol
+%D with special behavior.
+
+\unexpanded\def\qedsymbol#1%
+ {\ifhmode
+ \unskip~\hfill#1\par
+ \else\ifmmode
+ \eqno#1\relax % Do we really need the \eqno here?
+ \else
+ \leavevmode\hbox{}\hfill#1\par
+ \fi\fi}
+
+\definesymbol [qed] [\qedsymbol{\mathematics{\square}}]
+
+%D \macros
+%D {QED}
+%D
+%D [HH] For compatbility reasons we also provide the \type
+%D {\QED} command. In case this command is overloaded, we still
+%D have the symbol available. \symbol[qed]
+
+\unexpanded\def\QED{\symbol[qed]}
+
+%D \macros
+%D {mathhexbox}
+%D
+%D [TH] \type {\mathhexbox} is also user||level (already
+%D defined in Plain \TEX). It allows to get a math character
+%D inserted as if it was a text character.
+
+\unexpanded\def\mathhexbox#1#2#3%
+ {\mathtext{$\mathsurround\zeropoint\mathchar"#1#2#3$}}
+
+%D \macros
+%D {boxed}
+%D
+%D [HH] Another macro that users expect (slightly adapted):
+
+\unexpanded\def\boxed
+ {\ifmmode\expandafter\mframed\else\expandafter\framed\fi}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/math-frc.mkiv b/Master/texmf-dist/tex/context/base/math-frc.mkiv
index 2305cec3095..f6331126f51 100644
--- a/Master/texmf-dist/tex/context/base/math-frc.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-frc.mkiv
@@ -71,14 +71,16 @@
\def\dofrac#1#2#3{\relax\mathematics{\Ustack{{#1{#2}}\normalover{#1{#3}}}}}
\def\nofrac #1#2{\relax\mathematics{\Ustack{{#1}\normalover{#2}}}}
-% \chardef\mathfracmode=0 $\frac{1}{2}$
-% \chardef\mathfracmode=1 $\frac{1}{2}$
-% \chardef\mathfracmode=2 $\frac{1}{2}$
-% \chardef\mathfracmode=3 $\frac{1}{2}$
-% \chardef\mathfracmode=4 $\frac{1}{2}$
-% \chardef\mathfracmode=5 $\frac{1}{2}$
+% $\mathfracmode0 \frac{1}{2}$
+% $\mathfracmode1 \frac{1}{2}$
+% $\mathfracmode2 \frac{1}{2}$
+% $\mathfracmode3 \frac{1}{2}$
+% $\mathfracmode4 \frac{1}{2}$
+% $\mathfracmode5 \frac{1}{2}$
-\chardef\mathfracmode=0 % 0=auto, 1=displaystyle, 2=textstyle, 3=scriptstyle, 4=scriptscriptstyle, 5=mathstyle
+% 0=auto, 1=displaystyle, 2=textstyle, 3=scriptstyle, 4=scriptscriptstyle, 5=mathstyle
+
+\setnewconstant\mathfracmode\zerocount
\unexpanded\def\frac
{\ifcase\mathfracmode
@@ -151,14 +153,15 @@
\bgroup
-\catcode`\/=\@@other \global \let\normalforwardslash/
-\catcode`\/=\@@active \doglobal\appendtoks\let/\normalforwardslash\to\everymathematics
+\catcode`\/=\othercatcode \global \let\normalforwardslash/
+\catcode`\/=\activecatcode \doglobal\appendtoks\let/\normalforwardslash\to\everymathematics
\egroup
% to be checked:
-\def\exmthfont#1{\symbolicsizedfont#1\plusone{MathExtension}}
+\unexpanded\def\exmthfont#1%
+ {\symbolicsizedfont#1\plusone{MathExtension}}
\def\domthfrac#1#2#3#4#5#6#7%
{\begingroup
@@ -192,18 +195,204 @@
\rlap{\raise\dimexpr\ht2-\ht4\relax\copy4}\copy0}}}%
\endgroup}
-\def\mthfrac#1#2#3#4#5{\mathchoice
+\unexpanded\def\mthfrac#1#2#3#4#5{\mathchoice
{\domthfrac\displaystyle \textface {#1}{#2}{#3}{#4}{#5}}
{\domthfrac\textstyle \textface {#1}{#2}{#3}{#4}{#5}}
{\domthfrac\scriptstyle \scriptface {#1}{#2}{#3}{#4}{#5}}
{\domthfrac\scriptscriptstyle\scriptscriptface{#1}{#2}{#3}{#4}{#5}}}
-\def\mthsqrt#1#2#3{\mathchoice
+\unexpanded\def\mthsqrt#1#2#3{\mathchoice
{\domthsqrt\displaystyle \textface {#1}{#2}{#3}}
{\domthsqrt\textstyle \textface {#1}{#2}{#3}}
{\domthsqrt\scriptstyle \textface {#1}{#2}{#3}}
{\domthsqrt\scriptscriptstyle\textface {#1}{#2}{#3}}}
-% temp here
+%D Moved from math-new.tex (not that new anyway):
+
+%D \macros
+%D {genfrac}
+%D
+%D [TH] The definition of \type {\genfrac} \& co. is not
+%D trivial, because it allows some flexibility. This is
+%D supposed to be a user||level command, but will fail quite
+%D desparately if called outside math mode (\CONTEXT\ redefines
+%D \type {\over})
+%D
+%D [HH] We clean up this macro a bit and (try) to make it
+%D understandable. The expansion is needed for generating
+%D the second argument to \type {\dogenfrac}, which is to
+%D be a control sequence like \type {\over}.
+
+\unexpanded\def\genfrac#1#2#3#4%
+ {\edef\!!stringa
+ {#1#2}%
+ \expanded
+ {\dogenfrac{#4}%
+ \csname
+ \ifx @#3@%
+ \ifx\!!stringa\empty
+ \strippedcsname\normalover
+ \else
+ \strippedcsname\normaloverwithdelims
+ \fi
+ \else
+ \ifx\!!stringa\empty
+ \strippedcsname\normalabove
+ \else
+ \strippedcsname\normalabovewithdelims
+ \fi
+ \fi
+ \endcsname}%
+ {#1#2#3}}
+
+\def\dogenfrac#1#2#3#4#5%
+ {{#1{\begingroup#4\endgroup#2#3\relax#5}}}
+
+%D \macros
+%D {dfrac, tfrac, frac, dbinom, tbinom, binom}
+%D
+%D \startbuffer
+%D $\dfrac {1}{2} \tfrac {1}{2} \frac {1}{2}$
+%D $\dbinom{1}{2} \tbinom{1}{2} \binom{1}{2}$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+
+\unexpanded\def\dfrac {\genfrac\empty\empty{}\displaystyle}
+\unexpanded\def\tfrac {\genfrac\empty\empty{}\textstyle}
+\unexpanded\def\frac {\genfrac\empty\empty{}\donothing}
+
+\unexpanded\def\dbinom{\genfrac()\zeropoint\displaystyle}
+\unexpanded\def\tbinom{\genfrac()\zeropoint\textstyle}
+\unexpanded\def\binom {\genfrac()\zeropoint\donothing}
+
+\unexpanded\def\xfrac {\genfrac\empty\empty{}\scriptstyle}
+\unexpanded\def\xxfrac{\genfrac\empty\empty{}\scriptscriptstyle}
+
+\unexpanded\def\frac#1#2{\mathematics{\genfrac\empty\empty{}\donothing{#1}{#2}}}
+
+%D \macros
+%D {cfrac}
+%D
+%D \startbuffer
+%D $\cfrac{12}{3} \cfrac[l]{12}{3} \cfrac[c]{12}{3} \cfrac[r]{12}{3}$
+%D $\cfrac{1}{23} \cfrac[l]{1}{23} \cfrac[c]{1}{23} \cfrac[r]{1}{23}$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D Now we can align every combination we want:
+%D
+%D \startbuffer
+%D $\cfrac{12}{3} \cfrac[l]{12}{3} \cfrac[c]{12}{3} \cfrac[r]{12}{3}$
+%D $\cfrac{1}{23} \cfrac[l]{1}{23} \cfrac[c]{1}{23} \cfrac[r]{1}{23}$
+%D $\cfrac[cl]{12}{3} \cfrac[cc]{12}{3} \cfrac[cr]{12}{3}$
+%D $\cfrac[lc]{1}{23} \cfrac[cc]{1}{23} \cfrac[rc]{1}{23}$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+
+\definecomplexorsimple\cfrac
+
+\def\simplecfrac {\docfrac[cc]}
+\def\complexcfrac[#1]{\docfrac[#1cc]}
+
+\def\docfrac[#1#2#3]#4#5%
+ {{\displaystyle
+ \frac
+ {\strut
+ \ifx r#1\hfill\fi#4\ifx l#1\hfill\fi}%
+ {\ifx r#2\hfill\fi#5\ifx l#2\hfill\fi}%
+ \kern-\nulldelimiterspace}}
+
+%D \macros
+%D {splitfrac, splitdfrac}
+%D
+%D Occasionally one needs to typeset multi||line fractions.
+%D These commands use \tex{genfrac} to create such fractions.
+%D
+%D \startbuffer
+%D \startformula
+%D a=\frac{
+%D \splitfrac{xy + xy + xy + xy + xy}
+%D {+ xy + xy + xy + xy}
+%D }
+%D {z}
+%D =\frac{
+%D \splitdfrac{xy + xy + xy + xy + xy}
+%D {+ xy + xy + xy + xy}
+%D }
+%D {z}
+%D \stopformula
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D These macros are based on Michael J.~Downes posting on
+%D comp.text.tex on 2001/12/06
+
+\unexpanded\def\splitfrac#1#2%
+ {\genfrac\empty\empty\zeropoint\textstyle%
+ {\textstyle#1\quad\hfill}%
+ {\textstyle\hfill\quad\mathstrut#2}}
+
+\unexpanded\def\splitdfrac#1#2%
+ {\genfrac\empty\empty\zeropoint\displaystyle%
+ {#1\quad\hfill}
+ {\hfill\quad\mathstrut #2}}
+
+%D For thee moment here, but it might move:
+
+%D \macros
+%D {qedsymbol}
+%D
+%D [HH] The general Quod Erat Domonstrandum symbol is defined
+%D in such a way that we can configure it. Because this symbol
+%D is also used in text mode, we make it a normal text symbol
+%D with special behavior.
+
+\unexpanded\def\qedsymbol#1%
+ {\ifhmode
+ \unskip~\hfill#1\par
+ \else\ifmmode
+ \eqno#1\relax % Do we really need the \eqno here?
+ \else
+ \leavevmode\hbox{}\hfill#1\par
+ \fi\fi}
+
+\definesymbol [qed] [\qedsymbol{\mathematics{\square}}]
+
+%D \macros
+%D {QED}
+%D
+%D [HH] For compatbility reasons we also provide the \type
+%D {\QED} command. In case this command is overloaded, we still
+%D have the symbol available. \symbol[qed]
+
+\unexpanded\def\QED{\symbol[qed]}
+
+%D \macros
+%D {mathhexbox}
+%D
+%D [TH] \type {\mathhexbox} is also user||level (already
+%D defined in Plain \TEX). It allows to get a math character
+%D inserted as if it was a text character.
+
+\unexpanded\def\mathhexbox#1#2#3%
+ {\mathtext{$\mathsurround\zeropoint\mathchar"#1#2#3$}}
+
+%D \macros
+%D {boxed}
+%D
+%D [HH] Another macro that users expect (slightly adapted):
+
+\unexpanded\def\boxed
+ {\ifmmode\expandafter\mframed\else\expandafter\framed\fi}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/math-ini.lua b/Master/texmf-dist/tex/context/base/math-ini.lua
index 63d7cad3852..a122f722975 100644
--- a/Master/texmf-dist/tex/context/base/math-ini.lua
+++ b/Master/texmf-dist/tex/context/base/math-ini.lua
@@ -9,22 +9,26 @@ if not modules then modules = { } end modules ['math-ext'] = {
-- if needed we can use the info here to set up xetex definition files
-- the "8000 hackery influences direct characters (utf) as indirect \char's
-local utf = unicode.utf8
-
local texsprint, format, utfchar, utfbyte = tex.sprint, string.format, utf.char, utf.byte
+local setmathcode, setdelcode = tex.setmathcode, tex.setdelcode
+
+local allocate = utilities.storage.allocate
local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end)
-mathematics = mathematics or { }
+local report_math = logs.reporter("mathematics","initializing")
+
+mathematics = mathematics or { }
+local mathematics = mathematics
mathematics.extrabase = 0xFE000 -- here we push some virtuals
mathematics.privatebase = 0xFF000 -- here we push the ex
-local families = {
- tf = 0, it = 1, sl = 2, bf = 3, bi = 4, bs = 5, -- virtual fonts or unicode otf
+local families = allocate {
+ tf = 0, it = 1, sl = 2, bf = 3, bi = 4, bs = 5, -- no longer relevant
}
-local classes = {
+local classes = allocate {
ord = 0, -- mathordcomm mathord
op = 1, -- mathopcomm mathop
bin = 2, -- mathbincomm mathbin
@@ -94,77 +98,127 @@ end
local function mathtopaccent(class,family,slot)
return format('\\Umathaccent "%X "%X "%X ',0,family,slot) -- no class
end
-local function mathbotaccent(class,family,slot)
- return format('\\Umathbotaccent "%X "%X "%X ',0,family,slot) -- no class
+if tex.luatexversion > 65 then -- this will disappear at 0.70
+ local function mathbotaccent(class,family,slot)
+ return format('\\Umathaccent bottom "%X "%X "%X ',0,family,slot) -- no class
+ end
+else
+ local function mathbotaccent(class,family,slot)
+ return format('\\Umathbotaccent "%X "%X "%X ',0,family,slot) -- no class
+ end
end
local function mathtopdelimiter(class,family,slot)
- return format('\\Uoverdelimiter "%X "%X ',0,family,slot) -- no class
+ return format('\\Udelimiterover "%X "%X ',family,slot) -- no class
end
local function mathbotdelimiter(class,family,slot)
- return format('\\Uunderdelimiter "%X "%X ',0,family,slot) -- no class
+ return format('\\Udelimiterunder "%X "%X ',family,slot) -- no class
end
local escapes = characters.filters.utf.private.escapes
-local function setmathsymbol(name,class,family,slot)
- if class == classes.accent then
- texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathaccent(class,family,slot)))
- elseif class == classes.topaccent then
- texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathtopaccent(class,family,slot)))
- elseif class == classes.botaccent then
- texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathbotaccent(class,family,slot)))
- elseif class == classes.over then
- texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathtopdelimiter(class,family,slot)))
- elseif class == classes.under then
- texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathbotdelimiter(class,family,slot)))
- elseif class == classes.open or class == classes.close then
- texsprint(delcode(slot,family,slot))
- texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,delimiter(class,family,slot)))
- elseif class == classes.delimiter then
- texsprint(delcode(slot,family,slot))
- texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,delimiter(0,family,slot)))
- elseif class == classes.radical then
- texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,radical(family,slot)))
- else
- -- beware, open/close and other specials should not end up here
---~ local ch = utfchar(slot)
---~ if escapes[ch] then
---~ texsprint(format("\\xdef\\%s{\\char%s }",name,slot))
---~ else
- texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathchar(class,family,slot)))
---~ end
+local setmathcharacter, setmathsynonym, setmathsymbol -- once updated we will inline them
+
+if setmathcode then
+
+ setmathcharacter = function(class,family,slot,unicode,firsttime)
+ if not firsttime and class <= 7 then
+ setmathcode(slot,{class,family,unicode or slot})
+ end
end
-end
-local function setmathcharacter(class,family,slot,unicode,firsttime)
- if not firsttime and class <= 7 then
- texsprint(mathcode(slot,class,family,unicode or slot))
+ setmathsynonym = function(class,family,slot,unicode,firsttime)
+ if not firsttime and class <= 7 then
+ setmathcode(slot,{class,family,unicode})
+ end
+ if class == classes.open or class == classes.close then
+ setdelcode(slot,{family,unicode,0,0})
+ end
end
-end
-local function setmathsynonym(class,family,slot,unicode,firsttime)
- if not firsttime and class <= 7 then
- texsprint(mathcode(slot,class,family,unicode))
+ setmathsymbol = function(name,class,family,slot) -- hex is nicer for tracing
+ if class == classes.accent then
+ texsprint(format([[\unexpanded\gdef\%s{\Umathaccent 0 "%X "%X }]],name,family,slot))
+ elseif class == classes.topaccent then
+ texsprint(format([[\unexpanded\gdef\%s{\Umathaccent 0 "%X "%X }]],name,family,slot))
+ elseif class == classes.botaccent then
+ texsprint(format([[\unexpanded\gdef\%s{\Umathbotaccent 0 "%X "%X }]],name,family,slot))
+ elseif class == classes.over then
+ texsprint(format([[\unexpanded\gdef\%s{\Udelimiterover "%X "%X }]],name,family,slot))
+ elseif class == classes.under then
+ texsprint(format([[\unexpanded\gdef\%s{\Udelimiterunder "%X "%X }]],name,family,slot))
+ elseif class == classes.open or class == classes.close then
+ setdelcode(slot,{family,slot,0,0})
+ texsprint(format([[\unexpanded\gdef\%s{\Udelimiter "%X "%X "%X }]],name,class,family,slot))
+ elseif class == classes.delimiter then
+ setdelcode(slot,{family,slot,0,0})
+ texsprint(format([[\unexpanded\gdef\%s{\Udelimiter 0 "%X "%X }]],name,family,slot))
+ elseif class == classes.radical then
+ texsprint(format([[\unexpanded\gdef\%s{\Uradical "%X "%X }]],name,family,slot))
+ else
+ -- beware, open/close and other specials should not end up here
+ texsprint(format([[\unexpanded\gdef\%s{\Umathchar "%X "%X "%X }]],name,class,family,slot))
+ end
+ end
+
+
+else
+
+ setmathcharacter = function(class,family,slot,unicode,firsttime)
+ if not firsttime and class <= 7 then
+ texsprint(mathcode(slot,class,family,unicode or slot))
+ end
+ end
+
+ setmathsynonym = function(class,family,slot,unicode,firsttime)
+ if not firsttime and class <= 7 then
+ texsprint(mathcode(slot,class,family,unicode))
+ end
+ if class == classes.open or class == classes.close then
+ texsprint(delcode(slot,family,unicode))
+ end
end
- if class == classes.open or class == classes.close then
- texsprint(delcode(slot,family,unicode))
+
+ setmathsymbol = function(name,class,family,slot)
+ if class == classes.accent then
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathaccent(class,family,slot)))
+ elseif class == classes.topaccent then
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathtopaccent(class,family,slot)))
+ elseif class == classes.botaccent then
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathbotaccent(class,family,slot)))
+ elseif class == classes.over then
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathtopdelimiter(class,family,slot)))
+ elseif class == classes.under then
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathbotdelimiter(class,family,slot)))
+ elseif class == classes.open or class == classes.close then
+ texsprint(delcode(slot,family,slot))
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,delimiter(class,family,slot)))
+ elseif class == classes.delimiter then
+ texsprint(delcode(slot,family,slot))
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,delimiter(0,family,slot)))
+ elseif class == classes.radical then
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,radical(family,slot)))
+ else
+ -- beware, open/close and other specials should not end up here
+ texsprint(format("\\unexpanded\\xdef\\%s{%s}",name,mathchar(class,family,slot)))
+ end
end
+
end
local function report(class,family,unicode,name)
local nametype = type(name)
if nametype == "string" then
- logs.report("mathematics","%s:%s %s U+%05X (%s) => %s",classname,class,family,unicode,utfchar(unicode),name)
+ report_math("%s:%s %s U+%05X (%s) => %s",classname,class,family,unicode,utfchar(unicode),name)
elseif nametype == "number" then
- logs.report("mathematics","%s:%s %s U+%05X (%s) => U+%05X",classname,class,family,unicode,utfchar(unicode),name)
+ report_math("%s:%s %s U+%05X (%s) => U+%05X",classname,class,family,unicode,utfchar(unicode),name)
else
- logs.report("mathematics","%s:%s %s U+%05X (%s)", classname,class,family,unicode,utfchar(unicode))
+ report_math("%s:%s %s U+%05X (%s)", classname,class,family,unicode,utfchar(unicode))
end
end
-- there will be a combined \(math)chardef
-function mathematics.define(slots,family)
+function mathematics.define(family)
family = family or 0
family = families[family] or family
local data = characters.data
@@ -209,14 +263,12 @@ function mathematics.define(slots,family)
report(class,family,unicode,name)
end
setmathsymbol(name,class,family,unicode)
- -- setmathcharacter(class,family,unicode,unicode,i)
else
name = class == classes.variable or class == classes.number and character.adobename
if name then
if trace_defining then
report(class,family,unicode,name)
end
- -- setmathcharacter(class,family,unicode,unicode,i)
end
end
setmathcharacter(class,family,unicode,unicode,i)
@@ -262,19 +314,21 @@ end
function mathematics.utfmathcommand(chr, default)
local cd = characters.data[utfbyte(chr)]
local cmd = cd and cd.mathname
- tex.sprint(cmd or default or "")
+ return cmd or default or ""
end
function mathematics.utfmathfiller(chr, default)
local cd = characters.data[utfbyte(chr)]
local cmd = cd and (cd.mathfiller or cd.mathname)
- tex.sprint(cmd or default or "")
+ return cmd or default or ""
end
-mathematics.entities = mathematics.entities or { }
+-- xml
-function mathematics.register_xml_entities()
+mathematics.xml = { entities = { } }
+
+function mathematics.xml.registerentities()
local entities = xml.entities
- for name, unicode in next, mathematics.entities do
+ for name, unicode in next, mathematics.xml.entities do
if not entities[name] then
entities[name] = utfchar(unicode)
end
@@ -311,30 +365,3 @@ function mathematics.big(tfmdata,unicode,n)
return unicode
end
--- plugins
-
-local hvars = table.tohash {
- --~ "RadicalKernBeforeDegree",
- --~ "RadicalKernAfterDegree",
-}
-
-function mathematics.scaleparameters(t,tfmtable,delta,hdelta,vdelta)
- local math_parameters = tfmtable.math_parameters
- if math_parameters and next(math_parameters) then
- delta = delta or 1
- hdelta, vdelta = hdelta or delta, vdelta or delta
- local _, mp = mathematics.dimensions(math_parameters)
- for name, value in next, mp do
- if name == "RadicalDegreeBottomRaisePercent" then
- mp[name] = value
- elseif hvars[name] then
- mp[name] = hdelta * value
- else
- mp[name] = vdelta * value
- end
- end
- t.MathConstants = mp
- end
-end
-
-table.insert(fonts.tfm.mathactions,mathematics.scaleparameters)
diff --git a/Master/texmf-dist/tex/context/base/math-ini.mkii b/Master/texmf-dist/tex/context/base/math-ini.mkii
index f9dd859c412..9f7ab49e5a1 100644
--- a/Master/texmf-dist/tex/context/base/math-ini.mkii
+++ b/Master/texmf-dist/tex/context/base/math-ini.mkii
@@ -405,8 +405,8 @@
\appendtoks\autoenablemathcollection\to\mathstrategies
-\fetchruntimecommand \showmathcharacters {\f!mathprefix\s!run.mkii}
-\fetchruntimecommand \showmathtoken {\f!mathprefix\s!run.mkii}
+\fetchruntimecommand \showmathcharacters {\f!mathprefix\s!run}
+\fetchruntimecommand \showmathtoken {\f!mathprefix\s!run}
\def\resetmathcollection[#1]%
{\def\mathcollection{#1}%
diff --git a/Master/texmf-dist/tex/context/base/math-ini.mkiv b/Master/texmf-dist/tex/context/base/math-ini.mkiv
index 9dbadc11f01..f778afa08c5 100644
--- a/Master/texmf-dist/tex/context/base/math-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-ini.mkiv
@@ -29,11 +29,6 @@
\ifx\v!compact\undefined \def\v!compact{compact} \fi
-%D New:
-
-\let\startimath\Ustartmath \let\stopimath \Ustopmath
-\let\startdmath\Ustartdisplaymath \let\stopdmath \Ustopmath
-
%D We move these definitions into the format:
% test [[\char948 \ctxlua{tex.sprint(utf.char(948))}]]
@@ -41,16 +36,29 @@
\registerctxluafile{math-ini}{1.001}
\registerctxluafile{math-dim}{1.001}
+\registerctxluafile{math-act}{1.001}
\registerctxluafile{math-ent}{1.001}
\registerctxluafile{math-ext}{1.001}
\registerctxluafile{math-vfu}{1.001}
\registerctxluafile{math-map}{1.001}
\registerctxluafile{math-noa}{1.001}
+\registerctxluafile{math-tag}{1.001}
+
+\definesystemattribute[mathalphabet] [public]
+\definesystemattribute[mathsize] [public]
+\definesystemattribute[mathpunctuation][public]
+\definesystemattribute[mathgreek] [public]
+\definesystemattribute[mathalternate] [public]
+
+% experiment
-\definesystemattribute[mathalphabet] \chardef\mathalphabetattribute \dogetattributeid{mathalphabet}
-\definesystemattribute[mathsize] \chardef\mathsizeattribute \dogetattributeid{mathsize}
-\definesystemattribute[mathpunctuation] \chardef\mathpunctuationattribute \dogetattributeid{mathpunctuation}
-\definesystemattribute[mathgreek] \chardef\mathgreekattribute \dogetattributeid{mathgreek}
+% Normally this is applied to only one character.
+%
+% $ABC$ $\cal ABC$ $\mathaltcal ABC$
+
+\def\mathalternate#1{\ctxlua{mathematics.setalternate(0,"#1")}} % fam 0
+
+\def\mathaltcal{\mathalternate{cal}\cal} % ss01 in xits
% todo: only in mmode
@@ -61,9 +69,9 @@
\let\mathgreeknormal\mathgreekupright
\let\mathgreeknone \mathgreekdefault
-\def\setmathattribute#1#2{\ifmmode\ctxlua{mathematics.sync_a_both ("#1","#2")}\fi}
-\def\setmathalphabet #1{\ifmmode\ctxlua{mathematics.sync_a_name ("#1")}\fi}
-\def\setmathstyle #1{\ifmmode\ctxlua{mathematics.sync_a_style("#1")}\fi}
+\def\setmathattribute#1#2{\ifmmode\ctxlua{mathematics.syncboth ("#1","#2")}\fi}
+\def\setmathalphabet #1{\ifmmode\ctxlua{mathematics.syncname ("#1")}\fi}
+\def\setmathstyle #1{\ifmmode\ctxlua{mathematics.syncstyle("#1")}\fi}
\unexpanded\def\mr {\setmathattribute{regular}{tf}}
@@ -145,10 +153,10 @@
%D Helpers:
-\def\utfmathclass #1{\ctxlua{tex.sprint(mathematics.utfmathclass ("#1"))}}
-\def\utfmathstretch#1{\ctxlua{tex.sprint(mathematics.utfmathstretch("#1"))}}
-\def\utfmathcommand#1{\ctxlua{tex.sprint(mathematics.utfmathcommand("#1"))}}
-\def\utfmathfiller #1{\ctxlua{tex.sprint(mathematics.utfmathfiller ("#1"))}}
+\def\utfmathclass #1{\cldcontext{mathematics.utfmathclass (\!!bs#1\!!es)}}
+\def\utfmathstretch#1{\cldcontext{mathematics.utfmathstretch(\!!bs#1\!!es)}}
+\def\utfmathcommand#1{\cldcontext{mathematics.utfmathcommand(\!!bs#1\!!es)}}
+\def\utfmathfiller #1{\cldcontext{mathematics.utfmathfiller (\!!bs#1\!!es)}}
% \def\utfmathclassdefault #1#2{\ctxlua{
% tex.sprint(mathematics.utfmathclass("#1","#2"))
@@ -169,23 +177,23 @@
\def\@@mathboxcomm #1{\dontleavehmode\hbox\Ustartmath\mathsurround\zeropoint#1\Ustopmath}
\def\@@mathchoicecomm#1{[todo #1]}
-\chardef\mathordcode = 0 \let\mathordcomm \mathord
-\chardef\mathopcode = 1 \let\mathopcomm \mathop
-\chardef\mathbincode = 2 \let\mathbincomm \mathbin
-\chardef\mathrelcode = 3 \let\mathrelcomm \mathrel
-\chardef\mathopencode = 4 \let\mathopencomm \mathopen
-\chardef\mathclosecode = 5 \let\mathclosecomm \mathclose
-\chardef\mathpunctcode = 6 \let\mathpunctcomm \mathpunct
-\chardef\mathalphacode = 7 \let\mathalphacomm \firstofoneargument
-\chardef\mathinnercode = 0 \let\mathinnercomm \mathinner
-\chardef\mathnothingcode= 0 \let\mathnothingcomm \firstofoneargument
-\chardef\mathlimopcode = 1 \let\mathlimopcomm \@@mathlimopcomm
-\chardef\mathnolopcode = 1 \let\mathnolopcomm \@@mathnolopcomm
-\chardef\mathchoicecode = 0 \let\mathchoicecomm \@@mathchoicecomm
-\chardef\mathboxcode = 0 \let\mathboxcomm \@@mathboxcomm
-
-\chardef\mathaccentcode = 8
-\chardef\mathradicalcode= 9
+\setnewconstant\mathordcode 0 \let\mathordcomm \mathord
+\setnewconstant\mathopcode 1 \let\mathopcomm \mathop
+\setnewconstant\mathbincode 2 \let\mathbincomm \mathbin
+\setnewconstant\mathrelcode 3 \let\mathrelcomm \mathrel
+\setnewconstant\mathopencode 4 \let\mathopencomm \mathopen
+\setnewconstant\mathclosecode 5 \let\mathclosecomm \mathclose
+\setnewconstant\mathpunctcode 6 \let\mathpunctcomm \mathpunct
+\setnewconstant\mathalphacode 7 \let\mathalphacomm \firstofoneargument
+\setnewconstant\mathinnercode 0 \let\mathinnercomm \mathinner
+\setnewconstant\mathnothingcode 0 \let\mathnothingcomm \firstofoneargument
+\setnewconstant\mathlimopcode 1 \let\mathlimopcomm \@@mathlimopcomm
+\setnewconstant\mathnolopcode 1 \let\mathnolopcomm \@@mathnolopcomm
+\setnewconstant\mathchoicecode 0 \let\mathchoicecomm \@@mathchoicecomm
+\setnewconstant\mathboxcode 0 \let\mathboxcomm \@@mathboxcomm
+
+\setnewconstant\mathaccentcode 8
+\setnewconstant\mathradicalcode 9
\def\puremathcode#1{\the\csname math#1code\endcsname}
\def\puremathcomm#1{\csname math#1comm\endcsname}
@@ -250,10 +258,10 @@
{\normalhbox\bgroup\mf
\dowithnextbox{\flushnextbox\egroup}\normalhbox}
-\def\mbox
+\def\mbox % we cannot add \dontleavehmode ... else no \setbox0\mbox possible
{\ifmmode\normalmbox\else\normalhbox\fi}
-\def\enablembox
+\unexpanded\def\enablembox
{\appendtoks
\ifx\normalhbox\undefined\let\normalhbox\hbox\fi
\let\hbox\mbox
@@ -342,70 +350,133 @@
%D The result is as expected: the first line typesets ok, while the second
%D one triggers an error message.
+\setnewconstant\activemathcharcode "8000
+
+\newtoks\activatedmathcharacters
+
+\def\activatemathcharacter#1%
+ {\appendtoks
+ \global\mathcode#1=\activemathcharcode
+ \to \activatedmathcharacters}
+
+\def\activatemathcharacters
+ {\the\activatedmathcharacters}
+
+\setnewconstant\primeasciicode 39 % '
+
+\activatemathcharacter\circumflexasciicode
+\activatemathcharacter\underscoreasciicode
+\activatemathcharacter\ampersandasciicode
+\activatemathcharacter\primeasciicode
+
+% not used:
+%
+% \mathcode\spaceasciicode\activemathcharcode
+%
+% not used:
+%
+% \bgroup
+% \catcode\underscoreasciicode\activecatcode
+% \doglobal\appendtoks
+% \mathcode\underscoreasciicode\activemathcharcode
+% \let_\activemathunderscore
+% \to \everymathematics
+% \egroup
+%
+% plain tex legacy:
+
+\bgroup
+ \catcode\primeasciicode\activecatcode
+ \doglobal\appendtoks
+ \let'\domathprime
+ \to \everymathematics
+\egroup
+
\newtoks\everydonknuthmode
\newtoks\everynonknuthmode
-\def\nonknuthmode{\the\everynonknuthmode\let\nonknuthmode\relax}
-\def\donknuthmode{\the\everydonknuthmode}
+\newconditional \knuthmode
+
+\def\nonknuthmode
+ {\pushcatcodetable
+ \setcatcodetable\ctxcatcodes
+ \the\everynonknuthmode
+ \let\nonknuthmode\relax
+ \popcatcodetable}
-\ifdefined\normalsuber\else \def\normalsuber{_} \fi
-\ifdefined\normalsuper\else \def\normalsuper{^} \fi
-\ifdefined\normalaltab\else \def\normalaltab{&} \fi
+\def\donknuthmode
+ {\pushcatcodetable
+ \setcatcodetable\ctxcatcodes
+ \the\everydonknuthmode
+ \popcatcodetable}
\bgroup
- \catcode`_=\active
- \catcode`^=\active
- \catcode`&=\active
+ \catcode\underscoreasciicode\activecatcode
+ \catcode\circumflexasciicode\activecatcode
+ \catcode\ampersandasciicode \activecatcode
\global \everynonknuthmode {\appendtoks
- \let_\normalsuber
- \let^\normalsuper
- \let&\normalaltab
+ \let_\normalsubscript
+ \let^\normalsuperscript
+ \let&\normalmathaligntab % use \def when it's \aligntab
\to \everymathematics}
\egroup
\appendtoks
- \mathcode`_="8000
- \mathcode`^="8000
- \mathcode`&="8000
- \catcode`_=\@@other
- \catcode`^=\@@other
- \catcode`&=\@@other
+ \setfalse\knuthmode
+ \catcode\underscoreasciicode\othercatcode
+ \catcode\circumflexasciicode\othercatcode
+ \catcode\ampersandasciicode \othercatcode
\to \everynonknuthmode
\appendtoks
- \catcode`_=\@@subscript
- \catcode`^=\@@superscript
- \catcode`&=\@@alignment
+ \settrue\knuthmode
+ \catcode\underscoreasciicode\subscriptcatcode
+ \catcode\circumflexasciicode\superscriptcatcode
+ \catcode\ampersandasciicode \alignmentcatcode
\to \everydonknuthmode
\appendtoks
\startextendcatcodetable\ctxcatcodes
- \catcode`_=\@@other
- \catcode`^=\@@other
- \catcode`&=\@@other
+ \catcode\underscoreasciicode\othercatcode
+ \catcode\circumflexasciicode\othercatcode
+ \catcode\ampersandasciicode \othercatcode
\stopextendcatcodetable
\to \everynonknuthmode
\appendtoks
\startextendcatcodetable\ctxcatcodes
- \catcode`_=\@@subscript
- \catcode`^=\@@superscript
- \catcode`&=\@@alignment
+ \catcode\underscoreasciicode\subscriptcatcode
+ \catcode\circumflexasciicode\superscriptcatcode
+ \catcode\ampersandasciicode \alignmentcatcode
\stopextendcatcodetable
\to \everydonknuthmode
-%D Needed for unicode:
+% \def\prefermathcatcodes
+% {\catcode\underscoreasciicode\subscriptcatcode
+% \catcode\circumflexasciicode\superscriptcatcode
+% \catcode\ampersandasciicode \alignmentcatcode}
+
+%D Even more drastic:
-\def\nulloperator{\mathortext{\mathop{\null}}{\null}}
+\unexpanded\def\asciimode
+ {\catcodetable\txtcatcodes
+ \nonknuthmode}
-%D To be dealt with ...
+\unexpanded\def\startasciimode
+ {\pushcatcodetable
+ \catcodetable\txtcatcodes
+ \nonknuthmode}
-\mathcode`\ ="8000 % \space
-\mathcode`\'="8000 % ^\prime
-\mathcode`\_="8000 % \_
+\unexpanded\def\stopasciimode
+ {\popcatcodetable
+ \ifconditional\knuthmode\else\donknuthmode\fi}
+
+%D Needed for unicode:
+
+\def\nulloperator{\mathortext{\mathop{\emptyhbox}}{\emptyhbox}}
%D \macros
%D {setupmathematics}
@@ -428,8 +499,8 @@
\appendtoks
\doifelse{\mathematicsparameter\v!compact}\v!yes
- {\ctxlua{fonts.vf.math.optional=true}}
- {\ctxlua{fonts.vf.math.optional=false}}%
+ {\ctxlua{fonts.handlers.vf.math.optional=true}}
+ {\ctxlua{fonts.handlers.vf.math.optional=false}}%
\to \everysetupmathematics
\setupmathematics
@@ -654,4 +725,10 @@
\def\mathoptext#1{\mathop{\text{#1}}}
+% for a while:
+
+\ifnum\luatexversion>65
+ \def\Umathbotaccent{\Umathaccent bottom }
+\fi
+
\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 2af471b5cb4..a99142a0423 100644
--- a/Master/texmf-dist/tex/context/base/math-int.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-int.mkiv
@@ -33,19 +33,19 @@
%D
%D Limits: \setupmathematics[integral=limits] \getbuffer
-\chardef\intlimitcode\zerocount % 0 nolimits 1 displaylimits 2 limits
+\newconstant\mathintlimitmode % 0 nolimits 1 displaylimits 2 limits
\def\intlimits
- {\ifcase\intlimitcode \nolimits \or \displaylimits \or \limits \fi}
+ {\ifcase\mathintlimitmode \nolimits \or \displaylimits \or \limits \fi}
\ifx\v!integral\undefined \def\v!integral{integral} \fi
\appendtoks
\processaction
[\mathematicsparameter\v!integral]
- [ nolimits=>\chardef\intlimitcode\zerocount,
- displaylimits=>\chardef\intlimitcode\plusone,
- limits=>\chardef\intlimitcode\plustwo]%
+ [ nolimits=>\mathintlimitmode\zerocount,
+ displaylimits=>\mathintlimitmode\plusone,
+ limits=>\mathintlimitmode\plustwo]%
\to \everysetupmathematics
\setupmathematics
@@ -53,22 +53,45 @@
%D More integrals (AM):
-\definemathcommand [iint] {\repeatintegral\plusone }
-\definemathcommand [iiint] {\repeatintegral\plustwo }
-\definemathcommand [iiiint] {\repeatintegral\plusthree}
-
%def\integralrepeatsymbol{\intop}
\def\integralrepeatsymbol{{\int}}
-\def\repeatintegral#1%
+% \def\repeatintegral#1%
+% {\scratchtoks\emptytoks
+% \let\dointlimits\donothing
+% \let\dodointlimits\intlimits
+% \dorecurse{#1}{\appendtoks \integralrepeatsymbol \dointkern \to \scratchtoks}%
+% \appendtoks \intop \dointlimits \dodointlimits \to \scratchtoks
+% \edef\dodorepeatintegral{\the\scratchtoks}%
+% \futurelet\next\dorepeatintegral}
+
+% \definemathcommand [iint] {\repeatintegral\plusone }
+% \definemathcommand [iiint] {\repeatintegral\plustwo }
+% \definemathcommand [iiiint] {\repeatintegral\plusthree}
+
+\def\fakerepeatintegral#1%
{\scratchtoks\emptytoks
- \let\dointlimits\donothing
- \let\dodointlimits\intlimits
- \dorecurse{#1}{\appendtoks \integralrepeatsymbol \dointkern \to \scratchtoks}
+ \dorecurse{#1}{\appendtoks \integralrepeatsymbol \dointkern \to \scratchtoks}%
\appendtoks \intop \dointlimits \dodointlimits \to \scratchtoks
- \edef\dodorepeatintegral{\the\scratchtoks}%
+ \edef\dodorepeatintegral{\the\scratchtoks}}
+
+\def\repeatintegral#1#2#3%
+ {\let\dointlimits\donothing
+ \let\dodointlimits\intlimits
+ \iffontchar\textfont\zerocount#1\relax
+ %\edef\dodorepeatintegral{\utfchar{#1}}%
+ \let\dodorepeatintegral#2%
+ \else
+ \fakerepeatintegral{#3}%
+ \fi
\futurelet\next\dorepeatintegral}
+% This is a temporary solution, as we will make a virtual glyph in lm.
+
+\definemathcommand [iint] {\repeatintegral{"222B}\normaliint \plusone }
+\definemathcommand [iiint] {\repeatintegral{"222C}\normaliiint \plustwo }
+\definemathcommand [iiiint] {\repeatintegral{"222D}\normaliiiint\plusthree}
+
%D If the \type{\limits} option is used after \type{\iint}, use
%D \type{\mathop} and fudge the left hand space a bit to make the
%D subscript visually centered.
@@ -80,7 +103,7 @@
{\ifx\next\limits \dointlimitcorrection \else
\ifx\next\displaylimits \dointlimitcorrection \else
\ifx\next\nolimits \donothing \else
- \ifcase\intlimitcode\else \dointlimitcorrection \fi\fi\fi\fi
+ \ifcase\mathintlimitmode\else \dointlimitcorrection \fi\fi\fi\fi
\dodorepeatintegral}
\def\dointlimitcorrection
diff --git a/Master/texmf-dist/tex/context/base/math-lbr.mkii b/Master/texmf-dist/tex/context/base/math-lbr.mkii
index cf69eec1fbf..6392c762e56 100644
--- a/Master/texmf-dist/tex/context/base/math-lbr.mkii
+++ b/Master/texmf-dist/tex/context/base/math-lbr.mkii
@@ -295,12 +295,12 @@
\stopmathcollection
-% \startmathcollection[lbr]
-%
-% \definemathcharacter [:] [punct] [tf] ["3A] % unbelievable
-% \definemathcharacter [;] [punct] [tf] ["3B] % unbelievable
-%
-% \stopmathcollection
+\startmathcollection[lbr]
+
+\definemathcharacter [:] [punct] [tf] ["3A] % unbelievable, but enabled again for Mojca
+\definemathcharacter [;] [punct] [tf] ["3B] % unbelievable, but enabled again for Mojca
+
+\stopmathcollection
\startmathcollection[lbr]
@@ -377,7 +377,7 @@
% we define the whole lot, although only a few differ (esp dot)
% \startmathcollection[lbr]
-%
+%
% \definemathsymbol [acute] [accent] [tf] ["13] % mr -> tf
% \definemathsymbol [grave] [accent] [tf] ["12] % mr -> tf
% \definemathsymbol [ddot] [accent] [tf] ["7F] % mr -> tf
@@ -390,7 +390,7 @@
% \definemathsymbol [dot] [accent] [tf] ["05] % mr -> tf, 5F -> 05
% \definemathsymbol [widetilde] [accent] [ex] ["65] % [ord]
% \definemathsymbol [widehat] [accent] [ex] ["62] % [ord]
-%
+%
% \stopmathcollection
\startmathcollection[lbr:texnansi]
@@ -444,19 +444,19 @@
\stoprawmathcollection
-\def\LBRbig {\@@dobig{8.20}}
-\def\LBRBig {\@@dobig{10.80}}
-\def\LBRbigg {\@@dobig{13.42}}
-\def\LBRBigg {\@@dobig{16.03}}
-\def\LBRbiggg{\@@dobig{17.72}}
-\def\LBRBiggg{\@@dobig{21.25}}
-
-% \def\LBRbig {\@@dobig{0.820}}
-% \def\LBRBig {\@@dobig{1.080}}
-% \def\LBRbigg {\@@dobig{1.342}}
-% \def\LBRBigg {\@@dobig{1.603}}
-% \def\LBRbiggg{\@@dobig{1.772}}
-% \def\LBRBiggg{\@@dobig{2.125}}
+% \def\LBRbig {\@@dobig{8.20}}
+% \def\LBRBig {\@@dobig{10.80}}
+% \def\LBRbigg {\@@dobig{13.42}}
+% \def\LBRBigg {\@@dobig{16.03}}
+% \def\LBRbiggg{\@@dobig{17.72}}
+% \def\LBRBiggg{\@@dobig{21.25}}
+
+\def\LBRbig {\@@dobig{0.820}}
+\def\LBRBig {\@@dobig{1.080}}
+\def\LBRbigg {\@@dobig{1.342}}
+\def\LBRBigg {\@@dobig{1.603}}
+\def\LBRbiggg{\@@dobig{1.772}}
+\def\LBRBiggg{\@@dobig{2.125}}
\startrawmathcollection[lbr]
diff --git a/Master/texmf-dist/tex/context/base/math-map.lua b/Master/texmf-dist/tex/context/base/math-map.lua
index d3e8cc110e4..b6d57bff531 100644
--- a/Master/texmf-dist/tex/context/base/math-map.lua
+++ b/Master/texmf-dist/tex/context/base/math-map.lua
@@ -20,19 +20,24 @@ if not modules then modules = { } end modules ['math-map'] = {
-- maybe: script/scriptscript dynamic,
local type, next = type, next
-local floor = math.floor
+local floor, div = math.floor, math.div
+
+local allocate = utilities.storage.allocate
local texattribute = tex.attribute
local trace_greek = false trackers.register("math.greek", function(v) trace_greek = v end)
-mathematics = mathematics or { }
+local report_remapping = logs.reporter("mathematics","remapping")
+
+mathematics = mathematics or { }
+local mathematics = mathematics
-- we could use one level less and have tf etc be tables directly but the
-- following approach permits easier remapping of a-a, A-Z and 0-9 to
-- fallbacks; symbols is currently mostly greek
-mathematics.alphabets = {
+local alphabets = allocate {
regular = {
tf = {
digits = 0x00030,
@@ -267,7 +272,8 @@ mathematics.alphabets = {
},
}
-local alphabets = mathematics.alphabets
+mathematics.alphabets = alphabets
+
local mathremap = { }
for alphabet, styles in next, alphabets do
@@ -344,12 +350,12 @@ alphabets.serif = alphabets.regular
alphabets.type = alphabets.monospaced
alphabets.teletype = alphabets.monospaced
-function mathematics.to_a_style(attribute)
+function mathematics.tostyle(attribute)
local r = mathremap[attribute]
return r and r.style or "tf"
end
-function mathematics.to_a_name(attribute)
+function mathematics.toname(attribute)
local r = mathremap[attribute]
return r and r.alphabet or "regular"
end
@@ -358,13 +364,13 @@ end
local mathalphabet = attributes.private("mathalphabet")
-function mathematics.sync_a_both(alphabet,style)
+function mathematics.syncboth(alphabet,style)
local data = alphabets[alphabet or "regular"] or alphabets.regular
data = data[style or "tf"] or data.tf
texattribute[mathalphabet] = data and data.attribute or texattribute[mathalphabet]
end
-function mathematics.sync_a_style(style)
+function mathematics.syncstyle(style)
--~ local r = mathremap[mathalphabet]
local r = mathremap[texattribute[mathalphabet]]
local alphabet = r and r.alphabet or "regular"
@@ -372,7 +378,7 @@ function mathematics.sync_a_style(style)
texattribute[mathalphabet] = data and data.attribute or texattribute[mathalphabet]
end
-function mathematics.sync_a_name(alphabet)
+function mathematics.syncname(alphabet)
--~ local r = mathremap[mathalphabet]
local r = mathremap[texattribute[mathalphabet]]
local style = r and r.style or "tf"
@@ -390,7 +396,7 @@ local remapping = {
[3] = { what = "italic", tf = "it", bf = "bi" }, -- italic
}
-function mathematics.remap_alphabets(char,mathalphabet,mathgreek)
+function mathematics.remapalphabets(char,mathalphabet,mathgreek)
if mathgreek > 0 then
local lc, uc = floor(mathgreek/10), mathgreek % 10 -- 2 == upright 3 == italic
if lc > 1 or uc > 1 then
@@ -400,7 +406,7 @@ function mathematics.remap_alphabets(char,mathalphabet,mathgreek)
local alphabet = r and r.alphabet or "regular"
local style = r and r.style or "tf"
if trace_greek then
- logs.report("math","before: char: %05X, alphabet: %s %s, lcgreek: %s, ucgreek: %s",char,alphabet,style,remapping[lc].what,remapping[uc].what)
+ report_remapping("before: char: %05X, alphabet: %s %s, lcgreek: %s, ucgreek: %s",char,alphabet,style,remapping[lc].what,remapping[uc].what)
end
local s = remapping[islc or isuc][style]
if s then
@@ -408,7 +414,7 @@ function mathematics.remap_alphabets(char,mathalphabet,mathgreek)
mathalphabet, style = data and data.attribute or mathalphabet, s
end
if trace_greek then
- logs.report("math","after : char: %05X, alphabet: %s %s, lcgreek: %s, ucgreek: %s",char,alphabet,style,remapping[lc].what,remapping[uc].what)
+ report_remapping("after : char: %05X, alphabet: %s %s, lcgreek: %s, ucgreek: %s",char,alphabet,style,remapping[lc].what,remapping[uc].what)
end
end
end
@@ -420,13 +426,13 @@ function mathematics.remap_alphabets(char,mathalphabet,mathgreek)
-- nothing to remap
elseif char >= 0x030 and char <= 0x039 then
local o = offset.digits
- newchar = (type(o) == "table" and (o[char] or char)) or (char - 0x030 + o)
+ newchar = o and ((type(o) == "table" and (o[char] or char)) or (char - 0x030 + o))
elseif char >= 0x041 and char <= 0x05A then
local o = offset.ucletters
- newchar = (type(o) == "table" and (o[char] or char)) or (char - 0x041 + o)
+ newchar = o and ((type(o) == "table" and (o[char] or char)) or (char - 0x041 + o))
elseif char >= 0x061 and char <= 0x07A then
local o = offset.lcletters
- newchar = (type(o) == "table" and (o[char] or char)) or (char - 0x061 + o)
+ newchar = o and ((type(o) == "table" and (o[char] or char)) or (char - 0x061 + o))
elseif islcgreek[char] then
newchar = offset.lcgreek[char]
elseif isucgreek[char] then
@@ -438,3 +444,20 @@ function mathematics.remap_alphabets(char,mathalphabet,mathgreek)
end
return nil
end
+
+local function checkedcopy(characters,child,parent)
+ for k, v in next, child do
+ if not characters[v] then
+ characters[v] = characters[parent[k]]
+ end
+ end
+end
+
+function mathematics.addfallbacks(main)
+ local characters = main.characters
+ local regular = alphabets.regular
+ checkedcopy(characters,regular.bf.ucgreek,regular.tf.ucgreek)
+ checkedcopy(characters,regular.bf.lcgreek,regular.tf.lcgreek)
+ checkedcopy(characters,regular.bi.ucgreek,regular.it.ucgreek)
+ checkedcopy(characters,regular.bi.lcgreek,regular.it.lcgreek)
+end
diff --git a/Master/texmf-dist/tex/context/base/math-noa.lua b/Master/texmf-dist/tex/context/base/math-noa.lua
index 02bbe0a6299..c298a8068ae 100644
--- a/Master/texmf-dist/tex/context/base/math-noa.lua
+++ b/Master/texmf-dist/tex/context/base/math-noa.lua
@@ -9,126 +9,132 @@ if not modules then modules = { } end modules ['math-noa'] = {
-- beware: this is experimental code and there will be a more
-- generic (attribute value driven) interface too but for the
-- moment this is ok
+--
+-- we will also make dedicated processors (faster)
+--
+-- beware: names will change as we wil make noads.xxx.handler i.e. xxx
+-- subnamespaces
local utf = unicode.utf8
-local set_attribute = node.set_attribute
-local has_attribute = node.has_attribute
-local mlist_to_hlist = node.mlist_to_hlist
-local font_of_family = node.family_font
-local fontdata = fonts.identifiers
-
-local format, rep = string.format, string.rep
local utfchar, utfbyte = utf.char, utf.byte
+local format, rep = string.format, string.rep
+local concat = table.concat
-noads = noads or { }
-
-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 noad_ord = 0
-local noad_op_displaylimits = 1
-local noad_op_limits = 2
-local noad_op_nolimits = 3
-local noad_bin = 4
-local noad_rel = 5
-local noad_open = 6
-local noad_close = 7
-local noad_punct = 8
-local noad_inner = 9
-local noad_under = 10
-local noad_over = 11
-local noad_vcenter = 12
-
--- obsolete:
---
--- math_ord = node.id("ord") -- attr nucleus sub sup
--- math_op = node.id("op") -- attr nucleus sub sup subtype
--- math_bin = node.id("bin") -- attr nucleus sub sup
--- math_rel = node.id("rel") -- attr nucleus sub sup
--- math_punct = node.id("punct") -- attr nucleus sub sup
---
--- math_open = node.id("open") -- attr nucleus sub sup
--- math_close = node.id("close") -- attr nucleus sub sup
---
--- math_inner = node.id("inner") -- attr nucleus sub sup
--- math_vcenter = node.id("vcenter") -- attr nucleus sub sup
--- math_under = node.id("under") -- attr nucleus sub sup
--- math_over = node.id("over") -- attr nucleus sub sup
-
-local math_noad = node.id("noad") -- attr nucleus sub sup
-
-local math_accent = node.id("accent") -- attr nucleus sub sup accent
-local math_radical = node.id("radical") -- attr nucleus sub sup left degree
-local math_fraction = node.id("fraction") -- attr nucleus sub sup left right
-
-local math_box = node.id("sub_box") -- attr list
-local math_sub = node.id("sub_mlist") -- attr list
-local math_char = node.id("math_char") -- attr fam char
-local math_text_char = node.id("math_text_char") -- attr fam char
-local math_delim = node.id("delim") -- attr small_fam small_char large_fam large_char
-local math_style = node.id("style") -- attr style
-local math_choice = node.id("choice") -- attr display text script scriptscript
-local math_fence = node.id("fence") -- attr subtype
-
-local simple_noads = table.tohash {
- math_noad,
-}
+local fonts, nodes, node, mathematics = fonts, nodes, node, mathematics
-local all_noads = {
- math_noad,
- math_box, math_sub,
- math_char, math_text_char, math_delim, math_style,
- math_accent, math_radical, math_fraction, math_choice, math_fence,
-}
+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 report_processing = logs.reporter("mathematics","processing")
+local report_remapping = logs.reporter("mathematics","remapping")
+local report_normalizing = logs.reporter("mathematics","normalizing")
-noads.processors = noads.processors or { }
+local set_attribute = node.set_attribute
+local has_attribute = node.has_attribute
+local mlist_to_hlist = node.mlist_to_hlist
+local font_of_family = node.family_font
-local function process(start,what,n)
+local fonthashes = fonts.hashes
+local fontdata = fonthashes.identifiers
+
+noads = noads or { } -- todo: only here
+local noads = noads
+
+noads.processors = noads.processors or { }
+local processors = noads.processors
+
+noads.handlers = noads.handlers or { }
+local handlers = noads.handlers
+
+local tasks = nodes.tasks
+
+local nodecodes = nodes.nodecodes
+local noadcodes = nodes.noadcodes
+
+local noad_ord = noadcodes.ord
+local noad_rel = noadcodes.rel
+local noad_punct = noadcodes.punct
+
+local math_noad = nodecodes.noad -- attr nucleus sub sup
+local math_accent = nodecodes.accent -- attr nucleus sub sup accent
+local math_radical = nodecodes.radical -- attr nucleus sub sup left degree
+local math_fraction = nodecodes.fraction -- attr nucleus sub sup left right
+local math_box = nodecodes.subbox -- attr list
+local math_sub = nodecodes.submlist -- attr list
+local math_char = nodecodes.mathchar -- attr fam char
+local math_textchar = nodecodes.mathtextchar -- attr fam char
+local math_delim = nodecodes.delim -- attr small_fam small_char large_fam large_char
+local math_style = nodecodes.style -- attr style
+local math_choice = nodecodes.choice -- attr display text script scriptscript
+local math_fence = nodecodes.fence -- attr subtype
+
+local left_fence_code = 1
+
+local function process(start,what,n,parent)
if n then n = n + 1 else n = 0 end
while start do
+ local id = start.id
if trace_processing then
- logs.report("math","%s%s",rep(" ",n or 0),tostring(start))
+ local margin = rep(" ",n or 0)
+ local detail = tostring(start)
+ if id == math_noad then
+ report_processing("%s%s (class: %s)",margin,detail,noadcodes[start.subtype] or "?")
+ elseif id == math_char then
+ local char = start.char
+ local fam = start.fam
+ local font = font_of_family(fam)
+ report_processing("%s%s (family: %s, font: %s, char: %s, shape: %s)",margin,detail,fam,font,char,utfchar(char))
+ else
+ report_processing("%s%s",margin,detail)
+ end
end
- local id = start.id
local proc = what[id]
if proc then
- proc(start,what,n)
- elseif id == math_char or id == math_text_char or id == math_delim then
+ local done, newstart = proc(start,what,n,parent or start.prev)
+ if newstart then
+ start = newstart
+ end
+ elseif id == math_char or id == math_textchar or id == math_delim then
break
elseif id == math_style then
-- has a next
elseif id == math_noad then
- local noad = start.nucleus if noad then process(noad,what,n) end -- list
- noad = start.sup if noad then process(noad,what,n) end -- list
- noad = start.sub if noad then process(noad,what,n) end -- list
+ local noad = start.nucleus if noad then process(noad,what,n,start) end -- list
+ noad = start.sup if noad then process(noad,what,n,start) end -- list
+ noad = start.sub if noad then process(noad,what,n,start) end -- list
elseif id == math_box or id == math_sub then
- local noad = start.list if noad then process(noad,what,n) end -- list
+ local noad = start.list if noad then process(noad,what,n,start) end -- list
elseif id == math_fraction then
- local noad = start.num if noad then process(noad,what,n) end -- list
- noad = start.denom if noad then process(noad,what,n) end -- list
- noad = start.left if noad then process(noad,what,n) end -- delimiter
- noad = start.right if noad then process(noad,what,n) end -- delimiter
+ local noad = start.num if noad then process(noad,what,n,start) end -- list
+ noad = start.denom if noad then process(noad,what,n,start) end -- list
+ noad = start.left if noad then process(noad,what,n,start) end -- delimiter
+ noad = start.right if noad then process(noad,what,n,start) end -- delimiter
elseif id == math_choice then
- local noad = start.display if noad then process(noad,what,n) end -- list
- noad = start.text if noad then process(noad,what,n) end -- list
- noad = start.script if noad then process(noad,what,n) end -- list
- noad = start.scriptscript if noad then process(noad,what,n) end -- list
+ local noad = start.display if noad then process(noad,what,n,start) end -- list
+ noad = start.text if noad then process(noad,what,n,start) end -- list
+ noad = start.script if noad then process(noad,what,n,start) end -- list
+ noad = start.scriptscript if noad then process(noad,what,n,start) end -- list
elseif id == math_fence then
- local noad = start.delim if noad then process(noad,what,n) end -- delimiter
+ local noad = start.delim if noad then process(noad,what,n,start) end -- delimiter
elseif id == math_radical then
- local noad = start.nucleus if noad then process(noad,what,n) end -- list
- noad = start.sup if noad then process(noad,what,n) end -- list
- noad = start.sub if noad then process(noad,what,n) end -- list
- noad = start.left if noad then process(noad,what,n) end -- delimiter
- noad = start.degree if noad then process(noad,what,n) end -- list
+ local noad = start.nucleus if noad then process(noad,what,n,start) end -- list
+ noad = start.sup if noad then process(noad,what,n,start) end -- list
+ noad = start.sub if noad then process(noad,what,n,start) end -- list
+ noad = start.left if noad then process(noad,what,n,start) end -- delimiter
+ noad = start.degree if noad then process(noad,what,n,start) end -- list
elseif id == math_accent then
- local noad = start.nucleus if noad then process(noad,what,n) end -- list
- noad = start.sup if noad then process(noad,what,n) end -- list
- noad = start.sub if noad then process(noad,what,n) end -- list
- noad = start.accent if noad then process(noad,what,n) end -- list
- noad = start.bot_accent if noad then process(noad,what,n) end -- list
+ local noad = start.nucleus if noad then process(noad,what,n,start) end -- list
+ noad = start.sup if noad then process(noad,what,n,start) end -- list
+ noad = start.sub if noad then process(noad,what,n,start) end -- list
+ noad = start.accent if noad then process(noad,what,n,start) end -- list
+ noad = start.bot_accent if noad then process(noad,what,n,start) end -- list
else
-- glue, penalty, etc
end
@@ -143,16 +149,16 @@ noads.process = process
local mathalphabet = attributes.private("mathalphabet")
local mathgreek = attributes.private("mathgreek")
-noads.processors.relocate = { }
+processors.relocate = { }
local function report_remap(tag,id,old,new,extra)
- logs.report("math","remapping %s in font %s from U+%04X (%s) to U+%04X (%s)%s",tag,id,old,utfchar(old),new,utfchar(new),extra or "")
+ report_remapping("remapping %s in font %s from U+%05X (%s) to U+%05X (%s)%s",tag,id,old,utfchar(old),new,utfchar(new),extra or "")
end
-local remap_alphabets = mathematics.remap_alphabets
-local fcs = fonts.color.set
+local remapalphabets = mathematics.remapalphabets
+local setnodecolor = nodes.tracers.colors.set
--- we can have a global famdata == fonts.famdata and chrdata == fonts.chrdata
+-- we can have a global famdata == fonts.famdata
--~ This does not work out well, as there are no fallbacks. Ok, we could
--~ define a poor mans simplify mechanism.
@@ -171,7 +177,7 @@ local fcs = fonts.color.set
--~ report_remap("fallback",id,char,newchar)
--~ end
--~ if trace_analyzing then
---~ fcs(pointer,"font:isol")
+--~ setnodecolor(pointer,"font:isol")
--~ end
--~ pointer.char = newchar
--~ return true
@@ -179,7 +185,9 @@ local fcs = fonts.color.set
--~ end
--~ end
-noads.processors.relocate[math_char] = function(pointer)
+local current_id, current_characters
+
+processors.relocate[math_char] = function(pointer)
local g = has_attribute(pointer,mathgreek) or 0
local a = has_attribute(pointer,mathalphabet) or 0
if a > 0 or g > 0 then
@@ -190,17 +198,24 @@ noads.processors.relocate[math_char] = function(pointer)
set_attribute(pointer,mathalphabet,0)
end
local char = pointer.char
- local newchar = remap_alphabets(char,a,g)
+ local newchar = remapalphabets(char,a,g)
if newchar then
local fam = pointer.fam
local id = font_of_family(fam)
+ --
local tfmdata = fontdata[id]
- if tfmdata and tfmdata.characters[newchar] then -- we could probably speed this up
+ if tfmdata and tfmdata.characters[newchar] then
+ -- -- to be tested:
+ -- if id ~= current_id then
+ -- current_id = id
+ -- current_characters = fontdata[id].characters
+ -- end
+ -- if current_characters and current_characters[newchar] then
if trace_remapping then
report_remap("char",id,char,newchar)
end
if trace_analyzing then
- fcs(pointer,"font:isol")
+ setnodecolor(pointer,"font:isol")
end
pointer.char = newchar
return true
@@ -214,24 +229,24 @@ noads.processors.relocate[math_char] = function(pointer)
-- return checked(pointer)
end
if trace_analyzing then
- fcs(pointer,"font:medi")
+ setnodecolor(pointer,"font:medi")
end
end
-noads.processors.relocate[math_text_char] = function(pointer)
+processors.relocate[math_textchar] = function(pointer)
if trace_analyzing then
- fcs(pointer,"font:init")
+ setnodecolor(pointer,"font:init")
end
end
-noads.processors.relocate[math_delim] = function(pointer)
+processors.relocate[math_delim] = function(pointer)
if trace_analyzing then
- fcs(pointer,"font:fina")
+ setnodecolor(pointer,"font:fina")
end
end
-function noads.relocate_characters(head,style,penalties)
- process(head,noads.processors.relocate)
+function handlers.relocate(head,style,penalties)
+ process(head,processors.relocate)
return true
end
@@ -247,10 +262,10 @@ end
local mathsize = attributes.private("mathsize")
-noads.processors.resize = { }
+local resize = { } processors.resize = resize
-noads.processors.resize[math_fence] = function(pointer)
- if pointer.subtype == 1 then -- left
+resize[math_fence] = function(pointer)
+ if pointer.subtype == left_fence_code then
local a = has_attribute(pointer,mathsize)
if a and a > 0 then
set_attribute(pointer,mathsize,0)
@@ -265,8 +280,8 @@ noads.processors.resize[math_fence] = function(pointer)
end
end
-function noads.resize_characters(head,style,penalties)
- process(head,noads.processors.resize)
+function handlers.resize(head,style,penalties)
+ process(head,resize)
return true
end
@@ -274,13 +289,13 @@ end
local mathpunctuation = attributes.private("mathpunctuation")
-noads.processors.respace = { }
+local respace = { } processors.respace = respace
local chardata = characters.data
-- only [nd,ll,ul][po][nd,ll,ul]
-noads.processors.respace[math_noad] = function(pointer)
+respace[math_noad] = function(pointer)
if pointer.subtype == noad_ord then
local a = has_attribute(pointer,mathpunctuation)
if a and a > 0 then
@@ -327,40 +342,283 @@ noads.processors.respace[math_noad] = function(pointer)
end
end
+function handlers.respace(head,style,penalties)
+ process(head,respace)
+ return true
+end
-function noads.respace_characters(head,style,penalties)
- noads.process(head,noads.processors.respace)
+-- The following code is dedicated to Luigi Scarso who pointed me
+-- to the fact that \not= is not producing valid pdf-a code.
+-- The code does not solve this for virtual characters but it does
+-- a decent job on collapsing so that fonts that have the right
+-- glyph will have a decent unicode point.
+
+local collapse = { } processors.collapse = collapse
+
+local mathpairs = characters.mathpairs
+
+collapse[math_noad] = function(pointer)
+ if pointer.subtype == noad_rel then
+ local current_nucleus = pointer.nucleus
+ if current_nucleus.id == math_char then
+ local current_char = current_nucleus.char
+ local mathpair = mathpairs[current_char]
+ if mathpair then
+ local next_noad = pointer.next
+ if next_noad and next_noad.id == math_noad and next_noad.subtype == noad_rel then
+ local next_nucleus = next_noad.nucleus
+ if next_nucleus.id == math_char then
+ local next_char = next_nucleus.char
+ local newchar = mathpair[next_char]
+ if newchar then
+ local fam = current_nucleus.fam
+ local id = font_of_family(fam)
+ local tfmdata = fontdata[id]
+ if tfmdata and tfmdata.characters[newchar] then
+ -- print("!!!!!",current_char,next_char,newchar)
+ current_nucleus.char = newchar
+ local next_next_noad = next_noad.next
+ if next_next_noad then
+ pointer.next = next_next_noad
+ next_next_noad.prev = pointer
+ else
+ pointer.next = nil
+ end
+ node.free(next_noad)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+function noads.handlers.collapse(head,style,penalties)
+ process(head,collapse)
+ return true
+end
+
+-- normalize scripts
+
+local unscript = { } noads.processors.unscript = unscript
+
+local superscripts = characters.superscripts
+local subscripts = characters.subscripts
+
+local replaced = { }
+
+local function replace(pointer)
+ local next = pointer.next
+ local start_super, stop_super, start_sub, stop_sub
+ local mode = "unset"
+ while next and next.id == math_noad do
+ local nextnucleus = next.nucleus
+ if nextnucleus and nextnucleus.id == math_char and not next.sub and not next.sup then
+ local char = nextnucleus.char
+ local s = superscripts[char]
+ if s then
+ if not start_super then
+ start_super = next
+ mode = "super"
+ elseif mode == "sub" then
+ break
+ end
+ stop_super = next
+ next = next.next
+ nextnucleus.char = s
+ replaced[char] = (replaced[char] or 0) + 1
+ if trace_normalizing then
+ report_normalizing("superscript: U+05X (%s) => U+05X (%s)",char,utfchar(char),s,utfchar(s))
+ end
+ else
+ local s = subscripts[char]
+ if s then
+ if not start_sub then
+ start_sub = next
+ mode = "sub"
+ elseif mode == "super" then
+ break
+ end
+ stop_sub = next
+ next = next.next
+ nextnucleus.char = s
+ replaced[char] = (replaced[char] or 0) + 1
+ if trace_normalizing then
+ report_normalizing("subscript: U+05X (%s) => U+05X (%s)",char,utfchar(char),s,utfchar(s))
+ end
+ else
+ break
+ end
+ end
+ else
+ break
+ end
+ end
+ if start_super then
+ if start_super == stop_super then
+ pointer.sup = start_super.nucleus
+ else
+ local list = node.new(math_sub) -- todo attr
+ list.head = start_super
+ pointer.sup = list
+ end
+ if mode == "super" then
+ pointer.next = stop_super.next
+ end
+ stop_super.next = nil
+ end
+ if start_sub then
+ if start_sub == stop_sub then
+ pointer.sub = start_sub.nucleus
+ else
+ local list = node.new(math_sub) -- todo attr
+ list.head = start_sub
+ pointer.sub = list
+ end
+ if mode == "sub" then
+ pointer.next = stop_sub.next
+ end
+ stop_sub.next = nil
+ end
+end
+
+ unscript[math_noad] = replace
+-- unscript[math_accent] = replace
+-- unscript[math_radical] = replace
+-- unscript[math_fraction] = replace
+
+function handlers.unscript(head,style,penalties)
+ process(head,unscript)
+ return true
+end
+
+statistics.register("math script replacements", function()
+ if next(replaced) then
+ local n, t = 0, { }
+ for k, v in table.sortedpairs(replaced) do
+ n = n + v
+ t[#t+1] = format("U+%05X:%s",k,utfchar(k))
+ end
+ return format("%s (n=%s)",concat(t," "),n)
+ end
+end)
+
+-- math alternates: (in xits lgf: $ABC$ $\cal ABC$ $\mathalternate{cal}\cal ABC$)
+
+local function initializemathalternates(tfmdata)
+ local goodies = tfmdata.goodies
+ if goodies then
+ local shared = tfmdata.shared
+ for i=1,#goodies do
+ -- first one counts
+ -- we can consider sharing the attributes ... todo (only once scan)
+ local mathgoodies = goodies[i].mathematics
+ local alternates = mathgoodies and mathgoodies.alternates
+ if alternates then
+ local lastattribute, attributes = 0, { }
+ for k, v in next, alternates do
+ lastattribute = lastattribute + 1
+ v.attribute = lastattribute
+ attributes[lastattribute] = v
+ end
+ shared.mathalternates = alternates -- to be checked if shared is ok here
+ shared.mathalternatesattributes = attributes -- to be checked if shared is ok here
+ return
+ end
+ end
+ end
+end
+
+registerotffeature {
+ name = "mathalternates",
+ description = "additional math alternative shapes",
+ initializers = {
+ base = initializemathalternates,
+ node = initializemathalternates,
+ }
+}
+
+local getalternate = otf.getalternate
+
+local mathalternate = attributes.private("mathalternate")
+
+local alternate = { } -- processors.alternate = alternate
+
+function mathematics.setalternate(fam,tag)
+ local id = font_of_family(fam)
+ local tfmdata = fontdata[id]
+ local mathalternates = tfmdata.shared.mathalternates
+ if mathalternates then
+ local m = mathalternates[tag]
+ tex.attribute[mathalternate] = m and m.attribute or attributes.unsetvalue
+ end
+end
+
+alternate[math_char] = function(pointer)
+ local a = has_attribute(pointer,mathalternate)
+ if a and a > 0 then
+ set_attribute(pointer,mathalternate,0)
+ local tfmdata = fontdata[font_of_family(pointer.fam)] -- we can also have a famdata
+ local mathalternatesattributes = tfmdata.shared.mathalternatesattributes
+ if mathalternatesattributes then
+ local what = mathalternatesattributes[a]
+ local alt = getalternate(tfmdata,pointer.char,what.feature,what.value)
+ if alt then
+ pointer.char = alt
+ end
+ end
+ end
+end
+
+function handlers.check(head,style,penalties)
+ process(head,alternate)
return true
end
-- the normal builder
-function noads.mlist_to_hlist(head,style,penalties)
+function builders.kernel.mlist_to_hlist(head,style,penalties)
return mlist_to_hlist(head,style,penalties), true
end
-tasks.new (
- "math",
- {
+--~ function builders.kernel.mlist_to_hlist(head,style,penalties)
+--~ print("!!!!!!! BEFORE",penalties)
+--~ for n in node.traverse(head) do print(n) end
+--~ print("!!!!!!!")
+--~ head = mlist_to_hlist(head,style,penalties)
+--~ print("!!!!!!! AFTER")
+--~ for n in node.traverse(head) do print(n) end
+--~ print("!!!!!!!")
+--~ return head, true
+--~ end
+
+tasks.new {
+ name = "math",
+ arguments = 2,
+ sequence = {
"before",
"normalizers",
"builders",
"after",
}
-)
+}
+
+tasks.freezegroup("math", "normalizers") -- experimental
+tasks.freezegroup("math", "builders") -- experimental
-local actions = tasks.actions("math",2) -- head, style, penalties
+local actions = tasks.actions("math") -- head, style, penalties
local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
-function nodes.processors.mlist_to_hlist(head,style,penalties)
+function processors.mlist_to_hlist(head,style,penalties)
starttiming(noads)
local head, done = actions(head,style,penalties)
stoptiming(noads)
return head, done
end
-callbacks.register('mlist_to_hlist',nodes.processors.mlist_to_hlist,"preprocessing math list")
+callbacks.register('mlist_to_hlist',processors.mlist_to_hlist,"preprocessing math list")
-- tracing
diff --git a/Master/texmf-dist/tex/context/base/math-pln.mkiv b/Master/texmf-dist/tex/context/base/math-pln.mkiv
index ab584f10a32..6deac5efb9e 100644
--- a/Master/texmf-dist/tex/context/base/math-pln.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-pln.mkiv
@@ -59,8 +59,8 @@
\cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
\mkern-7mu\smash-$}
-\let\sp=^ % will become obsolete
-\let\sb=_ % will become obsolete
+% \let\sp=^ % obsolete
+% \let\sb=_ % obsolete
\ifx\,\undefined \def\,{\mskip \thinmuskip } \fi
\ifx\>\undefined \def\>{\mskip \medmuskip } \fi
@@ -68,27 +68,27 @@
\ifx\!\undefined \def\!{\mskip-\thinmuskip } \fi
\ifx\*\undefined \def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}} \fi
-% {\catcode`\'=\active \gdef'{^\bgroup\prim@s}}
+{ \catcode\circumflexasciicode\othercatcode \global\let\othercircumflextoken ^ }
+{ \catcode\circumflexasciicode\superscriptcatcode \global\let\superscriptcircumflextoken^ }
-\def\activemathquote{^\bgroup\prim@s}
+\def\domathprime{^\bgroup\dodomathprime}
-\def\prim@s
- {\prime\futurelet\next\pr@m@s}
+\def\dodomathprime
+ {\prime\futurelet\nexttoken\dododomathprime}
-\def\pr@m@s
- {\ifx'\next
- \@EA\pr@@@s
- \else\ifx^\next
- \@EAEAEA\pr@@@t
- \else
- \@EAEAEA\egroup
- \fi\fi}
+\def\dododomathprime
+ {\csname domathprime@%
+ \ifx '\nexttoken a\else
+ \ifx\superscriptcircumflextoken\nexttoken b\else
+ \ifx\othercircumflextoken \nexttoken b\else
+ c\fi\fi\fi
+ \endcsname}
-\def\pr@@@s#1%
- {\prim@s}
+\def\domathprime@a #1{\dodomathprime}
+\def\domathprime@b#1#2{#2\egroup}
+\def\domathprime@c {\egroup}
-\def\pr@@@t#1#2%
- {#2\egroup}
+\let\activemathprime\domathprime
% {\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_
@@ -173,7 +173,7 @@
\right.}
\def\matrix#1%
- {\null
+ {\emptyhbox
\,%
\vcenter
{\normalbaselines\mathsurround\zeropoint
@@ -206,7 +206,7 @@
{$\kern\wd\plusone\kern-\mathparentwd\left(\kern-\wd\plusone
\global\setbox\plusone\vbox{\box\plusone\kern2\points}%
\vcenter{\kern-\ht\plusone\unvbox\zerocount\kern-\baselineskip}\,\right)$}%
- \null
+ \emptyhbox
\;%
\vbox{\kern\ht\plusone\box\plustwo}%
\endgroup}
@@ -230,7 +230,7 @@
\def\displayopenupvalue{.25\bodyfontsize}
\def\eqalign#1%
- {\null
+ {\emptyhbox
\,%
\vcenter
{\openup\displayopenupvalue % was \openup\jot
@@ -282,17 +282,6 @@
% \appendtoks \setcatcodetable\mthcatcodes \to \everymath : spoils xml
-% tricky, but some day we will reimplement math
-
-\bgroup
- \catcode`\_ = 13
- \catcode`\' = 13
- \doglobal\appendtoks
- \let_\activemathunderscore
- \let'\activemathquote
- \to \everymathematics
-\egroup
-
% so far
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/math-scr.mkiv b/Master/texmf-dist/tex/context/base/math-scr.mkiv
index eb1db4714e3..e17ce42f375 100644
--- a/Master/texmf-dist/tex/context/base/math-scr.mkiv
+++ b/Master/texmf-dist/tex/context/base/math-scr.mkiv
@@ -15,68 +15,6 @@
\unprotect
-%D \macros
-%D {super, sub}
-%D
-%D \TEX\ uses \type{^} and \type{_} for entering super- and
-%D subscript mode. We want however a bit more control than
-%D normally provided, and therefore provide \type {\super}
-%D and \type{sub}.
-%D
-%D The grid snapping has been removed.
-
-\global\let\normalsuper=^
-\global\let\normalsuber=_
-
-\ifdefined\supersubmode \else \newcount\supersubmode \fi
-\ifdefined\newevery \else \everysupersub \EverySuperSub \fi
-
-\appendtoks \advance\supersubmode \plusone \to \everysupersub
-
-\setuptextformulas
- [\c!size=\v!normal]
-
-\def\normalsupsub#1#2%
- {^{\the\everysupersub#1}_{\the\everysupersub#2}}
-
-\def\super#1{^{\the\everysupersub#1}}
-\def\suber#1{_{\the\everysupersub#1}}
-\def\supsub#1#2{\super{#1}\suber{#2}}
-\def\subsup#1#2{\suber{#1}\super{#2}}
-
-%D \macros
-%D {enablesupersub,enablesimplesupersub}
-%D
-%D We can let \type {^} and \type {_} act like \type {\super}
-%D and \type {\sub} by saying \type {\enablesupersub}.
-
-\bgroup
-\catcode`\^=\@@active
-\catcode`\_=\@@active
-\gdef\enablesupersub
- {\catcode`\^=\@@active
- \def^{\ifmmode\expandafter\super\else\expandafter\normalsuper\fi}%
- \catcode`\_=\@@active
- \def_{\ifmmode\expandafter\suber\else\expandafter\normalsuber\fi}}
-\egroup
-
-%D \macros
-%D {restoremathstyle}
-%D
-%D We can pick up the current math style by calling \type
-%D {\restoremathstyle}.
-
-\def\restoremathstyle
- {\ifmmode
- \ifcase\supersubmode
- \textstyle
- \or
- \scriptstyle
- \else
- \scriptscriptstyle
- \fi
- \fi}
-
%D These macros were first needed by Frits Spijker (also
%D known as Gajes) for typesetting the minus sign that is
%D keyed into scientific calculators.
@@ -132,4 +70,7 @@
%D How negative such a symbol looks is demonstrated in:
%D $\negative 10^{\negative 10^{\negative 10}}$.
+\setuptextformulas % why here
+ [\c!size=\v!normal]
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/math-tag.lua b/Master/texmf-dist/tex/context/base/math-tag.lua
new file mode 100644
index 00000000000..e5ad30be06e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/math-tag.lua
@@ -0,0 +1,252 @@
+if not modules then modules = { } end modules ['math-tag'] = {
+ version = 1.001,
+ comment = "companion to math-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local attributes, nodes = attributes, nodes
+
+local get_attribute = nodes.getattribute
+local set_attribute = nodes.setattribute
+local set_attributes = nodes.setattributes
+local traverse_nodes = node.traverse
+
+local nodecodes = nodes.nodecodes
+
+local math_noad_code = nodecodes.noad -- attr nucleus sub sup
+local math_accent_code = nodecodes.accent -- attr nucleus sub sup accent
+local math_radical_code = nodecodes.radical -- attr nucleus sub sup left degree
+local math_fraction_code = nodecodes.fraction -- attr nucleus sub sup left right
+local math_box_code = nodecodes.subbox -- attr list
+local math_sub_code = nodecodes.submlist -- attr list
+local math_char_code = nodecodes.mathchar -- attr fam char
+local math_textchar_code = nodecodes.mathtextchar -- attr fam char
+local math_delim_code = nodecodes.delim -- attr small_fam small_char large_fam large_char
+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 hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local glyph_code = nodecodes.glyph
+
+local a_tagged = attributes.private('tagged')
+
+local tags = structures.tags
+
+local start_tagged = tags.start
+local stop_tagged = tags.stop
+local taglist = tags.taglist
+
+local chardata = characters.data
+
+local process
+
+local function processsubsup(start)
+ local nucleus, sup, sub = start.nucleus, start.sup, start.sub
+ if sub then
+ if sup then
+ set_attribute(start,a_tagged,start_tagged("msubsup"))
+ process(nucleus)
+ process(sup)
+ process(sub)
+ stop_tagged()
+ else
+ set_attribute(start,a_tagged,start_tagged("msub"))
+ process(nucleus)
+ process(sub)
+ stop_tagged()
+ end
+ elseif sup then
+ set_attribute(start,a_tagged,start_tagged("msup"))
+ process(nucleus)
+ process(sup)
+ stop_tagged()
+ else
+ process(nucleus)
+ end
+end
+
+process = function(start) -- we cannot use the processor as we have no finalizers (yet)
+ while start do
+ local id = start.id
+ if id == math_char_code then
+ -- check for code
+ local ch = chardata[start.char]
+ local mc = ch and ch.mathclass
+ if mc == "number" then
+ set_attribute(start,a_tagged,start_tagged("mn"))
+ elseif mc == "variable" or not mc then -- variable is default
+ set_attribute(start,a_tagged,start_tagged("mi"))
+ else
+ set_attribute(start,a_tagged,start_tagged("mo"))
+ end
+ stop_tagged()
+ break
+ elseif id == math_textchar_code then
+ -- check for code
+ set_attribute(start,a_tagged,start_tagged("ms"))
+ stop_tagged()
+ break
+ elseif id == math_delim_code then
+ -- check for code
+ set_attribute(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 = get_attribute(start,a_tagged)
+ local text = start_tagged("mtext")
+ set_attribute(start,a_tagged,text)
+ local list = start.list
+ if not list then
+ -- empty list
+ elseif not attr then
+ -- box comes from strange place
+ set_attributes(list,a_tagged,text)
+ 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 = n.id
+ if id == hlist_code or id == vlist_code then
+ runner(n.list)
+ elseif id == glyph_code then
+ local aa = get_attribute(n,a_tagged) -- only glyph needed
+ 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 = start_tagged(tagdata[i]) -- can be made faster
+ end
+ for i=common,extra do
+ stop_tagged() -- can be made faster
+ end
+ else
+ ac = text
+ end
+ cache[aa] = ac
+ end
+ set_attribute(n,a_tagged,ac)
+ else
+ set_attribute(n,a_tagged,text)
+ end
+ end
+ end
+ end
+ runner(list)
+ end
+ stop_tagged()
+ elseif id == math_sub_code then
+ local list = start.list
+ if list then
+ set_attribute(start,a_tagged,start_tagged("mrow"))
+ process(list)
+ stop_tagged()
+ end
+ elseif id == math_fraction_code then
+ local num, denom, left, right = start.num, start.denom, start.left, start.right
+ if left then
+ set_attribute(left,a_tagged,start_tagged("mo"))
+ process(left)
+ stop_tagged()
+ end
+ set_attribute(start,a_tagged,start_tagged("mfrac"))
+ process(num)
+ process(denom)
+ stop_tagged()
+ if right then
+ set_attribute(right,a_tagged,start_tagged("mo"))
+ process(right)
+ stop_tagged()
+ end
+ elseif id == math_choice_code then
+ local display, text, script, scriptscript = start.display, start.text, start.script, 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 = start.delim
+ if delim then
+ set_attribute(start,a_tagged,start_tagged("mo"))
+ process(delim)
+ stop_tagged()
+ end
+ elseif id == math_radical_code then
+ local left, degree = start.left, start.degree
+ if left then
+ process(left) -- mrow needed ?
+ end
+ if degree then
+ set_attribute(start,a_tagged,start_tagged("mroot"))
+ processsubsup(start)
+ process(degree)
+ stop_tagged()
+ else
+ set_attribute(start,a_tagged,start_tagged("msqrt"))
+ processsubsup(start)
+ stop_tagged()
+ end
+ elseif id == math_accent_code then
+ local accent, bot_accent = start.accent, start.bot_accent
+ if bot_accent then
+ if accent then
+ set_attribute(start,a_tagged,start_tagged("munderover"))
+ process(accent)
+ processsubsup(start)
+ process(bot_accent)
+ stop_tagged()
+ else
+ set_attribute(start,a_tagged,start_tagged("munder"))
+ processsubsup(start)
+ process(bot_accent)
+ stop_tagged()
+ end
+ elseif accent then
+ set_attribute(start,a_tagged,start_tagged("mover"))
+ process(accent)
+ processsubsup(start)
+ stop_tagged()
+ else
+ processsubsup(start)
+ end
+ else
+ set_attribute(start,a_tagged,start_tagged("merror"))
+ stop_tagged()
+ end
+ start = start.next
+ end
+end
+
+function noads.handlers.tags(head,style,penalties)
+ set_attribute(head,a_tagged,start_tagged("math"))
+ set_attribute(head,a_tagged,start_tagged("mrow"))
+ process(head)
+ stop_tagged()
+ stop_tagged()
+ return true
+end
diff --git a/Master/texmf-dist/tex/context/base/math-vfu.lua b/Master/texmf-dist/tex/context/base/math-vfu.lua
index 5023e6b4d65..49bf00ffe92 100644
--- a/Master/texmf-dist/tex/context/base/math-vfu.lua
+++ b/Master/texmf-dist/tex/context/base/math-vfu.lua
@@ -11,42 +11,52 @@ if not modules then modules = { } end modules ['math-vfu'] = {
-- characters report it to the ConTeXt mailing list.
local type, next = type, next
+local max = math.max
+
+local fonts, nodes, mathematics = fonts, nodes, mathematics
local trace_virtual = false trackers.register("math.virtual", function(v) trace_virtual = v end)
local trace_timings = false trackers.register("math.timings", function(v) trace_timings = v end)
-fonts.enc.math = fonts.enc.math or { }
+local report_virtual = logs.reporter("fonts","virtual math")
-local shared = { }
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
-fonts.vf.math = fonts.vf.math or { }
-fonts.vf.math.optional = false
+local mathencodings = allocate()
+fonts.encodings.math = mathencodings -- better is then: fonts.encodings.vectors
+local vfmath = allocate()
+fonts.handlers.vf.math = vfmath
-local push, pop, back = { "push" }, { "pop" }, { "slot", 1, 0x2215 }
+vfmath.optional = false
-local function negate(main,characters,id,size,unicode,basecode)
- if not characters[unicode] then
- local basechar = characters[basecode]
- if basechar then
- local ht, wd = basechar.height, basechar.width
- characters[unicode] = {
- width = wd,
- height = ht,
- depth = basechar.depth,
- italic = basechar.italic,
- kerns = basechar.kerns,
- commands = {
- { "slot", 1, basecode },
- push,
- { "down", ht/5},
- { "right", - wd/2},
- back,
- push,
- }
- }
- end
- end
-end
+local shared = { }
+
+--~ local push, pop, back = { "push" }, { "pop" }, { "slot", 1, 0x2215 }
+
+--~ local function negate(main,characters,id,size,unicode,basecode)
+--~ if not characters[unicode] then
+--~ local basechar = characters[basecode]
+--~ if basechar then
+--~ local ht, wd = basechar.height, basechar.width
+--~ characters[unicode] = {
+--~ width = wd,
+--~ height = ht,
+--~ depth = basechar.depth,
+--~ italic = basechar.italic,
+--~ kerns = basechar.kerns,
+--~ commands = {
+--~ { "slot", 1, basecode },
+--~ push,
+--~ { "down", ht/5},
+--~ { "right", - wd/2},
+--~ back,
+--~ push,
+--~ }
+--~ }
+--~ end
+--~ end
+--~ end
--~ \Umathchardef\braceld="0 "1 "FF07A
--~ \Umathchardef\bracerd="0 "1 "FF07B
@@ -69,20 +79,19 @@ local function brace(main,characters,id,size,unicode,first,rule,left,right,rule,
end
local function arrow(main,characters,id,size,unicode,arrow,minus,isleft)
- if characters[unicode] then
- if isleft then
- t = {
- { extender = 0, glyph = arrow },
- { extender = 1, glyph = minus },
- }
- else
- t = {
- { extender = 0, glyph = minus },
- { extender = 1, glyph = arrow },
- }
- end
- --~ main.characters[unicode] = { horiz_variants = t }
- characters[unicode].horiz_variants = t
+ local chr = characters[unicode]
+ if not chr then
+ -- skip
+ elseif isleft then
+ chr.horiz_variants = {
+ { extender = 0, glyph = arrow },
+ { extender = 1, glyph = minus },
+ }
+ else
+ chr.horiz_variants = {
+ { extender = 0, glyph = minus },
+ { extender = 1, glyph = arrow },
+ }
end
end
@@ -226,172 +235,312 @@ local function vertbar(main,characters,id,size,parent,scale,unicode)
end
end
-function fonts.vf.math.alas(main,id,size)
- local characters = main.characters
- for i=0x7A,0x7D do
- make(main,characters,id,size,i,1)
+local function jointwo(main,characters,id,size,unicode,u1,d12,u2)
+ local c1, c2 = characters[u1], characters[u2]
+ if c1 and c2 then
+ local w1, w2 = c1.width, c2.width
+ local mu = size/18
+ characters[unicode] = {
+ width = w1 + w2 - d12*mu,
+ height = max(c1.height or 0, c2.height or 0),
+ depth = max(c1.depth or 0, c2.depth or 0),
+ commands = {
+ { "slot", id, u1 },
+ { "right", -d12*mu } ,
+ { "slot", id, u2 },
+ }
+ }
end
- brace (main,characters,id,size,0x23DE,0xFF17A,0xFF301,0xFF17D,0xFF17C,0xFF301,0xFF17B)
- brace (main,characters,id,size,0x23DF,0xFF27C,0xFF401,0xFF27B,0xFF27A,0xFF401,0xFF27D)
- parent (main,characters,id,size,0x23DC,0xFF17A,0xFF301,0xFF17B)
- parent (main,characters,id,size,0x23DD,0xFF27C,0xFF401,0xFF27D)
- negate (main,characters,id,size,0x2260,0x003D)
- dots (main,characters,id,size,0x2026) -- ldots
- dots (main,characters,id,size,0x22EE) -- vdots
- dots (main,characters,id,size,0x22EF) -- cdots
- dots (main,characters,id,size,0x22F1) -- ddots
- dots (main,characters,id,size,0x22F0) -- udots
- minus (main,characters,id,size,0xFF501)
- arrow (main,characters,id,size,0x2190,0xFE190,0xFF501,true) -- left
- arrow (main,characters,id,size,0x2192,0xFE192,0xFF501,false) -- right
- vertbar(main,characters,id,size,0x0007C,0.10,0xFF601) -- big : 0.85 bodyfontsize
- vertbar(main,characters,id,size,0xFF601,0.30,0xFF602) -- Big : 1.15 bodyfontsize
- vertbar(main,characters,id,size,0xFF602,0.30,0xFF603) -- bigg : 1.45 bodyfontsize
- vertbar(main,characters,id,size,0xFF603,0.30,0xFF604) -- Bigg : 1.75 bodyfontsize
- vertbar(main,characters,id,size,0x02225,0.10,0xFF605)
- vertbar(main,characters,id,size,0xFF605,0.30,0xFF606)
- vertbar(main,characters,id,size,0xFF606,0.30,0xFF607)
- vertbar(main,characters,id,size,0xFF607,0.30,0xFF608)
end
-local unique = 0 -- testcase: \startTEXpage \math{!\text{-}\text{-}\text{-}} \stopTEXpage
-
-function fonts.basecopy(tfmtable,name)
- local characters, parameters, fullname = tfmtable.characters, tfmtable.parameters, tfmtable.fullname
- local t, c, p = { }, { }, { }
- for k, v in next, tfmtable do
- t[k] = v
- end
- if characters then
- for k, v in next, characters do
- c[k] = v
- end
- t.characters = c
- else
- logs.report("math virtual","font %s has no characters",name)
+local function jointhree(main,characters,id,size,unicode,u1,d12,u2,d23,u3)
+ local c1, c2, c3 = characters[u1], characters[u2], characters[u3]
+ if c1 and c2 and c3 then
+ local w1, w2, w3 = c1.width, c2.width, c3.width
+ local mu = size/18
+ characters[unicode] = {
+ width = w1 + w2 + w3 - d12*mu - d23*mu,
+ height = max(c1.height or 0, c2.height or 0, c3.height or 0),
+ depth = max(c1.depth or 0, c2.depth or 0, c3.depth or 0),
+ commands = {
+ { "slot", id, u1 },
+ { "right", - d12*mu } ,
+ { "slot", id, u2 },
+ { "right", - d23*mu },
+ { "slot", id, u3 },
+ }
+ }
end
- if parameters then
- for k, v in next, parameters do
- p[k] = v
- end
- t.parameters = p
- else
- logs.report("math virtual","font %s has no parameters",name)
+end
+
+local function stack(main,characters,id,size,unicode,u1,d12,u2)
+ local c1, c2 = characters[u1], characters[u2]
+ if c1 and c2 then
+ local w1, w2 = c1.width, c2.width
+ local h1, h2 = c1.height, c2.height
+ local d1, d2 = c1.depth, c2.depth
+ local mu = size/18
+ characters[unicode] = {
+ width = w1,
+ height = h1 + h2 + d12,
+ depth = d1,
+ commands = {
+ { "slot", id, u1 },
+ { "right", - w1/2 - w2/2 } ,
+ { "down", -h1 + d2 -d12*mu } ,
+ { "slot", id, u2 },
+ }
+ }
end
- -- tricky ... what if fullname does not exist
- if fullname then
- unique = unique + 1
- t.fullname = fullname .. "-" .. unique
+end
+
+function vfmath.addmissing(main,id,size)
+ 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
- return t
+ brace (main,characters,id,size,0x23DE,0xFF17A,0xFF301,0xFF17D,0xFF17C,0xFF301,0xFF17B)
+ brace (main,characters,id,size,0x23DF,0xFF27C,0xFF401,0xFF27B,0xFF27A,0xFF401,0xFF27D)
+ parent (main,characters,id,size,0x23DC,0xFF17A,0xFF301,0xFF17B)
+ parent (main,characters,id,size,0x23DD,0xFF27C,0xFF401,0xFF27D)
+ -- negate (main,characters,id,size,0x2260,0x003D)
+ dots (main,characters,id,size,0x2026) -- ldots
+ dots (main,characters,id,size,0x22EE) -- vdots
+ dots (main,characters,id,size,0x22EF) -- cdots
+ dots (main,characters,id,size,0x22F1) -- ddots
+ dots (main,characters,id,size,0x22F0) -- udots
+ minus (main,characters,id,size,0xFF501)
+ arrow (main,characters,id,size,0x2190,0xFE190,0xFF501,true) -- left
+ arrow (main,characters,id,size,0x2192,0xFE192,0xFF501,false) -- right
+ vertbar (main,characters,id,size,0x0007C,0.10,0xFF601) -- big : 0.85 bodyfontsize
+ vertbar (main,characters,id,size,0xFF601,0.30,0xFF602) -- Big : 1.15 bodyfontsize
+ vertbar (main,characters,id,size,0xFF602,0.30,0xFF603) -- bigg : 1.45 bodyfontsize
+ vertbar (main,characters,id,size,0xFF603,0.30,0xFF604) -- Bigg : 1.75 bodyfontsize
+ vertbar (main,characters,id,size,0x02016,0.10,0xFF605)
+ vertbar (main,characters,id,size,0xFF605,0.30,0xFF606)
+ vertbar (main,characters,id,size,0xFF606,0.30,0xFF607)
+ vertbar (main,characters,id,size,0xFF607,0.30,0xFF608)
+ jointwo (main,characters,id,size,0x21A6,0xFE321,0,0x02192) -- \mapstochar\rightarrow
+ jointwo (main,characters,id,size,0x21A9,0x02190,joinrelfactor,0xFE323) -- \leftarrow\joinrel\rhook
+ jointwo (main,characters,id,size,0x21AA,0xFE322,joinrelfactor,0x02192) -- \lhook\joinrel\rightarrow
+ 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,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,0x22A7,0x0007C,joinrelfactor,0x0003D) -- \mathrel|\joinrel=
+ jointwo (main,characters,id,size,0x27F5,0x02190,joinrelfactor,0x0002D) -- \leftarrow\joinrel\relbar
+ jointwo (main,characters,id,size,0x27F6,0x0002D,joinrelfactor,0x02192) -- \relbar\joinrel\rightarrow
+ jointwo (main,characters,id,size,0x27F7,0x02190,joinrelfactor,0x02192) -- \leftarrow\joinrel\rightarrow
+ jointwo (main,characters,id,size,0x27F8,0x021D0,joinrelfactor,0x0003D) -- \Leftarrow\joinrel\Relbar
+ jointwo (main,characters,id,size,0x27F9,0x0003D,joinrelfactor,0x021D2) -- \Relbar\joinrel\Rightarrow
+ jointwo (main,characters,id,size,0x27FA,0x021D0,joinrelfactor,0x021D2) -- \Leftarrow\joinrel\Rightarrow
+ jointhree(main,characters,id,size,0x27FB,0x02190,joinrelfactor,0x0002D,0,0xFE324) -- \leftarrow\joinrel\relbar\mapsfromchar
+ jointhree(main,characters,id,size,0x27FC,0xFE321,0,0x0002D,joinrelfactor,0x02192) -- \mapstochar\relbar\joinrel\rightarrow
end
+local unique = 0 -- testcase: \startTEXpage \math{!\text{-}\text{-}\text{-}} \stopTEXpage
+
local reported = { }
-local reverse -- index -> unicode
+local reverse = { } -- index -> unicode
-function fonts.vf.math.define(specification,set)
- if not reverse then
- reverse = { }
- for k, v in next, fonts.enc.math do
- local r = { }
- for u, i in next, v do
- r[i] = u
- end
- reverse[k] = r
- end
+setmetatableindex(reverse, function(t,name)
+ if trace_virtual then
+ report_virtual("initializing math vector '%s'",name)
+ end
+ local m, r = mathencodings[name], { }
+ for u, i in next, m do
+ r[i] = u
end
+ reverse[name] = r
+ return r
+end)
+
+function vfmath.define(specification,set,goodies)
local name = specification.name -- symbolic name
local size = specification.size -- given size
- local fnt, lst, main = { }, { }, nil
+ local loaded, fontlist, main = { }, { }, nil
local start = (trace_virtual or trace_timings) and os.clock()
local okset, n = { }, 0
for s=1,#set do
local ss = set[s]
local ssname = ss.name
- if ss.optional and fonts.vf.math.optional then
+ if ss.optional and vfmath.optional then
if trace_virtual then
- logs.report("math virtual","loading font %s subfont %s with name %s at %s is skipped",name,s,ssname,size)
+ report_virtual("loading font %s subfont %s with name %s at %s is skipped",name,s,ssname,size)
end
else
- if ss.features then ssname = ssname .. "*" .. ss.features end
- if ss.main then main = s end
- local f, id = fonts.tfm.read_and_define(ssname,size)
- if not f then
- logs.report("math virtual","loading font %s subfont %s with name %s at %s is skipped, not found",name,s,ssname,size)
+ if ss.features then
+ ssname = ssname .. "*" .. ss.features
+ end
+ if ss.main then
+ main = s
+ end
+ local f, id = fonts.constructors.readanddefine(ssname,size)
+ if not f or id == 0 then
+ report_virtual("loading font %s subfont %s with name %s at %s is skipped, not found",name,s,ssname,size)
else
n = n + 1
okset[n] = ss
- fnt[n] = f
- lst[n] = { id = id, size = size }
+ loaded[n] = f
+ fontlist[n] = { id = id, size = size }
if not shared[s] then shared[n] = { } end
if trace_virtual then
- logs.report("math virtual","loading font %s subfont %s with name %s at %s as id %s using encoding %s",name,s,ssname,size,id,ss.vector or "none")
+ report_virtual("loading font %s subfont %s with name %s at %s as id %s using encoding %s",name,s,ssname,size,id,ss.vector or "none")
+ end
+ if not ss.checked then
+ ss.checked = true
+ local vector = mathencodings[ss.vector]
+ if vector then
+ -- we resolve named glyphs only once as we can assume that vectors
+ -- are unique to a font set (when we read an afm we get those names
+ -- mapped onto the private area)
+ for unicode, index in next, vector do
+ if not tonumber(index) then
+ local u = f.unicodes
+ u = u and u[index]
+ if u then
+ if trace_virtual then
+ report_virtual("resolving name %s to %s",index,u)
+ end
+ else
+ report_virtual("unable to resolve name %s",index)
+ end
+ vector[unicode] = u
+ end
+ end
+ end
end
end
end
end
- -- beware, fnt[1] is already passed to tex (we need to make a simple copy then .. todo)
- main = fonts.basecopy(fnt[1],name)
- main.name, main.fonts, main.virtualized, main.math_parameters = name, lst, true, { }
- local characters, descriptions = main.characters, main.descriptions
- local mp = main.parameters
- if mp then
- mp.x_height = mp.x_height or 0
+ -- beware, loaded[1] is already passed to tex (we need to make a simple copy then .. todo)
+ local parent = loaded[1] -- a text font
+ local characters = { }
+ local parameters = { }
+ local mathparameters = { }
+ local descriptions = { }
+ local metadata = { }
+ local properties = { }
+ local goodies = { }
+ local main = {
+ metadata = metadata,
+ properties = properties,
+ characters = characters,
+ descriptions = descriptions,
+ parameters = parameters,
+ mathparameters = mathparameters,
+ fonts = fontlist,
+ goodies = goodies,
+ }
+ --
+ --
+ for key, value in next, parent do
+ if type(value) ~= "table" then
+ main[key] = value
+ end
+ end
+ --
+ if parent.characters then
+ for unicode, character in next, parent.characters do
+ characters[unicode] = character
+ end
+ else
+ report_virtual("font %s has no characters",name)
+ end
+ --
+ if parent.parameters then
+ for key, value in next, parent.parameters do
+ parameters[key] = value
+ end
+ else
+ report_virtual("font %s has no parameters",name)
+ end
+ --
+ local description = { name = "<unset>" }
+ setmetatableindex(descriptions,function() return description end)
+ --
+ if parent.properties then
+ setmetatableindex(properties,parent.properties)
end
+ --
+ if parent.goodies then
+ setmetatableindex(goodies,parent.goodies)
+ end
+ --
+ properties.virtualized = true
+ properties.italic_correction = true
+ properties.has_math = true
+ --
+ local fullname = properties.fullname -- parent via mt
+ if fullname then
+ unique = unique + 1
+ properties.fullname = fullname .. "-" .. unique
+ end
+ --
+ -- we need to set some values in main as well (still?)
+ --
+ main.fullname = properties.fullname
+ main.type = "virtual"
+ main.nomath = false
+ --
+ parameters.x_height = parameters.x_height or 0
+ --
local already_reported = false
for s=1,n do
- local ss, fs = okset[s], fnt[s]
+ local ss, fs = okset[s], loaded[s]
if not fs then
-- skip, error
- elseif ss.optional and fonts.vf.math.optional then
+ elseif ss.optional and vfmath.optional then
-- skip, redundant
else
- local mm, fp = main.math_parameters, fs.parameters
- if mm and fp and mp then
- if ss.extension then
- mm.math_x_height = fp.x_height or 0 -- math_x_height height of x
- mm.default_rule_thickness = fp[ 8] or 0 -- default_rule_thickness thickness of \over bars
- mm.big_op_spacing1 = fp[ 9] or 0 -- big_op_spacing1 minimum clearance above a displayed op
- mm.big_op_spacing2 = fp[10] or 0 -- big_op_spacing2 minimum clearance below a displayed op
- mm.big_op_spacing3 = fp[11] or 0 -- big_op_spacing3 minimum baselineskip above displayed op
- mm.big_op_spacing4 = fp[12] or 0 -- big_op_spacing4 minimum baselineskip below displayed op
- mm.big_op_spacing5 = fp[13] or 0 -- big_op_spacing5 padding above and below displayed limits
- -- logs.report("math virtual","loading and virtualizing font %s at size %s, setting ex parameters",name,size)
- elseif ss.parameters then
- mp.x_height = fp.x_height or mp.x_height
- mm.x_height = mm.x_height or fp.x_height or 0 -- x_height height of x
- mm.num1 = fp[ 8] or 0 -- num1 numerator shift-up in display styles
- mm.num2 = fp[ 9] or 0 -- num2 numerator shift-up in non-display, non-\atop
- mm.num3 = fp[10] or 0 -- num3 numerator shift-up in non-display \atop
- mm.denom1 = fp[11] or 0 -- denom1 denominator shift-down in display styles
- mm.denom2 = fp[12] or 0 -- denom2 denominator shift-down in non-display styles
- mm.sup1 = fp[13] or 0 -- sup1 superscript shift-up in uncramped display style
- mm.sup2 = fp[14] or 0 -- sup2 superscript shift-up in uncramped non-display
- mm.sup3 = fp[15] or 0 -- sup3 superscript shift-up in cramped styles
- mm.sub1 = fp[16] or 0 -- sub1 subscript shift-down if superscript is absent
- mm.sub2 = fp[17] or 0 -- sub2 subscript shift-down if superscript is present
- mm.sup_drop = fp[18] or 0 -- sup_drop superscript baseline below top of large box
- mm.sub_drop = fp[19] or 0 -- sub_drop subscript baseline below bottom of large box
- mm.delim1 = fp[20] or 0 -- delim1 size of \atopwithdelims delimiters in display styles
- mm.delim2 = fp[21] or 0 -- delim2 size of \atopwithdelims delimiters in non-displays
- mm.axis_height = fp[22] or 0 -- axis_height height of fraction lines above the baseline
- -- logs.report("math virtual","loading and virtualizing font %s at size %s, setting sy parameters",name,size)
- end
- else
- logs.report("math virtual","font %s, no parameters set",name)
+ local newparameters = fs.parameters
+ if not newparameters then
+ report_virtual("font %s, no parameters set",name)
+ elseif ss.extension then
+ mathparameters.math_x_height = newparameters.x_height or 0 -- math_x_height : height of x
+ mathparameters.default_rule_thickness = newparameters[ 8] or 0 -- default_rule_thickness : thickness of \over bars
+ mathparameters.big_op_spacing1 = newparameters[ 9] or 0 -- big_op_spacing1 : minimum clearance above a displayed op
+ mathparameters.big_op_spacing2 = newparameters[10] or 0 -- big_op_spacing2 : minimum clearance below a displayed op
+ mathparameters.big_op_spacing3 = newparameters[11] or 0 -- big_op_spacing3 : minimum baselineskip above displayed op
+ mathparameters.big_op_spacing4 = newparameters[12] or 0 -- big_op_spacing4 : minimum baselineskip below displayed op
+ mathparameters.big_op_spacing5 = newparameters[13] or 0 -- big_op_spacing5 : padding above and below displayed limits
+ -- report_virtual("loading and virtualizing font %s at size %s, setting ex parameters",name,size)
+ elseif ss.parameters then
+ mathparameters.x_height = newparameters.x_height or mathparameters.x_height
+ mathparameters.x_height = mathparameters.x_height or fp.x_height or 0 -- x_height : height of x
+ mathparameters.num1 = newparameters[ 8] or 0 -- num1 : numerator shift-up in display styles
+ mathparameters.num2 = newparameters[ 9] or 0 -- num2 : numerator shift-up in non-display, non-\atop
+ mathparameters.num3 = newparameters[10] or 0 -- num3 : numerator shift-up in non-display \atop
+ mathparameters.denom1 = newparameters[11] or 0 -- denom1 : denominator shift-down in display styles
+ mathparameters.denom2 = newparameters[12] or 0 -- denom2 : denominator shift-down in non-display styles
+ mathparameters.sup1 = newparameters[13] or 0 -- sup1 : superscript shift-up in uncramped display style
+ mathparameters.sup2 = newparameters[14] or 0 -- sup2 : superscript shift-up in uncramped non-display
+ mathparameters.sup3 = newparameters[15] or 0 -- sup3 : superscript shift-up in cramped styles
+ mathparameters.sub1 = newparameters[16] or 0 -- sub1 : subscript shift-down if superscript is absent
+ mathparameters.sub2 = newparameters[17] or 0 -- sub2 : subscript shift-down if superscript is present
+ mathparameters.sup_drop = newparameters[18] or 0 -- sup_drop : superscript baseline below top of large box
+ mathparameters.sub_drop = newparameters[19] or 0 -- sub_drop : subscript baseline below bottom of large box
+ mathparameters.delim1 = newparameters[20] or 0 -- delim1 : size of \atopwithdelims delimiters in display styles
+ mathparameters.delim2 = newparameters[21] or 0 -- delim2 : size of \atopwithdelims delimiters in non-displays
+ mathparameters.axis_height = newparameters[22] or 0 -- axis_height : height of fraction lines above the baseline
+ -- report_virtual("loading and virtualizing font %s at size %s, setting sy parameters",name,size)
end
local vectorname = ss.vector
if vectorname then
local offset = 0xFF000
- local vector = fonts.enc.math[vectorname]
+ local vector = mathencodings[vectorname]
local rotcev = reverse[vectorname]
- if vector then
+ if vector and rotcev then
local fc, fd, si = fs.characters, fs.descriptions, shared[s]
local skewchar = ss.skewchar
for unicode, index in next, vector do
local fci = fc[index]
if not fci then
- local fontname = fs.name or "unknown"
+ local fontname = fs.properties.name or "unknown"
local rf = reported[fontname]
if not rf then rf = { } reported[fontname] = rf end
local rv = rf[vectorname]
@@ -399,9 +548,9 @@ function fonts.vf.math.define(specification,set)
local ru = rv[unicode]
if not ru then
if trace_virtual then
- logs.report("math virtual", "unicode point U+%05X has no index %04X in vector %s for font %s",unicode,index,vectorname,fontname)
+ report_virtual( "unicode point U+%05X has no index %04X in vector %s for font %s",unicode,index,vectorname,fontname)
elseif not already_reported then
- logs.report("math virtual", "the mapping is incomplete for '%s' at %s",name,number.topoints(size))
+ report_virtual( "the mapping is incomplete for '%s' at %s",name,number.topoints(size))
already_reported = true
end
rv[unicode] = true
@@ -413,13 +562,17 @@ function fonts.vf.math.define(specification,set)
si[index] = ref
end
local kerns = fci.kerns
+ local width = fci.width
+ local italic = fci.italic
+ -- if italic then
+ -- width = width + italic -- old interpretation of otf math specs
+ -- end
if kerns then
- local width = fci.width
local krn = { }
- for k=1,#kerns do
+ for k, v in next, kerns do -- kerns is sparse
local rk = rotcev[k]
if rk then
- krn[rk] = kerns[k]
+ krn[rk] = v -- kerns[k]
end
end
if not next(krn) then
@@ -429,7 +582,7 @@ function fonts.vf.math.define(specification,set)
width = width,
height = fci.height,
depth = fci.depth,
- italic = fci.italic,
+ italic = italic,
kerns = krn,
commands = ref,
}
@@ -442,10 +595,10 @@ function fonts.vf.math.define(specification,set)
characters[unicode] = t
else
characters[unicode] = {
- width = fci.width,
+ width = width,
height = fci.height,
depth = fci.depth,
- italic = fci.italic,
+ italic = italic,
commands = ref,
}
end
@@ -453,7 +606,7 @@ function fonts.vf.math.define(specification,set)
end
if ss.extension then
-- todo: if multiple ex, then 256 offsets per instance
- local extension = fonts.enc.math["large-to-small"]
+ local extension = mathencodings["large-to-small"]
local variants_done = fs.variants_done
for index, fci in next, fc do -- the raw ex file
if type(index) == "number" then
@@ -507,31 +660,10 @@ function fonts.vf.math.define(specification,set)
local cu = characters[unicode]
if cu then
cu.next = offset + index
- --~ local n, c, d = unicode, cu, { }
- --~ print("START", unicode)
- --~ while n do
- --~ n = c.next
- --~ if n then
- --~ print("NEXT", n)
- --~ c = characters[n]
- --~ if not c then
- --~ print("EXIT")
- --~ elseif d[n] then
- --~ print("LOOP")
- --~ break
- --~ end
- --~ d[n] = true
- --~ end
- --~ end
else
local fci = fc[index]
if not fci then
---~ characters[unicode] = {
---~ width = 0,
---~ height = 0,
---~ depth = 0,
---~ index = 0,
---~ }
+ -- do nothing
else
local ref = si[index]
if not ref then
@@ -541,8 +673,11 @@ function fonts.vf.math.define(specification,set)
local kerns = fci.kerns
if kerns then
local krn = { }
- for k=1,#kerns do
- krn[offset + k] = kerns[k]
+--~ for k=1,#kerns do
+--~ krn[offset + k] = kerns[k]
+--~ end
+ for k, v in next, kerns do -- is kerns sparse?
+ krn[offset + k] = v
end
characters[unicode] = {
width = fci.width,
@@ -567,36 +702,44 @@ function fonts.vf.math.define(specification,set)
end
end
end
+ else
+ report_virtual("error in loading %s: problematic vector %s",name,vectorname)
end
end
mathematics.extras.copy(main) --not needed here (yet)
end
end
- lst[#lst+1] = { id = font.nextid(), size = size }
- if mp then -- weak catch
- fonts.vf.math.alas(main,#lst,size)
- end
+ --
+ fontlist[#fontlist+1] = {
+ id = font.nextid(),
+ size = size,
+ }
+ --
+ main.mathparameters = mathparameters -- still traditional ones
+ vfmath.addmissing(main,#fontlist,size)
+ mathematics.addfallbacks(main)
+ --
+ main.properties.math_is_scaled = true -- signal
+ fonts.constructors.assignmathparameters(main,main)
+ --
+ main.MathConstants = main.mathparameters -- we directly pass it to TeX (bypasses the scaler) so this is needed
+ --
if trace_virtual or trace_timings then
- logs.report("math virtual","loading and virtualizing font %s at size %s took %0.3f seconds",name,size,os.clock()-start)
+ report_virtual("loading and virtualizing font %s at size %s took %0.3f seconds",name,size,os.clock()-start)
end
- main.has_italic = true
- main.type = "virtual" -- not needed
- mathematics.scaleparameters(main,main,1)
- main.nomath = false
---~ print(table.serialize(characters[0x222B]))
---~ print(main.fontname,table.serialize(main.MathConstants))
+ --
return main
end
-function mathematics.make_font(name, set)
- fonts.define.methods[name] = function(specification)
- return fonts.vf.math.define(specification,set)
+function mathematics.makefont(name,set,goodies)
+ fonts.definers.methods.variants[name] = function(specification)
+ return vfmath.define(specification,set,goodies)
end
end
-- varphi is part of the alphabet, contrary to the other var*s'
-fonts.enc.math["large-to-small"] = {
+mathencodings["large-to-small"] = {
[0x00028] = 0x00, -- (
[0x00029] = 0x01, -- )
[0x0005B] = 0x02, -- [
@@ -640,7 +783,7 @@ fonts.enc.math["large-to-small"] = {
[0x02044] = 0x0E, -- /
}
-fonts.enc.math["tex-ex"] = {
+mathencodings["tex-ex"] = {
[0x0220F] = 0x51, -- prod
[0x0222B] = 0x52, -- intop
[0x02210] = 0x60, -- coprod
@@ -660,7 +803,7 @@ fonts.enc.math["tex-ex"] = {
-- only math stuff is needed, since we always use an lm or gyre
-- font as main font
-fonts.enc.math["tex-mr"] = {
+mathencodings["tex-mr"] = {
[0x00393] = 0x00, -- Gamma
[0x00394] = 0x01, -- Delta
[0x00398] = 0x02, -- Theta
@@ -715,11 +858,11 @@ fonts.enc.math["tex-mr"] = {
-- [0x000A8] = 0x7F, -- [math]ddot
}
-fonts.enc.math["tex-mr-missing"] = {
+mathencodings["tex-mr-missing"] = {
[0x02236] = 0x3A, -- colon
}
-fonts.enc.math["tex-mi"] = {
+mathencodings["tex-mi"] = {
[0x1D6E4] = 0x00, -- Gamma
[0x1D6E5] = 0x01, -- Delta
[0x1D6E9] = 0x02, -- Theta
@@ -803,8 +946,7 @@ fonts.enc.math["tex-mi"] = {
-- 0x7F, -- (no idea what that could be)
}
-
-fonts.enc.math["tex-it"] = {
+mathencodings["tex-it"] = {
-- [0x1D434] = 0x41, -- A
[0x1D6E2] = 0x41, -- Alpha
-- [0x1D435] = 0x42, -- B
@@ -874,14 +1016,14 @@ fonts.enc.math["tex-it"] = {
-- [0x1D467] = 0x7A, -- z
}
-fonts.enc.math["tex-ss"] = { }
-fonts.enc.math["tex-tt"] = { }
-fonts.enc.math["tex-bf"] = { }
-fonts.enc.math["tex-bi"] = { }
-fonts.enc.math["tex-fraktur"] = { }
-fonts.enc.math["tex-fraktur-bold"] = { }
+mathencodings["tex-ss"] = { }
+mathencodings["tex-tt"] = { }
+mathencodings["tex-bf"] = { }
+mathencodings["tex-bi"] = { }
+mathencodings["tex-fraktur"] = { }
+mathencodings["tex-fraktur-bold"] = { }
-function fonts.vf.math.set_letters(font_encoding, name, uppercase, lowercase)
+function vfmath.setletters(font_encoding, name, uppercase, lowercase)
local enc = font_encoding[name]
for i = 0,25 do
enc[uppercase+i] = i + 0x41
@@ -889,14 +1031,14 @@ function fonts.vf.math.set_letters(font_encoding, name, uppercase, lowercase)
end
end
-function fonts.vf.math.set_digits(font_encoding, name, digits)
+function vfmath.setdigits(font_encoding, name, digits)
local enc = font_encoding[name]
for i = 0,9 do
enc[digits+i] = i + 0x30
end
end
-fonts.enc.math["tex-sy"] = {
+mathencodings["tex-sy"] = {
[0x0002D] = 0x00, -- -
[0x02212] = 0x00, -- -
-- [0x02201] = 0x00, -- complement
@@ -1015,7 +1157,8 @@ fonts.enc.math["tex-sy"] = {
[0x027E8] = 0x68, -- <, langle
[0x027E9] = 0x69, -- >, rangle
[0x0007C] = 0x6A, -- |, mid, lvert, rvert
- [0x02225] = 0x6B, -- parallel, Vert, lVert, rVert, arrowvert
+ [0x02225] = 0x6B, -- parallel
+ -- [0x02016] = 0x00, -- Vert, lVert, rVert, arrowvert, Arrowvert
[0x02195] = 0x6C, -- updownarrow
[0x021D5] = 0x6D, -- Updownarrow
[0x0005C] = 0x6E, -- \, backslash, setminus
@@ -1044,7 +1187,7 @@ fonts.enc.math["tex-sy"] = {
-- column, while in the second column we show the tex/ams names. As usual
-- it costs hours to figure out such a table.
-fonts.enc.math["tex-ma"] = {
+mathencodings["tex-ma"] = {
[0x022A1] = 0x00, -- squaredot \boxdot
[0x0229E] = 0x01, -- squareplus \boxplus
[0x022A0] = 0x02, -- squaremultiply \boxtimes
@@ -1178,7 +1321,7 @@ fonts.enc.math["tex-ma"] = {
[0x0229D] = 0x7F, -- circleminus \circleddash
}
-fonts.enc.math["tex-mb"] = {
+mathencodings["tex-mb"] = {
-- [0x0] = 0x00, -- lessornotequal \lvertneqq
-- [0x0] = 0x01, -- greaterornotequal \gvertneqq
[0x02270] = 0x02, -- notlessequal \nleq
@@ -1304,7 +1447,12 @@ fonts.enc.math["tex-mb"] = {
[0x003F6] = 0x7F, -- epsiloninv \backepsilon
}
-fonts.enc.math["tex-fraktur"] = {
+mathencodings["tex-mc"] = {
+ -- this file has no tfm so it gets mapped in the private space
+ [0xFE324] = "mapsfromchar",
+}
+
+mathencodings["tex-fraktur"] = {
-- [0x1D504] = 0x41, -- A (fraktur A)
-- [0x1D505] = 0x42, -- B
[0x0212D] = 0x43, -- C
@@ -1361,19 +1509,19 @@ fonts.enc.math["tex-fraktur"] = {
-- now that all other vectors are defined ...
-fonts.vf.math.set_letters(fonts.enc.math, "tex-it", 0x1D434, 0x1D44E)
-fonts.vf.math.set_letters(fonts.enc.math, "tex-ss", 0x1D5A0, 0x1D5BA)
-fonts.vf.math.set_letters(fonts.enc.math, "tex-tt", 0x1D670, 0x1D68A)
-fonts.vf.math.set_letters(fonts.enc.math, "tex-bf", 0x1D400, 0x1D41A)
-fonts.vf.math.set_letters(fonts.enc.math, "tex-bi", 0x1D468, 0x1D482)
-fonts.vf.math.set_letters(fonts.enc.math, "tex-fraktur", 0x1D504, 0x1D51E)
-fonts.vf.math.set_letters(fonts.enc.math, "tex-fraktur-bold", 0x1D56C, 0x1D586)
+vfmath.setletters(mathencodings, "tex-it", 0x1D434, 0x1D44E)
+vfmath.setletters(mathencodings, "tex-ss", 0x1D5A0, 0x1D5BA)
+vfmath.setletters(mathencodings, "tex-tt", 0x1D670, 0x1D68A)
+vfmath.setletters(mathencodings, "tex-bf", 0x1D400, 0x1D41A)
+vfmath.setletters(mathencodings, "tex-bi", 0x1D468, 0x1D482)
+vfmath.setletters(mathencodings, "tex-fraktur", 0x1D504, 0x1D51E)
+vfmath.setletters(mathencodings, "tex-fraktur-bold", 0x1D56C, 0x1D586)
-fonts.vf.math.set_digits (fonts.enc.math, "tex-ss", 0x1D7E2)
-fonts.vf.math.set_digits (fonts.enc.math, "tex-tt", 0x1D7F6)
-fonts.vf.math.set_digits (fonts.enc.math, "tex-bf", 0x1D7CE)
+vfmath.setdigits (mathencodings, "tex-ss", 0x1D7E2)
+vfmath.setdigits (mathencodings, "tex-tt", 0x1D7F6)
+vfmath.setdigits (mathencodings, "tex-bf", 0x1D7CE)
--- fonts.vf.math.set_digits (fonts.enc.math, "tex-bi", 0x1D7CE)
+-- vfmath.setdigits (mathencodings, "tex-bi", 0x1D7CE)
-- todo: add ss, tt, bf etc vectors
-- todo: we can make ss tt etc an option
diff --git a/Master/texmf-dist/tex/context/base/meta-clp.tex b/Master/texmf-dist/tex/context/base/meta-clp.mkii
index be2506b196c..be2506b196c 100644
--- a/Master/texmf-dist/tex/context/base/meta-clp.tex
+++ b/Master/texmf-dist/tex/context/base/meta-clp.mkii
diff --git a/Master/texmf-dist/tex/context/base/meta-dum.tex b/Master/texmf-dist/tex/context/base/meta-dum.mkii
index bc19f3c5fa8..bc19f3c5fa8 100644
--- a/Master/texmf-dist/tex/context/base/meta-dum.tex
+++ b/Master/texmf-dist/tex/context/base/meta-dum.mkii
diff --git a/Master/texmf-dist/tex/context/base/meta-fig.mkiv b/Master/texmf-dist/tex/context/base/meta-fig.mkiv
index 4738316da69..adaad4647e0 100644
--- a/Master/texmf-dist/tex/context/base/meta-fig.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-fig.mkiv
@@ -46,18 +46,27 @@
\unexpanded\def\setupMPpage
{\dodoubleargument\getparameters[\??mg]}
+% \def\startMPpage
+% {\dodoubleempty\dostartMPpage}
+%
+% \long\def\dostartMPpage[#1][#2]#3\stopMPpage % second arg gobbles space
+% {\dostartfittingpage[\??mg][#1]%
+% \processMPgraphic{#3}%
+% \dostopfittingpage}
+
\def\startMPpage
- {\dodoubleempty\dostartMPpage}
+ {\dosingleempty\dostartMPpage}
-\long\def\dostartMPpage[#1][#2]#3\stopMPpage % second arg gobbles space
+\long\def\dostartMPpage[#1]#2\stopMPpage
{\dostartfittingpage[\??mg][#1]%
- \processMPgraphic{#3}%
+ \processMPgraphic{#2}%
\dostopfittingpage}
\let\stopMPpage \relax % so that we can use it in \expanded
\setupMPpage
[\c!scale=1000,
+ \c!pagestate=,
\c!strut=\v!no,
\c!align=,
\c!offset=\v!overlay,
diff --git a/Master/texmf-dist/tex/context/base/meta-fun.lua b/Master/texmf-dist/tex/context/base/meta-fun.lua
index fef2aa12b87..9a6d971baa6 100644
--- a/Master/texmf-dist/tex/context/base/meta-fun.lua
+++ b/Master/texmf-dist/tex/context/base/meta-fun.lua
@@ -11,10 +11,13 @@ if not modules then modules = { } end modules ['meta-fun'] = {
local format, loadstring, type = string.format, loadstring, type
local texwrite = tex.write
-metafun = metafun or { }
+local metapost = metapost
+
+metapost.metafun = metapost.metafun or { }
+local metafun = metapost.metafun
function metafun.topath(t,connector)
- tex.write("(")
+ texwrite("(")
if #t > 0 then
for i=1,#t do
if i > 1 then
@@ -35,7 +38,7 @@ end
function metafun.interpolate(f,b,e,s,c)
local done = false
- tex.write("(")
+ texwrite("(")
for i=b,e,(e-b)/s do
local d = loadstring(format("return function(x) return %s end",f))
if d then
diff --git a/Master/texmf-dist/tex/context/base/meta-fun.mkiv b/Master/texmf-dist/tex/context/base/meta-fun.mkiv
index a43ffefffc0..fbe91fd6a08 100644
--- a/Master/texmf-dist/tex/context/base/meta-fun.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-fun.mkiv
@@ -17,4 +17,9 @@
\unprotect
+%D Just a few handy helpers:
+
+\ifdefined\MPtoks\else \newtoks\MPtoks \fi
+\ifdefined\MPbox \else \newbox \MPbox \fi
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/meta-imp-clp.mkiv b/Master/texmf-dist/tex/context/base/meta-imp-clp.mkiv
new file mode 100644
index 00000000000..be2506b196c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/meta-imp-clp.mkiv
@@ -0,0 +1,164 @@
+%D \module
+%D [ file=meta-clp,
+%D version=2000.07.06,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Clipping,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 In this library, we define a bunch of clipping paths that
+%D can be fed to \type {\clip}.
+
+\startMPclip{ellipse}
+ clip currentpicture to unitcircle
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{negellipse}
+ clip currentpicture to (unitcircle peepholed unitsquare)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{urellipse}
+ clip currentpicture to urcircle scaled 2
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{ulellipse}
+ clip currentpicture to ulcircle scaled 2 shifted (1,0)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{llellipse}
+ clip currentpicture to llcircle scaled 2 shifted (1,1)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{lrellipse}
+ clip currentpicture to lrcircle scaled 2 shifted (0,1)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{tellipse}
+ clip currentpicture to tcircle shifted (.5,0) yscaled 2
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{bellipse}
+ clip currentpicture to bcircle shifted (.5,.5) yscaled 2
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{lellipse}
+ clip currentpicture to lcircle shifted (.5,.5) xscaled 2
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{rellipse}
+ clip currentpicture to rcircle shifted (0,.5) xscaled 2
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{diamond}
+ clip currentpicture to unitdiamond
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{negdiamond}
+ clip currentpicture to (unitdiamond peepholed unitsquare)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{urtriangle}
+ clip currentpicture to urtriangle scaled 2
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{ultriangle}
+ clip currentpicture to ultriangle scaled 2 shifted (1,0)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{lltriangle}
+ clip currentpicture to lltriangle scaled 2 shifted (1,1)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+\startMPclip{lrtriangle}
+ clip currentpicture to lrtriangle scaled 2 shifted (0,1)
+ xscaled \width yscaled \height ;
+\stopMPclip
+
+% More efficient:
+%
+% \def\dosimpleMPclip#1
+% {clip currentpicture to (#1) xscaled \width yscaled \height ;}
+%
+% \def\simpleMPclip#1#2%
+% {\startMPclip{#1}\dosimpleMPclip{#2}\stopMPclip}
+%
+% \simpleMPclip {ellipse} {unitcircle}
+% \simpleMPclip {diamond} {unitdiamond}
+%
+% \simpleMPclip {negellipse} {unitcircle peepholed unitsquare}
+% \simpleMPclip {negdiamond} {unitdiamond peepholed unitsquare}
+%
+% \simpleMPclip {urellipse} {urcircle scaled 2 shifted (0,0)}
+% \simpleMPclip {ulellipse} {ulcircle scaled 2 shifted (1,0)}
+% \simpleMPclip {llellipse} {llcircle scaled 2 shifted (1,1)}
+% \simpleMPclip {lrellipse} {lrcircle scaled 2 shifted (0,1)}
+%
+% \simpleMPclip {tellipse} {tcircle shifted (.5,0) yscaled 2}
+% \simpleMPclip {bellipse} {bcircle shifted (.5,.5) yscaled 2}
+% \simpleMPclip {lellipse} {lcircle shifted (.5,.5) xscaled 2}
+% \simpleMPclip {rellipse} {rcircle shifted (0,.5) xscaled 2}
+%
+% \simpleMPclip {urtriangle} {urtriangle scaled 2 shifted (0,0)}
+% \simpleMPclip {ultriangle} {ultriangle scaled 2 shifted (1,0)}
+% \simpleMPclip {lltriangle} {lltriangle scaled 2 shifted (1,1)}
+% \simpleMPclip {lrtriangle} {lrtriangle scaled 2 shifted (0,1)}
+
+%D \in {Figure} [fig:clipping paths] shows which paths are
+%D predefined. When applied to a whole picture, their usage
+%D is:
+%D
+%D \starttyping
+%D \clip[nx=1,ny=1,mp=ellipse]{some clippable content}
+%D \stoptyping
+%D
+%D \startbuffer
+%D \setupclipping [nx=1,ny=1,x=1,y=1]
+%D \setupblackrules[width=2cm,height=1cm]
+%D \startcombination[6*3] % \startcombination[6*3]
+%D {\clip[mp=urellipse] {\blackrule}} {urellipse}
+%D {\clip[mp=ulellipse] {\blackrule}} {ulellipse}
+%D {\clip[mp=llellipse] {\blackrule}} {llellipse}
+%D {\clip[mp=lrellipse] {\blackrule}} {lrellipse}
+%D {\clip[mp=ellipse] {\blackrule}} {ellipse}
+%D {\clip[mp=negellipse]{\blackrule}} {negellipse}
+%D {\clip[mp=tellipse] {\blackrule}} {tellipse}
+%D {\clip[mp=bellipse] {\blackrule}} {bellipse}
+%D {\clip[mp=lellipse] {\blackrule}} {lellipse}
+%D {\clip[mp=rellipse] {\blackrule}} {rellipse}
+%D {} {}
+%D {} {}
+%D {\clip[mp=urtriangle]{\blackrule}} {urtriangle}
+%D {\clip[mp=ultriangle]{\blackrule}} {ultriangle}
+%D {\clip[mp=lltriangle]{\blackrule}} {lltriangle}
+%D {\clip[mp=lrtriangle]{\blackrule}} {lrtriangle}
+%D {\clip[mp=diamond] {\blackrule}} {diamond}
+%D {\clip[mp=negdiamond]{\blackrule}} {negdiamond}
+%D \stopcombination % \stopcombination
+%D \stopbuffer
+%D
+%D \placefigure % \placefigure
+%D [here][fig:clipping paths]
+%D {The predefined clipping paths.}
+%D {\getbuffer} % {\getbuffer}
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/meta-imp-dum.mkiv b/Master/texmf-dist/tex/context/base/meta-imp-dum.mkiv
new file mode 100644
index 00000000000..60ab0a41d7c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/meta-imp-dum.mkiv
@@ -0,0 +1,147 @@
+%D \module
+%D [ file=meta-dum,
+%D version=2003.03.21,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Dummy (External) Graphics,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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
+
+%D This library overloads the normal external figure
+%D placeholder by a nicer one.
+%D
+%D \startbuffer
+%D \useMPlibrary[dum]
+%D
+%D \startlinecorrection
+%D \externalfigure[unknown-a][width=3cm,height=1cm]
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \externalfigure[unknown-b][width=4cm,height=5cm]
+%D \stoplinecorrection
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+% currently preparempvariables is unable to resolve number
+% fractions like reduction
+
+% June 22, 2003, this definition was patched to adapt itself
+% to transparent colors, but ... in 2011 we no longer have
+% is_transparent so we revert.
+%
+% \startuseMPgraphic{placeholder}{width,height,reduction,color}
+% numeric w, h, d, r ; color c, b, cc ; path p ; boolean t ;
+% t := is_transparent(\MPvar{color}) ;
+% c := not_transparent(\MPvar{color}) ;
+% b := not_transparent(white) ;
+% w := \MPvar{width} ;
+% h := \MPvar{height} ;
+% r := \MPvar{reduction} ;
+% d := max(w,h) ;
+% p := unitsquare xyscaled (w,h) ;
+% cc := r[.5c,b] ;
+% fill p withcolor if t : transparent(1,.5,cc) else : cc fi ;
+% for i := 1 upto 60 :
+% cc := r[c randomized(.3,.9),b] ;
+% fill fullcircle
+% scaled (d/5 randomized (d/5))
+% shifted (center p randomized (d))
+% withcolor if t : transparent(1,.5,cc) else : cc fi ;
+% endfor ;
+% clip currentpicture to p ;
+% \stopuseMPgraphic
+
+\startuseMPgraphic{placeholder}{width,height,reduction,color}
+ numeric w, h, d, r ; path p ;
+ if cmykcolor \MPvar{color} :
+ cmykcolor c, b ; b := (0,0,0,0)
+ else :
+ color c, b ; ; b := (1,1,1)
+ fi ;
+ c := \MPvar{color} ;
+ w := \MPvar{width} ;
+ h := \MPvar{height} ;
+ r := \MPvar{reduction} ;
+ d := max(w,h) ;
+ p := unitsquare xyscaled (w,h) ;
+ fill p withcolor r[.5c,b] ;
+ for i := 1 upto 60 :
+ fill fullcircle
+ scaled (d/5 randomized (d/5))
+ shifted (center p randomized (d))
+ withcolor r[c randomized(.3,.9),b] ;
+ endfor ;
+ clip currentpicture to p ;
+\stopuseMPgraphic
+
+\definepalet
+ [placeholder]
+ [1=red,2=green,3=blue,4=cyan,5=magenta,6=yellow]
+
+% \newcounter \figurereplacementcycle
+
+\let\figurereplacementcycle\relax
+
+\setupexternalfigures
+ [\c!reduction=0,
+ \c!text=\v!yes]
+
+\let\normalexternalfigurereplacement\externalfigurereplacement
+
+\def\externalfigurereplacement#1#2#3%
+ {\getpaletsize[placeholder]%
+ \ifx\figurereplacementcycle\relax
+ \getrandomnumber \figurereplacementcycle \!!plusone \paletsize
+ \globallet \figurereplacementcycle \figurereplacementcycle
+ \else
+ \doglobal\increment\figurereplacementcycle
+ \fi
+ \ifnum\figurereplacementcycle>\paletsize
+ \globallet\figurereplacementcycle\!!plusone
+ \fi
+ \weightGRAYfalse % monochrome anyway
+ \MPcmykcolorsfalse
+ \MPspotcolorsfalse
+ \defineoverlay
+ [\s!dummy]
+ [\useMPgraphic
+ {placeholder}%
+ {width=\figurewidth,
+ height=\figureheight,
+ reduction=\@@efreduction,
+ color=placeholder:\figurereplacementcycle}]%
+ \expanded{\localframed
+ [\??ef]
+ [\c!width=\figurewidth,
+ \c!height=\figureheight,
+ \c!frame=\v!off,
+ \c!strut=\v!no,
+ \c!background=\s!dummy,
+ \c!foregroundcolor=\s!white]}%
+ {\doif\@@eftext\v!yes
+ {\infofont \setupinterlinespace \dohyphens % \nohyphens
+ \doifelse{#1}\s!dummy \!!doneafalse\!!doneatrue
+ \doifelse{#2}\s!dummy \!!donebfalse\!!donebtrue
+ \doifelse{#3}\s!unknown\!!donecfalse\!!donectrue
+ \if!!donea
+ name: \expanded{\verbatimstring{#1}}\strut\endgraf
+ \fi
+ \if!!doneb
+ \if!!donea file: \else \if!!donec file: \fi \fi
+ \expanded{\verbatimstring{#2}}\strut\endgraf
+ \fi
+ \if!!donec
+ state: \expanded{\verbatimstring{#3}}\strut\endgraf
+ \fi}}}
+
+\def\dummyfigure{\externalfigure[placeholder]}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/meta-mis.tex b/Master/texmf-dist/tex/context/base/meta-imp-mis.mkiv
index 29ab43007e7..29ab43007e7 100644
--- a/Master/texmf-dist/tex/context/base/meta-mis.tex
+++ b/Master/texmf-dist/tex/context/base/meta-imp-mis.mkiv
diff --git a/Master/texmf-dist/tex/context/base/meta-nav.tex b/Master/texmf-dist/tex/context/base/meta-imp-nav.mkiv
index 9c1cbb4dbb4..9c1cbb4dbb4 100644
--- a/Master/texmf-dist/tex/context/base/meta-nav.tex
+++ b/Master/texmf-dist/tex/context/base/meta-imp-nav.mkiv
diff --git a/Master/texmf-dist/tex/context/base/meta-pre.tex b/Master/texmf-dist/tex/context/base/meta-imp-pre.mkiv
index cb861ff20d5..cb861ff20d5 100644
--- a/Master/texmf-dist/tex/context/base/meta-pre.tex
+++ b/Master/texmf-dist/tex/context/base/meta-imp-pre.mkiv
diff --git a/Master/texmf-dist/tex/context/base/meta-txt.tex b/Master/texmf-dist/tex/context/base/meta-imp-txt.mkiv
index 474253a4052..474253a4052 100644
--- a/Master/texmf-dist/tex/context/base/meta-txt.tex
+++ b/Master/texmf-dist/tex/context/base/meta-imp-txt.mkiv
diff --git a/Master/texmf-dist/tex/context/base/meta-ini.lua b/Master/texmf-dist/tex/context/base/meta-ini.lua
new file mode 100644
index 00000000000..5150c38358f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/meta-ini.lua
@@ -0,0 +1,29 @@
+if not modules then modules = { } end modules ['meta-ini'] = {
+ version = 1.001,
+ comment = "companion to meta-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+
+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
+
+function metapost.uselibrary(name)
+ commands.uselibrary(name,patterns,function(name,foundname)
+ context.startreadingfile()
+ status_metapost("loaded: library '%s'",name)
+ context.input(foundname)
+ context.stopreadingfile()
+ end, function(name)
+ report_metapost("unknown: library '%s'",name)
+ end)
+end
diff --git a/Master/texmf-dist/tex/context/base/meta-ini.mkii b/Master/texmf-dist/tex/context/base/meta-ini.mkii
index e7c6d218e1f..fd6ef9a6163 100644
--- a/Master/texmf-dist/tex/context/base/meta-ini.mkii
+++ b/Master/texmf-dist/tex/context/base/meta-ini.mkii
@@ -612,10 +612,10 @@
\def\initializeMPgraphics
{\bgroup
\initializeMPgraphicfile
- \ifx\bufferprefix\empty\else
- \let\bufferprefix\empty
- \initializeMPgraphicfile
- \fi
+% \ifx\bufferprefix\empty\else
+% \let\bufferprefix\empty
+% \initializeMPgraphicfile
+% \fi
\egroup}
%D Loading specific \METAPOST\ related definitions is
@@ -626,7 +626,11 @@
\letvalueempty{\c!file\f!metapostprefix#1}%
\makeshortfilename[\truefilename{\f!metapostprefix#1}]%
\startreadingfile
- \readsysfile\shortfilename{\showmessage\m!metapost1{#1}}\donothing
+ \readsysfile{\shortfilename.\mksuffix}
+ {\showmessage\m!metapost1{#1}}
+ {\readsysfile{\shortfilename.tex}
+ {\showmessage\m!metapost1{#1}}
+ \donothing}%
\stopreadingfile
\fi}
@@ -815,10 +819,12 @@
\box\scratchbox
\egroup}
+\ifx\makeMPintoPDFobject\undefined \newcount\makeMPintoPDFobject \fi
+
\def\includeMPasPDF#1%
{\bgroup
\the\everyinsertMPfile
- \ifinobject \else \chardef\makeMPintoPDFobject\plustwo \fi % when needed
+ \ifinobject \else \makeMPintoPDFobject\plustwo \fi % when needed
\convertMPtoPDF{#1}{1}{1}% no \plusone !
\egroup}
diff --git a/Master/texmf-dist/tex/context/base/meta-ini.mkiv b/Master/texmf-dist/tex/context/base/meta-ini.mkiv
index 61acbca32c7..e95eb178604 100644
--- a/Master/texmf-dist/tex/context/base/meta-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-ini.mkiv
@@ -13,6 +13,8 @@
\writestatus{loading}{MetaPost Graphics / Initializations}
+\registerctxluafile{meta-ini}{1.001}
+
\unprotect
%D Instead of sharing code with \MKII, I decided to copy
@@ -134,8 +136,6 @@
\def\endMPgraphicgroup
{\endgroup}
-\newconditional \METAFUNinitialized
-
\def\MPaskedfigure{false}
\def\currentMPinitializations
@@ -160,19 +160,18 @@
\def\dostopcurrentMPgraphic
{\global\MPinstancetoks\emptytoks
- \global\settrue\METAFUNinitialized % becomes obsolete
\endgroup}
\unexpanded\long\def\processMPgraphic#1% todo: extensions and inclusions outside beginfig
{\dostartcurrentMPgraphic
\forgetall
- \setbox\MPgraphicbox\hbox\bgroup
+ \setbox\MPgraphicbox\hbox\bgroup % ; added 20100901 (as in mkii)
\normalexpanded{\noexpand\ctxlua{metapost.graphic(
"\currentMPgraphicinstance",
"\currentMPgraphicformat",
- \!!bs#1\!!es,
- \!!bs\currentMPinitializations\!!es,
- \!!bs\currentMPpreamble\!!es,
+ \!!bs#1;\!!es,
+ \!!bs\currentMPinitializations;\!!es,
+ \!!bs\currentMPpreamble;\!!es,
\MPaskedfigure
)}}%
\egroup
@@ -202,36 +201,10 @@
{\let\handleuseMPgraphic \thirdofthreearguments
\let\handlereusableMPgraphic\thirdofthreearguments}
-\let\MPdrawingdata\empty
-
\newif\ifMPdrawingdone \MPdrawingdonefalse
-\def\resetMPdrawing
- {\globallet\MPdrawingdata\empty
- \global\MPdrawingdonefalse}
-
-\def\pushMPdrawing
- {\globalpushmacro\MPdrawingdata
- \globallet\MPdrawingdata\empty}
-
-\def\popMPdrawing
- {\globalpopmacro\MPdrawingdata}
-
-\def\getMPdrawing{\dosinglegroupempty\dogetMPdrawing}
-
-\def\startMPdrawing
- {\dosingleempty\dostartMPdrawing}
-
-\long\def\dostartMPdrawing[#1]#2\stopMPdrawing
- {\relax
- \bgroup
- \enableincludeMPgraphics
- \presetMPdefinitions % in case #2 has measures
- \doifelse{#1}{-}{\convertargument#2\to\asciia}{\long\def\asciia{#2}}%
- \long\xdef\MPdrawingdata{\MPdrawingdata\asciia}%
- \egroup}
-
-\let\stopMPdrawing\relax
+\def\finalizeMPdrawing
+ {\MPdrawingdonetrue}
\let\MPdrawingdata\empty
@@ -267,6 +240,14 @@
\let\stopMPdrawing\relax
+\long\def\MPdrawing#1%
+ {\relax
+ \bgroup
+ \enableincludeMPgraphics
+ \presetMPdefinitions
+ \long\xdef\MPdrawingdata{\MPdrawingdata#1}%
+ \egroup}
+
\let\stopMPclip\relax
\long\def\startMPclip#1#2\stopMPclip % todo: store at the lua end or just store less
@@ -424,10 +405,9 @@
%D \uniqueMPgraphic{meta:hash}{gap=10pt,angle=30}
%D \stoptyping
-\newcount\MPobjectcounter
-\newbox \MPgraphicbox
-
-\chardef\MPboxmode\zerocount
+\newcount \MPobjectcounter
+\newbox \MPgraphicbox
+\newconstant\MPboxmode
\def\doobeyMPboxdepth % mode = 1
{\setbox\MPgraphicbox\hbox{\hskip\MPllx\onebasepoint\raise\MPlly\onebasepoint\box\MPgraphicbox}}
@@ -439,9 +419,9 @@
\ht\MPgraphicbox\the\ht\MPgraphicbox
\dp\MPgraphicbox\the\dp\MPgraphicbox}}
-\def\obeyMPboxdepth {\chardef\MPboxmode\plusone}
-\def\ignoreMPboxdepth{\chardef\MPboxmode\plustwo}
-\def\normalMPboxdepth{\chardef\MPboxmode\zerocount}
+\def\obeyMPboxdepth {\MPboxmode\plusone}
+\def\ignoreMPboxdepth{\MPboxmode\plustwo}
+\def\normalMPboxdepth{\MPboxmode\zerocount}
% compatibility hack:
@@ -660,8 +640,6 @@
def data_mpy_file = "\MPdataMPYfile" enddef ;
\stopMPextensions
-\chardef\currentMPgraphic\plusone
-
\def\getMPdata
{\let\MPdata\secondoftwoarguments
\startreadingfile
@@ -670,15 +648,6 @@
% \stopnointerference
\stopreadingfile}
-%D \macros
-%D {MPrunfile}
-%D
-%D This one is more abstract and does not assume knowledge
-%D of buffer prefixes.
-
-\def\MPrunfile#1%
- {\bufferprefix mprun.#1}
-
%D For the moment, the next one is a private macro:
\def\processMPbuffer
@@ -702,7 +671,7 @@
% we need this trick because tex.sprint does not interprets newlines and the scanner
% stops at a newline; also, we do need to flush the buffer under a normal catcode
% regime in order to expand embedded tex macros; #1 can be a list
- \processMPgraphic{\ctxlua{buffers.feedback("\currentMPgraphicname")}}%
+ \processMPgraphic{\ctxcommand{feedback("\currentMPgraphicname")}}%
\endMPgraphicgroup}}
\def\runMPbuffer
@@ -735,8 +704,6 @@
\def\resetMPenvironment
{\ctxlua{metapost.tex.reset()}}
-\resetMPenvironment
-
\def\useMPenvironmentbuffer[#1]%
{\ctxlua{metapost.tex.set(buffers.content("#1"))}}
@@ -774,6 +741,23 @@
\let\stopMPcode\relax
+\def\MPcode{\dosinglegroupempty\doMPcode}
+
+\def\doMPcode
+ {\iffirstargument
+ \expandafter\dodoMPcode
+ \else
+ \expandafter\nodoMPcode
+ \fi}
+
+\def\dodoMPcode#1#2%
+ {\beginMPgraphicgroup{#1::\s!dummy}% name does not matter
+ \processMPgraphic{#2}%
+ \endMPgraphicgroup}
+
+\def\nodoMPcode#1#2%
+ {\processMPgraphic{#2}}
+
% a bit nasty (also needed for compatibility:
% \startMPrun input mp-www.mp ; \stopMPrun
@@ -846,17 +830,7 @@
%D Loading specific \METAPOST\ related definitions is
%D accomplished by:
-\def\douseMPlibrary#1%
- {\ifcsname\c!file\f!metapostprefix#1\endcsname\else
- \letvalueempty{\c!file\f!metapostprefix#1}%
- \makeshortfilename[\truefilename{\f!metapostprefix#1}]%
- \startreadingfile
- \readsysfile\shortfilename{\showmessage\m!metapost1{#1}}\donothing
- \stopreadingfile
- \fi}
-
-\def\useMPlibrary[#1]%
- {\processcommalist[#1]\douseMPlibrary}
+\unexpanded\def\useMPlibrary[#1]{\ctxlua{metapost.uselibrary(\!!bs#1\!!es)}}
%D \macros
%D {setMPtext, MPtext, MPstring, MPbetex}
@@ -905,6 +879,7 @@
\stopMPextensions
\startMPinitializations
+ CurrentLayout:="\currentlayout";
OverlayWidth:=\overlaywidth;
OverlayHeight:=\overlayheight;
OverlayDepth:=\overlayheight;
@@ -990,58 +965,6 @@
\newtoks\everyinsertMPfile
-% removed in backend:
-%
-% \def\doinsertMPfile#1%
-% {\doiffileelse{./#1}{\includeMPasPDF{./#1}}{\message{[MP #1]}}}
-%
-% \let\insertMPfileARG\insertMPfile
-%
-% \def\insertMPfile#1#2% in context #2 is empty
-% {\doifelsenothing{#2}{\doinsertMPfile{#1}}{\insertMPfileARG{#1}{#2}}}
-%
-% \def\includeMPasEPS#1% untested !!
-% {\bgroup
-% \message{[MP as EPS #1]}%
-% \the\everyinsertMPfile
-% \dogetEPSboundingbox{#1}\!!widtha\!!heighta\!!widthb\!!heightb
-% \setbox\scratchbox\vbox to \!!heightb
-% {\vfill
-% \let \@@DriverImageType \c!mps
-% \def \@@DriverImageFile {#1}%
-% \edef\@@DriverImageWidth {\the\!!widthb }%
-% \edef\@@DriverImageHeight{\the\!!heightb}%
-% \doinsertfile}%
-% \wd\scratchbox\!!widthb
-% \dp\scratchbox\zeropoint
-% \box\scratchbox
-% \egroup}
-%
-% \def\includeMPasPDF#1%
-% {\bgroup
-% \the\everyinsertMPfile
-% \ifinobject \else \chardef\makeMPintoPDFobject\plustwo \fi % when needed
-% \convertMPtoPDF{#1}{1}{1}% no \plusone !
-% \egroup}
-%
-% %D So, using a low level approach (thereby avoiding the slower
-% %D figure analysis macros) pays off. This kind of
-% %D optimizations are a bit tricky since we must make sure that
-% %D special resources end up in the (PDF) files. Because the
-% %D \METAPOST\ to \PDF\ can handle objects itself, it is not
-% %D that complicated.
-%
-% %D We hook a couple of initializations into the graphic
-% %D macros.
-%
-% \appendtoks
-% \let\figuretypes\c!mps
-% \runutilityfilefalse
-% \consultutilityfilefalse
-% \to \everyinsertMPfile
-%
-% %D One more: (still needed?)
-
\startMPextensions
def initialize_form_numbers =
do_initialize_numbers;
@@ -1105,8 +1028,8 @@
%D Usage:
%D
%D \starttyping
-%D \defineproperty[one][layer][state=start]
-%D \defineproperty[two][layer][state=stop]
+%D \defineviewerlayer[one][state=start]
+%D \defineviewerlayer[two][state=stop]
%D
%D \startuseMPgraphic{step-1}
%D fill fullcircle scaled 10cm withcolor red ;
@@ -1116,8 +1039,8 @@
%D fill fullcircle scaled 5cm withcolor green ;
%D \stopuseMPgraphic
%D
-%D \setlayer[mp]{\property[one]{\useMPgraphic{step-1}}}
-%D \setlayer[mp]{\property[two]{\useMPgraphic{step-2}}}
+%D \setlayer[mp]{\viewerlayer[one]{\useMPgraphic{step-1}}}
+%D \setlayer[mp]{\viewerlayer[two]{\useMPgraphic{step-2}}}
%D
%D \ruledhbox{\flushlayer[mp]}
%D \stoptyping
@@ -1210,7 +1133,7 @@
%D In any case we need to tell the converter what the inherited color
%D is to start with. Case~3 is kind of unpredictable as it closely
%D relates to the order in which paths are flushed. If you want to
-%Dinherit automatically from the surrounding, you can best stick to
+%D inherit automatically from the surrounding, you can best stick to
%D variant 1. Variant 0 (an isolated graphic) is the default.
%D
%D \startbuffer
@@ -1226,21 +1149,21 @@
%D \stopuseMPgraphic
%D
%D \starttabulate
-%D \NC 0\quad \NC \chardef\MPcolormethod0 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
-%D \NC 1\quad \NC \chardef\MPcolormethod1 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
-%D \NC 2\quad \NC \chardef\MPcolormethod2 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
-%D \NC 3\quad \NC \chardef\MPcolormethod3 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
+%D \NC 0\quad \NC \MPcolormethod0 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
+%D \NC 1\quad \NC \MPcolormethod1 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
+%D \NC 2\quad \NC \MPcolormethod2 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
+%D \NC 3\quad \NC \MPcolormethod3 \green XX\quad \useMPgraphic{test}\quad XX \NC \NR
%D \stoptabulate
%D \stopbuffer
%D
%D \typebuffer \getbuffer
-\chardef\MPcolormethod\zerocount
+\newconstant\MPcolormethod
% can be faster, just
\appendtoks
- \ctxlua{metapost.set_outer_color(\number\MPcolormethod,\number\currentcolormodel,\number\dogetattribute{color},\number\dogetattribute{transparency})}%
+ \ctxlua{metapost.setoutercolor(\number\MPcolormethod,\number\currentcolormodel,\number\dogetattribute{color},\number\dogetattribute{transparency})}%
\to \everyMPgraphic
\startMPinitializations
@@ -1264,7 +1187,7 @@
%D behave in unexpected ways.
\appendtoks
- \doifelse\@@mpcolor\v!global{\chardef\MPcolormethod\plusone}{\chardef\MPcolormethod\zerocount}%
+ \doifelse\@@mpcolor\v!global{\MPcolormethod\plusone}{\MPcolormethod\zerocount}%
\to \everysetupMPgraphics
\setupMPgraphics
diff --git a/Master/texmf-dist/tex/context/base/meta-mis.mkii b/Master/texmf-dist/tex/context/base/meta-mis.mkii
new file mode 100644
index 00000000000..29ab43007e7
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/meta-mis.mkii
@@ -0,0 +1,54 @@
+%D \module
+%D [ file=meta-mis,
+%D version=2006.06.06,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Misc Test Graphics,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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
+
+% p/s 1/false 1/true 2/false 2/true
+%
+% MKII 8.5 8.0 8.8 8.5
+% MKIV 16.1 7.2 16.3 7.4
+
+\startuseMPgraphic{mptopdf-test}
+ prologues := 2;
+ mpprocset := 1 ;
+ fill fullcircle scaled 3cm withcolor red ;
+ fill fullcircle scaled 2cm withcolor green ;
+ fill fullcircle scaled 1cm withcolor blue ;
+ currentpicture := currentpicture shifted (-4cm,0) ;
+ fill fullcircle scaled 3cm withcolor cmyk(0,0,1,0) ;
+ fill fullcircle scaled 2cm withcolor cmyk(0,1,0,0) ;
+ fill fullcircle scaled 1cm withcolor cmyk(1,0,0,0) ;
+ currentpicture := currentpicture shifted (-4cm,0) ;
+ draw fullcircle scaled 3cm dashed evenly ;
+ draw fullcircle scaled 2cm dashed withdots ;
+ draw origin withpen pencircle scaled 3mm;
+ currentpicture := currentpicture shifted (-4cm,0) ;
+ fill fullcircle scaled 2cm shifted (-.5cm,+.5cm) withcolor transparent(1,.5,red);
+ fill fullcircle scaled 2cm shifted (-.5cm,-.5cm) withcolor transparent(1,.5,red);
+ fill fullcircle scaled 2cm shifted (+.5cm,+.5cm) withcolor transparent(1,.5,green);
+ fill fullcircle scaled 2cm shifted (+.5cm,-.5cm) withcolor transparent(1,.5,cmyk(1,0,1,.5));
+ currentpicture := currentpicture shifted (12cm,-4cm) ;
+ draw "o e p s" infont defaultfont scaled 2 shifted (-1cm,0) ;
+ currentpicture := currentpicture shifted (-4cm,0) ;
+ % bug: shift
+ draw fullcircle scaled 3cm withpen pencircle yscaled 3mm xscaled 2mm rotated 30 ;
+ draw fullcircle scaled 2cm withpen pencircle yscaled 3mm xscaled 2mm rotated 20 withcolor red ;
+ filldraw fullcircle scaled 1cm withpen pencircle yscaled 3mm xscaled 2mm rotated 10 withcolor green ;
+ currentpicture := currentpicture shifted (-4cm,0) ;
+ % shade cannot handle shift
+ circular_shade(fullcircle scaled 3cm,0,.2red,.9green) ;
+ circular_shade(fullcircle scaled 3cm shifted(+4cm,0),0,cmyk(1,0,0,0),cmyk(0,1,0,0)) ;
+ filldraw boundingbox currentpicture enlarged (-bbheight(currentpicture)/2+2.5mm) withpen pencircle scaled 1pt withcolor .5white ;
+\stopuseMPgraphic
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/meta-nav.mkii b/Master/texmf-dist/tex/context/base/meta-nav.mkii
new file mode 100644
index 00000000000..9c1cbb4dbb4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/meta-nav.mkii
@@ -0,0 +1,65 @@
+%D \module
+%D [ file=meta-nav,
+%D version=2003.03.28,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Navigational Graphics,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startuniqueMPgraphic{navplus}{size,color,type,mode}
+ color c ; numeric s, t ; path p ;
+ t := \MPvar{type} ; c := \MPvar{color} ; s := \MPvar{size} ;
+ if \MPvar{mode} = 1 : c := .5[c,white] fi ;
+ if t = 1 :
+ p := ((0,0)--(1/2,0)--(1,1/3)--(1,1)--(0,1)--(0,0)--cycle)
+ xyscaled (3,4) ;
+ elseif t = 2 :
+ p := ((0,0)--(1,0)--(1,1)--(0,1)--(1/2,2/5)--(1,1)--(0,1)--cycle)
+ xyscaled (4,3) ;
+ else :
+ p := fullsquare xyscaled (3,3) ;
+ fi ;
+ draw p withpen pencircle scaled (1/2) withcolor .75white ;
+ fill p withcolor c ;
+ draw p withpen pencircle scaled (1/3) withcolor .5c ;
+ currentpicture := currentpicture scaled s ;
+ currentpicture := currentpicture shifted -center currentpicture ;
+\stopuniqueMPgraphic
+
+\setupMPvariables
+ [navplus]
+ [size=1ex,
+ color=black,
+ type=1,
+ mode=0]
+
+\definepalet
+ [navplus]
+ [attach=darkred,
+ comment=darkblue]
+
+\definesymbol
+ [comment-normal]
+ [\uniqueMPgraphic{navplus}{type=1,color=navplus:comment}]
+\definesymbol
+ [comment-down]
+ [\uniqueMPgraphic{navplus}{type=1,color=navplus:comment,mode=1}]
+
+\definesymbol
+ [attach-normal]
+ [\uniqueMPgraphic{navplus}{type=2,color=navplus:attach}]
+\definesymbol
+ [attach-down]
+ [\uniqueMPgraphic{navplus}{type=2,color=navplus:attach,mode=1}]
+
+\unprotect
+
+\setupcomment [\c!symbol={comment-normal,comment-down}]
+\setupattachments[\c!symbol={attach-normal,attach-down}]
+
+\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 23f8d4de05d..b554810ee93 100644
--- a/Master/texmf-dist/tex/context/base/meta-pdf.lua
+++ b/Master/texmf-dist/tex/context/base/meta-pdf.lua
@@ -13,7 +13,10 @@ if not modules then modules = { } end modules ['meta-pdf'] = {
local concat, format, gsub, find, byte, gmatch, match = table.concat, string.format, string.gsub, string.find, string.byte, string.gmatch, string.match
local lpegmatch = lpeg.match
local round = math.round
-local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+
+local report_mptopdf = logs.reporter("graphics","mptopdf")
+
+local mplib, metapost, lpdf, context = mplib, metapost, lpdf, context
local pdfrgbcode = lpdf.rgbcode
local pdfcmykcode = lpdf.cmykcode
@@ -21,9 +24,12 @@ local pdfgraycode = lpdf.graycode
local pdfspotcode = lpdf.spotcode
local pdftransparencycode = lpdf.transparencycode
local pdffinishtransparencycode = lpdf.finishtransparencycode
+local pdfliteral = nodes.pool.pdfliteral
-mptopdf = { }
-mptopdf.n = 0
+metapost.mptopdf = metapost.mptopdf or { }
+local mptopdf = metapost.mptopdf
+
+mptopdf.nofconverted = 0
local m_path, m_stack, m_texts, m_version, m_date, m_shortcuts = { }, { }, { }, 0, 0, false
@@ -44,18 +50,16 @@ end
resetall()
--- todo: collect and flush packed using pdfliteral node injection but we're
--- in no hurry as this kind of conversion does not happen that often in mkiv
-
-local function pdfcode(str) -- could be a node.write instead
- texsprint(ctxcatcodes,"\\pdfliteral{",str,"}")
-end
+-- -- this does not work as expected (displacement of text)
+-- -- beware, needs another comment hack
+--
+-- local function pdfcode(str)
+-- context(pdfliteral(str))
+-- end
-local function texcode(str)
- texsprint(ctxcatcodes,str)
-end
+local pdfcode = context.pdfliteral
-function mpscode(str)
+local function mpscode(str)
if ignore_path then
pdfcode("h W n")
if extra_path_code then
@@ -92,11 +96,11 @@ local function flushpath(cmd)
local px, py = v[3], v[4] ; v[3], v[4] = (sy*(px-tx)-ry*(py-ty))/d, (sx*(py-ty)-rx*(px-tx))/d -- mpconcat(v[3],v[4])
local px, py = v[5], v[6] ; v[5], v[6] = (sy*(px-tx)-ry*(py-ty))/d, (sx*(py-ty)-rx*(px-tx))/d -- mpconcat(v[5],v[6])
end
- path[#path+1] = concat(v," ")
+ path[k] = concat(v," ")
end
else
for k=1,#m_stack_path do
- path[#path+1] = concat(m_stack_path[k]," ")
+ path[k] = concat(m_stack_path[k]," ")
end
end
flushconcat()
@@ -112,7 +116,7 @@ end
-- mp interface
-mps = mps or { }
+local mps = { }
function mps.creator(a, b, c)
m_version = tonumber(b)
@@ -127,7 +131,7 @@ function mps.newpath()
end
function mps.boundingbox(llx, lly, urx, ury)
- texcode("\\MPSboundingbox{" .. llx .. "}{" .. lly .. "}{" .. urx .. "}{" .. ury .. "}")
+ context.MPSboundingbox(llx,lly,urx,ury)
end
function mps.moveto(x,y)
@@ -144,10 +148,13 @@ end
function mps.rlineto(x,y)
local dx, dy = 0, 0
- if #m_stack_path > 0 then
- dx, dy = m_stack_path[#m_stack_path][1], m_stack_path[#m_stack_path][2]
+ local topofstack = #m_stack_path
+ if topofstack > 0 then
+ local msp = m_stack_path[topofstack]
+ dx = msp[1]
+ dy = msp[2]
end
- m_stack_path[#m_stack_path+1] = {dx,dy,"l"}
+ m_stack_path[topofstack+1] = {dx,dy,"l"}
end
function mps.translate(tx,ty)
@@ -221,7 +228,7 @@ function mps.textext(font, scale, str) -- old parser
dx, dy = m_stack_path[1][1], m_stack_path[1][2]
end
flushconcat()
- texcode("\\MPStextext{"..font.."}{"..scale.."}{"..str.."}{"..dx.."}{"..dy.."}")
+ context.MPStextext(font,scale,str,dx,dy)
resetpath()
end
@@ -304,9 +311,9 @@ end
-- not supported in mkiv , use mplib instead
-handlers[10] = function() logs.report("mptopdf","skipping special %s",10) end
-handlers[20] = function() logs.report("mptopdf","skipping special %s",20) end
-handlers[50] = function() logs.report("mptopdf","skipping special %s",50) end
+handlers[10] = function() report_mptopdf("skipping special %s",10) end
+handlers[20] = function() report_mptopdf("skipping special %s",20) end
+handlers[50] = function() report_mptopdf("skipping special %s",50) end
--end of not supported
@@ -320,7 +327,7 @@ function mps.setrgbcolor(r,g,b) -- extra check
if handler then
handler(s)
else
- logs.report("mptopdf","unknown special handler %s (1)",h)
+ report_mptopdf("unknown special handler %s (1)",h)
end
elseif r == 0.123 and g < 0.1 then
g, b = round(g*1000), round(b*1000)
@@ -330,7 +337,7 @@ function mps.setrgbcolor(r,g,b) -- extra check
if handler then
handler(s)
else
- logs.report("mptopdf","unknown special handler %s (2)",h)
+ report_mptopdf("unknown special handler %s (2)",h)
end
else
pdfcode(pdffinishtransparencycode())
@@ -505,7 +512,6 @@ local verbose = (
-- order matters in terms of speed / we could check for procset first
local captures_old = ( space + verbose + preamble )^0
---~ local captures_new = ( space + procset + preamble + verbose )^0
local captures_new = ( space + verbose + procset + preamble )^0
local function parse(m_data)
@@ -526,25 +532,26 @@ function mptopdf.convertmpstopdf(name)
if ok then
mps.colormodel = tex.attribute[a_colorspace]
statistics.starttiming(mptopdf)
- mptopdf.n = mptopdf.n + 1
- pdfcode(format("\\letterpercent\\space mptopdf begin: n=%s, file=%s",mptopdf.n,file.basename(name)))
+ mptopdf.nofconverted = mptopdf.nofconverted + 1
+ -- pdfcode(format("%% mptopdf begin: n=%s, file=%s",mptopdf.nofconverted,file.basename(name)))
+ pdfcode(format("\\letterpercent\\space mptopdf begin: n=%s, file=%s",mptopdf.nofconverted,file.basename(name)))
pdfcode("q 1 0 0 1 0 0 cm")
parse(m_data)
pdfcode(pdffinishtransparencycode())
pdfcode("Q")
+ -- pdfcode("% mptopdf end")
pdfcode("\\letterpercent\\space mptopdf end")
resetall()
statistics.stoptiming(mptopdf)
else
- commands.writestatus("mptopdf","file '%s' not found",name)
+ report_mptopdf("file '%s' not found",name)
end
end
-
-- status info
statistics.register("mps conversion time",function()
- local n = mptopdf.n
+ local n = mptopdf.nofconverted
if n > 0 then
return format("%s seconds, %s conversions", statistics.elapsedtime(mptopdf),n)
else
diff --git a/Master/texmf-dist/tex/context/base/meta-pdf.mkii b/Master/texmf-dist/tex/context/base/meta-pdf.mkii
index 2099b0d370c..0ba3fb9799d 100644
--- a/Master/texmf-dist/tex/context/base/meta-pdf.mkii
+++ b/Master/texmf-dist/tex/context/base/meta-pdf.mkii
@@ -149,9 +149,9 @@
%D The last object number used is avaliable in the macro
%D \type {\lastPDFMPobject}.
-\ifx\makeMPintoPDFobject \undefined \chardef\makeMPintoPDFobject \zerocount \fi
-\ifx\blackoutMPgraphic \undefined \chardef\blackoutMPgraphic \plusone \fi
-\ifx\everyMPtoPDFconversion\undefined \newtoks\everyMPtoPDFconversion \fi
+\ifx\makeMPintoPDFobject \undefined \newcount\makeMPintoPDFobject \fi
+\ifx\blackoutMPgraphic \undefined \chardef\blackoutMPgraphic\plusone \fi
+\ifx\everyMPtoPDFconversion\undefined \newtoks\everyMPtoPDFconversion \fi
\let\lastPDFMPobject \!!zerocount
\let\currentPDFresources\empty
@@ -238,7 +238,7 @@
\def\dopackageMPgraphic#1% #1 = boxregister
{\ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else
% an existing value of 2 signals object support (set elsewhere)
- \chardef\makeMPintoPDFobject\plusone
+ \makeMPintoPDFobject\plusone
\fi\fi
\ifcase\makeMPintoPDFobject
\box#1%
diff --git a/Master/texmf-dist/tex/context/base/meta-pdf.mkiv b/Master/texmf-dist/tex/context/base/meta-pdf.mkiv
index fa9627fbe75..4d5e5232add 100644
--- a/Master/texmf-dist/tex/context/base/meta-pdf.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-pdf.mkiv
@@ -57,7 +57,7 @@
\forgetall
\offinterlineskip
\setbox\scratchbox\vbox\bgroup
- \ctxlua{mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces
+ \ctxlua{metapost.mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces
\egroup
\setbox\scratchbox\hbox\bgroup
\hskip-\MPllx\onebasepoint
diff --git a/Master/texmf-dist/tex/context/base/meta-pdh.lua b/Master/texmf-dist/tex/context/base/meta-pdh.lua
index 05cdfc176d0..117300f8019 100644
--- a/Master/texmf-dist/tex/context/base/meta-pdh.lua
+++ b/Master/texmf-dist/tex/context/base/meta-pdh.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['meta-pdf'] = {
license = "see context related readme files"
}
+os.exit()
+
-- This file contains the history of the converter. We keep it around as it
-- relates to the development of luatex.
@@ -27,10 +29,14 @@ local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
local tostring, tonumber, select = tostring, tonumber, select
local lpegmatch = lpeg.match
-mptopdf = { }
-mptopdf.parsers = { }
-mptopdf.parser = 'none'
-mptopdf.n = 0
+local metapost = metapost
+
+metapost.mptopdf = metapost.mptopdf or { }
+local mptopdf = metapost.mptopdf
+
+mptopdf.parsers = { }
+mptopdf.parser = 'none'
+mptopdf.nofconverted = 0
function mptopdf.reset()
mptopdf.data = ""
@@ -126,9 +132,9 @@ function mptopdf.steps.convert()
mptopdf.data = gsub(mptopdf.data,"%s*([^%a]-)%s*(%a+)", function(args,cmd)
if cmd == "textext" then
t = mptopdf.texts[tonumber(args)]
- return "mps.textext(" .. "\"" .. t[2] .. "\"," .. t[3] .. ",\"" .. t[1] .. "\")\n"
+ return "metapost.mps.textext(" .. "\"" .. t[2] .. "\"," .. t[3] .. ",\"" .. t[1] .. "\")\n"
else
- return "mps." .. cmd .. "(" .. gsub(args," +",",") .. ")\n"
+ return "metapost.mps." .. cmd .. "(" .. gsub(args," +",",") .. ")\n"
end
end)
end
@@ -217,7 +223,7 @@ end
function mptopdf.convertmpstopdf(name)
if mptopdf.loaded(name) then
- mptopdf.n = mptopdf.n + 1
+ mptopdf.nofconverted = mptopdf.nofconverted + 1
statistics.starttiming(mptopdf)
mptopdf.parse()
mptopdf.reset()
@@ -229,7 +235,8 @@ end
-- mp interface
-mps = mps or { }
+metapost.mps = metapost.mps or { }
+local mps = metapost.mps or { }
function mps.creator(a, b, c)
mptopdf.version = tonumber(b)
@@ -593,7 +600,7 @@ mptopdf.parser = 'lpeg'
-- status info
statistics.register("mps conversion time",function()
- local n = mptopdf.n
+ local n = mptopdf.nofconverted
if n > 0 then
return format("%s seconds, %s conversions", statistics.elapsedtime(mptopdf),n)
else
diff --git a/Master/texmf-dist/tex/context/base/meta-pdh.mkiv b/Master/texmf-dist/tex/context/base/meta-pdh.mkiv
index 7cdd1471f67..978128f3a2d 100644
--- a/Master/texmf-dist/tex/context/base/meta-pdh.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-pdh.mkiv
@@ -36,7 +36,7 @@
%D First we define a handy constant:
-\bgroup \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup
+\bgroup \catcode\commentasciicode\othercatcode \xdef\letterpercent{\string%} \egroup
%D \macros
%D {convertMPtoPDF}
@@ -78,8 +78,8 @@
%D The last object number used is avaliable in the macro
%D \type {\lastPDFMPobject}.
-\ifx\makeMPintoPDFobject \undefined \chardef\makeMPintoPDFobject \zerocount \fi
-\ifx\everyMPtoPDFconversion\undefined \newtoks\everyMPtoPDFconversion \fi
+\ifx\makeMPintoPDFobject \undefined \newconstant\makeMPintoPDFobject \fi
+\ifx\everyMPtoPDFconversion\undefined \newtoks \everyMPtoPDFconversion \fi
\let\lastPDFMPobject \!!zerocount
\let\currentPDFresources\empty
@@ -112,7 +112,7 @@
\startMPresources
\pdfliteral{\letterpercent\space mps begin}%
\pdfliteral{q 1 0 0 1 0 0 cm}%
- \ctxlua{mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces
+ \ctxlua{metapost.mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces
\pdfliteral{Q}%
\pdfliteral{\letterpercent\space mps end}%
\stopMPresources
@@ -144,7 +144,7 @@
\def\dopackageMPgraphic#1% #1 = boxregister
{\ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else
% an existing value of 2 signals object support (set elsewhere)
- \chardef\makeMPintoPDFobject\plusone
+ \makeMPintoPDFobject\plusone
\fi\fi
\ifcase\makeMPintoPDFobject
\box#1%
@@ -555,7 +555,7 @@
% {\noexpand\handleMPfigurespecial{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}{\gMPs7}{\gMPs8}}}
%
% \def\handleMPfigurespecial#1#2#3#4#5#6#7#8% todo : combine with ext fig
-% {\global\letvalue{\@@MPSK#8}\empty
+% {\letgvalueempty{\@@MPSK#8}%
% \vbox to \zeropoint
% {\vss
% \hbox to \zeropoint
@@ -595,9 +595,9 @@
% {\noexpand\handleMPhyperlink{\gMPs1}{\gMPs2}{\gMPs3}{\gMPs4}{\gMPs5}{\gMPs6}}}
%
% \def\handleMPhyperlink#1#2#3#4#5#6%
-% {\global\letvalue{\@@MPSK#6}\empty
+% {\letgvalueempty{\@@MPSK#6}%
% \setbox\scratchbox\hbox
-% {\setbox\scratchbox\null
+% {\setbox\scratchbox\emptyhbox
% \wd\scratchbox\dimexpr-#1\onebasepoint+#3\onebasepoint\relax
% \ht\scratchbox\dimexpr-#2\onebasepoint+#4\onebasepoint\relax
% \gotobox{\box\scratchbox}[#5]}%
diff --git a/Master/texmf-dist/tex/context/base/meta-pre.mkii b/Master/texmf-dist/tex/context/base/meta-pre.mkii
new file mode 100644
index 00000000000..cb861ff20d5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/meta-pre.mkii
@@ -0,0 +1,68 @@
+%D \module
+%D [ file=meta-pre,
+%D version=2001.03.21,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Predefined Goodies,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 In this library, we define a couple of handy graphics.
+
+% todo: use the predefine grid macros, mp code will move to
+% mp-* file
+
+\startuseMPgraphic{pagegrid}
+ StartPage ;
+ drawoptions(withcolor .8white) ;
+ fill Field[Text][Text] ;
+ drawoptions(withcolor .65white) ;
+ fill Field[Footer][Text] ;
+ fill Field[Header][Text] ;
+ fill Field[LeftMargin][Text] ;
+ fill Field[RightMargin][Text] ;
+ drawoptions(withcolor .65yellow) ;
+ fill Field[LeftEdge][Text] ;
+ fill Field[RightEdge][Text] ;
+ fill Field[Bottom][Text] ;
+ fill Field[Top][Text] ;
+ drawoptions(withpen pencircle scaled .3pt withcolor .65white) ;
+ for i=-3cm step 1cm until PaperWidth+3cm :
+ draw (i,-3cm)--(i,PaperHeight+3cm) ;
+ endfor ;
+ for i=PaperHeight+3cm step -1cm until -3cm :
+ draw (-3cm,i)--(PaperWidth+3cm,i) ;
+ endfor ;
+ drawoptions(withpen pencircle scaled .15pt) ;
+ for i=.5cm-3cm step 1cm until PaperWidth+3cm :
+ draw (i,-3cm)--(i,PaperHeight+3cm) ;
+ endfor ;
+ for i=PaperHeight-.5cm+3cm step -1cm until -3cm :
+ draw (-3cm,i)--(PaperWidth+3cm,i) ;
+ endfor ;
+ drawoptions(withpen pencircle scaled .3pt withcolor .65red) ;
+ for i=0 step 1cm until PaperWidth :
+ draw (i,0)--(i,PaperHeight) ;
+ endfor ;
+ for i=PaperHeight step -1cm until 0 :
+ draw (0,i)--(PaperWidth,i) ;
+ endfor ;
+ drawoptions(withpen pencircle scaled .15pt withcolor .65red) ;
+ for i=.5cm step 1cm until PaperWidth :
+ draw (i,0)--(i,PaperHeight) ;
+ endfor ;
+ for i=PaperHeight-.5cm step -1cm until 0 :
+ draw (0,i)--(PaperWidth,i) ;
+ endfor ;
+ drawoptions(withpen pencircle scaled 5pt withcolor .65red) ;
+ draw ulcorner Page ;
+ StopPage ;
+\stopuseMPgraphic
+
+\defineoverlay[pagegrid][\useMPgraphic{pagegrid}]
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/meta-tex.lua b/Master/texmf-dist/tex/context/base/meta-tex.lua
new file mode 100644
index 00000000000..872e8154c4f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/meta-tex.lua
@@ -0,0 +1,38 @@
+if not modules then modules = { } end modules ['meta-tex'] = {
+ version = 1.001,
+ comment = "companion to meta-tex.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--~ local P, C, lpegmatch = lpeg.P, lpeg.C, lpeg.match
+
+-- local left = P("[")
+-- local right = P("]")
+-- local space = P(" ")
+-- local argument = left * C((1-right)^1) * right
+-- local pattern = (argument + space)^0
+
+-- function metapost.sometxt(optional,str)
+-- if optional == "" then
+-- context.sometxta(str)
+-- else
+-- local one, two = lpegmatch(pattern,optional)
+-- if two then
+-- context.sometxtc(one,two,str)
+-- elseif one then
+-- context.sometxtb(one,str)
+-- else
+-- context.sometxta(str)
+-- end
+-- end
+-- end
+
+local P, Cs, lpegmatch = lpeg.P, lpeg.Cs, lpeg.match
+
+local pattern = Cs((P([[\"]]) + P([["]])/"\\quotedbl{}" + P(1))^0)
+
+function metapost.escaped(str)
+ context(lpegmatch(pattern,str))
+end
diff --git a/Master/texmf-dist/tex/context/base/meta-tex.mkiv b/Master/texmf-dist/tex/context/base/meta-tex.mkiv
index e35f9538567..2496440c700 100644
--- a/Master/texmf-dist/tex/context/base/meta-tex.mkiv
+++ b/Master/texmf-dist/tex/context/base/meta-tex.mkiv
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+\registerctxluafile{meta-tex}{1.001}
+
\unprotect
% Ok, we support this in MkIV because Mojca kept the pressure on. It
@@ -47,12 +49,119 @@
% draw \sometxt[framed]{black} rotated 45 ;
% \stopMPcode
-\unexpanded\def\definetextext[#1]#2{\setvalue{@@st@@[#1]}{#2}\setvalue{@@st@@[#1] }{#2}} % we don't grab spaces after [#1]
+% \unexpanded\def\definetextext[#1]#2{\setvalue{@@st@@[#1]}{#2}\setvalue{@@st@@[#1] }{#2}} % we don't grab spaces after [#1]
+% \long\def\sometxt #1#{\dosometxt{#1}} % grab optional [args]
+% \long\def\dosometxt #1#2{textext.drt("\ifcsname @@st@@#1\endcsname\csname @@st@@#1\endcsname{#2}\else#2\fi")}
+
+% But Mojca wanted more! Two arguments.
+%
+% \definetextext[framed]{\framed}
+%
+% \startMPcode
+% draw \sometxt{This is for} rotated 45 ;
+% draw \sometxt[framed][ss,16pt]{Mojca's};
+% draw \sometxt[framed]{eyes only!} rotated -45 ;
+% \stopMPcode
+
+% a tex one:
+%
+% \unexpanded\def\definetextext [#1]#2{\setvalue{@@st@@#1}{#2}}
+% \def\sometxt #1#{\dosometxt{#1}}
+% \def\dosometxt #1#2{textext.drt("\dodosometxt#1{#2}")}
+%
+% \unexpanded\def\dodosometxt {\doifnextoptionalelse\dododosometxt\relax}
+% \def\dododosometxt [#1]{\dodododosometxt{#1}}
+% \def\dodododosometxt #1{\doifnextoptionalelse{\dododododosometxt{#1}}{\getsometxt{#1}}}
+% \def\dododododosometxt #1[#2]{\switchtobodyfont[#2]\getsometxt{#1}}
+% \def\getsometxt #1#2{\csname @@st@@#1\endcsname{#2}}
+%
+% or:
+%
+% \unexpanded\def\dodosometxt {\dodoubleempty\dododosometxt}
+% \def\dododosometxt {\ifsecondargument
+% \expandafter\dododosometxtA
+% \else\iffirstargument
+% \expandafter\expandafter\expandafter\dododosometxtB
+% \else
+% \expandafter\expandafter\expandafter\dododosometxtC
+% \fi\fi}
+% \def\dododosometxtA[#1][#2]#3{\getsometxt{#1}{\switchtobodyfont[#2]#3}}
+% \def\dododosometxtB[#1][#2]#3{\getsometxt{#1}{#3}}
+% \def\dododosometxtC[#1][#2]#3{#3}
+% \def\getsometxt #1#2{\csname @@st@@#1\endcsname{#2}}
+%
+% a nicer variant:
+
+\unexpanded\def\definetextext[#1]%
+ {\def\currenttextext{#1}%
+ \dosingleempty\dodefinetextext}
+
+\def\dodefinetextext
+ {\iffirstargument
+ \expandafter\dodefinetextextone
+ \else
+ \expandafter\dodefinetextextzero
+ \fi}
-\long\def\sometxt#1#{\dosometxt{#1}} % grab optional [args]
+\def\dodefinetextextone {\setvalue{@@st@@one\currenttextext}}
+\def\dodefinetextextzero[#1]{\setvalue{@@st@@zero\currenttextext}}
-\long\def\dosometxt#1#2%
- {textext.drt("\ifcsname @@st@@#1\endcsname\csname @@st@@#1\endcsname{#2}\else#2\fi")}
+\def\sometxt#1#%
+ {\dosometxt{#1}}
+
+\def\dosometxt#1#2% we need to capture embedded quotes (a bit messy as later on textext is filtered
+ {textext.drt("\dodosometxt#1{\ctxlua{metapost.escaped(\!!bs#2\!!es)}}")}
+
+\unexpanded\def\dodosometxt
+ {\dosingleempty\dododosometxt}
+
+\def\dododosometxt
+ {\iffirstargument
+ \expandafter\dosometxtsome
+ \else
+ \expandafter\dosometxtzero
+ \fi}
+
+\def\dosometxtsome[#1]%
+ {\def\currenttextext{#1}%
+ \csname @@st@@%
+ \ifcsname @@st@@one#1\endcsname one\else
+ \ifcsname @@st@@zero#1\endcsname zero\else
+ none\fi\fi
+ \endcsname}
+
+\def\dosometxtzero[#1]%
+ {}
+
+\def\@@st@@one {\dosingleempty\do@@st@@one}
+\def\do@@st@@one{\csname @@st@@one\currenttextext\endcsname}
+\def\@@st@@zero {\csname @@st@@zero\currenttextext\endcsname}
+\def\@@st@@none {}
+
+% \definetextext[framed][#1]#2{\framed[width=4cm]{\switchtobodyfont[#1]#2}}
+% \definetextext[simple]{\framed[width=8cm]}
+%
+% \starttext
+%
+% \startMPcode
+% draw \sometxt{This is for} rotated 45 ;
+% draw \sometxt [framed] [ss,16pt] {Mojca's};
+% draw \sometxt[framed]{eyes only!} rotated -45 ;
+% draw \sometxt[simple]{Quotes "indeed" work!} rotated 180 ;
+% \stopMPcode
+%
+% \stoptext
+%
+% a lua one:
+%
+% \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\sometxta #1{textext.drt("#1")}
+% \def\sometxtb #1#2{textext.drt("\getvalue{@@st@@#1}{#2}")}
+% \def\sometxtc #1#2#3{textext.drt("\getvalue{@@st@@#1}{\switchtobodyfont[#2]#3}")}
% Best use the mp macro instead since it provides positioning.
%
diff --git a/Master/texmf-dist/tex/context/base/meta-txt.mkii b/Master/texmf-dist/tex/context/base/meta-txt.mkii
new file mode 100644
index 00000000000..474253a4052
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/meta-txt.mkii
@@ -0,0 +1,304 @@
+%D \module
+%D [ file=meta-txt,
+%D version=2000.07.06,
+%D title=\METAPOST\ Graphics,
+%D subtitle=Text Tricks,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 In this library some handy text manipulations are
+%D defined. Some can and will be improved as soon as the
+%D \TEX||\METAPOST\ interface is stable. Some of the
+%D solutions may look weird, which is entirely my fault,
+%D since I implemented them in the process of getting grip
+%D on this kind of manipulations. Undoubtly better
+%D \METAPOST\ code is possible, but my way of learning
+%D this kind of trickery happens to be by \quote {trial
+%D and error} and \quote {look and feel} (as well as
+%D identifying tricks in Hobby's code).
+
+% textext ipv btex ... etex
+
+% we need a proper prefix here
+
+\unprotect
+
+\startMPextensions
+ if unknown context_text: input mp-text; fi;
+\stopMPextensions
+
+%%%%%%%
+
+% \def\newchar#1{\chardef#1=0 }
+
+\ifdefined\MPtoks \else \newtoks\MPtoks \fi
+\ifdefined\MPbox \else \newbox \MPbox \fi
+
+\ifdefined\parwidth \else \newdimen\parwidth \fi
+\ifdefined\parheight \else \newdimen\parheight \fi
+\ifdefined\parvoffset \else \newdimen\parvoffset \fi
+\ifdefined\parhoffset \else \newdimen\parhoffset \fi
+\ifdefined\parlines \else \newcount\parlines \fi
+\ifdefined\partoks \else \newtoks \partoks \fi
+\ifdefined\shapetextbox \else \newbox \shapetextbox \fi
+ \newif \ifparseries
+\ifdefined\parfirst \else \chardef \parfirst=0 \fi
+
+\def\startshapetext[#1]%
+ {\global\newcounter\currentshapetext
+ \global\setbox\shapetextbox\vbox\bgroup
+ \expanded{\switchtobodyfont[\@@shbodyfont]}%
+ \dontcomplain
+ \hsize\parwidth
+ \setuptolerance[\v!verytolerant,\v!stretch]%
+ \!!counta\zerocount
+ \!!toksa\emptytoks
+ \def\docommand##1%
+ {\setbox\scratchbox\hbox{\useMPgraphic{##1}}%
+ \global\chardef\parfirst\zerocount
+ \getMPdata % \readlocfile{\MPdatafile}{}{}%
+ \setshapecharacteristics
+ \advance\!!counta by \parlines
+ \expandafter\appendtoks\the\partoks\to\!!toksa}%
+ \processcommalist[#1]\docommand
+ \global\parseriestrue
+ \xdef\totalparlines{\the\!!counta}%
+ \global\partoks\!!toksa
+ %\ifx\partoks\emptytoks\else % safeguard
+ \expanded{\parshape \the\!!counta \the\!!toksa}%
+ %\fi
+ \setshapecharacteristics % extra dummy
+ \ifparseries\def\par{\endgraf\adaptparshape}\fi
+ \EveryPar{\begstrut}}
+
+\def\stopshapetext
+ {\endstrut
+ %\removebottomthings
+ \egroup
+ \global\newcounter\currentshapetext
+ \getshapecharacteristics}
+
+\def\adaptparshape%
+ {\def\docommand##1%
+ {\ifcase\!!counta
+ \expandafter\appendtoks\space##1 \to\!!toksa
+ \else
+ \advance\!!counta \minusone
+ \fi}%
+ \!!counta\prevgraf
+ \doglobal\decrement(\totalparlines,\!!counta)%
+ \multiply\!!counta \plustwo
+ \!!toksa\emptytoks
+ \expanded{\processseparatedlist[\the\partoks][\space]}\docommand
+ \global\partoks\!!toksa
+ %\ifx\partoks\emptytoks\else % safeguard
+ \expanded{\parshape\totalparlines\the\partoks}%
+ }%\fi}
+
+\def\getshapecharacteristics%
+ {\doglobal\increment\currentshapetext
+ \doifdefinedelse{parlines:\currentshapetext}
+ {\global\parlines \getvalue{parlines:\currentshapetext}%
+ \global\chardef\parfirst \getvalue{parfirst:\currentshapetext}%
+ \global\parvoffset \getvalue{parvoffset:\currentshapetext}%
+ \global\parhoffset \getvalue{parhoffset:\currentshapetext}%
+ \global\parwidth \getvalue{parwidth:\currentshapetext}%
+ \global\parheight \getvalue{parheight:\currentshapetext}}
+ {\global\parlines \plusone
+ \global\chardef\parfirst \zerocount
+ \global\parvoffset \zeropoint
+ \global\parhoffset \zeropoint
+ \global\parwidth \hsize
+ \global\parheight \vsize}}
+
+\def\setshapecharacteristics%
+ {\doglobal\increment\currentshapetext
+ \setxvalue{parlines:\currentshapetext }{\the\parlines}%
+ \setxvalue{parfirst:\currentshapetext }{\the\parfirst}%
+ \setxvalue{parvoffset:\currentshapetext}{\the\parvoffset}%
+ \setxvalue{parhoffset:\currentshapetext}{\the\parhoffset}%
+ \setxvalue{parwidth:\currentshapetext }{\the\parwidth}%
+ \setxvalue{parheight:\currentshapetext }{\the\parheight}}
+
+\def\getshapetext% option: unvbox
+ {\vbox\bgroup
+ \forgetall
+ \setbox\scratchbox\vbox to \parheight
+ {\expanded{\switchtobodyfont[\@@shbodyfont]}% evt strutheight en
+ \splittopskip\strutheight % lineheight opslaan
+ \vskip\parvoffset % scheelt switch en
+ \ifcase\parfirst\or\vskip\lineheight\fi % is ook veiliger
+ \hskip\parhoffset
+ \hbox{\vsplit\shapetextbox to \parlines\lineheight}}%
+ \wd\scratchbox\parwidth
+ \ht\scratchbox\parheight
+ \dp\scratchbox\zeropoint
+ \box\scratchbox
+ \getshapecharacteristics
+ \egroup}
+
+\def\setupshapetexts%
+ {\dodoubleempty\getparameters[\??sh]}
+
+\setupshapetexts%
+ [\c!bodyfont=]
+
+%%%%%%% rotfont nog definieren
+
+\doifundefined{RotFont}{\definefont[RotFont][RegularBold]}
+
+\def\processfollowingtoken#1% strut toegevoegd
+ {\appendtoks#1\to\MPtoks
+ \setbox\MPbox=\hbox{\RotFont\setstrut\strut\the\MPtoks}%
+ \startMPdrawing
+ n := n + 1 ; len[n] := \the\wd\MPbox ;
+ \stopMPdrawing
+ \startMPdrawing[-]
+ % pic[n] := textext{\RotFont\setstrut\strut#1} ; % btex \RotFont\setstrut\strut#1 etex ;
+ pic[n] := btex \RotFont\setstrut\strut#1 etex ;
+ pic[n] := pic[n] shifted - llcorner pic[n] ;
+ \stopMPdrawing}
+
+\startuseMPgraphic{followtokens}
+ % we default to nothing
+\stopuseMPgraphic
+
+\def\followtokens#1%
+ {\vbox\bgroup
+ \forgetall
+ \dontcomplain
+ \startMPenvironment
+ \doifundefined{RotFont}{\definefont[RotFont][RegularBold]}
+ \stopMPenvironment
+ \MPtoks\emptytoks
+ \resetMPdrawing
+ \startMPdrawing
+ \includeMPgraphic{followtokens} ;
+ picture pic[] ; numeric len[], n ; n := 0 ;
+ \stopMPdrawing
+ \handletokens#1\with\processfollowingtoken
+ \startMPdrawing
+ if unknown RotPath : path RotPath ; RotPath := origin ; fi ;
+ if unknown RotColor : color RotColor ; RotColor := black ; fi ;
+ if unknown TraceRot : boolean TraceRot ; TraceRot := false ; fi ;
+ if unknown ExtraRot : numeric ExtraRot ; ExtraRot := 0 ; fi ;
+ numeric al, at, pl, wid, pos ; pair ap, ad ;
+ al := arclength RotPath ;
+ if al=0 :
+ al := len[n] + ExtraRot ;
+ RotPath := origin -- (al,0) ;
+ fi ;
+ if al<len[n]:
+ RotPath := RotPath scaled ((len[n]+ExtraRot)/al) ;
+ al := arclength RotPath ;
+ fi ;
+ pl := (al-len[n])/(if n>1 : (n-1) else : 1 fi) ;
+ if TraceRot :
+ draw RotPath withpen pencircle scaled 1pt withcolor blue ;
+ fi ;
+ for i=1 upto n :
+ wid := abs(xpart urcorner pic[i] - xpart llcorner pic[i]) ;
+ pos := len[i]-wid/2 + (i-1)*pl ;
+ at := arctime pos of RotPath ;
+ ap := point at of RotPath ;
+ ad := direction at of RotPath ;
+ draw pic[i] shifted (-wid/2,0) rotated(angle(ad)) shifted ap
+ withcolor RotColor ;
+ if TraceRot :
+ draw boundingbox
+ pic[i] shifted (-wid/2,0) rotated(angle(ad)) shifted ap
+ withpen pencircle scaled .25pt withcolor red ;
+ draw ap
+ withpen pencircle scaled .50pt withcolor green ;
+ fi ;
+ endfor ;
+ \stopMPdrawing
+ \MPdrawingdonetrue
+ \getMPdrawing
+ \resetMPdrawing
+ \egroup}
+
+% \followtokens
+% {This is just a dummy text, kerned by T{\kern
+% -.1667em\lower .5ex\hbox {E}}{\kern -.125emX} and typeset
+% in a circle using {\setMFPfont M}{\setMFPfont
+% E}{\setMFPfont T}{\setMFPfont A}{\setMFPfont
+% P}{\setMFPfont O}{\setMFPfont S}{\setMFPfont T}.\quad}
+
+\startuseMPgraphic{fuzzycount}
+ begingroup
+ save height, span, drift, d, cp ;
+ height := 3/ 5 * \baselinedistance ;
+ span := 1/ 3 * height ;
+ drift := 1/10 * height ;
+ pickup pencircle scaled (1/12 * height) ;
+ 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) ;
+ endfor;
+ picture cp ; cp := currentpicture ; % for readability
+ setbounds currentpicture to
+ (llcorner cp shifted (0,-ypart llcorner cp) --
+ lrcorner cp shifted (0,-ypart lrcorner cp) --
+ urcorner cp -- ulcorner cp -- cycle) ;
+ endgroup ;
+\stopuseMPgraphic
+
+\setupMPvariables
+ [fuzzycount]
+ [n=10]
+
+\def\fuzzycount#1%
+ {{\tx\useMPgraphic{fuzzycount}{n=#1}}}
+
+\defineconversion[fuzzy][\fuzzycount]
+
+%%%%%%%
+
+\setupMPvariables
+ [EnglishRule]
+ [height=1ex,
+ width=\the\localhsize, % without \the, problems in non e-tex
+ color=darkgray]
+
+\defineblank
+ [EnglishRule]
+ [medium]
+
+\startuniqueMPgraphic{EnglishRule}{height,width,color}
+ height = \MPvar{height} ;
+ x1 = 0 ; x3 = \MPvar{width} ; x2 = x4 = .5x3 ;
+ y1 = y3 = 0 ; y2 = -y4 = height/2 ;
+ fill z1..z2..z3 & z3..z4..z1 & cycle withcolor \MPvar{color} ;
+\stopuniqueMPgraphic
+
+\def\EnglishRule%
+ {\startlinecorrection[EnglishRule]
+ \setlocalhsize \noindent \reuseMPgraphic{EnglishRule}
+ \stoplinecorrection}
+
+%D The following macro returns a tight bound character
+%D sequence.
+%D
+%D \useMPlibrary[txt]
+%D
+%D \startlinecorrection
+%D \TightText{\ss\bf 123}{0cm}{3cm}{red}
+%D \stoplinecorrection
+
+\def\TightText#1#2#3#4%
+ {\hbox % \ruledhbox
+ {\startMPcode
+ picture p ; p := image (graphictext "#1" withfillcolor red) ;
+ draw p xsized #2 ysized #3 withcolor \MPcolor{#4} ;
+ \stopMPcode}}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/meta-xml.tex b/Master/texmf-dist/tex/context/base/meta-xml.mkii
index f6f81f767b0..f6f81f767b0 100644
--- a/Master/texmf-dist/tex/context/base/meta-xml.tex
+++ b/Master/texmf-dist/tex/context/base/meta-xml.mkii
diff --git a/Master/texmf-dist/tex/context/base/m-pstricks.tex b/Master/texmf-dist/tex/context/base/meta-xml.mkiv
index 28bc9f30f2f..6ce9612ccf9 100644
--- a/Master/texmf-dist/tex/context/base/m-pstricks.tex
+++ b/Master/texmf-dist/tex/context/base/meta-xml.mkiv
@@ -1,8 +1,8 @@
%D \module
-%D [ file=m-pstricks,
-%D version=1997.01.15,
-%D title=\CONTEXT\ Extra Modules,
-%D subtitle=\PSTRICKS\ Connections,
+%D [ file=meta-xml,
+%D version=2002.11.27,
+%D title=\METAPOST\ Graphics,
+%D subtitle=XML Hacks,
%D author=Hans Hagen,
%D date=\currentdate,
%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
@@ -11,6 +11,10 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\loadmarkfile{m-pstricks}
+\writestatus{loading}{MetaPost Graphics / XML Hacks}
-\endinput
+\unprotect
+
+% not needed in mkiv
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/metatex.lus b/Master/texmf-dist/tex/context/base/metatex.lus
new file mode 100644
index 00000000000..df7bc191425
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/metatex.lus
@@ -0,0 +1,9 @@
+if not modules then modules = { } end modules ['metatex'] = {
+ version = 1.001,
+ comment = "companion to metatex.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+return "luat-cod.lua"
diff --git a/Master/texmf-dist/tex/context/base/metatex.tex b/Master/texmf-dist/tex/context/base/metatex.tex
index e90af709c0b..cb965dc48b4 100644
--- a/Master/texmf-dist/tex/context/base/metatex.tex
+++ b/Master/texmf-dist/tex/context/base/metatex.tex
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-%D We can experiment here with runtime loading, id est no longer
+%D We can experiment here with runtime loading, i.e. no longer
%D use a format. However, we still need a stub then but it could
%D as well be luatools (mtxrun) itself then.
@@ -42,7 +42,7 @@
\def\loadcorefile#1{\normalinput#1.tex \relax}
\def\loadmarkfile#1{\normalinput#1.mkiv\relax}
-\loadcorefile{syst-ini}
+\loadmarkfile{syst-ini}
\ifnum\luatexversion<60 % also change message
\writestatus{!!!!}{Your luatex binary is too old, you need at least version 0.60!}
@@ -51,7 +51,8 @@
\newtoks\metatexversiontoks \metatexversiontoks\expandafter{\metatexversion} % at the lua end
-\loadcorefile{syst-pln} % plain tex initializations of internal registers (no further code)
+\loadmarkfile{syst-pln} % plain tex initializations of internal registers (no further code)
+\loadmarkfile{syst-mes}
\loadmarkfile{luat-cod} %
\loadmarkfile{luat-bas} %
@@ -60,10 +61,10 @@
% needs stripping:
\loadmarkfile{catc-ini} % catcode table management
-\loadcorefile{catc-act} % active character definition mechanisms
-\loadcorefile{catc-def} % some generic catcode tables
-\loadcorefile{catc-ctx} % a couple of context specific tables but expected by later modules
-\loadcorefile{catc-sym} % some definitions related to \letter<tokens>
+\loadmarkfile{catc-act} % active character definition mechanisms
+\loadmarkfile{catc-def} % some generic catcode tables
+\loadmarkfile{catc-ctx} % a couple of context specific tables but expected by later modules
+\loadmarkfile{catc-sym} % some definitions related to \letter<tokens>
% helpers, maybe less
@@ -85,6 +86,10 @@
\loadmarkfile{char-ini}
\loadmarkfile{char-enc} % \registerctxluafile{char-enc}{1.001}
+% attributes
+
+\loadmarkfile{attr-ini}
+
% nodes
\loadmarkfile{node-ini}
@@ -149,6 +154,12 @@
\pdfoutput\plusone
+% too
+
+\appendtoks
+ \ctxlua{statistics.savefmtstatus("\jobname","\metatexversion","metatex.tex")}% can become automatic
+\to \everydump
+
% done
\errorstopmode \dump \endinput
diff --git a/Master/texmf-dist/tex/context/base/mlib-ctx.lua b/Master/texmf-dist/tex/context/base/mlib-ctx.lua
index cc5682e6fdc..1a5ce2a2419 100644
--- a/Master/texmf-dist/tex/context/base/mlib-ctx.lua
+++ b/Master/texmf-dist/tex/context/base/mlib-ctx.lua
@@ -8,12 +8,18 @@ if not modules then modules = { } end modules ['mlib-ctx'] = {
-- todo
-local format, join = string.format, table.concat
+local format, concat = string.format, table.concat
local sprint = tex.sprint
+local report_metapost = logs.reporter("metapost")
+
local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
-metapost = metapost or {}
+local mplib = mplib
+
+metapost = metapost or {}
+local metapost = metapost
+
metapost.defaultformat = "metafun"
function metapost.graphic(instance,mpsformat,str,initializations,preamble,askedfig)
@@ -29,7 +35,7 @@ function metapost.getclippath(instance,mpsformat,data,initializations,preamble)
local result = mpx:execute(format("%s;beginfig(1);%s;%s;endfig;",preamble or "",initializations or "",data))
stoptiming(metapost.exectime)
if result.status > 0 then
- logs.report("metafun", "%s: %s", result.status, result.error or result.term or result.log)
+ report_metapost("%s: %s", result.status, result.error or result.term or result.log)
result = nil
else
result = metapost.filterclippath(result)
@@ -62,19 +68,19 @@ end
function metapost.theclippath(...)
local result = metapost.getclippath(...)
if result then -- we could just print the table
- result = join(metapost.flushnormalpath(result),"\n")
+ result = concat(metapost.flushnormalpath(result),"\n")
sprint(result)
end
end
statistics.register("metapost processing time", function()
local n = metapost.n
- if n > 0 then
- local e, t = metapost.externals.n, statistics.elapsedtime
+ if n and n > 0 then
+ local e, t = metapost.makempy.nofconverted, statistics.elapsedtime
local str = format("%s seconds, loading: %s seconds, execution: %s seconds, n: %s",
t(metapost), t(mplib), t(metapost.exectime), n)
if e > 0 then
- return format("%s, external: %s seconds (%s calls)", str, t(metapost.externals), e)
+ return format("%s, external: %s seconds (%s calls)", str, t(metapost.makempy), e)
else
return str
end
@@ -82,3 +88,19 @@ statistics.register("metapost processing time", function()
return nil
end
end)
+
+-- only used in graphictexts
+
+metapost.tex = metapost.tex or { }
+
+local environments = { }
+
+function metapost.tex.set(str)
+ environments[#environments+1] = str
+end
+function metapost.tex.reset()
+ environments = { }
+end
+function metapost.tex.get()
+ return concat(environments,"\n")
+end
diff --git a/Master/texmf-dist/tex/context/base/mlib-pdf.lua b/Master/texmf-dist/tex/context/base/mlib-pdf.lua
index 352070408c1..8000d5a282e 100644
--- a/Master/texmf-dist/tex/context/base/mlib-pdf.lua
+++ b/Master/texmf-dist/tex/context/base/mlib-pdf.lua
@@ -7,14 +7,22 @@ if not modules then modules = { } end modules ['mlib-pdf'] = {
}
local format, concat, gsub = string.format, table.concat, string.gsub
-local texsprint = tex.sprint
local abs, sqrt, round = math.abs, math.sqrt, math.round
+local setmetatable = setmetatable
+local Cf, C, Cg, Ct, P, S, lpegmatch = lpeg.Cf, lpeg.C, lpeg.Cg, lpeg.Ct, lpeg.P, lpeg.S, lpeg.match
-local copy_node, write_node = node.copy, node.write
+local allocate = utilities.storage.allocate
-local ctxcatcodes = tex.ctxcatcodes
+local report_metapost = logs.reporter("metapost")
+
+local mplib, context = mplib, context
+
+local copy_node = node.copy
+local write_node = node.write
metapost = metapost or { }
+local metapost = metapost
+
metapost.multipass = false
metapost.n = 0
metapost.optimize = true -- false
@@ -61,19 +69,19 @@ metapost.flushers.pdf = { }
local savedliterals = nil
-local mpsliteral = nodes.register(node.new("whatsit",8))
+local mpsliteral = nodes.pool.register(node.new("whatsit",8)) -- pdfliteral
-function metapost.flush_literal(d) -- \def\MPLIBtoPDF#1{\ctxlua{metapost.flush_literal(#1)}}
+function metapost.flushliteral(d) -- \def\MPLIBtoPDF#1{\ctxlua{metapost.flush_literal(#1)}}
if savedliterals then
local literal = copy_node(mpsliteral)
literal.data = savedliterals[d]
write_node(literal)
else
- logs.report("metapost","problem flushing literal %s",d)
+ report_metapost("problem flushing literal %s",d)
end
end
-function metapost.flush_reset()
+function metapost.flushreset() -- will become obsolete and internal
savedliterals = nil
end
@@ -83,10 +91,10 @@ function metapost.flushers.pdf.comment(message)
if savedliterals then
local last = #savedliterals + 1
savedliterals[last] = message
- texsprint(ctxcatcodes,"\\MPLIBtoPDF{",last,"}")
+ context.MPLIBtoPDF(last)
else
savedliterals = { message }
- texsprint(ctxcatcodes,"\\MPLIBtoPDF{1}")
+ context.MPLIBtoPDF(1)
end
end
end
@@ -94,14 +102,14 @@ end
function metapost.flushers.pdf.startfigure(n,llx,lly,urx,ury,message)
savedliterals = nil
metapost.n = metapost.n + 1
- texsprint(ctxcatcodes,format("\\startMPLIBtoPDF{%s}{%s}{%s}{%s}",llx,lly,urx,ury))
+ context.startMPLIBtoPDF(llx,lly,urx,ury)
if message then metapost.flushers.pdf.comment(message) end
end
function metapost.flushers.pdf.stopfigure(message)
if message then metapost.flushers.pdf.comment(message) end
- texsprint(ctxcatcodes,"\\stopMPLIBtoPDF")
- texsprint(ctxcatcodes,"\\ctxlua{metapost.flush_reset()}") -- maybe just at the beginning
+ context.stopMPLIBtoPDF()
+ context.MPLIBflushreset() -- maybe just at the beginning
end
function metapost.flushers.pdf.flushfigure(pdfliterals) -- table
@@ -110,33 +118,30 @@ function metapost.flushers.pdf.flushfigure(pdfliterals) -- table
if savedliterals then
local last = #savedliterals + 1
savedliterals[last] = pdfliterals
- texsprint(ctxcatcodes,"\\MPLIBtoPDF{",last,"}")
+ context.MPLIBtoPDF(last)
else
savedliterals = { pdfliterals }
- texsprint(ctxcatcodes,"\\MPLIBtoPDF{1}")
+ context.MPLIBtoPDF(1)
end
end
end
function metapost.flushers.pdf.textfigure(font,size,text,width,height,depth) -- we could save the factor
text = gsub(text,".","\\hbox{%1}") -- kerning happens in metapost (i have to check if this is true for mplib)
- texsprint(ctxcatcodes,format("\\MPLIBtextext{%s}{%s}{%s}{%s}{%s}",font,size,text,0,-number.dimenfactors.bp*depth))
+ context.MPLIBtextext(font,size,text,0,-number.dimenfactors.bp*depth)
end
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)
- if mplib.pen_info then
- local t = mplib.pen_info(object)
- rx, ry, sx, sy, tx, ty = t.rx, t.ry, t.sx, t.sy, t.tx, t.ty
- divider = sx*sy - rx*ry
- return not (sx==1 and rx==0 and ry==0 and sy==1 and tx==0 and ty==0), t.width
- else
- rx, sx, sy, ry, tx, ty, divider = 1, 0, 0, 1, 0, 0, 1
- return false, 1
- end
+ local t = pen_info(object)
+ rx, ry, sx, sy, tx, ty = t.rx, t.ry, t.sx, t.sy, t.tx, t.ty
+ divider = sx*sy - rx*ry
+ return not (sx==1 and rx==0 and ry==0 and sy==1 and tx==0 and ty==0), t.width
end
local function mpconcat(px, py) -- no tx, ty here / we can move this one inline if needed
@@ -155,84 +160,109 @@ local function curved(ith,pth)
end
local function flushnormalpath(path, t, open)
- t = t or { }
- local pth, ith
+ local pth, ith, nt
+ if t then
+ nt = #t
+ else
+ t = { }
+ nt = 0
+ end
for i=1,#path do
+ nt = nt + 1
pth = path[i]
if not ith then
- t[#t+1] = format("%f %f m",pth.x_coord,pth.y_coord)
+ t[nt] = format("%f %f m",pth.x_coord,pth.y_coord)
elseif curved(ith,pth) then
- t[#t+1] = format("%f %f %f %f %f %f c",ith.right_x,ith.right_y,pth.left_x,pth.left_y,pth.x_coord,pth.y_coord)
+ t[nt] = format("%f %f %f %f %f %f c",ith.right_x,ith.right_y,pth.left_x,pth.left_y,pth.x_coord,pth.y_coord)
else
- t[#t+1] = format("%f %f l",pth.x_coord,pth.y_coord)
+ t[nt] = format("%f %f l",pth.x_coord,pth.y_coord)
end
ith = pth
end
if not open then
+ nt = nt + 1
local one = path[1]
if curved(pth,one) then
- t[#t+1] = format("%f %f %f %f %f %f c",pth.right_x,pth.right_y,one.left_x,one.left_y,one.x_coord,one.y_coord )
+ t[nt] = format("%f %f %f %f %f %f c",pth.right_x,pth.right_y,one.left_x,one.left_y,one.x_coord,one.y_coord )
else
- t[#t+1] = format("%f %f l",one.x_coord,one.y_coord)
+ t[nt] = format("%f %f l",one.x_coord,one.y_coord)
end
elseif #path == 1 then
-- special case .. draw point
local one = path[1]
- t[#t+1] = format("%f %f l",one.x_coord,one.y_coord)
+ nt = nt + 1
+ t[nt] = format("%f %f l",one.x_coord,one.y_coord)
end
return t
end
local function flushconcatpath(path, t, open)
- t = t or { }
- t[#t+1] = format("%f %f %f %f %f %f cm", sx, rx, ry, sy, tx ,ty)
- local pth, ith
+ local pth, ith, nt
+ if t then
+ nt = #t
+ else
+ t = { }
+ nt = 0
+ end
+ nt = nt + 1
+ t[nt] = format("%f %f %f %f %f %f cm", sx, rx, ry, sy, tx ,ty)
for i=1,#path do
+ nt = nt + 1
pth = path[i]
if not ith then
- t[#t+1] = format("%f %f m",mpconcat(pth.x_coord,pth.y_coord))
+ t[nt] = format("%f %f m",mpconcat(pth.x_coord,pth.y_coord))
elseif curved(ith,pth) then
local a, b = mpconcat(ith.right_x,ith.right_y)
local c, d = mpconcat(pth.left_x,pth.left_y)
- t[#t+1] = format("%f %f %f %f %f %f c",a,b,c,d,mpconcat(pth.x_coord,pth.y_coord))
+ t[nt] = format("%f %f %f %f %f %f c",a,b,c,d,mpconcat(pth.x_coord,pth.y_coord))
else
- t[#t+1] = format("%f %f l",mpconcat(pth.x_coord, pth.y_coord))
+ t[nt] = format("%f %f l",mpconcat(pth.x_coord, pth.y_coord))
end
ith = pth
end
if not open then
+ nt = nt + 1
local one = path[1]
if curved(pth,one) then
local a, b = mpconcat(pth.right_x,pth.right_y)
local c, d = mpconcat(one.left_x,one.left_y)
- t[#t+1] = format("%f %f %f %f %f %f c",a,b,c,d,mpconcat(one.x_coord, one.y_coord))
+ t[nt] = format("%f %f %f %f %f %f c",a,b,c,d,mpconcat(one.x_coord, one.y_coord))
else
- t[#t+1] = format("%f %f l",mpconcat(one.x_coord,one.y_coord))
+ t[nt] = format("%f %f l",mpconcat(one.x_coord,one.y_coord))
end
elseif #path == 1 then
-- special case .. draw point
+ nt = nt + 1
local one = path[1]
- t[#t+1] = format("%f %f l",mpconcat(one.x_coord,one.y_coord))
+ t[nt] = format("%f %f l",mpconcat(one.x_coord,one.y_coord))
end
return t
end
metapost.flushnormalpath = flushnormalpath
-metapost.specials = metapost.specials or { }
+-- The flusher is pdf based, if another backend is used, we need to overload the
+-- flusher; this is beta code, the organization will change (already upgraded in
+-- sync with mplib)
+--
+-- We can avoid the before table but I like symmetry. There is of course a small
+-- performance penalty, but so is passing extra arguments (result, flusher, after)
+-- and returning stuff.
--- we have two extension handlers, one for pre and postscripts, and one for colors
+local function ignore() end
--- the flusher is pdf based, if another backend is used, we need to overload the
--- flusher; this is beta code, the organization will change
-
-function metapost.flush(result,flusher,askedfig) -- pdf flusher, table en dan concat is sneller, 1 literal
+function metapost.flush(result,flusher,askedfig)
if result then
local figures = result.fig
if figures then
flusher = flusher or metapost.flushers.pdf
- local colorconverter = metapost.colorconverter() -- function !
- local colorhandler = metapost.colorhandler
+ local resetplugins = metapost.resetplugins or ignore
+ local processplugins = metapost.processplugins or ignore
+ local pluginactions = metapost.pluginactions or ignore
+ local startfigure = flusher.startfigure
+ local stopfigure = flusher.stopfigure
+ local flushfigure = flusher.flushfigure
+ local textfigure = flusher.textfigure
for f=1, #figures do
local figure = figures[f]
local objects = getobjects(result,figure,f)
@@ -248,19 +278,18 @@ function metapost.flush(result,flusher,askedfig) -- pdf flusher, table en dan co
metapost.ury = ury
if urx < llx then
-- invalid
- flusher.startfigure(fignum,0,0,0,0,"invalid",figure)
- flusher.stopfigure()
+ startfigure(fignum,0,0,0,0,"invalid",figure)
+ stopfigure()
else
- flusher.startfigure(fignum,llx,lly,urx,ury,"begin",figure)
+ startfigure(fignum,llx,lly,urx,ury,"begin",figure)
t[#t+1] = "q"
if objects then
+ resetplugins() -- we should move the colorinitializer here
t[#t+1] = metapost.colorinitializer()
- -- once we have multiple prescripts we can do more tricky things like
- -- text and special colors at the same time
for o=1,#objects do
local object = objects[o]
local objecttype = object.type
- if objecttype == "start_bounds" or objecttype == "stop_bounds" then
+ if objecttype == "start_bounds" or objecttype == "stop_bounds" or objecttype == "special" then
-- skip
elseif objecttype == "start_clip" then
t[#t+1] = "q"
@@ -269,74 +298,44 @@ function metapost.flush(result,flusher,askedfig) -- pdf flusher, table en dan co
elseif objecttype == "stop_clip" then
t[#t+1] = "Q"
miterlimit, linecap, linejoin, dashed = -1, -1, -1, false
- elseif objecttype == "special" then
- metapost.specials.register(object.prescript)
elseif objecttype == "text" then
t[#t+1] = "q"
local ot = object.transform -- 3,4,5,6,1,2
t[#t+1] = format("%f %f %f %f %f %f cm",ot[3],ot[4],ot[5],ot[6],ot[1],ot[2]) -- TH: format("%f %f m %f %f %f %f 0 0 cm",unpack(ot))
- flusher.flushfigure(t) -- flush accumulated literals
+ flushfigure(t) -- flush accumulated literals
t = { }
- flusher.textfigure(object.font,object.dsize,object.text,object.width,object.height,object.depth)
+ textfigure(object.font,object.dsize,object.text,object.width,object.height,object.depth)
t[#t+1] = "Q"
else
- -- alternatively we can pass on the stack, could be a helper
- -- can be optimized with locals
- local currentobject = { -- not needed when no extensions
- type = object.type,
- miterlimit = object.miterlimit,
- linejoin = object.linejoin,
- linecap = object.linecap,
- color = object.color,
- dash = object.dash,
- path = object.path,
- htap = object.htap,
- pen = object.pen,
- prescript = object.prescript,
- postscript = object.postscript,
- }
- --
- local before, inbetween, after = nil, nil, nil
- --
- local cs, cr = currentobject.color, nil
- -- todo document why ...
- if cs and colorhandler and #cs > 0 and round(cs[1]*10000) == 123 then -- test in function
- currentobject, cr = colorhandler(cs,currentobject,t,colorconverter)
- objecttype = currentobject.type
- end
- --
- local prescript = currentobject.prescript
- if prescript and prescript ~= "" then
- -- move test to function
- local special = metapost.specials[prescript]
- if special then
- currentobject, before, inbetween, after = special(currentobject.postscript,currentobject,t,flusher)
- objecttype = currentobject.type
- end
+ -- we use an indirect table as we want to overload
+ -- entries but this is not possible in userdata
+ local original = object
+ local object = { }
+ setmetatable(object, {
+ __index = original
+ })
+ -- first we analyze
+ local before, after = processplugins(object)
+ local objecttype = object.type -- can have changed
+ if before then
+ t = pluginactions(before,t,flushfigure)
end
- --
- cs = currentobject.color
- if cs and #cs > 0 then
- t[#t+1], cr = colorconverter(cs)
- end
- --
- if before then currentobject, t = before() end
- local ml = currentobject.miterlimit
+ local ml = object.miterlimit
if ml and ml ~= miterlimit then
miterlimit = ml
t[#t+1] = format("%f M",ml)
end
- local lj = currentobject.linejoin
+ local lj = object.linejoin
if lj and lj ~= linejoin then
linejoin = lj
t[#t+1] = format("%i j",lj)
end
- local lc = currentobject.linecap
+ local lc = object.linecap
if lc and lc ~= linecap then
linecap = lc
t[#t+1] = format("%i J",lc)
end
- local dl = currentobject.dash
+ local dl = object.dash
if dl then
local d = format("[%s] %i d",concat(dl.dashes or {}," "),dl.offset)
if d ~= dashed then
@@ -347,14 +346,13 @@ function metapost.flush(result,flusher,askedfig) -- pdf flusher, table en dan co
t[#t+1] = "[] 0 d"
dashed = false
end
- if inbetween then currentobject, t = inbetween() end
- local path = currentobject.path
+ local path = object.path -- newpath
local transformed, penwidth = false, 1
local open = path and path[1].left_type and path[#path].right_type -- at this moment only "end_point"
- local pen = currentobject.pen
+ local pen = object.pen
if pen then
if pen.type == 'elliptical' then
- transformed, penwidth = pen_characteristics(object) -- boolean, value
+ transformed, penwidth = pen_characteristics(original) -- boolean, value
t[#t+1] = format("%f w",penwidth) -- todo: only if changed
if objecttype == 'fill' then
objecttype = 'both'
@@ -383,7 +381,7 @@ function metapost.flush(result,flusher,askedfig) -- pdf flusher, table en dan co
if transformed then
t[#t+1] = "Q"
end
- local path = currentobject.htap
+ local path = object.htap
if path then
if transformed then
t[#t+1] = "q"
@@ -404,16 +402,19 @@ function metapost.flush(result,flusher,askedfig) -- pdf flusher, table en dan co
t[#t+1] = "Q"
end
end
- if cr then
- t[#t+1] = cr
+ if after then
+ t = pluginactions(after,t,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
end
- if after then currentobject, t = after() end
end
- end
+ end
end
t[#t+1] = "Q"
- flusher.flushfigure(t)
- flusher.stopfigure("end")
+ flushfigure(t)
+ stopfigure("end")
end
if askedfig then
break
@@ -428,6 +429,7 @@ function metapost.parse(result,askedfig)
if result then
local figures = result.fig
if figures then
+ local analyzeplugins = metapost.analyzeplugins
for f=1, #figures do
local figure = figures[f]
local fignum = figure:charcode() or 0
@@ -440,17 +442,14 @@ function metapost.parse(result,askedfig)
metapost.ury = ury
local objects = getobjects(result,figure,f)
if objects then
+ -- for o=1,#objects do
+ -- local object = objects[o]
+ -- local prescript = object.prescript
+ -- if prescript then
+ -- analyzeplugins(object)
+ -- end
for o=1,#objects do
- local object = objects[o]
- if object.type == "outline" then
- local prescript = object.prescript
- if prescript then
- local special = metapost.specials[prescript]
- if special then
- special(object.postscript,object)
- end
- end
- end
+ analyzeplugins(objects[o])
end
end
break
@@ -467,15 +466,17 @@ local t = { }
local flusher = {
startfigure = function()
t = { }
- texsprint(ctxcatcodes,"\\startnointerference")
+ context.startnointerference()
end,
flushfigure = function(literals)
+ local n = #t
for i=1, #literals do
- t[#t+1] = literals[i]
+ n = n + 1
+ t[n] = literals[i]
end
end,
stopfigure = function()
- texsprint(ctxcatcodes,"\\stopnointerference")
+ context.stopnointerference()
end
}
@@ -499,7 +500,7 @@ function metapost.totable(result)
local field = fields[f]
tt[field] = object[field]
end
- t[#t+1] = tt
+ t[o] = tt
end
local b = figure:boundingbox()
return {
@@ -510,21 +511,3 @@ function metapost.totable(result)
return nil
end
end
-
--- will be overloaded later
-
-function metapost.colorconverter()
- return function(cr)
- local n = #cr
- if n == 4 then
- local c, m, y, k = cr[1], cr[2], cr[3], cr[4]
- return format("%.3f %.3f %.3f %.3f k %.3f %.3f %.3f %.3f K",c,m,y,k,c,m,y,k), "0 g 0 G"
- elseif n == 3 then
- local r, g, b = cr[1], cr[2], cr[3]
- return format("%.3f %.3f %.3f rg %.3f %.3f %.3f RG",r,g,b,r,g,b), "0 g 0 G"
- else
- local s = cr[1]
- return format("%.3f g %.3f G",s,s), "0 g 0 G"
- end
- end
-end
diff --git a/Master/texmf-dist/tex/context/base/mlib-pdf.mkiv b/Master/texmf-dist/tex/context/base/mlib-pdf.mkiv
index 2681b081044..8506b3b15e6 100644
--- a/Master/texmf-dist/tex/context/base/mlib-pdf.mkiv
+++ b/Master/texmf-dist/tex/context/base/mlib-pdf.mkiv
@@ -15,7 +15,7 @@
\registerctxluafile{mlib-pdf}{1.001}
-\def\MPLIBtoPDF#1{\ctxlua{metapost.flush_literal(#1)}}
+\def\MPLIBtoPDF#1{\ctxlua{metapost.flushliteral(#1)}}
\def\MPLIBboundingbox#1#2#3#4%
{\xdef\MPllx{#1}%
@@ -26,7 +26,8 @@
\xdef\MPheight{\the\dimexpr#4\onebasepoint-#2\onebasepoint\relax}}
\def\startMPLIBtoPDF#1#2#3#4% watch the transparency reset
- {\naturalhbox\bgroup
+ {\dostarttagged\t!mpgraphic\empty
+ \naturalhbox attr \imageattribute 1 \bgroup
\doactivatecolor\s!black\forcecolorhack
\MPLIBboundingbox{#1}{#2}{#3}{#4}%
%\forgetall % done already elsewhere
@@ -52,7 +53,8 @@
\wd\scratchbox\MPwidth
\ht\scratchbox\MPheight
\dopackageMPgraphic\scratchbox
- \egroup}
+ \egroup
+ \dostoptagged}
% \def\MPLIBtextext#1#2#3#4#5%
% {\begingroup
@@ -88,4 +90,7 @@
\box\scratchbox
\endgroup}
+\def\MPLIBflushreset
+ {\ctxlua{metapost.flushreset()}}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mlib-pps.lua b/Master/texmf-dist/tex/context/base/mlib-pps.lua
index 8b36660d350..27269a14e49 100644
--- a/Master/texmf-dist/tex/context/base/mlib-pps.lua
+++ b/Master/texmf-dist/tex/context/base/mlib-pps.lua
@@ -1,4 +1,4 @@
-if not modules then modules = { } end modules ['mlib-pps'] = { -- prescript, postscripts and specials
+if not modules then modules = { } end modules ['mlib-pps'] = {
version = 1.001,
comment = "companion to mlib-ctx.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -6,60 +6,65 @@ if not modules then modules = { } end modules ['mlib-pps'] = { -- prescript, pos
license = "see context related readme files",
}
+-- pps: prescript, postscripts and specials (although specials are dropped)
+--
-- current limitation: if we have textext as well as a special color then due to
-- prescript/postscript overload we can have problems
--
-- todo: report max textexts
-local format, gmatch, concat, round, match = string.format, string.gmatch, table.concat, math.round, string.match
-local sprint = tex.sprint
+local format, gmatch, match = string.format, string.gmatch, string.match
local tonumber, type = tonumber, type
+local round = math.round
+local insert, concat = table.insert, 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
local lpegmatch = lpeg.match
-local texbox = tex.box
-local copy_list = node.copy_list
-local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+local mplib, metapost, lpdf, context = mplib, metapost, lpdf, context
-local ctxcatcodes = tex.ctxcatcodes
+local texbox = tex.box
+local copy_list = node.copy_list
+local free_list = node.flush_list
+local setmetatableindex = table.setmetatableindex
+local sortedhash = table.sortedhash
-local trace_textexts = false trackers.register("metapost.textexts", function(v) trace_textexts = v end)
+local starttiming = statistics.starttiming
+local stoptiming = statistics.stoptiming
-colors = colors or { }
+local trace_textexts = false trackers.register("metapost.textexts", function(v) trace_textexts = v end)
+local trace_scripts = false trackers.register("metapost.scripts", function(v) trace_scripts = v 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
+local report_metapost = logs.reporter("metapost")
+local report_textexts = logs.reporter("metapost","textexts")
+local report_scripts = logs.reporter("metapost","scripts")
-metapost = metapost or { }
-metapost.specials = metapost.specials or { }
-metapost.specials.data = metapost.specials.data or { }
-metapost.externals = metapost.externals or { n = 0 }
+local colors = attributes.colors
-local data = metapost.specials.data
+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 colordata = { {}, {}, {}, {}, {} }
+metapost.makempy = metapost.makempy or { nofconverted = 0 }
+local makempy = metapost.makempy
---~ (r,g,b) => cmyk : r=123 g= 1 b=hash
---~ => spot : r=123 g= 2 b=hash
---~ => transparent rgb : r=123 g= 3 b=hash
---~ => transparent cmyk : r=123 g= 4 b=hash
---~ => transparent spot : r=123 g= 5 b=hash
---~ => rest : r=123 g=n>10 b=whatever
+local nooutercolor = "0 g 0 G"
+local nooutertransparency = "/Tr0 gs" -- only when set
+local outercolormode = 0
+local outercolor = nooutercolor
+local outertransparency = nooutertransparency
+local innercolor = nooutercolor
+local innertransparency = nooutertransparency
-local nooutercolor = "0 g 0 G"
-local nooutertransparency = "/Tr0 gs" -- only when set
-local outercolormode = 0
-local outercolor = nooutercolor
-local outertransparency = nooutertransparency
-local innercolor = nooutercolor
-local innertransparency = nooutertransparency
+local pdfcolor = lpdf.color
+local pdftransparency = lpdf.transparency
+local registercolor = colors.register
+local registerspotcolor = colors.registerspotcolor
-local pdfcolor, pdftransparency = lpdf.color, lpdf.transparency
-local registercolor, registerspotcolor = colors.register, colors.registerspotcolor
+local transparencies = attributes.transparencies
local registertransparency = transparencies.register
-function metapost.set_outer_color(mode,colormodel,colorattribute,transparencyattribute)
+function metapost.setoutercolor(mode,colormodel,colorattribute,transparencyattribute)
-- has always to be called before conversion
-- todo: transparency (not in the mood now)
outercolormode = mode
@@ -90,169 +95,25 @@ local function checked_color_pair(color)
end
end
-metapost.checked_color_pair = checked_color_pair
-
function metapost.colorinitializer()
innercolor = outercolor
innertransparency = outertransparency
return outercolor, outertransparency
end
-function metapost.specials.register(str) -- only colors
- local size, content, n, class = match(str,"^%%%%MetaPostSpecial: (%d+) (.*) (%d+) (%d+)$")
- if class then
- -- use lpeg splitter
- local data = { }
- for s in gmatch(content,"[^ ]+") do
- data[#data+1] = s
- end
- class, n = tonumber(class), tonumber(n)
- if class == 3 or class == 4 or class == 5 then
- -- hm, weird
- else
- n = tonumber(data[1])
- end
- if n then
- local cc = colordata[class]
- if cc then
- cc[n] = data
- else
- logs.report("mplib","problematic special: %s (no colordata class %s)", str or "?",class)
- end
- else
- -- there is some bug to be solved, so we issue a message
- logs.report("mplib","problematic special: %s", str or "?")
- end
- end
---~ if match(str,"^%%%%MetaPostOption: multipass") then
---~ metapost.multipass = true
---~ end
-end
+--~
-local function spotcolorconverter(parent, n, d, p)
- registerspotcolor(parent)
- return pdfcolor(colors.model,registercolor(nil,'spot',parent,n,d,p))
-end
-
-function metapost.colorhandler(cs, object, result, colorconverter) -- handles specials
- local cr = outercolor
- local what = round(cs[2]*10000)
- local data = colordata[what]
- if data then
- data = data[round(cs[3]*10000)]
- end
- if not data then
- --
- elseif what == 1 then
- result[#result+1], cr = colorconverter({ data[2], data[3], data[4], data[5] })
- elseif what == 2 then
- result[#result+1] = spotcolorconverter(data[2],data[3],data[4],data[5])
- else
- if what == 3 then
- result[#result+1], cr = colorconverter({ data[3], data[4], data[5]})
- elseif what == 4 then
- result[#result+1], cr = colorconverter({ data[3], data[4], data[5], data[6]})
- elseif what == 5 then
- result[#result+1] = spotcolorconverter(data[3],data[4],data[5],data[6])
- end
- object.prescript = "tr"
- object.postscript = data[1] .. "," .. data[2]
- end
- object.color = nil
- return object, cr
-end
-
-function metapost.colorspec(cs) -- used for shades ... returns table (for checking) or string (spot)
- local what = round(cs[2]*10000)
- local data = colordata[what][round(cs[3]*10000)]
- if not data then
- return { 0 }
- elseif what == 1 then
- return { tonumber(data[2]), tonumber(data[3]), tonumber(data[4]), tonumber(data[5]) }
- elseif what == 2 then
- return spotcolorconverter(data[2],data[3],data[4],data[5])
- elseif what == 3 then
- return { tonumber(data[3]), tonumber(data[4]), tonumber(data[5]) }
- elseif what == 4 then
- return { tonumber(data[3]), tonumber(data[4]), tonumber(data[5]), tonumber(data[6]) }
- elseif what == 5 then
- return spotcolorconverter(data[3],data[4],data[5],data[6])
- end
-end
-
-function metapost.specials.tr(specification,object,result)
- local a, t = match(specification,"^(.+),(.+)$")
- local before = a and t and function()
- result[#result+1] = format("/Tr%s gs",registertransparency(nil,a,t,true)) -- maybe nil instead of 'mp'
- return object, result
- end
- local after = before and function()
- result[#result+1] = outertransparency -- here we could revert to the outer color
- return object, result
- end
- return object, before, nil, after
-end
-
-local specificationsplitter = lpeg.Ct(lpeg.splitat(" "))
-local colorsplitter = lpeg.Ct(lpeg.splitat(":"))
-local colorsplitter = lpeg.Ct(lpeg.splitter(":",tonumber))
-
--- Unfortunately we cannot use cmyk colors natively because there is no
--- generic color allocation primitive ... it's just an rgbcolor color.. This
--- means that we cannot pass colors in either cmyk or rgb form.
---
--- def cmyk(expr c,m,y,k) =
--- 1 withprescript "cc" withpostscript ddddecimal (c,m,y,k)
--- enddef ;
---
--- This is also an example of a simple plugin.
-
---~ function metapost.specials.cc(specification,object,result)
---~ object.color = lpegmatch(specificationsplitter,specification)
---~ return object, nil, nil, nil
---~ end
---~ function metapost.specials.cc(specification,object,result)
---~ local c = lpegmatch(specificationsplitter,specification)
---~ local o = object.color[1]
---~ c[1],c[2],c[3],c[4] = o*c[1],o*c[2],o*c[3],o*c[4]
---~ return object, nil, nil, nil
---~ end
+local specificationsplitter = Ct(lpeg.splitat(" "))
+local colorsplitter = Ct(lpeg.splitter(":",tonumber)) -- no need for :
+local domainsplitter = Ct(lpeg.splitter(" ",tonumber))
+local centersplitter = domainsplitter
+local coordinatesplitter = domainsplitter
-- thanks to taco's reading of the postscript manual:
--
-- x' = sx * x + ry * y + tx
-- y' = rx * x + sy * y + ty
-function metapost.specials.fg(specification,object,result,flusher) -- graphics
- local op = object.path
- local first, second, fourth = op[1], op[2], op[4]
- local tx, ty = first.x_coord , first.y_coord
- local sx, sy = second.x_coord - tx, fourth.y_coord - ty
- local rx, ry = second.y_coord - ty, fourth.x_coord - tx
- if sx == 0 then sx = 0.00001 end
- if sy == 0 then sy = 0.00001 end
- local before = specification and function()
- flusher.flushfigure(result)
- sprint(ctxcatcodes,format("\\MPLIBfigure{%f}{%f}{%f}{%f}{%f}{%f}{%s}",sx,rx,ry,sy,tx,ty,specification))
- object.path = nil
- return object, { }
- end
- return { } , before, nil, nil -- replace { } by object for tracing
-end
-
-function metapost.specials.ps(specification,object,result) -- positions
- local op = object.path
- 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
- local label = specification
- x = x - metapost.llx
- y = metapost.ury - y
- -- logs.report("mplib", "todo: position '%s' at (%s,%s) with (%s,%s)",label,x,y,w,h)
- sprint(ctxcatcodes,format("\\dosavepositionwhd{%s}{0}{%sbp}{%sbp}{%sbp}{%sbp}{0pt}",label,x,y,w,h))
- return { }, nil, nil, nil
-end
-
local nofshades = 0 -- todo: hash resources, start at 1000 in order not to clash with older
local function normalize(ca,cb)
@@ -276,95 +137,30 @@ end
--
-- normalize(ca,cb) fails for spotcolors
-function metapost.specials.cs(specification,object,result,flusher) -- spot colors?
- -- a mess, not dynamic anyway
- nofshades = nofshades + 1
- flusher.flushfigure(result)
- result = { }
- local t = lpegmatch(specificationsplitter,specification)
- -- we need a way to move/scale
- local ca = lpegmatch(colorsplitter,t[4])
- local cb = lpegmatch(colorsplitter,t[8])
- if round(ca[1]*10000) == 123 then ca = metapost.colorspec(ca) end
- if round(cb[1]*10000) == 123 then cb = metapost.colorspec(cb) end
- local name = format("MplSh%s",nofshades)
- local domain = { tonumber(t[1]), tonumber(t[2]) }
- local coordinates = { tonumber(t[5]), tonumber(t[6]), tonumber(t[7]), tonumber(t[9]), tonumber(t[10]), tonumber(t[11]) }
- if type(ca) == "string" then
- -- backend specific (will be renamed)
- lpdf.circularshade(name,domain,{ 0 },{ 1 },1,"DeviceGray",coordinates)
+local function spotcolorconverter(parent, n, d, p)
+ registerspotcolor(parent)
+ return pdfcolor(colors.model,registercolor(nil,'spot',parent,n,d,p)), outercolor
+end
+
+local function checkandconvertspot(n_a,f_a,c_a,v_a,n_b,f_b,c_b,v_b)
+ -- must be the same but we don't check
+ local name = format("MpSh%s",nofshades)
+ local ca = string.split(v_a,",")
+ local cb = string.split(v_b,",")
+ if #ca == 0 or #cb == 0 then
+ return { 0 }, { 1 }, "DeviceGray", name
else
- if #ca > #cb then
- normalize(ca,cb)
- elseif #ca < #cb then
- normalize(cb,ca)
- end
- local model = colors.model
- if model == "all" then
- model= (#ca == 4 and "cmyk") or (#ca == 3 and "rgb") or "gray"
- end
- if model == "rgb" then
- if #ca == 4 then
- ca[1], ca[2], ca[3] = cmyktorgb(ca[1],ca[2],ca[3],ca[4])
- cb[1], cb[2], cb[3] = cmyktorgb(cb[1],cb[2],cb[3],cb[4])
- ca[4], cb[4] = nil, nil
- elseif #ca == 1 then
- local a, b = 1-ca[1], 1-cb[1]
- ca[1], ca[2], ca[3] = a, a, a
- cb[1], cb[2], cb[3] = b, b, b
- end
- -- backend specific (will be renamed)
- lpdf.circularshade(name,domain,ca,cb,1,"DeviceRGB",coordinates)
- elseif model == "cmyk" then
- if #ca == 3 then
- ca[1], ca[2], ca[3], ca[4] = rgbtocmyk(ca[1],ca[2],ca[3])
- cb[1], cb[2], cb[3], ca[4] = rgbtocmyk(cb[1],cb[2],cb[3])
- elseif #ca == 1 then
- ca[1], ca[2], ca[3], ca[4] = 0, 0, 0, ca[1]
- cb[1], cb[2], cb[3], ca[4] = 0, 0, 0, ca[1]
- end
- -- backend specific (will be renamed)
- lpdf.circularshade(name,domain,ca,cb,1,"DeviceCMYK",coordinates)
- else
- if #ca == 4 then
- ca[1] = cmyktogray(ca[1],ca[2],ca[3],ca[4])
- cb[1] = cmyktogray(cb[1],cb[2],cb[3],cb[4])
- elseif #ca == 3 then
- ca[1] = rgbtogray(ca[1],ca[2],ca[3])
- cb[1] = rgbtogray(cb[1],cb[2],cb[3])
- end
- -- backend specific (will be renamed)
- lpdf.circularshade(name,domain,ca,cb,1,"DeviceGRAY",coordinates)
- end
+ for i=1,#ca do ca[i] = tonumber(ca[i]) or 0 end
+ for i=1,#cb do cb[i] = tonumber(cb[i]) or 1 end
+ --~ spotcolorconverter(n_a,f_a,c_a,v_a) -- not really needed
+ return ca, cb, n_a or n_b, name
end
- local before = function()
- result[#result+1] = "q /Pattern cs"
- return object, result
- end
- local after = function()
- result[#result+1] = format("W n /%s sh Q", name)
- return object, result
- end
- object.color, object.type = nil, nil
- return object, before, nil, after
-end
-
-function metapost.specials.ls(specification,object,result,flusher)
- nofshades = nofshades + 1
- flusher.flushfigure(result)
- result = { }
- local t = lpegmatch(specificationsplitter,specification)
- -- we need a way to move/scale
- local ca = lpegmatch(colorsplitter,t[4])
- local cb = lpegmatch(colorsplitter,t[7])
- if round(ca[1]*10000) == 123 then ca = metapost.colorspec(ca) end
- if round(cb[1]*10000) == 123 then cb = metapost.colorspec(cb) end
+end
+
+local function checkandconvert(ca,cb)
local name = format("MpSh%s",nofshades)
- local domain = { tonumber(t[1]), tonumber(t[2]) }
- local coordinates = { tonumber(t[5]), tonumber(t[6]), tonumber(t[8]), tonumber(t[9]) }
- if type(ca) == "string" then
- -- backend specific (will be renamed)
- lpdf.linearshade(name,domain,{ 0 },{ 1 },1,"DeviceGray",coordinates)
+ if not ca or not cb or type(ca) == "string" then
+ return { 0 }, { 1 }, "DeviceGray", name
else
if #ca > #cb then
normalize(ca,cb)
@@ -377,79 +173,61 @@ function metapost.specials.ls(specification,object,result,flusher)
end
if model == "rgb" then
if #ca == 4 then
- ca[1], ca[2], ca[3] = cmyktorgb(ca[1],ca[2],ca[3],ca[4])
- cb[1], cb[2], cb[3] = cmyktorgb(cb[1],cb[2],cb[3],cb[4])
+ ca = { cmyktorgb(ca[1],ca[2],ca[3],ca[4]) }
+ cb = { cmyktorgb(cb[1],cb[2],cb[3],cb[4]) }
elseif #ca == 1 then
local a, b = 1-ca[1], 1-cb[1]
- ca[1], ca[2], ca[3] = a, a, a
- cb[1], cb[2], cb[3] = b, b, b
+ ca = { a, a, a }
+ cb = { b, b, b }
end
- -- backend specific (will be renamed)
- lpdf.linearshade(name,domain,ca,cb,1,"DeviceRGB",coordinates)
+ return ca, cb, "DeviceRGB", name
elseif model == "cmyk" then
if #ca == 3 then
- ca[1], ca[2], ca[3], ca[4] = rgbtocmyk(ca[1],ca[2],ca[3])
- cb[1], cb[2], cb[3], ca[4] = rgbtocmyk(cb[1],cb[2],cb[3])
+ ca = { rgbtocmyk(ca[1],ca[2],ca[3]) }
+ cb = { rgbtocmyk(cb[1],cb[2],cb[3]) }
elseif #ca == 1 then
- ca[1], ca[2], ca[3], ca[4] = 0, 0, 0, ca[1]
- cb[1], cb[2], cb[3], ca[4] = 0, 0, 0, ca[1]
+ ca = { 0, 0, 0, ca[1] }
+ cb = { 0, 0, 0, ca[1] }
end
- -- backend specific (will be renamed)
- lpdf.linearshade(name,domain,ca,cb,1,"DeviceCMYK",coordinates)
+ return ca, cb, "DeviceCMYK", name
else
if #ca == 4 then
- ca[1] = cmyktogray(ca[1],ca[2],ca[3],ca[4])
- cb[1] = cmyktogray(cb[1],cb[2],cb[3],cb[4])
+ ca = { cmyktogray(ca[1],ca[2],ca[3],ca[4]) }
+ cb = { cmyktogray(cb[1],cb[2],cb[3],cb[4]) }
elseif #ca == 3 then
- ca[1] = rgbtogray(ca[1],ca[2],ca[3])
- cb[1] = rgbtogray(cb[1],cb[2],cb[3])
+ ca = { rgbtogray(ca[1],ca[2],ca[3]) }
+ cb = { rgbtogray(cb[1],cb[2],cb[3]) }
end
-- backend specific (will be renamed)
- lpdf.linearshade(name,domain,ca,cb,1,"DeviceGRAY",coordinates)
+ return ca, cb, "DeviceGray", name
end
end
- local before = function()
- result[#result+1] = "q /Pattern cs"
- return object, result
- end
- local after = function()
- result[#result+1] = format("W n /%s sh Q", name)
- return object, result
- end
- object.color, object.type = nil, nil
- return object, before, nil, after
end
--- no need for a before here
-
local current_format, current_graphic, current_initializations
--- metapost.first_box = metapost.first_box or 1000
--- metapost.last_box = metapost.last_box or 1100
---~ metapost.textext_current = metapost.first_box
-metapost.multipass = false
-
-local textexts = { }
-
-function metapost.free_boxes() -- todo: mp direct list ipv box
- -- for i = metapost.first_box,metapost.last_box do
- -- local b = texbox[i]
- -- if b then
- -- texbox[i] = nil -- no node.flush_list(b) needed, else double free error
- -- else
- -- break
- -- end
- -- end
+metapost.multipass = false
+
+local textexts = { }
+local scratchbox = 0
+
+local function freeboxes() -- todo: mp direct list ipv box
for n, box in next, textexts do
local tn = textexts[n]
if tn then
- -- somehow not flushed (used)
- textexts[n] = nil
+ free_list(tn)
+ -- texbox[scratchbox] = tn
+ -- texbox[scratchbox] = nil -- this frees too
+ if trace_textexts then
+ report_textexts("freeing %s",n)
+ end
end
end
textexts = { }
end
+metapost.resettextexts = freeboxes
+
function metapost.settext(box,slot)
textexts[slot] = copy_list(texbox[box])
texbox[box] = nil
@@ -460,72 +238,10 @@ end
function metapost.gettext(box,slot)
texbox[box] = copy_list(textexts[slot])
--- textexts[slot] = nil -- no, pictures can be placed several times
-end
-
-function metapost.specials.tf(specification,object)
---~ print("setting", metapost.textext_current)
- local n, str = match(specification,"^(%d+):(.+)$")
- if n and str then
- n = tonumber(n)
- -- if metapost.textext_current < metapost.last_box then
- -- metapost.textext_current = metapost.first_box + n - 1
- -- end
- if trace_textexts then
- -- logs.report("metapost","first pass: order %s, box %s",n,metapost.textext_current)
- logs.report("metapost","first pass: order %s",n)
- end
- -- sprint(ctxcatcodes,format("\\MPLIBsettext{%s}{%s}",metapost.textext_current,str))
- sprint(ctxcatcodes,format("\\MPLIBsettext{%s}{%s}",n,str))
- metapost.multipass = true
- end
- return { }, nil, nil, nil
-end
-
-function metapost.specials.ts(specification,object,result,flusher)
- -- print("getting", metapost.textext_current)
- local n, str = match(specification,"^(%d+):(.+)$")
- if n and str then
- n = tonumber(n)
- if trace_textexts then
- -- logs.report("metapost","second pass: order %s, box %s",n,metapost.textext_current)
- logs.report("metapost","second pass: order %s",n)
- end
- local op = object.path
- local first, second, fourth = op[1], op[2], op[4]
- local tx, ty = first.x_coord , first.y_coord
- local sx, sy = second.x_coord - tx, fourth.y_coord - ty
- local rx, ry = second.y_coord - ty, fourth.x_coord - tx
- if sx == 0 then sx = 0.00001 end
- if sy == 0 then sy = 0.00001 end
- if not trace_textexts then
- object.path = nil
- end
- local before = function() -- no need for before function (just do it directly)
- --~ flusher.flushfigure(result)
- --~ sprint(ctxcatcodes,format("\\MPLIBgettext{%f}{%f}{%f}{%f}{%f}{%f}{%s}",sx,rx,ry,sy,tx,ty,metapost.textext_current))
- --~ result = { }
- result[#result+1] = format("q %f %f %f %f %f %f cm", sx,rx,ry,sy,tx,ty)
- flusher.flushfigure(result)
- -- if metapost.textext_current < metapost.last_box then
- -- metapost.textext_current = metapost.first_box + n - 1
- -- end
- -- local b = metapost.textext_current
- -- local box = texbox[b]
- local box = textexts[n]
- if box then
- -- sprint(ctxcatcodes,format("\\MPLIBgettextscaled{%s}{%s}{%s}",b,metapost.sxsy(box.width,box.height,box.depth)))
- sprint(ctxcatcodes,format("\\MPLIBgettextscaled{%s}{%s}{%s}",n,metapost.sxsy(box.width,box.height,box.depth)))
- else
- -- error
- end
- result = { "Q" }
- return object, result
- end
- return { }, before, nil, nil -- replace { } by object for tracing
- else
- return { }, nil, nil, nil -- replace { } by object for tracing
+ if trace_textexts then
+ report_textexts("putting %s in box %s",slot,box)
end
+ -- textexts[slot] = nil -- no, pictures can be placed several times
end
-- rather generic pdf, so use this elsewhere too it no longer pays
@@ -664,79 +380,85 @@ function models.gray(cr)
return checked_color_pair(format("%.3f g %.3f G",s,s))
end
-function metapost.colorconverter()
- return models[colors.model] or gray
+setmetatableindex(models, function(t,k)
+ local v = models.gray
+ t[k] = v
+ return v
+end)
+
+local function colorconverter(cs)
+ return models[colors.model](cs)
end
-do
+local btex = P("btex")
+local etex = P(" etex")
+local vtex = P("verbatimtex")
+local ttex = P("textext")
+local gtex = P("graphictext")
+local multipass = P("forcemultipass")
+local spacing = S(" \n\r\t\v")^0
+local dquote = P('"')
- local P, S, V, Cs = lpeg.P, lpeg.S, lpeg.V, lpeg.Cs
+local found, forced = false, false
- local btex = P("btex")
- local etex = P(" etex")
- local vtex = P("verbatimtex")
- local ttex = P("textext")
- local gtex = P("graphictext")
- local multipass = P("forcemultipass")
- local spacing = S(" \n\r\t\v")^0
- local dquote = P('"')
+local function convert(str)
+ found = true
+ return "rawtextext(\"" .. str .. "\")" -- centered
+end
+local function ditto(str)
+ return "\" & ditto & \""
+end
+local function register()
+ found = true
+end
+local function force()
+ forced = true
+end
- local found, forced = false, false
+local texmess = (dquote/ditto + (1 - etex))^0
- local function convert(str)
- found = true
- return "rawtextext(\"" .. str .. "\")" -- centered
- end
- local function ditto(str)
- return "\" & ditto & \""
- end
- local function register()
- found = true
- end
- local function force()
- forced = true
- end
+local function ignore(s)
+ report_metapost("ignoring verbatim tex: %s",s)
+ return ""
+end
- local texmess = (dquote/ditto + (1 - etex))^0
+-- local parser = P {
+-- [1] = Cs((V(2)/register + V(4)/ignore + V(3)/convert + V(5)/force + 1)^0),
+-- [2] = ttex + gtex,
+-- [3] = btex * spacing * Cs(texmess) * etex,
+-- [4] = vtex * spacing * Cs(texmess) * etex,
+-- [5] = multipass, -- experimental, only for testing
+-- }
- local function ignore(s)
- logs.report("mplib","ignoring verbatim tex: %s",s)
- return ""
- end
+-- currently a a one-liner produces less code
- local parser = P {
- [1] = Cs((V(2)/register + V(4)/ignore + V(3)/convert + V(5)/force + 1)^0),
- [2] = ttex + gtex,
- [3] = btex * spacing * Cs(texmess) * etex,
- [4] = vtex * spacing * Cs(texmess) * etex,
- [5] = multipass, -- experimental, only for testing
- }
-
- -- currently a a one-liner produces less code
-
- local parser = Cs((
- (ttex + gtex)/register
- + (btex * spacing * Cs(texmess) * etex)/convert
- + (vtex * spacing * Cs(texmess) * etex)/ignore
- + 1
- )^0)
-
- function metapost.check_texts(str)
- found, forced = false, false
- return lpegmatch(parser,str), found, forced
- end
+-- 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
+-- input anyway
+
+local parser = Cs((
+ (ttex + gtex)/register
+ + (btex * spacing * Cs(texmess) * etex)/convert
+ + (vtex * spacing * Cs(texmess) * etex)/ignore
+ + 1
+)^0)
+local function checktexts(str)
+ found, forced = false, false
+ return lpegmatch(parser,str), found, forced
end
+metapost.checktexts = checktexts
+
local factor = 65536*(7227/7200)
function metapost.edefsxsy(wd,ht,dp) -- helper for figure
local hd = ht + dp
- commands.edef("sx",(wd ~= 0 and factor/wd) or 0)
- commands.edef("sy",(hd ~= 0 and factor/hd) or 0)
+ context.setvalue("sx",wd ~= 0 and factor/wd or 0)
+ context.setvalue("sy",hd ~= 0 and factor/hd or 0)
end
-function metapost.sxsy(wd,ht,dp) -- helper for text
+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
@@ -748,22 +470,20 @@ local do_begin_fig = "; beginfig(1); "
local do_end_fig = "; endfig ;"
local do_safeguard = ";"
-function metapost.text_texts_data()
- local t, n = { }, 0
---~ for i = metapost.first_box, metapost.last_box do
---~ n = n + 1
---~ local box = texbox[i]
+function metapost.texttextsdata()
+ local t, nt, n = { }, 0, 0
for n, box in next, textexts do
- if trace_textexts then
- logs.report("metapost","passed data: order %s, box %s",n,i)
- end
if box then
- t[#t+1] = format(text_data_template,n,box.width/factor,n,box.height/factor,n,box.depth/factor)
+ local wd, ht, dp = box.width/factor, box.height/factor, box.depth/factor
+ if trace_textexts then
+ report_textexts("passed data %s: (%0.4f,%0.4f,%0.4f)",n,wd,ht,dp)
+ end
+ nt = nt + 1
+ t[nt] = format(text_data_template,n,wd,n,ht,n,dp)
else
break
end
end
---~ print(table.serialize(t))
return t
end
@@ -773,16 +493,17 @@ metapost.intermediate.needed = false
metapost.method = 1 -- 1:dumb 2:clever
+-- maybe we can latelua the texts some day
+
function metapost.graphic_base_pass(mpsformat,str,initializations,preamble,askedfig)
local nofig = (askedfig and "") or false
local done_1, done_2, forced_1, forced_2
- str, done_1, forced_1 = metapost.check_texts(str)
+ str, done_1, forced_1 = checktexts(str)
if not preamble or preamble == "" then
preamble, done_2, forced_2 = "", false, false
else
- preamble, done_2, forced_2 = metapost.check_texts(preamble)
+ preamble, done_2, forced_2 = checktexts(preamble)
end
- -- metapost.textext_current = metapost.first_box
metapost.intermediate.needed = false
metapost.multipass = false -- no needed here
current_format, current_graphic, current_initializations = mpsformat, str, initializations or ""
@@ -806,7 +527,7 @@ function metapost.graphic_base_pass(mpsformat,str,initializations,preamble,asked
if not flushed or not metapost.optimize then
-- tricky, we can only ask once for objects and therefore
-- we really need a second run when not optimized
- sprint(ctxcatcodes,format("\\ctxlua{metapost.graphic_extra_pass(%s)}",askedfig or "false"))
+ context.MPLIBextrapass(askedfig or "false")
end
else
metapost.process(mpsformat, {
@@ -819,59 +540,30 @@ function metapost.graphic_base_pass(mpsformat,str,initializations,preamble,asked
nofig or do_end_fig
}, false, nil, false, false, askedfig )
end
- -- here we could free the textext boxes
- metapost.free_boxes()
end
function metapost.graphic_extra_pass(askedfig)
local nofig = (askedfig and "") or false
- -- metapost.textext_current = metapost.first_box
metapost.process(current_format, {
nofig or do_begin_fig,
no_trial_run,
- concat(metapost.text_texts_data()," ;\n"),
+ concat(metapost.texttextsdata()," ;\n"),
current_initializations,
do_safeguard,
current_graphic,
nofig or do_end_fig
}, false, nil, false, true, askedfig )
+ context.MPLIBresettexts() -- must happen afterwards
end
-metapost.tex = metapost.tex or { }
-
-do -- only used in graphictexts
-
- local environments = { }
-
- function metapost.tex.set(str)
- environments[#environments+1] = str
- end
- function metapost.tex.reset()
- environments = { }
- end
- function metapost.tex.get()
- return concat(environments,"\n")
- end
-
-end
-
-local graphics = { }
local start = [[\starttext]]
local preamble = [[\long\def\MPLIBgraphictext#1{\startTEXpage[scale=10000]#1\stopTEXpage}]]
local stop = [[\stoptext]]
-function metapost.specials.gt(specification,object) -- number, so that we can reorder
- graphics[#graphics+1] = format("\\MPLIBgraphictext{%s}",specification)
- metapost.intermediate.needed = true
- metapost.multipass = true
- return { }, nil, nil, nil
-end
-
-function metapost.intermediate.actions.makempy()
+function makempy.processgraphics(graphics)
if #graphics > 0 then
- local externals = metapost.externals
- externals.n = externals.n + 1
- starttiming(externals)
+ makempy.nofconverted = makempy.nofconverted + 1
+ starttiming(makempy)
local mpofile = tex.jobname .. "-mpgraph"
local mpyfile = file.replacesuffix(mpofile,"mpy")
local pdffile = file.replacesuffix(mpofile,"pdf")
@@ -882,16 +574,404 @@ function metapost.intermediate.actions.makempy()
if io.exists(pdffile) then
command = format("pstoedit -ssp -dt -f mpost %s %s", pdffile, mpyfile)
os.execute(command)
- local result = { }
+ local result, r = { }, 0
if io.exists(mpyfile) then
local data = io.loaddata(mpyfile)
for figure in gmatch(data,"beginfig(.-)endfig") do
- result[#result+1] = format("begingraphictextfig%sendgraphictextfig ;\n", figure)
+ r = r + 1
+ result[r] = format("begingraphictextfig%sendgraphictextfig ;\n", figure)
end
io.savedata(mpyfile,concat(result,""))
end
end
- stoptiming(externals)
+ stoptiming(makempy)
+ end
+end
+
+-- -- the new plugin handler -- --
+
+local sequencers = utilities.sequencers
+local appendgroup = sequencers.appendgroup
+local appendaction = sequencers.appendaction
+
+local resetter = nil
+local analyzer = nil
+local processor = nil
+
+local resetteractions = sequencers.reset { arguments = "" }
+local analyzeractions = sequencers.reset { arguments = "object,prescript" }
+local processoractions = sequencers.reset { arguments = "object,prescript,before,after" }
+
+appendgroup(resetteractions, "system")
+appendgroup(analyzeractions, "system")
+appendgroup(processoractions,"system")
+
+-- later entries come first
+
+--~ local scriptsplitter = Cf(Ct("") * (
+--~ Cg(C((1-S("= "))^1) * S("= ")^1 * C((1-S("\n\r"))^0) * S("\n\r")^0)
+--~ )^0, rawset)
+
+local scriptsplitter = Ct ( Ct (
+ C((1-S("= "))^1) * S("= ")^1 * C((1-S("\n\r"))^0) * S("\n\r")^0
+)^0 )
+
+local function splitscript(script)
+ local hash = lpegmatch(scriptsplitter,script)
+ for i=#hash,1,-1 do
+ local h = hash[i]
+ hash[h[1]] = h[2]
+ end
+ if trace_scripts then
+ report_scripts(table.serialize(hash,"prescript"))
+ end
+ return hash
+end
+
+function metapost.pluginactions(what,t,flushfigure) -- to be checked: too many 0 g 0 G
+ for i=1,#what do
+ local wi = what[i]
+ if type(wi) == "function" then
+ -- assume injection
+ flushfigure(t)
+ t = { }
+ wi()
+ else
+ t[#t+1] = wi
+ end
+ end
+ return t
+end
+
+function metapost.resetplugins()
+ resetter()
+end
+
+function metapost.analyzeplugins(object)
+ local prescript = object.prescript -- specifications
+ if prescript and #prescript > 0 then
+ return analyzer(object,splitscript(prescript))
+ end
+end
+
+function metapost.processplugins(object) -- maybe environment table
+ local prescript = object.prescript -- specifications
+ if prescript and #prescript > 0 then
+ local before = { }
+ local after = { }
+ processor(object,splitscript(prescript),before,after)
+ return #before > 0 and before, #after > 0 and after
+ else
+ local c = object.color
+ if c and #c > 0 then
+ local b, a = colorconverter(c)
+ return { b }, { a }
+ end
+ end
+end
+
+-- helpers
+
+local basepoints = number.dimenfactors["bp"]
+
+local cm = function(object)
+ local op = object.path
+ local first, second, fourth = op[1], op[2], op[4]
+ local tx, ty = first.x_coord , first.y_coord
+ local sx, sy = second.x_coord - tx, fourth.y_coord - ty
+ local rx, ry = second.y_coord - ty, fourth.x_coord - tx
+ if sx == 0 then sx = 0.00001 end
+ if sy == 0 then sy = 0.00001 end
+ return sx,rx,ry,sy,tx,ty
+end
+
+-- text
+
+local tx_done = { }
+
+local function tx_reset()
+ tx_done = { }
+end
+
+local function tx_analyze(object,prescript) -- todo: hash content and reuse them
+ local tx_stage = prescript.tx_stage
+ if tx_stage then
+ local tx_number = tonumber(prescript.tx_number)
+ if not tx_done[tx_number] then
+ tx_done[tx_number] = true
+ if trace_textexts then
+ report_textexts("setting %s %s (first pass)",tx_stage,tx_number)
+ end
+ local s = object.postscript or ""
+ local c = object.color -- only simple ones, no transparency
+ local a = prescript.tr_alternative
+ local t = prescript.tr_transparency
+ if not c then
+ -- no color
+ elseif #c == 1 then
+ if a and t then
+ s = format("\\colored[s=%f,a=%f,t=%f]%s",c[1],a,t,s)
+ else
+ s = format("\\colored[s=%f]%s",c[1],s)
+ end
+ elseif #c == 3 then
+ if a and t then
+ s = format("\\colored[r=%f,g=%f,b=%f,a=%f,t=%f]%s",c[1],c[2],c[3],a,t,s)
+ else
+ s = format("\\colored[r=%f,g=%f,b=%f]%s",c[1],c[2],c[3],s)
+ end
+ elseif #c == 4 then
+ if a and t then
+ s = format("\\colored[c=%f,m=%f,y=%f,k=%f,a=%f,t=%f]%s",c[1],c[2],c[3],c[4],a,t,s)
+ else
+ s = format("\\colored[c=%f,m=%f,y=%f,k=%f]%s",c[1],c[2],c[3],c[4],s)
+ end
+ end
+ context.MPLIBsettext(tx_number,s)
+ metapost.multipass = true
+ end
+ end
+end
+
+local function tx_process(object,prescript,before,after)
+ local tx_number = prescript.tx_number
+ if tx_number then
+ tx_number = tonumber(tx_number)
+ local tx_stage = prescript.tx_stage
+ if tx_stage == "final" then -- redundant test
+ if trace_textexts then
+ report_textexts("processing %s (second pass)",tx_number)
+ end
+ before[#before+1] = format("q %f %f %f %f %f %f cm",cm(object))
+ before[#before+1] = function()
+ -- flush always happens, we can have a special flush function injected before
+ local box = textexts[tx_number]
+ if box then
+ context.MPLIBgettextscaled(tx_number,sxsy(box.width,box.height,box.depth))
+ else
+ report_textexts("unknown %s",tx_number)
+ end
+ end
+ before[#before+1] = "Q"
+ if not trace_textexts then
+ object.path = false -- else: keep it
+ end
+ object.color = false
+ object.grouped = true
+ end
+ end
+end
+
+-- graphics
+
+local graphics = { }
+
+function metapost.intermediate.actions.makempy()
+ if #graphics > 0 then
+ makempy.processgraphics(graphics)
graphics = { } -- ?
end
end
+
+local function gt_analyze(object,prescript)
+ local gt_stage = prescript.gt_stage
+ if gt_stage == "trial" then
+ graphics[#graphics+1] = format("\\MPLIBgraphictext{%s}",object.postscript or "")
+ metapost.intermediate.needed = true
+ metapost.multipass = true
+ end
+end
+
+-- local function gt_process(object,prescript,before,after)
+-- local gt_stage = prescript.gt_stage
+-- if gt_stage == "final" then
+-- end
+-- end
+
+-- shades
+
+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 sh_color_a = prescript.sh_color_a or "1"
+ local sh_color_b = prescript.sh_color_b or "1"
+ local ca, cb, colorspace, name, separation
+ if prescript.sh_color == "into" and prescript.sp_name then
+ -- some spotcolor
+ local value_a, components_a, fractions_a, name_a
+ local value_b, components_b, fractions_b, name_b
+ for i=1,#prescript do
+ local tag = prescript[i][1]
+ if not name_a and tag == "sh_color_a" then
+ value_a = prescript[i-4][2]
+ components_a = prescript[i-3][2]
+ fractions_a = prescript[i-2][2]
+ name_a = prescript[i-1][2]
+ elseif not name_b and tag == "sh_color_b" then
+ value_b = prescript[i-4][2]
+ components_b = prescript[i-3][2]
+ fractions_b = prescript[i-2][2]
+ name_b = prescript[i-1][2]
+ end
+ if name_a and name_b then
+ break
+ end
+ end
+ ca, cb, separation, name = checkandconvertspot(
+ name_a,fractions_a,components_a,value_a,
+ name_b,fractions_b,components_b,value_b
+ )
+ else
+ local colora = lpegmatch(colorsplitter,sh_color_a)
+ local colorb = lpegmatch(colorsplitter,sh_color_b)
+ ca, cb, colorspace, name = checkandconvert(colora,colorb)
+ end
+ if not ca or not cb then
+ ca, cb, colorspace, name = checkandconvert()
+ end
+ if sh_type == "linear" then
+ 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 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
+ -- fatal error
+ end
+ before[#before+1], after[#after+1] = "q /Pattern cs", format("W n /%s sh Q",name)
+ object.color, object.type, object.grouped = false, false, true -- not nil, otherwise mt
+ end
+end
+
+-- bitmaps
+
+local function bm_process(object,prescript,before,after)
+ local bm_xresolution = prescript.bm_xresolution
+ if bm_xresolution then
+ before[#before+1] = format("q %f %f %f %f %f %f cm",cm(object))
+ before[#before+1] = function()
+ figures.bitmapimage {
+ xresolution = tonumber(bm_xresolution),
+ yresolution = tonumber(prescript.bm_yresolution),
+ width = 1/basepoints,
+ height = 1/basepoints,
+ data = object.postscript
+ }
+ end
+ before[#before+1] = "Q"
+ object.path = false
+ object.color = false
+ object.grouped = true
+ end
+end
+
+-- positions
+
+local function ps_process(object,prescript,before,after)
+ local ps_label = prescript.ps_label
+ if ps_label then
+ local op = object.path
+ 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
+ before[#before+1] = function()
+ context.MPLIBpositionwhd(ps_label,x,y,w,h)
+ end
+ end
+end
+
+-- figures
+
+local function fg_process(object,prescript,before,after)
+ local fg_name = prescript.fg_name
+ if fg_name then
+ before[#before+1] = format("q %f %f %f %f %f %f cm",cm(object))
+ before[#before+1] = function()
+ context.MPLIBfigure(fg_name,prescript.fg_mask or "")
+ end
+ before[#before+1] = "Q"
+ object.path = false
+ object.grouped = true
+ end
+end
+
+-- color and transparency
+
+local value = Cs ( (
+ (Carg(1) * C((1-P(","))^1)) / function(a,b) return format("%0.3f",a * tonumber(b)) end
+ + P(","))^1
+)
+
+local function tr_process(object,prescript,before,after)
+ -- before can be shortcut to t
+ local tr_alternative = prescript.tr_alternative
+ if tr_alternative then
+ tr_alternative = tonumber(tr_alternative)
+ local tr_transparency = tonumber(prescript.tr_transparency)
+ before[#before+1], after[#after+1] = format("/Tr%s gs",registertransparency(nil,tr_alternative,tr_transparency,true)), "/Tr0 gs" -- outertransparency
+ end
+ local cs = object.color
+ if cs and #cs > 0 then
+ local sp_name = prescript.sp_name
+ local b, a
+ if sp_name then
+ 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 = lpeg.match(value,sp_value,1,cf) or sp_value
+ end
+ -- should be codeinjections
+ b, a = spotcolorconverter(sp_name,sp_fractions,sp_components,sp_value)
+ else
+ -- should be codeinjections
+ b, a = colorconverter(cs)
+ end
+ before[#before+1] = b
+ after[#after+1] = a
+ end
+end
+
+-- layers (nasty: we need to keep the 'grouping' right
+
+local function la_process(object,prescript,before,after)
+ local la_name = prescript.la_name
+ if la_name then
+ before[#before+1] = backends.codeinjections.startlayer(la_name)
+ insert(after,1,backends.codeinjections.stoplayer())
+ end
+end
+
+-- definitions
+
+appendaction(resetteractions,"system",tx_reset)
+
+appendaction(analyzeractions,"system",tx_analyze)
+appendaction(analyzeractions,"system",gt_analyze)
+
+appendaction(processoractions,"system",sh_process)
+-- (processoractions,"system",gt_process)
+appendaction(processoractions,"system",bm_process)
+appendaction(processoractions,"system",tx_process)
+appendaction(processoractions,"system",ps_process)
+appendaction(processoractions,"system",fg_process)
+appendaction(processoractions,"system",tr_process) -- last, as color can be reset
+
+appendaction(processoractions,"system",la_process)
+
+-- no auto here
+
+resetter = sequencers.compile(resetteractions )
+analyzer = sequencers.compile(analyzeractions )
+processor = sequencers.compile(processoractions)
diff --git a/Master/texmf-dist/tex/context/base/mlib-pps.mkiv b/Master/texmf-dist/tex/context/base/mlib-pps.mkiv
index 0a78a87040e..357f85b1a1f 100644
--- a/Master/texmf-dist/tex/context/base/mlib-pps.mkiv
+++ b/Master/texmf-dist/tex/context/base/mlib-pps.mkiv
@@ -33,38 +33,28 @@
\newbox \MPtextbox
\newtoks\everyMPLIBsettext
-\def\MPLIBfigure#1#2#3#4#5#6#7% todo: move Q q to lua
- {\setbox\scratchbox\hbox{\externalfigure[#7]}%
+\def\MPLIBfigure#1#2%
+ {\setbox\scratchbox\hbox{\externalfigure[#1][\c!mask=#2]}%
\ctxlua{metapost.edefsxsy(\number\wd\scratchbox,\number\ht\scratchbox,0)}%
- \pdfliteral direct{q #1 #2 #3 #4 #5 #6 cm}% no direct
- \vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[sx=\sx,sy=\sy]{\box\scratchbox}\hss}}%
- \pdfliteral direct{Q}}
+ \vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[\c!sx=\sx,\c!sy=\sy]{\box\scratchbox}\hss}}}
\def\MPLIBsettext#1% #2%
{\dowithnextbox{\ctxlua{metapost.settext(\number\nextbox,#1)}}\hbox}
-\def\MPLIBgettextscaled#1#2#3% why a copy
- {\ctxlua{metapost.gettext(\number\MPtextbox,#1)}%
- \vbox to \zeropoint{\vss\hbox to \zeropoint{\black\scale[sx=#2,sy=#3]{\raise\dp\MPtextbox\box\MPtextbox}\hss}}}
+\def\MPLIBgettextscaled#1#2#3% why a copy .. can be used more often
+ {\ctxlua{metapost.gettext(\number\MPtextbox,#1)}% we need the colorhack or else the color backend does not sync
+ \vbox to \zeropoint{\vss\hbox to \zeropoint{\scale[\c!sx=#2,\c!sy=#3]{\raise\dp\MPtextbox\box\MPtextbox}\forcecolorhack\hss}}}
\def\MPLIBgraphictext#1%
{\startTEXpage[\c!scale=10000]#1\stopTEXpage}
-\protect \endinput
+\def\MPLIBpositionwhd#1#2#3#4#5%
+ {\dosavepositionwhd{#1}{0}{#2sp}{#3sp}{#4sp}{#5sp}{0sp}}
+
+\def\MPLIBextrapass#1%
+ {\ctxlua{metapost.graphic_extra_pass(#1)}}
-% \def\MPLIBsettext#1% #2% we could as well store in hlists at the lua end i.e. just one box
-% {\global\setbox#1\hbox}
-%
-% \def\MPLIBfreetext#1%
-% {\global\setbox#1\emptybox}
-%
-% \def\MPLIBgettextscaled#1#2#3% why a copy
-% {\vbox to \zeropoint{\vss\hbox to \zeropoint{\black\scale[sx=#2,sy=#3]{\raise\dp#1\copy#1}\hss}}}
-%
-% \def\MPLIBallocate#1%
-% {\newbox\MPLIBfirst
-% \dorecurse{\numexpr#1-1\relax}{\let\MPLIBlast\relax\newbox\MPLIBlast}%
-% \MPLIBregister}
-%
-% \def\MPLIBregister % after allocate!
-% {\ctxlua{metapost.first_box, metapost.last_box = \number\MPLIBfirst, \number\MPLIBlast}}
+\def\MPLIBresettexts
+ {\ctxlua{metapost.resettextexts()}}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mlib-run.lua b/Master/texmf-dist/tex/context/base/mlib-run.lua
index f352e1db161..72c16775d4f 100644
--- a/Master/texmf-dist/tex/context/base/mlib-run.lua
+++ b/Master/texmf-dist/tex/context/base/mlib-run.lua
@@ -31,110 +31,77 @@ nears zero.</p>
local trace_graphics = false trackers.register("metapost.graphics", function(v) trace_graphics = v end)
-local format, gsub, match = string.format, string.gsub, string.match
+local report_metapost = logs.reporter("metapost")
+
+local texerrormessage = logs.texerrormessage
+
+local format, gsub, match, find = string.format, string.gsub, string.match, string.find
local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
-metapost = metapost or { }
+local mplib = mplib
+
+metapost = metapost or { }
+local metapost = metapost
-metapost.showlog = false
-metapost.lastlog = ""
+metapost.showlog = false
+metapost.lastlog = ""
+metapost.texerrors = false
+metapost.exectime = metapost.exectime or { } -- hack
+
+local mplibone = tonumber(mplib.version()) <= 1.50
+
+directives.register("mplib.texerrors", function(v) metapost.texerrors = v end)
function metapost.resetlastlog()
metapost.lastlog = ""
end
-local function finder(name, mode, ftype)
- if mode=="w" then
+local function finder(name, mode, ftype) -- we can use the finder to intercept btex/etex
+ if mode == "w" then
return name
elseif file.is_qualified_path(name) then
return name
else
- return resolvers.find_file(name,ftype)
+ return resolvers.findfile(name,ftype)
end
end
-metapost.finder = finder
-
-metapost.parameters = {
- hash_size = 100000,
- main_memory = 4000000,
- max_in_open = 50,
- param_size = 100000,
-}
-
-metapost.exectime = metapost.exectime or { } -- hack
-
-local preamble = [[
-boolean mplib; string mp_parent_version;
-mplib := true;
-mp_parent_version := "%s";
-input %s ; dump ;
-]]
-
-function metapost.make(name, target, version)
- starttiming(mplib)
- target = file.replacesuffix(target or name, "mem")
- 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()
+local function finder(name, mode, ftype) -- we use the finder to intercept btex/etex
+ if mode ~= "w" then
+ name = file.is_qualified_path(name) and name or resolvers.findfile(name,ftype)
+ if not (find(name,"/metapost/context/base/") or find(name,"/metapost/context/") or find(name,"/metapost/base/")) then
+ local data, found, forced = metapost.checktexts(io.loaddata(name) or "")
+ if found then
+ local temp = luatex.registertempfile(name,true)
+ io.savedata(temp,data)
+ name = temp
+ end
+ end
end
- stoptiming(mplib)
+ return name
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.unload(mpx)
- starttiming(mplib)
- if mpx then
- mpx:finish()
- end
- stoptiming(mplib)
-end
+metapost.finder = finder
function metapost.reporterror(result)
if not result then
- metapost.report("mp error: no result object returned")
+ report_metapost("error: no result object returned")
elseif result.status > 0 then
local t, e, l = result.term, result.error, result.log
if t and t ~= "" then
- metapost.report("mp terminal: %s",t)
+ (metapost.texerrors and texerrormessage or report_metapost)("terminal: %s",t)
end
if e then
- metapost.report("mp error: %s",(e=="" and "?") or e)
+ (metapost.texerrors and texerrormessage or report_metapost)("error: %s",(e=="" and "?") or e)
end
if not t and not e and l then
metapost.lastlog = metapost.lastlog .. "\n" .. l
- metapost.report("mp log: %s",l)
+ report_metapost("log: %s",l)
else
- metapost.report("mp error: unknown, no error, terminal or log messages")
+ report_metapost("error: unknown, no error, terminal or log messages")
end
else
return false
@@ -142,48 +109,148 @@ function metapost.reporterror(result)
return true
end
-function metapost.checkformat(mpsinput, mpsformat, dirname)
- mpsinput = file.addsuffix(mpsinput or "metafun", "mp")
- mpsformat = file.removesuffix(file.basename(mpsformat or texconfig.formatname or (tex and tex.formatname) or mpsinput))
- local mpsbase = file.removesuffix(file.basename(mpsinput))
- if mpsbase ~= mpsformat then
- mpsformat = mpsformat .. "-" .. mpsbase
+if mplibone then
+
+ 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
- mpsformat = file.addsuffix(mpsformat, "mem")
- local pth = dirname or file.dirname(texconfig.formatname or "")
- if pth ~= "" then
- mpsformat = file.join(pth,mpsformat)
+
+ 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
- local the_version = environment.version or "unset version"
- if lfs.isfile(mpsformat) then
- commands.writestatus("mplib","loading '%s' from '%s'", mpsinput, mpsformat)
- local mpx, result = metapost.load(mpsformat)
- 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 ~= the_version then
- commands.writestatus("mplib","version mismatch: %s <> %s", version or "unknown", the_version)
+
+ 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") or ""
+ if mpsformatfullname ~= "" then
+ report_metapost("loading '%s' from '%s'", 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
- return mpx
+ 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 '%s' from '%s'", mpsinput, mpsformatfullname)
+ metapost.reporterror(result)
end
+ end
+ local mpsformatfullname = caches.setfirstwritablefile(mpsformat,"formats")
+ report_metapost("making '%s' into '%s'", mpsinput, mpsformatfullname)
+ metapost.make(mpsinput,mpsformatfullname,mpsversion) -- somehow return ... fails here
+ if lfs.isfile(mpsformatfullname) then
+ report_metapost("loading '%s' from '%s'", mpsinput, mpsformatfullname)
+ return metapost.load(mpsformatfullname)
+ else
+ report_metapost("problems with '%s' from '%s'", mpsinput, mpsformatfullname)
+ end
+ end
+
+else
+
+ local preamble = [[
+ boolean mplib ; mplib := true ;
+ let dump = endinput ;
+ input %s ;
+ ]]
+
+ function metapost.load(name)
+ starttiming(mplib)
+ local mpx = mplib.new {
+ ini_version = true,
+ find_file = finder,
+ }
+ local result
+ if not mpx then
+ result = { status = 99, error = "out of memory"}
+ else
+ result = mpx:execute(format(preamble, file.replacesuffix(name,"mp")))
+ end
+ stoptiming(mplib)
+ metapost.reporterror(result)
+ return mpx, result
+ end
+
+ function metapost.checkformat(mpsinput)
+ local mpsversion = environment.version or "unset version"
+ local mpsinput = file.addsuffix(mpsinput or "metafun", "mp")
+ report_metapost("loading '%s' (experimental metapost version two)",mpsinput)
+ local mpx, result = metapost.load(mpsinput)
+ if mpx then
+ return mpx
else
- commands.writestatus("mplib","error in loading '%s' from '%s'", mpsinput, mpsformat)
+ report_metapost("error in loading '%s'",mpsinput)
metapost.reporterror(result)
end
end
- commands.writestatus("mplib","making '%s' into '%s'", mpsinput, mpsformat)
- metapost.make(mpsinput,mpsformat,the_version) -- somehow return ... fails here
- if lfs.isfile(mpsformat) then
- commands.writestatus("mplib","loading '%s' from '%s'", mpsinput, mpsformat)
- return metapost.load(mpsformat)
- else
- commands.writestatus("mplib","problems with '%s' from '%s'", mpsinput, mpsformat)
+
+end
+
+function metapost.unload(mpx)
+ starttiming(mplib)
+ if mpx then
+ mpx:finish()
end
+ stoptiming(mplib)
end
local mpxformats = { }
@@ -192,7 +259,7 @@ function metapost.format(instance,name)
name = name or instance
local mpx = mpxformats[instance]
if not mpx then
- commands.writestatus("mplib","initializing instance '%s' using format '%s'",instance,name)
+ report_metapost("initializing instance '%s' using format '%s'",instance,name)
mpx = metapost.checkformat(name)
mpxformats[instance] = mpx
end
@@ -256,9 +323,9 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass,
if not metapost.reporterror(result) then
if metapost.showlog then
local str = (result.term ~= "" and result.term) or "no terminal output"
- if not str:is_empty() then
+ if not string.is_empty(str) then
metapost.lastlog = metapost.lastlog .. "\n" .. str
- metapost.report("mp log: %s",str)
+ report_metapost("log: %s",str)
end
end
if result.fig then
@@ -266,7 +333,7 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass,
end
end
else
- metapost.report("mp error: invalid graphic component %s",i)
+ report_metapost("error: invalid graphic component %s",i)
end
end
else
@@ -284,13 +351,13 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass,
end
-- todo: error message
if not result then
- metapost.report("mp error: no result object returned")
+ report_metapost("error: no result object returned")
elseif result.status > 0 then
- metapost.report("mp error: %s",(result.term or "no-term") .. "\n" .. (result.error or "no-error"))
+ report_metapost("error: %s",(result.term or "no-term") .. "\n" .. (result.error or "no-error"))
else
if metapost.showlog then
metapost.lastlog = metapost.lastlog .. "\n" .. result.term
- metapost.report("mp info: %s",result.term or "no-term")
+ report_metapost("info: %s",result.term or "no-term")
end
if result.fig then
converted = metapost.convert(result, trialrun, flusher, multipass, askedfig)
@@ -308,11 +375,7 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass,
end
function metapost.convert()
- metapost.report('mp warning: no converter set')
-end
-
-function metapost.report(...)
- logs.report("mplib",...)
+ report_metapost('warning: no converter set')
end
-- handy
@@ -324,29 +387,29 @@ function metapost.directrun(formatname,filename,outputformat,astable,mpdata)
outputformat = "mps"
end
if not data then
- logs.simple("unknown file '%s'",filename or "?")
+ report_metapost("unknown file '%s'",filename or "?")
else
- local mpx = metapost.checkformat(formatname,formatname,caches.setpath("formats"))
+ local mpx = metapost.checkformat(formatname)
if not mpx then
- logs.simple("unknown format '%s'",formatname or "?")
+ report_metapost("unknown format '%s'",formatname or "?")
else
- logs.simple("processing '%s'",(mpdata and (filename or "data")) or fullname)
+ report_metapost("processing '%s'",(mpdata and (filename or "data")) or fullname)
local result = mpx:execute(data)
if not result then
- logs.simple("error: no result object returned")
+ report_metapost("error: no result object returned")
elseif result.status > 0 then
- logs.simple("error: %s",(result.term or "no-term") .. "\n" .. (result.error or "no-error"))
+ report_metapost("error: %s",(result.term or "no-term") .. "\n" .. (result.error or "no-error"))
else
if metapost.showlog then
metapost.lastlog = metapost.lastlog .. "\n" .. result.term
- logs.simple("info: %s",result.term or "no-term")
+ report_metapost("info: %s",result.term or "no-term")
end
local figures = result.fig
if figures then
local sorted = table.sortedkeys(figures)
if astable then
local result = { }
- logs.simple("storing %s figures in table",#sorted)
+ report_metapost("storing %s figures in table",#sorted)
for k=1,#sorted do
local v = sorted[k]
if outputformat == "mps" then
@@ -367,7 +430,7 @@ function metapost.directrun(formatname,filename,outputformat,astable,mpdata)
output = figures[v]:svg() -- (3) for prologues
end
local outname = format("%s-%s.%s",basename,v,outputformat)
- logs.simple("saving %s bytes in '%s'",#output,outname)
+ report_metapost("saving %s bytes in '%s'",#output,outname)
io.savedata(outname,output)
end
return #sorted
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 73431567d34..b3d8a4df116 100644
--- a/Master/texmf-dist/tex/context/base/mtx-context-arrange.tex
+++ b/Master/texmf-dist/tex/context/base/mtx-context-arrange.tex
@@ -1,5 +1,3 @@
-% engine=luatex
-
%D \module
%D [ file=mtx-context-arrange,
%D version=2009.03.21,
@@ -106,6 +104,3 @@
\stopluacode
\stoptext
-
-
-
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 d0dbcbba09b..0cbd73784c8 100644
--- a/Master/texmf-dist/tex/context/base/mtx-context-listing.tex
+++ b/Master/texmf-dist/tex/context/base/mtx-context-listing.tex
@@ -69,6 +69,12 @@
lfg = "lua",
}
+ local pattern = document.arguments.pattern
+
+ if pattern then
+ document.files = dir.glob(pattern)
+ end
+
if #document.files > 0 then
if document.arguments.sort then
table.sort(document.files)
@@ -85,10 +91,16 @@
end
context.page()
context.setupfootertexts( -- return true: we need to keep this entry
- { function() context.detokenize(file.basename(filename)) return true end },
+ { function() context.detokenize(pattern and filename or file.basename(filename)) return true end },
{ function() context.pagenumber() return true end }
)
- context.setuptyping { option = types[pretty] or pretty }
+ if pretty then
+ if type(pretty) ~= "string" or pretty == "" then
+ context.setuptyping { option = "color" }
+ else
+ context.setuptyping { option = types[pretty] or pretty }
+ end
+ end
context.typefile(filename)
end
end
diff --git a/Master/texmf-dist/tex/context/base/mtx-context-select.tex b/Master/texmf-dist/tex/context/base/mtx-context-select.tex
new file mode 100644
index 00000000000..8a02bdff729
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mtx-context-select.tex
@@ -0,0 +1,109 @@
+% engine=luatex
+
+%D \module
+%D [ file=mtx-context-select,
+%D version=2008.11.10, % about that time i started playing with this
+%D title=\CONTEXT\ Extra Trickry,
+%D subtitle=Listing Files,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%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 a \TEXEXEC\ features that has been moved to \MKIV.
+
+% begin help
+%
+% usage: context --extra=select [options] list-of-files
+%
+% --sort : sort filenames first
+% --topspace=dimension : distance above first line
+% --backspace=dimension : distance before left margin
+% --selection=list : n:m,p:q,...
+% --paperformat=spec : paper*print or paperxprint or 'fit'
+% --interaction : add hyperlinks
+%
+% end help
+
+\input mtx-context-common.tex
+
+\setuppapersize
+ [\getdocumentargumentdefault{paperformat_from}{A4}]
+ [\getdocumentargumentdefault{paperformat_to}{A4}]
+
+\setuppaper
+ [offset=\getdocumentargumentdefault{paperformat_to}{0pt}]
+
+\setuplayout
+ [width=middle,
+ height=middle,
+ topspace=\getdocumentargumentdefault{topspace}{0pt},
+ backspace=\getdocumentargumentdefault{backspace}{0pt},
+ location=middle,
+ header=0pt,
+ footer=0pt]
+
+\doif {\getdocumentargument{marking}} {yes} {
+ \setuplayout
+ [marking=on]
+}
+
+\doif {\getdocumentargument{interaction}} {yes} {
+ \setupinteraction
+ [state=start]
+ \setupexternalfigures
+ [interaction=yes]
+}
+
+\setupexternalfigures
+ [directory=]
+
+\doifelse {\getdocumentargument{paperformat_paper}} {fit} {
+ \doifdocumentfilename {1} {
+ \getfiguredimensions
+ [\getdocumentfilename{1}]
+ \definepapersize
+ [fit]
+ [width=\figurewidth,
+ height=\figureheight]
+ \setuppapersize
+ [fit]
+ [fit]
+ }
+}
+
+\starttext
+
+\startluacode
+
+ local papersize = document.arguments.paperformat_paper or "A4"
+ local printsize = document.arguments.paperformat_print or "A4"
+ local selection = document.arguments.selection or ""
+ local textwidth = document.arguments.textwidth or "0cm" -- needed ?
+
+ if #document.files == 0 then
+ context("no files given")
+ elseif selection == "" then
+ context("no selection given")
+ else
+ if document.arguments.sort then
+ table.sort(document.files)
+ end
+ for _, filename in ipairs(document.files) do
+ if not string.find(filename,"^mtx%-context%-") then
+ context.filterpages (
+ { filename },
+ { selection },
+ { width = textwidth }
+ )
+ end
+ end
+ end
+
+\stopluacode
+
+\stoptext
+
diff --git a/Master/texmf-dist/tex/context/base/mult-aux.lua b/Master/texmf-dist/tex/context/base/mult-aux.lua
new file mode 100644
index 00000000000..cbecd2df1d5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mult-aux.lua
@@ -0,0 +1,147 @@
+if not modules then modules = { } end modules ['mult-aux'] = {
+ version = 1.001,
+ comment = "companion to mult-aux.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local find = string.find
+
+interfaces.namespaces = interfaces.namespaces or { }
+local namespaces = interfaces.namespaces
+local variables = interfaces.variables
+
+local trace_namespaces = false trackers.register("interfaces.namespaces", function(v) trace_namespaces = v end)
+
+local report_namespaces = logs.reporter("interface","namespaces")
+
+local v_yes, v_list = variables.yes, variables.list
+
+local prefix = "????"
+local meaning = "@@@@"
+
+local data = { }
+
+function namespaces.define(namespace,settings)
+ if trace_namespaces then
+ report_namespaces("installing namespace '%s' with settings '%s'",namespace,settings)
+ end
+ if data[namespace] then
+ report_namespaces("namespace '%s' is already taken",namespace)
+ end
+ if #namespace < 2 then
+ report_namespaces("namespace '%s' should have more than 1 character",namespace)
+ end
+ local ns = { }
+ data[namespace] = ns
+ utilities.parsers.settings_to_hash(settings,ns)
+ local name = ns.name
+ if not name or name == "" then
+ report_namespaces("provide a (command) name in namespace '%s'",namespace)
+ end
+ local self = "\\" .. prefix .. namespace
+ context.unprotect()
+ -- context.installnamespace(namespace)
+ context("\\def\\%s%s{%s%s}",prefix,namespace,meaning,namespace)
+ if trace_namespaces then
+ report_namespaces("using namespace '%s' for '%s'",namespace,name)
+ end
+ local parent = ns.parent or ""
+ if parent ~= "" then
+ if trace_namespaces then
+ report_namespaces("namespace '%s' for '%s' uses parent '%s'",namespace,name,parent)
+ end
+ if not find(parent,"\\") then
+ parent = "\\" .. prefix .. parent
+ -- todo: check if defined
+ end
+ end
+ context.installparameterhandler(self,name)
+ if trace_namespaces then
+ report_namespaces("installing parameter handler for '%s'",name)
+ end
+ context.installparameterhashhandler(self,name)
+ if trace_namespaces then
+ report_namespaces("installing parameterhash handler for '%s'",name)
+ end
+ local style = ns.style
+ if style == v_yes then
+ context.installattributehandler(self,name)
+ if trace_namespaces then
+ report_namespaces("installing attribute handler for '%s'",name)
+ end
+ end
+ local command = ns.command
+ if command == v_yes then
+ context.installdefinehandler(self,name,parent)
+ if trace_namespaces then
+ report_namespaces("installing definition command for '%s' (single)",name)
+ end
+ elseif command == v_list then
+ context.installdefinehandler(self,name,parent)
+ if trace_namespaces then
+ report_namespaces("installing definition command for '%s' (multiple)",name)
+ end
+ end
+ local setup = ns.setup
+ if setup == v_yes then
+ context.installsetuphandler(self,name)
+ if trace_namespaces then
+ report_namespaces("installing setup command for '%s' (single)",name)
+ end
+ elseif setup == v_list then
+ context.installsetuphandler(self,name)
+ if trace_namespaces then
+ report_namespaces("installing setup command for '%s' (multiple)",name)
+ end
+ end
+ local set = ns.set
+ if set == v_yes then
+ context.installparametersethandler(self,name)
+ if trace_namespaces then
+ report_namespaces("installing set/let/reset command for '%s' (single)",name)
+ end
+ elseif set == v_list then
+ context.installparametersethandler(self,name)
+ if trace_namespaces then
+ report_namespaces("installing set/let/reset command for '%s' (multiple)",name)
+ end
+ end
+ context.protect()
+end
+
+function utilities.formatters.list(data,key,keys)
+ if not keys then
+ keys = { }
+ for _, v in next, data do
+ for k, _ in next, v do
+ keys[k] = true
+ end
+ end
+ keys = table.sortedkeys(keys)
+ end
+ context.starttabulate { "|"..string.rep("l|",#keys+1) }
+ context.NC()
+ context(key)
+ for i=1,#keys do
+ context.NC()
+ context(keys[i])
+ end context.NR()
+ context.HL()
+ for k, v in table.sortedhash(data) do
+ context.NC()
+ context(k)
+ for i=1,#keys do
+ context.NC()
+ context(v[keys[i]])
+ end context.NR()
+ end
+ context.stoptabulate()
+end
+
+function namespaces.list()
+ -- utilities.formatters.list(data,"namespace")
+ local keys = { "type", "name", "comment", "version", "parent", "definition", "setup", "style" }
+ utilities.formatters.list(data,"namespace",keys)
+end
diff --git a/Master/texmf-dist/tex/context/base/mult-aux.mkii b/Master/texmf-dist/tex/context/base/mult-aux.mkii
new file mode 100644
index 00000000000..f06833bffc3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mult-aux.mkii
@@ -0,0 +1,152 @@
+%D \module
+%D [ file=mult-aux,
+%D version=2010.08.2,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=helpers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%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 a subset of the \MKIV\ variant which has more comments). There
+%D is no support for attributes (fonts and color). This code is mostly
+%D meant for usage in modules that are backported from \MKIV.
+
+\writestatus{loading}{ConTeXt Multilingual Macros / Helpers}
+
+\unprotect
+
+%D \starttyping
+%D \unprotect
+%D \def\????aa{@@@@aa}
+%D
+%D \installparameterhandler \????aa {whatever}
+%D \installsetuphandler \????aa {whatever}
+%D \installdefinehandler \????aa {whatever} \????aa % #3 == defaultroot
+%D
+%D % \installcommandhandler \????aa {whatever} \????aa
+%D \protect
+%D
+%D % \whateverparameter \c!test
+%D % \whateverparameterhash \c!test
+%D % \namedwhateverparameter \mycurrentwhatever \c!test
+%D % \everydefinewhatever (sets \currentwhatever)
+%D % \everypresetwhatever (can be used to reset parameters as we can redefine)
+%D % \everysetupwhatever (sets \currentwhatever)
+%D
+%D \starttext
+%D \definewhatever[first] \definewhatever[second][first]
+%D test: \def\currentwhatever{first} \whateverparameter{method} \par
+%D \setupwhatever [method=unset] test: \def\currentwhatever{first} \whateverparameter{method} \par
+%D \setupwhatever[first] [method=first] test: \def\currentwhatever{first} \whateverparameter{method} \par
+%D test: \def\currentwhatever{second} \whateverparameter{method} \par
+%D \setupwhatever[second][method=second] test: \def\currentwhatever{second} \whateverparameter{method} \par
+%D \stoptext
+%D \stoptyping
+
+\unexpanded\def\doinstallparameterhandler#1#2#3#4#5#6#7#8#9%
+ {\def#3##1{\csname#4{#1#2}{##1}\endcsname}%
+ \def#4##1##2{\ifcsname##1##2\endcsname##1##2\else\expandafter#5\csname##1\s!parent\endcsname{##2}\fi}%
+ \def#5##1##2{\ifx##1\relax\s!empty\else#4{##1}{##2}\fi}%
+ \def#6##1##2{\csname#4{#1##1}{##2}\endcsname}%
+ \def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1##1\endcsname}}% always root
+ \def#8{\dosetvalue{#1}}% ##1 {##2} (braces are mandate)
+ \def#9{\doletvalue{#1}}}% ##1 ##2
+
+\unexpanded\def\installparameterhandler#1#2%
+ {%\message{\detokenize{#1}/\detokenize{#2}}%
+ \normalexpanded
+ {\doinstallparameterhandler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname #2parameter\endcsname
+ \expandafter\noexpand\csname do#2parameter\endcsname
+ \expandafter\noexpand\csname do#2parentparameter\endcsname
+ \expandafter\noexpand\csname named#2parameter\endcsname
+ \expandafter\noexpand\csname detokenized#2parameter\endcsname
+ \expandafter\noexpand\csname doset#2parameter\endcsname
+ \expandafter\noexpand\csname dolet#2parameter\endcsname}}
+
+\unexpanded\def\doinstallparameterhashhandler#1#2#3#4#5%
+ {\def#3##1{#4{#1#2}{##1}}%
+ \def#4##1##2{\ifcsname##1##2\endcsname##1\else\expandafter#5\csname##1\s!parent\endcsname{##2}\fi}%
+ \def#5##1##2{\ifx##1\relax\else#4{##1}{##2}\fi}}
+
+\unexpanded\def\installparameterhashhandler#1#2%
+ {\normalexpanded
+ {\doinstallparameterhashhandler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname #2parameterhash\endcsname
+ \expandafter\noexpand\csname do#2parameterhash\endcsname
+ \expandafter\noexpand\csname do#2parentparameterhash\endcsname}}
+
+
+\unexpanded\def\doinstalldefinehandler#1#2#3#4#5#6#7%
+ {\unexpanded\def#2{\dotripleempty#5}%
+ \newtoks#6%
+ \newtoks#7%
+ \def#5[##1][##2][##3]% [child][parent][settings]
+ {\edef#4{##1}% % [child] [settings]
+ \the#6% predefine % [child][parent]
+ \ifthirdargument % [child]
+ \getparameters[#1#4][\s!parent=#1##2,##3]%
+ \else\ifsecondargument
+ \doifassignmentelse{##2}
+ {\getparameters[#1#4][\s!parent=#3,##2]}
+ {\getparameters[#1#4][\s!parent=#1##2]}%
+ \else
+ \getparameters[#1#4][\s!parent=#3]%
+ \fi\fi
+ \the#7}}
+
+\unexpanded\def\installdefinehandler#1#2#3%
+ {\normalexpanded
+ {\doinstalldefinehandler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname define#2\endcsname
+ {\noexpand#3}% root
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname d@define#2\endcsname
+ \expandafter\noexpand\csname everypreset#2\endcsname
+ \expandafter\noexpand\csname everydefine#2\endcsname}}
+
+\unexpanded\def\doinstallsetuphandler#1#2#3#4#5%
+ {\unexpanded\def#2{\dodoubleempty#4}%
+ \newtoks#5%
+ \def#4[##1][##2]% maybe helper
+ {\ifsecondargument
+ \def\docommand####1% we will have a simple one as well
+ {\edef#3{####1}%
+ \getparameters[#1#3][##2]%
+ \the#5}%
+ \processcommalist[##1]\docommand
+ \else
+ \let#3\empty
+ \getparameters[#1][##1]%
+ \the#5%
+ \fi}}
+
+\unexpanded\def\installsetuphandler#1#2%
+ {\normalexpanded
+ {\doinstallsetuphandler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname setup#2\endcsname
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname d@setup#2\endcsname
+ \expandafter\noexpand\csname everysetup#2\endcsname}}
+
+\unexpanded\def\installcommandhandler#1#2#3% \??self name \??parent (can be \??self)
+ {\installparameterhandler {#1}{#2}%
+ \installparameterhashhandler{#1}{#2}%
+ \installdefinehandler {#1}{#2}{#3}%
+ \installsetuphandler {#1}{#2}}
+
+\unexpanded\def\installnamespace#1%
+ {\setvalue{????#1}{@@@@#1}}
+
+\protect
+
diff --git a/Master/texmf-dist/tex/context/base/mult-aux.mkiv b/Master/texmf-dist/tex/context/base/mult-aux.mkiv
new file mode 100644
index 00000000000..1dfe6fb8efd
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mult-aux.mkiv
@@ -0,0 +1,269 @@
+%D \module
+%D [ file=mult-aux,
+%D version=2010.08.2,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=helpers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%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 A generalization of \MKIV-like inheritance. Just something to play
+%D with (interface might change). The code here evolved in an email
+%D exchange between me and Wolgang Schuster.
+
+\writestatus{loading}{ConTeXt Multilingual Macros / Helpers}
+
+\registerctxluafile{mult-aux}{1.001}
+
+\unprotect
+
+%D \starttyping
+%D \unprotect
+%D \def\????aa{@@@@aa}
+%D
+%D \installparameterhandler \????aa {whatever}
+%D \installsetuphandler \????aa {whatever}
+%D \installdefinehandler \????aa {whatever} \????aa % #3 == defaultroot
+%D \installattributehandler \????aa {whatever}
+%D
+%D % \installcommandhandler \????aa {whatever} \????aa
+%D \protect
+%D
+%D % \whateverparameter \c!test
+%D % \whateverparameterhash \c!test
+%D % \namedwhateverparameter \mycurrentwhatever \c!test
+%D % \dosetwhateverattributes \c!style \c!color
+%D % \everydefinewhatever (sets \currentwhatever)
+%D % \everypresetwhatever (can be used to reset parameters as we can redefine)
+%D % \everysetupwhatever (sets \currentwhatever)
+%D
+%D \starttext
+%D \definewhatever[first] \definewhatever[second][first]
+%D test: \def\currentwhatever{first} \whateverparameter{method} \par
+%D \setupwhatever [method=unset] test: \def\currentwhatever{first} \whateverparameter{method} \par
+%D \setupwhatever[first] [method=first] test: \def\currentwhatever{first} \whateverparameter{method} \par
+%D test: \def\currentwhatever{second} \whateverparameter{method} \par
+%D \setupwhatever[second][method=second] test: \def\currentwhatever{second} \whateverparameter{method} \par
+%D \stoptext
+%D \stoptyping
+
+% problem: every* could clash
+%
+% There can be less {} in the following definitions if we assume \??aa and \c!somecs
+%
+% todo: \def\detokenized...parameter#1{\detokenize\expandafter\expandafter\expandafter{\csname#1#2\endcsname}} % always root
+%
+% it might be more efficient to do this at the lua and
+%
+% watch the push/pop and predefinition of current .. this is needed for nested
+% definitions and overloaded defines using the predefined one
+
+\unexpanded\def\doinstallparameterhandler#1#2#3#4#5#6#7%
+ {\ifx#2\relax\let#2\empty\fi
+ \def#3##1{\csname#4{#1#2}{##1}\endcsname}%
+ \def#4##1##2{\ifcsname##1##2\endcsname##1##2\else\expandafter#5\csname##1\s!parent\endcsname{##2}\fi}%
+ \def#5##1##2{\ifx##1\relax\s!empty\else#4{##1}{##2}\fi}%
+ \def#6##1##2{\csname#4{#1##1}{##2}\endcsname}%
+ \def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1##1\endcsname}}} % always root
+
+\unexpanded\def\installparameterhandler#1#2%
+ {\normalexpanded
+ {\doinstallparameterhandler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname #2parameter\endcsname
+ \expandafter\noexpand\csname do#2parameter\endcsname
+ \expandafter\noexpand\csname do#2parentparameter\endcsname
+ \expandafter\noexpand\csname named#2parameter\endcsname
+ \expandafter\noexpand\csname detokenized#2parameter\endcsname}}
+
+\unexpanded\def\doinstallparameterhashhandler#1#2#3#4#5%
+ {\ifx#2\relax\let#2\empty\fi
+ \def#3##1{#4{#1#2}{##1}}%
+ \def#4##1##2{\ifcsname##1##2\endcsname##1\else\expandafter#5\csname##1\s!parent\endcsname{##2}\fi}%
+ \def#5##1##2{\ifx##1\relax\else#4{##1}{##2}\fi}}
+
+\unexpanded\def\installparameterhashhandler#1#2%
+ {\normalexpanded
+ {\doinstallparameterhashhandler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname #2parameterhash\endcsname
+ \expandafter\noexpand\csname do#2parameterhash\endcsname
+ \expandafter\noexpand\csname do#2parentparameterhash\endcsname}}
+
+\unexpanded\def\doinstallparametersethandler#1#2#3#4#5%
+ {\ifx#2\relax\let#2\empty\fi
+ \def#3{\dosetvalue{#1#2}}% ##1 {##2} (braces are mandate)
+ \def#4{\doletvalue{#1#2}}% ##1 ##2
+ \def#5{\doletvalue{#1#2}\empty}}% ##1
+
+\unexpanded\def\installparametersethandler#1#2%
+ {\normalexpanded
+ {\doinstallparametersethandler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname set#2parameter\endcsname
+ \expandafter\noexpand\csname let#2parameter\endcsname
+ \expandafter\noexpand\csname reset#2parameter\endcsname}}
+
+\unexpanded\def\doinstallattributehandler#1#2#3% #1 not used here
+ {\def#2##1##2% style color
+ {\edef\fontattributehash {#3{##1}}%
+ \edef\colorattributehash{#3{##2}}%
+ \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash {##1}\fi
+ \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash{##2}\fi}}
+
+\unexpanded\def\installattributehandler#1#2%
+ {\normalexpanded
+ {\doinstallattributehandler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname doset#2attributes\endcsname
+ \expandafter\noexpand\csname #2parameterhash\endcsname}}
+
+\let\definehandlerparent\empty
+
+\unexpanded\def\doinstalldefinehandler#1#2#3#4#5#6#7#8%
+ {\ifx#4\relax\let#4\empty\fi
+ \unexpanded\def#2{\dotripleempty#5}%
+ \newtoks#6%
+ \newtoks#7%
+ \def#5[##1][##2][##3]% [child][parent][settings] | [child][settings] | [child][parent] | [child]
+ {\let\saveddefinewhatever#4%
+ \edef#4{##1}%
+ \the#6% predefine
+ \ifthirdargument
+ \edef#8{##2}%
+ \getparameters[#1#4][\s!parent=#1##2,##3]%
+ \else\ifsecondargument
+ \doifassignmentelse{##2}
+ {\let#8\empty
+ \getparameters[#1#4][\s!parent=#3,##2]}
+ {\edef#8{##2}%
+ \getparameters[#1#4][\s!parent=#1##2]}%
+ \else
+ \let#8\empty
+ \getparameters[#1#4][\s!parent=#3]%
+ \fi\fi
+ \the#7%
+ \let#4\saveddefinewhatever}}
+
+\unexpanded\def\installdefinehandler#1#2#3%
+ {\normalexpanded
+ {\doinstalldefinehandler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname define#2\endcsname
+ {\noexpand#3}% root
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname d@define#2\endcsname
+ \expandafter\noexpand\csname everypreset#2\endcsname
+ \expandafter\noexpand\csname everydefine#2\endcsname
+ \expandafter\noexpand\csname current#2parent\endcsname}}
+
+\unexpanded\def\doinstallsetuphandler#1#2#3#4#5#6%
+ {\ifx#3\relax\let#3\empty\fi
+ \unexpanded\def#2{\dodoubleempty#4}%
+ \unexpanded\def#6{\getparameters[#1#3]}%
+ \newtoks#5%
+ \def#4[##1][##2]% maybe helper
+ {\let\savedsetupwhatever#3%
+ \ifsecondargument
+ \def\docommand####1% we will have a simple one as well
+ {\edef#3{####1}%
+ \getparameters[#1#3][##2]%
+ \the#5}%
+ \processcommalist[##1]\docommand
+ \else
+ \let#3\empty
+ \getparameters[#1][##1]%
+ \the#5%
+ \fi
+ \let#3\savedsetupwhatever}}
+
+\unexpanded\def\installsetuphandler#1#2%
+ {\normalexpanded
+ {\doinstallsetuphandler
+ {\noexpand#1}% \??aa
+ \expandafter\noexpand\csname setup#2\endcsname
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname d@setup#2\endcsname
+ \expandafter\noexpand\csname everysetup#2\endcsname
+ \expandafter\noexpand\csname setupcurrent#2\endcsname}}
+
+\unexpanded\def\installcommandhandler#1#2#3% \??self name \??parent (can be \??self)
+ {\installparameterhandler {#1}{#2}%
+ \installparameterhashhandler{#1}{#2}%
+ \installparametersethandler {#1}{#2}%
+ \installdefinehandler {#1}{#2}{#3}%
+ \installsetuphandler {#1}{#2}%
+ \installattributehandler {#1}{#2}}
+
+\unexpanded\def\installnamespace#1%
+ {\setvalue{????#1}{@@@@#1}}
+
+% \enabletrackers[interfaces.namespaces,context.flush]
+%
+% \definenamespace
+% [xy]
+% [type=module,
+% comment=test module,
+% version=1,
+% name=test,
+% style=yes,
+% command=yes,
+% setup=list,
+% set=yes,
+% parent=xy]
+%
+% \unprotect
+% \getparameters
+% [\????xy]
+% [text=]
+% \protect
+%
+% \definetest[one]
+%
+% \starttext
+%
+% “\testparameter{text}”
+%
+% \setuptest[text=foo]
+%
+% “\testparameter{text}”
+%
+% \setuptest[one][text=bar]
+%
+% “\testparameter{text}”
+%
+% \stoptext
+
+\unexpanded\def\definenamespace
+ {\dodoubleargument\dodefinenamespace}
+
+\def\dodefinenamespace[#1][#2]% namespace settings
+ {\ctxlua{interfaces.namespaces.define(\!!bs#1\!!es,\!!bs#2\!!es)}}
+
+\def\listnamespaces
+ {\ctxlua{interfaces.namespaces.list()}}
+
+%D Helper:
+%D
+%D \starttyping
+%D \showparentchain{@@am}{left}
+%D \stoptyping
+
+\def\doshowparentchain#1%
+ {#1 => %
+ \ifcsname#1\s!parent\endcsname
+ \expandafter\doshowparentchain\csname#1\s!parent\endcsname
+ \fi}
+
+\def\showparentchain#1#2%
+ {\writestatus\m!system{chain: [ \doshowparentchain{#1#2}]}}
+
+\protect
+
diff --git a/Master/texmf-dist/tex/context/base/mult-chk.lua b/Master/texmf-dist/tex/context/base/mult-chk.lua
index bdbd1dd22f9..4b1ba12ee3e 100644
--- a/Master/texmf-dist/tex/context/base/mult-chk.lua
+++ b/Master/texmf-dist/tex/context/base/mult-chk.lua
@@ -10,57 +10,64 @@ local format = string.format
local lpegmatch = lpeg.match
local type = type
local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
+local make_settings_to_hash_pattern, settings_to_set = utilities.parsers.make_settings_to_hash_pattern, utilities.parsers.settings_to_set
+
+local allocate = utilities.storage.allocate
+
+local report_interface = logs.reporter("interface","checking")
interfaces = interfaces or { }
-interfaces.syntax = {
+interfaces.syntax = allocate {
test = { keys = table.tohash { "a","b","c","d","e","f","g" } }
}
-function interfaces.invalidkey(kind,key)
- commands.writestatus("syntax","invalid key '%s' for '%s' in line %s",key,kind,tex.inputlineno)
+function interfaces.invalidkey(category,key)
+ report_interface("invalid key '%s' for '%s' in line %s",key,category,tex.inputlineno)
end
-function interfaces.setvalidkeys(kind,list)
- local s = interfaces.syntax[kind]
+function interfaces.setvalidkeys(category,list)
+ local s = interfaces.syntax[category]
if not s then
- interfaces.syntax[kind] = {
- keys = aux.settings_to_set(list)
+ interfaces.syntax[category] = {
+ keys = settings_to_set(list)
}
else
- s.keys = aux.settings_to_set(list)
+ s.keys = settings_to_set(list)
end
end
-function interfaces.addvalidkeys(kind,list)
- local s = interfaces.syntax[kind]
+function interfaces.addvalidkeys(category,list)
+ local s = interfaces.syntax[category]
if not s then
- interfaces.syntax[kind] = {
- keys = aux.settings_to_set(list)
+ interfaces.syntax[category] = {
+ keys = settings_to_set(list)
}
else
- aux.settings_to_set(list,s.keys)
+ settings_to_set(list,s.keys)
end
end
-local prefix, kind, keys
+-- weird code, looks incomplete ... probbably an experiment
+
+local prefix, category, keys
local function set(key,value)
if keys and not keys[key] then
- interfaces.invalidkey(kind,key)
+ interfaces.invalidkey(category,key)
else
- texsprint(ctxcatcodes,format("\\setsomevalue{%s}{%s}{%s}",prefix,key,value))
+ context.setsomevalue(prefix,key,value)
end
end
-local pattern = aux.make_settings_to_hash_pattern(set,"tolerant")
+local pattern = make_settings_to_hash_pattern(set,"tolerant")
-function commands.getcheckedparameters(k,p,s)
+function interfaces.getcheckedparameters(k,p,s)
if s and s ~= "" then
- prefix, kind = p, k
+ prefix, category = p, k
keys = k and k ~= "" and interfaces.syntax[k].keys
lpegmatch(pattern,s)
end
end
-_gcp_ = commands.getcheckedparameters
+-- _igcp_ = interfaces.getcheckedparameters
diff --git a/Master/texmf-dist/tex/context/base/mult-chk.mkiv b/Master/texmf-dist/tex/context/base/mult-chk.mkiv
index 7b40bd64a69..cf38daf6700 100644
--- a/Master/texmf-dist/tex/context/base/mult-chk.mkiv
+++ b/Master/texmf-dist/tex/context/base/mult-chk.mkiv
@@ -50,7 +50,8 @@
\fi{#1}{#3}#5}
\def\dogetcheckedparametersyes#1#2#3]%
- {\ctxlua{_gcp_("#1","#2",\!!bs\detokenize{#3}\!!es)}}
+ %{\ctxlua{_igcp_("#1","#2",\!!bs\detokenize{#3}\!!es)}}
+ {\ctxlua{interfaces.getcheckedparameters("#1","#2",\!!bs\detokenize{#3}\!!es)}}
\def\getcheckedparametersnop[#1]#2[#3]#4[#5%
{\if\noexpand#5]%
diff --git a/Master/texmf-dist/tex/context/base/mult-cld.lua b/Master/texmf-dist/tex/context/base/mult-cld.lua
deleted file mode 100644
index 81038b68b51..00000000000
--- a/Master/texmf-dist/tex/context/base/mult-cld.lua
+++ /dev/null
@@ -1,212 +0,0 @@
-if not modules then modules = { } end modules ['mult-cld'] = {
- version = 1.001,
- comment = "companion to mult-cld.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- This is an experiment: generating context code at the lua end. After all
--- it is surprisingly simple to implement due to metatables. I was wondering
--- if there was a more natural way to deal with commands at the lua end.
--- Of course it's a bit slower but often more readable when mixed with lua
--- code. It can also be handy when generating documents from databases or
--- when constructing large tables or so.
---
--- Todo: optional checking against interface
--- Todo: coroutine trickery
-
-context = context or { }
-
-local format, concat = string.format, table.concat
-local next, type = next, type
-local texsprint, texiowrite, ctxcatcodes = tex.sprint, texio.write, tex.ctxcatcodes
-
-local flush = texsprint or function(cct,...) print(table.concat{...}) end
-
-local _stack_, _n_ = { }, 0
-
-local function _store_(ti)
- _n_ = _n_ + 1
- _stack_[_n_] = ti
- return _n_
-end
-
-local function _flush_(n)
- if not _stack_[n]() then
- _stack_[n] = nil
- else
- -- keep, beware, that way the stack can grow
- end
-end
-
-context._stack_ = _stack_
-context._store_ = _store_
-context._flush_ = _flush_
-
-function tex.fprint(...) -- goodie
- texsprint(ctxcatcodes,format(...))
-end
-
-function context.trace(intercept)
- local normalflush = flush
- flush = function(c,...)
- logs.report("context",concat({...}))
- if not intercept then
- normalflush(c,...)
- end
- end
- context.trace = function() end
-end
-
-trackers.register("context.flush", function(v) if v then context.trace() end end)
-trackers.register("context.intercept", function(v) if v then context.trace(true) end end)
-
-local function writer(k,...)
- if k then
- flush(ctxcatcodes,k)
- local t = { ... }
- local nt = #t
- if nt > 0 then
- for i=1,nt do
- local ti = t[i]
- local typ = type(ti)
- if ti == nil then
- -- next
- elseif typ == "function" then
- flush(ctxcatcodes,"{\\mkivflush{" .. _store_(ti) .. "}}")
- elseif typ == "string" or typ == "number" then
- flush(ctxcatcodes,"{",ti,"}")
- elseif typ == "table" then
- local tn = #ti
- if tn > 0 then
- for j=1,tn do
- local tj = ti[j]
- if type(tj) == "function" then
- ti[j] = "\\mkivflush{" .. _store_(tj) .. "}"
- end
- end
- flush(ctxcatcodes,"[",concat(ti,","),"]")
- else
- flush(ctxcatcodes,"[")
- local done = false
- for k, v in next, ti do
- if done then
- flush(ctxcatcodes,",",k,'=',v)
- else
- flush(ctxcatcodes,k,'=',v)
- done = true
- end
- end
- flush(ctxcatcodes,"]")
- end
- -- elseif typ == "boolean" then
- -- flush(ctxcatcodes,"\n")
- elseif ti == true then
- flush(ctxcatcodes,"\n")
- elseif typ == false then
- -- if force == "direct" then
- flush(ctxcatcodes,tostring(ti))
- -- end
- elseif typ == "thread" then
- logs.report("interfaces","coroutines not supported as we cannot yeild across boundaries")
- else
- logs.report("interfaces","error: %s gets a weird argument %s",k,tostring(ti))
- end
- end
- end
- end
-end
-
--- -- --
-
-local function indexer(t,k)
- local c = "\\" .. k .. " "
- local f = function(...) return writer(c,...) end
- t[k] = f
- return f
-end
-
-local function caller(t,f,a,...)
- if a then
- flush(ctxcatcodes,format(f,a,...))
- elseif type(f) == "function" then
- flush(ctxcatcodes,"{\\mkivflush{" .. _store_(f) .. "}}")
- elseif f then
- flush(ctxcatcodes,f)
- else
- flush(ctxcatcodes,"\n")
- end
-end
-
-setmetatable(context, { __index = indexer, __call = caller } )
-
--- the only non macro:
-
-local trace_cld = false
-
-function context.runfile(filename)
- filename = resolvers.findtexfile(filename) or ""
- if filename ~= "" then
- local ok = dofile(filename)
- if type(ok) == "function" then
- if trace_cld then
- commands.writestatus("cld","begin of file '%s' (function call)",filename)
- end
- ok()
- if trace_cld then
- commands.writestatus("cld","end of file '%s' (function call)",filename)
- end
- elseif ok then
- commands.writestatus("cld","file '%s' is processed and returns true",filename)
- else
- commands.writestatus("cld","file '%s' is processed and returns nothing",filename)
- end
- else
- commands.writestatus("cld","unknown file '%s'",filename)
- end
-end
-
--- tracking is using the regular mechanism; we need to define
--- these 'macro' functions explictly as otherwise they are are
--- delayed (as all commands print back to tex, so that tracing
--- would be enabled afterwards)
-
-trackers.register("cld.print", function(v)
- trace_cld = v
- if v then
- flush = function(c,...)
- texiowrite(...)
- texsprint(c,...)
- end
- else
- flush = texsprint
- end
-end)
-
-function context.enabletrackers (str) trackers.enable (str) end
-function context.disabletrackers(str) trackers.disable(str) end
-
--- see demo-cld.cld for an example
-
--- context.starttext(true)
--- context.chapter({ "label" }, "title", true)
--- context.chapter(function() return { "label" } end, "title", true)
---
--- context.startchapter({ title = "test" }, { more = "oeps" }, true)
---
--- context.bTABLE(true)
--- for i=1,10 do
--- context.bTR()
--- for i=1,10 do
--- context.bTD()
--- context("%#2i",math.random(99))
--- context.eTD()
--- end
--- context.eTR(true)
--- end
--- context.eTABLE(true)
---
--- context.stopchapter(true)
---
--- context.stoptext(true)
diff --git a/Master/texmf-dist/tex/context/base/mult-com.tex b/Master/texmf-dist/tex/context/base/mult-com.mkii
index 1186168377b..1186168377b 100644
--- a/Master/texmf-dist/tex/context/base/mult-com.tex
+++ b/Master/texmf-dist/tex/context/base/mult-com.mkii
diff --git a/Master/texmf-dist/tex/context/base/mult-con.tex b/Master/texmf-dist/tex/context/base/mult-con.mkii
index 62e97d5671a..62e97d5671a 100644
--- a/Master/texmf-dist/tex/context/base/mult-con.tex
+++ b/Master/texmf-dist/tex/context/base/mult-con.mkii
diff --git a/Master/texmf-dist/tex/context/base/mult-de.tex b/Master/texmf-dist/tex/context/base/mult-de.mkii
index f6f4f3bf9d1..6d6b04dcaf0 100644
--- a/Master/texmf-dist/tex/context/base/mult-de.tex
+++ b/Master/texmf-dist/tex/context/base/mult-de.mkii
@@ -68,12 +68,14 @@
\setinterfacevariable{after}{nach}
\setinterfacevariable{all}{alles}
\setinterfacevariable{always}{immer}
+\setinterfacevariable{and}{und}
\setinterfacevariable{answerarea}{answerarea}
\setinterfacevariable{appendices}{anhaenge}
\setinterfacevariable{appendix}{anhang}
\setinterfacevariable{april}{April}
\setinterfacevariable{atmargin}{amrand}
\setinterfacevariable{atpage}{aufseite}
+\setinterfacevariable{attachment}{attachment}
\setinterfacevariable{august}{August}
\setinterfacevariable{author}{autor}
\setinterfacevariable{auto}{auto}
@@ -90,6 +92,7 @@
\setinterfacevariable{bib}{bib}
\setinterfacevariable{big}{gross}
\setinterfacevariable{bigbodyfont}{bigbodyfont}
+\setinterfacevariable{bigger}{bigger}
\setinterfacevariable{bigpreference}{grosszuegig}
\setinterfacevariable{blank}{blanko}
\setinterfacevariable{blockquote}{blockquote}
@@ -124,6 +127,7 @@
\setinterfacevariable{content}{inhalt}
\setinterfacevariable{contents}{inhalte}
\setinterfacevariable{continue}{fortsetzten}
+\setinterfacevariable{continued}{continued}
\setinterfacevariable{controls}{controls}
\setinterfacevariable{conversion}{konversion}
\setinterfacevariable{current}{aktuell}
@@ -141,6 +145,7 @@
\setinterfacevariable{down}{down}
\setinterfacevariable{each}{jede}
\setinterfacevariable{edge}{kante}
+\setinterfacevariable{embed}{embed}
\setinterfacevariable{empty}{leer}
\setinterfacevariable{end}{end}
\setinterfacevariable{endnote}{endnote}
@@ -364,6 +369,7 @@
\setinterfacevariable{random}{zufaellig}
\setinterfacevariable{readonly}{nurlesbar}
\setinterfacevariable{rectangular}{rechteckig}
+\setinterfacevariable{reference}{referenz}
\setinterfacevariable{referral}{merkmal}
\setinterfacevariable{register}{register}
\setinterfacevariable{regular}{regular}
@@ -411,6 +417,7 @@
\setinterfacevariable{smallbolditalic}{kleinfettitalic}
\setinterfacevariable{smallboldslanted}{kleinfettgeneigt}
\setinterfacevariable{smallcaps}{smallcaps}
+\setinterfacevariable{smaller}{smaller}
\setinterfacevariable{smallitalic}{kleinitalic}
\setinterfacevariable{smallitalicbold}{kleinitalicfett}
\setinterfacevariable{smallnormal}{kleinnormal}
@@ -519,6 +526,7 @@
\setinterfaceconstant{after}{nach}
\setinterfaceconstant{afterhead}{nachkopf}
\setinterfaceconstant{afterkey}{nachtaste}
+\setinterfaceconstant{aftersection}{aftersection}
\setinterfaceconstant{align}{ausrichtung}
\setinterfaceconstant{aligncharacter}{aligncharacter}
\setinterfaceconstant{alignmentcharacter}{alignmentcharacter}
@@ -538,6 +546,7 @@
\setinterfaceconstant{authoretallimit}{authoretallimit}
\setinterfaceconstant{authoretaltext}{authoretaltext}
\setinterfaceconstant{auto}{auto}
+\setinterfaceconstant{autocase}{autocase}
\setinterfaceconstant{autofile}{autofile}
\setinterfaceconstant{autofocus}{autofocus}
\setinterfaceconstant{autohang}{autohang}
@@ -551,10 +560,12 @@
\setinterfaceconstant{backgroundoffset}{hintergrundoffset}
\setinterfaceconstant{backgroundradius}{hintergrundradius}
\setinterfaceconstant{backgroundscreen}{hintergrundraster}
+\setinterfaceconstant{backreference}{backreference}
\setinterfaceconstant{backspace}{rumpfspatium}
\setinterfaceconstant{balance}{ausgleichen}
\setinterfaceconstant{before}{vor}
\setinterfaceconstant{beforehead}{vorkopf}
+\setinterfaceconstant{beforesection}{beforesection}
\setinterfaceconstant{bet}{bet}
\setinterfaceconstant{big}{gross}
\setinterfaceconstant{blank}{blanko}
@@ -569,8 +580,10 @@
\setinterfaceconstant{bottomoffset}{untenoffset}
\setinterfaceconstant{bottomspace}{bottomspace}
\setinterfaceconstant{bottomstate}{untenstatus}
+\setinterfaceconstant{buffer}{buffer}
\setinterfaceconstant{cache}{cache}
\setinterfaceconstant{calculate}{berechnen}
+\setinterfaceconstant{category}{category}
\setinterfaceconstant{ccommand}{cbefehl}
\setinterfaceconstant{click}{klick}
\setinterfaceconstant{clickin}{klickin}
@@ -578,6 +591,7 @@
\setinterfaceconstant{clipoffset}{clipoffset}
\setinterfaceconstant{closeaction}{schliessenaktion}
\setinterfaceconstant{closecommand}{closecommand}
+\setinterfaceconstant{closepage}{closepage}
\setinterfaceconstant{closepageaction}{closepageaction}
\setinterfaceconstant{closesymbol}{closesymbol}
\setinterfaceconstant{color}{farbe}
@@ -629,6 +643,7 @@
\setinterfaceconstant{editoretallimit}{editoretallimit}
\setinterfaceconstant{editoretaltext}{editoretaltext}
\setinterfaceconstant{empty}{leer}
+\setinterfaceconstant{entries}{entries}
\setinterfaceconstant{equalheight}{equalheight}
\setinterfaceconstant{equalwidth}{equalwidth}
\setinterfaceconstant{escape}{escape}
@@ -653,6 +668,7 @@
\setinterfaceconstant{footer}{fusszeile}
\setinterfaceconstant{footerdistance}{fusszeilenabstand}
\setinterfaceconstant{footerstate}{fusszeilenstatus}
+\setinterfaceconstant{force}{zwinge}
\setinterfaceconstant{foregroundcolor}{foregroundcolor}
\setinterfaceconstant{foregroundstyle}{foregroundstyle}
\setinterfaceconstant{format}{formatieren}
@@ -699,11 +715,13 @@
\setinterfaceconstant{intent}{intent}
\setinterfaceconstant{interaction}{interaktion}
\setinterfaceconstant{interlinespace}{zeilenabstande}
+\setinterfaceconstant{internalgrid}{internalgrid}
\setinterfaceconstant{itemalign}{itemalign}
\setinterfaceconstant{items}{posten}
\setinterfaceconstant{juniorsep}{juniorsep}
\setinterfaceconstant{ken}{ken}
\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keys}{keys}
\setinterfaceconstant{keyword}{keyword}
\setinterfaceconstant{label}{label}
\setinterfaceconstant{lastnamesep}{lastnamesep}
@@ -746,6 +764,7 @@
\setinterfaceconstant{margintext}{marginaltext}
\setinterfaceconstant{marking}{beschriftung}
\setinterfaceconstant{marstyle}{beschrstil}
+\setinterfaceconstant{mask}{mask}
\setinterfaceconstant{max}{max}
\setinterfaceconstant{maxdepth}{maxdepth}
\setinterfaceconstant{maxheight}{maxhoehe}
@@ -799,6 +818,7 @@
\setinterfaceconstant{oddmargin}{ungeraderand}
\setinterfaceconstant{offset}{offset}
\setinterfaceconstant{openaction}{oeffenaktion}
+\setinterfaceconstant{openpage}{openpage}
\setinterfaceconstant{openpageaction}{openpageaction}
\setinterfaceconstant{option}{option}
\setinterfaceconstant{order}{order}
@@ -851,6 +871,7 @@
\setinterfaceconstant{previous}{vorige}
\setinterfaceconstant{previousnumber}{vorigenummer}
\setinterfaceconstant{process}{process}
+\setinterfaceconstant{profile}{profile}
\setinterfaceconstant{pubsep}{pubsep}
\setinterfaceconstant{radius}{radius}
\setinterfaceconstant{random}{zufaellig}
@@ -944,6 +965,7 @@
\setinterfaceconstant{sub}{unter}
\setinterfaceconstant{subtitle}{untertitel}
\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{suffixseparator}{suffixseparator}
\setinterfaceconstant{surnamesep}{surnamesep}
\setinterfaceconstant{sx}{sx}
\setinterfaceconstant{sy}{sy}
@@ -969,6 +991,7 @@
\setinterfaceconstant{textstate}{textstatus}
\setinterfaceconstant{textstyle}{textstil}
\setinterfaceconstant{textwidth}{textbreite}
+\setinterfaceconstant{threshold}{threshold}
\setinterfaceconstant{title}{titel}
\setinterfaceconstant{titlecolor}{titelfarbe}
\setinterfaceconstant{titlecommand}{titlecommand}
@@ -991,6 +1014,7 @@
\setinterfaceconstant{urlalternative}{urlalternative}
\setinterfaceconstant{urlspace}{urlspatium}
\setinterfaceconstant{validate}{validieren}
+\setinterfaceconstant{values}{values}
\setinterfaceconstant{vcommand}{vbefehl}
\setinterfaceconstant{veroffset}{kopfoffset}
\setinterfaceconstant{vfil}{vfil}
@@ -1045,7 +1069,6 @@
\setinterfacecommand{CAPPED}{KAP}
\setinterfacecommand{Character}{Buchstabe}
\setinterfacecommand{Characters}{Buchstaben}
-\setinterfacecommand{LABELTEXT}{LABELTEXT}
\setinterfacecommand{MONTH}{MONAT}
\setinterfacecommand{Numbers}{Ziffern}
\setinterfacecommand{Romannumerals}{Roemischezahlen}
@@ -1084,7 +1107,6 @@
\setinterfacecommand{colorbar}{farbbalken}
\setinterfacecommand{colorvalue}{farbewert}
\setinterfacecommand{column}{spalte}
-\setinterfacecommand{comment}{kommentar}
\setinterfacecommand{comparecolorgroup}{vergleichefarbengruppe}
\setinterfacecommand{comparepalet}{vergleichepalette}
\setinterfacecommand{completepagenumber}{completepagenumber}
diff --git a/Master/texmf-dist/tex/context/base/mult-def.lua b/Master/texmf-dist/tex/context/base/mult-def.lua
index ce5af2bba37..8499dd43b29 100644
--- a/Master/texmf-dist/tex/context/base/mult-def.lua
+++ b/Master/texmf-dist/tex/context/base/mult-def.lua
@@ -38,16 +38,16 @@ return {
["pe"]="Characters",
["ro"]="Litere",
},
- ["LABELTEXT"]={
- ["cs"]="TEXTPOPISKU",
- ["de"]="LABELTEXT",
- ["en"]="LABELTEXT",
- ["fr"]="LABELTEXTE",
- ["it"]="TESTOETICHETTA",
- ["nl"]="LABELTEKST",
- ["pe"]="LABELTEXT",
- ["ro"]="TEXTETICHETA",
- },
+--~ ["LABELTEXT"]={
+--~ ["cs"]="TEXTPOPISKU",
+--~ ["de"]="LABELTEXT",
+--~ ["en"]="LABELTEXT",
+--~ ["fr"]="LABELTEXTE",
+--~ ["it"]="TESTOETICHETTA",
+--~ ["nl"]="LABELTEKST",
+--~ ["pe"]="LABELTEXT",
+--~ ["ro"]="TEXTETICHETA",
+--~ },
["MONTH"]={
["cs"]="MESIC",
["de"]="MONAT",
@@ -168,7 +168,8 @@ return {
["pe"]="تنظیم‌طرح‌بندی",
["ro"]="adapteazaaspect",
},
- ["adding"]={},
+ ["adding"]={
+ },
["arg"]={
["cs"]="arg",
["de"]="arg",
@@ -429,16 +430,6 @@ return {
["pe"]="ستون",
["ro"]="coloana",
},
- ["comment"]={
- ["cs"]="komentar",
- ["de"]="kommentar",
- ["en"]="comment",
- ["fr"]="commentaire",
- ["it"]="commento",
- ["nl"]="commentaar",
- ["pe"]="توضیح",
- ["ro"]="comentariu",
- },
["comparecolorgroup"]={
["cs"]="porovnejskupinubarev",
["de"]="vergleichefarbengruppe",
@@ -6480,6 +6471,14 @@ return {
},
},
["constants"]={
+ ["keys"]={
+ ["en"]="keys",
+ ["nl"]="sleutels", -- brrr
+ },
+ ["entries"]={
+ ["en"]="entries",
+ ["nl"]="ingangen",
+ },
["strip"]={
["en"]="strip",
},
@@ -6578,6 +6577,14 @@ return {
["maybeyear"]={
["en"]="maybeyear",
},
+--["group"]={
+-- ["en"]="group",
+-- ["nl"]="groep",
+--},
+ ["values"]={
+ ["en"]="values",
+ ["nl"]="waarden",
+ },
["action"]={
["cs"]="akce",
["de"]="aktion",
@@ -6618,6 +6625,10 @@ return {
["pe"]="بعدازسر",
["ro"]="dupatitlu",
},
+ ["aftersection"]={
+ ["en"]="aftersection",
+ ["nl"]="nasectie",
+ },
["afterkey"]={
["cs"]="klavesapo",
["de"]="nachtaste",
@@ -6728,6 +6739,10 @@ return {
["pe"]="خودکار",
["ro"]="auto",
},
+ ["autocase"]={
+ ["en"]="autocase",
+ ["nl"]="autocase",
+ },
["autofile"]={
["cs"]="autofile",
["de"]="autofile",
@@ -6868,6 +6883,10 @@ return {
["pe"]="فضای‌پس",
["ro"]="spatiuspate",
},
+ ["backreference"]={
+ ["en"]="backreference",
+ ["nl"]="terugreferentie",
+ },
["balance"]={
["cs"]="rovnovaha",
["de"]="ausgleichen",
@@ -6888,6 +6907,10 @@ return {
["pe"]="قبل‌از",
["ro"]="inainte",
},
+ ["beforesection"]={
+ ["en"]="beforesection",
+ ["nl"]="voorsectie",
+ },
["beforehead"]={
["cs"]="predhlavickou",
["de"]="vorkopf",
@@ -7024,6 +7047,10 @@ return {
["pe"]="وضعیت‌پایین",
["ro"]="starejos",
},
+ ["buffer"]={
+ ["en"]="buffer",
+ ["nl"]="buffer",
+ },
["cache"]={
["cs"]="cache",
["de"]="cache",
@@ -7044,6 +7071,10 @@ return {
["pe"]="محاسبه",
["ro"]="calculeaza",
},
+ ["category"]={
+ ["en"]="category",
+ ["nl"]="categorie",
+ },
["ccommand"]={
["cs"]="cprikaz",
["de"]="cbefehl",
@@ -7124,6 +7155,10 @@ return {
["pe"]="بستن‌عمل‌صفحه",
["ro"]="actiuneinchiderepagina",
},
+ ["closepage"]={
+ ["en"]="closepage",
+ ["nl"]="sluitpagina",
+ },
["closesymbol"]={
["cs"]="closesymbol",
["de"]="closesymbol",
@@ -7480,6 +7515,10 @@ return {
["pe"]="نمایش",
["ro"]="display",
},
+ ["mask"]={
+ ["en"]="mask",
+ ["nl"]="masker",
+ },
["distance"]={
["cs"]="vzdalenost",
["de"]="abstand",
@@ -7783,6 +7822,16 @@ return {
["pe"]="رنگ‌پیش‌زمینه",
["ro"]="foregroundcolor",
},
+ ["force"]={
+ ["cs"]="sila",
+ ["de"]="zwinge",
+ ["en"]="force",
+ ["fr"]="force",
+ ["it"]="forza",
+ ["nl"]="forceer",
+ ["pe"]="اجبار",
+ ["ro"]="fortat",
+ },
["foregroundstyle"]={
["cs"]="foregroundstyle",
["de"]="foregroundstyle",
@@ -8206,6 +8255,10 @@ return {
["pe"]="فضای‌بین‌خط",
["ro"]="spatiereinterliniara",
},
+ ["internalgrid"]={
+ ["nl"]="interngrid",
+ ["en"]="internalgrid",
+ },
["itemalign"]={
["cs"]="itemalign",
["de"]="itemalign",
@@ -9090,6 +9143,10 @@ return {
["pe"]="عمل‌صفحه‌باز",
["ro"]="actiunedeschiderepagina",
},
+ ["openpage"]={
+ ["en"]="openpage",
+ ["nl"]="openpagina",
+ },
["option"]={
["cs"]="volba",
["de"]="option",
@@ -9412,6 +9469,9 @@ return {
["pe"]="پردازش",
["ro"]="process",
},
+ ["profile"]={
+ ["en"]="profile",
+ },
["radius"]={
["cs"]="polomer",
["de"]="radius",
@@ -10213,6 +10273,10 @@ return {
["pe"]="پسوند",
["ro"]="suffix",
},
+ ["suffixseparator"]={
+ ["en"]="suffixseparator",
+ ["nl"]="suffixscheider",
+ },
["sx"]={
["cs"]="sx",
["de"]="sx",
@@ -10453,6 +10517,9 @@ return {
["pe"]="عرض‌متن",
["ro"]="latimetext",
},
+ ["threshold"]={
+ ["en"]="threshold", -- rather international term
+ },
["title"]={
["cs"]="titul",
["de"]="titel",
@@ -11127,6 +11194,10 @@ return {
},
},
["variables"]={
+ ["embed"]={
+ ["en"]="embed",
+ ["nl"]="sluitin",
+ },
["end"]={
["en"]="end",
["nl"]="eind",
@@ -11143,6 +11214,14 @@ return {
["en"]="up",
["nl"]="omhoog",
},
+ ["smaller"]={
+ ["en"]="smaller",
+ ["nl"]="kleiner",
+ },
+ ["bigger"]={
+ ["en"]="bigger",
+ ["nl"]="groter",
+ },
["underbar"]={
["cs"]="podtrzeno",
["de"]="unterstrichen",
@@ -11908,6 +11987,16 @@ return {
["pe"]="همواره",
["ro"]="totdeauna",
},
+ ["and"]={
+ --["cs"]="",
+ ["de"]="und",
+ ["en"]="and",
+ --["fr"]="",
+ --["it"]="",
+ ["nl"]="en",
+ --["pe"]="",
+ --["ro"]="",
+ },
["answerarea"]={
["cs"]="answerarea",
["de"]="answerarea",
@@ -11948,6 +12037,10 @@ return {
["pe"]="آوریل",
["ro"]="aprilie",
},
+ ["attachment"]={
+ ["en"]="attachment",
+ ["nl"]="aanhangsel",
+ },
["atmargin"]={
["cs"]="naokraji",
["de"]="amrand",
@@ -11972,7 +12065,7 @@ return {
["cs"]="srpen",
["de"]="August",
["en"]="August",
- ["fr"]="aout",
+ ["fr"]="août",
["it"]="agosto",
["nl"]="augustus",
["pe"]="آگوست",
@@ -12418,6 +12511,10 @@ return {
["pe"]="ادامه",
["ro"]="continuu",
},
+ ["continued"]={
+ ["en"]="continued",
+ ["nl"]="vervolgd",
+ },
["controls"]={
["cs"]="controls",
["de"]="controls",
@@ -14721,6 +14818,16 @@ return {
["pe"]="مراجعه",
["ro"]="referinta",
},
+ ["reference"]={
+ ["cs"]="odkaz",
+ ["de"]="referenz",
+ ["en"]="reference",
+ ["fr"]="reference",
+ ["it"]="riferimento",
+ ["nl"]="referentie",
+ ["pe"]="مرجع",
+ ["ro"]="referinta",
+ },
["register"]={
["cs"]="rejstrik",
["de"]="register",
diff --git a/Master/texmf-dist/tex/context/base/mult-def.tex b/Master/texmf-dist/tex/context/base/mult-def.mkii
index cff9fb07434..0e1a7dee71f 100644
--- a/Master/texmf-dist/tex/context/base/mult-def.tex
+++ b/Master/texmf-dist/tex/context/base/mult-def.mkii
@@ -22,14 +22,10 @@
\setvalue{@interface@persian@}{pe}
\setvalue{@interface@romanian@}{ro}
-% \def\userinterfacetag
-% {\ifcsname @interface@\defaultinterface @\endcsname\csname @interface@\defaultinterface @\endcsname\else en\fi}
-\def\userinterfacetag
- {\ifcsname @interface@\currentinterface @\endcsname\csname @interface@\currentinterface @\endcsname\else en\fi}
-\def\userresponsestag
- {\ifcsname @interface@\currentresponses @\endcsname\csname @interface@\currentresponses @\endcsname\else en\fi}
+\def\userinterfacetag{\ifcsname @interface@\currentinterface @\endcsname\csname @interface@\currentinterface @\endcsname\else en\fi}
+\def\userresponsestag{\ifcsname @interface@\currentresponses @\endcsname\csname @interface@\currentresponses @\endcsname\else en\fi}
-\input mult-\userinterfacetag \relax
-\input mult-m\userresponsestag \relax
+\input mult-\userinterfacetag .\mksuffix \relax
+\input mult-m\userresponsestag.\mksuffix \relax
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mult-def.mkiv b/Master/texmf-dist/tex/context/base/mult-def.mkiv
new file mode 100644
index 00000000000..a273fa18a03
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mult-def.mkiv
@@ -0,0 +1,33 @@
+%D \module
+%D [ file=mult-def,
+%D version=2008.10.22,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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
+
+\setvalue{@interface@czech@}{cs}
+\setvalue{@interface@german@}{de}
+\setvalue{@interface@english@}{en}
+\setvalue{@interface@french@}{fr}
+\setvalue{@interface@italian@}{it}
+\setvalue{@interface@dutch@}{nl}
+\setvalue{@interface@persian@}{pe}
+\setvalue{@interface@romanian@}{ro}
+
+\def\userinterfacetag{\ifcsname @interface@\currentinterface @\endcsname\csname @interface@\currentinterface @\endcsname\else en\fi}
+\def\userresponsestag{\ifcsname @interface@\currentresponses @\endcsname\csname @interface@\currentresponses @\endcsname\else en\fi}
+
+% \input mult-\userinterfacetag \relax
+% \input mult-m\userresponsestag \relax
+
+\ctxlua{interfaces.setuserinterface("\userinterfacetag","\userresponsestag")}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mult-en.tex b/Master/texmf-dist/tex/context/base/mult-en.mkii
index 20917a034ce..a40f341c63d 100644
--- a/Master/texmf-dist/tex/context/base/mult-en.tex
+++ b/Master/texmf-dist/tex/context/base/mult-en.mkii
@@ -68,12 +68,14 @@
\setinterfacevariable{after}{after}
\setinterfacevariable{all}{all}
\setinterfacevariable{always}{always}
+\setinterfacevariable{and}{and}
\setinterfacevariable{answerarea}{answerarea}
\setinterfacevariable{appendices}{appendices}
\setinterfacevariable{appendix}{appendix}
\setinterfacevariable{april}{April}
\setinterfacevariable{atmargin}{atmargin}
\setinterfacevariable{atpage}{atpage}
+\setinterfacevariable{attachment}{attachment}
\setinterfacevariable{august}{August}
\setinterfacevariable{author}{author}
\setinterfacevariable{auto}{auto}
@@ -90,6 +92,7 @@
\setinterfacevariable{bib}{bib}
\setinterfacevariable{big}{big}
\setinterfacevariable{bigbodyfont}{bigbodyfont}
+\setinterfacevariable{bigger}{bigger}
\setinterfacevariable{bigpreference}{bigpreference}
\setinterfacevariable{blank}{blank}
\setinterfacevariable{blockquote}{blockquote}
@@ -124,6 +127,7 @@
\setinterfacevariable{content}{content}
\setinterfacevariable{contents}{contents}
\setinterfacevariable{continue}{continue}
+\setinterfacevariable{continued}{continued}
\setinterfacevariable{controls}{controls}
\setinterfacevariable{conversion}{conversion}
\setinterfacevariable{current}{current}
@@ -141,6 +145,7 @@
\setinterfacevariable{down}{down}
\setinterfacevariable{each}{each}
\setinterfacevariable{edge}{edge}
+\setinterfacevariable{embed}{embed}
\setinterfacevariable{empty}{empty}
\setinterfacevariable{end}{end}
\setinterfacevariable{endnote}{endnote}
@@ -364,6 +369,7 @@
\setinterfacevariable{random}{random}
\setinterfacevariable{readonly}{readonly}
\setinterfacevariable{rectangular}{rectangular}
+\setinterfacevariable{reference}{reference}
\setinterfacevariable{referral}{referral}
\setinterfacevariable{register}{register}
\setinterfacevariable{regular}{regular}
@@ -411,6 +417,7 @@
\setinterfacevariable{smallbolditalic}{smallbolditalic}
\setinterfacevariable{smallboldslanted}{smallboldslanted}
\setinterfacevariable{smallcaps}{smallcaps}
+\setinterfacevariable{smaller}{smaller}
\setinterfacevariable{smallitalic}{smallitalic}
\setinterfacevariable{smallitalicbold}{smallitalicbold}
\setinterfacevariable{smallnormal}{smallnormal}
@@ -519,6 +526,7 @@
\setinterfaceconstant{after}{after}
\setinterfaceconstant{afterhead}{afterhead}
\setinterfaceconstant{afterkey}{afterkey}
+\setinterfaceconstant{aftersection}{aftersection}
\setinterfaceconstant{align}{align}
\setinterfaceconstant{aligncharacter}{aligncharacter}
\setinterfaceconstant{alignmentcharacter}{alignmentcharacter}
@@ -538,6 +546,7 @@
\setinterfaceconstant{authoretallimit}{authoretallimit}
\setinterfaceconstant{authoretaltext}{authoretaltext}
\setinterfaceconstant{auto}{auto}
+\setinterfaceconstant{autocase}{autocase}
\setinterfaceconstant{autofile}{autofile}
\setinterfaceconstant{autofocus}{autofocus}
\setinterfaceconstant{autohang}{autohang}
@@ -551,10 +560,12 @@
\setinterfaceconstant{backgroundoffset}{backgroundoffset}
\setinterfaceconstant{backgroundradius}{backgroundradius}
\setinterfaceconstant{backgroundscreen}{backgroundscreen}
+\setinterfaceconstant{backreference}{backreference}
\setinterfaceconstant{backspace}{backspace}
\setinterfaceconstant{balance}{balance}
\setinterfaceconstant{before}{before}
\setinterfaceconstant{beforehead}{beforehead}
+\setinterfaceconstant{beforesection}{beforesection}
\setinterfaceconstant{bet}{bet}
\setinterfaceconstant{big}{big}
\setinterfaceconstant{blank}{blank}
@@ -569,8 +580,10 @@
\setinterfaceconstant{bottomoffset}{bottomoffset}
\setinterfaceconstant{bottomspace}{bottomspace}
\setinterfaceconstant{bottomstate}{bottomstate}
+\setinterfaceconstant{buffer}{buffer}
\setinterfaceconstant{cache}{cache}
\setinterfaceconstant{calculate}{calculate}
+\setinterfaceconstant{category}{category}
\setinterfaceconstant{ccommand}{ccommand}
\setinterfaceconstant{click}{click}
\setinterfaceconstant{clickin}{clickin}
@@ -578,6 +591,7 @@
\setinterfaceconstant{clipoffset}{clipoffset}
\setinterfaceconstant{closeaction}{closeaction}
\setinterfaceconstant{closecommand}{closecommand}
+\setinterfaceconstant{closepage}{closepage}
\setinterfaceconstant{closepageaction}{closepageaction}
\setinterfaceconstant{closesymbol}{closesymbol}
\setinterfaceconstant{color}{color}
@@ -629,6 +643,7 @@
\setinterfaceconstant{editoretallimit}{editoretallimit}
\setinterfaceconstant{editoretaltext}{editoretaltext}
\setinterfaceconstant{empty}{empty}
+\setinterfaceconstant{entries}{entries}
\setinterfaceconstant{equalheight}{equalheight}
\setinterfaceconstant{equalwidth}{equalwidth}
\setinterfaceconstant{escape}{escape}
@@ -653,6 +668,7 @@
\setinterfaceconstant{footer}{footer}
\setinterfaceconstant{footerdistance}{footerdistance}
\setinterfaceconstant{footerstate}{footerstate}
+\setinterfaceconstant{force}{force}
\setinterfaceconstant{foregroundcolor}{foregroundcolor}
\setinterfaceconstant{foregroundstyle}{foregroundstyle}
\setinterfaceconstant{format}{format}
@@ -699,11 +715,13 @@
\setinterfaceconstant{intent}{intent}
\setinterfaceconstant{interaction}{interaction}
\setinterfaceconstant{interlinespace}{interlinespace}
+\setinterfaceconstant{internalgrid}{internalgrid}
\setinterfaceconstant{itemalign}{itemalign}
\setinterfaceconstant{items}{items}
\setinterfaceconstant{juniorsep}{juniorsep}
\setinterfaceconstant{ken}{ken}
\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keys}{keys}
\setinterfaceconstant{keyword}{keyword}
\setinterfaceconstant{label}{label}
\setinterfaceconstant{lastnamesep}{lastnamesep}
@@ -746,6 +764,7 @@
\setinterfaceconstant{margintext}{margintext}
\setinterfaceconstant{marking}{marking}
\setinterfaceconstant{marstyle}{marstyle}
+\setinterfaceconstant{mask}{mask}
\setinterfaceconstant{max}{max}
\setinterfaceconstant{maxdepth}{maxdepth}
\setinterfaceconstant{maxheight}{maxheight}
@@ -799,6 +818,7 @@
\setinterfaceconstant{oddmargin}{oddmargin}
\setinterfaceconstant{offset}{offset}
\setinterfaceconstant{openaction}{openaction}
+\setinterfaceconstant{openpage}{openpage}
\setinterfaceconstant{openpageaction}{openpageaction}
\setinterfaceconstant{option}{option}
\setinterfaceconstant{order}{order}
@@ -851,6 +871,7 @@
\setinterfaceconstant{previous}{previous}
\setinterfaceconstant{previousnumber}{previousnumber}
\setinterfaceconstant{process}{process}
+\setinterfaceconstant{profile}{profile}
\setinterfaceconstant{pubsep}{pubsep}
\setinterfaceconstant{radius}{radius}
\setinterfaceconstant{random}{random}
@@ -944,6 +965,7 @@
\setinterfaceconstant{sub}{sub}
\setinterfaceconstant{subtitle}{subtitle}
\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{suffixseparator}{suffixseparator}
\setinterfaceconstant{surnamesep}{surnamesep}
\setinterfaceconstant{sx}{sx}
\setinterfaceconstant{sy}{sy}
@@ -969,6 +991,7 @@
\setinterfaceconstant{textstate}{textstate}
\setinterfaceconstant{textstyle}{textstyle}
\setinterfaceconstant{textwidth}{textwidth}
+\setinterfaceconstant{threshold}{threshold}
\setinterfaceconstant{title}{title}
\setinterfaceconstant{titlecolor}{titlecolor}
\setinterfaceconstant{titlecommand}{titlecommand}
@@ -991,6 +1014,7 @@
\setinterfaceconstant{urlalternative}{urlalternative}
\setinterfaceconstant{urlspace}{urlspace}
\setinterfaceconstant{validate}{validate}
+\setinterfaceconstant{values}{values}
\setinterfaceconstant{vcommand}{vcommand}
\setinterfaceconstant{veroffset}{veroffset}
\setinterfaceconstant{vfil}{vfil}
@@ -1045,7 +1069,6 @@
\setinterfacecommand{CAPPED}{CAP}
\setinterfacecommand{Character}{Character}
\setinterfacecommand{Characters}{Characters}
-\setinterfacecommand{LABELTEXT}{LABELTEXT}
\setinterfacecommand{MONTH}{MONTH}
\setinterfacecommand{Numbers}{Numbers}
\setinterfacecommand{Romannumerals}{Romannumerals}
@@ -1084,7 +1107,6 @@
\setinterfacecommand{colorbar}{colorbar}
\setinterfacecommand{colorvalue}{colorvalue}
\setinterfacecommand{column}{column}
-\setinterfacecommand{comment}{comment}
\setinterfacecommand{comparecolorgroup}{comparecolorgroup}
\setinterfacecommand{comparepalet}{comparepalet}
\setinterfacecommand{completepagenumber}{completepagenumber}
diff --git a/Master/texmf-dist/tex/context/base/mult-fr.tex b/Master/texmf-dist/tex/context/base/mult-fr.mkii
index 5244565e983..875d92bbcef 100644
--- a/Master/texmf-dist/tex/context/base/mult-fr.tex
+++ b/Master/texmf-dist/tex/context/base/mult-fr.mkii
@@ -68,13 +68,15 @@
\setinterfacevariable{after}{apres}
\setinterfacevariable{all}{tout}
\setinterfacevariable{always}{toujours}
+\setinterfacevariable{and}{and}
\setinterfacevariable{answerarea}{answerarea}
\setinterfacevariable{appendices}{annexes}
\setinterfacevariable{appendix}{annexe}
\setinterfacevariable{april}{avril}
\setinterfacevariable{atmargin}{alamarge}
\setinterfacevariable{atpage}{alapage}
-\setinterfacevariable{august}{aout}
+\setinterfacevariable{attachment}{attachment}
+\setinterfacevariable{august}{août}
\setinterfacevariable{author}{auteur}
\setinterfacevariable{auto}{auto}
\setinterfacevariable{autointro}{autointro}
@@ -90,6 +92,7 @@
\setinterfacevariable{bib}{bib}
\setinterfacevariable{big}{grand}
\setinterfacevariable{bigbodyfont}{grandepolicecorp}
+\setinterfacevariable{bigger}{bigger}
\setinterfacevariable{bigpreference}{grandepreference}
\setinterfacevariable{blank}{vide}
\setinterfacevariable{blockquote}{blockquote}
@@ -124,6 +127,7 @@
\setinterfacevariable{content}{contenu}
\setinterfacevariable{contents}{contenus}
\setinterfacevariable{continue}{continue}
+\setinterfacevariable{continued}{continued}
\setinterfacevariable{controls}{controles}
\setinterfacevariable{conversion}{conversion}
\setinterfacevariable{current}{courant}
@@ -141,6 +145,7 @@
\setinterfacevariable{down}{down}
\setinterfacevariable{each}{chaque}
\setinterfacevariable{edge}{bord}
+\setinterfacevariable{embed}{embed}
\setinterfacevariable{empty}{vide}
\setinterfacevariable{end}{end}
\setinterfacevariable{endnote}{notefin}
@@ -364,6 +369,7 @@
\setinterfacevariable{random}{aleatoire}
\setinterfacevariable{readonly}{lectureseule}
\setinterfacevariable{rectangular}{rectangulaire}
+\setinterfacevariable{reference}{reference}
\setinterfacevariable{referral}{referral}
\setinterfacevariable{register}{registre}
\setinterfacevariable{regular}{regulier}
@@ -411,6 +417,7 @@
\setinterfacevariable{smallbolditalic}{italiquegraspetit}
\setinterfacevariable{smallboldslanted}{inclinegraspetit}
\setinterfacevariable{smallcaps}{petitescapitales}
+\setinterfacevariable{smaller}{smaller}
\setinterfacevariable{smallitalic}{italiquepetit}
\setinterfacevariable{smallitalicbold}{grasitaliquepetit}
\setinterfacevariable{smallnormal}{normalpetit}
@@ -519,6 +526,7 @@
\setinterfaceconstant{after}{apres}
\setinterfaceconstant{afterhead}{aprestete}
\setinterfaceconstant{afterkey}{aprescle}
+\setinterfaceconstant{aftersection}{aftersection}
\setinterfaceconstant{align}{alignement}
\setinterfaceconstant{aligncharacter}{caracterealigne}
\setinterfaceconstant{alignmentcharacter}{alignementcaractere}
@@ -538,6 +546,7 @@
\setinterfaceconstant{authoretallimit}{authoretallimit}
\setinterfaceconstant{authoretaltext}{authoretaltext}
\setinterfaceconstant{auto}{auto}
+\setinterfaceconstant{autocase}{autocase}
\setinterfaceconstant{autofile}{autofile}
\setinterfaceconstant{autofocus}{autofocus}
\setinterfaceconstant{autohang}{autohang}
@@ -551,10 +560,12 @@
\setinterfaceconstant{backgroundoffset}{decalagearriereplan}
\setinterfaceconstant{backgroundradius}{rayonarriereplan}
\setinterfaceconstant{backgroundscreen}{ecranarriereplan}
+\setinterfaceconstant{backreference}{backreference}
\setinterfaceconstant{backspace}{retour}
\setinterfaceconstant{balance}{equilibre}
\setinterfaceconstant{before}{avant}
\setinterfaceconstant{beforehead}{avanttete}
+\setinterfaceconstant{beforesection}{beforesection}
\setinterfaceconstant{bet}{bet}
\setinterfaceconstant{big}{grand}
\setinterfaceconstant{blank}{vide}
@@ -569,8 +580,10 @@
\setinterfaceconstant{bottomoffset}{decalageinf}
\setinterfaceconstant{bottomspace}{espaceinf}
\setinterfaceconstant{bottomstate}{etatinf}
+\setinterfaceconstant{buffer}{buffer}
\setinterfaceconstant{cache}{cache}
\setinterfaceconstant{calculate}{calculer}
+\setinterfaceconstant{category}{category}
\setinterfaceconstant{ccommand}{ccommande}
\setinterfaceconstant{click}{clic}
\setinterfaceconstant{clickin}{clicinterieur}
@@ -578,6 +591,7 @@
\setinterfaceconstant{clipoffset}{clipoffset}
\setinterfaceconstant{closeaction}{actionfermeture}
\setinterfaceconstant{closecommand}{closecommand}
+\setinterfaceconstant{closepage}{closepage}
\setinterfaceconstant{closepageaction}{actionfermeturepage}
\setinterfaceconstant{closesymbol}{closesymbol}
\setinterfaceconstant{color}{couleur}
@@ -629,6 +643,7 @@
\setinterfaceconstant{editoretallimit}{editoretallimit}
\setinterfaceconstant{editoretaltext}{editoretaltext}
\setinterfaceconstant{empty}{vide}
+\setinterfaceconstant{entries}{entries}
\setinterfaceconstant{equalheight}{equalheight}
\setinterfaceconstant{equalwidth}{equalwidth}
\setinterfaceconstant{escape}{escape}
@@ -653,6 +668,7 @@
\setinterfaceconstant{footer}{pdp}
\setinterfaceconstant{footerdistance}{dsitancepdp}
\setinterfaceconstant{footerstate}{etatpdp}
+\setinterfaceconstant{force}{force}
\setinterfaceconstant{foregroundcolor}{couleurpremierplan}
\setinterfaceconstant{foregroundstyle}{stylepremierplan}
\setinterfaceconstant{format}{formatter}
@@ -699,11 +715,13 @@
\setinterfaceconstant{intent}{intent}
\setinterfaceconstant{interaction}{interaction}
\setinterfaceconstant{interlinespace}{espaceinterligne}
+\setinterfaceconstant{internalgrid}{internalgrid}
\setinterfaceconstant{itemalign}{itemalign}
\setinterfaceconstant{items}{elements}
\setinterfaceconstant{juniorsep}{juniorsep}
\setinterfaceconstant{ken}{ken}
\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keys}{keys}
\setinterfaceconstant{keyword}{motcle}
\setinterfaceconstant{label}{etiquette}
\setinterfaceconstant{lastnamesep}{lastnamesep}
@@ -746,6 +764,7 @@
\setinterfaceconstant{margintext}{textemarge}
\setinterfaceconstant{marking}{marquage}
\setinterfaceconstant{marstyle}{stylemarquage}
+\setinterfaceconstant{mask}{mask}
\setinterfaceconstant{max}{max}
\setinterfaceconstant{maxdepth}{maxdepth}
\setinterfaceconstant{maxheight}{hauteurmax}
@@ -799,6 +818,7 @@
\setinterfaceconstant{oddmargin}{margepaire}
\setinterfaceconstant{offset}{offset}
\setinterfaceconstant{openaction}{actionouverture}
+\setinterfaceconstant{openpage}{openpage}
\setinterfaceconstant{openpageaction}{actionouverturepage}
\setinterfaceconstant{option}{option}
\setinterfaceconstant{order}{order}
@@ -851,6 +871,7 @@
\setinterfaceconstant{previous}{precedent}
\setinterfaceconstant{previousnumber}{numeroprecedent}
\setinterfaceconstant{process}{process}
+\setinterfaceconstant{profile}{profile}
\setinterfaceconstant{pubsep}{pubsep}
\setinterfaceconstant{radius}{rayon}
\setinterfaceconstant{random}{aleatoire}
@@ -944,6 +965,7 @@
\setinterfaceconstant{sub}{sous}
\setinterfaceconstant{subtitle}{soustitre}
\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{suffixseparator}{suffixseparator}
\setinterfaceconstant{surnamesep}{surnamesep}
\setinterfaceconstant{sx}{sx}
\setinterfaceconstant{sy}{sy}
@@ -969,6 +991,7 @@
\setinterfaceconstant{textstate}{etattexte}
\setinterfaceconstant{textstyle}{styletexte}
\setinterfaceconstant{textwidth}{largeurtexte}
+\setinterfaceconstant{threshold}{threshold}
\setinterfaceconstant{title}{titre}
\setinterfaceconstant{titlecolor}{couleurtitre}
\setinterfaceconstant{titlecommand}{titlecommand}
@@ -991,6 +1014,7 @@
\setinterfaceconstant{urlalternative}{alternativeurl}
\setinterfaceconstant{urlspace}{espaceurl}
\setinterfaceconstant{validate}{valider}
+\setinterfaceconstant{values}{values}
\setinterfaceconstant{vcommand}{vcommande}
\setinterfaceconstant{veroffset}{veroffset}
\setinterfaceconstant{vfil}{vfil}
@@ -1045,7 +1069,6 @@
\setinterfacecommand{CAPPED}{CAP}
\setinterfacecommand{Character}{Caractere}
\setinterfacecommand{Characters}{Caracteres}
-\setinterfacecommand{LABELTEXT}{LABELTEXTE}
\setinterfacecommand{MONTH}{MOIS}
\setinterfacecommand{Numbers}{Numeros}
\setinterfacecommand{Romannumerals}{Chiffresromains}
@@ -1084,7 +1107,6 @@
\setinterfacecommand{colorbar}{barrecouleur}
\setinterfacecommand{colorvalue}{valeurcouleur}
\setinterfacecommand{column}{colonne}
-\setinterfacecommand{comment}{commentaire}
\setinterfacecommand{comparecolorgroup}{comparegroupecouleur}
\setinterfacecommand{comparepalet}{comparepalette}
\setinterfacecommand{completepagenumber}{completenumeropage}
diff --git a/Master/texmf-dist/tex/context/base/mult-fst.mkii b/Master/texmf-dist/tex/context/base/mult-fst.mkii
new file mode 100644
index 00000000000..e655e3d26d0
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mult-fst.mkii
@@ -0,0 +1,36 @@
+%D \module
+%D [ file=mult-fst,
+%D version=2006.08.16,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=Speed Up,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% And so, after a few years of keeping this potentially dangerous
+% speedup in cont-exp, we now move it to the kernel: the next
+% patch is 30\% faster on main interface (seconds) (9->7 sec on
+% 1 million calls). Another speed up is still under testing.
+
+\unprotect
+
+\startinterface english
+
+ \def\dosetvalue #1#2{\@EA\def \csname#1#2\endcsname}
+ \def\dosetevalue #1#2{\@EA\edef\csname#1#2\endcsname}
+ \def\dosetgvalue #1#2{\@EA\gdef\csname#1#2\endcsname}
+ \def\dosetxvalue #1#2{\@EA\gdef\csname#1#2\endcsname}
+ \def\docopyvalue#1#2#3{\@EA\def \csname#1#3\@EA\endcsname\@EA{\csname#2#3\endcsname}}
+
+ \def\setinterfaceconstant#1#2{\setvalue{\c!prefix!#1}{#1}}
+ \def\setinterfacevariable#1#2{\setvalue{\v!prefix!#1}{#2}}
+
+ \def\interfaced#1{#1}
+
+\stopinterface
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/mult-fst.tex b/Master/texmf-dist/tex/context/base/mult-fst.mkiv
index c237f574399..11558b557c6 100644
--- a/Master/texmf-dist/tex/context/base/mult-fst.tex
+++ b/Master/texmf-dist/tex/context/base/mult-fst.mkiv
@@ -26,25 +26,13 @@
\def\dosetxvalue #1#2{\@EA\gdef\csname#1#2\endcsname}
\def\docopyvalue#1#2#3{\@EA\def \csname#1#3\@EA\endcsname\@EA{\csname#2#3\endcsname}}
- \ifx\ctxlua\undefined
+ \def\setinterfaceconstant#1#2%
+ {\ctxlua{interfaces.setconstant("#1","#2")}%
+ \setvalue{\c!prefix!#1}{#1}}
- \def\setinterfaceconstant#1#2%
- {\setvalue{\c!prefix!#1}{#1}}
-
- \def\setinterfacevariable#1#2%
- {\setvalue{\v!prefix!#1}{#2}}
-
- \else
-
- \def\setinterfaceconstant#1#2%
- {\ctxlua{interfaces.setconstant("#1","#2")}%
- \setvalue{\c!prefix!#1}{#1}}
-
- \def\setinterfacevariable#1#2%
- {\ctxlua{interfaces.setvariable("#1","#2")}%
- \setvalue{\v!prefix!#1}{#2}}
-
- \fi
+ \def\setinterfacevariable#1#2%
+ {\ctxlua{interfaces.setvariable("#1","#2")}%
+ \setvalue{\v!prefix!#1}{#2}}
\def\interfaced#1{#1}
diff --git a/Master/texmf-dist/tex/context/base/mult-ini.lua b/Master/texmf-dist/tex/context/base/mult-ini.lua
index 92a7bc62965..4156e813d38 100644
--- a/Master/texmf-dist/tex/context/base/mult-ini.lua
+++ b/Master/texmf-dist/tex/context/base/mult-ini.lua
@@ -10,79 +10,232 @@ local format, gmatch, gsub = string.format, string.gmatch, string.gsub
local lpegmatch = lpeg.match
local serialize = table.serialize
-interfaces = interfaces or { }
-interfaces.messages = interfaces.messages or { }
-interfaces.constants = interfaces.constants or { }
-interfaces.variables = interfaces.variables or { }
+local allocate = utilities.storage.allocate
+local mark = utilities.storage.mark
+local texsprint = tex.sprint
+local setmetatableindex = table.setmetatableindex
-storage.register("interfaces/messages", interfaces.messages, "interfaces.messages" )
-storage.register("interfaces/constants", interfaces.constants, "interfaces.constants")
-storage.register("interfaces/variables", interfaces.variables, "interfaces.variables")
+local report_interface = logs.reporter("interface","initialization")
-local messages, constants, variables = interfaces.messages, interfaces.constants, interfaces.variables
+interfaces = interfaces or { }
+interfaces.constants = mark(interfaces.constants or { })
+interfaces.variables = mark(interfaces.variables or { })
+interfaces.elements = mark(interfaces.elements or { })
+interfaces.formats = mark(interfaces.formats or { })
+interfaces.translations = mark(interfaces.translations or { })
+
+storage.register("interfaces/constants", interfaces.constants, "interfaces.constants")
+storage.register("interfaces/variables", interfaces.variables, "interfaces.variables")
+storage.register("interfaces/elements", interfaces.elements, "interfaces.elements")
+storage.register("interfaces/formats", interfaces.formats, "interfaces.formats")
+storage.register("interfaces/translations", interfaces.translations, "interfaces.translations")
+
+interfaces.interfaces = {
+ "cs", "de", "en", "fr", "it", "nl", "ro", "pe",
+}
+
+storage.shared.currentinterface = storage.shared.currentinterface or "en"
+storage.shared.currentresponse = storage.shared.currentresponse or "en"
+
+local currentinterface = storage.shared.currentinterface
+local currentresponse = storage.shared.currentresponse
+
+local complete = allocate()
+interfaces.complete = complete
+
+local function resolve(t,k) -- one access needed to get loaded
+ report_interface("loading interface definitions from 'mult-def.lua'")
+ complete = dofile(resolvers.findfile("mult-def.lua"))
+ report_interface("loading interface messages from 'mult-mes.lua'")
+ complete.messages = dofile(resolvers.findfile("mult-mes.lua"))
+ interfaces.complete = complete
+ return rawget(complete,k)
+end
+
+setmetatableindex(complete, resolve)
+
+local constants = interfaces.constants
+local variables = interfaces.variables
+local elements = interfaces.elements
+local formats = interfaces.formats
+local translations = interfaces.translations
+local reporters = { } -- just an optimization
+
+local function valueiskey(t,k) -- will be helper
+ t[k] = k
+ return k
+end
+
+setmetatableindex(variables, valueiskey)
+setmetatableindex(constants, valueiskey)
+setmetatableindex(elements, valueiskey)
+setmetatableindex(formats, valueiskey)
+setmetatableindex(translations, valueiskey)
+
+local function resolve(t,k)
+ local v = logs.reporter(k)
+ t[k] = v
+ return v
+end
+
+setmetatableindex(reporters, resolve)
+
+for category, _ in next, translations do
+ -- We pre-create reporters for already defined messages
+ -- because otherwise listing is incomplete and we want
+ -- to use that for checking so delaying makes not much
+ -- sense there.
+ local r = reporters[category]
+end
+
+-- adding messages
+
+local function add(target,tag,values)
+ local t = target[tag]
+ if not f then
+ target[tag] = values
+ else
+ for k, v in next, values do
+ if f[k] then
+ -- error
+ else
+ f[k] = v
+ end
+ end
+ end
+end
+
+function interfaces.settranslation(tag,values)
+ add(translations,tag,values)
+end
+
+function interfaces.setformat(tag,values)
+ add(formats,tag,values)
+end
+
+-- the old method:
+
+local function fulltag(category,tag)
+ tag = gsub(tag,"%-%-","%%s")
+ return format("%s:%s",category,tag)
+end
function interfaces.setmessages(category,str)
- local m = messages[category] or { }
- for k, v in gmatch(str,"(%S+) *: *(.-) *[\n\r]") do
- m[k] = gsub(v,"%-%-","%%s")
+ for tag, message in gmatch(str,"(%S+) *: *(.-) *[\n\r]") do
+ if tag == "title" then
+ translations[tag] = translations[tag] or tag
+ else
+ formats[fulltag(category,tag)] = gsub(message,"%-%-","%%s")
+ end
end
- messages[category] = m
end
function interfaces.setmessage(category,tag,message)
- local m = messages[category]
- if not m then
- m = { }
- messages[category] = m
- end
- m[tag] = gsub(message,"%-%-","%%s")
+ formats[fulltag(category,tag)] = gsub(message,"%-%-","%%s")
end
function interfaces.getmessage(category,tag,default)
- local m = messages[category]
- return (m and m[tag]) or default or "unknown message"
+ return formats[fulltag(category,tag)] or default or "unknown message"
end
function interfaces.doifelsemessage(category,tag)
- local m = messages[category]
- return commands.testcase(m and m[tag])
+ return commands.testcase(formats[fulltag(category,tag)])
end
-local messagesplitter = lpeg.splitat(",")
+local splitter = lpeg.splitat(",")
-function interfaces.makemessage(category,tag,arguments)
- local m = messages[category]
- m = (m and (m[tag] or m[tostring(tag)])) or format("unknown message, category '%s', tag '%s'",category,tag)
- if not m then
- return m .. " " .. tag
- elseif not arguments then
- return m
+function interfaces.showmessage(category,tag,arguments)
+ local r = reporters[category]
+ local f = formats[fulltag(category,tag)]
+ if type(arguments) == "string" and #arguments > 0 then
+ r(f,lpegmatch(splitter,arguments))
+ elseif arguments then
+ r(f,arguments)
else
- return format(m,lpegmatch(messagesplitter,arguments))
+ r(f)
end
end
-function interfaces.showmessage(category,tag,arguments)
- local m = messages[category]
- commands.writestatus((m and m.title) or "unknown title",interfaces.makemessage(category,tag,arguments))
-end
+-- till here
function interfaces.setvariable(variable,given)
---~ variables[given] = variable
- variables[variable] = given
+ variables[given] = variable
end
function interfaces.setconstant(constant,given)
constants[given] = constant
end
--- it's nicer to have numbers as reference than a hash
+function interfaces.setelement(element,given)
+ elements[given] = element
+end
+
+-- the real thing:
+
+logs.setmessenger(context.verbatim.ctxreport)
+
+-- status
+
+function commands.writestatus(category,message)
+ local r = reporters[category]
+ r(message)
+end
+
+-- initialization
+
+function interfaces.setuserinterface(interface,response)
+ storage.shared.currentinterface, currentinterface = interface, interface
+ storage.shared.currentresponse, currentresponse = response, response
+ if environment.initex then
+ local nofconstants = 0
+ for given, constant in next, complete.constants do
+ constant = constant[interface] or constant.en or given
+ constants[constant] = given -- breedte -> width
+ texsprint("\\do@sicon{",given,"}{",constant,"}")
+ nofconstants = nofconstants + 1
+ end
+ local nofvariables = 0
+ for given, variable in next, complete.variables do
+ variable = variable[interface] or variable.en or given
+ variables[given] = variable -- ja -> yes
+ texsprint("\\do@sivar{",given,"}{",variable,"}")
+ nofvariables = nofvariables + 1
+ end
+ local nofelements = 0
+ for given, element in next, complete.elements do
+ element = element[interface] or element.en or given
+ elements[element] = given
+ texsprint("\\do@siele{",given,"}{",element,"}")
+ nofelements = nofelements + 1
+ end
+ local nofcommands = 0
+ for given, command in next, complete.commands do
+ command = command[interface] or command.en or given
+ if command ~= given then
+ texsprint("\\do@sicom{",given,"}{",command,"}")
+ end
+ nofcommands = nofcommands + 1
+ end
+ local nofformats = 0
+ for given, format in next, complete.messages.formats do
+ formats[given] = format[interface] or format.en or given
+ nofformats = nofformats + 1
+ end
+ local noftranslations = 0
+ for given, translation in next, complete.messages.translations do
+ translations[given] = translation[interface] or translation.en or given
+ noftranslations = noftranslations + 1
+ end
+ report_interface("definitions: %s constants, %s variables, %s elements, %s commands, % formats, %s translations",
+ nofconstants,nofvariables,nofelements,nofcommands,nofformats,noftranslations)
+ end
+end
interfaces.cachedsetups = interfaces.cachedsetups or { }
interfaces.hashedsetups = interfaces.hashedsetups or { }
-storage.register("interfaces.cachedsetups", interfaces.cachedsetups, "interfaces.cachedsetups")
-storage.register("interfaces.hashedsetups", interfaces.hashedsetups, "interfaces.hashedsetups")
+storage.register("interfaces/cachedsetups", interfaces.cachedsetups, "interfaces.cachedsetups")
+storage.register("interfaces/hashedsetups", interfaces.hashedsetups, "interfaces.hashedsetups")
local cachedsetups = interfaces.cachedsetups
local hashedsetups = interfaces.hashedsetups
@@ -101,5 +254,10 @@ function interfaces.cachesetup(t)
end
function interfaces.is_command(str)
- return (str and str ~= "" and token.csname_name(token.create(str)) ~= "") or false
+ return (str and str ~= "" and token.csname_name(token.create(str)) ~= "") or false -- there will be a proper function for this
+end
+
+function interfaces.interfacedcommand(name)
+ local command = complete.commands[name]
+ return command and command[currentinterface] or name
end
diff --git a/Master/texmf-dist/tex/context/base/mult-ini.mkiv b/Master/texmf-dist/tex/context/base/mult-ini.mkiv
index e20548f9b5f..afddf692e94 100644
--- a/Master/texmf-dist/tex/context/base/mult-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/mult-ini.mkiv
@@ -44,7 +44,7 @@
%D \NC \type{\f!prefix!} \NC f! \NC file \NC\MR
%D \NC \type{\k!prefix!} \NC k! \NC constant (indirect) \NC\MR
%D \NC \type{\l!prefix!} \NC l! \NC language \NC\MR
-%D \NC \type{\m!prefix!} \NC m! \NC message \NC\MR
+%D \NC \type{\m!prefix!} \NC m! \NC age \NC\MR
%D \NC \type{\p!prefix!} \NC p! \NC procedure \NC\MR
%D \NC \type{\r!prefix!} \NC r! \NC reference \NC\MR
%D \NC \type{\s!prefix!} \NC s! \NC system \NC\MR
@@ -358,10 +358,12 @@
%D which puts the message text asked for in \type
%D {\currentmessagetext}.
+%D These will become obsolete:
+
\unexpanded\def\startmessages #1 library: #2 %
{\bgroup
\ifcsname\m!prefix!#2\endcsname\else\setgvalue{\m!prefix!#2}{#2}\fi
- \catcode13=\active
+ \catcode13=\activecatcode
\doifinsetelse{#1}{\currentresponses,all}\dostartmessages\nostartmessages{#2}}
\def\dostartmessages#1#2\stopmessages
@@ -375,12 +377,14 @@
{\ifcsname\m!prefix!#1\endcsname\else\setgvalue{\m!prefix!#1}{#1}\fi
\ctxlua{interfaces.setmessage("#1","#2",\!!bs#3\!!es)}}
-\unexpanded\def\setmessagetext #1#2{\edef\currentmessagetext{\ctxlua{tex.sprint(tex.ctxcatcodes,interfaces.getmessage("#1","#2"))}}}
+\unexpanded\def\setmessagetext #1#2{\edef\currentmessagetext{\ctxsprint{interfaces.getmessage("#1","#2")}}}
+\unexpanded\def\getmessage #1#2{\ctxsprint{interfaces.getmessage("#1","#2")}}
+
+%D Till here.
+
\unexpanded\def\doifelsemessage #1#2{\ctxlua{interfaces.doifelsemessage("#1","#2")}}
-\unexpanded\def\getmessage #1#2{\ctxlua{tex.sprint(tex.ctxcatcodes,interfaces.getmessage("#1","#2"))}}
-\unexpanded\def\getmessagedefault#1#2#3{\ctxlua{tex.sprint(tex.ctxcatcodes,interfaces.getmessage("#1","#2","#3"))}}
-\unexpanded\def\makemessage #1#2#3{\ctxlua{tex.sprint(tex.ctxcatcodes,interfaces.makemessage("#1","#2","#3"))}}
-\unexpanded\def\showmessage #1#2#3{\ctxlua{interfaces.showmessage("#1","#2","#3")}}
+\unexpanded\def\showmessage #1#2#3{\ctxlua{interfaces.showmessage("#1","#2",\!!bs#3\!!es)}}
+\unexpanded\def\writestatus #1#2{\ctxcommand{writestatus("#1",\!!bs#2\!!es)}}
%D \macros
%D {ifshowwarnings, ifshowmessages}
@@ -431,62 +435,15 @@
%D interface. (We no longer need the link back to the main
%D internal interface.)
-\def\doresetvalue#1#2%
- {\dosetvalue{#1}{#2}{}}
+\def\doresetvalue #1#2{\dosetvalue{#1}{#2}{}}
+\def\doignorevalue#1#2#3{\dosetvalue{#1}{#2}{}}
-\def\doignorevalue#1#2#3%
- {\dosetvalue{#1}{#2}{}}
-
-\def\dosetvalue#1#2%
- {\let\c!internal!\c!internal!n
- \ifcsname\k!prefix!#2\endcsname
- \let\c!internal!\c!internal!y
- \@EA\def\csname#1\csname\k!prefix!#2\endcsname%\endcsname
- \else
- \let\c!internal!\c!internal!y
- \@EA\def\csname#1#2%\endcsname
- \fi\endcsname}
-
-\def\dosetevalue#1#2%
- {\let\c!internal!\c!internal!n
- \ifcsname\k!prefix!#2\endcsname
- \let\c!internal!\c!internal!y
- \@EA\edef\csname#1\csname\k!prefix!#2\endcsname%\endcsname
- \else
- \let\c!internal!\c!internal!y
- \@EA\edef\csname#1#2%\endcsname
- \fi\endcsname}
-
-\def\dosetgvalue#1#2%
- {\let\c!internal!\c!internal!n
- \ifcsname\k!prefix!#2\endcsname
- \let\c!internal!\c!internal!y
- \@EA\gdef\csname#1\csname\k!prefix!#2\endcsname%\endcsname
- \else
- \let\c!internal!\c!internal!y
- \@EA\gdef\csname#1#2%\endcsname
- \fi\endcsname}
-
-\def\dosetxvalue#1#2%
- {\let\c!internal!\c!internal!n
- \ifcsname\k!prefix!#2\endcsname
- \let\c!internal!\c!internal!y
- \@EA\xdef\csname#1\csname\k!prefix!#2\endcsname%\endcsname
- \else
- \let\c!internal!\c!internal!y
- \@EA\xdef\csname#1#2%\endcsname
- \fi\endcsname}
-
-\def\docopyvalue#1#2#3% real tricky expansion, quite unreadable
- {\let\c!internal!\c!internal!n
- \ifcsname\k!prefix!#3\endcsname
- \let\c!internal!\c!internal!y
- \@EA\def\csname#1\csname\k!prefix!#3\endcsname
- \@EA\endcsname\@EA{\csname#2\csname\k!prefix!#3\endcsname\endcsname}%
- \else
- \let\c!internal!\c!internal!y
- \@EA\def\csname#1#3\@EA\endcsname\@EA{\csname#2#3\endcsname}%
- \fi}
+\def\doletvalue #1#2{\@EA \let\csname#1#2\endcsname}
+\def\dosetvalue #1#2{\@EA \def\csname#1#2\endcsname}
+\def\dosetevalue #1#2{\@EA\edef\csname#1#2\endcsname}
+\def\dosetgvalue #1#2{\@EA\gdef\csname#1#2\endcsname}
+\def\dosetxvalue #1#2{\@EA\xdef\csname#1#2\endcsname}
+\def\docopyvalue#1#2#3{\@EA \def\csname#1#3\@EA\endcsname\@EA{\csname#2#3\endcsname}}
%D We can now redefine some messages that will be
%D introduced in the multi||lingual system module.
@@ -744,22 +701,16 @@
%D user constants (keywords) become system variables
%D \stopnarrower
-%D Anno 2003 I've forgotten why the \type {\c!internal} is
-%D still in there; it's probably a left over from the time that
+%D The \type {\c!internal} is a left over from the time that
%D the user interface documents were not using a specification
%D alongside a keyword specification but used a shared file in
%D which case we need to go in both directions.
-\let\c!internal!y \string
-\def\c!internal!n {-}
-\let\c!internal! \c!internal!y
-
% temporary mkiv hack (we can best just store the whole table in memory)
\def\setinterfaceconstant#1#2%
{\ctxlua{interfaces.setconstant("#1","#2")}%
- \setvalue{\c!prefix!#1}{\c!internal!#1}%
- \setvalue{\k!prefix!#2}{#1}}
+ \setvalue{\c!prefix!#1}{#1}}
\def\setinterfacevariable#1#2%
{\ctxlua{interfaces.setvariable("#1","#2")}%
@@ -791,7 +742,8 @@
%D part is needed, we use a \type{-}:
\def\setinterfaceelement#1#2%
- {\ifcsname\e!prefix!#1\endcsname
+ {\ctxlua{interfaces.setelement("#1","#2")}%
+ \ifcsname\e!prefix!#1\endcsname
\doifnotvalue{\e!prefix!#1}{#2}{\setvalue{\e!prefix!#1}{#2}}%
\else
\setvalue{\e!prefix!#1}{#2}%
@@ -807,6 +759,13 @@
\unexpanded\def\startelements {\gobbleuntil\stopelements}
\unexpanded\def\startcommands {\gobbleuntil\stopcommands}
+%D For at the \LUA\ end (experiment):
+
+\def\do@sicon#1#2{\@EA\gdef\csname\c!prefix!#1\endcsname{#1}}
+\def\do@sivar#1#2{\@EA\gdef\csname\v!prefix!#1\endcsname{#2}}
+\def\do@siele#1#2{\@EA\gdef\csname\e!prefix!#1\endcsname{#2}}
+\def\do@sicom#1#2{\@EA\gdef\csname#2\@EA\endcsname\@EA{\csname#1\endcsname}}
+
%D \macros
%D {interfaced}
%D
@@ -833,7 +792,8 @@
%D macro's can be enhanced with more testing facilities, but
%D for the moment they suffice.
-%D Out of convenience we define the banners here.
+%D Out of convenience we define the banners here. This might move
+%D to the Lua end.
\def\contextbanner
{ConTeXt \space
diff --git a/Master/texmf-dist/tex/context/base/mult-it.tex b/Master/texmf-dist/tex/context/base/mult-it.mkii
index ce14800de04..3823e651c08 100644
--- a/Master/texmf-dist/tex/context/base/mult-it.tex
+++ b/Master/texmf-dist/tex/context/base/mult-it.mkii
@@ -68,12 +68,14 @@
\setinterfacevariable{after}{dopo}
\setinterfacevariable{all}{tutti}
\setinterfacevariable{always}{sempre}
+\setinterfacevariable{and}{and}
\setinterfacevariable{answerarea}{answerarea}
\setinterfacevariable{appendices}{appendici}
\setinterfacevariable{appendix}{appendice}
\setinterfacevariable{april}{aprile}
\setinterfacevariable{atmargin}{almargine}
\setinterfacevariable{atpage}{apagina}
+\setinterfacevariable{attachment}{attachment}
\setinterfacevariable{august}{agosto}
\setinterfacevariable{author}{autore}
\setinterfacevariable{auto}{auto}
@@ -90,6 +92,7 @@
\setinterfacevariable{bib}{bib}
\setinterfacevariable{big}{grande}
\setinterfacevariable{bigbodyfont}{grossofontdeltesto}
+\setinterfacevariable{bigger}{bigger}
\setinterfacevariable{bigpreference}{grandepreferenza}
\setinterfacevariable{blank}{rigovuoto}
\setinterfacevariable{blockquote}{blockquote}
@@ -124,6 +127,7 @@
\setinterfacevariable{content}{indice}
\setinterfacevariable{contents}{indici}
\setinterfacevariable{continue}{continua}
+\setinterfacevariable{continued}{continued}
\setinterfacevariable{controls}{controlli}
\setinterfacevariable{conversion}{coversione}
\setinterfacevariable{current}{corrente}
@@ -141,6 +145,7 @@
\setinterfacevariable{down}{down}
\setinterfacevariable{each}{ogni}
\setinterfacevariable{edge}{bordo}
+\setinterfacevariable{embed}{embed}
\setinterfacevariable{empty}{vuoto}
\setinterfacevariable{end}{end}
\setinterfacevariable{endnote}{endnote}
@@ -364,6 +369,7 @@
\setinterfacevariable{random}{casuale}
\setinterfacevariable{readonly}{solalettura}
\setinterfacevariable{rectangular}{rettangolare}
+\setinterfacevariable{reference}{riferimento}
\setinterfacevariable{referral}{referral}
\setinterfacevariable{register}{registro}
\setinterfacevariable{regular}{regolare}
@@ -411,6 +417,7 @@
\setinterfacevariable{smallbolditalic}{piccolograssettocorsivo}
\setinterfacevariable{smallboldslanted}{piccolograssettoinclinato}
\setinterfacevariable{smallcaps}{maiuscoletto}
+\setinterfacevariable{smaller}{smaller}
\setinterfacevariable{smallitalic}{piccolocorsivo}
\setinterfacevariable{smallitalicbold}{piccolocorsivograssetto}
\setinterfacevariable{smallnormal}{piccolonormale}
@@ -519,6 +526,7 @@
\setinterfaceconstant{after}{dopo}
\setinterfaceconstant{afterhead}{dopotesta}
\setinterfaceconstant{afterkey}{dopotasto}
+\setinterfaceconstant{aftersection}{aftersection}
\setinterfaceconstant{align}{allinea}
\setinterfaceconstant{aligncharacter}{allineacarattere}
\setinterfaceconstant{alignmentcharacter}{carattereallineamento}
@@ -538,6 +546,7 @@
\setinterfaceconstant{authoretallimit}{authoretallimit}
\setinterfaceconstant{authoretaltext}{authoretaltext}
\setinterfaceconstant{auto}{auto}
+\setinterfaceconstant{autocase}{autocase}
\setinterfaceconstant{autofile}{autofile}
\setinterfaceconstant{autofocus}{autofocus}
\setinterfaceconstant{autohang}{autohang}
@@ -551,10 +560,12 @@
\setinterfaceconstant{backgroundoffset}{offsetsfondo}
\setinterfaceconstant{backgroundradius}{raggiosfondo}
\setinterfaceconstant{backgroundscreen}{schermosfondo}
+\setinterfaceconstant{backreference}{backreference}
\setinterfaceconstant{backspace}{backspace}
\setinterfaceconstant{balance}{bilanciamento}
\setinterfaceconstant{before}{prima}
\setinterfaceconstant{beforehead}{primaditesta}
+\setinterfaceconstant{beforesection}{beforesection}
\setinterfaceconstant{bet}{bet}
\setinterfaceconstant{big}{grande}
\setinterfaceconstant{blank}{rigovuoto}
@@ -569,8 +580,10 @@
\setinterfaceconstant{bottomoffset}{offsetfondo}
\setinterfaceconstant{bottomspace}{spaziofondo}
\setinterfaceconstant{bottomstate}{statofondo}
+\setinterfaceconstant{buffer}{buffer}
\setinterfaceconstant{cache}{cache}
\setinterfaceconstant{calculate}{calcola}
+\setinterfaceconstant{category}{category}
\setinterfaceconstant{ccommand}{ccomando}
\setinterfaceconstant{click}{click}
\setinterfaceconstant{clickin}{clickdentro}
@@ -578,6 +591,7 @@
\setinterfaceconstant{clipoffset}{clipoffset}
\setinterfaceconstant{closeaction}{azionechiudi}
\setinterfaceconstant{closecommand}{closecommand}
+\setinterfaceconstant{closepage}{closepage}
\setinterfaceconstant{closepageaction}{azionechiudipagina}
\setinterfaceconstant{closesymbol}{closesymbol}
\setinterfaceconstant{color}{colore}
@@ -629,6 +643,7 @@
\setinterfaceconstant{editoretallimit}{editoretallimit}
\setinterfaceconstant{editoretaltext}{editoretaltext}
\setinterfaceconstant{empty}{vuoto}
+\setinterfaceconstant{entries}{entries}
\setinterfaceconstant{equalheight}{equalheight}
\setinterfaceconstant{equalwidth}{equalwidth}
\setinterfaceconstant{escape}{escape}
@@ -653,6 +668,7 @@
\setinterfaceconstant{footer}{piedipagina}
\setinterfaceconstant{footerdistance}{distanzapdp}
\setinterfaceconstant{footerstate}{statopdp}
+\setinterfaceconstant{force}{forza}
\setinterfaceconstant{foregroundcolor}{coloreprimopiano}
\setinterfaceconstant{foregroundstyle}{foregroundstyle}
\setinterfaceconstant{format}{format}
@@ -699,11 +715,13 @@
\setinterfaceconstant{intent}{intent}
\setinterfaceconstant{interaction}{interazione}
\setinterfaceconstant{interlinespace}{interlinea}
+\setinterfaceconstant{internalgrid}{internalgrid}
\setinterfaceconstant{itemalign}{itemalign}
\setinterfaceconstant{items}{elementi}
\setinterfaceconstant{juniorsep}{juniorsep}
\setinterfaceconstant{ken}{ken}
\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keys}{keys}
\setinterfaceconstant{keyword}{parolachiave}
\setinterfaceconstant{label}{etichetta}
\setinterfaceconstant{lastnamesep}{lastnamesep}
@@ -746,6 +764,7 @@
\setinterfaceconstant{margintext}{testomargine}
\setinterfaceconstant{marking}{marcatura}
\setinterfaceconstant{marstyle}{stilemarcatura}
+\setinterfaceconstant{mask}{mask}
\setinterfaceconstant{max}{max}
\setinterfaceconstant{maxdepth}{maxdepth}
\setinterfaceconstant{maxheight}{altezzamax}
@@ -799,6 +818,7 @@
\setinterfaceconstant{oddmargin}{marginedispari}
\setinterfaceconstant{offset}{offset}
\setinterfaceconstant{openaction}{azioneapri}
+\setinterfaceconstant{openpage}{openpage}
\setinterfaceconstant{openpageaction}{azioneapripagina}
\setinterfaceconstant{option}{opzione}
\setinterfaceconstant{order}{order}
@@ -851,6 +871,7 @@
\setinterfaceconstant{previous}{precedente}
\setinterfaceconstant{previousnumber}{numeroprecedente}
\setinterfaceconstant{process}{process}
+\setinterfaceconstant{profile}{profile}
\setinterfaceconstant{pubsep}{pubsep}
\setinterfaceconstant{radius}{raggio}
\setinterfaceconstant{random}{casuale}
@@ -944,6 +965,7 @@
\setinterfaceconstant{sub}{sotto}
\setinterfaceconstant{subtitle}{sottotitolo}
\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{suffixseparator}{suffixseparator}
\setinterfaceconstant{surnamesep}{surnamesep}
\setinterfaceconstant{sx}{sx}
\setinterfaceconstant{sy}{sy}
@@ -969,6 +991,7 @@
\setinterfaceconstant{textstate}{statotesto}
\setinterfaceconstant{textstyle}{stiletesto}
\setinterfaceconstant{textwidth}{ampiezzatesto}
+\setinterfaceconstant{threshold}{threshold}
\setinterfaceconstant{title}{titolo}
\setinterfaceconstant{titlecolor}{coloretitolo}
\setinterfaceconstant{titlecommand}{titlecommand}
@@ -991,6 +1014,7 @@
\setinterfaceconstant{urlalternative}{alternativaurl}
\setinterfaceconstant{urlspace}{spaziourl}
\setinterfaceconstant{validate}{verifica}
+\setinterfaceconstant{values}{values}
\setinterfaceconstant{vcommand}{vcomando}
\setinterfaceconstant{veroffset}{veroffset}
\setinterfaceconstant{vfil}{vfil}
@@ -1045,7 +1069,6 @@
\setinterfacecommand{CAPPED}{CAP}
\setinterfacecommand{Character}{Lettera}
\setinterfacecommand{Characters}{Lettere}
-\setinterfacecommand{LABELTEXT}{TESTOETICHETTA}
\setinterfacecommand{MONTH}{MESE}
\setinterfacecommand{Numbers}{Numeri}
\setinterfacecommand{Romannumerals}{Numeriromani}
@@ -1084,7 +1107,6 @@
\setinterfacecommand{colorbar}{barracolori}
\setinterfacecommand{colorvalue}{valorecolore}
\setinterfacecommand{column}{colonna}
-\setinterfacecommand{comment}{commento}
\setinterfacecommand{comparecolorgroup}{confrontagruppocolori}
\setinterfacecommand{comparepalet}{confrontatavolozza}
\setinterfacecommand{completepagenumber}{numeropaginacompleto}
diff --git a/Master/texmf-dist/tex/context/base/mult-mcs.tex b/Master/texmf-dist/tex/context/base/mult-mcs.mkii
index 98c392c9fc9..c733798e642 100644
--- a/Master/texmf-dist/tex/context/base/mult-mcs.tex
+++ b/Master/texmf-dist/tex/context/base/mult-mcs.mkii
@@ -1,8 +1,10 @@
\setinterfacemessage{references}{1}{neznama reference --}
+\setinterfacemessage{references}{30}{neznamy objekt --}
\setinterfacemessage{references}{3}{neznamy typ reference --}
\setinterfacemessage{references}{2}{duplicitni reference -- na strane --}
+\setinterfacemessage{references}{5}{number of unknown references: --}
\setinterfacemessage{references}{4}{nedovolena reference --}
-\setinterfacemessage{references}{30}{neznamy objekt --}
+\setinterfacemessage{references}{6}{number of illegal references: --}
\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
\setinterfacemessage{references}{24}{references from document '--' are not exported}
\setinterfacemessage{references}{title}{reference}
@@ -86,7 +88,7 @@
\setinterfacemessage{linguals}{9}{language -- is active}
\setinterfacemessage{linguals}{8}{specificke volby jazyka [--] bez mezer pripojeny}
\setinterfacemessage{linguals}{title}{jazyky}
-\setinterfacemessage{linguals}{10}{vzory --nacteny}
+\setinterfacemessage{linguals}{10}{vzory -- nacteny}
\setinterfacemessage{verbatims}{1}{soubor -- neexistuje}
\setinterfacemessage{verbatims}{title}{verbatim}
\setinterfacemessage{filters}{1}{filter -- is loaded}
diff --git a/Master/texmf-dist/tex/context/base/mult-mde.tex b/Master/texmf-dist/tex/context/base/mult-mde.mkii
index 4da89ba333b..4d7f009e482 100644
--- a/Master/texmf-dist/tex/context/base/mult-mde.tex
+++ b/Master/texmf-dist/tex/context/base/mult-mde.mkii
@@ -1,8 +1,10 @@
\setinterfacemessage{references}{1}{unbekannte Referenz --}
+\setinterfacemessage{references}{30}{unbekanntes Object --}
\setinterfacemessage{references}{3}{unbekannte Referenz Typ --}
\setinterfacemessage{references}{2}{doppelte Referenz -- auf Seite --}
+\setinterfacemessage{references}{5}{number of unknown references: --}
\setinterfacemessage{references}{4}{illegale Referenz --}
-\setinterfacemessage{references}{30}{unbekanntes Object --}
+\setinterfacemessage{references}{6}{number of illegal references: --}
\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
\setinterfacemessage{references}{24}{references from document '--' are not exported}
\setinterfacemessage{references}{title}{referenzen}
@@ -86,7 +88,7 @@
\setinterfacemessage{linguals}{9}{Sprache -- ist aktiv}
\setinterfacemessage{linguals}{8}{Sprachenspezifische Option [--] nahtlos hinzugefuegt}
\setinterfacemessage{linguals}{title}{Sprache}
-\setinterfacemessage{linguals}{10}{Trennmuster --geladen}
+\setinterfacemessage{linguals}{10}{Trennmuster -- geladen}
\setinterfacemessage{verbatims}{1}{Datei -- existiert nicht}
\setinterfacemessage{verbatims}{title}{verbatim}
\setinterfacemessage{filters}{1}{filter -- ist geladen}
diff --git a/Master/texmf-dist/tex/context/base/mult-men.tex b/Master/texmf-dist/tex/context/base/mult-men.mkii
index 4c1bc99420a..a8d42935602 100644
--- a/Master/texmf-dist/tex/context/base/mult-men.tex
+++ b/Master/texmf-dist/tex/context/base/mult-men.mkii
@@ -1,8 +1,10 @@
\setinterfacemessage{references}{1}{unknown reference --}
+\setinterfacemessage{references}{30}{unknown object --}
\setinterfacemessage{references}{3}{unknown reference type --}
\setinterfacemessage{references}{2}{duplicate reference -- on page --}
+\setinterfacemessage{references}{5}{number of unknown references: --}
\setinterfacemessage{references}{4}{illegal reference --}
-\setinterfacemessage{references}{30}{unknown object --}
+\setinterfacemessage{references}{6}{number of illegal references: --}
\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
\setinterfacemessage{references}{24}{references from document '--' are not exported}
\setinterfacemessage{references}{title}{references}
@@ -86,7 +88,7 @@
\setinterfacemessage{linguals}{9}{language -- is active}
\setinterfacemessage{linguals}{8}{language specific options [--] seamless appended}
\setinterfacemessage{linguals}{title}{language}
-\setinterfacemessage{linguals}{10}{patterns --loaded}
+\setinterfacemessage{linguals}{10}{patterns -- loaded}
\setinterfacemessage{verbatims}{1}{file -- does not exist}
\setinterfacemessage{verbatims}{title}{verbatim}
\setinterfacemessage{filters}{1}{filter -- is loaded}
diff --git a/Master/texmf-dist/tex/context/base/mult-mes.lua b/Master/texmf-dist/tex/context/base/mult-mes.lua
index 5c812971136..cdd6d5ad21a 100644
--- a/Master/texmf-dist/tex/context/base/mult-mes.lua
+++ b/Master/texmf-dist/tex/context/base/mult-mes.lua
@@ -6,2041 +6,1752 @@ if not modules then modules = { } end modules ['mult-mes'] = {
license = "see context related readme files"
}
+-- floatsblocks -> floats
+-- bodyfont -> fonts
+-- verbatims -> buffers
+
+-- check all interfaces.showmessage
+-- replace all writestatus (tricky as %'s in names, but we can support --)
+
return {
- ["publications"]={
- ["files"]={ "bibl-tra.mkiv" },
- ["title"]={
- ["en"]="publications",
- },
- ["1"]={
- ["en"]="file -- not found, unknown style ignored",
- },
- ["2"]={
- ["en"]="file -- not found, waiting for bibtex",
- },
- ["3"]={
- ["en"]="wrote a new auxiliary file \\jobname.aux",
- },
- ["4"]={
- ["en"]="loading database from --",
- },
- ["5"]={
- ["en"]="warning: cite argument -- on line \\the\\inputlineno",
- },
- ["6"]={
- ["en"]="loading formatting style from --",
- },
- },
- ["check"]={
- ["1"]={
- ["cs"]="postradam '=' po '--' na radku --",
- ["de"]="Fehlendes '=' nach '--' in Zeile --",
- ["en"]="missing or ungrouped '=' after '--' in line --",
- ["fr"]="manquant ou dégroupé '=' après '--' à la ligne --",
- ["it"]="'=' mancante o non raggruppato dopo '--' alla riga --",
- ["nl"]="'=' ontbreekt of zonder {} na '--' in regel --",
- ["no"]="manglende '=' etter '--' i linje --",
- ["ro"]="lipseste '=' dupa '--' in linia --",
- },
- ["2"]={
- ["cs"]="ocekavam -- argument(y) na radku --",
- ["de"]="-- Argument(e) in Zeile -- erwartet",
- ["en"]="-- argument(s) expected in line --",
- ["fr"]="-- argument(s) attendu(s) à la ligne --",
- ["it"]="-- argomento/i attesi alla riga --",
- ["nl"]="-- argument(en) verwacht in regel --",
- ["no"]="-- argument forventet i linje --",
- ["ro"]="argumentul(ele) -- sunt asteptate in linia --",
- },
- ["3"]={
- ["cs"]="-- -- nahrazuje makro, uzijte VERZALKY!",
- ["de"]="-- -- ersetzt ein Makro, verwende VERSALIEN!",
- ["en"]="-- -- replaces a macro, use CAPITALS!",
- ["fr"]="-- -- remplace une macro, utilisez des MAJUSCULES !",
- ["it"]="-- -- sostituisce una macro, usare le MAIUSCOLE!",
- ["nl"]="-- -- vervangt een macro, gebruik HOOFDLETTERS!",
- ["no"]="-- -- overskygger en makro, bruk STORE BOKSTAVER!",
- ["ro"]="-- -- inlocuieste un macro, folositi MAJUSCULE!",
- },
- ["files"]={ "mult-sys.tex" },
- ["title"]={
- ["cs"]="kontrola",
- ["de"]="check",
- ["en"]="check",
- ["fr"]="vérification",
- ["it"]="controllo",
- ["nl"]="controle",
- ["no"]="kontroll",
- ["ro"]="verificari",
- },
- },
- ["colors"]={
- ["1"]={
- ["cs"]="system -- je globalne aktivovana",
- ["de"]="system -- ist global aktiviert",
- ["en"]="system -- is global activated",
- ["fr"]="le système -- est globalement activé",
- ["it"]="sistema -- attivato globalmente",
- ["nl"]="systeem -- is globaal actief",
- ["no"]="system -- er aktivert globalt",
- ["ro"]="sistem -- este activata global",
- },
- ["10"]={
- ["cs"]="-- prostor barev je podporovan",
- ["de"]="-- Farbraum wird unterstuetzt",
- ["en"]="-- color space is supported",
- ["fr"]="-- l'espace de couleur est supporté",
- ["it"]="spazio dei colori -- supportato",
- ["nl"]="-- kleurruimte wordt ondersteund",
- ["no"]="-- fargerom er støttet",
- ["ro"]="spatiul de culoare -- este suportat",
- },
- ["11"]={
- ["cs"]="barva je prevedena na sed",
- ["de"]="Farbe wird in Grau umgewandelt",
- ["en"]="color is converted to gray",
- ["fr"]="la couleur est convertie en niveau de gris",
- ["it"]="il colore ø convertito in grigio",
- ["nl"]="kleur wordt vertaald in grijs",
- ["no"]="fargen vil bli vist som grø",
- ["ro"]="culoarea este convertita la gri",
- },
- ["12"]={
- ["cs"]="-- is registered",
- ["de"]="-- is registered",
- ["en"]="-- is registered",
- ["fr"]="-- est enregistré",
- ["it"]="-- is registered",
- ["nl"]="-- is geregistreerd",
- ["no"]="-- is registered",
- ["ro"]="-- is registered",
- },
- ["2"]={
- ["cs"]="system -- je lokalne activovana",
- ["de"]="system -- ist lokal aktiviert",
- ["en"]="system -- is local activated",
- ["fr"]="le système -- est localement activé",
- ["it"]="sistema -- attivato localmente",
- ["nl"]="systeem -- is lokaal actief",
- ["no"]="system -- er aktivert lokalt",
- ["ro"]="sistem -- este activata local",
- },
- ["3"]={
- ["cs"]="-- neni definovana --",
- ["de"]="-- ist undefiniert --",
- ["en"]="-- is not defined --",
- ["fr"]="-- n'est pas défini --",
- ["it"]="-- non definito --",
- ["nl"]="-- is niet gedefinieerd --",
- ["no"]="-- er udefinert --",
- ["ro"]="-- nu este definita --",
- },
- ["4"]={
- ["cs"]="system -- je nacten",
- ["de"]="system -- ist geladen",
- ["en"]="system -- is loaded",
- ["fr"]="le système -- est chargé",
- ["it"]="sistema -- caricato",
- ["nl"]="systeem -- wordt geladen",
- ["no"]="system -- er lest inn",
- ["ro"]="sistem -- este incarcata",
- },
- ["5"]={
- ["cs"]="neznamy system --",
- ["de"]="unbekanntes System --",
- ["en"]="unknown system --",
- ["fr"]="système -- inconnu",
- ["it"]="sistema -- sconosciuto",
- ["nl"]="onbekend systeem --",
- ["no"]="ukjent system --",
- ["ro"]="sistem -- necunoscuta",
- },
- ["6"]={
- ["cs"]="palette -- je k dispozici",
- ["de"]="palette -- ist verfuegbar",
- ["en"]="palette -- is available",
- ["fr"]="la palette -- est disponible",
- ["it"]="tavolozza -- resa disponibile",
- ["nl"]="palet -- is beschikbaar",
- ["no"]="palett -- er tilgjengelig",
- ["ro"]="paleta -- este disponibila",
- },
- ["7"]={
- ["cs"]="palette -- neni k dispozici",
- ["de"]="palette -- ist nicht verfuegbar",
- ["en"]="palette -- is not available",
- ["fr"]="le palette -- n'est pas disponible",
- ["it"]="tavolozza -- non disponibile",
- ["nl"]="palet -- is niet beschikbaar",
- ["no"]="palett -- er ikke tilgjengelig",
- ["ro"]="palette -- nu este disponibila",
- },
- ["8"]={
- ["cs"]="specifikace -- v barve -- bude cerna",
- ["de"]="Spezifikation -- bei Farbe -- wird schwarz",
- ["en"]="specification -- at color -- becomes black",
- ["fr"]="la spécification -- de la couleur -- devient noire",
- ["it"]="specifica -- del colore -- convertita in nero",
- ["nl"]="specificatie -- bij -- wordt zwart",
- ["no"]="spesifikasjon -- for farge -- gir kun svart",
- ["ro"]="specificatia -- la culoarea -- devine neagra",
- },
- ["9"]={
- ["cs"]="-- prostor barev neni podporovan",
- ["de"]="-- Farbraum wird nicht unterstuetzt",
- ["en"]="-- color space is not supported",
- ["fr"]="l'espace de couleur -- n'est pas supporté",
- ["it"]="spazio dei colori -- non supportato",
- ["nl"]="-- kleurruimte wordt niet ondersteund",
- ["no"]="-- fargerom er ikke støttet",
- ["ro"]="spatiul de culoare -- nu este suportat",
- },
- ["files"]={ "colo-ini.tex" },
- ["title"]={
- ["cs"]="barva",
- ["de"]="farbe",
- ["en"]="color",
- ["fr"]="couleurs",
- ["it"]="colore",
- ["nl"]="kleur",
- ["no"]="farge",
- ["ro"]="culori",
- },
- },
- ["columns"]={
- ["1"]={
- ["cs"]="je mozno pouze -- sloupcu",
- ["de"]="nur -- Spalten moeglich",
- ["en"]="only -- columns possible",
- ["fr"]="seules -- colonnes possibles",
- ["it"]="solo -- colonne possibili",
- ["nl"]="maximaal -- kolommen",
- ["no"]="maksimalt -- kolonner",
- ["ro"]="este posibil numai -- coloane",
- },
- ["10"]={
- ["cs"]="zbyl (mene nez) 1 radek",
- ["de"]="(weniger als) 1 Zeile uebrig",
- ["en"]="(less than) 1 line left",
- ["fr"]="(moins de) 1 ligne restante",
- ["it"]="(meno di) una riga rimasta",
- ["nl"]="(minder dan) 1 regel over",
- ["no"]="(mindre enn) 1 linje igjen",
- ["ro"]="a mai ramas (mai putin de) 1 linie",
- },
- ["11"]={
- ["cs"]="plovouci objekt je pro sloupec prilis siroky",
- ["de"]="Gleitobjekt zu breit fuer Spalte",
- ["en"]="float too wide for column",
- ["fr"]="flottant mis à la largeur de la colonne",
- ["it"]="oggetto mobile troppo ampio per la colonna",
- ["nl"]="plaatsblok te breed voor kolom",
- ["no"]="flytblokk for bredt for kolonna",
- ["ro"]="blocul este prea lat pentru coloana",
- },
- ["12"]={
- ["cs"]="plovouci objekt je presunut do nasledujiciho sloupce / --",
- ["de"]="Gleitobjekt in naechste Zeile verschoben / --",
- ["en"]="float moved to next column / --",
- ["fr"]="flottant déplacé à la colonne suivante / --",
- ["it"]="oggetto mobile spostata alla colonna successiva / --",
- ["nl"]="plaatsblok verplaatst naar volgende kolom / --",
- ["no"]="flytblokk forskjøvet til neste kolonne / --",
- ["ro"]="blocul este mutat pe urmatoarea coloana / --",
- },
- ["13"]={
- ["cs"]="siroky plovouci objekt je presunut nad sloupce",
- ["de"]="breites Gleitobjekt an den Anfang der Spalten verschoben",
- ["en"]="wide float moved to top of columns",
- ["fr"]="flottant large déplacé dans la partie supérieure de la colonne",
- ["it"]="oggetto mobile ampio spostato sopra le colonne",
- ["nl"]="breed figuur geplaatst boven kolommen",
- ["no"]="bred flytblokk forksjøvet til toppen av kolonnene",
- ["ro"]="blocul lat este mutat in partea de sus a coloanelor",
- },
- ["2"]={
- ["cs"]="pouzijte \\string\\filbreak\\space jako alternativu",
- ["de"]="benutzte \\string\\filbreak\\space als Alternative",
- ["en"]="use \\string\\filbreak\\space as alternative",
- ["fr"]="utilisez \\string\\filbreak\\space en tant qu'alternative",
- ["it"]="in alternativa, usare \\string\\filbreak",
- ["nl"]="gebruik eventueel \\string\\filbreak",
- ["no"]="bruk \\string\\filbreak\\space som et alternativ",
- ["ro"]="folositi \\string\\filbreak\\space ca alternativa",
- },
- ["3"]={
- ["cs"]="problem, vypina se vyvazovani",
- ["de"]="Problem, verwende [ausgleich=nein]",
- ["en"]="problems, disable balancing",
- ["fr"]="problèmes, désactive l'équilibrage",
- ["it"]="problemi, disabilitare il bilanciamento",
- ["nl"]="probleempje, probeer [balanceren=nee]",
- ["no"]="problemer, slår av balansering",
- ["ro"]="probleme, se dezactiveaza alinierea",
- },
- ["4"]={
- ["cs"]="horni plovouci objekt jeste neni podporovan",
- ["de"]="Gleitobjekt oben ncoh nicht unterstuetzt",
- ["en"]="top float not yet supported",
- ["fr"]="flottant en partie supérieure pas encore supporté",
- ["it"]="float in cima non ancora supportato",
- ["nl"]="plaatsblok boven nog niet mogelijk",
- ["no"]="flytblokker øverst er ikke støttet enda",
- ["ro"]="cadrele top (top float) nu sunt inca suportate",
- },
- ["5"]={
- ["cs"]="spodni plovouci objekt jeste neni podporovan",
- ["de"]="Gleitobjekt unten ncoh nicht unterstuetzt",
- ["en"]="bottom float not yet supported",
- ["fr"]="flottant en partie inférieure pas encore supporté",
- ["it"]="float in fondo non ancora supportato",
- ["nl"]="plaatsblok onder nog niet mogelijk",
- ["no"]="flytblokker nedert er ikke støttet enda",
- ["ro"]="cadrele bottom (bottom float) nu sunt inca suportate",
- },
- ["6"]={
- ["cs"]="-- plovouci objekt(y) odlozeny",
- ["de"]="-- Gleitobjekt(e) verschoben",
- ["en"]="-- float(s) postponed",
- ["fr"]="-- flottant(s) reporté(s)",
- ["it"]="-- float(s) posticipate",
- ["nl"]="-- plaatsblok(en) opgeschort",
- ["no"]="-- flytblokk forskjøvet",
- ["ro"]="-- blocurile sunt amanate",
- },
- ["7"]={
- ["cs"]="vyvazovani ukonceno po 100 krocich",
- ["de"]="ausgleich nach 100 Schritten abgebrocheb",
- ["en"]="balancing aborted after 100 steps",
- ["fr"]="équilibrage abandonné après 100 pas",
- ["it"]="bilanciamento annullato dopo 100 passi",
- ["nl"]="balanceren afgebroken na 100 stappen",
- ["no"]="balansering avbrutt etter 100 iterasjoner",
- ["ro"]="alinierea este oprita dupa 100 de incercari",
- },
- ["8"]={
- ["cs"]="vyvazeno v -- krocich",
- ["de"]="ausgeglichen nach -- Schritt(en)",
- ["en"]="balanced in -- step(s)",
- ["fr"]="équilibré en -- pas",
- ["it"]="bilanciamento in -- passo/i",
- ["nl"]="gebalanceerd in -- stap(pen)",
- ["no"]="balansert etter -- iterasjoner",
- ["ro"]="aliniat in -- pas(i)",
- },
- ["9"]={
- ["cs"]="kontrola nerovnost",
- ["de"]="Ausrichtung ueberpruefen",
- ["en"]="check raggedness",
- ["fr"]="vérification des irrégularités",
- ["it"]="controllare seghettamento",
- ["nl"]="uitlijnen controleren!",
- ["no"]="kontroller tekstlayout!",
- ["ro"]="verificat alinierea",
- },
- ["files"]={ "page-ini.tex" },
- ["title"]={
- ["cs"]="sloupce",
- ["de"]="Spalten",
- ["en"]="columns",
- ["fr"]="colonnes",
- ["it"]="colonne",
- ["nl"]="kolommen",
- ["no"]="kolonner",
- ["ro"]="coloane",
- },
- },
- ["databases"]={
- ["1"]={
- ["cs"]="--",
- ["de"]="--",
- ["en"]="--",
- ["fr"]="--",
- ["it"]="--",
- ["nl"]="--",
- ["no"]="--",
- ["ro"]="--",
- },
- ["2"]={
- ["cs"]="local file --",
- ["de"]="lokale Datei --",
- ["en"]="local file --",
- ["fr"]="fichier local --",
- ["it"]="file locale --",
- ["nl"]="lokaal bestand --",
- ["no"]="lokal fil --",
- ["ro"]="fisier local --",
- },
- ["3"]={
- ["cs"]="global file --",
- ["de"]="globale Datei --",
- ["en"]="global file --",
- ["fr"]="fichier global --",
- ["it"]="file globale --",
- ["nl"]="globaal bestand --",
- ["no"]="global fil --",
- ["ro"]="fisier global --",
- },
- ["4"]={
- ["cs"]="unknown file --",
- ["de"]="unbekannte Datei --",
- ["en"]="unknown file --",
- ["fr"]="fichier inconnu --",
- ["it"]="file sconosciuto --",
- ["nl"]="onbekend bestand --",
- ["no"]="ukjent fil --",
- ["ro"]="fisier necunoscut --",
- },
- ["files"]={ "core-dat.tex" },
- ["title"]={
- ["cs"]="databases",
- ["de"]="Datenbank",
- ["en"]="databases",
- ["fr"]="bases de données",
- ["it"]="database",
- ["nl"]="database",
- ["no"]="databaser",
- ["ro"]="baze de date",
- },
- },
- ["documents"]={
- ["1"]={
- ["de"]="Blatt --",
- ["en"]="sheet --",
- ["nl"]="sheet --",
- },
- ["2"]={
- ["de"]="Nummer --",
- ["en"]="number --",
- ["nl"]="nummer --",
- },
- ["files"]={ "docs-bri.tex", "docs-she.tex" },
- ["title"]={
- ["de"]="Blaetter",
- ["en"]="sheets",
- ["nl"]="sheets",
- },
- },
- ["encodings"]={
- ["1"]={
- ["cs"]="kodovani --",
- ["de"]="Kodierung --",
- ["en"]="coding --",
- ["fr"]="encodage --",
- ["it"]="codifica --",
- ["nl"]="codering --",
- ["no"]="koding --",
- ["ro"]="codificarea --",
- },
- ["2"]={
- ["cs"]="je nacteno kodovani --",
- ["de"]="Kodierung -- ist geladen",
- ["en"]="coding -- is loaded",
- ["fr"]="l'encodage -- est chargé",
- ["it"]="codifica -- caricata",
- ["nl"]="codering -- wordt geladen",
- ["no"]="koding -- er lest inn",
- ["ro"]="codificarea -- este Encarcata",
- },
- ["3"]={
- ["cs"]="nezname kodovani --",
- ["de"]="Unbekannte Kodierung --",
- ["en"]="unknown coding --",
- ["fr"]="encodage -- inconnu",
- ["it"]="codifica sconosciuta --",
- ["nl"]="onbekende codering --",
- ["no"]="ukjent koding --",
- ["ro"]="codificarea -- este necunoscuta",
- },
- ["files"]={ "enco-ini.mkii" },
- ["title"]={
- ["cs"]="kodovani",
- ["de"]="Kodierung",
- ["en"]="encoding",
- ["fr"]="encodage",
- ["it"]="codifica",
- ["nl"]="encoding",
- ["no"]="koding",
- ["ro"]="codificari",
- },
- },
- ["figures"]={
- ["1"]={
- ["cs"]="obraz -- nelze nalezt",
- ["de"]="Abbildung -- kann nicht gefunden werden",
- ["en"]="figure -- can not be found",
- ["fr"]="la figure -- ne peut être trouvée",
- ["it"]="figura -- non trovata",
- ["nl"]="figuur -- is niet te vinden",
- ["ro"]="figura -- nu poate fi gasita",
- },
- ["2"]={
- ["cs"]="obraz -- nepritomen",
- ["de"]="Abbildung -- wird nicht erstellt",
- ["en"]="figure -- is not preset",
- ["fr"]="la figure -- n'est pas pré-sélectionnée",
- ["it"]="la figura -- non è preimpostata",
- ["nl"]="figuur -- wordt niet preset",
- ["ro"]="figura -- nu este presetata",
- },
- ["3"]={
- ["cs"]="dimensions of -- are determined externally",
- ["de"]="dimensions of -- are determined externally",
- ["en"]="dimensions of -- are determined externally",
- ["fr"]="dimensions of -- are determined externally",
- ["it"]="dimensions of -- are determined externally",
- ["nl"]="maten van -- worden extern vastgesteld",
- ["ro"]="dimensions of -- are determined externally",
- },
- ["4"]={
- ["cs"]="dimenze obrazu -- nacteny primo z jeho souboru",
- ["de"]="Dimensionen von -- geladen aus der Abbildungsdatei selbst",
- ["en"]="dimensions of -- loaded from figurefile itself",
- ["fr"]="les dimensions de -- chargées implicitement à partir du fichier de figure",
- ["it"]="dimensioni di -- caricate dal file di immagini stesso",
- ["nl"]="maten van -- geladen uit figuurfile zelf",
- ["ro"]="dimensiunea figurii -- se incarca din fisierul insusi",
- },
- ["5"]={
- ["cs"]="dimensions of -- are unknown",
- ["de"]="Dimensions of -- are unknown",
- ["en"]="dimensions of -- are unknown",
- ["fr"]="dimensions of -- are unknown",
- ["it"]="dimensions of -- are unknown",
- ["nl"]="maten van -- zijn onbekend",
- ["ro"]="dimensions of -- are unknown",
- },
- ["6"]={
- ["cs"]="dimenze obrazu -- spocteny programem rlxtools",
- ["de"]="Dimensionen von -- ausgerechnet durch rlxtools",
- ["en"]="dimensions of -- calculated by rlxtools",
- ["fr"]="les dimensions de -- calculées par rlxtools",
- ["it"]="dimensioni di -- calcolate da rlxtools",
- ["nl"]="maten van -- berekend door rlxtools",
- ["ro"]="dimensiunea figurii -- este calculata de rlxtools",
- },
- ["8"]={
- ["cs"]="obrazovy objekt -- je znovu pouzit",
- ["de"]="Abbildungobjekt -- wurde wiederverwandt",
- ["en"]="figureobject -- is reused",
- ["fr"]="figureobject -- est réutilisé",
- ["it"]="oggetto-figura -- riutilizzato",
- ["nl"]="figuurobject -- wordt opnieuw gebruikt",
- ["ro"]="obiectul figura -- este refolosit",
- },
- ["files"]={ "core-inc.mkii" },
- ["title"]={
- ["cs"]="obrazy",
- ["de"]="Abbildungen",
- ["en"]="figures",
- ["fr"]="figures",
- ["it"]="figure",
- ["nl"]="figuren",
- ["ro"]="figuri",
- },
- },
- ["files"]={
- ["1"]={
- ["cs"]="synonymum souboru -- je jiz pouzito pro --",
- ["de"]="Dateisynonym -- wird bereits fuer -- benutzt",
- ["en"]="file synonym -- is already used for --",
- ["fr"]="le synonyme de fichier -- est déjà utilisé pour --",
- ["it"]="sinonimo file -- già in uso per --",
- ["nl"]="file synoniem -- is al in gebruik voor --",
- ["no"]="filesynonym -- er allerede brukt for --",
- ["ro"]="sinonimul fisierelor -- este folosit deja pentru --",
- },
- ["files"]={ "core-fil.tex" },
- ["title"]={
- ["cs"]="soubory",
- ["de"]="files",
- ["en"]="files",
- ["fr"]="fichiers",
- ["it"]="file",
- ["nl"]="files",
- ["no"]="filer",
- ["ro"]="fisiere",
- },
- },
- ["filters"]={
- ["1"]={
- ["cs"]="filter -- is loaded",
- ["de"]="filter -- ist geladen",
- ["en"]="filter -- is loaded",
- ["fr"]="le filtre -- est chargé",
- ["it"]="filtro -- caricato",
- ["nl"]="filter -- wordt geladen",
- },
- ["2"]={
- ["cs"]="unknown filter --",
- ["de"]="unknown filter --",
- ["en"]="unknown filter --",
- ["fr"]="filtre -- inconnu",
- ["it"]="filtro sconosciuto --",
- ["nl"]="onbekend filter --",
- },
- ["files"]={ "filt-ini.tex" },
- ["title"]={
- ["cs"]="filter",
- ["de"]="filter",
- ["en"]="filter",
- ["fr"]="filtre",
- ["it"]="filtri",
- ["nl"]="filter",
- },
- },
- ["floatblocks"]={
- ["1"]={
- ["cs"]="-- precislovano / -- => --",
- ["de"]="-- neu nummeriert / -- => --",
- ["en"]="-- renumbered / -- => --",
- ["fr"]="-- renuméroté / -- => --",
- ["it"]="-- rinumerato / -- => --",
- ["nl"]="-- hernummerd / -- => --",
- ["no"]="-- renummerert / -- => --",
- ["ro"]="-- renumerotat / -- => --",
- },
- ["10"]={
- ["cs"]="-- omezeno",
- ["de"]="-- begrenzt",
- ["en"]="-- limited",
- ["fr"]="-- limité",
- ["it"]="-- limitato",
- ["nl"]="-- begrensd",
- ["no"]="-- begrenset",
- ["ro"]="-- limitat",
- },
- ["11"]={
- ["cs"]="nedan zadny blok",
- ["de"]="kein Block gegeben",
- ["en"]="no block given",
- ["fr"]="pas de bloc donné",
- ["it"]="nessun oggetto specificato",
- ["nl"]="geen blok opgegeven",
- ["no"]="ingen blokk oppgitt",
- ["ro"]="nu este dat nici un bloc",
- },
- ["12"]={
- ["cs"]="nedefinovano",
- ["de"]="undefiniert",
- ["en"]="undefined",
- ["fr"]="indéfini",
- ["it"]="non definito",
- ["nl"]="niet gedefinieerd",
- ["no"]="udefinert",
- ["ro"]="nedefinit",
- },
- ["13"]={
- ["cs"]="there is nothing to split",
- ["de"]="there is nothing to split",
- ["en"]="there is nothing to split",
- ["fr"]="there is nothing to split",
- ["it"]="there is nothing to split",
- ["nl"]="er is niets te splitsen",
- ["no"]="there is nothing to split",
- ["ro"]="there is nothing to split",
- },
- ["2"]={
- ["cs"]="-- ulozeno",
- ["de"]="-- gespeichert",
- ["en"]="-- saved",
- ["fr"]="-- sauvegardé",
- ["it"]="-- salvato",
- ["nl"]="-- bewaard",
- ["no"]="-- lagret",
- ["ro"]="-- salvat",
- },
- ["3"]={
- ["cs"]="-- presunuto",
- ["de"]="-- verschoben",
- ["en"]="-- moved",
- ["fr"]="-- déplacé",
- ["it"]="-- mosso",
- ["nl"]="-- verplaatst",
- ["no"]="-- flyttet",
- ["ro"]="-- mutat",
- },
- ["4"]={
- ["cs"]="-- umisteno",
- ["de"]="-- plaziert",
- ["en"]="-- placed",
- ["fr"]="-- placé",
- ["it"]="-- sistemato",
- ["nl"]="-- geplaatst",
- ["no"]="-- plassert",
- ["ro"]="-- plasat",
- },
- ["5"]={
- ["cs"]="poradi prizpusobeno",
- ["de"]="Reihenfolge angepasst",
- ["en"]="order adapted",
- ["fr"]="ordre adapté",
- ["it"]="ordine aggiustato",
- ["nl"]="volgorde aangepast",
- ["no"]="rekkefølge tilpasset",
- ["ro"]="ordinea adaptata",
- },
- ["6"]={
- ["cs"]="pocet hornich plovoucich objektu je omezen na --",
- ["de"]="Anz. der oberen Gleitobjekte beschraengt auf --",
- ["en"]="n of top floats limited to --",
- ["fr"]="n flottants de haut de page limité à --",
- ["it"]="n di top floats limitato a --",
- ["nl"]="maximaal -- boven",
- ["no"]="maksimalt -- flytblokker øverst",
- ["ro"]="nr. cadrelor de sus limitat la --",
- },
- ["7"]={
- ["cs"]="pocet spodnich plovoucich objektu je omezen na --",
- ["de"]="Anz. der unteren Gleitobjekte beschraengt auf --",
- ["en"]="n of bottom floats limited to --",
- ["fr"]="n flottants de bas de page limité à --",
- ["it"]="n di bottom floats limitato a --",
- ["nl"]="maximaal -- onder",
- ["no"]="maksimalt -- flytblokker nederst",
- ["ro"]="nr. blocurilor de jos limitat la --",
- },
- ["8"]={
- ["cs"]="radku je mene nez --",
- ["de"]="weniger als -- zeilen",
- ["en"]="less than -- lines",
- ["fr"]="moins de -- lignes",
- ["it"]="meno di -- righe",
- ["nl"]="minder dan -- regels",
- ["no"]="mindre enn -- linjer",
- ["ro"]="mai putin de -- linii",
- },
- ["9"]={
- ["cs"]="poradi naruseno",
- ["de"]="Reigenfolge gestoert",
- ["en"]="order disturbed",
- ["fr"]="ordre perturbé",
- ["it"]="ordine disturbato",
- ["nl"]="volgorde verstoord",
- ["no"]="rekkefølge endret",
- ["ro"]="ordinea deranjata",
- },
- ["files"]={ "page-flt.tex", "strc-flt.tex" },
- ["title"]={
- ["cs"]="plovouciobjekty",
- ["de"]="Gleitobjektbloecke",
- ["en"]="floatblocks",
- ["fr"]="blocs de flottants",
- ["it"]="oggetti mobili",
- ["nl"]="plaatsblokken",
- ["no"]="flytblokker",
- ["ro"]="Blocuri",
- },
- },
- ["fonts"]={
- ["1"]={
- ["cs"]="kodovani --",
- ["de"]="Kodierung --",
- ["en"]="coding --",
- ["fr"]="encodage --",
- ["it"]="codifica --",
- ["nl"]="codering --",
- ["no"]="koding --",
- ["ro"]="codificarea --",
- },
- ["10"]={
- ["cs"]="neznamy font --",
- ["de"]="unbekanntes Font --",
- ["en"]="unknown font file --",
- ["fr"]="fichier de police -- inconnu",
- ["it"]="file di font sconosciuto --",
- ["nl"]="onbekende font file --",
- ["no"]="ukjent fontfil --",
- ["ro"]="fisier font necunoscut --",
- },
- ["14"]={
- ["cs"]="bodyfont -- is defined (can better be done global)",
- ["de"]="Fliesstext -- wurde definiert (besser waere globale Definition)",
- ["en"]="bodyfont -- is defined (can better be done global)",
- ["fr"]="policecorps -- est défini (une définition globale pourrait être plus adéquat)",
- ["it"]="corpo del testo -- definito (sarebbe meglio globale)",
- ["nl"]="korps -- is gedefinieerd (kan beter globaal plaatsvinden)",
- ["no"]="bodyfont -- is defined (can better be done global)",
- ["ro"]="bodyfont -- is defined (can better be done global)",
- },
- ["2"]={
- ["cs"]="varianta -- je nactena",
- ["de"]="Variante -- ist geladen",
- ["en"]="variant -- is loaded",
- ["fr"]="la variante -- est chargée",
- ["it"]="variante -- caricata",
- ["nl"]="variant -- wordt geladen",
- ["no"]="variant -- er lest inn",
- ["ro"]="varianta -- este incarcata",
- },
- ["3"]={
- ["cs"]="neznama varianta --",
- ["de"]="Unbekannte Variante --",
- ["en"]="unknown variant --",
- ["fr"]="variante -- inconnue",
- ["it"]="variante sconosciuta --",
- ["nl"]="onbekende variant --",
- ["no"]="ukjent variant --",
- ["ro"]="varianta necunoscuta --",
- },
- ["4"]={
- ["cs"]="zakladni font -- neni definovan",
- ["de"]="Fliesstext -- ist nicht definiert",
- ["en"]="bodyfont -- is not defined",
- ["fr"]="policecorps -- n'est pas définie",
- ["it"]="corpo del testo -- non definito",
- ["nl"]="korps -- is niet gedefinieerd",
- ["no"]="hovedfont -- er ikke definert",
- ["ro"]="corpul de litere -- nu este definit",
- },
- ["5"]={
- ["cs"]="styl -- neni definovan",
- ["de"]="Stil -- ist nicht definiert",
- ["en"]="style -- is not defined",
- ["fr"]="le style -- n'est pas défini",
- ["it"]="stile -- non definito",
- ["nl"]="stijl -- is niet gedefinieerd",
- ["no"]="stil -- er ikke definert",
- ["ro"]="stilul -- nu este definit",
- },
- ["6"]={
- ["cs"]="-- je nacten",
- ["de"]="-- ist geladen",
- ["en"]="-- is loaded",
- ["fr"]="-- est chargé",
- ["it"]="-- caricato",
- ["nl"]="-- wordt geladen",
- ["no"]="-- er lest inn",
- ["ro"]="-- este incarcat",
- },
- ["7"]={
- ["cs"]="neznamy format --",
- ["de"]="unbekanntes Format --",
- ["en"]="unknown format --",
- ["fr"]="format -- inconnu",
- ["it"]="formato sconosciuto --",
- ["nl"]="onbekend formaat --",
- ["no"]="ukjent format --",
- ["ro"]="format necunoscut --",
- },
- ["8"]={
- ["cs"]="styl -- definovan",
- ["de"]="Stil -- definiert",
- ["en"]="style -- defined",
- ["fr"]="style -- défini",
- ["it"]="stile -- definito",
- ["nl"]="stijl -- gedefinieerd",
- ["no"]="stil -- definert",
- ["ro"]="stilul -- definit",
- },
- ["files"]={ "font-ini.mkii", "font-ini.mkiv" },
- ["title"]={
- ["cs"]="zakladnifont",
- ["de"]="Fliesstext",
- ["en"]="bodyfont",
- ["fr"]="corps de texte",
- ["it"]="font del corpo",
- ["nl"]="korps",
- ["no"]="hovedfont",
- ["ro"]="corp de litere",
- },
- },
- ["handlings"]={
- ["1"]={
- ["cs"]="font handling --",
- ["de"]="Font Verarbeitung --",
- ["en"]="font handling --",
- ["fr"]="manipulation -- de police",
- ["it"]="font handling --",
- ["nl"]="font afhandeling --",
- ["no"]="font handling --",
- ["ro"]="font handling --",
- },
- ["2"]={
- ["cs"]="font handling -- is loaded",
- ["de"]="Font Verarbeitung -- ist geladen",
- ["en"]="font handling -- is loaded",
- ["fr"]="la manipulation -- de police est chargée",
- ["it"]="font handling -- is loaded",
- ["nl"]="font afhandeling -- wordt geladen",
- ["no"]="font handling -- is loaded",
- ["ro"]="font handling -- is loaded",
- },
- ["3"]={
- ["cs"]="unknown font handling --",
- ["de"]="unknown font handling --",
- ["en"]="unknown font handling --",
- ["fr"]="manipulation -- inconnue de police",
- ["it"]="unknown font handling --",
- ["nl"]="onbekende font afhandeling --",
- ["no"]="unknown font handling --",
- ["ro"]="unknown font handling --",
- },
- ["files"]={ "hand-ini.mkii" },
- ["title"]={
- ["cs"]="handling",
- ["de"]="handling",
- ["en"]="handling",
- ["fr"]="manipulation",
- ["it"]="handling",
- ["nl"]="handling",
- ["no"]="handling",
- ["ro"]="handling",
- },
- },
- ["interactions"]={
- ["1"]={
- ["cs"]="pomer -- x -- (s x v)",
- ["de"]="Seitenverhaeltnis -- x -- (B x H)",
- ["en"]="aspect ratio -- x -- (b x h)",
- ["fr"]="ratio d'aspect -- x -- (b x h)",
- ["it"]="rapporto -- x -- (b x a)",
- ["nl"]="aspect ratio -- x -- (b x h)",
- ["no"]="forholdstall -- x -- (b x h)",
- ["ro"]="aspectul -- x -- (b x h)",
- },
- ["2"]={
- ["cs"]="aktivni",
- ["de"]="aktiv",
- ["en"]="active",
- ["fr"]="actif",
- ["it"]="attiva",
- ["nl"]="actief",
- ["no"]="aktiv",
- ["ro"]="activ",
- },
- ["21"]={
- ["cs"]="-- kod vlozen",
- ["de"]="-- Code eingefuegt",
- ["en"]="-- code inserted",
- ["fr"]="-- code inseré",
- ["it"]="codice -- inserito",
- ["nl"]="-- code tussengevoegd",
- ["no"]="-- kode satt inn / tilføyd",
- ["ro"]="-- cod inserat",
- },
- ["3"]={
- ["cs"]="neaktivni",
- ["de"]="inaktiv",
- ["en"]="inactive",
- ["fr"]="inactif",
- ["it"]="inattiva",
- ["nl"]="niet actief",
- ["no"]="inaktiv",
- ["ro"]="inactiv",
- },
- ["4"]={
- ["cs"]="zadna strankova synchronizace (--) v hmode",
- ["de"]="keine Seitensynchronisation (--) im hmode",
- ["en"]="no pagesynchronisation (--) in hmode",
- ["fr"]="pas de synchronisation de page (--) dans le hmode",
- ["it"]="sincronizzazione di pagina (--) non disponibile in hmode",
- ["nl"]="geen paginasynchronisatie (--) in hmode",
- ["no"]="ingen sidesynkronisering (--) i hmode",
- ["ro"]="nu exista sincronizare pt. pagini (--) in hmode",
- },
- ["5"]={
- ["cs"]="unknown attachment --",
- ["de"]="unknown attachment --",
- ["en"]="unknown attachment --",
- ["fr"]="le fichier joint -- est inconnu",
- ["it"]="unknown attachment --",
- ["nl"]="onbekend attachment --",
- ["no"]="unknown attachment --",
- ["ro"]="unknown attachment --",
- },
- ["6"]={
- ["cs"]="attachment file -- does not exist",
- ["de"]="attachment file -- does not exist",
- ["en"]="attachment file -- does not exist",
- ["fr"]="le fichier joint -- n'existe pas",
- ["it"]="attachment file -- does not exist",
- ["nl"]="attachment file -- bestaat niet",
- ["no"]="attachment file -- does not exist",
- ["ro"]="attachment file -- does not exist",
- },
- ["files"]={ "core-int.tex", "spec-ini.tex" },
- ["title"]={
- ["cs"]="interakce",
- ["de"]="Interaktion",
- ["en"]="interaction",
- ["fr"]="interaction",
- ["it"]="interazione",
- ["nl"]="interactie",
- ["no"]="interaksjon",
- ["ro"]="interactiuni",
- },
- },
- ["javascript"]={
- ["1"]={
- ["cs"]="nacita se soubor skriptu --",
- ["de"]="Lade Scriptdatei --",
- ["en"]="loading script set --",
- ["fr"]="chargement du jeu de script --",
- ["it"]="caricamento dello script set --",
- ["nl"]="script set -- wordt geladen",
- ["no"]="leser inn scriptsett --",
- ["ro"]="se incarca scriptul --",
- },
- ["2"]={
- ["cs"]="neznama preambule --",
- ["de"]="unbekannte Preamble --",
- ["en"]="unknown preamble --",
- ["fr"]="préambule -- inconnu",
- ["it"]="preambolo sconosciuto --",
- ["nl"]="onbekende preamble --",
- ["no"]="ukjent 'preamble' --",
- ["ro"]="preambul necunoscut --",
- },
- ["files"]={ "java-ini.tex" },
- ["title"]={
- ["cs"]="javascript",
- ["de"]="javascript",
- ["en"]="javascript",
- ["fr"]="javascript",
- ["it"]="javascript",
- ["nl"]="javascript",
- ["no"]="javascript",
- ["ro"]="javascript",
- },
- },
- ["layouts"]={
- ["1"]={
- ["cs"]="vyska textu prizpusobena s -- na strane --",
- ["de"]="Texthoehe angepasst mit -- auf Seite --",
- ["en"]="textheight adapted with -- at page --",
- ["fr"]="hauteurtexte adaptée avec -- à la page --",
- ["it"]="altezza del testo adattata con -- a pagina --",
- ["nl"]="teksthoogte aangepast met -- op pagina --",
- ["no"]="teksthøyde tilpasset med -- på side --",
- ["ro"]="textheight adaptat cu -- la pagina --",
- },
- ["10"]={
- ["cs"]="-- a -- nedava dohromady 1.0",
- ["de"]="-- und -- ergeben zusammen nicht 1.0",
- ["en"]="-- and -- don't add up to 1.0",
- ["fr"]="-- et -- ne sont pas ajoutés à 1.0",
- ["it"]="-- e -- non sommano a 1.0",
- ["nl"]="-- en -- tellen niet op tot 1.0",
- ["no"]="-- og -- er ikke 1.0 til sammen",
- ["ro"]="-- si -- nu se adauga pana la 1.0",
- },
- ["11"]={
- ["cs"]="svisla mezera -- neni povolena v pevnem radkovem rejstriku",
- ["de"]="Zwischenraum -- nicht im Grittermoduserlau",
- ["en"]="spacing -- not permitted in gridmode",
- ["fr"]="espacement -- non permis en modegrille",
- ["it"]="spaziatura -- non permessa in modo griglia",
- ["nl"]="interlinie -- niet toegestaan in gridmode",
- ["no"]="mellomrom -- ikke tillatt i gridmodus",
- ["ro"]="spatierea -- nu este permisa in gridmode",
- },
- ["2"]={
- ["cs"]="-- krat odlozeny text umisten",
- ["de"]="-- mal verschobener Text plaziert",
- ["en"]="-- times postponed text placed",
- ["fr"]="-- times postponed text placed",
- ["it"]="posizionato testo posticipato -- volte",
- ["nl"]="-- maal uitgestelde tekst tussengevoegd",
- ["no"]="-- ganger forskjøvet tekst plassert",
- ["ro"]="textul amanat de -- ori a fost plasat",
- },
- ["3"]={
- ["cs"]="-- krat text odlozen",
- ["de"]="-- mal Text verschoben",
- ["en"]="-- times text postponed",
- ["fr"]="-- times text postponed",
- ["it"]="testo posticipato -- volte",
- ["nl"]="-- maal tekst plaatsen uitstellen",
- ["no"]="-- ganger tekst forskjøvet",
- ["ro"]="textul amanat de -- ori",
- },
- ["4"]={
- ["cs"]="okrajove bloky aktivni",
- ["de"]="marginalbloecke aktiv",
- ["en"]="marginblocks active",
- ["fr"]="blocsmarge actifs",
- ["it"]="blocchi in margine attivi",
- ["nl"]="margeblokken actief",
- ["no"]="margblokker aktive",
- ["ro"]="blocuri marginale active",
- },
- ["5"]={
- ["cs"]="okrajove bloky neaktivni",
- ["de"]="marginalbloecke inaktiv",
- ["en"]="marginblocks inactive",
- ["fr"]="blocsmarge inactifs",
- ["it"]="blocchi in margine inattivi",
- ["nl"]="margeblokken inactief",
- ["no"]="margblokker inaktive",
- ["ro"]="blocuri marginale inactive",
- },
- ["6"]={
- ["cs"]="sada stran -- zpracovana (velikost --)",
- ["de"]="Unterseitenfolge -- verarbeitet (Groesse --)",
- ["en"]="subpage set -- processed (size --)",
- ["fr"]="jeu de souspage -- traité (taille --)",
- ["it"]="gruppo di sottopagine -- elaborato (dimensione --)",
- ["nl"]="subpagina reeks -- verwerkt (aantal --)",
- ["no"]="delside sett -- behandlet (størrelse --)",
- ["ro"]="setul -- de subpagini procesat (dimensiunea --)",
- },
- ["7"]={
- ["cs"]="pocita se misto pro logo",
- ["de"]="berechne Platzbedarf des Logos",
- ["en"]="calculating logospace",
- ["fr"]="calcul de l'espace pour le logo",
- ["it"]="calcolo dello spazio per logo",
- ["nl"]="beeldmerken berekenen",
- ["no"]="beregner plass for logo",
- ["ro"]="se calculeaza spatiul pentru logo",
- },
- ["8"]={
- ["cs"]="pocita se pozadi",
- ["de"]="berechne Hintergrund",
- ["en"]="calculating backgrounds",
- ["fr"]="calcul des arrières-plans",
- ["it"]="calcolo dello sfondo",
- ["nl"]="achtergronden berekenen",
- ["no"]="beregner bakgrunn",
- ["ro"]="se calculeaza fundalurile",
- },
- ["9"]={
- ["cs"]="aktualne ne vice nez -- urovne/urovni vyctu",
- ["de"]="z.Z. nicht mehr als -- Ebenen in Aufzaehlungen",
- ["en"]="currently no more than -- levels in itemizations",
- ["fr"]="pas plus de -- niveaux pour l'instant dans les élémentarisations",
- ["it"]="attualmente non più di -- livelli di elencazione",
- ["nl"]="momenteel maximaal -- niveaus in opsommingen",
- ["no"]="for øyeblikket maksimalt -- nivåer i opplisting",
- ["ro"]="acum nu se supota mai mult de -- nivele de adancime la iteratii",
- },
- ["files"]={ "core-itm.tex", "page-bck.mkii", "page-bck.mkiv", "page-ini.tex", "page-log.tex", "strc-itm.tex" },
- ["title"]={
- ["cs"]="layout",
- ["de"]="Layout",
- ["en"]="layout",
- ["fr"]="calque",
- ["it"]="layout",
- ["nl"]="layout",
- ["no"]="layout",
- ["ro"]="aranjamente",
- },
- },
- ["linguals"]={
- ["1"]={
- ["cs"]="vzory -- pro -- nacteny (n=--,e=--,m=--)",
- ["de"]="Trennmuster -- fuer -- geladen (n=--,e=--,m=--)",
- ["en"]="patterns -- for -- loaded (n=--,e=--,m=--)",
- ["fr"]="les motifs -- pour -- sont chargés (n=--,e=--,m=--)",
- ["it"]="schemi -- per -- caricati (n=--,e=--,m=--)",
- ["nl"]="afbreekpatronen -- voor -- geladen (n=--,e=--,m=--)",
- ["no"]="orddelingsmønster -- for -- er lest inn (n=--,e=--,m=--)",
- ["ro"]="sablonul -- pentru -- s-a incarcat (n=--,e=--,m=--)",
- },
- ["10"]={
- ["cs"]="vzory --nacteny",
- ["de"]="Trennmuster --geladen",
- ["en"]="patterns --loaded",
- ["fr"]="motifs -- chargés",
- ["it"]="schemi -- caricati",
- ["nl"]="patronen --geladen",
- ["no"]="orddelingsmønster -- er lest inn",
- ["ro"]="sabloanele -- incarcate",
- },
- ["2"]={
- ["cs"]="zadne vzory -- pro -- (n=--,e=--,m=--) (--,--)",
- ["de"]="Keine Trennmuster -- fuer -- (n=--,e=--,m=--) (--,--)",
- ["en"]="no patterns -- for -- (n=--,e=--,m=--) (--,--)",
- ["fr"]="pas de motifs -- pour -- (n=--,e=--,m=--) (--,--)",
- ["it"]="niente schemi -- per -- (n=--,e=--,m=--) (--,--)",
- ["nl"]="geen afbreekpatronen -- voor -- (n=--,e=--,m=--) (--,--)",
- ["no"]="ingen orddelingsmønster -- for -- (n=--,e=--,m=--) (--,--)",
- ["ro"]="nu exista sabloane -- pentru -- (n=--,e=--,m=--) (--,--)",
- },
- ["3"]={
- ["cs"]="deleni slov -- pro -- nacteno (n=--,e=--,m=--)",
- ["de"]="Trenndefinitionen -- fuer -- geladen (n=--,e=--,m=--)",
- ["en"]="hyphenations -- for -- loaded (n=--,e=--,m=--)",
- ["fr"]="hyphenations -- pour -- chargés (n=--,e=--,m=--)",
- ["it"]="sillabazione -- per -- caricata (n=--,e=--,m=--)",
- ["nl"]="afbreekdefinities -- voor -- geladen (n=--,e=--,m=--)",
- ["no"]="orddelingsdefinisjon -- for -- er lest inn (n=--,e=--,m=--)",
- ["ro"]="despartirea in silabe -- pentru -- s-a incarcat (n=--,e=--,m=--)",
- },
- ["4"]={
- ["cs"]="zadne deleni slov -- pro -- (n=--,e=--,m=--)",
- ["de"]="Keine Trenndefinitionen -- fuer -- (n=--,e=--,m=--)",
- ["en"]="no hyphenations -- for -- (n=--,e=--,m=--)",
- ["fr"]="pas d'hyphenations -- pour -- (n=--,e=--,m=--)",
- ["it"]="niente sillabazione -- per -- (n=--,e=--,m=--)",
- ["nl"]="geen afbreekdefinities -- voor -- (n=--,e=--,m=--)",
- ["no"]="ingen orddelingsdefinisjon -- for -- (n=--,e=--,m=--)",
- ["ro"]="nu exista despartire in silabe -- pentru -- (n=--,e=--,m=--)",
- },
- ["5"]={
- ["cs"]="vzory pro -- nenacteny",
- ["de"]="Trennmuster fuer -- nicht geladen",
- ["en"]="patterns for -- not loaded",
- ["fr"]="les motifs pour -- ne sont pas chargés",
- ["it"]="schemi per -- non caricati",
- ["nl"]="afbreekpatronen voor -- niet geladen",
- ["no"]="orddelingsmønster for -- er ikke lest inn",
- ["ro"]="sabloanele pentru -- nu sunt incarcate",
- },
- ["6"]={
- ["cs"]="jazyk -- neni definovan",
- ["de"]="Sprache -- ist undefiniert",
- ["en"]="language -- is undefined",
- ["fr"]="langue -- non définie",
- ["it"]="lingua -- non definita",
- ["nl"]="taal -- is niet gedefinieerd",
- ["no"]="spràk -- er udefinert",
- ["ro"]="limba -- nu este definita",
- },
- ["7"]={
- ["cs"]="specificke volby jazyka [--] zavadeji -- (zavlecenou) mezeru",
- ["de"]="Sprachenspezifische Option [--] fuegt eine Luecke von -- ein",
- ["en"]="language specific options [--] introduce a -- skip",
- ["fr"]="les options spécifiques de langue [--] introduisent un -- saut",
- ["it"]="opzioni specifiche per la lingua [--] introducono un salto --",
- ["nl"]="taal specifieke opties [--] introduceren een skip van --",
- ["no"]="spràk spesifikk opsjon [--] introduserer et -- hopp",
- ["ro"]="optiunile specifice ale limbii [--] introduc un spatiu --",
- },
- ["8"]={
- ["cs"]="specificke volby jazyka [--] bez mezer pripojeny",
- ["de"]="Sprachenspezifische Option [--] nahtlos hinzugefuegt",
- ["en"]="language specific options [--] seamless appended",
- ["fr"]="les options spécifiques de langue [--] sont ajoutés en douceur",
- ["it"]="opzioni specifiche per la lingua [--] aggiunte trasparentemente",
- ["nl"]="taal specifieke opties [--] naadloos toegevoegd",
- ["no"]="spràk spesifikk opsjon [--] problemfritt tilføyd",
- ["ro"]="optiunile specifice ale limbii [--] adaugate",
- },
- ["9"]={
- ["cs"]="language -- is active",
- ["de"]="Sprache -- ist aktiv",
- ["en"]="language -- is active",
- ["fr"]="la langue -- est active",
- ["it"]="lingua -- attiva",
- ["nl"]="taal -- is actief",
- ["no"]="spràk -- er aktivt",
- ["ro"]="limba -- este activa",
- },
- ["files"]={ "lang-ini.mkii", "lang-ini.mkiv" },
- ["title"]={
- ["cs"]="jazyky",
- ["de"]="Sprache",
- ["en"]="language",
- ["fr"]="langue",
- ["it"]="lingua",
- ["nl"]="taal",
- ["no"]="sprøk",
- ["ro"]="limbi",
- },
- },
- ["metapost"]={
- ["1"]={
- ["cs"]="loading metapost library --",
- ["de"]="Lade metapost Bibliothek --",
- ["en"]="loading metapost library --",
- ["fr"]="chargement de la bibliothèque metapost --",
- ["it"]="caricamento della libreria metapost --",
- ["nl"]="metapost bibliotheek -- wordt geladen",
- ["no"]="metapost bibliotek -- blir lest inn",
- ["ro"]="se incarca biblioteca metapost --",
- },
- ["files"]={ "meta-ini.mkii", "meta-ini.mkiv" },
- ["title"]={
- ["cs"]="metapost",
- ["de"]="metapost",
- ["en"]="metapost",
- ["fr"]="metapost",
- ["it"]="metapost",
- ["nl"]="metapost",
- ["no"]="metapost",
- ["ro"]="metapost",
- },
- },
- ["references"]={
- ["1"]={
- ["cs"]="neznama reference --",
- ["de"]="unbekannte Referenz --",
- ["en"]="unknown reference --",
- ["fr"]="réference -- inconnue",
- ["it"]="riferimento sconosciuto --",
- ["nl"]="onbekende verwijzing --",
- ["no"]="ukjent referanse --",
- ["ro"]="referinta necunoscuta --",
- },
- ["2"]={
- ["cs"]="duplicitni reference -- na strane --",
- ["de"]="doppelte Referenz -- auf Seite --",
- ["en"]="duplicate reference -- on page --",
- ["fr"]="réference -- dupliquée à la page --",
- ["it"]="riferimento duplicato -- a pagina --",
- ["nl"]="dubbele verwijzing -- op pagina --",
- ["no"]="duplikat referanse -- pø side --",
- ["ro"]="referinta duplicat -- la pagina --",
- },
- ["21"]={
- ["cs"]="dokument -- nacten",
- ["de"]="Dokument -- geladen",
- ["en"]="document -- loaded",
- ["fr"]="document -- chargé",
- ["it"]="documento -- caricato",
- ["nl"]="document -- geladen",
- ["no"]="dokument -- er lest inn",
- ["ro"]="documentul -- este incarcat",
- },
- ["22"]={
- ["cs"]="dokument -- neni interaktivni",
- ["de"]="Dokument -- ist nicht aktiv",
- ["en"]="document -- is not interactive",
- ["fr"]="le document -- n'est pas interactif",
- ["it"]="il documento -- non ø interattivo",
- ["nl"]="document -- is niet interactief",
- ["no"]="dokument -- er ikke interaktivt",
- ["ro"]="documentul -- nu este interactiv",
- },
- ["23"]={
- ["cs"]="obskurni (nejasna) reference -- (prefix=--)",
- ["de"]="Obskure Referenz -- (Prefix=--)",
- ["en"]="obscure reference -- (prefix=--)",
- ["fr"]="reference -- indéterminé (préfixe=--)",
- ["it"]="riferimento ambiguo -- (prefisso=--)",
- ["nl"]="onduidelijke verwijzing -- (prefix=--)",
- ["no"]="obskur referanse -- (Prefix=--)",
- ["ro"]="referinta obscura -- (prefix=--)",
- },
- ["24"]={
- ["en"]="references from document '--' are not exported",
- },
- ["25"]={
- ["en"]="references from document '--' are not imported (export again)",
- },
- ["26"]={
- ["en"]="references from document '--' are imported",
- },
- ["3"]={
- ["cs"]="neznamy typ reference --",
- ["de"]="unbekannte Referenz Typ --",
- ["en"]="unknown reference type --",
- ["fr"]="type -- de réference inconnu",
- ["it"]="riferimento di tipo sconosciuto --",
- ["nl"]="type verwijzing -- onbekend",
- ["no"]="ukjent referansetype --",
- ["ro"]="tip necunoscut de referinta --",
- },
- ["30"]={
- ["cs"]="neznamy objekt --",
- ["de"]="unbekanntes Object --",
- ["en"]="unknown object --",
- ["fr"]="objet -- inconnu",
- ["it"]="oggetto sconosciuto --",
- ["nl"]="onbekend object --",
- ["no"]="ukjent objekt --",
- ["ro"]="obiect necunoscut --",
- },
- ["31"]={
- ["cs"]="duplicitni object --",
- ["de"]="doppeltes Object --",
- ["en"]="duplicate object --",
- ["fr"]="objet -- dupliqué",
- ["it"]="oggetto duplicato --",
- ["nl"]="dubbel object --",
- ["no"]="duplikat objekt --",
- ["ro"]="obiect duplicat --",
- },
- ["4"]={
- ["cs"]="nedovolena reference --",
- ["de"]="illegale Referenz --",
- ["en"]="illegal reference --",
- ["fr"]="réference -- inconnue",
- ["it"]="riferimento illecito --",
- ["nl"]="verboden verwijzing --",
- ["no"]="ulovlig referanse --",
- ["ro"]="referinta eronata --",
- },
- ["files"]={ "core-obj.tex", "core-ref.tex", "strc-ref.tex" },
- ["title"]={
- ["cs"]="reference",
- ["de"]="referenzen",
- ["en"]="references",
- ["fr"]="réferences",
- ["it"]="riferimenti",
- ["nl"]="verwijzingen",
- ["no"]="referanser",
- ["ro"]="referinte",
- },
- },
- ["regimes"]={
- ["1"]={
- ["cs"]="kodovani --",
- ["de"]="Kodierung --",
- ["en"]="regime --",
- ["fr"]="encodage --",
- ["it"]="codifica --",
- ["nl"]="regime --",
- ["no"]="koding --",
- ["ro"]="codificarea --",
- },
- ["2"]={
- ["cs"]="je nacteno kodovani --",
- ["de"]="Kodierung -- ist geladen",
- ["en"]="regime -- is loaded",
- ["fr"]="l'encodage -- est chargé",
- ["it"]="codifica -- caricata",
- ["nl"]="regime -- wordt geladen",
- ["no"]="koding -- er lest inn",
- ["ro"]="codificarea -- este Encarcata",
- },
- ["3"]={
- ["cs"]="nezname kodovani --",
- ["de"]="Unbekannte Kodierung --",
- ["en"]="unknown regime --",
- ["fr"]="encodage -- inconnu",
- ["it"]="codifica sconosciuta --",
- ["nl"]="onbekend regime --",
- ["no"]="ukjent koding --",
- ["ro"]="codificarea -- este necunoscuta",
- },
- ["files"]={ "regi-ini.mkii" },
- ["title"]={
- ["cs"]="kodovani",
- ["de"]="Kodierung",
- ["en"]="regime",
- ["fr"]="encodage",
- ["it"]="codifica",
- ["nl"]="regime",
- ["no"]="koding",
- ["ro"]="codificari",
- },
- },
- ["specials"]={
- ["1"]={
- ["cs"]="-- nacteno",
- ["de"]="-- geladen",
- ["en"]="-- loaded",
- ["fr"]="-- chargé",
- ["it"]="-- caricato",
- ["nl"]="-- geladen",
- ["no"]="-- er lest inn",
- ["ro"]="-- incarcat",
- },
- ["2"]={
- ["cs"]="neni dovoleno hlubsi zanoreni --",
- ["de"]="keine tiefere Verschachtelung erlaubt --",
- ["en"]="no deeper nesting is permitted --",
- ["fr"]="pas d'imbracations plus profondes ne sont permises --",
- ["it"]="non ø permesso un annidamento maggiore --",
- ["nl"]="verdere nesting is niet toegestaan --",
- ["no"]="dypere 'nesting' er ikke tillatt --",
- ["ro"]="nu este permis un nivel de imbricare mai mare --",
- },
- ["3"]={
- ["cs"]="-- je resetovano",
- ["de"]="-- ist zurueckgesetzt",
- ["en"]="-- is reset",
- ["fr"]="-- est remis à zéro",
- ["it"]="-- reimpostato",
- ["nl"]="-- gereset",
- ["no"]="-- er tilbakestilt",
- ["ro"]="-- s-a resetat",
- },
- ["4"]={
- ["cs"]="prikaz -- neexistuje",
- ["de"]="Befehl -- existiert nicht",
- ["en"]="command -- does not exist",
- ["fr"]="la commande -- n'existe pas",
- ["it"]="il comando -- non esiste",
- ["nl"]="commando -- bestaat niet",
- ["no"]="kommando -- eksisterer ikke",
- ["ro"]="comanda -- nu exista",
- },
- ["5"]={
- ["cs"]="nacita se definicni soubor --",
- ["de"]="lade Definitionsdatei --",
- ["en"]="loading definition file --",
- ["fr"]="chargement du fichier de définition --",
- ["it"]="caricamento del file di definizione --",
- ["nl"]="definitiefile -- wordt geladen",
- ["no"]="leser inn definisjonsfil for --",
- ["ro"]="se incarca fisierul de definitii --",
- },
- ["6"]={
- ["cs"]="zanoreni neni dovoleno",
- ["de"]="Verschachtelung nicht erlaubt",
- ["en"]="nesting is not permitted",
- ["fr"]="l'imbrication n'est pas permise",
- ["it"]="annidamento non permesso",
- ["nl"]="nesting is niet toegestaan",
- ["no"]="'nesting' er ikke tillatt",
- ["ro"]="imbricarea nu este permisa",
- },
- ["7"]={
- ["cs"]="neznamy ovladac (driver) --",
- ["de"]="unbekante Driver --",
- ["en"]="unknown driver --",
- ["fr"]="pilote -- inconnu",
- ["it"]="driver sconosciuto --",
- ["nl"]="onbekende driver --",
- ["no"]="ukjent driver --",
- ["ro"]="driver necunoscut --",
- },
- ["files"]={ "spec-ini.tex" },
- ["title"]={
- ["cs"]="speciality",
- ["de"]="spezielles",
- ["en"]="specials",
- ["fr"]="specials",
- ["it"]="specialitø",
- ["nl"]="specials",
- ["no"]="specials",
- ["ro"]="specials",
- },
- },
- ["structures"]={
- ["1"]={
- ["cs"]="zacatek oddilu (sekce) --",
- ["de"]="Begin des Abschnittsblocks --",
- ["en"]="begin of sectionblock --",
- ["fr"]="début de blocsection --",
- ["it"]="inizio del blocco (sezione) --",
- ["nl"]="begin van sectieblok --",
- ["no"]="starten av blokk -- (seksjon)",
- ["ro"]="inceput de bloc sectiune --",
- },
- ["2"]={
- ["cs"]="konec oddilu (sekce) --",
- ["de"]="Ende des Abschnittsblocks --",
- ["en"]="end of sectionblock --",
- ["fr"]="fin de blocsection --",
- ["it"]="fine del blocco (sezione) --",
- ["nl"]="eind van sectieblok --",
- ["no"]="slutten av blokk -- (seksjon)",
- ["ro"]="sfarsit de bloc sectiune --",
- },
- ["files"]={ "core-sec.mkii", "core-sec.mkiv", "strc-sbe.tex" },
- ["title"]={
- ["cs"]="struktury",
- ["de"]="struktur",
- ["en"]="structure",
- ["fr"]="structure",
- ["it"]="struttura",
- ["nl"]="structuur",
- ["no"]="struktur",
- ["ro"]="structuri",
- },
- },
- ["symbols"]={
- ["1"]={
- ["cs"]="nacita se soubor symbolu --",
- ["de"]="Lade Symboldatei --",
- ["en"]="loading symbolset --",
- ["fr"]="chargement du jeu de symbole --",
- ["it"]="caricamento gruppo di simboli --",
- ["nl"]="symboolset -- wordt geladen",
- ["no"]="leser inn symbolsett --",
- ["ro"]="se incarca setul de simboluri --",
- },
- ["files"]={ "symb-ini.tex" },
- ["title"]={
- ["cs"]="symboly",
- ["de"]="Symbole",
- ["en"]="symbols",
- ["fr"]="symboles",
- ["it"]="simboli",
- ["nl"]="symbolen",
- ["no"]="symboler",
- ["ro"]="simboluri",
- },
- },
- ["systems"]={
- ["1"]={
- ["cs"]="nacteni pomocneho souboru odlozeno (typemode)",
- ["de"]="Laden der Hilfsdatei aufgeschoben (Eingabe-Modus)",
- ["en"]="loading utility-file postponed (typemode)",
- ["fr"]="chargement de fichier utilitaire reporté (typemode)",
- ["it"]="caricamento dei file supplementari posticipato (typemode)",
- ["nl"]="laden hulpfile uitgesteld (typemode)",
- ["no"]="innlesning av hjelpefila utsatt (typemode)",
- ["ro"]="se incarca utilitarul-fisierul este amanat (typemode)",
- },
- ["10"]={
- ["cs"]="nepouzivejte em v --",
- ["de"]="Benutzte kein em in --",
- ["en"]="don't use em in --",
- ["fr"]="n'utilisez pas em dans --",
- ["it"]="non usare em in --",
- ["nl"]="gebruik geen em in --",
- ["no"]="ikke bruk em i --",
- ["ro"]="nu folositi em in --",
- },
- ["11"]={
- ["cs"]="vytvarim jednoduchy pomocny soubor",
- ["de"]="Erstelle einfache Hilfdatei",
- ["en"]="building simple util",
- ["fr"]="construction util simple",
- ["it"]="costruzione di un semplice supplemento",
- ["nl"]="aanmaken basale hulpfile",
- ["no"]="lager enkel hjelpefil",
- ["ro"]="se creeaza un utilitar simplu",
- },
- ["12"]={
- ["cs"]="pomosny soubor neni setriden, pouzijte texutil",
- ["de"]="Die Hilfdatei ist nicht sortiert, verwende texutil",
- ["en"]="the utility-file is not sorted, use texutil",
- ["fr"]="le fichier utilitaire n'est pas trié, utilise texutil",
- ["it"]="file di supplemento non ordinato, usare texutil",
- ["nl"]="de hulpfile is niet gesorteerd, gebruik texutil",
- ["no"]="hjelpefila er ikke sortert, bruk texutil",
- ["ro"]="fisierul utilitar nu este sortat, folositi texutil",
- },
- ["13"]={
- ["cs"]="znacka -- definovana --",
- ["de"]="Beschriftung -- definiert --",
- ["en"]="mark -- defined --",
- ["fr"]="marquage -- defini --",
- ["it"]="marcatura -- definita --",
- ["nl"]="markering -- gedefinieerd --",
- ["no"]="markering -- definert --",
- ["ro"]="marcajul -- definit --",
- },
- ["14"]={
- ["cs"]="vynucena nova stranka v seznamu na --",
- ["de"]="Erzwungendes Seitenumbruch in Liste bei --",
- ["en"]="forced newpage in list at --",
- ["fr"]="nouvellepage forcée dans la liste à --",
- ["it"]="nuova pagina obbligata in lista a --",
- ["nl"]="geforceerde paginaovergang in lijst voor --",
- ["no"]="tvunget sideskift i liste ved --",
- ["ro"]="s-a fortat trecere pa pagina noua in lista la --",
- },
- ["15"]={
- ["cs"]="uklada se buffer --",
- ["de"]="Speichere Buffer --",
- ["en"]="saving buffer --",
- ["fr"]="sauvegarde du tampon (buffer) --",
- ["it"]="salvataggio del buffer --",
- ["nl"]="wegschrijven buffer --",
- ["no"]="lagrer Buffer --",
- ["ro"]="buffer salvat --",
- },
- ["16"]={
- ["cs"]="sazi se buffer --",
- ["de"]="Setzte Buffer --",
- ["en"]="typesetting buffer --",
- ["fr"]="composition du tampon (buffer) --",
- ["it"]="composizione del buffer --",
- ["nl"]="inlezen buffer --",
- ["no"]="tegnsetter buffer --",
- ["ro"]="buffer-ul -- s-a cules",
- },
- ["17"]={
- ["cs"]="sazi se doslovny (verbatim) buffer --",
- ["de"]="Setzte tippen-Buffer --",
- ["en"]="typesetting verbatim buffer --",
- ["fr"]="composition textuelle du tampon (buffer) --",
- ["it"]="composizione verbatim del buffer --",
- ["nl"]="verbatim inlezen buffer --",
- ["no"]="tegnsetter verbatim-buffer --",
- ["ro"]="se culege buffer-ul verbatim --",
- },
- ["18"]={
- ["cs"]="synonymum -- -- neexistuje",
- ["de"]="Synonym -- -- existiert nicht",
- ["en"]="synonym -- -- does not exist",
- ["fr"]="le synonyme -- -- n'existe pas",
- ["it"]="sinonimo -- -- non esistente",
- ["nl"]="synoniem -- -- bestaat niet",
- ["no"]="synonym -- -- eksisterer ikke",
- ["ro"]="sinonimul -- -- nu exista",
- },
- ["19"]={
- ["cs"]="vyznam (synonyma) -- nacten",
- ["de"]="Bedeutung (synonyme) von -- geladen",
- ["en"]="meaning (synonyms) of -- loaded",
- ["fr"]="signification (synonymes) de -- chargée",
- ["it"]="significato (sinonimi) di -- caricato",
- ["nl"]="betekenissen (synoniemen) van -- geladen",
- ["no"]="betydning (synonymer) av -- er lest inn",
- ["ro"]="intelesul (sinonimele) pentru -- incarcat",
- },
- ["2"]={
- ["cs"]="-- nacteno",
- ["de"]="-- geladen",
- ["en"]="-- loaded",
- ["fr"]="-- chargé",
- ["it"]="-- caricato",
- ["nl"]="-- geladen",
- ["no"]="-- er lest inn",
- ["ro"]="-- s-a incarcat",
- },
- ["20"]={
- ["cs"]="vyznam (trideni) -- nacten",
- ["de"]="Bedeutung (sortieren) von -- geladen",
- ["en"]="meaning (sorts) of -- loaded",
- ["fr"]="signification (tris) de -- chargée",
- ["it"]="significato (specie) di -- caricato",
- ["nl"]="betekenissen (sorteren) van -- geladen",
- ["no"]="betydning (sorterer) av -- er lest inn",
- ["ro"]="intelesul (ordinea) pentru -- incarcat",
- },
- ["21"]={
- ["cs"]="pomocny soubor necten",
- ["de"]="Die Hilfsdatei ist nicht geladen",
- ["en"]="no utility data is loaded",
- ["fr"]="pas de données utilitaires chargées",
- ["it"]="nessuna informazione supplementare caricata",
- ["nl"]="de hulpfile is niet geladen",
- ["no"]="hjelpefila er ikke lest inn",
- ["ro"]="nici o data utilitara nu este incarcata",
- },
- ["22"]={
- ["cs"]="pouzijte platny pomocny soubor",
- ["de"]="Benoetige gueltige Hilfsdateie",
- ["en"]="use a valid utilityfile",
- ["fr"]="utilise un fichier utilitaire valide",
- ["it"]="usare un file supplementare valido",
- ["nl"]="gebruik een goede hulpfile",
- ["no"]="bruk en gyldig hjelpefil",
- ["ro"]="folositi un fisier utilitar valid",
- },
- ["23"]={
- ["cs"]="-- upraveno na --",
- ["de"]="-- angeordnet auf --",
- ["en"]="-- arranged at --",
- ["fr"]="-- arrangé à --",
- ["it"]="-- sistemato a --",
- ["nl"]="-- gearrangeerd op --",
- ["no"]="-- arrangert på --",
- ["ro"]="-- aranjat la --",
- },
- ["24"]={
- ["cs"]="plovouci bloky",
- ["de"]="Fliessbloecke",
- ["en"]="Floatblocks",
- ["fr"]="blocsflottants",
- ["it"]="Oggetti mobili",
- ["nl"]="Plaatsblokken",
- ["no"]="Flytblokker",
- ["ro"]="Blocuri",
- },
- ["25"]={
- ["cs"]="reference",
- ["de"]="Referenzen",
- ["en"]="References",
- ["fr"]="Réferences",
- ["it"]="Riferimenti",
- ["nl"]="Verwijzingen",
- ["no"]="Referanser",
- ["ro"]="Referinte",
- },
- ["26"]={
- ["cs"]="registry",
- ["de"]="Register",
- ["en"]="Registers",
- ["fr"]="Registres",
- ["it"]="Registri",
- ["nl"]="Registers",
- ["no"]="Registere",
- ["ro"]="Registri",
- },
- ["27"]={
- ["cs"]="verze",
- ["de"]="Version",
- ["en"]="Version",
- ["fr"]="Version",
- ["it"]="Versione",
- ["nl"]="Versie",
- ["no"]="Versjon",
- ["ro"]="Versiune",
- },
- ["4"]={
- ["cs"]="prikaz -- je jiz definovan",
- ["de"]="Befehl -- ist bereits definiert",
- ["en"]="command -- is already defined",
- ["fr"]="la commande -- est déjà définie",
- ["it"]="comando -- già definito",
- ["nl"]="commando -- is al gedefinieerd",
- ["no"]="kommando -- er allerede definert",
- ["ro"]="comanda -- este deja definita",
- },
- ["41"]={
- ["cs"]="externi soubor -- ve skupine -- neexistuje",
- ["de"]="Externe Datei -- in Gruppe -- existiert nicht",
- ["en"]="external file -- in group -- does not exist",
- ["fr"]="le fichier externe -- du groupe -- n'existe pas",
- ["it"]="il file esterno -- del gruppo -- non esiste",
- ["nl"]="externe file -- in groep -- bestaat niet",
- ["no"]="ekstern fil -- i gruppe -- eksisterer ikke",
- ["ro"]="fisierul extern -- din grupul -- nu exista",
- },
- ["5"]={
- ["cs"]="makra z -- nactena",
- ["de"]="Modul -- geladen",
- ["en"]="module -- loaded",
- ["fr"]="module -- chargé",
- ["it"]="macro del modulo -- caricate",
- ["nl"]="module -- geladen",
- ["no"]="makroene i modul -- er lest inn",
- ["ro"]="macro-urile din modulul -- s-au incarcat",
- },
- ["6"]={
- ["cs"]="zadna makra v -- nenalezena",
- ["de"]="Modul -- gefunden",
- ["en"]="module -- not found",
- ["fr"]="module -- non trouvé",
- ["it"]="nessuna macro trovata nel modulo --",
- ["nl"]="geen module -- gevonden",
- ["no"]="ingen makroer funnet i modul ---",
- ["ro"]="nu s-au gasit macro-uri in modulul --",
- },
- ["7"]={
- ["cs"]="makra z -- jsou jiz nactena",
- ["de"]="Modul -- bereits geladen",
- ["en"]="module -- already loaded",
- ["fr"]="module -- déjà chargé",
- ["it"]="macro del modulo -- già caricate",
- ["nl"]="module -- reeds geladen",
- ["no"]="makroene i modul -- er allerede lest inn",
- ["ro"]="macro-urile din modulul -- s-au incarcat deja",
- },
- ["8"]={
- ["cs"]="nova verze pomocneho souboru, je treba druheho behu",
- ["de"]="Neue Version der Hilfsdatei, zweiter Durchlauf benoetigt",
- ["en"]="new version of utility file, second pass needed",
- ["fr"]="nouvelle version de fichier utilitaire, seconde passe nécessaire",
- ["it"]="nuova versione del file supplementare, seconda passata necessaria",
- ["nl"]="nieuwe versie hulpfile, tweede run nodig",
- ["no"]="ny versjon av hjelpefil, andre gjennomkjøring nødvendig",
- ["ro"]="o noua versiune de fisier utilitar, este necesara o noua trecere",
- },
- ["9"]={
- ["cs"]="-- nenalezeno/nezpracovano",
- ["de"]="-- nicht gefunden/verarbeitet",
- ["en"]="-- not found/processed",
- ["fr"]="-- non trouvé/traité",
- ["it"]="-- non trovato/elaborato",
- ["nl"]="-- niet gevonden/geplaatst",
- ["no"]="-- ikke funnet/behandlet",
- ["ro"]="-- nu este gasit/procesat",
- },
- ["91"]={
- ["en"]="papertray --",
- ["nl"]="papierlade --",
- },
- ["files"]={ "core-mis.tex", "page-ini.tex", "prag-gen.tex", "strc-mar.tex" },
- ["title"]={
- ["cs"]="system",
- ["de"]="system",
- ["en"]="system",
- ["fr"]="système",
- ["it"]="sistema",
- ["nl"]="systeem",
- ["no"]="system",
- ["ro"]="sistem",
- },
- },
- ["textblocks"]={
- ["1"]={
- ["cs"]="nova verze, je treba druhy beh",
- ["de"]="neue Version, zweiter Durchlauf benoetigt",
- ["en"]="new version, second pass needed",
- ["fr"]="nouvelle version, une seconde passe est nécessaire",
- ["it"]="nuova versione, seconda passata necessaria",
- ["nl"]="nieuwe versie, tweede run nodig",
- ["no"]="ny versjon, andre gjennomkjøring nødvendig",
- ["ro"]="o noua versiune, este nevoie de inca o trecere",
- },
- ["10"]={
- ["cs"]="-- nacteno a zpracovano",
- ["de"]="-- geladen und verarbeitet",
- ["en"]="-- loaded and processed",
- ["fr"]="-- chargé et traité",
- ["it"]="-- caricato ed elaborato",
- ["nl"]="-- geladen en verwerkt",
- ["no"]="-- lest inn og behandlet",
- ["ro"]="-- incarcat si procesat",
- },
- ["11"]={
- ["cs"]="-- nacteno a vysazeno",
- ["de"]="-- geladen und gesetzt",
- ["en"]="-- loaded and typeset",
- ["fr"]="-- chargé et composé",
- ["it"]="-- caricato e composto",
- ["nl"]="-- geladen en geplaatst",
- ["no"]="-- lest inn og tegnsatt",
- ["ro"]="-- incarcat si cules",
- },
- ["12"]={
- ["cs"]="-- preskoceno",
- ["de"]="-- ausgelassen",
- ["en"]="-- skipped",
- ["fr"]="-- sauté",
- ["it"]="-- saltato",
- ["nl"]="-- overgeslagen",
- ["no"]="-- utelatt",
- ["ro"]="-- sarit peste",
- },
- ["2"]={
- ["cs"]="zapisuji bloky do --",
- ["de"]="schreibe Bloecke zu --",
- ["en"]="writing blocks to --",
- ["fr"]="ecriture des blocs vers --",
- ["it"]="scrittura dei blocchi su --",
- ["nl"]="wegschrijven blokken naar --",
- ["no"]="skriver blokker til --",
- ["ro"]="se scriu blocurile in --",
- },
- ["3"]={
- ["cs"]="ctu bloky z --",
- ["de"]="lese Bloecke von --",
- ["en"]="reading blocks from --",
- ["fr"]="lecture des blocs en provenance de --",
- ["it"]="lettura dei blocchi da --",
- ["nl"]="inlezen blokken uit --",
- ["no"]="leser blokker fra --",
- ["ro"]="se citesc blocurile din --",
- },
- ["4"]={
- ["cs"]="je treba druhy beh",
- ["de"]="zweiter Durchlauf benoetigt",
- ["en"]="second pass needed",
- ["fr"]="seconde passe nécessaire",
- ["it"]="seconda passata necessaria",
- ["nl"]="er is een tweede run nodig",
- ["no"]="andre gjennomkjøring nødvendig",
- ["ro"]="este nevoie de inca o trecere",
- },
- ["5"]={
- ["cs"]="-- neni skryto",
- ["de"]="-- nicht verborgen",
- ["en"]="-- not hidden",
- ["fr"]="-- non caché",
- ["it"]="-- non nascosto",
- ["nl"]="-- niet verborgen",
- ["no"]="-- ikke skjult",
- ["ro"]="-- nu este ascuns",
- },
- ["6"]={
- ["cs"]="-- skryto a zpracovano",
- ["de"]="-- verborgen und verarbeitet",
- ["en"]="-- hidden and processed",
- ["fr"]="-- caché et traité",
- ["it"]="-- nascosto ed elaborato",
- ["nl"]="-- verborgen en verwerkt",
- ["no"]="-- skjult og behandlet",
- ["ro"]="-- ascuns si procesat",
- },
- ["7"]={
- ["cs"]="-- skryto",
- ["de"]="-- verborgen",
- ["en"]="-- hidden",
- ["fr"]="-- caché",
- ["it"]="-- nascosto",
- ["nl"]="-- verborgen",
- ["no"]="-- skjult",
- ["ro"]="-- ascuns",
- },
- ["8"]={
- ["cs"]="-- vysazeno",
- ["de"]="-- gesetzt",
- ["en"]="-- typeset",
- ["fr"]="-- composé",
- ["it"]="-- composto",
- ["nl"]="-- gehandhaafd",
- ["no"]="-- tegnsatt",
- ["ro"]="-- cules",
- },
- ["9"]={
- ["cs"]="-- nevysazeno",
- ["de"]="-- nicht gesetzt",
- ["en"]="-- not typeset",
- ["fr"]="-- non composé",
- ["it"]="-- non composto",
- ["nl"]="-- niet gehandhaafd",
- ["no"]="-- ikke tegnsatt",
- ["ro"]="-- nu este cules",
- },
- ["files"]={ "core-blk.tex" },
- ["title"]={
- ["cs"]="textovyblok",
- ["de"]="textblock",
- ["en"]="textblocks",
- ["fr"]="blocs de texte",
- ["it"]="blocchi di testo",
- ["nl"]="tekstblokken",
- ["no"]="tekstblokker",
- ["ro"]="blocuri de text",
- },
- },
- ["verbatims"]={
- ["1"]={
- ["cs"]="soubor -- neexistuje",
- ["de"]="Datei -- existiert nicht",
- ["en"]="file -- does not exist",
- ["fr"]="le fichier -- n'existe pas",
- ["it"]="il file -- non esiste",
- ["nl"]="file -- bestaat niet",
- ["no"]="fil -- eksisterer ikke",
- ["ro"]="fisierul -- nu exista",
- },
- ["files"]={ "core-ver.tex" },
- ["title"]={
- ["cs"]="verbatim",
- ["de"]="verbatim",
- ["en"]="verbatim",
- ["fr"]="verbatim",
- ["it"]="verbatim",
- ["nl"]="typen",
- ["no"]="verbatim",
- ["ro"]="verbatim",
- },
- },
- ["versions"]={
- ["1"]={
- ["cs"]="postradam @+",
- ["de"]="fehlendes @+",
- ["en"]="missing @+",
- ["fr"]="@+ manquant",
- ["it"]="@+ mancante",
- ["nl"]="er mankeert een @+",
- ["no"]="manglende @+",
- ["ro"]="lipseste @+",
- },
- ["2"]={
- ["cs"]="oznacuji se strany",
- ["de"]="Erstelle Seiten",
- ["en"]="marking pages",
- ["fr"]="marquage des pages",
- ["it"]="marcatura pagine",
- ["nl"]="markeren pagina's",
- ["no"]="markerer sider",
- ["ro"]="pagini marcate",
- },
- ["3"]={
- ["cs"]="oznacene strany: --",
- ["de"]="Ausgewaehlte Seiten: --",
- ["en"]="selected pages: --",
- ["fr"]="pages sélectionnées : --",
- ["it"]="pagine selezionate: --",
- ["nl"]="geselecteerde pagina's: --",
- ["no"]="valgte sider: --",
- ["ro"]="pagini selectate: --",
- },
- ["files"]={ "core-int.tex" },
- ["title"]={
- ["cs"]="verze",
- ["de"]="Version",
- ["en"]="version",
- ["fr"]="version",
- ["it"]="version",
- ["nl"]="versie",
- ["no"]="versjon",
- ["ro"]="versiuni",
- },
- },
+ formats = {
+ ["adapted: preamble '%s', state '%s', order '%s'"] = {
+ nl = "aangepast: preamble '%s', status '%s', volgorde '%s'",
+ },
+ ["already loaded: '%s'"] = {
+ nl = "al geladen: '%s'",
+ },
+ ["check:1"] = {
+ cs = "postradam '=' po '%s' na radku %s",
+ de = "Fehlendes '=' nach '%s' in Zeile %s",
+ en = "missing or ungrouped '=' after '%s' in line %s",
+ fr = "manquant ou dégroupé '=' après '%s' à la ligne %s",
+ it = "'=' mancante o non raggruppato dopo '%s' alla riga %s",
+ nl = "'=' ontbreekt of zonder {} na '%s' in regel %s",
+ no = "manglende '=' etter '%s' i linje %s",
+ ro = "lipseste '=' dupa '%s' in linia %s",
+ },
+ ["check:2"] = {
+ cs = "ocekavam %s argument(y) na radku %s",
+ de = "%s Argument(e) in Zeile %s erwartet",
+ en = "%s argument(s) expected in line %s",
+ fr = "%s argument(s) attendu(s) à la ligne %s",
+ it = "%s argomento/i attesi alla riga %s",
+ nl = "%s argument(en) verwacht in regel %s",
+ no = "%s argument forventet i linje %s",
+ ro = "argumentul(ele) %s sunt asteptate in linia %s",
+ },
+ ["check:3"] = {
+ cs = "%s %s nahrazuje makro, uzijte VERZALKY!",
+ de = "%s %s ersetzt ein Makro, verwende VERSALIEN!",
+ en = "%s %s replaces a macro, use CAPITALS!",
+ fr = "%s %s remplace une macro, utilisez des MAJUSCULES !",
+ it = "%s %s sostituisce una macro, usare le MAIUSCOLE!",
+ nl = "%s %s vervangt een macro, gebruik HOOFDLETTERS!",
+ no = "%s %s overskygger en makro, bruk STORE BOKSTAVER!",
+ ro = "%s %s inlocuieste un macro, folositi MAJUSCULE!",
+ },
+ ["checking file: '%s'"] = {
+ nl = "controleren file: '%s'",
+ },
+ ["checking url: '%s'"] = {
+ nl = "controleren url: '%s'",
+ },
+ ["colors:1"] = {
+ cs = "system %s je globalne aktivovana",
+ de = "system %s ist global aktiviert",
+ en = "system %s is global activated",
+ fr = "le système %s est globalement activé",
+ it = "sistema %s attivato globalmente",
+ nl = "systeem %s is globaal actief",
+ no = "system %s er aktivert globalt",
+ ro = "sistem %s este activata global",
+ },
+ ["colors:10"] = {
+ cs = "%s prostor barev je podporovan",
+ de = "%s Farbraum wird unterstuetzt",
+ en = "%s color space is supported",
+ fr = "%s l'espace de couleur est supporté",
+ it = "spazio dei colori %s supportato",
+ nl = "%s kleurruimte wordt ondersteund",
+ no = "%s fargerom er støttet",
+ ro = "spatiul de culoare %s este suportat",
+ },
+ ["colors:11"] = {
+ cs = "barva je prevedena na sed",
+ de = "Farbe wird in Grau umgewandelt",
+ en = "color is converted to gray",
+ fr = "la couleur est convertie en niveau de gris",
+ it = "il colore ø convertito in grigio",
+ nl = "kleur wordt vertaald in grijs",
+ no = "fargen vil bli vist som grø",
+ ro = "culoarea este convertita la gri",
+ },
+ ["colors:12"] = {
+ cs = "%s is registered",
+ de = "%s is registered",
+ en = "%s is registered",
+ fr = "%s est enregistré",
+ it = "%s is registered",
+ nl = "%s is geregistreerd",
+ no = "%s is registered",
+ ro = "%s is registered",
+ },
+ ["colors:2"] = {
+ cs = "system %s je lokalne activovana",
+ de = "system %s ist lokal aktiviert",
+ en = "system %s is local activated",
+ fr = "le système %s est localement activé",
+ it = "sistema %s attivato localmente",
+ nl = "systeem %s is lokaal actief",
+ no = "system %s er aktivert lokalt",
+ ro = "sistem %s este activata local",
+ },
+ ["colors:3"] = {
+ cs = "%s neni definovana %s",
+ de = "%s ist undefiniert %s",
+ en = "%s is not defined %s",
+ fr = "%s n'est pas défini %s",
+ it = "%s non definito %s",
+ nl = "%s is niet gedefinieerd %s",
+ no = "%s er udefinert %s",
+ ro = "%s nu este definita %s",
+ },
+ ["colors:4"] = {
+ cs = "system %s je nacten",
+ de = "system %s ist geladen",
+ en = "system %s is loaded",
+ fr = "le système %s est chargé",
+ it = "sistema %s caricato",
+ nl = "systeem %s wordt geladen",
+ no = "system %s er lest inn",
+ ro = "sistem %s este incarcata",
+ },
+ ["colors:5"] = {
+ cs = "neznamy system %s",
+ de = "unbekanntes System %s",
+ en = "unknown system %s",
+ fr = "système %s inconnu",
+ it = "sistema %s sconosciuto",
+ nl = "onbekend systeem %s",
+ no = "ukjent system %s",
+ ro = "sistem %s necunoscuta",
+ },
+ ["colors:6"] = {
+ cs = "palette %s je k dispozici",
+ de = "palette %s ist verfuegbar",
+ en = "palette %s is available",
+ fr = "la palette %s est disponible",
+ it = "tavolozza %s resa disponibile",
+ nl = "palet %s is beschikbaar",
+ no = "palett %s er tilgjengelig",
+ ro = "paleta %s este disponibila",
+ },
+ ["colors:7"] = {
+ cs = "palette %s neni k dispozici",
+ de = "palette %s ist nicht verfuegbar",
+ en = "palette %s is not available",
+ fr = "le palette %s n'est pas disponible",
+ it = "tavolozza %s non disponibile",
+ nl = "palet %s is niet beschikbaar",
+ no = "palett %s er ikke tilgjengelig",
+ ro = "palette %s nu este disponibila",
+ },
+ ["colors:8"] = {
+ cs = "specifikace %s v barve %s bude cerna",
+ de = "Spezifikation %s bei Farbe %s wird schwarz",
+ en = "specification %s at color %s becomes black",
+ fr = "la spécification %s de la couleur %s devient noire",
+ it = "specifica %s del colore %s convertita in nero",
+ nl = "specificatie %s bij %s wordt zwart",
+ no = "spesifikasjon %s for farge %s gir kun svart",
+ ro = "specificatia %s la culoarea %s devine neagra",
+ },
+ ["colors:9"] = {
+ cs = "%s prostor barev neni podporovan",
+ de = "%s Farbraum wird nicht unterstuetzt",
+ en = "%s color space is not supported",
+ fr = "l'espace de couleur %s n'est pas supporté",
+ it = "spazio dei colori %s non supportato",
+ nl = "%s kleurruimte wordt niet ondersteund",
+ no = "%s fargerom er ikke støttet",
+ ro = "spatiul de culoare %s nu este suportat",
+ },
+ ["columns:1"] = {
+ cs = "je mozno pouze %s sloupcu",
+ de = "nur %s Spalten moeglich",
+ en = "only %s columns possible",
+ fr = "seules %s colonnes possibles",
+ it = "solo %s colonne possibili",
+ nl = "maximaal %s kolommen",
+ no = "maksimalt %s kolonner",
+ ro = "este posibil numai %s coloane",
+ },
+ ["columns:10"] = {
+ cs = "zbyl (mene nez) 1 radek",
+ de = "(weniger als) 1 Zeile uebrig",
+ en = "(less than) 1 line left",
+ fr = "(moins de) 1 ligne restante",
+ it = "(meno di) una riga rimasta",
+ nl = "(minder dan) 1 regel over",
+ no = "(mindre enn) 1 linje igjen",
+ ro = "a mai ramas (mai putin de) 1 linie",
+ },
+ ["columns:11"] = {
+ cs = "plovouci objekt je pro sloupec prilis siroky",
+ de = "Gleitobjekt zu breit fuer Spalte",
+ en = "float too wide for column",
+ fr = "flottant mis à la largeur de la colonne",
+ it = "oggetto mobile troppo ampio per la colonna",
+ nl = "plaatsblok te breed voor kolom",
+ no = "flytblokk for bredt for kolonna",
+ ro = "blocul este prea lat pentru coloana",
+ },
+ ["columns:12"] = {
+ cs = "plovouci objekt je presunut do nasledujiciho sloupce / %s",
+ de = "Gleitobjekt in naechste Zeile verschoben / %s",
+ en = "float moved to next column / %s",
+ fr = "flottant déplacé à la colonne suivante / %s",
+ it = "oggetto mobile spostata alla colonna successiva / %s",
+ nl = "plaatsblok verplaatst naar volgende kolom / %s",
+ no = "flytblokk forskjøvet til neste kolonne / %s",
+ ro = "blocul este mutat pe urmatoarea coloana / %s",
+ },
+ ["columns:13"] = {
+ cs = "siroky plovouci objekt je presunut nad sloupce",
+ de = "breites Gleitobjekt an den Anfang der Spalten verschoben",
+ en = "wide float moved to top of columns",
+ fr = "flottant large déplacé dans la partie supérieure de la colonne",
+ it = "oggetto mobile ampio spostato sopra le colonne",
+ nl = "breed figuur geplaatst boven kolommen",
+ no = "bred flytblokk forksjøvet til toppen av kolonnene",
+ ro = "blocul lat este mutat in partea de sus a coloanelor",
+ },
+ ["columns:2"] = {
+ cs = "pouzijte \\string\\filbreak\\space jako alternativu",
+ de = "benutzte \\string\\filbreak\\space als Alternative",
+ en = "use \\string\\filbreak\\space as alternative",
+ fr = "utilisez \\string\\filbreak\\space en tant qu'alternative",
+ it = "in alternativa, usare \\string\\filbreak",
+ nl = "gebruik eventueel \\string\\filbreak",
+ no = "bruk \\string\\filbreak\\space som et alternativ",
+ ro = "folositi \\string\\filbreak\\space ca alternativa",
+ },
+ ["columns:3"] = {
+ cs = "problem, vypina se vyvazovani",
+ de = "Problem, verwende [ausgleich=nein]",
+ en = "problems, disable balancing",
+ fr = "problèmes, désactive l'équilibrage",
+ it = "problemi, disabilitare il bilanciamento",
+ nl = "probleempje, probeer [balanceren=nee]",
+ no = "problemer, slår av balansering",
+ ro = "probleme, se dezactiveaza alinierea",
+ },
+ ["columns:4"] = {
+ cs = "horni plovouci objekt jeste neni podporovan",
+ de = "Gleitobjekt oben ncoh nicht unterstuetzt",
+ en = "top float not yet supported",
+ fr = "flottant en partie supérieure pas encore supporté",
+ it = "float in cima non ancora supportato",
+ nl = "plaatsblok boven nog niet mogelijk",
+ no = "flytblokker øverst er ikke støttet enda",
+ ro = "cadrele top (top float) nu sunt inca suportate",
+ },
+ ["columns:5"] = {
+ cs = "spodni plovouci objekt jeste neni podporovan",
+ de = "Gleitobjekt unten ncoh nicht unterstuetzt",
+ en = "bottom float not yet supported",
+ fr = "flottant en partie inférieure pas encore supporté",
+ it = "float in fondo non ancora supportato",
+ nl = "plaatsblok onder nog niet mogelijk",
+ no = "flytblokker nedert er ikke støttet enda",
+ ro = "cadrele bottom (bottom float) nu sunt inca suportate",
+ },
+ ["columns:6"] = {
+ cs = "%s plovouci objekt(y) odlozeny",
+ de = "%s Gleitobjekt(e) verschoben",
+ en = "%s float(s) postponed",
+ fr = "%s flottant(s) reporté(s)",
+ it = "%s float(s) posticipate",
+ nl = "%s plaatsblok(en) opgeschort",
+ no = "%s flytblokk forskjøvet",
+ ro = "%s blocurile sunt amanate",
+ },
+ ["columns:7"] = {
+ cs = "vyvazovani ukonceno po 100 krocich",
+ de = "ausgleich nach 100 Schritten abgebrocheb",
+ en = "balancing aborted after 100 steps",
+ fr = "équilibrage abandonné après 100 pas",
+ it = "bilanciamento annullato dopo 100 passi",
+ nl = "balanceren afgebroken na 100 stappen",
+ no = "balansering avbrutt etter 100 iterasjoner",
+ ro = "alinierea este oprita dupa 100 de incercari",
+ },
+ ["columns:8"] = {
+ cs = "vyvazeno v %s krocich",
+ de = "ausgeglichen nach %s Schritt(en)",
+ en = "balanced in %s step(s)",
+ fr = "équilibré en %s pas",
+ it = "bilanciamento in %s passo/i",
+ nl = "gebalanceerd in %s stap(pen)",
+ no = "balansert etter %s iterasjoner",
+ ro = "aliniat in %s pas(i)",
+ },
+ ["columns:9"] = {
+ cs = "kontrola nerovnost",
+ de = "Ausrichtung ueberpruefen",
+ en = "check raggedness",
+ fr = "vérification des irrégularités",
+ it = "controllare seghettamento",
+ nl = "uitlijnen controleren!",
+ no = "kontroller tekstlayout!",
+ ro = "verificat alinierea",
+ },
+ ["databases:1"] = {
+ cs = "%s",
+ de = "%s",
+ en = "%s",
+ fr = "%s",
+ it = "%s",
+ nl = "%s",
+ no = "%s",
+ ro = "%s",
+ },
+ ["databases:2"] = {
+ cs = "local file %s",
+ de = "lokale Datei %s",
+ en = "local file %s",
+ fr = "fichier local %s",
+ it = "file locale %s",
+ nl = "lokaal bestand %s",
+ no = "lokal fil %s",
+ ro = "fisier local %s",
+ },
+ ["databases:3"] = {
+ cs = "global file %s",
+ de = "globale Datei %s",
+ en = "global file %s",
+ fr = "fichier global %s",
+ it = "file globale %s",
+ nl = "globaal bestand %s",
+ no = "global fil %s",
+ ro = "fisier global %s",
+ },
+ ["databases:4"] = {
+ cs = "unknown file %s",
+ de = "unbekannte Datei %s",
+ en = "unknown file %s",
+ fr = "fichier inconnu %s",
+ it = "file sconosciuto %s",
+ nl = "onbekend bestand %s",
+ no = "ukjent fil %s",
+ ro = "fisier necunoscut %s",
+ },
+ ["extended: preamble '%s', state '%s', order '%s'"] = {
+ nl = "uitgebreid: preamble '%s', status '%s', volgorde '%s'",
+ },
+ ["figures:1"] = {
+ cs = "obraz %s nelze nalezt",
+ de = "Abbildung %s kann nicht gefunden werden",
+ en = "figure %s can not be found",
+ fr = "la figure %s ne peut être trouvée",
+ it = "figura %s non trovata",
+ nl = "figuur %s is niet te vinden",
+ ro = "figura %s nu poate fi gasita",
+ },
+ ["figures:2"] = {
+ cs = "obraz %s nepritomen",
+ de = "Abbildung %s wird nicht erstellt",
+ en = "figure %s is not preset",
+ fr = "la figure %s n'est pas pré-sélectionnée",
+ it = "la figura %s non è preimpostata",
+ nl = "figuur %s wordt niet preset",
+ ro = "figura %s nu este presetata",
+ },
+ ["figures:3"] = {
+ cs = "dimensions of %s are determined externally",
+ de = "dimensions of %s are determined externally",
+ en = "dimensions of %s are determined externally",
+ fr = "dimensions of %s are determined externally",
+ it = "dimensions of %s are determined externally",
+ nl = "maten van %s worden extern vastgesteld",
+ ro = "dimensions of %s are determined externally",
+ },
+ ["figures:4"] = {
+ cs = "dimenze obrazu %s nacteny primo z jeho souboru",
+ de = "Dimensionen von %s geladen aus der Abbildungsdatei selbst",
+ en = "dimensions of %s loaded from figurefile itself",
+ fr = "les dimensions de %s chargées implicitement à partir du fichier de figure",
+ it = "dimensioni di %s caricate dal file di immagini stesso",
+ nl = "maten van %s geladen uit figuurfile zelf",
+ ro = "dimensiunea figurii %s se incarca din fisierul insusi",
+ },
+ ["figures:5"] = {
+ cs = "dimensions of %s are unknown",
+ de = "Dimensions of %s are unknown",
+ en = "dimensions of %s are unknown",
+ fr = "dimensions of %s are unknown",
+ it = "dimensions of %s are unknown",
+ nl = "maten van %s zijn onbekend",
+ ro = "dimensions of %s are unknown",
+ },
+ ["figures:6"] = {
+ cs = "dimenze obrazu %s spocteny programem rlxtools",
+ de = "Dimensionen von %s ausgerechnet durch rlxtools",
+ en = "dimensions of %s calculated by rlxtools",
+ fr = "les dimensions de %s calculées par rlxtools",
+ it = "dimensioni di %s calcolate da rlxtools",
+ nl = "maten van %s berekend door rlxtools",
+ ro = "dimensiunea figurii %s este calculata de rlxtools",
+ },
+ ["figures:8"] = {
+ cs = "obrazovy objekt %s je znovu pouzit",
+ de = "Abbildungobjekt %s wurde wiederverwandt",
+ en = "figureobject %s is reused",
+ fr = "figureobject %s est réutilisé",
+ it = "oggetto-figura %s riutilizzato",
+ nl = "figuurobject %s wordt opnieuw gebruikt",
+ ro = "obiectul figura %s este refolosit",
+ },
+ ["files:1"] = {
+ cs = "synonymum souboru %s je jiz pouzito pro %s",
+ de = "Dateisynonym %s wird bereits fuer %s benutzt",
+ en = "file synonym %s is already used for %s",
+ fr = "le synonyme de fichier %s est déjà utilisé pour %s",
+ it = "sinonimo file %s già in uso per %s",
+ nl = "file synoniem %s is al in gebruik voor %s",
+ no = "filesynonym %s er allerede brukt for %s",
+ ro = "sinonimul fisierelor %s este folosit deja pentru %s",
+ },
+ ["filters:1"] = {
+ cs = "filter %s is loaded",
+ de = "filter %s ist geladen",
+ en = "filter %s is loaded",
+ fr = "le filtre %s est chargé",
+ it = "filtro %s caricato",
+ nl = "filter %s wordt geladen",
+ },
+ ["filters:2"] = {
+ cs = "unknown filter %s",
+ de = "unknown filter %s",
+ en = "unknown filter %s",
+ fr = "filtre %s inconnu",
+ it = "filtro sconosciuto %s",
+ nl = "onbekend filter %s",
+ },
+ ["floatblocks:1"] = {
+ cs = "%s precislovano / %s => %s",
+ de = "%s neu nummeriert / %s => %s",
+ en = "%s renumbered / %s => %s",
+ fr = "%s renuméroté / %s => %s",
+ it = "%s rinumerato / %s => %s",
+ nl = "%s hernummerd / %s => %s",
+ no = "%s renummerert / %s => %s",
+ ro = "%s renumerotat / %s => %s",
+ },
+ ["floatblocks:10"] = {
+ cs = "%s omezeno",
+ de = "%s begrenzt",
+ en = "%s limited",
+ fr = "%s limité",
+ it = "%s limitato",
+ nl = "%s begrensd",
+ no = "%s begrenset",
+ ro = "%s limitat",
+ },
+ ["floatblocks:11"] = {
+ cs = "nedan zadny blok",
+ de = "kein Block gegeben",
+ en = "no block given",
+ fr = "pas de bloc donné",
+ it = "nessun oggetto specificato",
+ nl = "geen blok opgegeven",
+ no = "ingen blokk oppgitt",
+ ro = "nu este dat nici un bloc",
+ },
+ ["floatblocks:12"] = {
+ cs = "nedefinovano",
+ de = "undefiniert",
+ en = "undefined",
+ fr = "indéfini",
+ it = "non definito",
+ nl = "niet gedefinieerd",
+ no = "udefinert",
+ ro = "nedefinit",
+ },
+ ["floatblocks:13"] = {
+ cs = "there is nothing to split",
+ de = "there is nothing to split",
+ en = "there is nothing to split",
+ fr = "there is nothing to split",
+ it = "there is nothing to split",
+ nl = "er is niets te splitsen",
+ no = "there is nothing to split",
+ ro = "there is nothing to split",
+ },
+ ["floatblocks:2"] = {
+ cs = "%s ulozeno",
+ de = "%s gespeichert",
+ en = "%s saved",
+ fr = "%s sauvegardé",
+ it = "%s salvato",
+ nl = "%s bewaard",
+ no = "%s lagret",
+ ro = "%s salvat",
+ },
+ ["floatblocks:3"] = {
+ cs = "%s presunuto",
+ de = "%s verschoben",
+ en = "%s moved",
+ fr = "%s déplacé",
+ it = "%s mosso",
+ nl = "%s verplaatst",
+ no = "%s flyttet",
+ ro = "%s mutat",
+ },
+ ["floatblocks:4"] = {
+ cs = "%s umisteno",
+ de = "%s plaziert",
+ en = "%s placed",
+ fr = "%s placé",
+ it = "%s sistemato",
+ nl = "%s geplaatst",
+ no = "%s plassert",
+ ro = "%s plasat",
+ },
+ ["floatblocks:5"] = {
+ cs = "poradi prizpusobeno",
+ de = "Reihenfolge angepasst",
+ en = "order adapted",
+ fr = "ordre adapté",
+ it = "ordine aggiustato",
+ nl = "volgorde aangepast",
+ no = "rekkefølge tilpasset",
+ ro = "ordinea adaptata",
+ },
+ ["floatblocks:6"] = {
+ cs = "pocet hornich plovoucich objektu je omezen na %s",
+ de = "Anz. der oberen Gleitobjekte beschraengt auf %s",
+ en = "n of top floats limited to %s",
+ fr = "n flottants de haut de page limité à %s",
+ it = "n di top floats limitato a %s",
+ nl = "maximaal %s boven",
+ no = "maksimalt %s flytblokker øverst",
+ ro = "nr. cadrelor de sus limitat la %s",
+ },
+ ["floatblocks:7"] = {
+ cs = "pocet spodnich plovoucich objektu je omezen na %s",
+ de = "Anz. der unteren Gleitobjekte beschraengt auf %s",
+ en = "n of bottom floats limited to %s",
+ fr = "n flottants de bas de page limité à %s",
+ it = "n di bottom floats limitato a %s",
+ nl = "maximaal %s onder",
+ no = "maksimalt %s flytblokker nederst",
+ ro = "nr. blocurilor de jos limitat la %s",
+ },
+ ["floatblocks:8"] = {
+ cs = "radku je mene nez %s",
+ de = "weniger als %s zeilen",
+ en = "less than %s lines",
+ fr = "moins de %s lignes",
+ it = "meno di %s righe",
+ nl = "minder dan %s regels",
+ no = "mindre enn %s linjer",
+ ro = "mai putin de %s linii",
+ },
+ ["floatblocks:9"] = {
+ cs = "poradi naruseno",
+ de = "Reigenfolge gestoert",
+ en = "order disturbed",
+ fr = "ordre perturbé",
+ it = "ordine disturbato",
+ nl = "volgorde verstoord",
+ no = "rekkefølge endret",
+ ro = "ordinea deranjata",
+ },
+ ["flushed: preamble '%s'"] = {
+ nl = "weggeschreven: preamble '%s'",
+ },
+ ["fonts:1"] = {
+ cs = "kodovani %s",
+ de = "Kodierung %s",
+ en = "coding %s",
+ fr = "encodage %s",
+ it = "codifica %s",
+ nl = "codering %s",
+ no = "koding %s",
+ ro = "codificarea %s",
+ },
+ ["fonts:10"] = {
+ cs = "neznamy font %s",
+ de = "unbekanntes Font %s",
+ en = "unknown font file %s",
+ fr = "fichier de police %s inconnu",
+ it = "file di font sconosciuto %s",
+ nl = "onbekende font file %s",
+ no = "ukjent fontfil %s",
+ ro = "fisier font necunoscut %s",
+ },
+ ["fonts:14"] = {
+ cs = "bodyfont %s is defined (can better be done global)",
+ de = "Fliesstext %s wurde definiert (besser waere globale Definition)",
+ en = "bodyfont %s is defined (can better be done global)",
+ fr = "policecorps %s est défini (une définition globale pourrait être plus adéquat)",
+ it = "corpo del testo %s definito (sarebbe meglio globale)",
+ nl = "korps %s is gedefinieerd (kan beter globaal plaatsvinden)",
+ no = "bodyfont %s is defined (can better be done global)",
+ ro = "bodyfont %s is defined (can better be done global)",
+ },
+ ["fonts:2"] = {
+ cs = "varianta %s je nactena",
+ de = "Variante %s ist geladen",
+ en = "variant %s is loaded",
+ fr = "la variante %s est chargée",
+ it = "variante %s caricata",
+ nl = "variant %s wordt geladen",
+ no = "variant %s er lest inn",
+ ro = "varianta %s este incarcata",
+ },
+ ["fonts:3"] = {
+ cs = "neznama varianta %s",
+ de = "Unbekannte Variante %s",
+ en = "unknown variant %s",
+ fr = "variante %s inconnue",
+ it = "variante sconosciuta %s",
+ nl = "onbekende variant %s",
+ no = "ukjent variant %s",
+ ro = "varianta necunoscuta %s",
+ },
+ ["fonts:4"] = {
+ cs = "zakladni font %s neni definovan",
+ de = "Fliesstext %s ist nicht definiert",
+ en = "bodyfont %s is not defined",
+ fr = "policecorps %s n'est pas définie",
+ it = "corpo del testo %s non definito",
+ nl = "korps %s is niet gedefinieerd",
+ no = "hovedfont %s er ikke definert",
+ ro = "corpul de litere %s nu este definit",
+ },
+ ["fonts:5"] = {
+ cs = "styl %s neni definovan",
+ de = "Stil %s ist nicht definiert",
+ en = "style %s is not defined",
+ fr = "le style %s n'est pas défini",
+ it = "stile %s non definito",
+ nl = "stijl %s is niet gedefinieerd",
+ no = "stil %s er ikke definert",
+ ro = "stilul %s nu este definit",
+ },
+ ["fonts:6"] = {
+ cs = "%s je nacten",
+ de = "%s ist geladen",
+ en = "%s is loaded",
+ fr = "%s est chargé",
+ it = "%s caricato",
+ nl = "%s wordt geladen",
+ no = "%s er lest inn",
+ ro = "%s este incarcat",
+ },
+ ["fonts:7"] = {
+ cs = "neznamy format %s",
+ de = "unbekanntes Format %s",
+ en = "unknown format %s",
+ fr = "format %s inconnu",
+ it = "formato sconosciuto %s",
+ nl = "onbekend formaat %s",
+ no = "ukjent format %s",
+ ro = "format necunoscut %s",
+ },
+ ["fonts:8"] = {
+ cs = "styl %s definovan",
+ de = "Stil %s definiert",
+ en = "style %s defined",
+ fr = "style %s défini",
+ it = "stile %s definito",
+ nl = "stijl %s gedefinieerd",
+ no = "stil %s definert",
+ ro = "stilul %s definit",
+ },
+ ["interactions:1"] = {
+ cs = "pomer %s x %s (s x v)",
+ de = "Seitenverhaeltnis %s x %s (B x H)",
+ en = "aspect ratio %s x %s (b x h)",
+ fr = "ratio d'aspect %s x %s (b x h)",
+ it = "rapporto %s x %s (b x a)",
+ nl = "aspect ratio %s x %s (b x h)",
+ no = "forholdstall %s x %s (b x h)",
+ ro = "aspectul %s x %s (b x h)",
+ },
+ ["interactions:2"] = {
+ cs = "aktivni",
+ de = "aktiv",
+ en = "active",
+ fr = "actif",
+ it = "attiva",
+ nl = "actief",
+ no = "aktiv",
+ ro = "activ",
+ },
+ ["interactions:21"] = {
+ cs = "%s kod vlozen",
+ de = "%s Code eingefuegt",
+ en = "%s code inserted",
+ fr = "%s code inseré",
+ it = "codice %s inserito",
+ nl = "%s code tussengevoegd",
+ no = "%s kode satt inn / tilføyd",
+ ro = "%s cod inserat",
+ },
+ ["interactions:3"] = {
+ cs = "neaktivni",
+ de = "inaktiv",
+ en = "inactive",
+ fr = "inactif",
+ it = "inattiva",
+ nl = "niet actief",
+ no = "inaktiv",
+ ro = "inactiv",
+ },
+ ["interactions:4"] = {
+ cs = "zadna strankova synchronizace (%s) v hmode",
+ de = "keine Seitensynchronisation (%s) im hmode",
+ en = "no pagesynchronisation (%s) in hmode",
+ fr = "pas de synchronisation de page (%s) dans le hmode",
+ it = "sincronizzazione di pagina (%s) non disponibile in hmode",
+ nl = "geen paginasynchronisatie (%s) in hmode",
+ no = "ingen sidesynkronisering (%s) i hmode",
+ ro = "nu exista sincronizare pt. pagini (%s) in hmode",
+ },
+ ["interactions:5"] = {
+ cs = "unknown attachment %s",
+ de = "unknown attachment %s",
+ en = "unknown attachment %s",
+ fr = "le fichier joint %s est inconnu",
+ it = "unknown attachment %s",
+ nl = "onbekend attachment %s",
+ no = "unknown attachment %s",
+ ro = "unknown attachment %s",
+ },
+ ["interactions:6"] = {
+ cs = "attachment file %s does not exist",
+ de = "attachment file %s does not exist",
+ en = "attachment file %s does not exist",
+ fr = "le fichier joint %s n'existe pas",
+ it = "attachment file %s does not exist",
+ nl = "attachment file %s bestaat niet",
+ no = "attachment file %s does not exist",
+ ro = "attachment file %s does not exist",
+ },
+ ["languages:1"] = {
+ cs = "vzory %s pro %s nacteny (n=%s,e=%s,m=%s)",
+ de = "Trennmuster %s fuer %s geladen (n=%s,e=%s,m=%s)",
+ en = "patterns %s for %s loaded (n=%s,e=%s,m=%s)",
+ fr = "les motifs %s pour %s sont chargés (n=%s,e=%s,m=%s)",
+ it = "schemi %s per %s caricati (n=%s,e=%s,m=%s)",
+ nl = "afbreekpatronen %s voor %s geladen (n=%s,e=%s,m=%s)",
+ no = "orddelingsmønster %s for %s er lest inn (n=%s,e=%s,m=%s)",
+ ro = "sablonul %s pentru %s s-a incarcat (n=%s,e=%s,m=%s)",
+ },
+ ["languages:10"] = {
+ cs = "vzory %s nacteny",
+ de = "Trennmuster %s geladen",
+ en = "patterns %s loaded",
+ fr = "motifs %s chargés",
+ it = "schemi %s caricati",
+ nl = "patronen %sgeladen",
+ no = "orddelingsmønster %s er lest inn",
+ ro = "sabloanele %s incarcate",
+ },
+ ["languages:2"] = {
+ cs = "zadne vzory %s pro %s (n=%s,e=%s,m=%s) (%s,%s)",
+ de = "Keine Trennmuster %s fuer %s (n=%s,e=%s,m=%s) (%s,%s)",
+ en = "no patterns %s for %s (n=%s,e=%s,m=%s) (%s,%s)",
+ fr = "pas de motifs %s pour %s (n=%s,e=%s,m=%s) (%s,%s)",
+ it = "niente schemi %s per %s (n=%s,e=%s,m=%s) (%s,%s)",
+ nl = "geen afbreekpatronen %s voor %s (n=%s,e=%s,m=%s) (%s,%s)",
+ no = "ingen orddelingsmønster %s for %s (n=%s,e=%s,m=%s) (%s,%s)",
+ ro = "nu exista sabloane %s pentru %s (n=%s,e=%s,m=%s) (%s,%s)",
+ },
+ ["languages:3"] = {
+ cs = "deleni slov %s pro %s nacteno (n=%s,e=%s,m=%s)",
+ de = "Trenndefinitionen %s fuer %s geladen (n=%s,e=%s,m=%s)",
+ en = "hyphenations %s for %s loaded (n=%s,e=%s,m=%s)",
+ fr = "hyphenations %s pour %s chargés (n=%s,e=%s,m=%s)",
+ it = "sillabazione %s per %s caricata (n=%s,e=%s,m=%s)",
+ nl = "afbreekdefinities %s voor %s geladen (n=%s,e=%s,m=%s)",
+ no = "orddelingsdefinisjon %s for %s er lest inn (n=%s,e=%s,m=%s)",
+ ro = "despartirea in silabe %s pentru %s s-a incarcat (n=%s,e=%s,m=%s)",
+ },
+ ["languages:4"] = {
+ cs = "zadne deleni slov %s pro %s (n=%s,e=%s,m=%s)",
+ de = "Keine Trenndefinitionen %s fuer %s (n=%s,e=%s,m=%s)",
+ en = "no hyphenations %s for %s (n=%s,e=%s,m=%s)",
+ fr = "pas d'hyphenations %s pour %s (n=%s,e=%s,m=%s)",
+ it = "niente sillabazione %s per %s (n=%s,e=%s,m=%s)",
+ nl = "geen afbreekdefinities %s voor %s (n=%s,e=%s,m=%s)",
+ no = "ingen orddelingsdefinisjon %s for %s (n=%s,e=%s,m=%s)",
+ ro = "nu exista despartire in silabe %s pentru %s (n=%s,e=%s,m=%s)",
+ },
+ ["languages:5"] = {
+ cs = "vzory pro %s nenacteny",
+ de = "Trennmuster fuer %s nicht geladen",
+ en = "patterns for %s not loaded",
+ fr = "les motifs pour %s ne sont pas chargés",
+ it = "schemi per %s non caricati",
+ nl = "afbreekpatronen voor %s niet geladen",
+ no = "orddelingsmønster for %s er ikke lest inn",
+ ro = "sabloanele pentru %s nu sunt incarcate",
+ },
+ ["languages:6"] = {
+ cs = "jazyk %s neni definovan",
+ de = "Sprache %s ist undefiniert",
+ en = "language %s is undefined",
+ fr = "langue %s non définie",
+ it = "lingua %s non definita",
+ nl = "taal %s is niet gedefinieerd",
+ no = "spràk %s er udefinert",
+ ro = "limba %s nu este definita",
+ },
+ ["languages:7"] = {
+ cs = "specificke volby jazyka [%s] zavadeji %s (zavlecenou) mezeru",
+ de = "Sprachenspezifische Option [%s] fuegt eine Luecke von %s ein",
+ en = "language specific options [%s] introduce a %s skip",
+ fr = "les options spécifiques de langue [%s] introduisent un %s saut",
+ it = "opzioni specifiche per la lingua [%s] introducono un salto %s",
+ nl = "taal specifieke opties [%s] introduceren een skip van %s",
+ no = "spràk spesifikk opsjon [%s] introduserer et %s hopp",
+ ro = "optiunile specifice ale limbii [%s] introduc un spatiu %s",
+ },
+ ["languages:8"] = {
+ cs = "specificke volby jazyka [%s] bez mezer pripojeny",
+ de = "Sprachenspezifische Option [%s] nahtlos hinzugefuegt",
+ en = "language specific options [%s] seamless appended",
+ fr = "les options spécifiques de langue [%s] sont ajoutés en douceur",
+ it = "opzioni specifiche per la lingua [%s] aggiunte trasparentemente",
+ nl = "taal specifieke opties [%s] naadloos toegevoegd",
+ no = "spràk spesifikk opsjon [%s] problemfritt tilføyd",
+ ro = "optiunile specifice ale limbii [%s] adaugate",
+ },
+ ["languages:9"] = {
+ cs = "language %s is active",
+ de = "Sprache %s ist aktiv",
+ en = "language %s is active",
+ fr = "la langue %s est active",
+ it = "lingua %s attiva",
+ nl = "taal %s is actief",
+ no = "spràk %s er aktivt",
+ ro = "limba %s este activa",
+ },
+ ["layouts:1"] = {
+ cs = "vyska textu prizpusobena s %s na strane %s",
+ de = "Texthoehe angepasst mit %s auf Seite %s",
+ en = "textheight adapted with %s at page %s",
+ fr = "hauteurtexte adaptée avec %s à la page %s",
+ it = "altezza del testo adattata con %s a pagina %s",
+ nl = "teksthoogte aangepast met %s op pagina %s",
+ no = "teksthøyde tilpasset med %s på side %s",
+ ro = "textheight adaptat cu %s la pagina %s",
+ },
+ ["layouts:10"] = {
+ cs = "%s a %s nedava dohromady 1.0",
+ de = "%s und %s ergeben zusammen nicht 1.0",
+ en = "%s and %s don't add up to 1.0",
+ fr = "%s et %s ne sont pas ajoutés à 1.0",
+ it = "%s e %s non sommano a 1.0",
+ nl = "%s en %s tellen niet op tot 1.0",
+ no = "%s og %s er ikke 1.0 til sammen",
+ ro = "%s si %s nu se adauga pana la 1.0",
+ },
+ ["layouts:11"] = {
+ cs = "svisla mezera %s neni povolena v pevnem radkovem rejstriku",
+ de = "Zwischenraum %s nicht im Grittermoduserlau",
+ en = "spacing %s not permitted in gridmode",
+ fr = "espacement %s non permis en modegrille",
+ it = "spaziatura %s non permessa in modo griglia",
+ nl = "interlinie %s niet toegestaan in gridmode",
+ no = "mellomrom %s ikke tillatt i gridmodus",
+ ro = "spatierea %s nu este permisa in gridmode",
+ },
+ ["layouts:2"] = {
+ cs = "%s krat odlozeny text umisten",
+ de = "%s mal verschobener Text plaziert",
+ en = "%s times postponed text placed",
+ fr = "%s times postponed text placed",
+ it = "posizionato testo posticipato %s volte",
+ nl = "%s maal uitgestelde tekst tussengevoegd",
+ no = "%s ganger forskjøvet tekst plassert",
+ ro = "textul amanat de %s ori a fost plasat",
+ },
+ ["layouts:3"] = {
+ cs = "%s krat text odlozen",
+ de = "%s mal Text verschoben",
+ en = "%s times text postponed",
+ fr = "%s times text postponed",
+ it = "testo posticipato %s volte",
+ nl = "%s maal tekst plaatsen uitstellen",
+ no = "%s ganger tekst forskjøvet",
+ ro = "textul amanat de %s ori",
+ },
+ ["layouts:4"] = {
+ cs = "okrajove bloky aktivni",
+ de = "marginalbloecke aktiv",
+ en = "marginblocks active",
+ fr = "blocsmarge actifs",
+ it = "blocchi in margine attivi",
+ nl = "margeblokken actief",
+ no = "margblokker aktive",
+ ro = "blocuri marginale active",
+ },
+ ["layouts:5"] = {
+ cs = "okrajove bloky neaktivni",
+ de = "marginalbloecke inaktiv",
+ en = "marginblocks inactive",
+ fr = "blocsmarge inactifs",
+ it = "blocchi in margine inattivi",
+ nl = "margeblokken inactief",
+ no = "margblokker inaktive",
+ ro = "blocuri marginale inactive",
+ },
+ ["layouts:6"] = {
+ cs = "sada stran %s zpracovana (velikost %s)",
+ de = "Unterseitenfolge %s verarbeitet (Groesse %s)",
+ en = "subpage set %s processed (size %s)",
+ fr = "jeu de souspage %s traité (taille %s)",
+ it = "gruppo di sottopagine %s elaborato (dimensione %s)",
+ nl = "subpagina reeks %s verwerkt (aantal %s)",
+ no = "delside sett %s behandlet (størrelse %s)",
+ ro = "setul %s de subpagini procesat (dimensiunea %s)",
+ },
+ ["layouts:7"] = {
+ cs = "pocita se misto pro logo",
+ de = "berechne Platzbedarf des Logos",
+ en = "calculating logospace",
+ fr = "calcul de l'espace pour le logo",
+ it = "calcolo dello spazio per logo",
+ nl = "beeldmerken berekenen",
+ no = "beregner plass for logo",
+ ro = "se calculeaza spatiul pentru logo",
+ },
+ ["layouts:8"] = {
+ cs = "pocita se pozadi",
+ de = "berechne Hintergrund",
+ en = "calculating backgrounds",
+ fr = "calcul des arrières-plans",
+ it = "calcolo dello sfondo",
+ nl = "achtergronden berekenen",
+ no = "beregner bakgrunn",
+ ro = "se calculeaza fundalurile",
+ },
+ ["layouts:9"] = {
+ cs = "aktualne ne vice nez %s urovne/urovni vyctu",
+ de = "z.Z. nicht mehr als %s Ebenen in Aufzaehlungen",
+ en = "currently no more than %s levels in itemizations",
+ fr = "pas plus de %s niveaux pour l'instant dans les élémentarisations",
+ it = "attualmente non più di %s livelli di elencazione",
+ nl = "momenteel maximaal %s niveaus in opsommingen",
+ no = "for øyeblikket maksimalt %s nivåer i opplisting",
+ ro = "acum nu se supota mai mult de %s nivele de adancime la iteratii",
+ },
+ ["loaded: '%s'"] = {
+ nl = "geladen: '%s'",
+ },
+ ["loaded: library '%s'"] = {
+ nl = "geladen: bibliotheek '%s'",
+ },
+ ["loading: '%s'"] = {
+ nl = "laden: '%s'",
+ },
+ ["locating: '%s'"] = {
+ nl = "zoeken: '%s'",
+ },
+ ["not found: '%s'"] = {
+ nl = "niet gevonden: '%s'",
+ },
+ ["number 1: %s, number 2: %s"] = {
+ en = "number 1: (%s), number 2: (%s)",
+ nl = "nummer 1: (%s), nummer 2: (%s)",
+ },
+ ["popping level: %s"] = {
+ nl = "niveau omlaag: %s",
+ },
+ ["publications:1"] = {
+ en = "file %s not found, unknown style ignored",
+ },
+ ["publications:2"] = {
+ en = "file %s not found, waiting for bibtex",
+ },
+ ["publications:3"] = {
+ en = "wrote a new auxiliary file \\jobname.aux",
+ },
+ ["publications:4"] = {
+ en = "loading database from %s",
+ },
+ ["publications:5"] = {
+ en = "warning: unknown cite argument %s on line \\the\\inputlineno",
+ },
+ ["publications:6"] = {
+ en = "loading formatting style from %s",
+ },
+ ["publications:7"] = {
+ en = "placing all entries, use 'text' to be more selective",
+ },
+ ["pushing level: %s"] = {
+ nl = "niveau omhoog: %s",
+ },
+ ["references:1"] = {
+ cs = "neznama reference %s",
+ de = "unbekannte Referenz %s",
+ en = "unknown reference %s",
+ fr = "réference %s inconnue",
+ it = "riferimento sconosciuto %s",
+ nl = "onbekende verwijzing %s",
+ no = "ukjent referanse %s",
+ ro = "referinta necunoscuta %s",
+ },
+ ["references:2"] = {
+ cs = "duplicitni reference %s na strane %s",
+ de = "doppelte Referenz %s auf Seite %s",
+ en = "duplicate reference %s on page %s",
+ fr = "réference %s dupliquée à la page %s",
+ it = "riferimento duplicato %s a pagina %s",
+ nl = "dubbele verwijzing %s op pagina %s",
+ no = "duplikat referanse %s pø side %s",
+ ro = "referinta duplicat %s la pagina %s",
+ },
+ ["references:21"] = {
+ cs = "dokument %s nacten",
+ de = "Dokument %s geladen",
+ en = "document %s loaded",
+ fr = "document %s chargé",
+ it = "documento %s caricato",
+ nl = "document %s geladen",
+ no = "dokument %s er lest inn",
+ ro = "documentul %s este incarcat",
+ },
+ ["references:22"] = {
+ cs = "dokument %s neni interaktivni",
+ de = "Dokument %s ist nicht aktiv",
+ en = "document %s is not interactive",
+ fr = "le document %s n'est pas interactif",
+ it = "il documento %s non ø interattivo",
+ nl = "document %s is niet interactief",
+ no = "dokument %s er ikke interaktivt",
+ ro = "documentul %s nu este interactiv",
+ },
+ ["references:23"] = {
+ cs = "obskurni (nejasna) reference %s (prefix=%s)",
+ de = "Obskure Referenz %s (Prefix=%s)",
+ en = "obscure reference %s (prefix=%s)",
+ fr = "reference %s indéterminé (préfixe=%s)",
+ it = "riferimento ambiguo %s (prefisso=%s)",
+ nl = "onduidelijke verwijzing %s (prefix=%s)",
+ no = "obskur referanse %s (Prefix=%s)",
+ ro = "referinta obscura %s (prefix=%s)",
+ },
+ ["references:24"] = {
+ en = "references from document '%s' are not exported",
+ },
+ ["references:25"] = {
+ en = "references from document '%s' are not imported (export again)",
+ },
+ ["references:26"] = {
+ en = "references from document '%s' are imported",
+ },
+ ["references:3"] = {
+ cs = "neznamy typ reference %s",
+ de = "unbekannte Referenz Typ %s",
+ en = "unknown reference type %s",
+ fr = "type %s de réference inconnu",
+ it = "riferimento di tipo sconosciuto %s",
+ nl = "type verwijzing %s onbekend",
+ no = "ukjent referansetype %s",
+ ro = "tip necunoscut de referinta %s",
+ },
+ ["references:30"] = {
+ cs = "neznamy objekt %s",
+ de = "unbekanntes Object %s",
+ en = "unknown object %s",
+ fr = "objet %s inconnu",
+ it = "oggetto sconosciuto %s",
+ nl = "onbekend object %s",
+ no = "ukjent objekt %s",
+ ro = "obiect necunoscut %s",
+ },
+ ["references:31"] = {
+ cs = "duplicitni object %s",
+ de = "doppeltes Object %s",
+ en = "duplicate object %s",
+ fr = "objet %s dupliqué",
+ it = "oggetto duplicato %s",
+ nl = "dubbel object %s",
+ no = "duplikat objekt %s",
+ ro = "obiect duplicat %s",
+ },
+ ["references:4"] = {
+ cs = "nedovolena reference %s",
+ de = "illegale Referenz %s",
+ en = "illegal reference %s",
+ fr = "réference %s inconnue",
+ it = "riferimento illecito %s",
+ nl = "verboden verwijzing %s",
+ no = "ulovlig referanse %s",
+ ro = "referinta eronata %s",
+ },
+ ["references:5"] = {
+ en = "number of unknown references: %s",
+ },
+ ["references:6"] = {
+ en = "number of illegal references: %s",
+ },
+ ["start: '%s'"] = {},
+ ["stop: '%s'"] = {},
+ ["stored: preamble '%s', state '%s', order '%s'"] = {
+ nl = "opgeslagen: preamble '%s', status '%s', volgorde '%s'",
+ },
+ ["structures:1"] = {
+ cs = "zacatek oddilu (sekce) %s",
+ de = "Begin des Abschnittsblocks %s",
+ en = "begin of sectionblock %s",
+ fr = "début de blocsection %s",
+ it = "inizio del blocco (sezione) %s",
+ nl = "begin van sectieblok %s",
+ no = "starten av blokk %s (seksjon)",
+ ro = "inceput de bloc sectiune %s",
+ },
+ ["structures:2"] = {
+ cs = "konec oddilu (sekce) %s",
+ de = "Ende des Abschnittsblocks %s",
+ en = "end of sectionblock %s",
+ fr = "fin de blocsection %s",
+ it = "fine del blocco (sezione) %s",
+ nl = "eind van sectieblok %s",
+ no = "slutten av blokk %s (seksjon)",
+ ro = "sfarsit de bloc sectiune %s",
+ },
+ ["symbols:1"] = {
+ cs = "nacita se soubor symbolu %s",
+ de = "Lade Symboldatei %s",
+ en = "loading symbolset %s",
+ fr = "chargement du jeu de symbole %s",
+ it = "caricamento gruppo di simboli %s",
+ nl = "symboolset %s wordt geladen",
+ no = "leser inn symbolsett %s",
+ ro = "se incarca setul de simboluri %s",
+ },
+ ["system:1"] = {
+ cs = "nacteni pomocneho souboru odlozeno (typemode)",
+ de = "Laden der Hilfsdatei aufgeschoben (Eingabe-Modus)",
+ en = "loading utility-file postponed (typemode)",
+ fr = "chargement de fichier utilitaire reporté (typemode)",
+ it = "caricamento dei file supplementari posticipato (typemode)",
+ nl = "laden hulpfile uitgesteld (typemode)",
+ no = "innlesning av hjelpefila utsatt (typemode)",
+ ro = "se incarca utilitarul-fisierul este amanat (typemode)",
+ },
+ ["system:10"] = {
+ cs = "nepouzivejte em v %s",
+ de = "Benutzte kein em in %s",
+ en = "don't use em in %s",
+ fr = "n'utilisez pas em dans %s",
+ it = "non usare em in %s",
+ nl = "gebruik geen em in %s",
+ no = "ikke bruk em i %s",
+ ro = "nu folositi em in %s",
+ },
+ ["system:11"] = {
+ cs = "vytvarim jednoduchy pomocny soubor",
+ de = "Erstelle einfache Hilfdatei",
+ en = "building simple util",
+ fr = "construction util simple",
+ it = "costruzione di un semplice supplemento",
+ nl = "aanmaken basale hulpfile",
+ no = "lager enkel hjelpefil",
+ ro = "se creeaza un utilitar simplu",
+ },
+ ["system:12"] = {
+ cs = "pomosny soubor neni setriden, pouzijte texutil",
+ de = "Die Hilfdatei ist nicht sortiert, verwende texutil",
+ en = "the utility-file is not sorted, use texutil",
+ fr = "le fichier utilitaire n'est pas trié, utilise texutil",
+ it = "file di supplemento non ordinato, usare texutil",
+ nl = "de hulpfile is niet gesorteerd, gebruik texutil",
+ no = "hjelpefila er ikke sortert, bruk texutil",
+ ro = "fisierul utilitar nu este sortat, folositi texutil",
+ },
+ ["system:13"] = {
+ cs = "znacka %s definovana %s",
+ de = "Beschriftung %s definiert %s",
+ en = "mark %s defined %s",
+ fr = "marquage %s defini %s",
+ it = "marcatura %s definita %s",
+ nl = "markering %s gedefinieerd %s",
+ no = "markering %s definert %s",
+ ro = "marcajul %s definit %s",
+ },
+ ["system:14"] = {
+ cs = "vynucena nova stranka v seznamu na %s",
+ de = "Erzwungendes Seitenumbruch in Liste bei %s",
+ en = "forced newpage in list at %s",
+ fr = "nouvellepage forcée dans la liste à %s",
+ it = "nuova pagina obbligata in lista a %s",
+ nl = "geforceerde paginaovergang in lijst voor %s",
+ no = "tvunget sideskift i liste ved %s",
+ ro = "s-a fortat trecere pa pagina noua in lista la %s",
+ },
+ ["system:15"] = {
+ cs = "uklada se buffer %s",
+ de = "Speichere Buffer %s",
+ en = "saving buffer %s",
+ fr = "sauvegarde du tampon (buffer) %s",
+ it = "salvataggio del buffer %s",
+ nl = "wegschrijven buffer %s",
+ no = "lagrer Buffer %s",
+ ro = "buffer salvat %s",
+ },
+ ["system:16"] = {
+ cs = "sazi se buffer %s",
+ de = "Setzte Buffer %s",
+ en = "typesetting buffer %s",
+ fr = "composition du tampon (buffer) %s",
+ it = "composizione del buffer %s",
+ nl = "inlezen buffer %s",
+ no = "tegnsetter buffer %s",
+ ro = "buffer-ul %s s-a cules",
+ },
+ ["system:17"] = {
+ cs = "sazi se doslovny (verbatim) buffer %s",
+ de = "Setzte tippen-Buffer %s",
+ en = "typesetting verbatim buffer %s",
+ fr = "composition textuelle du tampon (buffer) %s",
+ it = "composizione verbatim del buffer %s",
+ nl = "verbatim inlezen buffer %s",
+ no = "tegnsetter verbatim-buffer %s",
+ ro = "se culege buffer-ul verbatim %s",
+ },
+ ["system:18"] = {
+ cs = "synonymum %s %s neexistuje",
+ de = "Synonym %s %s existiert nicht",
+ en = "synonym %s %s does not exist",
+ fr = "le synonyme %s %s n'existe pas",
+ it = "sinonimo %s %s non esistente",
+ nl = "synoniem %s %s bestaat niet",
+ no = "synonym %s %s eksisterer ikke",
+ ro = "sinonimul %s %s nu exista",
+ },
+ ["system:19"] = {
+ cs = "vyznam (synonyma) %s nacten",
+ de = "Bedeutung (synonyme) von %s geladen",
+ en = "meaning (synonyms) of %s loaded",
+ fr = "signification (synonymes) de %s chargée",
+ it = "significato (sinonimi) di %s caricato",
+ nl = "betekenissen (synoniemen) van %s geladen",
+ no = "betydning (synonymer) av %s er lest inn",
+ ro = "intelesul (sinonimele) pentru %s incarcat",
+ },
+ ["system:2"] = {
+ cs = "%s nacteno",
+ de = "%s geladen",
+ en = "%s loaded",
+ fr = "%s chargé",
+ it = "%s caricato",
+ nl = "%s geladen",
+ no = "%s er lest inn",
+ ro = "%s s-a incarcat",
+ },
+ ["system:20"] = {
+ cs = "vyznam (trideni) %s nacten",
+ de = "Bedeutung (sortieren) von %s geladen",
+ en = "meaning (sorts) of %s loaded",
+ fr = "signification (tris) de %s chargée",
+ it = "significato (specie) di %s caricato",
+ nl = "betekenissen (sorteren) van %s geladen",
+ no = "betydning (sorterer) av %s er lest inn",
+ ro = "intelesul (ordinea) pentru %s incarcat",
+ },
+ ["system:21"] = {
+ cs = "pomocny soubor necten",
+ de = "Die Hilfsdatei ist nicht geladen",
+ en = "no utility data is loaded",
+ fr = "pas de données utilitaires chargées",
+ it = "nessuna informazione supplementare caricata",
+ nl = "de hulpfile is niet geladen",
+ no = "hjelpefila er ikke lest inn",
+ ro = "nici o data utilitara nu este incarcata",
+ },
+ ["system:22"] = {
+ cs = "pouzijte platny pomocny soubor",
+ de = "Benoetige gueltige Hilfsdateie",
+ en = "use a valid utilityfile",
+ fr = "utilise un fichier utilitaire valide",
+ it = "usare un file supplementare valido",
+ nl = "gebruik een goede hulpfile",
+ no = "bruk en gyldig hjelpefil",
+ ro = "folositi un fisier utilitar valid",
+ },
+ ["system:23"] = {
+ cs = "%s upraveno na %s",
+ de = "%s angeordnet auf %s",
+ en = "%s arranged at %s",
+ fr = "%s arrangé à %s",
+ it = "%s sistemato a %s",
+ nl = "%s gearrangeerd op %s",
+ no = "%s arrangert på %s",
+ ro = "%s aranjat la %s",
+ },
+ ["system:24"] = {
+ cs = "plovouci bloky",
+ de = "Fliessbloecke",
+ en = "Floatblocks",
+ fr = "blocsflottants",
+ it = "Oggetti mobili",
+ nl = "Plaatsblokken",
+ no = "Flytblokker",
+ ro = "Blocuri",
+ },
+ ["system:25"] = {
+ cs = "reference",
+ de = "Referenzen",
+ en = "References",
+ fr = "Réferences",
+ it = "Riferimenti",
+ nl = "Verwijzingen",
+ no = "Referanser",
+ ro = "Referinte",
+ },
+ ["system:26"] = {
+ cs = "registry",
+ de = "Register",
+ en = "Registers",
+ fr = "Registres",
+ it = "Registri",
+ nl = "Registers",
+ no = "Registere",
+ ro = "Registri",
+ },
+ ["system:27"] = {
+ cs = "verze",
+ de = "Version",
+ en = "Version",
+ fr = "Version",
+ it = "Versione",
+ nl = "Versie",
+ no = "Versjon",
+ ro = "Versiune",
+ },
+ ["system:4"] = {
+ cs = "prikaz %s je jiz definovan",
+ de = "Befehl %s ist bereits definiert",
+ en = "command %s is already defined",
+ fr = "la commande %s est déjà définie",
+ it = "comando %s già definito",
+ nl = "commando %s is al gedefinieerd",
+ no = "kommando %s er allerede definert",
+ ro = "comanda %s este deja definita",
+ },
+ ["system:41"] = {
+ cs = "externi soubor %s ve skupine %s neexistuje",
+ de = "Externe Datei %s in Gruppe %s existiert nicht",
+ en = "external file %s in group %s does not exist",
+ fr = "le fichier externe %s du groupe %s n'existe pas",
+ it = "il file esterno %s del gruppo %s non esiste",
+ nl = "externe file %s in groep %s bestaat niet",
+ no = "ekstern fil %s i gruppe %s eksisterer ikke",
+ ro = "fisierul extern %s din grupul %s nu exista",
+ },
+ ["system:5"] = {
+ cs = "makra z %s nactena",
+ de = "Modul %s geladen",
+ en = "module %s loaded",
+ fr = "module %s chargé",
+ it = "macro del modulo %s caricate",
+ nl = "module %s geladen",
+ no = "makroene i modul %s er lest inn",
+ ro = "macro-urile din modulul %s s-au incarcat",
+ },
+ ["system:6"] = {
+ cs = "zadna makra v %s nenalezena",
+ de = "Modul %s gefunden",
+ en = "module %s not found",
+ fr = "module %s non trouvé",
+ it = "nessuna macro trovata nel modulo %s",
+ nl = "geen module %s gevonden",
+ no = "ingen makroer funnet i modul %s-",
+ ro = "nu s-au gasit macro-uri in modulul %s",
+ },
+ ["system:7"] = {
+ cs = "makra z %s jsou jiz nactena",
+ de = "Modul %s bereits geladen",
+ en = "module %s already loaded",
+ fr = "module %s déjà chargé",
+ it = "macro del modulo %s già caricate",
+ nl = "module %s reeds geladen",
+ no = "makroene i modul %s er allerede lest inn",
+ ro = "macro-urile din modulul %s s-au incarcat deja",
+ },
+ ["system:8"] = {
+ cs = "nova verze pomocneho souboru, je treba druheho behu",
+ de = "Neue Version der Hilfsdatei, zweiter Durchlauf benoetigt",
+ en = "new version of utility file, second pass needed",
+ fr = "nouvelle version de fichier utilitaire, seconde passe nécessaire",
+ it = "nuova versione del file supplementare, seconda passata necessaria",
+ nl = "nieuwe versie hulpfile, tweede run nodig",
+ no = "ny versjon av hjelpefil, andre gjennomkjøring nødvendig",
+ ro = "o noua versiune de fisier utilitar, este necesara o noua trecere",
+ },
+ ["system:9"] = {
+ cs = "%s nenalezeno/nezpracovano",
+ de = "%s nicht gefunden/verarbeitet",
+ en = "%s not found/processed",
+ fr = "%s non trouvé/traité",
+ it = "%s non trovato/elaborato",
+ nl = "%s niet gevonden/geplaatst",
+ no = "%s ikke funnet/behandlet",
+ ro = "%s nu este gasit/procesat",
+ },
+ ["system:91"] = {
+ en = "papertray %s",
+ nl = "papierlade %s",
+ },
+ ["textblocks:1"] = {
+ cs = "nova verze, je treba druhy beh",
+ de = "neue Version, zweiter Durchlauf benoetigt",
+ en = "new version, second pass needed",
+ fr = "nouvelle version, une seconde passe est nécessaire",
+ it = "nuova versione, seconda passata necessaria",
+ nl = "nieuwe versie, tweede run nodig",
+ no = "ny versjon, andre gjennomkjøring nødvendig",
+ ro = "o noua versiune, este nevoie de inca o trecere",
+ },
+ ["textblocks:10"] = {
+ cs = "%s nacteno a zpracovano",
+ de = "%s geladen und verarbeitet",
+ en = "%s loaded and processed",
+ fr = "%s chargé et traité",
+ it = "%s caricato ed elaborato",
+ nl = "%s geladen en verwerkt",
+ no = "%s lest inn og behandlet",
+ ro = "%s incarcat si procesat",
+ },
+ ["textblocks:11"] = {
+ cs = "%s nacteno a vysazeno",
+ de = "%s geladen und gesetzt",
+ en = "%s loaded and typeset",
+ fr = "%s chargé et composé",
+ it = "%s caricato e composto",
+ nl = "%s geladen en geplaatst",
+ no = "%s lest inn og tegnsatt",
+ ro = "%s incarcat si cules",
+ },
+ ["textblocks:12"] = {
+ cs = "%s preskoceno",
+ de = "%s ausgelassen",
+ en = "%s skipped",
+ fr = "%s sauté",
+ it = "%s saltato",
+ nl = "%s overgeslagen",
+ no = "%s utelatt",
+ ro = "%s sarit peste",
+ },
+ ["textblocks:2"] = {
+ cs = "zapisuji bloky do %s",
+ de = "schreibe Bloecke zu %s",
+ en = "writing blocks to %s",
+ fr = "ecriture des blocs vers %s",
+ it = "scrittura dei blocchi su %s",
+ nl = "wegschrijven blokken naar %s",
+ no = "skriver blokker til %s",
+ ro = "se scriu blocurile in %s",
+ },
+ ["textblocks:3"] = {
+ cs = "ctu bloky z %s",
+ de = "lese Bloecke von %s",
+ en = "reading blocks from %s",
+ fr = "lecture des blocs en provenance de %s",
+ it = "lettura dei blocchi da %s",
+ nl = "inlezen blokken uit %s",
+ no = "leser blokker fra %s",
+ ro = "se citesc blocurile din %s",
+ },
+ ["textblocks:4"] = {
+ cs = "je treba druhy beh",
+ de = "zweiter Durchlauf benoetigt",
+ en = "second pass needed",
+ fr = "seconde passe nécessaire",
+ it = "seconda passata necessaria",
+ nl = "er is een tweede run nodig",
+ no = "andre gjennomkjøring nødvendig",
+ ro = "este nevoie de inca o trecere",
+ },
+ ["textblocks:5"] = {
+ cs = "%s neni skryto",
+ de = "%s nicht verborgen",
+ en = "%s not hidden",
+ fr = "%s non caché",
+ it = "%s non nascosto",
+ nl = "%s niet verborgen",
+ no = "%s ikke skjult",
+ ro = "%s nu este ascuns",
+ },
+ ["textblocks:6"] = {
+ cs = "%s skryto a zpracovano",
+ de = "%s verborgen und verarbeitet",
+ en = "%s hidden and processed",
+ fr = "%s caché et traité",
+ it = "%s nascosto ed elaborato",
+ nl = "%s verborgen en verwerkt",
+ no = "%s skjult og behandlet",
+ ro = "%s ascuns si procesat",
+ },
+ ["textblocks:7"] = {
+ cs = "%s skryto",
+ de = "%s verborgen",
+ en = "%s hidden",
+ fr = "%s caché",
+ it = "%s nascosto",
+ nl = "%s verborgen",
+ no = "%s skjult",
+ ro = "%s ascuns",
+ },
+ ["textblocks:8"] = {
+ cs = "%s vysazeno",
+ de = "%s gesetzt",
+ en = "%s typeset",
+ fr = "%s composé",
+ it = "%s composto",
+ nl = "%s gehandhaafd",
+ no = "%s tegnsatt",
+ ro = "%s cules",
+ },
+ ["textblocks:9"] = {
+ cs = "%s nevysazeno",
+ de = "%s nicht gesetzt",
+ en = "%s not typeset",
+ fr = "%s non composé",
+ it = "%s non composto",
+ nl = "%s niet gehandhaafd",
+ no = "%s ikke tegnsatt",
+ ro = "%s nu este cules",
+ },
+ ["unknown: library '%s'"] = {
+ nl = "onbekend: bibliotheek '%s'",
+ },
+ ["used: code '%s'"] = {
+ nl = "gebruikt: code '%s'",
+ },
+ ["used: code '%s', preamble '%s'"] = {
+ nl = "gebruikt: code '%s', preamble '%s'",
+ },
+ ["used: function '%s'"] = {
+ nl = "gebruikt: functie '%s'",
+ },
+ ["used: preamble '%s', state '%s', order '%s'"] = {
+ nl = "gebruikt: preamble '%s', status '%s', volgorde '%s'",
+ },
+ ["vector '%s' is loaded"] = {
+ nl = "vector '%s' is geladen",
+ },
+ ["vector '%s' is unknown"] = {
+ nl = "onbekende vector '%s'",
+ },
+ ["verbatims:1"] = {
+ cs = "soubor %s neexistuje",
+ de = "Datei %s existiert nicht",
+ en = "file %s does not exist",
+ fr = "le fichier %s n'existe pas",
+ it = "il file %s non esiste",
+ nl = "file %s bestaat niet",
+ no = "fil %s eksisterer ikke",
+ ro = "fisierul %s nu exista",
+ },
+ },
+ translations = {
+ check = {
+ cs = "kontrola",
+ de = "check",
+ en = "check",
+ fr = "vérification",
+ it = "controllo",
+ nl = "controle",
+ no = "kontroll",
+ ro = "verificari",
+ },
+ colors = {
+ cs = "barva",
+ de = "farbe",
+ en = "colors",
+ fr = "couleurs",
+ it = "colore",
+ nl = "kleuren",
+ no = "farge",
+ ro = "culori",
+ },
+ columns = {
+ cs = "sloupce",
+ de = "Spalten",
+ en = "columns",
+ fr = "colonnes",
+ it = "colonne",
+ nl = "kolommen",
+ no = "kolonner",
+ ro = "coloane",
+ },
+ databases = {
+ cs = "databases",
+ de = "Datenbank",
+ en = "databases",
+ fr = "bases de données",
+ it = "database",
+ nl = "database",
+ no = "databaser",
+ ro = "baze de date",
+ },
+ figures = {
+ cs = "obrazy",
+ de = "Abbildungen",
+ en = "figures",
+ fr = "figures",
+ it = "figure",
+ nl = "figuren",
+ ro = "figuri",
+ },
+ files = {
+ cs = "soubory",
+ de = "files",
+ en = "files",
+ fr = "fichiers",
+ it = "file",
+ nl = "files",
+ no = "filer",
+ ro = "fisiere",
+ },
+ filters = {
+ cs = "filters",
+ de = "filters",
+ en = "filters",
+ fr = "filtre",
+ it = "filtri",
+ nl = "filters",
+ },
+ floatblocks = {
+ cs = "plovouciobjekty",
+ de = "Gleitobjektbloecke",
+ en = "floatblocks",
+ fr = "blocs de flottants",
+ it = "oggetti mobili",
+ nl = "plaatsblokken",
+ no = "flytblokker",
+ ro = "Blocuri",
+ },
+ fonts = {
+ cs = "zakladnifont",
+ de = "Fliesstext",
+ en = "bodyfont",
+ fr = "corps de texte",
+ it = "font del corpo",
+ nl = "korps",
+ no = "hovedfont",
+ ro = "corp de litere",
+ },
+ interactions = {
+ cs = "interakce",
+ de = "Interaktions",
+ en = "interactions",
+ fr = "interactions",
+ it = "interazione",
+ nl = "interacties",
+ no = "interaksjon",
+ ro = "interactiuni",
+ },
+ languages = {
+ cs = "jazyky",
+ de = "Sprache",
+ en = "languages",
+ fr = "langue",
+ it = "lingua",
+ nl = "talen",
+ no = "sprøk",
+ ro = "limbi",
+ },
+ layouts = {
+ cs = "layouts",
+ de = "Layouts",
+ en = "layouts",
+ fr = "calque",
+ it = "layouts",
+ nl = "layouts",
+ no = "layouts",
+ ro = "aranjamente",
+ },
+ numbers = {
+ nl = "nummers",
+ },
+ publications = {
+ en = "publications",
+ },
+ references = {
+ cs = "reference",
+ de = "referenzen",
+ en = "references",
+ fr = "réferences",
+ it = "riferimenti",
+ nl = "verwijzingen",
+ no = "referanser",
+ ro = "referinte",
+ },
+ regimes = {
+ de = "Kodierungen",
+ fr = "encodages",
+ nl = "regimes",
+ },
+ structures = {
+ cs = "struktury",
+ de = "strukture",
+ en = "structures",
+ fr = "structures",
+ it = "struttura",
+ nl = "structuren",
+ no = "struktur",
+ ro = "structuri",
+ },
+ symbols = {
+ cs = "symboly",
+ de = "Symbole",
+ en = "symbols",
+ fr = "symboles",
+ it = "simboli",
+ nl = "symbolen",
+ no = "symboler",
+ ro = "simboluri",
+ },
+ system = {
+ cs = "system",
+ de = "system",
+ en = "system",
+ fr = "système",
+ it = "sistema",
+ nl = "systeem",
+ no = "system",
+ ro = "sistem",
+ },
+ textblocks = {
+ cs = "textovyblok",
+ de = "textblock",
+ en = "textblocks",
+ fr = "blocs de texte",
+ it = "blocchi di testo",
+ nl = "tekstblokken",
+ no = "tekstblokker",
+ ro = "blocuri de text",
+ },
+ verbatims = {
+ cs = "verbatim",
+ de = "verbatim",
+ en = "verbatim",
+ fr = "verbatim",
+ it = "verbatim",
+ nl = "typen",
+ no = "verbatim",
+ ro = "verbatim",
+ },
+ },
}
diff --git a/Master/texmf-dist/tex/context/base/mult-mfr.tex b/Master/texmf-dist/tex/context/base/mult-mfr.mkii
index 78e4f9f17ef..7fee954c039 100644
--- a/Master/texmf-dist/tex/context/base/mult-mfr.tex
+++ b/Master/texmf-dist/tex/context/base/mult-mfr.mkii
@@ -1,8 +1,10 @@
\setinterfacemessage{references}{1}{réference -- inconnue}
+\setinterfacemessage{references}{30}{objet -- inconnu}
\setinterfacemessage{references}{3}{type -- de réference inconnu}
\setinterfacemessage{references}{2}{réference -- dupliquée à la page --}
+\setinterfacemessage{references}{5}{number of unknown references: --}
\setinterfacemessage{references}{4}{réference -- inconnue}
-\setinterfacemessage{references}{30}{objet -- inconnu}
+\setinterfacemessage{references}{6}{number of illegal references: --}
\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
\setinterfacemessage{references}{24}{references from document '--' are not exported}
\setinterfacemessage{references}{title}{réferences}
diff --git a/Master/texmf-dist/tex/context/base/mult-mit.tex b/Master/texmf-dist/tex/context/base/mult-mit.mkii
index 6d2a8f51608..9d09e267654 100644
--- a/Master/texmf-dist/tex/context/base/mult-mit.tex
+++ b/Master/texmf-dist/tex/context/base/mult-mit.mkii
@@ -1,8 +1,10 @@
\setinterfacemessage{references}{1}{riferimento sconosciuto --}
+\setinterfacemessage{references}{30}{oggetto sconosciuto --}
\setinterfacemessage{references}{3}{riferimento di tipo sconosciuto --}
\setinterfacemessage{references}{2}{riferimento duplicato -- a pagina --}
+\setinterfacemessage{references}{5}{number of unknown references: --}
\setinterfacemessage{references}{4}{riferimento illecito --}
-\setinterfacemessage{references}{30}{oggetto sconosciuto --}
+\setinterfacemessage{references}{6}{number of illegal references: --}
\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
\setinterfacemessage{references}{24}{references from document '--' are not exported}
\setinterfacemessage{references}{title}{riferimenti}
diff --git a/Master/texmf-dist/tex/context/base/mult-mnl.tex b/Master/texmf-dist/tex/context/base/mult-mnl.mkii
index b8204a40b0c..fb527d4adeb 100644
--- a/Master/texmf-dist/tex/context/base/mult-mnl.tex
+++ b/Master/texmf-dist/tex/context/base/mult-mnl.mkii
@@ -1,8 +1,10 @@
\setinterfacemessage{references}{1}{onbekende verwijzing --}
+\setinterfacemessage{references}{30}{onbekend object --}
\setinterfacemessage{references}{3}{type verwijzing -- onbekend}
\setinterfacemessage{references}{2}{dubbele verwijzing -- op pagina --}
+\setinterfacemessage{references}{5}{number of unknown references: --}
\setinterfacemessage{references}{4}{verboden verwijzing --}
-\setinterfacemessage{references}{30}{onbekend object --}
+\setinterfacemessage{references}{6}{number of illegal references: --}
\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
\setinterfacemessage{references}{24}{references from document '--' are not exported}
\setinterfacemessage{references}{title}{verwijzingen}
diff --git a/Master/texmf-dist/tex/context/base/mult-mno.tex b/Master/texmf-dist/tex/context/base/mult-mno.mkii
index ee6fd3273ec..bbbc3a6585c 100644
--- a/Master/texmf-dist/tex/context/base/mult-mno.tex
+++ b/Master/texmf-dist/tex/context/base/mult-mno.mkii
@@ -1,8 +1,10 @@
\setinterfacemessage{references}{1}{ukjent referanse --}
+\setinterfacemessage{references}{30}{ukjent objekt --}
\setinterfacemessage{references}{3}{ukjent referansetype --}
\setinterfacemessage{references}{2}{duplikat referanse -- pø side --}
+\setinterfacemessage{references}{5}{number of unknown references: --}
\setinterfacemessage{references}{4}{ulovlig referanse --}
-\setinterfacemessage{references}{30}{ukjent objekt --}
+\setinterfacemessage{references}{6}{number of illegal references: --}
\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
\setinterfacemessage{references}{24}{references from document '--' are not exported}
\setinterfacemessage{references}{title}{referanser}
diff --git a/Master/texmf-dist/tex/context/base/mult-mpe.tex b/Master/texmf-dist/tex/context/base/mult-mpe.mkii
index 4c1bc99420a..a8d42935602 100644
--- a/Master/texmf-dist/tex/context/base/mult-mpe.tex
+++ b/Master/texmf-dist/tex/context/base/mult-mpe.mkii
@@ -1,8 +1,10 @@
\setinterfacemessage{references}{1}{unknown reference --}
+\setinterfacemessage{references}{30}{unknown object --}
\setinterfacemessage{references}{3}{unknown reference type --}
\setinterfacemessage{references}{2}{duplicate reference -- on page --}
+\setinterfacemessage{references}{5}{number of unknown references: --}
\setinterfacemessage{references}{4}{illegal reference --}
-\setinterfacemessage{references}{30}{unknown object --}
+\setinterfacemessage{references}{6}{number of illegal references: --}
\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
\setinterfacemessage{references}{24}{references from document '--' are not exported}
\setinterfacemessage{references}{title}{references}
@@ -86,7 +88,7 @@
\setinterfacemessage{linguals}{9}{language -- is active}
\setinterfacemessage{linguals}{8}{language specific options [--] seamless appended}
\setinterfacemessage{linguals}{title}{language}
-\setinterfacemessage{linguals}{10}{patterns --loaded}
+\setinterfacemessage{linguals}{10}{patterns -- loaded}
\setinterfacemessage{verbatims}{1}{file -- does not exist}
\setinterfacemessage{verbatims}{title}{verbatim}
\setinterfacemessage{filters}{1}{filter -- is loaded}
diff --git a/Master/texmf-dist/tex/context/base/mult-mro.tex b/Master/texmf-dist/tex/context/base/mult-mro.mkii
index da96a23a494..70673c31717 100644
--- a/Master/texmf-dist/tex/context/base/mult-mro.tex
+++ b/Master/texmf-dist/tex/context/base/mult-mro.mkii
@@ -1,8 +1,10 @@
\setinterfacemessage{references}{1}{referinta necunoscuta --}
+\setinterfacemessage{references}{30}{obiect necunoscut --}
\setinterfacemessage{references}{3}{tip necunoscut de referinta --}
\setinterfacemessage{references}{2}{referinta duplicat -- la pagina --}
+\setinterfacemessage{references}{5}{number of unknown references: --}
\setinterfacemessage{references}{4}{referinta eronata --}
-\setinterfacemessage{references}{30}{obiect necunoscut --}
+\setinterfacemessage{references}{6}{number of illegal references: --}
\setinterfacemessage{references}{25}{references from document '--' are not imported (export again)}
\setinterfacemessage{references}{24}{references from document '--' are not exported}
\setinterfacemessage{references}{title}{referinte}
diff --git a/Master/texmf-dist/tex/context/base/mult-nl.tex b/Master/texmf-dist/tex/context/base/mult-nl.mkii
index 074d5f3d5c0..a5b62ad3347 100644
--- a/Master/texmf-dist/tex/context/base/mult-nl.tex
+++ b/Master/texmf-dist/tex/context/base/mult-nl.mkii
@@ -68,12 +68,14 @@
\setinterfacevariable{after}{na}
\setinterfacevariable{all}{alles}
\setinterfacevariable{always}{altijd}
+\setinterfacevariable{and}{en}
\setinterfacevariable{answerarea}{antwoordgebied}
\setinterfacevariable{appendices}{bijlagen}
\setinterfacevariable{appendix}{bijlage}
\setinterfacevariable{april}{april}
\setinterfacevariable{atmargin}{opmarge}
\setinterfacevariable{atpage}{oppagina}
+\setinterfacevariable{attachment}{aanhangsel}
\setinterfacevariable{august}{augustus}
\setinterfacevariable{author}{auteur}
\setinterfacevariable{auto}{auto}
@@ -90,6 +92,7 @@
\setinterfacevariable{bib}{bib}
\setinterfacevariable{big}{groot}
\setinterfacevariable{bigbodyfont}{grootkorps}
+\setinterfacevariable{bigger}{groter}
\setinterfacevariable{bigpreference}{grotevoorkeur}
\setinterfacevariable{blank}{blanko}
\setinterfacevariable{blockquote}{blokcitaat}
@@ -124,6 +127,7 @@
\setinterfacevariable{content}{inhoud}
\setinterfacevariable{contents}{inhouden}
\setinterfacevariable{continue}{verder}
+\setinterfacevariable{continued}{vervolgd}
\setinterfacevariable{controls}{sturing}
\setinterfacevariable{conversion}{conversie}
\setinterfacevariable{current}{huidige}
@@ -141,6 +145,7 @@
\setinterfacevariable{down}{omlaag}
\setinterfacevariable{each}{elk}
\setinterfacevariable{edge}{rand}
+\setinterfacevariable{embed}{sluitin}
\setinterfacevariable{empty}{leeg}
\setinterfacevariable{end}{eind}
\setinterfacevariable{endnote}{eindnoot}
@@ -364,6 +369,7 @@
\setinterfacevariable{random}{willekeurig}
\setinterfacevariable{readonly}{alleenleesbaar}
\setinterfacevariable{rectangular}{recht}
+\setinterfacevariable{reference}{referentie}
\setinterfacevariable{referral}{kenmerk}
\setinterfacevariable{register}{register}
\setinterfacevariable{regular}{regular}
@@ -411,6 +417,7 @@
\setinterfacevariable{smallbolditalic}{kleinvetitalic}
\setinterfacevariable{smallboldslanted}{kleinvetschuin}
\setinterfacevariable{smallcaps}{smallcaps}
+\setinterfacevariable{smaller}{kleiner}
\setinterfacevariable{smallitalic}{kleinitalic}
\setinterfacevariable{smallitalicbold}{kleinitalicvet}
\setinterfacevariable{smallnormal}{kleinnormaal}
@@ -519,6 +526,7 @@
\setinterfaceconstant{after}{na}
\setinterfaceconstant{afterhead}{kopna}
\setinterfaceconstant{afterkey}{natoets}
+\setinterfaceconstant{aftersection}{nasectie}
\setinterfaceconstant{align}{uitlijnen}
\setinterfaceconstant{aligncharacter}{karakteruitlijnen}
\setinterfaceconstant{alignmentcharacter}{uitlijnkarakter}
@@ -538,6 +546,7 @@
\setinterfaceconstant{authoretallimit}{authoretallimit}
\setinterfaceconstant{authoretaltext}{authoretaltext}
\setinterfaceconstant{auto}{auto}
+\setinterfaceconstant{autocase}{autocase}
\setinterfaceconstant{autofile}{autofile}
\setinterfaceconstant{autofocus}{autofocus}
\setinterfaceconstant{autohang}{autohang}
@@ -551,10 +560,12 @@
\setinterfaceconstant{backgroundoffset}{achtergrondoffset}
\setinterfaceconstant{backgroundradius}{achtergrondstraal}
\setinterfaceconstant{backgroundscreen}{achtergrondraster}
+\setinterfaceconstant{backreference}{terugreferentie}
\setinterfaceconstant{backspace}{rugwit}
\setinterfaceconstant{balance}{balanceren}
\setinterfaceconstant{before}{voor}
\setinterfaceconstant{beforehead}{kopvoor}
+\setinterfaceconstant{beforesection}{voorsectie}
\setinterfaceconstant{bet}{bet}
\setinterfaceconstant{big}{groot}
\setinterfaceconstant{blank}{blanko}
@@ -569,8 +580,10 @@
\setinterfaceconstant{bottomoffset}{onderoffset}
\setinterfaceconstant{bottomspace}{bodemwit}
\setinterfaceconstant{bottomstate}{onderstatus}
+\setinterfaceconstant{buffer}{buffer}
\setinterfaceconstant{cache}{cache}
\setinterfaceconstant{calculate}{bereken}
+\setinterfaceconstant{category}{categorie}
\setinterfaceconstant{ccommand}{ccommando}
\setinterfaceconstant{click}{klik}
\setinterfaceconstant{clickin}{klikin}
@@ -578,6 +591,7 @@
\setinterfaceconstant{clipoffset}{clipoffset}
\setinterfaceconstant{closeaction}{sluitactie}
\setinterfaceconstant{closecommand}{sluitcommando}
+\setinterfaceconstant{closepage}{sluitpagina}
\setinterfaceconstant{closepageaction}{sluitpaginaactie}
\setinterfaceconstant{closesymbol}{sluitsymbool}
\setinterfaceconstant{color}{kleur}
@@ -629,6 +643,7 @@
\setinterfaceconstant{editoretallimit}{editoretallimit}
\setinterfaceconstant{editoretaltext}{editoretaltext}
\setinterfaceconstant{empty}{leeg}
+\setinterfaceconstant{entries}{ingangen}
\setinterfaceconstant{equalheight}{equalheight}
\setinterfaceconstant{equalwidth}{equalwidth}
\setinterfaceconstant{escape}{escape}
@@ -653,6 +668,7 @@
\setinterfaceconstant{footer}{voet}
\setinterfaceconstant{footerdistance}{voetafstand}
\setinterfaceconstant{footerstate}{voetstatus}
+\setinterfaceconstant{force}{forceer}
\setinterfaceconstant{foregroundcolor}{voorgrondkleur}
\setinterfaceconstant{foregroundstyle}{voorgrondletter}
\setinterfaceconstant{format}{formatteer}
@@ -699,11 +715,13 @@
\setinterfaceconstant{intent}{intent}
\setinterfaceconstant{interaction}{interactie}
\setinterfaceconstant{interlinespace}{interlinie}
+\setinterfaceconstant{internalgrid}{interngrid}
\setinterfaceconstant{itemalign}{itemuitlijnen}
\setinterfaceconstant{items}{items}
\setinterfaceconstant{juniorsep}{juniorsep}
\setinterfaceconstant{ken}{ken}
\setinterfaceconstant{keyexpansion}{sleutelexpansie}
+\setinterfaceconstant{keys}{sleutels}
\setinterfaceconstant{keyword}{trefwoord}
\setinterfaceconstant{label}{label}
\setinterfaceconstant{lastnamesep}{lastnamesep}
@@ -746,6 +764,7 @@
\setinterfaceconstant{margintext}{margetekst}
\setinterfaceconstant{marking}{markering}
\setinterfaceconstant{marstyle}{marletter}
+\setinterfaceconstant{mask}{masker}
\setinterfaceconstant{max}{max}
\setinterfaceconstant{maxdepth}{maxdepth}
\setinterfaceconstant{maxheight}{maxhoogte}
@@ -799,6 +818,7 @@
\setinterfaceconstant{oddmargin}{onevenmarge}
\setinterfaceconstant{offset}{offset}
\setinterfaceconstant{openaction}{openactie}
+\setinterfaceconstant{openpage}{openpagina}
\setinterfaceconstant{openpageaction}{openpaginaactie}
\setinterfaceconstant{option}{optie}
\setinterfaceconstant{order}{order}
@@ -851,6 +871,7 @@
\setinterfaceconstant{previous}{vorige}
\setinterfaceconstant{previousnumber}{vorigenummer}
\setinterfaceconstant{process}{proces}
+\setinterfaceconstant{profile}{profile}
\setinterfaceconstant{pubsep}{pubsep}
\setinterfaceconstant{radius}{straal}
\setinterfaceconstant{random}{willekeur}
@@ -944,6 +965,7 @@
\setinterfaceconstant{sub}{sub}
\setinterfaceconstant{subtitle}{subtitel}
\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{suffixseparator}{suffixscheider}
\setinterfaceconstant{surnamesep}{surnamesep}
\setinterfaceconstant{sx}{sx}
\setinterfaceconstant{sy}{sy}
@@ -969,6 +991,7 @@
\setinterfaceconstant{textstate}{tekststatus}
\setinterfaceconstant{textstyle}{tekstletter}
\setinterfaceconstant{textwidth}{tekstbreedte}
+\setinterfaceconstant{threshold}{threshold}
\setinterfaceconstant{title}{titel}
\setinterfaceconstant{titlecolor}{titelkleur}
\setinterfaceconstant{titlecommand}{titelcommando}
@@ -991,6 +1014,7 @@
\setinterfaceconstant{urlalternative}{urlvariant}
\setinterfaceconstant{urlspace}{urlspatie}
\setinterfaceconstant{validate}{valideer}
+\setinterfaceconstant{values}{waarden}
\setinterfaceconstant{vcommand}{vcommando}
\setinterfaceconstant{veroffset}{kopoffset}
\setinterfaceconstant{vfil}{vfil}
@@ -1045,7 +1069,6 @@
\setinterfacecommand{CAPPED}{KAP}
\setinterfacecommand{Character}{Letter}
\setinterfacecommand{Characters}{Letters}
-\setinterfacecommand{LABELTEXT}{LABELTEKST}
\setinterfacecommand{MONTH}{MAAND}
\setinterfacecommand{Numbers}{Cijfers}
\setinterfacecommand{Romannumerals}{Romeins}
@@ -1084,7 +1107,6 @@
\setinterfacecommand{colorbar}{kleurenbalk}
\setinterfacecommand{colorvalue}{kleurwaarde}
\setinterfacecommand{column}{kolom}
-\setinterfacecommand{comment}{commentaar}
\setinterfacecommand{comparecolorgroup}{vergelijkkleurgroep}
\setinterfacecommand{comparepalet}{vergelijkpalet}
\setinterfacecommand{completepagenumber}{volledigepaginanummer}
diff --git a/Master/texmf-dist/tex/context/base/mult-pe.mkii b/Master/texmf-dist/tex/context/base/mult-pe.mkii
new file mode 100644
index 00000000000..284fa40e8b0
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mult-pe.mkii
@@ -0,0 +1,1715 @@
+% this file is auto-generated, don't edit this file
+%
+% definitions for interface variables for language pe
+%
+\setinterfacevariable{Addition}{جمع}
+\setinterfacevariable{Balloon}{بادکنک}
+\setinterfacevariable{Character}{Character}
+\setinterfacevariable{Characters}{Characters}
+\setinterfacevariable{CloseDocument}{بستن‌نوشتار}
+\setinterfacevariable{ExitViewer}{خروج‌نمایشگر}
+\setinterfacevariable{FirstPage}{صفحه‌اول}
+\setinterfacevariable{FitHeight}{پرکردن‌ارتفاع}
+\setinterfacevariable{FitWidth}{پرکردن‌عرض}
+\setinterfacevariable{GotoPage}{برو‌به‌صفحه}
+\setinterfacevariable{Greek}{یونانی}
+\setinterfacevariable{Help}{کمک}
+\setinterfacevariable{HideField}{پنهان‌میدان}
+\setinterfacevariable{HideLayer}{پنهان‌لایه}
+\setinterfacevariable{Key}{کلید}
+\setinterfacevariable{LastPage}{صفحه‌آخر}
+\setinterfacevariable{LoadForm}{بارگذاشتن‌فرم}
+\setinterfacevariable{MONTH}{ماه}
+\setinterfacevariable{New}{جدید}
+\setinterfacevariable{NextJump}{پرش‌بعدی}
+\setinterfacevariable{NextPage}{صفحه‌بعدی}
+\setinterfacevariable{Numbers}{شماره‌ها}
+\setinterfacevariable{OpenNamedDocument}{بازکردن‌نوشتار‌ذخیره‌شده}
+\setinterfacevariable{Paragraph}{پاراگراف}
+\setinterfacevariable{PauseMovie}{ایست‌فیلم}
+\setinterfacevariable{PauseRendering}{توقف‌تعبیر}
+\setinterfacevariable{PauseSound}{ایست‌صدا}
+\setinterfacevariable{PreviousJump}{پرش‌قبلی}
+\setinterfacevariable{PreviousPage}{صفحه‌قبلی}
+\setinterfacevariable{PrintDocument}{چاپ‌نوشتار}
+\setinterfacevariable{Query}{پرسش}
+\setinterfacevariable{QueryAgain}{پرسش‌دوباره}
+\setinterfacevariable{ResetForm}{دوباره‌نشانی‌فرم}
+\setinterfacevariable{ResumeMovie}{ادامه‌فیلم}
+\setinterfacevariable{ResumeRendering}{ادامه‌تعبیر}
+\setinterfacevariable{ResumeSound}{ادامه‌صدا}
+\setinterfacevariable{Romannumerals}{اعداد‌بزرگ‌لاتین}
+\setinterfacevariable{SaveDocument}{ذخیره‌نوشتار}
+\setinterfacevariable{SaveForm}{ذخیره‌فرم}
+\setinterfacevariable{SaveNamedDocument}{ذخیره‌نوشتار‌بانام}
+\setinterfacevariable{SearchAgain}{جستجوی‌دوباره}
+\setinterfacevariable{SearchDocument}{جستجوی‌نوشتار}
+\setinterfacevariable{ShowBookmarks}{نمایش‌چوبخط}
+\setinterfacevariable{ShowField}{نمایش‌میدان}
+\setinterfacevariable{ShowThumbs}{نمایش‌شصت}
+\setinterfacevariable{StartMovie}{شروع‌فیلم}
+\setinterfacevariable{StartRendering}{شروع‌تعبیر}
+\setinterfacevariable{StartSound}{شروع‌صدا}
+\setinterfacevariable{StopMovie}{پایان‌فیلم}
+\setinterfacevariable{StopRendering}{پایان‌تعبیر}
+\setinterfacevariable{StopSound}{پایان‌صدا}
+\setinterfacevariable{SubmitForm}{تسلیم‌فرم}
+\setinterfacevariable{ToggleLayer}{تغییرلایه}
+\setinterfacevariable{ToggleViewer}{تغییرنمایشگر}
+\setinterfacevariable{URL}{URL}
+\setinterfacevariable{VideLayer}{VideLayer}
+\setinterfacevariable{ViewerHelp}{کمک‌نمایشگر}
+\setinterfacevariable{WEEKDAY}{روزهفته}
+\setinterfacevariable{WORD}{کلمه}
+\setinterfacevariable{abbreviation}{اختصار}
+\setinterfacevariable{abbreviations}{اختصارات}
+\setinterfacevariable{absolute}{قطعی}
+\setinterfacevariable{action}{کنش}
+\setinterfacevariable{after}{بعداز}
+\setinterfacevariable{all}{همه}
+\setinterfacevariable{always}{همواره}
+\setinterfacevariable{and}{and}
+\setinterfacevariable{answerarea}{answerarea}
+\setinterfacevariable{appendices}{پیوستها}
+\setinterfacevariable{appendix}{پیوست}
+\setinterfacevariable{april}{آوریل}
+\setinterfacevariable{atmargin}{درحاشیه}
+\setinterfacevariable{atpage}{درصفحه}
+\setinterfacevariable{attachment}{attachment}
+\setinterfacevariable{august}{آگوست}
+\setinterfacevariable{author}{author}
+\setinterfacevariable{auto}{خودکار}
+\setinterfacevariable{autointro}{پیشگفتارخودکار}
+\setinterfacevariable{back}{پشت}
+\setinterfacevariable{background}{پس‌زمینه}
+\setinterfacevariable{backmatter}{پس‌مطلب}
+\setinterfacevariable{backpart}{پس‌قسمت}
+\setinterfacevariable{backspace}{فضای‌پشت}
+\setinterfacevariable{backward}{عقب‌گرد}
+\setinterfacevariable{bbl}{bbl}
+\setinterfacevariable{before}{قبل‌از}
+\setinterfacevariable{begin}{begin}
+\setinterfacevariable{bib}{bib}
+\setinterfacevariable{big}{بزرگ}
+\setinterfacevariable{bigbodyfont}{قلم‌بدنه‌بزرگ}
+\setinterfacevariable{bigger}{bigger}
+\setinterfacevariable{bigpreference}{اولویت‌بزرگ}
+\setinterfacevariable{blank}{خالی}
+\setinterfacevariable{blockquote}{نقل‌بلوک}
+\setinterfacevariable{bodymatter}{مطلب‌بدنه}
+\setinterfacevariable{bodypart}{قسمت‌بدنه}
+\setinterfacevariable{bold}{مشکی}
+\setinterfacevariable{bolditalic}{ایتالیک‌مشکی}
+\setinterfacevariable{boldslanted}{خوابیده‌مشکی}
+\setinterfacevariable{bookmark}{چوبخط}
+\setinterfacevariable{both}{هردو}
+\setinterfacevariable{bottom}{پایین}
+\setinterfacevariable{brief}{مختصر}
+\setinterfacevariable{broad}{گسترده}
+\setinterfacevariable{buffer}{بافر}
+\setinterfacevariable{by}{بوسیله}
+\setinterfacevariable{calligraphic}{خوشنویسی}
+\setinterfacevariable{cap}{cap}
+\setinterfacevariable{capital}{capital}
+\setinterfacevariable{center}{مرکز}
+\setinterfacevariable{chapter}{فصل}
+\setinterfacevariable{character}{حرف}
+\setinterfacevariable{characters}{حرفها}
+\setinterfacevariable{cite}{cite}
+\setinterfacevariable{color}{رنگ}
+\setinterfacevariable{column}{ستون}
+\setinterfacevariable{columns}{ستونها}
+\setinterfacevariable{command}{فرمان}
+\setinterfacevariable{commands}{فرمانها}
+\setinterfacevariable{comment}{توضیح}
+\setinterfacevariable{component}{مولفه}
+\setinterfacevariable{concept}{مفهوم}
+\setinterfacevariable{content}{محتوا}
+\setinterfacevariable{contents}{محتویات}
+\setinterfacevariable{continue}{ادامه}
+\setinterfacevariable{continued}{continued}
+\setinterfacevariable{controls}{کنترلها}
+\setinterfacevariable{conversion}{تبدیل}
+\setinterfacevariable{current}{جاری}
+\setinterfacevariable{cutspace}{فضای‌برش}
+\setinterfacevariable{date}{تاریخ}
+\setinterfacevariable{day}{روز}
+\setinterfacevariable{december}{دسامبر}
+\setinterfacevariable{default}{پیش‌فرض}
+\setinterfacevariable{depth}{عمق}
+\setinterfacevariable{description}{شرح}
+\setinterfacevariable{disable}{ناتوان}
+\setinterfacevariable{display}{نمایش}
+\setinterfacevariable{dot}{نقطه}
+\setinterfacevariable{doublesided}{دورو}
+\setinterfacevariable{down}{down}
+\setinterfacevariable{each}{هر}
+\setinterfacevariable{edge}{لبه}
+\setinterfacevariable{embed}{embed}
+\setinterfacevariable{empty}{تهی}
+\setinterfacevariable{end}{end}
+\setinterfacevariable{endnote}{ته‌نوشت}
+\setinterfacevariable{enumeration}{شماره‌بندی}
+\setinterfacevariable{environment}{محیط}
+\setinterfacevariable{even}{زوج}
+\setinterfacevariable{external}{خارجی}
+\setinterfacevariable{fact}{fact}
+\setinterfacevariable{february}{فوریه}
+\setinterfacevariable{figure}{شکل}
+\setinterfacevariable{figures}{شکلها}
+\setinterfacevariable{file}{پرونده}
+\setinterfacevariable{final}{نهایی}
+\setinterfacevariable{first}{اولی}
+\setinterfacevariable{firstcolumn}{ستون‌اول}
+\setinterfacevariable{firstpage}{صفحه‌اول}
+\setinterfacevariable{firstsubpage}{زیرصفحه‌اول}
+\setinterfacevariable{fit}{پرکردن}
+\setinterfacevariable{five}{پنج}
+\setinterfacevariable{fix}{ثابت‌کن}
+\setinterfacevariable{fixed}{ثابت}
+\setinterfacevariable{flexible}{انعطافپذیر}
+\setinterfacevariable{float}{شناور}
+\setinterfacevariable{flushinner}{پمپ‌داخلی}
+\setinterfacevariable{flushleft}{پمپ‌چپ}
+\setinterfacevariable{flushouter}{پمپ‌خارجی}
+\setinterfacevariable{flushright}{پمپ‌راست}
+\setinterfacevariable{footer}{ته‌برگ}
+\setinterfacevariable{footnote}{پانوشت}
+\setinterfacevariable{force}{اجبار}
+\setinterfacevariable{foreground}{پیش‌زمینه}
+\setinterfacevariable{formeel}{formeel}
+\setinterfacevariable{formula}{فرمول}
+\setinterfacevariable{formulae}{فرمولها}
+\setinterfacevariable{forward}{به‌جلو}
+\setinterfacevariable{four}{چهار}
+\setinterfacevariable{frame}{قالب}
+\setinterfacevariable{framedtext}{متن‌قالبی}
+\setinterfacevariable{friday}{جمعه}
+\setinterfacevariable{frontmatter}{پیش‌مطلب}
+\setinterfacevariable{frontpart}{پیش‌قسمت}
+\setinterfacevariable{global}{سراسری}
+\setinterfacevariable{graphic}{گرافیک}
+\setinterfacevariable{graphics}{گرافیکها}
+\setinterfacevariable{gray}{خاکستری}
+\setinterfacevariable{greek}{یونانی}
+\setinterfacevariable{grid}{توری}
+\setinterfacevariable{halfline}{نیم‌خط}
+\setinterfacevariable{handwritten}{دست‌نوشته}
+\setinterfacevariable{hang}{بیاویز}
+\setinterfacevariable{hanging}{آویزان}
+\setinterfacevariable{head}{سر}
+\setinterfacevariable{header}{سربرگ}
+\setinterfacevariable{height}{ارتفاع}
+\setinterfacevariable{helptext}{متن‌کمکی}
+\setinterfacevariable{hencefore}{hencefore}
+\setinterfacevariable{here}{اینجا}
+\setinterfacevariable{hereafter}{ازاین‌به‌بعد}
+\setinterfacevariable{hidden}{پنهانی}
+\setinterfacevariable{hiding}{پنهان‌کردن}
+\setinterfacevariable{high}{بلند}
+\setinterfacevariable{horizontal}{افقی}
+\setinterfacevariable{hyphenated}{شکسته}
+\setinterfacevariable{hz}{hz}
+\setinterfacevariable{inbetween}{دربین}
+\setinterfacevariable{index}{نمایه}
+\setinterfacevariable{indices}{نمایه‌ها}
+\setinterfacevariable{informeel}{informeel}
+\setinterfacevariable{inherit}{ارث‌بردن}
+\setinterfacevariable{inleft}{درون‌چپ}
+\setinterfacevariable{inmargin}{درون‌حاشیه}
+\setinterfacevariable{inner}{داخلی}
+\setinterfacevariable{inneredge}{لبه‌داخلی}
+\setinterfacevariable{innermargin}{حاشیه‌داخلی}
+\setinterfacevariable{inright}{درون‌راست}
+\setinterfacevariable{interaction}{پانل}
+\setinterfacevariable{interactionmenu}{منوی‌پانل}
+\setinterfacevariable{intermezzi}{میان‌پرده‌ها}
+\setinterfacevariable{intermezzo}{میان‌پرده}
+\setinterfacevariable{intext}{درون‌متن}
+\setinterfacevariable{intro}{پیشگفتار}
+\setinterfacevariable{italic}{ایتالیک}
+\setinterfacevariable{italicbold}{مشکی‌ایتالیک}
+\setinterfacevariable{item}{آیتم}
+\setinterfacevariable{itemize}{آیتم‌بندی}
+\setinterfacevariable{its}{آیم}
+\setinterfacevariable{january}{ژانویه}
+\setinterfacevariable{joinedup}{متصل‌بالا}
+\setinterfacevariable{july}{ژولای}
+\setinterfacevariable{june}{ژوئن}
+\setinterfacevariable{keep}{نگهدار}
+\setinterfacevariable{knockout}{knockout}
+\setinterfacevariable{label}{برچسب}
+\setinterfacevariable{landscape}{صفحه‌گسترده}
+\setinterfacevariable{last}{آخرین}
+\setinterfacevariable{lastcolumn}{آخرین‌ستون}
+\setinterfacevariable{lastpage}{صفحه‌آخر}
+\setinterfacevariable{lastpagenumber}{شماه‌صفحه‌آخر}
+\setinterfacevariable{lastsubpage}{زیرصفحه‌آخر}
+\setinterfacevariable{layer}{layer}
+\setinterfacevariable{left}{چپ}
+\setinterfacevariable{leftedge}{لبه‌چپ}
+\setinterfacevariable{lefthanging}{آویزان‌چپ}
+\setinterfacevariable{leftmargin}{حاشیه‌چپ}
+\setinterfacevariable{leftpage}{صفحه‌چپ}
+\setinterfacevariable{lefttoright}{lefttoright}
+\setinterfacevariable{legend}{راهنما}
+\setinterfacevariable{lesshyphenation}{شکست‌کلمات‌کمتر}
+\setinterfacevariable{line}{خط}
+\setinterfacevariable{linenote}{خط‌نوشت}
+\setinterfacevariable{lines}{خطها}
+\setinterfacevariable{list}{لیست}
+\setinterfacevariable{local}{موضعی}
+\setinterfacevariable{localenvironment}{محیط‌موضعی}
+\setinterfacevariable{logo}{آرم}
+\setinterfacevariable{logos}{آرمها}
+\setinterfacevariable{lohi}{پابا}
+\setinterfacevariable{loose}{شل}
+\setinterfacevariable{low}{پایین}
+\setinterfacevariable{ls}{ls}
+\setinterfacevariable{makeup}{آرایش}
+\setinterfacevariable{mar}{حاش}
+\setinterfacevariable{march}{مارس}
+\setinterfacevariable{margin}{حاشیه}
+\setinterfacevariable{marginedge}{لبه‌حاشیه}
+\setinterfacevariable{margintitle}{عنوان‌حاشیه}
+\setinterfacevariable{marking}{نشانه‌گذاری}
+\setinterfacevariable{mathalignment}{تنظیم‌ریاضی}
+\setinterfacevariable{mathcases}{حالتهای‌ریاضی}
+\setinterfacevariable{mathmatrix}{ماتریش‌ریاضی}
+\setinterfacevariable{max}{بیشترین}
+\setinterfacevariable{maxdepth}{maxdepth}
+\setinterfacevariable{maxheight}{maxheight}
+\setinterfacevariable{maxwidth}{maxwidth}
+\setinterfacevariable{may}{مه}
+\setinterfacevariable{mediaeval}{mediaeval}
+\setinterfacevariable{medium}{متوسط}
+\setinterfacevariable{middle}{میان}
+\setinterfacevariable{min}{کمترین}
+\setinterfacevariable{mindepth}{mindepth}
+\setinterfacevariable{minheight}{کمترین‌ارتفاع}
+\setinterfacevariable{minwidth}{کمترین‌عرض}
+\setinterfacevariable{mirrored}{منعکس}
+\setinterfacevariable{monday}{دوشنبه}
+\setinterfacevariable{mono}{مونو}
+\setinterfacevariable{month}{ماه}
+\setinterfacevariable{morehyphenation}{شکست‌کلمات‌بیشتر}
+\setinterfacevariable{name}{نام}
+\setinterfacevariable{narrow}{نازک}
+\setinterfacevariable{negative}{منفی}
+\setinterfacevariable{never}{هیچگاه}
+\setinterfacevariable{new}{جدید}
+\setinterfacevariable{next}{بعدی}
+\setinterfacevariable{nextevenpage}{صفحه‌زوج‌بعدی}
+\setinterfacevariable{nextoddpage}{صفحه‌فردبعدی}
+\setinterfacevariable{nextpage}{صفحه‌بعدی}
+\setinterfacevariable{nextsubpage}{زیرصفحه‌بعدی}
+\setinterfacevariable{no}{نه}
+\setinterfacevariable{nocheck}{بدون‌بررسی}
+\setinterfacevariable{nofit}{بدون‌پرکردن}
+\setinterfacevariable{nogrid}{بدون‌توری}
+\setinterfacevariable{nohz}{nohz}
+\setinterfacevariable{nomarking}{بدون‌نشانه‌گذاری}
+\setinterfacevariable{none}{هیچکدام}
+\setinterfacevariable{nonumber}{بدون‌شماره}
+\setinterfacevariable{normal}{نرمال}
+\setinterfacevariable{nospacing}{بدون‌فضاگذاری}
+\setinterfacevariable{not}{بدون}
+\setinterfacevariable{note}{note}
+\setinterfacevariable{nothanging}{بدون‌آویزان‌کردن}
+\setinterfacevariable{nothyphenated}{بدون‌شکست}
+\setinterfacevariable{november}{نوامبر}
+\setinterfacevariable{nowhere}{هیچ‌حا}
+\setinterfacevariable{nowhite}{سفید‌نه}
+\setinterfacevariable{number}{شماره}
+\setinterfacevariable{numbers}{شماره‌ها}
+\setinterfacevariable{october}{اکتبر}
+\setinterfacevariable{odd}{فرد}
+\setinterfacevariable{off}{خاموش}
+\setinterfacevariable{offset}{آفست}
+\setinterfacevariable{old}{قدیمی}
+\setinterfacevariable{on}{روی}
+\setinterfacevariable{one}{یک}
+\setinterfacevariable{opposite}{مخالف}
+\setinterfacevariable{outer}{خارجی}
+\setinterfacevariable{outeredge}{لبه‌خارجی}
+\setinterfacevariable{outermargin}{حاشیه‌خارجی}
+\setinterfacevariable{overbar}{میله‌رو}
+\setinterfacevariable{overbars}{میله‌ها‌رو}
+\setinterfacevariable{overlay}{پوشش}
+\setinterfacevariable{overprint}{overprint}
+\setinterfacevariable{overstrike}{خط‌زدن}
+\setinterfacevariable{overstrikes}{خط‌زدنها}
+\setinterfacevariable{packed}{فشرده}
+\setinterfacevariable{page}{صفحه}
+\setinterfacevariable{pagecomment}{توضیح‌صفحه}
+\setinterfacevariable{pagenumber}{شماره‌صفحه}
+\setinterfacevariable{paper}{برگ}
+\setinterfacevariable{paragraph}{پاراگراف}
+\setinterfacevariable{part}{قسمت}
+\setinterfacevariable{positive}{مثبت}
+\setinterfacevariable{postponing}{تاخیر}
+\setinterfacevariable{postscript}{پست‌اسکریپت}
+\setinterfacevariable{preference}{ترجیح}
+\setinterfacevariable{preview}{پیش‌دید}
+\setinterfacevariable{previous}{قبلی}
+\setinterfacevariable{previousevenpage}{صفحه‌زوج‌قبلی}
+\setinterfacevariable{previousoddpage}{صفحه‌فردقبلی}
+\setinterfacevariable{previouspage}{صفحه‌قبلی}
+\setinterfacevariable{previoussubpage}{زیرصفحه‌قبلی}
+\setinterfacevariable{printable}{قابل‌چاپ}
+\setinterfacevariable{process}{پردازش}
+\setinterfacevariable{product}{محصول}
+\setinterfacevariable{program}{برنامه}
+\setinterfacevariable{project}{پروژه}
+\setinterfacevariable{protected}{حفاظت‌شده}
+\setinterfacevariable{quadruple}{quadruple}
+\setinterfacevariable{quotation}{نقل‌قول}
+\setinterfacevariable{quote}{نقل}
+\setinterfacevariable{ran}{برد}
+\setinterfacevariable{random}{تصادفی}
+\setinterfacevariable{readonly}{تنهاخواندنی}
+\setinterfacevariable{rectangular}{چهارگوشه}
+\setinterfacevariable{reference}{مرجع}
+\setinterfacevariable{referral}{مراجعه}
+\setinterfacevariable{register}{ثبت}
+\setinterfacevariable{regular}{منظم}
+\setinterfacevariable{rekening}{rekening}
+\setinterfacevariable{relative}{نسبی}
+\setinterfacevariable{repeat}{تکرار}
+\setinterfacevariable{required}{موردنیاز}
+\setinterfacevariable{reset}{بازنشانی}
+\setinterfacevariable{reverse}{برعکس}
+\setinterfacevariable{right}{راست}
+\setinterfacevariable{rightedge}{لبه‌راست}
+\setinterfacevariable{righthanging}{آویزان‌کردن‌راست}
+\setinterfacevariable{rightmargin}{حاشیه‌راست}
+\setinterfacevariable{rightpage}{صفحه‌راست}
+\setinterfacevariable{righttoleft}{righttoleft}
+\setinterfacevariable{roman}{رومن}
+\setinterfacevariable{romannumerals}{شماره‌لاتین}
+\setinterfacevariable{rotate}{دوران}
+\setinterfacevariable{rotated}{دوران‌یافته}
+\setinterfacevariable{round}{گرد}
+\setinterfacevariable{row}{سطر}
+\setinterfacevariable{rule}{خط}
+\setinterfacevariable{samepage}{همان‌صفحه}
+\setinterfacevariable{sans}{سانز}
+\setinterfacevariable{sansbold}{مشکی‌سانز}
+\setinterfacevariable{sansserif}{سانزسریف}
+\setinterfacevariable{saturday}{شنبه}
+\setinterfacevariable{screen}{پرده}
+\setinterfacevariable{section}{بخش}
+\setinterfacevariable{sectionblockenvironment}{محیط‌بلوک‌بخش}
+\setinterfacevariable{sectionnumber}{شماره‌بخش}
+\setinterfacevariable{see}{ببینید}
+\setinterfacevariable{september}{سپتامبر}
+\setinterfacevariable{serif}{سریف}
+\setinterfacevariable{serried}{تنگ‌هم}
+\setinterfacevariable{setups}{بارگذاریها}
+\setinterfacevariable{sheet}{ورقه}
+\setinterfacevariable{short}{short}
+\setinterfacevariable{singlesided}{یک‌رو}
+\setinterfacevariable{slanted}{خوابیده}
+\setinterfacevariable{slantedbold}{مشکی‌خوابیده}
+\setinterfacevariable{small}{کوچک}
+\setinterfacevariable{smallbodyfont}{قلم‌بدنه‌کوچک}
+\setinterfacevariable{smallbold}{مشکی‌کوچک}
+\setinterfacevariable{smallbolditalic}{ایتالیک‌مشکی‌کوچک}
+\setinterfacevariable{smallboldslanted}{خوابیده‌مشکی‌کوچک}
+\setinterfacevariable{smallcaps}{smallcaps}
+\setinterfacevariable{smaller}{smaller}
+\setinterfacevariable{smallitalic}{ایتالیک‌کوچک}
+\setinterfacevariable{smallitalicbold}{مشکی‌ایتالیک‌کوچک}
+\setinterfacevariable{smallnormal}{نرمال‌کوچک}
+\setinterfacevariable{smallslanted}{خوابیده‌کوچک}
+\setinterfacevariable{smallslantedbold}{مشکی‌خوابیده‌کوچک}
+\setinterfacevariable{smalltype}{تایپ‌کوچک}
+\setinterfacevariable{somewhere}{جایی}
+\setinterfacevariable{sorted}{مرتب}
+\setinterfacevariable{space}{فضا}
+\setinterfacevariable{spacing}{فضاگذاری}
+\setinterfacevariable{speech}{سخنرانی}
+\setinterfacevariable{split}{شکافتن}
+\setinterfacevariable{spot}{لکه}
+\setinterfacevariable{standard}{استاندارد}
+\setinterfacevariable{start}{شروع}
+\setinterfacevariable{starter}{starter}
+\setinterfacevariable{sticker}{دشنه}
+\setinterfacevariable{stop}{پایان}
+\setinterfacevariable{stopper}{ایست}
+\setinterfacevariable{stretch}{بکش}
+\setinterfacevariable{strict}{اکید}
+\setinterfacevariable{strong}{محکم}
+\setinterfacevariable{strut}{بست}
+\setinterfacevariable{sub}{زیر}
+\setinterfacevariable{subbackward}{زیرعقب‌گرد}
+\setinterfacevariable{subformula}{زیرفرمول}
+\setinterfacevariable{subforward}{زیرجلوگرد}
+\setinterfacevariable{subject}{موضوع}
+\setinterfacevariable{subpage}{زیرصفحه}
+\setinterfacevariable{subsection}{زیربخش}
+\setinterfacevariable{subsubject}{زیرموضوع}
+\setinterfacevariable{subsubsection}{زیرزیربخش}
+\setinterfacevariable{subsubsubject}{زیرزیرموضوع}
+\setinterfacevariable{subsubsubsection}{زیرزیرزیربخش}
+\setinterfacevariable{subsubsubsubject}{زیرزیرزیرموضوع}
+\setinterfacevariable{subsubsubsubsection}{زیرزیرزیرزیربخش}
+\setinterfacevariable{subsubsubsubsubject}{زیرزیرزیرزیرموضوع}
+\setinterfacevariable{subsubsubsubsubsection}{زیرزیرزیرزیرزیربخش}
+\setinterfacevariable{subsubsubsubsubsubject}{زیرزیرزیرزیرزیرموضوع}
+\setinterfacevariable{subsubsubsubsubsubsection}{زیرزیرزیرزیرزیرزیربخش}
+\setinterfacevariable{subsubsubsubsubsubsubject}{زیرزیرزیرزیرزیرزیرموضوع}
+\setinterfacevariable{subsubsubsubsubsubsubsection}{زیرزیرزیرزیرزیرزیرزیربخش}
+\setinterfacevariable{subsubsubsubsubsubsubsubject}{زیرزیرزیرزیرزیرزیرزیرموضوع}
+\setinterfacevariable{subsubsubsubsubsubsubsubsection}{زیرزیرزیرزیرزیرزیرزیرزیربخش}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubject}{زیرزیرزیرزیرزیرزیرزیرزیرموضوع}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsection}{زیرزیرزیرزیرزیرزیرزیرزیرزیربخش}
+\setinterfacevariable{subsubsubsubsubsubsubsubsubsubject}{زیرزیرزیرزیرزیرزیرزیرزیرزیرموضوع}
+\setinterfacevariable{sunday}{یک‌شنبه}
+\setinterfacevariable{support}{حمایت}
+\setinterfacevariable{sym}{نم}
+\setinterfacevariable{symbol}{نماد}
+\setinterfacevariable{synchronize}{تطابق}
+\setinterfacevariable{system}{سیستم}
+\setinterfacevariable{table}{جدول}
+\setinterfacevariable{tablehead}{سرجدول}
+\setinterfacevariable{tables}{جدولها}
+\setinterfacevariable{tabletail}{دنباله‌جدول}
+\setinterfacevariable{tabulate}{جدول‌بندی}
+\setinterfacevariable{tabulatehead}{سرجدول‌بندی}
+\setinterfacevariable{tabulatetail}{دنباله‌جدول‌بندی}
+\setinterfacevariable{tall}{دراز}
+\setinterfacevariable{teletype}{دورنگاره}
+\setinterfacevariable{temporary}{موقتی}
+\setinterfacevariable{test}{تست}
+\setinterfacevariable{text}{متن}
+\setinterfacevariable{three}{سه}
+\setinterfacevariable{thursday}{پنج‌شنبه}
+\setinterfacevariable{title}{عنوان}
+\setinterfacevariable{toggle}{تغییر}
+\setinterfacevariable{tolerant}{بردبار}
+\setinterfacevariable{top}{بالا}
+\setinterfacevariable{tuesday}{سه‌شنبه}
+\setinterfacevariable{two}{دو}
+\setinterfacevariable{txt}{txt}
+\setinterfacevariable{type}{تایپ}
+\setinterfacevariable{typing}{تایپ‌کردن}
+\setinterfacevariable{unavailable}{غیرموجود}
+\setinterfacevariable{underbar}{میله‌زیر}
+\setinterfacevariable{underbars}{میله‌‌های‌زیر}
+\setinterfacevariable{unit}{واحد}
+\setinterfacevariable{units}{واحدها}
+\setinterfacevariable{unknown}{ناشناس}
+\setinterfacevariable{unpacked}{غیرفشرده}
+\setinterfacevariable{up}{up}
+\setinterfacevariable{url}{url}
+\setinterfacevariable{used}{استفاده‌شده}
+\setinterfacevariable{value}{مقدار}
+\setinterfacevariable{vertical}{عمودی}
+\setinterfacevariable{very}{خیلی}
+\setinterfacevariable{verystrict}{خیلی‌سختگیر}
+\setinterfacevariable{verytolerant}{خیلی‌بردبار}
+\setinterfacevariable{weak}{هفته}
+\setinterfacevariable{wednesday}{چهارشنبه}
+\setinterfacevariable{week}{هفته}
+\setinterfacevariable{weekday}{روزهفته}
+\setinterfacevariable{white}{سفید}
+\setinterfacevariable{wide}{گسترده}
+\setinterfacevariable{width}{عرض}
+\setinterfacevariable{xml}{xml}
+\setinterfacevariable{year}{سال}
+\setinterfacevariable{yes}{بله}
+% definitions for interface constants for language pe
+%
+\setinterfaceconstant{action}{کنش}
+\setinterfaceconstant{address}{نشانی}
+\setinterfaceconstant{after}{بعداز}
+\setinterfaceconstant{afterhead}{بعدازسر}
+\setinterfaceconstant{afterkey}{بعدازکلید}
+\setinterfaceconstant{aftersection}{aftersection}
+\setinterfaceconstant{align}{تنظیم}
+\setinterfaceconstant{aligncharacter}{حرف‌تنظیم}
+\setinterfaceconstant{alignmentcharacter}{حرف‌تنظیم‌کردن}
+\setinterfaceconstant{alignsymbol}{alignsymbol}
+\setinterfaceconstant{aligntitle}{عنوان‌تنظیم}
+\setinterfaceconstant{alternative}{جایگزین}
+\setinterfaceconstant{andtext}{andtext}
+\setinterfaceconstant{apa}{apa}
+\setinterfaceconstant{arrow}{پیکان}
+\setinterfaceconstant{artauthor}{artauthor}
+\setinterfaceconstant{artauthoretaldisplay}{artauthoretaldisplay}
+\setinterfaceconstant{artauthoretallimit}{artauthoretallimit}
+\setinterfaceconstant{artauthoretaltext}{artauthoretaltext}
+\setinterfaceconstant{at}{در}
+\setinterfaceconstant{author}{نویسنده}
+\setinterfaceconstant{authoretaldisplay}{authoretaldisplay}
+\setinterfaceconstant{authoretallimit}{authoretallimit}
+\setinterfaceconstant{authoretaltext}{authoretaltext}
+\setinterfaceconstant{auto}{خودکار}
+\setinterfaceconstant{autocase}{autocase}
+\setinterfaceconstant{autofile}{پرونده‌خودکار}
+\setinterfaceconstant{autofocus}{تمرکز‌خودکار}
+\setinterfaceconstant{autohang}{آویزان‌خودکار}
+\setinterfaceconstant{autostrut}{بست‌خودکار}
+\setinterfaceconstant{autowidth}{عرض‌خودکار}
+\setinterfaceconstant{axis}{محورها}
+\setinterfaceconstant{background}{پس‌زمینه}
+\setinterfaceconstant{backgroundcolor}{رنگ‌پس‌زمینه}
+\setinterfaceconstant{backgroundcorner}{گوشه‌پس‌زمینه}
+\setinterfaceconstant{backgrounddepth}{عمق‌پس‌زمینه}
+\setinterfaceconstant{backgroundoffset}{آفست‌پس‌زمینه}
+\setinterfaceconstant{backgroundradius}{شعاع‌پس‌زمینه}
+\setinterfaceconstant{backgroundscreen}{پرده‌پس‌زمینه}
+\setinterfaceconstant{backreference}{backreference}
+\setinterfaceconstant{backspace}{فضای‌پس}
+\setinterfaceconstant{balance}{تعادل}
+\setinterfaceconstant{before}{قبل‌از}
+\setinterfaceconstant{beforehead}{قبل‌ازسر}
+\setinterfaceconstant{beforesection}{beforesection}
+\setinterfaceconstant{bet}{bet}
+\setinterfaceconstant{big}{بزرگ}
+\setinterfaceconstant{blank}{خالی}
+\setinterfaceconstant{blockway}{راه‌بلوک}
+\setinterfaceconstant{bodyfont}{قلم‌بدنه}
+\setinterfaceconstant{bookmark}{چوبخط}
+\setinterfaceconstant{bottom}{پایین}
+\setinterfaceconstant{bottomafter}{bottomafter}
+\setinterfaceconstant{bottombefore}{bottombefore}
+\setinterfaceconstant{bottomdistance}{فاصله‌پایین}
+\setinterfaceconstant{bottomframe}{قالب‌پایین}
+\setinterfaceconstant{bottomoffset}{آفست‌پایین}
+\setinterfaceconstant{bottomspace}{فضای‌پایین}
+\setinterfaceconstant{bottomstate}{وضعیت‌پایین}
+\setinterfaceconstant{buffer}{buffer}
+\setinterfaceconstant{cache}{میانگیر}
+\setinterfaceconstant{calculate}{محاسبه}
+\setinterfaceconstant{category}{category}
+\setinterfaceconstant{ccommand}{فرمان}
+\setinterfaceconstant{click}{فشردن}
+\setinterfaceconstant{clickin}{فشردن‌داخل}
+\setinterfaceconstant{clickout}{فشردن‌خارج}
+\setinterfaceconstant{clipoffset}{آفست‌کلیپ}
+\setinterfaceconstant{closeaction}{بستن‌کنش}
+\setinterfaceconstant{closecommand}{بستن‌فرمان}
+\setinterfaceconstant{closepage}{closepage}
+\setinterfaceconstant{closepageaction}{بستن‌عمل‌صفحه}
+\setinterfaceconstant{closesymbol}{بستن‌نماد}
+\setinterfaceconstant{color}{رنگ}
+\setinterfaceconstant{column}{ستون}
+\setinterfaceconstant{columndistance}{فاصله‌ستون}
+\setinterfaceconstant{columns}{ستونها}
+\setinterfaceconstant{command}{فرمان}
+\setinterfaceconstant{commandafter}{فرمان‌بعداز}
+\setinterfaceconstant{commandbefore}{فرمان‌قبل‌از}
+\setinterfaceconstant{commands}{فرمانها}
+\setinterfaceconstant{component}{مولفه}
+\setinterfaceconstant{compoundhyphen}{compoundhyphen}
+\setinterfaceconstant{compress}{فشردن}
+\setinterfaceconstant{connector}{connector}
+\setinterfaceconstant{continue}{ادامه}
+\setinterfaceconstant{contrastcolor}{contrastcolor}
+\setinterfaceconstant{controls}{کنترلها}
+\setinterfaceconstant{conversion}{تبدیل}
+\setinterfaceconstant{convertfile}{پرونده‌تبدیل}
+\setinterfaceconstant{corner}{گوشه}
+\setinterfaceconstant{coupling}{تزویج}
+\setinterfaceconstant{couplingway}{روش‌تزویج}
+\setinterfaceconstant{criterium}{criterium}
+\setinterfaceconstant{current}{جاری}
+\setinterfaceconstant{cutspace}{فضای‌برش}
+\setinterfaceconstant{dash}{دش}
+\setinterfaceconstant{dat}{dat}
+\setinterfaceconstant{database}{database}
+\setinterfaceconstant{date}{تاریخ}
+\setinterfaceconstant{deepnumbercommand}{فرمان‌شماره‌عمیق}
+\setinterfaceconstant{deeptextcommand}{فرمان‌متن‌عمیق}
+\setinterfaceconstant{default}{پیش‌فرض}
+\setinterfaceconstant{delay}{تاخیر}
+\setinterfaceconstant{depth}{عمق}
+\setinterfaceconstant{depthcorrection}{تصحیح‌عمق}
+\setinterfaceconstant{direction}{جهت}
+\setinterfaceconstant{directory}{پوشه}
+\setinterfaceconstant{display}{نمایش}
+\setinterfaceconstant{distance}{فاصله}
+\setinterfaceconstant{dot}{نقطه}
+\setinterfaceconstant{doublesided}{دورو}
+\setinterfaceconstant{dummy}{مصنوعی}
+\setinterfaceconstant{dx}{dx}
+\setinterfaceconstant{dy}{dy}
+\setinterfaceconstant{edge}{لبه}
+\setinterfaceconstant{edgedistance}{فاصله‌لبه}
+\setinterfaceconstant{editor}{editor}
+\setinterfaceconstant{editoretaldisplay}{editoretaldisplay}
+\setinterfaceconstant{editoretallimit}{editoretallimit}
+\setinterfaceconstant{editoretaltext}{editoretaltext}
+\setinterfaceconstant{empty}{تهی}
+\setinterfaceconstant{entries}{entries}
+\setinterfaceconstant{equalheight}{ارتفاع‌یکسان}
+\setinterfaceconstant{equalwidth}{عرض‌یکسان}
+\setinterfaceconstant{escape}{فرار}
+\setinterfaceconstant{evenmargin}{حاشیه‌زوج}
+\setinterfaceconstant{expansion}{گسترش}
+\setinterfaceconstant{export}{export}
+\setinterfaceconstant{extras}{extras}
+\setinterfaceconstant{factor}{عامل}
+\setinterfaceconstant{fallback}{عقب‌ریختن}
+\setinterfaceconstant{family}{خانواده}
+\setinterfaceconstant{fieldbackgroundcolor}{رنگ‌پس‌زمینه‌میدان}
+\setinterfaceconstant{fieldframecolor}{رنگ‌قالب‌میدان}
+\setinterfaceconstant{fieldlayer}{لایه‌میدان}
+\setinterfaceconstant{fieldoffset}{آفست‌میدان}
+\setinterfaceconstant{file}{پرونده}
+\setinterfaceconstant{filtercommand}{filtercommand}
+\setinterfaceconstant{finalnamesep}{finalnamesep}
+\setinterfaceconstant{firstnamesep}{firstnamesep}
+\setinterfaceconstant{focus}{تمرکز}
+\setinterfaceconstant{focusin}{تمرکزدرون}
+\setinterfaceconstant{focusout}{تمرکزبیرون}
+\setinterfaceconstant{footer}{ته‌برگ}
+\setinterfaceconstant{footerdistance}{فاصله‌ته‌برگ}
+\setinterfaceconstant{footerstate}{وضعیت‌ته‌برگ}
+\setinterfaceconstant{force}{اجبار}
+\setinterfaceconstant{foregroundcolor}{رنگ‌پیش‌زمینه}
+\setinterfaceconstant{foregroundstyle}{سبک‌پیش‌زمینه}
+\setinterfaceconstant{format}{شمایل}
+\setinterfaceconstant{frame}{قالب}
+\setinterfaceconstant{framecolor}{رنگ‌قالب}
+\setinterfaceconstant{framecorner}{گوشه‌قالب}
+\setinterfaceconstant{framedepth}{عمق‌قالب}
+\setinterfaceconstant{frameoffset}{آفست‌قالب}
+\setinterfaceconstant{frameradius}{شعاع‌قالب}
+\setinterfaceconstant{frames}{قالبها}
+\setinterfaceconstant{from}{از}
+\setinterfaceconstant{get}{بگیر}
+\setinterfaceconstant{global}{سراسری}
+\setinterfaceconstant{grid}{توری}
+\setinterfaceconstant{hang}{بیاویز}
+\setinterfaceconstant{headalign}{headalign}
+\setinterfaceconstant{headcolor}{رنگ‌سر}
+\setinterfaceconstant{headcommand}{فرمان‌سر}
+\setinterfaceconstant{headconversion}{تبدیل‌سر}
+\setinterfaceconstant{header}{سربرگ}
+\setinterfaceconstant{headerdistance}{فاصله‌سربرگ}
+\setinterfaceconstant{headerstate}{وضعیت‌سربرگ}
+\setinterfaceconstant{headlabel}{برچسب‌سر}
+\setinterfaceconstant{headnumber}{شماره‌سر}
+\setinterfaceconstant{headstyle}{سبک‌سر}
+\setinterfaceconstant{height}{ارتفاع}
+\setinterfaceconstant{hfactor}{عامل‌ارتفاع}
+\setinterfaceconstant{hfil}{پرکردن‌ارتفاع}
+\setinterfaceconstant{hidenumber}{hidenumber}
+\setinterfaceconstant{hoffset}{آفست‌ا}
+\setinterfaceconstant{horoffset}{آفست‌افق}
+\setinterfaceconstant{hyphen}{شکستن}
+\setinterfaceconstant{icommand}{icommand}
+\setinterfaceconstant{in}{درون}
+\setinterfaceconstant{inbetween}{دربین}
+\setinterfaceconstant{increment}{افزایش}
+\setinterfaceconstant{incrementnumber}{شماره‌افزایش}
+\setinterfaceconstant{indenting}{تورفتگی}
+\setinterfaceconstant{indentnext}{متن‌تورفته}
+\setinterfaceconstant{indicator}{اندیکاتور}
+\setinterfaceconstant{inner}{داخلی}
+\setinterfaceconstant{innermargin}{حاشیه‌داخلی}
+\setinterfaceconstant{inputfile}{پرونده‌ورودی}
+\setinterfaceconstant{intent}{intent}
+\setinterfaceconstant{interaction}{پانل}
+\setinterfaceconstant{interlinespace}{فضای‌بین‌خط}
+\setinterfaceconstant{internalgrid}{internalgrid}
+\setinterfaceconstant{itemalign}{تنظیم‌آیتم}
+\setinterfaceconstant{items}{آیتمها}
+\setinterfaceconstant{juniorsep}{juniorsep}
+\setinterfaceconstant{ken}{ken}
+\setinterfaceconstant{keyexpansion}{گسترش‌کلید}
+\setinterfaceconstant{keys}{keys}
+\setinterfaceconstant{keyword}{کلید‌واژه}
+\setinterfaceconstant{label}{برچسب}
+\setinterfaceconstant{lastnamesep}{lastnamesep}
+\setinterfaceconstant{lastpubsep}{lastpubsep}
+\setinterfaceconstant{left}{چپ}
+\setinterfaceconstant{leftcolor}{رنگ‌چپ}
+\setinterfaceconstant{leftcompoundhyphen}{leftcompoundhyphen}
+\setinterfaceconstant{leftedge}{لبه‌چپ}
+\setinterfaceconstant{leftedgedistance}{فاصله‌لبه‌چپ}
+\setinterfaceconstant{leftframe}{قالب‌چپ}
+\setinterfaceconstant{lefthyphen}{شکست‌چپ}
+\setinterfaceconstant{leftmargin}{حاشیه‌چپ}
+\setinterfaceconstant{leftmargindistance}{فاصله‌حاشیه‌چپ}
+\setinterfaceconstant{leftoffset}{آفست‌چپ}
+\setinterfaceconstant{leftquotation}{نقل‌قول‌چپ}
+\setinterfaceconstant{leftquote}{نقل‌چپ}
+\setinterfaceconstant{leftsentence}{جمله‌چپ}
+\setinterfaceconstant{leftspeech}{سخنرانی‌چپ}
+\setinterfaceconstant{leftstyle}{سبک‌چپ}
+\setinterfaceconstant{leftsubsentence}{زیرجمله‌چپ}
+\setinterfaceconstant{lefttext}{متن‌چپ}
+\setinterfaceconstant{leftwidth}{عرض‌خط}
+\setinterfaceconstant{level}{مرحله}
+\setinterfaceconstant{levels}{مرحله‌ها}
+\setinterfaceconstant{limittext}{مرزمتن}
+\setinterfaceconstant{line}{خط}
+\setinterfaceconstant{linecorrection}{تصحیح‌خط}
+\setinterfaceconstant{lines}{خطها}
+\setinterfaceconstant{list}{لیست}
+\setinterfaceconstant{listtext}{متن‌لیست}
+\setinterfaceconstant{local}{موضعی}
+\setinterfaceconstant{location}{مکان}
+\setinterfaceconstant{logo}{آرم}
+\setinterfaceconstant{logos}{آرمها}
+\setinterfaceconstant{marcolor}{رنگ‌حاش}
+\setinterfaceconstant{margin}{حاشیه}
+\setinterfaceconstant{margindistance}{فاصله‌حاشیه}
+\setinterfaceconstant{marginedge}{لبه‌حاشیه}
+\setinterfaceconstant{marginedgetext}{متن‌لبه‌حاشیه}
+\setinterfaceconstant{margintext}{متن‌حاشیه}
+\setinterfaceconstant{marking}{نشانه‌گذاری}
+\setinterfaceconstant{marstyle}{سبک‌حاش}
+\setinterfaceconstant{mask}{mask}
+\setinterfaceconstant{max}{بیشترین}
+\setinterfaceconstant{maxdepth}{maxdepth}
+\setinterfaceconstant{maxheight}{بیشترین‌ارتفاع}
+\setinterfaceconstant{maxwidth}{بیشترین‌عرض}
+\setinterfaceconstant{maybeyear}{maybeyear}
+\setinterfaceconstant{menu}{منو}
+\setinterfaceconstant{method}{روش}
+\setinterfaceconstant{middle}{میان}
+\setinterfaceconstant{middlespeech}{سخنرانی‌میانی}
+\setinterfaceconstant{middletext}{متن‌میانی}
+\setinterfaceconstant{midsentence}{جمله‌میانی}
+\setinterfaceconstant{min}{کمترین}
+\setinterfaceconstant{mindepth}{کمترین‌عمق}
+\setinterfaceconstant{minheight}{کمترین‌ارتفاع}
+\setinterfaceconstant{minwidth}{کمترین‌عرض}
+\setinterfaceconstant{monthconversion}{monthconversion}
+\setinterfaceconstant{n}{n}
+\setinterfaceconstant{name}{نام}
+\setinterfaceconstant{namesep}{namesep}
+\setinterfaceconstant{nbottom}{nbottom}
+\setinterfaceconstant{nc}{nc}
+\setinterfaceconstant{next}{بعدی}
+\setinterfaceconstant{nl}{nl}
+\setinterfaceconstant{nleft}{nleft}
+\setinterfaceconstant{nlines}{nlines}
+\setinterfaceconstant{norm}{norm}
+\setinterfaceconstant{nr}{nr}
+\setinterfaceconstant{nright}{nright}
+\setinterfaceconstant{ntop}{ntop}
+\setinterfaceconstant{number}{شماره}
+\setinterfaceconstant{numbercolor}{رنگ‌شماره}
+\setinterfaceconstant{numbercommand}{فرمان‌شماره}
+\setinterfaceconstant{numberconversion}{numberconversion}
+\setinterfaceconstant{numberconversionset}{numberconversionset}
+\setinterfaceconstant{numberdistance}{فاصله‌شماره}
+\setinterfaceconstant{numbering}{شماره‌گذاری}
+\setinterfaceconstant{numberorder}{numberorder}
+\setinterfaceconstant{numberprefix}{numberprefix}
+\setinterfaceconstant{numbersegments}{numbersegments}
+\setinterfaceconstant{numberseparator}{جداکننده‌شماره}
+\setinterfaceconstant{numberseparatorset}{numberseparatorset}
+\setinterfaceconstant{numberset}{numberset}
+\setinterfaceconstant{numberstarter}{numberstarter}
+\setinterfaceconstant{numberstopper}{numberstopper}
+\setinterfaceconstant{numberstyle}{سبک‌شماره}
+\setinterfaceconstant{numberwidth}{عرض‌شماره}
+\setinterfaceconstant{nx}{nx}
+\setinterfaceconstant{ny}{ny}
+\setinterfaceconstant{object}{شیئ}
+\setinterfaceconstant{obstruction}{انسداد}
+\setinterfaceconstant{oddmargin}{حاشیه‌فرد}
+\setinterfaceconstant{offset}{آفست}
+\setinterfaceconstant{openaction}{عمل‌باز}
+\setinterfaceconstant{openpage}{openpage}
+\setinterfaceconstant{openpageaction}{عمل‌صفحه‌باز}
+\setinterfaceconstant{option}{گزینه}
+\setinterfaceconstant{order}{order}
+\setinterfaceconstant{orientation}{جهت‌دهی}
+\setinterfaceconstant{otherstext}{otherstext}
+\setinterfaceconstant{outermargin}{حاشیه‌خارجی}
+\setinterfaceconstant{overprint}{overprint}
+\setinterfaceconstant{ownnumber}{شماره‌خود}
+\setinterfaceconstant{page}{صفحه}
+\setinterfaceconstant{pageboundaries}{مرزهای‌صفحه}
+\setinterfaceconstant{pagecolor}{رنگ‌صفحه}
+\setinterfaceconstant{pagecommand}{فرمان‌صفحه}
+\setinterfaceconstant{pageconversion}{pageconversion}
+\setinterfaceconstant{pageconversionset}{pageconversionset}
+\setinterfaceconstant{pagenumber}{شماره‌صفحه}
+\setinterfaceconstant{pageprefix}{pageprefix}
+\setinterfaceconstant{pageprefixconnector}{pageprefixconnector}
+\setinterfaceconstant{pageprefixconversion}{pageprefixconversion}
+\setinterfaceconstant{pageprefixconversionset}{pageprefixconversionset}
+\setinterfaceconstant{pageprefixsegments}{pageprefixsegments}
+\setinterfaceconstant{pageprefixseparatorset}{pageprefixseparatorset}
+\setinterfaceconstant{pageprefixset}{pageprefixset}
+\setinterfaceconstant{pageprefixstarter}{pageprefixstarter}
+\setinterfaceconstant{pageprefixstopper}{pageprefixstopper}
+\setinterfaceconstant{pagesegments}{pagesegments}
+\setinterfaceconstant{pageseparatorset}{pageseparatorset}
+\setinterfaceconstant{pageset}{pageset}
+\setinterfaceconstant{pagestarter}{pagestarter}
+\setinterfaceconstant{pagestate}{وضعیت‌صفحه}
+\setinterfaceconstant{pagestopper}{pagestopper}
+\setinterfaceconstant{pagestyle}{سبک‌صفحه}
+\setinterfaceconstant{palet}{لوح}
+\setinterfaceconstant{paper}{برگ}
+\setinterfaceconstant{paragraph}{پاراگراف}
+\setinterfaceconstant{place}{بگذار}
+\setinterfaceconstant{placehead}{بگذارسر}
+\setinterfaceconstant{placestopper}{بگذارایست}
+\setinterfaceconstant{position}{موقعیت}
+\setinterfaceconstant{prefix}{پیشوند}
+\setinterfaceconstant{prefixconnector}{prefixconnector}
+\setinterfaceconstant{prefixconversion}{prefixconversion}
+\setinterfaceconstant{prefixconversionset}{prefixconversionset}
+\setinterfaceconstant{prefixsegments}{prefixsegments}
+\setinterfaceconstant{prefixseparatorset}{prefixseparatorset}
+\setinterfaceconstant{prefixset}{prefixset}
+\setinterfaceconstant{prefixstarter}{prefixstarter}
+\setinterfaceconstant{prefixstopper}{prefixstopper}
+\setinterfaceconstant{preset}{preset}
+\setinterfaceconstant{preview}{پیش‌دید}
+\setinterfaceconstant{previous}{قبلی}
+\setinterfaceconstant{previousnumber}{شماره‌قبلی}
+\setinterfaceconstant{process}{پردازش}
+\setinterfaceconstant{profile}{profile}
+\setinterfaceconstant{pubsep}{pubsep}
+\setinterfaceconstant{radius}{شعاع}
+\setinterfaceconstant{random}{تصادفی}
+\setinterfaceconstant{range}{range}
+\setinterfaceconstant{reduction}{کاهش}
+\setinterfaceconstant{ref}{رج}
+\setinterfaceconstant{refcommand}{refcommand}
+\setinterfaceconstant{reference}{مرجع}
+\setinterfaceconstant{referenceprefix}{referenceprefix}
+\setinterfaceconstant{referencing}{مراجعه}
+\setinterfaceconstant{regionin}{ناحیه‌درون}
+\setinterfaceconstant{regionout}{ناحیه‌بیرون}
+\setinterfaceconstant{repeat}{تکرار}
+\setinterfaceconstant{reset}{بازنشانی}
+\setinterfaceconstant{resetnumber}{بازنشانی‌شماره}
+\setinterfaceconstant{resolution}{کیفیت}
+\setinterfaceconstant{right}{راست}
+\setinterfaceconstant{rightcolor}{رنگ‌راست}
+\setinterfaceconstant{rightcompoundhyphen}{rightcompoundhyphen}
+\setinterfaceconstant{rightedge}{لبه‌راست}
+\setinterfaceconstant{rightedgedistance}{فاصله‌لبه‌راست}
+\setinterfaceconstant{rightframe}{قالب‌راست}
+\setinterfaceconstant{righthyphen}{righthyphen}
+\setinterfaceconstant{rightmargin}{حاشیه‌راست}
+\setinterfaceconstant{rightmargindistance}{فاصله‌حاشیه‌راست}
+\setinterfaceconstant{rightoffset}{آفست‌راست}
+\setinterfaceconstant{rightquotation}{نقل‌قول‌راست}
+\setinterfaceconstant{rightquote}{نقل‌راست}
+\setinterfaceconstant{rightsentence}{جمله‌راست}
+\setinterfaceconstant{rightspeech}{سخنرانی‌راست}
+\setinterfaceconstant{rightstyle}{سبک‌راست}
+\setinterfaceconstant{rightsubsentence}{زیرجمله‌راست}
+\setinterfaceconstant{righttext}{متن‌راست}
+\setinterfaceconstant{rightwidth}{عرض‌راست}
+\setinterfaceconstant{rotation}{دوران}
+\setinterfaceconstant{rule}{خط}
+\setinterfaceconstant{rulecolor}{رنگ‌خط}
+\setinterfaceconstant{rulethickness}{ضخامت‌خط}
+\setinterfaceconstant{samepage}{همان‌صفحه}
+\setinterfaceconstant{sample}{نمونه}
+\setinterfaceconstant{samplesize}{samplesize}
+\setinterfaceconstant{saveinlist}{saveinlist}
+\setinterfaceconstant{scale}{مقیاس}
+\setinterfaceconstant{scope}{طرح}
+\setinterfaceconstant{screen}{پرده}
+\setinterfaceconstant{section}{بخش}
+\setinterfaceconstant{sectionconversion}{sectionconversion}
+\setinterfaceconstant{sectionconversionset}{sectionconversionset}
+\setinterfaceconstant{sectionnumber}{شماره‌بخش}
+\setinterfaceconstant{sectionresetset}{sectionresetset}
+\setinterfaceconstant{sectionsegments}{sectionsegments}
+\setinterfaceconstant{sectionseparatorset}{sectionseparatorset}
+\setinterfaceconstant{sectionset}{sectionset}
+\setinterfaceconstant{sectionstarter}{sectionstarter}
+\setinterfaceconstant{sectionstopper}{sectionstopper}
+\setinterfaceconstant{separator}{جداکننده}
+\setinterfaceconstant{set}{قراربده}
+\setinterfaceconstant{setups}{بارگذاریها}
+\setinterfaceconstant{side}{کنار}
+\setinterfaceconstant{sidealign}{تنظیم‌کنار}
+\setinterfaceconstant{sidemethod}{روش‌کنار}
+\setinterfaceconstant{sidespaceafter}{فضای‌کناری‌بعد}
+\setinterfaceconstant{sidespacebefore}{فضای‌کناری‌قبل}
+\setinterfaceconstant{sign}{علامت}
+\setinterfaceconstant{size}{اندازه}
+\setinterfaceconstant{small}{کوچک}
+\setinterfaceconstant{sort}{sort}
+\setinterfaceconstant{sorttype}{ترتیب‌تایپ}
+\setinterfaceconstant{source}{منبع}
+\setinterfaceconstant{space}{فضا}
+\setinterfaceconstant{spaceafter}{فضا‌بعداز}
+\setinterfaceconstant{spacebefore}{فضا‌قبل‌از}
+\setinterfaceconstant{spaceinbetween}{فضا‌دربین}
+\setinterfaceconstant{spacing}{فضاگذاری}
+\setinterfaceconstant{split}{شکافتن}
+\setinterfaceconstant{splitcolor}{شکافتن‌رنگ}
+\setinterfaceconstant{splitmethod}{روش‌شکافتن}
+\setinterfaceconstant{splitoffset}{شکافتن‌آفست}
+\setinterfaceconstant{spot}{لکه}
+\setinterfaceconstant{stack}{توده}
+\setinterfaceconstant{start}{شروع}
+\setinterfaceconstant{starter}{starter}
+\setinterfaceconstant{state}{وضعیت}
+\setinterfaceconstant{step}{گام}
+\setinterfaceconstant{stop}{پایان}
+\setinterfaceconstant{stopper}{ایست}
+\setinterfaceconstant{stretch}{کشیدن}
+\setinterfaceconstant{strip}{strip}
+\setinterfaceconstant{strut}{بست}
+\setinterfaceconstant{style}{سبک}
+\setinterfaceconstant{sub}{زیر}
+\setinterfaceconstant{subtitle}{زیرعنوان}
+\setinterfaceconstant{suffix}{پسوند}
+\setinterfaceconstant{suffixseparator}{suffixseparator}
+\setinterfaceconstant{surnamesep}{surnamesep}
+\setinterfaceconstant{sx}{sx}
+\setinterfaceconstant{sy}{sy}
+\setinterfaceconstant{symalign}{تنظیم‌نماد}
+\setinterfaceconstant{symbol}{نماد}
+\setinterfaceconstant{symbolset}{مجموعه‌نماد}
+\setinterfaceconstant{symcolor}{رنگ‌نماد}
+\setinterfaceconstant{symstyle}{سبک‌نماد}
+\setinterfaceconstant{synonym}{مترادف}
+\setinterfaceconstant{synonymcolor}{رنگ‌مترادف}
+\setinterfaceconstant{synonymcommand}{synonymcommand}
+\setinterfaceconstant{synonymstyle}{سبک‌مترادف}
+\setinterfaceconstant{tab}{تب}
+\setinterfaceconstant{text}{متن}
+\setinterfaceconstant{textcolor}{رنگ‌متن}
+\setinterfaceconstant{textcommand}{فرمان‌متن}
+\setinterfaceconstant{textdistance}{فاصله‌متن}
+\setinterfaceconstant{textlayer}{لایه‌متن}
+\setinterfaceconstant{textmargin}{حاشیه‌متن}
+\setinterfaceconstant{textmethod}{روش‌متن}
+\setinterfaceconstant{textseparator}{جداکننده‌متن}
+\setinterfaceconstant{textsize}{اندازه‌متن}
+\setinterfaceconstant{textstate}{وضعیت‌متن}
+\setinterfaceconstant{textstyle}{سبک‌متن}
+\setinterfaceconstant{textwidth}{عرض‌متن}
+\setinterfaceconstant{threshold}{threshold}
+\setinterfaceconstant{title}{عنوان}
+\setinterfaceconstant{titlecolor}{رنگ‌عنوان}
+\setinterfaceconstant{titlecommand}{فرمان‌عنوان}
+\setinterfaceconstant{titledistance}{فاصله‌عنوان}
+\setinterfaceconstant{titleleft}{عنوان‌چپ}
+\setinterfaceconstant{titleright}{عنوان‌راست}
+\setinterfaceconstant{titlestyle}{سبک‌عنوان}
+\setinterfaceconstant{to}{به}
+\setinterfaceconstant{tolerance}{بردباری}
+\setinterfaceconstant{top}{بالا}
+\setinterfaceconstant{topdistance}{فاصله‌بالا}
+\setinterfaceconstant{topframe}{قالب‌راست}
+\setinterfaceconstant{topoffset}{آفست‌بالا}
+\setinterfaceconstant{topspace}{فضای‌بالا}
+\setinterfaceconstant{topstate}{وضعیت‌بالا}
+\setinterfaceconstant{totalnumber}{totalnumber}
+\setinterfaceconstant{type}{تایپ}
+\setinterfaceconstant{unit}{واحد}
+\setinterfaceconstant{unknownreference}{مرجع‌ناشناس}
+\setinterfaceconstant{urlalternative}{urlalternative}
+\setinterfaceconstant{urlspace}{urlspace}
+\setinterfaceconstant{validate}{تاییداعتبار}
+\setinterfaceconstant{values}{values}
+\setinterfaceconstant{vcommand}{vcommand}
+\setinterfaceconstant{veroffset}{آفست‌عم}
+\setinterfaceconstant{vfil}{vfil}
+\setinterfaceconstant{voffset}{آفست‌ع}
+\setinterfaceconstant{vonsep}{vonsep}
+\setinterfaceconstant{way}{راه}
+\setinterfaceconstant{wfactor}{wfactor}
+\setinterfaceconstant{white}{سفید}
+\setinterfaceconstant{width}{عرض}
+\setinterfaceconstant{xfactor}{فاکتورایکس}
+\setinterfaceconstant{xmax}{xmax}
+\setinterfaceconstant{xoffset}{آفست‌ایکس}
+\setinterfaceconstant{xscale}{مقیاس‌ایکس}
+\setinterfaceconstant{xstep}{گام‌ایکس}
+\setinterfaceconstant{yfactor}{فاکتوروای}
+\setinterfaceconstant{ymax}{ymax}
+\setinterfaceconstant{yoffset}{آفست‌وای}
+\setinterfaceconstant{yscale}{مقیاس‌وای}
+\setinterfaceconstant{ystep}{گام‌وای}
+% definitions for interface elements for language pe
+%
+\setinterfaceelement{answerlines}{answerlines}
+\setinterfaceelement{answerspace}{answerspace}
+\setinterfaceelement{begin}{عنصرها}
+\setinterfaceelement{complete}{کامل}
+\setinterfaceelement{coupled}{مزدوج}
+\setinterfaceelement{currentlocal}{موضعی‌جاری}
+\setinterfaceelement{emptyone}{یک‌خالی}
+\setinterfaceelement{emptytwo}{دوخالی}
+\setinterfaceelement{end}{انتها}
+\setinterfaceelement{endsetup}{انتهای‌بارگذاری}
+\setinterfaceelement{get}{بگیر}
+\setinterfaceelement{increment}{افزایش}
+\setinterfaceelement{list}{لیست}
+\setinterfaceelement{listof}{لیست‌از}
+\setinterfaceelement{load}{بارگذاشتن}
+\setinterfaceelement{local}{موضعی}
+\setinterfaceelement{makeup}{آرایش}
+\setinterfaceelement{next}{بعدی}
+\setinterfaceelement{place}{مکان}
+\setinterfaceelement{previous}{قبلی}
+\setinterfaceelement{previouslocal}{موضع‌قبلی}
+\setinterfaceelement{reserve}{رزرو}
+\setinterfaceelement{see}{ببینید}
+\setinterfaceelement{setup}{بارگذاری}
+\setinterfaceelement{start}{شروع}
+\setinterfaceelement{stop}{پایان}
+\setinterfaceelement{text}{متن}
+\setinterfaceelement{type}{تایپ}
+% definitions for interface commands for language pe
+%
+\setinterfacecommand{CAPPED}{CAP}
+\setinterfacecommand{Character}{Character}
+\setinterfacecommand{Characters}{Characters}
+\setinterfacecommand{MONTH}{MONTH}
+\setinterfacecommand{Numbers}{Numbers}
+\setinterfacecommand{Romannumerals}{Romannumerals}
+\setinterfacecommand{SmallCapped}{Cap}
+\setinterfacecommand{SmallCaps}{Caps}
+\setinterfacecommand{WEEKDAY}{WEEKDAY}
+\setinterfacecommand{WORD}{WORD}
+\setinterfacecommand{WORDS}{WORDS}
+\setinterfacecommand{Word}{Word}
+\setinterfacecommand{Words}{Words}
+\setinterfacecommand{about}{درمورد}
+\setinterfacecommand{adaptlayout}{تنظیم‌طرح‌بندی}
+\setinterfacecommand{arg}{افزودن}
+\setinterfacecommand{at}{در}
+\setinterfacecommand{atleftmargin}{درحاشیه‌چپ}
+\setinterfacecommand{atpage}{درصفحه}
+\setinterfacecommand{atrightmargin}{درحاشیه‌راست}
+\setinterfacecommand{background}{پس‌زمینه}
+\setinterfacecommand{backspace}{فاصله‌پشت}
+\setinterfacecommand{blackrule}{خط‌سیاه}
+\setinterfacecommand{blackrules}{خطهای‌سیاه}
+\setinterfacecommand{blank}{خالی}
+\setinterfacecommand{bookmark}{چوبخط}
+\setinterfacecommand{bottomdistance}{فاصله‌پایین}
+\setinterfacecommand{bottomheight}{ارتفاع‌پایین}
+\setinterfacecommand{bottomspace}{فضای‌پایین}
+\setinterfacecommand{but}{اما}
+\setinterfacecommand{button}{دکمه}
+\setinterfacecommand{bypassblocks}{عبوربلوکها}
+\setinterfacecommand{character}{حرف}
+\setinterfacecommand{characters}{حرفها}
+\setinterfacecommand{chem}{chem}
+\setinterfacecommand{clip}{گیره}
+\setinterfacecommand{clonefield}{میدان‌شبیه‌سازی}
+\setinterfacecommand{color}{رنگ}
+\setinterfacecommand{colorbar}{میله‌رنگ}
+\setinterfacecommand{colorvalue}{مقداررنگ}
+\setinterfacecommand{column}{ستون}
+\setinterfacecommand{comparecolorgroup}{مقایسه‌گروه‌رنگ}
+\setinterfacecommand{comparepalet}{لوح‌مقایسه}
+\setinterfacecommand{completepagenumber}{شماره‌صفحه‌کامل}
+\setinterfacecommand{completeregister}{ثبت‌کامل}
+\setinterfacecommand{component}{مولفه}
+\setinterfacecommand{convertnumber}{شماره‌مبدل}
+\setinterfacecommand{copyfield}{میدان‌کپی}
+\setinterfacecommand{correctwhitespace}{فضای‌سفیدصحیح}
+\setinterfacecommand{coupledocument}{نوشتارزوج}
+\setinterfacecommand{couplemarking}{نشانه‌گذاری‌زوج}
+\setinterfacecommand{couplepage}{صفحه‌زوج}
+\setinterfacecommand{couplepaper}{کاغذزوج}
+\setinterfacecommand{coupleregister}{ثبت‌زوج}
+\setinterfacecommand{crlf}{crlf}
+\setinterfacecommand{currentdate}{تاریخ‌جاری}
+\setinterfacecommand{currentheadnumber}{شماره‌سرجاری}
+\setinterfacecommand{cutspace}{فضای‌برش}
+\setinterfacecommand{date}{تاریخ}
+\setinterfacecommand{decouplemarking}{جداسازی‌نشانه‌گذاری}
+\setinterfacecommand{decrementnumber}{شماره‌کاهش}
+\setinterfacecommand{define}{تعریف}
+\setinterfacecommand{defineaccent}{تعریف‌لهجه}
+\setinterfacecommand{defineblank}{تعریف‌خالی}
+\setinterfacecommand{defineblock}{تعریف‌بلوک}
+\setinterfacecommand{definebodyfont}{تعریف‌قلم‌متن}
+\setinterfacecommand{definebodyfontenvironment}{تعریف‌محیط‌قلم‌بدنه}
+\setinterfacecommand{definebuffer}{تعریف‌بافر}
+\setinterfacecommand{definecharacter}{تعریف‌حرف}
+\setinterfacecommand{definecolor}{تعریف‌رنگ}
+\setinterfacecommand{definecolorgroup}{تعریف‌گروه‌رنگ}
+\setinterfacecommand{definecolumnbreak}{تعریف‌شکستن‌ستون}
+\setinterfacecommand{definecolumnset}{تعریف‌مجموعه‌ستون}
+\setinterfacecommand{definecombination}{تعریف‌ترکیب}
+\setinterfacecommand{definecombinedlist}{تعریف‌لیست‌ترکیبی}
+\setinterfacecommand{definecommand}{تعریف‌فرمان}
+\setinterfacecommand{defineconversion}{تعریف‌تبدیل}
+\setinterfacecommand{definedescription}{تعریف‌شرح}
+\setinterfacecommand{defineenumeration}{تعریف‌شماره‌بندی}
+\setinterfacecommand{definefield}{تعریف‌میدان}
+\setinterfacecommand{definefieldstack}{تعریف‌توده‌میدان}
+\setinterfacecommand{definefiguresymbol}{تعریف‌نمادشکل}
+\setinterfacecommand{definefloat}{تعریف‌شناور}
+\setinterfacecommand{definefont}{تعریف‌قلم}
+\setinterfacecommand{definefontstyle}{تعریف‌سبک‌قلم}
+\setinterfacecommand{definefontsynonym}{تعریف‌مترادف‌قلم}
+\setinterfacecommand{defineframed}{تعریف‌قالبی}
+\setinterfacecommand{defineframedtext}{تعریف‌متن‌قالبی}
+\setinterfacecommand{definehbox}{تعریف‌جعبه‌‌افقی}
+\setinterfacecommand{definehead}{تعریف‌سر}
+\setinterfacecommand{defineindenting}{تعریف‌تورفتگی}
+\setinterfacecommand{defineinmargin}{تعریف‌درون‌حاشیه}
+\setinterfacecommand{defineinteractionmenu}{تعریف‌منوی‌پانل}
+\setinterfacecommand{defineitemgroup}{تعریف‌گروه‌آیتم}
+\setinterfacecommand{definelabel}{تعریف‌برچسب}
+\setinterfacecommand{definelayer}{تعریف‌لایه}
+\setinterfacecommand{definelayout}{تعریف‌طرح‌بندی}
+\setinterfacecommand{definelist}{تعریف‌لیست}
+\setinterfacecommand{definelogo}{تعریف‌آرم}
+\setinterfacecommand{definemainfield}{تعریف‌میدان‌اصلی}
+\setinterfacecommand{definemakeup}{تعریف‌آرایش}
+\setinterfacecommand{definemarking}{تعریف‌نشانه‌گذاری}
+\setinterfacecommand{definemathalignment}{تعریف‌تنظیم‌ریاضی}
+\setinterfacecommand{defineoutput}{تعریف‌خروجی}
+\setinterfacecommand{defineoverlay}{تعریف‌پوشش}
+\setinterfacecommand{definepagebreak}{تعریف‌شکست‌صفحه}
+\setinterfacecommand{definepalet}{تعریف‌لوح}
+\setinterfacecommand{definepapersize}{تعریف‌اندازه‌برگ}
+\setinterfacecommand{defineparagraphs}{تعریف‌پاراگرافها}
+\setinterfacecommand{defineplacement}{تعریف‌جانشانی}
+\setinterfacecommand{defineprofile}{تعریف‌پروفایل}
+\setinterfacecommand{defineprogram}{تعریف‌برنامه}
+\setinterfacecommand{definerawfont}{تعریف‌قلم‌خام}
+\setinterfacecommand{definereference}{تعریف‌مرجع}
+\setinterfacecommand{definereferenceformat}{تعریف‌شمایل‌مرجع}
+\setinterfacecommand{definereferencelist}{تعریف‌لیست‌مرجع}
+\setinterfacecommand{defineregister}{تعریف‌ثبت}
+\setinterfacecommand{definerule}{تعریف‌خط‌حائل}
+\setinterfacecommand{definesection}{تعریف‌بخش}
+\setinterfacecommand{definesectionblock}{تعریف‌بلوک‌بخش}
+\setinterfacecommand{definesorting}{تعریف‌ترتیب}
+\setinterfacecommand{definestartstop}{تعریف‌شروع‌پایان}
+\setinterfacecommand{definestyle}{تعریف‌سبک}
+\setinterfacecommand{definesubfield}{تعریف‌زیرمیدان}
+\setinterfacecommand{definesymbol}{تعریف‌نماد}
+\setinterfacecommand{definesynonyms}{تعریف‌مترادفها}
+\setinterfacecommand{definetabletemplate}{تعریف‌الگوی‌جدول}
+\setinterfacecommand{definetabulate}{تعریف‌جدول‌بندی}
+\setinterfacecommand{definetext}{تعریف‌متن}
+\setinterfacecommand{definetextposition}{تعریف‌مکان‌متن}
+\setinterfacecommand{definetextvariable}{تعریف‌متغیرمتن}
+\setinterfacecommand{definetype}{تعریف‌تایپ}
+\setinterfacecommand{definetyping}{تعریف‌تایپ‌کردن}
+\setinterfacecommand{defineversion}{تعریف‌نسخه}
+\setinterfacecommand{determineheadnumber}{تعیین‌شماره‌سر}
+\setinterfacecommand{determinelistcharacteristics}{تعیین‌مشخصات‌لیست}
+\setinterfacecommand{determineregistercharacteristics}{تعیین‌مشخصات‌ثبت}
+\setinterfacecommand{dimension}{بعد}
+\setinterfacecommand{disableinteractionmenu}{ازکارانداختن‌منوی‌پانل}
+\setinterfacecommand{domicile}{مسکن}
+\setinterfacecommand{donttest}{امتحان‌نکن}
+\setinterfacecommand{edgedistance}{فاصله‌لبه}
+\setinterfacecommand{edgewidth}{عرض‌لبه}
+\setinterfacecommand{emptylines}{خطها‌خالی}
+\setinterfacecommand{environment}{محیط}
+\setinterfacecommand{externalfigure}{شکل‌خارجی}
+\setinterfacecommand{fact}{حقیقت}
+\setinterfacecommand{field}{میدان}
+\setinterfacecommand{fieldstack}{میدان‌پشته}
+\setinterfacecommand{fillinfield}{درج‌درمیدان}
+\setinterfacecommand{fillinline}{درج‌درخط}
+\setinterfacecommand{fillinrules}{درج‌درخطها}
+\setinterfacecommand{fillintext}{درج‌درمتن}
+\setinterfacecommand{fitfield}{پرکردن‌میدان}
+\setinterfacecommand{fixedspace}{فضای‌ثابت}
+\setinterfacecommand{fixedspaces}{فضاهای‌ثابت}
+\setinterfacecommand{followprofile}{پیروی‌پروفایل}
+\setinterfacecommand{followprofileversion}{پیروی‌نسخه‌پروفایل}
+\setinterfacecommand{followversion}{پیروی‌نسخه}
+\setinterfacecommand{footerdistance}{فاصله‌ته‌برگ}
+\setinterfacecommand{footerheight}{ارتفاع‌ته‌برگ}
+\setinterfacecommand{footnote}{پانوشت}
+\setinterfacecommand{footnotetext}{متن‌پانوشت}
+\setinterfacecommand{forceblocks}{اجباربلوکها}
+\setinterfacecommand{formulanumber}{شماره‌فرمول}
+\setinterfacecommand{fraction}{کسر}
+\setinterfacecommand{framed}{قالبی}
+\setinterfacecommand{from}{از}
+\setinterfacecommand{getbuffer}{دریافت‌بافر}
+\setinterfacecommand{getmarking}{دریافت‌نشانه}
+\setinterfacecommand{getnumber}{دریافت‌شماره}
+\setinterfacecommand{godown}{بروپایین}
+\setinterfacecommand{goto}{بروبه}
+\setinterfacecommand{gotobox}{بروبه‌جعبه}
+\setinterfacecommand{gotopage}{بروبه‌صفحه}
+\setinterfacecommand{graycolor}{رنگ‌خاکستری}
+\setinterfacecommand{greyvalue}{مقدارخاکستری}
+\setinterfacecommand{grid}{توری}
+\setinterfacecommand{hairline}{خط‌مو}
+\setinterfacecommand{head}{سر}
+\setinterfacecommand{headerdistance}{فاصله‌سربرگ}
+\setinterfacecommand{headerheight}{ارتفاع‌سربرگ}
+\setinterfacecommand{headlevel}{مرحله‌سر}
+\setinterfacecommand{headnumber}{شماره‌سر}
+\setinterfacecommand{headsym}{نمادسر}
+\setinterfacecommand{headtext}{متن‌سر}
+\setinterfacecommand{hideblocks}{بلوکها‌پنهان}
+\setinterfacecommand{high}{بلند}
+\setinterfacecommand{hl}{خ‌ا}
+\setinterfacecommand{immediatebetweenlist}{فوری‌بین‌لیست}
+\setinterfacecommand{immediatetolist}{فوری‌به‌لیست}
+\setinterfacecommand{in}{درون}
+\setinterfacecommand{incrementnumber}{شماره‌افزایش}
+\setinterfacecommand{indenting}{تورفتگی}
+\setinterfacecommand{inframed}{درقالبی}
+\setinterfacecommand{infull}{درپر}
+\setinterfacecommand{ininner}{درداخلی}
+\setinterfacecommand{inleft}{درچپ}
+\setinterfacecommand{inleftedge}{درلبه‌چپ}
+\setinterfacecommand{inleftmargin}{درحاشیه‌چپ}
+\setinterfacecommand{inline}{درخط}
+\setinterfacecommand{inmargin}{درحاشیه}
+\setinterfacecommand{inmframed}{inmframed}
+\setinterfacecommand{inneredgedistance}{فاصله‌لبه‌داخلی}
+\setinterfacecommand{inneredgewidth}{عرض‌لبه‌داخلی}
+\setinterfacecommand{innermargindistance}{فاصله‌حاشیه‌داخلی}
+\setinterfacecommand{innermarginwidth}{عرض‌حاشیه‌داخلی}
+\setinterfacecommand{inothermargin}{درحاشیه‌دیگر}
+\setinterfacecommand{inouter}{درخارجی}
+\setinterfacecommand{inright}{درراست}
+\setinterfacecommand{inrightedge}{درلبه‌راست}
+\setinterfacecommand{inrightmargin}{درحاشیه‌راست}
+\setinterfacecommand{installlanguage}{نصب‌زبان}
+\setinterfacecommand{interactionbar}{میله‌پانل}
+\setinterfacecommand{interactionbuttons}{دکمه‌پانل}
+\setinterfacecommand{interactionmenu}{منوی‌پانل}
+\setinterfacecommand{item}{آیتم}
+\setinterfacecommand{items}{آیتمها}
+\setinterfacecommand{its}{its}
+\setinterfacecommand{keepblocks}{حفظ‌بلوکها}
+\setinterfacecommand{label}{برچسب}
+\setinterfacecommand{labels}{برچسبها}
+\setinterfacecommand{labeltext}{متن‌برچسب}
+\setinterfacecommand{language}{زبان}
+\setinterfacecommand{leftaligned}{چپ‌چین}
+\setinterfacecommand{leftedgedistance}{فاصله‌لبه‌چپ}
+\setinterfacecommand{leftedgewidth}{عرض‌لبه‌چپ}
+\setinterfacecommand{leftmargindistance}{فاصله‌حاشیه‌چپ}
+\setinterfacecommand{leftmarginwidth}{عرض‌حاشیه‌چپ}
+\setinterfacecommand{leg}{پا}
+\setinterfacecommand{linewidth}{عرض‌خط}
+\setinterfacecommand{listheight}{ارتفاع‌خط}
+\setinterfacecommand{listlength}{طول‌لیست}
+\setinterfacecommand{listsymbol}{نمادلیست}
+\setinterfacecommand{listwidth}{عرض‌لیست}
+\setinterfacecommand{logfields}{میدانهای‌گزارش}
+\setinterfacecommand{lohi}{پابا}
+\setinterfacecommand{low}{پایین}
+\setinterfacecommand{macroname}{نام‌ماکرو}
+\setinterfacecommand{mainlanguage}{زبان‌اصلی}
+\setinterfacecommand{makeupheight}{ارتفاع‌آرایش}
+\setinterfacecommand{makeupwidth}{عرض‌آرایش}
+\setinterfacecommand{mar}{حاش}
+\setinterfacecommand{margindistance}{فاصله‌حاشیه}
+\setinterfacecommand{marginrule}{خط‌حاشیه}
+\setinterfacecommand{margintext}{متن‌حاشیه}
+\setinterfacecommand{margintitle}{عنوان‌حاشیه}
+\setinterfacecommand{marginwidth}{عرض‌حاشیه}
+\setinterfacecommand{marginword}{کلمه‌حاشیه}
+\setinterfacecommand{marking}{نشانه‌گذاری}
+\setinterfacecommand{markversion}{نسخه‌نشانه}
+\setinterfacecommand{mathematics}{ریاضی}
+\setinterfacecommand{menubutton}{دکمه‌منو}
+\setinterfacecommand{mframed}{mframed}
+\setinterfacecommand{midaligned}{تنظیم‌وسط}
+\setinterfacecommand{mirror}{آینه}
+\setinterfacecommand{month}{ماه}
+\setinterfacecommand{moveformula}{انتقال‌فرمول}
+\setinterfacecommand{moveongrid}{انتقال‌به‌توری}
+\setinterfacecommand{movesidefloat}{انتقال‌کنار‌شناور}
+\setinterfacecommand{navigating}{هدایت}
+\setinterfacecommand{nodimension}{بدون‌بعد}
+\setinterfacecommand{noheaderandfooterlines}{بدون‌خط‌سروته‌برگ}
+\setinterfacecommand{noindenting}{بدون‌تورفتگی}
+\setinterfacecommand{nolist}{بدون‌لیست}
+\setinterfacecommand{nomarking}{بدون‌نشانه‌گذاری}
+\setinterfacecommand{nomoreblocks}{بدون‌بلوکهای‌بیشتر}
+\setinterfacecommand{nomorefiles}{بدون‌فایلهای‌بیشتر}
+\setinterfacecommand{nop}{منفی}
+\setinterfacecommand{nospace}{بدون‌فضا}
+\setinterfacecommand{note}{یادداشت}
+\setinterfacecommand{notopandbottomlines}{بدون‌خط‌بالاوپایین}
+\setinterfacecommand{notsmallcapped}{سرپوش‌کوچک‌نه}
+\setinterfacecommand{nowhitespace}{بدون‌فضای‌سفید}
+\setinterfacecommand{numberofsubpages}{شماره‌زیرصفحه}
+\setinterfacecommand{numbers}{شماره‌ها}
+\setinterfacecommand{outeredgedistance}{فاصله‌لبه‌خارجی}
+\setinterfacecommand{outeredgewidth}{عرض‌لبه‌خارجی}
+\setinterfacecommand{outermargindistance}{فاصله‌حاشیه‌خارجی}
+\setinterfacecommand{outermarginwidth}{عرض‌حاشیه‌خارجی}
+\setinterfacecommand{packed}{فشرده}
+\setinterfacecommand{page}{صفحه}
+\setinterfacecommand{pagedepth}{عمق‌صفحه}
+\setinterfacecommand{pagenumber}{شماره‌صفحه}
+\setinterfacecommand{pageoffset}{آفست‌صفحه}
+\setinterfacecommand{pagereference}{مرجع‌صفحه}
+\setinterfacecommand{pagetype}{نوع‌صفحه}
+\setinterfacecommand{paperheight}{ارتفاع‌برگ}
+\setinterfacecommand{paperwidth}{عرض‌برگ}
+\setinterfacecommand{periods}{نقطه‌ها}
+\setinterfacecommand{plaatsruwelijst}{درج‌لیست‌خام}
+\setinterfacecommand{placebookmarks}{درج‌چوب‌خط}
+\setinterfacecommand{placecombinedlist}{درج‌لیست‌مختلط}
+\setinterfacecommand{placefloat}{درج‌شناور}
+\setinterfacecommand{placefootnotes}{درج‌پانوشتها}
+\setinterfacecommand{placeformula}{درج‌فرمول}
+\setinterfacecommand{placeheadnumber}{درج‌شماره‌سر}
+\setinterfacecommand{placeheadtext}{درج‌متن‌سر}
+\setinterfacecommand{placelegend}{درج‌راهنما}
+\setinterfacecommand{placelist}{درج‌لیست}
+\setinterfacecommand{placelocalfootnotes}{درج‌پانوشتهای‌موضعی}
+\setinterfacecommand{placelogos}{درج‌آرمها}
+\setinterfacecommand{placeongrid}{درج‌در‌توری}
+\setinterfacecommand{placeontopofeachother}{درج‌در‌بالای‌یکدیگر}
+\setinterfacecommand{placepagenumber}{درج‌شماره‌صفحه}
+\setinterfacecommand{placereferencelist}{درج‌لیست‌مرجع}
+\setinterfacecommand{placeregister}{درج‌ثبت}
+\setinterfacecommand{placerule}{درج‌خط}
+\setinterfacecommand{placesidebyside}{درج‌کنار‌به‌کنار}
+\setinterfacecommand{placesubformula}{درج‌زیرفرمول}
+\setinterfacecommand{placetextvariable}{درج‌متغیرمتن}
+\setinterfacecommand{position}{مکان}
+\setinterfacecommand{positiontext}{مکان‌متن}
+\setinterfacecommand{printpaperheight}{چاپ‌ارتفاع‌برگ}
+\setinterfacecommand{printpaperwidth}{چاپ‌عرض‌برگ}
+\setinterfacecommand{processblocks}{بلوکهای‌پردازش}
+\setinterfacecommand{processpage}{صفحه‌پردازش}
+\setinterfacecommand{product}{تولید}
+\setinterfacecommand{program}{برنامه}
+\setinterfacecommand{project}{پروژه}
+\setinterfacecommand{publication}{نشر}
+\setinterfacecommand{quotation}{نقل‌قول}
+\setinterfacecommand{quote}{نقل}
+\setinterfacecommand{ran}{ran}
+\setinterfacecommand{redo}{انجام‌دوباره}
+\setinterfacecommand{ref}{رج}
+\setinterfacecommand{reference}{مرجع}
+\setinterfacecommand{referral}{رجوع}
+\setinterfacecommand{referraldate}{تاریخ‌رجوع}
+\setinterfacecommand{referring}{مراجعه}
+\setinterfacecommand{remark}{توجه}
+\setinterfacecommand{reset}{بازنشانی}
+\setinterfacecommand{resetmarking}{بازنشانی‌نشانه‌گذاری}
+\setinterfacecommand{resetnumber}{بازنشانی‌شماره}
+\setinterfacecommand{resettext}{بازنشانی‌متن}
+\setinterfacecommand{rightaligned}{تنظیم‌راست}
+\setinterfacecommand{rightedgedistance}{فاصله‌لبه‌راست}
+\setinterfacecommand{rightedgewidth}{عرض‌لبه‌راست}
+\setinterfacecommand{rightmargindistance}{فاصله‌حاشیه‌راست}
+\setinterfacecommand{rightmarginwidth}{عرض‌حاشیه‌راست}
+\setinterfacecommand{romannumerals}{اعدادلاتین}
+\setinterfacecommand{rotate}{دوران}
+\setinterfacecommand{scale}{مقیاس}
+\setinterfacecommand{screen}{پرده}
+\setinterfacecommand{selectblocks}{انتخاب‌بلوکها}
+\setinterfacecommand{selectpaper}{انتخاب‌برگ}
+\setinterfacecommand{selectversion}{انتخاب‌نسخه}
+\setinterfacecommand{setnumber}{تعیین‌شماره}
+\setinterfacecommand{settextcontent}{تعیین‌محتوای‌متن}
+\setinterfacecommand{settextvariable}{تعیین‌متغیر‌متن}
+\setinterfacecommand{setupalign}{بارگذاری‌تنظیم}
+\setinterfacecommand{setupanswerarea}{setupanswerarea}
+\setinterfacecommand{setuparranging}{بارگذاری‌ترتیب}
+\setinterfacecommand{setupbackground}{بارگذاری‌پس‌زمینه}
+\setinterfacecommand{setupbackgrounds}{بارگذاری‌پس‌زمینه‌ها}
+\setinterfacecommand{setupblackrules}{بارگذاری‌خطهای‌سیاه}
+\setinterfacecommand{setupblank}{بارگذاری‌خالی}
+\setinterfacecommand{setupblock}{بارگذاری‌بلوک}
+\setinterfacecommand{setupbodyfont}{بارگذاری‌قلم‌متن}
+\setinterfacecommand{setupbodyfontenvironment}{بارگذاری‌محیط‌قلم‌متن}
+\setinterfacecommand{setupbottom}{بارگذاری‌پایین}
+\setinterfacecommand{setupbottomtexts}{بارگذاری‌متن‌پایین}
+\setinterfacecommand{setupbuffer}{بارگذاری‌بافر}
+\setinterfacecommand{setupbuttons}{بارگذاری‌دکمه‌ها}
+\setinterfacecommand{setupcapitals}{setupcapitals}
+\setinterfacecommand{setupcaption}{بارگذاری‌شرح}
+\setinterfacecommand{setupcaptions}{بارگذاری‌شرحها}
+\setinterfacecommand{setupclipping}{بارگذاری‌چیدن}
+\setinterfacecommand{setupcolor}{بارگذاری‌رنگ}
+\setinterfacecommand{setupcolors}{بارگذاری‌رنگها}
+\setinterfacecommand{setupcolumns}{بارگذاری‌ستونها}
+\setinterfacecommand{setupcolumnset}{بارگذاری‌مجموعه‌ستون}
+\setinterfacecommand{setupcolumnsetlines}{بارگذاری‌خطهای‌مجموعه‌ستون}
+\setinterfacecommand{setupcolumnsetstart}{بارگذاری‌شروع‌مجموعه‌ستون}
+\setinterfacecommand{setupcombinations}{بارگذاری‌ترکیب‌ها}
+\setinterfacecommand{setupcombinedlist}{بارگذاری‌لیست‌ترکیبی}
+\setinterfacecommand{setupcomment}{بارگذاری‌توضیح}
+\setinterfacecommand{setupdescriptions}{بارگذاری‌شرح}
+\setinterfacecommand{setupenumerations}{بارگذاری‌شماره‌گذاریها}
+\setinterfacecommand{setupexternalfigures}{بارگذاری‌شکلهای‌خارجی}
+\setinterfacecommand{setupfield}{بارگذاری‌میدان}
+\setinterfacecommand{setupfields}{بارگذاری‌میدانها}
+\setinterfacecommand{setupfillinlines}{بارگذاری‌پرکردن‌خطها}
+\setinterfacecommand{setupfillinrules}{بارگذاری‌درج‌درخطها}
+\setinterfacecommand{setupfloat}{بارگذاری‌شناور}
+\setinterfacecommand{setupfloats}{بارگذاری‌شناورها}
+\setinterfacecommand{setupfloatsplitting}{بارگذاری‌شکافتن‌شناورها}
+\setinterfacecommand{setupfooter}{بارگذاری‌ته‌برگ}
+\setinterfacecommand{setupfootertexts}{بارگذاری‌متن‌پانوشت}
+\setinterfacecommand{setupfootnotedefinition}{بارگذاری‌تعریف‌پانوشت}
+\setinterfacecommand{setupfootnotes}{بارگذاری‌پانوشتها}
+\setinterfacecommand{setupforms}{بارگذاری‌طرح}
+\setinterfacecommand{setupformulas}{بارگذاری‌فرمولها}
+\setinterfacecommand{setupframed}{بارگذاری‌قالبی}
+\setinterfacecommand{setupframedtexts}{بارگذاری‌متن‌قالبی}
+\setinterfacecommand{setuphead}{بارگذاری‌سر}
+\setinterfacecommand{setupheader}{بارگذاری‌سربرگ}
+\setinterfacecommand{setupheadertexts}{بارگذاری‌متن‌سربرگ}
+\setinterfacecommand{setupheadnumber}{بارگذاری‌شماره‌سر}
+\setinterfacecommand{setupheads}{بارگذاری‌سرها}
+\setinterfacecommand{setupheadtext}{بارگذاری‌متن‌سر}
+\setinterfacecommand{setuphyphenmark}{بارگذاری‌نشانه‌شکستن}
+\setinterfacecommand{setupindentations}{بارگذاری‌تورفتگیها}
+\setinterfacecommand{setupindenting}{بارگذاری‌تورفتگی}
+\setinterfacecommand{setupinmargin}{بارگذاری‌درون‌حاشیه}
+\setinterfacecommand{setupinteraction}{بارگذاری‌پانل}
+\setinterfacecommand{setupinteractionbar}{بارگذاری‌میله‌پانل}
+\setinterfacecommand{setupinteractionmenu}{بارگذاری‌منوی‌پانل}
+\setinterfacecommand{setupinteractionscreen}{بارگذاری‌پرده‌پانل}
+\setinterfacecommand{setupinterlinespace}{بارگذاری‌فاصله‌بین‌خط}
+\setinterfacecommand{setupitemgroup}{بارگذاری‌گروه‌آیتم}
+\setinterfacecommand{setupitemgroups}{بارگذاری‌گروههای‌آیتم}
+\setinterfacecommand{setupitems}{بارگذاری‌آیتمها}
+\setinterfacecommand{setuplabeltext}{باگذاری‌متن‌برچسب}
+\setinterfacecommand{setuplanguage}{بارگذاری‌زبان}
+\setinterfacecommand{setuplayout}{بارگذاری‌طرح‌بندی}
+\setinterfacecommand{setuplegend}{بارگذاری‌راهنما}
+\setinterfacecommand{setuplinenumbering}{بارگذاری‌شماره‌‌گذاری‌خط}
+\setinterfacecommand{setuplines}{بارگذاری‌خطها}
+\setinterfacecommand{setuplinewidth}{بارگذاری‌عرض‌خط}
+\setinterfacecommand{setuplist}{بارگذاری‌لیست}
+\setinterfacecommand{setupmakeup}{بارگذاری‌آرایش}
+\setinterfacecommand{setupmarginblocks}{بارگذاری‌بلوکهای‌حاشیه}
+\setinterfacecommand{setupmarginrules}{بارگذاری‌خطهای‌حاشیه}
+\setinterfacecommand{setupmarking}{بارگذاری‌نشانه‌گذاری}
+\setinterfacecommand{setupmathalignment}{بارگذاری‌تنظیم‌ریاضی}
+\setinterfacecommand{setupnarrower}{بارگذاری‌باریکتر}
+\setinterfacecommand{setupnumber}{بارگذاری‌شماره}
+\setinterfacecommand{setupnumbering}{بارگذاری‌شماره‌گذاری}
+\setinterfacecommand{setupoppositeplacing}{بارگذاری‌درج‌مخالف}
+\setinterfacecommand{setupoutput}{بارگذاری‌خروجی}
+\setinterfacecommand{setuppagecomment}{بارگذاری‌توضیح‌صفحه}
+\setinterfacecommand{setuppagenumber}{بارگذاری‌شماره‌صفحه}
+\setinterfacecommand{setuppagenumbering}{بارگذاری‌شماره‌گذاری‌صفحه}
+\setinterfacecommand{setuppagetransitions}{بارگذاری‌گذارصفحه}
+\setinterfacecommand{setuppalet}{بارگذاری‌لوح}
+\setinterfacecommand{setuppaper}{بارگذاری‌برگ}
+\setinterfacecommand{setuppapersize}{بارگذاری‌اندازه‌برگ}
+\setinterfacecommand{setupparagraphnumbering}{بارگذاری‌شماره‌گذاری‌پاراگراف}
+\setinterfacecommand{setupparagraphs}{بارگذاری‌پاراگرافها}
+\setinterfacecommand{setupplacement}{بارگذاری‌جانشانی}
+\setinterfacecommand{setuppositioning}{بارگذاری‌مکان‌گذاری}
+\setinterfacecommand{setupprofiles}{بارگذاری‌پروفایلها}
+\setinterfacecommand{setupprograms}{بارگذاری‌برنامه‌ها}
+\setinterfacecommand{setuppublications}{بارگذاری‌نشرها}
+\setinterfacecommand{setupquote}{بارگذاری‌نقل}
+\setinterfacecommand{setupreferencelist}{بارگذاری‌لیست‌مرجع}
+\setinterfacecommand{setupreferencing}{بارگذاری‌ارجاع}
+\setinterfacecommand{setupregister}{بارگذاری‌ثبت}
+\setinterfacecommand{setuprotate}{بارگذاری‌دوران}
+\setinterfacecommand{setuprule}{بارگذاری‌خط}
+\setinterfacecommand{setups}{بارگذاریها}
+\setinterfacecommand{setupscreens}{بارگذاری‌پرده‌ها}
+\setinterfacecommand{setupsection}{بارگذاری‌بخش}
+\setinterfacecommand{setupsectionblock}{بارگذاری‌بلوک‌بخش}
+\setinterfacecommand{setupsorting}{بارگذاری‌ترتیب}
+\setinterfacecommand{setupspacing}{بارگذاری‌فضا‌گذاری}
+\setinterfacecommand{setupstartstop}{بارگذاری‌شروع‌پایان}
+\setinterfacecommand{setupstrut}{بارگذاری‌بست}
+\setinterfacecommand{setupsubpagenumber}{بارگذاری‌شماره‌زیرصفحه}
+\setinterfacecommand{setupsymbolset}{بارگذاری‌مجموعه‌نماد}
+\setinterfacecommand{setupsynchronization}{بارگذاری‌تطابق}
+\setinterfacecommand{setupsynchronizationbar}{بارگذاری‌میله‌تطابق}
+\setinterfacecommand{setupsynonyms}{بارگذاری‌مترادفها}
+\setinterfacecommand{setupsystem}{بارگذاری‌سیستم}
+\setinterfacecommand{setuptab}{بارگذاری‌تب}
+\setinterfacecommand{setuptables}{بارگذاری‌جدولها}
+\setinterfacecommand{setuptabulate}{بارگذاری‌جدول‌بندی}
+\setinterfacecommand{setuptext}{بارگذاری‌متن}
+\setinterfacecommand{setuptextposition}{بارگذاری‌مکان‌متن}
+\setinterfacecommand{setuptextrules}{بارگذاری‌خطهای‌متن}
+\setinterfacecommand{setuptexttexts}{بارگذاری‌متن‌متنها}
+\setinterfacecommand{setuptextvariable}{بارگذاری‌متغیر‌متن}
+\setinterfacecommand{setupthinrules}{بارگذاری‌خطها‌ی‌نازک}
+\setinterfacecommand{setuptolerance}{بارگذاری‌بردباری}
+\setinterfacecommand{setuptop}{بارگذاری‌بالا}
+\setinterfacecommand{setuptoptexts}{بارگذاری‌متنهای‌بالا}
+\setinterfacecommand{setuptype}{بارگذاری‌تایپ}
+\setinterfacecommand{setuptyping}{بارگذاری‌تایپ‌کردن}
+\setinterfacecommand{setupunderbar}{بارگذاری‌میله‌زیر}
+\setinterfacecommand{setupurl}{setupurl}
+\setinterfacecommand{setupversions}{بارگذاری‌نسخه‌ها}
+\setinterfacecommand{setupwhitespace}{بارگذاری‌فضای‌سفید}
+\setinterfacecommand{showbodyfont}{نمایش‌قلم‌بدنه}
+\setinterfacecommand{showbodyfontenvironment}{نمایش‌محیط‌قلم‌بدنه}
+\setinterfacecommand{showcolor}{نمایش‌رنگ}
+\setinterfacecommand{showcolorgroup}{نمایش‌گروه‌رنگ}
+\setinterfacecommand{showexternalfigures}{نمایش‌شکلهای‌خارجی}
+\setinterfacecommand{showfields}{نمایش‌میدانها}
+\setinterfacecommand{showframe}{نمایش‌قالب}
+\setinterfacecommand{showgrid}{نمایش‌توری}
+\setinterfacecommand{showlayout}{نمایش‌طرح‌بندی}
+\setinterfacecommand{showmakeup}{نمایش‌آرایش}
+\setinterfacecommand{showpalet}{نمایش‌لوح}
+\setinterfacecommand{showprint}{نمایش‌چاپ}
+\setinterfacecommand{showsetups}{نمایش‌بارگذاریها}
+\setinterfacecommand{showstruts}{نمایش‌بستها}
+\setinterfacecommand{showsymbolset}{نمایش‌مجموعه‌علامت}
+\setinterfacecommand{smallcapped}{cap}
+\setinterfacecommand{someline}{یک‌خط}
+\setinterfacecommand{somewhere}{یک‌جا}
+\setinterfacecommand{space}{فضا}
+\setinterfacecommand{splitfloat}{شکافتن‌شناور}
+\setinterfacecommand{startalignment}{شروع‌تنظیم}
+\setinterfacecommand{startbackground}{شروع‌پس‌زمینه}
+\setinterfacecommand{startcoding}{شروع‌کد}
+\setinterfacecommand{startcolor}{شروع‌رنگ}
+\setinterfacecommand{startcolumnmakeup}{شروع‌آرایش‌ستون}
+\setinterfacecommand{startcolumns}{شروع‌ستونها}
+\setinterfacecommand{startcolumnset}{شروع‌مجموعه‌ستون}
+\setinterfacecommand{startcombination}{شروع‌ترکیب}
+\setinterfacecommand{startcomponent}{شروع‌مولفه}
+\setinterfacecommand{startdocument}{شروع‌نوشتار}
+\setinterfacecommand{startenvironment}{شروع‌محیط}
+\setinterfacecommand{startfigure}{شروع‌شکل}
+\setinterfacecommand{startglobal}{شروع‌سراسری}
+\setinterfacecommand{startline}{شروع‌خط}
+\setinterfacecommand{startlinecorrection}{شروع‌تصحیح‌خط}
+\setinterfacecommand{startlinenumbering}{شروع‌شماره‌گذاری‌خط}
+\setinterfacecommand{startlines}{شروع‌خطها}
+\setinterfacecommand{startlocal}{شروع‌موضعی}
+\setinterfacecommand{startlocalfootnotes}{شروع‌پانوشتهای‌موضعی}
+\setinterfacecommand{startmakeup}{شروع‌آرایش}
+\setinterfacecommand{startmarginblock}{شروع‌بلوک‌حاشیه}
+\setinterfacecommand{startmarginrule}{شروع‌خط‌حاشیه}
+\setinterfacecommand{startnarrower}{شروع‌باریکتر}
+\setinterfacecommand{startopposite}{شروع‌مخالف}
+\setinterfacecommand{startoverlay}{شروع‌پوشش}
+\setinterfacecommand{startoverzicht}{شروع‌بازبینی}
+\setinterfacecommand{startpacked}{شروع‌فشرده}
+\setinterfacecommand{startpositioning}{شروع‌مکان‌گذاری}
+\setinterfacecommand{startproduct}{شروع‌تولید}
+\setinterfacecommand{startprofile}{شروع‌پروفایل}
+\setinterfacecommand{startproject}{شروع‌پروژه}
+\setinterfacecommand{startquotation}{شروع‌نقل‌قول}
+\setinterfacecommand{startraster}{startraster}
+\setinterfacecommand{startsymbolset}{شروع‌مجموعه‌نماد}
+\setinterfacecommand{startsynchronization}{شروع‌تطابق}
+\setinterfacecommand{starttable}{شروع‌جدول}
+\setinterfacecommand{starttables}{شروع‌جدولها}
+\setinterfacecommand{starttext}{شروع‌متن}
+\setinterfacecommand{starttextrule}{شروع‌خط‌متن}
+\setinterfacecommand{startunpacked}{شروع‌غیر‌فشرده}
+\setinterfacecommand{startversion}{شروع‌نسخه}
+\setinterfacecommand{stopalignment}{پایان‌تنظیم}
+\setinterfacecommand{stopbackground}{پایان‌پس‌زمینه}
+\setinterfacecommand{stopcoding}{پایان‌کد}
+\setinterfacecommand{stopcolor}{پایان‌رنگ}
+\setinterfacecommand{stopcolumnmakeup}{پایان‌آرایش‌ستون}
+\setinterfacecommand{stopcolumns}{پایان‌ستونها}
+\setinterfacecommand{stopcolumnset}{پایان‌مجموعه‌ستون}
+\setinterfacecommand{stopcombination}{پایان‌ترکیب}
+\setinterfacecommand{stopcomponent}{پایان‌مولفه}
+\setinterfacecommand{stopdocument}{پایان‌نوشتار}
+\setinterfacecommand{stopenvironment}{پایان‌محیط}
+\setinterfacecommand{stopglobal}{پایان‌سراسری}
+\setinterfacecommand{stopline}{پایان‌خط}
+\setinterfacecommand{stoplinecorrection}{پایان‌تصحیح‌خط}
+\setinterfacecommand{stoplinenumbering}{پایان‌شماره‌گذاری‌خط}
+\setinterfacecommand{stoplines}{پایان‌خطها}
+\setinterfacecommand{stoplocal}{پایان‌موضعی}
+\setinterfacecommand{stoplocalfootnotes}{پایان‌پانوشتهای‌موضعی}
+\setinterfacecommand{stopmakeup}{پایان‌آرایش}
+\setinterfacecommand{stopmarginblock}{پایان‌بلوک‌حاشیه}
+\setinterfacecommand{stopmarginrule}{پایان‌خط‌حاشیه}
+\setinterfacecommand{stopnarrower}{پایان‌نازکتر}
+\setinterfacecommand{stopopposite}{پایان‌مخالف}
+\setinterfacecommand{stopoverlay}{پایان‌پوشش}
+\setinterfacecommand{stopoverzicht}{پایان‌بازبینی}
+\setinterfacecommand{stoppacked}{پایان‌فشرده}
+\setinterfacecommand{stoppositioning}{پایان‌مکان‌گذاری}
+\setinterfacecommand{stopproduct}{پایان‌تولید}
+\setinterfacecommand{stopprofile}{پایان‌پروفایل}
+\setinterfacecommand{stopproject}{پایان‌پروژه}
+\setinterfacecommand{stopquotation}{پایان‌نقل‌قول}
+\setinterfacecommand{stopraster}{stopraster}
+\setinterfacecommand{stopsynchronization}{پایان‌تطابق}
+\setinterfacecommand{stoptable}{پایان‌جدول}
+\setinterfacecommand{stoptables}{پایان‌جدولها}
+\setinterfacecommand{stoptext}{پایان‌متن}
+\setinterfacecommand{stoptextrule}{پایان‌خط‌متن}
+\setinterfacecommand{stopunpacked}{پایان‌غیرفشرده}
+\setinterfacecommand{stopversion}{پایان‌نسخه}
+\setinterfacecommand{stretched}{کشیده}
+\setinterfacecommand{subformulanumber}{شماره‌زیرفرمول}
+\setinterfacecommand{subpagenumber}{شماره‌زیرصفحه}
+\setinterfacecommand{switchtobodyfont}{تغییربه‌قلم‌بدنه}
+\setinterfacecommand{switchtorawfont}{تغییربه‌قلم‌خام}
+\setinterfacecommand{sym}{نم}
+\setinterfacecommand{symbol}{نماد}
+\setinterfacecommand{synchronizationbar}{میله‌تطابق}
+\setinterfacecommand{synchronize}{تطابق}
+\setinterfacecommand{tab}{تب}
+\setinterfacecommand{testcolumn}{ستون‌امتحان}
+\setinterfacecommand{testpage}{صفحه‌تست}
+\setinterfacecommand{tex}{تک}
+\setinterfacecommand{textheight}{ارتفاع‌متن}
+\setinterfacecommand{textreference}{مرجع‌متن}
+\setinterfacecommand{textrule}{خط‌متن}
+\setinterfacecommand{textvariable}{متغیر متن}
+\setinterfacecommand{textwidth}{عرض‌متن}
+\setinterfacecommand{thinrule}{خط‌نازک}
+\setinterfacecommand{thinrules}{خطهای‌نازک}
+\setinterfacecommand{tooltip}{tooltip}
+\setinterfacecommand{topdistance}{فاصله‌بالا}
+\setinterfacecommand{topheight}{ارتفاع‌بالا}
+\setinterfacecommand{topspace}{فضای‌بالا}
+\setinterfacecommand{totalnumberofpages}{شماره‌کل‌صفحه‌ها}
+\setinterfacecommand{translate}{ترجمه}
+\setinterfacecommand{txt}{txt}
+\setinterfacecommand{typ}{typ}
+\setinterfacecommand{type}{تایپ}
+\setinterfacecommand{typebuffer}{تایپ‌بافر}
+\setinterfacecommand{typefile}{تایپ‌پرونده}
+\setinterfacecommand{unitmeaning}{معنی‌واحد}
+\setinterfacecommand{unknown}{ناشناس}
+\setinterfacecommand{useJSscripts}{useJSscripts}
+\setinterfacecommand{useURL}{useURL}
+\setinterfacecommand{useXMLfilter}{useXMLfilter}
+\setinterfacecommand{useblocks}{استفاده‌بلوکها}
+\setinterfacecommand{usecommands}{استفاده‌فرمانها}
+\setinterfacecommand{useencoding}{استفاده‌رمزینه}
+\setinterfacecommand{useexternaldocument}{استفاده‌نوشتارخارجی}
+\setinterfacecommand{useexternalfigure}{استفاده‌شکل‌خارجی}
+\setinterfacecommand{useexternalfile}{استفاده‌پرونده‌خارجی}
+\setinterfacecommand{useexternalfiles}{استفاده‌پرونده‌های‌خارجی}
+\setinterfacecommand{useexternalsoundtrack}{استفاده‌قطعه‌موزیک‌خارجی}
+\setinterfacecommand{usemodule}{استفاده‌مدول}
+\setinterfacecommand{usemodules}{استفاده‌مدولها}
+\setinterfacecommand{usepath}{استفاده‌مسیر}
+\setinterfacecommand{usereferences}{استفاده‌مرجعها}
+\setinterfacecommand{usespecials}{استفاده‌ویژگیها}
+\setinterfacecommand{usesymbols}{استفاده‌نمادها}
+\setinterfacecommand{usetypescript}{استفاده‌دستخط‌تایپ}
+\setinterfacecommand{usetypescriptfile}{استفاده‌پرونده‌دستخط‌تایپ}
+\setinterfacecommand{useurl}{useurl}
+\setinterfacecommand{version}{نسخه}
+\setinterfacecommand{vl}{خ‌ع}
+\setinterfacecommand{weekday}{روزهفته}
+\setinterfacecommand{whitespace}{فضای‌سفید}
+\setinterfacecommand{wordright}{کلمه‌راست}
+\setinterfacecommand{writebetweenlist}{بنویس‌بین‌لیست}
+\setinterfacecommand{writetolist}{بنویس‌در‌لیست}
+\setinterfacecommand{writetoreferencelist}{بنویس‌درلیست‌مرجع}
+\setinterfacecommand{writetoregister}{بنویس‌درثبت}
+%
+\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/base/mult-ro.tex b/Master/texmf-dist/tex/context/base/mult-ro.mkii
index 738e49f7219..474cf7c43e0 100644
--- a/Master/texmf-dist/tex/context/base/mult-ro.tex
+++ b/Master/texmf-dist/tex/context/base/mult-ro.mkii
@@ -68,12 +68,14 @@
\setinterfacevariable{after}{dupa}
\setinterfacevariable{all}{tot}
\setinterfacevariable{always}{totdeauna}
+\setinterfacevariable{and}{and}
\setinterfacevariable{answerarea}{answerarea}
\setinterfacevariable{appendices}{apendixuri}
\setinterfacevariable{appendix}{apendix}
\setinterfacevariable{april}{aprilie}
\setinterfacevariable{atmargin}{lamargine}
\setinterfacevariable{atpage}{lapagina}
+\setinterfacevariable{attachment}{attachment}
\setinterfacevariable{august}{august}
\setinterfacevariable{author}{autor}
\setinterfacevariable{auto}{auto}
@@ -90,6 +92,7 @@
\setinterfacevariable{bib}{bib}
\setinterfacevariable{big}{mare}
\setinterfacevariable{bigbodyfont}{bigbodyfont}
+\setinterfacevariable{bigger}{bigger}
\setinterfacevariable{bigpreference}{preferintamare}
\setinterfacevariable{blank}{blank}
\setinterfacevariable{blockquote}{blockquote}
@@ -124,6 +127,7 @@
\setinterfacevariable{content}{cuprins}
\setinterfacevariable{contents}{cuprinsuri}
\setinterfacevariable{continue}{continuu}
+\setinterfacevariable{continued}{continued}
\setinterfacevariable{controls}{controale}
\setinterfacevariable{conversion}{conversie}
\setinterfacevariable{current}{curent}
@@ -141,6 +145,7 @@
\setinterfacevariable{down}{down}
\setinterfacevariable{each}{fiecare}
\setinterfacevariable{edge}{bordura}
+\setinterfacevariable{embed}{embed}
\setinterfacevariable{empty}{gol}
\setinterfacevariable{end}{end}
\setinterfacevariable{endnote}{endnote}
@@ -364,6 +369,7 @@
\setinterfacevariable{random}{aleator}
\setinterfacevariable{readonly}{readonly}
\setinterfacevariable{rectangular}{rectangular}
+\setinterfacevariable{reference}{referinta}
\setinterfacevariable{referral}{referinta}
\setinterfacevariable{register}{registru}
\setinterfacevariable{regular}{regular}
@@ -411,6 +417,7 @@
\setinterfacevariable{smallbolditalic}{micaldininclinat}
\setinterfacevariable{smallboldslanted}{micaldininclinat}
\setinterfacevariable{smallcaps}{majusculemici}
+\setinterfacevariable{smaller}{smaller}
\setinterfacevariable{smallitalic}{micitalic}
\setinterfacevariable{smallitalicbold}{micitalicaldin}
\setinterfacevariable{smallnormal}{micnormal}
@@ -519,6 +526,7 @@
\setinterfaceconstant{after}{dupa}
\setinterfaceconstant{afterhead}{dupatitlu}
\setinterfaceconstant{afterkey}{dupatasta}
+\setinterfaceconstant{aftersection}{aftersection}
\setinterfaceconstant{align}{aliniere}
\setinterfaceconstant{aligncharacter}{aliniazacaracter}
\setinterfaceconstant{alignmentcharacter}{alierecaracter}
@@ -538,6 +546,7 @@
\setinterfaceconstant{authoretallimit}{authoretallimit}
\setinterfaceconstant{authoretaltext}{authoretaltext}
\setinterfaceconstant{auto}{auto}
+\setinterfaceconstant{autocase}{autocase}
\setinterfaceconstant{autofile}{autofile}
\setinterfaceconstant{autofocus}{autofocus}
\setinterfaceconstant{autohang}{autohang}
@@ -551,10 +560,12 @@
\setinterfaceconstant{backgroundoffset}{offsetfundal}
\setinterfaceconstant{backgroundradius}{razafundal}
\setinterfaceconstant{backgroundscreen}{ecranfundal}
+\setinterfaceconstant{backreference}{backreference}
\setinterfaceconstant{backspace}{spatiuspate}
\setinterfaceconstant{balance}{balanta}
\setinterfaceconstant{before}{inainte}
\setinterfaceconstant{beforehead}{inaintetitlu}
+\setinterfaceconstant{beforesection}{beforesection}
\setinterfaceconstant{bet}{bet}
\setinterfaceconstant{big}{mare}
\setinterfaceconstant{blank}{blanc}
@@ -569,8 +580,10 @@
\setinterfaceconstant{bottomoffset}{offsetjos}
\setinterfaceconstant{bottomspace}{spatiujos}
\setinterfaceconstant{bottomstate}{starejos}
+\setinterfaceconstant{buffer}{buffer}
\setinterfaceconstant{cache}{cache}
\setinterfaceconstant{calculate}{calculeaza}
+\setinterfaceconstant{category}{category}
\setinterfaceconstant{ccommand}{comandac}
\setinterfaceconstant{click}{click}
\setinterfaceconstant{clickin}{clickintru}
@@ -578,6 +591,7 @@
\setinterfaceconstant{clipoffset}{clipoffset}
\setinterfaceconstant{closeaction}{actiuneinchidere}
\setinterfaceconstant{closecommand}{closecommand}
+\setinterfaceconstant{closepage}{closepage}
\setinterfaceconstant{closepageaction}{actiuneinchiderepagina}
\setinterfaceconstant{closesymbol}{closesymbol}
\setinterfaceconstant{color}{culoare}
@@ -629,6 +643,7 @@
\setinterfaceconstant{editoretallimit}{editoretallimit}
\setinterfaceconstant{editoretaltext}{editoretaltext}
\setinterfaceconstant{empty}{gol}
+\setinterfaceconstant{entries}{entries}
\setinterfaceconstant{equalheight}{equalheight}
\setinterfaceconstant{equalwidth}{equalwidth}
\setinterfaceconstant{escape}{escape}
@@ -653,6 +668,7 @@
\setinterfaceconstant{footer}{subsol}
\setinterfaceconstant{footerdistance}{distantasubsol}
\setinterfaceconstant{footerstate}{staresubsol}
+\setinterfaceconstant{force}{fortat}
\setinterfaceconstant{foregroundcolor}{foregroundcolor}
\setinterfaceconstant{foregroundstyle}{foregroundstyle}
\setinterfaceconstant{format}{format}
@@ -699,11 +715,13 @@
\setinterfaceconstant{intent}{intent}
\setinterfaceconstant{interaction}{interactiune}
\setinterfaceconstant{interlinespace}{spatiereinterliniara}
+\setinterfaceconstant{internalgrid}{internalgrid}
\setinterfaceconstant{itemalign}{itemalign}
\setinterfaceconstant{items}{elemente}
\setinterfaceconstant{juniorsep}{juniorsep}
\setinterfaceconstant{ken}{ken}
\setinterfaceconstant{keyexpansion}{keyexpansion}
+\setinterfaceconstant{keys}{keys}
\setinterfaceconstant{keyword}{keyword}
\setinterfaceconstant{label}{eticheta}
\setinterfaceconstant{lastnamesep}{lastnamesep}
@@ -746,6 +764,7 @@
\setinterfaceconstant{margintext}{textmargine}
\setinterfaceconstant{marking}{marcaje}
\setinterfaceconstant{marstyle}{stilmarcaj}
+\setinterfaceconstant{mask}{mask}
\setinterfaceconstant{max}{max}
\setinterfaceconstant{maxdepth}{maxdepth}
\setinterfaceconstant{maxheight}{inaltimemaxima}
@@ -799,6 +818,7 @@
\setinterfaceconstant{oddmargin}{margineimpara}
\setinterfaceconstant{offset}{offset}
\setinterfaceconstant{openaction}{actiunedeschidere}
+\setinterfaceconstant{openpage}{openpage}
\setinterfaceconstant{openpageaction}{actiunedeschiderepagina}
\setinterfaceconstant{option}{optiune}
\setinterfaceconstant{order}{order}
@@ -851,6 +871,7 @@
\setinterfaceconstant{previous}{precendent}
\setinterfaceconstant{previousnumber}{numarprecedent}
\setinterfaceconstant{process}{process}
+\setinterfaceconstant{profile}{profile}
\setinterfaceconstant{pubsep}{pubsep}
\setinterfaceconstant{radius}{raza}
\setinterfaceconstant{random}{aleator}
@@ -944,6 +965,7 @@
\setinterfaceconstant{sub}{sub}
\setinterfaceconstant{subtitle}{subtitlu}
\setinterfaceconstant{suffix}{suffix}
+\setinterfaceconstant{suffixseparator}{suffixseparator}
\setinterfaceconstant{surnamesep}{surnamesep}
\setinterfaceconstant{sx}{sx}
\setinterfaceconstant{sy}{sy}
@@ -969,6 +991,7 @@
\setinterfaceconstant{textstate}{staretext}
\setinterfaceconstant{textstyle}{stiltext}
\setinterfaceconstant{textwidth}{latimetext}
+\setinterfaceconstant{threshold}{threshold}
\setinterfaceconstant{title}{titlu}
\setinterfaceconstant{titlecolor}{culoaretitlu}
\setinterfaceconstant{titlecommand}{titlecommand}
@@ -991,6 +1014,7 @@
\setinterfaceconstant{urlalternative}{urlalternativ}
\setinterfaceconstant{urlspace}{spatiuurl}
\setinterfaceconstant{validate}{verifica}
+\setinterfaceconstant{values}{values}
\setinterfaceconstant{vcommand}{comandav}
\setinterfaceconstant{veroffset}{veroffset}
\setinterfaceconstant{vfil}{vfil}
@@ -1045,7 +1069,6 @@
\setinterfacecommand{CAPPED}{KAP}
\setinterfacecommand{Character}{Litera}
\setinterfacecommand{Characters}{Litere}
-\setinterfacecommand{LABELTEXT}{TEXTETICHETA}
\setinterfacecommand{MONTH}{LUNA}
\setinterfacecommand{Numbers}{Numere}
\setinterfacecommand{Romannumerals}{Numereromane}
@@ -1084,7 +1107,6 @@
\setinterfacecommand{colorbar}{baraculoare}
\setinterfacecommand{colorvalue}{valoareculoare}
\setinterfacecommand{column}{coloana}
-\setinterfacecommand{comment}{comentariu}
\setinterfacecommand{comparecolorgroup}{comparagrupculoare}
\setinterfacecommand{comparepalet}{comparapaleta}
\setinterfacecommand{completepagenumber}{completeazanumarpagina}
diff --git a/Master/texmf-dist/tex/context/base/mult-sys.tex b/Master/texmf-dist/tex/context/base/mult-sys.mkii
index d48ce0a94e6..1484acecca5 100644
--- a/Master/texmf-dist/tex/context/base/mult-sys.tex
+++ b/Master/texmf-dist/tex/context/base/mult-sys.mkii
@@ -204,6 +204,12 @@
\definesystemconstant {default}
\definesystemconstant {smallcaps}
+\definesystemconstant {text}
+\definesystemconstant {page}
+\definesystemconstant {leftpage}
+\definesystemconstant {rightpage}
+\definesystemconstant {somewhere}
+
%D A more experienced \TEX\ user will recognize the next four
%D constants. We need these because font-definitions are
%D partially english.
@@ -217,6 +223,8 @@
\definesystemconstant {lefthyphenmin}
\definesystemconstant {righthyphenmin}
+\definesystemconstant {lefthyphenchar}
+\definesystemconstant {righthyphenchar}
\definesystemconstant {skewchar}
\definesystemconstant {hyphenchar}
@@ -231,6 +239,7 @@
\definesystemconstant {handling}
\definesystemconstant {features}
\definesystemconstant {fallbacks}
+\definesystemconstant {goodies}
\definesystemconstant {background}
\definesystemconstant {ucmap}
@@ -447,11 +456,13 @@
\definesystemvariable {as} % AlignmentSwitch
\definesystemvariable {at} % ATtachments
\definesystemvariable {ba} % synchronisatieBAlk
+\definesystemvariable {bc} % BaCkend
\definesystemvariable {be} % startstop (BeginEnd)
\definesystemvariable {bj} % BlokJe
\definesystemvariable {bk} % Blokken (floats)
\definesystemvariable {bl} % BLanko
\definesystemvariable {bg} % BleedinG
+\definesystemvariable {bm} % BookMark
\definesystemvariable {bo} % BlankO (definitions)
\definesystemvariable {bp} % BreakPoint
\definesystemvariable {br} % sideBaR
@@ -463,6 +474,7 @@
\definesystemvariable {cb} % CollectBox
\definesystemvariable {cc} % Comment
\definesystemvariable {ce} % CasEs
+\definesystemvariable {cf} % Style (ColorFont)
\definesystemvariable {ch} % CHaracterspacing
\definesystemvariable {ci} % CItaat
\definesystemvariable {ck} % Character Kerning
@@ -489,6 +501,7 @@
\definesystemvariable {ds} % DoorSpringen
\definesystemvariable {ef} % ExternFiguur
\definesystemvariable {ec} % EnCoding
+\definesystemvariable {el} % Elements
\definesystemvariable {en} % ENvironments
\definesystemvariable {ep} % ExternfiguurPreset
\definesystemvariable {eq} % EQalign
@@ -562,6 +575,7 @@
\definesystemvariable {ma} % MargeAchtergrond
\definesystemvariable {mb} % MargeBlokken
\definesystemvariable {md} % MoDule
+\definesystemvariable {me} % MultilingualElement (tags)
\definesystemvariable {mg} % Metapost paGe
\definesystemvariable {mh} % MultilingualHead
\definesystemvariable {mk} % MarKering
@@ -755,10 +769,11 @@
\definefileconstant {errfilename} {cont-err}
\definefileconstant {sysfilename} {cont-sys}
-\definefileconstant {oldfilename} {cont-old}
\definefileconstant {newfilename} {cont-new}
-\definefileconstant {filfilename} {cont-fil}
-\definefileconstant {modfilename} {cont-mod}
+\definefileconstant {locfilename} {cont-loc}
+\definefileconstant {expfilename} {cont-exp}
+%definefileconstant {usrfilename} {cont-usr} % .tex
+%definefileconstant {fmtfilename} {cont-fmt} % .tex
%D Handy for typescripts (we could use s! instead:
@@ -768,12 +783,6 @@
\definetypescriptconstant {special} {special}
\definetypescriptconstant {size} {size}
-%D The next two files specify user settings as well as
-%D \TEXEXEC\ settings when generating a format.
-
-\definefileconstant {usrfilename} {cont-usr} % .tex
-\definefileconstant {fmtfilename} {cont-fmt} % .tex
-
%D The setup files for the language, font, color and special
%D subsystems have a common prefix. This means that we have at
%D most three characters for unique filenames.
@@ -862,6 +871,7 @@
\defineinterfaceconstant {svg} {svg}
\defineinterfaceconstant {tex} {tex}
\defineinterfaceconstant {tmp} {tmp}
+\defineinterfaceconstant {cld} {cld}
%D A careful reader will have noticed that in the module
%D \type{mult-ini} we defined \type{\selectinterface}. We were
diff --git a/Master/texmf-dist/tex/context/base/mult-sys.mkiv b/Master/texmf-dist/tex/context/base/mult-sys.mkiv
new file mode 100644
index 00000000000..4e3138c8634
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/mult-sys.mkiv
@@ -0,0 +1,912 @@
+%D \module
+%D [ file=mult-sys,
+%D version=1996.06.01,
+%D title=\CONTEXT\ Multilingual Macros,
+%D subtitle=System,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 In boring module we define a lot of obscure but useful
+%D system constants. By doing so we save lots of memory while
+%D at the same time we prevent ourself from typing errors.
+
+\writestatus{loading}{ConTeXt Multilingual Macros / System}
+
+\unprotect
+
+%D This file is mostly the same as the \MKII\ variant but we
+%D keep extending \MKIV, so it was bout time to have a dedicated
+%D variant.
+%D
+%D The constants are grouped in such a way that there is a
+%D minimal change of conflicts.
+%D
+%D \starttyping
+%D \definesystemconstants {word}
+%D \definemessageconstant {word}
+%D \stoptyping
+%D
+%D This commands generate \type{\s!word} and \type{\m!word}.
+
+\definesystemconstant {hans}
+\definesystemconstant {taco}
+
+%D First we define some system constants used for both the
+%D multi||lingual interface and multi||linguag typesetting.
+
+\definesystemconstant {afrikaans} \definesystemconstant {af}
+\definesystemconstant {arabic} \definesystemconstant {ar}
+\definesystemconstant {catalan} \definesystemconstant {ca}
+\definesystemconstant {chinese} \definesystemconstant {cn}
+\definesystemconstant {croatian} \definesystemconstant {hr}
+\definesystemconstant {czech} \definesystemconstant {cs} \definesystemconstant {cz}
+\definesystemconstant {danish} \definesystemconstant {da}
+\definesystemconstant {dutch} \definesystemconstant {nl}
+\definesystemconstant {english} \definesystemconstant {en}
+\definesystemconstant {finish} \definesystemconstant {fi}
+\definesystemconstant {french} \definesystemconstant {fr}
+\definesystemconstant {german} \definesystemconstant {de}
+\definesystemconstant {hungarian} \definesystemconstant {hu}
+\definesystemconstant {italian} \definesystemconstant {it}
+\definesystemconstant {latin} \definesystemconstant {la}
+\definesystemconstant {lithuanian} \definesystemconstant {lt}
+\definesystemconstant {bokmal} \definesystemconstant {nb} \definesystemconstant {norwegian} \definesystemconstant {no}
+\definesystemconstant {nynorsk} \definesystemconstant {nn}
+\definesystemconstant {polish} \definesystemconstant {pl}
+\definesystemconstant {persian} \definesystemconstant {pe}
+\definesystemconstant {portuguese} \definesystemconstant {pt}
+\definesystemconstant {romanian} \definesystemconstant {ro}
+\definesystemconstant {russian} \definesystemconstant {ru}
+\definesystemconstant {slovak} \definesystemconstant {sk}
+\definesystemconstant {slovenian} \definesystemconstant {sl}
+\definesystemconstant {slovene} % obsolete
+\definesystemconstant {spanish} \definesystemconstant {es}
+\definesystemconstant {swedish} \definesystemconstant {sv}
+\definesystemconstant {turkish} \definesystemconstant {tr}
+\definesystemconstant {turkmen} \definesystemconstant {tk}
+\definesystemconstant {gbenglish} \definesystemconstant {gb} \definesystemconstant {ukenglish} \definesystemconstant {uk}
+\definesystemconstant {usenglish} \definesystemconstant {us}
+\definesystemconstant {ukrainian} \definesystemconstant {ua}
+\definesystemconstant {greek} \definesystemconstant {gr}
+\definesystemconstant {ancientgreek} \definesystemconstant {agr}
+\definesystemconstant {vietnamese} \definesystemconstant {vi} \definesystemconstant {vn}
+\definesystemconstant {chinese} \definesystemconstant {cn}
+\definesystemconstant {japanese} \definesystemconstant {ja}
+\definesystemconstant {korean} \definesystemconstant {kr}
+
+%D For proper \UNICODE\ support we need a few font related
+%D constants.
+
+\definesystemconstant {BoldItalic}
+\definesystemconstant {BoldSlanted}
+\definesystemconstant {Bold}
+\definesystemconstant {Italic}
+\definesystemconstant {Regular}
+\definesystemconstant {Slanted}
+\definesystemconstant {Unicode}
+
+\definesystemconstant {Serif} \definesystemconstant {Regular}
+\definesystemconstant {Sans} \definesystemconstant {Support}
+\definesystemconstant {Mono} \definesystemconstant {Type}
+\definesystemconstant {Math}
+\definesystemconstant {Handwriting}
+\definesystemconstant {Calligraphy}
+\definesystemconstant {Casual}
+
+\definesystemconstant {SerifBold} \definesystemconstant {SansBold} \definesystemconstant {MonoBold}
+\definesystemconstant {SerifItalic} \definesystemconstant {SansItalic} \definesystemconstant {MonoItalic}
+\definesystemconstant {SerifBoldItalic} \definesystemconstant {SansBoldItalic} \definesystemconstant {MonoBoldItalic}
+\definesystemconstant {SerifSlanted} \definesystemconstant {SansSlanted} \definesystemconstant {MonoSlanted}
+\definesystemconstant {SerifBoldSlanted} \definesystemconstant {SansBoldSlanted} \definesystemconstant {MonoBoldSlanted}
+\definesystemconstant {SerifCaps} \definesystemconstant {SansCaps} \definesystemconstant {MonoCaps}
+
+\definesystemconstant {Normal}
+\definesystemconstant {Caps}
+
+\definesystemconstant {mnem} % kind of generic short tag
+
+\definesystemconstant {file}
+\definesystemconstant {name}
+\definesystemconstant {spec}
+
+\definesystemconstant {attribute}
+
+\definesystemconstant {serif}
+\definesystemconstant {sans}
+\definesystemconstant {mono}
+\definesystemconstant {math}
+\definesystemconstant {handwriting}
+\definesystemconstant {calligraphy}
+\definesystemconstant {casual}
+\definesystemconstant {fax}
+
+\definesystemconstant {fallback}
+
+\definesystemconstant {none}
+\definesystemconstant {default}
+\definesystemconstant {smallcaps}
+
+%D As the name of their define command states, the next set of
+%D constants is used in the message macro's.
+
+\definemessageconstant {check}
+\definemessageconstant {colors}
+\definemessageconstant {columns}
+\definemessageconstant {regimes}
+\definemessageconstant {figures}
+\definemessageconstant {fields}
+\definemessageconstant {files}
+\definemessageconstant {floatblocks}
+\definemessageconstant {fonts}
+\definemessageconstant {handlings}
+\definemessageconstant {interactions}
+\definemessageconstant {javascripts}
+\definemessageconstant {layouts}
+\definemessageconstant {languages}
+\definemessageconstant {references}
+\definemessageconstant {structures}
+\definemessageconstant {symbols}
+\definemessageconstant {system}
+\definemessageconstant {lua}
+\definemessageconstant {textblocks}
+\definemessageconstant {verbatims}
+\definemessageconstant {versions}
+\definemessageconstant {metapost}
+\definemessageconstant {chemicals}
+\definemessageconstant {publications}
+
+%D Net come some \CONTEXT\ constants, used in the definition
+%D of private commands:
+
+\definesystemconstant {tex}
+\definesystemconstant {xml}
+\definesystemconstant {lua}
+
+\definesystemconstant {next}
+\definesystemconstant {pickup}
+\definesystemconstant {ascii}
+\definesystemconstant {default}
+\definesystemconstant {unknown}
+\definesystemconstant {action}
+\definesystemconstant {compare}
+\definesystemconstant {do}
+\definesystemconstant {dodo}
+\definesystemconstant {complex}
+\definesystemconstant {simple}
+\definesystemconstant {start}
+\definesystemconstant {stop}
+\definesystemconstant {dummy}
+\definesystemconstant {local}
+\definesystemconstant {global}
+\definesystemconstant {done}
+\definesystemconstant {font}
+\definesystemconstant {link}
+\definesystemconstant {parent}
+\definesystemconstant {clone}
+\definesystemconstant {section} \let\v!sectionlevel\s!section % for old times sake
+\definesystemconstant {handler}
+\definesystemconstant {counter}
+\definesystemconstant {single}
+\definesystemconstant {multi}
+
+\definesystemconstant {hasnumber}
+\definesystemconstant {hastitle}
+\definesystemconstant {hascaption}
+\definesystemconstant {haslevel}
+
+\definesystemconstant {mkiv}
+\definesystemconstant {mkii}
+\definesystemconstant {entities}
+
+\definesystemconstant {normal}
+\definesystemconstant {bold}
+\definesystemconstant {italic}
+\definesystemconstant {slanted}
+
+\definesystemconstant {default}
+\definesystemconstant {smallcaps}
+
+\definesystemconstant {text}
+\definesystemconstant {page}
+\definesystemconstant {leftpage}
+\definesystemconstant {rightpage}
+\definesystemconstant {somewhere}
+
+%D A more experienced \TEX\ user will recognize the next four
+%D constants. We need these because font-definitions are
+%D partially english.
+
+\definesystemconstant {run}
+
+\definesystemconstant {fam}
+\definesystemconstant {text}
+\definesystemconstant {script}
+\definesystemconstant {scriptscript}
+
+\definesystemconstant {lefthyphenmin}
+\definesystemconstant {righthyphenmin}
+\definesystemconstant {lefthyphenchar}
+\definesystemconstant {righthyphenchar}
+
+\definesystemconstant {skewchar}
+\definesystemconstant {hyphenchar}
+\definesystemconstant {catcodes}
+\definesystemconstant {encoding}
+\definesystemconstant {resource}
+\definesystemconstant {mapping}
+\definesystemconstant {language}
+\definesystemconstant {patterns}
+\definesystemconstant {rname}
+\definesystemconstant {rscale}
+\definesystemconstant {handling}
+\definesystemconstant {features}
+\definesystemconstant {fallbacks}
+\definesystemconstant {goodies}
+\definesystemconstant {background}
+\definesystemconstant {ucmap}
+
+\definesystemconstant {property}
+\definesystemconstant {overprint}
+\definesystemconstant {layer}
+\definesystemconstant {effect}
+\definesystemconstant {negative}
+\definesystemconstant {color}
+\definesystemconstant {transparency}
+
+\definesystemconstant {black}
+\definesystemconstant {white}
+
+\definesystemconstant {format}
+\definesystemconstant {extensions}
+\definesystemconstant {initializations}
+
+\definesystemconstant {system} % not yet interfaces messages
+
+%D Just to be complete we define the standard \TEX\ units.
+
+\definesystemconstant {cm}
+\definesystemconstant {em}
+\definesystemconstant {ex}
+\definesystemconstant {mm}
+\definesystemconstant {pt}
+\definesystemconstant {sp}
+\definesystemconstant {bp}
+\definesystemconstant {in}
+\definesystemconstant {pc}
+\definesystemconstant {cm}
+\definesystemconstant {dd}
+\definesystemconstant {cc}
+\definesystemconstant {nd}
+\definesystemconstant {nc}
+
+%D These constants are used for internal and utility
+%D commands.
+
+\definesystemconstant {check}
+\definesystemconstant {reset}
+\definesystemconstant {set}
+
+\definesystemconstant {entrya}
+\definesystemconstant {entryb}
+\definesystemconstant {entryc}
+\definesystemconstant {entryd}
+\definesystemconstant {entry}
+\definesystemconstant {see}
+\definesystemconstant {from}
+\definesystemconstant {to}
+\definesystemconstant {line}
+\definesystemconstant {page}
+\definesystemconstant {realpage}
+\definesystemconstant {userpage}
+\definesystemconstant {subpage}
+
+\definesystemconstant {synonym}
+
+\definesystemconstant {reference}
+\definesystemconstant {main}
+
+\definesystemconstant {list}
+
+\definesystemconstant {item}
+\definesystemconstant {itemcount}
+
+\definesystemconstant {number}
+\definesystemconstant {references}
+\definesystemconstant {between}
+\definesystemconstant {format}
+\definesystemconstant {old}
+
+\definesystemconstant {thisisblock}
+\definesystemconstant {thiswasblock}
+
+\definesystemconstant {figurepreset}
+
+\definesystemconstant {empty}
+
+%D Some \CONTEXT\ commands take a two||pass aproach to
+%D optimize the typesetting. Each two||pass object has its
+%D own tag.
+
+\definesystemconstant {pass}
+
+\definesystemconstant {data}
+\definesystemconstant {float}
+\definesystemconstant {list}
+\definesystemconstant {page}
+\definesystemconstant {subpage}
+\definesystemconstant {margin}
+\definesystemconstant {profile}
+\definesystemconstant {versionbegin}
+\definesystemconstant {versionend}
+\definesystemconstant {cross}
+\definesystemconstant {paragraph}
+
+%D A lot of macros use tags to distinguish between different
+%D objects, e.g. lists and registers.
+
+\definesystemconstant {prt} % part (deel)
+\definesystemconstant {chp} % chapter (hoofdstuk)
+\definesystemconstant {sec} % section (paragraaf)
+\definesystemconstant {tit} % title (titel)
+\definesystemconstant {sub} % subject (onderwerp)
+\definesystemconstant {mar} % margin (marge)
+\definesystemconstant {num} % number (doornummeren)
+\definesystemconstant {def} % definition (doordefinieren)
+\definesystemconstant {for} % formula (formule)
+\definesystemconstant {fnt} % footnote (voetnoot)
+\definesystemconstant {ind} % index (register)
+\definesystemconstant {lin} % linked index
+\definesystemconstant {lst} % list (opsomming)
+\definesystemconstant {flt} % float (plaatsblok)
+\definesystemconstant {pag} % page (pagina)
+\definesystemconstant {txt} % text (tekst)
+\definesystemconstant {ref} % reference (verwijzing)
+\definesystemconstant {lab} % label (label)
+\definesystemconstant {aut} % automatic (inhoud, index)
+\definesystemconstant {vwa} % automatic (illustrations)
+\definesystemconstant {vwb} % automatic (illustrations)
+
+\definesystemconstant {kop} % kop % still dutch
+
+%D Reference labels can be tagged by users, for instance by
+%D means of \type{tag:}. The reference mechanism itself uses
+%D some tags too. These are definitely not to be used by users.
+%D Here they are:
+
+\definereferenceconstant {cross} {:c:} % cross reference
+\definereferenceconstant {view} {:v:} % view reference
+\definereferenceconstant {viewa} {:a:} % view reference test a
+\definereferenceconstant {viewb} {:b:} % view reference test b
+\definereferenceconstant {page} {:p:} % page referece
+\definereferenceconstant {list} {:l:} % list reference
+\definereferenceconstant {exec} {:e:} % execution reference
+\definereferenceconstant {form} {:m:} % form reference
+\definereferenceconstant {syst} {:s:} % system reference
+
+\definereferenceconstant {from} {:f:} % from list reference
+\definereferenceconstant {to} {:t:} % to list reference
+
+\definereferenceconstant {object} {:o:} % object reference
+\definereferenceconstant {driver} {:d:} % driver object reference
+\definereferenceconstant {widget} {:w:} % field chain reference
+
+\definereferenceconstant {java} {:j:} % java scripts
+
+%D When we use numbers and dimensions the same applies as
+%D with the keywords like \type{width} and \type{plus}
+%D mentioned earlier.
+
+\def\!!ten {10}
+\def\!!twelve {12}
+\def\!!hundred {100}
+\def\!!thousand {1000}
+\def\!!tenthousand {10000}
+\def\!!maxcard {65536}
+\def\!!medcard {32768}
+
+\def\!!zeropoint {0pt}
+\def\!!onepoint {1pt}
+\def\!!twopoint {2pt}
+\def\!!threepoint {3pt}
+\def\!!fourpoint {4pt}
+\def\!!fivepoint {5pt}
+\def\!!sixpoint {6pt}
+\def\!!sevenpoint {7pt}
+\def\!!eightpoint {8pt}
+\def\!!ninepoint {9pt}
+\def\!!tenpoint {10pt}
+\def\!!elevenpoint {11pt}
+\def\!!twelvepoint {12pt}
+\def\!!fourteenpointfour {14.4pt}
+
+\let\onerealpoint\onepoint % needed for latex
+
+% D Another optimization is:
+%
+% \let\points\onepoint
+
+%D A rough test is:
+%D
+%D \starttyping
+%D \def\TestMe % 7.75 sec on a P4/2G
+%D {\dimen0=10\points\dimen0=10\points\dimen0=10\points\dimen0=10\points\dimen0=10\points
+%D \dimen0=10\points\dimen0=10\points\dimen0=10\points\dimen0=10\points\dimen0=10\points}
+%D
+%D \def\TestMe % 11.5 sec on a P4/2G
+%D {\dimen0=10pt\dimen0=10pt\dimen0=10pt\dimen0=10pt\dimen0=10pt%
+%D \dimen0=10pt\dimen0=10pt\dimen0=10pt\dimen0=10pt\dimen0=10pt}
+%D
+%D \def\TestMe % 12.5 sec on a P4/2G
+%D {\dimen0=10\s!pt\dimen0=10\s!pt\dimen0=10\s!pt\dimen0=10\s!pt\dimen0=10\s!pt%
+%D \dimen0=10\s!pt\dimen0=10\s!pt\dimen0=10\s!pt\dimen0=10\s!pt\dimen0=10\s!pt}
+%D
+%D \testfeatureonce {500000}{\TestMe}
+%D \stoptyping
+
+%D Variables are composed of a command specific tag and a user
+%D supplied variable (system constant). The first tag \type{ag}
+%D for instance is available as \type{\??ag} and expands to
+%D \type{@@ag} in composed variables.
+
+% vervallen : hd hr hm vt vr vm tr tn te br bm bo on om or
+
+\definesystemvariable {ab} % AlignedBoxes
+\definesystemvariable {ac} % ACcent
+\definesystemvariable {ae} % AttributEs
+\definesystemvariable {ag} % AchterGrond
+\definesystemvariable {al} % ALinea's
+\definesystemvariable {am} % interActieMenu
+\definesystemvariable {an} % ANchor
+\definesystemvariable {as} % AlignmentSwitch
+\definesystemvariable {at} % ATtachments
+\definesystemvariable {ba} % synchronisatieBAlk
+\definesystemvariable {bc} % BaCkend
+\definesystemvariable {be} % startstop (BeginEnd)
+\definesystemvariable {bj} % BlokJe
+\definesystemvariable {bk} % Blokken (floats)
+\definesystemvariable {bl} % BLanko
+\definesystemvariable {bg} % BleedinG
+\definesystemvariable {bm} % BookMark
+\definesystemvariable {bo} % BlankO (definitions)
+\definesystemvariable {bp} % BreakPoint
+\definesystemvariable {br} % sideBaR
+\definesystemvariable {bs} % SelecteerBlokken
+\definesystemvariable {bt} % BuTton
+\definesystemvariable {bu} % BUffer
+\definesystemvariable {bv} % Brieven
+\definesystemvariable {by} % Per
+\definesystemvariable {cb} % CollectBox
+\definesystemvariable {cc} % Comment
+\definesystemvariable {ce} % CasEs
+\definesystemvariable {cf} % Style (ColorFont)
+\definesystemvariable {ch} % CHaracterspacing
+\definesystemvariable {ci} % CItaat
+\definesystemvariable {ck} % Character Kerning
+\definesystemvariable {cl} % kleur (CoLor setup)
+\definesystemvariable {cn} % CollumN
+\definesystemvariable {cm} % CheMical
+\definesystemvariable {co} % COmbinaties
+\definesystemvariable {cp} % CliP
+\definesystemvariable {cr} % kleur (ColoR)
+\definesystemvariable {cs} % kleur (ColorSeparation
+\definesystemvariable {cv} % ConVersie
+\definesystemvariable {cy} % CrYteria
+\definesystemvariable {da} % DAte
+\definesystemvariable {db} % Labels
+\definesystemvariable {dc} % DroppedCaps
+\definesystemvariable {dd} % DoorDefinieren
+\definesystemvariable {de} % DEel
+\definesystemvariable {di} % DIrections
+\definesystemvariable {dl} % DunneLijnen
+\definesystemvariable {dn} % DoorNummeren
+\definesystemvariable {dm} % DefineMeasure
+\definesystemvariable {do} % DefinieerOpmaak
+\definesystemvariable {du} % DUmmy
+\definesystemvariable {ds} % DoorSpringen
+\definesystemvariable {ef} % ExternFiguur
+\definesystemvariable {ec} % EnCoding
+\definesystemvariable {el} % Elements
+\definesystemvariable {en} % ENvironments
+\definesystemvariable {ep} % ExternfiguurPreset
+\definesystemvariable {eq} % EQalign
+\definesystemvariable {er} % external resources
+\definesystemvariable {et} % EffecT
+\definesystemvariable {ex} % ExterneFiguren
+\definesystemvariable {fa} % font feature
+\definesystemvariable {fb} % FieldBody
+\definesystemvariable {fc} % FramedContent
+\definesystemvariable {fd} % FielDgroup
+\definesystemvariable {fe} % FoxetExtensions
+\definesystemvariable {ff} % FontFile
+\definesystemvariable {fg} % FiGuurmaten
+\definesystemvariable {fi} % FIle
+\definesystemvariable {fl} % Floats
+\definesystemvariable {fm} % ForMules
+\definesystemvariable {fn} % subformulas
+\definesystemvariable {fo} % xml FO
+\definesystemvariable {fp} % FilegroeP
+\definesystemvariable {fq} % Features
+\definesystemvariable {fr} % ForM
+\definesystemvariable {fs} % FileSynonym
+\definesystemvariable {ft} % FonTs
+\definesystemvariable {fu} % FontSolution
+\definesystemvariable {fv} % FontVariant
+\definesystemvariable {fw} % simpleFonts by Wolfgang
+\definesystemvariable {fx} % FoXet
+\definesystemvariable {gr} % GRid
+\definesystemvariable {ha} % HAng
+\definesystemvariable {hs} % HSpace
+\definesystemvariable {ht} % HiddenText
+\definesystemvariable {ia} % Interactie
+\definesystemvariable {ib} % InteractieBalk
+\definesystemvariable {ic} % ICc profiles
+\definesystemvariable {id} % Index
+\definesystemvariable {ig} % ItemGroup
+\definesystemvariable {ih} % InHoudsopgave
+\definesystemvariable {ii} % stelIndexIn
+\definesystemvariable {il} % stelInvulRegelsin
+\definesystemvariable {im} % InMarge
+\definesystemvariable {in} % INspringen
+\definesystemvariable {ip} % InsertPages
+\definesystemvariable {is} % Items
+\definesystemvariable {it} % stelInTerliniein
+\definesystemvariable {iv} % stelInvulLijnenin
+\definesystemvariable {ka} % KAntlijn
+\definesystemvariable {kd} % KaDerteksten
+\definesystemvariable {kj} % KopJes (floats)
+\definesystemvariable {kk} % Kapitalen
+\definesystemvariable {kl} % KoLommen
+\definesystemvariable {km} % KenMerk
+\definesystemvariable {ko} % KOp(pen)
+\definesystemvariable {kp} % KopPelteken
+\definesystemvariable {kr} % KoRps
+\definesystemvariable {ks} % KolomSpan
+\definesystemvariable {kt} % KonTakten
+\definesystemvariable {kw} % KontaktWaarde
+\definesystemvariable {la} % LAnguage
+\definesystemvariable {lb} % LaBels
+\definesystemvariable {ld} % LegenDa
+\definesystemvariable {le} % LinetablE
+\definesystemvariable {lf} % LocalFigures
+\definesystemvariable {lg} % taal (LanGuage)
+\definesystemvariable {li} % LIjst
+\definesystemvariable {lk} % LinK
+\definesystemvariable {ll} % Layers
+\definesystemvariable {lx} % LayerteXt
+\definesystemvariable {ln} % LijNen
+\definesystemvariable {lo} % LOgos
+\definesystemvariable {lt} % LiTeratuur
+\definesystemvariable {lr} % LayeR
+\definesystemvariable {ls} % languageScript
+\definesystemvariable {ly} % LaYout
+\definesystemvariable {ma} % MargeAchtergrond
+\definesystemvariable {mb} % MargeBlokken
+\definesystemvariable {mc} % MarginCategory
+\definesystemvariable {md} % MoDule
+\definesystemvariable {me} % MultilingualElement (tags)
+\definesystemvariable {mf} % MarginFramed
+\definesystemvariable {mg} % Metapost paGe
+\definesystemvariable {mh} % MultilingualHead
+\definesystemvariable {mk} % MarKering
+\definesystemvariable {ml} % MultilingualLabel
+\definesystemvariable {mm} % MultilingualMath
+\definesystemvariable {mt} % inline MaTh
+\definesystemvariable {mo} % Math Options
+\definesystemvariable {mp} % MetaPost
+\definesystemvariable {mx} % MatriX
+\definesystemvariable {ng} % parbuilders
+\definesystemvariable {nh} % new heads (structure)
+\definesystemvariable {nn} % structurenumbering
+\definesystemvariable {nm} % Nummering
+\definesystemvariable {np} % NaastPlaatsen
+\definesystemvariable {nr} % Nummeren
+\definesystemvariable {of} % OFfset
+\definesystemvariable {oi} % OmlijndInstellingen
+\definesystemvariable {ol} % OmLijnd
+\definesystemvariable {od} % Omlijnd Defaults (simple)
+\definesystemvariable {on} % ONderstreep
+\definesystemvariable {oo} % OpsOmmingen
+\definesystemvariable {op} % OPsomming
+\definesystemvariable {or} % OtpfilteR
+\definesystemvariable {os} % OffSet
+\definesystemvariable {ot} % OTpsequence
+\definesystemvariable {ov} % OVerlay
+\definesystemvariable {ox} % OffsetBox
+\definesystemvariable {pa} % PAlet
+\definesystemvariable {pb} % PuBlication
+\definesystemvariable {pc} % PageComment
+\definesystemvariable {pe} % PagEhandler
+\definesystemvariable {pf} % ProFiel
+\definesystemvariable {pg} % KoppelPagina
+\definesystemvariable {ph} % ParagrapH
+\definesystemvariable {pl} % PLaats
+\definesystemvariable {pn} % PaginaNummer
+\definesystemvariable {po} % PrOcessor
+\definesystemvariable {pp} % PaPier
+\definesystemvariable {pr} % PRogrammas
+\definesystemvariable {ps} % PoSitioneren
+\definesystemvariable {pt} % PageshifT
+\definesystemvariable {px} % Parallel
+\definesystemvariable {py} % PropertYs
+\definesystemvariable {pv} % PublicationVariable
+\definesystemvariable {ra} % RAise
+\definesystemvariable {rd} % RenDering
+\definesystemvariable {rf} % ReFereren
+\definesystemvariable {rg} % ReGel
+\definesystemvariable {rl} % ReferentieLijst
+\definesystemvariable {rn} % RegelNummer
+\definesystemvariable {ro} % ROteren
+\definesystemvariable {rr} % linenotes
+\definesystemvariable {rs} % RaSters
+\definesystemvariable {rt} % RoosTers
+\definesystemvariable {rv} % ReserVeerfiguur
+\definesystemvariable {rw} % RenderingWindow
+\definesystemvariable {sa} % ScAle
+\definesystemvariable {sb} % SectieBlok
+\definesystemvariable {sc} % SCherm
+\definesystemvariable {sd} % SounD
+\definesystemvariable {se} % SEctie
+\definesystemvariable {sf} % SpeciFics
+\definesystemvariable {sg} % SpacinG
+\definesystemvariable {sh} % ShapeText
+\definesystemvariable {si} % SplIt
+\definesystemvariable {sk} % SectieKop
+\definesystemvariable {sl} % SmalLer
+\definesystemvariable {sm} % SynonieMen
+\definesystemvariable {sn} % SubNummer
+\definesystemvariable {so} % SOrteren
+\definesystemvariable {sp} % SelecteerPapier
+\definesystemvariable {sr} % SpacehandleR
+\definesystemvariable {ss} % Symbool
+\definesystemvariable {st} % STickers
+\definesystemvariable {su} % SetUp
+\definesystemvariable {sv} % SysteemVariabelen
+\definesystemvariable {sw} % SectionWorld
+\definesystemvariable {sx} % Selector
+\definesystemvariable {sy} % SYnchronisatie
+\definesystemvariable {ta} % TAb
+\definesystemvariable {tb} % TekstBlokken
+\definesystemvariable {td} % TextbackgrounDs
+\definesystemvariable {te} % TEmplate
+\definesystemvariable {tf} % TypeFace
+\definesystemvariable {tg} % Tex paGe
+\definesystemvariable {ti} % TabelInstellingen
+\definesystemvariable {tk} % Teksten
+\definesystemvariable {tl} % TekstLijnen
+\definesystemvariable {tm} % TypesynonyM
+\definesystemvariable {to} % TOlerance
+\definesystemvariable {tp} % TyPen
+\definesystemvariable {tr} % TRacer
+\definesystemvariable {ts} % TypeScript
+\definesystemvariable {tt} % TabulaTe
+\definesystemvariable {tx} % TeXtflow
+\definesystemvariable {ty} % TYpe
+\definesystemvariable {uc} % Unicode
+\definesystemvariable {ui} % UItvoer
+\definesystemvariable {ur} % URl
+\definesystemvariable {up} % Utility Program
+\definesystemvariable {va} % VspAce
+\definesystemvariable {ve} % VErsie
+\definesystemvariable {vn} % VoetNoten
+\definesystemvariable {vs} % VSpacing
+\definesystemvariable {vt} % VerTical
+\definesystemvariable {wl} % WordList
+\definesystemvariable {wr} % WitRuimte
+\definesystemvariable {xf} % XML File
+\definesystemvariable {xl} % lxml (mkiv)
+\definesystemvariable {wl} % WidgetLabel
+\definesystemvariable {wc} % WidgetContent
+\definesystemvariable {wt} % WidgetTotal
+\definesystemvariable {ws} % WidgetStack
+\definesystemvariable {wh} % WidgetHelp
+\definesystemvariable {wp} % WidgetPopuphelp
+\definesystemvariable {xm} % xml (mkiv)
+\definesystemvariable {xp} % XML Processing
+\definesystemvariable {xy} % schaal
+\definesystemvariable {za} % ZetspiegelAanpassing
+
+%D Next we define some language independant one letter
+%D variables and keywords.
+
+\defineinterfaceconstant {x} {x} % x offset
+\defineinterfaceconstant {y} {y} % y offset
+\defineinterfaceconstant {w} {w} % width
+\defineinterfaceconstant {h} {h} % height
+\defineinterfaceconstant {s} {s} % size
+\defineinterfaceconstant {t} {t} % title
+\defineinterfaceconstant {c} {c} % creator
+\defineinterfaceconstant {e} {e} % extension
+\defineinterfaceconstant {f} {f} % file
+
+\defineinterfaceconstant {a} {a} % kunnen weg
+\defineinterfaceconstant {b} {b} % kunnen weg
+\defineinterfaceconstant {c} {c} % kunnen weg
+\defineinterfaceconstant {d} {d} % kunnen weg
+\defineinterfaceconstant {e} {e} % kunnen weg
+
+\defineinterfaceconstant {s} {s}
+\defineinterfaceconstant {r} {r}
+\defineinterfaceconstant {g} {g}
+\defineinterfaceconstant {b} {b}
+\defineinterfaceconstant {c} {c}
+\defineinterfaceconstant {m} {m}
+\defineinterfaceconstant {y} {y}
+\defineinterfaceconstant {k} {k}
+\defineinterfaceconstant {a} {a} % alternative
+\defineinterfaceconstant {t} {t} % transparency
+\defineinterfaceconstant {p} {p} % percentage
+
+\defineinterfaceconstant {t} {t}
+\defineinterfaceconstant {h} {h}
+\defineinterfaceconstant {b} {b}
+
+\defineinterfaceconstant {rgb} {rgb}
+\defineinterfacevariable {rgb} {rgb}
+
+\defineinterfaceconstant {cmyk} {cmyk}
+\defineinterfacevariable {cmyk} {cmyk}
+
+\defineinterfaceconstant {mp} {mp}
+\defineinterfacevariable {mp} {mp}
+
+\defineinterfacevariable {s} {s}
+
+\defineinterfacevariable {a} {a}
+\defineinterfacevariable {b} {b}
+\defineinterfacevariable {c} {c}
+\defineinterfacevariable {d} {d}
+
+%D Special purpose variables:
+
+\def\v!oddeven#1{\ifodd#1\v!odd\else\v!even\fi}
+
+%D The names of files and their extensions are fixed.
+%D \CONTEXT\ uses as less files as possible. Utility files can
+%D be recognized by the first two characters of the extension:
+%D \type{tu}.
+
+\definefileconstant {utilityfilename} {texutil}
+
+\definefileconstant {blockextension} {tub}
+\definefileconstant {figureextension} {tuf}
+\definefileconstant {inputextension} {tui}
+\definefileconstant {outputextension} {tuo} % tup for previous run
+\definefileconstant {optionextension} {top}
+\definefileconstant {temporaryextension} {tmp}
+\definefileconstant {patternsextension} {pat}
+\definefileconstant {hyphensextension} {hyp}
+\definefileconstant {fontmapextension} {map}
+\definefileconstant {bibextension} {bbl}
+
+%D These files are loaded at start||up. They may contain system
+%D specific setups (or calls to other files), old macro's, to
+%D garantee compatibility and new macro's noy yet present in
+%D the format.
+
+\definefileconstant {errfilename} {cont-err}
+\definefileconstant {sysfilename} {cont-sys}
+\definefileconstant {newfilename} {cont-new}
+\definefileconstant {locfilename} {cont-loc}
+\definefileconstant {expfilename} {cont-exp}
+
+%D Handy for typescripts (we could use s! instead:
+
+\definetypescriptconstant {name} {name}
+\definetypescriptconstant {default} {default}
+\definetypescriptconstant {map} {map}
+\definetypescriptconstant {special} {special}
+\definetypescriptconstant {size} {size}
+
+
+%D The setup files for the language, font, color and special
+%D subsystems have a common prefix. This means that we have at
+%D most three characters for unique filenames.
+
+\definefileconstant {colorprefix} {colo-}
+\definefileconstant {encodingprefix} {enco-}
+\definefileconstant {filterprefix} {filt-}
+\definefileconstant {fontprefix} {font-}
+%definefileconstant {handlingprefix} {hand-}
+%definefileconstant {javascriptprefix} {java-}
+%definefileconstant {languageprefix} {lang-}
+\definefileconstant {mathprefix} {math-}
+\definefileconstant {metapostprefix} {meta-}
+%definefileconstant {regimeprefix} {regi-}
+%definefileconstant {specialprefix} {spec-}
+\definefileconstant {symbolprefix} {symb-}
+\definefileconstant {typeprefix} {type-}
+\definefileconstant {xtagprefix} {xtag-}
+%definefileconstant {propprefix} {prop-}
+%definefileconstant {unicprefix} {unic-}
+%definefileconstant {sortprefix} {sort-}
+%definefileconstant {prettyprefix} {pret-}
+
+\definefileconstant {moduleprefix} {m-}
+\definefileconstant {styleprefix} {s-}
+\definefileconstant {xstyleprefix} {x-}
+\definefileconstant {privateprefix} {p-}
+\definefileconstant {thirdprefix} {t-}
+
+%definefileconstant {beforeprefix} {b-}
+%definefileconstant {afterprefix} {a-}
+
+%D \CONTEXT\ follows different strategies for finding files.
+%D The macros that are responsible for this 'clever' searching
+%D make use of two (very important) path specifiers.
+
+\definefileconstant {pathseparator} {/}
+\definefileconstant {currentpath} {.}
+\definefileconstant {parentpath} {..}
+
+%D The way fonts are defined and called upon is language
+%D independant. We follow the scheme laid down by Knuth in
+%D Plain \TEX. We'll explain their meaning later.
+
+\defineinterfaceconstant {tf} {tf}
+\defineinterfaceconstant {bf} {bf}
+\defineinterfaceconstant {bs} {bs}
+\defineinterfaceconstant {bi} {bi}
+\defineinterfaceconstant {sl} {sl}
+\defineinterfaceconstant {it} {it}
+\defineinterfaceconstant {sc} {sc}
+\defineinterfaceconstant {rm} {rm}
+\defineinterfaceconstant {ss} {ss}
+\defineinterfaceconstant {tt} {tt}
+\defineinterfaceconstant {hw} {hw}
+\defineinterfaceconstant {cg} {cg}
+\defineinterfaceconstant {os} {os}
+\defineinterfaceconstant {mm} {mm}
+\defineinterfaceconstant {i} {i}
+\defineinterfaceconstant {nn} {nn}
+
+\defineinterfaceconstant {x} {x}
+\defineinterfaceconstant {xx} {xx}
+
+\defineinterfaceconstant {em} {em}
+
+\defineinterfaceconstant {mi} {mi}
+\defineinterfaceconstant {sy} {sy}
+\defineinterfaceconstant {ex} {ex}
+\defineinterfaceconstant {mr} {mr}
+
+\defineinterfaceconstant {ma} {ma}
+\defineinterfaceconstant {mb} {mb}
+\defineinterfaceconstant {mc} {mc}
+
+%D For figure inclusion we need:
+
+\defineinterfaceconstant {tif} {tif}
+\defineinterfaceconstant {eps} {eps}
+\defineinterfaceconstant {mps} {mps}
+\defineinterfaceconstant {jpg} {jpg}
+\defineinterfaceconstant {pdf} {pdf}
+\defineinterfaceconstant {png} {png}
+\defineinterfaceconstant {avi} {avi}
+\defineinterfaceconstant {mov} {mov}
+\defineinterfaceconstant {svg} {svg}
+\defineinterfaceconstant {tex} {tex}
+\defineinterfaceconstant {tmp} {tmp}
+\defineinterfaceconstant {cld} {cld}
+
+%D A careful reader will have noticed that in the module
+%D \type{mult-ini} we defined \type{\selectinterface}. We were
+%D not yet able to actually select an interface, because we
+%D still had to define the constants and variables. Now we've
+%D done so, selection is permitted.
+
+\selectinterface
+
+%D Ok, here are some more, because we've got ouselves some
+%D extensions to \CONTEXT.
+
+\definemessageconstant {addresses}
+\definemessageconstant {documents}
+
+\protect
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/node-acc.lua b/Master/texmf-dist/tex/context/base/node-acc.lua
new file mode 100644
index 00000000000..53740592102
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/node-acc.lua
@@ -0,0 +1,113 @@
+if not modules then modules = { } end modules ['node-acc'] = {
+ version = 1.001,
+ comment = "companion to node-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local nodes, node = nodes, node
+
+local nodecodes = nodes.nodecodes
+local tasks = nodes.tasks
+
+local traverse_nodes = node.traverse
+local traverse_id = node.traverse_id
+local has_attribute = node.has_attribute
+local copy_node = node.copy
+local free_nodelist = node.flush_list
+
+local glue_code = nodecodes.glue
+local glyph_code = nodecodes.glyph
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+
+local function injectspaces(head)
+ local p
+ for n in traverse_nodes(head) do
+ local id = n.id
+ if id == glue_code then -- todo: check for subtype related to spacing (13/14 but most seems to be 0)
+ -- local at = has_attribute(n,attribute)
+ -- if at then
+ if p and p.id == glyph_code then
+ local g = copy_node(p)
+ local c = g.components
+ if c then -- it happens that we copied a ligature
+ free_nodelist(c)
+ g.components = nil
+ g.subtype = 256
+ end
+ local s = copy_node(n.spec)
+ g.char, n.spec = 32, s
+ p.next, g.prev = g, p
+ g.next, n.prev = n, g
+ s.width = s.width - g.width
+ end
+ -- end
+ elseif id == hlist_code or id == vlist_code then
+ injectspaces(n.list,attribute)
+ end
+ p = n
+ end
+ return head, true
+end
+
+nodes.handlers.accessibility = injectspaces
+
+-- todo:
+
+--~ local a_hyphenated = attributes.private('hyphenated')
+--~
+--~ local hyphenated, codes = { }, { }
+--~
+--~ local function compact(n)
+--~ local t = { }
+--~ for n in traverse_id(glyph_code,n) do
+--~ t[#t+1] = utfchar(n.char) -- check for unicode
+--~ end
+--~ return concat(t,"")
+--~ end
+--~
+--~ local function injectspans(head)
+--~ for n in traverse_nodes(head) do
+--~ local id = n.id
+--~ if id == disc then
+--~ local r, p = n.replace, n.pre
+--~ if r and p then
+--~ local str = compact(r)
+--~ local hsh = hyphenated[str]
+--~ if not hsh then
+--~ hsh = #codes + 1
+--~ hyphenated[str] = hsh
+--~ codes[hsh] = str
+--~ end
+--~ set_attribute(n,a_hyphenated,hsh)
+--~ end
+--~ elseif id == hlist_code or id == vlist_code then
+--~ injectspans(n.list)
+--~ end
+--~ end
+--~ return head, true
+--~ end
+--~
+--~ nodes.injectspans = injectspans
+--~
+--~ tasks.appendaction("processors", "words", "nodes.injectspans")
+--~
+--~ local function injectspans(head)
+--~ for n in traverse_nodes(head) do
+--~ local id = n.id
+--~ if id == disc then
+--~ local a = has_attribute(n,a_hyphenated)
+--~ if a then
+--~ local str = codes[a]
+--~ local b = new_pdfliteral(format("/Span << /ActualText %s >> BDC", lpdf.tosixteen(str)))
+--~ local e = new_pdfliteral("EMC")
+--~ node.insert_before(head,n,b)
+--~ node.insert_after(head,n,e)
+--~ end
+--~ elseif id == hlist_code or id == vlist_code then
+--~ injectspans(n.list)
+--~ end
+--~ end
+--~ end
diff --git a/Master/texmf-dist/tex/context/base/node-aux.lua b/Master/texmf-dist/tex/context/base/node-aux.lua
index 9ed71fd728c..0b44f77248d 100644
--- a/Master/texmf-dist/tex/context/base/node-aux.lua
+++ b/Master/texmf-dist/tex/context/base/node-aux.lua
@@ -1,18 +1,46 @@
if not modules then modules = { } end modules ['node-aux'] = {
version = 1.001,
- comment = "companion to node-spl.mkiv",
+ comment = "companion to node-ini.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
-local gsub, format = string.gsub, string.format
+local type, tostring = type, tostring
-local free_node = node.free
-local hpack_nodes = node.hpack
-local node_fields = node.fields
+local nodes, node = nodes, node
-function nodes.repack_hlist(list,...)
+local utfvalues = string.utfvalues
+
+local nodecodes = nodes.nodecodes
+
+local glyph_code = nodecodes.glyph
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+
+local nodepool = nodes.pool
+
+local new_glue = nodepool.glue
+local new_glyph = nodepool.glyph
+
+local traverse_nodes = node.traverse
+local traverse_id = node.traverse_id
+local free_node = node.free
+local hpack_nodes = node.hpack
+local has_attribute = node.has_attribute
+local set_attribute = node.set_attribute
+local get_attribute = node.get_attribute
+local unset_attribute = node.unset_attribute
+local first_glyph = node.first_glyph or node.first_character
+local copy_node = node.copy
+local slide_nodes = node.slide
+local insert_node_after = node.insert_after
+local isnode = node.is_node
+
+local texbox = tex.box
+
+function nodes.repackhlist(list,...)
+--~ nodes.showsimplelist(list)
local temp, b = hpack_nodes(list,...)
list = temp.list
temp.list = nil
@@ -20,47 +48,49 @@ function nodes.repack_hlist(list,...)
return list, b
end
-function nodes.merge(a,b)
- if a and b then
- local t = node.fields(a.id)
- for i=3,#t do
- local name = t[i]
- a[name] = b[name]
+local function set_attributes(head,attr,value)
+ for n in traverse_nodes(head) do
+ set_attribute(n,attr,value)
+ local id = n.id
+ if id == hlist_node or id == vlist_node then
+ set_attributes(n.list,attr,value)
end
end
- return a, b
end
-local fields, whatsitfields = { }, { }
-
-for k, v in next, node.types() do
- if v == "whatsit" then
- fields[k], fields[v] = { }, { }
- for kk, vv in next, node.whatsits() do
- local f = node_fields(k,kk)
- whatsitfields[kk], whatsitfields[vv] = f, f
+local function set_unset_attributes(head,attr,value)
+ for n in traverse_nodes(head) do
+ if not has_attribute(n,attr) then
+ set_attribute(n,attr,value)
+ end
+ local id = n.id
+ if id == hlist_code or id == vlist_code then
+ set_unset_attributes(n.list,attr,value)
end
- else
- local f = node_fields(k)
- fields[k], fields[v] = f, f
end
end
-nodes.fields, nodes.whatsitfields = fields, whatsitfields
-
-function nodes.info(n)
- local id = n.id
- local tp = node.type(id)
- local list = (tp == "whatsit" and whatsitfields[n.subtype]) or fields[id]
- logs.report(format("%14s","type"),tp)
- for k,v in next, list do
- logs.report(format("%14s",v),gsub(gsub(tostring(n[v]),"%s+"," "),"node ",""))
+local function unset_attributes(head,attr)
+ for n in traverse_nodes(head) do
+ unset_attribute(n,attr)
+ local id = n.id
+ if id == hlist_code or id == vlist_code then
+ unset_attributes(n.list,attr)
+ end
end
end
--- history:
---
--- local function cp_skipable(a,id) -- skipable nodes at the margins during character protrusion
+nodes.firstglyph = first_glyph
+nodes.setattribute = set_attribute
+nodes.getattribute = has_attribute
+nodes.unsetattribute = unset_attribute
+nodes.setattributes = set_attributes
+nodes.setunsetattributes = set_unset_attributes
+nodes.unsetattributes = unset_attributes
+
+nodes.has_attribute = has_attribute
+
+-- function nodes.is_skipable(a,id) -- skipable nodes at the margins during character protrusion
-- return (
-- id ~= glyph_node
-- or id == ins_node
@@ -75,6 +105,9 @@ end
-- or (id == whatsit_node and a.subtype ~= pdf_refximage_node and a.subtype ~= pdf_refxform_node)
-- )
-- end
+
+-- history:
+--
--
-- local function glyph_width(a)
-- local ch = chardata[a.font][a.char]
@@ -128,7 +161,7 @@ end
-- local u = floor(x / 0x8000) * n + f -- 0100000
-- local v = floor(u % d) * 0x8000 + f -- 0100000
-- if floor(u / d) >= 0x8000 then -- 0100000
--- logs.error("parbuilder",'arith_error')
+-- report_parbuilders('arith_error')
-- else
-- u = 0x8000 * floor(u / d) + floor(v / d) -- 0100000
-- end
@@ -143,3 +176,144 @@ end
-- end
-- end
+function nodes.firstcharacter(n,untagged) -- tagged == subtype > 255
+ if untagged then
+ return first_glyph(n)
+ else
+ for g in traverse_id(glyph_code,n) do
+ return g
+ end
+ end
+end
+
+function nodes.firstcharinbox(n)
+ local l = texbox[n].list
+ if l then
+ for g in traverse_id(glyph_code,l) do
+ return g.char
+ end
+ end
+ return 0
+end
+
+--~ local function firstline(n)
+--~ while n do
+--~ local id = n.id
+--~ if id == hlist_code then
+--~ if n.subtype == line_code then
+--~ return n
+--~ else
+--~ return firstline(n.list)
+--~ end
+--~ elseif id == vlist_code then
+--~ return firstline(n.list)
+--~ end
+--~ n = n.next
+--~ end
+--~ end
+
+--~ nodes.firstline = firstline
+
+-- this depends on fonts, so we have a funny dependency ... will be
+-- sorted out .. we could make tonodes a plugin into this
+
+local function tonodes(str,fnt,attr) -- (str,template_glyph) -- moved from blob-ini
+ if not str or str == "" then
+ return
+ end
+ local head, tail, space, fnt, template = nil, nil, nil, nil, nil
+ if not fnt then
+ fnt = current_font()
+ elseif type(fnt) ~= "number" and fnt.id == "glyph" then
+ fnt, template = nil, fnt
+ -- else
+ -- already a number
+ end
+ for s in utfvalues(str) do
+ local n
+ if s == 32 then
+ if space then
+ n = copy_node(space)
+ elseif fonts then -- depedency
+ local parameters = fonts.hashes.identifiers[fnt].parameters
+ space = new_glue(parameters.space,parameters.space_stretch,parameters.space_shrink)
+ n = space
+ end
+ elseif template then
+ n = copy_node(template)
+ n.char = s
+ else
+ n = new_glyph(fnt,s)
+ end
+ if attr then -- normally false when template
+ n.attr = copy_node_list(attr)
+ end
+ if head then
+ insert_node_after(head,tail,n)
+ else
+ head = n
+ end
+ tail = n
+ end
+ return head, tail
+end
+
+nodes.tonodes = tonodes
+
+local function link(head,tail,list,currentfont,currentattr)
+ for i=1,#list do
+ local n = list[i]
+ if n then
+ local tn = isnode(n)
+ if not tn then
+ local tn = type(n)
+ if tn == "number" then
+ local h, t = tonodes(tostring(n),currentfont,currentattr)
+ if not h then
+ -- skip
+ elseif not head then
+ head, tail = h, t
+ else
+ tail.next, h.prev, tail = h, t, t
+ end
+ elseif tn == "string" then
+ if #tn > 0 then
+ local h, t = tonodes(n,font.current(),currentattr)
+ if not h then
+ -- skip
+ elseif not head then
+ head, tail = h, t
+ else
+ tail.next, h.prev, tail = h, t, t
+ end
+ end
+ elseif tn == "table" then
+ if #tn > 0 then
+ head, tail = link(head,tail,n,currentfont,currentattr)
+ end
+ end
+ elseif not head then
+ head = n
+ if n.next then
+ tail = slide_nodes(n)
+ else
+ tail = n
+ end
+ else
+ tail.next = n
+ n.prev = tail
+ if n.next then
+ tail = slide_nodes(n)
+ else
+ tail = n
+ end
+ end
+ end
+ end
+ return head, tail
+end
+
+function nodes.link(...)
+ local currentfont = font.current
+ return link(nil,nil,{...},currentfont,currentattr)
+end
diff --git a/Master/texmf-dist/tex/context/base/node-bck.lua b/Master/texmf-dist/tex/context/base/node-bck.lua
index 94fbac85fd4..e1e4d46525e 100644
--- a/Master/texmf-dist/tex/context/base/node-bck.lua
+++ b/Master/texmf-dist/tex/context/base/node-bck.lua
@@ -9,15 +9,22 @@ if not modules then modules = { } end modules ['node-bck'] = {
-- beware, this one takes quite some runtime, so we need a status flag
-- maybe some page related state
-local hlist = node.id("hlist")
-local vlist = node.id("vlist")
+local attributes, nodes, node = attributes, nodes, node
-local has_attribute = node.has_attribute
-local set_attribute = node.set_attribute
-local traverse = node.traverse
+local nodecodes = nodes.nodecodes
-local new_rule = nodes.rule
-local new_glue = nodes.glue
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+
+local has_attribute = node.has_attribute
+local set_attribute = node.set_attribute
+local traverse = node.traverse
+
+local nodepool = nodes.pool
+local tasks = nodes.tasks
+
+local new_rule = nodepool.rule
+local new_glue = nodepool.glue
local a_color = attributes.private('color')
local a_transparency = attributes.private('transparency')
@@ -26,11 +33,11 @@ local a_background = attributes.private('background')
local function add_backgrounds(head) -- boxes, inline will be done too
local id = head.id
- if id == vlist or id == hlist then
+ if id == vlist_code or id == hlist_code then
local current = head.list
while current do
local id = current.id
- if id == hlist then -- and current.list
+ if id == hlist_code then -- and current.list
local background = has_attribute(current,a_background)
if background then
-- direct to hbox
@@ -84,7 +91,7 @@ local function add_backgrounds(head) -- boxes, inline will be done too
add_backgrounds(current)
end
end
- elseif id == vlist then -- and current.list
+ elseif id == vlist_code then -- and current.list
-- direct to vbox
local background = has_attribute(current,a_background)
if background then
@@ -114,6 +121,6 @@ local function add_backgrounds(head) -- boxes, inline will be done too
return head, true
end
-nodes.add_backgrounds = add_backgrounds
+nodes.handlers.backgrounds = add_backgrounds
-tasks.appendaction("shipouts","normalizers","nodes.add_backgrounds")
+tasks.appendaction("shipouts","normalizers","nodes.handlers.backgrounds")
diff --git a/Master/texmf-dist/tex/context/base/node-bck.mkiv b/Master/texmf-dist/tex/context/base/node-bck.mkiv
index 41a6da2cb48..88fb390a9ed 100644
--- a/Master/texmf-dist/tex/context/base/node-bck.mkiv
+++ b/Master/texmf-dist/tex/context/base/node-bck.mkiv
@@ -20,10 +20,19 @@
\registerctxluafile{node-bck}{1.001}
+\def\doinitializeboxbackgrounds
+ {\ctxlua{nodes.tasks.enableaction("shipouts","nodes.handlers.backgrounds")}%
+ \glet\doinitializeboxbackgrounds\donothing}
+
%D Box helpers:
+% \backgroundvbox[green] {\input tufte } \par
+% \backgroundvbox[blue] {\input ward } \par
+% \backgroundvbox[red] {\input knuth } \par
+% \backgroundhbox[yellow]{\rotate[rotation=45]{hello world}} \par
+
\def\doaddbackgroundtobox#1[#2]%
- {\begingroup\faststartcolor[#2]%
+ {\begingroup\doinitializeboxbackgrounds\faststartcolor[#2]%
\normalexpanded{\noexpand\faststopcolor\endgroup#1
attr \backgroundattribute \plusone
attr \colormodelattribute \the\attribute\colormodelattribute
@@ -63,101 +72,4 @@
% \def\backgroundvtop[#1]{\vtop \backgroundcolorattr{#1}}
% \def\backgroundhbox[#1]{\hbox \backgroundcolorattr{#1}}
-%D tabulate:
-
-\def\tabulatenormalcolumn#1%
- {\doiffastoptionalcheckelse{\tabulatenormalcolumnyes#1}{\tabulatenormalcolumnnop#1}}
-
-\def\tabulatenormalcolumnnop#1% overloads anch-pgr
- {&\iftabulateequal\tabulateequalpos\else\tabulatenormalpos\fi&\global\chardef\tabulatetype#1&}
-
-\def\tabulatenormalcolumnyes#1[#2]%
- {&\iftabulateequal\tabulateequalpos\else\tabulatenormalpos\fi&\global\chardef\tabulatetype#1&%
- \iftrialtypesetting\else\settabulatecolor{#2}\fi\ignorespaces}
-
-\newcount\maxtabularcolorcolumn
-
-\def\settabulatecolor#1% we could store the attributes at the cost of a lua call
- {\begingroup
- \global\settrue\tabulatehascolors
- \ifnum\tabulatecolumn>\maxtabularcolorcolumn
- \global\maxtabularcolorcolumn\tabulatecolumn
- \fi
- \setxvalue{\??tt:c:\the\tabulatecolumn}{#1}%
- \attribute\backgroundattribute\plusone
- \faststartcolor[#1]\strut\char0\faststopcolor
- \endgroup}
-
-\def\repeatsettabulatecolor
- {\begingroup
- \ifcsname\??tt:c:\the\tabulatecolumn\endcsname
- \attribute\backgroundattribute\plusone
- \faststartcolor[\csname\??tt:c:\the\tabulatecolumn\endcsname]\strut\char0\faststopcolor
- \fi
- \endgroup}
-
-\def\resettabulatecolors
- {\ifcase\maxtabularcolorcolumn\else
- \doresettabulatecolors
- \fi}
-
-\def\doresettabulatecolors
- {\dorecurse\maxtabularcolorcolumn{\letgvalue{\??tt:c:\recurselevel}\undefined}} % slow
-
-\appendtoks
- \resettabulatecolors
-\to \everyaftertabulaterow
-
-\def\splitofftabulatebox % overloads in anch-pgr
- {\dontcomplain
- \global\setbox\tabulatebox % % % global ? % % %
- \vsplit\tablebox\tabulatecolumn to \lineheight
- \setbox\tabulatebox\normalvbox
- {\unvbox\tabulatebox}%
- \setbox\tabulatebox\hbox to \wd\tabulatebox
- {\iftrialtypesetting\else\ifconditional\tabulatehascolors\repeatsettabulatecolor\fi\fi
- \hss\dotabulatehook{\box\tabulatebox}\hss}%
- \ht\tabulatebox\strutht
- \dp\tabulatebox\strutdp
- \box\tabulatebox
- \iftrialtypesetting\else\ifconditional\tablehaspositions\doflushtabulateepos\fi\fi}
-
-\appendtoks
- \global\setfalse\tabulatehascolors
-\to \everytabulate
-
\protect \endinput
-
-% test
-
-\starttext
-
-\backgroundvbox[green] {\input tufte } \par
-\backgroundvbox[blue] {\input ward } \par
-\backgroundvbox[red] {\input knuth } \par
-\backgroundhbox[yellow]{\rotate[rotation=45]{hello world}} \par
-
-\starttabulate[||p||]
-\NC test \NC test \NC test \NC \NR
-\NC test \NC[green] \input tufte \NC[yellow] test \NC \NR
-\NC test \NC test \NC test \NC \NR
-\NC test \NC test \NC test \NC \NR
-\NC test \NC test \NC test \NC \NR
-\NC test \NC test \NC test \NC \NR
-\NC[blue] test \NC[red] test \NC test \NC \NR
-\NC test \NC test \NC test \NC \NR
-\NC test \NC test \NC test \NC \NR
-\NC test \NC test \NC test \NC \NR
-\NC test \NC test \NC[gray] test \NC \NR
-\NC test \NC test \NC test \NC \NR
-\NC test \NC test \NC test \NC \NR
-\NC[blue] test \NC test \NC test \NC \NR
-\NC test \NC test \NC test \NC \NR
-\NC test \NC test \NC[magenta] test \NC \NR
-\NC test \NC test \NC test \NC \NR
-\NC test \NC[cyan] \dorecurse{10}{\input ward }\NC test \NC \NR
-\NC test \NC test \NC test \NC \NR
-\NC test \NC[yellow] test \NC test \NC \NR
-\stoptabulate
-
-\stoptext
diff --git a/Master/texmf-dist/tex/context/base/node-dir.lua b/Master/texmf-dist/tex/context/base/node-dir.lua
index 05e4835e507..970313d96f3 100644
--- a/Master/texmf-dist/tex/context/base/node-dir.lua
+++ b/Master/texmf-dist/tex/context/base/node-dir.lua
@@ -15,24 +15,25 @@ adapted and now has the mappings as comments. This lua file is
based on that file.
]]--
+local allocate = utilities.storage.allocate
-nodes = nodes or { }
+local nodes = nodes
-nodes.is_mirrored = {
+nodes.is_mirrored = allocate {
-- TLT = false,
-- TRT = false,
-- LTL = false,
-- RTT = false,
}
-nodes.is_rotated = {
+nodes.is_rotated = allocate {
-- TLT = false,
-- TRT = false,
-- LTL = false,
RTT = true, ["+RTT"] = true,
}
-nodes.textdir_is_parallel = {
+nodes.textdir_is_parallel = allocate {
TLT = {
TLT = true, ["+TLT"] = true,
TRT = true, ["+TRT"] = true,
@@ -59,7 +60,7 @@ nodes.textdir_is_parallel = {
}
}
-nodes.pardir_is_parallel = {
+nodes.pardir_is_parallel = allocate {
TLT = {
TLT = true, ["+TLT"] = true,
TRT = true, ["+TRT"] = true,
@@ -86,7 +87,7 @@ nodes.pardir_is_parallel = {
},
}
-nodes.pardir_is_opposite = {
+nodes.pardir_is_opposite = allocate {
TLT = {
-- TLT = false,
-- TRT = false,
@@ -113,7 +114,7 @@ nodes.pardir_is_opposite = {
},
}
-nodes.textdir_is_opposite = {
+nodes.textdir_is_opposite = allocate {
TLT = {
-- TLT = false,
TRT = true, ["+TRT"] = true,
@@ -140,7 +141,7 @@ nodes.textdir_is_opposite = {
},
}
-nodes.glyphdir_is_opposite = {
+nodes.glyphdir_is_opposite = allocate {
TLT = {
-- TLT = false,
-- TRT = false,
@@ -167,7 +168,7 @@ nodes.glyphdir_is_opposite = {
},
}
-nodes.pardir_is_equal = {
+nodes.pardir_is_equal = allocate {
TLT = {
TLT = true, ["+TLT"] = true,
TRT = true, ["+TRT"] = true,
@@ -194,7 +195,7 @@ nodes.pardir_is_equal = {
},
}
-nodes.textdir_is_equal = {
+nodes.textdir_is_equal = allocate {
TLT = {
TLT = true, ["+TLT"] = true,
-- TRT = false,
@@ -221,7 +222,7 @@ nodes.textdir_is_equal = {
},
}
-nodes.glyphdir_is_equal = {
+nodes.glyphdir_is_equal = allocate {
TLT = {
TLT = true, ["+TLT"] = true,
TRT = true, ["+TRT"] = true,
@@ -248,7 +249,7 @@ nodes.glyphdir_is_equal = {
},
}
-nodes.partextdir_is_equal = {
+nodes.partextdir_is_equal = allocate {
TLT = {
-- TLT = false,
-- TRT = false,
@@ -275,28 +276,28 @@ nodes.partextdir_is_equal = {
},
}
-nodes.textdir_is_is = {
+nodes.textdir_is_is = allocate {
TLT = true, ["+TLT"] = true,
-- TRT = false,
-- LTL = false,
-- RTT = false,
}
-nodes.glyphdir_is_orthogonal = {
+nodes.glyphdir_is_orthogonal = allocate {
TLT = true, ["+TLT"] = true,
TRT = true, ["+TRT"] = true,
LTL = true, ["+LTL"] = true,
-- RTT = false
}
-nodes.dir_is_pop = {
+nodes.dir_is_pop = allocate {
["-TRT"] = true,
["-TLT"] = true,
["-LTL"] = true,
["-RTT"] = true,
}
-nodes.dir_negation = {
+nodes.dir_negation = allocate {
["-TRT"] = "+TRT",
["-TLT"] = "+TLT",
["-LTL"] = "+LTL",
diff --git a/Master/texmf-dist/tex/context/base/node-dum.lua b/Master/texmf-dist/tex/context/base/node-dum.lua
deleted file mode 100644
index f39a0873f70..00000000000
--- a/Master/texmf-dist/tex/context/base/node-dum.lua
+++ /dev/null
@@ -1,19 +0,0 @@
-if not modules then modules = { } end modules ['node-dum'] = {
- version = 1.001,
- comment = "companion to luatex-*.tex",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-nodes = nodes or { }
-
-function nodes.simple_font_handler(head)
--- lang.hyphenate(head)
- head = nodes.process_characters(head)
- nodes.inject_kerns(head)
- nodes.protect_glyphs(head)
- head = node.ligaturing(head)
- head = node.kerning(head)
- return head
-end
diff --git a/Master/texmf-dist/tex/context/base/node-fin.lua b/Master/texmf-dist/tex/context/base/node-fin.lua
index c6e3be44815..5c1cc9ad57a 100644
--- a/Master/texmf-dist/tex/context/base/node-fin.lua
+++ b/Master/texmf-dist/tex/context/base/node-fin.lua
@@ -9,29 +9,33 @@ if not modules then modules = { } end modules ['node-fin'] = {
-- this module is being reconstructed
local next, type, format = next, type, string.format
-local texsprint = tex.sprint
-local ctxcatcodes = tex.ctxcatcodes
+local attributes, nodes, node = attributes, nodes, node
-local glyph = node.id('glyph')
-local glue = node.id('glue')
-local rule = node.id('rule')
-local whatsit = node.id('whatsit')
-local hlist = node.id('hlist')
-local vlist = node.id('vlist')
+local has_attribute = node.has_attribute
+local copy_node = node.copy
-local has_attribute = node.has_attribute
-local copy_node = node.copy
+local nodecodes = nodes.nodecodes
+local whatcodes = nodes.whatcodes
-local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+local glyph_code = nodecodes.glyph
+local disc_code = nodecodes.disc
+local glue_code = nodecodes.glue
+local rule_code = nodecodes.rule
+local whatsit_code = nodecodes.whatsit
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
-states = states or { }
-shipouts = shipouts or { }
+local pdfliteral_code = whatcodes.pdfliteral
+local states = attributes.states
local numbers = attributes.numbers
local trigger = attributes.private('trigger')
local triggering = false
+local starttiming = statistics.starttiming
+local stoptiming = statistics.stoptiming
+
-- these two will be like trackers
function states.enabletriggering()
@@ -57,7 +61,7 @@ end
-- function states.flush()
-- if #collected > 0 then
-- for i=1,#collected do
--- texsprint(ctxcatcodes,collected[i]) -- we're in context mode anyway
+-- context(collected[i]) -- we're in context mode anyway
-- end
-- collected = { }
-- states.collected = collected
@@ -109,9 +113,9 @@ local function process_attribute(head,plugin) -- head,attribute,enabled,initiali
end
end
-nodes.process_attribute = process_attribute
+-- nodes.process_attribute = process_attribute
-function nodes.install_attribute_handler(plugin) -- we need to avoid this nested function
+function nodes.installattributehandler(plugin) -- we need to avoid this nested function
return function(head)
return process_attribute(head,plugin)
end
@@ -159,7 +163,7 @@ end
--~ end
--~ ]]
--~
---~ function nodes.install_attribute_handler(plugin) -- we need to avoid this nested function
+--~ function nodes.installattributehandler(plugin) -- we need to avoid this nested function
--~ plugindata[plugin.name] = plugin
--~ local str = format(template,plugin.name)
--~ return loadstring(str)()
@@ -170,20 +174,25 @@ end
local insert_node_before = node.insert_before
local insert_node_after = node.insert_after
-local nsdata, nsdone, nsforced, nsselector, nstrigger
+local nsdata, nsnone, nslistwise, nsforced, nsselector, nstrigger
local current, current_selector, done = 0, 0, false -- nb, stack has a local current !
function states.initialize(namespace,attribute,head)
- nsdata, nsnone = namespace.data, namespace.none
- nsforced, nsselector, nslistwise = namespace.forced, namespace.selector, namespace.listwise
- nstrigger = triggering and namespace.triggering and trigger
- current, current_selector, done = 0, 0, false -- todo: done cleanup
+ nsdata = namespace.data
+ nsnone = namespace.none
+ nsforced = namespace.forced
+ nsselector = namespace.selector
+ nslistwise = namespace.listwise
+ nstrigger = triggering and namespace.triggering and trigger
+ current = 0
+ current_selector = 0
+ done = false -- todo: done cleanup
end
function states.finalize(namespace,attribute,head) -- is this one ok?
if current > 0 and nsnone then
local id = head.id
- if id == hlist or id == vlist then
+ if id == hlist_code or id == vlist_code then
local list = head.list
if list then
head.list = insert_node_before(list,list,copy_node(nsnone))
@@ -201,27 +210,30 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr
while stack do
local id = stack.id
-- we need to deal with literals too (reset as well as oval)
- -- if id == glyph or (id == whatsit and stack.subtype == 8) or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
- if id == glyph or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
+ -- if id == glyph_code or (id == whatsit_code and stack.subtype == pdfliteral_code) or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then -- or disc_code
+ if id == glyph_code -- or id == disc_code
+ or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then -- or disc_code
local c = has_attribute(stack,attribute)
if c then
if default and c == inheritance then
if current ~= default then
head = insert_node_before(head,stack,copy_node(nsdata[default]))
- current, done = default, true
+ current = default
+ done = true
end
elseif current ~= c then
head = insert_node_before(head,stack,copy_node(nsdata[c]))
- current, done = c, true
+ current = c
+ done = true
end
-- here ? compare selective
- if id == glue then --leader
+ if id == glue_code then --leader
-- same as *list
local content = stack.leader
if content then
local savedcurrent = current
local ci = content.id
- if ci == hlist or ci == vlist then
+ if ci == hlist_code or ci == vlist_code then
-- else we reset inside a box unneeded, okay, the downside is
-- that we trigger color in each repeated box, so there is room
-- for improvement here
@@ -245,13 +257,15 @@ local function process(namespace,attribute,head,inheritance,default) -- one attr
elseif default and inheritance then
if current ~= default then
head = insert_node_before(head,stack,copy_node(nsdata[default]))
- current, done = default, true
+ current = default
+ done = true
end
elseif current > 0 then
head = insert_node_before(head,stack,copy_node(nsnone))
- current, done = 0, true
+ current = 0
+ done = true
end
- elseif id == hlist or id == vlist then
+ elseif id == hlist_code or id == vlist_code then
local content = stack.list
if content then
local ok = false
@@ -286,41 +300,46 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at
while stack do
local id = stack.id
-- we need to deal with literals too (reset as well as oval)
- -- if id == glyph or (id == whatsit and stack.subtype == 8) or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
- if id == glyph or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
+ -- if id == glyph_code or (id == whatsit_code and stack.subtype == pdfliteral_code) or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then -- or disc_code
+ if id == glyph_code -- or id == disc_code
+ or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then -- or disc_code
local c = has_attribute(stack,attribute)
if c then
if default and c == inheritance then
if current ~= default then
local data = nsdata[default]
head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector]))
- current, done = default, true
+ current = default
+ done = true
end
else
local s = has_attribute(stack,nsselector)
if current ~= c or current_selector ~= s then
local data = nsdata[c]
head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector]))
- current, current_selector, done = c, s, true
+ current = c
+ current_selector = s
+ done = true
end
end
elseif default and inheritance then
if current ~= default then
local data = nsdata[default]
head = insert_node_before(head,stack,copy_node(data[nsforced or has_attribute(stack,nsselector) or nsselector]))
- current, done = default, true
+ current = default
+ done = true
end
elseif current > 0 then
head = insert_node_before(head,stack,copy_node(nsnone))
current, current_selector, done = 0, 0, true
end
- if id == glue then -- leader
+ if id == glue_code then -- leader
-- same as *list
local content = stack.leader
if content then
local savedcurrent = current
local ci = content.id
- if ci == hlist or ci == vlist then
+ if ci == hlist_code or ci == vlist_code then
-- else we reset inside a box unneeded, okay, the downside is
-- that we trigger color in each repeated box, so there is room
-- for improvement here
@@ -341,7 +360,7 @@ local function selective(namespace,attribute,head,inheritance,default) -- two at
done = done or ok
end
end
- elseif id == hlist or id == vlist then
+ elseif id == hlist_code or id == vlist_code then
local content = stack.list
if content then
local ok = false
@@ -376,7 +395,7 @@ local function stacked(namespace,attribute,head,default) -- no triggering, no in
local current, depth = default or 0, 0
while stack do
local id = stack.id
- if id == glyph or (id == rule and stack.width ~= 0) or (id == glue and stack.leader) then -- or disc
+ if id == glyph_code or (id == rule_code and stack.width ~= 0) or (id == glue_code and stack.leader) then -- or disc_code
local c = has_attribute(stack,attribute)
if c then
if current ~= c then
@@ -384,7 +403,7 @@ local function stacked(namespace,attribute,head,default) -- no triggering, no in
depth = depth + 1
current, done = c, true
end
- if id == glue then
+ if id == glue_code then
local content = stack.leader
if content then -- unchecked
local ok = false
@@ -392,14 +411,15 @@ local function stacked(namespace,attribute,head,default) -- no triggering, no in
done = done or ok
end
end
- elseif default then
+--~ elseif default then
+ elseif default > 0 then
--
elseif current > 0 then
head = insert_node_before(head,stack,copy_node(nsnone))
depth = depth - 1
current, done = 0, true
end
- elseif id == hlist or id == vlist then
+ elseif id == hlist_code or id == vlist_code then
local content = stack.list
if content then
-- the problem is that broken lines gets the attribute which can be a later one
diff --git a/Master/texmf-dist/tex/context/base/node-fin.mkiv b/Master/texmf-dist/tex/context/base/node-fin.mkiv
index ea9e83f16b5..ffa4b8bf554 100644
--- a/Master/texmf-dist/tex/context/base/node-fin.mkiv
+++ b/Master/texmf-dist/tex/context/base/node-fin.mkiv
@@ -20,10 +20,10 @@
\registerctxluafile{node-fin}{1.001} % we might generalize this one
-\definesystemattribute[trigger] \chardef\triggerattribute \dogetattributeid{trigger} % feature inheritance
+\definesystemattribute[trigger][public]
-\def\finalizeobjectbox #1{\ctxlua{nodes.process_page(tex.box[\number#1])}}
-\def\finalizeshipoutbox#1{\ctxlua{nodes.process_page(tex.box[\number#1])}}
+\def\finalizeobjectbox #1{\ctxlua{nodes.handlers.finalize(tex.box[\number#1])}}
+\def\finalizeshipoutbox#1{\ctxlua{nodes.handlers.finalize(tex.box[\number#1])}}
% tricky stuff:
@@ -56,12 +56,12 @@
\stopinheritattributes}
\def\enableattributeinheritance
- {\ctxlua{states.enabletriggering()}%
+ {\ctxlua{attributes.states.enabletriggering()}%
\let\attributedcopy\doattributedcopy
\let\attributedbox \doattributedbox}
\def\disableattributeinheritance
- {\ctxlua{states.disabletriggering()}%
+ {\ctxlua{attributes.states.disabletriggering()}%
\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 b0d073425cc..7ceb96f80ad 100644
--- a/Master/texmf-dist/tex/context/base/node-fnt.lua
+++ b/Master/texmf-dist/tex/context/base/node-fnt.lua
@@ -6,22 +6,33 @@ if not modules then modules = { } end modules ['node-fnt'] = {
license = "see context related readme files"
}
+if not context then os.exit() end -- generic function in node-dum
+
local next, type = next, type
+local concat = table.concat
+
+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 report_fonts = logs.reporter("fonts","processing")
-local glyph = node.id('glyph')
+local fonthashes = fonts.hashes
+local fontdata = fonthashes.identifiers
-local traverse_id = node.traverse_id
-local has_attribute = node.has_attribute
+local otf = fonts.handlers.otf
-local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+local traverse_id = node.traverse_id
+local has_attribute = node.has_attribute
+local starttiming = statistics.starttiming
+local stoptiming = statistics.stoptiming
+local nodecodes = nodes.nodecodes
+local handlers = nodes.handlers
-fonts = fonts or { }
-fonts.tfm = fonts.tfm or { }
-fonts.ids = fonts.ids or { }
+local glyph_code = nodecodes.glyph
-local fontdata = fonts.ids
+local setmetatableindex = table.setmetatableindex
-- some tests with using an array of dynamics[id] and processes[id] demonstrated
-- that there was nothing to gain (unless we also optimize other parts)
@@ -33,96 +44,123 @@ local fontdata = fonts.ids
-- happen often; we could consider processing sublists but that might need mor
-- checking later on; the current approach also permits variants
-if tex.attribute[0] < 0 then
-
- texio.write_nl("log","!")
- texio.write_nl("log","! Attribute 0 is reserved for ConTeXt's font feature management and has to be")
- texio.write_nl("log","! set to zero. Also, some attributes in the range 1-255 are used for special")
- texio.write_nl("log","! purposed so setting them at the TeX end might break the font handler.")
- texio.write_nl("log","!")
-
- tex.attribute[0] = 0 -- else no features
-
-end
+local run = 0
+
+local setfontdynamics = { }
+local fontprocesses = { }
+
+setmetatableindex(setfontdynamics, function(t,font)
+ local tfmdata = fontdata[font]
+ local shared = tfmdata.shared
+ local v = shared and shared.dynamics and otf.setdynamics or false
+ t[font] = v
+ return v
+end)
+
+setmetatableindex(fontprocesses, function(t,font)
+ local tfmdata = fontdata[font]
+ local shared = tfmdata.shared -- we need to check shared, only when same features
+ local processes = shared and shared.processes
+ if processes and #processes > 0 then
+ t[font] = processes
+ return processes
+ else
+ t[font] = false
+ return false
+ end
+end)
--- this will be redone and split in a generic one and a context one
+fonts.hashes.setdynamics = setfontdynamics
+fonts.hashes.processes = fontprocesses
-function nodes.process_characters(head)
+function handlers.characters(head)
-- either next or not, but definitely no already processed list
starttiming(nodes)
local usedfonts, attrfonts, done = { }, { }, false
local a, u, prevfont, prevattr = 0, 0, nil, 0
- for n in traverse_id(glyph,head) do
- local font, attr = n.font, has_attribute(n,0) -- zero attribute is reserved for fonts in context
- if attr and attr > 0 then
- if font ~= prevfont or attr ~= prevattr then
+ if trace_fontrun then
+ run = run + 1
+ report_fonts()
+ report_fonts("checking node list, run %s",run)
+ report_fonts()
+ local n = head
+ while n do
+ if n.id == glyph_code then
+ local font = n.font
+ local attr = has_attribute(n,0) or 0
+ report_fonts("font %03i, dynamic %03i, glyph %s",font,attr,utf.char(n.char))
+ else
+ report_fonts("[%s]",nodecodes[n.id])
+ end
+ n = n.next
+ end
+ end
+ for n in traverse_id(glyph_code,head) do
+ local font, attr = n.font, has_attribute(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
- -- we do some testing outside the function
- local tfmdata = fontdata[font]
- local shared = tfmdata.shared
- if shared then
- local dynamics = shared.dynamics
- if dynamics then
- local d = shared.set_dynamics(font,dynamics,attr) -- still valid?
- if d then
- used[attr] = d
- a = a + 1
- end
+ local sd = setfontdynamics[font]
+ if sd then -- always true ?
+ local d = sd(font,attr) -- can we cache this one?
+ if d then
+ used[attr] = d
+ a = a + 1
end
end
end
- prevfont, prevattr = font, attr
- end
- elseif font ~= prevfont then
- prevfont, prevattr = font, 0
- 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
- u = u + 1
- end
+ else
+ local used = usedfonts[font]
+ if not used then
+ local fp = fontprocesses[font]
+ if fp then
+ usedfonts[font] = fp
+ u = u + 1
end
- else
- -- probably nullfont
end
end
- else
+ prevfont = font
prevattr = attr
end
end
+ if trace_fontrun then
+ report_fonts()
+ report_fonts("statics : %s",(u > 0 and concat(table.keys(usedfonts)," ")) or "none")
+ report_fonts("dynamics: %s",(a > 0 and concat(table.keys(attrfonts)," ")) or "none")
+ report_fonts()
+ end
-- we could combine these and just make the attribute nil
if u == 1 then
local font, processors = next(usedfonts)
local n = #processors
if n > 0 then
- local h, d = processors[1](head,font,false)
- head, done = h or head, done or d
+ local h, d = processors[1](head,font,0)
+ head = h or head
+ done = done or d
if n > 1 then
for i=2,n do
- local h, d = processors[i](head,font,false)
- head, done = h or head, done or d
+ local h, d = processors[i](head,font,0)
+ head = h or head
+ done = done or d
end
end
end
elseif u > 0 then
for font, processors in next, usedfonts do
local n = #processors
- local h, d = processors[1](head,font,false)
- head, done = h or head, done or d
+ local h, d = processors[1](head,font,0)
+ head = h or head
+ done = done or d
if n > 1 then
for i=2,n do
- local h, d = processors[i](head,font,false)
- head, done = h or head, done or d
+ local h, d = processors[i](head,font,0)
+ head = h or head
+ done = done or d
end
end
end
@@ -131,12 +169,18 @@ function nodes.process_characters(head)
local font, dynamics = next(attrfonts)
for attribute, processors in next, dynamics do -- attr can switch in between
local n = #processors
- local h, d = processors[1](head,font,attribute)
- head, done = h or head, done or d
- if n > 1 then
- for i=2,n do
- local h, d = processors[i](head,font,attribute)
- head, done = h or head, done or d
+ if n == 0 then
+ report_fonts("no processors associated with dynamic %s",attribute)
+ else
+ local h, d = processors[1](head,font,attribute)
+ head = h or head
+ done = done or d
+ if n > 1 then
+ for i=2,n do
+ local h, d = processors[i](head,font,attribute)
+ head = h or head
+ done = done or d
+ end
end
end
end
@@ -144,12 +188,18 @@ function nodes.process_characters(head)
for font, dynamics in next, attrfonts do
for attribute, processors in next, dynamics do -- attr can switch in between
local n = #processors
- local h, d = processors[1](head,font,attribute)
- head, done = h or head, done or d
- if n > 1 then
- for i=2,n do
- local h, d = processors[i](head,font,attribute)
- head, done = h or head, done or d
+ if n == 0 then
+ report_fonts("no processors associated with dynamic %s",attribute)
+ else
+ local h, d = processors[1](head,font,attribute)
+ head = h or head
+ done = done or d
+ if n > 1 then
+ for i=2,n do
+ local h, d = processors[i](head,font,attribute)
+ head = h or head
+ done = done or d
+ end
end
end
end
@@ -162,46 +212,5 @@ function nodes.process_characters(head)
return head, true
end
-if node.protect_glyphs then
-
- nodes.protect_glyphs = node.protect_glyphs
- nodes.unprotect_glyphs = node.unprotect_glyphs
-
-else do
-
- -- initial value subtype : X000 0001 = 1 = 0x01 = char
- --
- -- expected before linebreak : X000 0000 = 0 = 0x00 = glyph
- -- X000 0010 = 2 = 0x02 = ligature
- -- X000 0100 = 4 = 0x04 = ghost
- -- X000 1010 = 10 = 0x0A = leftboundary lig
- -- X001 0010 = 18 = 0x12 = rightboundary lig
- -- X001 1010 = 26 = 0x1A = both boundaries lig
- -- X000 1100 = 12 = 0x1C = leftghost
- -- X001 0100 = 20 = 0x14 = rightghost
-
- function nodes.protect_glyphs(head)
- local done = false
- for g in traverse_id(glyph,head) do
- local s = g.subtype
- if s == 1 then
- done, g.subtype = true, 256
- elseif s <= 256 then
- done, g.subtype = true, 256 + s
- end
- end
- return done
- end
-
- function nodes.unprotect_glyphs(head)
- local done = false
- for g in traverse_id(glyph,head) do
- local s = g.subtype
- if s > 256 then
- done, g.subtype = true, s - 256
- end
- end
- return done
- end
-
-end end
+handlers.protectglyphs = node.protect_glyphs
+handlers.unprotectglyphs = node.unprotect_glyphs
diff --git a/Master/texmf-dist/tex/context/base/node-ini.lua b/Master/texmf-dist/tex/context/base/node-ini.lua
index 36e240238e3..eb70fa6e6d1 100644
--- a/Master/texmf-dist/tex/context/base/node-ini.lua
+++ b/Master/texmf-dist/tex/context/base/node-ini.lua
@@ -15,55 +15,11 @@ modules.</p>
local utf = unicode.utf8
local next, type = next, type
-local format, concat, match, utfchar = string.format, table.concat, string.match, utf.char
-
-local chardata = characters and characters.data
-
---[[ldx--
-<p>We start with a registration system for atributes so that we can use the
-symbolic names later on.</p>
---ldx]]--
-
-attributes = attributes or { }
-
-attributes.names = attributes.names or { }
-attributes.numbers = attributes.numbers or { }
-attributes.list = attributes.list or { }
-attributes.unsetvalue = -0x7FFFFFFF
-
-storage.register("attributes/names", attributes.names, "attributes.names")
-storage.register("attributes/numbers", attributes.numbers, "attributes.numbers")
-storage.register("attributes/list", attributes.list, "attributes.list")
-
-local names, numbers, list = attributes.names, attributes.numbers, attributes.list
-
-function attributes.define(name,number) -- at the tex end
- if not numbers[name] then
- numbers[name], names[number], list[number] = number, name, { }
- end
-end
-
---[[ldx--
-<p>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 <l n='context'/>.</p>
---ldx]]--
-
-storage.shared.attributes_last_private = storage.shared.attributes_last_private or 127
-
-function attributes.private(name) -- at the lua end (hidden from user)
- local number = numbers[name]
- if not number then
- local last = storage.shared.attributes_last_private or 127
- if last < 255 then
- last = last + 1
- storage.shared.attributes_last_private = last
- end
- number = last
- numbers[name], names[number], list[number] = number, name, { }
- end
- return number
-end
+local format, concat, match, gsub = string.format, table.concat, string.match, string.gsub
+local utfchar = utf.char
+local swapped = table.swapped
+local lpegmatch = lpeg.match
+local formatcolumns = utilities.formatters.formatcolumns
--[[ldx--
<p>Access to nodes is what gives <l n='luatex'/> its power. Here we
@@ -98,39 +54,226 @@ into the <l n='tex'/> engine, but this is a not so natural extension.</p>
also ignore the empty nodes. [This is obsolete!]</p>
--ldx]]--
-nodes = nodes or { }
-
-local hlist = node.id('hlist')
-local vlist = node.id('vlist')
-local glyph = node.id('glyph')
-local glue = node.id('glue')
-local penalty = node.id('penalty')
-local kern = node.id('kern')
-local whatsit = node.id('whatsit')
-
-local traverse_id = node.traverse_id
local traverse = node.traverse
+local traverse_id = node.traverse_id
local free_node = node.free
local remove_node = node.remove
local insert_node_before = node.insert_before
local insert_node_after = node.insert_after
+local node_fields = node.fields
+
+local allocate = utilities.storage.allocate
+
+nodes = nodes or { }
+local nodes = nodes
+
+nodes.handlers = nodes.handlers or { }
+
+-- there will be more of this:
+
+local skipcodes = allocate {
+ [ 0] = "userskip",
+ [ 1] = "lineskip",
+ [ 2] = "baselineskip",
+ [ 3] = "parskip",
+ [ 4] = "abovedisplayskip",
+ [ 5] = "belowdisplayskip",
+ [ 6] = "abovedisplayshortskip",
+ [ 7] = "belowdisplayshortskip",
+ [ 8] = "leftskip",
+ [ 9] = "rightskip",
+ [10] = "topskip",
+ [11] = "splittopskip",
+ [12] = "tabskip",
+ [13] = "spaceskip",
+ [14] = "xspaceskip",
+ [15] = "parfillskip",
+ [16] = "thinmuskip",
+ [17] = "medmuskip",
+ [18] = "thickmuskip",
+}
+
+local noadcodes = allocate {
+ [ 0] = "ord",
+ [ 1] = "opdisplaylimits",
+ [ 2] = "oplimits",
+ [ 3] = "opnolimits",
+ [ 4] = "bin",
+ [ 5] = "rel",
+ [ 6] = "open",
+ [ 7] = "close",
+ [ 8] = "punct",
+ [ 9] = "inner",
+ [10] = "under",
+ [11] = "over",
+ [12] = "vcenter",
+}
+
+local listcodes = allocate {
+ [ 0] = "unknown",
+ [ 1] = "line",
+ [ 2] = "box",
+ [ 3] = "indent",
+ [ 4] = "alignment", -- row or column
+ [ 5] = "cell",
+}
+
+local glyphcodes = allocate {
+ [0] = "character",
+ [1] = "glyph",
+ [2] = "ligature",
+ [3] = "ghost",
+ [4] = "left",
+ [5] = "right",
+}
+
+local kerncodes = allocate {
+ [0] = "fontkern",
+ [1] = "userkern",
+ [2] = "accentkern",
+}
+
+local mathcodes = allocate {
+ [0] = "beginmath",
+ [1] = "endmath",
+}
-function nodes.remove(head, current, free_too)
+local fillcodes = allocate {
+ [0] = "stretch",
+ [1] = "fi",
+ [2] = "fil",
+ [3] = "fill",
+ [4] = "filll",
+}
+
+local function simplified(t)
+ local r = { }
+ for k, v in next, t do
+ r[k] = gsub(v,"_","")
+ end
+ return r
+end
+
+local nodecodes = simplified(node.types())
+local whatcodes = simplified(node.whatsits())
+
+skipcodes = allocate(swapped(skipcodes, skipcodes ))
+noadcodes = allocate(swapped(noadcodes, noadcodes ))
+nodecodes = allocate(swapped(nodecodes, nodecodes ))
+whatcodes = allocate(swapped(whatcodes, whatcodes ))
+listcodes = allocate(swapped(listcodes, listcodes ))
+glyphcodes = allocate(swapped(glyphcodes,glyphcodes))
+kerncodes = allocate(swapped(kerncodes, kerncodes ))
+mathcodes = allocate(swapped(mathcodes, mathcodes ))
+fillcodes = allocate(swapped(fillcodes, fillcodes ))
+
+nodes.skipcodes = skipcodes nodes.gluecodes = skipcodes -- more official
+nodes.noadcodes = noadcodes
+nodes.nodecodes = nodecodes
+nodes.whatcodes = whatcodes nodes.whatsitcodes = whatcodes -- more official
+nodes.listcodes = listcodes
+nodes.glyphcodes = glyphcodes
+nodes.kerncodes = kerncodes
+nodes.mathcodes = mathcodes
+nodes.fillcodes = fillcodes
+
+listcodes.row = listcodes.alignment
+listcodes.column = listcodes.alignment
+
+kerncodes.italiccorrection = kerncodes.userkern
+kerncodes.kerning = kerncodes.fontkern
+
+nodes.codes = allocate {
+ hlist = listcodes,
+ vlist = listcodes,
+ glyph = glyphcodes,
+ glue = skipcodes,
+ kern = kerncodes,
+ whatsit = whatcodes,
+ math = mathnodes,
+ noad = noadcodes,
+}
+
+function nodes.showcodes()
+ local t = { }
+ for name, codes in table.sortedhash(nodes.codes) do
+ local sorted = table.sortedkeys(codes)
+ for i=1,#sorted do
+ local s = sorted[i]
+ if type(s) ~= "number" then
+ t[#t+1] = { name, s, codes[s] }
+ end
+ end
+ end
+ formatcolumns(t)
+ for k=1,#t do
+ texio.write_nl(t[k])
+ end
+end
+
+local whatsit_node = nodecodes.whatsit
+
+local messyhack = table.tohash { -- temporary solution
+ nodecodes.attributelist,
+ nodecodes.attribute,
+ nodecodes.gluespec,
+ nodecodes.action,
+}
+
+function nodes.fields(n)
+ local id = n.id
+ if id == whatsit_node then
+ return node_fields(id,n.subtype)
+ else
+ local t = node_fields(id)
+ if messyhack[id] then
+ for i=1,#t do
+ if t[i] == "subtype" then
+ table.remove(t,i)
+ break
+ end
+ end
+ end
+ return t
+ end
+end
+
+trackers.register("system.showcodes", nodes.showcodes)
+
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local glue_code = nodecodes.glue
+
+--~ if t.id == glue_code then
+--~ local s = t.spec
+--~ print(t)
+--~ print(s,s and s.writable)
+--~ if s and s.writable then
+--~ free_node(s)
+--~ end
+--~ t.spec = nil
+--~ end
+
+local function remove(head, current, free_too)
local t = current
+--~ print(t)
head, current = remove_node(head,current)
if t then
if free_too then
free_node(t)
t = nil
else
- t.next, t.prev = nil, nil
+ t.next = nil
+ t.prev = nil
end
end
return head, current, t
end
+nodes.remove = remove
+
function nodes.delete(head,current)
- return nodes.remove(head,current,true)
+ return remove(head,current,true)
end
nodes.before = insert_node_before
@@ -184,10 +327,12 @@ function nodes.replace(head,current,new) -- no head returned if false
end
local prev, next = current.prev, current.next
if next then
- new.next, next.prev = next, new
+ new.next = next
+ next.prev = new
end
if prev then
- new.prev, prev.next = prev, new
+ new.prev = prev
+ prev.next = new
end
if head then
if head == current then
@@ -207,7 +352,7 @@ local function count(stack,flat)
local n = 0
while stack do
local id = stack.id
- if not flat and id == hlist or id == vlist then
+ if not flat and id == hlist_code or id == vlist_code then
local list = stack.list
if list then
n = n + 1 + count(list) -- self counts too
@@ -224,21 +369,17 @@ end
nodes.count = count
--- new, will move
-
-function attributes.ofnode(n)
- local a = n.attr
- if a then
- local names = attributes.names
- a = a.next
- while a do
- local number, value = a.number, a.value
- texio.write_nl(format("%s : attribute %3i, value %4i, name %s",tostring(n),number,value,names[number] or '?'))
- a = a.next
- end
- end
+local left, space = lpeg.P("<"), lpeg.P(" ")
+
+local reference = left * (1-left)^0 * left * space^0 * lpeg.C((1-space)^0)
+
+function nodes.reference(n)
+ return lpegmatch(reference,tostring(n))
end
-local left, space = lpeg.P("<"), lpeg.P(" ")
+if not node.next then
-nodes.filterkey = left * (1-left)^0 * left * space^0 * lpeg.C((1-space)^0)
+ function node.next(n) return n and n.next end
+ function node.prev(n) return n and n.prev end
+
+end
diff --git a/Master/texmf-dist/tex/context/base/node-ini.mkiv b/Master/texmf-dist/tex/context/base/node-ini.mkiv
index 78725931666..8d048122f5d 100644
--- a/Master/texmf-dist/tex/context/base/node-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/node-ini.mkiv
@@ -18,55 +18,20 @@
\newcount\filterstate \filterstate\plusone
\registerctxluafile{node-ini}{1.001}
+\registerctxluafile{node-res}{1.001}
\registerctxluafile{node-dir}{1.001}
\registerctxluafile{node-aux}{1.001}
\registerctxluafile{node-tst}{1.001}
\registerctxluafile{node-tra}{1.001} % we might split it off (module)
-\registerctxluafile{node-seq}{1.001} % we might generalize this one
\registerctxluafile{node-tsk}{1.001}
\registerctxluafile{node-tex}{1.001}
-\registerctxluafile{node-res}{1.001}
\registerctxluafile{node-pro}{1.001}
\registerctxluafile{node-shp}{1.001}
\registerctxluafile{node-ser}{1.001}
\registerctxluafile{node-ext}{1.001}
-\registerctxluafile{node-inj}{1.001} % we might split it off
+%registerctxluafile{node-inj}{1.001} % we might split it off
\registerctxluafile{node-typ}{1.001} % experimental
-
-\newtoks \attributesresetlist
-
-\ifdefined \v!global \else \def\v!global{global} \fi % for metatex
-
-\unexpanded\def\defineattribute
- {\dodoubleempty\dodefineattribute}
-
-\def\dodefineattribute[#1][#2]% alternatively we can let lua do the housekeeping
- {\expandafter\newattribute\csname @attr@#1\endcsname
- \expandafter \xdef\csname :attr:#1\endcsname{\number\lastallocatedattribute}%
- \ctxlua{attributes.define("#1",\number\lastallocatedattribute)}%
- %\writestatus\m!systems{defining attribute #1 with number \number\lastallocatedattribute}%
- \doifnotinset\v!global{#2}{\appendetoks\csname @attr@#1\endcsname\attributeunsetvalue\to\attributesresetlist}}
-
-\unexpanded\def\definesystemattribute
- {\dodoubleempty\dodefinesystemattribute}
-
-\def\dodefinesystemattribute[#1][#2]% alternatively we can let lua do the housekeeping
- {\scratchcounter\ctxlua{tex.print(attributes.private("#1"))}\relax
- \global\expandafter\attributedef\csname @attr@#1\endcsname\scratchcounter
- \expandafter \xdef\csname :attr:#1\endcsname{\number\scratchcounter}%
- %\writestatus\m!systems{defining system attribute #1 with number \number\scratchcounter}%
- \doifnotinset\v!global{#2}{\appendetoks\csname @attr@#1\endcsname\attributeunsetvalue\to\attributesresetlist}}
-
-% expandable so we can \edef them for speed
-
-\def\dosetattribute#1#2{\csname @attr@#1\endcsname#2\relax}
-\def\doresetattribute#1{\csname @attr@#1\endcsname\attributeunsetvalue}
-\def\dogetattribute #1{\number\csname @attr@#1\endcsname}
-\def\dogetattributeid#1{\csname :attr:#1\endcsname}
-
-\let\dompattribute\gobbletwoarguments
-
-\def\resetallattributes{\the\attributesresetlist}
+\registerctxluafile{node-acc}{1.001} % experimental
\newcount\shownodescounter
diff --git a/Master/texmf-dist/tex/context/base/node-inj.lua b/Master/texmf-dist/tex/context/base/node-inj.lua
index 9c4612a2299..b9ef9188f94 100644
--- a/Master/texmf-dist/tex/context/base/node-inj.lua
+++ b/Master/texmf-dist/tex/context/base/node-inj.lua
@@ -6,8 +6,6 @@ if not modules then modules = { } end modules ['node-inj'] = {
license = "see context related readme files"
}
--- tricky ... fonts.ids is not yet defined .. to be solved (maybe general tex ini)
-
-- 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
@@ -17,23 +15,28 @@ local next = next
local trace_injections = false trackers.register("nodes.injections", function(v) trace_injections = v end)
-fonts = fonts or { }
-fonts.tfm = fonts.tfm or { }
-fonts.ids = fonts.ids or { }
+local report_injections = logs.reporter("nodes","injections")
+
+local attributes, nodes, node = attributes, nodes, node
+
+fonts = fonts
+local fontdata = fonts.hashes.identifiers
-local fontdata = fonts.ids
+nodes.injections = nodes.injections or { }
+local injections = nodes.injections
-local glyph = node.id('glyph')
-local kern = node.id('kern')
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
+local nodepool = nodes.pool
+local newkern = nodepool.kern
local traverse_id = node.traverse_id
+local unset_attribute = node.unset_attribute
local has_attribute = node.has_attribute
local set_attribute = node.set_attribute
local insert_node_before = node.insert_before
local insert_node_after = node.insert_after
-local newkern = nodes.kern
-
local markbase = attributes.private('markbase')
local markmark = attributes.private('markmark')
local markdone = attributes.private('markdone')
@@ -53,7 +56,7 @@ local kerns = { }
-- for the moment we pass the r2l key ... volt/arabtype tests
-function nodes.set_cursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext)
+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
@@ -63,7 +66,7 @@ function nodes.set_cursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmnext)
return dx, dy, bound
end
-function nodes.set_pair(current,factor,rlmode,r2lflag,spec,tfmchr)
+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
@@ -82,17 +85,19 @@ function nodes.set_pair(current,factor,rlmode,r2lflag,spec,tfmchr)
return x, y, w, h -- no bound
end
-function nodes.set_kern(current,factor,rlmode,x,tfmchr)
+function injections.setkern(current,factor,rlmode,x,tfmchr)
local dx = factor*x
if dx ~= 0 then
local bound = #kerns + 1
set_attribute(current,kernpair,bound)
kerns[bound] = { rlmode, dx }
+ return dx, bound
+ else
+ return 0, 0
end
- return dx, bound
end
-function nodes.set_mark(start,base,factor,rlmode,ba,ma,index) --ba=baseanchor, ma=markanchor
+function injections.setmark(start,base,factor,rlmode,ba,ma,index) --ba=baseanchor, ma=markanchor
local dx, dy = factor*(ba[1]-ma[1]), factor*(ba[2]-ma[2])
local bound = has_attribute(base,markbase)
if bound then
@@ -104,7 +109,7 @@ function nodes.set_mark(start,base,factor,rlmode,ba,ma,index) --ba=baseanchor, m
set_attribute(start,markdone,index)
return dx, dy, bound
else
- logs.report("nodes mark", "possible problem, U+%04X is base without data (id: %s)",base.char,bound)
+ report_injections("possible problem, U+%05X is base mark without data (id: %s)",base.char,bound)
end
end
index = index or 1
@@ -112,19 +117,17 @@ function nodes.set_mark(start,base,factor,rlmode,ba,ma,index) --ba=baseanchor, m
set_attribute(base,markbase,bound)
set_attribute(start,markmark,bound)
set_attribute(start,markdone,index)
- marks[bound] = { [index] = { dx, dy } }
+ marks[bound] = { [index] = { dx, dy, rlmode } }
return dx, dy, bound
end
-function nodes.trace_injection(head)
- 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 report(...)
- logs.report("nodes finisher",...)
- end
- report("begin run")
- for n in traverse_id(glyph,head) do
+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 = has_attribute(n,kernpair)
local mb = has_attribute(n,markbase)
@@ -132,65 +135,70 @@ function nodes.trace_injection(head)
local md = has_attribute(n,markdone)
local cb = has_attribute(n,cursbase)
local cc = has_attribute(n,curscurs)
- report("char U+%05X, font=%s",n.char,n.font)
+ report_injections("char U+%05X, font=%s",n.char,n.font)
if kp then
local k = kerns[kp]
if k[3] then
- report(" pairkern: dir=%s, x=%s, y=%s, w=%s, h=%s",dir(k[1]),k[2] or "?",k[3] or "?",k[4] or "?",k[5] or "?")
+ report_injections(" pairkern: dir=%s, x=%s, y=%s, w=%s, h=%s",dir(k[1]),k[2] or "?",k[3] or "?",k[4] or "?",k[5] or "?")
else
- report(" kern: dir=%s, dx=%s",dir(k[1]),k[2] or "?")
+ report_injections(" kern: dir=%s, dx=%s",dir(k[1]),k[2] or "?")
end
end
if mb then
- report(" markbase: bound=%s",mb)
+ report_injections(" markbase: bound=%s",mb)
end
if mm then
local m = marks[mm]
if mb then
local m = m[mb]
if m then
- report(" markmark: bound=%s, index=%s, dx=%s, dy=%s",mm,md or "?",m[1] or "?",m[2] or "?")
+ report_injections(" markmark: bound=%s, index=%s, dx=%s, dy=%s",mm,md or "?",m[1] or "?",m[2] or "?")
else
- report(" markmark: bound=%s, missing index",mm)
+ report_injections(" markmark: bound=%s, missing index",mm)
end
else
m = m[1]
- report(" markmark: bound=%s, dx=%s, dy=%s",mm,m[1] or "?",m[2] or "?")
+ report_injections(" markmark: bound=%s, dx=%s, dy=%s",mm,m[1] or "?",m[2] or "?")
end
end
if cb then
- report(" cursbase: bound=%s",cb)
+ report_injections(" cursbase: bound=%s",cb)
end
if cc then
local c = cursives[cc]
- report(" curscurs: bound=%s, dir=%s, dx=%s, dy=%s",cc,dir(c[1]),c[2] or "?",c[3] or "?")
+ report_injections(" curscurs: bound=%s, dir=%s, dx=%s, dy=%s",cc,dir(c[1]),c[2] or "?",c[3] or "?")
end
end
end
- report("end run")
+ report_injections("end run")
end
-- todo: reuse tables (i.e. no collection), but will be extra fields anyway
+-- todo: check for attribute
-function nodes.inject_kerns(head,where,keep)
+-- we can have a fast test on a font being processed, so we can check faster for marks etc
+
+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 has_marks or has_cursives or has_kerns then
if trace_injections then
- nodes.trace_injection(head)
+ trace(head)
end
-- in the future variant we will not copy items but refs to tables
- local done, ky, rl, valid, cx, wx, mk = false, { }, { }, { }, { }, { }, { }
+ 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,head) do
+ for n in traverse_id(glyph_code,head) do -- only needed for relevant fonts
if n.subtype < 256 then
- valid[#valid+1] = n
+ nofvalid = nofvalid + 1
+ valid[nofvalid] = n
if n.font ~= nf then
nf = n.font
- tm = fontdata[nf].marks
+ tm = fontdata[nf].resources.marks
+ end
+ if tm then
+ mk[n] = tm[n.char]
end
- mk[n] = tm[n.char]
local k = has_attribute(n,kernpair)
if k then
local kk = kerns[k]
@@ -210,18 +218,21 @@ function nodes.inject_kerns(head,where,keep)
end
else
local nf, tm = nil, nil
- for n in traverse_id(glyph,head) do
+ for n in traverse_id(glyph_code,head) do
if n.subtype < 256 then
- valid[#valid+1] = n
+ nofvalid = nofvalid + 1
+ valid[nofvalid] = n
if n.font ~= nf then
nf = n.font
- tm = fontdata[nf].marks
+ tm = fontdata[nf].resources.marks
+ end
+ if tm then
+ mk[n] = tm[n.char]
end
- mk[n] = tm[n.char]
end
end
end
- if #valid > 0 then
+ if nofvalid > 0 then
-- we can assume done == true because we have cursives and marks
local cx = { }
if has_kerns and next(ky) then
@@ -234,7 +245,7 @@ function nodes.inject_kerns(head,where,keep)
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,#valid do -- valid == glyphs
+ for i=1,nofvalid do -- valid == glyphs
local n = valid[i]
if not mk[n] then
local n_cursbase = has_attribute(n,cursbase)
@@ -298,28 +309,42 @@ function nodes.inject_kerns(head,where,keep)
end
end
if has_marks then
- for i=1,#valid do
+ for i=1,nofvalid do
local p = valid[i]
local p_markbase = has_attribute(p,markbase)
if p_markbase then
local mrks = marks[p_markbase]
- for n in traverse_id(glyph,p.next) do
+ for n in traverse_id(glyph_code,p.next) do
local n_markmark = has_attribute(n,markmark)
if p_markbase == n_markmark then
local index = has_attribute(n,markdone) or 1
local d = mrks[index]
if d then
- -- local rlmode = d[3] -- not used
- -- if rlmode and rlmode > 0 then
- -- todo
- -- else
+ local rlmode = d[3]
+ if rlmode and rlmode >= 0 then
+ -- new per 2010-10-06, width adapted per 2010-02-03
+ -- we used to negate the width of marks because in tfm
+ -- that makes sense but we no longer do that so as a
+ -- consequence the sign of p.width was changed (we need
+ -- to keep an eye on it as we don't have that many fonts
+ -- that enter this branch .. i'm still not sure if this
+ -- one is right
+ local k = wx[p]
+ if k then
+ n.xoffset = p.xoffset + p.width + d[1] - k[2]
+ else
+ -- n.xoffset = p.xoffset + p.width + d[1]
+ -- lucida U\char"032F (default+mark)
+ n.xoffset = p.xoffset - p.width + d[1] -- 01-05-2011
+ end
+ else
local k = wx[p]
if k then
n.xoffset = p.xoffset - d[1] - k[2]
else
n.xoffset = p.xoffset - d[1]
end
- -- end
+ end
if mk[p] then
n.yoffset = p.yoffset + d[2]
else
@@ -342,39 +367,21 @@ function nodes.inject_kerns(head,where,keep)
-- only w can be nil, can be sped up when w == nil
local rl, x, w, r2l = k[1], k[2] or 0, k[4] or 0, k[6]
local wx = w - x
---~ if rl < 0 then
---~ if r2l then
---~ if wx ~= 0 then
---~ insert_node_before(head,n,newkern(wx))
---~ end
---~ if x ~= 0 then
---~ insert_node_after (head,n,newkern(x))
---~ 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))
---~ end
---~ end
---~ else
- if r2l then
- if wx ~= 0 then
- insert_node_before(head,n,newkern(wx))
- end
- if x ~= 0 then
- insert_node_after (head,n,newkern(x))
- 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))
- end
+ if r2l then
+ if wx ~= 0 then
+ insert_node_before(head,n,newkern(wx))
+ end
+ if x ~= 0 then
+ insert_node_after (head,n,newkern(x))
+ end
+ else
+ if x ~= 0 then
+ insert_node_before(head,n,newkern(x))
end
---~ end
+ if wx ~= 0 then
+ insert_node_after(head,n,newkern(wx))
+ end
+ end
end
end
if next(cx) then
@@ -398,38 +405,22 @@ function nodes.inject_kerns(head,where,keep)
end
elseif has_kerns then
if trace_injections then
- nodes.trace_injection(head)
+ trace(head)
end
- for n in traverse_id(glyph,head) do
- local k = has_attribute(n,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
---~ if r2l then
---~ if x ~= 0 then
---~ insert_node_before(head,n,newkern(x))
---~ end
---~ if wx ~= 0 then
---~ insert_node_after(head,n,newkern(wx))
---~ end
---~ else
---~ if wx ~= 0 then
---~ insert_node_before(head,n,newkern(wx))
---~ end
---~ if x ~= 0 then
---~ insert_node_after (head,n,newkern(x))
---~ end
---~ end
---~ else
+ for n in traverse_id(glyph_code,head) do
+ if n.subtype < 256 then
+ local k = has_attribute(n,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 r2l then
if wx ~= 0 then
insert_node_before(head,n,newkern(wx))
@@ -445,11 +436,11 @@ function nodes.inject_kerns(head,where,keep)
insert_node_after(head,n,newkern(wx))
end
end
---~ end
- else
- -- simple (e.g. kernclass kerns)
- if x ~= 0 then
- insert_node_before(head,n,newkern(x))
+ else
+ -- simple (e.g. kernclass kerns)
+ if x ~= 0 then
+ insert_node_before(head,n,newkern(x))
+ end
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/node-mig.lua b/Master/texmf-dist/tex/context/base/node-mig.lua
index f9f0ad23184..620cb3c0e55 100644
--- a/Master/texmf-dist/tex/context/base/node-mig.lua
+++ b/Master/texmf-dist/tex/context/base/node-mig.lua
@@ -8,20 +8,25 @@ if not modules then modules = { } end modules ['node-mig'] = {
local format = string.format
-local hlist = node.id('hlist')
-local vlist = node.id('vlist')
-local insert = node.id('ins')
-local mark = node.id('mark')
+local attributes, nodes, node = attributes, nodes, node
local has_attribute = node.has_attribute
local set_attribute = node.set_attribute
local remove_nodes = nodes.remove
-local migrated = attributes.private("migrated")
+local nodecodes = nodes.nodecodes
+local tasks = nodes.tasks
-local trace_migrations = false
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local insert_code = nodecodes.ins
+local mark_code = nodecodes.mark
-trackers.register("nodes.migrations", function(v) trace_migrations = v end)
+local migrated = attributes.private("migrated")
+
+local trace_migrations = false trackers.register("nodes.migrations", function(v) trace_migrations = v end)
+
+local report_nodes = logs.reporter("nodes","migrations")
local migrate_inserts, migrate_marks
@@ -31,10 +36,10 @@ local function locate(head,first,last,ni,nm)
local current = head
while current do
local id = current.id
- if id == vlist or id == hlist then
+ if id == vlist_code or id == hlist_code then
current.list, first, last, ni, nm = locate(current.list,first,last,ni,nm)
current= current.next
- elseif migrate_inserts and id == insert then
+ elseif migrate_inserts and id == insert_code then
local insert
head, current, insert = remove_nodes(head,current)
insert.next = nil
@@ -44,7 +49,7 @@ local function locate(head,first,last,ni,nm)
insert.prev, first = nil, insert
end
last, ni = insert, ni + 1
- elseif migrate_marks and id == mark then
+ elseif migrate_marks and id == mark_code then
local mark
head, current, mark = remove_nodes(head,current)
mark.next = nil
@@ -61,20 +66,20 @@ local function locate(head,first,last,ni,nm)
return head, first, last, ni, nm
end
-function nodes.migrate_outwards(head,where)
+function nodes.handlers.migrate(head,where)
local done = false
if head then
local current = head
while current do
local id = current.id
- if id == vlist or id == hlist and not has_attribute(current,migrated) then
+ if id == vlist_code or id == hlist_code and not has_attribute(current,migrated) then
set_attribute(current,migrated,1)
t_sweeps = t_sweeps + 1
local h = current.list
local first, last, ni, nm
while h do
local id = h.id
- if id == vlist or id == hlist then
+ if id == vlist_code or id == hlist_code then
h, first, last, ni, nm = locate(h,first,last,0,0)
end
h = h.next
@@ -82,7 +87,7 @@ function nodes.migrate_outwards(head,where)
if first then
t_inserts, t_marks = t_inserts + ni, t_marks + nm
if trace_migrations and (ni > 0 or nm > 0) then
- logs.report("nodes","sweep %s, %s inserts and %s marks migrated outwards",t_sweeps,ni,nm)
+ report_nodes("sweep %s, %s inserts and %s marks migrated outwards",t_sweeps,ni,nm)
end
-- inserts after head
local n = current.next
@@ -99,16 +104,18 @@ function nodes.migrate_outwards(head,where)
end
end
+-- for the moment this way, this will disappear
+
experiments.register("marks.migrate", function(v)
if v then
- tasks.enableaction("mvlbuilders", "nodes.migrate_outwards")
+ tasks.enableaction("mvlbuilders", "nodes.handlers.migrate")
end
migrate_marks = v
end)
experiments.register("inserts.migrate", function(v)
if v then
- tasks.enableaction("mvlbuilders", "nodes.migrate_outwards")
+ tasks.enableaction("mvlbuilders", "nodes.handlers.migrate")
end
migrate_inserts = v
end)
diff --git a/Master/texmf-dist/tex/context/base/node-mig.mkiv b/Master/texmf-dist/tex/context/base/node-mig.mkiv
index cd731b96f79..c07f5ed5b78 100644
--- a/Master/texmf-dist/tex/context/base/node-mig.mkiv
+++ b/Master/texmf-dist/tex/context/base/node-mig.mkiv
@@ -45,16 +45,17 @@
\newtoks \everyautomigratefootnotes
\newtoks \everyautomigratemarks
-\def\automigrateinserts{\the\everyautomigratefootnotes}
+\def\automigrateinserts{\the\everyautomigratefootnotes} % soon default but does not work (yet) for notes in captions (themselves inserts)
\def\automigratemarks {\the\everyautomigratemarks}
\appendtoks
- \let\postponenotes\relax
- \enableexperiments[inserts.migrate]%
+ \let\postponenotes\relax
+ \enableexperiments[inserts.migrate]%
\to \everyautomigratefootnotes
\appendtoks
- \enableexperiments[marks.migrate]%
+ \writestatus\m!system{migration of marks is normally not needed}%
+ \enableexperiments[marks.migrate]%
\to \everyautomigratemarks
\protect
diff --git a/Master/texmf-dist/tex/context/base/node-pag.lua b/Master/texmf-dist/tex/context/base/node-pag.lua
index 4bc53c6ddb6..9b8202042c5 100644
--- a/Master/texmf-dist/tex/context/base/node-pag.lua
+++ b/Master/texmf-dist/tex/context/base/node-pag.lua
@@ -13,7 +13,7 @@ pagebuilders = pagebuilders or { }
local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
-local actions = tasks.actions("pagebuilders",5)
+local actions = nodes.tasks.actions("pagebuilders")
local function processor(head,groupcode,size,packtype,maxdepth,direction)
starttiming(pagebuilders)
diff --git a/Master/texmf-dist/tex/context/base/node-par.lua b/Master/texmf-dist/tex/context/base/node-par.lua
index 7be7e7917ca..b0879c7506b 100644
--- a/Master/texmf-dist/tex/context/base/node-par.lua
+++ b/Master/texmf-dist/tex/context/base/node-par.lua
@@ -6,28 +6,43 @@ if not modules then modules = { } end modules ['node-par'] = {
license = "see context related readme files"
}
-parbuilders = parbuilders or { }
+local builders, nodes, node = builders, nodes, node
+
+builders.paragraphs = builders.paragraphs or { }
+local parbuilders = builders.paragraphs
+
parbuilders.constructors = parbuilders.constructors or { }
-parbuilders.names = parbuilders.names or { }
-parbuilders.numbers = parbuilders.numbers or { }
-parbuilders.attribute = attributes.numbers['parbuilder'] or 999
+local constructors = parbuilders.constructors
+
+constructors.names = constructors.names or { }
+local names = constructors.names
+
+constructors.numbers = constructors.numbers or { }
+local numbers = constructors.numbers
+
+constructors.methods = constructors.methods or { }
+local methods = constructors.methods
+
+local p_attribute = attributes.numbers['parbuilder'] or 999
+constructors.attribute = p_attribute
-storage.register("parbuilders.names", parbuilders.names, "parbuilders.names")
-storage.register("parbuilders.numbers", parbuilders.numbers, "parbuilders.numbers")
+local has_attribute = node.has_attribute
+local starttiming = statistics.starttiming
+local stoptiming = statistics.stoptiming
-local constructors, names, numbers, p_attribute = parbuilders.constructors, parbuilders.names, parbuilders.numbers, parbuilders.attribute
+storage.register("builders/paragraphs/constructors/names", names, "builders.paragraphs.constructors.names")
+storage.register("builders/paragraphs/constructors/numbers", numbers, "builders.paragraphs.constructors.numbers")
-local has_attribute = node.has_attribute
-local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+local report_parbuilders = logs.reporter("parbuilders")
local mainconstructor = nil -- not stored in format
-function parbuilders.register(name,number)
- parbuilders.names[number] = name
- parbuilders.numbers[name] = number
+function constructors.register(name,number)
+ names[number] = name
+ numbers[name] = number
end
-function parbuilders.setmain(name)
+function constructors.set(name)
mainconstructor = numbers[name]
end
@@ -37,19 +52,19 @@ end
-- false : idem but dangerous
-- head : list of valid vmode nodes with last being hlist
-function parbuilders.constructor(head,followed_by_display)
+function constructors.handler(head,followed_by_display)
if type(head) == "boolean" then
return head
else
local attribute = has_attribute(head,p_attribute) or mainconstructor
if attribute then
- local constructor = names[attribute]
- if constructor then
- local handler = constructor and constructors[constructor]
+ local method = names[attribute]
+ if method then
+ local handler = methods[method]
if handler then
return handler(head,followed_by_display)
else
- logs.report("parbuilders","handler '%s' is not defined",tostring(constructor))
+ report_parbuilders("contructor method '%s' is not defined",tostring(method))
return true -- let tex break
end
end
@@ -60,28 +75,28 @@ end
-- just for testing
-function parbuilders.constructors.default(head,followed_by_display)
+function constructors.methods.default(head,followed_by_display)
return true -- let tex break
end
-- also for testing (no surrounding spacing done)
-function parbuilders.constructors.oneline(head,followed_by_display)
+function constructors.methods.oneline(head,followed_by_display)
return node.hpack(head)
end
-- It makes no sense to have a sequence here as we already have
-- pre and post hooks and only one parbuilder makes sense, so no:
--
--- local actions = tasks.actions("parbuilders",1)
+-- local actions = nodes.tasks.actions("parbuilders")
-- todo: enable one as main
-local actions = parbuilders.constructor
+local actions = constructors.handler
local enabled = false
-function parbuilders.enable () enabled = true end
-function parbuilders.disable() enabled = false end
+function constructors.enable () enabled = true end
+function constructors.disable() enabled = false end
local function processor(head,followed_by_display)
if enabled then
diff --git a/Master/texmf-dist/tex/context/base/node-par.mkiv b/Master/texmf-dist/tex/context/base/node-par.mkiv
index cb53e643d7e..2e9efde1f3c 100644
--- a/Master/texmf-dist/tex/context/base/node-par.mkiv
+++ b/Master/texmf-dist/tex/context/base/node-par.mkiv
@@ -30,7 +30,7 @@
\registerctxluafile{node-par}{1.001}
-\definesystemattribute[parbuilder] \chardef\parbuilderattribute \dogetattributeid{parbuilder}
+\definesystemattribute[parbuilder][public]
% todo auto-enable
@@ -40,7 +40,7 @@
\unexpanded\def\defineparbuilder[#1]%
{\global\advance\nofparbuilders\plusone
- \ctxlua{parbuilders.register("#1",\number\nofparbuilders)}%
+ \ctxlua{builders.paragraphs.constructors.register("#1",\number\nofparbuilders)}%
\setxvalue{\??ng:#1}{\attribute\parbuilderattribute\nofparbuilders}}
\unexpanded\def\startparbuilder[#1]%
@@ -56,7 +56,7 @@
\checkparbuilders}
\def\setmainparbuilder[#1]%
- {\ctxlua{parbuilders.setmain("#1")}}
+ {\ctxlua{builders.paragraphs.constructors.set("#1")}}
% no high level interface, after all implementing a linebreaker is not something that
% the average user will do
@@ -65,8 +65,8 @@
\defineparbuilder[oneline] % just for testing
\defineparbuilder[basic] % just for testing
-\def\enableparbuilders {\ctxlua{parbuilders.enable ()}}
-\def\disableparbuilders{\ctxlua{parbuilders.disable()}}
+\def\enableparbuilders {\ctxlua{builders.paragraphs.constructors.enable ()}}
+\def\disableparbuilders{\ctxlua{builders.paragraphs.constructors.disable()}}
\def\checkparbuilders % can be more efficient as we don't want to do this to often
{\ifcase\attribute\parbuilderattribute
diff --git a/Master/texmf-dist/tex/context/base/node-pro.lua b/Master/texmf-dist/tex/context/base/node-pro.lua
index 4f5b3dcbe9c..2d04a4d7185 100644
--- a/Master/texmf-dist/tex/context/base/node-pro.lua
+++ b/Master/texmf-dist/tex/context/base/node-pro.lua
@@ -7,37 +7,41 @@ if not modules then modules = { } end modules ['node-pro'] = {
}
local utf = unicode.utf8
+local utfchar = utf.char
local format, concat = string.format, table.concat
local trace_callbacks = false trackers.register("nodes.callbacks", function(v) trace_callbacks = v end)
-local glyph = node.id('glyph')
+local report_nodes = logs.reporter("nodes","processors")
-local free_node = node.free
-local first_character = node.first_character
+local nodes, node = nodes, node
-nodes.processors = nodes.processors or { }
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
+local tasks = nodes.tasks
+
+local free_node = node.free
+local first_glyph = node.first_glyph or node.first_character
+
+nodes.processors = nodes.processors or { }
+local processors = nodes.processors
-- vbox: grouptype: vbox vtop output split_off split_keep | box_type: exactly|aditional
-- hbox: grouptype: hbox adjusted_hbox(=hbox_in_vmode) | box_type: exactly|aditional
-lists = lists or { }
-chars = chars or { }
-words = words or { } -- not used yet
-
-local actions = tasks.actions("processors",4)
+local actions = tasks.actions("processors")
local n = 0
-local function reconstruct(head)
- local t = { }
- local h = head
+local function reconstruct(head) -- we probably have a better one
+ local t, n, h = { }, 0, head
while h do
+ n = n + 1
local id = h.id
- if id == glyph then
- t[#t+1] = utf.char(h.char)
+ if id == glyph_code then -- todo: disc etc
+ t[n] = utfchar(h.char)
else
- t[#t+1] = "[]"
+ t[n] = "[]"
end
h = h.next
end
@@ -52,16 +56,18 @@ local function tracer(what,state,head,groupcode,before,after,show)
end
n = n + 1
if show then
- logs.report("nodes","%s %s: %s, group: %s, nodes: %s -> %s, string: %s",what,n,state,groupcode,before,after,reconstruct(head))
+ report_nodes("%s %s: %s, group: %s, nodes: %s -> %s, string: %s",what,n,state,groupcode,before,after,reconstruct(head))
else
- logs.report("nodes","%s %s: %s, group: %s, nodes: %s -> %s",what,n,state,groupcode,before,after)
+ report_nodes("%s %s: %s, group: %s, nodes: %s -> %s",what,n,state,groupcode,before,after)
end
end
-nodes.processors.enabled = true -- thsi will become a proper state (like trackers)
+processors.tracer = tracer
-function nodes.processors.pre_linebreak_filter(head,groupcode,size,packtype,direction)
- local first, found = first_character(head)
+processors.enabled = true -- this will become a proper state (like trackers)
+
+function processors.pre_linebreak_filter(head,groupcode,size,packtype,direction)
+ local first, found = first_glyph(head)
if found then
if trace_callbacks then
local before = nodes.count(head,true)
@@ -84,51 +90,66 @@ function nodes.processors.pre_linebreak_filter(head,groupcode,size,packtype,dire
return true
end
-function nodes.processors.hpack_filter(head,groupcode,size,packtype,direction)
- local first, found = first_character(head)
- if found then
- if trace_callbacks then
- local before = nodes.count(head,true)
- local head, done = actions(head,groupcode,size,packtype,direction)
- local after = nodes.count(head,true)
- if done then
- tracer("hpack","changed",head,groupcode,before,after,true)
+local enabled = true
+
+function processors.hpack_filter(head,groupcode,size,packtype,direction)
+ if enabled then
+ local first, found = first_glyph(head)
+ if found then
+ if trace_callbacks then
+ local before = nodes.count(head,true)
+ local head, done = actions(head,groupcode,size,packtype,direction)
+ local after = nodes.count(head,true)
+ if done then
+ tracer("hpack","changed",head,groupcode,before,after,true)
+ else
+ tracer("hpack","unchanged",head,groupcode,before,after,true)
+ end
+ return (done and head) or true
else
- tracer("hpack","unchanged",head,groupcode,before,after,true)
+ local head, done = actions(head,groupcode,size,packtype,direction)
+ return (done and head) or true
end
- return (done and head) or true
- else
- local head, done = actions(head,groupcode,size,packtype,direction)
- return (done and head) or true
+ elseif trace_callbacks then
+ local n = nodes.count(head,false)
+ tracer("hpack","no chars",head,groupcode,n,n)
end
- elseif trace_callbacks then
- local n = nodes.count(head,false)
- tracer("hpack","no chars",head,groupcode,n,n)
end
return true
end
-callbacks.register('pre_linebreak_filter', nodes.processors.pre_linebreak_filter,"all kind of horizontal manipulations (before par break)")
-callbacks.register('hpack_filter' , nodes.processors.hpack_filter,"all kind of horizontal manipulations")
+local hpack = node.hpack
+
+function nodes.fasthpack(...) -- todo: pass explicit arguments
+ enabled = false
+ local hp, b = hpack(...)
+ enabled = true
+ return hp, b
+end
-local actions = tasks.actions("finalizers",1) -- head, where
+callbacks.register('pre_linebreak_filter', processors.pre_linebreak_filter,"all kind of horizontal manipulations (before par break)")
+callbacks.register('hpack_filter' , processors.hpack_filter,"all kind of horizontal manipulations")
--- beware, these are packaged boxes so no first_character test
+local actions = tasks.actions("finalizers") -- head, where
+
+-- beware, these are packaged boxes so no first_glyph test
-- maybe some day a hash with valid groupcodes
--
-- beware, much can pass twice, for instance vadjust passes two times
+--
+-- something weird here .. group mvl when making a vbox
-function nodes.processors.post_linebreak_filter(head,groupcode)
---~ local first, found = first_character(head)
+function processors.post_linebreak_filter(head,groupcode)
+--~ local first, found = first_glyph(head)
--~ if found then
if trace_callbacks then
local before = nodes.count(head,true)
local head, done = actions(head,groupcode)
local after = nodes.count(head,true)
if done then
- tracer("finalizer","changed",head,groupcode,before,after,true)
+ tracer("post_linebreak","changed",head,groupcode,before,after,true)
else
- tracer("finalizer","unchanged",head,groupcode,before,after,true)
+ tracer("post_linebreak","unchanged",head,groupcode,before,after,true)
end
return (done and head) or true
else
@@ -137,12 +158,12 @@ function nodes.processors.post_linebreak_filter(head,groupcode)
end
--~ elseif trace_callbacks then
--~ local n = nodes.count(head,false)
---~ tracer("finalizer","no chars",head,groupcode,n,n)
+--~ tracer("post_linebreak","no chars",head,groupcode,n,n)
--~ end
--~ return true
end
-callbacks.register('post_linebreak_filter', nodes.processors.post_linebreak_filter,"all kind of horizontal manipulations (after par break)")
+callbacks.register('post_linebreak_filter', processors.post_linebreak_filter,"all kind of horizontal manipulations (after par break)")
statistics.register("h-node processing time", function()
return statistics.elapsedseconds(nodes,"including kernel") -- hm, ok here?
diff --git a/Master/texmf-dist/tex/context/base/node-ref.lua b/Master/texmf-dist/tex/context/base/node-ref.lua
index 7128b1a6d20..19d602ed673 100644
--- a/Master/texmf-dist/tex/context/base/node-ref.lua
+++ b/Master/texmf-dist/tex/context/base/node-ref.lua
@@ -14,10 +14,21 @@ if not modules then modules = { } end modules ['node-bck'] = {
-- helper, will end up in luatex
+-- is grouplevel still used?
+
+local allocate, mark = utilities.storage.allocate, utilities.storage.mark
+
local cleanupreferences, cleanupdestinations = false, true
-local nodeinjections = backends.nodeinjections
-local codeinjections = backends.codeinjections
+local attributes, nodes, node = attributes, nodes, node
+
+local nodeinjections = backends.nodeinjections
+local codeinjections = backends.codeinjections
+
+local transparencies = attributes.transparencies
+local colors = attributes.colors
+local references = structures.references
+local tasks = nodes.tasks
local hpack_list = node.hpack
local list_dimensions = node.dimensions
@@ -28,17 +39,37 @@ local trace_backend = false trackers.register("nodes.backend", functi
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 hlist = node.id("hlist")
-local vlist = node.id("vlist")
-local glue = node.id("glue")
-local whatsit = node.id("whatsit")
+local report_reference = logs.reporter("backend","references")
+local report_destination = logs.reporter("backend","destinations")
+local report_area = logs.reporter("backend","areas")
+
+local nodecodes = nodes.nodecodes
+local skipcodes = nodes.skipcodes
+local whatcodes = nodes.whatcodes
+local listcodes = nodes.listcodes
+
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local glue_code = nodecodes.glue
+local whatsit_code = nodecodes.whatsit
-local new_kern = nodes.kern
+local leftskip_code = skipcodes.leftskip
+local rightskip_code = skipcodes.rightskip
+local parfillskip_code = skipcodes.parfillskip
-local has_attribute = node.has_attribute
-local traverse = node.traverse
-local find_node_tail = node.tail or node.slide
-local tosequence = nodes.tosequence
+local localpar_code = whatcodes.localpar
+local dir_code = whatcodes.dir
+
+local line_code = listcodes.line
+
+local nodepool = nodes.pool
+
+local new_kern = nodepool.kern
+
+local has_attribute = node.has_attribute
+local traverse = node.traverse
+local find_node_tail = node.tail or node.slide
+local tosequence = nodes.tosequence
local function dimensions(parent,start,stop)
stop = stop and stop.next
@@ -78,14 +109,14 @@ local function inject_range(head,first,last,reference,make,stack,parent,pardir,t
if result and resolved then
if head == first then
if trace_backend then
- logs.report("backend","head: %04i %s %s %s => w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",tosequence(first,last,true),width,height,depth,resolved)
+ report_area("head: %04i %s %s %s => w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",tosequence(first,last,true),width,height,depth,resolved)
end
result.next = first
first.prev = result
return result, last
else
if trace_backend then
- logs.report("backend","middle: %04i %s %s => w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",tosequence(first,last,true),width,height,depth,resolved)
+ report_area("middle: %04i %s %s => w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",tosequence(first,last,true),width,height,depth,resolved)
end
local prev = first.prev
if prev then
@@ -111,20 +142,17 @@ local function inject_list(id,current,reference,make,stack,pardir,txtdir)
local width, height, depth, correction = current.width, current.height, current.depth, 0
local moveright = false
local first = current.list
- if id == hlist then
+ 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)
- --
- -- to be tested: 0=unknown, 1=linebreak, 2=hbox
---~ if id.subtype == 1 then
local sr = stack[reference]
if first then
if sr and sr[2] then
local last = find_node_tail(first)
- if last.id == glue and last.subtype == 9 then
+ if last.id == glue_code and last.subtype == rightskip_code then
local prev = last.prev
- moveright = first.id == glue and first.subtype == 8
- if prev and prev.id == glue and prev.subtype == 15 then
+ moveright = first.id == glue_code and first.subtype == leftskip_code
+ if prev and prev.id == glue_code and prev.subtype == parfillskip_code then
width = dimensions(current,first,prev.prev) -- maybe not current as we already take care of it
else
if moveright and first.writable then
@@ -138,10 +166,6 @@ local function inject_list(id,current,reference,make,stack,pardir,txtdir)
else
-- also weird
end
---~ else
---~ print("!!!!!!!!!!!!!!!!!")
- -- simple
---~ end
else
-- ok
end
@@ -156,7 +180,7 @@ local function inject_list(id,current,reference,make,stack,pardir,txtdir)
local result, resolved = make(width,height,depth,reference)
if result and resolved then
if trace_backend then
- logs.report("backend","box: %04i %s %s: w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",width,height,depth,resolved)
+ report_area("box: %04i %s %s: w=%s, h=%s, d=%s, c=%s",reference,pardir or "---",txtdir or "----",width,height,depth,resolved)
end
if not first then
current.list = result
@@ -186,15 +210,21 @@ local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,tx
while current do
local id = current.id
local r = has_attribute(current,attribute)
- if id == whatsit then
+ if id == whatsit_code then
local subtype = current.subtype
- if subtype == 6 then
+ if subtype == localpar_code then
pardir = current.dir
- elseif subtype == 7 then
+ elseif subtype == dir_code then
txtdir = current.dir
end
- elseif id == hlist or id == vlist then
- if not reference and r and (not skip or r > skip) then
+ elseif id == glue_code and current.subtype == leftskip_code then -- any glue at the left?
+ --
+ elseif id == hlist_code or id == vlist_code then
+-- somehow reference is true so teh following fails (second one not done) in
+-- test \goto{test}[page(2)] test \gotobox{test}[page(2)]
+-- so let's wait till this fails again
+-- if not reference and r and (not skip or r > skip) then -- > or ~=
+ if r and (not skip or r > skip) then -- > or ~=
inject_list(id,current,r,make,stack,pardir,txtdir)
end
if r then
@@ -214,8 +244,8 @@ local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,tx
reference, first, last, firstdir = r, current, current, txtdir
elseif r == reference then
last = current
- elseif (done[reference] or 0) == 0 then
- if not skip or r > skip then
+ elseif (done[reference] or 0) == 0 then -- or id == glue_code and current.subtype == right_skip_code
+ if not skip or r > skip then -- maybe no > test
head, current = inject_range(head,first,last,reference,make,stack,parent,pardir,firstdir)
reference, first, last, firstdir = nil, nil, nil, nil
end
@@ -239,14 +269,14 @@ local function inject_area(head,attribute,make,stack,done,parent,pardir,txtdir)
while current do
local id = current.id
local r = has_attribute(current,attribute)
- if id == whatsit then
+ if id == whatsit_code then
local subtype = current.subtype
- if subtype == 6 then
+ if subtype == localpar_code then
pardir = current.dir
- elseif subtype == 7 then
+ elseif subtype == dir_code then
txtdir = current.dir
end
- elseif id == hlist or id == vlist then
+ elseif id == hlist_code or id == vlist_code then
if r and not done[r] then
done[r] = true
inject_list(id,current,r,make,stack,pardir,txtdir)
@@ -264,8 +294,12 @@ end
-- tracing
-local new_rule = nodes.rule
-local new_kern = nodes.kern
+
+local nodepool = nodes.pool
+
+local new_rule = nodepool.rule
+local new_kern = nodepool.kern
+
local set_attribute = node.set_attribute
local register_color = colors.register
@@ -293,6 +327,15 @@ local function colorize(width,height,depth,n)
end
u_colors[n] = u_color
end
+ if width == 0 then
+ report_area("reference %s has no horizontal dimensions: width=%s, height=%s, depth=%s",reference,width,height,depth)
+ width = 65536
+ end
+ if height + depth <= 0 then
+ report_area("reference %s has no vertical dimensions: width=%s, height=%s, depth=%s",reference,width,height,depth)
+ height = 65536/2
+ depth = height
+ end
local rule = new_rule(width,height,depth)
set_attribute(rule,a_colormodel,1) -- gray color model
set_attribute(rule,a_color,u_color)
@@ -308,35 +351,51 @@ local function colorize(width,height,depth,n)
end
end
-local new_kern = nodes.kern
+local nodepool = nodes.pool
+
+local new_kern = nodepool.kern
+
local texattribute = tex.attribute
local texcount = tex.count
-- references:
+local stack = { }
+local done = { }
+local attribute = attributes.private('reference')
+local nofreferences = 0
+local topofstack = 0
+
nodes.references = {
- attribute = attributes.private('reference'),
- stack = { },
- done = { },
+ attribute = attribute,
+ stack = stack,
+ done = done,
}
-local stack, done, attribute = nodes.references.stack, nodes.references.done, nodes.references.attribute
-
-local nofreferences, topofstack = 0, 0
+-- todo: get rid of n (n is just a number, can be used for tracing, obsolete)
-local function setreference(n,h,d,r) -- n is just a number, can be used for tracing
+local function setreference(n,h,d,r)
topofstack = topofstack + 1
- stack[topofstack] = { n, h, d, codeinjections.prerollreference(r) } -- the preroll permits us to determine samepage (but delayed also has some advantages)
---~ texattribute[attribute] = topofstack -- todo -> at tex end
+ -- the preroll permits us to determine samepage (but delayed also has some advantages)
+ -- so some part of the backend work is already done here
+--~ stack[topofstack] = { n, h, d, codeinjections.prerollreference(r) }
+ stack[topofstack] = { r, h, d, codeinjections.prerollreference(r) }
+ -- texattribute[attribute] = topofstack -- todo -> at tex end
texcount.lastreferenceattribute = topofstack
end
-nodes.setreference = setreference
+function references.get(n) -- not public so functionality can change
+ local sn = stack[n]
+ return sn and sn[1]
+end
local function makereference(width,height,depth,reference)
local sr = stack[reference]
if sr then
- local resolved, ht, dp, set = sr[1], sr[2], sr[3], sr[4]
+ if trace_references then
+ report_reference("resolving attribute %s",reference)
+ end
+ local resolved, ht, dp, set, n = sr[1], sr[2], sr[3], sr[4], sr[5]
if ht then
if height < ht then height = ht end
if depth < dp then depth = dp end
@@ -347,7 +406,7 @@ local function makereference(width,height,depth,reference)
local result, current
if trace_references then
local step = 65536
- result = hpack_list(colorize(width,height-step,depth-step,2)) -- step subtracted so that we can see seperate links
+ result = hpack_list(colorize(width,height-step,depth-step,2,reference)) -- step subtracted so that we can see seperate links
result.width = 0
current = result
end
@@ -356,19 +415,20 @@ local function makereference(width,height,depth,reference)
else
result = annot
end
+ references.registerpage(n)
result = hpack_list(result,0)
result.width, result.height, result.depth = 0, 0, 0
if cleanupreferences then stack[reference] = nil end
return result, resolved
- else
- logs.report("backends","unable to resolve reference annotation %s",reference)
+ elseif trace_references then
+ report_reference("unable to resolve annotation %s",reference)
end
- else
- logs.report("backends","unable to resolve reference attribute %s",reference)
+ elseif trace_references then
+ report_reference("unable to resolve attribute %s",reference)
end
end
-function nodes.add_references(head)
+function nodes.references.handler(head)
if topofstack > 0 then
return inject_areas(head,attribute,makereference,stack,done)
else
@@ -376,29 +436,32 @@ function nodes.add_references(head)
end
end
--- destinations (we can clean up once set!)
+-- destinations (we can clean up once set, unless tagging!)
+
+local stack = { }
+local done = { }
+local attribute = attributes.private('destination')
+local nofdestinations = 0
+local topofstack = 0
nodes.destinations = {
- attribute = attributes.private('destination'),
- stack = { },
- done = { },
+ attribute = attribute,
+ stack = stack,
+ done = done,
}
-local stack, done, attribute = nodes.destinations.stack, nodes.destinations.done, nodes.destinations.attribute
-
-local nofdestinations, topofstack = 0, 0
-
local function setdestination(n,h,d,name,view) -- n = grouplevel, name == table
topofstack = topofstack + 1
stack[topofstack] = { n, h, d, name, view }
return topofstack
end
-nodes.setdestination = setdestination
-
local function makedestination(width,height,depth,reference)
local sr = stack[reference]
if sr then
+ if trace_destinations then
+ report_destination("resolving attribute %s",reference)
+ end
local resolved, ht, dp, name, view = sr[1], sr[2], sr[3], sr[4], sr[5]
if ht then
if height < ht then height = ht end
@@ -412,7 +475,7 @@ local function makedestination(width,height,depth,reference)
width, height, depth = 5*step, 5*step, 0
end
for n=1,#name do
- local rule = hpack_list(colorize(width,height,depth,3))
+ local rule = hpack_list(colorize(width,height,depth,3,reference))
rule.width = 0
if not result then
result, current = rule, rule
@@ -435,16 +498,19 @@ local function makedestination(width,height,depth,reference)
current = annot
end
end
- result = hpack_list(result,0)
- result.width, result.height, result.depth = 0, 0, 0
+ if result then
+ -- some internal error
+ result = hpack_list(result,0)
+ result.width, result.height, result.depth = 0, 0, 0
+ end
if cleanupdestinations then stack[reference] = nil end
return result, resolved
- else
- logs.report("backends","unable to resolve destination attribute %s",reference)
+ elseif trace_destinations then
+ report_destination("unable to resolve attribute %s",reference)
end
end
-function nodes.add_destinations(head)
+function nodes.destinations.handler(head)
if topofstack > 0 then
return inject_area(head,attribute,makedestination,stack,done) -- singular
else
@@ -454,12 +520,12 @@ end
-- will move
-function jobreferences.mark(reference,h,d,view)
+function references.mark(reference,h,d,view)
return setdestination(tex.currentgrouplevel,h,d,reference,view)
end
-function jobreferences.inject(prefix,reference,h,d,highlight,newwindow,layer) -- todo: use currentreference is possible
- local set, bug = jobreferences.identify(prefix,reference)
+function references.inject(prefix,reference,h,d,highlight,newwindow,layer) -- todo: use currentreference is possible
+ 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
@@ -469,8 +535,8 @@ function jobreferences.inject(prefix,reference,h,d,highlight,newwindow,layer) --
end
end
-function jobreferences.injectcurrentset(h,d) -- used inside doifelse
- local currentset = jobreferences.currentset
+function references.injectcurrentset(h,d) -- used inside doifelse
+ local currentset = references.currentset
if currentset then
setreference(tex.currentgrouplevel,h,d,currentset) -- sets attribute / todo: for set[*].error
end
@@ -480,43 +546,16 @@ end
local function checkboth(open,close)
if open and open ~= "" then
- local set, bug = jobreferences.identify("",open)
+ local set, bug = references.identify("",open)
open = not bug and #set > 0 and set
end
if close and close ~= "" then
- local set, bug = jobreferences.identify("",close)
+ local set, bug = references.identify("",close)
close = not bug and #set > 0 and set
end
return open, close
end
--- expansion is temp hack
-
-local opendocument, closedocument, openpage, closepage
-
-local function check(what)
- if what and what ~= "" then
- local set, bug = jobreferences.identify("",what)
- return not bug and #set > 0 and set
- end
-end
-
-function jobreferences.checkopendocumentactions (open) opendocument = check(open) end
-function jobreferences.checkclosedocumentactions(close) closedocument = check(close) end
-function jobreferences.checkopenpageactions (open) openpage = check(open) end
-function jobreferences.checkclosepageactions (close) closepage = check(close) end
-
-function jobreferences.flushdocumentactions()
- if opendocument or closedocument then
- backends.codeinjections.flushdocumentactions(opendocument,closedocument) -- backend
- end
-end
-function jobreferences.flushpageactions()
- if openpage or closepage then
- backends.codeinjections.flushpageactions(openpage,closepage) -- backend
- end
-end
-
-- end temp hack
statistics.register("interactive elements", function()
@@ -527,7 +566,7 @@ statistics.register("interactive elements", function()
end
end)
-function jobreferences.enable_interaction()
- tasks.enableaction("shipouts","nodes.add_references")
- tasks.enableaction("shipouts","nodes.add_destinations")
+function references.enableinteraction()
+ tasks.enableaction("shipouts","nodes.references.handler")
+ tasks.enableaction("shipouts","nodes.destinations.handler")
end
diff --git a/Master/texmf-dist/tex/context/base/node-res.lua b/Master/texmf-dist/tex/context/base/node-res.lua
index a8ea8745a72..7f737ea7040 100644
--- a/Master/texmf-dist/tex/context/base/node-res.lua
+++ b/Master/texmf-dist/tex/context/base/node-res.lua
@@ -7,38 +7,45 @@ if not modules then modules = { } end modules ['node-res'] = {
}
local gmatch, format = string.gmatch, string.format
-local copy_node, free_node, free_list, new_node, node_type, node_id = node.copy, node.free, node.flush_list, node.new, node.type, node.id
local tonumber, round = tonumber, math.round
-local glyph_node = node_id("glyph")
-
--[[ldx--
<p>The next function is not that much needed but in <l n='context'/> we use
for debugging <l n='luatex'/> node management.</p>
--ldx]]--
-nodes = nodes or { }
+local report_nodes = logs.reporter("nodes","housekeeping")
-nodes.whatsits = { } -- table.swapped(node.whatsits())
+local nodes, node = nodes, node
-local reserved = { }
-local whatsits = nodes.whatsits
+local copy_node = node.copy
+local free_node = node.free
+local free_list = node.flush_list
+local new_node = node.new
-for k, v in next, node.whatsits() do
- whatsits[k], whatsits[v] = v, k -- two way
-end
+nodes.pool = nodes.pool or { }
+local pool = nodes.pool
+
+local whatsitcodes = nodes.whatsitcodes
+local skipcodes = nodes.skipcodes
+local nodecodes = nodes.nodecodes
+
+local glyph_code = nodecodes.glyph
+
+local reserved, nofreserved = { }, 0
local function register_node(n)
- reserved[#reserved+1] = n
+ nofreserved = nofreserved + 1
+ reserved[nofreserved] = n
return n
end
-nodes.register = register_node
+pool.register = register_node
-function nodes.cleanup_reserved(nofboxes) -- todo
+function pool.cleanup(nofboxes) -- todo
nodes.tracers.steppers.reset() -- todo: make a registration subsystem
- local nr, nl = #reserved, 0
- for i=1,nr do
+ local nl, nr = 0, nofreserved
+ for i=1,nofreserved do
local ri = reserved[i]
-- if not (ri.id == glue_spec and not ri.is_writable) then
free_node(reserved[i])
@@ -55,10 +62,11 @@ function nodes.cleanup_reserved(nofboxes) -- todo
end
end
reserved = { }
+ nofreserved = 0
return nr, nl, nofboxes -- can be nil
end
-function nodes.usage()
+function pool.usage()
local t = { }
for n, tag in gmatch(status.node_mem_usage,"(%d+) ([a-z_]+)") do
t[tag] = n
@@ -72,22 +80,23 @@ local penalty = register_node(new_node("penalty"))
local glue = register_node(new_node("glue")) -- glue.spec = nil
local glue_spec = register_node(new_node("glue_spec"))
local glyph = register_node(new_node("glyph",0))
-local textdir = register_node(new_node("whatsit",whatsits.dir)) -- 7 (6 is local par node)
+local textdir = register_node(new_node("whatsit",whatsitcodes.dir))
local rule = register_node(new_node("rule"))
-local latelua = register_node(new_node("whatsit",whatsits.late_lua)) -- 35
-local user_n = register_node(new_node("whatsit",whatsits.user_defined)) user_n.type = 100 -- 44
-local user_l = register_node(new_node("whatsit",whatsits.user_defined)) user_l.type = 110 -- 44
-local user_s = register_node(new_node("whatsit",whatsits.user_defined)) user_s.type = 115 -- 44
-local user_t = register_node(new_node("whatsit",whatsits.user_defined)) user_t.type = 116 -- 44
+local latelua = register_node(new_node("whatsit",whatsitcodes.latelua))
+local user_n = register_node(new_node("whatsit",whatsitcodes.userdefined)) user_n.type = 100 -- 44
+local user_l = register_node(new_node("whatsit",whatsitcodes.userdefined)) user_l.type = 110 -- 44
+local user_s = register_node(new_node("whatsit",whatsitcodes.userdefined)) user_s.type = 115 -- 44
+local user_t = register_node(new_node("whatsit",whatsitcodes.userdefined)) user_t.type = 116 -- 44
local left_margin_kern = register_node(new_node("margin_kern",0))
local right_margin_kern = register_node(new_node("margin_kern",1))
-local lineskip = register_node(new_node("glue",1))
-local baselineskip = register_node(new_node("glue",2))
-local leftskip = register_node(new_node("glue",8))
-local rightskip = register_node(new_node("glue",9))
+local lineskip = register_node(new_node("glue",skipcodes.lineskip))
+local baselineskip = register_node(new_node("glue",skipcodes.baselineskip))
+local leftskip = register_node(new_node("glue",skipcodes.leftskip))
+local rightskip = register_node(new_node("glue",skipcodes.rightskip))
local temp = register_node(new_node("temp",0))
+local noad = register_node(new_node("noad"))
-function nodes.zeroglue(n)
+function pool.zeroglue(n)
local s = n.spec
return not writable or (
s.width == 0
@@ -98,38 +107,46 @@ function nodes.zeroglue(n)
)
end
-function nodes.glyph(fnt,chr)
+function pool.glyph(fnt,chr)
local n = copy_node(glyph)
if fnt then n.font = fnt end
if chr then n.char = chr end
return n
end
-function nodes.penalty(p)
+function pool.penalty(p)
local n = copy_node(penalty)
n.penalty = p
return n
end
-function nodes.kern(k)
+function pool.kern(k)
local n = copy_node(kern)
n.kern = k
return n
end
-function nodes.glue_spec(width,stretch,shrink)
+function pool.gluespec(width,stretch,shrink,stretch_order,shrink_order)
local s = copy_node(glue_spec)
- s.width, s.stretch, s.shrink = width, stretch, shrink
+ if width then s.width = width end
+ if stretch then s.stretch = stretch end
+ if shrink then s.shrink = shrink end
+ if stretch_order then s.stretch_order = stretch_order end
+ if shrink_order then s.shrink_order = shrink_order end
return s
end
-local function someskip(skip,width,stretch,shrink)
+local function someskip(skip,width,stretch,shrink,stretch_order,shrink_order)
local n = copy_node(skip)
if not width then
-- no spec
- elseif tonumber(width) then
+ elseif width == false or tonumber(width) then
local s = copy_node(glue_spec)
- s.width, s.stretch, s.shrink = width, stretch, shrink
+ if width then s.width = width end
+ if stretch then s.stretch = stretch end
+ if shrink then s.shrink = shrink end
+ if stretch_order then s.stretch_order = stretch_order end
+ if shrink_order then s.shrink_order = shrink_order end
n.spec = s
else
-- shared
@@ -138,33 +155,66 @@ local function someskip(skip,width,stretch,shrink)
return n
end
-function nodes.glue(width,stretch,shrink)
- return someskip(glue,width,stretch,shrink)
+function pool.stretch(a,b)
+ local n = copy_node(glue)
+ local s = copy_node(glue_spec)
+ if b then
+ s.stretch = a
+ s.stretch_order = b
+ else
+ s.stretch = 1
+ s.stretch_order = a or 1
+ end
+ n.spec = s
+ return n
end
-function nodes.leftskip(width,stretch,shrink)
- return someskip(leftskip,width,stretch,shrink)
+
+function pool.shrink(a,b)
+ local n = copy_node(glue)
+ local s = copy_node(glue_spec)
+ if b then
+ s.shrink = a
+ s.shrink_order = b
+ else
+ s.shrink = 1
+ s.shrink_order = a or 1
+ end
+ n.spec = s
+ return n
end
-function nodes.rightskip(width,stretch,shrink)
- return someskip(rightskip,width,stretch,shrink)
+
+
+function pool.glue(width,stretch,shrink,stretch_order,shrink_order)
+ return someskip(glue,width,stretch,shrink,stretch_order,shrink_order)
+end
+
+function pool.leftskip(width,stretch,shrink,stretch_order,shrink_order)
+ return someskip(leftskip,width,stretch,shrink,stretch_order,shrink_order)
end
-function nodes.lineskip(width,stretch,shrink)
- return someskip(lineskip,width,stretch,shrink)
+
+function pool.rightskip(width,stretch,shrink,stretch_order,shrink_order)
+ return someskip(rightskip,width,stretch,shrink,stretch_order,shrink_order)
+end
+
+function pool.lineskip(width,stretch,shrink,stretch_order,shrink_order)
+ return someskip(lineskip,width,stretch,shrink,stretch_order,shrink_order)
end
-function nodes.baselineskip(width,stretch,shrink)
+
+function pool.baselineskip(width,stretch,shrink)
return someskip(baselineskip,width,stretch,shrink)
end
-function nodes.disc()
+function pool.disc()
return copy_node(disc)
end
-function nodes.textdir(dir)
+function pool.textdir(dir)
local t = copy_node(textdir)
t.dir = dir
return t
end
-function nodes.rule(width,height,depth,dir)
+function pool.rule(width,height,depth,dir)
local n = copy_node(rule)
if width then n.width = width end
if height then n.height = height end
@@ -173,18 +223,26 @@ function nodes.rule(width,height,depth,dir)
return n
end
-function nodes.latelua(code)
- local n = copy_node(latelua)
- n.data = code
- return n
+if node.has_field(latelua,'string') then
+ function pool.latelua(code)
+ local n = copy_node(latelua)
+ n.string = code
+ return n
+ end
+else
+ function pool.latelua(code)
+ local n = copy_node(latelua)
+ n.data = code
+ return n
+ end
end
-function nodes.leftmarginkern(glyph,width)
+function pool.leftmarginkern(glyph,width)
local n = copy_node(left_margin_kern)
if not glyph then
- logs.fatal("nodes","invalid pointer to left margin glyph node")
- elseif glyph.id ~= glyph_node then
- logs.fatal("nodes","invalid node type %s for left margin glyph node",node_type(glyph))
+ report_nodes("invalid pointer to left margin glyph node")
+ elseif glyph.id ~= glyph_code then
+ report_nodes("invalid node type %s for left margin glyph node",nodecodes[glyph])
else
n.glyph = glyph
end
@@ -194,12 +252,12 @@ function nodes.leftmarginkern(glyph,width)
return n
end
-function nodes.rightmarginkern(glyph,width)
+function pool.rightmarginkern(glyph,width)
local n = copy_node(right_margin_kern)
if not glyph then
- logs.fatal("nodes","invalid pointer to right margin glyph node")
- elseif glyph.id ~= glyph_node then
- logs.fatal("nodes","invalid node type %s for right margin glyph node",node_type(p))
+ report_nodes("invalid pointer to right margin glyph node")
+ elseif glyph.id ~= glyph_code then
+ report_nodes("invalid node type %s for right margin glyph node",nodecodes[p])
else
n.glyph = glyph
end
@@ -209,9 +267,14 @@ function nodes.rightmarginkern(glyph,width)
return n
end
-function nodes.temp()
+function pool.temp()
return copy_node(temp)
end
+
+function pool.noad()
+ return copy_node(noad)
+end
+
--[[
<p>At some point we ran into a problem that the glue specification
of the zeropoint dimension was overwritten when adapting a glue spec
@@ -225,78 +288,87 @@ and hide it for the user. And yes, LuaTeX now gives a warning as
well.</p>
]]--
-if tex.luatexversion > 51 then
-
- function nodes.writable_spec(n)
- local spec = n.spec
- if not spec then
- spec = copy_node(glue_spec)
- n.spec = spec
- elseif not spec.writable then
- spec = copy_node(spec)
- n.spec = spec
- end
- return spec
+function nodes.writable_spec(n) -- not pool
+ local spec = n.spec
+ if not spec then
+ spec = copy_node(glue_spec)
+ n.spec = spec
+ elseif not spec.writable then
+ spec = copy_node(spec)
+ n.spec = spec
end
+ return spec
+end
-else
+-- local num = userids["my id"]
+-- local str = userids[num]
+
+local userids = utilities.storage.allocate() pool.userids = userids
+local lastid = 0
- function nodes.writable_spec(n)
- local spec = n.spec
- if not spec then
- spec = copy_node(glue_spec)
+setmetatable(userids, {
+ __index = function(t,k)
+ if type(k) == "string" then
+ lastid = lastid + 1
+ rawset(userids,lastid,k)
+ rawset(userids,k,lastid)
+ return lastid
else
- spec = copy_node(spec)
+ rawset(userids,k,k)
+ return k
end
- n.spec = spec
- return spec
+ end,
+ __call = function(t,k)
+ return t[k]
end
-
-end
-
-local cache = { }
-
-function nodes.usernumber(num)
- local n = cache[num]
- if n then
- return copy_node(n)
- else
- local n = copy_node(user_n)
- if num then n.value = num end
- return n
+} )
+
+function pool.usernumber(id,num)
+ local n = copy_node(user_n)
+ if num then
+ n.user_id, n.value = id, num
+ elseif id then
+ n.value = id
end
+ return n
end
-function nodes.userlist(list)
+function pool.userlist(id,list)
local n = copy_node(user_l)
- if list then n.value = list end
+ if list then
+ n.user_id, n.value =id, list
+ else
+ n.value = id
+ end
return n
end
-local cache = { } -- we could use the same cache
-
-function nodes.userstring(str)
- local n = cache[str]
- if n then
- return copy_node(n)
+function pool.userstring(id,str)
+ local n = copy_node(user_s)
+ if str then
+ n.user_id, n.value =id, str
else
- local n = copy_node(user_s)
- n.type = 115
- if str then n.value = str end
- return n
+ n.value = id
end
+ return n
end
-function nodes.usertokens(tokens)
+function pool.usertokens(id,tokens)
local n = copy_node(user_t)
- if tokens then n.value = tokens end
+ if tokens then
+ n.user_id, n.value =id, tokens
+ else
+ n.value = id
+ end
return n
end
statistics.register("cleaned up reserved nodes", function()
- return format("%s nodes, %s lists of %s", nodes.cleanup_reserved(tex.count["lastallocatedbox"]))
+ return format("%s nodes, %s lists of %s", pool.cleanup(tex.count["lastallocatedbox"]))
end) -- \topofboxstack
statistics.register("node memory usage", function() -- comes after cleanup !
return status.node_mem_usage
end)
+
+lua.registerfinalizer(pool.cleanup, "cleanup reserved nodes")
diff --git a/Master/texmf-dist/tex/context/base/node-rul.lua b/Master/texmf-dist/tex/context/base/node-rul.lua
index 9dd89bcdae3..4cbd1ad0c5f 100644
--- a/Master/texmf-dist/tex/context/base/node-rul.lua
+++ b/Master/texmf-dist/tex/context/base/node-rul.lua
@@ -8,73 +8,115 @@ if not modules then modules = { } end modules ['node-rul'] = {
-- this will go to an auxiliary module
-- beware: rules now have a dir field
+--
+-- todo: make robust for layers ... order matters
+
+local attributes, nodes, node = attributes, nodes, node
+
+local nodecodes = nodes.nodecodes
+local tasks = nodes.tasks
-local glyph = node.id("glyph")
-local disc = node.id("disc")
-local rule = node.id("rule")
+local glyph_code = nodecodes.glyph
+local disc_code = nodecodes.disc
+local rule_code = nodecodes.rule
-function nodes.strip_range(first,last) -- todo: dir
+function nodes.striprange(first,last) -- todo: dir
if first and last then -- just to be sure
- local current = first
- while current and current ~= last do
- local id = current.id
- if id == glyph or id == disc then
- --~ if id == glyph or id == rule or id == disc then
- first = current
+ if first == last then
+ return first, last
+ end
+ while first and first ~= last do
+ local id = first.id
+ if id == glyph_code or id == disc_code then -- or id == rule_code
break
else
- current = current.next
+ first = first.next
end
end
- local current = last
- while current and current ~= first do
- local id = current.id
- --~ if id == glyph or id == rule or id == disc then
- if id == glyph or id == disc then
- last = current
+ if not first then
+ return nil, nil
+ elseif first == last then
+ return first, last
+ end
+ while last and last ~= first do
+ local id = last.id
+ if id == glyph_code or id == disc_code then -- or id == rule_code
break
else
- current = current.prev
+local prev = last.prev -- luatex < 0.70 has italic correction kern not prev'd
+if prev then
+ last = last.prev
+else
+ break
+end
end
end
+ if not last then
+ return nil, nil
+ end
end
return first, last
end
-- todo: order and maybe other dimensions
-local trace_ruled = false trackers.register("nodes.ruled", function(v) trace_ruled = v end)
-
local floor = math.floor
-local n_tostring, n_tosequence = nodes.ids_tostring, nodes.tosequence
-
-local a_ruled = attributes.private('ruled')
-local a_color = attributes.private('color')
-local a_transparency = attributes.private('transparency')
-local a_colorspace = attributes.private('colormodel')
-
-local glyph = node.id("glyph")
-local disc = node.id("disc")
-local glue = node.id("glue")
-local penalty = node.id("penalty")
-local kern = node.id("kern")
-local hlist = node.id("hlist")
-local vlist = node.id("vlist")
-local rule = node.id("rule")
-local whatsit = node.id("whatsit")
-
-local new_rule = nodes.rule
-local new_kern = nodes.kern
-local new_glue = nodes.glue
-
-local insert_before, insert_after, strip_range = node.insert_before, node.insert_after, nodes.strip_range
-local list_dimensions, has_attribute, set_attribute = node.dimensions, node.has_attribute, node.set_attribute
-local hpack_nodes = node.hpack
-local dimenfactor = fonts.dimenfactor
-local texwrite = tex.write
-
-local fontdata = fonts.ids
-local variables = interfaces.variables
+
+local trace_ruled = false trackers.register("nodes.rules", function(v) trace_ruled = v end)
+
+local report_ruled = logs.reporter("nodes","rules")
+
+local n_tostring = nodes.idstostring
+local n_tosequence = nodes.tosequence
+
+local a_ruled = attributes.private('ruled')
+local a_color = attributes.private('color')
+local a_transparency = attributes.private('transparency')
+local a_colorspace = attributes.private('colormodel')
+
+local texwrite = tex.write
+
+local insert_before = node.insert_before
+local insert_after = node.insert_after
+local striprange = nodes.striprange
+local list_dimensions = node.dimensions
+local has_attribute = node.has_attribute
+local set_attribute = node.set_attribute
+
+local hpack_nodes = node.hpack
+
+local fontdata = fonts.hashes.identifiers
+local variables = interfaces.variables
+local dimenfactor = fonts.helpers.dimenfactor
+
+local nodecodes = nodes.nodecodes
+local skipcodes = nodes.skipcodes
+local whatcodes = nodes.whatcodes
+local kerncodes = nodes.kerncodes
+
+local glyph_code = nodecodes.glyph
+local disc_code = nodecodes.disc
+local glue_code = nodecodes.glue
+local penalty_code = nodecodes.penalty
+local kern_code = nodecodes.kern
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local rule_code = nodecodes.rule
+local whatsit_code = nodecodes.whatsit
+
+local userskip_code = skipcodes.userskip
+local spaceskip_code = skipcodes.spaceskip
+local xspaceskip_code = skipcodes.xspaceskip
+
+local dir_code = whatcodes.dir
+
+local kerning_code = kerncodes.kern
+
+local nodepool = nodes.pool
+
+local new_rule = nodepool.rule
+local new_kern = nodepool.kern
+local new_glue = nodepool.glue
-- we can use this one elsewhere too
--
@@ -86,15 +128,22 @@ local checkdir = true
-- we assume {glyphruns} and no funny extra kerning, ok, maybe we need
-- a dummy character as start and end; anyway we only collect glyphs
+--
+-- this one needs to take layers into account (i.e. we need a list of
+-- critical attributes)
-local function process_words(attribute,data,flush,head,parent) -- we have hlistdir and local dir
+-- omkeren class en level -> scheelt functie call in analyze
+
+-- todo: switching inside math
+
+local function processwords(attribute,data,flush,head,parent) -- we have hlistdir and local dir
local n = head
if n then
- local f, l, a, d, i, level
- local continue, done, strip = false, false, false
+ local f, l, a, d, i, class
+ local continue, done, strip, level = false, false, true, -1
while n do
local id = n.id
- if id == glyph or id == rule then
+ if id == glyph_code or id == rule_code then
local aa = has_attribute(n,attribute)
if aa then
if aa == a then
@@ -104,12 +153,18 @@ local function process_words(attribute,data,flush,head,parent) -- we have hlistd
l = n
else
-- possible extensions: when in same class then keep spanning
+ local newlevel, newclass = floor(aa/1000), aa%1000
+--~ strip = not continue or level == 1 -- 0
if f then
- head, done = flush(head,f,l,d,level,parent,strip), true
+ if class == newclass then -- and newlevel > level then
+ head, done = flush(head,f,l,d,level,parent,false), true
+ else
+ head, done = flush(head,f,l,d,level,parent,strip), true
+ end
end
f, l, a = n, n, aa
- level, i = floor(a/1000), a%1000
- d = data[i]
+ level, class = newlevel, newclass
+ d = data[class]
continue = d.continue == variables.yes
end
else
@@ -118,27 +173,37 @@ local function process_words(attribute,data,flush,head,parent) -- we have hlistd
end
f, l, a = nil, nil, nil
end
- elseif f and (id == disc or (id == kern and n.subtype == 0)) then
+ elseif f and (id == disc_code or (id == kern_code and n.subtype == kerning_code)) then
l = n
- elseif id == hlist or id == vlist then
+ elseif id == hlist_code or id == vlist_code then
if f then
head, done = flush(head,f,l,d,level,parent,strip), true
f, l, a = nil, nil, nil
end
local list = n.list
if list then
- n.list = process_words(attribute,data,flush,list,n)
+ n.list = processwords(attribute,data,flush,list,n)
end
- elseif checkdir and id == whatsit and n.subtype == 7 then -- only changes in dir, we assume proper boundaries
+ elseif checkdir and id == whatsit_code and n.subtype == dir_code then -- only changes in dir, we assume proper boundaries
if f and a then
l = n
end
elseif f then
if continue then
- if id == penalty or id == kern then
+ if id == penalty_code then
l = n
- elseif id == glue then
+ elseif id == kern_code then
l = n
+ elseif id == glue_code then
+ -- catch \underbar{a} \underbar{a} (subtype test is needed)
+ local subtype = n.subtype
+ if continue and has_attribute(n,attribute) and
+ (subtype == userskip_code or subtype == spaceskip_code or subskip == xspaceskip_code) then
+ l = n
+ else
+ head, done = flush(head,f,l,d,level,parent,strip), true
+ f, l, a = nil, nil, nil
+ end
end
else
head, done = flush(head,f,l,d,level,parent,strip), true
@@ -156,7 +221,7 @@ local function process_words(attribute,data,flush,head,parent) -- we have hlistd
end
end
-nodes.process_words = process_words
+nodes.processwords = processwords
--
@@ -172,16 +237,32 @@ function nodes.rules.define(settings)
texwrite(#data)
end
+local a_viewerlayer = attributes.private("viewerlayer")
+
local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but acceptable for this purpose
-- check for f and l
+ if f.id ~= glyph_code then
+ -- saveguard ... we need to deal with rules and so (math)
+ return head
+ end
local r, m
- if true then
- f, l = strip_range(f,l)
+ if strip then
+ if trace_ruled then
+ local before = n_tosequence(f,l,true)
+ f, l = striprange(f,l)
+ local after = n_tosequence(f,l,true)
+ report_ruled("range stripper: %s -> %s",before,after)
+ else
+ f, l = striprange(f,l)
+ end
+ end
+ if not f then
+ return head
end
local w = list_dimensions(parent.glue_set,parent.glue_sign,parent.glue_order,f,l.next)
local method, offset, continue, dy, rulethickness, unit, order, max, ma, ca, ta =
d.method, d.offset, d.continue, d.dy, d.rulethickness, d.unit, d.order, d.max, d.ma, d.ca, d.ta
- local e = dimenfactor(unit,fontdata[f.font])
+ local e = dimenfactor(unit,fontdata[f.font]) -- what if no glyph node
local colorspace = (ma > 0 and ma) or has_attribute(f,a_colorspace) or 1
local color = (ca > 0 and ca) or has_attribute(f,a_color)
local transparency = (ta > 0 and ta) or has_attribute(f,a_transparency)
@@ -200,6 +281,12 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a
local ht = (offset+(i-1)*dy+rulethickness)*e - m
local dp = -(offset+(i-1)*dy-rulethickness)*e + m
local r = new_rule(w,ht,dp)
+ local v = has_attribute(f,a_viewerlayer)
+ -- quick hack
+ if v then
+ set_attribute(r,a_viewerlayer,v)
+ end
+ --
if color then
set_attribute(r,a_colorspace,colorspace)
set_attribute(r,a_color,color)
@@ -213,11 +300,11 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a
insert_after(head,k,r)
l = r
else
- head, _ = insert_before(head,f,r)
+ head = insert_before(head,f,r)
insert_after(head,r,k)
end
if trace_ruled then
- logs.report("ruled", "level: %s, width: %i, height: %i, depth: %i, nodes: %s, text: %s",
+ report_ruled("level: %s, width: %i, height: %i, depth: %i, nodes: %s, text: %s",
level,w,ht,dp,n_tostring(f,l),n_tosequence(f,l,true))
-- level,r.width,r.height,r.depth,n_tostring(f,l),n_tosequence(f,l,true))
end
@@ -225,20 +312,22 @@ local function flush_ruled(head,f,l,d,level,parent,strip) -- not that fast but a
return head
end
-local process = nodes.process_words
+local process = nodes.processwords
-nodes.rules.process = function(head) return process(a_ruled,data,flush_ruled,head) end
+nodes.rules.handler = function(head) return process(a_ruled,data,flush_ruled,head) end
function nodes.rules.enable()
- tasks.enableaction("shipouts","nodes.rules.process")
+ tasks.enableaction("shipouts","nodes.rules.handler")
end
-- elsewhere:
--
--- tasks.appendaction ("shipouts", "normalizers", "nodes.rules.process")
--- tasks.disableaction("shipouts", "nodes.rules.process") -- only kick in when used
+-- tasks.appendaction ("shipouts", "normalizers", "nodes.rules.handler")
+-- tasks.disableaction("shipouts", "nodes.rules.handler") -- only kick in when used
+
+local trace_shifted = false trackers.register("nodes.shifting", function(v) trace_shifted = v end)
-local trace_shifted = false trackers.register("nodes.shifted", function(v) trace_shifted = v end)
+local report_shifted = logs.reporter("nodes","shifting")
local a_shifted = attributes.private('shifted')
@@ -256,7 +345,7 @@ end
local function flush_shifted(head,first,last,data,level,parent,strip) -- not that fast but acceptable for this purpose
if true then
- first, last = strip_range(first,last)
+ first, last = striprange(first,last)
end
local prev, next = first.prev, last.next
first.prev, last.next = nil, nil
@@ -274,15 +363,15 @@ local function flush_shifted(head,first,last,data,level,parent,strip) -- not tha
local raise = data.dy * dimenfactor(data.unit,fontdata[first.font])
list.shift, list.height, list.depth = raise, height, depth
if trace_shifted then
- logs.report("shifted", "width: %s, nodes: %s, text: %s",width,n_tostring(first,last),n_tosequence(first,last,true))
+ report_shifted("width: %s, nodes: %s, text: %s",width,n_tostring(first,last),n_tosequence(first,last,true))
end
return head
end
-local process = nodes.process_words
+local process = nodes.processwords
-nodes.shifts.process = function(head) return process(a_shifted,data,flush_shifted,head) end
+nodes.shifts.handler = function(head) return process(a_shifted,data,flush_shifted,head) end
function nodes.shifts.enable()
- tasks.enableaction("shipouts","nodes.shifts.process")
+ tasks.enableaction("shipouts","nodes.shifts.handler")
end
diff --git a/Master/texmf-dist/tex/context/base/node-rul.mkiv b/Master/texmf-dist/tex/context/base/node-rul.mkiv
index 1270eb81d7a..90bcd9e403f 100644
--- a/Master/texmf-dist/tex/context/base/node-rul.mkiv
+++ b/Master/texmf-dist/tex/context/base/node-rul.mkiv
@@ -55,6 +55,9 @@
%D
%D \showsetup{setupunderbar}
+%D todo: mkvi this file ... no redefine, just pass all parameters, too messy now
+%D (due to grouping) so better hash settings at the lua end
+
\unprotect
%definesystemattribute[ruled]
@@ -62,41 +65,39 @@
\registerctxluafile{node-rul}{1.001}
-\newtoks\checkalldefinedbars
+\installcommandhandler \??on {bar} \??on
-\def\barparameter #1{\csname\dobarparameter\currentbar#1\endcsname}
-\def\dobarparameter #1#2{\ifcsname\??on#1#2\endcsname\??on#1#2\else\expandafter\dobarparentparameter\csname\??on#1\s!parent\endcsname#2\fi}
-\def\dobarparentparameter#1#2{\ifx#1\relax\s!empty\else\dobarparameter#1#2\fi}
+\newtoks\checkalldefinedbars
-\unexpanded\def\definebar
- {\dotripleempty\dodefinebar}
+\let\setupbars\setupbar
-\def\dodefinebar[#1][#2][#3]%
- {\ifthirdargument
- \getparameters[\??on#1][\s!parent=#2,#3]%
+\appendtoks
+ \ifsecondargument
+ \dodefinebarindeed\currentbar
\else
- \getparameters[\??on#1][\s!parent=,#2]%
+ \the\checkalldefinedbars
\fi
- %
- %\setvalue{\??on:#1}{0}%
- %
- \ifcsname\??on:#1:c\endcsname
- \csname\??on:#1:c\endcsname\zerocount
+\to \everysetupbar
+
+\appendtoks
+ \ifcsname\??on:\currentbar:c\endcsname
+ \csname\??on:\currentbar:c\endcsname\zerocount
\else
- \expandafter\newcount\csname\??on:#1:c\endcsname
+ \expandafter\newcount\csname\??on:\currentbar:c\endcsname
\fi
- \normalexpanded{\checkalldefinedbars{\noexpand\doredefinebar{#1}\the\checkalldefinedbars}}%
- \dodefinebarindeed{#1}%
- \setuvalue{#1}{\doruled{#1}}}
+ \normalexpanded{\checkalldefinedbars{\doredefinebar{\currentbar}\the\checkalldefinedbars}}%
+ \dodefinebarindeed\currentbar
+ \setuevalue\currentbar{\doruled{\currentbar}}%
+\to \everydefinebar
-\def\dodefinebarindeed#1%
- {\bgroup
- \def\currentbar{#1}%
+\unexpanded\def\dodefinebarindeed#1%
+ {\begingroup
+ \edef\currentbar{#1}%
\doifsomethingelse{\barparameter\c!color}
{\donetrue\colored[\barparameter\c!color]}
{\donefalse}%
\normalexpanded
- {\egroup
+ {\endgroup
\scratchcounter\ctxlua{nodes.rules.define {
method = \barparameter\c!method,
offset = \barparameter\c!offset,
@@ -114,7 +115,7 @@
\let\doredefinebar\dodefinebarindeed
-\def\doruled#1%
+\unexpanded\def\doruled#1%
{\groupedcommand{\dodoruled{#1}}\relax}
\def\dodoruled
@@ -122,11 +123,13 @@
\glet\dodoruled\dodoruledindeed
\dodoruled}
-\def\dodoruledindeed#1%
- {\advance\csname\??on:#1:c\endcsname\plusone
+\def\dodoruledindeed#1% maybe reverse the 1000
+ {\advance\csname\??on:#1:c\endcsname\plusone % local ?
\scratchcounter\csname\??on:#1:c\endcsname
- \attribute\ruledattribute\numexpr1000*\scratchcounter
- +\csname\??on#1\ifcsname\??on#1:\number\scratchcounter\s!parent\endcsname:\number\scratchcounter\fi:a\endcsname}
+ \attribute\ruledattribute\numexpr
+ 1000*\scratchcounter
+ +\csname\??on#1\ifcsname\??on#1:\number\scratchcounter\s!parent\endcsname:\number\scratchcounter\fi:a\endcsname
+ \relax}
% ungrouped
@@ -149,18 +152,6 @@
{\csname\??on:s:\number\currentbarnesting\endcsname
\global\advance\currentbarnesting\minusone}
-\unexpanded\def\setupbars
- {\dodoubleempty\dosetupbars}
-
-\def\dosetupbars[#1][#2]% not that efficient
- {\ifsecondargument
- \getparameters[\??on#1][#2]%
- \dodefinebarindeed{#1}%
- \else
- \getparameters[\??on][#1]%
- \the\checkalldefinedbars
- \fi}
-
\setupbars
[\c!method=0, % new: 0=center nested, 1=stack nested
\c!continue=\v!no,
@@ -197,49 +188,36 @@
%D This will move: (a bit duplicated)
-\newtoks\checkalldefinedshifts
-
-\def\shiftparameter #1{\csname\doshiftparameter\currentshift#1\endcsname}
-\def\shiftparameterhash#1{\doshiftparameterhash{\??ra\currentshift}#1}
+\installcommandhandler \??ra {shift} \??ra
-\def\doshiftparameter #1#2{\ifcsname\??ra#1#2\endcsname\??ra#1#2\else\expandafter\doshiftparentparameter\csname\??ra#1\s!parent\endcsname#2\fi}
-\def\doshiftparameterhash#1#2{\ifcsname#1#2\endcsname#1\else\expandafter\doshiftparentparameterhash\csname#1\s!parent\endcsname#2\fi}
-
-\def\doshiftparentparameter #1#2{\ifx#1\relax\s!empty\else\doshiftparameter #1#2\fi}
-\def\doshiftparentparameterhash#1#2{\ifx#1\relax \else\doshiftparameterhash#1#2\fi}
-
-\def\dosetshiftattributes#1#2% style color
- {\edef\fontattributehash {\shiftparameterhash#1}%
- \edef\colorattributehash{\shiftparameterhash#2}%
- \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
- \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
+\newtoks\checkalldefinedshifts
-\unexpanded\def\defineshift
- {\dotripleempty\dodefineshift}
+\let\setupshifts\setupshift
-\def\dodefineshift[#1][#2][#3]%
- {\ifthirdargument
- \getparameters[\??ra#1][\s!parent=#2,#3]%
+\appendtoks
+ \ifsecondargument
+ \dodefineshiftindeed\currentshift
\else
- \getparameters[\??ra#1][\s!parent=,#2]%
+ \the\checkalldefinedshifts
\fi
- %
- %\setvalue{\??ra:#1}{0}%
- %
- \ifcsname\??ra:#1:c\endcsname
- \csname\??ra:#1:c\endcsname\zerocount
+\to \everysetupshift
+
+\appendtoks
+ \ifcsname\??ra:\currentshift:c\endcsname
+ \csname\??ra:\currentshift:c\endcsname\zerocount
\else
- \expandafter\newcount\csname\??ra:#1:c\endcsname
+ \expandafter\newcount\csname\??ra:\currentshift:c\endcsname
\fi
- \normalexpanded{\checkalldefinedshifts{\noexpand\doredefineshift{#1}\the\checkalldefinedshifts}}%
- \dodefineshiftindeed{#1}%
- \setuvalue{#1}{\doshifted{#1}}}
+ \normalexpanded{\checkalldefinedshifts{\doredefineshift{\currentshift}\the\checkalldefinedshifts}}%
+ \dodefineshiftindeed{\currentshift}%
+ \setuevalue\currentshift{\doshifted{\currentshift}}%
+\to \everydefineshift
-\def\dodefineshiftindeed#1%
- {\bgroup
- \def\currentshift{#1}%
+\unexpanded\def\dodefineshiftindeed#1%
+ {\begingroup
+ \edef\currentshift{#1}%
\normalexpanded
- {\egroup
+ {\endgroup
\scratchcounter\ctxlua{nodes.shifts.define {
method = \shiftparameter\c!method,
continue = "\shiftparameter\c!continue",
@@ -250,26 +228,17 @@
\let\doredefineshift\dodefineshiftindeed
-\def\doshifted#1%
- {\groupedcommand{\dodoshifted{#1}}\relax}
+% \unexpanded\def\doshifted#1%
+% {\groupedcommand{\dodoshifted{#1}}\relax}
\def\dodoshifted
{\ctxlua{nodes.shifts.enable()}%
\glet\dodoshifted\dodoshiftedindeed
\dodoshifted}
-% \def\dodoshiftedindeed#1%
-% {\def\currentshift{#1}%
-% \advance\csname\??ra:#1:c\endcsname\plusone
-% \scratchcounter\csname\??ra:#1:c\endcsname
-% \attribute\shiftedattribute\numexpr1000*\scratchcounter
-% +\csname\??ra#1\ifcsname\??ra#1:\number\scratchcounter\s!parent\endcsname:\number\scratchcounter\fi:a\endcsname
-% \setupalign[\shiftparameter\c!align]%
-% \dosetshiftattributes\c!style\c!color}
-
-\def\dostartisolation{\char0 }
-\def\dostopisolation {\char0 }
-\def\doisolator {\char0 }
+\def\dostartisolation{\signalcharacter}
+\def\dostopisolation {\signalcharacter}
+\def\doisolator {\signalcharacter}
\def\doisolatedgroupedalign#1#2%
{\groupedcommand
@@ -289,7 +258,7 @@
\dosetshiftattributes\c!style\c!color
\dosetupisolatedalign{\shiftparameter\c!align}}
-\def\doshifted#1%
+\unexpanded\def\doshifted#1%
{\doisolatedgroupedalign{\dodoshifted{#1}}{}}
\unexpanded\def\startshift[#1]%
@@ -299,18 +268,6 @@
\unexpanded\def\stopshift
{\endgroup}
-\unexpanded\def\setupshifts
- {\dodoubleempty\dosetupshifts}
-
-\def\dosetupshifts[#1][#2]% not that efficient
- {\ifsecondargument
- \getparameters[\??ra#1][#2]%
- \dodefineshiftindeed{#1}%
- \else
- \getparameters[\??ra][#1]%
- \the\checkalldefinedshifts
- \fi}
-
\setupshifts
[\c!method=0,
\c!continue=\v!no,
diff --git a/Master/texmf-dist/tex/context/base/node-seq.lua b/Master/texmf-dist/tex/context/base/node-seq.lua
deleted file mode 100644
index 3a2cf5b6ef0..00000000000
--- a/Master/texmf-dist/tex/context/base/node-seq.lua
+++ /dev/null
@@ -1,186 +0,0 @@
-if not modules then modules = { } end modules ['node-seq'] = {
- version = 1.001,
- comment = "companion to node-ini.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
---[[ldx--
-<p>Here we implement a mechanism for chaining the special functions
-that we use in <l n="context"> to deal with mode list processing. We
-assume that namespaces for the functions are used, but for speed we
-use locals to refer to them when compiling the chain.</p>
---ldx]]--
-
--- todo: delayed: i.e. we register them in the right order already but delay usage
-
-local format, gsub, concat, gmatch = string.format, string.gsub, table.concat, string.gmatch
-local type, loadstring = type, loadstring
-
-sequencer = sequencer or { }
-
-local function validaction(action)
- local g = _G
- for str in gmatch(action,"[^%.]+") do
- g = g[str]
- if not g then
- return false
- end
- end
- return true
-end
-
-function sequencer.reset()
- return {
- list = { },
- order = { },
- kind = { },
- askip = { },
- gskip = { },
- }
-end
-
-function sequencer.prependgroup(t,group,where)
- local list, order = t.list, t.order
- table.remove_value(order,group)
- table.insert_before_value(order,where,group)
- list[group] = { }
-end
-
-function sequencer.appendgroup(t,group,where)
- local list, order = t.list, t.order
- table.remove_value(order,group)
- table.insert_after_value(order,where,group)
- list[group] = { }
-end
-
-function sequencer.prependaction(t,group,action,where,kind,force)
- local g = t.list[group]
- if g and (force or validaction(action)) then
- table.remove_value(g,action)
- table.insert_before_value(g,where,action)
- t.kind[action] = kind
- end
-end
-
-function sequencer.appendaction(t,group,action,where,kind,force)
- local g = t.list[group]
- if g and (force or validaction(action)) then
- table.remove_value(g,action)
- table.insert_after_value(g,where,action)
- t.kind[action] = kind
- end
-end
-
-function sequencer.enableaction (t,action) t.askip[action] = false end
-function sequencer.disableaction(t,action) t.askip[action] = true end
-function sequencer.enablegroup (t,group) t.gskip[group] = false end
-function sequencer.disablegroup (t,group) t.gskip[group] = true end
-
-function sequencer.setkind(t,action,kind)
- t.kind[action] = kind
-end
-
-function sequencer.removeaction(t,group,action,force)
- local g = t.list[group]
- if g and (force or validaction(action)) then
- table.remove_value(g,action)
- end
-end
-
-function sequencer.compile(t,compiler,n)
- if type(t) == "string" then
- -- already compiled
- elseif compiler then
- t = compiler(t,n)
- else
- t = sequencer.tostring(t)
- end
- return loadstring(t)()
-end
-
-local function localize(str)
- return (gsub(str,"%.","_"))
-end
-
-local template = [[
-%s
-return function(...)
-%s
-end]]
-
-function sequencer.tostring(t)
- local list, order, kind, gskip, askip = t.list, t.order, t.kind, t.gskip, t.askip
- local vars, calls, args = { }, { }, nil
- for i=1,#order do
- local group = order[i]
- if not gskip[group] then
- local actions = list[group]
- for i=1,#actions do
- local action = actions[i]
- if not askip[action] then
- local localized = localize(action)
- vars [#vars +1] = format("local %s = %s", localized, action)
- calls[#calls+1] = format(" %s(...) -- %s %i", localized, group, i)
- end
- end
- end
- end
- return format(template,concat(vars,"\n"),concat(calls,"\n"))
-end
-
--- we used to deal with tail as well but now that the lists are always
--- double linked and the kernel function no longer expect tail as
--- argument we stick to head and done (done can probably also go
--- as luatex deals with return values efficiently now .. in the
--- past there was some copying involved, but no longer)
-
-local template = [[
-%s
-return function(head%s)
- local ok, done = false, false
-%s
- return head, done
-end]]
-
-function sequencer.nodeprocessor(t,n)
- local list, order, kind, gskip, askip = t.list, t.order, t.kind, t.gskip, t.askip
- local vars, calls, args = { }, { }, nil
- if n == 0 then
- args = ""
- elseif n == 1 then
- args = ",one"
- elseif n == 2 then
- args = ",one,two"
- elseif n == 3 then
- args = ",one,two,three"
- elseif n == 4 then
- args = ",one,two,three,four"
- elseif n == 5 then
- args = ",one,two,three,four,five"
- else
- args = ",..."
- end
- for i=1,#order do
- local group = order[i]
- if not gskip[group] then
- local actions = list[group]
- for i=1,#actions do
- local action = actions[i]
- if not askip[action] then
- local localized = localize(action)
- vars[#vars+1] = format("local %s = %s",localized,action)
- if kind[action] == "nohead" then
- calls[#calls+1] = format(" ok = %s(head%s) done = done or ok -- %s %i",localized,args,group,i)
- else
- calls[#calls+1] = format(" head, ok = %s(head%s) done = done or ok -- %s %i",localized,args,group,i)
- end
- end
- end
- end
- end
- local processor = format(template,concat(vars,"\n"),args,concat(calls,"\n"))
---~ print(processor)
- return processor
-end
diff --git a/Master/texmf-dist/tex/context/base/node-ser.lua b/Master/texmf-dist/tex/context/base/node-ser.lua
index e632e92da04..aa4615626e9 100644
--- a/Master/texmf-dist/tex/context/base/node-ser.lua
+++ b/Master/texmf-dist/tex/context/base/node-ser.lua
@@ -9,18 +9,21 @@ if not modules then modules = { } end modules ['node-ser'] = {
-- beware, some field names will change in a next releases
-- of luatex; this is pretty old code that needs an overhaul
-local type, format, concat = type, string.format, table.concat
+local type, format, concat, rep = type, string.format, table.concat, string.rep
-local ctxcatcodes = tex.ctxcatcodes
+local allocate = utilities.storage.allocate
-local hlist = node.id('hlist')
-local vlist = node.id('vlist')
+local nodes, node = nodes, node
local traverse = node.traverse
-local node_fields = node.fields
-local node_type = node.type
-local expand = table.tohash {
+local nodecodes = nodes.nodecodes
+local nodefields = nodes.fields
+
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+
+local expand = allocate ( table.tohash {
"list", -- list_ptr & ins_ptr & adjust_ptr
"pre", --
"post", --
@@ -35,25 +38,25 @@ local expand = table.tohash {
"leader", -- leader_ptr
"action", -- action_ptr
"value", -- user_defined nodes with subtype 'a' en 'n'
-}
+} )
-- page_insert: "height", "last_ins_ptr", "best_ins_ptr"
-- split_insert: "height", "last_ins_ptr", "best_ins_ptr", "broken_ptr", "broken_ins"
-local ignore = table.tohash {
+local ignore = allocate ( table.tohash {
"page_insert",
"split_insert",
"ref_count",
-}
+} )
-local dimension = table.tohash {
+local dimension = allocate ( table.tohash {
"width", "height", "depth", "shift",
"stretch", "shrink",
"xoffset", "yoffset",
"surround",
"kern",
"box_left_width", "box_right_width"
-}
+} )
-- flat: don't use next, but indexes
-- verbose: also add type
@@ -66,7 +69,7 @@ nodes.ignorablefields = ignore
-- not ok yet:
function nodes.astable(n,sparse) -- not yet ok
- local f, t = node_fields(n.id,n.subtype), { }
+ local f, t = nodefields(n), { }
for i=1,#f do
local v = f[i]
local d = n[v]
@@ -84,7 +87,7 @@ function nodes.astable(n,sparse) -- not yet ok
end
end
end
- t.type = node_type(n.id)
+ t.type = nodecodes[n.id]
return t
end
@@ -93,11 +96,11 @@ end
local function totable(n,flat,verbose)
-- todo: no local function
local function to_table(n,flat,verbose)
- local f = node_fields(n.id,n.subtype)
+ local f = nodefields(n)
local tt = { }
for k=1,#f do
local v = f[k]
- local nv = n[v]
+ local nv = v and n[v]
if nv then
if ignore[v] then
-- skip
@@ -115,15 +118,16 @@ local function totable(n,flat,verbose)
end
end
if verbose then
- tt.type = node_type(tt.id)
+ tt.type = nodecodes[tt.id]
end
return tt
end
if n then
if flat then
- local t = { }
+ local t, tn = { }, 0
while n do
- t[#t+1] = to_table(n,flat,verbise)
+ tn = tn + 1
+ t[tn] = to_table(n,flat,verbose)
n = n.next
end
return t
@@ -147,6 +151,8 @@ end
-- not ok yet; this will become a module
+-- todo: adapt to nodecodes etc
+
local function serialize(root,name,handle,depth,m)
handle = handle or print
if depth then
@@ -170,7 +176,7 @@ local function serialize(root,name,handle,depth,m)
if root then
local fld
if root.id then
- fld = node_fields(root.id,root.subtype) -- we can cache these (todo)
+ fld = nodefields(root) -- we can cache these (todo)
else
fld = table.sortedkeys(root)
end
@@ -215,9 +221,10 @@ local function serialize(root,name,handle,depth,m)
end
function nodes.serialize(root,name)
- local t = { }
+ local t, n = { }, 0
local function flush(s)
- t[#t+1] = s
+ n = n + 1
+ t[n] = s
end
serialize(root, name, flush, nil, 0)
return concat(t,"\n")
@@ -227,50 +234,46 @@ function nodes.serializebox(n,flat,verbose,name)
return nodes.serialize(nodes.totable(tex.box[n],flat,verbose),name)
end
-function nodes.visualizebox(...)
- tex.print(ctxcatcodes,"\\starttyping")
- tex.print(nodes.serializebox(...))
- tex.print("\\stoptyping")
+-- keep:
+--
+-- function nodes.visualizebox(...)
+-- tex.print(ctxcatcodes,"\\starttyping")
+-- tex.print(nodes.serializebox(...))
+-- tex.print("\\stoptyping")
+-- end
+
+function nodes.visualizebox(...) -- to be checked .. will move to module anyway
+ context.starttyping()
+ context.pushcatcodes("verbatim")
+ context(nodes.serializebox(...))
+ context.stoptyping()
+ context.popcatcodes()
end
-function nodes.list(head,n) -- name might change to nodes.type
+function nodes.list(head,n) -- name might change to nodes.type -- to be checked .. will move to module anyway
if not n then
- tex.print(ctxcatcodes,"\\starttyping")
+ context.starttyping(true)
end
while head do
local id = head.id
- tex.print(string.rep(" ",n or 0) .. tostring(head) .. "\n")
- if id == hlist or id == vlist then
+ tex.write(rep(" ",n or 0) .. tostring(head) .. "\n")
+ if id == hlist_code or id == vlist_code then
nodes.list(head.list,(n or 0)+1)
end
head = head.next
end
if not n then
- tex.print("\\stoptyping")
+ context.stoptyping(true)
end
end
function nodes.print(head,n)
while head do
local id = head.id
- texio.write_nl(string.rep(" ",n or 0) .. tostring(head))
- if id == hlist or id == vlist then
+ texio.write_nl(rep(" ",n or 0) .. tostring(head))
+ if id == hlist_code or id == vlist_code then
nodes.print(head.list,(n or 0)+1)
end
head = head.next
end
end
-
-function nodes.check_for_leaks(sparse)
- local l = { }
- local q = node.usedlist()
- for p in traverse(q) do
- local s = table.serialize(nodes.astable(p,sparse),node_type(p.id))
- l[s] = (l[s] or 0) + 1
- end
- node.flush_list(q)
- for k, v in next, l do
- texio.write_nl(format("%s * %s", v, k))
- end
-end
-
diff --git a/Master/texmf-dist/tex/context/base/node-shp.lua b/Master/texmf-dist/tex/context/base/node-shp.lua
index 50b16efa581..75177a4edde 100644
--- a/Master/texmf-dist/tex/context/base/node-shp.lua
+++ b/Master/texmf-dist/tex/context/base/node-shp.lua
@@ -6,27 +6,32 @@ if not modules then modules = { } end modules ['node-shp'] = {
license = "see context related readme files"
}
-local hlist = node.id('hlist')
-local vlist = node.id('vlist')
-local disc = node.id('disc')
-local mark = node.id('mark')
-local kern = node.id('kern')
-local glue = node.id('glue')
+local nodes, node = nodes, node
+
+local nodecodes = nodes.nodecodes
+local tasks = nodes.tasks
+
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local disc_code = nodecodes.disc
+local mark_code = nodecodes.mark
+local kern_code = nodecodes.kern
+local glue_code = nodecodes.glue
local free_node = node.free
local remove_node = node.remove
-local function cleanup_page(head) -- rough
+local function cleanup(head) -- rough
local start = head
while start do
local id = start.id
- if id == disc or (id == glue and not start.writable) or (id == kern and start.kern == 0) or id == mark then
+ if id == disc_code or (id == glue_code and not start.writable) or (id == kern_code and start.kern == 0) or id == mark_code then
head, start, tmp = remove_node(head,start)
free_node(tmp)
- elseif id == hlist or id == vlist then
+ elseif id == hlist_code or id == vlist_code then
local sl = start.list
if sl then
- start.list = cleanup_page(sl)
+ start.list = cleanup(sl)
start = start.next
else
head, start, tmp = remove_node(head,start)
@@ -39,20 +44,19 @@ local function cleanup_page(head) -- rough
return head
end
-nodes.cleanup_page_first = false
+directives.register("backend.cleanup", function()
+ tasks.enableaction("shipouts","nodes.handlers.cleanuppage")
+end)
-function nodes.cleanup_page(head)
+function nodes.handlers.cleanuppage(head)
-- about 10% of the nodes make no sense for the backend
- if nodes.cleanup_page_first then
- head = cleanup_page(head)
- end
- return head, false
+ return cleanup(head), true
end
-local actions = tasks.actions("shipouts",0) -- no extra arguments
+local actions = tasks.actions("shipouts") -- no extra arguments
-function nodes.process_page(head) -- problem, attr loaded before node, todo ...
+function nodes.handlers.finalize(head) -- problem, attr loaded before node, todo ...
return actions(head)
end
---~ nodes.process_page = actions
+--~ nodes.handlers.finalize = actions
diff --git a/Master/texmf-dist/tex/context/base/node-spl.lua b/Master/texmf-dist/tex/context/base/node-spl.lua
new file mode 100644
index 00000000000..0fe3f759d1d
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/node-spl.lua
@@ -0,0 +1,619 @@
+if not modules then modules = { } end modules ['node-spl'] = {
+ version = 1.001,
+ comment = "companion to node-spl.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This module is dedicated to the oriental tex project and for
+-- the moment is too experimental to be publicly supported.
+--
+-- We could cache solutions: say that we store the featureset and
+-- all 'words' -> replacement ... so we create a large solution
+-- database (per font)
+--
+-- This module can be optimized by using a dedicated dynamics handler
+-- but I'll only do that when the rest of the code is stable.
+--
+-- Todo: bind setups to paragraph.
+
+local gmatch, concat, format, remove = string.gmatch, table.concat, string.format, table.remove
+local next, tostring, tonumber = next, tostring, tonumber
+local utfchar = utf.char
+local random = math.random
+
+local trace_split = false trackers.register("builders.paragraphs.solutions.splitters.splitter", function(v) trace_split = v end)
+local trace_optimize = false trackers.register("builders.paragraphs.solutions.splitters.optimizer", function(v) trace_optimize = v end)
+local trace_colors = false trackers.register("builders.paragraphs.solutions.splitters.colors", function(v) trace_colors = v end)
+local trace_goodies = false trackers.register("fonts.goodies", function(v) trace_goodies = v end)
+
+local report_solutions = logs.reporter("fonts","solutions")
+local report_splitters = logs.reporter("nodes","splitters")
+local report_optimizers = logs.reporter("nodes","optimizers")
+
+local nodes, node = nodes, node
+
+local variables = interfaces.variables
+
+local settings_to_array = utilities.parsers.settings_to_array
+local settings_to_hash = utilities.parsers.settings_to_hash
+
+local find_node_tail = node.tail or node.slide
+local free_node = node.free
+local free_nodelist = node.flush_list
+local has_attribute = node.has_attribute
+local set_attribute = node.set_attribute
+local new_node = node.new
+local copy_node = node.copy
+local copy_nodelist = node.copy_list
+local traverse_nodes = node.traverse
+local traverse_ids = node.traverse_id
+local protect_glyphs = nodes.handlers.protectglyphs or node.protect_glyphs
+local hpack_nodes = node.hpack
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+local repack_hlist = nodes.repackhlist
+
+local setnodecolor = nodes.tracers.colors.set
+
+local nodecodes = nodes.nodecodes
+local whatsitcodes = nodes.whatsitcodes
+
+local glyph_code = nodecodes.glyph
+local disc_code = nodecodes.disc
+local hlist_code = nodecodes.hlist
+local whatsit_code = nodecodes.whatsit
+
+local localpar_code = whatsitcodes.localpar
+local dir_code = whatsitcodes.dir
+local userdefined_code = whatsitcodes.userdefined
+
+local nodepool = nodes.pool
+local tasks = nodes.tasks
+local usernodeids = nodepool.userids
+
+local new_textdir = nodepool.textdir
+local new_usernumber = nodepool.usernumber
+
+local starttiming = statistics.starttiming
+local stoptiming = statistics.stoptiming
+local process_characters = nodes.handlers.characters
+local inject_kerns = nodes.injections.handler
+local fontdata = fonts.hashes.identifiers
+local setfontdynamics = fonts.hashes.setdynamics
+local fontprocesses = fonts.hashes.processes
+
+local parbuilders = builders.paragraphs
+parbuilders.solutions = parbuilders.solutions or { }
+parbuilders.solutions.splitters = parbuilders.solutions.splitters or { }
+
+local splitters = parbuilders.solutions.splitters
+
+local preroll = true
+local variant = "normal"
+local split = attributes.private('splitter')
+local cache = { }
+local solutions = { } -- attribute sets
+local variants = { }
+local max_less = 0
+local max_more = 0
+local criterium = 0
+local randomseed = nil
+local optimize = nil -- set later
+
+function splitters.setup(setups)
+ local method = settings_to_hash(setups.method or "")
+ if method[variables.preroll] then
+ preroll = true
+ else
+ preroll = false
+ end
+ for k, v in next, method do
+ if variants[k] then
+ optimize = variants[k]
+ end
+ end
+ randomseed = tonumber(setups.randomseed)
+ criterium = tonumber(setups.criterium) or criterium
+end
+
+local contextsetups = fonts.specifiers.contextsetups
+
+local function convert(featuresets,name,set,what)
+ local list, numbers, nofnumbers = set[what], { }, 0
+ if list then
+ for i=1,#list do
+ local feature = list[i]
+ local fs = featuresets[feature]
+ local fn = fs and fs.number
+ if not fn then
+ -- fall back on global features
+ fs = contextsetups[feature]
+ fn = fs and fs.number
+ end
+ if fn then
+ nofnumbers = nofnumbers + 1
+ numbers[nofnumbers] = fn
+ if trace_goodies or trace_optimize then
+ report_solutions("solution %s of '%s' uses feature '%s' with number %s",i,name,feature,fn)
+ end
+ else
+ report_solutions("solution %s has an invalid feature reference '%s'",i,name,tostring(feature))
+ end
+ end
+ return nofnumbers > 0 and numbers
+ end
+end
+
+local function initialize(goodies)
+ local solutions = goodies.solutions
+ if solutions then
+ local featuresets = goodies.featuresets
+ local goodiesname = goodies.name
+ if trace_goodies or trace_optimize then
+ report_solutions("checking solutions in '%s'",goodiesname)
+ end
+ for name, set in next, solutions do
+ set.less = convert(featuresets,name,set,"less")
+ set.more = convert(featuresets,name,set,"more")
+ end
+ end
+end
+
+fonts.goodies.register("solutions",initialize)
+
+function splitters.define(name,parameters)
+ local settings = settings_to_hash(parameters) -- todo: interfacing
+ local goodies, solution, less, more = settings.goodies, settings.solution, settings.less, settings.more
+ local less_set, more_set
+ local l = less and settings_to_array(less)
+ local m = more and settings_to_array(more)
+ if goodies then
+ goodies = fonts.goodies.get(goodies) -- also in tfmdata
+ if goodies then
+ local featuresets = goodies.featuresets
+ local solution = solution and goodies.solutions[solution]
+ if l and #l > 0 then
+ less_set = convert(featuresets,name,settings,"less") -- take from settings
+ else
+ less_set = solution and solution.less -- take from goodies
+ end
+ if m and #m > 0 then
+ more_set = convert(featuresets,name,settings,"more") -- take from settings
+ else
+ more_set = solution and solution.more -- take from goodies
+ end
+ end
+ else
+ if l then
+ local n = #less_set
+ for i=1,#l do
+ local ss = contextsetups[l[i]]
+ if ss then
+ n = n + 1
+ less_set[n] = ss.number
+ end
+ end
+ end
+ if m then
+ local n = #more_set
+ for i=1,#m do
+ local ss = contextsetups[m[i]]
+ if ss then
+ n = n + 1
+ more_set[n] = ss.number
+ end
+ end
+ end
+ end
+ if trace_optimize then
+ report_solutions("defining solutions '%s', less: '%s', more: '%s'",name,concat(less_set or {}," "),concat(more_set or {}," "))
+ end
+ local nofsolutions = #solutions + 1
+ solutions[nofsolutions] = {
+ solution = solution,
+ less = less_set or { },
+ more = more_set or { },
+ settings = settings, -- for tracing
+ }
+ tex.write(nofsolutions)
+end
+
+local nofwords, noftries, nofadapted, nofkept, nofparagraphs = 0, 0, 0, 0, 0
+
+local splitter_one = usernodeids["splitters.one"]
+local splitter_two = usernodeids["splitters.two"]
+
+function splitters.split(head)
+ -- quite fast
+ local current, done, rlmode, start, stop, attribute = head, false, false, nil, nil, 0
+ cache, max_less, max_more = { }, 0, 0
+ local function flush() -- we can move this
+ local font = start.font
+ local last = stop.next
+ local list = last and copy_nodelist(start,last) or copy_nodelist(start)
+ local n = #cache + 1
+ local user_one = new_usernumber(splitter_one,n)
+ local user_two = new_usernumber(splitter_two,n)
+ head, start = insert_node_before(head,start,user_one)
+ insert_node_after(head,stop,user_two)
+ if rlmode == "TRT" or rlmode == "+TRT" then
+ local dirnode = new_textdir("+TRT")
+ list.prev = dirnode
+ dirnode.next = list
+ list = dirnode
+ end
+ local c = {
+ original = list,
+ attribute = attribute,
+ direction = rlmode,
+ font = font
+ }
+ if trace_split then
+ report_splitters("cached %4i: font: %s, attribute: %s, word: %s, direction: %s", n,
+ font, attribute, nodes.listtoutf(list,true), rlmode)
+ end
+ cache[n] = c
+ local solution = solutions[attribute]
+ local l, m = #solution.less, #solution.more
+ if l > max_less then max_less = l end
+ if m > max_more then max_more = m end
+ start, stop, done = nil, nil, true
+ end
+ while current do
+ local id = current.id
+ if id == glyph_code and current.subtype < 256 then
+ local a = has_attribute(current,split)
+ if not a then
+ start, stop = nil, nil
+ elseif not start then
+ start, stop, attribute = current, current, a
+ elseif a ~= attribute then
+ start, stop = nil, nil
+ else
+ stop = current
+ end
+ current = current.next
+ elseif id == disc_code then
+ start, stop, current = nil, nil, current.next
+ elseif id == whatsit_code then
+ if start then
+ flush()
+ end
+ local subtype = current.subtype
+ if subtype == dir_code or subtype == localpar_code then
+ rlmode = current.dir
+ end
+ current = current.next
+ else
+ if start then
+ flush()
+ end
+ current = current.next
+ end
+ end
+ if start then
+ flush()
+ end
+ nofparagraphs = nofparagraphs + 1
+ nofwords = nofwords + #cache
+ return head, done
+end
+
+local function collect_words(list)
+ local words, w, word = { }, 0, nil
+ for current in traverse_ids(whatsit_code,list) do
+ if current.subtype == userdefined_code then
+ local user_id = current.user_id
+ if user_id == splitter_one then
+ word = { current.value, current, current }
+ w = w + 1
+ words[w] = word
+ elseif user_id == splitter_two then
+ word[3] = current
+ end
+ end
+ end
+ return words -- check for empty (elsewhere)
+end
+
+-- we could avoid a hpack but hpack is not that slow
+
+local function doit(word,list,best,width,badness,line,set,listdir)
+ local changed = 0
+ local n = word[1]
+ local found = cache[n]
+ if found then
+ local original, attribute, direction = found.original, found.attribute, found.direction
+ local solution = solutions[attribute]
+ local features = solution and solution[set]
+ if features then
+ local featurenumber = features[best] -- not ok probably
+ if featurenumber then
+ noftries = noftries + 1
+ local first = copy_nodelist(original)
+ if not trace_colors then
+ for n in traverse_nodes(first) do -- maybe fast force so no attr needed
+ set_attribute(n,0,featurenumber) -- this forces dynamics
+ end
+ elseif set == "less" then
+ for n in traverse_nodes(first) do
+ setnodecolor(n,"font:isol")
+ set_attribute(n,0,featurenumber)
+ end
+ else
+ for n in traverse_nodes(first) do
+ setnodecolor(n,"font:medi")
+ set_attribute(n,0,featurenumber)
+ end
+ end
+ local font = found.font
+ -- local dynamics = found.dynamics
+ -- local shared = fontdata[font].shared
+ -- if not dynamics then -- we cache this
+ -- dynamics = shared.dynamics
+ -- found.dynamics = dynamics
+ -- end
+ -- local processors = found[featurenumber]
+ -- if not processors then -- we cache this too
+ -- processors = fonts.handlers.otf.setdynamics(font,featurenumber)
+ -- found[featurenumber] = processors
+ -- end
+ local setdynamics = setfontdynamics[font]
+ if setdynamics then
+ local processes = setdynamics(font,featurenumber)
+ for i=1,#processes do -- often more than 1
+ first = processes[i](first,font,featurenumber)
+ end
+ else
+ report_solutions("fatal error, no dynamics for font %s",font)
+ end
+ first = inject_kerns(first)
+ local h = word[2].next -- head of current word
+ local t = word[3].prev -- tail of current word
+ if first.id == whatsit_code then
+ local temp = first
+ first = first.next
+ free_node(temp)
+ end
+ local last = find_node_tail(first)
+ -- replace [u]h->t by [u]first->last
+ local next, prev = t.next, h.prev
+ prev.next, first.prev = first, prev
+ if next then
+ last.next, next.prev = next, last
+ end
+ -- check new pack
+ local temp, b = repack_hlist(list,width,'exactly',listdir)
+ if b > badness then
+ if trace_optimize then
+ report_optimizers("line %s, badness before: %s, after: %s, criterium: %s -> quit",line,badness,b,criterium)
+ end
+ -- remove last insert
+ prev.next, h.prev = h, prev
+ if next then
+ t.next, next.prev = next, t
+ else
+ t.next = nil
+ end
+ last.next = nil
+ free_nodelist(first)
+ else
+ if trace_optimize then
+ report_optimizers("line %s, badness before: %s, after: %s, criterium: %s -> continue",line,badness,b,criterium)
+ end
+ -- free old h->t
+ t.next = nil
+ free_nodelist(h)
+ changed, badness = changed + 1, b
+ end
+ if b <= criterium then
+ return true, changed
+ end
+ end
+ end
+ end
+ return false, changed
+end
+
+-- We repeat some code but adding yet another layer of indirectness is not
+-- making things better.
+
+variants[variables.normal] = function(words,list,best,width,badness,line,set,listdir)
+ local changed = 0
+ for i=1,#words do
+ local done, c = doit(words[i],list,best,width,badness,line,set,listdir)
+ changed = changed + c
+ if done then
+ break
+ end
+ end
+ if changed > 0 then
+ nofadapted = nofadapted + 1
+ -- todo: get rid of pack when ok because we already have packed and we only need the last b
+ local list, b = repack_hlist(list,width,'exactly',listdir)
+ return list, true, changed, b -- badness
+ else
+ nofkept = nofkept + 1
+ return list, false, 0, badness
+ end
+end
+
+variants[variables.reverse] = function(words,list,best,width,badness,line,set,listdir)
+ local changed = 0
+ for i=#words,1,-1 do
+ local done, c = doit(words[i],list,best,width,badness,line,set,listdir)
+ changed = changed + c
+ if done then
+ break
+ end
+ end
+ if changed > 0 then
+ nofadapted = nofadapted + 1
+ -- todo: get rid of pack when ok because we already have packed and we only need the last b
+ local list, b = repack_hlist(list,width,'exactly',listdir)
+ return list, true, changed, b -- badness
+ else
+ nofkept = nofkept + 1
+ return list, false, 0, badness
+ end
+end
+
+variants[variables.random] = function(words,list,best,width,badness,line,set,listdir)
+ local changed = 0
+ while #words > 0 do
+ local done, c = doit(remove(words,random(1,#words)),list,best,width,badness,line,set,listdir)
+ changed = changed + c
+ if done then
+ break
+ end
+ end
+ if changed > 0 then
+ nofadapted = nofadapted + 1
+ -- todo: get rid of pack when ok because we already have packed and we only need the last b
+ local list, b = repack_hlist(list,width,'exactly',listdir)
+ return list, true, changed, b -- badness
+ else
+ nofkept = nofkept + 1
+ return list, false, 0, badness
+ end
+end
+
+optimize = variants.normal -- the default
+
+local function show_quality(current,what,line)
+ local set = current.glue_set
+ local sign = current.glue_sign
+ local order = current.glue_order
+ local amount = set * ((sign == 2 and -1) or 1)
+ report_optimizers("line %s, %s, amount %s, set %s, sign %s (%s), order %s",line,what,amount,set,sign,how,order)
+end
+
+function splitters.optimize(head)
+ local nc = #cache
+ if nc > 0 then
+ starttiming(splitters)
+ local listdir = nil -- todo ! ! !
+ if randomseed then
+ math.setrandomseedi(randomseed)
+ randomseed = nil
+ end
+ local line = 0
+ local tex_hbadness, tex_hfuzz = tex.hbadness, tex.hfuzz
+ tex.hbadness, tex.hfuzz = 10000, number.maxdimen
+ if trace_optimize then
+ report_optimizers("preroll: %s, variant: %s, preroll criterium: %s, cache size: %s",
+ tostring(preroll),variant,criterium,nc)
+ end
+ for current in traverse_ids(hlist_code,head) do
+ -- report_splitters("before: [%s] => %s",current.dir,nodes.tosequence(current.list,nil))
+ line = line + 1
+ local sign, dir, list, width = current.glue_sign, current.dir, current.list, current.width
+ local temp, badness = repack_hlist(list,width,'exactly',dir) -- it would be nice if the badness was stored in the node
+ if badness > 0 then
+ if sign == 0 then
+ if trace_optimize then
+ report_optimizers("line %s, badness %s, okay",line,badness)
+ end
+ else
+ local set, max
+ if sign == 1 then
+ if trace_optimize then
+ report_optimizers("line %s, badness %s, underfull, trying more",line,badness)
+ end
+ set, max = "more", max_more
+ else
+ if trace_optimize then
+ report_optimizers("line %s, badness %s, overfull, trying less",line,badness)
+ end
+ set, max = "less", max_less
+ end
+ -- we can keep the best variants
+ local lastbest, lastbadness = nil, badness
+ if preroll then
+ local bb, base
+ for i=1,max do
+ if base then
+ free_nodelist(base)
+ end
+ base = copy_nodelist(list)
+ local words = collect_words(base) -- beware: words is adapted
+ for j=i,max do
+ local temp, done, changes, b = optimize(words,base,j,width,badness,line,set,dir)
+ base = temp
+ if trace_optimize then
+ report_optimizers("line %s, alternative: %s.%s, changes: %s, badness %s",line,i,j,changes,b)
+ end
+ bb = b
+ if b <= criterium then
+ break
+ end
+ -- if done then
+ -- break
+ -- end
+ end
+ if bb and bb > criterium then -- needs checking
+ if not lastbest then
+ lastbest, lastbadness = i, bb
+ elseif bb > lastbadness then
+ lastbest, lastbadness = i, bb
+ end
+ else
+ break
+ end
+ end
+ free_nodelist(base)
+ end
+ local words = collect_words(list)
+ for best=lastbest or 1,max do
+ local temp, done, changes, b = optimize(words,list,best,width,badness,line,set,dir)
+ current.list = temp
+ if trace_optimize then
+ report_optimizers("line %s, alternative: %s, changes: %s, badness %s",line,best,changes,b)
+ end
+ if done then
+ if b <= criterium then -- was == 0
+ protect_glyphs(list)
+ break
+ end
+ end
+ end
+ end
+ else
+ if trace_optimize then
+ report_optimizers("line %s, not bad enough",line)
+ end
+ end
+ -- we pack inside the outer hpack and that way keep the original wd/ht/dp as bonus
+ current.list = hpack_nodes(current.list,width,'exactly',listdir)
+ -- report_splitters("after: [%s] => %s",temp.dir,nodes.tosequence(temp.list,nil))
+ end
+ for i=1,nc do
+ local ci = cache[i]
+ free_nodelist(ci.original)
+ end
+ cache = { }
+ tex.hbadness, tex.hfuzz = tex_hbadness, tex_hfuzz
+ stoptiming(splitters)
+ end
+end
+
+statistics.register("optimizer statistics", function()
+ if nofwords > 0 then
+ local elapsed = statistics.elapsedtime(splitters)
+ local average = noftries/elapsed
+ return format("%s words identified in %s paragraphs, %s words retried, %s lines tried, %0.3f seconds used, %s adapted, %0.1f lines per second",
+ nofwords,nofparagraphs,noftries,nofadapted+nofkept,elapsed,nofadapted,average)
+ end
+end)
+
+function splitters.enable()
+ tasks.enableaction("processors", "builders.paragraphs.solutions.splitters.split")
+ tasks.enableaction("finalizers", "builders.paragraphs.solutions.splitters.optimize")
+end
+
+function splitters.disable()
+ tasks.disableaction("processors", "builders.paragraphs.solutions.splitters.split")
+ tasks.disableaction("finalizers", "builders.paragraphs.solutions.splitters.optimize")
+end
diff --git a/Master/texmf-dist/tex/context/base/node-spl.mkiv b/Master/texmf-dist/tex/context/base/node-spl.mkiv
new file mode 100644
index 00000000000..8ad6795a5e0
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/node-spl.mkiv
@@ -0,0 +1,114 @@
+%D \module
+%D [ file=node-spl,
+%D version=2009.05.19,
+%D title=\CONTEXT\ Node Macros,
+%D subtitle=Splitters,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%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 Node Support / Splitters}
+
+\registerctxluafile{node-spl}{1.001}
+
+\definesystemattribute[splitter][public]
+
+%D This module is specially made for the oriental \TEX\ project. The working is as
+%D follows (and tuned for fonts like Idris' Husayni. The following method came to
+%D my mind after a couple of Skype sessions with Idris while working on the rough
+%D edges of the Husayni font and playing with font dynamics.
+%D
+%D \startitemize[packed]
+%D
+%D \item We define a couple of features sets, some can have stylistics variants
+%D that result in the same words getting a different width. Normally this
+%D happens in a goodies file.
+%D
+%D \item We group such features in a solution set. A solutionset can be enabled
+%D by setting an attribute.
+%D
+%D \item For each paragraph we identify words that get this set applied. We replace
+%D these words by a user node that refers to the original.
+%D
+%D \item For each word we apply the features to a copy that we associate with this
+%D original word.
+%D
+%D \item At the end we have a paragraph (node list) with user nodes that point to a
+%D cache that has originals and processed variants.
+%D
+%D \item When the paragraph is broken into lines we optimize the spacing by
+%D substituting variants.
+%D
+%D \stopitemize
+%D
+%D This approach permits us to use a dedicated paragraph builder, one that treats
+%D the user nodes special and takes the alternatives into account.
+%D
+%D Currently we assume only one solution being active. Maybe some day I'll support
+%D a mixture. This is only one way of optimizing and after several experiments this
+%D one was chosen as testcase. It took quite some experiments (and time) to get thus
+%D far.
+%D
+%D The is experimental code for the Oriental \TEX\ project and aspects of it might
+%D change.
+%D
+%D \starttyping
+%D \setupfontsolutions[method={random,preroll},criterium=1,randomseed=101]
+%D
+%D \definefontsolution % actually only the last run needs to be done this way
+%D [FancyHusayni]
+%D [goodies=husayni,
+%D solution=experimental]
+%D
+%D \definedfont[husayni*husayni-default at 24pt]
+%D \setupinterlinespace[line=36pt]
+%D \righttoleft
+%D \enabletrackers[parbuilders.solutions.splitters.colors]
+%D \setfontsolution[FancyHusayni]
+%D alb alb alb \par
+%D \resetfontsolution
+%D \disabletrackers[parbuilders.solutions.splitters.colors]
+%D \stoptyping
+
+\unprotect
+
+\newtoks\everysetupfontsolutions
+
+\unexpanded\def\definefontsolution
+ {\dodoubleargument\dodefinefontsolution}
+
+\def\dodefinefontsolution[#1][#2]% we could set the attribute at the lua end
+ {\setxvalue{\??fu:#1}{\attribute\splitterattribute\ctxlua{builders.paragraphs.solutions.splitters.define("#1","#2")}\relax}}
+
+\unexpanded\def\setfontsolution[#1]%
+ {\ctxlua{builders.paragraphs.solutions.splitters.enable()}%
+ \csname\??fu:#1\endcsname}
+
+\unexpanded\def\resetfontsolution
+ {\ctxlua{builders.paragraphs.solutions.splitters.disable()}%
+ \attribute\splitterattribute\attributeunsetvalue}
+
+\letvalue{\??fu:\v!reset}\resetfontsolution
+
+\unexpanded\def\setupfontsolutions[#1]%
+ {\getparameters[\??fu][#1]%
+ \the\everysetupfontsolutions}
+
+\appendtoks
+ \ctxlua{builders.paragraphs.solutions.splitters.setup {
+ method = "\@@fumethod",
+ criterium = "\@@fucriterium",
+ }}%
+\to \everysetupfontsolutions
+
+% We initialize this module at the \LUA\ end.
+%
+% \setupfontsolutions
+% [\c!method={\v!normal,preroll},
+% \c!criterium=0]
+
+\protect
diff --git a/Master/texmf-dist/tex/context/base/node-tex.lua b/Master/texmf-dist/tex/context/base/node-tex.lua
index a6eef32693f..2170e0603fd 100644
--- a/Master/texmf-dist/tex/context/base/node-tex.lua
+++ b/Master/texmf-dist/tex/context/base/node-tex.lua
@@ -8,7 +8,9 @@ if not modules then modules = { } end modules ['node-tex'] = {
local format = string.format
-kernel = kernel or { }
+builders = builders or { }
+builders.kernel = builders.kernel or { }
+local kernel = builders.kernel
local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
local hyphenate, ligaturing, kerning = lang.hyphenate, node.ligaturing, node.kerning
diff --git a/Master/texmf-dist/tex/context/base/node-tra.lua b/Master/texmf-dist/tex/context/base/node-tra.lua
index 5acd70baf2e..38855f65934 100644
--- a/Master/texmf-dist/tex/context/base/node-tra.lua
+++ b/Master/texmf-dist/tex/context/base/node-tra.lua
@@ -11,45 +11,71 @@ if not modules then modules = { } end modules ['node-tra'] = {
might become a runtime module instead. This module will be cleaned up!</p>
--ldx]]--
-local utf = unicode.utf8
-local format, match, concat, rep, utfchar = string.format, string.match, table.concat, string.rep, utf.char
+local utfchar = utf.char
+local concat = table.concat
+local format, match, gmatch, concat, rep = string.format, string.match, string.gmatch, table.concat, string.rep
+local lpegmatch = lpeg.match
+local write_nl = texio.write_nl
-local ctxcatcodes = tex.ctxcatcodes
+local report_nodes = logs.reporter("nodes","tracing")
-fonts = fonts or { }
-fonts.tfm = fonts.tfm or { }
-fonts.ids = fonts.ids or { }
+fonts = fonts or { }
+nodes = nodes or { }
-nodes = nodes or { }
-nodes.tracers = nodes.tracers or { }
-nodes.tracers.characters = nodes.tracers.characters or { }
-nodes.tracers.steppers = nodes.tracers.steppers or { }
+local fonts, nodes, node, context = fonts, nodes, node, context
-local glyph = node.id('glyph')
-local hlist = node.id('hlist')
-local vlist = node.id('vlist')
-local disc = node.id('disc')
-local glue = node.id('glue')
-local kern = node.id('kern')
-local rule = node.id('rule')
-local whatsit = node.id('whatsit')
+nodes.tracers = nodes.tracers or { }
+local tracers = nodes.tracers
+
+nodes.tasks = nodes.tasks or { }
+local tasks = nodes.tasks
+
+nodes.handlers = nodes.handlers or { }
+local handlers = nodes.handlers
+
+nodes.injections = nodes.injections or { }
+local injections = nodes.injections
+
+tracers.characters = tracers.characters or { }
+tracers.steppers = tracers.steppers or { }
+
+local char_tracers = tracers.characters
+local step_tracers = tracers.steppers
local copy_node_list = node.copy_list
local hpack_node_list = node.hpack
local free_node_list = node.flush_list
-local first_character = node.first_character
-local node_type = node.type
local traverse_nodes = node.traverse
-local texsprint = tex.sprint
-local fontdata = fonts.ids
+local nodecodes = nodes.nodecodes
+local whatcodes = nodes.whatcodes
+local skipcodes = nodes.skipcodes
+
+local glyph_code = nodecodes.glyph
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local disc_code = nodecodes.disc
+local glue_code = nodecodes.glue
+local kern_code = nodecodes.kern
+local rule_code = nodecodes.rule
+local whatsit_code = nodecodes.whatsit
+
+local localpar_code = whatcodes.localpar
+local dir_code = whatcodes.dir
+
+local userskip_code = skipcodes.userskip
-function nodes.tracers.characters.collect(head,list,tag,n)
+local nodepool = nodes.pool
+
+local new_glyph = nodepool.glyph
+
+function char_tracers.collect(head,list,tag,n)
+ local fontdata = fonts.hashes.identifiers
n = n or 0
local ok, fn = false, nil
while head do
local id = head.id
- if id == glyph then
+ if id == glyph_code then
local f = head.font
if f ~= fn then
ok, fn = false, f
@@ -64,7 +90,7 @@ function nodes.tracers.characters.collect(head,list,tag,n)
end
local l = list[n][tag]
l[#l+1] = { c, f, i }
- elseif id == disc then
+ elseif id == disc_code then
-- skip
else
ok = false
@@ -73,7 +99,7 @@ function nodes.tracers.characters.collect(head,list,tag,n)
end
end
-function nodes.tracers.characters.equal(ta, tb)
+function char_tracers.equal(ta, tb)
if #ta ~= #tb then
return false
else
@@ -87,7 +113,7 @@ function nodes.tracers.characters.equal(ta, tb)
return true
end
-function nodes.tracers.characters.string(t)
+function char_tracers.string(t)
local tt = { }
for i=1,#t do
tt[i] = utfchar(t[i][1])
@@ -95,7 +121,7 @@ function nodes.tracers.characters.string(t)
return concat(tt,"")
end
-function nodes.tracers.characters.unicodes(t,decimal)
+function char_tracers.unicodes(t,decimal)
local tt = { }
for i=1,#t do
local n = t[i][1]
@@ -110,7 +136,7 @@ function nodes.tracers.characters.unicodes(t,decimal)
return concat(tt," ")
end
-function nodes.tracers.characters.indices(t,decimal)
+function char_tracers.indices(t,decimal)
local tt = { }
for i=1,#t do
local n = t[i][3]
@@ -125,20 +151,20 @@ function nodes.tracers.characters.indices(t,decimal)
return concat(tt," ")
end
-function nodes.tracers.characters.start()
- local npc = nodes.process_characters
+function char_tracers.start()
+ local npc = handlers.characters
local list = { }
- function nodes.process_characters(head)
+ function handlers.characters(head)
local n = #list
- nodes.tracers.characters.collect(head,list,'before',n)
+ char_tracers.collect(head,list,'before',n)
local h, d = npc(head)
- nodes.tracers.characters.collect(head,list,'after',n)
+ char_tracers.collect(head,list,'after',n)
if #list > n then
list[#list+1] = { }
end
return h, d
end
- function nodes.tracers.characters.stop()
+ function char_tracers.stop()
tracers.list['characters'] = list
local variables = {
['title'] = 'ConTeXt Character Processing Information',
@@ -146,7 +172,7 @@ function nodes.tracers.characters.start()
['color-background-two'] = lmx.get('color-background-purple'),
}
lmx.show('context-characters.lmx',variables)
- nodes.process_characters = npc
+ handlers.characters = npc
tasks.restart("processors", "characters")
end
tasks.restart("processors", "characters")
@@ -154,14 +180,14 @@ end
local stack = { }
-function nodes.tracers.start(tag)
+function tracers.start(tag)
stack[#stack+1] = tag
- local tracer = nodes.tracers[tag]
+ local tracer = tracers[tag]
if tracer and tracer.start then
tracer.start()
end
end
-function nodes.tracers.stop()
+function tracers.stop()
local tracer = stack[#stack]
if tracer and tracer.stop then
tracer.stop()
@@ -173,15 +199,15 @@ end
local collection, collecting, messages = { }, false, { }
-function nodes.tracers.steppers.start()
+function step_tracers.start()
collecting = true
end
-function nodes.tracers.steppers.stop()
+function step_tracers.stop()
collecting = false
end
-function nodes.tracers.steppers.reset()
+function step_tracers.reset()
for i=1,#collection do
local c = collection[i]
if c then
@@ -191,23 +217,23 @@ function nodes.tracers.steppers.reset()
collection, messages = { }, { }
end
-function nodes.tracers.steppers.nofsteps()
+function step_tracers.nofsteps()
return tex.write(#collection)
end
-function nodes.tracers.steppers.glyphs(n,i)
+function step_tracers.glyphs(n,i)
local c = collection[i]
if c then
tex.box[n] = hpack_node_list(copy_node_list(c))
end
end
-function nodes.tracers.steppers.features()
--- local f = first_character(collection[1])
--- if f then -- something fishy with first_character
+function step_tracers.features()
+ -- we cannot use first_glyph here as it only finds characters with subtype < 256
+ local fontdata = fonts.hashes.identifiers
local f = collection[1]
while f do
- if f.id == glyph then
+ if f.id == glyph_code then
local tfmdata, t = fontdata[f.font], { }
for feature, value in table.sortedhash(tfmdata.shared.features) do
if feature == "number" or feature == "features" then
@@ -223,9 +249,9 @@ function nodes.tracers.steppers.features()
end
end
if #t > 0 then
- texsprint(ctxcatcodes,concat(t,", "))
+ context(concat(t,", "))
else
- texsprint(ctxcatcodes,"no features")
+ context("no features")
end
return
end
@@ -233,41 +259,48 @@ function nodes.tracers.steppers.features()
end
end
-function nodes.tracers.fontchar(font,char)
- local n = nodes.glyph()
+function tracers.fontchar(font,char)
+ local fontchar = fonts.hashes.characters
+ local n = new_glyph()
n.font, n.char, n.subtype = font, char, 256
- node.write(n)
+ context(n)
end
-function nodes.tracers.steppers.codes(i,command)
+function step_tracers.codes(i,command)
+ local fontdata = fonts.hashes.identifiers
local c = collection[i]
while c do
local id = c.id
- if id == glyph then
+ if id == glyph_code then
if command then
- texsprint(ctxcatcodes,format("%s{%s}{%s}",command,c.font,c.char))
+ local f, c = c.font,c.char
+ local d = fontdata[f].descriptions
+ local d = d and d[c]
+ context[command](f,c,d and d.class or "")
else
- texsprint(ctxcatcodes,format("[%s:U+%04X]",c.font,c.char))
+ context("[%s:U+%04X]",c.font,c.char)
end
- elseif id == whatsit and (c.subtype == 6 or c.subtype == 7) then
- texsprint(ctxcatcodes,format("[%s]",c.dir))
+ elseif id == whatsit_code and (c.subtype == localpar_code or c.subtype == dir_code) then
+ context("[%s]",c.dir)
else
- texsprint(ctxcatcodes,format("[%s]",node_type(id)))
+ context("[%s]",nodecodes[id])
end
c = c.next
end
end
-function nodes.tracers.steppers.messages(i,command,split)
+function step_tracers.messages(i,command,split)
local list = messages[i] -- or { "no messages" }
if list then
for i=1,#list do
local l = list[i]
- if split then
+ if not command then
+ context("(%s)",l)
+ elseif split then
local a, b = match(l,"^(.-)%s*:%s*(.*)$")
- texsprint(ctxcatcodes,format("%s{%s}{%s}",command,a or l,b or ""))
+ context[command](a or l or "",b or "")
else
- texsprint(ctxcatcodes,format("%s{%s}",command,l))
+ context[command](l)
end
end
end
@@ -275,29 +308,29 @@ end
-- hooks into the node list processor (see otf)
-function nodes.tracers.steppers.check(head)
+function step_tracers.check(head)
if collecting then
- nodes.tracers.steppers.reset()
+ step_tracers.reset()
local n = copy_node_list(head)
- nodes.inject_kerns(n,nil,"trace",true)
- nodes.protect_glyphs(n) -- can be option
+ injections.handler(n,nil,"trace",true)
+ handlers.protectglyphs(n) -- can be option
collection[1] = n
end
end
-function nodes.tracers.steppers.register(head)
+function step_tracers.register(head)
if collecting then
local nc = #collection+1
if messages[nc] then
local n = copy_node_list(head)
- nodes.inject_kerns(n,nil,"trace",true)
- nodes.protect_glyphs(n) -- can be option
+ injections.handler(n,nil,"trace",true)
+ handlers.protectglyphs(n) -- can be option
collection[nc] = n
end
end
end
-function nodes.tracers.steppers.message(str,...)
+function step_tracers.message(str,...)
str = format(str,...)
if collecting then
local n = #collection + 1
@@ -310,55 +343,72 @@ end
-- this will be reorganized:
-function nodes.show_list(head, message)
+function nodes.showlist(head, message)
if message then
- texio.write_nl(message)
+ write_nl(message)
end
for n in traverse_nodes(head) do
- texio.write_nl(tostring(n))
+ write_nl(tostring(n))
end
end
-function nodes.check_glyphs(head,message)
+function nodes.handlers.checkglyphs(head,message)
local t = { }
- for g in traverse_id(glyph,head) do
+ for g in traverse_id(glyph_code,head) do
t[#t+1] = format("U+%04X:%s",g.char,g.subtype)
end
if #t > 0 then
- logs.report(message or "nodes","%s glyphs: %s",#t,concat(t," "))
+ if message and message ~= "" then
+ report_nodes("%s, %s glyphs: %s",message,#t,concat(t," "))
+ else
+ report_nodes("%s glyphs: %s",#t,concat(t," "))
+ end
end
return false
end
-function nodes.tosequence(start,stop,compact)
+function nodes.handlers.checkforleaks(sparse)
+ local l = { }
+ local q = node.usedlist()
+ for p in traverse(q) do
+ local s = table.serialize(nodes.astable(p,sparse),nodecodes[p.id])
+ l[s] = (l[s] or 0) + 1
+ end
+ node.flush_list(q)
+ for k, v in next, l do
+ write_nl(format("%s * %s", v, k))
+ end
+end
+
+local function tosequence(start,stop,compact)
if start then
local t = { }
while start do
local id = start.id
- if id == glyph then
+ if id == glyph_code then
local c = start.char
if compact then
if start.components then
- t[#t+1] = nodes.tosequence(start.components,nil,compact)
+ t[#t+1] = tosequence(start.components,nil,compact)
else
- t[#t+1] = format("%s",utfchar(c))
+ t[#t+1] = utfchar(c)
end
else
t[#t+1] = format("U+%04X:%s",c,utfchar(c))
end
- elseif id == whatsit and start.subtype == 6 or start.subtype == 7 then
+ elseif id == whatsit_code and start.subtype == localpar_code or start.subtype == dir_code then
t[#t+1] = "[" .. start.dir .. "]"
- elseif id == rule then
+ elseif id == rule_code then
if compact then
t[#t+1] = "|"
else
- t[#t+1] = node_type(id)
+ t[#t+1] = nodecodes[id]
end
else
if compact then
t[#t+1] = "[]"
else
- t[#t+1] = node_type(id)
+ t[#t+1] = nodecodes[id]
end
end
if start == stop then
@@ -377,23 +427,25 @@ function nodes.tosequence(start,stop,compact)
end
end
+nodes.tosequence = tosequence
+
function nodes.report(t,done)
if done then
if status.output_active then
- logs.report("nodes","output, changed, %s nodes",nodes.count(t))
+ report_nodes("output, changed, %s nodes",nodes.count(t))
else
- texio.write("nodes","normal, changed, %s nodes",nodes.count(t))
+ write_nl("nodes","normal, changed, %s nodes",nodes.count(t))
end
else
if status.output_active then
- logs.report("nodes","output, unchanged, %s nodes",nodes.count(t))
+ report_nodes("output, unchanged, %s nodes",nodes.count(t))
else
- texio.write("nodes","normal, unchanged, %s nodes",nodes.count(t))
+ write_nl("nodes","normal, unchanged, %s nodes",nodes.count(t))
end
end
end
-function nodes.pack_list(head)
+function nodes.packlist(head)
local t = { }
for n in traverse(head) do
t[#t+1] = tostring(n)
@@ -401,7 +453,7 @@ function nodes.pack_list(head)
return t
end
-function nodes.ids_to_string(head,tail)
+function nodes.idstostring(head,tail)
local t, last_id, last_n = { }, nil, 0
for n in traverse_nodes(head,tail) do -- hm, does not stop at tail
local id = n.id
@@ -411,9 +463,9 @@ function nodes.ids_to_string(head,tail)
last_n = last_n + 1
else
if last_n > 1 then
- t[#t+1] = format("[%s*%s]",last_n,node_type(last_id) or "?")
+ t[#t+1] = format("[%s*%s]",last_n,nodecodes[last_id] or "?")
else
- t[#t+1] = format("[%s]",node_type(last_id) or "?")
+ t[#t+1] = format("[%s]",nodecodes[last_id] or "?")
end
last_id, last_n = id, 1
end
@@ -424,22 +476,55 @@ function nodes.ids_to_string(head,tail)
if not last_id then
t[#t+1] = "no nodes"
elseif last_n > 1 then
- t[#t+1] = format("[%s*%s]",last_n,node_type(last_id) or "?")
+ t[#t+1] = format("[%s*%s]",last_n,nodecodes[last_id] or "?")
else
- t[#t+1] = format("[%s]",node_type(last_id) or "?")
+ t[#t+1] = format("[%s]",nodecodes[last_id] or "?")
end
return concat(t," ")
end
-nodes.ids_tostring = nodes.ids_to_string
-
-local function show_simple_list(h,depth,n)
+--~ function nodes.xidstostring(head,tail) -- only for special tracing of backlinks
+--~ local n = head
+--~ while n.next do
+--~ n = n.next
+--~ end
+--~ local t, last_id, last_n = { }, nil, 0
+--~ while n do
+--~ local id = n.id
+--~ if not last_id then
+--~ last_id, last_n = id, 1
+--~ elseif last_id == id then
+--~ last_n = last_n + 1
+--~ else
+--~ if last_n > 1 then
+--~ t[#t+1] = format("[%s*%s]",last_n,nodecodes[last_id] or "?")
+--~ else
+--~ t[#t+1] = format("[%s]",nodecodes[last_id] or "?")
+--~ end
+--~ last_id, last_n = id, 1
+--~ end
+--~ if n == head then
+--~ break
+--~ end
+--~ n = n.prev
+--~ end
+--~ if not last_id then
+--~ t[#t+1] = "no nodes"
+--~ elseif last_n > 1 then
+--~ t[#t+1] = format("[%s*%s]",last_n,nodecodes[last_id] or "?")
+--~ else
+--~ t[#t+1] = format("[%s]",nodecodes[last_id] or "?")
+--~ end
+--~ return table.concat(table.reversed(t)," ")
+--~ end
+
+local function showsimplelist(h,depth,n)
while h do
- texio.write_nl(rep(" ",n) .. tostring(h))
+ write_nl(rep(" ",n) .. tostring(h))
if not depth or n < depth then
local id = h.id
- if id == hlist or id == vlist then
- show_simple_list(h.list,depth,n+1)
+ if id == hlist_code or id == vlist_code then
+ showsimplelist(h.list,depth,n+1)
end
end
h = h.next
@@ -454,13 +539,13 @@ end
--~ callback.register('buildpage_filter',nil)
--~ \stopluacode
-nodes.show_simple_list = function(h,depth) show_simple_list(h,depth,0) end
+nodes.showsimplelist = function(h,depth) showsimplelist(h,depth,0) end
-function nodes.list_to_utf(h,joiner)
+function nodes.listtoutf(h,joiner)
local joiner = (joiner ==true and utfchar(0x200C)) or joiner -- zwnj
local w = { }
while h do
- if h.id == glyph then -- always true
+ if h.id == glyph_code then -- always true
w[#w+1] = utfchar(h.char)
if joiner then
w[#w+1] = joiner
@@ -472,3 +557,133 @@ function nodes.list_to_utf(h,joiner)
end
return concat(w)
end
+
+local what = { [0] = "unknown", "line", "box", "indent", "row", "cell" }
+
+local function showboxes(n,symbol,depth)
+ depth, symbol = depth or 0, symbol or "."
+ for n in traverse_nodes(n) do
+ local id = n.id
+ if id == hlist_code or id == vlist_code then
+ local s = n.subtype
+ report_nodes(rep(symbol,depth) .. what[s] or s)
+ showboxes(n.list,symbol,depth+1)
+ end
+ end
+end
+
+nodes.showboxes = showboxes
+
+local threshold = 65536
+
+local function toutf(list,result,nofresult,stopcriterium)
+ if list then
+ local fontchar = fonts.hashes.characters
+ for n in traverse_nodes(list) do
+ local id = n.id
+ if id == glyph_code then
+ local components = n.components
+ if components then
+ result, nofresult = toutf(components,result,nofresult)
+ else
+ local c = n.char
+ local fc = fontchar[n.font]
+ if fc then
+ local u = fc[c].tounicode
+ if u then
+ for s in gmatch(u,"....") do
+ nofresult = nofresult + 1
+ result[nofresult] = utfchar(tonumber(s,16))
+ end
+ else
+ nofresult = nofresult + 1
+ result[nofresult] = utfchar(c)
+ end
+ else
+ nofresult = nofresult + 1
+ result[nofresult] = utfchar(c)
+ end
+ end
+ elseif id == disc_code then
+ result, nofresult = toutf(n.replace,result,nofresult) -- needed?
+ elseif id == hlist_code or id == vlist_code then
+--~ if nofresult > 0 and result[nofresult] ~= " " then
+--~ nofresult = nofresult + 1
+--~ result[nofresult] = " "
+--~ end
+ result, nofresult = toutf(n.list,result,nofresult)
+ elseif id == glue_code and n.subtype == userskip_code and n.spec.width > threshold then
+ if nofresult > 0 and result[nofresult] ~= " " then
+ nofresult = nofresult + 1
+ result[nofresult] = " "
+ end
+ elseif id == kern_code and n.kern > threshold then
+ if nofresult > 0 and result[nofresult] ~= " " then
+ nofresult = nofresult + 1
+ result[nofresult] = " "
+ end
+ end
+ if n == stopcriterium then
+ break
+ end
+ end
+ end
+ return result, nofresult
+end
+
+function nodes.toutf(list,stopcriterium)
+ local result, nofresult = toutf(list,{},0,stopcriterium)
+ return concat(result)
+end
+
+-- might move elsewhere
+
+local ptfactor = number.dimenfactors.pt
+local bpfactor = number.dimenfactors.bp
+local stripper = lpeg.patterns.stripzeros
+
+local points = function(n)
+ return lpegmatch(stripper,format("%.5fpt",n*ptfactor))
+end
+
+local basepoints = function(n)
+ return lpegmatch(stripper,format("%.5fbp",n*bpfactor))
+end
+
+number.points = points
+number.basepoints = basepoints
+
+--~ function nodes.thespec(s)
+--~ local stretch_order = s.stretch_order
+--~ local shrink_order = s.shrink_order
+--~ local stretch_unit = (stretch_order ~= 0) and ("fi".. string.rep("l",stretch_order)) or "sp"
+--~ local shrink_unit = (shrink_order ~= 0) and ("fi".. string.rep("l",shrink_order)) or "sp"
+--~ return string.format("%ssp+ %ssp - %ssp",s.width,s.stretch,stretch_unit,s.shrink,shrink_unit)
+--~ end
+
+local colors = { }
+tracers.colors = colors
+
+local get_attribute = node.has_attribute
+local set_attribute = node.set_attribute
+local unset_attribute = node.unset_attribute
+
+local attribute = attributes.private('color')
+local colormodel = attributes.private('colormodel')
+local mapping = attributes.list[attribute] or { }
+
+function colors.set(n,c,s)
+ local mc = mapping[c]
+ if not mc then
+ unset_attribute(n,attribute)
+ else
+ if not get_attribute(n,colormodel) then
+ set_attribute(n,colormodel,s or 1)
+ end
+ set_attribute(n,attribute,mc)
+ end
+end
+
+function colors.reset(n)
+ unset_attribute(n,attribute)
+end
diff --git a/Master/texmf-dist/tex/context/base/node-tsk.lua b/Master/texmf-dist/tex/context/base/node-tsk.lua
index 206b4a2668c..29a665ff031 100644
--- a/Master/texmf-dist/tex/context/base/node-tsk.lua
+++ b/Master/texmf-dist/tex/context/base/node-tsk.lua
@@ -6,88 +6,153 @@ if not modules then modules = { } end modules ['node-tsk'] = {
license = "see context related readme files"
}
--- this might move to task-*
+-- This might move to task-* and become less code as in sequencers
+-- we already have dirty flags as well. On the other hand, nodes are
+-- rather specialized and here we focus on node related tasks.
local trace_tasks = false trackers.register("tasks.creation", function(v) trace_tasks = v end)
-tasks = tasks or { }
-tasks.data = tasks.data or { }
+local report_tasks = logs.reporter("tasks")
-function tasks.new(name,list)
- local tasklist = sequencer.reset()
- tasks.data[name] = { list = tasklist, runner = false }
- for l=1,#list do
- sequencer.appendgroup(tasklist,list[l])
+local allocate = utilities.storage.allocate
+
+local nodes = nodes
+
+nodes.tasks = nodes.tasks or { }
+local tasks = nodes.tasks
+
+local tasksdata = { } -- no longer public
+
+local sequencers = utilities.sequencers
+
+local frozengroups = "no"
+
+function tasks.freeze(kind)
+ frozengroups = kind or "tolerant" -- todo: hook into jobname
+end
+
+function tasks.new(specification) -- was: name,arguments,list
+ local name = specification.name
+ local arguments = specification.arguments or 0
+ local sequence = specification.sequence
+ if name and sequence then
+ local tasklist = sequencers.reset()
+ tasksdata[name] = {
+ list = tasklist,
+ runner = false,
+ arguments = arguments,
+ -- sequence = sequence,
+ frozen = { },
+ }
+ for l=1,#sequence do
+ sequencers.appendgroup(tasklist,sequence[l])
+ end
+ end
+end
+
+local function valid(name)
+ local data = tasksdata[name]
+ if not data then
+ report_tasks("unknown task %s",name)
+ else
+ return data
+ end
+end
+
+local function validgroup(name,group,what)
+ local data = tasksdata[name]
+ if not data then
+ report_tasks("unknown task %s",name)
+ else
+ local frozen = data.frozen[group]
+ if frozen then
+ if frozengroup == "no" then
+ -- default
+ elseif frozengroup == "strict" then
+ report_tasks("warning: group %s of task %s is frozen, %s applied but not supported",group,name,what)
+ return
+ else -- if frozengroup == "tolerant" then
+ report_tasks("warning: group %s of task %s is frozen, %s ignored",group,name,what)
+ end
+ end
+ return data
+ end
+end
+
+function tasks.freezegroup(name,group)
+ local data = valid(name)
+ if data then
+ data.frozen[group] = true
end
end
function tasks.restart(name)
- local data = tasks.data[name]
+ local data = valid(name)
if data then
data.runner = false
end
end
function tasks.enableaction(name,action)
- local data = tasks.data[name]
+ local data = valid(name)
if data then
- sequencer.enableaction(data.list,action)
+ sequencers.enableaction(data.list,action)
data.runner = false
end
end
function tasks.disableaction(name,action)
- local data = tasks.data[name]
+ local data = valid(name)
if data then
- sequencer.disableaction(data.list,action)
+ sequencers.disableaction(data.list,action)
data.runner = false
end
end
function tasks.enablegroup(name,group)
- local data = tasks.data[name]
+ local data = validgroup(name,"enable group")
if data then
- sequencer.enablegroup(data.list,group)
+ sequencers.enablegroup(data.list,group)
data.runner = false
end
end
function tasks.disablegroup(name,group)
- local data = tasks.data[name]
+ local data = validgroup(name,"disable group")
if data then
- sequencer.disablegroup(data.list,group)
+ sequencers.disablegroup(data.list,group)
data.runner = false
end
end
function tasks.appendaction(name,group,action,where,kind)
- local data = tasks.data[name]
+ local data = validgroup(name,"append action")
if data then
- sequencer.appendaction(data.list,group,action,where,kind)
+ sequencers.appendaction(data.list,group,action,where,kind)
data.runner = false
end
end
function tasks.prependaction(name,group,action,where,kind)
- local data = tasks.data[name]
+ local data = validgroup(name,"prepend action")
if data then
- sequencer.prependaction(data.list,group,action,where,kind)
+ sequencers.prependaction(data.list,group,action,where,kind)
data.runner = false
end
end
function tasks.removeaction(name,group,action)
- local data = tasks.data[name]
+ local data = validgroup(name,"remove action")
if data then
- sequencer.removeaction(data.list,group,action)
+ sequencers.removeaction(data.list,group,action)
data.runner = false
end
end
function tasks.showactions(name,group,action,where,kind)
- local data = tasks.data[name]
+ local data = valid(name)
if data then
- logs.report("nodes","task %s, list:\n%s",name,sequencer.nodeprocessor(data.list))
+ report_tasks("task %s, list:\n%s",name,sequencers.nodeprocessor(data.list))
end
end
@@ -100,25 +165,26 @@ local created, total = 0, 0
statistics.register("node list callback tasks", function()
if total > 0 then
- return string.format("%s unique task lists, %s instances (re)created, %s calls",table.count(tasks.data),created,total)
+ return string.format("%s unique task lists, %s instances (re)created, %s calls",table.count(tasksdata),created,total)
else
return nil
end
end)
-local compile, nodeprocessor = sequencer.compile, sequencer.nodeprocessor
+local compile, nodeprocessor = sequencers.compile, sequencers.nodeprocessor
-function tasks.actions(name,n) -- we optimize for the number or arguments (no ...)
- local data = tasks.data[name]
+function tasks.actions(name) -- we optimize for the number or arguments (no ...)
+ local data = tasksdata[name]
if data then
+ local n = data.arguments or 0
if n == 0 then
return function(head)
- local runner = data.runner
total = total + 1 -- will go away
+ local runner = data.runner
if not runner then
created = created + 1
if trace_tasks then
- logs.report("nodes","creating task runner '%s'",name)
+ report_tasks("creating runner '%s'",name)
end
runner = compile(data.list,nodeprocessor,0)
data.runner = runner
@@ -132,7 +198,7 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no ..
if not runner then
created = created + 1
if trace_tasks then
- logs.report("nodes","creating task runner '%s' with 1 extra arguments",name)
+ report_tasks("creating runner '%s' with 1 extra arguments",name)
end
runner = compile(data.list,nodeprocessor,1)
data.runner = runner
@@ -146,7 +212,7 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no ..
if not runner then
created = created + 1
if trace_tasks then
- logs.report("nodes","creating task runner '%s' with 2 extra arguments",name)
+ report_tasks("creating runner '%s' with 2 extra arguments",name)
end
runner = compile(data.list,nodeprocessor,2)
data.runner = runner
@@ -160,7 +226,7 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no ..
if not runner then
created = created + 1
if trace_tasks then
- logs.report("nodes","creating task runner '%s' with 3 extra arguments",name)
+ report_tasks("creating runner '%s' with 3 extra arguments",name)
end
runner = compile(data.list,nodeprocessor,3)
data.runner = runner
@@ -174,7 +240,7 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no ..
if not runner then
created = created + 1
if trace_tasks then
- logs.report("nodes","creating task runner '%s' with 4 extra arguments",name)
+ report_tasks("creating runner '%s' with 4 extra arguments",name)
end
runner = compile(data.list,nodeprocessor,4)
data.runner = runner
@@ -188,7 +254,7 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no ..
if not runner then
created = created + 1
if trace_tasks then
- logs.report("nodes","creating task runner '%s' with 5 extra arguments",name)
+ report_tasks("creating runner '%s' with 5 extra arguments",name)
end
runner = compile(data.list,nodeprocessor,5)
data.runner = runner
@@ -202,7 +268,7 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no ..
if not runner then
created = created + 1
if trace_tasks then
- logs.report("nodes","creating task runner '%s' with n extra arguments",name)
+ report_tasks("creating runner '%s' with n extra arguments",name)
end
runner = compile(data.list,nodeprocessor,"n")
data.runner = runner
@@ -216,7 +282,7 @@ function tasks.actions(name,n) -- we optimize for the number or arguments (no ..
end
function tasks.table(name) --maybe move this to task-deb.lua
- local tsk = tasks.data[name]
+ local tsk = tasksdata[name]
local lst = tsk and tsk.list
local HL, NC, NR, bold, type = context.HL, context.NC, context.NR, context.bold, context.type
if lst then
@@ -242,9 +308,12 @@ function tasks.table(name) --maybe move this to task-deb.lua
end
end
-tasks.new (
- "processors",
- {
+-- this will move
+
+tasks.new {
+ name = "processors",
+ arguments = 4,
+ sequence = {
"before", -- for users
"normalizers",
"characters",
@@ -253,11 +322,12 @@ tasks.new (
"lists",
"after", -- for users
}
-)
+}
-tasks.new (
- "finalizers",
- {
+tasks.new {
+ name = "finalizers",
+ arguments = 1,
+ sequence = {
"before", -- for users
"normalizers",
-- "characters",
@@ -266,50 +336,55 @@ tasks.new (
"lists",
"after", -- for users
}
-)
+}
-tasks.new (
- "shipouts",
- {
+tasks.new {
+ name = "shipouts",
+ arguments = 0,
+ sequence = {
"before", -- for users
"normalizers",
"finishers",
"after", -- for users
}
-)
+}
-tasks.new (
- "mvlbuilders",
- {
+tasks.new {
+ name = "mvlbuilders",
+ arguments = 1,
+ sequence = {
"before", -- for users
"normalizers",
"after", -- for users
}
-)
+}
-tasks.new (
- "vboxbuilders",
- {
+tasks.new {
+ name = "vboxbuilders",
+ arguments = 5,
+ sequence = {
"before", -- for users
"normalizers",
"after", -- for users
}
-)
+}
---~ tasks.new (
---~ "parbuilders",
---~ {
+--~ tasks.new {
+--~ name = "parbuilders",
+--~ arguments = 1,
+--~ sequence = {
--~ "before", -- for users
--~ "lists",
--~ "after", -- for users
--~ }
---~ )
+--~ }
---~ tasks.new (
---~ "pagebuilders",
---~ {
+--~ tasks.new {
+--~ name = "pagebuilders",
+--~ arguments = 5,
+--~ sequence = {
--~ "before", -- for users
--~ "lists",
--~ "after", -- for users
--~ }
---~ )
+--~ }
diff --git a/Master/texmf-dist/tex/context/base/node-tst.lua b/Master/texmf-dist/tex/context/base/node-tst.lua
index d7ea96f26d9..bfe0051bdfd 100644
--- a/Master/texmf-dist/tex/context/base/node-tst.lua
+++ b/Master/texmf-dist/tex/context/base/node-tst.lua
@@ -6,29 +6,34 @@ if not modules then modules = { } end modules ['node-tst'] = {
license = "see context related readme files"
}
-local glue = node.id("glue")
-local penalty = node.id("penalty")
-local kern = node.id("kern")
-local glyph = node.id("glyph")
-local whatsit = node.id("whatsit")
-local hlist = node.id("hlist")
+local nodes, node = nodes, node
-local find_node_tail = node.tail or node.slide
+local chardata = characters.data
+local nodecodes = nodes.nodecodes
+local skipcodes = nodes.skipcodes
-local chardata = characters.data
+local glue_code = nodecodes.glue
+local penalty_code = nodecodes.penalty
+local kern_code = nodecodes.kern
+local glyph_code = nodecodes.glyph
+local whatsit_code = nodecodes.whatsit
+local hlist_code = nodecodes.hlist
-function nodes.the_left_margin(n) -- todo: three values
+local leftskip_code = skipcodes.leftskip
+local rightskip_code = skipcodes.rightskip
+local abovedisplayshortskip_code = skipcodes.abovedisplayshortskip
+local belowdisplayshortskip_code = skipcodes.belowdisplayshortskip
+
+local find_node_tail = node.tail or node.slide
+
+function nodes.leftmarginwidth(n) -- todo: three values
while n do
local id = n.id
- if id == glue then
- if n.subtype == 8 then -- 7 in c/web source
- return n.spec.width
- else
- return 0
- end
- elseif id == whatsit then
+ if id == glue_code then
+ return n.subtype == leftskip_code and n.spec.width or 0
+ elseif id == whatsit_code then
n = n.next
- elseif id == hlist then
+ elseif id == hlist_code then
return n.width
else
break
@@ -37,18 +42,14 @@ function nodes.the_left_margin(n) -- todo: three values
return 0
end
-function nodes.the_right_margin(n)
+function nodes.rightmarginwidth(n)
if n then
n = find_node_tail(n)
while n do
local id = n.id
- if id == glue then
- if n.subtype == 9 then -- 8 in the c/web source
- return n.spec.width
- else
- return 0
- end
- elseif id == whatsit then
+ if id == glue_code then
+ return n.subtype == rightskip_code and n.spec.width or 0
+ elseif id == whatsit_code then
n = n.prev
else
break
@@ -61,14 +62,14 @@ end
function nodes.somespace(n,all)
if n then
local id = n.id
- if id == glue then
- return (all or (n.spec.width ~= 0)) and glue
- elseif id == kern then
+ if id == glue_code then
+ return (all or (n.spec.width ~= 0)) and glue_code
+ elseif id == kern_code then
return (all or (n.kern ~= 0)) and kern
- elseif id == glyph then
+ elseif id == glyph_code then
local category = chardata[n.char].category
-- maybe more category checks are needed
- return (category == "zs") and glyph
+ return (category == "zs") and glyph_code
end
end
return false
@@ -77,7 +78,7 @@ end
function nodes.somepenalty(n,value)
if n then
local id = n.id
- if id == penalty then
+ if id == penalty_code then
if value then
return n.penalty == value
else
@@ -92,9 +93,9 @@ function nodes.is_display_math(head)
local n = head.prev
while n do
local id = n.id
- if id == penalty then
- elseif id == glue then
- if n.subtype == 6 then -- above_display_short_skip
+ if id == penalty_code then
+ elseif id == glue_code then
+ if n.subtype == abovedisplayshortskip_code then
return true
end
else
@@ -105,9 +106,9 @@ function nodes.is_display_math(head)
n = head.next
while n do
local id = n.id
- if id == penalty then
- elseif id == glue then
- if n.subtype == 7 then -- below_display_short_skip
+ if id == penalty_code then
+ elseif id == glue_code then
+ if n.subtype == belowdisplayshortskip_code then
return true
end
else
diff --git a/Master/texmf-dist/tex/context/base/node-typ.lua b/Master/texmf-dist/tex/context/base/node-typ.lua
index 5ab6b6975f4..684fc94ba6f 100644
--- a/Master/texmf-dist/tex/context/base/node-typ.lua
+++ b/Master/texmf-dist/tex/context/base/node-typ.lua
@@ -6,22 +6,25 @@ if not modules then modules = { } end modules ['node-typ'] = {
license = "see context related readme files"
}
--- this will be replaced by blob-ini cum suis so typesetting will go away
+-- this will be replaced by blob-ini cum suis so typesetters will go away
local utfvalues = string.utfvalues
-local newglyph = nodes.glyph
-local newglue = nodes.glue
+local hpack = node.hpack
+local vpack = node.vpack
-local hpack, vpack = node.hpack, node.vpack
+local nodepool = nodes.pool
-typesetting = typesetting or { }
+local new_glyph = nodepool.glyph
+local new_glue = nodepool.glue
+
+typesetters = typesetters or { }
local function tonodes(str,fontid,spacing) -- don't use this
local head, prev = nil, nil
for s in utfvalues(str) do
local next
- if spacing and s == 32 then
+ if spacing and s == 32 then
next = newglue(spacing or 64*1024*10)
else
next = newglyph(fontid or 1,s)
@@ -37,17 +40,17 @@ local function tonodes(str,fontid,spacing) -- don't use this
return head
end
-typesetting.tonodes = tonodes
+typesetters.tonodes = tonodes
-function typesetting.hpack(str,fontid,spacing)
+function typesetters.hpack(str,fontid,spacing)
return hpack(tonodes(str,fontid,spacing))
end
-function typesetting.vpack(str,fontid,spacing)
+function typesetters.vpack(str,fontid,spacing)
-- vpack is just a hack, and a proper implentation is on the agenda
-- as it needs more info etc than currently available
return vpack(tonodes(str,fontid,spacing))
end
---~ node.write(typesetting.hpack("Hello World!"))
---~ node.write(typesetting.hpack("Hello World!",1,100*1024*10))
+--~ node.write(typesetters.hpack("Hello World!"))
+--~ node.write(typesetters.hpack("Hello World!",1,100*1024*10))
diff --git a/Master/texmf-dist/tex/context/base/norm-alo.tex b/Master/texmf-dist/tex/context/base/norm-alo.mkii
index d47f49037d7..d47f49037d7 100644
--- a/Master/texmf-dist/tex/context/base/norm-alo.tex
+++ b/Master/texmf-dist/tex/context/base/norm-alo.mkii
diff --git a/Master/texmf-dist/tex/context/base/norm-ctx.tex b/Master/texmf-dist/tex/context/base/norm-ctx.mkii
index 707705d89eb..707705d89eb 100644
--- a/Master/texmf-dist/tex/context/base/norm-ctx.tex
+++ b/Master/texmf-dist/tex/context/base/norm-ctx.mkii
diff --git a/Master/texmf-dist/tex/context/base/norm-ctx.mkiv b/Master/texmf-dist/tex/context/base/norm-ctx.mkiv
new file mode 100644
index 00000000000..707705d89eb
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/norm-ctx.mkiv
@@ -0,0 +1,16 @@
+%D \module
+%D [ file=norm-ctx,
+%D version=2009.03.19,
+%D title=\CONTEXT\ Norm Macros,
+%D subtitle=\ALEPH\ and \OMEGA,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%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 A few more might end up here (like the weird ones in syst-ini).
+
+\let\normalreqno = \normaleqno
diff --git a/Master/texmf-dist/tex/context/base/norm-etx.tex b/Master/texmf-dist/tex/context/base/norm-etx.mkii
index 3edd8e7ef1f..3edd8e7ef1f 100644
--- a/Master/texmf-dist/tex/context/base/norm-etx.tex
+++ b/Master/texmf-dist/tex/context/base/norm-etx.mkii
diff --git a/Master/texmf-dist/tex/context/base/norm-ltx.tex b/Master/texmf-dist/tex/context/base/norm-ltx.mkii
index a779735dd53..a779735dd53 100644
--- a/Master/texmf-dist/tex/context/base/norm-ltx.tex
+++ b/Master/texmf-dist/tex/context/base/norm-ltx.mkii
diff --git a/Master/texmf-dist/tex/context/base/norm-ptx.tex b/Master/texmf-dist/tex/context/base/norm-ptx.mkii
index 8f911d874b6..352a884f014 100644
--- a/Master/texmf-dist/tex/context/base/norm-ptx.tex
+++ b/Master/texmf-dist/tex/context/base/norm-ptx.mkii
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D Eventually most of these will be disabled in \MKIV.
+
\let \normalefcode = \efcode
\let \normalexpanded = \expanded
\let \normalifincsname = \ifincsname
diff --git a/Master/texmf-dist/tex/context/base/norm-tex.tex b/Master/texmf-dist/tex/context/base/norm-tex.mkii
index 61f9740efe4..61f9740efe4 100644
--- a/Master/texmf-dist/tex/context/base/norm-tex.tex
+++ b/Master/texmf-dist/tex/context/base/norm-tex.mkii
diff --git a/Master/texmf-dist/tex/context/base/norm-xtx.tex b/Master/texmf-dist/tex/context/base/norm-xtx.mkii
index 3da94465624..3da94465624 100644
--- a/Master/texmf-dist/tex/context/base/norm-xtx.tex
+++ b/Master/texmf-dist/tex/context/base/norm-xtx.mkii
diff --git a/Master/texmf-dist/tex/context/base/pack-box.mkii b/Master/texmf-dist/tex/context/base/pack-box.mkii
index 8adeedb91b5..f27d8b4fd83 100644
--- a/Master/texmf-dist/tex/context/base/pack-box.mkii
+++ b/Master/texmf-dist/tex/context/base/pack-box.mkii
@@ -447,7 +447,6 @@
\def\bleed
{\dosingleempty\dobleed}
-
\def\bleedwidth {\the\hsize}%
\def\bleedheight{\the\vsize}%
@@ -478,12 +477,13 @@
rt=>\!!donebtrue\!!donectrue]%
\doifelse\@@bgstretch\v!yes\donetrue\donefalse
\scratchdimen\@@bgwidth
+ \edef\currentbgposition {\??bg:\number\nofbleeds}%
+ \edef\currentpageposition{page:0}% todo: per page
\ifdone
\if!!donea
- \advance\scratchdimen\MPx{\??bg:\number\nofbleeds}%
+ \advance\scratchdimen\dimexpr \MPx\currentbgposition-\MPx\currentpageposition\relax
\else\if!!doneb
- \scratchdimen\paperwidth
- \advance\scratchdimen-\MPx{\??bg:\number\nofbleeds}%
+ \scratchdimen\dimexpr\paperwidth-\MPx\currentbgposition-\MPx\currentpageposition\relax % not checked
\fi\fi
\fi
\advance\scratchdimen\@@bghoffset
@@ -491,10 +491,9 @@
\scratchdimen\@@bgheight
\ifdone
\if!!donec
- \scratchdimen\paperheight
- \advance\scratchdimen-\MPy{\??bg:\number\nofbleeds}%
+ \scratchdimen\dimexpr\paperheight-\MPy\currentbgposition-\MPy\currentpageposition\relax % not checked
\else\if!!doned
- \advance\scratchdimen\MPy{\??bg:\number\nofbleeds}%
+ \advance\scratchdimen\dimexpr \MPy\currentbgposition-\MPy\currentpageposition\relax % not checked
\fi\fi
\fi
\advance\scratchdimen\@@bgvoffset
@@ -514,7 +513,7 @@
\ht\scratchbox\@@bgheight
\dp\scratchbox\zeropoint
\ifdone
- \hpos{\??bg:\number\nofbleeds}{\box\scratchbox}%
+ \hpos\currentbgposition{\box\scratchbox}%
\else
\box\scratchbox
\fi
diff --git a/Master/texmf-dist/tex/context/base/pack-box.mkiv b/Master/texmf-dist/tex/context/base/pack-box.mkiv
index 6cb492aa6df..fa771b4855a 100644
--- a/Master/texmf-dist/tex/context/base/pack-box.mkiv
+++ b/Master/texmf-dist/tex/context/base/pack-box.mkiv
@@ -82,7 +82,7 @@
{\dowithnextbox
{\bgroup
\checktextbackgrounds
- \setbox\scratchbox\null
+ \setbox\scratchbox\emptyhbox
\wd\scratchbox\nextboxwd
\ht\scratchbox\nextboxht
\dp\scratchbox\nextboxdp
@@ -443,10 +443,9 @@
\c!voffset=\@@bgoffset,
\c!hoffset=\@@bgoffset]
-\def\bleed
+\unexpanded\def\bleed
{\dosingleempty\dobleed}
-
\def\bleedwidth {\the\hsize}%
\def\bleedheight{\the\vsize}%
@@ -477,12 +476,13 @@
rt=>\!!donebtrue\!!donectrue]%
\doifelse\@@bgstretch\v!yes\donetrue\donefalse
\scratchdimen\@@bgwidth
+ \edef\currentbgposition {\??bg:\number\nofbleeds}%
+ \edef\currentpageposition{page:0}% todo: per page
\ifdone
\if!!donea
- \advance\scratchdimen\MPx{\??bg:\number\nofbleeds}%
+ \advance\scratchdimen\dimexpr \MPx\currentbgposition-\MPx\currentpageposition\relax
\else\if!!doneb
- \scratchdimen\paperwidth
- \advance\scratchdimen-\MPx{\??bg:\number\nofbleeds}%
+ \scratchdimen\dimexpr\paperwidth-\MPx\currentbgposition+\MPx\currentpageposition\relax % not checked
\fi\fi
\fi
\advance\scratchdimen\@@bghoffset
@@ -490,17 +490,21 @@
\scratchdimen\@@bgheight
\ifdone
\if!!donec
- \scratchdimen\paperheight
- \advance\scratchdimen-\MPy{\??bg:\number\nofbleeds}%
+ \scratchdimen\dimexpr\paperheight-\MPy\currentbgposition+\MPy\currentpageposition\relax % not checked
\else\if!!doned
- \advance\scratchdimen\MPy{\??bg:\number\nofbleeds}%
+ \advance\scratchdimen\dimexpr \MPy\currentbgposition-\MPy\currentpageposition\relax % not checked
\fi\fi
\fi
\advance\scratchdimen\@@bgvoffset
\xdef\bleedheight{\the\scratchdimen}%
+ %
+ \bgroup
\hsize\bleedwidth
\vsize\bleedheight
- \setbox\scratchbox\hbox{#2}%
+ \global\setbox\globalscratchbox\hbox{#2}%
+ \egroup
+ \setbox\scratchbox\box\globalscratchbox
+ %
\doif\@@bgpage\v!yes
{\setbox\scratchbox\topskippedbox{\box\scratchbox}}%
\setbox\scratchbox\hbox to \@@bgwidth
@@ -513,7 +517,7 @@
\ht\scratchbox\@@bgheight
\dp\scratchbox\zeropoint
\ifdone
- \hpos{\??bg:\number\nofbleeds}{\box\scratchbox}%
+ \hpos\currentbgposition{\box\scratchbox}%
\else
\box\scratchbox
\fi
@@ -521,7 +525,7 @@
\setupbleeding[\c!stretch=\v!yes]
-\defineexternalfigure[bleed][\c!width=\bleedwidth,\c!height=\bleedheight]
+\defineexternalfigure[bleed][\c!width=\bleedwidth,\c!height=\bleedheight] % should be \v!bleed
% \placefigure[left]{none}
% {\bleed[width=5cm,height=3cm,location=lt]{\externalfigure[koe][bleed]}}
@@ -900,7 +904,7 @@
[\c!width=\zeropoint,%
\c!height=\zeropoint,%
\c!depth=\zeropoint,#1]%
- \setbox\scratchbox\null
+ \setbox\scratchbox\emptyhbox
\wd\scratchbox\@@olwidth
\ht\scratchbox\@@olheight
\dp\scratchbox\@@oldepth
diff --git a/Master/texmf-dist/tex/context/base/pack-lyr.mkiv b/Master/texmf-dist/tex/context/base/pack-lyr.mkiv
index 0cb3ee24456..5242b56de21 100644
--- a/Master/texmf-dist/tex/context/base/pack-lyr.mkiv
+++ b/Master/texmf-dist/tex/context/base/pack-lyr.mkiv
@@ -140,15 +140,6 @@
\def\setlayer
{\dotripleempty\dosetlayer}
-% \def\dosetlayer[#1][#2][#3]% #4 == box do \fi is ok
-% {\doifelsevalue{\??ll#1\c!state}\v!stop
-% {\dowithnextbox\donothing\hbox}
-% {\ifthirdargument
-% \dodosetlayer[#1][#2][#3]%
-% \else
-% \dodosetlayer[#1][][#2]%
-% \fi}}
-
\def\dosetlayer[#1][#2][#3]% #4 == box do \fi is ok
{\doifelsevalue{\??ll#1\c!state}\v!stop
{\dowithnextbox\donothing\hbox}
@@ -237,8 +228,6 @@
\newdimen\layerwidth
\newdimen\layerheight
-\chardef\@@lacome=1 % LAyerCOnstructionMEthod / temp, will be default
-
\def\dododosetlayer[#1][#2][#3]% will be sped up
{% we use the global width, never change this
\def\currentlayer{#1}%
@@ -343,20 +332,16 @@
\ifdim\scratchdimen<\getboxllx\layerpagebox
\gsetboxllx\layerpagebox\scratchdimen
\fi
- \ifcase\@@lacome\or % this test will become obsolete
- \advance\scratchdimen\nextboxwd
- \nextboxwd\ifdim\scratchdimen>\lastlayerwidth \scratchdimen \else \lastlayerwidth \fi
- \fi
+ \advance\scratchdimen\nextboxwd
+ \nextboxwd\ifdim\scratchdimen>\lastlayerwidth \scratchdimen \else \lastlayerwidth \fi
\scratchdimen\dimexpr\@@layerypos+\@@layeryoff\relax
\ifdim\scratchdimen<\getboxlly\layerpagebox
\gsetboxlly\layerpagebox\scratchdimen
\fi
% ll compensation
- \ifcase\@@lacome\or % this test will become obsolete
- \advance\scratchdimen\dimexpr\nextboxht+\nextboxdp\relax
- \nextboxht\ifdim\scratchdimen>\lastlayerheight \scratchdimen \else \lastlayerheight \fi
- \nextboxdp\zeropoint
- \fi
+ \advance\scratchdimen\dimexpr\nextboxht+\nextboxdp\relax
+ \nextboxht\ifdim\scratchdimen>\lastlayerheight \scratchdimen \else \lastlayerheight \fi
+ \nextboxdp\zeropoint
% placement
\hsize\layerparameter\c!width % new, keep box small
\vbox to \layerparameter\c!height \bgroup
@@ -430,20 +415,6 @@
% todo: setups before flush, handy hook
-% \unexpanded\def\flushlayer[#1]%
-% {\doifelsevalue{\??ll#1\c!state}\v!next
-% {\global\letvalue{\??ll#1\c!state}\v!start} % dangerous, stack-built-up
-% {\doifelsevalue{\??ll#1\c!state}\v!continue
-% {\global\letvalue{\??ll#1\c!state}\v!repeat} % dangerous, stack-built-up
-% {\doifelsevalue{\??ll#1\c!doublesided}\v!yes
-% {\doifundefinedelse{\@@layerbox#1}%
-% {\dodoflushlayerA[#1]}
-% {\doifbothsidesoverruled
-% {\dodoflushlayerB\v!left [#1]}% left
-% {\dodoflushlayerB\v!right[#1]}% right
-% {\dodoflushlayerB\v!left [#1]}}}% left
-% {\dodoflushlayerA[#1]}}}}
-
\unexpanded\def\flushlayer[#1]% quite core, so optimized
{\begingroup
\forgetall
@@ -645,121 +616,10 @@
[\c!background={\v!foreground,#1},
\c!frame=\v!off,
\c!offset=\v!overlay,#2]}
-
-% The next mechanism is obsolete and will be removed in \MKIV\ (or move to
-% the compatibility module.
-
-\newskip\xposition \newskip\yposition
-\newskip\xdimension \newskip\ydimension
-\newskip\xoffset \newskip\yoffset
-
-% already defined \newbox\positionbox
-
-\unexpanded\def\startpositioning
- {\bgroup
- \xposition \zeropoint \yposition \zeropoint
- \xdimension\zeropoint \ydimension\zeropoint
- \xoffset \zeropoint \yoffset \zeropoint
- \hfuzz \paperwidth \vfuzz \paperheight
- \setbox\positionbox\hbox\bgroup}
-
-\unexpanded\def\stoppositioning
- {\doifnot\@@psoffset\v!yes
- {\global\xoffset\zeropoint
- \global\yoffset\zeropoint}%
- \global\advance\xdimension \xoffset
- \global\advance\ydimension \yoffset
- \egroup
- \vbox to \ydimension
- {\vskip\yoffset
- \hbox to \xdimension
- {\hskip\xoffset
- \box\positionbox
- \hfill}
- \vfill}%
- \egroup}
-
-\def\resetpositioning
- {\getparameters[\??ps]
- [\c!state=\v!start,%
- \c!unit=\s!cm,%
- \c!factor=1,%
- \c!scale=1,%
- \c!xfactor=\@@psfactor,%
- \c!yfactor=\@@psfactor,%
- \c!xscale=\@@psscale,%
- \c!yscale=\@@psscale,%
- \c!xstep=\v!absolute,%
- \c!ystep=\v!absolute,%
- \c!xoffset=\!!zeropoint,%
- \c!yoffset=\!!zeropoint]}
-
-\unexpanded\def\setuppositioning
- {\resetpositioning
- \dodoubleargument\getparameters[\??ps]}
-
-\def\calculateposition#1#2#3#4#5#6#7#8#9%
- {\setdimensionwithunit\scratchskip{#1}\@@psunit
- \scratchskip#8\scratchskip
- \scratchskip#9\scratchskip
- \advance\scratchskip #4\relax
- \doif{#2}\v!relative
- {\advance\scratchskip #3%
- \let#4\!!zeropoint}%
- #3\scratchskip\relax
- \doifnot\@@psstate\v!overlay
- {\scratchskip#5\relax
- \advance\scratchskip #3\relax
- \ifdim#3<-#7\relax \global#7-#3\relax \fi
- \ifdim\scratchskip>#6\relax \global#6\scratchskip\relax \fi}}
-
-\def\position
- {\dosingleempty\doposition}
-
-\def\doposition[#1]#2(#3,#4)%
- {\dowithnextbox
- {\bgroup
- \getparameters[\??ps][#1]%
- \dontcomplain
- \calculateposition{#3}\@@psxstep\xposition
- \@@psxoffset{\nextboxwd}\xdimension\xoffset
- \@@psxscale\@@psxfactor
- \scratchdimen\nextboxht \advance\scratchdimen \nextboxdp
- \calculateposition{#4}\@@psystep\yposition
- \@@psyoffset\scratchdimen\ydimension\yoffset
- \@@psyscale\@@psyfactor
- \vbox to \zeropoint % kan beter.
- {\vskip\yposition
- \hbox to \zeropoint
- {\hskip\xposition
- \flushnextbox
- \hss}
- \vss}%
- \xdef\dopoppositioning
- {\xposition\the\xposition
- \yposition\the\yposition
- \noexpand\def\noexpand\@@psxoffset{\@@psxoffset}%
- \noexpand\def\noexpand\@@psyoffset{\@@psyoffset}}%
- \egroup
- \dopoppositioning
- \ignorespaces}
- \hbox}
-
-\resetpositioning
-
-\setuppositioning
- [\c!unit=\s!cm,
- \c!factor=1,
- \c!scale=1,
- \c!xstep=\v!absolute,
- \c!ystep=\v!absolute,
- \c!offset=\v!yes,
- \c!xoffset=\!!zeropoint,
- \c!yoffset=\!!zeropoint]
%D Watch out, a redefinition:
-\ifx\settextpagecontent\undefined \writestatus\m!systems{error in page-lyr.tex} \wait \fi
+\ifx\settextpagecontent\undefined \writestatus\m!system{error in page-lyr.tex} \wait \fi
\let\normalsettextpagecontent\settextpagecontent
diff --git a/Master/texmf-dist/tex/context/base/pack-mis.mkvi b/Master/texmf-dist/tex/context/base/pack-mis.mkvi
new file mode 100644
index 00000000000..ab6d2b3343d
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/pack-mis.mkvi
@@ -0,0 +1,84 @@
+%D \module
+%D [ file=pack-mis, % moved from e.g. core-mis
+%D version=1998.01.29,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Miscelaneous,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Packing Macros / Misc Commands}
+
+\unprotect
+
+% a quite old mechanism already (but inheritance added)
+%
+% \defineplacement[name][settings]
+% \setupplacement [name][settings]
+% \placement [name][settings]
+% \place<name> [settings]
+
+\installcommandhandler \??pl {placement} \??pl
+
+\appendtoks
+ \setuevalue{\e!place\currentplacement}{\pack_placement{\currentplacement}}%
+\to \everydefineplacement
+
+\setupplacement
+ [\c!left=\hss,
+ \c!right=\hss,
+ \c!linecorrection=\v!off,
+ \c!depthcorrection=\v!off,
+ \c!grid=\v!middle,
+ %\c!before=,
+ %\c!after=,
+ \c!margin=\v!standard]
+
+\unexpanded\def\placement[#tag]%
+ {\pack_placement{#tag}}
+
+\unexpanded\def\pack_placement#tag%
+ {\bgroup
+ \edef\currentplacement{#tag}%
+ \dosingleempty\pack_placement_indeed}
+
+\def\pack_placement_indeed[#settings]% set test can be sped up but non critical
+ {\iffirstargument
+ \setupcurrentplacement[#settings]%
+ \fi
+ \dowithnextboxcontent{\forgetall}{\pack_placement_flush\egroup}\vbox}
+
+\def\pack_placement_flush
+ {\setlocalhsize
+ \placementparameter\c!before
+ \begingroup
+ \disableparpositions
+ \setbox\nextbox\hbox to \localhsize
+ {\placementparameter\c!left
+ \flushnextbox
+ \placementparameter\c!right}%
+ \ifinsidefloat \else
+ \addlocalbackgroundtobox\nextbox
+ \fi
+ \ifgridsnapping
+ \doifinset{\placementparameter\c!margin}{\v!standard,\v!yes}\noindent % unchecked
+ \doifelsenothing{\placementparameter\c!grid}
+ {\snaptogrid[\v!middle]}
+ {\snaptogrid[\placementparameter\c!grid]}%
+ \hbox{\flushnextbox}%
+ \else
+ \doif{\placementparameter\c!linecorrection}\v!on \startbaselinecorrection
+ \doifinset{\placementparameter\c!margin}{\v!standard,\v!yes}\noindent
+ \flushnextbox
+ \doif{\placementparameter\c!depthcorrection}\v!on\baselinecorrection
+ \doif{\placementparameter\c!linecorrection }\v!on\stopbaselinecorrection
+ \fi
+ \endgroup
+ \placementparameter\c!after}
+
+\protect \endinput
+
diff --git a/Master/texmf-dist/tex/context/base/pack-obj.lua b/Master/texmf-dist/tex/context/base/pack-obj.lua
index 0ee46fc99d1..2dabfa7846a 100644
--- a/Master/texmf-dist/tex/context/base/pack-obj.lua
+++ b/Master/texmf-dist/tex/context/base/pack-obj.lua
@@ -12,18 +12,24 @@ reusable components.</p>
--ldx]]--
local texsprint, texcount = tex.sprint, tex.count
+local allocate = utilities.storage.allocate
-jobobjects = jobobjects or { }
-jobobjects.collected = jobobjects.collected or { }
-jobobjects.tobesaved = jobobjects.tobesaved or { }
+local collected = allocate()
+local tobesaved = allocate()
-local collected, tobesaved = jobobjects.collected, jobobjects.tobesaved
+local jobobjects = {
+ collected = collected,
+ tobesaved = tobesaved,
+}
+
+job.objects = jobobjects
local function initializer()
- collected, tobesaved = jobobjects.collected, jobobjects.tobesaved
+ collected = jobobjects.collected
+ tobesaved = jobobjects.tobesaved
end
-job.register('jobobjects.collected', jobobjects.tobesaved, initializer, nil)
+job.register('job.objects.collected', tobesaved, initializer, nil)
function jobobjects.save(tag,number,page)
local t = { number, page }
diff --git a/Master/texmf-dist/tex/context/base/pack-obj.mkiv b/Master/texmf-dist/tex/context/base/pack-obj.mkiv
index 81220e32437..3d87f52b57d 100644
--- a/Master/texmf-dist/tex/context/base/pack-obj.mkiv
+++ b/Master/texmf-dist/tex/context/base/pack-obj.mkiv
@@ -41,7 +41,7 @@
% function objects.register(name)
% objects.n = objects.n + 1
% local list = texbox.objectbox
-% nodes.process_page(list)
+% nodes.handlers.finalize(list)
% data[name] = {
% codeinjections.restore(list),
% texdimen.objectwd,
@@ -90,6 +90,8 @@
% end
% \stopluacode
%
+% \unprotect
+%
% \newbox \objectbox
% \newtoks \everyobject
% \newif \ifinobject
@@ -101,7 +103,7 @@
%
% \def\objectoffset{1cm}
%
-% \everyobject{\the\everyPDFxform}
+% \everyobject{\the\pdfbackendeveryxform}
%
% \let\doresetobjects\relax
%
@@ -263,25 +265,55 @@
{\globalpopmacro\crossreferenceobject
\dododosetobject{#1}{#2}{#3}\egroup}}
-\def\dododosetobject#1#2#3%
- {\begingroup
- \dontshowcomposition % rather fuzzy in \setxvalue ... \hbox
- \scratchdimen\objectoffset
- \@EA\xdef\csname\r!object#2::#3\endcsname
- {\noexpand\dohandleobject{#2}{#3}%
- {\ifhbox\nextbox\hbox\else\vbox\fi}%
- {\number\nextboxwd}{\number\nextboxht}{\number\nextboxdp}%
- {\number\scratchdimen}}%
- \expanded % freeze the dimensions since \dostartobject may use \nextbox
- {\dostartobject{#2}{#3}{\the\nextboxwd}{\the\nextboxht}{\the\nextboxdp}}%
- \ifcase#1\relax\else \ifdim\objectoffset>\zeropoint
- \setbox\nextbox\vbox spread 2\scratchdimen
- {\forgetall \offinterlineskip
- \vss\hbox spread 2\scratchdimen{\hss\flushnextbox\hss}\vss}%
- \fi \fi
- \flushnextbox
- \dostopobject
- \endgroup}
+\ifnum\luatexversion<66
+
+ \def\dododosetobject#1#2#3% this is a hack: luatex adds 1bp around each side
+ {\begingroup
+ \dontshowcomposition % rather fuzzy in \setxvalue ... \hbox
+ \ifcase#1\relax
+ \scratchdimen-\onebasepoint % compensates auto 1 bp
+ \else\ifdim\objectoffset>\zeropoint
+ \scratchdimen \objectoffset
+ \else
+ \scratchdimen-\onebasepoint % compensates auto 1 bp
+ \fi\fi
+ \@EA\xdef\csname\r!object#2::#3\endcsname
+ {\noexpand\dohandleobject{#2}{#3}%
+ {\ifhbox\nextbox\hbox\else\vbox\fi}%
+ {\number\nextboxwd}{\number\nextboxht}{\number\nextboxdp}%
+ {\number\scratchdimen}}%
+ \expanded % freeze the dimensions since \dostartobject may use \nextbox
+ {\dostartobject{#2}{#3}{\the\nextboxwd}{\the\nextboxht}{\the\nextboxdp}}%
+ \setbox\nextbox\vbox spread 2\scratchdimen
+ {\forgetall \offinterlineskip
+ \vss\hbox spread 2\scratchdimen{\hss\flushnextbox\hss}\vss}%
+ \flushnextbox
+ \dostopobject
+ \endgroup}
+
+\else
+
+ \def\dododosetobject#1#2#3%
+ {\begingroup
+ \dontshowcomposition % rather fuzzy in \setxvalue ... \hbox
+ \scratchdimen\objectoffset
+ \@EA\xdef\csname\r!object#2::#3\endcsname
+ {\noexpand\dohandleobject{#2}{#3}%
+ {\ifhbox\nextbox\hbox\else\vbox\fi}%
+ {\number\nextboxwd}{\number\nextboxht}{\number\nextboxdp}%
+ {\number\scratchdimen}}%
+ \expanded % freeze the dimensions since \dostartobject may use \nextbox
+ {\dostartobject{#2}{#3}{\the\nextboxwd}{\the\nextboxht}{\the\nextboxdp}}%
+ \ifcase#1\relax\else \ifdim\objectoffset>\zeropoint
+ \setbox\nextbox\vbox spread 2\scratchdimen
+ {\forgetall \offinterlineskip
+ \vss\hbox spread 2\scratchdimen{\hss\flushnextbox\hss}\vss}%
+ \fi \fi
+ \flushnextbox
+ \dostopobject
+ \endgroup}
+
+\fi
\def\getobject#1#2%
{\begingroup
@@ -353,8 +385,8 @@
% no undefined test ! ! ! ! (pdftex fails on undefined objects)
-\def\doregisterobjectreference#1#2#3{\normalexpanded{\noexpand\ctxlatelua{jobobjects.save("#1::#2",#3,\noexpand\the\realpageno)}}}
-\def\dooverloadobjectreference#1#2#3{\ctxlua{jobobjects.set("#1::#2",#3,\the\realpageno)}}
+\def\doregisterobjectreference#1#2#3{\normalexpanded{\noexpand\ctxlatelua{job.objects.save("#1::#2",#3,\noexpand\the\realpageno)}}}
+\def\dooverloadobjectreference#1#2#3{\ctxlua{job.objects.set("#1::#2",#3,\the\realpageno)}}
\def\dosetobjectreference
{\ifcase\crossreferenceobject
@@ -370,8 +402,8 @@
\def\defaultobjectreference#1#2{0} % driver dependent
\def\defaultobjectpage #1#2{\realfolio}
-\def\dogetobjectreference #1#2#3{\xdef#3{\ctxlua{jobobjects.number("#1::#2","\defaultobjectreference{#1}{#2}")}}}
-\def\dogetobjectreferencepage#1#2#3{\xdef#3{\ctxlua{jobobjects.page("#1::#2","\defaultobjectpage{#1}{#2}")}}}
+\def\dogetobjectreference #1#2#3{\xdef#3{\ctxlua{job.objects.number("#1::#2","\defaultobjectreference{#1}{#2}")}}}
+\def\dogetobjectreferencepage#1#2#3{\xdef#3{\ctxlua{job.objects.page("#1::#2","\defaultobjectpage{#1}{#2}")}}}
\def\setobject {\driverreferenced\dosetobject1}
\def\settightobject{\driverreferenced\dosetobject0}
@@ -394,6 +426,6 @@
\expandafter\secondoftwoarguments
\fi}
-\def\doifobjectreferencefoundelse#1#2{\ctxlua{jobobjects.doifelse("#1::#2")}}
+\def\doifobjectreferencefoundelse#1#2{\ctxlua{job.objects.doifelse("#1::#2")}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/pack-pos.mkiv b/Master/texmf-dist/tex/context/base/pack-pos.mkiv
new file mode 100644
index 00000000000..42a80b5ae27
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/pack-pos.mkiv
@@ -0,0 +1,151 @@
+%D \module
+%D [ file=pack-pos,
+%D version=2010.11.17 % real old code, updated a bit
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Positioning,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%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 Packaging Macros / Positioning}
+
+\unprotect
+
+% An old but still usefull mechanism (updated in mkiv):
+%
+% \ruledvbox{\startpositioning
+% \position(1,1){test}
+% \position[xstep=relative](1,1){test}
+% \position[ystep=relative](3,-1){test}
+% \position(10,10){test}
+% \stoppositioning}
+
+\newdimen\positioningxposition \newdimen\positioningyposition
+\newdimen\positioningxdimension \newdimen\positioningydimension
+\newdimen\positioningxoffset \newdimen\positioningyoffset
+
+\newbox\positioningbox
+
+\unexpanded\def\startpositioning
+ {\dosingleempty\dostartpositioning}
+
+\def\dostartpositioning[#1]%
+ {\bgroup
+ \getparameters[\??ps][#1]%
+ \positioningxposition \zeropoint \positioningyposition \zeropoint
+ \positioningxdimension\zeropoint \positioningydimension\zeropoint
+ \positioningxoffset \zeropoint \positioningyoffset \zeropoint
+ \hfuzz \paperwidth \vfuzz \paperheight
+ \setbox\positioningbox\hbox\bgroup
+ \ignorespaces}
+
+\unexpanded\def\stoppositioning
+ {\removeunwantedspaces
+ \doifnot\@@psoffset\v!yes
+ {\global\positioningxoffset\zeropoint
+ \global\positioningyoffset\zeropoint}%
+ \global\advance\positioningxdimension \positioningxoffset
+ \global\advance\positioningydimension \positioningyoffset
+ \egroup
+ \vbox to \positioningydimension
+ {\vskip\positioningyoffset
+ \hbox to \positioningxdimension
+ {\hskip\positioningxoffset
+ \box\positioningbox
+ \hfill}
+ \vfill}%
+ \egroup}
+
+% \def\resetpositioning
+% {\getparameters[\??ps]
+% [\c!state=\v!start,
+% \c!unit=\s!cm,
+% \c!factor=\plusone,
+% \c!scale=\plusone,
+% \c!xfactor=\@@psfactor,
+% \c!yfactor=\@@psfactor,
+% \c!xscale=\@@psscale,
+% \c!yscale=\@@psscale,
+% \c!xstep=\v!absolute,
+% \c!ystep=\v!absolute,
+% \c!xoffset=\zeropoint,
+% \c!yoffset=\zeropoint]}
+
+\def\resetpositioning
+ {\let\@@psstate \v!start
+ \let\@@psunit \s!cm
+ \let\@@psfactor \plusone
+ \let\@@psscale \plusone
+ \def\@@psxfactor{\@@psfactor}%
+ \def\@@psyfactor{\@@psfactor}%
+ \def\@@psxscale {\@@psscale}%
+ \def\@@psyscale {\@@psscale}%
+ \let\@@psxstep \v!absolute
+ \let\@@psystep \v!absolute
+ \let\@@psxoffset \zeropoint
+ \let\@@psyoffset \zeropoint}
+
+\resetpositioning
+
+\unexpanded\def\setuppositioning
+ {\resetpositioning
+ \dodoubleargument\getparameters[\??ps]}
+
+\def\calculateposition#1#2#3#4#5#6#7#8#9%
+ {\setdimensionwithunit\scratchdimen{#1}\@@psunit
+ \scratchdimen#8\scratchdimen
+ \scratchdimen#9\scratchdimen
+ \advance\scratchdimen #4\relax
+ % == \scratchdimen\dimexpr#8\dimexpr#9\scratchdimen\relax+#4\relax
+ \doif{#2}\v!relative
+ {\advance\scratchdimen#3%
+ \let#4\zeropoint}%
+ #3\scratchdimen
+ \doifnot\@@psstate\v!overlay
+ {\scratchdimen\dimexpr#5+#3\relax
+ \ifdim #3<-#7\relax \global#7-#3\relax \fi
+ \ifdim\scratchdimen> #6\relax \global#6\scratchdimen\fi}}
+
+\def\position
+ {\dosingleempty\doposition}
+
+\def\doposition[#1]#2(#3,#4)%
+ {\removeunwantedspaces
+ \dowithnextbox{\dodoposition{#1}{#2}{#3}{#4}}\hbox}
+
+\def\dodoposition#1#2#3#4%
+ {\bgroup
+ \dontcomplain
+ \getparameters[\??ps][#1]%
+ \calculateposition{#3}\@@psxstep\positioningxposition\@@psxoffset\nextboxwd \positioningxdimension\positioningxoffset\@@psxscale\@@psxfactor
+ \calculateposition{#4}\@@psystep\positioningyposition\@@psyoffset\nextboxhtdp\positioningydimension\positioningyoffset\@@psyscale\@@psyfactor
+ \vbox to \zeropoint
+ {\vskip\positioningyposition
+ \hbox to \zeropoint
+ {\hskip\positioningxposition
+ \flushnextbox
+ \hss}
+ \vss}%
+ \normalexpanded
+ {\egroup
+ \positioningxposition\the\positioningxposition
+ \positioningyposition\the\positioningyposition
+ \def\noexpand\@@psxoffset{\the\dimexpr\@@psxoffset}%
+ \def\noexpand\@@psyoffset{\the\dimexpr\@@psyoffset}}%
+ \ignorespaces}
+
+\setuppositioning
+ [\c!unit=\s!cm,
+ \c!factor=\plusone,
+ \c!scale=\plusone,
+ \c!xstep=\v!absolute,
+ \c!ystep=\v!absolute,
+ \c!offset=\v!yes,
+ \c!xoffset=\zeropoint,
+ \c!yoffset=\zeropoint]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/pack-rul.lua b/Master/texmf-dist/tex/context/base/pack-rul.lua
index 378167c979a..181bff2343f 100644
--- a/Master/texmf-dist/tex/context/base/pack-rul.lua
+++ b/Master/texmf-dist/tex/context/base/pack-rul.lua
@@ -10,16 +10,23 @@ if not modules then modules = { } end modules ['pack-rul'] = {
<p>An explanation is given in the history document <t>mk</t>.</p>
--ldx]]--
-local texdimen, texcount, texbox = tex.dimen, tex.count, tex.box
+local texsetdimen, texsetcount, texbox = tex.setdimen, tex.setcount, tex.box
local hpack, free, copy, traverse_id = node.hpack, node.free, node.copy_list, node.traverse_id
+local texdimen, texcount = tex.dimen, tex.count
+
+-- fastrepack
function commands.doreshapeframedbox(n)
- local noflines, lastlinelength, box = 0, 0, texbox[n]
+ local box, noflines, firstheight, lastdepth, lastlinelength = texbox[n], 0, nil, nil, 0
if box.width ~= 0 then
local list = box.list
if list then
local width, done = 0, false
for h in traverse_id('hlist',list) do -- no dir etc needed
+ if not firstheight then
+ firstheight = h.height
+ end
+ lastdepth = h.depth
local l = h.list
if l then
done = true
@@ -48,6 +55,28 @@ function commands.doreshapeframedbox(n)
end
end
end
- texdimen["framedlastlength"] = lastlinelength
- texcount["framednoflines"] = noflines
+--~ print("reshape", noflines, firstheight or 0, lastdepth or 0)
+ texsetcount("global","framednoflines", noflines)
+ texsetdimen("global","framedfirstheight", firstheight or 0)
+ texsetdimen("global","framedlastdepth", lastdepth or 0)
+end
+
+function commands.doanalyzeframedbox(n)
+ local box, noflines, firstheight, lastdepth = texbox[n], 0, nil, nil
+ if box.width ~= 0 then
+ local list = box.list
+ if list then
+ for h in traverse_id('hlist',list) do
+ if not firstheight then
+ firstheight = h.height
+ end
+ lastdepth = h.depth
+ noflines = noflines + 1
+ end
+ end
+ end
+--~ print("analyze", noflines, firstheight or 0, lastdepth or 0)
+ texsetcount("global","framednoflines", noflines)
+ texsetdimen("global","framedfirstheight", firstheight or 0)
+ texsetdimen("global","framedlastdepth", lastdepth or 0)
end
diff --git a/Master/texmf-dist/tex/context/base/pack-rul.mkiv b/Master/texmf-dist/tex/context/base/pack-rul.mkiv
index afacc2901b1..c137aea01a2 100644
--- a/Master/texmf-dist/tex/context/base/pack-rul.mkiv
+++ b/Master/texmf-dist/tex/context/base/pack-rul.mkiv
@@ -328,6 +328,16 @@
\box\scratchbox
\egroup}
+%D \macros
+%D {overlayfakebox}
+
+\def\overlayfakebox
+ {\hbox
+ {\setbox\scratchbox\emptyhbox
+ \wd\scratchbox\overlaywidth
+ \ht\scratchbox\overlayheight
+ \box\scratchbox}}
+
%D The empty case is:
\let\executeoverlay\gobblesevenarguments
@@ -469,7 +479,7 @@
\fi\fi}
\def\dostrokedlinedbox
- {\setbox\scratchbox\null
+ {\setbox\scratchbox\emptyhbox
\wd\scratchbox\frameddimenwd
\ht\scratchbox\frameddimenht
\dp\scratchbox\frameddimendp
@@ -571,8 +581,6 @@
%D start with defining some booleans. These give an impression
%D of what we are going to take into account.
-% todo: chardefs
-
\newif\ifboxhasoffset
\newif\ifboxhaswidth
\newif\ifboxhasheight
@@ -612,8 +620,6 @@
\def\inheritlocalframed[#1]#2[#3]{\letvalue{#1\s!parent}#3}
\def\copylocalframed [#1]#2[#3]{\setvalue{#1\s!parent}{#3}}
-\let\setuplocalframed\getparameters % obsolete
-
\presetlocalframed[\??ol]
\newcount\framednesting
@@ -622,28 +628,38 @@
{\bgroup
\advance\framednesting\plusone
\expandafter\let\csname\??ol:\the\framednesting\s!parent\endcsname\??ol
- \dodoubleempty\startlocalframed[\??ol:\the\framednesting]}
+ \dodoubleempty\dolocalframed[\??ol:\the\framednesting]}
\unexpanded\def\setupframed
{\dodoubleempty\dosetupframed}
-\def\dosetupframed
+% \def\dosetupframed
+% {\ifsecondargument
+% \@EA\dodoublesetupframed
+% \else
+% \@EA\dosinglesetupframed
+% \fi}
+
+% we can consider setting the parent of the regular framed to
+% something else in the otr so that we isolate it there
+
+\def\dosetupframed[#1][#2]%
{\ifsecondargument
- \@EA\dodoublesetupframed
+ \getparameters[\??ol#1][#2]%
\else
- \@EA\dosinglesetupframed
+ \getparameters[\??ol][#1]%
\fi}
-\def\dosinglesetupframed[#1][#2]%
- {\getparameters[\??ol][#1]}
+% \def\dosinglesetupframed[#1][#2]%
+% {\getparameters[\??ol][#1]}
-\def\dodoublesetupframed[#1][#2]%
- {\bgroup
- \let\dodoubleempty\empty
- \def\doframed[##1]{\gdef\globalredefinedframed{\dodoubleempty\doframed[##1,#2]}}%
- \getvalue{#1}%
- \egroup
- \letvalue{#1}\globalredefinedframed}
+% \def\dodoublesetupframed[#1][#2]%
+% {\bgroup
+% \let\dodoubleempty\empty
+% \def\doframed[##1]{\gdef\globalredefinedframed{\dodoubleempty\doframed[##1,#2]}}%
+% \getvalue{#1}%
+% \egroup
+% \letvalue{#1}\globalredefinedframed}
%D \startbuffer
%D \setupframed [framecolor=yellow] \framed{A}
@@ -655,7 +671,6 @@
%D
%D \startbuffer
%D \presetlocalframed[myframed]
-%D \setuplocalframed[myframed][width=4cm,height=2cm]
%D \localframed[myframed][framecolor=green]{oeps}
%D \stopbuffer
%D
@@ -675,14 +690,10 @@
\newif\ifinframed
-\def\localframed
- {\bgroup
- \dodoubleempty\startlocalframed}
-
%D The next one is faster on multiple backgrounds per page. No
%D dimensions can be set, only frames and backgrounds.
-\def\fastlocalframed[#1]#2[#3]#4% 3-4
+\unexpanded\def\fastlocalframed[#1]#2[#3]#4% 3-4
{\bgroup
\inframedtrue
\edef\@@framed{#1}%
@@ -884,14 +895,40 @@
% todo: protect local \framednames
-\unexpanded\def\startlocalframed[#1][#2]%
+\unexpanded\def\localframed
+ {\bgroup
+ \dodoubleempty\dolocalframed}
+
+\unexpanded\def\dolocalframed[#1][#2]% assumes a \dodoubleempty (slows down), also should have leading \bgroup
{\bgroup
\inframedtrue
\edef\@@framed{#1}%
\ifsecondargument % faster
\getparameters[\@@framed][#2]% here !
\fi
- \!!framedframeoffset\framedparameter\c!frameoffset
+ \dodolocalframed}
+
+\unexpanded\def\directlocalframed[#1]% no optional
+ {\bgroup
+ \bgroup
+ \inframedtrue
+ \edef\@@framed{#1}%
+ \dodolocalframed}
+
+\unexpanded\def\localframedwithsettings[#1][#2]% no checking (so no spaces between)
+ {\bgroup
+ \bgroup
+ \inframedtrue
+ \edef\@@framed{#1}%
+ \getparameters[\@@framed][#2]% here !
+ \dodolocalframed}
+
+\def\c!fr!analyze{fr:analyze} % private option
+
+% we can make macros for the offset, width, and height branches or do an \csname
+
+\unexpanded\def\dodolocalframed
+ {\!!framedframeoffset\framedparameter\c!frameoffset
\edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}%
\ifx\@@framedbackgroundoffset\v!frame
\!!framedbackgroundoffset\!!framedframeoffset
@@ -922,6 +959,7 @@
\edef\@@localorientation{\framedparameter\c!orientation}%
%
\edef\@@localautowidth {\framedparameter\c!autowidth}%
+ \edef\@@localfranalyze {\framedparameter\c!fr!analyze}% experimental option
%
\ifx\@@localframing\v!overlay % no frame, no offset, no framewidth
\boxhasframefalse
@@ -973,7 +1011,14 @@
\fi\fi
\!!framedheight\zeropoint
\!!framedwidth \zeropoint
- \ifx\localwidth\v!fit
+ \ifx\localwidth\empty % fallback to fit
+ \ifboxhasformat
+ \boxhaswidthtrue
+ \!!framedwidth\hsize
+ \else
+ \boxhaswidthfalse
+ \fi
+ \else\ifx\localwidth\v!fit
\ifboxhasformat
\boxhaswidthtrue
\!!framedwidth\hsize
@@ -997,15 +1042,17 @@
\else
\boxhaswidthtrue
\!!framedwidth\localwidth
- \fi\fi\fi\fi
- \ifx\localheight\v!fit
+ \fi\fi\fi\fi\fi
+ \ifx\localheight\empty % fallback to fit
+ \boxhasheightfalse
+ \else\ifx\localheight\v!fit
\boxhasheightfalse % no longer: \boxhasstrutfalse
\else\ifx\localheight\v!broad
\boxhasheightfalse
\else
\boxhasheighttrue
\!!framedheight\localheight
- \fi\fi
+ \fi\fi\fi
\ifboxhasheight
% obey user set height, also downward compatible
\else
@@ -1113,7 +1160,7 @@
\def\dowithframebox
{% moved : \let\postprocessframebox\relax
- \stoplocalframed}
+ \finishlocalframed}
\def\dodowithframebox
{\aftergroup\dowithframebox}
@@ -1128,6 +1175,23 @@
%D future extensions.
%D \macros
+%D {\doassigncheckedframeoffset}
+%D
+%D Offset helper (see menus):
+
+\def\doassigncheckedframeoffset#1#2%
+ {\edef\checkedframeoffset{#2}%
+ #1%
+ \ifx\checkedframeoffset\empty \zeropoint\else
+ \ifx\checkedframeoffset\v!overlay\zeropoint\else
+ \ifx\checkedframeoffset\v!none \zeropoint\else
+ \ifx\checkedframeoffset\v!frame \zeropoint\else
+ \ifx\checkedframeoffset\v!default\zeropoint\else
+ #2%
+ \fi\fi\fi\fi\fi
+ \relax}
+
+%D \macros
%D {ifreshapeframebox}
%D
%D The last few lines tell what to do after the content of the
@@ -1153,31 +1217,59 @@
%D ...,bottom=\kern0pt,...
%D \stoptyping
-\unexpanded\def\stoplocalframed
+% experiment ... \@@localfranalyze -> we could support 'first' as location key
+% option but then we will always do an analysis and reimplement the location
+% options (btw, beware of location settings of derived functionality that bleed
+% into this
+
+\def\finishlocalframeda
+ {\ifreshapeframebox
+ \doreshapeframedbox
+ \else\ifx\@@localfranalyze\v!yes
+ \doanalyzeframedbox
+ \else
+ \resetshapeframebox
+ \fi\fi
+ \boxhaswidthfalse}
+
+\def\finishlocalframedb
+ {\ifx\@@localfranalyze\v!yes
+ \doanalyzeframedbox
+ \else
+ \resetshapeframebox
+ \fi
+ \boxhaswidthfalse}
+
+\def\finishlocalframedc
+ {\ifx\@@localfranalyze\v!yes
+ \doanalyzeframedbox
+ \else
+ \resetshapeframebox
+ \fi}
+
+\unexpanded\def\finishlocalframed
{\dontshowcomposition
\@@stopframedorientation % hm, wrong place ! should rotate the result (after reshape)
\handleframedlocator\c!before\@@locallocation
\ifboxhasformat
\ifx\@@localautowidth\v!force
- \ifreshapeframebox\doreshapeframedbox\fi
- \boxhaswidthfalse
- \else
- \ifx\localwidth\v!fit
- \ifx\@@localautowidth\v!yes
- \ifreshapeframebox\doreshapeframedbox\fi
- \fi
- \boxhaswidthfalse
- \else\ifx\localwidth\v!fixed
- \boxhaswidthfalse
+ \finishlocalframeda
+ \else\ifx\localwidth\v!fit
+ \ifx\@@localautowidth\v!yes
+ \finishlocalframeda
\else
- \resetshapeframebox
- \fi\fi
+ \finishlocalframedb
+ \fi
+ \else\ifx\localwidth\v!fixed
+ \finishlocalframedb
+ \else
+ \finishlocalframedc
+ \fi\fi\fi
+ \ifconditional\boxcontentneedsprocessing
+ \mkdoprocessboxcontents\framebox
\fi
- \ifconditional\boxcontentneedsprocessing
- \mkdoprocessboxcontents\framebox
- \fi
- \else
- \resetshapeframebox
+ \else
+ \finishlocalframedc
\fi
\ifboxhaswidth
\wd\framebox\!!framedwidth
@@ -1212,7 +1304,7 @@
\egroup}
\def\dosetfakedframebox
- {\setbox\scratchbox\null
+ {\setbox\scratchbox\emptyhbox
\wd\scratchbox\wd\framebox
\ht\scratchbox\ht\framebox
\dp\scratchbox\dp\framebox
@@ -1622,13 +1714,13 @@
%D Beware, since we entered a group and either or not grab the next
%D bgroup token, we need to finish the group in the oneliner mode.
-\ifx\raggedoneliner\undefined \chardef\raggedoneliner\zerocount \fi
+\ifdefined\raggedonelinerstate \else \newconditional\raggedonelinerstate \fi
\def\doformatonelinerbox % beware: assumes explicit preceding bgroup
- {\ifcase\raggedoneliner
- \expandafter\nodoformatonelinerbox
- \else
+ {\ifconditional\raggedonelinerstate
\expandafter\dodoformatonelinerbox
+ \else
+ \expandafter\nodoformatonelinerbox
\fi}
\def\dodoformatonelinerbox
@@ -1827,21 +1919,20 @@
%D doing so, we need to reshape the box:
\newcount\framednoflines
-\newdimen\framedlastlength
+\newdimen\framedfirstheight
+\newdimen\framedlastdepth
\def\resetshapeframebox
- {\framednoflines \zerocount
- \framedlastlength\zeropoint}
+ {\framednoflines \zerocount
+ \framedfirstheight\zeropoint
+ \framedlastdepth \zeropoint}
\let\framedboxwidth \!!zeropoint
\let\framedboxheight\!!zeropoint
\let\framedboxdepth \!!zeropoint
-\def\doreshapeframedbox{\ifvbox\framebox\ctxlua{commands.doreshapeframedbox(\number\framebox)}\fi}
-
-%D The two variables \type {\framednoflines} and \type
-%D {\framedlastlength} can be used in a second pass to
-%D optimized framed material.
+\def\doreshapeframedbox{\ifvbox\framebox\ctxcommand{doreshapeframedbox(\number\framebox)}\fi}
+\def\doanalyzeframedbox{\ifvbox\framebox\ctxcommand{doanalyzeframedbox(\number\framebox)}\fi}
% torture test / strange case (much depth) / method 2 needed
%
@@ -2011,10 +2102,10 @@
%D sort of newline signal. In horizontal boxes it expands to a
%D space.
-\def\vboxednewline
+\unexpanded\def\vboxednewline
{\endgraf\ignorespaces}
-\def\hboxednewline
+\unexpanded\def\hboxednewline
{\unskip\normalspace\ignorespaces}
%D We can set each rule on or off. The default setting is
@@ -2082,10 +2173,12 @@
%D
%D \showsetup{blackrule}
-\def\complexblackrule[#1]%
+\definecomplexorsimple\blackrule
+
+\unexpanded\def\complexblackrule[#1]%
{\hbox\bgroup\getparameters[\??bj][#1]\domakeblackrule\egroup}
-\def\simpleblackrule
+\unexpanded\def\simpleblackrule
{\hbox\bgroup\domakeblackrule\egroup}
\def\domakeblackrule
@@ -2099,8 +2192,6 @@
\!!depth \@@bjdepth
\stopcolor}
-\definecomplexorsimple\blackrule
-
%D \macros
%D {blackrules}
%D
@@ -2290,20 +2381,18 @@
\def\dovlwdhtdp#1#2#3%
{\bgroup
- \!!dimena#2\strutht
- \!!dimenb#3\strutdp
\setbox\scratchbox\hbox
{\vrule
\!!width #1\linewidth
- \!!height\!!dimena
- \!!depth \!!dimenb}%
+ \!!height#2\strutht
+ \!!depth #3\strutdp}%
\dp\scratchbox\strutdp
\ht\scratchbox\strutht
\box\scratchbox
\egroup}
\def\complexvl[#1]%
- {\dovlwdhtdp{1}{#1}{#1}}
+ {\dovlwdhtdp\plusone{#1}{#1}}
\def\complexhl[#1]%
{\hbox
@@ -2361,25 +2450,27 @@
%D
%D which looks like: \thinrules[n=2]
+\newconstant\ruletype
+
\def\thinrule
{\strut
\bgroup
- \chardef\ruletype\plusone
+ \ruletype\plusone
\processaction
[\@@dlalternative]
- [ \v!a=>\chardef\ruletype0,% no line
- %\v!b=>\chardef\ruletype1,% height/depth
- \v!c=>\chardef\ruletype2,% topheight/botdepth
- % 11=>\chardef\ruletype1,% fallback for backgrounds
- 0=>\chardef\ruletype0,% compatible with backgrounds
- % 1=>\chardef\ruletype1,% compatible with backgrounds
- 2=>\chardef\ruletype2]% compatible with backgrounds
+ [ \v!a=>\ruletype\zerocount,% no line
+ %\v!b=>\ruletype\plusone ,% height/depth
+ \v!c=>\ruletype\plustwo ,% topheight/botdepth
+ % 11=>\ruletype\plusone ,% fallback for backgrounds
+ 0=>\ruletype\zerocount,% compatible with backgrounds
+ % 1=>\ruletype\plusone ,% compatible with backgrounds
+ 2=>\ruletype\plustwo ]% compatible with backgrounds
\doifsomething\@@dlrulethickness
{\linewidth\@@dlrulethickness}%
\ifdim\linewidth=\zeropoint
- \chardef\ruletype\zerocount
+ \ruletype\zerocount
\else
- \doifnot\@@dlframe\v!on{\chardef\ruletype\zerocount}%
+ \doifnot\@@dlframe\v!on{\ruletype\zerocount}%
\fi
\ifnum\ruletype=\plusone
\doif\@@dlheight\v!max{\let\@@dlheight\!!plusone}%
@@ -2622,108 +2713,78 @@
%D
%D The next definition shows the defaults.
-\def\dodefineframedtext[#1][#2]%
- {\presetlocalframed[\??kd#1]%
- \getparameters[\??kd#1]
- [\c!width=0.75\hsize,
- \c!height=\v!fit,
- \c!align=\v!yes,
- \c!top=,
- \c!bottom=\vfill,
- \c!offset=1em,
- \c!bodyfont=,
- \c!style=,
- \c!color=,
- \c!left=,
- \c!right=\hfill,
- \c!before=\blank,
- \c!after=\blank,
- \c!inner=,
- \c!frame=\v!on,
- \c!topframe=,
- \c!bottomframe=,
- \c!leftframe=,
- \c!rightframe=,
- \c!radius=.5\bodyfontsize,
- \c!corner=\v!rectangular,
- \c!foregroundcolor=,
- \c!foregroundstyle=,
- \c!background=,
- \c!backgroundcolor=,
- \c!backgroundscreen=\@@rsscreen,
- \c!linecorrection=\v!on,
- \c!depthcorrection=\v!on,
- \c!margin=\v!standard,
- \c!orientation=,
- \c!indenting=,
- #2]%
- \setuvalue{\e!start#1}{\dostartframedtext[#1]}%
- \setuvalue{\e!stop #1}{\dostopframedtext }%
- \setuvalue {#1}{\doframedtext [#1]}}
-
-\unexpanded\def\defineframedtext
- {\dodoubleempty\dodefineframedtext}
-
-%D We define the general (and original) case by just saying:
-
-\defineframedtext[\v!framedtext]
-
-%D We need several steps before the actual job is done,
-%D because we have to handle an optional identifier (and
-%D because these commands evolved out of a single case).
+\installcommandhandler \??kd {framedtext} \??kd
-\def\framedtextparameter#1#2% todo: currentframedtext
- {\csname\??kd#1#2\endcsname}
-
-\def\dosetupframedtexts[#1][#2]%
- {\ifsecondargument
- \def\docommand##1{\getparameters[\??kd##1][#2]}%
- \processcommacommand[#1]\docommand % new, #1 may be macro
- \else
- \getparameters[\??kd\v!framedtext][#1]%
- \fi}
+\let\setupframedtexts\setupframedtext
-\unexpanded\def\setupframedtexts
- {\dodoubleempty\dosetupframedtexts}
+\presetlocalframed[\??kd]
-\def\dostartframedtext
- {\bgroup\dotripleempty\dodostartframedtext}
+\setupframedtext
+ [\c!width=0.75\hsize,
+ \c!height=\v!fit,
+ \c!align=\v!yes,
+ %\c!top=,
+ \c!bottom=\vfill,
+ \c!offset=1em,
+ %\c!bodyfont=,
+ %\c!style=,
+ %\c!color=,
+ %\c!left=,
+ \c!right=\hfill,
+ \c!before=\blank,
+ \c!after=\blank,
+ %\c!inner=,
+ \c!frame=\v!on,
+ %\c!topframe=,
+ %\c!bottomframe=,
+ %\c!leftframe=,
+ %\c!rightframe=,
+ \c!radius=.5\bodyfontsize,
+ \c!corner=\v!rectangular,
+ %\c!orientation=,
+ %\c!indenting=,
+ %\c!foregroundcolor=,
+ %\c!foregroundstyle=,
+ %\c!background=,
+ %\c!backgroundcolor=,
+ \c!backgroundscreen=\@@rsscreen,
+ \c!linecorrection=\v!on,
+ \c!depthcorrection=\v!on,
+ \c!margin=\v!standard]
-\def\dodostartframedtext[#1][#2][#3]%
- {\doifassignmentelse{#2}
- {\dododostartframedtext[#1][][#2]}
- {\dododostartframedtext[#1][#2][#3]}}
+\appendtoks
+ \setuevalue{\e!start\currentframedtext}{\dostartframedtext{\currentframedtext}}%
+ \setuevalue{\e!stop \currentframedtext}{\dostopframedtext }%
+ \setuevalue {\currentframedtext}{\doframedtext {\currentframedtext}}%
+\to \everydefineframedtext
-\setfalse\framedtextlocationnone
+\unexpanded\def\dostartframedtext#1%
+ {\bgroup
+ \edef\currentframedtext{#1}%
+ \dodoubleempty\dodostartframedtext}
-\def\checkframedtext % messy dependency
- {\ifinsidefloat
- \localhsize\hsize
- \else\ifdim\sidefloatvsize>\zeropoint % will be proper handle
- % \strut % rather clean way to invoke the sidefloat OTR
- % \setbox0=\lastbox % and get the widths set, so from now on we
- % \setlocalhsize % can have framed texts alongside sidefloats
- \checksidefloat
- \setlocalhsize
- \else
- \localhsize\hsize
- \fi\fi}
+\def\dodostartframedtext[#1][#2]%
+ {\doifassignmentelse{#1}
+ {\dododostartframedtext[][#1]}
+ {\dododostartframedtext[#1][#2]}}
-\def\dododostartframedtext[#1][#2][#3]% #3 only passed to framed, not to framedtext
- {\doifsomething{#2}{\setvalue{\??kd#1\c!location}{#2}}% does not listen to #3
+\def\dododostartframedtext[#1][#2]% #2 only passed to framed, not to framedtext
+ {\setupframedtexts[\currentframedtext][#2]%
+ \doifsomething{#1}{\setframedtextparameter\c!location{#1}}% does not listen to #3
\setfalse\framedtextlocationnone
+ % somewhat messy ... needs to be redone
\processaction % \v!low en \v!depth are already taken !
- [\framedtextparameter{#1}\c!location]
- [ \v!left=>\letvalue{\??kd#1\c!left }\relax
- \letvalue{\??kd#1\c!right}\hfill,
- \v!right=>\letvalue{\??kd#1\c!left }\hfill
- \letvalue{\??kd#1\c!right}\relax,
- \v!middle=>\letvalue{\??kd#1\c!left }\hfill
- \letvalue{\??kd#1\c!right}\hfill,
- \v!none=>\letvalue{\??kd#1\c!left }\relax % new
- \letvalue{\??kd#1\c!right}\relax % new
+ [\framedtextparameter\c!location]
+ [ \v!left=>\letframedtextparameter\c!left \relax
+ \letframedtextparameter\c!right\hfill,
+ \v!right=>\letframedtextparameter\c!left \hfill
+ \letframedtextparameter\c!right\relax,
+ \v!middle=>\letframedtextparameter\c!left \hfill
+ \letframedtextparameter\c!right\hfill,
+ \v!none=>\letframedtextparameter\c!left \relax % new
+ \letframedtextparameter\c!right\relax % new
\settrue\framedtextlocationnone]%
- \letvalue{\??kd#1\c!location}\empty
+ \resetframedtextparameter\c!location
% removed 06/2001
% \forgetparindent
% added 06/2001 [see demo-bbv]
@@ -2733,43 +2794,28 @@
\startboxedcontent
\hsize\localhsize
% \insidefloattrue % ? better
- \normalexpanded{\noexpand\switchtobodyfont[\framedtextparameter{#1}\c!bodyfont]}%
- \startcolor[\framedtextparameter{#1}\c!color]%
- \localframed[\??kd#1][\c!strut=\v!no,#3]% todo: use delayedstrut
+ \normalexpanded{\noexpand\switchtobodyfont[\framedtextparameter\c!bodyfont]}%
+ \startcolor[\framedtextparameter\c!color]%
+ \localframed[\??kd\currentframedtext][\c!strut=\v!no]% todo: use delayedstrut
\bgroup
\let\\=\endgraf
- \framedtextparameter{#1}\c!inner % oud spul
- \doifvalue{\??kd#1\c!depthcorrection}\v!on % new, inside box
- {\bgroup
- \verticalstrut
- % we need \nowhitespace in case of setups setting whitespace
- % nb, not safe, text vs \vbox as next
- \vskip-\struttotal
- \nowhitespace % na vskip ! new 20/05/2004, fails with next content being box (\scale{..})
- }%
+ \framedtextparameter\c!inner % oud spul
+ \doif{\framedtextparameter\c!depthcorrection}\v!on\doftstartdepthcorrection
\doinhibitblank % \blank[\v!disable]% plaatst signal
-\setupindenting[\framedtextparameter{#1}\c!indenting]%
- \doconvertfont{\framedtextparameter{#1}\c!style}\empty
- \def\dostopframedtext{\dodostopframedtext{#1}{#2}}}
+ \setupindenting[\framedtextparameter\c!indenting]%
+ %\doconvertfont{\framedtextparameter\c!style}\empty} %%%%% todo: attr setter
+ \dosetframedtextattributes\c!style\c!color}
%D The \type {none} option is handy for nested usage, as
%D in the presentation styles, where we don't want
%D interference.
-\def\dodostopframedtext#1#2% % no \baselinecorrection, see faq docs
+\defineplacement[\??kd][\s!parent=\??kd\currentframedtext]
+
+\unexpanded\def\dostopframedtext % no \baselinecorrection, see faq docs
{\endgraf
\removelastskip
- \doifvalue{\??kd#1\c!depthcorrection}\v!on % local and global
- {\forgetall
- \vskip-\struttotal
- \verticalstrut
- \egroup
- \forgetall % brrr too often
- \vskip-\lineheight
- % will be an option, not default
- % \setbaselinecorrections
- % \donegbotbaselinecorrection
- \verticalstrut}
+ \doif{\framedtextparameter\c!depthcorrection}\v!on\doftstopdepthcorrection
\stopboxedcontent
\stopcolor
\ifconditional\framedtextlocationnone
@@ -2780,10 +2826,47 @@
\box\framebox
\else
\egroup
- \doplacement[\??kd#1][\c!depthcorrection=\v!off]{\box\framebox}%
+ \placement[\??kd][\c!depthcorrection=\v!off]{\box\framebox}%
\fi\fi
\egroup}
+%D We define the general (and original) case by just saying:
+
+\setfalse\framedtextlocationnone
+
+\def\checkframedtext % messy dependency
+ {\ifinsidefloat
+ \localhsize\hsize
+ \else\ifdim\sidefloatvsize>\zeropoint % will be proper handle
+ % \strut % rather clean way to invoke the sidefloat OTR
+ % \setbox0=\lastbox % and get the widths set, so from now on we
+ % \setlocalhsize % can have framed texts alongside sidefloats
+ \checksidefloat
+ \setlocalhsize
+ \else
+ \localhsize\hsize
+ \fi\fi}
+
+\def\doftstartdepthcorrection
+ {\bgroup
+ \verticalstrut
+ % we need \nowhitespace in case of setups setting whitespace
+ % nb, not safe, text vs \vbox as next
+ \vskip-\struttotal
+ \nowhitespace} % na vskip ! new 20/05/2004, fails with next content being box (\scale{..})
+
+\def\doftstopdepthcorrection
+ {\forgetall
+ \vskip-\struttotal
+ \verticalstrut
+ \egroup
+ \forgetall % brrr too often
+ \vskip-\lineheight
+ % will be an option, not default
+ % \setbaselinecorrections
+ % \donegbotbaselinecorrection
+ \verticalstrut}
+
%D Placement can be ignored:
%D
%D \starttyping
@@ -2802,17 +2885,19 @@
%D The simple brace (or group) delimited case is typeset
%D slightly different and is not aligned.
-\def\doframedtext
- {\bgroup\dodoubleempty\dodoframedtext}
+\unexpanded\def\doframedtext#1%
+ {\bgroup
+ \edef\currentframedtext{#1}%
+ \dosingleempty\dodoframedtext}
-\def\dodoframedtext[#1][#2]% beware!
- {\normalexpanded{\noexpand\switchtobodyfont[\getvalue{\??kd#1\c!bodyfont}]}%
- \localframed[\??kd#1][\c!strut=\v!no,#2]%
+\def\dodoframedtext[#1]% beware!
+ {\normalexpanded{\noexpand\switchtobodyfont[\\framedtextparameter\c!bodyfont]}%
+ \localframed[\??kd\currentframedtext][\c!strut=\v!no,#1]%
\bgroup
\blank[\v!disable]%
\let\\=\endgraf
- \getvalue{\??kd#1\c!inner}% % kleur naar outer level
- \dostartattributes{\??kd#1}\c!style\c!color\empty
+ \framedtextparameter\c!inner
+ \dosetframedtextattributes\c!style\c!color
\bgroup
\aftergroup\docloseframedtext
\let\next=}
@@ -2823,23 +2908,46 @@
\egroup
\egroup}
+\defineframedtext[\v!framedtext]
+
%D \macros
%D {defineframed}
%D
%D One can also define simple framed texts, using:
%D
%D \showsetup{defineframed}
+%D
+%D As suggested by Wolfgang we can now use the new \MKIV\ inheritance
+%D model instead of passing a combination of arguments. This also
+%D also simplified the \type {\setupframed} command. There are
+%D certainly more places where such improvements can be made.
-\unexpanded\def\defineframed
+\def\defineframed
{\dodoubleempty\dodefineframed}
\def\dodefineframed[#1][#2]%
- {\iffirstargument
- \setuvalue{#1}{\dodoubleempty\doframed[#2]}%
- \fi}
+ {\ifcsname\??ol:#1\endcsname
+ % already defined, keeps settings
+ \else
+ \expandafter\newcount\csname\??ol:#1\endcsname % \the\everypresetframed
+ \fi
+ \getparameters[\??ol#1][\s!parent=\??ol,#2]%
+ \setuvalue{#1}{\doframed[#1]}}% % \the\everydefineframed
-\def\doframed[#1][#2]%
- {\framed[#1,#2]}
+\def\doframed[#1]%
+ {\bgroup
+ \expandafter\let\expandafter\tempframedcount\csname\??ol:#1\endcsname
+ \advance\tempframedcount\plusone
+ \expandafter\def\csname\??ol#1:\the\tempframedcount\s!parent\endcsname{\??ol#1}% \copylocalframed
+ \dodoubleempty\dolocalframed[\??ol#1:\the\tempframedcount]}
+
+%D We can do:
+%D
+%D \starttyping
+%D \defineframed[\v!framed]
+%D \stoptyping
+%D
+%D but the existing one is ok as well (less csname messy too).
%D \macros
%D {textrule, starttextrule, setuptextrules}
@@ -3196,7 +3304,7 @@
% 0=no-split, 1=no-split+indent, 2=split, 3=split+indent
-\chardef\backgroundsplitmode\plusthree
+\setnewconstant\backgroundsplitmode\plusthree
%D The \type{\vbox to \lineheight{}\vskip\zeropoint}
%D construction gives the first real line a decent height by
@@ -3225,7 +3333,7 @@
\dimen2\leftskip % new **
\forgetall
\ifinsidefloat
- \chardef\backgroundsplitmode\zerocount
+ \backgroundsplitmode\zerocount
\fi
\ifcase\backgroundsplitmode
\localframed[\??ag][\c!offset=\v!overlay]{\box0}%
@@ -3239,11 +3347,11 @@
\loop
\ifdim\pagetotal=\zeropoint % empty page
\scratchdimen\textheight
- \chardef\backgroundsplit\plusone % split to max height
+ \backgroundsplitmode\plusone % split to max height
\else
\setbox\scratchbox\vbox{\@@agbefore}%
\scratchdimen\dimexpr\pagegoal-\ht\scratchbox-\pagetotal\relax
- \chardef\backgroundsplit\plustwo % split to partial height
+ \backgroundsplitmode\plustwo % split to partial height
\fi
\advance\scratchdimen\dimexpr-\@@agtopoffset-\@@agbottomoffset\relax
\ifdim\scratchdimen>2\lineheight\relax % reasonable, will be configurable
@@ -3251,9 +3359,9 @@
\setbox2\vsplit0 to \scratchdimen
\else
\setbox2\box0
- \chardef\backgroundsplit\zerocount % no split
+ \backgroundsplitmode\zerocount % no split
\fi
- \setbox2\vbox \ifcase\backgroundsplit\or to \textheight \fi % max split
+ \setbox2\vbox \ifcase\backgroundsplitmode\or to \textheight \fi % max split
{\vskip\@@agtopoffset
\unvcopy2
\prevdepth\dp2
@@ -3261,7 +3369,7 @@
\vskip\@@agbottomoffset
\vfill}
\@@agbefore
- \ifcase\backgroundsplit\or\or % partial split
+ \ifcase\backgroundsplitmode\or\or % partial split
\ifdim\pagegoal<\maxdimen
\pagegoal=1.2\pagegoal % be a bit more tolerant
\fi
@@ -3271,7 +3379,7 @@
\ifnum\backgroundsplitmode=\plusthree \hskip\dimen2 \fi %
\localframed[\??ag][\c!offset=\v!overlay]{\box2}% new **
\stoplinecorrection
- \ifcase\backgroundsplit % no split
+ \ifcase\backgroundsplitmode % no split
\@@agafter
\else % some split
\vfill\eject % geen \page !
@@ -3334,74 +3442,6 @@
%D
%D \typebuffer
-% \unexpanded\def\defineframedcontent
-% {\dodoubleempty\dodefineframedcontent}
-%
-% \def\dodefineframedcontent[#1][#2]%
-% {\presetlocalframed[\??fc#1]%
-% \getparameters[\??fc#1]
-% [\c!leftoffset=\zeropoint,
-% \c!rightoffset=\getvalue{\??fc#1\c!leftoffset},
-% \c!topoffset=\zeropoint,
-% \c!bottomoffset=\getvalue{\??fc#1\c!topoffset},
-% \c!strut=\v!no,
-% \c!offset=\v!overlay,
-% \c!linecorrection=\v!no,
-% \c!left=,
-% \c!right=,
-% #2]}
-%
-% \unexpanded\def\setupframedcontent
-% {\dodoubleempty\dosetupframedcontent}
-%
-% \def\dosetupframedcontent[#1][#2]%
-% {\def\docommand##1{\getparameters[\??fc##1][#2]}%
-% \processcommacommand[#1]\docommand}
-%
-% \unexpanded\def\startframedcontent[#1]%
-% {\bgroup
-% \doifelse{#1}\v!off
-% {\let\stopframedcontent\egroup}
-% {\ifcsname\??fc#1\c!frame\endcsname
-% \dostartframedcontent{#1}%
-% \fi}}
-%
-% \def\dostartframedcontent#1%
-% {\unexpanded\def\stopframedcontent{\dostopframedcontent{#1}}%
-% \setbox\framebox\hbox\bgroup
-% \setlocalhsize
-% \hsize\localhsize
-% \advance\hsize\dimexpr-\getvalue{\??fc#1\c!leftoffset}-\getvalue{\??fc#1\c!rightoffset} \relax
-% \advance\vsize\dimexpr-\getvalue{\??fc#1\c!topoffset} -\getvalue{\??fc#1\c!bottomoffset}\relax
-% \hskip\getvalue{\??fc#1\c!leftoffset}%
-% \vbox\bgroup
-% \vskip\getvalue{\??fc#1\c!topoffset}%
-% \vbox\bgroup
-% \forgetall
-% \blank[\v!disable]}
-%
-% \def\dostopframedcontent#1%
-% {\removelastskip
-% \egroup
-% \vskip\getvalue{\??fc#1\c!bottomoffset}%
-% \egroup
-% \hskip\getvalue{\??fc#1\c!rightoffset}%
-% \egroup
-% \doifvalue{\??fc#1\c!width}\v!fit
-% {\letvalue{\??fc#1\c!width}\v!fixed}% no shapebox
-% \ifinsidefloat
-% \donefalse
-% \else
-% \doifelsevalue{\??fc#1\c!linecorrection}\v!yes\donetrue\donefalse
-% \fi
-% % plaats ?
-% \ifdone\startlinecorrection\fi
-% \getvalue{\??fc#1\c!left}% new
-% \localframed[\??fc#1]{\box\framebox}%
-% \getvalue{\??fc#1\c!right}% new
-% \ifdone\stoplinecorrection\fi
-% \egroup}
-
\def\framedcontentparameter #1{\csname\doframedcontentparameter{\??fc\@@framedcontent}#1\endcsname}
\def\doframedcontentparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doframedcontentparentparameter\csname#1\s!parent\endcsname#2\fi}
\def\doframedcontentparentparameter#1#2{\ifx#1\relax\s!empty\else\doframedcontentparameter#1#2\fi}
@@ -3521,6 +3561,9 @@
\setuplinewidth
[\v!medium]
+% We could omit the empty setings but that is some 10% slower due to
+% extra testing in the chain.
+
\setupframed
[\c!width=\v!fit,
\c!height=\v!broad,
@@ -3554,12 +3597,12 @@
\c!align=,
\c!bottom=\vss,
\c!top=,
- \c!strut=\v!yes,
\c!autostrut=\v!yes,
\c!location=\v!normal,
\c!orientation=,
\c!autowidth=\v!yes,
- \c!setups=]
+ \c!setups=,
+ \c!strut=\v!yes]
\setupscreens
[%\c!factor=1.0, % obsolete
diff --git a/Master/texmf-dist/tex/context/base/page-app.mkiv b/Master/texmf-dist/tex/context/base/page-app.mkiv
index 7dd71cf2ab8..b42eef05403 100644
--- a/Master/texmf-dist/tex/context/base/page-app.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-app.mkiv
@@ -13,8 +13,7 @@
\writestatus{loading}{ConTeXt Page Macros / Applications}
-%D The fitting page code is moved from \type {meta-fig} to
-%D here.
+%D This needs an update with a proper define and inheritance.
\unprotect
@@ -35,7 +34,6 @@
\c!rightmargin=\!!zeropoint,\c!rightedge=\!!zeropoint,
\c!header=\!!zeropoint,\c!footer=\!!zeropoint]
-
\def\dostartfittingpage[#1][#2]%
{\page % this is kind of tricky! there can be preceding page refs
\autostarttext
@@ -74,7 +72,7 @@
\let\checkcurrentlayout\relax % else interference with odd/even layout
\processaction
[\getvalue{\currentfittingpage\c!paper}]
- [ \v!auto=>\let\fittingpapersize\printpapersize,
+ [ \v!auto=>\def\fittingpapersize{\printpapersize},
\s!unknown=>\let\fittingpapersize\commalistelement,
\s!default=>\def\fittingpapersize{\??fp\s!dummy}]%
\expanded{\setuppapersize[\??fp\s!dummy][\fittingpapersize]}%
@@ -85,7 +83,7 @@
\c!height=\fittinght]%
\setuplayout
[\v!page]%
- \startmakeup[\v!standard][\c!textstate=\v!empty,\c!doublesided=\v!no,\c!page=]%
+ \startmakeup[\v!standard][\c!textstate=\v!empty,\c!doublesided=\v!no,\c!pagestate=\getvalue{\currentfittingpage\c!pagestate}]%
\centerbox{\box\scratchbox}%
\stopmakeup
\stoplocallayout
@@ -111,6 +109,7 @@
\setupTEXpage
[\c!scale=1000,
+ \c!pagestate=,
\c!strut=\v!no,
\c!align=\v!normal, % needed, else problems !
\c!offset=\v!overlay,
@@ -130,7 +129,7 @@
\unexpanded\def\startTEXstream
{\dosingleempty\dostartTEXstream}
-\def\dostartTEXstream[#1]%
+\def\dostartTEXstream[#1]% old code, to be redone
{\page
\defineoutputstream[tex]%
\enableoutputstream[tex]%
@@ -140,61 +139,18 @@
\outputstreamunvbox[tex]%
\stopTEXpage}}
-%D Application pages (for an example, see \type {m-pstric}):
-
-\def\@@texapp{texapp}
-\def\@@texdim{texdim}
+%D Application pages, a quick \MKIV\ hack:
-\def\saveTEXapplication#1#2%
- {\immediate\openout\scratchwrite=\bufferprefix\@@texdim.tmp
- \immediate\write\scratchwrite{\dimen#1=\the\ht\scratchbox}%
- \immediate\write\scratchwrite{\dimen#2=\the\wd\scratchbox}%
- \immediate\closeout\scratchwrite}
+\definetypesetting[TEXapplication]
+\definebuffer[TEXapplication]
-\def\restoreTEXapplication
- {\readlocfile{\bufferprefix\@@texdim.tmp}\donothing\donothing}
+% we could use a counter and saves runs on numbering them.
-\def\startTEXapplication
- {\dosingleempty\dostartTEXapplication}
+\def\TEXapplicationfilename{\jobname-texapplication.tex}
-\long\def\dostartTEXapplication[#1]#2#3\stopTEXapplication
- {\bgroup
- \bgroup
- \let\f!temporaryextension\c!tex
- \setbuffer[\@@texapp]%
- \starttext
- #2% preamble
- \startTEXpage[#1]%
- \topskip\zeropoint
- \setbox\scratchbox\hbox{#3}%
- \saveTEXapplication02% dimensions
- \box\scratchbox
- \stopTEXpage
- \stoptext
- \endbuffer
- \egroup
- \doifelse\jobsuffix{dvi}\donetrue\donefalse
- \executesystemcommand{texexec \bufferprefix\@@texapp.tex --once --batch}%
- \ifdone % eps
- \executesystemcommand{dvips -E* -o \@@texapp.eps \@@texapp}%
- \else % pdf
- \executesystemcommand{dvips \bufferprefix\@@texapp}%
- \executesystemcommand{ps2pdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}%
-% \executesystemcommand{texmfstart pstopdf \bufferprefix\@@texapp.ps \bufferprefix\@@texapp.pdf}%
- \fi
- \restoreTEXapplication % dimensions
- \doifelse\jobsuffix{dvi}\donetrue\donefalse
- \setbox\scratchbox\hbox
- {\expanded{\externalfigure
- [\bufferprefix\@@texapp.\ifdone eps\else pdf\fi]
- [\c!object=\v!no]}}%
- \setbox\scratchbox\hbox
- {\lower\ht\scratchbox\hbox{\raise\dimen2\box\scratchbox}}%
- \wd\scratchbox\dimen0
- \ht\scratchbox\dimen2
- \dp\scratchbox\zeropoint
- \box\scratchbox
- \egroup}
+\def\stopTEXapplication
+ {\savebuffer[\thedefinedbuffer{TEXapplication}][\TEXapplicationfilename]%
+ \typesetfile[TEXapplication][\TEXapplicationfilename]\relax}
%D \macros
%D {startpagefigure}
diff --git a/Master/texmf-dist/tex/context/base/page-bck.mkiv b/Master/texmf-dist/tex/context/base/page-bck.mkiv
index 93400943d50..81392f5af87 100644
--- a/Master/texmf-dist/tex/context/base/page-bck.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-bck.mkiv
@@ -13,8 +13,6 @@
\writestatus{loading}{ConTeXt Page Macros / Backgrounds}
-% \chardef\kindofpagetextareas=1 will isolate graphics from backgrounds
-
% todo \fastlocalframed -> \localbackgroundframed
\unprotect
@@ -248,8 +246,8 @@
%D background at the same time since something may have
%D changed halfway a page.
-\chardef\newrightbackground\zerocount
-\chardef\newleftbackground \zerocount
+\newconditional\newrightbackground
+\newconditional\newleftbackground
\def\recalculatebackgrounds
{\global\newbackgroundtrue}
@@ -262,28 +260,31 @@
\ifx\@@mastate\v!repeat\else\global\newbackgroundfalse\fi}
\def\dosetbackgroundboxesr
- {\global\chardef\newrightbackground\plusone
- \global\chardef\newleftbackground\plusone
+ {\global\settrue\newrightbackground
+ \global\settrue\newleftbackground
\global\setbox\leftbackground\emptybox
\global\setbox\rightbackground\emptybox}
+
\def\dosetbackgroundboxesa
- {\ifcase\newleftbackground \else
+ {\ifconditional\newleftbackground
% \showmessage\m!layouts8\empty
\setbackgroundbox\leftbackground\relax
- \global\chardef\newleftbackground\zerocount
- \global\chardef\newrightbackground\zerocount
+ \global\setfalse\newleftbackground
+ \global\setfalse\newrightbackground
\fi}
+
\def\dosetbackgroundboxesb
- {\ifcase\newleftbackground \else
+ {\ifconditional\newleftbackground
% \showmessage\m!layouts8\empty
\setbackgroundbox\leftbackground\relax
- \global\chardef\newleftbackground\zerocount
+ \global\setfalse\newleftbackground
\fi}
+
\def\dosetbackgroundboxesc
- {\ifcase\newrightbackground \else
+ {\ifconditional\newrightbackground
% \showmessage\m!layouts8\empty
\setbackgroundbox\rightbackground\doswapmargins
- \global\chardef\newrightbackground\zerocount
+ \global\setfalse\newrightbackground
\fi}
\def\addmainbackground#1% todo: dimension spec
@@ -295,7 +296,7 @@
\box#1}%
\fi}
-\newdimen\pagebackgroundhoffset
+\newdimen\pagebackgroundhoffset % THESE WILL BECOME OBSOLETE
\newdimen\pagebackgroundvoffset
\newdimen\pagebackgrounddepth
\newdimen\pagebackgroundoffset
diff --git a/Master/texmf-dist/tex/context/base/page-com.mkiv b/Master/texmf-dist/tex/context/base/page-com.mkiv
new file mode 100644
index 00000000000..dbb160058c1
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/page-com.mkiv
@@ -0,0 +1,116 @@
+%D \module
+%D [ file=page-com, % moved from page-imp
+%D version=1998.01.15,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Page Comments,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%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 will become runtime loaded code.
+
+\writestatus{loading}{ConTeXt Page Macros / Page Comments}
+
+\unprotect
+
+%D \macros
+%D {setuppagecomment,startpagecomment}
+%D
+%D This command is not yet documented. Usage:
+%D
+%D \starttyping
+%D \setuppagecomment[state=start,location=right]
+%D
+%D \startpagecomment
+%D \input knuth
+%D \stoppagecomment
+%D \stoptyping
+
+\unexpanded\def\setuppagecomment
+ {\dosingleempty\dosetuppagecomment}
+
+\def\dosetuppagecomment[#1]%
+ {\getparameters[\??pc][#1]%
+ \doifelse\@@pcstate\v!start
+ {\doifinsetelse\@@pclocation{\v!bottom,\v!top}
+ {\setuppapersize[\c!left=\hskip\@@pcoffset]%
+ \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcheight}%
+ \edef\@@pcpaperwidth {\the\dimexpr\paperwidth +\@@pcoffset+\@@pcoffset}%
+ \defineoverlay[\v!pagecomment][\placepagecommentTB]}
+ {\setuppapersize[\c!top=\vskip\@@pcoffset]%
+ \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset}%
+ \edef\@@pcpaperwidth {\the\dimexpr\paperwidth +\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcwidth}%
+ \defineoverlay[\v!pagecomment][\placepagecommentLR]}%
+ \processaction
+ [\@@pclocation]
+ [ \v!bottom=>{\setuplayout[\c!location=]\setuppapersize[\c!bottom=\vss,\c!top =\vskip\@@pcoffset]},
+ \v!top=>{\setuplayout[\c!location=]\setuppapersize[\c!top =\vss,\c!bottom=\vskip\@@pcoffset]},
+ \v!left=>{\setuplayout[\c!location=]\setuppapersize[\c!left =\hss,\c!right =\hskip\@@pcoffset]},
+ \v!right=>{\setuplayout[\c!location=]\setuppapersize[\c!right =\hss,\c!left =\hskip\@@pcoffset]}]%
+ \definepapersize
+ [\v!pagecomment]
+ [\c!height=\@@pcpaperheight,
+ \c!width=\@@pcpaperwidth]%
+ \let\@@pcprintpapersize\printpapersize
+ \setuppapersize[\papersize][\v!pagecomment]%
+ \setupbackgrounds[\v!paper][\c!background=\v!pagecomment]}% todo append if already set
+ {\doif\@@pcstate\v!stop % else initialization invokes backgrounds
+ {% this should be tested first
+ % \normalexpanded{\noexpand\setuppapersize[\papersize][\@@pcprintpapersize]}%
+ \setupbackgrounds[\v!paper][\c!background=]}}}
+
+\def\@@pcprintpapersize{\printpapersize}
+
+\unexpanded\def\placepagecommentTB
+ {\vbox to \printpaperheight
+ {%\forgetall
+ \hsize\printpaperwidth
+ \vskip\@@pcoffset
+ \doifelse\@@pclocation\v!bottom{\vskip\dimexpr\paperheight+\@@pcdistance\relax}\vss
+ \hskip\@@pcoffset
+ \vbox to \@@pcheight
+ {%\forgetall
+ \hsize\paperwidth
+ \ifpagecomment
+ \getbuffer[\v!pagecomment]%
+ \global\pagecommentfalse
+ \fi}%
+ \hfill
+ \doifelse\@@pclocation\v!bottom\vss{\vskip\dimexpr\paperheight+\@@pcdistance\relax}%
+ \vskip\@@pcoffset}}
+
+\unexpanded\def\placepagecommentLR
+ {\hbox to \printpaperwidth
+ {\hskip\@@pcoffset
+ \doifelse\@@pclocation\v!right{\hskip\paperwidth\hskip\@@pcdistance}\hss
+ \vbox to \printpaperheight
+ {%\forgetall
+ \vskip\@@pcoffset
+ \hsize\@@pcwidth
+ \ifpagecomment
+ \getbuffer[\v!pagecomment]%
+ \global\pagecommentfalse
+ \fi
+ \vss}%
+ \doifelse\@@pclocation\v!right\hss{\hskip\paperwidth\hskip\@@pcdistance}%
+ \hskip\@@pcoffset}}
+
+\newif\ifpagecomment
+
+\setvalue{\e!start\v!pagecomment}%
+ {\global\pagecommenttrue
+ \dostartbuffer[\v!pagecomment][\e!start\v!pagecomment][\e!stop\v!pagecomment]}
+
+\setuppagecomment
+ [\c!state=, % \v!stop would invoke background calculation
+ \c!location=\v!bottom,
+ \c!offset=.5cm,
+ \c!distance=.5cm,
+ \c!height=5cm,
+ \c!width=10cm]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/page-flt.lua b/Master/texmf-dist/tex/context/base/page-flt.lua
index 74d1e4e8c04..b691dbd45c1 100644
--- a/Master/texmf-dist/tex/context/base/page-flt.lua
+++ b/Master/texmf-dist/tex/context/base/page-flt.lua
@@ -6,18 +6,25 @@ if not modules then modules = { } end modules ['page-flt'] = {
license = "see context related readme files"
}
-local setdimen, setbox, setcount, texbox = tex.setdimen, tex.setbox, tex.setcount, tex.box
+-- floats -> managers.floats
+
local insert, remove = table.insert, table.remove
-local texwrite, texsprint, ctxcatcodes = tex.write, tex.sprint, tex.ctxcatcodes
+local find = string.find
+local setdimen, setcount, texbox = tex.setdimen, tex.setcount, tex.box
local copy_node_list = node.copy_list
local trace_floats = false trackers.register("graphics.floats", function(v) trace_floats = v end) -- name might change
+local report_floats = logs.reporter("structure","floats")
+
+local C, S, P, lpegmatch = lpeg.C, lpeg.S, lpeg.P, lpeg.match
+
-- we use floatbox, floatwidth, floatheight
-- text page leftpage rightpage (todo: top, bottom, margin, order)
-floats = floats or { }
+floats = floats or { }
+local floats = floats
local noffloats, last, default, pushed = 0, nil, "text", { }
@@ -27,6 +34,7 @@ local function initialize()
page = { },
leftpage = { },
rightpage = { },
+ somewhere = { },
}
end
@@ -39,7 +47,7 @@ function floats.stacked(which) -- floats.thenofstacked
end
function floats.thestacked(which)
- return texwrite(#stacks[which or default])
+ return context(#stacks[which or default])
end
function floats.push()
@@ -71,34 +79,48 @@ local function setdimensions(b)
return w, h, d
end
-local function get(stack,n)
- n = n or #stack
- if n > 0 then
- local t = stack[n]
- if t then
- return t, t.box, n
+local function get(stack,n,bylabel)
+ if bylabel then
+ for i=1,#stack do
+ local s = stack[i]
+ local n = string.topattern(tostring(n)) -- to be sure
+ if find(s.data.label,n) then
+ return s, s.box, i
+ end
+ end
+ else
+ n = n or #stack
+ if n > 0 then
+ local t = stack[n]
+ if t then
+ return t, t.box, n
+ end
end
end
end
function floats.save(which,data)
which = which or default
- local stack = stacks[which]
- noffloats = noffloats + 1
local b = texbox.floatbox
- local w, h, d = b.width, b.height, b.depth
- local t = {
- n = noffloats,
- data = data or { },
- box = copy_node_list(b),
- }
- texbox.floatbox = nil
- insert(stack,t)
- setcount("global","savednoffloats",#stacks[default])
- if trace_floats then
- logs.report("floats","saving %s float %s in slot %s (%i,%i,%i)",which,noffloats,#stack,w,h,d)
+ if b then
+ local stack = stacks[which]
+ noffloats = noffloats + 1
+ local w, h, d = b.width, b.height, b.depth
+ local t = {
+ n = noffloats,
+ data = data or { },
+ box = copy_node_list(b),
+ }
+ texbox.floatbox = nil
+ insert(stack,t)
+ setcount("global","savednoffloats",#stacks[default])
+ if trace_floats then
+ report_floats("saving %s float %s in slot %s (%i,%i,%i)",which,noffloats,#stack,w,h,d)
+ else
+ interfaces.showmessage("floatblocks",2,noffloats)
+ end
else
- interfaces.showmessage("floatblocks",2,noffloats)
+ report_floats("unable to save %s float %s (empty)",which,noffloats)
end
end
@@ -113,30 +135,30 @@ function floats.resave(which)
insert(stack,1,last)
setcount("global","savednoffloats",#stacks[default])
if trace_floats then
- logs.report("floats","resaving %s float %s in slot %s (%i,%i,%i)",which,noffloats,#stack,w,h,d)
+ report_floats("resaving %s float %s in slot %s (%i,%i,%i)",which,noffloats,#stack,w,h,d)
else
interfaces.showmessage("floatblocks",2,noffloats)
end
else
- logs.report("floats","unable to resave float")
+ report_floats("unable to resave float")
end
end
-function floats.flush(which,n)
+function floats.flush(which,n,bylabel)
which = which or default
local stack = stacks[which]
- local t, b, n = get(stack,n or 1)
+ local t, b, n = get(stack,n or 1,bylabel)
if t then
local w, h, d = setdimensions(b)
if trace_floats then
- logs.report("floats","flushing %s float %s from slot %s (%i,%i,%i)",which,t.n,n,w,h,d)
+ report_floats("flushing %s float %s from slot %s (%i,%i,%i)",which,t.n,n,w,h,d)
else
interfaces.showmessage("floatblocks",3,t.n)
end
texbox.floatbox = b
last = remove(stack,n)
last.box = nil
- setcount("global","savednoffloats",#stacks[default])
+ setcount("global","savednoffloats",#stacks[default]) -- default?
else
setdimensions()
end
@@ -145,7 +167,7 @@ end
function floats.thevar(name,default)
local value = last and last.data[name] or default
if value and value ~= "" then
- texsprint(ctxcatcodes,value)
+ context(value)
end
end
@@ -156,12 +178,12 @@ function floats.consult(which,n)
if t then
local w, h, d = setdimensions(b)
if trace_floats then
- logs.report("floats","consulting %s float %s in slot %s (%i,%i,%i)",which,t.n,n,w,h,d)
+ report_floats("consulting %s float %s in slot %s (%i,%i,%i)",which,t.n,n,w,h,d)
end
return t, b, n
else
if trace_floats then
- logs.report("floats","nothing to consult")
+ report_floats("nothing to consult")
end
setdimensions()
end
@@ -198,7 +220,7 @@ end
function floats.thecheckedpagefloat(packed)
local result = ""
- if structure.pages.is_odd() then
+ if structures.pages.is_odd() then
if #stacks.rightpage > 0 then
result = "rightpage"
elseif #stacks.page > 0 then
@@ -223,5 +245,28 @@ function floats.thecheckedpagefloat(packed)
end
end
end
- texsprint(ctxcatcodes,result)
+ context(result)
+end
+
+local method = C((1-S(", :"))^1)
+local position = P(":") * C((1-S("*,"))^1) * P("*") * C((1-S(","))^1)
+local label = P(":") * C((1-S(",*: "))^0)
+
+local pattern = method * (label * position + C("") * position + label + C("") * C("") * C(""))
+
+-- table.print { lpeg.match(pattern,"somewhere:blabla,crap") }
+-- table.print { lpeg.match(pattern,"somewhere:1*2") }
+-- table.print { lpeg.match(pattern,"somewhere:blabla:1*2") }
+-- table.print { lpeg.match(pattern,"somewhere::1*2") }
+-- table.print { lpeg.match(pattern,"somewhere,") }
+-- table.print { lpeg.match(pattern,"somewhere") }
+
+function floats.analysemethod(str)
+ if str ~= "" then -- extra check, already done at the tex end
+ local method, label, row, column = lpegmatch(pattern,str)
+ context.setvalue("floatmethod",method or "")
+ context.setvalue("floatlabel", label or "")
+ context.setvalue("floatrow", row or "")
+ context.setvalue("floatcolumn",column or "")
+ end
end
diff --git a/Master/texmf-dist/tex/context/base/page-flt.mkiv b/Master/texmf-dist/tex/context/base/page-flt.mkiv
index 944626b8e9c..6d23891767c 100644
--- a/Master/texmf-dist/tex/context/base/page-flt.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-flt.mkiv
@@ -75,6 +75,10 @@
{\ctxlua{floats.flush("#1",\number#2)}%
\the\everyfloatscheck}
+\def\dofloatsflushbylabel#1#2%
+ {\ctxlua{floats.flush("#1","#2",true)}%
+ \the\everyfloatscheck}
+
\def\dofloatssave#1%
{\ctxlua{floats.save("#1")}%
\the\everyfloatscheck}
@@ -95,7 +99,7 @@
{\ctxlua{floats.consult("#1")}}
\def\doifsavedfloatelse#1%
- {\ctxlua{commands.doifsavedfloatelse("#1")}}
+ {\ctxcommand{doifsavedfloatelse("#1")}}
\def\dofloatscollect#1#2#3%
{\ctxlua{floats.collect("#1",\number\dimexpr#2,\number\dimexpr#3)}}
@@ -112,6 +116,41 @@
\def\dofloatssavepagefloat#1#2%
{\ctxlua{floats.save("#1", { specification = "#2" })}}
+\def\dofloatssavesomewherefloat#1#2% #1=method
+ {\ctxlua{floats.save("#1", { specification = "#2", label = "\floatlabel" })}}
+
+%D This is an experimental new feature (for Alan Braslau), a prelude to more:
+%D
+%D \starttyping
+%D test \placefigure{}{}
+%D test \placefigure[somewhere:alpha][whatever]{}{}
+%D test \placefigure[somewhere:beta] [whatever]{}{}
+%D test \placefigure[somewhere:gamma][whatever]{}{}
+%D test \placefigure[somewhere:delta][whatever]{}{}
+%D test \placefigure{}{}
+%D
+%D in \in{figure}[whatever] bla bla
+%D
+%D \placenamedfloat[figure][*l*]
+%D \placenamedfloat[figure][gamma]
+%D \placenamedfloat[figure][beta]
+%D \stoptyping
+
+\def\placenamedfloat
+ {\dodoubleargument\doplacenamedfloat}
+
+\def\doplacenamedfloat[#1][#2]%
+ {\doloop
+ {\dofloatsflushbylabel\s!somewhere{#2}%
+ \ifvoid\floatbox
+ \exitloop
+ \else
+ \def\currentfloat{#1}%
+ \blank[\@@bkspacebefore]%
+ \box\floatbox
+ \blank[\@@bkspaceafter]
+ \fi}}
+
%D The following code is in transition as we don't want to break the
%D current single column, multi column, and columnset mechanism.
%D
@@ -119,7 +158,7 @@
\def\dogetfloat
{\ifsomefloatwaiting
- \dofloatsflush{text}{1}%
+ \dofloatsflush\s!text{1}%
\ifcenterfloatbox
\ifdim\wd\globalscratchbox<\hsize
\global\setbox\floatbox\hbox to \hsize{\hss\box\floatbox\hss}%
@@ -138,14 +177,14 @@
\fi}
\def\dosavefloat
- {\dofloatssave{text}%
+ {\dofloatssave\s!text
\nonoindentation} % brrr nonoindentation here
\def\doresavefloat
- {\dofloatsresave{text}}
+ {\dofloatsresave\s!text}
\def\doreversesavefloat
- {\dofloatsresave{text}}
+ {\dofloatsresave\s!text}
\def\doflushsavedfloats % simplified \OTRONEdodoflushfloats
{\doloop
@@ -177,21 +216,21 @@
% \def\doflushpagefloats
% {\doifoddpageelse
-% {\ifnum\dofloatsnofstacked{rightpage}>\zerocount
-% \doflushsomepagefloat{rightpage}%
-% \else\ifnum\dofloatsnofstacked{page}>\zerocount
-% \doflushsomepagefloat{page}
-% \else\ifnum\dofloatsnofstacked{leftpage}>\zerocount
-% \null\vfill\eject
-% %\doflushsomepagefloat{leftpage}%
+% {\ifnum\dofloatsnofstacked\s!rightpage>\zerocount
+% \doflushsomepagefloat\s!rightpage
+% \else\ifnum\dofloatsnofstacked\s!page>\zerocount
+% \doflushsomepagefloat\s!page
+% \else\ifnum\dofloatsnofstacked\s!leftpage>\zerocount
+% \emptyhbox\vfill\eject
+% %\doflushsomepagefloat\s!leftpage
% \fi\fi\fi}
-% {\ifnum\dofloatsnofstacked{leftpage}>\zerocount
-% \doflushsomepagefloat{leftpage}%
-% \else\ifnum\dofloatsnofstacked{page}>\zerocount
-% \doflushsomepagefloat{page}
-% \else\ifnum\dofloatsnofstacked{rightpage}>\zerocount
-% \null\vfill\eject
-% %\doflushsomepagefloat{rightpage}%
+% {\ifnum\dofloatsnofstacked\s!leftpage>\zerocount
+% \doflushsomepagefloat\s!leftpage
+% \else\ifnum\dofloatsnofstacked\s!page>\zerocount
+% \doflushsomepagefloat\s!page
+% \else\ifnum\dofloatsnofstacked\s!rightpage>\zerocount
+% \emptyhbox\vfill\eject
+% %\doflushsomepagefloat\s!rightpage
% \fi\fi\fi}}
\def\doflushpagefloats
@@ -199,7 +238,7 @@
\ifx\checkedpagefloat\empty
% nothing
\else\ifx\checkedpagefloat\v!empty
- \null\vfill\eject
+ \emptyhbox\vfill\eject
\else
\doflushsomepagefloat\checkedpagefloat
\fi\fi}
@@ -230,4 +269,20 @@
\ifdefined\doflushfloats\else \let\doflushfloats\relax \fi
\ifdefined\flushfloatbox\else \let\flushfloatbox\relax \fi
+% temp hack, needed to prevent floatbox being forgotten during
+% output, this will change to using another box for flushing
+%
+% \dorecurse{700}{text } \placefigure[top][]{First} {\framed{bla 1}}
+% \placefigure[top][]{Second}{\framed{bla 2}}
+% \dorecurse {40}{text } \placefigure[top][]{Third} {\framed{bla 3}}
+
+\newbox\savedfloatbox
+
+\appendtoks
+ \global\setbox\savedfloatbox\box\floatbox
+\to \everybeforeoutput
+\appendtoks
+ \global\setbox\floatbox\box\savedfloatbox
+\to \everyafteroutput
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/page-imp.mkii b/Master/texmf-dist/tex/context/base/page-imp.mkii
index e4ece04a626..4c22d4d2d6d 100644
--- a/Master/texmf-dist/tex/context/base/page-imp.mkii
+++ b/Master/texmf-dist/tex/context/base/page-imp.mkii
@@ -3,7 +3,7 @@
%D version=1998.01.15,
%D title=\CONTEXT\ Page Macros,
%D subtitle=Pagebody Building (Imposition),
-%D author=Hans Hagen,
+%D author=Hans Hagen & Willi Egger,
%D date=\currentdate,
%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
@@ -355,7 +355,7 @@
\pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWODOWN}
\installpagearrangement 2*4*2 % one defined by Willy Egger:
- {\dosetuparrangement{2}{2}{4}{3}{2}%
+ {\dosetuparrangement{2}{2}{4}{3}{3}%
\pusharrangedpageSIXTEENTWO\poparrangedpagesAtoD\relax}
\installpagearrangement 2*2*4 % onother one of Willy Egger
@@ -806,6 +806,364 @@
\setuppaper
[\c!width =\dimexpr\printpaperwidth -2\dimexpr\@@ppbackspace\relax\relax,
\c!height=\dimexpr\printpaperheight-2\dimexpr\@@pptopspace \relax\relax]
+
+%D Might be used if a printer is printing from a rol 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]
+
+\installpagearrangement 2*8*Z
+ {\dosetuparrangement{2}{4}{8}{3}{5}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageSIXTEENZ\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageSIXTEENZ#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}101\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}111\arrangedpageA % 4
+ \or \handlearrangedpageXandY{#1}012\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}002\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}103\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}113\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}103\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}113\arrangedpageB % 10
+ \or \handlearrangedpageXandY{#1}012\arrangedpageB % 11
+ \or \handlearrangedpageXandY{#1}002\arrangedpageA % 12
+ \or \handlearrangedpageXandY{#1}101\arrangedpageA % 13
+ \or \handlearrangedpageXandY{#1}111\arrangedpageB % 14
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 15
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 16
+ \poparrangedpages
+ \fi}
+
+%D Another Z-folded section with 12 pages
+%D Coding: [2*6*Z]
+
+\installpagearrangement 2*6*Z
+ {\dosetuparrangement{2}{3}{6}{3}{4}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageTWELVEZ\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageTWELVEZ#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 1: rotation (0=upright),x (0=first column),y (0=first row)
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}101\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}111\arrangedpageA % 4
+ \or \handlearrangedpageXandY{#1}012\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}002\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}012\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}002\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}101\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}111\arrangedpageB % 10
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 11
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 12
+ \poparrangedpages
+ \fi}
+
+%D For Heinz' special greeting cards folding. This scheme is also used for the PocketDiary (module):
+%D Coding: [1*8]
+
+\installpagearrangement 1*8
+ {\dosetuparrangement{4}{2}{8}{5}{3} % X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageEIGHTSINGLESIDEDFOLDED\poparrangedpagesTWO\relax}
+
+\def\pusharrangedpageEIGHTSINGLESIDEDFOLDED#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 2
+ \or \handlearrangedpageXandY{#1}030\arrangedpageA % 3
+ \or \handlearrangedpageXandY{#1}131\arrangedpageA % 4
+ \or \handlearrangedpageXandY{#1}121\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}111\arrangedpageA % 6
+ \or \handlearrangedpageXandY{#1}101\arrangedpageA % 7
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 8
+ \poparrangedpages
+ \fi}
+
+%D This is not a section. \CONTEXT\ places 4 pages on a sheet of paper, singlesided
+%D Coding: [1*4]
+
+\installpagearrangement 1*4
+ {\dosetuparrangement{2}{2}{4}{3}{3} % X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageFOURSINGLESIDEDFOLDED\poparrangedpagesTWO\relax}
+
+\def\pusharrangedpageFOURSINGLESIDEDFOLDED#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 2
+ \or \handlearrangedpageXandY{#1}011\arrangedpageA % 3
+ \or \handlearrangedpageXandY{#1}110\arrangedpageA % 4
+ \poparrangedpages
+ \fi}
+
+%D This imposition scheme was requested by Hraban Ramm, by Willi Egger 21-07-2003
+%D Coding: [3SIDE]
+
+\installpagearrangement 3SIDE
+ {\dosetuparrangement{3}{1}{3}{4}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageTHREESIDE\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageTHREESIDE#1% Willi's approach
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 2
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 3
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 5
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 6
+ \poparrangedpages
+ \fi}
+
+%D FLYER in three parts and 6 pages 22-10-2010
+%D Coding: [TRYPTICHON]
+
+\installpagearrangement TRYPTICHON
+ {\dosetuparrangement{3}{1}{3}{4}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageFOLDERSIX\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageFOLDERSIX#1% Willi's approach
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 6
+ \poparrangedpages
+ \fi}
+
+%D FLYER in Z-fold with 8 pages 22-01-2010
+%D Coding: [ZFLYER-8]
+
+\installpagearrangement ZFLYER-8
+ {\dosetuparrangement{4}{1}{4}{5}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageZFOLDEREIGHT\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageZFOLDEREIGHT#1% Willi's approach
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}030\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}030\arrangedpageB % 5
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 6
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 7
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 8
+ \poparrangedpages
+ \fi}
+
+%D FLYER in Z-fold with 10 pages 04-08-2010
+%D Coding: [ZFLYER-10]
+
+\installpagearrangement ZFLYER-10
+ {\dosetuparrangement{5}{1}{5}{6}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageZFLYERTEN\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageZFLYERTEN#1% Willi's approach
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}040\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}030\arrangedpageB % 5
+ \or \handlearrangedpageXandY{#1}040\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 7
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}030\arrangedpageA % 10
+ \poparrangedpages
+ \fi}
+
+
+%D FLYER in Z-fold with 12 pages 04-08-2010
+%D Coding: [ZFLYER-12]
+
+\installpagearrangement ZFLYER-12
+ {\dosetuparrangement{6}{1}{6}{7}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageZFLYERTWELVE\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageZFLYERTWELVE#1% Willi's approach
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}050\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}030\arrangedpageB % 5
+ \or \handlearrangedpageXandY{#1}040\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}050\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 10
+ \or \handlearrangedpageXandY{#1}030\arrangedpageA % 11
+ \or \handlearrangedpageXandY{#1}040\arrangedpageA % 12
+ \poparrangedpages
+ \fi}
+
+%D FLYER folded as a map with 6 pages per side.
+%D Coding: [MAPFLYER-12]
+
+\installpagearrangement MAPFLYER-12
+ {\dosetuparrangement{3}{2}{6}{4}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageMFOLDERTWELVE\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageMFOLDERTWELVE#1% Willi's approach
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}001\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}011\arrangedpageB % 5
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}021\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 10
+ \or \handlearrangedpageXandY{#1}011\arrangedpageA % 11
+ \or \handlearrangedpageXandY{#1}021\arrangedpageA % 12
+ \poparrangedpages
+ \fi}
+
+%D FLYER folded as double window with 4 pages per side.
+%D Coding: [DOUBLEWINDOW]
+
+\installpagearrangement DOUBLEWINDOW
+ {\dosetuparrangement{4}{1}{4}{5}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageDOUBLEWINDOWEIGHT\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageDOUBLEWINDOWEIGHT#1% Willi's approach
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}030\arrangedpageA % 2
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 5
+ \or \handlearrangedpageXandY{#1}030\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 7
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 8
+ \poparrangedpages
+ \fi}
+
+%D Imposition as requested by Jan Pohanka 26-08-2010, 4 pages, two verso, two recto,
+%D uneven pages upright and down, even pages top and rotated 180.
+%D Implementation with 2 pages for conference-name-display
+%D Coding: [1*2-Conference]
+
+\installpagearrangement 1*2-Conference
+ {\dosetuparrangement{1}{2}{4}{3}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageCONFERENCE2\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageCONFERENCE2#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 2
+ \poparrangedpages
+ \fi}
+
+%D Implementation with 4 pages for conference-name-display
+%D Coding: [1*4-Conference]
+
+\installpagearrangement 1*4-Conference
+ {\dosetuparrangement{1}{2}{4}{3}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageCONFERENCE4\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageCONFERENCE4#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 2
+ \or \handlearrangedpageXandY{#1}011\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}110\arrangedpageB % 4
+ \poparrangedpages
+ \fi}
+
+% There should be arrangements for section made of heavy and thick paper. i.e. the heavier the paper
+% the fewer pages per section:
+% Section with 8 pages put on to sheets of paper. Each sheet carries recto 2 and verso 2 pages.
+% Coding: [2*2*2]
+
+\installpagearrangement 2*2*2
+ {\dosetuparrangement{2}{1}{2}{3}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageEIGHTTWO\poparrangedpagesAtoD\relax}
+
+\def\pusharrangedpageEIGHTWO#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageC % 3
+ \or \handlearrangedpageXandY{#1}000\arrangedpageD % 4
+ \or \handlearrangedpageXandY{#1}010\arrangedpageD % 5
+ \or \handlearrangedpageXandY{#1}000\arrangedpageC % 6
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 8
+ \poparrangedpages
+ \fi}
+
+% Section with 12 pages, built from three sheets of paper.
+% Each sheet carries 2 pages recto and verso.
+% Coding: [2*2*3]
+
+\def\poparrangedpagesAtoF
+ {\ifnum\arrangedpageN>\zerocount
+ \paperwidth \arrangedpageX\paperwidth
+ \paperheight\arrangedpageY\paperheight
+ \outputarrangedbox\arrangedpageA
+ \outputarrangedbox\arrangedpageB
+ \outputarrangedbox\arrangedpageC
+ \outputarrangedbox\arrangedpageD
+ \outputarrangedbox\arrangedpageE
+ \outputarrangedbox\arrangedpageF
+ \global\arrangedpageN\zerocount
+ \fi}
+\installpagearrangement 2*2*3
+ {\dosetuparrangement{2}{1}{2}{3}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageTWELVETWO\poparrangedpagesAtoD\relax}
+
+\def\pusharrangedpageTWELVETWO#1%
+ {\doglobal\increment\arrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageC % 3
+ \or \handlearrangedpageXandY{#1}000\arrangedpageD % 4
+ \or \handlearrangedpageXandY{#1}010\arrangedpageE % 5
+ \or \handlearrangedpageXandY{#1}000\arrangedpageF % 6
+ \or \handlearrangedpageXandY{#1}010\arrangedpageF % 7
+ \or \handlearrangedpageXandY{#1}000\arrangedpageE % 8
+ \or \handlearrangedpageXandY{#1}010\arrangedpageD % 9
+ \or \handlearrangedpageXandY{#1}000\arrangedpageC % 10
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 11
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 12
+ \poparrangedpages
+ \fi}
% \definepageshift[test][horizontal][10pt,20pt,30pt,40pt,50pt]
% \definepageshift[test][vertical] [10pt,20pt,30pt,40pt,50pt]
diff --git a/Master/texmf-dist/tex/context/base/page-imp.mkiv b/Master/texmf-dist/tex/context/base/page-imp.mkiv
index a0f32ef8611..b6fa75c8ba6 100644
--- a/Master/texmf-dist/tex/context/base/page-imp.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-imp.mkiv
@@ -3,7 +3,7 @@
%D version=1998.01.15,
%D title=\CONTEXT\ Page Macros,
%D subtitle=Pagebody Building (Imposition),
-%D author=Hans Hagen,
+%D author=Hans Hagen & Willi Egger,
%D date=\currentdate,
%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
@@ -23,9 +23,7 @@
%
% \starttext \dorecurse{10}{\input tufte \par} \stoptext
-% to be moved code:
-
-\newif\ifclipprintbox \clipprintboxtrue
+\newif\ifclipprintbox \clipprintboxtrue % todo: conditional
%newif\ifclippagebox \clippageboxtrue
\def\clippedprintbox#1#2% can be made more efficient, see other clipper
@@ -59,7 +57,7 @@
\let\clippagebox \gobbleoneargument
\let\clipprintbox\gobbleoneargument
-
+
% \setuppagenumbering[alternative=doublesided]
% \setupcolors[state=start]
% \setuppapersize[A4][A4,oversized]
@@ -106,7 +104,7 @@
%D This is a user macro (appending to every last shipout is not
%D really user friendly.
-\newtoks \collectedtextdata
+\newtoks\collectedtextdata
\long\unexpanded\def\starttextdata#1\stoptextdata
{\doglobal\appendtoks#1\to\collectedtextdata}
@@ -127,6 +125,7 @@
\def\myshipout#1%
{\beforeshipout % voor de pagebody dus !
\dontshowcomposition
+ \dontcomplain
\executeifdefined{\??pp:\c!method:\@@ppmethod}\gobbleoneargument{#1}%
\setnextrealpageno
\aftershipout}
@@ -148,11 +147,14 @@
% \stoptypen
\newcount\shippedoutpages
+\newcount\combinedpagescounter
+
+\let\pagestoshipout\empty % {1,3,6}
+\newconstant\whichpagetoshipout % 0=all 1=odd 2=even
-\let\pagestoshipout\empty % {1,3,6}
-\chardef\whichpagetoshipout=0 % 0=all 1=odd 2=even
+\newbox\shipoutscratchbox
-\def\actualshipout#1%
+\def\actualshipout#1% todo: less callbacks
{\global\advance\shippedoutpages\plusone
% this is not resource safe!
\ifx\pagestoshipout\empty
@@ -170,33 +172,33 @@
\donetrue\donefalse
\fi
\ifdone
+ \begingroup
+ \setbox\shipoutscratchbox\hbox{#1}% just in case there are objects there, hook for testing
+ \finalizeshipoutbox\shipoutscratchbox
+ \setbox\scratchbox\hbox
+ {% before the main one !
+ \ifcase\realfolio \or
+ \the\everyfirstshipout
+ \global\everyfirstshipout\emptytoks
+ \fi
+ % the main one
+ \the\everyshipout\relax
+ % always last (and after the main one)
+ \ifnum\realpageno=\lastpage\relax
+ \the\everylastshipout
+ \global\everylastshipout\emptytoks
+ \fi}%
+ \smashbox\scratchbox
\shipout\vbox
- {%\forgetall
- \offinterlineskip
- \dontcomplain
- \scratchdimen-1in
+ {\offinterlineskip
+ \scratchdimen-1in % to be done in luatex: zero that one
\vskip\scratchdimen
\hskip\scratchdimen
- \setbox0\hbox{#1}% just in case there are objects there, hook for testing
- \finalizeshipoutbox0%
- \setbox\scratchbox\hbox
- {% before the main one !
- \ifcase\realfolio \or
- \the\everyfirstshipout
- \global\everyfirstshipout\emptytoks
- \fi
- % the main one
- \the\everyshipout\relax
- % always last (and after the main one)
- \ifnum\realpageno=\lastpage\relax
- \the\everylastshipout
- \global\everylastshipout\emptytoks
- \fi}%
- \smashbox\scratchbox
\hbox % \setbox0=\box.. is nicer
{\box\scratchbox
\ifvoid\postponedcontent\else\box\postponedcontent\fi % evt ver naar links !
- \box0}}%
+ \box\shipoutscratchbox}}%
+ \endgroup
\else
\message
{[\ifarrangingpages arranged \fi page
@@ -214,87 +216,114 @@
%D We need a couple of boxes for duplex printing \unknown
\newbox\arrangedpageA \newbox\arrangedpageB
-
-%D \unknown\ and some for simulating big sheets.
-
\newbox\arrangedpageC \newbox\arrangedpageD
\newbox\arrangedpageE \newbox\arrangedpageF
\newbox\arrangedpageG \newbox\arrangedpageH
-\newif\ifswaparranged
-\newif\ifnegatearranged
-\newif\ifmirrorarranged
-\newif\ifdoublearranged
-
-\newif\ifarrangingdisabled
+\newconditional\arrangedswapstate
+\newconditional\arrangednegatestate
+\newconditional\arrangedmirrorstate
+\newconditional\arrangeddoublestate
+\newconditional\arrangingdisabledstate
+\newconditional\arrangedbackgroundstate
\def\arrangedrotationO{0}
\def\arrangedrotationE{0}
-\newcounter\arrangedpageN
-\newcounter\arrangedpageM
+\newcount\arrangedpageN
+\newcount\arrangedpageM
-\chardef\arrangedpageT=1
-\chardef\arrangedpageX=1
-\chardef\arrangedpageY=1
+\newcount\arrangedpageT \arrangedpageT\plusone
+\newcount\arrangedpageX \arrangedpageX\plusone
+\newcount\arrangedpageY \arrangedpageY\plusone
\def\calculatepaperoffsets#1%
- {\scratchdimen\getvalue{\??pp#1\c!offset}%
- \divide\scratchdimen \arrangedpageX
- \global\advance\paperwidth -2\scratchdimen
- \scratchdimen\getvalue{\??pp#1\c!offset}%
- \divide\scratchdimen \arrangedpageY
- \global\advance\paperheight-2\scratchdimen}
+ {\global\paperoffset\getvalue{\??pp#1\c!offset}%
+ \global\advance\paperwidth -2\dimexpr\paperoffset/\arrangedpageX\relax
+ \global\advance\paperheight-2\dimexpr\paperoffset/\arrangedpageY\relax}
+
+\def\doinstallarrangedoption#1#2%
+ {\setvalue{\??pp=>#1}{#2}}
+
+\def\doinstalledarrangedoption#1%
+ {\ifcsname\??pp=>#1\endcsname
+ \csname\??pp=>#1\endcsname
+ \else
+ \checkinstalledpagearrangement{#1}% this installs the arranger
+ \fi}
+
+\doinstallarrangedoption\empty
+ {} % no default and check if empty, we can have ,,,
-\newconditional\arrangedbackgroundokay % more ifs -> conditionals
+\doinstallarrangedoption\v!disable
+ {\global\settrue\arrangingdisabledstate}
+
+\doinstallarrangedoption\v!mirrored
+ {\global\settrue\arrangedmirrorstate}
+
+\doinstallarrangedoption\v!doublesided
+ {\global\settrue\arrangeddoublestate}
+
+\doinstallarrangedoption\v!negative
+ {\global\settrue\arrangednegatestate}
+
+\doinstallarrangedoption\v!rotated
+ {\gdef\arrangedrotationO {90}%
+ \gdef\arrangedrotationE{270}%
+ \swapcounts\horizontalcutmarks\verticalcutmarks}
+
+\doinstallarrangedoption{90}
+ {\gdef\arrangedrotationO {90}%
+ \gdef\arrangedrotationE{270}%
+ \swapcounts\horizontalcutmarks\verticalcutmarks}
+
+\doinstallarrangedoption{180}
+ {\gdef\arrangedrotationO{180}%
+ \gdef\arrangedrotationE {0}}
+
+\doinstallarrangedoption{270}
+ {\gdef\arrangedrotationO{270}%
+ \gdef\arrangedrotationE {90}%
+ \swapcounts\horizontalcutmarks\verticalcutmarks}
+
+\doinstallarrangedoption\s!reset
+ {\global\arrangingpagesfalse}
+
+\doinstallarrangedoption\v!background
+ {\global\settrue\arrangedbackgroundstate}
\unexpanded\def\setuparranging[#1]%
- {\ifarrangingdisabled \else
- \doifelse{#1}\v!disable
- {\global\arrangingdisabledtrue}
- {\global\arrangingdisabledfalse}%
- \global\arrangingpagestrue
- \global\negatearrangedfalse
- \global\mirrorarrangedfalse
- \global\doublearrangedfalse
+ {\ifconditional\arrangingdisabledstate \else
+ %global\setfalse\arrangingdisabledstate
+ \global\arrangingpagestrue % will be conditional
+ \global\setfalse\arrangednegatestate
+ \global\setfalse\arrangedmirrorstate
+ \global\setfalse\arrangeddoublestate
+ \global\setfalse\arrangedswapstate
\gdef\arrangedrotationO{0}%
\gdef\arrangedrotationE{180}%
- \processallactionsinset
- [#1]
- [ \v!mirrored=>\global\mirrorarrangedtrue,
- \v!doublesided=>\global\doublearrangedtrue,
- \v!negative=>\global\negatearrangedtrue,
- \v!rotated=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
- 90=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
- 180=>\gdef\arrangedrotationO{180}\gdef\arrangedrotationE{0},
- 270=>\gdef\arrangedrotationO{270}\gdef\arrangedrotationE{90},
- \s!reset=>\global\arrangingpagesfalse,
- \v!background=>\global\settrue\arrangedbackgroundokay,
- \s!unknown=>\checkinstalledpagearrangement\commalistelement]%
- % no \s!default=> we can have aaa,,bbb
+ \processcommalist[#1]\doinstalledarrangedoption
\ifx\handlearrangedpage\undefined
\global\arrangingpagesfalse
\fi
- \doifcommonelse{#1}{90,270,\v!rotated}
- {\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution
\setuppapersize
\fi}
-\def\installpagearrangement #1 %
+\def\installpagearrangement #1 % will lchange, no space
{\setgvalue{\??pp\??pp#1}}
\def\checkinstalledpagearrangement#1% can be empty: aaa,,bbb
{\executeifdefined{\??pp\??pp#1}\donothing}
\def\dosetuparrangement#1#2#3#4#5#6#7#8%
- {\global\chardef\arrangedpageX #1%
- \global\chardef\arrangedpageY #2%
- \global\chardef\arrangedpageT #3%
- \global\chardef\horizontalcutmarks#4%
- \global\chardef\verticalcutmarks #5%
- \global\let \pusharrangedpage #6%
- \global\let \poparrangedpages #7%
- \global\let \handlearrangedpage#8}
+ {\global\arrangedpageX #1%
+ \global\arrangedpageY #2%
+ \global\arrangedpageT #3%
+ \global\horizontalcutmarks #4%
+ \global\verticalcutmarks #5%
+ \global\let\pusharrangedpage #6%
+ \global\let\poparrangedpages #7%
+ \global\let\handlearrangedpage#8}
\installpagearrangement {\v!normal}
{\global\arrangingpagesfalse}
@@ -336,7 +365,7 @@
\pusharrangedpageTWO\poparrangedpagesTWO\handlearrangedpageTWODOWN}
\installpagearrangement 2*4*2 % one defined by Willy Egger:
- {\dosetuparrangement{2}{2}{4}{3}{2}%
+ {\dosetuparrangement{2}{2}{4}{3}{3}%
\pusharrangedpageSIXTEENTWO\poparrangedpagesAtoD\relax}
\installpagearrangement 2*2*4 % onother one of Willy Egger
@@ -347,16 +376,6 @@
{\dosetuparrangement{1}{2}{4}{2}{3}%
\pusharrangedpageTWOTOPSIDE\poparrangedpagesTWOTOPSIDE\handlearrangedpageTOP}
-% \def\filluparrangedpages % beware: \realpageno is 1 ahead
-% {\ifarrangingpages
-% \scratchcounter-\realpageno
-% \divide\scratchcounter \arrangedpageT
-% \multiply\scratchcounter \arrangedpageT
-% \advance\scratchcounter \realpageno
-% \advance\scratchcounter \minusone
-% \dorecurse\scratchcounter{\noheaderandfooterlines\ejectdummypage}%
-% \fi}
-
\def\filluparrangedpages % beware: \realpageno is 1 ahead
{\ifarrangingpages
\scratchcounter\numexpr\realpageno-\plusone\relax
@@ -371,9 +390,7 @@
\def\handlearrangedpageXandY#1#2#3#4#5%
{\global\setbox#5\hbox to \arrangedpageX\paperwidth
{\setbox\scratchbox\vbox to \arrangedpageY\paperheight
- {%\forgetall
- \offinterlineskip
- \dontcomplain
+ {\offinterlineskip
\vskip#4\paperheight
\hskip#3\paperwidth
\dorotatebox{\ifcase#2 0\else180\fi}\hbox{\box#1}%
@@ -391,7 +408,7 @@
\gotonextarrangepage
\ifnum\arrangedrotationO\arrangedrotationE>\zerocount
\setbox#1\vbox
- {\ifdoublearranged
+ {\ifconditional\arrangeddoublestate
\ifodd\arrangeno
\dorotatebox\arrangedrotationO\hbox{\box#1}%
\else
@@ -401,36 +418,41 @@
\dorotatebox\arrangedrotationO\hbox{\box#1}%
\fi}%
\fi
- \ifmirrorarranged
+ \ifconditional\arrangedmirrorstate
\setbox#1\vbox{\domirrorbox\vbox{\box#1}}%
\fi
- \ifnegatearranged
+ \ifconditional\arrangednegatestate
\negatecolorbox{#1}%
\fi
\finishpagebox#1%
- \ifconditional\arrangedbackgroundokay\addprintbackground#1\fi
+ \ifconditional\arrangedbackgroundstate\addprintbackground#1\fi
\actualshipout{\box#1}%
\egroup}
%D The format file can be 16K smaller when we postpone the
%D real arrangments. Some day ...
+\def\reportarrangedpage#1%
+ {\showmessage\m!system{23}{\the\realpageno.\the\pageno\ifnum\subpageno>0 .\the\subpageno\fi,\number#1}}
+
+\def\advancearrangedpageN
+ {\global\advance\arrangedpageN\plusone}
+
% TOP
% 32/16/8/4/SIDE
\def\poparrangedpagesAB
{\ifnum\arrangedpageN>\zerocount
- \dontcomplain
\paperwidth\arrangedpageX\paperwidth
\paperheight\arrangedpageY\paperheight
\outputarrangedbox\arrangedpageA
\outputarrangedbox\arrangedpageB
- \doglobal\newcounter\arrangedpageN
+ \global\arrangedpageN\zerocount
\fi}
\def\pusharrangedpageTHIRTYTWO#1% taco's challenge
- {\doglobal\increment\arrangedpageN
+ {\advancearrangedpageN
\reportarrangedpage\arrangedpageN
\ifcase\arrangedpageN
\or \handlearrangedpageXandY{#1}033\arrangedpageA % 1
@@ -469,7 +491,7 @@
\fi}
\def\pusharrangedpageSIXTEEN#1% changed to match the official way of doing
- {\doglobal\increment\arrangedpageN
+ {\advancearrangedpageN
\reportarrangedpage\arrangedpageN
\ifcase\arrangedpageN
\or \handlearrangedpageXandY{#1}031\arrangedpageA % 1
@@ -492,7 +514,7 @@
\fi}
\def\pusharrangedpageEIGHT#1% changed to match the official way of doing
- {\doglobal\increment\arrangedpageN
+ {\advancearrangedpageN
\reportarrangedpage\arrangedpageN
\ifcase\arrangedpageN
\or \handlearrangedpageXandY{#1}011\arrangedpageA % 1
@@ -510,7 +532,7 @@
\def\pusharrangedpageFOURB{\pusharrangedpageFOURdo10}
\def\pusharrangedpageFOURdo#1#2#3%
- {\doglobal\increment\arrangedpageN
+ {\advancearrangedpageN
\reportarrangedpage\arrangedpageN
\ifcase\arrangedpageN
\or \handlearrangedpageXandY{#3}010\arrangedpageA % 1
@@ -521,7 +543,7 @@
\fi}
\def\pusharrangedpageSIDETOP#1%
- {\doglobal\increment\arrangedpageN
+ {\advancearrangedpageN
\reportarrangedpage\arrangedpageN
\ifcase\arrangedpageN
\or \handlearrangedpageXandY{#1}000\arrangedpageA % 1
@@ -540,8 +562,7 @@
{\global\ht\arrangedpageA\paperheight
\global\ht\arrangedpageB\paperheight
\global\setbox\arrangedpageA\vbox
- {%\forgetall
- \offinterlineskip\vskip\paperheight
+ {\offinterlineskip\vskip\paperheight
\box\arrangedpageA\box\arrangedpageB}%
\global\setbox\arrangedpageB\box\scratchbox} % ?
@@ -557,16 +578,16 @@
\def\handlearrangedpageTWOUP
{\splitoffarrangedpagesTWO
- \ifswaparranged
+ \ifconditional\arrangedswapstate
\global\setbox\arrangedpageA\hbox
- {\clippedprintbox0\arrangedpageA
- \clippedprintbox1\arrangedpageB}%
- \swaparrangedfalse
+ {\clippedprintbox\zerocount\arrangedpageA
+ \clippedprintbox\plusone \arrangedpageB}%
+ \setfalse\arrangedswapstate
\else
\global\setbox\arrangedpageA\hbox
- {\clippedprintbox0\arrangedpageB
- \clippedprintbox1\arrangedpageA}%
- \swaparrangedtrue
+ {\clippedprintbox\zerocount\arrangedpageB
+ \clippedprintbox\plusone \arrangedpageA}%
+ \settrue\arrangedswapstate
\fi
\global\ht\arrangedpageA\paperheight
\global\setbox\arrangedpageB\box\scratchbox}
@@ -575,29 +596,26 @@
{\splitoffarrangedpagesTWO
\global\ht\arrangedpageA\paperheight
\global\ht\arrangedpageB\paperheight
- \ifswaparranged
+ \ifconditional\arrangedswapstate
\global\setbox\arrangedpageA\vbox
- {%\forgetall
- \offinterlineskip\vskip\paperheight
+ {\offinterlineskip\vskip\paperheight
\box\arrangedpageA\box\arrangedpageB}%
- \swaparrangedfalse
+ \setfalse\arrangedswapstate
\else
\global\setbox\arrangedpageA\vbox
- {%\forgetall
- \offinterlineskip\vskip\paperheight
+ {\offinterlineskip\vskip\paperheight
\box\arrangedpageB\box\arrangedpageA}%
- \swaparrangedtrue
+ \settrue\arrangedswapstate
\fi
\global\setbox\arrangedpageB\box\scratchbox}
\def\poparrangedpagesTWO
{\ifnum\arrangedpageN>\zerocount
- \dontcomplain
- \swaparrangedfalse
+ \setfalse\arrangedswapstate
\doloop
{\handlearrangedpage
\bgroup
- \paperwidth\arrangedpageX\paperwidth
+ \paperwidth \arrangedpageX\paperwidth
\paperheight\arrangedpageY\paperheight
\ht\arrangedpageA\paperheight
\wd\arrangedpageA\paperwidth
@@ -606,15 +624,14 @@
\ifdim\ht\arrangedpageB=\zeropoint
\exitloop
\fi}%
- \doglobal\newcounter\arrangedpageN
+ \global\arrangedpageN\zerocount
\fi}
\def\pusharrangedpageTWO#1%
- {\doglobal\increment\arrangedpageN
+ {\advancearrangedpageN
\reportarrangedpage\arrangedpageN
\global\setbox\arrangedpageB\vbox
- {%\forgetall
- \offinterlineskip
+ {\offinterlineskip
\unvbox\arrangedpageB
\allowbreak
\ht#1\onepoint
@@ -624,16 +641,18 @@
\def\poparrangedpagesTWOTOPSIDE
{\ifnum\arrangedpageN>\zerocount
\bgroup
- \gdef\arrangedpageN{2}\poparrangedpagesTWO
+ \global\arrangedpageN\plustwo
+ \poparrangedpagesTWO
\let\arrangedpageA\arrangedpageC
\let\arrangedpageB\arrangedpageD
- \gdef\arrangedpageN{2}\poparrangedpagesTWO
- \doglobal\newcounter\arrangedpageN
+ \global\arrangedpageN\plustwo
+ \poparrangedpagesTWO
+ \global\arrangedpageN\zerocount
\egroup
\fi}
\def\pusharrangedpageTWOTOPSIDE#1%
- {\doglobal\increment\arrangedpageN
+ {\advancearrangedpageN
\reportarrangedpage\arrangedpageN
\ifcase\arrangedpageN
\or \handlearrangedpageXandY{#1}000\arrangedpageA % 1
@@ -647,8 +666,7 @@
\def\poparrangedpagesAtoH
{\ifnum\arrangedpageN>\zerocount
- \dontcomplain
- \paperwidth\arrangedpageX\paperwidth
+ \paperwidth \arrangedpageX\paperwidth
\paperheight\arrangedpageY\paperheight
\outputarrangedbox\arrangedpageA
\outputarrangedbox\arrangedpageB
@@ -658,27 +676,26 @@
\outputarrangedbox\arrangedpageF
\outputarrangedbox\arrangedpageG
\outputarrangedbox\arrangedpageH
- \doglobal\newcounter\arrangedpageN
+ \global\arrangedpageN\zerocount
\fi}
% to arrange 16 pages on 2 sheets to form one booklet
\def\poparrangedpagesAtoD
{\ifnum\arrangedpageN>\zerocount
- \dontcomplain
\paperwidth\arrangedpageX\paperwidth
\paperheight\arrangedpageY\paperheight
\outputarrangedbox\arrangedpageA
\outputarrangedbox\arrangedpageB
\outputarrangedbox\arrangedpageC
\outputarrangedbox\arrangedpageD
- \doglobal\newcounter\arrangedpageN
+ \global\arrangedpageN\zerocount
\fi}
% to arrange 16 pages on 4 sheets to form one booklet
\def\pusharrangedpageSIXTEENFOUR#1%
- {\doglobal\increment\arrangedpageN
+ {\advancearrangedpageN
\reportarrangedpage\arrangedpageN
\ifcase\arrangedpageN
\or \handlearrangedpageXandY{#1}010\arrangedpageA % 1
@@ -703,7 +720,7 @@
% to arrange 16 pages on 2 sheets to form one booklet
\def\pusharrangedpageSIXTEENTWO#1%
- {\doglobal\increment\arrangedpageN
+ {\advancearrangedpageN
\reportarrangedpage\arrangedpageN
\ifcase\arrangedpageN
\or \handlearrangedpageXandY{#1}011\arrangedpageA % 1
@@ -724,6 +741,365 @@
\or \handlearrangedpageXandY{#1}001\arrangedpageA % 16
\poparrangedpages
\fi}
+
+%D Might be used if a printer is printing from a rol 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]
+
+\installpagearrangement 2*8*Z
+ {\dosetuparrangement{2}{4}{8}{3}{5}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageSIXTEENZ\poparrangedpagesAB\relax}
+
+
+\def\pusharrangedpageSIXTEENZ#1%
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 1
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}101\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}111\arrangedpageA % 4
+ \or \handlearrangedpageXandY{#1}012\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}002\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}103\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}113\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}103\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}113\arrangedpageB % 10
+ \or \handlearrangedpageXandY{#1}012\arrangedpageB % 11
+ \or \handlearrangedpageXandY{#1}002\arrangedpageA % 12
+ \or \handlearrangedpageXandY{#1}101\arrangedpageA % 13
+ \or \handlearrangedpageXandY{#1}111\arrangedpageB % 14
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 15
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 16
+ \poparrangedpages
+ \fi}
+
+%D Another Z-folded section with 12 pages
+%D Coding: [2*6*Z]
+
+\installpagearrangement 2*6*Z
+ {\dosetuparrangement{2}{3}{6}{3}{4}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageTWELVEZ\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageTWELVEZ#1%
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 1: rotation (0=upright),x (0=first column),y (0=first row)
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}101\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}111\arrangedpageA % 4
+ \or \handlearrangedpageXandY{#1}012\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}002\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}012\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}002\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}101\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}111\arrangedpageB % 10
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 11
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 12
+ \poparrangedpages
+ \fi}
+
+%D For Heinz' special greeting cards folding. This scheme is also used for the PocketDiary (module):
+%D Coding: [1*8]
+
+\installpagearrangement 1*8
+ {\dosetuparrangement{4}{2}{8}{5}{3}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageEIGHTSINGLESIDEDFOLDED\poparrangedpagesTWO\relax}
+
+\def\pusharrangedpageEIGHTSINGLESIDEDFOLDED#1%
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 2
+ \or \handlearrangedpageXandY{#1}030\arrangedpageA % 3
+ \or \handlearrangedpageXandY{#1}131\arrangedpageA % 4
+ \or \handlearrangedpageXandY{#1}121\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}111\arrangedpageA % 6
+ \or \handlearrangedpageXandY{#1}101\arrangedpageA % 7
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 8
+ \poparrangedpages
+ \fi}
+
+%D This is not a section. \CONTEXT\ places 4 pages on a sheet of paper, singlesided
+%D Coding: [1*4]
+
+\installpagearrangement 1*4
+ {\dosetuparrangement{2}{2}{4}{3}{3}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageFOURSINGLESIDEDFOLDED\poparrangedpagesTWO\relax}
+
+\def\pusharrangedpageFOURSINGLESIDEDFOLDED#1%
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 2
+ \or \handlearrangedpageXandY{#1}011\arrangedpageA % 3
+ \or \handlearrangedpageXandY{#1}110\arrangedpageA % 4
+ \poparrangedpages
+ \fi}
+
+%D This imposition scheme was requested by Hraban Ramm, by Willi Egger 21-07-2003
+%D Coding: [3SIDE]
+
+\installpagearrangement 3SIDE
+ {\dosetuparrangement{3}{1}{3}{4}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageTHREESIDE\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageTHREESIDE#1% Willi's approach
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 2
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 3
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 5
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 6
+ \poparrangedpages
+ \fi}
+
+%D FLYER in three parts and 6 pages 22-10-2010
+%D Coding: [TRYPTICHON]
+
+\installpagearrangement TRYPTICHON
+ {\dosetuparrangement{3}{1}{3}{4}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageFLYERSIX\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageFLYERSIX#1% Willi's approach
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 5
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 6
+ \poparrangedpages
+ \fi}
+
+%D FLYER in Z-fold with 8 pages 22-01-2010
+%D Coding: [ZFLYER-8]
+
+\installpagearrangement ZFLYER-8
+ {\dosetuparrangement{4}{1}{4}{5}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageZFLYEREIGHT\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageZFLYEREIGHT#1% Willi's approach
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}030\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}030\arrangedpageB % 5
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 6
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 7
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 8
+ \poparrangedpages
+ \fi}
+
+%D FLYER in Z-fold with 10 pages 04-08-2010
+%D Coding: [ZFLYER-10]
+
+\installpagearrangement ZFLYER-10
+ {\dosetuparrangement{5}{1}{5}{6}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageZFLYERTEN\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageZFLYERTEN#1% Willi's approach
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}040\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}030\arrangedpageB % 5
+ \or \handlearrangedpageXandY{#1}040\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 7
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}030\arrangedpageA % 10
+ \poparrangedpages
+ \fi}
+
+%D FLYER in Z-fold with 12 pages 04-08-2010
+%D Coding: [ZFLYER-12]
+
+\installpagearrangement ZFLYER-12
+ {\dosetuparrangement{6}{1}{6}{7}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageZFLYERTWELVE\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageZFLYERTWELVE#1% Willi's approach
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}050\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}030\arrangedpageB % 5
+ \or \handlearrangedpageXandY{#1}040\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}050\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 10
+ \or \handlearrangedpageXandY{#1}030\arrangedpageA % 11
+ \or \handlearrangedpageXandY{#1}040\arrangedpageA % 12
+ \poparrangedpages
+ \fi}
+
+%D FLYER folded as a map with 6 pages per side.
+%D Coding: [MAPFLYER-12]
+
+\installpagearrangement MAPFLYER-12
+ {\dosetuparrangement{3}{2}{6}{4}{3}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageMFLYERTWELVE\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageMFLYERTWELVE#1% Willi's approach
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}001\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}011\arrangedpageB % 5
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}021\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 8
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 9
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 10
+ \or \handlearrangedpageXandY{#1}011\arrangedpageA % 11
+ \or \handlearrangedpageXandY{#1}021\arrangedpageA % 12
+ \poparrangedpages
+ \fi}
+
+%D FLYER folded as double window with 4 pages per side.
+%D Coding: [DOUBLEWINDOW]
+
+\installpagearrangement DOUBLEWINDOW
+ {\dosetuparrangement{4}{1}{4}{5}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageDOUBLEWINDOWEIGHT\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageDOUBLEWINDOWEIGHT#1% Willi's approach
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}020\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}030\arrangedpageA % 2
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 4
+ \or \handlearrangedpageXandY{#1}020\arrangedpageB % 5
+ \or \handlearrangedpageXandY{#1}030\arrangedpageB % 6
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 7
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 8
+ \poparrangedpages
+ \fi}
+
+%D Imposition as requested by Jan Pohanka 26-08-2010, 4 pages, two verso, two recto,
+%D uneven pages upright and down, even pages top and rotated 180.
+%D Implementation with 2 pages for conference-name-display
+%D Coding: [1*2-Conference]
+
+\installpagearrangement 1*2-Conference
+ {\dosetuparrangement{1}{2}{4}{3}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageCONFERENCE2\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageCONFERENCE2#1%
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 2
+ \poparrangedpages
+ \fi}
+
+%D Implementation with 4 pages for conference-name-display
+%D Coding: [1*4-Conference]
+
+\installpagearrangement 1*4-Conference
+ {\dosetuparrangement{1}{2}{4}{3}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageCONFERENCE4\poparrangedpagesAB\relax}
+
+\def\pusharrangedpageCONFERENCE4#1%
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}001\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}100\arrangedpageA % 2
+ \or \handlearrangedpageXandY{#1}011\arrangedpageB % 3
+ \or \handlearrangedpageXandY{#1}110\arrangedpageB % 4
+ \poparrangedpages
+ \fi}
+
+%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 Coding: [2*2*2]
+
+\installpagearrangement 2*2*2
+ {\dosetuparrangement{2}{1}{2}{3}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageEIGHTTWO\poparrangedpagesAtoD\relax}
+
+\def\pusharrangedpageEIGHTTWO#1%
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageC % 3
+ \or \handlearrangedpageXandY{#1}000\arrangedpageD % 4
+ \or \handlearrangedpageXandY{#1}010\arrangedpageD % 5
+ \or \handlearrangedpageXandY{#1}000\arrangedpageC % 6
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 7
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 8
+ \poparrangedpages
+ \fi}
+
+%D Section with 12 pages, built from three sheets of paper.
+%D Each sheet carries 2 pages recto and verso.
+%D Coding: [2*2*3]
+
+\def\poparrangedpagesAtoF
+ {\ifnum\arrangedpageN>\zerocount
+ \paperwidth \arrangedpageX\paperwidth
+ \paperheight\arrangedpageY\paperheight
+ \outputarrangedbox\arrangedpageA
+ \outputarrangedbox\arrangedpageB
+ \outputarrangedbox\arrangedpageC
+ \outputarrangedbox\arrangedpageD
+ \outputarrangedbox\arrangedpageE
+ \outputarrangedbox\arrangedpageF
+ \global\arrangedpageN\zerocount
+ \fi}
+
+\installpagearrangement 2*2*3
+ {\dosetuparrangement{2}{1}{2}{3}{2}% X,Y,Total,hcutmarks,vcutmarks
+ \pusharrangedpageTWELVETWO\poparrangedpagesAtoF\relax}
+
+\def\pusharrangedpageTWELVETWO#1%
+ {\advancearrangedpageN
+ \reportarrangedpage\arrangedpageN
+ \ifcase\arrangedpageN
+ \or \handlearrangedpageXandY{#1}010\arrangedpageA % 1 rot,hskip,vskip
+ \or \handlearrangedpageXandY{#1}000\arrangedpageB % 2
+ \or \handlearrangedpageXandY{#1}010\arrangedpageC % 3
+ \or \handlearrangedpageXandY{#1}000\arrangedpageD % 4
+ \or \handlearrangedpageXandY{#1}010\arrangedpageE % 5
+ \or \handlearrangedpageXandY{#1}000\arrangedpageF % 6
+ \or \handlearrangedpageXandY{#1}010\arrangedpageF % 7
+ \or \handlearrangedpageXandY{#1}000\arrangedpageE % 8
+ \or \handlearrangedpageXandY{#1}010\arrangedpageD % 9
+ \or \handlearrangedpageXandY{#1}000\arrangedpageC % 10
+ \or \handlearrangedpageXandY{#1}010\arrangedpageB % 11
+ \or \handlearrangedpageXandY{#1}000\arrangedpageA % 12
+ \poparrangedpages
+ \fi}
% % handy for stickers etc, this way we can treat them as page
%
@@ -738,11 +1114,10 @@
% \starttext \dorecurse{30}{test \recurselevel \page} \stoptext
\def\pusharrangedpageXY#1%
- {\doglobal\increment\arrangedpageN
- \reportarrangedpage\arrangedpageN
- \doglobal\increment\arrangedpageM
- \global\setbox\arrangedpageB\hbox
- \ifdim\@@ppwidth>\zeropoint to \@@ppwidth \fi
+ {\advancearrangedpageN
+ \global\advance\arrangedpageM\plusone
+ \reportarrangedpage\arrangedpageN
+ \global\setbox\arrangedpageB\hbox \ifdim\@@ppwidth>\zeropoint to \@@ppwidth \fi
{\ifvoid\arrangedpageB\else
\unhbox\arrangedpageB
\ifdim\@@ppdx>\zeropoint \else \hss\fi
@@ -751,8 +1126,7 @@
\fi
\box#1}%
\ifnum\arrangedpageM<\arrangedpageX\else
- \global\setbox\arrangedpageA\vbox
- \ifdim\@@ppheight>\zeropoint to \@@ppheight \fi
+ \global\setbox\arrangedpageA\vbox \ifdim\@@ppheight>\zeropoint to \@@ppheight \fi
{\offinterlineskip
\ifvoid\arrangedpageA\else
\unvbox\arrangedpageA
@@ -761,7 +1135,7 @@
\ifdim\@@ppdy>\zeropoint \else \vss\fi
\fi
\box\arrangedpageB}%
- \doglobal\newcounter\arrangedpageM
+ \global\arrangedpageM\zerocount
\fi
\ifnum\arrangedpageN<\arrangedpageT\else
\poparrangedpages
@@ -769,12 +1143,11 @@
\def\poparrangedpagesXY
{\ifnum\arrangedpageN>\zerocount
- \dontcomplain
- \paperwidth\arrangedpageX\paperwidth
- \paperheight \arrangedpageY\paperheight
+ \paperwidth \arrangedpageX\paperwidth
+ \paperheight\arrangedpageY\paperheight
\outputarrangedbox\arrangedpageA
- \doglobal\newcounter\arrangedpageN
- \doglobal\newcounter\arrangedpageM
+ \global\arrangedpageN\zerocount
+ \global\arrangedpageM\zerocount
\fi}
\installpagearrangement XY
@@ -813,20 +1186,17 @@
\def\dodefinepageshift[#1][#2][#3]%
{\setvalue{\??pt#2:#1}{#3}}
-\letempty \hpageshifts \newcounter\nofhpageshifts
-\letempty \vpageshifts \newcounter\nofvpageshifts
-
-% \let\shiftprintpagebox\gobbleoneargument
-% \let\shiftpaperpagebox\gobbleoneargument
+\letempty\hpageshifts \newcount\nofhpageshifts
+\letempty\vpageshifts \newcount\nofvpageshifts
\def\dogetpageshift#1#2#3% #1=\dimenx #2=\xpageshifts #3=\nofxpageshifts
- {\ifx#2\empty
+ {\ifx#2\empty % we could do this in lua
#1\zeropoint
\else
- \doglobal\increment#3%
+ \global\advance#3\plusone
\getfromcommacommand[#2][#3]%
\ifx\commalistelement\empty
- \globallet#3\!!plusone
+ \global#3\plusone % we cycle
\getfromcommacommand[#2][#3]%
\fi
\ifx\commalistelement\empty
@@ -853,16 +1223,10 @@
\def\dosetuppageshift[#1][#2][#3]% page|paper horizontal vertical
{\ifthirdargument % paper=arrange
- \let\hpageshifts\empty
- \let\vpageshifts\empty
- \let\shiftprintpagebox\gobbleoneargument
- \let\shiftpaperpagebox\gobbleoneargument
- \doifdefined{\??pt\v!horizontal:#2}
- {\edef\hpageshifts{\getvalue{\??pt\v!horizontal:#2}}}%
- \doifdefined{\??pt\v!vertical :#3}
- {\edef\vpageshifts{\getvalue{\??pt\v!vertical :#3}}}%
- \doif{#1}\v!page{\let\shiftprintpagebox\shiftpagebox}%
- \doif{#1}\v!paper{\let\shiftpaperpagebox\shiftpagebox}%
+ \edef\hpageshifts{\ifcsname\??pt\v!horizontal:#2\endcsname\csname\??pt\v!horizontal:#2\endcsname\fi}%
+ \edef\vpageshifts{\ifcsname\??pt\v!vertical :#3\endcsname\csname\??pt\v!vertical :#3\endcsname\fi}%
+ \doifelse{#1}\v!page {\let\shiftprintpagebox\shiftpagebox}{\let\shiftprintpagebox\gobbleoneargument}%
+ \doifelse{#1}\v!paper{\let\shiftpaperpagebox\shiftpagebox}{\let\shiftpaperpagebox\gobbleoneargument}%
\else\ifsecondargument
\doifinsetelse{#1}{\v!page,\v!paper}
{\setuppageshift[#1][#2][#2]}
@@ -870,430 +1234,6 @@
\else\iffirstargument
\setuppageshift[\v!page][#1][#1]%
\fi\fi\fi}
-
-%D One can (mis)use this mechanism, in close cooperation
-%D with \PDFTEX\ to arrange pages of already produced files.
-%D
-%D \starttyping
-%D \insertpages[file.pdf][1,3][n=30,width=18cm]
-%D \stoptyping
-%D
-%D The pages are inserted in the text area, and even pages
-%D are repositioned according to the width. In this example
-%D empty pages are added after page 1 and 3.
-%D
-%D Selecting pages can be accomplished by:
-%D
-%D \starttyping
-%D \filterpages[file.pdf][1,3,5][n=30,width=18cm]
-%D \stoptyping
-%D
-%D One may pass \type {odd} or \type {even} instead of a
-%D comma separated list. A third alternative is:
-%D
-%D \starttyping
-%D \copypages[file.pdf][n=30,scale=950]
-%D \stoptyping
-%D
-%D This macros inserts the page, according to the settings
-%D provided.
-
-\def\insertpages
- {\dotripleempty\doinsertpages}
-
-\def\doinsertpages[#1][#2][#3]%
- {\doifassignmentelse{#2}
- {\dodoinsertpages[#1][][#2]}
- {\dodoinsertpages[#1][#2][#3]}}
-
-\def\dodoinsertpages[#1][#2][#3]%
- {\bgroup
- \dontcomplain
- \getfiguredimensions[#1]%
- \getparameters[\??ip][\c!n=\noffigurepages,\c!width=\!!zeropoint,#3]%
- \doifinset0{#2}{\null\page}%
- \dorecurse\@@ipn
- {\dofilterpage{#1}\recurselevel
- \doifinset\recurselevel{#2}{\null\page}}%
- \egroup}
-
-\def\filterpages
- {\dotripleempty\dofilterpages}
-
-\def\dofilterpages[#1][#2][#3]% % \noffigurepages not yet supported
- {\bgroup
- \dontcomplain
- \getfiguredimensions[#1]%
- \getparameters[\??ip][\c!n=\noffigurepages,\c!width=\!!zeropoint,#3]%
- \doifelse{#2}\v!even
- {\dorecurse\@@ipn
- {\ifodd\recurselevel\relax\else\dofilterpage{#1}\recurselevel\fi}}
- {\doifelse{#2}\v!odd
- {\dorecurse\@@ipn
- {\ifodd\recurselevel\relax\dofilterpage{#1}\recurselevel\fi}}
- {\def\dodocommand##1%
- {\ifnum##1>\@@ipn\else\dofilterpage{#1}{##1}\fi}%
- \def\docommand##1%
- {\dowithrange{##1}\dodocommand}%
- \processcommalist[#2]\docommand}}%
- \egroup}
-
-\def\dofilterpage#1#2%
- {\hbox to \textwidth
- {\ifdoublesided\ifdim\@@ipwidth>\zeropoint\relax\ifodd\realpageno\else
- \hfill
- \def\dowithfigure{\hskip-\@@ipwidth}%
- \fi\fi\fi
- \setbox0\hbox
- {\externalfigure[#1][\c!page=#2,\c!height=\textheight]}%
- \wd0\zeropoint
- \box0}
- \page}
-
-\def\copypages
- {\dodoubleempty\docopypages}
-
-\def\docopypages[#1][#2]%
- {\bgroup
- \getfiguredimensions[#1]%
- \getparameters[\??ip]
- [\c!n=\noffigurepages,
- \c!marking=\v!off,
- \c!scale=\!!thousand,
- \c!offset=\!!zeropoint,
- #2]%
- \dorecurse\@@ipn
- {\vbox to \textheight
- {\hsize\textwidth
- \scratchdimen\@@ipoffset
- \centeredbox
- {\doifelse\@@ipmarking\v!on\cuthbox\hbox
- {\ifdim\scratchdimen>\zeropoint\relax
- \advance\vsize -2\scratchdimen
- \advance\hsize -2\scratchdimen
- \externalfigure[#1][\c!page=\recurselevel,#2,\c!scale=,\c!factor=\v!max,\c!offset=\v!overlay]%
- \else
- \externalfigure[#1][\c!page=\recurselevel,#2,\c!offset=\v!overlay]%
- \fi}}}
- \page}
- \egroup}
-
-%D \macros
-%D {combinepages}
-%D
-%D Yet another way of postprocessing is handles by \type
-%D {\combinepages}. This macro builds a matrix of pages from a
-%D file, for example:
-%D
-%D \starttyping
-%D \setuppapersize
-%D [A4][A4] % or [A4,landscape][A4,landscape]
-%D
-%D \setuplayout
-%D [header=0pt,footer=1cm,
-%D backspace=1cm,topspace=1cm,
-%D width=middle,height=middle]
-%D
-%D \setupfootertexts
-%D [presentation---\currentdate\space---\space\pagenumber]
-%D
-%D \starttext
-%D \combinepages[slides][nx=2,ny=3,frame=on]
-%D \stoptext
-%D \stoptyping
-%D
-%D One can influence the way the pages are combined. (This
-%D will be explained some time.)
-
-\def\combinepages
- {\dodoubleempty\docombinepages}
-
-\def\docombinepages[#1][#2]% a=perpag b=free
- {\bgroup
- \dontcomplain
- \getfiguredimensions[#1]%
- \getparameters
- [\??ip]
- [\c!alternative=\v!a,
- \c!n=\noffigurepages,\c!nx=2,\c!ny=2,\c!start=1,\c!stop=\!!maxcard,
- \c!distance=\bodyfontsize,
- \c!bottom=\vfill,\c!top=\vss,
- \c!left=\hss,\c!right=\hss,
- \c!before=\page,\c!after=\page,\c!inbetween=\blank,
- \c!frame=,\c!background=,\c!backgroundcolor=,
- #2]%
- \def\@@ipname{#1}%
- \@@ipbefore
- \expandcheckedcsname{\??ip::\c!alternative:}\@@ipalternative\v!b
- \@@ipafter
- \egroup}
-
-\setvalue{\??ip::\c!alternative:\v!a}%
- {\globallet\combinedpagescounter\@@ipstart
- \doloop
- {\vbox to \textheight
- {\hsize\textwidth % ? ?
- \scratchdimen\@@ipdistance
- \!!widtha \dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
- \!!heighta\dimexpr(\vsize-\@@ipny\scratchdimen+\scratchdimen)/\@@ipny\relax
- \dorecurse\@@ipny
- {\hbox to \hsize
- {\dorecurse\@@ipnx
- {\vbox to \!!heighta
- {\hsize\!!widtha
- \vsize\!!heighta
- \@@iptop
- \hbox to \hsize
- {\@@ipleft
- \ifnum\combinedpagescounter>\@@ipstop\relax
- \globallet\@@ipn\!!zerocount
- \else\ifnum\combinedpagescounter>\@@ipn \else
- \externalfigure[\@@ipname]
- [\c!object=\v!no,
- \c!page=\combinedpagescounter,
- \c!factor=\v!max,
- \c!background=\@@ipbackground,
- \c!backgroundcolor=\@@ipbackgroundcolor,
- \c!frame=\@@ipframe]%
- \fi\fi
- \@@ipright}
- \@@ipbottom}%
- \doglobal\increment\combinedpagescounter
- \hfil}%
- \hfilneg}
- \vfil}%
- \vfilneg}%
- \page
- \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
-
-\setvalue{\??ip::\c!alternative:\v!c}%
- {\globallet\combinedpagescounter\@@ipstart
- \doloop
- {\vbox to \textheight
- {\hsize\textwidth % ? ?
- \scratchdimen\@@ipdistance
- \!!widtha \dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
- \!!heighta\dimexpr(\vsize-\@@ipny\scratchdimen+\scratchdimen)/\@@ipny\relax
- \hbox to \hsize
- {\dorecurse\@@ipnx
- {\@@ipleft
- \vbox to \textheight
- {\hsize\!!widtha
- {\dorecurse\@@ipny
- {\@@iptop
- \hbox to \hsize
- {\vbox to \!!heighta
- {\hsize\!!widtha
- \vsize\!!heighta
- \ifnum\combinedpagescounter>\@@ipstop\relax
- \globallet\@@ipn\!!zerocount
- \else\ifnum\combinedpagescounter>\@@ipn \else
- \externalfigure[\@@ipname]
- [\c!object=\v!no,
- \c!page=\combinedpagescounter,
- \c!factor=\v!max,
- \c!background=\@@ipbackground,
- \c!backgroundcolor=\@@ipbackgroundcolor,
- \c!frame=\@@ipframe]%
- \fi\fi}}
- \doglobal\increment\combinedpagescounter
- \@@ipbottom}%
- \vfil}%
- \vfilneg}
- \hfil}%
- \hfilneg}}
- \page
- \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
-
-\setvalue{\??ip::\c!alternative:\v!horizontal}{\getvalue{\??ip::\c!alternative:\v!a}}
-\setvalue{\??ip::\c!alternative:\v!vertical }{\getvalue{\??ip::\c!alternative:\v!c}}
-
-\setvalue{\??ip::\c!alternative:\v!b}%
- {\globallet\combinedpagescounter\@@ipstart
- \doloop
- {\startbaselinecorrection
- \scratchdimen\@@ipdistance
- \!!widtha\dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
- \hbox to \hsize
- {\dorecurse\@@ipnx
- {\doglobal\increment\combinedpagescounter
- \ifnum\combinedpagescounter>\@@ipn \else
- \normalexpanded{\noexpand\externalfigure[\@@ipname]
- [\c!page=\combinedpagescounter,
- \c!width=\the\!!widtha,% todo \freezedimenmacro
- \c!background=\@@ipbackground,
- \c!backgroundcolor=\@@ipbackgroundcolor,
- \c!frame=\@@ipframe]}%
- \hfill
- \fi}\hfillneg}%
- \stopbaselinecorrection
- \ifnum\combinedpagescounter<\@@ipn\relax
- \@@ipinbetween
- \else
- \exitloop
- \fi}}
-
-%D \macros
-%D {setuppagecomment,startpagecomment}
-%D
-%D This command is not yet documented. Usage:
-%D
-%D \starttyping
-%D \setuppagecomment[state=start,location=right]
-%D
-%D \startpagecomment
-%D \input knuth
-%D \stoppagecomment
-%D \stoptyping
-
-\unexpanded\def\setuppagecomment
- {\dosingleempty\dosetuppagecomment}
-
-\def\dosetuppagecomment[#1]%
- {\getparameters[\??pc][#1]%
- \doifelse\@@pcstate\v!start
- {\doifinsetelse\@@pclocation{\v!bottom,\v!top}
- {\setuppapersize[\c!left=\hskip\@@pcoffset]%
- \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcheight\relax}%
- \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset\relax}%
- \defineoverlay[\v!pagecomment][\placepagecommentTB]}
- {\setuppapersize[\c!top=\vskip\@@pcoffset]%
- \edef\@@pcpaperheight{\the\dimexpr\paperheight+\@@pcoffset+\@@pcoffset\relax}%
- \edef\@@pcpaperwidth {\the\dimexpr\paperwidth+\@@pcoffset+\@@pcoffset+\@@pcdistance+\@@pcwidth\relax}%
- \defineoverlay[\v!pagecomment][\placepagecommentLR]}%
- \processaction
- [\@@pclocation]
- [ \v!bottom=>{\setuppapersize[\c!bottom =\vss,\c!top =\vskip\@@pcoffset]},
- \v!top=>{\setuppapersize[\c!top =\vss,\c!bottom =\vskip\@@pcoffset]},
- \v!left=>{\setuppapersize[\c!left =\hss,\c!right=\hskip\@@pcoffset]},
- \v!right=>{\setuppapersize[\c!right=\hss,\c!left =\hskip\@@pcoffset]}]%
- \definepapersize
- [\v!pagecomment]
- [\c!height=\@@pcpaperheight,
- \c!width=\@@pcpaperwidth]%
- \let\@@pcprintpapersize\printpapersize
- \setuppapersize[\papersize][\v!pagecomment]%
- \setupbackgrounds[\v!paper][\c!background=\v!pagecomment]}
- {\doif\@@pcstate\v!stop % else initialization invokes backgrounds
- {% this should be tested first
- % \normalexpanded{\noexpand\setuppapersize[\papersize][\@@pcprintpapersize]}%
- \setupbackgrounds[\v!paper][\c!background=]}}}
-
-\def\@@pcprintpapersize{\printpapersize}
-
-\unexpanded\def\placepagecommentTB
- {\vbox to \printpaperheight
- {%\forgetall
- \hsize\printpaperwidth
- \vskip\@@pcoffset
- \doifelse\@@pclocation\v!bottom{\vskip\dimexpr\paperheight+\@@pcdistance\relax}\vss
- \hskip\@@pcoffset
- \vbox to \@@pcheight
- {%\forgetall
- \hsize\paperwidth
- \ifpagecomment
- \getbuffer[\v!pagecomment]%
- \global\pagecommentfalse
- \fi}%
- \hfill
- \doifelse\@@pclocation\v!bottom\vss{\vskip\dimexpr\paperheight+\@@pcdistance\relax}%
- \vskip\@@pcoffset}}
-
-\unexpanded\def\placepagecommentLR
- {\hbox to \printpaperwidth
- {\hskip\@@pcoffset
- \doifelse\@@pclocation\v!right{\hskip\paperwidth\hskip\@@pcdistance}\hss
- \vbox to \printpaperheight
- {%\forgetall
- \vskip\@@pcoffset
- \hsize\@@pcwidth
- \ifpagecomment
- \getbuffer[\v!pagecomment]%
- \global\pagecommentfalse
- \fi
- \vss}%
- \doifelse\@@pclocation\v!right\hss{\hskip\paperwidth\hskip\@@pcdistance}%
- \hskip\@@pcoffset}}
-
-\newif\ifpagecomment
-
-\setvalue{\e!start\v!pagecomment}%
- {\global\pagecommenttrue
- \dostartbuffer[\v!pagecomment][\e!start\v!pagecomment][\e!stop\v!pagecomment]}
-
-\setuppagecomment
- [\c!state=, % \v!stop would invoke background calculation
- \c!location=\v!bottom,
- \c!offset=.5cm,
- \c!distance=.5cm,
- \c!height=5cm,
- \c!width=10cm]
-
-% This macro cuts a page into n parts that can be pasted
-% together.
-
-\def\slicepages
- {\dotripleempty\doslicepages}
-
-\def\doslicepages[#1][#2][#3]%
- {\ifthirdargument
- \dodoslicepages[#1][#2][#3]%
- \else
- \dodoslicepages[#1][#2][#2]%
- \fi}
-
-\newcounter\slicedpagenumber
-
-\def\dodoslicepages[#1][#2][#3]%
- {\bgroup
- \dontcomplain
- \globallet\slicedpagenumber\!!zerocount
- \getfiguredimensions[#1]
- \getparameters
- [\??ip]
- [\c!n=1,
- \c!offset=\!!zeropoint,
- \c!hoffset=\!!zeropoint,\c!voffset=\!!zeropoint,
- \c!width=\figurewidth,\c!height=\figureheight,#2]
- \ifnum\@@ipn>\zerocount
- \definepapersize
- [\s!dummy][\c!height=\@@ipheight,\c!width=\@@ipwidth]
- \setuppapersize
- [\s!dummy][\s!dummy]
- \setuplayout
- [\c!backspace=\!!zeropoint,\c!topspace=\!!zeropoint,
- \c!height=\v!middle,\c!width=\v!middle,
- \c!textdistance=\!!zeropoint,
- \c!header=\!!zeropoint,\c!footer=\!!zeropoint]
- \fi
- \dorecurse\noffigurepages
- {\global\let\slicedpagenumber\recurselevel
- \ifnum\@@ipn>\plusone
- \dorecurse\@@ipn
- {\let\xslice\recurselevel
- \dorecurse\@@ipn
- {\let\yslice\recurselevel
- \clip
- [\c!nx=\@@ipn,\c!ny=\@@ipn,\c!x=\xslice,\c!y=\yslice]
- {\scale
- [\c!scale=\@@ipn000]
- {\externalfigure[#1][\c!page=\slicedpagenumber]}}
- \page}}
- \else
- \ifodd\slicedpagenumber\relax
- \getparameters[\??ip][#2]
- \else
- \getparameters[\??ip][#3]
- \fi
- \hskip\@@ipoffset
- \clip
- [\c!hoffset=\@@iphoffset,\c!voffset=\@@ipvoffset,
- \c!height=\@@ipheight,\c!width=\@@ipwidth]
- {\externalfigure[#1][\c!page=\slicedpagenumber]}
- \page
- \fi}
- \egroup}
-% \starttext \slicepages[slice1.pdf][n=3] \stoptext
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/page-ini.mkiv b/Master/texmf-dist/tex/context/base/page-ini.mkiv
index 07d3422829c..7969e4f3e46 100644
--- a/Master/texmf-dist/tex/context/base/page-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-ini.mkiv
@@ -28,7 +28,7 @@
\def\m!otr{otr}
-\chardef\normalpagebox=255
+% \setnewconstant\normalpagebox 255 % already set
\newbox\pagebox
@@ -300,11 +300,14 @@
\expandafter\invokenormaloutputroutine
\fi}
-\mainoutput{\invokeoutputroutine} \output{\inotrtrue\the\mainoutput}
+\mainoutput{\invokeoutputroutine}
%D Some hooks:
-\output{\inotrtrue\the\everybeforeoutput\the\mainoutput\the\everyafteroutput}
+\def\setoutputroutine#1%
+ {\global\output{\inotrtrue\the\everybeforeoutput#1\the\everyafteroutput}}
+
+\setoutputroutine{\the\mainoutput}
\ifx\pagediscards\undefined \let\pagediscards\relax \fi
@@ -332,8 +335,8 @@
\newcount\nofcolumns \nofcolumns = 1
\newcount\mofcolumns \mofcolumns = 1
-\chardef\maxnofcolumns = 50
-\chardef\allocatednofcolumns = 0
+\setnewconstant\maxnofcolumns 50
+\setnewconstant\allocatednofcolumns 0
%D The next dimensions reports the final column height
@@ -366,7 +369,7 @@
\@EA\newbox\csname\@col@-\recurselevel-h\endcsname % top insert
\@EA\newbox\csname\@col@-\recurselevel-l\endcsname % top insert
\fi}%
- \global\chardef\allocatednofcolumns=\nofcolumns
+ \global\allocatednofcolumns\nofcolumns
\fi}
\def\firstcolumnbox {\columntextbox\plusone}
@@ -448,7 +451,7 @@
\newdimen\localcolumnwidth
\newdimen\savedpagetotal
-\chardef\columndirection=0 % 0:lr 1:rl
+\newconstant\columndirection % 0:lr 1:rl
\def\minbalancetoplines {1}
\def\minfreecolumnlines {2}
@@ -562,8 +565,7 @@
\fi
\fi#1#2%
\resetselectiepagina
- \incrementpagenumber
- \incrementsubpagenumber
+ \doincrementpageboundcounters % should hook into an every
\checkpagedimensions
\ifnum\outputpenalty>\superpenalty \else
\dosupereject
@@ -576,8 +578,6 @@
\maxdeadcycles=1000
-% will be installable tracer; better use chardef
-
% this needs a real cleanup
\def\doplaceversiontext#1#2%
@@ -601,7 +601,7 @@
\vskip\!!sixpoint
\hbox to \makeupwidth
{\infofont
- \getmessage\m!systems{27}:\space\currentdate\space
+ \getmessage\m!system{27}:\space\currentdate\space
\doplaceversiontext\v!project \currentproject
\doplaceversiontext\v!product \currentproduct
\doplaceversiontext\v!component\currentcomponent
@@ -612,13 +612,13 @@
% tot hier
\def\doversion[#1]%
- {\chardef\conceptmode\zerocount
+ {\conceptmode\zerocount
\overfullrule\zeropoint
\processaction % \v!final=>
[#1]
- [ \v!concept=>\chardef\conceptmode\plusone, % simple banner
- \v!file=>\chardef\conceptmode\plustwo, % full banner
- \v!temporary=>\chardef\conceptmode\plusthree % full banner plus
+ [ \v!concept=>\conceptmode\plusone, % simple banner
+ \v!file=>\conceptmode\plustwo, % full banner
+ \v!temporary=>\conceptmode\plusthree % full banner plus
\overfullrule5\points]} % info in the margin
\def\version
@@ -699,28 +699,28 @@
\newtoks\afterpage \newtoks\aftereverypage
\newtoks\beforepage \newtoks\beforeeverypage
-\chardef\showgridstate=0
+\newconstant\showgridstate
-\def\showgrid
+\unexpanded\def\showgrid
{\dosingleempty\doshowgrid}
\def\doshowgrid[#1]%
- {\chardef\showgridstate \plusone % downward compatible default
- \chardef\gridboxlinemode \plusone
- \chardef\gridboxlinenomode\plusone
+ {\showgridstate \plusone % downward compatible default
+ \gridboxlinemode \plusone
+ \gridboxlinenomode\plusone
\processallactionsinset
[#1]%
- [ \v!reset=>\chardef\showgridstate \zerocount,
- \v!bottom=>\chardef\showgridstate \plusone,
- \v!top=>\chardef\showgridstate \plustwo,
- \v!none=>\chardef\gridboxlinemode \zerocount,
- \v!all=>\chardef\gridboxlinemode \plusone,
- \v!lines=>\chardef\gridboxlinemode \plustwo,
- \v!frame=>\chardef\gridboxlinemode \plusthree,
- \v!nonumber=>\chardef\gridboxlinenomode\zerocount,
- \v!right=>\chardef\gridboxlinenomode\plusone,
- \v!left=>\chardef\gridboxlinenomode\plustwo,
- \v!outer=>\chardef\gridboxlinenomode\plusthree]%
+ [ \v!reset=>\showgridstate \zerocount,
+ \v!bottom=>\showgridstate \plusone,
+ \v!top=>\showgridstate \plustwo,
+ \v!none=>\gridboxlinemode \zerocount,
+ \v!all=>\gridboxlinemode \plusone,
+ \v!lines=>\gridboxlinemode \plustwo,
+ \v!frame=>\gridboxlinemode \plusthree,
+ \v!nonumber=>\gridboxlinenomode\zerocount,
+ \v!right=>\gridboxlinenomode\plusone,
+ \v!left=>\gridboxlinenomode\plustwo,
+ \v!outer=>\gridboxlinenomode\plusthree]%
\ifcase\showgridstate
\let\addtextgridlayer\gobbleoneargument
\else % 1=bottom 2=top
@@ -781,50 +781,56 @@
\newif\ifarrangingpages \arrangingpagesfalse
-\chardef\pageornamentstate\zerocount % 0=on 1=one-off 2=always-off
+\newconstant\pageornamentstate % 0=on 1=one-off 2=always-off
-\def\pagebodyornamentstrue {\chardef\pageornamentstate\zerocount} % for a while
-\def\pagebodyornamentsfalse{\chardef\pageornamentstate\plusone} % for a while
+\def\pagebodyornamentstrue {\pageornamentstate\zerocount} % for a while
+\def\pagebodyornamentsfalse{\pageornamentstate\plusone} % for a while
\appendtoks
\ifcase\pageornamentstate\or
- \chardef\pageornamentstate\zerocount
+ \pageornamentstate\zerocount
\fi
\to \everyaftershipout
\let\poparrangedpages\relax
\let\pusharrangedpage\relax
-\ifx\shiftprintpagebox\undefined
+\ifdefined\shiftprintpagebox \else
\let\shiftprintpagebox\gobbleoneargument
\let\shiftpaperpagebox\gobbleoneargument
\fi
-\ifx\registerpageposition\undefined
+\ifdefined\registerpageposition \else
\let\registerpageposition\gobbleoneargument
\fi
-\def\reportarrangedpage#1%
- {\showmessage\m!systems
- {23}{\the\realpageno.\the\pageno\ifnum\subpageno>0 .\the\subpageno\fi,#1}}
-
\newif\ifsavepagebody \newbox\savedpagebody
% beware, \??ly is used before defined, i.e. bad module design
\setuplayout[\c!method=\v!normal]
+\def\docolumnpagebodymarks#1#2#3#4% first last column box
+ {\ifnum#3=#1\relax
+ \dosynchronizemarking[\number#3,\v!column:\number#3,\v!first,\v!column:\v!first][#4]%
+ \else\ifnum#3=#2\relax
+ \dosynchronizemarking[\number#3,\v!column:\number#3,\v!last, \v!column:\v!last ][#4]%
+ \else
+ \dosynchronizemarking[\number#3,\v!column:\number#3 ][#4]%
+ \fi\fi}
+
\def\buildpagebody#1#2%
{\ifsavepagebody\global\setbox\savedpagebody\fi
\vbox
- {\beginrestorecatcodes
-% \forgetall % igv problemen, check: \boxmaxdepth\maxdimen
+ {%\pushcatcodetable
+ %\forgetall % igv problemen, check: \boxmaxdepth\maxdimen
\boxmaxdepth\maxdimen % new
\dontcomplain
+ % marks get done here
+ \dosynchronizemarking[\v!page][#2]%
% the following plugin uses and sets pagebox; beware: this
% will change and is for my (hh) personal experiments
- \executeifdefined{\??ly\c!method\@@lymethod}%
- {\getvalue{\??ly\c!method\v!normal}}#1#2%
+ \executeifdefined{\??ly\c!method\@@lymethod}{\getvalue{\??ly\c!method\v!normal}}#1#2%
% the finishing touch
\ifcase\pageornamentstate
\addpagebackground \pagebox
@@ -852,7 +858,7 @@
\negateprintbox \pagebox
\fi
\box\pagebox
- \endrestorecatcodes}%
+ }% \popcatcodetable
\ifsavepagebody\copy\savedpagebody\fi}
\setvalue{\??ly\c!method\v!normal}#1#2%
@@ -893,8 +899,7 @@
\prependtoks \let\nextbox\nestednextbox \to \everybeforepagebody
\def\dopagebody#1#2%
- {%\getallmarks % now in following token register
- \the\everybeforepagebody
+ {\the\everybeforepagebody
\starttextproperties
% \setnextsubpageno % nog eens: als in pagina (tbv standaard opmaak)
\dontshowboxes % dan hier blokkeren en verderop resetten
@@ -919,8 +924,8 @@
\newif\ifpagebreakdisabled \pagebreakdisabledfalse
-\chardef\testpagemethod \zerocount % todo: \testnewpage[method=,lines=,voffset=]
-\chardef\testpagetrigger\zerocount
+\newconstant\testpagemethod % todo: \testnewpage[method=,lines=,voffset=]
+\newconstant\testpagetrigger
\def\testpage {\dotripleempty\dotestpage[\plusone ]} %
\def\testpageonly{\dotripleempty\dotestpage[\plustwo ]} % no penalties added to the mvl
@@ -1020,9 +1025,9 @@
\penalty-\!!tenthousand % untested ! ! \column
\fi \fi}
-\let\resetcurrentsectionmarks\relax
-
-% was: \resetsectionmarks\firstsection, zie \handlepagebreak
+\ifdefined\resetcurrentstructuremarkswithpage \else
+ \let\resetcurrentstructuremarkswithpage\relax
+\fi
\def\page{\pagebreak} % the short form of \pagebreak (mult-com one)
@@ -1057,7 +1062,7 @@
\edef\prevrealpageno{\the\realpageno}%
\ifcase\pageornamentstate \or
% disable reset after shipout
- \global\chardef\pageornamentstate\plustwo
+ \global\pageornamentstate\plustwo
\fi
\iffirstargument % or if empty i.e. []
\executepagebreakhandlers{#1}%
@@ -1070,7 +1075,7 @@
% as WS found out so we have to wait till the next side
% effect shows up
% \ifcase\pageornamentstate\or
- \global\chardef\pageornamentstate\zerocount
+ \global\pageornamentstate\zerocount
% \fi
\fi
\egroup}
@@ -1106,7 +1111,7 @@
{} % do nothing if empty
\installpagebreakhandler \v!reset
- {% better not: \global\chardef\pageornamentstate\zerocount
+ {% better not: \global\pageornamentstate\zerocount
\resetpagebreak}
\installpagebreakhandler \v!disable
@@ -1128,7 +1133,7 @@
\installpagebreakhandler \v!blank
{\ifcase\pageornamentstate
- \global\chardef\pageornamentstate\plusone
+ \global\pageornamentstate\plusone
\fi}
\installpagebreakhandler \v!no
@@ -1164,20 +1169,20 @@
\installpagebreakhandler \v!left
{\ejectinsert
\gotonextpageX % will become \gotonextpage
- \doifbothsidesoverruled{}{\resetcurrentsectionmarks\ejectdummypage}{}}
+ \doifbothsidesoverruled{}{\resetcurrentstructuremarkswithpage\ejectdummypage}{}}
\installpagebreakhandler \v!right
{\ejectinsert
\gotonextpageX % will become \gotonextpage
- \doifbothsidesoverruled{}{}{\resetcurrentsectionmarks\ejectdummypage}}
+ \doifbothsidesoverruled{}{}{\resetcurrentstructuremarkswithpage\ejectdummypage}}
\installpagebreakhandler \v!even
{\page
- \doifoddpageelse{\resetcurrentsectionmarks\ejectdummypage}\donothing}
+ \doifoddpageelse{\resetcurrentstructuremarkswithpage\ejectdummypage}\donothing}
\installpagebreakhandler \v!odd
{\page
- \doifoddpageelse\donothing{\resetcurrentsectionmarks\ejectdummypage}}
+ \doifoddpageelse\donothing{\resetcurrentstructuremarkswithpage\ejectdummypage}}
\installpagebreakhandler \v!quadruple % not yet ok inside columnsets
{\ifdoublesided
@@ -1298,7 +1303,7 @@
% We don't want spurious last pages (due to left over marks):
\def\noshipout
- {\writestatus\m!systems{ignoring further shipouts}%
+ {\writestatus\m!system{ignoring further shipouts}%
\global\advance\realpageno\minusone % else no flush of resources
\dowithnextbox{\deadcycles\zerocount}}
@@ -1424,7 +1429,7 @@
\def\registeredtextarea#1#2#3% #1=lower-dp #2=correct-ht #3=box
{\hbox\bgroup
\ifregistertextareas \ifx\registerMPtextarea\undefined \else
- \setbox\registertextbox\null
+ \setbox\registertextbox\emptyhbox
\wd\registertextbox\wd#3%
\ht\registertextbox\ht#3%
\dp\registertextbox\dp#3%
@@ -1494,7 +1499,7 @@
{\ifvoid\facingpage\else
\ifnum\realpageno>\plusone
\bgroup
- \chardef\pageornamentstate\plusone
+ \pageornamentstate\plusone
\finishfacingpage
\myshipout{\buildpagebody\box\facingpage}%
\egroup
diff --git a/Master/texmf-dist/tex/context/base/page-lay.mkii b/Master/texmf-dist/tex/context/base/page-lay.mkii
index de1194c2ae8..d40e1ccb7b9 100644
--- a/Master/texmf-dist/tex/context/base/page-lay.mkii
+++ b/Master/texmf-dist/tex/context/base/page-lay.mkii
@@ -295,7 +295,7 @@
{\doifelsenothing{#2}
{\expanded{\dodosetuppapersize
[\executeifdefined{\??pp:1:#1}{#1}]%
- [\executeifdefined{\??pp:2:#1}{}]}}
+ [\executeifdefined{\??pp:2:#1}{\v!default}]}}
{\doifassignmentelse{#2}
{\getparameters[\??pp\executeifdefined{\??pp:1:#1}{#1}][#2]}
{\expanded{\dodosetuppapersize
@@ -1150,11 +1150,11 @@
%D \showsetup{showsetups}
%D %showsetup{showmargins}
-\fetchruntimecommand \showprint {page-run.mkii}
-\fetchruntimecommand \showframe {page-run.mkii}
-\fetchruntimecommand \showlayout {page-run.mkii}
-\fetchruntimecommand \showsetups {page-run.mkii}
-\fetchruntimecommand \showmargins {page-run.mkii}
+\fetchruntimecommand \showprint {page-run}
+\fetchruntimecommand \showframe {page-run}
+\fetchruntimecommand \showlayout {page-run}
+\fetchruntimecommand \showsetups {page-run}
+\fetchruntimecommand \showmargins {page-run}
%D The default dimensions are quite old and will not change.
%D The funny fractions were introduced when we went from fixed
@@ -1372,10 +1372,7 @@
%D paper size with the typeset paper size. This setting should
%D come after the first layout specification (already done).
-\setuppapersize
- [A4][A4]
-
-%D A few goodies:
+% not interfaced !
\definepapersize
[oversized]
@@ -1392,6 +1389,19 @@
[ \c!width=\dimexpr \paperheight+1.5cm\relax,
\c!height=\dimexpr2\paperwidth +1.5cm\relax]
+\definepapersize
+ [\v!default]
+ [ \c!width=\paperwidth,
+ \c!height=\paperheight]
+
+\definepapersize
+ [samesized]
+ [ \c!width=\paperwidth,
+ \c!height=\paperheight]
+
+\setuppapersize
+ [A4][samesized]
+
%D For orthogonality:
\definepapersize
diff --git a/Master/texmf-dist/tex/context/base/page-lay.mkiv b/Master/texmf-dist/tex/context/base/page-lay.mkiv
index 28f9be594dc..812f3a3aca8 100644
--- a/Master/texmf-dist/tex/context/base/page-lay.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-lay.mkiv
@@ -13,13 +13,6 @@
\writestatus{loading}{ConTeXt Page Macros / Layout Specification}
-%D This module is now etex dependent.
-
-% to be translated into english
-
-% hoofdhoogte wordt bij status=hoog niet aangepast op outer
-% level, wel binnen bepaalde berekeningen
-
%D Before you start wondering why some of the page related
%D modules skip upward or left in order to place elements, you
%D must realize that the reference point is the top left
@@ -42,6 +35,7 @@
\newdimen\paperheight \paperheight = 297mm
\newdimen\paperwidth \paperwidth = 210mm
+\newdimen\paperoffset \paperoffset = 0mm
\newdimen\printpaperheight \printpaperheight = \paperheight
\newdimen\printpaperwidth \printpaperwidth = \paperwidth
@@ -114,9 +108,6 @@
%D is no area, we use a zero distance in case there is no
%D area.
-\def\layoutdistance#1#2%
- {\ifdim\zeropoint<#1\layoutparameter#2\else\zeropoint\fi}
-
%D The horizontal distances are:
\newdimen \leftedgedistance
@@ -133,23 +124,53 @@
%D We need to calculate the extra distances:
+\newdimen\naturalmarginwidth
+\newdimen\naturaledgewidth
+\newdimen\naturalmargindistance
+\newdimen\naturaledgedistance
+\newdimen\naturalleftedgedistance
+\newdimen\naturalrightedgedistance
+\newdimen\naturalleftmargindistance
+\newdimen\naturalrightmargindistance
+\newdimen\naturaltopdistance
+\newdimen\naturalheaderdistance
+\newdimen\naturalfooterdistance
+\newdimen\naturalbottomdistance
+
+\def\layoutdistance#1#2{\ifdim\zeropoint<#1#2\else\zeropoint\fi}
+
\def\setlayoutdimensions
- {\global\marginwidth \layoutparameter\c!margin
- \global\edgewidth \layoutparameter\c!edge
- \global\margindistance \layoutparameter\c!margindistance
- \global\edgedistance \layoutparameter\c!edgedistance
- \global\leftedgedistance \layoutdistance \leftedgewidth \c!leftedgedistance
- \global\rightedgedistance \layoutdistance \rightedgewidth \c!rightedgedistance
- \global\leftmargindistance \layoutdistance \leftmarginwidth \c!leftmargindistance
- \global\rightmargindistance\layoutdistance \rightmarginwidth \c!rightmargindistance
- \global\topdistance \layoutdistance \topheight \c!topdistance
- \global\headerdistance \layoutdistance \headerheight \c!headerdistance
- \global\footerdistance \layoutdistance \footerheight \c!footerdistance
- \global\bottomdistance \layoutdistance \bottomheight \c!bottomdistance}
+ {\global\naturalmarginwidth \layoutparameter\c!margin
+ \global\naturaledgewidth \layoutparameter\c!edge
+ \global\naturalmargindistance \layoutparameter\c!margindistance
+ \global\naturaledgedistance \layoutparameter\c!edgedistance
+ \global\naturalleftedgedistance \layoutparameter\c!leftedgedistance
+ \global\naturalrightedgedistance \layoutparameter\c!rightedgedistance
+ \global\naturalleftmargindistance \layoutparameter\c!leftmargindistance
+ \global\naturalrightmargindistance\layoutparameter\c!rightmargindistance
+ \global\naturaltopdistance \layoutparameter\c!topdistance
+ \global\naturalheaderdistance \layoutparameter\c!headerdistance
+ \global\naturalfooterdistance \layoutparameter\c!footerdistance
+ \global\naturalbottomdistance \layoutparameter\c!bottomdistance
+ %
+ \global\marginwidth \naturalmarginwidth
+ \global\edgewidth \naturaledgewidth
+ \global\margindistance \naturalmargindistance
+ \global\edgedistance \naturaledgedistance
+ %
+ \global\leftedgedistance \layoutdistance\leftedgewidth \naturalleftedgedistance
+ \global\rightedgedistance \layoutdistance\rightedgewidth \naturalrightedgedistance
+ \global\leftmargindistance \layoutdistance\leftmarginwidth \naturalleftmargindistance
+ \global\rightmargindistance \layoutdistance\rightmarginwidth\naturalrightmargindistance
+ \global\topdistance \layoutdistance\topheight \naturaltopdistance
+ \global\headerdistance \layoutdistance\headerheight \naturalheaderdistance
+ \global\footerdistance \layoutdistance\footerheight \naturalfooterdistance
+ \global\bottomdistance \layoutdistance\bottomheight \naturalbottomdistance
+ }
\def\setlayoutdistances % local in \setreducedvsize
- {\headerdistance\layoutdistance\headerheight\c!headerdistance
- \footerdistance\layoutdistance\footerheight\c!footerdistance}
+ {\headerdistance\layoutdistance\headerheight\naturalheaderdistance
+ \footerdistance\layoutdistance\footerheight\naturalfooterdistance}
% these are wrong in the running text, assumes some swapping, needs a cleanup
@@ -266,10 +287,10 @@
%D We keep track of these features with the following
%D variables.
-\chardef\papermirror =0 \chardef\printmirror =0
-\chardef\paperorientation=0 \chardef\printorientation=0 % beware: later no chardef
-\chardef\paperreverse =0 \chardef\printreverse =0
-\chardef\paperlandscape =0 \chardef\printlandscape =0
+\newconditional\papermirror \newconditional\printmirror
+\newconstant \paperorientation \newconstant \printorientation
+\newconstant \paperreverse \newconstant \printreverse
+\newconditional\paperlandscape \newconditional\printlandscape
\let\papersize\empty \let\printpapersize\empty
@@ -295,7 +316,8 @@
{\doifelsenothing{#2}
{\expanded{\dodosetuppapersize
[\executeifdefined{\??pp:1:#1}{#1}]%
- [\executeifdefined{\??pp:2:#1}{}]}}
+% [\executeifdefined{\??pp:2:#1}{\v!default}]}}
+ [\executeifdefined{\??pp:2:#1}{#1}]}}
{\doifassignmentelse{#2}
{\getparameters[\??pp\executeifdefined{\??pp:1:#1}{#1}][#2]}
{\expanded{\dodosetuppapersize
@@ -361,10 +383,10 @@
\global\setdimentoatleast\paperheight \onepoint
\global\setdimentoatleast\printpaperwidth \onepoint
\global\setdimentoatleast\printpaperheight\onepoint
- \ifcase\paperlandscape\else
+ \ifconditional\paperlandscape
\doglobal\swapdimens\paperwidth\paperheight
\fi
- \ifcase\printlandscape\else
+ \ifconditional\printlandscape
\doglobal\swapdimens\printpaperwidth\printpaperheight
\fi
% this check can be confusing, so we've added the possibility
@@ -372,37 +394,45 @@
\doif\@@ppoption\v!max % \v!fit is
{\bgroup
% we need to pre-swap else we get the wrong paper size
- \ifcase\paperorientation\else
- \doifinset\paperorientation{90,270}{\swapdimens\paperwidth\paperheight}%
- \fi
- \ifcase\printorientation\else
- \doifinset\printorientation{90,270}{\swapdimens\printpaperwidth\printpaperheight}%
- \fi
+ \ifnum\paperorientation=\rightrotatioangle
+ \swapdimens\paperwidth\paperheight
+ \else\ifnum\paperorientation=\leftrotatioangle
+ \swapdimens\paperwidth\paperheight
+ \fi\fi
+ \ifnum\printorientation=\rightrotatioangle
+ \swapdimens\printpaperwidth\printpaperheight
+ \else\ifnum\printorientation=\leftrotatioangle
+ \swapdimens\printpaperwidth\printpaperheight
+ \fi\fi
\ifdim\paperheight>\printpaperheight
\global\printpaperheight\paperheight
- \writestatus\m!systems{print height forced to paper height}%
+ \writestatus\m!system{print height forced to paper height}%
\fi
\ifdim\paperwidth>\printpaperwidth
\global\printpaperwidth\paperwidth
- \writestatus\m!systems{print width forced to paper width}%
+ \writestatus\m!system{print width forced to paper width}%
\fi
\egroup}}
\def\dosetuppaperorientation#1#2#3#4#5%
- {\global\chardef#2\zerocount
- \global\chardef#5\zerocount
- \globallet#3\!!zerocount
- \globallet#4\!!zerocount
+ {\global\setfalse#2%
+ \global\setfalse#5%
+ \global#3\uprotationangle
+ \global#4\uprotationangle
\global\negateprintboxfalse
\processallactionsinset
[#1]
- [ \v!landscape=>\global\chardef#2\plusone,
- \v!mirrored=>\global\chardef#5\plusone,
- \v!rotated=>\gdef#3{90}\gdef#4{270},
+ [ \v!landscape=>\global\settrue#2,
+ \v!mirrored=>\global\settrue#5,
+ \v!rotated=>\global#3\rightrotatioangle
+ \global#4\leftrotatioangle,
\v!negative=>\global\negateprintboxtrue,
- 90=>\gdef#3{90}\gdef#4{270},
- 180=>\gdef#3{180}\gdef#4{0},
- 270=>\gdef#3{270}\gdef#4{90}]}
+ 90=>\global#3\rightrotatioangle
+ \global#4\leftrotatioangle,
+ 180=>\global#3\downrotatioangle
+ \global#4\zerocount,
+ 270=>\global#3\leftrotatioangle
+ \global#4\rightrotatioangle]}
\ifx\calculatepaperoffsets\undefined
@@ -419,7 +449,7 @@
% {\beforesplitstring#1\at em\to\asciia
% \doifnot\asciia{#1}
% {\aftersplitstring\asciia\at=\to\asciia
-% \doifsomething\asciia{\showmessage\m!systems{10}{#1}}}}
+% \doifsomething\asciia{\showmessage\m!system{10}{#1}}}}
%
% \def\checkforems[#1]%
% {\processcommalist[#1]\docheckforems}
@@ -642,16 +672,43 @@
\newif\ifdoublesidedprint
-\def\presetcenterpagebox % in \setuplayout !!!!!!!!!!!!!!!!
+\newconditional\page_location_is_set
+
+\def\page_location_reset
+ {\setfalse\page_location_is_set
+ \let\page_location_left_fill \relax
+ \let\page_location_right_fill \relax
+ \let\page_location_top_fill \relax
+ \let\page_location_bottom_fill\relax}
+
+\page_location_reset
+
+\setvalue{\??ly:\c!location:\v!right }{\settrue\page_location_is_set
+ \let\page_location_left_fill \hss}
+\setvalue{\??ly:\c!location:\v!left }{\settrue\page_location_is_set
+ \let\page_location_right_fill \hss}
+\setvalue{\??ly:\c!location:\v!bottom }{\settrue\page_location_is_set
+ \let\page_location_top_fill \vss}
+\setvalue{\??ly:\c!location:\v!top }{\settrue\page_location_is_set
+ \let\page_location_bottom_fill\vss}
+\setvalue{\??ly:\c!location:\v!middle }{\settrue\page_location_is_set
+ \let\page_location_left_fill \hss
+ \let\page_location_right_fill \hss
+ \let\page_location_top_fill \vss
+ \let\page_location_bottom_fill\vss}
+\setvalue{\??ly:\c!location:\empty }{\setfalse\page_location_is_set % default also signal to scrn_
+ \let\page_location_right_fill \hss
+ \let\page_location_bottom_fill\hss}
+\setvalue{\??ly:\c!location:\v!doublesided}{\doublesidedprinttrue}
+\setvalue{\??ly:\c!location:\v!singlesided}{\doublesidedprintfalse}
+
+\def\dopresetcenterpagebox#1%
+ {\ifcsname\??ly:\c!location:#1\endcsname\csname\??ly:\c!location:#1\endcsname\fi}
+
+\def\presetcenterpagebox
{\doublesidedprintfalse
- \normalexpanded{\noexpand\processallactionsinset[\@@lylocation]}
- [ \v!middle=>{\setuppapersize[\c!left=\hss,\c!right=\hss,\c!top=\vss,\c!bottom=\vss]},
- \v!left=>{\setuppapersize[\c!left=,\c!right=\hss]},
- \v!right=>{\setuppapersize[\c!left=\hss,\c!right=]},
- \v!bottom=>{\setuppapersize[\c!top=\vss,\c!bottom=]},
- \v!top=>{\setuppapersize[\c!top=,\c!bottom=\vss]},%
- \v!doublesided=>\doublesidedprinttrue,
- \v!singlesided=>\doublesidedprintfalse]}
+ \page_location_reset
+ \processcommacommand[\@@lylocation]\dopresetcenterpagebox}
\unexpanded\def\definelayout
{\dodoubleargument\dodefinelayout}
@@ -659,31 +716,41 @@
\def\dodefinelayout[#1][#2]%
{\getparameters[\??ly#1][\c!state=\v!start,#2]}
-% \def\dodosetuplayout[#1][#2]%
-% {\ConvertToConstant\doifnot{#2}\v!reset % #2 ?
-% {\getparameters[\??ly#1][#2]%
-% \checkforems[#2]}}
-
\def\dodosetuplayout[#1][#2]%
{\doifnot{#2}\v!reset{\getparameters[\??ly#1][#2]}}
% global needed for non-doublesided standardmakeup
+\unexpanded\def\setuplayout
+ {\dodoubleempty\dosetuplayout}
+
\def\dosetuplayout[#1][#2]%
- {\globallet\currentlayout\empty % new, global
+ {\globallet\currentlayout\empty
\ifsecondargument
\dodosetuplayout[#1][#2]%
\else\iffirstargument
\doifassignmentelse{#1}
{\dodosetuplayout[][#1]}
- {\doifnot{#1}\v!reset{\xdef\currentlayout{#1}}}% new, global
+ {\doifelse{#1}\v!reset
+ {\let\@@lymethod\v!normal}% hardcodes, assumes a definition
+ {\xdef\currentlayout{#1}}}%
\fi\fi
\recalculatelayout
- \checkcurrentlayout % here ?
+ %\checkcurrentlayout % here?
+ \dochecknextlayout % here?
\presetcenterpagebox}
-\unexpanded\def\setuplayout
- {\dodoubleempty\dosetuplayout}
+\def\installlayouthandler#1#2%
+ {\setgvalue{\??ly:\c!method:#1}{#2}}
+
+\installlayouthandler\v!default
+ {\checkcurrentlayout}
+
+\installlayouthandler\v!normal
+ {\checkcurrentlayout}
+
+\def\dochecknextlayout
+ {\executeifdefined{\??ly:\c!method:\@@lymethod}\checkcurrentlayout}
\let\@@zaheight\!!zeropoint
@@ -771,22 +838,33 @@
%D by the \type {top}, \type {bottom}, \type {left} and \type
%D {right} parameters.
-\def\centerpagebox#1%
+\def\centerpagebox#1% we could test for a difference (saves packing)
{\printpaperwidth \paperscale\printpaperwidth
\printpaperheight\paperscale\printpaperheight
- \setbox#1\vbox to \printpaperheight
- {\@@pptop
- \hbox to \printpaperwidth
- {\ifdoublesidedprint
- \doifbothsides
- {\@@ppleft \box#1\@@ppright}
- {\@@ppleft \box#1\@@ppright}
- {\@@ppright\box#1\@@ppleft }%
- \else
- \@@ppleft \box#1\@@ppright
- \fi}%
- \par
- \@@ppbottom}}
+ \ifdim\printpaperheight>\ht#1\relax
+ \donetrue
+ \else\ifdim\printpaperwidth>\wd#1\relax
+ \donetrue
+ \else
+ \donefalse
+ \fi\fi
+ \ifdone
+ \setbox#1\vbox to \printpaperheight
+ {\@@pptop
+ \page_location_top_fill
+ \hbox to \printpaperwidth
+ {\ifdoublesidedprint
+ \doifbothsides
+ {\@@ppleft \page_location_left_fill \box#1\page_location_right_fill\@@ppright}%
+ {\@@ppleft \page_location_left_fill \box#1\page_location_right_fill\@@ppright}%
+ {\@@ppright\page_location_right_fill\box#1\page_location_left_fill \@@ppleft }%
+ \else
+ \@@ppleft \page_location_left_fill \box#1\page_location_right_fill\@@ppright
+ \fi}%
+ \par
+ \page_location_bottom_fill
+ \@@ppbottom}%
+ \fi}
\def\offsetprintbox#1%
{\ifdim\topoffset=\zeropoint % \relax
@@ -826,36 +904,42 @@
\fi}
\def\orientpagebodybox#1#2#3%
- {\ifnum#2#3>\zerocount
- \setbox#1\vbox
- {\edef\somerotation{\ifdoublesided\ifodd\realpageno#2\else#3\fi\else#2\fi}%
- \dorotatebox\somerotation\hbox{\box#1}}%
+ {\ifnum\number#1\number#2>\zerocount
+ \setbox#3\vbox
+ {\edef\somerotation{\number\ifdoublesided\ifodd\realpageno#1\else#2\fi\else#1\fi}%
+ \dorotatebox\somerotation\hbox{\box#3}}%
\fi}
-\def\orientpaperbox#1%
- {\orientpagebodybox{#1}\paperorientation\paperreverse}
-
-\def\orientprintbox#1%
- {\orientpagebodybox{#1}\printorientation\printreverse}
+\def\orientpaperbox{\orientpagebodybox\paperorientation\paperreverse}
+\def\orientprintbox{\orientpagebodybox\printorientation\printreverse}
\def\mirrorpagebodybox#1#2%
- {\ifcase#2\or
- \setbox#1\vbox{\domirrorbox\vbox{\box#1}}%
+ {\ifconditional#1\relax
+ \setbox#2\vbox{\domirrorbox\vbox{\box#2}}%
\fi}
-\def\mirrorpaperbox#1%
- {\mirrorpagebodybox{#1}\papermirror}
-
-\def\mirrorprintbox#1%
- {\mirrorpagebodybox{#1}\printmirror}
+\def\mirrorpaperbox{\mirrorpagebodybox\papermirror}
+\def\mirrorprintbox{\mirrorpagebodybox\printmirror}
\def\scalepagebox#1%
- {\ifdim\@@lyscale\points=\onepoint \else
- \setbox#1\vbox{\scale[\c!sx=\@@lyscale,\c!sy=\@@lyscale]{\box#1}}%
- \paperwidth \@@lyscale\paperwidth
- \paperheight\@@lyscale\paperheight
+ {\ifdim\@@lyscale\points=\onepoint
+ \ifdim\@@lysx\points=\onepoint
+ \ifdim\@@lysy\points=\onepoint
+ \else
+ \doscalepagebox{#1}\@@lysx\@@lysy
+ \fi
+ \else
+ \doscalepagebox{#1}\@@lysx\@@lysy
+ \fi
+ \else
+ \doscalepagebox{#1}\@@lyscale\@@lyscale
\fi}
+\def\doscalepagebox#1#2#3%
+ {\setbox#1\vbox{\scale[\c!sx=#2,\c!sy=#3]{\box#1}}%
+ \paperwidth #2\paperwidth
+ \paperheight#3\paperheight}
+
\def\negateprintbox#1%
{\ifnegateprintbox
\negatecolorbox{#1}%
@@ -910,8 +994,8 @@
\def\doaddpagecolormarks#1#2%
{\makepagecutbox{#2}%
- \ifnum\horizontalcutmarks>\plustwo \chardef\colormarkoffset\plusfour \fi
- \ifnum\verticalcutmarks >\plustwo \chardef\colormarkoffset\plusfour \fi
+ \ifnum\horizontalcutmarks>\plustwo \def\colormarkoffset{\plusfour}\fi
+ \ifnum\verticalcutmarks >\plustwo \def\colormarkoffset{\plusfour}\fi
#1{#2}}
% NOG EENS NAGAAN WANNEER NU GLOBAL EN WANNEER NIET
@@ -963,10 +1047,10 @@
\newdimen\innermakeupwidth % special purpose
\newdimen\innermakeupmargin % special purpose
-\chardef\innermakeupcompensation\plusone
+\newconditional\innermakeupcompensation \settrue\innermakeupcompensation
\def\compensatedinnermakeupmargin
- {\dimexpr\ifnum\innermakeupcompensation=\plusone+\innermakeupmargin\else\zeropoint\fi\relax}
+ {\dimexpr\ifconditional\innermakeupcompensation+\innermakeupmargin\else\zeropoint\fi\relax}
\def\freezetextwidth % \makeupwidth may be set to \textwidth
{\textwidth\makeupwidth % which is a tricky but valid value
@@ -1146,11 +1230,11 @@
%D \showsetup{showsetups}
%D %showsetup{showmargins}
-\fetchruntimecommand \showprint {page-run.mkii}
-\fetchruntimecommand \showframe {page-run.mkii}
-\fetchruntimecommand \showlayout {page-run.mkii}
-\fetchruntimecommand \showsetups {page-run.mkii}
-\fetchruntimecommand \showmargins {page-run.mkii}
+\fetchruntimecommand \showprint {page-run}
+\fetchruntimecommand \showframe {page-run}
+\fetchruntimecommand \showlayout {page-run}
+\fetchruntimecommand \showsetups {page-run}
+\fetchruntimecommand \showmargins {page-run}
%D The default dimensions are quite old and will not change.
%D The funny fractions were introduced when we went from fixed
@@ -1166,6 +1250,25 @@
%D since they could change while going to a new page,
%D depending on the current font setting.
+\setuppaper % (size) % only used in XY imposition
+ [\c!width=\zeropoint,
+ \c!height=\zeropoint,
+ \c!topspace=\zeropoint,
+ \c!backspace=\zeropoint,
+ \c!dx=\zeropoint,
+ \c!dy=\zeropoint,
+ \c!nx=1,
+ \c!ny=1,
+ \c!method=\v!normal]
+
+\setuppapersize
+ [\c!option=\v!max,
+ \c!top=,
+ \c!bottom=,
+ \c!left=,
+ \c!right=,
+ \c!location=]
+
\setuplayout
[ \c!topspace=.08417508418\paperheight, % 2.5cm
\c!top=\zeropoint,
@@ -1201,8 +1304,10 @@
\c!style=,
\c!color=,
\c!marking=\v!off,
- \c!location=, % \v!singlesided, but empty is signal
+ \c!location=,% \v!singlesided, but unset is signal (no other default, spoils arrange)
\c!scale=1,
+ \c!sx=1,
+ \c!sy=1,
\c!nx=1,
\c!ny=1,
\c!dx=\zeropoint,
@@ -1220,27 +1325,6 @@
%D First we define a whole range of (DIN) papersizes,
%D of which the A-series makes most sense. We enable checking.
-%D We also set some of the parameters that will be used when
-%D positioning the typeset paper onto the print paper.
-
-\setuppaper % (size) % only used in XY imposition
- [\c!width=\zeropoint,
- \c!height=\zeropoint,
- \c!topspace=\zeropoint,
- \c!backspace=\zeropoint,
- \c!dx=\zeropoint,
- \c!dy=\zeropoint,
- \c!nx=1,
- \c!ny=1,
- \c!method=\v!normal]
-
-\setuppapersize
- [\c!option=\v!max,
- \c!top=,
- \c!bottom=\vss,
- \c!left=,
- \c!right=\hss]
-
\definepapersize [A0] [\c!width=841mm,\c!height=1189mm]
\definepapersize [A1] [\c!width=594mm,\c!height=841mm]
\definepapersize [A2] [\c!width=420mm,\c!height=594mm]
@@ -1368,10 +1452,15 @@
%D paper size with the typeset paper size. This setting should
%D come after the first layout specification (already done).
-\setuppapersize
- [A4][A4]
+% \definepapersize
+% [\v!default]
+% [ \c!width=\paperwidth,
+% \c!height=\paperheight]
-%D A few goodies:
+% \definepapersize
+% [samesized]
+% [ \c!width=\paperwidth,
+% \c!height=\paperheight]
\definepapersize
[oversized]
@@ -1388,6 +1477,14 @@
[ \c!width=\dimexpr \paperheight+1.5cm\relax,
\c!height=\dimexpr2\paperwidth +1.5cm\relax]
+% \setuppapersize
+% [A4][A4]
+
+\setuppapersize
+ [A4][samesized]
+
+%D A few goodies:
+
%D For orthogonality:
\definepapersize
diff --git a/Master/texmf-dist/tex/context/base/page-lin.lua b/Master/texmf-dist/tex/context/base/page-lin.lua
index 1f2c9625116..676a4c7f656 100644
--- a/Master/texmf-dist/tex/context/base/page-lin.lua
+++ b/Master/texmf-dist/tex/context/base/page-lin.lua
@@ -6,34 +6,48 @@ if not modules then modules = { } end modules ['page-lin'] = {
license = "see context related readme files"
}
--- experimental
+-- experimental -> will become builders
local trace_numbers = false trackers.register("lines.numbers", function(v) trace_numbers = v end)
-local format = string.format
-local texsprint, texwrite, texbox = tex.sprint, tex.write, tex.box
+local report_lines = logs.reporter("lines")
-local ctxcatcodes = tex.ctxcatcodes
-local variables = interfaces.variables
+local texbox = tex.box
-nodes = nodes or { }
-nodes.lines = nodes.lines or { }
-nodes.lines.data = nodes.lines.data or { } -- start step tag
+local attributes, nodes, node, context = attributes, nodes, node, context
-storage.register("lines/data", nodes.lines.data, "nodes.lines.data")
+nodes.lines = nodes.lines or { }
+local lines = nodes.lines
+
+lines.data = lines.data or { } -- start step tag
+local data = lines.data
+local last = #data
+
+lines.scratchbox = lines.scratchbox or 0
+
+local leftmarginwidth = nodes.leftmarginwidth
+
+storage.register("lines/data", lines.data, "nodes.lines.data")
-- if there is demand for it, we can support multiple numbering streams
-- and use more than one attibute
-local hlist, vlist, whatsit = node.id('hlist'), node.id('vlist'), node.id('whatsit')
+local variables = interfaces.variables
-local display_math = attributes.private('display-math')
-local line_number = attributes.private('line-number')
-local line_reference = attributes.private('line-reference')
+local nodecodes = nodes.nodecodes
-local current_list = { }
-local cross_references = { }
-local chunksize = 250 -- not used in boxed
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local whatsit_code = nodecodes.whatsit
+
+local a_displaymath = attributes.private('displaymath')
+local a_linenumber = attributes.private('linenumber')
+local a_linereference = attributes.private('linereference')
+local a_verbatimline = attributes.private('verbatimline')
+
+local current_list = { }
+local cross_references = { }
+local chunksize = 250 -- not used in boxed
local has_attribute = node.has_attribute
local traverse_id = node.traverse_id
@@ -43,16 +57,9 @@ local hpack_node = node.hpack
local insert_node_after = node.insert_after
local insert_node_before = node.insert_before
-local whatsit = node.id("whatsit")
-
-local data = nodes.lines.data
-local last = #data
-
-nodes.lines.scratchbox = nodes.lines.scratchbox or 0
-
-- cross referencing
-function nodes.lines.number(n)
+function lines.number(n)
n = tonumber(n)
local cr = cross_references[n] or 0
cross_references[n] = nil
@@ -62,20 +69,20 @@ end
local function resolve(n,m) -- we can now check the 'line' flag (todo)
while n do
local id = n.id
- if id == whatsit then -- why whatsit
- local a = has_attribute(n,line_reference)
+ if id == whatsit_code then -- why whatsit
+ local a = has_attribute(n,a_linereference)
if a then
cross_references[a] = m
end
- elseif id == hlist or id == vlist then
+ elseif id == hlist_code or id == vlist_code then
resolve(n.list,m)
end
n = n.next
end
end
-function nodes.lines.finalize(t)
- local getnumber = nodes.lines.number
+function lines.finalize(t)
+ local getnumber = lines.number
for _,p in next, t do
for _,r in next, p do
if r.metadata.kind == "line" then
@@ -89,16 +96,16 @@ function nodes.lines.finalize(t)
end
end
-local filters = jobreferences.filters
-local helpers = structure.helpers
+local filters = structures.references.filters
+local helpers = structures.helpers
-jobreferences.registerfinalizer(nodes.lines.finalize)
+structures.references.registerfinalizer(lines.finalize)
filters.line = filters.line or { }
function filters.line.default(data)
-- helpers.title(data.entries.linenumber or "?",data.metadata)
- texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",data.entries.conversion or "numbers",data.entries.linenumber or "0"))
+ context.convertnumber(data.entries.conversion or "numbers",data.entries.linenumber or "0")
end
function filters.line.page(data,prefixspec,pagespec) -- redundant
@@ -106,90 +113,139 @@ function filters.line.page(data,prefixspec,pagespec) -- redundant
end
function filters.line.linenumber(data) -- raw
- texwrite(data.entries.linenumber or "0")
+ context(data.entries.linenumber or "0")
end
-- boxed variant, todo: use number mechanism
-nodes.lines.boxed = { }
+lines.boxed = { }
+local boxed = lines.boxed
-- todo: cache setups, and free id no longer used
-- use interfaces.cachesetup(t)
-function nodes.lines.boxed.register(configuration)
+function boxed.register(configuration)
last = last + 1
data[last] = configuration
if trace_numbers then
- logs.report("lines","registering setup %s",last)
+ report_lines("registering setup %s",last)
end
return last
end
-function nodes.lines.boxed.setup(n,configuration)
+function boxed.setup(n,configuration)
local d = data[n]
if d then
if trace_numbers then
- logs.report("lines","updating setup %s",n)
+ report_lines("updating setup %s",n)
end
for k,v in next, configuration do
d[k] = v
end
else
if trace_numbers then
- logs.report("lines","registering setup %s (br)",n)
+ report_lines("registering setup %s (br)",n)
end
data[n] = configuration
end
return n
end
-local the_left_margin = nodes.the_left_margin
-
-local function check_number(n,a,skip) -- move inline
+local function check_number(n,a,skip,sameline)
local d = data[a]
if d then
- local s = d.start or 1
+ local tag, skipflag, s = d.tag or "", 0, d.start or 1
current_list[#current_list+1] = { n, s }
- if not skip and s % d.step == 0 then
- local tag = d.tag or ""
- texsprint(ctxcatcodes, format("\\makenumber{%s}{%s}{%s}{%s}{%s}{%s}\\endgraf",tag,s,n.shift,n.width,the_left_margin(n.list),n.dir))
+ if sameline then
+ skipflag = 0
+ if trace_numbers then
+ report_lines("skipping broken line number %s for setup %s: %s (%s)",#current_list,a,s,d.continue or "no")
+ end
+ elseif not skip and s % d.step == 0 then
+ skipflag, d.start = 1, s + 1 -- (d.step or 1)
if trace_numbers then
- logs.report("numbers","making number %s for setup %s: %s (%s)",#current_list,a,s,d.continue or "no")
+ report_lines("making number %s for setup %s: %s (%s)",#current_list,a,s,d.continue or "no")
end
else
- texsprint(ctxcatcodes, "\\skipnumber\\endgraf")
+ skipflag, d.start = 0, s + 1 -- (d.step or 1)
+ if trace_numbers then
+ report_lines("skipping line number %s for setup %s: %s (%s)",#current_list,a,s,d.continue or "no")
+ end
+ end
+ context.makelinenumber(tag,skipflag,s,n.shift,n.width,leftmarginwidth(n.list),n.dir)
+ end
+end
+
+-- xlist
+-- xlist
+-- hlist
+
+local function identify(list)
+ if list then
+ for n in traverse_id(hlist_code,list) do
+ if has_attribute(n,a_linenumber) then
+ return list
+ end
+ end
+ local n = list
+ while n do
+ local id = n.id
+ if id == hlist_code or id == vlist_code then
+ local ok = identify(n.list)
+ if ok then
+ return ok
+ end
+ end
+ n = n.next
end
- d.start = s + 1 -- (d.step or 1)
end
end
-function nodes.lines.boxed.stage_one(n)
+function boxed.stage_zero(n)
+ return identify(texbox[n].list)
+end
+
+function boxed.stage_one(n,nested)
current_list = { }
local head = texbox[n]
if head then
local list = head.list
- local last_a, skip = nil, false
- for n in traverse_id(hlist,list) do -- attr test here and quit as soon as zero found
+ if nested then
+ list = identify(list)
+ end
+ local last_a, last_v, skip = nil, -1, false
+ for n in traverse_id(hlist_code,list) do -- attr test here and quit as soon as zero found
if n.height == 0 and n.depth == 0 then
- -- skip funny hlists
+ -- skip funny hlists -- todo: check line subtype
else
- local a = has_attribute(n.list,line_number)
+ local list = n.list
+ local a = has_attribute(list,a_linenumber)
if a and a > 0 then
if last_a ~= a then
- if data[a].method == variables.next then
+ local da = data[a]
+ local ma = da.method
+ if ma == variables.next then
skip = true
+ elseif ma == variables.page then
+ da.start = 1 -- eventually we will have a normal counter
end
last_a = a
+ if trace_numbers then
+ report_lines("starting line number range %s: start %s, continue",a,da.start,da.continue or "no")
+ end
end
- if has_attribute(n,display_math) then
+ if has_attribute(n,a_displaymath) then
if nodes.is_display_math(n) then
check_number(n,a,skip)
end
else
- -- the following test fails somehow (change in luatex?)
- -- if node.first_character(n.list) then
+ local v = has_attribute(list,a_verbatimline)
+ if not v or v ~= last_v then
+ last_v = v
check_number(n,a,skip)
- -- end
+ else
+ check_number(n,a,skip,true)
+ end
end
skip = false
end
@@ -198,18 +254,24 @@ function nodes.lines.boxed.stage_one(n)
end
end
-function nodes.lines.boxed.stage_two(n,m)
+function boxed.stage_two(n,m)
if #current_list > 0 then
- m = m or nodes.lines.scratchbox
- local t, i = { }, 0
- for l in traverse_id(hlist,texbox[m].list) do
- t[#t+1] = copy_node(l)
+ m = m or lines.scratchbox
+ local t, tn = { }, 0
+ for l in traverse_id(hlist_code,texbox[m].list) do
+ tn = tn + 1
+ t[tn] = copy_node(l)
end
for i=1,#current_list do
local li = current_list[i]
local n, m, ti = li[1], li[2], t[i]
- ti.next, n.list = n.list, ti
- resolve(n,m)
+ if ti then
+ ti.next, n.list = n.list, ti
+ resolve(n,m)
+ else
+ report_lines("error in linenumbering (1)")
+ return
+ end
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/page-lin.mkiv b/Master/texmf-dist/tex/context/base/page-lin.mkiv
index 51f02763985..4f2226f6e33 100644
--- a/Master/texmf-dist/tex/context/base/page-lin.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-lin.mkiv
@@ -12,47 +12,75 @@
%C details.
% generic or not ... maybe not bother too much and simplify to mkiv only
+% get rid of \mk*
\writestatus{loading}{ConTeXt Core Macros / Line Numbering}
\unprotect
% todo: save settings
-
+%
% low level interface
+%
+% we should use normal counters but then we need to sync settings
+
+% not yet ok, we need to give the top line a proper height
+%
+% \newbox\locallinenumberbox
+%
+% \unexpanded\def\startlocallinenumbering
+% {\setbox\locallinenumberbox\vbox\bgroup
+% \startlinenumbering}
+%
+% \unexpanded\def\stoplocallinenumbering
+% {\stoplinenumbering
+% \egroup
+% \mkdoprocessdeepboxcontents\locallinenumberbox
+% \unvbox\locallinenumberbox}
+
+% some line
+%
+% \startlocallinenumbering
+% some source code 1\par
+% some source code 2\par
+% some source code 3\par
+% \stoplocallinenumbering
+%
+% some line
\registerctxluafile{page-lin}{1.001}
-\definesystemattribute[line-number] \chardef\linenumberattribute \dogetattributeid{line-number}
-\definesystemattribute[line-reference] \chardef\linereferenceattribute \dogetattributeid{line-reference}
+\definesystemattribute[linenumber] [public]
+\definesystemattribute[linereference][public]
\appendtoksonce \attribute\linenumberattribute \attributeunsetvalue \to \everyforgetall
\appendtoksonce \attribute\displaymathattribute\plusone \to \everybeforedisplayformula
-\newcount\linenumber
-\newbox \linenumberscratchbox
-\newcount\linenumberchunk
-\newcount\linerefcounter
+\newcount \linenumber % not used
+\newbox \linenumberscratchbox
+\newcount \linenumberchunk
+\newcount \linerefcounter
+\newconstant\linenumbernesting
\newconditional\tracelinenumbering
-\def\mkprocesstextlinenumbers#1%
- {\setbox\linenumberscratchbox\vbox{\forgetall\offinterlineskip\ctxlua{nodes.lines.boxed.stage_one(\number#1)}}%
+\def\mkprocesstextlinenumbers#1#2%
+ {\setbox\linenumberscratchbox\vbox
+ {\forgetall
+ \offinterlineskip
+ \ctxlua{nodes.lines.boxed.stage_one(\number#1,\ifcase\linenumbernesting false\else true\fi)}}%
\ctxlua{nodes.lines.boxed.stage_two(\number#1,\number\linenumberscratchbox)}}% can move to lua code
% id nr shift width leftskip dir
-% \def\mkskiplinenumber #1#2#3#4#6#5{}
-% \def\mkleftlinenumber #1#2#3#4#5#6{\hbox{\llap{#2\quad\hskip#3\scaledpoint}}}
-% \def\mkrightlinenumber#1#2#3#4#5#6{\hbox{\rlap{\hskip#4\scaledpoint\hskip#3\scaledpoint\quad#2}}}
-
-\let\makenumber\gobblesixarguments
+\let\makelinenumber\gobblesevenarguments
\newconditional\boxcontentneedsprocessing
-\def\mkdoprocesspagecontents #1{\mkaddtextlinenumbers{#1}\plusone \plusone}
-\def\mkdoprocessboxcontents #1{\mkaddtextlinenumbers{#1}\plusone \plusone}
-\def\mkdoprocesscolumncontents#1{\mkaddtextlinenumbers{#1}\currentcolumn\nofcolumns}
+\def\mkdoprocesspagecontents #1{\mkaddtextlinenumbers{#1}\plusone \plusone \zerocount}
+\def\mkdoprocessboxcontents #1{\mkaddtextlinenumbers{#1}\plusone \plusone \zerocount}
+\def\mkdoprocessdeepboxcontents#1{\mkaddtextlinenumbers{#1}\plusone \plusone \plusone }
+\def\mkdoprocesscolumncontents #1{\mkaddtextlinenumbers{#1}\currentcolumn\nofcolumns\zerocount}
\def\mklinenumberparameters
{continue = "\linenumberparameter\c!continue",
@@ -117,9 +145,9 @@
\let\currentlinenumbering\empty
-\chardef\linenumbermode = 1 % 0=continue, 1=restart
-\chardef\linenumberlocation = 1 % 0=middle, 1=left, 2=right, 3=inner, 4=outer, 5=text, 6=begin, 7=end
-\chardef\linenumberalignment = 5 % 0=middle, 1=left, 2=right, 5=auto
+\setnewconstant\linenumbermode \plusone % 0=continue, 1=restart
+\setnewconstant\linenumberlocation \plusone % 0=middle, 1=left, 2=right, 3=inner, 4=outer, 5=text, 6=begin, 7=end
+\setnewconstant\linenumberalignment\plusfive % 0=middle, 1=left, 2=right, 5=auto
\newevery \beforeeverylinenumbering \relax
\newevery \aftereverylinenumbering \relax
@@ -180,29 +208,29 @@
% todo: text
-\expandafter\chardef\csname\??rn:l:\v!middle \endcsname \zerocount
-\expandafter\chardef\csname\??rn:l:\v!left \endcsname \plusone
-\expandafter\chardef\csname\??rn:l:\v!margin \endcsname \plusone
-\expandafter\chardef\csname\??rn:l:\v!inmargin\endcsname \plusone
-\expandafter\chardef\csname\??rn:l:\v!inleft \endcsname \plusone
-\expandafter\chardef\csname\??rn:l:\v!right \endcsname \plustwo
-\expandafter\chardef\csname\??rn:l:\v!inright \endcsname \plustwo
-\expandafter\chardef\csname\??rn:l:\v!inner \endcsname \plusthree
-\expandafter\chardef\csname\??rn:l:\v!outer \endcsname \plusfour
-\expandafter\chardef\csname\??rn:l:\v!text \endcsname \plusfive
-\expandafter\chardef\csname\??rn:l:\v!begin \endcsname \plussix
-\expandafter\chardef\csname\??rn:l:\v!end \endcsname \plusseven
-
-\expandafter\chardef\csname\??rn:a:\v!middle \endcsname \zerocount
-\expandafter\chardef\csname\??rn:a:\v!right \endcsname \plusone
-\expandafter\chardef\csname\??rn:a:\v!flushleft \endcsname \plusone
-\expandafter\chardef\csname\??rn:a:\v!left \endcsname \plustwo
-\expandafter\chardef\csname\??rn:a:\v!flushright\endcsname \plustwo
-\expandafter\chardef\csname\??rn:a:\v!auto \endcsname \plusfive
+\expandafter\let\csname\??rn:l:\v!middle \endcsname \zerocount
+\expandafter\let\csname\??rn:l:\v!left \endcsname \plusone
+\expandafter\let\csname\??rn:l:\v!margin \endcsname \plusone
+\expandafter\let\csname\??rn:l:\v!inmargin \endcsname \plusone
+\expandafter\let\csname\??rn:l:\v!inleft \endcsname \plusone
+\expandafter\let\csname\??rn:l:\v!right \endcsname \plustwo
+\expandafter\let\csname\??rn:l:\v!inright \endcsname \plustwo
+\expandafter\let\csname\??rn:l:\v!inner \endcsname \plusthree
+\expandafter\let\csname\??rn:l:\v!outer \endcsname \plusfour
+\expandafter\let\csname\??rn:l:\v!text \endcsname \plusfive
+\expandafter\let\csname\??rn:l:\v!begin \endcsname \plussix
+\expandafter\let\csname\??rn:l:\v!end \endcsname \plusseven
+
+\expandafter\let\csname\??rn:a:\v!middle \endcsname \zerocount
+\expandafter\let\csname\??rn:a:\v!right \endcsname \plusone
+\expandafter\let\csname\??rn:a:\v!flushleft \endcsname \plusone
+\expandafter\let\csname\??rn:a:\v!left \endcsname \plustwo
+\expandafter\let\csname\??rn:a:\v!flushright\endcsname \plustwo
+\expandafter\let\csname\??rn:a:\v!auto \endcsname \plusfive
\def\dostartlinenumbering[#1][#2]% todo: c!continue
{\begingroup
- \chardef\linenumbermode\plusone
+ \linenumbermode\plusone
\ifsecondargument
\def\currentlinenumbering{#1}%
\doifassignmentelse{#2}
@@ -211,7 +239,7 @@
{\setvalue{\??rn#1\c!start}{#2}}%
{\doif{#2}\v!continue
{\getparameters[\??rn\currentlinenumbering][\c!continue=\v!yes]%
- \chardef\linenumbermode\zerocount}}}%
+ \linenumbermode\zerocount}}}%
\else\iffirstargument
\doifnumberelse{#1}% downward compatible
{\let\currentlinenumbering\empty
@@ -219,11 +247,11 @@
{\doifelse{#1}\v!continue
{\let\currentlinenumbering\empty
\getparameters[\??rn\currentlinenumbering][\c!continue=\v!yes]%
- \chardef\linenumbermode\zerocount}
+ \linenumbermode\zerocount}
{\def\currentlinenumbering{#1}}}%
\fi\fi
\doif{\linenumberparameter\c!continue}\v!yes
- {\chardef\linenumbermode\zerocount}%
+ {\linenumbermode\zerocount}%
\numberinglinestrue
\the\beforeeverylinenumbering
\mkstarttextlinenumbering\currentlinenumbering\linenumbermode}
@@ -235,8 +263,6 @@
% number placement
-\let\mkskiplinenumber \gobblesixarguments
-
\def\mkdoinnerlinenumber{\doifoddpageelse\mkdoleftlinenumber\mkdorightlinenumber}
\def\mkdoouterlinenumber{\doifoddpageelse\mkdorightlinenumber\mkdoleftlinenumber}
@@ -278,79 +304,89 @@
\expandafter\mkdobeginlinenumber
\fi}
-\def\mkaddtextlinenumbers#1#2#3% box col max
+\newconditional\faketextlinenumber
+\newconstant \linenumberbox
+\newconstant \linenumbercolumn
+\newconstant \linenumberlastcolumn
+
+\def\mkaddtextlinenumbers#1#2#3#4% box col max nesting
{\bgroup
- \chardef\linenumberbox #1\relax
- \chardef\linenumbercolumn #2\relax
- \chardef\linenumberlastcolumn#3\relax
+ \linenumberbox #1\relax
+ \linenumbercolumn #2\relax
+ \linenumberlastcolumn#3\relax
+ \linenumbernesting #4\relax
\fullrestoreglobalbodyfont
- \def\skipnumber{\hbox{}}%
- \let\makenumber\maketextlinenumber
- \mkprocesstextlinenumbers\linenumberbox
+ \let\makelinenumber\maketextlinenumber
+ \mkprocesstextlinenumbers\linenumberbox\linenumbernesting
\egroup}
-\def\maketextlinenumber#1%
+\def\maketextlinenumber#1#2%
{\edef\currentlinenumbering{#1}%
- \chardef\linenumberlocation \executeifdefined{\??rn:l:\linenumberparameter\c!location}\plusone % left
- \chardef\linenumberalignment\executeifdefined{\??rn:a:\linenumberparameter\c!align }\plusfive % auto
+ \ifcase#2\relax
+ \settrue \faketextlinenumber
+ \else
+ \setfalse\faketextlinenumber
+ \fi
+ \linenumberlocation \executeifdefined{\??rn:l:\linenumberparameter\c!location}\plusone % left
+ \linenumberalignment\executeifdefined{\??rn:a:\linenumberparameter\c!align }\plusfive % auto
\ifcase\linenumberlastcolumn\relax
- \let\domakenumber\mkskiplinenumber
+ \settrue \faketextlinenumber
\or
% one column
\ifcase\linenumberlocation
- \let\domakenumber\mkskiplinenumber
+ \settrue \faketextlinenumber
% hm
\or
- \let\domakenumber\mkleftlinenumber
+ \let\domakelinenumber\mkleftlinenumber
\or
- \let\domakenumber\mkrightlinenumber
+ \let\domakelinenumber\mkrightlinenumber
\or % inner
- \let\domakenumber\mkdoinnerlinenumber
+ \let\domakelinenumber\mkdoinnerlinenumber
\or % outer
- \let\domakenumber\mkdoouterlinenumber
+ \let\domakelinenumber\mkdoouterlinenumber
\or % text
- \let\domakenumber\mkdotextlinenumber
+ \let\domakelinenumber\mkdotextlinenumber
\or
- \let\domakenumber\mkdobeginlinenumber
+ \let\domakelinenumber\mkdobeginlinenumber
\or
- \let\domakenumber\mkdoendlinenumber
+ \let\domakelinenumber\mkdoendlinenumber
\fi
\else\ifcase\linenumbercolumn\relax
- \let\domakenumber\mkskiplinenumber
+ \settrue \faketextlinenumber
\or
- \let\domakenumber\mkleftlinenumber
+ \let\domakelinenumber\mkleftlinenumber
\ifcase\linenumberlocation\or
- \chardef\linenumberlocation\plusone
+ \linenumberlocation\plusone
\or
- \chardef\linenumberlocation\plustwo
+ \linenumberlocation\plustwo
\else
- \chardef\linenumberlocation\plusone
+ \linenumberlocation\plusone
\or
- \chardef\linenumberlocation\plusone
+ \linenumberlocation\plusone
\or
- \chardef\linenumberlocation\plusone
+ \linenumberlocation\plusone
\or
- \chardef\linenumberlocation\plusone % todo
+ \linenumberlocation\plusone % todo
\or
- \chardef\linenumberlocation\plusone % todo
+ \linenumberlocation\plusone % todo
\fi
\else
- \let\domakenumber\mkrightlinenumber
+ \let\domakelinenumber\mkrightlinenumber
\ifcase\linenumberlocation\or
- \chardef\linenumberlocation\plustwo
+ \linenumberlocation\plustwo
\or
- \chardef\linenumberlocation\plusone
+ \linenumberlocation\plusone
\or
- \chardef\linenumberlocation\plustwo
+ \linenumberlocation\plustwo
\or
- \chardef\linenumberlocation\plustwo
+ \linenumberlocation\plustwo
\or
- \chardef\linenumberlocation\plustwo % todo
+ \linenumberlocation\plustwo % todo
\or
- \chardef\linenumberlocation\plustwo % todo
+ \linenumberlocation\plustwo % todo
\fi
\fi\fi
- \domakenumber{#1}}
+ \domakelinenumber{#1}}
\def\mkdotextlinenumber #1#2#3#4#5#6% beware, one needs so compensate for this in the width !
{\hbox{\dosomelinenumber{#1}{2}{#2}{#5}\hskip#3\scaledpoint}}
@@ -370,19 +406,19 @@
\def\mkdobeginlinenumber #1#2#3#4#5#6%
{\ifcase\istltdir#6\relax
- \chardef\linenumberlocation\plusone
+ \linenumberlocation\plusone
\expandafter\mkdoleftlinenumber
\else
- \chardef\linenumberlocation\plustwo
+ \linenumberlocation\plustwo
\expandafter\mkdorightlinenumber
\fi{#1}{#2}{#3}{#4}{#5}{#6}}
\def\mkdoendlinenumber#1#2#3#4#5#6%
{\ifcase\istltdir#6\relax
- \chardef\linenumberlocation\plustwo
+ \linenumberlocation\plustwo
\expandafter\mkdorightlinenumber
\else
- \chardef\linenumberlocation\plusone
+ \linenumberlocation\plusone
\expandafter\mkdoleftlinenumber
\fi{#1}{#2}{#3}{#4}{#5}{#6}}
@@ -397,16 +433,16 @@
\ifcase#2\relax\or\hskip\linenumberdistance\fi\relax
\ifnum\linenumberlocation=\plusfive
\scratchdimen\dimexpr#4\scaledpoint-\linenumberdistance\relax
- \chardef\linenumberlocation\plusone
+ \linenumberlocation\plusone
\else
\scratchdimen\zeropoint
\fi
\ifcase\linenumberalignment
- \chardef\linenumberlocation\zerocount % middle
+ \linenumberlocation\zerocount % middle
\or
- \chardef\linenumberlocation\plusone % left
+ \linenumberlocation\plusone % left
\or
- \chardef\linenumberlocation\plustwo % right
+ \linenumberlocation\plustwo % right
\fi
\ifconditional\tracelinenumbering\ruledhbox\else\hbox\fi to \linenumberwidth
{\ifcase\linenumberlocation
@@ -420,11 +456,15 @@
\or
\doifoddpageelse\hss\relax % outer
\fi
- \linenumberattributes\c!style\c!color
- {\linenumberparameter\c!command
- {\linenumberparameter\c!left
- \convertnumber{\linenumberparameter\c!conversion}{#3}%
- \linenumberparameter\c!right}}%
+ \ifconditional\faketextlinenumber
+ % we need to reserve space
+ \else
+ \linenumberattributes\c!style\c!color
+ {\linenumberparameter\c!command
+ {\linenumberparameter\c!left
+ \convertnumber{\linenumberparameter\c!conversion}{#3}%
+ \linenumberparameter\c!right}}%
+ \fi
\ifcase\linenumberlocation
\hss % middle
\or
@@ -447,7 +487,7 @@
% referencing
-\def\someline [#1]{\mkstartlinereference{#1}\mkstoplinereference{#1}}
+\unexpanded\def\someline [#1]{\mkstartlinereference{#1}\mkstoplinereference{#1}} % was just a def
\unexpanded\def\startline[#1]{\mkstartlinereference{#1}}
\unexpanded\def\stopline [#1]{\mkstoplinereference {#1}}
@@ -457,6 +497,7 @@
{\vrule\!!width\onepoint\!!depth\strutdp\!!height.8\strutht\raise.85\strutht\hbox{\llap{\tt\txx#1}}}}%
\smashbox\scratchbox\box\scratchbox
\fi}
+
\def\mkshowstoplinereference#1%
{\ifconditional\tracelinenumbering
\setbox\scratchbox\hbox{\rlap
@@ -469,7 +510,7 @@
% eventually we will do this in lua
-\def\currentreferencelinenumber{\ctxlua{jobreferences.filter("linenumber")}}
+\def\currentreferencelinenumber{\ctxlua{structures.references.filter("linenumber")}}
\def\doifelsesamelinereference#1#2#3%
{\doifreferencefoundelse{lr:b:#1}
@@ -478,8 +519,8 @@
{\edef\tline{\currentreferencelinenumber}%
%[\fline,\tline]
\ifx\fline\tline#2\else#3\fi}
- {\unknownreference{#1}#2}}
- {\unknownreference{#1}#2}}
+ {#2}}
+ {#2}}
\def\inline#1[#2]%
{\doifelsenothing{#1}
diff --git a/Master/texmf-dist/tex/context/base/page-mak.mkii b/Master/texmf-dist/tex/context/base/page-mak.mkii
index 040feb1d214..2087a68400b 100644
--- a/Master/texmf-dist/tex/context/base/page-mak.mkii
+++ b/Master/texmf-dist/tex/context/base/page-mak.mkii
@@ -42,8 +42,6 @@
[\??do#1]%
[\c!width=\innermakeupwidth, % example in manual / was \makeupwidth
\c!height=\textheight, % example in manual
- \c!voffset=\!!zeropoint, % example in manual
- \c!hoffset=\!!zeropoint, % example in manual
\c!commands=,
\c!setups=,
\c!page=\v!right,
@@ -214,8 +212,6 @@
[\v!standard]
[\c!width=\innermakeupwidth,
\c!height=\textheight,
- \c!voffset=\!!zeropoint,
- \c!hoffset=\!!zeropoint,
\c!page=\v!right,
\c!doublesided=\v!empty]
diff --git a/Master/texmf-dist/tex/context/base/page-mak.mkiv b/Master/texmf-dist/tex/context/base/page-mak.mkiv
index fd89a45ff77..ea285bcb8bc 100644
--- a/Master/texmf-dist/tex/context/base/page-mak.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-mak.mkiv
@@ -42,8 +42,6 @@
[\??do#1]%
[\c!width=\innermakeupwidth, % example in manual / was \makeupwidth
\c!height=\textheight, % example in manual
- \c!voffset=\!!zeropoint, % example in manual
- \c!hoffset=\!!zeropoint, % example in manual
\c!commands=,
\c!setups=,
\c!page=\v!right,
@@ -80,8 +78,6 @@
\newtoks\everymakeup
-\appendtoks \postponemarks \to \everymakeup
-
\let\currentmakeup\empty
\unexpanded\def\startmakeup
@@ -111,7 +107,6 @@
\def\donostopmakeup
{\egroup
- \flushmarks % new, here, else empty pages
\page
\egroup}
@@ -121,7 +116,7 @@
\def\dodostartmakeup
{\doifvaluesomething{\??do\currentmakeup\c!page}
- {\ExpandFirstAfter\page[\makeupparameter\c!page]}%
+ {\page[\makeupparameter\c!page]}%
\pagetype[\currentmakeup]%
\setsystemmode\v!makeup
\setupmakeuplayout
@@ -141,7 +136,6 @@
\makeupparameter\c!bottom
\doifsomething{\makeupparameter\c!color}{\stopcolor}%
\egroup
- \flushmarks % new, here, else empty pages
\doflushmakeup
\egroup
\calculatehsizes
@@ -185,11 +179,11 @@
\ifdoublesided \ifodd\realpageno\else
\processaction
[\makeupparameter\c!doublesided]
- [ \v!yes=>\null
+ [ \v!yes=>\emptyhbox
\page,
\v!empty=>{\setupmakeuplayout
\page[\v!blank]%
- \null
+ \emptyhbox
\page}]%
\fi \fi
\poppagestate} % new
@@ -213,8 +207,6 @@
[\v!standard]
[\c!width=\innermakeupwidth,
\c!height=\textheight,
- \c!voffset=\!!zeropoint,
- \c!hoffset=\!!zeropoint,
\c!page=\v!right,
\c!doublesided=\v!empty]
diff --git a/Master/texmf-dist/tex/context/base/page-mar.mkiv b/Master/texmf-dist/tex/context/base/page-mar.mkiv
index 464b4f9bb09..433364a0638 100644
--- a/Master/texmf-dist/tex/context/base/page-mar.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-mar.mkiv
@@ -11,12 +11,16 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+\endinput % obsolete, also commented code in anch-pgr.mkiv
+
%D Support for margin words is one of the reasons for writing
%D \CONTEXT. Over time support for marginal content has been
%D extended en enhanced. Therefore it's always good to watch
%D out for unexpected side effects.
-\writestatus{loading}{ConTeXt Page Macros / Maginal Things}
+%D TODO: use parents etc
+
+\writestatus{loading}{ConTeXt Page Macros / Marginal Things}
\unprotect
@@ -60,12 +64,16 @@
#2]%
\setuvalue{#1}{\dohandlemarginline{#1}}}
-\def\marginlineparameter #1{\csname\??im\??im\currentmarginline#1\endcsname}
-\def\marginlineexecuter #1#2{\executeifdefined{\??im\??im\currentmarginline#1}{#2}}
+\def\marginlineparameter#1{\csname\??im\??im\currentmarginline#1\endcsname}
+
+\def\marginlineexecuter#1#2%
+ {\dostarttagged\t!margintext\currentmarginline
+ \executeifdefined{\??im\??im\currentmarginline#1}{#2}%
+ \dostoptagged}
-\def\dohandlemarginline#1% #2
+\def\dohandlemarginline#1%#2%
{\def\currentmarginline{#1}%
- \csname\s!do\??im\??im\executeifdefined{\??im\??im#1\c!location}\v!left\endcsname{#1}} % {#2}
+ \csname\s!do\??im\??im\executeifdefined{\??im\??im#1\c!location}\v!left\endcsname{#1}}% {#2}
\def\doleftmarginline#1#2% #1 is redundant (we can remove it when we group dohandlemarginline; maybe ...
{\pushindentation
@@ -182,17 +190,20 @@
%D The next bunch of macros looks messy which is due to its
%D multi-purpose character.
-\chardef\margincontentdisplacement \zerocount
-\let \margincontentdistance \!!zeropoint
-\let \margincontenthoffset \!!zeropoint
-\def \margincontentlines {1}
-\def \margincontenttag {0}
-\let \margincontentseparator \empty
-\def \margincontentstrutheight {\strutht}
+\setnewconstant\margincontentdisplacement \zerocount
+\let \margincontentdistance \!!zeropoint
+\let \margincontenthoffset \!!zeropoint
+\def \margincontentlines {1}
+\def \margincontenttag {0}
+\let \margincontentseparator \empty
+\def \margincontentstrutheight {\strutht}
\newcount\margincontentlevel
\newdimen\margincontentheight
+% \installparameterhandler \??im{inmargin}
+% \installparameterhashhandler\??im{inmargin}
+
\unexpanded\def\setupinmargin
{\dodoubleempty\dosetupinmargin}
@@ -203,10 +214,6 @@
\getparameters[\??im][#1]%
\fi}
-% \def\dodosetupinmargin[#1]#2% [settings]{class}
-% {\checkinmargin[#2]%
-% \getparameters[\??im#2][#1]}
-
\def\dodosetupinmargin[#1]#2% [settings]{class}
{\checkinmargin[#2]%
\getparameters[\??im#2][#1]%
@@ -255,7 +262,7 @@
\donothing
\doifnumberelse\margincontenttag
{\ifnum\margincontenttag>25 % to be translated
- \writestatus\m!systems{potential margin stack overflow (\margincontenttag)}%
+ \writestatus\m!system{potential margin stack overflow (\margincontenttag)}%
\fi}
\donothing
% we need to preserve {a,b,c} kind of settings
@@ -266,8 +273,10 @@
\v!no=>\let\margincontentalign\v!normal,
\v!inner=>\let\margincontentalign#1,
\v!outer=>\let\margincontentalign#2,
+ \v!flushright=>\let\margincontentalign\v!left,
\v!left=>\let\margincontentalign\v!left,
\v!middle=>\let\margincontentalign\v!middle,
+ \v!flushleft=>\let\margincontentalign\v!right,
\v!right=>\let\margincontentalign\v!right]%
\doifvaluesomething{\??im\margincontenttag\c!align} % watch {} around set
{\edef\margincontentalign{{\getvalue{\??im\margincontenttag\c!align},\margincontentalign}}}%
@@ -284,7 +293,9 @@
\@@imbefore
\dostartattributes{\??im\margincontenttag}\c!style\c!color\empty
\dosetupstrut[\margincontentstrut]% was: \setstrut % yes or no
+ \dostarttagged\t!margintextblock\currentmargincontent % margincontenttag
\begstrut#3\endstrut\endgraf
+ \dostoptagged
\xdef\margincontentstrutheight{\the\strutht}% so that it's known outside the framed
\dostopattributes
\@@imafter}%
@@ -349,8 +360,9 @@
% 2 only natural height
% 3 also stack height
-\chardef\margincontentmethod \plusthree % beware: 1 = old method
-\chardef\marginpagecheckmethod\plusone
+\setnewconstant\margincontentmethod \plusthree % beware: 1 = old method
+\setnewconstant\marginpagecheckmethod \plusone
+\setnewconstant\marginrepositionmethod\plusone
\def\margincontentextralines{1} % old method, play safe
\def\nofmargincontentlines {0}
@@ -401,14 +413,6 @@
%\hbox{\lower\strutdp\box\scratchbox}} % alas, wrong lapping, therefore useless
\dopositionmarginbox\scratchbox}
-% \def\domarginblockskip#1%
-% {\hskip\margincontenthoffset
-% \hskip\compensatedinnermakeupmargin\relax
-% \doifelsenothing\margincontentdistance
-% {\hskip\getvalue{\??im#1\c!distance}}
-% {\hskip\margincontentdistance}%
-% \relax}
-
\def\domarginblockskip#1%
{\doifelsenothing\margincontentdistance
{\hskip\dimexpr
@@ -416,7 +420,7 @@
+\compensatedinnermakeupmargin
+\csname\??im#1\c!distance\endcsname
\relax}
- {\dimexpr
+ {\hskip\dimexpr
+\margincontenthoffset
+\compensatedinnermakeupmargin
+\margincontentdistance
@@ -467,26 +471,6 @@
\edef\inmargintaglist{+,-,\v!low,\v!left,\v!right,\v!inner,\v!outer}
-% the old one:
-%
-% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
-% {\doifcommonelse{+,-,\v!laag}{#4}
-% {\dodoinmargin[#1][#2][#3][#4][#5]}
-% {\dodoinmargin[#1][#2][#3][][#4]}}
-%
-% an alternative:
-%
-% \letvalue{\??im\v!laag\c!offset}\empty
-% \letvalue{\??im +\c!offset}\empty
-% \letvalue{\??im -\c!offset}\empty
-%
-% \def\doinmargin[#1][#2][#3][#4][#5]% #6 #7
-% {\doifnumberelse{#4}
-% {\dodoinmargin[#1][#2][#3][#4][#5]}
-% {\doifdefinedelse{\??im#4\c!offset}
-% {\dodoinmargin[#1][#2][#3][#4][#5]}
-% {\dodoinmargin[#1][#2][#3][][#4]}}}
-%
% the problem is that we need to keep downward compatibility
% with respect to the first argument thing a reference or a
% directive; the alternative is to force users to pass a
@@ -608,15 +592,15 @@
{\bgroup
% old stuff, a bit tricky, but now interfaced
\edef\currentmargincontent{#1}%
- \chardef\marginrepositionmethod\executeifdefined{\??im\currentmargincontent\c!sidemethod }\plusone
- \chardef\margincontentmethod \executeifdefined{\??im\currentmargincontent\c!textmethod }\plusthree
- \chardef\marginpagecheckmethod \executeifdefined{\??im\currentmargincontent\c!splitmethod}\plusone
+ \marginrepositionmethod\executeifdefined{\??im\currentmargincontent\c!sidemethod }\plusone
+ \margincontentmethod \executeifdefined{\??im\currentmargincontent\c!textmethod }\plusthree
+ \marginpagecheckmethod \executeifdefined{\??im\currentmargincontent\c!splitmethod}\plusone
% so far
\forgetall % otherwise sidefloat problems, added 2005/07/20, maybe dangerous
\postponenotes % group is (somehow) needed
\doifinsetelse\v!low{#4}
- {\chardef\margincontentdisplacement\plusone}
- {\chardef\margincontentdisplacement\zerocount}%
+ {\margincontentdisplacement\plusone}
+ {\margincontentdisplacement\zerocount}%
\doif\v!reverse{#2}
{\swapmacros\dorightmarginblock\doleftmarginblock}%
\processaction
@@ -660,10 +644,10 @@
\def\margintitle{\margintext} % txt mark as well
\newtoks\collectedmargintexts % so .. delayed!
-\chardef\margintextcollected \zerocount
+\newconditional\margintextcollected
\def\domargincontent[#1][#2]#3% we used to check for #2/#1 being number, no longer now
- {\global\chardef\margintextcollected\plusone
+ {\global\settrue\margintextcollected
\global\let\flushmargincontents\doflushmargincontents
\edef\margincontenttag{#1}%
\ifx\margincontenttag\empty
@@ -676,11 +660,11 @@
\noexpand \doinmargin[\executeifdefined{\??im\margincontenttag\c!location}\@@imlocation][\v!normal][\margincontenttag][\margincontenttag][#2]%
\to \collectedmargintexts
\doglobal \appendtoks
- {#3}%
+ {#3}% argument to previously appended \doinmargin
\to \collectedmargintexts}
\def\doflushmargincontents % plural
- {\ifcase\margintextcollected\else
+ {\ifconditional\margintextcollected
\expandafter\flushmargincontentsindeed
\fi}
@@ -758,14 +742,14 @@
\def\resetmargincontent
{\global\margincontentlevel\zerocount
- \global\chardef\margintextcollected\zerocount
+ \global\setfalse\margintextcollected
\global\collectedmargintexts\emptytoks}
\unexpanded\def\placemargincontent
- {\ifcase\margintextcollected\else % was level check
+ {\ifconditional\margintextcollected % was level check
\bgroup
\redoconvertfont % !!
- \chardef\graphicvadjustmode\zerocount
+ %\setfalse\graphicvadjustmode % not used
\flushmargincontentsindeed
\egroup
\fi}
diff --git a/Master/texmf-dist/tex/context/base/page-mis.mkiv b/Master/texmf-dist/tex/context/base/page-mis.mkiv
index f7c3d529d1a..02083d1814e 100644
--- a/Master/texmf-dist/tex/context/base/page-mis.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-mis.mkiv
@@ -105,7 +105,7 @@
\v!middle=>\doifbothsidesoverruled\rightmarginbox\leftmarginbox\rightmarginbox,
\v!left=>\leftmarginbox,
\v!right=>\rightmarginbox,
- \s!unknown=>\setbox\preparedmarginbox\hbox{}]}
+ \s!unknown=>\setbox\preparedmarginbox\emptyhbox]}
\def\dostartmarginblock % 2 maal \vbox ivm \unvbox elders
{\global\setbox\marginbox\vtop\bgroup\vbox\bgroup
diff --git a/Master/texmf-dist/tex/context/base/page-mul.mkii b/Master/texmf-dist/tex/context/base/page-mul.mkii
index c78af074ada..801ae5d657a 100644
--- a/Master/texmf-dist/tex/context/base/page-mul.mkii
+++ b/Master/texmf-dist/tex/context/base/page-mul.mkii
@@ -1179,11 +1179,11 @@
\egroup}
\def\multicolumnseject
- {\ifdim\pagetotal>\textheight
- \eject % new
- \else
+ {%\ifdim\pagetotal>\textheight
+ % \eject % new, but wrong as fails on mixed-001.tex (wrong pagetotal at this point)
+ %\else
\allowbreak
- \fi}
+ }%\fi}
%D The multicolumn mechanism is incorporated in a \CONTEXT\
%D interface, which acts like:
diff --git a/Master/texmf-dist/tex/context/base/page-mul.mkiv b/Master/texmf-dist/tex/context/base/page-mul.mkiv
index 88ec7a5e7be..581ba5a598a 100644
--- a/Master/texmf-dist/tex/context/base/page-mul.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-mul.mkiv
@@ -358,8 +358,7 @@
\newdimen\mcscratchdimen
\newcount\nofcolumnlines
-\chardef\multicolumnlinemethod\zerocount % 0: overshoot (old default), 1: tight
-% \chardef\multicolumnlinemethod\plusone
+\newconstant\multicolumnlinemethod % 0: overshoot (old default), 1: tight
\def\getmulticolumnlines
{\mcscratchdimen-\columntextoffset
@@ -443,12 +442,14 @@
\vskip-\struttotal
\fi
\global\savedpagetotal\pagetotal
- \global\singlecolumnout\output
+ \global\singlecolumnout\output % hm
%\global\output{\global\setbox\precolumnbox\vbox{\unvbox\normalpagebox}}%
- \global\output{\global\setbox\precolumnbox\vbox{\dotopinsertions\unvbox\normalpagebox}}%
+ %\global\output{\global\setbox\precolumnbox\vbox{\dotopinsertions\unvbox\normalpagebox}}%
+ \setoutputroutine{\global\setbox\precolumnbox\vbox{\dotopinsertions\unvbox\normalpagebox}}%
\eject % no \holdinginserts=1, can make footnote disappear !
\global\precolumnboxheight\ht\precolumnbox
- \global\output{\continuousmulticolumnsout}%
+ %\global\output{\continuousmulticolumnsout}%
+ \setoutputroutine{\continuousmulticolumnsout}%
\setcolumnfloats
\dohandleallcolumns
{\global\setbox\currenttopcolumnbox\emptybox}%
@@ -475,7 +476,7 @@
%D e.g. when there is no text given between \type{\begin..}
%D and \type{\end..}. The \type{\par} is needed!
-\chardef\multicolumnendsyncmethod\plusone % 1: old sync 2: new sync (cont-loc/project) / may fail ! ! ! !
+\setnewconstant\multicolumnendsyncmethod\plusone % 1: old sync 2: new sync (cont-loc/project) / may fail ! ! ! !
\def\endmulticolumns
{%\par
@@ -493,17 +494,21 @@
\par
\ifbalancecolumns
\ifnum\multicolumnendsyncmethod=\plusone
- \global\output{\continuousmulticolumnsout}%
+ %\global\output{\continuousmulticolumnsout}%
+ \setoutputroutine{\continuousmulticolumnsout}%
\goodbreak
\fi
- \global\output{\balancedmulticolumnsout}%
+ %\global\output{\balancedmulticolumnsout}%
+ \setoutputroutine{\balancedmulticolumnsout}%
\else
\goodbreak
\fi
\eject % the prevdepth is important, try e.g. toclist in
\prevdepth\zeropoint % columns before some noncolumned text text
- \global\output\singlecolumnout
- \global\output{\the\mainoutput}% % % % % todo
+ %\global\output\singlecolumnout
+ \setoutputroutine{\singlecolumnout}%
+ %\global\output{\the\mainoutput}% % % % % todo
+ \setoutputroutine{\the\mainoutput}% % % % % todo
\ifvoid\precolumnbox\else
\unvbox\precolumnbox
\fi
@@ -569,8 +574,8 @@
\edef\maxcolumndepth{\the\dp\currentcolumnbox}%
\fi}}
-\chardef\multicolumntopflushmethod\plusone % 0: no correction, 1: correction when topstuff, 2: correction, 3: correction++
-\chardef\multicolumntopalignmethod\plustwo % 0: nothing, 1: force grid, 2: follow grid
+\setnewconstant\multicolumntopflushmethod\plusone % 0: no correction, 1: correction when topstuff, 2: correction, 3: correction++
+\setnewconstant\multicolumntopalignmethod\plustwo % 0: nothing, 1: force grid, 2: follow grid
\def\flushprecolumnboxnogrid
{\unvbox\precolumnbox}
@@ -599,6 +604,8 @@
\setmaxcolumndimensions
\dohandleallcolumns
{\mkprocesscolumncontents\currentcolumnbox}%
+ \dohandleallcolumns
+ {\docolumnpagebodymarks\plusone\nofcolumns\mofcolumns\currentcolumnbox}%
\postprocesscolumns
\dohandleallcolumns % \hbox i.v.m. \showcomposition
{\global\setbox\currentcolumnbox\hbox to \localcolumnwidth
@@ -1022,30 +1029,27 @@
\dontshowcomposition
\widowpenalty\zerocount
\setbox0\vbox{\unvbox\normalpagebox}%
-\ifdim\ht0>\openlineheight % at least one line
- \ifnum\minbalancetoplines<2 % balance anyway
- \donetrue
- \else % check criterium to available lines
- \getnoflines{\ht0}%
- \divide\noflines \nofcolumns \relax
- \ifnum\noflines<\minbalancetoplines \relax
- \dimen0\ht0
- \advance\dimen0 \ht\firsttopcolumnbox
- \advance\dimen0 \openlineheight \relax % let's play safe
- \ifdim\dimen0>\columntextheight % column exceeding text height
- \donetrue
- \else % it seems to fit
- \donefalse
- \fi
- \else % balance indeed
- \donetrue
- \fi
+ \ifdim\ht0>\openlineheight % at least one line
+ \ifnum\minbalancetoplines<2 % balance anyway
+ \donetrue
+ \else % check criterium to available lines
+ \getnoflines{\ht0}%
+ \divide\noflines \nofcolumns \relax
+ \ifnum\noflines<\minbalancetoplines \relax
+ % let's play safe
+ \ifdim\dimexpr\ht0+\ht\firsttopcolumnbox+\openlineheight\relax>\columntextheight
+ \donetrue % column exceeding text height
+ \else
+ \donefalse % it seems to fit
+ \fi
+ \else % balance indeed
+ \donetrue
+ \fi
+ \fi
+ \else % balancing does not make sense
+ \donefalse
\fi
-\else % balancing does not make sense
- \donefalse
-\fi
-\ifdone % start balancing
- %\ifdim\ht0>\openlineheight
+ \ifdone % start balancing, was: \ifdim\ht0>\openlineheight
\dimen0\ht0
\advance\dimen0 \topskip
\advance\dimen0 -\baselineskip
@@ -1160,18 +1164,19 @@
\showmessage\m!columns{10}\empty
\global\setbox\firstcolumnbox\vbox{\unvbox0}%
\fi
- \global\output{\balancingerror}%
+ %\global\output{\balancingerror}%
+ \setoutputroutine{\balancingerror}%
\b@selinebottomtrue % forces depth in separation rule
\flushcolumnedpage\plusone
\multicolumnseject
\egroup}
\def\multicolumnseject
- {\ifdim\pagetotal>\textheight
- \eject % new
- \else
+ {%\ifdim\pagetotal>\textheight
+ % \eject % new, but wrong as fails on mixed-001.tex (wrong pagetotal at this point)
+ %\else
\allowbreak
- \fi}
+ }%\fi}
%D The multicolumn mechanism is incorporated in a \CONTEXT\
%D interface, which acts like:
@@ -1251,9 +1256,17 @@
\def\OTRMULdotopinsertions {\ifconditional\onlylocalcolumnfloats\relax \else\OTRONEdotopinsertions \fi}
\def\OTRMULdoflushfloats {\ifconditional\onlylocalcolumnfloats\doflushcolumnfloats\else\OTRONEdoflushfloats \fi}
+\newtoks\everylocalcolumnfloatspar
+
+\everylocalcolumnfloatspar
+ {\flushnotes
+ \flushcolumnfloat
+ % \flushmargincontents
+ \checkindentation}
+
\def\setlocalcolumnfloats
{\settrue\onlylocalcolumnfloats
- \everypar{\flushnotes\flushcolumnfloat\flushmargincontents\checkindentation}%
+ \everypar\everylocalcolumnfloatspar
\let\flushcolumnfloat\doflushcolumnfloat
\let\flushcolumnfloats\doflushcolumnfloats}
@@ -1326,7 +1339,7 @@
\else
\bgroup
\getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\%
- \dofloatsgetinfo{text}%
+ \dofloatsgetinfo\s!text
\setbox\scratchbox\vbox % tricky met objecten ?
{\blank[\@@bkspacebefore]
\snaptogrid\vbox{\vskip\floatheight}}% copy?
@@ -1356,7 +1369,7 @@
\let\doflushcolumnfloat\relax
\getcolumnstatus\column\mofcolumns\total\dimen0\goal\dimen2\\%
\ifdim\dimen0>\zeropoint
- \dofloatsgetinfo{text}%
+ \dofloatsgetinfo\s!text
\ifdim\floatwidth>\hsize
% dropped ?
\else
@@ -1368,7 +1381,7 @@
\ifnum\mofcolumns<\nofcolumns
\advance\mofcolumns \plusone
\ifdim\ht\currenttopcolumnbox=\zeropoint
- \dofloatsflush{text}{1}%
+ \dofloatsflush\s!text{1}%
\global\setbox\currenttopcolumnbox\vbox
{\snaptogrid\vbox{\box\floatbox}
\whitespace % nodig ?
@@ -1392,7 +1405,7 @@
\blank[\@@bkspacebefore]
\nobreak
\fi
- \dofloatsflush{text}{1}%
+ \dofloatsflush\s!text{1}%
\flushfloatbox
\blank[\@@bkspaceafter]
\fi
@@ -1415,7 +1428,6 @@
%D When handling lots of (small) floats spacing can get worse
%D because of lining out the columns.
-
\def\doflushcolumnfloats
{\ifpostponecolumnfloats\else
\bgroup
@@ -1434,7 +1446,7 @@
\whitespace % nodig ?
\blank[\@@bkspaceafter]}%
\else
- \dofloatsgetinfo{text}%
+ \dofloatsgetinfo\s!text
\ifdim\floatwidth>\hsize
\dimen0\dimexpr\floatwidth+\intercolumnwidth+.5pt\relax
\dimen2\dimexpr\hsize +\intercolumnwidth+.5pt\relax
@@ -1445,7 +1457,7 @@
\count0\zerocount
\else
\dimen0\dimexpr\count0\hsize+\count0\intercolumnwidth-\intercolumnwidth\relax
- \dofloatsflush{text}{1}%
+ \dofloatsflush\s!text{1}%
\ifdim\floatwidth>\finalcolumntextwidth % better somewhere else too
\global\setbox\floatbox\hbox to \finalcolumntextwidth{\hss\box\floatbox\hss}%
\fi % otherwise the graphic may disappear
@@ -1458,7 +1470,7 @@
\fi
\showmessage\m!columns{13}\empty
\else
- \dofloatsflush{text}{1}%
+ \dofloatsflush\s!text{1}%
\ifdim\floatwidth>\finalcolumntextwidth % better somewhere else too
\global\setbox\floatbox\hbox to \finalcolumntextwidth{\hss\box\floatbox\hss}%
\fi % otherwise the graphic may disappear
diff --git a/Master/texmf-dist/tex/context/base/page-one.mkiv b/Master/texmf-dist/tex/context/base/page-one.mkiv
index bbd35181e7b..babaf4f5ddb 100644
--- a/Master/texmf-dist/tex/context/base/page-one.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-one.mkiv
@@ -59,8 +59,6 @@
\fi
\fi}
-\chardef\kindofpagetextareas=2 % whole page (public variable! never change)
-
% can we avoind the extra vboxing here?
\def\OTRONEregisteredtextarea#1%
@@ -72,15 +70,13 @@
#1%
\fi}
-% \chardef\kindofpagetextareas\plusone
-
\def\doOTRONEregisteredtextareaA#1%
{\ifregistertextareas
\xypos{pbd:\realfolio:b}% we could save bytes by only saving the y
\endgraf
\begingroup
\scratchdimen\dimexpr\MPy{pbd:\realfolio:b}-\MPy{pbd:\realfolio:e}\relax
- \setbox\scratchbox\null
+ \setbox\scratchbox\emptyhbox
\wd\scratchbox\makeupwidth
\ht\scratchbox\scratchdimen
\vsmash{\registeredtextarea00\scratchbox}%
@@ -104,6 +100,10 @@
\let\OTRONEregisteredtextareaA\firstofoneargument
\let\OTRONEregisteredtextareaB\firstofoneargument
+% 1 = partial page, 2 = whole page, 3 = partial page
+
+\setnewconstant\kindofpagetextareas\plustwo
+
\def\OTRONEdopagecontents#1#2% \box<n> \unvbox<n>
{\bgroup % niet breedte zetten, kan fractie zijn!
\ifcase\kindofpagetextareas
@@ -285,7 +285,7 @@
\fi
\fi}
-\chardef\topinserttopskipmode=0 % 1 no topskip
+\newconstant\topinserttopskipmode % 1 = no topskip
\def\OTRONEdotopinsertions
{\ifvoid\topins\else
@@ -343,15 +343,15 @@
{\ifsomefloatwaiting
\ifpackflushedfloats
\centerfloatboxfalse % not needed as we do call directly
- \dofloatscollect{text}{\hsize}{1em}%
+ \dofloatscollect\s!text{\hsize}{1em}%
\OTRONEsetvsize
\global\setbox\floatbox\hbox to \hsize
{\hfil
\dorecurse\nofcollectedfloats
{\ifcase\columndirection % nog document wide
- \dofloatsflush{text}{1}%
+ \dofloatsflush\s!text{1}%
\else
- \dofloatsflushn{text}{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}%
+ \dofloatsflushn\s!text{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}%
\fi
\ifdim\wd\floatbox>\makeupwidth % \hsize
\hbox to \makeupwidth{\hss\box\floatbox\hss}%
@@ -433,7 +433,7 @@
% [before force] \input thuan
% \placefigure[force]{force}{\framed[height=8cm,width=8cm]{}}}
-\chardef\fixedfloatmethod=3
+\setnewconstant\fixedfloatmethod\plusthree
% \def\OTRONEsomefixdfloat % [#1]
% {\docheckiffloatfits
@@ -490,9 +490,11 @@
\doifinset\v!tall{#1}\flushsidefloatsafterpar
\fi}
-\def\OTRONEsomepagefloat [#1]{\dofloatssavepagefloat{page} {#1}}
-\def\OTRONEsomeleftpagefloat [#1]{\dofloatssavepagefloat{leftpage} {#1}}
-\def\OTRONEsomerightpagefloat[#1]{\dofloatssavepagefloat{rightpage}{#1}}
+\def\OTRONEsomepagefloat [#1]{\dofloatssavepagefloat {\s!page} {#1}}
+\def\OTRONEsomeleftpagefloat [#1]{\dofloatssavepagefloat {\s!leftpage} {#1}}
+\def\OTRONEsomerightpagefloat[#1]{\dofloatssavepagefloat {\s!rightpage}{#1}}
+
+%def\OTRONEsomesoemwherefloat[#1]{\dofloatssavesomewherefloat{\s!somewhere}{#1}}
\def\OTRONEsometopsfloat[#1]%
{\ifdim\topinserted=\zeropoint
diff --git a/Master/texmf-dist/tex/context/base/page-par.mkiv b/Master/texmf-dist/tex/context/base/page-par.mkiv
index fb8631eec83..c687c424dbf 100644
--- a/Master/texmf-dist/tex/context/base/page-par.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-par.mkiv
@@ -38,11 +38,13 @@
\kern\@@phdistance}}
\def\doshowparagraphnumberA
- {\ifprocessingverbatim
- \iflinepar\dodoshowparagraphnumber\fi
- \else
+ {%\ifprocessingverbatim
+ % \iflinepar
+ % % obsolete: \dodoshowparagraphnumber
+ % \fi
+ %\else
\dodoshowparagraphnumber
- \fi}
+ }%\fi}
\def\doshowparagraphnumberB
{\ifnumberinglines
diff --git a/Master/texmf-dist/tex/context/base/page-plg.mkiv b/Master/texmf-dist/tex/context/base/page-plg.mkiv
index 7d7612153d7..83c3e77f114 100644
--- a/Master/texmf-dist/tex/context/base/page-plg.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-plg.mkiv
@@ -190,7 +190,7 @@
% {\long\setvalue{\??ly\c!method:#1}{#2}}
\long\unexpanded\def\startpagelayout
- {\bgroup\catcode`\^^M=\@@ignore\dostartpagelayout}
+ {\bgroup\catcode\endoflineasciicode\ignorecatcode\dostartpagelayout}
\long\def\dostartpagelayout[#1]#2\stoppagelayout
{\egroup\long\setvalue{\??ly\c!method:#1}{#2}}
diff --git a/Master/texmf-dist/tex/context/base/page-run.mkiv b/Master/texmf-dist/tex/context/base/page-run.mkiv
index ae5af81e94c..cce746c742f 100644
--- a/Master/texmf-dist/tex/context/base/page-run.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-run.mkiv
@@ -22,28 +22,28 @@
{\forgetall
\dontcomplain
\globaldefs\minusone
- \dimen0\pagegoal
+ \dimen\zerocount\pagegoal
\definepapersize[X][\c!width=4em, \c!height=6em]%
\definepapersize[Y][\c!width=12em,\c!height=14em]%
\setuppapersize[#1,X][#2,Y]%
\setuplayout[#3]%
- \setbox0\vbox
+ \setbox\zerocount\vbox
{\framed
[\c!offset=\v!overlay,\c!strut=\v!no,
\c!width=\paperwidth,\c!height=\paperheight]
{\ss ABC\par DEF}}%
\doublesidedfalse
\def\cutmarklength{.5em}%
- \addpagecutmarks0%
- \replicatepagebox0%
- \scalepagebox0%
- \mirrorpaperbox0%
- \orientpaperbox0%
- \centerpagebox0%
- \mirrorprintbox0%
- \orientprintbox0%
- \offsetprintbox0%
- \pagegoal\dimen0
+ \addpagecutmarks \zerocount
+ \replicatepagebox\zerocount
+ \scalepagebox \zerocount
+ \mirrorpaperbox \zerocount
+ \orientpaperbox \zerocount
+ \centerpagebox \zerocount
+ \mirrorprintbox \zerocount
+ \orientprintbox \zerocount
+ \offsetprintbox \zerocount
+ \pagegoal\dimen\zerocount
\box0}}
\gdef\showprint
@@ -88,7 +88,151 @@
% {\toonprint[][gespiegeld][plaats=midden]} {\strut\break\type{gespiegeld}}
% {\toonprint[gespiegeld][gespiegeld][plaats=midden]} {\type{gespiegeld}\break\type{gespiegeld}}
% \stopcombinatie
-
+
+% maybe we will have page-run.lua
+
+\startluacode
+local function todimen(name,unit,fmt)
+ return number.todimen(tex.dimen[name],unit,fmt)
+end
+
+local function showdimension(name)
+ context.NC()
+ context.tex(interfaces.interfacedcommand(name))
+ context.NC()
+ context(todimen(name,"pt","%0.4fpt"))
+ context.NC()
+ context(todimen(name,"cm","%0.4fcm"))
+ context.NC()
+ context(todimen(name,"bp","%0.4fbp"))
+ context.NC()
+ context(todimen(name,"dd","%0.4fdd"))
+ context.NC()
+ context.NR()
+end
+
+local function showmacro(name)
+ context.NC()
+ context.tex(interfaces.interfacedcommand(name))
+ context.NC()
+ context.getvalue(name)
+ context.NC()
+ context.NR()
+end
+
+local function reportdimension(name)
+ commands.writestatus("layout",string.format("%-24s %12s %12s %12s %12s",
+ interfaces.interfacedcommand(name),
+ todimen(name,"pt","%0.4fpt"),
+ todimen(name,"cm","%0.4fcm"),
+ todimen(name,"bp","%0.4fbp"),
+ todimen(name,"dd","%0.4fdd")
+ ))
+end
+
+function commands.showlayoutvariables()
+
+ if tex.count.textlevel == 0 then
+
+ -- especially for Luigi:
+
+ reportdimension("paperheight")
+ reportdimension("paperwidth")
+ reportdimension("printpaperheight")
+ reportdimension("printpaperwidth")
+ reportdimension("topspace")
+ reportdimension("backspace")
+ reportdimension("makeupheight")
+ reportdimension("makeupwidth")
+ reportdimension("topheight")
+ reportdimension("topdistance")
+ reportdimension("headerheight")
+ reportdimension("headerdistance")
+ reportdimension("textheight")
+ reportdimension("footerdistance")
+ reportdimension("footerheight")
+ reportdimension("bottomdistance")
+ reportdimension("bottomheight")
+ reportdimension("leftedgewidth")
+ reportdimension("leftedgedistance")
+ reportdimension("leftmarginwidth")
+ reportdimension("leftmargindistance")
+ reportdimension("textwidth")
+ reportdimension("rightmargindistance")
+ reportdimension("rightmarginwidth")
+ reportdimension("rightedgedistance")
+ reportdimension("rightedgewidth")
+ reportdimension("bodyfontsize")
+ reportdimension("lineheight")
+
+ else
+
+ context.starttabulate { "|l|Tr|Tr|Tr|Tr|" }
+
+ showdimension("paperheight")
+ showdimension("paperwidth")
+ showdimension("printpaperheight")
+ showdimension("printpaperwidth")
+ showdimension("topspace")
+ showdimension("backspace")
+ showdimension("makeupheight")
+ showdimension("makeupwidth")
+ showdimension("topheight")
+ showdimension("topdistance")
+ showdimension("headerheight")
+ showdimension("headerdistance")
+ showdimension("textheight")
+ showdimension("footerdistance")
+ showdimension("footerheight")
+ showdimension("bottomdistance")
+ showdimension("bottomheight")
+ showdimension("leftedgewidth")
+ showdimension("leftedgedistance")
+ showdimension("leftmarginwidth")
+ showdimension("leftmargindistance")
+ showdimension("textwidth")
+ showdimension("rightmargindistance")
+ showdimension("rightmarginwidth")
+ showdimension("rightedgedistance")
+ showdimension("rightedgewidth")
+ context.NR()
+ showdimension("bodyfontsize")
+ showdimension("lineheight")
+ context.NR()
+ showmacro("strutheightfactor")
+ showmacro("strutdepthfactor")
+ showmacro("topskipfactor")
+ showmacro("maxdepthfactor")
+
+ context.stoptabulate()
+
+ end
+
+end
+
+function commands.showlayout()
+
+ if tex.count.textlevel == 0 then
+
+ commands.showlayoutvariables()
+
+ else
+
+ context.page()
+ context.bgroup()
+ context.showframe()
+ context.setuplayout { marking = interfaces.variables.on }
+ for i=1,4 do
+ commands.showlayoutvariables()
+ context.page()
+ end
+ context.egroup()
+
+ end
+
+end
+\stopluacode
+
\gdef\doshowframe[#1][#2]%
{\ifsecondargument
\setupbackgrounds
@@ -112,7 +256,9 @@
[#1]
\else
\showframe
- [\v!header,\v!text,\v!footer]
+ [\v!top,\v!header,
+ \v!text,
+ \v!footer,\v!bottom]
[\v!leftedge,\v!leftmargin,
\v!text,
\v!rightmargin,\v!rightedge]
@@ -120,254 +266,14 @@
\setupbackgrounds
[\c!state=\v!repeat]}
-\gdef\showframe{\dodoubleempty\doshowframe}
-
-\gdef\showsetupA#1#2%
- {#1&\PtToCm{\the#2}&\the#2&\tttf\string#2\cr}
-
-\gdef\showsetupB#1#2#3%
- {#1&&#2#3&\tttf\string#3\cr}
-
-% \startinterface english % english is fallback
-
-\gdef\showsetups
- {\noindent
- \vbox
- {\forgetall
- \dontcomplain
- \switchtobodyfont[\v!small]
- \tabskip\zeropoint
- \halign
- {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
- \showsetupA{paperheight} \paperheight
- \showsetupA{paperwidth} \paperwidth
- \showsetupA{printpaperheight} \printpaperheight
- \showsetupA{printpaperwidth} \printpaperwidth
- \showsetupA{topspace} \topspace
- \showsetupA{backspace} \backspace
- \showsetupA{height} \makeupheight
- \showsetupA{width} \makeupwidth
- \showsetupA{top} \topheight
- \showsetupA{topdistance} \topdistance
- \showsetupA{header} \headerheight
- \showsetupA{headerdistance} \headerdistance
- \showsetupA{textheight} \textheight
- \showsetupA{footerdistance} \footerdistance
- \showsetupA{footer} \footerheight
- \showsetupA{bottomdistance} \bottomdistance
- \showsetupA{bottom} \bottomheight
- \showsetupA{leftedge} \leftedgewidth
- \showsetupA{leftedgedistance} \leftedgedistance
- \showsetupA{leftmargin} \leftmarginwidth
- \showsetupA{leftmargindistance} \leftmargindistance
- \showsetupA{textwidth} \textwidth
- \showsetupA{rightmargindistance}\rightmargindistance
- \showsetupA{rightmargin} \rightmarginwidth
- \showsetupA{rightedgedistance} \rightedgedistance
- \showsetupA{rightedge} \rightedgewidth
- \showsetupB{bodyfontsize} \the \globalbodyfontsize
- \showsetupB{line} \relax \normallineheight
- \showsetupB{height} \relax \strutheightfactor
- \showsetupB{depth} \relax \strutdepthfactor
- \showsetupB{topskip} \relax \topskipfactor
- \showsetupB{maxdepth} \relax \maxdepthfactor}}}
-
-% \stopinterface
-
-\startinterface dutch
+\gdef\showframe
+ {\dodoubleempty\doshowframe}
\gdef\showsetups
- {\noindent
- \vbox
- {\forgetall
- \dontcomplain
- \switchtobodyfont[\v!small]
- \tabskip\zeropoint
- \halign
- {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
- \showsetupA{papierhoogte} \papierhoogte
- \showsetupA{papierbreedte} \papierbreedte
- \showsetupA{printpapierhoogte} \printpapierhoogte
- \showsetupA{printpapierbreedte} \printpapierbreedte
- \showsetupA{kopwit} \kopwit
- \showsetupA{rugwit} \rugwit
- \showsetupA{snijwit} \snijwit
- \showsetupA{hoogte} \zethoogte
- \showsetupA{breedte} \zetbreedte
- \showsetupA{boven} \bovenhoogte
- \showsetupA{bovenafstand} \bovenafstand
- \showsetupA{hoofd} \hoofdhoogte
- \showsetupA{hoofdafstand} \hoofdafstand
- \showsetupA{teksthoogte} \teksthoogte
- \showsetupA{voetafstand} \voetafstand
- \showsetupA{voet} \voethoogte
- \showsetupA{onderafstand} \onderafstand
- \showsetupA{onder} \onderhoogte
- \showsetupA{linkerrand} \linkerrandbreedte
- \showsetupA{linkerrandafstand} \linkerrandafstand
- \showsetupA{linkermarge} \linkermargebreedte
- \showsetupA{linkermargeafstand} \linkermargeafstand
- \showsetupA{tekstbreedte} \tekstbreedte
- \showsetupA{rechtermargeafstand}\rechtermargeafstand
- \showsetupA{rechtermarge} \rechtermargebreedte
- \showsetupA{rechterrandafstand} \rechterrandafstand
- \showsetupA{rechterrand} \rechterrandbreedte
- \showsetupB{korps} \the \globalbodyfontsize
- \showsetupB{regel} \relax \normallineheight
- \showsetupB{hoogte} \relax \strutheightfactor
- \showsetupB{diepte} \relax \strutdepthfactor
- \showsetupB{boven} \relax \topskipfactor
- \showsetupB{onder} \relax \maxdepthfactor}}}
-
-\stopinterface
-
-% todo: \showsetupA{rugwit} \rugwit
-
-\startinterface german
-
-\gdef\showsetups%
- {\noindent
- \vbox
- {\forgetall
- \dontcomplain
- \switchtobodyfont[\v!small]
- \tabskip\zeropoint
- \halign
- {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
- \showsetupA{papierhoehe} \papierhoehe
- \showsetupA{papierbreite} \papierbreite
- \showsetupA{printpapierhoehe} \printpapierhoehe
- \showsetupA{printpapierbreite} \printpapierbreite
- \showsetupA{kopfweite} \kopfweite
- \showsetupA{rumpfweite} \rumpfweite
- \showsetupA{hoehe} \satzhoehe
- \showsetupA{breite} \satzbreite
- \showsetupA{oben} \hoeheoben
- \showsetupA{abstandoben} \abstandoben
- \showsetupA{kopfzeile} \kopfzeilenhoehe
- \showsetupA{kopfzeilenabstand} \kopfzeilenabstand
- \showsetupA{texthoehe} \texthoehe
- \showsetupA{fusszeileabstand} \fusszeileabstand
- \showsetupA{fusszeilen} \fusszeilenhoehe
- \showsetupA{abstandunten} \abstandunten
- \showsetupA{hoeheunten} \hoeheunten
- \showsetupA{linkerrand} \breitelinkerrand
- \showsetupA{abstandlinkerrand} \abstandlinkerrand
- \showsetupA{linkemarginal} \linkemarginalbreite
- \showsetupA{linkemarginalafstand} \linkemarginalafstand
- \showsetupA{textbreite} \textbreite
- \showsetupA{rechtemarginalafstand}\rechtemarginalafstand
- \showsetupA{rechtemarginal} \rechtemarginalbreite
- \showsetupA{abstandrechterrand} \abstandrechterrand
- \showsetupA{rechterrand} \breiterechterrand
- \showsetupB{fliesstext} \the \globalbodyfontsize
- \showsetupB{linie} \relax \normallineheight
- \showsetupB{hoehe} \relax \strutheightfactor
- \showsetupB{tiefe} \relax \strutdepthfactor
- \showsetupB{topskip} \relax \topskipfactor
- \showsetupB{maxdepth} \relax \maxdepthfactor}}}
-
-\stopinterface
-
-\startinterface czech
-
-\gdef\showsetups%
- {\noindent
- \vbox
- {\forgetall
- \dontcomplain
- \switchtobodyfont[\v!small]
- \tabskip\zeropoint
- \halign
- {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
- \showsetupA{vyskapapiru} \vyskapapiru
- \showsetupA{sirkapapiru} \sirkapapiru
- \showsetupA{vyskatiskpapiru} \vyskatiskpapiru
- \showsetupA{sirkatiskpapiru} \sirkatiskpapiru
- \showsetupA{hornimezera} \hornimezera
- \showsetupA{spodnimezera} \spodnimezera
- \showsetupA{vyska} \vyskasazby
- \showsetupA{breite} \sirkasazby
- \showsetupA{vyskatextu} \vyskatextu
- \showsetupA{sirkatextu} \sirkatextu
- \showsetupA{horejsek} \vyskahorejsku
- \showsetupA{vzdalenosthorejsku} \vzdalenosthorejsku
- \showsetupA{zahlavi} \vyskazahlavi
- \showsetupA{vzdalenostzahlavi} \vzdalenostzahlavi
- \showsetupA{fusszeileabstand} \vzdalenostupati
- \showsetupA{upati} \vyskaupati
- \showsetupA{vzdalenostspodku} \vzdalenostspodku
- \showsetupA{spodek} \vyakaspodku
- \showsetupA{levyokraj} \sirkalevehookraje
- \showsetupA{vzdalenostlevehookraje} \vzdalenostlevehookraje
- \showsetupA{levamarginalie} \sirkalevemarginalie
- \showsetupA{vzdalenostlevemarginalie} \vzdalenostlevemarginalie
- \showsetupA{vzdalenostpravemarginalie}\vzdalenostpravemarginalie
- \showsetupA{pravamarginalie} \sirkapravemarginalie
- \showsetupA{vzdalenostpravehookraje} \vzdalenostpravehookraje
- \showsetupA{pravyokraj} \sirkapravehookraje
- \showsetupB{zakladnivelikost} \the \globalbodyfontsize
- \showsetupB{linka} \relax \normallineheight
- \showsetupB{vyska} \relax \strutheightfactor
- \showsetupB{hloubka} \relax \strutdepthfactor
- \showsetupB{topskip} \relax \topskipfactor
- \showsetupB{maxdepth} \relax \maxdepthfactor}}}
-
-\stopinterface
-
-\startinterface romanian
-
-\gdef\showsetups%
- {\noindent
- \vbox
- {\forgetall
- \dontcomplain
- \switchtobodyfont[\v!small]
- \tabskip\zeropoint
- \halign
- {\strut##\quad\hss&##\quad\hss&##\quad\hss&##\hss\cr
- \showsetupA{paperheight} \paperheight
- \showsetupA{paperwidth} \paperwidth
- \showsetupA{printpaperheight} \printpaperheight
- \showsetupA{printpaperwidth} \printpaperwidth
- \showsetupA{topspace} \topspace
- \showsetupA{backspace} \backspace
- \showsetupA{height} \makeupheight
- \showsetupA{width} \makeupwidth
- \showsetupA{top} \topheight
- \showsetupA{topdistance} \topdistance
- \showsetupA{header} \headerheight
- \showsetupA{headerdistance} \headerdistance
- \showsetupA{textheight} \textheight
- \showsetupA{footerdistance} \footerdistance
- \showsetupA{footer} \footerheight
- \showsetupA{bottomdistance} \bottomdistance
- \showsetupA{bottom} \bottomheight
- \showsetupA{leftedge} \leftedgewidth
- \showsetupA{leftedgedistance} \leftedgedistance
- \showsetupA{leftmargin} \leftmarginwidth
- \showsetupA{leftmargindistance} \leftmargindistance
- \showsetupA{textwidth} \textwidth
- \showsetupA{rightmargindistance}\rightmargindistance
- \showsetupA{rightmargin} \rightmarginwidth
- \showsetupA{rightedgedistance} \rightedgedistance
- \showsetupA{rightedge} \rightedgewidth
- \showsetupB{bodyfontsize} \the \globalbodyfontsize
- \showsetupB{line} \relax \normallineheight
- \showsetupB{height} \relax \strutheightfactor
- \showsetupB{depth} \relax \strutdepthfactor
- \showsetupB{topskip} \relax \topskipfactor
- \showsetupB{maxdepth} \relax \maxdepthfactor}}}
-
-\stopinterface
+ {\ctxcommand{showlayoutvariables()}}
\gdef\showlayout % interfereert lelijk met een \typefile er na
- {\bgroup
- \page
- \showframe
- \setuplayout[\c!marking=\v!on]
- \dorecurse{4}{\showsetups\page}
- \egroup}
+ {\ctxcommand{showlayout()}}
\gdef\showmargins
{\starttabulate
diff --git a/Master/texmf-dist/tex/context/base/page-sel.mkiv b/Master/texmf-dist/tex/context/base/page-sel.mkiv
new file mode 100644
index 00000000000..9192d143053
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/page-sel.mkiv
@@ -0,0 +1,347 @@
+%D \module
+%D [ file=page-sel, % moved from page-imp
+%D version=1998.01.15,
+%D title=\CONTEXT\ Page Macros,
+%D subtitle=Page Selection,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%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 will become runtime loaded code.
+
+\writestatus{loading}{ConTeXt Page Macros / Page Selection}
+
+\unprotect
+
+%D One can (mis)use this mechanism, in close cooperation
+%D with \PDFTEX\ to arrange pages of already produced files.
+%D
+%D \starttyping
+%D \insertpages[file.pdf][1,3][n=30,width=18cm]
+%D \stoptyping
+%D
+%D The pages are inserted in the text area, and even pages
+%D are repositioned according to the width. In this example
+%D empty pages are added after page 1 and 3.
+%D
+%D Selecting pages can be accomplished by:
+%D
+%D \starttyping
+%D \filterpages[file.pdf][1,3,5][n=30,width=18cm]
+%D \stoptyping
+%D
+%D One may pass \type {odd} or \type {even} instead of a
+%D comma separated list. A third alternative is:
+%D
+%D \starttyping
+%D \copypages[file.pdf][n=30,scale=950]
+%D \stoptyping
+%D
+%D This macros inserts the page, according to the settings
+%D provided.
+
+\def\insertpages
+ {\dotripleempty\doinsertpages}
+
+\def\doinsertpages[#1][#2][#3]%
+ {\doifassignmentelse{#2}
+ {\dodoinsertpages[#1][][#2]}
+ {\dodoinsertpages[#1][#2][#3]}}
+
+\def\dodoinsertpages[#1][#2][#3]%
+ {\bgroup
+ \dontcomplain
+ \getfiguredimensions[#1]%
+ \getparameters[\??ip][\c!n=\noffigurepages,\c!width=\!!zeropoint,#3]%
+ \doifinset0{#2}{\emptyhbox\page}%
+ \dorecurse\@@ipn
+ {\dofilterpage{#1}\recurselevel
+ \doifinset\recurselevel{#2}{\emptyhbox\page}}%
+ \egroup}
+
+\def\filterpages
+ {\dotripleempty\dofilterpages}
+
+\def\dofilterpages[#1][#2][#3]% % \noffigurepages not yet supported
+ {\bgroup
+ \dontcomplain
+ \getfiguredimensions[#1]%
+ \getparameters[\??ip][\c!n=\noffigurepages,\c!width=\!!zeropoint,#3]%
+ \doifelse{#2}\v!even
+ {\dorecurse\@@ipn
+ {\ifodd\recurselevel\relax\else\dofilterpage{#1}\recurselevel\fi}}
+ {\doifelse{#2}\v!odd
+ {\dorecurse\@@ipn
+ {\ifodd\recurselevel\relax\dofilterpage{#1}\recurselevel\fi}}
+ {\def\dodocommand##1{\ifnum##1>\@@ipn\else\dofilterpage{#1}{##1}\fi}%
+ \def\docommand ##1{\dowithrange{##1}\dodocommand}%
+ \processcommalist[#2]\docommand}}%
+ \egroup}
+
+\def\dofilterpage#1#2%
+ {\hbox to \textwidth
+ {\ifdoublesided\ifdim\@@ipwidth>\zeropoint\relax\ifodd\realpageno\else
+ \hfill
+ \def\dowithfigure{\hskip-\@@ipwidth}%
+ \fi\fi\fi
+ \setbox0\hbox
+ {\externalfigure[#1][\c!page=#2,\c!height=\textheight]}%
+ \wd0\zeropoint
+ \box0}
+ \page}
+
+\def\copypages
+ {\dodoubleempty\docopypages}
+
+\def\docopypages[#1][#2]%
+ {\bgroup
+ \getfiguredimensions[#1]%
+ \getparameters[\??ip]
+ [\c!n=\noffigurepages,
+ \c!marking=\v!off,
+ \c!scale=\!!thousand,
+ \c!offset=\!!zeropoint,
+ #2]%
+ \dorecurse\@@ipn
+ {\vbox to \textheight
+ {\hsize\textwidth
+ \scratchdimen\@@ipoffset
+ \centeredbox
+ {\doifelse\@@ipmarking\v!on\cuthbox\hbox
+ {\ifdim\scratchdimen>\zeropoint\relax
+ \advance\vsize -2\scratchdimen
+ \advance\hsize -2\scratchdimen
+ \externalfigure[#1][\c!page=\recurselevel,#2,\c!scale=,\c!factor=\v!max,\c!offset=\v!overlay]%
+ \else
+ \externalfigure[#1][\c!page=\recurselevel,#2,\c!offset=\v!overlay]%
+ \fi}}}
+ \page}
+ \egroup}
+
+%D \macros
+%D {combinepages}
+%D
+%D Yet another way of postprocessing is handles by \type
+%D {\combinepages}. This macro builds a matrix of pages from a
+%D file, for example:
+%D
+%D \starttyping
+%D \setuppapersize
+%D [A4][A4] % or [A4,landscape][A4,landscape]
+%D
+%D \setuplayout
+%D [header=0pt,footer=1cm,
+%D backspace=1cm,topspace=1cm,
+%D width=middle,height=middle]
+%D
+%D \setupfootertexts
+%D [presentation---\currentdate\space---\space\pagenumber]
+%D
+%D \starttext
+%D \combinepages[slides][nx=2,ny=3,frame=on]
+%D \stoptext
+%D \stoptyping
+%D
+%D One can influence the way the pages are combined. (This
+%D will be explained some time.)
+
+\def\combinepages
+ {\dodoubleempty\docombinepages}
+
+\def\docombinepages[#1][#2]% a=perpag b=free
+ {\bgroup
+ \dontcomplain
+ \getfiguredimensions[#1]%
+ \getparameters
+ [\??ip]
+ [\c!alternative=\v!a,
+ \c!n=\noffigurepages,\c!nx=2,\c!ny=2,\c!start=1,\c!stop=\!!maxcard,
+ \c!distance=\bodyfontsize,
+ \c!bottom=\vfill,\c!top=\vss,
+ \c!left=\hss,\c!right=\hss,
+ \c!before=\page,\c!after=\page,\c!inbetween=\blank,
+ \c!frame=,\c!background=,\c!backgroundcolor=,
+ #2]%
+ \def\@@ipname{#1}%
+ \@@ipbefore
+ \expandcheckedcsname{\??ip::\c!alternative:}\@@ipalternative\v!b
+ \@@ipafter
+ \egroup}
+
+\setvalue{\??ip::\c!alternative:\v!a}%
+ {\global\combinedpagescounter\@@ipstart
+ \doloop
+ {\vbox to \textheight
+ {\hsize\textwidth % ? ?
+ \scratchdimen\@@ipdistance
+ \!!widtha \dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
+ \!!heighta\dimexpr(\vsize-\@@ipny\scratchdimen+\scratchdimen)/\@@ipny\relax
+ \dorecurse\@@ipny
+ {\hbox to \hsize
+ {\dorecurse\@@ipnx
+ {\vbox to \!!heighta
+ {\hsize\!!widtha
+ \vsize\!!heighta
+ \@@iptop
+ \hbox to \hsize
+ {\@@ipleft
+ \ifnum\combinedpagescounter>\@@ipstop\relax
+ \globallet\@@ipn\!!zerocount
+ \else\ifnum\combinedpagescounter>\@@ipn \else
+ \externalfigure[\@@ipname]
+ [\c!object=\v!no,
+ \c!page=\number\combinedpagescounter,
+ \c!factor=\v!max,
+ \c!background=\@@ipbackground,
+ \c!backgroundcolor=\@@ipbackgroundcolor,
+ \c!frame=\@@ipframe]%
+ \fi\fi
+ \@@ipright}
+ \@@ipbottom}%
+ \global\advance\combinedpagescounter\plusone
+ \hfil}%
+ \hfilneg}
+ \vfil}%
+ \vfilneg}%
+ \page
+ \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
+
+\setvalue{\??ip::\c!alternative:\v!c}%
+ {\global\combinedpagescounter\@@ipstart
+ \doloop
+ {\vbox to \textheight
+ {\hsize\textwidth % ? ?
+ \scratchdimen\@@ipdistance
+ \!!widtha \dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
+ \!!heighta\dimexpr(\vsize-\@@ipny\scratchdimen+\scratchdimen)/\@@ipny\relax
+ \hbox to \hsize
+ {\dorecurse\@@ipnx
+ {\@@ipleft
+ \vbox to \textheight
+ {\hsize\!!widtha
+ {\dorecurse\@@ipny
+ {\@@iptop
+ \hbox to \hsize
+ {\vbox to \!!heighta
+ {\hsize\!!widtha
+ \vsize\!!heighta
+ \ifnum\combinedpagescounter>\@@ipstop\relax
+ \globallet\@@ipn\!!zerocount
+ \else\ifnum\combinedpagescounter>\@@ipn \else
+ \externalfigure[\@@ipname]
+ [\c!object=\v!no,
+ \c!page=\number\combinedpagescounter,
+ \c!factor=\v!max,
+ \c!background=\@@ipbackground,
+ \c!backgroundcolor=\@@ipbackgroundcolor,
+ \c!frame=\@@ipframe]%
+ \fi\fi}}
+ \global\advance\combinedpagescounter\plusone
+ \@@ipbottom}%
+ \vfil}%
+ \vfilneg}
+ \hfil}%
+ \hfilneg}}
+ \page
+ \ifnum\combinedpagescounter>\@@ipn \exitloop\fi}}
+
+\setvalue{\??ip::\c!alternative:\v!horizontal}{\getvalue{\??ip::\c!alternative:\v!a}}
+\setvalue{\??ip::\c!alternative:\v!vertical }{\getvalue{\??ip::\c!alternative:\v!c}}
+
+\setvalue{\??ip::\c!alternative:\v!b}%
+ {\global\combinedpagescounter\@@ipstart
+ \doloop
+ {\startbaselinecorrection
+ \scratchdimen\@@ipdistance
+ \!!widtha\dimexpr(\hsize-\@@ipnx\scratchdimen+\scratchdimen)/\@@ipnx\relax
+ \hbox to \hsize
+ {\dorecurse\@@ipnx
+ {\global\advance\combinedpagescounter\plusone
+ \ifnum\combinedpagescounter>\@@ipn \else
+ \normalexpanded{\noexpand\externalfigure[\@@ipname]
+ [\c!page=\number\combinedpagescounter,
+ \c!width=\the\!!widtha,% todo \freezedimenmacro
+ \c!background=\@@ipbackground,
+ \c!backgroundcolor=\@@ipbackgroundcolor,
+ \c!frame=\@@ipframe]}%
+ \hfill
+ \fi}\hfillneg}%
+ \stopbaselinecorrection
+ \ifnum\combinedpagescounter<\@@ipn\relax
+ \@@ipinbetween
+ \else
+ \exitloop
+ \fi}}
+
+% This macro cuts a page into n parts that can be pasted
+% together.
+
+\def\slicepages
+ {\dotripleempty\doslicepages}
+
+\def\doslicepages[#1][#2][#3]%
+ {\ifthirdargument
+ \dodoslicepages[#1][#2][#3]%
+ \else
+ \dodoslicepages[#1][#2][#2]%
+ \fi}
+
+\newcounter\slicedpagenumber
+
+\def\dodoslicepages[#1][#2][#3]%
+ {\bgroup
+ \dontcomplain
+ \globallet\slicedpagenumber\!!zerocount
+ \getfiguredimensions[#1]
+ \getparameters
+ [\??ip]
+ [\c!n=1,
+ \c!offset=\!!zeropoint,
+ \c!hoffset=\!!zeropoint,\c!voffset=\!!zeropoint,
+ \c!width=\figurewidth,\c!height=\figureheight,#2]
+ \ifnum\@@ipn>\zerocount
+ \definepapersize
+ [\s!dummy][\c!height=\@@ipheight,\c!width=\@@ipwidth]
+ \setuppapersize
+ [\s!dummy][\s!dummy]
+ \setuplayout
+ [\c!backspace=\!!zeropoint,\c!topspace=\!!zeropoint,
+ \c!height=\v!middle,\c!width=\v!middle,
+ \c!textdistance=\!!zeropoint,
+ \c!header=\!!zeropoint,\c!footer=\!!zeropoint]
+ \fi
+ \dorecurse\noffigurepages
+ {\global\let\slicedpagenumber\recurselevel
+ \ifnum\@@ipn>\plusone
+ \dorecurse\@@ipn
+ {\let\xslice\recurselevel
+ \dorecurse\@@ipn
+ {\let\yslice\recurselevel
+ \clip
+ [\c!nx=\@@ipn,\c!ny=\@@ipn,\c!x=\xslice,\c!y=\yslice]
+ {\scale
+ [\c!scale=\@@ipn000]
+ {\externalfigure[#1][\c!page=\slicedpagenumber]}}
+ \page}}
+ \else
+ \ifodd\slicedpagenumber\relax
+ \getparameters[\??ip][#2]
+ \else
+ \getparameters[\??ip][#3]
+ \fi
+ \hskip\@@ipoffset
+ \clip
+ [\c!hoffset=\@@iphoffset,\c!voffset=\@@ipvoffset,
+ \c!height=\@@ipheight,\c!width=\@@ipwidth]
+ {\externalfigure[#1][\c!page=\slicedpagenumber]}
+ \page
+ \fi}
+ \egroup}
+
+% \starttext \slicepages[slice1.pdf][n=3] \stoptext
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/page-set.mkii b/Master/texmf-dist/tex/context/base/page-set.mkii
index eb01799ae8d..e4817066dc1 100644
--- a/Master/texmf-dist/tex/context/base/page-set.mkii
+++ b/Master/texmf-dist/tex/context/base/page-set.mkii
@@ -2019,6 +2019,21 @@
\def\OTRSETinhibitinserts
{\disablenotes}
+% undocumented goodie
+
+\def\definecolumnsethsize#1#2#3#4% will be improved/speed up
+ {\bgroup
+ \def\OTRSETidentifier{#1}%
+ \ifcase\columnsetlevel\relax
+ \mofcolumns\plusone
+ \OTRSETinitializecolumns
+ \OTRSETassignwidths
+ \OTRSETsethsize
+ \fi
+ \!!counta#2\!!countb#3\docalculatecolumnsetspan
+ \expandafter\egroup\expandafter\edef\expandafter
+ #4\expandafter{\the\!!widtha}}
+
% interface to footnotes
\def\OTRSETassignwidths
diff --git a/Master/texmf-dist/tex/context/base/page-set.mkiv b/Master/texmf-dist/tex/context/base/page-set.mkiv
index cc6fbb5e6d9..8c3566bc087 100644
--- a/Master/texmf-dist/tex/context/base/page-set.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-set.mkiv
@@ -133,28 +133,6 @@
%D \stoptext
%D \stoptyping
-% not ok yet, for column sets we need a special case: within a column we
-% need to bubble-up the marks; the indirectness permits overloading here
-
-\let\saveOTRSETmark \refreshsavedmark
-\let\bubbleOTRSETmark\bubblesavedmark
-\let\resetOTRSETmark \resetsavedmark
-\let\presetOTRSETmark\presetsavedmark
-
-\def\doregisterOTRSETmarks#1{\saveOTRSETmark [#1][\number\mofcolumns]}
-\def\dobubbleOTRSETmarks #1{\bubbleOTRSETmark[#1][\number\mofcolumns]}
-\def\doresetOTRSETmarks #1{\resetOTRSETmark [#1][\recurselevel]}
-\def\dopresetOTRSETmarks #1{\presetOTRSETmark[#1][\recurselevel]}
-
-\def\registerOTRSETmarks
- {\processcommacommand[\alldefinedmarks]\doregisterOTRSETmarks}
-\def\bubbleOTRSETmarks
- {\processcommacommand[\alldefinedmarks]\dobubbleOTRSETmarks}
-\def\resetOTRSETmarks
- {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\doresetOTRSETmarks}}
-\def\presetOTRSETmarks
- {\dorecurse\nofcolumns{\processcommacommand[\alldefinedmarks]\dopresetOTRSETmarks}}
-
%D test case of Vit Zika (context list):
%D
%D \starttyping
@@ -222,7 +200,7 @@
\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
%\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\box\csname\@otr@:\!!stringb:\recurselevel\endcsname
\else
- \emptybox
+ \emptyhbox
%\global\setbox\csname\@otr@:\!!stringa:\recurselevel\endcsname\emptybox
\expandafter\newbox\csname\@otr@:\!!stringb:\recurselevel\endcsname
\fi
@@ -459,6 +437,7 @@
\vss
\fi}%
\wd\scratchbox\localcolumnwidth % \textwidth
+ \docolumnpagebodymarks{#1}{#2}\recurselevel\scratchbox
\ifcase\columndirection
\hskip\OTRSETgetparameter\c!distance\recurselevel\box\scratchbox
\else
@@ -512,7 +491,6 @@
\def\OTRSETdoflush
{\ifcollectingcontent
- \registerOTRSETmarks
\global\mofcolumns\plusone
\else
\OTRSETdofinalflush
@@ -524,7 +502,6 @@
\OTRSETinitializecolumns
%\OTRSETdoflushfloats
\OTRSETstartnextpage
-\presetOTRSETmarks
\initializecolumntextareas
\fi}
@@ -590,7 +567,7 @@
\doOTRSETsetgridcells
{\copy\placeholderboxe}
\plusone\plusone\nofcolumns\scratchcounter
- \null
+ \emptybox
\fi}
\def\OTRSETsetvsize % snap per sectie (gap here?)
@@ -739,7 +716,7 @@
% 2 = a solution that works ok, is experimental and above
% all messy
-\chardef\OTRSETflushtextmode=0
+\newconstant\OTRSETflushtextmode % will be replaced
\def\OTRSETflushtextsofar
{\ifcase\OTRSETflushtextmode
@@ -861,9 +838,7 @@
{\OTRSETsetfreecells\mofcolumns\columnlastcell
\ifsomefreecolumncells
% okay
- \bubbleOTRSETmarks % not robust because we reenter
\else
- \registerOTRSETmarks % not robust because we reenter
\global\advance\mofcolumns \plusone
\ifnum\mofcolumns>\nofcolumns
\OTRSETdoflush
@@ -1148,7 +1123,7 @@
\pofcolumns \pofcolumns +\currenthcell
\columnmaxcells\preferedrow-\currentvcell{#1}}
-\chardef\OTRSETforcefixedfloats=0
+\newconstant\OTRSETforcefixedfloats
\def\OTRSETstoreincolumnslotHERE#1% fixed column
{\ifcase\OTRSETforcefixedfloats
@@ -1179,9 +1154,9 @@
\ifdim\scratchdimen<\pagegoal
%OTRSETprepareforcolumnslot3{#1}%
%ruledvskip\columnslotspacing\lineheight
- \blank[\columnslotspacing*\v!line]%
+ \blank[\number\columnslotspacing*\v!line]%
\snaptogrid\hbox to \hsize{\hss\box#1\hss}% strange, why the centering
- \blank[\columnslotspacing*\v!line]%
+ \blank[\number\columnslotspacing*\v!line]%
\else
\OTRSETstoreincolumnslotSOMEWHERE2{#1}%
\fi
@@ -1279,7 +1254,7 @@
\OTRSETsavebox{#9}%
\fi}
-\chardef\columnslotspacing \plusone
+\setnewconstant\columnslotspacing\plusone
\def\OTRSETstoreincolumnslot#1% #2 % {method} {box} % alleen last
{% no messing around here
@@ -1333,11 +1308,11 @@
\def\OTRSETsavebox#1% clean up the skips
{\OTRSETunpreparebox{#1}%
- \dofloatssave{text}}
+ \dofloatssave\s!text}
\def\OTRSETresavebox#1% clean up the skips
{\OTRSETunpreparebox{#1}%
- \dofloatsresave{text}}
+ \dofloatsresave\s!text}
\def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge
{\iftestfloatbox\ruledhbox\fi{\box\floatbox}}
@@ -1348,10 +1323,10 @@
\doloop
{\ifsomefloatwaiting
\OTRSETskipstart
- \dofloatsgetinfo{text}%
+ \dofloatsgetinfo\s!text
\ifdim\floatwidth>\zeropoint
\!!doneatrue
- \dofloatsflush{text}{1}%
+ \dofloatsflush\s!text{1}%
\dp\floatbox\zeropoint
\OTRSETstoreincolumnslot{TBLR}\floatbox
\if!!donea
@@ -1624,7 +1599,8 @@
\newcounter\columnsetlevel
\let\currentcolumnset\empty
-\chardef\OTRSETfinish\zerocount
+
+\newconditional\OTRSETfinish % never checked
\unexpanded\def\startcolumnset
{\dodoubleempty\dostartcolumnset}
@@ -1632,8 +1608,7 @@
\def\dostartcolumnset[#1][#2]%
{\increment\columnsetlevel\relax
\globallet\localcolumnmaxcells\!!zerocount
- \global\chardef\OTRSETfinish\zerocount
- \resetOTRSETmarks
+ \global\setfalse\OTRSETfinish
\ifnum\columnsetlevel=\plusone
\bgroup
\saveinterlinespace
@@ -1666,7 +1641,7 @@
{\OTRSETdoifcellelse{1}{1}
{\bgroup
\OTRSETcentergridcells
- \chardef\OTRSETbalancemethod\plusone
+ \OTRSETbalancemethod\plusone
\OTRSETreducegridbox
\global\setbox\OTRfinalpagebox\OTRSETmakegridbox
\global\ht\OTRfinalpagebox\textheight % signals output that there is content
@@ -1679,7 +1654,7 @@
{\relax
\ifnum\columnsetlevel=\plusone
\endgraf % needed, else wrong vsize in one par case
- \global\chardef\OTRSETfinish\plusone
+ \global\settrue\OTRSETfinish
% no, extra page \pagebreak % (test on pascal toc)
\dostopcolumnset
\egroup
@@ -1694,7 +1669,7 @@
\box\OTRfinalpagebox
\fi
\fi
- \global\chardef\OTRSETfinish\zerocount
+ \global\setfalse\OTRSETfinish
\ifsomefloatwaiting \setvsize \pagebreak \setvsize \fi
\OTRSETflushleftovers
\else
@@ -1702,7 +1677,7 @@
\fi
\decrement\columnsetlevel\relax}
-\chardef\OTRSETbalancemethod\zerocount
+\newconstant\OTRSETbalancemethod
\def\dostopcolumnset
{%\OTRSETdofinalflushfloats % yes/no
@@ -1761,7 +1736,6 @@
\fi
\vfill
\eject
-\registerOTRSETmarks
% brr, may result in empty page after nicely fit text
% or if left, then lost of first column only text
\ifnum\mofcolumns>\plusone
@@ -1826,15 +1800,15 @@
\getrawnoflines\textheight\xdef\columnmaxcells{\the\noflines}%
% direction
\doifelsevalue{\??mc\OTRSETidentifier\c!direction}\v!right
- {\chardef\columndirection\zerocount}
- {\chardef\columndirection\plusone}%
+ {\columndirection\zerocount}
+ {\columndirection\plusone}%
% balancing
- \chardef\OTRSETbalancemethod\zerocount
+ \OTRSETbalancemethod\zerocount
\processaction
[\getvalue{\??mc\OTRSETidentifier\c!balance}]
- [ \v!yes=>\chardef\OTRSETbalancemethod\plusone,
- \v!top=>\chardef\OTRSETbalancemethod\plustwo,
- \v!bottom=>\chardef\OTRSETbalancemethod\plusthree]}
+ [ \v!yes=>\OTRSETbalancemethod\plusone,
+ \v!top=>\OTRSETbalancemethod\plustwo,
+ \v!bottom=>\OTRSETbalancemethod\plusthree]}
% test:
%
@@ -1925,6 +1899,21 @@
\def\OTRSETinhibitinserts
{\disablenotes}
+% undocumented goodie
+
+\def\definecolumnsethsize#1#2#3#4% will be improved/speed up
+ {\bgroup
+ \def\OTRSETidentifier{#1}%
+ \ifcase\columnsetlevel\relax
+ \mofcolumns\plusone
+ \OTRSETinitializecolumns
+ \OTRSETassignwidths
+ \OTRSETsethsize
+ \fi
+ \!!counta#2\!!countb#3\docalculatecolumnsetspan
+ \expandafter\egroup\expandafter\edef\expandafter
+ #4\expandafter{\the\!!widtha}}
+
% interface to footnotes
\def\OTRSETassignwidths
@@ -2423,7 +2412,7 @@
\def\dodefinecolumnsetspan[#1][#2]%
{%\ifsecondargument
- \defineframedtext
+ \defineframedtext % we can have a parent
[cs:#1]
[\c!frame=\v!off,
\c!before=,
@@ -2477,7 +2466,7 @@
\c!depthcorrection=\v!off,
#2]%
% determine widths
- \!!countc\framedtextparameter{cs:#1}\c!n
+ \!!countc\namedframedtextparameter{cs:#1}\c!n
% \!!countd\numexpr(\nofcolumns-\mofcolumns+\plusone)%
\!!countd\nofcolumns
% n <= n of columns
@@ -2485,7 +2474,7 @@
\advance\!!countd -\mofcolumns
\advance\!!countd \plusone
% n <= n of available columns (alternative a)
- \doif{\framedtextparameter{cs:#1}\c!alternative}\v!a
+ \doif{\namedframedtextparameter{cs:#1}\c!alternative}\v!a
{\ifnum\!!countc>\!!countd \!!countc\!!countd \fi}%
% here it all starts
\setcolumnsetspanhsize\mofcolumns\!!countc % a/b used
@@ -2494,7 +2483,7 @@
\dostartframedtext[cs:#1][\v!none]% geen nils placement
% spoils spacing : \vskip-\struttotal\par\verticalstrut\par
\ifnum\columnsetlevel>\zerocount
- \framedtextparameter{cs:#1}\c!before
+ \namedframedtextparameter{cs:#1}\c!before
\fi
\unexpanded\def\stopcolumnsetspan{\dostopcolumnsetspan{#1}}}
@@ -2504,8 +2493,8 @@
\kern-2\struttotal
\verticalstrut
\ifnum\columnsetlevel>\zerocount
- \doifsomething{\framedtextparameter{cs:#1}\c!after}
- {\framedtextparameter{cs:#1}\c!after
+ \doifsomething{\namedframedtextparameter{cs:#1}\c!after}
+ {\namedframedtextparameter{cs:#1}\c!after
\kern\zeropoint}% otherwise blanks disappear, better be a switch
\else
\endgraf
@@ -2514,16 +2503,15 @@
\egroup
\setbox\scratchbox\frozenhbox to \hsize
{\dontcomplain
- \alignedline{\framedtextparameter{cs:#1}\c!location}\v!middle
- {\lower\strutdepth\box\scratchbox}}%
+ \alignedline{\namedframedtextparameter{cs:#1}\c!location}\v!middle{\lower\strutdepth\box\scratchbox}}%
\dp\scratchbox\zeropoint % else wrong snap insidefloat
%
% to be tested first (strange in grid mode)
%
% \setbox\scratchbox\frozenhbox to \hsize
% {\dontcomplain
-% \chardef\alignstrutmode\zerocount
-% \alignedline{\framedtextparameter{cs:#1}\c!plaats}\v!midden
+% \alignstrutmode\zerocount
+% \alignedline{\namedframedtextparameter{cs:#1}\c!plaats}\v!midden
% {\box\scratchbox}}%
%
\ifinsidefloat
@@ -2531,24 +2519,24 @@
\else\ifnum\columnsetlevel>\zerocount
% we only set \columnsetspacing when asked for, else bottom problems
% don't change this any more (test naw)
- \chardef\columnslotspacing\framedtextparameter{cs:#1}\c!nlines\relax
- % todo: nboven/onder & \chardef\columnslotlocation2
+ \columnslotspacing\namedframedtextparameter{cs:#1}\c!nlines\relax
+ % todo: nboven/onder
%\OTRSETstoreincolumnslotHERE\scratchbox
- \edef\floatmethod{\framedtextparameter{cs:#1}\c!default}%
+ \edef\floatmethod{\namedframedtextparameter{cs:#1}\c!default}%
\@EA\uppercasestring\floatmethod\to\floatmethod
% todo : \v!here -> here enzovoorts
\OTRSETstoreincolumnslot\floatmethod\scratchbox
% watch out: no \dochecknextindentation{tag}
- \checknextindentation[\framedtextparameter{cs:#1}\c!indentnext]%
+ \checknextindentation[\namedframedtextparameter{cs:#1}\c!indentnext]%
\else
% of course we needed a one-column fall back for tm; brrr, the box has now too
% much height (try \ruledvbox); don't change this without testing techniek
\scratchdimen\ht\scratchbox
\advance\scratchdimen-\strutdp
\ht\scratchbox\scratchdimen
- \framedtextparameter{cs:#1}\c!before
+ \namedframedtextparameter{cs:#1}\c!before
\snaptogrid\vbox{\box\scratchbox}%
- \framedtextparameter{cs:#1}\c!after
+ \namedframedtextparameter{cs:#1}\c!after
\fi\fi
\egroup
\endgraf}
diff --git a/Master/texmf-dist/tex/context/base/page-sid.mkii b/Master/texmf-dist/tex/context/base/page-sid.mkii
index 0848c9d8c4d..806acc6f133 100644
--- a/Master/texmf-dist/tex/context/base/page-sid.mkii
+++ b/Master/texmf-dist/tex/context/base/page-sid.mkii
@@ -906,7 +906,7 @@
\divide\!!counta \baselineskip
\advance\!!counta \plusone
\parskip\zeropoint
- \dorecurse\!!counta{\line{}}
+ \dorecurse\!!counta{\line{}}%
\kern-\!!counta\baselineskip
\penalty\zerocount }
diff --git a/Master/texmf-dist/tex/context/base/page-sid.mkiv b/Master/texmf-dist/tex/context/base/page-sid.mkiv
index c30204a4e68..9365f7508b5 100644
--- a/Master/texmf-dist/tex/context/base/page-sid.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-sid.mkiv
@@ -84,16 +84,16 @@
% 7 = rightedge
% 8 = cutspace
-\chardef\sidefloattype\zerocount
+\newconstant\sidefloattype
-\def\backspacefloat {\global\chardef\sidefloattype1 \putsidefloat}
-\def\leftedgefloat {\global\chardef\sidefloattype2 \putsidefloat}
-\def\leftmarginfloat {\global\chardef\sidefloattype3 \putsidefloat}
-\def\leftfloat {\global\chardef\sidefloattype4 \putsidefloat}
-\def\rightfloat {\global\chardef\sidefloattype5 \putsidefloat}
-\def\rightmarginfloat {\global\chardef\sidefloattype6 \putsidefloat}
-\def\rightedgefloat {\global\chardef\sidefloattype7 \putsidefloat}
-\def\cutspacefloat {\global\chardef\sidefloattype8 \putsidefloat}
+\def\backspacefloat {\global\sidefloattype1 \putsidefloat}
+\def\leftedgefloat {\global\sidefloattype2 \putsidefloat}
+\def\leftmarginfloat {\global\sidefloattype3 \putsidefloat}
+\def\leftfloat {\global\sidefloattype4 \putsidefloat}
+\def\rightfloat {\global\sidefloattype5 \putsidefloat}
+\def\rightmarginfloat {\global\sidefloattype6 \putsidefloat}
+\def\rightedgefloat {\global\sidefloattype7 \putsidefloat}
+\def\cutspacefloat {\global\sidefloattype8 \putsidefloat}
\let\marginfloat \cutspacefloat
@@ -474,9 +474,9 @@
\fi\fi
\else
\ifnum\sidefloattype<\plusfour
- \global\chardef\sidefloattype\plusfour
+ \global\sidefloattype\plusfour
\else\ifnum\sidefloattype>\plusfive
- \global\chardef\sidefloattype\plusfive
+ \global\sidefloattype\plusfive
\fi\fi
\fi
\previoussidefloat
@@ -770,7 +770,7 @@
\divide\!!counta \baselineskip
\advance\!!counta \plusone
\parskip\zeropoint
- \dorecurse\!!counta{\line{}}
+ \dorecurse\!!counta{\line{}}%
\kern-\!!counta\baselineskip
\penalty\zerocount }
diff --git a/Master/texmf-dist/tex/context/base/page-spr.mkiv b/Master/texmf-dist/tex/context/base/page-spr.mkiv
index 75b91dff773..fd01e584ca6 100644
--- a/Master/texmf-dist/tex/context/base/page-spr.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-spr.mkiv
@@ -20,7 +20,7 @@
\newbox\spreadbox
\newif \ifinspread
-\chardef\showspreadmode\plusone
+\setnewconstant\showspreadmode\plusone
% beware, ugly overload, to be redone
@@ -43,7 +43,7 @@
\else
% prevent duplicate writes in normal run
\ifarrangingpages \else \ifcase\showspreadmode
- \global\setbox\spreadbox\null
+ \global\setbox\spreadbox\emptyhbox
\wd\spreadbox\makeupwidth
\ht\spreadbox\textheight
\fi \fi
@@ -56,7 +56,7 @@
\def\doflushspread
{\ifinspread \ifvoid\spreadbox\else
% this page will be discarded later
- \null \page
+ \emptyhbox \page
\fi \fi }
\unexpanded\def\startspread
diff --git a/Master/texmf-dist/tex/context/base/page-str.lua b/Master/texmf-dist/tex/context/base/page-str.lua
index c4d1957c3e8..7ce0f3c0fa6 100644
--- a/Master/texmf-dist/tex/context/base/page-str.lua
+++ b/Master/texmf-dist/tex/context/base/page-str.lua
@@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['page-str'] = {
license = "see context related readme files"
}
+-- streams -> managers.streams
+
-- work in progresss .. unfinished
local concat = table.concat
@@ -13,14 +15,23 @@ local concat = table.concat
local find_tail, write_node, free_node, copy_nodelist = node.slide, node.write, node.free, node.copy_list
local vpack_nodelist, hpack_nodelist = node.vpack, node.hpack
local texdimen, texbox = tex.dimen, tex.box
+local settings_to_array = utilities.parsers.settings_to_array
+
+local nodes, node = nodes, node
-local new_kern = nodes.kern
-local new_glyph = nodes.glyph
+local nodepool = nodes.pool
+local tasks = nodes.tasks
+
+local new_kern = nodepool.kern
+local new_glyph = nodepool.glyph
local trace_collecting = false trackers.register("streams.collecting", function(v) trace_collecting = v end)
local trace_flushing = false trackers.register("streams.flushing", function(v) trace_flushing = v end)
-streams = streams or { }
+local report_streams = logs.reporter("streams")
+
+streams = streams or { } -- might move to the builders namespace
+local streams = streams
local data, name, stack = { }, nil, { }
@@ -63,7 +74,7 @@ function streams.collect(head,where)
dana[1] = head
end
if trace_collecting then
- logs.report("streams","appending snippet '%s' to slot %s",name,#dana)
+ report_streams("appending snippet '%s' to slot %s",name,#dana)
end
return nil, true
else
@@ -80,7 +91,7 @@ function streams.push(thename)
if dana then
dana[#dana+1] = false
if trace_collecting then
- logs.report("streams","pushing snippet '%s'",thename)
+ report_streams("pushing snippet '%s'",thename)
end
end
end
@@ -94,7 +105,7 @@ function streams.flush(name,copy) -- problem: we need to migrate afterwards
-- nothing to flush
elseif copy then
if trace_flushing then
- logs.report("streams","flushing copies of %s slots of '%s'",dn,name)
+ report_streams("flushing copies of %s slots of '%s'",dn,name)
end
for i=1,dn do
local di = dana[i]
@@ -107,7 +118,7 @@ function streams.flush(name,copy) -- problem: we need to migrate afterwards
end
else
if trace_flushing then
- logs.report("streams","flushing %s slots of '%s'",dn,name)
+ report_streams("flushing %s slots of '%s'",dn,name)
end
for i=1,dn do
local di = dana[i]
@@ -123,10 +134,10 @@ end
function streams.synchronize(list) -- this is an experiment !
-- we don't optimize this as we want to trace in detail
- list = aux.settings_to_array(list)
+ list = settings_to_array(list)
local max = 0
if trace_flushing then
- logs.report("streams","synchronizing list: %s",concat(list," "))
+ report_streams("synchronizing list: %s",concat(list," "))
end
for i=1,#list do
local dana = data[list[i]]
@@ -138,7 +149,7 @@ function streams.synchronize(list) -- this is an experiment !
end
end
if trace_flushing then
- logs.report("streams","maximum number of slots: %s",max)
+ report_streams("maximum number of slots: %s",max)
end
for m=1,max do
local height, depth = 0, 0
@@ -157,12 +168,12 @@ function streams.synchronize(list) -- this is an experiment !
end
dana[m] = vbox
if trace_flushing then
- logs.report("streams","slot %s of '%s' is packed to height %s and depth %s",m,name,ht,dp)
+ report_streams("slot %s of '%s' is packed to height %s and depth %s",m,name,ht,dp)
end
end
end
if trace_flushing then
- logs.report("streams","slot %s has max height %s and max depth %s",m,height,depth)
+ report_streams("slot %s has max height %s and max depth %s",m,height,depth)
end
local strutht, strutdp = texdimen.globalbodyfontstrutheight, texdimen.globalbodyfontstrutdepth
local struthtdp = strutht + strutdp
@@ -178,7 +189,7 @@ function streams.synchronize(list) -- this is an experiment !
-- actually we need to add glue and repack
vbox.height, vbox.depth = height, depth
if trace_flushing then
- logs.report("streams","slot %s of '%s' with delta (%s,%s) is compensated",m,i,delta_height,delta_depth)
+ report_streams("slot %s of '%s' with delta (%s,%s) is compensated",m,i,delta_height,delta_depth)
end
else
-- this is not yet ok as we also need to keep an eye on vertical spacing
@@ -199,7 +210,7 @@ function streams.synchronize(list) -- this is an experiment !
vbox.list = nil
free_node(vbox)
if trace_flushing then
- logs.report("streams","slot %s:%s with delta (%s,%s) is compensated by %s lines",m,i,delta_height,delta_depth,n)
+ report_streams("slot %s:%s with delta (%s,%s) is compensated by %s lines",m,i,delta_height,delta_depth,n)
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/page-str.mkii b/Master/texmf-dist/tex/context/base/page-str.mkii
index cfaebe3985b..71d76484e6e 100644
--- a/Master/texmf-dist/tex/context/base/page-str.mkii
+++ b/Master/texmf-dist/tex/context/base/page-str.mkii
@@ -325,51 +325,6 @@
\box2\vfill\page
\egroup}
- %D Although one can put floats in a stream, it sometimes makes sense
- %D to keep them apart and this is what local floats do.
-
- \def\setuplocalfloats
- {\getparameters[\??lf]}
-
- \setuplocalfloats
- [%before=\blank,
- %after=\blank,
- inbetween=\blank]
-
- \installfloathandler \v!local \somelocalfloat
-
- \initializeboxstack{localfloats}
-
- \newcounter\noflocalfloats
-
- \def\resetlocalfloats
- {\doglobal\newcounter\noflocalfloats
- \initializeboxstack{localfloats}}
-
- \def\somelocalfloat[#1]%
- {\doglobal\increment\noflocalfloats
- \savebox{localfloats}{\noflocalfloats}{\box\floatbox}}
-
- \def\getlocalfloats
- {\dorecurse\noflocalfloats
- {\ifnum\recurselevel=\plusone % 1\relax
- \getvalue{\??lf\c!before}%
- \else
- \getvalue{\??lf\c!inbetween}%
- \fi
- \dontleavehmode\hbox{\foundbox{localfloats}\recurselevel}%
- \ifnum\recurselevel=\noflocalfloats\relax
- \getvalue{\??lf\c!after}%
- \fi}}
-
- \def\flushlocalfloats
- {\getlocalfloats
- \resetlocalfloats}
-
- \def\getlocalfloat#1{\expanded{\foundbox{localfloats}{\number#1}}}
-
- \def\forcelocalfloats{\let\forcedfloatmethod\v!local}
-
%D Because many arrangements are possible, we will implement
%D some examples in a runtime loadable module \type {m-streams}.
diff --git a/Master/texmf-dist/tex/context/base/page-str.mkiv b/Master/texmf-dist/tex/context/base/page-str.mkiv
index d73643cbe67..8cce9945f26 100644
--- a/Master/texmf-dist/tex/context/base/page-str.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-str.mkiv
@@ -47,7 +47,7 @@
{\ctxlua{streams.initialize()}%
\glet\initializeoutputstreams\relax}
-\def\enableoutputstream[#1]%
+\def\enableoutputstream[#1]% could be \startoutputsubstream
{\initializeoutputstreams
\the\everyenableoutputstream
\inoutputstreamtrue
@@ -71,6 +71,16 @@
{\ctxlua{streams.stop()}%
\endgroup}
+\let\currentoutputsubstream\empty
+
+\def\startoutputsubstream[#1]%
+ {\glet\savedcurrentoutputstream\currentoutputstream
+ \enableoutputstream[#1]}
+
+\def\stopoutputsubstream
+ {\glet\currentoutputstream\savedcurrentoutputstream
+ \enableoutputstream[\savedcurrentoutputstream]}
+
\def\flushoutputstream [#1]{\ctxlua{streams.flush("#1")}}
\def\outputstreamcopy [#1]{\vbox{\ctxlua{streams.flush("#1",true)}}}
\def\outputstreambox [#1]{\vbox{\ctxlua{streams.flush("#1")}}}
diff --git a/Master/texmf-dist/tex/context/base/page-txt.mkiv b/Master/texmf-dist/tex/context/base/page-txt.mkiv
index bdc7c1bb6cd..dc516a94e33 100644
--- a/Master/texmf-dist/tex/context/base/page-txt.mkiv
+++ b/Master/texmf-dist/tex/context/base/page-txt.mkiv
@@ -172,8 +172,8 @@
{\c!rightstyle\c!rightcolor\c!rightwidth}{#3}%
{\c!rightstyle\c!rightcolor\c!rightwidth}{#3}}%
\else\ifsecondargument % new
- \letvalue{\??tk#1\v!text\c!lefttext }\empty
- \letvalue{\??tk#1\v!text\c!righttext }\empty
+ \letvalueempty{\??tk#1\v!text\c!lefttext}%
+ \letvalueempty{\??tk#1\v!text\c!righttext}%
\setvalue{\??tk#1\v!text\c!middletext}{\dosingletexts{#1}\v!text\c!style\c!color\c!width{#2}}%
\else
\dosixtupleempty\dosetuptexts[#1][\v!text ][][][][]%
@@ -305,7 +305,8 @@
\setvalue{\??tk::\v!nomarking}#1#2%
{\bgroup
\resettextlinestatus#1%
- \let\dogetmarking\nogetmarking
+ \settrue\inhibitgetmarking
+ \let\dogetmarking\nogetmarking % obsolete in new marking mechanism
\doplacelayouttextline#1#2%
\egroup}
@@ -367,19 +368,19 @@
\def\doresettextcontent[#1][#2][#3]% header text middle
{\ifthirdargument
- \letvalue{\??tk#1#2\executeifdefined{:\c!text:#3:}\c!middletext}\empty
+ \letvalueempty{\??tk#1#2\executeifdefined{:\c!text:#3:}\c!middletext}%
\else\ifsecondargument
- \letvalue{\??tk#1#2\c!lefttext }\empty
- \letvalue{\??tk#1#2\c!middletext}\empty
- \letvalue{\??tk#1#2\c!righttext }\empty
+ \letvalueempty{\??tk#1#2\c!lefttext}%
+ \letvalueempty{\??tk#1#2\c!middletext}%
+ \letvalueempty{\??tk#1#2\c!righttext}%
\fi\fi}
\let\settext \settextcontent % downward compatibility
\let\resettext\resettextcontent % downward compatibility
-\setvalue{:\c!middle:\c!text:}{\c!middletext}
-\setvalue{:\c!left :\c!text:}{\c!lefttext }
-\setvalue{:\c!right :\c!text:}{\c!righttext }
+\letvalue{:\c!middle:\c!text:}\c!middletext
+\letvalue{:\c!left :\c!text:}\c!lefttext
+\letvalue{:\c!right :\c!text:}\c!righttext
%D The next series of macros is not that easy to read,
%D because they hook into the main page building macros. By
@@ -392,12 +393,28 @@
\newbox\scratchpagebox
+% \newbox\collectedprepagecontent % only for delayed stuff
+
+% \def\flushcollectedpagecontent
+% {\ifvoid\collectedprepagecontent \else
+% \smashbox\collectedprepagecontent
+% \box\collectedprepagecontent
+% \fi}
+
+% \def\delaytillpageisflushhed#1%
+% {\global\setbox\collectedprepagecontent\hbox
+% {\ifvoid\collectedprepagecontent \else
+% \unhbox\collectedprepagecontent
+% \fi % ignore and remove not really needed
+% \ignorespaces#1\removeunwantedspaces}}
+
\def\gettextboxes
{\setbox\scratchpagebox\vbox
{\dontcomplain
\calculatereducedvsizes
\swapmargins
\offinterlineskip
+% \flushcollectedpagecontent
\vskip\dimexpr-\topheight-\topdistance\relax
\the\toptextcontent
\vskip\dimexpr\topheight+\topdistance\relax
@@ -487,79 +504,6 @@
\def\ignoredlinebreak{\unskip\space\ignorespaces}
-% \def\doplacelayouttextline#1#2%
-% {\ifdim#2>\zeropoint\relax % prevents pagenumbers when zero height
-% \goleftonpage
-% \hbox
-% {\setbox\scratchpagebox\vbox to #2
-% {\vsize#2\relax
-% \normalbaselines
-% \let\\\ignoredlinebreak
-% \let\crlf\ignoredlinebreak
-% \csname\??tk#1\c!before\endcsname
-% \doifbothsidesoverruled
-% {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\zerocount\plusone}
-% {\dodoplacelayouttextline#1\c!lefttext \c!middletext\c!righttext\zerocount\plusone}
-% {\dodoplacelayouttextline#1\c!righttext\c!middletext\c!lefttext \plusone\zerocount}%
-% \csname\??tk#1\c!after\endcsname
-% \kern\zeropoint}% keep the \dp, beware of \vtops, never change this!
-% \dp\scratchpagebox\zeropoint
-% \box\scratchpagebox}%
-% \vskip-#2\relax
-% \fi}
-%
-% \def\dodoplacelayouttextline#1#2#3#4#5#6% \hsize toegevoegd, \hss's niet meer wijzigen
-% {\hbox
-% {\ifdim\leftedgewidth>\zeropoint
-% \dododoplacelayouttextline\leftedgewidth#1\v!edge
-% {\hss\csname\??tk#1\v!edge#2\endcsname}%
-% \hskip\leftedgedistance
-% \fi
-% \ifdim\leftmarginwidth>\zeropoint
-% \dododoplacelayouttextline\leftmarginwidth#1\v!margin
-% {\hbox to \leftmarginwidth
-% {\hss\csname\??tk#1\v!margin#2\endcsname}%
-% \hskip-\leftmarginwidth
-% \hbox to \leftmarginwidth
-% {\hss\ifcase#5\or\csname\??tk#1\v!margin\c!margintext\endcsname\fi}}%
-% \hskip\leftmargindistance
-% \fi
-% \ifdim\makeupwidth>\zeropoint
-% \dododoplacelayouttextline\makeupwidth{#1}\v!text
-% {\hbox to \makeupwidth
-% {\ifcase#5\or\@@nmpre{\csname\??tk#1\v!text\c!marginedgetext\endcsname}\fi
-% \csname\??tk#1\v!text#2\endcsname\hss}%
-% \hskip-\makeupwidth
-% \hbox to \makeupwidth
-% {\hss\csname\??tk#1\v!text#3\endcsname\hss}%
-% \hskip-\makeupwidth
-% \hbox to \makeupwidth
-% {\hss\csname\??tk#1\v!text#4\endcsname
-% \ifcase#6\or\@@nmpos{\csname\??tk#1\v!text\c!marginedgetext\endcsname}\fi}}%
-% \fi
-% \ifdim\rightmarginwidth>\zeropoint
-% \hskip\rightmargindistance
-% \dododoplacelayouttextline\rightmarginwidth{#1}\v!margin
-% {\hbox to \rightmarginwidth
-% {\csname\??tk#1\v!margin#4\endcsname\hss}%
-% \hskip-\rightmarginwidth
-% \hbox to \rightmarginwidth
-% {\ifcase#6\or\csname\??tk#1\v!margin\c!margintext\endcsname\fi\hss}}%
-% \fi
-% \ifdim\rightedgewidth>\zeropoint
-% \hskip\rightedgedistance
-% \dododoplacelayouttextline\rightedgewidth{#1}\v!edge
-% {\csname\??tk#1\v!edge#4\endcsname\hss}%
-% \fi}}
-%
-% \def\dododoplacelayouttextline#1#2#3#4%
-% {\vbox % to \vsize
-% {\hsize#1\relax
-% \csname\??tk#2#3\c!before\endcsname
-% \setlayoutcomponentattribute#2#3%
-% \hbox \layoutcomponentboxattribute to #1{#4}%
-% \csname\??tk#2#3\c!after\endcsname}}
-
\def\doplacelayouttextline#1#2%
{\let\currentlayouttextline#1%
\ifdim#2>\zeropoint\relax % prevents pagenumbers when zero height
@@ -682,7 +626,7 @@
\def\@@nmpre#1%
{\begingroup
- \setbox\scratchbox\normalhbox{\trialtypesettingtrue\ignorespaces#1\removeunwantedspaces}%
+ \setbox\scratchbox\normalhbox{\settrialtypesetting\ignorespaces#1\removeunwantedspaces}%
\ifzeropt\wd\scratchbox\else
\doifelsenothing\@@nmwidth
{\box\scratchbox\tfskip}
@@ -692,7 +636,7 @@
\def\@@nmpos#1%
{\begingroup
- \setbox\scratchbox\normalhbox{\trialtypesettingtrue\ignorespaces#1\removeunwantedspaces}%
+ \setbox\scratchbox\normalhbox{\settrialtypesetting\ignorespaces#1\removeunwantedspaces}%
\ifzeropt\wd\scratchbox\else
\doifelsenothing\@@nmwidth
{\tfskip\box\scratchbox}
diff --git a/Master/texmf-dist/tex/context/base/ppchtex.mkiv b/Master/texmf-dist/tex/context/base/ppchtex.mkiv
index e81551eeab2..1162c1fcf6a 100644
--- a/Master/texmf-dist/tex/context/base/ppchtex.mkiv
+++ b/Master/texmf-dist/tex/context/base/ppchtex.mkiv
@@ -97,13 +97,15 @@
\doifundefined{fiverm} % In the more recent LaTeX versions
{\font\fiverm=cmr5 } % \fiverm is no longer (pre)defined.
+\newconstant\chemicaldrawingmode
+
\doifdefinedelse{beginpicture} % PiCTeX
{\doifdefinedelse{startMPdrawing}
- {\chardef\chemicaldrawingmode=2 } % MetaPost
- {\chardef\chemicaldrawingmode=0 }} % raw
+ {\chemicaldrawingmode\plustwo } % MetaPost
+ {\chemicaldrawingmode\zerocount}} % raw
{\doifdefinedelse{psaxes}
- {\chardef\chemicaldrawingmode=1 } % PSTricks
- {\chardef\chemicaldrawingmode=3 }} % unknown
+ {\chemicaldrawingmode\plusone } % PSTricks
+ {\chemicaldrawingmode\plusthree}} % unknown
\ifcase\chemicaldrawingmode
\writestatus{ppchtex}{using PiCTeX}
@@ -283,22 +285,10 @@
% regels iets verder uit elkaar gezet. Jammer. Italic fonts
% hebben grotere cijfers en vallen min of meer uit de boot.
-\newif\ifloweredsubscripts
-
-% Due to some upward incompatibality of LaTeX to LaTeX2.09
-% and/or LaTeX2e we had to force \@@dochemicalstyle. Otherwise
-% some weird \nullfont error comes up.
-
-\def\beginlatexmathmodehack
- {\ifmmode
- \let\endlatexmathmodehack=\relax
- \else
- \def\endlatexmathmodehack{$}$\@@dochemicalstyle\empty
- \fi}
+\newif\ifloweredsubscripts % this will be redone in the mkiv ways
\def\setsubscripts
- {\beginlatexmathmodehack
- \def\dosetsubscript##1##2##3%
+ {\def\dosetsubscript##1##2##3%
{\dimen0=##3\fontexheight##2%
\setxvalue{@@\string##1\string##2}{\the##1##2\relax}%
##1##2=\dimen0\relax}%
@@ -309,12 +299,10 @@
%dodosetsubscript\mathsupnormal {?}%
\dodosetsubscript\mathsubnormal {.7}%
\dodosetsubscript\mathsubcombined{.7}%
- \global\loweredsubscriptstrue
- \endlatexmathmodehack}
+ \global\loweredsubscriptstrue}
\def\resetsubscripts
{\ifloweredsubscripts
- \beginlatexmathmodehack
\def\doresetsubscript##1##2%
{\dimen0=\getvalue{@@\string##1\string##2}\relax
##1##2=\dimen0}%
@@ -326,7 +314,6 @@
\dodoresetsubscript\mathsubnormal
\dodoresetsubscript\mathsubcombined
\global\loweredsubscriptsfalse
- \endlatexmathmodehack
\fi}
\ifx\Umathchar\undefined \else
@@ -390,11 +377,8 @@
\def\dowithchemical%
{}
-\doifdefinedelse{@@iastate}
- {\def\localgotochemical#1#2{\naarbox{#2}[#1]}%
- \def\localthisischemical#1{\pagereference[#1]}}
- {\def\localgotochemical#1{}%
- \def\localthisischemical#1{}}
+\def\localgotochemical#1#2{\gotobox{#2}[#1]}
+\def\localthisischemical#1{\pagereference[#1]}
% eind van experiment
@@ -719,8 +703,8 @@
\ignorespaces}
\def\dostartchemical%
- {\catcode`\^=\@@superscript% t.b.v. \enableduplication
- \catcode`\_=\@@subscript % t.b.v. de zekerheid
+ {\catcode`\^=\superscriptcatcode% t.b.v. \enableduplication
+ \catcode`\_=\subscriptcatcode % t.b.v. de zekerheid
\begingroup
\inchemicaltrue
\def\toptext##1{\gdef\thetoptext{##1}\ignorespaces}\toptext{}%
@@ -1096,7 +1080,7 @@
\dosetsubscripts
\setbox2=\hbox{\@@dochemicalcolor
$\@@dochemicalstyle{\@@localchemicalformat \chemicaltext}$}%
- \setbox4=\hbox{$\@@dochemicalstyle{\@@localchemicalformat C_2^2}$}%
+ \setbox4=\hbox{$\@@dochemicalstyle{\@@localchemicalformat C\normalsubscript2\normapsuperscript2}$}%
\setbox6=\hbox{$\@@dochemicalstyle{\@@localchemicalformat O}$}% or C
\doresetsubscripts
\doifnot\@@chemicallocation\v!intext
@@ -1204,7 +1188,7 @@
% #3: x-coordinaat eindpunt
% #4: y-coordinaat eindpunt
-\chardef\chemicallinetype=0
+\newconstant\chemicallinetype
\def\doplotchemicalline
{\!!counte=\!!countc \advance\!!counte by -\!!counta
@@ -1407,7 +1391,7 @@
\getvalue{\s!chemicallinesegment#2#1}}
\def\doprocesschemicallinesegment#1#2#3#4#5%
- {\chardef\chemicallinetype=#1
+ {\chemicallinetype#1\relax
\def\chemicallineposition{#2}%
\def\doprocess[##1##2##3##4##5]%
{\doifelse{##1}{?}
@@ -1778,8 +1762,8 @@
\innerchemicalfalse
\fi
\bgroup
- \catcode`\^=\@@superscript % t.b.v. \enableduplication
- \catcode`\_=\@@subscript % t.b.v. de zekerheid
+ \catcode`\^=\superscriptcatcode % t.b.v. \enableduplication
+ \catcode`\_=\subscriptcatcode % t.b.v. de zekerheid
\ifmmode
\ifinnerchemical
\def\next{\dotriplegroupempty\dosimplechemicalA}%
@@ -2006,7 +1990,7 @@
{\@@dochemicalcolor
$\@@dochemicalstyle{\scriptscriptstyle\hskip-.15em#2}$}%
\wd0=0pt
- \big#1_{\hskip.1em\box0}%
+ \big#1\normapsubscript{\hskip.1em\box0}%
\egroup}
\def\disablechemicalspecials%
@@ -2204,13 +2188,11 @@
\doresetsubscripts}%
\mathop{\box0}%
\ifthirdargument
- \doifnot{#2}{}
- {^{\@@dochemicalstyle{\strut#2}}}%
- \doifnot{#3}{}
- {_{\@@dochemicalstyle{\strut#3}}}%
+ \doifnot{#2}{}{\normapsuperscript{\@@dochemicalstyle{\strut#2}}}%
+ \doifnot{#3}{}{\normapsubscript {\@@dochemicalstyle{\strut#3}}}%
\else
\doifnot{#2}{}
- {_{\@@dochemicalstyle{\strut#2}}}%
+ {\normapsubscript{\@@dochemicalstyle{\strut#2}}}%
\fi
\egroup
\chemicalspace}
diff --git a/Master/texmf-dist/tex/context/base/pret-lua.lua b/Master/texmf-dist/tex/context/base/pret-lua.lua
deleted file mode 100644
index 8803971f3eb..00000000000
--- a/Master/texmf-dist/tex/context/base/pret-lua.lua
+++ /dev/null
@@ -1,319 +0,0 @@
-if not modules then modules = { } end modules ['pret-lua'] = {
- version = 1.001,
- comment = "companion to buff-ver.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- this is not a real parser as we also want to typeset wrong output
--- and a real parser would choke on that
-
-local utf = unicode.utf8
-
-local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
-local utfbyte, utffind = utf.byte, utf.find
-local byte, sub, find, match = string.byte, string.sub, string.find, string.match
-local texsprint, texwrite = tex.sprint, tex.write
-local ctxcatcodes = tex.ctxcatcodes
-
-local visualizer = buffers.newvisualizer("lua")
-
-visualizer.identifiers = { }
-
--- borrowed from scite
---
--- depricated:
---
--- gcinfo unpack getfenv setfenv loadlib
--- table.maxn table.getn table.setn
--- math.log10 math.mod math.modf math.fmod
-
-visualizer.identifiers.core = {
- "and", "break", "do", "else", "elseif", "end", "false", "for", "function",
- "if", "in", "local", "nil", "not", "or", "repeat", "return", "then",
- "true", "until", "while"
-}
-
-visualizer.identifiers.base = {
- "assert", "collectgarbage", "dofile", "error", "loadfile",
- "loadstring", "print", "rawget", "rawset", "require", "tonumber",
- "tostring", "type",
-}
-
-visualizer.identifiers.five = {
- "_G", "getmetatable", "ipairs", "next", "pairs",
- "pcall", "rawequal", "setmetatable", "xpcall", "string", "table",
- "math", "coroutine", "io", "os", "debug", "load", "module", "select",
-}
-
-visualizer.identifiers.libs = {
- -- coroutine
- "coroutine.create", "coroutine.resume", "coroutine.status", "coroutine.wrap",
- "coroutine.yield", "coroutine.running",
- -- package
- "package.cpath", "package.loaded", "package.loadlib", "package.path", "package.config",
- -- io
- "io.close", "io.flush", "io.input", "io.lines", "io.open", "io.output",
- "io.read", "io.tmpfile", "io.type", "io.write", "io.stdin", "io.stdout",
- "io.stderr", "io.popen",
- -- math
- "math.abs", "math.acos", "math.asin", "math.atan", "math.atan2", "math.ceil",
- "math.cos", "math.deg", "math.exp", "math.floor math.", "math.ldexp",
- "math.log", "math.max", "math.min", "math.pi", "math.pow",
- "math.rad", "math.random", "math.randomseed", "math.sin", "math.sqrt",
- "math.tan", "math.cosh", "math.sinh", "math.tanh",
- "math.huge",
- -- string
- "string.byte", "string.char", "string.dump", "string.find", "string.len",
- "string.lower", "string.rep", "string.sub", "string.upper", "string.format",
- "string.gfind", "string.gsub", "string.gmatch", "string.match", "string.reverse",
- -- table
- "table.concat", "table.foreach", "table.foreachi",
- "table.sort", "table.insert", "table.remove",
- "table.pack", "table.unpack",
- -- os
- "os.clock", "os.date", "os.difftime", "os.execute", "os.exit", "os.getenv",
- "os.remove", "os.rename", "os.setlocale", "os.time", "os.tmpname",
- -- package
- "package.preload", "package.seeall",
- -- bit
- -- ... todo ...
-}
-
-local known_words = { }
-
-for k,v in next, visualizer.identifiers do
- for _,w in next, v do
- known_words[w] = k
- end
-end
-
-visualizer.styles = {
- core = "",
- base = "\\sl ",
- five = "\\sl ",
- libs = "\\sl ",
-}
-
-local styles = visualizer.styles
-
-local colors = {
- "prettyone",
- "prettytwo",
- "prettythree",
- "prettyfour",
-}
-
-local states = {
- ['"']=1, ["'"]=1, ["[["] = 1, ["]]"] = 1,
- ['+']=1, ['-']=1, ['*']=1, ['/']=1, ['%']=1, ['^']=1,
- ["("] = 3, [")"] = 3, ["["] = 3, ["]"] = 3,
- ['--']=4,
-}
-
-local change_state, finish_state = buffers.change_state, buffers.finish_state
-
-local function flush_lua_word(state, word)
- if word then
- local id = known_words[word]
- if id then
- state = change_state(2,state)
- if styles[id] then
- texsprint(ctxcatcodes,styles[id])
- end
- texwrite(word)
- state = finish_state(state)
- else
- state = finish_state(state) -- ?
- texwrite(word)
- end
- else
- state = finish_state(state)
- end
- return state
-end
-
-local incomment, inlongstring = false, false
-
-function visualizer.reset()
- incomment, inlongstring = false, false -- needs to be hooked into flusher
-end
-
--- we will also provide a proper parser based pretty printer although normaly
--- a pretty printer should handle faulty code too (educational purposes)
-
-local function written(state,c,i)
- if c == " " then
- state = finish_state(state)
- texsprint(ctxcatcodes,"\\obs")
- elseif c == "\t" then
- state = finish_state(state)
- texsprint(ctxcatcodes,"\\obs")
- if buffers.visualizers.enabletab then
- texsprint(ctxcatcodes,rep("\\obs ",i%buffers.visualizers.tablength))
- end
- else
- texwrite(c)
- end
- return state, 0
-end
-
-function visualizer.flush_line(str, nested)
- local state, instr, inesc, word = 0, false, false, nil
- buffers.currentcolors = colors
- local code, comment = match(str,"^(.-)%-%-%[%[(.*)$")
- if comment then
- -- process the code and then flush the comment
- elseif incomment then
- comment, code = match(str,"^(.-)%]%](.*)$")
- if comment then
- -- flush the comment and then process the code
- for c in utfcharacters(comment) do
- if c == " " then texsprint(ctxcatcodes,"\\obs") else texwrite(c) end
- end
- state = change_state(states['--'], state)
- texwrite("]]")
- state = finish_state(state)
- incomment = false
- else
- for c in utfcharacters(str) do
- if c == " " then texsprint(ctxcatcodes,"\\obs") else texwrite(c) end
- end
- end
- comment = nil
- else
- code = str
- end
- if code and code ~= "" then
- local pre, post = match(code,"^(.-)%-%-(.*)$")
- if pre then
- code = pre
- end
- local p, s, i = nil, nil, 0
- for c in utfcharacters(code) do
- i = i + 1
- if instr then
- if p then
- texwrite(p)
- p = nil
- end
- if c == s then
- if inesc then
- texwrite(c)
- inesc = false
- else
- state = change_state(states[c],state)
- instr = false
- texwrite(c)
- state = finish_state(state)
- end
- s = nil
- else
- if c == "\\" then
- inesc = not inesc
- else
- inesc = false
- end
- state, i = written(state,c,i)
- end
- elseif c == "[" then
- if word then
- texwrite(word)
- word = nil
- end
- if p == "[" then
- inlongstring = true
- state = change_state(states["[["],state)
- texwrite(p,c)
- state = finish_state(state)
- p = nil
- else
- if p then
- state, i = written(state,p,i)
- end
- p = c
- end
- elseif c == "]" then
- if word then
- texwrite(word)
- word = nil
- end
- if p == "]" then
- inlongstring = false
- state = change_state(states["]]"],state)
- texwrite(p,c)
- state = finish_state(state)
- p = nil
- else
- if p then
- state, i = written(state,p,i)
- end
- p = c
- end
- else
- if p then
- state = change_state(states[p],state)
- texwrite(p)
- state = finish_state(state)
- p = nil
- end
- if c == " " or c == "\t" then
- if word then
- state = flush_lua_word(state,word)
- word = nil
- end
- state, i = written(state,c,i)
- elseif inlongstring then
- state, i = written(state,c,i)
- elseif c == '"' or c == "'" then
-if word then
- state = flush_lua_word(state,word)
- word = nil
-end
- instr = true
- state = change_state(states[c],state)
- state, i = written(state,c,i)
- state = finish_state(state)
- s = c
- elseif find(c,"^[%a]$") then
- state = finish_state(state)
- if word then word = word .. c else word = c end
- elseif word and (#word > 1) and find(c,"^[%d%.%_]$") then
- if word then word = word .. c else word = c end
- else
- state = flush_lua_word(state,word)
- word = nil
- state = change_state(states[c],state)
- texwrite(c)
- instr = (c == '"')
- end
- end
- end
- if p then
- texwrite(p)
- -- state, i = written(state,p,i)
- p = nil
- end
- state = flush_lua_word(state,word)
- if post then
- state = change_state(states['--'], state)
- texwrite("--")
- state = finish_state(state)
- for c in utfcharacters(post) do
- state, i = written(state,c,i)
- end
- end
- end
- if comment then
- incomment = true
- state = change_state(states['--'], state)
- texwrite("[[")
- state = finish_state(state)
- -- texwrite(comment) -- maybe also split and
- for c in utfcharacters(comment) do
- state, i = written(state,c,i)
- end
- end
- state = finish_state(state)
-end
diff --git a/Master/texmf-dist/tex/context/base/pret-tex.lua b/Master/texmf-dist/tex/context/base/pret-tex.lua
deleted file mode 100644
index 5d128fa3b90..00000000000
--- a/Master/texmf-dist/tex/context/base/pret-tex.lua
+++ /dev/null
@@ -1,87 +0,0 @@
-if not modules then modules = { } end modules ['pret-tex'] = {
- version = 1.001,
- comment = "companion to buff-ver.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local utf = unicode.utf8
-
-local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
-local utfbyte, utffind = utf.byte, utf.find
-local rep = string.rep
-local texsprint, texwrite = tex.sprint, tex.write
-local ctxcatcodes, vrbcatcodes = tex.ctxcatcodes, tex.vrbcatcodes
-
-local visualizer = buffers.newvisualizer("tex")
-
-local colors = {
- "prettytwo",
- "prettyone",
- "prettythree",
- "prettyfour"
-}
-
-local states = {
- ['$']=2, ['{']=2, ['}']=2,
- ['[']=3, [']']=3, ['(']=3, [')']=3, ['<']=3, ['>']=3, ['#']=3, ['=']=3, ['"']=3,
- ['/']=4, ['^']=4, ['_']=4, ['-']=4, ['&']=4, ['+']=4, ["'"]=4, ['`']=4, ['|']=4, ['%']=4
-}
-
--- some day I'll make an lpeg
-
-local change_state, finish_state = buffers.change_state, buffers.finish_state
-
-local chardata = characters.data
-local is_letter = characters.is_letter
-
-function visualizer.flush_line(str,nested)
- local state, first, i = 0, false, 0
- buffers.currentcolors = colors
- for c in utfcharacters(str) do
- i = i + 1
- if c == " " then
- state = finish_state(state)
- texsprint(ctxcatcodes,"\\obs")
- first = false
- elseif c == "\t" then
- state = finish_state(state)
- texsprint(ctxcatcodes,"\\obs")
- if buffers.visualizers.enabletab then
- texsprint(ctxcatcodes,rep("\\obs ",i%buffers.visualizers.tablength))
- i = 0
- end
- first = false
- elseif first then
- state = 1
- texwrite(c)
- if not utffind(c,"^[%a%!%?%@]$") then
- state = finish_state(state)
- end
- first = false
- elseif state == 1 then
- if utffind(c,"^[%a%!%?%@]$") then
- texwrite(c)
- first = false
- elseif c == "\\" then
- state = change_state(1, state)
- texwrite(c)
- first = true
- else
- state = change_state(states[c], state)
- texwrite(c)
- first = false
- end
- elseif c == "\\" then
- first = true
- state = change_state(1, state)
- texwrite(c)
- else
- state = change_state(states[c], state)
- texwrite(c)
- first = false
- end
- end
- state = finish_state(state)
-end
diff --git a/Master/texmf-dist/tex/context/base/pret-xml.lua b/Master/texmf-dist/tex/context/base/pret-xml.lua
deleted file mode 100644
index b11dccb99c3..00000000000
--- a/Master/texmf-dist/tex/context/base/pret-xml.lua
+++ /dev/null
@@ -1,136 +0,0 @@
-if not modules then modules = { } end modules ['pret-xml'] = {
- version = 1.001,
- comment = "companion to buff-ver.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- line by line, no check because can be snippet (educational) and
--- a somewhat simplified view on xml; we forget about dtd's and
--- cdata (some day i'll make a visualizer for valid xml using the
--- built in parser)
-
-local utf = unicode.utf8
-
-local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
-local utfbyte, utffind = utf.byte, utf.find
-local rep = string.rep
-local texsprint, texwrite = tex.sprint, tex.write
-local ctxcatcodes = tex.ctxcatcodes
-
-local visualizer = buffers.newvisualizer("xml")
-
-local colors = {
- "prettytwo",
- "prettyone",
- "prettythree",
- "prettyfour"
-}
-
-local states = {
- ['"']=2, ["'"]=2,
- ["-"]=1, ["?"]=1, ["!"]=1, [":"]=1, ["_"]=1, ["/"]=1,
-}
-
-local change_state, finish_state = buffers.change_state, buffers.finish_state
-
-local state, intag, dotag, inentity, inquote
-
-function visualizer.reset()
- state, intag, dotag, inentity, inquote = 0, false, false, false, false
-end
-
-function visualizer.flush_line(str,nested)
- buffers.currentcolors = colors
- for c in utfcharacters(str) do
- if c == "&" then
- inentity = true -- no further checking
- state = change_state(3, state)
- texwrite(c)
- elseif c == ";" then
- if inentity then
- inentity = false
- state = change_state(3, state)
- texwrite(c)
- state = finish_state(state)
- else
- texwrite(c)
- end
- elseif inentity then
- state = change_state(3, state)
- texwrite(c)
- elseif c == " " then
- state = finish_state(state)
- texsprint(ctxcatcodes,"\\obs")
- intag = false
- elseif c == "\t" then
- state = finish_state(state)
- texsprint(ctxcatcodes,"\\obs")
- if buffers.visualizers.enabletab then
- texsprint(ctxcatcodes,rep("\\obs ",i%buffers.visualizers.tablength))
- end
- intag = false
- elseif c == "<" then
- if intag then
- state = finish_state(state)
- -- error
- else
- intag = 1
- dotag = true
- state = change_state(1, state)
- end
- texwrite(c)
- elseif c == ">" then
- if intag then
- texwrite(c)
- state = finish_state(state)
- intag, dotag = false, false
- elseif dotag then
- state = change_state(1, state)
- texwrite(c)
- state = finish_state(state)
- intag, dotag = false, false
- else
- state = finish_state(state)
- texwrite(c)
- end
- elseif intag then
- if utffind(c,"^[%S]$") then
- state = change_state(1, state)
- texwrite(c)
- intag = intag + 1
- else
- intag = false
- state = finish_state(state)
- texwrite(c)
- end
- elseif dotag then
- if c == "'" or c == '"' then
- if inquote then
- if c == inquote then
- state = change_state(states[c], state) -- 2
- texwrite(c)
- state = finish_state(state)
- inquote = false
- else
- texwrite(c)
- end
- else
- inquote = c
- state = change_state(states[c], state)
- texwrite(c)
- state = finish_state(state)
- end
- elseif inquote then
- texwrite(c)
- else
- state = change_state(states[c], state)
- texwrite(c)
- end
- else
- texwrite(c)
- end
- end
- state = finish_state(state)
-end
diff --git a/Master/texmf-dist/tex/context/base/prop-ini.mkiv b/Master/texmf-dist/tex/context/base/prop-ini.mkiv
index 97d72582e3f..3cb5d2a6f5a 100644
--- a/Master/texmf-dist/tex/context/base/prop-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/prop-ini.mkiv
@@ -13,33 +13,32 @@
\writestatus{loading}{ConTeXt Property Macros / Initialization}
-%D Welcome to the third alternative of this yet undocumented module,
-%D which means that there is no public interface yet!
+%D This module is replaced by dedicated mechanisms. Originally properties were
+%D a sort of attributes in \MKII, but now we do things different anyway. We keep
+%D a surrogate mechanism around for compatibility reasons but even this will
+%D become obsolete some day.
\unprotect
-\newcount\propertylevel
+\def\propertyobsoletemessage
+ {\writestatus\m!system{properties are obsolete, use dedicated commands}%
+ \glet\propertyobsoletemessage\donothing}
-\def\currentpropertylevel {\csname\??py:l:\currentpropertytype\endcsname} % counter
-\def\previouspropertylevel{\csname\??py:p:\currentpropertytype\endcsname} % counter
+\setvalue{\??py:d:\v!layer }[#1][#2][#3]{\defineviewerlayer[#1][#3]}
+\setvalue{\??py:d:\s!effect }[#1][#2][#3]{\defineeffect [#1][#3]}
+\setvalue{\??py:d:\v!negative}[#1][#2][#3]{}
-\def\currentproperty {\csname\??py:c:\number\currentpropertylevel \endcsname} % string
-\def\previousproperty {\csname\??py:c:\number\previouspropertylevel\endcsname} % string
-
-% more efficient:
-
-\def\currentproperty {\csname\??py:c:\number\propertylevel\endcsname} % string
-\def\currentpropertytype {\csname\??py\currentproperty\c!type\endcsname}
+\unexpanded\def\defineproperty
+ {\dotripleempty\dodefineproperty}
-\def\docheckproperty % watch the s instead of e
- {\csname\s!check\currentpropertytype property\endcsname
- \global\expandafter\let\csname\??py\s!check\currentproperty\endcsname\empty}
+\def\dodefineproperty[#1][#2][#3]%
+ {\propertyobsoletemessage
+ \setevalue{\??py#1\c!type}{#2}%
+ \getvalue{\??py:d:#2}[#1][#2][#3]}
-\def\checkproperty[#1]%
- {\bgroup
- \def\currentproperty{#1}%
- \csname\??py\s!check\currentproperty\endcsname
- \egroup}
+\setvalue{\??py:s:\v!layer }#1{\let\dostopproperty\stopviewerlayer\startviewerlayer[#1]}
+\setvalue{\??py:s:\s!effect }#1{\let\dostopproperty\stopeffect \starteffect [#1]}
+\setvalue{\??py:s:\v!negative}#1{\let\dostopproperty\stopnegative \startnegative }
\unexpanded\def\property[#1]%
{\groupedcommand{\dostartproperty{#1}}\dostopproperty}
@@ -50,101 +49,12 @@
\unexpanded\def\stopproperty
{\dostopproperty}
-\def\dostartgproperty
- {\begingroup\dostartproperty}
-
-\def\dostopgproperty
- {\dostopproperty\endgroup}
-
-\def\dostartproperty#1% evt pack: {current}{level}{
- {\global\advance\propertylevel\plusone
- \@EAEAEA\xdef\currentproperty{#1}%
- \global\advance\previouspropertylevel\plusone
- \global\advance\currentpropertylevel\plusone
- \csname\??py\s!check\currentproperty\endcsname
- \csname\s!start\currentpropertytype\s!property\endcsname}
-
-\def\dostopproperty
- {\csname\s!stop\currentpropertytype\s!property\endcsname
- \global\advance\currentpropertylevel\minusone
- \global\advance\previouspropertylevel\minusone
- \global\advance\propertylevel\minusone}
-
-\unexpanded\def\defineproperty
- {\dotripleempty\dodefineproperty}
-
-\def\dodefineproperty[#1]%
- {\ifcsname\??py#1\c!global\endcsname
- \expandafter\nododefineproperty
- \else
- \expandafter\dododefineproperty
- \fi[#1]}
-
-% due to initializations/counters, definitions are always global
-%
-% global : yes : ungrouped
-% no : grouped
-% method : command : define commands
-% none : no commands
-
-\def\dododefineproperty[#1][#2][#3]% global ! ! !
- {\getgparameters[\??py#1][\c!global=\v!no,\c!type=#2,\c!method=\v!none,#3]% global ! ! ! !
- \ifcsname\??py:l:#2\endcsname \else
- \expandafter\newcount\csname\??py:l:#2\endcsname % current level
- \expandafter\newcount\csname\??py:p:#2\endcsname % previous level
- \global\csname\??py:p:#2\endcsname\minusone
- \global\expandafter\let\csname\??py:c:0\endcsname\empty
- \fi
- \letgvalue{\??py\s!check#1}\docheckproperty
- \doifelsevalue{\??py#1\c!method}\v!command
- {\doifelsevalue{\??py#1\c!global}\v!yes
- {\setugvalue{\e!start#1}{\dostartproperty{#1}}%
- \setugvalue{\e!stop #1}{\dostopproperty}}%
- {\setugvalue{\e!start#1}{\dostartgproperty{#1}}%
- \setugvalue{\e!stop #1}{\dostopgproperty}}}%
- {\doifelsevalue{\??py#1\c!global}\v!yes
- {\setugvalue{\e!start#2}[##1]{\dostartproperty{##1}}%
- \setugvalue{\e!stop #2}{\dostopproperty}}%
- {\setugvalue{\e!start#2}[##1]{\dostartgproperty{##1}}%
- \setugvalue{\e!stop #2}{\dostopgproperty}}}}
-
-\def\nododefineproperty[#1][#2][#3]%
- {}
-
-\def\doifelseproperty#1{\doifdefinedelse{\??py#1\c!global}}
-
-\unexpanded\def\setupproperty
- {\dodoubleempty\dosetupproperty}
-
-\def\dosetupproperty[#1][#2]% local
- {\ifsecondargument
- \getparameters[\??py#1][#2]%
- \else
- \getparameters[\??py][#1]%
- \fi}
-
-\letvalue{\??py\s!empty}\empty
-
-% beware, normally \*parameter concerns the current one
-
-\def\propertyparameter#1#2% expands to #1 when not defined (see \define...)
- {\csname\??py
- \ifcsname\??py#1#2\endcsname
- #1#2%
- \else\ifcsname\??py\csname\??py#1\c!type\endcsname#2\endcsname
- \csname\??py#1\c!type\endcsname#2%
- \else
- \s!empty
- \fi\fi
- \endcsname}
-
-\def\currentpropertyparameter % self and class
- {\propertyparameter\currentproperty}
-
-\def\checkedpropertyparameter#1% only self
- {\ifcsname\??py\currentproperty#1\endcsname\csname\??py\currentproperty#1\endcsname\fi}
+\unexpanded\def\dostartproperty#1%
+ {\pushmacro\dostopproperty
+ \getvalue{\??py:s:\getvalue{\??py#1\c!type}}{#1}}
-\unexpanded\def\definepropertyhandler#1{\setvalue{\??py*#1}}
-\def\propertyhandler #1{\getvalue{\??py*#1}}
+\unexpanded\def\dostopproperty
+ {\dostopproperty
+ \popmacro\dostopproperty}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/prop-lay.mkiv b/Master/texmf-dist/tex/context/base/prop-lay.mkiv
deleted file mode 100644
index 7711dae529a..00000000000
--- a/Master/texmf-dist/tex/context/base/prop-lay.mkiv
+++ /dev/null
@@ -1,140 +0,0 @@
-%D \module
-%D [ file=prop-lay,
-%D version=2003.04.20,
-%D title=\CONTEXT\ Property Macros,
-%D subtitle=Layers,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Property Macros / Layers}
-
-%D Highly experimental, will probably change/evolve. Also, quite certainly
-%D we will no longer share code between mkii and mkiv.
-
-% test, nesting is somewhat special with layers
-%
-% \defineproperty[hans][layer]
-% \defineproperty[ton] [layer]
-% \setupheadertexts[no layer]
-% 1\startproperty[hans]2\startproperty[ton]3\stopproperty4\stopproperty5
-
-\unprotect
-
-% will be redone ... no longer using property mechanism (less clashes)
-
-\let\currentviewerlayer\empty
-
-\appendtoks
- \let\currentviewerlayer\empty
-\to \everypagebody
-
-\unexpanded\def\startlayerproperty
- {\pushmacro\currentviewerlayer % grouped (used in interaction)
- \let\currentlayerproperty\currentproperty % can be cross group
- \dotriggerviewerlayer\currentlayerproperty}
-
-\unexpanded\def\stoplayerproperty
- {\popmacro\currentviewerlayer % grouped (used in interaction)
- \let\currentlayerproperty\previousproperty % can be cross group
- \dotriggerviewerlayer\currentlayerproperty}
-
-\def\checklayerproperty % could be made more clever
- {\registerviewerlayer\currentproperty\currentproperty
- \ctxlua{backends.codeinjections.defineviewerlayer{
- tag = "\currentproperty",
- title = "\checkedpropertyparameter\c!title\currentproperty",
- visible = "\checkedpropertyparameter\c!state\v!start",
- kind = 0, % 1 == frozen
- printable = "\checkedpropertyparameter\v!printable\v!yes" % v! looks wrong
- }}}
-
-%D \starttext
-%D
-%D \setuppapersize[S4][S4]
-%D \setuplayout[middle]
-%D \setupcolors[state=start]
-%D \setupinteraction[state=start,color=,contrastcolor=]
-%D
-%D \defineproperty [L1] [layer] [title=layer 1]
-%D \defineproperty [L2] [layer] [title=layer 2]
-%D
-%D \button{HIDE L1}[HideLayer{L1}]
-%D \button{VIDE L1}[VideLayer{L1}]
-%D \button{TOGGLE L1}[ToggleLayer{L1}]
-%D
-%D \button{HIDE L2}[HideLayer{L2}]
-%D \button{VIDE L2}[VideLayer{L2}]
-%D \button{TOGGLE L2}[ToggleLayer{L2}]
-%D
-%D \noheaderandfooterlines \centerbox{\startoverlay
-%D {\definedfont[Mono at 150pt]%
-%D \startproperty[L1]\red TEST\stopproperty}
-%D {\definedfont[Mono at 150pt]%
-%D \startproperty[L2]\green TEST\stopproperty}
-%D \stopoverlay} \page
-%D
-%D \noheaderandfooterlines \centerbox{\startoverlay
-%D {\definedfont[Mono at 15pt]%
-%D \goto{\startproperty[L1]\red TEST\stopproperty}[CloseDocument]}
-%D {\definedfont[Mono at 15pt]%
-%D \goto{\startproperty[L2]\green TEST\stopproperty}[CloseDocument]}
-%D \stopoverlay} \page
-%D
-%D \startproperty[L1]
-%D level 1 \startproperty[L2]level 2 \stopproperty level 1
-%D \stopproperty
-%D
-%D \startproperty[L1]
-%D level 1 \page \startproperty[L2]level 2 \stopproperty level 1
-%D \stopproperty
-%D
-%D \stoptext
-
-\def\doinitializelayoutcomponent#1#2%
- {\ctxlua{backends.codeinjections.defineviewerlayer{% this will move to the lua end i.e be merged with register
- tag = "#1:#2",
- title = "#1 #2",
- visible = "\v!start",
- kind = 0, % 1 == frozen
- printable = "\v!yes"
- }}%
- \edef\layoutcomponentboxattribute{attr \viewerlayerattribute \ctxlua{tex.write(viewerlayers.register('#1:#2',true))}\relax}%
- \expandafter\glet\csname\??ly>#1:#2\endcsname\layoutcomponentboxattribute}
-
-\def\dosetlayoutcomponentattribute#1#2% make this faster
- {\expandafter\let\expandafter\layoutcomponentboxattribute\csname\??ly>#1:#2\endcsname
- \ifx\layoutcomponentboxattribute\relax
- \doinitializelayoutcomponent{#1}{#2}% get rid of { }
- \fi}
-
-\def\doresetlayoutcomponentattribute
- {\let\layoutcomponentboxattribute\empty}
-
-\let\setlayoutcomponentattribute \gobbletwoarguments
-\let\resetlayoutcomponentattribute\relax
-\let\layoutcomponentboxattribute \empty
-
-\def\showlayoutcomponents
- {\ctxlua{viewerlayers.enable()}%
- \let\setlayoutcomponentattribute \dosetlayoutcomponentattribute
- \let\resetlayoutcomponentattribute\doresetlayoutcomponentattribute}
-
-\protect \endinput
-
-% \starttext
-% \showlayoutcomponents
-% \setupinteraction[state=start]
-% \setupheadertexts[{\goto{page 1}[page(2)]}]
-% test \setlayoutcomponentattribute{test}{aap}\hbox \layoutcomponentboxattribute \bgroup aap
-% \setlayoutcomponentattribute{test}{noot}\hbox \layoutcomponentboxattribute \bgroup noot
-% \setlayoutcomponentattribute{test}{mies}\hbox \layoutcomponentboxattribute \bgroup mies
-% \egroup noot \egroup aap \egroup
-% test \setlayoutcomponentattribute{test}{hans}\hbox \layoutcomponentboxattribute \bgroup aap \hbox{!} aap\egroup
-% test \page test \page
-% \stoptext
-
diff --git a/Master/texmf-dist/tex/context/base/prop-mis.mkiv b/Master/texmf-dist/tex/context/base/prop-mis.mkiv
deleted file mode 100644
index 37c1d797396..00000000000
--- a/Master/texmf-dist/tex/context/base/prop-mis.mkiv
+++ /dev/null
@@ -1,74 +0,0 @@
-%D \module
-%D [ file=prop-mis,
-%D version=2004.05.29, % some code moved from private modules
-%D title=\CONTEXT\ Property Macros,
-%D subtitle=Miscelaneous,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Property Macros / Miscelaneous}
-
-%D This module contains some code that has been in use in some
-%D private modules (p-*). These features depend on the fact
-%D that pdftex writes the page content as one stream.
-
-%D EXPERIMENTAL
-
-\unprotect
-
-% D Overprint cum suis.
-%
-% \defineproperty[\v!overprint][\s!overprint] [\c!method=\v!command]
-% \defineproperty[\v!knockout] [\s!overprint] [\c!method=\v!command]
-%
-% \definepropertyhandler \v!overprint {\dotriggeroverprint\v!overprint}
-% \definepropertyhandler \v!knockout {\dotriggeroverprint\v!knockout }
-%
-% \unexpanded\def\startoverprintproperty{\dotriggeroverprint\v!overprint}
-% \unexpanded\def\stopoverprintproperty {\dotriggeroverprint\v!knockout }
-
-%D Negative cum suis.
-
-\defineproperty [\v!negative] [\s!negative] [\c!method=\v!command]
-\defineproperty [\v!positive] [\s!negative] [\c!method=\v!command]
-
-\definepropertyhandler \v!negative {\dotriggernegative\v!negative}
-\definepropertyhandler \v!positive {\dotriggernegative\v!positive}
-
-\unexpanded\def\startnegativeproperty{\dotriggernegative\v!negative}
-\unexpanded\def\stopnegativeproperty {\dotriggernegative\v!positive}
-
-%D Special font effects.
-
-\setupproperty
- [\s!effect]
- [\c!rulethickness=\zeropoint,
- \c!stretch=0]
-
-\defineproperty [\v!inner] [\s!effect] [\c!rulethickness=.25pt]
-\defineproperty [\v!outer] [\s!effect] [\c!rulethickness=.25pt]
-\defineproperty [\v!both] [\s!effect] [\c!rulethickness=.25pt]
-\defineproperty [\v!normal] [\s!effect]
-\defineproperty [\v!hidden] [\s!effect]
-
-\defineproperty [\v!stretch] [\s!effect] [\c!stretch=1]
-
-\def\mktriggereffect#1%
- {\dotriggereffect{#1}{\propertyparameter{#1}\c!stretch}{\propertyparameter{#1}\c!rulethickness}}
-
-\definepropertyhandler \v!normal {\mktriggereffect\v!normal}
-\definepropertyhandler \v!inner {\mktriggereffect\v!inner }
-\definepropertyhandler \v!outer {\mktriggereffect\v!outer }
-\definepropertyhandler \v!both {\mktriggereffect\v!both }
-\definepropertyhandler \v!hidden {\mktriggereffect\v!hidden}
-\definepropertyhandler \v!stretch{\mktriggereffect\v!normal}
-
-\unexpanded\def\starteffectproperty{\mktriggereffect\currentproperty}
-\unexpanded\def\stopeffectproperty {\mktriggereffect\v!normal }
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/regi-8859-1.lua b/Master/texmf-dist/tex/context/base/regi-8859-1.lua
index b8f0a857311..ff2182afa2c 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-1.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-1.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-1'] = {
license = "see context related readme files"
}
-regimes.data["8859-1"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 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
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 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/regi-8859-10.lua b/Master/texmf-dist/tex/context/base/regi-8859-10.lua
index 574d4ac50cc..f23744b4a24 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-10.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-10.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-10'] = {
license = "see context related readme files"
}
-regimes.data["8859-10"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7, 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A,
- 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7, 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B,
- 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF,
- 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
- 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF,
- 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7, 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A,
+ 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7, 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B,
+ 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138
}
diff --git a/Master/texmf-dist/tex/context/base/regi-8859-11.lua b/Master/texmf-dist/tex/context/base/regi-8859-11.lua
index 1910bbb5d0a..54e5626c28f 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-11.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-11.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-11'] = {
license = "see context related readme files"
}
-regimes.data["8859-11"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
- 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
- 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
- 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F,
- 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
- 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
+ 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
+ 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
+ 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F,
+ 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
+ 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000
}
diff --git a/Master/texmf-dist/tex/context/base/regi-8859-13.lua b/Master/texmf-dist/tex/context/base/regi-8859-13.lua
index a6f71cb7865..1646133b5ae 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-13.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-13.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-13'] = {
license = "see context related readme files"
}
-regimes.data["8859-13"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
- 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
- 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
- 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
- 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
+ 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
+ 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
+ 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
+ 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019
}
diff --git a/Master/texmf-dist/tex/context/base/regi-8859-14.lua b/Master/texmf-dist/tex/context/base/regi-8859-14.lua
index 0c34748659b..2b0c6881445 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-14.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-14.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-14'] = {
license = "see context related readme files"
}
-regimes.data["8859-14"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7, 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178,
- 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56, 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61,
- 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
- 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7, 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178,
+ 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56, 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF
}
diff --git a/Master/texmf-dist/tex/context/base/regi-8859-15.lua b/Master/texmf-dist/tex/context/base/regi-8859-15.lua
index a5626d6537b..48861f39690 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-15.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-15.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-15'] = {
license = "see context related readme files"
}
-regimes.data["8859-15"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7, 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 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
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7, 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 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/regi-8859-16.lua b/Master/texmf-dist/tex/context/base/regi-8859-16.lua
index 817b41db2f1..e122a2042a4 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-16.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-16.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-16'] = {
license = "see context related readme files"
}
-regimes.data["8859-16"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0104, 0x0105, 0x0141, 0x20AC, 0x201E, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x0218, 0x00AB, 0x0179, 0x00AD, 0x017A, 0x017B,
- 0x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6, 0x00B7, 0x017E, 0x010D, 0x0219, 0x00BB, 0x0152, 0x0153, 0x0178, 0x017C,
- 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
- 0x0110, 0x0143, 0x00D2, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x015A, 0x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x0107, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x0111, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B, 0x0171, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x0105, 0x0141, 0x20AC, 0x201E, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x0218, 0x00AB, 0x0179, 0x00AD, 0x017A, 0x017B,
+ 0x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6, 0x00B7, 0x017E, 0x010D, 0x0219, 0x00BB, 0x0152, 0x0153, 0x0178, 0x017C,
+ 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x0110, 0x0143, 0x00D2, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x015A, 0x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x0107, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x0111, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B, 0x0171, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF
}
diff --git a/Master/texmf-dist/tex/context/base/regi-8859-2.lua b/Master/texmf-dist/tex/context/base/regi-8859-2.lua
index 7ae59d0fa22..affd6c3ca20 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-2.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-2.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-2'] = {
license = "see context related readme files"
}
-regimes.data["8859-2"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B,
- 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C,
- 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
- 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
- 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
- 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B,
+ 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C,
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
}
diff --git a/Master/texmf-dist/tex/context/base/regi-8859-3.lua b/Master/texmf-dist/tex/context/base/regi-8859-3.lua
index a83d63bac72..4b5c54b4fbb 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-3.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-3.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-3'] = {
license = "see context related readme files"
}
-regimes.data["8859-3"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0x0000, 0x0124, 0x00A7, 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0x0000, 0x017B,
- 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0x0000, 0x017C,
- 0x00C0, 0x00C1, 0x00C2, 0x0000, 0x00C4, 0x010A, 0x0108, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
- 0x0000, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7, 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x0000, 0x00E4, 0x010B, 0x0109, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x0000, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0x0000, 0x0124, 0x00A7, 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0x0000, 0x017B,
+ 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0x0000, 0x017C,
+ 0x00C0, 0x00C1, 0x00C2, 0x0000, 0x00C4, 0x010A, 0x0108, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x0000, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7, 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x0000, 0x00E4, 0x010B, 0x0109, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x0000, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9
}
diff --git a/Master/texmf-dist/tex/context/base/regi-8859-4.lua b/Master/texmf-dist/tex/context/base/regi-8859-4.lua
index 939d55026f9..774ec2e1056 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-4.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-4.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-4'] = {
license = "see context related readme files"
}
-regimes.data["8859-4"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF,
- 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B,
- 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A,
- 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF,
- 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B,
- 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF,
+ 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B,
+ 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A,
+ 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF,
+ 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B,
+ 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9
}
diff --git a/Master/texmf-dist/tex/context/base/regi-8859-5.lua b/Master/texmf-dist/tex/context/base/regi-8859-5.lua
index ab093d139a8..1137f37bb2e 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-5.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-5.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-5'] = {
license = "see context related readme files"
}
-regimes.data["8859-5"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F,
- 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
- 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
- 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
- 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
+ 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F
}
diff --git a/Master/texmf-dist/tex/context/base/regi-8859-6.lua b/Master/texmf-dist/tex/context/base/regi-8859-6.lua
index e094129f271..651ae79ffe6 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-6.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-6.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-6'] = {
license = "see context related readme files"
}
-regimes.data["8859-6"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0000, 0x0000, 0x0000, 0x00A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x060C, 0x00AD, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x061B, 0x0000, 0x0000, 0x0000, 0x061F,
- 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
- 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F,
- 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0000, 0x0000, 0x0000, 0x00A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x060C, 0x00AD, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x061B, 0x0000, 0x0000, 0x0000, 0x061F,
+ 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F,
+ 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
}
diff --git a/Master/texmf-dist/tex/context/base/regi-8859-7.lua b/Master/texmf-dist/tex/context/base/regi-8859-7.lua
index cee253582f4..08cbbab6edf 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-7.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-7.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-7'] = {
license = "see context related readme files"
}
-regimes.data["8859-7"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x2018, 0x2019, 0x00A3, 0x20AC, 0x20AF, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x037A, 0x00AB, 0x00AC, 0x00AD, 0x0000, 0x2015,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
- 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
- 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
- 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
- 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x2018, 0x2019, 0x00A3, 0x20AC, 0x20AF, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x037A, 0x00AB, 0x00AC, 0x00AD, 0x0000, 0x2015,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
+ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000
}
diff --git a/Master/texmf-dist/tex/context/base/regi-8859-8.lua b/Master/texmf-dist/tex/context/base/regi-8859-8.lua
index 062b080adf1..b6960999174 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-8.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-8.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-8'] = {
license = "see context related readme files"
}
-regimes.data["8859-8"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017,
- 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
- 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017,
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000
}
diff --git a/Master/texmf-dist/tex/context/base/regi-8859-9.lua b/Master/texmf-dist/tex/context/base/regi-8859-9.lua
index 2af118a8c87..773307fff09 100644
--- a/Master/texmf-dist/tex/context/base/regi-8859-9.lua
+++ b/Master/texmf-dist/tex/context/base/regi-8859-9.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-8859-9'] = {
license = "see context related readme files"
}
-regimes.data["8859-9"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 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,
- 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 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,
+ 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
}
diff --git a/Master/texmf-dist/tex/context/base/regi-cp1250.lua b/Master/texmf-dist/tex/context/base/regi-cp1250.lua
index a37ca46b4fe..00d55d1b83f 100644
--- a/Master/texmf-dist/tex/context/base/regi-cp1250.lua
+++ b/Master/texmf-dist/tex/context/base/regi-cp1250.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-cp1250'] = {
license = "see context related readme files"
}
-regimes.data["cp1250"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,
- 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,
- 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,
- 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
- 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
- 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
- 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,
+ 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,
+ 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9
}
diff --git a/Master/texmf-dist/tex/context/base/regi-cp1251.lua b/Master/texmf-dist/tex/context/base/regi-cp1251.lua
index 42fe0b34092..7bb72e0ccab 100644
--- a/Master/texmf-dist/tex/context/base/regi-cp1251.lua
+++ b/Master/texmf-dist/tex/context/base/regi-cp1251.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-cp1251'] = {
license = "see context related readme files"
}
-regimes.data["cp1251"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
- 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
- 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
- 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
- 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
- 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
- 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
+ 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
+ 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
+ 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F
}
diff --git a/Master/texmf-dist/tex/context/base/regi-cp1252.lua b/Master/texmf-dist/tex/context/base/regi-cp1252.lua
index 74b2f3761c8..86954c9af36 100644
--- a/Master/texmf-dist/tex/context/base/regi-cp1252.lua
+++ b/Master/texmf-dist/tex/context/base/regi-cp1252.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-cp1252'] = {
license = "see context related readme files"
}
-regimes.data["cp1252"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 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
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 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/regi-cp1253.lua b/Master/texmf-dist/tex/context/base/regi-cp1253.lua
index f14a186bb94..31a411efeec 100644
--- a/Master/texmf-dist/tex/context/base/regi-cp1253.lua
+++ b/Master/texmf-dist/tex/context/base/regi-cp1253.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-cp1253'] = {
license = "see context related readme files"
}
-regimes.data["cp1253"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
- 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
- 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
- 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
- 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
+ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000
}
diff --git a/Master/texmf-dist/tex/context/base/regi-cp1254.lua b/Master/texmf-dist/tex/context/base/regi-cp1254.lua
index 76fbe9c49f2..73b9927c6ca 100644
--- a/Master/texmf-dist/tex/context/base/regi-cp1254.lua
+++ b/Master/texmf-dist/tex/context/base/regi-cp1254.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-cp1254'] = {
license = "see context related readme files"
}
-regimes.data["cp1254"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 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,
- 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 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,
+ 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF
}
diff --git a/Master/texmf-dist/tex/context/base/regi-cp1255.lua b/Master/texmf-dist/tex/context/base/regi-cp1255.lua
index 9ea807fbdfb..2abb16b54e7 100644
--- a/Master/texmf-dist/tex/context/base/regi-cp1255.lua
+++ b/Master/texmf-dist/tex/context/base/regi-cp1255.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-cp1255'] = {
license = "see context related readme files"
}
-regimes.data["cp1255"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
- 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,
- 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
- 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,
+ 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000
}
diff --git a/Master/texmf-dist/tex/context/base/regi-cp1256.lua b/Master/texmf-dist/tex/context/base/regi-cp1256.lua
index e77525bcf83..a0697c321c4 100644
--- a/Master/texmf-dist/tex/context/base/regi-cp1256.lua
+++ b/Master/texmf-dist/tex/context/base/regi-cp1256.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-cp1256'] = {
license = "see context related readme files"
}
-regimes.data["cp1256"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
- 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,
- 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,
- 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
- 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,
- 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
- 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
+ 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,
+ 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,
+ 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,
+ 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
+ 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2
}
diff --git a/Master/texmf-dist/tex/context/base/regi-cp1257.lua b/Master/texmf-dist/tex/context/base/regi-cp1257.lua
index 1b5d5337989..6e39c10d4bb 100644
--- a/Master/texmf-dist/tex/context/base/regi-cp1257.lua
+++ b/Master/texmf-dist/tex/context/base/regi-cp1257.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-cp1257'] = {
license = "see context related readme files"
}
-regimes.data["cp1257"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000,
- 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
- 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
- 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
- 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
- 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000,
+ 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
+ 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
+ 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
+ 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
+ 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9
}
diff --git a/Master/texmf-dist/tex/context/base/regi-cp1258.lua b/Master/texmf-dist/tex/context/base/regi-cp1258.lua
index 271db30096e..cf64d2ab629 100644
--- a/Master/texmf-dist/tex/context/base/regi-cp1258.lua
+++ b/Master/texmf-dist/tex/context/base/regi-cp1258.lua
@@ -6,21 +6,21 @@ if not modules then modules = { } end modules ['regi-cp1258'] = {
license = "see context related readme files"
}
-regimes.data["cp1258"] = { [0] =
- 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
- 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
- 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
- 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF,
- 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF,
- 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF
+return { [0] =
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 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,
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF,
+ 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF,
+ 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF
}
diff --git a/Master/texmf-dist/tex/context/base/regi-demo.lua b/Master/texmf-dist/tex/context/base/regi-demo.lua
new file mode 100644
index 00000000000..689f44e32c5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/regi-demo.lua
@@ -0,0 +1,22 @@
+if not modules then modules = { } end modules ['regi-demo'] = {
+ 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"
+}
+
+-- digits -> *
+
+return {
+ [0x0030] = 0x002A,
+ [0x0031] = 0x002A,
+ [0x0032] = 0x002A,
+ [0x0033] = 0x002A,
+ [0x0034] = 0x002A,
+ [0x0035] = 0x002A,
+ [0x0036] = 0x002A,
+ [0x0037] = 0x002A,
+ [0x0038] = 0x002A,
+ [0x0039] = 0x002A,
+}
diff --git a/Master/texmf-dist/tex/context/base/regi-ini.lua b/Master/texmf-dist/tex/context/base/regi-ini.lua
index 83739760758..a440b65771a 100644
--- a/Master/texmf-dist/tex/context/base/regi-ini.lua
+++ b/Master/texmf-dist/tex/context/base/regi-ini.lua
@@ -6,83 +6,217 @@ if not modules then modules = { } end modules ['regi-ini'] = {
license = "see context related readme files"
}
-local utf = unicode.utf8
-local char, utfchar, gsub = string.char, utf.char, string.gsub
-local texsprint = tex.sprint
-
-local ctxcatcodes = tex.ctxcatcodes
-
--[[ldx--
<p>Regimes take care of converting the input characters into
<l n='utf'/> sequences. The conversion tables are loaded at
runtime.</p>
--ldx]]--
-regimes = regimes or { }
-regimes.data = regimes.data or { }
-regimes.utf = regimes.utf or { }
-regimes.synonyms = regimes.synonyms or { }
-
-storage.register("regimes/synonyms", regimes.synonyms, "regimes.synonyms")
+local utfchar = utf.char
+local char, gsub, format = string.char, string.gsub, string.format
+local next = next
+local insert, remove = table.insert, table.remove
--- setmetatable(regimes.data,_empty_table_)
-
-regimes.currentregime = "utf"
+local sequencers = utilities.sequencers
+local textlineactions = resolvers.openers.helpers.textlineactions
+local setmetatableindex = table.setmetatableindex
--[[ldx--
<p>We will hook regime handling code into the input methods.</p>
--ldx]]--
-function regimes.number(n)
- if type(n) == "string" then return tonumber(n,16) else return n end
+local trace_translating = false trackers.register("regimes.translating", function(v) trace_translating = v end)
+
+local report_loading = logs.reporter("regimes","loading")
+local report_translating = logs.reporter("regimes","translating")
+
+regimes = regimes or { }
+local regimes = regimes
+
+local mapping = {
+ utf = false
+}
+
+local synonyms = { -- backward compatibility list
+
+ ["windows-1250"] = "cp1250",
+ ["windows-1251"] = "cp1251",
+ ["windows-1252"] = "cp1252",
+ ["windows-1253"] = "cp1253",
+ ["windows-1254"] = "cp1254",
+ ["windows-1255"] = "cp1255",
+ ["windows-1256"] = "cp1256",
+ ["windows-1257"] = "cp1257",
+ ["windows-1258"] = "cp1258",
+
+ ["il1"] = "8859-1",
+ ["il2"] = "8859-2",
+ ["il3"] = "8859-3",
+ ["il4"] = "8859-4",
+ ["il5"] = "8859-9",
+ ["il6"] = "8859-10",
+ ["il7"] = "8859-13",
+ ["il8"] = "8859-14",
+ ["il9"] = "8859-15",
+ ["il10"] = "8859-16",
+
+ ["iso-8859-1"] = "8859-1",
+ ["iso-8859-2"] = "8859-2",
+ ["iso-8859-3"] = "8859-3",
+ ["iso-8859-4"] = "8859-4",
+ ["iso-8859-9"] = "8859-9",
+ ["iso-8859-10"] = "8859-10",
+ ["iso-8859-13"] = "8859-13",
+ ["iso-8859-14"] = "8859-14",
+ ["iso-8859-15"] = "8859-15",
+ ["iso-8859-16"] = "8859-16",
+
+ ["latin1"] = "8859-1",
+ ["latin2"] = "8859-2",
+ ["latin3"] = "8859-3",
+ ["latin4"] = "8859-4",
+ ["latin5"] = "8859-9",
+ ["latin6"] = "8859-10",
+ ["latin7"] = "8859-13",
+ ["latin8"] = "8859-14",
+ ["latin9"] = "8859-15",
+ ["latin10"] = "8859-16",
+
+ ["utf-8"] = "utf",
+ ["utf8"] = "utf",
+ [""] = "utf",
+
+ ["windows"] = "cp1252",
+
+}
+
+local currentregime = "utf"
+
+local function loadregime(mapping,regime)
+ local name = resolvers.findfile(format("regi-%s.lua",regime)) or ""
+ local data = name ~= "" and dofile(name)
+ if data then
+ vector = { }
+ for eightbit, unicode in next, data do
+ vector[char(eightbit)] = utfchar(unicode)
+ end
+ report_loading("vector '%s' is loaded",regime)
+ else
+ vector = false
+ report_loading("vector '%s' is unknown",regime)
+ end
+ mapping[regime] = vector
+ return vector
end
-function regimes.setsynonym(synonym,target)
- regimes.synonyms[synonym] = target
+setmetatableindex(mapping, loadregime)
+
+local function translate(line,regime)
+ if line and #line > 0 then
+ local map = mapping[regime and synonyms[regime] or regime or currentregime]
+ if map then
+ line = gsub(line,".",map)
+ end
+ end
+ return line
+end
+
+local function disable()
+ currentregime = "utf"
+ sequencers.disableaction(textlineactions,"regimes.process")
end
-function regimes.truename(regime)
- texsprint(ctxcatcodes,(regime and regimes.synonyms[synonym] or regime) or regimes.currentregime)
+local function enable(regime)
+ regime = synonyms[regime] or regime
+ if mapping[regime] == false then
+ disable()
+ else
+ currentregime = regime
+ sequencers.enableaction(textlineactions,"regimes.process")
+ end
end
-function regimes.load(regime)
- regime = regimes.synonyms[regime] or regime
- if not regimes.data[regime] then
- environment.loadluafile("regi-"..regime, 1.001)
- if regimes.data[regime] then
- regimes.utf[regime] = { }
- for k,v in next, regimes.data[regime] do
- regimes.utf[regime][char(k)] = utfchar(v)
- end
+regimes.translate = translate
+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.
+
+local level = 0
+
+function regimes.process(str)
+ if level == 0 then
+ str = translate(str,currentregime)
+ if trace_translating then
+ report_translating("utf: %s",str)
end
end
+ return str
+end
+
+function regimes.push()
+ level = level + 1
+ if trace_translating then
+ report_translating("pushing level: %s",level)
+ end
end
-function regimes.translate(line,regime)
- regime = regimes.synonyms[regime] or regime
- if regime and line then
- local rur = regimes.utf[regime]
- if rur then
- return (gsub(line,"(.)",rur)) -- () redundant
+function regimes.pop()
+ if level > 0 then
+ if trace_translating then
+ report_translating("popping level: %s",level)
end
+ level = level - 1
end
- return line
end
-function regimes.enable(regime)
- regime = regimes.synonyms[regime] or regime
- if regimes.data[regime] then
- regimes.currentregime = regime
- local translate = regimes.translate
- resolvers.install_text_filter('input',function(s)
- return translate(s,regime)
- end)
- else
- regimes.disable()
+sequencers.prependaction(textlineactions,"system","regimes.process")
+sequencers.disableaction(textlineactions,"regimes.process")
+
+-- interface:
+
+commands.enableregime = enable
+commands.disableregime = disable
+
+function commands.currentregime()
+ context(currentregime)
+end
+
+local stack = { }
+
+function commands.startregime(regime)
+ insert(stack,currentregime)
+ if trace_translating then
+ report_translating("start: '%s'",regime)
end
+ enable(regime)
end
-function regimes.disable()
- regimes.currentregime = "utf"
- resolvers.install_text_filter('input',nil)
+function commands.stopregime()
+ if #stack > 0 then
+ local regime = remove(stack)
+ if trace_translating then
+ report_translating("stop: '%s'",regime)
+ end
+ enable(regime)
+ end
end
+
+-- obsolete:
+--
+-- function regimes.setsynonym(synonym,target)
+-- synonyms[synonym] = target
+-- end
+--
+-- function regimes.truename(regime)
+-- return regime and synonyms[regime] or regime or currentregime
+-- end
+--
+-- function commands.trueregimename(regime)
+-- context(regimes.truename(regime))
+-- end
+--
+-- function regimes.load(regime)
+-- return mapping[synonyms[regime] or regime]
+-- end
diff --git a/Master/texmf-dist/tex/context/base/regi-ini.mkiv b/Master/texmf-dist/tex/context/base/regi-ini.mkiv
index db7a224ac9a..41f00142663 100644
--- a/Master/texmf-dist/tex/context/base/regi-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/regi-ini.mkiv
@@ -11,45 +11,39 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\unprotect
-
-%D First some initialization code:
-
\registerctxluafile{regi-ini}{1.001}
-%D \macros
-%D {currentregime}
-
-\def\currentregime{utf}
-
-%D \macros
-%D {defineregimesynonym,trueregimename}
-
-\unexpanded\def\defineregimesynonym
- {\dodoubleargument\dodefineregimesynonym}
-
-\def\dodefineregimesynonym[#1][#2]%
- {\ctxlua{regimes.setsynonym("#1","#2")}}
-
-\def\trueregimename#1%
- {\ctxlua{regimes.truename("#1")}}
-
-%D \macros
-%D {useregime}
-
-\def\useregime[#1]%
- {\processcommalist[#1]\douseregime}
-
-\def\douseregime#1%
- {\ctxlua{regimes.load("#1")}}
+\unprotect
%D \macros
-%D {enableregime,disableregime}
-
-\def\enableregime[#1]%
- {\edef\currentregime{\ctxlua{regimes.load("#1") regimes.enable("#1") regimes.truename()}}}
-
-\def\disableregime
- {\edef\currentregime{\ctxlua{regimes.disable()}}}
+%D {enableregime,disableregime,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()}}
+
+% D \macros
+% D {defineregimesynonym,trueregimename}
+%
+% \unexpanded\def\defineregimesynonym % more or less obsolete
+% {\dodoubleargument\dodefineregimesynonym}
+%
+% \def\dodefineregimesynonym[#1][#2]%
+% {\ctxlua{regimes.setsynonym("#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]{}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/regi-syn.tex b/Master/texmf-dist/tex/context/base/regi-syn.mkii
index 7a8a9c146ca..7a8a9c146ca 100644
--- a/Master/texmf-dist/tex/context/base/regi-syn.tex
+++ b/Master/texmf-dist/tex/context/base/regi-syn.mkii
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 a55eb95f18d..e4927814cea 100644
--- a/Master/texmf-dist/tex/context/base/s-abr-01.tex
+++ b/Master/texmf-dist/tex/context/base/s-abr-01.tex
@@ -19,10 +19,11 @@
\protect
-\logo [MKI] {MkI}
+\logo [MKI] {MkI} % joke
\logo [MKII] {MkII}
-\logo [MKIII] {MkIII}
+\logo [MKIII] {MkIII} % joke
\logo [MKIV] {MkIV}
+\logo [MKVI] {MkVI}
%logo [FGA] {fga}
%logo [FGBBS] {fgbbs}
@@ -51,6 +52,7 @@
\logo [CID] {cid}
\logo [CJK] {cjk}
\logo [CMR] {cmr}
+\logo [CLD] {cld}
\logo [CMYK] {cmyk}
\logo [CODHOST] {CodHost}
\logo [CONTEXT] {\ConTeXt}
@@ -74,6 +76,7 @@
\logo [DVIPSONE] {dvipsone}
\logo [DVISCR] {dviscr}
\logo [DVIWINDO] {dviwindo}
+\logo [EBCDIC] {ebcdic}
\logo [EC] {ec}
\logo [EIFFEL] {Eiffel}
\logo [EMACS] {emacs}
@@ -92,6 +95,7 @@
\logo [EXAMPLET] {examplet}
\logo [EXAMPLEX] {examplex}
\logo [EXIMPLE] {eXiMpLe}
+\logo [FLAC] {flac}
\logo [FAQ] {faq}
\logo [FDF] {fdf}
\logo [FONTFORGE] {FontForge}
@@ -155,6 +159,7 @@
\logo [MPTOPDF] {mptopdf}
\logo [MPLIB] {mplib}
\logo [MSDOS] {msdos}
+\logo [MICROSOFT] {MicroSoft}
\logo [MSWINDOWS] {MS~Windows}
\logo [MTXRUN] {mtxrun}
\logo [MTXTOOLS] {mtxtools}
@@ -287,33 +292,36 @@
\def\SystemSpecialA#1{$\langle\it#1\rangle$}
\def\SystemSpecialB#1{{\tttf<#1>}}
-\def\CATCODE {\SystemSpecialA{catcode}}
-\def\CATCODES {\SystemSpecialA{catcodes}}
-\def\DIMENSION {\SystemSpecialA{dimension}}
-\def\DIMENSIONS {\SystemSpecialA{dimensions}}
-\def\COUNTER {\SystemSpecialA{counter}}
-\def\COUNTERS {\SystemSpecialA{counters}}
-\def\HBOX {\SystemSpecialA{hbox}}
-\def\HBOXES {\SystemSpecialA{hboxes}}
-\def\VBOX {\SystemSpecialA{vbox}}
-\def\VBOXES {\SystemSpecialA{vboxes}}
-\def\BOX {\SystemSpecialA{box}}
-\def\BOXES {\SystemSpecialA{boxes}}
-\def\TOKENLIST {\SystemSpecialA{token list}}
-\def\TOKENLISTS {\SystemSpecialA{token lists}}
-\def\NEWLINE {\SystemSpecialA{newline}}
-\def\SKIP {\SystemSpecialA{skip}}
-\def\SKIPS {\SystemSpecialA{skips}}
-\def\MUSKIP {\SystemSpecialA{muskip}}
-\def\MUSKIPS {\SystemSpecialA{muskips}}
-\def\MARK {\SystemSpecialA{mark}}
-\def\MARKS {\SystemSpecialA{marks}}
+\unexpanded\def\CATCODE {\SystemSpecialA{catcode}}
+\unexpanded\def\CATCODES {\SystemSpecialA{catcodes}}
+\unexpanded\def\DIMENSION {\SystemSpecialA{dimension}}
+\unexpanded\def\DIMENSIONS {\SystemSpecialA{dimensions}}
+\unexpanded\def\COUNTER {\SystemSpecialA{counter}}
+\unexpanded\def\COUNTERS {\SystemSpecialA{counters}}
+\unexpanded\def\HBOX {\SystemSpecialA{hbox}}
+\unexpanded\def\HBOXES {\SystemSpecialA{hboxes}}
+\unexpanded\def\VBOX {\SystemSpecialA{vbox}}
+\unexpanded\def\VBOXES {\SystemSpecialA{vboxes}}
+\unexpanded\def\BOX {\SystemSpecialA{box}}
+\unexpanded\def\BOXES {\SystemSpecialA{boxes}}
+\unexpanded\def\TOKENLIST {\SystemSpecialA{token list}}
+\unexpanded\def\TOKENLISTS {\SystemSpecialA{token lists}}
+\unexpanded\def\NEWLINE {\SystemSpecialA{newline}}
+\unexpanded\def\SKIP {\SystemSpecialA{skip}}
+\unexpanded\def\SKIPS {\SystemSpecialA{skips}}
+\unexpanded\def\MUSKIP {\SystemSpecialA{muskip}}
+\unexpanded\def\MUSKIPS {\SystemSpecialA{muskips}}
+\unexpanded\def\MARK {\SystemSpecialA{mark}}
+\unexpanded\def\MARKS {\SystemSpecialA{marks}}
-\def\SPACE {\SystemSpecialB{space}}
-\def\EOF {\SystemSpecialB{eof}}
-\def\TAB {\SystemSpecialB{tab}}
-\def\NEWPAGE {\SystemSpecialB{newpage}}
-\def\NEWLINE {\SystemSpecialB{newline}}
+\unexpanded\def\SPACE {\SystemSpecialB{space}}
+\unexpanded\def\EOF {\SystemSpecialB{eof}}
+\unexpanded\def\TAB {\SystemSpecialB{tab}}
+\unexpanded\def\NEWPAGE {\SystemSpecialB{newpage}}
+\unexpanded\def\NEWLINE {\SystemSpecialB{newline}}
+
+\unexpanded\def\LUWATEEKH {لُواتيخ} % kh ī t ā w [u] l
+\unexpanded\def\luwateekh {luwātīkh}
\doifmodeelse {mkiv} {
\unexpanded\def\THANH{H\agrave n Th\ecircumflexacute\ Th\agrave nh}
diff --git a/Master/texmf-dist/tex/context/base/s-abr-04.tex b/Master/texmf-dist/tex/context/base/s-abr-04.tex
new file mode 100644
index 00000000000..98e76c86fc3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-abr-04.tex
@@ -0,0 +1,321 @@
+%D \module
+%D [ file=s-abr-01,
+%D version=1996.01.01,
+%D title=\CONTEXT\ Style File,
+%D subtitle=General Abbreviations 1,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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
+
+% \setupsorting[logo][\c!style=\v!capital]
+
+% \setupcapitals[\c!title=\v!no]
+
+\protect
+
+\logo [MKI] {MkI}
+\logo [MKII] {MkII}
+\logo [MKIII] {MkIII}
+\logo [MKIV] {MkIV}
+
+%logo [FGA] {fga}
+%logo [FGBBS] {fgbbs}
+\logo [ACROBAT] {Acro\-bat}
+\logo [AFM] {afm}
+\logo [API] {api}
+\logo [ALEPH] {Aleph} % {\mathematics{\aleph}}
+\logo [ALGOL] {ALGOL}
+\logo [AMS] {ams}
+\logo [AMSLATEX] {AmS\LATEX}
+\logo [AMSTEX] {AmS\TeX}
+\logo [ANSI] {ansi}
+\logo [ARABTEX] {Arab\TeX}
+\logo [ASCII] {ascii}
+\logo [ASCIITEX] {ascii\TeX}
+\logo [BACHOTEX] {Bacho\TeX}
+\logo [BIBTEX] {bib\TeX}
+\logo [BLUESKY] {BlueSky}
+\logo [BMP] {bmp}
+\logo [BSD] {bsd}
+\logo [CCODE] {c}
+\logo [CALCMATH] {CalcMath}
+\logo [CD] {cd}
+\logo [CPU] {cpu}
+\logo [CDROM] {cdrom}
+\logo [CID] {cid}
+\logo [CJK] {cjk}
+\logo [CMR] {cmr}
+\logo [CMYK] {cmyk}
+\logo [CODHOST] {CodHost}
+\logo [CONTEXT] {Con{\TeX}t}
+\logo [CSS] {css}
+\logo [CTAN] {ctan}
+\logo [CTXTOOLS] {ctxtools}
+\logo [CWEB] {cweb}
+\logo [DANTE] {Dante}
+\logo [DISTILLER] {distiller}
+\logo [DRATEX] {Dra\TeX}
+\logo [DSC] {dsc}
+\logo [DTD] {dtd}
+\logo [DTK] {dtk}
+\logo [DTP] {dtp}
+\logo [DVD] {dvd}
+\logo [DVI] {dvi}
+\logo [DVIPDFM] {dvipdfm}
+\logo [DVIPDFMX] {dvipdfmx}
+\logo [DVIPOS] {dvipos}
+\logo [DVIPS] {dvips}
+\logo [DVIPSONE] {dvipsone}
+\logo [DVISCR] {dviscr}
+\logo [DVIWINDO] {dviwindo}
+\logo [EC] {ec}
+\logo [EIFFEL] {Eiffel}
+\logo [EMACS] {emacs}
+\logo [EMTEX] {em\TeX}
+\logo [ENCODING] {enc}
+\logo [ENCTEX] {enc\TeX}
+\logo [EPS] {eps}
+\logo [ETEX] {\eTeX}
+\logo [EUROBACHOTEX] {EuroBacho\TeX}
+\logo [EUROMATH] {EuroMath}
+\logo [EUROTEX] {Euro\TeX}
+\logo [EXAMPLE] {eXaMpLe}
+\logo [EXAMPLED] {exampled}
+\logo [EXAMPLEQ] {exampleq}
+\logo [EXAMPLER] {exampler}
+\logo [EXAMPLET] {examplet}
+\logo [EXAMPLEX] {examplex}
+\logo [EXIMPLE] {eXiMpLe}
+\logo [FAQ] {faq}
+\logo [FDF] {fdf}
+\logo [FONTFORGE] {FontForge}
+\logo [FOXET] {foXet}
+\logo [FPTEX] {fp\TeX}
+\logo [FREEBSD] {FreeBSD}
+\logo [FTP] {ftp}
+\logo [GHOSTSCRIPT]{Ghost\-script}
+\logo [GHOSTVIEW] {Ghost\-view}
+\logo [GIF] {gif}
+\logo [GNU] {gnu}
+\logo [GNUPLOT] {gnuplot}
+\logo [GS] {Ghost\-Script}
+\logo [GUST] {Gust}
+\logo [GWTEX] {gw\TeX}
+\logo [HSB] {hsb}
+\logo [HTML] {html}
+\logo [HTTP] {http}
+\logo [HZ] {hz}
+\logo [IBM] {ibm}
+\logo [IMAGEMAGICK]{ImageMagick}
+\logo [INITEX] {ini\TeX}
+\logo [INRSTEX] {inrs\TeX}
+\logo [IO] {io}
+\logo [IRCNET] {IRCnet}
+\logo [ISO] {iso}
+\logo [JAVA] {Java}
+\logo [JAVASCRIPT] {Java\-Script}
+\logo [JPEG] {jpeg}
+\logo [JPG] {jpg}
+\logo [KPATHSEA] {kpathsea}
+\logo [KPSE] {kpse}
+\logo [KPSEWHICH] {kpsewhich}
+\logo [MKTEXLSR] {mktexlsr}
+\logo [LAMSTEX] {LamS\TeX}
+\logo [LATEX] {La\TeX}
+\logo [LATEXTE] {La\TeX2e}
+\logo [LATEXTN] {La\TeX2.09}
+\logo [LINUX] {linux}
+\logo [LISP] {Lisp}
+\logo [LPEG] {lpeg}
+\logo [LUA] {Lua}
+\logo [LUAJIT] {LuaJIT}
+\logo [LUATEX] {Lua\TeX}
+\logo [LUATOOLS] {luatools}
+\logo [MACOSX] {MacOSX}
+\logo [MACROTEX] {Macro\TeX}
+\logo [MAKEMPY] {MakeMPY}
+\logo [MAPPING] {map}
+\logo [MAPS] {Maps}
+\logo [MATHML] {MathML}
+\logo [METAFONT] {MetaFont}
+\logo [METAPOST] {MetaPost}
+\logo [METATEX] {Meta\TeX}
+\logo [MIKTEX] {Mik\TeX}
+\logo [MLTEX] {ml\TeX}
+\logo [METATYPE] {MetaType1}
+\logo [MODULA] {Modula}
+\logo [MOV] {mov}
+\logo [MPS] {mps}
+\logo [MPTOPDF] {mptopdf}
+\logo [MPLIB] {MPlib}
+\logo [MSDOS] {msdos}
+\logo [MSWINDOWS] {MS~Windows}
+\logo [MTXRUN] {mtxrun}
+\logo [MTXTOOLS] {mtxtools}
+\logo [NETPBM] {NetPBM}
+\logo [NTG] {ntg}
+\logo [NTS] {nts}
+\logo [OFM] {ofm}
+\logo [OMEGA] {Omega}
+\logo [OPENMATH] {OpenMath}
+\logo [OPENTYPE] {OpenType}
+\logo [OPI] {opi}
+\logo [OTF] {otf}
+\logo [OTP] {otp}
+\logo [OVF] {ovf}
+\logo [PASCAL] {Pascal}
+\logo [PCTEX] {pc\TeX}
+\logo [PDF] {pdf}
+\logo [PDFETEX] {pdfe\TeX}
+\logo [PDFTEX] {pdf\TeX}
+\logo [PDFTOOLS] {pdftools}
+\logo [PDFTOPS] {pdftops}
+\logo [PERL] {Perl}
+\logo [PERLTK] {Perl/Tk}
+\logo [PICTEX] {\PiCTeX}
+\logo [PK] {pk}
+\logo [PLAIN] {Plain}
+\logo [PNG] {png}
+\logo [POSIX] {posix}
+\logo [POSTSCRIPT] {Post\-Script}
+\logo [PPCHTEX] {\PPCHTeX}
+\logo [PRAGMA] {Pragma ADE}
+\logo [PRESS] {press}
+\logo [PRIFIL] {prifil}
+\logo [PS] {Post\-Script}
+\logo [PSCHECK] {pscheck}
+\logo [PSTOEDIT] {pstoedit}
+\logo [PSTOPAGE] {pstopage}
+\logo [PSTOPDF] {pstopdf}
+\logo [PSTRICKS] {pstricks}
+\logo [RAM] {ram}
+\logo [READER] {Acro\-bat Reader}
+\logo [RELAXNG] {Relax\kern.125emNG}
+\logo [RGB] {rgb}
+\logo [RLXTOOLS] {rlxtools}
+\logo [RUBY] {Ruby}
+\logo [SCITE] {SciTE}
+\logo [SGML] {sgml}
+\logo [SI] {si}
+\logo [SQL] {sql}
+\logo [TABLE] {\TaBlE}
+\logo [TCPIP] {tcp/ip}
+\logo [TDS] {tds} % no sc te
+\logo [TETEX] {te\TeX} % no sc te
+\logo [TEX] {\TeX}
+\logo [TEXADRES] {\TeX adress}
+\logo [TEXBASE] {\TeX base}
+\logo [TEXEDIT] {\TeX edit}
+\logo [TEXEXEC] {\TeX exec}
+\logo [TEXFONT] {\TeX font}
+\logo [TEXFORM] {\TeX form}
+\logo [TEXLIVE] {\TeX Live}
+\logo [TEXLUA] {\TeX Lua}
+\logo [TEXMF] {texmf}
+\logo [TEXMFSTART] {texmfstart}
+\logo [TEXNL] {tex-nl}
+\logo [TEXSHOW] {\TeX show}
+\logo [TEXSPELL] {\TeX spell}
+\logo [TEXGYRE] {\TeX\ Gyre}
+\logo [TEXSYNC] {texsync}
+\logo [TEXTMATE] {TextMate}
+\logo [TEXTOOLS] {\TeX tools}
+\logo [TEXUTIL] {\TeX util}
+\logo [TEXWORK] {\TeX work}
+\logo [TEXXET] {\TeX\XeT} \def\XeT{XeT}
+\logo [TFM] {tfm}
+\logo [TIF] {tif}
+\logo [TIFF] {tiff}
+\logo [TIFFINFO] {tiffinfo}
+\logo [TIFFTAGS] {tifftags}
+\logo [TMFTOOLS] {tmftools}
+\logo [TPIC] {tpic}
+\logo [TPM] {tpm}
+\logo [TRUETYPE] {TrueType}
+\logo [TTF] {ttf}
+\logo [TUG] {tug}
+\logo [TUGBOAT] {Tug\-Boat}
+\logo [TUGNEWS] {Tug\-News}
+\logo [TYPEONE] {Type1}
+\logo [UCS] {ucs}
+\logo [UNICODE] {Uni\-code}
+\logo [UNIX] {Unix}
+\logo [URI] {uri}
+\logo [URL] {url}
+\logo [USA] {usa}
+\logo [USENET] {usenet}
+\logo [UTF] {utf}
+\logo [UTF] {utf}
+\logo [VF] {vf}
+\logo [WDT] {wdt}
+\logo [WEB] {web}
+\logo [WEBC] {web2c}
+\logo [WIKI] {Wiki}
+\logo [WINDOWS] {Windows}
+\logo [WINNT] {WinNT}
+\logo [WINNX] {Win9x}
+\logo [WWW] {www}
+\logo [WYSIWYG] {wysiwyg}
+\logo [XDVI] {Xdvi}
+\logo [XETEX] {\XeTeX}
+\logo [XFDF] {xfdf}
+\logo [XHTML] {xhtml}
+\logo [XINDY] {Xindy}
+\logo [XML] {xml}
+\logo [XPATH] {xpath}
+\logo [XMLTOOLS] {xmltools}
+\logo [XPDFETEX] {xpdfe\TeX}
+\logo [XSL] {xsl}
+\logo [XSLFO] {xsl-fo}
+\logo [XSLT] {xslt}
+\logo [XSLTPROC] {xsltproc}
+\logo [XYPIC] {XYPIC} % wrong logo
+\logo [YandY] {y\&y}
+\logo [ZIP] {zip}
+
+\def\METAFUN {\MetaFun}
+
+\logo [METAFUN] {\MetaFun}
+
+\def\SystemSpecialA#1{$\langle\it#1\rangle$}
+\def\SystemSpecialB#1{{\tttf<#1>}}
+
+\def\CATCODE {\SystemSpecialA{catcode}}
+\def\CATCODES {\SystemSpecialA{catcodes}}
+\def\DIMENSION {\SystemSpecialA{dimension}}
+\def\DIMENSIONS {\SystemSpecialA{dimensions}}
+\def\COUNTER {\SystemSpecialA{counter}}
+\def\COUNTERS {\SystemSpecialA{counters}}
+\def\HBOX {\SystemSpecialA{hbox}}
+\def\HBOXES {\SystemSpecialA{hboxes}}
+\def\VBOX {\SystemSpecialA{vbox}}
+\def\VBOXES {\SystemSpecialA{vboxes}}
+\def\BOX {\SystemSpecialA{box}}
+\def\BOXES {\SystemSpecialA{boxes}}
+\def\TOKENLIST {\SystemSpecialA{token list}}
+\def\TOKENLISTS {\SystemSpecialA{token lists}}
+\def\NEWLINE {\SystemSpecialA{newline}}
+\def\SKIP {\SystemSpecialA{skip}}
+\def\SKIPS {\SystemSpecialA{skips}}
+\def\MUSKIP {\SystemSpecialA{muskip}}
+\def\MUSKIPS {\SystemSpecialA{muskips}}
+\def\MARK {\SystemSpecialA{mark}}
+\def\MARKS {\SystemSpecialA{marks}}
+
+\def\SPACE {\SystemSpecialB{space}}
+\def\EOF {\SystemSpecialB{eof}}
+\def\TAB {\SystemSpecialB{tab}}
+\def\NEWPAGE {\SystemSpecialB{newpage}}
+\def\NEWLINE {\SystemSpecialB{newline}}
+
+\def\THANH {H\`an Th\^e\llap{\raise 0.5ex\hbox{\'{}}} Th\`anh}
+
+\def\THANH {H\`an Th\ecircumflexacute\ Th\`anh}
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/s-cdr-01.tex b/Master/texmf-dist/tex/context/base/s-cdr-01.tex
index 80103936d4f..164d812856a 100644
--- a/Master/texmf-dist/tex/context/base/s-cdr-01.tex
+++ b/Master/texmf-dist/tex/context/base/s-cdr-01.tex
@@ -11,6 +11,10 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+\startmodule[cdr-01]
+
+\setupmodule[cdr-01][option=]
+
\def\PDFMPformoffset{20cm}
\definepapersize
@@ -57,39 +61,47 @@
\defineoverlay[leftcover] [\useMPgraphic{leftcover}]
\defineoverlay[rightcover][\useMPgraphic{rightcover}]
+\definecolor [cd-color] [s=0]
+\definemeasure[cd-linewidth][.4pt]
+
+\doif {\moduleparameter{cdr-01}{option}} {light} {
+ \definecolor [cd-color] [s=.85]
+ \definemeasure[cd-linewidth][.2pt]
+}
+
\startuseMPgraphic{leftcover}
StartPage ;
- pickup pencircle scaled .5pt ;
+ pickup pencircle scaled \measure{cd-linewidth} ;
draw
bottomboundary Page &
rightboundary Page &
- topboundary Page ;
+ topboundary Page withcolor \MPcolor{cd-color} ;
draw
bottomboundary (Page enlarged 3mm) &
rightboundary (Page enlarged 3mm) &
- topboundary (Page enlarged 3mm) dashed evenly ;
+ topboundary (Page enlarged 3mm) dashed evenly withcolor \MPcolor{cd-color} ;
StopPage ;
\stopuseMPgraphic
\startuseMPgraphic{rightcover}
StartPage ;
- pickup pencircle scaled .5pt ;
+ pickup pencircle scaled \measure{cd-linewidth} ;
draw
topboundary Page &
leftboundary Page &
- bottomboundary Page ;
+ bottomboundary Page withcolor \MPcolor{cd-color} ;
draw
topboundary (Page enlarged 3mm) &
leftboundary (Page enlarged 3mm) &
- bottomboundary (Page enlarged 3mm) dashed evenly ;
+ bottomboundary (Page enlarged 3mm) dashed evenly withcolor \MPcolor{cd-color} ;
draw
bottomboundary Page --
lrcorner Page shifted (-5mm,-1cm) --
- llcorner Page shifted ( 5mm,-1cm) -- cycle ;
+ llcorner Page shifted ( 5mm,-1cm) -- cycle withcolor \MPcolor{cd-color} ;
draw
topboundary Page --
ulcorner Page shifted ( 5mm, 1cm) --
- urcorner Page shifted (-5mm, 1cm) -- cycle ;
+ urcorner Page shifted (-5mm, 1cm) -- cycle withcolor \MPcolor{cd-color} ;
StopPage ;
setbounds currentpicture to Page ;
\stopuseMPgraphic
@@ -118,6 +130,8 @@
height=fit,
width=\textheight]
+\stopmodule
+
\doifnotmode{demo}{\endinput}
\starttext
diff --git a/Master/texmf-dist/tex/context/base/s-chi-00.tex b/Master/texmf-dist/tex/context/base/s-chi-00.mkii
index bec86f6d2f0..bec86f6d2f0 100644
--- a/Master/texmf-dist/tex/context/base/s-chi-00.tex
+++ b/Master/texmf-dist/tex/context/base/s-chi-00.mkii
diff --git a/Master/texmf-dist/tex/context/base/s-def-01.mkiv b/Master/texmf-dist/tex/context/base/s-def-01.mkiv
new file mode 100644
index 00000000000..c54cee764f3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-def-01.mkiv
@@ -0,0 +1,10 @@
+% yes or no
+
+\unprotect
+
+\startsetups defaults:frontpart:pagenumbers:roman
+ \definestructureconversionset[\c!frontpart:\c!pagenumber][][romannumerals]
+ \setupuserpagenumber[\c!way=\v!byblock]
+\stopsetups
+
+\protect
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-01.tex b/Master/texmf-dist/tex/context/base/s-fnt-01.mkii
index 69c8efab966..69c8efab966 100644
--- a/Master/texmf-dist/tex/context/base/s-fnt-01.tex
+++ b/Master/texmf-dist/tex/context/base/s-fnt-01.mkii
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-02.tex b/Master/texmf-dist/tex/context/base/s-fnt-02.mkii
index 69f976102b1..69f976102b1 100644
--- a/Master/texmf-dist/tex/context/base/s-fnt-02.tex
+++ b/Master/texmf-dist/tex/context/base/s-fnt-02.mkii
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv
new file mode 100644
index 00000000000..07f5d47299c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-fnt-10.mkiv
@@ -0,0 +1,163 @@
+%D \module
+%D [ file=s-fnt-01,
+%D version=2006.10.10, % guess
+%D title=\CONTEXT\ Style File,
+%D subtitle=Listing Glyphs in Large Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startluacode
+local fontdata = fonts.hashes.identifiers
+
+-- function fonts.tracers.show_all()
+-- local tfmdata = fontdata[font.current()]
+-- if tfmdata and tfmdata.shared then
+-- local NC, NR, char = context.NC, context.NR, context.char
+-- context.starttabulate { "|l|r|c|" }
+-- for unicode, description in fonts.iterators.characters(tfmdata) do
+-- NC() context(description.name) NC() context(unicode) NC() char(unicode) NC() NR()
+-- end
+-- context.stoptabulate()
+-- end
+-- end
+
+function fonts.tracers.show_all()
+ local tfmdata = fontdata[font.current()]
+ if tfmdata then
+ local NC, NR, HL, char, bold, tttf = context.NC, context.NR, context.HL, context.char, context.bold, context.tttf
+ local descriptions = tfmdata.descriptions or { }
+ local data = characters.data
+ -- context.setuptabulate { header = "repeat" }
+ context.starttabulatehead()
+ NC() bold("unicode")
+ NC() bold("visual")
+ NC() bold("index")
+ NC() bold("glyph")
+ NC() bold("adobe")
+ NC() bold("context")
+ NC() NR()
+ context.stoptabulatehead()
+ context.starttabulate { "|l|c|l|p|p|p|" }
+ for unicode, chr in fonts.iterators.characters(tfmdata) do
+ local des, dat = descriptions[unicode], data[unicode]
+ local index = chr.index or 0
+ local cname = (dat and dat.contextname) or ""
+ local aname = (dat and dat.adobename) or ""
+ local gname = (des and des.name) or ""
+ local mname = dat and dat.mathname
+ if type(mname) ~= "string" then
+ mname = ""
+ end
+ local mspec = dat and dat.mathspec
+ if mspec then
+ for m=1,#mspec do
+ local n = mspec[m].name
+ if n then
+ if mname == "" then
+ mname = n
+ else
+ mname = mname .. " " .. n
+ end
+ end
+ end
+ end
+ if mname ~= "" then
+ mname = "m: " .. mname
+ if cname ~= "" then
+ cname = cname .. " " .. mname
+ else
+ cname = mname
+ end
+ end
+ NC() tttf() context("U+%05X",unicode)
+ NC() char(unicode)
+ NC() tttf() context("%05X",index)
+ NC() tttf() context(gname)
+ NC() tttf() context(aname)
+ NC() tttf() context(cname)
+ NC() NR()
+ end
+ context.stoptabulate()
+ else
+ context("problems")
+ end
+end
+
+function fonts.tracers.show_glyphs()
+ local tfmdata = fontdata[font.current()]
+ if tfmdata then
+ for unicode, chr in fonts.iterators.characters(tfmdata) do
+ context.showglyph(unicode)
+ end
+ end
+end
+\stopluacode
+
+\def\ShowCompleteFont#1#2#3%
+ {\bgroup
+ \page
+ \font\TestFont=#1 at #2
+ \setuplayout[style=\TestFont]
+ \setupheadertexts[]
+ \setupfootertexts[#1 -- \pagenumber]
+ \setupfootertexts[pagenumber]
+ \setuplayout[width=middle,height=middle,topspace=1cm,backspace=1cm]
+ \TestFont
+ \nonknuthmode
+ \startcolumns[n=#3]
+ \TestFont
+ \ctxlua { fonts.tracers.show_all() }
+ \stopcolumns
+ \page
+ \egroup}
+
+\def\ShowAllGlyphs#1#2#3%
+ {\bgroup
+ \page
+ \def\showglyph##1{\dontleavehmode\strut\char##1\relax\par}
+ \font\TestFontA=#1 at 12pt
+ \font\TestFontB=#1 at #2
+ \setuplayout[style=\TestFontA]
+ \setupheadertexts[]
+ \setupfootertexts[#1 -- \pagenumber]
+ \setuplayout[width=middle,height=middle,topspace=1cm,backspace=1cm,header=1cm,footer=2cm]
+ \TestFontB \setupinterlinespace[line=1.2\dimexpr#2\relax] \raggedcenter
+ \nonknuthmode
+ \startcolumns[n=#3]
+ \TestFontB
+ \ctxlua { fonts.tracers.show_glyphs() }
+ \stopcolumns
+ \page
+ \egroup}
+
+% \doifnotmode{demo} {\endinput}
+
+\starttext
+
+\ShowCompleteFont{name:dejavusansmono}{10pt}{1}
+% \ShowCompleteFont{name:dejavuserif}{10pt}{2}
+% \ShowCompleteFont{name:officinasansbookitcregular}{10pt}{2}
+% \ShowCompleteFont{name:officinaserifbookitcregular}{10pt}{2}
+% \ShowCompleteFont{name:serpentineserifeflight}{10pt}{2}
+% \ShowCompleteFont{name:lmtypewriter10-regular}{10pt}{2}
+% \ShowCompleteFont{lt55485}{10pt}{2}
+% \ShowCompleteFont{lmr10}{10pt}{2}
+% \ShowCompleteFont{lbr}{10pt}{2}
+% \ShowCompleteFont{name:Cambria}{10pt}{2}
+% \ShowCompleteFont{name:CambriaMath}{10pt}{2}
+% \ShowCompleteFont{name:texgyrepagella-regular}{10pt}{2}
+% \ShowCompleteFont{name:texgyrechorus-mediumitalic}{10pt}{2}
+% \ShowAllGlyphs {name:texgyrepagella-regular} {48pt}{2}
+% \ShowAllGlyphs {name:texgyrechorus-mediumitalic}{48pt}{2}
+% \ShowCompleteFont{name:euler10-regular}{10pt}{2}
+
+% \ShowCompleteFont{name:palatinosansinformalcombold}{20pt}{2}
+% \ShowCompleteFont{name:palatinonovaregular}{11pt}{2}
+% \ShowCompleteFont{pirat.ttf}{12pt}{1}
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-10.tex b/Master/texmf-dist/tex/context/base/s-fnt-10.tex
deleted file mode 100644
index 216d9d2326e..00000000000
--- a/Master/texmf-dist/tex/context/base/s-fnt-10.tex
+++ /dev/null
@@ -1,163 +0,0 @@
-%D \module
-%D [ file=s-fnt-01,
-%D version=2006.10.10, % guess
-%D title=\CONTEXT\ Style File,
-%D subtitle=Listing Glyphs in Large Fonts,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\startluacode
-local format, sprint = string.format, tex.sprint
-
-function fonts.otf.show_all()
- local tfmdata = fonts.ids[font.current()]
- if tfmdata and tfmdata.shared then
- local otfdata = tfmdata.shared.otfdata
- if otfdata and otfdata.luatex then
- local unicodes = otfdata.luatex.unicodes
- sprint(tex.ctxcatcodes,format("\\starttabulate[|l|r|c|]"))
- for i, name in ipairs(table.sortedkeys(unicodes)) do
- local unicode = unicodes[name]
- if unicode >= 0 then
- sprint(tex.ctxcatcodes,format("\\NC %s \\NC %s \\NC \\char%s \\NC\\NR",name,unicode,unicode))
- end
- end
- sprint(tex.ctxcatcodes,format("\\stoptabulate"))
- end
- end
-end
-
-function fonts.show_all()
- local tfmdata = fonts.ids[font.current()]
- if tfmdata then
- local chars = tfmdata.characters
- local descs = tfmdata.descriptions or { }
- local data = characters.data
- sprint(tex.ctxcatcodes,format("\\setuptabulate[header=repeat]"))
- sprint(tex.ctxcatcodes,format("\\starttabulatehead"))
- sprint(tex.ctxcatcodes,"\\NC\\bf unicode\\NC\\bf visual\\NC\\bf index\\NC\\bf glyph\\NC\\bf adobe\\NC\\bf context\\NC\\NR")
- sprint(tex.ctxcatcodes,"\\HL")
- sprint(tex.ctxcatcodes,format("\\stoptabulatehead"))
- sprint(tex.ctxcatcodes,format("\\starttabulate[|l|c|l|p|p|p|]"))
- for k, unicode in ipairs(table.sortedkeys(chars)) do
--- for unicode, _ in table.sortedpairs(chars) do
- if unicode >= 0 then
- local chr, des, dat = chars[unicode], descs[unicode], data[unicode]
- local index = chr.index or 0
- local cname = (dat and dat.contextname) or ""
- local aname = (dat and dat.adobename) or ""
- local gname = (des and des.name) or ""
- local mname = dat and dat.mathname
- if type(mname) ~= "string" then
- mname = ""
- end
- local mspec = dat and dat.mathspec
- if mspec then
- for m=1,#mspec do
- local n = mspec[m].name
- if n then
- if mname == "" then
- mname = n
- else
- mname = mname .. " " .. n
- end
- end
- end
- end
- if mname ~= "" then
- mname = "m: " .. mname
- if cname ~= "" then
- cname = cname .. " " .. mname
- else
- cname = mname
- end
- end
- sprint(tex.ctxcatcodes,format("\\NC\\tttf U+%05X\\NC\\char%s\\NC\\tttf %05X\\NC\\tttf %s\\NC\\tttf %s\\NC\\tttf %s\\NC\\NR",unicode,unicode,index,gname,aname,cname))
- end
- end
- sprint(tex.ctxcatcodes,format("\\stoptabulate"))
- else
- sprint(tex.ctxcatcodes,"problems")
- end
-end
-
-function fonts.show_glyphs()
- local tfmdata = fonts.ids[font.current()]
- if tfmdata then
- local chars = tfmdata.characters
- for k, v in ipairs(table.sortedkeys(chars)) do
- if v >=0 then
- sprint(tex.ctxcatcodes,format("\\dontleavehmode{\\strut\\char%s}\\endgraf",v))
- end
- end
- end
-end
-\stopluacode
-
-\def\ShowCompleteFont#1#2#3%
- {\bgroup
- \page
- \font\TestFont=#1 at #2
- \setuplayout[style=\TestFont]
- \setupheadertexts[]
- \setupfootertexts[#1 -- \pagenumber]
- \setupfootertexts[pagenumber]
- \setuplayout[width=middle,height=middle,topspace=1cm,backspace=1cm]
- \TestFont
- \nonknuthmode
- \startcolumns[n=#3]
- \TestFont
- \ctxlua { fonts.show_all() }
- \stopcolumns
- \page
- \egroup}
-
-\def\ShowAllGlyphs#1#2#3%
- {\bgroup
- \page
- \font\TestFontA=#1 at 12pt
- \font\TestFontB=#1 at #2
- \setuplayout[style=\TestFontA]
- \setupheadertexts[]
- \setupfootertexts[#1 -- \pagenumber]
- \setuplayout[width=middle,height=middle,topspace=1cm,backspace=1cm,header=1cm,footer=2cm]
- \TestFontB \setupinterlinespace[line=1.2\dimexpr#2\relax] \raggedcenter
- \nonknuthmode
- \startcolumns[n=#3]
- \TestFontB
- \ctxlua { fonts.show_glyphs() }
- \stopcolumns
- \page
- \egroup}
-
-\endinput
-
-\starttext
-
-% \ShowCompleteFont{name:dejavusansmono}{10pt}{2}
-% \ShowCompleteFont{name:dejavuserif}{10pt}{2}
-% \ShowCompleteFont{name:officinasansbookitcregular}{10pt}{2}
-% \ShowCompleteFont{name:officinaserifbookitcregular}{10pt}{2}
-% \ShowCompleteFont{name:serpentineserifeflight}{10pt}{2}
-% \ShowCompleteFont{name:lmtypewriter10-regular}{10pt}{2}
-% \ShowCompleteFont{lt55485}{10pt}{2}
-% \ShowCompleteFont{lmr10}{10pt}{2}
-% \ShowCompleteFont{lbr}{10pt}{2}
-% \ShowCompleteFont{name:Cambria}{10pt}{2}
-% \ShowCompleteFont{name:CambriaMath}{10pt}{2}
-% \ShowCompleteFont{name:texgyrepagella-regular}{10pt}{2}
-% \ShowCompleteFont{name:texgyrechorus-mediumitalic}{10pt}{2}
-% \ShowAllGlyphs {name:texgyrepagella-regular} {48pt}{2}
-% \ShowAllGlyphs {name:texgyrechorus-mediumitalic}{48pt}{2}
-% \ShowCompleteFont{name:euler10-regular}{10pt}{2}
-
-% \ShowCompleteFont{name:palatinosansinformalcombold}{20pt}{2}
-% \ShowCompleteFont{name:palatinonovaregular}{11pt}{2}
-% \ShowCompleteFont{name:optimanovaltregular}{11pt}{2}
-
-\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-11.tex b/Master/texmf-dist/tex/context/base/s-fnt-11.mkiv
index 8f855cc7214..f2171ecd05a 100644
--- a/Master/texmf-dist/tex/context/base/s-fnt-11.tex
+++ b/Master/texmf-dist/tex/context/base/s-fnt-11.mkiv
@@ -26,19 +26,31 @@
function fonts.names.table(pattern,reload,all)
local t = fonts.names.list(pattern,reload)
if t then
- tex.sprint(tex.ctxcatcodes,"\\start\\nonknuthmode\\starttabulate[|T|T|T|T|T|]")
- tex.sprint(tex.ctxcatcodes,"\\NC hashname\\NC type\\NC fontname\\NC filename\\NC\\NR\\HL")
- for v,tv in table.sortedpairs(t) do
- local kind, name, file = tv[1], tv[2], tv[3]
- if all or v == string.lower(name) then
- if kind and name and file then
- tex.sprint(tex.ctxcatcodes,string.format("\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR",v,kind,name,file))
- else
- logs.report("font table", "skipping %s", v)
+ local NC, NR, HL = context.NC, context.NR, context.HL
+ context.start()
+ context.nonknuthmode()
+ context.starttabulate { "|T|T|T|T|T|" }
+ NC(false,hashname)
+ NC(false,type)
+ NC(false,fontname)
+ NC(false,filename)
+ NC() NR() HL()
+ for v,tv in table.sortedpairs(t) do
+ local kind, name, file = tv[1], tv[2], tv[3]
+ if all or v == string.lower(name) then
+ if kind and name and file then
+ NC(false,v)
+ NC(false,kind)
+ NC(false,name)
+ NC(false,file)
+ NC() NR()
+ else
+ logs.report("font table", "skipping %s", v)
+ end
+ end
end
- end
- end
- tex.sprint(tex.ctxcatcodes,"\\stoptabulate\\stop")
+ context.stoptabulate()
+ context.stop()
end
end
\stopluacode
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-20.tex b/Master/texmf-dist/tex/context/base/s-fnt-20.mkiv
index a57c0ba4758..a57c0ba4758 100644
--- a/Master/texmf-dist/tex/context/base/s-fnt-20.tex
+++ b/Master/texmf-dist/tex/context/base/s-fnt-20.mkiv
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-21.tex b/Master/texmf-dist/tex/context/base/s-fnt-21.mkiv
index dd8de398d0b..dd8de398d0b 100644
--- a/Master/texmf-dist/tex/context/base/s-fnt-21.tex
+++ b/Master/texmf-dist/tex/context/base/s-fnt-21.mkiv
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-23.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-23.mkiv
new file mode 100644
index 00000000000..1dc7367a462
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-fnt-23.mkiv
@@ -0,0 +1,290 @@
+%D \module
+%D [ file=s-fnt-23,
+%D version=2009.03.04,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Tracing Feature Application (3),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% last_data was written wrong so it needs checking
+
+\startluacode
+ local fontdata = fonts.hashes.identifiers
+ local otfhandler = fonts.handlers.otf --- will be moduledata
+
+ local last_data = nil
+
+ local format = string.format
+
+ function otfhandler.show_shape(n)
+ local tfmdata = fontdata[font.current()]
+ last_data = tfmdata
+ local charnum = tonumber(n)
+ if not charnum then
+ -- charnum = tfmdata.unicodes[n]
+ charnum = fonts.helpers.nametoslot(n)
+ end
+ local c = tfmdata.characters[charnum]
+ local d = tfmdata.descriptions[charnum]
+ local parameters = tfmdata.parameters
+ if d then
+ local factor = (parameters.size/parameters.units)*((7200/7227)/65536)
+ local llx, lly, urx, ury = unpack(d.boundingbox)
+ llx, lly, urx, ury = llx*factor, lly*factor, urx*factor, ury*factor
+ local width, italic = (d.width or 0)*factor, (d.italic or 0)*factor
+ local top_accent, bot_accent = (d.top_accent or 0)*factor, (d.bot_accent or 0)*factor
+ local anchors, math = d.anchors, d.math
+ context.startMPcode()
+ context("pickup pencircle scaled .25bp ; ")
+ context('picture p ; p := image(draw textext.drt("\\gray\\char%s");); draw p ;',charnum)
+ context('draw (%s,%s)--(%s,%s)--(%s,%s)--(%s,%s)--cycle withcolor green ;',llx,lly,urx,lly,urx,ury,llx,ury)
+ context('draw (%s,%s)--(%s,%s) withcolor green ;',llx,0,urx,0)
+ context('draw boundingbox p withcolor .2white withpen pencircle scaled .065bp ;')
+ context("defaultscale := 0.05 ; ")
+ -- inefficient but non critical
+ local function slant_1(v,dx,dy,txt,xsign,ysign,loc,labloc)
+ if #v > 0 then
+ local l = { }
+ for kk, vv in ipairs(v) do
+ local h, k = vv.height, vv.kern
+ if h and k then
+ l[#l+1] = format("((%s,%s) shifted (%s,%s))",xsign*k*factor,ysign*h*factor,dx,dy)
+ end
+ end
+ context("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled .25) withcolor .5white;", xsign*v[1].kern*factor,lly,dx,dy,l[1])
+ context("draw laddered (%s) withcolor .5white ;",table.concat(l,".."))
+ context("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled .25) withcolor .5white;", xsign*v[#v].kern*factor,ury,dx,dy,l[#l])
+ for k, v in ipairs(l) do
+ context("draw %s withcolor blue withpen pencircle scaled 1bp;",v)
+ end
+ end
+ end
+ local function slant_2(v,dx,dy,txt,xsign,ysign,loc,labloc)
+ if #v > 0 then
+ local l = { }
+ for kk, vv in ipairs(v) do
+ local h, k = vv.height, vv.kern
+ if h and k then
+ l[#l+1] = format("((%s,%s) shifted (%s,%s))",xsign*k*factor,ysign*h*factor,dx,dy)
+ end
+ end
+ if loc == "top" then
+ context('label.%s("\\type{%s}",%s shifted (0,-1bp)) ;',loc,txt,l[#l])
+ else
+ context('label.%s("\\type{%s}",%s shifted (0,2bp)) ;',loc,txt,l[1])
+ end
+ for kk, vv in ipairs(v) do
+ local h, k = vv.height, vv.kern
+ if h and k then
+ context('label.top("(%s,%s)",%s shifted (0,-2bp));',k,h,l[kk])
+ end
+ end
+ end
+ end
+ if math then
+ local kerns = math.kerns
+ if kerns then
+ for _, slant in ipairs { slant_1, slant_2 } do
+ for k,v in pairs(kerns) do
+ if k == "top_right" then
+ slant(v,width+italic,0,k,1,1,"top","ulft")
+ elseif k == "bottom_right" then
+ slant(v,width,0,k,1,1,"bot","lrt")
+ elseif k == "top_left" then
+ slant(v,0,0,k,-1,1,"top","ulft")
+ elseif k == "bottom_left" then
+ slant(v,0,0,k,-1,1,"bot","lrt")
+ end
+ end
+ end
+ end
+ end
+ local function show(x,y,txt)
+ local xx, yy = x*factor, y*factor
+ context("draw (%s,%s) withcolor blue withpen pencircle scaled 1bp;",xx,yy)
+ context('label.top("\\type{%s}",(%s,%s-2bp)) ;',txt,xx,yy)
+ context('label.bot("(%s,%s)",(%s,%s+2bp)) ;',x,y,xx,yy)
+ end
+ if anchors then
+ local a = anchors.baselig
+ if a then
+ for k, v in pairs(a) do
+ for kk, vv in ipairs(v) do
+ show(vv[1],vv[2],k .. ":" .. kk)
+ end
+ end
+ end
+ local a = anchors.mark
+ if a then
+ for k, v in pairs(a) do
+ show(v[1],v[2],k)
+ end
+ end
+ local a = anchors.basechar
+ if a then
+ for k, v in pairs(a) do
+ show(v[1],v[2],k)
+ end
+ end
+ local ba = anchors.centry
+ if a then
+ for k, v in pairs(a) do
+ show(v[1],v[2],k)
+ end
+ end
+ local a = anchors.cexit
+ if a then
+ for k, v in pairs(a) do
+ show(v[1],v[2],k)
+ end
+ end
+ end
+ if italic ~= 0 then
+ context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width,ury,width,ury)
+ context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width+italic,ury,width+italic,ury)
+ context('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue;',width,ury,width+italic,ury)
+ context('label.lft("\\type{%s}",(%s+2bp,%s-1bp));',"italic",width,ury)
+ context('label.rt("%s",(%s-2bp,%s-1bp));',d.italic,width+italic,ury)
+ end
+ if top_accent ~= 0 then
+ context('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',top_accent,ury,top_accent,ury)
+ context('label.bot("\\type{%s}",(%s,%s+1bp));',"top_accent",top_accent,ury)
+ context('label.top("%s",(%s,%s-1bp));',d.top_accent,top_accent,ury)
+ end
+ if bot_accent ~= 0 then
+ context('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',bot_accent,lly,bot_accent,lly)
+ context('label.top("\\type{%s}",(%s,%s-1bp));',"bot_accent",top_accent,ury)
+ context('label.bot("%s",(%s,%s+1bp));',d.bot_accent,bot_accent,lly)
+ end
+ context('draw origin withcolor red withpen pencircle scaled 1bp;')
+ context("setbounds currentpicture to boundingbox currentpicture enlarged 1bp ;")
+ context("currentpicture := currentpicture scaled 8 ;")
+ context.stopMPcode()
+ elseif c then
+ local factor = (7200/7227)/65536
+ context.startMPcode()
+ context("pickup pencircle scaled .25bp ; ")
+ context('picture p ; p := image(draw textext.drt("\\gray\\char%s");); draw p ;',charnum)
+ context('draw boundingbox p withcolor .2white withpen pencircle scaled .065bp ;')
+ context("defaultscale := 0.05 ; ")
+ local italic, top_accent, bot_accent = (c.italic or 0)*factor, (c.top_accent or 0)*factor, (c.bot_accent or 0)*factor
+ local width, height, depth = (c.width or 0)*factor, (c.height or 0)*factor, (c.depth or 0)*factor
+ local ury = height
+ if italic ~= 0 then
+ context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width,ury,width,ury)
+ context('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width+italic,ury,width+italic,ury)
+ context('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue;',width,ury,width+italic,height)
+ context('label.lft("\\type{%s}",(%s+2bp,%s-1bp));',"italic",width,height)
+ context('label.rt("%6.3f bp",(%s-2bp,%s-1bp));',italic,width+italic,height)
+ end
+ if top_accent ~= 0 then
+ context('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',top_accent,ury,top_accent,height)
+ context('label.bot("\\type{%s}",(%s,%s+1bp));',"top_accent",top_accent,height)
+ context('label.top("%6.3f bp",(%s,%s-1bp));',top_accent,top_accent,height)
+ end
+ if bot_accent ~= 0 then
+ context('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',bot_accent,lly,bot_accent,height)
+ context('label.top("\\type{%s}",(%s,%s-1bp));',"bot_accent",top_accent,height)
+ context('label.bot("%6.3f bp",(%s,%s+1bp));',bot_accent,bot_accent,height)
+ end
+ context('draw origin withcolor red withpen pencircle scaled 1bp;')
+ context("setbounds currentpicture to boundingbox currentpicture enlarged 1bp ;")
+ context("currentpicture := currentpicture scaled 8 ;")
+ context.stopMPcode()
+ else
+ context("no such shape: %s",n)
+ end
+ end
+ function otfhandler.show_all_shapes(start,stop)
+ local tfmdata = fontdata[font.current()]
+ last_data = tfmdata
+ start, stop = start or "\\startTEXpage\\gobbleoneargument", stop or "\\stopTEXpage"
+ local unicodes, descriptions = tfmdata.unicodes, tfmdata.descriptions
+ for unicode, description in fonts.iterators.descriptions(tfmdata) do
+ local name = description.name
+ context("%s{%s}%%",start,unicode)
+ context("\\writestatus{glyph}{U+%04X -> %s}%%",unicode,name)
+ otfhandler.show_shape(unicode)
+ context(stop)
+ end
+ end
+ function otfhandler.show_shape_field(unicode,name)
+ local tfmdata = last_data or fontdata[font.current()]
+ local d = tfmdata.descriptions[unicode]
+ if d then
+ if name == "unicode" then
+ context("U+%04X",unicode)
+ else
+ d = d[name]
+ if d then
+ context(d)
+ end
+ end
+ end
+ end
+\stopluacode
+
+\setupcolors
+ [state=start]
+
+\def\GetGlyphField#1#2%
+ {\ctxlua{fonts.handlers.otf.show_shape_field(#1,"#2")}}
+
+\def\StartShowGlyphShape#1%
+ {\startTEXpage
+ \nonknuthmode
+ \def\GlyphUnicode{#1}}
+
+\def\StopShowGlyphShape
+ {\par
+ \midaligned{\tttf\setstrut\strut\GetGlyphField\GlyphUnicode{unicode}: \GetGlyphField\GlyphUnicode{name}}%
+ \stopTEXpage}
+
+\def\ShowGlyphShape#1#2#3% name size glyph
+ {\begingroup
+ \definedfont[#1 at #2]%
+ \obeyMPboxdepth
+ \ctxlua{fonts.handlers.otf.show_shape("#3")}%
+ \endgroup}
+
+\def\ShowAllGlyphShapes#1#2% name size
+ {\begingroup
+ \nonknuthmode
+ \definedfont[#1 at #2]%
+ \ctxlua{fonts.handlers.otf.show_all_shapes("\\StartShowGlyphShape","\\StopShowGlyphShape")}%
+ \endgroup}
+
+\setupcolors
+ [state=start]
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+% \startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0x62A} \stopTEXpage
+% \startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0x2004} \stopTEXpage
+% \startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0xF0299} \stopTEXpage
+% \startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{NameMe.1190} \stopTEXpage
+
+% \ShowAllGlyphShapes{simplenaskhi}{100bp}
+% \ShowAllGlyphShapes{xits}{100bp}
+
+\switchtobodyfont[cambria,10pt]
+
+\startTEXpage[offset=10pt] \ShowGlyphShape{name:cambria-math} {40bp}{0x00066} \stopTEXpage
+\startTEXpage[offset=10pt] \ShowGlyphShape{name:cambria-math} {40bp}{0x1D453} \stopTEXpage
+\startTEXpage[offset=10pt] \ShowGlyphShape{name:cambria-math} {40bp}{0x1D43F} \stopTEXpage
+\startTEXpage[offset=10pt] \ShowGlyphShape{name:cambria-math}{100bp}{0x1D444} \stopTEXpage
+\startTEXpage[offset=10pt] \ShowGlyphShape{name:cambria-math}{100bp}{0x1D447} \stopTEXpage
+\startTEXpage[offset=10pt] \ShowGlyphShape{name:cambria-math}{100bp}{0x02112} \stopTEXpage
+\startTEXpage[offset=10pt] \ShowGlyphShape{name:cambria-math}{100bp}{0x1D432} \stopTEXpage
+\startTEXpage[offset=10pt] \ShowGlyphShape{name:cambria-math}{100bp}{0x1D43D} \stopTEXpage
+\startTEXpage[offset=10pt] \ShowGlyphShape{name:cambria-math}{100bp}{0x1D44A} \stopTEXpage
+\startTEXpage[offset=10pt] \ShowGlyphShape{name:cambria-math}{100bp}{0x1D45D} \stopTEXpage
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-23.tex b/Master/texmf-dist/tex/context/base/s-fnt-23.tex
deleted file mode 100644
index 096c8fbf5ed..00000000000
--- a/Master/texmf-dist/tex/context/base/s-fnt-23.tex
+++ /dev/null
@@ -1,272 +0,0 @@
-%D \module
-%D [ file=s-fnt-23,
-%D version=2009.03.04,
-%D title=\CONTEXT\ Style File,
-%D subtitle=Tracing Feature Application (3),
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\startluacode
- local last_data = nil
- local format = string.format
- local function tpf(...)
--- print("!!!!",...)
- tex.print(tex.ctxcatcodes,format(...))
- end
- function fonts.otf.show_shape(n)
- local tfmdata = fonts.ids[font.current()]
- lastdata = tfmdata
- local charnum = tonumber(n)
- if not charnum then
- charnum = tfmdata.unicodes[n]
- end
- local c = tfmdata.characters[charnum]
- local d = tfmdata.descriptions[charnum]
- if d then
- local factor = (tfmdata.size/tfmdata.units)*((7200/7227)/65536)
- local llx, lly, urx, ury = unpack(d.boundingbox)
- llx, lly, urx, ury = llx*factor, lly*factor, urx*factor, ury*factor
- local width, italic = (d.width or 0)*factor, (d.italic or 0)*factor
- local top_accent, bot_accent = (d.top_accent or 0)*factor, (d.bot_accent or 0)*factor
- local anchors, math = d.anchors, d.math
- tpf("\\startMPcode")
- tpf("pickup pencircle scaled .25bp ; ")
- tpf('picture p ; p := image(draw textext.drt("\\gray\\char%s");); draw p ;',charnum)
- tpf('draw (%s,%s)--(%s,%s)--(%s,%s)--(%s,%s)--cycle withcolor green ;',llx,lly,urx,lly,urx,ury,llx,ury)
- tpf('draw (%s,%s)--(%s,%s) withcolor green ;',llx,0,urx,0)
- tpf('draw boundingbox p withcolor .2white withpen pencircle scaled .065bp ;')
- tpf("defaultscale := 0.05 ; ")
- -- inefficient but non critical
- local function slant_1(v,dx,dy,txt,xsign,ysign,loc,labloc)
- if #v > 0 then
- local l = { }
- for kk, vv in ipairs(v) do
- local h, k = vv.height, vv.kern
- if h and k then
- l[#l+1] = format("((%s,%s) shifted (%s,%s))",xsign*k*factor,ysign*h*factor,dx,dy)
- end
- end
- tpf("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled .25) withcolor .5white;", xsign*v[1].kern*factor,lly,dx,dy,l[1])
- tpf("draw laddered (%s) withcolor .5white ;",table.concat(l,".."))
- tpf("draw ((%s,%s) shifted (%s,%s))--%s dashed (evenly scaled .25) withcolor .5white;", xsign*v[#v].kern*factor,ury,dx,dy,l[#l])
- for k, v in ipairs(l) do
- tpf("draw %s withcolor blue withpen pencircle scaled 1bp;",v)
- end
- end
- end
- local function slant_2(v,dx,dy,txt,xsign,ysign,loc,labloc)
- if #v > 0 then
- local l = { }
- for kk, vv in ipairs(v) do
- local h, k = vv.height, vv.kern
- if h and k then
- l[#l+1] = format("((%s,%s) shifted (%s,%s))",xsign*k*factor,ysign*h*factor,dx,dy)
- end
- end
- if loc == "top" then
- tpf('label.%s("\\type{%s}",%s shifted (0,-1bp)) ;',loc,txt,l[#l])
- else
- tpf('label.%s("\\type{%s}",%s shifted (0,2bp)) ;',loc,txt,l[1])
- end
- for kk, vv in ipairs(v) do
- local h, k = vv.height, vv.kern
- if h and k then
- tpf('label.top("(%s,%s)",%s shifted (0,-2bp));',k,h,l[kk])
- end
- end
- end
- end
- if math then
- local kerns = math.kerns
- if kerns then
- for _, slant in ipairs { slant_1, slant_2 } do
- for k,v in pairs(kerns) do
- if k == "top_right" then
- slant(v,width+italic,0,k,1,1,"top","ulft")
- elseif k == "bottom_right" then
- slant(v,width,0,k,1,1,"bot","lrt")
- elseif k == "top_left" then
- slant(v,0,0,k,-1,1,"top","ulft")
- elseif k == "bottom_left" then
- slant(v,0,0,k,-1,1,"bot","lrt")
- end
- end
- end
- end
- end
- local function show(x,y,txt)
- local xx, yy = x*factor, y*factor
- tpf("draw (%s,%s) withcolor blue withpen pencircle scaled 1bp;",xx,yy)
- tpf('label.top("\\type{%s}",(%s,%s-2bp)) ;',txt,xx,yy)
- tpf('label.bot("(%s,%s)",(%s,%s+2bp)) ;',x,y,xx,yy)
- end
- if anchors then
- local a = anchors.baselig
- if a then
- for k, v in pairs(a) do
- for kk, vv in ipairs(v) do
- show(vv[1],vv[2],k .. ":" .. kk)
- end
- end
- end
- local a = anchors.mark
- if a then
- for k, v in pairs(a) do
- show(v[1],v[2],k)
- end
- end
- local a = anchors.basechar
- if a then
- for k, v in pairs(a) do
- show(v[1],v[2],k)
- end
- end
- local ba = anchors.centry
- if a then
- for k, v in pairs(a) do
- show(v[1],v[2],k)
- end
- end
- local a = anchors.cexit
- if a then
- for k, v in pairs(a) do
- show(v[1],v[2],k)
- end
- end
- end
- if italic ~= 0 then
- tpf('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width,ury,width,ury)
- tpf('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width+italic,ury,width+italic,ury)
- tpf('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue;',width,ury,width+italic,ury)
- tpf('label.lft("\\type{%s}",(%s+2bp,%s-1bp));',"italic",width,ury)
- tpf('label.rt("%s",(%s-2bp,%s-1bp));',d.italic,width+italic,ury)
- end
- if top_accent ~= 0 then
- tpf('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',top_accent,ury,top_accent,ury)
- tpf('label.bot("\\type{%s}",(%s,%s+1bp));',"top_accent",top_accent,ury)
- tpf('label.top("%s",(%s,%s-1bp));',d.top_accent,top_accent,ury)
- end
- if bot_accent ~= 0 then
- tpf('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',bot_accent,lly,bot_accent,lly)
- tpf('label.top("\\type{%s}",(%s,%s-1bp));',"bot_accent",top_accent,ury)
- tpf('label.bot("%s",(%s,%s+1bp));',d.bot_accent,bot_accent,lly)
- end
- tpf('draw origin withcolor red withpen pencircle scaled 1bp;')
- tpf("setbounds currentpicture to boundingbox currentpicture enlarged 1bp ;")
- tpf("currentpicture := currentpicture scaled 8 ;")
- tpf("\\stopMPcode")
- elseif c then
- local factor = (7200/7227)/65536
- tpf("\\startMPcode")
- tpf("pickup pencircle scaled .25bp ; ")
- tpf('picture p ; p := image(draw textext.drt("\\gray\\char%s");); draw p ;',charnum)
- tpf('draw boundingbox p withcolor .2white withpen pencircle scaled .065bp ;')
- tpf("defaultscale := 0.05 ; ")
- local italic, top_accent, bot_accent = (c.italic or 0)*factor, (c.top_accent or 0)*factor, (c.bot_accent or 0)*factor
- local width, height, depth = (c.width or 0)*factor, (c.height or 0)*factor, (c.depth or 0)*factor
- local ury = height
- if italic ~= 0 then
- tpf('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width,ury,width,ury)
- tpf('draw (%s,%s-1bp)--(%s,%s-0.5bp) withcolor blue;',width+italic,ury,width+italic,ury)
- tpf('draw (%s,%s-1bp)--(%s,%s-1bp) withcolor blue;',width,ury,width+italic,height)
- tpf('label.lft("\\type{%s}",(%s+2bp,%s-1bp));',"italic",width,height)
- tpf('label.rt("%6.3f bp",(%s-2bp,%s-1bp));',italic,width+italic,height)
- end
- if top_accent ~= 0 then
- tpf('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',top_accent,ury,top_accent,height)
- tpf('label.bot("\\type{%s}",(%s,%s+1bp));',"top_accent",top_accent,height)
- tpf('label.top("%6.3f bp",(%s,%s-1bp));',top_accent,top_accent,height)
- end
- if bot_accent ~= 0 then
- tpf('draw (%s,%s+1bp)--(%s,%s-1bp) withcolor blue;',bot_accent,lly,bot_accent,height)
- tpf('label.top("\\type{%s}",(%s,%s-1bp));',"bot_accent",top_accent,height)
- tpf('label.bot("%6.3f bp",(%s,%s+1bp));',bot_accent,bot_accent,height)
- end
- tpf('draw origin withcolor red withpen pencircle scaled 1bp;')
- tpf("setbounds currentpicture to boundingbox currentpicture enlarged 1bp ;")
- tpf("currentpicture := currentpicture scaled 8 ;")
- tpf("\\stopMPcode")
- else
- tpf("no such shape: %s",n)
- end
- end
- function fonts.otf.show_all_shapes(start,stop)
- local tfmdata = fonts.ids[font.current()]
- lastdata = tfmdata
- start, stop = start or "\\startTEXpage\\gobbleoneargument", stop or "\\stopTEXpage"
- local unicodes, indices, descriptions = tfmdata.unicodes, tfmdata.indices, tfmdata.descriptions
- for _, unicode in next, table.sortedkeys(descriptions) do
- local d = descriptions[unicode]
- local name = d.name
- tpf("%s{%s}%%",start,unicode)
- tpf("\\writestatus{glyph}{U+%04X -> %s}%%",unicode,name)
- fonts.otf.show_shape(unicode)
- tpf(stop)
- end
- end
- function fonts.otf.show_shape_field(unicode,name)
- local tfmdata = lastdata or fonts.ids[font.current()]
- local d = tfmdata.descriptions[unicode]
- if d then
- if name == "unicode" then
- tpf("U+%04X",unicode)
- else
- d = d[name]
- if d then
- tpf(d)
- end
- end
- end
- end
-\stopluacode
-
-\setupcolors
- [state=start]
-
-\def\GetGlyphField#1#2%
- {\ctxlua{fonts.otf.show_shape_field(#1,"#2")}}
-
-\def\StartShowGlyphShape#1%
- {\startTEXpage
- \nonknuthmode
- \def\GlyphUnicode{#1}}
-
-\def\StopShowGlyphShape
- {\par
- \midaligned{\tttf\setstrut\strut\GetGlyphField\GlyphUnicode{unicode}: \GetGlyphField\GlyphUnicode{name}}%
- \stopTEXpage}
-
-\def\ShowGlyphShape#1#2#3% name size glyph
- {\begingroup
- \definedfont[#1 at #2]%
- \obeyMPboxdepth
- \ctxlua{fonts.otf.show_shape("#3")}%
- \endgroup}
-
-\def\ShowAllGlyphShapes#1#2% name size
- {\begingroup
- \nonknuthmode
- \definedfont[#1 at #2]%
- \ctxlua{fonts.otf.show_all_shapes("\\StartShowGlyphShape","\\StopShowGlyphShape")}%
- \endgroup}
-
-\setupcolors
- [state=start]
-
-\doifnotmode{demo}{\endinput}
-
-\starttext
-
-\startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0x62A} \stopTEXpage
-\startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0x2004} \stopTEXpage
-\startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{0xF0299} \stopTEXpage
-\startTEXpage \ShowGlyphShape{simplenaskhi}{100bp}{NameMe.1190} \stopTEXpage
-
-\ShowAllGlyphShapes{simplenaskhi}{100bp}
-
-\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-24.tex b/Master/texmf-dist/tex/context/base/s-fnt-24.mkiv
index 073588033e2..de485557b91 100644
--- a/Master/texmf-dist/tex/context/base/s-fnt-24.tex
+++ b/Master/texmf-dist/tex/context/base/s-fnt-24.mkiv
@@ -48,7 +48,7 @@ function fonts.analyzers.cjktest(first,second)
if (not first or first == "") or first == k then
for kk, vv in next, example do
if (not second or second == "") or second == kk then
- tex.sprint(tex.ctxcatcodes,string.format("\\ShowChineseCombiChar{%s}{%s}{%s}{%s}",v,vv,k,kk))
+ context.ShowChineseCombiChar(v,vv,k,kk)
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-25.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-25.mkiv
new file mode 100644
index 00000000000..159d8325d50
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-fnt-25.mkiv
@@ -0,0 +1,198 @@
+%D \module
+%D [ file=s-fnt-25,
+%D version=2009.01.25,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Math Glyph Checking,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\def\enableshowmathfontvirtual
+ {\ctxlua{fonts.constructors.autocleanup=false}}
+
+\def\showmathfontcharacters
+ {\dodoubleempty\doshowmathfontcharacters}
+
+\def\doshowmathfontcharacters[#1][#2]%
+ {\begingroup
+ \dontcomplain
+ \doifelsenothing{#1}
+ {\definedfont[MathRoman*math-text]}
+ {\definedfont[#1]}%
+ \doifelsenothing{#2}
+ {\ctxlua{document.showmathfont(font.current())}}
+ {\def\dodoshowmathfontcharacters##1{\ctxlua{document.showmathfont(font.current(),##1)}}%
+ \processcommalist[#2]\dodoshowmathfontcharacters}%
+ \endgroup}
+
+\def\startmathfontlist
+ {\startpacked}
+
+\def\stopmathfontlist
+ {\stoppacked}
+
+\def\startmathfontlistentry
+ {\blank
+ \begingroup}
+
+\def\stopmathfontlistentry
+ {\endgroup
+ \blank}
+
+\def\mathfontlistentryhexdectit#1#2#3%
+ {#1: \char#2\enspace\ruledhbox{\char#2}\enspace#3\par
+ \advance\leftskip 1em\relax}
+
+\def\mathfontlistentrywdhtdpic#1#2#3#4%
+ {width: #1, height: #2, depth: #3, italic: #4\par}
+
+\def\mathfontlistentryresource#1%
+ {virtual: #1\par}
+
+\def\mathfontlistentrynext#1#2%
+ {#1~\ruledhbox{\char#2}}
+
+\def\mathfontlistentrynextlist#1%
+ {next: #1\par}
+
+\def\fontlistentryvariants#1#2%
+ {#1~\ruledhbox{\char#2}}
+
+\def\mathfontlistentryvariantslist#1%
+ {variants: #1\par}
+
+\def\mathfontlistentrynextvariantslist#1#2%
+ {next: #1 => variants: #2\par}
+
+\def\mathfontlistentryclassname#1#2%
+ {mathclass: #1, mathname: #2\par}
+
+\def\mathfontlistentrysymbol#1#2%
+ {mathsymbol: #1~\ruledhbox{\char#2}\par}
+
+\startluacode
+local concat = table.concat
+local format, lower = string.format, string.lower
+
+local fontdata = fonts.hashes.identifiers
+
+function document.showmathfont(id,slot)
+ local data = characters.data
+ local tfmdata = fontdata[id]
+ local characters = tfmdata.characters
+ local sorted = (slot and { slot }) or table.sortedkeys(characters)
+ local virtual, names = tfmdata.properties.virtualized, { }
+ if virtual then
+ for k, v in ipairs(tfmdata.fonts) do
+ local id = v.id
+ local name = fontdata[id].properties.name
+ names[k] = (name and file.basename(name)) or id
+ end
+ end
+ local round = math.round
+ local limited = true
+ for _, s in next, sorted do
+ if not limited or s < 0xF0000 then
+ local char = characters[s]
+ if char then
+ local info = data[s]
+ local cnext, cvert_variants, choriz_variants = char.next, char.vert_variants, char.horiz_variants
+ context.startmathfontlistentry()
+ context.mathfontlistentryhexdectit(format("U+%05X",s),s,lower(info.description or "no description, private to font"))
+ context.mathfontlistentrywdhtdpic(round(char.width or 0),round(char.height or 0),round(char.depth or 0),round(char.italic or 0))
+ if virtual then
+ local commands = char.commands
+ if 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] = format("%s/%0X",names[fnt] or fnt,idx)
+ end
+ end
+ if #t > 0 then
+ context.mathfontlistentryresource(concat(t,", "))
+ end
+ end
+ end
+ if info.mathclass then
+ context.mathfontlistentryclassname(info.mathclass,info.mathname or "no name")
+ end
+ if info.mathspec then
+ for i=1,#info.mathspec do
+ context.mathfontlistentryclassname(info.mathspec[i].class,info.mathspec[i].name or "no name")
+ end
+ end
+ if info.mathsymbol then
+ context.mathfontlistentrysymbol(format("U+%05X",info.mathsymbol),info.mathsymbol)
+ end
+ if cnext then
+ local t, done = { }, { }
+ while cnext do
+ if done[cnext] then
+ t[#t+1] = "CYCLE"
+ break
+ else
+ done[cnext] = true
+ t[#t+1] = context.nested.mathfontlistentrynext(format("U+%05X",cnext),cnext)
+ cnext = characters[cnext]
+ cvert_variants = cnext.vert_variants or cvert_variants
+ choriz_variants = cnext.horiz_variants or choriz_variants
+ if cnext then
+ cnext = cnext.next
+ end
+ end
+ end
+ cnext = t
+ end
+ if cvert_variants then
+ local t = { }
+ for k, v in next, cvert_variants do
+ t[#t+1] = context.nested.fontlistentryvariants(format("U+%05X",v.glyph),v.glyph)
+ end
+ cvert_variants = t
+ end
+ if choriz_variants then
+ local t = { }
+ for k, v in next, choriz_variants do
+ t[#t+1] = context.nested.fontlistentryvariants(format("U+%05X",v.glyph),v.glyph)
+ end
+ choriz_variants = t
+ end
+ local cvariants = choriz_variants or cvert_variants
+ if cvariants and cnext then
+ context.mathfontlistentrynextvariantslist(concat(cnext," => "),concat(cvariants," => "))
+ else
+ if cnext then
+ context.mathfontlistentrynextlist(concat(cnext," => "))
+ end
+ if cvariants then
+ context.mathfontlistentryvariantslist(concat(cvariants," "))
+ end
+ end
+ context.stopmathfontlistentry()
+ end
+ end
+ end
+end
+\stopluacode
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+ \setupbodyfont[cambria, 12pt] \showmathfontcharacters
+% \setupbodyfont[lmvirtual,12pt] \showmathfontcharacters
+% \setupbodyfont[pxvirtual,12pt] \showmathfontcharacters
+% \setupbodyfont[txvirtual,12pt] \showmathfontcharacters
+% \setupbodyfont[palatino, 10pt] \showmathfontcharacters
+% \setupbodyfont[mathtimes,12pt] \showmathfontcharacters
+% \setupbodyfont[stix, 12pt] \showmathfontcharacters
+% \setupbodyfont[xits, 12pt] \showmathfontcharacters
+% \setupbodyfont[lucida, 12pt] \showmathfontcharacters
+\stoptext
+
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-25.tex b/Master/texmf-dist/tex/context/base/s-fnt-25.tex
deleted file mode 100644
index a8b398716c7..00000000000
--- a/Master/texmf-dist/tex/context/base/s-fnt-25.tex
+++ /dev/null
@@ -1,194 +0,0 @@
-%D \module
-%D [ file=s-fnt-25,
-%D version=2009.01.25,
-%D title=\CONTEXT\ Style File,
-%D subtitle=Math Glyph Checking,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\def\enableshowmathfontvirtual
- {\ctxlua{fonts.tfm.auto_cleanup=false}}
-
-\def\showmathfontcharacters
- {\dodoubleempty\doshowmathfontcharacters}
-
-\def\doshowmathfontcharacters[#1][#2]%
- {\begingroup
- \dontcomplain
- \doifelsenothing{#1}
- {\definedfont[MathRoman*math-text]}
- {\definedfont[#1]}%
- \doifelsenothing{#2}
- {\ctxlua{document.showmathfont(font.current())}}
- {\def\dodoshowmathfontcharacters##1{\ctxlua{document.showmathfont(font.current(),##1)}}%
- \processcommalist[#2]\dodoshowmathfontcharacters}%
- \endgroup}
-
-\def\startmathfontlist
- {\startpacked}
-
-\def\stopmathfontlist
- {\stoppacked}
-
-\def\startmathfontlistentry
- {\blank
- \begingroup}
-
-\def\stopmathfontlistentry
- {\endgroup
- \blank}
-
-\def\mathfontlistentryhexdectit#1#2#3%
- {#1: \char#2\enspace\ruledhbox{\char#2}\enspace#3\par
- \advance\leftskip 1em\relax}
-
-\def\mathfontlistentrywdhtdpic#1#2#3#4%
- {width: #1, height: #2, depth: #3, italic: #4\par}
-
-\def\mathfontlistentryresource#1%
- {virtual: #1\par}
-
-\def\mathfontlistentrynext#1#2%
- {#1~\ruledhbox{\char#2}}
-
-\def\mathfontlistentrynextlist#1%
- {next: #1\par}
-
-\def\fontlistentryvariants#1#2%
- {#1~\ruledhbox{\char#2}}
-
-\def\mathfontlistentryvariantslist#1%
- {variants: #1\par}
-
-\def\mathfontlistentrynextvariantslist#1#2%
- {next: #1 => variants: #2\par}
-
-\def\mathfontlistentryclassname#1#2%
- {mathclass: #1, mathname: #2\par}
-
-\def\mathfontlistentrysymbol#1#2%
- {mathsymbol: #1~\ruledhbox{\char#2}\par}
-
-\startluacode
-function document.showmathfont(id,slot)
- local data = characters.data
- local tfmdata = fonts.ids[id]
- local characters = tfmdata.characters
- local sorted = (slot and { slot }) or table.sortedkeys(characters)
- local function report(...)
- tex.sprint(tex.ctxcatcodes,string.format(...))
- end
- local virtual, names = tfmdata.type == "virtual", { }
- if virtual then
- for k, v in ipairs(tfmdata.fonts) do
- local name = fonts.ids[v.id].name
- names[k] = (name and file.basename(name)) or v.id
- end
- end
- local round = math.round
--- print(table.serialize(names))
- for _, s in next, sorted do
- local char = characters[s]
- if char then
- local info = data[s]
- local cnext, cvert_variants, choriz_variants = char.next, char.vert_variants, char.horiz_variants
- report("\\startmathfontlistentry")
- report("\\mathfontlistentryhexdectit{U+%05X}{%s}{%s}",s,s,string.lower(info.description or "no description, private to font"))
- report("\\mathfontlistentrywdhtdpic{%s}{%s}{%s}{%s}",round(char.width or 0),round(char.height or 0),round(char.depth or 0),round(char.italic or 0))
- if virtual then
- local commands = char.commands
- if 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] = string.format("%s/%0X",names[fnt] or fnt,idx)
- end
- end
- if #t > 0 then
- report("\\mathfontlistentryresource{%s}",table.concat(t,", "))
- end
- end
- end
- if info.mathclass then
- report("\\mathfontlistentryclassname{%s}{%s}",info.mathclass,info.mathname or "no name")
- end
- if info.mathspec then
- for i=1,#info.mathspec do
- report("\\mathfontlistentryclassname{%s}{%s}",info.mathspec[i].class,info.mathspec[i].name or "no name")
- end
- end
- if info.mathsymbol then
- report("\\mathfontlistentrysymbol{U+%05X}{%s}",info.mathsymbol,info.mathsymbol)
- end
- if cnext then
- local t, done = { }, { }
- while cnext do
- if done[cnext] then
- t[#t+1] = "CYCLE"
- break
- else
- done[cnext] = true
- t[#t+1] = string.format("\\mathfontlistentrynext{U+%05X}{%s}",cnext,cnext)
- cnext = characters[cnext]
- cvert_variants = cnext.vert_variants or cvert_variants
- choriz_variants = cnext.horiz_variants or choriz_variants
- if cnext then
- cnext = cnext.next
- end
- end
- end
- cnext = t
- end
- if cvert_variants then
- local t = { }
- for k, v in next, cvert_variants do
- t[#t+1] = string.format("\\fontlistentryvariants{U+%05X}{%s}",v.glyph,v.glyph)
- end
- cvert_variants = t
- end
- if choriz_variants then
- local t = { }
- for k, v in next, choriz_variants do
- t[#t+1] = string.format("\\fontlistentryvariants{U+%05X}{%s}",v.glyph,v.glyph)
- end
- choriz_variants = t
- end
- local cvariants = choriz_variants or cvert_variants
- if cvariants and cnext then
- report("\\mathfontlistentrynextvariantslist{%s}{%s}",table.concat(cnext," => "),table.concat(cvariants," => "))
- else
- if cnext then
- report("\\mathfontlistentrynextlist{%s}",table.concat(cnext," => "))
- end
- if variants then
- report("\\mathfontlistentryvariantslist{%s}",table.concat(cvariants," "))
- end
- end
- report("\\stopmathfontlistentry")
- end
- end
-end
-\stopluacode
-
-\endinput
-
-\startbuffer[mathtest]
- \begingroup\mm\mr\showmathfontcharacters\endgroup
-\stopbuffer
-
-\starttext
- \usetypescript[cambria] \setupbodyfont[cambria, 12pt] \getbuffer[mathtest]
- \usetypescript[lmvirtual] \setupbodyfont[lmvirtual,12pt] \getbuffer[mathtest]
- \usetypescript[pxvirtual] \setupbodyfont[pxvirtual,12pt] \getbuffer[mathtest]
- \usetypescript[txvirtual] \setupbodyfont[txvirtual,12pt] \getbuffer[mathtest]
- \usetypescript[palatino] \setupbodyfont[palatino, 10pt] \getbuffer[mathtest]
- \usetypescript[mathtimes] \setupbodyfont[mathtimes,12pt] \getbuffer[mathtest]
-\stoptext
-
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-26.tex b/Master/texmf-dist/tex/context/base/s-fnt-26.mkiv
index 026abf29be3..18d1d657333 100644
--- a/Master/texmf-dist/tex/context/base/s-fnt-26.tex
+++ b/Master/texmf-dist/tex/context/base/s-fnt-26.mkiv
@@ -63,6 +63,7 @@
end
context.stoptabulate()
end
+ end
\stopluacode
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-28.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-28.mkiv
new file mode 100644
index 00000000000..839c7d4ae44
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-fnt-28.mkiv
@@ -0,0 +1,46 @@
+%D \module
+%D [ file=s-fnt-28,
+%D version=2010.09.22,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Tracing Names,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startluacode
+ function fonts.tracers.files(goodyfile)
+ local goodies = fonts.goodies.get(goodyfile)
+ if goodies then
+ local files = goodies.files
+ if files and files.list then
+ for filename, specification in table.sortedpairs(files.list) do
+ context.start()
+ context.dontleavehmode()
+ context.definedfont{ filename .. "*default" }
+ context("%s-%s-%s-%s-%s",
+ specification.name or files.name,
+ specification.weight or "normal",
+ specification.style or "normal",
+ specification.width or "normal",
+ specification.variant or "normal")
+ context.par()
+ context.stop()
+ end
+ end
+ end
+ end
+\stopluacode
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+ \loadfontgoodies[antykwapoltawskiego]
+
+ \ctxlua{fonts.tracers.files("antykwapoltawskiego")}
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-29.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-29.mkiv
new file mode 100644
index 00000000000..0b63635b2ae
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-fnt-29.mkiv
@@ -0,0 +1,71 @@
+%D \module
+%D [ file=s-fnt-29,
+%D version=2010.09.27,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Tracing Shapes,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startluacode
+
+ local fontdata = fonts.hashes.identifiers
+
+ function fonts.tracers.shapes() -- todo: ranges
+ local NC, NR = context.NC, context.NR
+ local char = context.char
+ local chrs = fontdata[font.current()].characters
+ -- local desc = fontdata[font.current()].descriptions
+ context.starttabulate { "|l|c|c|c|c|l|" }
+ context.FL()
+ NC() context("unicode")
+ NC() context("glyph")
+ NC() context("shape")
+ NC() context("lower")
+ NC() context("upper")
+ -- NC() context("name")
+ NC() context("description")
+ NC() NR()
+ context.TL()
+ for k, v in next, characters.data do
+ if chrs[k] then
+ NC() context("0x%05X",k)
+ NC() char(k)
+ NC() char(v.shcode)
+ NC() char(v.lccode or k)
+ NC() char(v.uccode or k)
+ -- NC() context(desc[k].name)
+ NC() context(v.description)
+ NC() NR()
+ end
+ end
+ context.stoptabulate()
+ end
+
+\stopluacode
+
+\doifnotmode{demo}{\endinput}
+
+\setupbodyfont[dejavu,tt,9pt]
+
+\setuplayout
+ [backspace=1cm,
+ topspace=1cm,
+ footer=1cm,
+ header=0cm,
+ height=middle,
+ width=middle]
+
+\setupfootertexts
+ []
+ [\fontname\font\quad\pagenumber]
+
+\starttext
+
+ \ctxlua{fonts.tracers.shapes()}
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-30.tex b/Master/texmf-dist/tex/context/base/s-fnt-30.mkiv
index 81b6c8d19c4..c824b2b6ccf 100644
--- a/Master/texmf-dist/tex/context/base/s-fnt-30.tex
+++ b/Master/texmf-dist/tex/context/base/s-fnt-30.mkiv
@@ -11,24 +11,36 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% begin info
+%
+% title : show character data
+%
+% comment : show some info about characters in the character database
+% status : experimental, used for luatex testing
+%
+% end info
+
\startluacode
function document.show_character_data(n)
local n = characters.number(n)
local d = characters.data[n]
+ local NC, NR = context.NC, context.NR
if d then
local function entry(label,name)
- texsprint(tex.ctxcatcodes,format("\\NC %s\\NC %s\\NC\\NR",label,characters.valid(d[name])))
+ NC() context(label)
+ NC() context(d[name])
+ NC() NR()
end
- texsprint(tex.ctxcatcodes,"\\starttabulate[|Tl|Tl|]")
- entry("unicode index" , "unicodeslot")
- entry("context name" , "contextname")
- entry("adobe name" , "adobename")
- entry("category" , "category")
- entry("description" , "description")
- entry("uppercase code", "uccode")
- entry("lowercase code", "lccode")
- entry("specials" , "specials")
- texsprint(tex.ctxcatcodes,"\\stoptabulate ")
+ context.starttabulate { "|Tl|Tl|]" }
+ entry("unicode index" , "unicodeslot")
+ entry("context name" , "contextname")
+ entry("adobe name" , "adobename")
+ entry("category" , "category")
+ entry("description" , "description")
+ entry("uppercase code", "uccode")
+ entry("lowercase code", "lccode")
+ entry("specials" , "specials")
+ context.stoptabulate()
end
end
\stopluacode
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-31.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-31.mkiv
new file mode 100644
index 00000000000..3cd689d9719
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-fnt-31.mkiv
@@ -0,0 +1,166 @@
+%D \module
+%D [ file=s-fnt-31,
+%D version=2011.01.02, % about
+%D title=\CONTEXT\ Style File,
+%D subtitle=Comparing Fonts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% begin info
+%
+% title : compare glyphs in fonts
+%
+% comment : show glyphs in several fonts alongside in order to to compare coverage
+% status : experimental, used for luatex testing
+%
+% end info
+
+\startluacode
+
+local format, upper, find = string.format, string.upper, string.find
+local chardata = characters.data
+
+function fonts.tracers.coverage(fontfiles,pattern) -- todo: patterns
+
+ local present, names = { }, { }
+ local pattern = pattern and upper(pattern)
+
+ for i=1,#fontfiles do
+ local fontname = format("testfont-%s",i)
+ local fontfile = fontfiles[i]
+ local fontsize = tex.dimen.bodyfontsize
+ local id, fontdata = fonts.definers.define {
+ name = fontfile,
+ size = fontsize,
+ cs = fontname,
+ }
+ for k, v in next, fontdata.characters do
+ present[k] = true
+ end
+ names[i] = fontname
+ end
+
+ context.starttabulate {"|Tr" .. string.rep("|l",#names) .. "|" }
+ for i=1,#names do
+ context.NC()
+ context(i)
+ context.NC()
+ -- context.getvalue(names[i])
+ context.type(fontfiles[i])
+ context.NC()
+ context.NR()
+ end
+ context.stoptabulate()
+
+ context.starttabulate {"|Tl" .. string.rep("|c",#names) .. "|Tl|" }
+ context.NC()
+ context.type("unicode")
+ context.NC()
+ for i=1,#names do
+ context.type(i)
+ context.NC()
+ end
+ context.type("description")
+ context.NC()
+ context.NR()
+ context.HL()
+ for k, v in table.sortedpairs(present) do
+ local description = chardata[k].description
+ if not pattern or (pattern == k) or (description and find(description,pattern)) then
+ context.NC()
+ context(format("%05X",k))
+ context.NC()
+ for i=1,#names do
+ context.getvalue(names[i])
+ context.char(k)
+ context.NC()
+ end
+ context(description)
+ context.NC()
+ context.NR()
+ end
+ end
+ context.stoptabulate()
+
+end
+
+\stopluacode
+
+\doifnotmode{demo}{\endinput}
+
+\setupbodyfont[10pt]
+
+\setuplayout
+ [backspace=1cm,
+ topspace=1cm,
+ footer=1cm,
+ header=0cm,
+ height=middle,
+ width=middle]
+
+\starttext
+
+% \startluacode
+% fonts.tracers.coverage {
+% "pirat.ttf",
+% }
+% \stopluacode
+
+% \startluacode
+% fonts.tracers.coverage {
+% -- "cambria.ttf",
+% "lbr.afm",
+% "LucidaBrightRegular.ttf",
+% "lbi.afm",
+% "LucidaBrightItalic.ttf",
+% "lbd.afm",
+% "LucidaBrightDemiBold.ttf",
+% "lbdi.afm",
+% "LucidaBrightDemiItalic.ttf",
+% }
+% \stopluacode
+
+% \startluacode
+% fonts.tracers.coverage ( {
+% "LucidaBrightRegular.ttf",
+% "cambria.ttf",
+% "iwona-regular.otf",
+% "texgyrepagella-regular.otf",
+% "texgyretermes-regular.otf",
+% "texgyrebonum-regular.otf",
+% "antpolt-regular.otf",
+% }, "OGONEK")
+% \stopluacode
+
+% \loadfontgoodies[lucida-math]
+% \loadfontgoodies[lm-math]
+
+% \startluacode
+% fonts.tracers.coverage {
+% "LucidaBrightRegular.ttf",
+% "LucidaBrightOne@lucida-math",
+% "cambria.ttc(Cambria Math)",
+% "xits-math.otf",
+% "LMMath10-Regular@lmroman10-math",
+% }
+% \stopluacode
+
+\loadfontgoodies[px-math]
+\loadfontgoodies[lm-math]
+
+\startluacode
+ fonts.tracers.coverage {
+ "cambria.ttc(Cambria Math)",
+ "xits-math.otf",
+ "LMMath10-Regular@lmroman10-math",
+ "pxmath@px-math",
+ -- "LinLibertine_Re-4.7.5.otf",
+ }
+\stopluacode
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-fnt-32.mkiv b/Master/texmf-dist/tex/context/base/s-fnt-32.mkiv
new file mode 100644
index 00000000000..ea55e9e7458
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-fnt-32.mkiv
@@ -0,0 +1,60 @@
+%D \module
+%D [ file=s-fnt-31,
+%D version=2011.05.12,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Unicode Math Scripts,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startluacode
+ function fonts.tracers.mathscripts()
+ context.starttabulate { "|cT|c|cT|c|c|l|" }
+ for k, v in table.sortedpairs(table.merged(characters.superscripts,characters.subscripts)) do
+ local ck = utf.char(k)
+ local cv = utf.char(v)
+ local ss = characters.superscripts[k] and "^" or "_"
+ context.NC() context("U+%05X",k)
+ context.NC() context(ck)
+ context.NC() context("U+%05X",v)
+ context.NC() context(cv)
+ context.NC() context("$x%s = x%s%s$",ck,ss,cv)
+ context.NC() context(string.lower(characters.data[k].description))
+ context.NC() context.NR()
+ end
+ context.stoptabulate()
+ end
+\stopluacode
+
+\doifnotmode{demo}{\endinput}
+
+\setupbodyfont[dejavu,10pt]
+
+% \enabletrackers[math.normalizing]
+% \setupbackend[export=yes]
+
+\setuplayout
+ [backspace=1cm,
+ topspace=1cm,
+ footer=1cm,
+ header=0cm,
+ height=middle,
+ width=middle]
+
+\starttext
+
+\startbuffer
+$e=mc²$ ${}²$ $²$ $x²ᶞ$ $x⁽²⁺²⁼²⁺²⁾$ $x²⁺²⁼²⁺²$ $x₅²$ $x²₅²$
+\stopbuffer
+
+\typebuffer \getbuffer
+
+\startluacode
+ fonts.tracers.mathscripts()
+\stopluacode
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-grk-00.tex b/Master/texmf-dist/tex/context/base/s-grk-00.mkii
index ec5ddf1f7f2..ec5ddf1f7f2 100644
--- a/Master/texmf-dist/tex/context/base/s-grk-00.tex
+++ b/Master/texmf-dist/tex/context/base/s-grk-00.mkii
diff --git a/Master/texmf-dist/tex/context/base/s-inf-01.mkvi b/Master/texmf-dist/tex/context/base/s-inf-01.mkvi
new file mode 100644
index 00000000000..4792e739a66
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-inf-01.mkvi
@@ -0,0 +1,244 @@
+%D \module
+%D [ file=s-inf-01,
+%D version=2009.07.09,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Information 1 (\MKII/\MKIV\ usage),
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Some day I will generalize this table mechanism. This list is only
+%D right when run in the minimals as my machine might have more files.
+%D
+%D Als, the remaining tex code can proably be lua also which is more
+%D consistent.
+%D
+%D \starttyping
+%D context auto:s-inf-01
+%D context auto:s-inf-01 --basepath=t:/texmf/tex/context/base
+%D \stoptyping
+
+\startluacode
+ local format, gsub, find, match = string.format, string.gsub, string.find, string.match
+
+ local list, size, comp, used, nope = { }, { }, { }, { mkii = { }, mkiv = { }, mkvi = { } }, { 0, 0, 0, 0, 0 }
+
+ local omit = {
+ "char%-def%.lua",
+ "mult%-def%.lua", "mult%-..%.mkii", "mult%-m..%.mkii",
+ }
+ local skip = {
+ "prag%-.*%.tex", "docs%-.*.tex", "list%-.*%.tex", "test%-.*%.tex", "demo%-.*%.tex",
+ "opti%-.*%.tex", "chrt%-.*%.tex", ".*%-old", ".*%-obs", ".*%-tst", "supp%-.*%.tex",
+ "colo%-pan.tex", ".*test.*"
+ }
+ local types = {
+ "tex", "mkii", "mkiv", "mkvi", "lua"
+ }
+ local patterns = {
+ "^([a-z][a-z][a-z][a-z])%-[a-z0-9%-]+%.[a-z]+",
+ "^([xms])%-[a-z0-9%-]+%.[a-z]+",
+ }
+
+ local function collect(list,suffix,n)
+ local path = document.arguments.basepath or file.dirname(resolvers.find_file("context.mkiv"),".")
+ local pattern = path .. "/*." .. suffix
+ local texfiles = dir.glob(pattern)
+ for _, name in ipairs(texfiles) do
+ local base = file.basename(name)
+ for p=1,#patterns do
+ local category = match(base,patterns[p])
+ if category and lfs.isfile(name) then
+ local okay = true
+ for s=1,#skip do
+ if find(base,skip[s]) then
+ okay = false
+ break
+ end
+ end
+ if okay then
+ local lm, sm, cm = list[category], size[category], comp[category]
+ if not lm then
+ lm, sm, cm = { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }
+ list[category], size[category], comp[category] = lm, sm, cm
+ end
+ lm[n] = lm[n] + 1
+ local done = true
+ for o=1,#omit do
+ if find(base,omit[o]) then
+ done = false
+ break
+ end
+ end
+ local data = io.loaddata(name)
+ if suffix == "lua" then
+ data = gsub(data,"%-%-%[%[.-%]%]%-%-","")
+ data = gsub(data,"%-%-.-[\n\r]","")
+ else
+ data = gsub(data,"%%.-[\n\r]","")
+ end
+ data = gsub(data,"%s","")
+ sm[n+5] = sm[n+5] + #data
+ if done then
+ sm[n] = sm[n] + #data
+ else
+ cm[n] = cm[n] + 1
+ end
+ end
+ end
+ end
+ end
+ end
+
+ local function prepare(what)
+ if next(list) then
+ -- already loaded
+ else
+ for k, v in ipairs(types) do
+ collect(list,v,k)
+ end
+ for category, _ in pairs(list) do
+ pattern ="{"..category.."%-"
+ for suffix, t in pairs(used) do
+ local data = io.loaddata(resolvers.find_file("context."..suffix))
+ if data and find(data,pattern) then
+ t[category] = true
+ end
+ end
+ end
+ end
+ local max, what = 0, (what == "size" and size) or list
+ for k, v in table.sortedpairs(what) do
+ for i=1,5 do if v[i] > max then max = v[i] end end
+ end
+ return max, what, function(n) return (max == 0 and 0) or (n == 0 and 0) or n/max end
+ end
+
+ function document.context_state_1(what)
+ local max, what, norm = prepare(what)
+ context.starttabulate { "|Tl|T|T|T|T|T|" }
+ context.NC()
+ context(category)
+ context.NC()
+ for i, t in ipairs(types) do
+ local n, m = 0, 0
+ for k, v in pairs(list) do
+ local nn, mm = what[k][i], what[k][i+5]
+ n = n + nn
+ m = m + (mm or nn)
+ end
+ context.Top(t,norm(max),n,m)
+ context.NC()
+ end
+ context.NC()
+ context.NR()
+ context.HL()
+ for k, v in table.sortedpairs(what) do
+ local c = (what == size and comp[k]) or nope
+ context.NC()
+ context("%s~%s~~%s~~%s",
+ (used.mkii[k] and "ii") or "~~",
+ (used.mkiv[k] and "iv") or "~~",
+ (used.mkvi[k] and "vi") or "~~",
+ k
+ )
+ context.NC()
+ for i, t in ipairs(types) do
+ context.Bar(t,v[i],c[i],norm(v[i]))
+ context.NC()
+ end
+ context.NR()
+ end
+ context.stoptabulate()
+ end
+
+ function document.context_state_2(what)
+ local max, what, norm = prepare(what)
+ for k, v in table.sortedpairs(what) do
+ local c = (what == size and comp[k]) or nope
+ context.StartUp(k)
+ for i, t in ipairs(types) do
+ context.Up(t,norm(v[i]))
+ end
+ context.StopUp()
+ end
+ end
+
+\stopluacode
+
+\definecolor[bar:tex] [middlegreen]
+\definecolor[bar:mkii][middleblue]
+\definecolor[bar:mkiv][middlered]
+\definecolor[bar:mkvi][middleyellow]
+\definecolor[bar:lua] [middlegray]
+
+\newcount\UpCounter
+
+\starttexdefinition Top #what#fraction#total#bigones
+ \hbox to 5em{\hss#total}%
+ \enspace
+ \hbox {#what\ifnum#total=#bigones\else~#bigones\rlap{~+}\fi\hss}%
+\stoptexdefinition
+
+\starttexdefinition Bar #color#size#nobigones#fraction
+ \ifcase#size\else
+ \hbox to 5em{\hss\ifcase#nobigones\else\llap{-~}\fi#size}%
+ \enspace
+ \blackrule[color=bar:#color,width=#fraction\dimexpr 20em\relax,height=.8\strutht]%
+ \fi
+\stoptexdefinition
+
+\starttexdefinition StartUp #name
+ \def\UpName{#name}%
+ \dontleavehmode\framed[frame=off,align={middle,low},height=18em]\bgroup
+\stoptexdefinition
+
+\starttexdefinition StopUp
+ \par\nointerlineskip\blackrule[height=1pt,width=5em,depth=0pt,color=darkgray]
+ \par\tttf\strut\UpName\par
+ \egroup
+ \ifnum\UpCounter=17
+ \par \UpCounter\zerocount
+ \else
+ \kern1em \advance\UpCounter\plusone
+ \fi
+\stoptexdefinition
+
+\starttexdefinition Up #color#width
+ \scratchdimen#width\dimexpr 16em\relax
+ \ifdim\scratchdimen=\zeropoint
+ \kern1em
+ \else
+ \ifdim\scratchdimen<\onepoint \scratchdimen\onepoint \fi
+ \blackrule[color=bar:#color,height=\scratchdimen,width=1em]%
+ \fi
+\stoptexdefinition
+
+\starttexdefinition Show #title#how#what
+ \startTEXpage[offset=1em,width=fit]
+ \hbox{\tttf\strut\currentdate~-~#title}
+ \par
+ \ctxlua{document.context_state_\number#how("#what")}
+ \stopTEXpage
+\stoptexdefinition
+
+% \doifnotmode{demo}{\endinput}
+
+\starttext
+ \Show
+ {The number of files used in ConTeXt (base modules and styles).}
+ {1}{number}
+ \Show
+ {The size of (core) files used in ConTeXt (- indicates exclusion of large data files; + indicates inclusion of large data files; comment and spaces removed.)}
+ {1}{size}
+ \Show
+ {The relative number of files used in ConTeXt (tex, mkii, mkiv, mkvi, lua).}
+ {2}{number}
+ \Show
+ {The relative size of files used in ConTeXt (tex, mkii, mkiv, mkvi, lua).}
+ {2}{size}
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-inf-01.tex b/Master/texmf-dist/tex/context/base/s-inf-01.tex
deleted file mode 100644
index a2a693ae214..00000000000
--- a/Master/texmf-dist/tex/context/base/s-inf-01.tex
+++ /dev/null
@@ -1,203 +0,0 @@
-%D \module
-%D [ file=s-inf-01,
-%D version=2009.07.09,
-%D title=\CONTEXT\ Style File,
-%D subtitle=Information 1 (\MKII/\MKIV\ usage),
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Some day I will generalize this table mechanism.
-
-\startluacode
- local format, gsub, find, match = string.format, string.gsub, string.find, string.match
- local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
-
- local list, size, comp, used, nope = { }, { }, { }, { mkii = { }, mkiv = { } }, { 0, 0, 0, 0 }
-
- local omit = {
- "char%-def%.lua",
- "mult%-def%.lua", "mult%-..%.tex", "mult%-m..%.tex",
- }
- local skip = {
- "prag%-.*%.tex", "docs%-.*.tex", "list%-.*%.tex", "test%-.*%.tex", "demo%-.*%.tex",
- "opti%-.*%.tex", "chrt%-.*%.tex",
- }
- local types = {
- "tex", "mkii", "mkiv", "lua"
- }
-
- local function collect(list,suffix,n)
- local path = file.dirname(resolvers.find_file("context.tex"),".")
- local pattern = path .. "/*." .. suffix
- local texfiles = dir.glob(pattern)
- for _, name in ipairs(texfiles) do
- local base = file.basename(name)
- local category = match(base,"^([a-z][a-z][a-z][a-z])%-[a-z0-9]+%.[a-z]+")
- if category and lfs.isfile(name) then
- local okay = true
- for s=1,#skip do
- if find(base,skip[s]) then
- okay = false
- break
- end
- end
- if okay then
- local lm, sm, cm = list[category], size[category], comp[category]
- if not lm then
- lm, sm, cm = { 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0 }
- list[category], size[category], comp[category] = lm, sm, cm
- end
- lm[n] = lm[n] + 1
- local done = true
- for o=1,#omit do
- if find(base,omit[o]) then
- done = false
- break
- end
- end
- local data = io.loaddata(name)
- if suffix == "lua" then
- data = gsub(data,"%-%-%[%[.-%]%]%-%-","")
- data = gsub(data,"%-%-.-[\n\r]","")
- else
- data = gsub(data,"%%.-[\n\r]","")
- end
- data = gsub(data,"%s","")
- sm[n+4] = sm[n+4] + #data
- if done then
- sm[n] = sm[n] + #data
- else
- cm[n] = cm[n] + 1
- end
- end
- end
- end
- end
-
- local function prepare(what)
- if next(list) then
- -- already loaded
- else
- for k, v in ipairs(types) do
- collect(list,v,k)
- end
- for category, _ in pairs(list) do
- pattern ="{"..category.."%-"
- for suffix, t in pairs(used) do
- local data = io.loaddata(resolvers.find_file("context."..suffix))
- if find(data,pattern) then
- t[category] = true
- end
- end
- end
- end
- local max, what = 0, (what == "size" and size) or list
- for k, v in table.sortedpairs(what) do
- for i=1,4 do if v[i] > max then max = v[i] end end
- end
- return max, what, function(n) return n/max end
- end
-
- function document.context_state_1(what)
- local max, what, norm = prepare(what)
- texsprint(ctxcatcodes,"\\starttabulate[|Tc|T|T|T|T|]")
- texsprint(ctxcatcodes,"\\NC category\\NC")
- for i, t in ipairs(types) do
- local n, m = 0, 0
- for k, v in pairs(list) do
- local nn, mm = what[k][i], what[k][i+4]
- n = n + nn
- m = m + (mm or nn)
- end
- texsprint(ctxcatcodes,format("\\Top{%s}{%s}{%s}{%s}\\NC",t,norm(max),n,m))
- end
- texsprint(ctxcatcodes,"\\NC\\NR\\HL")
- for k, v in table.sortedpairs(what) do
- local c = (what == size and comp[k]) or nope
- local cat = format("%s~%s~~%s",(used.mkii[k] and "ii") or "~~",(used.mkiv[k] and "iv") or "~~",k)
- texsprint(ctxcatcodes,"\\NC",cat,"\\NC")
- for i, t in ipairs(types) do
- texsprint(ctxcatcodes,format("\\Bar{%s}{%s}{%s}{%s}\\NC",t,v[i],c[i],norm(v[i])))
- end
- texsprint(ctxcatcodes,"\\NR")
- end
- texsprint(ctxcatcodes,"\\stoptabulate")
- end
-
- function document.context_state_2(what)
- local max, what, norm = prepare(what)
- for k, v in table.sortedpairs(what) do
- local c = (what == size and comp[k]) or nope
- texsprint(ctxcatcodes,format("\\StartUp{%s}",k))
- for i, t in ipairs(types) do
- texsprint(ctxcatcodes,format("\\Up{%s}{%s}",t,norm(v[i])))
- end
- texsprint(ctxcatcodes,"\\StopUp")
- end
- end
-
-\stopluacode
-
-\definecolor[bar:tex] [middlegreen]
-\definecolor[bar:mkii][middleblue]
-\definecolor[bar:mkiv][middlered]
-\definecolor[bar:lua] [middlegray]
-
-\def\Top#1#2#3#4%
- {\hbox to 5em{\hss#3}%
- \enspace
- \hbox to #2\dimexpr 20em\relax{#1\ifnum#3=#4\else~#4\rlap{~+}\fi\hss}}
-
-\def\Bar#1#2#3#4%
- {\ifcase#2\else
- \hbox to 5em{\hss\ifcase#3\else\llap{-~}\fi#2}%
- \enspace
- \blackrule[color=bar:#1,width=#4\dimexpr 20em\relax,height=.8\strutht]%
- \fi}
-
-\newcount\UpCounter
-
-\def\StartUp#1%
- {\dontleavehmode\framed[frame=off,align={middle,low},height=18em]\bgroup
- \def\StopUp
- {\par\nointerlineskip\blackrule[height=1pt,width=4em,depth=0pt,color=darkgray]%
- \par\tttf\strut#1\par
- \egroup
- \ifnum\UpCounter=17 \par \UpCounter\zerocount\else \kern1em \advance\UpCounter\plusone \fi}}
-
-\def\Up#1#2%
- {\scratchdimen#2\dimexpr 16em\relax
- \ifdim\scratchdimen=\zeropoint
- \kern1em
- \else
- \ifdim\scratchdimen<\onepoint \scratchdimen\onepoint \fi
- \blackrule[color=bar:#1,height=\scratchdimen,width=1em]%
- \fi}
-
-\def\Show#1#2#3%
- {\startTEXpage[offset=1em,width=fit]
- \hbox{\tttf\strut\currentdate~-~#1}
- \ctxlua{document.context_state_\number#2("#3")}
- \stopTEXpage}
-
-% \doifnotmode{demo}{\endinput}
-
-\starttext
- \Show
- {The number of files used in ConTeXt (modules and styles are excluded).}
- {1}{number}
- \Show
- {The size of (core) files used in ConTeXt (- indicates exclusion of large data files; + indicates inclusion of large data files; comment and spaces removed.)}
- {1}{size}
- \Show
- {The relative number of files used in ConTeXt (tex, mkii, mkiv, lua).}
- {2}{number}
- \Show
- {The relative size of files used in ConTeXt (tex, mkii, mkiv, lua).}
- {2}{size}
-\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-inf-02.tex b/Master/texmf-dist/tex/context/base/s-inf-02.mkiv
index 77a3f650c51..77a3f650c51 100644
--- a/Master/texmf-dist/tex/context/base/s-inf-02.tex
+++ b/Master/texmf-dist/tex/context/base/s-inf-02.mkiv
diff --git a/Master/texmf-dist/tex/context/base/s-inf-03.mkiv b/Master/texmf-dist/tex/context/base/s-inf-03.mkiv
new file mode 100644
index 00000000000..85440f0db97
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-inf-03.mkiv
@@ -0,0 +1,353 @@
+% \nopdfcompression
+
+% \enablemode[ipad]
+
+\doifmodeelse {ipad} {
+
+ \setuppapersize
+ [S6,landscape]
+ [S6,landscape]
+
+ \definefont
+ [TitlePageFont]
+ [MonoBold at 20pt]
+
+} {
+
+ \definefont
+ [TitlePageFont]
+ [MonoBold at 26pt]
+
+}
+
+\setuplayout
+ [header=0cm,
+ footer=1cm,
+ backspace=.5cm,
+ topspace=.5cm,
+ width=middle,
+ height=middle]
+
+\setuphead
+ [title]
+ [style=\ttc,
+ interaction=reference]
+
+\definehead
+ [xtitle]
+ [title]
+
+\setuphead
+ [xtitle]
+ [color=darkgreen]
+
+\setupbodyfont
+ [tt]
+
+\setupfootertexts
+ [\llap{\goto{\hbox to 5cm{\hss previous}}[previouspage]}%
+ \quad\pagenumber\quad
+ \rlap{\goto{\hbox to 5cm{next\hss}}[nextpage]}]
+
+\setupinteraction
+ [state=start,
+ style=,
+ color=,
+ title={ConTeXt MkIV},
+ subtitle={Lua modules and functions},
+ author={Hans Hagen - automatically generated},
+ contrastcolor=]
+
+\setupinteractionscreen
+ [option=bookmark]
+
+\placebookmarks
+ [title,xtitle]
+ [force=yes]
+
+\definecolor[darkyellow][r=.5,g=.5,b=0]
+\definecolor[darkgray] [s=.15]
+
+\nonknuthmode
+
+\starttext
+
+\startbuffer
+\startluacode
+local basiclua = libraries.basiclua
+local basictex = libraries.basictex
+local extratex = libraries.extratex
+local extralua = libraries.extralua
+local obsolete = libraries.obsolete
+
+local find = string.find
+local color, goto = context.color, context.goto
+
+for k, v in table.sortedpairs(_G) do
+ if obsolete[k] or find(k,"_") or k == "arg" or k == "utf" then
+ --
+ elseif basiclua[k] then
+ goto(function() color( { "darkred" }, k) end, { k } )
+ elseif extralua[k] then
+ goto(function() color( { "darkgreen" }, k) end, { k } )
+ elseif basictex[k] then
+ goto(function() color( { "darkblue" }, k) end, { k } )
+ elseif extratex[k] then
+ goto(function() color( { "darkyellow" }, k) end, { k } )
+ elseif type(v) == "table" then
+ goto(function() color( { "white" }, k) end, { k } )
+ end
+ context(" ")
+end
+\stopluacode
+\stopbuffer
+
+\setupbackgrounds
+ [page]
+ [background=color,
+ backgroundcolor=darkgray,
+ backgroundoffset=2mm]
+
+\setuplayout
+ [page]
+
+\startstandardmakeup
+ \vfill
+ \pagereference[global]
+ \startnarrower[5mm]
+ \raggedcenter
+ \TitlePageFont \setupinterlinespace
+ \getbuffer % luabuffer
+ \par
+ \stopnarrower
+ \vfill
+ \vfill
+ \hskip10mm\scale[width=\dimexpr\paperwidth-20mm\relax]{\ttbf\white\ConTeXt\ MkIV}
+ \par
+ % \hskip10mm\scale[width=\dimexpr\paperwidth-20mm\relax]{\white \strut Lua infrastructure \emdash\ \currentdate}
+ \vfill
+\stopstandardmakeup
+
+\setuplayout
+
+\setupbackgrounds
+ [page]
+ [background=]
+
+\startluacode
+local builtin = libraries.builtin
+local globals = libraries.globals
+local basiclua = libraries.basiclua
+local basictex = libraries.basictex
+local extratex = libraries.extratex
+local extralua = libraries.extralua
+local obsolete = libraries.obsolete
+
+local sortedkeys = table.sortedkeys
+local mark = storage.mark
+local marked = storage.marked
+local gsub = string.gsub
+local sub = string.sub
+local byte = string.byte
+local upper = string.upper
+
+local skipglobal = table.tohash {
+ "_G", "context", "modules", "global", "arg", "utf", 1,
+ "_ptbs_", "_pcol_", "_plib_", "_clib_", "_tlib_",
+ "_M", "kpse",
+}
+
+local skipkeys = table.tohash {
+ "_pcol_", "_plib_", "_clib_", "_tlib_", "_bpnf_", "_ptbs_",
+ "_cldf_", "_cldn_",
+ "_clmb_", "_clme_", "_clmm_", "_clmn_", "_clma_", "_clmh_",
+ "_G", "_M", "_VERSION", "_COPYRIGHT", "_DESCRIPTION", "_NAME", "_PACKAGE", "__unload",
+}
+
+local sameglobal = {
+ ["global"] = "_G",
+ -- ["commands"] = "cs", -- already gone
+}
+
+-- -- -- -- -- -- -- -- -- -- -- -- --
+-- this should be done internally
+-- -- -- -- -- -- -- -- -- -- -- -- --
+
+for k,v in next, modules do
+ mark(v)
+end
+
+mark(document.arguments)
+mark(environment.arguments)
+mark(environment.engineflags)
+mark(characters.data)
+
+-- -- -- -- -- -- -- -- -- -- -- -- --
+-- -- -- -- -- -- -- -- -- -- -- -- --
+
+local variant = 1 -- all parents
+local variant = 2 -- parent name too
+local variant = 3 -- no parents
+
+local function childtables(key,tab,handler,depth)
+ depth = depth or 1
+ local keys = sortedkeys(tab) -- no sorted_pairs
+ for i=1,#keys do
+ local k = keys[i]
+-- if k ~= "_G" and k ~= "_M" and type(k) == "string" then
+ if not skipkeys[k] and type(k) == "string" then
+ local v = tab[k]
+ local t = type(v)
+ local s = k
+ if variant ~= 3 then
+ s = key and (key .. "." .. s) or s
+ end
+ if t == "table" then
+ if marked(v) then
+ t = "data"
+ handler(s,t,depth)
+ else
+ handler(s,t,depth)
+ if variant == 3 then
+ childtables(false,v,handler,depth+1)
+ elseif variant == 2 then
+ childtables(k,v,handler,depth+1)
+ else
+ childtables(s,v,handler,depth+1)
+ end
+ end
+ else
+ handler(s,t,depth)
+ end
+ end
+ end
+end
+
+local NC, NR = context.NC, context.NR
+local overstrike, rlap, bf = context.overstrike, context.rlap, context.bf
+local color, goto = context.color, context.goto
+
+local function cleanup(s)
+ return "\\char" ..byte(s) .. " "
+end
+
+local function handler(k,t,depth)
+ k = gsub(k,"([~#$%%^&{}\\\|])",cleanup)
+-- NC() rlap("\\quad\\tx " .. upper(sub(t,1,1)) .. " ".. k) NC() NC() NR()
+ NC() rlap("\\quad\\tx\\kern" .. (depth or 0).. "em" .. upper(sub(t,1,1)) .. " ".. k) NC() NC() NR()
+end
+
+local function show(title,subtitle,alias,builtin,t,lib,libcolor,glo,glocolor,mark,obsolete)
+ -- todo: table as argument
+ local keys = sortedkeys(t) -- no sorted_pairs
+ if #keys > 0 then
+ local fulltitle = title
+ if subtitle and subtitle ~= "" then
+ fulltitle = fulltitle .. " (" .. subtitle .. ")"
+ end
+ if alias and alias ~= "" then
+ fulltitle = fulltitle .. " (alias: " .. alias .. ")"
+ end
+ if builtin then
+ context.startxtitle { reference = title, title = fulltitle, backreference = "global" }
+ else
+ context.starttitle { reference = title, title = fulltitle, backreference = "global" }
+ end
+ context.startcolumns { n = 2 }
+ context.starttabulate { "|||" }
+ local t_obsolete = t.obsolete
+ if type(t_obsolete) ~= "table" then
+ t_obsolete = nil
+ end
+ for i=1,#keys do
+ local k = keys[i]
+ local v = t[k]
+ if k ~= "obsolete" and not skipkeys[k] and (not obsolete or not obsolete[k]) then
+ local inlib = lib and lib[k]
+ local inglo = glo and glo[k]
+ if k then
+ local t = type(v)
+ local kstr, tstr = k, t
+ local obs = t_obsolete and t_obsolete[k]
+ if obs then
+ tstr = function() overstrike(t) end
+ kstr = function() overstrike(k) end
+ end
+ local marked = marked(v)
+ if marked then
+ tstr = "data table"
+ end
+ if t == "table" then
+ local m = getmetatable(v)
+ if m and m.__call then
+ tstr = "function"
+ end
+ end
+ if not mark then
+ --
+ elseif inlib and tostring(inlib) ~= tostring(v) then
+ tstr = "overloaded ".. tstr
+ elseif inglo and tostring(inglo) ~= tostring(v) then
+ tstr = "overloaded ".. tstr
+ end
+ NC() bf()
+ if inlib then
+ if not mark and t == "table" then
+ goto(function() color( { libcolor }, kstr) end, { k } )
+ else
+ color( { libcolor }, kstr)
+ end
+ elseif inglo then
+ if not mark and t == "table" then
+ goto(function() color( { glocolor }, kstr) end, { k } )
+ else
+ color( { glocolor }, kstr)
+ end
+ else
+ if not mark and t == "table" then
+ goto(k, { kstr } )
+ else
+ context(kstr)
+ end
+ end
+ NC()
+ if inlib then
+ color( { libcolor }, tstr)
+ elseif inglo then
+ color( { glocolor }, tstr)
+ else
+ context(tstr)
+ end
+ NC() NR()
+ if mark and t == "table" and title ~= "libraries" and title ~= "package" and not marked then
+ childtables(false,v,handler) -- (k,v,handler)
+ end
+ end
+ end
+ end
+ context.stoptabulate()
+ context.stopcolumns()
+ if builtin then
+ context.stopxtitle()
+ else
+ context.stoptitle()
+ end
+ end
+end
+
+show("global","",sameglobal.global,false,_G,builtin,"darkgreen",globals,"darkblue",false,obsolete)
+
+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
+ if basiclua[k] then show(k,"basic lua",sameglobal[k],basiclua[k],v,builtin[k],"darkred", false,false,true)
+ 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)
+ end
+ end
+end
+
+\stopluacode
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-jap-00.tex b/Master/texmf-dist/tex/context/base/s-jap-00.mkii
index 28cb6c2415a..28cb6c2415a 100644
--- a/Master/texmf-dist/tex/context/base/s-jap-00.tex
+++ b/Master/texmf-dist/tex/context/base/s-jap-00.mkii
diff --git a/Master/texmf-dist/tex/context/base/s-lan-03.mkiv b/Master/texmf-dist/tex/context/base/s-lan-03.mkiv
new file mode 100644
index 00000000000..b8d24539b52
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-lan-03.mkiv
@@ -0,0 +1,40 @@
+%D \module
+%D [ file=s-lan-03,
+%D version=2010.10.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Language Environment 3,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\startluacode
+languages.words.tracers = languages.words.tracers or { }
+
+function languages.words.tracers.showwords(filename)
+ filename = filename or file.addsuffix(tex.jobname,"words")
+ if lfs.isfile(filename) then
+ local w = dofile(filename)
+ if w then
+ -- table.print(w)
+ for cname, category in table.sortedpairs(w.categories) do
+ for lname, language in table.sortedpairs(category.languages) do
+ context.bold(string.format("category: %s, language: %s, total: %s, unique: %s:",
+ cname, lname, language.total or 0, language.unique or 0)
+ )
+ for word, n in table.sortedpairs(language.list) do
+ context(" %s (%s)",word,n)
+ end
+ context.par()
+ end
+ end
+ end
+ end
+end
+\stopluacode
+
+% \ctxlua{languages.words.tracers.showwords("words-003.words")}
+
diff --git a/Master/texmf-dist/tex/context/base/s-lan-04.mkiv b/Master/texmf-dist/tex/context/base/s-lan-04.mkiv
new file mode 100644
index 00000000000..3fb57529911
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-lan-04.mkiv
@@ -0,0 +1,153 @@
+%D \module
+%D [ file=s-lan-04,
+%D version=2011.05.01,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Language Environment 4,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D For Mojca.
+
+\startluacode
+ local a_colormodel = attributes.private('colormodel')
+
+ local nodecodes = nodes.nodecodes
+ local nodepool = nodes.pool
+ local disc = nodecodes.disc
+ local glyph = nodecodes.glyph
+ local quads = fonts.hashes.quads
+ local newkern = nodepool.kern
+ local newrule = nodepool.rule
+ local newglue = nodepool.glue
+
+ local get_attribute = node.has_attribute
+
+ local tracers = nodes.tracers
+ local colortracers = tracers and tracers.colors
+ local setnodecolor = colortracers.set
+
+ local function identify(head,marked)
+ local current, prev = head, nil
+ while current do
+ local id = current.id
+ local next = current.next
+ if id == disc then
+ if prev and next.id == glyph then -- catch other usage of disc
+ marked[#marked+1] = prev
+ end
+ elseif id == glyph then
+ prev = current
+ end
+ current = next
+ end
+ end
+
+ local function strip(head,marked)
+ for i=1,#marked do
+ local prev = marked[i]
+ nodes.remove(head,prev.next,true)
+ end
+ end
+
+ local function mark(head,marked,what,how)
+ for i=1,#marked do
+ local prev = marked[i]
+ local font = prev.font
+ local quad = quads[font]
+ head, prev = node.insert_after(head,prev,newkern(-quad/40))
+ if what then
+ local rule = newrule(quad/20,.75*quad,0)
+ head, prev = node.insert_after(head,prev,rule)
+ setnodecolor(rule,how,get_attribute(prev,a_colormodel))
+ else
+ local rule = newrule(quad/20,0,.5*quad)
+ head, prev = node.insert_after(head,prev,rule)
+ setnodecolor(rule,how,get_attribute(prev,a_colormodel))
+ end
+ head, prev = node.insert_after(head,prev,newkern(-quad/40))
+ head, prev = node.insert_after(head,prev,newglue(0))
+ end
+ end
+
+ local language_one, language_two, tag_one, tag_two
+
+ function nodes.showhyphens(head)
+ local marked_1, marked_2 = { }, { }
+ if language_one then
+ for n in node.traverse_id(glyph,head) do
+ n.lang = language_one
+ end
+ lang.hyphenate(head,node.slide(head))
+ identify(head,marked_1)
+ strip(head,marked_1)
+ end
+ if language_two then
+ for n in node.traverse_id(glyph,head) do
+ n.lang = language_two
+ end
+ lang.hyphenate(head,node.slide(head))
+ identify(head,marked_2)
+ strip(head,marked_2)
+ end
+ if tag_one then
+ mark(head,marked_1,true,"hyphenation:"..tag_one)
+ end
+ if tag_two then
+ mark(head,marked_2,false,"hyphenation:"..tag_two)
+ end
+ return head, true
+ end
+
+ function languages.startcomparepatterns(list)
+ local list = utilities.parsers.settings_to_array(list)
+ tag_one = list[1]
+ tag_two = list[2]
+ language_one = tag_one and languages.getnumber(tag_one)
+ language_two = tag_two and languages.getnumber(tag_two)
+ -- nodes.tasks.appendaction("processors","words","nodes.showhyphens")
+ nodes.tasks.appendaction("processors","before","nodes.showhyphens")
+ nodes.tasks.enableaction("processors","nodes.showhyphens")
+ end
+
+ function languages.stopcomparepatterns()
+ nodes.tasks.disableaction("processors","nodes.showhyphens")
+ end
+
+\stopluacode
+
+\unprotect
+
+\def\startcomparepatterns[#1]%
+ {\bgroup
+ \language\zerocount
+ \setupalign[\v!nothyphenated]%
+ \ctxlua{languages.startcomparepatterns("#1")}}
+
+\def\stopcomparepatterns
+ {\ctxlua{languages.stopcomparepatterns()}%
+ \egroup}
+
+\protect
+
+\definecolor[hyphenation:en] [r=.8]
+\definecolor[hyphenation:de] [g=.8]
+\definecolor[hyphenation:nl] [b=.8]
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+ \startcomparepatterns[en,de]
+ \input tufte\par
+ \stopcomparepatterns
+
+ \startcomparepatterns[de,nl]
+ \input tufte\par
+ \stopcomparepatterns
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-map-10.tex b/Master/texmf-dist/tex/context/base/s-map-10.mkii
index 865132f9743..865132f9743 100644
--- a/Master/texmf-dist/tex/context/base/s-map-10.tex
+++ b/Master/texmf-dist/tex/context/base/s-map-10.mkii
diff --git a/Master/texmf-dist/tex/context/base/s-map-10.mkiv b/Master/texmf-dist/tex/context/base/s-map-10.mkiv
new file mode 100644
index 00000000000..22ceeb16158
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-map-10.mkiv
@@ -0,0 +1,567 @@
+%\module [
+% file=s-map-se,
+% version=2005.02.03,
+% title=\CONTEXT\ Style File,
+% subtitle=\MAPS\ basis stijl,
+% author={Hans Hagen, Taco Hoekwater and Siep Kroonenberg},
+% date=\currentdate,
+% copyright={NTG / MAPS}%
+%]
+
+% This module re-implements the MAPS style for use with the Context
+% macro package. The original MAPS layout was designed and
+% implemented in LaTeX by Taco Hoekwater and Siep Kroonenberg.
+
+% This style will be cleaned up as soon as we have time for it.
+
+% - three layouts:
+% 1. two columns
+% 2. one column, with wide outer margins (option onecolumn)
+% 3. one column, with wide left margin (option asym)
+% - font sizes deviate from TeX's usual geometric progression
+% - use of sans-serif for headers and various details
+% - option realfonts uses Bitstream Charter, Euler Math and Latin Modern.
+% This is used for final typesetting.
+% The default font setup, intended for authors, uses Computer
+% Modern.
+
+% A mode nosubsub defines only two levels of sectioning. If you
+% don't need more and use the two-column layout, then this option
+% will probably improve the looks of your paper.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% pdftex support
+
+\newif\ifMapsInColumns
+\doifmode{asym}{\enablemode[onecolumn]} % implies onecolumn
+\doifnotmode{onecolumn}{\MapsInColumnstrue}
+
+\enablemode[realfonts]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% fonts
+
+%%%%%%%%% first, font sizes
+\definebodyfontenvironment [7pt][% LaTeX: scriptsize
+ interlinespace=8pt,
+ big=8pt,
+ small=6pt%
+]
+
+\definebodyfontenvironment [8pt][% LaTeX: footnotesize
+ interlinespace=9pt,
+ big=9pt,
+ small=7pt,
+ x=6pt%
+]
+
+\definebodyfontenvironment [9pt][% LaTeX: small
+ interlinespace=10pt,
+ big=10pt,
+ small=8pt,%
+ x=7pt,%
+ script=6pt%
+]
+
+\definebodyfontenvironment [10pt][% LaTeX: normalsize
+ interlinespace=11pt,
+ big=11pt,
+ a=11pt,
+ small=9pt,%
+ x=8pt,%
+ script=7pt%
+]
+
+\definebodyfontenvironment [11pt][% LaTeX: large
+ interlinespace=11pt,
+ big=11pt,
+ small=10pt,%
+ x=9pt,%
+ script=8pt%
+]
+
+\definebodyfontenvironment [14pt][%
+ interlinespace=14pt,
+ big=18pt,
+ small=11pt,
+ x=10pt%
+]
+
+\definebodyfontenvironment [18pt][%
+ interlinespace=18pt,
+ big=24pt,
+ small=14pt,
+ x=10pt%
+]
+
+\definebodyfontenvironment [24pt][%
+ interlinespace=24pt,
+ big=24pt,
+ small=18pt,
+ x=11pt%
+]
+
+%%% font families
+
+\usetypescriptfile[type-libertine]
+
+\usetypescriptfile[type-inconsolata]
+
+\startmode[mkii]
+\starttypescript [maps] [ec]
+\definetypeface [maps] [mm] [math] [euler] [default] [encoding=default,rscale=0.9]
+\usemathcollection[euler]
+\definetypeface [maps] [tt] [mono] [inconsolata] [default] [encoding=ec,rscale=0.92]
+\definetypeface [maps] [ss] [sans] [default] [default] [encoding=ec,rscale=0.95]
+\definetypeface [maps] [rm] [serif] [libertine] [default] [encoding=ec]
+\stoptypescript
+\usetypescript[maps] [ec]
+\stopmode
+
+\startmode[mkiv]
+\starttypescript [maps]
+\definetypeface [maps] [mm] [math] [euler] [default] [rscale=0.9]
+\definetypeface [maps] [tt] [mono] [inconsolata] [default] [rscale=0.92]
+\definetypeface [maps] [ss] [sans] [modern] [default] [rscale=0.95]
+\definetypeface [maps] [rm] [serif] [libertine] [default]
+\stoptypescript
+\usetypescript[maps]
+\stopmode
+
+\setupbodyfont[maps,10pt,rm]
+
+% activate protruding
+\setupinterlinespace[line=11pt]
+
+\setupfontsynonym[handling=pure]
+
+\setupalign[hanging]
+
+% \usetypescript[map][texnansi]
+
+% \setupbodyfont [map,10pt]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% additional general typographic details
+
+\setupindenting [yes,next,11pt] % indenting after enumerations etc.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% 3 versions of layout with matching headers
+
+% I would like to move the entire layout slightly toward the spine,
+% but Context seems to provide no good handle for that.
+% So instead, I'll use a two-column layout centered on the page and
+% matching single-column layouts.
+
+% It is easy to do the shift toward the spine when assembling the
+% volume with LaTeX pdfpages.
+
+\definepapersize [maps][%
+ width=595.3bp, % 21cm
+ height=756bp% 10.5in
+]
+
+\setuppapersize [maps][maps]
+
+% parameters:
+% margin -> latex marginparwith
+
+\setuplayout[%
+ topspace=40pt,
+ height=688pt,
+ header=33pt,
+ margin=106pt,
+ leftmargindistance=11pt,
+ rightmargindistance=11pt%
+]
+
+
+\setupblank[5.5pt]
+
+\setuppagenumbering [location=]
+
+\definetyping [widetyping]
+
+\setupheader [style=\ss]
+\setupfooter [style=\ss]
+
+\def\AuHead{%
+ %\ifnum\pageno=\MapsPage \hbox{}\else
+ \MapsRunningAuthor%\fi
+}
+\def\TiHead{%
+ \ifnum\pageno=\MapsPage \relax \MapsRunningAuthor %\hbox{}
+ \else \MapsRunningTitle\fi}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% sectioning
+
+\setupheads[sectionnumber=no, align=right]
+
+\def\hfonti{\ssbfa}
+\def\hfontii{\ssbf}
+\def\hfontiii{\rm\it}
+\def\runin#1#2{#2.}
+
+\doifmodeelse{nosubsub}{%
+\setuphead [section][%
+ style=\hfontii,
+ before={\blank[line]},
+ after={}%
+]
+\setuphead [subsection][%
+ style=\hfontiii,
+ command=\runin,
+ alternative=text,
+ distance=6pt,
+ before={\blank[halfline]}%
+]}{%
+\setuphead [section][%
+ style=\hfonti,
+ before={\blank[line]},
+ after={\blank[halfline]}%
+]
+\setuphead [subsection][%
+ style=\hfontii,
+ before={\blank[halfline]},
+ after={}%
+]
+\setuphead [subsubsection][%
+ style=\hfontiii,
+ command=\runin,
+ distance=6pt,
+ alternative=text,
+ before={\blank[halfline]}%
+]}
+
+\doifmodeelse{nosubsub}{%
+\setuphead [subject][%
+ style=\hfontii,
+ before={\blank[halfline]},
+ after={}%
+]
+\setuphead [subsubject][%
+ style=\hfontiii,
+ command=\runin,
+ alternative=text,
+ before={\blank[halfline]}%
+]}{%
+\setuphead [subject][%
+ style=\hfonti,
+ before={\blank},
+ after={\blank[halfline]}%
+]
+\setuphead [subsubject][%
+ style=\hfontii,
+ before={\blank[halfline]},
+ after={}%
+]
+\setuphead [subsubsubject][%
+ style=\hfontiii,
+ command=\runin,
+ alternative=text,
+ before={\blank[halfline]}%
+]}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% floats
+
+\setupfloats [location=center, before={\ss}]
+\setupcaptions [headstyle={\ss},style={\ssx},
+ stopper=.,distance=6pt,
+ inbetween={\blank[halfline]}]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% various document elements
+
+%\startnotmode[realfonts]
+\def\ChkBox{%
+ \hbox {\boxrulewidth=.4pt \raise.2ex\ruledvbox
+ {\phantom{\vrule width .85ex height .85ex%
+}}}}
+
+\startmode[mkii]
+\pdfmapline{stmary10 stmary10 <stmary10.pfb}
+\def\ChkBox{\definedfont[stmary10]{\char "40}}
+\stopmode
+
+\startmode[mkiv]
+\def\ChkBox{\definedfont[file:stmary10]{\char "40}} % doesnt work
+\def\ChkBox{%
+ \hbox {\boxrulewidth=.4pt \raise.2ex\ruledvbox
+ {\phantom{\vrule width .85ex height .85ex%
+}}}}
+\stopmode
+%\stopnotmode
+%\startmode[realfonts]
+%\def\ChkBox{\raise.12ex\hbox{\ws \char50}}
+%\stopmode
+\definesymbol [1][\ChkBox]
+
+\setupitemize[1][packed]
+
+\setupitemize [each][%
+ indentnext=no,
+ align=right,
+ width=1em,
+ distance=0pt%
+]
+
+% an outer form of itemize that does not indent
+% the paragraph.
+
+\definecomplexorsimpleempty\startouteritemize
+\def\complexstartouteritemize[#1]{\begingroup
+ \startitemize[width=1sp,#1]
+ \let\doitem\item
+ \def\item{\doitem[]\hbox{}\kern12pt\rightskip=0pt}%
+}
+
+\def\stopouteritemize{\stopitemize\endgroup}
+
+
+\setupenumerations [indentnext=no]
+
+\setupdescriptions [indentnext=no]
+
+\unexpanded\def\smalltyping{%
+ \switchtobodyfont[tt]%
+% \setuplocalinterlinespace[line=11pt]%
+ \parindent=0pt
+}
+
+% typing:
+% - prettyverbatim is NOT the default
+% - smaller size
+
+\unexpanded\def
+ \XeTeX{X\lower.5ex\hbox{\kern-.1em\mirror{E}}\kern-.1667em\TeX}
+
+\setuptyping [%
+ style={\smalltyping},
+ option=none,
+ indentnext=no%
+]
+
+\def\footnum#1{#1.}
+
+\setupfootnotes
+ [location=none,
+ width=\textwidth,
+% bodyfont={rm,9pt},
+ before=,
+ numbercommand=,
+ command=\footnum]
+
+\setupfootnotedefinition
+ [location=serried,
+ before=,
+ after=,
+ distance=0.5em]
+
+\setuptabulate
+ [before=\blank,
+ inner=\ss,
+ after=\blank]
+
+\def\startIntroEntry#1%
+ {\startlinecorrection
+ \bgroup
+ \setupalign[right]
+ \setuptolerance[verytolerant]
+ \setupindenting[no]
+ \noindent
+ \switchtobodyfont[9pt]%
+ \setuplocalinterlinespace[line=10pt]%
+ %\hyphenpenalty10000
+ \parfillskip 0pt plus 1fill
+ \rightskip6pt plus 1fill
+ \ss
+ \bgroup\bf #1\par\egroup
+ \ignorespaces }
+
+\def\stopIntroEntry
+ {\par\egroup \stoplinecorrection
+ \blank[line] }
+
+\def\defineIntroEntry[#1][#2][#3]%
+ {\setvalue{start#1}{\startIntroEntry{#2}}%
+ \setvalue {stop#1}{\stopIntroEntry#3}}
+
+\defineIntroEntry[Keywords][Keywords][]
+\defineIntroEntry[Abstract][Abstract][]
+
+% article parameters (other fields and defaults)
+\def\MapsBibData[#1]%
+ {\getparameters [Maps]
+ [SubTitle=,
+ RunningAuthor=,
+ RunningTitle=,
+ Email=,
+ Address=,
+ Page=1,
+ Title=,
+ Author=,
+ Period=VOORJAAR,
+ Number=40,
+ Year=2010,
+ #1]%
+ \doifinstringelse{oorjaar}{\MapsPeriod}{\def\MapsPeriod{VOORJAAR}}{}%
+ \doifinstringelse{pring}{\MapsPeriod}{\def\MapsPeriod{VOORJAAR}}{}%
+ \doifinstringelse{ajaar}{\MapsPeriod}{\def\MapsPeriod{NAJAAR}}{}%
+ \doifinstringelse{utumn}{\MapsPeriod}{\def\MapsPeriod{NAJAAR}}{}%
+ \doifnothing\MapsRunningAuthor
+ {\global\let\MapsRunningAuthor\MapsAuthor}%
+ \doifnothing\MapsRunningTitle
+ {\global\let\MapsRunningTitle\MapsTitle}}%
+
+\def\dostartArticle[#1]{%
+ \MapsBibData[#1]
+ \pageno=\MapsPage
+ \count0=\MapsPage
+ \setuppagenumber[number=\MapsPage]
+ \startbaselinecorrection
+ \bgroup
+ \hsize = 457pt
+ \let\\\crlf
+ \blank[35pt,force]
+ \switchtobodyfont[24pt]
+ \setupalign[right]
+ {\noindent\bf\MapsTitle\par}
+ \ifx\MapsSubTitle\empty
+ \blank[30pt]
+ \else
+ \bgroup
+ \blank[12pt]
+ \switchtobodyfont[18pt]\noindent \it
+ \advance \rightskip 0pt plus 2em
+ \MapsSubTitle\par
+ \egroup
+ \blank[30pt]
+ \fi
+ \egroup
+ \setupalign[width]
+ \switchtobodyfont[rm,10pt]
+ \stopbaselinecorrection
+ \ifMapsInColumns
+ \startcolumns\hyphenpenalty1000
+ \else
+ \clubpenalty10000
+ \widowpenalty10000
+ \fi
+}
+
+\definecolumnset[mapsset][n=2,grid=on]
+
+\def\startArticle{\dosingleempty\dostartArticle}
+
+\def\signArticle{%
+ \blank\let\\\crlf
+ \noindent\switchtobodyfont[ss,9pt]%
+ \MapsAuthor
+ \doifsomething{\MapsAddress}{\\\MapsAddress}%
+ \doifsomething{\MapsEmail}{\\\MapsEmail}%
+ \switchtobodyfont[10pt]%
+ \def\signArticle{}%
+}
+
+\def\stopArticle{%
+ \par\signArticle
+ \ifMapsInColumns \stopcolumns \fi
+ \page
+}
+
+\installpagebreakhandler{last}{}
+
+%%% `logos' %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% don't do this for the proceedings because it is a TUGboat also
+%\def\LATEX{\LaTeX}
+%\def\TEX{\TeX}
+
+\unexpanded\def\LaTeX % requested by erik frambach
+ {{\setbox\scratchbox\hbox{L}%
+ \scratchdimen\ht\scratchbox
+ \setbox\scratchbox\hbox{\switchtobodyfont[script]A}%
+ L\kern-.55\wd\scratchbox
+ \raise\scratchdimen\hbox{\lower\ht\scratchbox\copy\scratchbox}%
+ \kern-.2\wd\scratchbox\TeX}}
+
+
+\def\CONTEXT{Con{\TeX}t}
+\def\ConTeXt{Con{\TeX}t}
+\def\METAFONT{Metafont}
+\def\METAPOST{MetaPost}
+\def\POSTSCRIPT{PostScript}
+
+\def\acro#1{{\switchtobodyfont[9pt]#1}}
+
+
+%%%%%%%%%%%
+
+\doifmodeelse{onecolumn}{%
+ \setuplayout[width=340pt]
+ \doifmodeelse{asym}{% one col, asymmetric
+ \setuplayout[backspace=187.3pt]%
+ \setuptyping [widetyping][oddmargin=-117pt]
+ \setuppagenumbering [alternative={singlesided,doublesided}]
+ \setupheadertexts
+ [{\hbox{}\hskip-117pt\TiHead}]
+ [{\cap{\MapsPeriod\ \MapsYear}\quad\bf \pagenumber\hskip-30pt\hbox{}}]
+ [{\hbox{}\hskip-147pt{\bf \pagenumber}\quad \cap {maps\ \MapsNumber}}]
+ [\AuHead]
+ \setupfootertexts
+ }{% one col, symmetric
+ \setuplayout[backspace=70.3pt]
+ \setuppagenumbering [alternative=doublesided]
+ \setuptyping[blank=halfline]
+ \setupheadertexts
+ [\TiHead]
+ [{\cap{\MapsPeriod\ \MapsYear}\quad\bf \pagenumber\hskip-147pt\hbox{}}]
+ [{\hbox{}\hskip-147pt{\bf \pagenumber}\quad \cap {maps\ \MapsNumber}}]
+ [\AuHead]
+ \setupfootertexts
+}}{% two col
+ \setuplayout[width=457pt]
+ \setupcolumns[n=2,tolerance=verytolerant,distance=11pt]
+ \setuplayout[backspace=70.3pt,grid=yes]
+ \setuppagenumbering [alternative=doublesided]
+ \setuptyping[blank=halfline]
+ \setupheadertexts
+ [\TiHead]
+ [{\cap{\MapsPeriod\ \MapsYear}\quad\bf \pagenumber\hskip-30pt\hbox{}}]
+ [{\hbox{}\hskip-30pt{\bf \pagenumber}\quad \cap {maps\ \MapsNumber}}]
+ [\AuHead]
+ \setupfootertexts
+}
+
+\def\fulltextwidth{457pt}
+
+%\MapsBibData
+% []
+
+%\abovedisplayskip = 12pt
+%\abovedisplayshortskip = 6pt
+
+\newdimen\iabovedisplayskip
+\newdimen\iabovedisplayshortskip
+%\let\abovedisplayskip\iabovedisplayskip
+%\let\abovedisplayshortskip\iabovedisplayshortskip
+
+%\protect
+
+\def\startdescription
+ {\blank
+ \bgroup
+ \def\sym##1{\par\noindent\hbox{\bf\kern -16pt ##1}\hskip 12pt}
+ \startnarrower[left]
+ }
+\def\stopdescription
+ {\par \stopnarrower \egroup \blank \noindentation }
+
+\frenchspacing
+\setuptolerance[tolerant]
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/s-mod-00.tex b/Master/texmf-dist/tex/context/base/s-mod-00.mkii
index 270f7a9b4c7..e2d07200c6a 100644
--- a/Master/texmf-dist/tex/context/base/s-mod-00.tex
+++ b/Master/texmf-dist/tex/context/base/s-mod-00.mkii
@@ -22,10 +22,8 @@
\usemodule[units]
-\doifnotmode{mkiv}{
- \enableactivediscretionaries
- \newprettytrue
-}
+\enableactivediscretionaries
+\newprettytrue
\unprotect
@@ -43,13 +41,14 @@
{\getrawparameters
[Module]
[ file=\jobname,
+ type=,
version={\currentdate[\v!year,{.},\v!month,{.},\v!day]},
system=\CONTEXT,
- title=,
+ title=Unknown Title,
subtitle=,
- author=Hans Hagen,
+ author=Unknown Author,
date=\currentdate,
- copyright={PRAGMA / Hans Hagen \& Ton Otten},
+ copyright=Unknown Copyright,
suggestions=]}
\resetmodule
diff --git a/Master/texmf-dist/tex/context/base/s-mod-00.mkiv b/Master/texmf-dist/tex/context/base/s-mod-00.mkiv
new file mode 100644
index 00000000000..f6b6f7ba2e2
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-mod-00.mkiv
@@ -0,0 +1,481 @@
+%D \module
+%D [ file=s-mod-00,
+%D version=very-old,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Documentation Base Environment,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module looks like crap, is not documented, will
+%D change, and used to be called modu-*.tex.
+
+% now split in mkii/mkiv so we will cleanup
+
+\mainlanguage[en] % better not here
+
+\usemodule[units]
+
+\unprotect
+
+% beter:
+%
+% group -> title
+% title -> category
+% subtitle -> subtitle
+
+% herzien ivm fonts
+
+% nog eens \interface \\ \\ verder doorvoeren
+
+\def\resetmodule
+ {\getrawparameters
+ [Module]
+ [ file=\jobname,
+ type=,
+ version={\currentdate[\v!year,{.},\v!month,{.},\v!day]},
+ system=\CONTEXT,
+ title=Unknown Title,
+ subtitle=,
+ author=Unknown Author,
+ date=\currentdate,
+ copyright=Unknown Copyright,
+ suggestions=]}
+
+\resetmodule
+
+\def\dostartmodule[#1]%
+ {\newcounter\ParagraphNumber
+ \resetmodule
+ \getrawparameters[Module][type=tex,#1]}
+
+\def\startmodule
+ {\starttext
+ \dosingleempty\dostartmodule}
+
+\def\complexmodule[#1]%
+ {\startglobal % i.v.m. \bgroup in \startdocumentation
+ \getrawparameters[Module][#1]
+ \stopglobal % i.v.m. \bgroup in \startdocumentation
+ \moduletitle}
+
+\def\stopmodule
+ {\page
+ \placeregister
+ [\v!index]
+ [\c!balance=\v!yes,
+ \c!indicator=\v!no,
+ \c!criterium=\v!text]
+ \stoptext}
+
+\def\simplemodule#1%
+ {\type{#1}}
+
+\definecomplexorsimple\module
+
+\startuseMPgraphic{titlepage}
+
+ width := PaperWidth ;
+ height := PaperHeight ;
+
+ color local_red, local_white, local_blue ;
+
+ local_white := white ;
+
+ local_blue := local_white randomized (.6,.8) ;
+ local_red := local_white randomized (.3,.4) ;
+
+ u := width/400 ;
+
+ def a_module (expr dx, dy) =
+ picture p ; p := image
+ ( ddy := 0 ; sx := 60u ;
+ for i=1 upto (4 randomized 2) :
+ sy := 7u randomized 3u ;
+ fill unitsquare xyscaled(sx,sy) shifted (0,ddy)
+ withcolor local_red ;
+ ddy := ddy + sy + 4u ;
+ endfor ) ;
+ p := p shifted (dx,dy) shifted - center p ;
+ fill boundingbox p enlarged 8u withcolor local_white ;
+ fill boundingbox p enlarged 4u withcolor local_blue ;
+ draw p ;
+ enddef ;
+
+ set_grid(width, height, width/15, height/15) ;
+ forever:
+ if new_on_grid(uniformdeviate width,uniformdeviate height):
+ a_module(dx,dy) ;
+ fi ;
+ exitif grid_full ;
+ endfor ;
+
+ clip currentpicture to unitsquare xyscaled(width,height) ;
+\stopuseMPgraphic
+
+\defineoverlay
+ [titlepage]
+ [\useMPgraphic{titlepage}]
+
+\doifmode{atpragma}{\readfile{s-mod-04.tex}{}{}}
+
+\defineframed
+ [TitleFrame]
+ [\c!background=\v!color,
+ \c!backgroundcolor=white,
+ \c!align=\v!right,
+ \c!offset=12pt,
+ \c!strut=\v!no,
+ \c!frame=\v!off,
+ \c!bottom=]
+
+\definelayout
+ [titlepage]
+ [\c!backspace=0pt,
+ \c!topspace=0pt,
+ \c!header=0pt,
+ \c!footer=0pt,
+ \c!height=\v!middle,
+ \c!width=\v!middle]
+
+\def\moduletitle
+ {\setuplayout[titlepage]
+ \ifx\ModuleNumber\undefined \else
+ \ifnum\ModuleNumber<10
+ \edef\ModuleNumber{00\ModuleNumber}
+ \else\ifnum\ModuleNumber<100
+ \edef\ModuleNumber{0\ModuleNumber}
+ \fi\fi
+ \setupbackgrounds
+ [\v!page]
+ [\c!background=titlepage]
+ \fi
+ \startmakeup[\v!standard][\c!headerstate=\v!none,\c!footerstate=\v!none]
+ \switchtobodyfont[14.4pt,ss]
+ \bgroup
+ \def\CONTEXT {Con\kern-.15em\TeX t}
+ \def\TEXUTIL {\TeX Util}
+ \def\PPCHTEX {PPCH\TeX}
+ \def\METAPOST{MetaPost}
+ \hfill
+ {\definedfont[SansBold at 96pt]\setstrut
+ \TitleFrame{\Modulesystem}}
+ \vfill
+ \definetabulate[temp][|l|l|]%
+ \switchtobodyfont[17.3pt,ss]
+ \hfill
+ {\bf\setstrut
+ \TitleFrame
+ {\insidefloattrue\setuptabulate[\c!before=,\c!after=]%
+ \starttemp
+ \doifsomething{\Moduletitle}
+ {\NC title \EQ \Moduletitle \NC\NR}%
+ \doifsomething{\Modulesubtitle}
+ {\NC subtitle \EQ \Modulesubtitle \NC\NR}%
+ \doifsomething{\Moduleauthor}
+ {\NC author \EQ \Moduleauthor \NC\NR}%
+ \NC date \EQ \currentdate \NC\NR
+ %\doifsomething{\Modulesuggestions} % todo: generates space
+ % {\NC suggestions \NC \Modulesuggestions \NC\NR}%
+ \stoptemp}}
+ \egroup
+ \stopmakeup
+ \ifx\ModuleNumber\undefined \else
+ \setupbackgrounds
+ [\v!page]
+ [\c!background=]
+ \fi
+ \setuplayout}
+
+\let\stopdocumentation=\relax
+
+\def\startdocumentation
+ {\bgroup
+ \doglobal\newcounter\NOfMarginLines
+ \def\stopdocumentation{\par\egroup}}
+
+\newif\ifcompressdefinitions
+
+\def\startcompressdefinitions {\global\compressdefinitionstrue}
+\def\stopcompressdefinitions {\global\compressdefinitionsfalse}
+
+\gdef\CompressDefinitions%
+ {\ifcompressdefinitions
+ \switchtobodyfont[\v!small]%
+ \fi}
+
+\startnotmode[nocode]
+
+ \definetyping
+ [definition]
+
+ \setuptyping
+ [definition]
+ [\c!before={\page[\v!preference]}\blank\PresetParagraphNumber\CompressDefinitions,
+ \c!after=\ResetParagraphNumber\blank,
+ \c!option=\Moduletype]
+
+\stopnotmode
+
+\startmode[nocode]
+
+ \long\def\startdefinition#1\stopdefinition{}
+
+\stopmode
+
+\definetyping [PL] [\c!option=PL, \c!margin=\v!standard]
+\definetyping [JV] [\c!option=JV, \c!margin=\v!standard]
+\definetyping [MP] [\c!option=MP, \c!margin=\v!standard]
+\definetyping [TEX] [\c!option=TEX,\c!margin=\v!standard]
+
+\setuptyping [\v!typing] [\c!margin=\v!standard]
+\setuptyping [\v!file] [\c!margin=\v!standard]
+\setuptyping [definition] [\c!margin=0pt]
+
+\newcounter\NOfMarginLines
+\newcounter\ParagraphNumber
+
+\def\ResetParagraphNumber
+ {\egroup}
+
+\def\PresetParagraphNumber
+ {\bgroup
+ \xdef\NOfTextLines%
+ {\the\prevgraf}%
+ \doglobal\decrement\NOfMarginLines
+ \doglobal\increment\ParagraphNumber
+ \message{.}%
+ \gdef\ShowParagraphNumber%
+ {\llap{\slx\ParagraphNumber\hskip\leftmargindistance}}%
+ \gdef\ShowParagraphNumberA%
+ {\ifnum\NOfMarginLines>\NOfTextLines\relax
+ \doglobal\increment\NOfTextLines
+ \else
+ \ShowParagraphNumber
+ \global\let\ShowParagraphNumberA=\relax
+ \global\let\ShowParagraphNumberB=\ShowParagraphNumber
+ \doglobal\newcounter\NOfMarginLines
+ \fi}%
+ \gdef\ShowParagraphNumberB%
+ {}%
+ \EveryLine
+ {\ShowParagraphNumberA}%
+ \EveryPar
+ {\vadjust{\nobreak}%
+ \ShowParagraphNumberB}}
+
+\EveryPar % skip one
+ {\EveryPar
+ {\doglobal\newcounter\NOfMarginLines}}
+
+\def\dodomargeaanduidingen[#1]#2%
+ {\def\docommand##1%
+ {\indent\hbox
+ {\ifx#2\relax
+ \index{##1}%
+ \else
+ \index{#2{##1}}%
+ \fi
+ #2{\doboundtext{##1}{\leftmarginwidth}{..}}}%
+ \doglobal\increment\NOfMarginLines
+ \endgraf}%
+ \processcommalist[#1]\docommand}
+
+\def\margeaanduidingen#1[#2]%
+ {\def\domargeaanduidingen##1##2%
+ {\margintitle[#2]%
+ {\switchtobodyfont[\v!small]%
+ \doglobal\newcounter\NOfMarginLines
+ \dodomargeaanduidingen[##1]#1%
+ \scratchcounter=\NOfMarginLines
+ \multiply\scratchcounter by 10
+ \divide\scratchcounter by 12
+ \advance\scratchcounter by 1
+ \xdef\NOfMarginLines{\the\scratchcounter}%
+ \processcommalist[##2]\index}}%
+ \dodoublegroupempty\domargeaanduidingen}
+
+\def\complexmacros{\margeaanduidingen\tex }
+\def\complexextras{\margeaanduidingen\relax}
+
+\def\complexelements
+ {\margeaanduidingen\someelement}
+
+\def\someelement#1{\type{<#1>}}
+
+\definecomplexorsimpleempty\macros
+\definecomplexorsimpleempty\extras
+\definecomplexorsimpleempty\elements
+
+\def\showelements{\dodoubleempty\doshowelements}
+
+\def\doshowelements[#1][#2]
+ {\bgroup
+ \processXMLbuffer
+ \typebuffer
+ \setupcolors[\c!state=\v!stop]
+ \showXSDcomponent[#1][#2]
+ \egroup}
+
+% \macros{a,b}
+% \macros{a,b}{b}
+% \macros[a]{a,b}{b}
+
+% weg ermee
+
+\defineparagraphs [interface] [\c!n=2]
+\setupparagraphs [interface] [1] [\c!width=4cm]
+
+\def\startexample{\par\startnarrower} \let\startvoorbeeld\startexample
+\def\stopexample {\stopnarrower} \let\stopvoorbeeld \stopexample
+
+\gdef\VisualizeLastSpace{\ifdim\lastskip>0pt\unskip\tttf\char32\fi}
+
+\gdef\ShowHeadText #1{\tttf#1\VL\mainlanguage[\currentlanguage]\headtext {#1}\VisualizeLastSpace}
+\gdef\ShowLabelText#1{\tttf#1\VL\mainlanguage[\currentlanguage]\labeltext{#1}\VisualizeLastSpace}
+
+\startbuffer[lang-a]
+\starttable[|l|l|]
+ \HL
+ \VL \bf head key \VL \bf current value \VL\SR
+ \HL
+ \VL \ShowHeadText \v!abbreviations \VL\FR
+ \VL \ShowHeadText \v!units \VL\MR
+ \VL \ShowHeadText \v!figures \VL\MR
+ \VL \ShowHeadText \v!graphics \VL\MR
+ \VL \ShowHeadText \v!index \VL\MR
+ \VL \ShowHeadText \v!content \VL\MR
+ \VL \ShowHeadText \v!intermezzi \VL\MR
+ \VL \ShowHeadText \v!logos \VL\MR
+ \VL \ShowHeadText \v!tables \VL\LR
+ \HL
+\stoptable
+\stopbuffer
+
+\startbuffer[lang-b]
+\starttable[|l|l|]
+ \HL
+ \VL \bf label key \VL \bf current value \VL\SR
+ \HL
+ \VL \ShowLabelText \v!table \VL\FR
+ \VL \ShowLabelText \v!figure \VL\MR
+ \VL \ShowLabelText \v!intermezzo \VL\MR
+ \VL \ShowLabelText \v!graphic \VL\MR
+ \VL \ShowLabelText \v!chapter \VL\MR
+ \VL \ShowLabelText \v!section \VL\MR
+ \VL \ShowLabelText \v!subsection \VL\MR
+ \VL \ShowLabelText \v!subsubsection \VL\MR
+ \VL \ShowLabelText \v!appendix \VL\MR
+ \VL \ShowLabelText \v!part \VL\MR
+ \VL \ShowLabelText \v!line \VL\MR
+ \VL \ShowLabelText \v!lines \VL\LR
+ \HL
+\stoptable
+\stopbuffer
+
+\startbuffer[lang-c]
+\starttable[|l|l|]
+ \HL
+ \VL \bf label key \VL \bf current value \VL\SR
+ \HL
+ \VL \ShowLabelText \v!january \VL\FR
+ \VL \ShowLabelText \v!february \VL\MR
+ \VL \ShowLabelText \v!march \VL\MR
+ \VL \ShowLabelText \v!april \VL\MR
+ \VL \ShowLabelText \v!may \VL\MR
+ \VL \ShowLabelText \v!june \VL\MR
+ \VL \ShowLabelText \v!july \VL\MR
+ \VL \ShowLabelText \v!august \VL\MR
+ \VL \ShowLabelText \v!september \VL\MR
+ \VL \ShowLabelText \v!october \VL\MR
+ \VL \ShowLabelText \v!november \VL\MR
+ \VL \ShowLabelText \v!december \VL\LR
+ \HL
+\stoptable
+\stopbuffer
+
+\startbuffer[lang-d]
+\starttable[|l|l|]
+ \HL
+ \VL \bf label key \VL \bf current value \VL\SR
+ \HL
+ \VL \ShowLabelText \v!sunday \VL\FR
+ \VL \ShowLabelText \v!monday \VL\MR
+ \VL \ShowLabelText \v!tuesday \VL\MR
+ \VL \ShowLabelText \v!wednesday \VL\MR
+ \VL \ShowLabelText \v!thursday \VL\MR
+ \VL \ShowLabelText \v!friday \VL\MR
+ \VL \ShowLabelText \v!saturday \VL\LR
+ \HL
+\stoptable
+\stopbuffer
+
+\gdef\ShowTextsValues[#1][#2]%
+ {\vbox\bgroup
+ \language[#1]%
+ \setbox\scratchbox\hbox to \hsize{\hss\bfb#2 language defaults\hss}
+ \dp\scratchbox\zeropoint
+ \box\scratchbox
+ \vskip1em
+ \hrule
+ \vskip2em
+ \halign
+ {\hss##\hss&##\hskip1em&\hss##\hss\cr
+ $\vcenter{\getbuffer[lang-a]}$&&$\vcenter{\getbuffer[lang-b]}$\cr
+ \noalign{\vskip1em}
+ $\vcenter{\getbuffer[lang-c]}$&&$\vcenter{\getbuffer[lang-d]}$\cr}%
+ \egroup}
+
+\gdef\ShowLanguageValues[#1][#2]#3#4%
+ {\hbox to \hsize
+ {\hss
+ \vbox
+ \bgroup
+ \language[#1]%
+ \let\normalbar=|
+ \starttable[||||]
+ \HL
+ \VL \THREE{\bf subsentence symbol and quotes} \VL\SR
+ \HL
+ \VL \quotation{#3 #4} \VL \quote{#2} \VL \let|=\normalbar |<||<|#3|>|#4|>| \VL\FR
+ \VL \quotation{#3 #4} \VL \quote{#2} \VL |<||<|#3|>|#4|>| \VL\LR
+ \HL
+ \stoptable
+ \egroup
+ \hss}}
+
+\gdef\doShowAllLanguageValues[#1][#2]#3#4%
+ {\vbox
+ {\ShowTextsValues[#1][#2]
+ \vskip2em
+ \ShowLanguageValues[#1][#2]{#3}{#4}}
+ \protect
+ \page}
+
+\gdef\ShowAllLanguageValues
+ {\page
+ \unprotect
+ \dodoubleargument\doShowAllLanguageValues}
+
+\protect
+
+%D Command references:
+
+\usemodule[int-load] \loadsetups
+
+\unprotect
+
+\def\showsetup#1%
+ {{\def\y##1{\writestatus{setups}{warning: remove y! from #1}}%
+ \setup{#1}}}
+
+\setupframedtexts
+ [setuptext]
+ [\c!background=\v!screen,
+ \c!frame=\v!off]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/s-mod-01.tex b/Master/texmf-dist/tex/context/base/s-mod-01.mkii
index 4454986ce6d..64b533d0316 100644
--- a/Master/texmf-dist/tex/context/base/s-mod-01.tex
+++ b/Master/texmf-dist/tex/context/base/s-mod-01.mkii
@@ -37,9 +37,7 @@
[\v!big]
\setuptolerance
- [\v!tolerant]
-
-\emergencystretch=5em
+ [\v!verytolerant,\v!!stretch]
\setuplayout
[\c!backspace=3.5cm,
diff --git a/Master/texmf-dist/tex/context/base/s-mod-01.mkiv b/Master/texmf-dist/tex/context/base/s-mod-01.mkiv
new file mode 100644
index 00000000000..ed87346d6f5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-mod-01.mkiv
@@ -0,0 +1,146 @@
+%D \module
+%D [ file=s-mod-01,
+%D version=very-old,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Documentation Paper Environment,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module looks like crap, is not documented, will
+%D change, and used to be called modu-*.tex.
+
+% now split in mkii/mkiv so we will cleanup
+
+\usemodule[mod-00,abr-01]
+
+\dontcomplain
+
+\unprotect
+
+\setupbodyfont
+ [10pt]
+
+\definetypeface [narrowtt] [tt] [mono] [modern-cond] [default]
+
+\setuptyping[\v!typing][\c!style=\narrowtt]
+\setuptype [\v!type] [\c!style=\narrowtt]
+
+\mainlanguage
+ [en]
+
+\setupwhitespace
+ [\v!big]
+
+\setuptolerance
+ [\v!verytolerant,\v!stretch]
+
+\setuplayout
+ [\c!backspace=3.5cm,
+ \c!leftmargin=1.75cm,
+ \c!rightmargin=0cm,
+ \c!margindistance=.5cm,
+ \c!leftedgedistance=.25cm,
+ \c!rightedgedistance=.5cm,
+ \c!edge=1.5cm,
+ \c!width=15.55333cm, % 13.998cm at 9pt => 15.55333 at 10pt
+ \c!topspace=2cm,
+ \c!header=1.25cm,
+ \c!footer=1.25cm,
+ \c!height=middle,
+ \c!style=\ss]
+
+\setupsetup
+ [\c!reference=1] % mkiv?
+
+\startnotmode[single]
+
+ \setuppagenumbering
+ [\c!alternative={\v!doublesided,\v!singlesided}]
+
+\stopnotmode
+
+\setuppagenumbering
+ [\c!location=]
+
+\setupfootertexts
+ [\v!edge]
+ [][\v!pagenumber]
+
+\startmode[single]
+
+ \setupfootertexts
+ [\v!margin]
+ [\filename{\Modulefile}][]
+
+\stopmode
+
+\startnotmode[single]
+
+ \setupfootertexts
+ [\v!margin]
+ [\filename{\Modulefile}][]
+ [\filename{\Modulefile}][]
+
+\stopnotmode
+
+\setupfootertexts
+ [\v!text]
+ [\CONTEXT]
+ [\Moduletitle]
+
+\setupheadertexts
+ [\v!text]
+ []
+ [\Modulesubtitle]
+
+\setupinmargin
+ [\c!location=\v!left]
+
+\setupheads
+ [\c!alternative=\v!inmargin]
+
+\setuphead
+ [\v!chapter]
+ [\c!style=\ssc,
+ \c!page=\v!right,
+ \c!header=\v!empty]
+
+\setuphead
+ [\v!section]
+ [\c!style=\ssb,
+ \c!page=\v!right]
+
+\setuplist
+ [\v!chapter]
+ [\c!style=\v!bold,
+ \c!after=\blank]
+
+\setupcombinedlist
+ [\v!content]
+ [\c!width=3em,
+ \c!aligntitle=\v!yes]
+
+\setupregister
+ [\v!index]
+ [\c!balance=\v!yes,
+ \c!indicator=\v!no]
+
+\startmode[nocolor]
+
+ \setupcolors
+ [\c!conversion=\v!always]
+
+\stopmode
+
+\setupinteraction
+ [\c!state=\v!start,
+ \c!color=,
+ \c!contrastcolor=,
+ \c!style=]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/s-mod-02.tex b/Master/texmf-dist/tex/context/base/s-mod-02.mkii
index 9dae3ecc0dd..bc53f689008 100644
--- a/Master/texmf-dist/tex/context/base/s-mod-02.tex
+++ b/Master/texmf-dist/tex/context/base/s-mod-02.mkii
@@ -18,6 +18,8 @@
\usemodule[mod-00]
+\unprotect
+
% todo: internationalize + setups
\setuphead[paragraaf][expansion=command]
@@ -37,15 +39,14 @@
\determineregistercharacteristics
[index]
[criterium=section]
- \ifutilitydone
- \pagereference
- [index]
- \placeregister
- [index]
- [balance=yes,
- indicator=no,
- criterium=section]
- \fi}
+ \doifmode{*register}
+ {\pagereference
+ [index]
+ \placeregister
+ [index]
+ [balance=yes,
+ indicator=no,
+ criterium=section]}}
\let\ComposeLists=\relax
@@ -417,4 +418,4 @@
\setuptolerance
[verytolerant]
-\endinput
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/s-mod-02.mkiv b/Master/texmf-dist/tex/context/base/s-mod-02.mkiv
new file mode 100644
index 00000000000..1ca88b796d9
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-mod-02.mkiv
@@ -0,0 +1,423 @@
+%D \module
+%D [ file=s-mod-02,
+%D version=very-old,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Documentation Screen Environment,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D This module looks like crap, is not documented, will
+%D change, and used to be called modu-*.tex.
+
+% now split in mkii/mkiv so we will cleanup
+
+% Macro's
+
+\usemodule[mod-00]
+
+\unprotect
+
+% todo: internationalize + setups
+
+\setuphead[paragraaf][expansion=command]
+\setuphead[section][expansion=command]
+
+\def\complexmodule[#1]% redefined
+ {\startglobal % i.v.m. \bgroup in \startdocumentation
+ \getparameters[Module][#1]
+ \stopglobal % i.v.m. \bgroup in \startdocumentation
+ %%\section{\Modulesubtitle}
+ \xdef\Temp{\Modulesubtitle}%%Modulesubtitle:\framed{BEGIN \Modulesubtitle END} :#1 !}
+ \@EA\section\@EA{\Temp}
+ \WriteLists}
+
+\def\stopmodule % redefined
+ {\page
+ \determineregistercharacteristics
+ [index]
+ [criterium=section]
+ \doifmode{*register}
+ {\pagereference
+ [index]
+ \placeregister
+ [index]
+ [balance=yes,
+ indicator=no,
+ criterium=section]}}
+
+\let\ComposeLists=\relax
+
+\newcounter\ModuleNumber
+
+\newwrite\BatchFile \openout\BatchFile=\jobname.bat
+
+\def\WriteBatchFile
+ {\doglobal\increment\ModuleNumber
+% \immediate\write\BatchFile{call modu-run \FileName\space \ModuleNumber}}
+% \immediate\write\BatchFile{texmfstart texutil --modu \FileName}}
+ \immediate\write\BatchFile{texmfstart texexec --pdf --modu --batch \FileName }}
+
+\newif\ifProcessingPublic
+
+\def\WriteLists
+ {\writetolist[FileNames] {}{\FileName}
+ \writetolist[GroupItems]{}{\GroupItem}}
+
+\def\moduletitle{}
+
+\def\TypeZeroModule#1%
+ {\section{[to be extracted: #1]}
+ {\em This module is not yet split off.}
+ \WriteLists}
+
+\def\TypeOneModule#1%
+ {\section{[to be documented: #1]}
+ {\em This module is not yet fully documented.}
+ \WriteLists}
+
+\def\TypeTwoModule#1%
+ {\ifProcessingPublic
+ \readfile{#1.ted}{}{}%
+ \WriteBatchFile
+ \else
+ \section{[not yet public: #1]}
+ {\em This module is documented but not yet public.}
+ \WriteLists
+ \fi}
+
+\def\TypeThreeModule#1%
+ {\readfile{#1.ted}{}{}%
+ \WriteBatchFile}
+
+\def\processmodule#1#2%
+ {\page
+ \bgroup
+ \def\FileName{#1}
+ \setupreferencing[prefix=#1]
+ \useexternaldocument[PaperVersion][#1][]
+ \aftersplitstring#1\at-\to\GroupItem
+ \ComposeLists
+ \ifcase#2
+ \TypeZeroModule{#1}
+ \or
+ \TypeOneModule{#1}
+ \or
+ \TypeTwoModule{#1}
+ \or
+ \TypeThreeModule{#1}
+ \fi
+ \page
+ \setupreferencing[prefix=]
+ \egroup}
+
+\def\ModuleGroup#1#2%
+ {\page
+ \let\Modulefile=\empty
+ \setupreferencing[prefix=#1]
+ \def\FileGroup{#1}
+ \writetolist[FileGroups]{}{\FileGroup}
+ \chapter[content]{#2}
+ \MakeListOfItems
+ \MakeListOfNames
+ \MakeListOfGroups
+ \placecontent[criterium=chapter,level=section]}
+
+% Layout
+
+\setupbodyfont
+ [9pt]
+
+\setuppapersize
+ [S6][S6]
+
+\setuplayout
+ [backspace=72.5pt,
+ leftmargin=50pt,
+ leftmargindistance=12.5pt,
+ rightmargin=0pt,
+ rightedge=80pt,
+ rightedgedistance=10pt,
+ leftedge=0pt,
+ width=430pt,
+ topspace=10pt,
+ header=0pt,
+ footer=30pt,
+ bottomdistance=10pt,
+ bottom=15pt,
+ height=410pt,
+ style=\ss]
+
+\setuptyping
+ [palet=colorpretty]
+
+\setupsetup
+ [reference=3]
+
+\definecolor [AchtergrondKleur] [s=.6]
+\definecolor [ButtonKleur] [r=.2,g=.2,b=.6]
+\definecolor [TekstKleur] [r=.6,g=.2,b=.2]
+
+\definecolor [colorprettyone] [r=.6,g=.0,b=.0] % red
+\definecolor [colorprettytwo] [r=.0,g=.6,b=.0] % green
+\definecolor [colorprettythree] [r=.0,g=.0,b=.6] % blue
+\definecolor [colorprettyfour] [r=.6,g=.6,b=.0] % yellow
+
+\setupinteraction
+ [state=start,
+ page=yes,
+ contrastcolor=,
+ menu=on,
+ color=]
+
+\setupbackgrounds
+ [page]
+ [background=color,
+ backgroundcolor=AchtergrondKleur,
+ offset=2.5pt] % this offset influences the menus!
+
+\setupbackgrounds
+ [text,footer]
+ [text,leftmargin]
+ [background=color,
+ backgroundcolor=white]
+
+\setupsubpagenumber
+ [way=bysection,
+ state=start]
+
+\setupinteractionbar
+ [frame=off,
+ offset=0pt,
+ height=fit]
+
+\setupwhitespace
+ [big]
+
+\setuptyping
+ [typing]
+ [option=color]
+
+\setuptyping
+ [definition]
+ [option=color]
+
+\setuptyping
+ [file]
+ [option=color]
+
+\setuppagenumbering
+ [alternative=singlesided,
+ way=bysection,
+ state=none]
+
+\setupinmargin
+ [location=left]
+
+\setupheads
+ [alternative=inmargin]
+
+\setuphead
+ [chapter]
+ [style=\ssc,
+ page=right]
+
+\setuphead
+ [section]
+ [style=\ssb,
+ page=right]
+
+\setuplist
+ [chapter]
+ [style=bold,
+ after=\blank]
+
+\setupcontent
+ [width=2em]
+
+\setupindex
+ [balance=yes,
+ indicator=no]
+
+\setupcolors
+ [state=start]
+
+\def\TitelBlad#1%
+ {\startstandardmakeup
+ \definefont[GrootFont] [SansBold at 72pt]
+ \definefont[MiddelFont][Sans at 32pt]
+ \definefont[KleinFont] [Sans at 24pt]
+ \startcolor[AchtergrondKleur]
+ \vskip12pt
+ \midaligned{\GrootFont\setstrut\strut Con\TeX t}
+ \vskip24pt
+ \midaligned{\MiddelFont\setstrut\strut #1}
+ \vskip24pt
+ \midaligned{\KleinFont\setstrut\strut Hans Hagen}
+ \vfilll
+ \midaligned{\KleinFont\setstrut\strut PRAGMA ADE}
+ \vskip24pt
+ \midaligned{\KleinFont\setstrut\strut www.pragma-ade.com --- \currentdate}
+ \vskip12pt
+ \stopcolor
+ \stopstandardmakeup}
+
+\def\ColofonBlad
+ {\startmode[atpragma]
+ \page
+ \bgroup
+ \def\PragmaHoogte {\makeupheight}
+ \def\PragmaBreedte{\textwidth}
+ \def\PragmaKopwit {\topspace}
+ \def\PragmaRugwit {\backspace}
+ \def\PragmaMarge {0pt}
+ \PragmaLijnentrue
+ \PlaatsPragmaLogo[ADE]
+ \vfill
+ todo: colofon
+ \startnarrower[3*middle]
+ This is the official documentation of \CONTEXT\ version
+ \referraldate, a \TEX\ macropackage developed by J.~Hagen
+ \& A.F.~Otten, who both hold the copyrights.
+ \stopnarrower
+ \vfill
+ \page
+ \egroup
+ \stopmode}
+
+\def\ColofonBlad
+ {}
+
+\newbox\ListOfItems
+\newbox\ListOfGroups
+\newbox\ListOfNames
+
+\definelist[FileNames] \def\FileName {}
+\definelist[FileGroups] \def\FileGroup {}
+\definelist[GroupItems] \def\GroupItem {}
+
+\setuplist
+ [FileNames,FileGroups,FileGroups]
+ [expansion=yes,
+ pagenumber=no,
+ style=\ss\bf]
+
+\setuplist
+ [FileNames]
+ [command=\FileNameEntry,
+ after=\endgraf,
+ alternative=none] % horizontal
+
+\setuplist
+ [FileGroups]
+ [command=\FileGroupEntry,
+ after=\hss,
+ alternative=horizontal]
+
+\def\FileNameEntry#1#2#3%
+ {\strut\hbox{#2}\endgraf}
+
+\def\FileGroupEntry#1#2#3%
+ {\strut\hbox{#2}\endgraf}
+
+\def\MakeListOfItems
+ {\setbox\ListOfItems=\vbox
+ {\ss\bf
+ \placelist[GroupItems][color=ButtonKleur,contrastcolor=white,criterium=chapter]}}
+
+\def\MakeListOfNames
+ {\setbox\ListOfNames=\vbox
+ {\hsize\rightedgewidth
+ \ss\bf\setupinterlinespace
+ \startsimplecolumns[distance=10pt]
+ \placelist[FileNames][color=ButtonKleur,contrastcolor=white,criterium=chapter]
+ \stopsimplecolumns}}
+
+\def\MakeListOfGroups
+ {\setbox\ListOfGroups=\hbox to \textwidth
+ {\ss\bf
+ \setupinteraction[color=ButtonKleur]%
+ \placelist[FileGroups][color=ButtonKleur,contrastcolor=white,criterium=all]\unskip\unskip}}
+
+\setbox\ListOfGroups=\hbox{}
+
+%\setupfootertexts
+% [rand]
+% []
+% [{\interactiebalk[variant=g]}]
+
+\setupinteractionmenu
+ [right,bottom]
+ [state=start,
+ frame=off,
+ color=AchtergrondKleur,
+ contrastcolor=white,
+ style=\ss\bf,
+ height=15pt,
+ offset=0pt,
+ inbetween=\vskip5pt,
+ background=color,
+ backgroundcolor=ButtonKleur]
+
+\startinteractionmenu[right]
+ \boxofsize \vbox \textheight \footerdistance \footerheight 5pt
+ \bgroup
+ \copy\ListOfNames
+ \vfill
+ \but [\FileGroup:content] local contents \\
+ \but [\FileName:index] local register \\
+ \but [PaperVersion::begin] paper version \\
+ \but [content] main contents \\
+ \but [index] main register \\
+ \but [PreviousJump] previous jump \\
+ \but [CloseDocument] close document \\
+ \unskip
+ \egroup
+\stopinteractionmenu
+
+\startinteractionmenu[bottom]
+ \unhcopy\ListOfGroups
+\stopinteractionmenu
+
+\def\placemoduleregister
+ {\startbackmatter
+ \setupsubpagenumber[reset]
+ \title[-:index]{Register}
+ \placeregister[index]
+ \stopbackmatter}
+
+\def\placemodulecontent
+ {\startfrontmatter
+ \title[-:content]{Contents}
+ \setupinteractionbar[state=stop]
+ \placecontent[criterium=text,level=chapter]
+ \stopfrontmatter}
+
+\setupcontent
+ [pagenumber=no,
+ level=chapter,
+ interaction=all,
+ style=,
+ before=,
+ after=]
+
+\setupfootertexts
+ [margin]
+ [\tt\Modulefile]
+ []
+
+\setupfootertexts
+ [text]
+ [chapter][chapter]
+
+\setupindex
+ [symbol=1]
+
+\setuptolerance
+ [verytolerant]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/s-pre-14.tex b/Master/texmf-dist/tex/context/base/s-pre-14.tex
index f44117e7c9c..93f8cdbc35e 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-14.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-14.tex
@@ -11,7 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-
%D In the process of making a couple of simple styles for
%D \EUROTEX\ 99, I came to this one. The joke is in the
%D pagenumber. This style can be used for short presentations
diff --git a/Master/texmf-dist/tex/context/base/s-pre-18.tex b/Master/texmf-dist/tex/context/base/s-pre-18.tex
index 407f3082406..d92117aaf79 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-18.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-18.tex
@@ -11,28 +11,24 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-
-
-% output=pdftex interface=en
-
-% todo: met pos en dan iedere titel
+% todo: met pos en dan iedere titel
\setuppapersize
[S6][S6]
\setupbodyfont
- [loc,ppl]
+ [loc,ppl]
\setupcolors
[state=start]
-\definecolor [shade-1] [s=.7]
-\definecolor [shade-2] [s=.1]
+\definecolor [shade-1] [s=.7]
+\definecolor [shade-2] [s=.1]
-\definecolor [shade-3] [s=.8]
-\definecolor [shade-4] [b=.8]
+\definecolor [shade-3] [s=.8]
+\definecolor [shade-4] [b=.8]
-\definecolor [shade-5] [g=.6]
+\definecolor [shade-5] [g=.6]
\setuplayout
[topspace=1cm,
@@ -52,58 +48,58 @@
\defineoverlay [text] [\useMPgraphic{text}]
\startuseMPgraphic{page}
- StartPage ;
- path p ; numeric s ; pair cp ; cp := center Page ;
+ StartPage ;
+ path p ; numeric s ; pair cp ; cp := center Page ;
s := define_circular_shade(cp,cp,0,TextWidth,
- \MPcolor{shade-1},\MPcolor{shade-2}) ;
- fill Page withshade s ;
+ \MPcolor{shade-1},\MPcolor{shade-2}) ;
+ fill Page withshade s ;
p := fullcircle xyscaled (TextWidth+1cm, TextHeight+1cm) shifted cp ;
s := define_circular_shade(cp,cp,0,TextWidth,\MPcolor{shade-3},
- \MPcolor{shade-4}) ;
- fill p withshade s ;
+ \MPcolor{shade-4}) ;
+ fill p withshade s ;
StopPage
\stopuseMPgraphic
\startuseMPgraphic{text}
- StartPage ;
- path p ; numeric s, t ; pair cp ; cp := center Page ;
+ StartPage ;
+ path p ; numeric s, t ; pair cp ; cp := center Page ;
s := define_circular_shade(cp,cp,0,TextWidth,
- \MPcolor{shade-1},\MPcolor{shade-2}) ;
- fill Page withshade s ;
- p := llcorner Field[Text][Bottom] --
- lrcorner Field[Text][Bottom] --
- urcorner Field[Text][Text] --
- ulcorner Field[Text][Text] -- cycle ;
- p := p enlarged .5cm randomized .5cm ;
- t := define_circular_shade(cp,cp,0,TextWidth,\MPcolor{shade-3},
- \MPcolor{shade-4}) ;
- fill p withshade t ;
-
- def bottom_menu_button (expr nn, rr, pp, xx, yy, ww, hh, dd) =
- if (pp>0) and (rr>0) :
- if nn = 1 :
- p := (0,0)--(ww,hh/2)--(0,hh)--cycle ;
- elseif nn = 2 :
- p := (0,hh/2)--(ww,hh)--(ww,0)--cycle ;
+ \MPcolor{shade-1},\MPcolor{shade-2}) ;
+ fill Page withshade s ;
+ p := llcorner Field[Text][Bottom] --
+ lrcorner Field[Text][Bottom] --
+ urcorner Field[Text][Text] --
+ ulcorner Field[Text][Text] -- cycle ;
+ p := p enlarged .5cm randomized .5cm ;
+ t := define_circular_shade(cp,cp,0,TextWidth,\MPcolor{shade-3},
+ \MPcolor{shade-4}) ;
+ fill p withshade t ;
+
+ def bottom_menu_button (expr nn, rr, pp, xx, yy, ww, hh, dd) =
+ if (pp>0) and (rr>0) :
+ if nn = 1 :
+ p := (0,0)--(ww,hh/2)--(0,hh)--cycle ;
+ elseif nn = 2 :
+ p := (0,hh/2)--(ww,hh)--(ww,0)--cycle ;
else :
- p := origin--cycle ;
- fi ;
- fill p randomized 2.5mm shifted (xx,yy) withshade s ;
- fi ;
- enddef ;
+ p := origin--cycle ;
+ fi ;
+ fill p randomized 2.5mm shifted (xx,yy) withshade s ;
+ fi ;
+ enddef ;
- \MPmenubuttons{bottom}
+ \MPmenubuttons{bottom}
- if length \MPstring{topic} > 0 :
+ if length \MPstring{topic} > 0 :
graphictext
- \MPstring{topic}
+ \MPstring{topic}
scaled 3
- shifted ulcorner Field[Text][Text]
- shifted (0,-1.5cm)
+ shifted ulcorner Field[Text][Text]
+ shifted (0,-1.5cm)
withshade s ;
fi ;
- StopPage ;
+ StopPage ;
\stopuseMPgraphic
\setupinteractionmenu
@@ -116,8 +112,8 @@
position=yes]
\startinteractionmenu[bottom]
- \but [previouspage] \\
- \but [nextpage] \\
+ \but [previouspage] \\
+ \but [nextpage] \\
\stopinteractionmenu
\setupinteraction
@@ -148,20 +144,20 @@
\setupbackgrounds[page][background=text]}
\def\TitleString#1#2%
- {\indent
+ {\indent
\startMPcode
graphictext
- "#2"
+ "#2"
scaled #1
withdrawcolor .4white
withfillcolor .7white
withpen pencircle scaled 2pt ;
\stopMPcode
- \vfill}
+ \vfill}
-\doifnotmode{demo}{\endinput}
+\doifnotmode{demo}{\endinput}
-\starttext
+\starttext
\StartTitlePage
\TitleString{8}{Welcome}
@@ -169,9 +165,9 @@
\TitleString{8}{Quotes}
\StopTitlePage
-\Topic {Douglas R. Hofstadter} \input douglas \page
-\Topic {Donald E. Knuth} \input knuth \page
-\Topic {Edward R. Tufte} \input tufte \page
-\Topic {Hermann Zapf} \input zapf \page
+\Topic {Douglas R. Hofstadter} \input douglas \page
+\Topic {Donald E. Knuth} \input knuth \page
+\Topic {Edward R. Tufte} \input tufte \page
+\Topic {Hermann Zapf} \input zapf \page
-\stoptext
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-pre-22.tex b/Master/texmf-dist/tex/context/base/s-pre-22.tex
index cb09816dc4b..8930c34be02 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-22.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-22.tex
@@ -14,27 +14,27 @@
%D This style was made on behalf of the \PDFTEX\ presentation
%D at \TUG\ 2000. It cycled a summary of each talk, with name
%D and title. When documenting this style, I changed
-%D reprocessing into pushing on layers.
-%D
+%D reprocessing into pushing on layers.
+%D
%D A \quote {problem} like this can be solved in several ways:
-%D
+%D
%D \startitemize
-%D \item writing a lot of semi||complex \TEX\ code as shown
-%D \item keeping track of positions and draw everything on the
+%D \item writing a lot of semi||complex \TEX\ code as shown
+%D \item keeping track of positions and draw everything on the
%D page layer
-%D \item defining an overlay for each summary and changing the
-%D order when flushing
+%D \item defining an overlay for each summary and changing the
+%D order when flushing
%D \item maintaining a so called field stack
%D \stopitemize
-%D
-%D We go for the first method. We assume that summaries are
-%D simple text snippets.
+%D
+%D We go for the first method. We assume that summaries are
+%D simple text snippets.
\startmode[asintended] \setupbodyfont[lbr] \stopmode
\setupbodyfont[14.4pt]
-%D We use the whole page area.
+%D We use the whole page area.
\setuppapersize
[S6][S6]
@@ -47,8 +47,8 @@
width=middle,
height=middle]
-%D We define a couple of matching colors and gray scales.
-%D Watch out, some are really meant to look dim.
+%D We define a couple of matching colors and gray scales.
+%D Watch out, some are really meant to look dim.
\setupcolors
[state=start]
@@ -63,14 +63,14 @@
%D We will use foreground colors. Because these can interfere
%D with the colors they overload, we can bets make sure that
-%D we don't have local colors.
+%D we don't have local colors.
\setupinteraction
[state=start,
color=,
contrastcolor=]
-%D The presentation is supposed to cycle automatically.
+%D The presentation is supposed to cycle automatically.
\setupinteractionscreen
[option=max,
@@ -78,13 +78,13 @@
\setuppagetransitions
-%D We will use random positioning of objects.
+%D We will use random positioning of objects.
\setupsystem
- [random=medium]
+ [random=medium]
%D We have two kind of graphics: the page background and
-%D the shape around the textual elements.
+%D the shape around the textual elements.
\defineoverlay [shape] [\uniqueMPgraphic{shape}]
\defineoverlay [page] [\reuseMPgraphic{page}]
@@ -106,30 +106,30 @@
draw p withpen pencircle scaled .50cm withcolor \MPcolor{PageColor} ;
fill p withcolor OverlayColor ;
draw p withpen pencircle scaled .25cm withcolor OverlayLineColor ;
- currentpicture := currentpicture xysized(OverlayWidth,OverlayHeight) ;
+ currentpicture := currentpicture xysized(OverlayWidth,OverlayHeight) ;
\stopuniqueMPgraphic
-%D The resizing at the end is needed to get a nice inverted
-%D hyperlink when we click on it in a browser.
+%D The resizing at the end is needed to get a nice inverted
+%D hyperlink when we click on it in a browser.
-%D Behind the page we put a forward button:
+%D Behind the page we put a forward button:
\defineoverlay [forward] [\overlaybutton{forward}]
-%D The content will be managed by means of two layers.
+%D The content will be managed by means of two layers.
\definelayer [main] \defineoverlay [main] [\composedlayer{main}]
\definelayer [temp] \defineoverlay [temp] [\composedlayer{temp}]
%D The first layer will hold everything to be shown, while
-%D the second one gets the data we currently focus on.
-%D Therefore the first layer will not be flushed each page.
+%D the second one gets the data we currently focus on.
+%D Therefore the first layer will not be flushed each page.
\setuplayer
[main]
[state=repeat]
-%D All the overlays go onto the page area.
+%D All the overlays go onto the page area.
\setupbackgrounds
[page]
@@ -138,16 +138,16 @@
%D We have to collect all data before we typeset it. Each
%D element will be typeset dim and bright. The dim
%D alternatives will be collected on the main layer, but each
-%D bring one goes onto a box stack.
+%D bring one goes onto a box stack.
\initializeboxstack{Summary}
\initializeboxstack{Subtext}
-%D The macros that take care of all this manipulations look
-%D more complicated than they actually are. We use a
-%D scratchbox to collect and inspect data. Also, because we
-%D typeset each element twice, we need to make sure that we use
-%D the same random seed for both.
+%D The macros that take care of all this manipulations look
+%D more complicated than they actually are. We use a
+%D scratchbox to collect and inspect data. Also, because we
+%D typeset each element twice, we need to make sure that we use
+%D the same random seed for both.
\doglobal\newcounter\CurrentSummary
@@ -158,12 +158,12 @@
{\doglobal\increment\CurrentSummary
\setbox\scratchbox=\hbox{\strut#1}
\getrandomseed\RandomSeed
- \setlayer[main]
+ \setlayer[main]
{\RandomSubtextBox{DoneColor}{BotColor}{BotColor}}
\setrandomseed\RandomSeed
\savebox{Subtext}{\CurrentSummary}
{\RandomSubtextBox{TextColor}{BotColor}{black}}
- \setbox\scratchbox=\hbox \bgroup
+ \setbox\scratchbox=\hbox \bgroup
\setbox\scratchbox=\hbox{\bfb\setstrut\strut\quad#2\quad}%
\SetAcceptableWidth
\framed [offset=0pt,width=fit,frame=off,align=middle,strut=no]
@@ -171,9 +171,9 @@
\doifsomething{#2}{\noindent\box\scratchbox\blank}}
\def\StopSummary
- {\egroup \egroup
+ {\egroup \egroup
\getrandomseed\RandomSeed
- \setlayer[main]
+ \setlayer[main]
{\RandomSummaryBox{DoneColor}{TopColor}{TopColor}}
\setrandomseed\RandomSeed
\savebox{Summary}{\CurrentSummary}
@@ -182,11 +182,11 @@
%D A \type {\doStartSummary#1#2#3\StopSummary} could have been
%D used too but this one is less sensitive for catcode changes
%D (not that we expect problems like this in this kind of
-%D application).
+%D application).
-%D The width is either derived from the width ot the title or
+%D The width is either derived from the width ot the title or
%D at random. The final width of the box is detemined by the
-%D content.
+%D content.
\def\SetAcceptableWidth
{\scratchdimen=.5\makeupwidth
@@ -196,15 +196,15 @@
\getrandomdimen\hsize{.5\makeupwidth}{.7\makeupwidth}%
\fi}
-%D The subtext box goes at the bottom, somewhere in the right
-%D corner.
+%D The subtext box goes at the bottom, somewhere in the right
+%D corner.
\def\RandomSubtextBox#1#2#3%
{\vbox to \makeupheight
{\vfill
\hbox to \makeupwidth
{\hfill
- \button
+ \button
[offset=2ex,frame=off,background=shape,strut=no,
backgroundcolor=#1,framecolor=#2,foregroundcolor=#3]
{\copy\scratchbox}%
@@ -214,8 +214,8 @@
\getrandomdimen\scratchdimen{.5cm}{1.5cm}
\vskip \scratchdimen}}
-%D The main text goes in the top half of the page, not to
-%D far from the center. The last \type {\vskip} makes sure
+%D The main text goes in the top half of the page, not to
+%D far from the center. The last \type {\vskip} makes sure
%D that we don't clash with the subtexts.
\definereference[thispage][page(\CurrentSummary)]
@@ -227,7 +227,7 @@
\hbox to \makeupwidth
{\getrandomdimen\scratchdimen{.5cm}\makeupwidth
\hskip 0pt plus \scratchdimen
- \button
+ \button
[offset=3ex,frame=off,background=shape,strut=no,
backgroundcolor=#1,framecolor=#2,foregroundcolor=#3]
{\copy\scratchbox}%
@@ -239,8 +239,8 @@
\vskip.2\makeupheight}}
%D Because we conly collect data, we hav eto make sure that at
-%D some moment it is processed and flushed. The following loop
-%D does this.
+%D some moment it is processed and flushed. The following loop
+%D does this.
\def\BuildPage
{\dorecurse{\CurrentSummary}
@@ -249,11 +249,11 @@
\setlayer[temp]{\foundbox{Subtext}\recurselevel}
\stopstandardmakeup}}
-%D We hook this macro into the \type {\stoptext} macro.
+%D We hook this macro into the \type {\stoptext} macro.
\appendtoks \BuildPage \to \everystoptext
-%D We still need a title page.
+%D We still need a title page.
\def\TitlePage%
{\dodoublegroupempty\doTitlePage}
@@ -270,13 +270,13 @@
\def\MakeTitlePage#1#2%
{\StartSummary{#1}{#2}\StopSummary}
-%D For old times sake:
+%D For old times sake:
\long\def\StartTopic#1\StopTopic{\StartSummary#1\StopSummary}
\doifnotmode{demo}{\endinput}
-%D The demo text.
+%D The demo text.
\starttext
diff --git a/Master/texmf-dist/tex/context/base/s-pre-30.tex b/Master/texmf-dist/tex/context/base/s-pre-30.mkii
index 2a3899c9290..2a3899c9290 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-30.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-30.mkii
diff --git a/Master/texmf-dist/tex/context/base/s-pre-30.mkiv b/Master/texmf-dist/tex/context/base/s-pre-30.mkiv
new file mode 100644
index 00000000000..c3b524047d6
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-pre-30.mkiv
@@ -0,0 +1,257 @@
+%D \module
+%D [ file=s-pre-30,
+%D version=2006.04.25,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 30,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\usemodule[streams]
+
+\setuppapersize
+ [S6] [S6]
+
+\setupbodyfont
+ [12pt,tt]
+
+\definemeasure[bleed][6pt]
+
+\definecolor[maincolor-3][r=.5,g=.2,b=.2]
+\definecolor[maincolor-1][r=.2,g=.5,b=.2]
+\definecolor[maincolor-2][r=.2,g=.2,b=.5]
+
+\definecolor[pagecolor] [s=.5]
+\definecolor[resultcolor][s=1,t=.85,a=1]
+\definecolor[maincolor] [maincolor-3]
+
+\definecolorgroup
+ [maingroup]
+ [.5:.2:.2,
+ .2:.5:.2,
+ .2:.2:.5]
+
+\definecolorgroup
+ [resultgroup]
+ [1:.85:.85,
+ .85:1:.85,
+ .85:.85:1]
+
+\def\CurrentColor{1}
+
+\definecolor[maincolor] [maingroup:\CurrentColor]
+\definecolor[resultcolor][resultgroup:\CurrentColor]
+
+\def\NextColor{\ifnum\CurrentColor=3 \def\CurrentColor{1}\else\doglobal\increment\CurrentColor\fi}
+
+\setuplayout
+ [backspace=\measure{bleed},
+ topspace=30pt,
+ bottomdistance=\measure{bleed},
+ bottom=\dimexpr30pt-\measure{bleed}\relax,
+ header=0pt,
+ footer=0pt,
+ topdistance=\measure{bleed},
+ top=\dimexpr30pt-\measure{bleed}\relax,
+ width=middle,
+ height=middle]
+
+\setuptop
+ [before=\vfill,
+ after=\vfill,
+ strut=yes]
+
+\setupbackgrounds
+ [text]
+ [backgroundoffset=\measure{bleed},
+ background=color,
+ backgroundcolor=maincolor]
+
+\setupbackgrounds
+ [page]
+ [background=color,
+ backgroundcolor=pagecolor]
+
+\setupcolors
+ [state=start,
+ textcolor=white]
+
+\setuphead
+ [chapter]
+ [style=\ttd]
+
+\setuphead
+ [section]
+ [style=\ttd]
+
+\defineviewerlayer
+ [result]
+ [state=stop]
+
+\definelayer
+ [result]
+
+\setuplayer
+ [result]
+ [width=\textwidth,
+ height=\textheight]
+
+\setupbackgrounds
+ [text]
+ [background={color,toggle,foreground,result}]
+
+\setupinteraction
+ [state=start,
+ click=no,
+ menu=on,
+ color=white,
+ contrastcolor=white,
+ closepageaction=HideLayer{result},
+ openpageaction=HideLayer{result}]
+
+% We add a dummy color switch so that each page has at least one
+% transparency; else acrobat will render the pages differently
+% bug in 6 and 7).
+
+\startinteractionmenu[bottom]
+% \color[resultcolor]{ }%
+ \hfill
+ \got [content] content \\
+ \got [previouspage] previous \\
+ \got [nextpage] next \\
+ \got [ToggleLayer{result}] result \\
+ \got [CloseDocument] close \\
+\stopinteractionmenu
+
+\setuphead
+ [section]
+ [placehead=no,
+ incrementnumber=list]
+
+\setuplist
+ [section]
+ [alternative=f]
+
+\defineoverlay
+ [toggle]
+ [\overlaybutton{ToggleLayer{result}}]
+
+\definestreamlayer
+ [resultstream]
+
+\startsetups streamlayer:resultstream:flush
+ \setlayer
+ [result]
+ [preset=middlebottom,
+ hoffset=\measure{bleed},
+% voffset=-\measure{bleed}]
+ voffset=\measure{bleed}]
+ {\startviewerlayer[result]%
+% \framed
+% [offset=overlay,
+% frame=off,
+% background=color,
+% backgroundoffset=1\dimexpr\measure{bleed}\relax,
+% backgroundcolor=maincolor]
+ {\framed
+ [offset=overlay,
+ frame=off,
+ foregroundcolor=maincolor,
+ background=color,
+ backgroundoffset=1\dimexpr\measure{bleed}\relax,
+ backgroundcolor=resultcolor]
+ {\tightlayer[\currentstreamlayer]}}
+ \stopviewerlayer}
+\stopsetups
+
+\startsetups show-definition
+ \subject{definition}
+ \typebuffer
+ \getbuffer
+ \page
+\stopsetups
+
+\startsetups show-result
+ \startstreamlayer[resultstream]
+ \subject{result}
+ \getbuffer
+ \stopstreamlayer
+ \placestreamlayer[resultstream]
+ \page
+\stopsetups
+
+\startsetups show-usage
+ \subject{usage}
+ \typebuffer
+ \startstreamlayer[resultstream]
+ \subject{result}
+ \getbuffer
+ \stopstreamlayer
+ \placestreamlayer[resultstream]
+ \page
+\stopsetups
+
+\startsetups show-usage-lines
+ \subject{usage}
+ \typebuffer
+ \startstreamlayer[resultstream]
+ \subject{result}
+ \startlines
+ \getbuffer
+ \stoplines
+ \stopstreamlayer
+ \placestreamlayer[resultstream]
+ \page
+\stopsetups
+
+\startsetups show-contents
+ \startcolumns[n=3]
+ \placelist[section][criterium=text]
+ \stopcolumns
+ \pagereference[content]
+ \page
+ \NextColor
+\stopsetups
+
+\def\TitlePage#1%
+ {\title{#1}
+ \setups{show-contents}}
+
+\def\StartSample#1%
+ {\starttext
+ \page
+ \section{#1}
+ \setuptoptexts[][\processedfile\enspace:\enspace\lowercase{#1}]}
+
+\def\StopSample
+ {\page
+ \setuptoptexts[][]
+ \stoptext
+ \NextColor}
+
+\endinput
+
+\usemodule[pre-30]
+
+% \TitlePage{Howling to the moon}
+
+\StartSample{Basics}
+
+\startbuffer
+\lua{a = 1.5 ; b = 1.8 ; c = a*b ; tex.print(c) ;}
+
+\startlua
+ a = 1
+ b = 2
+ c = a*b
+ tex.print(c)
+\stoplua
+\stopbuffer
+
+\setups{show-usage}
+
+\StopSample
diff --git a/Master/texmf-dist/tex/context/base/s-pre-50.tex b/Master/texmf-dist/tex/context/base/s-pre-50.tex
index 782f6aea102..41ae048215d 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-50.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-50.tex
@@ -62,7 +62,7 @@
%D Structure and trick.
\def\StartSteps
- {\checkutilities}
+ {\doifnotmode{mkiv}{\checkutilities}}
\def\StopSteps
{\resetcollector[contribution]}
diff --git a/Master/texmf-dist/tex/context/base/s-pre-60.tex b/Master/texmf-dist/tex/context/base/s-pre-60.mkii
index f12b98b0633..4df3e8a617b 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-60.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-60.mkii
@@ -62,36 +62,20 @@
\def\NextStepLayer {step:\the\numexpr\StepCounter+1\relax}
\def\FirstStepLayer{step:1}
-\startmode[mkiv]
-
- \def\StartStep
- {\startproperty[\StepLayer]%
- \ignorespaces}
-
- \def\StopStep
- {\removeunwantedspaces
- \stopproperty}
-
-\stopmode
-
-\startnotmode[mkiv]
-
- \def\StartStep
- {\ifvmode
- \scratchskip\lastskip
- \vskip-\scratchskip
- \startproperty[\StepLayer]%
- \vskip\scratchskip
- \else
- \startproperty[\StepLayer]%
- \fi
- \ignorespaces}
-
- \def\StopStep
- {\removeunwantedspaces
- \stopproperty}
-
-\stopnotmode
+\def\StartStep
+ {\ifvmode
+ \scratchskip\lastskip
+ \vskip-\scratchskip
+ \startproperty[\StepLayer]%
+ \vskip\scratchskip
+ \else
+ \startproperty[\StepLayer]%
+ \fi
+ \ignorespaces}
+
+\def\StopStep
+ {\removeunwantedspaces
+ \stopproperty}
\def\StartSteps{\iftrialtypesetting\else\ResetStep\NextStep\StartStep\fi}
\def\StopSteps {\iftrialtypesetting\else\StopStep \PrevStep \fi}
diff --git a/Master/texmf-dist/tex/context/base/s-pre-60.mkiv b/Master/texmf-dist/tex/context/base/s-pre-60.mkiv
new file mode 100644
index 00000000000..aa5ec36d085
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-pre-60.mkiv
@@ -0,0 +1,134 @@
+%D \module
+%D [ file=s-pre-60,
+%D version=2004.03.15,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 60,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% use lua instead of global mess
+
+\startmode[paper,print]
+ \let\StartSteps\relax
+ \let\StopSteps \relax
+ \let\FlushStep \relax
+ \let\ResetStep \relax
+ \let\StartBusy \relax
+ \let\StopBusy \relax
+ \endinput
+\stopmode
+
+\newcounter\StepCounter
+\newcounter\StepMaximum
+
+\useJSscripts[stp]
+
+\startsetups[set-stepper]
+
+ \ifnum\getvariable{stepper}{nofsteps}>\StepMaximum
+
+ \dostepwiserecurse {\numexpr\StepMaximum+1\relax} {\getvariable{stepper}{nofsteps}} {1} {
+ \doifnotmode{nosteps,nostep} {
+ \expanded{\defineviewerlayer[step:\recurselevel][state=stop,scope=global]}
+ }
+ }
+
+ \xdef\StepMaximum{\getvariable{stepper}{nofsteps}}
+
+ \fi
+
+\stopsetups
+
+\setvariables
+ [stepper]
+ [set=\setups{set-stepper},
+ nofsteps=50]
+
+\defineviewerlayer[step:busy][state=start]
+
+\definereference [SetupStepper] [JS(SetupStepper{step,\StepMaximum})]
+\definereference [ResetStepper] [JS(ResetStepper)]
+\definereference [CheckStepper] [JS(CheckStepper{\StepCounter})]
+\definereference [InvokeStepper] [JS(InvokeStepper)]
+
+% todo: roll back blank
+
+\def\ResetStep {\doglobal\newcounter\StepCounter}
+\def\NextStep {\doglobal\increment \StepCounter}
+\def\PrevStep {\doglobal\decrement \StepCounter}
+
+\def\StepLayer {step:\StepCounter}
+\def\NextStepLayer {step:\the\numexpr\StepCounter+1\relax}
+\def\FirstStepLayer{step:1}
+
+\def\StartStep {\startviewerlayer[\StepLayer]\ignorespaces}
+\def\StopStep {\removeunwantedspaces\stopviewerlayer}
+\def\StartSteps {\iftrialtypesetting\else\ResetStep\NextStep\StartStep\fi}
+\def\StopSteps {\iftrialtypesetting\else\StopStep \PrevStep \fi}
+\def\FlushStep {\iftrialtypesetting\else\StopStep \NextStep\StartStep\fi}
+
+\def\StartBusy {\startviewerlayer[step:busy]\ignorespaces}
+\def\StopBusy {\removeunwantedspaces\stopviewerlayer}
+
+\appendtoks
+ \ResetStep
+\to \everyaftershipout
+
+\setupinteraction
+ [%openaction=SetupStepper,
+ closeaction=ResetStepper,
+ openpageaction=CheckStepper,
+ closepageaction=ResetStepper]
+
+\defineoverlay[invoke][\overlaybutton{InvokeStepper}]
+
+\setupbackgrounds
+ [text]
+ [background=invoke]
+
+% bonus
+
+\useMPlibrary[nav]
+
+\definepalet
+ [navplus]
+ [attach=interactioncolor,
+ comment=interactioncolor]
+
+\setupcomment
+ [symbol={comment-normal,comment-down},
+ textlayer=\StepLayer,
+ option=buffer,
+ height=\textheight,
+ width=\textwidth,
+ margin=0pt]
+
+\setupattachments
+ [symbol={attach-normal,attach-down},
+ textlayer=\StepLayer]
+
+%D Handy:
+
+\def\StartLocalSteps{\ResetStep}
+\def\StopLocalSteps {}
+
+\def\StartLocalStep {\NextStep\StartStep}
+\def\StopLocalStep {\StopStep}
+
+%D used as (given some definitions):
+%D
+%D \starttyping
+%D \StartLocalSteps
+%D \startcombination[both]
+%D {\StartLocalStep\placestreamlayer[left]\StopLocalStep} {}
+%D {\StartLocalStep\placestreamlayer[right]\StopLocalStep} {}
+%D \stopcombination
+%D \StopLocalSteps
+%D \stoptyping
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/s-pre-61.tex b/Master/texmf-dist/tex/context/base/s-pre-61.tex
index fa52d158a87..216bb9a003c 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-61.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-61.tex
@@ -221,7 +221,7 @@
[bottom] [text]
[background=topics]
-% \doifnotmode{demo}{\endinput}
+\doifnotmode{demo}{\endinput}
\starttext
diff --git a/Master/texmf-dist/tex/context/base/s-pre-62.tex b/Master/texmf-dist/tex/context/base/s-pre-62.tex
index 64bb3495b5d..8e50af5292e 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-62.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-62.tex
@@ -18,10 +18,21 @@
\usetypescriptfile
[type-ghz]
-\definetypeface[mainface][rm][serif][melior] [default][encoding=texnansi]
-\definetypeface[mainface][tt][mono] [modern] [default][encoding=texnansi,rscale=1.05]
-\definetypeface[mainface][ss][serif][melior] [default][encoding=texnansi]
-\definetypeface[mainface][mm][math] [palatino][default][encoding=texnansi,rscale=0.95]
+\doifmodeelse {mkiv} {
+
+ \definetypeface[mainface][rm][serif][melior] [default]
+ \definetypeface[mainface][tt][mono] [modern] [default][rscale=1.05]
+ \definetypeface[mainface][ss][serif][melior] [default]
+ \definetypeface[mainface][mm][math] [palatino][default][rscale=0.95]
+
+} {
+
+ \definetypeface[mainface][rm][serif][melior] [default][encoding=texnansi]
+ \definetypeface[mainface][tt][mono] [modern] [default][encoding=texnansi,rscale=1.05]
+ \definetypeface[mainface][ss][serif][melior] [default][encoding=texnansi]
+ \definetypeface[mainface][mm][math] [palatino][default][encoding=texnansi,rscale=0.95]
+
+}
\setupbodyfont
[mainface,14.4pt]
@@ -207,22 +218,8 @@
\def\TitlePage {\doTitlePage\TitleFont\relax}
\def\SubTitlePage{\doTitlePage\TitleFont\SubTitleFont}
-\doifnotmode{demo} {\endinput}
+\long\def\StartTitlePage #1\StopTitlePage {\TitlePage {#1}}
+\long\def\StartSubTitlePage#1\StopSubTitlePage{\SubTitlePage{#1}}
-\starttext
-
-\StartTitlePage
-bla\\bla bla\\bla
-\StopTitlePage
-
-\StartRemark {Bla Bla}
- Bla Bla Bla. \FlushStep
- Bla Bla Bla. \FlushStep
-\StopRemark
-
-\StartRemark {Bla Bla}
- Bla Bla Bla. \FlushStep
- Bla Bla Bla. \FlushStep
-\StopRemark
+\doifnotmode{demo} {\endinput}
-\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-pre-63.tex b/Master/texmf-dist/tex/context/base/s-pre-63.tex
index 76de8b99186..1a0fdf607c1 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-63.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-63.tex
@@ -11,6 +11,10 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+this module is under reconstruction
+
+\endinput
+
\usemodule[pre-61,streams]
\definemeasure[textgap] [\dimexpr24pt\relax]
@@ -58,12 +62,11 @@
\def\StartPair {}
\def\StopPair {\setups[place:both]}
-\doifnotmode {demo} {\endinput}
+% \doifnotmode {demo} {\endinput}
\setupbodyfont[8pt] \definefont[BigFont][Normal sa 4]
\starttext
-
\StartPage
\StartPair \StartLeft ZAPF \StopLeft \StartRight \input zapf \StopRight \StopPair
\StartPair \StartLeft DAVIS \StopLeft \StartRight \input davis \StopRight \StopPair
diff --git a/Master/texmf-dist/tex/context/base/s-pre-64.tex b/Master/texmf-dist/tex/context/base/s-pre-64.tex
index b9dc10002c8..9e82b255c55 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-64.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-64.tex
@@ -161,43 +161,48 @@
{\setuplayer[base][state=repeat]
\setlayer[base][preset=rightbottom]{\color[white]{\scale[height=9pt]{\strut#1}}}}
-\let\titlefont\relax
+\let\TitleFont\relax
\startmode[atpragma]
\definefontfeature[default][method=node,script=latn,language=dflt,liga=yes,onum=yes,kern=yes]
- \definedfont[palatinosanscom-regular*default at 12pt] \setupinterlinespace[line=15pt]
- \definefont[titlefont][palatinosanscom-bold*default at 48pt]
+ \definefont[TitleFont][palatinosanscom-bold*default at 48pt]
+ \definefont[MainTextFont][palatinosanscom-regular*default at 12pt] \setupinterlinespace[line=15pt]
+ \appendtoks
+ \MainTextFont % hack, as we define a bodyfont at that point (better have a proper typeface)
+ \to \everystarttext
\stopmode
-\endinput
+\doifnotmode{demo}{\endinput}
-% \starttext
+\starttext
-% \SetBanner{tug 2007 san diego}
+\usemodule[abr-01]
-% \Title {hans hagen}
+\SetBanner{tug 2007 san diego}
-% \startstandardmakeup \titlefont \setupinterlinespace[line=3ex] \vfill
+\Title {hans hagen}
-% \StartItem \dontleavehmode \quad {\morecolor zapfino, a} \StopItem
-% \StartItem \dontleavehmode \quad {\morecolor torture test} \StopItem
-% \StartItem \dontleavehmode \quad {\morecolor for luatex} \StopItem
+\startstandardmakeup \TitleFont \setupinterlinespace[line=3ex] \vfill
-% \vfill \stopstandardmakeup
+\StartItem \dontleavehmode \quad {\morecolor zapfino, a} \StopItem
+\StartItem \dontleavehmode \quad {\morecolor torture test} \StopItem
+\StartItem \dontleavehmode \quad {\morecolor for luatex} \StopItem
-% \Title{loading fonts}
+\vfill \stopstandardmakeup
-% \StartSteps
+\Title{loading fonts}
-% \StartItem the \OPENTYPE\ font reader is borrowed from \FONTFORGE\ \FlushStep \StopItem
-% \StartItem once it was ready, we could look into such a font \FlushStep \StopItem
-% \StartItem it tooks while to figure out the format due to rather fuzzy specs \FlushStep \StopItem
-% \StartItem it took us even more time to find out that the loader was flawed \FlushStep \StopItem
-% \StartItem one reason was that fonts themselves may have bugs or be incomplete \FlushStep \StopItem
-% \StartItem then we changed to \FONTFORGE\ version 2 \FlushStep \StopItem
-% \StartItem this made the missing pieces surface in more complex feature handling \FlushStep \StopItem
-% \StartItem while implementing features the new table format was cleaned up \FlushStep \StopItem
+\StartSteps
-% \StopSteps
+\StartItem the \OPENTYPE\ font reader is borrowed from \FONTFORGE\ \FlushStep \StopItem
+\StartItem once it was ready, we could look into such a font \FlushStep \StopItem
+\StartItem it tooks while to figure out the format due to rather fuzzy specs \FlushStep \StopItem
+\StartItem it took us even more time to find out that the loader was flawed \FlushStep \StopItem
+\StartItem one reason was that fonts themselves may have bugs or be incomplete \FlushStep \StopItem
+\StartItem then we changed to \FONTFORGE\ version 2 \FlushStep \StopItem
+\StartItem this made the missing pieces surface in more complex feature handling \FlushStep \StopItem
+\StartItem while implementing features the new table format was cleaned up \FlushStep \StopItem
-% \stoptext
+\StopSteps
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-pre-66.tex b/Master/texmf-dist/tex/context/base/s-pre-66.tex
index 916a7de66b6..e085caedafd 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-66.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-66.tex
@@ -131,3 +131,31 @@
\def\StopTitlePage
{\stopstandardmakeup}
+
+\doifnotmode{demo} {\endinput}
+
+\starttext
+
+\StartTitlePage x\\y\\z \StopTitlePage
+
+\StartRemark{a}
+ a \FlushStep
+ a \FlushStep
+\StopRemark
+
+\StartRemark{b}
+ b \FlushStep
+ b \FlushStep
+ b \FlushStep
+\StopRemark
+
+\StartRemark{c}
+ c \FlushStep
+ c \FlushStep
+ c \FlushStep
+ c \FlushStep
+\StopRemark
+
+\stoptext
+
+
diff --git a/Master/texmf-dist/tex/context/base/s-pre-67.tex b/Master/texmf-dist/tex/context/base/s-pre-67.tex
index 53c3260f59b..88043aa24a2 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-67.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-67.tex
@@ -124,13 +124,13 @@
\def\titlepage#1#2%
{\startstandardmakeup
- \definefont[LargeFont][Normal at 120pt]
+ \definefont[LargeFont][Normal at 100pt]
\setlayerframed
[title]
[preset=lefttop,x=1cm,y=.25cm]
[align=flushleft,foregroundstyle=\LargeFont,offset=0pt,foregroundcolor=lightcolor,frame=off]
{#1}
- \definefont[SmallFont][Normal at 60pt]
+ \definefont[SmallFont][Normal at 50pt]
\setlayerframed
[title]
[preset=rightbottom,x=1cm,y=.5cm]
@@ -141,4 +141,15 @@
\let\Title\title
\let\TitlePage\titlepage
+\doifnotmode{demo}{\endinput}
+
+\starttext
+ \chapter{Test}
+ \startitemize
+ \startitem test \stopitem
+ \startitem test \stopitem
+ \startitem test \stopitem
+ \stopitemize
+\stoptext
+
\endinput
diff --git a/Master/texmf-dist/tex/context/base/s-pre-68.tex b/Master/texmf-dist/tex/context/base/s-pre-68.tex
new file mode 100644
index 00000000000..616d410eb9c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-pre-68.tex
@@ -0,0 +1,150 @@
+%D \module
+%D [ file=s-pre-68,
+%D version=2009.08.28,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 68,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\usemodule[pre-60,abr-02]
+
+% style
+
+\setuppapersize
+ [S66][S66]
+
+\setuplayout
+ [height=middle,
+ width=middle,
+ header=0pt,
+ footer=0pt,
+ backspace=2cm,
+ topspace=2cm]
+
+\setupinteraction
+ [state=start,
+ click=no]
+
+\definecolor[maincolor][r=.4]
+
+\startreusableMPgraphic{page}
+ StartPage ;
+ fill Page enlarged 5mm withcolor \MPcolor{maincolor} ;
+ StopPage ;
+\stopreusableMPgraphic
+
+\startreusableMPgraphic{next}
+ fill ultriangle scaled .15PaperWidth withcolor white ;
+\stopreusableMPgraphic
+
+\startreusableMPgraphic{last}
+ fill boundingbox(ultriangle scaled .15PaperWidth) withcolor white ;
+\stopreusableMPgraphic
+
+\startuniqueMPgraphic{bullit}
+ fill ultriangle scaled 2ExHeight withcolor white ;
+\stopuniqueMPgraphic
+
+\definelayer
+ [extra]
+ [width=\paperwidth,
+ height=\paperheight]
+
+\defineoverlay
+ [page]
+ [\reuseMPgraphic{page}]
+
+\setupbackgrounds
+ [page]
+ [background={page,extra}]
+
+\setupcolors
+ [state=start,
+ textcolor=white]
+
+\setuphead
+ [chapter]
+ [style=\bfc]
+
+\definehead[Title][title]
+
+\definesymbol[MyBullet][\uniqueMPgraphic{bullit}]
+
+\setupitemgroup[itemize][each][symbol=MyBullet]
+
+\usetypescript[cambria]
+\setupbodyfont[cambria,14.4pt]
+
+% interface
+
+\def\StartItems
+ {\begingroup
+ \StartSteps
+ \startitemize
+ \def\StartItems{\startitemize\def\StopItems{\stopitemize}}}
+
+\def\StopItems
+ {\FlushStep
+ \stopitemize
+ \NextPageSymbol
+ \StopSteps
+ \endgroup}
+
+\def\Item
+ {\def\Item{\FlushStep\item}
+ \item}
+
+\def\NextPageSymbol
+ {\setlayer
+ [extra]
+ [preset=rightbottom,offset=2mm]
+ {\ifnum\realpageno=\lastpage
+ \reuseMPgraphic{last}%
+ \else\ifnum\realpageno>1
+ \reuseMPgraphic{next}%
+ \fi\fi
+ \FlushStep}}
+
+\def\TitlePage#1#2%
+ {\startstandardmakeup[bottom=,top=]
+ \scale[width=\textwidth]{\framed[align=flushleft,foregroundstyle=\bf,frame=off]{#1}}
+ \vfilll
+ \hfill\scale[width=.5\textwidth]{\framed[align=flushright,foregroundstyle=\bf,frame=off]{#2}}
+ \stopstandardmakeup}
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\TitlePage{I'm running\\out of examples}{Hans Hagen\\Someplace, 2031}
+
+\Title{Alpha}
+
+\StartItems
+\Item one
+\Item two
+\Item three
+\StopItems
+
+\Title{Beta}
+
+\StartItems
+\Item four
+\Item five
+\Item six
+\StopItems
+
+\Title{Gamma}
+
+\StartItems
+\Item seven
+\Item eight
+\Item nine
+\StopItems
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-pre-69.mkiv b/Master/texmf-dist/tex/context/base/s-pre-69.mkiv
new file mode 100644
index 00000000000..9cf6fdfd55a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-pre-69.mkiv
@@ -0,0 +1,335 @@
+%D \module
+%D [ file=s-pre-69,
+%D version=2010.04.28,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 69,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA ADE]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\setuppapersize[S6][S6]
+\setuppapersize[SM][SM]
+
+\usemodule
+ [abr-01,pre-60]
+
+\setupinteraction
+ [state=start,
+ contrastcolor=white,
+ color=white,
+ click=no]
+
+\setuplayout
+ [location=middle,
+ topspace=60pt,
+ bottomspace=80pt,
+ backspace=80pt,
+ header=0pt,
+ footer=0pt,
+ width=middle,
+ height=middle]
+
+\setupcolors
+ [textcolor=white]
+
+\setupbodyfont[euler]
+
+\definecolor[maincolor] [blue]
+\definecolor[extracolor][green]
+
+% \definecolor[maincolor] [red]
+% \definecolor[extracolor][blue]
+
+\startMPinitializations
+ if unknown MyColor[1] :
+ color MyColor[] ;
+ MyColor[1] := transparent(1,.25,\MPcolor{maincolor}) ;
+ MyColor[2] := transparent(1,.25,\MPcolor{extracolor}) ;
+
+ picture MySoFar ; MySoFar := nullpicture ;
+ path MyLastOne ; MyLastOne := origin -- cycle ;
+ color MyPageColor ; MyPageColor := MyColor[1] ;
+ path MyLeftSteps, MyRightSteps ;
+ boolean MyPageDone ; MyPageDone := false ;
+
+ vardef MySmallShape(expr parent) =
+ path p ; p := boundingbox parent ;
+ p := boundingbox parent ;
+ numeric w, h ; w := bbwidth(p) ; h := bbheight(p) ;
+ urcorner p shifted (-uniformdeviate w/4,0) --
+ lrcorner p shifted (0,uniformdeviate h/4) --
+ llcorner p shifted (uniformdeviate w/4,0) --
+ ulcorner p shifted (0,-uniformdeviate h/4) -- cycle
+ enddef ;
+
+ vardef MyShape(expr parent) =
+ path p ; p := boundingbox parent ;
+ if MyPageDone :
+ MyPageDone := false ;
+ urcorner p shifted (-EmWidth + -uniformdeviate CutSpace/2,0) --
+ lrcorner p shifted (0,EmWidth + uniformdeviate BottomSpace/2) --
+ llcorner p shifted (EmWidth + uniformdeviate BackSpace/2,0) --
+ ulcorner p shifted (0,-EmWidth + -uniformdeviate TopSpace/2) -- cycle
+ else :
+ MyPageDone := true ;
+ urcorner p shifted (0,-EmWidth + -uniformdeviate TopSpace/2) --
+ lrcorner p shifted (-EmWidth + -uniformdeviate CutSpace/2,0) --
+ llcorner p shifted (0,EmWidth + uniformdeviate BottomSpace/2) --
+ ulcorner p shifted (EmWidth + uniformdeviate BackSpace/2,0) -- cycle
+ fi
+ enddef ;
+
+ vardef MyMakeOne =
+ MyLastOne := MyShape(Page) ;
+ enddef ;
+
+ vardef MyAddOne =
+ addto MySoFar also image(fill MyLastOne withcolor MyPageColor ; ) ;
+ enddef ;
+
+ vardef MyDrawOne =
+ fill MyLastOne withcolor black ;
+ fill MyLastOne withcolor MyPageColor ;
+ enddef ;
+
+ vardef MyDrawPage =
+ draw MySoFar ;
+ enddef ;
+
+ vardef MySetSteps =
+ path l, r ; numeric s ; path ll[], rr[] ; path t ;
+ l := point 2 of MyLastOne -- point 3 of MyLastOne ;
+ r := point 0 of MyLastOne -- point 1 of MyLastOne ;
+ t := topboundary Field[Text][Text] rightenlarged TextWidth leftenlarged TextWidth ;
+ s := bbheight(Field[Text][Text])/LineHeight + 2 ;
+ t := t shifted (0,-TopSkip) ;
+ for i=1 upto s :
+ ll[i] := t intersectionpoint l ;
+ rr[i] := t intersectionpoint r ;
+ t := t shifted (0,-LineHeight) ;
+ endfor ;
+ MyLeftSteps := for i=1 upto s : ll[i] -- endfor cycle ;
+ MyRightSteps := for i=1 upto s : rr[i] -- endfor cycle ;
+ enddef ;
+
+ vardef MyDrawText(expr txt) =
+ pair a ; a := (point 1 of MyLastOne) - (point 2 of MyLastOne) ;
+ picture p ; p := txt ;
+ p := p
+ shifted (-EmWidth,EmWidth)
+ shifted ulcorner txt
+ shifted point 1 of MyLastOne ;
+ p := p rotatedaround(lrcorner p, radian * tan(ypart a/xpart a)) ;
+ setbounds p to origin -- cycle ;
+ draw p ;
+ enddef ;
+
+ vardef MyDrawTitle(expr txt) =
+ % pair a ; a := (point 2 of MyLastOne) - (point 3 of MyLastOne) ;
+ pair a ; a := (point 3 of MyLastOne) - (point 4 of MyLastOne) ;
+ picture p ;
+ if bbheight(txt) > bbwidth(txt) :
+ p := txt ysized(0.8*TextHeight) ;
+ else :
+ p := txt xsized(0.8*TextWidth) ;
+ fi ;
+ numeric d ; d := arclength(point 2 of MyLastOne -- point 3 of MyLastOne) - bbheight(p) ;
+ p := p
+ shifted (BackSpace,-d/2)
+ shifted -ulcorner p
+ shifted point 3 of MyLastOne ;
+ % p := p rotatedaround(ulcorner p, - radian * tan(xpart a/ypart a)) ;
+ % p := p rotatedaround(ulcorner p, radian * tan(ypart a/xpart a)) ;
+ setbounds p to origin -- cycle ;
+ draw p ;
+ enddef ;
+
+ vardef MyDrawSteps =
+ s := bbheight(Field[Text][Text])/LineHeight + 2 ;
+ for i=1 upto s :
+ draw ll[i] withpen pencircle scaled 1mm ;
+ draw rr[i] withpen pencircle scaled 1mm ;
+ draw ll[i] -- rr[i] ;
+ endfor ;
+ draw Field[Text][Text] ;
+ enddef ;
+
+ fi ;
+\stopMPinitializations
+
+\startuseMPgraphic{initialization}
+ StartPage ;
+ MySoFar := image(fill Page enlarged 12pt withcolor MyPageColor) ;
+ MyMakeOne ;
+ MySetSteps ;
+ StopPage ;
+\stopuseMPgraphic
+
+\appendtoks
+ \startnointerference
+ \useMPgraphic{initialization}
+ \stopnointerference
+\to \everystarttext
+
+\startuseMPgraphic{page}
+ StartPage ;
+ MyDrawPage ;
+ MyDrawOne ;
+ MySetSteps ;
+ MyDrawTitle(textext("\getvariable{document}{title}")) ;
+ MyDrawText(textext("\getvariable{document}{topic}")) ;
+ %
+ % we have multiple runs when we have text
+ %
+% MyDrawSteps ;
+% MyMakeOne ;
+% MySetSteps ;
+ StopPage ;
+\stopuseMPgraphic
+
+\appendtoks
+ \startnointerference
+ \startMPcode
+ MyAddOne ;
+ MyMakeOne ;
+ MySetSteps ;
+ \stopMPcode
+ \stopnointerference
+\to \everyshipout
+
+\defineoverlay[page][\useMPgraphic{page}]
+
+\startuseMPgraphic{symbol}
+ color cc ; cc := MyColor[2] ;
+ path p ; p := MySmallShape(unitsquare scaled (.6*LineHeight)) ;
+ fill p withcolor white ;
+ fill p withcolor cc ;
+\stopuseMPgraphic
+
+\definesymbol[mysymbol][\struttedbox{\useMPgraphic{symbol}}]
+
+\setupitemgroup[itemize][1][symbol=mysymbol]
+
+\setupbackgrounds
+ [page]
+ [background=page]
+
+\startluacode
+ local texdimen = tex.dimen
+ function document.SetParShape()
+ local leftpath = metapost.getclippath("metafun","metafun","clip currentpicture to MyLeftSteps ;")
+ local rightpath = metapost.getclippath("metafun","metafun","clip currentpicture to MyRightSteps ;")
+ local shape = { }
+ for i=1,#leftpath do
+ local left = leftpath[i].x_coord
+ local right = rightpath[i].x_coord
+ local hsize = right - left - (texdimen.backspace + texdimen.cutspace)*number.dimenfactors.bp
+ shape[#shape+1] = string.format("%sbp %sbp",left,hsize)
+ end
+ -- print(table.serialize(shape))
+ tex.sprint(tex.ctxcatcodes,string.format("\\parshape %s %s",#shape,table.concat(shape," ")))
+ end
+\stopluacode
+
+\nopenalties \dontcomplain
+
+\setupwhitespace[none]
+
+\def\StartText#1#2%
+ {\starttext
+ \setvariable{document}{title}{\framed[frame=off,offset=0pt,align=flushleft,foregroundstyle=\tfd\setupinterlinespace]{\begstrut#1\endstrut}}
+ \setvariable{document}{topic}{\tfb#2}
+ \startstandardmakeup
+ % dummy page
+ \stopstandardmakeup
+ \setvariable{document}{title}{}
+ \setvariable{document}{topic}{}}
+
+\def\StopText
+ {\stoptext}
+
+\def\StartItems#1%
+ {\setvariable{document}{topic}{\tfb#1}
+ \startstandardmakeup[top=,bottom=\vss]
+ \startelement[items][title={#1}]%
+ \ctxlua{document.SetParShape()}
+ \StartSteps}
+
+\def\StopItems
+ {\StopSteps
+ \stopelement
+ \stopstandardmakeup}
+
+\def\StartItem
+ {\dontleavehmode
+ \startelement[item]%
+ \llap{\symbol[mysymbol]\quad}% graphic
+ \ignorespaces}
+
+\def\StopItem
+ {\removeunwantedspaces
+ \nobreak
+ \crlf
+ \stopelement
+ \crlf
+ \FlushStep}
+
+\def\ShapeParagraph
+ {\ctxlua{document.SetParShape()}}
+
+% no parshape yet
+
+\def\StartParagraphs#1%
+ {\setvariable{document}{topic}{\tfb#1}
+ \startstandardmakeup[top=,bottom=\vss]
+ %\ctxlua{document.SetParShape()}
+ \startelement[paragraphs]%
+ \StartSteps}
+
+\def\StopParagraphs
+ {\StopSteps
+ \stopelement
+ \stopstandardmakeup}
+
+\def\StartParagraph
+ {\startelement[paragraph]}
+
+\def\StopParagraph
+ {\par
+ \stopelement
+ \FlushStep}
+
+% experiment .. likely to change
+
+\setelementexporttag[items] [nature][display]
+\setelementexporttag[item] [nature][mixed]
+\setelementexporttag[paragraphs][nature][display]
+\setelementexporttag[paragraph] [nature][mixed]
+
+\doifnotmode{demo}{\endinput}
+
+% finetuning: \StartText{\TEX\ and Reality\vskip2exClashing Mindsets?\vskip1ex}{Bacho\TEX, May 1, 2010}
+
+\StartText{Just\\A Demo}{Bacho\TEX, May 1, 2010}
+
+\StartItems{Quote from Tufte and Ward}
+ \StartItem
+ \input tufte
+ \StopItem
+ \StartItem
+ \input ward
+ \StopItem
+\StopItems
+
+% \dorecurse{20}{
+% \ctxlua{document.SetParShape()}
+% \input tufte
+% \page
+% }
+
+\StopText
+
diff --git a/Master/texmf-dist/tex/context/base/s-pre-70.tex b/Master/texmf-dist/tex/context/base/s-pre-70.mkiv
index 1a842388b0e..60462cf7a9b 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-70.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-70.mkiv
@@ -1,5 +1,3 @@
-% engine=luatex
-
%D \module
%D [ file=s-pre-70,
%D version=2008.04.15,
@@ -13,13 +11,15 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\usemodule[punk] \usetypescript[punk] \setupbodyfont[punk,20pt]
-
%D At the cost of more runtime and a larger output file, we
%D turn on randomization. The instances are cached in the
%D MkIV cache, so successive runs use the same shapes.
-\EnableRandomPunk
+% \usemodule[punk] \usetypescript[punk] \setupbodyfont[punk,20pt]
+%
+% \EnableRandomPunk
+
+\setupbodyfont[punknova,20pt] % we now use the opentype variant
%D We use the regular screen size paper and layout setup.
@@ -97,7 +97,9 @@
%D We don't want these reversed clicked areas in Acrobat.
\setupinteraction
- [click=no]
+ [click=no,
+ color=white, % pagecolor,
+ contrastcolor=white] % pagecolor,
%D We define a rather simple navigational panel at the
%D bottom
diff --git a/Master/texmf-dist/tex/context/base/s-pre-71.lua b/Master/texmf-dist/tex/context/base/s-pre-71.lua
new file mode 100644
index 00000000000..bfa45a70578
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-pre-71.lua
@@ -0,0 +1,63 @@
+if not modules then modules = { } end modules ['steps'] = {
+ version = 1.001,
+ comment = "companion to steps.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+moduledata.steps = moduledata.steps or { }
+local steps = moduledata.steps
+
+local locations = {
+ 'lefttop',
+ 'middletop',
+ 'righttop',
+ 'middleleft',
+ 'middle',
+ 'middleright',
+ 'leftbottom',
+ 'middlebottom',
+ 'rightbottom',
+}
+
+local done, current, previous, n
+
+function steps.reset_locations()
+ done, current, previous, n = table.tohash(locations,false), 0, 0, 0
+end
+
+function steps.next_location(loc)
+ previous = current
+ n = n + 1
+ loc = loc and loc ~= "" and tonumber(loc)
+ while true do
+ current = loc or math.random(1,#locations)
+ if not done[current] then
+ done[current] = true
+ break
+ end
+ end
+end
+
+function steps.current_location()
+ context(locations[current] or "")
+end
+
+function steps.previous_location()
+ context(locations[previous] or "")
+end
+
+function steps.current_n()
+ context(current)
+end
+
+function steps.previous_n()
+ context(previous)
+end
+
+function steps.step()
+ context(n)
+end
+
+steps.reset_locations()
diff --git a/Master/texmf-dist/tex/context/base/s-pre-71.tex b/Master/texmf-dist/tex/context/base/s-pre-71.mkii
index 91075d54d37..db65c8e2819 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-71.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-71.mkii
@@ -185,6 +185,9 @@
\definefont[TitleFont][SansBold at 60pt]
\definefont[TempFont] [SansBold at 12pt]
+\let\StartText\starttext
+\let\StopText \stoptext
+
\doifnotmode{demo}{\endinput}
\starttext
diff --git a/Master/texmf-dist/tex/context/base/s-pre-71.mkiv b/Master/texmf-dist/tex/context/base/s-pre-71.mkiv
new file mode 100644
index 00000000000..69280243b55
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-pre-71.mkiv
@@ -0,0 +1,170 @@
+% engine=luatex
+
+%D \module
+%D [ file=s-pre-71,
+%D version=2008.08.05,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 71,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 I might improve this module so consider it experimental.
+
+% \enablemode[numbers]
+% \enablemode[paper]
+
+\usemodule[pre-60,abr-02]
+
+\registerctxluafile{s-pre-71}{}
+
+\setupinteraction[state=start,click=off]
+
+\definepapersize[wide][width=900pt,height=600pt]
+
+\setuppapersize[wide][wide]
+
+\setuplayout[page]
+
+% \setupbodyfont[15pt]
+
+\usetypescriptfile[type-hgz]
+\usetypescript[palatino-informal]
+\setupbodyfont[palatino-informal,15pt]
+
+\setupsorting[logo][style=]
+
+\startnotmode[paper]
+ \setupbackgrounds[page][background=color,backgroundcolor=black]
+\stopnotmode
+
+\TransparencyHack
+
+\definelayer[page][width=\paperwidth,height=\paperheight]
+
+\definecolor[TopicColor-1][r=.3,g=.4,b=.5]
+\definecolor[TopicColor-2][r=.3,g=.5,b=.4]
+\definecolor[TopicColor-3][r=.4,g=.3,b=.5]
+\definecolor[TopicColor-4][r=.4,g=.5,b=.3]
+\definecolor[TopicColor-5][r=.5,g=.3,b=.4]
+\definecolor[TopicColor-6][r=.5,g=.4,b=.3]
+\definecolor[TopicColor-7][r=.35,g=.35,b=.6]
+\definecolor[TopicColor-8][r=.6,g=.35,b=.35]
+\definecolor[TopicColor-9][r=.35,g=.6,b=.35]
+
+\definecolor[TopicColor-0][t=.5,a=1,s=.5]
+\definecolor[TopicColor] [s=1]
+
+\setupcolors[state=start]
+\setupcolors[textcolor=TopicColor]
+
+\def\StartTopics
+ {\startstandardmakeup
+ \ctxlua{moduledata.steps.reset_locations()}
+ \doifnotmode{paper}{\StartLocalSteps}}
+
+\def\StopTopics
+ {\doifnotmode{paper}{\StopLocalSteps}
+ \flushlayer[page]
+ \stopstandardmakeup}
+
+\def\StartTopic
+ {\dosingleempty\doStartTopic}
+
+\def\doStartTopic[#1]%
+ {\doifnotmode{paper}{\NextStep}
+ \ctxlua{moduledata.steps.next_location("#1")}
+ \startnotmode[paper]
+ \doifnothing{#1}
+ {\ifcase\ctxlua{moduledata.steps.previous_n()}\else
+ \setlayer
+ [page]
+ [preset=\ctxlua{moduledata.steps.previous_location()}]
+ \bgroup
+ \doifnotmode{paper}{\startviewerlayer[\StepLayer]}%
+ \framed
+ [offset=20pt,
+ strut=no,
+ align=normal,
+ frame=off,
+ height=\dimexpr\paperheight/3\relax,
+ width=\dimexpr\paperwidth/3\relax,
+ background=color,
+ backgroundcolor=TopicColor-0]
+ {}%
+ \doifnotmode{paper}{\stopviewerlayer}%
+ \egroup
+ \fi}
+ \stopnotmode
+ \setlayer
+ [page]
+ [preset=\ctxlua{moduledata.steps.current_location()}]
+ \bgroup
+ \doifnotmode{paper}{\startviewerlayer[\StepLayer]}%
+ \framed
+ [offset=20pt,
+ strut=no,
+ align=\expdoifelse{#1}{}{normal}{middle,lohi},
+ align=\expdoifelse{#1}{}{flushleft,verytolerant}{middle,lohi},
+ frame=off,
+ height=\dimexpr\paperheight/3\relax,
+ width=\dimexpr\paperwidth/3\relax,
+ background=color,
+ backgroundcolor=TopicColor-\ctxlua{moduledata.steps.current_n()}]
+ \bgroup
+ \ignorespaces}
+
+\def\StopTopic
+ {\removeunwantedspaces
+ \egroup
+ \doifnotmode{paper}{\stopviewerlayer}%
+ \egroup
+ \startmode[numbers]
+ \setlayerframed
+ [page]
+ [preset=\ctxlua{moduledata.steps.current_location()}]
+ [height=\dimexpr\paperheight/3\relax,
+ width=\dimexpr\paperwidth/3\relax,
+ frame=off,
+ foregroundstyle=\bfa,
+ align={flushright,low}]
+ {\doifnotmode{paper}{\startviewerlayer[\StepLayer]}%
+ \ctxlua{moduledata.steps.step()}\kern\strutdepth
+ \doifnotmode{paper}{\stopviewerlayer}}
+ \stopmode}
+
+\logo [METAPOST] {MetaPost}
+
+\definefont[TitleFont][SansBold at 60pt]
+\definefont[TempFont] [SansBold at 12pt]
+
+\let\StartText\starttext
+\let\StopText \stoptext
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\StartTopics
+ \StartTopic[1] A \StopTopic
+ \StartTopic[5] B \StopTopic
+ \StartTopic[9] C \StopTopic
+\StopTopics
+
+\StartTopics
+ \StartTopic A \StopTopic
+ \StartTopic B \StopTopic
+ \StartTopic C \StopTopic
+ \StartTopic D \StopTopic
+ \StartTopic E \StopTopic
+ \StartTopic F \StopTopic
+ \StartTopic G \StopTopic
+ \StartTopic H \StopTopic
+ \StartTopic I \StopTopic
+\StopTopics
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-pre-93.tex b/Master/texmf-dist/tex/context/base/s-pre-93.tex
index b6764580656..7eabd5ed133 100644
--- a/Master/texmf-dist/tex/context/base/s-pre-93.tex
+++ b/Master/texmf-dist/tex/context/base/s-pre-93.tex
@@ -169,8 +169,6 @@
\starttext
-\setupoutput[pdftex]
-
\TitlePage{August 2000}{Something Very Important}
\StartTopic{Alpha}
diff --git a/Master/texmf-dist/tex/context/base/s-pre-96.tex b/Master/texmf-dist/tex/context/base/s-pre-96.tex
new file mode 100644
index 00000000000..705e74eecd4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-pre-96.tex
@@ -0,0 +1,188 @@
+%D \module
+%D [ file=s-pre-26,
+%D version=1999.08.20,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Presentation Environment 26,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\setuppapersize
+ [S44][S44]
+
+\definetypeface[main][rm][casual][informal][default]
+
+\setupbodyfont[main,13pt]
+
+\setuplayout
+ [backspace=0pt,
+ topspace=0pt,
+ header=0pt,
+ footer=0pt,
+ bottom=0pt,
+ width=middle,
+ height=fit]
+
+\setupbottom
+ [style=\ssbf,
+ color=white]
+
+\setupfooter
+ [style=\ssbfb,
+ color=white]
+
+\setupinteraction
+ [state=start,
+ click=no]
+
+\setupinteractionscreen
+ [option=max]
+
+\definecolor[white] [s=.8]
+\definecolor[red] [r=.7]
+\definecolor[green] [g=.7]
+\definecolor[blue] [b=.7]
+\definecolor[yellow][r=.7,g=.7]
+
+\setupcolors
+ [state=start]
+
+\defineoverlay [page] [\reuseMPgraphic{page}]
+\defineoverlay [text] [\useMPgraphic {text}]
+\defineoverlay [continue] [\overlaybutton {nextpage}]
+
+\setupbackgrounds % otherwise in acrobat 5 rounding error
+ [paper] % and one pixel white line
+ [background=page]
+
+\setupbackgrounds
+ [page]
+ [background={page,continue}]
+
+\definecolor [PageColor][black]
+
+\definecolor [TextColor 0][white]
+\definecolor [TextColor 1][red]
+\definecolor [TextColor 2][green]
+\definecolor [TextColor 3][blue]
+\definecolor [TextColor 4][yellow]
+
+\definecolor [TextColor] [TextColor 0]
+
+\defineframedtext
+ [TopicPage]
+
+\defineframedtext
+ [TopicText]
+
+\setupframedtexts
+ [TopicPage]
+ [width=\textwidth,
+ height=\textheight,
+ offset=overlay]
+
+\setupframedtexts
+ [TopicText]
+ [offset=10pt,
+ style=bold,
+ width=\TopicWidth,
+ background=text,
+ align=normal]
+
+\setupframedtexts
+ [TopicPage,TopicText]
+ [frame=off,
+ depthcorrection=off,
+ before=,
+ after=]
+
+\newbox \TopicBox % we stack old pages
+\newcounter\KindOfTopic % and cycle through corners
+\newdimen \TopicWidth % with randomized widths
+
+\setupinteraction
+ [color=lightgray,
+ contrastcolor=lightgray,
+ style=]
+
+\def\StartTopic
+ {\definecolor[TextColor][TextColor \KindOfTopic]
+ \ifcase\KindOfTopic\relax
+ \TopicWidth=.7\textwidth
+ \else
+ \getrandomdimen\TopicWidth{.55\textwidth}{.7\textwidth}
+ \fi
+ \ifcase\KindOfTopic\relax
+ \setupframedtexts [TopicPage] [align={middle,lohi}] \or
+ \setupframedtexts [TopicPage] [align={right,high}] \or
+ \setupframedtexts [TopicPage] [align={left,high}] \or
+ \setupframedtexts [TopicPage] [align={left,low}] \or
+ \setupframedtexts [TopicPage] [align={right,low}] \fi
+ \setbox\scratchbox=\vbox \bgroup \dontcomplain
+ \noindent \startTopicPage [none]
+ \noindent \startTopicText [none] }
+
+\def\StopTopic%
+ {\stopTopicText
+ \stopTopicPage
+ \egroup
+ \global\setbox\TopicBox=\vbox
+ {\startoverlay
+ {\box\TopicBox} {\box\scratchbox}
+ \stopoverlay}
+ \copy\TopicBox
+ \ifnum\KindOfTopic=4
+ \def\KindOfTopic{1}
+ \else
+ \increment\KindOfTopic
+ \fi
+ \getrandomdimen\TopicWidth{.55\textwidth}{.7\textwidth}
+ \page}
+
+\startuseMPgraphic{text}
+ path p ; p := unitsquare xyscaled (OverlayWidth,OverlayHeight) ;
+ color c ; c := (.7+uniformdeviate.3)*\MPcolor{TextColor} ;
+ p := p enlarged -1.25pt ;
+ filldraw p withcolor c ;
+ draw p withpen pencircle scaled 2.5pt withcolor .75c ;
+\stopuseMPgraphic
+
+\startreusableMPgraphic{page}
+ path p ; p := unitsquare xyscaled (OverlayWidth,OverlayHeight) ;
+ color c ; c := \MPcolor{PageColor} ;
+ filldraw p enlarged 5pt withcolor c ; % bleeding
+ draw p withpen pencircle scaled 2.5pt withcolor c ;
+\stopreusableMPgraphic
+
+\def\StartNopic
+ {\def\KindOfTopic{0} % centered at the page
+ \StartTopic
+ \bfd\setupinterlinespace
+ \def\\{\blank\bfb\setupinterlinespace}
+ \raggedcenter}
+
+\def\StopNopic
+ {\StopTopic}
+
+\def\TitlePage#1%
+ {\StartNopic#1\StopNopic}
+
+\doifnotmode{demo}{\endinput}
+
+\starttext
+
+\StartNopic
+ a dull talk \\ \currentdate
+\StopNopic
+
+\dorecurse{10}{\StartTopic \input tufte \StopTopic}
+
+\StartNopic
+ that's it \\ goodbye
+\StopNopic
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-reg-01.tex b/Master/texmf-dist/tex/context/base/s-reg-01.mkiv
index 123b97384d8..d3e456881c8 100644
--- a/Master/texmf-dist/tex/context/base/s-reg-01.tex
+++ b/Master/texmf-dist/tex/context/base/s-reg-01.mkiv
@@ -26,15 +26,25 @@ function regimes.show(regime)
regime = regimes.synonyms[regime] or regime
local r = regimes.data[regime]
if r then
- tex.sprint(tc,"\\starttabulate[|rT|T|rT|lT|lT|lT|]")
+ local chardata = characters.data
+ context.starttabulate { "|rT|T|rT|lT|lT|lT|" }
for k, v in ipairs(r) do
- tex.sprint(tex.ctxcatcodes, string.format("\\NC %s\\NC\\getvalue{%s}\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR", k,
- characters.contextname(v), characters.hexindex(v), characters.contextname(v),
- characters.category(v), characters.description(v)))
+ local chr = chardata[v]
+ if chr then
+ context.NC() context(k)
+ context.NC() context.getvalue(chr.contextname])
+ context.NC() context("%U+05X",v)
+ context.NC() context(chr.contextname)
+ context.NC() context(chr.category)
+ context.NC() context(chr.description)
+ context.NC() context.NR()
+ else
+ -- can't happen
+ end
end
- tex.sprint(tex.ctxcatcodes,"\\stoptabulate")
+ context.stoptabulate()
else
- tex.sprint(tex.ctxcatcodes,"unknown regime " .. regime)
+ context("unknown regime %s",regime)
end
end
\stopluacode
diff --git a/Master/texmf-dist/tex/context/base/s-set-31.mkiv b/Master/texmf-dist/tex/context/base/s-set-31.mkiv
new file mode 100644
index 00000000000..53037a78db4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/s-set-31.mkiv
@@ -0,0 +1,118 @@
+% show missing translations
+
+\startluacode
+function interfaces.show_missing(whatinterfaces)
+ whatinterfaces = whatinterfaces or interfaces.interfaces
+ local list = dofile(resolvers.find_file("mult-def.lua"))
+ local NC, NR, HL = context.NC, context.NR, context.HL
+ for k,v in table.sortedhash(list) do
+ context.title(k)
+ context.starttabulate { string.rep("|",#whatinterfaces+1) }
+ for i=1,#whatinterfaces do
+ NC()
+ context(whatinterfaces[i])
+ end
+ NC() NR() HL()
+ for kk, vv in next, v do
+ if not string.find(kk,"subsub") then
+ local okay = true
+ for i=1,#whatinterfaces do
+ local int = whatinterfaces[i]
+ local str = vv[int]
+ if not str or (int ~= "en" and str == vv.en) then
+ okay = false
+ break
+ end
+ end
+ if not okay then
+ for i=1,#whatinterfaces do
+ local int = whatinterfaces[i]
+ local str = vv[int]
+ context.NC()
+ if not str then
+ -- nothing
+ elseif int == "en" then
+ context.color( { "darkgreen" }, str )
+ elseif str == vv.en then
+ context.color( { "darkred" }, str )
+ elseif int == "pe" then
+ context("\\righttoleft " .. str)
+ else
+ context(str)
+ end
+ end
+ NC() NR()
+ end
+ end
+ end
+ context.stoptabulate()
+ end
+end
+
+function interfaces.show_missing_messages(whatinterfaces)
+ whatinterfaces = whatinterfaces or interfaces.interfaces
+ local list = dofile(resolvers.find_file("mult-mes.lua"))
+ local NC, NR, HL = context.NC, context.NR, context.HL
+ for k,v in table.sortedhash(list) do
+ context.title("message: " .. k)
+ context.starttabulate { "|l|" .. string.rep("pl|",#whatinterfaces) }
+ NC()
+ for i=1,#whatinterfaces do
+ NC()
+ context(whatinterfaces[i])
+ end
+ NC() NR() HL()
+ local sorted = table.sortedkeys(v)
+ for i=1,#sorted do
+ local kk = sorted[i]
+ local vv = v[kk]
+ if kk ~= "files" then
+ local okay = true
+ for i=1,#whatinterfaces do
+ local int = whatinterfaces[i]
+ local str = vv[int]
+ if not str or (int ~= "en" and str == vv.en) then
+ okay = false
+ break
+ end
+ end
+ if not okay then
+ context.NC()
+ context(kk)
+ for i=1,#whatinterfaces do
+ local int = whatinterfaces[i]
+ local str = vv[int]
+ NC()
+ if not str then
+ -- nothing
+ elseif int == "en" then
+ context.color( { "darkgreen" }, str )
+ elseif str == vv.en then
+ context.color( { "darkred" }, str )
+ elseif int == "pe" then
+ context("\\righttoleft " .. str)
+ else
+ context(str)
+ end
+ end
+ NC() NR()
+ end
+ end
+ end
+ context.stoptabulate()
+ end
+end
+\stopluacode
+
+\starttext
+
+\setupbodyfont[dejavu,7pt,tt]
+\setuppapersize[A4,landscape][A4,landscape]
+\setuplayout[backspace=.5cm,width=middle,topspace=.5cm,height=middle,header=1cm,footer=0cm]
+
+\startluacode
+ interfaces.show_missing() -- { "en","nl" }
+ interfaces.show_missing_messages() -- { "en","nl" }
+\stopluacode
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/s-sys-01.tex b/Master/texmf-dist/tex/context/base/s-sys-01.tex
deleted file mode 100644
index 77d3410c418..00000000000
--- a/Master/texmf-dist/tex/context/base/s-sys-01.tex
+++ /dev/null
@@ -1,61 +0,0 @@
-% engine=luatex
-
-%D \module
-%D [ file=s-sys-01,
-%D version=2008.03.32,
-%D title=\CONTEXT\ Style File,
-%D subtitle=Generate List of Math Symbol,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\startluacode
-function showmath()
- local slots = mathematics.slots.traditional
- local escape = characters.filters.utf.private.escape
- local data = characters.data
- tex.sprint(tex.ctxcatcodes,"\\starttabulate[|T|c|T|T|T|T||||]")
- local texsprint = tex.sprint
-% -- function texsprint(a,b) print(b) end
- for _, v in ipairs(table.sortedkeys(slots)) do
- local t, d, u = slots[v], data[v], escape(utf.char(v))
- local class, name, description = d.mathclass or "", d.mathname or "" , d.description or ""
- if class == "accent" then
- u = ""
- end
- if t[3] and t[4] then
- texsprint(tex.ctxcatcodes,string.format(
- "\\NC 0x%04X\\NC $%s$\\NC %s\\NC 0x%04X\\NC %s\\NC 0x%04X\\NC %s\\NC %s\\NC %s\\NC\\NR",
- v,u,t[1],t[2],t[3],t[4],class,name,description))
- else
- texsprint(tex.ctxcatcodes,string.format(
- "\\NC 0x%04X\\NC $%s$\\NC %s\\NC 0x%04X\\NC\\NC\\NC %s\\NC %s\\NC %s\\NC\\NR",
- v,u,t[1],t[2],class,name,description))
- end
- end
- tex.sprint(tex.ctxcatcodes,"\\stoptabulate")
-end
-\stopluacode
-
-\setuplayout
- [backspace=1cm,
- topspace=1cm,
- footer=1cm,
- header=0cm,
- height=middle,
- width=middle]
-
-\setupbodyfont
- [9pt]
-
-\setupfootertexts
- []
- [math characters -- \pagenumber]
-
-\starttext
-\ctxlua{showmath()}
-\stoptext
diff --git a/Master/texmf-dist/tex/context/base/scrn-bar.mkiv b/Master/texmf-dist/tex/context/base/scrn-bar.mkiv
deleted file mode 100644
index dbeaf6d7f5a..00000000000
--- a/Master/texmf-dist/tex/context/base/scrn-bar.mkiv
+++ /dev/null
@@ -1,398 +0,0 @@
-%D \module
-%D [ file=scrn-bar, % was part of scrn-int
-%D version=1995.01.01,
-%D title=\CONTEXT\ Core Macros,
-%D subtitle=Progress Bars,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Screen Macros / Progress Bars}
-
-\unprotect
-
-%D The code is a bit upgraded to \MKIV\ but the output is mostly the same.
-%D In retrospect this shoul dhave been a module.
-
-% todo: replace blackrule by stupid rules
-
-% \setupinteraction[state=start]
-% \setupsubpagenumber[state=start]
-%
-% \startsetups bars
-% \vbox
-% {\hsize 5cm
-% \hbox{\interactionbar[a]}\blank
-% \hbox{\interactionbar[b]}\blank
-% \hbox{\interactionbar[c]}\blank
-% \hbox{\interactionbar[d]}\blank
-% \hbox{\interactionbar[e]}\blank
-% \hbox{\interactionbar[f]}\blank
-% \hbox{\interactionbar[g]}\blank
-% }
-% \stopsetups
-%
-% \setupheadertexts[\setups{bars}]
-%
-% \starttext
-% \dorecurse{10}{test \page }
-% \stoptext
-
-\presetlocalframed[\??ib]
-
-%D First the usual definition code.
-
-\let\currentinteractionbar\empty
-
-\def\setinteractionbarparameter#1#2#3{\@EA\def\csname\??ib#1#2\endcsname{#3}}
-\def\letinteractionbarparameter #1#2{\@EA\let\csname\??ib#1#2\endcsname}
-
-\def\interactionbarparameter #1{\csname\dointeractionbarparameter{\??ib\currentinteractionbar}#1\endcsname}
-\def\namedinteractionbarparameter#1#2{\csname\dointeractionbarparameter{\??ib#1}#2\endcsname}
-\def\interactionbarparameterhash #1{\dointeractionbarparameterhash {\??ib\currentinteractionbar}#1}
-
-\def\dointeractionbarparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dointeractionbarparentparameter \csname#1\s!parent\endcsname#2\fi}
-\def\dointeractionbarparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dointeractionbarparentparameterhash\csname#1\s!parent\endcsname#2\fi}
-
-\def\dointeractionbarparentparameter #1#2{\ifx#1\relax\s!empty\else\dointeractionbarparameter #1#2\fi}
-\def\dointeractionbarparentparameterhash#1#2{\ifx#1\relax \else\dointeractionbarparameterhash#1#2\fi}
-
-\unexpanded\def\defineinteractionbar{\dodoubleargument\dodefineinteractionbar}
-\unexpanded\def\setupinteractionbar {\dodoubleempty \dosetupinteractionbar}
-\def\interactionbar {\dodoubleempty \dointeractionbar}
-
-\def\dosetupinteractionbar[#1][#2]%
- {\ifsecondargument
- \getparameters[\??ib#1][#2]%
- \else
- \getparameters[\??ib][#1]%
- \fi}
-
-\def\dodefineinteractionbar[#1][#2]%
- {\getparameters
- [\??ib#1]%
- [\s!parent=\??ib,%
-% \c!foregroundcolor=\interactionbarparameter\c!color,%
-% \c!foregroundstyle=\interactionbarparameter\c!style,%
- #2]}
-
-\def\dointeractionbar[#1][#2]%
- {\iflocation
- \begingroup
- \doifnot{#1}\v!reset % obsolete, no caching any more
- {\doifassignmentelse{#1}
- {\getparameters[\??ib][#2]%
- \edef\currentinteractionbar{\interactionbarparameter\c!alternative}}%
- {\edef\currentinteractionbar{#1}%
- \ifsecondargument\getparameters[\??ib#1][#2]\fi}%
- \doif{\interactionbarparameter\c!state}\v!start
- {\interactionbarparameter\c!command}}%
- \endgroup
- \fi}
-
-\newdimen\interactionbarwidth
-\newdimen\interactionbarheight
-\newdimen\interactionbardepth
-\newdimen\interactionbardistance
-
-%D Interaction buttons, in fact a row of tiny buttons, are
-%D typically only used for navigational purposed. The next
-%D macro builds such a row based on a specification list.
-%D
-%D \startbuffer
-%D \interactionbuttons[width=\hsize][page,PreviousJump,ExitViewer]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D gives
-%D
-%D \getbuffer
-%D
-%D Apart from individual entries, one can use \type{page} and
-%D \type {subpage} as shortcuts to their four associated buttons.
-%D The symbols are derived from the symbols linked to the
-%D entries.
-
-\def\interactionbuttons
- {\dodoubleempty\dointeractionbuttons}
-
-\def\dointeractionbuttons[#1][#2]% er is een verdeel macro \horizontalfractions
- {\iflocation
- \begingroup
- % beware, is already set \let\currentinteractionbar\empty
- \doif{\interactionbarparameter\c!state}\v!stop\locationfalse
- \iflocation
- \ifsecondargument
- \let\menuparameter\interactionbarparameter
- \setupinteractionbar[#1]%
- \interactionbarwidth\interactionbarparameter\c!width
- \ifdim\interactionbarwidth=\zeropoint
- \interactionbarwidth1.5\emwidth
- \fi
- \doifnothing\@@ibheight{\letinteractionbarparameter\c!height\v!broad}%
- \doifnothing\@@ibdepth {\letinteractionbarparameter\c!depth\!!zeropoint}%%%
- \setbox2\hbox{\localframed[\??ib\currentinteractionbar][\c!background=]{\symbol[\@@iasymbolset][\v!previouspage]}}%
- \!!heighta\ht2 % needed because we default to nothing
- \setupinteractionbar[\c!strut=\v!no]%
- \setinteractionparameter\c!width\!!zeropoint
- \!!counta\zerocount % new, was 1
- \processallactionsinset
- [#2]
- [ \v!page=>\advance\!!counta 4,
- \v!subpage=>\advance\!!counta 4,
- \s!unknown=>\advance\!!counta 1]%
- \ifdim\interactionbarwidth=\zeropoint
- \!!widtha\dimexpr2\emwidth+\interactionbardistance\relax
- \!!widthb\dimexpr\!!counta\!!widtha-\interactionbardistance\relax
- \else
- \!!widtha\interactionbarwidth
- \!!widthb\dimexpr\!!counta\interactionbardistance-\interactionbardistance\relax
- \advance\!!widtha -\!!widthb
- \divide\!!widtha \!!counta
- \!!widthb\interactionbarwidth
- \fi
- \hbox to \!!widthb
- {\setnostrut
- \processallactionsinset
- [#2]
- [ \v!page=>\interactionbargotox\v!firstpage \interactionbargotox\v!nextpage \interactionbargotox\v!previouspage \interactionbargotox\v!lastpage,
- \v!subpage=>\interactionbargotox\v!firstsubpage\interactionbargotox\v!nextsubpage\interactionbargotox\v!previoussubpage\interactionbargotox\v!lastsubpage,
- \s!unknown=>\interactionbargotox\commalistelement]%
- \unskip}%
- \else
- \interactionbuttons[][#1]%
- \fi
- \fi
- \endgroup
- \fi}
-
-\def\interactionbargotox#1%
- {\normalexpanded{\noexpand\dodocomplexbutton
-% {\??ib\currentinteractionbar}%
- {\??ib}%
- [\c!height=\the\!!heighta,\c!width=\the\!!widtha]%
- {\noexpand\symbol[\@@iasymbolset][#1]}%
- [#1]}%
- \hss}
-
-\def\interactionbara
- {\iflocation
- \interactionbarwidth \interactionbarparameter\c!width
- \interactionbardistance\interactionbarparameter\c!distance
- \interactionbarheight \interactionbarparameter\c!height
- \interactionbardepth \interactionbarparameter\c!depth
- \noindent\hbox to \interactionbarwidth \bgroup
- \dontcomplain
- \setupblackrules[\c!height=\v!max,\c!depth=\v!max]%
- \!!widthb\dimexpr\interactionbarwidth-4\emwidth\relax
- \processaction
- [\interactionbarparameter\c!step]
- [ \v!small=>\scratchcounter 20,
- \v!medium=>\scratchcounter 10,
- \v!big=>\scratchcounter 5,
- \s!unknown=>\scratchcounter 10]%
- \!!widtha\dimexpr\!!widthb/\scratchcounter\relax
- \setupblackrules[\c!width=\!!widtha]%
- \setbox\scratchbox\hbox to \interactionbarwidth
- {\hskip2\emwidth
- \setbox\scratchbox\hbox{\blackrule[\c!color=\interactionbarparameter\c!backgroundcolor]}%
- \dorecurse\scratchcounter
- {\hss\normalexpanded{\directgotodumbbox{\copy\scratchbox}[page(\the\numexpr\recurselevel*\lastpage/\scratchcounter\relax)]}}%
- \hss
- \hskip2\emwidth}%
- \wd\scratchbox\zeropoint
- \box \scratchbox
- \setupblackrules[\c!width=\emwidth]%
- \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!firstpage]}%
- \hskip\emwidth
- \ifnum\realpageno>\plusone
- \hskip\zeropoint\!!plus\numexpr\realpageno-\plustwo\relax \s!sp\relax % cm gives overflow
- \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!previouspage)]}%
- \fi
- \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[page(\number\realpageno)]}% todo: \v!currentpage
- \ifnum\realpageno<\lastpage\relax
- \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!nextpage]}%
- \hskip\zeropoint\!!plus\numexpr\lastpage-\realpageno-\plusone\relax \s!sp\relax % cm gives overflow
- \fi
- \hskip\emwidth
- \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!lastpage]}%
- \egroup
- \fi}
-
-\def\interactionbarb
- {\ifnum\lastpage>\firstpage\relax
- \interactionbuttons[\v!firstpage,\v!previouspage,\v!nextpage,\v!lastpage]%
- \fi}
-
-\def\interactionbarc
- {\iflocation \ifnum\lastpage>\plusone
- \interactionbarwidth\interactionbarparameter\c!width
- \hbox to \interactionbarwidth
- {\setupblackrules[\c!height=\interactionbarparameter\c!height,\c!depth=\interactionbarparameter\c!depth,\c!width=\emwidth]%
- \scratchdimen\dimexpr(\interactionbarwidth-4\emwidth)/\numexpr\lastpage+\minusone\relax\relax
- \!!widtha\numexpr\realpageno+\minusone\relax\scratchdimen
- \!!widthb\numexpr\lastpage-\realpageno\relax\scratchdimen
- \directgotospecbox\interactionbarparameter{\blackrule}[\v!firstpage]%
- \hss
- \directgotospecbox\interactionbarparameter{\blackrule[\c!width=\!!widtha]}[\v!previouspage]%
- \blackrule[\c!color=\interactionbarparameter\c!contrastcolor]%
- \directgotospecbox\interactionbarparameter{\blackrule[\c!width=\!!widthb]}[\v!nextpage]%
- \hss
- \directgotospecbox\interactionbarparameter{\blackrule}[\v!lastpage]}%
- \fi \fi}
-
-\unexpanded\def\@@commoninteractionbargotoa#1%
- {\symbol[\ifcase#1\v!previous\or\v!somewhere\or\v!next\fi]}
-
-\unexpanded\def\@@commoninteractionbargotob#1%
- {\vrule\!!height\interactionbarheight\!!depth\interactionbardepth\!!width\!!widtha\relax}
-
-\unexpanded\def\@@commoninteractionbargotoc#1%
- {\symbol[\ifcase#1\v!previous\or\v!somewhere\or\v!somewhere\or\v!somewhere\or\v!next\fi}
-
-\unexpanded\def\@@commoninteractionbargotod#1%
- {\vrule \!!width\!!widtha \ifcase#1%
- \!!height \interactionbarheight \!!depth \interactionbardepth \or
- \!!height.5\interactionbarheight \!!depth.5\interactionbardepth \or
- \!!height \interactionbarheight \!!depth \interactionbardepth \or
- \!!height.5\interactionbarheight \!!depth.5\interactionbardepth \else
- \!!height \interactionbarheight \!!depth \interactionbardepth \fi}
-
-\unexpanded\def\@@commoninteractionbarx#1%
- {\doifelse{\interactionbarparameter\c!symbol}\v!yes
- {\setupsymbolset[\@@iasymbolset]%
- \let\dogotox\@@commoninteractionbargotoa}
- {\let\dogotox\@@commoninteractionbargotob}%
- \dorecurse\nofsubpages
- {\scratchcounter\numexpr\recurselevel+\firstsubpage+\minusone\relax
- \chardef\what
- \ifnum\scratchcounter<\realpageno \zerocount \else
- \ifnum\scratchcounter=\realpageno \plusone \else
- \plustwo \fi\fi
- \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\dogotox\what}[page(\the\scratchcounter)]}%
- #1}%
- \unskip}
-
-\def\interactionbard
- {\iflocation \ifnum\nofsubpages>\plusone \doif{\structurecounterparameter\s!subpage\c!state}\v!start{%
- \interactionbarwidth \interactionbarparameter\c!width
- \interactionbardistance\interactionbarparameter\c!distance
- \interactionbarheight \interactionbarparameter\c!height
- \interactionbardepth \interactionbarparameter\c!depth
- \!!widtha\interactionbarwidth
- \noindent\hbox{\@@commoninteractionbarx{\hskip\interactionbardistance}}%
- }\fi \fi}
-
-\def\interactionbare
- {\iflocation \ifnum\nofsubpages>\plusone \doif{\structurecounterparameter\s!subpage\c!state}\v!start{%
- \begingroup
- \interactionbarwidth \interactionbarparameter\c!width
- \interactionbardistance\interactionbarparameter\c!distance
- \interactionbarheight \interactionbarparameter\c!height
- \interactionbardepth \interactionbarparameter\c!depth
- \!!widthb\dimexpr\nofsubpages\interactionbardistance-\interactionbardistance\relax % (n-1)
- \!!widtha\dimexpr(\interactionbarwidth-\!!widthb)/\nofsubpages\relax
- \ifdim\!!widtha<\interactionbardistance
- \interactionbarf
- \else
- \noindent\hbox to \interactionbarwidth{\@@commoninteractionbarx{\hss}\unskip}%
- \fi
- \endgroup
- }\fi\fi}
-
-\def\interactionbarf
- {\iflocation \ifnum\nofsubpages>\plusone \doif{\structurecounterparameter\s!subpage\c!state}\v!start{%
- \interactionbarwidth \interactionbarparameter\c!width
- \interactionbardistance\interactionbarparameter\c!distance
- \interactionbarheight \interactionbarparameter\c!height
- \interactionbardepth \interactionbarparameter\c!depth
- \noindent \hbox to \interactionbarwidth \bgroup
- \doloop
- {\!!countc\numexpr(\nofsubpages/\recurselevel)+\plusone\relax % rounding
- \!!widthb\interactionbardistance
- \multiply\!!widthb \!!countc
- \advance\!!widthb -\interactionbardistance
- \!!widtha\interactionbarwidth
- \advance\!!widtha -\!!widthb
- \divide\!!widtha \!!countc
- \ifdim\!!widtha<\interactionbardistance\else
- \!!countb\recurselevel
- \exitloop
- \fi}%
- \ifnum\!!countc>\plusone
- % this is not that well tested
- \advance\!!countc \minustwo
- \!!widtha-\interactionbardistance
- \!!widtha\!!countc\!!widtha
- \advance\!!widtha \interactionbarwidth
- \advance\!!countc \plusone
- \divide\!!widtha \!!countc
- \fi
- \doifelse{\interactionbarparameter\c!symbol}\v!yes
- {\setupsymbolset[\@@iasymbolset]%
- \let\dogotox\@@commoninteractionbargotoc}%
- {\let\dogotox\@@commoninteractionbargotod}%
- \!!countc\numexpr\realpageno-\plustwo\relax
- \!!countd\numexpr\realpageno+\plustwo\relax
- \ifnum\!!countc<\plusone \!!countc\plusone \fi
- \!!countf\zerocount
- \dostepwiserecurse\firstsubpage\lastsubpage\plusone
- {\!!doneafalse
- \advance\!!countf \plusone
- \ifnum\recurselevel=\firstsubpage\relax \!!doneatrue \fi
- \ifnum\recurselevel=\lastsubpage \relax \!!doneatrue \fi
- \chardef\what \if!!donea
- \ifnum\recurselevel<\realpageno \zerocount \else
- \ifnum\recurselevel>\realpageno \plustwo \else
- \plusfour \fi\fi
- \else \ifnum\!!countf=\!!countb
- \ifnum\recurselevel<\realpageno \plusone \else
- \ifnum\recurselevel>\realpageno \plusthree \else
- \plustwo \fi\fi
- \fi \fi
- \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\dogotox\what}[page(\recurselevel)]}%
- \hss
- \!!countf\zerocount}%
- \unskip
- \egroup
- }\fi\fi}
-
-\def\interactionbarg
- {\iflocation \ifnum\lastsubpage>\firstsubpage\relax % no test for state?
- \interactionbuttons[\v!firstsubpage,\v!previoussubpage,\v!nextsubpage,\v!lastsubpage]%
- \fi \fi}
-
-\setupinteractionbar
- [\c!state=\v!start,
- \c!alternative=a,
- \c!symbol=\v!no,
- \c!width=10\emwidth,
- \c!height=.5\emwidth,
- \c!depth=\zeropoint,
- \c!distance=.5\emwidth,
- \c!step=\v!medium,
- \c!foregroundcolor=\interactionbarparameter\c!color,
- \c!foregroundstyle=\interactionbarparameter\c!style,
- \c!color=\@@iacolor,
- \c!contrastcolor=\@@iacontrastcolor,
- \c!style=,
- \c!frame=\v!on,
- \c!background=color,
- \c!backgroundcolor=gray,
- \c!samepage=\v!yes,
- \c!unknownreference=\v!yes]
-
-\defineinteractionbar[a][\c!command=\interactionbara]
-\defineinteractionbar[b][\c!command=\interactionbarb,\c!height=\v!broad]
-\defineinteractionbar[c][\c!command=\interactionbarc,\c!height=\v!max,\c!depth=\v!max]
-\defineinteractionbar[d][\c!command=\interactionbard,\c!width=.5\emwidth]
-\defineinteractionbar[e][\c!command=\interactionbare]
-\defineinteractionbar[f][\c!command=\interactionbarf]
-\defineinteractionbar[g][\c!command=\interactionbarg,\c!height=\v!broad]
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-bar.mkvi b/Master/texmf-dist/tex/context/base/scrn-bar.mkvi
new file mode 100644
index 00000000000..4605f1d2e16
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-bar.mkvi
@@ -0,0 +1,405 @@
+%D \module
+%D [ file=scrn-bar, % was part of scrn-int
+%D version=1995.01.01,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Progress Bars,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Screen Macros / Progress Bars}
+
+\unprotect
+
+%D The code is a bit upgraded to \MKIV\ but the output is mostly the
+%D same. In retrospect this should have been a module. We can move
+%D some definitions to scrn-run-bar.mkiv if needed. We can also make
+%D the code a bit more efficient.
+
+% todo: replace blackrule by stupid rules
+
+%D \starttyping
+%D \setupinteraction
+%D [state=start]
+%D
+%D \setupsubpagenumber
+%D [state=start]
+%D
+%D \setuplayout
+%D [middle]
+%D
+%D \setuppapersize
+%D [S4][S4]
+%D
+%D \startsetups bars
+%D \ruledvbox to \textheight \bgroup
+%D a \ruledhbox{\interactionbar[a]}\vss
+%D b \ruledhbox{\interactionbar[b]}\vss
+%D c \ruledhbox{\interactionbar[c]}\vss
+%D d \ruledhbox{\interactionbar[d]}\vss
+%D e \ruledhbox{\interactionbar[e]}\vss
+%D f \ruledhbox{\interactionbar[f]}\vss
+%D g \ruledhbox{\interactionbar[g]}\vss
+%D \egroup
+%D \stopsetups
+%D
+%D \setuptexttexts[\setups{bars}]
+%D
+%D \starttext
+%D \dorecurse {12} {
+%D \startstandardmakeup
+%D \stopstandardmakeup
+%D }
+%D \stoptext
+%D \stoptyping
+
+\installcommandhandler \??ib {interactionbar} \??ib
+
+\presetlocalframed[\??ib]
+
+\unexpanded\def\interactionbar
+ {\dodoubleempty\scrn_bar_direct}
+
+\def\scrn_bar_direct[#tag][#settings]% somewhat messy
+ {\iflocation
+ \begingroup
+ \doifassignmentelse{#tag}
+ {\getparameters[\??ib][#tag]%
+ \edef\currentinteractionbar{\interactionbarparameter\c!alternative}}%
+ {\edef\currentinteractionbar{#tag}%
+ \ifsecondargument\getparameters[\??ib#tag][#settings]\fi}%
+ \doif{\interactionbarparameter\c!state}\v!start
+ {\interactionbarparameter\c!command}%
+ \endgroup
+ \fi}
+
+\newdimen\scrn_bar_width
+\newdimen\scrn_bar_height
+\newdimen\scrn_bar_depth
+\newdimen\scrn_bar_distance
+
+%D Interaction buttons, in fact a row of tiny buttons, are
+%D typically only used for navigational purposed. The next
+%D macro builds such a row based on a specification list.
+%D
+%D \startbuffer
+%D \interactionbuttons[width=\hsize][page,PreviousJump,ExitViewer]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives
+%D
+%D \getbuffer
+%D
+%D Apart from individual entries, one can use \type{page} and
+%D \type {subpage} as shortcuts to their four associated buttons.
+%D The symbols are derived from the symbols linked to the
+%D entries.
+
+\unexpanded\def\interactionbuttons
+ {\dodoubleempty\scrn_bar_buttons}
+
+\def\scrn_bar_buttons
+ {\iflocation
+ \expandafter\scrn_bar_buttons_status
+ \else
+ \expandafter\scrn_bar_buttons_ignore
+ \fi}
+
+\def\scrn_bar_buttons_status[#settings][#list]%
+ {\doif{\interactionbarparameter\c!state}\v!start
+ {\ifsecondargument
+ \scrn_bar_buttons_indeed[#settings][#list]%
+ \else
+ \scrn_bar_buttons_indeed[][#settings]%
+ \fi}}
+
+\def\scrn_bar_buttons_ignore[#settings][#list]% \gobbletwooptionals
+ {}
+
+\def\scrn_bar_buttons_indeed[#settings][#list]%
+ {\begingroup
+ %\let\menuparameter\interactionbarparameter
+ \setupinteractionbar[#settings]%
+ \scrn_bar_width\interactionbarparameter\c!width
+ \ifdim\scrn_bar_width=\zeropoint
+ \scrn_bar_width1.5\emwidth
+ \fi
+ \doifnothing{\interactionbarparameter\c!height}{\letinteractionbarparameter\c!height\v!broad}%
+ \doifnothing{\interactionbarparameter\c!depth }{\letinteractionbarparameter\c!depth\!!zeropoint}%%%
+ \setbox2\hbox{\localframed[\??ib\currentinteractionbar][\c!background=]{\symbol[\interactionparameter\c!symbolset][\v!previouspage]}}%
+ \!!heighta\ht2 % needed because we default to nothing
+ \setupinteractionbar[\c!strut=\v!no]%
+ \letinteractionparameter\c!width\zeropoint
+ \!!counta\zerocount % new, was 1
+ \processallactionsinset
+ [#list]
+ [ \v!page=>\advance\!!counta 4,
+ \v!subpage=>\advance\!!counta 4,
+ \s!unknown=>\advance\!!counta 1]%
+ \ifdim\scrn_bar_width=\zeropoint
+ \!!widtha\dimexpr2\emwidth+\scrn_bar_distance\relax
+ \!!widthb\dimexpr\!!counta\!!widtha-\scrn_bar_distance\relax
+ \else
+ \!!widtha\scrn_bar_width
+ \!!widthb\dimexpr\!!counta\scrn_bar_distance-\scrn_bar_distance\relax
+ \advance\!!widtha -\!!widthb
+ \divide\!!widtha \!!counta
+ \!!widthb\scrn_bar_width
+ \fi
+ \hbox to \!!widthb
+ {\setnostrut
+ \startsymbolset[\interactionparameter\c!symbolset]%
+ \processallactionsinset
+ [#list]
+ [ \v!page=>\scrn_bar_goto\v!firstpage
+ \scrn_bar_goto\v!nextpage
+ \scrn_bar_goto\v!previouspage
+ \scrn_bar_goto\v!lastpage,
+ \v!subpage=>\scrn_bar_goto\v!firstsubpage
+ \scrn_bar_goto\v!nextsubpage
+ \scrn_bar_goto\v!previoussubpage
+ \scrn_bar_goto\v!lastsubpage,
+ \s!unknown=>\scrn_bar_goto\commalistelement]%
+ \unskip
+ \stopsymbolset}%
+ \endgroup}
+
+\def\scrn_bar_goto#action%
+ {\button
+ [\c!height=\the\!!heighta,\c!width=\the\!!widtha]%
+ {\symbol[#action]}% we could expand this one once only
+ [#action]%
+ \hss}
+
+\def\scrn_bar_alternative_a
+ {\scrn_bar_width \interactionbarparameter\c!width
+ \scrn_bar_distance\interactionbarparameter\c!distance
+ \scrn_bar_height \interactionbarparameter\c!height
+ \scrn_bar_depth \interactionbarparameter\c!depth
+ \noindent\hbox to \scrn_bar_width \bgroup
+ \dontcomplain
+ \setupblackrules[\c!height=\v!max,\c!depth=\v!max]%
+ \!!widthb\dimexpr\scrn_bar_width-4\emwidth\relax
+ \processaction
+ [\interactionbarparameter\c!step]
+ [ \v!small=>\scratchcounter 20,
+ \v!medium=>\scratchcounter 10,
+ \v!big=>\scratchcounter 5,
+ \s!unknown=>\scratchcounter 10]%
+ \!!widtha\dimexpr\!!widthb/\scratchcounter\relax
+ \setupblackrules[\c!width=\!!widtha]%
+ \setbox\scratchbox\hbox to \scrn_bar_width
+ {\hskip2\emwidth
+ \setbox\scratchbox\hbox{\blackrule[\c!color=\interactionbarparameter\c!backgroundcolor]}%
+ \dorecurse\scratchcounter
+ {\hss\normalexpanded{\directgotodumbbox{\copy\scratchbox}[page(\the\numexpr\recurselevel*\lastpage/\scratchcounter\relax)]}}%
+ \hss
+ \hskip2\emwidth}%
+ \wd\scratchbox\zeropoint
+ \box \scratchbox
+ \setupblackrules[\c!width=\emwidth]%
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!firstpage]}%
+ \hskip\emwidth
+ \ifnum\realpageno>\plusone
+ \hskip\zeropoint\!!plus\numexpr\realpageno-\plustwo\relax \s!sp\relax % cm gives overflow
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!previouspage)]}%
+ \fi
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[page(\number\realpageno)]}% todo: \v!currentpage
+ \ifnum\realpageno<\lastpage\relax
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!nextpage]}%
+ \hskip\zeropoint\!!plus\numexpr\lastpage-\realpageno-\plusone\relax \s!sp\relax % cm gives overflow
+ \fi
+ \hskip\emwidth
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\blackrule}[\v!lastpage]}%
+ \egroup}
+
+\def\scrn_bar_alternative_b
+ {\ifnum\lastpage>\firstpage\relax
+ \interactionbuttons[\v!firstpage,\v!previouspage,\v!nextpage,\v!lastpage]%
+ \fi}
+
+\def\scrn_bar_alternative_c
+ {\ifnum\lastpage>\plusone
+ \scrn_bar_width\interactionbarparameter\c!width
+ \hbox to \scrn_bar_width
+ {\setupblackrules[\c!height=\interactionbarparameter\c!height,\c!depth=\interactionbarparameter\c!depth,\c!width=\emwidth]%
+ \scratchdimen\dimexpr(\scrn_bar_width-4\emwidth)/\numexpr\lastpage+\minusone\relax\relax
+ \!!widtha\numexpr\realpageno+\minusone\relax\scratchdimen
+ \!!widthb\numexpr\lastpage-\realpageno\relax\scratchdimen
+ \directgotospecbox\interactionbarparameter{\blackrule}[\v!firstpage]%
+ \hss
+ \directgotospecbox\interactionbarparameter{\blackrule[\c!width=\!!widtha]}[\v!previouspage]%
+ \blackrule[\c!color=\interactionbarparameter\c!contrastcolor]%
+ \directgotospecbox\interactionbarparameter{\blackrule[\c!width=\!!widthb]}[\v!nextpage]%
+ \hss
+ \directgotospecbox\interactionbarparameter{\blackrule}[\v!lastpage]}%
+ \fi}
+
+\unexpanded\def\scrn_bar_goto_a#whereto%
+ {\symbol[\ifcase#whereto\v!previous\or\v!somewhere\or\v!next\fi]}
+
+\unexpanded\def\scrn_bar_goto_b#whereto%
+ {\vrule\!!height\scrn_bar_height\!!depth\scrn_bar_depth\!!width\!!widtha\relax}
+
+\unexpanded\def\scrn_bar_goto_c#whereto%
+ {\symbol[\ifcase#whereto\v!previous\or\v!somewhere\or\v!somewhere\or\v!somewhere\or\v!next\fi}
+
+\unexpanded\def\scrn_bar_goto_d#whereto%
+ {\vrule \!!width\!!widtha \ifcase#whereto%
+ \!!height \scrn_bar_height \!!depth \scrn_bar_depth \or
+ \!!height.5\scrn_bar_height \!!depth.5\scrn_bar_depth \or
+ \!!height \scrn_bar_height \!!depth \scrn_bar_depth \or
+ \!!height.5\scrn_bar_height \!!depth.5\scrn_bar_depth \else
+ \!!height \scrn_bar_height \!!depth \scrn_bar_depth \fi}
+
+\newconstant\scrn_bar_mode
+
+\unexpanded\def\scrn_bar_goto_x#command%
+ {\doifelse{\interactionbarparameter\c!symbol}\v!yes
+ {\setupsymbolset[\interactionparameter\c!symbolset]%
+ \let\scrn_bar_goto_indeed\scrn_bar_goto_a}
+ {\let\scrn_bar_goto_indeed\scrn_bar_goto_b}%
+ \dorecurse\nofsubpages
+ {\scratchcounter\numexpr\recurselevel+\firstsubpage+\minusone\relax
+ \scrn_bar_mode
+ \ifnum\scratchcounter<\realpageno \zerocount \else
+ \ifnum\scratchcounter=\realpageno \plusone \else
+ \plustwo \fi\fi
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\scrn_bar_goto_indeed\scrn_bar_mode}[page(\the\scratchcounter)]}%
+ #command}%
+ \unskip}
+
+\def\scrn_bar_alternative_d
+ {\ifnum\nofsubpages>\plusone \doif{\structurecounterparameter\s!subpage\c!state}\v!start{%
+ \scrn_bar_width \interactionbarparameter\c!width
+ \scrn_bar_distance\interactionbarparameter\c!distance
+ \scrn_bar_height \interactionbarparameter\c!height
+ \scrn_bar_depth \interactionbarparameter\c!depth
+ \!!widtha\scrn_bar_width
+ \noindent\hbox{\scrn_bar_goto_x{\hskip\scrn_bar_distance}}%
+ }\fi}
+
+\def\scrn_bar_alternative_e
+ {\ifnum\nofsubpages>\plusone \doif{\structurecounterparameter\s!subpage\c!state}\v!start{%
+ \scrn_bar_width \interactionbarparameter\c!width
+ \scrn_bar_distance\interactionbarparameter\c!distance
+ \scrn_bar_height \interactionbarparameter\c!height
+ \scrn_bar_depth \interactionbarparameter\c!depth
+ \!!widthb\dimexpr\nofsubpages\scrn_bar_distance-\scrn_bar_distance\relax % (n-1)
+ \!!widtha\dimexpr(\scrn_bar_width-\!!widthb)/\nofsubpages\relax
+ \ifdim\!!widtha<\scrn_bar_distance
+ \scrn_bar_alternative_f
+ \else
+ \noindent\hbox to \scrn_bar_width{\scrn_bar_goto_x{\hss}\unskip}%
+ \fi
+ }\fi}
+
+\def\scrn_bar_alternative_f
+ {\ifnum\nofsubpages>\plusone \doif{\structurecounterparameter\s!subpage\c!state}\v!start{%
+ \scrn_bar_width \interactionbarparameter\c!width
+ \scrn_bar_distance\interactionbarparameter\c!distance
+ \scrn_bar_height \interactionbarparameter\c!height
+ \scrn_bar_depth \interactionbarparameter\c!depth
+ \noindent \hbox to \scrn_bar_width \bgroup
+ \doloop
+ {\!!countc\numexpr(\nofsubpages/\recurselevel)+\plusone\relax % rounding
+ \!!widthb\scrn_bar_distance
+ \multiply\!!widthb \!!countc
+ \advance\!!widthb -\scrn_bar_distance
+ \!!widtha\scrn_bar_width
+ \advance\!!widtha -\!!widthb
+ \divide\!!widtha \!!countc
+ \ifdim\!!widtha<\scrn_bar_distance\else
+ \!!countb\recurselevel
+ \exitloop
+ \fi}%
+ \ifnum\!!countc>\plusone
+ % this is not that well tested
+ \advance\!!countc \minustwo
+ \!!widtha-\scrn_bar_distance
+ \!!widtha\!!countc\!!widtha
+ \advance\!!widtha \scrn_bar_width
+ \advance\!!countc \plusone
+ \divide\!!widtha \!!countc
+ \fi
+ \doifelse{\interactionbarparameter\c!symbol}\v!yes
+ {\setupsymbolset[\interactionparameter\c!symbolset]%
+ \let\scrn_bar_goto_indeed\scrn_bar_goto_c}%
+ {\let\scrn_bar_goto_indeed\scrn_bar_goto_d}%
+ \!!countc\numexpr\realpageno-\plustwo\relax
+ \!!countd\numexpr\realpageno+\plustwo\relax
+ \ifnum\!!countc<\plusone \!!countc\plusone \fi
+ \!!countf\zerocount
+ \dostepwiserecurse\firstsubpage\lastsubpage\plusone
+ {\!!doneafalse
+ \advance\!!countf \plusone
+ \ifnum\recurselevel=\firstsubpage\relax \!!doneatrue \fi
+ \ifnum\recurselevel=\lastsubpage \relax \!!doneatrue \fi
+ \scrn_bar_mode
+ \if!!donea
+ \ifnum\recurselevel<\realpageno
+ \zerocount
+ \else\ifnum\recurselevel>\realpageno
+ \plustwo
+ \else
+ \plusfour
+ \fi\fi
+ \else
+ \ifnum\!!countf=\!!countb
+ \ifnum\recurselevel<\realpageno
+ \plusone
+ \else\ifnum\recurselevel>\realpageno
+ \plusthree
+ \else
+ \plustwo
+ \fi\fi
+ \else
+ \plusthree
+ \fi
+ \fi
+ \normalexpanded{\directgotospecbox\noexpand\interactionbarparameter{\scrn_bar_goto_indeed\scrn_bar_mode}[page(\recurselevel)]}%
+ \hss
+ \!!countf\zerocount}%
+ \unskip
+ \egroup
+ }\fi}
+
+\def\scrn_bar_alternative_g
+ {\ifnum\lastsubpage>\firstsubpage\relax % no test for state?
+ \interactionbuttons[\v!firstsubpage,\v!previoussubpage,\v!nextsubpage,\v!lastsubpage]%
+ \fi}
+
+\setupinteractionbar
+ [\c!state=\v!start,
+ \c!alternative=a,
+ \c!symbol=\v!no,
+ \c!width=10\emwidth,
+ \c!height=.5\emwidth,
+ \c!depth=\zeropoint,
+ \c!distance=.5\emwidth,
+ \c!step=\v!medium,
+ \c!foregroundcolor=\interactionbarparameter\c!color,
+ \c!foregroundstyle=\interactionbarparameter\c!style,
+ \c!color=\interactionparameter\c!color,
+ \c!contrastcolor=\interactionparameter\c!contrastcolor,
+ \c!style=,
+ \c!frame=\v!on,
+ \c!background=color,
+ \c!backgroundcolor=gray,
+ \c!samepage=\v!yes]
+
+\defineinteractionbar[a][\c!command=\scrn_bar_alternative_a]
+\defineinteractionbar[b][\c!command=\scrn_bar_alternative_b,\c!height=\v!broad]
+\defineinteractionbar[c][\c!command=\scrn_bar_alternative_c,\c!height=\v!max,\c!depth=\v!max]
+\defineinteractionbar[d][\c!command=\scrn_bar_alternative_d,\c!width=.5\emwidth]
+\defineinteractionbar[e][\c!command=\scrn_bar_alternative_e]
+\defineinteractionbar[f][\c!command=\scrn_bar_alternative_f]
+\defineinteractionbar[g][\c!command=\scrn_bar_alternative_g,\c!height=\v!broad]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-but.lua b/Master/texmf-dist/tex/context/base/scrn-but.lua
new file mode 100644
index 00000000000..b5b0a8ae42a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-but.lua
@@ -0,0 +1,19 @@
+if not modules then modules = { } end modules ['scrn-but'] = {
+ version = 1.001,
+ comment = "companion to scrn-but.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+
+function commands.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 }
+ for i=1,#orders do
+ local order = orders[i]
+ context.menubutton(tag,format("%s:%s",register,order),order)
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/scrn-but.mkiv b/Master/texmf-dist/tex/context/base/scrn-but.mkiv
deleted file mode 100644
index 9a72a756bd9..00000000000
--- a/Master/texmf-dist/tex/context/base/scrn-but.mkiv
+++ /dev/null
@@ -1,127 +0,0 @@
-%D \module
-%D [ file=scrn-but, % moved code
-%D version=1995.01.01,
-%D title=\CONTEXT\ Core Macros,
-%D subtitle=Interaction,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Screen Macros / Buttons}
-
-\unprotect
-
-%D Buttons are just what their names says: things that can be
-%D clicked (pushed) on. They are similar to \type{\goto},
-%D except that the text argument is not interpreted.
-%D Furthermore one can apply anything to them that can be done
-%D with \type{\framed}.
-%D
-%D \startbuffer
-%D \button[width=3cm,height=1.5cm]{Exit}[ExitViewer]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D gives
-%D
-%D \getbuffer
-%D
-%D This command is formally specified as:
-%D
-%D \showsetup{button}
-%D
-%D The characteristics can be set with:
-%D
-%D \showsetup{setupbuttons}
-
-\unexpanded\def\setupbuttons
- {\dodoubleargument\getparameters[\??bt]}
-
-\definecomplexorsimpleempty\button
-
-\def\complexbutton
- {\docomplexbutton\??bt}
-
-\presetlocalframed[\??bt]
-
-\def\buttonparameter#1{\csname\??bt#1\endcsname} % simple version
-
-\long\def\docomplexbutton#1[#2]#3#4% get rid of possible space before [#4]
- {\dodocomplexbutton#1[#2]{#3}#4} % #4 == [
-
-\def\buttonframed{\dodoubleempty\localframed[\??bt]} % goodie
-
-% #3=none is obsolete, just use empty=yes
-
-\long\def\dodocomplexbutton#1[#2]#3[#4]% #3 can contain [] -> {#3} later
- {\begingroup
- \let\menuparameter\buttonparameter
- \doif{\buttonparameter\c!state}\v!stop\locationfalse
- \iflocation
- \setlocationboxyes#1[#2]{#3}[#4]%
- \fi
- \endgroup}
-
-%D \macros
-%D {overlaybutton}
-%D
-%D For converience we provide:
-%D
-%D \starttyping
-%D \overlaybutton[reference]
-%D \stoptyping
-%D
-%D This command can be used to define overlays an/or can be
-%D used in the whatevertext areas, like:
-%D
-%D \starttyping
-%D \defineoverlay[PrevPage][\overlaybutton{PrevPage}]
-%D \setupbackgrounds[page][background=PrevPage]
-%D \setuptexttexts[\overlaybutton{NextPage}]
-%D \stoptyping
-%D
-%D For practical reasons, this macro accepts square brackets
-%D as well as braces.
-
-\definecomplexorsimple\overlaybutton
-
-\def\simpleoverlaybutton#1%
- {\complexoverlaybutton[#1]}
-
-\def\complexoverlaybutton[#1]%
- {\iflocation
- \gotobox{\overlayfakebox}[#1]%
- \fi}
-
-\def\overlayfakebox
- {\hbox
- {\setbox\scratchbox\null
- \wd\scratchbox\overlaywidth
- \ht\scratchbox\overlayheight
- \box\scratchbox}}
-
-%D Done.
-
-\setupbuttons
- [\c!state=\v!start,
- \c!width=\v!fit,
- \c!height=\v!broad,
- \c!offset=0.25em,
- \c!frame=\v!on,
- \c!background=,
- \c!backgroundcolor=,
- \c!foregroundstyle=\buttonparameter\c!style,
- \c!foregroundcolor=\buttonparameter\c!color,
- \c!style=\@@iastyle,
- \c!color=\@@iacolor,
- \c!contrastcolor=\@@iacontrastcolor,
- \c!samepage=\v!yes,
- \c!unknownreference=\v!yes,
- \c!distance=\zeropoint] % for menubuttons
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-but.mkvi b/Master/texmf-dist/tex/context/base/scrn-but.mkvi
new file mode 100644
index 00000000000..e1dedd6051b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-but.mkvi
@@ -0,0 +1,995 @@
+%D \module
+%D [ file=scrn-but, % moved code
+%D version=1995.01.01,
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Interaction,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% \restorestandardblank
+% better namespace for pos
+
+\writestatus{loading}{ConTeXt Screen Macros / Buttons}
+
+\registerctxluafile{scrn-but}{1.001}
+
+\unprotect
+
+%D Buttons are just what their names says: things that can be
+%D clicked (pushed) on. They are similar to \type{\goto},
+%D except that the text argument is not interpreted.
+%D Furthermore one can apply anything to them that can be done
+%D with \type{\framed}.
+%D
+%D \startbuffer
+%D \button[width=3cm,height=1.5cm]{Exit}[ExitViewer]
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D gives
+%D
+%D \getbuffer
+%D
+%D This command is formally specified as:
+%D
+%D \showsetup{button}
+%D
+%D The characteristics can be set with:
+%D
+%D \showsetup{setupbuttons}
+
+\installcommandhandler \??bt {button} \??bt
+
+\let\setupbuttons\setupbutton
+
+\presetlocalframed[\??bt]
+
+\appendtoks
+ \setuevalue\currentbutton{\scrn_button_direct{\currentbutton}}%
+ \setevalue{\??bt:\currentbutton\s!parent}{\??bt\currentbutton}% framed
+\to \everydefinebutton
+
+\unexpanded\def\scrn_button_direct#tag%
+ {\begingroup
+ \edef\currentbutton{#tag}%
+ \doifelselocation
+ {\dosingleempty\scrn_button_direct_status}%
+ {\dosingleempty\scrn_button_direct_ignore}}
+
+\def\scrn_button_direct_status
+ {\doifelse{\buttonparameter\c!state}\v!start
+ \scrn_button_direct_indeed
+ \scrn_button_direct_ignore}
+
+%\def\buttonframed{\dodoubleempty\localframed[\??bt]} % goodie
+
+% empty=yes
+%
+% \button[settings]{}[action] % normally used at the tex end
+
+\def\scrn_button_direct_indeed[#settings]#text[#action]%
+ {\iffirstargument
+ \setupbuttons[\currentbutton][#settings]%
+ \fi
+ \scrn_button_make\??bt\currentbutton\buttonparameter{#text}{#action}%
+ \endgroup}
+
+\def\scrn_button_direct_ignore[#settings]#text[#destination]%
+ {\endgroup}
+
+\definebutton[button] % english
+
+\setupbuttons
+ [\c!state=\v!start,
+ \c!width=\v!fit,
+ \c!height=\v!broad,
+ \c!offset=0.25em,
+ \c!frame=\v!on,
+ \c!background=,
+ \c!backgroundcolor=,
+ \c!foregroundstyle=\buttonparameter\c!style,
+ \c!foregroundcolor=\buttonparameter\c!color,
+ \c!style=\interactionparameter\c!style,
+ \c!color=\interactionparameter\c!color,
+ \c!contrastcolor=\interactionparameter\c!contrastcolor,
+ \c!samepage=\v!yes,
+ \c!unknownreference=\v!yes,
+ \c!distance=\zeropoint] % for menubuttons
+
+%D \macros
+%D {overlaybutton}
+%D
+%D For converience we provide:
+%D
+%D \starttyping
+%D \overlaybutton[reference]
+%D \stoptyping
+%D
+%D This command can be used to define overlays an/or can be
+%D used in the whatevertext areas, like:
+%D
+%D \starttyping
+%D \defineoverlay[PrevPage][\overlaybutton{PrevPage}]
+%D \setupbackgrounds[page][background=PrevPage]
+%D \setuptexttexts[\overlaybutton{NextPage}]
+%D \stoptyping
+%D
+%D For practical reasons, this macro accepts square brackets
+%D as well as braces.
+
+\unexpanded\def\overlaybutton
+ {\dosingleempty\scrn_button_overlay}
+
+\def\scrn_button_overlay[#1]%
+ {\iffirstargument
+ \scrn_button_overlay_indeed{#1}%
+ \else
+ \expandafter\scrn_button_overlay_indeed
+ \fi}
+
+\def\scrn_button_overlay_indeed#1%
+ {\iflocation
+ \gotobox{\overlayfakebox}[#1]%
+ \fi}
+
+%D The renderers:
+
+\expandafter\let\csname\??bt:\c!location:\v!yes \endcsname\zerocount
+\expandafter\let\csname\??bt:\c!location:\v!empty \endcsname\plusone
+\expandafter\let\csname\??bt:\c!location:\v!no \endcsname\plustwo
+\expandafter\let\csname\??bt:\c!location:\v!none \endcsname\plusthree
+\expandafter\let\csname\??bt:\c!location:\v!normal \endcsname\plusone % default
+\expandafter\let\csname\??bt:\c!location:\s!default\endcsname\plusone % default
+\expandafter\let\csname\??bt:\c!location:\s!empty \endcsname\plusone % default
+
+\newconditional\scrn_button_skipped
+
+\def\scrn_button_make#namespace#current#currentparameter#text#action%
+ {\begingroup
+ \attribute\referenceattribute\attributeunsetvalue
+ \global\setfalse\scrn_button_skipped
+ \chardef\locationboxpagestate\csname\??bt:\c!location:#currentparameter\c!samepage\endcsname
+ \doifreferencefoundelse{#action}\scrn_button_make_yes\scrn_button_make_nop
+ {#namespace}{#current}{#currentparameter}{#text}%
+ \endgroup}
+
+\def\scrn_button_make_yes
+ {\analyzecurrentreference % needed as we act on the state
+ \ifcase\referencepagestate
+ \expandafter\scrn_button_make_normal % no state : something else than a page reference
+ \or
+ \ifcase\locationboxpagestate\relax
+ \expandafter\expandafter\expandafter\scrn_button_make_contrast % same page: yes: same page or not ... todo
+ \or
+ \expandafter\expandafter\expandafter\scrn_button_make_empty % same page: empty but frame: no click
+ \or
+ \expandafter\expandafter\expandafter\scrn_button_make_nothing % same page: empty no frame: no
+ \else
+ \expandafter\expandafter\expandafter\scrn_button_make_skipped % same page: nothing at all
+ \fi
+ \else
+ \ifcase\locationboxpagestate\relax
+ \expandafter\expandafter\expandafter\scrn_button_make_normal % other page: yes: same page or not ... todo
+ \or
+ \expandafter\expandafter\expandafter\scrn_button_make_normal % other page: empty but frame: no click
+ \or
+ \expandafter\expandafter\expandafter\scrn_button_make_normal % other page: empty no frame: no
+ \else
+ \expandafter\expandafter\expandafter\scrn_button_make_skipped % other page: nothing at all
+ \fi%
+ \fi}
+
+\def\scrn_button_make_nop
+ {\ifcase\locationboxpagestate\relax
+ \expandafter\scrn_button_make_framed
+ \or
+ \expandafter\scrn_button_make_empty
+ \or
+ \expandafter\scrn_button_make_nothing
+ \or
+ \expandafter\scrn_button_make_skipped
+ \fi}
+
+\def\scrn_button_make_framed#namespace#current#currentparameter#text%
+ {\directlocalframed[#namespace:#current]{\ignorespaces#text\removeunwantedspaces}}
+
+\def\scrn_button_make_skipped#namespace#current#currentparameter#text%
+ {\global\settrue\scrn_button_skipped}
+
+\def\scrn_button_make_normal#namespace#current#currentparameter#text%
+ {\ctxlua{structures.references.injectcurrentset(nil,nil)}%
+ \hbox attr \referenceattribute \lastreferenceattribute
+ {\directlocalframed
+ [#namespace:#current]%
+ {\ignorespaces#text\removeunwantedspaces}}}
+
+\def\scrn_button_make_contrast#namespace#current#currentparameter#text%
+ {\ctxlua{structures.references.injectcurrentset(nil,nil)}%
+ \hbox attr \referenceattribute \lastreferenceattribute
+ {\localframedwithsettings
+ [#namespace:#current]%
+ [\c!foregroundcolor=#currentparameter\c!contrastcolor]%
+ {\ignorespaces#text\removeunwantedspaces}}}
+
+\def\scrn_button_make_empty#namespace#current#currentparameter#text%
+ {\localframedwithsettings
+ [#namespace:#current]%
+ [\c!empty=\v!yes]%
+ {\ignorespaces#text\removeunwantedspaces}}
+
+\def\scrn_button_make_nothing#namespace#current#currentparameter#text%
+ {\localframedwithsettings
+ [#namespace:#current]%
+ [\c!empty=\v!yes,\c!frame=,\c!background=]%
+ {\ignorespaces#text\removeunwantedspaces}}
+
+%D Menus:
+%D
+%D \starttyping
+%D \setuppapersize
+%D [S6][S6]
+%D
+%D \setuplayout
+%D [backspace=6cm, cutspace=6cm,
+%D leftedge=3cm, rightedge=3cm,
+%D leftmargin=1cm, rightmargin=1cm,
+%D margindistance=5mm, edgedistance=5mm,
+%D topspace=4cm, bottomspace=4cm,
+%D header=0pt, footer=0pt,
+%D top=1cm, bottom=1cm,
+%D topdistance=5mm, bottomdistance=5mm,
+%D width=middle, height=middle]
+%D
+%D \setupinteraction
+%D [state=start,
+%D menu=on]
+%D
+%D \setupinteractionmenu
+%D [right]
+%D [state=start,background=color,frame=off,backgroundcolor=red,color=white,contrastcolor=blue]
+%D \setupinteractionmenu
+%D [left]
+%D [state=start,background=color,frame=off,backgroundcolor=green,color=white]
+%D \setupinteractionmenu
+%D [top]
+%D [state=start,background=color,frame=off,backgroundcolor=blue,color=white]
+%D \setupinteractionmenu
+%D [bottom]
+%D [state=start,background=color,frame=off,backgroundcolor=yellow,color=white]
+%D
+%D \setupinteractionmenu
+%D [left]
+%D [state=local]
+%D \setupinteractionmenu
+%D [bottom]
+%D [state=local]
+%D
+%D \startinteractionmenu[right]
+%D \startbut [page(2)] Page 2 \stopbut
+%D \startbut [page(1)] Page 1 \stopbut
+%D \includemenu[left]
+%D \includemenu[bottom]
+%D \stopinteractionmenu
+%D
+%D \startinteractionmenu[left]
+%D \startbut [page(1)] Page 1 \stopbut
+%D \startbut [page(2)] Page 2 \stopbut
+%D \stopinteractionmenu
+%D
+%D \startinteractionmenu[top]
+%D \startbut [page(1)] Page 1 \stopbut
+%D \startbut [page(2)] Page 2 \stopbut
+%D \stopinteractionmenu
+%D
+%D \startinteractionmenu[bottom]
+%D \startbut [page(2)] Page 2 \stopbut
+%D \startbut [page(1)] Page 1 \stopbut
+%D \stopinteractionmenu
+%D \stoptyping
+%D
+%D \starttyping
+%D \startinteractionmenu[rechts]
+%D \startbut [eerste] eerste \stopbut
+%D \starttxt hello world \stoptxt
+%D \startbut [tweede] tweede \stopbut
+%D \startnop \stopnop
+%D \startbut [tweede] tweede \stopbut
+%D \startrul whow \stoprul
+%D \startbut [tweede] tweede \stopbut
+%D \startraw hello world \stopraw
+%D \startbut [tweede] tweede \stopbut
+%D \startcom \vfill \stopcom
+%D \startbut [derde] derde \stopbut
+%D \stopinteractionmenu
+%D \stoptyping
+%D
+%D \starttyping
+%D \setupinteractionmenu[right][samepage=yes, unknownreference=yes]
+%D \setupinteractionmenu[right][samepage=empty,unknownreference=empty]
+%D \setupinteractionmenu[right][samepage=no, unknownreference=no]
+%D \setupinteractionmenu[right][samepage=none, unknownreference=none]
+%D \stoptyping
+
+\installcommandhandler \??am {interactionmenu} \??am
+
+\let\setupinteractionmenus\setupinteractionmenu
+
+\presetlocalframed[\??am]
+
+\let\scrn_menu_action\relax
+
+\let\scrn_menu_define_original\defineinteractionmenu
+
+\unexpanded\def\defineinteractionmenu
+ {\dotripleempty\scrn_menu_define}
+
+\def\scrn_menu_define[#tag][#category][#settings]% category reflects location, settings can be parent
+ {\ifthirdargument
+ \doifassignmentelse{#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}%
+ \setevalue{\??am:#tag\s!parent}{\??am#tag}% framed
+ \else\ifsecondargument
+ \doifassignmentelse{#category}%
+ {\scrn_menu_define_original[#tag][#category]% % root definition
+ \setevalue{\??am:#tag\s!parent}{\??am}}% framed
+ {\scrn_menu_define_original[#tag][#category][\c!category=#category]% % child definition
+ \scrn_menu_register{#tag}{#category}%
+ \setevalue{\??am:#tag\s!parent}{\??am#tag}}% framed
+ \else
+ \scrn_menu_define_original[#tag]% % root definition
+ \setevalue{\??am:#tag\s!parent}{\??am}% framed
+ \fi\fi}
+
+\def\scrn_menu_register#tag#category%
+ {\ifcsname\??am:t:#category\endcsname \else
+ \expandafter\newtoks \csname\??am:t:#category\endcsname
+ \expandafter\setfalse\csname\??am:c:#category\endcsname
+ \fi
+ \normalexpanded{\csname\??am:t:#category\endcsname{\the\csname\??am:t:#category\endcsname\scrn_menu_action{#tag}}}}
+
+\def\scrn_menu_actions#category%
+ {\the\csname\??am:t:#category\endcsname}
+
+%D Fill menus:
+
+\normalexpanded{\long\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\??am:c:\interactionmenuparameter\c!category\endcsname
+ \setinteractionmenuparameter\c!menu{#content}}
+
+\def\resetinteractionmenu[#tag]%
+ {\def\currentinteractionmenu{#tag}%
+ \resetinteractionmenuparameter\c!menu}
+
+%D Placement of menus:
+%D
+%D The offset mechanism is not the same as in in \MKII. There we
+%D adapted automatically to offsets in the text backgrounds. Here we
+%D have a bit more (but manual) control.
+%D
+%D \starttyping
+%D \setupbackgrounds
+%D [text][text]
+%D [background=color,backgroundcolor=gray,backgroundoffset=2mm]
+%D
+%D \setupbackgrounds
+%D [text]
+%D [rightedge,leftedge]
+%D [background=color,backgroundcolor=gray]
+%D
+%D \setupbackgrounds
+%D [top,bottom]
+%D [text]
+%D [background=color,backgroundcolor=gray]
+%D
+%D \setupinteractionmenu
+%D [right]
+%D [topoffset=0mm,bottomoffset=0mm]
+%D
+%D \setupinteractionmenu
+%D [top]
+%D [topoffset=2mm,bottomoffset=2mm,rightoffset=2mm,leftoffset=2mm]
+%D \stoptyping
+%D
+%D The no longer hard coded text areas offset compensation makes tuning
+%D easier. After all, menus need some setup anyway.
+
+\newbox \scrn_menu_box
+
+\newdimen\scrn_menu_next_distance
+\newdimen\scrn_menu_final_width
+\newdimen\scrn_menu_final_height
+\newdimen\scrn_menu_used_width
+\newdimen\scrn_menu_used_height
+\newdimen\scrn_menu_asked_width
+\newdimen\scrn_menu_asked_height
+\newdimen\scrn_menu_offset_top
+\newdimen\scrn_menu_offset_bottom
+\newdimen\scrn_menu_offset_left
+\newdimen\scrn_menu_offset_right
+
+\newconditional\scrn_menu_zerodimensions
+
+\def\scrn_menu_set_used
+ {\doassigncheckedframeoffset\scrn_menu_offset_left {\interactionmenuparameter\c!leftoffset }%
+ \doassigncheckedframeoffset\scrn_menu_offset_right {\interactionmenuparameter\c!rightoffset }%
+ \doassigncheckedframeoffset\scrn_menu_offset_top {\interactionmenuparameter\c!topoffset }%
+ \doassigncheckedframeoffset\scrn_menu_offset_bottom{\interactionmenuparameter\c!bottomoffset}%
+ \scrn_menu_asked_width \interactionmenuparameter\c!maxwidth
+ \scrn_menu_asked_height \interactionmenuparameter\c!maxheight
+ \scrn_menu_used_width\dimexpr
+ \scrn_menu_asked_width + \scrn_menu_offset_left + \scrn_menu_offset_right
+ \relax
+ \scrn_menu_used_height\dimexpr
+ \scrn_menu_asked_height + \scrn_menu_offset_top + \scrn_menu_offset_bottom
+ \relax}
+
+\def\scrn_menu_set_final
+ {\scrn_menu_final_width \namedinteractionmenuparameter\askedinteractionmenulocation\c!maxwidth
+ \scrn_menu_final_height\namedinteractionmenuparameter\askedinteractionmenulocation\c!maxheight}
+
+\def\scrn_menu_apply_final
+ {\ifconditional\scrn_menu_zerodimensions
+ \wd\scrn_menu_box\zeropoint
+ \ht\scrn_menu_box\zeropoint
+ \else
+ \wd\scrn_menu_box\scrn_menu_final_width
+ \ht\scrn_menu_box\scrn_menu_final_height
+ \fi
+ \dp\scrn_menu_box\zeropoint}
+
+\def\scrn_menu_apply_used
+ {\ifdim\scrn_menu_offset_left=\zeropoint \else
+ \setbox\scrn_menu_box\hbox{\hskip-\scrn_menu_offset_left \box\scrn_menu_box}%
+ \fi
+ \ifdim\scrn_menu_offset_bottom=\zeropoint \else
+ \setbox\scrn_menu_box\hbox{\lower \scrn_menu_offset_bottom \box\scrn_menu_box}%
+ \fi
+ \wd\scrn_menu_box\scrn_menu_asked_width
+ \ht\scrn_menu_box\scrn_menu_asked_height
+ \dp\scrn_menu_box\zeropoint}
+
+\setvalue{scrn_menu_align_\v!right }{\let\scrn_menu_left_align\raggedright}
+\setvalue{scrn_menu_align_\v!left }{\let\scrn_menu_left_align\raggedleft}
+\setvalue{scrn_menu_align_\v!flushright}{\let\scrn_menu_left_align\raggedleft}
+\setvalue{scrn_menu_align_\v!flushleft }{\let\scrn_menu_left_align\raggedright}
+\setvalue{scrn_menu_align_\v!middle }{\let\scrn_menu_left_align\raggedcenter}
+\setvalue{scrn_menu_align_\v!low }{\let\scrn_menu_top_align\vss\let\scrn_menu_bottom_align\relax}
+\setvalue{scrn_menu_align_\v!high }{\let\scrn_menu_top_align\relax\let\scrn_menu_bottom_align\vss}
+\setvalue{scrn_menu_align_\v!lohi }{\let\scrn_menu_top_align\vss\let\scrn_menu_bottom_align\vss}
+
+\let\scrn_menu_left_align \relax
+\let\scrn_menu_right_align \relax
+\let\scrn_menu_top_align \relax
+\let\scrn_menu_bottom_align\relax
+
+\def\scrn_menu_set_align
+ {\csname scrn_menu_align_\interactionmenuparameter\c!itemalign\endcsname}
+
+%D Hook into the pagebuilder (as less testing as possible):
+
+\def\scrn_menu_insert
+ {\iflocation
+ \expandafter\scrn_menu_insert_checked
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\def\scrn_menu_insert_checked#location%
+ {\ifconditional\csname\??am:c:#location\endcsname
+ \scrn_menu_insert_indeed{#location}%
+ \fi}
+
+\def\scrn_menu_insert_indeed#location%
+ {\begingroup
+ \xdef\askedinteractionmenulocation{#location}%
+ \scrn_menu_set_final
+ \ifcase\scrn_menu_final_width \else \ifcase\scrn_menu_final_height \else
+ \forgetall
+ \global\scrn_menu_next_distance\zeropoint
+ \let\scrn_menu_action\scrn_menu_package_indeed
+ \the\everysetmenucommands
+ \csname\??am:\c!menu:\namedinteractionmenuparameter\askedinteractionmenulocation\c!alternative\endcsname
+ \fi \fi
+ \endgroup}
+
+%D This calls: % can be \c!command for vertical/horizontal
+
+\setvalue{\??am:\c!menu:\v!vertical}% all menus
+ {\let\scrn_menu_packager\scrn_menu_packager_vertical
+ \setbox\scrn_menu_box\hbox{\scrn_menu_actions\askedinteractionmenulocation}%
+ \scrn_menu_apply_final
+ \box\scrn_menu_box}
+
+\setvalue{\??am:\c!menu:\v!horizontal}% all menus
+ {\let\scrn_menu_packager\scrn_menu_packager_horizontal
+ \setbox\scrn_menu_box\vbox{\scrn_menu_actions\askedinteractionmenulocation}%
+ \scrn_menu_apply_final
+ \box\scrn_menu_box}
+
+% stop : skipped
+% start: processed
+% local: skipped but can be included
+% empty: processed but invisible
+
+\unexpanded\def\scrn_menu_package_indeed#tag% one menu
+ {\begingroup
+ \edef\currentinteractionmenu{#tag}%
+ \edef\currentinteractionmenustate{\interactionmenuparameter\c!state}%
+ \ifx\currentinteractionmenustate\v!start
+ \scrn_menu_packager
+ \else\ifx\currentinteractionmenustate\v!empty
+ \scrn_menu_packager
+ \fi\fi
+ \endgroup}
+
+%D With the packager being one of:
+
+\def\scrn_menu_packager_vertical
+ {\scrn_menu_set_used
+ \hskip\scrn_menu_next_distance
+ \setbox\scrn_menu_box\hbox to \scrn_menu_used_width
+ {\ifx\currentinteractionmenustate\v!empty \else
+ \interactionmenuparameter\c!left
+ \scrn_menu_package_vertical{\interactionmenuparameter\c!menu}%
+ \interactionmenuparameter\c!right
+ \fi}%
+ \edef\currentinteractionmenudistance{\interactionmenuparameter\c!distance}%
+ \ifx\currentinteractionmenudistance\v!overlay
+ \global\scrn_menu_next_distance\zeropoint
+ \wd\scrn_menu_box\zeropoint
+ \else
+ \global\scrn_menu_next_distance\currentinteractionmenudistance
+ \scrn_menu_apply_used
+ \fi
+ \box\scrn_menu_box}
+
+\def\scrn_menu_packager_horizontal
+ {\scrn_menu_set_used
+ \vskip\scrn_menu_next_distance
+ \scrn_menu_set_align
+ \setbox\scrn_menu_box\vbox to \scrn_menu_used_height
+ {\ifx\currentinteractionmenustate\v!none \else
+ \scrn_menu_top_align
+ \interactionmenuparameter\c!before
+ \scrn_menu_package_horizontal{\interactionmenuparameter\c!menu}%
+ \interactionmenuparameter\c!after
+ \scrn_menu_bottom_align
+ \fi}%
+ \edef\currentinteractionmenudistance{\interactionmenuparameter\c!distance}%
+ \ifx\currentinteractionmenudistance\v!overlay
+ \global\scrn_menu_next_distance\zeropoint
+ \offinterlineskip
+ \dp\scrn_menu_box\zeropoint
+ \ht\scrn_menu_box\zeropoint
+ \else
+ \global\scrn_menu_next_distance\currentinteractionmenudistance
+ \scrn_menu_apply_used
+ \fi
+ \box\scrn_menu_box}
+
+%D For a right menu, a sequence of calls to \type
+%D {right_menu_button} is generated.
+%D
+%D \starttyping
+%D right_menu_button (n, p, s=0/1/2, x, y, w, h, d) ;
+%D \stoptyping
+%D
+%D Here, n is the number of the button, s a status variable,
+%D while the rest is positional info. The status variable is
+%D 0, 1 or~2: not found, found and found but current page.
+
+\newcount \scrn_menu_position
+\newconstant \scrn_menu_page_mode % 0=notfound 1=found 2=currentpage
+\newconditional\scrn_menu_positioning
+\newtoks \scrn_menu_mp_data
+
+\def\scrn_menu_button_mp_template
+ {\askedinteractionmenulocation _menu_button(%
+ \number\scrn_menu_position,%
+ \number\scrn_menu_page_mode,%
+ \MPpos{\askedinteractionmenulocation:\number\scrn_menu_position}%
+ );}
+
+\def\MPmenubuttons#1{\the\scrn_menu_mp_data}
+
+\appendtoks
+ \global\scrn_menu_mp_data\emptytoks
+\to \everyshipout
+
+\def\scrn_menu_whole_position % cannot happen in previous due to align
+ {\setbox\scrn_menu_box\hbox \bgroup
+ \hpos{menu:\askedinteractionmenulocation:\the\realpageno}{\box\scrn_menu_box}%
+ \egroup}
+
+% removed: \restorestandardblank (vspacing) ... should happen elsewhere
+
+\def\scrn_menu_package_vertical#content%
+ {\begingroup
+ \global\scrn_menu_position\zerocount
+ \def\scrn_menu_between_action_indeed{\interactionmenuparameter\c!inbetween}%
+ \doifelse{\interactionmenuparameter\c!position}\v!yes\settrue\setfalse\scrn_menu_positioning
+ \scrn_menu_set_align
+ \setbox\scrn_menu_box\vbox to \scrn_menu_used_height \bgroup
+ \hsize\scrn_menu_used_width
+ \scrn_menu_left_align
+ \interactionmenuparameter\c!before\relax
+ \ignorespaces#content\unskip
+ \interactionmenuparameter\c!after
+ \scrn_menu_right_align
+ \egroup
+ \ifconditional\scrn_menu_positioning
+ \scrn_menu_whole_position
+ \fi
+ \box\scrn_menu_box
+ \endgroup}
+
+\def\scrn_menu_package_horizontal#content%
+ {\begingroup
+ \global\scrn_menu_position\zerocount
+ \def\scrn_menu_between_action_indeed{\interactionmenuparameter\c!middle}%
+ \doifelse{\interactionmenuparameter\c!position}\v!yes\settrue\setfalse\scrn_menu_positioning
+ \setbox\scrn_menu_box\hbox to \scrn_menu_used_width \bgroup
+ \interactionmenuparameter\c!left\relax
+ \ignorespaces#content\unskip
+ \interactionmenuparameter\c!right
+ \egroup
+ \ifconditional\scrn_menu_positioning
+ \scrn_menu_whole_position
+ \fi
+ \box\scrn_menu_box
+ \endgroup}
+
+\def\scrn_menu_action_start
+ {\dontleavehmode
+ \begingroup}
+
+\def\scrn_menu_action_stop
+ {\ifconditional\scrn_button_skipped \else
+ \scrn_menu_between_action_indeed
+ \fi
+ \endgroup
+ \ignorespaces}
+
+\unexpanded\def\scrn_menu_raw_start[#action]#text\stopraw
+ {\scrn_menu_action_start
+ \gotobox{\ignorespaces#text\unskip}[#action]%
+ \scrn_menu_action_stop}
+
+\unexpanded\def\scrn_menu_but_start[#action]#text\stopbut
+ {\scrn_menu_action_start
+ \ifconditional\scrn_menu_positioning
+ \expandafter\scrn_button_make_position
+ \else
+ \expandafter\scrn_button_make
+ \fi\??am\currentinteractionmenu\interactionmenuparameter{#text}{#action}%
+ \scrn_menu_action_stop}
+
+\def\scrn_button_make_position#namespace#current#currentparameter#text#action%
+ {\global\advance\scrn_menu_position\plusone
+ \doifreferencefoundelse{#action}% 0=not found, 1=same page, >1=elsewhere
+ {\scrn_menu_page_mode\ifnum\currentreferencerealpage=\realpageno\plusone\else\plustwo\fi}%
+ {\scrn_menu_page_mode\plustwo}%
+ \doglobal\appendetoks
+ \scrn_menu_button_mp_template
+ \to \scrn_menu_mp_data
+ \hpos
+ {\askedinteractionmenulocation:\number\scrn_menu_position}%
+ {\scrn_button_make{#namespace}{#current}{#currentparameter}{#text}{#action}}}
+
+\unexpanded\def\scrn_menu_got_start[#action]#text\stopgot
+ {\scrn_menu_action_start
+ \setupbuttons[\currentinteractionmenu][\c!frame=\v!off,\c!background=]%
+ \scrn_button_make\??am\currentinteractionmenu\interactionmenuparameter{#text}{#action}%
+ \scrn_menu_action_stop}
+
+\unexpanded\def\scrn_menu_nop_start#text\stopnop
+ {\scrn_menu_action_start
+ \localframedwithsettings
+ [\??am:\currentinteractionmenu]%
+ [\c!frame=\v!off,\c!background=,\c!empty=\v!yes]%
+ {\ignorespaces#text\removeunwantedspaces}%
+ \scrn_menu_action_stop}
+
+\unexpanded\def\scrn_menu_txt_start#text\stoptxt
+ {\scrn_menu_action_start
+ \localframedwithsettings
+ [\??am:\currentinteractionmenu]%
+ [\c!frame=\v!off,\c!background=]%
+ {\ignorespaces#text\removeunwantedspaces}%
+ \scrn_menu_action_stop}
+
+\unexpanded\def\scrn_menu_rul_start#text\stoprul
+ {\scrn_menu_action_start
+ \directlocalframed
+ [\??am:\currentinteractionmenu]%
+ {\ignorespaces#text\removeunwantedspaces}%
+ \scrn_menu_action_stop}
+
+\unexpanded\def\scrn_menu_com_start#text\stopcom
+ {\ignorespaces#text\removeunwantedspaces
+ \ignorespaces}
+
+\unexpanded\def\scrn_menu_raw#content\\{\scrn_menu_raw_start#content\stopraw} \let\stopraw\relax
+\unexpanded\def\scrn_menu_but#content\\{\scrn_menu_but_start#content\stopbut} \let\stopbut\relax
+\unexpanded\def\scrn_menu_got#content\\{\scrn_menu_got_start#content\stopgot} \let\stopgot\relax
+\unexpanded\def\scrn_menu_nop#content\\{\scrn_menu_nop_start#content\stopnop} \let\stopnop\relax
+\unexpanded\def\scrn_menu_txt#content\\{\scrn_menu_nop_start#content\stoptxt} \let\stoptxt\relax
+\unexpanded\def\scrn_menu_rul#content\\{\scrn_menu_rul_start#content\stoprul} \let\stoprul\relax
+\unexpanded\def\scrn_menu_com#content\\{\scrn_menu_com_start#content\stopcom} \let\stopcom\relax
+
+\newtoks\everysetmenucommands % public
+
+\appendtoks
+ \let\raw\scrn_menu_raw \let\startraw\scrn_menu_raw_start
+ \let\but\scrn_menu_but \let\startbut\scrn_menu_but_start
+ \let\got\scrn_menu_got \let\startgot\scrn_menu_got_start
+ \let\nop\scrn_menu_nop \let\startnop\scrn_menu_nop_start
+ \let\txt\scrn_menu_txt \let\starttxt\scrn_menu_txt_start
+ \let\rul\scrn_menu_rul \let\startrul\scrn_menu_rul_start
+ \let\com\scrn_menu_com \let\startcom\scrn_menu_com_start
+\to \everysetmenucommands
+
+%D Sometimes handy:
+%D
+%D \starttyping
+%D \setupinteractionmenu
+%D [left]
+%D [state=local]
+%D
+%D \startinteractionmenu[right]
+%D ...
+%D \includemenu[left]
+%D ...
+%D \stopinteractionmenu
+%D \stoptyping
+
+\unexpanded\def\includemenu[#tag]%
+ {\begingroup
+ \edef\currentinteractionmenu{#tag}%
+ \doif{\interactionmenuparameter\c!state}\v!local
+ {\letinteractionmenuparameter\c!state\v!start
+ \setinteractionmenuparameter\s!parent{\??am\askedinteractionmenulocation}% nice hack
+ \interactionmenuparameter\c!menu}%
+ \endgroup}
+
+%D Direct call (todo):
+
+\unexpanded\def\interactionmenu
+ {\dodoubleempty\scrn_menu_interaction_menu}
+
+\def\scrn_menu_interaction_menu[#tag][#settings]%
+ {\begingroup
+ \setupinteractionmenu[#tag][#settings]%
+% \edef\currentinteractionmenu {#tag}%
+% \edef\askedinteractionmenulocation {\interactionmenuparameter\c!category}%
+% \edef\askedinteractionmenualternative{\interactionmenuparameter\c!alternative}%
+% \def\scrn_menu_actions#dummy{\scrn_menu_package_indeed\currentinteractionmenu}%
+% \csname\??am:\c!menu:\askedinteractionmenualternative\endcsname
+ \scrn_menu_insert{#tag}%
+ \endgroup}
+
+%D Plugin handler:
+
+\unexpanded\def\scrn_menu_insert_content_indeed
+ {\iflocation % here as we can have a fast turn-off
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
+
+\let\scrn_menu_insert_content_ignore\gobbleoneargument
+
+\appendtoks
+ \doifelse{\interactionparameter\c!menu}\v!on
+ {\let\scrn_menu_insert_content\scrn_menu_insert_content_indeed}%
+ {\let\scrn_menu_insert_content\scrn_menu_insert_content_ignore}%
+\to \everysetupinteraction
+
+%D Plugs into the page builder:
+
+\unexpanded\def\scrn_menu_leftedge
+ {\hbox to \leftedgewidth \bgroup
+ \hsize\leftedgewidth
+ %\csname\??tk\v!leftedge\c!left\endcsname
+ \settrue\scrn_menu_zerodimensions
+ \scrn_menu_insert\v!left
+ %\csname\??tk\v!leftedge\c!right\endcsname
+ \egroup
+ \hskip-\leftedgewidth}
+
+\unexpanded\def\scrn_menu_rightedge
+ {\hbox to \rightedgewidth \bgroup
+ \hsize\rightedgewidth
+ %\csname\??tk\v!rightedge\c!left\endcsname
+ \settrue\scrn_menu_zerodimensions
+ \scrn_menu_insert\v!right
+ %\csname\??tk\v!rightedge\c!right\endcsname
+ \egroup
+ \hskip-\rightedgewidth}
+
+\unexpanded\def\scrn_menu_top % uses \??tk
+ {\vbox to \topheight \bgroup
+ \vsize\topheight
+ %\csname\??tk\v!top\c!before\endcsname
+ \settrue\scrn_menu_zerodimensions
+ \scrn_menu_insert\v!top
+ %\csname\??tk\v!top\c!after\endcsname
+ \kern\zeropoint
+ \egroup
+ \vskip-\topheight}
+
+\unexpanded\def\scrn_menu_bottom % uses \??tk
+ {\vbox to \bottomheight \bgroup
+ \vsize\bottomheight
+ %\csname\??tk\v!bottom\c!before\endcsname
+ \settrue\scrn_menu_zerodimensions
+ \scrn_menu_insert\v!bottom
+ %\csname\??tk\v!bottom\c!after\endcsname
+ \kern\zeropoint
+ \egroup
+ \vskip-\bottomheight}
+
+\appendtoks \scrn_menu_insert_content\scrn_menu_leftedge \to \leftedgetextcontent
+\appendtoks \scrn_menu_insert_content\scrn_menu_rightedge \to \rightedgetextcontent
+\appendtoks \scrn_menu_insert_content\scrn_menu_top \to \toptextcontent
+\appendtoks \scrn_menu_insert_content\scrn_menu_bottom \to \bottomtextcontent
+
+%D Initialization (root definitions, main builders):
+
+\defineinteractionmenu [\v!vertical] [\c!alternative=\v!vertical]
+\defineinteractionmenu [\v!horizontal] [\c!alternative=\v!horizontal]
+
+%D Initialization (parent definitions, 4 area builders):
+
+\defineinteractionmenu [\v!right ] [\v!right ] [\v!vertical ]
+\defineinteractionmenu [\v!left ] [\v!left ] [\v!vertical ]
+\defineinteractionmenu [\v!top ] [\v!top ] [\v!horizontal]
+\defineinteractionmenu [\v!bottom] [\v!bottom] [\v!horizontal]
+
+\setupinteraction
+ [\c!menu=\v!off]
+
+\setupinteractionmenu
+ [\c!offset=.25em,
+ \c!position=\v!no,
+ \c!frame=\v!on,
+ \c!maxwidth=\hsize,
+ \c!maxheight=\vsize,
+ \c!background=,
+ \c!backgroundcolor=,
+ \c!foregroundstyle=\interactionmenuparameter\c!style,
+ \c!foregroundcolor=\interactionmenuparameter\c!color,
+ \c!style=\interactionparameter\c!style,
+ \c!color=\interactionparameter\c!color,
+ \c!contrastcolor=\interactionparameter\c!contrastcolor,
+ \c!state=\v!start,
+ \c!samepage=\v!yes,
+ \c!unknownreference=\v!empty,
+ \c!distance=\bodyfontsize,
+ \c!topoffset=\zeropoint,
+ \c!bottomoffset=\zeropoint,
+ \c!leftoffset=\zeropoint,
+ \c!rightoffset=\zeropoint]
+
+\setupinteractionmenu
+ [\v!vertical] % not really a menu
+ [\c!inbetween=\blank,
+ \c!before=,
+ \c!after=\vfil,
+ %\c!width=\v!fit,
+ \c!height=\v!broad]
+
+\setupinteractionmenu
+ [\v!horizontal] % not really a menu
+ [\c!middle=\hfil,
+ %\c!left=\hss,
+ %\c!right=\hss,
+ \c!width=\v!fit,
+ \c!height=\v!broad]
+
+\setupinteractionmenu
+ [\v!left]
+ [\c!itemalign=\v!flushright,
+ \c!maxwidth=\leftedgewidth,
+ \c!maxheight=\makeupheight]
+
+\setupinteractionmenu
+ [\v!right]
+ [\c!itemalign=\v!flushleft,
+ \c!maxwidth=\rightedgewidth,
+ \c!maxheight=\makeupheight]
+
+\setupinteractionmenu
+ [\v!top]
+ [\c!itemalign=\v!high,
+ \c!maxwidth=\makeupwidth,
+ \c!maxheight=\topheight]
+
+\setupinteractionmenu
+ [\v!bottom]
+ [\c!itemalign=\v!low,
+ \c!maxwidth=\makeupwidth,
+ \c!maxheight=\bottomheight]
+
+%D Lists:
+
+\setvalue{\@@dodolistelement\v!left }{\def\dosomelistelement{\scrn_menu_list_element\v!left }}
+\setvalue{\@@dodolistelement\v!right }{\def\dosomelistelement{\scrn_menu_list_element\v!right }}
+\setvalue{\@@dodolistelement\v!top }{\def\dosomelistelement{\scrn_menu_list_element\v!top }}
+\setvalue{\@@dodolistelement\v!bottom}{\def\dosomelistelement{\scrn_menu_list_element\v!bottom}}
+
+\def\scrn_menu_list_element#1#2#3#4#5#6#7%
+ {\startbut[internal(#3)]
+ \limitatetext{#5}{\namedlistparameter{#2}\c!maxwidth}\unknown%
+ \stopbut}
+
+%D Sometimes handy:
+
+\unexpanded\def\menubutton % tag settings text action
+ {\dodoubleempty\scrn_menu_menu_button}
+
+\def\scrn_button_direct_status
+ {\doifelse{\buttonparameter\c!state}\v!start
+ {\dosingleempty\scrn_button_direct_indeed}%
+ {\dosingleempty\scrn_button_direct_ignore}}
+
+\def\scrn_menu_menu_button
+ {\iflocation
+ \expandafter\scrn_menu_menu_button_indeed
+ \else
+ \expandafter\scrn_menu_menu_button_ignore
+ \fi}
+
+\def\scrn_menu_menu_button_indeed[#menutag][#settings]#text[#action]%
+ {\ifsecondargument
+ \scrn_menu_menu_button_a
+ {#menutag}{#settings}{#text}{#action}%
+ \else
+ \doifassignmentelse{#menutag}\scrn_menu_menu_button_b\scrn_menu_menu_button_c{#menutag}{#text}{#action}%
+ \fi}
+
+\def\scrn_menu_menu_button_ignore[#menutag][#settings]#text[#action]%
+ {}
+
+\def\scrn_menu_menu_button_a#tag#settings#text#action%
+ {\doif{\interactionmenuparameter\c!state}\v!start
+ {\dontleavehmode \begingroup
+ \setupinteractionmenu[#tag][#settings]%
+ \scrn_button_make\??am{#tag}\menuparameter{#text}{#action}%
+ \endgroup}}
+
+\def\scrn_menu_menu_button_b#settings#text#action%
+ {\doif{\buttonparameter\c!state}\v!start
+ {\dontleavehmode \begingroup
+ \setupbuttons[#settings]%
+ \scrn_button_make\??bt\empty\buttonparameter{#text}{#action}%
+ \endgroup}}
+
+\def\scrn_menu_menu_button_c#tag#text#action%
+ {\doif{\interactionmenuparameter\c!state}\v!start
+ {\dontleavehmode \begingroup
+ \scrn_button_make\??am{#tag}\menuparameter{#text}{#action}%
+ \endgroup}}
+
+%D Untested:
+
+\unexpanded\def\registermenubuttons
+ {\dodoubleempty\scrn_menu_register_menu_buttons}
+
+\def\scrn_menu_register_menu_buttons[#menu][#register]%
+ {\ifsecondargument
+ \ctxcommand{registerbuttons("menu","#register","\currentlanguage")}
+ \else
+ \ctxcommand{registerbuttons("","#menu","\currentlanguage")}
+ \fi}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-fld.lua b/Master/texmf-dist/tex/context/base/scrn-fld.lua
new file mode 100644
index 00000000000..439de13b3f5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-fld.lua
@@ -0,0 +1,76 @@
+if not modules then modules = { } end modules ['scrn-fld'] = {
+ version = 1.001,
+ comment = "companion to scrn-fld.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- we should move some code from lpdf-fld to here
+
+local fields = { }
+interactions.fields = fields
+
+local codeinjections = backends.codeinjections
+local nodeinjections = backends.nodeinjections
+
+local function define(specification)
+ codeinjections.definefield(specification)
+end
+
+local function defineset(name,set)
+ codeinjections.definefield(name,set)
+end
+
+local function clone(specification)
+ codeinjections.clonefield(specification)
+end
+
+local function insert(name,specification)
+ return nodeinjections.typesetfield(name,specification)
+end
+
+fields.define = define
+fields.defineset = defineset
+fields.clone = clone
+fields.insert = insert
+
+commands.definefield = define
+commands.definefieldset = defineset
+commands.clonefield = clone
+
+function commands.insertfield(name,specification)
+ tex.box["scrn_field_box_body"] = insert(name,specification)
+end
+
+-- (for the monent) only tex interface
+
+function commands.getfieldcategory(name)
+ local g = codeinjections.getfieldcategory(name)
+ if g then
+ context(g)
+ end
+end
+
+function commands.getdefaultfieldvalue(name)
+ local d = codeinjections.getdefaultfieldvalue(name)
+ if d then
+ context(d)
+ end
+end
+
+function commands.setformsmethod(method)
+ codeinjections.setformsmethod(method)
+end
+
+function commands.doiffieldcategoryelse(name)
+ commands.testcase(codeinjections.validfieldcategory(name))
+end
+
+function commands.doiffieldsetelse(tag)
+ commands.testcase(codeinjections.validfieldset(name))
+end
+
+function commands.doiffieldelse(name)
+ commands.testcase(codeinjections.validfield(name))
+end
diff --git a/Master/texmf-dist/tex/context/base/scrn-fld.mkiv b/Master/texmf-dist/tex/context/base/scrn-fld.mkiv
deleted file mode 100644
index f895089e884..00000000000
--- a/Master/texmf-dist/tex/context/base/scrn-fld.mkiv
+++ /dev/null
@@ -1,686 +0,0 @@
-%D \module
-%D [ file=scrn-fld,
-%D version=1997.05.18,
-%D title=\CONTEXT\ Screen Macros,
-%D subtitle=Fields,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Screen Macros / Fields}
-
-\unprotect
-
-%D First we hook fields into the (viewer based) layering mechanism
-%D (implemented as properties).
-
-\appendtoks
- \doif\@@iafieldlayer\v!auto{\def\@@iafieldlayer{\currentviewerlayer}}%
-\to \everysetupinteraction
-
-\setupinteraction
- [\c!fieldlayer=\v!auto] % auto by default
-
-%D \starttyping
-%D \definefield [name] [type] [group] [values] [default]
-%D
-%D \definefield [WWWW] [text] [textsetup] [default text]
-%D \definefield [XXXX] [push] [pushsetup] [yes,no] [yes]
-%D \definefield [XXXX] [check] [checksetup] [yes,no] [yes]
-%D \definefield [YYYY] [combo] [combosetup] [a,b,c,d] [b]
-%D \definefield [ZZZZ] [radio] [radiosetup] [W,X,Y,Z] [Y]
-%D
-%D \definesubfield [W] [subsetup] [p,q]
-%D \definesubfield [X,Y] [subsetup] [p,r]
-%D \definesubfield [Z] [subsetup] [y,z]
-%D
-%D evt \definemainfield ... wanneer geplaatst voor subs gegeven
-%D
-%D \clonefield [XXXX] [XX,YY] [mysetup] [on,off]
-%D \clonefield [Z] [AA,BB] [somesetup] [true,false]
-%D \clonefield [Z] [CC,DD] [anothersetup]
-%D
-%D \copyfield [XXXX] [PP,QQ,RR]
-%D
-%D \field[XXXX]
-%D \fitfield[XXXX]
-%D \stoptyping
-
-%D Internal command, linked to \type{\definesymbol}.
-
-\def\dogetfieldsymbol#1%
- {\getobject{SYM}{#1}}
-
-\def\dopresetfieldsymbol#1%
- {\doifobjectfoundelse{SYM}{#1}
- {}
- {\settightobject{SYM}{#1}\hbox{\symbol[#1]}%
- \flushatshipout
- {\setbox0\hbox{\hskip-\maxdimen\getobject{SYM}{#1}}%
- \smashbox0\box0}}}
-
-\def\presetfieldsymbols[#1]% slow
- {\def\dopresetfieldsymbols##1{\processcommalist[##1]\dopresetfieldsymbol}%
- \@EA\processcommalist\@EA[#1]\dopresetfieldsymbols}
-
-\unexpanded\def\definedefaultsymbols
- {\definesymbol[defaultyes][\mathematics{\times}]%
- \definesymbol[defaultno ][\mathematics{\cdot }]}
-
-\def\resetfieldsymbol[#1]% for experimental usage only
- {\resetobject{SYM}{#1}}
-
-%D The interface to the specials. DEFAULT NOG ANDERS
-
-\def\typesetfield
- {\bgroup
- \dosetfontattribute\??fd\c!style
- \ctxlua{backends.codeinjections.typesetfield("\currentfieldname", {
- title = "\currentfieldname",
- width = \number\dimexpr\@@fdwidth\relax,
- height = \number\dimexpr\@@fdheight\relax,
- align = "\@@fdalign",
- length = tonumber("\@@fdn") or 0,
- style = "\@@fdstyle",
- fontstyle = "\fontstyle",
- fontalternative = "\fontalternative",
- fontsize = "\currentfontbodysize",
- color = "\@@fdcolor",
- backgroundcolor = "\@@fdfieldbackgroundcolor",
- framecolor = "\@@fdfieldframecolor",
- layer = "\@@fdfieldlayer",
- options = "\@@fdoption",
- align = "\@@fdalign",
- clickin = "\@@fdclickin",
- clickout = "\@@fdclickout",
- regionin = "\@@fdregionin",
- regionout = "\@@fdregionout",
- afterkey = "\@@fdafterkey",
- format = "\@@fdformat",
- validate = "\@@fdvalidate",
- calculate = "\@@fdcalculate",
- focusin = "\@@fdfocusin",
- focusout = "\@@fdfocusout",
- }) }%
- \egroup}
-
-\unexpanded\def\definefieldset {\dodoubleargument\dodefinefieldset}
-\unexpanded\def\definefield {\doquintupleempty\dodefinefield}
-\unexpanded\def\definemainfield{\doquintupleempty\dodefinefield} % redundant
-\unexpanded\def\definesubfield {\dotripleempty \dodefinesubfield}
-\unexpanded\def\clonefield {\doquadrupleempty\doclonefield}
-\unexpanded\def\copyfield {\dodoubleempty \docopyfield}
-\unexpanded\def\field {\dodoubleempty \donormalfield}
-\unexpanded\def\fitfield {\dodoubleempty \dofitfield}
-\unexpanded\def\setupfield {\doquintupleempty\dosetupfield}
-\unexpanded\def\setupfields {\doquadrupleempty\dosetupfields}
-
-% misc
-
-% \appendtoks\ctxlua{backends.codeinjections.finishfields()}\to\everylastshipout
-
-% testing
-
-\def\doiffieldelse #1{\ctxlua{backends.codeinjections.doiffieldelse("#1")}}
-\def\doiffieldgroupelse#1{\ctxlua{backends.codeinjections.doiffieldgroupelse("#1")}}
-
-% definition
-
-\def\dodefinefield[#1][#2][#3][#4][#5]% [name] [kind] [group] [values] [default] | [name] [kind] [group] [default]
- {\ctxlua{backends.codeinjections.definefield{ variant="normal", name="#1", kind="#2", group="#3", values=\!!bs#4\!!es, default=\!!bs#5\!!es }}}
-
-\def\dodefinesubfield[#1][#2][#3]% [name] [group] [values]
- {\ctxlua{backends.codeinjections.definefield{ variant="normal", name="#1", kind="sub", group="#2", values=\!!bs#3\!!es }}}
-
-\def\doclonefield[#1][#2][#3][#4]% [parent] [children] [group] [values]
- {\ctxlua{backends.codeinjections.clonefield{ variant="clone", parent="#1", children="#2", group="#3", values=\!!bs#4\!!es }}}
-
-\def\docopyfield[#1][#2]% [parent] [children]
- {\ctxlua{backends.codeinjections.clonefield{ variant="copy", parent="#1", children="#2" }}}
-
-\def\dodefinefieldset[#1][#2]%
- {\ctxlua{backends.codeinjections.definefieldset("#1","#2")}}
-
-% usage
-%
-% \iftrialtypesetting
-%
-% just a default setup
-
-\def\loadfieldscripts{\useJSscripts[fld]\globallet\loadfieldscripts\relax}
-
-\def\donormalfield{\doprocessfield\dohandlefield}
-\def\dofitfield {\doprocessfield\dohandlefitfield}
-
-\def\dosetupfieldindeed#1#2[#3]% [#4][#5][#6][#7]%
- {#1[#2]} % [#4][#5][#6][#7]}
-
-\def\doprocessfield#1[#2][#3]% \method [name] [label]
- {\dontleavehmode
- \begingroup
- \loadfieldscripts
- \edef\currentfieldname {#2}%
- \edef\currentfieldlabel{#3}%
- \edef\currentfieldgroup{\ctxlua{backends.codeinjections.getfieldgroup("#2")}}%
- \ifx\currentfieldlabel\empty
- \let\currentfieldlabel\currentfieldname
- \fi
- \ifx\currentfieldgroup\empty
- #1[#2][\v!label,\v!frame,\v!horizontal][][][]%
- \else
- \def\dosetupfield{\dosetupfieldindeed{#1}{#2}}%
- \getvalue{\??fd::\currentfieldgroup}%
- \fi
- \endgroup}
-
-% setups
-
-\def\dosetupfield[#1][#2][#3][#4][#5]%
- {\iffifthargument
- \def\docommand##1{\dodosetupfield[##1][#2][#3][#4][#5]}%
- \processcommalist[#1]\docommand
- \else\ifthirdargument
- \def\docommand##1{\dodosetupfield[##1][#2][][][#3]}%
- \processcommalist[#1]\docommand
- \else\ifsecondargument
- \doifelse{#2}\v!reset
- {\def\docommand##1{\donosetupfield[#1][][][][]}}
- {\def\docommand##1{\dodosetupfield[##1][][][][#2]}}%
- \processcommalist[#1]\docommand
- \else\iffirstargument
- \def\docommand##1{\dodosetupfield[##1][][][][]}%
- \processcommalist[#1]\docommand
- \else
- \writestatus\m!fields{provide either 1, 2, 3 or 5 arguments}%
- \fi\fi\fi\fi}
-
-\def\normaldodosetupfield[#1][#2][#3][#4][#5]%
- {\ifcsname\??fd::#1\endcsname
- \pushmacro\dosetupfield
- \def\dosetupfield[##1][##2][##3][##4][##5]{\setvalue{\??fd::#1}{\dosetupfield[#1][##2,#2][##3,#3][##4,#4][##5,#5]}}%
- \getvalue{\??fd::#1}%
- \popmacro\dosetupfield
- \else
- \setvalue{\??fd::#1}{\dosetupfield[#1][#2][#3][#4][#5]}%
- \fi}
-
-\let\dodosetupfield\normaldodosetupfield
-
-\def\donosetupfield[#1][#2][#3][#4][#5]%
- {\setvalue{\??fd::#1}{\dosetupfield[#1][#2][#3][#4][#5]}}
-
-\def\dosetupfields[#1][#2][#3][#4]%
- {\ifsecondargument
- \def\dodosetupfield[##1][##2][##3][##4][##5]%
- {\ifcsname\??fd::##1\endcsname
- \def\dosetupfield[####1][####2][####3][####4][####5]%
- {\setvalue{\??fd::##1}{\dosetupfield[##1][#1,####2,##2][#2,####3,##3][#3,####4,##4][#4,####5,##5]}}%
- \getvalue{\??fd::##1}%
- \else
- \setvalue{\??fd::##1}{\dosetupfield[##1][#1,##2][#2,##3][#3,##4][#4,##5]}%
- \fi}%
- \else\iffirstargument
- \doifelse{#1}\v!reset
- {\resetfields}
- {\setupfields[][][][#1]}% checken
- \else
- \writestatus\m!fields{provide either 1 or 4 arguments}%
- \fi\fi}
-
-\def\resetfields
- {\let\dodosetupfield\normaldodosetupfield}
-
-% \setupfields[\v!reset]
-
-% opties: veld, label, kader, vertikaal/horizontaal
-
-\newif\ifShowFieldLabel
-\newif\ifShowFieldFrame
-\newif\ifVerticalField
-\newif\ifHorizontalField
-
-% way to slow/complicated, we need some simple alternative
-% as well
-
-\def\dohandlefield[#1][#2][#3][#4][#5]%
- {\presetlocalframed[\??fd]%
- \processallactionsinset
- [#2]
- [ \v!reset=>\ShowFieldLabelfalse\ShowFieldFramefalse\HorizontalFieldfalse\VerticalFieldfalse,
- \v!label=>\ShowFieldLabeltrue,
- \v!frame=>\ShowFieldFrametrue,
- \v!horizontal=>\HorizontalFieldtrue,
- \v!vertical=>\VerticalFieldtrue]%
- \ifVerticalField
- \getparameters[\??fd][\c!distance=\zeropoint,\c!inbetween=\vskip\@@localoffset,\c!align=\v!right,\c!width=20em]%
- \else\ifHorizontalField
- \getparameters[\??fd][\c!distance=\@@localoffset,\c!inbetween=,\c!align=\c!left,\c!height=10ex]%
- \else
- \getparameters[\??fd][\c!distance=\zeropoint,\c!inbetween=,\c!align=\c!left]%
- \fi\fi
- \getparameters[\??fd][\c!n=,\c!before=,\c!after=\vss,\c!style=,\c!color=,#3]%
- \ifShowFieldFrame
- \localframed[\??fd][\c!strut=\v!no,\c!align=]\bgroup
- \else
- \vbox\bgroup
- \fi
- \dontcomplain
- \ifShowFieldLabel
- \setbox0\hbox
- {\reshapeframeboxtrue % else wrong dimensions
- \framed
- [\c!style=,\c!color=,\c!align=\c!right,#4]
- {\currentfieldlabel}}%
- \fi
- \setbox2\hbox
- {\reshapeframeboxtrue % else wrong dimensions
- \ifVerticalField
- \setupframed[\c!height=6ex,\c!width=\hsize]%
- \else\ifHorizontalField
- \setupframed[\c!height=\vsize,\c!width=20em]%
- \else
- \setupframed[\c!height=2cm,\c!width=2cm]%
- \fi\fi
- \framed
- [\c!align=\v!right,\c!strut=\v!no,#5]
- {\getparameters
- [\??fd]
- [\c!color=,\c!style=,\c!align=\v!right,\c!option=,
- \c!clickin=,\c!clickout=,\c!regionin=,\c!regionout=,
- \c!afterkey=,\c!format=,\c!validate=,\c!calculate=,
- \c!focusin=,\c!focusout=,
- \c!fieldoffset=-\framedoffset,\c!fieldbackgroundcolor=,
- \c!fieldframecolor=,\c!fieldlayer=\@@iafieldlayer,#5]%
- \scratchdimen\framedwidth \edef\@@fdwidth {\the\scratchdimen}%
- \scratchdimen\framedheight\edef\@@fdheight{\the\scratchdimen}%
- \vfill
- \hbox{\lower\@@fdfieldoffset\hbox{\typesetfield}}
- \vss}}%
- \ifShowFieldLabel
- \ifVerticalField
- \vbox
- {\copy0
- \@@fdinbetween
- \copy2}%
- \else
- \hbox
- {\vbox \ifdim\ht2>\ht0 to \ht2 \fi
- {\@@fdbefore
- \copy0
- \@@fdafter}%
- \hskip\@@fddistance
- \vbox \ifdim\ht0>\ht2 to \ht0 \fi
- {\@@fdbefore
- \box2
- \@@fdafter}}%
- \fi
- \else
- \box2
- \fi
- \egroup}
-
-\chardef\fitfieldmode\plusone % 3 = best
-
-\def\dohandlefitfield[#1][#2][#3][#4][#5]% alleen check
- {\presetlocalframed[\??fd]%
- \localframed
- [\??fd]
- [\c!n=1024, % beware: weblink plug in truncates
- \c!strut=\v!no,\c!color=,\c!style=,\c!option=,
- \c!clickin=,\c!clickout=,\c!regionin=,\c!regionout=,
- \c!focusin=,\c!focusout=,
- \c!afterkey=,\c!format=,\c!validate=,\c!calculate=,
- \c!fieldoffset=\zeropoint,\c!fieldbackgroundcolor=,
- \c!fieldframecolor=,\c!fieldlayer=\@@iafieldlayer,#5,\c!align=]
- {\edef\defaultfield{\ctxlua{backends.codeinjections.getdefaultfieldvalue("#1")}}%
- % \dopresetsymbol\defaultfield
- \setbox\scratchbox\hbox{\symbol[\defaultfield]}%
- \edef\@@fdwidth {\the\wd\scratchbox}%
- \ifcase\fitfieldmode
- \edef\@@fdheight{\the\ht\scratchbox}%
- \typesetfield
- \or % 1 = ignore depth (original, assumed no depth, actually a bug)
- \edef\@@fdheight{\the\ht\scratchbox}%
- \vbox to \ht\scratchbox{\vfill\hbox to \wd\scratchbox{\typesetfield\hfill}\vss}%
- \or % 2 = add depth to height, but no depth in result
- \edef\@@fdheight{\the\htdp\scratchbox}%
- \vbox to \ht\scratchbox{\vfill\hbox to \wd\scratchbox{\typesetfield\hfill}\vss}%
- \or % 3 = add depth to height, and apply depth to result
- \edef\@@fdheight{\the\htdp\scratchbox}%
- \hbox to \wd\scratchbox{\lower\dp\scratchbox\hbox{\typesetfield}\hfill}%
- \fi}}
-
-%D Common stuff
-
-\newcount\nofsystemfields
-
-\def\nextsystemfield
- {\global\advance\nofsystemfields\plusone
- \def\currentsystemfield{sys::\number\nofsystemfields}}
-
-%D An example:
-
-\def\fillinfield
- {\dosingleempty\dofillinfield}
-
-\def\dofillinfield[#1]#2%
- {\dontleavehmode
- \hbox
- {\forgetall
- \setupfields[\v!reset]%
- \nextsystemfield
- \useJSscripts[ans]%
- \doifelsenothing{#1}
- {\def\therightanswer{#2}}
- {\def\therightanswer{#1}}%
- \setbox0\hbox{#2}%
- \setbox2\hbox{\therightanswer}%
- \dimen0=\ifdim\wd0>\wd2 \wd0 \else \wd2 \fi
- \advance\dimen0 .2em
- \definefield
- [\currentsystemfield][line][systemfield]%
- \setupfield
- [systemfield]
- [\c!n=1024, % beware: weblink plugin truncates
- \c!location=\v!low,\c!strut=\v!yes,\c!fieldoffset=\zeropoint,
- \c!height=1.2\openlineheight,\c!width=\dimen0,\c!offset=\v!overlay,
- \c!style=,\c!align=\v!middle,\c!frame=\v!off,
- \c!color=red,\c!fieldbackgroundcolor=\s!white,\c!fieldframecolor=blue,
- \c!validate=JS(Check_Answer{\currentsystemfield,\therightanswer})]%
- \switchtobodyfont
- [\c!small]%
- \hbox to \wd0
- {\copy0\hskip-\wd0\hss\field[\currentsystemfield]\hss}}}
-
-%D and another one:
-
-\def\tooltip
- {\dosingleempty\dotooltip}
-
-\def\dotooltip[#1]#2#3%
- {\dontleavehmode
- \begingroup
- \setupfields[\v!reset]%
- \useJSscripts[fld]%
- \setbox0\hbox
- {\dontcomplain
- \nextsystemfield
- \setbox0\hbox{#2}%
- \definesymbol
- [\currentsystemfield:txt]
- [{\inframed[\c!frame=\v!off,\c!background=\v!screen]{#3}}]%
- \setbox2\hbox{\symbol[\currentsystemfield:txt]}%
- \definefield
- [\currentsystemfield:txt][check]
- [dummy][\currentsystemfield:txt][\currentsystemfield:txt]%
- \setupfield
- [dummy]
- [\c!frame=\v!off,
- \c!regionout=JS(Hide_Field{\currentsystemfield:txt}),
- \c!option=\v!hidden]%
- \hbox to \zeropoint
- {\dimen0\wd2\advance\dimen0 -\wd0
- \doifelse{#1}\v!left
- {\hskip-\dimen0}
- {\doif{#1}\v!middle
- {\hskip-.5\dimen0}}%
- \lower\openlineheight\hbox to \zeropoint
- {\fitfield[\currentsystemfield:txt]}}%
- \dimen0=\ifdim\wd0=\zeropoint 3em\else\wd0\fi
- \definesymbol
- [\currentsystemfield:but]
- [{\framed[\c!height=2ex,\c!width=\dimen0,\c!frame=\v!off]{}}]%
- \definefield
- [\currentsystemfield:but][push]
- [dummy][\currentsystemfield:but][\currentsystemfield:but]%
- \setupfield
- [dummy]
- [\c!frame=\v!off,
- \c!option=,
- \c!regionin=JS(Vide_Field{\currentsystemfield:txt}),
- \c!regionout=JS(Hide_Field{\currentsystemfield:txt}),
- \c!fieldlayer=\@@iafieldlayer]%
- \lower2ex\hbox to \zeropoint
- {\fitfield[\currentsystemfield:but]}%
- #2}%
- \ht0\strutht\dp0\strutdp\box0
- \endgroup}
-
-%D And one more:
-
-\unexpanded\def\definefieldstack
- {\dotripleargument\dodefinefieldstack}
-
-\def\dodefinefieldstack[#1][#2][#3]% name, symbols, settings
- {\ifcsname fieldstack:#1\endcsname \else
- \setgvalue{fieldstack:#1}{\dodofieldstack[#1][#2][#3]}%
- \fi}
-
-\def\fieldstack
- {\dotripleempty\dofieldstack}
-
-\def\dofieldstack[#1][#2][#3]%
- {\ifsecondargument
- \dodefinefieldstack[#1][#2][#3]\fieldstack[#1]%
- \else
- \getvalue {fieldstack:#1}%
- \setgvalue{fieldstack:#1}{[#1]}%
- \fi}
-
-\def\dodofieldstack[#1][#2][#3]% start=n, 0 == leeg
- {\dontleavehmode
- \begingroup
- \getparameters[\??fd][\c!start=1,#3]%
- \setupfields[\v!reset]%
- % \definesymbol[\v!empty][]%
- \useJSscripts[fld][FieldStack]%
- \newcounter\stackedfieldnumber
- \def\dododofieldstack##1%
- {\increment\stackedfieldnumber
- \ifnum\stackedfieldnumber=\@@fdstart\relax
- \definefield[#1:\stackedfieldnumber][check][#1][##1,\empty][##1]% \v!empty fails
- \else
- \definefield[#1:\stackedfieldnumber][check][#1][##1,\empty][\empty]% \v!empty fails
- \fi}%
- \processcommalist[#2]\dododofieldstack
- \setupfield[#1][\v!reset]% added
- \setupfield[#1][\c!option=\v!readonly,#3]% #3 swapped
- \newcounter\stackedfieldnumber
- \def\dododofieldstack##1%
- {\doglobal\increment\stackedfieldnumber
- \fitfield[#1:\stackedfieldnumber]\egroup\bgroup}%
- \startoverlay
- \bgroup
- \globalprocesscommalist[#2]\dododofieldstack
- \egroup
- \stopoverlay
- \endgroup}
-
-%D When submitting a form, we need to tell the driver module
-%D that we want \FDF\ or \HTML.
-
-\newtoks\everysetupforms
-
-\unexpanded\def\setupforms{\dosingleempty\dosetupforms}
-
-\def\dosetupforms[#1]
- {\getparameters[\??fr][#1]%
- \the\everysetupforms}
-
-\appendtoks
- \ctxlua{backends.codeinjections.setformsmethod("@@frmethod")}%
-\to \everysetupforms
-
-\setupforms
- [\c!method=XML] % no need for everyjob initialization as this is the default
-
-%D Goodie: (unchecked in \MKIV)
-
-\unexpanded\def\definepushbutton % name optional setup
- {\dodoubleempty\dodefinepushbutton}
-
-\def\dodefinepushbutton[#1][#2]% name setup
- {\dododefinepushbutton{#1}{n}{push}%
- \dododefinepushbutton{#1}{r}{\symbol[psym:#1:n]}%
- \dododefinepushbutton{#1}{d}{\symbol[psym:#1:r]}%
- \setvalue{pushbutton:#1}{\dohandlepushbutton{#1}{#2}}}
-
-\def\dododefinepushbutton#1#2#3%
- {\doifsymboldefinedelse{psym:#1:#2}%
- \donothing{\definesymbol[psym:#1:#2][{#3}]}}
-
-\unexpanded\def\definepushsymbol
- {\dotripleargument\dodefinepushsymbol}
-
-\def\dodefinepushsymbol[#1][#2]% [#3]
- {\definesymbol[psym:#1:#2]}
-
-\def\dopushbutton[#1][#2]%
- {\executeifdefined{pushbutton:#1}\gobbleoneargument{#2}}
-
-\def\pushbutton
- {\dodoubleargument\dopushbutton}
-
-\def\dohandlepushbutton#1#2#3% identifier setup script
- {\bgroup
- \nextsystemfield
- \setupfield
- [pushbutton]
- [\c!frame=\v!overlay,
- \c!offset=\v!overlay,
- \c!clickout=#3,#2]%
- \definefield
- [\currentsystemfield]
- [push]
- [pushbutton]
- [psym:#1:n,psym:#1:r,psym:#1:d]%
- \fitfield
- [\currentsystemfield]%
- \egroup}
-
-% \def\menu@psh
-% {\dodoubleargument\domenu@psh}
-%
-% \def\domenu@psh[#1][#2]#3\\%
-% {\txt\pushbutton[#1][#2]\\}%
-%
-%\appendtoks \let\psh\do@@ampsh \to \everysetmenucommands
-
-\unexpanded\def\menu@psh{\txt\pushbutton}
-
-\appendtoks \let\psh\menu@psh \to \everysetmenucommands
-
-% \definepushbutton [reset]
-%
-% \definepushsymbol [reset] [n] [\uniqueMPgraphic{whatever}{color=green}]
-% \definepushsymbol [reset] [r] [\uniqueMPgraphic{whatever}{color=white}]
-%
-% \startinteractionmenu[bottom]
-% \psh [reset] [JS(reset_something)] \\
-% \stopinteractionmenu
-
-%D Another goodie: (unchecked in \MKIV)
-
-% \definecolor[rollover:n][red]
-% \definecolor[rollover:r][green]
-% \definecolor[rollover:d][blue]
-
-\definepalet
- [rollover]
- [n=red,
- r=green,
- d=blue]
-
-\newcounter\nofrollovers
-\newcounter\nofrollbuttons
-
-\def\dorollbutton[#1][#2]#3[#4]%
- {\dontleavehmode
- \bgroup
- \doglobal\increment\nofrollovers
- \doglobal\increment\nofrollbuttons
- \unexpanded\def\dosetlocationbox[##1]##2[##3]%
- {\getparameters[##1][##3]%
- \definecolor[rollover][rollover:##2]%
- \doifelse{##2}{n}{\doifelsevalue{##1\c!alternative}\v!hidden\phantom\hbox}\hbox
- {\localframed[##1]
- [\c!framecolor=rollover,\c!backgroundcolor=rollover,\c!color=rollover]%
- {\dolocationattributes{##1}\c!style\c!color{#3}}}}%
- \iffirstargument
- \ifsecondargument
- \def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[#2]}%
- \else
- \doifassignmentelse{#1}
- {\def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[#1]}}
- {\def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[]}}%
- \fi
- \else
- \def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[]}%
- \fi
- % todo: share symbols, tricky since different dimensions
- \definesymbol[rsym:\nofrollovers:n][\setlocationbox n]%
- \definesymbol[rsym:\nofrollovers:r][\setlocationbox r]%
- \definesymbol[rsym:\nofrollovers:d][\setlocationbox d]%
- \setupfield
- [rollbutton]
- [\c!frame=\v!off,
- \c!offset=\v!overlay,
- \c!clickout={#4}]%
- \definefield
- [roll:\nofrollbuttons][push][rollbutton]
- [rsym:\nofrollovers:n,%
- rsym:\nofrollovers:r,%
- rsym:\nofrollovers:d]%
- \fitfield[roll:\nofrollbuttons]%
- \egroup}
-
-\unexpanded\def\rollbutton
- {\dodoubleempty\dorollbutton}
-
-\def\menu@rob[#1]#2\\%
- {\txt\rollbutton[\currentmenu]{\ignorespaces#2\unskip}[#1]\\}%
-
-\appendtoks \let\rob\menu@rob \to \everysetmenucommands
-
-% calls:
-% {..} [JS..]
-% [left] {..} [JS..]
-% [a=b] {..} [JS..]
-% [left] [a=b] {..} [JS..]
-%
-% \setupbuttons[offset=0pt,frame=off] % alternative=hidden
-%
-% \rollbutton {Manuals} [JS(Goto_File{show-man.pdf})]
-% \rollbutton {Articles} [JS(Goto_File{show-art.pdf})]
-% \rollbutton {Papers} [JS(Goto_File{show-pap.pdf})]
-% \rollbutton {Presentations} [JS(Goto_File{show-pre.pdf})]
-% \rollbutton {Resources} [JS(Goto_File{show-res.pdf})]
-%
-% \rob [JS(...)] bla bla \\
-
-\unexpanded\def\overlayrollbutton
- {\dodoubleargument\dooverlayrollbutton}
-
-\def\dooverlayrollbutton[#1][#2]%
- {\bgroup
- \nextsystemfield
- \setupfield
- [overlayrollbutton]
- [\c!frame=\v!off,\c!offset=\v!overlay,\c!regionin={#1},\c!regionout={#2}]%
- \definesymbol
- [\currentsystemfield]
- [{\framed[\c!frame=\v!off,\c!width=\overlaywidth,\c!height=\overlayheight]{}}]%
- \definefield
- [\currentsystemfield][push][overlayrollbutton][\currentsystemfield][\currentsystemfield]%
- \fitfield[\currentsystemfield]%
- \egroup}
-
-% \defineoverlay
-% [ShowMenu]
-% [{\overlayrollbutton[VideLayer{navigation}][HideLayer{navigation}]}]
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-fld.mkvi b/Master/texmf-dist/tex/context/base/scrn-fld.mkvi
new file mode 100644
index 00000000000..bf84f15b79f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-fld.mkvi
@@ -0,0 +1,972 @@
+%D \module
+%D [ file=scrn-fld,
+%D version=1997.05.18,
+%D title=\CONTEXT\ Screen Macros,
+%D subtitle=Fields,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% There is still some leftover code from mkii, where we need to
+% be sparse with hash entries and so have a somewhat complex
+% setup mechanism.
+
+% interaction checking
+
+\writestatus{loading}{ConTeXt Screen Macros / Fields}
+
+\unprotect
+
+\registerctxluafile{scrn-fld}{1.001}
+
+%D In \MKII\ we had to cheat a bit with setups in order not to run
+%D out of memory with thousands of fields, which we happen to need at
+%D that time. In \MKIV\ we can store some data at the \LUA\ end and
+%D use a somewhat slower but quite okay inheritance mechanism. For
+%D this reason we now have split definitions, although the old method
+%D is still somewhat supported. The clone and copy commands are
+%D somewhat obsolete for several reasons: we can now use inheritance
+%D and autocloning has been supported for a while. In most cases
+%D cloning (especially with check boxes) the acrobat browser is not
+%D stable enough with respect to appearance handling.
+%D
+%D A fieldcategory is nothing more than a collection of settings.
+%D
+%D \starttyping
+%D \definefieldcategory
+%D [all-email]
+%D [height=1cm,
+%D width=14cm,
+%D style=sstf]
+%D \stoptyping
+%D
+%D A definition can refer to this category:
+%D
+%D \starttyping
+%D \definefieldbody [email] [type=line,category=all-email,default=pragma@wxs.nl]
+%D \stoptyping
+%D
+%D A copy of a field is made as follows:
+%D
+%D \starttyping
+%D \definefieldbody [xmail] [email]
+%D \stoptyping
+%D
+%D You can also be more specific:
+%D
+%D \starttyping
+%D \definefieldbody[buttona][type=check,values={one,two}]
+%D \definefieldbody[buttonb][type=check,values={three,four}]
+%D \definefieldbody[buttonc][buttona][values={three,four}]
+%D \stoptyping
+%D
+%D Actually typesetting a field happens this way:
+%D
+%D \starttyping
+%D \fieldbody [Email]
+%D \fieldbody [Email] [width=6cm]
+%D \fieldbody [eMAIL]
+%D \fieldbody [eMAIL] [width=7cm]
+%D
+%D \fieldbody [buttona]
+%D \fieldbody [buttona]
+%D \fieldbody [buttonb]
+%D \fieldbody [buttonb]
+%D \fieldbody [buttonc]
+%D \fieldbody [buttonc]
+%D \stoptyping
+%D
+%D So, you can call up a field many times and quite some parameters
+%D can be set.
+%D
+%D Because there are persistent problems with acrobat rendering
+%D associated appearance streams (some messy /MK interferende) we
+%D also support native (built-in dingbat) symbols: check, circle,
+%D cross, diamond, square and star.
+%D
+%D \starttyping
+%D \definefield[test1][check]
+%D \definefield[test2][check]
+%D
+%D \fieldbody[test1][width=1em,height=\strutht,depth=\strutdp,symbol=check]
+%D \fieldbody[test1][width=1em,height=\strutht,depth=\strutdp,symbol=circle]
+%D \fieldbody[test2][width=1em,height=\strutht,depth=\strutdp,symbol=square]
+%D \stoptyping
+%D
+%D When submitting a form, we need to tell the driver module
+%D that we want \FDF\ or \HTML.
+
+\newtoks\everysetupforms
+
+\unexpanded\def\setupforms
+ {\dosingleempty\scrn_forms_setup}
+
+\def\scrn_forms_setup[#settings]
+ {\getparameters[\??fr][#settings]%
+ \the\everysetupforms}
+
+\appendtoks
+ \ctxcommand{setformsmethod("@@frmethod")}%
+\to \everysetupforms
+
+\setupforms
+ [\c!method=XML] % no need for everyjob initialization as this is the default
+
+%D We need to initialize symbols in a special way so that they
+%D can be used as rendering for a widget.
+
+\unexpanded\def\presetfieldsymbols[#list]% slow
+ {\processcommacommand[#list]\scrn_symbols_preset}
+
+\def\scrn_symbols_preset#set%
+ {\processcommalist[#set]\scrn_symbols_preset_indeed}%
+
+\def\scrn_symbols_preset_indeed#tag%
+ {\doifobjectfoundelse{SYM}{#tag}
+ {}
+ {\settightobject{SYM}{#tag}\hbox{\symbol[#tag]}%
+ \flushatshipout
+ {\setbox0\hbox{\hskip-\maxdimen\getobject{SYM}{#tag}}%
+ \smashbox0\box0}}}
+
+\let\dosetfieldsymbol\scrn_symbols_preset_indeed
+
+\def\dogetfieldsymbol#tag%
+ {\getobject{SYM}{#tag}}
+
+\unexpanded\def\definedefaultsymbols % used ?
+ {\definesymbol[defaultyes][\mathematics{\times}]%
+ \definesymbol[defaultno ][\mathematics{\cdot }]}
+
+% \def\resetfieldsymbol[#tag]% for experimental usage only
+% {\resetobject{SYM}{#tag}}
+
+%D Now comes the real code:
+
+\installcommandhandler \??fd {fieldcategory} \??fd
+\installcommandhandler \??fb {fieldbody} \??fb
+
+\newbox\scrn_field_box_body
+
+\setupfieldcategory
+ [\c!alternative=\v!normal, % normal clone copy
+ \c!type=\v!line, % line text ...
+ \c!width=5em,
+ \c!height=1em,
+ \c!depth=\zeropoint,
+ \c!align=\v!flushleft,
+ \c!option=\v!printable, % maybe we need a globaloptions and marge them
+ \c!n=1024]
+
+\def\scrn_field_check_category
+ {\edef\currentfieldbodycategory{\fieldbodyparameter\c!category}%
+ \ifx\currentfieldbodycategory\empty
+ \setevalue{\??fb\currentfieldbody\s!parent}{\??fd}%
+ \else
+ \setevalue{\??fb\currentfieldbody\s!parent}{\??fd\currentfieldbodycategory}%
+ \fi}
+
+\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
+ }}%
+ \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
+ }}%
+ \fi
+\to \everydefinefieldbody
+
+\unexpanded\def\fieldbody
+ {\dodoubleempty\scrn_field_body}
+
+\def\scrn_field_body[#tag][#settings]%
+ {\iflocation
+ \hbox\bgroup
+ \edef\currentfieldbody{#tag}%
+ \ifsecondargument
+ \setupfieldbody[#tag][#settings]%
+ \fi
+ \scrn_field_body_typeset
+ \box\scrn_field_box_body
+ \egroup
+ \fi}
+
+\def\scrn_field_body_typeset % todo: fieldsymbol (checkfields /MK mess)
+ {\edef\currentfieldframecolor{\fieldbodyparameter\c!fieldframecolor}%
+ \ifx\currentfieldframecolor\empty\else
+ \getcolorattributevalue\currentfieldframecolor\currentfieldframecolorvalue
+ \fi
+ \edef\currentfieldbackgroundcolor{\fieldbodyparameter\c!fieldbackgroundcolor}%
+ \ifx\currentfieldbackgroundcolor\empty\else
+ \getcolorattributevalue\currentfieldbackgroundcolor\currentfieldbackgroundcolorvalue
+ \fi
+ \dosetfieldbodyattributes\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",
+ style = "\fieldbodyparameter\c!style",
+ 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",
+ })}}
+
+%D The sets are used in grouped calculations.
+%D
+%D [name] [set]
+
+\unexpanded\def\definefieldbodyset
+ {\dodoubleempty\scrn_field_define_set}
+
+\def\scrn_field_define_set[#tag][#list]%
+ {\ctxcommand{definefieldset("#tag","#list")}}
+
+\let\dodefinefieldset\definefieldbodyset % compatibility
+
+%D A few testing macros:
+
+\def\doiffieldbodyelse #tag{\ctxcommand{doiffieldelse("#tag")}}
+\def\doiffieldcategoryelse#tag{\ctxcommand{doiffieldcategoryelse("#tag")}}
+
+\let\doiffieldelse\doiffieldbodyelse % compatibility
+
+%D We still support the traditional method of defining fields:
+%D
+%D \starttyping
+%D \definefield [name] [type] [category] [values] [default]
+%D
+%D \definefield [WWWW] [text] [textsetup] [default text]
+%D \definefield [XXXX] [push] [pushsetup] [yes,no] [yes]
+%D \definefield [XXXX] [check] [checksetup] [yes,no] [yes]
+%D \definefield [YYYY] [combo] [combosetup] [a,b,c,d] [b]
+%D \definefield [ZZZZ] [radio] [radiosetup] [W,X,Y,Z] [Y]
+%D
+%D \definesubfield [W] [subsetup] [p,q]
+%D \definesubfield [X,Y] [subsetup] [p,r]
+%D \definesubfield [Z] [subsetup] [y,z]
+%D
+%D evt \definemainfield ... wanneer geplaatst voor subs gegeven
+%D
+%D \clonefield [XXXX] [XX,YY] [mysetup] [on,off]
+%D \clonefield [Z] [AA,BB] [somesetup] [true,false]
+%D \clonefield [Z] [CC,DD] [anothersetup]
+%D
+%D \copyfield [XXXX] [PP,QQ,RR]
+%D \stoptyping
+%D
+%D Keep in mind that you can also use \type {\definefieldbody} to
+%D achieve the same.
+
+\unexpanded\def\definefield {\doquintupleempty\scrn_field_define_field}
+\unexpanded\def\definesubfield{\dotripleempty \scrn_field_define_subfield}
+\unexpanded\def\clonefield {\doquadrupleempty\scrn_field_clone_field}
+\unexpanded\def\copyfield {\dodoubleempty \scrn_field_copy_field}
+
+\let\definemainfield\definefield % obsolete !
+
+\def\scrn_field_define_field[#tag][#type][#category][#values][#default]%
+ {\definefieldbody[#tag][\c!type=#type,\c!category=#category,\c!values={#values},\c!default={#default}]}
+
+\def\scrn_field_define_subfield[#tag][#category][#values]%
+ {\definefieldbody[#tag][\c!type=sub,\c!category=#category,\c!values={#values}]}
+
+\def\scrn_field_clone_field[#parent][#tag][#category][#values]%
+ {\definefieldbody[#tag][#parent][\c!category=#category,\c!values={#values}]}
+
+\def\scrn_field_copy_field[#parent][#tag]%
+ {\definefieldbody[#tag][#parent]}
+
+%D We hook fields into the (viewer based) layering mechanism
+%D (implemented as properties).
+
+\appendtoks
+ \doifelse{\interactionparameter\c!fieldlayer}\v!auto
+ {\setupfieldcategory[\c!fieldlayer=\currentviewerlayer]}%
+ {\setupfieldcategory[\c!fieldlayer=]}%
+\to \everysetupinteraction
+
+\setupinteraction
+ [\c!fieldlayer=\v!auto] % auto by default
+
+%D The \type {\fieldbody} is the more bare one. One step further goes
+%D \type {\fitfield}, in fact it (now) uses a dedicated instance of
+%D framed: \type {fitfieldframed}.
+%D
+%D \starttyping
+%D \ruledhbox{\fieldbody[Email][height=\strutht,depth=\strutdp,style=normal]}
+%D \ruledhbox{\fitfield[Email][height=\strutht,depth=\strutdp,style=normal]}
+%D \ruledhbox{\fitfield[buttona]}
+%D \stoptyping
+
+\newbox\scrn_field_box_fit_symbol
+
+\defineframed
+ [fitfieldframed]
+ [\c!strut=\v!no,
+ \c!frame=off,
+ \c!offset=\v!overlay,
+ \c!align=]
+
+\unexpanded\def\fitfield
+ {\dodoubleempty\scrn_field_fit}
+
+\def\scrn_field_fit[#tag][#settings]%
+ {\iflocation
+ \begingroup
+ \edef\currentdefaultfieldvalue{\ctxcommand{getdefaultfieldvalue("#tag")}}%
+ \setbox\scrn_field_box_fit_symbol\hbox{\symbol[\currentdefaultfieldvalue]}%
+ \fitfieldframed[#tag]
+ {\fieldbody[#tag]
+ [\c!width=\wd\scrn_field_box_fit_symbol,
+ \c!height=\ht\scrn_field_box_fit_symbol,
+ \c!depth=\dp\scrn_field_box_fit_symbol,
+ #settings]}%
+ \endgroup
+ \fi}
+
+%D The traditional field command does some labeling and
+%D boxing:
+
+\installparameterhandler \??wl {fieldlabelframed}
+\installparameterhandler \??wc {fieldcontentframed}
+\installparameterhandler \??wt {fieldtotalframed}
+
+\installsetuphandler \??wl {fieldlabelframed}
+\installsetuphandler \??wc {fieldcontentframed}
+\installsetuphandler \??wt {fieldtotalframed}
+
+\unexpanded\def\setupfield {\doquintupleempty\scrn_field_setup_field}
+\unexpanded\def\setupfields{\doquadrupleempty\scrn_field_setup_fields}
+
+% \presetlocalframed[\??wl]
+% \presetlocalframed[\??wc]
+% \presetlocalframed[\??wt]
+
+\setupfieldcontentframed
+ [\c!align=\v!flushleft,
+ \c!strut=\v!no,
+ \s!parent=\??ol]
+
+\setupfieldcontentframed % independent
+ [\c!alternative=\v!normal,
+ \c!type=\v!line,
+ \c!width=5em,
+ \c!height=1em,
+ \c!depth=\zeropoint,
+ \c!align=\v!flushleft,
+ \c!option=\v!printable,
+ \c!n=1024]
+
+\setupfieldlabelframed
+ [\c!style=,
+ \c!color=,
+ \c!align=\v!flushleft,
+ \s!parent=\??ol]
+
+\setupfieldtotalframed
+ [%\c!alternative={\v!label,\v!frame,\v!horizontal},
+ \c!strut=\v!no,
+ \c!align=,
+ \s!parent=\??ol]
+
+\def\scrn_field_setup_field[#tag][#variant][#totalsettings][#labelsettings][#fieldsettings]%
+ {\iffifthargument
+ \definefieldcategory[#tag][\s!parent=\??wc#tag,#fieldsettings]
+ \setupfieldtotalframed [#tag][\s!parent=\??wt,\c!alternative={#variant},#totalsettings]%
+ \setupfieldlabelframed [#tag][\s!parent=\??wl,#labelsettings]%
+ \setupfieldcontentframed[#tag][\s!parent=\??wc,#fieldsettings]%
+ \else\iffourthargument
+ \definefieldcategory[#tag][\s!parent=\??wc#tag,#labelsettings]
+ \setupfieldtotalframed [#tag][\s!parent=\??wt,\c!alternative={#variant},#totalsettings]%
+ \setupfieldlabelframed [#tag][\s!parent=\??wl]%
+ \setupfieldcontentframed[#tag][\s!parent=\??wc,#labelsettings]%
+ \else\ifthirdargument
+ \definefieldcategory[#tag][\s!parent=\??wc#tag,#totalsettings]
+ \setupfieldtotalframed [#tag][\s!parent=\??wt,\c!alternative={#variant}]%
+ \setupfieldlabelframed [#tag][\s!parent=\??wl]%
+ \setupfieldcontentframed[#tag][\s!parent=\??wc,#totalsettings]%
+ \else\ifsecondargument
+ \definefieldcategory[#tag][\s!parent=\??wc#tag,#variant]
+ \setupfieldtotalframed [#tag][\s!parent=\??wt]%
+ \setupfieldlabelframed [#tag][\s!parent=\??wl]%
+ \setupfieldcontentframed[#tag][\s!parent=\??wc,#variant]%
+ \fi\fi\fi\fi}
+
+\def\scrn_field_setup_fields[#variant][#totalsettings][#labelsettings][#fieldsettings]
+ {\iffourthargument
+ \setupfieldtotalframed [\c!alternative={#variant},#totalsettings]%
+ \setupfieldlabelframed [#labelsettings]%
+ \setupfieldcontentframed[#fieldsettings]%
+ \else\ifthirdargument
+ \setupfieldtotalframed [#variant]%
+ \setupfieldlabelframed [#totalsettings]%
+ \setupfieldcontentframed[#labelsettings]%
+ \else\ifsecondargument
+ \setupfieldtotalframed [#variant]%
+ \setupfieldcontentframed[#totalsettings]%
+ \else
+ \setupfieldtotalframed [#variant]%
+ \fi\fi\fi}
+
+% just to get the chain right for no category:
+
+\definefieldcategory [][\s!parent=\??wc]
+\setupfieldtotalframed [][\s!parent=\??wt]
+\setupfieldlabelframed [][\s!parent=\??wl]
+\setupfieldcontentframed[][\s!parent=\??wc]
+
+% no longer supported:
+
+\let\resetfields\relax
+
+\def\scrn_field_load_scripts{\useJSscripts[fld]\globallet\scrn_field_load_scripts\relax}
+
+\newconditional\fieldlabelshown
+\newconditional\fieldframeshown
+\newconditional\fieldisvertical
+\newconditional\fieldishorizontal
+
+\unexpanded\def\field
+ {\dodoubleempty\scrn_field_direct}
+
+\def\scrn_field_direct[#tag][#label]%
+ {\iflocation
+ \dontleavehmode
+ \begingroup
+ \scrn_field_load_scripts
+ \edef\currentfieldbody {#tag}%
+ \edef\currentfieldlabel {#label}%
+ \edef\currentfieldcategory{\ctxcommand{getfieldcategory("#tag")}}%
+ \ifx\currentfieldlabel\empty
+ \let\currentfieldlabel\currentfieldbody
+ \fi
+ \ifx\currentfieldcategory\empty
+ \setupfieldtotalframed [\currentfieldbody][\s!parent=\??wt]%
+ \setupfieldlabelframed [\currentfieldbody][\s!parent=\??wl]%
+ \setupfieldcontentframed[\currentfieldbody][\s!parent=\??wc]%
+ \definefieldcategory [\currentfieldbody]%
+ \setupfieldbody [\currentfieldbody][\c!category=\currentfieldbody]%
+ \let\currentfieldcategory\currentfieldbody
+ \fi
+ \let\currentfieldtotalframed \currentfieldcategory
+ \let\currentfieldlabelframed \currentfieldcategory
+ \let\currentfieldcontentframed\currentfieldcategory
+ \scrn_field_analyze_setups
+ \ifconditional\fieldframeshown
+ \localframed[\??wt\currentfieldcategory]\bgroup
+ \else
+ \vbox\bgroup
+ \fi
+ \dontcomplain
+ \ifconditional\fieldlabelshown
+ \scrn_field_set_label_box
+ \fi
+ \scrn_field_set_content_box
+ \ifconditional\fieldlabelshown
+ \ifconditional\fieldisvertical
+ \scrn_field_flush_vertical
+ \else
+ \scrn_field_flush_horizontal
+ \fi
+ \else
+ \scrn_field_flush_content
+ \fi
+ \egroup
+ \endgroup
+ \fi}
+
+% opties: veld, label, kader, vertikaal/horizontaal
+
+\newbox\scrn_field_box_label
+\newbox\scrn_field_box_content
+
+% lower framedoffset
+
+\def\scrn_field_set_label_box
+ {\setbox\scrn_field_box_label\hbox
+ {\reshapeframeboxtrue % else wrong dimensions % still needed?
+ \localframed
+ [\??wl\currentfieldcategory]
+ {\currentfieldlabel}}}
+
+% \c!fieldoffset=-\framedoffset,\c!fieldbackgroundcolor=,
+% \hbox{\lower\@@fdfieldoffset\hbox{\typesetfield}}
+
+\def\scrn_field_set_content_box
+ {\setbox\scrn_field_box_content\hbox
+ {\reshapeframeboxtrue % else wrong dimensions (to be checked)
+ \ifconditional\fieldisvertical
+ \setupfieldcontentframed[\c!height=6ex,\c!width=\hsize]%
+ \else\ifconditional\fieldishorizontal
+ \setupfieldcontentframed[\c!height=\vsize,\c!width=20em]%
+ \else
+ \setupfieldcontentframed[\c!height=2cm,\c!width=2cm]%
+ \fi\fi
+ \localframed % lower framedoffset
+ [\??wc\currentfieldcategory]
+ {\fieldbody
+ [\currentfieldbody]
+ [\c!width=\framedwidth,\c!height=\framedheight]}}}
+
+\def\scrn_field_flush_vertical
+ {\vbox
+ {\copy\scrn_field_box_label
+ \fieldtotalframedparameter\c!inbetween
+ \copy\scrn_field_box_content}}
+
+\def\scrn_field_flush_horizontal
+ {\hbox
+ {\vbox \ifdim\ht\scrn_field_box_content>\ht\scrn_field_box_label to \ht\scrn_field_box_content \fi
+ {\fieldtotalframedparameter\c!before
+ \copy\scrn_field_box_label
+ \fieldtotalframedparameter\c!after}%
+ \hskip\fieldtotalframedparameter\c!distance
+ \vbox \ifdim\ht\scrn_field_box_label>\ht\scrn_field_box_content to \ht\scrn_field_box_label \fi
+ {\fieldtotalframedparameter\c!before
+ \box\scrn_field_box_content
+ \fieldtotalframedparameter\c!after}}}
+
+\def\scrn_field_flush_content
+ {\box\scrn_field_box_content}
+
+\def\scrn_field_analyze_setups
+ {\setfalse\fieldlabelshown
+ \setfalse\fieldframeshown
+ \setfalse\fieldishorizontal
+ \setfalse\fieldisvertical
+ \normalexpanded{\processallactionsinset[\fieldtotalframedparameter\c!alternative]}
+ [ \v!reset=>\setfalse\fieldlabelshown
+ \setfalse\fieldframeshown
+ \setfalse\fieldishorizontal
+ \setfalse\fieldisvertical,
+ \v!label=>\settrue\fieldlabelshown,
+ \v!frame=>\settrue\fieldframeshown,
+ \v!horizontal=>\settrue\fieldishorizontal,
+ \v!vertical=>\settrue\fieldisvertical]%
+ \ifconditional\fieldisvertical
+ \setupfieldtotalframed[\c!distance=\zeropoint,\c!inbetween=\vskip\@@localoffset,\c!align=\v!right,\c!width=20em]%
+ \else\ifconditional\fieldishorizontal
+ \setupfieldtotalframed[\c!distance=\@@localoffset,\c!inbetween=,\c!align=\c!left,\c!height=10ex]%
+ \else
+ \setupfieldtotalframed[\c!distance=\zeropoint,\c!inbetween=,\c!align=\c!left]%
+ \fi\fi
+ \setupfieldtotalframed[\c!n=,\c!before=,\c!after=\vss,\c!style=,\c!color=]}
+
+%D Common stuff (obsolete)
+
+\newcount\scrn_field_system_n
+
+\def\nextsystemfield
+ {\global\advance\scrn_field_system_n\plusone
+ \def\currentsystemfield{sys::\number\scrn_field_system_n}}
+
+%D \CONTEXT\ had tooltips right from the moment that it
+%D supported fields. Due to the at that moment somewhat
+%D limited \PDF\ specification, they were implemented
+%D using \JAVASCRIPT, but nowadays more kind of actions
+%D are supported, so we can do without. The \MKIV\ version
+%D also supports definition of tooltips and configuration.
+%D
+%D \starttyping
+%D before \tooltip[right]{inbetween}{a very nice tip} after\par
+%D before \tooltip[align=normal]{inbetween}{a very\\nice tip} after\par
+%D before \tooltip[middle]{inbetween}{a very nice tip} after\par
+%D before \tooltip[left]{inbetween}{a very nice tip} after\par
+%D \stoptyping
+
+\newbox \scrn_tooltip_box_anchor
+\newbox \scrn_tooltip_box_text
+\newcount\scrn_tooltip_n
+
+\installcommandhandler \??wh {tooltip} \??wh
+
+\setuptooltip
+ [\c!location=\v!right,
+ \c!frame=\v!off,
+ \c!offset=.1ex,
+ \c!background=\v!color,
+ \c!backgroundcolor=gray]
+
+\presetlocalframed[\??wh]
+
+\appendtoks
+ \setuevalue\currenttooltip{\scrn_tooltip_direct{\currenttooltip}}%
+\to \everydefinetooltip
+
+\unexpanded\def\scrn_tooltip_direct#tag%
+ {\def\currenttooltip{#tag}%
+ \doifelselocation
+ {\dosingleempty\scrn_tooltip_indeed}
+ {\dosingleempty\scrn_tooltip_ignore}}
+
+\def\scrn_tooltip_ignore[#settings]#anchortext#tiptext%
+ {#anchortext}
+
+\def\scrn_tooltip_indeed[#settings]#anchortext#tiptext% a more modern aproach (push buttons)
+ {\dontleavehmode \hbox \bgroup
+ \dontcomplain
+ \global\advance\scrn_tooltip_n\plusone
+ \edef\currenttooltipname{tooltip:\number\scrn_tooltip_n}%
+ \setbox\scrn_tooltip_box_anchor\hbox
+ {\strut#anchortext}%
+ \doifassignmentelse{#settings}
+ {\setuptooltip[\currenttooltip][#settings]}%
+ {\setuptooltip[\currenttooltip][\c!location=#settings]}%
+ \setbox\scrn_tooltip_box_text\hbox
+ {\localframed[\??wh\currenttooltip][\c!location=]{#tiptext}}%
+ \definesymbol
+ [\currenttooltipname:txt]
+ [\copy\scrn_tooltip_box_text]%
+ \definefieldbody
+ [\currenttooltipname:txt]
+ [\c!type=push,
+ \c!width=\wd\scrn_tooltip_box_text,
+ \c!height=\ht\scrn_tooltip_box_text,
+ \c!depth=\dp\scrn_tooltip_box_text,
+ \c!option=\v!hidden,
+ \c!values=\currenttooltipname:txt]%
+ \setbox\scrn_tooltip_box_text\hbox
+ {\fieldbody[\currenttooltipname:txt]}%
+ \setbox\scrn_tooltip_box_text\hbox
+ {\strut\lower\dimexpr.25ex+\ht\scrn_tooltip_box_text\relax\box\scrn_tooltip_box_text}%
+ \edef\currenttooltiplocation{\tooltipparameter\c!location}%
+ \ifx\currenttooltiplocation\v!left
+ \hsmashed{\hskip\wd\scrn_tooltip_box_anchor\llap{\box\scrn_tooltip_box_text}}%
+ \else\ifx\currenttooltiplocation\v!middle
+ \hsmashed to \wd\scrn_tooltip_box_anchor{\hss\box\scrn_tooltip_box_text\hss}%
+ \else
+ \hsmashed{\box\scrn_tooltip_box_text}%
+ \fi\fi
+ \definesymbol
+ [\currenttooltipname:but]
+ [\hphantom{\copy\scrn_tooltip_box_anchor}]%
+ \definefieldbody
+ [\currenttooltipname:but]
+ [\c!type=push,
+ \c!regionin=action(show{\currenttooltipname:txt}),
+ \c!regionout=action(hide{\currenttooltipname:txt}),
+ \c!width=\wd\scrn_tooltip_box_anchor,
+ \c!height=\ht\scrn_tooltip_box_anchor,
+ \c!depth=\dp\scrn_tooltip_box_anchor]%
+ \hsmashed{\fieldbody[\currenttooltipname:but]}%
+ \egroup
+ #anchortext}% when hyphenated the text wil stick out ... such are fields and we cannot use a link here
+
+\definetooltip[tooltip]
+
+%D From messages on the mailing list we can conclude that
+%D fieldstacks are used so we keep them in the core:
+%D
+%D \starttyping
+%D \definesymbol[one] [one]
+%D \definesymbol[two] [two]
+%D \definesymbol[three][three]
+%D
+%D \definefieldstack[mine][one,two,three]
+%D \fieldstack[mine]
+%D \fieldstack[mine]
+%D
+%D \goto{walk field}[Walk{mine}]
+%D \stoptyping
+
+\unexpanded\def\definefieldstack
+ {\dotripleargument\scrn_fieldstack_define}
+
+\def\scrn_fieldstack_define[#tag][#symbols][#settings]%
+ {\ifcsname scrn_fieldstack:#tag\endcsname \else
+ \setgvalue{scrn_fieldstack:#tag}{\scrn_fieldstack_construct[#tag][#symbols][#settings]}%
+ \fi}
+
+\unexpanded\def\fieldstack
+ {\dotripleempty\scrn_fieldstack_direct}
+
+\def\scrn_fieldstack_direct[#tag][#symbols][#settings]%
+ {\ifsecondargument
+ \scrn_fieldstack_define[#tag][#symbols][#settings]%
+ \fi
+ \getvalue{scrn_fieldstack:#tag}}
+
+\newbox\scrn_fieldstack_box
+
+\def\scrn_fieldstack_add#tag#settings#symbol%
+ {\advance\scratchcounter\plusone
+ \edef\currentfieldstackname{#tag:\number\scratchcounter}%
+ \ifnum\scratchcounter=\@@fdstart\relax
+ \definefieldbody[\currentfieldstackname][\c!type=check,\c!values={#symbol,\empty},\c!default={#symbol}]%
+ \else
+ \definefieldbody[\currentfieldstackname][\c!type=check,\c!values={#symbol,\empty},\c!default=]%
+ \fi
+ \setbox\scrn_fieldstack_box\hbox{\symbol[#symbol]}%
+ \setcollector
+ [fieldstack]
+ {\fieldbody
+ [\currentfieldstackname]
+ [\c!option=\v!readonly,
+ \c!width=\wd\scrn_fieldstack_box,
+ \c!height=\ht\scrn_fieldstack_box,
+ \c!depth=\dp\scrn_fieldstack_box,
+ #settings]}}
+
+\def\scrn_fieldstack_construct[#tag][#symbols][#settings]% start=n, 0 == leeg
+ {\iflocation
+ \dontleavehmode
+ \begingroup
+ \getparameters[\??fd][\c!start=1,#settings]%
+ \scrn_field_load_scripts
+ \definecollector
+ [fieldstack]%
+ [\c!corner=\v!middle,
+ \c!location=\v!middle]%
+ \scratchcounter\zerocount
+ \processcommalist[#symbols]{\scrn_fieldstack_add{#tag}{#settings}}%
+ \flushcollector[fieldstack]%
+ \endgroup
+ \fi}
+
+%D Another goodie. Two actions can be hookes into an overlay.
+%D
+%D \starttyping
+%D \defineviewerlayer[test]
+%D
+%D \startviewerlayer[test]Hide Me\stopviewerlayer
+%D
+%D \defineoverlay
+%D [WithTest]
+%D [{\overlayrollbutton[HideLayer{test}][VideLayer{test}]}]
+%D
+%D \framed[background=WithTest]{toggle}
+%D \stoptyping
+
+\newcount\scrn_rollbutton_n
+
+\unexpanded\def\overlayrollbutton
+ {\dodoubleargument\scrn_rollbutton_overlay}
+
+\def\scrn_rollbutton_overlay[#regionin][#regionout]%
+ {\iflocation
+ \bgroup
+ \global\advance\scrn_rollbutton_n\plusone
+ \definesymbol
+ [rollbutton:\number\scrn_rollbutton_n]
+ [{\framed[\c!frame=\v!off,\c!width=\overlaywidth,\c!height=\overlayheight]{}}]%
+ \definefieldbody
+ [rollbutton:\number\scrn_rollbutton_n]
+ [\c!type=push,
+ \c!regionin={#regionin},
+ \c!regionout={#regionout},
+ \c!values=\currentsystemfield,
+ \c!default=\currentsystemfield]%
+ \fitfield[\currentsystemfield]%
+ \egroup
+ \fi}
+
+\protect \endinput
+
+%D I will redo these when I need them.
+
+% \definepushbutton [reset]
+%
+% \definepushsymbol [reset] [n] [\uniqueMPgraphic{whatever}{color=green}]
+% \definepushsymbol [reset] [r] [\uniqueMPgraphic{whatever}{color=white}]
+%
+% \startinteractionmenu[bottom]
+% \psh [reset] [JS(reset_something)] \\
+% \stopinteractionmenu
+
+\newcount\scrn_pushbutton_n
+
+\unexpanded\def\definepushbutton % name optional setup
+ {\dodoubleempty\scrn_pushbutton_define}
+
+\def\scrn_pushbutton_define[#tag][#settings]%
+ {\scrn_pushbutton_define_variant{#tag}{n}{push}%
+ \scrn_pushbutton_define_variant{#tag}{r}{\symbol[pushsymbol:#tag:n]}%
+ \scrn_pushbutton_define_variant{#tag}{d}{\symbol[pushsymbol:#tag:r]}%
+ \setvalue{pushbutton:#tag}{\scrn_pushbutton_handle{#tag}{#settings}}}
+
+\def\scrn_pushbutton_define_variant#tag#variant#content%
+ {\doifsymboldefinedelse{pushsymbol:#tag:#variant}
+ \donothing
+ {\definesymbol[pushsymbol:#tag:#variant][{#content}]}}
+
+\def\scrn_pushbutton_handle#tag#settings#reference%
+ {\bgroup
+ \global\advance\scrn_pushbutton_n\plusone
+ \setupfield
+ [pushbutton]
+ [\c!frame=\v!overlay,
+ \c!offset=\v!overlay,
+ \c!clickout={#reference},
+ #settings]%
+ \definefield
+ [pushbutton:\number\scrn_pushbutton_n]%
+ [push]
+ [pushbutton]
+ [pushsymbol:#tag:n,pushsymbol:#tag:r,pushsymbol:#tag:d]%
+ \fitfield
+ [pushbutton:\number\scrn_pushbutton_n]%
+ \egroup}
+
+\unexpanded\def\definepushsymbol
+ {\dotripleargument\scrn_pushsymbol_define}
+
+\def\scrn_pushsymbol_define[#tag][#variant]% [#reference]
+ {\definesymbol[pushsymbol:#tag:#variant]}
+
+\def\pushbutton
+ {\dodoubleargument\scrn_pushbutton_direct}
+
+\def\scrn_pushbutton_direct[#tag][#variant]%
+ {\executeifdefined{pushbutton:#tag}\gobbleoneargument{#variant}}
+
+%D We plug into the menu system
+
+\unexpanded\def\scrn_menu_psh_start[#reference]#text\stoppsh
+ {\starttxt\pushbutton[\currentmenu][#reference]\stoptxt}
+
+\unexpanded\def\scrn_menu_psh_direct[#reference]#text\\
+ {\scrn_menu_psh_start[#reference]\stoprob}
+
+\appendtoks
+ \let\startpsh\scrn_menu_psh_start
+ \let\stoppsh \relax
+ \let\psh \scrn_menu_psh_direct
+\everysetmenucommands
+
+%D Another goodie: (unchecked in \MKIV)
+
+% calls:
+% {..} [JS..]
+% [left] {..} [JS..]
+% [a=b] {..} [JS..]
+% [left] [a=b] {..} [JS..]
+%
+% \setupbuttons[offset=0pt,frame=off] % alternative=hidden
+%
+% \rollbutton {Manuals} [JS(Goto_File{show-man.pdf})]
+% \rollbutton {Articles} [JS(Goto_File{show-art.pdf})]
+% \rollbutton {Papers} [JS(Goto_File{show-pap.pdf})]
+% \rollbutton {Presentations} [JS(Goto_File{show-pre.pdf})]
+% \rollbutton {Resources} [JS(Goto_File{show-res.pdf})]
+%
+% \rob [JS(...)] bla bla \\
+
+% \definecolor[rollover:n][red]
+% \definecolor[rollover:r][green]
+% \definecolor[rollover:d][blue]
+
+\definepalet
+ [rollover]
+ [n=red,
+ r=green,
+ d=blue]
+
+\newcount\scrn_rollbutton_n_button
+\newcount\scrn_rollbutton_n_symbol
+
+\unexpanded\def\rollbutton
+ {\dodoubleempty\scrn_rollbutton}
+
+\def\scrn_rollbutton[#tag][#settings]#text[#reference]%
+ {\dontleavehmode
+ \bgroup
+ \doglobal\advance\scrn_rollbutton_n_button
+ \doglobal\advance\scrn_rollbutton_n_symbol
+ \iffirstargument
+ \ifsecondargument
+ \getparameters[\??am#tag][#settings]%
+ \def\scrn_rollbutton_symbol{\scrn_rollbutton_symbol_indeed{\??am#tag}{#text}}%
+ \else
+ \doifassignmentelse{#tag}
+ {\getparameters[\??bt][#tag]%
+ \def\scrn_rollbutton_symbol{\scrn_rollbutton_symbol_indeed{\??bt}{#text}}}
+ {\def\scrn_rollbutton_symbol{\scrn_rollbutton_symbol_indeed{\??am#tag}{#text}}}%
+ \fi
+ \else
+ \def\scrn_rollbutton_symbol{\set_location_box_indeed_indeed{\??bt}{#text}}%
+ \fi
+ % todo: share symbols, tricky since different dimensions
+ \definesymbol[rollsymbol:\number\scrn_rollbutton_n_symbol:n][\scrn_rollbutton_symbol{n}]%
+ \definesymbol[rollsymbol:\number\scrn_rollbutton_n_symbol:r][\scrn_rollbutton_symbol{r}]%
+ \definesymbol[rollsymbol:\number\scrn_rollbutton_n_symbol:d][\scrn_rollbutton_symbol{d}]%
+ \setupfield
+ [rollbutton]
+ [\c!frame=\v!off,
+ \c!offset=\v!overlay,
+ \c!clickout={#reference}]%
+ \definefield
+ [rollbutton:\number\scrn_rollbutton_n_button][push][rollbutton]
+ [rollsymbol:\number\scrn_rollbutton_n_symbol:n,%
+ rollsymbol:\number\scrn_rollbutton_n_symbol:r,%
+ rollsymbol:\number\scrn_rollbutton_n_symbol:d]%
+ \fitfield[rollbutton:\number\scrn_rollbutton_n_button]%
+ \egroup}
+
+\unexpanded\def\scrn_rollbutton_symbol_indeed#namespace#text#what%
+ {\definecolor[rollover][rollover:#what]%
+ \doifelse{#what}{n}{\doifelsevalue{#namespace\c!alternative}\v!hidden\phantom\hbox}\hbox
+ {\localframed[#namespace]
+ [\c!framecolor=rollover,\c!backgroundcolor=rollover,\c!color=rollover]%
+ {\dolocationattributes{#namespace}\c!style\c!color{#text}}}}%
+
+%D We plug into the menu system
+
+\unexpanded\def\scrn_menu_rob_start[#reference]#text\stoprob
+ {\starttxt\rollbutton[\currentmenu]{\ignorespaces#text\unskip}[#reference]\stoptxt}
+
+\unexpanded\def\scrn_menu_rob_direct[#reference]#text\\
+ {\scrn_menu_rob_start[#reference]#text\stoprob}
+
+\appendtoks
+ \let\startrob\scrn_menu_rob_start
+ \let\stoprob \relax
+ \let\rob \scrn_menu_rob_direct
+\everysetmenucommands
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-hlp.lua b/Master/texmf-dist/tex/context/base/scrn-hlp.lua
new file mode 100644
index 00000000000..81d68840b15
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-hlp.lua
@@ -0,0 +1,120 @@
+if not modules then modules = { } end modules ['scrn-hlp'] = {
+ version = 1.001,
+ comment = "companion to scrn-hlp.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+
+local help = { }
+interactions.help = help
+
+local a_help = attributes.private("help")
+
+local has_attribute = node.has_attribute
+local copy_nodelist = node.copy_list
+local hpack_nodelist = node.hpack
+
+local register_list = nodes.pool.register
+
+local nodecodes = nodes.nodecodes
+
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+
+local data, references = { }, { }
+
+local helpscript = [[
+ function Hide_All_Help(prefix) {
+ var n = 0
+ while (true) {
+ n += 1 ;
+ v = this.getField(prefix + n) ;
+ if (v) {
+ v.hidden = true ;
+ this.dirty = false ;
+ } else {
+ return ;
+ }
+ }
+ }
+]]
+
+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(tex.box[box])
+ register_list(b)
+ data[number] = b
+ if name and name ~= "" then
+ references[name] = number
+ structures.references.define("",name,format(template,number))
+ end
+end
+
+local function collect(head,used)
+ while head do
+ local id = head.id
+ if id == hlist_code then
+ local a = has_attribute(head,a_help)
+ if a then
+ if not used then
+ used = { a }
+ else
+ used[#used+1] = a
+ end
+ else
+ used = collect(head.list,used)
+ end
+ elseif id == vlist_code then
+ used = collect(head.list,used)
+ end
+ head = head.next
+ end
+ return used
+end
+
+function help.collect(box)
+ if next(data) then
+ return collect(tex.box[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
+ end
+ 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
+
+function commands.helpaction(name)
+ context(template,references[name] or tonumber(name) or 0)
+end
diff --git a/Master/texmf-dist/tex/context/base/scrn-hlp.mkiv b/Master/texmf-dist/tex/context/base/scrn-hlp.mkiv
deleted file mode 100644
index 4eaa340ca26..00000000000
--- a/Master/texmf-dist/tex/context/base/scrn-hlp.mkiv
+++ /dev/null
@@ -1,179 +0,0 @@
-%D \module
-%D [ file=scrn-hlp,
-%D version=1998.10.10,
-%D title=\CONTEXT\ Screen Macros,
-%D subtitle=Help (Experimental),
-%D author={Hans Hagen \& Ton Otten},
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 : dedicated vide/hide voor helps
-
-\writestatus{loading}{ConTeXt Screen Macros / Help popups}
-
-%D This is an experimental and private module, so the interface
-%D and functionality can change. Pieces of code will be moved
-%D to other modules. More features are possible but will be
-%D interfaces later. See m-chart for an application as well
-%D as the second tno-tpd manual (graphic in margin, click
-%D on it, pop up big one, use menu with hides, as well as
-%D background, etc. etc.
-
-\unprotect
-
-\defineframedtext
- [\v!helptext]
-
-\setupframedtexts
- [\v!helptext]
- [\c!width=.75\textwidth,
- \c!align=\v!normal,
- \c!frame=\v!off,
- \c!background=\v!screen]
-
-\newcounter \nofhelpdataentries
-\newconditional \somehelpdatadefined
-
-\let\getpagehelpdata \relax
-\let\synchronizepagehelpdata\relax
-
-\appendtoks \getpagehelpdata \to \beforeeverypage
-\appendtoks \synchronizepagehelpdata \to \aftereverypage
-
-% will be proper state variable
-
-\let\pagehelpdata\empty
-
-\def\dontresetpagedata
- {\let\synchronizepagehelpdataindeed\relax}
-
-\def\resetpagehelpdata
- {\iflocation
- \let\synchronizepagehelpdataindeed\resetpagehelpdata
- \global\let\pagehelpdata\empty
- \resetreference[HideHelp]%
- \fi}
-
-\let\synchronizepagehelpdataindeed\resetpagehelpdata
-
-\resetreference[HideHelp]
-
-\def\getpagehelpdataindeed
- {\iflocation\ifcase\nofhelpdataentries\else
- \dogetpagehelpdataindeed
- \fi\fi}
-
-\def\dogetpagehelpdataindeed
- {\let\pagehelpdata\empty
- \ifconditional\somehelpdatadefined
- \definetwopasslist{hlp:\realfolio}%
- \doloop
- {\gettwopassdata{hlp:\realfolio}%
- \iftwopassdatafound
- \addtocommalist\twopassdata\pagehelpdata
- \else
- \exitloop
- \fi}%
- \fi
- \ifx\pagehelpdata\empty \else
- \useJSscripts[fld]%
- \definereference[HideHelp][JS(Hide_Fields)]% for the moment
- \fi}
-
-\def\setpagehelpdata[#1]%
- {\iflocation\expanded{\dosetpagehelpdata{#1}}\fi}
-
-\def\dosetpagehelpdata#1%
- {\doglobal\increment\nofhelpdataentries
- \global\let\getpagehelpdata\getpagehelpdataindeed
- \global\let\synchronizepagehelpdata\synchronizepagehelpdataindeed
- \savetwopassdata{hlp:\realfolio}{\nofhelpdataentries}{#1}}
-
-\setvalue{\e!start\v!helptext}[#1]%
- {\iflocation
- \global\settrue\somehelpdatadefined
- \setvalue{\e!stop\v!helptext}%
- %{\definesymbol[helpinfo:#1][{\doframedtext[\v!helptext]{\getbuffer[\v!helptext]}}]%
- % \dopresetfieldsymbol{helpinfo:#1}}%
- {\definesymbol[\v!helptext:#1][{\doframedtext[\v!helptext]{\getbuffer[\v!helptext]}}]%
- \dopresetfieldsymbol{\v!helptext:#1}}%
- \else
- \letvalue{\e!stop\v!helptext}\relax
- \fi
- \dostartbuffer[\v!helptext][\e!start\v!helptext][\e!stop\v!helptext]}
-
-\long\def\helptext[#1]#2%
- {\iflocation
- \global\settrue\somehelpdatadefined
- %\definesymbol[helpinfo:#1][{\doframedtext[\v!helptext]{#2}}]%
- %\dopresetfieldsymbol{helpinfo:#1}%
- \definesymbol[\v!helptext:#1][{\doframedtext[\v!helptext]{#2}}]%
- \dopresetfieldsymbol{\v!helptext:#1}%
- \fi}
-
-\let\definehelptext\helptext % for backward compabilities sake
-
-\def\dohelpdata#1%
- {\setbox\scratchbox\hbox
- {\startoverlay
- {\box\scratchbox}
- %{\definemainfield[help:#1][check][helpsetup][helpinfo:#1][helpinfo:#1]%
- {\definemainfield[help:#1][check][helpsetup][\v!helptext:#1][\v!helptext:#1]%
- \fitfield[help:#1]}
- \stopoverlay}}
-
-\def\helpdata
- {\iflocation
- \bgroup
- %\getpagehelpdata
- \ifx\pagehelpdata\empty \else
- \setupfields[\v!reset]%
- \setupfield
- [helpsetup]
- [\c!width=\v!fit,
- \c!height=\v!fit,
- \c!frame=\v!off,
- \c!clickin=JS(Hide_Fields),
- \c!option={\v!readonly,\v!hidden}]%
- \setbox\scratchbox\emptybox
- \processcommacommand[\pagehelpdata]\dohelpdata
- \box\scratchbox
- \fi
- \egroup
- \fi}
-
-\def\helpbutton % also gobble spaces between [][]
- {\dodoubleempty\dohelpbutton}
-
-\def\dohelpbutton
- {\ifsecondargument
- \expandafter\donohelpbutton
- \else
- \expandafter\dodohelpbutton
- \fi}
-
-\def\dodohelpbutton[#1][#2]#3[#4]% #2 is space gobbling dummy
- {\iflocation
- \setpagehelpdata[#4]%
- \useJSscripts[fld]%
- \button[#1]{#3}[JS(Vide_Hide_Fields{help:#4})]%
- \fi}
-
-\def\donohelpbutton[#1][#2]%
- {\dodohelpbutton[#1][]{}[#2]}
-
-\def\doifhelpinfo#1#2%
- {\iflocation
- \doifsymboldefinedelse{helpinfo:#1}{#2}\donothing
- \fi}
-
-\def\doifelsehelpinfo#1#2#3%
- {\iflocation
- \doifsymboldefinedelse{helpinfo:#1}{#2}{#3}%
- \fi}
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-hlp.mkvi b/Master/texmf-dist/tex/context/base/scrn-hlp.mkvi
new file mode 100644
index 00000000000..d9782430056
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-hlp.mkvi
@@ -0,0 +1,162 @@
+%D \module
+%D [ file=scrn-hlp,
+%D version=1998.10.10,
+%D title=\CONTEXT\ Screen Macros,
+%D subtitle=Help (Experimental),
+%D author={Hans Hagen \& Ton Otten},
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Screen Macros / Help popups}
+
+%D As this functionality was in the core and as I don't know
+%D how often it is used, we'll keep it around. However, it is
+%D upgraded and usage has changed a bit. We also use some
+%D \LUA\ magic in order to avoid multiple passes.
+
+\registerctxluafile{scrn-hlp}{1.001}
+
+%D Using help boils down to plugging the placement macro
+%D someplace visible, like:
+%D
+%D \starttyping
+%D \setuptexttexts[\centerbox{\placehelp}]
+%D \stoptyping
+%D
+%D When this is done, the following should work out okay:
+%D
+%D \starttyping
+%D test \helptext{word}{tip top 1 is somewhat longer} test
+%D test \helptext{word}{tip top 2} test
+%D
+%D \starthelptext[oeps]
+%D \input tufte
+%D \stophelptext
+%D
+%D test test \showhelp{some help}[oeps] test
+%D test test \button[location=depth]{\helpsignal{oeps}OEPS}[oeps] test
+%D
+%D test test \button[location=depth]{next}[page(2)] test
+%D
+%D \page
+%D
+%D test \helptext{word}{tip top one} test
+%D test \helptext{word}{tip top two} test
+%D \stoptyping
+%D
+%D Currently you need to use the signal in custom macros but
+%D that might change at some point.
+
+\unprotect
+
+% also status
+
+\newbox \scrn_help_box
+\newcount\scrn_help_n
+
+\definesystemattribute[help][public]
+
+\installcommandhandler \??wp {help} \??wp
+
+\setuphelp
+ [\c!frame=\v!off,
+ \c!align=\v!normal,
+ \c!background=\v!color,
+ \c!backgroundcolor=gray]
+
+\presetlocalframed[\??wp]
+
+\appendtoks
+ \setuevalue \currenthelp {\scrn_help_argument{\currenthelp}}%
+ \setuevalue{\e!start\currenthelp}{\scrn_help_start {\currenthelp}}%
+ \setuevalue{\e!stop \currenthelp}{\scrn_help_stop }%
+\to \everydefinehelp
+
+\unexpanded\def\scrn_help_argument#category%
+ {\def\currenthelp{#category}%
+ \global\advance\scrn_help_n\plusone
+ \edef\currenthelpname{help:\number\scrn_help_n}%
+ \doifelselocation
+ {\dosingleempty\scrn_help_argument_indeed}
+ {\dosingleempty\scrn_help_argument_ignore}}
+
+\def\scrn_help_argument_indeed[#reference]#text#target%
+ {\edef\currenthelpreference{#reference}%
+ \dontleavehmode \hbox \bgroup
+ \dontcomplain
+ \setbox\scrn_help_box\hbox{\strut#text}%
+ \doregisterhelp{#target}%
+ \egroup % can be usernode instead
+ \goto
+ {\helpsignal{\number\scrn_help_n}#target}%
+ [\helpaction{\number\scrn_help_n}]}
+
+\def\scrn_help_argument_ignore[#reference]#text#target%
+ {#target}
+
+\unexpanded\def\scrn_help_start#category%
+ {\def\currenthelp{#category}%
+ \global\advance\scrn_help_n\plusone
+ \edef\currenthelpname{help:\number\scrn_help_n}%
+ \dosingleempty\scrn_help_start_indeed}
+
+\def\scrn_help_start_indeed[#reference]%
+ {\edef\currenthelpreference{#reference}%
+ \dostartbuffer[\currenthelp][\e!start\currenthelp][\e!stop\currenthelp]}
+
+\unexpanded\def\scrn_help_stop
+ {\iflocation
+ \scrn_help_register{\getbuffer[\currenthelp]}%
+ \fi}
+
+\def\scrn_help_register#text%
+ {\setbox\scrn_help_box\hbox
+ {\localframed[\??wp\currenthelp]{#text}}%
+ \definesymbol
+ [\currenthelpname]
+ [\copy\scrn_help_box]%
+ \definefieldbody
+ [\currenthelpname]
+ [\c!type=push,
+ \c!width=\wd\scrn_help_box,
+ \c!height=\ht\scrn_help_box,
+ \c!depth=\dp\scrn_help_box,
+ \c!option=\v!hidden,
+ \c!clickin=action(hide{\currenthelpname}),
+ \c!closepage=action(hide{\currenthelpname}),
+ \c!values=\currenthelpname]%
+ \setbox\scrn_help_box\hbox
+ {\fieldbody[\currenthelpname]}%
+ \ctxcommand{registerhelp(\number\scrn_help_n,"\currenthelpreference",\number\scrn_help_box)}}
+
+\def\doifelsehelp
+ {\ifcase\scrn_help_n
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\placehelp % was \helpdata
+ {\ifinpagebody\ifcase\scrn_help_n\else
+ \ctxcommand{collecthelp(255)}% rather hard coded ... bad
+ \fi\fi}
+
+\def\helpreference#category%
+ {\ctxcommand{helpreference("#category")}}
+
+\def\helpaction#category%
+ {\ctxcommand{helpaction("#category")}}
+
+\unexpanded\def\helpsignal#category%
+ {\hbox attr \helpattribute \helpreference{#category}{}}
+
+\unexpanded\def\showhelp#target[#category]%
+ {\goto{\helpsignal{#category}#target}[#category]}
+
+\definehelp[\v!helptext]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-ini.lua b/Master/texmf-dist/tex/context/base/scrn-ini.lua
new file mode 100644
index 00000000000..2836362dfd4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-ini.lua
@@ -0,0 +1,30 @@
+if not modules then modules = { } end modules ['scrn-int'] = {
+ version = 1.001,
+ comment = "companion to scrn-int.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+interactions = { }
+interactions.general = interactions.general or { }
+local general = interactions.general
+
+local codeinjections = backends.codeinjections
+
+local identitydata = { }
+
+local function setupidentity(specification)
+ for k, v in next, specification do
+ identitydata[k] = v
+ end
+ codeinjections.setupidentity(specification)
+end
+
+function general.getidentity()
+ return identitydata
+end
+
+general.setupidentity = setupidentity
+
+commands.setupidentity = setupidentity
diff --git a/Master/texmf-dist/tex/context/base/scrn-ini.mkvi b/Master/texmf-dist/tex/context/base/scrn-ini.mkvi
new file mode 100644
index 00000000000..860c696c0e8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-ini.mkvi
@@ -0,0 +1,178 @@
+%D \module
+%D [ file=scrn-ini,
+%D version=2011.02.27,
+%D title=\CONTEXT\ Interaction Macros,
+%D subtitle=Initialization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Interaction Macros / Initialization}
+
+\unprotect
+
+\registerctxluafile{scrn-ini}{1.001}
+
+%D There is no interaction at all unless enabled by saying:
+%D
+%D \starttyping
+%D \setupinteraction[state=start]
+%D \stoptyping
+%D
+%D The other settings are:
+%D
+%D \showsetup{setupinteraction}
+
+\installcommandhandler\??ia{interaction}\??ia
+
+\let\currentinteraction\empty
+
+\appendtoks
+ \doifelse{\interactionparameter\c!state}\v!start
+ {\locationtrue \setsystemmode \v!interaction}%
+ {\locationfalse \resetsystemmode\v!interaction}%
+\to \everysetupinteraction
+
+\def\doifelselocation
+ {\iflocation
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\setupinteraction
+ [\c!state=\v!stop]
+
+\appendtoks
+ \setupinteraction % todo: remember info at the lua end (already possible)
+\to \everyjob
+
+% it makes no sense to create an environment as we will seldom have structured
+% interactionso a general start-stop will do
+%
+% \appendtoks
+% \setuevalue \currentinteraction {\scrn_interaction_direct{\currentinteraction}}%
+% \setuevalue{\e!start\currentinteraction}{\scrn_interaction_start {\currentinteraction}}%
+% \setuevalue{\e!stop \currentinteraction}{\scrn_interaction_stop }%
+% \to \everydefineinteraction
+%
+% \unexpanded\def\scrn_interaction_direct#1%
+% {\edef\currentinteraction{#1}}
+%
+% \unexpanded\def\scrn_interaction_start#1%
+% {\pushmacro\currentinteraction
+% \edef\currentinteraction{#1}}
+%
+% \unexpanded\def\scrn_interaction_stop
+% {\popmacro\currentinteraction}
+%
+% \unexpanded\def\setinteraction[#1]%
+% {\def\currentinteraction{#1}}
+%
+% \defineinteraction[\v!interaction]
+
+\unexpanded\def\startinteraction[#1]%
+ {\pushmacro\currentinteraction
+ \edef\currentinteraction{#1}}
+
+\unexpanded\def\stopinteraction
+ {\popmacro\currentinteraction}
+
+\unexpanded\def\setinteraction[#1]%
+ {\def\currentinteraction{#1}}
+
+%D As long as there a natural feeling of what can be considered
+%D hyper active or not, we have to tell users where they can
+%D possibly click. We've already seen a few macros that deal
+%D with this visualization, something we definitely do not let
+%D up to the viewer. One way of telling is using a distinctive
+%D typeface, another way is using color.
+%D
+%D There are two colors involved: one for normal hyperlinks,
+%D and one for those that point to the currentpage, the
+%D contrast color.
+
+\definecolor [interactioncolor] [r=0, g=.6, b=0]
+\definecolor [interactioncontrastcolor] [r=.8, g=0, b=0]
+
+%D The next few macros are responsible for highlighting hyper
+%D links. The first one, \type{\showlocation}, is used in those
+%D situations where the typeface is handled by the calling
+%D macro.
+
+%D When we're dealing with pure page references, contrast
+%D colors are used when we are already at the page mentioned.
+
+\def\setlocationcolor#1% not grouped !
+ {\ifnum\referencepagestate=\plusone
+ \edef\askedcontrastcolor{\csname#1\c!contrastcolor\endcsname}%
+ \ifx\askedcontrastcolor\empty
+ \dosetcolorattribute{#1}\c!color
+ \else
+ \dosetcolorattribute{#1}\c!contrastcolor
+ \fi
+ \else % we could just set and if > 0 set again
+ \dosetcolorattribute{#1}\c!color
+ \fi}
+
+\def\setlocationfont#1%
+ {\dosetfontattribute{#1}\c!style}
+
+\def\setlocationattributes#1%
+ {\ifnum\referencepagestate=\plusone
+ \edef\askedcontrastcolor{\csname#1\c!contrastcolor\endcsname}%
+ \ifx\askedcontrastcolor\empty
+ \dosetcolorattribute{#1}\c!color
+ \else
+ \dosetcolorattribute{#1}\c!contrastcolor
+ \fi
+ \else % we could just set and if > 0 set again
+ \dosetcolorattribute{#1}\c!color
+ \fi
+ \dosetfontattribute{#1}\c!style}
+
+\def\setlocationcolorspec#1% \resolver
+ {\ifnum\referencepagestate=\plusone
+ \edef\askedcontrastcolor{#1\c!contrastcolor}%
+ \ifx\askedcontrastcolor\empty
+ \doactivatecolor{#1\c!color}%
+ \else
+ \doactivatecolor\askedcontrastcolor
+ \fi
+ \else
+ \doactivatecolor{#1\c!color}%
+ \fi}
+
+\setupinteraction
+ [\c!style=\v!bold,
+ \c!color=interactioncolor,
+ \c!contrastcolor=interactioncontrastcolor]
+
+%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,
+ }}}
+
+\appendtoks
+ \scrn_identity_synchronize
+\to \everysetupinteraction
+
+\setupinteraction
+ [\c!title=,
+ \c!subtitle=,
+ \c!author=,
+ \c!keyword=,
+ \c!date=]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-int.lua b/Master/texmf-dist/tex/context/base/scrn-int.lua
deleted file mode 100644
index 7036bbf6a8d..00000000000
--- a/Master/texmf-dist/tex/context/base/scrn-int.lua
+++ /dev/null
@@ -1,111 +0,0 @@
-if not modules then modules = { } end modules ['scrn-int'] = {
- version = 1.001,
- comment = "companion to scrn-int.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local format = string.format
-local texsprint, texcount, ctxcatcodes = tex.sprint, tex.count, tex.ctxcatcodes
-
-interactions = interactions or { }
-
-local attachments = { }
-
-function interactions.registerattachment(specification)
- if specification.label then
- specification.filename = specification.filename or specification.label
- specification.newname = specification.newname or specification.filename
- specification.title = specification.title or specification.filename
- specification.newname = file.addsuffix(specification.newname,file.extname(specification.filename))
- attachments[specification.label] = specification
- return specification
- end
-end
-
-function interactions.attachment(label)
- local at = attachments[label]
- if not at then
- interfaces.showmessage("interactions",6,label)
- return interactions.registerattachment { label = label }
- else
- return at
- end
-end
-
-function interactions.attachmentvar(label,key)
- local at = attachments[label]
- texsprint(ctxcatcodes,at and at[key] or "")
-end
-
-local soundclips = { }
-
-function interactions.registersoundclip(specification)
- if specification.label then
- specification.filename = specification.filename or specification.label
- soundclips[specification.label] = specification
- return specification
- end
-end
-
-function interactions.soundclip(label)
- local sc = soundclips[label]
- if not sc then
- -- todo: message
- return interactions.registersoundclip { label = label }
- else
- return sc
- end
-end
-
-local renderings = { }
-
-function interactions.registerrendering(specification)
- if specification.label then
- renderings[specification.label] = specification
- return specification
- end
-end
-
-function interactions.rendering(label)
- local rn = renderings[label]
- if not rn then
- -- todo: message
- return interactions.registerrendering { label = label }
- else
- return rn
- end
-end
-
-function interactions.renderingvar(label,key)
- local rn = renderings[label]
- texsprint(ctxcatcodes,rn and rn[key] or "")
-end
-
--- linked lists
-
-function interactions.definelinkedlist(name)
- -- no need
-end
-
-function interactions.addlinktolist(name)
- local tobesaved = jobpasses.gettobesaved(name)
- local collected = jobpasses.getcollected(name) 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
- texsprint(ctxcatcodes,format("\\setlinkproperties{%s}{%s}{%s}{%s}{%s}{%s}",currentlink,noflinks,f,p,n,l))
-end
-
-function interactions.enhancelinkoflist(name,n)
- local ll = jobpasses.gettobesaved(name)
- if ll then
- ll[n] = texcount.realpageno
- end
-end
-
diff --git a/Master/texmf-dist/tex/context/base/scrn-int.mkiv b/Master/texmf-dist/tex/context/base/scrn-int.mkiv
deleted file mode 100644
index 11734e0d7e4..00000000000
--- a/Master/texmf-dist/tex/context/base/scrn-int.mkiv
+++ /dev/null
@@ -1,610 +0,0 @@
-%D \module
-%D [ file=scrn-int,
-%D version=1995.01.01,
-%D title=\CONTEXT\ Core Macros,
-%D subtitle=Interaction,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Screen Macros / Interaction}
-
-\registerctxluafile{scrn-int}{1.001}
-
-\unprotect
-
-%D This is an update of \MKII\ code. In the process profiles and versions
-%D were removed as I never used them (although they were kind of cool at
-%D that time).
-
-% a bit complex due to papercomment (see imposition code)
-
-\newtoks\everysetupinteractionscreen
-
-\unexpanded\def\setupinteractionscreen
- {\dosingleempty\dosetupinteractionscreen}
-
-\def\dosetupinteractionscreen[#1]%
- {\getparameters[\??sc][#1]%
- \the\everysetupinteractionscreen}
-
-\def\synchronizepaperdimensionssimple % simple version
- {\bgroup
- \ifx\@@ppleft \empty
- \ifx\@@ppright \empty
- \ifx\@@pptop \empty
- \ifx\@@ppbottom \empty
- \ifx\@@pcstate\v!start
- \locationfalse\fi\else
- \locationfalse\fi\else
- \locationfalse\fi\else
- \locationfalse\fi\else
- \locationfalse\fi
- \iflocation % without screen settings
- \ctxlua{backends.codeinjections.setupcanvas {
- paperwidth = \number\paperwidth,
- paperheight = \number\paperheight
- }}%
- \else
- \ctxlua{backends.codeinjections.setupcanvas {
- paperwidth = \number\printpaperwidth,
- paperheight = \number\printpaperheight
- }}%
- \fi
- \egroup}
-
-\def\synchronizepaperdimensionscomplex % complex version
- {\bgroup
- \edef\@@scwidth {\@@scwidth}%
- \edef\@@scheight{\@@scheight}%
- \ifx\@@scwidth\v!fit
- \!!widtha\leftcombitotal
- \ifdim\backspace>\!!widtha\ifdim\backspace>\zeropoint\relax
- \advance\backspace -\!!widtha
- \fi\fi
- \advance\!!widtha\dimexpr\rightcombitotal+2\dimexpr\@@scbackspace+\@@schoroffset\relax\relax
- \else\ifx\@@scwidth\v!max
- \!!widtha\printpaperwidth
- \else
- \!!widtha\@@scwidth
- \fi\fi
- \ifx\@@scheight\v!fit
- \!!heighta\dimexpr\topheight+\topdistance\relax
- \ifdim\topspace>\!!heighta\ifdim\topspace>\zeropoint\relax
- \advance\topspace -\!!heighta
- \fi\fi
- \advance\!!heighta\dimexpr\makeupheight+\bottomdistance+\bottomheight+2\dimexpr\@@sctopspace+\@@scveroffset\relax\relax
- \else\ifx\@@scheight\v!max
- \!!heighta\printpaperheight
- \else
- \!!heighta\@@scheight
- \fi\fi
- \doif\@@scdelay\v!none{\let\@@scdelay\zerocountervalue}%
- \ifdim\!!widtha>\paperwidth\ifdim\!!widtha>\zeropoint
- \paperwidth\!!widtha
- \fi\fi
- \ifdim\!!heighta>\paperheight\ifdim\!!heighta>\zeropoint
- \paperheight\!!heighta
- \fi\fi
- \ctxlua{backends.codeinjections.setupcanvas {
- mode = "\@@scoption",
- % doublesided = \ifsinglesided false\else\ifdoublesided true\else false\fi\fi,
- singlesided = \ifsinglesided true\else false\fi,
- doublesided = \ifdoublesided true\else false\fi,
- leftoffset = \number\dimexpr\backoffset\relax,
- topoffset = \number\dimexpr\topoffset \relax,
- width = \number\dimexpr\!!widtha \relax,
- height = \number\dimexpr\!!heighta \relax,
- paperwidth = \number\paperwidth,
- paperheight = \number\paperheight
- }}%
- \egroup}
-
-\let\synchronizepaperdimensions \synchronizepaperdimensionscomplex
-
-\appendtoks
- \ifproductionrun
- \doifelse\@@pcstate\v!start
- {\let\synchronizepaperdimensions\synchronizepaperdimensionssimple}
- {\let\synchronizepaperdimensions\synchronizepaperdimensionscomplex}%
- \fi
-\to \everysetupinteractionscreen
-
-\appendtoks \synchronizepaperdimensions \to \everyshipout
-
-%D The next mechanism, linked lists, is quite old and
-%D is \MKIV'd for completeness. I will finish the
-%D confuguration part when I need it.
-
-% todo: a kind of button that gets a tag passed (\??tk)
-
-% \starttext
-% \setupinteraction[state=start]
-% \definelinkedlist[demo]
-% \dorecurse{10}{\linkedlistelement[demo]{link \recurselevel} \page}
-% \stoptext
-
-\def\linkedlistparameter #1{\csname\dolinkedlistparameter{\??lk\currentlinkedlist}#1\endcsname}
-\def\dolinkedlistparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dolinkedlistparentparameter\csname#1\s!parent\endcsname#2\fi}
-\def\dolinkedlistparentparameter#1#2{\ifx#1\relax\s!empty\else\dolinkedlistparameter#1#2\fi}
-
-\unexpanded\def\definelinkedlist{\dodoubleargument\dodefinelinkedlist}
-\unexpanded\def\setuplinkedlist {\dodoubleargument\dosetuplinkedlist }
-\unexpanded\def\setuplinkedlists{\dosingleargument\dosetuplinkedlists}
-
-\def\dodefinelinkedlist[#1][#2]%
- {\ctxlua{interactions.definelinkedlist("#1")}%
- \getparameters[\??lk#1][\s!parent=\??lk,#2]}
-
-\def\dosetuplinkedlist[#1][#2]%
- {\getparameters[\??lk#1][#2]}
-
-\def\dosetuplinkedlists[#1]%
- {\getparameters[\??lk][#1]}
-
-\def\setlinkproperties#1#2#3#4#5#6%
- {\def\currentlink {#1}%
- \def\noflinks {#2}%
- \def\firstlink {#3}%
- \def\previouslink{#4}%
- \def\nextlink {#5}%
- \def\lastlink {#6}}
-
-\def\linkedlistelement[#1]#2% currently no view support
- {\dontleavehmode\hbox\bgroup
- #2%
- \iflocation
- \edef\currentlinkedlist{#1}%
- \ifcsname\??lk\currentlinkedlist\s!parent\endcsname
- \hskip\linkedlistparameter\c!distance
- \ctxlua{interactions.addlinktolist("\currentlinkedlist")}%
- \expanded{\ctxlatelua{interactions.enhancelinkoflist("\currentlinkedlist",\currentlink)}}%
- \dogotosomepage {\??lk\currentlinkedlist}\gotobegincharacter \firstlink
- \ifnum\noflinks>\plustwo
- \dogotosomepage{\??lk\currentlinkedlist}\gobackwardcharacter\previouslink
- \dogotosomepage{\??lk\currentlinkedlist}\goforwardcharacter \nextlink
- \fi
- \dogotosomepage {\??lk\currentlinkedlist}\gotoendcharacter \lastlink
- \else
- \writestatus\m!interactions{no such linked list: \currentlinkedlist}%
- \fi
- \fi
- \egroup}
-
-\setuplinkedlists
- [\c!distance=.25em,
- \c!width=\v!fit,
- \c!location=\v!low,
- \c!color=\@@iacolor,
- \c!frame=\v!off,
- \c!background=,
- \c!backgroundcolor=]
-
-\def\koppeling {\linkedlistelement}
-\def\stelkoppelingenin {\setuplinkedlists}
-\def\definieerkoppeling{\definelinkedlist}
-
-%D Conditional page breaks:
-
-\def\screen
- {\dosingleempty\doscreen}
-
-\def\doscreen[#1]%
- {\iflocation\page[#1]\fi}
-
-%D Page transitions:
-
-\let\askedpagetransitions\empty
-
-\unexpanded\def\setuppagetransitions
- {\dosingleempty\dosetuppagetransitions}
-
-\def\dosetuppagetransitions[#1]%
- {\edef\askedpagetransitions{#1}}
-
-\def\setpagetransition
- {\iflocation \ifx\askedpagetransitions\empty \else
- \ctxlua{backends.codeinjections.setpagetransition{ n = "\askedpagetransitions", delay = "\@@scdelay" }}%
- \fi \fi}
-
-\prependtoks \setpagetransition \to \everyshipout
-
-\setuppagetransitions
- [\v!reset]
-
-%D Comments:
-
-\newbox\commentcollection
-\newbox\commentbox
-\newbox\commentboxone
-\newbox\commentboxtwo
-
-\def\raisedcommentanchors#1#2{#1{\hbox{\raise\strutht#2}}}
-
-\setvalue{\??cc:\c!location:\v!inmargin }{\raisedcommentanchors\inmargin }
-\setvalue{\??cc:\c!location:\v!leftedge }{\raisedcommentanchors\inleftedge }
-\setvalue{\??cc:\c!location:\v!rightedge }{\raisedcommentanchors\inrightedge }
-\setvalue{\??cc:\c!location:\v!leftmargin }{\raisedcommentanchors\inleftmargin }
-\setvalue{\??cc:\c!location:\v!rightmargin}{\raisedcommentanchors\inrightmargin}
-
-\let\flushcommentanchors\relax
-
-\def\doflushcommentanchors
- {\global\let\flushcommentanchors\relax
- \ifvoid\commentbox\else\dodoflushcommentanchors\fi} % in everypar so indirect
-
-\def\dodoflushcommentanchors
- {\executeifdefined{\??cc:\c!location:\@@cclocation}\hbox{\box\commentbox}}
-
-\unexpanded\def\setupcomment
- {\dodoubleargument\getparameters[\??cc]}
-
-\unexpanded\def\placecomments{\box\commentcollection} % when option=buffer
-
-\def\doinsertcomment#1%
- {\begingroup
- \ctxlua{backends.codeinjections.presetsymbollist("\@@ccsymbol")}%
- % in between predefined symbols are dealt with
- \ctxlua{backends.codeinjections.registercomment {
- title = "\@@cctitle",
- width = \number\dimexpr\@@ccwidth \relax,
- height = \number\dimexpr\@@ccheight\relax,
- colormodel = \number\currentcolormodel,
- colorvalue = \thecolorattribute{\@@cccolor},
- open = \@@ccopen,
- symbol = "\@@ccsymbol",
- buffer = "#1",
- layer = "\@@cctextlayer"
- }}%
- \box\commentboxone
- \doif\@@ccoption\v!buffer
- {\setbox\scratchbox\vbox to \@@ccheight{\forgetall\vss\box\commentboxtwo}%
- \wd\scratchbox\@@ccwidth
- \global\setbox\commentcollection\vbox
- {\startoverlay{\box\commentcollection}{\box\scratchbox}\stopoverlay}}%
- \endgroup}
-
-\setvalue{\e!start\v!comment}{\dotripleempty\dostartcomment}% the dummy triple gobbles trailing spaces
-
-\def\dostartcomment[#1][#2][#3]%
- {\bgroup
- \doifassignmentelse{#1}{\getparameters[\??cc][#1]}{\getparameters[\??cc][\c!title=#1,#2]}%
- \doifelse\@@ccoption\v!max{\let\@@ccopen\s!true}{\let\@@ccopen\s!false}%
- \setcurrentbuffer{\v!comment\v!buffer}%
- \dostartbuffer[\v!comment\v!buffer][\v!comment\v!buffer][\e!start\v!comment][\e!stop\v!comment]}
-
-\unexpanded\def\stopcomment
- {\doif\@@ccstate\v!start
- {\global\let\flushcommentanchors\doflushcommentanchors
- \global\setbox\commentbox\frozenhbox
- {\hbox to \zeropoint{\struttedbox{\tbox{\doinsertcomment{\v!comment\v!buffer}}}\hss}%
- \hskip\ifvoid\commentbox\@@ccmargin\else\@@ccdistance\fi
- \box\commentbox}}%
- \egroup}
-
-\def\comment
- {\dodoubleempty\docomment}
-
-\def\docomment[#1][#2]#3%
- {\doif\@@ccstate\v!start
- {\hbox to \zeropoint
- {\doifassignmentelse{#1}{\getparameters[\??cc][#1]}{\getparameters[\??cc][\c!title=#1,#2]}%
- \hskip-\@@ccmargin
- \ctxlua{buffers.set("\v!comment\v!buffer", \!!bs\detokenize{#3}\!!es)}%
- \struttedbox{\tbox{\doinsertcomment{\v!comment\v!buffer}}\hss}}}%
- \ignorespaces}
-
-% test
-%
-% \startcomment
-% hello beautiful\\world
-% \stopcomment
-%
-% test
-%
-% \startcomment[hello]
-% hello << eerste >>
-% beautiful
-% world
-% \stopcomment
-%
-% test
-%
-% \startcomment[hello][color=green,width=10cm,height=3cm]
-% hello \leftguillemot\ \'e\'erste \rightguillemot\
-% beautiful
-% world
-% \stopcomment
-%
-% test
-%
-% \startcomment[hello][color=red,width=4cm,height=3cm]
-% hello \leftguillemot\ \'e\'erste \rightguillemot\ test
-%
-% beautiful
-%
-% world
-% \stopcomment
-%
-% test
-%
-% \startcomment[symbol=Balloon]
-% Do we want this kind of rubish? And, why isn't this and
-% some more features related to text annotations so poorly
-% (actually not) documented? Anyhow, by providing this
-% functionality we demonstrate that \pdfTeX\ can do it. By
-% the way, it's funny that when in Acrobat we scale up the
-% text, the symbols scale down.
-% \stopcomment
-%
-% test
-%
-% \definesymbol [comment-normal][{\externalfigure[cow.pdf]}]
-% \definesymbol [comment-down] [{\externalfigure[cow.pdf]}]
-%
-% \def\CowSymbol#1#2%
-% {\scale
-% [\c!height=#1]
-% {\startMPcode
-% loadfigure "koe.mp" number 1 ;
-% refill currentpicture withcolor #2 ;
-% \stopMPcode}}
-%
-% \definesymbol [comment-normal]
-% [\CowSymbol{4ex}{red}]
-%
-% \definesymbol [comment-down]
-% [\CowSymbol{4ex}{green}]
-%
-% \setupcomment
-% [\c!symbol={comment-normal,comment-down},
-% \c!option=\v!buffer]
-%
-% \startcomment[hello]
-% oeps
-% \stopcomment
-%
-% test
-%
-% \setupcomment
-% [\c!symbol=normal,
-% \c!option=max,width=10cm]
-%
-% \startcomment[hello]
-% oeps
-% \stopcomment
-%
-% test
-
-\setupcomment
- [\c!state=\v!start,
- \c!margin=2.5em,
- \c!distance=1em,
- \c!width=.3\textwidth,
- \c!height=.2\textheight,
- \c!color=\@@iacolor,
- \c!title=,
- \c!space=\v!no,
- \c!symbol=\v!normal,
- \c!location=\v!inmargin,
- \c!option=,
- \c!textlayer=]
-
-%D Attachments:
-
-% \setupinteraction[state=start]
-%
-% \useattachment[test.tex]
-% \useattachment[whatever][test.tex]
-% \useattachment[whatever][newname][test.tex]
-% \useattachment[whatever][title][newname][test.tex]
-%
-% % \setupattachments[\c!symbol={symbol-normal,symbol-down}]
-%
-% \starttext \attachment[whatever] \stoptext
-
-\def\useattachment
- {\doquadrupleempty\douseattachment}
-
-\def\douseattachment[#1][#2][#3][#4]% tag title newname filename
- {\iffourthargument
- \ctxlua{interactions.registerattachment{ label="#1", title="#2", newname="#3", filename="#4" }}%
- \else\ifthirdargument
- \ctxlua{interactions.registerattachment{ label="#1", title="#2", newname="#2", filename="#3" }}%
- \else\ifsecondargument
- \ctxlua{interactions.registerattachment{ label="#1", title="#2", newname="#2", filename="#2" }}%
- \else
- \ctxlua{interactions.registerattachment{ label="#1", title="#1", newname="#1", filename="#1" }}%
- \fi\fi\fi}
-
-\def\attachment
- {\dodoubleempty\doattachment}
-
-\def\doattachment[#1][#2]% [tag] [settings]
- {\iflocation
- \doif\@@atstate\v!start
- {\bgroup
- \setupattachments[#2]%
- \ctxlua{backends.codeinjections.presetsymbollist("\@@atsymbol")}%
- % we cannot yet ask for the wd/ht/dp of an xform else we could use those
- \setbox\scratchbox\hbox{\symbol[\lastpredefinedsymbol]}%
- \doif\@@atwidth \v!fit{\edef\@@atwidth {\the\wd\scratchbox}}%
- \doif\@@atheight\v!fit{\edef\@@atheight{\the\ht\scratchbox}}%
- \doif\@@atdepth \v!fit{\edef\@@atdepth {\the\dp\scratchbox}}%
- %
- \setbox\scratchbox\hbox
- {\getvalue{\??at:\@@atalternative}{\ctxlua{backends.codeinjections.attachfile{
- label = "#1",
- width = \number\dimexpr\@@atwidth \relax,
- height = \number\dimexpr\@@atheight\relax,
- depth = \number\dimexpr\@@atdepth \relax,
- color = "\@@atcolor",
- symbol = "\@@atsymbol",
- layer = "\@@attextlayer",
- }}}}%
- \wd\scratchbox\@@atwidth
- \ht\scratchbox\@@atheight
- \dp\scratchbox\@@atdepth
- \box\scratchbox
- \egroup}%
- \fi}
-
-\setvalue{\??at:\v!high}#1{\struttedbox{\tbox{#1}}}
-
-\unexpanded\def\setupattachments
- {\dodoubleempty\getparameters[\??at]}
-
-\setupattachments
- [\c!state=\v!start,
- \c!color=\@@iacolor,
- \c!textlayer=,
- \c!width=\v!fit,
- \c!height=\v!fit,
- \c!depth=\v!fit,
- \c!alternative=\v!high,
- \c!symbol=]
-
-%D Defining sound tracks:
-%D
-%D \starttyping
-%D \useexternalsoundtrack[label][file]
-%D \stoptyping
-%D
-%D associated actions: StartSound StopSound PauseSound ResumeSound
-%D
-%D Todo: like external figures, also search on path,
-%D although, they need to be present ar viewing time, so ...
-
-\def\useexternalsoundtrack
- {\dodoubleargument\douseexternalsoundtrack}
-
-\def\douseexternalsoundtrack[#1][#2]%
- {\ctxlua{interactions.registersound{ label="#1", filename="#2" }}}
-
-\def\checksoundtrack#1% yet untested in mkiv (also move management to lua)
- {\iflocation
- \ctxlua{codeinjections.insertsound{
- label = "#1",
- repeat = "\@@sdoption", % not entirely ok but works
- }}%
- \fi}
-
-\unexpanded\def\setupexternalsoundtracks
- {\dodoubleargument\getparameters[\??sd]}
-
-\setupexternalsoundtracks
- [\c!option=]
-
-%D Multi Media:
-
-% todo: multiple instances, dus indirect
-
-\let\currentrendering\empty
-
-\definereference[StartCurrentRendering] [\v!StartRendering {\currentrendering}]
-\definereference[StopCurrentRendering] [\v!StopRendering {\currentrendering}]
-\definereference[PauseCurrentRendering] [\v!PauseRendering {\currentrendering}]
-\definereference[ResumeCurrentRendering][\v!ResumeRendering{\currentrendering}]
-
-\newcounter\nofexternalrenderings
-
-\def\useexternalrendering{\doquadrupleempty\douseexternalrendering}
-\def\setinternalrendering{\dodoubleempty \dosetinternalrendering}
-
-\def\douseexternalrendering[#1][#2][#3][#4]% tag mime file options
- {\ctxlua{interactions.registerrendering {
- kind = "external",
- label = "#1",
- mime = "#2",
- filename = "#3",
- options = "#4",
- }}}
-
-\def\dosetinternalrendering[#1][#2]% tag options {content}
- {\bgroup
- \dowithnextbox
- {\ctxlua{interactions.registerrendering {
- kind = "internal",
- label = "#1",
- mime = "IRO",
- filename = "#1",
- options = "#2",
- }}%
- \let\objectoffset\zeropoint
- \setobject{IRO}{#1}\hbox{\box\nextbox}%
- \egroup}%
- \hbox}
-
-\def\renderingtype #1{\ctxlua{interactions.renderingvar("#1","kind")}}
-\def\renderingoptions#1{\ctxlua{interactions.renderingvar("#1","options")}}
-
-\def\renderingwidth {8cm}
-\def\renderingheight {6cm}
-
-\unexpanded\def\definerenderingwindow
- {\dodoubleempty\dodefinerenderingwindow}
-
-\def\dodefinerenderingwindow[#1][#2]%
- {\presetlocalframed[\??rw#1]%
- \getparameters
- [\??rw#1]%
- [\c!openpageaction=,\c!closepageaction=,%
- \c!width=\renderingwidth,\c!height=\renderingheight,%
- #2]}
-
-\unexpanded\def\setuprenderingwindow
- {\dodoubleargument\dosetuprenderingwindow}
-
-\def\dosetuprenderingwindow[#1]%
- {\getparameters[\??rw#1]}
-
-\unexpanded\def\placerenderingwindow
- {\dodoubleempty\doplacerenderingwindow}
-
-\def\doplacerenderingwindow[#1][#2]%
- {\bgroup
- \edef\currentrendering{\ifsecondargument#2\else#1\fi}%
- \doifelse{\renderingtype\currentrendering}{internal} % an object
- {\getobjectdimensions{IRO}\currentrendering
- \edef\renderingheight{\the\dimexpr\objectheight+\objectdepth\relax}%
- \edef\renderingwidth{\objectwidth}%
- \dogetobjectreferencepage{IRO}\currentrendering\renderingpage}%
- {\def\renderingheight{\vsize}%
- \def\renderingwidth{\hsize}%
- \def\renderingpage{\realpageno}}%
- % create fall back if needed
- \ifcsname\??rw#1\c!width\endcsname
- \def\currentrenderingwindow{#1}%
- \else
- \let\currentrenderingwindow\s!default
- \definerenderingwindow[\currentrenderingwindow]%
- \fi
-% todo
-% \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!openpageaction }}\dosetuprenderingopenpageaction
-% \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!closepageaction}}\dosetuprenderingclosepageaction
- \localframed
- [\??rw\currentrenderingwindow][\c!offset=\v!overlay]%
- {\ctxlua{backends.codeinjections.insertrenderingwindow {
- label = "\currentrendering",
- width = \number\dimexpr\renderingwidth\relax,
- height = \number\dimexpr\renderingheight\relax,
- options = "\renderingoptions\currentrendering",
- page = \number\renderingpage,
- }}}%
- \egroup}
-
-\setupinteractionscreen
- [\c!width=\printpaperwidth,
- \c!height=\printpaperheight,
- \c!horoffset=\!!zeropoint,
- \c!veroffset=\!!zeropoint,
- \c!backspace=\backspace,
- \c!topspace=\topspace,
- \c!option=\v!auto,
- \c!delay=\v!none]
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-men.mkiv b/Master/texmf-dist/tex/context/base/scrn-men.mkiv
deleted file mode 100644
index 246d31bfddd..00000000000
--- a/Master/texmf-dist/tex/context/base/scrn-men.mkiv
+++ /dev/null
@@ -1,615 +0,0 @@
-%D \module
-%D [ file=scrn-bar, % was part of scrn-int
-%D version=1995.01.01,
-%D title=\CONTEXT\ Core Macros,
-%D subtitle=Menus,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Screen Macros / Menus}
-
-\unprotect
-
-% \startinteractionmenu[rechts]
-% \but [eerste] eerste \\
-% \txt hello world \\
-% \but [tweede] tweede \\
-% \nop \\
-% \but [tweede] tweede \\
-% \rul whow \\
-% \but [tweede] tweede \\
-% \raw hello world \\
-% \but [tweede] tweede \\
-% \com \vfill \\
-% \but [derde] derde \\
-% \stopinteractionmenu
-
-% \setupinteraction[menu=on,state=start]
-%
-% \defineinteractionmenuclass[test] [vertical]
-% \defineinteractionmenuclass[another][horizontal]
-%
-% \defineinteractionmenu[test] [left][state=start,width=4cm]
-% \defineinteractionmenu[another][top] [state=start,height=1cm]
-%
-% \startinteractionmenu[test]
-% \but [firstpage] test-a \\
-% \but [nextpage] test-b \\
-% \stopinteractionmenu
-%
-% \startinteractionmenu[another]
-% \but [firstpage] test-a \\
-% \but [nextpage] test-b \\
-% \stopinteractionmenu
-%
-% \setupheadertexts[{\interactionmenu[another]}]
-%
-% \starttext
-%
-% test \interactionmenu[test] \page
-% test \interactionmenu[test] \page
-%
-% \stoptext
-
-% ja : kader/achtergrond met tekst
-% leeg : kader/achtergrond maar geen tekst
-% nee : alleen ruimte reserveren
-% geen : helemaal weglaten
-%
-% \setupinteractionmenu[right][samepage=yes, unknownreference=yes]
-% \setupinteractionmenu[right][samepage=empty,unknownreference=empty]
-% \setupinteractionmenu[right][samepage=no, unknownreference=no]
-% \setupinteractionmenu[right][samepage=none, unknownreference=none]
-%
-% \startinteractionmenu[right]
-% \but [firstpage] first \\
-% \but [lastpage] last \\
-% \but [somepage] crap \\
-% \stopinteractionmenu
-
-%D Define menus:
-
-\def\setmenuparameter#1#2#3{\@EA\def\csname\??am#1#2\endcsname{#3}}
-\def\letmenuparameter #1#2{\@EA\let\csname\??am#1#2\endcsname}
-
-\def\menuparameter #1{\csname\domenuparameter{\??am\currentmenu}#1\endcsname}
-\def\namedmenuparameter#1#2{\csname\domenuparameter{\??am #1}#2\endcsname}
-\def\menuparameterhash #1{\domenuparameterhash {\??am\currentmenu}#1}
-
-\def\domenuparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\domenuparentparameter \csname#1\s!parent\endcsname#2\fi}
-\def\domenuparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\domenuparentparameterhash\csname#1\s!parent\endcsname#2\fi}
-
-\def\domenuparentparameter #1#2{\ifx#1\relax\s!empty\else\domenuparameter #1#2\fi}
-\def\domenuparentparameterhash#1#2{\ifx#1\relax \else\domenuparameterhash#1#2\fi}
-
-\unexpanded\def\defineinteractionmenu
- {\dotripleempty\dodefineinteractionmenu}
-
-\def\dodefineinteractionmenu[#1][#2][#3]% [name] [location] [settings]
- {\ifsecondargument
- \ifcsname\??am:\c!list:#2\endcsname \else
- \letvalue{\??am:\c!list:#2}\empty
- \fi
- \normalexpanded{\noexpand\addtocommalist{#1}\@EA\noexpand\csname\??am:\c!list:#2\endcsname}%
- \setvalue{\@@dodolistelement#1}{\def\dosomelistelement{\dodomenulistelement{#1}}}%
- \ifthirdargument
- \presetlocalframed[\??am#1]%
- \doifassignmentelse{#3}
- {\doifelse{#1}{#2}
- {\getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am,#3]}
- {\getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am#2,#3]}}%
- {\doifelsenothing{#3}
- {\getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am]}
- {\getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am#3]}}%
- \else
- \getparameters[\??am#1][\c!location=#2,\c!menu=,\s!parent=\??am#2]%
- \fi
- \else
- \getparameters[\??am#1][\s!parent=\??am]% simple cloning
- \fi}
-
-\def\currentmenulist{\ifcsname\??am:\c!list:\currentmenu\endcsname\csname\??am:\c!list:\currentmenu\endcsname\fi}
-
-%D Setup menus:
-
-\unexpanded\def\setupinteractionmenu
- {\dodoubleargument\dosetupinteractionmenu}
-
-\def\dosetupinteractionmenu[#1][#2]%
- {\def\docommand##1{\getparameters[\??am##1][#2]}%
- \processcommalist[#1]\docommand}
-
-\unexpanded\def\setupinteractionmenus[#1]%
- {\getparameters[\??am][#1]}
-
-%D Fill menus:
-
-\normalexpanded{\long\def\expandafter\noexpand\csname\e!start\v!interactionmenu\endcsname[#1]#2\expandafter\noexpand\csname\e!stop\v!interactionmenu\endcsname}%
- {\long\setmenuparameter{#1}\c!menu{\dointeractionmenu{#1}{#2}}}
-
-\def\resetinteractionmenu[#1]%
- {\letmenuparameter{#1}\c!menu\empty}
-
-%D Check if menus permitted:
-
-\newif\iflocationmenupermitted
-
-\def\testinteractionmenu
- {\iflocation
- \doifelse\@@iamenu\v!on
- {\doifelse{\menuparameter\c!state}\v!start
- {\global\locationmenupermittedtrue}
- {\global\locationmenupermittedfalse}}
- {\global\locationmenupermittedfalse}%
- \else
- \global\locationmenupermittedfalse
- \fi}
-
-%D Placement of menus:
-
-\def\interactionmenus[#1]% location
- {\iflocation
- \csname\??am:\c!menu:#1\endcsname
- \fi}
-
-% \unexpanded\def\defineinteractionmenuclass
-% {\dodoubleargument\dodefineinteractionmenuclass}
-%
-% \def\dodefineinteractionmenuclass[#1][#2]% tag hori|veri
-% {\doifelse{#2}\v!vertical
-% {\setvalue{\??am:\c!menu:#1}{\verticalinteractionmenu {#1}{\getvalue{\??am#1\c!width }}}}
-% {\setvalue{\??am:\c!menu:#1}{\horizontalinteractionmenu{#1}{\getvalue{\??am#1\c!height}}}}}
-%
-% \defineinteractionmenuclass[\v!left ][\v!horizontal]
-% \defineinteractionmenuclass[\v!right ][\v!horizontal]
-% \defineinteractionmenuclass[\v!top ][\v!vertical]
-% \defineinteractionmenuclass[\v!bottom][\v!vertical]
-
-\setvalue{\??am:\c!menu :\v!left }{\horizontalinteractionmenu\v!left \leftedgewidth }
-\setvalue{\??am:\c!menu :\v!right }{\horizontalinteractionmenu\v!right \rightedgewidth}
-\setvalue{\??am:\c!menu :\v!top }{\verticalinteractionmenu \v!top \topheight }
-\setvalue{\??am:\c!menu :\v!bottom}{\verticalinteractionmenu \v!bottom\bottomheight }
-
-\setvalue{\??am:\c!command:\v!right }{\@@amvbox{}\rightedgewidth}
-\setvalue{\??am:\c!command:\v!left }{\@@amvbox{}\leftedgewidth }
-\setvalue{\??am:\c!command:\v!top }{\@@amhbox{}\topheight }
-\setvalue{\??am:\c!command:\v!bottom}{\@@amhbox{}\bottomheight }
-
-\def\dointeractionmenu#1#2%
- {\edef\currentmenu{#1}%
- \getvalue{\??am:\c!command:\menuparameter\c!location}\currentmenu{#2}}
-
-\unexpanded\def\interactionmenu[#1]%
- {\def\currentmenu{#1}%
- \menuparameter\c!menu}
-
-\newdimen \intermenudistance
-\newdimen \finalmenuwidth
-\newdimen \finalmenuheight
-
-\newcounter\currentamposition % better \currentmenuposition
-\newtoks \everysetmenucommands
-
-\def\horizontalinteractionmenu#1#2% location vhsize before/after
- {\ifdim#2>\zeropoint
- \edef\currentmenu{#1}%
- \finalmenuwidth#2\relax
- \horizontalinteractionmenuindeed
- \fi}
-
-\def\verticalinteractionmenu#1#2%
- {\ifdim#2>\zeropoint
- \edef\currentmenu{#1}%
- \finalmenuheight#2\relax
- \verticalinteractionmenuindeed
- \fi}
-
-\def\horizontalinteractionmenuindeed
- {\global\intermenudistance\zeropoint
- \setbox\scratchbox\hbox
- {\processcommacommand[\currentmenulist]\somehorizontalinteractionmenu}%
- \wd\scratchbox\finalmenuwidth\relax
- \box\scratchbox}
-
-\def\verticalinteractionmenuindeed
- {\global\intermenudistance\zeropoint
- \setbox\scratchbox\vbox
- {\processcommacommand[\currentmenulist]\someverticalinteractionmenu}%
- \ht\scratchbox\finalmenuheight
- \dp\scratchbox\zeropoint
- \box\scratchbox}
-
-\def\somehorizontalinteractionmenu#1%
- {\begingroup
- \edef\currentmenu{#1}%
- \doifnot{\menuparameter\c!state}\v!none
- {\hskip\intermenudistance
- \setbox\scratchbox\hbox to \finalmenuwidth
- {\menuparameter\c!left
- \interactionmenu[#1]%
- \menuparameter\c!right}%
- \doifelse{\menuparameter\c!distance}\v!overlay
- {\global\intermenudistance\zeropoint
- \wd\scratchbox\zeropoint}%
- {\global\intermenudistance\menuparameter\c!distance}%
- \box\scratchbox}%
- \endgroup}
-
-\def\someverticalinteractionmenu#1%
- {\begingroup
- \edef\currentmenu{#1}%
- \doifnot{\menuparameter\c!state}\v!none
- {\vskip\intermenudistance
- \setbox\scratchbox\vbox to \finalmenuheight
- {\menuparameter\c!before
- \interactionmenu[#1]%
- \menuparameter\c!after}%
- \doifelse{\menuparameter\c!distance}\v!overlay
- {\global\intermenudistance\zeropoint
- \offinterlineskip
- \dp\scratchbox\zeropoint
- \ht\scratchbox\zeropoint}%
- {\global\intermenudistance\menuparameter\c!distance}%
- \box\scratchbox}%
- \endgroup}
-
-% don't change skipping, this one works! \showcomposition removed
-
-\def\@@amhbox#1#2#3#4% #1 obsolete, #3 is redundant
- {\edef\currentmenu{#3}%
- \testinteractionmenu
- \iflocationmenupermitted
- \begingroup
- \forgetall
- \scratchdimen\dimexpr\makeupwidth+\pagebackgroundhoffset*2-\menuparameter\c!leftoffset-\menuparameter\c!rightoffset\relax
- \setbox\scratchbox\hbox to \scratchdimen
- {\executeamboxcommands{#3}{#4}\c!left\c!middle\c!right}%
- \setbox\scratchbox\hbox{\dowholemenuposition{#3}{\box\scratchbox}}% cannot happen in previous due to align
- \wd\scratchbox\makeupwidth % geen \ht=#2 setting (yet)
- \hskip\dimexpr-\pagebackgroundhoffset+\menuparameter\c!leftoffset\relax
- \box\scratchbox
- \endgroup
- \fi}
-
-\def\@@amvbox#1#2#3#4% #1 obsolete, #3 is redundant
- {\edef\currentmenu{#3}%
- \testinteractionmenu
- \iflocationmenupermitted
- \bgroup
- \forgetall
- \scratchdimen\dimexpr\textheight+\pagebackgroundvoffset*2+\pagebackgrounddepth-\menuparameter\c!topoffset-\menuparameter\c!bottomoffset\relax
- \setbox\scratchbox\vbox to \scratchdimen
- {\restorestandardblank % todo: vspacing
- \hsize#2\relax
- \executeamboxcommands{#3}{#4}\c!before\c!inbetween\c!after}%
- % strange: when we mnake this a hbox the content disappears
- \setbox\scratchbox\vbox{\dowholemenuposition{#3}{\box\scratchbox}}% cannot happen in previous due to align
- \setbox\scratchbox\vbox
- {\ht\scratchbox\zeropoint
- \vskip\dimexpr-\pagebackgroundvoffset+\menuparameter\c!topoffset\relax
- \box\scratchbox
- \vskip\pagebackgroundvoffset}% overbodig
- \ht\scratchbox\textheight
- \wd\scratchbox#2\relax
- \box\scratchbox
- \egroup
- \fi}
-
-\def\executeamboxcommands#1#2#3#4#5%
- {\begingroup
- \edef\currentmenu{#1}%
- \menuparameter#3\relax
- \setamboxcommands{#1}{#4}%
- \ignorespaces#2\unskip
- \menuparameter#5\relax
- \endgroup}
-
-\def\setamboxcommands#1#2%
- {\edef\currentmenu{#1}%
- \edef\betweenmenu{#2}%
- \doglobal\newcounter\currentamposition
- \the\everysetmenucommands}
-
-\def\addsomemenuitem#1%
- {\dontleavehmode
- \begingroup
- \ignorespaces#1\unskip\relax
- \ifconditional\skippedmenuitem \else
- \menuparameter\betweenmenu
- \fi
- \endgroup
- \ignorespaces}
-
-%D This can save complicated menu macros when one want to
-%D keep control over parts of a menu (i.e.\ turn them on and
-%D off). We could have achieved something similar with modes.
-
-\def\local@@ambox#1#2#3#4% don't change skipping, this one works!
- {\begingroup
- \edef\currentmenu{#3}%
- \iflocationmenupermitted
- \executeamboxcommands{#3}{#4}\c!before\c!inbetween\c!after
- \fi
- \endgroup}
-
-\def\includemenu[#1]%
- {\begingroup
- \edef\currentmenu{#1}%
- \doif{\menuparameter\c!state}\v!local
- {\letmenuparameter\currentmenu\c!state\v!start
- \let\@@amvbox\local@@ambox
- \let\@@amhbox\local@@ambox
- \menuparameter\c!menu}%
- \endgroup}
-
-%D The menu commands:
-
-% ja : kader/achtergrond met tekst
-% leeg : kader/achtergrond maar geen tekst
-% nee : alleen ruimte reserveren
-% geen : helemaal weglaten
-
-\newconditional\skippedmenuitem
-\newconditional\usemenuclick
-
-\def\dosetlocationboxcontent#1[#2]#3[#4]% to be checked
- {\global\setfalse\skippedmenuitem
- \setbox\locationbox\hbox{\localframed[#1][#2]{#3}}%
- \ifconditional\usemenuclick
- \gotobox{\box\locationbox}[#4]%
- \else
- \box\locationbox
- \fi}
-
-\def\dosetlocationboxempty#1[%
- {\dosetlocationboxcontent{#1}[\c!empty=\v!yes,}
-
-\def\dosetlocationboxno#1[%
- {\dosetlocationboxcontent{#1}[\c!empty=\v!yes,\c!frame=,\c!background=,}
-
-\def\dosetlocationboxnone#1[#2]#3[#4]%
- {\global\settrue\skippedmenuitem}
-
-% make two sub macros
-
-% \dosetfontattribute {#1}{#2}%
-% \dosetcolorattribute{#1}{#3}%
-
-\def\setlocationboxyes#1[#2]#3[#4]% needs to be split as the attr is not applicable to the box
- {\begingroup
- \settrue\usemenuclick
- \global\setfalse\skippedmenuitem
- \attribute\referenceattribute\attributeunsetvalue
- \doifreferencefoundelse{#4}
- {\analyzecurrentreference % we need to act on the state
- \ifcase\referencepagestate
- % something else than a page reference
- \ctxlua{jobreferences.injectcurrentset(nil,nil)}%
- \hbox attr \referenceattribute \lastreferenceattribute {\localframed[#1][#2]{#3}}%
- \else\ifcase\csname\??am:\c!location:\menuparameter\c!samepage\endcsname\relax
- % yes: same page or not ... todo
- \ctxlua{jobreferences.injectcurrentset(nil,nil)}%
- \ifnum\referencepagestate=\plusone % same page
- \hbox attr \referenceattribute \lastreferenceattribute {\localframed[#1][#2,\c!color=\menuparameter\c!contrastcolor]{#3}}%
- \else % elsewhere
- \hbox attr \referenceattribute \lastreferenceattribute {\localframed[#1][#2]{#3}}%
- \fi
- \or
- % empty but frame: no click
- \localframed[#1][\c!empty=\v!yes,#2]{#3}%
- \or
- % empty no frame: no
- \localframed[#1][\c!empty=\v!yes,\c!frame=,\c!background=,#2]{#3}%
- \or
- % nothing at all
- \global\settrue\skippedmenuitem
- \fi\fi}%
- {\unknownreference{#4}%
- \ifcase\csname\??am:\c!location:\menuparameter\c!unknownreference\endcsname\relax
- \localframed[#1][#2]{#3}%
- \or
- \localframed[#1][\c!empty=\v!yes,#2]{#3}%
- \or
- \localframed[#1][\c!empty=\v!yes,\c!frame=,\c!background=,#2]{#1}%
- \or
- \global\skippedmenuitemtrue
- \fi}%
- \endgroup}
-
-\def\setlocationboxraw#1[#2]#3[#4]%
- {\localframed[#1][#2]{#3}}
-
-\def\setlocationnop#1[#2]#3%
- {\localframed[#1][#2]{#3}}
-
-\def\menu@raw[#1]#2\\%
- {\addsomemenuitem{\gotobox{\ignorespaces#2\unskip}[#1]}}
-
-\def\menu@but[#1]#2\\%
- {\addsomemenuitem{\domenuitemposition\currentmenu{#1}{\setlocationboxyes{\??am\currentmenu}[]{\ignorespaces#2\unskip}[#1]}}}
-
-\def\menu@got[#1]#2\\%
- {\addsomemenuitem{\setlocationboxyes{\??am\currentmenu}[\c!frame=\v!off,\c!background=]{\ignorespaces#2\unskip}[#1]}}
-
-\def\menu@nop#1\\%
- {\addsomemenuitem{\setlocationboxraw{\??am\currentmenu}[\c!frame=\v!off,\c!background=,\c!empty=\v!yes]{\ignorespaces#1\unskip}[]}}
-
-\def\menu@txt#1\\%
- {\addsomemenuitem{\localframed[\??am\currentmenu][\c!frame=\v!off,\c!background=]{\ignorespaces#1\unskip}}}
-
-\def\menu@rul#1\\%
- {\addsomemenuitem{\localframed[\??am\currentmenu][]{\ignorespaces#1\unskip}}}
-
-\def\menu@com#1\\%
- {\ignorespaces#1\unskip\ignorespaces}
-
-\appendtoks
- \let\raw\menu@raw \let\but\menu@but \let\got\menu@got \let\nop\menu@nop
- \let\txt\menu@txt \let\rul\menu@rul \let\com\menu@com
-\to \everysetmenucommands
-
-\ifdefined\domenuitemposition \else \let\domenuitemposition \gobbletwoarguments \fi
-\ifdefined\dowholemenuposition \else \let\dowholemenuposition\gobbleoneargument \fi
-
-%D We also need an explicit position control some day. I'll
-%D do that when I need it. [The stacking order.]
-
-% [name] [location]
-% [name] [location] [pars]
-
-\expandafter\chardef\csname\??am:\c!location:\v!yes \endcsname\zerocount
-\expandafter\chardef\csname\??am:\c!location:\v!empty \endcsname\plusone
-\expandafter\chardef\csname\??am:\c!location:\v!no \endcsname\plustwo
-\expandafter\chardef\csname\??am:\c!location:\v!none \endcsname\plusthree
-
-\expandafter\chardef\csname\??am:\c!location:\v!normal \endcsname\plusone % default
-\expandafter\chardef\csname\??am:\c!location:\s!default\endcsname\plusone % default
-\expandafter\chardef\csname\??am:\c!location:\s!empty \endcsname\plusone % default
-
-\def\dodomenulistelement#1#2#3#4#5#6#7%
- {\addsomemenuitem{\domenuitemposition\currentmenu{internal(#3)}%
- {\setlocationboxyes{\??am\currentmenu}[]{\limitatetext{#5}{\namedlistparameter{#2}\c!maxwidth}{\unknown}}[internal(#3)]}}}
-
-\unexpanded\def\menubutton
- {\dodoubleempty\domenubutton}
-
-\def\domenubutton[#1]%
- {\iffirstargument
- \ifsecondargument
- \@EAEAEA\domenubuttonB
- \else
- \doifassignmentelse{#1}
- {\@EAEAEA\domenubuttonC}
- {\@EAEAEA\domenubuttonD}%
- \fi
- \else
- \@EA\domenubuttonA
- \fi[#1]}
-
-\def\domenubuttonA[#1][#2]#3[#4]{\setlocationboxyes\??bt[]{#3}[#4]} % normal button, no parameters
-\def\domenubuttonB[#1][#2]#3[#4]{\setlocationboxyes{\??am#1}[#2]{#3}[#4]} % menu button, with parameters
-\def\domenubuttonC[#1][#2]#3[#4]{\setlocationboxyes\??bt[#1]{#3}[#4]} % normal button, with parameters
-\def\domenubuttonD[#1][#2]#3[#4]{\setlocationboxyes{\??am#1}[]{#3}[#4]} % menu button, no parameters
-
-\def\menubox
- {\dodoubleempty\domenubox}
-
-\def\domenubox[#1][#2]#3%
- {\bgroup
- \let\setlocationboxyes\setlocationboxraw
- \domenubutton[#1][#2]#3[]%
- \egroup}
-
-% jammer, tussen/midden had erin gemoeten; \c!commando toevoegen
-
-\def\registermenucommand#1%
- {{\textonly\noindent#1\space}} % no math switching
-
-\def\doregistermenubuttons[#1][#2]% [menu id] [register]
- {\bgroup
- \ifsecondargument
- \setupinteractionmenu[#1][\c!unknownreference=\v!yes,\c!samepage=\v!yes]%
- \def\docommand##1{\registermenucommand{\menubutton[#1]{##1}[#2:##1]}}%
- \else
- \def\docommand##1{\registermenucommand{\button[\c!unknownreference=\v!yes,\c!samepage=\v!yes]{##1}[#1:##1]}}%
- \fi
- \handletokens abcdefghijklmnopqrstuvwxyz\with\docommand % moet anders
- \egroup}
-
-\def\registermenubuttons
- {\dodoubleempty\doregistermenubuttons}
-
-\defineinteractionmenu [\v!vertical] % we happen to know that this works out ok (just a setup set)
-\defineinteractionmenu [\v!horizontal] % we happen to know that this works out ok (just a setup set)
-
-\defineinteractionmenu [\v!right ] [\v!right ] [\v!vertical ] % we share a setup set
-\defineinteractionmenu [\v!left ] [\v!left ] [\v!vertical ] % we share a setup set
-\defineinteractionmenu [\v!top ] [\v!top ] [\v!horizontal] % we share a setup set
-\defineinteractionmenu [\v!bottom] [\v!bottom] [\v!horizontal] % we share a setup set
-
-\setupinteractionmenus
- [\c!offset=.25em,
- \c!position=\v!no,
- \c!frame=\v!on,
- \c!background=,
- \c!backgroundcolor=,
- \c!foregroundstyle=\menuparameter\c!style,
- \c!foregroundcolor=\menuparameter\c!color,
- \c!style=\@@iastyle,
- \c!color=\@@iacolor,
- \c!contrastcolor=\@@iacontrastcolor,
- \c!state=\v!start,
- \c!samepage=\v!yes,
- \c!unknownreference=\v!empty,
- \c!distance=\bodyfontsize, % 12pt
- \c!topoffset=\zeropoint,
- \c!bottomoffset=\zeropoint,
- \c!leftoffset=\zeropoint,
- \c!rightoffset=\zeropoint]
-
-\setupinteractionmenu
- [\v!vertical] % not really a menu
- [\c!before=,
- \c!after=\vfil,
- \c!inbetween=\blank,
- \c!left=\hss,
- \c!right=\hss,
- \c!height=\v!broad]
-
-\setupinteractionmenu
- [\v!horizontal] % not really a menu
- [\c!before=\vss,
- \c!after=\vss,
- \c!middle=\hfil,
- \c!width=\v!fit,
- \c!height=\v!broad]
-
-\setupinteractionmenu[\v!left ][\c!width=\leftedgewidth ]
-\setupinteractionmenu[\v!right ][\c!width=\rightedgewidth]
-% \setupinteractionmenu[\v!top ] [\c!height=\topheight ]
-% \setupinteractionmenu[\v!bottom] [\c!height=\bottomheight ]
-
-\unexpanded\def\placeleftedgetextblock % Is \hss/\hsize really needed here? (check outer level and settings)
- {\hbox to \leftedgewidth{\hsize\leftedgewidth\hss\interactionmenus[\v!left]}}
-
-\unexpanded\def\placerightedgetextblock % Is \hss/\hsize really needed here? (check outer level and settings)
- {\hbox to \rightedgewidth{\hsize\rightedgewidth\interactionmenus[\v!right]\hss}}
-
-\unexpanded\def\placetoptextblock
- {\vbox to \topheight
- {\vsize\topheight
- \csname\??tk\v!top\c!before\endcsname
- \interactionmenus[\v!top]%
- \csname\??tk\v!top\c!after\endcsname
- \kern\zeropoint}}
-
-\unexpanded\def\placebottomtextblock
- {\vbox to \bottomheight
- {\vsize\bottomheight
- \csname\??tk\v!bottom\c!before\endcsname
- \interactionmenus[\v!bottom]%
- \csname\??tk\v!bottom\c!after\endcsname
- \kern\zeropoint}}
-
-\ifdefined\leftedgetextcontent
-
- \appendtoks \iflocation\placeleftedgetextblock \hskip-\leftedgewidth \fi\to \leftedgetextcontent
- \appendtoks \iflocation\placerightedgetextblock \hskip-\rightedgewidth \fi\to \rightedgetextcontent
- \appendtoks \iflocation\placetoptextblock \vskip-\topheight \fi\to \toptextcontent
- \appendtoks \iflocation\placebottomtextblock \vskip-\bottomheight \fi\to \bottomtextcontent
-
-\fi
-
-%D Enable and disable menus \unknown\ obsolete:
-
-\def\gobbletwoparameters[#1][#2]{}
-
-\def\disableinteractionmenu{\dodoubleempty\gobbletwoparameters}
-\def\enableinteractionmenu {\dodoubleempty\gobbletwoparameters}
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-nav.mkiv b/Master/texmf-dist/tex/context/base/scrn-nav.mkiv
deleted file mode 100644
index 264e3ded2e9..00000000000
--- a/Master/texmf-dist/tex/context/base/scrn-nav.mkiv
+++ /dev/null
@@ -1,256 +0,0 @@
-%D \module
-%D [ file=scrn-nav,
-%D version=1998.01.15,
-%D title=\CONTEXT\ Screen Macros,
-%D subtitle=Navigation,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Screen Macros / Navigation}
-
-\unprotect
-
-%D Support for interactive document is very present in
-%D \CONTEXT\ and interwoven in many modules. This means that in
-%D this module, where we deal with some common navigational
-%D features, there will be quite some forward references.
-%D
-%D The current support in \MKIV\ is mostly the same as in
-%D \MKII\ and the old files have some more detailed
-%D (sometimes historic) information.
-
-%D There is no interaction at all unless enabled by saying:
-%D
-%D \starttyping
-%D \setupinteraction[state=start]
-%D \stoptyping
-%D
-%D The other settings are:
-%D
-%D \showsetup{setupinteraction}
-
-% use with care, no checking done
-
-\def\setinteractionparameter#1#2%
- {\expandafter\def\csname\??ia#1\endcsname{#2}}
-
-\def\resetinteractionparameter#1%
- {\expandafter\let\csname\??ia#1\endcsname\empty}
-
-\newtoks\everysetupinteraction
-
-\unexpanded\def\setupinteraction
- {\dosingleargument\dodosetupinteraction}
-
-\def\dodosetupinteraction[#1]% % \dosetupinteraction == special
- {\getparameters[\??ia][#1]%
- \the\everysetupinteraction}
-
-% todo, move partial append to where the action happens
-
-\appendtoks
- \doifelse\@@iastate\v!start
- {\iflocation\else
- \showmessage\m!interactions2{\ifusepagedestinations\space(PAGE)\fi}%
- \global\locationtrue
- \fi}%
- {\iflocation
- \showmessage\m!interactions3{\ifusepagedestinations\space(PAGE)\fi}%
- \global\locationfalse
- \fi}%
- \iflocation
- \setsystemmode \v!interaction
- \else
- \resetsystemmode\v!interaction
- \fi
- \doifsomething\@@iacalculate
- {\doregistercalculationset\@@iacalculate}%
- \doifelse\@@iastrut \v!yes \settrue \setfalse \uselocationstrut
- \doifelse\@@iaclick \v!yes \settrue \setfalse \highlighthyperlinks
- \doifelse\@@iadisplay\v!new \settrue \setfalse \gotonewwindow
- \doifelse\@@iapage \v!yes \settrue \setfalse \usepagedestinations
-\to \everysetupinteraction
-
-\def\synchronizebackendidentity
- {\ctxlua{backends.codeinjections.setupidentity{
- title = \!!bs\@@iatitle\!!es,
- subject = \!!bs\@@iasubtitle\!!es,
- author = \!!bs\@@iaauthor\!!es,
- creator = \!!bs ConTeXt - \contextversion\!!es,
- date = \!!bs\@@iadate\!!es,
- keywords = \!!bs\@@iakeyword\!!es,
- }}}
-
-\appendtoks
- \synchronizebackendidentity
-\to \everyfirstshipout
-
-%D We have to make sure of some settings:
-
-\def\dolocationstartup
- {\iflocation
- \donefalse
- \ifx\@@iaopenaction\empty \else \donetrue
- \ctxlua{jobreferences.checkopendocumentactions("\@@iaopenaction")}%
- \ctxlua{jobreferences.expandcurrent()}%
- \fi
- \ifx\@@iacloseaction\empty \else \donetrue
- \ctxlua{jobreferences.checkclosedocumentactions("\@@iacloseaction")}%
- \ctxlua{jobreferences.expandcurrent()}%
- \fi
- \ifdone
- \ctxlua{jobreferences.flushdocumentactions()}%
- \fi
- \global\let\dolocationstartup\relax
- \fi}
-
-\def\dolocationpagecheck
- {\iflocation
- \donefalse
- \ifx\@@iaopenpageaction\empty \else \donetrue
- \ctxlua{jobreferences.checkopenpageactions("\@@iaopenpageaction")}%
- \ctxlua{jobreferences.expandcurrent()}%
- \fi
- \ifx\@@iaclosepageaction\empty \else \donetrue
- \ctxlua{jobreferences.checkclosepageactions("\@@iaclosepageaction")}%
- \ctxlua{jobreferences.expandcurrent()}%
- \fi
- \ifdone
- \ctxlua{jobreferences.flushpageactions()}%
- \fi
- \fi}
-
-\appendtoks \dolocationstartup \to \everyshipout
-\appendtoks \dolocationpagecheck \to \everyshipout
-
-%D As long as there a natural feeling of what can be considered
-%D hyper active or not, we have to tell users where they can
-%D possibly click. We've already seen a few macros that deal
-%D with this visualization, something we definitely do not let
-%D up to the viewer. One way of telling is using a distinctive
-%D typeface, another way is using color.
-%D
-%D There are two colors involved: one for normal hyperlinks,
-%D and one for those that point to the currentpage, the
-%D contrast color.
-
-\definecolor [interactioncolor] [r=0, g=.6, b=0]
-\definecolor [interactioncontrastcolor] [r=.8, g=0, b=0]
-
-\definecolor [interactiekleur] [interactioncolor]
-\definecolor [interactiecontrastkleur] [interactioncontrastcolor]
-
-%D The next few macros are responsible for highlighting hyper
-%D links. The first one, \type{\showlocation}, is used in those
-%D situations where the typeface is handled by the calling
-%D macro.
-
-%D When we're dealing with pure page references, contrast
-%D colors are used when we are already at the page mentioned.
-
-\def\setlocationcolor#1% not grouped !
- {\ifnum\referencepagestate=\plusone
- \edef\askedcontrastcolor{\csname#1\c!contrastcolor\endcsname}%
- \ifx\askedcontrastcolor\empty
- \dosetcolorattribute{#1}\c!color
- \else
- \dosetcolorattribute{#1}\c!contrastcolor
- \fi
- \else % we could just set and if > 0 set again
- \dosetcolorattribute{#1}\c!color
- \fi}
-
-\def\setlocationfont#1%
- {\dosetfontattribute{#1}\c!style}
-
-\def\setlocationattributes#1%
- {\ifnum\referencepagestate=\plusone
- \edef\askedcontrastcolor{\csname#1\c!contrastcolor\endcsname}%
- \ifx\askedcontrastcolor\empty
- \dosetcolorattribute{#1}\c!color
- \else
- \dosetcolorattribute{#1}\c!contrastcolor
- \fi
- \else % we could just set and if > 0 set again
- \dosetcolorattribute{#1}\c!color
- \fi
- \dosetfontattribute{#1}\c!style}
-
-\def\setlocationcolorspec#1% \resolver
- {\ifnum\referencepagestate=\plusone
- \edef\askedcontrastcolor{#1\c!contrastcolor}%
- \ifx\askedcontrastcolor\empty
- \doactivatecolor{#1\c!color}%
- \else
- \doactivatecolor\askedcontrastcolor
- \fi
- \else
- \doactivatecolor{#1\c!color}%
- \fi}
-
-%D delayed ...
-
-\def\enableinteractivereferences
- {\ifproductionrun
- \ctxlua{jobreferences.enable_interaction()}%
- \globallet\enableinteractivereferences\relax
- \fi}
-
-\appendtoks
- \enableinteractivereferences
-\to \everysetupinteraction
-
-%D More tokens are spend when we want both typeface and color
-%D highlighting.
-
-\def\@@iatimestamp
- {\the\normalyear
- \ifnum\normalmonth<10 0\fi\the\normalmonth
- \ifnum\normalday <10 0\fi\the\normalday}
-
-\setupinteraction % start fit page and reset form
- [\c!state=\v!stop,
- \c!page=\v!no,
- \c!click=\v!yes,
- \c!display=,
- \c!openaction=,
- \c!closeaction=,
- \c!openpageaction=,
- \c!closepageaction=,
- \c!display=\v!normal,
- \c!focus=\v!fit,
- \c!menu=\v!off,
- \c!style=\v!bold,
- \c!calculate=,
- \c!strut=\v!yes,
- \c!split=\v!yes,
- \c!color=interactioncolor,
- \c!contrastcolor=interactioncontrastcolor,
- \c!symbolset=,
- \c!width=1em,
- \c!height=\!!zeropoint,
- \c!depth=\!!zeropoint,
- \c!title=\jobname, % needed for fdf/x
- \c!subtitle=,
- \c!author=,
- \c!keyword=,
- \c!date=\@@iatimestamp]
-
-%D XMP support:
-
-\setupinteraction
- [xmpfile=]
-
-\appendtoks
- % this will move as it is a backend issue
- \doifsomething\@@iaxmpfile
- {\ctxlua{if lpdf then lpdf.setxmpfile("\@@iaxmpfile") end}%
- \globallet\@@iaxmpfile\empty}%
-\to \everysetupinteraction
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-pag.lua b/Master/texmf-dist/tex/context/base/scrn-pag.lua
new file mode 100644
index 00000000000..7003d028508
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-pag.lua
@@ -0,0 +1,27 @@
+if not modules then modules = { } end modules ['scrn-pag'] = {
+ version = 1.001,
+ comment = "companion to scrn-pag.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+interactions = interactions or { }
+interactions.pages = interactions.pages or { }
+local pages = interactions.pages
+
+local codeinjections = backends.codeinjections
+
+local function setupcanvas(specification)
+ codeinjections.setupcanvas(specification)
+end
+
+local function setpagetransition(specification)
+ codeinjections.setpagetransition(specification)
+end
+
+pages.setupcanvas = setupcanvas
+pages.setpagetransition = setpagetransition
+
+commands.setupcanvas = setupcanvas
+commands.setpagetransition = setpagetransition
diff --git a/Master/texmf-dist/tex/context/base/scrn-pag.mkvi b/Master/texmf-dist/tex/context/base/scrn-pag.mkvi
new file mode 100644
index 00000000000..8e1dbde8e9c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-pag.mkvi
@@ -0,0 +1,249 @@
+%D \module
+%D [ file=scrn-pag,
+%D version=1998.01.15,
+%D title=\CONTEXT\ Screen Macros,
+%D subtitle=Pages, % moved code
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% pagecomments will be done differently
+
+\writestatus{loading}{ConTeXt Screen Macros / Pages}
+
+\registerctxluafile{scrn-pag}{1.001}
+
+\unprotect
+
+\installparameterhandler \??sc {interactionscreen}
+\installsetuphandler \??sc {interactionscreen}
+
+\newdimen\canvaswidth
+\newdimen\canvasheight
+\newdimen\canvasbackoffset
+\newdimen\canvastopoffset
+\newdimen\canvasmaxwidth
+\newdimen\canvasmaxheight
+
+\newconditional\scrn_canvas_tight_page
+
+% \def\scrn_canvas_calculate
+% {\begingroup
+% \edef\currentinteractionscreenwidth {\interactionscreenparameter\c!width }%
+% \edef\currentinteractionscreenheight{\interactionscreenparameter\c!height}%
+% \canvasbackoffset\backspace
+% \canvastopoffset\topspace
+% \ifx\currentinteractionscreenwidth\v!fit
+% \global\canvaswidth\leftcombitotal
+% \ifdim\backspace>\canvaswidth
+% \ifdim\backspace>\zeropoint\relax
+% \global\advance\canvasbackoffset -\canvaswidth
+% \fi
+% \fi
+% \global\advance\canvaswidth\dimexpr
+% \rightcombitotal
+% + 2\dimexpr
+% \interactionscreenparameter\c!backspace
+% + \interactionscreenparameter\c!horoffset
+% \relax
+% \relax
+% \donetrue
+% \else\ifx\currentinteractionscreenwidth\v!max
+% \global\canvaswidth\printpaperwidth
+% \donetrue
+% \else
+% \global\canvaswidth\currentinteractionscreenwidth
+% \donefalse
+% \fi\fi
+% \ifdone
+% \ifdim\canvaswidth>\paperwidth\ifdim\canvaswidth>\zeropoint
+% \global\paperwidth\canvaswidth % kills location=middle
+% \fi\fi
+% \fi
+% \ifx\currentinteractionscreenheight\v!fit
+% \global\canvasheight\dimexpr\topheight+\topdistance\relax
+% \ifdim\topspace>\canvasheight
+% \ifdim\topspace>\zeropoint\relax
+% \global\advance\canvastopoffset -\canvasheight
+% \fi
+% \fi
+% \global\advance\canvasheight\dimexpr
+% \makeupheight
+% + \bottomdistance
+% + \bottomheight
+% + 2\dimexpr
+% \interactionscreenparameter\c!topspace
+% + \interactionscreenparameter\c!veroffset
+% \relax
+% \relax
+% \else\ifx\currentinteractionscreenheight\v!max
+% \global\canvasheight\printpaperheight
+% \else
+% \global\canvasheight\currentinteractionscreenheight
+% \fi\fi
+% \ifdone
+% \ifdim\canvasheight>\paperheight\ifdim\canvasheight>\zeropoint
+% \global\paperheight\canvasheight % kills location=middle
+% \fi\fi
+% \fi
+% \endgroup}
+
+\def\scrn_canvas_calculate
+ {\begingroup
+ \edef\currentinteractionscreenwidth {\interactionscreenparameter\c!width }%
+ \edef\currentinteractionscreenheight{\interactionscreenparameter\c!height}%
+ \canvasbackoffset\backspace
+ \canvastopoffset\topspace
+ \ifx\currentinteractionscreenwidth\v!fit
+ \global\canvaswidth\leftcombitotal
+ \ifdim\backspace>\canvaswidth
+ \ifdim\backspace>\zeropoint\relax
+ \global\advance\canvasbackoffset -\canvaswidth
+ \fi
+ \fi
+ \global\advance\canvaswidth\dimexpr
+ \rightcombitotal
+ + 2\dimexpr
+ \interactionscreenparameter\c!backspace
+ + \interactionscreenparameter\c!horoffset
+ \relax
+ \relax
+ \else\ifx\currentinteractionscreenwidth\v!max
+ \global\canvaswidth\printpaperwidth
+ \else
+ \global\canvaswidth\currentinteractionscreenwidth
+ \fi\fi
+ \ifx\currentinteractionscreenheight\v!fit
+ \global\canvasheight\dimexpr\topheight+\topdistance\relax
+ \ifdim\topspace>\canvasheight
+ \ifdim\topspace>\zeropoint\relax
+ \global\advance\canvastopoffset -\canvasheight
+ \fi
+ \fi
+ \global\advance\canvasheight\dimexpr
+ \makeupheight
+ + \bottomdistance
+ + \bottomheight
+ + 2\dimexpr
+ \interactionscreenparameter\c!topspace
+ + \interactionscreenparameter\c!veroffset
+ \relax
+ \relax
+ \else\ifx\currentinteractionscreenheight\v!max
+ \global\canvasheight\printpaperheight
+ \else
+ \global\canvasheight\currentinteractionscreenheight
+ \fi\fi
+ \ifconditional\page_location_is_set
+ \global\setfalse\scrn_canvas_tight_page
+ \fi
+ \ifconditional\scrn_canvas_tight_page
+ \global\canvasmaxwidth \paperwidth
+ \global\canvasmaxheight\paperheight
+ \else
+ \global\canvasmaxwidth \printpaperwidth
+ \global\canvasmaxheight\printpaperheight
+ \fi
+ \endgroup}
+
+% test the next when something is changed here:
+%
+% \setuppapersize[A5][A3] \showframe
+%
+% % \setuplayout[location=middle] \setupinteractionscreen[option=fit]
+% % \setuplayout[location=middle] \setupinteractionscreen[option=auto]
+% % \setupinteractionscreen[option=fit]
+% % \setupinteractionscreen[option=auto]
+%
+% \starttext \input ward \stoptext
+
+\def\scrn_canvas_synchronize_simple
+ {\ctxcommand{setupcanvas{
+ paperwidth = \number\printpaperwidth,
+ paperheight = \number\printpaperheight
+ }}}
+
+\def\scrn_canvas_synchronize_complex
+ {\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
+ }}}
+
+\appendtoks
+ \doifcommonelse{\interactionscreenparameter\c!option}{\v!max,\v!fit}%
+ {\global\settrue \scrn_canvas_tight_page}%
+ {\global\setfalse\scrn_canvas_tight_page}%
+\to \everysetupinteractionscreen
+
+\appendtoks
+ \doifelse\@@pcstate\v!start
+ \scrn_canvas_synchronize_simple
+ \scrn_canvas_synchronize_complex
+\to \everyshipout
+
+\setupinteractionscreen
+ [\c!width=\printpaperwidth,
+ \c!height=\printpaperheight,
+ \c!horoffset=\zeropoint,
+ \c!veroffset=\zeropoint,
+ \c!backspace=\backspace,
+ \c!topspace=\topspace,
+ \c!option=\v!auto]
+
+%D Conditional page breaks:
+
+\unexpanded\def\screen
+ {\dosingleempty\scrn_screen}
+
+\def\scrn_screen[#list]%
+ {\iflocation
+ \page[#list]%
+ \fi}
+
+%D Page transitions:
+
+\let\scrn_transitions_list\empty
+
+\unexpanded\def\setuppagetransitions
+ {\dosingleempty\scrn_transitions_setup}
+
+\def\scrn_transitions_setup[#list]%
+ {\edef\scrn_transitions_list{#list}}
+
+\def\scrn_transitions_set
+ {\iflocation \ifx\scrn_transitions_list\empty \else
+ \scrn_transitions_set_indeed
+ \fi \fi}
+
+\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"
+ }}%
+ \endgroup}
+
+\prependtoks
+ \scrn_transitions_set
+\to \everyshipout
+
+\setupinteractionscreen
+ [\c!delay=\v!none]
+
+\setuppagetransitions
+ [\v!reset]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-ref.lua b/Master/texmf-dist/tex/context/base/scrn-ref.lua
new file mode 100644
index 00000000000..0b1dff2c12e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-ref.lua
@@ -0,0 +1,65 @@
+if not modules then modules = { } end modules ['scrn-int'] = {
+ version = 1.001,
+ comment = "companion to scrn-int.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+interactions = interactions or { }
+interactions.references = interactions.references or { }
+local references = interactions.references
+
+local codeinjections = backends.codeinjections
+
+local expandcurrent = structures.references.expandcurrent
+local identify = structures.references.identify
+
+local function check(what)
+ if what and what ~= "" then
+ local set, bug = identify("",what)
+ return not bug and #set > 0 and set
+ end
+end
+
+local function setopendocumentaction(open)
+ local opendocument = check(open)
+ if opendocument then
+ codeinjections.registerdocumentopenaction(opendocument)
+ expandcurrent()
+ end
+end
+
+local function setclosedocumentaction(close)
+ local closedocument = check(close)
+ if closedocument then
+ codeinjections.registerdocumentcloseaction(closedocument)
+ expandcurrent()
+ end
+end
+
+local function setopenpageaction(open)
+ local openpage = check(open)
+ if openpage then
+ codeinjections.registerpageopenaction(openpage)
+ expandcurrent()
+ end
+end
+
+local function setclosepageaction(close)
+ local closepage = check(close)
+ if closepage then
+ codeinjections.registerpagecloseaction(closepage)
+ expandcurrent()
+ end
+end
+
+references.setopendocument = setopendocumentaction
+references.setclosedocument = setclosedocumentaction
+references.setopenpage = setopenpageaction
+references.setclosepage = setclosepageaction
+
+commands.setopendocumentaction = setopendocumentaction
+commands.setclosedocumentaction = setclosedocumentaction
+commands.setopenpageaction = setopenpageaction
+commands.setclosepageaction = setclosepageaction
diff --git a/Master/texmf-dist/tex/context/base/scrn-ref.mkvi b/Master/texmf-dist/tex/context/base/scrn-ref.mkvi
new file mode 100644
index 00000000000..8c3f4fb4aba
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-ref.mkvi
@@ -0,0 +1,90 @@
+%D \module
+%D [ file=scrn-ref,
+%D version=1998.01.15,
+%D title=\CONTEXT\ Screen Macros,
+%D subtitle=References, % moved code
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Screen Macros / References}
+
+\registerctxluafile{scrn-ref}{1.001}
+
+\unprotect
+
+\appendtoks
+ \doifsomething{\interactionparameter\c!calculate}{\doregistercalculationset{\interactionparameter\c!calculate}}%
+ \doifelse{\interactionparameter\c!click }\v!yes \settrue \setfalse \highlighthyperlinks
+ \doifelse{\interactionparameter\c!display}\v!new \settrue \setfalse \gotonewwindow
+ \doifnot {\interactionparameter\c!page }\v!no \scrn_reference_enable_page_destinations
+\to \everysetupinteraction
+
+\def\scrn_reference_enable_page_destinations % no reset
+ {\ctxlua{structures.references.setinnermethod("\interactionparameter\c!page")}}
+
+\setupinteraction % start fit page and reset form
+ [\c!page=\v!no,
+ \c!click=\v!yes,
+ \c!display=\v!normal,
+ \c!focus=\v!fit,
+ \c!calculate=,
+ % rendering:
+ \c!width=1em,
+ \c!height=\zeropoint,
+ \c!depth=\zeropoint,
+ \c!symbolset=]
+
+%D We have to make sure of some settings:
+
+\def\scrn_reference_set_text_actions
+ {\iflocation
+ \edef\currentinteractionopenaction {\interactionparameter\c!openaction }%
+ \edef\currentinteractioncloseaction{\interactionparameter\c!closeaction}%
+ \ifx\currentinteractionopenaction\empty \else
+ \ctxcommand{setopendocumentaction("\currentinteractionopenaction")}%
+ \fi
+ \ifx\currentinteractioncloseaction\empty \else
+ \ctxcommand{setclosedocumentaction("\currentinteractioncloseaction")}%
+ \fi
+ \glet\scrn_reference_set_text_actions\relax
+ \fi}
+
+\def\scrn_reference_set_page_actions
+ {\iflocation
+ \edef\currentinteractionopenpageaction {\interactionparameter\c!openpageaction }%
+ \edef\currentinteractionclosepageaction{\interactionparameter\c!closepageaction}%
+ \ifx\currentinteractionopenpageaction\empty \else
+ \ctxcommand{setopenpageaction("\currentinteractionopenpageaction")}%
+ \fi
+ \ifx\currentinteractionclosepageaction\empty \else
+ \ctxcommand{setclosepageaction("\currentinteractionclosepageaction")}%
+ \fi
+ \fi}
+
+\appendtoks \scrn_reference_set_text_actions \to \everyshipout
+\appendtoks \scrn_reference_set_page_actions \to \everyshipout
+
+%D delayed ...
+
+\def\scrn_reference_enable_references
+ {\ifproductionrun
+ \ctxlua{structures.references.enableinteraction()}%
+ \glet\scrn_reference_enable_references\relax
+ \fi}
+
+\appendtoks
+ \scrn_reference_enable_references
+\to \everysetupinteraction
+
+\setupinteraction % start fit page and reset form
+ [\c!openaction=,
+ \c!closeaction=,
+ \c!openpageaction=,
+ \c!closepageaction=]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrn-wid.lua b/Master/texmf-dist/tex/context/base/scrn-wid.lua
new file mode 100644
index 00000000000..7b1dd940a2c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-wid.lua
@@ -0,0 +1,194 @@
+if not modules then modules = { } end modules ['scrn-wid'] = {
+ version = 1.001,
+ comment = "companion to scrn-wid.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+interactions = interactions or { }
+local interactions = interactions
+
+local attachments = { }
+local comments = { }
+local soundclips = { }
+local renderings = { }
+local linkedlists = { }
+
+interactions.attachments = attachments
+interactions.soundclips = soundclips
+interactions.renderings = renderings
+interactions.linkedlists = linkedlists
+
+local jobpasses = job.passes
+
+local codeinjections = backends.codeinjections
+local nodeinjections = backends.nodeinjections
+
+local variables = interfaces.variables
+local v_auto = variables.auto
+
+-- Symbols
+
+function commands.presetsymbollist(list)
+ codeinjections.presetsymbollist(list)
+end
+
+-- Attachments
+--
+-- registered : unique id
+-- tag : used at the tex end
+-- file : name that the file has on the filesystem
+-- name : name that the file will get in the output
+-- title : up to the backend
+-- subtitle : up to the backend
+-- author : up to the backend
+-- method : up to the backend (hidden == no rendering)
+
+local nofautoattachments, lastregistered = 0, nil
+
+local function checkregistered(specification)
+ local registered = specification.registered
+ if not registered or registered == "" or registered == v_auto then
+ nofautoattachments = nofautoattachments + 1
+ lastregistered = "attachment-" .. nofautoattachments
+ specification.registered = lastregistered
+ return lastregistered
+ else
+ return registered
+ end
+end
+
+local function checkbuffer(specification)
+ local buffer = specification.buffer
+ if buffer ~= "" then
+ specification.data = buffers.getcontent(buffer) or "<no data>"
+ end
+end
+
+function attachments.register(specification)
+ checkregistered(specification)
+ checkbuffer(specification)
+ attachments[lastregistered] = specification
+ return specification
+end
+
+function attachments.insert(specification)
+ local registered = checkregistered(specification)
+ local r = attachments[registered]
+ if r then
+ for k, v in next, r do
+ local s = specification[k]
+ if s == "" then
+ specification[k] = v
+ end
+ end
+ end
+ checkbuffer(specification)
+ return nodeinjections.attachfile(specification)
+end
+
+commands.registerattachment = attachments.register
+
+function commands.insertattachment(specification)
+ tex.box["scrn_attachment_box_link"] = attachments.insert(specification)
+end
+
+-- Comment
+
+function comments.insert(specification)
+ local buffer = specification.buffer
+ if buffer ~= "" then
+ specification.data = buffers.getcontent(buffer) or ""
+ end
+ return nodeinjections.comment(specification)
+end
+
+function commands.insertcomment(specification)
+ tex.box["scrn_comment_box_link"] = comments.insert(specification)
+end
+
+-- Soundclips
+
+function soundclips.register(specification)
+ local tag = specification.tag
+ if tag and tag ~= "" then
+ local filename = specification.file
+ if not filename or filename == "" then
+ filename = tag
+ specification.file = filename
+ end
+ soundclips[tag] = specification
+ return specification
+ end
+end
+
+function soundclips.insert(tag)
+ local sc = soundclips[tag]
+ if not sc then
+ -- todo: message
+ return soundclips.register { tag = tag }
+ else
+ return sc
+ end
+end
+
+commands.registersoundclip = soundclips.register
+commands.insertsoundclip = soundclips.insert
+
+-- Renderings
+
+function renderings.register(specification)
+ if specification.label then
+ renderings[specification.label] = specification
+ return specification
+ end
+end
+
+function renderings.rendering(label)
+ local rn = renderings[label]
+ if not rn then
+ -- todo: message
+ return renderings.register { label = label }
+ else
+ return rn
+ end
+end
+
+function renderings.var(label,key)
+ local rn = renderings[label]
+ context(rn and rn[key] or "")
+end
+
+-- Rendering:
+
+function commands.insertrenderingwindow(specification)
+ codeinjections.insertrenderingwindow(specification)
+end
+
+-- Linkedlists (only a context interface)
+
+function commands.definelinkedlist(tag)
+ -- no need
+end
+
+function commands.enhancelinkedlist(tag,n)
+ local ll = jobpasses.gettobesaved(tag)
+ if ll then
+ ll[n] = texcount.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
diff --git a/Master/texmf-dist/tex/context/base/scrn-wid.mkvi b/Master/texmf-dist/tex/context/base/scrn-wid.mkvi
new file mode 100644
index 00000000000..72f5255bbce
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrn-wid.mkvi
@@ -0,0 +1,702 @@
+%D \module
+%D [ file=scrn-int,
+%D version=2011.02.27, % moved from scrn-int
+%D title=\CONTEXT\ Core Macros,
+%D subtitle=Widgets,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Interaction Macros / Widgets}
+
+\registerctxluafile{scrn-wid}{1.001}
+
+% todo: expansion in comments (default is expanded)
+
+\unprotect
+
+%D Attachments (mkiv upgraded):
+%D
+%D As usual in \CONTEXT\ we separate the general definition (frontend)
+%D and the rendering (backend).
+
+% old but stil valid method:
+%
+% \useattachment[test.tex]
+% \useattachment[whatever][test.tex]
+% \useattachment[whatever][newname][test.tex]
+% \useattachment[whatever][title][newname][test.tex]
+%
+% new method:
+%
+% \registerattachment[sometag][specification] % name file author title subtitle
+%
+% \attachment[sometag][extra specs]
+% \attachment[test.tex]
+% \attachment[file=test.tex]
+% \attachment[file=test.tex,method=hidden]
+% \attachment[name=newname,file=test.tex]
+% \attachment[title=mytitle,name=newname,file=test.tex]
+%
+% indirect
+%
+% \defineattachment[whatever5][file=test.tex] \attachment[whatever5][method=hidden]
+% \defineattachment[whatever5][file=test.tex,method=hidden] \attachment[whatever5]
+%
+% direct (no definitions)
+%
+% \attachment[test][file=oeps.tex,title=Oeps,author=Hans,subtitle=TeX File,method=hidden]
+% \attachment[label=test,file=oeps.tex,title=Oeps,author=Hans,subtitle=TeX File,method=hidden]
+%
+% autolabel:
+%
+% \attachment[file=oeps.tex,title=Oeps,author=Hans,subtitle=TeX File,method=hidden]
+%
+% % \setupattachments[\c!symbol={symbol-normal,symbol-down}]
+
+% startattachment -> temp file
+
+\newbox\scrn_attachment_box_collect
+\newbox\scrn_attachment_box_link
+\newbox\scrn_attachment_box_symbol
+
+\installcommandhandler\??at{attachment}\??at
+
+\let\setupattachments\setupattachment % convenience and compatibility
+
+\setupattachment
+ [\c!state=\v!start,
+ \c!color=\interactionparameter\c!color,
+ %\c!textlayer=,
+ %\c!symbol=,
+ %\c!title=,
+ %\c!subtitle=,
+ %\c!file=, % input filename
+ %\c!name=, % new filename
+ %\c!author=,
+ %\c!method=, % \v!hidden = not in menu
+ %\c!buffer=
+ \c!symbol=,
+ \c!distance=1em,
+ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!depth=\v!fit,
+ \c!location=\v!high]
+
+\unexpanded\def\registerattachment
+ {\dodoubleempty\scrn_attachment_register}
+
+\def\scrn_attachment_register[#tag][#settings]% we save (globally) at the lua end
+ {\ifsecondargument
+ \begingroup
+ \def\currentattachment{_}%
+ \setupattachment[_][#settings,\s!parent=\??at]%
+ \ctxcommand{registerattachment{
+ tag = "#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",
+ }}%
+ \endgroup
+ \fi}
+
+\appendtoks
+ \setuevalue \currentattachment {\scrn_attachment_direct{\currentattachment}}%
+ \setuevalue{\e!start\currentattachment}{\scrn_attachment_start {\currentattachment}}%
+ \setuevalue{\e!stop \currentattachment}{\scrn_attachment_stop }%
+\to \everydefineattachment
+
+\unexpanded\def\scrn_attachment_direct#tag%
+ {\edef\currentattachment{#tag}%
+ \doifelselocation
+ {\dodoubleempty\scrn_attachment_direct_status}
+ {\dodoubleempty\scrn_attachment_direct_ignore}}
+
+\def\scrn_attachment_direct_status
+ {\doifelse{\attachmentparameter\c!state}\v!start
+ \scrn_attachment_direct_indeed
+ \scrn_attachment_direct_ignore}
+
+\def\scrn_attachment_direct_indeed[#registered][#settings]%
+ {\bgroup
+ \doifelsenothing{#registered}
+ {\scrn_attachment_inject[\v!auto][]}
+ {\doifassignmentelse{#registered}
+ {\scrn_attachment_inject[\v!auto][#registered]}
+ {\scrn_attachment_inject[#registered][#settings]}}%
+ \egroup}
+
+\def\scrn_attachment_direct_ignore[#tag][#settings]%
+ {}
+
+\unexpanded\def\scrn_attachment_start#tag%
+ {\edef\currentattachment{#tag}%
+ \doifelselocation
+ {\dodoubleempty\scrn_attachment_start_indeed}
+ {\dodoubleempty\scrn_attachment_start_ignore}}
+
+\unexpanded\def\scrn_attachment_stop
+ {}
+
+\def\scrn_attachment_start_indeed
+ {\doif{\attachmentparameter\c!state}\v!start
+ {\scrn_attachment_start_indeed}
+ {\scrn_attachment_start_ignore}}
+
+\def\scrn_attachment_start_indeed[#registered][#settings]%
+ {\bgroup
+ \doifelsenothing{#registered}
+ {\def\scrn_attachment_stop{\scrn_attachment_inject[\v!auto][\c!buffer=\v!attachment]\egroup}}%
+ {\doifassignmentelse{#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}}}%
+ \dostartbuffer[\v!attachment][\e!start\currentattachment][\e!stop\currentattachment]}
+
+\def\scrn_attachment_start_ignore
+ {\expandafter\gobbleuntil\csname\e!stop\currentattachment\endcsname}
+
+\def\scrn_attachment_inject[#registered][#settings]%
+ {\edef\currentattachmentregistered{#registered}%
+ \setupattachment[\currentattachment][#settings]%
+ \expandcheckedcsname{scrn_attachment_method_}{\attachmentparameter\c!method}\v!normal}
+
+\setvalue{scrn_attachment_method_\v!normal}%
+ {\edef\currentattachmentsymbol{\attachmentparameter\c!symbol}%
+ \edef\currentattachmentwidth {\attachmentparameter\c!width }%
+ \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\currentattachmentdepth \v!fit\let \currentattachmentdepth \zeropoint\fi
+ \else
+ \ctxcommand{presetsymbollist("\attachmentparameter\c!symbol")}%
+ % we cannot yet ask for the wd/ht/dp of an xform else we could use those
+ \setbox\scrn_attachment_box_symbol\hbox{\symbol[\lastpredefinedsymbol]}%
+ \ifx\currentattachmentwidth \v!fit\edef\currentattachmentwidth {\wd\scrn_attachment_box_symbol}\fi
+ \ifx\currentattachmentheight\v!fit\edef\currentattachmentheight{\ht\scrn_attachment_box_symbol}\fi
+ \ifx\currentattachmentdepth \v!fit\edef\currentattachmentdepth {\dp\scrn_attachment_box_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\currentcolormodel,
+ colorvalue = \thecolorattribute{\attachmentparameter\c!color},
+ transparencyvalue = \thetransparencyattribute{\attachmentparameter\c!color},
+ 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",
+ }}%
+ \setbox\scrn_attachment_box_link\hbox{\scrn_attachment_place}%
+ \wd\scrn_attachment_box_link\currentattachmentwidth
+ \ht\scrn_attachment_box_link\currentattachmentheight
+ \dp\scrn_attachment_box_link\currentattachmentdepth
+ \box\scrn_attachment_box_link}
+
+\setvalue{scrn_attachment_method_\v!hidden}%
+ {\ctxcommand{insertattachment{
+ tag = "\currentattachment",
+ registered = "\currentattachmentregistered",
+ method = "\v!hidden"
+ }}}
+
+\def\scrn_attachment_place
+ {\executeifdefined
+ {\??at:\c!location:\attachmentparameter\c!location}\hbox
+ {\box\scrn_attachment_box_link}}
+
+\setvalue{\??at:\c!location:\v!inmargin }{\inmargin }
+\setvalue{\??at:\c!location:\v!leftedge }{\inleftedge }
+\setvalue{\??at:\c!location:\v!rightedge }{\inrightedge }
+\setvalue{\??at:\c!location:\v!leftmargin }{\inleftmargin }
+\setvalue{\??at:\c!location:\v!rightmargin}{\inrightmargin}
+\setvalue{\??at:\c!location:\v!high }{\high}
+\setvalue{\??at:\c!location:\v!none }{\scrn_attachment_collect}
+
+\def\scrn_attachment_collect#content%
+ {\global\setbox\scrn_attachment_box_collect\hbox\bgroup
+ \ifvoid\scrn_attachment_box_collect\else
+ \box\scrn_attachment_box_collect
+ \hskip\attachmentparameter\c!distance
+ \fi
+ #content%
+ \egroup}
+
+\unexpanded\def\placeattachments
+ {\ifvoid\scrn_attachment_box_collect\else
+ \box\scrn_attachment_box_collect
+ \fi}
+
+\defineattachment[attachment]
+
+% \ifx\currentinterface\defaultinterface \else
+% \defineattachment[\v!attachment]
+% \fi
+
+% backward compatible:
+
+\unexpanded\def\useattachment
+ {\doquadrupleempty\scrn_attachment_use}
+
+\def\scrn_attachment_use[#tag][#title][#name][#file]%
+ {\iffourthargument
+ \registerattachment[#tag][title=#title,name=#name,file=#file]%
+ \else\ifthirdargument
+ \registerattachment[#tag][title=#title,name=#title,file=#name]%
+ \else\ifsecondargument
+ \registerattachment[#tag][title=#title,name=#title,file=#title]%
+ \else
+ \registerattachment[#tag][title=#title,name=#tag,file=#tag]%
+ \fi\fi\fi}
+
+%D Comments:
+
+% test
+%
+% \startcomment
+% hello beautiful\\world
+% \stopcomment
+%
+% test
+%
+% \startcomment[hello]
+% hello << eerste >>
+% beautiful
+% world
+% \stopcomment
+%
+% test
+%
+% \startcomment[hello][color=green,width=10cm,height=3cm]
+% hello
+% beautiful
+% world
+% \stopcomment
+%
+% test
+%
+% \startcomment[hello][color=red,width=4cm,height=3cm]
+% hello
+%
+% beautiful
+%
+% world
+% \stopcomment
+%
+% test
+%
+% \startcomment[symbol=Balloon]
+% Do we want this kind of rubish?
+% \stopcomment
+%
+% test
+%
+% \definesymbol [comment-normal][{\externalfigure[cow.pdf]}]
+% \definesymbol [comment-down] [{\externalfigure[cow.pdf]}]
+%
+% \def\CowSymbol#1#2%
+% {\scale
+% [\c!height=#1]
+% {\startMPcode
+% loadfigure "koe.mp" number 1 ;
+% refill currentpicture withcolor #2 ;
+% \stopMPcode}}
+%
+% \definesymbol [comment-normal]
+% [\CowSymbol{4ex}{red}]
+%
+% \definesymbol [comment-down]
+% [\CowSymbol{4ex}{green}]
+%
+% \setupcomment
+% [\c!symbol={comment-normal,comment-down},
+% \c!option=\v!buffer]
+%
+% \startcomment[hello]
+% oeps
+% \stopcomment
+%
+% test
+%
+% \setupcomment
+% [\c!symbol=normal,
+% \c!option=max,width=10cm]
+%
+% \startcomment[hello]
+% oeps
+% \stopcomment
+%
+% test
+
+\installcommandhandler\??cc{comment}\??cc
+
+\newbox\scrn_comment_box_collect
+\newbox\scrn_comment_box_rendering
+\newbox\scrn_comment_box_link
+\newbox\scrn_comment_box_symbol
+
+\setupcomment
+ [\c!state=\v!start,
+ \c!distance=1em,
+ \c!color=\interactionparameter\c!color,
+ \c!space=\v!no,
+ \c!symbol=,
+ %\c!title=,
+ %\c!option=,
+ %\c!textlayer=,
+ \c!width=\v!fit,
+ \c!height=\v!fit,
+ \c!depth=\v!fit,
+ \c!nx=40,
+ \c!ny=10,
+ \c!location=\v!high]
+
+\presetlocalframed[\??cc]
+
+\appendtoks
+ \setuevalue \currentcomment {\scrn_comment_argument{\currentcomment}}%
+ \setuevalue{\e!start\currentcomment}{\scrn_comment_start {\currentcomment}}%
+ \setuevalue{\e!stop \currentcomment}{\scrn_comment_stop }%
+\to \everydefinecomment
+
+\unexpanded\def\scrn_comment_argument#category%
+ {\def\currentcomment{#category}%
+ \doifelselocation
+ {\dodoubleempty\scrn_comment_argument_status}
+ {\dodoubleempty\scrn_comment_argument_ignore}}
+
+\def\scrn_comment_argument_status
+ {\doifelse{\commentparameter\c!state}\v!start
+ \scrn_comment_argument_indeed
+ \scrn_comment_argument_ignore}
+
+\def\scrn_comment_argument_indeed[#title][#settings]#text%
+ {\doifassignmentelse{#title}
+ {\setupcomment[\currentcomment][#title]}
+ {\setupcomment[\currentcomment][\c!title=#title,#settings]}%
+ \ctxlua{buffers.assign("\v!comment",\!!bs#text\!!es)}% todo: expansion control, but expanded by default (xml)
+ \scrn_comment_inject
+ \ignorespaces}
+
+\def\scrn_comment_argument_ignore[#title][#settings]#text%
+ {\ignorespaces}
+
+\unexpanded\def\scrn_comment_start#category%
+ {\def\currentcomment{#category}%
+ \doifelselocation
+ {\dodoubleempty\scrn_comment_start_indeed}
+ {\dodoubleempty\scrn_comment_start_ignore}}
+
+\def\scrn_comment_start_indeed
+ {\doifelse{\commentparameter\c!state}\v!start
+ {\scrn_comment_start_indeed}
+ {\scrn_comment_start_ignore}}
+
+\def\scrn_comment_start_indeed[#title][#settings]%
+ {\bgroup
+ \doifassignmentelse{#title}
+ {\setupcomment[\currentcomment][#title]}
+ {\setupcomment[\currentcomment][\c!title=#title,#settings]}%
+ \def\scrn_comment_stop{\scrn_comment_inject\egroup}%
+ \dostartbuffer[\v!comment][\e!start\currentcomment][\e!stop\currentcomment]}
+
+\def\scrn_comment_start_ignore
+ {\expandafter\gobbleuntil\csname\e!stop\currentcomment\endcsname}
+
+\unexpanded\def\scrn_comment_stop
+ {}
+
+\def\scrn_comment_inject
+ {\expandcheckedcsname{scrn_comment_method_}{\commentparameter\c!method}\v!normal}
+
+%D Beware: comments symbols don't scale in acrobat (cf. spec but somewhat
+%D weird, esp because for instance attachment symbols do scale).
+
+\setvalue{scrn_comment_method_\v!normal}%
+ {\edef\currentcommentsymbol{\commentparameter\c!symbol}%
+ \edef\currentcommentwidth {\commentparameter\c!width }%
+ \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\currentcommentdepth \v!fit\let \currentcommentdepth \zeropoint\fi
+ \else
+ \ctxcommand{presetsymbollist("\commentparameter\c!symbol")}%
+ % we cannot yet ask for the wd/ht/dp of an xform else we could use those
+ \setbox\scrn_comment_box_symbol\hbox{\symbol[\lastpredefinedsymbol]}%
+ \ifx\currentcommentwidth \v!fit\edef\currentcommentwidth {\wd\scrn_comment_box_symbol}\fi
+ \ifx\currentcommentheight\v!fit\edef\currentcommentheight{\ht\scrn_comment_box_symbol}\fi
+ \ifx\currentcommentdepth \v!fit\edef\currentcommentdepth {\dp\scrn_comment_box_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\currentcolormodel,
+ 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"
+ }}%
+ \wd\scrn_comment_box_link\currentcommentwidth
+ \ht\scrn_comment_box_link\currentcommentheight
+ \dp\scrn_comment_box_link\currentcommentdepth
+ \scrn_comment_place}
+
+\setvalue{scrn_comment_method_\v!hidden}%
+ {}
+
+% todo: dedicated margin classes
+
+\def\scrn_comment_place
+ {\executeifdefined
+ {\??cc:\c!location:\commentparameter\c!location}\hbox
+ {\hbox{\box\scrn_comment_box_link}}}
+
+\setvalue{\??cc:\c!location:\v!inmargin }{\inmargin }
+\setvalue{\??cc:\c!location:\v!leftedge }{\inleftedge }
+\setvalue{\??cc:\c!location:\v!rightedge }{\inrightedge }
+\setvalue{\??cc:\c!location:\v!leftmargin }{\inleftmargin }
+\setvalue{\??cc:\c!location:\v!rightmargin}{\inrightmargin}
+\setvalue{\??cc:\c!location:\v!high }{\high}
+\setvalue{\??cc:\c!location:\v!none }{\scrn_comment_collect}
+
+\def\scrn_comment_collect#content%
+ {\global\setbox\scrn_comment_box_collect\hbox\bgroup
+ \ifvoid\scrn_comment_box_collect\else
+ \box\scrn_comment_box_collect
+ \hskip\commentparameter\c!distance
+ \fi
+ #content%
+ \egroup}
+
+\unexpanded\def\placecomments
+ {\ifvoid\scrn_comment_box_collect\else
+ \box\scrn_comment_box_collect
+ \fi}
+
+\definecomment[comment]
+
+% \ifx\currentinterface\defaultinterface \else
+% \definecomment[\v!comment]
+% \fi
+
+%D Soundclips:
+%D
+%D Defining sound tracks:
+%D
+%D \starttyping
+%D \useexternalsoundtrack[label][file]
+%D \stoptyping
+%D
+%D associated actions: StartSound StopSound PauseSound ResumeSound
+%D
+%D Todo: like external figures, also search on path,
+%D although, they need to be present ar viewing time, so ...
+
+\unexpanded\def\useexternalsoundtrack
+ {\dodoubleargument\scrn_soundtrack_indeed}
+
+\def\scrn_soundtrack_indeed[#tag][#filename]%
+ {\ctxcommand{registersoundclip{
+ tag = "#tag",
+ file = "#filename"
+ }}}
+
+\def\checksoundtrack#tag% yet untested in mkiv (also move management to lua)
+ {\iflocation
+ \ctxcommand{insertsoundclip{
+ tag = "#tag",
+ repeat = "\@@sdoption", % not entirely ok but works
+ }}%
+ \fi}
+
+\unexpanded\def\setupexternalsoundtracks
+ {\dodoubleargument\getparameters[\??sd]}
+
+\setupexternalsoundtracks
+ [\c!option=]
+
+%D Renderings (not yet tested in mkvi):
+
+% Todo: multiple instances and inheritance .. will be done when
+% needed i.e. when I see usage.
+
+\let\currentrendering\empty
+
+\definereference[StartCurrentRendering] [\v!StartRendering {\currentrendering}]
+\definereference[StopCurrentRendering] [\v!StopRendering {\currentrendering}]
+\definereference[PauseCurrentRendering] [\v!PauseRendering {\currentrendering}]
+\definereference[ResumeCurrentRendering][\v!ResumeRendering{\currentrendering}]
+
+\def\useexternalrendering{\doquadrupleempty\scrn_rendering_use}
+\def\setinternalrendering{\dodoubleempty \scrn_rendering_set}
+
+\def\scrn_rendering_use[#tag][#mime][#file][#option]%
+ {\ctxlua{interactions.renderings.register {
+ type = "external",
+ label = "#tag",
+ mime = "#mime",
+ filename = "#file",
+ option = "#option",
+ }}}
+
+\def\scrn_rendering_set[#tag][#option]% {content}
+ {\bgroup
+ \dowithnextbox
+ {\ctxlua{interactions.renderings.register {
+ type = "internal",
+ label = "#tag",
+ mime = "IRO", % brrr
+ filename = "#tag",
+ option = "#option",
+ }}%
+ \let\objectoffset\zeropoint
+ \setobject{IRO}{#tag}\hbox{\box\nextbox}%
+ \egroup}%
+ \hbox}
+
+\def\renderingtype #tag{\ctxlua{interactions.renderings.var("#tag","type")}}
+\def\renderingoption#tag{\ctxlua{interactions.renderings.var("#tag","option")}}
+
+\def\renderingwidth {8cm} % will become private
+\def\renderingheight {6cm} % will become private
+
+\unexpanded\def\definerenderingwindow
+ {\dodoubleempty\scrn_rendering_define_window}
+
+\def\scrn_rendering_define_window[#tag][#settings]%
+ {\presetlocalframed[\??rw#tag]%
+ \getparameters
+ [\??rw#tag]%
+ [\c!openpageaction=,\c!closepageaction=,%
+ \c!width=\renderingwidth,\c!height=\renderingheight,%
+ #settings]}
+
+\unexpanded\def\setuprenderingwindow
+ {\dodoubleargument\scrn_rendering_setup_window}
+
+\def\scrn_rendering_setup_window[#tag]%
+ {\getparameters[\??rw#tag]}
+
+\unexpanded\def\placerenderingwindow
+ {\dodoubleempty\scrn_rendering_place_window}
+
+\def\scrn_rendering_place_window[#window][#rendering]%
+ {\bgroup
+ \edef\currentrendering{\ifsecondargument#rendering\else#window\fi}%
+ \doifelse{\renderingtype\currentrendering}{internal} % an object
+ {\getobjectdimensions{IRO}\currentrendering
+ \edef\renderingheight{\the\dimexpr\objectheight+\objectdepth\relax}%
+ \edef\renderingwidth{\objectwidth}%
+ \dogetobjectreferencepage{IRO}\currentrendering\renderingpage}%
+ {\def\renderingheight{\vsize}%
+ \def\renderingwidth{\hsize}%
+ \def\renderingpage{\realpageno}}%
+ % create fall back if needed
+ \ifcsname\??rw#window\c!width\endcsname
+ \def\currentrenderingwindow{#window}%
+ \else
+ \let\currentrenderingwindow\s!default
+ \scrn_rendering_define_window[\currentrenderingwindow]%
+ \fi
+% todo
+% \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!openpageaction }}\dosetuprenderingopenpageaction
+% \handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!closepageaction}}\dosetuprenderingclosepageaction
+ \localframed
+ [\??rw\currentrenderingwindow][\c!offset=\v!overlay]%
+ {\vfill
+ \ctxcommand{insertrenderingwindow {
+ label = "\currentrendering",
+ width = \number\dimexpr\renderingwidth\relax,
+ height = \number\dimexpr\renderingheight\relax,
+ option = "\renderingoption\currentrendering",
+ page = \number\renderingpage,
+ }}\hfill}%
+ \egroup}
+
+%D Linkedlists (not tested in mkvi):
+
+% %D The next mechanism, linked lists, is quite old and
+% %D is \MKIV'd for completeness. I will finish the
+% %D configuration part when I need it.
+% %D
+% %D \starttyping
+% %D \setupinteraction[state=start]
+% %D \definelinkedlist[demo]
+% %D \dorecurse{10}{\linkedlistelement[demo]{link \recurselevel} \page}
+% %D \stoptyping
+%
+% \installcommandhandler\??lk{linkedlist}\??lk
+%
+% \let\setupbutton\setuplinkedlists\setuplinkedlist
+%
+% \appendtoks
+% \ctxcommand{definelinkedlist("\currentlinkedlist")}%
+% \to \everydefinelinkedlist
+%
+% \def\setlinkedlistproperties#1#2#3#4#5#6%
+% {\def\currentlink {#1}%
+% \def\noflinks {#2}%
+% \def\firstlink {#3}%
+% \def\previouslink{#4}%
+% \def\nextlink {#5}%
+% \def\lastlink {#6}}
+%
+% \def\linkedlistelement[#1]#2% currently no view support
+% {\dontleavehmode\hbox\bgroup
+% #2%
+% \iflocation
+% \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
+% \dogotosomepage {\??lk\currentlinkedlist}\gotobegincharacter \firstlink
+% \ifnum\noflinks>\plustwo
+% \dogotosomepage{\??lk\currentlinkedlist}\gobackwardcharacter\previouslink
+% \dogotosomepage{\??lk\currentlinkedlist}\goforwardcharacter \nextlink
+% \fi
+% \dogotosomepage {\??lk\currentlinkedlist}\gotoendcharacter \lastlink
+% \else
+% \writestatus\m!interactions{no such linked list: \currentlinkedlist}%
+% \fi
+% \fi
+% \egroup}
+%
+% \setuplinkedlists
+% [\c!distance=.25em,
+% \c!width=\v!fit,
+% \c!location=\v!low,
+% \c!color=\interactionparameter\c!color,
+% \c!frame=\v!off,
+% \c!background=,
+% \c!backgroundcolor=]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/scrp-cjk.lua b/Master/texmf-dist/tex/context/base/scrp-cjk.lua
index 997baaa962b..d817c28cf86 100644
--- a/Master/texmf-dist/tex/context/base/scrp-cjk.lua
+++ b/Master/texmf-dist/tex/context/base/scrp-cjk.lua
@@ -7,28 +7,28 @@ if not modules then modules = { } end modules ['scrp-cjk'] = {
}
local has_attribute = node.has_attribute
-local make_glue_node = nodes.glue
-local make_penalty_node = nodes.penalty
local insert_node_after = node.insert_after
local insert_node_before = node.insert_before
local remove_node = nodes.remove
-local glyph = node.id('glyph')
-local glue = node.id('glue')
-local penalty = node.id('penalty')
+local nodepool = nodes.pool
+local new_glue = nodepool.glue
+local new_penalty = nodepool.penalty
-local preproc = attributes.private('preproc')
-local prestat = attributes.private('prestat')
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
-scripts.cjk = scripts.cjk or { }
+local a_prestat = attributes.private('prestat')
+local a_preproc = attributes.private('preproc')
-local kind_to_number = scripts.kind_to_number
-local number_to_kind = scripts.number_to_kind
-local hash = scripts.hash
-local cjk = scripts.cjk
+local categorytonumber = scripts.categorytonumber
+local numbertocategory = scripts.numbertocategory
+local hash = scripts.hash
+local numbertodataset = scripts.numbertodataset
-local fontdata = fonts.identifiers
-local quaddata = fonts.quads
+local fonthashes = fonts.hashes
+local fontdata = fonthashes.identifiers
+local quaddata = fonthashes.quads
-- raggedleft is controlled by leftskip and we might end up with a situation where
-- the intercharacter spacing interferes with this; the solution is to patch the
@@ -50,123 +50,135 @@ end
-- at font definition time and/or just assume a correct font
local function nobreak(head,current)
- insert_node_before(head,current,make_penalty_node(10000))
+ insert_node_before(head,current,new_penalty(10000))
end
+
local function stretch_break(head,current)
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
end
+
local function shrink_break(head,current)
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
end
+
local function nobreak_stretch(head,current)
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
end
+
local function korean_break(head,current)
- insert_node_before(head,current,make_penalty_node(inter_char_hangul_penalty))
+ insert_node_before(head,current,new_penalty(inter_char_hangul_penalty))
end
local function nobreak_shrink(head,current)
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
end
+
local function nobreak_autoshrink(head,current)
if true then
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
end
end
local function nobreak_stretch_nobreak_shrink(head,current)
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
end
+
local function nobreak_stretch_nobreak_autoshrink(head,current)
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
if true then
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
end
end
local function nobreak_shrink_nobreak_stretch(head,current)
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
end
+
local function nobreak_autoshrink_nobreak_stretch(head,current)
if true then
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
end
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
end
local function nobreak_shrink_break_stretch(head,current)
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
end
+
local function nobreak_autoshrink_break_stretch(head,current)
if true then
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
end
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
end
local function nobreak_shrink_break_stretch_nobreak_shrink(head,current)
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
end
+
local function nobreak_autoshrink_break_stretch_nobreak_autoshrink(head,current)
if true then
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
end
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
if true then
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
end
end
+
local function nobreak_autoshrink_break_stretch_nobreak_shrink(head,current)
if true then
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
end
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
end
+
local function nobreak_shrink_break_stretch_nobreak_autoshrink(head,current)
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
if true then
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
end
end
local function nobreak_stretch_break_shrink(head,current)
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
end
+
local function nobreak_stretch_break_autoshrink(head,current)
- insert_node_before(head,current,make_penalty_node(10000))
- insert_node_before(head,current,make_glue_node(0,inter_char_stretch,0))
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,new_glue(0,inter_char_stretch,0))
if true then
- insert_node_before(head,current,make_glue_node(0,0,inter_char_half_shrink))
+ insert_node_before(head,current,new_glue(0,0,inter_char_half_shrink))
end
end
@@ -307,28 +319,22 @@ local injectors = { -- [previous] [current]
},
}
-local dataset = {
- inter_char_stretch_factor = 0.50, -- of quad
- inter_char_half_shrink_factor = 0.50, -- of quad
- inter_char_hangul_penalty = 50,
-}
-
local function process(head,first,last)
if first ~= last then
- local lastfont, previous, originals, last = nil, "start", nil, nil
+ local lastfont, previous, last = nil, "start", nil
while true do
local upcoming, id = first.next, first.id
- if id == glyph then
- local a = has_attribute(first,prestat)
- local current = number_to_kind[a]
+ if id == glyph_code then
+ local a = has_attribute(first,a_prestat)
+ local current = numbertocategory[a]
local action = injectors[previous]
if action then
action = action[current]
if action then
local font = first.font
if font ~= lastfont then
- lastfont, done = font, true
- set_parameters(font,dataset)
+ lastfont = font
+ set_parameters(font,numbertodataset[has_attribute(first,a_preproc)])
end
action(head,first)
end
@@ -338,9 +344,9 @@ local function process(head,first,last)
local p, n = first.prev, upcoming
if p and n then
local pid, nid = p.id, n.id
- if pid == glyph and nid == glyph then
- local pa, na = has_attribute(p,prestat), has_attribute(n,prestat)
- local pcjk, ncjk = pa and number_to_kind[pa], na and number_to_kind[na]
+ if pid == glyph_code and nid == glyph_code then
+ local pa, na = has_attribute(p,a_prestat), has_attribute(n,a_prestat)
+ local pcjk, ncjk = pa and numbertocategory[pa], na and numbertocategory[na]
if not pcjk or not ncjk
or pcjk == "korean" or ncjk == "korean"
or pcjk == "other" or ncjk == "other"
@@ -359,7 +365,7 @@ local function process(head,first,last)
previous = "start"
end
end
- if upcoming == stop then
+ if upcoming == last then -- was stop
break
else
first = upcoming
@@ -368,9 +374,16 @@ local function process(head,first,last)
end
end
-scripts.install {
- name = "hangul",
- process = process,
+scripts.installmethod {
+ name = "hangul",
+ process = process,
+ datasets = {
+ default = {
+ inter_char_stretch_factor = 0.50, -- of quad
+ inter_char_half_shrink_factor = 0.50, -- of quad
+ inter_char_hangul_penalty = 50,
+ },
+ },
}
-- hanzi (chinese)
@@ -510,28 +523,22 @@ local injectors = { -- [previous] [current]
},
}
-local dataset = {
- inter_char_stretch_factor = 0.50, -- of quad
- inter_char_half_shrink_factor = 0.50, -- of quad
- inter_char_hangul_penalty = 50,
-}
-
local function process(head,first,last)
if first ~= last then
- local lastfont, previous, originals, last = nil, "start", nil, nil
+ local lastfont, previous, last = nil, "start", nil
while true do
local upcoming, id = first.next, first.id
- if id == glyph then
- local a = has_attribute(first,prestat)
- local current = number_to_kind[a]
+ if id == glyph_code then
+ local a = has_attribute(first,a_prestat)
+ local current = numbertocategory[a]
local action = injectors[previous]
if action then
action = action[current]
if action then
local font = first.font
if font ~= lastfont then
- lastfont, done = font, true
- set_parameters(font,dataset)
+ lastfont = font
+ set_parameters(font,numbertodataset[has_attribute(first,a_preproc)])
end
action(head,first)
end
@@ -541,13 +548,14 @@ local function process(head,first,last)
local p, n = first.prev, upcoming
if p and n then
local pid, nid = p.id, n.id
- if pid == glyph and nid == glyph then
- local pa, na = has_attribute(p,prestat), has_attribute(n,prestat)
- local pcjk, ncjk = pa and number_to_kind[pa], na and number_to_kind[na]
+ if pid == glyph_code and nid == glyph_code then
+ local pa, na = has_attribute(p,a_prestat), has_attribute(n,a_prestat)
+ local pcjk, ncjk = pa and numbertocategory[pa], na and numbertocategory[na]
if not pcjk or not ncjk
or pcjk == "korean" or ncjk == "korean"
or pcjk == "other" or ncjk == "other"
- or pcjk == "jamo_final" or ncjk == "jamo_initial" then
+ -- or pcjk == "jamo_final" or ncjk == "jamo_initial" then
+ or pcjk == "jamo_final" or ncjk == "jamo_initial" or pcjk == "half_width_close" or ncjk == "half_width_open" then
previous = "start"
else -- if head ~= first then
remove_node(head,first,true)
@@ -562,7 +570,7 @@ local function process(head,first,last)
previous = "start"
end
end
- if upcoming == stop then
+ if upcoming == last then -- was stop
break
else
first = upcoming
@@ -571,7 +579,14 @@ local function process(head,first,last)
end
end
-scripts.install {
- name = "hanzi",
- process = process,
+scripts.installmethod {
+ name = "hanzi",
+ process = process,
+ datasets = {
+ default = {
+ inter_char_stretch_factor = 0.50, -- of quad
+ inter_char_half_shrink_factor = 0.50, -- of quad
+ inter_char_hangul_penalty = 50,
+ },
+ },
}
diff --git a/Master/texmf-dist/tex/context/base/scrp-eth.lua b/Master/texmf-dist/tex/context/base/scrp-eth.lua
new file mode 100644
index 00000000000..75fad24811c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/scrp-eth.lua
@@ -0,0 +1,151 @@
+if not modules then modules = { } end modules ['scrp-eth'] = {
+ version = 1.001,
+ comment = "companion to scrp-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- at some point I will review the script code but for the moment we
+-- do it this way; so space settings like with cjk yet
+
+local has_attribute = node.has_attribute
+local insert_node_before = node.insert_before
+
+local nodepool = nodes.pool
+
+local new_glue = nodepool.glue
+local new_penalty = nodepool.penalty
+
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
+
+local a_prestat = attributes.private('prestat')
+local a_preproc = attributes.private('preproc')
+
+local categorytonumber = scripts.categorytonumber
+local numbertocategory = scripts.numbertocategory
+local hash = scripts.hash
+local numbertodataset = scripts.numbertodataset
+
+local fonthashes = fonts.hashes
+local parameters = fonthashes.parameters
+
+local space, stretch, shrink, lastfont
+
+local inter_character_space_factor = 1
+local inter_character_stretch_factor = 1
+local inter_character_shrink_factor = 1
+
+local function space_glue(current)
+ local data = numbertodataset[has_attribute(current,a_preproc)]
+ if data then
+ inter_character_space_factor = data.inter_character_space_factor or 1
+ inter_character_stretch_factor = data.inter_character_stretch_factor or 1
+ inter_character_shrink_factor = data.inter_character_shrink_factor or 1
+ end
+ local font = current.font
+ if lastfont ~= font then
+ local pf = parameters[font]
+ space = pf.space
+ stretch = pf.space_stretch
+ shrink = pf.space_shrink
+ lastfont = font
+ end
+ return new_glue(
+ inter_character_space_factor * space,
+ inter_character_stretch_factor * stretch,
+ inter_character_shrink_factor * shrink
+ )
+end
+
+local function insert_space(head,current)
+ insert_node_before(head,current,space_glue(current))
+end
+
+local function insert_zerowidthspace(head,current)
+ insert_node_before(head,current,new_glue(0))
+end
+
+local function insert_nobreakspace(head,current)
+ insert_node_before(head,current,new_penalty(10000))
+ insert_node_before(head,current,space_glue(current))
+end
+
+-- syllable [zerowidthspace] syllable
+-- syllable [zerowidthspace] word
+-- syllable [zerowidthspace] sentence
+-- word [nobreakspace] syllable
+-- word [space] word
+-- word [space] sentence
+-- sentence [nobreakspace] syllable
+-- sentence [space] word
+-- sentence [space] sentence
+
+local injectors = { -- [previous] [current]
+ ethiopic_syllable = {
+ ethiopic_syllable = insert_zerowidthspace,
+ ethiopic_word = insert_nobreakspace,
+ ethiopic_sentence = insert_nobreakspace,
+ },
+ ethiopic_word = {
+ ethiopic_syllable = insert_space,
+ ethiopic_word = insert_space,
+ ethiopic_sentence = insert_space,
+ },
+ ethiopic_sentence = {
+ ethiopic_syllable = insert_space,
+ ethiopic_word = insert_space,
+ ethiopic_sentence = insert_space,
+ },
+}
+
+local function process(head,first,last)
+ if first ~= last then
+ local injector = false
+ local current = first
+ while current do
+ local id = current.id
+ if id == glyph_code then
+ local prestat = has_attribute(current,a_prestat)
+ local category = numbertocategory[prestat]
+ if injector then
+ local action = injector[category]
+ if action then
+ action(head,current)
+ end
+ end
+ injector = injectors[category]
+ else
+ -- nothing yet
+ end
+ if current == last then
+ break
+ else
+ current = current.next
+ end
+ end
+ end
+end
+
+scripts.installmethod {
+ name = "ethiopic",
+ process = process,
+ datasets = {
+ default = {
+ inter_character_space_factor = 1,
+ inter_character_stretch_factor = 1,
+ inter_character_shrink_factor = 1,
+ },
+ half = {
+ inter_character_space_factor = 0.5,
+ inter_character_stretch_factor = 0.5,
+ inter_character_shrink_factor = 0.5,
+ },
+ quarter = {
+ inter_character_space_factor = 0.25,
+ inter_character_stretch_factor = 0.25,
+ inter_character_shrink_factor = 0.25,
+ },
+ },
+}
diff --git a/Master/texmf-dist/tex/context/base/scrp-ini.lua b/Master/texmf-dist/tex/context/base/scrp-ini.lua
index b28c297d0bd..ef036cdf686 100644
--- a/Master/texmf-dist/tex/context/base/scrp-ini.lua
+++ b/Master/texmf-dist/tex/context/base/scrp-ini.lua
@@ -6,39 +6,53 @@ if not modules then modules = { } end modules ['scrp-ini'] = {
license = "see context related readme files"
}
+-- we need to rewrite this a bit ... rather old code
+
+local attributes, nodes, node = attributes, nodes, node
+
+local texwrite = tex.write
+
local trace_analyzing = false trackers.register("scripts.analyzing", function(v) trace_analyzing = v end)
local trace_injections = false trackers.register("scripts.injections", function(v) trace_injections = v end)
+local report_preprocessing = logs.reporter("scripts","preprocessing")
+
+local allocate = utilities.storage.allocate
+
local set_attribute = node.set_attribute
local has_attribute = node.has_attribute
-local first_character = node.first_character
+local first_glyph = node.first_glyph or node.first_character
local traverse_id = node.traverse_id
-local glyph = node.id('glyph')
-local glue = node.id('glue')
-local penalty = node.id('penalty')
+local texsetattribute = tex.setattribute
+
+local nodecodes = nodes.nodecodes
+local unsetvalue = attributes.unsetvalue
+
+local glyph_code = nodecodes.glyph
+local glue_code = nodecodes.glue
-local fcs = (fonts.color and fonts.color.set) or function() end
-local fcr = (fonts.color and fonts.color.reset) or function() end
+local a_preproc = attributes.private('preproc')
+local a_prestat = attributes.private('prestat')
-local state = attributes.private('state')
-local preproc = attributes.private('preproc')
-local prestat = attributes.private('prestat')
+local fontdata = fonts.hashes.identifiers
-local fontdata = fonts.ids
+local setnodecolor = nodes.tracers.colors.set
-scripts = scripts or { }
-scripts.handlers = scripts.handlers or { }
+scripts = scripts or { }
+local scripts = scripts
-scripts.names = scripts.names or { }
-scripts.numbers = scripts.numbers or { }
-scripts.hash = scripts.hash or { }
+scripts.hash = scripts.hash or { }
+local hash = scripts.hash
-storage.register("scripts/hash", scripts.hash, "scripts.hash")
+local handlers = allocate()
+scripts.handlers = handlers
-if not next(scripts.hash) then
+storage.register("scripts/hash", hash, "scripts.hash")
- local hash = {
+if not next(hash) then
+
+ hash = { -- no local
--
-- half width opening parenthesis
[0x0028] = "half_width_open",
@@ -159,26 +173,121 @@ if not next(scripts.hash) then
for i=0x01160,0x011A7 do if not hash[i] then hash[i] = "jamo_medial" end end
for i=0x011A8,0x011FF do if not hash[i] then hash[i] = "jamo_final" end end
+ for i=0x01200,0x0139F do hash[i] = "ethiopic_syllable" end
+
+ hash[0x01361] = "ethiopic_word"
+ hash[0x01362] = "ethiopic_sentence"
+
scripts.hash = hash
end
-scripts.colors = { -- todo: just named colors
- korean = "font:isol",
- chinese = "font:rest",
- full_width_open = "font:init",
- full_width_close = "font:fina",
- half_width_open = "font:init",
- half_width_close = "font:fina",
- hyphen = "font:medi",
- non_starter = "font:isol",
- jamo_initial = "font:init",
- jamo_medial = "font:medi",
- jamo_final = "font:fina",
+local numbertodataset = allocate()
+local numbertohandler = allocate()
+
+--~ storage.register("scripts/hash", hash, "scripts.hash")
+
+scripts.numbertodataset = numbertodataset
+
+function scripts.installmethod(handler)
+ local name = handler.name
+ handlers[name] = handler
+ local attributes = { }
+ local datasets = handler.datasets
+ if not datasets or not datasets.default then
+ report_preprocessing("missing (default) dataset in script '%s'",name)
+ end
+ setmetatable(attributes, {
+ __index = function(t,k)
+ local v = datasets[k] or datasets.default
+ local a = unsetvalue
+ if v then
+ v.name = name -- for tracing
+ a = #numbertodataset + 1
+ numbertodataset[a] = v
+ numbertohandler[a] = handler
+ end
+ t[k] = a
+ return a
+ end
+ } )
+ handler.attributes = attributes
+end
+
+function scripts.installdataset(specification) -- global overload
+ local method = specification.method
+ local name = specification.name
+ local dataset = specification.dataset
+ if method and name and dataset then
+ local parent = specification.parent or ""
+ local handler = handlers[method]
+ if handler then
+ local datasets = handler.datasets
+ if datasets then
+ local defaultset = datasets.default
+ if defaultset then
+ if parent ~= "" then
+ local p = datasets[parent]
+ if p then
+ defaultset = p
+ else
+ report_preprocessing("dataset, unknown parent '%s' for method '%s'",parent,method)
+ end
+ end
+ setmetatable(dataset,defaultset)
+ local existing = datasets[name]
+ if existing then
+ for k, v in next, existing do
+ existing[k] = dataset
+ end
+ else
+ datasets[name] = dataset
+ end
+ else
+ report_preprocessing("dataset, no default for method '%s'",method)
+ end
+ else
+ report_preprocessing("dataset, no datasets for method '%s'",method)
+ end
+ else
+ report_preprocessing("dataset, no method '%s'",method)
+ end
+ else
+ report_preprocessing("dataset, invalid specification") -- maybe report table
+ end
+end
+
+function scripts.set(name,method,preset)
+ local handler = handlers[method]
+ texsetattribute(a_preproc,handler and handler.attributes[preset] or unsetvalue)
+end
+
+function scripts.reset()
+ texsetattribute(handler.attributes[preset])
+end
+
+-- the following tables will become a proper installer (move to cjk/eth)
+local scriptcolors = allocate { -- todo: just named colors
+ korean = "trace:0",
+ chinese = "trace:0",
+ full_width_open = "trace:1",
+ full_width_close = "trace:2",
+ half_width_open = "trace:3",
+ half_width_close = "trace:4",
+ hyphen = "trace:5",
+ non_starter = "trace:6",
+ jamo_initial = "trace:7",
+ jamo_medial = "trace:8",
+ jamo_final = "trace:9",
+ ethiopic_syllable = "trace:1",
+ ethiopic_word = "trace:2",
+ ethiopic_sentence = "trace:3",
}
-scripts.number_to_kind = {
+scripts.colors = scriptcolors
+
+local numbertocategory = allocate { -- rather bound to cjk ... will be generalized
"korean",
"chinese",
"full_width_open",
@@ -190,62 +299,23 @@ scripts.number_to_kind = {
"jamo_initial",
"jamo_medial",
"jamo_final",
+ "ethiopic_syllable",
+ "ethiopic_word",
+ "ethiopic_sentence",
}
-scripts.kind_to_number = {
- korean = 1,
- chinese = 2,
- full_width_open = 3,
- full_width_close = 4,
- half_width_open = 5,
- half_width_close = 6,
- hyphen = 7,
- non_starter = 8,
- jamo_initial = 9,
- jamo_medial = 10,
- jamo_final = 11,
-}
-
-local kind_to_number = scripts.kind_to_number
-local number_to_kind = scripts.number_to_kind
-
--- no, this time loading the lua always precedes the definitions
---
--- storage.register("scripts/names", scripts.names, "scripts.names")
--- storage.register("scripts/numbers", scripts.numbers, "scripts.numbers")
-
-local handlers = scripts.handlers
-local names = scripts.names
-local numbers = scripts.numbers
-local hash = scripts.hash
-local colors = scripts.colors
-
--- maybe also process
-
-function scripts.install(handler)
- local name = handler.name
- if not names[name] then
- local n = #numbers + 1
- numbers[n] = name
- names[name] = n
- handlers[n] = handler
- end
- return names[name]
-end
-
-function scripts.define(name)
- tex.write(names[name] or attributes.unsetvalue)
-end
+local categorytonumber = allocate(table.swapped(numbertocategory)) -- could be one table
--- some time i will make a fonts.originals[id]
+scripts.categorytonumber = categorytonumber
+scripts.numbertocategory = numbertocategory
local function colorize(start,stop)
- for n in traverse_id(glyph,start) do
- local kind = number_to_kind[has_attribute(n,prestat)]
+ for n in traverse_id(glyph_code,start) do
+ local kind = numbertocategory[has_attribute(n,a_prestat)]
if kind then
- local ac = colors[kind]
+ local ac = scriptcolors[kind]
if ac then
- fcs(n,ac)
+ setnodecolor(n,ac)
end
end
if n == stop then
@@ -257,9 +327,11 @@ end
local function traced_process(head,first,last,process,a)
if start ~= last then
local f, l = first, last
- logs.report("preprocess","before %s: %s",names[a] or "?",nodes.tosequence(f,l))
+ local name = numbertodataset[a]
+ name = name and name.name or "?"
+ report_preprocessing("before %s: %s",name,nodes.tosequence(f,l))
process(head,first,last)
- logs.report("preprocess","after %s: %s", names[a] or "?",nodes.tosequence(f,l))
+ report_preprocessing("after %s: %s", name,nodes.tosequence(f,l))
end
end
@@ -269,7 +341,7 @@ end
-- one of the time consuming functiions:
function scripts.preprocess(head)
- local start = first_character(head)
+ local start = first_glyph(head)
if not start then
return head, false
else
@@ -277,8 +349,8 @@ function scripts.preprocess(head)
local done, first, last, ok = false, nil, nil, false
while start do
local id = start.id
- if id == glyph then
- local a = has_attribute(start,preproc)
+ if id == glyph_code then
+ local a = has_attribute(start,a_preproc)
if a then
if a ~= last_a then
if first then
@@ -296,20 +368,20 @@ function scripts.preprocess(head)
first, last = nil, nil
end
last_a = a
- local handler = handlers[a]
+ local handler = numbertohandler[a]
normal_process = handler.process
end
if normal_process then
local f = start.font
if f ~= lastfont then
- originals = fontdata[f].originals
+ originals = fontdata[f].resources.originals
lastfont = f
end
local c = start.char
if originals then c = originals[c] or c end
local h = hash[c]
if h then
- set_attribute(start,prestat,kind_to_number[h])
+ set_attribute(start,a_prestat,categorytonumber[h])
if not first then
first, last = start, start
else
@@ -347,7 +419,7 @@ function scripts.preprocess(head)
end
first, last = nil, nil
end
- elseif id == glue then
+ elseif id == glue_code then
if ok then
-- continue
elseif first then
diff --git a/Master/texmf-dist/tex/context/base/scrp-ini.mkiv b/Master/texmf-dist/tex/context/base/scrp-ini.mkiv
index 6e6b1061032..0e50452ff3b 100644
--- a/Master/texmf-dist/tex/context/base/scrp-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/scrp-ini.mkiv
@@ -15,9 +15,10 @@
\registerctxluafile{scrp-ini}{1.001}
\registerctxluafile{scrp-cjk}{1.001}
+\registerctxluafile{scrp-eth}{1.001}
-\definesystemattribute[preproc] \chardef\preprocattribute \dogetattributeid{preproc}
-\definesystemattribute[prestat] \chardef\prestatattribute \dogetattributeid{prestat}
+\definesystemattribute[preproc][public]
+\definesystemattribute[prestat][public]
%D Since scripts need specific \LUA\ code we use hard coded attribute
%D values, but we might have more tricks at some time, so we use a
@@ -25,67 +26,39 @@
\unprotect
-\def\s!attribute{attribute}
+\installcommandhandler\??ls{script}\??ls
-\def\namedscriptparameter#1#2%
- {\csname\doscriptparameter{\??ls#1}#2\endcsname}
+% presets are global and are currently defined in lua
-\def\scriptparameter#1%
- {\csname\doscriptparameter{\??ls\currentscript}#1\endcsname}
+\appendtoks
+ \setuevalue\currentscript{\setscript[\currentscript]}%
+\to \everydefinescript
-\def\doscriptparameter#1#2%
- {\ifcsname#1#2\endcsname#1#2\else\expandafter\doscriptparentparameter\csname#1\s!parent\endcsname#2\fi}
+\unexpanded\def\dosetscript
+ {\ctxlua{scripts.set("\currentscript","\scriptparameter\c!method","\scriptparameter\c!preset")}}
-\def\doscriptparentparameter#1#2%
- {\ifx#1\relax\s!empty\else\doscriptparameter#1#2\fi}
+\unexpanded\def\setscript[#1]%
+ {\edef\currentscript{#1}%
+ \dosetscript}
-% \def\scriptparameterhash#1%
-% {\doscriptparameterhash{\??ls\currentscript}#1}
-%
-% \def\doscriptparameterhash#1#2%
-% {\ifcsname#1#2\endcsname#1\else\expandafter\doscriptparentparameterhash\csname#1\s!parent\endcsname#2\fi}
-%
-% \def\doscriptparentparameterhash#1#2%
-% {\ifx#1\relax\else\doscriptparameterhash#1#2\fi}
+\unexpanded\def\resetscript
+ {\ctxlua{scripts.reset()}}
-% when #2 == string, then only synonym, no settings
+\unexpanded\def\startscript[#1]%
+ {\begingroup
+ \edef\currentscript{#1}%
+ \dosetscript}
-\unexpanded\def\definescript
- {\dodoubleargument\dodefinescript}
+\unexpanded\def\stopscript
+ {\endgroup}
-\def\dodefinescript[#1][#2]%
- {\doifassignmentelse{#2}
- {\getparameters[\??ls#1][\c!method=,\s!parent=,#2]%
- \doifelsenothing{\namedscriptparameter{#1}\c!method}
- {\letvalue {\??ls#1\s!attribute}\attributeunsetvalue}%
- {\setevalue{\??ls#1\s!attribute}{\ctxlua{scripts.define("\namedscriptparameter{#1}\c!method")}}}}%
- {\getparameters[\??ls#1][\s!parent=#2]}%
- \setvalue{#1}{\dosetscript{#1}}}
-
-\unexpanded\def\setupscript
- {\dodoubleargument\dosetupscript}
-
-\def\dosetupscript[#1][#2]%
- {\getparameters[\??ls#1][#2]}
-
-\def\dosetscript#1%
- {\def\currentscript{#1}%
- \edef\currentscriptattribute{\scriptparameter\s!attribute}%
- \ifx\currentscriptattribute\empty
- \let\currentscript\empty
- \attribute\preprocattribute\attributeunsetvalue
- \else
- \attribute\preprocattribute\currentscriptattribute\relax % we can speed this up by storing the attribute in ??ls:a:#1
- \fi}
+% \setscript[hangul] \hangul \startscript[hangul]
-\def\setscript [#1]{\dosetscript{#1}}
-\unexpanded\def\startscript[#1]{\begingroup\dosetscript{#1}}
-\unexpanded\def\stopscript {\endgroup}
+\definescript[hangul] [\c!method=hangul]
+\definescript[hanzi] [\c!method=hanzi]
-% \setscript[hangul] \hangul \startscript[hangul]
+\definescript[ethiopic] [\c!method=ethiopic]
-\definescript[latin] [\c!method=] % resets the attribute
-\definescript[hangul][\c!method=hangul]
-\definescript[hanzi] [\c!method=hanzi]
+\definescript[latin] [\c!method=] % resets the attribute (also currentscript)
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/sort-ini.lua b/Master/texmf-dist/tex/context/base/sort-ini.lua
index b745c9aa5db..7a91910ca7d 100644
--- a/Master/texmf-dist/tex/context/base/sort-ini.lua
+++ b/Master/texmf-dist/tex/context/base/sort-ini.lua
@@ -9,88 +9,444 @@ if not modules then modules = { } end modules ['sort-ini'] = {
-- It took a while to get there, but with Fleetwood Mac's "Don't Stop"
-- playing in the background we sort of got it done.
--- todo: cleanup splits (in other modules)
+--[[<p>The code here evolved from the rather old mkii approach. There
+we concatinate the key and (raw) entry into a new string. Numbers and
+special characters get some treatment so that they sort ok. In
+addition some normalization (lowercasing, accent stripping) takes
+place and again data is appended ror prepended. Eventually these
+strings are sorted using a regular string sorter. The relative order
+of character is dealt with by weighting them. It took a while to
+figure this all out but eventually it worked ok for most languages,
+given that the right datatables were provided.</p>
+
+<p>Here we do follow a similar approach but this time we don't append
+the manipulated keys and entries but create tables for each of them
+with entries being tables themselves having different properties. In
+these tables characters are represented by numbers and sorting takes
+place using these numbers. Strings are simplified using lowercasing
+as well as shape codes. Numbers are filtered and after getting an offset
+they end up at the right end of the spectrum (more clever parser will
+be added some day). There are definitely more solutions to the problem
+and it is a nice puzzle to solve.</p>
+
+<p>In the future more methods can be added, as there is practically no
+limit to what goes into the tables. For that we will provide hooks.</p>
+
+<p>Todo: decomposition with specific order of accents, this is
+relatively easy to do.</p>
+
+<p>Todo: investigate what standards and conventions there are and see
+how they map onto this mechanism. I've learned that users can come up
+with any demand so nothing here is frozen.</p>
+
+<p>In the future index entries will become more clever, i.e. they will
+have language etc properties that then can be used.</p>
+]]--
+
local utf = unicode.utf8
-local gsub, rep, sort, concat = string.gsub, string.rep, table.sort, table.concat
+local gsub, rep, sub, sort, concat = string.gsub, string.rep, string.sub, table.sort, table.concat
local utfbyte, utfchar = utf.byte, utf.char
-local utfcharacters, utfvalues, strcharacters = string.utfcharacters, string.utfvalues, string.characters
-local chardata = characters.data
-local next, type, tonumber = next, type, tonumber
-
-local trace_tests = false trackers.register("sorters.tests", function(v) trace_tests = v end)
-
-sorters = { }
-sorters.comparers = { }
-sorters.splitters = { }
-sorters.entries = { }
-sorters.mappings = { }
-sorters.replacements = { }
-
-sorters.ignored_offset = 0x10000
-sorters.replacement_offset = 0x10000
-sorters.digits_offset = 0x20000
-sorters.digits_maximum = 0xFFFFF
-
-local ignored_offset = sorters.ignored_offset
-local digits_offset = sorters.digits_offset
-local digits_maximum = sorters.digits_maximum
-
-local mappings = sorters.mappings
-local entries = sorters.entries
-local replacements = sorters.replacements
-
-local language, defaultlanguage, dummy = 'en', 'en', { }
-
-local currentreplacements, currentmappings, currententries
-
-function sorters.setlanguage(lang)
- language = lang or language or defaultlanguage
- currentreplacements = replacements[language] or replacements[defaultlanguage] or dummy
- currentmappings = mappings [language] or mappings [defaultlanguage] or dummy
- currententries = entries [language] or entries [defaultlanguage] or dummy
- return currentreplacements, currentmappings, currententries
-end
+local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
+local next, type, tonumber, rawget, rawset = next, type, tonumber, rawget, rawset
-sorters.setlanguage()
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
--- maybe inline code if it's too slow
+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 function basicsort(sort_a,sort_b)
- if not sort_a or not sort_b then
- return 0
- elseif #sort_a > #sort_b then
- if #sort_b == 0 then
- return 1
- else
- for i=1,#sort_b do
- local ai, bi = sort_a[i], sort_b[i]
- if ai > bi then
- return 1
- elseif ai < bi then
- return -1
+local report_sorters = logs.reporter("languages","sorters")
+
+local comparers = { }
+local splitters = { }
+local definitions = allocate()
+local tracers = allocate()
+local ignoredoffset = 0x10000 -- frozen
+local replacementoffset = 0x10000 -- frozen
+local digitsoffset = 0x20000 -- frozen
+local digitsmaximum = 0xFFFFF -- frozen
+
+local lccodes = characters.lccodes
+local lcchars = characters.lcchars
+local shchars = characters.shchars
+local fscodes = characters.fscodes
+local fschars = characters.fschars
+
+local decomposed = characters.decomposed
+
+local variables = interfaces.variables
+
+local v_numbers = variables.numbers
+local v_default = variables.default
+local v_before = variables.before
+local v_after = variables.after
+local v_first = variables.first
+local v_last = variables.last
+
+local validmethods = table.tohash {
+ -- "ch", -- raw character
+ "mm", -- minus mapping
+ "zm", -- zero mapping
+ "pm", -- plus mapping
+ "mc", -- lower case - 1
+ "zc", -- lower case
+ "pc", -- lower case + 1
+ "uc", -- unicode
+}
+
+local predefinedmethods = {
+ [v_before] = "mm,mc,uc",
+ [v_after] = "pm,mc,uc",
+ [v_first] = "pc,mm,uc",
+ [v_last] = "mc,mm,uc",
+}
+
+sorters = {
+ comparers = comparers,
+ splitters = splitters,
+ definitions = definitions,
+ tracers = tracers,
+ constants = {
+ ignoredoffset = ignoredoffset,
+ replacementoffset = replacementoffset,
+ digitsoffset = digitsoffset,
+ digitsmaximum = digitsmaximum,
+ defaultlanguage = v_default,
+ defaultmethod = v_before,
+ defaultdigits = v_numbers,
+ }
+}
+
+local sorters = sorters
+local constants = sorters.constants
+
+local data, language, method, digits
+local replacements, m_mappings, z_mappings, p_mappings, entries, orders, lower, upper, method, sequence
+local thefirstofsplit
+
+local mte = {
+ __index = function(t,k)
+ if k ~= "" and utfbyte(k) < digitsoffset then
+ local el
+ if k then
+ local l = lower[k] or lcchars[k]
+ el = rawget(t,l)
+ end
+ if not el then
+ local l = shchars[k]
+ if l and l ~= k then
+ if #l > 1 then
+ l = sub(l,1,1) -- todo
+ end
+ el = rawget(t,l)
+ if not el then
+ l = lower[k] or lcchars[l]
+ if l then
+ el = rawget(t,l)
+ end
+ end
end
+ el = el or k
end
- return 1
+ -- rawset(t,k,el) also make a copy?
+ return el
end
- elseif #sort_a < #sort_b then
- if #sort_a == 0 then
- return -1
- else
- for i=1,#sort_a do
- local ai, bi = sort_a[i], sort_b[i]
- if ai > bi then
- return 1
- elseif ai < bi then
- return -1
+ end
+}
+
+local noorder = false
+
+local function preparetables(data)
+ local orders, lower, m_mappings, z_mappings, p_mappings = data.orders, data.lower, { }, { }, { }
+ for i=1,#orders do
+ local oi = orders[i]
+ local n = { 2 * i }
+ m_mappings[oi], z_mappings[oi], p_mappings[oi] = n, n, n
+ end
+ local mtm = {
+ __index = function(t,k)
+ local n, nn
+ if k then
+ if trace_tests then
+ report_sorters("simplifing character 0x%04X %s",utfbyte(k),k)
+ end
+ local l = lower[k] or lcchars[k]
+ if l then
+ if trace_tests then
+ report_sorters(" 1 lower: %s",l)
+ end
+ local ml = rawget(t,l)
+ if ml then
+ n = { }
+ nn = 0
+ for i=1,#ml do
+ nn = nn + 1
+ n[nn] = ml[i] + (t.__delta or 0)
+ end
+ if trace_tests then
+ report_sorters(" 2 order: %s",concat(n," "))
+ end
+ end
+ end
+ if not n then
+ local s = shchars[k] -- maybe all components?
+ if s and s ~= k then
+ if trace_tests then
+ report_sorters(" 3 shape: %s",s)
+ end
+ n = { }
+ nn = 0
+ for l in utfcharacters(s) do
+ local ml = rawget(t,l)
+ if ml then
+ if trace_tests then
+ report_sorters(" 4 keep: %s",l)
+ end
+ if ml then
+ for i=1,#ml do
+ nn = nn + 1
+ n[nn] = ml[i]
+ end
+ end
+ else
+ l = lower[l] or lcchars[l]
+ if l then
+ if trace_tests then
+ report_sorters(" 5 lower: %s",l)
+ end
+ local ml = rawget(t,l)
+ if ml then
+ for i=1,#ml do
+ nn = nn + 1
+ n[nn] = ml[i] + (t.__delta or 0)
+ end
+ end
+ end
+ 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.string(b))
+ end
+ end
+ if n then
+ if trace_tests then
+ report_sorters(" 7 order: %s",concat(n," "))
+ end
+ else
+ n = noorder
+ if trace_tests then
+ report_sorters(" 8 order: 0")
+ end
+ end
+ end
+ else
+ n = noorder
+ if trace_tests then
+ report_sorters(" 9 order: 0")
end
end
- return -1
+ rawset(t,k,n)
+ return n
end
- elseif #sort_a == 0 then
- return 0
- else
- for i=1,#sort_a do
+ }
+ data.m_mappings = m_mappings
+ data.z_mappings = z_mappings
+ data.p_mappings = p_mappings
+ m_mappings.__delta = -1
+ z_mappings.__delta = 0
+ p_mappings.__delta = 1
+ setmetatable(data.entries,mte)
+ setmetatable(data.m_mappings,mtm)
+ setmetatable(data.z_mappings,mtm)
+ setmetatable(data.p_mappings,mtm)
+ thefirstofsplit = data.firstofsplit
+end
+
+local function update() -- prepare parent chains, needed when new languages are added
+ for language, data in next, definitions do
+ local parent = data.parent or "default"
+ if language ~= "default" then
+ setmetatableindex(data,definitions[parent] or definitions.default)
+ end
+ data.language = language
+ data.parent = parent
+ data.m_mappings = { } -- free temp data
+ data.z_mappings = { } -- free temp data
+ data.p_mappings = { } -- free temp data
+ end
+end
+
+local function setlanguage(l,m,d,u)
+ 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
+ if trace_tests then
+ report_sorters("setting language '%s', method '%s', digits '%s'",language,method,digits)
+ end
+ replacements = data.replacements
+ entries = data.entries
+ orders = data.orders
+ lower = data.lower
+ upper = data.upper
+ preparetables(data)
+ m_mappings = data.m_mappings
+ z_mappings = data.z_mappings
+ p_mappings = data.p_mappings
+ --
+ method = predefinedmethods[variables[method]] or method
+ data.method = method
+ --
+ data.digits = digite
+ --
+ local seq = utilities.parsers.settings_to_array(method or "") -- check the list
+ sequence = { }
+ local nofsequence = 0
+ for i=1,#seq do
+ local s = seq[i]
+ if validmethods[s] then
+ nofsequence = nofsequence + 1
+ sequence[nofsequence] = s
+ else
+ report_sorters("invalid sorter method '%s' in '%s'",s,method)
+ end
+ end
+ data.sequence = sequence
+ if trace_tests then
+ report_sorters("using sort sequence: %s",concat(sequence," "))
+ end
+ --
+ return data
+end
+
+function sorters.update()
+ update()
+ setlanguage(language,method,numberorder) -- resync current language and method
+end
+
+function sorters.setlanguage(language,method,numberorder)
+ update()
+ setlanguage(language,method,numberorder) -- new language and method
+end
+
+-- tricky: { 0, 0, 0 } vs { 0, 0, 0, 0 } => longer wins and mm, pm, zm can have them
+
+--~ local function basicsort(sort_a,sort_b) -- todo: local #
+--~ if not sort_a or not sort_b then
+--~ return 0
+--~ elseif #sort_a > #sort_b then
+--~ if #sort_b == 0 then
+--~ return 1
+--~ else
+--~ for i=1,#sort_b do
+--~ local ai, bi = sort_a[i], sort_b[i]
+--~ if ai > bi then
+--~ return 1
+--~ elseif ai < bi then
+--~ return -1
+--~ end
+--~ end
+--~ return 1
+--~ end
+--~ elseif #sort_a < #sort_b then
+--~ if #sort_a == 0 then
+--~ return -1
+--~ else
+--~ for i=1,#sort_a do
+--~ local ai, bi = sort_a[i], sort_b[i]
+--~ if ai > bi then
+--~ return 1
+--~ elseif ai < bi then
+--~ return -1
+--~ end
+--~ end
+--~ return -1
+--~ end
+--~ elseif #sort_a == 0 then
+--~ return 0
+--~ else
+--~ for i=1,#sort_a do
+--~ local ai, bi = sort_a[i], sort_b[i]
+--~ if ai > bi then
+--~ return 1
+--~ elseif ai < bi then
+--~ return -1
+--~ end
+--~ end
+--~ return 0
+--~ end
+--~ end
+
+--~ function comparers.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)
+--~ local result = 0
+--~ for j=1,#sequence do
+--~ local m = sequence[j]
+--~ result = basicsort(ea[m],eb[m])
+--~ if result ~= 0 then
+--~ return result
+--~ end
+--~ end
+--~ return result
+--~ 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]
+--~ for j=1,#sequence do
+--~ local m = sequence[j]
+--~ result = basicsort(eai[m],ebi[m])
+--~ if result ~= 0 then
+--~ return result
+--~ end
+--~ end
+--~ 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
+
+local function basicsort(sort_a,sort_b)
+ if sort_a and sort_b then
+ local na = #sort_a
+ local nb = #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
@@ -98,28 +454,56 @@ local function basicsort(sort_a,sort_b)
return -1
end
end
- return 0
end
+ return 0
end
-function sorters.comparers.basic(a,b)
+function comparers.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)
- local result = basicsort(ea.e,eb.e)
- return result == 0 and result or basicsort(ea.m,eb.m)
+ local result = 0
+ for j=1,#sequence do
+ local m = sequence[j]
+ result = basicsort(ea[m],eb[m])
+ if result ~= 0 then
+ return result
+ end
+ end
+ if result == 0 then
+ local la, lb = #ea.uc, #eb.uc
+ if la > lb then
+ return 1
+ elseif lb > la then
+ return -1
+ else
+ return 0
+ end
+ else
+ return result
+ end
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(eai.e,ebi.e)
- if result == 0 then
- result = basicsort(eai.m,ebi.m) -- only needed it there are m's
+ for j=1,#sequence do
+ local m = sequence[j]
+ result = basicsort(eai[m],ebi[m])
+ if result ~= 0 then
+ return result
+ end
end
- if result ~= 0 then
- break
+ if result == 0 then
+ local la, lb = #eai.uc, #ebi.uc
+ if la > lb then
+ return 1
+ elseif lb > la then
+ return -1
+ end
+ else
+ return result
end
end
if result ~= 0 then
@@ -135,22 +519,22 @@ function sorters.comparers.basic(a,b)
end
local function numify(s)
- return rep(" ",10-#s) .. s -- or format with padd
-end
-
-local function numify(s)
- s = digits_offset + tonumber(s)
- if s > digits_maximum then
- s = digits_maximum
+ s = digitsoffset + tonumber(s) -- alternatively we can create range
+ if s > digitsmaximum then
+ s = digitsmaximum
end
return utfchar(s)
end
function sorters.strip(str) -- todo: only letters and such utf.gsub("([^%w%d])","")
if str then
- str = gsub(str,"\\%S*","")
+ str = gsub(str,"\\[\"\'~^`]*","") -- \"e
+ str = gsub(str,"\\%S*","") -- the rest
+ str = gsub(str,"%s","\001") -- can be option
str = gsub(str,"[%s%[%](){}%$\"\']*","")
- str = gsub(str,"(%d+)",numify) -- sort numbers properly
+ if digits == v_numbers then
+ str = gsub(str,"(%d+)",numify) -- sort numbers properly
+ end
return str
else
return ""
@@ -161,98 +545,191 @@ local function firstofsplit(entry)
-- numbers are left padded by spaces
local split = entry.split
if #split > 0 then
- split = split[1].s
+ split = split[1].ch
+ else
+ split = split.ch
+ end
+ local first = split and split[1] or ""
+ if thefirstofsplit then
+ return thefirstofsplit(first,data,entry) -- normally the first one is needed
else
- split = split.s
+ return first, entries[first] or "\000" -- tag
end
- local entry = split and split[1] or ""
- return entry, currententries[entry] or "\000"
end
sorters.firstofsplit = firstofsplit
--- beware, numbers get spaces in front
+-- for the moment we use an inefficient bunch of tables but once
+-- we know what combinations make sense we can optimize this
-function sorters.splitters.utf(str)
- if #currentreplacements > 0 then
- for k=1,#currentreplacements do
- local v = currentreplacements[k]
+function splitters.utf(str) -- we could append m and u but this is cleaner, s is for tracing
+ if #replacements > 0 then
+ -- todo make an lpeg for this
+ for k=1,#replacements do
+ local v = replacements[k]
str = gsub(str,v[1],v[2])
end
end
- local s, e, m, n = { }, { }, { }, 0
- for sc in utfcharacters(str) do -- maybe an lpeg
- local ec, mc = currententries[sc], currentmappings[sc] or utfbyte(sc)
- n = n + 1
- s[n] = sc
- e[n] = currentmappings[ec] or mc
- m[n] = mc
- end
- return { s = s, e = e, m = m }
+ local m_case, z_case, p_case, m_mapping, z_mapping, p_mapping, char, byte, n = { }, { }, { }, { }, { }, { }, { }, { }, 0
+ local nm, nz, np = 0, 0, 0
+ for sc in utfcharacters(str) do
+ local b = utfbyte(sc)
+ if b >= digitsoffset then
+ if n == 0 then
+ -- we need to force number to the top
+ z_case[1] = 0
+ m_case[1] = 0
+ p_case[1] = 0
+ char[1] = sc
+ byte[1] = 0
+ m_mapping[1] = 0
+ z_mapping[1] = 0
+ p_mapping[1] = 0
+ n = 2
+ else
+ n = n + 1
+ end
+ z_case[n] = b
+ m_case[n] = b
+ p_case[n] = b
+ char[n] = sc
+ byte[n] = b
+ nm = nm + 1
+ nz = nz + 1
+ np = np + 1
+ m_mapping[nm] = b
+ z_mapping[nz] = b
+ p_mapping[np] = b
+ else
+ n = n + 1
+ local l = lower[sc]
+ l = l and utfbyte(l) or lccodes[b]
+ if type(l) == "table" then
+ l = l[1] -- there are currently no tables in lccodes but it can be some, day
+ end
+ z_case[n] = l
+ if l ~= b then
+ m_case[n] = l - 1
+ p_case[n] = l + 1
+ else
+ m_case[n] = l
+ p_case[n] = l
+ end
+ char[n], byte[n] = sc, b
+local fs = fscodes[b] or b
+ local msc = m_mappings[sc]
+ if msc ~= noorder then
+if not msc then
+ msc = m_mappings[fs]
end
-
--- we can use one array instead (sort of like in mkii)
--- but for the moment we do it this way as it is more
--- handy for tracing
-
--- function sorters.splitters.utf(str)
--- if #currentreplacements > 0 then
--- for k=1,#currentreplacements do
--- local v = currentreplacements[k]
--- str = gsub(str,v[1],v[2])
--- end
--- end
--- local s, e, m, n = { }, { }, { }, 0
--- for sc in utfcharacters(str) do -- maybe an lpeg
--- local ec, mc = currententries[sc], currentmappings[sc] or utfbyte(sc)
--- n = n + 1
--- ec = currentmappings[ec] or mc
--- s[n] = sc
--- e[n] = ec
--- if ec ~= mc then
--- n = n + 1
--- e[n] = mc
--- end
--- end
--- return { s = s, e = e }
--- end
-
-function table.remap(t)
- local tt = { }
- for k,v in next, t do
- tt[v] = k
+ for i=1,#msc do
+ nm = nm + 1
+ m_mapping[nm] = msc[i]
+ end
+ end
+ local zsc = z_mappings[sc]
+ if zsc ~= noorder then
+if not zsc then
+ zsc = z_mappings[fs]
+end
+ for i=1,#zsc do
+ nz = nz + 1
+ z_mapping[nz] = zsc[i]
+ end
+ end
+ local psc = p_mappings[sc]
+ if psc ~= noorder then
+if not psc then
+ psc = p_mappings[fs]
+end
+ for i=1,#psc do
+ np = np + 1
+ p_mapping[np] = psc[i]
+ end
+ end
+ end
end
- return tt
+
+ -- only those needed that are part of a sequence
+
+--~ local b = byte[1]
+--~ if b then
+--~ -- we set them to the first split code (korean)
+--~ local fs = fscodes[b] or b
+--~ if #m_mapping == 0 then
+--~ m_mapping = { m_mappings[fs][1] }
+--~ end
+--~ if #z_mapping == 0 then
+--~ z_mapping = { z_mappings[fs][1] }
+--~ end
+--~ if #p_mapping == 0 then
+--~ p_mapping = { p_mappings[fs][1] }
+--~ end
+--~ end
+
+ local t = {
+ ch = char,
+ uc = byte,
+ mc = m_case,
+ zc = z_case,
+ pc = p_case,
+ mm = m_mapping,
+ zm = z_mapping,
+ pm = p_mapping,
+ }
+
+ return t
end
-local function pack(entry)
- local t = { }
+local function packch(entry)
local split = entry.split
- if #split > 0 then
+ if #split > 0 then -- useless test
+ local t = { }
for i=1,#split do
- local tt, li = { }, split[i].s
+ local tt, li = { }, split[i].ch
for j=1,#li do
local lij = li[j]
- tt[j] = utfbyte(lij) > ignored_offset and "[]" or lij
+ tt[j] = utfbyte(lij) > ignoredoffset and "[]" or lij
end
t[i] = concat(tt)
end
return concat(t," + ")
else
- local t, li = { }, split.s
+ local t, li = { }, split.ch
for j=1,#li do
local lij = li[j]
- t[j] = utfbyte(lij) > ignored_offset and "[]" or lij
+ t[j] = utfbyte(lij) > ignoredoffset and "[]" or lij
end
return concat(t)
end
end
+local function packuc(entry)
+ local split = entry.split
+ if #split > 0 then -- useless test
+ local t = { }
+ for i=1,#split do
+ t[i] = concat(split[i].uc, " ")
+ end
+ return concat(t," + ")
+ else
+ return concat(split.uc," ")
+ end
+end
+
function sorters.sort(entries,cmp)
+ if trace_tests or trace_methods then
+ local nofentries = #entries
+ report_sorters("entries: %s, language: %s, method: %s, digits: %s",nofentries,language,method,tostring(digits))
+ for i=1,nofentries do
+ report_sorters("entry %s",table.serialize(entries[i].split,i,true,true,true))
+ end
+ end
if trace_tests then
sort(entries,function(a,b)
local r = cmp(a,b)
- logs.report("sorter","%s %s %s",pack(a),(not r and "?") or (r<0 and "<") or (r>0 and ">") or "=",pack(b))
+ local e = (not r and "?") or (r<0 and "<") or (r>0 and ">") or "="
+ report_sorters("%s %s %s | %s %s %s",packch(a),e,packch(b),packuc(a),e,packuc(b))
return r == -1
end)
local s
@@ -263,9 +740,9 @@ function sorters.sort(entries,cmp)
first = " "
else
s = first
- logs.report("sorter",">> %s 0x%05X (%s 0x%05X)",first,utfbyte(first),letter,utfbyte(letter))
+ report_sorters(">> %s 0x%05X (%s 0x%05X)",first,utfbyte(first),letter,utfbyte(letter))
end
- logs.report("sorter"," %s",pack(entry))
+ report_sorters(" %s | %s",packch(entry),packuc(entry))
end
else
sort(entries,function(a,b)
@@ -273,45 +750,3 @@ function sorters.sort(entries,cmp)
end)
end
end
-
--- some day we can have a characters.upper and characters.lower
-
-function sorters.add_uppercase_replacements(what)
- local rep, new = replacements[what], { }
- for i=1,#rep do
- local r = rep[i]
- local u = chardata[utfbyte(r[1])].uccode
- if u then
- new[utfchar(u)] = r[2]
- end
- end
- for k, v in next, new do
- rep[k] = v
- end
-end
-
-function sorters.add_uppercase_entries(what)
- local ent, new = entries[what], { }
- for k, v in next, ent do
- local u = chardata[utfbyte(k)].uccode
- if u then
- new[utfchar(u)] = v
- end
- end
- for k, v in next, new do
- ent[k] = v
- end
-end
-
-function sorters.add_uppercase_mappings(what,offset)
- local map, new, offset = mappings[what], { }, offset or 0
- for k, v in next, map do
- local u = chardata[utfbyte(k)].uccode
- if u then
- new[utfchar(u)] = v + offset
- end
- end
- for k, v in next, new do
- map[k] = v
- end
-end
diff --git a/Master/texmf-dist/tex/context/base/sort-lan.lua b/Master/texmf-dist/tex/context/base/sort-lan.lua
index ed7e8ba3550..e7556c1de7b 100644
--- a/Master/texmf-dist/tex/context/base/sort-lan.lua
+++ b/Master/texmf-dist/tex/context/base/sort-lan.lua
@@ -6,314 +6,873 @@ if not modules then modules = { } end modules ['sort-lan'] = {
license = "see context related readme files"
}
--- this is a rather preliminary and incomplete file
--- maybe we should load this kind of stuff runtime
-
--- replacements are indexed as they need to be applied in sequence
-
-local utf = unicode.utf8
-local uc = utf.char
-local ub = utf.byte
-
-local mappings = sorters.mappings
-local entries = sorters.entries
-local replacements = sorters.replacements
-
-local add_uppercase_replacements = sorters.add_uppercase_replacements
-local add_uppercase_entries = sorters.add_uppercase_entries
-local add_uppercase_mappings = sorters.add_uppercase_mappings
+-- Many vectors were supplied by Wolfgang Schuster and Philipp
+-- Gesang. However this is a quite adapted and reformatted variant
+-- so it needs some checking.
+
+local utfchar, utfbyte = utf.char, utf.byte
+local sorters = sorters
+local definitions = sorters.definitions
+local replacementoffset = sorters.constants.replacementoffset
+local variables = interfaces.variables
+
+definitions["default"] = {
+ method = variables.before,
+ replacements = {
+ -- no replacements
+ },
+ entries = {
+ ["a"] = "a", ["b"] = "b", ["c"] = "c", ["d"] = "d", ["e"] = "e",
+ ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i", ["j"] = "j",
+ ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o",
+ ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["t"] = "t",
+ ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y",
+ ["z"] = "z",
+ },
+ orders = {
+ "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",
+ },
+ lower = {
+ -- no replacements
+ },
+ upper = {
+ -- no replacements
+ }
+}
-local replacement_offset = sorters.replacement_offset
+sorters.setlanguage("default")
-- english
-entries['en'] = {
- ["a"] = "a", ["b"] = "b", ["c"] = "c", ["d"] = "d", ["e"] = "e",
- ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i", ["j"] = "j",
- ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o",
- ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["t"] = "t",
- ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y",
- ["z"] = "z",
- ["A"] = "a", ["B"] = "b", ["C"] = "c", ["D"] = "d", ["E"] = "e",
- ["F"] = "f", ["G"] = "g", ["H"] = "h", ["I"] = "i", ["J"] = "j",
- ["K"] = "k", ["L"] = "l", ["M"] = "m", ["N"] = "n", ["O"] = "o",
- ["P"] = "p", ["Q"] = "q", ["R"] = "r", ["S"] = "s", ["T"] = "t",
- ["U"] = "u", ["V"] = "v", ["W"] = "w", ["X"] = "x", ["Y"] = "y",
- ["Z"] = "z",
-}
-
-mappings['en'] = {
- ["a"] = 1, ["b"] = 3, ["c"] = 5, ["d"] = 7, ["e"] = 9,
- ["f"] = 11, ["g"] = 13, ["h"] = 15, ["i"] = 17, ["j"] = 19,
- ["k"] = 21, ["l"] = 23, ["m"] = 25, ["n"] = 27, ["o"] = 29,
- ["p"] = 31, ["q"] = 33, ["r"] = 35, ["s"] = 37, ["t"] = 39,
- ["u"] = 41, ["v"] = 43, ["w"] = 45, ["x"] = 47, ["y"] = 49,
- ["z"] = 51,
- ["A"] = 1, ["B"] = 3, ["C"] = 5, ["D"] = 7, ["E"] = 9,
- ["F"] = 11, ["G"] = 13, ["H"] = 15, ["I"] = 17, ["J"] = 19,
- ["K"] = 21, ["L"] = 23, ["M"] = 25, ["N"] = 27, ["O"] = 29,
- ["P"] = 31, ["Q"] = 33, ["R"] = 35, ["S"] = 37, ["T"] = 39,
- ["U"] = 41, ["V"] = 43, ["W"] = 45, ["X"] = 47, ["Y"] = 49,
- ["Z"] = 51,
- --
- -- uppercase after lowercase
- --
- -- ["A"] = 2, ["B"] = 4, ["C"] = 6, ["D"] = 8, ["E"] = 10,
- -- ["F"] = 12, ["G"] = 14, ["H"] = 16, ["I"] = 18, ["J"] = 20,
- -- ["K"] = 22, ["L"] = 24, ["M"] = 26, ["N"] = 28, ["O"] = 30,
- -- ["P"] = 32, ["Q"] = 34, ["R"] = 36, ["S"] = 38, ["T"] = 40,
- -- ["U"] = 42, ["V"] = 44, ["W"] = 46, ["X"] = 48, ["Y"] = 50,
- -- ["Z"] = 52,
-}
+definitions["en"] = { parent = "default" }
-- dutch
-replacements['nl'] = { { "ij", 'y' }, { "IJ", 'Y' } }
-entries ['nl'] = entries ['en']
-mappings ['nl'] = mappings['en']
-
--- czech
-
-local cz_ch = uc(replacement_offset + 1)
-local cz_CH = uc(replacement_offset + 2)
-
-replacements['cz'] = {
- [1] = { "ch", cz_ch }
-}
-
-entries['cz'] = {
- ['a'] = "a", -- a
- [uc(0x00E1)] = "a", -- aacute
- ['b'] = "b", -- b
- ['c'] = "c", -- c
- [uc(0x010D)] = uc(0x010D), -- ccaron
- ['d'] = "d", -- d
- [uc(0x010F)] = "d", -- dcaron
- ['e'] = "e", -- e
- [uc(0x00E9)] = "e", -- eacute
- [uc(0x011B)] = "e", -- ecaron
- ['f'] = "f", -- f
- ['g'] = "g", -- g
- ['h'] = "h", -- h
- [cz_ch] = "ch", -- ch
- ['i'] = "i", -- i
- [uc(0x00ED)] = "i", -- iacute
- ['j'] = "j", -- j
- ['k'] = "k", -- k
- ['l'] = "l", -- l
- ['m'] = "m", -- m
- ['n'] = "n", -- n
- ['ň'] = "n", -- ncaron
- ['o'] = "o", -- o
- ['p'] = "p", -- p
- ['q'] = "q", -- q
- ['r'] = "r", -- r
- ['ř'] = "ř", -- rcaron
- ['s'] = "s", -- s
- [uc(0x0161)] = uc(0x0161), -- scaron
- ['t'] = "t", -- t
- [uc(0x0165)] = "t", -- tcaron
- ['u'] = "u", -- u
- [uc(0x00FA)] = "u", -- uacute
- [uc(0x016F)] = "u", -- uring
- ['v'] = "v", -- v
- ['w'] = "w", -- w
- ['x'] = "x", -- x
- ['y'] = "y", -- y
- [uc(0x00FD)] = "y", -- yacute
- ['z'] = "z", -- z
- [uc(0x017E)] = uc(0x017E), -- zcaron
-}
-
-mappings['cz'] = {
- ['a'] = 1, -- a
- [uc(0x00E1)] = 3, -- aacute
- ['b'] = 5, -- b
- ['c'] = 7, -- c
- [uc(0x010D)] = 9, -- ccaron
- ['d'] = 11, -- d
- [uc(0x010F)] = 13, -- dcaron
- ['e'] = 15, -- e
- [uc(0x00E9)] = 17, -- eacute
- [uc(0x011B)] = 19, -- ecaron
- ['f'] = 21, -- f
- ['g'] = 23, -- g
- ['h'] = 25, -- h
- [cz_ch] = 27, -- ch
- ['i'] = 29, -- i
- [uc(0x00ED)] = 31, -- iacute
- ['j'] = 33, -- j
- ['k'] = 35, -- k
- ['l'] = 37, -- l
- ['m'] = 39, -- m
- ['n'] = 41, -- n
- ['ň'] = 43, -- ncaron
- ['o'] = 45, -- o
- ['p'] = 47, -- p
- ['q'] = 49, -- q
- ['r'] = 51, -- r
- ['ř'] = 53, -- rcaron
- ['s'] = 55, -- s
- [uc(0x0161)] = 57, -- scaron
- ['t'] = 59, -- t
- [uc(0x0165)] = 61, -- tcaron
- ['u'] = 63, -- u
- [uc(0x00FA)] = 65, -- uacute
- [uc(0x016F)] = 67, -- uring
- ['v'] = 69, -- v
- ['w'] = 71, -- w
- ['x'] = 73, -- x
- ['y'] = 75, -- y
- [uc(0x00FD)] = 77, -- yacute
- ['z'] = 79, -- z
- [uc(0x017E)] = 81, -- zcaron
-}
-
-add_uppercase_entries ("cz")
-add_uppercase_mappings("cz") -- 1 can be option (but then we need a runtime variant)
-
-entries ['cz'][cz_CH] = entries ['cz'][cz_ch]
-mappings['cz'][cz_CH] = mappings['cz'][cz_ch]
-
-replacements['cs'] = replacements['cz']
-entries ['cs'] = entries ['cz']
-mappings ['cs'] = mappings ['cz']
-
---~ print(table.serialize(mappings.cs))
+definitions['nl'] = {
+ parent = 'default',
+ replacements = {
+ { "ij", 'y' }, { "IJ", 'Y' },
+ },
+}
-- French
-entries ['fr'] = entries ['en']
-mappings['fr'] = mappings['en']
+definitions['fr'] = { parent = 'default' }
-- German (by Wolfgang Schuster)
-- DIN 5007-1
-entries ['DIN 5007-1'] = entries ['en']
-mappings ['DIN 5007-1'] = mappings['en']
+definitions['DIN 5007-1'] = { parent = 'default' }
-- DIN 5007-2
-replacements['DIN 5007-2'] = { -- todo: add_uppercase_replacements
- { "ä", 'ae' },
- { "ö", 'oe' },
- { "ü", 'ue' },
- { "Ä", 'Ae' },
- { "Ö", 'Oe' },
- { "Ü", 'Ue' },
+definitions['DIN 5007-2'] = {
+ parent = 'default',
+ replacements = {
+ { "ä", 'ae' }, { "Ä", 'Ae' },
+ { "ö", 'oe' }, { "Ö", 'Oe' },
+ { "ü", 'ue' }, { "Ü", 'Ue' },
+ },
}
---~ add_uppercase_replacements('DIN 5007-2')
+-- Duden
+
+definitions['Duden'] = {
+ parent = 'default',
+ replacements = { { "ß", 's' } },
+}
-entries ['DIN 5007-2'] = entries ['en']
-mappings ['DIN 5007-2'] = mappings['en']
+definitions['de'] = { parent = 'default' } -- new german
+definitions['deo'] = { parent = 'de' } -- old german
+definitions['de-DE'] = { parent = 'de' } -- german - Germany
+definitions['de-CH'] = { parent = 'de' } -- german - Swiss
--- Duden
+-- german - Austria
+
+definitions['de-AT'] = {
+ entries = {
+ ["a"] = "a", ["ä"] = "ä", ["b"] = "b", ["c"] = "c", ["d"] = "d",
+ ["e"] = "e", ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i",
+ ["j"] = "j", ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n",
+ ["o"] = "o", ["ö"] = "ö", ["p"] = "p", ["q"] = "q", ["r"] = "r",
+ ["s"] = "s", ["t"] = "t", ["u"] = "u", ["ü"] = "ü", ["v"] = "v",
+ ["w"] = "w", ["x"] = "x", ["y"] = "y", ["z"] = "z",
+ },
+ orders = {
+ "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",
+ },
+}
-replacements['Duden'] = { { "ß", 's' } }
-entries ['Duden'] = entries ['en']
-mappings ['Duden'] = mappings['en']
+-- finish (by Wolfgang Schuster)
--- new german
+definitions['fi'] = {
+ entries = {
+ ["a"] = "a", ["b"] = "b", ["c"] = "c", ["d"] = "d", ["e"] = "e",
+ ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i", ["j"] = "j",
+ ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o",
+ ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["t"] = "t",
+ ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y",
+ ["z"] = "z", ["å"] = "å", ["ä"] = "ä", ["ö"] = "ö",
+ },
+ orders = {
+ "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", "å", "ä", "ö",
+ }
+}
-entries ['de'] = entries ['en']
-mappings ['de'] = mappings['en']
+-- slovenian by MM: this will change since we need to add accented vowels
+
+definitions['sl'] = {
+ entries = {
+ ["a"] = "a", ["b"] = "b", ["c"] = "c", ["č"] = "č", ["ć"] = "ć", ["d"] = "d",
+ ["đ"] = "đ", ["e"] = "e", ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i",
+ ["j"] = "j", ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o",
+ ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["š"] = "š", ["t"] = "t",
+ ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y", ["z"] = "z",
+ ["ž"] = "ž",
+ },
+ orders = {
+ "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", "ž",
+ }
+}
--- old german
+-- The following data was provided by Philipp Gesang.
+
+definitions["ru"] = {
+ entries = {
+ ["а"] = "а", ["б"] = "б", ["в"] = "в", ["г"] = "г", ["д"] = "д",
+ ["е"] = "е", ["ё"] = "е", ["ж"] = "ж", ["з"] = "з", ["и"] = "и",
+ ["і"] = "и", ["й"] = "й", ["к"] = "к", ["л"] = "л", ["м"] = "м",
+ ["н"] = "н", ["о"] = "о", ["п"] = "п", ["р"] = "р", ["с"] = "с",
+ ["т"] = "т", ["у"] = "у", ["ф"] = "ф", ["х"] = "х", ["ц"] = "ц",
+ ["ч"] = "ч", ["ш"] = "ш", ["щ"] = "щ", ["ъ"] = "ъ", ["ы"] = "ы",
+ ["ь"] = "ь", ["ѣ"] = "ѣ", ["э"] = "э", ["ю"] = "ю", ["я"] = "я",
+ ["ѳ"] = "ѳ", ["ѵ"] = "ѵ",
+ },
+ orders = {
+ "а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и",
+ "і", "й", "к", "л", "м", "н", "о", "п", "р", "с",
+ "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы",
+ "ь", "ѣ", "э", "ю", "я", "ѳ", "ѵ",
+ }
+}
-entries ['deo'] = entries ['de']
-mappings ['deo'] = mappings['de']
+--- Basic Ukrainian
+
+definitions["uk"] = {
+ entries = {
+ ["а"] = "а", ["б"] = "б", ["в"] = "в", ["г"] = "г", ["ґ"] = "ґ",
+ ["д"] = "д", ["е"] = "е", ["є"] = "є", ["ж"] = "ж", ["з"] = "з",
+ ["и"] = "и", ["і"] = "і", ["ї"] = "ї", ["й"] = "й", ["к"] = "к",
+ ["л"] = "л", ["м"] = "м", ["н"] = "н", ["о"] = "о", ["п"] = "п",
+ ["р"] = "р", ["с"] = "с", ["т"] = "т", ["у"] = "у", ["ф"] = "ф",
+ ["х"] = "х", ["ц"] = "ц", ["ч"] = "ч", ["ш"] = "ш", ["щ"] = "щ",
+ ["ь"] = "ь", ["ю"] = "ю", ["я"] = "я",
+ },
+ orders = {
+ "а", "б", "в", "г", "ґ", "д", "е", "є", "ж", "з", "и", "і",
+ "ї", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у",
+ "ф", "х", "ц", "ч", "ш", "щ", "ь", "ю", "я",
+ }
+}
--- german - Germany
+--- Belarusian
+
+definitions["be"] = {
+ entries = {
+ ["а"] = "а", ["б"] = "б", ["в"] = "в", ["г"] = "г", ["д"] = "д",
+ ["е"] = "е", ["ё"] = "е", ["ж"] = "ж", ["з"] = "з", ["і"] = "і",
+ ["й"] = "й", ["к"] = "к", ["л"] = "л", ["м"] = "м", ["н"] = "н",
+ ["о"] = "о", ["п"] = "п", ["р"] = "р", ["с"] = "с", ["т"] = "т",
+ ["у"] = "у", ["ў"] = "ў", ["ф"] = "ф", ["х"] = "х", ["ц"] = "ц",
+ ["ч"] = "ч", ["ш"] = "ш", ["ы"] = "ы", ["ь"] = "ь", ["э"] = "э",
+ ["ю"] = "ю", ["я"] = "я",
+ },
+ orders = {
+ "а", "б", "в", "г", "д", "е", "ё", "ж", "з", "і",
+ "й", "к", "л", "м", "н", "о", "п", "р", "с", "т",
+ "у", "ў", "ф", "х", "ц", "ч", "ш", "ы", "ь", "э",
+ "ю", "я",
+ }
+}
-entries ['de-DE'] = entries ['de']
-mappings ['de-DE'] = mappings['de']
+--- Bulgarian
+
+definitions["bg"] = {
+ entries = {
+ ["а"] = "а", ["б"] = "б", ["в"] = "в", ["г"] = "г", ["д"] = "д",
+ ["е"] = "е", ["ж"] = "ж", ["з"] = "з", ["и"] = "и", ["й"] = "й",
+ ["к"] = "к", ["a"] = "a", ["л"] = "л", ["a"] = "a", ["м"] = "м",
+ ["н"] = "н", ["о"] = "о", ["п"] = "п", ["р"] = "р", ["с"] = "с",
+ ["т"] = "т", ["у"] = "у", ["ф"] = "ф", ["х"] = "х", ["ц"] = "ц",
+ ["ч"] = "ч", ["ш"] = "ш", ["щ"] = "щ", ["ъ"] = "ъ", ["ь"] = "ь",
+ ["ю"] = "ю", ["я"] = "я",
+ },
+ orders = {
+ "а", "б", "в", "г", "д", "е", "ж", "з","и", "й",
+ "к", "a", "л", "a", "м", "н", "о", "п", "р", "с",
+ "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ь",
+ "ю", "я",
+ }
+}
--- german - Swiss
+--- Old Church Slavonic
+
+-- The language symbol “cu” is taken from the Wikipedia subdomain
+-- cu.wikipedia.org.
+
+local uk, UK = utfchar(replacementoffset + 1), utfchar(replacementoffset + 11)
+
+definitions["cu"] = {
+ replacements = {
+ { "оу", uk }, { "ОУ", UK },
+ },
+ entries = {
+ ["а"] = "а", ["б"] = "б", ["в"] = "в", ["г"] = "г", ["д"] = "д",
+ ["є"] = "є", ["ж"] = "ж", ["ѕ"] = "ѕ", ["ꙃ"] = "ѕ", ["з"] = "з",
+ ["ꙁ"] = "з", ["и"] = "и", ["і"] = "и", ["ї"] = "и", ["ћ"] = "ћ",
+ ["к"] = "к", ["л"] = "л", ["м"] = "м", ["н"] = "н", ["о"] = "о",
+ ["п"] = "п", ["р"] = "р", ["с"] = "с", ["т"] = "т", ["у"] = "у",
+ ["ѹ"] = "у", ["ꙋ"] = "у", [uk] = "у", ["ф"] = "ф", ["х"] = "х",
+ ["ѡ"] = "ѡ", ["ѿ"] = "ѡ", ["ѽ"] = "ѡ", ["ꙍ"] = "ѡ", ["ц"] = "ц",
+ ["ч"] = "ч", ["ш"] = "ш", ["щ"] = "щ", ["ъ"] = "ъ", ["ы"] = "ы",
+ ["ꙑ"] = "ы", ["ь"] = "ь", ["ѣ"] = "ѣ", ["ю"] = "ю", ["ꙗ"] = "ꙗ",
+ ["ѥ"] = "ѥ", ["ѧ"] = "ѧ", ["ѩ"] = "ѩ", ["ѫ"] = "ѫ", ["ѭ"] = "ѭ",
+ ["ѯ"] = "ѯ", ["ѱ"] = "ѱ", ["ѳ"] = "ѳ", ["ѵ"] = "ѵ", ["ѷ"] = "ѵ",
+ },
+ orders = {
+ "а", "б", "в", "г", "д", "є", "ж", "ѕ", "ꙃ", "з", -- Dzělo, U+0292, alternative: dz U+01f3
+ "ꙁ", "и", "і", "ї", "ћ", "к", "л", "м", "н", "о", -- Zemlja
+ "п", "р", "с", "т", "у", "ѹ", "ꙋ", uk, "ф", "х", -- U+0478 uk, horizontal ligature, U+0479 uk, vertical ligature
+ "ѡ", "ѿ", "ѽ", "ꙍ", "ц", "ч", "ш", "щ", "ъ", "ы", -- "ō", U+047f \, U+047d > Omega variants, U+064D /
+ "ꙑ", "ь", "ѣ", "ю", "ꙗ", "ѥ", "ѧ", "ѩ", "ѫ", "ѭ", -- Old jery (U+a651) as used e.g. by the OCS Wikipedia. IOTIFIED A
+ "ѯ", "ѱ", "ѳ", "ѵ", "ѷ",
+ },
+ upper = {
+ uk = UK,
+ },
+ lower = {
+ UK = uk,
+ }
+}
-entries ['de-CH'] = entries ['de']
-mappings ['de-CH'] = mappings['de']
+--- Polish (including the letters q, v, x) Cf. ftp://ftp.gust.org.pl/pub/GUST/bulletin/03/02-bl.pdf.
+
+definitions["pl"] = {
+ entries = {
+ ["a"] = "a", ["ą"] = "ą", ["b"] = "b", ["c"] = "c", ["ć"] = "ć",
+ ["d"] = "d", ["e"] = "e", ["ę"] = "ę", ["f"] = "f", ["g"] = "g",
+ ["h"] = "h", ["i"] = "i", ["j"] = "j", ["k"] = "k", ["l"] = "l",
+ ["ł"] = "ł", ["m"] = "m", ["n"] = "n", ["ń"] = "ń", ["o"] = "o",
+ ["ó"] = "ó", ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s",
+ ["ś"] = "ś", ["t"] = "t", ["u"] = "u", ["v"] = "v", ["w"] = "w",
+ ["x"] = "x", ["y"] = "y", ["z"] = "z", ["ź"] = "ź", ["ż"] = "ż",
+ },
+ orders = {
+ "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", "ź", "ż",
+ },
+}
--- german - Austria
+-- Czech, modified to treat quantities and other secondary characteristics indifferently. Cf.
+-- http://racek.vlada.cz/usneseni/usneseni_webtest.nsf/WebGovRes/0AD8FEF4CC04B7A4C12571B6006D69D0?OpenDocument
+-- (2.4.3; via <http://cs.wikipedia.org/wiki/Abecední_řazení#.C4.8Ce.C5.A1tina>)
+
+local ch, CH = utfchar(replacementoffset + 1), utfchar(replacementoffset + 11)
+
+definitions["cz"] = {
+ replacements = {
+ { "ch", ch }, { "CH", CH }
+ },
+ entries = {
+ ["a"] = "a", ["á"] = "a", ["b"] = "b", ["c"] = "c", ["č"] = "č",
+ ["d"] = "d", ["ď"] = "d", ["e"] = "e", ["é"] = "e", ["ě"] = "e",
+ ["f"] = "f", ["g"] = "g", ["h"] = "h", [ch] = "ch", ["i"] = "i",
+ ["í"] = "i", ["j"] = "j", ["k"] = "k", ["l"] = "l", ["m"] = "m",
+ ["n"] = "n", ["ň"] = "n", ["o"] = "o", ["ó"] = "o", ["p"] = "p",
+ ["q"] = "q", ["r"] = "r", ["ř"] = "ř", ["s"] = "s", ["š"] = "š",
+ ["t"] = "t", ["ť"] = "t", ["u"] = "u", ["ú"] = "u", ["ů"] = "u",
+ ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y", ["ý"] = "y",
+ ["z"] = "z", ["ž"] = "ž",
+ },
+ orders = {
+ "a", "á", "b", "c", "č", "d", "ď", "e", "é", "ě",
+ "f", "g", "h", ch, "i", "í", "j", "k", "l", "m",
+ "n", "ň", "o", "ó", "p", "q", "r", "ř", "s", "š",
+ "t", "ť", "u", "ú", "ů", "v", "w", "x", "y", "ý",
+ "z", "ž",
+ },
+ upper = {
+ ch = CH,
+ },
+ lower = {
+ CH = ch,
+ }
+}
-entries['de-AT'] = {
- ["a"] = "a", ["ä"] = "ä", ["b"] = "b", ["c"] = "c", ["d"] = "d",
- ["e"] = "e", ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i",
- ["j"] = "j", ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n",
- ["o"] = "o", ["ö"] = "ö", ["p"] = "p", ["q"] = "q", ["r"] = "r",
- ["s"] = "s", ["t"] = "t", ["u"] = "u", ["ü"] = "ü", ["v"] = "v",
- ["w"] = "w", ["x"] = "x", ["y"] = "y", ["z"] = "z",
--- ["A"] = "a", ["Ä"] = "ä", ["B"] = "b", ["C"] = "c", ["D"] = "d",
--- ["E"] = "e", ["F"] = "f", ["G"] = "g", ["H"] = "h", ["I"] = "i",
--- ["J"] = "j", ["K"] = "k", ["L"] = "l", ["M"] = "m", ["N"] = "n",
--- ["O"] = "o", ["Ö"] = "ö", ["P"] = "p", ["Q"] = "q", ["R"] = "r",
--- ["S"] = "s", ["T"] = "t", ["U"] = "u", ["Ü"] = "ü", ["V"] = "v",
--- ["W"] = "w", ["X"] = "x", ["Y"] = "y", ["Z"] = "z",
-}
-
-mappings['de-AT'] = {
- ["a"] = 1, ["ä"] = 3, ["b"] = 5, ["c"] = 7, ["d"] = 9,
- ["e"] = 11, ["f"] = 13, ["g"] = 15, ["h"] = 17, ["i"] = 19,
- ["j"] = 21, ["k"] = 23, ["l"] = 25, ["m"] = 27, ["n"] = 29,
- ["o"] = 31, ["ö"] = 33, ["p"] = 35, ["q"] = 37, ["r"] = 39,
- ["s"] = 41, ["t"] = 43, ["u"] = 45, ["ü"] = 47, ["v"] = 49,
- ["w"] = 51, ["x"] = 53, ["y"] = 55, ["z"] = 57,
--- ["A"] = 2, ["Ä"] = 4, ["B"] = 6, ["C"] = 8, ["D"] = 10,
--- ["E"] = 12, ["F"] = 14, ["G"] = 16, ["H"] = 18, ["I"] = 20,
--- ["J"] = 22, ["K"] = 24, ["L"] = 26, ["M"] = 28, ["N"] = 30,
--- ["O"] = 32, ["Ö"] = 34, ["P"] = 36, ["Q"] = 38, ["R"] = 40,
--- ["S"] = 42, ["T"] = 44, ["U"] = 46, ["Ü"] = 48, ["V"] = 50,
--- ["W"] = 52, ["X"] = 54, ["Y"] = 56, ["Z"] = 58,
-}
-
-add_uppercase_entries ('de-AT')
-add_uppercase_mappings('de-AT',1)
+definitions["cs"] = { parent = "cz" }
+
+--- Slovak.
+
+-- Vowel and consonant quantities, "ď", "ľ", "ň", "ť", "ô", and "ä" are treated
+-- indifferently as their base character, as in my dictionary. If you prefer them
+-- to affect collation order, then use the values given in the comments. We could
+-- define an additional vector for that.
+
+local dz, DZ = utfchar(replacementoffset + 1), utfchar(replacementoffset + 11)
+local dzh, DZH = utfchar(replacementoffset + 2), utfchar(replacementoffset + 12)
+local ch, CH = utfchar(replacementoffset + 3), utfchar(replacementoffset + 13)
+
+definitions["sk"] = {
+ replacements = {
+ { "dz", dz }, { "dz", DZ },
+ { "dž", dzh }, { "dž", DZH },
+ { "ch", ch }, { "ch", CH },
+ },
+ entries = {
+ ["a"] = "a", ["á"] = "a", ["ä"] = "a", ["b"] = "b", ["c"] = "c",
+ ["č"] = "č", ["d"] = "d", ["ď"] = "d", [dz] = "dz", [dzh] = "dž",
+ ["e"] = "e", ["é"] = "e", ["f"] = "f", ["g"] = "g", ["h"] = "h",
+ [ch] = "ch", ["i"] = "i", ["í"] = "i", ["j"] = "j", ["k"] = "k",
+ ["l"] = "l", ["ĺ"] = "l", ["ľ"] = "l", ["m"] = "m", ["n"] = "n",
+ ["ň"] = "n", ["o"] = "o", ["ó"] = "o", ["ô"] = "o", ["p"] = "p",
+ ["q"] = "q", ["r"] = "r", ["ŕ"] = "r", ["s"] = "s", ["š"] = "š",
+ ["t"] = "t", ["ť"] = "t", ["u"] = "u", ["ú"] = "u", ["v"] = "v",
+ ["w"] = "w", ["x"] = "x", ["y"] = "y", ["ý"] = "y", ["z"] = "z",
+ ["ž"] = "ž",
+ },
+ orders = {
+ "a", "á", "ä", "b", "c", "č", "d", "ď", dz, dzh,
+ "e", "é", "f", "g", "h", ch, "i", "í", "j", "k",
+ "l", "ĺ", "ľ", "m", "n", "ň", "o", "ó", "ô", "p",
+ "q", "r", "ŕ", "s", "š", "t", "ť", "u", "ú", "v",
+ "w", "x", "y", "ý", "z", "ž",
+ },
+ upper = {
+ dz = DZ, dzh = DZH, ch = CH,
+ },
+ lower = {
+ DZ = dz, DZH = dzh, CH = ch,
+ }
+}
--- finish (by Wolfgang Schuster)
+--- Croatian
+
+local dzh, DZH = utfchar(replacementoffset + 1), utfchar(replacementoffset + 11)
+local lj, LJ = utfchar(replacementoffset + 2), utfchar(replacementoffset + 12)
+local nj, NJ = utfchar(replacementoffset + 3), utfchar(replacementoffset + 13)
+
+definitions["hr"] = {
+ replacements = {
+ { "dž", dzh }, { "DŽ", DZH },
+ { "lj", lj }, { "LJ", LJ },
+ { "nj", nj }, { "NJ", NJ },
+ },
+ entries = {
+ ["a"] = "a", ["b"] = "b", ["c"] = "c", ["č"] = "č", ["ć"] = "ć",
+ ["d"] = "d", [dzh] = "dž", ["đ"] = "đ", ["e"] = "e", ["f"] = "f",
+ ["g"] = "g", ["h"] = "h", ["i"] = "i", ["j"] = "j", ["k"] = "k",
+ ["l"] = "l", [lj] = "lj", ["m"] = "m", ["n"] = "n", [nj] = "nj",
+ ["o"] = "o", ["p"] = "p", ["r"] = "r", ["s"] = "s", ["š"] = "š",
+ ["t"] = "t", ["u"] = "u", ["v"] = "v", ["z"] = "z", ["ž"] = "ž",
+ },
+ orders = {
+ "a", "b", "c", "č", "ć", "d", dzh, "đ", "e", "f",
+ "g", "h", "i", "j", "k", "l", lj, "m", "n", nj,
+ "o", "p", "r", "s", "š", "t", "u", "v", "z", "ž",
+ },
+ upper = {
+ dzh = DZH, lj = LJ, nj = NJ,
+ },
+ lower = {
+ DZH = dzh, LJ = lj, NJ = nj,
+ }
+}
-entries['fi'] = {
- ["a"] = "a", ["b"] = "b", ["c"] = "c", ["d"] = "d", ["e"] = "e",
- ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i", ["j"] = "j",
- ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o",
- ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["t"] = "t",
- ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y",
- ["z"] = "z", ["å"] = "å", ["ä"] = "ä", ["ö"] = "ö",
+
+--- Serbian
+
+definitions["sr"] = {
+ entries = {
+ ["а"] = "а", ["б"] = "б", ["в"] = "в", ["г"] = "г", ["д"] = "д",
+ ["ђ"] = "ђ", ["е"] = "е", ["ж"] = "ж", ["з"] = "з", ["и"] = "и",
+ ["ј"] = "ј", ["к"] = "к", ["л"] = "л", ["љ"] = "љ", ["м"] = "м",
+ ["н"] = "н", ["њ"] = "њ", ["о"] = "о", ["п"] = "п", ["р"] = "р",
+ ["с"] = "с", ["т"] = "т", ["ћ"] = "ћ", ["у"] = "у", ["ф"] = "ф",
+ ["х"] = "х", ["ц"] = "ц", ["ч"] = "ч", ["џ"] = "џ",
+ ["ш"] = "ш",
+ },
+ orders = {
+ "а", "б", "в", "г", "д", "ђ", "е", "ж", "з", "и",
+ "ј", "к", "л", "љ", "м", "н", "њ", "о", "п", "р",
+ "с", "т", "ћ", "у", "ф", "х", "ц", "ч", "џ", "ш",
+ }
+}
+
+--- Transliteration: Russian|ISO9-1995
+
+-- Keeping the same collation order as Russian (v.s.).
+-- Matches the tables from:
+-- http://bitbucket.org/phg/transliterator/src/tip/tex/context/third/transliterator/trans_tables_iso9.lua
+
+local yer = utfchar(replacementoffset + 1)
+
+definitions["ru-iso9"] = {
+ replacements = {
+ { "''", yer },
+ },
+ entries = {
+ ["a"] = "a", ["b"] = "b", ["v"] = "v", ["g"] = "g", ["d"] = "d",
+ ["e"] = "e", ["ë"] = "ë", ["ž"] = "ž", ["z"] = "z", ["i"] = "i",
+ ["ì"] = "ì", ["j"] = "j", ["k"] = "k", ["l"] = "l", ["m"] = "m",
+ ["n"] = "n", ["o"] = "o", ["p"] = "p", ["r"] = "r", ["s"] = "s",
+ ["t"] = "t", ["u"] = "u", ["f"] = "f", ["h"] = "h", ["c"] = "c",
+ ["č"] = "č", ["š"] = "š", ["ŝ"] = "ŝ", ["ʺ"] = "ʺ", [yer] = "ʺ",
+ ["y"] = "y", ["ʹ"] = "ʹ", ["'"] = "ʹ", ["ě"] = "ě", ["è"] = "è",
+ ["û"] = "û", ["â"] = "â", ["û"] = "û", ["â"] = "â",
+ },
+ orders = {
+ "a", "b", "v", "g", "d", "e", "ë", "ž", "z", "i",
+ "ì", "j", "k", "l", "m", "n", "o", "p", "r", "s",
+ "t", "u", "f", "h", "c", "č", "š", "ŝ", "ʺ", yer,
+ "y", "ʹ", "'", "ě", "è", "û", "â", "û", "â",
+ }
+}
+
+--- Transliteration: Old Slavonic|scientific
+
+-- Matches the tables from:
+-- http://bitbucket.org/phg/transliterator/src/tip/tex/context/third/transliterator/trans_tables_scntfc.lua
+
+local uk, UK = utfchar(replacementoffset + 1), utfchar(replacementoffset + 21)
+local tshe, TSHE = utfchar(replacementoffset + 2), utfchar(replacementoffset + 22)
+local sht, SHT = utfchar(replacementoffset + 3), utfchar(replacementoffset + 23)
+local ju, JU = utfchar(replacementoffset + 4), utfchar(replacementoffset + 24)
+local ja, JA = utfchar(replacementoffset + 5), utfchar(replacementoffset + 25)
+local je, JE = utfchar(replacementoffset + 6), utfchar(replacementoffset + 26)
+local ijus, IJUS = utfchar(replacementoffset + 7), utfchar(replacementoffset + 27)
+local ibigjus, IBIGJUS = utfchar(replacementoffset + 8), utfchar(replacementoffset + 28)
+local xi, XI = utfchar(replacementoffset + 9), utfchar(replacementoffset + 29)
+local psi, PSI = utfchar(replacementoffset + 10), utfchar(replacementoffset + 30)
+local theta, THETA = utfchar(replacementoffset + 11), utfchar(replacementoffset + 31)
+local shch, SHCH = utfchar(replacementoffset + 12), utfchar(replacementoffset + 32)
+
+definitions["ocs-scn"] = {
+ replacements = {
+ { "ou", uk }, { "OU", UK },
+ { "g’", tshe }, { "G’", TSHE },
+ { "št", sht }, { "ŠT", SHT },
+ { "ju", ju }, { "JU", JU },
+ { "ja", ja }, { "JA", JA },
+ { "je", je }, { "JE", JE },
+ { "ję", ijus }, { "JĘ", IJUS },
+ { "jǫ", ibigjus }, { "JǪ", IBIGJUS },
+ { "ks", xi }, { "KS", XI },
+ { "ps", psi }, { "PS", PSI },
+ { "th", theta }, { "TH", THETA },
+ { "šč", shch }, { "ŠČ", SHCH },
+ },
+ entries = {
+ ["a"] = "a", ["b"] = "b", ["v"] = "v", ["g"] = "g", ["d"] = "d",
+ ["e"] = "e", ["ž"] = "ž", ["ʒ"] = "ʒ", ["z"] = "z", ["i"] = "i",
+ ["ï"] = "ï", [tshe] = "g’", ["k"] = "k", ["l"] = "l", ["m"] = "m",
+ ["n"] = "n", ["o"] = "o", ["p"] = "p", ["r"] = "r", ["s"] = "s",
+ ["t"] = "t", ["u"] = "u", ["f"] = "f", ["x"] = "x", ["o"] = "o",
+ ["c"] = "c", ["č"] = "č", ["š"] = "š", [sht] = "št", [shch] = "šč",
+ ["ъ"] = "ъ", ["y"] = "y", [uk] = "y", ["ь"] = "ь", ["ě"] = "ě",
+ [ju] = "ju", [ja] = "ja", [je] = "je", ["ę"] = "ę", [ijus] = "ję",
+ ["ǫ"] = "ǫ", [ibigjus] = "jǫ", [xi] = "ks", [psi] = "ps", [theta] = "th",
+ ["ü"] = "ü",
+ },
+ orders = {
+ "a", "b", "v", "g", "d", "e", "ž", "ʒ", "z", "i", "ï",
+ tshe, "k", "l", "m", "n", "o", "p", "r", "s", "t", "u",
+ "f", "x", "o", "c", "č", "š", sht, shch, "ъ", "y", uk,
+ "ь", "ě", ju, ja, je, "ę", ijus, "ǫ", ibigjus, xi, psi,
+ theta, "ü",
+ },
+ upper = {
+ uk = UK, tshe = TSHE, sht = SHT, ju = JU, ja = JA, je = JE, ijus = IJUS, ibigjus = IBIGJUS, xi = XI, psi = PSI, theta = THETA, shch = SHCH,
+ },
+ lower = {
+ UK = uk, TSHE = tshe, SHT = sht, JU = ju, JA = ja, JE = je, IJUS = ijus, IBIGJUS = ibigjus, XI = xi, PSI = psi, THETA = theta, SHCH = shch,
+ },
+}
+
+
+--- Norwegian (bokmål).
+
+definitions["no"] = {
+ entries = {
+ ["a"] = "a", ["b"] = "b", ["c"] = "c", ["d"] = "d", ["e"] = "e",
+ ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i", ["j"] = "j",
+ ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o",
+ ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["t"] = "t",
+ ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y",
+ ["z"] = "z", ["æ"] = "æ", ["ø"] = "ø", ["å"] = "å",
+ },
+ orders = {
+ "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", "æ", "ø", "å",
+ }
+}
+
+--- Danish (-> Norwegian).
+
+definitions["da"] = { parent = "no" }
+
+--- Swedish
+
+definitions["sv"] = {
+ entries = {
+ ["a"] = "a", ["b"] = "b", ["c"] = "c", ["d"] = "d", ["e"] = "e",
+ ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i", ["j"] = "j",
+ ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o",
+ ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["t"] = "t",
+ ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y",
+ ["z"] = "z", ["å"] = "å", ["ä"] = "ä", ["ö"] = "ö",
+ },
+ orders = {
+ "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", "å", "ä", "ö",
+ }
+}
+
+--- Icelandic
+
+-- Treating quantities as allographs.
+
+definitions["is"] = {
+ entries = {
+ ["a"] = "a", ["á"] = "a", ["b"] = "b", ["d"] = "d", ["ð"] = "ð",
+ ["e"] = "e", ["é"] = "e", ["f"] = "f", ["g"] = "g", ["h"] = "h",
+ ["i"] = "i", ["í"] = "i", ["j"] = "j", ["k"] = "k", ["l"] = "l",
+ ["m"] = "m", ["n"] = "n", ["o"] = "o", ["ó"] = "o", ["p"] = "p",
+ ["r"] = "r", ["s"] = "s", ["t"] = "t", ["u"] = "u", ["ú"] = "u",
+ ["v"] = "v", ["x"] = "x", ["y"] = "y", ["ý"] = "y", ["þ"] = "þ",
+ ["æ"] = "æ", ["ö"] = "ö",
+ },
+ orders = {
+ "a", "á", "b", "d", "ð", "e", "é", "f", "g", "h",
+ "i", "í", "j", "k", "l", "m", "n", "o", "ó", "p",
+ "r", "s", "t", "u", "ú", "v", "x", "y", "ý", "þ",
+ "æ", "ö",
+ },
+}
+
+--- Greek
+
+definitions["gr"] = {
+ entries = {
+ ["α"] = "α", ["ά"] = "α", ["ὰ"] = "α", ["ᾶ"] = "α", ["ᾳ"] = "α",
+ ["ἀ"] = "α", ["ἁ"] = "α", ["ἄ"] = "α", ["ἂ"] = "α", ["ἆ"] = "α",
+ ["ἁ"] = "α", ["ἅ"] = "α", ["ἃ"] = "α", ["ἇ"] = "α", ["ᾁ"] = "α",
+ ["ᾴ"] = "α", ["ᾲ"] = "α", ["ᾷ"] = "α", ["ᾄ"] = "α", ["ᾂ"] = "α",
+ ["ᾅ"] = "α", ["ᾃ"] = "α", ["ᾆ"] = "α", ["ᾇ"] = "α", ["β"] = "β",
+ ["γ"] = "γ", ["δ"] = "δ", ["ε"] = "ε", ["έ"] = "ε", ["ὲ"] = "ε",
+ ["ἐ"] = "ε", ["ἔ"] = "ε", ["ἒ"] = "ε", ["ἑ"] = "ε", ["ἕ"] = "ε",
+ ["ἓ"] = "ε", ["ζ"] = "ζ", ["η"] = "η", ["η"] = "η", ["ή"] = "η",
+ ["ὴ"] = "η", ["ῆ"] = "η", ["ῃ"] = "η", ["ἠ"] = "η", ["ἤ"] = "η",
+ ["ἢ"] = "η", ["ἦ"] = "η", ["ᾐ"] = "η", ["ἡ"] = "η", ["ἥ"] = "η",
+ ["ἣ"] = "η", ["ἧ"] = "η", ["ᾑ"] = "η", ["ῄ"] = "η", ["ῂ"] = "η",
+ ["ῇ"] = "η", ["ᾔ"] = "η", ["ᾒ"] = "η", ["ᾕ"] = "η", ["ᾓ"] = "η",
+ ["ᾖ"] = "η", ["ᾗ"] = "η", ["θ"] = "θ", ["ι"] = "ι", ["ί"] = "ι",
+ ["ὶ"] = "ι", ["ῖ"] = "ι", ["ἰ"] = "ι", ["ἴ"] = "ι", ["ἲ"] = "ι",
+ ["ἶ"] = "ι", ["ἱ"] = "ι", ["ἵ"] = "ι", ["ἳ"] = "ι", ["ἷ"] = "ι",
+ ["ϊ"] = "ι", ["ΐ"] = "ι", ["ῒ"] = "ι", ["ῗ"] = "ι", ["κ"] = "κ",
+ ["λ"] = "λ", ["μ"] = "μ", ["ν"] = "ν", ["ξ"] = "ξ", ["ο"] = "ο",
+ ["ό"] = "ο", ["ὸ"] = "ο", ["ὀ"] = "ο", ["ὄ"] = "ο", ["ὂ"] = "ο",
+ ["ὁ"] = "ο", ["ὅ"] = "ο", ["ὃ"] = "ο", ["π"] = "π", ["ρ"] = "ρ",
+ ["ῤ"] = "ῤ", ["ῥ"] = "ῥ", ["σ"] = "σ", ["ς"] = "ς", ["τ"] = "τ",
+ ["υ"] = "υ", ["ύ"] = "υ", ["ὺ"] = "υ", ["ῦ"] = "υ", ["ὐ"] = "υ",
+ ["ὔ"] = "υ", ["ὒ"] = "υ", ["ὖ"] = "υ", ["ὑ"] = "υ", ["ὕ"] = "υ",
+ ["ὓ"] = "υ", ["ὗ"] = "υ", ["ϋ"] = "υ", ["ΰ"] = "υ", ["ῢ"] = "υ",
+ ["ῧ"] = "υ", ["φ"] = "φ", ["χ"] = "χ", ["ψ"] = "ω", ["ω"] = "ω",
+ ["ώ"] = "ω", ["ὼ"] = "ω", ["ῶ"] = "ω", ["ῳ"] = "ω", ["ὠ"] = "ω",
+ ["ὤ"] = "ω", ["ὢ"] = "ω", ["ὦ"] = "ω", ["ᾠ"] = "ω", ["ὡ"] = "ω",
+ ["ὥ"] = "ω", ["ὣ"] = "ω", ["ὧ"] = "ω", ["ᾡ"] = "ω", ["ῴ"] = "ω",
+ ["ῲ"] = "ω", ["ῷ"] = "ω", ["ᾤ"] = "ω", ["ᾢ"] = "ω", ["ᾥ"] = "ω",
+ ["ᾣ"] = "ω", ["ᾦ"] = "ω", ["ᾧ"] = "ω",
+ },
+ orders = {
+ "α", "ά", "ὰ", "ᾶ", "ᾳ", "ἀ", "ἁ", "ἄ", "ἂ", "ἆ",
+ "ἁ", "ἅ", "ἃ", "ἇ", "ᾁ", "ᾴ", "ᾲ", "ᾷ", "ᾄ", "ᾂ",
+ "ᾅ", "ᾃ", "ᾆ", "ᾇ", "β", "γ", "δ", "ε", "έ", "ὲ",
+ "ἐ", "ἔ", "ἒ", "ἑ", "ἕ", "ἓ", "ζ", "η", "η", "ή",
+ "ὴ", "ῆ", "ῃ", "ἠ", "ἤ", "ἢ", "ἦ", "ᾐ", "ἡ", "ἥ",
+ "ἣ", "ἧ", "ᾑ", "ῄ", "ῂ", "ῇ", "ᾔ", "ᾒ", "ᾕ", "ᾓ",
+ "ᾖ", "ᾗ", "θ", "ι", "ί", "ὶ", "ῖ", "ἰ", "ἴ", "ἲ",
+ "ἶ", "ἱ", "ἵ", "ἳ", "ἷ", "ϊ", "ΐ", "ῒ", "ῗ", "κ",
+ "λ", "μ", "ν", "ξ", "ο", "ό", "ὸ", "ὀ", "ὄ", "ὂ",
+ "ὁ", "ὅ", "ὃ", "π", "ρ", "ῤ", "ῥ", "σ", "ς", "τ",
+ "υ", "ύ", "ὺ", "ῦ", "ὐ", "ὔ", "ὒ", "ὖ", "ὑ", "ὕ",
+ "ὓ", "ὗ", "ϋ", "ΰ", "ῢ", "ῧ", "φ", "χ", "ψ", "ω",
+ "ώ", "ὼ", "ῶ", "ῳ", "ὠ", "ὤ", "ὢ", "ὦ", "ᾠ", "ὡ",
+ "ὥ", "ὣ", "ὧ", "ᾡ", "ῴ", "ῲ", "ῷ", "ᾤ", "ᾢ", "ᾥ",
+ "ᾣ", "ᾦ", "ᾧ",
+ },
}
-mappings['fi'] = {
- ["a"] = 1, ["b"] = 3, ["c"] = 5, ["d"] = 7, ["e"] = 9,
- ["f"] = 11, ["g"] = 13, ["h"] = 15, ["i"] = 17, ["j"] = 19,
- ["k"] = 21, ["l"] = 23, ["m"] = 25, ["n"] = 27, ["o"] = 29,
- ["p"] = 31, ["q"] = 33, ["r"] = 35, ["s"] = 37, ["t"] = 39,
- ["u"] = 41, ["v"] = 43, ["w"] = 45, ["x"] = 47, ["y"] = 49,
- ["z"] = 51, ["å"] = 53, ["ä"] = 55, ["ö"] = 57,
+--- Latin
+
+-- Treating the post-classical fricatives “j” and “v” as “i” and “u”
+-- respectively.
+
+definitions["la"] = {
+ replacements = {
+ { "æ", "ae" }, { "Æ", "AE" },
+ },
+ entries = {
+ ["a"] = "a", ["ā"] = "a", ["ă"] = "a", ["b"] = "b", ["c"] = "c",
+ ["d"] = "d", ["e"] = "e", ["ē"] = "e", ["ĕ"] = "e", ["f"] = "f",
+ ["g"] = "g", ["h"] = "h", ["i"] = "i", ["ī"] = "i", ["ĭ"] = "i",
+ ["j"] = "i", ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n",
+ ["o"] = "o", ["ō"] = "o", ["ŏ"] = "o", ["p"] = "p", ["q"] = "q",
+ ["r"] = "r", ["s"] = "s", ["t"] = "t", ["u"] = "u", ["ū"] = "u",
+ ["ŭ"] = "u", ["v"] = "u", ["w"] = "w", ["x"] = "x", ["y"] = "y",
+ ["ȳ"] = "y", ["y̆"] = "y", ["z"] = "z",
+ },
+ orders = {
+ "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", "ȳ", "y̆", "z",
+ }
}
-add_uppercase_entries ("fi")
-add_uppercase_mappings("fi")
+--- Italian
+
+definitions["it"] = {
+ entries = {
+ ["a"] = "a", ["á"] = "a", ["b"] = "b", ["c"] = "c", ["d"] = "d",
+ ["e"] = "e", ["é"] = "e", ["è"] = "e", ["f"] = "f", ["g"] = "g",
+ ["h"] = "h", ["i"] = "i", ["í"] = "i", ["ì"] = "i", ["j"] = "i",
+ ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o",
+ ["ó"] = "o", ["ò"] = "o", ["p"] = "p", ["q"] = "q", ["r"] = "r",
+ ["s"] = "s", ["t"] = "t", ["u"] = "u", ["ú"] = "u", ["ù"] = "u",
+ ["v"] = "u", ["w"] = "w", ["x"] = "x", ["y"] = "y", ["z"] = "z",
+ },
+ orders = {
+ "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",
+ }
+}
+
+--- Romanian
+
+definitions["ro"] = {
+ entries = {
+ ["a"] = "a", ["ă"] = "ă", ["â"] = "â", ["b"] = "b", ["c"] = "c",
+ ["d"] = "d", ["e"] = "e", ["f"] = "f", ["g"] = "g", ["h"] = "h",
+ ["i"] = "i", ["î"] = "î", ["j"] = "j", ["k"] = "k", ["l"] = "l",
+ ["m"] = "m", ["n"] = "n", ["o"] = "o", ["p"] = "p", ["q"] = "q",
+ ["r"] = "r", ["s"] = "s", ["ș"] = "ș", ["t"] = "t", ["ț"] = "ț",
+ ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y",
+ ["z"] = "z",
+ },
+ orders = {
+ "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",
+ }
+}
+
+--- Spanish
+
+definitions["es"] = {
+ entries = {
+ ["a"] = "a", ["á"] = "a", ["b"] = "b", ["c"] = "c", ["d"] = "d",
+ ["e"] = "e", ["é"] = "e", ["f"] = "f", ["g"] = "g", ["h"] = "h",
+ ["i"] = "i", ["í"] = "i", ["j"] = "j", ["k"] = "k", ["l"] = "l",
+ ["m"] = "m", ["n"] = "n", ["ñ"] = "ñ", ["o"] = "o", ["ó"] = "o",
+ ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["t"] = "t",
+ ["u"] = "u", ["ú"] = "u", ["ü"] = "u", ["v"] = "v", ["w"] = "w",
+ ["x"] = "x", ["y"] = "y", ["z"] = "z",
+ },
+ orders = {
+ "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",
+ }
+}
+
+--- Portuguese
+
+definitions["pt"] = {
+ entries = {
+ ["a"] = "a", ["á"] = "a", ["â"] = "a", ["ã"] = "a", ["à"] = "a",
+ ["b"] = "b", ["c"] = "c", ["ç"] = "c", ["d"] = "d", ["e"] = "e",
+ ["é"] = "e", ["ê"] = "e", ["f"] = "f", ["g"] = "g", ["h"] = "h",
+ ["i"] = "i", ["í"] = "i", ["j"] = "j", ["k"] = "k", ["l"] = "l",
+ ["m"] = "m", ["n"] = "n", ["o"] = "o", ["ó"] = "o", ["ô"] = "o",
+ ["õ"] = "o", ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s",
+ ["t"] = "t", ["u"] = "u", ["ú"] = "u", ["ü"] = "u", ["v"] = "v",
+ ["w"] = "w", ["x"] = "x", ["y"] = "y", ["z"] = "z",
+ },
+ orders = {
+ "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",
+ }
+}
--- slovenian
---
--- MM: this will change since we need to add accented vowels
+--- Lithuanian
+
+local ch, CH = utfchar(replacementoffset + 1), utfchar(replacementoffset + 11)
+
+definitions["lt"] = {
+ replacements = {
+ { "ch", ch }, { "CH", CH}
+ },
+ entries = {
+ ["a"] = "a", ["ą"] = "a", ["b"] = "b", ["c"] = "c", [ch ] = "c",
+ ["č"] = "č", ["d"] = "d", ["e"] = "e", ["ę"] = "e", ["ė"] = "e",
+ ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i", ["į"] = "i",
+ ["y"] = "i", ["j"] = "j", ["k"] = "k", ["l"] = "l", ["m"] = "m",
+ ["n"] = "n", ["o"] = "o", ["p"] = "p", ["r"] = "r", ["s"] = "s",
+ ["š"] = "š", ["t"] = "t", ["u"] = "u", ["ų"] = "u", ["ū"] = "u",
+ ["v"] = "v", ["z"] = "z", ["ž"] = "ž",
+ },
+ orders = {
+ "a", "ą", "b", "c", ch, "č", "d", "e", "ę", "ė",
+ "f", "g", "h", "i", "į", "y", "j", "k", "l", "m",
+ "n", "o", "p", "r", "s", "š", "t", "u", "ų", "ū",
+ "v", "z", "ž",
+ },
+ lower = {
+ ch = CH,
+ },
+ upper = {
+ CH = ch,
+ },
+}
+
+--- Latvian
+
+definitions["lv"] = {
+ entries = {
+ ["a"] = "a", ["ā"] = "a", ["b"] = "b", ["c"] = "c", ["č"] = "č",
+ ["d"] = "d", ["e"] = "e", ["ē"] = "e", ["f"] = "f", ["g"] = "g",
+ ["ģ"] = "ģ", ["h"] = "h", ["i"] = "i", ["ī"] = "i", ["j"] = "j",
+ ["k"] = "k", ["ķ"] = "ķ", ["l"] = "l", ["ļ"] = "ļ", ["m"] = "m",
+ ["n"] = "n", ["ņ"] = "ņ", ["o"] = "o", ["ō"] = "o", ["p"] = "p",
+ ["r"] = "r", ["ŗ"] = "ŗ", ["s"] = "s", ["š"] = "š", ["t"] = "t",
+ ["u"] = "u", ["ū"] = "u", ["v"] = "v", ["z"] = "z", ["ž"] = "ž",
+ },
+ orders = {
+ "a", "ā", "b", "c", "č", "d", "e", "ē", "f", "g",
+ "ģ", "h", "i", "ī", "j", "k", "ķ", "l", "ļ", "m",
+ "n", "ņ", "o", "ō", "p", "r", "ŗ", "s", "š", "t",
+ "u", "ū", "v", "z", "ž",
+ }
+}
-entries['sl'] = {
- ["a"] = "a", ["b"] = "b", ["c"] = "c", ["č"] = "č", ["ć"] = "ć", ["d"] = "d",
- ["đ"] = "đ", ["e"] = "e", ["f"] = "f", ["g"] = "g", ["h"] = "h", ["i"] = "i",
- ["j"] = "j", ["k"] = "k", ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o",
- ["p"] = "p", ["q"] = "q", ["r"] = "r", ["s"] = "s", ["š"] = "š", ["t"] = "t",
- ["u"] = "u", ["v"] = "v", ["w"] = "w", ["x"] = "x", ["y"] = "y", ["z"] = "z",
- ["ž"] = "ž",
+--- Hungarian
+
+-- Helpful but disturbing:
+-- http://en.wikipedia.org/wiki/Hungarian_alphabet#Alphabetical_ordering_.28collation.29
+-- (In short: you'd have to analyse word-compounds to realize a correct order
+-- for sequences like “nny”, “ssz”, and “zsz”. This is left as an exercise to
+-- the reader…)
+
+local cs, CS = utfchar(replacementoffset + 1), utfchar(replacementoffset + 11)
+local dz, DZ = utfchar(replacementoffset + 2), utfchar(replacementoffset + 12)
+local dzs, DZS = utfchar(replacementoffset + 3), utfchar(replacementoffset + 13)
+local gy, GY = utfchar(replacementoffset + 4), utfchar(replacementoffset + 14)
+local ly, LY = utfchar(replacementoffset + 5), utfchar(replacementoffset + 15)
+local ny, NY = utfchar(replacementoffset + 6), utfchar(replacementoffset + 16)
+local sz, SZ = utfchar(replacementoffset + 7), utfchar(replacementoffset + 17)
+local ty, TY = utfchar(replacementoffset + 8), utfchar(replacementoffset + 18)
+local zs, ZS = utfchar(replacementoffset + 9), utfchar(replacementoffset + 19)
+
+definitions["hu"] = {
+ replacements = {
+ { "cs", cs }, { "CS", CS },
+ { "dz", dz }, { "DZ", DZ },
+ { "dzs", dzs }, { "DZS", DZS },
+ { "gy", gy }, { "GY", GY },
+ { "ly", ly }, { "LY", LY },
+ { "ny", ny }, { "NY", NY },
+ { "sz", sz }, { "SZ", SZ },
+ { "ty", ty }, { "TY", TY },
+ { "zs", zs }, { "ZS", ZS },
+ },
+ entries = {
+ ["a"] = "a", ["á"] = "a", ["b"] = "b", ["c"] = "c", [cs ] = "cs",
+ ["d"] = "d", [dz ] = "dz", [dzs] = "dzs", ["e"] = "e", ["é"] = "e",
+ ["f"] = "f", ["g"] = "g", [gy ] = "gy", ["h"] = "h", ["i"] = "i",
+ ["í"] = "i", ["j"] = "j", ["k"] = "k", ["l"] = "l", [ly ] = "ly",
+ ["m"] = "m", ["n"] = "n", [ny ] = "ny", ["o"] = "o", ["ó"] = "o",
+ ["ö"] = "ö", ["ő"] = "ö", ["p"] = "p", ["q"] = "q", ["r"] = "r",
+ ["s"] = "s", [sz ] = "sz", ["t"] = "t", [ty ] = "ty", ["u"] = "u",
+ ["ú"] = "u", ["ü"] = "ü", ["ű"] = "ü", ["v"] = "v", ["w"] = "w",
+ ["x"] = "x", ["y"] = "y", ["z"] = "z", [zs ] = "zs",
+ },
+ orders = {
+ "a", "á", "b", "c", cs, "d", dz, dzs, "e", "é",
+ "f", "g", gy, "h", "i", "í", "j", "k", "l", ly,
+ "m", "n", ny, "o", "ó", "ö", "ő", "p", "q", "r",
+ "s", sz, "t", ty, "u", "ú", "ü", "ű", "v", "w",
+ "x", "y", "z", zs,
+ },
+ lower = {
+ CS = cs, DZ = dz, DZS = dzs, GY = gy, LY = ly, NY = ny, SZ = sz, TY = ty, ZS = zs,
+ },
+ upper = {
+ cs = CS, dz = DZ, dzs = DZS, gy = GY, ly = LY, ny = NY, sz = SZ, ty = TY, zs = ZS,
+ },
}
-mappings['sl'] = {
- ["a"] = 1, ["b"] = 3, ["c"] = 5, ["č"] = 7, ["ć"] = 9, ["d"] = 11,
- ["đ"] = 13, ["e"] = 15, ["f"] = 17, ["g"] = 19, ["h"] = 21, ["i"] = 23,
- ["j"] = 25, ["k"] = 27, ["l"] = 29, ["m"] = 31, ["n"] = 33, ["o"] = 35,
- ["p"] = 37, ["q"] = 39, ["r"] = 41, ["s"] = 43, ["š"] = 45, ["t"] = 47,
- ["u"] = 49, ["v"] = 51, ["w"] = 53, ["x"] = 55, ["y"] = 57, ["z"] = 59,
- ["ž"] = 61,
+--- Estonian
+
+definitions["et"] = {
+ entries = { -- w x y are used for foreign words only
+ ["a"] = "a", ["b"] = "b", ["d"] = "d", ["e"] = "e", ["f"] = "f",
+ ["g"] = "g", ["h"] = "h", ["i"] = "i", ["j"] = "j", ["k"] = "k",
+ ["l"] = "l", ["m"] = "m", ["n"] = "n", ["o"] = "o", ["p"] = "p",
+ ["r"] = "r", ["s"] = "s", ["š"] = "š", ["z"] = "z", ["ž"] = "ž",
+ ["t"] = "t", ["u"] = "u", ["v"] = "v", ["w"] = "v", ["õ"] = "õ",
+ ["ä"] = "ä", ["ö"] = "ö", ["ü"] = "ü", ["x"] = "x", ["y"] = "y",
+ },
+ orders = {
+ "a", "b", "d", "e", "f", "g", "h", "i", "j", "k",
+ "l", "m", "n", "o", "p", "r", "s", "š", "z", "ž",
+ "t", "u", "v", "w", "õ", "ä", "ö", "ü", "x", "y",
+ }
}
-add_uppercase_entries ("sl")
-add_uppercase_mappings("sl") -- cf. MM
+--- Korean
+
+local fschars = characters.fschars
+
+local function firstofsplit(first)
+ local fs = fschars[first] or first
+ -- print(string.format("%04x %04x",utfbyte(first),utfbyte(fs)))
+ return fs, fs -- entry, tag
+end
+
+definitions["kr"] = {
+ firstofsplit = firstofsplit,
+ orders = {
+ "ㄱ", "ㄴ", "ㄷ", "ㄹ", "ㅁ", "ㅂ", "ㅅ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ",
+ "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",
+ }
+}
diff --git a/Master/texmf-dist/tex/context/base/spac-ali.lua b/Master/texmf-dist/tex/context/base/spac-ali.lua
new file mode 100644
index 00000000000..37bff74d1e2
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/spac-ali.lua
@@ -0,0 +1,132 @@
+if not modules then modules = { } end modules ['spac-ali'] = {
+ version = 1.001,
+ comment = "companion to spac-ali.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local div = math.div
+
+local tasks = nodes.tasks
+local appendaction = tasks.appendaction
+local prependaction = tasks.prependaction
+local disableaction = tasks.disableaction
+local enableaction = tasks.enableaction
+
+local has_attribute = node.has_attribute
+local unset_attribute = node.unset_attribute
+local slide_nodes = node.slide
+local hpack_nodes = node.hpack -- nodes.fasthpack not really faster here
+
+local link_nodes = nodes.link
+
+local nodecodes = nodes.nodecodes
+local listcodes = nodes.listcodes
+
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local line_code = listcodes.line
+
+local nodepool = nodes.pool
+
+local new_stretch = nodepool.stretch
+
+local a_realign = attributes.private("realign")
+
+local texattribute = tex.attribute
+local texcount = tex.count
+
+local isleftpage = layouts.status.isleftpage
+
+local alignments = { }
+typesetters.alignments = alignments
+
+local report_realign = logs.reporter("typesetters","margindata")
+local trace_realign = trackers.register("typesetters.margindata", function(v) trace_margindata = v end)
+
+local nofrealigned = 0
+
+-- leftskip rightskip parfillskip
+-- raggedleft 0 + 0 -
+-- raggedright 0 0 fil
+-- raggedcenter 0 + 0 + -
+
+local function handler(head,leftpage,realpageno)
+ local current = head
+ local done = false
+ while current do
+ local id = current.id
+ if id == hlist_code then
+ if current.subtype == line_code then
+ local a = has_attribute(current,a_realign)
+ if not a or a == 0 then
+ -- skip
+ else
+ local align = a % 10
+ local pageno = div(a,10)
+ if pageno == realpageno then
+ -- already ok
+ else
+ local action = 0
+ if align == 1 then -- flushright
+ action = leftpage and 1 or 2
+ elseif align == 2 then -- flushleft
+ action = leftpage and 2 or 1
+ end
+ if action == 1 then
+ current.list = hpack_nodes(link_nodes(current.list,new_stretch(3)),current.width,"exactly")
+ if trace_realign then
+ report_realign("flush left: align %s, page %s, realpage %s",align,pageno,realpageno)
+ end
+ elseif action == 2 then
+ current.list = hpack_nodes(link_nodes(new_stretch(3),current.list),current.width,"exactly")
+ if trace_realign then
+ report_realign("flush right: align %s, page %s, realpage %s",align,pageno,realpageno)
+ end
+ elseif trace_realign then
+ report_realign("invalid: align %s, page %s, realpage %s",align,pageno,realpageno)
+ end
+ done = true
+ nofrealigned = nofrealigned + 1
+ end
+ unset_attribute(current,a_realign)
+ end
+ end
+ handler(current.list,leftpage,realpageno)
+ elseif id == vlist_code then
+ handler(current.list,leftpage,realpageno)
+ end
+ current = current.next
+ end
+ return head, done
+end
+
+function alignments.handler(head)
+ local leftpage = isleftpage(true,false)
+ local realpageno = texcount.realpageno
+ return handler(head,leftpage,realpageno)
+end
+
+local enabled = false
+
+function alignments.set(n)
+ if not enabled then
+ enableaction("shipouts","typesetters.alignments.handler")
+ enabled = true
+ if trace_realign then
+ report_realign("enabled")
+ end
+ end
+ texattribute[a_realign] = texcount.realpageno * 10 + n
+end
+
+commands.setrealign = alignments.set
+
+statistics.register("realigning", function()
+ if nofrealigned > 0 then
+ return string.format("%s processed",nofrealigned)
+ else
+ return nil
+ end
+end)
diff --git a/Master/texmf-dist/tex/context/base/spac-ali.mkiv b/Master/texmf-dist/tex/context/base/spac-ali.mkiv
index b168a02be27..0cf22f470cf 100644
--- a/Master/texmf-dist/tex/context/base/spac-ali.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-ali.mkiv
@@ -15,6 +15,18 @@
\unprotect
+\registerctxluafile{spac-ali}{1.001}
+
+\definesystemattribute[realign][public]
+
+\unexpanded\def\resetrealignsignal{\attribute\realignattribute\attributeunsetvalue}
+\unexpanded\def\signalinnerrealign{\ctxcommand{setrealign(2)}}
+\unexpanded\def\signalouterrealign{\ctxcommand{setrealign(1)}}
+
+\appendtoks
+ \resetrealignsignal
+\to \everyforgetall
+
% We will not use bodydir and pagedir so we disable them. That way we get
% normal hyperlink support.
@@ -69,44 +81,66 @@
\unexpanded\def\definehbox
{\dodoubleargument\dodefinehbox}
-\def\iobox#1#2#3#% here #3# is not really needed
- {\vbox\bgroup % we want to return a vbox like the others
- \hbox\bgroup% we need to pack the signal with the box
- \signalrightpage
- \dowithnextboxcontent
- {\let\\=\endgraf\forgetall\doifrightpageelse#1#2}
- {\box\nextbox\egroup\egroup}
- \vbox#3}
+% To be redone:
+
+\def\ibox#1#2#3%
+ {\vbox\bgroup
+ \forgetall
+ \let\\=\endgraf
+ \ifdoublesided\signalinnerrealign\fi
+ \doifrightpageelse\raggedright\raggedleft
+ \let\next}
+
+\def\obox#1#2#3%
+ {\vbox\bgroup
+ \forgetall
+ \let\\=\endgraf
+ \ifdoublesided\signalouterrealign\fi
+ \doifrightpageelse\raggedleft\raggedright
+ \let\next}
+
+\def\@@ragged@@command{@@ragged@@c}
+\def\@@ragged@@hbox {@@ragged@@h}
+\def\@@ragged@@vbox {@@ragged@@v}
+
+\def\dosetraggedvbox#1% can be more keys
+ {\let\raggedbox\vbox
+ \processcommacommand[#1]\dosetraggedvbox}
-\def\obox{\iobox\raggedleft \raggedright} % outerbox
-\def\ibox{\iobox\raggedright\raggedleft} % innerbox
+\def\dosetraggedhbox#1% can be more keys
+ {\let\raggedbox\hbox
+ \processcommacommand[#1]\dosetraggedhbox}
\def\dosetraggedvbox#1%
- {\let\raggedbox\vbox
- \processfirstactioninset
- [#1]
- [ \v!left=>\let\raggedbox\lbox,
- \v!right=>\let\raggedbox\rbox,
- \v!middle=>\let\raggedbox\cbox,
- \v!inner=>\let\raggedbox\ibox,
- \v!outer=>\let\raggedbox\obox,
- \v!flushleft=>\let\raggedbox\rbox,
- \v!flushright=>\let\raggedbox\lbox,
- \v!center=>\let\raggedbox\cbox,
- \v!no=>\def\raggedbox{\vbox\bgroup\raggedright\let\next=}]}
+ {\ifcsname\@@ragged@@vbox#1\endcsname
+ \csname\@@ragged@@vbox#1\endcsname
+ \quitcommalist
+ \fi}
\def\dosetraggedhbox#1%
- {\let\raggedbox\hbox
- \processaction % slow
- [#1]
- [ \v!left=>\def\raggedbox{\doalignedline\v!left },
- \v!right=>\def\raggedbox{\doalignedline\v!right },
- \v!middle=>\def\raggedbox{\doalignedline\v!middle},
- \v!inner=>\def\raggedbox{\doalignedline\v!inner },
- \v!outer=>\def\raggedbox{\doalignedline\v!outer },
- \v!flushleft=>\def\raggedbox{\doalignedline\v!right },
- \v!flushright=>\def\raggedbox{\doalignedline\v!left },
- \v!center=>\def\raggedbox{\doalignedline\v!middle}]}
+ {\ifcsname\@@ragged@@hbox#1\endcsname
+ \csname\@@ragged@@hbox#1\endcsname
+ \quitcommalist
+ \fi}
+
+\setvalue{\@@ragged@@vbox\v!left }{\let\raggedbox\lbox}
+\setvalue{\@@ragged@@vbox\v!right }{\let\raggedbox\rbox}
+\setvalue{\@@ragged@@vbox\v!middle }{\let\raggedbox\cbox}
+\setvalue{\@@ragged@@vbox\v!inner }{\let\raggedbox\ibox}
+\setvalue{\@@ragged@@vbox\v!outer }{\let\raggedbox\obox}
+\setvalue{\@@ragged@@vbox\v!flushleft }{\let\raggedbox\rbox}
+\setvalue{\@@ragged@@vbox\v!flushright}{\let\raggedbox\lbox}
+\setvalue{\@@ragged@@vbox\v!center }{\let\raggedbox\cbox}
+\setvalue{\@@ragged@@vbox\v!no }{\def\raggedbox{\vbox\bgroup\raggedright\let\next=}]}
+
+\setvalue{\@@ragged@@hbox\v!left }{\def\raggedbox{\doalignedline\v!left }}
+\setvalue{\@@ragged@@hbox\v!right }{\def\raggedbox{\doalignedline\v!right }}
+\setvalue{\@@ragged@@hbox\v!middle }{\def\raggedbox{\doalignedline\v!middle}}
+\setvalue{\@@ragged@@hbox\v!inner }{\def\raggedbox{\doalignedline\v!inner }}
+\setvalue{\@@ragged@@hbox\v!outer }{\def\raggedbox{\doalignedline\v!outer }}
+\setvalue{\@@ragged@@hbox\v!flushleft }{\def\raggedbox{\doalignedline\v!right }}
+\setvalue{\@@ragged@@hbox\v!flushright}{\def\raggedbox{\doalignedline\v!left }}
+\setvalue{\@@ragged@@hbox\v!center }{\def\raggedbox{\doalignedline\v!middle}}
\def\dosetraggedcommand#1%
{\normalexpanded{\noexpand\dodosetraggedcommand{#1}}}
@@ -115,12 +149,17 @@
\def\raggedcommand{\the\everyraggedcommand}
-\def\dodosetraggedcommand#1% beware: #1=empty is ignored, keep that!
- {\everyraggedcommand\emptytoks
+% slow, we can do this in lua ... some day
+
+\let\raggedbox\relax
+
+\unexpanded\def\dodosetraggedcommand#1% beware: #1=empty is ignored, keep that!
+ {\everyraggedcommand{\resetrealignsignal}% \emptytoks maybe only when #1 <> empty
\let\raggedtopcommand\empty
\let\raggedbottomcommand\empty
- \chardef\raggedoneliner\zerocount
- \doifsomething{#1}
+ \let\raggedbox\relax
+ \setfalse\raggedonelinerstate
+ \doifsomething{#1}%
{\doifinsetelse\v!broad{#1}\!!doneatrue\!!doneafalse
\doifinsetelse\v!wide {#1}\!!donebtrue\!!donebfalse
\!!donectrue
@@ -129,8 +168,6 @@
\def\dododosetraggedcommand#1%
{\executeifdefined{\@@ragged@@command\string#1}\relax}
-\def\@@ragged@@command{@@raggedcommand}
-
\setvalue{\@@ragged@@command\v!hanging }{\appendtoks\enableprotruding \to\everyraggedcommand}
\setvalue{\@@ragged@@command\v!nothanging }{\appendtoks\disableprotruding \to\everyraggedcommand}
\setvalue{\@@ragged@@command\v!hz }{\appendtoks\enableadjusting \to\everyraggedcommand}
@@ -193,16 +230,20 @@
\setvalue{\@@ragged@@command\v!normal}%
{\appendtoks\notragged\to\everyraggedcommand}
-\setvalue{\@@ragged@@command\v!inner}% not yet perfect
- {\signalrightpage % may interfere
- \doifrightpageelse
- {\getvalue{\@@ragged@@command\v!right}}
- {\getvalue{\@@ragged@@command\v!left}}}
+\setvalue{\@@ragged@@command\v!inner}%
+ {\ifdoublesided
+ \appendtoks\signalinnerrealign\to\everyraggedcommand
+ \fi
+ \rightorleftpageaction
+ {\getvalue{\@@ragged@@command\v!right}}%
+ {\getvalue{\@@ragged@@command\v!left }}}
-\setvalue{\@@ragged@@command\v!outer}% not yet perfect
- {\signalrightpage % may interfere
- \doifrightpageelse
- {\getvalue{\@@ragged@@command\v!left}}
+\setvalue{\@@ragged@@command\v!outer}%
+ {\ifdoublesided
+ \appendtoks\signalouterrealign\to\everyraggedcommand
+ \fi
+ \rightorleftpageaction
+ {\getvalue{\@@ragged@@command\v!left }}%
{\getvalue{\@@ragged@@command\v!right}}}
\setvalue{\@@ragged@@command\v!lesshyphenation}%
@@ -223,10 +264,10 @@
\setvalue{\@@ragged@@command\v!disable}% for one liners
{\appendtoks\raggedright\parfillskip\zeropoint\to\everyraggedcommand}
-\chardef\raggedoneliner\zerocount
+\ifdefined\raggedonelinerstate \else \newconditional\raggedonelinerstate \fi
\setvalue{\@@ragged@@command\v!line}%
- {\chardef\raggedoneliner\plusone}
+ {\settrue\raggedonelinerstate}
% More alignments:
@@ -234,7 +275,7 @@
% \tolerance >= 1500 % was 200
% \raggedness = 2 .. 6\bodyfontsize
-\chardef\raggedstatus=0 % normal left center right
+\newconstant\raggedstatus % normal left center right
\def\leftraggedness {2\bodyfontsize}
\def\rightraggedness {2\bodyfontsize}
@@ -249,7 +290,7 @@
%D More hyphenation control, will be combined with align
%D setup.
-\def\nohyphens
+\def\nohyphens % % % % % not clever, we still hyphenate but supress application
{\ifx\dohyphens\relax
\edef\dohyphens
{\hyphenpenalty\the\hyphenpenalty
@@ -285,7 +326,7 @@
\updateraggedskips}
\def\dosetraggedskips#1#2#3#4#5#6#7%
- {\chardef \raggedstatus#1\relax
+ {\raggedstatus#1\relax
\leftskip 1\leftskip \!!plus#2\relax % zie: Tex By Topic 8.1.3
\rightskip 1\rightskip\!!plus#3\relax % zie: Tex By Topic 8.1.3
\spaceskip #4\relax
@@ -325,7 +366,7 @@
\begingroup
\dontshowcomposition
\inleftmargin{\vsmash
- {\switchtobodyfont[7pt,tt]%
+ {\infofont
\framed[\c!align=\v!right]{\thepardata}}}%
\endgroup}
@@ -347,7 +388,7 @@
\def\raggedxspaceamount {.5em}
\unexpanded\def\notragged
- {\chardef\raggedstatus\zerocount
+ {\raggedstatus\zerocount
\leftskip 1\leftskip
\rightskip 1\rightskip
\spaceskip \zeropoint
@@ -433,6 +474,11 @@
\setvalue{@@ngila@@\v!broad }{\!!doneatrue}
\setvalue{@@ngila@@\v!wide }{\!!donebtrue}
+\def\setraggedparagraphmode
+ {\doifrightpageelse
+ {\ifdoublesided\signalinnerrealign\expandafter\firstoftwoarguments \fi}
+ {\ifdoublesided\signalouterrealign\expandafter\secondoftwoarguments\fi}}
+
\def\installalign#1#2{\setvalue{@@align@@#1}{#2}} % can be used for overloads
\installalign \v!new {\@@asraggedfalse}
@@ -504,6 +550,8 @@
\def\dosetupalign[#1]% can be made faster by checking for defined #1
{\!!doneafalse
\!!donebfalse
+ \raggedstatus\zerocount
+ \resetrealignsignal
\processcommacommand[#1]\dodosetupngila
\processcommacommand[#1]\dodosetupalign}
@@ -524,7 +572,7 @@
{\par
\egroup}
-\chardef\alignstrutmode=1
+\setnewconstant\alignstrutmode\plusone
% see later for the real definition, which in the simple case is:
@@ -568,7 +616,7 @@
\let\centeraligned\midaligned
-\def\regelbegrensd#1{\limitatetext{#1}{\hsize}{\unknown}} % to be translated
+% \def\regelbegrensd#1{\limitatetext{#1}{\hsize}{\unknown}} % to be translated
% indirecte commando's
@@ -579,9 +627,10 @@
\letvalue{\s!do\v!line\v!flushright}\leftaligned
\letvalue{\s!do\v!line\v!center }\midaligned
-\def\doalignedline#1{\csname\s!do\v!line#1\endcsname}
+\def\doalignedline#1{\resetrealignsignal\csname\s!do\v!line#1\endcsname}
-%D Experimental:
+%D Experimental (will be redone when floats are redone as it's real messy
+%D now):
\def\doxalignline#1#2#3#4#5#6%
{\noindentation % was \noindent
@@ -602,7 +651,7 @@
\endgroup}
\hbox}
-\def\doxcheckline
+\def\doxcheckline % used for floats so multipass anyway
{\signalrightpage\doifrightpageelse\donetrue\donefalse}
\setvalue{\s!do\v!line\v!inner }{\doxalignline\doxcheckline++\zeropoint \relax\hss }
@@ -630,9 +679,6 @@
\def\alignedline#1#2% setting default
{\csname\s!do\v!line\ifcsname\s!do\v!line#1\endcsname#1\else#2\fi\endcsname}
-% \def\woordrechts
-% {\groupedcommand{\hfill\hbox}{\parfillskip\zeropoint}}
-
% beware: \wordright{whatever\kern-\rightskip} should work!
% so, no funny boxing here
@@ -666,12 +712,35 @@
% \simplealignedbox{2cm}{right}{x}
-\setvalue{\s!simple\c!align\v!right }#1#2{\hbox to #1{#2\hss}}
-\setvalue{\s!simple\c!align\v!left }#1#2{\hbox to #1{\hss#2}}
-\setvalue{\s!simple\c!align\v!flushright }#1#2{\hbox to #1{\hss#2}}
-\setvalue{\s!simple\c!align\v!flushleft }#1#2{\hbox to #1{#2\hss}}
-\setvalue{\s!simple\c!align\v!middle }#1#2{\hbox to #1{\hss#2\hss}}
-
-\unexpanded\def\simplealignedbox#1{\executeifdefined{\s!simple\c!align#1}{\getvalue{\s!simple\c!align\v!right}}}
+% \setvalue{\s!simple\c!align\v!right }#1#2{\hbox to #1{#2\hss}}
+% \setvalue{\s!simple\c!align\v!left }#1#2{\hbox to #1{\hss#2}}
+% \setvalue{\s!simple\c!align\v!flushright }#1#2{\hbox to #1{\hss#2}}
+% \setvalue{\s!simple\c!align\v!flushleft }#1#2{\hbox to #1{#2\hss}}
+% \setvalue{\s!simple\c!align\v!middle }#1#2{\hbox to #1{\hss#2\hss}}
+
+% \unexpanded\def\simplealignedbox#1%
+% {\csname\s!simple\c!align\ifcsname\s!simple\c!align#1\endcsname#1\else\v!right\fi\endcsname}
+
+\setvalue{\s!simple:\c!align:\v!right }#1{{#1\hss}}
+\setvalue{\s!simple:\c!align:\v!left }#1{{\hss#1}}
+\setvalue{\s!simple:\c!align:\v!flushright }#1{{\hss#1}}
+\setvalue{\s!simple:\c!align:\v!flushleft }#1{{#1\hss}}
+\setvalue{\s!simple:\c!align:\v!middle }#1{{\hss#1\hss}}
+
+\unexpanded\def\simplealignedbox#1#2%
+ {\hbox to #1\csname\s!simple:\c!align:\ifcsname\s!simple:\c!align:#2\endcsname#2\else\v!right\fi\endcsname}
+
+% \setvalue{spac_align_set_ss_\v!right }#1#2{\let#1\relax\let#2\hss }
+% \setvalue{spac_align_set_ss_\v!left }#1#2{\let#1\hss \let#2\relax}
+% \setvalue{spac_align_set_ss_\v!flushright}#1#2{\let#1\hss \let#2\relax}
+% \setvalue{spac_align_set_ss_\v!flushleft }#1#2{\let#1\relax\let#2\hss }
+% \setvalue{spac_align_set_ss_\v!middle }#1#2{\let#1\hss \let#2\hss }
+% \setvalue{spac_align_set_ss_\v!low }#1#2{\let#1\vss \let#2\relax}
+% \setvalue{spac_align_set_ss_\v!high }#1#2{\let#1\relax\let#2\vss }
+% \setvalue{spac_align_set_ss_\v!lohi }#1#2{\let#1\vss \let#2\vss }
+% \setvalue{spac_align_set_ss_\s!unknown }#1#2{\let#1\relax\let#2\relax}
+
+% \unexpanded\def\spac_align_set_ss#1%
+% {\csname spac_align_set_ss_\ifcsname spac_align_set_ss_#1\endcsname#1\else\s!unknown\fi\endcsname}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/spac-gen.mkii b/Master/texmf-dist/tex/context/base/spac-gen.mkii
index 8274db1b925..4e7b3810c5f 100644
--- a/Master/texmf-dist/tex/context/base/spac-gen.mkii
+++ b/Master/texmf-dist/tex/context/base/spac-gen.mkii
@@ -1483,6 +1483,21 @@
\fi
+\unexpanded\def\textormathglue#1#2#3% cleaned up one
+ {\begingroup
+ \ifmmode
+ \mskip#1#2%
+ \else
+ \scratchdimen#1\hspaceamount\empty{#3}%
+ \scratchskip\scratchdimen\!!plus.5\scratchdimen\!!minus.3\scratchdimen
+ \hskip\scratchskip
+ \fi
+ \endgroup}
+
+\def\thinglue {\textormathglue+\thinmuskip 1}
+\def\medglue {\textormathglue+\medmuskip 2}
+\def\thickglue{\textormathglue+\thickmuskip3}
+
\ifx\eject\undefined
\def\eject{\par\break}
diff --git a/Master/texmf-dist/tex/context/base/spac-grd.mkiv b/Master/texmf-dist/tex/context/base/spac-grd.mkiv
index bd5c51a853e..8701f4d7ee2 100644
--- a/Master/texmf-dist/tex/context/base/spac-grd.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-grd.mkiv
@@ -126,12 +126,12 @@
{\def\dobaselinecorrection % visualization is not watertight!
{\bgroup
\ifdim\prevdepth>\zeropoint\kern-\prevdepth\fi
- \setbox0\null
- \wd0\hsize
- \dp0\strutdp
+ \setbox\scratchbox\emptyhbox
+ \wd\scratchbox\hsize
+ \dp\scratchbox\strutdp
\nointerlineskip
\forgetall
- \ruledvbox{\box0}%
+ \ruledvbox{\box\scratchbox}%
\egroup
\prevdepth\strutdp}%
\def\dotopbaselinecorrection
@@ -208,11 +208,11 @@
%D is not needed, but I want to look the visualization as good
%D as possible too.
-\chardef\baselinecorrectionmode\plusone
+\setnewconstant\baselinecorrectionmode\plusone
-\def\onbaselinecorrection {\chardef\baselinecorrectionmode\plusone }
-\def\offbaselinecorrection {\chardef\baselinecorrectionmode\plustwo }
-\def\forcebaselinecorrection{\chardef\baselinecorrectionmode\plusthree}
+\def\onbaselinecorrection {\baselinecorrectionmode\plusone }
+\def\offbaselinecorrection {\baselinecorrectionmode\plustwo }
+\def\forcebaselinecorrection{\baselinecorrectionmode\plusthree}
%D \macros
%D {topbaselinecorrection,botbaselinecorrection}
@@ -228,7 +228,7 @@
{\ifvmode
\bgroup
\setbaselinecorrections
- \whitespace
+ \whitespace % no longer ok
\nointerlineskip
\dotopbaselinecorrection
\egroup
@@ -246,11 +246,57 @@
\let\forcedbotbaselinecorrection\botbaselinecorrection
+% experiment, todo: proper mkiv mechanism
+%
+% \input ward \par
+% \startframedtext test \stopframedtext
+% \input ward \par
+% \startlinecorrection \framed{xxx} \stoplinecorrection
+% \input ward \par
+%
+% \setupwhitespace[big]
+%
+% \input ward \par
+% \startframedtext test \stopframedtext
+% \input ward \par
+% \startlinecorrection \framed{xxx} \stoplinecorrection
+% \input ward \par
+
+\def\dotopbaselinecorrection {\blank[\thetopbaselinecorrection ]}
+\def\dobotbaselinecorrection {\blank[\thebotbaselinecorrection ]}
+\def\donegtopbaselinecorrection{\blank[\thenegtopbaselinecorrection]}
+\def\donegbotbaselinecorrection{\blank[\thenegbotbaselinecorrection]}
+
+% nointerlineskip
+%
+% startpacked
+% \startlinecorrection \framed{test} \stoplinecorrection
+% \startlinecorrection \framed{test} \stoplinecorrection
+% \stoppacked
+
+\def\forcedtopbaselinecorrection
+ {\ifvmode
+ \bgroup
+ \setbaselinecorrections
+ \vspacing[white]
+% \nointerlineskip %
+ \dotopbaselinecorrection
+ \egroup
+\fi}
+
+\def\dobaselinecorrection
+ {\ifdim\prevdepth>\zeropoint
+ \vspacing[\the\dimexpr-\prevdepth+\strutdp\relax]%
+ \else
+ \vspacing[\the\dimexpr\strutdp\relax]%
+ \fi
+ \prevdepth\strutdp}
+
\let\normalstartbaselinecorrection\startbaselinecorrection
\unexpanded\def\startbaselinecorrection
{\ifgridsnapping
- \snaptogrid[v!normal]\vbox\bgroup
+ \snaptogrid[\v!normal]\vbox\bgroup
\let\stopbaselinecorrection\egroup
\else
\normalstartbaselinecorrection
diff --git a/Master/texmf-dist/tex/context/base/spac-hor.lua b/Master/texmf-dist/tex/context/base/spac-hor.lua
index 6cb6e3f497b..09920bd4647 100644
--- a/Master/texmf-dist/tex/context/base/spac-hor.lua
+++ b/Master/texmf-dist/tex/context/base/spac-hor.lua
@@ -26,7 +26,6 @@ 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
- -- texsprint(ctxcatcodes,"\\space") -- faster
context.space()
end
end
diff --git a/Master/texmf-dist/tex/context/base/spac-hor.mkiv b/Master/texmf-dist/tex/context/base/spac-hor.mkiv
index 9f902678a4c..39edaa2ff00 100644
--- a/Master/texmf-dist/tex/context/base/spac-hor.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-hor.mkiv
@@ -23,8 +23,9 @@
\newdimen \ctxparindent
\parindent\ctxparindent % for the show
-\newif \ifindentfirstparagraph \indentfirstparagraphtrue
-\chardef\indentingtoggle\zerocount
+\newif\ifindentfirstparagraph \indentfirstparagraphtrue
+
+\newconstant\indentingtogglestate
%D After a blank or comparable situation (left side floats) we
%D need to check if the next paragraph has to be indented.
@@ -38,35 +39,46 @@
\def\checkeverypar % currently a hack
{\ifzeropt\parindent\else
- \doifsometokselse\everypar\donothing{\appendtoks\checkindentation\to\everypar}%
+ \doifsometokselse\everypar\donothing\docheckupcomingindentation
\fi}
+\def\docheckupcomingindentation
+ {\appendtoks\checkindentation\to\everypar}
+
\definecomplexorsimple\setupindenting
\def\complexsetupindenting[#1]%
{\edef\currentindenting{#1}%
- \doifsomething\currentindenting % handy when a parameter is passed
- {% not here: \indentfirstparagraphtrue
- % not here: \parindent\ctxparindent
- % not here: \chardef\indentingtoggle\zerocount
- % we use commacommand in order to catch #1 being a command (expanded parameter)
- \processcommacommand[\currentindenting]\docomplexsetupindentingA % catch small, medium, etc
- \processcommacommand[\currentindenting]\docomplexsetupindentingB % catch rest
- \checkeverypar % only when non-empty #1
- \ifindentfirstparagraph\else\noindentation\fi % added
- \toggleindentation}}
+ \ifx\currentindenting\empty \else
+ \doapplycurrentindenting
+ \fi}
+
+\def\doapplycurrentindenting
+ {% not here: \indentfirstparagraphtrue
+ % not here: \parindent\ctxparindent
+ % not here: \indentingtogglestate\zerocount
+ % we use commacommand in order to catch #1 being a command (expanded parameter)
+ \processcommacommand[\currentindenting]\docomplexsetupindentingA % catch small, medium, etc
+ \processcommacommand[\currentindenting]\docomplexsetupindentingB % catch rest
+ \checkeverypar % only when non-empty #1
+ \ifindentfirstparagraph\else\noindentation\fi % added
+ \toggleindentation}
\def\docomplexsetupindentingA#1%
- {\edefconvertedargument\!!stringa{#1}% can this be done differently now?
- \ifcsname\??in:\!!stringa\endcsname \else
+ {\ifcsname\??in:#1\endcsname
+ % case b
+ \else
\edef\currentindentation{#1}%
\let\normalindentation\currentindentation
\simplesetupindenting
\fi}
\def\docomplexsetupindentingB#1%
- {\edefconvertedargument\!!stringa{#1}% catch #1=\somedimen
- \executeifdefined{\??in:\!!stringa}\donothing}
+ {\ifcsname\??in:#1\endcsname
+ \csname\??in:#1\endcsname
+ \else
+ % case a
+ \fi}
\def\simplesetupindenting % empty case, a it strange, needed this way?
{\assigndimension\currentindentation\ctxparindent{1em}{1.5em}{2em}}
@@ -89,10 +101,10 @@
\defineindentingmethod [\v!always] {\parindent\ctxparindent\relax} % no \indent !
\defineindentingmethod [\v!never] {\parindent\zeropoint\relax % no \indent !
- \chardef\indentingtoggle\zerocount}
+ \indentingtogglestate\zerocount}
-\defineindentingmethod [\v!odd] {\chardef\indentingtoggle\plusone}
-\defineindentingmethod [\v!even] {\chardef\indentingtoggle\plustwo}
+\defineindentingmethod [\v!odd] {\indentingtogglestate\plusone}
+\defineindentingmethod [\v!even] {\indentingtogglestate\plustwo}
\defineindentingmethod [\v!normal] {\ifx\normalindentation\empty\else
\let\currentindentation\normalindentation
@@ -101,7 +113,7 @@
\defineindentingmethod [\v!reset] {\indentfirstparagraphtrue
\parindent\zeropoint
- \chardef\indentingtoggle\zerocount}
+ \indentingtogglestate\zerocount}
\def\noindenting{\indenting[\v!no, \v!next ]}
\def\doindenting{\indenting[\v!yes,\v!first]}
@@ -159,7 +171,7 @@
\fi \fi}
\def\toggleindentation % does not play well with noindentation
- {\ifcase\indentingtoggle
+ {\ifcase\indentingtogglestate
% nothing
\or
\notoggleindentation
@@ -186,27 +198,15 @@
\popmacro\checkindentation
\to \everypopsomestate
-% we need to save the state if we want to adapt behaviour to empty lines
-%
-% \def\setlasthvmode
-% {\global\chardef\savedhvmode\ifhmode\plusone\else\ifvmode\plustwo\else\zerocount\fi\fi}
-%
-% \def\resetlasthvmode
-% {\global\chardef\savedhvmode\zerocount}
-%
-% \chardef\savedhvmode\zerocount
-
% This is a user requested hack (using the auto-hook).
-\chardef\recheckindentationmode\zerocount
+\newconditional\recheckindentationmode
\def\dontrechecknextindentation
- {\global\chardef\recheckindentationmode\zerocount}
+ {\global\setfalse\recheckindentationmode}
\def\dorechecknextindentation
- {\ifcase\recheckindentationmode
- % nothing
- \or
+ {\ifconditional\recheckindentationmode
\dontrechecknextindentation
\expandafter\doautoindentation
\fi}
@@ -215,7 +215,7 @@
{\doifnextcharelse\par\donothing\noindentation}
\def\autoindentation
- {\global\chardef\recheckindentationmode\plusone}
+ {\global\settrue\recheckindentationmode}
%D An example of usage:
%D
@@ -260,7 +260,7 @@
%D \macros
%D {frenchspacing,nonfrenchspacing}
%D
-%D Smehow \type{\frenchspacing} can lead to hyphenation between
+%D Somehow \type{\frenchspacing} can lead to hyphenation between
%D dashes so we now have \type {\newfrenchspacing} (moved from
%D \type {syst-chr}).
@@ -339,7 +339,7 @@
\unexpanded\def\nonbreakablespace{\penalty\plustenthousand\normalspaceprimitive} % no space in math
-\letcatcodecommand \ctxcatcodes `\~ \nonbreakablespace % overloaded later
+\letcatcodecommand \ctxcatcodes \tildeasciicode \nonbreakablespace % overloaded later
\def\space { }
\def\removelastspace{\ifhmode\unskip\fi}
@@ -347,8 +347,8 @@
\ifdefined\softhyphen \else \let\softhyphen\- \fi
-\ctxlua{tex.sprint(tex.ctxcatcodes,"\string\\unexpanded\string\\def\string\\\string\n{\string\\space}")}
-% \ctxlua{tex.sprint(tex.ctxcatcodes,"\string\\let\string\\\string\n=\string\\space")}
+\ctxsprint{"\string\\unexpanded\string\\def\string\\\string\n{\string\\space}"}
+%ctxsprint{"\string\\let\string\\\string\n=\string\\space"}
% in tables we need:
%
@@ -361,7 +361,7 @@
\hskip\wd\scratchbox\relax}
\def\fixedspaces
- {\letcatcodecommand \ctxcatcodes `\~ \fixedspace}
+ {\letcatcodecommand \ctxcatcodes \tildeasciicode \fixedspace}
\appendtoks
\let~\space
@@ -590,14 +590,6 @@
\newskip\leftskipadaption
\newskip\rightskipadaption
-\def\doadaptleftskip#1%
- {\dosetleftskipadaption{#1}%
- \advance\leftskip \leftskipadaption}
-
-\def\doadaptrightskip#1%
- {\dosetrightskipadaption{#1}%
- \advance\rightskip \rightskipadaption}
-
\setvalue{@lsa@\v!standard}{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi}
\setvalue{@lsa@\v!yes }{\ifdim\ctxparindent=\zeropoint\@@slleft\else\ctxparindent\fi}
\letvalue{@lsa@\v!no }\zeropoint
@@ -607,25 +599,11 @@
\letvalue{@rsa@\v!no }\zeropoint
\letvalue{@rsa@\empty }\zeropoint
-\def\dosetleftskipadaption#1%
- {\edefconvertedargument\ascii{@lsa@#1}%
- \leftskipadaption
- \ifcsname\ascii\endcsname
- \csname\ascii\endcsname
- \else
- #1%
- \fi
- \relax}
-
-\def\dosetrightskipadaption#1%
- {\edefconvertedargument\ascii{@rsa@#1}%
- \rightskipadaption
- \ifcsname\ascii\endcsname
- \csname\ascii\endcsname
- \else
- #1%
- \fi
- \relax}
+\def\dosetleftskipadaption #1{\leftskipadaption \ifcsname @lsa@#1\endcsname\csname @lsa@#1\endcsname\else#1\fi\relax}
+\def\dosetrightskipadaption#1{\rightskipadaption\ifcsname @rsa@#1\endcsname\csname @rsa@#1\endcsname\else#1\fi\relax}
+
+\def\doadaptleftskip #1{\dosetleftskipadaption {#1}\advance\leftskip \leftskipadaption }
+\def\doadaptrightskip#1{\dosetrightskipadaption{#1}\advance\rightskip\rightskipadaption}
%D Tolerance:
@@ -910,7 +888,7 @@
\normalspaces % to be sure
\to \everybeforeoutput
-%D A more robust variant ofthe \MKII\ one:
+%D A more robust variant of the \MKII\ one:
%D
%D \startbuffer
%D bla \TEX\autoinsertnextspace bla
@@ -928,7 +906,7 @@
{\futurelet\nexttoken\doautoinsertnextspace}
\def\doautoinsertnextspace
- {\ctxlua{commands.autonextspace("\meaning\nexttoken")}} % todo, just consult nexttoken at the lua end
+ {\ctxcommand{autonextspace("\meaning\nexttoken")}} % todo, just consult nexttoken at the lua end
%D Moved from bib module:
@@ -943,4 +921,21 @@
\chardef\zwnj="200C
\chardef\zwj ="200D
+% TODO (but used in languages):
+
+\unexpanded\def\textormathglue#1#2#3% cleaned up one
+ {\begingroup
+ \ifmmode
+ \mskip#1#2%
+ \else
+ \scratchdimen#1\hspaceamount\empty{#3}%
+ \scratchskip\scratchdimen\!!plus.5\scratchdimen\!!minus.3\scratchdimen
+ \hskip\scratchskip
+ \fi
+ \endgroup}
+
+\def\thinglue {\textormathglue+\thinmuskip 1}
+\def\medglue {\textormathglue+\medmuskip 2}
+\def\thickglue{\textormathglue+\thickmuskip3}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/spac-pag.mkiv b/Master/texmf-dist/tex/context/base/spac-pag.mkiv
index 353afa5363f..9babab29a27 100644
--- a/Master/texmf-dist/tex/context/base/spac-pag.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-pag.mkiv
@@ -25,10 +25,10 @@
\def\setalignmentswitch#1%
{\chardef\alignmentswitch0\csname\??as#1\endcsname\relax}
-\newcount \noftrackedpagestates
-\newif \ifpagestatemismatch
-\newcount \realpagestateno
-\chardef \frozenpagestate \zerocount
+\newcount \noftrackedpagestates
+\newif \ifpagestatemismatch
+\newcount \realpagestateno
+\newconstant\frozenpagestate
\def\dotrackpagestate#1#2%
{\ifdoublesided \ifinpagebody \else
@@ -113,8 +113,8 @@
\@EA\secondoftwoarguments
\fi}
-\def\freezepagestate {\chardef\frozenpagestate\plusone }
-\def\defrostpagestate{\chardef\frozenpagestate\zerocount}
+\def\freezepagestate {\frozenpagestate\plusone }
+\def\defrostpagestate{\frozenpagestate\zerocount}
% we can make more of these on top, but how to deal with mixed frozen states
@@ -138,8 +138,8 @@
{\ifcase\pagesignallevel\or\postsignalrightpage\fi
\advance\pagesignallevel\minusone}
-\def\setraggedparagraphmode
- {\signalrightpage\doifrightpageelse} % move it there
+% \def\setraggedparagraphmode
+% {\signalrightpage\doifrightpageelse} % move it there
\ifx\swapmargins\undefined \let\swapmargins\undefined \fi % todo
diff --git a/Master/texmf-dist/tex/context/base/spac-par.lua b/Master/texmf-dist/tex/context/base/spac-par.lua
new file mode 100644
index 00000000000..f695e11e92f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/spac-par.lua
@@ -0,0 +1,59 @@
+if not modules then modules = { } end modules ['spac-par'] = {
+ version = 1.001,
+ comment = "companion to spac-par.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- sort of obsolete code
+
+local attribute = attributes.private('graphicvadjust')
+
+local nodecodes = nodes.nodecodes
+
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+
+local remove_node = nodes.remove
+local hpack_node = node.hpack
+local vpack_node = node.vpack
+local has_attribute = node.has_attribute
+
+function nodes.handlers.graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only
+ if groupcode == "" then -- mvl only
+ local h, p, done = head, nil, false
+ while h do
+ local id = h.id
+ if id == hlist_code or id == vlist_code then
+ local a = has_attribute(h,attribute)
+ if a then
+ if p then
+ local n
+ head, h, n = remove_node(head,h)
+ local pl = p.list
+ if n.width ~= 0 then
+ n = hpack_node(n,0,'exactly') -- todo: dir
+ end
+ if pl then
+ pl.prev = n
+ n.next = pl
+ end
+ p.list = n
+ done = true
+ else
+ -- can't happen
+ end
+ else
+ p = h
+ h = h.next
+ end
+ else
+ h = h.next
+ end
+ end
+ return head, done
+ else
+ return head, false
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/spac-par.mkiv b/Master/texmf-dist/tex/context/base/spac-par.mkiv
index 3477b1c1b14..222f4fd2c20 100644
--- a/Master/texmf-dist/tex/context/base/spac-par.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-par.mkiv
@@ -52,7 +52,7 @@
\newtoks\everynextparagraphintro
\newtoks\@@everyparagraphtoks
-\chardef\everyparagraphintro\zerocount
+\newconstant\everyparagraphintrostate
\unexpanded\def\setupparagraphintro
{\dodoubleempty\dosetupparagraphintro}
@@ -60,14 +60,14 @@
\def\dosetupparagraphintro[#1][#2]%
{\processallactionsinset
[#1]
- [ \v!reset=>\global\chardef\everyparagraphintro\zerocount
+ [ \v!reset=>\global\everyparagraphintrostate\zerocount
\global\everyfirstparagraphintro\emptytoks
\global\everynextparagraphintro \emptytoks,
- \v!first=>\global\chardef\everyparagraphintro\plusone
+ \v!first=>\global\everyparagraphintrostate\plusone
\doglobal\appendtoks#2\to\everyfirstparagraphintro,
- \v!next=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plusone\fi
+ \v!next=>\ifcase\everyparagraphintrostate\global\everyparagraphintrostate\plusone\fi
\doglobal\appendtoks#2\to\everynextparagraphintro,
- \v!each=>\ifcase\everyparagraphintro\global\chardef\everyparagraphintro\plustwo\fi
+ \v!each=>\ifcase\everyparagraphintrostate\global\everyparagraphintrostate\plustwo\fi
\doglobal\appendtoks#2\to\everyfirstparagraphintro
\doglobal\appendtoks#2\to\everynextparagraphintro]}
@@ -84,22 +84,22 @@
%D \stoptyping
\def\flushatparagraph#1%
- {\global\chardef\everyparagraphintro\plusone
+ {\global\everyparagraphintrostate\plusone
\global\appendtoks{#1}\to\everyfirstparagraphintro
\global\let\insertparagraphintro\doinsertparagraphintro}
\def\doinsertparagraphintro % can be merged with the next
- {\ifcase\everyparagraphintro\else\@EA\dodoinsertparagraphintro\fi}
+ {\ifcase\everyparagraphintrostate\else\@EA\dodoinsertparagraphintro\fi}
\def\dodoinsertparagraphintro
{\begingroup
\everypar\emptytoks
- \ifcase\everyparagraphintro\relax
+ \ifcase\everyparagraphintrostate\relax
% no data
\@@everyparagraphtoks\emptytoks
\or
% first data
- \global\chardef\everyparagraphintro\plustwo
+ \global\everyparagraphintrostate\plustwo
\@@everyparagraphtoks\everyfirstparagraphintro
\global\everyfirstparagraphintro\emptytoks
\or
@@ -156,10 +156,19 @@
% Very nasty but needed for margin stuff inside colored
% paragraphs.
+\registerctxluafile{spac-par}{1.001}
+
+\definesystemattribute [graphicvadjust] [public]
+
\let\normalvadjust\vadjust
-\def\graphicvadjust % nasty bidi handling
- {\dowithnextboxcontent
+\def\enablegraphicvadjust
+ {\ctxlua{nodes.tasks.enableaction("finalizers","nodes.handlers.graphicvadjust")}%
+ \glet\enablegraphicvadjust\relax}
+
+\def\graphicvadjust % currently not enabled; nasty bidi handling
+ {\enablegraphicvadjust
+ \dowithnextboxcontent
{\forgetall}
{\vadjust{\vbox attr \graphicvadjustattribute \plusone
{\unvbox\nextbox
diff --git a/Master/texmf-dist/tex/context/base/spac-ver.lua b/Master/texmf-dist/tex/context/base/spac-ver.lua
index c75eb1baa68..83ee6e49208 100644
--- a/Master/texmf-dist/tex/context/base/spac-ver.lua
+++ b/Master/texmf-dist/tex/context/base/spac-ver.lua
@@ -20,69 +20,89 @@ if not modules then modules = { } end modules ['spac-ver'] = {
-- todo: strip baselineskip around display math
local next, type, tonumber = next, type, tonumber
-local format, gmatch, concat, match = string.format, string.gmatch, table.concat, string.match
-local ceil, floor, max, min, round = math.ceil, math.floor, math.max, math.min, math.round
-local texsprint, texlists, texdimen, texbox = tex.sprint, tex.lists, tex.dimen, tex.box
+local format, gmatch, concat, match, rep = string.format, string.gmatch, table.concat, string.match, string.rep
+local ceil, floor, max, min, round, abs = math.ceil, math.floor, math.max, math.min, math.round, math.abs
+local texlists, texdimen, texbox = tex.lists, tex.dimen, tex.box
local lpegmatch = lpeg.match
local unpack = unpack or table.unpack
+local points = number.points
+local allocate = utilities.storage.allocate
-local ctxcatcodes = tex.ctxcatcodes
-local variables = interfaces.variables
+local P, C, R, S, Cc = lpeg.P, lpeg.C, lpeg.R, lpeg.S, lpeg.Cc
-local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
+local nodes, node, trackers, attributes, context = nodes, node, trackers, attributes, context
+
+local variables = interfaces.variables
+
+local starttiming = statistics.starttiming
+local stoptiming = statistics.stoptiming
-- vertical space handler
-local trace_vbox_vspacing = false trackers.register("nodes.vbox_vspacing", function(v) trace_vbox_vspacing = v end)
-local trace_page_vspacing = false trackers.register("nodes.page_vspacing", function(v) trace_page_vspacing = v end)
-local trace_collect_vspacing = false trackers.register("nodes.collect_vspacing", function(v) trace_collect_vspacing = v end)
-local trace_vspacing = false trackers.register("nodes.vspacing", function(v) trace_vspacing = v end)
-local trace_vsnapping = false trackers.register("nodes.vsnapping", function(v) trace_vsnapping = v end)
-
-local skip_category = attributes.private('skip-category')
-local skip_penalty = attributes.private('skip-penalty')
-local skip_order = attributes.private('skip-order')
-local snap_category = attributes.private('snap-category')
-local display_math = attributes.private('display-math')
-local snap_method = attributes.private('snap-method')
-local snap_done = attributes.private('snap-done')
-
-local has_attribute = node.has_attribute
-local unset_attribute = node.unset_attribute
-local set_attribute = node.set_attribute
-local find_node_tail = node.tail
-local free_node = node.free
-local copy_node = node.copy
-local traverse_nodes = node.traverse
-local traverse_nodes_id = node.traverse_id
-local insert_node_before = node.insert_before
-local insert_node_after = node.insert_after
-local remove_node = nodes.remove
-local make_penalty_node = nodes.penalty
-local make_kern_node = nodes.kern
-local make_rule_node = nodes.rule
-local count_nodes = nodes.count
-local node_ids_to_string = nodes.ids_to_string
-local hpack_node = node.hpack
-local vpack_node = node.vpack
-local writable_spec = nodes.writable_spec
-
-local glyph = node.id("glyph")
-local penalty = node.id("penalty")
-local kern = node.id("kern")
-local glue = node.id('glue')
-local hlist = node.id('hlist')
-local vlist = node.id('vlist')
-local adjust = node.id('adjust')
-
-vspacing = vspacing or { }
-vspacing.data = vspacing.data or { }
+local trace_vbox_vspacing = false trackers.register("builders.vbox_vspacing", function(v) trace_vbox_vspacing = v end)
+local trace_page_vspacing = false trackers.register("builders.page_vspacing", function(v) trace_page_vspacing = v end)
+local trace_collect_vspacing = false trackers.register("builders.collect_vspacing", function(v) trace_collect_vspacing = v end)
+local trace_vspacing = false trackers.register("builders.vspacing", function(v) trace_vspacing = v end)
+local trace_vsnapping = false trackers.register("builders.vsnapping", function(v) trace_vsnapping = v end)
+local trace_vpacking = false trackers.register("builders.vpacking", function(v) trace_vpacking = v end)
+
+local report_vspacing = logs.reporter("vspacing","spacing")
+local report_collapser = logs.reporter("vspacing","collapsing")
+local report_snapper = logs.reporter("vspacing","snapping")
+
+local a_skipcategory = attributes.private('skipcategory')
+local a_skippenalty = attributes.private('skippenalty')
+local a_skiporder = attributes.private('skiporder')
+----- snap_category = attributes.private('snapcategory')
+local a_snapmethod = attributes.private('snapmethod')
+local a_snapvbox = attributes.private('snapvbox')
+
+local has_attribute = node.has_attribute
+local unset_attribute = node.unset_attribute
+local set_attribute = node.set_attribute
+local find_node_tail = node.tail
+local free_node = node.free
+local copy_node = node.copy
+local traverse_nodes = node.traverse
+local traverse_nodes_id = node.traverse_id
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+local remove_node = nodes.remove
+local count_nodes = nodes.count
+local nodeidstostring = nodes.idstostring
+local hpack_node = node.hpack
+local vpack_node = node.vpack
+local writable_spec = nodes.writable_spec
+local listtoutf = nodes.listtoutf
+
+local nodepool = nodes.pool
+
+local new_penalty = nodepool.penalty
+local new_kern = nodepool.kern
+local new_rule = nodepool.rule
+local new_gluespec = nodepool.gluespec
+
+local nodecodes = nodes.nodecodes
+local skipcodes = nodes.skipcodes
+local fillcodes = nodes.fillcodes
+
+local penalty_code = nodecodes.penalty
+local kern_code = nodecodes.kern
+local glue_code = nodecodes.glue
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local whatsit_code = nodecodes.whatsit
+
+local userskip_code = skipcodes.userskip
+
+builders.vspacing = builders.vspacing or { }
+local vspacing = builders.vspacing
+vspacing.data = vspacing.data or { }
vspacing.data.snapmethods = vspacing.data.snapmethods or { }
+local snapmethods = vspacing.data.snapmethods --maybe some older code can go
-storage.register("vspacing/data/snapmethods", vspacing.data.snapmethods, "vspacing.data.snapmethods")
-
-local snapmethods = vspacing.data.snapmethods --maybe some older code can go
+storage.register("builders/vspacing/data/snapmethods", snapmethods, "builders.vspacing.data.snapmethods")
local default = {
maxheight = true,
@@ -144,7 +164,7 @@ local function listtohash(str)
end
end
-function vspacing.define_snap_method(name,method)
+function vspacing.definesnapmethod(name,method)
local n = #snapmethods + 1
local t = listtohash(method)
snapmethods[n] = t
@@ -152,8 +172,8 @@ function vspacing.define_snap_method(name,method)
tex.write(n)
end
---~ local rule_id = node.id("rule")
---~ local vlist_id = node.id("vlist")
+--~ local rule_id = nodecodes.rule
+--~ local vlist_id = nodecodes.vlist
--~ function nodes.makevtop(n)
--~ if n.id == vlist_id then
--~ local list = n.list
@@ -163,14 +183,111 @@ end
--~ end
--~ end
-local function snap_hlist(current,method,height,depth) -- method.strut is default
- local snapht, snapdp
+local reference = nodes.reference
+
+local function validvbox(parentid,list)
+ if parentid == hlist_code then
+ local id = list.id
+ if id == whatsit_code then -- check for initial par subtype
+ list = list.next
+ if not next then
+ return nil
+ end
+ end
+ local done = nil
+ for n in traverse_nodes(list) do
+ local id = n.id
+ if id == vlist_code or id == hlist_code then
+ if done then
+ return nil
+ else
+ done = n
+ end
+ elseif id == penalty_code or id == glue_code then
+ -- go on
+ else
+ return nil -- whatever
+ end
+ end
+ if done and done.id == hlist_code then
+ return validvbox(done.id,done.list)
+ end
+ return done -- only one vbox
+ end
+end
+
+local function already_done(parentid,list,a_snapmethod) -- todo: done when only boxes and all snapped
+ -- problem: any snapped vbox ends up in a line
+ if list and parentid == hlist_code then
+ local id = list.id
+ if id == whatsit_code then -- check for initial par subtype
+ list = list.next
+ if not next then
+ return false
+ end
+ end
+--~ local i = 0
+ for n in traverse_nodes(list) do
+ local id = n.id
+--~ i = i + 1 print(i,nodecodes[id],has_attribute(n,a_snapmethod))
+ if id == hlist_code or id == vlist_code then
+ local a = has_attribute(n,a_snapmethod)
+ if not a then
+ -- return true -- not snapped at all
+ elseif a == 0 then
+ return true -- already snapped
+ end
+ elseif id == penalty_code or id == glue_code then -- whatsit is weak spot
+ -- go on
+ else
+ return false -- whatever
+ end
+ end
+ end
+ return false
+end
+
+
+-- quite tricky: ceil(-something) => -0
+
+local function ceiled(n)
+ if n < 0 or n < 0.01 then
+ return 0
+ else
+ return ceil(n)
+ end
+end
+
+local function floored(n)
+ if n < 0 or n < 0.01 then
+ return 0
+ else
+ return floor(n)
+ end
+end
+
+local function snap_hlist(where,current,method,height,depth) -- method.strut is default
+ local list = current.list
--~ print(table.serialize(method))
+ local t = trace_vsnapping and { }
+ if t then
+ t[#t+1] = format("list content: %s",nodes.toutf(list))
+ t[#t+1] = format("parent id: %s",reference(current))
+ t[#t+1] = format("snap method: %s",method.name)
+ t[#t+1] = format("specification: %s",method.specification)
+ end
+ local snapht, snapdp
if method["local"] then
-- snapping is done immediately here
snapht, snapdp = texdimen.bodyfontstrutheight, texdimen.bodyfontstrutdepth
+ if t then
+ t[#t+1] = format("local: snapht %s snapdp %s",points(snapht),points(snapdp))
+ end
elseif method["global"] then
snapht, snapdp = texdimen.globalbodyfontstrutheight, texdimen.globalbodyfontstrutdepth
+ if t then
+ t[#t+1] = format("global: snapht %s snapdp %s",points(snapht),points(snapdp))
+ end
else
-- maybe autolocal
-- snapping might happen later in the otr
@@ -179,110 +296,207 @@ local function snap_hlist(current,method,height,depth) -- method.strut is defaul
if snapht ~= lsnapht and snapdp ~= lsnapdp then
snapht, snapdp = lsnapht, lsnapdp
end
+ if t then
+ t[#t+1] = format("auto: snapht %s snapdp %s",points(snapht),points(snapdp))
+ end
end
local h, d = height or current.height, depth or 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 snaphtdp = snapht + snapdp
+
if method.none then
plusht, plusdp = 0, 0
+ if t then
+ t[#t+1] = format("none: plusht 0pt plusdp 0pt")
+ end
end
- if method.halfline then
+ if method.halfline then -- extra halfline
plusht, plusdp = plusht + snaphtdp/2, plusdp + snaphtdp/2
+ if t then
+ t[#t+1] = format("halfline: plusht %s plusdp %s",points(plusht),points(plusdp))
+ end
end
- if method.line then
+ if method.line then -- extra line
plusht, plusdp = plusht + snaphtdp, plusdp + snaphtdp
+ if t then
+ t[#t+1] = format("line: plusht %s plusdp %s",points(plusht),points(plusdp))
+ end
end
if method.first then
- if current.id == vlist then
- local list, lh, ld = current.list
- for n in traverse_nodes_id(hlist,list) do
+ local thebox = current
+ local id = thebox.id
+ if id == hlist_code then
+ thebox = validvbox(id,thebox.list)
+ id = thebox and thebox.id
+ end
+ if thebox and id == vlist_code then
+ local list, lh, ld = thebox.list
+ for n in traverse_nodes_id(hlist_code,list) do
lh, ld = n.height, n.depth
break
end
if lh then
- local x = max(ceil((lh-hr*snapht)/snaphtdp),0)*snaphtdp + plusht
- local n = make_kern_node(x-lh)
- n.next, list.prev, current.list = list, n, n
- ch = x + snaphtdp
- cd = max(ceil((d+h-lh-dr*snapdp-hr*snapht)/snaphtdp),0)*snaphtdp + plusdp
+ local ht, dp = thebox.height, thebox.depth
+ if t then
+ t[#t+1] = format("first line: height %s depth %s",points(lh),points(ld))
+ t[#t+1] = format("dimensions: height %s depth %s",points(ht),points(dp))
+ end
+ local delta = h - lh
+ ch, cd = lh, delta + d
+--~ ch = ch + plusht
+--~ cd = cd + plusdp
+h, d = ch, cd
+ local shifted = hpack_node(current.list)
+ shifted.shift = delta
+ current.list = shifted
done = true
+ if t then
+ t[#t+1] = format("first: height %s depth %s shift %s",points(ch),points(cd),points(delta))
+ end
+ elseif t then
+ t[#t+1] = "first: not done, no content"
end
+ elseif t then
+ t[#t+1] = "first: not done, no vbox"
end
elseif method.last then
- if current.id == vlist then
- local list, lh, ld = current.list
- for n in traverse_nodes_id(hlist,list) do
+ local thebox = current
+ local id = thebox.id
+ if id == hlist_code then
+ thebox = validvbox(id,thebox.list)
+ id = thebox and thebox.id
+ end
+ if thebox and id == vlist_code then
+ local list, lh, ld = thebox.list
+ for n in traverse_nodes_id(hlist_code,list) do
lh, ld = n.height, n.depth
end
if lh then
- local baseline_till_top = h + d - ld
- local x = max(ceil((baseline_till_top-hr*snapht)/snaphtdp),0)*snaphtdp + plusht
- local n = make_kern_node(x-baseline_till_top)
- n.next, list.prev, current.list = list, n, n
- ch = x
- cd = max(ceil((ld-dr*snapdp)/snaphtdp),0)*snaphtdp + plusdp
+ local ht, dp = thebox.height, thebox.depth
+ if t then
+ t[#t+1] = format("last line: height %s depth %s",points(lh),points(ld))
+ t[#t+1] = format("dimensions: height %s depth %s",points(ht),points(dp))
+ end
+ local delta = d - ld
+ cd, ch = ld, delta + h
+--~ ch = ch + plusht
+--~ cd = cd + plusdp
+h, d = ch, cd
+ local shifted = hpack_node(current.list)
+ shifted.shift = delta
+ current.list = shifted
done = true
+ if t then
+ t[#t+1] = format("last: height %s depth %s shift %s",points(ch),points(cd),points(delta))
+ end
+ elseif t then
+ t[#t+1] = "last: not done, no content"
end
+ elseif t then
+ t[#t+1] = "last: not done, no vbox"
end
end
- if done then
- -- first or last
- elseif method.minheight then
- ch = max(floor((h-hr*snapht)/snaphtdp),0)*snaphtdp + plusht
+--~ if done then
+--~ -- first or last
+--~ else
+ if method.minheight then
+ -- ch = max(floor((h-hr*snapht)/snaphtdp),0)*snaphtdp + plusht
+ ch = floored((h-hr*snapht)/snaphtdp)*snaphtdp + plusht
+ if t then
+ t[#t+1] = format("minheight: %s",points(ch))
+ end
elseif method.maxheight then
- ch = max(ceil((h-hr*snapht)/snaphtdp),0)*snaphtdp + plusht
+ -- ch = max(ceil((h-hr*snapht)/snaphtdp),0)*snaphtdp + plusht
+ ch = ceiled((h-hr*snapht)/snaphtdp)*snaphtdp + plusht
+ if t then
+ t[#t+1] = format("maxheight: %s",points(ch))
+ end
else
ch = plusht
+ if t then
+ t[#t+1] = format("set height: %s",points(ch))
+ end
end
- if done then
- -- first or last
- elseif method.mindepth then
- cd = max(floor((d-dr*snapdp)/snaphtdp),0)*snaphtdp + plusdp
+--~ if done then
+--~ -- first or last
+--~ else
+ if method.mindepth then
+ -- cd = max(floor((d-dr*snapdp)/snaphtdp),0)*snaphtdp + plusdp
+ cd = floored((d-dr*snapdp)/snaphtdp)*snaphtdp + plusdp
+ if t then
+ t[#t+1] = format("mindepth: %s",points(cd))
+ end
elseif method.maxdepth then
- cd = max(ceil((d-dr*snapdp)/snaphtdp),0)*snaphtdp + plusdp
+ -- cd = max(ceil((d-dr*snapdp)/snaphtdp),0)*snaphtdp + plusdp
+ cd = ceiled((d-dr*snapdp)/snaphtdp)*snaphtdp + plusdp
+ if t then
+ t[#t+1] = format("maxdepth: %s",points(cd))
+ end
else
cd = plusdp
+ if t then
+ t[#t+1] = format("set depth: %s",points(cd))
+ end
end
if method.top then
ch = ch + tlines * snaphtdp
+ if t then
+ t[#t+1] = format("top height: %s",points(ch))
+ end
end
if method.bottom then
cd = cd + blines * snaphtdp
+ if t then
+ t[#t+1] = format("bottom depth: %s",points(cd))
+ end
end
local offset = method.offset
if offset then
-- we need to set the attr
- local shifted = vpack_node(current.list)
+ if t then
+ t[#t+1] = format("before offset: %s (width %s height %s depth %s)",
+ points(offset),points(current.width),points(current.height),points(current.depth))
+ end
+ local shifted = hpack_node(current.list)
shifted.shift = offset
current.list = shifted
+ if t then
+ t[#t+1] = format("after offset: %s (width %s height %s depth %s)",
+ points(offset),points(current.width),points(current.height),points(current.depth))
+ end
+ set_attribute(shifted,a_snapmethod,0)
+ set_attribute(current,a_snapmethod,0)
end
if not height then
current.height = ch
+ if t then
+ t[#t+1] = format("forced height: %s",points(ch))
+ end
end
if not depth then
current.depth = cd
+ if t then
+ t[#t+1] = format("forced depth: %s",points(cd))
+ end
+ end
+ local lines = (ch+cd)/snaphtdp
+ if t then
+ local original = (h+d)/snaphtdp
+ t[#t+1] = format("final lines: %s -> %s",original,lines)
+ t[#t+1] = format("final height: %s -> %s",points(h),points(ch))
+ t[#t+1] = format("final depth: %s -> %s",points(d),points(cd))
+ end
+ if t then
+ report_snapper("trace: %s type %s\n\t%s",where,nodecodes[current.id],concat(t,"\n\t"))
end
- -- set_attribute(current,snap_method,0)
- return h, d, ch, cd, (ch+cd)/snaphtdp
+ return h, d, ch, cd, lines
end
---~ local function snap_topskip(current,method)
---~ local spec = current.spec
---~ local w = spec.width
---~ local wd = w
---~ if spec then
---~ wd = 0
---~ spec = writable_spec(current)
---~ spec.width = wd
---~ end
---~ return w, wd
---~ end
-
local function snap_topskip(current,method)
local spec = current.spec
local w = spec.width
@@ -293,7 +507,7 @@ local function snap_topskip(current,method)
return w, wd
end
-vspacing.categories = {
+local categories = allocate {
[0] = 'discard',
[1] = 'largest',
[2] = 'force' ,
@@ -305,7 +519,7 @@ vspacing.categories = {
[8] = 'together'
}
-local categories = vspacing.categories
+vspacing.categories = categories
function vspacing.tocategories(str)
local t = { }
@@ -328,73 +542,68 @@ function vspacing.tocategory(str)
end
end
-vspacing.data.map = vspacing.data.map or { }
-vspacing.data.skip = vspacing.data.skip or { }
+vspacing.data.map = vspacing.data.map or { } -- allocate ?
+vspacing.data.skip = vspacing.data.skip or { } -- allocate ?
-storage.register("vspacing/data/map", vspacing.data.map, "vspacing.data.map")
-storage.register("vspacing/data/skip", vspacing.data.skip, "vspacing.data.skip")
+storage.register("builders/vspacing/data/map", vspacing.data.map, "builders.vspacing.data.map")
+storage.register("builders/vspacing/data/skip", vspacing.data.skip, "builders.vspacing.data.skip")
do -- todo: interface.variables
- local function logger(c,...)
- logs.report("vspacing",concat {...})
- texsprint(c,...)
- end
-
vspacing.fixed = false
local map = vspacing.data.map
local skip = vspacing.data.skip
- local multiplier = lpeg.C(lpeg.S("+-")^0 * lpeg.R("09")^1) * lpeg.P("*")
- local category = lpeg.P(":") * lpeg.C(lpeg.P(1)^1)
- local keyword = lpeg.C((1-category)^1)
- local splitter = (multiplier + lpeg.Cc(1)) * keyword * (category + lpeg.Cc(false))
+ local multiplier = C(S("+-")^0 * R("09")^1) * P("*")
+ local category = P(":") * C(P(1)^1)
+ local keyword = C((1-category)^1)
+ local splitter = (multiplier + Cc(1)) * keyword * (category + Cc(false))
local k_fixed, k_flexible, k_category, k_penalty, k_order = variables.fixed, variables.flexible, "category", "penalty", "order"
-- This will change: just node.write and we can store the values in skips which
-- then obeys grouping
- local function analyse(str,oldcategory,texsprint) -- we could use shorter names
+ local function analyze(str,oldcategory) -- we could use shorter names
for s in gmatch(str,"([^ ,]+)") do
local amount, keyword, detail = lpegmatch(splitter,s)
if not keyword then
- logs.report("vspacing","unknown directive: %s",s)
+ report_vspacing("unknown directive: %s",s)
else
local mk = map[keyword]
if mk then
- category = analyse(mk,category,texsprint)
+ category = analyze(mk,category)
elseif keyword == k_fixed then
- texsprint(ctxcatcodes,"\\fixedblankskip")
+ context.fixedblankskip()
elseif keyword == k_flexible then
- texsprint(ctxcatcodes,"\\flexibleblankskip")
+ context.flexibleblankskip()
elseif keyword == k_category then
local category = tonumber(detail)
if category then
- texsprint(ctxcatcodes,"\\setblankcategory{",category,"}")
+ context.setblankcategory(category)
if category ~= oldcategory then
- texsprint(ctxcatcodes,"\\flushblankhandling")
+ context.flushblankhandling()
oldcategory = category
end
end
elseif keyword == k_order and detail then
local order = tonumber(detail)
if order then
- texsprint(ctxcatcodes,"\\setblankorder{",order,"}")
+ context.setblankorder(order)
end
elseif keyword == k_penalty and detail then
local penalty = tonumber(detail)
if penalty then
- texsprint(ctxcatcodes,"\\setblankpenalty{",penalty,"}")
+ context.setblankpenalty(penalty)
end
else
amount = tonumber(amount) or 1
local sk = skip[keyword]
if sk then
- texsprint(ctxcatcodes,"\\addpredefinedblankskip{",amount,"}{",keyword,"}")
+ context.addpredefinedblankskip(amount,keyword)
else -- no check
- texsprint(ctxcatcodes,"\\addaskedblankskip{",amount,"}{",keyword,"}")
+ context.addaskedblankskip(amount,keyword)
end
end
end
@@ -402,11 +611,16 @@ do -- todo: interface.variables
return category
end
- function vspacing.analyse(str)
- local texsprint = (trace_vspacing and logger) or texsprint
- texsprint(ctxcatcodes,"\\startblankhandling")
- analyse(str,1,texsprint)
- texsprint(ctxcatcodes,"\\stopblankhandling")
+ function vspacing.analyze(str)
+ if trace_vspacing then
+ context.pushlogger(report_vspacing)
+ end
+ context.startblankhandling()
+ analyze(str,1)
+ context.stopblankhandling()
+ if trace_vspacing then
+ context.poplogger()
+ end
end
--
@@ -434,19 +648,20 @@ end
local trace_list, tracing_info, before, after = { }, false, "", ""
+local stripzeros, topoints = utilities.formatters.stripzeros, number.topoints
+
local function glue_to_string(glue)
local spec = glue.spec
- local t = { }
- t[#t+1] = aux.strip_zeros(number.topoints(spec.width))
+ local t = { points(spec.width) }
if spec.stretch_order and spec.stretch_order ~= 0 then
- t[#t+1] = format("plus -%sfi%s",spec.stretch/65536,string.rep("l",math.abs(spec.stretch_order)-1))
+ t[#t+1] = format("plus %s%s",spec.stretch/65536,fillcodes[spec.stretch_order])
elseif spec.stretch and spec.stretch ~= 0 then
- t[#t+1] = format("plus %s",aux.strip_zeros(number.topoints(spec.stretch)))
+ t[#t+1] = format("plus %s",stripzeros(topoints(spec.stretch)))
end
if spec.shrink_order and spec.shrink_order ~= 0 then
- t[#t+1] = format("minus -%sfi%s",spec.shrink/65536,string.rep("l",math.abs(spec.shrink_order)-1))
+ t[#t+1] = format("minus %s%s",spec.shrink/65536,fillcodes[spec.shrink_order])
elseif spec.shrink and spec.shrink ~= 0 then
- t[#t+1] = format("minus %s",aux.strip_zeros(number.topoints(spec.shrink)))
+ t[#t+1] = format("minus %s",stripzeros(topoints(spec.shrink)))
end
return concat(t," ")
end
@@ -455,13 +670,13 @@ local function nodes_to_string(head)
local current, t = head, { }
while current do
local id = current.id
- local ty = node.type(id)
- if id == penalty then
+ local ty = nodecodes[id]
+ if id == penalty_code then
t[#t+1] = format("%s:%s",ty,current.penalty)
- elseif id == glue then
- t[#t+1] = format("%s:%s",ty,aux.strip_zeros(number.topoints(current.spec.width)))
- elseif id == kern then
- t[#t+1] = format("%s:%s",ty,aux.strip_zeros(number.topoints(current.kern)))
+ elseif id == glue_code then
+ t[#t+1] = format("%s:%s",ty,stripzeros(topoints(current.spec.width)))
+ elseif id == kern_code then
+ t[#t+1] = format("%s:%s",ty,stripzeros(topoints(current.kern)))
else
t[#t+1] = ty
end
@@ -489,7 +704,7 @@ local function trace_info(message, where, what)
end
local function trace_node(what)
- local nt = node.type(what.id)
+ local nt = nodecodes[what.id]
local tl = trace_list[#trace_list]
if tl and tl[1] == "node" then
trace_list[#trace_list] = { "node", tl[2] .. " + " .. nt }
@@ -499,7 +714,7 @@ local function trace_node(what)
end
local function trace_done(str,data)
- if data.id == penalty then
+ if data.id == penalty_code then
trace_list[#trace_list+1] = { "penalty", format("%s | %s", str, data.penalty) }
else
trace_list[#trace_list+1] = { "glue", format("%s | %s", str, glue_to_string(data)) }
@@ -513,84 +728,72 @@ local function show_tracing(head)
for i=1,#trace_list do
local tag, text = unpack(trace_list[i])
if tag == "info" then
- logs.report("collapse",text)
+ report_collapser(text)
else
- logs.report("collapse"," %s: %s",tag,text)
+ report_collapser(" %s: %s",tag,text)
end
end
- logs.report("collapse","before: %s",before)
- logs.report("collapse","after : %s",after)
+ report_collapser("before: %s",before)
+ report_collapser("after : %s",after)
end
end
-- alignment box begin_of_par vmode_par hmode_par insert penalty before_display after_display
-local user_skip = 0
-local line_skip = 1
-local baseline_skip = 2
-local par_skip = 3
-local above_display_skip = 4
-local below_display_skip = 5
-local above_display_short_skip = 6
-local below_display_short_skip = 7
-local left_skip_code = 8
-local right_skip_code = 9
-local top_skip_code = 10
-local split_top_skip_code = 11
-local tab_skip_code = 12
-local space_skip_code = 13
-local xspace_skip_code = 14
-local par_fill_skip_code = 15
-local thin_mu_skip_code = 16
-local med_mu_skip_code = 17
-local thick_mu_skip_code = 18
-
-local skips = {
- [ 0] = "user_skip",
- [ 1] = "line_skip",
- [ 2] = "baseline_skip",
- [ 3] = "par_skip",
- [ 4] = "above_display_skip",
- [ 5] = "below_display_skip",
- [ 6] = "above_display_short_skip",
- [ 7] = "below_display_short_skip",
- [ 8] = "left_skip_code",
- [ 9] = "right_skip_code",
- [10] = "top_skip_code",
- [11] = "split_top_skip_code",
- [12] = "tab_skip_code",
- [13] = "space_skip_code",
- [14] = "xspace_skip_code",
- [15] = "par_fill_skip_code",
- [16] = "thin_mu_skip_code",
- [17] = "med_mu_skip_code",
- [18] = "thick_mu_skip_code",
-}
+local skipcodes = nodes.skipcodes
+
+local userskip_code = skipcodes.userskip
+local lineskip_code = skipcodes.lineskip
+local baselineskip_code = skipcodes.baselineskip
+local parskip_code = skipcodes.parskip
+local abovedisplayskip_code = skipcodes.abovedisplayskip
+local belowdisplayskip_code = skipcodes.belowdisplayskip
+local abovedisplayshortskip_code = skipcodes.abovedisplayshortskip
+local belowdisplayshortskip_code = skipcodes.belowdisplayshortskip
+local topskip_code = skipcodes.topskip
+local splittopskip_code = skipcodes.splittopskip
local free_glue_node = free_node
local discard, largest, force, penalty, add, disable, nowhite, goback, together = 0, 1, 2, 3, 4, 5, 6, 7, 8
---~ local function free_glue_node(n) free_node(n.spec) free_node(n) end
+--~ local function free_glue_node(n)
+--~ -- free_node(n.spec)
+--~ print("before",n)
+--~ logs.flush()
+--~ free_node(n)
+--~ print("after")
+--~ logs.flush()
+--~ end
-function vspacing.snap_box(n,how)
+function vspacing.snapbox(n,how)
local sv = snapmethods[how]
if sv then
local box = texbox[n]
local list = box.list
---~ if list and (list.id == hlist or list.id == vlist) then
if list then
- local s = has_attribute(list,snap_method)
+ local s = has_attribute(list,a_snapmethod)
if s == 0 then
if trace_vsnapping then
- -- logs.report("snapper", "hlist not snapped, already done")
+ -- report_snapper("box list not snapped, already done")
end
else
- local h, d, ch, cd, lines = snap_hlist(box,sv,box.height,box.depth)
- box.height, box.depth = ch, cd
- if trace_vsnapping then
- logs.report("snapper", "hlist snapped from (%s,%s) to (%s,%s) using method '%s' (%s) for '%s' (%s lines)",h,d,ch,cd,sv.name,sv.specification,"direct",lines)
+ local ht, dp = box.height, box.depth
+ if false then -- todo: already_done
+ -- assume that the box is already snapped
+ if trace_vsnapping then
+ report_snapper("box list already snapped at (%s,%s): %s",
+ ht,dp,listtoutf(list))
+ end
+ else
+ local h, d, ch, cd, lines = snap_hlist("box",box,sv,ht,dp)
+ box.height, box.depth = ch, cd
+ if trace_vsnapping then
+ report_snapper("box list snapped from (%s,%s) to (%s,%s) using method '%s' (%s) for '%s' (%s lines): %s",
+ h,d,ch,cd,sv.name,sv.specification,"direct",lines,listtoutf(list))
+ end
+ set_attribute(box, a_snapmethod,0) --
+ set_attribute(list,a_snapmethod,0) -- yes or no
end
- set_attribute(list,snap_method,0)
end
end
end
@@ -598,23 +801,23 @@ end
local function forced_skip(head,current,width,where,trace)
if where == "after" then
- head, current = insert_node_after(head,current,make_rule_node(0,0,0))
- head, current = insert_node_after(head,current,make_kern_node(width))
- head, current = insert_node_after(head,current,make_rule_node(0,0,0))
+ head, current = insert_node_after(head,current,new_rule(0,0,0))
+ head, current = insert_node_after(head,current,new_kern(width))
+ head, current = insert_node_after(head,current,new_rule(0,0,0))
else
local c = current
- head, current = insert_node_before(head,current,make_rule_node(0,0,0))
- head, current = insert_node_before(head,current,make_kern_node(width))
- head, current = insert_node_before(head,current,make_rule_node(0,0,0))
+ head, current = insert_node_before(head,current,new_rule(0,0,0))
+ head, current = insert_node_before(head,current,new_kern(width))
+ head, current = insert_node_before(head,current,new_rule(0,0,0))
current = c
end
if trace then
- logs.report("vspacing", "inserting forced skip of %s",width)
+ report_vspacing("inserting forced skip of %s",width)
end
return head, current
end
-local function collapser(head,where,what,trace,snap) -- maybe also pass tail
+local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also pass tail
if trace then
reset_tracing(head)
end
@@ -627,18 +830,18 @@ local function collapser(head,where,what,trace,snap) -- maybe also pass tail
--
local function flush(why)
if penalty_data then
- local p = make_penalty_node(penalty_data)
+ local p = new_penalty(penalty_data)
if trace then trace_done("flushed due to " .. why,p) end
- head, _ = insert_node_before(head,current,p)
+ head = insert_node_before(head,current,p)
end
if glue_data then
if force_glue then
if trace then trace_done("flushed due to " .. why,glue_data) end
- head, _ = forced_skip(head,current,glue_data.spec.width,"before",trace)
+ head = forced_skip(head,current,glue_data.spec.width,"before",trace)
free_glue_node(glue_data)
elseif glue_data.spec.writable then
if trace then trace_done("flushed due to " .. why,glue_data) end
- head, _ = insert_node_before(head,current,glue_data)
+ head = insert_node_before(head,current,glue_data)
else
free_glue_node(glue_data)
end
@@ -649,36 +852,47 @@ local function collapser(head,where,what,trace,snap) -- maybe also pass tail
parskip, ignore_parskip, ignore_following, ignore_whitespace = nil, false, false, false
end
if trace_vsnapping then
- logs.report("snapper", "global ht/dp = %s/%s, local ht/dp = %s/%s",
+ report_snapper("global ht/dp = %s/%s, local ht/dp = %s/%s",
texdimen.globalbodyfontstrutheight, texdimen.globalbodyfontstrutdepth,
texdimen.bodyfontstrutheight, texdimen.bodyfontstrutdepth)
end
if trace then trace_info("start analyzing",where,what) end
while current do
local id, subtype = current.id, current.subtype
- if id == hlist or id == vlist then
--- needs checking, why so many calls
+ if id == hlist_code or id == vlist_code then
+ -- needs checking, why so many calls
if snap then
- local s = has_attribute(current,snap_method)
+ local list = current.list
+ local s = has_attribute(current,a_snapmethod)
if not s then
-- if trace_vsnapping then
- -- logs.report("snapper", "hlist not snapped")
+ -- report_snapper("mvl list not snapped")
-- end
elseif s == 0 then
if trace_vsnapping then
- -- logs.report("snapper", "hlist not snapped, already done")
+ report_snapper("mvl %s not snapped, already done: %s",nodecodes[id],listtoutf(list))
end
else
local sv = snapmethods[s]
if sv then
- local h, d, ch, cd, lines = snap_hlist(current,sv)
- if trace_vsnapping then
- logs.report("snapper", "hlist snapped from (%s,%s) to (%s,%s) using method '%s' (%s) for '%s' (%s lines)",h,d,ch,cd,sv.name,sv.specification,where,lines)
+ -- check if already snapped
+ if list and already_done(id,list,a_snapmethod) then
+ local ht, dp = current.height, current.depth
+ -- assume that the box is already snapped
+ if trace_vsnapping then
+ report_snapper("mvl list already snapped at (%s,%s): %s",ht,dp,listtoutf(list))
+ end
+ else
+ local h, d, ch, cd, lines = snap_hlist("mvl",current,sv)
+ if trace_vsnapping then
+ report_snapper("mvl %s snapped from (%s,%s) to (%s,%s) using method '%s' (%s) for '%s' (%s lines): %s",
+ nodecodes[id],h,d,ch,cd,sv.name,sv.specification,where,lines,listtoutf(list))
+ end
end
elseif trace_vsnapping then
- logs.report("snapper", "hlist not snapped due to unknown snap specification")
+ report_snapper("mvl %s not snapped due to unknown snap specification: %s",nodecodes[id],listtoutf(list))
end
- set_attribute(current,snap_method,0)
+ set_attribute(current,a_snapmethod,0)
end
else
--
@@ -686,25 +900,25 @@ local function collapser(head,where,what,trace,snap) -- maybe also pass tail
-- tex.prevdepth = 0
flush("list")
current = current.next
- elseif id == penalty then
+ elseif id == penalty_code then
--~ natural_penalty = current.penalty
--~ if trace then trace_done("removed penalty",current) end
--~ head, current = remove_node(head, current, true)
current = current.next
- elseif id == kern then
+ elseif id == kern_code then
if snap and trace_vsnapping and current.kern ~= 0 then
--~ current.kern = 0
- logs.report("snapper", "kern of %s (kept)",current.kern)
+ report_snapper("kern of %s (kept)",current.kern)
end
flush("kern")
current = current.next
- elseif id ~= glue then
+ elseif id ~= glue_code then
flush("something else")
current = current.next
- elseif subtype == user_skip then -- todo, other subtypes, like math
- local sc = has_attribute(current,skip_category) -- has no default, no unset (yet)
- local so = has_attribute(current,skip_order ) or 1 -- has 1 default, no unset (yet)
- local sp = has_attribute(current,skip_penalty ) -- has no default, no unset (yet)
+ elseif subtype == userskip_code then
+ local sc = has_attribute(current,a_skipcategory) -- has no default, no unset (yet)
+ local so = has_attribute(current,a_skiporder ) or 1 -- has 1 default, no unset (yet)
+ local sp = has_attribute(current,a_skippenalty ) -- has no default, no unset (yet)
if sp and sc == penalty then
if not penalty_data then
penalty_data = sp
@@ -718,21 +932,22 @@ local function collapser(head,where,what,trace,snap) -- maybe also pass tail
elseif not sc then -- if not sc then
if glue_data then
if trace then trace_done("flush",glue_data) end
- head, current = nodes.before(head,current,glue_data)
+ head = insert_node_before(head,current,glue_data)
if trace then trace_natural("natural",current) end
current = current.next
else
-- not look back across head
local previous = current.prev
- if previous and previous.id == glue and previous.subtype == 0 then
+ if previous and previous.id == glue_code and previous.subtype == userskip_code then
local ps = previous.spec
if ps.writable then
local cs = current.spec
if cs.writable and ps.stretch_order == 0 and ps.shrink_order == 0 and cs.stretch_order == 0 and cs.shrink_order == 0 then
local pw, pp, pm = ps.width, ps.stretch, ps.shrink
local cw, cp, cm = cs.width, cs.stretch, cs.shrink
- ps = writable_spec(previous) -- no writable needed here
- ps.width, ps.stretch, ps.shrink = pw + cw, pp + cp, pm + cm
+--~ ps = writable_spec(previous) -- no writable needed here
+--~ ps.width, ps.stretch, ps.shrink = pw + cw, pp + cp, pm + cm
+previous.spec = new_gluespec(pw + cw, pp + cp, pm + cm) -- else topskip can disappear
if trace then trace_natural("removed",current) end
head, current = remove_node(head, current, true)
-- current = previous
@@ -809,7 +1024,7 @@ local function collapser(head,where,what,trace,snap) -- maybe also pass tail
head, current = remove_node(head, current, true)
elseif sc == add then
if trace then trace_skip('add',sc,so,sp,current) end
---~ local old, new = glue_data.spec, current.spec
+ -- local old, new = glue_data.spec, current.spec
local old, new = writable_spec(glue_data), current.spec
old.width = old.width + new.width
old.stretch = old.stretch + new.stretch
@@ -827,16 +1042,16 @@ local function collapser(head,where,what,trace,snap) -- maybe also pass tail
if sc == force then
force_glue = true
end
- elseif subtype == line_skip then
+ elseif subtype == lineskip_code then
if snap then
- local s = has_attribute(current,snap_method)
+ local s = has_attribute(current,a_snapmethod)
if s and s ~= 0 then
- set_attribute(current,snap_method,0)
+ set_attribute(current,a_snapmethod,0)
if current.spec.writable then
local spec = writable_spec(current)
spec.width = 0
if trace_vsnapping then
- logs.report("snapper", "lineskip set to zero")
+ report_snapper("lineskip set to zero")
end
end
else
@@ -848,16 +1063,16 @@ local function collapser(head,where,what,trace,snap) -- maybe also pass tail
flush("lineskip")
end
current = current.next
- elseif subtype == baseline_skip then
+ elseif subtype == baselineskip_code then
if snap then
- local s = has_attribute(current,snap_method)
+ local s = has_attribute(current,a_snapmethod)
if s and s ~= 0 then
- set_attribute(current,snap_method,0)
+ set_attribute(current,a_snapmethod,0)
if current.spec.writable then
local spec = writable_spec(current)
spec.width = 0
if trace_vsnapping then
- logs.report("snapper", "baselineskip set to zero")
+ report_snapper("baselineskip set to zero")
end
end
else
@@ -869,7 +1084,7 @@ local function collapser(head,where,what,trace,snap) -- maybe also pass tail
flush("baselineskip")
end
current = current.next
- elseif subtype == par_skip then
+ elseif subtype == parskip_code then
-- parskip always comes later
if ignore_whitespace then
if trace then trace_natural("ignored parskip",current) end
@@ -887,15 +1102,15 @@ local function collapser(head,where,what,trace,snap) -- maybe also pass tail
if trace then trace_natural("honored parskip",current) end
head, current, glue_data = remove_node(head, current)
end
- elseif subtype == top_skip_code or subtype == split_top_skip_code then
+ elseif subtype == topskip_code or subtype == splittopskip_code then
if snap then
- local s = has_attribute(current,snap_method)
+ local s = has_attribute(current,a_snapmethod)
if s and s ~= 0 then
- set_attribute(current,snap_method,0)
+ set_attribute(current,a_snapmethod,0)
local sv = snapmethods[s]
local w, cw = snap_topskip(current,sv)
if trace_vsnapping then
- logs.report("snapper", "topskip snapped from %s to %s for '%s'",w,cw,where)
+ report_snapper("topskip snapped from %s to %s for '%s'",w,cw,where)
end
else
if trace then trace_skip("topskip",sc,so,sp,current) end
@@ -906,25 +1121,25 @@ local function collapser(head,where,what,trace,snap) -- maybe also pass tail
flush("topskip")
end
current = current.next
- elseif subtype == above_display_skip then
+ elseif subtype == abovedisplayskip_code then
--
if trace then trace_skip("above display skip (normal)",sc,so,sp,current) end
flush("above display skip (normal)")
current = current.next
--
- elseif subtype == below_display_skip then
+ elseif subtype == belowdisplayskip_code then
--
if trace then trace_skip("below display skip (normal)",sc,so,sp,current) end
flush("below display skip (normal)")
current = current.next
--
- elseif subtype == above_display_short_skip then
+ elseif subtype == abovedisplayshortskip_code then
--
if trace then trace_skip("above display skip (short)",sc,so,sp,current) end
flush("above display skip (short)")
current = current.next
--
- elseif subtype == below_display_short_skip then
+ elseif subtype == belowdisplayshortskip_code then
--
if trace then trace_skip("below display skip (short)",sc,so,sp,current) end
flush("below display skip (short)")
@@ -932,7 +1147,7 @@ local function collapser(head,where,what,trace,snap) -- maybe also pass tail
--
else -- other glue
if snap and trace_vsnapping and current.spec.writable and current.spec.width ~= 0 then
- logs.report("snapper", "%s of %s (kept)",skips[subtype],current.spec.width)
+ report_snapper("%s of %s (kept)",skipcodes[subtype],current.spec.width)
--~ current.spec.width = 0
end
if trace then trace_skip(format("some glue (%s)",subtype),sc,so,sp,current) end
@@ -950,7 +1165,7 @@ local function collapser(head,where,what,trace,snap) -- maybe also pass tail
local tail
if penalty_data then
tail = find_node_tail(head)
- local p = make_penalty_node(penalty_data)
+ local p = new_penalty(penalty_data)
if trace then trace_done("result",p) end
head, tail = insert_node_after(head,tail,p)
end
@@ -970,7 +1185,7 @@ local function collapser(head,where,what,trace,snap) -- maybe also pass tail
end
show_tracing(head)
if oldhead ~= head then
- trace_info("head has been changed from '%s' to '%s'",node.type(oldhead.id),node.type(head.id))
+ trace_info("head has been changed from '%s' to '%s'",nodecodes[oldhead.id],nodecodes[head.id])
end
end
return head, true
@@ -989,21 +1204,21 @@ end
local stackhead, stacktail, stackhack = nil, nil, false
local function report(message,lst)
- logs.report("vspacing",message,count_nodes(lst,true),node_ids_to_string(lst))
+ report_vspacing(message,count_nodes(lst,true),nodeidstostring(lst))
end
-function nodes.handle_page_spacing(newhead,where)
---~ local newhead = texlists.contrib_head
+function vspacing.pagehandler(newhead,where)
+ -- local newhead = texlists.contrib_head
if newhead then
---~ starttiming(vspacing)
+ -- starttiming(vspacing)
local newtail = find_node_tail(newhead)
local flush = false
stackhack = true -- todo: only when grid snapping once enabled
for n in traverse_nodes(newhead) do -- we could just look for glue nodes
local id = n.id
- if id == glue then
- if n.subtype == 0 then
- if has_attribute(n,skip_category) then
+ if id == glue_code then
+ if n.subtype == userskip_code then
+ if has_attribute(n,a_skipcategory) then
stackhack = true
else
flush = true
@@ -1026,8 +1241,8 @@ function nodes.handle_page_spacing(newhead,where)
if stackhack then
stackhack = false
if trace_collect_vspacing then report("processing %s nodes: %s",newhead) end
---~ texlists.contrib_head = collapser(newhead,"page",where,trace_page_vspacing,true)
-newhead = collapser(newhead,"page",where,trace_page_vspacing,true)
+--~ texlists.contrib_head = collapser(newhead,"page",where,trace_page_vspacing,true,a_snapmethod)
+ newhead = collapser(newhead,"page",where,trace_page_vspacing,true,a_snapmethod)
else
if trace_collect_vspacing then report("flushing %s nodes: %s",newhead) end
--~ texlists.contrib_head = newhead
@@ -1042,12 +1257,12 @@ newhead = collapser(newhead,"page",where,trace_page_vspacing,true)
stackhead = newhead
end
stacktail = newtail
---~ texlists.contrib_head = nil
-newhead = nil
+ -- texlists.contrib_head = nil
+ newhead = nil
end
---~ stoptiming(vspacing)
+ -- stoptiming(vspacing)
end
-return newhead
+ return newhead
end
local ignore = table.tohash {
@@ -1056,102 +1271,44 @@ local ignore = table.tohash {
-- "vbox",
}
-function nodes.handle_vbox_spacing(head,where)
+function vspacing.vboxhandler(head,where)
if head and not ignore[where] and head.next then
-- starttiming(vspacing)
- head = collapser(head,"vbox",where,trace_vbox_vspacing,false)
+ head = collapser(head,"vbox",where,trace_vbox_vspacing,true,a_snapvbox) -- todo: local snapper
-- stoptiming(vspacing)
end
return head
end
-function nodes.collapse_vbox(n) -- for boxes
+function vspacing.collapsevbox(n) -- for boxes but using global a_snapmethod
local list = texbox[n].list
if list then
-- starttiming(vspacing)
- texbox[n].list = vpack_node(collapser(list,"snapper","vbox",trace_vbox_vspacing,true))
+ texbox[n].list = vpack_node(collapser(list,"snapper","vbox",trace_vbox_vspacing,true,a_snapmethod))
-- stoptiming(vspacing)
end
end
--- we will split this module hence the locals
-
-local attribute = attributes.private('graphicvadjust')
-
-local hlist = node.id('hlist')
-local vlist = node.id('vlist')
-
-local remove_node = nodes.remove
-local hpack_node = node.hpack
-local vpack_node = node.vpack
-local has_attribute = node.has_attribute
-
-function nodes.repackage_graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only
- if groupcode == "" then -- mvl only
- local h, p, done = head, nil, false
- while h do
- local id = h.id
- if id == hlist or id == vlist then
- local a = has_attribute(h,attribute)
- if a then
- if p then
- local n
- head, h, n = remove_node(head,h)
- local pl = p.list
- if n.width ~= 0 then
- n = hpack_node(n,0,'exactly') -- todo: dir
- end
- if pl then
- pl.prev = n
- n.next = pl
- end
- p.list = n
- done = true
- else
- -- can't happen
- end
- else
- p = h
- h = h.next
- end
- else
- h = h.next
- end
- end
- return head, done
- else
- return head, false
- end
-end
-
---~ function nodes.repackage_graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only
---~ if groupcode == "" then -- mvl only
---~ return head, false
---~ else
---~ return head, false
---~ end
---~ end
-
---~ tasks.appendaction("finalizers", "lists", "nodes.repackage_graphicvadjust")
+-- We will split this module so a few locals are repeated. Also this will be
+-- rewritten.
nodes.builders = nodes.builder or { }
-
local builders = nodes.builders
-local actions = tasks.actions("vboxbuilders",5)
+local actions = nodes.tasks.actions("vboxbuilders")
function nodes.builders.vpack_filter(head,groupcode,size,packtype,maxdepth,direction)
local done = false
if head then
starttiming(builders)
- if trace_callbacks then
+ if trace_vpacking then
local before = nodes.count(head)
head, done = actions(head,groupcode,size,packtype,maxdepth,direction)
local after = nodes.count(head)
if done then
- tracer("vpack","changed",head,groupcode,before,after,true)
+ nodes.processors.tracer("vpack","changed",head,groupcode,before,after,true)
else
- tracer("vpack","unchanged",head,groupcode,before,after,true)
+ nodes.processors.tracer("vpack","unchanged",head,groupcode,before,after,true)
end
stoptiming(builders)
else
@@ -1166,7 +1323,7 @@ end
-- and we operate on the mlv. Also, we need to do the
-- vspacing last as it removes items from the mvl.
-local actions = tasks.actions("mvlbuilders",1)
+local actions = nodes.tasks.actions("mvlbuilders")
function nodes.builders.buildpage_filter(groupcode)
starttiming(builders)
@@ -1177,7 +1334,7 @@ function nodes.builders.buildpage_filter(groupcode)
return (done and head) or true
end
-callbacks.register('vpack_filter', nodes.builders.vpack_filter, "vertical spacing etc")
+callbacks.register('vpack_filter', nodes.builders.vpack_filter, "vertical spacing etc")
callbacks.register('buildpage_filter', nodes.builders.buildpage_filter, "vertical spacing etc (mvl)")
statistics.register("v-node processing time", function()
diff --git a/Master/texmf-dist/tex/context/base/spac-ver.mkiv b/Master/texmf-dist/tex/context/base/spac-ver.mkiv
index 75af82df79a..d04ed672423 100644
--- a/Master/texmf-dist/tex/context/base/spac-ver.mkiv
+++ b/Master/texmf-dist/tex/context/base/spac-ver.mkiv
@@ -78,39 +78,6 @@
\fi
-% \def\presetnormallineheight
-% {\edef\normallineheight{\@@itline}%
-% %done elsewhere : \spacing\!!plusone % new per 10/08/2004, else problems in otr / !! needed
-% \iflocalinterlinespace \else
-% \doifdefined\bodyfontinterlinespecs
-% {\doifsomething\bodyfontinterlinespace
-% {\edef\normallineheight{\bodyfontinterlinespace}}}%
-% \fi}
-
-% \unexpanded\def\setupspecifiedinterlinespace[#1]%
-% {\getparameters[\??it][#1]%
-% \scratchdimen0\@@itheight\points
-% \advance\scratchdimen 0\@@itdepth\points
-% \ifdim\scratchdimen>\onepoint
-% \showmessage\m!layouts{10}{\@@itheight,\@@itdepth}%
-% \let\@@itheight\strutheightfactor
-% \let\@@itdepth \strutdepthfactor
-% \else
-% \let\strutheightfactor\@@itheight
-% \let\strutdepthfactor \@@itdepth
-% \fi
-% \let\minimumstrutheight \@@itminheight
-% \let\minimumstrutdepth \@@itmindepth
-% \let\minimumlinedistance\@@itdistance
-% \let\normallineheight \@@itline % let ! ! ! ! ! ivm ex
-% \doifelse\@@ittop\v!height % new, topskip does more bad than good
-% {\let\topskipfactor \@@itheight}
-% {\let\topskipfactor \@@ittop }%
-% \let\maxdepthfactor \@@itbottom
-% \let\baselinegluefactor \@@itstretch
-% \setfontparameters % redundant, can be \setstrut, test first
-% \updateraggedskips} % yes indeed
-
\def\presetnormallineheight
{\edef\normallineheight{\interlinespaceparameter\c!line}%
%done elsewhere : \spacing\!!plusone % new per 10/08/2004, else problems in otr / !! needed
@@ -150,16 +117,6 @@
\setfontparameters}
\setvalue{\??it::\v!auto }{\let\setrelativeinterlinespace\dosetrelativeinterlinespace}
-% \def\dosetspecifiedrelativeinterlinespace#1%
-% {\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
-% \spacing\currentrelativeinterlinespace}
-
-% \def\dosetspecifiedrelativeinterlinespace#1% fragile?
-% {\doifdimensionelse{#1}
-% {\setupspecifiedinterlinespace[\c!line=#1]}
-% {\assignvalue{#1}\currentrelativeinterlinespace{1.00}{1.25}{1.50}%
-% \spacing\currentrelativeinterlinespace}}
-
\def\dosetspecifiedrelativeinterlinespace#1% fragile?
{\doifdimenstringelse{#1}
{\setupspecifiedinterlinespace[\c!line=#1]}
@@ -183,15 +140,9 @@
\let\setrelativeinterlinespace\relax
-% \appendtoks \setrelativeinterlinespace \to \everybodyfont
-
\newtoks \everysetupglobalinterlinespace
\newtoks \everysetuplocalinterlinespace
-% \def\complexsetupinterlinespace[#1]% \commalistelement ipv #1
-% {\doifassignmentelse{#1}\setupspecifiedinterlinespace\setuprelativeinterlinespace[#1]%
-% \the\iflocalinterlinespace\everysetuplocalinterlinespace\else\everysetupglobalinterlinespace\fi}
-
\def\interlinespaceparameter #1{\csname\dointerlinespaceparameter{\??it\currentinterlinespace}#1\endcsname}
\def\dointerlinespaceparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dointerlinespaceparentparameter\csname#1\s!parent\endcsname#2\fi}
\def\dointerlinespaceparentparameter#1#2{\ifx#1\relax\s!empty\else\dointerlinespaceparameter#1#2\fi}
@@ -236,23 +187,6 @@
\the\everysetuplocalinterlinespace
\localinterlinespacefalse}
-% \def\dosetupcheckedinterlinespace#1% often a chain
-% {\edef\askedinterlinespace{#1}%
-% \ifx\askedinterlinespace\empty
-% \simplesetupinterlinespace
-% \else
-% \normalexpanded{\noexpand\doifassignmentelse{\askedinterlinespace}%
-% \noexpand\setupspecifiedinterlinespace
-% \noexpand\setuprelativeinterlinespace[\askedinterlinespace]}%
-% \iflocalinterlinespace
-% \the\everysetuplocalinterlinespace
-% \else
-% \localinterlinespacetrue
-% \the\everysetuplocalinterlinespace
-% \localinterlinespacefalse
-% \fi
-% \fi}
-
\def\dosetupcheckedinterlinespace#1% often a chain
{\edef\askedinterlinespace{#1}%
\ifx\askedinterlinespace\empty
@@ -282,29 +216,6 @@
\fi
\fi\fi}
-% \unexpanded\def\setuplocalinterlinespace[#1]%
-% {\localinterlinespacetrue
-% \let\@@saveditheight \@@itheight
-% \let\@@saveditdepth \@@itdepth
-% \let\@@saveditline \@@itline
-% \let\@@saveditminheight\@@itminheight
-% \let\@@saveditmindepth \@@itmindepth
-% \let\@@saveditdistance \@@itdistance
-% \let\@@savedittop \@@ittop
-% \let\@@saveditbottom \@@itbottom
-% \let\@@saveditstretch \@@itstretch
-% \setupinterlinespace[#1]%
-% \let\@@itheight \@@saveditheight
-% \let\@@itdepth \@@saveditdepth
-% \let\@@itline \@@saveditline
-% \let\@@itminheight\@@saveditminheight
-% \let\@@itmindepth \@@saveditmindepth
-% \let\@@itdistance \@@saveditdistance
-% \let\@@ittop \@@savedittop
-% \let\@@itbottom \@@saveditbottom
-% \let\@@itstretch \@@saveditstretch
-% \localinterlinespacefalse}
-
\unexpanded\def\setuplocalinterlinespace[#1]%
{\localinterlinespacetrue
\pushmacro\currentinterlinespace
@@ -468,6 +379,8 @@
\dosetupwhitespace
\fi}
+\newconstant\baselinegridmode % option in layout / 1=permit_half_lines
+
\def\dosetupwhitespace % quick test for no list
{\ifcsname\??ws\??ws\currentwhitespace\endcsname
\csname\??ws\??ws\currentwhitespace\endcsname
@@ -495,8 +408,6 @@
\fi
\parskip\ctxparskip}
-\chardef\baselinegridmode=0 % option in layout / 1=permit_half_lines
-
\def\dodosetupwhitespace
{\ifgridsnapping
\setfalse\flexiblewhitespace
@@ -537,46 +448,15 @@
\def\dowhitespacemethod#1%
{\ifcsname\??ws\??ws#1\endcsname\csname\??ws\??ws#1\endcsname\else\ctxparskip#1\fi\relax}
-
-% \def\nowhitespace
-% {\ifdim\parskip>\zeropoint\relax
-% \ifdim\lastskip=-\parskip
-% \else
-% \vskip-\parskip
-% \fi
-% \fi}
-%
-% \def\nowhitespaceunlessskip
-% {\ifdim\lastskip>\zeropoint \else
-% \nowhitespace
-% \fi}
-%
-% \def\whitespace
-% {\par
-% \ifdim\parskip>\zeropoint\relax
-% %\ifdim\lastskip>\parskip \else
-% % \removelastskip interferes with blanko blokkeer en klein
-% \vskip\parskip
-% %\fi
-% \fi}
\def\nowhitespace{\vspacing[\v!nowhite]}
\def\whitespace {\vspacing[\v!white]}
-% obsolete:
-%
-% \def\savedcurrentwhitespace{\currentwhitespace}
-% \def\savecurrentwhitespace {\edef\savedcurrentwhitespace{\currentwhitespace}}
-% \def\restorecurrentwhitespace{\edef\currentwhitespace{\savedcurrentwhitespace}}
-
% De onderstaande macro handelt ook de situatie dat er geen
% tekst tussen \start ... \stop is geplaatst. Daartoe wordt de
% laatste skip over de lege tekst heen gehaald. Dit komt goed
% van pas bij het plaatsen van (mogelijk lege) lijsten.
-\newsignal \noparskipsignal % \def\noparskipsignal {0.00001pt}
-\def\lastdoneparskip {0pt}
-
\newconditional\noblankinpacked
\newcount\packeddepth
@@ -970,7 +850,7 @@
% experiment
-\newbox\emptystrutbox \setbox\emptystrutbox\hbox{}
+\newbox\emptystrutbox \setbox\emptystrutbox\emptyhbox
\def\dosetstruthide
{\setbox\strutbox\copy\emptystrutbox
@@ -979,7 +859,6 @@
\def\strut{\relax\dontleavehmode\copy\strutbox} % still callbacks for \hbox{\strut}
-
\let\normalstrut\strut
%D Sometimes a capstrut comes in handy
@@ -992,20 +871,24 @@
%D \NC \NC a normal strut \NC {\showstruts\setupstrut\strut} \NC \NR
%D \stoptabulate
+\setvalue{@strut@\v!yes }{\setstrut}
+\setvalue{@strut@\v!auto }{\setautostrut}
+\setvalue{@strut@\v!no }{\setnostrut}
+\setvalue{@strut@\v!cap }{\setcapstrut}
+\setvalue{@strut@\v!fit }{\setfontstrut}
+\setvalue{@strut@\v!line }{\setstrut}
+\setvalue{@strut@\s!default}{\setstrut}
+\setvalue{@strut@\s!empty }{\setstrut}
+
\unexpanded\def\setupstrut
{\dosingleempty\dosetupstrut}
\def\dosetupstrut[#1]% yet undocumented, todo: fontstrut
- {\processaction
- [#1]
- [ \v!yes=>\setstrut,
- \v!auto=>\setautostrut,
- \v!no=>\setnostrut,
- \v!cap=>\setcapstrut,
- \v!fit=>\setfontstrut,
- \v!line=>\setstrut,
- \s!default=>\setstrut,
- \s!unknown=>\setcharstrut\commalistelement]}
+ {\ifcsname @strut@#1\endcsname
+ \csname @strut@#1\endcsname
+ \else
+ \setcharstrut{#1}%
+ \fi}
\def\showstruts
{\setteststrut
@@ -1067,7 +950,7 @@
\fi
\fi\fi}
-\newbox\nostrutbox \setbox\nostrutbox\normalhbox{} % {\normalhbox{}}
+\newbox\nostrutbox \setbox\nostrutbox\emptyhbox
\def\setnostrut
{\setbox\strutbox\copy\nostrutbox
@@ -1117,13 +1000,6 @@
%D why|>| this assignment gives troubles in for instance the
%D visual debugger.
-%D The plain ones:
-
-% \def\offinterlineskip
-% {\baselineskip-\thousandpoint
-% \lineskip\zeropoint
-% \lineskiplimit\maxdimen}
-
\def\offinterlineskip
{\baselineskip-\thousandpoint
\lineskip\zeropoint
@@ -1281,7 +1157,7 @@
%D Page spacing
-\chardef\bottomraggedness=0 % 0=ragged 1=normal/align 2=baseline
+\newconstant\bottomraggednessmode % 0=ragged 1=normal/align 2=baseline
\def\bottomalignlimit{3\lineheight}
@@ -1294,21 +1170,21 @@
\r@ggedbottomfalse}
\def\raggedbottom
- {\chardef\bottomraggedness\zerocount
+ {\bottomraggednessmode\zerocount
\n@rmalbottomfalse
\r@ggedbottomtrue
\b@selinebottomfalse
\settopskip}
\def\alignbottom
- {\chardef\bottomraggedness\plusone
+ {\bottomraggednessmode\plusone
\n@rmalbottomtrue
\r@ggedbottomfalse
\b@selinebottomfalse
\settopskip}
\def\baselinebottom
- {\chardef\bottomraggedness\plustwo
+ {\bottomraggednessmode\plustwo
\n@rmalbottomfalse
\r@ggedbottomfalse
\b@selinebottomtrue
@@ -1318,27 +1194,26 @@
% so, the new one will be
%
-% \chardef\bottomraggedness=0 % 0=ragged 1=normal/align 2=baseline
+% \bottomraggednessmode=0 % 0=ragged 1=normal/align 2=baseline
%
% \def\bottomalignlimit{3\lineheight} % will be settable
%
-% \def\raggedbottom {\chardef\bottomraggedness=0 \settopskip}
-% \def\alignbottom {\chardef\bottomraggedness=1 \settopskip}
-% \def\baselinebottom{\chardef\bottomraggedness=2 \settopskip}
+% \def\raggedbottom {\bottomraggednessmode\zerocount\settopskip}
+% \def\alignbottom {\bottomraggednessmode\plusone \settopskip}
+% \def\baselinebottom{\bottomraggednessmode\plustwo \settopskip}
%
% \let\normalbottom =\alignbottom
%D Good old blank redone:
-\definesystemattribute[kern-chars]
-\definesystemattribute[skip-category] \chardef\skipcategoryattribute \dogetattributeid{skip-category}
-\definesystemattribute[skip-penalty] \chardef\skippenaltyattribute \dogetattributeid{skip-penalty}
-\definesystemattribute[skip-order] \chardef\skiporderattribute \dogetattributeid{skip-order}
-\definesystemattribute[display-math] \chardef\displaymathattribute \dogetattributeid{display-math}
-\definesystemattribute[snap-method] \chardef\snapmethodattribute \dogetattributeid{snap-method}
-\definesystemattribute[snap-done] \chardef\snapdoneattribute \dogetattributeid{snap-done}
-
-%definesystemattribute[snap-category] \chardef\snapcategoryattribute \dogetattributeid{snap-category}
+%definesystemattribute[kernchars] [public]
+\definesystemattribute[skipcategory] [public]
+\definesystemattribute[skippenalty] [public]
+\definesystemattribute[skiporder] [public]
+\definesystemattribute[displaymath] [public]
+\definesystemattribute[snapmethod] [public]
+\definesystemattribute[snapvbox] [public]
+%definesystemattribute[snapcategory] [public]
% TODO: NAMED SNAPPERS
@@ -1350,14 +1225,20 @@
\newdimen \globalbodyfontstrutheight
\newdimen \globalbodyfontstrutdepth
-% \appendtoks
-% \dosetupgridsnapping
-% \to \everysetupbodyfont
+\def\snappedvboxattribute{\ifgridsnapping attr \snapvboxattribute \attribute\snapmethodattribute\fi}
+\def\setlocalgridsnapping{\ifgridsnapping \attribute \snapvboxattribute \attribute\snapmethodattribute\fi}
+
+\def\dosetlocalgridsnapping#1%
+ {\ifgridsnapping
+ \doifsomething{#1}%
+ {\autosetsnapvalue{#1}%
+ \attribute \snapvboxattribute \attribute\snapmethodattribute}%
+ \fi}
\def\installsnapvalues#1#2% todo: a proper define
{\edef\currentsnapper{#1:#2}%
\ifcsname\currentsnapper\endcsname \else
- \setevalue\currentsnapper{\ctxlua{vspacing.define_snap_method("#1","#2")}}%
+ \setevalue\currentsnapper{\ctxlua{builders.vspacing.definesnapmethod("#1","#2")}}%
\fi
\setevalue{\??gr:#1}{\attribute\snapmethodattribute\csname\currentsnapper\endcsname\space}}
@@ -1440,11 +1321,6 @@
\global\globalbodyfontstrutheight\strutheight
\global\globalbodyfontstrutdepth \strutdepth}
-% \appendtoks
-% \synchronizegloballinespecs
-% \synchronizelocallinespecs
-% \to \everysetupgridsnapping
-
\appendtoks
\synchronizegloballinespecs
\synchronizelocallinespecs
@@ -1454,10 +1330,6 @@
\synchronizelocallinespecs
\to \everysetuplocalinterlinespace
-% \appendtoks
-% \resetsnapvalues
-% \to \everyforgetall
-
%D Snapping.
\newif\ifgridsnapping
@@ -1472,7 +1344,7 @@
{} % gone, unless we set an attribute
\def\doplaceongrid[#1]%
- {\snaptogrid[#1]\vbox}
+ {\snaptogrid[#1]\vbox} % mark as done
\def\dosnaptogrid[#1]% list or predefined
{\ifgridsnapping
@@ -1489,32 +1361,35 @@
% eventually there will always be a line snap
\def\dododosnaptogrid#1%
- {\ifvbox\nextbox
- \ctxlua{nodes.collapse_vbox(\number\nextbox)}%
+ {\ifvbox\nextbox % this will go away
+ \ctxlua{builders.vspacing.collapsevbox(\number\nextbox)}% isn't that already done?
\fi
\doifelsenothing{#1}{\setsnapvalue\v!normal}{\autosetsnapvalue{#1}}%
- \ctxlua{vspacing.snap_box(\number\nextbox,\number\attribute\snapmethodattribute)}%
-% \ifzeropt\ht\nextbox
-% \ifzeropt\dp\nextbox
-% \box\nextbox % here, else empty and zero
-% \kern-\bodyfontlineheight
-% \else
-% \box\nextbox
-% \fi
-% \else
- \box\nextbox
-% \fi
+ \ctxlua{builders.vspacing.snapbox(\number\nextbox,\number\attribute\snapmethodattribute)}%
+ \ifvbox\nextbox\vbox\else\hbox\fi attr \snapmethodattribute \zerocount {\box\nextbox}%
\egroup}
+\def\docheckgridsnappingnop
+ {\gridsnappingfalse
+ \resetsystemmode\v!grid
+ \resetsnapvalue}
+
+\def\docheckgridsnappinyes
+ {\gridsnappingtrue
+ \setsystemmode\v!grid
+ \autosetsnapvalue\askedgridmode}
+
\def\docheckgridsnapping
- {\edef\askedgridmode{\layoutparameter\c!grid}% needs checking by WS
- \doifelse\askedgridmode\v!no
- {\gridsnappingfalse
- \resetsystemmode\v!grid
- \resetsnapvalue}
- {\gridsnappingtrue
- \setsystemmode\v!grid
- \autosetsnapvalue\askedgridmode}}
+ {\edef\askedgridmode{\layoutparameter\c!grid}%
+ \ifx\askedgridmode\v!no % official
+ \docheckgridsnappingnop
+ \else\ifx\askedgridmode\v!off % for taco and luigi
+ \docheckgridsnappingnop
+ \else\ifx\askedgridmode\empty % to be sure
+ \docheckgridsnappingnop
+ \else
+ \docheckgridsnappingyes
+ \fi\fi\fi}
%D Visualization:
@@ -1534,8 +1409,8 @@
\hss}%
\flushnextbox}}}
-\chardef\gridboxlinenomode\plusone % 0:nothing 1:all 2:lines 3:frame 4:l/r
-\chardef\gridboxlinemode \plusone
+\setnewconstant\gridboxlinenomode\plusone % 0:nothing 1:all 2:lines 3:frame 4:l/r
+\setnewconstant\gridboxlinemode \plusone
\def\gridboxvbox {\ifcase\gridboxlinemode\vbox\or\ruledvbox\or\vbox\or\ruledvbox\else\ruledvbox\fi}
\def\gridboxwidth{\ifcase\gridboxlinemode0\or.5\or.5\or0\else.5\fi\testrulewidth}
@@ -1548,14 +1423,10 @@
\hsize#2%
\baselinerulefalse
\ifnum\gridboxlinenomode=\plusthree
- \chardef\gridboxlinenomode\ifodd\realpageno\plusone\else\plustwo\fi
+ \gridboxlinenomode\ifodd\realpageno\plusone\else\plustwo\fi
\fi
\gridboxvbox % calculated size
{\getrawnoflines{#3}% \getnoflines{#3}%
-% \ifgridsnapping \else
-% \vskip\topskip
-% \vskip-\strutht
-% \fi
\scratchdimen#2\advance\scratchdimen \lineheight
\dorecurse\noflines
{\strut
@@ -1581,10 +1452,6 @@
\def\fuzzysnappedbox#1#2% \box<n> \unvbox<n>
{#1#2}
-% \def\moveboxontogrid#1#2#3% will become obsolete
-% {\doif{#2}\v!top {\setbox#1\hbox{\snaptogrid[\v!first]\box#1}}%
-% \doif{#2}\v!bottom{\setbox#1\hbox{\snaptogrid[\v!last ]\box#1}}}
-
\def\moveboxontogrid#1#2#3% will become obsolete
{}
@@ -1607,19 +1474,6 @@
% \start \dosetstretch{.25em} \setuptolerance[tolerant,stretch] \input tufte \endgraf \stop
% \start \dosetstretch{.5em} effe flink doorfietsen \stop
-% \def\dosetupgridsnapping % calls too often, only needed in gridsnapping
-% {\ctxlua{nodes.setsnapvalue(1,\number\openstrutheight,\number\openstrutdepth)}}
-%
-% \def\doenablegridsnapping
-% {\attribute\snapcategoryattribute\plusone
-% \topskip\strutht
-% \offinterlineskip}
-%
-% \def\dodisablegridsnapping
-% {\attribute\snapcategoryattribute\attributeunsetvalue
-% % reset topskip
-% \oninterlineskip}
-
% experimental code, not yet interfaced:
% category:
@@ -1638,7 +1492,7 @@
%
% \defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi}
-% todo, in grid mode: vspacing.fixed = false
+% todo, in grid mode: builders.vspacing.fixed = false
\let\saveouterspacing \relax % for old times sake
\let\restoreouterspacing\relax % for old times sake
@@ -1738,12 +1592,9 @@
\unexpanded\def\definevspacingamount
{\dotripleempty\dodefinevspacingamount}
-% \def\dodefinevspacingamount[#1][#2][#3]%
-% {\ctxlua{vspacing.setskip("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}}
-
\def\dodefinevspacingamount[#1][#2][#3]% can be combined
{\setvalue{\??vs:#1}{\ifgridsnapping#3\else#2\fi}%
- \ctxlua{vspacing.setskip("#1")}}
+ \ctxlua{builders.vspacing.setskip("#1")}}
\def\addpredefinedblankskip#1#2%
{\settrue\someblankdone
@@ -1757,7 +1608,7 @@
{\dodoubleempty\dodefinevspacing}
\def\dodefinevspacing[#1][#2]%
- {\ctxlua{vspacing.setmap("#1","#2")}}
+ {\ctxlua{builders.vspacing.setmap("#1","#2")}}
\unexpanded\def\vspacing
{\dosingleempty\dovspacing}
@@ -1774,7 +1625,8 @@
\fi\fi}
\def\dovspacingyes[#1]%
- {\ifmmode\else\ctxlua{vspacing.analyse("\iffirstargument#1\else\s!default\fi")}\fi}
+ %{\ifmmode\else\ctxlua{builders.vspacing.analyze("\iffirstargument#1\else\s!default\fi")}\fi}
+ {\ifmmode\else\ctxlua{builders.vspacing.analyze("\iffirstargument#1\else\currentvspacing\fi")}\fi}
\def\dovspacingnop[#1]%
{\ifmmode\else\par\fi}
@@ -1783,7 +1635,7 @@
\definecomplexorsimple\setupvspacing
-\let\currentvspacing\empty
+\let\currentvspacing\s!default
\def\complexsetupvspacing[#1]%
{\edef\currentvspacing{#1}}
@@ -1799,7 +1651,7 @@
% used both
-\def\doinhibitblank{\vspacing[\v!disable]} % can be made faster
+\def\doinhibitblank{\vspacing[\v!disable]} % can be made faster (keep this command, used in styles)
\def\inhibitblank {\vspacing[\v!disable]} % can be made faster
\let\setupblank \setupvspacing
@@ -1808,16 +1660,6 @@
% category:4 is default
-% \definevspacingamount[\v!big] [\bigskipamount] [\openlineheight]
-% \definevspacingamount[\v!medium] [\medskipamount] [0.50\openlineheight]
-% \definevspacingamount[\v!small] [\smallskipamount] [0.25\openlineheight]
-% \definevspacingamount[\v!line] [\openlineheight] [\openlineheight]
-% \definevspacingamount[\v!halfline][0.50\openlineheight][0.50\openlineheight]
-% \definevspacingamount[\v!formula] [\medskipamount] [0.50\openlineheight]
-% \definevspacingamount[\v!white] [\parskip] [\openlineheight]
-% \definevspacingamount[\v!height] [\strutheight] [\strutheight]
-% \definevspacingamount[\v!depth] [\strutdepth] [\strutdepth]
-
\definevspacingamount[\v!none] [\zeropoint] [\zeropoint]
\definevspacingamount[\v!big] [\bigskipamount] [\bodyfontlineheight]
\definevspacingamount[\v!medium] [\medskipamount] [0.50\bodyfontlineheight]
@@ -1851,31 +1693,11 @@
\definevspacing[\v!weak] [order:0]
\definevspacing[\v!strong] [order:100]
-\definevspacing[\s!default] [\v!white] % was big for a while
+\definevspacing[\s!default] [\v!white] % was big for a while
\dorecurse{10} % todo: other values < 4000
{\expanded{\definevspacing[\v!samepage-\recurselevel][penalty:\the\numexpr4000+250*\recurselevel\relax]}}
-% \setfalse\vspacingenabled
-%
-% \newtoks\everyenablevspacing
-% \newtoks\everydisablevspacing
-%
-% \def\enablevspacing {\the\everyenablevspacing}
-% \def\disablevspacing{\the\everydisablevspacing}
-%
-% \appendtoks
-% \writestatus\m!systems{! ! enabling vspacing ! !}%
-% \settrue\vspacingenabled
-% \ctxlua{vspacing.enable()}%
-% \to \everyenablevspacing
-%
-% \appendtoks
-% \writestatus\m!systems{! ! disabling vspacing ! !}%
-% \setfalse\vspacingenabled
-% \ctxlua{vspacing.disable()}%
-% \to \everydisablevspacing
-
\let\blank \vspacing
\let\defineblank \definevspacing
\let\defineblankmethod\definevspacingamount
@@ -1944,48 +1766,6 @@
%D \stoplines
%D \stoptyping
-% \unexpanded\def\setuplines
-% {\dodoubleargument\getparameters[\??rg]}
-%
-% \unexpanded\def\startlines
-% {\@@rgbefore
-% \pushmacro\checkindentation
-% \whitespace
-% %\page[\v!preference]} gaat mis na koppen, nieuw: later \nobreak
-% \begingroup
-% \setupindenting[\@@rgindenting]%
-% \typesettinglinestrue
-% \setupwhitespace[\v!none]%
-% \obeylines
-% \ignorespaces
-% \gdef\afterfirstobeyedline % tzt two pass, net als opsomming
-% {\gdef\afterfirstobeyedline
-% {\nobreak
-% \doifnot\@@rgoption\v!packed{\global\let\afterfirstobeyedline\relax}}}%
-% \def\obeyedline
-% {\par
-% \futurelet\next\dobetweenthelines}%
-% \activatespacehandler\@@rgspace
-% \GotoPar}
-%
-% \unexpanded\def\stoplines
-% {\endgroup
-% \popmacro\checkindentation
-% \@@rgafter}
-%
-% \def\dobetweenthelines
-% {\doifmeaningelse\next\obeyedline
-% {\@@rginbetween}
-% {\afterfirstobeyedline}}
-%
-% \setuplines
-% [\c!option=,
-% \c!before=\blank,
-% \c!after=\blank,
-% \c!inbetween=\blank,
-% \c!indenting=\v!no,
-% \c!space=\v!default]
-
%D Contrary to \MKII\ we can now define classes of lines (generalized by
%D Wolfgang). I will probably rewrite bits in \LUA.
@@ -2009,6 +1789,7 @@
\getparameters
[\??rg]
[\c!option=,
+ \c!command=,
\c!before=\blank,
\c!after=\blank,
\c!inbetween=\blank,
@@ -2035,6 +1816,14 @@
\def\dostartlines[#1]%
{\bgroup
\edef\currentlines{#1}%
+ \obeylines
+ \dosingleempty\dodostartlines}
+
+\def\dodostartlines[#1]% new: optional second argument (WS)
+ {\iffirstargument
+ \getparameters[\??rg\currentlines][#1]%
+ \fi
+ \edef\linesoption{\linesparameter\c!option}%
\linesparameter\c!before
\pushmacro\checkindentation
\whitespace
@@ -2044,12 +1833,13 @@
\setupalign[\linesparameter\c!align]%
\typesettinglinestrue
\setupwhitespace[\v!none]%
- \obeylines
+ %\obeylines % move upwards to keep spaces in the first line due to optional argument
\ignorespaces
\gdef\afterfirstobeyedline % tzt two pass, net als opsomming
- {\gdef\afterfirstobeyedline
- {\nobreak
- \doifnot{\linesparameter\c!option}\v!packed{\global\let\afterfirstobeyedline\relax}}}%
+ {\linesparameter\c!command
+ \gdef\afterfirstobeyedline
+ {\ifx\linesoption\v!packed\nobreak\fi
+ \linesparameter\c!command}}%
\def\obeyedline
{\par
\futurelet\next\dobetweenthelines}%
diff --git a/Master/texmf-dist/tex/context/base/spec-dpm.mkii b/Master/texmf-dist/tex/context/base/spec-dpm.mkii
index efecd792806..ddbb6caf811 100644
--- a/Master/texmf-dist/tex/context/base/spec-dpm.mkii
+++ b/Master/texmf-dist/tex/context/base/spec-dpm.mkii
@@ -11,8 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\unprotect
-
%D This driver is build on top of the general \PDF\ macros,
%D as defined in \type{spec-fdf}, so we inherit that one. Remark:
%D this driver is no longer actively maintained, use the dpx one
@@ -443,4 +441,4 @@
\stopspecials
-\protect \endinput
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/spec-dpx.mkii b/Master/texmf-dist/tex/context/base/spec-dpx.mkii
index c521da8c72c..323152e0b3c 100644
--- a/Master/texmf-dist/tex/context/base/spec-dpx.mkii
+++ b/Master/texmf-dist/tex/context/base/spec-dpx.mkii
@@ -20,8 +20,6 @@
%C
%C http://project.ktug.or.kr/dvipdfmx/
-\unprotect
-
%D This driver is built on top of the general \PDF\ macros,
%D as defined in \type{spec-fdf}, so we inherit that one.
@@ -791,4 +789,4 @@
\stopspecials
-\protect \endinput
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/spec-dvi.mkii b/Master/texmf-dist/tex/context/base/spec-dvi.mkii
index 1a8f653f050..52289085191 100644
--- a/Master/texmf-dist/tex/context/base/spec-dvi.mkii
+++ b/Master/texmf-dist/tex/context/base/spec-dvi.mkii
@@ -11,8 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\unprotect
-
%D \macros
%D {dostartobject,
%D dostopobject,
@@ -115,4 +113,4 @@
\stopspecials
-\protect \endinput
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/spec-mis.mkii b/Master/texmf-dist/tex/context/base/spec-mis.mkii
index 3d263eaceae..d56eca27e4a 100644
--- a/Master/texmf-dist/tex/context/base/spec-mis.mkii
+++ b/Master/texmf-dist/tex/context/base/spec-mis.mkii
@@ -196,8 +196,10 @@
%D
%D \METAPOST\ support.
+\ifx\makeMPintoPDFobject\undefined \newcount\makeMPintoPDFobject \fi
+
\appendtoks
- \chardef\makeMPintoPDFobject\zerocount
+ \makeMPintoPDFobject\zerocount
\def\setMPPDFobject#1#2{\def\getMPPDFobject{\box#2}}%
\to \everyresetspecials
diff --git a/Master/texmf-dist/tex/context/base/spec-pdf.mkii b/Master/texmf-dist/tex/context/base/spec-pdf.mkii
index 2191eaeae3a..222c4e3a6c6 100644
--- a/Master/texmf-dist/tex/context/base/spec-pdf.mkii
+++ b/Master/texmf-dist/tex/context/base/spec-pdf.mkii
@@ -13,8 +13,6 @@
% funny things: mail to yeny: "please geen auto-crlf in special"
-\unprotect
-
%D This driver is build on top of the general \PDF\ macros,
%D as defined in \type{spec-fdf}, so we inherit that one.
@@ -481,4 +479,4 @@
\stopspecials
-\protect \endinput
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/spec-tst.mkii b/Master/texmf-dist/tex/context/base/spec-tst.mkii
index 543baa647b3..628a0dbbf77 100644
--- a/Master/texmf-dist/tex/context/base/spec-tst.mkii
+++ b/Master/texmf-dist/tex/context/base/spec-tst.mkii
@@ -11,12 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\unprotect
-
%D The code is now merged into spec-*.mkii
-\protect
-
\doifnotmode{demo}{\endinput}
\mainlanguage[vn]
diff --git a/Master/texmf-dist/tex/context/base/spec-win.mkii b/Master/texmf-dist/tex/context/base/spec-win.mkii
index 73db8830e9c..55ceec691df 100644
--- a/Master/texmf-dist/tex/context/base/spec-win.mkii
+++ b/Master/texmf-dist/tex/context/base/spec-win.mkii
@@ -11,8 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\unprotect
-
%D Remark: chained references are not yet implemented.
%D \macros
@@ -96,4 +94,4 @@
\stopspecials
-\protect \endinput
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/spec-xtx.mkii b/Master/texmf-dist/tex/context/base/spec-xtx.mkii
index 799c6ca8d31..81b83e66318 100644
--- a/Master/texmf-dist/tex/context/base/spec-xtx.mkii
+++ b/Master/texmf-dist/tex/context/base/spec-xtx.mkii
@@ -7,8 +7,6 @@
%D date=\currentdate,
%D copyright={Adam Lindsay \& Hans Hagen}]
-\unprotect
-
\startspecials[xetex][reset,dpx]
%D Actually, there's an intermediate ``\type{xdv}''
@@ -84,4 +82,4 @@
\stopspecials
-\protect \endinput
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/status-files.pdf b/Master/texmf-dist/tex/context/base/status-files.pdf
new file mode 100644
index 00000000000..fb377d90e58
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/status-files.pdf
Binary files differ
diff --git a/Master/texmf-dist/tex/context/base/status-lua.pdf b/Master/texmf-dist/tex/context/base/status-lua.pdf
new file mode 100644
index 00000000000..ac8fc6ac377
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/status-lua.pdf
Binary files differ
diff --git a/Master/texmf-dist/tex/context/base/strc-bkm.lua b/Master/texmf-dist/tex/context/base/strc-bkm.lua
index f34d83ec557..6a2cc382775 100644
--- a/Master/texmf-dist/tex/context/base/strc-bkm.lua
+++ b/Master/texmf-dist/tex/context/base/strc-bkm.lua
@@ -9,25 +9,56 @@ if not modules then modules = { } end modules ['strc-bkm'] = {
-- Future version will support adding arbitrary bookmarks with
-- associated complex actions (rather trivial to implement).
+-- this should become proper separated backend code
+
+-- we should hook the placement into everystoptext ... needs checking
+
local format, concat, gsub = string.format, table.concat, string.gsub
-local texsprint, utfvalues = tex.sprint, string.utfvalues
+local utfvalues = string.utfvalues
+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 ctxcatcodes = tex.ctxcatcodes
+local report_bookmarks = logs.reporter("structure","bookmarks")
-local lists = structure.lists
-local levelmap = structure.sections.levelmap
+local structures = structures
-structure.bookmarks = structure.bookmarks or { }
+structures.bookmarks = structures.bookmarks or { }
-local bookmarks = structure.bookmarks
+local bookmarks = structures.bookmarks
+local sections = structures.sections
+local lists = structures.lists
+
+local levelmap = sections.levelmap
+local variables = interfaces.variables
bookmarks.method = "internal" -- or "page"
-local names, opened = "", ""
+local names, opened, forced, numbered = { }, { }, { }, { }
-function bookmarks.register(n,o)
- if names == "" then names = n else names = names .. "," .. n end
- if opened == "" then opened = o else opened = opened .. "," .. o end
+function bookmarks.register(settings)
+ local force = settings.force == variables.yes
+ local number = settings.number == variables.yes
+ local allopen = settings.opened == variables.all
+ for k, v in next, settings_to_hash(settings.names or "") do
+ names[k] = true
+ if force then
+ forced[k] = true
+ if allopen then
+ opened[k] = true
+ end
+ end
+ if number then
+ numbered[k] = true
+ end
+ end
+ if not allopen then
+ for k, v in next, settings_to_hash(settings.opened or "") do
+ opened[k] = true
+ end
+ end
end
function bookmarks.overload(name,text)
@@ -61,23 +92,32 @@ end
-- todo: collect specs and collect later i.e. multiple places
+local numberspec = { }
+
+function bookmarks.setup(spec)
+ -- table.merge(numberspec,spec)
+ for k, v in next, spec do
+ numberspec[k] = v
+ end
+end
+
function bookmarks.place()
- if names ~= "" then
- local list = lists.filter(names,"all",nil,lists.collected)
- local lastlevel = 1
+ if next(names) then
+ local list = lists.filtercollected(names,"all",nil,lists.collected,forced)
if #list > 0 then
- local opened, levels = aux.settings_to_set(opened), { }
+ 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 then -- and levelmap[name] then
+ 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 "?")
@@ -85,47 +125,66 @@ function bookmarks.place()
title = titledata.title or "?"
end
end
- levels[#levels+1] = {
+ 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),
+ stripped(title), -- can be replaced by converter
li.references, -- has internal and realpage
allopen or opened[name]
}
end
end
end
- backends.codeinjections.addbookmarks(levels,bookmarks.method)
+ bookmarks.finalize(levels)
end
function bookmarks.place() end -- prevent second run
end
end
-lpdf.registerdocumentfinalizer(function() structure.bookmarks.place() end,1)
-
--- bkm
---~ function nodes.toutf(list)
---~ local t= { }
---~ for n in node.traverse(list) do
---~ local id = n.id
---~ if id == node.id("glyph") then
---~ local c = n.char
---~ local f = fonts.ids[n.font]
---~ if f then
---~ local u = f.characters[c].tounicode
---~ if u then
---~ for s in string.gmatch(u,"..") do
---~ t[#t+1] = utf.char(tonumber(s,16))
---~ end
---~ else
---~ t[#t+1] = utf.char(c)
---~ end
---~ else
---~ t[#t+1] = utf.char(c)
---~ end
---~ elseif id == node.id("glue") then
---~ t[#t+1] = " "
---~ end
---~ end
---~ return table.concat(t,"")
---~ end
---~ print(nodes.toutf(tex.box[999].list))
+function bookmarks.flatten(levels)
+ -- 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
+ for i=2,noflevels do
+ local li = levels[i]
+ local new, newblock = li[1], li[3].block
+ if newblock ~= block then
+ first, block, start, skip = new, newblock, i, 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
+ if trace_bookmarks then
+ report_bookmarks("promoting entry %s from level %s to %s: %s",j,old,new,lj[2])
+ end
+ end
+ skip = true
+ end
+ end
+ end
+end
+
+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)
+end
diff --git a/Master/texmf-dist/tex/context/base/strc-bkm.mkiv b/Master/texmf-dist/tex/context/base/strc-bkm.mkiv
index 77854738d2f..b7a5bc805eb 100644
--- a/Master/texmf-dist/tex/context/base/strc-bkm.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-bkm.mkiv
@@ -50,25 +50,67 @@
\def\dobookmark[#1]#2%
{\begingroup
\simplifycommands
- \ctxlua{structure.bookmarks.overload("#1",\!!bs\detokenize\expandafter{\normalexpanded{#2}}\!!es)}%
+ \ctxlua{structures.bookmarks.overload("#1",\!!bs\detokenize\expandafter{\normalexpanded{#2}}\!!es)}%
\endgroup}
%D Placement \unknown\ look how simple compared to \MKII:
+\newtoks \everysetupbookmarks
+
+\def\bookmarkparameter#1{\ifcsname\??bm#1\endcsname\csname\??bm#1\endcsname\fi}
+
+\unexpanded\def\setupbookmarks[#1]%
+ {\getparameters[\??bm][#1]%
+ \the\everysetupbookmarks}
+
\unexpanded\def\placebookmarks
- {\dodoubleempty\doplacebookmarks}
+ {\dotripleempty\doplacebookmarks}
-\def\doplacebookmarks[#1][#2]%
+% Use force to get titles in the bookmarklist. This is somewhat tricky as one
+% does not want "Contents" in a table of contents but it has to be in the
+% bookmark list.
+
+\def\doplacebookmarks[#1][#2][#3]%
{\iflocation
- \iffirstargument
- \ctxlua{structure.bookmarks.register("#1","#2")}%
- \else
- \normalexpanded{\noexpand\placebookmarks[\getvalue{\??ih\v!content\c!list}]}%
+ \begingroup
+ \edef\askednames{#1}%
+ \edef\askedopened{#2}%
+ \ifx\askednames\empty
+ \edef\askednames{\getvalue{\??ih\v!content\c!list}}%
+ \fi
+ \ifx\askednames\empty
+ \let\askednames\v!all
\fi
+ \ifthirdargument
+ \getparameters[\??bm][#3]%
+ \else\ifsecondargument
+ \doifassignmentelse{#2}{\let\askedopened\empty\getparameters[\??bm][#2]}\donothing
+ \fi\fi
+ \ctxlua{structures.bookmarks.register {
+ names = "\askednames",
+ opened = "\askedopened",
+ force = "\bookmarkparameter\c!force",
+ number = "\bookmarkparameter\c!number",
+ }}%
+ \endgroup
\fi}
-% \prependtoks\ctxlua{structure.bookmarks.place()}\to\everystoptext % too late
-% \prependtoks\ctxlua{structure.bookmarks.place()}\to\everylastbackendshipout % okay but not nice
+\setupbookmarks
+ [\c!force=\v!no, % it's easier to force that to inhibit
+ \c!number=\v!yes] % might become v!no
+
+\appendtoks
+ \ctxlua{structures.bookmarks.setup {
+ separatorset = "\bookmarkparameter\c!numberseparatorset",
+ conversionset = "\bookmarkparameter\c!numberconversionset",
+ starter = \!!bs\bookmarkparameter\c!numberstarter\!!es,
+ stopper = \!!bs\bookmarkparameter\c!numberstopper\!!es,
+ segments = "\bookmarkparameter\c!numbersegments",
+ }}%
+\to \everysetupbookmarks
+
+% \prependtoks\ctxlua{structures.bookmarks.place()}\to\everystoptext % too late
+% \prependtoks\ctxlua{structures.bookmarks.place()}\to\everylastbackendshipout % okay but not nice
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/strc-blk.lua b/Master/texmf-dist/tex/context/base/strc-blk.lua
index 2589190eb5c..cbdc8c6ea36 100644
--- a/Master/texmf-dist/tex/context/base/strc-blk.lua
+++ b/Master/texmf-dist/tex/context/base/strc-blk.lua
@@ -1,4 +1,4 @@
-if not modules then modules = { } end modules ['strc--blk'] = {
+if not modules then modules = { } end modules ['strc-blk'] = {
version = 1.001,
comment = "companion to strc-blk.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -8,47 +8,49 @@ if not modules then modules = { } end modules ['strc--blk'] = {
-- this one runs on top of buffers and structure
-local texprint, format, gmatch, find = tex.print, string.format, string.gmatch, string.find
+local type = type
+local gmatch, find = string.gmatch, string.find
local lpegmatch = lpeg.match
+local settings_to_set, settings_to_array = utilities.parsers.settings_to_set, utilities.parsers.settings_to_array
+local allocate, mark = utilities.storage.allocate, utilities.storage.mark
-local ctxcatcodes = tex.ctxcatcodes
+local structures, context = structures, context
-structure = structure or { }
-structure.blocks = structure.blocks or { }
+structures.blocks = structures.blocks or { }
-local blocks = structure.blocks
+local blocks = structures.blocks
+local sections = structures.sections
+local lists = structures.lists
-blocks.collected = blocks.collected or { }
-blocks.tobesaved = blocks.tobesaved or { }
-blocks.states = blocks.states or { }
+local collected = allocate()
+local tobesaved = allocate()
+local states = allocate()
-local tobesaved, collected, states = blocks.tobesaved, blocks.collected, blocks.states
+blocks.collected = collected
+blocks.tobesaved = tobesaved
+blocks.states = states
local function initializer()
- collected, tobesaved = blocks.collected, blocks.tobesaved
+ collected = blocks.collected
+ tobesaved = blocks.tobesaved
end
-job.register('structure.blocks.collected', structure.blocks.tobesaved, initializer)
+job.register('structures.blocks.collected', tobesaved, initializer)
-local printer = (lpeg.patterns.textline/texprint)^0 -- can be shared
+local printer = (lpeg.patterns.textline/tex.print)^0 -- can be shared
+local listitem = utilities.parsers.listitem
function blocks.print(name,data,hide)
if hide then
- texprint(ctxcatcodes,format("\\dostarthiddenblock{%s}",name))
+ context.dostarthiddenblock(name)
else
- texprint(ctxcatcodes,format("\\dostartnormalblock{%s}",name))
- end
- if type(data) == "table" then
- for i=1,#data do
- texprint(data[i])
- end
- else
- lpegmatch(printer,data)
+ context.dostartnormalblock(name)
end
+ context.viafile(data)
if hide then
- texprint(ctxcatcodes,"\\dostophiddenblock")
+ context.dostophiddenblock()
else
- texprint(ctxcatcodes,"\\dostopnormalblock")
+ context.dostopnormalblock()
end
end
@@ -58,8 +60,8 @@ end
function blocks.setstate(state,name,tag)
local all = tag == ""
- local tags = not all and aux.settings_to_array(tag)
- for n in gmatch(name,"%s*([^,]+)") do
+ local tags = not all and settings_to_array(tag)
+ for n in listitem(name) do
local sn = states[n]
if not sn then
-- error
@@ -73,17 +75,15 @@ function blocks.setstate(state,name,tag)
end
end
---~ filter_collected(names, criterium, number, collected)
-
function blocks.select(state,name,tag,criterium)
criterium = criterium or "text"
if find(tag,"=") then tag = "" end
- local names = aux.settings_to_set(name)
+ local names = settings_to_set(name)
local all = tag == ""
- local tags = not all and aux.settings_to_set(tag)
+ local tags = not all and settings_to_set(tag)
local hide = state == "process"
- local n = structure.sections.number_at_depth(criterium)
- local result = structure.lists.filter_collected("all", criterium, n, collected)
+ local n = sections.numberatdepth(criterium)
+ local result = lists.filtercollected("all", criterium, n, collected, { })
for i=1,#result do
local ri = result[i]
local metadata = ri.metadata
@@ -104,8 +104,8 @@ function blocks.select(state,name,tag,criterium)
end
function blocks.save(name,tag,buffer) -- wrong, not yet adapted
- local data = buffers.data[buffer]
- local tags = aux.settings_to_set(tag)
+ local data = buffers.getcontent(buffer)
+ local tags = settings_to_set(tag)
local plus, minus = false, false
if tags['+'] then plus = true tags['+'] = nil end
if tags['-'] then minus = true tags['-'] = nil end
@@ -117,7 +117,7 @@ function blocks.save(name,tag,buffer) -- wrong, not yet adapted
minus = minus,
},
references = {
- section = structure.sections.currentid(),
+ section = sections.currentid(),
},
data = data or "error",
}
@@ -142,5 +142,5 @@ function blocks.save(name,tag,buffer) -- wrong, not yet adapted
end
end
end
- buffers.data[buffer] = nil
+ buffers.erase(buffer)
end
diff --git a/Master/texmf-dist/tex/context/base/strc-blk.mkiv b/Master/texmf-dist/tex/context/base/strc-blk.mkiv
index 8aa8568407f..f625fa44849 100644
--- a/Master/texmf-dist/tex/context/base/strc-blk.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-blk.mkiv
@@ -23,7 +23,7 @@
% check functionality
% alternative files (needs further integration elsewhere)
-\def\blockparameter#1#2{\ifcsname\??tb#1#2\endcsname\csname\??tb#1#2\endcsname\fi}
+\def\namedblockparameter#1#2{\ifcsname\??tb#1#2\endcsname\csname\??tb#1#2\endcsname\fi}
\unexpanded\def\setupblockparameters{\dodoubleargument \dosetupblock} % fast one (for compatibility)
\unexpanded\def\setupblock {\dodoubleargumentwithset\dosetupblock} % handles set
@@ -41,13 +41,14 @@
\c!inner=,
\c!style=,
\c!file=]% todo
- \ctxlua{structure.blocks.define("#1")}%
- \setvalue{\e!begin#1}{\dodoubleempty\dobeginofblock[#1]}%
+ \ctxlua{structures.blocks.define("#1")}%
+ \setuvalue{\e!begin#1}{\dodoubleempty\dobeginofblock[#1]}%
\letvalue{\e!end#1}\relax}
\long\def\dobeginofblock[#1][#2]%
{\normalexpanded{\noexpand\dodowithbuffer{@block@}{\e!begin#1}{\e!end#1}}
- {}{\ctxlua{structure.blocks.save("#1","#2","@block@")}}}% before after
+ {}% before
+ {\ctxlua{structures.blocks.save("#1","#2","@block@")}}}% after
\def\dostarthiddenblock
{\startnointerference
@@ -69,30 +70,30 @@
\edef\currentblock{#1}%
\doblocksetups\currentblock
\let\doblocksetups\gobbleoneargument
- \blockparameter\currentblock\c!before
+ \namedblockparameter\currentblock\c!before
\dosetfontattribute{\??tb\currentblock}\c!style
\dosetcolorattribute{\??tb\currentblock}\c!color
- \blockparameter\currentblock\c!inner
+ \namedblockparameter\currentblock\c!inner
\ignorespaces}
\def\dostopnormalblock
{\removeunwantedspaces
- \blockparameter\currentblock\c!after
+ \namedblockparameter\currentblock\c!after
\par % todo: alternative = text, paragraph
\egroup}
\def\dosetblockstate[#1][#2][#3]% state name tag
- {\ctxlua{structure.blocks.setstate("#1","#2","#3")}}
+ {\ctxlua{structures.blocks.setstate("#1","#2","#3")}}
\def\doselectblocks[#1][#2][#3][#4]% state name tag setups
{\bgroup
\doifassignmentelse{#3}
{\getparameters[\??tb\??tb][\c!criterium=\v!text,#3]%
\def\doblocksetups##1{\getparameters[\??tb##1][#3]}%
- \ctxlua{structure.blocks.select("#1","#2","","\@@tb@@tbcriterium")}}
+ \ctxlua{structures.blocks.select("#1","#2","","\@@tb@@tbcriterium")}}
{\getparameters[\??tb\??tb][\c!criterium=\v!text,#4]%
\def\doblocksetups##1{\getparameters[\??tb##1][#4]}%
- \ctxlua{structure.blocks.select("#1","#2","#3","\@@tb@@tbcriterium")}}%
+ \ctxlua{structures.blocks.select("#1","#2","#3","\@@tb@@tbcriterium")}}%
\egroup}
% hide: save, if [+] also hidden execute
diff --git a/Master/texmf-dist/tex/context/base/strc-def.mkiv b/Master/texmf-dist/tex/context/base/strc-def.mkiv
index 77793c7eb7e..e386902e02c 100644
--- a/Master/texmf-dist/tex/context/base/strc-def.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-def.mkiv
@@ -12,7 +12,7 @@
\writestatus{loading}{ConTeXt Structure Macros / Definitions}
-% \registerctxluafile{strc-def}{1.001}
+%registerctxluafile{strc-def}{1.001}
\unprotect
@@ -109,21 +109,30 @@
% \part{second} \chapter{gamma} \section{a} \section{b} \subsection{x} \subsection{y} \chapter{delta}
% \stoptext
-\definestructureseparatorset [\s!default] [] [.]
-\definestructureconversionset [\s!default] [] [numbers]
-\definestructureresetset [\s!default] [] [1] % each level
-\definestructureprefixset [\s!default] [section-1,section-2,section-3] []
+\definestructureseparatorset [\s!default] [] [.]
+\definestructureconversionset [\s!default] [] [numbers]
+\definestructureresetset [\s!default] [] [1] % each level
+\definestructureprefixset [\s!default] [section-1,section-2,section-3] []
-\definestructureprefixset [\v!all] [section-1,section-2,section-3,section-4,section-5,section-6,section-7,section-8] []
-\definestructureprefixset [\v!none] [] []
+\definestructureconversionset [\v!pagenumber] [] [numbers]
-\definestructureprefixset [\v!part] [section-1] []
-\definestructureprefixset [\v!chapter] [section-2] []
+\definestructureprefixset [\v!all] [section-1,section-2,section-3,section-4,section-5,section-6,section-7,section-8] []
+\definestructureprefixset [\v!none] [] []
+
+\definestructureprefixset [\v!part] [section-1] []
+\definestructureprefixset [\v!chapter] [section-2] []
\definestructureseparatorset [\v!appendix:\s!default] [] [.]
\definestructureconversionset [\v!appendix:\s!default] [Romannumerals,Characters] [numbers]
\definestructureresetset [\v!appendix:\s!default] [] [1] % why was this 0
+\setupuserpagenumber [\c!numberconversionset=\v!pagenumber]
+
+% \startsetups defaults:frontpart:pagenumbers:roman
+% \definestructureconversionset[\c!frontpart:\c!pagenumber][][romannumerals]
+% \setupuserpagenumber[\c!way=\v!byblock]
+% \stopsetups
+
% \definesectionblock
\definestructureblock [\v!frontpart] [\v!frontmatter] [\c!number=\v!no]
@@ -249,6 +258,7 @@
%\c!indentnext=\v!no,
\c!continue=\v!no,
\c!page=\v!right,
+ \c!marking=\v!page,
\c!header=,
\c!style=\tfc,
\c!distance=.75em,
diff --git a/Master/texmf-dist/tex/context/base/strc-des.mkiv b/Master/texmf-dist/tex/context/base/strc-des.mkiv
index 29e4ea36c80..54eba1eaa65 100644
--- a/Master/texmf-dist/tex/context/base/strc-des.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-des.mkiv
@@ -70,6 +70,8 @@
\def\descriptionmainparameter #1{\csname\dodescriptionparameter{\??dd\currentdescriptionmain }#1\endcsname}
\def\descriptionnumberparameter#1{\csname\dodescriptionparameter{\??dd\currentdescriptionnumber}#1\endcsname}
+\def\nameddescriptionparameter #1#2{\csname\dodescriptionparameter{\??dd#1}#2\endcsname}
+
\def\detokenizeddescriptionparameter#1{\detokenize\expandafter\expandafter\expandafter{\csname\??dd\currentdescription#1\endcsname}}
\def\dodescriptionparameter#1#2%
@@ -239,10 +241,10 @@
\nobreak
\@@dodescription}
-\def\do@@description#1%
+\def\do@@description#1% temp hack, the scope
{\def\\{\crlf}%
\noindent
- #1{\ifhbox\descriptionheadbox\unhcopy\else\copy\fi\descriptionheadbox}%
+ #1[\c!scope=\v!local]{\ifhbox\descriptionheadbox\unhcopy\else\copy\fi\descriptionheadbox}%
\@@dodescription}
\setvalue{@@description\v!inmargin }{\do@@description\inmargin}
@@ -321,8 +323,10 @@
%D A new key 'headalign' in definitions.
+\newconstant\nesteddescriptionstate
+
\def\resetdescriptions % to be used in e.g. footnotes
- {\chardef\nesteddescriptionstate\zerocount}
+ {\nesteddescriptionstate\zerocount}
\resetdescriptions
@@ -338,7 +342,7 @@
\fi
\setbox\descriptionheadbox\hbox
{\forgetall\dontcomplain
- \trialtypesettingtrue
+ \settrialtypesetting
\doifelsenothing{\descriptionparameter\c!sample}
{\dodescriptionhandler\currentdescriptiontext}%
{\dodescriptionhandler\currentdescriptionsample}}%
@@ -359,9 +363,9 @@
\normalexpanded{\noexpand\indenting[\descriptionparameter\c!indenting]}%
% better a system mode
\ifcase\nesteddescriptionstate
- \chardef\nesteddescriptionstate\plusone
+ \nesteddescriptionstate\plusone
\or
- \chardef\nesteddescriptionstate\plustwo
+ \nesteddescriptionstate\plustwo
\fi % now happens elsewhere : \noindent\ignorespaces
\@@resetdescriptionclosesymbol}
@@ -374,11 +378,14 @@
\def\@@stopdescription
{\@@placedescriptionclosesymbol
- \par % else we loose
+ \doifnot{\descriptionparameter\c!display}\v!no\par
+ \dostoptagged
+ \dostoptagged
\endgroup
\descriptionparameter\c!after % which currentdescription is taken here?
- \egroup % temporary hack
- \checknextindentation[\descriptionparameter\c!indentnext]
+ \normalexpanded
+ {\egroup % temporary hack
+ \noexpand\checknextindentation[\descriptionparameter\c!indentnext]}%
\dorechecknextindentation}
\def\@@dodescription
@@ -412,6 +419,8 @@
\BeforePar{\@@makedescription[#1]{#2}}%
\GotoPar}
+\let\dotagsetdescriptiontag\relax
+
\def\@@dostartdescriptionindeed
{\edef\currentdescriptionlocation{\descriptionparameter\c!location}%
\ifx\currentdescriptionlocation\empty
@@ -420,15 +429,20 @@
\ifcsname @@description\currentdescriptionlocation\endcsname \else
\let\currentdescriptionlocation\v!left
\fi
+ \dostarttagged\t!description\currentdescription
+ \dostarttagged\t!descriptiontag\empty
+ \dotagsetdescriptiontag
\@@dostartdescription
- \csname @@description\currentdescriptionlocation\endcsname} % args not needed
+ \csname @@description\currentdescriptionlocation\endcsname
+ \dostoptagged
+ \dostarttagged\t!descriptioncontent\empty} % args not needed
\def\@@makedescription[#1]#2%
- {\postponenotes % new, assumes grouping
- \edef\currentdescriptionreference{#1}%
- \doenumerationcheckconditions
- \dodescriptioncomponent[\c!reference=#1,\c!label={\descriptionparameter\c!text},\c!title={#2},\c!bookmark=,\c!list=][]%
- \@@dostartdescriptionindeed}
+ {\postponenotes % new, assumes grouping
+ \edef\currentdescriptionreference{#1}%
+ \doenumerationcheckconditions
+ \dodescriptioncomponent[\c!reference=#1,\c!label={\descriptionparameter\c!text},\c!title={#2},\c!bookmark=,\c!list=][]%
+ \@@dostartdescriptionindeed}
\def\dostartstoreddescription
{\@@dostartdescriptionindeed}
@@ -522,7 +536,7 @@
\fi#1}
\def\@@dododescriptiontext
- {\ctxlua{structure.lists.savedtitle("\currentdescriptionmain",\currentdescriptionnumberentry)}}
+ {\ctxlua{structures.lists.savedtitle("\currentdescriptionmain",\currentdescriptionnumberentry)}}
\def\@@dodescriptiontext
{\begingroup
@@ -590,7 +604,7 @@
\def\dosetupenumerationcounter#1%
{\edef\currentenumerationcountername{#1}% only used in the token list
- \edef\currentdiscription{#1}%
+ \edef\currentdescription{#1}%
\the\everysetupenumerationcounter}
\appendtoks
@@ -603,9 +617,12 @@
\def\dodefineenumerationcommands#1#2#3#4% since we use \currentdescription, we need an edef
{\setevalue{\??dd#3#1\s!parent}{#4}%
- \setuevalue {#3#1}{\noexpand\doenumerationcommand{#1}{#2}{#3}}%
- \setuevalue{\e!start#3#1}{\noexpand\doenumerationstart {#1}{#2}{#3}}%
- \setuevalue{\e!stop #3#1}{\noexpand\doenumerationstop {#1}{#2}{#3}}}
+ \setuevalue {#3#1}{\noexpand\doenumerationcommand {#1}{#2}{#3}}%
+ \setuevalue{\c!reset#3#1}{\noexpand\doresetenumerationnumber{#1}{#2}{#3}}%
+ %setuevalue{\c!set #3#1}{\noexpand\dosetenumerationnumber {#1}{#2}{#3}}%
+ \setuevalue{\e!next #3#1}{\noexpand\donextenumerationnumber {#1}{#2}{#3}}%
+ \setuevalue{\e!start#3#1}{\noexpand\doenumerationstart {#1}{#2}{#3}}%
+ \setuevalue{\e!stop #3#1}{\noexpand\doenumerationstop {#1}{#2}{#3}}}
% handle enumeration
@@ -643,13 +660,13 @@
\let\@@doenumerationhandler\@@dodescriptionhandler
% \def\currentenumerationfullnumber
-% {\ctxlua{structure.lists.savedprefixednumber("\currentdescriptionmain",\currentdescriptionnumberentry)}}
+% {\ctxlua{structures.lists.savedprefixednumber("\currentdescriptionmain",\currentdescriptionnumberentry)}}
\def\@@doenumerationnumber
- {\ctxlua{structure.lists.savedprefixednumber("\currentdescriptionmain",\currentdescriptionnumberentry)}}
+ {\ctxlua{structures.lists.savedprefixednumber("\currentdescriptionmain",\currentdescriptionnumberentry)}}
\def\@@dodoenumerationtext
- {\ctxlua{structure.lists.savedtitle("\currentdescriptionmain",\currentdescriptionnumberentry)}}
+ {\ctxlua{structures.lists.savedtitle("\currentdescriptionmain",\currentdescriptionnumberentry)}}
\def\doenumerationnumber
{\descriptionparameter\c!left
@@ -661,18 +678,32 @@
\def\@@doenumerationtext
{\ifconditional\enumerationnumberenabled
\iftrialtypesetting
- \doenumerationfullnumber\showdntext
+ \doenumerationfullnumberyes
\doenumerationcouplingsymbol
\else
\doenumerationregistercoupling
- \doenumerationfullnumber\showdntext
+ \doenumerationfullnumberyes
\doenumerationcouplingsymbol
\fi
\else
- \doenumerationfullnumber\showdnpuretext
+ \doenumerationfullnumbernop
\fi}
-\def\doenumerationfullnumber#1% text, title
+\def\doenumerationfullnumberyes % text, title
+ {\begingroup
+ \dosetdescriptionattributes\c!headstyle\c!headcolor
+ \the\everyenumeration
+ \descriptionparameter\c!command{\strut\showdntext\doenumerationnumber\doenumerationextratext}%
+ \endgroup}
+
+\def\doenumerationfullnumbernop % text, title
+ {\begingroup
+ \dosetdescriptionattributes\c!headstyle\c!headcolor
+ \the\everyenumeration
+ \descriptionparameter\c!command{\strut\showdnpuretext\doenumerationextratext}%
+ \endgroup}
+
+\def\doenumerationfullnumber#1% text, title (used in notes) .. todo
{\begingroup
\dosetdescriptionattributes\c!headstyle\c!headcolor
\the\everyenumeration
@@ -681,14 +712,15 @@
\def\doenumerationextratext
{\doif{\descriptionparameter\c!title}\v!yes
- {\begingroup
- \dosetdescriptionattributes\c!titlestyle\c!titlecolor
- \hskip\descriptionparameter\c!titledistance
- \descriptionparameter\c!titlecommand
- {\descriptionparameter\c!titleleft
- \begstrut\@@dodoenumerationtext\endstrut
- \descriptionparameter\c!titleright}%
- \endgroup}}
+ {\doifsomething\@@dodoenumerationtext
+ {\begingroup
+ \dosetdescriptionattributes\c!titlestyle\c!titlecolor
+ \hskip\descriptionparameter\c!titledistance
+ \descriptionparameter\c!titlecommand
+ {\descriptionparameter\c!titleleft
+ \begstrut\@@dodoenumerationtext\endstrut
+ \descriptionparameter\c!titleright}%
+ \endgroup}}}
\def\doenumerationsavecounter {\savestructurecounter[\currentdescriptionnumber]}
\def\doenumerationrestorecounter {\restorestructurecounter[\currentdescriptionnumber]}
@@ -719,7 +751,7 @@
\fi \fi}
\def\skipenumerationcoupling[#1]% e.g. for questions with no answer
- {\ctxlua{jobreferences.setnextorder("description","#1")}}
+ {\ctxlua{structures.references.setnextorder("description","#1")}}
\def\showdnpuretext{\strut\descriptionparameter\c!text} % geen spatie
\def\showdnlisttext{\descriptionparameter\c!listtext} % space in default
@@ -745,7 +777,7 @@
\newif\ifnodescriptioncaption
\def\doifelsedescriptioncomponent
- {\ctxlua{structure.lists.doifstoredelse(currentdescriptionnumberentry)}}
+ {\ctxlua{structures.lists.doifstoredelse(currentdescriptionnumberentry)}}
\def\dodescriptioncomponent
{\doifelsedescriptioncomponent\nododescriptioncomponent\dododescriptioncomponent}
@@ -821,11 +853,11 @@
\else
%\setnextinternalreference
\setnextinternalreferences{description}\currentdescriptionname % plural
- \xdef\currentdescriptionnumberentry{\ctxlua{structure.lists.push{
+ \xdef\currentdescriptionnumberentry{\ctxlua{structures.lists.push{
metadata = {
kind = "description",
name = "\currentdescriptionname",
- level = structure.sections.currentlevel(),
+ level = structures.sections.currentlevel(),
catcodes = \the\catcodetable,
% \currentdirectionparameters
},
@@ -835,7 +867,7 @@
reference = "\currentdescriptionreference",
referenceprefix = "\referenceprefix",
block = "\currentstructureblock",
- section = structure.sections.currentid(),
+ section = structures.sections.currentid(),
},
titledata = {
label = \!!bs\detokenize\expandafter{\currentdescriptionlabel }\!!es,
@@ -858,7 +890,7 @@
connector = \!!bs\descriptionparameter\c!prefixconnector\!!es,
},
numberdata = {
- numbers = structure.counters.compact("\currentdescriptionnumber",nil,true), % ! number can be cloned
+ numbers = structures.counters.compact("\currentdescriptionnumber",nil,true), % ! number can be cloned
separatorset = "\descriptionparameter\c!numberseparatorset",
conversion = "\descriptionparameter\c!numberconversion",
conversionset = "\descriptionparameter\c!numberconversionset",
@@ -867,11 +899,11 @@
segments = "\descriptionparameter\c!numbersegments",
},
\fi
- userdata = structure.helpers.touserdata(\!!bs\detokenize{#2}\!!es)
+ userdata = structures.helpers.touserdata(\!!bs\detokenize{#2}\!!es)
}
}}%
- \xdef\currentdescriptionattribute {\ctxlua {tex.write(jobreferences.setinternalreference("\referenceprefix","\currentdescriptionreference",\nextinternalreference,"\@@iafocus"))}}%
- \xdef\currentdescriptionsynchronize{\ctxlatelua{structure.lists.enhance(\currentdescriptionnumberentry)}}%
+ \xdef\currentdescriptionattribute {\ctxlua {tex.write(structures.references.setinternalreference("\referenceprefix","\currentdescriptionreference",\nextinternalreference,"\interactionparameter\c!focus"))}}%
+ \xdef\currentdescriptionsynchronize{\ctxlatelua{structures.lists.enhance(\currentdescriptionnumberentry)}}%
\fi
\endgroup}
@@ -880,8 +912,8 @@
% macros.
\def\reinstatedescriptionnumberentry#1%
- {\xdef\currentdescriptionattribute {\ctxlua {tex.write(jobreferences.getinternalreference(#1))}}%
- \xdef\currentdescriptionsynchronize{\ctxlatelua{structure.lists.enhance(#1)}}}
+ {\xdef\currentdescriptionattribute {\ctxlua {tex.write(structures.references.getinternalreference(#1))}}%
+ \xdef\currentdescriptionsynchronize{\ctxlatelua{structures.lists.enhance(#1)}}}
\installstructurelistprocessor{description}{\usestructurelistprocessor{number+title}}
@@ -1042,6 +1074,7 @@
\c!titleright=),
\c!closesymbol=,
\c!closecommand=\wordright,
+ \c!display=\v!yes,
\c!command=,
\c!titlecommand=]
diff --git a/Master/texmf-dist/tex/context/base/strc-doc.lua b/Master/texmf-dist/tex/context/base/strc-doc.lua
index 7faf0d5b393..d50d49b9236 100644
--- a/Master/texmf-dist/tex/context/base/strc-doc.lua
+++ b/Master/texmf-dist/tex/context/base/strc-doc.lua
@@ -15,32 +15,33 @@ local format, gsub, find, concat, gmatch, match = string.format, string.gsub, st
local texsprint, texwrite = tex.sprint, tex.write
local concat = table.concat
local max, min = math.max, math.min
+local allocate, mark = utilities.storage.allocate, utilities.storage.mark
local ctxcatcodes = tex.ctxcatcodes
local variables = interfaces.variables
--~ if not trackers then trackers = { register = function() end } end
-local trace_sectioning = false trackers.register("structure.sectioning", function(v) trace_sectioning = v end)
-local trace_detail = false trackers.register("structure.detail", function(v) trace_detail = v end)
+local trace_sectioning = false trackers.register("structures.sectioning", function(v) trace_sectioning = v end)
+local trace_detail = false trackers.register("structures.detail", function(v) trace_detail = v end)
-local function report(...)
---~ print(...)
- logs.report("sectioning:",...)
-end
+local report_structure = logs.reporter("structure","sectioning")
+
+local structures, context = structures, context
+
+local helpers = structures.helpers
+local documents = structures.documents
+local sections = structures.sections
+local lists = structures.lists
+local counters = structures.counters
+local sets = structures.sets
+local tags = structures.tags
+local processors = structures.processors
-structure = structure or { }
-structure.helpers = structure.helpers or { }
-structure.documents = structure.documents or { }
-structure.sections = structure.sections or { }
-structure.sets = structure.sets or { }
-structure.processors = structure.processors or { }
+local sprintprocessor = processors.sprint
+local ignoreprocessor = processors.ignore
-local helpers = structure.helpers
-local documents = structure.documents
-local sections = structure.sections
-local sets = structure.sets
-local processors = structure.processors
+local a_internal = attributes.private('internal')
-- -- -- document -- -- --
@@ -73,17 +74,19 @@ documents.initialize()
-- -- -- sections -- -- --
-jobsections = jobsections or { }
-jobsections.collected = jobsections.collected or { }
-jobsections.tobesaved = jobsections.tobesaved or { }
-local collected, tobesaved = jobsections.collected, jobsections.tobesaved
+local collected = allocate()
+local tobesaved = allocate()
+
+sections.collected = collected
+sections.tobesaved = tobesaved
--~ local function initializer()
---~ collected, tobesaved = jobsections.collected, jobsections.tobesaved
+--~ collected = sections.collected
+--~ tobesaved = sections.tobesaved
--~ end
---~ job.register('jobsections.collected', jobsections.tobesaved, initializer)
+--~ job.register('structures.sections.collected', tobesaved, initializer)
function sections.currentid()
return #tobesaved
@@ -106,7 +109,7 @@ end
function sections.load()
setmetatable(collected,nil)
- local l = structure.lists.collected
+ local l = lists.collected
for i=1,#l do
local li = l[i]
local lm = li.metadata
@@ -129,11 +132,11 @@ setmetatable(collected, {
--
-structure.sections.levelmap = structure.sections.levelmap or { }
+sections.levelmap = sections.levelmap or { }
-local levelmap = structure.sections.levelmap
+local levelmap = sections.levelmap
-storage.register("structure/sections/levelmap", structure.sections.levelmap, "structure.sections.levelmap")
+storage.register("structures/sections/levelmap", sections.levelmap, "structures.sections.levelmap")
sections.verbose = true
@@ -156,7 +159,7 @@ function sections.getlevel(name)
end
function sections.way(way,by)
- texsprint(ctxcatcodes,(gsub(way,"^"..by,"")))
+ context((gsub(way,"^"..by,"")))
end
function sections.setblock(name)
@@ -166,7 +169,7 @@ function sections.setblock(name)
end
function sections.pushblock(name)
- structure.counters.check(0) -- we assume sane usage of \page between blocks
+ counters.check(0) -- we assume sane usage of \page between blocks
local block = name or data.block
data.blocks[#data.blocks+1] = block
data.block = block
@@ -207,7 +210,7 @@ function sections.somelevel(given)
-- normally these are passed as argument but nowadays we provide several
-- interfaces (we need this because we want to be compatible)
if trace_detail then
- logs.report("structure","name '%s', mapped level '%s', old depth '%s', new depth '%s', reset set '%s'",givenname,mappedlevel,olddepth,newdepth,resetset)
+ report_structure("name '%s', mapped level '%s', old depth '%s', new depth '%s', reset set '%s'",givenname,mappedlevel,olddepth,newdepth,resetset)
end
local u = given.userdata
if u then
@@ -223,7 +226,7 @@ function sections.somelevel(given)
for i=olddepth+1,newdepth do
local s = tonumber(sets.get("structure:resets",data.block,resetset,i))
if trace_detail then
- logs.report("structure","new>old (%s>%s), reset set '%s', reset value '%s', current '%s'",olddepth,newdepth,resetset,s or "?",numbers[i] or "?")
+ report_structure("new>old (%s>%s), reset set '%s', reset value '%s', current '%s'",olddepth,newdepth,resetset,s or "?",numbers[i] or "?")
end
if not s or s == 0 then
numbers[i] = numbers[i] or 0
@@ -238,7 +241,7 @@ function sections.somelevel(given)
for i=olddepth,newdepth+1,-1 do
local s = tonumber(sets.get("structure:resets",data.block,resetset,i))
if trace_detail then
- logs.report("structure","new<old (%s<%s), reset set '%s', reset value '%s', current '%s'",olddepth,newdepth,resetset,s or "?",numbers[i] or "?")
+ report_structure("new<old (%s<%s), reset set '%s', reset value '%s', current '%s'",olddepth,newdepth,resetset,s or "?",numbers[i] or "?")
end
if not s or s == 0 then
numbers[i] = numbers[i] or 0
@@ -250,7 +253,7 @@ function sections.somelevel(given)
status[i] = nil
end
end
- structure.counters.check(newdepth)
+ counters.check(newdepth)
ownnumbers[newdepth] = given.numberdata.ownnumber or ""
given.numberdata.ownnumber = nil
data.depth = newdepth
@@ -270,12 +273,12 @@ function sections.somelevel(given)
end
forced[newdepth] = nil
if trace_detail then
- logs.report("structure","old depth '%s', new depth '%s, old n '%s', new n '%s', forced '%s'",olddepth,newdepth,oldn,newn,concat(fd,""))
+ report_structure("old depth '%s', new depth '%s, old n '%s', new n '%s', forced '%s'",olddepth,newdepth,oldn,newn,concat(fd,""))
end
elseif newn then
newn = oldn + 1
if trace_detail then
- logs.report("structure","old depth '%s', new depth '%s, old n '%s', new n '%s', increment",olddepth,newdepth,oldn,newn)
+ report_structure("old depth '%s', new depth '%s, old n '%s', new n '%s', increment",olddepth,newdepth,oldn,newn)
end
else
local s = tonumber(sets.get("structure:resets",data.block,resetset,newdepth))
@@ -287,7 +290,7 @@ function sections.somelevel(given)
newn = s - 1
end
if trace_detail then
- logs.report("structure","old depth '%s', new depth '%s, old n '%s', new n '%s', reset",olddepth,newdepth,oldn,newn)
+ report_structure("old depth '%s', new depth '%s, old n '%s', new n '%s', reset",olddepth,newdepth,oldn,newn)
end
end
numbers[newdepth] = newn
@@ -313,13 +316,19 @@ function sections.somelevel(given)
numberdata.ownnumbers = table.fastcopy(ownnumbers)
end
if trace_detail then
- logs.report("structure","name '%s', numbers '%s', own numbers '%s'",givenname,concat(numberdata.numbers, " "),concat(numberdata.ownnumbers, " "))
+ report_structure("name '%s', numbers '%s', own numbers '%s'",givenname,concat(numberdata.numbers, " "),concat(numberdata.ownnumbers, " "))
end
- given.references.section = sections.save(given)
+
+ local metadata = given.metadata
+ local references = given.references
+
+ references.tag = references.tag or tags.getid(metadata.kind,metadata.name)
+
+ references.section = sections.save(given)
-- given.numberdata = nil
end
-function sections.writestatus()
+function sections.reportstructure()
if sections.verbose then
local numbers, ownnumbers, status, depth = data.numbers, data.ownnumbers, data.status, data.depth
local d = status[depth]
@@ -329,11 +338,11 @@ function sections.writestatus()
local t = (l ~= "" and l) or d.titledata.title or "[no title]"
local m = d.metadata.name
if o and not find(o,"^%.*$") then
- commands.writestatus("structure","%s @ level %i : (%s) %s -> %s",m,depth,n,o,t)
+ report_structure("%s @ level %i : (%s) %s -> %s",m,depth,n,o,t)
elseif d.directives and d.directives.hidenumber then
- commands.writestatus("structure","%s @ level %i : (%s) -> %s",m,depth,n,t)
+ report_structure("%s @ level %i : (%s) -> %s",m,depth,n,t)
else
- commands.writestatus("structure","%s @ level %i : %s -> %s",m,depth,n,t)
+ report_structure("%s @ level %i : %s -> %s",m,depth,n,t)
end
end
end
@@ -351,7 +360,7 @@ function sections.setnumber(depth,n)
end
end
-function sections.number_at_depth(depth)
+function sections.numberatdepth(depth)
return data.numbers[tonumber(depth) or sections.getlevel(depth) or 0] or 0
end
@@ -359,7 +368,7 @@ function sections.numbers()
return data.numbers
end
-function sections.matching_till_depth(depth,numbers,parentnumbers)
+function sections.matchingtilldepth(depth,numbers,parentnumbers)
local dn = parentnumbers or data.numbers
local ok = false
for i=1,depth do
@@ -382,7 +391,7 @@ end
function sections.cct()
local metadata = data.status[data.depth].metadata
- texsprint((metadata and metadata.catcodes) or ctxcatcodes)
+ context(metadata and metadata.catcodes or ctxcatcodes)
end
function sections.structuredata(depth,key,default,honorcatcodetable) -- todo: spec table and then also depth
@@ -402,20 +411,20 @@ function sections.structuredata(depth,key,default,honorcatcodetable) -- todo: sp
local metadata = data.metadata
texsprint((metadata and metadata.catcodes) or ctxcatcodes,d)
elseif not honorcatcodetable then
- texsprint(ctxcatcodes,d)
+ context(d)
elseif type(honorcatcodetable) == "number" then
texsprint(honorcatcodetable,d)
elseif type(honorcatcodetable) == "string" and honorcatcodetable ~= "" then
honorcatcodetable = tex[honorcatcodetable] or ctxcatcodes-- we should move ctxcatcodes to another table, ctx or so
texsprint(honorcatcodetable,d)
else
- texsprint(ctxcatcodes,d)
+ context(d)
end
return
end
end
if default then
- texsprint(ctxcatcodes,default)
+ context(default)
end
end
@@ -426,7 +435,7 @@ function sections.userdata(depth,key,default)
userdata = userdata and userdata.userdata
userdata = (userdata and userdata[key]) or default
if userdata then
- texsprint(ctxcatcodes,userdata)
+ context(userdata)
end
end
end
@@ -460,7 +469,7 @@ end
--
-function structure.currentsectionnumber() -- brr, namespace wrong
+function structures.currentsectionnumber() -- brr, namespace wrong
local sc = sections.current()
return sc and sc.numberdata
end
@@ -474,6 +483,53 @@ end
-- sign=positive => also zero
-- sign=hang => llap sign
+--~ todo: test this
+--~
+
+local function process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,index,entry,result,preceding,done)
+ -- todo: too much (100 steps)
+ local number = numbers and (numbers[index] or 0)
+ local ownnumber = ownnumbers and ownnumbers[index] or ""
+ if number > criterium or (ownnumber ~= "") then
+ local block = (entry.block ~= "" and entry.block) or sections.currentblock() -- added
+ if preceding then
+ local separator = sets.get("structure:separators",block,separatorset,preceding,".")
+ if separator then
+ if result then
+ result[#result+1] = ignoreprocessor(separator)
+ else
+ sprintprocessor(ctxcatcodes,separator)
+ end
+ end
+ preceding = false
+ end
+ if result then
+ 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)
+ else
+ local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
+ result[#result+1] = converters.convert(theconversion,number)
+ end
+ else
+ if ownnumber ~= "" then
+ sprintprocessor(ctxcatcodes,ownnumber)
+ elseif conversion and conversion ~= "" then -- traditional (e.g. used in itemgroups)
+ context.convertnumber(conversion,number)
+ else
+ local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
+ sprintprocessor(ctxcatcodes,theconversion,function(str)
+ return format("\\convertnumber{%s}{%s}",str or "numbers",number)
+ end)
+ end
+ end
+ return index, true
+ else
+ return preceding or false, done
+ end
+end
+
function sections.typesetnumber(entry,kind,...) -- kind='section','number','prefix'
if entry and entry.hidenumber ~= true then -- can be nil
local separatorset = ""
@@ -538,113 +594,92 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref
local numbers, ownnumbers = entry.numbers, entry.ownnumbers
if numbers then
local done, preceding = false, false
- local function process(index) -- move to outer
- -- todo: too much (100 steps)
- local number = numbers and (numbers[index] or 0)
- local ownnumber = ownnumbers and ownnumbers[index] or ""
- if number > criterium or (ownnumber ~= "") then
- local block = (entry.block ~= "" and entry.block) or sections.currentblock() -- added
- if preceding then
- local separator = sets.get("structure:separators",block,separatorset,preceding,".")
- if separator then
- processors.sprint(ctxcatcodes,separator)
- end
- preceding = false
- end
- if ownnumber ~= "" then
- processors.sprint(ctxcatcodes,ownnumber)
- -- elseif conversion and conversion ~= "" then
- -- texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,number))
- elseif conversion and conversion ~= "" then
- -- traditional (e.g. used in itemgroups)
- texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,number))
- else
- local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
- processors.sprint(ctxcatcodes,theconversion,function(str)
- return format("\\convertnumber{%s}{%s}",str or "numbers",number)
- end)
- end
- preceding, done = index, true
- else
- preceding = preceding or false
- end
+ --
+ local result = kind == "direct" and { }
+ if result then
+ connector = false
end
--
local prefixlist = set and sets.getall("structure:prefixes","",set) -- "" == block
if starter then
- processors.sprint(ctxcatcodes,starter)
+ if result then
+ result[#result+1] = ignoreprocessor(starter)
+ else
+ sprintprocessor(ctxcatcodes,starter)
+ end
end
- if prefixlist and (kind == 'section' or kind == 'prefix') then
+ if prefixlist and (kind == 'section' or kind == 'prefix' or kind == 'direct') then
-- find valid set (problem: for sectionnumber we should pass the level)
- -- if kind == "section" then
- -- no holes
- local b, e, bb, ee = 1, #prefixlist, 0, 0
- -- find last valid number
- for k=e,b,-1 do
- local prefix = prefixlist[k]
- local index = sections.getlevel(prefix) or k
- if index >= firstprefix and index <= lastprefix then
- local number = numbers and numbers[index]
- if number then
- local ownnumber = ownnumbers and ownnumbers[index] or ""
- if number > 0 or (ownnumber ~= "") then
- break
- else
- e = k -1
- end
+ -- no holes
+ local b, e, bb, ee = 1, #prefixlist, 0, 0
+ -- find last valid number
+ for k=e,b,-1 do
+ local prefix = prefixlist[k]
+ local index = sections.getlevel(prefix) or k
+ if index >= firstprefix and index <= lastprefix then
+ local number = numbers and numbers[index]
+ if number then
+ local ownnumber = ownnumbers and ownnumbers[index] or ""
+ if number > 0 or (ownnumber ~= "") then
+ break
+ else
+ e = k -1
end
end
end
- -- find valid range
- for k=b,e do
- local prefix = prefixlist[k]
- local index = sections.getlevel(prefix) or k
- if index >= firstprefix and index <= lastprefix then
- local number = numbers and numbers[index]
- if number then
- local ownnumber = ownnumbers and ownnumbers[index] or ""
- if number > 0 or (ownnumber ~= "") then
- if bb == 0 then bb = k end
- ee = k
- else
- bb, ee = 0, 0
- end
+ end
+ -- find valid range
+ for k=b,e do
+ local prefix = prefixlist[k]
+ local index = sections.getlevel(prefix) or k
+ if index >= firstprefix and index <= lastprefix then
+ local number = numbers and numbers[index]
+ if number then
+ local ownnumber = ownnumbers and ownnumbers[index] or ""
+ if number > 0 or (ownnumber ~= "") then
+ if bb == 0 then bb = k end
+ ee = k
else
- break
+ bb, ee = 0, 0
end
+ else
+ break
end
end
- -- print valid range
- for k=bb,ee do
- local prefix = prefixlist[k]
- local index = sections.getlevel(prefix) or k
- if index >= firstprefix and index <= lastprefix then
- process(index)
- end
+ end
+ -- print valid range
+ for k=bb,ee do
+ 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)
end
- -- else
- -- for k=1,#prefixlist do
- -- local prefix = prefixlist[k]
- -- local index = sections.getlevel(prefix) or k
- -- if index >= firstprefix and index <= lastprefix then
- -- process(index)
- -- end
- -- end
- -- end
+ end
else
-- also holes check
- for prefix=firstprefix,lastprefix do
- process(prefix)
+ for index=firstprefix,lastprefix do
+ -- process(index,result)
+ preceding, done = process(index,numbers,ownnumbers,criterium,separatorset,conversion,conversionset,index,entry,result,preceding,done)
end
end
--
if done and connector and kind == 'prefix' then
- processors.sprint(ctxcatcodes,connector)
+ if result then
+ -- can't happen as we're in 'direct'
+ else
+ sprintprocessor(ctxcatcodes,connector)
+ end
elseif done and stopper then
- processors.sprint(ctxcatcodes,stopper)
+ if result then
+ result[#result+1] = ignoreprocessor(stopper)
+ else
+ sprintprocessor(ctxcatcodes,stopper)
+ end
end
+ return result -- a table !
else
- -- report("error: no numbers")
+ -- report_structure("error: no numbers")
end
end
end
@@ -660,7 +695,7 @@ function sections.findnumber(depth,what)
local data = data.status[depth or data.depth]
if data then
local index = data.references.section
- local collected = jobsections.collected
+ local collected = sections.collected
local sectiondata = collected[index]
if sectiondata and sectiondata.hidenumber ~= true then -- can be nil
if what == variables.first then
@@ -689,7 +724,7 @@ function sections.findnumber(depth,what)
end
end
-function sections.fullnumber(depth,what,raw)
+function sections.fullnumber(depth,what)
local sectiondata = sections.findnumber(depth,what)
if sectiondata then
sections.typesetnumber(sectiondata,'section',sectiondata)
diff --git a/Master/texmf-dist/tex/context/base/strc-doc.mkiv b/Master/texmf-dist/tex/context/base/strc-doc.mkiv
index e10efb3f70d..683d65d2f0f 100644
--- a/Master/texmf-dist/tex/context/base/strc-doc.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-doc.mkiv
@@ -22,7 +22,7 @@
% We operate in a \type {@@ns} namespace. All data is passed through
% variables. Of course we can built another interface on top of this
% that accepts multiple arguments. We might change this approach and
-% remove this layer.
+% remove this layer but it was needed for the transition.
\def\currentstructurecounter{0}
@@ -36,10 +36,23 @@
\getparameters % initialization, used not grouped anyway
[\??ns]
- [\c!number=,\c!level=,\c!name=,\c!title=,\c!bookmark=,\c!marking=,\c!list=,\c!label=,\c!coupling=,\c!ownnumber=,
- \c!sectionseparatorset=\s!default,\c!sectionconversionset=\s!default,
- \c!sectionstopper=,\c!sectionstarter,\c!sectionsegments=,
- \c!sectionresetset=,\c!reference=,
+ [\c!number=,
+ \c!level=,
+ \c!name=,
+ \c!title=,
+ \c!bookmark=,
+ \c!marking=,
+ \c!list=,
+ \c!label=,
+ \c!coupling=,
+ \c!ownnumber=,
+ \c!sectionseparatorset=\s!default,
+ \c!sectionconversionset=\s!default,
+ \c!sectionstopper=,
+ \c!sectionstarter=,
+ \c!sectionsegments=,
+ \c!sectionresetset=,
+ \c!reference=,
\c!expansion=\v!no,
\c!xmlsetup=,
\s!catcodes=,
@@ -63,6 +76,7 @@
\xdef\currentstructurelabel {\structureparameter\c!label}%
\xdef\currentstructurereference {\structureparameter\c!reference}%
\xdef\currentstructurereferenceprefix{\structureparameter\c!referenceprefix}%
+ \xdef\currentstructurebackreference {\structureparameter\c!backreference}%
\xdef\currentstructureshownumber {\structureparameter\c!number}%
\xdef\currentstructuresaveinlist {\structureparameter\c!saveinlist}%
\xdef\currentstructureincrementnumber{\structureparameter\c!incrementnumber}%
@@ -102,12 +116,13 @@
\fi
\setnextinternalreference
\xdef\currentstructurenumber{\ctxlua{ % todo: combine with next call, adapt marks accordingly
- structure.sections.somelevel {
+ structures.sections.somelevel {
references = {
internal = \nextinternalreference,
block = "\currentstructureblock",
reference = "\currentstructurereference",
referenceprefix = "\currentstructurereferenceprefix",
+ backreference = "\currentstructurebackreference",
},
directives = {
resetset = "\structureparameter\c!sectionresetset",
@@ -159,10 +174,10 @@
segments = "\structureparameter\c!sectionsegments",
ownnumber = "\currentstructureownnumber",
},
- userdata = structure.helpers.touserdata(\!!bs\detokenize{#2}\!!es)
+ userdata = structures.helpers.touserdata(\!!bs\detokenize{#2}\!!es)
}
}}%
- \xdef\currentstructurelistnumber{\ctxlua{structure.lists.push(structure.sections.current())}}%
+ \xdef\currentstructurelistnumber{\ctxlua{structures.lists.push(structures.sections.current())}}%
% \currentstructuresynchronize has to be called someplace, since it introduces a node
\setstructuresynchronization\currentstructurelistnumber
\structureparameter\c!command
@@ -173,10 +188,10 @@
\let\previousstructurecounter\!!zerocount
\def\setstructuresynchronization#1%
- {\xdef\currentstructureattribute {\ctxlua {tex.write(jobreferences.setinternalreference("\currentstructurereferenceprefix","\currentstructurereference",\nextinternalreference,"\@@iafocus"))}}%
- \xdef\currentstructuresynchronize{\ctxlatelua{structure.lists.enhance(#1)}}}
+ {\xdef\currentstructureattribute {\ctxlua {tex.write(structures.references.setinternalreference("\currentstructurereferenceprefix","\currentstructurereference",\nextinternalreference,"\interactionparameter\c!focus"))}}%
+ \xdef\currentstructuresynchronize{\ctxlatelua{structures.lists.enhance(#1)}}}
-\def\reportcurrentstructure{\ctxlua{structure.sections.writestatus()}}
+\def\reportcurrentstructure{\ctxlua{structures.sections.reportstructure()}}
% Beware: we need to flush the data to the list explicitly. This is because
% node in inserted and we may want control over when that happens.
@@ -206,11 +221,12 @@
% \stopchapter
% \stoptext
-\def\structurevariable #1{\ctxlua{structure.sections.structuredata(nil,"#1")}}
-\def\structureuservariable #1{\ctxlua{structure.sections.userdata(nil,"#1")}}
-\def\structurenumber {\ctxlua{structure.sections.fullnumber()}}
-\def\structurecatcodedget #1{\ctxlua{structure.sections.structuredata(nil,"#1",nil,true)}} % bad name
-\def\structuregivencatcodedget#1#2{\ctxlua{structure.sections.structuredata(nil,"#1",nil,\number#2)}} % bad name
-\def\structureautocatcodedget #1#2{\ctxlua{structure.sections.structuredata(nil,"#1",nil,"#2")}}
+\def\structurevariable #1{\ctxlua{structures.sections.structuredata(nil,"#1")}}
+\def\structureuservariable #1{\ctxlua{structures.sections.userdata(nil,"#1")}}
+\def\structurenumber {\ctxlua{structures.sections.fullnumber()}}
+\def\structuretitle {\ctxlua{structures.sections.title()}}
+\def\structurecatcodedget #1{\ctxlua{structures.sections.structuredata(nil,"#1",nil,true)}} % bad name
+\def\structuregivencatcodedget#1#2{\ctxlua{structures.sections.structuredata(nil,"#1",nil,\number#2)}} % bad name
+\def\structureautocatcodedget #1#2{\ctxlua{structures.sections.structuredata(nil,"#1",nil,"#2")}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/strc-flt.mkii b/Master/texmf-dist/tex/context/base/strc-flt.mkii
index e64a439ec39..3d07cdc2064 100644
--- a/Master/texmf-dist/tex/context/base/strc-flt.mkii
+++ b/Master/texmf-dist/tex/context/base/strc-flt.mkii
@@ -2035,7 +2035,7 @@
\c!nbottom=0,
\c!nlines=4,
\c!local=,
- \c!default=\v!figure,
+ \c!default=, % was \v!figure but this is the location
\c!numbering=\v!yes]
% float strategy, replaces some of the above macros
@@ -2139,5 +2139,49 @@
\def\somerightpagefloat{\placesomerightpagefloat}
\def\somefacefloat {\placesomefacefloat}
\def\someslotfloat {\placesomeslotfloat}
-
+
+%D Local floats.
+
+\def\setuplocalfloats
+ {\getparameters[\??lf]}
+
+\setuplocalfloats
+ [%\c!before=\blank,
+ %\c!after=\blank,
+ \c!inbetween=\blank]
+
+\installfloathandler \v!local \somelocalfloat
+
+\initializeboxstack{localfloats}
+
+\newcounter\noflocalfloats
+
+\def\resetlocalfloats
+ {\doglobal\newcounter\noflocalfloats
+ \initializeboxstack{localfloats}}
+
+\def\somelocalfloat[#1]%
+ {\doglobal\increment\noflocalfloats
+ \savebox{localfloats}{\noflocalfloats}{\box\floatbox}}
+
+\def\getlocalfloats
+ {\dorecurse\noflocalfloats
+ {\ifnum\recurselevel=\plusone % 1\relax
+ \getvalue{\??lf\c!before}%
+ \else
+ \getvalue{\??lf\c!inbetween}%
+ \fi
+ \dontleavehmode\hbox{\foundbox{localfloats}\recurselevel}%
+ \ifnum\recurselevel=\noflocalfloats\relax
+ \getvalue{\??lf\c!after}%
+ \fi}}
+
+\def\flushlocalfloats
+ {\getlocalfloats
+ \resetlocalfloats}
+
+\def\getlocalfloat#1{\expanded{\foundbox{localfloats}{\number#1}}}
+
+\def\forcelocalfloats{\let\forcedfloatmethod\v!local}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/strc-flt.mkiv b/Master/texmf-dist/tex/context/base/strc-flt.mkiv
index 67023d701a6..32024a27695 100644
--- a/Master/texmf-dist/tex/context/base/strc-flt.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-flt.mkiv
@@ -21,12 +21,12 @@
%D strc-flt.tex and page-flt.mkiv cq. page-flt.mkii.
\ifdefined\addlocalbackgroundtobox\else \def\addlocalbackgroundtobox{\resetglobal\gobbleoneargument} \fi
-
+
\unexpanded\def\placefloats{\doflushfloats} % keep this one
-
+
\let\currentfloat\empty
-\def\letfloatparameter #1{\expandafter\csname\??fl\currentfloat#1\endcsname}
+\def\letfloatparameter #1{\expandafter\let\csname\??fl\currentfloat#1\endcsname}
\def\floatparameter #1{\csname\dofloatparameter{\??fl\currentfloat}#1\endcsname}
\def\floatsharedparameter#1{\csname \??fl #1\endcsname}
@@ -110,17 +110,18 @@
\c!textcolor=,
\c!align=,
\c!number=\v!yes,
-% \c!prefix=\v!no,
-% \c!prefixconnector=.,
-% \c!way=\v!by\v!chapter,
-% \c!prefixsegments=2:2,
-% \c!way=\@@nrway,
-% \c!blockway=\@@nrblockway,
-% \c!sectionnumber=\@@nrsectionnumber,
-% \c!separator=\@@koseparator,
-% \c!starter=\@@kostarter,
-% \c!stopper=\@@kostopper,
-% \c!suffix=\floatcaptionsuffix, % hook
+ % \c!prefix=\v!no,
+ % \c!prefixconnector=.,
+ % \c!way=\v!by\v!chapter,
+ % \c!prefixsegments=2:2,
+ % \c!way=\@@nrway,
+ % \c!blockway=\@@nrblockway,
+ % \c!sectionnumber=\@@nrsectionnumber,
+ % \c!separator=\@@koseparator,
+ % \c!starter=\@@kostarter,
+ % \c!stopper=\@@kostopper,
+ \c!suffixseparator=, % currently rather hard coded
+ \c!suffix=\floatcaptionsuffix,
\c!distance=1em,
\c!conversion=\v!numbers,
\c!command=]
@@ -169,7 +170,7 @@
\c!local=,
\c!bottombefore=, % e.g. \vfill
\c!bottomafter=,
- \c!default=\v!figure,
+ \c!default=, % default location
\c!numbering=\v!yes]
\def\@@bknumbering {\floatsharedparameter\c!numbering } % global one
@@ -180,6 +181,7 @@
\def\@@bknlines {\floatsharedparameter\c!nlines } % global one
\def\@@bkmargin {\floatsharedparameter\c!margin } % global one
\def\@@bkcache {\floatsharedparameter\c!cache } % global one
+\def\@@bklocation {\floatsharedparameter\c!location }
% float
%
@@ -205,7 +207,6 @@
% \c!sectionnumber=\floatcaptionparameter\c!sectionnumber,
% \c!conversion=\floatcaptionparameter\c!conversion]%
-
%D Individial settings:
\unexpanded\def\setupfloat {\dodoubleargument\dosetupfloat}
@@ -303,23 +304,35 @@
% \def\thecurrentfloatnumber
% {\ifnofloatcaption \else \ifnofloatnumber \else
-% % \labeltexts\currentfloat{\convertedstructurecounter[\currentfloat]}% ! ! todo: use a lua call instead
% \ifx\currentfloatnumber\relax\else
-% \labeltexts\currentfloat{\ctxlua{structure.lists.savednumber("\currentfloat",\currentfloatnumber)}}%
+% \dostarttagged\t!floattag\empty
+% \labeltexts\currentfloat{\ctxlua{structures.lists.savedprefixednumber("\currentfloat",\currentfloatnumber)}}%
+% \dostoptagged
% \fi
% \fi \fi}
+\unexpanded\def\thecurrentfloatnumbersuffix
+ {\doifsomething{\floatcaptionparameter\c!suffix}
+ {\floatcaptionparameter\c!suffixseparator
+ \floatcaptionparameter\c!suffix}}
+
\def\thecurrentfloatnumber
{\ifnofloatcaption \else \ifnofloatnumber \else
\ifx\currentfloatnumber\relax\else
- \labeltexts\currentfloat{\ctxlua{structure.lists.savedprefixednumber("\currentfloat",\currentfloatnumber)}}%
+ \dostarttagged\t!floattag\empty
+ \labeltexts\currentfloat
+ {\ctxlua{structures.lists.savedprefixednumber("\currentfloat",\currentfloatnumber)}%
+ \thecurrentfloatnumbersuffix}%
+ \dostoptagged
\fi
\fi \fi}
\def\thecurrentfloatcaption
{\ifnofloatcaption \else
\ifx\currentfloatnumber\relax\else
- \ctxlua{structure.lists.savedtitle("\currentfloat",\currentfloatnumber)}%
+ \dostarttagged\t!floattext\empty
+ \ctxlua{structures.lists.savedtitle("\currentfloat",\currentfloatnumber)}%
+ \dostoptagged
\fi
\fi}
@@ -367,11 +380,11 @@
\begingroup
\dosetfloatcaptionattributes\c!style\c!color
\begingroup
- \dosetfloatcaptionattributes\c!headstyle\c!headcolor
+ \dosetfloatcaptionattributes\c!headstyle\c!headcolor
\labeltexts{#1}{\preparednumber}%
\endgroup
\begingroup
- \dosetfloatcaptionattributes\c!textstyle\c!textcolor
+ \dosetfloatcaptionattributes\c!textstyle\c!textcolor
\dotfskip{\floatcaptionparameter\c!distance}#3%
\endgroup
\endgroup}%
@@ -467,10 +480,10 @@
\long\def\docheckcaptioncontent#1#2%
{\ifnofloatcaption \else
\setbox\tempcaptionbox\hbox
- {\trialtypesettingtrue
+ {\settrialtypesetting
\notesenabledfalse
\putcompletecaption{#1}{#2}}%
- % new, \placefigure{\XMLflush{somecaption}}{} passes earlier empty check
+ % new, \placefigure{\xmlfirst{#1}{somecaption}}{} passes earlier empty check
% so here we misuse the scratch box; actually this means that the previous
% test can go away (some day, when i redo this module)
\ifdim\wd\tempcaptionbox=\zeropoint
@@ -510,21 +523,21 @@
\newconditional\retainfloatnumber
-\def\preparefloatnumber#1%
+\def\preparefloatnumber#1% use in special case see below
{\xdef\floatcaptionnumber{#1}%
\doifelsenodelocation{\v!float\@@thenumber{#1}}
- \donothing {\chardef\nodelocationmode\zerocount}%
+ \donothing {\nodelocationmode\zerocount}%
\doifelse{\floatsharedparameter\c!numbering}\v!nocheck
{\incrementnumber[#1]%
\makesectionnumber[#1]%
\ifconditional\retainfloatnumber\decrementnumber[#1]\fi}
{\ifinsidecolumns
- \chardef\nodelocationmode\zerocount
+ \nodelocationmode\zerocount
% to be perfected:
- % \chardef\nodelocationmode\plustwo
+ % \nodelocationmode\plustwo
\fi
% FOR THE MOMENT NOT AVAILABLE
-\chardef\nodelocationmode\zerocount
+\nodelocationmode\zerocount
% BUT NOT THAT HARD TO DO
\ifcase\nodelocationmode
\incrementnumber[#1]%
@@ -610,6 +623,7 @@
\fi
\global\insidefloattrue
\begingroup % **
+ \dostarttagged\t!float\currentfloat
\ifmarginblocks
\doifinset\v!margin{#2}{\hsize\@@mbwidth}%
\fi
@@ -619,15 +633,17 @@
\dowithnextboxcontent % better a \the\everyfloattoks
{\setlocalfloathsize
\floatparameter\c!inner
+ \dostarttagged\t!floatcontent\empty
+ \aftergroup\dostoptagged % tricky, never change \dowithnextboxcontent
\postponenotes} % new
{\doifsomething{\floatparameter\c!criterium}
{\ifdim\wd\nextbox>\floatparameter\c!criterium\relax
- \edef\forcedfloatmethod{\floatvariable\c!fallback}%
+ \edef\forcedfloatmethod{\floatparameter\c!fallback}%
\ifx\forcedfloatmethod\empty\let\forcedfloatmethod\v!here\fi
\fi}%
- \xdocompletefloat{#1}{#3}{#2}{#4}% ** not yet done
- % we need to carry over the par because of side floats
- \doifnotinset\v!text{#2}{\carryoverpar\endgroup}%
+ \xdocompletefloat{#1}{#3}{#2}{#4}% ** not yet done
+ % we need to carry over the par because of side floats
+ \doifnotinset\v!text{#2}{\dostoptagged\carryoverpar\endgroup}% **
\global\sidefloatdownshift \zeropoint
\global\sidefloatextrashift\zeropoint
\ifparfloat
@@ -639,8 +655,9 @@
\def\xxdocompletefloat#1#2%
{\rightorleftpageaction{\let\@@extrafloat#1}{\let\@@extrafloat#2}}
-\chardef\textfloatmethod=0 % 0=raw 1=safe (.99) 2=tight (-1pt)
-\chardef\sidefloatmethod=1 % 0=raw 1=safe (.99) 2=tight (-1pt)
+\setnewconstant\sidefloatalign \zerocount
+\setnewconstant\textfloatmethod\zerocount % 0=raw 1=safe (.99) 2=tight (-1pt)
+\setnewconstant\sidefloatmethod\plusone % 0=raw 1=safe (.99) 2=tight (-1pt)
\let\floatrotation\!!zerocount
@@ -659,26 +676,26 @@
\fi
\global\sidefloatshift\zeropoint
\global\sidefloatmaximum\zeropoint
- \global\chardef\sidefloatmethod\floatparameter\c!sidemethod
- \global\chardef\textfloatmethod\floatparameter\c!textmethod
- \global\chardef\sidefloatalign\zerocount
+ \global\sidefloatmethod\floatparameter\c!sidemethod
+ \global\textfloatmethod\floatparameter\c!textmethod
+ \global\sidefloatalign\zerocount
\globallet\floatrotation\!!zerocount
\calculatefloatskips
\ifparfloat
\processaction
[\floatparameter\c!sidealign]
- [\v!height=>\global\chardef\sidefloatalign\plusone,%
- \v!line=>\global\chardef\sidefloatalign\plustwo,% (***)
- \v!depth=>\global\chardef\sidefloatalign\plusthree,%
- \v!grid=>\global\chardef\sidefloatalign\plusfour,%
- \v!halfline=>\global\chardef\sidefloatalign\plusfive]%
- % todo (test first): \doifinset\v!lokaal{#2}{\chardef\sidefloatalign\zerocount}%
+ [\v!height=>\global\sidefloatalign\plusone,%
+ \v!line=>\global\sidefloatalign\plustwo,% (***)
+ \v!depth=>\global\sidefloatalign\plusthree,%
+ \v!grid=>\global\sidefloatalign\plusfour,%
+ \v!halfline=>\global\sidefloatalign\plusfive]%
+ % todo (test first): \doifinset\v!lokaal{#2}{\global\sidefloatalign\zerocount}%
\ifcase\sidefloatalign\relax % todo: optie v!lokaal => \else
- \doifinset\v!height {#2}{\global\chardef\sidefloatalign\plusone}%
- \doifinset\v!line {#2}{\global\chardef\sidefloatalign\plustwo}%
- \doifinset\v!depth {#2}{\global\chardef\sidefloatalign\plusthree}%
- \doifinset\v!grid {#2}{\global\chardef\sidefloatalign\plusfour}%
- \doifinset\v!halfline{#2}{\global\chardef\sidefloatalign\plusfive}% meant for 'none'
+ \doifinset\v!height {#2}{\global\sidefloatalign\plusone}%
+ \doifinset\v!line {#2}{\global\sidefloatalign\plustwo}%
+ \doifinset\v!depth {#2}{\global\sidefloatalign\plusthree}%
+ \doifinset\v!grid {#2}{\global\sidefloatalign\plusfour}%
+ \doifinset\v!halfline{#2}{\global\sidefloatalign\plusfive}% meant for 'none'
\fi
\doifinset\v!high{#2}{\global\sidefloattopskip \zeropoint}%
\doifinset\v!low {#2}{\global\sidefloatbottomskip\zeropoint}%
@@ -751,9 +768,11 @@
\let\currentfloatattribute\empty % to be checked
\def\floatcaptionattribute
- {\iflocation \ifnofloatnumber \else \ifnofloatcaption \else
+ {\iflocation \ifnofloatnumber \else \ifnofloatcaption \else \ifinsidesplitfloat \else
attr \destinationattribute \currentfloatattribute
- \fi \fi \fi}
+ \fi \fi \fi \fi}
+
+\newconditional\usesamefloatnumber
\long\def\docompletefloat#1#2#3#4#5% #1:floatclass #2:reference #3:optionlist #4:caption #5:box number
{\presetfloatvariables{#1}{#3}{#2}{#5}% check this one
@@ -762,24 +781,32 @@
%
% \dofloatcomponent[\c!name=#1,\c!reference=#2,\c!bookmark=,\c!title={#4}][]% ifnofloatnumber ifnofloatcaption \tracefloatnumber{#1}%
%
- \dostructurecountercomponent
- {float}%
- \getcaptionparameters
- \floatcaptionparameter
- \detokenizedcaptionparameter
- \relax
- \relax
- \relax
- [\c!name=\currentfloat,\s!counter=\@@thestructurecounter\currentfloat,%
- \s!hascaption=\ifnofloatcaption \v!no\else\v!yes\fi,%
- \s!hasnumber=\ifnofloatnumber \v!no\else\v!yes\fi,%
- \s!hastitle=\ifemptyfloatcaption\v!no\else\v!yes\fi,%
- \c!reference=#2,\c!title={#4},\c!bookmark=]%
- []%
- \globallet\currentfloatnumber \laststructurecounternumber
- \globallet\currentfloatattribute \laststructurecounterattribute
- \globallet\currentfloatsynchronize\laststructurecountersynchronize
+ \ifconditional\usesamefloatnumber
+ \globallet\currentfloatnumber \previousfloatnumber
+ \globallet\currentfloatattribute \empty
+ \globallet\currentfloatsynchronize\relax
+ \else
+ \dostructurecountercomponent
+ {float}%
+ \getcaptionparameters
+ \floatcaptionparameter
+ \detokenizedcaptionparameter
+ \relax
+ \relax
+ \relax
+ [\c!name=\currentfloat,\s!counter=\@@thestructurecounter\currentfloat,%
+ \s!hascaption=\ifnofloatcaption \v!no\else\v!yes\fi,%
+ \s!hasnumber=\ifnofloatnumber \v!no\else\v!yes\fi,%
+ \s!hastitle=\ifemptyfloatcaption\v!no\else\v!yes\fi,%
+ \c!reference=#2,\c!title={#4},\c!bookmark=]%
+ []%
+ \globallet\previousfloatnumber \laststructurecounternumber
+ \globallet\currentfloatnumber \laststructurecounternumber
+ \globallet\currentfloatattribute \laststructurecounterattribute
+ \globallet\currentfloatsynchronize\laststructurecountersynchronize
+ \fi
%
+ \global\setfalse\usesamefloatnumber % one shot
% check float box
\setnaturalfloatdimensions#5%
\global\setbox\floatbox\vbox{\floatparameter\c!command{\box#5}}%
@@ -798,6 +825,7 @@
\egroup
% place the float
\dofloat{#3}{\thecurrentfloatnumber}{\thecurrentfloatcaption}%
+% \dostoptagged % tricky here, we need an extra mechanism (add to previous or so)
\global\insidefloatfalse}
\def\setlocalfloathsize
@@ -832,7 +860,7 @@
\fi}
\appendtoks
- \let\rightorleftpageaction\doifrightpagefloatelse
+ \let\rightorleftpageaction\doifrightpagefloatelse
\to \everyinsidefloat
\newif\ifextrafloatactions \extrafloatactionstrue
@@ -928,14 +956,14 @@
\ifextrafloatactions
\ifdim\sidefloatdownshift=\zeropoint\else
\global\setbox\floatbox\vbox
- {\vskip\sidefloatdownshift\nointerlineskip\box\floatbox}%
+ {\vskip\sidefloatdownshift\nointerlineskip\box\floatbox}%
\fi
\doifsomething{\floatparameter\c!minwidth}
{\scratchdimen\floatparameter\c!minwidth\relax
\ifdim\wd\floatbox<\scratchdimen
\global\setbox\floatbox\hbox to \scratchdimen
{\doifnot{\floatparameter\c!location}\v!left \hss
- \box\floatbox%
+ \box\floatbox
\doifnot{\floatparameter\c!location}\v!right\hss}%
\fi}%
% todo: rand / rug
@@ -947,8 +975,7 @@
\doifsomething{\floatparameter\c!maxwidth}
{\scratchdimen\floatparameter\c!maxwidth\relax
\ifdim\wd\floatbox>\scratchdimen
- \doifcommonelse{\v!inright,\v!rightmargin,\v!rightedge
- \v!inleft,\v!leftmargin,\v!leftedge}{#1}
+ \doifcommonelse{\v!inright,\v!rightmargin,\v!rightedge,\v!inleft,\v!leftmargin,\v!leftedge}{#1}
{\global\sidefloatmaximum\scratchdimen}
{\global\setbox\floatbox\hbox to \scratchdimen
{\doifcommonelse{\v!right,\v!left}{#1}
@@ -1128,8 +1155,10 @@
\doifnotinset\v!tall{#1}%
{\dp\floatbox\openstrutdepth}% dp\strutbox}% % toegevoegd
\box\floatbox
+ \dostoptagged
\blank[\floatsharedparameter\c!spaceafter]%
\endgroup % **
+% \dostoptagged
\doinsertfloatinfo}
\def\somefacefloat[#1]% links, rechts, midden, hoog, midden, laag
@@ -1202,14 +1231,14 @@
\ifdefined\moveboxontogrid\else \let\movecaptionontogrid\gobblethreearguments \fi
\def\locatefloatbox
- {\chardef\alignstrutmode\zerocount
+ {\alignstrutmode\zerocount
\shiftalignedline
{\floatparameter\c!leftmargin }{\floatparameter\c!rightmargin}%
{\floatparameter\c!innermargin}{\floatparameter\c!outermargin}%
\alignedline{\floatparameter\c!location}\v!middle}
\def\locatecaptionbox
- {\chardef\alignstrutmode\zerocount
+ {\alignstrutmode\zerocount
\shiftalignedline
{\floatcaptionparameter\c!leftmargin }{\floatcaptionparameter\c!rightmargin}%
{\floatcaptionparameter\c!innermargin}{\floatcaptionparameter\c!outermargin}%
@@ -1270,7 +1299,8 @@
\locatefloat{\copy\tempfloatbox}}}
\def\dopreparedocaption#1#2#3%
- {\doifinsetelse{\floatcaptionparameter\c!location}{\v!top,\v!bottom}
+ {\dostarttagged\t!floatcaption\empty
+ \doifinsetelse{\floatcaptionparameter\c!location}{\v!top,\v!bottom}
{\doifinsetelse{\floatcaptionparameter\c!width}{\v!fit,\v!max}
{\doifelse{\floatcaptionparameter\c!minwidth}\v!fit
{\doifelse{\floatcaptionparameter\c!width}\v!max
@@ -1286,7 +1316,8 @@
{\dopreparesidewidthcaption{#1}{#2}{#3}}}% new, special effects (see icare)
{\doifinsetelse{\floatcaptionparameter\c!width}{\v!fit,\v!max}
{\dopreparesideautocaption{#1}{#2}{#3}}
- {\dopreparesidewidthcaption{#1}{#2}{#3}}}}
+ {\dopreparesidewidthcaption{#1}{#2}{#3}}}%
+ \dostoptagged}
% \def\dosettempcaptionbox
% {\dosetraggedvbox{\floatcaptionparameter\c!align}%
@@ -1344,7 +1375,7 @@
\ifdim\captionhsize>\hsize
% float is wider than \hsize
\dosettempcaptionbox
- {\trialtypesettingtrue
+ {\settrialtypesetting
\hsize\captionhsize
\notesenabledfalse
\putcompletecaption{#2}{#3}}%
@@ -1368,7 +1399,7 @@
\edef\captionhsize{\the\scratchdimen}%
\fi
\setbox\scratchbox\vbox % test with overshoot
- {\trialtypesettingtrue
+ {\settrialtypesetting
\scratchdimen\captionhsize
\advance\scratchdimen \captionovershoot
\advance\scratchdimen 3em % an average word length
@@ -1720,7 +1751,7 @@
\newif\ifpostponecolumnfloats \postponecolumnfloatsfalse % don't change
-\chardef\postcenterfloatmethod\plusone
+\setnewconstant\postcenterfloatmethod\plusone
\def\postcenterfloatbox#1%
{\scratchdimen
@@ -1796,7 +1827,7 @@
\let\locatecaption\relax
\def\locatesidefloat##1%
{\begingroup
- \chardef\alignstrutmode\zerocount
+ \alignstrutmode\zerocount
\hsize\tempfloatwidth \forgetall
\alignedline{\floatparameter\c!location}\v!middle{##1}%
\endgroup}%
@@ -1859,25 +1890,34 @@
% float strategy, replaces some of the above macros
\let\floatmethod \empty
+\let\floatlabel \empty
\let\floatcolumn \empty
\let\floatrow \empty
\let\forcedfloatmethod\empty
+% \def\setfloatmethodvariables#1%
+% {\getfromcommalist[#1][1]%
+% \@EA\beforesplitstring\commalistelement\at:\to\floatmethod
+% \@EA\aftersplitstring \commalistelement\at:\to\floatcolumn
+% \@EA\aftersplitstring \floatcolumn\at*\to\floatrow
+% \@EA\beforesplitstring\floatcolumn\at*\to\floatcolumn}
+
+\def\setfloatmethodvariables#1% \floatmethod \floatlabel \floatrow \floatcolumn
+ {\ctxlua{floats.analysemethod("#1")}}
+
\def\dogetfloatbox#1#2%
{\ifvisible
- \doifelsenothing{#2}
- {\getfromcommalist[#1][1]%
- \@EA\beforesplitstring\commalistelement\at:\to\floatmethod
- \@EA\aftersplitstring \commalistelement\at:\to\floatcolumn
- \@EA\aftersplitstring \floatcolumn\at*\to\floatrow
- \@EA\beforesplitstring\floatcolumn\at*\to\floatcolumn
- % todo: nog algemeen otr
- \ifdefined\OTRSETsetpreferedcolumnslot
- \OTRSETsetpreferedcolumnslot\floatcolumn\floatrow
- \fi}
- {\let\floatcolumn\empty
- \let\floatrow\empty
- \edef\floatmethod{#2}}%
+ \let \floatlabel \empty
+ \let \floatcolumn\empty
+ \let \floatrow \empty
+ \edef\floatmethod{#2}%
+ \ifx\floatmethod\empty
+ \setfloatmethodvariables{#1}%
+ % todo: nog algemeen otr
+ \ifdefined\OTRSETsetpreferedcolumnslot
+ \OTRSETsetpreferedcolumnslot\floatcolumn\floatrow
+ \fi
+ \fi
\doifundefined{\string\floatmethod\floatmethod}
{\let\floatmethod\v!here}%
\doifsomething\forcedfloatmethod
@@ -1889,6 +1929,9 @@
\def\installfloathandler#1#2% #1=keyword #2=handler
{\setvalue{\string\floatmethod#1}{#2}}
+\def\somesomewherefloat[#1]%
+ {\dofloatssavesomewherefloat\s!somewhere{#1}}
+
\installfloathandler \v!here \someherefloat
\installfloathandler \v!force \somefixdfloat
\installfloathandler \v!left \someleftsidefloat
@@ -1910,6 +1953,8 @@
\installfloathandler \v!leftedge \someinleftedgefloat
\installfloathandler \v!rightedge \someinrightedgefloat
+\installfloathandler \v!somewhere \somesomewherefloat
+
\installfloathandler \v!backspace \somebackspacefloat
\installfloathandler \v!cutspace \somecutspacefloat
@@ -1953,6 +1998,7 @@
\unexpanded\def\placesomebotsfloat {\OTRcommand\somebotsfloat}
\unexpanded\def\placesomesidefloat {\OTRcommand\somesidefloat}
\unexpanded\def\placesomefacefloat {\OTRcommand\somefacefloat}
+%unexpanded\def\placesomesomewherefloat{\OTRcommand\somesomewherefloat}
\def\somefixdfloat {\placesomefixdfloat}
\def\somepagefloat {\placesomepagefloat}
@@ -1960,5 +2006,49 @@
\def\somerightpagefloat{\placesomerightpagefloat}
\def\somefacefloat {\placesomefacefloat}
\def\someslotfloat {\placesomeslotfloat}
-
+
+%D Local floats:
+
+\def\setuplocalfloats
+ {\getparameters[\??lf]}
+
+\setuplocalfloats
+ [%\c!before=\blank,
+ %\c!after=\blank,
+ \c!inbetween=\blank]
+
+\installfloathandler \v!local \somelocalfloat
+
+\initializeboxstack{localfloats}
+
+\newcounter\noflocalfloats
+
+\def\resetlocalfloats
+ {\doglobal\newcounter\noflocalfloats
+ \initializeboxstack{localfloats}}
+
+\def\somelocalfloat[#1]%
+ {\doglobal\increment\noflocalfloats
+ \savebox{localfloats}{\noflocalfloats}{\box\floatbox}}
+
+\def\getlocalfloats
+ {\dorecurse\noflocalfloats
+ {\ifnum\recurselevel=\plusone % 1\relax
+ \getvalue{\??lf\c!before}%
+ \else
+ \getvalue{\??lf\c!inbetween}%
+ \fi
+ \dontleavehmode\hbox{\foundbox{localfloats}\recurselevel}%
+ \ifnum\recurselevel=\noflocalfloats\relax
+ \getvalue{\??lf\c!after}%
+ \fi}}
+
+\def\flushlocalfloats
+ {\getlocalfloats
+ \resetlocalfloats}
+
+\def\getlocalfloat#1{\expanded{\foundbox{localfloats}{\number#1}}}
+
+\def\forcelocalfloats{\let\forcedfloatmethod\v!local}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/strc-ini.lua b/Master/texmf-dist/tex/context/base/strc-ini.lua
index 61c26a20eed..a9013c641a3 100644
--- a/Master/texmf-dist/tex/context/base/strc-ini.lua
+++ b/Master/texmf-dist/tex/context/base/strc-ini.lua
@@ -24,60 +24,76 @@ local format, concat, match = string.format, table.concat, string.match
local count, texwrite, texprint, texsprint = tex.count, tex.write, tex.print, tex.sprint
local type, next, tonumber, tostring = type, next, tonumber, tostring
local lpegmatch = lpeg.match
+local settings_to_array, settings_to_hash = utilities.parsers.settings_to_array, utilities.parsers.settings_to_hash
+local allocate = utilities.storage.allocate
local ctxcatcodes, xmlcatcodes, notcatcodes = tex.ctxcatcodes, tex.xmlcatcodes, tex.notcatcodes -- tricky as we're in notcatcodes
-local trace_processors = false trackers.register("structure.processors", function(v) trace_processors = v end)
+local trace_processors = false trackers.register("structures.processors", function(v) trace_processors = v end)
+
+local report_processors = logs.reporter("structure","processors")
-- move this
-commands = commands or { }
+commands = commands or { }
+local commands = commands
-function commands.first_in_list(str)
+function commands.firstinlist(str)
local first = match(str,"^([^,]+),")
texsprint(ctxcatcodes,first or str)
end
-- -- -- namespace -- -- --
-structure = structure or { }
-
--- -- -- cache -- -- --
-
-structure.shares = structure.shares or { }
-structure.shares.cache = structure.shares.cache or { }
-
-local shares = structure.shares
-local cache = shares.cache
-
-function shares.put(data)
- cache[#cache+1] = data
- return #cache
-end
-
-function shares.get(n) -- n can be string
- n = tonumber(n) or -1
- return cache[n]
-end
+-- This is tricky: we have stored and initialized already some of
+-- the job.registered tables so we have a forward reference!
+
+structures = structures or { }
+local structures = structures
+
+structures.blocks = structures.blocks or { }
+structures.sections = structures.sections or { }
+structures.pages = structures.pages or { }
+structures.registers = structures.registers or { }
+structures.references = structures.references or { }
+structures.lists = structures.lists or { }
+structures.helpers = structures.helpers or { }
+structures.processors = structures.processors or { }
+structures.documents = structures.documents or { }
+structures.notes = structures.notes or { }
+structures.descriptions = structures.descriptions or { }
+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.sets = structures.sets or { }
+structures.marks = structures.marks or { }
+structures.floats = structures.floats or { }
+structures.synonyms = structures.synonyms or { }
+
+--~ table.print(structures)
-- -- -- specials -- -- --
-- we can store information and get back a reference; this permits
-- us to store rather raw data in references
-local specials = { } structure.specials = specials
+local specials = structures.specials
-specials.collected = specials.collected or { }
-specials.tobesaved = specials.collected or { }
+local collected = allocate()
+local tobesaved = allocate()
-local collected, tobesaved = specials.collected, specials.tobesaved
+specials.collected = collected
+specials.tobesaved = tobesaved
local function initializer()
- collected, tobesaved = specials.collected, specials.tobesaved
+ collected = specials.collected
+ tobesaved = specials.tobesaved
end
if job then
- job.register('structure.specials.collected', structure.specials.tobesaved, initializer)
+ job.register('structures.specials.collected', tobesaved, initializer)
end
function specials.store(class,data)
@@ -103,12 +119,10 @@ end
-- -- -- helpers -- -- --
-structure.helpers = structure.helpers or { }
-
-local helpers = structure.helpers
+local helpers = structures.helpers
function helpers.touserdata(str)
- local hash = str and str ~= "" and aux.settings_to_hash(str)
+ local hash = str and str ~= "" and settings_to_hash(str)
if hash and next(hash) then
return hash
end
@@ -129,8 +143,6 @@ local function simplify(d,nodefault)
t[k] = v
end
end
---~ print(table.serialize(d,"before"))
---~ print(table.serialize(t,"after"))
return next(t) and t
elseif nodefault then
return nil
@@ -158,21 +170,43 @@ local tags = {
entry = "ctx:registerentry",
}
-function helpers.title(title,metadata) -- brrr
- if title and title ~= "" then
+-- We had the following but it overloads the main document so it's a no-go as we
+-- no longer push and pop. So now we use the tag as buffername, namespace and also
+-- (optionally) as a setups to be applied but keep in mind that document setups
+-- also get applied (when they use #1's).
+--
+-- local command = format("\\xmlprocessbuffer{%s}{%s}{}",metadata.xmlroot or "main",tag)
+
+function helpers.title(title,metadata) -- coding is xml is rather old and not that much needed now
+ if title and title ~= "" then -- so it might disappear
if metadata then
+ local xmlsetup = metadata.xmlsetup
if metadata.coding == "xml" then
- tag = tags[metadata.kind] or tags.generic
- buffers.set(tag,format("<?xml version='1.0'?><%s>%s</%s>",tag,title,tag))
- texsprint(ctxcatcodes,format("\\xmlprocessbuffer{%s}{%s}{}",metadata.xmlroot or "main",tag))
- elseif metadata.xmlsetup then
- texsprint(ctxcatcodes,format("\\xmlsetup{%s}{%s}",title,metadata.xmlsetup)) -- nasty
+ -- title can contain raw xml
+ local tag = tags[metadata.kind] or tags.generic
+ local xmldata = format("<?xml version='1.0'?><%s>%s</%s>",tag,title,tag)
+ buffers.assign(tag,xmldata)
+ if trace_processors then
+ report_processors("putting xml data in buffer: %s",xmldata)
+ report_processors("processing buffer with setup '%s' and tag '%s'",xmlsetup or "",tag)
+ end
+ context.xmlprocessbuffer("dummy",tag,xmlsetup or "")
+ elseif xmlsetup then -- title is reference to node (so \xmlraw should have been used)
+ if trace_processors then
+ report_processors("feeding xmlsetup '%s' using node '%s'",xmlsetup,title)
+ end
+ context.xmlsetup(title,metadata.xmlsetup)
else
local catcodes = metadata.catcodes
---~ print(tex.ctxcatcodes,tex.xmlcatcodes,catcodes,title)
if catcodes == notcatcodes or catcodes == xmlcatcodes then
- texsprint(ctxcatcodes,title) -- nasty
+ if trace_processors then
+ report_processors("cct: %s (overloads %s), txt: %s",ctxcatcodes,catcodes,title)
+ end
+ context(title) -- nasty
else
+ if trace_processors then
+ report_processors("cct: %s, txt: %s",catcodes,title)
+ end
texsprint(catcodes,title)
end
end
@@ -182,9 +216,9 @@ function helpers.title(title,metadata) -- brrr
end
end
--- -- -- processors -- -- -- syntax: processor->data
+-- -- -- processors -- -- -- syntax: processor->data ... not ok yet
-local processors = { } structure.processors = processors
+local processors = structures.processors
local registered = { }
@@ -207,7 +241,7 @@ function processors.split(str)
end
end
-function processors.sprint(catcodes,str,fnc,...)
+function processors.sprint(catcodes,str,fnc,...) -- not ok: mixed
local p, s = lpegmatch(splitter,str)
local code
if registered[p] then
@@ -216,7 +250,7 @@ function processors.sprint(catcodes,str,fnc,...)
code = (fnc and fnc(str,...)) or str
end
if trace_processors then
- logs.report("processors","cct: %s, seq: %s",catcodes,code)
+ report_processors("cct: %s, seq: %s",catcodes,code)
end
texsprint(catcodes,code)
end
@@ -230,14 +264,19 @@ function processors.apply(str)
end
end
+function processors.ignore(str)
+ local p, s = lpegmatch(splitter,str)
+ return s or str
+end
+
-- -- -- sets -- -- --
-structure.sets = structure.sets or { }
-structure.sets.setlist = structure.sets.setlist or { }
+local sets = structures.sets
+
+sets.setlist = sets.setlist or { }
-storage.register("structure/sets/setlist", structure.sets.setlist, "structure.sets.setlist")
+storage.register("structures/sets/setlist", structures.sets.setlist, "structures.sets.setlist")
-local sets = structure.sets
local setlist = sets.setlist
function sets.define(namespace,name,values,default,numbers)
@@ -249,7 +288,7 @@ function sets.define(namespace,name,values,default,numbers)
if values == "" then
dn[name] = { { }, default }
else
- local split = aux.settings_to_array(values)
+ local split = settings_to_array(values)
if numbers then
-- convert to numbers (e.g. for reset)
for i=1,#split do
diff --git a/Master/texmf-dist/tex/context/base/strc-ini.mkiv b/Master/texmf-dist/tex/context/base/strc-ini.mkiv
index 5ed7b423c3a..b1b11d8718a 100644
--- a/Master/texmf-dist/tex/context/base/strc-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-ini.mkiv
@@ -17,12 +17,6 @@
\unprotect
-% \def\zerosection{0}
-% \def\resetsectionmarks{}
-% \setuppagenumbering
-
-% maybe use structurecomponent more consistently as name below
-
% segments: 0:100 2:3 chapter:subsection 3 (=self+2) (alternative: sectionset)
% section : [sectionnumber(s)]
@@ -76,10 +70,10 @@
\unexpanded\def\definestructureconversionset{\dotripleempty\dodefinestructureconversionset}
\unexpanded\def\definestructureprefixset {\dotripleempty\dodefinestructureprefixset}
-\def\dodefinestructureresetset [#1][#2][#3]{\ctxlua{structure.sets.define("structure:resets", "#1","\luaescapestring{\detokenize{#2}}","\luaescapestring{\detokenize{#3}}",true)}}
-\def\dodefinestructureseparatorset [#1][#2][#3]{\ctxlua{structure.sets.define("structure:separators", "#1","\luaescapestring{\detokenize{#2}}","\luaescapestring{\detokenize{#3}}")}}
-\def\dodefinestructureconversionset[#1][#2][#3]{\ctxlua{structure.sets.define("structure:conversions","#1","\luaescapestring{\detokenize{#2}}","\luaescapestring{\detokenize{#3}}")}}
-\def\dodefinestructureprefixset [#1][#2][#3]{\ctxlua{structure.sets.define("structure:prefixes", "#1","\luaescapestring{\detokenize{#2}}","\luaescapestring{\detokenize{#3}}")}}
+\def\dodefinestructureresetset [#1][#2][#3]{\ctxlua{structures.sets.define("structure:resets", "#1","\luaescapestring{\detokenize{#2}}","\luaescapestring{\detokenize{#3}}",true)}}
+\def\dodefinestructureseparatorset [#1][#2][#3]{\ctxlua{structures.sets.define("structure:separators", "#1","\luaescapestring{\detokenize{#2}}","\luaescapestring{\detokenize{#3}}")}}
+\def\dodefinestructureconversionset[#1][#2][#3]{\ctxlua{structures.sets.define("structure:conversions","#1","\luaescapestring{\detokenize{#2}}","\luaescapestring{\detokenize{#3}}")}}
+\def\dodefinestructureprefixset [#1][#2][#3]{\ctxlua{structures.sets.define("structure:prefixes", "#1","\luaescapestring{\detokenize{#2}}","\luaescapestring{\detokenize{#3}}")}}
% \definestructureseparatorset [weird][!,?,*][:] % tex content
% \definestructureconversionset[weird][numbers,characters,romannumerals][numbers] % symbolic names
diff --git a/Master/texmf-dist/tex/context/base/strc-itm.lua b/Master/texmf-dist/tex/context/base/strc-itm.lua
index e776f326d1c..1c7c2adb59e 100644
--- a/Master/texmf-dist/tex/context/base/strc-itm.lua
+++ b/Master/texmf-dist/tex/context/base/strc-itm.lua
@@ -6,10 +6,9 @@ if not modules then modules = { } end modules ['strc-itm'] = {
license = "see context related readme files"
}
-structure = structure or { }
-structure.itemgroups = structure.itemgroups or { }
-
-local itemgroups = structure.itemgroups
+local structures = structures
+local itemgroups = structures.itemgroups
+local jobpasses = job.passes
function itemgroups.register(name,nofitems,maxwidth)
jobpasses.savedata("itemgroup", { nofitems, maxwidth })
diff --git a/Master/texmf-dist/tex/context/base/strc-itm.mkiv b/Master/texmf-dist/tex/context/base/strc-itm.mkiv
index 7207494ed49..67f42f86672 100644
--- a/Master/texmf-dist/tex/context/base/strc-itm.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-itm.mkiv
@@ -15,6 +15,9 @@
\registerctxluafile{strc-itm}{1.001}
+% this will be reimplemented: \startitem ... \stopitem will be the main macros and
+% \item will then call them
+
\unprotect
\newconditional\sublistitem \setfalse\sublistitem
@@ -43,7 +46,7 @@
\newcount\noflistelements
\newcount\itemcolumndepth
\newcount\itemdepth
-\newcount\maxitemdepth \maxitemdepth=6
+% \newcount\maxitemdepth \maxitemdepth=6
\newdimen\itemgrouplistwidth
\newdimen\itemgroupaskedwidth
@@ -59,19 +62,20 @@
\def\dolistreference
{\iftrialtypesetting \else % no need for different treatment of \continuelistitems
- \ctxlua{structure.itemgroups.register("\currentitemgroup",\number\noflistelements,"\getitemparameter\currentitemlevel\c!maxwidth")}%
+ \ctxlua{structures.itemgroups.register("\currentitemgroup",\number\noflistelements,"\getitemparameter\currentitemlevel\c!maxwidth")}%
\fi}
\def\checkcurrentnofitems % we could do this at the lua end and save a call
- {\edef\currentnofitems {\ctxlua{structure.itemgroups.nofitems("\currentitemgroup",\number\currentnoflists)}}%
- \edef\currentitemmaxwidth{\ctxlua{structure.itemgroups.maxwidth("\currentitemgroup",\number\currentnoflists)}\scaledpoint}}
+ {\edef\currentnofitems {\ctxlua{structures.itemgroups.nofitems("\currentitemgroup",\number\currentnoflists)}}%
+ \edef\currentitemmaxwidth{\ctxlua{structures.itemgroups.maxwidth("\currentitemgroup",\number\currentnoflists)}\scaledpoint}}
% todo: \dodosetreference -> \dostructurecountercomponent (to be checked)
\def\dohandleitemreference % we will make a decent number helper
{\ifx\currentitemreference \empty \else
+\iftrialtypesetting \else
\setnextinternalreference
- \ctxlua { jobreferences.setandgetattribute("\s!full", "\referenceprefix","\currentitemreference",
+ \ctxlua {structures.references.setandgetattribute("\s!full", "\referenceprefix","\currentitemreference",
{
metadata = {
kind = "item",% ?
@@ -80,9 +84,9 @@
},
references = {
internal = \nextinternalreference,
- section = structure.sections.currentid(),
+ section = structures.sections.currentid(),
},
- prefixdata = structure.helpers.simplify {
+ prefixdata = structures.helpers.simplify {
prefix = "\structurecounterparameter\currentitemgroupcounter\c!prefix",
separatorset = "\structurecounterparameter\currentitemgroupcounter\c!prefixseparatorset",
conversion = \!!bs\structurecounterparameter\currentitemgroupcounter\c!prefixconversion\!!es,
@@ -92,8 +96,8 @@
% segments = "\askedprefixsegments",
connector = \!!bs\structurecounterparameter\currentitemgroupcounter\c!prefixconnector\!!es,
},
- numberdata = structure.helpers.simplify {
- numbers = structure.counters.compact("\currentitemgroupcounter",nil,true),
+ numberdata = structures.helpers.simplify {
+ numbers = structures.counters.compact("\currentitemgroupcounter",nil,true),
separatorset = "\structurecounterparameter\currentitemgroupcounter\c!numberseparatorset",
conversion = "\structurecounterparameter\currentitemgroupcounter\c!numberconversion",
conversionset = "\structurecounterparameter\currentitemgroupcounter\c!numberconversionset",
@@ -104,10 +108,10 @@
})
}%
\xdef\currentitemattribute{\number\lastdestinationattribute}%
- \begingroup\attribute\destinationattribute\currentitemattribute\kern\zeropoint\endgroup % todo
+ \begingroup\attribute\destinationattribute\currentitemattribute\kern\zeropoint\endgroup % todo, apply attribute to symbol
+\fi
\fi}
-
% \startitemize[n,packed]
% \item test \item test \item test
% \stopitemize
@@ -198,10 +202,11 @@
% so we have:
\def\initializeitemgrouplevel#1%
- {\ifcsname\??op\currentitemgroup#1\s!parent\endcsname
+ {\ifcsname\??op\currentitemgroup\number#1\s!parent\endcsname
% ok
\else
- \setevalue{\??op\currentitemgroup#1\s!parent}{\??op\currentitemgroup}%
+ \setxvalue{\??op\currentitemgroup \c!levels}{\number#1}%
+ \setxvalue{\??op\currentitemgroup\number#1\s!parent}{\??op\currentitemgroup}%
\fi}
\unexpanded\def\defineitemgroup
@@ -211,15 +216,15 @@
{\doifsomething{#1}
{\pushmacro\currentitemgroup
\def\currentitemgroup{#1}%
- \setvalue{\e!start#1}{\startitemgroup[#1]}%
- \setvalue{\e!stop#1}{\stopitemgroup}%
- \setvalue{\e!setup#1\e!endsetup}{\setupitemgroup[#1]}% for old times sake
+ \setuvalue{\e!start#1}{\startitemgroup[#1]}%
+ \setuvalue{\e!stop#1}{\stopitemgroup}%
+ \setuvalue{\e!setup#1\e!endsetup}{\setupitemgroup[#1]}% for old times sake
\doifelsenothing{#2}
{\getparameters[\??op#1][\s!parent=\??oo,#3]}%
{\doifassignmentelse{#2}
{\getparameters[\??op#1][\s!parent=\??oo,#2]}%
{\getparameters[\??op#1][\s!parent=\??op#2,#3]}}%
- \dorecurse\maxitemdepth{\initializeitemgrouplevel\recurselevel}%
+ \dorecurse{\itemparameter\empty\c!levels}{\initializeitemgrouplevel\recurselevel}%
\definestructurecounter[itemgroup:#1]%
\popmacro\currentitemgroup}}
@@ -310,10 +315,13 @@
% \empty
\else
\getitemparameter\currentitemlevel\c!before
- \fi\fi}
+ \fi\fi
+ \dostarttagged\t!itemgroup\currentitemgroup
+ \dotagsetitemize}
\def\itemaftercommand
- {\ifconditional\nowhitelistitem
+ {\dostoptagged
+ \ifconditional\nowhitelistitem
\ifconditional\afterlistitem
\ifcase\currentitemlevel\or\getitemparameter\currentitemlevel\c!after\fi
\else
@@ -352,7 +360,7 @@
\getitemparameter\currentitemlevel\c!afterhead
\fi\fi}
-\def\dododododosetupitemgroup[#1][#2]%
+\unexpanded\def\dododododosetupitemgroup[#1][#2]% prevent expansion below
{\doifassignmentelse{#2}%
{\dosetupitemgroupvariable[#1][#2]}%
{\setitemparameter{#1}\c!option{#2}}}%
@@ -360,19 +368,8 @@
\def\dodododosetupitemgroup[#1][#2]%
{\doifsomething{#2}
{\doifelse{#1}\v!each
- {\dorecurse\maxitemdepth{\normalexpanded{\noexpand\dododododosetupitemgroup[\recurselevel]}[#2]}}
- {\normalexpanded{\noexpand\dododododosetupitemgroup[#1]}[#2]}}}
-
-% \def\dododosetupitemgroup[#1][#2]%
-% {\doifelsenothing{#2}
-% {\doifelsenothing{#1}
-% {\dodododosetupitemgroup[\currentitemlevel][#2]}
-% {\dodododosetupitemgroup[#1][#2]}}
-% {\ifcase\currentitemlevel\relax
-% \dodododosetupitemgroup[\v!each][#1]%
-% \else
-% \dodododosetupitemgroup[\currentitemlevel][#1]%
-% \fi}}
+ {\dorecurse{\itemparameter\empty\c!levels}{\normalexpanded{\dododododosetupitemgroup[\recurselevel]}[#2]}}
+ {\normalexpanded{\dododododosetupitemgroup[#1]}[#2]}}}
\def\dododosetupitemgroup[#1][#2]%
{\doifelsenothing{#2}
@@ -531,13 +528,8 @@
\def\dodostartitemgroup[#1]% [#2]%
{\relax % prevents lookahead
- \ifnum\currentitemlevel=\maxitemdepth\relax
- \showmessage\m!layouts9{\number\maxitemdepth}%
- \let\itemincrement\zerocount
- \else
- \let\itemincrement\plusone
- \fi
- \global\advance\itemdepth\itemincrement
+ \global\advance\itemdepth\plusone
+ \initializeitemgrouplevel\itemdepth
\xdef\currentitemlevel{\number\itemdepth}%
\edef\itemgroupoptions{\getitemparameter\currentitemlevel\c!option}%
\ifx\itemgroupoptions\empty
@@ -575,7 +567,7 @@
\@EA\long\@EA\def\@EA\collectitemgroupitem\@EA#\@EA1\csname\e!stop\v!item\endcsname
{\increment\itemcollectcounter
- \long\setvalue{\v!item*\itemcollectcounter}{\item#1\par}}
+ \long\setvalue{\v!item*\itemcollectcounter}{\startitemgroupitem#1\stopitemgroupitem}}
\def\flushcollecteditems
{\ifconditional\randomizeitems
@@ -622,6 +614,8 @@
\let\currentitemindenting\empty
+\let\dotagsetitemize\relax
+
\def\redostartitemgroup[#1][#2]%
{\setfalse\inlinelistitem % new, no indent (leftskip)
\setfalse\concatnextitem % new, concat
@@ -649,6 +643,9 @@
\doifinsetelse\v!random {#1}{\settrue\randomizeitems }{\setfalse\randomizeitems }%
\doifinsetelse\v!continue{#1}{\settrue\continuelistitems}{\setfalse\continuelistitems}%
% == \doifinsetelse\v!intro{#1}\settrue\setfalse\introlistitem
+\iftrialtypesetting
+ \savestructurecounter[\currentitemgroupcounter]%[\currentitemlevel]% todo: per level
+\fi
\global\advance\noflists\plusone
\currentnoflists\noflists
\noflistelements\zerocount
@@ -761,6 +758,11 @@
% \item \input ward \item \input ward \item \input ward
% \stopitemize \blank
+\def\dorestoreitemgroup
+ {\restorestructurecounter[\currentitemgroupcounter]% [\currentitemlevel]% todo: per level
+ \global\advance\noflists\minusone
+ \currentnoflists\noflists}
+
\unexpanded\def\stopitemgroup
{\stopcollectitems
\ifconditional\textlistitem
@@ -769,7 +771,12 @@
\par
\fi
\dolistreference
- \ifconditional\firstlistitem \else \endgroup \fi % toegevoegd, eerste \som opent groep
+ \ifconditional\firstlistitem
+ \else
+ \dostoptagged
+ \dostoptagged
+ \endgroup
+ \fi % toegevoegd, eerste \som opent groep
\ifnum\itemcolumndepth=\currentitemlevel\relax
\stopcolumns
\global\itemcolumndepth\zerocount
@@ -791,14 +798,17 @@
\fi
\fi
% new test, needed in sidefloats (surfaced in volker's proceedings)
+\iftrialtypesetting
+ \dorestoreitemgroup
+\fi
\ifconditional\textlistitem % else forgotten
\endgroup
- \global\advance\itemdepth-\itemincrement
+ \global\advance\itemdepth-\plusone
\xdef\currentitemlevel{\number\itemdepth}%
\egroup
\else
\endgroup
- \global\advance\itemdepth-\itemincrement
+ \global\advance\itemdepth-\plusone
\xdef\currentitemlevel{\number\itemdepth}%
\egroup
\par
@@ -889,14 +899,33 @@
%
% so we need to keep that property
+\let\startitemgroupitem\itemgroupitem
+
+\def\stopitemgroupitem
+ {\ifconditional\textlistitem
+ % nothing
+ \else
+ \endgraf
+ \fi}
+
+\def\startitemgroupitemhead#1%
+ {\itemgrouphead#1\par}
+
+\def\stopitemgroupitemhead
+ {\ifconditional\textlistitem
+ % to be tested
+ \else
+ \endgraf
+ \fi}
+
\appendtoks
- \letvalue{\e!start\v!item}\itemgroupitem
- \letvalue{\e!stop \v!item}\endgraf
+ \letvalue{\e!start\v!item}\startitemgroupitem
+ \letvalue{\e!stop \v!item}\stopitemgroupitem
\to \itemgroupcommands
\appendtoks
- \setvalue{\e!start\v!head}#1{\itemgrouphead#1\par}%
- \letvalue{\e!stop \v!head}\endgraf
+ \letvalue{\e!start\v!head}\startitemgroupitemhead
+ \letvalue{\e!stop \v!head}\stopitemgroupitemhead
\to \itemgroupcommands
% \startitemize
@@ -1043,15 +1072,15 @@
\fi
\ifdim\currentitemmaxwidth>\zeropoint
\setbox\itemgroupitembox\simplealignedbox
- {\getitemparameter\currentitemlevel\c!itemalign}
{\dimexpr\currentitemmaxwidth+\getitemparameter\currentitemlevel\c!distance\relax}
+ {\getitemparameter\currentitemlevel\c!itemalign}
{\box\itemgroupitembox\hskip\getitemparameter\currentitemlevel\c!distance}%
\fi
\else\ifdim\itemgroupaskedwidth>\zeropoint
\doifsomething{\getitemparameter\currentitemlevel\c!itemalign}
{\setbox\itemgroupitembox\simplealignedbox
- {\getitemparameter\currentitemlevel\c!itemalign}
{\dimexpr\itemgroupaskedwidth+\getitemparameter\currentitemlevel\c!distance\relax}
+ {\getitemparameter\currentitemlevel\c!itemalign}
{\box\itemgroupitembox\hskip\getitemparameter\currentitemlevel\c!distance}}%
\fi\fi
\globallet\doitemdestination\empty
@@ -1140,7 +1169,10 @@
% \setupitemize[each][atmargin][width=3em]
% \startitemize[n,repeat,packed] \getbuffer \stopitemize
-\chardef\autoitemgroupspacing=2 % 0 = voor/na, 1=tussen als geen voor 2=(prev)tussen=old/normal
+\setnewconstant\autoitemgroupspacing\plustwo % 0 = voor/na, 1=tussen als geen voor 2=(prev)tussen=old/normal
+
+% todo: assume startitem ... stopitem and do an autostopitem .. cleaner for
+% elements
\def\complexdoitemgroupitem[#1]%
{\def\currentitemreference{#1}%
@@ -1176,6 +1208,8 @@
\fi
\fi
\else
+\dostoptagged
+\dostoptagged
\ifconditional\textlistitem % was bugged: \inlinelistitem
\ifhmode
% WS: make the distance between items customizable, think about better default values -> see itemize-1.tex
@@ -1190,7 +1224,10 @@
\vskip-\dimexpr\lastskip+\lineheight\relax
\nobreak
\fi
+\dostarttagged\t!item\empty
+\dostarttagged\t!itemtag\empty
\dolistitem
+\dostoptagged
\relax
\ifconditional\packlistitem
\setupwhitespace[\v!none]%
@@ -1198,6 +1235,7 @@
\getitemparameter\currentitemlevel\c!inner
\marsymbol
\let\marsymbol\relax
+\dostarttagged\t!itemcontent\empty
\strut % added 11-08-99
\setfalse\concatnextitem % new, concat
\nobreak % else problems with intext items
@@ -1242,19 +1280,23 @@
% \item {test} is this okay?
% \stopitemize
-\def\complexitem[#1]#2\par % todo: no two pass data
- {\startitemgroup[#1]%
- \complexdoitemgroupitem[]\begstrut#2\endstrut\par
+% \def\complexitem[#1]#2\par % todo: no two pass data
+% {\startitemgroup[#1]%
+% \complexdoitemgroupitem[]\begstrut#2\endstrut\par
+% \stopitemgroup}
+
+\def\complexitem[#1]#2\par
+ {\doifsomethingelse{#1}{\startitemgroup[#1]}{\startitemgroup[\v!itemize]}%
+ \startitem#2\stopitem
\stopitemgroup}
+\setvalue{\e!start\v!item}%
+ {\startitemgroup[\v!itemize]\startitem
+ \setvalue{\e!stop \v!item}{\endgraf\stopitemgroup}} % inside, else overloaded
+
\definecomplexorsimpleempty\item
\definecomplexorsimpleempty\doitemgroupitem
-\def\complexhead[#1]#2\par#3\par
- {\startitemgroup[#1]%
- \complexdoitemgrouphead[]\begstrut#2\endstrut\par\begstrut#3\endstrut\par
- \stopitemgroup}
-
% the next solution accepts \head test \type{x{x}x} test ...
\let\doenditemhead\relax
@@ -1291,7 +1333,7 @@
\def\sym#1%
{\noindent
\begingroup
- \setbox\scratchbox\hbox{\trialtypesettingtrue#1}%
+ \setbox\scratchbox\hbox{\settrialtypesetting#1}%
\setbox\scratchbox\hbox
\ifdim\wd\scratchbox<1em to 1.5\else spread 1\fi em{#1\hfil}%
\normalexpanded{\box\scratchbox\endgroup\hangindent\the\wd\scratchbox}%
@@ -1328,6 +1370,7 @@
%\c!inner=,
\c!n=2,
\c!items=4,
+ \c!levels=10,
\c!lefttext=(,
\c!righttext=),
\c!start=1,
diff --git a/Master/texmf-dist/tex/context/base/strc-lev.lua b/Master/texmf-dist/tex/context/base/strc-lev.lua
new file mode 100644
index 00000000000..ff30c3f91ad
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/strc-lev.lua
@@ -0,0 +1,46 @@
+if not modules then modules = { } end modules ['strc-lev'] = {
+ version = 1.001,
+ comment = "companion to strc-lev.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+local insert, remove = table.insert, table.remove
+
+local sections = structures.sections
+local default = interfaces.variables.default
+
+sections.levels = sections.levels or { }
+
+local level, levels, categories = 0, sections.levels, { }
+
+storage.register("structures/sections/levels", levels, "structures.sections.levels")
+
+function sections.defineautolevels(category,list)
+ levels[category] = utilities.parsers.settings_to_array(list)
+end
+
+function sections.startautolevel(category)
+ category = category ~= "" and category or default
+ level = level + 1
+ local lc = levels[category]
+ if not lc or level > #lc then
+ context.nostartstructurehead { format("%s:%s",category,level) }
+ else
+ context.dostartstructurehead { lc[level] }
+ end
+ insert(categories,category)
+end
+
+function sections.stopautolevel()
+ local category = remove(categories)
+ local lc = levels[category]
+ if not lc or level > #lc then
+ context.nostopstructurehead { format("%s:%s",category,level) }
+ else
+ context.dostopstructurehead { lc[level] }
+ end
+ level = level - 1
+end
diff --git a/Master/texmf-dist/tex/context/base/strc-lev.mkiv b/Master/texmf-dist/tex/context/base/strc-lev.mkiv
new file mode 100644
index 00000000000..4c4605bcd14
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/strc-lev.mkiv
@@ -0,0 +1,92 @@
+%D \module
+%D [ file=strc-lev,
+%D version=2010.09.23,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Automatic Levels,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE / Hans Hagen]
+%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 Structure Macros / Automatic Levels}
+
+%D This module is the result of a discussion between Alan Braslau and
+%D me. I used to have a private (\MKII) module for this but the new
+%D structure code in \MKIV\ is more suitable for this so now we have
+%D it as core functionality. For the moment this an experiment that
+%D Alan and I conduct so it might evolve.
+
+\registerctxluafile{strc-lev}{1.001}
+
+\unprotect
+
+\unexpanded\def\definestructurelevels{\dodoubleargument\dodefinestructurelevels}
+\unexpanded\def\startstructurelevel {\dosingleempty\dostartstructurelevel}
+
+\unexpanded\def\dodefinestructurelevels[#1][#2]{\ctxlua{structures.sections.defineautolevels("#1","#2")}}
+\unexpanded\def\dostartstructurelevel [#1]{\ctxlua{structures.sections.startautolevel("#1")}}
+\unexpanded\def\stopstructurelevel {\ctxlua{structures.sections.stopautolevel()}}
+
+\unexpanded\def\nostartstructurehead{\dotripleargument\nonostartstructurehead}
+\unexpanded\def\nostopstructurehead {\dosingleargument\nonostopstructurehead }
+
+\unexpanded\def\dostartstructurelevel[#1]%
+ {\doifassignmentelse{#1}
+ {\ctxlua{structures.sections.startautolevel("\v!default")}[#1]}
+ {\ctxlua{structures.sections.startautolevel("#1")}}}
+
+\unexpanded\def\nonostartstructurehead[#1][#2][#3]%
+ {\blank
+ \noindentation{\tttf[start missing structure level #1]}
+ \blank}
+
+\unexpanded\def\nonostopstructurehead[#1]%
+ {\blank
+ \noindentation{\tttf[stop missing structure level #1]}
+ \blank}
+
+\definestructurelevels
+ [\v!default]
+ [\v!chapter,
+ \v!section,
+ \v!subsection,
+ \v!subsubsection,
+ \v!subsubsubsection,
+ \v!subsubsubsubsection]
+
+\protect \endinput
+
+% \starttext
+
+% \definehead[xxxxxxsection][subsubsection]
+% \setuphead [xxxxxxsection][color=red]
+
+% \definestructurelevels[main][chapter,section,subsection,subsubsection]
+% \definestructurelevels[next][chapter,section,subsection,xxxxxxsection]
+
+% \startstructurelevel [main] [title=first top level]
+
+% \startstructurelevel [main] [title=first lower level]
+% \startstructurelevel [main] [title=second lower level]
+% \startstructurelevel [main] [title=third lower level]
+% test
+% \stopstructurelevel
+% \stopstructurelevel
+% \stopstructurelevel
+
+% \startstructurelevel [main] [title=first lower level]
+% \startstructurelevel [main] [title=second lower level]
+% \startstructurelevel [next] [title=third lower level]
+% test
+% \stopstructurelevel
+% \stopstructurelevel
+% \stopstructurelevel
+
+% \stopstructurelevel
+
+
+% \stoptext
+
diff --git a/Master/texmf-dist/tex/context/base/strc-lnt.mkiv b/Master/texmf-dist/tex/context/base/strc-lnt.mkiv
index 0df44294bdd..442a9378fb6 100644
--- a/Master/texmf-dist/tex/context/base/strc-lnt.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-lnt.mkiv
@@ -17,13 +17,13 @@
\unprotect
-\newcounter\linenotecounter \newif\iftracelinenotes % will be tracker
+\newcount\noflinenotes \newif\iftracelinenotes % will be tracker
\def\dohandlelinenote#1#2#3%
{\bgroup
\def\linenotelinenumber##1{\inlinerange[#2]}% ##1 == order
- \setupnote[ln:#1][\c!numbercommand=\linenotelinenumber,\c!textcommand=\gobbleoneargument]% todo: deep hook
- \setnote[ln:#1]{#3}%
+ \setupnote[#1][\c!numbercommand=\linenotelinenumber,\c!textcommand=\gobbleoneargument]% todo: deep hook
+ \getvalue{\??vn:ln:#1}{#3}%
\egroup}
\def\dotracedlinenote#1%
@@ -32,7 +32,7 @@
{\forgetall
\hsize\zeropoint
\hss
- \vbox to \strutheight{\llap{\red\infofont\setstrut\linenotecounter}\vss}%
+ \vbox to \strutheight{\llap{\red\infofont\setstrut\the\noflinenotes}\vss}%
{\color[blue]{\vl}}%
\vbox to \strutheight{\rlap{\red\infofont\setstrut#1}\vss}%
\hss}%
@@ -40,13 +40,13 @@
\fi}
\def\dolinenote#1#2%
- {\doglobal\increment\linenotecounter
- \dohandlelinenote{#1}{\linenotecounter}{#2}%
+ {\global\advance\noflinenotes\plusone
+ \dohandlelinenote{#1}{\the\noflinenotes}{#2}%
\dotracedlinenote\empty
- \expanded{\someline[\linenotecounter]}}
+ \normalexpanded{\someline[\the\noflinenotes]}}
\def\dostartlinenote#1[#2]#3%
- {\doglobal\increment\linenotecounter
+ {\global\advance\noflinenotes\plusone
\dohandlelinenote{#1}{#2}{#3}%
\dotracedlinenote{#2}%
\startline[#2]}
@@ -55,68 +55,69 @@
{\stopline[#2]}
\unexpanded\def\definelinenote
- {\dodoubleempty\dodefinelinenote}
+ {\dotripleempty\dodefinelinenote}
-\def\dodefinelinenote[#1][#2]%
- {\definenote[ln:#1][#2]%
+\def\dodefinelinenote[#1][#2][#3]%
+ {\dodefinenote[#1][#2][#3]% do as we need to test for arguments
+ \expandafter\let\csname\??vn:ln:#1\expandafter\endcsname\csname#1\endcsname % use copy command
\setuvalue {#1}{\dolinenote {#1}}%
\setuvalue{\e!start#1}{\dostartlinenote{#1}}%
\setuvalue{\e!stop #1}{\dostoplinenote {#1}}}
-\unexpanded\def\setuplinenote[#1]% convenient
- {\setupnote[ln:#1]}
+\let\setuplinenote\setupnote
% We predefine one, namely \type {\linenote} cum suis.
\definelinenote[\v!linenote]
+% beware: line numbers are added later on so grouping setups is a bad idea
+%
% \startbuffer[test]
% \startlinenumbering[100]
-% test \linenote {oeps} test test test test test test
-% test \startlinenote [well] {oeps} test test test test test test
-% test \linenote {oeps} test test test test test test
-% test \linenote {oeps} test test test test test test
-% test \linenote {oeps} test test test test test test
-% test \linenote {oeps} test test test test test test
+% test \linenote {oeps 1} test test test test test test
+% test \startlinenote [well] {oeps X} test test test test test test
+% test \linenote {oeps 2} test test test test test test
+% test \linenote {oeps 3} test test test test test test
+% test \linenote {oeps 4} test test test test test test
+% test \linenote {oeps 5} test test test test test test
% test \stoplinenote [well] test test test test test test
% \stoplinenumbering
% \stopbuffer
%
-% \setupnotedefinition[linenote] [location=serried,distance=.5em]
-%
-% {\typebuffer[test] \getbuffer[test]} \page
+% \typebuffer[test] \getbuffer[test] \page
%
% \startbuffer[setup]
% \setuplinenumbering
-% [align=left]
+% [align=flushleft]
% \stopbuffer
%
-% {\typebuffer[setup] \getbuffer[setup,test]} \page
+% \typebuffer[setup] \getbuffer[setup,test] \page
%
% \startbuffer[setup]
% \setuplinenumbering
-% [width=1em,
-% align=left]
+% [width=4em,
+% distance=1em,
+% align=flushright]
% \stopbuffer
%
-% {\typebuffer[setup] \getbuffer[setup,test]} \page
+% \typebuffer[setup] \getbuffer[setup,test] \page
%
% \startbuffer[setup]
% \setuplinenumbering
-% [width=2em,
-% distance=.5em,
-% align=left]
+% [width=4em,
+% align=flushleft]
% \stopbuffer
%
-% {\typebuffer[setup] \getbuffer[setup,test]} \page
+% \typebuffer[setup] \getbuffer[setup,test] \page
%
% \startbuffer[setup]
% \setuplinenumbering
% [width=2em,
+% distance=.5em,
% align=middle]
% \stopbuffer
%
-% {\typebuffer[setup] \getbuffer[setup,test]} \page
+% \typebuffer[setup] \getbuffer[setup,test] \page
%
% \startbuffer[setup]
% \setuplinenumbering
@@ -129,7 +130,7 @@
% width=1.5em]
% \stopbuffer
%
-% {\typebuffer[setup] \startnarrower\getbuffer[setup,test]\stopnarrower} \page
+% \typebuffer[setup] \getbuffer[setup] \startnarrower\getbuffer[test]\stopnarrower \page
%
% \startbuffer[setup]
% \setuplinenumbering
@@ -139,7 +140,7 @@
% align=middle]
% \stopbuffer
%
-% {\typebuffer[setup] \getbuffer[setup,test]} \page
+% \typebuffer[setup] \getbuffer[setup,test] \page
%
% \startbuffer[setup-1]
% \setuplinenumbering
@@ -159,7 +160,7 @@
% {#1}}
% \stopbuffer
%
-% {\typebuffer[setup-1,setup-2] \getbuffer[setup-1,setup-2,test]} \page
+% \typebuffer[setup-1,setup-2] \getbuffer[setup-1,setup-2,test] \page
%
% \startbuffer[setup-1]
% \setuplinenumbering
@@ -168,6 +169,6 @@
% command=\WatchThis]
% \stopbuffer
%
-% {\typebuffer[setup-1] \getbuffer[setup-1,setup-2,test]} \page
+% \typebuffer[setup-1] \getbuffer[setup-1,setup-2,test] \page
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/strc-lst.lua b/Master/texmf-dist/tex/context/base/strc-lst.lua
index fefbe52ce29..21015e43a21 100644
--- a/Master/texmf-dist/tex/context/base/strc-lst.lua
+++ b/Master/texmf-dist/tex/context/base/strc-lst.lua
@@ -16,37 +16,67 @@ local tonumber = tonumber
local texsprint, texprint, texwrite, texcount = tex.sprint, tex.print, tex.write, tex.count
local concat, insert, remove = table.concat, table.insert, table.remove
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 trace_lists = false trackers.register("structure.lists", function(v) trace_lists = v end)
+local trace_lists = false trackers.register("structures.lists", function(v) trace_lists = v end)
-local ctxcatcodes = tex.ctxcatcodes
+local report_lists = logs.reporter("structure","lists")
-structure.lists = structure.lists or { }
-structure.sections = structure.sections or { }
-structure.helpers = structure.helpers or { }
-structure.documents = structure.documents or { }
-structure.pages = structure.pages or { }
+local ctxcatcodes = tex.ctxcatcodes
-local lists = structure.lists
-local sections = structure.sections
-local helpers = structure.helpers
-local documents = structure.documents
-local pages = structure.pages
+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 references = structures.references
-lists.collected = lists.collected or { }
-lists.tobesaved = lists.tobesaved or { }
-lists.enhancers = lists.enhancers or { }
-lists.internals = lists.internals or { }
-lists.ordered = lists.ordered or { }
+local collected = allocate()
+local tobesaved = allocate()
+local cached = allocate()
+local pushed = allocate()
+
+lists.collected = collected
+lists.tobesaved = tobesaved
+
+lists.enhancers = lists.enhancers or { }
+lists.internals = allocate(lists.internals or { }) -- to be checked
+lists.ordered = allocate(lists.ordered or { }) -- to be checked
+lists.cached = cached
+lists.pushed = pushed
+
+references.specials = references.specials or { }
local variables = interfaces.variables
-local matching_till_depth, number_at_depth = sections.matching_till_depth, sections.number_at_depth
+local matchingtilldepth, numberatdepth = sections.matchingtilldepth, sections.numberatdepth
+
+-- -- -- -- -- --
+
+local function zerostrippedconcat(t,separator) -- for the moment not public
+ local f, l = 1, #t
+ for i=f,l do
+ if t[i] == 0 then
+ f = f + 1
+ end
+ end
+ for i=l,f,-1 do
+ if t[i] == 0 then
+ l = l - 1
+ end
+ end
+ return concat(t,separator,f,l)
+end
+
+-- -- -- -- -- --
local function initializer()
-- create a cross reference between internal references
-- and list entries
local collected = lists.collected
- local internals = jobreferences.internals
+ local internals = checked(references.internals)
local ordered = lists.ordered
for i=1,#collected do
local c = collected[i]
@@ -77,13 +107,10 @@ local function initializer()
end
end
-if job then
- job.register('structure.lists.collected', structure.lists.tobesaved, initializer)
-end
-
-local cached, pushed = { }, { }
+job.register('structures.lists.collected', tobesaved, initializer)
function lists.push(t)
+ local m = t.metadata
local r = t.references
local i = (r and r.internal) or 0 -- brrr
local p = pushed[i]
@@ -105,21 +132,49 @@ function lists.enhance(n)
-- todo: symbolic names for counters
local l = cached[n]
if l then
+ local metadata = l.metadata
+ local references = l.references
--
l.directives = nil -- might change
-- save in the right order (happens at shipout)
lists.tobesaved[#lists.tobesaved+1] = l
-- default enhancer (cross referencing)
- l.references.realpage = texcount.realpageno
+ references.realpage = texcount.realpageno
+ -- tags
+ local kind = metadata.kind
+ local name = metadata.name
+ if references then
+ references.tag = tags.getid(kind,name)
+ end
-- specific enhancer (kind of obsolete)
- local kind = l.metadata.kind
local enhancer = kind and lists.enhancers[kind]
if enhancer then
enhancer(l)
end
+ return l
end
end
+--~ function lists.enforce(n)
+--~ -- todo: symbolic names for counters
+--~ local l = cached[n]
+--~ if l then
+--~ --
+--~ l.directives = nil -- might change
+--~ -- save in the right order (happens at shipout)
+--~ lists.tobesaved[#lists.tobesaved+1] = l
+--~ -- default enhancer (cross referencing)
+--~ l.references.realpage = texcount.realpageno
+--~ -- specific enhancer (kind of obsolete)
+--~ local kind = l.metadata.kind
+--~ local enhancer = kind and lists.enhancers[kind]
+--~ if enhancer then
+--~ enhancer(l)
+--~ end
+--~ return l
+--~ end
+--~ end
+
-- we can use level instead but we can also decide to remove level from the metadata
local nesting = { }
@@ -139,17 +194,55 @@ end
-- will be split
-local function filter_collected(names, criterium, number, collected, nested)
+-- 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(":")
+
+-- this will become filtercollected(specification) and then we'll also have sectionblock as key
+
+local sorters = {
+ [variables.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)
+ return a.references.internal < b.references.internal
+ end,
+}
+
+-- some day soon we will pass a table
+
+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 hash, result, all, detail = { }, { }, not names or names == "" or names == variables.all, nil
- names, criterium = gsub(names," ",""), gsub(criterium," ","")
- if trace_lists then
- logs.report("lists","filtering names: %s, criterium: %s, number: %s",names,criterium,number or "-")
+ local result, nofresult, detail = { }, 0, nil
+ local block = false -- all
+ criterium = gsub(criterium or ""," ","") -- not needed
+ -- new, will be applied stepwise
+ local wantedblock, wantedcriterium = lpegmatch(splitter,criterium) -- block:criterium
+ if not wantedcriterium then
+ block = documents.data.block
+ elseif wantedblock == "" or wantedblock == variables.all or wantedblock == variables.text then
+ criterium = wantedcriterium ~= "" and wantedcriterium or criterium
+ else
+ block, criterium = wantedblock, wantedcriterium
end
- if not all then
- for s in gmatch(names,"[^, ]+") do -- sort of settings to hash
- hash[s] = true
- end
+ 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)
+ end
+ local all = not next(names) or names[variables.all] or false
+ if trace_lists then
+ report_lists("filtering names: %s, criterium: %s, block: %s, number: %s",
+ simple_hash_to_string(names),criterium,block or "*", number or "-")
end
if criterium == variables.intro then
-- special case, no structure yet
@@ -157,37 +250,40 @@ local function filter_collected(names, criterium, number, collected, nested)
local v = collected[i]
local r = v.references
if r and r.section == 0 then
- result[#result+1] = v
+ nofresult = nofresult + 1
+ result[nofresult] = v
end
end
- elseif criterium == variables.all or criterium == variables.text then
+ 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 then
- local sectionnumber = (r.section == 0) or jobsections.collected[r.section]
- if sectionnumber then -- and not sectionnumber.hidenumber then
- local metadata = v.metadata
- if metadata and not metadata.nolist and (all or hash[metadata.name or false]) then
- result[#result+1] = v
+ 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 filter_collected(names,variables.intro,number,collected)
+ 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
- local sectionnumber = jobsections.collected[r.section]
+ 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 hash[metadata.name or false]) and #cnumbers > depth 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]
@@ -197,7 +293,8 @@ local function filter_collected(names, criterium, number, collected, nested)
end
end
if ok then
- result[#result+1] = v
+ nofresult = nofresult + 1
+ result[nofresult] = v
end
end
end
@@ -208,19 +305,19 @@ local function filter_collected(names, criterium, number, collected, nested)
elseif criterium == variables.here then
-- this is quite dirty ... as cnumbers is not sparse we can misuse #cnumbers
if depth == 0 then
- return filter_collected(names,variables.intro,number,collected)
+ 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
- local sectionnumber = jobsections.collected[r.section]
+ 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
---~ print(#cnumbers, depth, table.concat(cnumbers))
- if metadata and not metadata.nolist and (all or hash[metadata.name or false]) and #cnumbers >= depth then
+--~ print(#cnumbers, depth, concat(cnumbers))
+ 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]
@@ -230,7 +327,8 @@ local function filter_collected(names, criterium, number, collected, nested)
end
end
if ok then
- result[#result+1] = v
+ nofresult = nofresult + 1
+ result[nofresult] = v
end
end
end
@@ -240,18 +338,18 @@ local function filter_collected(names, criterium, number, collected, nested)
end
elseif criterium == variables.previous then
if depth == 0 then
- return filter_collected(names,variables.intro,number,collected)
+ 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
- local sectionnumber = jobsections.collected[r.section]
+ 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 hash[metadata.name or false]) and #cnumbers >= depth 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]
@@ -261,7 +359,8 @@ local function filter_collected(names, criterium, number, collected, nested)
end
end
if ok then
- result[#result+1] = v
+ nofresult = nofresult + 1
+ result[nofresult] = v
end
end
end
@@ -272,16 +371,16 @@ local function filter_collected(names, criterium, number, collected, nested)
elseif criterium == variables["local"] then -- not yet ok
local nested = nesting[#nesting]
if nested then
- return filter_collected(names,nested.name,nested.number,collected,nested)
+ return filtercollected(names,nested.name,nested.number,collected,forced,nested,sortorder)
elseif sections.autodepth(documents.data.numbers) == 0 then
- return filter_collected(names,variables.all,number,collected)
+ return filtercollected(names,variables.all,number,collected,forced,false,sortorder)
else
- return filter_collected(names,variables.current,number,collected)
+ return filtercollected(names,variables.current,number,collected,forced,false,sortorder)
end
else -- sectionname, number
-- not the same as register
local depth = sections.getlevel(criterium)
- local number = tonumber(number) or number_at_depth(depth) or 0
+ 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)
@@ -291,14 +390,15 @@ local function filter_collected(names, criterium, number, collected, nested)
for i=1,#collected do
local v = collected[i]
local r = v.references
- if r then
- local sectionnumber = jobsections.collected[r.section]
+ if r then -- block ?
+ local sectionnumber = sections.collected[r.section]
if sectionnumber then
local metadata = v.metadata
local cnumbers = sectionnumber.numbers
if cnumbers then
- if (all or hash[metadata.name or false]) and #cnumbers >= depth and matching_till_depth(depth,cnumbers,parent) then
- result[#result+1] = v
+ if (all or names[metadata.name or false]) and #cnumbers >= depth and matchingtilldepth(depth,cnumbers,parent) then
+ nofresult = nofresult + 1
+ result[nofresult] = v
end
end
end
@@ -308,34 +408,58 @@ local function filter_collected(names, criterium, number, collected, nested)
end
if trace_lists then
if detail then
- logs.report("lists","criterium: %s, %s, found: %s",criterium,detail,#result)
+ report_lists("criterium: %s, block: %s, %s, found: %s",criterium,block or "*",detail,#result)
else
- logs.report("lists","criterium: %s, found: %s",criterium,#result)
+ report_lists("criterium: %s, block: %s, found: %s",criterium,block or "*",#result)
+ end
+ end
+
+ if sortorder then -- experiment
+ local sorter = sorters[sortorder]
+ if sorter then
+ if trace_lists then
+ report_lists("sorting list using method %s",sortorder)
+ end
+ for i=1,#result do
+ result[i].references.order = i
+ end
+ table.sort(result,sorter)
end
end
+
return result
end
-lists.filter_collected = filter_collected
-
-function lists.filter(names, criterium, number)
- return filter_collected(names, criterium, number, lists.collected)
+lists.filtercollected = filtercollected
+
+function lists.filter(specification)
+ return filtercollected(
+ specification.names,
+ specification.criterium,
+ specification.number,
+ lists.collected,
+ specification.forced,
+ false,
+ specification.order
+ )
end
lists.result = { }
-function lists.process(...)
- lists.result = lists.filter(...)
+function lists.process(specification)
+ lists.result = lists.filter(specification)
+ local specials = utilities.parsers.settings_to_hash(specification.extras or "")
+ specials = next(specials) and specials or nil
for i=1,#lists.result do
local r = lists.result[i]
local m = r.metadata
- texsprint(ctxcatcodes,format("\\processlistofstructure{%s}{%s}{%i}",m.name,m.kind,i))
---~ context.processlistofstructure(m.name,m.kind,i)
+ local s = specials and r.numberdata and specials[zerostrippedconcat(r.numberdata.numbers,".")] or ""
+ context.processlistofstructure(m.name,m.kind,i,s)
end
end
-function lists.analyze(...)
- lists.result = lists.filter(...)
+function lists.analyze(specification)
+ lists.result = lists.filter(specification)
end
function lists.userdata(name,r,tag) -- to tex (todo: xml)
@@ -365,9 +489,17 @@ function lists.location(n)
texsprint(l.references.internal or n)
end
+function lists.label(n,default)
+ local l = lists.result[n]
+ local t = l.titledata
+ if t then
+ texsprint(t.label or default or "")
+ end
+end
+
function lists.sectionnumber(name,n,spec)
local data = lists.result[n]
- local sectiondata = jobsections.collected[data.references.section]
+ local sectiondata = sections.collected[data.references.section]
-- hm, prefixnumber?
sections.typesetnumber(sectiondata,"prefix",spec,sectiondata) -- data happens to contain the spec too
end
@@ -390,7 +522,6 @@ function lists.savedtitle(name,n,tag)
local titledata = data.titledata
if titledata then
helpers.title(titledata[tag] or titledata.title or "",data.metadata)
---~ texsprint(ctxcatcodes,titledata[tag] or titledata.title or "")
end
end
end
@@ -411,7 +542,6 @@ function lists.savedprefixednumber(name,n)
helpers.prefix(data,data.prefixdata)
local numberdata = data.numberdata
if numberdata then
---~ print(name,n,table.serialize(numberdata))
sections.typesetnumber(numberdata,"number",numberdata or false)
end
end
@@ -469,7 +599,7 @@ end
local splitter = lpeg.splitat(":")
-function jobreferences.specials.order(var,actions) -- jobreferences.specials !
+function references.specials.order(var,actions) -- references.specials !
local operation = var.operation
if operation then
local kind, name, n = lpegmatch(splitter,operation)
@@ -480,7 +610,7 @@ function jobreferences.specials.order(var,actions) -- jobreferences.specials !
if r then
actions.realpage = r
var.operation = r -- brrr, but test anyway
- return jobreferences.specials.page(var,actions)
+ return references.specials.page(var,actions)
end
end
end
diff --git a/Master/texmf-dist/tex/context/base/strc-lst.mkiv b/Master/texmf-dist/tex/context/base/strc-lst.mkiv
index 413052882e5..c2be8338a45 100644
--- a/Master/texmf-dist/tex/context/base/strc-lst.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-lst.mkiv
@@ -70,31 +70,55 @@
\def\structurelistinject{\dotripleempty\dostructurelistinject}
-\def\dostructurelistinject[#1][#2][#3]%
+\def\dostructurelistinject[#1]% [#2][#3]% no check on nofarguments here
{\begingroup
- \edef\currentlistname{#1}%
+ \edef\currentlist{#1}%
+ \doifelse{\listparameter\c!state}\v!start\dodostructurelistinject\nonostructurelistinject}
+
+\def\dodostructurelistinject[#1][#2]%
+ {\endgroup}
+
+\def\dodostructurelistinject[#1][#2]%
+ {\getparameters[\??li\??li][\c!type=userdata,\c!location=\v!none,#1]%
+ \edef\currentlisttype {\@@li@@litype}%
+ \edef\currentlistlocation{\@@li@@lilocation}%
\setnextinternalreference
- \edef\currentlistnumber{\ctxlua{structure.lists.push{
+ \edef\currentlistnumber{\ctxlua{structures.lists.push{
references = {
internal = \nextinternalreference,
- section = structure.sections.currentid(),
+ block = "\currentstructureblock", % handy for lists, like bibl
+ section = structures.sections.currentid(),
+ % location = "\currentlistlocation",
},
metadata = {
- kind = "#2",
- name = "\currentlistname",
- level = structure.sections.currentlevel(),
+ kind = "\currentlisttype",
+ name = "\currentlist",
+ level = structures.sections.currentlevel(),
catcodes = \the\catcodetable,
},
- userdata = structure.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
+ userdata = structures.helpers.touserdata(\!!bs\detokenize{#2}\!!es)
}}}%
- \expanded{\ctxlatelua{structure.lists.enhance(\currentlistnumber)}}%
+ % we can do the enhance injection at the lua end which saves tokenization and a call
+ \ifx\currentlistlocation\v!here
+ % this injects nodes !
+ \expanded{\ctxlatelua{structures.lists.enhance(\currentlistnumber)}}%
+ % new from here
+ \xdef\currentstructurelistattribute{\ctxlua{tex.write(structures.references.setinternalreference(nil,nil,\nextinternalreference))}}%
+ \xdef\currentdestinationattribute{\number\lastdestinationattribute}%
+ %begingroup\attribute\destinationattribute\currentdestinationattribute\dontleavehmode\emptyhbox\endgroup % todo
+ \dontleavehmode\hbox attr \destinationattribute \currentdestinationattribute{}% todo
+ % end of new
+ \else
+ \ctxlua{structures.lists.enhance(\currentlistnumber)}% direct injection
+ \fi
\endgroup}
\def\structurelistlocation
- {\ctxlua{structure.lists.location(\currentlistindex)}}
+ {\ctxlua{structures.lists.location(\currentlistindex)}}
\def\structurelistpagenumber
- {\ctxlua{structure.lists.prefixedpage(
+ {\dostarttagged\t!listpage\empty
+ \ctxlua{structures.lists.prefixedpage(
"\currentlist",
\currentlistindex,
{
@@ -110,38 +134,57 @@
starter = \!!bs\listparameter\c!pagestarter\!!es,
stopper = \!!bs\listparameter\c!pagestopper\!!es,
}
- )}}
+ )}%
+ \dostoptagged}
\def\structurelistrealpagenumber
- {\ctxlua{structure.lists.realpage("\currentlist",\currentlistindex)}}
+ {\ctxlua{structures.lists.realpage("\currentlist",\currentlistindex)}}
\def\structurelistfirst
- {\ctxlua{structure.lists.userdata("\currentlist",\currentlistindex,"first")}}
+ {\dostarttagged\t!listdata{first}% not always ok
+ \ctxlua{structures.lists.userdata("\currentlist",\currentlistindex,"first")}%
+ \dostoptagged}
\def\structurelistsecond
- {\ctxlua{structure.lists.userdata("\currentlist",\currentlistindex,"second")}}
+ {\dostarttagged\t!listdata{second}%
+ \ctxlua{structures.lists.userdata("\currentlist",\currentlistindex,"second")}%
+ \dostoptagged}
\def\structurelistuservariable#1%
- {\ctxlua{structure.lists.userdata("\currentlist",\currentlistindex,"#1")}}
+ {\dostarttagged\t!listdata{#1}%
+ \ctxlua{structures.lists.userdata("\currentlist",\currentlistindex,"#1")}%
+ \dostoptagged}
% \appendtoks
% \to \everystructurelist
-\unexpanded\def\placestructurelist#1#2#3% hm ... [][][]
- {\ctxlua{structure.lists.process("#1","#2","#3")}}
-
-\def\analysestructurelist#1#2#3%
- {\ctxlua{structure.lists.analyze("#1","#2","#3")}}
+\unexpanded\def\doplacestructurelist#1#2#3#4#5% beware, not a user command
+ {\dostarttagged\t!list\empty
+ \ctxlua{structures.lists.process {
+ names = "#1",
+ criterium = "#2",
+ number = "#3",
+ extras = "#4",
+ order = "#5"
+ }}%
+ \dostoptagged}
+
+\unexpanded\def\doanalyzestructurelist#1#2#3%
+ {\ctxlua{structures.lists.analyze {
+ names = "#1",
+ criterium = "#2",
+ number = "#3"
+ }}}
\def\firststructureelementinlist#1%
- {\ctxlua{commands.first_in_list("#1")}}
+ {\ctxcommand{firstinlist("#1")}}
\def\structurelistsize
- {\ctxlua{structure.lists.size()}}
+ {\ctxlua{structures.lists.size()}}
\def\@@structurelistprocess{structurelist:process:}
-\def\installstructurelistprocessor#1#2%
+\unexpanded\def\installstructurelistprocessor#1#2%
{\expandafter\def\csname\@@structurelistprocess#1\endcsname{#2}}
\def\usestructurelistprocessor#1%
@@ -158,24 +201,44 @@
% \chapter{Two} \section{First} \section{Second}
% \stoptext
-\def\processlistofstructure#1#2#3% name, method, n
- {\ctxlua{structure.lists.pushnesting(#3)}%
- \edef\currentlist {#1}%
- \edef\currentlistmethod{#2}%
- \edef\currentlistindex {#3}%
+\def\definelistextra
+ {\dodoubleargument\dodefinelistextra}
+
+\def\dodefinelistextra[#1][#2]%
+ {\getparameters[\??li:\c!extras:#1:][#2]}
+
+% todo: more generic tracing
+
+\definelistextra
+ [\v!page]
+ [\c!before={\showmessage\m!system{14}{\currentlist/\currentlistindex}\page}]
+
+\def\processlistextrabefore{\executeifdefined{\??li:\c!extras:\currentlistextra:\c!before}\relax}
+\def\processlistextraafter {\executeifdefined{\??li:\c!extras:\currentlistextra:\c!after }\relax}
+
+\unexpanded\def\processlistofstructure#1#2#3#4% name, method, n, extra
+ {\ctxlua{structures.lists.pushnesting(#3)}%
+ \edef\currentlist {#1}%
+ \edef\currentlistmethod {#2}%
+ \edef\currentlistindex {#3}%
+ \edef\currentlistextra {#4}%
+ \processlistextrabefore
+ \dostarttagged\t!listitem\currentlist
\csname\@@structurelistprocess
\ifcsname\@@structurelistprocess\currentlist:\currentlistmethod\endcsname\currentlist:\currentlistmethod\else
\ifcsname\@@structurelistprocess\currentlistmethod \endcsname\currentlistmethod \else
\ifcsname\@@structurelistprocess\currentlist \endcsname\currentlist \else
\s!default \fi\fi\fi
\endcsname
- \ctxlua{structure.lists.popnesting()}}
+ \dostoptagged
+ \processlistextraafter
+ \ctxlua{structures.lists.popnesting()}}
% \installstructcurelistprocessor{pubs:userdata}
-% {\ctxlua{structure.lists.userdata("\currentlist",\currentlistindex,"bibref")}}
+% {\ctxlua{structures.lists.userdata("\currentlist",\currentlistindex,"bibref")}}
\installstructurelistprocessor{command}
- {\ctxlua{structure.lists.userdata("\currentlist",\currentlistindex,"command")}}
+ {\ctxlua{structures.lists.userdata("\currentlist",\currentlistindex,"command")}}
\installstructurelistprocessor{section}
{\dodolistelement
@@ -211,7 +274,8 @@
\setuplistalternative[b][\c!distance=5em,\c!width=2em,\c!stretch=10em,\c!command=\hfill]
\setuplistalternative[c][\c!distance=5em,\c!width=0pt,\c!stretch=10em,\c!command=\hskip.5em\listdots\hskip.5em\relax]
-\def\listdots{\leaders\hbox to .5em{\hss.\hss}\hfill}
+%def\listdots{\leaders \hbox to .5em{\hss.\hss}\hfill}
+\def\listdots{\gleaders\hbox to .5em{\hss.\hss}\hfill}
% \setvalue{\??li\c!alternative}{\getvalue{\??li\c!alternative b}} % ?
% \getvalue{\??li\c!alternative} % ?
@@ -264,7 +328,7 @@
\c!pagecommand=\listpagecommand,
\c!pagenumber=\v!yes,
\c!headnumber=\v!yes,
- \c!pageboundaries=,
+ \c!extras=,
\c!margin=\!!zeropoint,
\c!aligntitle=,
\c!before=,
@@ -324,21 +388,58 @@
% writing to lists
-\def\writetolist[#1]{\gobbletwoarguments}
\let\dowritetolist \gobblefourarguments
\let\dodowritetolist\gobblefourarguments
-\def\writebetweenlist[#1]#2%
- {\doif{\namedlistparameter{#1}\c!state}\v!start{\structurelistinject[#1][command][command={#2}]}}
-\def\writedatatolist
- {\dodoubleargument\dowritedatatolist}
-
-\def\dowritedatatolist[#1][#2]%
- {\doif{\namedlistparameter{#1}\c!state}\v!start{\structurelistinject[#1][userdata][#2]}}
-
-\def\writetolist[#1]#2#3%
- {\doif{\namedlistparameter{#1}\c!state}\v!start{\structurelistinject[#1][simple][first={#2},second={#3}]}}
+%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
+%D default because otherwise users will wonder why spacing might get
+%D messed up (due to an unseen but present node). It is possible to
+%D force a location by explicitly setting \type {location} to \type
+%D {here}.
+%D
+%D Another way to force a certain order is to set the \type {order}
+%D variable when placing a list. The \type {command} option only
+%D pushes commands into the right order, and \type {all} orders all
+%D entries (which might be too much). In this case no specific
+%D location is needed with the inbetween method. Maybe additional
+%D mechanisms show up some day. See \type {inbetween-001.tex} for an
+%D example.
+
+% command : location=none
+% userdata : location=none
+% simple : location=here
+
+\unexpanded\def\writebetweenlist{\dodoubleempty \dowritebetweenlist}
+\unexpanded\def\writedatatolist {\dotripleargument\dowritedatatolist}
+\unexpanded\def\writetolist {\dodoubleempty \dowritetolist}
+
+\def\dowritebetweenlist[#1][#2]#3% we can overload location
+ {\doif{\namedlistparameter{#1}\c!state}\v!start
+ {\ifsecondargument
+ \dostructurelistinject[#1][#2,\c!type=command][command={#3}]%
+ \else
+ \dostructurelistinject[#1][\c!type=command][command={#3}]%
+ \fi}}
+
+\def\dowritedatatolist[#1][#2][#3]% we can overload location
+ {\doif{\namedlistparameter{#1}\c!state}\v!start
+ {\ifthirdargument
+ \dostructurelistinject[#1][#2,\c!type=userdata][#3]%
+ \else
+ \dostructurelistinject[#1][\c!type=userdata][#2]%
+ \fi}}
+
+
+\def\dowritetolist[#1][#2]#3#4% we can overload location
+ {\doif{\namedlistparameter{#1}\c!state}\v!start
+ {\ifsecondargument
+ \dostructurelistinject[#1][\c!location=\v!here,#2,\c!type=simple][first={#3},second={#4}]%
+ \else
+ \dostructurelistinject[#1][\c!location=\v!here,\c!type=simple][first={#3},second={#4}]%
+ \fi}}
\installstructurelistprocessor{simple}
{\dodolistelement
@@ -357,16 +458,21 @@
\edef\currentlist{\firststructureelementinlist{#1}}%
\the\everystructurelist
\doif{\listparameter\c!coupling}\v!on{\startlistreferences{#1}}%
- \placestructurelist{#1}{\listparameter\c!criterium}{\number\listparameter\c!number}%
+ \doplacestructurelist
+ {#1}%
+ {\listparameter\c!criterium}%
+ {\number\listparameter\c!number}%
+ {\listparameter\c!extras}%
+ {\listparameter\c!order}%
\stoplistreferences
\endgroup
\dosetlistmode}
-\def\dosetlistmode % utilitydone will disappear
+\def\dosetlistmode
{\ifcase\structurelistsize\relax
- \utilitydonefalse \resetsystemmode\v!list
+ \resetsystemmode\v!list
\else
- \utilitydonetrue \setsystemmode \v!list
+ \setsystemmode \v!list
\fi}
\unexpanded\def\systemsuppliedchapter {\getvalue{\v!chapter}} % brrr
@@ -379,7 +485,7 @@
\def\docompletelist[#1][#2]%
{\dodocompletelist[#1][#1][#2]}
-\def\completelist
+\unexpanded\def\completelist
{\dodoubleempty\docompletelist}
\def\listelements {} % list of page breaks
@@ -390,10 +496,10 @@
\def\doassigndimen#1#2#3%
{\doifinsetelse{#2}{\v!fit,\v!broad}{#1=#3}{#1=#2}\relax}
-\def\listsymbol[#1]#2%
+\unexpanded\def\listsymbol[#1]#2%
{\begingroup
\edef\currentlist{#1}%
- \edef\currentlistnumber{#2}%
+ \def\currentlistnumber{#2}% no edef else tag problems
\currentlistsymbol
\endgroup}
@@ -444,28 +550,34 @@
\endgroup}
\def\listsymbol@default
- {% prefix = no, none, yes
- \strut
- \doif{\listparameter\c!label}\v!yes{\leftlabeltext\currentlist}% we can use the new command that does left and right
- \listparameter\c!starter
- \currentlistnumber
- \listparameter\c!stopper
- \doif{\listparameter\c!label}\v!yes{\rightlabeltext\currentlist}}
-
-\def\listsymbol@default
- {% todo:
- % prefix=no (first gone)|none (all gone)|yes
- % number=no|yes
- \strut
- \doifelse{\listparameter\c!label}\v!yes
- {\leftlabeltext\currentlist
- \listparameter\c!starter
- \currentlistnumber
- \listparameter\c!stopper
- \rightlabeltext\currentlist}
- {\listparameter\c!starter
- \currentlistnumber
- \listparameter\c!stopper}}
+ {\strut
+ \begingroup
+ \edef\currentlistlabel{\listparameter\c!label}%
+ \ifx\currentlistlabel\empty % default
+ \listparameter\c!starter
+ \currentlistnumber
+ \listparameter\c!stopper
+ \else\ifx\currentlistlabel\v!no % also default
+ \listparameter\c!starter
+ \currentlistnumber
+ \listparameter\c!stopper
+ \else\ifx\currentlistlabel\v!none % real minimal (as suggested by WS)
+ \currentlistnumber
+ \else\ifx\currentlistlabel\v!yes % auto (use value stored in tuc file)
+ \edef\currentlistlabel{\ctxlua{structures.lists.label(\currentlistindex,"\currentlistlabel")}}%
+ \leftlabeltext\currentlistlabel
+ \listparameter\c!starter
+ \currentlistnumber
+ \listparameter\c!stopper
+ \rightlabeltext\currentlistlabel
+ \else % use whatever is set
+ \leftlabeltext\currentlistlabel
+ \listparameter\c!starter
+ \currentlistnumber
+ \listparameter\c!stopper
+ \rightlabeltext\currentlistlabel
+ \fi\fi\fi\fi
+ \endgroup}
\def\listsymbol@unknown
{\listparameter\c!symbol}
@@ -527,20 +639,11 @@
\def\dodolistelement#1#2#3#4#5#6%
{\edef\currentlist{#1}%
- \edef\currentlistnumber{#3}%
+ \def\currentlistnumber{#3}% no edef else tag problem
\docurrentlistalternative
- %\showcomposition
- \let\@@iawidth\!!zeropoint % moet boolean worden
- \begingroup
- \edef\listelements{\listparameter\c!pageboundaries}%
- \normalexpanded{\noexpand\doifinset{#3}{\listelements}}
- {\showmessage\m!systems{14}{#3}%
- \page}%
- \endgroup
+ \letinteractionparameter\c!width\zeropoint
\dontcomplain
- %\setfullsectionnumber{\??li\currentlist}% todo
- \dosomelistelement{#1}{#2}{#3}{#4}{#5}{#6}%
- \global\utilitydonetrue} % ?
+ \dosomelistelement{#1}{#2}{#3}{#4}{#5}{#6}}
\def\dodocommandlistelement#1#2#3#4#5#6%
{\doifdefinedelse{\??li#1\c!command}
@@ -549,13 +652,18 @@
\def\domakelistelement#1#2#3#4% ref internal command data
{\dontleavehmode
- \iflocation % we cannot tewak \iflocation as we nest
+ \iflocation % we cannot tweak \iflocation as we nest
\doifelse{\listparameter\c!interaction}{#1}
- {\directgoto{\setlocationcolor\??ia#4}[internal(#2)]}% was \directgotobox
- {#3{#4}}%
- \else
+ {\begingroup
+ \doif{\namedstructureheadparameter\currentlist\c!interaction}\v!list
+ {\dosetsimplepagereference{bck:#2}%
+ \attribute\destinationattribute\currentdestinationattribute}%
+ \directgoto{\setlocationcolor\??ia#4}[internal(#2)]% we can get the attribute instead so then we don't need a goto
+ \endgroup}% was \directgotobox
+ {#3{#4}}%
+ \else
#3{#4}%
- \fi}
+ \fi}
\def\dodofreelistelement#1#2#3#4#5#6#7#8%
{\listparameter\c!before% can be \hskip
@@ -637,7 +745,7 @@
\hfill}}}
{\!!widtha\zeropoint
\!!widthc\zeropoint
- \setbox2\hbox{}}%
+ \setbox2\emptyhbox}%
\setbox4\hbox
{\doif{\listparameter\c!pagenumber}\v!yes
{\doifsomething{#5} % \listwidth is new ; temp hack
@@ -824,12 +932,12 @@
\dosetuplist[#1][#2]%
\edef\currentlist{\firststructureelementinlist{#1}}%
\the\everystructurelist
- \analysestructurelist{#1}{\listparameter\c!criterium}{\number\listparameter\c!number}%
+ \doanalyzestructurelist{#1}{\listparameter\c!criterium}{\number\listparameter\c!number}%
\xdef\utilitylistlength{\structurelistsize}%
\endgroup
\dosetlistmode}
-\def\determinelistcharacteristics
+\unexpanded\def\determinelistcharacteristics
{\dodoubleempty\dodeterminelistcharacteristics}
\def\combinedlistparameter#1{\csname\??ih\currentcombinedlist#1\endcsname}
@@ -866,7 +974,12 @@
\doif{\combinedlistparameter\c!coupling}\v!on{\startlistreferences{#1}}%
\dobeginoflist
\normalexpanded{\noexpand\dosetuplist[\combinedlist][#2]}%
- \placestructurelist{\combinedlist}{\combinedlistparameter\c!criterium}{\combinedlistparameter\c!number}%
+ \doplacestructurelist
+ {\combinedlist}%
+ {\combinedlistparameter\c!criterium}%
+ {\combinedlistparameter\c!number}%
+ {\combinedlistparameter\c!extras}%
+ {\combinedlistparameter\c!order}%
\doendoflist
\stoplistreferences
\endgroup
@@ -888,10 +1001,13 @@
\structurelistrealpagenumber}
\def\structurelistgenerictitle
- {\ctxlua{structure.lists.title("\currentlist",\currentlistindex)}}
+ {\dostarttagged\t!listcontent\empty
+ \ctxlua{structures.lists.title("\currentlist",\currentlistindex)}%
+ \dostoptagged}
-\def\structurelistgenericnumber{\ctxlua{
- structure.lists.prefixednumber("\currentlist",\currentlistindex, {
+\def\structurelistgenericnumber % tricky, we need to delay tagging as we have nested lua calls
+ {\dostarttagged\t!listtag\empty
+ \ctxlua{structures.lists.prefixednumber("\currentlist",\currentlistindex, {
prefix = "\listparameter\c!prefix",
separatorset = "\listparameter\c!prefixseparatorset",
conversionset = "\listparameter\c!prefixconversionset",
@@ -907,7 +1023,8 @@
starter = \!!bs\listparameter\c!numberstarter\!!es,
stopper = \!!bs\listparameter\c!numberstopper\!!es,
segments = "\listparameter\c!numbersegments",
- } )}}
+ } )}%
+ \dostoptagged}
% new and yet undocumented (used in cocoa qa), temporarily disabled in mkiv
%
diff --git a/Master/texmf-dist/tex/context/base/strc-mar.lua b/Master/texmf-dist/tex/context/base/strc-mar.lua
index 8ee814d7743..5bb40fa94e3 100644
--- a/Master/texmf-dist/tex/context/base/strc-mar.lua
+++ b/Master/texmf-dist/tex/context/base/strc-mar.lua
@@ -6,13 +6,616 @@ if not modules then modules = { } end modules ['strc-mar'] = {
license = "see context related readme files"
}
-structure.marks = structure.marks or { }
+-- todo: cleanup stack (structures.marks.reset(v_all) also does the job)
-function structure.marks.title(tag,n)
- structure.lists.savedtitle(tag,n,"marking")
+local insert, concat = table.insert, table.concat
+local tostring, next, rawget = tostring, next, rawget
+local lpegmatch = lpeg.match
+
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+
+local getattribute = nodes.getattribute
+local traversenodes = node.traverse
+local texsetattribute = tex.setattribute
+local texbox = tex.box
+
+local a_marks = attributes.private("structure","marks")
+
+local trace_marks_set = false trackers.register("marks.set", function(v) trace_marks_set = v end)
+local trace_marks_get = false trackers.register("marks.get", function(v) trace_marks_get = v end)
+local trace_marks_all = false trackers.register("marks.detail", function(v) trace_marks_all = v end)
+
+local report_marks = logs.reporter("structure","marks")
+
+local variables = interfaces.variables
+
+local v_first = variables.first
+local v_last = variables.last
+local v_previous = variables.previous
+local v_next = variables.next
+local v_top = variables.top
+local v_bottom = variables.bottom
+local v_current = variables.current
+local v_default = variables.default
+local v_page = variables.page
+local v_all = variables.all
+
+local v_nocheck_suffix = ":" .. variables.nocheck
+
+local v_first_nocheck = variables.first .. v_nocheck_suffix
+local v_last_nocheck = variables.last .. v_nocheck_suffix
+local v_previous_nocheck = variables.previous .. v_nocheck_suffix
+local v_next_nocheck = variables.next .. v_nocheck_suffix
+local v_top_nocheck = variables.top .. v_nocheck_suffix
+local v_bottom_nocheck = variables.bottom .. v_nocheck_suffix
+
+local structures = structures
+local marks = structures.marks
+local lists = structures.lists
+
+local settings_to_array = utilities.parsers.settings_to_array
+
+marks.data = marks.data or allocate()
+
+storage.register("structures/marks/data", marks.data, "structures.marks.data")
+
+local data = marks.data
+local stack, topofstack = { }, 0
+
+local ranges = {
+ [v_page] = {
+ first = 0,
+ last = 0,
+ },
+}
+
+local function resolve(t,k)
+ if k then
+ if trace_marks_set or trace_marks_get then
+ report_marks("undefined: name=%s",k)
+ end
+ local crap = { autodefined = true }
+ t[k] = crap
+ return crap
+ else
+ -- weird: k is nil
+ end
+end
+
+setmetatableindex(data, resolve)
+
+function marks.exists(name)
+ return rawget(data,name) ~= nil
+end
+
+-- identify range
+
+local function sweep(head,first,last)
+ for n in traversenodes(head) do
+ local id = n.id
+ if id == glyph_code then
+ local a = getattribute(n,a_marks)
+ if not a then
+ -- next
+ elseif first == 0 then
+ first, last = a, a
+ elseif a > last then
+ last = a
+ end
+ elseif id == hlist_code or id == vlist_code then
+ local a = getattribute(n,a_marks)
+ if not a then
+ -- next
+ elseif first == 0 then
+ first, last = a, a
+ elseif a > last then
+ last = a
+ end
+ local list = n.list
+ if list then
+ first, last = sweep(list, first, last)
+ end
+ end
+ end
+ return first, last
+end
+
+local classes = { }
+
+setmetatableindex(classes, function(t,k) local s = settings_to_array(k) t[k] = s return s end)
+
+function marks.synchronize(class,n)
+ local box = texbox[n]
+ if box then
+ local first, last = sweep(box.list,0,0)
+ local classlist = classes[class]
+ for i=1,#classlist do
+ local class = classlist[i]
+ local range = ranges[class]
+ if not range then
+ range = { }
+ ranges[class] = range
+ end
+ range.first, range.last = first, last
+ if trace_marks_get or trace_marks_set then
+ report_marks("synchronize: class=%s, first=%s, last=%s",class,range.first,range.last)
+ end
+ end
+ elseif trace_marks_get or trace_marks_set then
+ report_marks("synchronize: class=%s, box=%s, no content",class,n)
+ end
+end
+
+-- define etc
+
+local function resolve(t,k)
+ if k == "fullchain" then
+ local fullchain = { }
+ local chain = t.chain
+ while chain and chain ~= "" do
+ insert(fullchain,1,chain)
+ chain = data[chain].chain
+ end
+ t[k] = fullchain
+ return fullchain
+ elseif k == "chain" then
+ t[k] = ""
+ return ""
+ elseif k == "reset" or k == "set" then
+ t[k] = 0
+ return 0
+ elseif k == "parent" then
+ t[k] = false
+ return false
+ end
+end
+
+function marks.define(name,settings)
+ settings = settings or { }
+ data[name] = settings
+ local parent = settings.parent
+ if parent == nil or parent == "" then
+ settings.parent = false
+ else
+ local dp = data[parent]
+ if not dp then
+ settings.parent = false
+ elseif dp.parent then
+ settings.parent = dp.parent
+ end
+ end
+ setmetatableindex(settings, resolve)
+end
+
+for k, v in next, data do
+ setmetatableindex(v,resolve) -- runtime loaded table
end
-function structure.marks.number(tag,n) -- no spec
+local function parentname(name)
+ local dn = data[name]
+ return dn and dn.parent or name
+end
+
+function marks.relate(name,chain)
+ local dn = data[name]
+ if dn and not dn.parent then
+ if chain and chain ~= "" then
+ dn.chain = chain
+ local dc = data[chain]
+ if dc then
+ local children = dc.children
+ if not children then
+ children = { }
+ dc.children = children
+ end
+ children[#children+1] = name
+ end
+ elseif trace_marks_set then
+ report_marks("invalid relation: name=%s, chain=%s",name,chain or "-")
+ end
+ end
+end
+
+local function resetchildren(new,name)
+ local dn = data[name]
+ if dn and not dn.parent then
+ local children = dn.children
+ if children then
+ for i=1,#children do
+ local ci = children[i]
+ new[ci] = false
+ if trace_marks_set then
+ report_marks("reset: parent=%s, child=%s",name,ci)
+ end
+ resetchildren(new,ci)
+ end
+ end
+ end
+end
+
+function marks.set(name,value)
+ local dn = data[name]
+ if dn then
+ local child = name
+ local parent = dn.parent
+ if parent then
+ name = parent
+ dn = data[name]
+ end
+ dn.set = topofstack
+ local top = stack[topofstack]
+ local new = { }
+ if top then
+ for k, v in next, top do
+ local d = data[k]
+ local r = d.reset
+ local s = d.set
+ if r <= topofstack and s < r then
+ new[k] = false
+ else
+ new[k] = v
+ end
+ end
+ end
+ resetchildren(new,name)
+ new[name] = value
+ topofstack = topofstack + 1
+ stack[topofstack] = new
+ if trace_marks_set then
+ if name == child then
+ report_marks("set: name=%s, index=%s, value=%s",name,topofstack,value)
+ else
+ report_marks("set: parent=%s, child=%s, index=%s, value=%s",parent,child,topofstack,value)
+ end
+ end
+ tex.setattribute("global",a_marks,topofstack)
+ end
+end
+
+local function reset(name)
+ if v_all then
+ if trace_marks_set then
+ report_marks("reset: all")
+ end
+ stack = { }
+ for name, dn in next, data do
+ local parent = dn.parent
+ if parent then
+ dn.reset = 0
+ dn.set = 0
+ end
+ end
+ else
+ local dn = data[name]
+ if dn then
+ local parent = dn.parent
+ if parent then
+ name = parent
+ dn = data[name]
+ end
+ if trace_marks_set then
+ report_marks("reset: name=%s, index=%s",name,topofstack)
+ end
+ dn.reset = topofstack
+ local children = dn.children
+ if children then
+ for i=1,#children do
+ local ci = children[i]
+ reset(ci)
+ end
+ end
+ end
+ end
+end
+
+marks.reset = reset
+
+function marks.get(n,name,value)
+ local dn = data[name]
+ if dn then
+ name = dn.parent or name
+ local top = stack[n]
+ if top then
+ context(top[name])
+ end
+ end
+end
+
+function marks.show(first,last)
+ if first and last then
+ for k=first,last do
+ local v = stack[k]
+ if v then
+ report_marks("% 4i: %s",k,table.sequenced(v))
+ end
+ end
+ else
+ for k, v in table.sortedpairs(stack) do
+ report_marks("% 4i: %s",k,table.sequenced(v))
+ end
+ end
+end
+
+local function resolve(name,first,last,strict,quitonfalse,notrace)
+ local dn = data[name]
+ if dn then
+ local child = name
+ local parent = dn.parent
+ name = parent or child
+ dn = data[name]
+ local step, method
+ if first > last then
+ step, method = -1, "bottom-up"
+ else
+ step, method = 1, "top-down"
+ end
+ if trace_marks_get and not notrace then
+ report_marks("request: strategy=%s, name=%s, parent=%s, strict=%s",method,child,parent or "",tostring(strict or false))
+ end
+ if trace_marks_all and not notrace then
+ marks.show(first,last)
+ end
+ local r = dn.reset
+ local s = dn.set
+ if first <= last and first <= r then
+ if trace_marks_get and not notrace then
+ report_marks("reset (first case): name=%s, first=%s, last=%s, reset=%s, index=%s",name,first,last,r,first)
+ end
+ elseif first >= last and last <= r then
+ if trace_marks_get and not notrace then
+ report_marks("reset (last case): name=%s, first=%s, last=%s, reset=%s, index=%s",name,first,last,r,last)
+ end
+ elseif not stack[first] or not stack[last] then
+ if trace_marks_get and not notrace then
+ -- a previous or next method can give an out of range, which is valid
+ report_marks("out of range: name=%s, reset=%s, index=%s",name,r,first)
+ end
+ elseif strict then
+ local top = stack[first]
+ local fullchain = dn.fullchain
+ if not fullchain or #fullchain == 0 then
+ if trace_marks_get and not notrace then
+ report_marks("no full chain, trying: name=%s, first=%s, last=%s",name,first,last)
+ end
+ return resolve(name,first,last)
+ else
+ if trace_marks_get and not notrace then
+ report_marks("found chain: %s",concat(fullchain," => "))
+ end
+ local chaindata, chainlength = { }, #fullchain
+ for i=1,chainlength do
+ local cname = fullchain[i]
+ if data[cname].set > 0 then
+ local value = resolve(cname,first,last,false,false,true)
+ if value == "" then
+ if trace_marks_get and not notrace then
+ report_marks("quit chain: name=%s, reset=%s, start=%s",name,r,first)
+ end
+ return ""
+ else
+ chaindata[i] = value
+ end
+ end
+ end
+ if trace_marks_get and not notrace then
+ report_marks("chain list: %s",concat(chaindata," => "))
+ end
+ local value, index, found = resolve(name,first,last,false,false,true)
+ if value ~= "" then
+ if trace_marks_get and not notrace then
+ report_marks("following chain: %s",concat(fullchain," => "))
+ end
+ for i=1,chainlength do
+ local cname = fullchain[i]
+ if data[cname].set > 0 and chaindata[i] ~= found[cname] then
+ if trace_marks_get and not notrace then
+ report_marks("empty in chain: name=%s, reset=%s, index=%s",name,r,first)
+ end
+ return ""
+ end
+ end
+ if trace_marks_get and not notrace then
+ report_marks("found: name=%s, reset=%s, start=%s, index=%s, value=%s",name,r,first,index,value)
+ end
+ return value, index, found
+ elseif trace_marks_get and not notrace then
+ report_marks("not found: name=%s, reset=%s",name,r)
+ end
+ end
+ else
+ for i=first,last,step do
+ local current = stack[i]
+ local value = current and current[name]
+ if value == nil then
+ -- search on
+ elseif value == false then
+ if quitonfalse then
+ return ""
+ end
+ elseif value == true then
+ if trace_marks_get and not notrace then
+ report_marks("quit: name=%s, reset=%s, start=%s, index=%s",name,r,first,i)
+ end
+ return ""
+ elseif value ~= "" then
+ if trace_marks_get and not notrace then
+ report_marks("found: name=%s, reset=%s, start=%s, index=%s, value=%s",name,r,first,i,value)
+ end
+ return value, i, current
+ end
+ end
+ if trace_marks_get and not notrace then
+ report_marks("not found: name=%s, reset=%s",name,r)
+ end
+ end
+ end
+ return ""
+end
+
+-- todo: column:first column:last
+
+local methods = { }
+
+local function doresolve(name,rangename,swap,df,dl,strict)
+ local range = ranges[rangename] or ranges[v_page]
+ local first, last = range.first, range.last
+ if trace_marks_get then
+ report_marks("resolve: name=%s, range=%s, swap=%s, first=%s, last=%s, df=%s, dl=%s, strict=%s",
+ name,rangename,tostring(swap or false),first,last,df,dl,tostring(strict or false))
+ end
+ if swap then
+ first, last = last + df, first + dl
+ else
+ first, last = first + df, last + dl
+ end
+ local value, index, found = resolve(name,first,last,strict)
+ -- maybe something more
+ return value, index, found
+end
+
+methods[v_previous] = function(name,range) return doresolve(name,range,false,-1,0,true ) end -- strict
+methods[v_top] = function(name,range) return doresolve(name,range,false, 0,0,true ) end -- strict
+methods[v_bottom] = function(name,range) return doresolve(name,range,true , 0,0,true ) end -- strict
+methods[v_next] = function(name,range) return doresolve(name,range,true , 0,1,true ) end -- strict
+
+methods[v_previous_nocheck] = function(name,range) return doresolve(name,range,false,-1,0,false) end
+methods[v_top_nocheck] = function(name,range) return doresolve(name,range,false, 0,0,false) end
+methods[v_bottom_nocheck] = function(name,range) return doresolve(name,range,true , 0,0,false) end
+methods[v_next_nocheck] = function(name,range) return doresolve(name,range,true , 0,1,false) end
+
+local function resolve(name,range,f_swap,l_swap,step,strict) -- we can have an offset
+ local f_value, f_index, f_found = doresolve(name,range,f_swap,0,0,strict)
+ local l_value, l_index, l_found = doresolve(name,range,l_swap,0,0,strict)
+ if f_found and l_found and l_index > f_index then
+ local name = parentname(name)
+ for i=f_index,l_index,step do
+ local si = stack[i]
+ local sn = si[name]
+ if sn and sn ~= false and sn ~= true and sn ~= "" and sn ~= f_value then
+ return sn, i, si
+ end
+ end
+ end
+ return f_value, f_index, f_found
+end
+
+methods[v_first ] = function(name,range) return resolve(name,range,false,true, 1,true ) end -- strict
+methods[v_last ] = function(name,range) return resolve(name,range,true,false,-1,true ) end -- strict
+
+methods[v_first_nocheck] = function(name,range) return resolve(name,range,false,true, 1,false) end
+methods[v_last_nocheck ] = function(name,range) return resolve(name,range,true,false,-1,false) end
+
+methods[v_current] = function(name,range) -- range is ignored here
+ local top = stack[topofstack]
+ return top and top[parentname(name)] or ""
+end
+
+local function fetched(name,range,method)
+ local value = (methods[method] or methods[v_first])(name,range) or ""
+ if not trace_marks_get then
+ -- no report
+ elseif value == "" then
+ report_marks("nothing fetched: name=%s, range=%s, method=%s",name,range,method)
+ else
+ report_marks("marking fetched: name=%s, range=%s, method=%s, value=%s",name,range,method,value)
+ end
+ return value or ""
+end
+
+-- can be used at the lua end:
+
+marks.fetched = fetched
+
+-- this will move to a separate runtime modules
+
+marks.tracers = marks.tracers or { }
+
+function marks.tracers.showtable()
+ context.starttabulate { "|l|l|l|lp|lp|" }
+ context.tabulaterowbold("name","parent","chain","children","fullchain")
+ context.ML()
+ for k, v in table.sortedpairs(data) do
+ local parent, chain, children, fullchain = v.parent or "", v.chain or "", v.children or { }, v.fullchain or { }
+ table.sort(children) -- in-place but harmless
+ context.tabulaterowtyp(k,parent,chain,concat(children," "),concat(fullchain," "))
+ end
+ context.stoptabulate()
+end
+
+-- pushing to context:
+
+local separator = context.nested.markingseparator
+local command = context.nested.markingcommand
+local ctxconcat = context.concat
+
+local function fetchonemark(name,range,method)
+ context(command(name,fetched(name,range,method)))
+end
+
+local function fetchtwomarks(name,range)
+ ctxconcat( {
+ command(name,fetched(name,range,v_first)),
+ command(name,fetched(name,range,v_last)),
+ }, separator(name))
+end
+
+local function fetchallmarks(name,range)
+ ctxconcat( {
+ command(name,fetched(name,range,v_previous)),
+ command(name,fetched(name,range,v_first)),
+ command(name,fetched(name,range,v_last)),
+ }, separator(name))
+end
+
+function marks.fetch(name,range,method) -- chapter page first | chapter column:1 first
+ if trace_marks_get then
+ report_marks("marking asked: name=%s, range=%s, method=%s",name,range,method)
+ end
+ if method == "" or method == v_default then
+ fetchonemark(name,range,v_first)
+ elseif method == v_both then
+ fetchtwomarks(name,range)
+ elseif method == v_all then
+ fetchallmarks(name,range)
+ else
+ fetchonemark(name,range,method)
+ end
+end
+
+function marks.fetchonemark (name,range,method) fetchonemark (name,range,method) end
+function marks.fetchtwomarks(name,range) fetchtwomarks(name,range ) end
+function marks.fetchallmarks(name,range) fetchallmarks(name,range ) end
+
+-- here we have a few helpers
+
+function marks.title(tag,n)
+ lists.savedtitle(tag,n,"marking")
+end
+
+function marks.number(tag,n) -- no spec
-- no prefix (as it is the prefix)
- structure.lists.savednumber(tag,n)
+ lists.savednumber(tag,n)
end
+
+-- interface
+
+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.testcase(marks.exists(str))
+end
+
diff --git a/Master/texmf-dist/tex/context/base/strc-mar.mkiv b/Master/texmf-dist/tex/context/base/strc-mar.mkiv
index bb87051e026..2fe8631b27b 100644
--- a/Master/texmf-dist/tex/context/base/strc-mar.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-mar.mkiv
@@ -17,479 +17,168 @@
\unprotect
-%D Old stuff.
-
-\newtoks \listofmarks
-
-\let \getmarks \gobbleoneargument
-\let \getallmarks \relax
-\let \getsplitmarks \gobbleoneargument
-\let \getallsplitmarks \relax
-
-%D \macros
-%D {expandmarks}
+%D Synchronizing marks is a rather tricky and messy business. When
+%D setting a mark, a node is added to the list in order for to \TEX\
+%D be able to figure out the 3 current marks when a page is made
+%D (last mark on previous page, first on current page, last on
+%D current page; in \LUATEX\ we might at one point have the first on
+%D the next page as well).
%D
-%D We can force expansion of marks with the following switch.
-
-% Synchronizing marks is a rather tricky and messy business. When
-% setting a mark, a node is added to the list in order for to \TEX\
-% be able to figure out the 3 current marks when a page is made
-% (last mark on previous page, first on current page, last on
-% current page; in \LUATEX\ we might at one point have the first on
-% the next page as well).
-
-% Resetting a mark is not easy. An empty one will not erase the last
-% one on the previous page for instance. In \LUATEX\ we can clear a
-% marks state register with \type {\clearmarks} but since this is an
-% immediate operation it might have unwanted side effects when \TEX\
-% has collected several pages of text and finishing off these pages
-% uses marks.
-
-% In \MKIV\ we provide a model that permits some control over the
-% way marks are used. It is not entirely compatible with \MKII\ but
-% in practice this is not a real problem. Quality has a price.
-
-% In fact we define multiple marks per visible mark and define
-% additional ones on the fly. This has some price in terms of used
-% mark registers but given the way that we fill marks in \MKIV\
-% their accumulated content is not really the issue. Also,
-% periodically we cleanup any leftovers.
-
-\newif\ifexpandmarks \expandmarkstrue
-
-\def\marksomecs #1#2{\csname\string#1:m:\number#2\endcsname}
-\def\markautocs #1{\csname\string#1:m:\number\csname\string#1:s\endcsname\endcsname}
-\def\markmaincs #1{\csname\string#1:m\endcsname}
-\def\markresetcs #1{\csname\string#1:r\endcsname}
-\def\markstatecs #1{\csname\string#1:s\endcsname}
-\def\markcurrentcs#1{\csname\string#1:c\endcsname}
-\def\marktokscs #1{\csname\string#1:t\endcsname}
-
-\def\renewmarks#1%
- {\ifx#1\relax
- % \writestatus\m!systems{defining low level mark: \string#1}%
- \newmarks#1%
- \else
- \clearmarks#1%
- \fi}
-
-\unexpanded\def\definenewmark#1%
- {\ifcsname\string#1:m\endcsname\else
- \@EA\@EA\@EA\newcount \markstatecs #1\global\markstatecs#1\plusone
- \@EA\@EA\@EA\renewmarks\markautocs #1%
- \@EA\@EA\@EA\renewmarks\markmaincs #1%
- \@EA\@EA\@EA\renewmarks\markresetcs #1%
- \@EA\@EA\@EA\newtoks \marktokscs #1%
- \@EA\@EA\@EA\let \markcurrentcs#1\empty
- \listofmarks\expandafter{\the\listofmarks\checkmark#1}%
- \fi}
-
-\long\def\setmark#1#2% marks expand
- {\@EA\@EA\@EA\xdef \markcurrentcs#1{\ifexpandmarks#2\else\normalunexpanded{#2}\fi}%
- \marks\markautocs #1{\ifexpandmarks#2\else\normalunexpanded{#2}\fi}% we could expand current one level
- \marks\markmaincs #1{\ifexpandmarks#2\else\normalunexpanded{#2}\fi}% we could expand current one level
- \marks\markresetcs #1{\number\markstatecs#1}}
-
-\def\resetmark#1%
- {\global\advance\markstatecs#1\plusone
- \@EA\@EA\@EA\glet\markcurrentcs#1\empty
- \@EA\@EA\@EA\renewmarks\markautocs#1%
- \the\marktokscs#1\relax}
-
-\def\addmarkreset#1#2%
- {\global\marktokscs#2\@EA{\the\marktokscs#2\resetmark#1}}
-
-% already there: \prependtoks \getallmarks \to \everybeforepagebody
-%
-% \def\getallmarks{\the\listofmarks}
+%D Resetting a mark is not easy. An empty one will not erase the last
+%D one on the previous page for instance. In \LUATEX\ we can clear a
+%D marks state register with \type {\clearmarks} but since this is an
+%D immediate operation it might have unwanted side effects when \TEX\
+%D has collected several pages of text and finishing off these pages
+%D uses marks.
+%D
+%D In \MKIV\ we provide an alternative model that permits some more
+%D control over the way marks are used. It is not entirely compatible
+%D with \MKII\ or previous \MKIV\ implementations but in practice this
+%D is not a real problem. It's also easier now to extend this mechanism.
-\let\checkmark\gobbleoneargument
+% if global has side effects we will need to nil it selectively
+% and optionally enable it in for instance postponed content
-\prependtoks \clearmarkswhenemptypage \to \everybeforepagebody
+\definesystemattribute [marks] [global]
-\def\clearmarkswhenemptypage
- {\iffalse % check if page is empty
- \clearallmarks
- \fi}
-
-\def\clearallmarks
- {\let\checkmark\clearmarkchain
- \the\listofmarks
- \let\checkmark\gobbleoneargument}
-
-\def\clearmarkchain#1%
- {\@EA\@EA\@EA\clearmarks\markmaincs#1%
- \@EA\@EA\@EA\clearmarks\markresetcs#1%
- \@EA\doclearmarkchain\@EA{\number\csname\string#1:s\endcsname}#1%
- \@EA\@EA\@EA\glet\markcurrentcs#1\empty
- \global\markstatecs#1\plusone}
-
-\def\doclearmarkchain#1#2%
- {\@EA\@EA\@EA\clearmarks\marksomecs#1{#2}%
- \@EA\doclearmarkchain\@EA#1\@EA{\number\numexpr#2+\minusone}}
-
-% Fetching (expandable versions, so no intermediate counter):
-
-\def\currenttopmarknumber #1{\number0\topmarks \markresetcs#1}
-\def\currentfirstmarknumber#1{\number0\firstmarks\markresetcs#1}
-\def\currentbotmarknumber #1{\number0\botmarks \markresetcs#1}
-
-\def\checkedcurrentmarkrange#1{[\currenttopmarknumber#1,\currentfirstmarknumber#1,\currentbotmarknumber#1]}
-
-\def\checkedcurrentmarks{\markcurrentcs} % #1 shared current mark
-
-\let\currentsplitfirstmarknumber\currentfirstmarknumber
-\let\currentsplittopmarknumber \currenttopmarknumber
-\let\currentsplitbotmarknumber \currentbotmarknumber
-\let\normalsplittopmarks \normaltopmarks
-
-\def\uncheckedautotopmark {\normaltopmarks \markautocs} % #1
-\def\uncheckedautofirstmark {\normalfirstmarks \markautocs} % #1
-\def\uncheckedautobotmark {\normalbotmarks \markautocs} % #1
-\def\uncheckedautosplittopmark {\normalsplittopmarks \markautocs} % #1
-\def\uncheckedautosplitfirstmark {\normalsplitfirstmarks\markautocs} % #1
-\def\uncheckedautosplitbotmark {\normalsplitbotmarks \markautocs} % #1
-
-\def\uncheckedmaintopmark {\normaltopmarks \markmaincs} % #1
-\def\uncheckedmainfirstmark {\normalfirstmarks \markmaincs} % #1
-\def\uncheckedmainbotmark {\normalbotmarks \markmaincs} % #1
-\def\uncheckedmainsplittopmark {\normalsplittopmarks \markmaincs} % #1
-\def\uncheckedmainsplitfirstmark {\normalsplitfirstmarks\markmaincs} % #1
-\def\uncheckedmainsplitbotmark {\normalsplitbotmarks \markmaincs} % #1
-
-\def\checkedpagetopmarks #1{\ifcase\currentbotmarknumber #1\else\normaltopmarks \marksomecs#1{\currentbotmarknumber #1}\fi}
-\def\checkedpagefirstmarks #1{\ifcase\currentbotmarknumber #1\else\normalfirstmarks \marksomecs#1{\currentbotmarknumber #1}\fi}
-\def\checkedpagebotmarks #1{\ifcase\currentbotmarknumber #1\else\normalbotmarks \marksomecs#1{\currentbotmarknumber #1}\fi}
-\def\checkedpagesplittopmarks #1{\ifcase\currentsplitbotmarknumber #1\else\normalsplittopmarks \marksomecs#1{\currentsplitbotmarknumber #1}\fi}
-\def\checkedpagesplitfirstmarks#1{\ifcase\currentsplitbotmarknumber #1\else\normalsplitfirstmarks\marksomecs#1{\currentsplitbotmarknumber #1}\fi}
-\def\checkedpagesplitbotmarks #1{\ifcase\currentsplitbotmarknumber #1\else\normalsplitbotmarks \marksomecs#1{\currentsplitbotmarknumber #1}\fi}
-
-\def\checkedfulltopmarks #1{\ifcase\currenttopmarknumber #1\else\normaltopmarks \marksomecs#1{\currenttopmarknumber #1}\fi}
-\def\checkedfullfirstmarks #1{\ifcase\currentfirstmarknumber #1\else\normalfirstmarks \marksomecs#1{\currentfirstmarknumber #1}\fi}
-\def\checkedfullbotmarks #1{\ifcase\currentbotmarknumber #1\else\normalbotmarks \marksomecs#1{\currentbotmarknumber #1}\fi}
-\def\checkedfullsplittopmarks #1{\ifcase\currentsplittopmarknumber #1\else\normalsplittopmarks \marksomecs#1{\currentsplittopmarknumber #1}\fi}
-\def\checkedfullsplitfirstmarks#1{\ifcase\currentsplitfirstmarknumber#1\else\normalsplitfirstmarks\marksomecs#1{\currentsplitfirstmarknumber#1}\fi}
-\def\checkedfullsplitbotmarks #1{\ifcase\currentsplitbotmarknumber #1\else\normalsplitbotmarks \marksomecs#1{\currentsplitbotmarknumber #1}\fi}
-
-% Interface macros:
-
-\def\getcurrentmark {\checkedcurrentmarks }
-\def\gettopmark {\checkedfulltopmarks }
-\def\getfirstmark {\checkedfullfirstmarks }
-\def\getbotmark {\checkedfullbotmarks }
-\def\getsplittopmark {\checkedfullsplittopmarks }
-\def\getsplitfirstmark {\checkedfullsplitfirstmarks}
-\def\getsplitbotmark {\checkedfullsplitbotmarks }
-
-\def\getbottommark {\getbotmark}
-\def\getsplitbottommark{\getsplitbotmark}
-
-%D Some of these will go away (in the process of rewriting).
-
-\let \newmark \definenewmark
-\let \newpersistentmark \newmarks
-\let \normalsetmark \setmark
-\let \rawnewmark \newmarks
-\let \rawdefinemark \newmarks
-\let \rawsetmark \normalmarks
-\let \rawgettopmark \normaltopmarks
-\let \rawgetfirstmark \normalfirstmarks
-\let \rawgetbotmark \normalbotmarks
-\let \rawgetsplitbotmark \normalsplitbotmarks
-\let \rawgetsplitfirstmark \normalsplitfirstmarks
-\let \rawgetsplittopmark \normalsplitfirstmarks
-
-\let \noninterferingmarks \relax % old color interference related hack
-
-%D Next comes the layer around the previous mechanism.
-%D
-%D Parameters
+\let\currentmarking\empty
-\def\markingparameter #1#2{\csname\domarkingparameter{\??mk#1}#2\endcsname}
-\def\domarkingparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\@EA\domarkingparentparameter\csname#1\s!parent\endcsname#2\fi}
+\def\markingparameter #1{\csname\domarkingparameter{\??mk\currentmarking}#1\endcsname}
+\def\namedmarkingparameter #1#2{\csname\domarkingparameter{\??mk#1}#2\endcsname}
+\def\domarkingparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\domarkingparentparameter\csname#1\s!parent\endcsname#2\fi}
\def\domarkingparentparameter#1#2{\ifx#1\relax\s!empty\else\domarkingparameter#1#2\fi}
-\def\markingcoupling #1{\ifcsname\??mk#1\c!coupling\endcsname\@EA\markingcoupling\csname\??mk#1\c!coupling\endcsname\else#1\fi}
-
-\let\mainmarking\markingcoupling % compatibility
-
-\def\doifelsemarking#1%
- {\ifcsname\??mk#1\c!coupling\endcsname
- \expandafter\firstoftwoarguments
- \else
- \expandafter\secondoftwoarguments
- \fi}
-\def\dowithmarkcommandone#1#2% \command {mark}
- {\expandafter#1\csname\??mk:\markingcoupling{#2}\endcsname}
+% \def\markingparameterhash #1{\domarkingparameterhash{\??mk\currentmarking}#1}
+% \def\domarkingparameterhash #1#2{\ifcsname#1#2\endcsname#1\else\expandafter\domarkingparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+% \def\domarkingparentparameterhash#1#2{\ifx#1\relax\else\domarkingparameterhash#1#2\fi}
+%
+% \def\detokenizedmarkingparameter#1{\detokenize\expandafter\expandafter\expandafter{\csname\??mk\currentmarking#1\endcsname}}
+%
+% \def\dosetmarkingattributes#1#2% style color
+% {\edef\fontattributehash {\markingparameterhash#1}%
+% \edef\colorattributehash{\markingparameterhash#2}%
+% \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi
+% \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi}
-\def\dowithmarkcommandtwo#1#2#3% \command {mark} {mark}
- {\expandafter#1\csname\??mk:\markingcoupling{#2}\expandafter\endcsname\csname\??mk:\markingcoupling{#3}\endcsname}
+\newconditional\inhibitgetmarking
+\newconditional\inhibitsetmarking
+\newtoks \everymarking
\unexpanded\def\setupmarking
{\dodoubleargument\dosetupmarking}
\def\dosetupmarking[#1][#2]%
- {\def\docommand##1{\getparameters[\??mk##1][#2]}%
- \processcommalist[#1]\docommand}
-
-%D The filtercommand key is used to hook in a filtering command. Users are
-%D adviced not to misuse this key.
-
-\getparameters
- [\??mk]
- [\c!expansion=\v!no, % saves a macro
- \c!separator={\space\emdash\space},
- \c!limittext=\@@kolimittext,
- \c!filtercommand=\firstofoneargument,
- \c!state=\v!start]
-
-\let\alldefinedmarks\empty
-
-\unexpanded\def\definemarking
- {\dodoubleempty\dodefinemarking}
-
-\def\dodefinemarking[#1][#2]%
- {\doifelsenothing{#2}\donormaldefinemarking\docloneddefinemarking[#1][#2]}
-
-\def\donormaldefinemarking[#1][#2]% #2 empty
- {\ifcsname\??mk#1\s!parent\endcsname
- % already defined
- \else
- \letgvalue{\??mk#1\s!parent}\??mk
- \dowithmarkcommandone\newmark{#1}%
- \doglobal\addtocommalist{#2}\alldefinedmarks
- \ifproductionrun\showmessage\m!systems{13}{#1,[#1]}\fi
- \fi}
-
-\def\docloneddefinemarking[#1][#2]%
- {\ifcsname\??mk#1\s!parent\endcsname \else \ifcsname\??mk#2\s!parent\endcsname
- \doifnot{#1}{#2}%
- {\setxvalue{\??mk#1\s!parent}{\??mk#2}%
- \setxvalue{\??mk#1\c!coupling}{#2}%
- \ifproductionrun\showmessage\m!systems{13}{#1,[#2]}\fi}%
- \fi \fi}
-
-\def\decouplemarking[#1]%
- {\letbeundefined{\??mk#1\c!coupling}}
+ {\ifsecondargument
+ \def\docommand##1{\getparameters[\??mk##1][#2]}%
+ \processcommalist[#1]\docommand
+ \else
+ \getparameters[\??mk][#1]%
+ \fi}
-\def\couplemarking[#1]#2[#3]% couple 1 to 2 (this macro is not really needed)
- {\setvalue{\??mk#1\c!coupling}{#3}}
+% management
-\def\relatemarking[#1]#2[#3]% define 1 as child of 2
- {\dowithmarkcommandtwo\addmarkreset{#1}{#3}}
+\unexpanded\def\definemarking {\dodoubleempty \dodefinemarking}
+\unexpanded\def\relatemarking {\dodoubleempty \dorelatemarking}
+\unexpanded\def\setmarking {\dosingleargument\dosetmarking } \let\marking\setmarking
+\unexpanded\def\resetmarking {\dosingleargument\doresetmarking }
+\unexpanded\def\synchronizemarking{\dodoubleargument\dosynchronizemarking }
-\unexpanded\def\definerawmarking[#1]%
- {\dododefinemarking[#1][#1]%
- \getgparameters[\??mk#1][\c!limittext=]} % global !
+\def\dodefinemarking[#1][#2]% marking parent
+ {\doifelsenothing{#2}
+ {\ctxcommand{definemarking("#1")}%
+ \getparameters[\??mk#1][\s!parent=\??mk]}
+ {\ctxcommand{definemarking("#1",{ parent = "#2" })}%
+ \getparameters[\??mk#1][\s!parent=\??mk#2]}}
-% \decouplemarking[#1]% % no coupling with sections
+\def\dorelatemarking[#1][#2]%
+ {\ctxcommand{relatemarking("#1","#2")}}
-\def\fastresetmarker#1%
- {\ifcsname\??mk#1\s!parent\endcsname
- \dowithmarkcommandone\resetmark{#1}%
+\def\dosetmarking[#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)}}%
\fi}
-\def\fastresetmarkerlist[#1]%
- {\normalexpanded{\noexpand\rawprocesscommalist[#1]}\fastresetmarker}
-
-\def\resetmarking
- {\dosingleargument\doresetmarking}
-
\def\doresetmarking[#1]%
- {\processcommalist[#1]\fastresetmarker}
-
-%D Used elsewhere:
-
-\let\nomarking\empty
+ {\ctxcommand{resetmarking("#1")}}
-%D Basic fetching:
-
-\letvalue{\??mk::\??mk::\v!previous}\firstoffourarguments
-\letvalue{\??mk::\??mk::\v!first }\secondoffourarguments
-\letvalue{\??mk::\??mk::\v!last }\thirdoffourarguments
-\letvalue{\??mk::\??mk::\v!current }\fourthoffourarguments
-
-\letvalue{\??mk\??mk\v!previous}\gettopmark
-\letvalue{\??mk\??mk\v!first }\getfirstmark
-\letvalue{\??mk\??mk\v!last }\getbotmark
-\letvalue{\??mk\??mk\v!current }\getcurrentmark
-
-\letvalue{\??mk\??mk\v!column:\v!first}\getsplitfirstmark
-\letvalue{\??mk\??mk\v!column:\v!last }\getsplitbottommark
-
-\def\fetchmark[#1]#2[#3]% % expandable / never use \unexpanded
- {\ifcsname\??mk::#1\endcsname % saved mark
- \markingparameter{#1}\c!filtercommand{\csname\??mk::\??mk::#3\@EA\@EA\@EA\endcsname\csname\??mk::#1\endcsname}%
- \else\ifcsname\??mk#1\s!parent\endcsname % real mark
- \markingparameter{#1}\c!filtercommand{\expandafter\dowithmarkcommandone\csname\??mk\??mk#3\endcsname{#1}}%
- \fi\fi}
+\def\doifelsemarking#1%
+ {\ctxcommand{doifelsemarking("#1")}}
-\def\fetchtwomarks[#1]%
- {\dofetchtwomarks[#1][#1]}
+\def\dosynchronizemarking[#1][#2]% class boxnumber (some day also name), maybe second argument table
+ {\ifvoid#2\else\ctxcommand{synchronizemarking("#1",\number#2)}\fi}
-\def\fetchallmarks[#1]%
- {\dofetchallmarks[#1][#1]}
+% \appendtoks
+% \dosynchronizemarking[\v!page][\normalpagebox]%
+% \to \everybeforepagebody
-\def\dofetchtwomarks[#1][#2]% class class:tag
- {\doifsomething{\fetchmark[#2][\v!first]}
- {\fetchmark[#2][\v!first]%
- \doifsomething{\fetchmark[#2][\v!last]}
- {\doifnot{\fetchmark[#2][\v!first]}{\fetchmark[#2][\v!last]}
- {\markingparameter{#1}\c!separator\fetchmark[#2][\v!last]}}}}
+% defaults
-\def\dofetchallmarks[#1][#2]%
- {\doifsomething{\fetchmark[#2][\v!first]}
- {\doifsomething{\fetchmark[#2][\v!previous]}
- {\doifnot{\fetchmark[#2][\v!previous]}{\fetchmark[#2][\v!first]}
- {\fetchmark[#2][\v!previous]\markingparameter{#1}\c!separator}}}%
- \fetchtwomarks[#1][#2]}
+\setupmarking
+ [\c!expansion=\v!no,
+ \c!separator=\space\emdash\space,
+ \c!filtercommand=\firstofoneargument,
+ \c!state=\v!start]
-% \newtoks \everymarking
+% fetching, regular interface
-% \def\Interesting{\doifmodeelse{*\v!marking}{Interesting}{Boring}}
-% \setupheadertexts[chapter]
-% \starttext
-% \chapter{This Is \Interesting}
-% \stoptext
+\unexpanded\def\getmarking
+ {\ifconditional\inhibitgetmarking
+ \expandafter\dotripleargument\expandafter\nogetmarking
+ \else
+ \expandafter\dotripleargument\expandafter\dogetmarking
+ \fi}
-\def\markingnomarking#1{\splitsequence{\markingparameter{#1}\c!limittext}} % #2
+\def\nogetmarking[#1][#2][#3]%
+ {}
\def\dogetmarking[#1][#2][#3]%
- {\doif{\markingparameter{#1}\c!state}\v!start
- {\bgroup
+ {\doif{\namedmarkingparameter{#1}\c!state}\v!start
+ {\begingroup
\setsystemmode\v!marking
\the\everymarking
- \def\nomarking{\markingnomarking{#1}}% just for good old times, might disappear
\ifthirdargument
- \dodogetmarking{#3}{#1}{#1:#2}{#3}%
+ \ctxcommand{getmarking("#1","#2","#3")}%
\else
- \dodogetmarking{#2}{#1}{#1}{#2}%
+ \ctxcommand{getmarking("#1","\v!page","#2")}%
\fi
- \egroup}}
-
-\def\dodogetmarking#1#2#3#4% to be made faster
- {\processaction % slow
- [#1]
- [ \v!both=>{\dofetchtwomarks[#2][#3]},
- \v!all=>{\dofetchallmarks[#2][#3]},
- \s!default=>{\fetchmark[#3][\v!first]},
- \s!unknown=>{\fetchmark[#3][#4]}]}
-
-\def\nogetmarking[#1][#2][#3]%
- {}
-
-\unexpanded\def\getmarking
- {\dotripleargument\dogetmarking}
-
-\let\setsomemark\setmark
-
-\def\setmarking
- {\dosingleargument\dosetmarking}
+ \endgroup}}
-\def\dosetmarking[#1]#2%
- {\ifcsname\??mk#1\s!parent\endcsname
- \begingroup
- \doifelse{\markingparameter{#1}\c!expansion}\v!yes\expandmarkstrue\expandmarksfalse
- \dowithmarkcommandone\setsomemark{#1}{#2}%
- \endgroup
- \fi}
-
-\let\marking\setmarking
-
-% to be adapted for mkiv:
-%
-% this version can be used when a page is built up in steps without
-% feedback of the otr'd list to the mvl (i.e.\ a page made of pages,
-% as in column sets where content is buffered)
-
-% reset at begin
-% preset before page
-% bubble in column
-% refresh at end
-
-% marks is a kind of toks, so maybe we need a low level \the\marks
-%
-% use \normalunexpanded here
-
-\def\refreshsavedmark[#1][#2]% mark tag (packing saves many hash entries)
- {\setxvalue{\??mk::#1:#2}%
- {{\@EA\ifx\csname\??mk::#1:pp\endcsname\relax
- % empty
- \else
- \csname\??mk::#1:pp\endcsname
- \fi}%
- {\@EA\ifx\csname\??mk::#1:ff\endcsname\relax
- \fetchmark[#1][\v!first]%
- \else
- \csname\??mk::#1:ff\endcsname
- \fi}%
- {\fetchmark[#1][\v!last]}%
- {\fetchmark[#1][\v!current]}}%
- \setxvalue{\??mk::#1:pp}{\fetchmark[#1][\v!first]}%
- \letgvalue{\??mk::#1:ff}\relax
- }
-
-\def\bubblesavedmark[#1][#2]% no packing (not now, maybe make a six-pack later)
- {\@EA\ifx\csname\??mk::#1:ff\endcsname\relax
- \setxvalue{\??mk::#1:ff}{\fetchmark[#1][\v!first]}%
- \fi}
-
-\def\resetsavedmark[#1][#2]% mark tag
- {\doifelsenothing{\fetchmark[#1][\v!previous]}
- {\letgvalue{\??mk::#1:pp}\relax}
- {\setxvalue{\??mk::#1:pp}{\fetchmark[#1][\v!previous]}}%
- \doifelsenothing{\fetchmark[#1][\v!first]}
- {\letgvalue{\??mk::#1:ff}\relax}
- {\setxvalue{\??mk::#1:ff}{\fetchmark[#1][\v!first]}}%
- \letgvalue{\??mk::#1:#2}\emptysavedmark}
+% the fetchers are fully expandable: [name][method]
-\def\presetsavedmark[#1][#2]% mark tag
- {\letgvalue{\??mk::#1:#2}\emptysavedmark}
+\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\emptysavedmark{{}{}{}{}}
+\let\fetchmark\fetchonemark
-% new (can be used in column sets)
-%
-% \getsavedmarking[M][previous]
-% \getsavedmarking[M][first]
-% \getsavedmarking[M][last]
-
-\def\getsavedmarking
- {\dodoubleargument\dogetsavedmarking}
-
-\def\dogetsavedmarking[#1][#2]%
- {\doifelse{#2}\v!previous
- {\getmarking[#1][1][\v!previous]}
- {\doifelse{#2}\v!first
- {\getmarking[#1][1][\v!first]}
- {\getmarking[#1][\v!last]}}}
+% also fully expandable but here we have: [name][range][method]
-%D And then \unknown\ we had a chaptertitle packaged in a
-%D makeup environment. And we don't want to loose marks there!
+\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}
-\newbox\collectedmarks
+\let\fetchmarking\fetchonemarking
-\def\flushmarks % use with care to avoid empty pages
- {\ifvoid\collectedmarks\else\unhbox\collectedmarks\fi}
+\def\markingseparator#1{\namedmarkingparameter{#1}\c!separator}
+\def\markingcommand #1{\namedmarkingparameter{#1}\c!filtercommand}
-\def\postponemarks
- {\let\setsomemark\postponemark}
-
-\def\postponemark#1#2%
- {\global\setbox\collectedmarks\hbox{\unhbox\collectedmarks\setmark{#1}{#2}}}
+%D Experimental:
+%D
+%D \starttyping
+%D \definemarking[boxmark]
+%D
+%D \setbox0\ruledvbox{
+%D \marking[boxmark]{tufte} \input tufte \par
+%D \marking[boxmark]{ward} \input ward \par
+%D }
+%D
+%D \synchronizemarking[zerobox][0] \box0
+%D
+%D marks: (\getmarking[boxmark][zerobox][first],\getmarking[boxmark][zerobox][last])
+%D \stoptyping
\protect \endinput
-
-% todo: make it work in balancing
-%
-% \definemarking[vers][]
-% \setupheadertexts
-% [\doiftext{\getmarking[vers][first]}
-% {\doiftextelse{\getmarking[vers][column:last]}
-% {\getmarking[vers][first] -- \getmarking[vers][column:last]}
-% {\getmarking[vers][first]}}]
-% \starttext
-% \startcolumns[n=2,balance=no]
-% \dorecurse{10}{\normalexpanded{\noexpand\marking[vers]{\recurselevel}} \recurselevel:\dorecurse{4}{\input ward } \endgraf}
-% \stopcolumns
-% \stoptext
diff --git a/Master/texmf-dist/tex/context/base/strc-mat.lua b/Master/texmf-dist/tex/context/base/strc-mat.lua
index 291cc8845d6..d9cca27176a 100644
--- a/Master/texmf-dist/tex/context/base/strc-mat.lua
+++ b/Master/texmf-dist/tex/context/base/strc-mat.lua
@@ -6,19 +6,15 @@ if not modules then modules = { } end modules ['strc-mat'] = {
license = "see context related readme files"
}
-structure = structure or { }
-structure.helpers = structure.helpers or { }
-structure.lists = structure.lists or { }
-structure.lists.enhancers = structure.lists.enhancers or { }
-structure.sections = structure.sections or { }
-structure.helpers = structure.helpers or { }
-structure.formulas = structure.formulas or { }
-
-local lists = structure.lists
-local sections = structure.sections
-local floats = structure.floats
-local helpers = structure.helpers
-local formulas = structure.formulas
+local structures = structures
+
+local lists = structures.lists
+local sections = structures.sections
+local floats = structures.floats
+local helpers = structures.helpers
+local formulas = structures.formulas
+
+lists.enhancers = lists.enhancers or { }
-- maybe we want to do clever things with formulas, the store might go away
diff --git a/Master/texmf-dist/tex/context/base/strc-mat.mkiv b/Master/texmf-dist/tex/context/base/strc-mat.mkiv
index 2064db2c586..8d408936036 100644
--- a/Master/texmf-dist/tex/context/base/strc-mat.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-mat.mkiv
@@ -73,8 +73,9 @@
[\c!name=\v!formula,\s!counter=\v!formula,%
\s!hascaption=\v!yes,\s!hastitle=\v!yes,\s!hasnumber=\v!yes,%\s!haslevel=#6,%
\s!hasnumber=\v!no,%
- \c!reference=#1,\c!title=,\c!bookmark=]%
+ \c!reference=#1,\c!title=\namedformulaentry,\c!bookmark=]%
[#2]%
+ \glet\namedformulaentry\relax
\globallet#3\laststructurecounternumber
\globallet#4\laststructurecountersynchronize
\globallet#5\laststructurecounterattribute}
@@ -86,6 +87,13 @@
\newtoks\everyresetformulas
+% 0=unset, 1=forced, 2=none, 3=reference
+
+\newconstant\placeformulanumbermode
+\newconstant\formulasnumbermode
+\newconstant\subformulasnumbermode
+\newconstant\nestedformulanumbermode
+
\newconditional\insideplaceformula
\newconditional\insideplacesubformula
\newconditional\insideformulas
@@ -129,11 +137,17 @@
\def\doplacecurrentformulanumber
{\dohandlecurrentformulareferences
- %\currentformulasattribute % todo
- %\currentformulasattribute % todo
- %\currentsubformulaattribute % todo
\labeltexts\currentformula{\doconvertedstructurecounter[\v!formula][]}}
+% \def\theboxdestinationattribute#1{\iflocation\ifx#1\relax\else\ifx#1\empty\else attr \destinationattribute#1\fi\fi\fi}
+% \def\thedestinationattribute #1{\iflocation\ifx#1\relax\else\ifx#1\empty\else \attribute\destinationattribute#1\fi\fi\fi}
+
+\def\theformuladestinationattribute#1%
+ {\iflocation\ifx#1\relax\else\ifx#1\empty\else
+ \attribute\destinationattribute#1%
+ \glet#1\relax
+ \fi\fi\fi}
+
\appendtoks
\glet\currentplaceformulasynchronize \relax
\glet\currentformulassynchronize \relax
@@ -142,6 +156,8 @@
\let\currentformula\empty
\to \everyresetformulas
+% currently we do the number, some day we will do the (sub) formula
+
\def\dohandlecurrentformulareferences
{\ifnum\placeformulanumbermode=\plusthree
\storecurrentformulanumber
@@ -152,6 +168,7 @@
\currentplaceformulaattribute
\currentplaceformulasynchronize
\glet\currentplaceformulasynchronize\relax
+ \theformuladestinationattribute\currentplaceformulaattribute
\fi
\ifnum\formulasnumbermode=\plusthree
\storecurrentformulanumber
@@ -162,6 +179,7 @@
\currentformulasattribute
\currentformulassynchronize
\glet\currentformulassynchronize\relax
+ \theformuladestinationattribute\currentformulasattribute
\fi
\ifnum\subformulasnumbermode=\plusthree
\currentsubformulassynchronize
@@ -176,17 +194,21 @@
\currentnestedformulaattribute
\currentnestedformulasynchronize
\glet\currentnestedformulasynchronize\relax
+ \theformuladestinationattribute\currentnestedformulaattribute
\fi}
+% needs checking ... too many:
+
+\let\currentplaceformulaattribute\relax \let\currentplaceformulasynchronize\relax \let\currentplaceformulanumber\relax
+\let\currentformulaattribute \relax \let\currentformulasynchronize \relax \let\currentformulanumber \relax
+\let\currentsubformulaattribute \relax \let\currentsubformulasynchronize \relax \let\currentsubformulanumber \relax
+\let\currentformulasattribute \relax \let\currentformulassynchronize \relax \let\currentformulasnumber \relax
+
\let\currentformulasreference \empty \let\currentformulassuffix \empty
\let\currentformulareference \empty \let\currentformulasuffix \empty
\let\currentsubformulareference \empty \let\currentsubformulasuffix \empty
\let\currentnestedformulareference\empty \let\currentnestedformulasuffix\empty
-\let\currentformulasynchronize \relax \let\currentformulaattribute \relax
-\let\currentsubformulasynchronize\relax \let\currentsubformulaattribute\relax
-\let\currentformulassynchronize \relax \let\currentformulasattribute \relax
-
\def\dohandleformulanumbering
{\doincrementsubstructurecounter[\v!formula][1]%
\doiftext\currentplaceformulasuffix{\setsubstructurecounterown[\v!formula][2]{\currentplaceformulasuffix}}%
@@ -241,6 +263,15 @@
\definelist[\v!formula]
+\installstructurelistprocessor\v!formula % to be checked ...
+ {\dodolistelement
+ \currentlist
+ \structurelistlocation
+ \structurelistgenericnumber
+ \structurelistgenerictitle % hm, can end up in message (volkers test)
+ \structurelistpagenumber
+ \structurelistrealpagenumber}
+
\appendtoks
\global\setfalse\insideplaceformula
\global\setfalse\insideplacesubformula
@@ -425,6 +456,7 @@
\def\dodostartformula[#1][#2]% setting leftskip adaption is slow !
{\bgroup % HERE
\def\currentformula{#1}%
+ \dostarttagged\t!formula\currentformula
\the\everybeforedisplayformula
\formulaparskip\parskip
\formulastrutdp\strutdepth
@@ -439,7 +471,7 @@
\doifsomething{\formulaparameter\c!margin}% so we test first
{\dosetleftskipadaption{\formulaparameter\c!margin}%
\edef\leftdisplaymargin{\the\leftskipadaption}}% overloaded
- \long\def\dostartformula##1{\bgroup\let\dostopformula\egroup}%
+ \long\def\dostartformula##1{\bgroup\dostarttagged\t!subformula\def\dostopformula{\dostoptagged\egroup}}%
\freezedimenmacro\leftdisplayskip
\freezedimenmacro\rightdisplayskip
\freezedimenmacro\leftdisplaymargin
@@ -448,6 +480,15 @@
\forgetdisplayskips
\getvalue{\e!start\formulaparameter\c!alternative\v!formula}}
+% experiment:
+
+\appendtoks
+ \edef\currentformulagrid{\formulaparameter\c!grid}%
+ \ifx\currentformulagrid\empty \else
+ \autosetsnapvalue\currentformulagrid
+ \fi
+\to \everybeforedisplayformula
+
\def\switchtoformulabodyfont{\switchtobodyfont}
\setvalue{\v!formula}{\dosingleempty\doformula}
@@ -460,8 +501,13 @@
\endgroup}
\def\dostopformula
- {\doplaceformulanumber
+ {\dostarttagged\t!formulatag\empty
+ \doplaceformulanumber
+ \dostoptagged
+ \dostarttagged\t!formulacontent\empty
\getvalue{\e!stop\formulaparameter\c!alternative\v!formula}%
+ \dostoptagged
+ \dostoptagged
\nonoindentation
\checknextindentation[\formulaparameter\c!indentnext]%
\egroup
@@ -573,6 +619,7 @@
\def\dostartformulas[#1]#2\stopformulas % new / to be internationalized
{\bgroup
+ \dostarttagged\t!formulaset\empty
\global\settrue\insideformulas
\edef\currentformulasreference{#1}%
\handleformulasnumbering
@@ -597,6 +644,7 @@
\egroup
\stopdisplaymath
\global\setfalse\insideformulas
+ \dostoptagged
\egroup
\the\everyresetformulas
\hangafter\minusone % added for side floats
@@ -604,19 +652,13 @@
% place
-% 0=unset, 1=forced, 2=none, 3=reference
-
-\chardef\placeformulanumbermode \zerocount
-\chardef\formulanumbermode \zerocount
-\chardef\formulasnumbermode \zerocount
-\chardef\subformulasnumbermode \zerocount
-\chardef\nestedformulanumbermode\zerocount
-
\def\inhibitformulanumberflag{-}
\def\forceformulanumberflag {+}
\def\docheckformulareference#1#2%
- {\chardef#1\ifx#2\empty
+ {#1\unless\ifx\namedformulaentry\relax % new 29/8/2010
+ \plusthree
+ \else\ifx#2\empty
\zerocount
\else\ifx#2\forceformulanumberflag
\plusone
@@ -624,7 +666,7 @@
\plustwo
\else
\plusthree
- \fi\fi\fi}
+ \fi\fi\fi\fi}
\def\formulanumber{\doformulanumber} % for the moment
@@ -640,41 +682,16 @@
\dododoformulanumber}
\unexpanded\def\placeformula
- {\doglobal\settrue\insideplaceformula
+ {\global\settrue\insideplaceformula
\settrue\incrementformulanumber
- \dodoubleempty\doplaceformula}
+ \dosingleempty\doplaceformula}
\unexpanded\def\placesubformula
- {\doglobal\settrue\insideplacesubformula
+ {\global\settrue\insideplacesubformula
\setfalse\incrementformulanumber
- \dodoubleempty\doplaceformula}
-
-% \def\doplaceformula[#1][#2]% #2 = dummy, gobbles spaces
-% {\def\currentplaceformulareference{#1}%
-% \let\currentplaceformulasuffix\empty
-% \futurelet\next\redoplaceformulaone}
-%
-% \let\mathdollarsign$ % no def
-%
-% \def\redoplaceformulaone % use doifnextcharelse
-% {\ifx\next\bgroup
-% \@EA\moreplaceformula % [ref]{}
-% \else
-% \@EA\redoplaceformulatwo
-% \fi}
-%
-% \long\def\moreplaceformula#1#2% #1 dummy #1 gobbles spaces
-% {\def\currentplaceformulasuffix{#1}%
-% \futurelet\next\redoplaceformulatwo#2}
-%
-% \def\redoplaceformulatwo
-% {\ifx\next\mathdollarsign
-% \@EA\dispplaceformula % [ref]$$
-% \else
-% \@EA\dodoplaceformula % [ref]\start
-% \fi}%
+ \dosingleempty\doplaceformula}
-\def\doplaceformula[#1][#2]% #2 = dummy, gobbles spaces
+\def\doplaceformula[#1]%
{\def\currentplaceformulareference{#1}%
\let\currentplaceformulasuffix\empty
\doifnextbgroupelse\moreplaceformula\redoplaceformula} % [ref]{}
@@ -747,12 +764,10 @@
\setformulalistentry{#2}%
\next}
-\global\let\doflushformulalistentry\gobbleoneargument
+\glet\namedformulaentry\relax % this will become a key/value so that we can do bookmarks
\def\setformulalistentry#1%
- {\gdef\doflushformulalistentry##1%
- {\normalexpanded{\noexpand\writetolist[\v!formula]{##1}}{#1}%
- \global\let\doflushformulalistentry\gobbleoneargument}}
+ {\gdef\namedformulaentry{#1}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/strc-not.lua b/Master/texmf-dist/tex/context/base/strc-not.lua
index be883af57eb..07cd3249646 100644
--- a/Master/texmf-dist/tex/context/base/strc-not.lua
+++ b/Master/texmf-dist/tex/context/base/strc-not.lua
@@ -8,33 +8,31 @@ if not modules then modules = { } end modules ['strc-not'] = {
local format = string.format
local next = next
-local texsprint, texwrite, texcount = tex.sprint, tex.write, tex.count
+local texcount = tex.count
-local ctxcatcodes = tex.ctxcatcodes
+local trace_notes = false trackers.register("structures.notes", function(v) trace_notes = v end)
-local trace_notes = false trackers.register("structure.notes", function(v) trace_notes = v end)
+local report_notes = logs.reporter("structure","notes")
-structure = structure or { }
-structure.helpers = structure.helpers or { }
-structure.lists = structure.lists or { }
-structure.sections = structure.sections or { }
-structure.counters = structure.counters or { }
-structure.notes = structure.notes or { }
+local structures = structures
+local helpers = structures.helpers
+local lists = structures.lists
+local sections = structures.sections
+local counters = structures.counters
+local notes = structures.notes
+local references = structures.references
-structure.notes.states = structure.notes.states or { }
-structure.lists.enhancers = structure.lists.enhancers or { }
+notes.states = notes.states or { }
+lists.enhancers = lists.enhancers or { }
-storage.register("structure/notes/states", structure.notes.states, "structure.notes.states")
+storage.register("structures/notes/states", notes.states, "structures.notes.states")
-local helpers = structure.helpers
-local lists = structure.lists
-local sections = structure.sections
-local counters = structure.counters
-local notes = structure.notes
-
-local notestates = structure.notes.states
+local notestates = notes.states
local notedata = { }
+local variables = interfaces.variables
+local context = context
+
-- state: store, insert, postpone
function notes.store(tag,n)
@@ -43,16 +41,16 @@ function notes.store(tag,n)
nd = { }
notedata[tag] = nd
end
- local nnd = #nd+1
+ local nnd = #nd + 1
nd[nnd] = n
local state = notestates[tag]
if state.kind ~= "insert" then
if trace_notes then
- logs.report("notes","storing %s with state %s as %s",tag,state.kind,nnd)
+ report_notes("storing %s with state %s as %s",tag,state.kind,nnd)
end
state.start = state.start or nnd
end
- texwrite(#nd)
+ context(#nd)
end
local function get(tag,n)
@@ -62,9 +60,11 @@ local function get(tag,n)
nd = nd[n]
if nd then
if trace_notes then
- logs.report("notes","getting %s of %s",n,tag)
+ report_notes("getting note %s of '%s'",n,tag)
end
- return structure.lists.collected[nd]
+ -- is this right?
+ local newdata = lists.collected[nd]
+ return newdata
end
end
end
@@ -74,13 +74,14 @@ local function getn(tag)
return (nd and #nd) or 0
end
-nodes.get = get
-nodes.getn = getn
+notes.get = get
+notes.getn = getn
-- we could make a special enhancer
function notes.listindex(tag,n)
- return notedata[tag][n]
+ local ndt = notedata[tag]
+ return ndt and ndt[n]
end
function notes.define(tag,kind,number)
@@ -92,11 +93,12 @@ function notes.save(tag,newkind)
local state = notestates[tag]
if state and not state.saved then
if trace_notes then
- logs.report("notes","saving state of %s: %s -> %s",tag,state.kind,newkind or state.kind)
+ report_notes("saving state of '%s': %s -> %s",tag,state.kind,newkind or state.kind)
end
- state.saved = notedata[tag]
+ state.saveddata = notedata[tag]
state.savedkind = state.kind
state.kind = newkind or state.kind
+ state.saved = true
notedata[tag] = { }
end
end
@@ -105,18 +107,19 @@ function notes.restore(tag,forcedstate)
local state = notestates[tag]
if state and state.saved then
if trace_notes then
- logs.report("notes","restoring state of %s: %s -> %s",tag,state.kind,state.savedkind)
+ report_notes("restoring state of '%s': %s -> %s",tag,state.kind,state.savedkind)
end
- state.saved = nil
+ notedata[tag] = state.saveddata
state.kind = forcedstate or state.savedkind
- notedata[tag] = state.saved
+ state.saveddata = nil
+ state.saved = false
end
end
function notes.setstate(tag,newkind)
local state = notestates[tag]
if trace_notes then
- logs.report("notes","setting state of %s from %s to %s",tag,(state and state.kind) or "unset",newkind)
+ report_notes("setting state of '%s' from %s to %s",tag,(state and state.kind) or "unset",newkind)
end
if not state then
state = {
@@ -136,7 +139,7 @@ end
function notes.getstate(tag)
local state = notestates[tag]
- texsprint(ctxcatcodes,(state and state.kind ) or "unknown")
+ context(state and state.kind or "unknown")
end
function notes.doifcontent(tag)
@@ -162,7 +165,7 @@ local function internal(tag,n)
if r then
local i = r.internal
--~ return i and lists.internals[i]
- return i and jobreferences.internals[i]
+ return i and references.internals[i] -- dependency on references
end
end
return nil
@@ -214,7 +217,7 @@ function notes.deltapage(tag,n)
if li then
local metadata, pagenumber = li.metadata, li.pagenumber
if metadata and pagenumber then
- local symbolpage = metadata.symbolpage or 0
+ local symbolpage = references.symbolpage or 0
local notepage = pagenumber.number or 0
if notepage > 0 and symbolpage > 0 then
if notepage < symbolpage then
@@ -231,12 +234,12 @@ function notes.deltapage(tag,n)
what = 3
end
end
- texwrite(what)
+ context(what)
end
function notes.postpone()
if trace_notes then
- logs.report("notes","postponing all insert notes")
+ report_notes("postponing all insert notes")
end
for tag, state in next, notestates do
if state.kind ~= "store" then
@@ -245,28 +248,39 @@ function notes.postpone()
end
end
-function notes.setsymbolpage(tag,n)
- local nd = get(tag,n)
- if nd then
- nd.metadata.symbolpage = texcount.realpageno
+function notes.setsymbolpage(tag,n,l)
+ local l = l or notes.listindex(tag,n)
+ if l then
+ local p = texcount.realpageno
+ if trace_notes then
+ report_notes("note %s of '%s' with list index %s gets page %s",n,tag,l,p)
+ end
+ lists.cached[l].references.symbolpage = p
+ else
+ report_notes("internal error: note %s of '%s' is not initialized",n,tag)
end
end
function notes.getsymbolpage(tag,n)
local nd = get(tag,n)
- nd = nd and nd.metadata.symbolpage
- texwrite(nd or 0)
+ local p = nd and nd.references.symbolpage or 0
+ if trace_notes then
+ report_notes("page number of note symbol %s of '%s' is %s",n,tag,p)
+ end
+ context(p)
end
function notes.getnumberpage(tag,n)
local li = internal(tag,n)
- li = li and li.pagenumber
- li = li and li.numbers
- li = li and li[1]
- texwrite(li or 0)
+ li = li and li.references
+ li = li and li.realpage or 0
+ if trace_notes then
+ report_notes("page number of note number %s of '%s' is %s",n,tag,li)
+ end
+ context(li)
end
-function notes.flush(tag,whatkind) -- store and postpone
+function notes.flush(tag,whatkind,how) -- store and postpone
local state = notestates[tag]
local kind = state.kind
if kind == whatkind then
@@ -275,10 +289,10 @@ function notes.flush(tag,whatkind) -- store and postpone
if kind == "postpone" then
if nd and ns then
if trace_notes then
- logs.report("notes","flushing state %s of %s from %s to %s",whatkind,tag,ns,#nd)
+ report_notes("flushing state %s of %s from %s to %s",whatkind,tag,ns,#nd)
end
for i=ns,#nd do
- texsprint(ctxcatcodes,format("\\handlenoteinsert{%s}{%s}",tag,i))
+ context.handlenoteinsert(tag,i)
end
end
state.start = nil
@@ -286,31 +300,45 @@ function notes.flush(tag,whatkind) -- store and postpone
elseif kind == "store" then
if nd and ns then
if trace_notes then
- logs.report("notes","flushing state %s of %s from %s to %s",whatkind,tag,ns,#nd)
+ report_notes("flushing state %s of %s from %s to %s",whatkind,tag,ns,#nd)
end
+ -- todo: as registers: start, stop, inbetween
for i=ns,#nd do
- texsprint(ctxcatcodes,format("\\handlenoteitself{%s}{%s}",tag,i))
+ -- tricky : trialtypesetting
+ if how == variables.page then
+ local rp = get(tag,i)
+ rp = rp and rp.references
+ rp = rp and rp.symbolpage or 0
+ if rp > texcount.realpageno then
+ state.start = i
+ return
+ end
+ end
+ if i > ns then
+ context.betweennoteitself(tag)
+ end
+ context.handlenoteitself(tag,i)
end
end
state.start = nil
elseif kind == "reset" then
if nd and ns then
if trace_notes then
- logs.report("notes","flushing state %s of %s from %s to %s",whatkind,tag,ns,#nd)
+ report_notes("flushing state %s of %s from %s to %s",whatkind,tag,ns,#nd)
end
end
state.start = nil
elseif trace_notes then
- logs.report("notes","not flushing state %s of %s",whatkind,tag)
+ report_notes("not flushing state %s of %s",whatkind,tag)
end
elseif trace_notes then
- logs.report("notes","not flushing state %s of %s",whatkind,tag)
+ report_notes("not flushing state %s of %s",whatkind,tag)
end
end
function notes.flushpostponed()
if trace_notes then
- logs.report("notes","flushing all postponed notes")
+ report_notes("flushing all postponed notes")
end
for tag, _ in next, notestates do
notes.flush(tag,"postpone")
@@ -319,7 +347,7 @@ end
function notes.resetpostponed()
if trace_notes then
- logs.report("notes","resetting all postponed notes")
+ report_notes("resetting all postponed notes")
end
for tag, state in next, notestates do
if state.kind == "postpone" then
@@ -330,9 +358,17 @@ function notes.resetpostponed()
end
function notes.title(tag,n)
- structure.lists.savedtitle(tag,notedata[tag][n])
+ lists.savedtitle(tag,notedata[tag][n])
end
function notes.number(tag,n,spec)
- structure.lists.savedprefixednumber(tag,notedata[tag][n])
+ lists.savedprefixednumber(tag,notedata[tag][n])
+end
+
+function notes.internalid(tag,n)
+ local nd = get(tag,n)
+ if nd then
+ local r = nd.references
+ return r.internal
+ end
end
diff --git a/Master/texmf-dist/tex/context/base/strc-not.mkii b/Master/texmf-dist/tex/context/base/strc-not.mkii
index f6fae3378ce..ec38410d483 100644
--- a/Master/texmf-dist/tex/context/base/strc-not.mkii
+++ b/Master/texmf-dist/tex/context/base/strc-not.mkii
@@ -285,8 +285,6 @@
% todo: make sure less calls, is quite some code
-% BEWARE, OVERLOADED IN cont-new.mkiv
-
\def\dochecknote % only to be called locally, some bools will become class-ones
{% for the moment no mixed text/endnotes modes, so we use
% \footnoteparameter and not \noteparameter (**)
@@ -536,7 +534,7 @@
\unexpanded\def\setnotetext{\dotripleempty\dosetnote[0]}
\def\dosetnote[#1][#2][#3]%
- {\unskip
+ {\removeunwantedspaces
\def\currentnote{#2}%
\dochecknote % sometimes needed for local notes
\ifcase#1\relax
diff --git a/Master/texmf-dist/tex/context/base/strc-not.mkiv b/Master/texmf-dist/tex/context/base/strc-not.mkiv
index 45e37b276f5..bf815c7281f 100644
--- a/Master/texmf-dist/tex/context/base/strc-not.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-not.mkiv
@@ -19,14 +19,10 @@
% this needs a further cleanup ...
%
-% -- set breakpoin in descriptions
+% -- set breakpoint in descriptions
% -- reset after trialtypesetting
% -- that way we can trick the symbol space
-% obsolete
-
-\let\autopostponenotes\relax
-
% removed:
%
% \pushsomestates
@@ -38,17 +34,12 @@
% saveinsertionbox
% eraseinsertionbackup
% restoreinsertionbackup
-%
-% \def\doprocessnotescs#1#2% #1 == \cs that takes arg
-% {\def\currentnote{#2}\@EA#1\csname\??vn:\currentnote\endcsname}
-% \def\processnotescs#1{\processcommacommand[\noteinsertions]{\doprocessnotescs#1}}
-% \def\noteinsertion #1{\csname\??vn:#1\endcsname}
-\def\savenotedata {\writestatus{todo}{save note data}}
-\def\restorenotedata {\writestatus{todo}{restore note data}}
-\def\savenotecontent {\writestatus{todo}{save note content}}
-\def\restorenotecontent{\writestatus{todo}{restore note content}}
-\def\erasenotebackup {\writestatus{todo}{erase note backup}}
+\def\savenotedata {} % \writestatus{todo}{save note data}}
+\def\restorenotedata {} % \writestatus{todo}{restore note data}}
+\def\savenotecontent {} % \writestatus{todo}{save note content}}
+\def\restorenotecontent{} % \writestatus{todo}{restore note content}}
+\def\erasenotebackup {} % \writestatus{todo}{erase note backup}}
% page-set:
@@ -183,7 +174,7 @@
\c!width=\defaultnotewidth,
\c!height=\textheight,
\c!numbercommand=\high,
- \c!command=\noteparameter\c!numbercommand, % downward compatible
+ \c!command=, % \noteparameter\c!numbercommand, % (command in enumeration) too messy, called twice
\c!separator=,% \@@koseparator,
\c!textcommand=\high,
\c!textstyle=\tx,
@@ -192,9 +183,11 @@
%\c!factor=,
%\c!scope=, % \v!text \v!page
\c!prefixconnector=.,
- %\c!next=\autoinsertnextspace
+ %\c!next=\autoinsertnextspace,
\c!prefix=\v!no,
%\c!continue=\v!no,
+ \c!paragraph=\v!no,
+ \c!inbetween=\hskip1em,
\c!n=1]
\setupnotes
@@ -214,40 +207,85 @@
\newtoks \everysetupnote
\unexpanded\def\definenote
- {\dodoubleempty\dodefinenote}
+ {\dotripleempty\dodefinenote}
-\def\dodefinenote[#1][#2]%
+\def\dodefinenote[#1][#2][#3]% note [parent] [settings]
{\edef\currentnote{#1}%
\ifcsname\??vn:\currentnote\endcsname\else
\@EA\installinsertion\csname\??vn:\currentnote\endcsname\relax
\appendtoks\doprocesssomenote{#1}\to\tobeprocessednotes
\fi
- \defineenumeration % description
+ \ifsecondargument
+ \doifassignmentelse{#2}{\dodefinenotewithsettings{#2}}{\dodefinenotewithparent{#2}{#3}}%
+ \else
+ \dodefinenotesimple
+ \fi
+ \ctxlua{structures.notes.define("\currentnote","insert",\number\csname\??vn:\currentnote\endcsname)}%
+ \the\everysetupnote
+ \dochecknote}
+
+\def\dodefinenotesimple
+ {\defineenumeration
[\currentnote]
- [\c!location=\@@defaultnotedefloc,
+ [\s!handler=\v!note,
+ \c!text=,
+ \c!location=\@@defaultnotedefloc,
\c!distance=\@@defaultnotedefdis,
\c!width=\v!fit,
- \c!headstyle=\noteparameter\c!style, % hm
- \c!headcolor=\noteparameter\c!color, % hm
- \s!handler=\v!note,
+ \c!headstyle=\noteparameter\c!style,
+ \c!headcolor=\noteparameter\c!color,
+ \c!before=,
+ \c!after=]%
+ \doredefinenotecommands
+ \presetlocalframed
+ [\??vn\currentnote]%
+ \setupenumerations
+ [\currentnote]
+ [\s!parent=\??vn\currentnote,
+ \c!number=\v!yes]% no inheritance from decriptions which is okay
+ \getparameters
+ [\??vn\currentnote]
+ [\s!parent=\??vn]}
+
+\def\dodefinenotewithsettings#1%
+ {\defineenumeration % description
+ [\currentnote]
+ [\s!handler=\v!note,
\c!text=,
+ \c!location=\@@defaultnotedefloc,
+ \c!distance=\@@defaultnotedefdis,
+ \c!width=\v!fit,
+ \c!headstyle=\noteparameter\c!style,
+ \c!headcolor=\noteparameter\c!color,
\c!before=,
\c!after=]%
- \doredefinenotecommands\currentnote
+ \doredefinenotecommands
+ \presetlocalframed
+ [\??vn\currentnote]%
\setupenumerations
[\currentnote]
[\s!parent=\??vn\currentnote,
- \c!number=\v!yes] % no inheritance from decriptions which is okay
+ \c!number=\v!yes]%
+ \getparameters
+ [\??vn\currentnote]
+ [\s!parent=\??vn,#1]}
+
+\def\dodefinenotewithparent#1#2%
+ {%setevalue{\??vn:#2:kids}{\ifcsname\??vn:#2:kids\endcsname\csname\??vn:#2:kids\endcsname,\fi#1}%
+ \defineenumeration
+ [\currentnote]
+ [\s!handler=\v!note,
+ \c!text=]%
+ \doredefinenotecommands
\presetlocalframed
[\??vn\currentnote]%
+ \setupenumerations
+ [\currentnote]
+ [\s!parent=\??dd#1,
+ \c!number=\v!yes]%
\getparameters
[\??vn\currentnote]
- [\s!parent=\??vn,#2]%
-% \definestructurecounter
-% [\currentnote]%
- \ctxlua{structure.notes.define("\currentnote","insert",\number\csname\??vn:\currentnote\endcsname)}%
- \the\everysetupnote
- \dochecknote}
+ [\s!parent=\??vn#1,#2]}
% \starttext
% text \startfootnote Test.\stopfootnote
@@ -263,25 +301,27 @@
{\begingroup
\doenumerationinit{#1}{#2}{#3}%
\@@notemakedescription[##1]{}{##2}%
- \endgroup}}
+ \expandafter\endgroup\noteparameter\c!next}} % WS: added \noteparameter\c!next
-\def\doredefinenotecommands#1%
- {\normalexpanded{\noexpand\dodoredefinenotecommands{#1}{1}{}}%
+\def\doredefinenotecommands
+ {\normalexpanded{\noexpand\dodoredefinenotecommands{\currentnote}{1}{}}%
\let\@@subslevel\empty
\dostepwiserecurse{2}{\descriptionparameter\c!levels}{1}
- {\normalexpanded{\noexpand\dodoredefinenotecommands{#1}{\recurselevel}{\@@subslevel\v!sub}}%
+ {\normalexpanded{\noexpand\dodoredefinenotecommands{\currentnote}{\recurselevel}{\@@subslevel\v!sub}}%
\edef\@@subslevel{\@@subslevel\v!sub}}}
\let\setupnotedefinition\setupenumerations
+% \def\dodowithcurrentnoteandkids#1#2% action kid
+% {\pushmacro\currentnote
+% \def\currentnote{#2}%
+% \dowithcurrentnoteandkids{#1}% recursive
+% \popmacro\currentnote}%
+
\appendtoks
\setupenumerations[\currentnote][]%
\to \everysetupnote
-% \appendtoks
-% \dochecknote
-% \to \everysetupnote
-
\unexpanded\def\setupnote
{\dodoubleempty\dosetupnote}
@@ -338,8 +378,8 @@
% compatibility (will go away)
-\newif\ifendnotes
-\newif\ifbottomnotes
+\newif\ifbottomnotes % still used in page-one.mkiv
+%newif\endnotes % no longer used
% locations:
@@ -351,10 +391,9 @@
\def\clevernotes % compatibility hack, will be redone
{\numexpr\ifcase\namednoteparameter\v!footnote\s!noteloc\or0\or2\or2\or1\else0\fi\relax}
-\def\setnotelocation #1{\expandafter\chardef\csname\??vn\currentnote\s!noteloc\endcsname#1\relax}
-\def\setnoteposition #1{\expandafter\chardef\csname\??vn\currentnote\s!notepos\endcsname#1\relax}
-\def\setnoteformatting#1{\expandafter\chardef\csname\??vn\currentnote\s!notefmt\endcsname#1\relax}
-\def\setnotecolumns #1{\expandafter\chardef\csname\??vn\currentnote\s!notecol\endcsname#1\relax}
+\def\setnotelocation #1{\expandafter\let\csname\??vn\currentnote\s!noteloc\endcsname#1\relax}
+\def\setnoteposition #1{\expandafter\let\csname\??vn\currentnote\s!notepos\endcsname#1\relax}
+\def\setnoteformatting#1{\expandafter\let\csname\??vn\currentnote\s!notefmt\endcsname#1\relax}
\def\currentnofcolumns{\@@kln}
@@ -369,20 +408,25 @@
\def\dosetcheckednote#1{\csname\??vn @#1\endcsname}
+\newtoks\everychecknote
+
\def\dochecknote
{% node states
- \setnotelocation\plusone
- \setnoteposition\plustwo
- \normalexpanded{\noexpand\rawprocesscommalist[\noteparameter\c!location]}\dosetcheckednote
+ \setnotelocation\plusone % page
+ \setnoteposition\plustwo % high
+ \normalexpanded{\rawprocesscommalist[\noteparameter\c!location]}\dosetcheckednote
% compatibility hack
- \ifnum\noteparameter\s!noteloc=\plusfive \endnotestrue \else \endnotesfalse \fi
+ %ifnum\noteparameter\s!noteloc=\plusfive \endnotestrue \else \endnotesfalse \fi
\ifnum\noteparameter\s!notepos=\plustwo \bottomnotestrue \else \bottomnotesfalse \fi
% set column multiplier
\edef\currentnotenofcolumns{\noteparameter\c!n}%
\ifx\currentnotenofcolumns\empty
\let\currentnotenofcolumns\!!plusone
\fi
- \ifcase\noteparameter\s!noteloc\or
+ \ifcase\noteparameter\s!noteloc
+ % can't happen
+ \scratchcounter\plusone
+ \or
% page
\scratchcounter \currentnotenofcolumns
\or
@@ -399,6 +443,9 @@
\scratchcounter\currentnotenofcolumns
\fi
% column factor
+ \ifcase\scratchcounter
+ \scratchcounter\plusone
+ \fi
\global\count\currentnoteins\plusthousand
\global\count\currentnoteins\numexpr\plusthousand/\scratchcounter\relax
% maximize height
@@ -409,17 +456,19 @@
\dosetnotedistance
% play safe
\ifnum\noteparameter\s!noteloc=\plusfive
- \ctxlua{structure.notes.setstate("\currentnote","store")}%
+ \ctxlua{structures.notes.setstate("\currentnote","store")}%
% text notes (e.g. end notes) but we don't use inserts anyway
\global\dimen\currentnoteins\maxdimen
\global\count\currentnoteins\zerocount
\global\skip \currentnoteins\zeropoint
- \fi}
+ \fi
+ \the\everychecknote}
\def\dosetnotedistance
{\begingroup
\setbox\scratchbox\vbox
{\forgetall
+% \setnotebodyfont
\dontcomplain
\noteparameter\c!before
\placenoterule
@@ -580,7 +629,7 @@
\unexpanded\def\setnotetext[#1]{\global\settrue\skipnoteplacement\getvalue{#1}}
\def\domovednote#1#2#3#4%
- {\ifcase\ctxlua{structure.notes.deltapage("#1",#2)}\or\symbol[#3]\or\symbol[#4]\fi}
+ {\ifcase\ctxlua{structures.notes.deltapage("#1",#2)}\or\symbol[#3]\or\symbol[#4]\fi}
\setvalue{\??dd:\v!note:\s!handler:\s!text }{\@@donotetext}
\setvalue{\??dd:\v!note:\s!handler:\s!number}{\@@donotenumber}
@@ -605,7 +654,7 @@
\doenumerationcheckconditions
\let\currentnote\currentdescriptionmain
\dodescriptioncomponent[\c!reference=#1,\c!label={\descriptionparameter\c!text},\c!title={#3},\c!list=,\c!bookmark=,][]%
- \xdef\currentnotenumber{\ctxlua{structure.notes.store("\currentnote",\currentdescriptionnumberentry)}}%
+ \xdef\currentnotenumber{\ctxlua{structures.notes.store("\currentnote",\currentdescriptionnumberentry)}}%
\settrue\processingnote
\ifconditional\skipnoteplacement
\globallet\lastnotesymbol\dolastnotesymbol
@@ -637,15 +686,21 @@
\fi}
\def\dolastnotesymbol
- {\typesetsomenotesymbol\currentnote\currentnotenumber}
+ {\typesetsomenotesymbol\currentnote\currentnotenumber\currentdescriptionnumberentry}
+
+\let\dotagsetnotesymbol\relax
-\def\dotypesetsomenotesymbol#1#2% running text
+\def\dotypesetsomenotesymbol#1#2#3% running text (messy: #1 and current mixed)
{\dodonotesymbol
- {\synchronizesomenotesymbol{#1}{#2}%
- \ctxlua{structure.notes.number("\currentnote",\currentnotenumber)}% \currentdescriptionnumberentry
+ {\synchronizesomenotesymbol{#1}{#2}{#3}%
+% \ctxlua{structures.notes.number("\currentnote",\currentnotenumber)}% \currentdescriptionnumberentry
+ \dostarttagged\t!descriptionsymbol\currentnote
+ \dotagsetnotesymbol
+ \ctxlua{structures.notes.number("#1",#2)}%
+ \dostoptagged
\domovednote{#1}{#2}\v!previouspage\v!nextpage}}
-\unexpanded\def\typesetsomenotesymbol#1#2% running text
+\unexpanded\def\typesetsomenotesymbol#1#2#3% running text
{\removeunwantedspaces
\doifitalicelse\/\donothing % Charles IV \footnote{the fourth}
\ifdim\lastkern=\notesignal
@@ -653,8 +708,8 @@
\fi
\nobreak
\doifelse{\noteparameter\c!interaction}\v!no
- {\dotypesetsomenotesymbol{#1}{#2}}
- {\directgotobox{\dotypesetsomenotesymbol{#1}{#2}}[page(\ctxlua{structure.notes.getnumberpage("#1",\number#2)})]}% f:
+ {\dotypesetsomenotesymbol{#1}{#2}{#3}}
+ {\directgotobox{\dotypesetsomenotesymbol{#1}{#2}{#3}}[page(\ctxlua{structures.notes.getnumberpage("#1",\number#2)})]}% f:
\globallet\lastnotesymbol\relax}
\unexpanded\def\typesetdummynotesymbol % temp hack
@@ -668,7 +723,7 @@
\globallet\lastnotesymbol\relax}
\def\currentnotedescriptiontext % todo: can be other number
- {\ctxlua{structure.notes.title("\currentnote",\currentdescriptionnumberentry)}}
+ {\ctxlua{structures.notes.title("\currentnote",\currentdescriptionnumberentry)}}
\def\@@donotetext
{\ifconditional\enumerationnumberenabled
@@ -690,34 +745,46 @@
{\docurrentnoteenumerationfullnumber}%
{\directgotobox
{\docurrentnoteenumerationfullnumber}%
- [page(\ctxlua{structure.notes.getsymbolpage("\currentnote",\currentdescriptionnumberentry)})]}}
+ [page(\ctxlua{structures.notes.getsymbolpage("\currentnote",\currentdescriptionnumberentry)})]}}
\def\docurrentnoteenumerationfullnumber
{\noteparameter\c!numbercommand
{\dosetnoteattributes\c!numberstyle\c!numbercolor
- \ctxlua{structure.notes.number("\currentnote",\currentdescriptionnumberentry)}%
+ \ctxlua{structures.notes.number("\currentnote",\currentdescriptionnumberentry)}%
\domovednote\currentdescription\currentdescriptionnumberentry\v!nextpage\v!previouspage}}
-\def\synchronizesomenotesymbol#1#2% called more often than needed
- {\expanded{\noexpand\ctxlatelua{structure.notes.setsymbolpage("#1",#2)}}}
+\def\synchronizesomenotesymbol#1#2#3% called more often than needed
+ {\iftrialtypesetting\else
+ \normalexpanded{\noexpand\ctxlatelua{structures.notes.setsymbolpage("#1",#2,#3)}}%
+ \fi}
-\def\handlenoteinsert#1#2%
+\def\handlenoteinsert#1#2% tg, id
{\begingroup
\edef\currentnote{#1}%
\the\everybeforenoteinsert
\insert\currentnoteins\bgroup
\the\everyinsidenoteinsert
\doprocesslocalsetups{\noteparameter\c!setups}% experimental
- \handlenoteitself{#1}{#2}%
+ \doifelse{\noteparameter\c!paragraph}\v!yes
+ {\nointerlineskip
+ \startvboxtohbox
+ \handlenoteitself{#1}{#2}%
+ % add some slack
+ \stopvboxtohbox}
+ {\handlenoteitself{#1}{#2}}%
\egroup
\the\everyafternoteinsert
\endgroup}
+\def\betweennoteitself#1% tg
+ {\edef\currentnote{#1}%
+ \doif{\noteparameter\c!paragraph}\v!yes\dobetweenparagraphnotes}
+
\def\handlenoteitself#1#2% tg, id
{\edef\currentdescription{#1}%
\edef\currentnote{#1}%
\edef\currentdescriptionnumberentry{#2}%
- \edef\currentdescriptionlistentry{\ctxlua{tex.write(structure.notes.listindex("#1",#2))}}%
+ \edef\currentdescriptionlistentry{\ctxlua{tex.write(structures.notes.listindex("#1",#2))}}%
% as we can have collected notes (e.g. in tables) we need to recover
% \currentdescriptionattribute and \currentdescriptionsynchronize
\reinstatedescriptionnumberentry\currentdescriptionlistentry % we could store the number in the entry
@@ -738,7 +805,6 @@
%D by using an indirect call to the \type{\insert} primitive.
%D Making footnote numbers active is not always that logical,
-%D Making footnote numbers active is not always that logical,
%D especially when we keep the reference and text at one page.
%D On the other hand we need interactivity when we refer to
%D previous notes or use end notes. Therefore we support
@@ -747,10 +813,8 @@
%D mainly because endnotes had to be supported.} that is,
%D automatically (vise versa) and by user supplied reference.
-\newcount\internalnotereference
-
-\let\startpushnote=\relax
-\let\stoppushnote =\relax
+\let\startpushnote\relax
+\let\stoppushnote \relax
\newsignal\notesignal
\newcount \notepenalty
@@ -768,6 +832,7 @@
\let\flushnotes\relax
\let\postponenotes\relax
\forgetall
+ \resetallattributes % new, we don't want color bleed into notes
\to \everybeforenoteinsert
\appendtoks
@@ -780,9 +845,9 @@
\splitmaxdepth\strutdp % not actually needed here
\leftmargindistance\noteparameter\c!margindistance
\rightmargindistance\leftmargindistance
- \ifnum\noteparameter\c!n=\zerocount % no ifcase new 31-07-99 ; always ?
- \doifnotinset{\noteparameter\c!width}{\v!fit,\v!broad}\setnotehsize % ?
- \fi
+% \ifnum\noteparameter\c!n=\zerocount % no ifcase new 31-07-99 ; always ?
+% \doifnotinset{\noteparameter\c!width}{\v!fit,\v!broad}\setnotehsize % ?
+% \fi
\to \everyinsidenoteinsert
% not: \appendtoks \setnotehsize \to \everyinsidenoteinsert (spoils columns)
@@ -833,6 +898,47 @@
\unexpanded\def\unvboxed {\ifvmode\unvbox \else\box \fi}
\unexpanded\def\unvcopied{\ifvmode\unvcopy\else\copy\fi}
+% idea: tag with attr and then just flush them again
+
+\def\dobetweenparagraphnotes % should not be too much
+ {\noteparameter\c!inbetween}
+
+\def\doflushgobalnotes
+ {\doifelse{\noteparameter\c!paragraph}\v!yes
+ {\vbox
+ {\beginofshapebox
+ \iftrialtypesetting\unvcopied\else\unvboxed\fi\currentnoteins
+ \endofshapebox
+ %\doreshapebox{\box\shapebox}{}{}{}% get rid of penalties etc
+ \gdef\dodobetweenparagraphnotes{\glet\dodobetweenparagraphnotes\dobetweenparagraphnotes}% shape works reverse
+ \doreshapebox{\hbox{\unhbox\shapebox\dodobetweenparagraphnotes}}{}{}{}% get rid of penalties etc
+ \innerflushshapebox
+ \convertvboxtohbox}}
+ {\iftrialtypesetting\unvcopied\else\unvboxed\fi\currentnoteins}}
+
+\def\dodoplacenoteinserts
+ {\ifcase\noteparameter\c!n\relax
+ % should not happen
+ \or
+ \doglobalflushnotesnormal
+ \else
+ \doglobalflushnotescolums
+ \fi}
+
+\def\doglobalflushnotesnormal
+ {%\iftrialtypesetting\copy\else\box\fi\currentnoteins
+ \doflushgobalnotes
+ \obeydepth} % (a) added , since split footnotes will not align properly
+
+\def\doglobalflushnotescolums
+ {\edef\currentnotewidth{\noteparameter\c!width}%
+ \doifdimensionelse\currentnotewidth\donothing
+ {\edef\currentnotewidth{\the\hsize}}%
+ \startsimplecolumns[\c!distance=\noteparameter\c!columndistance,\c!n=\noteparameter\c!n,\c!width=\currentnotewidth]%
+ %\iftrialtypesetting\unvcopied\else\unvboxed\fi\currentnoteins % compare with local
+ \doflushgobalnotes
+ \stopsimplecolumns}
+
\def\doplacenoteinserts
{\relax\ifdim\ht\currentnoteins>\zeropoint\relax
\ifnum\noteparameter\s!noteloc=\plusfive
@@ -842,24 +948,15 @@
\whitespace
\noteparameter\c!before
\fi
-% \bgroup
-% \setupalign[\noteparameter\c!align]%
+ % \bgroup
+ % \setupalign[\noteparameter\c!align]%
\placenoterule % alleen in ..mode
-% \par
-% \egroup
+ % \par
+ % \egroup
\bgroup
\setnotebodyfont
\setbox\scratchbox\hbox
- {% this should be checked, smells like a mix-up
- % does not split: \ifcase\noteparameter\c!n\unvbox\else\box\fi\currentnoteins
- \ifcase\noteparameter\c!n\relax
- \iftrialtypesetting\unvcopied\else\unvboxed\fi\currentnoteins % is this needed?
- \or
- \iftrialtypesetting\copy\else\box\fi\currentnoteins
- \obeydepth % (a) added , since split footnotes will not align properly
- \else
- \iftrialtypesetting\unvcopied\else\unvboxed\fi\currentnoteins
- \fi}%
+ {\dodoplacenoteinserts}%
\setbox\scratchbox\hbox
{\localframed
[\??vn\currentnote]
@@ -919,7 +1016,7 @@
{\ifconditional\postponingnotes\else
\global\settrue\postponingnotes
\global\let\flushnotes\doflushnotes
- \ctxlua{structure.notes.postpone()}%
+ \ctxlua{structures.notes.postpone()}%
\fi}
\let\flushnotes\relax
@@ -929,7 +1026,7 @@
\begingroup
\let\flushnotes \relax
\let\postponenotes\relax
- \ctxlua{structure.notes.flushpostponed()}% this also resets the states !
+ \ctxlua{structures.notes.flushpostponed()}% this also resets the states !
\global\setfalse\postponednote
\global\setfalse\postponingnotes
\global\let\flushnotes\relax
@@ -974,25 +1071,25 @@
{\doifnot{\noteparameter\c!continue}\v!yes
{\savestructurecounter[#1]%
\resetstructurecounter[#1]}%
- \ctxlua{structure.notes.save("#1","store")}}
+ \ctxlua{structures.notes.save("#1","store")}}
\def\dodostoplocalnotes#1%
{\doifnot{\noteparameter\c!continue}\v!yes
{\restorestructurecounter[#1]}%
- \ctxlua{structure.notes.restore("#1")}}
+ \ctxlua{structures.notes.restore("#1")}}
\unexpanded\def\placelocalnotes
{\dodoubleempty\doplacelocalnotes}
\def\doplacelocalnotes[#1][#2]%
- {\doif{\ctxlua{structure.notes.getstate("#1")}}{store}{\dodoplacelocalnotes{#2}{#1}}}
+ {\doif{\ctxlua{structures.notes.getstate("#1")}}{store}{\dodoplacelocalnotes{#2}{#1}}}
\def\dodoplacelocalnotes#1#2% settings note
{\begingroup
\the\everyplacelocalnotes
% beware, we cannot trust setting \currentnote here
\getparameters[\??vn#2][\c!width=\v!fit,\c!height=\v!fit,\c!strut=\v!no,\c!offset=\v!overlay,#1]% we only need a selective one
- \donotealternative{#2}%
+ \dolocalnotealternative{#2}%
\endgroup
\dochecknote} % we need to restore the old state
@@ -1042,7 +1139,7 @@
\def\dodoplacenotes#1#2% settings note
{\edef\currentnote{#2}%
- \doifelse{\ctxlua{structure.notes.getstate("#2")}}{store}
+ \doifelse{\ctxlua{structures.notes.getstate("#2")}}{store}
\dodoplacelocalnotes
\dodoplaceglobalnotes
{#1}{#2}}
@@ -1060,9 +1157,9 @@
{\setvalue{\??vn:\c!alternative:#1}{#2}}
\def\doifnotescollected#1%
- {\ctxlua{structure.notes.doifcontent("#1")}}
+ {\ctxlua{structures.notes.doifcontent("#1")}}
-\def\donotealternative#1%
+\def\dolocalnotealternative#1%
{\edef\currentnote{#1}%
\doifnotescollected\currentnote
{\endgraf
@@ -1086,7 +1183,8 @@
%D \setupfootnotes[location=text,alternative=none]
%D \stoptyping
-\def\flushlocalnotes#1{\ctxlua{structure.notes.flush("#1","store")}}
+% \def\flushlocalnotes#1{\ctxlua{structures.notes.flush("#1","store")}}
+\def\flushlocalnotes#1{\ctxlua{structures.notes.flush("#1","store","\noteparameter\c!criterium")}}
\installnotealternative \v!none
{\flushlocalnotes\currentnote}
@@ -1235,7 +1333,7 @@
\unexpanded\def\setupfootnotedefinition{\setupnotedefinition [\v!footnote]}
\unexpanded\def\setupfootnotes {\setupnote [\v!footnote]}
%unexpanded\def\footnote {\setnote [\v!footnote]}
-\def\footnotetext {\setnotetext [\v!footnote]}
+\def\footnotetext {\setnotetext [\v!footnote]}
%unexpanded\def\note {\dodoubleempty\notesymbol [\v!footnote]} % alleen footnote
\unexpanded\def\placefootnotes {\dodoubleempty\doplacefootnotes [\v!footnote]}
\unexpanded\def\placelocalfootnotes {\dodoubleempty\doplacelocalfootnotes[\v!footnote]}
@@ -1257,7 +1355,7 @@
%D }
%D \stoptyping
-\def\doifnoteonsamepageelse[#1]{\ctxlua{structure.notes.doifonsamepageasprevious("#1")}}
+\def\doifnoteonsamepageelse[#1]{\ctxlua{structures.notes.doifonsamepageasprevious("#1")}}
%D New trickery:
diff --git a/Master/texmf-dist/tex/context/base/strc-num.lua b/Master/texmf-dist/tex/context/base/strc-num.lua
index 8165d078617..95cf6d94127 100644
--- a/Master/texmf-dist/tex/context/base/strc-num.lua
+++ b/Master/texmf-dist/tex/context/base/strc-num.lua
@@ -6,46 +6,52 @@ if not modules then modules = { } end modules ['strc-num'] = {
license = "see context related readme files"
}
+-- this will be reimplemented
+
local format = string.format
local next, type = next, type
local min, max = math.min, math.max
local texsprint, texcount = tex.sprint, tex.count
-local trace_counters = false trackers.register("structure.counters", function(v) trace_counters = v end)
-
-structure = structure or { }
-structure.helpers = structure.helpers or { }
-structure.sections = structure.sections or { }
-structure.counters = structure.counters or { }
-structure.documents = structure.documents or { }
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
-structure.counters = structure.counters or { }
-structure.counters.data = structure.counters.data or { }
-structure.counters.specials = structure.counters.specials or { }
+local trace_counters = false trackers.register("structures.counters", function(v) trace_counters = v end)
+local report_counters = logs.reporter("structure","counters")
-local helpers = structure.helpers
-local sections = structure.sections
-local counters = structure.counters
-local documents = structure.documents
+local structures = structures
+local helpers = structures.helpers
+local sections = structures.sections
+local counters = structures.counters
+local documents = structures.documents
-local variables = interfaces.variables
+local variables = interfaces.variables
-- state: start stop none reset
-local counterdata = counters.data
+counters.specials = counters.specials or { }
+local counterspecials = counters.specials
+
local counterranges, tbs = { }, 0
-local counterspecials = counters.specials
-counters.collected = counters.collected or { }
+counters.collected = allocate()
counters.tobesaved = counters.tobesaved or { }
+counters.data = counters.data or { }
-storage.register("structure/counters/data", structure.counters.data, "structure.counters.data")
-storage.register("structure/counters/tobesaved", structure.counters.tobesaved, "structure.counters.tobesaved")
+storage.register("structures/counters/data", counters.data, "structures.counters.data")
+storage.register("structures/counters/tobesaved", counters.tobesaved, "structures.counters.tobesaved")
-local collected, tobesaved = counters.collected, counters.tobesaved
+local collected = counters.collected
+local tobesaved = counters.tobesaved
+local counterdata = counters.data
+
+local function initializer() -- not really needed
+ collected = counters.collected
+ tobesaved = counters.tobesaved
+ counterdata = counters.data
+end
local function finalizer()
- local ct = counters.tobesaved
for name, cd in next, counterdata do
local cs = tobesaved[name]
local data = cd.data
@@ -58,13 +64,7 @@ local function finalizer()
end
end
-local function initializer()
- collected, tobesaved = counters.collected, counters.tobesaved
-end
-
-if job then
- job.register('structure.counters.collected', structure.counters.tobesaved, initializer, finalizer)
-end
+job.register('structures.counters.collected', tobesaved, initializer, finalizer)
local function constructor(t,s,name,i)
if s == "last" then
@@ -108,28 +108,29 @@ local function constructor(t,s,name,i)
end
end
-local enhance = function()
+local function enhance()
for name, cd in next, counterdata do
local data = cd.data
for i=1,#data do
local ci = data[i]
- setmetatable(ci, { __index = function(t,s) return constructor(t,s,name,i) end })
+ setmetatableindex(ci, function(t,s) return constructor(t,s,name,i) end)
end
end
enhance = nil
end
-local function allocate(name,i)
+local function allocate(name,i) -- can be metatable
local cd = counterdata[name]
if not cd then
cd = {
- level = 1,
---~ block = "", -- todo
+ level = 1,
+ -- block = "", -- todo
numbers = nil,
- state = variables.start, -- true
- data = { }
+ state = variables.start, -- true
+ data = { },
+ saved = { },
}
- tobesaved[name] = { }
+ tobesaved[name] = { }
counterdata[name] = cd
end
cd = cd.data
@@ -137,15 +138,14 @@ local function allocate(name,i)
if not ci then
ci = {
number = 0,
- start = 0,
- saved = 0,
- step = 1,
- range = 1,
+ start = 0,
+ saved = 0,
+ step = 1,
+ range = 1,
offset = false,
- -- via metatable: last, first, and for tracing:
- stop = 0,
+ stop = 0, -- via metatable: last, first, stop only for tracing
}
- setmetatable(ci, { __index = function(t,s) return constructor(t,s,name,i) end })
+ setmetatableindex(ci, function(t,s) return constructor(t,s,name,i) end)
cd[i] = ci
tobesaved[name][i] = { }
else
@@ -163,9 +163,17 @@ local function savevalue(name,i)
local cd = counterdata[name].data[i]
local cs = tobesaved[name][i]
local cc = collected[name]
+ if trace_counters then
+ report_counters("saving value %s of counter named %s",cd.number,name)
+ end
local cr = cd.range
local old = (cc and cc[i] and cc[i][cr]) or 0
- cs[cr] = cd.number
+ local number = cd.number
+ if cd.method == variables.page then
+ -- we can be one page ahead
+ number = number - 1
+ end
+ cs[cr] = (number >= 0) and number or 0
cd.range = cr + 1
return old
else
@@ -173,11 +181,13 @@ local function savevalue(name,i)
end
end
-function counters.define(name, start, counter) -- todo: step
+function counters.define(name, start, counter, method) -- todo: step
local d = allocate(name,1)
d.start = start
+ d.state = variables.start or ""
if counter ~= "" then
d.counter = counter -- only for special purposes, cannot be false
+ d.method = method -- frozen at define time
end
end
@@ -270,19 +280,18 @@ function counters.setoffset(name,value)
counters.setvalue(name,"offset",value)
end
-
local function synchronize(name,d)
local dc = d.counter
if dc then
if trace_counters then
- logs.report("counters","setting counter %s with name %s to %s",dc,name,d.number)
+ report_counters("setting counter %s with name %s to %s",dc,name,d.number)
end
tex.setcount("global",dc,d.number)
end
local cs = counterspecials[name]
if cs then
if trace_counters then
- logs.report("counters","invoking special for name %s",name)
+ report_counters("invoking special for name %s",name)
end
cs()
end
@@ -334,7 +343,7 @@ function counters.setown(name,n,value)
elseif level > 0 then
check(name,d,n+1)
elseif level == 0 then
- -- happens elsewhere
+ -- happens elsewhere, check this for block
end
synchronize(name,d)
end
@@ -355,27 +364,31 @@ end
function counters.save(name) -- or just number
local cd = counterdata[name]
if cd then
- cd.saved = table.copy(cd.data)
+ table.insert(cd.saved,table.copy(cd.data))
end
end
function counters.restore(name)
local cd = counterdata[name]
if cd and cd.saved then
- cd.data = cd.saved
- cd.saved = nil
+ cd.data = table.remove(cd.saved)
end
end
function counters.add(name,n,delta)
local cd = counterdata[name]
- if cd and cd.state == variables.start then
+--~ table.print(cd,name)
+ if cd and (cd.state == variables.start or cd.state == "") then
local data = cd.data
local d = allocate(name,n)
d.number = (d.number or d.start or 0) + delta*(d.step or 0)
+ -- d.own = nil
local level = cd.level
if not level or level == -1 then
-- -1 is signal that we reset manually
+ elseif level == -2 then
+ -- -2 is signal that we work per text
+ check(name,data,n+1)
elseif level > 0 then
-- within countergroup
check(name,data,n+1)
@@ -390,10 +403,10 @@ end
function counters.check(level) -- not used (yet)
for name, cd in next, counterdata do
- -- logs.report("counters","%s %s %s",name,cd.level,level)
+ -- report_counters("%s %s %s",name,cd.level,level)
if cd.level == level then
if trace_counters then
- logs.report("counters","resetting %s at level %s",name,level)
+ report_counters("resetting %s at level %s",name,level)
end
counters.reset(name)
end
@@ -468,54 +481,54 @@ function counters.converted(name,spec) -- name can be number and reference to st
end
end
--- move to strc-pag.lua
-
-function counters.analyse(name,counterspecification)
- local cd = counterdata[name]
- -- safeguard
- if not cd then
- return false, false, "no counter data"
- end
- -- section data
- local sectiondata = sections.current()
- if not sectiondata then
- return cd, false, "not in section"
- end
- local references = sectiondata.references
- if not references then
- return cd, false, "no references"
- end
- local section = references.section
- if not section then
- return cd, false, "no section"
- end
- sectiondata = jobsections.collected[references.section]
- if not sectiondata then
- return cd, false, "no section data"
- end
- -- local preferences
- local no = variables.no
- if counterspecification and counterspecification.prefix == no then
- return cd, false, "current spec blocks prefix"
- end
- -- stored preferences (not used)
- if cd.prefix == no then
- return cd, false, "entry blocks prefix"
- end
- -- sectioning
- -- if sectiondata.prefix == no then
- -- return false, false, "sectiondata blocks prefix"
- -- end
- -- final verdict
- return cd, sectiondata, "okay"
-end
-
-function counters.prefixedconverted(name,prefixspec,numberspec)
- local cd, prefixdata, result = counters.analyse(name,prefixspec)
- if cd then
- if prefixdata then
- sections.typesetnumber(prefixdata,"prefix",prefixspec or false,cd or false)
- end
- counters.converted(name,numberspec)
- end
-end
+--~ -- move to strc-pag.lua
+
+--~ function counters.analyze(name,counterspecification)
+--~ local cd = counterdata[name]
+--~ -- safeguard
+--~ if not cd then
+--~ return false, false, "no counter data"
+--~ end
+--~ -- section data
+--~ local sectiondata = sections.current()
+--~ if not sectiondata then
+--~ return cd, false, "not in section"
+--~ end
+--~ local references = sectiondata.references
+--~ if not references then
+--~ return cd, false, "no references"
+--~ end
+--~ local section = references.section
+--~ if not section then
+--~ return cd, false, "no section"
+--~ end
+--~ sectiondata = sections.collected[references.section]
+--~ if not sectiondata then
+--~ return cd, false, "no section data"
+--~ end
+--~ -- local preferences
+--~ local no = variables.no
+--~ if counterspecification and counterspecification.prefix == no then
+--~ return cd, false, "current spec blocks prefix"
+--~ end
+--~ -- stored preferences (not used)
+--~ if cd.prefix == no then
+--~ return cd, false, "entry blocks prefix"
+--~ end
+--~ -- sectioning
+--~ -- if sectiondata.prefix == no then
+--~ -- return false, false, "sectiondata blocks prefix"
+--~ -- end
+--~ -- final verdict
+--~ return cd, sectiondata, "okay"
+--~ end
+
+--~ function counters.prefixedconverted(name,prefixspec,numberspec)
+--~ local cd, prefixdata, result = counters.analyze(name,prefixspec)
+--~ if cd then
+--~ if prefixdata then
+--~ sections.typesetnumber(prefixdata,"prefix",prefixspec or false,cd or false)
+--~ end
+--~ counters.converted(name,numberspec)
+--~ end
+--~ end
diff --git a/Master/texmf-dist/tex/context/base/strc-num.mkiv b/Master/texmf-dist/tex/context/base/strc-num.mkiv
index 5b5aebe7dc8..b386b5d9518 100644
--- a/Master/texmf-dist/tex/context/base/strc-num.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-num.mkiv
@@ -49,7 +49,6 @@
\c!prefixconnector=.,
\c!prefixsegments=\thenamedstructurecounterlevel\currentstructurecounter,
\c!start=0,
- \c!state=\v!start,
\c!prefix=\v!yes,
\c!state=\v!start]
@@ -57,9 +56,7 @@
[\c!prefixsegments=\autostructureprefixsegments\sharedstructurecounterparameter]
\def\autostructureprefixsegments#1% todo: \c!prefixsegments=\v!auto
- {2:\thenamedstructureheadlevel{\ctxlua{structure.sections.way("#1\c!way","\v!by")}}}
-
-% \letvalue{\??nn\s!empty}\empty
+ {2:\thenamedstructureheadlevel{\ctxlua{structures.sections.way("#1\c!way","\v!by")}}}
\def\structurecounterparameter#1#2%
{\csname
@@ -108,7 +105,10 @@
\def\dododefinestructurecounter[#1][#2]%
{\getparameters[\??nn#1][\s!counter=,#2]% counter is for internal purposes
- \ctxlua{structure.counters.define("#1",tonumber("\structurecounterparameter{#1}\c!start") or 0,"\structurecounterparameter{#1}\s!counter")}%
+ \ctxlua{structures.counters.define("#1", % this will be a table
+ tonumber("\structurecounterparameter{#1}\c!start") or 0,
+ "\structurecounterparameter{#1}\s!counter",
+ "\structurecounterparameter{#1}\c!method")}%
\docheckstructurecountersetup{#1}}
\def\donodefinestructurecounter[#1][#2]% inherit
@@ -123,7 +123,7 @@
\docheckstructurecountersetup{#1}}
\def\structurecounterway#1% slow, we need to store it at the tex end
- {\ctxlua{structure.sections.way("\structurecounterparameter{#1}\c!way","\v!by")}}
+ {\ctxlua{structures.sections.way("\structurecounterparameter{#1}\c!way","\v!by")}}
\def\thenamedstructurecounterlevel#1%
{\thenamedstructureheadlevel{\structurecounterway{#1}}}
@@ -139,36 +139,36 @@
\else
\edef\currentstructurecounterlevel{\thenamedstructurecounterlevel{#1}}%
\ctxlua{
- structure.counters.restart("#1",1,"\structurecounterparameter{#1}\c!start")
- structure.counters.setstate("#1","\structurecounterparameter{#1}\c!state")
- structure.counters.setlevel("#1",\currentstructurecounterlevel)
- structure.sections.setchecker("#1",\currentstructurecounterlevel,structure.counters.reset)
+ structures.counters.restart("#1",1,"\structurecounterparameter{#1}\c!start")
+ structures.counters.setstate("#1","\structurecounterparameter{#1}\c!state")
+ structures.counters.setlevel("#1",\currentstructurecounterlevel)
+ structures.sections.setchecker("#1",\currentstructurecounterlevel,structures.counters.reset)
}%
\fi}
-\def\doifstructurecounterelse#1{\ctxlua{structure.counters.doifelse("\@@thestructurecounter{#1}")}}
-\def\doifstructurecounter #1{\ctxlua{structure.counters.doif ("\@@thestructurecounter{#1}")}}
-\def\doifnotstructurecounter #1{\ctxlua{structure.counters.doifnot ("\@@thestructurecounter{#1}")}}
-
-\def\setstructurecounter [#1]#2{\ctxlua{structure.counters.set ("\@@thestructurecounter{#1}",1,\number#2)}}
-\def\setstructurecounterown [#1]#2{\ctxlua{structure.counters.setown ("\@@thestructurecounter{#1}",1,"#2")}}
-\def\resetstructurecounter [#1]{\ctxlua{structure.counters.reset ("\@@thestructurecounter{#1}",1)}}
-\def\restartstructurecounter [#1]#2{\ctxlua{structure.counters.restart("\@@thestructurecounter{#1}",1,#2)}}
-\def\savestructurecounter [#1]{\ctxlua{structure.counters.save ("\@@thestructurecounter{#1}")}}
-\def\restorestructurecounter [#1]{\ctxlua{structure.counters.restore("\@@thestructurecounter{#1}")}}
-\def\incrementstructurecounter [#1]{\ctxlua{structure.counters.add ("\@@thestructurecounter{#1}",1,1)}}
-\def\decrementstructurecounter [#1]{\ctxlua{structure.counters.add ("\@@thestructurecounter{#1}",1,-1)}}
-\def\rawstructurecounter [#1]{\ctxlua{structure.counters.value ("\@@thestructurecounter{#1}",1)}}
-\def\laststructurecounter [#1]{\ctxlua{structure.counters.last ("\@@thestructurecounter{#1}",1)}}
-\def\firststructurecounter [#1]{\ctxlua{structure.counters.first ("\@@thestructurecounter{#1}",1)}}
-\def\nextstructurecounter [#1]{\ctxlua{structure.counters.next ("\@@thestructurecounter{#1}",1)}}
-\def\prevstructurecounter [#1]{\ctxlua{structure.counters.prev ("\@@thestructurecounter{#1}",1)}}
-\def\structurecountersubs [#1]{\ctxlua{structure.counters.subs ("\@@thestructurecounter{#1}",1)}}
-
-\def\tracestructurecounter [#1]{\ctxlua{structure.counters.trace ("\@@thestructurecounter{#1}")}}
-
-\def\incrementedstructurecounter[#1]{\ctxlua{tex.write(structure.counters.add("\@@thestructurecounter{#1}",1,1))}}
-\def\decrementedstructurecounter[#1]{\ctxlua{tex.write(structure.counters.add("\@@thestructurecounter{#1}",1,-1))}}
+\def\doifstructurecounterelse#1{\ctxlua{structures.counters.doifelse("\@@thestructurecounter{#1}")}}
+\def\doifstructurecounter #1{\ctxlua{structures.counters.doif ("\@@thestructurecounter{#1}")}}
+\def\doifnotstructurecounter #1{\ctxlua{structures.counters.doifnot ("\@@thestructurecounter{#1}")}}
+
+\def\setstructurecounter [#1]#2{\ctxlua{structures.counters.set ("\@@thestructurecounter{#1}",1,\number#2)}}
+\def\setstructurecounterown [#1]#2{\ctxlua{structures.counters.setown ("\@@thestructurecounter{#1}",1,"#2")}}
+\def\resetstructurecounter [#1]{\ctxlua{structures.counters.reset ("\@@thestructurecounter{#1}",1)}}
+\def\restartstructurecounter [#1]#2{\ctxlua{structures.counters.restart("\@@thestructurecounter{#1}",1,#2)}}
+\def\savestructurecounter [#1]{\ctxlua{structures.counters.save ("\@@thestructurecounter{#1}")}}
+\def\restorestructurecounter [#1]{\ctxlua{structures.counters.restore("\@@thestructurecounter{#1}")}}
+\def\incrementstructurecounter [#1]{\ctxlua{structures.counters.add ("\@@thestructurecounter{#1}",1,1)}}
+\def\decrementstructurecounter [#1]{\ctxlua{structures.counters.add ("\@@thestructurecounter{#1}",1,-1)}}
+\def\rawstructurecounter [#1]{\ctxlua{structures.counters.value ("\@@thestructurecounter{#1}",1)}}
+\def\laststructurecounter [#1]{\ctxlua{structures.counters.last ("\@@thestructurecounter{#1}",1)}}
+\def\firststructurecounter [#1]{\ctxlua{structures.counters.first ("\@@thestructurecounter{#1}",1)}}
+\def\nextstructurecounter [#1]{\ctxlua{structures.counters.next ("\@@thestructurecounter{#1}",1)}}
+\def\prevstructurecounter [#1]{\ctxlua{structures.counters.prev ("\@@thestructurecounter{#1}",1)}}
+\def\structurecountersubs [#1]{\ctxlua{structures.counters.subs ("\@@thestructurecounter{#1}",1)}}
+
+\def\tracestructurecounter [#1]{\ctxlua{structures.counters.trace ("\@@thestructurecounter{#1}")}}
+
+\def\incrementedstructurecounter[#1]{\ctxlua{tex.write(structures.counters.add("\@@thestructurecounter{#1}",1,1))}}
+\def\decrementedstructurecounter[#1]{\ctxlua{tex.write(structures.counters.add("\@@thestructurecounter{#1}",1,-1))}}
\def\setsubstructurecounter {\dodoubleargument\dosetsubstructurecounter}
\def\setsubstructurecounterown {\dodoubleargument\dosetsubstructurecounterown}
@@ -178,16 +178,16 @@
\def\decrementsubstructurecounter {\dodoubleargument\dodecrementsubstructurecounter}
\def\rawsubstructurecounter {\dodoubleargument\dorawsubstructurecounter}
-\def\dosetsubstructurecounter [#1][#2]#3{\ctxlua{structure.counters.set ("\@@thestructurecounter{#1}",#2,\number#3)}}
-\def\dosetsubstructurecounterown [#1][#2]#3{\ctxlua{structure.counters.setown ("\@@thestructurecounter{#1}",#2,"#3")}}
-\def\doresetsubstructurecounter [#1][#2]{\ctxlua{structure.counters.reset ("\@@thestructurecounter{#1}",#2)}}
-\def\dorestartsubstructurecounter [#1][#2]#3{\ctxlua{structure.counters.restart("\@@thestructurecounter{#1}",#2,#3)}}
-\def\doincrementsubstructurecounter [#1][#2]{\ctxlua{structure.counters.add ("\@@thestructurecounter{#1}",#2,1)}}
-\def\dodecrementsubstructurecounter [#1][#2]{\ctxlua{structure.counters.add ("\@@thestructurecounter{#1}",#2,-1)}}
-\def\dorawsubstructurecounter [#1][#2]{\ctxlua{structure.counters.value ("\@@thestructurecounter{#1}",#2)}}
-\def\dolastsubstructurecounter [#1][#2]{\ctxlua{structure.counters.last ("\@@thestructurecounter{#1}",#2)}}
-\def\dofirstsubstructurecounter [#1][#2]{\ctxlua{structure.counters.first ("\@@thestructurecounter{#1}",#2)}}
-\def\dosubstructurecountersubs [#1][#2]{\ctxlua{structure.counters.subs ("\@@thestructurecounter{#1}",#2)}}
+\def\dosetsubstructurecounter [#1][#2]#3{\ctxlua{structures.counters.set ("\@@thestructurecounter{#1}",#2,\number#3)}}
+\def\dosetsubstructurecounterown [#1][#2]#3{\ctxlua{structures.counters.setown ("\@@thestructurecounter{#1}",#2,"#3")}}
+\def\doresetsubstructurecounter [#1][#2]{\ctxlua{structures.counters.reset ("\@@thestructurecounter{#1}",#2)}}
+\def\dorestartsubstructurecounter [#1][#2]#3{\ctxlua{structures.counters.restart("\@@thestructurecounter{#1}",#2,#3)}}
+\def\doincrementsubstructurecounter [#1][#2]{\ctxlua{structures.counters.add ("\@@thestructurecounter{#1}",#2,1)}}
+\def\dodecrementsubstructurecounter [#1][#2]{\ctxlua{structures.counters.add ("\@@thestructurecounter{#1}",#2,-1)}}
+\def\dorawsubstructurecounter [#1][#2]{\ctxlua{structures.counters.value ("\@@thestructurecounter{#1}",#2)}}
+\def\dolastsubstructurecounter [#1][#2]{\ctxlua{structures.counters.last ("\@@thestructurecounter{#1}",#2)}}
+\def\dofirstsubstructurecounter [#1][#2]{\ctxlua{structures.counters.first ("\@@thestructurecounter{#1}",#2)}}
+\def\dosubstructurecountersubs [#1][#2]{\ctxlua{structures.counters.subs ("\@@thestructurecounter{#1}",#2)}}
% The bypage check needs a multipass reference and therefore
% we only check for it when we increment and know that some
@@ -200,11 +200,11 @@
\def\incrementstructurecounter[#1]%
{\docheckstructurecounterbypage{#1}%
- \ctxlua{structure.counters.add("\@@thestructurecounter{#1}",1,1)}}
+ \ctxlua{structures.counters.add("\@@thestructurecounter{#1}",1,1)}}
\def\doincrementsubstructurecounter[#1][#2]%
{\docheckstructurecounterbypage{#1}%
- \ctxlua{structure.counters.add("\@@thestructurecounter{#1}",#2,1)}}
+ \ctxlua{structures.counters.add("\@@thestructurecounter{#1}",#2,1)}}
\def\convertedstructurecounter
{\dodoubleempty\doconvertedstructurecounter}
@@ -212,7 +212,7 @@
\def\doconvertedstructurecounter[#1][#2]%
{\begingroup
\ifsecondargument\getparameters[\??nn#1][#2]\fi
- \ctxlua{structure.counters.prefixedconverted(
+ \ctxlua{structures.counters.prefixedconverted(
"\@@thestructurecounter{#1}",
{
prefix = "\structurecounterparameter{#1}\c!prefix",
@@ -241,7 +241,7 @@
\def\directconvertedstructurecounter#1#2% name, type
{\begingroup
- \ctxlua{structure.counters.prefixedconverted(
+ \ctxlua{structures.counters.prefixedconverted(
"\@@thestructurecounter{#1}",
{
prefix = "\structurecounterparameter{#1}\c!prefix",
@@ -403,11 +403,11 @@
\edef\currentlabel{#3\c!label}%
\edef\currentreference{#3\c!reference}%
\setnextinternalreference
- \xdef\laststructurecounternumber{\ctxlua{structure.lists.push{
+ \xdef\laststructurecounternumber{\ctxlua{structures.lists.push{
metadata = {
kind = "#1",
name = "\currentname",
- level = structure.sections.currentlevel(),
+ level = structures.sections.currentlevel(),
catcodes = \the\catcodetable,
},
references = {
@@ -415,7 +415,7 @@
reference = "\currentreference",
referenceprefix = "\referenceprefix",
block = "\currentstructureblock",
- section = structure.sections.currentid(),
+ section = structures.sections.currentid(),
},
titledata = {
label = \!!bs\detokenize\expandafter{\currentlabel }\!!es,
@@ -439,7 +439,7 @@
connector = \!!bs#3\c!prefixconnector\!!es,
},
numberdata = {
- numbers = structure.counters.compact("\currentcounter",nil,true),
+ numbers = structures.counters.compact("\currentcounter",nil,true),
separatorset = "#3\c!numberseparatorset",
conversion = \!!bs#3\c!numberconversion\!!es,
conversionset = "#3\c!numberconversionset",
@@ -448,11 +448,11 @@
segments = "#3\c!numbersegments",
},
\fi
- userdata = structure.helpers.touserdata(\!!bs\detokenize{#9}\!!es)
+ userdata = structures.helpers.touserdata(\!!bs\detokenize{#9}\!!es)
}
}}%
- \xdef\laststructurecounterattribute {\ctxlua {tex.write(jobreferences.setinternalreference(nil,nil,\nextinternalreference))}}%
- \xdef\laststructurecountersynchronize{\ctxlatelua{structure.lists.enhance(\laststructurecounternumber)}}%
+ \xdef\laststructurecounterattribute {\ctxlua {tex.write(structures.references.setinternalreference(nil,nil,\nextinternalreference))}}%
+ \xdef\laststructurecountersynchronize{\ctxlatelua{structures.lists.enhance(\laststructurecounternumber)}}%
\else
\glet\laststructurecounternumber \relax
\glet\laststructurecounterattribute \attributeunsetvalue
@@ -468,7 +468,7 @@
{\setupstructurecounter
[#1]
[ \c!start=#2\c!start,
- \c!state=#2\c!state,
+ \c!state=#2\c!state, % beware, "" == start
\c!way=#2\c!way,
%
\c!prefix=#2\c!prefix,
diff --git a/Master/texmf-dist/tex/context/base/strc-pag.lua b/Master/texmf-dist/tex/context/base/strc-pag.lua
index 2610595872a..bce8a2c3a4e 100644
--- a/Master/texmf-dist/tex/context/base/strc-pag.lua
+++ b/Master/texmf-dist/tex/context/base/strc-pag.lua
@@ -9,33 +9,39 @@ if not modules then modules = { } end modules ['strc-pag'] = {
local texcount, format = tex.count, string.format
local ctxcatcodes = tex.ctxcatcodes
-local texsprint, texwrite = tex.sprint, tex.write
+local allocate, mark = utilities.storage.allocate, utilities.storage.mark
-local trace_pages = false trackers.register("structure.pages", function(v) trace_pages = v end)
+local trace_pages = false trackers.register("structures.pages", function(v) trace_pages = v end)
-structure.pages = structure.pages or { }
+local report_pages = logs.reporter("structure","pages")
-local helpers = structure.helpers or { }
-local sections = structure.sections or { }
-local pages = structure.pages or { }
-local processors = structure.processors or { }
-local sets = structure.sets or { }
+local structures = structures
-local variables = interfaces.variables
+local helpers = structures.helpers
+local sections = structures.sections
+local pages = structures.pages
+local processors = structures.processors
+local sets = structures.sets
+local counters = structures.counters
+
+local counterdata = counters.data
+
+local variables = interfaces.variables
+local context = context
-- storage
-jobpages = jobpages or { }
-jobpages.collected = jobpages.collected or { }
-jobpages.tobesaved = jobpages.tobesaved or { }
+local collected, tobesaved = allocate(), allocate()
-local collected, tobesaved = jobpages.collected, jobpages.tobesaved
+pages.collected = collected
+pages.tobesaved = tobesaved
local function initializer()
- collected, tobesaved = jobpages.collected, jobpages.tobesaved
+ collected = pages.collected
+ tobesaved = pages.tobesaved
end
-job.register('jobpages.collected', jobpages.tobesaved, initializer)
+job.register('structures.pages.collected', tobesaved, initializer)
local specification = { } -- to be checked
@@ -43,7 +49,7 @@ function pages.save(prefixdata,numberdata)
local realpage, userpage = texcount.realpageno, texcount.userpageno
if realpage > 0 then
if trace_pages then
- logs.report("pages","saving page %s.%s",realpage,userpage)
+ report_pages("saving page %s.%s",realpage,userpage)
end
local data = {
number = userpage,
@@ -56,40 +62,23 @@ function pages.save(prefixdata,numberdata)
collected[realpage] = data
end
elseif trace_pages then
- logs.report("pages","not saving page %s.%s",realpage,userpage)
+ report_pages("not saving page %s.%s",realpage,userpage)
end
end
-function structure.counters.specials.userpage()
+function counters.specials.userpage()
local r = texcount.realpageno
if r > 0 then
local t = tobesaved[r]
if t then
t.number = texcount.userpageno
if trace_pages then
- logs.report("pages","forcing pagenumber of realpage %s to %s",r,t.number)
+ report_pages("forcing pagenumber of realpage %s to %s",r,t.number)
end
end
end
end
---~ function pages.pagenumber(localspec)
---~ local deltaspec
---~ if localspec then
---~ for k,v in next, localspec do
---~ if v ~= "" and v ~= specification[k] then
---~ if not deltaspec then deltaspec = { } end
---~ deltaspec[k] = v
---~ end
---~ end
---~ end
---~ if deltaspec then
---~ return { realpage = texcount.realpageno, specification = deltaspec }
---~ else
---~ return { realpage = texcount.realpageno }
---~ end
---~ end
-
local function convertnumber(str,n)
return format("\\convertnumber{%s}{%s}",str or "numbers",n)
end
@@ -105,10 +94,10 @@ function pages.number(realdata,pagespec)
processors.sprint(ctxcatcodes,starter)
end
if conversion ~= "" then
- texsprint(ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,userpage))
+ context.convertnumber(conversion,userpage)
else
if conversionset == "" then conversionset = "default" end
- local theconversion = sets.get("structure:conversions",block,conversionset,index,"numbers")
+ local theconversion = sets.get("structure:conversions",block,conversionset,1,"numbers") -- to be checked: 1
processors.sprint(ctxcatcodes,theconversion,convertnumber,userpage)
end
if stopper ~= "" then
@@ -118,7 +107,7 @@ end
-- (pagespec.prefix == yes|unset) and (pages.prefix == yes) => prefix
-function pages.analyse(entry,pagespecification)
+function pages.analyze(entry,pagespecification)
-- safeguard
if not entry then
return false, false, "no entry"
@@ -154,12 +143,12 @@ function pages.analyse(entry,pagespecification)
return pagedata, false, "pagedata blocks prefix"
end
-- final verdict
- return pagedata, jobsections.collected[references.section], "okay"
+ return pagedata, sections.collected[references.section], "okay"
end
function helpers.page(data,pagespec)
if data then
- local pagedata = pages.analyse(data,pagespec)
+ local pagedata = pages.analyze(data,pagespec)
if pagedata then
pages.number(pagedata,pagespec)
end
@@ -168,7 +157,7 @@ end
function helpers.prefixpage(data,prefixspec,pagespec)
if data then
- local pagedata, prefixdata, e = pages.analyse(data,pagespec)
+ local pagedata, prefixdata, e = pages.analyze(data,pagespec)
if pagedata then
if prefixdata then
sections.typesetnumber(prefixdata,"prefix",prefixspec or false,prefixdata or false,pagedata.prefixdata or false)
@@ -190,7 +179,7 @@ end
--
-function helpers.analyse(entry,specification)
+function helpers.analyze(entry,specification)
-- safeguard
if not entry then
return false, false, "no entry"
@@ -205,7 +194,7 @@ function helpers.analyse(entry,specification)
if not section then
return entry, false, "no section"
end
- sectiondata = jobsections.collected[references.section]
+ local sectiondata = sections.collected[references.section]
if not sectiondata then
return entry, false, "no section data"
end
@@ -224,7 +213,7 @@ end
function helpers.prefix(data,prefixspec)
if data then
- local _, prefixdata, status = helpers.analyse(data,prefixspec)
+ local _, prefixdata, status = helpers.analyze(data,prefixspec)
if prefixdata then
sections.typesetnumber(prefixdata,"prefix",prefixspec or false,data.prefixdata or false,prefixdata or false)
end
@@ -239,3 +228,55 @@ function pages.is_odd(n)
return n % 2 ~= 0
end
end
+
+-- move to strc-pag.lua
+
+function counters.analyze(name,counterspecification)
+ local cd = counterdata[name]
+ -- safeguard
+ if not cd then
+ return false, false, "no counter data"
+ end
+ -- section data
+ local sectiondata = sections.current()
+ if not sectiondata then
+ return cd, false, "not in section"
+ end
+ local references = sectiondata.references
+ if not references then
+ return cd, false, "no references"
+ end
+ local section = references.section
+ if not section then
+ return cd, false, "no section"
+ end
+ sectiondata = sections.collected[references.section]
+ if not sectiondata then
+ return cd, false, "no section data"
+ end
+ -- local preferences
+ local no = variables.no
+ if counterspecification and counterspecification.prefix == no then
+ return cd, false, "current spec blocks prefix"
+ end
+ -- stored preferences (not used)
+ if cd.prefix == no then
+ return cd, false, "entry blocks prefix"
+ end
+ -- sectioning
+ -- if sectiondata.prefix == no then
+ -- return false, false, "sectiondata blocks prefix"
+ -- end
+ -- final verdict
+ return cd, sectiondata, "okay"
+end
+
+function counters.prefixedconverted(name,prefixspec,numberspec)
+ local cd, prefixdata, result = counters.analyze(name,prefixspec)
+ if cd then
+ if prefixdata then
+ sections.typesetnumber(prefixdata,"prefix",prefixspec or false,cd or false)
+ end
+ counters.converted(name,numberspec)
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/strc-pag.mkiv b/Master/texmf-dist/tex/context/base/strc-pag.mkiv
index 0f3d7ba3b07..f4b658365f9 100644
--- a/Master/texmf-dist/tex/context/base/strc-pag.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-pag.mkiv
@@ -17,10 +17,6 @@
\unprotect
-% Hacks:
-
-\let\preparepageprefix\gobbleoneargument
-
% Allocation:
\countdef\realpageno = 0 \realpageno = 1
@@ -40,7 +36,7 @@
\def\initializepagecounters{\the\everyinitializepagecounters}
\appendtoks
- \initializepagecounters
+ \initializepagecounters
\to \everyjob
% Page numbers are kind of independent of each other and therefore they
@@ -75,10 +71,9 @@
% \stopbodymatter
% \stoptext
-
-\definestructurecounter[\s!realpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=realpageno]
-\definestructurecounter[\s!userpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=userpageno]
-\definestructurecounter[\s!subpage] [\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=subpageno]
+\definestructurecounter[\s!realpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=realpageno,\c!method=\v!page]
+\definestructurecounter[\s!userpage][\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=userpageno,\c!method=\v!page]
+\definestructurecounter[\s!subpage] [\c!prefix=\v!no,\c!start=1,\c!prefixsegments=,\s!counter=subpageno, \c!method=\v!page]
\newtoks\everysetuprealpagenumber % todo: set state: none, start, stop, reset
\newtoks\everysetupuserpagenumber % todo: set state: none, start, stop, reset
@@ -108,7 +103,7 @@
\let\resetpagenumber\resetuserpagenumber
\def\savecurrentpagestate % \normalexpanded?
- {\ctxlua{structure.pages.save({
+ {\ctxlua{structures.pages.save({
prefix = "\structurecounterparameter\s!userpage\c!prefix",
separatorset = "\structurecounterparameter\s!userpage\c!prefixseparatorset",
conversion = "\structurecounterparameter\s!userpage\c!prefixconversion",
@@ -226,11 +221,18 @@
\def\nextuserpagenumber {\directconvertedstructurecounter\s!userpage\v!next}
\def\nextsubpagenumber {\directconvertedstructurecounter\s!subpage \v!next}
-\appendtoks
- \decrementstructurecounter[\s!realpage]%
+\def\dodeincrementpageboundcounters % only at the end
+ {\decrementstructurecounter[\s!realpage]%
\decrementstructurecounter[\s!userpage]%
- \decrementstructurecounter[\s!subpage]%
-\to\everygoodbye
+ \decrementstructurecounter[\s!subpage ]}
+
+\def\doincrementpageboundcounters
+ {\incrementpagenumber
+ \incrementsubpagenumber}
+
+\appendtoks
+ \dodeincrementpageboundcounters
+\to \everygoodbye
% Equivalents (compatibility):
%
@@ -251,8 +253,8 @@
% States:
\newif\ifrightpage \rightpagetrue
-\newif\ifdoublesided
-\newif\ifsinglesided
+\newif\ifdoublesided \newconditional\layoutisdoublesided
+\newif\ifsinglesided \newconditional\layoutissinglesided
% Realpage and subpage numbers:
@@ -302,12 +304,12 @@
{\getparameters[\??nm][#1]\the\everysetuppagenumbering}
\appendtoks
- \singlesidedfalse
- \doublesidedfalse
+ \singlesidedfalse \setfalse\layoutisdoublesided
+ \doublesidedfalse \setfalse\layoutissinglesided
\normalexpanded{\noexpand\processallactionsinset[\@@nmalternative]}
- [ \v!singlesided=>\singlesidedtrue,
- \v!doublesided=>\doublesidedtrue]%
- \ifx\trackingmarginnotestrue\undefined\else
+ [ \v!singlesided=>\singlesidedtrue\settrue\layoutissinglesided,
+ \v!doublesided=>\doublesidedtrue\settrue\layoutisdoublesided]%
+ \ifdefined\trackingmarginnotestrue
\ifdoublesided
\trackingmarginnotestrue
\else
@@ -395,17 +397,17 @@
% compatible. So, in fact there can be multiple handlers active at the
% same time, but only the current one does something.
-\chardef\realpagenumberstate =2 % counter state : 0=stop, 1=start, 2=start and visible
-\chardef\userpagenumberstate =2 % counter state : 0=stop, 1=start, 2=start and visible
-\chardef\subpagenumberstate =2 % counter state : 0=stop, 1=start, 2=start and visible
-\chardef\overallpagenumberstate=1 % general number: 0=invisible, 1=visible
+\setnewconstant\realpagenumberstate \plustwo % counter state : 0=stop, 1=start, 2=start and visible
+\setnewconstant\userpagenumberstate \plustwo % counter state : 0=stop, 1=start, 2=start and visible
+\setnewconstant\subpagenumberstate \plustwo % counter state : 0=stop, 1=start, 2=start and visible
+\setnewconstant\overallpagenumberstate\plusone % general number: 0=invisible, 1=visible
\def\checkpagenumberstatechange#1#2%
{\edef\newpagenumberstate{\structurecounterparameter#1\c!state}%
\ifx\newpagenumberstate\oldpagenumberstate \else
\doifelse\newpagenumberstate\v!start
- {\chardef#2\plustwo}%
- {\chardef#2\zerocount}%
+ {#2\plustwo}%
+ {#2\zerocount}%
\fi}
\appendtoks % todo: set state: none, start, stop, reset
@@ -422,8 +424,8 @@
\appendtoks % todo: set state: none, start, stop, reset
\doifelse\@@nmstate\v!start
- {\chardef\overallpagenumberstate\plusone}%
- {\chardef\overallpagenumberstate\zerocount}%
+ {\overallpagenumberstate\plusone }%
+ {\overallpagenumberstate\zerocount}%
\to \everysetuppagenumbering
% Done
diff --git a/Master/texmf-dist/tex/context/base/strc-prc.mkiv b/Master/texmf-dist/tex/context/base/strc-prc.mkiv
index 2955a396b5a..68339ed9274 100644
--- a/Master/texmf-dist/tex/context/base/strc-prc.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-prc.mkiv
@@ -50,11 +50,11 @@
\def\dodefineprocessor[#1][#2]%
{\ifsecondargument
\letbeundefined{\??po#1\c!command}%
- \ctxlua{structure.processors.register("#1")}%
+ \ctxlua{structures.processors.register("#1")}%
\getparameters[\??po#1][\c!style=,\c!color=,\c!left=,\c!right=,#2]%
\else
\letbeundefined{\??po#1\c!style}%
- \ctxlua{structure.processors.reset("#1")}%
+ \ctxlua{structures.processors.reset("#1")}%
\fi}
%D The following command can be used by users but normally it will be
diff --git a/Master/texmf-dist/tex/context/base/strc-ref.lua b/Master/texmf-dist/tex/context/base/strc-ref.lua
index 475ab318a8a..ee32353f0c4 100644
--- a/Master/texmf-dist/tex/context/base/strc-ref.lua
+++ b/Master/texmf-dist/tex/context/base/strc-ref.lua
@@ -7,14 +7,24 @@ if not modules then modules = { } end modules ['strc-ref'] = {
}
local format, find, gmatch, match, concat = string.format, string.find, string.gmatch, string.match, table.concat
-local lpegmatch = lpeg.match
-local texsprint, texwrite, texcount, texsetcount = tex.sprint, tex.write, tex.count, tex.setcount
+local lpegmatch, lpegP, lpegCs = lpeg.match, lpeg.P, lpeg.Cs
+local texcount, texsetcount = tex.count, tex.setcount
+local rawget = rawget
-local trace_referencing = false trackers.register("structure.referencing", function(v) trace_referencing = v end)
+local allocate = utilities.storage.allocate
+local mark = utilities.storage.mark
+local setmetatableindex = table.setmetatableindex
+
+local trace_referencing = false trackers.register("structures.referencing", function(v) trace_referencing = v end)
+
+local report_references = logs.reporter("structure","references")
-local ctxcatcodes = tex.ctxcatcodes
local variables = interfaces.variables
local constants = interfaces.constants
+local context = context
+
+local settings_to_array = utilities.parsers.settings_to_array
+local unsetvalue = attributes.unsetvalue
-- beware, this is a first step in the rewrite (just getting rid of
-- the tuo file); later all access and parsing will also move to lua
@@ -22,50 +32,119 @@ local constants = interfaces.constants
-- the useddata and pagedata names might change
-- todo: pack exported data
-jobreferences = jobreferences or { }
-jobreferences.tobesaved = jobreferences.tobesaved or { }
-jobreferences.collected = jobreferences.collected or { }
-jobreferences.defined = jobreferences.defined or { } -- indirect ones
-jobreferences.derived = jobreferences.derived or { } -- taken from lists
-jobreferences.specials = jobreferences.specials or { } -- system references
-jobreferences.runners = jobreferences.runners or { }
-jobreferences.internals = jobreferences.internals or { }
-jobreferences.exporters = jobreferences.exporters or { }
-jobreferences.imported = jobreferences.imported or { }
-
-storage.register("jobreferences/defined", jobreferences.defined, "jobreferences.defined")
-
-local tobesaved, collected = jobreferences.tobesaved, jobreferences.collected
-local defined, derived, specials = jobreferences.defined, jobreferences.derived, jobreferences.specials
-local exporters, runners = jobreferences.exporters, jobreferences.runners
+local structures = structures
+local helpers = structures.helpers
+local sections = structures.sections
+local references = structures.references
+local lists = structures.lists
+local counters = structures.counters
+
+-- some might become local
+
+references.defined = references.defined or allocate()
+
+local defined = references.defined
+local derived = allocate()
+local specials = allocate()
+local runners = allocate()
+local internals = allocate()
+local exporters = allocate()
+local imported = allocate()
+local filters = allocate()
+local executers = allocate()
+local handlers = allocate()
+local tobesaved = allocate()
+local collected = allocate()
+local tobereferred = allocate()
+local referred = allocate()
+
+references.derived = derived
+references.specials = specials
+references.runners = runners
+references.internals = internals
+references.exporters = exporters
+references.imported = imported
+references.filters = filters
+references.executers = executers
+references.handlers = handlers
+references.tobesaved = tobesaved
+references.collected = collected
+references.tobereferred = tobereferred
+references.referred = referred
+
+storage.register("structures/references/defined", references.defined, "structures.references.defined")
local currentreference = nil
local initializers = { }
local finalizers = { }
-function jobreferences.registerinitializer(func) -- we could use a token register instead
+function references.registerinitializer(func) -- we could use a token register instead
initializers[#initializers+1] = func
end
-function jobreferences.registerfinalizer(func) -- we could use a token register instead
+function references.registerfinalizer(func) -- we could use a token register instead
finalizers[#finalizers+1] = func
end
-local function initializer()
- tobesaved, collected = jobreferences.tobesaved, jobreferences.collected
+local function initializer() -- can we use a tobesaved as metatable for collected?
+ tobesaved = references.tobesaved
+ collected = references.collected
for i=1,#initializers do
initializers[i](tobesaved,collected)
end
end
+
local function finalizer()
- tobesaved = jobreferences.tobesaved
for i=1,#finalizers do
finalizers[i](tobesaved)
end
end
-if job then
- job.register('jobreferences.collected', jobreferences.tobesaved, initializer, finalizer)
+job.register('structures.references.collected', tobesaved, initializer, finalizer)
+
+local maxreferred = 1
+
+local function initializer() -- can we use a tobesaved as metatable for collected?
+ tobereferred = references.tobereferred
+ referred = references.referred
+ local function get(t,n) -- catch sparse, a bit slow but who cares
+ for i=n,1,-1 do -- we could make a tree ... too much work
+ local p = rawget(t,i)
+ if p then
+ return p
+ end
+ end
+ end
+ setmetatableindex(referred, get)
+end
+
+local function finalizer() -- make sparse
+ local last
+ for i=1,maxreferred do
+ local r = tobereferred[i]
+ if not last then
+ last = r
+ elseif r == last then
+ tobereferred[i] = nil
+ else
+ last = r
+ end
+ end
+end
+
+job.register('structures.references.referred', tobereferred, initializer, finalizer)
+
+function references.referredpage(n)
+ return referred[n] or referred[n] or texcount.realpageno
+end
+
+function references.registerpage(n)
+ if not tobereferred[n] then
+ if n > maxreferred then
+ maxreferred = n
+ end
+ tobereferred[n] = texcount.realpageno
+ end
end
-- todo: delay split till later as in destinations we split anyway
@@ -86,18 +165,18 @@ local function setnextorder(kind,name)
texsetcount("global","locationorder",lastorder)
end
-jobreferences.setnextorder = setnextorder
+references.setnextorder = setnextorder
-function jobreferences.setnextinternal(kind,name)
+function references.setnextinternal(kind,name)
setnextorder(kind,name) -- always incremented with internal
texsetcount("global","locationcount",texcount.locationcount + 1)
end
-function jobreferences.currentorder(kind,name)
- texwrite((orders[kind] and orders[kind][name]) or lastorder)
+function references.currentorder(kind,name)
+ context(orders[kind] and orders[kind][name] or lastorder)
end
-function jobreferences.set(kind,prefix,tag,data)
+function references.set(kind,prefix,tag,data)
for ref in gmatch(tag,"[^,]+") do
local p, r = match(ref,"^(%-):(.-)$")
if p and r then
@@ -112,17 +191,17 @@ function jobreferences.set(kind,prefix,tag,data)
tobesaved[prefix] = pd
end
pd[ref] = data
- texsprint(ctxcatcodes,format("\\dofinish%sreference{%s}{%s}",kind,prefix,ref))
+ context.dofinishsomereference(kind,prefix,ref)
end
end
end
-function jobreferences.setandgetattribute(kind,prefix,tag,data,view) -- maybe do internal automatically here
- jobreferences.set(kind,prefix,tag,data)
- texcount.lastdestinationattribute = jobreferences.setinternalreference(prefix,tag,nil,view) or -0x7FFFFFFF
+function references.setandgetattribute(kind,prefix,tag,data,view) -- maybe do internal automatically here
+ references.set(kind,prefix,tag,data)
+ texcount.lastdestinationattribute = references.setinternalreference(prefix,tag,nil,view) or -0x7FFFFFFF
end
-function jobreferences.enhance(prefix,tag,spec)
+function references.enhance(prefix,tag,spec)
local l = tobesaved[prefix][tag]
if l then
l.references.realpage = texcount.realpageno
@@ -133,9 +212,9 @@ end
local result = { }
-local lparent, rparent, lbrace, rbrace, dcolon, backslash = lpeg.P("("), lpeg.P(")"), lpeg.P("{"), lpeg.P("}"), lpeg.P("::"), lpeg.P("\\")
+local lparent, rparent, lbrace, rbrace, dcolon, backslash = lpegP("("), lpegP(")"), lpegP("{"), lpegP("}"), lpegP("::"), lpegP("\\")
-local reset = lpeg.P("") / function() result = { } end
+local reset = lpegP("") / function() result = { } end
local b_token = backslash / function(s) result.has_tex = true return s end
local o_token = 1 - rparent - rbrace - lparent - lbrace
@@ -144,11 +223,11 @@ local s_token = 1 - lparent - lbrace - lparent - lbrace
local i_token = 1 - lparent - lbrace
local f_token = 1 - lparent - lbrace - dcolon
-local outer = (f_token )^1 / function (s) result.outer = s end
-local operation = lpeg.Cs((b_token + o_token)^1) / function (s) result.operation = s end
-local arguments = lpeg.Cs((b_token + a_token)^0) / function (s) result.arguments = s end
-local special = (s_token )^1 / function (s) result.special = s end
-local inner = (i_token )^1 / function (s) result.inner = s end
+local outer = (f_token )^1 / function (s) result.outer = s end
+local operation = lpegCs((b_token + o_token)^1) / function (s) result.operation = s end
+local arguments = lpegCs((b_token + a_token)^0) / function (s) result.arguments = s end
+local special = (s_token )^1 / function (s) result.special = s end
+local inner = (i_token )^1 / function (s) result.inner = s end
local outer_reference = (outer * dcolon)^0
@@ -160,34 +239,34 @@ local special_reference = special * lparent * (operation * optional_arguments +
local scanner = (reset * outer_reference * (special_reference + inner_reference)^-1 * -1) / function() return result end
---~ function jobreferences.analyse(str) -- overloaded
+--~ function references.analyze(str) -- overloaded
--~ return lpegmatch(scanner,str)
--~ end
-function jobreferences.split(str)
+function references.split(str)
return lpegmatch(scanner,str or "")
end
---~ print(table.serialize(jobreferences.analyse("")))
---~ print(table.serialize(jobreferences.analyse("inner")))
---~ print(table.serialize(jobreferences.analyse("special(operation{argument,argument})")))
---~ print(table.serialize(jobreferences.analyse("special(operation)")))
---~ print(table.serialize(jobreferences.analyse("special()")))
---~ print(table.serialize(jobreferences.analyse("inner{argument}")))
---~ print(table.serialize(jobreferences.analyse("outer::")))
---~ print(table.serialize(jobreferences.analyse("outer::inner")))
---~ print(table.serialize(jobreferences.analyse("outer::special(operation{argument,argument})")))
---~ print(table.serialize(jobreferences.analyse("outer::special(operation)")))
---~ print(table.serialize(jobreferences.analyse("outer::special()")))
---~ print(table.serialize(jobreferences.analyse("outer::inner{argument}")))
---~ print(table.serialize(jobreferences.analyse("special(outer::operation)")))
+--~ print(table.serialize(references.analyze("")))
+--~ print(table.serialize(references.analyze("inner")))
+--~ print(table.serialize(references.analyze("special(operation{argument,argument})")))
+--~ print(table.serialize(references.analyze("special(operation)")))
+--~ print(table.serialize(references.analyze("special()")))
+--~ print(table.serialize(references.analyze("inner{argument}")))
+--~ print(table.serialize(references.analyze("outer::")))
+--~ print(table.serialize(references.analyze("outer::inner")))
+--~ print(table.serialize(references.analyze("outer::special(operation{argument,argument})")))
+--~ print(table.serialize(references.analyze("outer::special(operation)")))
+--~ print(table.serialize(references.analyze("outer::special()")))
+--~ print(table.serialize(references.analyze("outer::inner{argument}")))
+--~ print(table.serialize(references.analyze("special(outer::operation)")))
-- -- -- related to strc-ini.lua -- -- --
-jobreferences.resolvers = jobreferences.resolvers or { }
+references.resolvers = references.resolvers or { }
-function jobreferences.resolvers.section(var)
- local vi = structure.lists.collected[var.i[2]]
+function references.resolvers.section(var)
+ local vi = lists.collected[var.i[2]]
if vi then
var.i = vi
var.r = (vi.references and vi.references.realpage) or (vi.pagedata and vi.pagedata.realpage) or 1
@@ -197,12 +276,12 @@ function jobreferences.resolvers.section(var)
end
end
-jobreferences.resolvers.float = jobreferences.resolvers.section
-jobreferences.resolvers.description = jobreferences.resolvers.section
-jobreferences.resolvers.formula = jobreferences.resolvers.section
-jobreferences.resolvers.note = jobreferences.resolvers.section
+references.resolvers.float = references.resolvers.section
+references.resolvers.description = references.resolvers.section
+references.resolvers.formula = references.resolvers.section
+references.resolvers.note = references.resolvers.section
-function jobreferences.resolvers.reference(var)
+function references.resolvers.reference(var)
local vi = var.i[2]
if vi then
var.i = vi
@@ -214,6 +293,7 @@ function jobreferences.resolvers.reference(var)
end
local function register_from_lists(collected,derived)
+ local g = derived[""] if not g then g = { } derived[""] = g end -- global
for i=1,#collected do
local entry = collected[i]
local m, r = entry.metadata, entry.references
@@ -226,9 +306,10 @@ local function register_from_lists(collected,derived)
local t = { kind, i }
for s in gmatch(reference,"%s*([^,]+)") do
if trace_referencing then
- logs.report("referencing","list entry %s provides %s reference '%s' on realpage %s",i,kind,s,realpage)
+ report_references("list entry %s provides %s reference '%s' on realpage %s",i,kind,s,realpage)
end
- d[s] = t -- share them
+ d[s] = d[s] or t -- share them
+ g[s] = g[s] or t -- first wins
end
end
end
@@ -236,30 +317,34 @@ local function register_from_lists(collected,derived)
end
end
-jobreferences.registerinitializer(function() register_from_lists(structure.lists.collected,derived) end)
+references.registerinitializer(function() register_from_lists(lists.collected,derived) end)
-- urls
-jobreferences.urls = jobreferences.urls or { }
-jobreferences.urls.data = jobreferences.urls.data or { }
+references.urls = references.urls or { }
+references.urls.data = references.urls.data or { }
-local urls = jobreferences.urls.data
+local urls = references.urls.data
-function jobreferences.urls.define(name,url,file,description)
+function references.urls.define(name,url,file,description)
if name and name ~= "" then
urls[name] = { url or "", file or "", description or url or file or ""}
end
end
-function jobreferences.urls.get(name,method,space) -- method: none, before, after, both, space: yes/no
+local pushcatcodes, popcatcodes, txtcatcodes = context.pushcatcodes, context.popcatcodes, tex.txtcatcodes
+
+function references.urls.get(name,method,space) -- method: none, before, after, both, space: yes/no
local u = urls[name]
if u then
local url, file = u[1], u[2]
+ pushcatcodes(txtcatcodes)
if file and file ~= "" then
- texsprint(ctxcatcodes,url,"/",file)
+ context("%s/%s",url,file)
else
- texsprint(ctxcatcodes,url)
+ context(url)
end
+ popcatcodes()
end
end
@@ -269,21 +354,21 @@ end
-- files
-jobreferences.files = jobreferences.files or { }
-jobreferences.files.data = jobreferences.files.data or { }
+references.files = references.files or { }
+references.files.data = references.files.data or { }
-local files = jobreferences.files.data
+local files = references.files.data
-function jobreferences.files.define(name,file,description)
+function references.files.define(name,file,description)
if name and name ~= "" then
files[name] = { file or "", description or file or ""}
end
end
-function jobreferences.files.get(name,method,space) -- method: none, before, after, both, space: yes/no
+function references.files.get(name,method,space) -- method: none, before, after, both, space: yes/no
local f = files[name]
if f then
- texsprint(ctxcatcodes,f[1])
+ context(f[1])
end
end
@@ -293,7 +378,7 @@ end
-- helpers
-function jobreferences.checkedfile(whatever) -- return whatever if not resolved
+function references.checkedfile(whatever) -- return whatever if not resolved
if whatever then
local w = files[whatever]
if w then
@@ -304,7 +389,7 @@ function jobreferences.checkedfile(whatever) -- return whatever if not resolved
end
end
-function jobreferences.checkedurl(whatever) -- return whatever if not resolved
+function references.checkedurl(whatever) -- return whatever if not resolved
if whatever then
local w = urls[whatever]
if w then
@@ -320,7 +405,7 @@ function jobreferences.checkedurl(whatever) -- return whatever if not resolved
end
end
-function jobreferences.checkedfileorurl(whatever,default) -- return nil, nil if not resolved
+function references.checkedfileorurl(whatever,default) -- return nil, nil if not resolved
if whatever then
local w = files[whatever]
if w then
@@ -342,25 +427,25 @@ end
-- programs
-jobreferences.programs = jobreferences.programs or { }
-jobreferences.programs.data = jobreferences.programs.data or { }
+references.programs = references.programs or { }
+references.programs.data = references.programs.data or { }
-local programs = jobreferences.programs.data
+local programs = references.programs.data
-function jobreferences.programs.define(name,file,description)
+function references.programs.define(name,file,description)
if name and name ~= "" then
programs[name] = { file or "", description or file or ""}
end
end
-function jobreferences.programs.get(name)
+function references.programs.get(name)
local f = programs[name]
if f then
- texsprint(ctxcatcodes,f[1])
+ context(f[1])
end
end
-function jobreferences.checkedprogram(whatever) -- return whatever if not resolved
+function references.checkedprogram(whatever) -- return whatever if not resolved
if whatever then
local w = programs[whatever]
if w then
@@ -373,36 +458,36 @@ end
-- shared by urls and files
-function jobreferences.whatfrom(name)
- texsprint(ctxcatcodes,(urls[name] and variables.url) or (files[name] and variables.file) or variables.unknown)
+function references.whatfrom(name)
+ context((urls[name] and variables.url) or (files[name] and variables.file) or variables.unknown)
end
---~ function jobreferences.from(name)
+--~ function references.from(name)
--~ local u = urls[name]
--~ if u then
--~ local url, file, description = u[1], u[2], u[3]
--~ if description ~= "" then
---~ texsprint(ctxcatcodes,format("\\dofromurldescription{%s}",description))
+--~ context.dofromurldescription(description)
--~ -- ok
--~ elseif file and file ~= "" then
---~ texsprint(ctxcatcodes,format("\\dofromurlliteral{%s}",url .. "/" .. file))
+--~ context.dofromurlliteral(url .. "/" .. file)
--~ else
---~ texsprint(ctxcatcodes,format("\\dofromurlliteral{%s}",url))
+--~ context(dofromurlliteral,url)
--~ end
--~ else
--~ local f = files[name]
--~ if f then
--~ local description, file = f[1], f[2]
--~ if description ~= "" then
---~ texsprint(ctxcatcodes,format("\\dofromfiledescription{%s}",description))
+--~ context.dofromfiledescription(description)
--~ else
---~ texsprint(ctxcatcodes,format("\\dofromfileliteral{%s}",file))
+--~ context.dofromfileliteral(file)
--~ end
--~ end
--~ end
--~ end
-function jobreferences.from(name)
+function references.from(name)
local u = urls[name]
if u then
local url, file, description = u[1], u[2], u[3]
@@ -456,11 +541,12 @@ function exporters.lists.generic(data)
end
if numberdata then
local numbers = numberdata.numbers
- local t = { }
+ local t, tn = { }, 0
for i=1,#numbers do
local n = numbers[i]
if n ~= 0 then
- t[#t+1] = n
+ tn = tn + 1
+ t[tn] = n
end
end
useddata.number = concat(t,".")
@@ -481,13 +567,16 @@ local function referencer(data)
}
end
-function jobreferences.export(usedname)
+-- Exported and imported references ... not yet used but don't forget it
+-- and redo it.
+
+function references.export(usedname)
local exported = { }
local e_references, e_lists = exporters.references, exporters.lists
local g_references, g_lists = e_references.generic, e_lists.generic
-- todo: pagenumbers
-- todo: some packing
- for prefix, references in next, jobreferences.tobesaved do
+ for prefix, references in next, references.tobesaved do
local pe = exported[prefix] if not pe then pe = { } exported[prefix] = pe end
for key, data in next, references do
local metadata = data.metadata
@@ -506,7 +595,7 @@ function jobreferences.export(usedname)
end
end
local pe = exported[""] if not pe then pe = { } exported[""] = pe end
- for n, data in next, structure.lists.tobesaved do
+ for n, data in next, lists.tobesaved do
local metadata = data.metadata
local exporter = e_lists[metadata.kind] or g_lists
if exporter then
@@ -531,9 +620,8 @@ function jobreferences.export(usedname)
io.savedata(file.replacesuffix(usedname or tex.jobname,"tue"),table.serialize(e,true))
end
-function jobreferences.import(usedname)
+function references.import(usedname)
if usedname then
- local imported = jobreferences.imported
local jdn = imported[usedname]
if not jdn then
local filename = files[usedname]
@@ -574,20 +662,20 @@ function jobreferences.import(usedname)
end
end
-function jobreferences.load(usedname)
+function references.load(usedname)
-- gone
end
-function jobreferences.define(prefix,reference,list)
+function references.define(prefix,reference,list)
local d = defined[prefix] if not d then d = { } defined[prefix] = d end
d[reference] = { "defined", list }
end
---~ function jobreferences.registerspecial(name,action,...)
+--~ function references.registerspecial(name,action,...)
--~ specials[name] = { action, ... }
--~ end
-function jobreferences.reset(prefix,reference)
+function references.reset(prefix,reference)
local d = defined[prefix]
if d then
d[reference] = nil
@@ -600,25 +688,55 @@ end
-- t.special t.operation t.arguments t.outer t.inner
-local settings_to_array = aux.settings_to_array
+-- to what extend do we check the non prefixed variant
+
+local strict = false
local function resolve(prefix,reference,args,set) -- we start with prefix,reference
texcount.referencehastexstate = 0
if reference and reference ~= "" then
- set = set or { }
+ if not set then
+ set = { prefix = prefix, reference = reference }
+ else
+ set.reference = set.reference or reference
+ set.prefix = set.prefix or prefix
+ end
local r = settings_to_array(reference)
for i=1,#r do
local ri = r[i]
- local dp = defined[prefix] or defined[""]
- local d = dp[ri]
+ 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[2],nil,set)
else
local var = lpegmatch(scanner,ri)
if var then
var.reference = ri
- if not var.outer and var.inner then
- local d = defined[prefix][var.inner] or defined[""][var.inner]
+ 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[2],var.arguments,set) -- args can be nil
else
@@ -633,13 +751,14 @@ local function resolve(prefix,reference,args,set) -- we start with prefix,refere
set.has_tex = true
end
else
- -- logs.report("references","funny pattern: %s",ri or "?")
+ -- report_references("funny pattern: %s",ri or "?")
end
end
end
if set.has_tex then
texcount.referencehastexstate = 1
end
+--~ table.print(set)
return set
else
return { }
@@ -648,41 +767,69 @@ end
-- prefix == "" is valid prefix which saves multistep lookup
-jobreferences.currentset = nil
+references.currentset = nil
+
+--~ local b, e = "\\ctxlua{local jc = structures.references.currentset;", "}"
+--~ local o, a = 'jc[%s].operation=[[%s]];', 'jc[%s].arguments=[[%s]];'
+--~
+--~ function references.expandcurrent() -- todo: two booleans: o_has_tex& a_has_tex
+--~ local currentset = references.currentset
+--~ if currentset and currentset.has_tex then
+--~ local done = false
+--~ for i=1,#currentset do
+--~ local ci = currentset[i]
+--~ local operation = ci.operation
+--~ if operation then
+--~ if find(operation,"\\") then -- if o_has_tex then
+--~ if not done then
+--~ context(b)
+--~ done = true
+--~ end
+--~ context(o,i,operation)
+--~ end
+--~ end
+--~ local arguments = ci.arguments
+--~ if arguments then
+--~ if find(arguments,"\\") then -- if a_has_tex then
+--~ if not done then
+--~ context(b)
+--~ done = true
+--~ end
+--~ context(a,i,arguments)
+--~ end
+--~ end
+--~ end
+--~ if done then
+--~ context(e)
+--~ end
+--~ end
+--~ end
+
+function commands.setreferenceoperation(k,v)
+ references.currentset[k].operation = v
+end
+
+function commands.setreferencearguments(k,v)
+ references.currentset[k].arguments = v
+end
-local b, e = "\\ctxlua{local jc = jobreferences.currentset;", "}"
-local o, a = 'jc[%s].operation=[[%s]];', 'jc[%s].arguments=[[%s]];'
+local expandreferenceoperation = context.expandreferenceoperation
+local expandreferencearguments = context.expandreferencearguments
-function jobreferences.expandcurrent() -- todo: two booleans: o_has_tex& a_has_tex
- local currentset = jobreferences.currentset
+function references.expandcurrent() -- todo: two booleans: o_has_tex& a_has_tex
+ local currentset = references.currentset
if currentset and currentset.has_tex then
- local done = false
for i=1,#currentset do
local ci = currentset[i]
local operation = ci.operation
- if operation then
- if find(operation,"\\") then -- if o_has_tex then
- if not done then
- texsprint(ctxcatcodes,b)
- done = true
- end
- texsprint(ctxcatcodes,format(o,i,operation))
- end
+ if operation and find(operation,"\\") then -- if o_has_tex then
+ expandreferenceoperation(i,operation)
end
local arguments = ci.arguments
- if arguments then
- if find(arguments,"\\") then -- if a_has_tex then
- if not done then
- texsprint(ctxcatcodes,b)
- done = true
- end
- texsprint(ctxcatcodes,format(a,i,arguments))
- end
+ if arguments and find(arguments,"\\") then -- if a_has_tex then
+ expandreferencearguments(i,arguments)
end
end
- if done then
- texsprint(ctxcatcodes,e)
- end
end
end
@@ -696,9 +843,17 @@ end
--~ end
--~ end
+local prefixsplitter = lpegCs(lpegP((1-lpegP(":"))^1 * lpegP(":"))) * lpegCs(lpegP(1)^1)
+
+-- todo: add lots of tracing here
+
+local n = 0
+
local function identify(prefix,reference)
local set = resolve(prefix,reference)
local bug = false
+n = n + 1
+set.n = n
for i=1,#set do
local var = set[i]
local special, inner, outer, arguments, operation = var.special, var.inner, var.outer, var.arguments, var.operation
@@ -730,7 +885,7 @@ local function identify(prefix,reference)
var.error = "unknown special"
end
elseif outer then
- local e = jobreferences.import(outer)
+ local e = references.import(outer)
if e then
if inner then
local r = e.references
@@ -747,7 +902,7 @@ local function identify(prefix,reference)
var.kind = "outer with inner"
end
var.i = { "reference", r }
- jobreferences.resolvers.reference(var)
+ references.resolvers.reference(var)
var.f = outer
var.e = true -- external
end
@@ -769,7 +924,7 @@ local function identify(prefix,reference)
var.kind = "outer with inner"
end
var.i = r
- jobreferences.resolvers[r[1]](var)
+ references.resolvers[r[1]](var)
var.f = outer
end
end
@@ -812,7 +967,7 @@ local function identify(prefix,reference)
var.kind = "outer with inner"
end
var.i = { "reference", inner }
- jobreferences.resolvers.reference(var)
+ references.resolvers.reference(var)
var.f = outer
elseif special then
local s = specials[special]
@@ -849,47 +1004,101 @@ local function identify(prefix,reference)
var.error = "unknown inner or special"
end
else
- -- inner
---~ local i = tobesaved[prefix]
- local i = collected[prefix]
- i = i and i[inner]
+ -- inner ... we could move the prefix logic into the parser so that we have 'm for each entry
+ -- foo:bar -> foo == prefix (first we try the global one)
+ -- -:bar -> ignore prefix
+ local p, i = prefix, nil
+ local splitprefix, splitinner = lpegmatch(prefixsplitter,inner)
+ -- these are taken from other anonymous references
+ if splitprefix and splitinner then
+ if splitprefix == "-" then
+ i = collected[""]
+ i = i and i[splitinner]
+ if i then
+ p = ""
+ end
+ else
+ i = collected[splitprefix]
+ i = i and i[splitinner]
+ if i then
+ p = splitprefix
+ end
+ end
+ end
+ -- todo: strict here
+ if not i then
+ i = collected[prefix]
+ i = i and i[inner]
+ if i then
+ p = prefix
+ end
+ end
+ if not i and prefix ~= "" then
+ i = collected[""]
+ i = i and i[inner]
+ if i then
+ p = ""
+ end
+ end
if i then
var.i = { "reference", i }
- jobreferences.resolvers.reference(var)
+ references.resolvers.reference(var)
var.kind = "inner"
- var.p = prefix
+ var.p = p
else
- i = derived[prefix]
- i = i and i[inner]
+ -- these are taken from other data structures (like lists)
+--~ print("!!!!!!!!!!!!!!",splitprefix,splitinner)
+--~ table.print(derived)
+ if splitprefix and splitinner then
+ if splitprefix == "-" then
+ i = derived[""]
+ i = i and i[splitinner]
+ if i then
+ p = ""
+ end
+ else
+ i = derived[splitprefix]
+ i = i and i[splitinner]
+ if i then
+ p = splitprefix
+ end
+ end
+ end
+ if not i then
+ i = derived[prefix]
+ i = i and i[inner]
+ if i then
+ p = prefix
+ end
+ end
+ if not i and prefix ~= "" then
+ i = derived[""]
+ i = i and i[inner]
+ if i then
+ p = ""
+ end
+ end
if i then
var.kind = "inner"
var.i = i
- jobreferences.resolvers[i[1]](var)
- var.p = prefix
+ references.resolvers[i[1]](var)
+ var.p = p
else
- i = collected[prefix]
- i = i and i[inner]
- if i then
- var.kind = "inner"
- var.i = { "reference", i }
- jobreferences.resolvers.reference(var)
- var.p = prefix
+ -- no prefixes here
+ local s = specials[inner]
+ if s then
+ var.kind = "special"
else
- local s = specials[inner]
- if s then
- var.kind = "special"
+ i = (collected[""] and collected[""][inner]) or
+ (derived [""] and derived [""][inner]) or
+ (tobesaved[""] and tobesaved[""][inner])
+ if i then
+ var.kind = "inner"
+ var.i = { "reference", i }
+ references.resolvers.reference(var)
+ var.p = ""
else
- i = (collected[""] and collected[""][inner]) or
- (derived [""] and derived [""][inner]) or
- (tobesaved[""] and tobesaved[""][inner])
- if i then
- var.kind = "inner"
- var.i = { "reference", i }
- jobreferences.resolvers.reference(var)
- var.p = ""
- else
- var.error = "unknown inner or special"
- end
+ var.error = "unknown inner or special"
end
end
end
@@ -899,87 +1108,131 @@ local function identify(prefix,reference)
bug = bug or var.error
set[i] = var
end
- jobreferences.currentset = set
--- print(bug,table.serialize(set))
+ references.currentset = mark(set) -- mark, else in api doc
+--~ table.print(set,tostring(bug))
return set, bug
end
-jobreferences.identify = identify
+references.identify = identify
-function jobreferences.doifelse(prefix,reference,highlight,newwindow,layer)
+local unknowns, nofunknowns = { }, 0
+
+function references.doifelse(prefix,reference,highlight,newwindow,layer)
local set, bug = identify(prefix,reference)
local unknown = bug or #set == 0
if unknown then
currentreference = nil -- will go away
+ local str = format("[%s][%s]",prefix,reference)
+ local u = unknowns[str]
+ if not u then
+ interfaces.showmessage("references",1,str) -- 1 = unknown, 4 = illegal
+ unknowns[str] = 1
+ nofunknowns = nofunknowns + 1
+ else
+ unknowns[str] = u + 1
+ end
else
set.highlight, set.newwindow,set.layer = highlight, newwindow, layer
currentreference = set[1]
end
-- we can do the expansion here which saves a call
+--~ print("!!!!!!",not unknown)
commands.doifelse(not unknown)
end
-function jobreferences.setinternalreference(prefix,tag,internal,view)
- local t = { }
- if tag then
- if prefix and prefix ~= "" then
- prefix = prefix .. ":"
- for ref in gmatch(tag,"[^,]+") do
- t[#t+1] = prefix .. ref
- end
- else
- for ref in gmatch(tag,"[^,]+") do
- t[#t+1] = ref
- end
+function references.reportproblems() -- might become local
+ if nofunknowns > 0 then
+ interfaces.showmessage("references",5,nofunknowns) -- 5 = unknown, 6 = illegal
+ -- -- we need a proper logger specific for the log file
+ -- texio.write_nl("log",format("%s unknown references",nofunknowns))
+ -- for k, v in table.sortedpairs(unknowns) do
+ -- texio.write_nl("log",format("%s (n=%s)",k,v))
+ -- end
+ -- texio.write_nl("log","")
+ end
+end
+
+luatex.registerstopactions(references.reportproblems)
+
+local innermethod = "names"
+
+function references.setinnermethod(m)
+ if m then
+ if m == "page" or m == "mixed" or m == "names" then
+ innermethod = m
+ elseif m == true or m == variables.yes then
+ innermethod = "page"
end
end
- if internal then
- t[#t+1] = "aut:" .. internal
+ function references.setinnermethod()
+ report_references("inner method is already set and frozen to '%s'",innermethod)
end
- local destination = jobreferences.mark(t,nil,nil,view) -- returns an attribute
- texcount.lastdestinationattribute = destination
- return destination
end
-function jobreferences.getinternalreference(n) -- n points into list
- local l = structure.lists.collected[n]
- texsprint(ctxcatcodes,(l and l.references.internal) or n)
+function references.getinnermethod()
+ return innermethod or "names"
+end
+
+directives.register("references.linkmethod", function(v) -- page mixed names
+ references.setinnermethod(v)
+end)
+
+function references.setinternalreference(prefix,tag,internal,view)
+ if innermethod == "page" then
+ return unsetvalue
+ else
+ local t, tn = { }, 0 -- maybe add to current
+ if tag then
+ if prefix and prefix ~= "" then
+ prefix = prefix .. ":"
+ for ref in gmatch(tag,"[^,]+") do
+ tn = tn + 1
+ t[tn] = prefix .. ref
+ end
+ else
+ for ref in gmatch(tag,"[^,]+") do
+ tn = tn + 1
+ t[tn] = ref
+ end
+ end
+ end
+ if internal and innermethod == "names" then -- mixed or page
+ tn = tn + 1
+ t[tn] = "aut:" .. internal
+ end
+ local destination = references.mark(t,nil,nil,view) -- returns an attribute
+ texcount.lastdestinationattribute = destination
+ return destination
+ end
end
+function references.getinternalreference(n) -- n points into list (todo: registers)
+ local l = lists.collected[n]
+ context(l and l.references.internal or n)
+end
--
-function jobreferences.get_current_metadata(tag)
+function references.getcurrentmetadata(tag)
local data = currentreference and currentreference.i
data = data and data.metadata and data.metadata[tag]
if data then
- texsprint(ctxcatcodes,data)
+ context(data)
end
end
-local function current_metadata(tag)
+
+local function currentmetadata(tag)
local data = currentreference and currentreference.i
return data and data.metadata and data.metadata[tag]
end
-jobreferences.current_metadata = current_metadata
-function jobreferences.get_current_prefixspec(default) -- todo: message
- texsprint(ctxcatcodes,"\\getreferencestructureprefix{",
- current_metadata("kind") or "?", "}{", current_metadata("name") or "?", "}{", default or "?", "}")
-end
-
---~ function jobreferences.get_current_prefixspec(default) -- we can consider storing the data at the lua end
---~ context.getreferencestructureprefix(current_metadata("kind"),current_metadata("name"),default)
---~ end
+references.currentmetadata = currentmetadata
---
-
-jobreferences.filters = jobreferences.filters or { }
-
-local filters = jobreferences.filters
-local helpers = structure.helpers
-local sections = structure.sections
+function references.getcurrentprefixspec(default) -- todo: message
+ context.getreferencestructureprefix(currentmetadata("kind") or "?",currentmetadata("name") or "?",default or "?")
+end
-function jobreferences.filter(name,...) -- number page title ...
+function references.filter(name,...) -- number page title ...
local data = currentreference and currentreference.i
if data then
local kind = data.metadata and data.metadata.kind
@@ -988,17 +1241,17 @@ function jobreferences.filter(name,...) -- number page title ...
filter = filter and (filter[name] or filter.unknown or filters.generic[name] or filters.generic.unknown)
if filter then
if trace_referencing then
- logs.report("referencing","name '%s', kind '%s', using dedicated filter",name,kind)
+ report_references("name '%s', kind '%s', using dedicated filter",name,kind)
end
filter(data,name,...)
elseif trace_referencing then
- logs.report("referencing","name '%s', kind '%s', using generic filter",name,kind)
+ report_references("name '%s', kind '%s', using generic filter",name,kind)
end
elseif trace_referencing then
- logs.report("referencing","name '%s', unknown kind",name)
+ report_references("name '%s', unknown kind",name)
end
elseif trace_referencing then
- logs.report("referencing","name '%s', no reference",name)
+ report_references("name '%s', no reference",name)
end
end
@@ -1032,7 +1285,7 @@ function filters.generic.number(data,what,prefixspec) -- todo: spec and then no
else
local useddata = data.useddata
if useddata and useddsta.number then
- tex.sprint(tex.ctxcatcodes,useddata.number)
+ context(useddata.number)
end
end
end
@@ -1047,9 +1300,9 @@ function filters.generic.page(data,prefixspec,pagespec)
if not number then
-- error
elseif conversion then
- tex.sprint(tex.ctxcatcodes,format("\\convertnumber{%s}{%s}",conversion,number))
+ context.convertnumber(conversion,number)
else
- tex.sprint(tex.ctxcatcodes,number)
+ context(number)
end
else
helpers.prefixpage(data,prefixspec,pagespec)
@@ -1072,7 +1325,7 @@ function filters.user.unknown(data,name)
end
local namedata = userdata and userdata[name]
if namedata then
- texsprint(ctxcatcodes,namedata)
+ context(namedata)
end
end
end
@@ -1080,12 +1333,10 @@ end
filters.text = { }
function filters.text.title(data)
--- texsprint(ctxcatcodes,"[text title]")
helpers.title(data.entries.text or "?",data.metadata)
end
function filters.text.number(data)
--- texsprint(ctxcatcodes,"[text number]")
helpers.title(data.entries.text or "?",data.metadata)
end
@@ -1103,7 +1354,7 @@ function filters.section.number(data,what,prefixspec)
else
local useddata = data.useddata
if useddata and useddata.number then
- tex.sprint(tex.ctxcatcodes,useddata.number)
+ context(useddata.number)
end
end
end
@@ -1119,12 +1370,6 @@ filters.float = { default = filters.generic.number }
filters.description = { default = filters.generic.number }
filters.item = { default = filters.generic.number }
-structure.references = structure.references or { }
-structure.helpers = structure.helpers or { }
-
-local references = structure.references
-local helpers = structure.helpers
-
function references.sectiontitle(n)
helpers.sectiontitle(lists.collected[tonumber(n) or 0])
end
@@ -1137,25 +1382,39 @@ function references.sectionpage(n,prefixspec,pagespec)
helpers.prefixedpage(lists.collected[tonumber(n) or 0],prefixspec,pagespec)
end
--- analyse
+-- analyze
-jobreferences.testrunners = jobreferences.testrunners or { }
-jobreferences.testspecials = jobreferences.testspecials or { }
+references.testrunners = references.testrunners or { }
+references.testspecials = references.testspecials or { }
-local runners = jobreferences.testrunners
-local specials = jobreferences.testspecials
+local runners = references.testrunners
+local specials = references.testspecials
-function jobreferences.analyse(actions)
- actions = actions or jobreferences.currentset
+local function checkedpagestate(n,page)
+ local r, p = referred[n] or texcount.realpageno, tonumber(page)
+ if not p then
+ return 0
+ elseif p > r then
+ return 3
+ elseif p < r then
+ return 2
+ else
+ return 1
+ end
+end
+
+function references.analyze(actions)
+ actions = actions or references.currentset
if not actions then
actions = { realpage = 0 }
+ texcount.referencepagestate = 0
elseif actions.realpage then
- -- already analysed
+ -- already analyzed
+ texcount.referencepagestate = checkedpagestate(actions.n,actions.realpage)
else
-- we store some analysis data alongside the indexed array
- -- at this moment only the real reference page is analysed
+ -- at this moment only the real reference page is analyzed
-- normally such an analysis happens in the backend code
- texcount.referencepagestate = 0
local nofactions = #actions
if nofactions > 0 then
for i=1,nofactions do
@@ -1165,43 +1424,53 @@ function jobreferences.analyse(actions)
what = what(a,actions)
end
end
- local realpage, p = texcount.realpageno, tonumber(actions.realpage)
- if not p then
- -- sorry
- elseif p > realpage then
- texcount.referencepagestate = 3
- elseif p < realpage then
- texcount.referencepagestate = 2
- else
- texcount.referencepagestate = 1
- end
+ texcount.referencepagestate = checkedpagestate(actions.n,actions.realpage)
+ else
+ texcount.referencepagestate = 0
end
end
return actions
end
-function jobreferences.realpage() -- special case, we always want result
- local cs = jobreferences.analyse()
- texwrite(cs.realpage or 0)
+function references.realpage() -- special case, we always want result
+ local cs = references.analyze()
+ context(cs.realpage or 0)
end
+local plist
+
+local function realpageofpage(p)
+ if not plist then
+ local pages = structures.pages.collected
+ plist = { }
+ for rp=1,#pages do
+ plist[pages[rp].number] = rp
+ end
+ end
+ return plist[p]
+end
+
+references.realpageofpage = realpageofpage
+
--
-jobreferences.pages = {
- [variables.firstpage] = function() return structure.counters.record("realpage")["first"] end,
- [variables.previouspage] = function() return structure.counters.record("realpage")["previous"] end,
- [variables.nextpage] = function() return structure.counters.record("realpage")["next"] end,
- [variables.lastpage] = function() return structure.counters.record("realpage")["last"] end,
+local pages = allocate {
+ [variables.firstpage] = function() return counters.record("realpage")["first"] end,
+ [variables.previouspage] = function() return counters.record("realpage")["previous"] end,
+ [variables.nextpage] = function() return counters.record("realpage")["next"] end,
+ [variables.lastpage] = function() return counters.record("realpage")["last"] end,
- [variables.firstsubpage] = function() return structure.counters.record("subpage" )["first"] end,
- [variables.previoussubpage] = function() return structure.counters.record("subpage" )["previous"] end,
- [variables.nextsubpage] = function() return structure.counters.record("subpage" )["next"] end,
- [variables.lastsubpage] = function() return structure.counters.record("subpage" )["last"] end,
+ [variables.firstsubpage] = function() return counters.record("subpage" )["first"] end,
+ [variables.previoussubpage] = function() return counters.record("subpage" )["previous"] end,
+ [variables.nextsubpage] = function() return counters.record("subpage" )["next"] end,
+ [variables.lastsubpage] = function() return counters.record("subpage" )["last"] end,
- [variables.forward] = function() return structure.counters.record("realpage")["forward"] end,
- [variables.backward] = function() return structure.counters.record("realpage")["backward"] end,
+ [variables.forward] = function() return counters.record("realpage")["forward"] end,
+ [variables.backward] = function() return counters.record("realpage")["backward"] end,
}
+references.pages = pages
+
-- maybe some day i will merge this in the backend code with a testmode (so each
-- runner then implements a branch)
@@ -1220,10 +1489,10 @@ end
runners["special operation"] = runners["special"]
runners["special operation with arguments"] = runners["special"]
-local pages = jobreferences.pages
+-- weird, why is this code here and in lpdf-ano
function specials.internal(var,actions)
- local v = jobreferences.internals[tonumber(var.operation)]
+ local v = references.internals[tonumber(var.operation)]
local r = v and v.references.realpage
if r then
actions.realpage = r
@@ -1232,12 +1501,32 @@ end
specials.i = specials.internal
-function specials.page(var,actions) -- is this ok?
- local p = pages[var.operation]
+function specials.page(var,actions)
+ local o = var.operation
+ local p = pages[o]
if type(p) == "function" then
p = p()
+ else
+ p = tonumber(realpageofpage(tonumber(o)))
+ end
+ if p then
+ var.r = p
+ actions.realpage = actions.realpage or p -- first wins
end
+end
+
+function specials.realpage(var,actions)
+ local p = tonumber(var.operation)
+ if p then
+ var.r = p
+ actions.realpage = actions.realpage or p -- first wins
+ end
+end
+
+function specials.userpage(var,actions)
+ local p = tonumber(realpageofpage(var.operation))
if p then
- actions.realpage = p
+ var.r = p
+ actions.realpage = actions.realpage or p -- first wins
end
end
diff --git a/Master/texmf-dist/tex/context/base/strc-ref.mkii b/Master/texmf-dist/tex/context/base/strc-ref.mkii
index 1df5d09d826..4550f714430 100644
--- a/Master/texmf-dist/tex/context/base/strc-ref.mkii
+++ b/Master/texmf-dist/tex/context/base/strc-ref.mkii
@@ -44,22 +44,6 @@
\unprotect
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
-% messages moved
-
%D This module deals with referencing. In \CONTEXT\ referencing
%D is one of the core features, although at a first glance
%D probably nobody will notice. This is good, because
@@ -786,7 +770,7 @@
%D \starttyping
%D \pagereference[important]
%D \pagereference[unimportant]
-%D \setupreferencing[prefixprefix=sidetrack]
+%D \setupreferencing[prefix=sidetrack]
%D \pagereference[important]
%D \stoptyping
%D
diff --git a/Master/texmf-dist/tex/context/base/strc-ref.mkiv b/Master/texmf-dist/tex/context/base/strc-ref.mkiv
index 8290a1b1380..bec96e05c23 100644
--- a/Master/texmf-dist/tex/context/base/strc-ref.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-ref.mkiv
@@ -112,16 +112,28 @@
\newcount\lastreferenceattribute
\newcount\lastdestinationattribute
-\def\dofinishfullreference#1#2{\normalexpanded{\ctxlatelua{jobreferences.enhance("#1","#2")}}}
-\def\dofinishtextreference#1#2{\normalexpanded{\ctxlatelua{jobreferences.enhance("#1","#2",{})}}}
+\def\dofinishfullreference#1#2{\normalexpanded{\ctxlatelua{structures.references.enhance("#1","#2")}}}
+\def\dofinishtextreference#1#2{\normalexpanded{\ctxlatelua{structures.references.enhance("#1","#2",{})}}}
\let\dofinishpagereference\dofinishfullreference
\let\dofinishuserreference\dofinishfullreference
-\def\dodosetreference#1#2#3#4% kind labels userdata text -> todo: userdata
+\def\dofinishsomereference#1{\executeifdefined{dofinish#1reference}\gobbletwoarguments}
+
+\def\dodosetreference
+ {\ifreferencing
+ \expandafter\dododosetreference
+ \else
+ \expandafter\gobblefourarguments
+ \fi}
+
+\def\dododosetreference#1#2#3#4% kind labels userdata text -> todo: userdata
{\ifreferencing
+ % we could have a more efficient one for page references but for the moment
+ % we don't care too much
\edef\currentreferencekind{#1}%
\edef\currentreferencelabels{#2}%
+ \edef\currentreferenceuserdata{#3}%
\edef\currentreferenceexpansion{\@@rfexpansion}% {\referenceparameter\c!expansion}
\ifx\currentreferencelabels\empty \else
\ifx\currentreferenceexpansion\s!xml
@@ -137,36 +149,69 @@
\fi
\globallet\currentreferencecoding\s!tex
\fi
- % beware, the jobreferences.set writes a
+ % beware, the structures.references.set writes a
% \setnextinternalreference
- \ctxlua{jobreferences.setandgetattribute("\currentreferencekind", "\referenceprefix","\currentreferencelabels",
+ \ctxlua{structures.references.setandgetattribute("\currentreferencekind", "\referenceprefix","\currentreferencelabels",
{
references = {
% internal = \nextinternalreference, % no need for an internal as we have an explicit
block = "\currentstructureblock",
- section = structure.sections.currentid(),
+ section = structures.sections.currentid(),
},
- metadata = {
- kind = "#1",
- catcodes = \the\catcodetable,
- xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text
+ metadata = { % we could assume page to have no metadata
+ kind = "#1",
+ \ifx\currentreferencekind\s!page\else
+ catcodes = \the\catcodetable,
+ xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text
+ \fi
},
\ifx\currentreferencedata\empty\else
entries = {
text = \!!bs\currentreferencedata\!!es
},
\fi
- userdata = structure.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
- },"\@@iafocus")
+ \ifx\currentreferenceuserdata\empty\else
+ userdata = structures.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
+ \fi
+ },"\interactionparameter\c!focus")
}%
+ % todo: optional
\xdef\currentdestinationattribute{\number\lastdestinationattribute}%
- \begingroup\attribute\destinationattribute\currentdestinationattribute\hbox{}\endgroup % todo
+ \begingroup\attribute\destinationattribute\currentdestinationattribute\emptyhbox\endgroup % todo
\fi
\fi}
\def\defaultreferencepage#1{[[[#1]]]}
\def\defaultreferencetext#1{[[[#1]]]}
+%D For internal usage:
+
+\def\dosetsimplepagereference#1% label
+ {\iflocation
+ \ctxlua{structures.references.setandgetattribute("\s!page", "\referenceprefix","#1",
+ {
+ references = {
+ % block = "\currentstructureblock",
+ % section = structures.sections.currentid(),
+ },
+ metadata = { % we could assume page to have no metadata
+ kind = "\s!page",
+ },
+ },"\interactionparameter\c!focus")
+ }%
+ \xdef\currentdestinationattribute{\number\lastdestinationattribute}%
+ \else
+ \xdef\currentdestinationattribute{\number\attributeunsetvalue}%
+ \fi}
+
+\def\dogetsimplepagereference#1%
+ {\iflocation
+ \ctxlua{structures.references.inject("\referenceprefix","#1",\number\ht\strutbox,\number\dp\strutbox,\extrareferencearguments)}%
+ \xdef\currentreferenceattribute{\number\lastreferenceattribute}%
+ \else
+ \xdef\currentreferenceattribute{\number\attributeunsetvalue}%
+ \fi}
+
%D These macros depend on three other ones,
%D \type {\makesectionformat}, that generated \type
%D {\sectionformat}, \type {\pagenumber}. The not yet used
@@ -213,7 +258,7 @@
%D \stoptabulate
\def\usereferences[#1]% not yet
- {\writestatus\m!systems{references from other files are handled automatically}}
+ {\writestatus\m!system{references from other files are handled automatically}}
%D As mentioned we will also use the cross reference mechanism
%D for navigational purposes. The main reason for this is that
@@ -371,13 +416,13 @@
{\dodoubleempty\dodefinereference}
\def\dodefinereference[#1][#2]%
- {\ctxlua{jobreferences.define("\referenceprefix","#1",\!!bs\detokenize{#2}\!!es)}}
+ {\ctxlua{structures.references.define("\referenceprefix","#1",\!!bs\detokenize{#2}\!!es)}}
\def\resetreference[#1]%
- {\ctxlua{jobreferences.reset("\referenceprefix","#1")}}
+ {\ctxlua{structures.references.reset("\referenceprefix","#1")}}
\def\setpagereference#1#2% name, specification
- {\ctxlua{jobreferences.define("","#1",\!!bs\v!page(\luaescapestring{#2})\!!es)}}
+ {\ctxlua{structures.references.define("","#1",\!!bs\v!page(\luaescapestring{#2})\!!es)}}
%D Chained references are defined as:
%D
@@ -407,10 +452,13 @@
\newconditional\gotonewwindow \setfalse\gotonewwindow
\def\expandtexincurrentreference % will happen in lua some time
- {\ifcase\referencehastexstate\else\ctxlua{jobreferences.expandcurrent()}\fi}
+ {\ifcase\referencehastexstate\else\ctxlua{structures.references.expandcurrent()}\fi}
+
+\def\expandreferenceoperation#1#2{\ctxcommand{setreferenceoperation(#1,\!!bs#2\!!es)}}
+\def\expandreferencearguments#1#2{\ctxcommand{setreferencearguments(#1,\!!bs#2\!!es)}}
\def\doifreferencefoundelse#1#2#3%
- {\ctxlua{jobreferences.doifelse("\referenceprefix","#1",\luaconditional\highlighthyperlinks,\luaconditional\gotonewwindow)}%
+ {\ctxlua{structures.references.doifelse("\referenceprefix","#1",\luaconditional\highlighthyperlinks,\luaconditional\gotonewwindow)}%
{\expandtexincurrentreference#2}%
{#3}}
@@ -422,7 +470,7 @@
%D be called.
\def\analyzecurrentreference
- {\ctxlua{jobreferences.analyse()}}
+ {\ctxlua{structures.references.analyze()}}
%D The inner case is simple. Only two cases have to be taken
%D care of:
@@ -446,14 +494,14 @@
%D An unknown reference is reported on the screen, in the log
%D file and, when enabled, in the left margin of the text.
-\def\reportreferenceerror#1#2% only once (keep track in lua)
- {\ifinpagebody \else
- \doifconcepttracing{\doifsomething{#2}{\inleft{\infofont\doboundtext{#2}{\dimexpr\leftmarginwidth-2em\relax}{..}->}}}%
- \fi
- \showmessage\m!references{#1}{[\referenceprefix][#2]}}
+% \def\unknownreference#1%
+% {\iftrialtypesetting \else
+% \ifinpagebody \else
+% \doifconcepttracing{\doifsomething{#1}{\inleft{\infofont\doboundtext{#1}{\dimexpr\leftmarginwidth-2em\relax}{..}->}}}%
+% \fi
+% \fi}
-\def\unknownreference{\reportreferenceerror1}
-\def\illegalreference{\reportreferenceerror4}
+\let\unknownreference\gobbleoneargument
%D When a reference is not found, we typeset a placeholder
%D (two glyphs are often enough to represent the reference
@@ -521,26 +569,31 @@
\newcount\locationorder
\newbox \locationbox
-\def\nextinternalreference {\the\locationcount}
+\def\nextinternalreference {\the\locationcount}
\def\nextinternalorderreference{\the\locationorder}
\def\setnextinternalreference
{\global\advance\locationcount\plusone}
\def\setnextinternalreferences#1#2% plural
- {\ctxlua{jobreferences.setnextinternal("#1","#2")}}
+ {\ctxlua{structures.references.setnextinternal("#1","#2")}}
\def\getinternalorderreference#1#2%
- {\ctxlua{jobreferences.currentorder("#1","#2")}}
+ {\ctxlua{structures.references.currentorder("#1","#2")}}
\def\thisissomeinternal#1#2% tag reference (only for old time sake)
- {\begingroup\attribute\destinationattribute\ctxlua{jobreferences.mark("#1:#2")}\hbox{}\endgroup}
+ {\begingroup
+ \ctxlua{structures.references.setinternalreference("","#1:#2")}%
+ \hbox attr \destinationattribute\lastdestinationattribute{}%
+ \endgroup}
+
+\newconditional\preferpagereferences
\def\gotosomeinternal#1#2#3#4%
- {\ifinternalnamedreferences
- \directgoto{#4}[#1:#2]%
- \else
+ {\ifconditional\preferpagereferences
\directgoto{#4}[page(#3)]%
+ \else
+ \directgoto{#4}[#1:#2]%
\fi}
\def\gotonextinternal#1#2%
@@ -587,41 +640,60 @@
%D document). By setting the \type{interaction} variable, one
%D can influences the way interactive references are set.
-\chardef\autocrossfilereferences=0
+\newconstant\autocrossfilereferences % not yet supported in mkiv
+\newconstant\referencefilecaseswap % not yet supported in mkiv
+
+\newtoks \everysetupreferencing
\unexpanded\def\setupreferencing
{\dosingleargument\dosetupreferencing}
\def\dosetupreferencing[#1]%
- {\getparameters
- [\??rf]
- [\c!prefix=\s!unknown,#1]%
+ {\getparameters[\??rf][\c!prefix=\s!unknown,#1]%
+ \the\everysetupreferencing}
+
+\appendtoks
\processaction
[\@@rfstate]
[ \v!stop=>\referencingfalse,
\v!start=>\referencingtrue]%
+\to \everysetupreferencing
+
+% \newconstant \referencecontentmode
+%
+% \appendtoks
+% \processaction
+% [\@@rfinteraction]
+% [ \v!all=>\referencecontentmode\zerocount,
+% \v!label=>\referencecontentmode\plusone,
+% \v!text=>\referencecontentmode\plustwo,
+% \v!symbol=>\referencecontentmode\plusthree]%
+% \to \everysetupreferencing
+
+\appendtoks
+ \autocrossfilereferences\zerocount
\processaction
- [\@@rfinteraction]
- [ \v!all=>\let\dowantedreference\docompletereference,
- \v!label=>\let\dowantedreference\dolabelonlyreference,
- \v!text=>\let\dowantedreference\dotextonlyreference,
- \v!symbol=>\let\dowantedreference\dosymbolreference]%
- \chardef\autocrossfilereferences\zerocount
- \processaction
- [\@@rfautofile]
- [ \v!yes=>\chardef\autocrossfilereferences\plusone,
- \v!page=>\chardef\autocrossfilereferences\plustwo]%
- \chardef\referencefilecase\zerocount
- \processaction[\@@rfconvertfile]
- [ \v!yes=>\chardef\referencefilecase\plusone,
- \v!big=>\chardef\referencefilecase\plusone,
- \v!small=>\chardef\referencefilecase\plustwo]%
+ [\@@rfautofile] % not yet in mkiv
+ [ \v!yes=>\autocrossfilereferences\plusone,
+ \v!page=>\autocrossfilereferences\plustwo]%
+\to \everysetupreferencing
+
+\appendtoks
+ \referencefilecaseswap\zerocount
+ \processaction[\@@rfconvertfile] % not yet in mkiv
+ [ \v!yes=>\referencefilecaseswap\plusone,
+ \v!big=>\referencefilecaseswap\plusone,
+ \v!small=>\referencefilecaseswap\plustwo]%
+\to \everysetupreferencing
+
+\appendtoks
\setupreferenceprefix[\@@rfprefix]%
\doifelse\@@rfglobal\v!yes
- {\settrue \autoglobalfilereferences}
- {\setfalse\autoglobalfilereferences}}
+ {\settrue \autoglobalfilereferences}%
+ {\setfalse\autoglobalfilereferences}%
+\to \everysetupreferencing
-% \appendtoks\ctxlua{jobreferences.export("whatever")}\to\everystoptext
+% \appendtoks\ctxlua{structures.references.export("whatever")}\to\everystoptext
% \starttext
% \chapter[test]{test}
% test \in{IN}[more] and \in{IN}[test] or \at{AT}[more] and \at{AT}[test]\par
@@ -630,7 +702,7 @@
% \stoptext
\def\exportreferences
- {\doif\@@rfexport\v!yes{\ctxlua{jobreferences.export()}}}
+ {\doif\@@rfexport\v!yes{\ctxlua{structures.references.export()}}}
\appendtoks
\exportreferences
@@ -700,7 +772,7 @@
{\ifsecondargument
\doifreferencefoundelse{#2}
{\executeifdefined{reftype#1}\reftypep}
- {\unknownreference{#2}\dummyreference}%
+ {\dummyreference}%
\else
\dummyreference
\fi}
@@ -761,14 +833,14 @@
% \definecommand from {\dospecialfrom}
% \definecommand over {\dospecialabout} % needed here, else math problems
-\def\currentreferencenumber {\ctxlua{jobreferences.filter("number")}}
-\def\currentreferencepage {\ctxlua{jobreferences.filter("page")}}
-\def\currentreferencetitle {\ctxlua{jobreferences.filter("title")}}
-\def\currentreferencetext {\ctxlua{jobreferences.filter("text")}}
-\def\currentreferencedefault {\ctxlua{jobreferences.filter("default")}}
-\def\currentreferencerealpage{\ctxlua{jobreferences.realpage()}}
+\def\currentreferencenumber {\ctxlua{structures.references.filter("number")}}
+\def\currentreferencepage {\ctxlua{structures.references.filter("page")}}
+\def\currentreferencetitle {\ctxlua{structures.references.filter("title")}}
+\def\currentreferencetext {\ctxlua{structures.references.filter("text")}}
+\def\currentreferencedefault {\ctxlua{structures.references.filter("default")}}
+\def\currentreferencerealpage{\ctxlua{structures.references.realpage()}}
-\def\getreferenceentry#1{\ctxlua{jobreferences.filter("#1")}} % user entry
+\def\getreferenceentry#1{\ctxlua{structures.references.filter("#1")}} % user entry
\unexpanded\def\dospecialabout[#1]%
{\dontleavehmode
@@ -799,12 +871,12 @@
% Yet untested:
\unexpanded\def\somewhere#1#2#3[#4]% #3 gobbles space around #2 % todo
- {\doifreferencefoundelse{#4}% kind of inefficient as \goto also analyses
+ {\doifreferencefoundelse{#4}% kind of inefficient as \goto also analyzes
{\goto{\analyzecurrentreference\ifcase\referencepagestate\relax#1/#2\or#2\or#1\or#2\fi}[#4]}
{[#1/#2]}}
\unexpanded\def\atpage[#1]% todo
- {\doifreferencefoundelse{#1}% kind of inefficient as \goto also analyses
+ {\doifreferencefoundelse{#1}% kind of inefficient as \goto also analyzes
{\goto{\analyzecurrentreference\ifcase\referencepagestate
\labeltexts\v!page\dummyreference
\or
@@ -822,7 +894,7 @@
\unexpanded\def\referencesymbol
{\hbox{\strut\high
- {\setupsymbolset[\@@iasymbolset]%
+ {\setupsymbolset[\interactionparameter\c!symbolset]%
\symbol
[\ifcase\referencepagestate
\v!somewhere
@@ -834,49 +906,99 @@
\v!next%
\fi]}}}
-% \def\dosymbolreference#1#2[#3]%
-% {\removeunwantedspaces
-% \goto{\setupsymbolset[\@@iasymbolset]\high{\symbol
-% [\ifcase\referencepagestate
-% \v!somewhere
-% \or % same
-% \v!nowhere
-% \or % before
-% \v!previous
-% \or % after
-% \v!next%
-% \fi]}}[#3]}
+%D The other alternatives just conform their names: only the
+%D label, only the text, or the label and the text.
-\def\dosymbolreference#1#2[#3]%
- {\removeunwantedspaces
- \goto{\referencesymbol}[#3]}
+% \dounknownreference -> \dummyreference
-\def\symbolreference[#1]%
- {\removeunwantedspaces
- \goto{\referencesymbol}[#1]}
+\def\symbolreference[#1]% for old times sake
+ {\goto{\referencesymbol}[#1]}
+% \referencecontentmode 0=all 1=label 2=text 3=symbol
-%D The other alternatives just conform their names: only the
-%D label, only the text, or the label and the text.
+\newtoks\leftreferencetoks
+\newtoks\rightreferencetoks
+\newtoks\defaultleftreferencetoks
+\newtoks\defaultrightreferencetoks
+
+\def\leftofreferencecontent {\nobreakspace} % we cannot do \definereferenceformat[at] .. so we need this
+\let\rightofreferencecontent \empty
+\let\leftofreference \empty
+\let\rightofreference \empty
+
+\setvalue{\??rf\c!interaction\v!all}%
+ {\leftofreference
+ \the\leftreferencetoks
+ \doifsometokselse\leftreferencetoks \leftofreferencecontent \donothing
+ \currentreferencecontent
+ \doifsometokselse\rightreferencetoks\rightofreferencecontent\donothing
+ \the\rightreferencetoks
+ \rightofreference}
+
+\setvalue{\??rf\c!interaction\v!label}%
+ {\leftofreference
+ \the\leftreferencetoks
+ \the\rightreferencetoks
+ \rightofreference}
+
+\setvalue{\??rf\c!interaction\v!text}%
+ {\leftofreference
+ \currentreferencecontent
+ \rightofreference}
+
+\setvalue{\??rf\c!interaction\v!symbol}%
+ {\referencesymbol}
+
+\def\referencesequence
+ {\csname \??rf\c!interaction
+ \ifcsname\??rf\c!interaction\@@rfinteraction\endcsname
+ \@@rfinteraction
+ \else
+ \v!all
+ \fi
+ \endcsname}
-\def\dounknownreference#1#2[#3]%
- {\unknownreference{#3}\dotextprefix{#2}\dummyreference}%
+\newtoks\everyresetinatreference
-\def\docompletereference#1#2[#3]%
- {\goto{\dotextprefix{#2}#1}[#3]}
+\appendtoks
+ \glet\leftofreference \relax
+ \glet\rightofreference\relax
+\to \everyresetinatreference
+
+\def\dostartgotoreference
+ {\dontleavehmode
+ \begingroup}
-% \def\dolabelonlyreference#1#2[#3]%
-% {\doifsomespaceelse{#2}% space?
-% {\doifsomething{#2}{\goto{#2}[#3]}}
-% {\goto{\dotextprefix{#2}}[#3]}}
+\def\dostopgotoreference
+ {\the\everyresetinatreference
+ \endgroup}
-\def\dolabelonlyreference#1#2[#3]%
- {\goto{\dotextprefix{#2}}[#3]}
+\def\dopickupgotoreference
+ {\dodoublegroupempty\dodopickupgotoreference}
-\def\dotextonlyreference#1#2[#3]%
- {\dotextprefix{#2}\goto{#1}[#3]}
+\def\dodopickupgotoreference#1#2#3[#4]% #3 gobbles spaces (really needed)
+ {\leftreferencetoks
+ \iffirstargument
+ {#1}%
+ \else
+ \defaultleftreferencetoks
+ \let\leftofreferencecontent\empty
+ \fi
+ \rightreferencetoks
+ \ifsecondargument
+ {#2}%
+ \else
+ \defaultrightreferencetoks
+ \let\rightofreferencecontent\empty
+ \fi
+ \doifreferencefoundelse{#4} % we need to resolve the text
+ {\goto{\referencesequence}[#4]}
+ {\let\currentreferencecontent\dummyreference
+ \goto{\referencesequence}[#4]}%
+ \dostopgotoreference}
-\let\dowantedreference\docompletereference
+\unexpanded\def\dospecialin{\dostartgotoreference\let\currentreferencecontent\currentreferencedefault\dopickupgotoreference}
+\unexpanded\def\dospecialat{\dostartgotoreference\let\currentreferencecontent\currentreferencepage \dopickupgotoreference}
%D \macros
%D {definereferenceformat}
@@ -885,8 +1007,6 @@
%D Hoekwater. They can be used for predefining reference
%D texts, and thereby stimulate efficiency.
%D
-%D [more documentation will be added]
-%D
%D \starttyping
%D \definereferenceformat[informula] [left=(,right=),text=formula]
%D \definereferenceformat[informulas] [left=(,right=),text=formulas]
@@ -902,61 +1022,83 @@
%D
%D Instead of a text, one can specify a label, which should
%D be defined with \type {\setuplabeltext}.
+%D
+%D
+%D Watch out: the second argument is somewhat special and mostly
+%D meant for a suffix to a number:
+%D
+%D \startbuffer
+%D \definereferenceformat [intesta] [left=(,right=),text=Whatever~]
+%D \definereferenceformat [intestb] [left=(,right=),label=figure]
+%D
+%D \placeformula[x]\startformula a \stopformula
+%D
+%D \starttabulate[|||||]
+%D \NC \in [x] \NC \in {left}[x] \NC \in {}{right}[x] \NC \in {left}{right}[x] \NC \NR
+%D \NC \intesta[x] \NC \intesta{left}[x] \NC \intesta{}{right}[x] \NC \intesta{left}{right}[x] \NC \NR
+%D \NC \intestb[x] \NC \intestb{left}[x] \NC \intestb{}{right}[x] \NC \intestb{left}{right}[x] \NC \NR
+%D \stoptabulate
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+% todo: inherit
-% todo: inherit; probably not yet mkiv okay
+\let\currentreferenceformat\empty
+
+\def\referenceformatparameter#1% some day we will add inheritance
+ {\ifcsname\??rf\currentreferenceformat#1\endcsname\csname\??rf\currentreferenceformat#1\expandafter\endcsname\fi}
\unexpanded\def\definereferenceformat
{\dodoubleargument\dodefinereferenceformat}
+% left right text label
+
\def\dodefinereferenceformat[#1][#2]%
{\iffirstargument
- \getparameters[\??rf#1]
- [\c!left=, % of the number
- \c!right=, % of the number
- \c!text=, % before the number
- \c!label=, % can be {left}{right}
- \c!command=\in,
- #2]%
- \setuvalue{#1}%
- {\dontleavehmode\doexecutereferenceformat{#1}}%
+ \getparameters[\??rf#1][\c!left=,\c!right=,\c!text=,\c!label=,\c!autocase=v!no,#2]%
+ \setuvalue{#1}{\doexecutereferenceformat{#1}}%
\fi}
-\def\noexecutelabelreferenceformat#1%
- {\doifvaluesomething{\??rf#1\c!text}{\gdef\textofreference{\csname\??rf#1\c!text\endcsname}}%
- \csname\??rf#1\c!command\endcsname}
-
-\def\doexecutelabelreferenceformat#1%
- {\csname\??rf#1\c!command\endcsname
- {\leftlabeltext {\csname\??rf#1\c!label\endcsname}}%
- {\rightlabeltext{\csname\??rf#1\c!label\endcsname}}}
-
-\def\doexecutereferenceformat#1%
- {\gdef\leftofreference {\csname\??rf#1\c!left \endcsname}%
- \gdef\rightofreference{\csname\??rf#1\c!right\endcsname}%
- \global\let\textofreference\empty % otherwise ~ added
- \doifelsevaluenothing{\??rf#1\c!label}\noexecutelabelreferenceformat\doexecutelabelreferenceformat{#1}}
+\def\doexecutereferenceformat#1% quite slow due to all assignments but we will speed it up
+ {\dostartgotoreference % once it's stable
+ \edef\currentreferenceformat{#1}%
+ \gdef\leftofreference {\referenceformatparameter\c!left }%
+ \gdef\rightofreference{\referenceformatparameter\c!right}%
+ % we can make a helper for this .. we will use the new parameter handler anyway
+ % but at least aditya can play with it now
+ \doifsomething{\referenceformatparameter\c!style}
+ {\dosetfontattribute{\??rf\currentreferenceformat}\c!style
+ \resetinteractionparameter\c!style}%
+ \doifsomething{\referenceformatparameter\c!color}
+ {\dosetcolorattribute{\??rf\currentreferenceformat}\c!color
+ \resetinteractionparameter\c!contrastcolor
+ \resetinteractionparameter\c!color}%
+ %
+ \edef\currentreferenceformatlabel{\referenceformatparameter\c!label}%
+ \ifx\currentreferenceformatlabel\autoreferencelabeltextflag
+ \edef\currentreferenceformatlabel{\autoreferencelabeltext}%
+ \fi
+ \doif{\referenceformatparameter\c!autocase}\v!yes
+ {\setcharactercleaning[1]}%
+ \ifx\currentreferenceformatlabel\empty
+ \defaultleftreferencetoks {\referenceformatparameter\c!text}%
+ \defaultrightreferencetoks\emptytoks
+ \else
+ \defaultleftreferencetoks {\leftlabeltext \currentreferenceformatlabel}%
+ \defaultrightreferencetoks{\rightlabeltext\currentreferenceformatlabel}%
+ \fi
+ \doifelse{\referenceformatparameter\c!type}\v!page
+ {\let\currentreferencecontent\currentreferencepage}
+ {\let\currentreferencecontent\currentreferencedefault}%
+ \let\leftofreferencecontent \empty
+ \let\rightofreferencecontent\empty
+ \dopickupgotoreference}
-\let\leftofreference \relax
-\let\rightofreference\relax
-\let\textofreference \relax
+\def\autoreferencelabeltextflag{*} % a proper key like 'auto' or 'name' can clash with a label key
-% fails on metafun {\leftofreference#1\ignorespaces#3\removeunwantedspaces\rightofreference}{#2}[#4]%
-%
-% \def\dodododoinatreference#1#2#3[#4]% no \removeunwantedspaces (fails on metafun)
-% {\ifx\next\bgroup
-% \dododododoinatreference{\leftofreference#1\ignorespaces#3\rightofreference}{#2}[#4]%
-% \else
-% \dododododoinatreference{\leftofreference#1\rightofreference}{#2#3}[#4]%
-% \fi}
-%
-% \def\dododododoinatreference#1#2[#3]%
-% {\dontleavehmode % replaces \leaveoutervmode
-% \begingroup
-% \postponenotes
-% \doifreferencefoundelse{#3}
-% {\doifelsenothing{#1}\dosymbolreference\dowantedreference{#1}{#2}[#3]}%
-% {\dounknownreference{#1}{#2}[#3]}%
-% \endgroup}
+\unexpanded\def\autoreferencelabeltext
+ {\ctxlua{structures.references.getcurrentmetadata("name")}}
% \starttext
% \definereferenceformat[inxx] [left=(,right=),text=txt]
@@ -970,62 +1112,6 @@
% [\inxx{a}{b}[one]]
% \stoptext
-\unexpanded\def\dospecialin{\let\currentreferencecontent\currentreferencedefault\doinatreference}
-\unexpanded\def\dospecialat{\let\currentreferencecontent\currentreferencepage \doinatreference}
-
-\newtoks\leftreferencetoks
-\newtoks\rightreferencetoks
-
-\def\doinatreference
- {\futurelet\next\doinatreferenceone}
-
-\def\doinatreferenceone
- {\ifx\next\bgroup
- \afterassignment\doinatreferenceonetwo
- \expandafter\leftreferencetoks
- \else
- \leftreferencetoks\emptytoks
- \expandafter\dodoinatreferencenone
- \fi}
-
-\def\doinatreferenceonetwo
- {\futurelet\next\doinatreferencetwo}
-
-\def\doinatreferencetwo
- {\ifx\next\bgroup
- \afterassignment\dodoinatreferenceboth
- \expandafter\rightreferencetoks
- \else
- \rightreferencetoks\emptytoks
- \expandafter\dodoinatreferenceleft
- \fi}
-
-\def\dodoinatreferencenone
- {\dodoinatreferenceindeed
- {\leftofreference\currentreferencecontent\rightofreference}
- {}}
-
-\def\dodoinatreferenceleft
- {\dodoinatreferenceindeed
- {\leftofreference\currentreferencecontent\rightofreference}
- {\the\leftreferencetoks}}
-
-\def\dodoinatreferenceboth
- {\dodoinatreferenceindeed
- {\leftofreference\currentreferencecontent\the\rightreferencetoks\rightofreference}
- {\the\leftreferencetoks}}
-
-\def\dodoinatreferenceindeed#1#2#3[#4]% #3 gobbles space
- {\dontleavehmode % replaces \leaveoutervmode
- \begingroup
- \postponenotes
- \doifreferencefoundelse{#4}
- {\doifelsenothing{#1}\dosymbolreference\dowantedreference{#1}{#2}[#4]}%
- {\dounknownreference{#1}{#2}[#4]}%
- \endgroup}
-
-\let\dosymbolreference\dowantedreference
-
%D In interactive documents going to a specific location is not
%D bound to cross references. The \type{\goto} commands can be
%D used to let users access another part of the document. In
@@ -1058,74 +1144,107 @@
% The unbox trick is needed in order to permit \par inside a reference. Otherwise
% the reference attribute migrates to the outer boxes.
+\newcount\lastsavedreferenceattribute
+
\newbox\referencebox
+\def\revivesavedreferenceattribute % sometimes handy as no test etc needed
+ {\attribute\referenceattribute\lastsavedreferenceattribute}
+
\def\dodirectgoto#1[#2]% no test for valid references
{\dontleavehmode
\begingroup
\attribute\referenceattribute\attributeunsetvalue
+ \global\lastsavedreferenceattribute\attributeunsetvalue
\iflocation
- \ctxlua{jobreferences.inject("\referenceprefix","#2",\number\ht\strutbox,\number\dp\strutbox,\extrareferencearguments)}%
+ \ctxlua{structures.references.inject("\referenceprefix","#2",\number\ht\strutbox,\number\dp\strutbox,\extrareferencearguments)}%
\setlocationattributes\??ia
\setstrut % can be option
+ \global\lastsavedreferenceattribute\lastreferenceattribute
\attribute\referenceattribute\lastreferenceattribute
+ \dostarttagged\t!link\empty % not here
+ #1%
+ \dostoptagged
+ \else
+ #1%
\fi
- #1%
\endgroup}
\def\dodirectgotohtdp#1[#2]% no test for valid references
{\dontleavehmode
\begingroup
+ \global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxlua{jobreferences.inject("\referenceprefix","#2",\number\dimexpr\@@iaheight\relax,\number\dimexpr\@@iadepth\relax,\extrareferencearguments)}%
+ \ctxlua{structures.references.inject("\referenceprefix","#2",\number\dimexpr\interactionparameter\c!height\relax,\number\dimexpr\interactionparameter\c!depth\relax,\extrareferencearguments)}%
\setlocationattributes\??ia
\attribute\referenceattribute\lastreferenceattribute
+ \global\lastsavedreferenceattribute\lastreferenceattribute
+ \dostarttagged\t!link\empty
+ #1%
+ \dostoptagged
+ \else
+ #1%
\fi
- #1%
\endgroup}
\def\dogoto#1#2[#3]% #2 gobbles spaces after #1 so that \goto{xx} [yy] works ok
{\dontleavehmode
\begingroup
%\setbox\referencebox\hbox\bgroup % experiment, might change again to non \par support
+ \global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxlua{jobreferences.doifelse("\referenceprefix","#3",\extrareferencearguments)}%
+ \ctxlua{structures.references.doifelse("\referenceprefix","#3",\extrareferencearguments)}%
{\expandtexincurrentreference
- \ctxlua{jobreferences.injectcurrentset(\number\ht\strutbox,\number\dp\strutbox)}%
+ \ctxlua{structures.references.injectcurrentset(\number\ht\strutbox,\number\dp\strutbox)}%
\setlocationattributes\??ia
\setstrut % can be option
- \attribute\referenceattribute\lastreferenceattribute}%
- {\unknownreference{#3}}%
+ \global\lastsavedreferenceattribute\lastreferenceattribute
+ \attribute\referenceattribute\lastreferenceattribute
+ \dostarttagged\t!link\empty
+ #1%
+ \dostoptagged}%
+ {#1}%
+ \else
+ #1%
\fi
- #1%
%\egroup\unhbox\referencebox}
\endgroup}
\def\dogotohtdp#1#2[#3]% #2 gobbles spaces after #1 so that \goto{xx} [yy] works ok
{\dontleavehmode
\begingroup
+ \global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxlua{jobreferences.doifelse("\referenceprefix","#3",\extrareferencearguments)}%
+ \ctxlua{structures.references.doifelse("\referenceprefix","#3",\extrareferencearguments)}%
{\expandtexincurrentreference
- \ctxlua{jobreferences.injectcurrentset(\number\dimexpr\@@iaheight\relax,\number\dimexpr\@@iadepth\relax)}%
+ \ctxlua{structures.references.injectcurrentset(\number\dimexpr\interactionparameter\c!height\relax,\number\dimexpr\interactionparameter\c!depth\relax)}%
\setlocationattributes\??ia
- \attribute\referenceattribute\lastreferenceattribute}%
- {\unknownreference{#3}}%
+ \global\lastsavedreferenceattribute\lastreferenceattribute
+ \attribute\referenceattribute\lastreferenceattribute
+ \dostarttagged\t!link\empty
+ #1%
+ \dostoptagged}%
+ {#1}%
+ \else
+ #1%
\fi
- #1%
\endgroup}
\unexpanded\def\directgotobox#1[#2]% no test for valid references
{\dontleavehmode
\begingroup
+ \global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxlua{jobreferences.inject("\referenceprefix","#2",nil,nil,\extrareferencearguments)}%
+ \ctxlua{structures.references.inject("\referenceprefix","#2",nil,nil,\extrareferencearguments)}%
\setlocationattributes\??ia
+ \global\lastsavedreferenceattribute\lastreferenceattribute
+ \dostarttagged\t!link\empty
\hbox attr \referenceattribute \lastreferenceattribute {#1}%
+ \dostoptagged
\else
#1%
\fi
@@ -1134,11 +1253,15 @@
\unexpanded\def\directgotospecbox#1#2[#3]% no test for valid references
{\dontleavehmode
\begingroup
+ \global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxlua{jobreferences.inject("\referenceprefix","#3",nil,nil,\extrareferencearguments)}%
+ \ctxlua{structures.references.inject("\referenceprefix","#3",nil,nil,\extrareferencearguments)}%
\setlocationcolorspec{#1}% no consequence for strut
+ \global\lastsavedreferenceattribute\lastreferenceattribute
+ \dostarttagged\t!link\empty
\hbox attr \referenceattribute \lastreferenceattribute {#2}%
+ \dostoptagged
\else
#2%
\fi
@@ -1147,10 +1270,14 @@
\unexpanded\def\directgotodumbbox#1[#2]% no test for valid references
{\dontleavehmode
\begingroup
+ \global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxlua{jobreferences.inject("\referenceprefix","#2",nil,nil,\extrareferencearguments)}%
+ \ctxlua{structures.references.inject("\referenceprefix","#2",nil,nil,\extrareferencearguments)}%
+ \global\lastsavedreferenceattribute\lastreferenceattribute
+ \dostarttagged\t!link\empty
\hbox attr \referenceattribute \lastreferenceattribute {#1}%
+ \dostoptagged
\else
#1%
\fi
@@ -1159,19 +1286,36 @@
\unexpanded\def\gotobox#1[#2]% no test for valid references
{\dontleavehmode
\begingroup
+ \global\lastsavedreferenceattribute\attributeunsetvalue
\attribute\referenceattribute\attributeunsetvalue
\iflocation
- \ctxlua{jobreferences.doifelse("\referenceprefix","#2",\extrareferencearguments)}%
+ \ctxlua{structures.references.doifelse("\referenceprefix","#2",\extrareferencearguments)}%
{\expandtexincurrentreference
- \ctxlua{jobreferences.injectcurrentset(nil,nil)}%
+ \ctxlua{structures.references.injectcurrentset(nil,nil)}%
\setlocationattributes\??ia
- \hbox attr \referenceattribute \lastreferenceattribute {#1}}%
- {\unknownreference{#2}}%
+ \global\lastsavedreferenceattribute\lastreferenceattribute
+ \dostarttagged\t!link\empty
+ \hbox attr \referenceattribute \lastreferenceattribute {#1}%
+ \dostoptagged}%
+ {#1}%
\else
#1%
\fi
\endgroup}
-
+
+\unexpanded\def\gotowdhtbox#1#2[#3]% fast variant for overlays
+ {\dontleavehmode
+ \begingroup
+ \setbox\scratchbox\emptyhbox\wd\scratchbox#1\ht\scratchbox#2%
+ \global\lastsavedreferenceattribute\attributeunsetvalue
+ \attribute\referenceattribute\attributeunsetvalue
+ \ctxlua{structures.references.doifelse("\referenceprefix","#3",\extrareferencearguments)}%
+ {\ctxlua{structures.references.injectcurrentset(nil,nil)}%
+ \global\lastsavedreferenceattribute\lastreferenceattribute
+ \hbox attr \referenceattribute \lastreferenceattribute {\box\scratchbox}}
+ {\box\scratchbox}%
+ \endgroup}
+
%D An reference to another document can be specified as a file
%D or as an \URL. Both are handled by the same mechanism and
%D can be issued by saying something like:
@@ -1228,13 +1372,13 @@
\let\useexternaldocument\usefile
\def\douseurl[#1][#2][#3][#4]%
- {\ctxlua{jobreferences.urls.define("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es,\!!bs\detokenize{#4}\!!es)}}
+ {\ctxlua{structures.references.urls.define("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es,\!!bs\detokenize{#4}\!!es)}}
\def\dousefile[#1][#2][#3]%
- {\ctxlua{jobreferences.files.define("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}}
+ {\ctxlua{structures.references.files.define("#1",\!!bs\detokenize{#2}\!!es,\!!bs\detokenize{#3}\!!es)}}
-\def\doifurldefinedelse #1{\ctxlua{commands.doifurldefinedelse ("#1")}}
-\def\doiffiledefinedelse#1{\ctxlua{commands.doiffiledefinedelse("#1")}}
+\def\doifurldefinedelse #1{\ctxcommand{doifurldefinedelse ("#1")}}
+\def\doiffiledefinedelse#1{\ctxcommand{doiffiledefinedelse("#1")}}
%D \macros
%D {url,setupurl}
@@ -1261,7 +1405,7 @@
\begingroup
\dosetfontattribute\??ur\c!style
\dosetcolorattribute\??ur\c!color
- \hyphenatedurl{\ctxlua{jobreferences.urls.get("#1","\@@uralternative","\@@urspace")}}%
+ \hyphenatedurl{\ctxlua{structures.references.urls.get("#1","\@@uralternative","\@@urspace")}}%
\endgroup}
% # fails
@@ -1311,7 +1455,7 @@
\def\dodospecialfrom[#1]%
{\dontleavehmode
- \goto{\ctxlua{jobreferences.from("#1")}}[fileorurl(#1)]}
+ \goto{\ctxlua{structures.references.from("#1")}}[fileorurl(#1)]}
\def\dofromurldescription#1%
{#1}
@@ -1356,14 +1500,14 @@
{\dotripleargument\dodefineprogram}
\def\dodefineprogram[#1][#2][#3]%
- {\ctxlua{jobreferences.programs.define("#1","#2","#3")}}
+ {\ctxlua{structures.references.programs.define("#1","#2","#3")}}
\def\program[#1]% incompatible, more consistent, hardy used anyway
{\dontleavehmode
\begingroup
\dosetfontattribute\??pr\c!style
\dosetcolorattribute\??pr\c!color
- \ctxlua{jobreferences.programs.get("#1","\@@pralternative","\@@prspace")}%
+ \ctxlua{structures.references.programs.get("#1","\@@pralternative","\@@prspace")}%
\endgroup}
%D As we can see, we directly use the special reference
@@ -1449,8 +1593,6 @@
%D key \type{file}, which is interpreted as the file to jump
%D to, that is, when one clicks on the title.
-\newif\ifautocrossdocument
-
\def\coupledocument
{\doquadrupleempty\docoupledocument}
@@ -1459,185 +1601,6 @@
% this will be done differently (when it's needed)
\fi}
-%D Buttons are just what their names says: things that can be
-%D clicked (pushed) on. They are similar to \type{\goto},
-%D except that the text argument is not interpreted.
-%D Furthermore one can apply anything to them that can be done
-%D with \type{\framed}.
-%D
-%D \startbuffer
-%D \button[width=3cm,height=1.5cm]{Exit}[ExitViewer]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D gives
-%D
-%D \getbuffer
-%D
-%D This command is formally specified as:
-%D
-%D \showsetup{button}
-%D
-%D The characteristics can be set with:
-%D
-%D \showsetup{setupbuttons}
-
-\unexpanded\def\setupbuttons
- {\dodoubleargument\getparameters[\??bt]}
-
-\definecomplexorsimpleempty\button
-
-\def\complexbutton
- {\docomplexbutton\??bt}
-
-\presetlocalframed[\??bt]
-
-\long\def\docomplexbutton#1[#2]#3#4% get rid of possible space before [#4]
- {\dodocomplexbutton#1[#2]{#3}#4} % #4 == [
-
-\def\buttonframed{\dodoubleempty\localframed[\??bt]} % goodie
-
-\long\def\dodocomplexbutton#1[#2]#3[#4]% #3 can contain [] -> {#3} later
- {\begingroup
- \doifvalue{#1\c!state}\v!stop\locationfalse
- \iflocation
- \ConvertConstantAfter\doifelse{#3}\v!none\hphantom\hbox
- {\doifelsenothing{#4}
- {\setlocationboxnop#1[#2]{#3}[#4]}
- {\doifreferencefoundelse{#4} % INEFFICIENT
- {\setlocationboxyes#1[#2]{#3}[#4]}
- {\unknownreference{#4}%
- \setlocationboxnop#1[#2]{#3}[#4]}}}%
- \fi
- \endgroup}
-
-\setupbuttons
- [\c!state=\v!start]
-
-%D Interaction buttons, in fact a row of tiny buttons, are
-%D typically only used for navigational purposed. The next
-%D macro builds such a row based on a specification list.
-%D
-%D \startbuffer
-%D \interactionbuttons
-%D [width=\hsize][page,PreviousJump,ExitViewer]
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D gives
-%D
-%D \getbuffer
-%D
-%D Apart from individual entries, one can use \type{page} and
-%D \type {subpage} as shortcuts to their four associated buttons.
-%D The symbols are derived from the symbols linked to the
-%D entries.
-
-% does not work well with for instance SomeRef{whatever}
-
-\def\interactionbuttons
- {\dodoubleempty\dointeractionbuttons}
-
-\def\dointeractionbuttons[#1][#2]% er is een verdeel macro \horizontalfractions
- {\iflocation
- % BUG: fails when frame=off; best is to rewrite this macro
- \bgroup
- \doif\@@ibstate\v!stop\locationfalse
- \iflocation
- \ifsecondargument
- \setupinteractionbar[#1]%
- \checkinteractionbar{1.5em}\v!broad\!!zeropoint % brrrrr
- \setbox2\hbox{\localframed[\??ib][\c!background=]{\symbol[\@@iasymbolset][\v!previouspage]}}%
- \!!heighta\ht2 % needed because we default to nothing
- \setupinteractionbar[\c!strut=\v!no]%
- \setinteractionparameter\c!width\!!zeropoint
- \!!counta\zerocount % new, was 1
- \processallactionsinset
- [#2]
- [ \v!page=>\advance\!!counta 4,
- \v!subpage=>\advance\!!counta 4,
- \s!unknown=>\advance\!!counta 1]%
- \ifdim\@@ibwidth=\zeropoint
- \!!widtha2em
- \advance\!!widtha \@@ibdistance % new
- \!!widthb\!!counta\!!widtha
- \advance\!!widthb -\@@ibdistance % new
- \else
- \!!widtha\@@ibwidth
- \!!widthb\@@ibdistance % new
- \multiply\!!widthb \!!counta % new
- \advance\!!widthb -\@@ibdistance % new
- \advance\!!widtha -\!!widthb % new
- \divide\!!widtha \!!counta
- \!!widthb\@@ibwidth
- \fi
- \def\xgoto##1% clash ?
- {\setnostrut
- \edef\localreference{##1}%
- \normalexpanded{\noexpand\dodocomplexbutton\??ib[\c!height=\the\!!heighta,\c!width=\the\!!widtha]}%
- {\dontleavehmode\symbol[\@@iasymbolset][\localreference]}%
- [\localreference]%
- \hss}%
- \hbox to \!!widthb
- {\processallactionsinset
- [#2]
- [ \v!page=>\xgoto\v!firstpage
- \xgoto\v!nextpage
- \xgoto\v!previouspage
- \xgoto\v!lastpage,
- \v!subpage=>\xgoto\v!firstsubpage
- \xgoto\v!nextsubpage
- \xgoto\v!previoussubpage
- \xgoto\v!lastsubpage,
- \s!unknown=>\xgoto\commalistelement]%
- \unskip}%
- \else
- \interactionbuttons[][#1]%
- \fi
- \fi
- \egroup
- \fi}
-
-%D \macros
-%D {overlaybutton}
-%D
-%D For converience we provide:
-%D
-%D \starttyping
-%D \overlaybutton[reference]
-%D \stoptyping
-%D
-%D This command can be used to define overlays an/or can be
-%D used in the whatevertext areas, like:
-%D
-%D \starttyping
-%D \defineoverlay[PrevPage][\overlaybutton{PrevPage}]
-%D \setupbackgrounds[page][background=PrevPage]
-%D \setuptexttexts[\overlaybutton{NextPage}]
-%D \stoptyping
-%D
-%D For practical reasons, this macro accepts square brackets
-%D as well as braces.
-
-\definecomplexorsimple\overlaybutton
-
-\def\simpleoverlaybutton#1%
- {\complexoverlaybutton[#1]}
-
-\def\complexoverlaybutton[#1]%
- {\iflocation
- \gotobox{\overlayfakebox}[#1]%
- \fi}
-
-\def\overlayfakebox
- {\hbox
- {\setbox\scratchbox\null
- \wd\scratchbox\overlaywidth
- \ht\scratchbox\overlayheight
- \box\scratchbox}}
-
%D \macros
%D {dotextprefix}
%D
@@ -1730,7 +1693,6 @@
\definereference [\v!HideField ] [action(hide)]
\definereference [\v!ShowField ] [action(show)]
\definereference [\v!GotoPage ] [action(gotopage)]
-\definereference [\v!GotoPage ] [action(gotopage)]
\definereference [\v!Query ] [action(query)]
\definereference [\v!QueryAgain ] [action(queryagain)]
\definereference [\v!FitWidth ] [action(fitwidth)]
@@ -1738,6 +1700,10 @@
\definereference [\v!ShowThumbs ] [action(thumbnails)]
\definereference [\v!ShowBookmarks ] [action(bookmarks)]
+\definereference [\v!HideLayer ] [action(hidelayer)]
+\definereference [\v!VideLayer ] [action(videlayer)]
+\definereference [\v!ToggleLayer ] [action(togglelayer)]
+
\definereference [\v!firstpage] [page(firstpage)]
\definereference [\v!previouspage] [page(previouspage)]
\definereference [\v!nextpage] [page(nextpage)]
@@ -1817,16 +1783,16 @@
% \def\getreferencestructureprefixspec#1% we can save one call by moving this to the lua end
% {\getreferencestructureprefix
-% {\ctxlua{jobreferences.get_current_metadata("kind")}}
-% {\ctxlua{jobreferences.get_current_metadata("name")}}
+% {\ctxlua{structures.references.getcurrentmetadata("kind")}}
+% {\ctxlua{structures.references.getcurrentmetadata("name")}}
% {#1}}
% \def\currentreferencedefault
-% {\ctxlua{jobreferences.filter("default",\getreferencestructureprefixspec\v!default)}}
+% {\ctxlua{structures.references.filter("default",\getreferencestructureprefixspec\v!default)}}
%
% this is shortcut for:
\def\currentreferencedefault
- {\ctxlua{jobreferences.filter("default",\ctxlua{jobreferences.get_current_prefixspec("\v!default")})}}
+ {\ctxlua{structures.references.filter("default",\ctxlua{structures.references.getcurrentprefixspec("\v!default")})}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/strc-reg.lua b/Master/texmf-dist/tex/context/base/strc-reg.lua
index c5b2c93741c..c19ae12d65c 100644
--- a/Master/texmf-dist/tex/context/base/strc-reg.lua
+++ b/Master/texmf-dist/tex/context/base/strc-reg.lua
@@ -7,39 +7,45 @@ if not modules then modules = { } end modules ['strc-reg'] = {
}
local next, type = next, type
-local texwrite, texsprint, texcount = tex.write, tex.sprint, tex.count
-local format, gmatch, concat = string.format, string.gmatch, table.concat
+local texwrite, texcount = tex.write, tex.count
+local format, gmatch = string.format, string.gmatch
+local equal, concat, remove = table.are_equal, table.concat, table.remove
local utfchar = utf.char
local lpegmatch = lpeg.match
+local allocate = utilities.storage.allocate
-local trace_registers = false trackers.register("structure.registers", function(v) trace_registers = v end)
+local trace_registers = false trackers.register("structures.registers", function(v) trace_registers = v end)
-local ctxcatcodes = tex.ctxcatcodes
+local report_registers = logs.reporter("structure","registers")
-local variables = interfaces.variables
+local structures = structures
+local registers = structures.registers
+local helpers = structures.helpers
+local sections = structures.sections
+local documents = structures.documents
+local pages = structures.pages
+local processors = structures.processors
+local references = structures.references
-local helpers = structure.helpers
-local sections = structure.sections
-local documents = structure.documents
-local pages = structure.pages
-local processors = structure.processors
-
-local mappings = sorters.mappings
-local entries = sorters.entries
-local replacements = sorters.replacements
+local mappings = sorters.mappings
+local entries = sorters.entries
+local replacements = sorters.replacements
local processor_split = processors.split
-local matching_till_depth, number_at_depth = sections.matching_till_depth, sections.number_at_depth
+local variables = interfaces.variables
+local context = context
+
+local matchingtilldepth, numberatdepth = sections.matchingtilldepth, sections.numberatdepth
-- some day we will share registers and lists (although there are some conceptual
-- differences in the application of keywords)
-local function filter_collected(names,criterium,number,collected,prevmode)
+local function filtercollected(names,criterium,number,collected,prevmode)
if not criterium or criterium == "" then criterium = variables.all end
local data = documents.data
local numbers, depth = data.numbers, data.depth
- local hash, result, all, detail = { }, { }, not names or names == "" or names == variables.all, nil
+ local hash, result, nofresult, all, detail = { }, { }, 0, not names or names == "" or names == variables.all, nil
if not all then
for s in gmatch(names,"[^, ]+") do
hash[s] = true
@@ -49,18 +55,20 @@ local function filter_collected(names,criterium,number,collected,prevmode)
for i=1,#collected do
local v = collected[i]
if all then
- result[#result+1] = v
+ nofresult = nofresult + 1
+ result[nofresult] = v
else
local vmn = v.metadata and v.metadata.name
if hash[vmn] then
- result[#result+1] = v
+ nofresult = nofresult + 1
+ result[nofresult] = v
end
end
end
elseif criterium == variables.current then
for i=1,#collected do
local v = collected[i]
- local sectionnumber = jobsections.collected[v.references.section]
+ local sectionnumber = sections.collected[v.references.section]
if sectionnumber then
local cnumbers = sectionnumber.numbers
if prevmode then
@@ -73,7 +81,8 @@ local function filter_collected(names,criterium,number,collected,prevmode)
end
end
if ok then
- result[#result+1] = v
+ nofresult = nofresult + 1
+ result[nofresult] = v
end
end
else
@@ -87,7 +96,8 @@ local function filter_collected(names,criterium,number,collected,prevmode)
end
end
if ok then
- result[#result+1] = v
+ nofresult = nofresult + 1
+ result[nofresult] = v
end
end
end
@@ -96,7 +106,7 @@ local function filter_collected(names,criterium,number,collected,prevmode)
elseif criterium == variables.previous then
for i=1,#collected do
local v = collected[i]
- local sectionnumber = jobsections.collected[v.references.section]
+ local sectionnumber = sections.collected[v.references.section]
if sectionnumber then
local cnumbers = sectionnumber.numbers
if (all or hash[v.metadata.name]) and #cnumbers >= depth then
@@ -118,21 +128,22 @@ local function filter_collected(names,criterium,number,collected,prevmode)
end
end
if ok then
- result[#result+1] = v
+ nofresult = nofresult + 1
+ result[nofresult] = v
end
end
end
end
elseif criterium == variables["local"] then
if sections.autodepth(data.numbers) == 0 then
- return filter_collected(names,variables.all,number,collected,prevmode)
+ return filtercollected(names,variables.all,number,collected,prevmode)
else
- return filter_collected(names,variables.current,number,collected,prevmode)
+ return filtercollected(names,variables.current,number,collected,prevmode)
end
else -- sectionname, number
-- beware, this works ok for registers
local depth = sections.getlevel(criterium)
- local number = tonumber(number) or number_at_depth(depth) or 0
+ local number = tonumber(number) or numberatdepth(depth) or 0
if trace_registers then
detail = format("depth: %s, number: %s, numbers: %s, startset: %s",depth,number,concat(sections.numbers(),".",1,depth),#collected)
end
@@ -141,13 +152,14 @@ local function filter_collected(names,criterium,number,collected,prevmode)
local v = collected[i]
local r = v.references
if r then
- local sectionnumber = jobsections.collected[r.section]
+ local sectionnumber = sections.collected[r.section]
if sectionnumber then
local metadata = v.metadata
local cnumbers = sectionnumber.numbers
if cnumbers then
- if (all or hash[metadata.name or false]) and #cnumbers >= depth and matching_till_depth(depth,cnumbers) then
- result[#result+1] = v
+ if (all or hash[metadata.name or false]) and #cnumbers >= depth and matchingtilldepth(depth,cnumbers) then
+ nofresult = nofresult + 1
+ result[nofresult] = v
end
end
end
@@ -157,29 +169,29 @@ local function filter_collected(names,criterium,number,collected,prevmode)
end
if trace_registers then
if detail then
- logs.report("registers","criterium: %s, %s, found: %s",criterium,detail,#result)
+ report_registers("criterium: %s, %s, found: %s",criterium,detail,#result)
else
- logs.report("registers","criterium: %s, found: %s",criterium,#result)
+ report_registers("criterium: %s, found: %s",criterium,#result)
end
end
return result
end
-jobregisters = jobregisters or { }
-jobregisters.collected = jobregisters.collected or { }
-jobregisters.tobesaved = jobregisters.tobesaved or { }
+local tobesaved = allocate()
+local collected = allocate()
-jobregisters.filter_collected = filter_collected
+registers.collected = collected
+registers.tobesaved = tobesaved
+registers.filtercollected = filtercollected
-- we follow a different strategy than by lists, where we have a global
-- result table; we might do that here as well but since sorting code is
-- older we delay that decision
-local tobesaved, collected = jobregisters.tobesaved, jobregisters.collected
-
local function initializer()
- tobesaved, collected = jobregisters.tobesaved, jobregisters.collected
- local internals = jobreferences.internals
+ tobesaved = registers.tobesaved
+ collected = registers.collected
+ local internals = references.internals
for name, list in next, collected do
local entries = list.entries
for e=1,#entries do
@@ -195,7 +207,7 @@ local function initializer()
end
end
-job.register('jobregisters.collected', jobregisters.tobesaved, initializer)
+job.register('structures.registers.collected', tobesaved, initializer)
local function allocate(class)
local d = tobesaved[class]
@@ -213,7 +225,7 @@ local function allocate(class)
return d
end
-jobregisters.define = allocate
+registers.define = allocate
local entrysplitter = lpeg.Ct(lpeg.splitat('+')) -- & obsolete in mkiv
@@ -222,6 +234,7 @@ local tagged = { }
local function preprocessentries(rawdata)
local entries = rawdata.entries
if entries then
+--~ table.print(rawdata)
local e, k = entries[1] or "", entries[2] or ""
local et, kt, entryproc, pageproc
if type(e) == "table" then
@@ -231,7 +244,7 @@ local function preprocessentries(rawdata)
et = lpegmatch(entrysplitter,e)
end
if type(k) == "table" then
- kt = e
+ kt = k
else
pageproc, k = processor_split(k)
kt = lpegmatch(entrysplitter,k)
@@ -252,12 +265,10 @@ local function preprocessentries(rawdata)
rawdata.processors = { entryproc, pageproc }
end
rawdata.entries = nil
- else
- rawdata.list = { { "", "" } } -- br
end
end
-function jobregisters.store(rawdata) -- metadata, references, entries
+function registers.store(rawdata) -- metadata, references, entries
local data = allocate(rawdata.metadata.name).entries
local references = rawdata.references
references.realpage = references.realpage or 0 -- just to be sure as it can be refered to
@@ -268,14 +279,14 @@ function jobregisters.store(rawdata) -- metadata, references, entries
texwrite(#data)
end
-function jobregisters.enhance(name,n)
+function registers.enhance(name,n)
local r = tobesaved[name].entries[n]
if r then
r.references.realpage = texcount.realpageno
end
end
-function jobregisters.extend(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
@@ -284,16 +295,22 @@ function jobregisters.extend(name,tag,rawdata) -- maybe do lastsection internall
if r then
local rr = r.references
rr.lastrealpage = texcount.realpageno
- rr.lastsection = structure.sections.currentid()
+ rr.lastsection = sections.currentid()
if rawdata then
- preprocessentries(rawdata)
+ if rawdata.entries then
+ preprocessentries(rawdata)
+ end
for k,v in next, rawdata do
if not r[k] then
r[k] = v
else
local rk = r[k]
for kk,vv in next, v do
- if vv ~= "" then
+ if type(vv) == "table" then
+ if next(vv) then
+ rk[kk] = vv
+ end
+ elseif vv ~= "" then
rk[kk] = vv
end
end
@@ -308,28 +325,124 @@ end
local compare = sorters.comparers.basic
-function jobregisters.compare(a,b)
+function registers.compare(a,b)
local result = compare(a,b)
if result ~= 0 then
return result
- elseif a.metadata.kind == 'entry' then -- e/f/t
- local page_a, page_b = a.references.realpage, b.references.realpage
- if not page_a or not page_b then
- return 0
- elseif page_a < page_b then
+ else
+ local ka, kb = a.metadata.kind, b.metadata.kind
+ if ka == kb then
+ local page_a, page_b = a.references.realpage, b.references.realpage
+ if not page_a or not page_b then
+ return 0
+ elseif page_a < page_b then
+ return -1
+ elseif page_a > page_b then
+ return 1
+ end
+ elseif ka == "see" then
+ return 1
+ elseif kb == "see" then
return -1
- elseif page_a > page_b then
- return 1
end
end
return 0
end
-function jobregisters.filter(data,options)
- data.result = jobregisters.filter_collected(nil,options.criterium,options.number,data.entries,true)
+function registers.filter(data,options)
+ data.result = registers.filtercollected(nil,options.criterium,options.number,data.entries,true)
+end
+
+local seeindex = 0
+
+-- meerdere loops, seewords, dan words, an seewords
+
+local function crosslinkseewords(result) -- all words
+ -- collect all seewords
+ local seewords = { }
+ for i=1,#result do
+ local data = result[i]
+ local seeword = data.seeword
+ if seeword then
+ local seetext = seeword.text
+ if seetext and not seewords[seetext] then
+ seeindex = seeindex + 1
+ seewords[seetext] = seeindex
+ if trace_registers then
+ report_registers("see word %03i: %s",seeindex,seetext)
+ end
+ end
+ end
+ end
+ -- mark seeparents
+ local seeparents = { }
+ for i=1,#result do
+ local data = result[i]
+ local word = data.list[1]
+ word = word and word[1]
+ if word then
+ local seeindex = seewords[word]
+ if seeindex then
+ seeparents[word] = data
+ data.references.seeparent = seeindex
+ if trace_registers then
+ report_registers("see parent %03i: %s",seeindex,word)
+ end
+ end
+ end
+ end
+ -- mark seewords and extend sort list
+ for i=1,#result do
+ local data = result[i]
+ local seeword = data.seeword
+ if seeword then
+ local text = seeword.text
+ if text then
+ local seeparent = seeparents[text]
+ if seeparent then
+ local seeindex = seewords[text]
+ local s, ns, d, w, l = { }, 0, data.split, seeparent.split, data.list
+ -- trick: we influence sorting by adding fake subentries
+ for i=1,#d do
+ ns = ns + 1
+ s[ns] = d[i] -- parent
+ end
+ for i=1,#w do
+ ns = ns + 1
+ s[ns] = w[i] -- see
+ end
+ data.split = s
+ -- we also register a fake extra list entry so that the
+ -- collapser works okay
+ l[#l+1] = { text, "" }
+ data.references.seeindex = seeindex
+ if trace_registers then
+ report_registers("see crosslink %03i: %s",seeindex,text)
+ end
+ end
+ end
+ end
+ end
+end
+
+local function removeemptyentries(result)
+ local i, n, m = 1, #result, 0
+ while i <= n do
+ local entry = result[i]
+ if #entry.list == 0 or #entry.split == 0 then
+ remove(result,i)
+ n = n - 1
+ m = m + 1
+ else
+ i = i + 1
+ end
+ end
+ if m > 0 then
+ report_registers("%s empty entries removed in register",m)
+ end
end
-function jobregisters.prepare(data)
+function registers.prepare(data)
-- data has 'list' table
local strip = sorters.strip
local splitter = sorters.splitters.utf
@@ -350,75 +463,85 @@ function jobregisters.prepare(data)
end
entry.split = split
end
+ removeemptyentries(result)
+ crosslinkseewords(result)
end
end
-function jobregisters.sort(data,options)
- sorters.sort(data.result,jobregisters.compare)
+function registers.sort(data,options)
+ sorters.sort(data.result,registers.compare)
end
-function jobregisters.unique(data,options)
- local result, prev, equal = { }, nil, table.are_equal
+function registers.unique(data,options)
+ local result, nofresult, prev = { }, 0, nil
local dataresult = data.result
for k=1,#dataresult do
local v = dataresult[k]
- if not prev then
- result[#result+1], prev = v, v
- else
+ if prev then
local pr, vr = prev.references, v.references
if not equal(prev.list,v.list) then
- result[#result+1], prev = v, v
+ -- ok
elseif pr.realpage ~= vr.realpage then
- result[#result+1], prev = v, v
+ -- ok
else
local pl, vl = pr.lastrealpage, vr.lastrealpage
if pl or vl then
if not vl then
- result[#result+1], prev = v, v
+ -- ok
elseif not pl then
- result[#result+1], prev = v, v
+ -- ok
elseif pl ~= vl then
- result[#result+1], prev = v, v
+ -- ok
+ else
+ v = nil
end
+ else
+ v = nil
end
end
end
+ if v then
+ nofresult = nofresult + 1
+ result[nofresult] = v
+ prev = v
+ end
end
data.result = result
end
-function jobregisters.finalize(data,options)
+function registers.finalize(data,options) -- maps character to index (order)
local result = data.result
data.metadata.nofsorted = #result
- local split, lasttag, s, d = { }, nil, nil, nil
- -- maps character to index (order)
+ local split, nofsplit, lasttag, done, nofdone = { }, 0, nil, nil, 0
+ local firstofsplit = sorters.firstofsplit
for k=1,#result do
local v = result[k]
- local entry, tag = sorters.firstofsplit(v)
+ local entry, tag = firstofsplit(v)
if tag ~= lasttag then
if trace_registers then
- logs.report("registers","splitting at %s",tag)
+ report_registers("splitting at %s",tag)
end
- d = { }
- s = { tag = tag, data = d }
- split[#split+1] = s
+ done, nofdone = { }, 0
+ nofsplit = nofsplit + 1
+ split[nofsplit] = { tag = tag, data = done }
lasttag = tag
end
- d[#d+1] = v
+ nofdone = nofdone + 1
+ done[nofdone] = v
end
data.result = split
end
-function jobregisters.analysed(class,options)
+function registers.analyzed(class,options)
local data = collected[class]
if data and data.entries then
options = options or { }
- sorters.setlanguage(options.language)
- jobregisters.filter(data,options) -- filter entries into results (criteria)
- jobregisters.prepare(data,options) -- adds split table parallel to list table
- jobregisters.sort(data,options) -- sorts results
- jobregisters.unique(data,options) -- get rid of duplicates
- jobregisters.finalize(data,options) -- split result in ranges
+ sorters.setlanguage(options.language,options.method,options.numberorder)
+ registers.filter(data,options) -- filter entries into results (criteria)
+ registers.prepare(data,options) -- adds split table parallel to list table
+ registers.sort(data,options) -- sorts results
+ registers.unique(data,options) -- get rid of duplicates
+ registers.finalize(data,options) -- split result in ranges
data.metadata.sorted = true
return data.metadata.nofsorted or 0
else
@@ -428,267 +551,251 @@ end
-- todo take conversion from index
-function jobregisters.userdata(index,name)
- local data = jobreferences.internals[tonumber(index)]
+function registers.userdata(index,name)
+ local data = references.internals[tonumber(index)]
data = data and data.userdata and data.userdata[name]
if data then
- texsprint(ctxcatcodes,data)
+ context(data)
end
end
--- proc can be wrapped
+-- todo: ownnumber
-function jobregisters.flush(data,options,prefixspec,pagespec)
- local equal = table.are_equal
- texsprint(ctxcatcodes,"\\startregisteroutput")
- local collapse_singles = options.compress == interfaces.variables.yes
- local collapse_ranges = options.compress == interfaces.variables.all
- local result = data.result
- -- todo ownnumber
- local function pagenumber(entry)
- local er = entry.references
- texsprint(ctxcatcodes,format("\\registeronepage{%s}{%s}{",er.internal or 0,er.realpage or 0)) -- internal realpage content
- local proc = entry.processors and entry.processors[2]
- if proc then
- texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
- helpers.prefixpage(entry,prefixspec,pagespec)
- texsprint(ctxcatcodes,"}")
- else
- helpers.prefixpage(entry,prefixspec,pagespec)
- end
- texsprint(ctxcatcodes,"}")
- end
- local function pagerange(f_entry,t_entry,is_last)
- local er = f_entry.references
- texsprint(ctxcatcodes,format("\\registerpagerange{%s}{%s}{",er.internal or 0,er.realpage or 0))
- local proc = f_entry.processors and f_entry.processors[2]
- if proc then
- texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
- helpers.prefixpage(f_entry,prefixspec,pagespec)
- texsprint(ctxcatcodes,"}")
- else
+local function pagerange(f_entry,t_entry,is_last,prefixspec,pagespec)
+ local fer, ter = f_entry.references, t_entry.references
+ context.registerpagerange(
+ f_entry.processors and f_entry.processors[2] or "",
+ fer.internal or 0,
+ fer.realpage or 0,
+ function()
helpers.prefixpage(f_entry,prefixspec,pagespec)
- end
- local er = t_entry.references
- texsprint(ctxcatcodes,format("}{%s}{%s}{",er.internal or 0,er.lastrealpage or er.realpage or 0))
- if is_last then
- if proc then
- texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
+ end,
+ ter.internal or 0,
+ ter.lastrealpage or ter.realpage or 0,
+ function()
+ if is_last then
helpers.prefixlastpage(t_entry,prefixspec,pagespec) -- swaps page and realpage keys
- texsprint(ctxcatcodes,"}")
else
- helpers.prefixlastpage(t_entry,prefixspec,pagespec) -- swaps page and realpage keys
+ helpers.prefixpage (t_entry,prefixspec,pagespec)
end
- else
- if proc then
- texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
- helpers.prefixpage(t_entry,prefixspec,pagespec)
- texsprint(ctxcatcodes,"}")
- else
- helpers.prefixpage(t_entry,prefixspec,pagespec)
+ end
+ )
+end
+
+local function pagenumber(entry,prefixspec,pagespec)
+ local er = entry.references
+ context.registeronepage(
+ entry.processors and entry.processors[2] or "",
+ er.internal or 0,
+ er.realpage or 0,
+ function() helpers.prefixpage(entry,prefixspec,pagespec) end
+ )
+end
+
+local function collapsedpage(pages)
+ for i=2,#pages do
+ local first, second = pages[i-1], pages[i]
+ local first_first, first_last, second_first, second_last = first[1], first[2], second[1], second[2]
+ local first_last_pn = first_last .references.realpage
+ local second_first_pn = second_first.references.realpage
+ local second_last_pn = second_last .references.realpage
+ local first_last_last = first_last .references.lastrealpage
+ local second_first_last = second_first.references.lastrealpage
+ if first_last_last then
+ first_last_pn = first_last_last
+ if second_first == second_last and second_first_pn <= first_last_pn then
+ -- 2=8, 5 -> 12=8
+ remove(pages,i)
+ return true
+ elseif second_first == second_last and second_first_pn > first_last_pn then
+ -- 2=8, 9 -> 2-9
+ pages[i-1] = { first_first, second_last }
+ remove(pages,i)
+ return true
+ elseif second_last_pn < first_last_pn then
+ -- 2=8, 3-4 -> 2=8
+ remove(pages,i)
+ return true
+ elseif first_last_pn < second_last_pn then
+ -- 2=8, 3-9 -> 2-9
+ pages[i-1] = { first_first, second_last }
+ remove(pages,i)
+ return true
+ elseif first_last_pn + 1 == second_first_pn and second_last_pn > first_last_pn then
+ -- 2=8, 9-11 -> 2-11
+ pages[i-1] = { first_first, second_last }
+ remove(pages,i)
+ return true
+ elseif second_first.references.lastrealpage then
+ -- 2=8, 9=11 -> 2-11
+ pages[i-1] = { first_first, second_last }
+ remove(pages,i)
+ return true
+ end
+ elseif second_first_last then
+ second_first_pn = second_first_last
+ if first_last_pn == second_first_pn then
+ -- 2-4, 5=9 -> 2-9
+ pages[i-1] = { first_first, second_last }
+ remove(pages,i)
+ return true
end
+ elseif first_last_pn == second_first_pn then
+ -- 2-3, 3-4 -> 2-4
+ pages[i-1] = { first_last, second_last }
+ remove(pages,i)
+ return true
end
- texsprint(ctxcatcodes,"}")
end
- -- ranges need checking !
+ return false
+end
+
+local function collapsepages(pages)
+ while collapsedpage(pages) do end
+ return #pages
+end
+
+function registers.flush(data,options,prefixspec,pagespec)
+ local collapse_singles = options.compress == variables.yes
+ local collapse_ranges = options.compress == variables.all
+ local result = data.result
+ context.startregisteroutput()
for i=1,#result do
+ -- ranges need checking !
local sublist = result[i]
local done = { false, false, false, false }
local data = sublist.data
local d, n = 0, 0
- texsprint(ctxcatcodes,format("\\startregistersection{%s}",sublist.tag))
+ context.startregistersection(sublist.tag)
+ for d=1,#data do
+ local entry = data[d]
+ if entry.metadata.kind == "see" then
+ local list = entry.list
+ 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 '%s', reference '%s'",
+ entry.metadata.name or "?",list[1][1] or "?")
+ end
+ end
+ end
while d < #data do
d = d + 1
local entry = data[d]
local e = { false, false, false, false }
local metadata = entry.metadata
+ local kind = metadata.kind
+ local list = entry.list
for i=1,4 do -- max 4
- if entry.list[i] then
- e[i] = entry.list[i][1]
+ 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]
if n == i then
- texsprint(ctxcatcodes,format("\\stopregisterentries\\startregisterentries{%s}",n))
+ context.stopregisterentries()
+ context.startregisterentries(n)
else
while n > i do
n = n - 1
- texsprint(ctxcatcodes,"\\stopregisterentries")
+ context.stopregisterentries()
end
while n < i do
n = n + 1
- texsprint(ctxcatcodes,format("\\startregisterentries{%s}",n))
+ context.startregisterentries(n)
end
end
+ local internal = entry.references.internal or 0
+ local seeparent = entry.references.seeparent or ""
+ local processor = entry.processors and entry.processors[1] or ""
if metadata then
- texsprint(ctxcatcodes,"\\registerentry{")
- local proc = entry.processors and entry.processors[1]
- if proc then
- texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
- helpers.title(e[i],metadata)
- texsprint(ctxcatcodes,"}")
- else
- helpers.title(e[i],metadata)
- end
- texsprint(ctxcatcodes,"}")
- else
- local proc = entry.processors and entry.processors[1]
- if proc then
- texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
- texsprint(ctxcatcodes,format("\\registerentry{%s}",e[i]))
- texsprint(ctxcatcodes,"}")
- else
- texsprint(ctxcatcodes,format("\\registerentry{%s}",e[i]))
- end
+ context.registerentry(processor,internal,seeparent,function() helpers.title(e[i],metadata) end)
+ else -- ?
+ context.registerentry(processor,internal,seeindex,e[i])
end
else
done[i] = false
end
end
end
- local kind = entry.metadata.kind
if kind == 'entry' then
- texsprint(ctxcatcodes,"\\startregisterpages")
- --~ collapse_ranges = true
+ context.startregisterpages()
if collapse_singles or collapse_ranges then
-- we collapse ranges and keep existing ranges as they are
-- so we get prebuilt as well as built ranges
- local first, last, prev = entry, nil, entry
- local pages = { }
- local dd = d
+ local first, last, prev, pages, dd, nofpages = entry, nil, entry, { }, d, 0
while dd < #data do
dd = dd + 1
local next = data[dd]
- local el, nl = entry.list, next.list
- if not equal(el,nl) then
+ if next and next.metadata.kind == "see" then
dd = dd - 1
- --~ first = nil
break
- elseif next.references.lastrealpage then
- if first then
- pages[#pages+1] = { first, last or first }
+ else
+ local el, nl = entry.list, next.list
+ if not equal(el,nl) then
+ dd = dd - 1
+ --~ first = nil
+ break
+ elseif next.references.lastrealpage then
+ nofpages = nofpages + 1
+ pages[nofpages] = first and { first, last or first } or { entry, entry }
+ nofpages = nofpages + 1
+ pages[nofpages] = { next, next }
+ first, last, prev = nil, nil, nil
+ elseif not first then
+ first, prev = next, next
+ elseif next.references.realpage - prev.references.realpage == 1 then -- 1 ?
+ last, prev = next, next
else
- pages[#pages+1] = { entry, entry }
+ nofpages = nofpages + 1
+ pages[nofpages] = { first, last or first }
+ first, last, prev = next, nil, next
end
- pages[#pages+1] = { next, next }
- first, last, prev = nil, nil, nil
- elseif not first then
- first, prev = next, next
- elseif next.references.realpage - prev.references.realpage == 1 then -- 1 ?
- last, prev = next, next
- else
- pages[#pages+1] = { first, last or first }
- first, last, prev = next, nil, next
end
end
if first then
- pages[#pages+1] = { first, last or first }
+ nofpages = nofpages + 1
+ pages[nofpages] = { first, last or first }
end
- if collapse_ranges and #pages > 1 then
- -- ok, not that efficient
- local function doit()
- local function bubble(i)
- for j=i,#pages-1 do
- pages[j] = pages[j+1]
- end
- pages[#pages] = nil
- end
- for i=2,#pages do
- local first, second = pages[i-1], pages[i]
- local first_first, first_last, second_first, second_last = first[1], first[2], second[1], second[2]
- local first_last_pn = first_last .references.realpage
- local second_first_pn = second_first.references.realpage
- local second_last_pn = second_last .references.realpage
- local first_last_last = first_last .references.lastrealpage
- local second_first_last = second_first.references.lastrealpage
- if first_last_last then
- first_last_pn = first_last_last
- if second_first == second_last and second_first_pn <= first_last_pn then
- -- 2=8, 5 -> 12=8
- bubble(i)
- return true
- elseif second_first == second_last and second_first_pn > first_last_pn then
- -- 2=8, 9 -> 2-9
- pages[i-1] = { first_first, second_last }
- bubble(i)
- return true
- elseif second_last_pn < first_last_pn then
- -- 2=8, 3-4 -> 2=8
- bubble(i)
- return true
- elseif first_last_pn < second_last_pn then
- -- 2=8, 3-9 -> 2-9
- pages[i-1] = { first_first, second_last }
- bubble(i)
- return true
- elseif first_last_pn + 1 == second_first_pn and second_last_pn > first_last_pn then
- -- 2=8, 9-11 -> 2-11
- pages[i-1] = { first_first, second_last }
- bubble(i)
- return true
- elseif second_first.references.lastrealpage then
- -- 2=8, 9=11 -> 2-11
- pages[i-1] = { first_first, second_last }
- bubble(i)
- return true
- end
- elseif second_first_last then
- second_first_pn = second_first_last
- if first_last_pn == second_first_pn then
- -- 2-4, 5=9 -> 2-9
- pages[i-1] = { first_first, second_last }
- bubble(i)
- return true
- end
- elseif first_last_pn == second_first_pn then
- -- 2-3, 3-4 -> 2-4
- pages[i-1] = { first_last, second_last }
- bubble(i)
- return true
- end
- end
- return false
- end
- while doit() do end
+ if collapse_ranges and nofpages > 1 then
+ nofpages = collapsepages(pages)
end
- --
- if #pages > 0 then -- or 0
+ if nofpages > 0 then -- or 0
d = dd
- for p=1,#pages do
+ for p=1,nofpages do
local first, last = pages[p][1], pages[p][2]
if first == last then
if first.references.lastrealpage then
- pagerange(first,first,true)
+ pagerange(first,first,true,prefixspec,pagespec)
else
- pagenumber(first)
+ pagenumber(first,prefixspec,pagespec)
end
elseif last.references.lastrealpage then
- pagerange(first,last,true)
+ pagerange(first,last,true,prefixspec,pagespec)
else
- pagerange(first,last,false)
+ pagerange(first,last,false,prefixspec,pagespec)
end
end
+ elseif entry.references.lastrealpage then
+ pagerange(entry,entry,true,prefixspec,pagespec)
else
- if entry.references.lastrealpage then
- pagerange(entry,entry,true)
- else
- pagenumber(entry)
- end
+ pagenumber(entry,prefixspec,pagespec)
end
else
while true do
if entry.references.lastrealpage then
- pagerange(entry,entry,true)
+ pagerange(entry,entry,true,prefixspec,pagespec)
else
- pagenumber(entry)
+ pagenumber(entry,prefixspec,pagespec)
end
if d == #data then
break
else
d = d + 1
local next = data[d]
- if not equal(entry.list,next.list) then
+ if next.metadata.kind == "see" or not equal(entry.list,next.list) then
d = d - 1
break
else
@@ -697,39 +804,55 @@ function jobregisters.flush(data,options,prefixspec,pagespec)
end
end
end
- texsprint(ctxcatcodes,"\\stopregisterpages")
+ context.stopregisterpages()
elseif kind == 'see' then
- -- maybe some day more words
- texsprint(ctxcatcodes,"\\startregisterseewords")
- local proc = entry.processors and entry.processors[1]
- if proc then
- texsprint(ctxcatcodes,"\\applyprocessor{",proc,"}{")
- texsprint(ctxcatcodes,format("\\registeroneword{0}{0}{%s}",entry.seeword.text)) -- todo: internal
- texsprint(ctxcatcodes,"}")
- else
- texsprint(ctxcatcodes,format("\\registeroneword{0}{0}{%s}",entry.seeword.text)) -- todo: internal
+ local t, nt = { }, 0
+ while true do
+ nt = nt + 1
+ t[nt] = entry
+ if d == #data then
+ break
+ else
+ d = d + 1
+ local next = data[d]
+ if next.metadata.kind ~= "see" or not equal(entry.list,next.list) then
+ d = d - 1
+ break
+ else
+ entry = next
+ end
+ end
end
- texsprint(ctxcatcodes,"\\stopregisterseewords")
+ context.startregisterseewords()
+ for i=1,nt do
+ local entry = t[i]
+ local processor = entry.processors and entry.processors[1] or ""
+ local seeindex = entry.references.seeindex or ""
+ local seeword = entry.seeword.text or ""
+ context.registerseeword(i,n,processor,0,seeindex,seeword)
+ end
+ context.stopregisterseewords()
end
end
while n > 0 do
- texsprint(ctxcatcodes,"\\stopregisterentries")
+ context.stopregisterentries()
n = n - 1
end
- texsprint(ctxcatcodes,"\\stopregistersection")
+ context.stopregistersection()
end
- texsprint(ctxcatcodes,"\\stopregisteroutput")
+ context.stopregisteroutput()
-- for now, maybe at some point we will do a multipass or so
data.result = nil
data.metadata.sorted = false
end
-function jobregisters.analyse(class,options)
- texwrite(jobregisters.analysed(class,options))
+function registers.analyze(class,options)
+ texwrite(registers.analyzed(class,options))
end
-function jobregisters.process(class,...)
- if jobregisters.analysed(class,...) > 0 then
- jobregisters.flush(collected[class],...)
+function registers.process(class,...)
+ if registers.analyzed(class,...) > 0 then
+ registers.flush(collected[class],...)
end
end
+
diff --git a/Master/texmf-dist/tex/context/base/strc-reg.mkiv b/Master/texmf-dist/tex/context/base/strc-reg.mkiv
index fcc37549c44..19634390dba 100644
--- a/Master/texmf-dist/tex/context/base/strc-reg.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-reg.mkiv
@@ -17,9 +17,6 @@
\unprotect
-\def\c!keys {keys}
-\def\c!entries{entries}
-
% todo: tag:: becomes rendering
% todo: language, character, linked, location
@@ -117,10 +114,13 @@
\c!prefix=\v!both,
%\c!expansion=,
%\c!xmlsetup=,
+ \c!pagenumber=\v!yes,
\c!pageprefixconnector=\endash,
\c!pagesegments=2:2,
\c!file=\jobname,
%\c!deeptextcommand=, % undefined by default !
+ \c!method=, % no default as we have them in the module, maybe some day in lang-*
+ \c!numberorder=\v!numbers, % \v!characters
\s!language=\currentmainlanguage]%
%D Definition:
@@ -130,7 +130,7 @@
\def\dodefineregister[#1][#2]% #2?
{\setupregister[#1][\s!parent=\??id]%
- \ctxlua{jobregisters.define('#1')}%
+ \ctxlua{structures.registers.define('#1')}%
\presetheadtext[#1=\Word{#1}]%
\setuvalue{#1}{\dodoubleempty\doregister[#1]}%
\setuvalue{\e!see#1}{\dodoubleempty\doseeregister[#1]}%
@@ -223,24 +223,24 @@
% we could consider storing register entries in a list which we
% could then sort
\xdef\currentregisternumber{\ctxlua{
- jobregisters.store { % 'own' should not be in metadata
+ structures.registers.store { % 'own' should not be in metadata
metadata = {
kind = "entry",
name = "\currentregister",
- level = structure.sections.currentlevel(),
+ level = structures.sections.currentlevel(),
coding = "\currentregistercoding",
catcodes = \the\catcodetable,
\ifx\currentregisterownnumber\v!yes
own = "\registerparameter\c!alternative", % can be used instead of pagenumber
\fi
xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text
-\ifx\currentregisterxmlsetup\empty \else
- xmlsetup = "\currentregisterxmlsetup",
-\fi
+ \ifx\currentregisterxmlsetup\empty \else
+ xmlsetup = "\currentregisterxmlsetup",
+ \fi
},
references = {
internal = \nextinternalreference,
- section = structure.sections.currentid(), % hm, why then not also lastsection the same way
+ section = structures.sections.currentid(), % hm, why then not also lastsection the same way
label = "\currentregisterlabel",
},
% \ifx\currentregisterentries\empty \else
@@ -258,16 +258,18 @@
\fi
},
% \fi
- userdata = structure.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
+ userdata = structures.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
}
} }%
- \ctxlua{jobreferences.setinternalreference(nil,nil,\nextinternalreference)}%
+ \ctxlua{structures.references.setinternalreference(nil,nil,\nextinternalreference)}%
\ifx\currentregisterownnumber\v!yes
\glet\currentregistersynchronize\relax
\else
- \xdef\currentregistersynchronize{\ctxlatelua{jobregisters.enhance("\currentregister",\currentregisternumber)}}%
+ \xdef\currentregistersynchronize{\ctxlatelua{structures.registers.enhance("\currentregister",\currentregisternumber)}}%
\fi
\currentregistersynchronize % here?
+ % needs thinking ... bla\index{bla}. will break before the . but adding a
+ % penalty is also no solution
\attribute\destinationattribute\lastdestinationattribute \forcecolorhack % no \strut as it will be removed during cleanup
\endgroup}
@@ -296,7 +298,7 @@
\fi}
\def\dostopregister[#1][#2]%
- {\normalexpanded{\ctxlatelua{jobregisters.extend("#1","#2")}}}
+ {\normalexpanded{\ctxlatelua{structures.registers.extend("#1","#2")}}}
\def\setregisterentry {\dotripleempty\dosetregisterentry}
\def\finishregisterentry{\dotripleempty\dofinishregisterentry}
@@ -327,18 +329,19 @@
\fi
\globallet\currentregistercoding\s!tex
\fi
+ % I hate this kind of mess ... but it's a user request.
\ifx\currentregisterentries\empty
- \normalexpanded{\ctxlua{jobregisters.extend("\currentregister","\currentregisterlabel", {
+ \normalexpanded{\ctxlua{structures.registers.extend("\currentregister","\currentregisterlabel", {
metadata = {
\ifx\currentregisterownnumber\v!yes
own = "\registerparameter\c!alternative", % can be used instead of pagenumber
\fi
},
- userdata = structure.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
+ userdata = structures.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
})%
}}%
\else
- \normalexpanded{\ctxlua{jobregisters.extend("\currentregister","\currentregisterlabel", {
+ \normalexpanded{\ctxlua{structures.registers.extend("\currentregister","\currentregisterlabel", {
metadata = {
catcodes = \the\catcodetable,
coding = "\currentregistercoding",
@@ -350,7 +353,7 @@
% we need a special one for xml, this is just a single one
\!!bs\currentregisterentries\!!es, \!!bs\currentregisterkeys\!!es
},
- userdata = structure.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
+ userdata = structures.helpers.touserdata(\!!bs\detokenize{#3}\!!es)
})
}}%
\fi
@@ -387,7 +390,7 @@
{\doflushatpar{\doregisterstructurepageregister{#1}{\c!label=#2,#3}{#4}}}
\def\dostopstructurepageregister[#1][#2]%
- {\normalexpanded{\ctxlatelua{jobregisters.extend("#1","#2")}}}
+ {\normalexpanded{\ctxlatelua{structures.registers.extend("#1","#2")}}}
% So far.
@@ -416,16 +419,16 @@
\fi
\setnextinternalreference
% we could consider storing register entries in list
- \edef\temp{\ctxlua{ jobregisters.store {
+ \edef\temp{\ctxlua{ structures.registers.store {
metadata = {
kind = "see",
name = "\currentregister",
- level = structure.sections.currentlevel(),
+ level = structures.sections.currentlevel(),
catcodes = \the\catcodetable,
},
references = {
internal = \nextinternalreference,
- section = structure.sections.currentid(),
+ section = structures.sections.currentid(),
},
entries = {
% we need a special one for xml, this is just a single one
@@ -440,6 +443,8 @@
%D Rendering:
+% todo: c!language ipv s!language
+
\let\utilityregisterlength\!!zerocount
\def\determineregistercharacteristics
@@ -449,10 +454,12 @@
{\begingroup
\edef\currentregister{#1}%
\setupregister[\currentregister][#2]%
- \normalexpanded{\endgroup\noexpand\xdef\noexpand\utilityregisterlength{\ctxlua{jobregisters.analyse('\currentregister',{
- language = "\registerparameter\s!language",
- compress = "\registerparameter\c!compress",
- criterium = "\registerparameter\c!criterium",
+ \normalexpanded{\endgroup\noexpand\xdef\noexpand\utilityregisterlength{\ctxlua{structures.registers.analyze('\currentregister',{
+ language = "\registerparameter\s!language",
+ method = "\registerparameter\c!method",
+ numberorder = "\registerparameter\c!numberorder",
+ compress = "\registerparameter\c!compress",
+ criterium = "\registerparameter\c!criterium",
})}}}% brrr
\ifcase\utilityregisterlength\relax
\resetsystemmode\v!register
@@ -482,10 +489,12 @@
\c!align=\registerparameter\c!align,
\c!tolerance=\registerparameter\c!tolerance]%
\startpacked[\v!blank]%
- \ctxlua{jobregisters.process('\currentregister',{
- language = "\registerparameter\s!language",
- compress = "\registerparameter\c!compress",
- criterium = "\registerparameter\c!criterium",
+ \ctxlua{structures.registers.process('\currentregister',{
+ language = "\registerparameter\s!language",
+ method = "\registerparameter\c!method",
+ numberorder = "\registerparameter\c!numberorder",
+ compress = "\registerparameter\c!compress",
+ criterium = "\registerparameter\c!criterium",
},
{
% prefix = "\registerparameter\c!pageprefix",
@@ -561,9 +570,23 @@
{\doifsomething{#1}
{\doifnot{#1}\s!unknown
{\doifelse{\registerparameter\c!indicator}\v!yes
- {\expandcheckedcsname{\??id:\c!indicator:}{\registerparameter\c!alternative}{a}{#1}}
+ {\doregistercharacter{#1}}
{\noregistercharacter{#1}}}}}
+% \def\doregistercharacter#1%
+% {\expandcheckedcsname % why no \executeifdefined
+% {\??id:\c!indicator:}%
+% {\registerparameter\c!alternative}%
+% {a}%
+% {#1}}
+
+\def\doregistercharacter#1%
+ {\expandcheckedcsname % why no \executeifdefined
+ {\??id:\c!indicator:}%
+ {\registerparameter\c!alternative}%
+ {a}%
+ {#1}}
+
\def\noregistercharacter#1%
{\registerparameter\c!before
\goodbreak}
@@ -573,19 +596,31 @@
\setvalue{\??id:\c!indicator:a}#1%
{\registerparameter\c!before
% bugged, why does leftskip gets set: \vskip\lineheight\goodbreak\vskip-\lineheight
- \begingroup\dosetregisterattributes\c!style\c!color
- \registerparameter\c!command{\strut#1}%
+ \begingroup
+ \dosetregisterattributes\c!style\c!color
+ \dontleavehmode
+ \strut
+ \iflocation
+ \pagereference[\currentregister:\v!section:#1]%
+ \fi
+ \registerparameter\c!command{#1}%
\endgroup
\registerparameter\c!after
- \par\nobreak}
-
+ \par
+ \nobreak}
% b = <goodbreak> <before> <character> <after> <nobreak>
-\setvalue{\??id:\c!indicator:b}#1%
+\setvalue{\??id:\c!indicator:b}#1% will be shared with a
{\registerparameter\c!before
- \begingroup\dosetregisterattributes\c!style\c!color
- \registerparameter\c!command{\strut#1}%
+ \begingroup
+ \dosetregisterattributes\c!style\c!color
+ \dontleavehmode
+ \strut
+ \iflocation
+ \pagereference[\currentregister:\v!section:#1]%
+ \fi
+ \registerparameter\c!command{#1}%
\endgroup
\registerparameter\c!after
\nobreak}
@@ -603,47 +638,60 @@
\unexpanded\def\startregisteroutput
{\endgraf
\begingroup
+ \dostarttagged\t!register\currentregister
\forgetparindent
\forgetparskip}
\unexpanded\def\stopregisteroutput
{\endgraf
+ \dostoptagged
\endgroup}
\unexpanded\def\startregisterentries#1% depth
{\endgraf
\begingroup
+ \dostarttagged\t!registerentries\empty
\dosetregisterattributes\c!textstyle\c!textcolor
\advance\leftskip\numexpr#1-1\relax\dimexpr\registerparameter\c!distance\relax
\hangindent\registerparameter\c!distance\hangafter\plusone}
\unexpanded\def\stopregisterentries
{\endgraf
+ \dostoptagged
\endgroup}
\unexpanded\def\startregistersection#1% title
- {\registercharacter{#1}\endgraf}
+ {\dostarttagged\t!registersection\empty
+ \dostarttagged\t!registertag\empty
+ \registercharacter{#1}\endgraf
+ \dostoptagged}
\unexpanded\def\stopregistersection
- {\endgraf}
+ {\dostoptagged
+ \endgraf}
\newconditional\registerpagedone
\unexpanded\def\startregisterpages
{\begingroup
+ \dostarttagged\t!registerpages\empty
\setfalse\registerpagedone
\dosetregisterattributes\c!pagestyle\c!pagecolor}
\unexpanded\def\stopregisterpages
- {\endgroup}
+ {\dostoptagged
+ \endgroup}
\unexpanded\def\startregisterseewords
- {\begingroup
+ {\ifhmode\crlf\fi
+ \begingroup
\setfalse\registerpagedone
+ \dostarttagged\t!registerpage\empty
\dosetregisterattributes\c!pagestyle\c!pagecolor}
\unexpanded\def\stopregisterseewords
- {\endgroup}
+ {\dostoptagged
+ \endgroup}
\def\registerpageseparator% todo: , configurable
{\ifconditional\registerpagedone
@@ -655,30 +703,79 @@
\def\registeronepagerangeseparator{|\endash|}
-\def\withregisterpagecommand#1#2#3%
- {\def\currentregisterpageindex{#1}%
+\def\withregisterpagecommand#1#2#3#4%
+ {\def\currentregisterpageindex{#2}%
\iflocation
- \goto{\registerparameter\c!pagecommand{#3}}[internal(#1)]%
+ \goto{\registerparameter\c!pagecommand{#4}}[internal(#2)]%
\else
- \registerparameter\c!pagecommand{#3}%
+ \registerparameter\c!pagecommand{#4}%
\fi}
-\def\registeronepage#1#2#3% content
+\def\registeronepage#1#2#3#4% #1:processor content
{\registerpageseparator
- \withregisterpagecommand{#1}{#2}{#3}}
+ \dostarttagged\t!registerpage\empty
+ \withregisterpagecommand{#1}{#2}{#3}{#4}%
+ \dostoptagged}
-\def\registerpagerange#1#2#3#4#5#6% content, content todo: -- configurable
+\def\registerpagerange#1#2#3#4#5#6#7% #1:processor content, content todo: -- configurable
{\registerpageseparator
- \withregisterpagecommand{#1}{#2}{#3}%
+ \dostarttagged\t!registerpagerange\empty
+ \dostarttagged\t!registerfrompage\empty
+ \withregisterpagecommand{#1}{#2}{#3}{#4}%
+ \dostoptagged
\registeronepagerangeseparator
- \withregisterpagecommand{#4}{#5}{#6}}
+ \dostarttagged\t!registertopage\empty
+ \withregisterpagecommand{#1}{#5}{#6}{#7}%
+ \dostoptagged
+ \dostoptagged}
+
+\def\doapplyregisterentrycommand#1#2% processor text
+ {\dostarttagged\t!registerentry\empty
+ \ifx\currentregisterseeindex\empty \else
+ \dontleavehmode
+ \pagereference[seeindex:\currentregisterseeindex]% maybe some day we will support an area
+ \fi
+ \applyprocessor{#1}{\registerparameter\c!textcommand{\limitedregisterentry{\registerparameter\c!deeptextcommand{#2}}}}%
+ \dostoptagged}
-\def\registeroneword#1#2#3% content
- {\registerpageseparator
- \registerseeword{#3}}
+\def\defaultregisterentry#1#2#3#4% #1:processor #2:internal #3:seeindex #4:word
+ {\def\currentregisterpageindex{#2}%
+ \iflocation
+ \def\currentregisterseeindex{#3}%
+ \doifelse{\registerparameter\c!interaction}\v!text
+ {\directgoto{\setlocationcolor\??ia\doapplyregisterentrycommand{#1}{#4}}[internal(#2)]}
+ {\doapplyregisterentrycommand{#1}{#4}}%
+ \else
+ \let\currentregisterseeindex\empty
+ \doapplyregisterentrycommand{#1}{#4}%
+ \fi}
+
+\unexpanded\def\doapplyregisterseecommand#1#2%
+ {\ifx\currentregisterseeindex\empty
+ % \dontleavehmode
+ \applyprocessor{#1}{#2}%
+ \else
+ \goto{\applyprocessor{#1}{#2}}[seeindex:\currentregisterseeindex]%
+ \fi}
-\def\defaultregisterentry #1{\registerparameter\c!textcommand{\limitedregisterentry{\registerparameter\c!deeptextcommand{#1}}}}
-\def\defaultregisterseeword#1{\labeltexts\v!see{#1}}
+\def\defaultregisterseeword#1#2#3#4#5#6% i n #3:processor #4:internal #5:seeindex #6:word
+ {%\registerpageseparator
+ \def\currentregisterpageindex{#4}%
+ \dostarttagged\t!registersee\empty
+ \settrue\registerpagedone
+ \iflocation
+ \def\currentregisterseeindex{#5}%
+ \else
+ \let\currentregisterseeindex\empty
+ \fi
+ \ifnum#1=\plusone
+ \labeltexts\v!see{\doapplyregisterseecommand{#3}{#6}}%
+ \else\ifnum#1=#2\relax
+ \labeltexts\v!and{\doapplyregisterseecommand{#3}{#6}}%
+ \else
+ ,\space\doapplyregisterseecommand{#3}{#6}%
+ \fi\fi
+ \dostoptagged}
\let\registerseeword \defaultregisterseeword
\let\registerentry \defaultregisterentry
@@ -700,7 +797,7 @@
% \placeregister[index][n=1,pagecommand=\MyRegisterPageCommand]
% \stoptext
-\def\registerpageuserdata #1#2{\ctxlua{jobregisters.userdata(#1,"#2")}}
+\def\registerpageuserdata #1#2{\ctxlua{structures.registers.userdata(#1,"#2")}}
\def\currentregisterpageuserdata {\registerpageuserdata\currentregisterpageindex} % {#1}
% not yet ok : new internal handler names
@@ -715,423 +812,44 @@
\setvalue{\??id:\c!symbol:\v!none}%
{\let\registerpageseparatorsymbol\empty
- \let\registeronepage \gobblethreearguments
- \let\registerpagerange \gobblesixarguments}
+ \let\registeronepage \gobblefourarguments
+ \let\registerpagerange \gobblesevenarguments}
\setvalue{\??id:\c!symbol:1}%
{\let\registerpageseparatorsymbol\space
- \def\registeronepage {\symbol[1]\gobblethreearguments}%
- \def\registerpagerange {\symbol[1]\gobblesixarguments}}
+ \def\registeronepage {\symbol[1]\gobblefourarguments}%
+ \def\registerpagerange {\symbol[1]\gobblesevenarguments}}
\setvalue{\??id:\c!symbol:2}%
{\let\registerpageseparatorsymbol\space
- \def\registeronepage {\registerpagebuttonsymbol\gobblethreearguments}%
- \def\registerpagerange {\registerpagebuttonsymbol\gobblesixarguments}}
+ \def\registeronepage {\registerpagebuttonsymbol\gobblefourarguments}%
+ \def\registerpagerange {\registerpagebuttonsymbol\gobblesevenarguments}}
\def\setregisterpagerendering
- {\edef\currentregisterpagesymbol{\registerparameter\c!symbol}%
+ {\doifelse{\registerparameter\c!pagenumber}\v!no
+ {\let \currentregisterpagesymbol\v!none}
+ {\edef\currentregisterpagesymbol{\registerparameter\c!symbol}}%
\ifx\currentregisterpagesymbol\empty
\csname\??id:\c!symbol:\c!n\endcsname
\else\ifcsname\??id:\c!symbol:\currentregisterpagesymbol\endcsname
\csname\??id:\c!symbol:\currentregisterpagesymbol\endcsname
\else
\let\registerpageseparatorsymbol\space
- \def\registeronepage {\registerparameter\c!symbol\gobblethreearguments}%
- \def\registerpagerange {\registerparameter\c!symbol\gobblesixarguments}%
+ \def\registeronepage {\registerparameter\c!symbol\gobblefourarguments}%
+ \def\registerpagerange {\registerparameter\c!symbol\gobblesevenarguments}%
\fi\fi}
\appendtoks
\setregisterpagerendering
\to \everyplaceregister
-% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
-% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
-% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
-
-%D The following code will be reimplemented (not that hard) when it's needed
+%D The linked register code will be reimplemented (not that hard) when it's needed
%D again and/or when I'm bored.
-% \def\getalllistreferences#1#2%
-% {\gdefconvertexpanded\currentregisterentry{\getvalue{\??id#1\c!expansion}}{#2}%
-% \doifdefinedelse{\??id#1\??id\currentregisterentry}
-% {\edef\alllistreferences%
-% {\getvalue{\??id#1\??id\currentregisterentry}}%
-% \beforesplitstring\alllistreferences\at::\to\internallistreference
-% \aftersplitstring \alllistreferences\at::\to\alllistreferences}
-% {\let\alllistreferences\empty
-% \def\internallistreference{0}}}
-
-% \def\dosetlinkregister#1% is die page reference echt nodig?
-% {\setregisterpage{#1}%
-% \global\let\currentregisterentry\empty
-% \global\firstsubentrytrue % not needed
-% \global\firstsubsubentrytrue % not needed too
-% \setvalue{#1\s!entrya}##1{\dosetlinkregisterentrya{#1}{##1}}%
-% \setvalue{#1\s!entry }##1{\dosetpageregisterletter{#1}{##1}}}
-
-% \def\dosetlinkregisterentrya#1#2%
-% {\global\utilitydonetrue
-% \c!entryletter
-% \iflocation
-% \getalllistreferences{#1}{#2}%
-% % no \endgraf
-% \hangindent1em\noindent\c!entryreference
-% %
-% %\thisissomeinternal{\s!lin}{\internallistreference}%
-% %
-% \pagereference[-:\s!lin:\internallistreference]% -: added
-% %
-% \getcommacommandsize[\alllistreferences]%
-% \getfromcommacommand[\alllistreferences][1]%
-% \ifnum\commalistsize=1
-% \let\firstlistreference\empty
-% \let\midlistreference\commalistelement
-% \let\lastlistreference\empty
-% \else
-% \let\firstlistreference\commalistelement
-% \getfromcommacommand[\alllistreferences][\commalistsize]%
-% \let\lastlistreference\commalistelement
-% \ifnum\commalistsize=2
-% \let\midlistreference\empty
-% \else
-% \!!counta\commalistsize
-% \divide\!!counta 2
-% \getfromcommacommand[\alllistreferences][\!!counta]%
-% \let\midlistreference\commalistelement
-% \fi
-% \fi
-% % aangepast
-% \def\dodocommand[##1-##2]%
-% {\gotonextinternal{\s!ind}{##1}{##2}{\box0}}%
-% \doifelsevalue{\??id#1\c!interaction}\v!pagenumber
-% {\limitedregisterentry{#1}{#2}} % paginanummer
-% {{\setbox0\hbox{\limitedregisterentry{#1}{\begstrut#2}}%
-% \ifx\firstlistreference\empty % tekst,alles
-% \ifx\midlistreference\empty
-% \box0
-% \else
-% \expandafter\dodocommand\expandafter[\midlistreference]%
-% \fi
-% \else
-% \expandafter\dodocommand\expandafter[\firstlistreference]%
-% \fi}}%
-% \doifvalue{\??id#1\c!number}\v!yes
-% {\hskip\getvalue{\??id#1\c!distance}(\commalistsize)}%
-% \doifnotvalue{\??id#1\c!interaction}\v!text % paginanummer,alles
-% {\def\docommand##1##2%
-% {{\setbox0\hbox{\showlocation{\hbox to 1em{\hss\symbol[##2]\hss}}}%
-% \ifx##1\empty
-% % \hskip\wd0 % (optioneel maken)
-% \else
-% \expandafter\dodocommand\expandafter[##1]%
-% \fi}}%
-% \hskip\getvalue{\??id#1\c!distance}%
-% \docommand\firstlistreference\v!previous
-% \docommand\midlistreference\v!somewhere
-% \docommand\lastlistreference\v!next}%
-% % tot hier
-% \else
-% % no \endgraf
-% \noindent\c!entryreference
-% \limitedregisterentry{#1}{#2}%
-% \fi
-% \endgraf}
-
-% \def\dosetregister#1%
-% {\doifelsevalue{\??id#1\c!coupling}\v!yes
-% {\ifautoregisterhack
-% \dosetautoregister{#1}%
-% \else
-% \dosetlinkregister{#1}%
-% \fi}
-% {\dosetpageregister{#1}}}
-
-% \def\dosetregister#1%
-% {\dosetpageregister{#1}}
-
-% \newcounter\internallistreference
-
-% \def\doloadregisterlinks#1%
-% {\setregisterpage{#1}%
-% \global\let\currentregisterentry\empty
-% \global\firstregisterpagetrue
-% \setvalue{#1\s!entrya}##1%
-% {\global\firstregisterpagetrue
-% \gdefconvertedargument\currentregisterentry{##1}% global nodig?
-% \doglobal\increment\internallistreference}%
-% \setvalue{#1\s!from}%
-% {\getvalue{#1\s!page}}%
-% \ifautoregisterhack
-% \setvalue{#1\s!page}##1##2##3##4%
-% {\doifreglevelelse[##3]
-% {\global\utilitydonetrue
-% \iffirstregisterpage
-% \@EA\xdef\csname\??id#1\??id\currentregisterentry\endcsname
-% {\internallistreference::##4}%
-% \else % catches errors in index
-% \ifcsname\??id#1\??id\currentregisterentry\endcsname
-% \@EA\xdef\csname\??id#1\??id\currentregisterentry\endcsname
-% {\csname\??id#1\??id\currentregisterentry\endcsname,##4}%
-% \fi
-% \fi}
-% {}}%
-% \else
-% \setvalue{#1\s!page}##1##2##3##4%
-% {\doifreglevelelse[##3]
-% {\global\utilitydonetrue
-% \iffirstregisterpage
-% \global\firstregisterpagefalse
-% \@EA\xdef\csname\??id#1\??id\currentregisterentry\endcsname
-% {\internallistreference::##2-##4}%
-% \else % catches errors in index
-% \ifcsname\??id#1\??id\currentregisterentry\endcsname
-% \@EA\xdef\csname\??id#1\??id\currentregisterentry\endcsname
-% {\csname\??id#1\??id\currentregisterentry\endcsname,##2-##4}%
-% \fi
-% \fi}
-% {}}%
-% \fi}
-
-% \def\docoupleregister[#1][#2]%
-% {\iflocation
-% \ifcase0\countervalue{autolink:#1}\relax % only once
-% \begingroup
-% \let\dosetregister\doloadregisterlinks
-% \def\currentregister{#1}%
-% \setupregister[#1][#2]%
-% \mkloadregister\currentregister\dobeforeplaceregister\doafterplaceregister
-% \endgroup
-% \ifautoregisterhack
-% \doinitializeautoregister{#1}%
-% \else
-% \doinitializelinkregister{#1}%
-% \fi
-% \fi
-% \fi}
-
-% \def\coupleregister
-% {\dodoubleempty\docoupleregister}
-
-% \def\dodocommandprolinrefAA[#1-#2]%
-% {\def\lastlistreference{#1-#2}}
-
-% \def\dodocommandprolinrefA[#1-#2]%
-% {\def\lastlistreference{#1-#2}%
-% \ifx\firstlistreference\empty
-% \let\firstlistreference\lastlistreference
-% \fi
-% \ifnum#1<\nextinternalreference\relax
-% \let\prevlistreference\lastlistreference
-% \else\ifnum#1>\nextinternalreference\relax
-% \let\nextlistreference\lastlistreference
-% \let\dodocommandprolinrefA\dodocommandprolinrefAA
-% \else
-% \let\selflistreference\lastlistreference
-% \fi\fi}
-
-% \def\docommandprolinrefA#1%
-% {\dodocommandprolinrefA[#1]}
-
-% \def\dodocommandprolinrefB[#1-#2]%
-% {\gotonextinternal{\s!ind}{#1}{#2}{\box0}}
-
-% \def\docommandprolinrefB#1#2#3%
-% {\bgroup
-% \ifx#2\empty
-% \doifvalue{\??id#1\c!unknownreference}\v!empty{\hskip1em}%
-% \else
-% \setbox0\hbox to 1em{\hss\showlocation{\symbol[#3]}\hss}%
-% \expandafter\dodocommandprolinrefB\expandafter[#2]%
-% \fi
-% \egroup}
-
-% \def\doprocesslinkregister[#1][#2]#3%
-% {\hbox
-% {\doprocesspageregister{}{#2}{}{#3}%
-% \let\firstlistreference\empty
-% \let\lastlistreference\empty
-% \let\selflistreference\empty
-% \let\prevlistreference\empty
-% \let\nextlistreference\empty
-% \getalllistreferences{#1}{#3}%
-% \ifx\alllistreferences\empty \else
-% \normalexpanded{\noexpand\rawprocesscommalist[\alllistreferences]}\docommandprolinrefA
-% \fi
-% \ifx\prevlistreference\empty
-% \let\prevlistreference\lastlistreference
-% \fi
-% \ifx\nextlistreference\empty
-% \let\nextlistreference\firstlistreference
-% \fi
-% \ifx\prevlistreference\selflistreference
-% \let\prevlistreference\empty
-% \let\nextlistreference\empty
-% \fi
-% \setalignmentswitch{\getvalue{\??id#1\c!location}}%
-% \ifcase\alignmentswitch
-% % links
-% \docommandprolinrefB{#1}\prevlistreference\v!previous
-% \docommandprolinrefB{#1}\nextlistreference\v!next
-% \or
-% % midden
-% \docommandprolinrefB{#1}\prevlistreference\v!previous
-% \or
-% % rechts
-% \fi
-% \doifreferencefoundelse{\s!lin:\internallistreference}
-% {\gotosomeinternal
-% \s!lin \internallistreference \currentrealreference
-% {\showlocation{\limitedregisterentry{#1}{#3}}}}
-% {\hbox{\limitedregisterentry{#1}{#3}}}%
-% \ifcase\alignmentswitch
-% % links
-% \or
-% % midden
-% \docommandprolinrefB{#1}\nextlistreference\v!next
-% \or
-% % rechts
-% \docommandprolinrefB{#1}\prevlistreference\v!previous
-% \docommandprolinrefB{#1}\nextlistreference\v!next
-% \fi}}
-
-% \def\doprocesslinkedregister[#1][#2]#3% page auto link
-% {\bgroup
-% \chardef\registerpagestatus\plusone
-% \def\currentregister{#1}%
-% \iflocation % \next is not needed
-% \ifautoregisterhack
-% \def\next{\doprocessautoregister[#1][#2]}%
-% \else
-% \def\next{\doprocesslinkregister[#1][#2]}%
-% \fi
-% \else
-% \def\next{\doprocesspageregister{}{#2}{}}%
-% \fi
-% \next{#3}%
-% \egroup}
-
-% \def\dodolinkedregister[#1][#2]#3% page auto link
-% {\doflushatpar{\doprocesslinkedregister[#1][#2]{#3}}}
-
-% \def\dolinkedregister#1%
-% {\dodoubleempty\dodolinkedregister[#1]}
-
-% \def\dosetautoregister#1%
-% {\makecounter{autolink:#1}%
-% \setregisterpage{#1}%
-% \global\let\currentregisterentry\empty
-% \global\firstsubentrytrue % not needed
-% \global\firstsubsubentrytrue % not needed too
-% \setvalue{#1\s!entrya}##1{\dosetautoregisterentrya{#1}{##1}}%
-% \setvalue{#1\s!entry }##1{\dosetpageregisterletter{#1}{##1}}}
-
-% \def\dosetautoregisterentrya#1#2%
-% {\global\utilitydonetrue
-% \c!entryletter
-% \iflocation
-% \getalllistreferences{#1}{#2}%
-% \endgraf\hangindent1em\noindent\c!entryreference
-% \pagereference[-:\s!lin:\internallistreference]%
-% \pluscounter{autolink:#1}%
-% \bgroup
-% %\setupinteraction[\c!color=,\c!contrastcolor=,\c!style=]% kan sneller
-% \resetinteractionparameter\c!color
-% \resetinteractionparameter\c!contrastcolor
-% \resetinteractionparameter\c!style
-% \gotobox
-% {\limitedregisterentry{#1}{\begstrut#2}}%
-% [JS(SetRegisterEntry{\v!register,\countervalue{autolink:#1},#2,{\alllistreferences}})]%
-% \egroup
-% \else
-% \endgraf\noindent\c!entryreference
-% \limitedregisterentry{#1}{#2}%
-% \fi}
-
-% \def\doprocessautoregister[#1][#2]#3%
-% {\hbox
-% {\doprocesspageregister{}{#2}{}{#3}%
-% \doifreferencefoundelse{\s!lin:\internallistreference}
-% {\gotosomeinternal \s!lin
-% {\internallistreference}{\currentrealreference}
-% {\showlocation{\limitedregisterentry{#1}{#3}}}}
-% {\hbox{\limitedregisterentry{#1}{#3}}}}}
-
-% \appendmacro aan openpaginaactie (in shipout)
-
-%D The first implementation used one main field with clones.
-%D In a 2500 page document this resulted in a rather (anoying)
-%D long start||up time. This \quote {every page its own field}
-%D solution, combined with a \quote {page open action}, works
-%D much faster, but is conceptually pretty weak.
-
-% \def\complexregisterfield[#1]%
-% {\definefield[#1:\realfolio][line][\v!register]%
-% \field[#1:\realfolio]}
-
-% \def\simpleregisterfield
-% {\complexregisterfield[\v!register]}
-
-% \definecomplexorsimple\registerfield
-
-% \appendtoks
-% % for now
-% \setupfield
-% [\v!register]
-% [\c!width=10em,
-% \c!height=3ex,
-% \c!align=\v!middle,
-% \c!option=\v!readonly,
-% \c!location=\v!low]
-% \to \everydump
-
-% \def\doinitializeautoregister#1%
-% {\useJSscripts[reg]%
-% \useJSpreamblenow{LinkedRegisters}%
-% \setupinteraction[\c!openpageaction=JS(UpdateRegisterField{\v!register})]%
-% \definereference[\v!reset\v!register][JS(ResetRegisterEntry{\v!register})]%
-% \definereference[\v!first\v!register][JS(GotoFirstRegisterEntry{\v!register})]%
-% \definereference[\v!previous\v!register][JS(GotoPreviousRegisterEntry{\v!register})]%
-% \definereference[\v!next\v!register][JS(GotoNextRegisterEntry{\v!register})]%
-% \definereference[\v!last\v!register][JS(GotoLastRegisterEntry{\v!register})]}
-
-% \def\doinitializelinkregister#1%
-% {}
-
-% todo ruwe register
-
%D Default index:
\defineregister
[\v!index]
[\v!indices]
-% \setupregister[index][koppeling=ja]
-%
-% \stelveldenin
-% [register][achtergrond=raster,kader=uit]
-%
-% \stelvoettekstenin
-% [{\field[index]}]
-%
-% \stelhoofdtekstenin
-% [{\naar {first}[eersteindex]\quad
-% \naar{previous}[vorigeindex]\quad
-% \naar {next}[volgendeindex]\quad
-% \naar {last}[laatsteindex]\quad\quad
-% \naar {index}[index]}]
-%
-% \starttekst
-%
-% oeps~~~\gekoppeldeindex{oeps} \blanko
-% flop~~~\gekoppeldeindex{flop} \blanko
-% test~~~\gekoppeldeindex{test} \pagina
-% flop~~~\gekoppeldeindex{flop} \blanko
-% test~~~\gekoppeldeindex{test} \pagina
-% oeps~~~\gekoppeldeindex{oeps} \blanko
-% test~~~\gekoppeldeindex{test} \pagina
-% flop~~~\gekoppeldeindex{flop} \blanko
-% oeps~~~\gekoppeldeindex{oeps} \pagina
-%
-% \volledigeindex
-
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/strc-ren.mkiv b/Master/texmf-dist/tex/context/base/strc-ren.mkiv
index 3a60a34a380..73eb0ccd206 100644
--- a/Master/texmf-dist/tex/context/base/strc-ren.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-ren.mkiv
@@ -15,10 +15,8 @@
\unprotect
-\chardef\headtimingmode=0
+\newconstant\headtimingmode
-% \chardef\headtimingmode=1 % 0 also works ok now too
-%
% Martin Kolarik's problem:
%
% \setuphead[section][command=\doTitle]
@@ -32,7 +30,8 @@
\doif{\structureheadparameter\c!margintext}\v!yes\placemargincontent}
\unexpanded\def\setupheadcomponentfont#1#2%
- {\ifconditional\structureheadisdisplay
+ {\dontconvertfont
+ \ifconditional\structureheadisdisplay
\edef\askedstructureheadinterlinespace{\structureheadparameter\c!interlinespace}%
\ifx\askedstructureheadinterlinespace\empty
% here the interline space is only set when style sets no space
@@ -70,30 +69,25 @@
\ifconditional\fontattributeisset
\setupspacing
\fi
- \fi
- \dontconvertfont}
+ \fi}
-\def\doplaceheadtextcomponent#1#2%
+\def\doplaceheadtextcomponent#1%
{\begingroup
\setupheadcomponentfont\c!textstyle\c!textcolor
- % \ifcase\headtimingmode#1\fi % can introduce cr
\structureheadparameter\c!commandbefore
\placeheadmargintexts
+ \ifcsname\??nh\currentstructurehead\c!deeptextcommand\endcsname
+ \expandafter\let\expandafter\deepstructuretitlecommand\csname\??nh\currentstructurehead\c!deeptextcommand\endcsname
+ \fi
\ifconditional\structureheadisdisplay % \ifdisplaysectionhead
- \structureheadparameter\c!textcommand% struts can be nilled with \setnostrut
- {\setstrut
- \begstrut
- \ifcase\headtimingmode\hbox{#1}\fi
- \executeifdefined{\??nh\currentstructurehead\c!deeptextcommand}\firstofoneargument{#2}%
- \endstrut}% \hbox prevents break
+ % struts can be nilled with \setnostrut
+ \structureheadparameter\c!textcommand{\setstrut\begstrut#1\endstrut}%
\xdef\localheadheight {\the\strutht}%
\xdef\localheaddepth {\the\strutdp}%
\xdef\localheadlineheight{\the\lineheight}%
% == \globallet\localheaddepth\strutdepth
\else
- \ifcase\headtimingmode#1\fi
- \structureheadparameter\c!textcommand
- {\executeifdefined{\??nh\currentstructurehead\c!deeptextcommand}\firstofoneargument{#2}}%
+ \structureheadparameter\c!textcommand{#1}%
\fi
\structureheadparameter\c!commandafter
\ifconditional\structureheadisdisplay % \ifdisplaysectionhead
@@ -101,21 +95,18 @@
\fi
\endgroup}
-\def\doplaceheadnumbercomponent#1#2%
+\def\doplaceheadnumbercomponent#1%
{\begingroup
\setupheadcomponentfont\c!numberstyle\c!numbercolor
- % \getvalue{\??ko\currentstructurehead\c!commandbefore}% strange, why here? moved 21/11/2005
\placeheadmargintexts
+ \ifcsname\??nh\currentstructurehead\c!deepnumbercommand\endcsname
+ \expandafter\let\expandafter\deepstructurenumbercommand\csname\??nh\currentstructurehead\c!deeptextcommand\endcsname
+ \fi
\ifconditional\structureheadisdisplay % \ifdisplaysectionhead
% can be nilled with \setnostrut
- \structureheadparameter\c!numbercommand
- {\setstrut
- \begstrut
- \executeifdefined{\??nh\currentstructurehead\c!deepnumbercommand}\firstofoneargument{#2}%
- \endstrut}%
+ \structureheadparameter\c!numbercommand{\setstrut\begstrut#1\endstrut}%
\else
- \structureheadparameter\c!numbercommand
- {\executeifdefined{\??nh\currentstructurehead\c!deepnumbercommand}\firstofoneargument{#2}}%
+ \structureheadparameter\c!numbercommand{#1}%
\fi
\endgroup}
@@ -123,45 +114,76 @@
% \newif\ifemptyhead
% \newif\ifdisplaysectionhead
-\def\structureheadattribute{\iflocation attr \destinationattribute \currentstructureattribute\fi}
+\let\currentstructurereferenceattribute\attributeunsetvalue
+
+\def\structureheadreferenceattributes
+ {\iflocation
+ attr \destinationattribute \currentstructureattribute
+ attr \referenceattribute \currentstructurereferenceattribute
+ % attr \internalattribute \nextinternalreference
+ \fi}
-\def\doplacestructureheadtext#1#2#3% nodes, text, endstuff
+\def\setinlinestructureheadreferenceattributes
+ {\ifconditional\structureheadisdisplay \else \iflocation
+ \attribute\destinationattribute\currentstructureattribute
+ \attribute\referenceattribute \currentstructurereferenceattribute
+ % \attribute\internalattribute \nextinternalreference
+ \fi \fi}
+
+\def\docheckstructureheadreference
+ {\edef\currentstructureheadinteraction{\structureheadparameter\c!interaction}%
+ \ifx\currentstructureheadinteraction\v!list
+ % setuphead[<section>][interaction=list,...]
+ \dogetsimplepagereference{bck:\nextinternalreference}%
+ \let\currentstructurereferenceattribute\currentreferenceattribute
+ \else\ifx\currentstructureheadinteraction\v!reference
+ % setuphead[<section>][interaction=reference,...] start<section>[backreference=abc,...]
+ \edef\currentstructureheadbackreference{\structurevariable{references.backreference}}%
+ \ifx\currentstructureheadbackreference\empty \else
+ \dogetsimplepagereference\currentstructureheadbackreference
+ \let\currentstructurereferenceattribute\currentreferenceattribute
+ \fi
+ \else
+ % maybe auto: backreference when given, else list
+ \fi\fi}
+
+\unexpanded\def\placestructureheadtext
{\beginheadplacement
+ \setstructureheadmarking
\doresettructureheadnumbercontent
\ifconditional\structureheadleaveempty
- \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute to \zeropoint {#1}%
+ \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadreferenceattributes to \zeropoint{}%
\makestrutofbox\sectionheadbox
\else
- \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute
- {\doresettructureheadnumbercontent
- \ifcase\headtimingmode\or#1\fi % outerside font determines distance
+ \docheckstructureheadreference
+ \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadreferenceattributes
+ {\dosetlocalgridsnapping{\structureheadparameter\c!internalgrid}%
+ \doresettructureheadnumbercontent
\dosetfontattribute{\??nh\currentstructurehead}\c!style % but we don't want color to influence user command, todo: get the if-else out of it
- \structureheadparameter\c!command{}{\doplaceheadtextcomponent{#1}{#2}}}%
+ \setinlinestructureheadreferenceattributes
+ \structureheadparameter\c!command{}{\doplaceheadtextcomponent\getstructureheadtitle}}%
\fi
- \endheadplacement{#3}}
+ \endheadplacement{\getstructureheadsyncs}}
-\def\doplacestructureheadnumbertext#1#2#3#4% nodes number text nodes
+\unexpanded\def\placestructureheadnumbertext
{\beginheadplacement
- \doiftextelse{#2}\dosettructureheadnumbercontent\doresettructureheadnumbercontent
+ \setstructureheadmarking
+ \doiftextelse{\getstructureheadnumber}\dosettructureheadnumbercontent\doresettructureheadnumbercontent
\ifconditional\structureheadleaveempty
- \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute to \zeropoint{#1}%
+ \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadreferenceattributes to \zeropoint{}%
\makestrutofbox\sectionheadbox
\else % = needed
- \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute
- {\ifcase\headtimingmode\or#1\fi
+ \docheckstructureheadreference
+ \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadreferenceattributes
+ {\dosetlocalgridsnapping{\structureheadparameter\c!internalgrid}%
\dosetfontattribute{\??nh\currentstructurehead}\c!style
- \structureheadparameter\c!command{\doplaceheadnumbercomponent{#1}{#2}}{\doplaceheadtextcomponent{#1}{#3}}}%
+ \setinlinestructureheadreferenceattributes
+ \structureheadparameter\c!command{\doplaceheadnumbercomponent\getstructureheadnumber}{\doplaceheadtextcomponent\getstructureheadtitle}}%
\fi
- \endheadplacement{#4}}
-
-\unexpanded\def\placestructureheadnumbertext
- {\doplacestructureheadnumbertext\empty\getstructureheadnumber\getstructureheadtitle\getstructureheadsyncs}
-
-\unexpanded\def\placestructureheadtext
- {\doplacestructureheadtext\empty\getstructureheadtitle\getstructureheadsyncs}
+ \endheadplacement{\getstructureheadsyncs}}
\unexpanded\def\placestructureheadempty
- {\hbox \structureheadattribute {\getstructureheadsyncs}}
+ {\hbox \structureheadreferenceattributes {\getstructureheadsyncs}}
%D \starttyping
%D \def\StretchedBox#1%
@@ -214,7 +236,7 @@
\iflocation
\ifconditional\structureheadisdisplay % \ifdisplaysectionhead
\else
- \noninterferingmarks
+ % obsolete: \noninterferingmarks
\fi
\fi
\resetinteractionparameter\c!style
@@ -353,11 +375,6 @@
\def\presetnumberheadalternative
{\doifelsevalue{\??ns:\numberheadalternative}\v!horizontal\setfalse\settrue\structureheadisdisplay}
-% \def\normalplacehead
-% {\executeifdefined
-% {\??ns::\numberheadalternative}
-% {\getvalue{\??ns::\v!normal}}}
-
\def\normalplacehead
{\csname\??ns::\ifcsname\??ns::\numberheadalternative\endcsname\numberheadalternative\else\v!normal\fi\endcsname}
@@ -370,23 +387,6 @@
\fi
#2}}
-% \defineheadplacement[\v!normal][\v!vertical]#1#2%
-% {\ifconditional\structureheadshownumber % \ifheadnumbercontent
-% \setbox0\hbox{{#1}\hskip\numberheaddistance}%
-% \vbox
-% {\localheadsetup
-% \hangindent 1\wd0
-% \hangafter 1
-% \noindent
-% \unhbox0 % don't use \strut's here!
-% #2}%
-% \else
-% \vbox
-% {\localheadsetup\noindent#2}%
-% \fi}
-%
-% enhanced version:
-
% \setuphead
% [chapter]
% [numberwidth=2cm,hang=line,after={\blank[3*line]}]
@@ -400,7 +400,7 @@
\edef\headwidth {\structureheadparameter\c!width }%
\edef\headnumberwidth{\structureheadparameter\c!numberwidth}%
\edef\headtextwidth {\structureheadparameter\c!textwidth }%
- \ifconditional\structureheadshownumber % \ifheadnumbercontent
+ \ifconditional\structureheadshownumber
\ifx\headwidth\empty
\else
\ifx\headnumberwidth\empty
@@ -444,8 +444,8 @@
{\localheadsetup
\begstrut % use one \strut here!
\dontleavehmode % in case there is no strut, else side effects with llap
- \ifconditional\structureheadshownumber % \ifheadnumbercontent
- \llap{\hbox to 5em{\hfill{#1}\hskip\localheadskip\hskip\leftmargindistance}}% introduces whitespace
+ \ifconditional\structureheadshownumber
+ \llap{\hbox{\hfill{#1}\hskip\localheadskip\hskip\leftmargindistance}}% introduces whitespace
% maybe better:
% \inleftmargin{\hbox{\hss{#1}\hskip\localheadskip}}%
\fi
@@ -460,7 +460,7 @@
\veryraggedcenter
\let\\\endgraf
\let\crlf\endgraf
- \ifconditional\structureheadshownumber % \ifheadnumbercontent
+ \ifconditional\structureheadshownumber
\strut#1\par
\fi
\begstrut#2}}
@@ -468,14 +468,14 @@
\defineheadplacement[\v!text][\v!horizontal]#1#2%
{\bgroup
\localheadsetup % no stretch in distance
- \ifconditional\structureheadshownumber % \ifheadnumbercontent
+ \ifconditional\structureheadshownumber
{#1}\kern\numberheaddistance
\fi
{\begstrut#2}%
\egroup}
\unexpanded\def\placeheadlohi#1#2#3%
- {\ifconditional\structureheadshownumber % \ifheadnumbercontent
+ {\ifconditional\structureheadshownumber
\setbox0\hbox{#2}
\setbox2=#1{\localheadsetup\advance\hsize-\wd0\relax#3}%
\hbox{\box0\hskip\numberheaddistance\box2}%
@@ -489,4 +489,24 @@
\defineheadplacement[\v!bottom][\v!vertical]#1#2{\placeheadlohi\vbox{#1}{#2}}
\defineheadplacement[\v!top] [\v!vertical]#1#2{\placeheadlohi\vtop{#1}{#2}}
+% helpers
+
+% \defineinmargin [ChapterInMargin] [outer] [normal] [distance=0.3em]
+%
+% \defineheadplacement[MyTest][horizontal]#1#2%
+% {\startlocalheadsetup
+% %\ChapterInMargin{\structureheadhbox{\strut#2}}% proper destination, ref okay
+% \ChapterInMargin{\strut#2}% zero destination, ref okay
+% \stoplocalheadsetup}
+%
+% \setuphead
+% [chapter]
+% [alternative=MyTest]
+
+\unexpanded\def\structureheadhbox{\hbox\structureheadreferenceattributes}
+\unexpanded\def\structureheadvbox{\vbox\structureheadreferenceattributes}
+
+\unexpanded\def\startlocalheadsetup{\bgroup\localheadsetup}
+\unexpanded\def\stoplocalheadsetup {\egroup}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/strc-sbe.mkiv b/Master/texmf-dist/tex/context/base/strc-sbe.mkiv
index 206ac8a9c4f..e9d8d9c1ae1 100644
--- a/Master/texmf-dist/tex/context/base/strc-sbe.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-sbe.mkiv
@@ -56,31 +56,37 @@
\setvalue {\e!start#2}{\startstructureblock[#1]}%
\setvalue {\e!stop #2}{\stopstructureblock}}
+\ifdefined \resetallstructuremarks \else
+ \let\resetallstructuremarks\relax
+\fi
+
\appendtoks
\doifsomething{\structureblockparameter\c!page}{\page[\structureblockparameter\c!page]}%
-% TODO \resetsectionmarks\zerosection
+ \resetallstructuremarks
\getstructureblockenvironment\currentstructureblock
\structureblockparameter\c!before % don't move
+ \dostarttagged\t!division\currentstructureblock
\to \everybeforestructureblock
\appendtoks
\structureblockparameter\c!after % don't move
\doifsomething{\structureblockparameter\c!page}{\page[\structureblockparameter\c!page]}%
-% TODO \resetsectionmarks\zerosection
+ \dostoptagged
+ \resetallstructuremarks
\to \everyafterstructureblock
\def\dosetupstructureblock[#1]%
{\getparameters[\??nb#1]}% [#2]
\def\dosetstructureblock[#1]% used to set the default
- {\edef\currentstructureblock{\ctxlua{structure.sections.setblock("#1")}}}
+ {\edef\currentstructureblock{\ctxlua{structures.sections.setblock("#1")}}}
\let\currentstructureblock\s!unknown
\unexpanded\def\startstructureblock[#1]%
- {%\ctxlua{structure.counters.check(0)}% we assume sane usage of \page, as this is the only workable place (in push)
+ {%\ctxlua{structures.counters.check(0)}% we assume sane usage of \page, as this is the only workable place (in push)
\begingroup
- \edef\currentstructureblock{\ctxlua{structure.sections.pushblock("#1")}}%
+ \edef\currentstructureblock{\ctxlua{structures.sections.pushblock("#1")}}%
\csname #1true\endcsname % for old times sake
\setsystemmode\currentstructureblock
\the\everybeforestructureblock\relax
@@ -89,7 +95,7 @@
\unexpanded\def\stopstructureblock
{\showmessage\m!structures2\currentstructureblock
\the\everyafterstructureblock\relax
- \edef\currentstructureblock{\ctxlua{structure.sections.popblock()}}%
+ \edef\currentstructureblock{\ctxlua{structures.sections.popblock()}}%
\endgroup}
\long\def\setstructureblockenvironment#1#2%
diff --git a/Master/texmf-dist/tex/context/base/strc-sec.mkiv b/Master/texmf-dist/tex/context/base/strc-sec.mkiv
index 35927d98a00..6cb6f84c142 100644
--- a/Master/texmf-dist/tex/context/base/strc-sec.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-sec.mkiv
@@ -15,6 +15,8 @@
\unprotect
+\ifdefined \v!block \else \def\v!block{block} \fi
+
% compatibility issue:
%
% \def\setfullsectionnumber #1{}
@@ -41,25 +43,26 @@
% lua interface / names and interface might change
-\def\setstructurelevel #1#2{\ctxlua{structure.sections.setlevel("#1","#2")}} % name, level|parent
-\def\getstructurelevel #1{\ctxlua{structure.sections.getcurrentlevel("#1")}}% name
-\def\setstructurenumber #1#2{\ctxlua{structure.sections.setnumber(#1,"#2")}} % level, number (+/-)
-\def\getstructurenumber #1{\ctxlua{structure.sections.getnumber(#1)}} % level
-\def\getsomestructurenumber #1#2{\ctxlua{structure.sections.getnumber(#1,"#2")}} % level, what
-\def\getfullstructurenumber #1{\ctxlua{structure.sections.fullnumber(#1)}} % level
-\def\getsomefullstructurenumber#1#2{\ctxlua{structure.sections.fullnumber(#1,"#2")}}
-\def\getspecificstructuretitle #1{\ctxlua{structure.sections.structuredata(#1,"titledata.title",nil,"\structureheadparameter\s!catcodes")}}%
+\def\setstructurelevel #1#2{\ctxlua{structures.sections.setlevel("#1","#2")}} % name, level|parent
+\def\getstructurelevel #1{\ctxlua{structures.sections.getcurrentlevel("#1")}}% name
+\def\setstructurenumber #1#2{\ctxlua{structures.sections.setnumber(#1,"#2")}} % level, number (+/-)
+\def\getstructurenumber #1{\ctxlua{structures.sections.getnumber(#1)}} % level
+\def\getsomestructurenumber #1#2{\ctxlua{structures.sections.getnumber(#1,"#2")}} % level, what
+\def\getfullstructurenumber #1{\ctxlua{structures.sections.fullnumber(#1)}} % level
+\def\getsomefullstructurenumber#1#2{\ctxlua{structures.sections.fullnumber(#1,"#2")}}
+\def\getspecificstructuretitle #1{\ctxlua{structures.sections.structuredata(#1,"titledata.title",nil,"\structureheadparameter\s!catcodes")}}%
% interface
-\def\structureheadparameter #1{\csname\dostructureheadparameter{\??nh\currentstructurehead}#1\endcsname}
-\def\structureheadparameterhash#1{\dostructureheadparameterhash {\??nh\currentstructurehead}#1}
+\def\structureheadparameter #1{\csname\dostructureheadparameter{\??nh\currentstructurehead}{#1}\endcsname}
+\def\structureheadparameterhash #1{\dostructureheadparameterhash {\??nh\currentstructurehead}{#1}}
+\def\namedstructureheadparameter#1#2{\csname\dostructureheadparameter{\??nh#1}{#2}\endcsname}
-\def\dostructureheadparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dostructureheadparentparameter \csname#1\s!parent\endcsname#2\fi}
-\def\dostructureheadparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dostructureheadparentparameterhash\csname#1\s!parent\endcsname#2\fi}
+\def\dostructureheadparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\dostructureheadparentparameter \csname#1\s!parent\endcsname{#2}\fi}
+\def\dostructureheadparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\dostructureheadparentparameterhash\csname#1\s!parent\endcsname{#2}\fi}
-\def\dostructureheadparentparameter #1#2{\ifx#1\relax\s!empty\else\dostructureheadparameter #1#2\fi}
-\def\dostructureheadparentparameterhash#1#2{\ifx#1\relax \else\dostructureheadparameterhash#1#2\fi}
+\def\dostructureheadparentparameter #1#2{\ifx#1\relax\s!empty\else\dostructureheadparameter #1{#2}\fi}
+\def\dostructureheadparentparameterhash#1#2{\ifx#1\relax \else\dostructureheadparameterhash#1{#2}\fi}
\def\structureheadparameterstrict#1{\csname\ifcsname\??nh\currentstructurehead#1\endcsname\??nh\currentstructurehead#1\else\s!empty\fi\endcsname}
@@ -75,28 +78,64 @@
\let\laststructuresectionname\empty
+\let\resetallstructuremarks \relax
+\let\resetcurrentstructuremarks \relax
+\let\resetcurrentstructuremarkswithpage\relax
+
+\def\resetallstructuremarks {\resetmarking[\v!section-1]} % will become option
+\def\resetcurrentstructuremarks {\resetmarking[\laststructuresectionname]} % will become option
+%def\resetcurrentstructuremarkswithpage{\resetmarking[\laststructuresectionname]} % will become option
+
+% \c!before=,
+% \c!after=,
+% \c!distance=\zeropoint,
+% \c!page=,
+% \c!header=,
+% \c!text=,
+% \c!footer=,
+% \c!numbercommand=,
+% \c!textcommand=,
+% \c!ownnumber=\v!no,
+% \c!number=\v!yes,
+% \c!file=,
+% \c!expansion=,
+% \c!grid=,
+% \c!margintext=,
+%
+% \c!xmlsetup=,
+% \s!catcodes=,
+
+\newtoks\everydefinestructuresection
+
+\appendtoks
+ % This is a rather practical default that we don't want to
+ % be part of the parent chain lookup mechanism; it's also
+ % mkii compatible. Somewhat weird that it's part of the
+ % top level structure but it will be flattened anyway.
+ \getparameters[\??nh\currentstructuresection]
+ [ \c!textstyle=\structureheadparameterstrict\c!style,
+ \c!textcolor=\structureheadparameterstrict\c!color,
+ \c!numberstyle=\structureheadparameterstrict\c!style,
+ \c!numbercolor=\structureheadparameterstrict\c!color]%
+\to \everydefinestructuresection
+
\unexpanded\def\definestructuresection[#1]%
- {\doifundefined{\??nh#1}
- {\global\advance\maxstructuredepth\plusone
- \setevalue{\??nh#1\c!level}{\the\maxstructuredepth}%
- \setstructurelevel{#1}{\the\maxstructuredepth}%
-% \letvalue{\??nh#1\c!marking}\empty % ?
- %\writestatus{structure}{#1\ifx\laststructuresectionname\empty\else\space->\space\laststructuresectionname\fi}%
- \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\??nh\laststructuresectionname]}%
- % this is a rather practical default that we don't want to be part of the parent chain
- % lookup mechanism; it's also mkii compativle; this might become \everystructureheaddefine
- \getparameters[\??nh#1]
- [ \c!textstyle=\structureheadparameterstrict\c!style,
- \c!textcolor=\structureheadparameterstrict\c!color,
- \c!numberstyle=\structureheadparameterstrict\c!style,
- \c!numbercolor=\structureheadparameterstrict\c!color]%
- % so far for these default inheritances
- \definemarking[#1]%
- \ifnum\maxstructuredepth>\plusone
-% \normalexpanded{\noexpand\couplemarking[#1][\laststructuresectionname]}% so, the child inherits settings from the parent
- \normalexpanded{\noexpand\relatemarking[#1][\laststructuresectionname]}% so, the parent will reset the child
- \fi
- \xdef\laststructuresectionname{#1}}}
+ {\ifcsname\??nh#1\endcsname
+ % redefinition is a rather fatal error
+ \else
+ \edef\currentstructuresection{#1}%
+ \global\advance\maxstructuredepth\plusone
+ \setevalue{\??nh#1\c!level}{\the\maxstructuredepth}%
+ \setstructurelevel{#1}{\the\maxstructuredepth}%
+ \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\??nh\laststructuresectionname]}%
+ \the\everydefinestructuresection
+ % so far for these default inheritances
+ \definemarking[#1]%
+ \ifnum\maxstructuredepth>\plusone
+ \normalexpanded{\noexpand\relatemarking[#1][\laststructuresectionname]}% so, the parent will reset the child
+ \fi
+ \xdef\laststructuresectionname{#1}%
+ \fi}
\unexpanded\def\setupstructuresection
{\dotripleempty\dosetupstructuresection}
@@ -113,10 +152,14 @@
\getparameters[\??nh#1][#2]%
\fi}
+% -2=text -1=manual 0=block 1+=structurelevel
+
\def\structuresectionlevel#1%
{\executeifdefined{\??nh#1\c!level}{-1}}
-\setvalue{\??nh block\c!level}{0} % -1 == manual
+\setvalue{\??nh\v!block\c!level}{0}
+\setvalue{\??nh\v!none \c!level}{-1}
+\setvalue{\??nh\v!text \c!level}{-2}
% head -> structurehead
@@ -166,30 +209,24 @@
\edef\currentstructureheaddefault{\structureheadparameter\c!default}%
\edef\currentstructureheadsection{\structureheadparameter\c!section}%
\edef\currentstructureheadparent
- {\??nh
- \ifx\currentstructurehead\currentstructureheaddefault
+ {\ifx\currentstructurehead\currentstructureheaddefault
\currentstructureheadsection
\else\ifx\currentstructureheaddefault\empty
\currentstructureheadsection
\else
\currentstructureheaddefault
\fi\fi}%
- \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\currentstructureheadparent]}% \setevalue{\??nh#1\s!parent}{\currentstructureheadparent}%
- \ifx\currentstructureheadsection\empty
- %\writestatus{structure}{#1->\currentstructureheadparent}%
- \else
- %\writestatus{structure}{#1->\currentstructureheadparent\space(\currentstructureheadsection)}%
- % todo: filtercommand
- \definemarking[#1][\currentstructureheadsection]%
- \definemarking[#1\v!number][#1]%
- \setupmarking[#1][\c!filtercommand=\sectionheadmarkingtitle{#1}]%
- \setupmarking[#1\c!number][\c!filtercommand=\sectionheadmarkingnumber{#1}]%
- \fi
+ \normalexpanded{\noexpand\getparameters[\??nh#1][\s!parent=\??nh\currentstructureheadparent]}%
+ % or just \setevalue{\??nh#1\s!parent}{\??nh\currentstructureheadparent}%
+ \definemarking[#1] [\currentstructureheadsection]%
+ \definemarking[#1\v!number][\currentstructureheadsection]%
+ \setupmarking [#1] [\c!filtercommand=\sectionheadmarkingtitle {#1}]%
+ \setupmarking [#1\c!number][\c!filtercommand=\sectionheadmarkingnumber{#1}]%
\doifundefined{\??li#1}{\definelist[#1][\c!prefix=\v!no]}% definestructurelist ?
\the\everystructureheadsetup}
-\def\sectionheadmarkingtitle #1#2{\ctxlua{structure.marks.title("#1","#2")}}
-\def\sectionheadmarkingnumber#1#2{\ctxlua{structure.marks.number("#1","#2")}}
+\def\sectionheadmarkingtitle #1#2{\ctxlua{structures.marks.title("#1","#2")}}
+\def\sectionheadmarkingnumber#1#2{\ctxlua{structures.marks.number("#1","#2")}}
\def\dodefineclonedstructurehead#1#2% class parent
{\def\currentstructurehead{#1}%
@@ -198,20 +235,19 @@
{\getparameters[\??nh#1][\c!label=#1]%
\doifundefined{\??li#1}{\definelist[#1][\c!prefix=\v!no]}}% definestructurelist ?
{\getparameters[\??nh#1][\s!parent=\??nh#2,\c!label=#1,\c!coupling=#2]%
- \definemarking[#1][#2]%
+ \definemarking[#1] [#2]%
\definemarking[#1\v!number][#2\c!number]%
\doifundefined{\??li#1}{\definelist[#1][#2][\c!prefix=\v!no]}}% definestructurelist ?
\the\everystructureheadsetup}
\appendtoks
-% \setstructurelevel\currentstructurehead{\structuresectionheadsection{\structuresectionheadcoupling\currentstructurehead}}%
\setstructurelevel\currentstructurehead{\thenamedstructureheadlevel\currentstructurehead}%
\doifelse{\structureheadparameter\c!ownnumber}\v!yes
- {\setevalue\currentstructurehead{\noexpand\dohandlestructureheadown[\currentstructurehead]}}
- {\setevalue\currentstructurehead{\noexpand\dohandlestructureheadnop[\currentstructurehead]}}%
- \setevalue{\e!next \currentstructurehead}{\noexpand\donextstructurehead [\currentstructurehead]}%
- \setevalue{\e!start\currentstructurehead}{\noexpand\dostartstructurehead[\currentstructurehead]}%
- \setevalue{\e!stop \currentstructurehead}{\noexpand\dostopstructurehead [\currentstructurehead]}%
+ {\setevalue\currentstructurehead{\dohandlestructureheadown[\currentstructurehead]}}
+ {\setevalue\currentstructurehead{\dohandlestructureheadnop[\currentstructurehead]}}%
+ \setevalue{\e!next \currentstructurehead}{\donextstructurehead [\currentstructurehead]}%
+ \setevalue{\e!start\currentstructurehead}{\dostartstructurehead[\currentstructurehead]}%
+ \setevalue{\e!stop \currentstructurehead}{\dostopstructurehead [\currentstructurehead]}%
\to \everystructureheadsetup
% todo, check if section is defined
@@ -228,36 +264,49 @@
% head construction
-\def\dohandlestructureheadown{\dodoubleempty\dodohandlestructureheadown} % [ref] {nr} {title}
-\def\dohandlestructureheadnop{\dodoubleempty\dodohandlestructureheadnop} % [ref] {title}
-\def\dostartstructurehead {\dotripleempty\dodostartstructurehead} % [settings] [userdata]
+\unexpanded\def\dohandlestructureheadown{\dodoubleempty\dodohandlestructureheadown} % [ref] {nr} {title}
+\unexpanded\def\dohandlestructureheadnop{\dodoubleempty\dodohandlestructureheadnop} % [ref] {title}
+\unexpanded\def\dostartstructurehead {\dotripleempty\dodostartstructurehead} % [settings] [userdata]
\newconditional\currentstructureown
-\def\dodohandlestructureheadown[#1][#2]#3#4%
+\newtoks\everybeforestructurehead % hook, todo: before/after keys
+\newtoks\everyafterstructurehead % hook, todo: before/after keys
+
+\unexpanded\def\dodohandlestructureheadown[#1][#2]#3#4%
{\settrue\currentstructureown
\dohandlestructurehead{#1}{\c!reference={#2},\c!ownnumber={#3},\c!title={#4}}{}} % name ref nr title --
-\def\dodohandlestructureheadnop[#1][#2]#3%
+% \unexpanded\def\dodohandlestructureheadnop[#1][#2]#3%
+% {\setfalse\currentstructureown
+% \dohandlestructurehead{#1}{\c!reference={#2},\c!title={#3}}{}} % name ref nr title --
+
+\unexpanded\def\dodohandlestructureheadnop[#1][#2]% for taco: [key=value] variant
{\setfalse\currentstructureown
- \dohandlestructurehead{#1}{\c!reference={#2},\c!title={#3}}{}} % name ref nr title --
+ \doifassignmentelse{#2}\dodohandlestructureheadnopA\dodohandlestructureheadnopB{#1}{#2}}
-\newtoks\everybeforestructurehead % hook, todo: before/after keys
-\newtoks\everyafterstructurehead % hook, todo: before/after keys
+\unexpanded\def\dodohandlestructureheadnopA#1#2%
+ {\dohandlestructurehead{#1}{#2}{}}
+
+\unexpanded\def\dodohandlestructureheadnopB#1#2#3%
+ {\dohandlestructurehead{#1}{\c!reference={#2},\c!title={#3}}{}} % name ref nr title --
-\def\dodostartstructurehead[#1][#2][#3]% for the moment no grouping, too annoying with page breaks
+\unexpanded\def\dodostartstructurehead[#1][#2][#3]% for the moment no grouping, too annoying with page breaks
{\setfalse\currentstructureown
%\globalpushmacro\currentstructurehead
\xdef\currentstructurehead{#1}%
+ \structureheadparameter\c!beforesection
\the\everybeforestructurehead
- \dohandlestructurehead{#1}{#2}{#3}} % name -- -- -- userdata
+ \dohandlestructurehead{#1}{#2}{#3}} % name -- -- -- userdata (we might move the tagged to here)
-\def\dostopstructurehead[#1]%
- {%\globalpopmacro\currentstructurehead
+\unexpanded\def\dostopstructurehead[#1]%
+ {\dostoptagged\dostoptagged
+ %\globalpopmacro\currentstructurehead
\xdef\currentstructurehead{#1}% recover
+ \structureheadparameter\c!aftersection
\the\everyafterstructurehead}
-\def\donextstructurehead[#1][#2][#3]%
+\unexpanded\def\donextstructurehead[#1][#2][#3]%
{\setfalse\currentstructureown
\xdef\currentstructurehead{#1}%
\dohandlestructurehead{#1}{#2}{#3}} % name -- -- -- userdata
@@ -275,22 +324,35 @@
\let\structureheadprefix\empty \def\structureheadprefixplus{+}
% When do we reset the referenceprefix? This needs to be checked. Does it work
-% at all?
+% at all? Todo: pushpop.
+
+% \def\setstructureheadreference
+% {\edef\structureheadreference {\structureheadparameter\c!reference}%
+% \edef\structureheadreferenceprefix{\structureheadparameter\c!prefix}%
+% \ifx\structureheadreferenceprefix\empty
+% \ifx\currentrefenceprefix\structureheadreferenceprefixplus
+% \setupreferenceprefix[]% yes or no? only when set by structure
+% \fi
+% \else\ifx\structureheadreferenceprefix\structureheadreferenceprefixplus
+% \ifx\structureheadreference\empty
+% \expanded{\setupreferenceprefix[\structureheadreferenceprefixplus]}%
+% \else
+% \expanded{\setupreferenceprefix[\structureheadreference]}% we assume just one reference
+% \fi
+% \else
+% \expanded{\setupreferenceprefix[\structureheadreferenceprefix]}%
+% \fi\fi}
-\def\setstructureheadreference#1% reference
- {\edef\structureheadreference{#1}%
+% pop in stopsection commands unless empty
+
+\def\setstructureheadreference
+ {\edef\structureheadreference {\structureheadparameter\c!reference}%
\edef\structureheadreferenceprefix{\structureheadparameter\c!prefix}%
\ifx\structureheadreferenceprefix\empty
- \setupreferenceprefix[]% yes or no?
- \else\ifx\structureheadreferenceprefix\structureheadreferenceprefixplus
- \ifx\structureheadreference\empty
- \setupreferenceprefix[\structureheadreferenceprefixplus]
- \else
- \setupreferenceprefix[#1]% we assume just one reference
- \fi
+ \let\structureheadreferenceprefix\referenceprefix
\else
- \setupreferenceprefix[\structureheadreferenceprefix]%
- \fi\fi}
+ \setupreferenceprefix[\structureheadreferenceprefix]% currenty no pop
+ \fi}
\setvalue{\??nh:\c!incrementnumber:\v!yes }{\settrue \structureheaddoincrement\settrue \structureheadtolist}
\setvalue{\??nh:\c!incrementnumber:\v!no }{\setfalse\structureheaddoincrement\setfalse\structureheadtolist}
@@ -314,16 +376,41 @@
% use : \currentstructureheadincrement as spec
\fi}
+% \def\setstructureheadplacement
+% {\setfalse\structureheadleaveempty
+% \settrue \structureheaddoplace
+% \setfalse\structureheadhidden
+% \processaction
+% [\structureheadparameter\c!placehead]
+% [ \v!yes=>,
+% \v!empty=>\settrue\structureheadleaveempty,
+% \v!no=>\settrue\structureheadleaveempty\setfalse\structureheaddoplace,
+% \v!hidden=>\settrue\structureheadleaveempty\setfalse\structureheaddoplace\settrue\structureheadhidden]}
+
+\setvalue{\??nh:\c!placehead:\v!yes}%
+ {\setfalse\structureheadleaveempty
+ \settrue \structureheaddoplace
+ \setfalse\structureheadhidden}
+
+\setvalue{\??nh:\c!placehead:\v!empty}%
+ {\settrue \structureheadleaveempty
+ \settrue \structureheaddoplace
+ \setfalse\structureheadhidden}
+
+\setvalue{\??nh:\c!placehead:\v!no}%
+ {\settrue \structureheadleaveempty
+ \setfalse\structureheaddoplace
+ \setfalse\structureheadhidden}
+
+\setvalue{\??nh:\c!placehead:\v!hidden}%
+ {\settrue \structureheadleaveempty
+ \setfalse\structureheaddoplace
+ \settrue \structureheadhidden}
+
\def\setstructureheadplacement
- {\settrue\structureheaddoplace
- \setfalse\structureheadleaveempty
- \setfalse\structureheadhidden
- \processaction
- [\structureheadparameter\c!placehead]
- [ \v!yes=>,
- \v!empty=>\settrue\structureheadleaveempty,
- \v!no=>\settrue\structureheadleaveempty\setfalse\structureheaddoplace,
- \v!hidden=>\settrue\structureheadhidden\settrue\structureheadleaveempty\setfalse\structureheaddoplace]}
+ {\executeifdefined
+ {\??nh:\c!placehead:\structureheadparameter\c!placehead}
+ {\getvalue{\??nh:\c!placehead:\v!yes}}}
\def\setstructureheaddisplay
{\doifelsevalue{\??nh:\structureheadparameter\c!alternative}\v!horizontal
@@ -351,15 +438,38 @@
\unexpanded\def\thestructureheadsynchonization
{\pagetype[\currentstructureheadcoupling]% hm also number
- \normalexpanded{\noexpand\setmarking[\currentstructureheadcoupling]{\currentstructurelistnumber}}%
\currentstructuresynchronize}
-\unexpanded\def\fullstructureheadnumber{\labeltexts{\structureheadparameter\c!label}{\structurenumber}} % todo
+\unexpanded\def\setstructureheadmarking
+ {\normalexpanded{\noexpand\setmarking[\currentstructurehead]{\currentstructurelistnumber}}}
+% \unexpanded\def\fullstructureheadnumber{\labeltexts{\structureheadparameter\c!label}{\structurenumber}} % todo
% \def\fullstructureheadtitle {\structurevariable{titledata.title}} % no catcode!
% \unexpanded\def\fullstructureheadtitle{\structureautocatcodedget{titledata.title}{\structureheadparameter\s!catcodes}}
-\unexpanded\def\fullstructureheadtitle{\ctxlua{structure.sections.title()}}
+\let\deepstructurenumbercommand\relax
+\let\deepstructuretitlecommand \relax
+
+\unexpanded\def\fullstructureheadnumber
+ {\edef\currentstructureheadlabeltag{\currentstructureblock\c!label}%
+ \dostarttagged\t!sectionnumber\empty
+ \labeltexts
+ {\structureheadparameter\currentstructureheadlabeltag}
+ {\ifx\deepstructurenumbercommand\relax
+ \structurenumber
+ \else
+ \normalexpanded{\noexpand\deepstructurenumbercommand{\structurenumber}}%
+ \fi}%
+ \dostoptagged}
+
+\unexpanded\def\fullstructureheadtitle
+ {\dostarttagged\t!sectiontitle\empty
+ \ifx\deepstructuretitlecommand\relax
+ \structuretitle
+ \else
+ \normalexpanded{\noexpand\deepstructuretitlecommand{\structuretitle}}%
+ \fi
+ \dostoptagged}
\let\currentstructurehead \empty
\let\currentstructureheadcoupling\empty
@@ -367,9 +477,12 @@
\let\currentstructureheadlevel \!!zerocount
\let\currentstructureheadcounter \!!zerocount
+% here we could inherit as well but it's a bit complex
+
\def\doregisterstructurehead#1#2#3% name data userdata
{\structurecomponent
- [\c!label={\structureheadparameter\c!label},
+ %[\c!label={\structureheadparameter\c!label}, % why { }
+ [\c!label={\structureheadparameter{\currentstructureblock\c!label}},
\c!incrementnumber=\ifconditional\structureheaddoincrement\v!yes\else\v!no\fi, % not that needed
\c!saveinlist=\ifconditional\structureheadtolist\v!yes\else\v!no\fi,
\c!level=\currentstructureheadlevel,
@@ -391,10 +504,11 @@
\c!sectionsegments=\structureheadparameter\c!sectionsegments,
\c!reference=\structureheadreference,
\c!referenceprefix=\structureheadreferenceprefix,
+ \c!backreference=,
\c!command=,
#2]%
[#3]%
- \reportcurrentstructure}
+ \reportcurrentstructure}
\unexpanded\def\placeheadtext {\dosingleempty\doplaceheadtext } % use with care
\unexpanded\def\placeheadnumber{\dosingleempty\doplaceheadnumber} % use with care
@@ -402,9 +516,9 @@
\ifdefined\setupheadcomponentfont \else
\unexpanded\def\setupheadcomponentfont#1#2%
- {\dosetstructureheadattributes\c!style\c!color
+ {\dontconvertfont
+ \dosetstructureheadattributes\c!style\c!color
\dosetstructureheadattributes#1#2%
- \dontconvertfont
\setupinterlinespace}
\fi
@@ -431,14 +545,14 @@
\ifdefined \else \let\presetnumberheadalternative\relax \fi
-\def\dohandlestructurehead#1#2#3% name data userdata
+\def\dohandlestructurehead#1#2#3% name data userdata (we can move #1 to the caller)
{\xdef\currentstructurehead {#1}%
\xdef\currentstructureheadcoupling{\structuresectionheadcoupling\currentstructurehead}%
\xdef\currentstructureheadsection {\structuresectionheadsection \currentstructureheadcoupling}%
\xdef\currentstructureheadlevel {\structuresectionlevel \currentstructureheadsection}%
- %writestatus\m!systems{setup: \currentstructurehead,\currentstructureheadcoupling,\currentstructureheadsection,\currentstructureheadlevel}%
+ %writestatus\m!system{setup: \currentstructurehead,\currentstructureheadcoupling,\currentstructureheadsection,\currentstructureheadlevel}%
%
- \setstructureheadreference{#3}% will change
+ \setstructureheadreference % does not do much currently
\setstructureheadincrement
\setstructureheadplacement
\setstructureheaddisplay
@@ -451,7 +565,7 @@
%
% we might remove the lower level
%
- % not here, after optional \page: \doregisterstructurehead{#1}{#2}{#3}%
+ % not here, after optional \page: \doregisterstructurehead\currentstructurehead{#2}{#3}%
%
% \xdef\currentstructureheadcounter{\currentstructurecounter}% lua call
%
@@ -467,7 +581,7 @@
\ifconditional\structureheaddoincrement
\ifconditional\structureheaddoplace
\dostructureheadspacingbeforeyes
- \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \doregisterstructurehead\currentstructurehead{#2}{#3}% after optional \page
\let\getstructureheadsyncs\thestructureheadsynchonization
\let\getstructureheadtitle\fullstructureheadtitle
\ifconditional\structureheadshownumber
@@ -478,12 +592,12 @@
\fi
\dostructureheadspacingafteryes
\else\ifconditional\structureheadhidden
- \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \doregisterstructurehead\currentstructurehead{#2}{#3}% after optional \page
\let\getstructureheadsyncs\thestructureheadsynchonization
\placestructureheadhidden % only something when tracing
\else
\dostructureheadspacingbeforenop % toegevoegd ivm subpaginanr / tug sheets
- \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \doregisterstructurehead\currentstructurehead{#2}{#3}% after optional \page
\let\getstructureheadsyncs\thestructureheadsynchonization
\placestructureheadempty % just flush 'm
\dostructureheadspacingafternop
@@ -491,19 +605,19 @@
\else
\ifconditional\structureheaddoplace
\dostructureheadspacingbeforeyes
- \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \doregisterstructurehead\currentstructurehead{#2}{#3}% after optional \page
\let\getstructureheadsyncs\thestructureheadsynchonization
\let\getstructureheadtitle\fullstructureheadtitle
\placestructureheadtext
\dostructureheadspacingafteryes
\else\ifconditional\structureheadhidden
- \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \doregisterstructurehead\currentstructurehead{#2}{#3}% after optional \page
\let\getstructureheadsyncs\thestructureheadsynchonization
\placestructureheadhidden % only something when tracing
\else
% do nothing / should be vbox to 0pt
\dostructureheadspacingbeforenop
- \doregisterstructurehead{#1}{#2}{#3}% after optional \page
+ \doregisterstructurehead\currentstructurehead{#2}{#3}% after optional \page
\let\getstructureheadsyncs\thestructureheadsynchonization
\placestructureheadempty % just flush 'm
\dostructureheadspacingafternop
@@ -512,6 +626,7 @@
\flushingcolumnfloatstrue
\setfalse\ignorehandlepagebreak
% ignorespaces prevents spaces creeping in when after=\dontleavehmode
+ \dostarttagged\t!sectioncontent\empty
\ifconditional\structureheadisdisplay % \ifdisplaysectionhead
\ignorespaces
\else
@@ -521,19 +636,23 @@
% typesetting
\unexpanded\def\placestructureheadnumbertext % dummy, will be overloaded
- {\getstructureheadnumber/\getstructureheadtitle
+ {\setstructureheadmarking
+ \getstructureheadnumber/\getstructureheadtitle
\getstructureheadsyncs}
\unexpanded\def\placestructureheadtext % dummy, will be overloaded
- {\getstructureheadtitle
+ {\setstructureheadmarking
+ \getstructureheadtitle
\getstructureheadsyncs}
\unexpanded\def\placestructureheadempty % dummy, will be overloaded
- {\getstructureheadsyncs}
+ {\setstructureheadmarking
+ \getstructureheadsyncs}
\unexpanded\def\placestructureheadhidden
{\setxvalue{\currentstructurehead:sync}%
- {\noexpand\pagetype[\currentstructureheadcoupling]% hm also number
+ {\noexpand\setgvalue{\currentstructurehead:sync}{}%
+ \noexpand\pagetype[\currentstructureheadcoupling]% hm also number
\noexpand\setmarking[\currentstructureheadcoupling]{\currentstructurelistnumber}%
\currentstructuresynchronize}}
@@ -562,13 +681,15 @@
\def\dostructureheadspacingbeforeyes
{\docheckstructureheadbefore
- \dohandlestructureheadpagebreak
- \structureheadparameter\c!inbetween}
+ \dohandlestructureheadpagebreakyes
+ \structureheadparameter\c!inbetween
+ \dostarttagged\t!section\currentstructurehead}
\def\dostructureheadspacingbeforenop
{\docheckstructureheadbefore
- \docheckstructureheadlayout
- \structureheadparameter\c!inbetween}
+ \dohandlestructureheadpagebreaknop
+ \structureheadparameter\c!inbetween
+ \dostarttagged\currentstructurehead\empty}
% \def\emptystructureheadcorrection
% {\ifconditional\structureheadleaveempty % inlined \emptyheadcorrection (with after=\blank)
@@ -625,17 +746,33 @@
{\doifsomething{\structureheadparameter#2}{\expanded{\setuplayouttext[#1][\c!state=\structureheadparameter#2]}}}
\donothing}
+\setvalue{\??nh:\??mk:n:\v!page }{}
+\setvalue{\??nh:\??mk:n:\v!reset}{\resetcurrentstructuremarks}
+\setvalue{\??nh:\??mk:y:\v!page }{} % to be checked: {\resetcurrentstructuremarks}
+\setvalue{\??nh:\??mk:y:\v!reset}{\resetcurrentstructuremarks}
+
\def\docheckstructureheadlayout
- {\doifsomething{\structureheadparameter\c!page}
+ {\doifelsenothing{\structureheadparameter\c!page}
+ {\getvalue{\??nh:\??mk:n:\structureheadparameter\c!marking}}
{\page[\structureheadparameter\c!page]%
+ \getvalue{\??nh:\??mk:y:\structureheadparameter\c!marking}%
\dodocheckstructureheadlayout\v!header\c!header
\dodocheckstructureheadlayout\v!text \c!text
\dodocheckstructureheadlayout\v!footer\c!footer}}
-\def\currentstructurecounter {\ctxlua{structure.sections.depthnumber(\thenamedstructureheadlevel\currentstructurehead)}}
-\def\previousstructurecounter{\ctxlua{structure.sections.depthnumber(\thenamedstructureheadlevel\currentstructurehead-1)}}
+\def\currentstructurecounter {\ctxlua{structures.sections.depthnumber(\thenamedstructureheadlevel\currentstructurehead)}}
+\def\previousstructurecounter{\ctxlua{structures.sections.depthnumber(\thenamedstructureheadlevel\currentstructurehead-1)}}
-\def\dohandlestructureheadpagebreak
+\def\dohandlestructureheadpagebreaknop
+ {\doifelse{\structureheadparameter\c!continue}\v!yes
+ {\ifnum\previousstructurecounter=\zerocount
+ \docheckstructureheadlayout
+ \else\ifnum\currentstructurecounter>\zerocount
+ \docheckstructureheadlayout
+ \fi\fi}%
+ {\docheckstructureheadlayout}}
+
+\def\dohandlestructureheadpagebreakyes
{%[[\currentstructurehead @\thenamedstructureheadlevel\currentstructurehead/prev:\previousstructurecounter/curr:\currentstructurecounter]]
\ifconditional\ignorehandlepagebreak
\setfalse\ignorehandlepagebreak
@@ -657,7 +794,7 @@
% \ifpagebreakdisabled
% \global\pagebreakdisabledfalse
% \else
- \dopreventbreakafterstructureheadauto
+% \dopreventbreakafterstructureheadauto % not ok as it binds the prev par
% \fi
\doif{\structureheadparameter\c!aligntitle}\v!float\indent
\global\precedingstructurelevel\currentstructureheadlevel
@@ -665,8 +802,10 @@
% the next one was: \somebreakmethod
-% \chardef\somestructureheadbreakmethod\plusone % 0=nothing, 1=weighted, 2=strict, 3=vspacing
-\chardef\somestructureheadbreakmethod\plusthree
+
+% 0 = nothing, 1 = weighted, 2 = strict, 3 = vspacing
+
+\setnewconstant\somestructureheadbreakmethod\plusthree
% \def\dopreventbreakafterstructureheadauto % used after \c!before
% {\ifcase\somestructureheadbreakmethod
diff --git a/Master/texmf-dist/tex/context/base/strc-syn.lua b/Master/texmf-dist/tex/context/base/strc-syn.lua
index d6f38c2c7f6..f3ba97ffca2 100644
--- a/Master/texmf-dist/tex/context/base/strc-syn.lua
+++ b/Master/texmf-dist/tex/context/base/strc-syn.lua
@@ -7,20 +7,24 @@ if not modules then modules = { } end modules ['str-syn'] = {
}
local next, type = next, type
-local texwrite, texsprint, format = tex.write, tex.sprint, string.format
-
-local ctxcatcodes = tex.ctxcatcodes
+local texwrite, format = tex.write, string.format
+local allocate = utilities.storage.allocate
-- interface to tex end
-joblists = joblists or { }
-joblists.collected = joblists.collected or { }
-joblists.tobesaved = joblists.tobesaved or { }
+local structures = structures
+local synonyms = structures.synonyms
+local tags = structures.tags
+
+local collected = allocate()
+local tobesaved = allocate()
-local collected, tobesaved = joblists.collected, joblists.tobesaved
+synonyms.collected = collected
+synonyms.tobesaved = tobesaved
local function initializer()
- collected, tobesaved = joblists.collected, joblists.tobesaved
+ collected = synonyms.collected
+ tobesaved = synonyms.tobesaved
end
local function finalizer()
@@ -29,7 +33,9 @@ local function finalizer()
end
end
-job.register('joblists.collected', joblists.tobesaved, initializer, finalizer)
+job.register('structures.synonyms.collected', tobesaved, initializer, finalizer)
+
+-- todo: allocate becomes metatable
local function allocate(class)
local d = tobesaved[class]
@@ -50,12 +56,12 @@ local function allocate(class)
return d
end
-function joblists.define(class,kind)
+function synonyms.define(class,kind)
local data = allocate(class)
data.metadata.kind = kind
end
-function joblists.register(class,kind,spec)
+function synonyms.register(class,kind,spec)
local data = allocate(class)
data.metadata.kind = kind -- runtime, not saved in format (yet)
if not data.hash[spec.definition.tag or ""] then
@@ -64,7 +70,7 @@ function joblists.register(class,kind,spec)
end
end
-function joblists.registerused(class,tag)
+function synonyms.registerused(class,tag)
local data = allocate(class)
local dht = data.hash[tag]
if dht then
@@ -72,29 +78,29 @@ function joblists.registerused(class,tag)
end
end
-function joblists.synonym(class,tag)
+function synonyms.synonym(class,tag)
local data = allocate(class).hash
local d = data[tag]
if d then
local de = d.definition
de.used = true
- texsprint(ctxcatcodes,de.synonym)
+ context(de.synonym)
end
end
-function joblists.meaning(class,tag)
+function synonyms.meaning(class,tag)
local data = allocate(class).hash
local d = data[tag]
if d then
local de = d.definition
de.used = true
- texsprint(ctxcatcodes,de.meaning)
+ context(de.meaning)
end
end
-joblists.compare = sorters.comparers.basic -- (a,b)
+synonyms.compare = sorters.comparers.basic -- (a,b)
-function joblists.filter(data,options)
+function synonyms.filter(data,options)
local result = { }
local entries = data.entries
local all = options and options.criterium == interfaces.variables.all
@@ -107,7 +113,7 @@ function joblists.filter(data,options)
data.result = result
end
-function joblists.prepare(data)
+function synonyms.prepare(data)
local strip = sorters.strip
local splitter = sorters.splitters.utf
local result = data.result
@@ -124,11 +130,11 @@ function joblists.prepare(data)
end
end
-function joblists.sort(data,options)
- sorters.sort(data.result,joblists.compare)
+function synonyms.sort(data,options)
+ sorters.sort(data.result,synonyms.compare)
end
-function joblists.finalize(data,options)
+function synonyms.finalize(data,options)
local result = data.result
data.metadata.nofsorted = #result
local split = { }
@@ -145,45 +151,48 @@ function joblists.finalize(data,options)
data.result = split
end
-function joblists.flush(data,options) -- maybe pass the settings differently
- local kind = data.metadata.kind -- hack, will be done better
---~ texsprint(ctxcatcodes,format("\\start%soutput",kind))
+-- for now, maybe at some point we will do a multipass or so
+-- maybe pass the settings differently
+
+function synonyms.flush(data,options)
+ local kind = data.metadata.kind -- hack, will be done better
+ -- context[format("\\start%soutput",kind)]()
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
---~ texsprint(ctxcatcodes,format("\\start%ssection{%s}",kind,sublist.tag))
+ -- context[format("\\start%ssection",kind)](sublist.tag)
for d=1,#data do
local entry = data[d].definition
- texsprint(ctxcatcodes,format("\\%sentry{%s}{%s}{%s}{%s}",kind,d,entry.tag,entry.synonym,entry.meaning or ""))
+ -- context[format("\\%sentry",kind)](d,entry.tag,entry.synonym,entry.meaning or "")
+ context("\\%sentry{%s}{%s}{%s}{%s}",kind,d,entry.tag,entry.synonym,entry.meaning or "")
end
---~ texsprint(ctxcatcodes,format("\\stop%ssection",kind))
+ -- context[format("\\stop%ssection",kind)]()
end
---~ texsprint(ctxcatcodes,format("\\stop%soutput",kind))
- -- for now, maybe at some point we will do a multipass or so
+ -- context[format("\\stop%soutput",kind)]()
data.result = nil
data.metadata.sorted = false
end
-function joblists.analysed(class,options)
- local data = joblists.collected[class]
+function synonyms.analyzed(class,options)
+ local data = synonyms.collected[class]
if data and data.entries then
options = options or { }
sorters.setlanguage(options.language)
- joblists.filter(data,options) -- filters entries to result
- joblists.prepare(data,options) -- adds split table parallel to list table
- joblists.sort(data,options) -- sorts entries in result
- joblists.finalize(data,options) -- do things with data.entries
+ 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
+ synonyms.finalize(data,options) -- do things with data.entries
data.metadata.sorted = true
end
return data and data.metadata.sorted and data.result and next(data.result)
end
-function joblists.process(class,options)
- if joblists.analysed(class,options) then
- joblists.flush(joblists.collected[class],options)
+function synonyms.process(class,options)
+ if synonyms.analyzed(class,options) then
+ synonyms.flush(synonyms.collected[class],options)
end
end
diff --git a/Master/texmf-dist/tex/context/base/strc-syn.mkiv b/Master/texmf-dist/tex/context/base/strc-syn.mkiv
index 65f5174372a..f063ef087d6 100644
--- a/Master/texmf-dist/tex/context/base/strc-syn.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-syn.mkiv
@@ -20,6 +20,9 @@
\unprotect
+\let\dotagsynonym\relax
+\let\dotagsorting\relax
+
% general help, can be shared
% simplifiedcommands -> flag in lua
@@ -96,6 +99,7 @@
%\c!after=,
\c!indentnext=\v!no,
%\c!expansion=,
+ \c!method=,
\s!language=\currentmainlanguage]
\unexpanded\def\definesynonyms
@@ -114,9 +118,9 @@
\fi
\setuvalue{#1}{\definesynonym[\v!yes][#1]}% \name
\fi
- \getparameters[\??sm#1][\s!parent=\??sm,\s!multi={#2}]%
+ \getparameters[\??sm#1][\s!parent=\??sm,\s!single={#1},\s!multi={#2}]%
\presetheadtext[#2=\Word{#2}]% changes the \if...argument
- %\ctxlua{joblists.define('#1')}%
+ %\ctxlua{structures.synonyms.define('#1')}%
\setvalue{\e!setup #2\e!endsetup}{\dodoubleargument\getparameters[\??sm#1]}% to be obsolete
\setvalue{\e!place \e!listof#2}{\placelistofsynonyms[#1]}% accepts extra argument
\setvalue{\e!complete\e!listof#2}{\completelistofsynonyms[#1]}}
@@ -137,7 +141,7 @@
\edef\currentsynonymexpansion{\synonymparameter\c!expansion}%
\preprocessexpansion\currentsynonymexpansion\currentsynonymtext \currentsynonymcoding{#4}%
\preprocessexpansion\currentsynonymexpansion\currentsynonymmeaning\currentsynonymcoding{#5}%
- \ctxlua{joblists.register("\currentsynonym", "synonym", {
+ \ctxlua{structures.synonyms.register("\currentsynonym", "synonym", {
metadata = {
catcodes = \the\catcodetable,
coding = "\currentsynonymcoding",
@@ -158,20 +162,24 @@
{\dodoubleargument\doregistersynonym}
\def\registersynonym[#1][#2]%
- {\ctxlua{joblists.registerused("#1","#2")}}
+ {\ctxlua{structures.synonyms.registerused("#1","#2")}}
\unexpanded\def\doinsertsynonymmeaning#1#2% name tag
{\begingroup
\def\currentsynonym{#1}%
\dosetsynonymattributes\c!textstyle\c!textcolor
- \synonymparameter\c!textcommand{\ctxlua{joblists.meaning("#1","#2")}}%
+ \synonymparameter\c!textcommand{\ctxlua{structures.synonyms.meaning("#1","#2")}}%
\endgroup}
\unexpanded\def\doinsertsynonym#1#2% name tag
{\begingroup
\def\currentsynonym{#1}%
+ \def\currentsynonymtag{#2}%
+ \dotagsynonym
+ \dostarttagged\t!synonym\currentsynonym
\dosetsynonymattributes\c!synonymstyle\c!synonymcolor
- \synonymparameter\c!synonymcommand{\ctxlua{joblists.synonym("#1","#2")}}%
+ \synonymparameter\c!synonymcommand{\ctxlua{structures.synonyms.synonym("#1","#2")}}%
+ \dostoptagged
\normalexpanded{\endgroup\synonymparameter\c!next}}
\unexpanded\def\placelistofsynonyms
@@ -200,15 +208,20 @@
\c!color=.
#2]%
\startpacked
- \ctxlua{joblists.process('#1',{ criterium = "\synonymparameter\c!criterium" })}%
+ \ctxlua{structures.synonyms.process('#1',{
+ criterium = "\synonymparameter\c!criterium",
+ language = "\synonymparameter\s!language",
+ method = "\synonymparameter\c!method",
+ })}%
\stoppacked
\endgroup}
\def\completelistofsynonyms
{\dodoubleempty\docompletelistofsynonyms}
-\def\docompletelistofsynonyms[#1][#2]% expansion needed to avoid v! (due to french active !)
- {\normalexpanded{\systemsuppliedchapter[#1]{\noexpand\headtext{\synonymparameter\s!single}}}%
+\def\docompletelistofsynonyms[#1][#2]%
+ {\edef\currentsynonym{#1}%
+ \normalexpanded{\systemsuppliedchapter[#1]{\noexpand\headtext{\synonymparameter\s!multi}}}%
\doplacelistofsynonyms[#1][#2]%
\page[\v!yes]}
@@ -262,6 +275,7 @@
%\c!before=,
\c!after=\endgraf,
%\c!expansion=,
+ \c!method=,
\s!language=\currentmainlanguage]
\unexpanded\def\definesorting
@@ -281,7 +295,7 @@
\fi
\getparameters[\??so#1][\s!parent=\??so,\s!multi={#2}]%
\presetheadtext[#2=\Word{#2}]% after \ifthirdargument -)
- %\ctxlua{joblists.define('#1')}%
+ %\ctxlua{structures.synonyms.define('#1')}%
\setvalue{\e!setup #2\e!endsetup}{\dodoubleargument\getparameters[\??so#1]}% to be obsolete
\setvalue{\e!place \e!listof#2}{\placelistofsorts[#1]}%
\setvalue{\e!complete\e!listof#2}{\completelistofsorts[#1]}}
@@ -301,7 +315,7 @@
\else
\edef\currentsortingexpansion{\sortingparameter\c!expansion}%
\preprocessexpansion\currentsortingexpansion\currentsortingtext\currentsortingcoding{#4}%
- \ctxlua{joblists.register("\currentsorting", "sorting", {
+ \ctxlua{structures.synonyms.register("\currentsorting", "sorting", {
metadata = {
catcodes = \the\catcodetable,
coding = "\currentsortingcoding",
@@ -321,34 +335,42 @@
{\begingroup
% no kap currently, of .. we need to map cap onto WORD
\edef\currentsorting{#1}%
- \dosetsynonymattributes\c!style\c!color
- \ctxlua{joblists.synonym("#1","#2")}%
+ \def\currentsortingtag{#2}%
+ \dotagsorting
+ \dostarttagged\t!sorting\currentsorting
+ \dosetsortingattributes\c!style\c!color
+ \ctxlua{structures.synonyms.synonym("#1","#2")}%
+ \dostoptagged
\normalexpanded{\endgroup\sortingparameter\c!next}}
\def\registersort
{\dodoubleargument\doregistersort}
\def\registersort[#1][#2]%
- {\ctxlua{joblists.registerused("#1","#2")}}
+ {\ctxlua{structures.synonyms.registerused("#1","#2")}}
% before after
%
% maybe just 'commandset' and then combine
\unexpanded\def\placelistofsorts
- {\dodoubleempty\placelistofsorts}
+ {\dodoubleempty\doplacelistofsorts}
-\unexpanded\def\placelistofsorts[#1][#2]% NOG EEN RUWE VERSIE MAKEN ZONDER WITRUIMTE ETC ETC
+\def\doplacelistofsorts[#1][#2]% NOG EEN RUWE VERSIE MAKEN ZONDER WITRUIMTE ETC ETC
{\begingroup
\def\currentsorting{#1}%
\getparameters[\??so#1][#2]%
\startpacked
- \ctxlua{joblists.process('#1',{ criterium = "\sortingparameter\c!criterium" })}%
+ \ctxlua{structures.synonyms.process('#1',{
+ criterium = "\sortingparameter\c!criterium",
+ language = "\sortingparameter\s!language",
+ method = "\sortingparameter\c!method",
+ })}%
\stoppacked
\endgroup}
-\def\completelistofsorts
- {\dodoubleemptydocompletelistofsorts}
+\unexpanded\def\completelistofsorts
+ {\dodoubleempty\docompletelistofsorts}
\def\docompletelistofsorts[#1][#2]%
{\normalexpanded{\systemsuppliedchapter[#1]{\noexpand\headtext{#2}}}%
@@ -372,7 +394,7 @@
% \def\mkloadsortedlist#1% class
% {\bgroup
% \getvalue{\s!set#1}%
-% \ctxlua{joblists.process('#1')}%
+% \ctxlua{structures.synonyms.process('#1')}%
% \getvalue{\s!reset#1}%
% \egroup}
diff --git a/Master/texmf-dist/tex/context/base/strc-tag.lua b/Master/texmf-dist/tex/context/base/strc-tag.lua
new file mode 100644
index 00000000000..f1381dad5f0
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/strc-tag.lua
@@ -0,0 +1,251 @@
+if not modules then modules = { } end modules ['strc-tag'] = {
+ version = 1.001,
+ comment = "companion to strc-tag.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This is rather experimental code.
+
+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 texattribute = tex.attribute
+local allocate = utilities.storage.allocate
+local settings_to_hash = utilities.parsers.settings_to_hash
+
+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 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 tags = structures.tags
+tags.taglist = taglist -- can best be hidden
+tags.labels = labels
+tags.data = tagdata
+
+local properties = allocate {
+
+ document = { pdf = "Div", nature = "display" },
+
+ division = { pdf = "Div", nature = "display" },
+ paragraph = { pdf = "P", nature = "mixed" },
+ construct = { 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" },
+
+ synonym = { pdf = "Span", nature = "inline" },
+ sort = { 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" },
+
+ float = { pdf = "Div", nature = "display" }, -- Figure
+ floatcaption = { pdf = "Caption", nature = "display" },
+ floattag = { pdf = "Span", nature = "mixed" },
+ 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
+ formulatag = { 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 = "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" },
+
+}
+
+tags.properties = properties
+
+function tags.settagproperty(tag,key,value)
+ local p = properties[tag]
+ if p then
+ p[key] = value
+ else
+ properties[tag] = { [key] = value }
+ end
+end
+
+local lasttags = { }
+local userdata = { }
+
+tags.userdata = userdata
+
+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
+ local t = #taglist + 1
+ local n = (ids[fulltag] or 0) + 1
+ ids[fulltag] = n
+ lasttags[tag] = n
+--~ print("SETTING",tag,n)
+ local completetag = fulltag .. "-" .. n
+ chain[#chain+1] = completetag -- insert(chain,tag .. ":" .. n)
+ stack[#stack+1] = t -- insert(stack,t)
+ taglist[t] = { unpack(chain) } -- we can add key values for alt and actualtext if needed
+ 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
+ texattribute[a_tagged] = t
+ return t
+end
+
+function tags.stop()
+ local t = stack[#stack] stack[#stack] = nil -- local t = remove(stack)
+ if not t then
+ if trace_tags then
+ report_tags("ignoring end tag, previous chain: %s",#chain > 0 and concat(chain[#chain]) or "none")
+ end
+ t = unsetvalue
+ else
+ chain[#chain] = nil -- remove(chain)
+ end
+ texattribute[a_tagged] = t
+ return t
+end
+
+function tags.getid(tag,detail)
+ if detail and detail ~= "" then
+ return ids[tag .. ":" .. detail] or "?"
+ else
+ return ids[tag] or "?"
+ end
+end
+
+function tags.last(tag)
+ return lasttags[tag] -- or false
+end
+
+function tags.lastinchain()
+ return chain[#chain]
+end
+
+function tags.registerdata(data)
+ local fulltag = chain[#chain]
+ if fulltag then
+ tagdata[fulltag] = data
+ end
+end
+
+function structures.atlocation(str)
+ local location = gsub(concat(taglist[texattribute[a_tagged]],"-"),"%-%d+","")
+ return find(location,topattern(str)) ~= nil
+end
+
+function tags.handler(head) -- we need a dummy
+ return head, false
+end
+
+statistics.register("structure elements", function()
+ if enabled then
+ return format("%s element chains identified",#taglist)
+ else
+ return nil
+ end
+end)
+
+directives.register("backend.addtags", function(v)
+ if not enabled then
+ codeinjections.enabletags()
+ enabled = true
+ end
+end)
diff --git a/Master/texmf-dist/tex/context/base/strc-tag.mkiv b/Master/texmf-dist/tex/context/base/strc-tag.mkiv
new file mode 100644
index 00000000000..8bc8d9f6979
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/strc-tag.mkiv
@@ -0,0 +1,220 @@
+%D \module
+%D [ file=strc-tag,
+%D version=2010.07.16,
+%D title=\CONTEXT\ Structure Macros,
+%D subtitle=Tags,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% key/values and other names might change (and probably will)
+
+\writestatus{loading}{ConTeXt Structure Macros / Tags}
+
+\registerctxluafile{strc-tag}{1.001}
+
+\unprotect
+
+% labels: temporary here
+
+\def\t!document {document} % Div
+
+\def\t!division {division} % Div
+\def\t!paragraph {paragraph} % P
+\def\t!construct {construct} % 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
+
+\def\t!verbatimblock {verbatimblock} % Code
+\def\t!verbatimlines {verbatimlines} % Code
+\def\t!verbatimline {verbatimline} % Code
+\def\t!verbatim {verbatim} % 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!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!floattag {floattag} % Span
+\def\t!floattext {floattext} % 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!formulatag {formulatag} % Span
+\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
+
+% \setuptaglabeltext
+% [en]
+% [\t!document=document]
+
+% the real code
+
+\definesystemattribute[tagged][public]
+\definesystemattribute[image] [public]
+
+\def\setelementbackendtag{\dodoubleargument\dosetelementbackendtag}
+\def\setelementnature {\dodoubleargument\dosetelementnature}
+
+\def\dosetelementbackendtag[#1][#2]{\ctxlua{structures.tags.settagproperty("#1","backend","#2")}}
+\def\dosetelementnature [#1][#2]{\ctxlua{structures.tags.settagproperty("#1","nature", "#2")}}
+
+% todo: indirect macro for trialtypesetting
+
+\unexpanded\def\dostartelement{\iftrialtypesetting\expandafter\renostartelement\else\expandafter\redostartelement\fi}
+\unexpanded\def\dostopelement {\iftrialtypesetting\expandafter\nonostopelement \else\expandafter\dodostopelement \fi}
+
+\unexpanded\def\redostartelement{\dodoubleempty\dodostartelement}
+\unexpanded\def\renostartelement{\dodoubleempty\nonostartelement}
+
+\unexpanded\def\dodostartelement[#1][#2]%
+ {\ctxlua{structures.tags.start("#1",{
+ label = "\dogetupsometaglabeltext{#1}",
+ userdata = \!!bs#2\!!es,
+ })}}
+
+\unexpanded\def\dodostopelement
+ {\ctxlua{structures.tags.stop()}}
+
+\unexpanded\def\nonostartelement[#1][#2]{}
+\unexpanded\def\nonostopelement {}
+
+% beware: making this one unexpanded spoils tables (noalign problem)
+
+\def\dodostarttagged{\iftrialtypesetting\expandafter\nododostarttagged\else\expandafter\dododostarttagged\fi}
+\def\dodostoptagged {\iftrialtypesetting\expandafter\nododostoptagged \else\expandafter\dododostoptagged \fi}
+
+\def\dododostarttagged#1#2%
+ {\ctxlua{structures.tags.start("#1",{
+ label = "\dogetupsometaglabeltext{#1}",
+ detail = "#2",
+ })}}
+
+\def\dododostoptagged
+ {\ctxlua{structures.tags.stop()}}
+
+\def\nododostarttagged#1#2{}
+\def\nododostoptagged {}
+
+\newtoks\everysetupstructure
+
+\def\setupstructure[#1]%
+ {\getparameters[\??el][#1]%
+ \the\everysetupstructure}
+
+\def\doenableelements
+ {\setuplanguage[\s!default][\s!righthyphenchar="AD]% for the moment here
+ \let\startelement\dostartelement
+ \let\stopelement \dostopelement}
+
+\def\dodisableelements
+ {\let\startelement\renostartelement
+ \let\stopelement \nonostopelement}
+
+\def\doenabletagged
+ {\let\dostarttagged\dodostarttagged
+ \let\dostoptagged \dodostoptagged }
+
+\def\dodisabletagged
+ {\let\dostarttagged\nododostarttagged
+ \let\dostoptagged \nododostoptagged }
+
+\newtoks\everyenableelements
+\newtoks\everydisableelements
+
+\appendtoks
+ \doenableelements
+ \doifelse\@@elmethod\v!auto\doenabletagged\dodisabletagged
+\to \everyenableelements
+
+\appendtoks
+ \dodisableelements
+ \dodisabletagged
+\to \everydisableelements
+
+\appendtoks
+ \doifelse\@@elstate\v!start{\the\everyenableelements}{\the\everydisableelements}%
+\to \everysetupstructure
+
+\setupstructure
+ [\c!state=\v!stop,
+ \c!method=\v!auto]
+
+\unexpanded\def\startparagraph
+ {\dostarttagged\t!paragraph\empty}
+
+\unexpanded\def\stopparagraph
+ {\dostoptagged
+ \par}
+
+\appendtoks
+ \dostarttagged\t!document\empty
+\to \everystarttext
+
+\appendtoks
+ \dostoptagged
+\to \everystoptext
+
+% \doifinelementelse{structure:section} {yes} {no}
+% \doifinelementelse{structure:chapter} {yes} {no}
+% \doifinelementelse{division:*-structure:chapter} {yes} {no}
+
+\def\doifinelementelse#1%
+ {\ctxcommand{testcase(structures.atlocation("#1"))}}
+
+\protect
diff --git a/Master/texmf-dist/tex/context/base/strc-xml.mkiv b/Master/texmf-dist/tex/context/base/strc-xml.mkiv
index 7a009958597..9696c2e06c2 100644
--- a/Master/texmf-dist/tex/context/base/strc-xml.mkiv
+++ b/Master/texmf-dist/tex/context/base/strc-xml.mkiv
@@ -13,12 +13,14 @@
\writestatus{loading}{ConTeXt Structure Macros / XML Processing}
+% This might disappear.
+
\unprotect
\startxmlsetups xml:ctx:internal:setup
- \xmlsetsetup{\xmldocument}{ctx:genericentry} {xml:ctx:genericentry}
- \xmlsetsetup{\xmldocument}{ctx:sectionentry} {xml:ctx:sectionentry}
- \xmlsetsetup{\xmldocument}{ctx:registerentry}{xml:ctx:registerentry}
+ \xmlsetsetup{#1}{ctx:genericentry} {xml:ctx:genericentry}
+ \xmlsetsetup{#1}{ctx:sectionentry} {xml:ctx:sectionentry}
+ \xmlsetsetup{#1}{ctx:registerentry}{xml:ctx:registerentry}
\stopxmlsetups
\xmlregistersetup{xml:ctx:internal:setup}
diff --git a/Master/texmf-dist/tex/context/base/supp-ali.tex b/Master/texmf-dist/tex/context/base/supp-ali.mkii
index 8727efbb271..8727efbb271 100644
--- a/Master/texmf-dist/tex/context/base/supp-ali.tex
+++ b/Master/texmf-dist/tex/context/base/supp-ali.mkii
diff --git a/Master/texmf-dist/tex/context/base/supp-ali.mkiv b/Master/texmf-dist/tex/context/base/supp-ali.mkiv
new file mode 100644
index 00000000000..1bd31eb78a2
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/supp-ali.mkiv
@@ -0,0 +1,173 @@
+%D \module
+%D [ file=supp-ali,
+%D version=2000.04.17,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Alignment,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Yet undocumented.
+
+% 0 = centered
+% 1 = left in before
+% 2 = right in before
+% 3 = left in after
+% 4 = right in after
+
+\unprotect
+
+% \starttabulate[|cg{.}|cg{,}|cg{,}|]
+% \NC period \NC comma \NC comma \NC\NR
+% \NG 100.000,00 \NG 100.000,00 \NG 100,00 \NC\NR
+% \NG 10.000,00 \NG 10.000,00 \NG 1000,00 \NC\NR
+% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR
+% \NG 100,00 \NG 100,00 \NG 10,00 \NC\NR
+% \NG 10\\ \NG 10\\ \NG 0,00 \NC\NR
+% \NG 10 \NG 10 \NG 0,00 \NC\NR
+% \NG 10 \NG 10 \NG 0,00 \NC\NR
+% \stoptabulate
+
+\chardef\characteralignmentmode=4
+\chardef\characteralignmentslot=1
+
+\newtoks\@@characteralignlst
+
+\let\afterassignwidth \!!zeropoint
+\let\beforeassignwidth\!!zeropoint
+
+\def\alignmentcharacter{.}
+
+\let\alignmentclass\s!default % can be used to handle multiple mixed ones
+
+\def\setfirstpasscharacteralign
+ {\popcharacteralign
+ \expanded{\dosetfirstpasscharacteralign{\alignmentcharacter}}}
+
+\def\dosetfirstpasscharacteralign#1%
+ {\def\checkalignment##1%
+ {\popcharacteralign
+ \let\\\empty
+ \setbox\scratchbox\hbox{#1}%
+ \edef\characterassignwidth{\the\wd\scratchbox}%
+ \setbox\scratchbox\emptyhbox
+ \docheckalignment##1#1\relax\relax
+ \scratchdimen-\wd\scratchbox
+ \setbox\scratchbox\hbox{\ignorespaces##1\unskip}%
+ \advance\scratchdimen \wd\scratchbox
+ \ifdim\scratchdimen>\beforeassignwidth\relax
+ \edef\beforeassignwidth{\the\scratchdimen}%
+ \fi
+ \ifdim\scratchdimen=\zeropoint
+ \setbox\scratchbox\hbox{\ignorespaces##1\unskip}%
+ \scratchdimen\wd\scratchbox
+ \ifcase\characteralignmentmode
+ % do nothing
+ \else\ifnum\characteralignmentmode<\plusthree
+ \advance\scratchdimen \characterassignwidth
+ \ifdim\scratchdimen>\beforeassignwidth\relax
+ \edef\beforeassignwidth{\the\scratchdimen}%
+ \fi
+ \else
+ \ifdim\scratchdimen>\afterassignwidth\relax
+ \edef\afterassignwidth{\the\scratchdimen}%
+ \fi
+ \fi\fi
+ \fi
+ \pushcharacteralign}%
+ \def\docheckalignment##1#1##2##3\relax
+ {\ifx##2\relax
+ \setbox\scratchbox\hbox{\ignorespaces##1\unskip}%
+ \ifdim\wd\scratchbox>\afterassignwidth
+ \edef\afterassignwidth{\the\wd\scratchbox}%
+ \fi
+ \else
+ \docheckalignment##2##3\relax\relax
+ \fi}}
+
+\def\setsecondpasscharacteralign
+ {\popcharacteralign
+ \expanded{\dosetsecondpasscharacteralign{\alignmentcharacter}}}
+
+\def\dosetsecondpasscharacteralign#1%
+ {\def\checkalignment##1%
+ {\popcharacteralign
+ \let\\\empty % beware, no grouping
+ \setbox\scratchbox\hbox{#1}%
+ \edef\characterassignwidth{\the\wd\scratchbox}%
+ \setbox\scratchbox\emptyhbox
+ % new 12,34 vs 10\\ where 10 aligns on 12 if #1 = ,
+ \ifcase\characteralignmentslot
+ \docheckalignment##1#1\relax\relax
+ \scratchdimen\wd\scratchbox
+ \setbox\scratchbox\hbox{\ignorespaces##1\unskip}%
+ \else
+ \def\\{#1}%
+ \expanded{\docheckalignment##1#1\relax\relax}%
+ \scratchdimen\wd\scratchbox
+ \setbox\scratchbox\hbox{\def\\{\hphantom{#1}}\ignorespaces##1\unskip}%
+ \fi
+ \noindent
+ \ifdim\scratchdimen=\wd\scratchbox
+ \ifcase\characteralignmentmode
+ \box\scratchbox
+ \else
+ \hbox
+ {\dontcomplain
+ \hbox to \beforeassignwidth
+ {\ifcase\characteralignmentmode\or
+ \box\scratchbox\hss
+ \or
+ \hss\box\scratchbox\hskip\characterassignwidth
+ \or
+ \hss\rlap{\box\scratchbox}%
+ \or
+ \hss\rlap{\hbox to \afterassignwidth{\hss\box\scratchbox}}%
+ \fi}%
+ \hskip\afterassignwidth}%
+ \fi
+ \else
+ \hbox
+ {\hbox to \beforeassignwidth
+ {\hss\box\scratchbox\hskip-\scratchdimen}%
+ \hskip\afterassignwidth}%
+ \fi}%
+ \def\docheckalignment##1#1##2##3\relax
+ {\ifx##2\relax
+ \setbox\scratchbox\hbox{\ignorespaces##1\unskip}%
+ \else
+ \docheckalignment##2##3\relax\relax
+ \fi}}
+
+% provide a means to use multiple alignments mixed
+
+\def\pushcharacteralign
+ {\ifcsname @cac@\alignmentclass\endcsname\else
+ \doglobal\appendetoks\noexpand\do{\alignmentclass}\to\@@characteralignlst
+ \fi
+ \setxvalue{@cac@\alignmentclass}{\noexpand\do
+ {\afterassignwidth}{\beforeassignwidth}{\alignmentcharacter}}}
+
+\def\popcharacteralign
+ {\def\do##1##2##3%
+ {\def\afterassignwidth {##1}%
+ \def\beforeassignwidth {##2}%
+ \def\alignmentcharacter{##3}}%
+ \executeifdefined{@cac@\alignmentclass}\donothing}
+
+\def\resetcharacteralign % does not work well nested
+ {\def\do##1{\global\letbeundefined{@cac@##1}}% global !
+ \the\@@characteralignlst
+ \global\@@characteralignlst\emptytoks}
+
+\long\def\startcharacteralign#1\stopcharacteralign
+ {\bgroup
+ \setfirstpasscharacteralign #1%
+ \setsecondpasscharacteralign#1%
+ \egroup}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/supp-box.lua b/Master/texmf-dist/tex/context/base/supp-box.lua
new file mode 100644
index 00000000000..48baecf6fc2
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/supp-box.lua
@@ -0,0 +1,110 @@
+if not modules then modules = { } end modules ['supp-box'] = {
+ version = 1.001,
+ comment = "companion to supp-box.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- this is preliminary code
+
+local report_hyphenation = logs.reporter("languages","hyphenation")
+
+local nodecodes = nodes.nodecodes
+
+local disc_code = nodecodes.disc
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local glue_code = nodecodes.glue
+local glyph_code = nodecodes.glyph
+
+local new_penalty = nodes.pool.penalty
+local free_node = node.free
+local copynodelist = node.copy_list
+local copynode = node.copy
+local texbox = tex.box
+
+local function hyphenatedlist(list)
+ while list do
+ local id, next, prev = list.id, list.next, list.prev
+ if id == disc_code then
+ local hyphen = list.pre
+ if hyphen then
+ local penalty = new_penalty(-500)
+ hyphen.next, penalty.prev = penalty, hyphen
+ prev.next, next.prev = hyphen, penalty
+ penalty.next, hyphen.prev = next, prev
+ list.pre = nil
+ free_node(list)
+ end
+ elseif id == vlist_code or id == hlist_code then
+ hyphenatedlist(list.list)
+ end
+ list = next
+ end
+end
+
+commands.hyphenatedlist = hyphenatedlist
+
+function commands.showhyphenatedinlist(list)
+ report_hyphenation("show: %s",nodes.listtoutf(list))
+end
+
+local function checkedlist(list)
+ if type(list) == "number" then
+ return texbox[list].list
+ else
+ return list
+ end
+end
+
+local function applytochars(list,what,nested)
+ local doaction = context[what or "ruledhbox"]
+ local noaction = context
+ local current = checkedlist(list)
+ while current do
+ local id = current.id
+ if nested and (id == hlist_code or id == vlist_code) then
+ context.hbox()
+ context.bgroup()
+ applytochars(current.list,what,nested)
+ context.egroup()
+ elseif id ~= glyph_code then
+ noaction(copynode(current))
+ else
+ doaction(copynode(current))
+ end
+ current = current.next
+ end
+end
+
+local function applytowords(list,what,nested)
+ local doaction = context[what or "ruledhbox"]
+ local noaction = context
+ local current = checkedlist(list)
+ local start
+ while current do
+ local id = current.id
+ if id == glue_code then
+ if start then
+ doaction(copynodelist(start,current))
+ start = nil
+ end
+ noaction(copynode(current))
+ elseif nested and (id == hlist_code or id == vlist_code) then
+ context.hbox()
+ context.bgroup()
+ applytowords(current.list,what,nested)
+ context.egroup()
+ elseif not start then
+ start = current
+ end
+ current = current.next
+ end
+ if start then
+ doaction(copynodelist(start))
+ end
+end
+
+commands.applytochars = applytochars
+commands.applytowords = applytowords
diff --git a/Master/texmf-dist/tex/context/base/supp-box.tex b/Master/texmf-dist/tex/context/base/supp-box.mkii
index 4c398973ee3..8cdea862090 100644
--- a/Master/texmf-dist/tex/context/base/supp-box.tex
+++ b/Master/texmf-dist/tex/context/base/supp-box.mkii
@@ -508,7 +508,9 @@
\def\doiftextelse#1%
{\bgroup
- \setbox\scratchbox\normalhbox{\trialtypesettingtrue\ignorespaces#1\removeunwantedspaces}%
+ \setbox\scratchbox\normalhbox
+ {\trialtypesettingtrue
+ \ignorespaces#1\removeunwantedspaces}%
\ifzeropt\wd\scratchbox
\egroup\@EA\secondoftwoarguments
\else
@@ -2853,8 +2855,6 @@
#4%
\fi}
-\endETEX
-
%D \macros
%D {removedepth, obeydepth}
%D
@@ -2920,7 +2920,7 @@
\afterassignment\next\scratchdimen=#2}
\def\raisebox{\doraiselowerbox\raise}
-\def\lowerbox{\doraiselowerbox\raise}
+\def\lowerbox{\doraiselowerbox\lower}
% maybe some day we need this
%
diff --git a/Master/texmf-dist/tex/context/base/supp-box.mkiv b/Master/texmf-dist/tex/context/base/supp-box.mkiv
new file mode 100644
index 00000000000..f449e1d76b4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/supp-box.mkiv
@@ -0,0 +1,2501 @@
+%D \module
+%D [ file=supp-box,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Boxes,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Support Macros / Boxes}
+
+\unprotect
+
+\registerctxluafile{supp-box}{1.001}
+
+%D This module implements some box manipulation macros. Some
+%D are quite simple, some are more advanced and when understood
+%D well, all can be of use.
+%D
+%D \macros
+%D {strutdp,strutht,strutwd}
+%D
+%D The next shortcuts save memory and keying. The width is
+%D normally zero points (if not, you're in trouble). These
+%D shortcuts can be used like a dimension, opposite to the
+%D core macros \type {\strutdepth} and alike, which are
+%D values.
+
+\def\strutdp{\dp\strutbox}
+\def\strutht{\ht\strutbox}
+\def\strutwd{\wd\strutbox}
+
+%D \macros
+%D {resetbox, emptybox}
+%D
+%D Let's start with an easy one. The next macro hides the
+%D ugly \type {@} in \type {\voidb@x}.
+
+\ifx\voidbox\undefined \newbox\voidbox \fi
+
+%D \macros
+%D {nextdepth}
+%D
+%D Let's start with a rather simple declaration. Sometimes we
+%D need to save the \TEX\ \DIMENSION\ \type{\prevdepth} and
+%D append it later on. The name \type{\nextdepth} suits
+%D this purpose well.
+
+\newdimen\nextdepth
+
+%D \macros
+%D {smashbox, smashedbox}
+%D
+%D Smashing is introduced in \PLAIN\ \TEX, and stands for
+%D reducing the dimensions of a box to zero. The most resolute
+%D one is presented first.
+
+\def\smashbox#1%
+ {\wd#1\zeropoint
+ \ht#1\zeropoint
+ \dp#1\zeropoint}
+
+\def\smashboxed#1%
+ {\smashbox{#1}%
+ \box#1\relax}
+
+%D \macros
+%D {hsmashbox,vsmashbox}
+%D
+%D Smashing can be used for overlaying boxes. Depending on
+%D the mode, horizontal or vertical, one can use:
+
+\def\hsmashbox#1%
+ {\wd#1\zeropoint}
+
+\def\vsmashbox#1%
+ {\ht#1\zeropoint
+ \dp#1\zeropoint}
+
+%D The next implementation is less sensitive for spurious
+%D spaces.
+
+\newcount\registercount
+
+\def\smashbox
+ {\afterassignment\dosmashbox\registercount}
+
+\def\dosmashbox
+ {\wd\registercount\zeropoint
+ \ht\registercount\zeropoint
+ \dp\registercount\zeropoint}
+
+\def\smashedbox
+ {\afterassignment\thesmashedbox\registercount}
+
+\def\thesmashedbox
+ {\dosmashbox
+ \box\registercount}
+
+\def\hsmashbox
+ {\afterassignment\dohsmashbox\registercount}
+
+\def\dohsmashbox
+ {\wd\registercount\zeropoint}
+
+\def\vsmashbox
+ {\afterassignment\dovsmashbox\registercount}
+
+\def\dovsmashbox
+ {\ht\registercount\zeropoint
+ \dp\registercount\zeropoint}
+
+%D \macros
+%D {hsmash,vsmash,
+%D hsmashed,vsmashed}
+%D
+%D While the previous macros expected a \BOX, the next act on a
+%D content. They are some subtle differences betreen the smash
+%D and smashed alternatives. The later ones reduce all
+%D dimensions to zero.
+
+% Ok, but inefficient and/or catcode unsafe:
+%
+% \def\hsmash #1{\bgroup\setbox0=\normalhbox{#1}\hsmashbox0\box0\egroup}
+% \def\vsmash #1{\bgroup\setbox0=\normalvbox{#1}\vsmashbox0\box0\egroup}
+% \def\hsmashed#1{\bgroup\setbox0=\normalhbox{#1}\smashbox 0\box0\egroup}
+% \def\vsmashed#1{\bgroup\setbox0=\normalvbox{#1}\smashbox 0\box0\egroup}
+%
+% Better, but a waste of tokens:
+%
+% \def\hsmash {\bgroup\dowithnextbox{\hsmashbox\nextbox\flushnextbox\egroup}\normalhbox}
+% \def\vsmash {\bgroup\dowithnextbox{\vsmashbox\nextbox\flushnextbox\nextbox\egroup}\normalvbox}
+% \def\hsmashed{\bgroup\dowithnextbox{\smashbox \nextbox\flushnextbox\nextbox\egroup}\normalhbox}
+% \def\vsmashed{\bgroup\dowithnextbox{\smashbox \nextbox\flushnextbox\nextbox\egroup}\normalvbox}
+%
+% The best:
+
+\def\dosomesmash#1% (begin|end)group ipv (b|e)group ?
+ {\bgroup\dowithnextbox{#1\nextbox\flushnextbox\egroup}}
+
+\def\hsmash {\dosomesmash\hsmashbox\normalhbox}
+\def\vsmash {\dosomesmash\vsmashbox\normalvbox}
+\def\hsmashed{\dosomesmash\smashbox \normalhbox}
+\def\vsmashed{\dosomesmash\smashbox \normalvbox}
+
+%D \macros
+%D {smashedhbox,smashedvbox}
+%D
+%D Also handy (all dimensions zeroed):
+%D
+%D \starttyping
+%D \smashedhbox to ... {...}
+%D \smashedvbox to ... {...}
+%D \stoptyping
+
+\def\dosmashedbox#1%
+ %{#1\bgroup\dowithnextbox{\smashbox\nextbox\flushnextbox\egroup}#1}
+ {#1\bgroup\dowithnextbox{\smashedbox\nextbox\egroup}#1}
+
+\def\smashedhbox{\dosmashedbox\hbox}
+\def\smashedvbox{\dosmashedbox\vbox}
+
+%D \macros
+%D {smash}
+%D
+%D This smash alternative takes an optional arg [whdtb] as
+%D well as is potentially catcode safer. It is needed by the
+%D math module (although the \type {\leavevmode} is not added
+%D here).
+
+\def\smash
+ {\futurelet\nexttoken\dosmash}
+
+\def\dosmash
+ {\ifx\nexttoken[\@EA\dodosmash\else\@EA\donosmash\fi}
+
+\def\donosmash
+ {\dodosmash[hd]}
+
+\def\dodosmash[#1]%
+ {\edef\@@smash{#1}\futurelet\nexttoken\dododosmash}
+
+\def\dododosmash % if needed we can avoid the \next
+ {\ifmmode
+ \def\next##1{\mathpalette\mathsm@sh{##1}}%
+ \else\ifx\nexttoken\bgroup
+ \let\next\finsm@sh
+ \else
+ \def\next##1{\finsm@sh{##1}}%
+ \fi\fi
+ \next}
+
+\def\mathsm@sh#1#2% redefined plain macro
+ {\finsm@sh{$\mathsurround\zeropoint#1{#2}$}}
+
+\def\makesm@sh#1% redefined plain macro (handles t b h d w)
+ {\if#1w\nextboxwd\zeropoint\else
+ \if#1h\nextboxht\zeropoint\else
+ \if#1d\nextboxdp\zeropoint\else
+ \if#1t\nextboxht\zeropoint\else
+ \if#1b\nextboxdp\zeropoint\fi\fi\fi\fi\fi}
+
+\def\finsm@sh % redefined plain macro
+ {\dowithnextbox{\@EA\handletokens\@@smash\with\makesm@sh\flushnextbox}\normalhbox}
+
+%D \starttabulate[|l|l|]
+%D \NC w \NC \ruledhbox{\smash [w]{This is some great smashing, isn't it?}} \NC \NR
+%D \NC h \NC \ruledhbox{\smash [h]{This is some great smashing, isn't it?}} \NC \NR
+%D \NC d \NC \ruledhbox{\smash [d]{This is some great smashing, isn't it?}} \NC \NR
+%D \NC tb \NC \ruledhbox{\smash [tb]{This is some great smashing, isn't it?}} \NC \NR
+%D \NC whd \NC \ruledhbox{\smash[whd]{This is some great smashing, isn't it?}} \NC \NR
+%D \stoptabulate
+
+%D \macros
+%D {phantom, hphantom, vphantom, mathstrut}
+%D
+%D The next implementation of \type {\phantom} cum suis does
+%D not grab an argument in the non||math case, which is better.
+
+\unexpanded\def\phantom {\ph@nt\nextbox\nextbox\nextbox}
+\unexpanded\def\vphantom{\ph@nt\nextbox\nextbox\voidbox}
+\unexpanded\def\hphantom{\ph@nt\voidbox\voidbox\nextbox}
+
+%D Due to a complicated call to \type {\mathpallete} and
+%D thereby \type {\mathchoice}, the next macro looks ugly.
+%D We also take care of non||braced arguments.
+
+\def\ph@nt#1#2#3%
+ {\def\doph@nt
+ {\ifmmode
+ \def\mathph@nt####1####2{\makeph@nt#1#2#3{$\mathsurround\zeropoint####1{####2}$}}%
+ \def\nextph@nt{\mathpalette\mathph@nt}%
+ \else\ifx\nextph@nt\bgroup
+ \def\nextph@nt{\makeph@nt#1#2#3}%
+ \else
+ \def\nextph@nt####1{\makeph@nt#1#2#3{####1}}%
+ \fi\fi
+ \nextph@nt}%
+ \futurelet\nextph@nt\doph@nt}
+
+\def\makeph@nt#1#2#3%
+ {\begingroup
+ \dowithnextbox
+ {\setbox\scratchbox\emptyhbox
+ \ht\scratchbox\ht#1%
+ \dp\scratchbox\dp#2%
+ \wd\scratchbox\wd#3%
+ \box\scratchbox
+ \endgroup}
+ \normalhbox}
+
+\let\finph@nt\undefined
+
+%D We also define plain's \type {\mathstrut}.
+
+\unexpanded\def\mathstrut{\vphantom{(}}
+
+%D \macros
+%D {getboxheight}
+%D
+%D Although often needed, \TEX\ does not support arithmics
+%D like:
+%D
+%D \starttyping
+%D \dimen0 = \ht0 + \dp0
+%D \stoptyping
+%D
+%D so we implemented:
+%D
+%D \starttyping
+%D \getboxheight ... \of \box...
+%D \stoptyping
+%D
+%D For instance,
+%D
+%D \starttyping
+%D \getboxheight \dimen0 \of \box0
+%D \getboxheight \someheight \of \box \tempbox
+%D \stoptyping
+%D
+%D The implementation is rather stupid:
+%D
+%D \starttyping
+%D \def\getboxheight#1\of#2\box#3%
+%D {#1\ht#3\advance#1\dp#3\relax}
+%D \stoptyping
+%D
+%D The next alternative is slightly more clever, since
+%D it accepts \type {{12}} as well as \type {12} as box
+%D number.
+
+\def\getboxheight#1\of#2\box#3%
+ {\def\next{#1\dimexpr\ht\registercount+\dp\registercount\relax}%
+ \afterassignment\next\registercount=#3}
+
+%D For a long time the following three macros were part of
+%D the grid snapping core module, but it makes more sense to
+%D have them here so that users can see them.
+%D
+%D \macros
+%D {getnoflines, getroundednoflines, getrawnoflines}
+%D
+%D Het commando \type{\getnoflines} converteert een hoogte
+%D (dimensie) in een aantal regels en kent dit toe aan
+%D \type{\noflines}.
+%D
+%D \starttyping
+%D \getnoflines{dimensie}
+%D \stoptyping
+%D
+%D Er wordt gedeeld door \type{\openlineheight} en een hoogte
+%D van~0pt komt overeen met 0~regels. The raw alternative
+%D does not round.
+
+%D For a long time we had:
+%D
+%D \starttyping
+%D \newcount\noflines
+%D \newdimen\noflinesheight
+%D
+%D \def\dogetnoflines#1#2%
+%D {\noflinesheight#2\relax
+%D \ifzeropt\noflinesheight % \ifdim\noflinesheight=\zeropoint
+%D \noflines\zerocount
+%D \else
+%D \divide\noflinesheight \openlineheight
+%D \noflines\noflinesheight
+%D #1\ifdim\noflines\openlineheight=#2\relax \else
+%D \advance\noflines\ifdim#2>\zeropoint\plusone\else\minusone\fi
+%D \fi\fi
+%D \fi}
+%D
+%D \def\getnoflines {\dogetnoflines\iftrue } % compensated
+%D \def\getrawnoflines{\dogetnoflines\iffalse} % no compensation
+%D \stoptyping
+%D
+%D A more recent variant is:
+
+\ifx\roundingeps\undefined \newdimen\roundingeps \roundingeps=10sp \fi
+
+\newcount\noflines
+\newdimen\noflinesheight
+
+\def\getnoflines#1%
+ {\noflinesheight#1\relax
+ \ifzeropt\noflinesheight
+ \noflines\zerocount
+ \else\ifdim\noflinesheight>\zeropoint
+ \advance\noflinesheight-\roundingeps
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \advance\noflines\plusone
+ \else
+ \advance\noflinesheight\roundingeps
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \advance\noflines\minusone
+ \fi\fi}
+
+\def\getroundednoflines#1%
+ {\noflinesheight#1\relax
+ \ifzeropt\noflinesheight
+ \noflines\zerocount
+ \else\ifdim\noflinesheight>\zeropoint
+ \advance\noflinesheight\roundingeps
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \else
+ \advance\noflinesheight-\roundingeps
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \fi\fi}
+
+\def\getrawnoflines#1%
+ {\noflinesheight#1\relax
+ \ifzeropt\noflinesheight
+ \noflines\zerocount
+ \else\ifdim\noflinesheight>\zeropoint
+ \advance\noflinesheight\roundingeps
+ \advance\noflinesheight.5\openlineheight
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \else
+ \advance\noflinesheight-\roundingeps
+ \advance\noflinesheight-.5\openlineheight
+ \divide\noflinesheight\openlineheight
+ \noflines\noflinesheight
+ \fi\fi}
+
+%D Let's proof that it works:
+%D
+%D \startbuffer
+%D \scratchdimen\dimexpr(3pt) \getnoflines\scratchdimen 1=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight) \getnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.1\lineheight) \getnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.5\lineheight) \getnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.9\lineheight) \getnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight+3pt) \getnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight+3sp) \getnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight-3sp) \getnoflines\scratchdimen 10=\the\noflines \endgraf
+%D
+%D \scratchdimen\dimexpr(3pt) \getrawnoflines\scratchdimen 0=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.1\lineheight) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.5\lineheight) \getrawnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10.9\lineheight) \getrawnoflines\scratchdimen 11=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight+3pt) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight+3sp) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \scratchdimen\dimexpr(10\lineheight-3sp) \getrawnoflines\scratchdimen 10=\the\noflines \endgraf
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {determinenoflines}
+%D
+%D The next macro determines the number of lines and
+%D returns it it \type {\noflines}. The macro works
+%D reasonable well as long as the content can be unboxed.
+%D
+%D \starttyping
+%D \determinenoflines{test\\test}
+%D \determinenoflines{\bfd test\\test}
+%D \determinenoflines{\definedfont[Sans at 40pt]test\\test}
+%D \stoptyping
+
+\def\dodeterminenoflines % can be mkiv'd
+ {\beginofshapebox
+ \unvbox\nextbox
+ \endofshapebox
+ % \global\count1\zerocount
+ % \reshapebox{\global\advance\count1\plusone}%
+ % \egroup\noflines\count1 }%
+ \scratchcounter\zerocount
+ \reshapebox{\global\advance\scratchcounter\plusone}%
+ \expandafter\egroup\expandafter\noflines\the\scratchcounter\relax}
+
+\def\determinenoflines
+ {\bgroup
+ \forgetall
+ \let\crlf\endgraf
+ \let\\\endgraf
+ \dowithnextbox{\dodeterminenoflines}\vbox}
+
+%D \macros
+%D {doiftextelse, doiftext}
+%D
+%D When \type {\doifelse} cum suis hopelessly fail, for
+%D instance because we pass data, we can fall back on the next
+%D macro:
+%D
+%D \starttyping
+%D \doiftextelse {data} {then branch} {else branch}
+%D \doiftext {data} {then branch}
+%D \stoptyping
+
+\def\doiftextelse#1%
+ {\bgroup
+ \setbox\scratchbox\normalhbox
+ {\settrialtypesetting
+ \ignorespaces#1\removeunwantedspaces}%
+ \ifzeropt\wd\scratchbox
+ \egroup\@EA\secondoftwoarguments
+ \else
+ \egroup\@EA\firstoftwoarguments
+ \fi}
+
+\def\doiftext#1#2%
+ {\doiftextelse{#1}{#2}\donothing}
+
+%D \macros
+%D {dowithnextbox,nextbox}
+%D
+%D Sometimes we want a macro to grab a box and do something
+%D on the content. One could pass an argument to a box, but
+%D this can violate the specific \CATCODES\ of its content and
+%D leads to unexpected results. The next macro treats the
+%D following braced text as the content of a box and
+%D manipulates it afterwards in a predefined way.
+%D
+%D The first argument specifies what to do with the content.
+%D This content is available in \type{\nextbox}. The second
+%D argument is one of \type{\hbox}, \type{\vbox} or
+%D \type{\vtop}. The third argument must be grouped with
+%D \type{\bgroup} and \type{\egroup}, \type{{...}} or can be
+%D a \type{\box} specification.
+%D
+%D In \CONTEXT\ this macro is used for picking up a box and
+%D treating it according to earlier specifications. We use for
+%D instance something like:
+%D
+%D \starttyping
+%D \def\getfloat%
+%D {\def\handlefloat{...\flushnextbox...}
+%D \dowithnextbox\handlefloat\normalvbox}
+%D \stoptyping
+%D
+%D instead of:
+%D
+%D \starttyping
+%D \def\getfloat#1%
+%D {...#1...}
+%D \stoptyping
+%D
+%D In this implementation the \type{\aftergroup} construction
+%D is needed because \type{\afterassignment} is executed inside
+%D the box.
+
+\ifx\nextbox\undefined \newbox\nextbox \fi
+
+\long\def\dowithnextbox#1%
+ {\long\def\dodowithnextbox{#1}%
+ \afterassignment\dododowithnextbox
+ \setbox\nextbox}
+
+\def\dododowithnextbox
+ {\aftergroup\dodowithnextbox}
+
+\long\def\dowithnextboxcs#1%
+ {\let\dodowithnextbox#1%
+ \afterassignment\dododowithnextbox
+ \setbox\nextbox}
+
+\def\dododowithnextbox
+ {\aftergroup\dodowithnextbox}
+
+%D So in fact we get:
+%D
+%D \starttyping
+%D \setbox\nextbox { \aftergroup\dodowithnextbox ... }
+%D \stoptyping
+%D
+%D or
+%D
+%D \starttyping
+%D \setbox\nextbox { ... } \dodowithnextbox
+%D \stoptyping
+%D
+%D A slower but more versatile implementation is:
+%D
+%D \starttyping
+%D \long\def\dowithnextbox#1#2%
+%D {\long\def\dodowithnextbox{#1}%
+%D \ifx#2\normalhbox
+%D \afterassignment\dododowithnextbox
+%D \else\ifx#2\normalvbox
+%D \afterassignment\dododowithnextbox
+%D \else\ifx#2\normalvtop
+%D \afterassignment\dododowithnextbox
+%D \else\ifx#2\normalvcenter
+%D \afterassignment\dododowithnextbox
+%D \else
+%D \afterassignment\dodowithnextbox
+%D \fi\fi\fi\fi
+%D \setbox\nextbox#2}
+%D \stoptyping
+%D
+%D This alternative also accepts \type{\box0} and alike, but
+%D we don't really need this functionality now.
+
+%D \macros
+%D {nextboxht,nextboxwd,nextboxdp,flushnextbox}
+%D
+%D The next couple of shortcuts saves us memory as well as
+%D \type {{}}'s in passing parameters.
+
+\def\nextboxht {\ht\nextbox}
+\def\nextboxwd {\wd\nextbox}
+\def\nextboxdp {\dp\nextbox}
+\def\nextboxhtdp {\dimexpr\ht\nextbox+\dp\nextbox\relax}
+
+\def\flushnextbox{\box\nextbox}
+
+%D \macros
+%D {dowithnextboxcontent}
+%D
+%D But, occasionally we do need to pass some local settings
+%D without wanting to use additional grouping. Therefore we
+%D provide:
+%D
+%D \starttyping
+%D \dowithnextboxcontent{inside}{after}{box content}
+%D \stoptyping
+%D
+%D {\em todo: Search source for potential usage!}
+
+\long\def\dowithnextboxcontent#1#2% inside, after
+ {\long\def\dodowithnextbox{#2}%
+ \def\dododowithnextbox{#1\aftergroup\dodowithnextbox}%
+ \afterassignment\dododowithnextbox
+ \setbox\nextbox}
+
+%D Now we can redefine \type {\dowithnextbox} as follows:
+%D
+%D \starttyping
+%D \def\dowithnextbox{\dowithnextboxcontent\empty}
+%D \stoptyping
+%D
+%D But since this macro is used often and since this implementation
+%D is slower, we will not use that definition.
+
+% maybe:
+%
+% depending on the size of the action, about 10% faster
+%
+% \newtoks\nextboxtoks
+%
+% \def\dowithnextbox {\afterassignment\redowithnextbox\nextboxtoks}
+% \def\redowithnextbox {\afterassignment\dododowithnextbox\setbox\nextbox}
+% \def\dododowithnextbox{\aftergroup\dodowithnextbox}
+% \def\dodowithnextbox {\the\nextboxtoks}
+%
+% \long\def\dowithnextboxcontent#1% #2% inside, after
+% {\def\dododowithnextbox{#1\aftergroup\dodowithnextbox}%
+% \afterassignment\redowithnextboxcontent\nextboxtoks}
+%
+% \def\redowithnextboxcontent
+% {\afterassignment\dododowithnextbox\setbox\nextbox}
+
+%D \macros
+%D {llap, rlap, tlap, blap, clap}
+%D
+%D Some well known friends, but we implement them our own
+%D way. We want the macros to work in both math and text mode.
+
+\def\dodorlap{\normalhbox to \zeropoint{\flushnextbox\normalhss}\endgroup}
+\def\dodollap{\normalhbox to \zeropoint{\normalhss\flushnextbox}\endgroup}
+\def\dodoclap{\normalhbox to \zeropoint{\normalhss\flushnextbox\normalhss}\endgroup}
+
+\def\dorlap{\begingroup\dowithnextboxcs\dodorlap\normalhbox}
+\def\dollap{\begingroup\dowithnextboxcs\dodollap\normalhbox}
+\def\doclap{\begingroup\dowithnextboxcs\dodoclap\normalhbox}
+
+\def\domathclap{\mathpalette\dodomathclap} \def\dodomathclap#1#2{\doclap{$\mathsurround\zeropoint#1#2$}}
+\def\domathllap{\mathpalette\dodomathllap} \def\dodomathllap#1#2{\dollap{$\mathsurround\zeropoint#1#2$}}
+\def\domathrlap{\mathpalette\dodomathrlap} \def\dodomathrlap#1#2{\dorlap{$\mathsurround\zeropoint#1#2$}}
+
+\unexpanded\def\rlap{\mathortext\domathrlap\dorlap}
+\unexpanded\def\llap{\mathortext\domathllap\dollap}
+\unexpanded\def\clap{\mathortext\domathclap\doclap}
+
+\def\dodotlap{\normalvbox to \zeropoint{\normalvss\flushnextbox}\endgroup}
+\def\dodoblap{\normalvbox to \zeropoint{\flushnextbox\normalvss}\endgroup}
+
+\def\tlap{\begingroup\dowithnextboxcs\dodotlap\normalvbox}
+\def\blap{\begingroup\dowithnextboxcs\dodoblap\normalvbox}
+
+%D \macros
+%D {beginofshapebox,
+%D reshapebox, doreshapebox,
+%D flushshapebox,
+%D innerflushshapebox,
+%D shapebox,
+%D ifreshapingbox}
+%D
+%D The next utility macro originates from some linenumbering
+%D mechanism. Due to \TEX's advanced way of typesetting
+%D paragraphs, it's not easy to do things on a line||by||line
+%D basis. This macro is able to reprocess a given box and can
+%D act upon its vertical boxed components, such as lines. The
+%D unwinding sequence in this macro is inspired by a \NTG\
+%D workshop of David Salomon in June 1992.
+%D
+%D First we have to grab the piece of text we want to act
+%D upon. This is done by means of the duo macros:
+%D
+%D \starttyping
+%D \beginofshapebox
+%D a piece of text
+%D \endofshapebox
+%D \stoptyping
+%D
+%D When all texts is collected, we can call \type{\reshapebox}
+%D and do something with it's vertical components. We can make
+%D as much passes as needed. When we're done, the box can be
+%D unloaded with \type{\flushshapebox}. The only condition in
+%D this scheme is that \type{\reshapebox} must somehow unload
+%D the \BOX\ \type{\shapebox}.
+%D
+%D An important aspect is that the content is unrolled
+%D bottom||up. The next example illustrates this maybe
+%D unexpected characteristic.
+%D
+%D \startbuffer
+%D \beginofshapebox
+%D \em \input tufte
+%D \endofshapebox
+%D
+%D \newcounter\LineNumber
+%D
+%D \reshapebox
+%D {\doglobal\increment\LineNumber
+%D \normalhbox{\llap{\LineNumber\hskip2em}\box\shapebox}}
+%D
+%D \flushshapebox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D As we can see, when some kind of numbering is done, we have
+%D to add a second pass.
+%D
+%D \startbuffer
+%D \newcounter\LineNumber
+%D \newcounter\NumberOfLines
+%D
+%D \reshapebox
+%D {\doglobal\increment\NumberOfLines
+%D \box\shapebox}
+%D
+%D \reshapebox
+%D {\doglobal\increment\LineNumber
+%D \normalhbox
+%D {\llap{\LineNumber\ (\NumberOfLines)\hskip2em}%
+%D \box\shapebox}%
+%D \doglobal\decrement\NumberOfLines}
+%D
+%D \flushshapebox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D This example shows that the content of the box is still
+%D available after flushing. Another feature is that only the
+%D last reshaping counts. Multiple reshaping can be done by:
+%D
+%D \startbuffer
+%D \beginofshapebox
+%D \flushshapebox
+%D \endofshapebox
+%D
+%D \reshapebox
+%D {\doglobal\increment\LineNumber
+%D \normalhbox{\llap{$\star$\hskip1em}\box\shapebox}%
+%D \doglobal\decrement\NumberOfLines}
+%D
+%D \flushshapebox
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer
+%D
+%D The macros are surprisingly easy to follow and in fact
+%D introduce no new concepts. Nearly all books on \TEX\ show
+%D similar solutions for unwinding \BOXES.
+%D
+%D Some macros, like footnote ones, can be sensitive for
+%D reshaping, which can result in an endless loop. We
+%D therefore offer:
+%D
+%D \starttyping
+%D \ifreshapingbox
+%D \stoptyping
+%D
+%D Some \CONTEXT\ commands are protected this way. Anyhow,
+%D reshaping is aborted after 100 dead cycles.
+%D
+%D By the way, changing the height and depth of \BOX\
+%D \type{\shapebox} results in bad spacing. This means that
+%D for instance linenumbers etc. should be given zero height
+%D and depth before being lapped into the margin. The
+%D previous examples ignore this side effect, but beware!
+
+\newif \ifsomeshapeleft
+\newif \ifreshapingbox
+
+\newbox \shapebox
+\newcount \shapepenalty
+\newdimen \shapekern
+\newskip \shapeskip
+
+\newbox \newshapebox
+\newbox \oldshapebox
+
+\newcount \shapecounter
+
+\newevery \everyshapebox \relax
+
+\def\shapesignal{.12345678pt} % or 12345sp
+
+\def\reshapebox#1%
+ {\doreshapebox
+ {#1}%
+ {\penalty\shapepenalty}%
+ {\kern \shapekern }%
+ {\vskip \shapeskip }}
+
+\newbox\tmpshapebox
+
+\newif\ifreshapingfailed % may save redundant runs
+
+\def\doreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip
+ {\global\reshapingfailedfalse
+ \ifzeropt\ht\oldshapebox % \ifdim\ht\oldshapebox=\zeropoint
+ \setbox\newshapebox\emptyvbox
+ \else
+ \setbox\newshapebox\normalvbox
+ {\unvcopy\oldshapebox
+ \setbox\newshapebox\emptybox
+ \shapecounter\zerocount
+ \doloop{\dodoreshapebox{#1}{#2}{#3}{#4}}}%
+ \setbox\newshapebox\box\tmpshapebox
+ \fi}
+
+\ifx\originalshapebox\undefined \let\originalshapebox\oldshapebox \fi
+
+% We will turn this into a \MKIV\ variant.
+
+\def\insertshapesignal
+ {\normalhbox to \shapesignal{\strut\hss}% plus \strut
+ \prevdepth\strutdp} % never \nointerlineskip
+
+\def\restoreshapebox % compensates for the signal
+ {\global\setbox\tmpshapebox\vbox{\vskip-\lineheight\unvcopy\oldshapebox}}
+
+\def\dodoreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip
+ {\ifnum\lastnodetype=\@@gluenode
+ \shapeskip\lastskip
+ \global\setbox\tmpshapebox\normalvbox{#4\unvbox\tmpshapebox}%
+ \unskip
+ \else\ifnum\lastnodetype=\@@kernnode
+ \shapekern\lastkern
+ \global\setbox\tmpshapebox\normalvbox{#3\unvbox\tmpshapebox}%
+ \unkern
+ \else\ifnum\lastnodetype=\@@penaltynode
+ \shapepenalty\lastpenalty
+ \global\setbox\tmpshapebox\normalvbox{#2\unvbox\tmpshapebox}%
+ \unpenalty
+ \else\ifnum\lastnodetype<\zeropoint
+ \exitloop
+ \else
+ \setbox\shapebox\lastbox
+ \ifvoid\shapebox
+ \else\ifdim\wd\shapebox=\shapesignal\relax
+ \exitloop
+ \else
+ \shapecounter\zerocount
+ \global\setbox\tmpshapebox\normalvbox{#1\unvbox\tmpshapebox}%
+ \fi\fi
+ \fi\fi\fi\fi
+ \ifnum\shapecounter>100 % can be less
+ \global\reshapingfailedtrue
+ \message{!!forced exit from shapebox \the\lastnodetype !!}%
+ \restoreshapebox
+ \exitloop
+ \else
+ \advance\shapecounter \plusone
+ \fi}
+
+\def\beginofshapebox
+ {\setbox\oldshapebox\normalvbox
+ \bgroup
+ \reshapingboxtrue
+ \the\everyshapebox
+ \insertshapesignal}
+
+\def\endofshapebox
+ {\endgraf
+ \egroup}
+
+\let\beginshapebox\beginofshapebox
+\let\endshapebox \endofshapebox
+
+\def\flushshapebox
+ {\bgroup
+ \ifzeropt\ht\newshapebox % \ifdim\ht\newshapebox=\zeropoint
+ \else
+ % make \prevdepth legal
+ % \par before the next \vskip gives far worse results
+ \ifdim\parskip>\zeropoint\vskip\parskip\else\par\fi
+ % and take a look
+ \ifdim\prevdepth=-\thousandpoint
+ \prevdepth\zeropoint
+ \fi
+ \ifdim\prevdepth<\zeropoint\relax
+ % something like a line or a signal or ...
+ \donetrue
+ \else\ifinner
+ % not watertight and not ok
+ \donefalse
+ \else\ifdim\pagegoal=\maxdimen
+ \donetrue
+ \else
+ % give the previous line a normal depth
+ \donetrue
+ {\forgeteverypar\verticalstrut}\nobreak
+ \kern-\struttotal % geen \vskip
+ \kern-\parskip
+ % \vskip-\strutdp
+ \fi\fi\fi
+ \scratchdimen\dp\newshapebox
+ \unvbox\newshapebox
+ % \prevdepth=0pt and \dp\newshapebox depend on last line
+ \kern-\scratchdimen % ??
+ % now \prevdepth=0pt
+ \ifdone
+ \kern\strutdp
+ \prevdepth\strutdp
+ \fi
+ \fi
+ \egroup}
+
+%D In real inner situations we can use:
+%D
+%D \starttyping
+%D \flushinnershapebox
+%D \stoptyping
+%D
+%D This one is used in \type{\framed}.
+
+% The kern fails on for instance:
+%
+% \omlijnd[offset=0pt,hoogte=8mm,uitlijnen={rechts,laho}]{\bfa test}
+
+\def\innerflushshapebox
+ {\ifzeropt\ht\newshapebox \else
+ \unvcopy\newshapebox\relax % unvcopy ! else spacing problem
+ % \kern-\dp\newshapebox\relax
+ \fi}
+
+%D For absolute control, one can use \type{\doreshapebox}
+%D directly. This macro takes four arguments, that take care
+%D of:
+%D
+%D \startitemize[n,packed]
+%D \item \type{\shapebox}
+%D \item \type{\shapepenalty}
+%D \item \type{\shapekern}
+%D \item \type{\shapeskip}
+%D \stopitemize
+
+%D \macros
+%D {shapedhbox}
+%D
+%D When constructing a new box, using the content of \type
+%D {\shapebox}, one can best use \type {\shapedhbox} instead
+%D of \type {\normalhbox}, since it manages the height and depth of
+%D the line.
+
+\def\shapedhbox % lines with non strutted dimensions have
+ {\expanded{\dowithnextbox % interlineskip so if we want the original
+ {\nextboxht\the\ht\shapebox % spacing, we need to preserve the original
+ \nextboxdp\the\dp\shapebox % height and depth which is definitely
+ \noexpand\flushnextbox}} % needed if we apply struts to the 'new'
+ \normalhbox} % box or do something that changed ist size
+
+%D \macros
+%D {hyphenatedword,
+%D hyphenatedpar,
+%D hyphenatedfile,
+%D dohyphenateword}
+%D
+%D We no longer use the pure \TEX\ variant. In due time we will
+%D report some more advanced statistics.
+%D
+%D \starttyping
+%D \showhyphens{dohyphenatedword}
+%D \stoptyping
+
+\def\doshowhyphenatednextbox
+ {\ctxcommand{showhyphenatedinlist(tex.box[\number\nextbox].list)}}
+
+\def\showhyphens{\dowithnextbox\doshowhyphenatednextbox\hbox}
+
+%D The following macros are seldom used but handy for tracing.
+%D
+%D \starttyping
+%D \hyphenatedword{dohyphenatedword}
+%D \hyphenatedpar {\dorecurse{10}{dohyphenatedword }}
+%D \hyphenatedfile{tufte}
+%D \stoptyping
+
+\def\dohyphenatednextbox
+ {\ctxcommand{hyphenatedlist(tex.box[\number\nextbox])}%
+ \unhbox\nextbox}
+
+\def\hyphenatedword {\dowithnextbox\dohyphenatednextbox \hbox}
+\def\hyphenatedpar {\dowithnextbox\dohyphenatednextbox \hbox}
+\def\hyphenatedfile#1{\dowithnextbox\dohyphenatednextbox \hbox{\readfile{#1}\donothing\donothing}}
+
+%D \macros
+%D {processtokens}
+%D
+%D We fully agree with (most) typographers that inter||letter
+%D spacing is only permitted in fancy titles, we provide a
+%D macro that can be used to do so. Because this is
+%D (definitely and fortunately) no feature of \TEX, we have to
+%D step through the token list ourselves.
+%D
+%D \starttyping
+%D \processtokens {before} {between} {after} {space} {tokens}
+%D \stoptyping
+%D
+%D An example of a call is:
+%D
+%D \startbuffer
+%D \processtokens {[} {+} {]} {\space} {hello world}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This results in:
+%D
+%D \getbuffer
+%D
+%D The list of tokens may contain spaces, while \type{\\},
+%D \type{{}} and \type{\ } are handled as space too.
+
+\def\dodoprocesstokens
+ {\ifx\nextprocessedtoken\lastcharacter
+ \after
+ \let\nextprocessedtoken\relax
+ \else\ifx\nextprocessedtoken\bgroup
+ \def\nextprocessedtoken
+ {\dowithnextbox
+ {\before{\copy\nextbox}% \before can use nextbox several times
+ \let\before\between
+ \doprocesstokens}
+ \hbox\bgroup}%
+ \else
+ \expandafter\if\space\nextprocessedtoken
+ \after\white
+ \let\before\savedbefore
+ \else
+ \before\nextprocessedtoken
+ \let\before\between
+ \fi
+ \let\nextprocessedtoken\doprocesstokens
+ \fi\fi
+ \nextprocessedtoken}
+
+\def\doprocesstokens% the space after = is essential
+ {\afterassignment\dodoprocesstokens\let\nextprocessedtoken= }
+
+\def\processtokens#1#2#3#4#5%
+ {\begingroup
+ \def\lastcharacter{\lastcharacter}%
+ \def\space{ }%
+ \let\\=\space
+ \def\before {#1}%
+ \def\between{#2}%
+ \def\after {#3}%
+ \def\white {#4}%
+ \let\savedbefore\before
+ \doprocesstokens#5\lastcharacter
+ \endgroup}
+
+%D \macros
+%D {doboundtext}
+%D
+%D Sometimes there is not enough room to show the complete
+%D (line of) text. In such a situation we can strip of some
+%D characters by using \type{\doboundtext}. When the text is
+%D wider than the given width, it's split and the third
+%D argument is appended. When the text to be checked is packed
+%D in a command, we'll have to use \type{\expandafter}.
+%D
+%D \starttyping
+%D \doboundtext{a very, probably to long, text}{3cm}{...}
+%D \stoptyping
+%D
+%D When calculating the room needed, we take the width of the
+%D third argument into account, which leads to a bit more
+%D complex macro than needed at first sight.
+
+\def\dodoboundtext#1%
+ {\setbox0\normalhbox{#1}%
+ \advance\scratchdimen -\wd0
+ \ifdim\scratchdimen>\zeropoint\relax#1\fi}%
+
+\def\doboundtext#1#2#3% still used?
+ {\normalhbox
+ {\setbox\scratchbox\normalhbox{#1}%
+ \scratchdimen#2\relax
+ \ifdim\wd\scratchbox>\scratchdimen
+ \setbox\scratchbox\normalhbox{#3}%
+ \advance\scratchdimen -\wd\scratchbox
+ \handletokens#1\with\dodoboundtext
+ \fi
+ \box\scratchbox}}
+
+%D \macros
+%D {limitatetext}
+%D
+%D A bit more beautiful alternative for the previous command is
+%D the next one. This command is more robust because we let
+%D \TEX\ do most of the job. The previous command works better
+%D on text that cannot be hyphenated.
+%D
+%D \starttyping
+%D \limitatetext {text} {width} {sentinel}
+%D \limitatetext {text} {-width} {prelude}
+%D \stoptyping
+%D
+%D When no width is given, the whole text comes available. The
+%D sentinel is optional. This is about the third version.
+
+\ifx\fakecompoundhyphen\undefined \let\fakecompoundhyphen\relax \fi
+\ifx\veryraggedright \undefined \def\veryraggedright{\raggedright} \fi
+
+%D The simple alternative is as follows:
+%D
+%D \starttyping
+%D \unexpanded\def\limitatetext%
+%D {\bgroup % evt \setstrut
+%D \forgetall
+%D \fakecompoundhyphen % dangerous ! ! ! ! ! ! ! ! !
+%D \dowithnextbox\dolimitatetext\normalhbox}
+%D
+%D \def\dolimitatetext#1#2%
+%D {\doifelsenothing{#1}
+%D {\unhbox\nextbox}
+%D {\widowpenalty=0
+%D \clubpenalty=0
+%D \scratchdimen=#1\relax
+%D \ifdim\nextboxwd>\scratchdimen
+%D \setbox\scratchbox=\normalhbox{ #2}%
+%D \advance\scratchdimen by -\wd\scratchbox
+%D \setbox\nextbox=\normalvbox
+%D {\hsize=\scratchdimen
+%D \hfuzz\maxdimen
+%D \veryraggedright
+%D \strut\unhcopy\nextbox}%
+%D \ifdim\nextboxht>\strutht \else
+%D \setbox\scratchbox\emptyhbox % overfull and not split
+%D \fi
+%D \setbox\nextbox=\normalvbox % if omitted: missing brace reported
+%D {\splittopskip=\openstrutheight
+%D \setbox\nextbox=\vsplit\nextbox to \strutht
+%D \unvbox\nextbox
+%D \setbox\nextbox=\lastbox
+%D \global\setbox1=\normalhbox
+%D {\unhbox\nextbox\unskip\kern\zeropoint\box\scratchbox\unskip}}%
+%D \unhbox1
+%D \else
+%D \unhbox\nextbox
+%D \fi}%
+%D \egroup}
+%D \stoptyping
+%D
+%D The next alternative accepts a negative width. A negative
+%D value crops the beginning. The macro thereby becomes less
+%D readable, which is why we kept the original here too.
+
+\unexpanded\def\limitatetext
+ {\bgroup % evt \setstrut
+ \forgetall % otherwise indentation and so
+ %\def\limitatetext##1##2##3{##1}% \def !
+ \let\limitatetext\firstofthreearguments
+ \fakecompoundhyphen % dangerous ! ! ! ! ! ! ! ! !
+ \dowithnextboxcs\dolimitatetext\normalhbox}
+
+\def\dolimitatetext#1#2%
+ {\doifelsenothing{#1}
+ {\unhbox\nextbox}
+ {\nopenalties
+ \scratchdimen#1\relax
+ \ifdim\scratchdimen<\zeropoint\relax % we'll take the last line
+ \donefalse
+ \scratchdimen-\scratchdimen
+ \else
+ \donetrue
+ \fi
+ \ifdim\nextboxwd>\scratchdimen
+ \setbox\scratchbox\normalhbox{\ifdone\space#2\else#2\space\fi}%
+ \advance\scratchdimen -\wd\scratchbox
+ \setbox0\flushnextbox
+ \setbox\nextbox\normalvbox
+ {\hsize\scratchdimen
+ \hfuzz\maxdimen
+ \veryraggedright
+ \strut
+ \ifdone \else
+ \parfillskip\zeropoint
+ \rightskip\zeropoint
+ \hskip\zeropoint \!!plus 1\!!fill % \hsize
+ \fi
+ \unhcopy0}%
+ \ifdim\nextboxht>\strutht
+ \setbox\nextbox\normalvbox % if omitted: missing brace reported
+ {\splittopskip\openstrutheight
+ \ifdone
+ \setbox\nextbox\vsplit\nextbox to \strutht
+ \else
+ \doloop
+ {\setbox0\vsplit\nextbox to \strutht
+ \ifdim\nextboxht>\strutht \else \exitloop \fi}%
+ \fi
+ \unvbox\nextbox
+ \setbox\nextbox\lastbox
+ \global\setbox1\normalhbox
+ {\ifdone
+ \unhbox\nextbox\unskip\kern\zeropoint\box\scratchbox
+ \else
+ \box\scratchbox\unhbox\nextbox
+ \fi
+ \unskip}}%
+ \unhbox1
+ \else
+ \unhbox0
+ \fi
+ \else
+ \unhbox\nextbox
+ \fi}%
+ \egroup}
+
+%D We can also limit a text with more control:
+%D
+%D \startbuffer
+%D \limitatetext {\input tufte } {2cm,5mm} {\unknown}
+%D \limitatetext {ton en hans} {2cm,5mm} {\unknown}
+%D \limitatetext {ton en hans zijn eikels} {2cm,5mm} {\unknown}
+%D \limitatetext {ton} {2cm,5mm} {\unknown}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+%D
+%D We build this feature on top of the previous macro.
+
+\let\normallimitatetext\limitatetext
+
+\def\speciallimitatetext#1#2#3#4% text left right placeholder
+ {%\dontleavehmode
+ \bgroup
+ %\def\speciallimitatetext##1##2##3##4{##1}% \def !
+ \let\speciallimitatetext\firstoffourarguments
+ \setbox0\normalhbox
+ {\nohyphens
+ \normallimitatetext{#1}{+#2}{}#4%
+ \normallimitatetext{#1}{-#3}{}}%
+ \setbox2\normalhbox
+ {#1}%
+ \ifdim\wd2<\wd0 #1\else\unhbox0\fi
+ \egroup}
+
+\def\limitatetext#1#2#3% \expanded added 2003/01/16
+ {\expanded{\beforesplitstring#2}\at,\to\leftlimit
+ \expanded{\aftersplitstring #2}\at,\to\rightlimit
+ \ifx\rightlimit\empty
+ \normallimitatetext {#1}\leftlimit {#3}%
+ \else
+ \speciallimitatetext{#1}\leftlimit\rightlimit{#3}%
+ \fi}
+
+%D Undocumented bonus (see wiki):
+%D
+%D \starttyping
+%D \limitatefirstline{\input tufte\relax}{10cm}{\unknown}
+%D \stoptyping
+
+\def\limitatefirstline#1#2#3%
+ {\hbox\bgroup\strut
+ \setbox\scratchbox\hbox{\begstrut#1\endstrut}%
+ \ifdim\wd\scratchbox>#2\relax
+ \setbox\scratchbox\hbox{#3}%
+ \hsize#2\relax
+ \advance\hsize-\wd\scratchbox
+ \setbox\scratchbox\vbox{\forgetall\veryraggedright#1}%
+ \setbox\scratchbox\vsplit\scratchbox to \lineheight
+ \vbox
+ {\unvbox\scratchbox
+ \global\setbox\plusone\lastbox
+ \global\setbox\plusone\hbox{\strut\unhbox\plusone}%
+ \hbox % to #2
+ {\ifx\clip\undefined
+ \box\plusone
+ \else\ifdim\wd\plusone>\hsize
+ \lower\strutdepth\hbox{\clip[\c!width=\hsize,\c!height=\lineheight]{\hbox{\raise\strutdepth\box\plusone}}}%
+ \else
+ \box\plusone
+ \fi\fi
+ \removeunwantedspaces#3}}% \removeunwantedspaces\hss#3}}%
+ \else
+ #1%
+ \fi
+ \egroup}
+
+%D \macros
+%D {processisolatedwords,processisolatedchars}
+%D
+%D \startbuffer
+%D \processisolatedchars{some more words} \ruledhbox \par
+%D \processisolatedchars{and some $x + y = z$ math} \ruledhbox \par
+%D \processisolatedchars{and a \normalhbox{$x + y = z$}} \ruledhbox \par
+%D \processisolatedwords{some more words} \ruledhbox \par
+%D \processisolatedwords{and some $x + y = z$ math} \ruledhbox \par
+%D \processisolatedwords{and a \normalhbox{$x + y = z$}} \ruledhbox \par
+%D \stopbuffer
+%D
+%D \typebuffer \blank \getbuffer \blank
+
+% todo: provide variant with #1 picked up as box
+
+\def\processisolatedchars#1#2%
+ {\dontleavehmode
+ \begingroup
+ \setbox\scratchbox\normalhbox{#1}%
+ \ctxcommand{applytochars(\number\scratchbox,"\strippedcsname#2",true)}%
+ \endgroup}
+
+\def\processisolatedwords#1#2%
+ {\dontleavehmode
+ \begingroup
+ \setbox\scratchbox\normalhbox{#1}%
+ \ctxcommand{applytowords(\number\scratchbox,"\strippedcsname#2",true)}%
+ \endgroup}
+
+\unexpanded\def\processwords#1%
+ {\processisolatedwords{#1}\processword}
+
+\let\processword\relax
+
+%D The better variant:
+
+\def\applytocharacters#1%
+ {\dontleavehmode
+ \dowithnextbox{\ctxcommand{applytochars(\number\nextbox,"\strippedcsname#1",true)}}%
+ \normalhbox}
+
+\def\applytowords#1%
+ {\dontleavehmode
+ \dowithnextbox{\ctxcommand{applytowords(\number\nextbox,"\strippedcsname#1",true)}}%
+ \normalhbox}
+
+%D \macros
+%D {sbox}
+%D
+%D This is a rather strange command. It grabs some box content
+%D and and limits the size to the height and depth of a
+%D \type{\strut}. The resulting bottom||alligned box can be used
+%D aside other ones, without disturbing the normal baseline
+%D distance.
+%D
+%D \startbuffer
+%D \ruledhbox to .5\hsize{\sbox{eerste\par tweede \par derde}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D Shows up as:
+%D
+%D \startvoorbeeld
+%D \vskip3\baselineskip
+%D \getbuffer
+%D \stopvoorbeeld
+%D
+%D Before displaying the result we added some skip, otherwise
+%D the first two lines would have ended up in the text. This
+%D macro can be useful when building complicated menus, headers
+%D and footers and|/|or margin material.
+
+\def\sbox% in handleiding, voorbeeld \inleft{xx} \extern..
+ {\normalvbox\bgroup % new ! ! !
+ \dowithnextbox
+ {\setbox\scratchbox\normalhbox
+ {\strut
+ \nextboxdp\zeropoint
+ \lower\strutdepth\flushnextbox}%
+ \dp\scratchbox\strutdepth
+ \ht\scratchbox\strutheight
+ \box\scratchbox
+ \egroup}%
+ \normalvbox}
+
+%D \macros
+%D {struttedbox}
+%D
+%D This boxing macro limits the height and depth to those of
+%D a strut.
+
+\def\struttedbox
+ {\normalhbox\bgroup % new ! ! !
+ \dowithnextbox
+ {\nextboxdp\strutdepth
+ \nextboxht\strutheight
+ \flushnextbox
+ \egroup}%
+ \normalhbox}
+
+%D \macros
+%D {topskippedbox}
+%D
+%D This macro compensates the difference between the topskip
+%D and strutheight. Watch how we preserve the depth when it
+%D equals strutdepth.
+
+\def\topskippedbox
+ {\normalhbox\bgroup
+ \dowithnextbox
+ {\edef\next{\ifdim\strutdepth=\nextboxdp\nextboxdp\the\nextboxdp\fi}%
+ \lower\topskip\normalhbox{\raise\strutheight\flushnextbox}%
+ \next
+ \egroup}%
+ \normalhbox}
+
+%D \macros
+%D {centeredbox, centerednextbox}
+%D
+%D Here is another strange one. This one offers a sort of overlay
+%D with positive or negative offsets. This command can be used
+%D in well defined areas where no offset options are available.
+%D We first used it when building a button inside the margin
+%D footer, where the button should have a horizontal offset and
+%D should be centered with respect to the surrounding box. The
+%D last of the three examples we show below says:
+%D
+%D \starttyping
+%D \vsize=3cm
+%D \hsize=3cm
+%D \ruledvbox to \vsize
+%D {\centeredbox height .5cm width -1cm
+%D {\vrule width \hsize height \vsize}}}
+%D \stoptyping
+%D
+%D Here the \type{\ruledvbox} just shows the surrounding box
+%D and \type{\vrule} is used to show the centered box.
+%D
+%D \def\AnExample#1#2%
+%D {\vsize=3cm
+%D \hsize=3cm
+%D \ruledvbox to \vsize
+%D {\centeredbox height #1 width #2
+%D {\color[green]{\vrule width \hsize height \vsize}}}}
+%D
+%D \startlinecorrection
+%D \startcombination[3*1]
+%D {\AnExample {-1cm} {.5cm}} {}
+%D {\AnExample {.5cm} {-1cm}} {}
+%D {\AnExample {-1cm} {-.5cm}} {}
+%D \stopcombination
+%D \stoplinecorrection
+%D
+%D This command takes two optional arguments: \type{width} and
+%D \type{height}. Observing readers can see that we use \TEX's
+%D own scanner for grabbing these arguments: \type{#1#} reads
+%D everyting till the next brace and passes it to both rules.
+%D The setting of the box dimensions at the end is needed for
+%D special cases. The dimensions of the surrounding box are kept
+%D intact. This commands handles positive and negative
+%D dimensions (which is why we need two boxes with rules).
+
+\def\centeredbox#1#% height +/-dimen width +/-dimen
+ {\bgroup
+ \setbox0\normalvbox to \vsize
+ \bgroup
+ \dontcomplain
+ \forgetall
+ \setbox0\normalhbox{\vrule\!!width \zeropoint#1}%
+ \setbox2\normalvbox{\hrule\!!height\zeropoint#1}%
+ \advance\vsize \ht2
+ \advance\hsize \wd0
+ \normalvbox to \vsize
+ \bgroup
+ \vskip-\ht2
+ \vss
+ \normalhbox to \hsize
+ \bgroup
+ \dowithnextbox
+ {\hskip-\wd0
+ \hss
+ \flushnextbox
+ \hss
+ \egroup
+ \vss
+ \egroup
+ \egroup
+ \wd0\hsize
+ \ht0\vsize
+ \box0
+ \egroup}
+ \normalhbox}
+
+%D For those who don't want to deal with \type {\hsize}
+%D and \type {\vsize}, we have:
+%D
+%D \starttyping
+%D \centerednextbox width 2bp height 2bp
+%D {\framed[width=100bp,height=100bp]{}}
+%D \stoptyping
+%D
+%D Do you see what we call this one \type {next}?
+
+\def\centerednextbox#1#%
+ {\bgroup
+ \dowithnextbox
+ {\hsize\nextboxwd
+ \vsize\nextboxht
+ \centeredbox#1{\flushnextbox}%
+ \egroup}
+ \normalhbox}
+
+%D \macros
+%D {centerbox}
+%D
+%D Centering on the available space is done by:
+%D
+%D \starttyping
+%D \centerbox <optional specs> {content}
+%D \stoptyping
+%D
+%D When omitted, the current \type {\hsize} and \type
+%D {\vsize} are used. Local dimensions are supported.
+
+\long\def\centerbox#1#% optional height +/-dimen width +/-dimen
+ {\bgroup
+ \dowithnextbox
+ {\setlocalhsize
+ \setbox\scratchbox\normalhbox{\vrule\!!width \zeropoint#1}%
+ \ifzeropt\wd\scratchbox\else\hsize\wd\scratchbox\fi
+ \setbox\scratchbox\normalvbox{\hrule\!!height\zeropoint#1}%
+ \ifzeropt\ht\scratchbox\else\vsize\ht\scratchbox\fi
+ \normalvbox to \vsize{\vss\normalhbox to \hsize{\hss\flushnextbox\hss}\vss}%
+ \egroup}%
+ \normalhbox}
+
+%D \macros
+%D {setrigidcolumnhsize,rigidcolumnbalance,rigidcolumnlines}
+%D
+%D These macros are copied from the \TEX book, page~397, and
+%D extended by a macro that sets the \type{\hsize}.
+%D
+%D \starttyping
+%D \setrigidcolumnhsize {total width} {distance} {n}
+%D \rigidcolumnbalance {box}
+%D \stoptyping
+%D
+%D Both these macros are for instance used in typesetting
+%D footnotes.
+%D
+%D Men kan het proces van breken enigzins beinvloeden met de
+%D volgende twee switches:
+
+\newif\ifalignrigidcolumns
+\newif\ifstretchrigidcolumns
+\newif\iftightrigidcolumns % if true: just a vbox, no depth/noflines/gridsnap corrrections
+
+%D De eerste switch bepaald het uitlijnen, de tweede rekt de
+%D individuele kolommen op naar \type{\vsize}.
+
+\def\setrigidcolumnhsize#1#2#3% todo: \dimexpr
+ {\xdef\savedrigidhsize{\the\hsize}%
+ \hsize#1\relax
+ \global\chardef\rigidcolumns#3\relax
+ \scratchdimen -#2\relax
+ \multiply\scratchdimen #3\relax
+ \advance\scratchdimen #2\relax
+ \advance\hsize \scratchdimen
+ \divide\hsize #3\relax}
+
+% ==
+%
+% \def\setrigidcolumnhsize#1#2#3%
+% {\xdef\savedrigidhsize{\the\hsize}%
+% \global\chardef\rigidcolumns#3\relax
+% \hsize=\dimexpr(#1-\numexpr#3-1\relax\dimexpr#2\relax)/#3\relax}
+
+\newbox\rigidcolumnbox
+
+\let\rigidcolumnlines\!!zerocount
+
+\def\rigidcolumnbalance#1%
+ {\ifnum\rigidcolumns=1 % tzt ook h/d correctie
+ \ifinner\ifhmode\box\else\unvbox\fi\else\unvbox\fi#1\relax
+ \else
+ \normalvbox
+ {\forgetall
+ \nopenalties
+ \dontcomplain
+ \setbox\rigidcolumnbox\normalvbox
+ {\line{}\goodbreak\unvbox#1\removebottomthings}%
+ \splittopskip\openstrutheight
+ \setbox\scratchbox\vsplit\rigidcolumnbox to \zeropoint
+ \ifcase\rigidcolumnlines\relax
+ % \iffalse
+ % % maybe some day an option
+ % \scratchskip\ht\rigidcolumnbox
+ % \advance\scratchskip\dp\rigidcolumnbox
+ % \getnoflines\scratchskip
+ % \ifodd\noflines
+ % \advance\noflines\plusone
+ % \fi
+ % \divide\noflines\rigidcolumns
+ %\else
+ \scratchdimen\ht\rigidcolumnbox
+ \divide\scratchdimen \rigidcolumns
+ \getnoflines\scratchdimen
+ %\fi
+ \else
+ \noflines\rigidcolumnlines % to be sure
+ \fi
+ \scratchdimen\noflines\lineheight
+ % new: we now loop so that we don't loose content
+ % since in practice we also use this macro for
+ % funny lineheights and border cases
+ \setbox0=\box\rigidcolumnbox
+ \doloop
+ {\setbox\rigidcolumnbox=\copy0
+ \setbox\scratchbox\normalhbox to \savedrigidhsize
+ {\dorecurse\rigidcolumns
+ {\setbox\scratchbox\vsplit\rigidcolumnbox to \scratchdimen
+ \dp\scratchbox\openstrutdepth
+ \setbox\scratchbox\normalvtop
+ \ifalignrigidcolumns to
+ \ifstretchrigidcolumns\vsize\else\scratchdimen\fi
+ \fi
+ {\unvbox\scratchbox}%
+ \wd\scratchbox\hsize
+ \box\scratchbox
+ \hfill}%
+ \hfillneg}%
+ \ifvoid\rigidcolumnbox\exitloop\else\advance\scratchdimen\lineheight\fi}%
+ \iftightrigidcolumns
+ \setbox\scratchbox\normalhbox{\raise\dp\scratchbox\box\scratchbox}%
+ \else
+ \advance\scratchdimen -\openstrutdepth
+ \setbox\scratchbox\normalhbox{\raise\scratchdimen\box\scratchbox}%
+ \dp\scratchbox\openstrutdepth
+ \ht\scratchbox\scratchdimen
+ \fi
+ \box\scratchbox}%
+ \fi}
+
+%D \macros
+%D {startvboxtohbox,stopvboxtohbox,convertvboxtohbox}
+%D
+%D Here is another of Knuth's dirty tricks, as presented on
+%D pages 398 and 399 of the \TEX book. These macros can be used
+%D like:
+%D
+%D \starttyping
+%D \normalvbox
+%D \bgroup
+%D \startvboxtohbox ... \stopvboxtohbox
+%D \startvboxtohbox ... \stopvboxtohbox
+%D \startvboxtohbox ... \stopvboxtohbox
+%D \egroup
+%D
+%D \normalvbox
+%D \bgroup
+%D \convertvboxtohbox
+%D \egroup
+%D \stoptyping
+%D
+%D These macros are used in reformatting footnotes, so they do
+%D what they're meant for.
+
+\def\setvboxtohbox
+ {\bgroup
+ \ifdim\baselineskip<16pt \relax
+ \scratchdimen\baselineskip
+ \multiply\scratchdimen 1024
+ \else
+ \message{cropping \baselineskip to 16pt}%
+ \scratchdimen\maxdimen
+ \fi
+ \divide\scratchdimen \hsize
+ \multiply\scratchdimen 64
+ \xdef\normalvboxtohboxfactor{\withoutpt\the\scratchdimen}%
+ \egroup}
+
+\def\startvboxtohbox
+ {\bgroup
+ \setvboxtohbox
+ \setbox\scratchbox\normalhbox\bgroup}
+
+\def\stopvboxtohbox
+ {\egroup
+ \dp\scratchbox\zeropoint
+ \ht\scratchbox\normalvboxtohboxfactor\wd\scratchbox
+ \box\scratchbox
+ \egroup}
+
+\def\convertvboxtohbox
+ {\setvboxtohbox
+ \makehboxofhboxes
+ \setbox0\normalhbox{\unhbox0 \removehboxes}%
+ \noindent\unhbox0\par}
+
+\def\makehboxofhboxes
+ {\setbox0\emptyhbox
+ \loop % \doloop { .. \exitloop .. }
+ \setbox2\lastbox
+ \ifhbox2
+ \setbox0\normalhbox{\box2\unhbox0}%
+ \repeat}
+
+\def\removehboxes
+ {\setbox0\lastbox
+ \ifhbox0
+ {\removehboxes}\unhbox0
+ \fi}
+
+%D \macros
+%D {unhhbox}
+%D
+%D The next macro is used in typesetting inline headings.
+%D Let's first look at the macro and then show an example.
+
+\newbox \unhhedbox
+\newbox \hhbox
+\newdimen \lasthhboxwidth
+\newskip \hhboxindent
+
+\def\unhhbox#1\with#2%
+ {\bgroup
+ \nopenalties
+ \dontcomplain
+ \forgetall
+ \setbox\unhhedbox\normalvbox{\hskip\hhboxindent\strut\unhbox#1}% => \hsize
+ \doloop
+ {\setbox\hhbox\vsplit\unhhedbox to \lineheight
+ \ifvoid\unhhedbox
+ \setbox\hhbox\normalhbox{\strut\normalhboxofvbox\hhbox}%
+ \fi
+ \ht\hhbox\strutht
+ \dp\hhbox\strutdp
+ \ifzeropt\hhboxindent\else % \ifdim\hhboxindent=\zeropoint\else
+ \setbox\hhbox\normalhbox{\hskip-\hhboxindent\box\hhbox}%
+ \hhboxindent\zeropoint
+ \fi
+ \global\lasthhboxwidth\wd\hhbox
+ #2\relax
+ \ifvoid\unhhedbox
+ \exitloop
+ \else
+ \hskip\zeropoint \!!plus \zeropoint
+ \fi}%
+ \egroup}
+
+\def\dohboxofvbox
+ {\setbox0\normalvbox{\unvbox\scratchcounter\global\setbox1\lastbox}%
+ \unhbox1
+ \egroup}
+
+\def\normalhboxofvbox
+ {\bgroup
+ \afterassignment\dohboxofvbox
+ \scratchcounter=}
+
+%D This macro can be used to break a paragraph apart and treat
+%D each line seperately, for instance, making it clickable. The
+%D main complication is that we want to be able to continue the
+%D paragraph, something that's needed in the in line section
+%D headers.
+%D
+%D \startbuffer
+%D \setbox0=\normalhbox{\input tufte \relax}
+%D \setbox2=\normalhbox{\input knuth \relax}
+%D \unhhbox0\with{\ruledhbox{\box\hhbox}}
+%D \hskip1em plus 1em minus 1em
+%D \hhboxindent=\lasthhboxwidth
+%D \advance\hhboxindent by \lastskip
+%D \unhhbox2\with{\ruledhbox{\box\hhbox}}
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D This piece of text was typeset by saying:
+%D
+%D \typebuffer
+%D
+%D Not that nice a definition, but effective. Note the stretch
+%D we've build in the line that connects the two paragraphs.
+
+%D \macros
+%D {doifcontent}
+%D
+%D When processing depends on the availability of content, one
+%D can give the next macro a try.
+%D
+%D \starttyping
+%D \doifcontent{pre content}{post content}{no content}\somebox
+%D \stoptyping
+%D
+%D Where \type{\somebox} is either a \type{\normalhbox} or
+%D \type{\normalvbox}. If the dimension of this box suggest some
+%D content, the resulting box is unboxed and surrounded by the
+%D first two arguments, else the third arguments is executed.
+
+\unexpanded\def\doifcontent#1#2#3%
+ {\dowithnextbox
+ {\ifhbox\nextbox
+ \ifdim\nextboxwd>\zeropoint
+ #1\unhbox\nextbox#2\relax
+ \else
+ #3\relax
+ \fi
+ \else
+ \ifdim\nextboxht>\zeropoint
+ #1\unvbox\nextbox#2\relax
+ \else
+ #3\relax
+ \fi
+ \fi}}
+
+%D So when we say:
+%D
+%D \startbuffer
+%D \doifcontent{[}{]}{}\normalhbox{content sensitive typesetting}
+%D
+%D \doifcontent{}{\page}{}\normalvbox{content sensitive typesetting}
+%D
+%D \doifcontent{}{}{\message{Didn't you forget something?}}\normalhbox{}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D We get:
+%D
+%D \getbuffer
+%D
+%D Where the last call of course does not show up in this
+%D document, but definitely generates a confusing message.
+
+%D \macros
+%D {processboxes}
+%D
+%D The next macro gobble boxes and is for instance used for
+%D overlays. First we show the general handler.
+
+\newbox\processbox
+
+\def\processboxes#1%
+ {\bgroup
+ \def\doprocessbox{#1}% #1 can be redefined halfway
+ \setbox\processbox\emptybox
+ \afterassignment\dogetprocessbox\let\next=}
+
+\def\endprocessboxes
+ {\ifhmode\unskip\fi
+ \box\processbox
+ \next
+ \egroup}
+
+\def\dogetprocessbox
+ {\ifx\next\bgroup
+ \expandafter\dodogetprocessbox
+ \else
+ \expandafter\endprocessboxes
+ \fi}
+
+\def\dodogetprocessbox
+ {\dowithnextbox
+ {\ifhmode\unskip\fi\doprocessbox % takes \nextbox makes \processbox
+ \afterassignment\dogetprocessbox\let\next=}
+ \normalhbox\bgroup}
+
+%D \macros
+%D {startoverlay}
+%D
+%D We can overlay boxes by saying:
+%D
+%D \startbuffer
+%D \startoverlay
+%D {\framed{hans}}
+%D {\framed[width=3cm]{ton}}
+%D {\framed[height=2cm]{oeps}}
+%D \stopoverlay
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D shows up as:
+%D
+%D \leavevmode\getbuffer
+
+\def\dooverlaybox
+ {\ifhmode\unskip\fi
+ \scratchdimen\dp
+ \ifdim\nextboxdp>\dp\processbox
+ \nextbox
+ \else
+ \processbox
+ \fi
+ \ifdim\nextboxht>\ht\processbox
+ \setbox\processbox\normalvbox to \nextboxht
+ {\dp\processbox\zeropoint\vss\box\processbox\vss}%
+ \else
+ \setbox\nextbox\normalvbox to \ht\processbox
+ {\nextboxdp\zeropoint\vss\flushnextbox\vss}%
+ \fi
+ \nextboxdp\scratchdimen
+ \dp\processbox\scratchdimen
+ \scratchdimen\wd
+ \ifdim\nextboxwd>\wd\processbox
+ \nextbox
+ \else
+ \processbox
+ \fi
+ \setbox\processbox\normalhbox to \scratchdimen
+ {\normalhbox to \scratchdimen{\hss\box\processbox\hss}%
+ \hskip-\scratchdimen
+ \normalhbox to \scratchdimen{\hss\flushnextbox\hss}}}
+
+\unexpanded\def\startoverlay
+ {\bgroup
+ \let\stopoverlay\egroup
+ \processboxes\dooverlaybox}
+
+\let\stopoverlay\relax
+
+%D \macros
+%D {fakebox}
+%D
+%D The next macro is a rather silly one, but saves space.
+%D
+%D \starttyping
+%D \normalhbox{\fakebox0}
+%D \stoptyping
+%D
+%D returns an empty box with the dimensions of the box
+%D specified, here being zero.
+
+\def\dofakebox
+ {\setbox\scratchbox\emptyhbox
+ \wd\scratchbox\wd\scratchcounter
+ \ht\scratchbox\ht\scratchcounter
+ \dp\scratchbox\dp\scratchcounter
+ \ifhbox\scratchcounter\normalhbox\else\normalvbox\fi{\box\scratchbox}%
+ \egroup}
+
+\def\fakebox
+ {\bgroup
+ \afterassignment\dofakebox\scratchcounter}
+
+%D \macros
+%D {lbox,rbox,cbox,tbox,bbox}
+%D
+%D Here are some convenient alternative box types:
+%D
+%D \starttyping
+%D \lbox{text ...}
+%D \cbox{text ...}
+%D \rbox{text ...}
+%D \stoptyping
+%D
+%D Are similar to \type {\normalvbox}, which means that they also
+%D accept something like \type{to 3cm}, but align to the left,
+%D middle and right. These box types can be used to typeset
+%D paragraphs.
+
+\def\lbox{\makelrcbox\normalvbox\raggedleft}
+\def\cbox{\makelrcbox\normalvbox\raggedcenter}
+\def\rbox{\makelrcbox\normalvbox\raggedright}
+
+\def\ltop{\makelrcbox\normalvtop\raggedleft}
+\def\ctop{\makelrcbox\normalvtop\raggedcenter}
+\def\rtop{\makelrcbox\normalvtop\raggedright}
+
+\def\makelrcbox#1#2#3#%
+ {#1#3\bgroup \forgetall \let\\=\endgraf #2\let\next=}
+
+%D The alternatives \type {\tbox} and \type {\bbox} can be used
+%D to properly align boxes, like in:
+%D
+%D \setupexternalfigures[directory={../sample}]
+%D \startbuffer
+%D \starttable[|||]
+%D \HL
+%D \VL \tbox{\externalfigure[cow][height=3cm,frame=on]} \VL top aligned \VL\SR
+%D \HL
+%D \VL \bbox{\externalfigure[cow][height=3cm,frame=on]} \VL bottom aligned \VL\SR
+%D \HL
+%D \stoptable
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D The positioning depends on the strut settings:
+%D
+%D \getbuffer
+
+\def\tbox{\tbbox\ht\dp}
+\def\bbox{\tbbox\dp\ht}
+
+\def\tbbox#1#2%
+ {\normalhbox\bgroup
+ \dowithnextbox
+ {\scratchdimen\dimexpr\nextboxht+\nextboxdp-#1\strutbox\relax
+ #1\nextbox#1\strutbox
+ #2\nextbox\scratchdimen
+ \setbox\nextbox\normalhbox{\lower\nextboxdp\flushnextbox}%
+ #1\nextbox#1\strutbox
+ #2\nextbox\scratchdimen
+ \flushnextbox
+ \egroup}
+ \normalhbox}
+
+%D \macros
+%D {lhbox,mhbox,rhbox}
+%D
+%D A few more boxes.
+
+\def\dodolhbox{\normalhbox to \hsize{\flushnextbox\hss }}
+\def\dodomhbox{\normalhbox to \hsize{\hss\flushnextbox\hss}}
+\def\dodorhbox{\normalhbox to \hsize{\hss\flushnextbox }}
+
+\def\lhbox{\dowithnextboxcs\dodolhbox\normalhbox}
+\def\mhbox{\dowithnextboxcs\dodomhbox\normalhbox}
+\def\rhbox{\dowithnextboxcs\dodorhbox\normalhbox}
+
+\let\lefthbox \lhbox
+\let\midhbox \mhbox
+\let\righthbox\rhbox
+
+%D \macros
+%D {boxofsize}
+%D
+%D Sometimes we need to construct a box with a height or
+%D width made up of several dimensions. Instead of cumbersome
+%D additions, we can use:
+%D
+%D \starttyping
+%D \boxofsize \normalvbox 10cm 3cm -5cm {the text to be typeset}
+%D \stoptyping
+%D
+%D This example demonstrates that one can use positive and
+%D negative values. Dimension registers are also accepted.
+
+\newdimen\sizeofbox
+
+\def\boxofsize#1%
+ {\bgroup
+ \sizeofbox\zeropoint
+ \scratchdimen\zeropoint
+ \def\docommand
+ {\advance\sizeofbox\scratchdimen
+ \futurelet\next\dodocommand}%
+ \def\dodocommand
+ {\ifx\next\bgroup
+ \expanded{\egroup#1 to \the\sizeofbox}%
+ \else
+ \@EA\afterassignment\@EA\docommand\@EA\scratchdimen
+ \fi}%
+ \docommand}
+
+%D Some new, still undocumented features:
+
+% limitatetext -> beter {text} als laatste !!
+%
+% \limitvbox
+% \limithbox
+
+\def\limitatelines#1#2% size sentinel
+ {\dowithnextbox
+ {\dimen0=#1\hsize
+ \ifdim\nextboxwd>\dimen0
+ \setbox\nextbox\normalhbox
+ {\advance\dimen0 -.1\hsize
+ \limitatetext{\unhbox\nextbox}{\dimen0}{\nobreak#2}}%
+ \fi
+ \unhbox\nextbox}
+ \normalhbox}
+
+\def\fittoptobaselinegrid % weg hier
+ {\dowithnextbox
+ {\bgroup
+ \par
+ \dimen0\nextboxht
+ \nextboxht\strutht
+ \nextboxdp\strutdp
+ \normalhbox{\flushnextbox}
+ \prevdepth\strutdp
+ \doloop
+ {\advance\dimen0 -\lineheight
+ \ifdim\dimen0<\zeropoint
+ \exitloop
+ \else
+ \nobreak
+ \normalhbox{\strut}
+ \fi}
+ \egroup}
+ \normalvbox}
+
+%D Some more undocumented macros (used in m-chart).
+
+\newif\iftraceboxplacement % \traceboxplacementtrue
+
+\newbox\fakedboxcursor
+
+\setbox\fakedboxcursor\normalhbox
+ {\vrule\!!width\zeropoint\!!height\zeropoint\!!depth\zeropoint}
+
+\def\boxcursor % overloaded in core-vis
+ {\iftraceboxplacement
+ \bgroup
+ \scratchdimen2pt
+ \setbox\scratchbox\normalhbox to \zeropoint
+ {\hss
+ \vrule
+ \!!width \scratchdimen
+ \!!height\scratchdimen
+ \!!depth \scratchdimen
+ \hss}%
+ \smashedbox\scratchbox
+ \egroup
+ \else
+ \copy\fakedboxcursor
+ \fi}
+
+\def\placedbox
+ {\iftraceboxplacement\ruledhbox\else\normalhbox\fi}
+
+\newdimen\boxoffset
+\newdimen\boxhdisplacement
+\newdimen\boxvdisplacement
+
+\def\rightbox#1%
+ {\normalhbox
+ {\setbox\scratchbox\placedbox{#1}%
+ \global\boxhdisplacement\boxoffset
+ \global\boxvdisplacement.5\ht\scratchbox
+ \global\advance\boxvdisplacement-.5\dp\scratchbox
+ \boxcursor\hskip\boxhdisplacement\lower\boxvdisplacement\box\scratchbox}}
+
+\def\leftbox#1%
+ {\normalhbox
+ {\setbox\scratchbox\placedbox{#1}%
+ \global\boxhdisplacement-\wd\scratchbox
+ \global\advance\boxhdisplacement-\boxoffset
+ \global\boxvdisplacement.5\ht\scratchbox
+ \global\advance\boxvdisplacement-.5\dp\scratchbox
+ \boxcursor\hskip\boxhdisplacement\lower\boxvdisplacement\box\scratchbox}}
+
+\def\topbox#1%
+ {\normalhbox
+ {\setbox\scratchbox\placedbox{#1}%
+ \global\boxhdisplacement-.5\wd\scratchbox
+ \global\boxvdisplacement-\dp\scratchbox
+ \global\advance\boxvdisplacement-\boxoffset
+ \boxcursor\hskip\boxhdisplacement\raise-\boxvdisplacement\box\scratchbox}}
+
+\def\bottombox#1%
+ {\normalhbox
+ {\setbox\scratchbox\placedbox{#1}%
+ \global\boxhdisplacement-.5\wd\scratchbox
+ \global\boxvdisplacement\ht\scratchbox
+ \global\advance\boxvdisplacement\boxoffset
+ \boxcursor\hskip\boxhdisplacement\lower\boxvdisplacement\box\scratchbox}}
+
+\def\lefttopbox#1%
+ {\normalhbox
+ {\setbox\scratchbox\placedbox{#1}%
+ \global\boxhdisplacement-\wd\scratchbox
+ \global\advance\boxhdisplacement-\boxoffset
+ \global\boxvdisplacement-\dp\scratchbox
+ \global\advance\boxvdisplacement-\boxoffset
+ \boxcursor\hskip\boxhdisplacement\raise-\boxvdisplacement\box\scratchbox}}
+
+\def\righttopbox#1%
+ {\normalhbox
+ {\setbox\scratchbox\placedbox{#1}%
+ \global\boxhdisplacement\boxoffset
+ \global\boxvdisplacement-\dp\scratchbox
+ \global\advance\boxvdisplacement-\boxoffset
+ \boxcursor\hskip\boxhdisplacement\raise-\boxvdisplacement\box\scratchbox}}
+
+\def\leftbottombox#1%
+ {\normalhbox
+ {\setbox\scratchbox\placedbox{#1}%
+ \global\boxhdisplacement-\wd\scratchbox
+ \global\advance\boxhdisplacement-\boxoffset
+ \global\boxvdisplacement\ht\scratchbox
+ \global\advance\boxvdisplacement\boxoffset
+ \boxcursor\hskip\boxhdisplacement\lower\boxvdisplacement\box\scratchbox}}
+
+\def\rightbottombox#1%
+ {\normalhbox
+ {\setbox\scratchbox\placedbox{#1}%
+ \global\boxhdisplacement\boxoffset
+ \global\boxvdisplacement\ht\scratchbox
+ \global\advance\boxvdisplacement\boxoffset
+ \boxcursor\hskip\boxhdisplacement\lower\boxvdisplacement\box\scratchbox}}
+
+\let\topleftbox \lefttopbox
+\let\toprightbox \righttopbox
+\let\bottomleftbox \leftbottombox
+\let\bottomrightbox\rightbottombox
+
+\def\middlebox#1%
+ {\normalhbox{\setbox\scratchbox\placedbox{#1}\boxoffset=-.5\wd\scratchbox\rightbox{\box\scratchbox}}}
+
+\def\baselinemiddlebox#1%
+ {\normalhbox
+ {\setbox\scratchbox\placedbox{#1}%
+ \global\boxhdisplacement-.5\wd\scratchbox
+ \global\advance\boxhdisplacement-\boxoffset
+ \global\boxvdisplacement-\boxoffset
+ \boxcursor\hskip\boxhdisplacement\raise-\boxvdisplacement\box\scratchbox}}
+
+\def\baselineleftbox#1%
+ {\normalhbox
+ {\setbox\scratchbox\placedbox{#1}%
+ \global\boxhdisplacement-\wd\scratchbox
+ \global\advance\boxhdisplacement-\boxoffset
+ \global\boxvdisplacement-\boxoffset
+ \boxcursor\hskip\boxhdisplacement\raise-\boxvdisplacement\box\scratchbox}}
+
+\def\baselinerightbox#1%
+ {\normalhbox
+ {\setbox\scratchbox\placedbox{#1}%
+ \global\boxhdisplacement\boxoffset
+ \global\boxvdisplacement-\boxoffset
+ \boxcursor\hskip\boxhdisplacement\raise-\boxvdisplacement\box\scratchbox}}
+
+%D \macros
+%D {obox}
+%D
+%D Experimental, not yet frozen:
+
+\def\lrtbbox#1#2#3#4% l r t b
+ {\bgroup
+ \dowithnextboxcontent
+ {\advance\hsize-#1\advance\hsize-#2\advance\vsize-#3\advance\vsize-#4\relax}
+ {\forgetall\vbox to \vsize{\vskip#3\hbox to \hsize{\hskip#1\box\nextbox\hss}\vss}\egroup}
+ \vbox}
+
+%D \macros
+%D {toplinebox}
+%D
+%D See core-tbl.tex for an example of its usage:
+
+\def\toplinebox
+ {\dowithnextbox
+ {\ifdim\nextboxdp>\strutdepth
+ \scratchdimen\nextboxdp
+ \advance\scratchdimen-\strutdepth
+ \getnoflines\scratchdimen
+ \struttedbox{\flushnextbox}%
+ \dorecurse\noflines\verticalstrut
+ \else
+ \flushnextbox
+ \fi}%
+ \tbox}
+
+%D \macros
+%D {initializeboxstack,savebox,foundbox}
+%D
+%D At the cost of some memory, but saving box registers, we
+%D have implemented a box repository.
+%D
+%D \starttyping
+%D \initializeboxstack{one}
+%D
+%D \savebox{one}{a}{test a}
+%D \savebox{one}{p}{test p}
+%D \savebox{one}{q}{test q}
+%D
+%D \normalhbox{a:\foundbox{one}{a}} \par
+%D \normalhbox{q:\foundbox{one}{q}} \par
+%D \normalhbox{p:\foundbox{one}{p}} \par
+%D \normalhbox{x:\foundbox{one}{x}} \par
+%D \normalhbox{y:\foundbox{two}{a}} \par
+%D \stoptyping
+
+\def\@@stackbox{@box@}
+\def\@@stacklst{@xob@}
+
+\def\setstackbox#1#2%
+ {\ifcsname\@@stackbox:#1:#2\endcsname\else
+ \expandafter\newbox\csname\@@stackbox:#1:#2\endcsname
+ \fi
+ \global\setbox\csname\@@stackbox:#1:#2\endcsname\normalvbox}
+
+\def\initializeboxstack#1%
+ {\def\docommand##1{\setstackbox{#1}{##1}{}}%
+ \ifcsname\@@stacklst#1\endcsname
+ \processcommacommand[\getvalue{\@@stacklst#1}]\docommand
+ \fi
+ \letgvalueempty{\@@stacklst#1}}
+
+\def\savebox#1#2% stack name
+ {% beware, \setxvalue defines the cs beforehand so we cannot use the
+ % test inside the { }
+ \ifcsname\@@stacklst#1\endcsname
+ \setxvalue{\@@stacklst#1}{\csname\@@stacklst#1\endcsname,#2}%
+ \else
+ \setxvalue{\@@stacklst#1}{#2}%
+ \fi
+ \setstackbox{#1}{#2}}
+
+\def\foundbox#1#2%
+ {\normalvbox
+ {\ifcsname\@@stackbox:#1:#2\endcsname
+ \copy\csname\@@stackbox:#1:#2\endcsname
+ \fi}}
+
+\long\def\doifboxelse#1#2#3#4%
+ {\ifcsname\@@stackbox:#1:#2\endcsname
+ \ifvoid\csname\@@stackbox:#1:#2\endcsname#4\else#3\fi
+ \else
+ #4%
+ \fi}
+
+%D \macros
+%D {removedepth, obeydepth}
+%D
+%D While \type {\removedepth} removes the preceding depth,
+%D \type {\obeydepth} makes sure we have depth. Both macros
+%D leave the \type {\prevdepth} untouched.
+
+\def\removedepth
+ {\ifvmode \ifdim\prevdepth>\zeropoint \kern-\prevdepth \fi \fi}
+
+\def\obeydepth
+ {\par \removedepth \ifvmode \kern\strutdp \fi}
+
+\def\undepthed
+ {\dowithnextbox{\nextboxdp\zeropoint\flushnextbox}\hbox}
+
+%D \macros
+%D {removebottomthings, removelastskip}
+%D
+%D A funny (but rather stupid) one, plus a redefinition.
+
+\def\removebottomthings
+ {\dorecurse5{\unskip\unkern\unpenalty}}
+
+\def\removelastskip % \ifvmode the plain tex one \fi
+% {\ifvmode\ifdim\lastskip=\zeropoint\else\vskip-\lastskip\fi\fi}
+ {\ifvmode\ifzeropt\lastskip\else\vskip-\lastskip\fi\fi}
+
+%D \macros
+%D {makestrutofbox}
+%D
+%D This macro sets the dimensions of a box to those of a
+%D strut.
+
+\def\domakestrutofbox
+ {\ht\registercount\strutht
+ \dp\registercount\strutdp
+ \wd\registercount\zeropoint}
+
+\def\makestrutofbox
+ {\afterassignment\domakestrutofbox\registercount}
+
+%D \macros
+%D {raisebox,lowerbox}
+%D
+%D Some more box stuff, related to positioning (under
+%D construction). Nice stuff for a tips and tricks maps
+%D article.
+%D
+%D \starttyping
+%D \raisebox{100pt}\normalhbox{test}
+%D \raisebox50pt\normalhbox{test}
+%D \hsmash{\raisebox{100pt}\normalhbox{test}}
+%D \stoptyping
+
+\def\doraiselowerbox#1#2% a nice trick us used to accept
+ {\def\next % both direct and {} dimensions
+ {\dowithnextbox
+ {\setbox\nextbox\normalhbox{#1\scratchdimen\flushnextbox}%
+ \nextboxht\strutht
+ \nextboxdp\strutdp
+ \flushnextbox}}%
+ \afterassignment\next\scratchdimen=#2}
+
+\def\raisebox{\doraiselowerbox\raise}
+\def\lowerbox{\doraiselowerbox\lower}
+
+% vcenter in text, we kunnen vcenter overloaden
+
+\def\halfwaybox
+ {\dowithnextbox
+ {\nextboxdp\zeropoint
+ \setbox\nextbox\normalhbox{\lower.5\nextboxht\flushnextbox}%
+ \flushnextbox}
+ \normalhbox}
+
+%D New:
+
+\def\setdimentoatleast#1#2%
+ {\ifdim#1>\zeropoint\else#1=#2\fi}
+
+%D And even rawer:
+
+\let\naturalhbox \normalhbox
+\let\naturalvbox \normalvbox
+\let\naturalvtop \normalvtop
+\let\naturalvcenter \normalvtop
+
+\ifdefined\textdir
+
+ \def\naturalhbox{\normalhbox dir TLT}
+ \def\naturalvbox{\normalvbox dir TLT}
+ %def\naturalvtop{\normalvtop dir TLT}
+
+\fi
+
+%D \macros
+%D {vcenter}
+%D
+%D Also new: tex mode \type {\vcenter}.
+
+\let\verynormalvcenter \vcenter % since \vcenter can be visualized
+
+\def\vcenter
+ {\normalvbox\bgroup
+ \dowithnextbox{\normalhbox{$\verynormalvcenter{\flushnextbox}$}\egroup}
+ \normalvbox}
+
+% could be \everymathematics
+
+\prependtoks \let\vcenter\normalvcenter \to \everymath
+\prependtoks \let\vcenter\normalvcenter \to \everydisplay
+
+%D \macros
+%D {frozenhbox}
+%D
+%D A not so well unhboxable bxo can be made with:
+
+\def\frozenhbox
+ {\hbox\bgroup\dowithnextbox{\hbox{\hbox{\flushnextbox}}\egroup}\hbox}
+
+%D \macros
+%D {setboxllx,setboxlly,gsetboxllx,gsetboxlly,getboxllx,getboxlly}
+%D
+%D A prelude to an extended \TEX:
+
+\def\setboxllx#1#2{\setevalue{b@@x\number#1}{\the\dimexpr#2\relax}}
+\def\setboxlly#1#2{\setevalue{b@@y\number#1}{\the\dimexpr#2\relax}}
+
+\def\gsetboxllx{\global\setboxllx}
+\def\gsetboxlly{\global\setboxlly}
+
+\def\getboxllx#1{\executeifdefined{b@@x\number#1}\zeropoint}
+\def\getboxlly#1{\executeifdefined{b@@y\number#1}\zeropoint}
+
+%D \macros
+%D {shownextbox}
+%D
+%D Handy for tracing
+%D
+%D \starttyping
+%D \shownextbox\vbox{test}
+%D \shownextbox\vbox{test\endgraf}
+%D \shownextbox\vbox{test\endgraf\strut\endgraf}
+%D \shownextbox\vbox{test\endgraf\thinrule}
+%D \shownextbox\vbox{\setupwhitespace[big]test\endgraf\thinrule}
+%D \stoptyping
+
+\def\shownextbox
+ {\dowithnextbox
+ {\bgroup
+ \showboxbreadth\maxdimen
+ \showboxdepth \maxdimen
+ \scratchcounter\interactionmode
+ \batchmode
+ \showbox\nextbox
+ \box\nextbox
+ \interactionmode\scratchcounter
+ \egroup}}
+
+\def\spreadhbox#1% rebuilds \hbox{<box><hss><box><hss><box>}
+ {\bgroup
+ \ifhbox#1\relax
+ \setbox2\emptybox
+ \unhbox#1%
+ \doloop
+ {\unpenalty\unskip\unpenalty\unskip\unpenalty\unskip
+ \setbox0\lastbox
+ \ifvoid0
+ \exitloop
+ \else
+ \setbox2\hbox
+ {\ifhbox0 \spreadhbox0\else\box0\fi
+ \ifvoid2 \else\hss\unhbox2\fi}%
+ \fi}%
+ \ifvoid2\else\unhbox2\fi
+ \else
+ \box#1%
+ \fi
+ \egroup}
+
+% makes sense but too much log for overfull boxes:
+%
+% \showboxbreadth\maxdimen
+% \showboxdepth \maxdimen
+
+\protect \endinput
+
+% a bit of test code:
+
+\hbox \bgroup
+ \ruledvbox {\hbox{\strut gans}}
+ \ruledvbox to \lineheight {\hbox{\strut gans}}
+ \ruledvbox to \lineheight {\hbox {gans}}
+ \ruledvbox to \strutheight{\hbox {gans}}
+ \ruledvbox to \strutheight{\hbox{\strut gans}}
+ \ruledvbox to \strutheight{\vss\hbox{gans}}
+\egroup
diff --git a/Master/texmf-dist/tex/context/base/supp-dir.mkiv b/Master/texmf-dist/tex/context/base/supp-dir.mkiv
index 0634bd36f34..dce47a1784d 100644
--- a/Master/texmf-dist/tex/context/base/supp-dir.mkiv
+++ b/Master/texmf-dist/tex/context/base/supp-dir.mkiv
@@ -18,6 +18,17 @@
% \expanded{\defineactivecharacter \number"2000E} {\textdir TRT\relax}
% \expanded{\defineactivecharacter \number"2000F} {\textdir TLT\relax}
+%D As we have less directions now we can use something
+
+% \chardef\@@D@@TLT0
+% \chardef\@@D@@TRT1
+% \chardef\@@D@@RTT0
+% \chardef\@@D@@LRL1
+%
+% \def\thetextdir{\csname @@D@@\the\textdir\endcsname}
+%
+% \ifnum\thetextdir=0 L\else R\fi \textdir TRT \ifnum\thetextdir=0 L\else R\fi
+
\unexpanded\def\showdirsinmargin
{\doifelse{\the\pardir}\!!TLT
{\inleft{\normalexpanded{\noexpand\hbox dir TLT{\ttxx[\the\pardir,\the\textdir]}}}}
diff --git a/Master/texmf-dist/tex/context/base/supp-fil.lua b/Master/texmf-dist/tex/context/base/supp-fil.lua
index 8d69f64a72c..a2c0b5d7daa 100644
--- a/Master/texmf-dist/tex/context/base/supp-fil.lua
+++ b/Master/texmf-dist/tex/context/base/supp-fil.lua
@@ -6,6 +6,11 @@ if not modules then modules = { } end modules ['supp-fil'] = {
license = "see context related readme files"
}
+-- This module will be redone !
+
+-- context is not defined yet! todo! (we need to load tupp-fil after cld)
+-- todo: move startreadingfile to lua and push regime there
+
--[[ldx--
<p>It's more convenient to manipulate filenames (paths) in
<l n='lua'/> than in <l n='tex'/>. These methods have counterparts
@@ -13,25 +18,34 @@ at the <l n='tex'/> side.</p>
--ldx]]--
local find, gsub, match, format, concat = string.find, string.gsub, string.match, string.format, table.concat
-local texsprint, texwrite, ctxcatcodes = tex.sprint, tex.write, tex.ctxcatcodes
+local texcount = tex.count
+local isfile = lfs.isfile
-local trace_modules = false trackers.register("modules.loading", function(v) trace_modules = v end)
+local trace_modules = false trackers.register("modules.loading", function(v) trace_modules = v end)
+local trace_files = false trackers.register("resolvers.readfile", function(v) trace_files = v end)
-support = support or { }
-environment = environment or { }
+local report_modules = logs.reporter("resolvers","modules")
+local report_files = logs.reporter("files","readfile")
-environment.outputfilename = environment.outputfilename or environment.jobname
+commands = commands or { }
+local commands = commands
+environment = environment or { }
+local environment = environment
-function support.checkfilename(str) -- "/whatever..." "c:..." "http://..."
- commands.chardef("kindoffile",boolean.tonumber(find(str,"^/") or find(str,"[%a]:")))
+local findbyscheme = resolvers.finders.byscheme
+
+function commands.checkfilename(str) -- "/whatever..." "c:..." "http://..."
+ texcount.kindoffile = (find(str,"^/") or find(str,"[%a]:") and 1) or 0
end
-function support.thesanitizedfilename(str)
- texwrite((gsub(str,"\\","/")))
+function commands.thesanitizedfilename(str)
+ context((gsub(str,"\\","/")))
end
-function support.splitfilename(fullname)
- local path, name, base, suffix, kind = '', fullname, fullname, '', 0
+local testcase = commands.testcase
+
+function commands.splitfilename(fullname)
+ local path, name, base, suffix = '', fullname, fullname, ''
local p, n = match(fullname,"^(.+)/(.-)$")
if p and n then
path, name, base = p, n, n
@@ -40,52 +54,47 @@ function support.splitfilename(fullname)
if b and s then
name, suffix = b, s
end
- if path == "" then
- kind = 0
- elseif path == '.' then
- kind = 1
- else
- kind = 2
- end
- commands.def("splitofffull", fullname)
- commands.def("splitoffpath", path)
- commands.def("splitoffbase", base)
- commands.def("splitoffname", name)
- commands.def("splitofftype", suffix)
- commands.chardef("splitoffkind", kind)
+ texcount.splitoffkind = (path == "" and 0) or (path == '.' and 1) or 2
+ local setvalue = context.setvalue
+ setvalue("splitofffull", fullname)
+ setvalue("splitoffpath", path)
+ setvalue("splitoffbase", base)
+ setvalue("splitoffname", name)
+ setvalue("splitofftype", suffix)
end
-function support.splitfiletype(fullname)
+function commands.splitfiletype(fullname)
local name, suffix = fullname, ''
local n, s = match(fullname,"^(.+)%.(.-)$")
if n and s then
name, suffix = n, s
end
- commands.def("splitofffull", fullname)
- commands.def("splitoffpath", "")
- commands.def("splitoffname", name)
- commands.def("splitofftype", suffix)
+ local setvalue = context.setvalue
+ setvalue("splitofffull", fullname)
+ setvalue("splitoffpath", "")
+ setvalue("splitoffname", name)
+ setvalue("splitofftype", suffix)
end
-function support.doifparentfileelse(n)
- commands.testcase(n==environment.jobname or n==environment.jobname..'.tex' or n==environment.outputfilename)
+function commands.doifparentfileelse(n)
+ testcase(n == environment.jobname or n == environment.jobname .. '.tex' or n == environment.outputfilename)
end
-- saves some .15 sec on 12 sec format generation
local lastexistingfile = ""
-function support.doiffileexistelse(name)
+function commands.doiffileexistelse(name)
if not name or name == "" then
lastexistingfile = ""
else
lastexistingfile = resolvers.findtexfile(name) or ""
end
- return commands.testcase(lastexistingfile ~= "")
+ return testcase(lastexistingfile ~= "")
end
-function support.lastexistingfile()
- texsprint(ctxcatcodes,lastexistingfile)
+function commands.lastexistingfile()
+ context(lastexistingfile)
end
-- more, we can cache matches
@@ -97,86 +106,111 @@ local found = { } -- can best be done in the resolver itself
-- todo: tracing
local function readfilename(specification,backtrack,treetoo)
- local fnd = found[specification]
+ local name = specification.filename
+ local fnd = found[name]
if not fnd then
- local splitspec = resolvers.splitmethod(specification)
- local filename = splitspec.path or ""
- if lfs.isfile(filename) then
- fnd = filename
+ if isfile(name) then
+ if trace_files then
+ report_files("found local: %s",name)
+ end
+ fnd = name
end
if not fnd and backtrack then
- local fname = filename
+ local fname = name
for i=1,backtrack,1 do
fname = "../" .. fname
- if lfs.isfile(fname) then
+ if isfile(fname) then
+ if trace_files then
+ report_files("found by backtracking: %s",fname)
+ end
fnd = fname
break
+ elseif trace_files then
+ report_files("not found by backtracking: %s",fname)
end
end
end
if not fnd and treetoo then
---~ fnd = resolvers.find_file(filename)
- fnd = resolvers.findtexfile(filename)
+ fnd = resolvers.findtexfile(name) or ""
+ if trace_files then
+ if fnd ~= "" then
+ report_files("found by tree lookup: %s",fnd)
+ else
+ report_files("not found by tree lookup: %s",name)
+ end
+ end
+ end
+ found[name] = fnd
+ elseif trace_files then
+ if fnd ~= "" then
+ report_files("already found: %s",fnd)
+ else
+ report_files("already not found: %s",name)
end
- found[specification] = fnd
end
return fnd or ""
end
-support.readfilename = readfilename
+function commands.readfilename(filename)
+ return findbyscheme("any",filename)
+end
-function finders.job(filename) return readfilename(filename,nil,false) end -- current path, no backtracking
-function finders.loc(filename) return readfilename(filename,2, false) end -- current path, backtracking
-function finders.sys(filename) return readfilename(filename,nil,true ) end -- current path, obeys tex search
-function finders.fix(filename) return readfilename(filename,2, false) end -- specified path, backtracking
-function finders.set(filename) return readfilename(filename,nil,false) end -- specified path, no backtracking
-function finders.any(filename) return readfilename(filename,2, true ) end -- loc job sys
+function finders.job(specification) return readfilename(specification,false,false) end -- current path, no backtracking
+function finders.loc(specification) return readfilename(specification,2, false) end -- current path, backtracking
+function finders.sys(specification) return readfilename(specification,false,true ) end -- current path, obeys tex search
+function finders.fix(specification) return readfilename(specification,2, false) end -- specified path, backtracking
+function finders.set(specification) return readfilename(specification,false,false) end -- specified path, no backtracking
+function finders.any(specification) return readfilename(specification,2, true ) end -- loc job sys
-openers.job = openers.generic loaders.job = loaders.generic
-openers.loc = openers.generic loaders.loc = loaders.generic
-openers.sys = openers.generic loaders.sys = loaders.generic
-openers.fix = openers.generic loaders.fix = loaders.generic
-openers.set = openers.generic loaders.set = loaders.generic
-openers.any = openers.generic loaders.any = loaders.generic
+openers.job = openers.file loaders.job = loaders.file -- default anyway
+openers.loc = openers.file loaders.loc = loaders.file
+openers.sys = openers.file loaders.sys = loaders.file
+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 support.doreadfile(protocol,path,name) -- better do a split and then pass table
- local specification
+function finders.doreadfile(scheme,path,name) -- better do a split and then pass table
+ local fullname
if url.hasscheme(name) then
- specification = name
+ fullname = name
else
- specification = ((path == "") and format("%s:///%s",protocol,name)) or format("%s:///%s/%s",protocol,path,name)
+ fullname = ((path == "") and format("%s:///%s",scheme,name)) or format("%s:///%s/%s",scheme,path,name)
end
- texsprint(ctxcatcodes,resolvers.findtexfile(specification))
+ return resolvers.findtexfile(fullname) or "" -- can be more direct
end
--- modules can only have a tex or mkiv suffix or can have a specified one
+function commands.doreadfile(scheme,path,name)
+ context(finders.doreadfile(scheme,path,name))
+end
+
+-- modules can have a specific suffix or can specify one
-local prefixes = { "m", "p", "s", "x", "t" }
-local suffixes = { "tex", "mkiv" }
+local prefixes = { "m", "p", "s", "x", "v", "t" }
+local suffixes = { "mkiv", "tex", "mkvi" } -- order might change and how about cld
local modstatus = { }
-local function usemodule(name,hassheme)
+local function usemodule(name,hasscheme)
local foundname
if hasscheme then
-- no auto suffix as http will return a home page or error page
-- so we only add one if missing
local fullname = file.addsuffix(name,"tex")
if trace_modules then
- logs.report("modules","checking scheme driven file '%s'",fullname)
+ report_modules("checking url: '%s'",fullname)
end
foundname = resolvers.findtexfile(fullname) or ""
elseif file.extname(name) ~= "" then
if trace_modules then
- logs.report("modules","checking suffix driven file '%s'",name)
+ report_modules("checking file: '%s'",name)
end
- foundname = support.readfilename(name,false,true) or ""
+ foundname = findbyscheme("any",name) or ""
else
for i=1,#suffixes do
local fullname = file.addsuffix(name,suffixes[i])
if trace_modules then
- logs.report("modules","checking suffix driven file '%s'",fullname)
+ report_modules("checking file: '%s'",fullname)
end
- foundname = support.readfilename(fullname,false,true) or ""
+ foundname = findbyscheme("any",fullname) or ""
if foundname ~= "" then
break
end
@@ -184,7 +218,7 @@ local function usemodule(name,hassheme)
end
if foundname ~= "" then
if trace_modules then
- logs.report("modules","loading '%s'",foundname)
+ report_modules("loading: '%s'",foundname)
end
context.startreadingfile()
context.input(foundname)
@@ -195,7 +229,7 @@ local function usemodule(name,hassheme)
end
end
-function support.usemodules(prefix,askedname,truename)
+function commands.usemodules(prefix,askedname,truename)
local hasprefix = prefix and prefix ~= ""
local hashname = ((hasprefix and prefix) or "*") .. "-" .. truename
local status = modstatus[hashname]
@@ -205,7 +239,7 @@ function support.usemodules(prefix,askedname,truename)
status = status + 1
else
if trace_modules then
- logs.report("modules","locating '%s'",truename)
+ report_modules("locating: '%s'",truename)
end
local hasscheme = url.hasscheme(truename)
if hasscheme then
@@ -240,39 +274,60 @@ function support.usemodules(prefix,askedname,truename)
end
end
if status == 0 then
- if trace_modules then
- logs.report("modules","skipping '%s' (not found)",truename)
- else
- interfaces.showmessage("systems",6,askedname)
- end
+ report_modules("not found: '%s'",askedname)
elseif status == 1 then
- if not trace_modules then
- interfaces.showmessage("systems",5,askedname)
- end
+ report_modules("loaded: '%s'",trace_modules and truename or askedname)
else
- if trace_modules then
- logs.report("modules","skipping '%s' (already loaded)",truename)
- else
- interfaces.showmessage("systems",7,askedname)
- end
+ report_modules("already loaded: '%s'",trace_modules and truename or askedname)
end
modstatus[hashname] = status
end
+local loaded = { }
+
+function commands.uselibrary(name,patterns,action,failure)
+ local files = utilities.parsers.settings_to_array(name)
+ local done = false
+ for i=1,#files do
+ local filename = files[i]
+ if not loaded[filename] then
+ loaded[filename] = true
+ for i=1,#patterns do
+ local filename = format(patterns[i],filename)
+ -- local foundname = resolvers.findfile(filename) or ""
+ local foundname = finders.doreadfile("any",".",filename)
+ if foundname ~= "" then
+ action(name,foundname)
+ done = true
+ break
+ end
+ end
+ if done then
+ break
+ end
+ end
+ end
+ if failure and not done then
+ failure(name)
+ end
+end
+
statistics.register("loaded tex modules", function()
if next(modstatus) then
- local t, f = { }, { }
+ local t, f, nt, nf = { }, { }, 0, 0
for k, v in table.sortedhash(modstatus) do
k = file.basename(k)
if v == 0 then
- f[#f+1] = k
+ nf = nf + 1
+ f[nf] = k
else
- t[#t+1] = k
+ nt = nt + 1
+ t[nt] = k
end
end
- local ts = (#t>0 and format(" (%s)",concat(t," "))) or ""
- local fs = (#f>0 and format(" (%s)",concat(f," "))) or ""
- return format("%s requested, %s found%s, %s missing%s",#t+#f,#t,ts,#f,fs)
+ local ts = (nt>0 and format(" (%s)",concat(t," "))) or ""
+ local fs = (nf>0 and format(" (%s)",concat(f," "))) or ""
+ return format("%s requested, %s found%s, %s missing%s",nt+nf,nt,ts,nf,fs)
else
return nil
end
diff --git a/Master/texmf-dist/tex/context/base/supp-fil.mkiv b/Master/texmf-dist/tex/context/base/supp-fil.mkiv
index 872612eab0b..6b9af21cee2 100644
--- a/Master/texmf-dist/tex/context/base/supp-fil.mkiv
+++ b/Master/texmf-dist/tex/context/base/supp-fil.mkiv
@@ -12,7 +12,7 @@
%C details.
%D \TEX\ operates on files, so one wouldn't wonder that there
-%D is a separate module for file support. In \CONTEXT\ files
+%D is a separate module for file commands. In \CONTEXT\ files
%D are used for several purposes:
%D
%D \startitemize[packed]
@@ -39,11 +39,8 @@
\def\f!parentpath {..}
\fi
-% \def\openinputfile #1#2{\immediate\openin #1="#2"\relax} \def\closeinputfile #1{\immediate\closein #1}
-% \def\openoutputfile#1#2{\immediate\openout#1="#2"\relax} \def\closeoutputfile#1{\immediate\closeout#1}
-
-\def\openinputfile #1#2{\immediate\openin #1=#2\relax} \def\closeinputfile #1{\immediate\closein #1}
-\def\openoutputfile#1#2{\immediate\openout#1=#2\relax} \def\closeoutputfile#1{\immediate\closeout#1}
+\def\openinputfile #1#2{\immediate\openin #1={#2}} \def\closeinputfile #1{\immediate\closein #1}
+\def\openoutputfile#1#2{\immediate\openout#1={#2}} \def\closeoutputfile#1{\immediate\closeout#1}
%D \macros
%D {pushendofline,popendofline}
@@ -60,25 +57,20 @@
%D ... reading ...
%D \popendofline
%D \stoptyping
-%D
-%D Just to be sure, we save the current meaning of \type{^^M}
-%D in \type{\poppedendofline}.
\newcount \endoflinelevel
-\ifx\newlinecode\undefined \chardef\newlinecode=`\^^M \fi
-
\def\pushendofline
{\advance\endoflinelevel\plusone
- \expandafter\chardef\csname :eol:\number\endoflinelevel\endcsname\catcode\newlinecode
- \catcode\newlinecode\@@comment\relax}
+ \expandafter\chardef\csname :eol:\number\endoflinelevel\endcsname\catcode\endoflineasciicode
+ \catcode\endoflineasciicode\commentcatcode\relax}
\def\popendofline
- {\catcode\newlinecode\csname :eol:\number\endoflinelevel\endcsname
+ {\catcode\endoflineasciicode\csname :eol:\number\endoflinelevel\endcsname
\advance\endoflinelevel\minusone}
\def\restoreendofline
- {\catcode\newlinecode\@@endofline}
+ {\catcode\endoflineasciicode\endoflinecatcode}
%D \macros
%D {scratchread, scratchwrite}
@@ -106,8 +98,8 @@
\def\writeln#1{\write#1{}}
-\def\doiffileexistselse #1{\ctxlua{support.doiffileexistelse([[#1]])}}
-\def\lastfoundexistingfile {\ctxlua{support.lastexistingfile()}}
+\def\doiffileexistselse #1{\ctxcommand{doiffileexistelse([[#1]])}}
+\def\lastfoundexistingfile {\ctxcommand{lastexistingfile()}}
%D \macros
%D {doprocessfile,fileline,fileprocessedtrue,dofinishfile}
@@ -172,13 +164,13 @@
{\edef#3{#2}}
{\edef#3{#1\f!pathseparator#2}}}
-\def\sanitizefilename#1\to#2{\edef#2{\ctxlua{support.thesanitizedfilename([[#1]])}}}
+\def\sanitizefilename#1\to#2{\edef#2{\ctxcommand{thesanitizedfilename([[#1]])}}}
%D NEW:
-\chardef\kindoffile=0 % 0=normal 1=full path spec (or http) / set at the lua end
+\newconstant\kindoffile % 0=normal 1=full path spec (or http) / set at the lua end
-\def\checkfilename#1{\ctxlua{support.checkfilename([[#1]])}}
+\def\checkfilename#1{\ctxcommand{checkfilename([[#1]])}}
%D \macros
%D {input, normalinput}
@@ -191,7 +183,7 @@
\unexpanded\def\input{\normalinput}
-\def\inputgivenfile#1{\normalinput"#1"\relax}
+\def\inputgivenfile#1{\normalinput{#1}}
%D \macros
%D {readfile,ReadFile}
@@ -248,13 +240,13 @@
\let \everyreadfile \everybeforereadfile
-\def\maxreadlevel{\ctxlua{commands.maxreadlevel()}}
+\def\maxreadlevel{\ctxcommand{maxreadlevel()}}
% We need to postpone loading, else we got frozen type-* files and so when
% a format is generated on a source path.
\def\doreadfile#1#2#3% protocol path filename true false
- {\edef\readfilename{\ctxlua{support.doreadfile("#1","#2","#3")}}%
+ {\edef\readfilename{\ctxcommand{doreadfile("#1","#2","#3")}}%
\ifx\readfilename\empty
\expandafter\doreadfilenop
\else
@@ -318,10 +310,14 @@
\readfile{#1}{#2}{#3}%
\popcatcodetable}
-\def\readxmlfile#1#2#3%
- {\pushcatcodetable \catcodetable \xmlcatcodes
- \readfile{#1}{#2}{#3}%
- \popcatcodetable}
+\ifdefined \xmlcatcodes
+
+ \def\readxmlfile#1#2#3%
+ {\pushcatcodetable \catcodetable \xmlcatcodes
+ \readfile{#1}{#2}{#3}%
+ \popcatcodetable}
+
+\fi
%D \macros
%D {doiffileelse,doiflocfileelse}
@@ -403,7 +399,7 @@
\ifx\outputfilename\undefined \def\outputfilename{\jobname} \fi
-\def\doifparentfileelse#1{\ctxlua{support.doifparentfileelse([[#1]])}}
+\def\doifparentfileelse#1{\ctxcommand{doifparentfileelse([[#1]])}}
\newcount\readingfilelevel
@@ -415,11 +411,13 @@
\unexpanded\def\startreadingfile% beter een every en \setnormalcatcodes
{\global\advance\readingfilelevel\plusone
\the\everystartreadingfile
- \beginrestorecatcodes
- \setcatcodetable\prtcatcodes}
+ \pushcatcodetable % saveguard
+ \ctxlua{regimes.push()}% temporarily this way
+ }% \setcatcodetable\prtcatcodes % no longer in mkiv, has to be done explictly
\unexpanded\def\stopreadingfile
- {\endrestorecatcodes
+ {\popcatcodetable % saveguard
+ \ctxlua{regimes.pop()}% temporarily this way
\the\everystopreadingfile
\global\advance\readingfilelevel\minusone}
@@ -450,7 +448,7 @@
%D
%D \start \typebuffer \getbuffer \stop
-\def\splitoffroot{.} \chardef\splitoffkind\zerocount
+\def\splitoffroot{.} \newconstant\splitoffkind
\let\splitofffull\empty
\let\splitoffpath\empty
@@ -458,7 +456,7 @@
\let\splitoffname\empty
\let\splitofftype\empty
-\def\splitfilename#1{\ctxlua{support.splitfilename([[#1]])}}
-\def\splitfiletype#1{\ctxlua{support.splitfiletype([[#1]])}}
+\def\splitfilename#1{\ctxcommand{splitfilename([[#1]])}}
+\def\splitfiletype#1{\ctxcommand{splitfiletype([[#1]])}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/supp-fun.tex b/Master/texmf-dist/tex/context/base/supp-fun.mkii
index 6b26437038e..6b26437038e 100644
--- a/Master/texmf-dist/tex/context/base/supp-fun.tex
+++ b/Master/texmf-dist/tex/context/base/supp-fun.mkii
diff --git a/Master/texmf-dist/tex/context/base/supp-fun.mkiv b/Master/texmf-dist/tex/context/base/supp-fun.mkiv
new file mode 100644
index 00000000000..a8db3b6343d
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/supp-fun.mkiv
@@ -0,0 +1,746 @@
+%D \module
+%D [ file=supp-fun,
+%D version=1995.10.10,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Fun Stuff,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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
+
+%D This module implements some typographics tricks that can
+%D be fun when designing document layouts. The examples use
+%D macros that are typical to \CONTEXT, but non \CONTEXT\
+%D users can use the drop caps and first line treatment
+%D macros without problems. This module will be extended
+%D when the need for more of such tricks arises.
+
+\ifx \undefined \writestatus \input supp-mis.tex \relax \fi
+
+\writestatus{loading}{ConTeXt Support Macros / Fun Stuff}
+
+\ifx\definefont\undefined
+ \def\definedfont[#1]{\font\temp#1\relax\temp}
+\fi
+
+%D \macros
+%D {DroppedCaps, DroppedString, DroppedIndent, DroppedLines}
+%D
+%D \startbuffer
+%D \DroppedCaps
+%D {\color[green]} {cmbx12}
+%D {2.2\baselineskip} {2pt} {\baselineskip} {2}
+%D Let's start
+%D \stopbuffer
+%D
+%D \getbuffer with dropped caps, those blown up first
+%D characters of a paragraph. It's hard to implement a general
+%D mechanism that suits all situations, but dropped caps are so
+%D seldomly used that we can permit ourselves a rather user
+%D unfriendly implementation.
+%D
+%D \typebuffer
+%D
+%D As we will see, there are 7 different settings involved. The
+%D first argument takes a command that is used to do whatever
+%D fancy things we want to do, but normally this one will be
+%D empty. The second argument takes the font. Because we're
+%D dealing with something very typographic, there is no real
+%D reason to adopt complicated font switching schemes, a mere
+%D name will do. Font encodings can bring no harm, because the
+%D alphanumeric characters are nearly always located at their
+%D natural position in the encoding vector.
+%D
+%D \startbuffer
+%D \DroppedCaps
+%D {\color[red]} {cmbx12}
+%D {\baselineskip} {0pt} {0pt} {1}
+%D This simple
+%D \stopbuffer
+%D
+%D \getbuffer case shows us what happens when we apply minimal
+%D values. Here we used:
+%D
+%D \typebuffer
+%D
+%D \startbuffer
+%D \DroppedCaps
+%D {\color[red]} {cmbx12}
+%D {2\baselineskip} {0pt} {\baselineskip} {2}
+%D Is this ugly
+%D \stopbuffer
+%D
+%D \getbuffer example the third argument tells
+%D this macro that we want a dropped capital scaled to the
+%D baseline distance. The two zero point arguments are the
+%D horizontal and vertical offsets and the last arguments
+%D determines the hanging indentation. In this paragraph we
+%D set the height to two times the baselinedistance and use
+%D two hanging lines:
+%D
+%D \typebuffer
+%D
+%D Here, the first character is moved down one baseline. Here
+%D we also see why the horizontal offset is important. The
+%D first example (showing the~L) sets this to a few points and
+%D also used a slightly larger height.
+%D
+%D Of course common users (typist) are not supposed to see this
+%D kind of fuzzy definitions, but fortunately \TEX\ permits us
+%D to hide them in macros. Using a macro also enables us to
+%D garantee consistency throughout the document:
+%D
+%D \startbuffer
+%D \def\MyDroppedCaps%
+%D {\DroppedCaps
+%D {\color[green]} {cmbx12}
+%D {5\baselineskip} {3pt} {3\baselineskip} {4}}
+%D
+%D \MyDroppedCaps The implementation
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer of the general macro is rather simple and only
+%D depends on the arguments given and the dimensions of the
+%D strut box. We explicitly load the font, which is no problem
+%D because \TEX\ does not load a font twice. We could have
+%D combined some arguments, like the height, vertical offset
+%D and the number of lines, but the current implementation
+%D proved to be the most flexible. One should be aware of the
+%D fact that the offsets depend on the design of the glyphs
+%D used.
+
+\let\DroppedIndent\!!zeropoint \def\DroppedLines{0}
+
+\def\DroppedString{ABCDEFGHIJKLMNOPQRSTUVWXYZ}
+
+\let\globaldropcaps\global % will be an option, but on by default
+
+\def\localdropcaps{\let\globaldropcaps\relax}
+
+\chardef\DroppedStatus = 0 % 0=done 1=starting 2=doing 3=error
+\chardef\DropMode = 0 % 1 == marginhang
+
+\ifx\keeplinestogether\undefined
+ \let\keeplinestogether\gobbleoneargument
+\fi
+
+\def\DroppedCaps#1#2#3#4#5#6#7% does not yet handle accented chars
+ {\defconvertedargument\asciia{#7}%
+ \defconvertedcommand \asciib{\DroppedString}%
+ \doifinstringelse\asciia\asciib
+ {\noindentation
+ \dontleavehmode
+ \checkindentation % redo this one
+ %\ifhmode\hskip-\parindent\fi % sensitive for context mechanism
+ \keeplinestogether{#6}%
+ \setbox0\hbox{\definedfont[#2 at #3]#1{#7}\hskip#4}%
+ \ifdim\dp0>\strutdp % one of those Q's , will be option
+ \setbox2\hbox{\raise\dp0\hbox{\lower\strutdp\copy0}}%
+ \ht2\ht0
+ \dp0\strutdp
+ \setbox0\box2
+ \fi
+ \setbox0\hbox
+ {\ifnum\DropMode=\plusone
+ \hskip-\wd0\wd0\zeropoint
+ \fi
+ \lower#5\box0}%
+ \ht0\strutht
+ \dp0\strutdp
+ \ifnum\DropMode=\plusone
+ \globaldropcaps\let\DroppedIndent\!!zeropoint
+ \globaldropcaps\edef\DroppedLines{\number\maxdimen}%
+ \globaldropcaps\chardef\DroppedStatus\plusthree
+ \else
+ \globaldropcaps\edef\DroppedIndent{\the\wd0}%
+ \globaldropcaps\edef\DroppedLines {\number#6}%
+ \globaldropcaps\chardef\DroppedStatus\plustwo
+ \globaldropcaps\hangindent\DroppedIndent
+ \globaldropcaps\hangafter-\DroppedLines
+% \noindent
+ \noindentation
+ \checkindentation % redo this one
+ \hskip-\DroppedIndent
+ \fi
+ \vbox{\forgetall\box0}%
+ \nobreak
+ \let\next\ignorespaces} % Could be a one character word !
+ {\globaldropcaps\let\DroppedIndent\!!zeropoint
+ \globaldropcaps\edef\DroppedLines{\number\maxdimen}%
+ \globaldropcaps\chardef\DroppedStatus\plusthree
+ \def\next{#7}}%
+ \let\globaldropcaps\global
+ \next}
+
+%D Before we go to the next topic, we summarize this command:
+%D
+%D \starttyping
+%D \DroppedCaps
+%D {command} {font}
+%D {height} {hoffset} {voffset} {lines}
+%D \stoptyping
+%D
+%D Sometimes you need to make sure that the global settings are
+%D kept local, as in:
+%D
+% %D \startbuffer
+% %D \defineparagraphs[SomePar][n=2,rule=on]
+% %D \setupparagraphs [SomePar][1][width=.5\textwidth]
+% %D \setupparagraphs [SomePar][2][width=.5\textwidth]
+%D \startbuffer
+%D \defineparagraphs[SomePar][n=2,rule=on]
+%D \setupparagraphs [SomePar][1][width=.5\textwidth]
+%D \setupparagraphs [SomePar][2][width=.5\textwidth]
+%D
+%D \startSomePar
+%D \localdropcaps\NiceDroppedCaps{}{cmr12}{0pt}{2}Here we need
+%D to explicitly keep the hanging indentation local, like it or
+%D not.
+%D \SomePar
+%D \localdropcaps\NiceDroppedCaps{}{cmr12}{0pt}{2}Here we need
+%D to explicitly keep the hanging indentation local, like it or
+%D not.
+%D \stopSomePar
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D {AutoDroppedCaps, CheckDroppedCaps}
+%D
+%D {\em To be documented.}
+
+% example usage
+%
+% \def\bpar{\ifvmode\CheckDroppedCaps\fi}
+% \def\epar{\ifhmode\par\fi\CheckDroppedCaps}
+
+\newcount\lastprevgraf
+\newcount\droppedlines
+
+\def\CheckDroppedCaps
+ {\global\lastprevgraf\prevgraf}
+
+\def\AutoDroppedCaps % will be proper core stuff since it
+ {\globaldropcaps\chardef\DroppedStatus\plusone
+ \global\lastprevgraf\zerocount
+ \global\droppedlines\zerocount
+ \EveryPar{\doAutoDroppedCaps}}
+
+\let\AutoDroppedNext\relax
+
+\ifx\AutoDroppedCapsCommand\undefined
+ \def\AutoDroppedCapsCommand{\NiceDroppedCaps{}{SerifBold}{.125em}{3}}
+\fi
+
+\def\doAutoDroppedCaps
+ {\ifcase\DroppedStatus % done
+ \let\next\relax
+ \or % starting
+ % \ifnum\lastprevgraf>0 % tricky, probably a wrong par
+ % \globaldropcaps\chardef\DroppedStatus=3 % and inhibits dropped
+ % \let\next\relax % caps after titles and more than once
+ % \else % so let's nill this rubishly code fragment
+ \let\next\AutoDroppedCapsCommand
+ % \fi % and hope for the best
+ \or % doing
+ \global\advance\droppedlines \lastprevgraf
+ \ifnum\droppedlines=\zerocount
+ \globaldropcaps\chardef\DroppedStatus\zerocount
+ \let\next\relax
+ \else\ifnum\droppedlines>\zerocount
+ \ifnum\droppedlines<\DroppedLines\relax
+ \globaldropcaps\hangindent\DroppedIndent
+ \globaldropcaps\hangafter-\DroppedLines
+ \globaldropcaps\advance\hangafter \droppedlines
+ \hskip-\parindent % brrr
+ \let\next\AutoDroppedNext
+ \else
+ \globaldropcaps\chardef\DroppedStatus\zerocount
+ \let\next\relax
+ \fi
+ \else
+ \globaldropcaps\chardef\DroppedStatus\zerocount
+ \let\next\relax
+ \fi\fi
+ \or % error
+ \globaldropcaps\chardef\DroppedStatus\zerocount
+ \let\next\relax
+ \fi
+ \next}
+
+%D \macros
+%D {LineDroppedCaps, NiceDroppedCaps}
+%D
+%D To save definitions, we also provide:
+%D
+%D \starttyping
+%D \LineDroppedCaps {command} {font} {hoffset} {lines}
+%D \NiceDroppedCaps {command} {font} {hoffset} {lines}
+%D \stoptyping
+%D
+%D The first command scales the font to the exact height, while
+%D the second command scales the font to a nice 2.5 times the
+%D line height, a value that gives a pleasant grayness.
+
+\def\DoLineDroppedCaps#1#2#3#4#5% compensation command font offset lines
+ {\scratchcounter#5%
+ \advance\scratchcounter \minusone
+ \scratchdimen\scratchcounter\baselineskip
+ \advance\scratchdimen #1%
+ \NormalizeFontHeight\DummyFont{W}\scratchdimen{#3}%
+ \DroppedCaps{#2}{#3}\TheNormalizedFontSize{#4}
+ {\scratchcounter\baselineskip}{#5}}
+
+\def\LineDroppedCaps% command font offset lines
+ {\DoLineDroppedCaps{\strutht}}
+
+\def\NiceDroppedCaps% command font offset lines
+ {\DoLineDroppedCaps{.5\baselineskip}}
+
+%D \macros
+%D {TreatFirstLine}
+%D
+%D \startbuffer
+%D \TreatFirstLine {\sc} {} {} {}
+%D Instead of limiting its action to one token, the next macro
+%D treats the whole first line. This paragraph was typeset by
+%D saying:
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D \typebuffer
+%D
+%D \startbuffer
+%D \TreatFirstLine {\startcolor[red]\bf} {\stopcolor} {} {}
+%D The combined color and font effect is also possible,
+%D although one must be careful in using macros that accumulate
+%D grouping, but the commands used here are pretty save in that
+%D respect.
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D \typebuffer
+%D
+%D Before we explain the third and fourth argument, we show the
+%D implementation. Those who know a bit about the way \TEX\
+%D treats tokens, will probably see in one glance that this
+%D alternative works all right for most text||only situations
+%D in which there is enough text available for the first line,
+%D but that more complicated things will blow. One has to live
+%D with that. A workaround is rather trivial but obscures the
+%D principles used.
+
+\def\TreatFirstLine#1#2#3#4% before, after, first, next
+ {\leavevmode
+ \bgroup
+ \forgetall
+ \bgroup
+ #1%
+ \setbox0\emptybox
+ \setbox2\emptybox
+ \def\grabfirstline##1 %
+ {\setbox2\hbox
+ {\ifvoid0
+ {#3{\ignorespaces##1}}%
+ \else
+ \unhcopy0\ {#4{##1}}%
+ \fi}%
+ \ifdim\wd2=\zeropoint
+ \setbox0\emptybox
+ \setbox2\emptybox
+ \@EA\grabfirstline
+ \else\ifdim\wd2>\hsize
+ \hbox to \hsize{\strut\unhbox0}#2\egroup
+ \break##1\
+ \egroup
+ \else
+ \setbox0\box2
+ \@EAEAEA\grabfirstline
+ \fi\fi}%
+ \grabfirstline}
+
+%D \startbuffer
+%D \gdef\FunnyCommand
+%D {\getrandomfloat\FunnyR{0}{1}%
+%D \getrandomfloat\FunnyG{0}{1}%
+%D \getrandomfloat\FunnyB{0}{1}%
+%D \definecolor[FunnyColor][r=\FunnyR,g=\FunnyG,b=\FunnyB]%
+%D \color[FunnyColor]}
+%D
+%D %\TreatFirstLine {\bf} {} {\FunnyCommand} {\FunnyCommand}
+%D The third and fourth argument can be used to gain special
+%D effects on the individual words. Of course one needs ...
+%D \stopbuffer
+%D
+%D \getbuffer
+%D to know a bit more about the macro package used to get real
+%D nice effects, but this example probably demonstrates the
+%D principles well.
+%D
+%D \typebuffer
+%D
+%D Like in dropped caps case, one can hide such treatments in a
+%D macro, like:
+%D
+%D \starttyping
+%D \def\MyTreatFirstLine%
+%D {\TreatFirstLine{\bf}{}{\FunnyCommand}{\FunnyCommand}}
+%D \stoptyping
+
+%D \macros
+%D {reshapebox}
+%D
+%D \startbuffer
+%D \beginofshapebox
+%D When using \CONTEXT, one can also apply this funny command
+%D to whole lines by using the reshape mechanism. Describing
+%D this interesting mechanism falls outside the scope of this
+%D module, so we only show the trick. This is an example of
+%D low level \CONTEXT\ functionality: it's all there, and it's
+%D stable, but not entirely meant for novice users.
+%D \endofshapebox
+%D
+%D \reshapebox{\FunnyCommand{\box\shapebox}} \flushshapebox
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D \typebuffer
+%D
+%D This mechanism permits hyphenation and therefore gives
+%D better results than the previously discussed macro
+%D \type{\TreatFirstLine}.
+
+%D \macros
+%D {TreatFirstCharacter}
+%D
+%D \startbuffer
+%D \TreatFirstCharacter{\bf\color[green]} Just to be
+%D \stopbuffer
+%D
+%D \getbuffer complete we also offer a very simple one
+%D character alternative, that is not that hard to understand:
+
+\def\TreatFirstCharacter#1#2% command, character
+ {{#1{#2}}}
+
+%D A previous paragraph started with:
+%D
+%D \typebuffer
+
+%D \macros
+%D {StackCharacters}
+%D
+%D The next hack deals with vertical stacking.
+
+\def\StackCharacters#1#2#3#4% sequence vsize vskip command
+ {\vbox #2
+ {\forgetall
+ \baselineskip\zeropoint
+ \def\StackCharacter##1{#4{##1}\cr\noalign{#3}}%
+ \halign
+ {\hss##\hss&##\cr
+ \handletokens#1\with\StackCharacter\cr}}}
+
+%D \startbuffer
+%D \StackCharacters{CONTEXT}{}{\vskip.2ex}{\FunnyCommand}
+%D \stopbuffer
+%D
+%D Such a stack looks like:
+%D
+%D \startlinecorrection
+%D \hbox to \hsize
+%D {$\hss\bfd
+%D \vcenter{\StackCharacters{TEX} {}{\vskip.2ex}{\FunnyCommand}}%
+%D \hss
+%D \vcenter{\StackCharacters{CON} {}{\vskip.2ex}{\FunnyCommand}}
+%D \hss
+%D \vcenter{\StackCharacters{TEXT} {}{\vskip.2ex}{\FunnyCommand}}
+%D \hss
+%D \vcenter{\StackCharacters{CONTEXT}{}{\vskip.2ex}{\FunnyCommand}}
+%D \hss$}
+%D \stoplinecorrection
+%D
+%D and is typeset by saying:
+%D
+%D \typebuffer
+%D
+%D An alternative would have been
+%D
+%D \starttyping
+%D \StackCharacters {CONTEXT} {to 5cm} {\vfill} {\FunnyCommand}
+%D \stoptyping
+
+%D \macros
+%D {processtokens}
+%D
+%D At a lower level horizontal and vertical manipulations are
+%D already supported by:
+%D
+%D \starttyping
+%D \processtokens {begin} {between} {end} {space} {text}
+%D \stoptyping
+%D
+%D \startbuffer[a]
+%D \processtokens
+%D {\hbox to .5\hsize\bgroup} {\hfill}
+%D {\egroup} {\space} {LET'S HAVE}
+%D \stopbuffer
+%D
+%D \startbuffer[b]
+%D \processtokens
+%D {\vbox\bgroup\raggedcenter\hsize1em}
+%D {\vskip.25ex} {\egroup} {\strut} {FUN}
+%D \stopbuffer
+%D
+%D This macro is able to typeset:
+%D
+%D \leavevmode\hbox to \hsize
+%D {$\hfil\hfil
+%D \vcenter{\bf\getbuffer[a]}%
+%D \hfil
+%D \vcenter{\bfd\getbuffer[b]}%
+%D \hfil\hfil$}
+%D
+%D which was specified as:
+%D
+%D \typebuffer[a]
+%D \typebuffer[b]
+
+%D \macros
+%D {NormalizeFontHeight, NormalizeFontWidth,
+%D TheNormalizedFontSize}
+%D
+%D Next we introduce some font manipulation macros. When we
+%D want to typeset some text spread in a well defined area, it
+%D can be considered bad practice to manipulate character and
+%D word spacing. In such situations the next few macros can be
+%D of help:
+%D
+%D \starttyping
+%D \NormalizeFontHeight \name {sample text} {height} {font}
+%D \NormalizeFontWidth \name {sample text} {width} {font}
+%D \stoptyping
+%D
+%D These are implemented using an auxilliary macro:
+
+\def\NormalizeFontHeight{\NormalizeFontSize\ht}
+\def\NormalizeFontWidth {\NormalizeFontSize\wd}
+
+% \def\NormalizeFontSize#1#2#3#4#5%
+% {\bgroup
+% \dimen0=#4% #4 can be \ht0 or so
+% \setbox0\hbox{\definedfont[#5 at 10pt]#3}%
+% \ifdim\wd0>\zeropoint
+% \dimen2=#10 % #1 is \wd or \ht
+% \dimen4=10000pt
+% \divide\dimen4 \dimen2
+% \divide\dimen0 \plusthousand
+% \dimen0=\number\dimen4\dimen0
+% \xdef\TheNormalizedFontSize{\the\dimen0}%
+% \else
+% \dimen0\bodyfontsize
+% \fi
+% \definedfont[#5 at \the\dimen0]%
+% \expandafter
+% \egroup
+% \expandafter\font\expandafter#2\fontname\font\relax}
+%
+% the familiar struggle with accuracy forces us to use:
+
+\def\NormalizeFontSize#1#2#3#4#5%
+ {\bgroup
+ \dimen0=#4% #4 can be \ht0 or so
+ \setbox0\hbox{\definedfont[#5 at 5pt]#3}% 10pt
+ \ifdim\wd0>\zeropoint
+ \dimen2=#10 % #1 is \wd or \ht
+ \dimen4=\maxdimen % 10000pt
+ \divide\dimen4 \dimen2
+ \divide\dimen0 1638 % 1000
+ \dimen0=\number\dimen4\dimen0
+ \divide \dimen0 \plustwo % ...
+ \xdef\TheNormalizedFontSize{\the\dimen0}%
+ \else
+ \dimen0\bodyfontsize
+ \fi
+ % mkii
+ % \definedfont[#5 at \the\dimen0]%
+ % \expandafter
+ % \egroup
+ % \expandafter\font\expandafter#2\fontname\font\relax}
+ % mkiv safe (file: prefix etc)
+ \expanded{\egroup\def\noexpand#2{\definedfont[#5 at \the\dimen0]}}}
+
+%D Afterwards, we have access to the calculated size by:
+
+\let\TheNormalizedFontSize\!!zeropoint
+
+%D Extra:
+
+\def\WidthSpanningText#1#2#3% text width font
+ {\hbox{\NormalizeFontWidth\temp{#1}{#2}{#3}\temp\the\everydefinedfont#1}}
+
+%D Consider for instance:
+%D
+%D \startbuffer
+%D \NormalizeFontHeight \tmp {X} {2\baselineskip} {cmr10}
+%D
+%D {\tmp To Be Or Not To Be}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This shows up as (we also show the baselines):
+%D
+%D {\showbaselines\getbuffer}
+%D
+%D The horizontal counterpart is:
+%D
+%D \startbuffer
+%D \NormalizeFontWidth \tmp {This Line Fits} {\hsize} {cmr10}
+%D
+%D \hbox{\tmp This Line Fits}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D The calculated font scale is avaliable in the macro
+%D \type{\NormalizedFontSize}.
+%D
+%D \startlinecorrection
+%D \ruledhbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D One can of course combine these macros with the ones
+%D described earlier, like in:
+%D
+%D \starttyping
+%D \NormalizeFontHeight {text} \DroppedFont {2\baselineskip} {cmbx12}
+%D
+%D \def\NicelyDroppedCaps
+%D {\DroppedCaps
+%D {\color[green]}
+%D {\DroppedFont}
+%D {2pt}
+%D {\baselineskip}
+%D {2}}
+%D \stoptyping
+%D
+%D It's up to the reader to test this one.
+
+\unexpanded\def\FirstNCharacters#1#2% \FirstNCharacters{3}{fr{\"o}beln}
+ {\bgroup
+ \scratchcounter\zerocount
+ \def\docommand##1%
+ {\ifnum\scratchcounter=#1\else
+ ##1\relax % catches ##1 = \"e and alike
+ \advance\scratchcounter\plusone
+ \fi}
+ \handletokens#2\with\docommand
+ \egroup}
+
+%D \macros
+%D {FittingText}
+%D
+%D First used in Pascal (demo-bbv):
+%D
+%D \startbuffer
+%D \ruledvbox{\FittingText{3cm}{1cm}{Serif}{24pt}{1pt}{1}
+%D {\veryraggedright
+%D \hangindent1em\hangafter1\relax
+%D \begstrut \dorecurse{8}{Bram Marta }\unskip \endstrut}}
+%D
+%D \ruledvbox{\FittingText{3cm}{1cm}{Serif}{24pt}{1pt}{1}
+%D {\raggedleft\begstrut Bram\\Marta \unskip\endstrut}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+
+% #1 width #2 height #3 font #4 size #5 step #6 interlinie #7 text
+
+\long\def\FittingText#1#2#3#4#5#6#7%
+ {\bgroup
+ \forgetall
+ \dontcomplain
+ \setuptolerance[\v!verytolerant]% == \tolerance4500
+ \hsize#1%
+ \def\\{\softbreak}%
+ \!!heighta#4%
+ \!!heightb#2%
+ \doloop
+ {\ifdim\!!heighta>\onepoint
+ \expanded{\definefont[\s!dummy][#3 at \the\!!heighta][\c!interlinespace=#6]}%
+ \getvalue\s!dummy
+ \setbox\scratchbox\vbox{#7\endgraf}%
+ \ifdim\ht\scratchbox>\!!heightb
+ \advance\!!heighta-#5%
+ \else
+ \beginshapebox
+ \unvcopy\scratchbox
+ \endshapebox
+ \global\dimen1\hsize
+ \reshapebox
+ {\setbox\shapebox\hbox{\unhbox\shapebox}%
+ \ifdim\wd\shapebox>\dimen1
+ \global\dimen1\wd\shapebox
+ \fi}%
+ \ifdim\dimen1>\hsize
+ \advance\!!heighta-#5%
+ \else
+ \exitloop
+ \fi
+ \fi
+ \else
+ \exitloop
+ \fi}%
+ %\writestatus{\strippedcsname\FittingText}{height: \the\!!heighta}%
+ \unvbox\scratchbox
+ \egroup}
+
+%D New:
+
+% \font width gap font spec text
+
+\def\NormalizeFontWidthSpread#1#2#3#4#5#6%
+ {\global\setfalse\NFSpread
+ \scratchdimen#3%
+ \scratchdimen-.5\scratchdimen
+ \advance\scratchdimen#2\relax
+ \NormalizeFontWidth
+ #1%
+ {\def\+{\global\settrue\NFSpread\gobbleuntil\relax}%
+ \def\\{\gobbleuntil\relax}% newline
+ \setupspacing
+ #6\relax}%
+ {\scratchdimen}%
+ {#4}%
+ \ifconditional\NFSpread
+ % de gap valt in de binding
+ \else
+ \definefont[\strippedcsname#1][#4 #5]%
+ \fi}
+
+\def\SpreadGapText#1#2%
+ {{\def\+{\kern#1}#2}}
+
+\def\GapText#1#2#3#4#5% width distance font spec title
+ {\bgroup
+ \NormalizeFontWidthSpread\DummyFont{#1}{#2}{#3}{#4}{#5}%
+ \DummyFont\setupspacing\SpreadGapText{#2}{#5}\endgraf
+ \egroup}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/syst-ltx.tex b/Master/texmf-dist/tex/context/base/supp-lat.mkii
index ae89ff25b81..576121327cb 100644
--- a/Master/texmf-dist/tex/context/base/syst-ltx.tex
+++ b/Master/texmf-dist/tex/context/base/supp-lat.mkii
@@ -11,6 +11,9 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D The bib module assumes that sometimes this command is used but
+%D in \MKIV\ we no longer assume that.
+%D
%D \macros
%D {newcommand}
%D
diff --git a/Master/texmf-dist/tex/context/base/supp-mat.mkiv b/Master/texmf-dist/tex/context/base/supp-mat.mkiv
index 4aebddda91d..e441cbc2824 100644
--- a/Master/texmf-dist/tex/context/base/supp-mat.mkiv
+++ b/Master/texmf-dist/tex/context/base/supp-mat.mkiv
@@ -46,9 +46,26 @@
%D
%D Which is implemented as:
-\long\def\mathematics#1{\relax \ifmmode#1\else\Ustartmath #1\Ustopmath \fi}
-\long\def\displaymath#1{\noindent \ifmmode#1\else\Ustartdisplaymath#1\Ustopdisplaymath\fi}
-\long\def\inlinemath #1{\dontleavehmode\ifmmode#1\else\Ustartmath #1\Ustopmath \fi}
+\let\normalsuperscript \Usuperscript
+\let\normalsubscript \Usubscript
+\let\normalstartimath \Ustartmath
+\let\normalstopimath \Ustopmath
+\let\normalstartdmath \Ustartdisplaymath
+\let\normalstopdmath \Ustopmath
+\def\normalmathaligntab{&} % \let\normalmathaligntab\aligntab does to work well in a let to & (a def works ok)
+
+\let\normalsuper \Usuperscript % obsolete
+\let\normalsuber \Usubscript % obsolete
+\let\startimath \Ustartmath % obsolete, less safe
+\let\stopimath \Ustopmath % obsolete, less safe
+\let\startdmath \Ustartdisplaymath % obsolete, less safe
+\let\stopdmath \Ustopmath % obsolete, less safe
+
+\long\def\mathematics#1{\relax \ifmmode#1\else\normalstartimath#1\normalstopimath\fi}
+\long\def\displaymath#1{\noindent \ifmmode#1\else\normalstartdmath#1\normalstopdmath\fi}
+\long\def\inlinemath #1{\dontleavehmode\ifmmode#1\else\normalstartimath#1\normalstopimath\fi}
+
+\let\m\mathematics % unexpanded?
\let\stopmathmode\relax
@@ -56,14 +73,14 @@
{\relax\ifmmode
\let\stopmathmode\relax
\else
- \Ustartmath\let\stopmathmode\Ustopmath
+ \normalstartimath\let\stopmathmode\normalstopimath
\fi}
\unexpanded\def\startmathmode % nested variant
{\relax\ifmmode
\begingroup\let\stopmathmode\endgroup
\else
- \Ustartmath\let\stopmathmode\Ustopmath
+ \normalstartimath\let\stopmathmode\normalstopimath
\fi}
\def\nomathematics#1%
@@ -127,67 +144,58 @@
\unexpanded\def\nodimension#1%
{\unskip#1\global\let\dodimensionsignal\relax}
-%D \macros
-%D {super, suber}
-%D
-%D \TEX\ uses \type{^} and \type{_} for entering super- and
-%D subscript mode. We want however a bit more control than
-%D normally provided, and therefore provide \type {\super}
-%D and \type{\suber} (\type {\sub} is already taken).
-
-\global\let\normalsuper=^
-\global\let\normalsuber=_
-
-\newcount\supersubmode
-
-\newevery\everysupersub \EverySuperSub
-
-\appendtoks \advance\supersubmode 1\relax \to \everysupersub
-
-% \def\dodosuper#1{\normalsuper{\the\everysupersub#1}}
-% \def\dodosuber#1{\normalsuber{\the\everysupersub#1}}
+% %D \macros
+% %D {super, suber}
+% %D
+% %D \TEX\ uses \type{^} and \type{_} for entering super- and
+% %D subscript mode. We want however a bit more control than
+% %D normally provided, and therefore provide \type {\super}
+% %D and \type{\suber} (\type {\sub} is already taken).
%
-% \def\dosuper{\ifx\next\bgroup\expandafter\dodosuper\else\normalsuper\fi}
-% \def\dosuber{\ifx\next\bgroup\expandafter\dodosuber\else\normalsuber\fi}
+% \global\let\normalsuper=\normalsuperscript % will become obsolete
+% \global\let\normalsuber=\normalsubscript % will become obsolete
%
-% \def\super{\futurelet\next\dosuper}
-% \def\suber{\futurelet\next\dosuber}
-
-\def\super#1{\normalsuper{\the\everysupersub#1}}
-\def\suber#1{\normalsuber{\the\everysupersub#1}}
-
-%D \macros
-%D {enablesupsub}
-%D
-%D We can let \type {^} and \type {_} act like \type {\super}
-%D and \type {\suber} by saying \type {\enablesupsub}.
-
-\bgroup
-\catcode`\^=\@@active
-\catcode`\_=\@@active
-\gdef\enablesupsub
- {\catcode`\^=\@@active
- \def^{\ifmmode\expandafter\super\else\expandafter\normalsuper\fi}%
- \catcode`\_=\@@active
- \def_{\ifmmode\expandafter\suber\else\expandafter\normalsuber\fi}}
-\egroup
-
-%D \macros
-%D {restoremathstyle}
-%D
-%D We can pick up the current math style by calling \type
-%D {\restoremathstyle}.
-
-\def\restoremathstyle
- {\ifmmode
- \ifcase\supsubmode
- \textstyle
- \or
- \scriptstyle
- \else
- \scriptscriptstyle
- \fi
- \fi}
+% \newcount\supersubmode
+%
+% \newevery\everysupersub \EverySuperSub
+%
+% \appendtoks \advance\supersubmode\plusone \to \everysupersub
+%
+% \def\super#1{\normalsuperscript{\the\everysupersub#1}}
+% \def\suber#1{\normalsubscript {\the\everysupersub#1}}
+%
+% %D \macros
+% %D {enablesupsub}
+% %D
+% %D We can let \type {^} and \type {_} act like \type {\super}
+% %D and \type {\suber} by saying \type {\enablesupsub}.
+%
+% \bgroup
+% \catcode\circumflexasciicode\activecatcode
+% \catcode\underscoreasciicode\activecatcode
+% \gdef\enablesupsub
+% {\catcode\circumflexasciicode\activecatcode
+% \catcode\underscoreasciicode\activecatcode
+% \def^{\ifmmode\expandafter\super\else\expandafter\normalsuper\fi}%
+% \def_{\ifmmode\expandafter\suber\else\expandafter\normalsuber\fi}}
+% \egroup
+%
+% %D \macros
+% %D {restoremathstyle}
+% %D
+% %D We can pick up the current math style by calling \type
+% %D {\restoremathstyle}.
+%
+% \def\restoremathstyle
+% {\ifmmode
+% \ifcase\supsubmode
+% \textstyle
+% \or
+% \scriptstyle
+% \else
+% \scriptscriptstyle
+% \fi
+% \fi}
%D \macros
%D {cramped}
@@ -236,7 +244,7 @@
{\begingroup % added HH, made even more cramped
\setbox\scratchbox\hbox
{\nulldelimiterspace\zeropoint
- \Ustartmath\mathsurround\zeropoint#1\radical\zerocount{#2}\Ustopmath}%
+ \normalstartimath\mathsurround\zeropoint#1\radical\zerocount{#2}\normalstopimath}%
\ht\scratchbox-\dimexpr
\ifx#1\displaystyle
\fontdimen8\textfont3
@@ -290,4 +298,16 @@
\def\crampedrlap{\mathpalette\docrampedrlap}
\def\crampedclap{\mathpalette\docrampedclap}
+% experiment, not yet to be used
+
+% \def\displaybreak
+% {\ifhmode
+% \removeunwantedspaces
+% \ifcase\raggedstatus\hfill\fi
+% \strut\penalty-9999 % \break fails on case (3)
+% \fi}
+%
+% \def\startdisplay{\displaybreak\ignorespaces\startpacked}
+% \def\stopdisplay {\stoppacked\displaybreak\ignorespaces}
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/supp-mpe.mkii b/Master/texmf-dist/tex/context/base/supp-mpe.mkii
index 67b27919c06..f28176292d6 100644
--- a/Master/texmf-dist/tex/context/base/supp-mpe.mkii
+++ b/Master/texmf-dist/tex/context/base/supp-mpe.mkii
@@ -35,7 +35,7 @@
%D
%D \MPcmykcolorstrue
%D \MPspotcolorstrue
-%D \chardef\makeMPintoPDFobject\plusone
+%D \makeMPintoPDFobject\plusone
%D \stoptyping
\ifx\writestatus\undefined
diff --git a/Master/texmf-dist/tex/context/base/supp-num.tex b/Master/texmf-dist/tex/context/base/supp-num.mkii
index d192ab54836..74234975374 100644
--- a/Master/texmf-dist/tex/context/base/supp-num.tex
+++ b/Master/texmf-dist/tex/context/base/supp-num.mkii
@@ -236,27 +236,6 @@
%D of a digit. Watch the \type {\mathaxisheight} trickery (this
%D font related register stored the math axis).
-% \def\scandigits#1%
-% {\if#1.\doscandigit1\chardef\skipdigit0\else
-% \if#1,\doscandigit2\chardef\skipdigit0\else
-% \if#1@\hphantom{0}\chardef\skipdigit1\else
-% \if#1_\hphantom{0}\chardef\skipdigit1\else
-% \if#1/\digitsgn{\hphantom{+}}\chardef\skipdigit0\else
-% \if#1-\digitsgn-\chardef\skipdigit0\else
-% \if#1+\digitsgn+\chardef\skipdigit0\else
-% \if#1=\digitsgn\zeroamount\chardef\skipdigit0\else
-% \if#1s\digitsgn{\hphantom{\positive}}\chardef\skipdigit0\else
-% \if#1p\digitsgn\positive\chardef\skipdigit0\else
-% \if#1m\digitsgn\negative\chardef\skipdigit0\else
-% \if#1n\digitsgn\negative\chardef\skipdigit0\else
-% #1\chardef\skipdigit0\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
-
-% \def\digitsep#1%
-% {\doscandigit#1\chardef\skipdigit0}
-%
-% \def\digitnop
-% {\hphantom{0}\chardef\skipdigit1}
-
% 0,=
% 0,== second = results in delta(00,=)
% 0,- is invalid, should be =
diff --git a/Master/texmf-dist/tex/context/base/supp-num.mkiv b/Master/texmf-dist/tex/context/base/supp-num.mkiv
new file mode 100644
index 00000000000..68b775403e3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/supp-num.mkiv
@@ -0,0 +1,504 @@
+%D \module
+%D [ file=supp-num,
+%D version=1998.05.15,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Numbers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% See end for transition to mkiv.
+
+\writestatus{loading}{ConTeXt Support Macros / Numbers}
+
+\unprotect
+
+%D \macros
+%D {digits, setdigitmode, setdigitsign}
+%D
+%D Depending on the digit mode the command \type {\digits}
+%D normalizes number patterns depending on the language set.
+%D
+%D \starttyping
+%D This will never be a \digits{1.000.000} seller.
+%D \stoptyping
+%D
+%D or
+%D
+%D \starttyping
+%D I will never grow longer than \digits 1.86 \Meter.
+%D \stoptyping
+%D
+%D The different modes are shown in:
+%D
+%D \startbuffer
+%D \setdigitmode 1 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 2 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 3 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 4 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 5 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 6 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This is typset as:
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+%D
+%D The sign can be typeset as is or within the space of a
+%D digit.
+%D
+%D \startbuffer
+%D \setdigitsign 0 \digits +12.345,90
+%D \setdigitmode 1 \digits +12.345,90
+%D \setdigitmode 2 \digits +12.345,90
+%D \setdigitmode 3 \digits +12.345,90
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This is typset as:
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+\chardef\digitoutputmode=1 % 0..6
+\chardef\digitsignmode =0 % 0..3
+
+\def\setdigitmode{\chardef\digitoutputmode}
+\def\setdigitsign{\chardef\digitsignmode}
+
+%D The digit modes are:
+%D
+%D \startitemize[packed]
+%D \item periods \& comma
+%D \item commas \& period
+%D \item thinmuskips \& comma
+%D \item thinmuskips \& period
+%D \item thickmuskips \& comma
+%D \item thickmuskips \& period
+%D \stopitemize
+
+\let\collecteddigits \empty \chardef\digitinputmode =1
+\let\saveddigits \empty \chardef\skipdigit =0
+\let\savedpowerdigits\empty \chardef\powerdigits =0
+
+%D The first stage of the \type {\digit} macro takes care of
+%D the grouped call, the other branch handles the fuzzy
+%D delimited calls.
+
+\ifx\mbox\undefined \let\mbox\normalhbox \fi
+
+% \unexpanded\def\digits
+% {\bgroup\let~@\doifnextbgroupelse\dodigits\grabdigit}
+
+\unexpanded\def\digits
+ {\bgroup
+ \let~@%
+ \doifnextbgroupelse\dodigits{\doifnextcharelse\normalmathshift\domathdigits\grabdigit}}
+
+\def\dodigits#1%
+ {\grabdigit#1\relax}
+
+\def\domathdigits$#1$%
+ {\mbox{\grabdigit#1\relax}} % adding $ $ goes wrong in tabulate
+
+\def\grabdigit
+ {\futurelet\next\scandigit}
+
+%D Watch the test for \type {\nextobeyedline}, because the
+%D endofline token can be \type {\def'd}, not \type {\let}'d,
+%D we need to do an indirect test (see \type {verb-ini.tex})
+%D for details. (This probably needs an update.)
+
+\ifx\normalmathshift\undefined \let\normalmathshift=$ \fi
+
+\def\scandigit
+ {\ifx\next\blankspace
+ \let\next\handledigits
+ \else\ifx\next\nextobeyedline % the indirect one
+ \let\next\handledigits
+ \else\ifx\next\bgroup
+ \let\next\handledigits
+ \else\ifx\next\egroup
+ \let\next\handledigits
+ \else\ifx\next\normalmathshift
+ \let\next\handledigits
+ \else
+ \let\next\collectdigit
+ \fi\fi\fi\fi\fi
+ \next}
+
+%D We store the power||of||ten (to be signaled by \type {^},
+%D \type {e} or~\type {E}) in a seperate macro so that we can
+%D typeset it in superscript. The space placeholders are
+%D replaced by a \type {@}.
+
+\def\savedigit#1#2%
+ {\edef#1{#1\saveddigits#2}\let\saveddigits\empty}
+
+\long\def\collectdigit#1%
+ {\ifx#1~%
+ \savedigit\collecteddigits @%
+ \else\if#1_% tricky as can be several catcodes ... will become lua code anyway
+ \savedigit\collecteddigits @%
+ \else\if\noexpand#1\relax
+ \let\grabdigit\handledigits
+ \else\ifcase\powerdigits
+ \if#1E%
+ \chardef\powerdigits\plusone
+ \else\if#1e%
+ \chardef\powerdigits\plusone
+ \else\if#1^%
+ \chardef\powerdigits\plusone
+ \else
+ \savedigit\collecteddigits#1%
+ %\doifnumberelse{#1}
+ % {\savedigit\collecteddigits#1}
+ % {\def\saveddigits{#1}}%
+ \fi\fi\fi
+ \else
+ \savedigit\savedpowerdigits#1%
+ %\doifnumberelse{#1}
+ % {\savedigit\savedpowerdigits#1}
+ % {\def\saveddigits{#1}}%
+ \fi\fi\fi\fi
+ \grabdigit}
+
+\let\handlemathdigits\firstofoneargument
+\let\handletextdigits\mathematics
+
+\def\handledigits
+ {%\ifcase\powerdigits
+ % \edef\collecteddigits{\collecteddigits\saveddigits}%
+ %\else
+ % \edef\savedpowerdigits{\savedpowerdigits\saveddigits}%
+ %\fi
+ \ifmmode
+ \handlemathdigits{\dohandledigits}%
+ \else
+ \dontleavehmode\hbox{\handletextdigits{\dohandledigits}}%
+ \fi
+ \egroup}
+
+%D Although we could do with one pass, a second pass for
+%D handling the stored sequence is more readable.
+
+\ifnum\texengine=\luatexengine
+
+ \def\dohandledigits
+ {\mathcode`\,="002C \mathcode`\.="002E % pretty hard coded
+ \expandafter\handletokens\collecteddigits\with\scandigits
+ \ifcase\powerdigits\else\digitpowerseparator^{\savedpowerdigits}\fi}
+
+ \chardef\mathaxisfontid\zerocount
+
+\else
+
+ \def\dohandledigits
+ {\mathcode`\,="013B \mathcode`\.="013A % pretty hard coded
+ \expandafter\handletokens\collecteddigits\with\scandigits
+ \ifcase\powerdigits\else\digitpowerseparator^{\savedpowerdigits}\fi}
+
+ \chardef\mathaxisfontid\plustwo
+
+\fi
+
+\def\doscandigit#1%
+ {\ifcase\skipdigit\@EA\hbox\else\@EA\hphantom\fi\bgroup
+ \mathematics % brr, needed because of stored punctuation
+ {\ifnum\digitinputmode=#1\relax
+ \ifcase\digitoutputmode
+ \or .%
+ \or ,%
+ \or \mskip\thinmuskip
+ \or \mskip\thinmuskip
+ \or \mskip\thickmuskip
+ \or \mskip\thickmuskip
+ \fi
+ \else
+ \ifodd\digitoutputmode,\else.\fi
+ \fi}%
+ \egroup}
+
+%D The signs can be made smaller and sqeezed into the width
+%D of a digit. Watch the \type {\mathaxisheight} trickery (this
+%D font related register stored the math axis).
+
+% 0,=
+% 0,== second = results in delta(00,=)
+% 0,- is invalid, should be =
+% 0,-- is invalid, should be ==
+
+\def\digitzeroamount
+ {\digitsgn\zeroamount
+ \def\digitzeroamount
+ {\hphantom
+ {00\setbox\scratchbox\hbox{$\zeroamount$}%
+ \hskip-\wd\scratchbox}%
+ \let\digitzeroamount\empty}}
+
+\def\scandigits#1%
+ {\if#1.\digitsep1\else
+ \if#1,\digitsep2\else
+ \if#1@\digitnop \else
+ \if#1_\digitnop \else
+ \if#1/\digitsgn{\hphantom{+}}\chardef\skipdigit0\else
+ \if#1-\ifcase\skipdigit\digitsgn-\else
+ \box\digitsepbox\digitzeroamount \fi\chardef\skipdigit0\else
+ \if#1+\digitsgn+\chardef\skipdigit0\else
+ \if#1=\box\digitsepbox\digitzeroamount \chardef\skipdigit0\else
+ \if#1s\digitsgn{\hphantom{\positive}}\chardef\skipdigit0\else
+ \if#1p\digitsgn\positive\chardef\skipdigit0\else
+ \if#1m\digitsgn\negative\chardef\skipdigit0\else
+ \if#1n\digitsgn\negative\chardef\skipdigit0\else
+ \box\digitsepbox #1\chardef\skipdigit0\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+\newbox\digitsepbox \chardef\autodigitmode=1
+
+\def\digitsep#1%
+ {\ifcase\autodigitmode
+ \doscandigit#1%
+ \else
+ \setbox\digitsepbox\hbox{\doscandigit#1}%
+ \fi
+ \chardef\skipdigit0\relax}
+
+% strange, does not work
+%
+% \def\digitnop
+% {\hphantom{\box\digitsepbox}%
+% \hphantom{0}\chardef\skipdigit1\relax}
+%
+% while this works
+
+\def\digitnop
+ {\hbox{\hphantom{\box\digitsepbox}}%
+ \hphantom{0}\chardef\skipdigit1\relax}
+
+% but this doesn't
+%
+% \def\digitnop
+% {\hphantom{\box\digitsepbox0}%
+% \chardef\skipdigit1\relax}
+
+\def\digitsgn#1%
+ {\ifcase\digitsignmode#1\else
+ \hbox
+ {\setbox\scratchbox\hbox{0}%
+ \scratchdimen\mathaxisheight\textfont\mathaxisfontid
+ \def\digitsgn##1##2%
+ {\advance\scratchdimen-\mathaxisheight##1\mathaxisfontid
+ \raise\scratchdimen
+ \hbox to \wd\scratchbox{\hss$##2#1$\hss}}%
+ \ifcase\digitsignmode\or
+ \digitsgn\textfont \textstyle \or
+ \digitsgn\scriptfont \scriptstyle \or
+ \digitsgn\scriptscriptfont\scriptscriptstyle\fi}%
+ \fi}
+
+\ifx\undefined\zeroamount \def\zeroamount{-} \fi
+\ifx\undefined\positive \def\positive {+} \fi
+\ifx\undefined\negative \def\negative {-} \fi
+
+%D The digit parser handles a bunch of special characters as
+%D well as different formats. We strongly suggest you to use
+%D the grouped call.
+%D
+%D \starttabulate[|l|l|l|]
+%D \NC \type{.} \NC , . \NC comma or period \NC \NR
+%D \NC \type{,} \NC , . \NC comma or period \NC \NR
+%D \NC \type{@} \NC \NC invisible space \NC \NR
+%D \NC \type{_} \NC \NC invisible space \NC \NR
+%D \NC \type{/} \NC \NC invisible sign \NC \NR
+%D \NC \type{-} \NC $-$ \NC minus sign \NC \NR
+%D \NC \type{+} \NC $+$ \NC plus sign \NC \NR
+%D \NC \type{s} \NC \NC invisible high sign \NC \NR
+%D \NC \type{p} \NC $\positive$ \NC high plus sign \NC \NR
+%D \NC \type{m} \NC $\negative$ \NC high minus sign \NC \NR
+%D \NC \type{n} \NC $\negative$ \NC high minus (negative) sign \NC \NR
+%D \NC \type{=} \NC $\zeroamount$ \NC zero padding \NC \NR
+%D \stoptabulate
+%D
+%D These triggers are used in the following examples.
+%D
+%D \startbuffer
+%D \digits 12
+%D \digits{~~~.~~~.~~~.68.712,34}
+%D \digits ~~~.~~~.~~~.68.712,34
+%D \digits ___.___.111.68.712,34
+%D \digits 111.111.111.68.712,34
+%D \digits 12.345,90
+%D \digits 12.345.000
+%D \digits 12,34
+%D \digits{392.857.230.68.712,34}
+%D {\digits1234}
+%D \digits{1234}
+%D \digits 1234\relax
+%D $\digits 123.222,00$
+%D \digits 123.222,00
+%D \digits 123.222,==
+%D \digits 123.222,00^10
+%D \digits 123.222,00e10
+%D \digits /123.222,00e-12
+%D \digits -123.222,00e-12
+%D \digits +123.222,00e-12
+%D \digits n123.222,00e-12
+%D \digits s123.222,00e-12
+%D \digits p123.222,00e-12
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlines
+%D \getbuffer
+%D \stoplines
+
+%D \macros
+%D {Digits}
+%D
+%D We also permit:
+
+\let\Digits\digits
+
+%D These macros are complicated by the fact that we also
+%D have to support cases like:
+%D
+%D \starttyping
+%D {\digits1234}
+%D \digits{1234}
+%D \digits 1234\whatever
+%D $\digits 123.222,00$
+%D \digits 123.222,00.
+%D \stoptyping
+%D
+%D The latter case shows us that trailing non digits are to
+%D be passed untreated.
+%D
+%D Another interesting case is:
+%D
+%D \starttyping
+%D \digits 123.222,00^10
+%D \stoptyping
+%D
+%D The separator is defined as:
+
+% \def\digitpowerseparator%
+% {\cdot10} % {\times10}
+
+\def\digitpowerseparator
+ {\ifx\collecteddigits\empty\else\cdot\fi10}
+
+%D \macros
+%D {digittemplate}
+%D
+%D Users can specify the way they enter those digits by saying
+%D something like:
+%D
+%D \starttyping
+%D \digittemplate 12.000.000,00 % \digittemplate .,
+%D \stoptyping
+
+\def\digittemplate #1 %
+ {\chardef\digitinputmode\zerocount
+ \handletokens#1\with\scandigittemplate}
+
+\def\scandigittemplate#1%
+ {\if #1.\ifcase\digitinputmode\chardef\digitinputmode\plusone \fi% period
+ \else\if#1,\ifcase\digitinputmode\chardef\digitinputmode\plustwo \fi% comma
+ \fi\fi}
+
+\protect \endinput
+
+
+\endinput
+
+\def\digitszeropadding {\zeroamount}
+\def\digitsnegative {\mathematics\negative}
+\def\digitspositive {\mathematics\positive}
+\def\digitsspace {\hphantom{0}}
+\def\digitsseparatorspace{\hphantom{.}}
+\def\digitssignspace {\hphantom{+}}
+\def\digitshighspace {\hphantom{\mathematics\positive}}
+\def\digitspower {\high}
+
+\starttext
+
+% print(table.serialize(table.keys(jobs)))
+
+local P, S, R, Cs = lpeg.P, lpeg.S, lpeg.R, lpeg.Cs
+
+local done = false
+local swap = false
+local digit = R("09")
+local sign = S("+-")
+local power = S("^e")
+local space = S(" ~@_")
+local comma = P(",")
+local period = P(".")
+local signspace = P("/")
+local positive = P("p")
+local negative = P("n")
+local highspace = P("s")
+local padding = P("=")
+
+local space = space / "\\digitsspace"
+local digit = digit / function(s) done = true return s end
+local separator = comma / function(s) if not done then return "\\digitsseparatorspace" elseif swap then return "." else return "," end end
+ + period / function(s) if not done then return "\\digitsseparatorspace" elseif swap then return "," else return "." end end
+local signspace = signspace / "\\digitssignspace"
+local positive = positive / "\\digitspositive"
+local negative = negative / "\\digitsnegative"
+local highspace = highspace / "\\digitshighspace"
+local power = power/"" * (Cs((sign + signspace)^0 * digit^1) / function(s) return "\\digitspower{" .. s .. "}" end)
+local padding = padding / "\\digitszeropadding"
+
+local replace = lpeg.Cs (
+ (sign + signspace + positive + negative + highspace)^0
+ * (separator^0 * (space + digit)^1)^1
+ * power^0
+)
+
+local function digits(str)
+ done = false
+--~ swap = true
+ local str = lpeg.match(replace,str)
+-- print(str)
+ tex.sprint(tex.ctxcatcodes,"\\dontleavehmode",str,"\\par")
+end
+-- namespaces.register("digits")
+
+digits("12")
+digits("~~~.~~~.~~~.68.712,34")
+digits("~~~.~~~.~~~.68.712,34")
+digits("___.___.111.68.712,34")
+digits("111.111.111.68.712,34")
+digits("12.345,90")
+digits("12.345.000")
+digits("12,34")
+digits("392.857.230.68.712,34")
+digits("1234")
+digits("123.222,00")
+digits("123.222,==")
+digits("123.222,00^10")
+digits("123.222,00e10")
+digits("/123.222,00e-12")
+digits("-123.222,00e-12")
+-- digits("+123.222,00e-12")
+digits("n123.222,00e-12")
+digits("s123.222,00e-12")
+digits("p123.222,00e/12")
+
+\stopluacode
+[[\digitsseparatorspace]]
+\stoptext
+
+
diff --git a/Master/texmf-dist/tex/context/base/supp-pat.mkii b/Master/texmf-dist/tex/context/base/supp-pat.mkii
index d910830766b..8cd4dd072d8 100644
--- a/Master/texmf-dist/tex/context/base/supp-pat.mkii
+++ b/Master/texmf-dist/tex/context/base/supp-pat.mkii
@@ -31,17 +31,13 @@
%D is meant as an experiment.
\ifx\writestatus\undefined \else
-
\writestatus{loading}{ConTeXt Support Macros / Patterns}
-
\fi
%D \CONTEXT:
\ifx\startmapping\undefined \else \ifx\startencoding\undefined \else
-
\def\fetchpatterntoken#1{\csname#1\endcsname}
-
\fi \fi
%D First we define the \ETEX\ variant. We cannot do that inside
diff --git a/Master/texmf-dist/tex/context/base/supp-pdf.mkii b/Master/texmf-dist/tex/context/base/supp-pdf.mkii
index c54b0c6bc25..4d3619d4b8b 100644
--- a/Master/texmf-dist/tex/context/base/supp-pdf.mkii
+++ b/Master/texmf-dist/tex/context/base/supp-pdf.mkii
@@ -2020,7 +2020,7 @@
%D The last object number used is avaliable in the macro
%D \type {\lastPDFMPobject}.
-\ifx\makeMPintoPDFobject\undefined \chardef\makeMPintoPDFobject=0 \fi
+\ifx\makeMPintoPDFobject\undefined \newcount\makeMPintoPDFobject \fi
\def\lastPDFMPobject{0}
@@ -2096,17 +2096,17 @@
\def\dopackageMPgraphic#1% #1 = boxregister
{%\ifx\pdfxform\undefined
- % \chardef\makeMPintoPDFobject0 % no pdftex at all
+ % \makeMPintoPDFobject0 % no pdftex at all
%\else\ifx\pdftexversion\undefined
- % \chardef\makeMPintoPDFobject0 % no pdftex at all
+ % \makeMPintoPDFobject0 % no pdftex at all
%\else\ifnum\pdftexversion<14
- % \chardef\makeMPintoPDFobject0 % no resource support
+ % \makeMPintoPDFobject0 % no resource support
%\else
% % keep the default value
%\fi\fi\fi
\ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else
% an existing value of 2 signals object support (set elsewhere)
- \chardef\makeMPintoPDFobject1
+ \makeMPintoPDFobject1
\fi\fi
\ifcase\makeMPintoPDFobject
\box#1%
diff --git a/Master/texmf-dist/tex/context/base/supp-ran.lua b/Master/texmf-dist/tex/context/base/supp-ran.lua
index fe635fc7f9e..accd5c94c15 100644
--- a/Master/texmf-dist/tex/context/base/supp-ran.lua
+++ b/Master/texmf-dist/tex/context/base/supp-ran.lua
@@ -9,18 +9,25 @@ if not modules then modules = { } end modules ['supp-ran'] = {
-- We cannot ask for the current seed, so we need some messy hack
-- here.
+local report_system = logs.reporter("system","randomizer")
+
commands = commands or { }
+local commands = commands
+local math = math
local random, randomseed, round, seed, last = math.random, math.randomseed, math.round, false, 1
local texwrite = tex.write
function math.setrandomseedi(n,comment)
+ if not n then
+--~ n = 0.5 -- hack
+ end
if n <= 1 then
n = n*1073741823 -- maxcount
end
n = round(n)
if false then
- logs.report("system","setting random seed to %s (%s)",n,comment or "normal")
+ report_system("setting seed to %s (%s)",n,comment or "normal")
end
randomseed(n)
last = random(0,1073741823) -- we need an initial value
diff --git a/Master/texmf-dist/tex/context/base/supp-ran.mkiv b/Master/texmf-dist/tex/context/base/supp-ran.mkiv
index 9d429598f15..500170ab0f9 100644
--- a/Master/texmf-dist/tex/context/base/supp-ran.mkiv
+++ b/Master/texmf-dist/tex/context/base/supp-ran.mkiv
@@ -18,13 +18,13 @@
\registerctxluafile{supp-ran}{1.001}
-\def\getrandomcount #1#2#3{#1=\ctxlua{commands.getrandomcounta(\number#2,\number#3)}}
-\def\getrandomdimen #1#2#3{#1=\ctxlua{commands.getrandomcounta(\number\dimexpr#2,\number\dimexpr#3)}\scaledpoint}
-\def\getrandomnumber#1#2#3{\edef#1{\ctxlua{commands.getrandomcounta(\number#2,\number#3)}}}
-\def\getrandomfloat #1#2#3{\edef#1{\ctxlua{commands.getrandomcountb(\number\dimexpr#2\points,\number\dimexpr#3\points)}}}
-\def\setrandomseed #1{\ctxlua{commands.setrandomseed(\number#1)}}
-\def\getrandomseed {\ctxlua{commands.getrandomseed()}}
-\def\freezerandomseed {\ctxlua{commands.freezerandomseed()}}
-\def\defrostrandomseed {\ctxlua{commands.defrostrandomseed()}}
+\def\getrandomcount #1#2#3{#1=\ctxcommand{getrandomcounta(\number#2,\number#3)}}
+\def\getrandomdimen #1#2#3{#1=\ctxcommand{getrandomcounta(\number\dimexpr#2,\number\dimexpr#3)}\scaledpoint}
+\def\getrandomnumber#1#2#3{\edef#1{\ctxcommand{getrandomcounta(\number#2,\number#3)}}}
+\def\getrandomfloat #1#2#3{\edef#1{\ctxcommand{getrandomcountb(\number\dimexpr#2\points,\number\dimexpr#3\points)}}}
+\def\setrandomseed #1{\ctxcommand{setrandomseed(\number#1)}}
+\def\getrandomseed #1{\edef#1{\ctxcommand{getrandomseed()}}}
+\def\freezerandomseed {\ctxcommand{freezerandomseed()}}
+\def\defrostrandomseed {\ctxcommand{defrostrandomseed()}}
\endinput
diff --git a/Master/texmf-dist/tex/context/base/supp-vis.tex b/Master/texmf-dist/tex/context/base/supp-vis.mkii
index f38c8e1e353..f38c8e1e353 100644
--- a/Master/texmf-dist/tex/context/base/supp-vis.tex
+++ b/Master/texmf-dist/tex/context/base/supp-vis.mkii
diff --git a/Master/texmf-dist/tex/context/base/supp-vis.mkiv b/Master/texmf-dist/tex/context/base/supp-vis.mkiv
new file mode 100644
index 00000000000..f38c8e1e353
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/supp-vis.mkiv
@@ -0,0 +1,1907 @@
+%D \module
+%D [ file=supp-vis,
+%D version=1996.10.21,
+%D title=\CONTEXT\ Support Macros,
+%D subtitle=Visualization,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% no longer generic, who cares ...
+
+%D \gdef\ShowBufferedExample% private typeseting macro
+%D {\startlinecorrection
+%D \bgroup
+%D \setuptyping[margin=0pt,option=color]
+%D \showmakeup
+%D \centeredvcuetrue
+%D \dontinterfere
+%D \baselinerulefalse
+%D \normalvbox
+%D {\normalhbox to \hsize
+%D {$\hsize=.5\hsize
+%D \advance\hsize by -.5em
+%D \normalvcenter{\vbox{\getbuffer}}\normalhss
+%D \normalvcenter{\vbox{\dontshowcomposition\typebuffer}}$}}
+%D \egroup
+%D \stoplinecorrection}
+%D
+%D \gdef\ShowBufferedExampleBox% private typeseting macro
+%D {\startlinecorrection
+%D \bgroup
+%D \setuptyping[margin=0pt,option=color]
+%D \showmakeup
+%D \centeredvcuetrue
+%D \dontinterfere
+%D \baselinerulefalse
+%D \normalvbox
+%D {\normalhbox to \hsize
+%D {$\hsize=.5\hsize
+%D \advance\hsize by -.5em
+%D \normalvcenter{\baselineruletrue\vbox{\getbuffer}}\normalhss
+%D \normalvcenter{\vbox{\dontshowcomposition\typebuffer}}$}}
+%D \egroup
+%D \stoplinecorrection}
+
+%D Although an integral part of \CONTEXT, this module is one
+%D of the support modules. Its stand alone character permits
+%D use in \PLAIN\ \TEX\ or \TEX\ based macropackages.
+%D \ifCONTEXT \else If in some examples the verbatim listings
+%D don't show up nice, this is due to processing by a system
+%D that does not support buffering. In \CONTEXT\ we show the
+%D commands in the margin, use bit more advanced way of
+%D numbering, and typeset the source in \TEX nicolored
+%D verbatim. Sorry for this inconvenience.\fi
+%D
+%D Depending on my personal needs and those of whoever uses it,
+%D the macros will be improved in terms of visualization,
+%D efficiency and compatibility. These rather low level
+%D visualization macros are supplemented by ones that can
+%D visualize baselines, the page layout and whatever deserves
+%D attention. Most of those macros can be found in \type
+%D {core-vis} and other core modules. Their integration in
+%D \CONTEXT\ prohibits generic applications.
+
+\ifx \undefined \writestatus \input supp-mis.tex \fi
+
+%D One of the strong points of \TEX\ is abstraction of textual
+%D input. When macros are defined well and do what we
+%D want them to do, we will seldom need the tools present in
+%D What You See Is What You Get systems. For instance, when
+%D entering text we don't need rulers, because no manual
+%D shifting and/or alignment of text is needed. On the other
+%D hand, when we are designing macros or specifying layout
+%D elements, some insight in \TEX's advanced spacing, kerning,
+%D filling, boxing and punishment abilities will be handy.
+%D That's why we've implemented a mechanism that shows some of
+%D the inner secrets of \TEX.
+
+\writestatus{loading}{ConTeXt Support Macros / Visualization}
+
+%D In this module we are going to redefine some \TEX\
+%D primitives and \PLAIN\ macro's. Their original meaning is
+%D saved in macros with corresponding names, preceded by
+%D \type{normal}. These original macros are (1)~used to
+%D temporary restore the old values when needed and
+%D (2)~used to prevent recursive calls in the macros that
+%D replace them.
+
+\unprotect
+
+\let\visualvrule\vrule
+\let\visualhrule\hrule
+
+%D \macros
+%D {dontinterfere}
+%D
+%D Indentation, left and/or right skips, redefinition of
+%D \type{\par} and assignments to \type{\everypar} can lead to
+%D unwanted results. We can therefore turn all those things
+%D off with \type{\dontinterfere}.
+
+\def\dontinterfere
+ {\everypar \emptytoks
+ \let\par \endgraf
+ \parindent\zeropoint
+ \parskip \zeropoint
+ \leftskip \zeropoint
+ \rightskip\zeropoint
+ \relax}
+
+%D \macros
+%D {dontcomplain}
+%D
+%D In this module we do a lot of box manipulations. Because we
+%D don't want to be confronted with to many over- and underfull
+%D messages we introduce \type{\dontcomplain}.
+
+\def\dontcomplain
+ {\hbadness\!!tenthousand \vbadness\hbadness
+ \hfuzz \maxdimen \vfuzz \hfuzz}
+
+% This obsolete dutch name is sometimes uses in manual styles; when
+% cleaning up the codebase I decided to move this definition here.
+
+\let\mindermeldingen\dontcomplain
+
+%D \macros
+%D {normaloffinterlineskip}
+%D
+%D The next hack is needed because in \CONTEXT\ we redefine
+%D \type{\offinterlineskip}.
+
+\ifx\undefined\normaloffinterlineskip
+ \let\normaloffinterlineskip\offinterlineskip
+\fi
+
+%D \macros
+%D {normalhbox,
+%D normalvbox,normalvtop}
+%D
+%D There are three types of boxes, one horizontal and two
+%D vertical in nature. As we will see later on, all three types
+%D are to be handled according to their orientation and
+%D baseline behavior. Especially \type{\vtop}'s need our
+%D special attention.
+
+% already saved
+
+%D \macros
+%D {normalhskip,
+%D normalvskip}
+%D
+%D Next come the flexible skips, which come in two flavors
+%D too. Like boxes these are handled with \TEX\ primitives.
+
+% already saved
+
+%D \macros
+%D {normalpenalty,
+%D normalkern}
+%D
+%D Both penalties and kerns are taken care of by mode sensitive
+%D primitives. This means that when making them visible, we
+%D have to take the current mode into account.
+
+% already saved
+
+%D \macros
+%D {normalhglue,
+%D normalvglue}
+%D
+%D Glues on the other hand are macro's defined in \PLAIN\ \TEX.
+%D As we will see, their definitions make the implementation of
+%D their visible counterparts a bit more \TeX{}nical.
+
+\let\normalhglue = \hglue
+\let\normalvglue = \vglue
+
+%D \macros
+%D {normalmkern,
+%D normalmskip}
+%D
+%D Math mode has its own spacing primitives, preceded by
+%D \type{m}. Due to the relation with the current font and the
+%D way math is typeset, their unit \type{mu} is not compatible
+%D with other dimensions. As a result, the visual appearance
+%D of these primitives is kept primitive too.
+
+% already saved
+
+%D \macros
+%D {hfilneg,
+%D vfilneg}
+%D
+%D Fills can be made visible quite easy. We only need some
+%D additional negation macros. Because \PLAIN\ \TEX\ only
+%D offers \type{\hfilneg} and \type{\vfilneg}, we define our
+%D own alternative double \type{ll}'ed ones.
+
+\def\hfilneg {\normalhskip\zeropoint \!!plus-1fil\relax}
+\def\vfilneg {\normalvskip\zeropoint \!!plus-1fil\relax}
+\def\hfillneg {\normalhskip\zeropoint \!!plus-1fill\relax}
+\def\vfillneg {\normalvskip\zeropoint \!!plus-1fill\relax}
+\def\hfilllneg{\normalhskip\zeropoint \!!plus-1filll\relax}
+\def\vfilllneg{\normalvskip\zeropoint \!!plus-1filll\relax}
+
+%D \macros
+%D {normalhss,normalhfil,normalhfill,
+%D normalvss,normalvfil,normalvfill}
+%D
+%D The positive stretch primitives are used independant and in
+%D combination with \type{\leaders}.
+
+% already saved
+
+%D \macros
+%D {normalhfilneg,normalhfillneg,
+%D normalvfilneg,normalvfillneg}
+%D
+%D Keep in mind that both \type{\hfillneg} and \type{\vfillneg}
+%D are not part of \PLAIN\ \TEX\ and therefore not documented
+%D in standard \TEX\ documentation. They can nevertheless be
+%D used at will.
+
+\let\normalhfillneg = \hfillneg
+\let\normalvfillneg = \vfillneg
+
+%D Visualization is not always wanted. Instead of turning this
+%D option off in those (unpredictable) situations, we just
+%D redefine a few \PLAIN\ macros.
+
+\ifx\tlap\undefined
+
+ \def\rlap#1{\normalhbox to \zeropoint{#1\normalhss}}
+ \def\llap#1{\normalhbox to \zeropoint{\normalhss#1}}
+ \def\blap#1{\normalvbox to \zeropoint{#1\normalvss}}
+ \def\tlap#1{\normalvbox to \zeropoint{\normalvss#1}}
+
+\fi
+
+\ifx\contextversion\undefined \def~{\normalpenalty\!!tenthousand\ } \fi
+
+%D \macros
+%D {makeruledbox}
+%D
+%D Ruled boxes can be typeset is many ways. Here we present
+%D just one alternative. This implementation may be a little
+%D complicated, but it supports all three kind of boxes. The
+%D next command expects a \BOX\ specification, like:
+%D
+%D \starttyping
+%D \makeruledbox0
+%D \stoptyping
+
+%D \macros
+%D {baselinerule,baselinefill}
+%D
+%D We can make the baseline of a box visible, both dashed and
+%D as a rule. The line is drawn on top of the baseline. All
+%D we have to say is:
+%D
+%D \starttyping
+%D \baselineruletrue
+%D \baselinefilltrue
+%D \stoptyping
+%D
+%D At the cost of some overhead these alternatives are
+%D implemented using \type{\if}'s:
+
+\newif\ifbaselinerule \baselineruletrue
+\newif\ifbaselinefill \baselinefillfalse
+
+%D \macros
+%D {iftoprule,ifbottomrule,ifleftrule,ifrightrule}
+%D
+%D Rules can be turned on and off, but by default we have:
+%D
+%D \starttyping
+%D \topruletrue
+%D \bottomruletrue
+%D \leftruletrue
+%D \rightruletrue
+%D \stoptyping
+%D
+%D As we see below:
+
+\newif\iftoprule \topruletrue
+\newif\ifbottomrule \bottomruletrue
+\newif\ifleftrule \leftruletrue
+\newif\ifrightrule \rightruletrue
+
+%D \macros
+%D {boxrulewidth}
+%D
+%D The width in the surrounding rules can be specified by
+%D assigning an apropriate value to the dimension used. This
+%D module defaults the width to:
+%D
+%D \starttyping
+%D \boxrulewidth=.2pt
+%D \stoptyping
+%D
+%D Although we are already low on \DIMENSIONS\ it's best to
+%D spend one here, mainly because it enables easy manipulation,
+%D like multiplication by a given factor.
+
+\newdimen\boxrulewidth \boxrulewidth=.2pt
+
+%D The core macro \type{\makeruledbox} looks a bit hefty. The
+%D manipulation at the end is needed because we want to
+%D preserve both the mode and the baseline. This means that
+%D \type{\vtop}'s and \type{\vbox}'es behave the way we expect
+%D them to do.
+%D
+%D \startlinecorrection
+%D \hbox
+%D {\ruledhbox to 5em{\strut test\normalhss}\hskip1em
+%D \ruledvbox{\hsize 5em\strut test \par test\strut}\hskip1em
+%D \ruledvtop{\hsize 5em\strut test \par test\strut}}
+%D \stoplinecorrection
+%D
+%D The \type{\cleaders} part of the macro is responsible for
+%D the visual baseline. The \type{\normalhfill} belongs to this
+%D primitive too. By storing and restoring the height and depth
+%D of box \type{#1}, we preserve the mode.
+
+\let\dowithruledbox\relax
+
+\let\ruledheight\!!zeropoint
+\let\ruleddepth \!!zeropoint
+\let\ruledwidth \!!zeropoint
+
+\def\makeruledbox#1%
+ {\edef\ruledheight{\the\ht#1}%
+ \edef\ruleddepth {\the\dp#1}%
+ \edef\ruledwidth {\the\wd#1}%
+ \setbox\scratchbox\normalvbox
+ {\dontcomplain
+ \normaloffinterlineskip
+ \visualhrule
+ \!!height\boxrulewidth
+ \iftoprule\else\!!width\zeropoint\fi
+ \normalvskip-\boxrulewidth
+ \normalhbox to \ruledwidth
+ {\visualvrule
+ \!!height\ruledheight
+ \!!depth\ruleddepth
+ \!!width\ifleftrule\else0\fi\boxrulewidth
+ \ifdim\ruledheight>\zeropoint \else \baselinerulefalse \fi
+ \ifdim\ruleddepth>\zeropoint \else \baselinerulefalse \fi
+ \ifbaselinerule
+ \ifdim\ruledwidth<20\boxrulewidth
+ \baselinefilltrue
+ \fi
+ \cleaders
+ \ifbaselinefill
+ \visualhrule
+ \!!height\boxrulewidth
+ \else
+ \normalhbox
+ {\normalhskip2.5\boxrulewidth
+ \visualvrule
+ \!!height\boxrulewidth
+ \!!width5\boxrulewidth
+ \normalhskip2.5\boxrulewidth}%
+ \fi
+ \fi
+ \normalhfill
+ \visualvrule
+ \!!width\ifrightrule\else0\fi\boxrulewidth}%
+ \normalvskip-\boxrulewidth
+ \visualhrule
+ \!!height\boxrulewidth
+ \ifbottomrule\else\!!width\zeropoint\fi}%
+ \wd#1\zeropoint
+ \setbox#1=\ifhbox#1\normalhbox\else\normalvbox\fi
+ {\normalhbox
+ {\box#1%
+ \lower\ruleddepth\normalhbox{\dowithruledbox{\box\scratchbox}}}}%
+ \ht#1=\ruledheight
+ \wd#1=\ruledwidth
+ \dp#1=\ruleddepth}
+
+%D Just in case one didn't notice: the rules are in fact layed
+%D over the box. This way the contents of a box cannot
+%D visually interfere with the rules around (upon) it. A more
+%D advanced version of ruled boxes can be found in one of the
+%D core modules of \CONTEXT. There we take offsets, color,
+%D rounded corners, backgrounds and alignment into account too.
+
+%D \macros
+%D {ruledhbox,
+%D ruledvbox,ruledvtop,
+%D ruledvcenter}
+%D
+%D These macro's can be used instead of \type{\hbox},
+%D \type{\vbox}, \type{\vtop} and, when in math mode,
+%D \type{\vcenter}. They just do what their names state. Using
+%D an auxiliary macro would save us a few words of memory, but
+%D it would make their appearance even more obscure.
+%D
+%D \startbuffer
+%D \hbox
+%D {\strut
+%D one
+%D two
+%D \hbox{three}
+%D four
+%D five}
+%D \stopbuffer
+%D
+%D \ShowBufferedExampleBox
+
+\unexpanded\def\ruledhbox
+ {\normalhbox\bgroup
+ \dowithnextbox{\makeruledbox\nextbox\box\nextbox\egroup}%
+ \normalhbox}
+
+%D \startbuffer
+%D \vbox
+%D {\strut
+%D first line \par
+%D second line \par
+%D third line \par
+%D fourth line \par
+%D fifth line
+%D \strut }
+%D \stopbuffer
+%D
+%D \ShowBufferedExampleBox
+
+\unexpanded\def\ruledvbox
+ {\normalvbox\bgroup
+ \dowithnextbox{\makeruledbox\nextbox\box\nextbox\egroup}%
+ \normalvbox}
+
+%D \startbuffer
+%D \vtop
+%D {\strut
+%D first line \par
+%D second line \par
+%D third line \par
+%D fourth line \par
+%D fifth line
+%D \strut }
+%D \stopbuffer
+%D
+%D \ShowBufferedExampleBox
+
+\unexpanded\def\ruledvtop
+ {\normalvtop\bgroup
+ \dowithnextbox{\makeruledbox\nextbox\box\nextbox\egroup}%
+ \normalvtop}
+
+%D \startbuffer
+%D \hbox
+%D {$\vcenter{\hsize.2\hsize
+%D alfa \par beta}$
+%D $\vcenter to 3cm{\hsize.2\hsize
+%D alfa \par beta \par gamma}$
+%D $\vcenter{\hsize.2\hsize
+%D alfa \par beta}$}
+%D \stopbuffer
+%D
+%D \ShowBufferedExampleBox
+
+\unexpanded\def\ruledvcenter
+ {\normalvbox\bgroup
+ \dontinterfere
+ \dowithnextbox
+ {\scratchdimen.5\ht\nextbox
+ \advance\scratchdimen .5\dp\nextbox
+ \ht\nextbox\scratchdimen
+ \dp\nextbox\scratchdimen
+ \ruledhbox{\box\nextbox}%
+ \egroup}%
+ \normalvbox}
+
+%D \macros
+%D {ruledbox,
+%D setruledbox}
+%D
+%D Of the next two macros the first can be used to precede a
+%D box of ones own choice. One can for instance prefix boxes
+%D with \type{\ruledbox} and afterwards --- when the macro
+%D satisfy the needs --- let it to \type{\relax}.
+%D
+%D \starttyping
+%D \ruledbox\hbox{What rules do you mean?}
+%D \stoptyping
+%D
+%D The macro \type{\setruledbox} can be used to directly
+%D rule a box.
+%D
+%D \starttyping
+%D \setruledbox12=\hbox{Who's talking about rules here?}
+%D \stoptyping
+%D
+%D At the cost of some extra macros we can implement a
+%D variant that does not need the~\type{=}, but we stick to:
+
+\unexpanded\def\ruledbox
+ {\dowithnextbox{\makeruledbox\nextbox\box\nextbox}}
+
+\def\setruledbox#1=%
+ {\dowithnextbox{\makeruledbox\nextbox\setbox#1\nextbox}}
+
+%D \macros
+%D {investigateskip,
+%D investigatecount,
+%D investigatemuskip}
+%D
+%D Before we meet the visualizing macro's, we first implement
+%D ourselves some handy utility ones. Just for the sake of
+%D efficiency and readability, we introduce some status
+%D variables, that tell us a bit more about the registers we
+%D use:
+%D
+%D \starttyping
+%D \ifflexible
+%D \ifzero
+%D \ifnegative
+%D \ifpositive
+%D \stoptyping
+%D
+%D These status variables are set when we call for one of the
+%D investigation macros, e.g.
+%D
+%D \starttyping
+%D \investigateskip\scratchskip
+%D \stoptyping
+%D
+%D We use some dirty trick to check stretchability of \SKIPS.
+%D Users of these macros are invited to study their exact
+%D behavior first. The positive and negative states both
+%D include zero and are in fact non-negative ($\geq0$) and
+%D non-positive ($\leq0$) .
+
+\newif\ifflexible
+\newif\ifzero
+\newif\ifnegative
+\newif\ifpositive
+
+\def\investigateskip#1%
+ {\relax
+ \scratchdimen#1\relax
+ \edef\!!stringa{\the\scratchdimen}%
+ \edef\!!stringb{\the#1}%
+ \ifx\!!stringa\!!stringb \flexiblefalse \else \flexibletrue \fi
+ \ifdim#1=\zeropoint\relax
+ \zerotrue \else
+ \zerofalse \fi
+ \ifdim#1<\zeropoint\relax
+ \positivefalse \else
+ \positivetrue \fi
+ \ifdim#1>\zeropoint\relax
+ \negativefalse \else
+ \negativetrue \fi}
+
+% etex
+%
+% \def\investigateskip#1%
+% {\relax
+% \ifdim\scratchskip=\zeropoint
+% \ifdim\gluestretch\scratchskip=\zeropoint
+% \ifdim\glueshrink\scratchskip=\zeropoint
+% \flexiblefalse
+% \else
+% \flexibletrue
+% \fi
+% \else
+% \flexibletrue
+% \fi
+% \else
+% \flexibletrue
+% \fi
+% \ifdim#1=\zeropoint\relax
+% \zerotrue \else
+% \zerofalse \fi
+% \ifdim#1<\zeropoint\relax
+% \positivefalse \else
+% \positivetrue \fi
+% \ifdim#1>\zeropoint\relax
+% \negativefalse \else
+% \negativetrue \fi}
+
+\def\investigatecount#1%
+ {\relax
+ \flexiblefalse
+ \ifnum#1=\zerocount
+ \zerotrue \else
+ \zerofalse \fi
+ \ifnum#1<\zerocount
+ \positivefalse \else
+ \positivetrue \fi
+ \ifnum#1>\zerocount
+ \negativefalse \else
+ \negativetrue \fi}
+
+\def\investigatemuskip#1%
+ {\relax
+ \edef\!!stringa{\the\scratchmuskip}%
+ \edef\!!stringb{0mu}%
+ \def\!!stringc##1##2\\{##1}%
+ \expandafter\edef\expandafter\!!stringc\expandafter
+ {\expandafter\!!stringc\!!stringa\\}%
+ \edef\!!stringd{-}%
+ \flexiblefalse
+ \ifx\!!stringa\!!stringb
+ \zerotrue
+ \negativefalse
+ \positivefalse
+ \else
+ \zerofalse
+ \ifx\!!stringc\!!stringd
+ \positivefalse
+ \negativetrue
+ \else
+ \positivetrue
+ \negativefalse
+ \fi
+ \fi}
+
+%D Now the neccessary utility macros are defined, we can make a
+%D start with the visualizing ones. The implementation of these
+%D macros is a compromise between readability, efficiency of
+%D coding and processing speed. Sometimes we do in steps what
+%D could have been done in combination, sometimes we use a few
+%D boxes more or less then actually needed, and more than once
+%D one can find the same piece of rule drawing code twice.
+
+%D \macros
+%D {ifcenteredvcue,normalvcue}
+%D
+%D Depending on the context, one can force visual vertical cues
+%D being centered along \type{\hsize} or being put at the
+%D current position. Although centering often looks better,
+%D we've chosen the second alternative as default. The main
+%D reason for doing so is that often when we don't set the
+%D \type{\hsize} ourselves, \TEX\ takes the value of the
+%D surrounding box. As a result the visual cues can migrate
+%D outside the current context.
+%D
+%D This behavior is accomplished by a small but effective
+%D auxiliary macro, which behavior can be influenced by the
+%D boolean \type{\centeredvcue}. By saying
+%D
+%D \starttyping
+%D \centeredvcuetrue
+%D \stoptyping
+%D
+%D one turns centering on. As said, we turn it off.
+
+\newif\ifcenteredvcue \centeredvcuefalse
+
+\def\normalvcue#1%
+ {\normalhbox \ifcenteredvcue to \hsize \fi {\normalhss#1\normalhss}}
+
+%D We could have used the more robust version
+%D
+%D \starttyping
+%D \def\normalvcue%
+%D {\normalhbox \ifcenteredvcue to \hsize \fi
+%D \bgroup\bgroup\normalhss
+%D \aftergroup\normalhss\aftergroup\egroup
+%D \let\next=}
+%D \stoptyping
+%D
+%D or the probably best one:
+%D
+%D \starttyping
+%D \def\normalvcue%
+%D {\hbox \ifcenteredvcue to \hsize
+%D \bgroup\bgroup\normalhss
+%D \aftergroup\normalhss\aftergroup\egroup
+%D \else
+%D \bgroup
+%D \fi
+%D \let\next=}
+%D \stoptyping
+%D
+%D Because we don't have to preserve \CATCODES\ and only use
+%D small arguments, we stick to the first alternative.
+
+%D \macros
+%D {testrulewidth}
+%D
+%D We build our visual cues out of rules. At the cost of a much
+%D bigger \DVI\ file, this is to be prefered over using
+%D characters (1)~because we cannot be sure of their
+%D availability and (2)~because their dimensions are fixed.
+%D
+%D As with ruled boxes, we use a \DIMENSION\ to specify the
+%D width of the ruled elements. This dimension defaults to:
+%D
+%D \starttyping
+%D \testrulewidth=\boxrulewidth
+%D \stoptyping
+%D
+%D Because we prefer whole numbers for specifying the
+%D dimensions, we often use even multiples of
+%D \type{\testrulewidth}.
+
+%D \macros
+%D {visiblestretch}
+%D
+%D A second variable is introduced because of the stretch
+%D components of \SKIPS. At the cost of some accuracy we can
+%D make this stretch visible.
+%D
+%D \starttyping
+%D \visiblestretchtrue
+%D \stoptyping
+
+\newdimen\testrulewidth \testrulewidth=\boxrulewidth
+\newif\ifvisiblestretch \visiblestretchfalse
+
+%D \macros
+%D {ruledhss,
+%D ruledhfil,ruledhfilneg,
+%D ruledhfill,ruledhfillneg}
+%D
+%D We start with the easiest part, the fills. The scheme we
+%D follow is {\em visual filling -- going back -- normal
+%D filling}. Visualizing is implemented using \type{\cleaders}.
+%D Because the \BOX\ that follows this command is constructed
+%D only once, the \type{\copy} is not really a prerequisite. We
+%D prefer using a \type{\normalhbox} here instead of a
+%D \type{\hbox}.
+
+\def\setvisiblehfilbox#1\to#2#3#4%
+ {\setbox#1\normalhbox
+ {\visualvrule
+ \!!width #2\testrulewidth
+ \!!height#3\testrulewidth
+ \!!depth #4\testrulewidth}%
+ \smashbox#1}
+
+\def\doruledhfiller#1#2#3#4%
+ {#1#2%
+ \bgroup
+ \dontinterfere
+ \dontcomplain
+ \setvisiblehfilbox0\to{4}{#3}{#4}%
+ \setvisiblehfilbox2\to422%
+ \copy0\copy2
+ \bgroup
+ \setvisiblehfilbox0\to422%
+ \cleaders
+ \normalhbox to 12\testrulewidth
+ {\normalhss\copy0\normalhss}%
+ #1%
+ \egroup
+ \setbox0\normalhbox
+ {\normalhskip-4\testrulewidth\copy0\copy2}%
+ \smashbox0%
+ \box0
+ \egroup}
+
+%D The horizontal fillers differ in their boundary
+%D visualization. Watch the small dots. Fillers can be
+%D combined within reasonable margins.
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hss}\ruledhss test}
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hfil}\ruledhfil test}
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hfill}\ruledhfill test}
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut
+%D \type{\hfil}\type{\hfil}\ruledhfil\ruledhfil
+%D test%
+%D \ruledhfil\type{\hfil}}
+%D \stoplinecorrection
+%D
+%D The negative counterparts are visualizes, but seldom
+%D become visible, apart from their boundaries.
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hfilneg}\ruledhfilneg test}
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\type{\hfillneg}\ruledhfillneg test}
+%D \stoplinecorrection
+%D
+%D Although leaders are used for visualizing, they are
+%D visualized themselves correctly as the next example shows.
+%D
+%D \startlinecorrection
+%D \baselinerulefalse
+%D \ruledhbox to \hsize
+%D {\strut\cleaders\normalhbox to 2em{\normalhss$\circ$\normalhss}\ruledhfill}
+%D \stoplinecorrection
+%D
+%D All five substitutions use the same auxiliary macro. Watch
+%D the positive first -- negative next approach.
+
+\unexpanded\def\ruledhss
+ {\doruledhfiller\normalhss\normalhfilneg{0}{0}}
+
+\unexpanded\def\ruledhfil
+ {\doruledhfiller\normalhfil\normalhfilneg{10}{-6}}
+
+\unexpanded\def\ruledhfill
+ {\doruledhfiller\normalhfill\normalhfillneg{18}{-14}}
+
+\unexpanded\def\ruledhfilneg
+ {\doruledhfiller\normalhfilneg\normalhfil{-6}{10}}
+
+\unexpanded\def\ruledhfillneg
+ {\doruledhfiller\normalhfillneg\normalhfill{-14}{18}}
+
+%D \macros
+%D {ruledvss,
+%D ruledvfil,ruledvfilneg,
+%D ruledvfill,ruledvfillneg}
+%D
+%D The vertical mode commands adopt the same visualization
+%D scheme, but are implemented in a slightly different way.
+
+\def\setvisiblevfilbox#1\to#2#3#4%
+ {\setbox#1\normalhbox
+ {\visualvrule
+ \!!width #2\testrulewidth
+ \!!height#3\testrulewidth
+ \!!depth #4\testrulewidth}%
+ \smashbox#1}%
+
+\def\doruledvfiller#1#2#3%
+ {#1#2%
+ \bgroup
+ \dontinterfere
+ \dontcomplain
+ \normaloffinterlineskip
+ \setvisiblevfilbox0\to422%
+ \setbox2\normalvcue
+ {\normalhskip -#3\testrulewidth\copy0}%
+ \smashbox2%
+ \copy2
+ \bgroup
+ \setbox2\normalvcue
+ {\normalhskip -2\testrulewidth\copy0}%
+ \smashbox2%
+ \copy2
+ \cleaders
+ \normalvbox to 12\testrulewidth
+ {\normalvss\copy2\normalvss}%
+ #1%
+ \setbox2\normalvbox
+ {\normalvskip-2\testrulewidth\copy2}%
+ \smashbox2%
+ \box2
+ \egroup
+ \box2
+ \egroup}
+
+%D Because they act the same as their horizontal counterparts
+%D we only show a few examples.
+%D
+%D \startlinecorrection
+%D \hbox to \hsize
+%D {\dontinterfere
+%D \baselinerulefalse
+%D \centeredvcuetrue
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vss}\ruledvss last line}\normalhss
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vfil}\ruledvfil last line}\normalhss
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vfill}\ruledvfill last line}\normalhss
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vfilneg}\ruledvfilneg last line}\normalhss
+%D \ruledvbox to 10ex
+%D {\hsize.18\hsize
+%D \type{\vfillneg}\ruledvfillneg last line}}
+%D \stoplinecorrection
+%D
+%D Keep in mind that \type{\vfillneg} is not part of \PLAIN\
+%D \TEX, but are mimmicked by a macro.
+
+\unexpanded\def\ruledvss {\doruledvfiller\normalvss \normalvfilneg {2}}
+\unexpanded\def\ruledvfil {\doruledvfiller\normalvfil \normalvfilneg {-4}}
+\unexpanded\def\ruledvfill {\doruledvfiller\normalvfill \normalvfillneg{-12}}
+\unexpanded\def\ruledvfilneg {\doruledvfiller\normalvfilneg \normalvfil {8}}
+\unexpanded\def\ruledvfillneg{\doruledvfiller\normalvfillneg\normalvfill {16}}
+
+%D \macros
+%D {ruledhskip}
+%D
+%D Skips differ from kerns in two important aspects:
+%D
+%D \startitemize[packed]
+%D \item line and pagebreaks are allowed at a skip
+%D \item skips can have a positive and/or negative
+%D stretchcomponent
+%D \stopitemize
+%D
+%D Stated a bit different: kerns are fixed skips at which no
+%D line or pagebreak can occur. Because skips have a more open
+%D character, they are visualized in a open way.
+%D
+%D \startbuffer
+%D one
+%D \hskip +30pt plus 5pt
+%D two
+%D \hskip +30pt
+%D \hskip -10pt plus 5pt
+%D three
+%D \hskip 0pt
+%D four
+%D \hskip +30pt
+%D five
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D When skips have a stretch component, this is visualized by
+%D means of a dashed line. Positive skips are on top of the
+%D baseline, negative ones are below it. This way we can show
+%D the combined results. An alternative visualization of
+%D stretch could be drawing the mid line over a length of the
+%D stretch, in positive or negative direction.
+
+\def\doruledhskip
+ {\relax
+ \dontinterfere
+ \dontcomplain
+ \investigateskip\scratchskip
+ \ifzero
+ \setbox0\normalhbox
+ {\normalhskip-\testrulewidth
+ \visualvrule
+ \!!width4\testrulewidth
+ \!!height16\testrulewidth
+ \!!depth16\testrulewidth}%
+ \else
+ \setbox0\normalhbox to \ifnegative-\fi\scratchskip
+ {\visualvrule
+ \!!width2\testrulewidth
+ \ifnegative\!!depth\else\!!height\fi16\testrulewidth
+ \cleaders
+ \visualhrule
+ \ifnegative
+ \!!depth2\testrulewidth
+ \!!height\zeropoint
+ \else
+ \!!height2\testrulewidth
+ \!!depth\zeropoint
+ \fi
+ \normalhfill
+ \ifflexible
+ \normalhskip\ifnegative\else-\fi\scratchskip
+ \normalhskip2\testrulewidth
+ \cleaders
+ \normalhbox
+ {\normalhskip 2\testrulewidth
+ \visualvrule
+ \!!width2\testrulewidth
+ \!!height\ifnegative-7\else9\fi\testrulewidth
+ \!!depth\ifnegative9\else-7\fi\testrulewidth
+ \normalhskip 2\testrulewidth}%
+ \normalhfill
+ \fi
+ \visualvrule
+ \!!width2\testrulewidth
+ \ifnegative\!!depth\else\!!height\fi16\testrulewidth}%
+ \setbox0\normalhbox
+ {\ifnegative\else\normalhskip-\scratchskip\fi
+ \box0}%
+ \fi
+ \smashbox0%
+ \ifvisiblestretch \else
+ \flexiblefalse
+ \fi
+ \ifflexible
+ % breaks ok but small displacements can occur
+ \skip2\scratchskip
+ \advance\skip2 -1\scratchskip
+ \divide\skip2 2
+ \advance\scratchskip -\skip2
+ \normalhskip\scratchskip
+ \normalpenalty\!!tenthousand
+ \box0
+ \normalhskip\skip2
+ \else
+ \normalhskip\scratchskip
+ \box0
+ \fi
+ \egroup}
+
+\unexpanded\def\ruledhskip
+ {\bgroup
+ \afterassignment\doruledhskip
+ \scratchskip=}
+
+%D The visual skip is located at a feasible point. Normally
+%D this does not interfere with the normaltypesetting process.
+%D The next examples show (1)~the default behavior, (2)~the
+%D (not entirely correct) distributed stretch and (3)~the way
+%D the text is typeset without cues.
+%D
+%D \startbuffer
+%D \dorecurse
+%D {15}
+%D {test\hskip1em plus .5em minus .5em
+%D test\hskip2em
+%D test}
+%D \stopbuffer
+%D
+%D \startlinecorrection
+%D \showmakeup
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \showmakeup
+%D \visiblestretchtrue
+%D \getbuffer
+%D \stoplinecorrection
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+
+%D \macros
+%D {ruledvskip}
+%D
+%D We are less fortunate when implementing the vertical skips.
+%D This is a direct result of interference between the boxes that
+%D visualize the skip and skip removal at a pagebreak. Normally
+%D skips disappear at the top of a page, but not of course when
+%D visualized in a \type{\vbox}. A quite perfect simulation
+%D could have been built if we would have had available two
+%D more primitives: \type{\hnop} and \type{\vnop}. These new
+%D primitives could stand for boxes that are visible but are
+%D not taken into account in any way. They are there for us,
+%D but not for \TEX.
+%D
+%D \startbuffer
+%D first line
+%D \vskip +30pt plus 5pt
+%D second line
+%D \vskip +30pt
+%D \vskip -10pt plus 5pt
+%D third line
+%D \par
+%D fourth line
+%D \vskip +30pt
+%D fifth line
+%D \vskip 0pt
+%D sixth line
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D We have to postpone \type{\prevdepth}. Although this
+%D precaution probably is not completely waterproof, it works
+%D quite well.
+
+\def\dodoruledvskip
+ {\nextdepth\prevdepth
+ \dontinterfere
+ \dontcomplain
+ \normaloffinterlineskip
+ \investigateskip\scratchskip
+ \ifzero
+ \setbox0\normalvcue
+ {\visualvrule
+ \!!width32\testrulewidth
+ \!!height2\testrulewidth
+ \!!depth2\testrulewidth}%
+ \else
+ \setbox0\normalvbox to \ifnegative-\fi\scratchskip
+ {\visualhrule
+ \!!width16\testrulewidth
+ \!!height2\testrulewidth
+ \ifflexible
+ \cleaders
+ \normalhbox to 16\testrulewidth
+ {\normalhss
+ \normalvbox
+ {\normalvskip 2\testrulewidth
+ \visualhrule
+ \!!width2\testrulewidth
+ \!!height2\testrulewidth
+ \normalvskip 2\testrulewidth}%
+ \normalhss}%
+ \normalvfill
+ \else
+ \normalvfill
+ \fi
+ \visualhrule
+ \!!width16\testrulewidth
+ \!!height2\testrulewidth}%
+ \setbox2\normalvbox to \ht0
+ {\visualhrule
+ \!!width2\testrulewidth
+ \!!height\ht0}%
+ \ifnegative
+ \ht0\zeropoint
+ \setbox0\normalhbox
+ {\normalhskip2\testrulewidth % will be improved
+ \normalhskip-\wd0\box0}%
+ \fi
+ \smashbox0%
+ \smashbox2%
+ \setbox0\normalvcue
+ {\box2\box0}%
+ \setbox0\normalvbox
+ {\ifnegative\normalvskip\scratchskip\fi\box0}%
+ \smashbox0%
+ \fi
+ \ifvisiblestretch
+ \ifflexible
+ \skip2\scratchskip
+ \advance\skip2 -1\scratchskip
+ \divide\skip2 2
+ \advance\scratchskip -\skip2
+ \normalvskip\skip2
+ \fi
+ \fi
+ \normalpenalty\!!tenthousand
+ \box0
+ \prevdepth\nextdepth % not \dp0=\nextdepth
+ \normalvskip\scratchskip}
+
+%D We try to avoid interfering at the top of a page. Of course
+%D we only do so when we are in the main vertical list.
+
+\def\doruledvskip
+ {\endgraf % \par
+ \ifdim\pagegoal=\maxdimen
+ \ifinner
+ \dodoruledvskip
+ \fi
+ \else
+ \dodoruledvskip
+ \fi
+ \egroup}
+
+\unexpanded\def\ruledvskip
+ {\bgroup
+ \afterassignment\doruledvskip
+ \scratchskip=}
+
+%D \macros
+%D {ruledkern}
+%D
+%D The macros that implement the kerns are a bit more
+%D complicated than needed, because they also serve the
+%D visualization of glue, our \PLAIN\ defined kerns with
+%D stretch or shrink. We've implemented both horizontal and
+%D vertical kerns as ruled boxes.
+%D
+%D \startbuffer
+%D one
+%D \kern +30pt
+%D two
+%D \kern +30pt
+%D \kern -10pt
+%D three
+%D \kern 0pt
+%D four
+%D \kern +30pt
+%D five
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D Positive and negative kerns are placed on top or below the
+%D baseline, so we are able to track their added result. We
+%D didn't mention spacings of 0~pt yet. Zero values are
+%D visualized a bit different, because we want to see them
+%D anyhow.
+
+\def\doruledhkern
+ {\dontinterfere
+ \dontcomplain
+ \baselinerulefalse
+ \investigateskip\scratchskip
+ \boxrulewidth2\testrulewidth
+ \ifzero
+ \setbox0\ruledhbox to 8\testrulewidth
+ {\visualvrule
+ \!!width\zeropoint
+ \!!height16\testrulewidth
+ \!!depth16\testrulewidth}%
+ \setbox0\normalhbox
+ {\normalhskip-4\testrulewidth\box0}%
+ \else
+ \setbox0\ruledhbox to \ifnegative-\fi\scratchskip
+ {\visualvrule
+ \!!width\zeropoint
+ \ifnegative\!!depth\else\!!height\fi16\testrulewidth
+ \ifflexible
+ \normalhskip2\testrulewidth
+ \cleaders
+ \normalhbox
+ {\normalhskip 2\testrulewidth
+ \visualvrule
+ \!!width2\testrulewidth
+ \!!height\ifnegative-7\else9\fi\testrulewidth
+ \!!depth\ifnegative9\else-7\fi\testrulewidth
+ \normalhskip 2\testrulewidth}%
+ \normalhfill
+ \else
+ \normalhfill
+ \fi}%
+ \testrulewidth2\testrulewidth
+ \setbox0\ruledhbox{\box0}% \make...
+ \fi
+ \smashbox0%
+ \normalpenalty\!!tenthousand
+ \normalhbox to \zeropoint
+ {\ifnegative\normalhskip1\scratchskip\fi
+ \box0}%
+ \afterwards\scratchskip
+ \egroup}
+
+\unexpanded\def\ruledhkern#1%
+ {\bgroup
+ \let\afterwards#1%
+ \afterassignment\doruledhkern
+ \scratchskip=}
+
+%D After having seen the horizontal ones, the vertical kerns
+%D will not surprise us. In this example we use \type{\par} to
+%D switch to vertical mode.
+%D
+%D \startbuffer
+%D first line
+%D \par \kern +30pt
+%D second line
+%D \par \kern +30pt
+%D \par \kern -10pt
+%D third line
+%D \par
+%D fourth line
+%D \par \kern +30pt
+%D fifth line
+%D \par \kern 0pt
+%D sixth line
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D Like before, we have to postpone \type{\prevdepth}. If we
+%D leave out this trick, we got ourselves some wrong spacing.
+
+\def\dodoruledvkern
+ {\nextdepth\prevdepth
+ \dontinterfere
+ \dontcomplain
+ \baselinerulefalse
+ \normaloffinterlineskip
+ \investigateskip\scratchskip
+ \boxrulewidth2\testrulewidth
+ \ifzero
+ \setbox0\ruledhbox to 32\testrulewidth
+ {\visualvrule
+ \!!width\zeropoint
+ \!!height4\testrulewidth
+ \!!depth4\testrulewidth}%
+ \else
+ \setbox0\ruledvbox to \ifnegative-\fi\scratchskip
+ {\hsize16\testrulewidth
+ \ifflexible
+ \cleaders
+ \normalhbox to 16\testrulewidth
+ {\normalhss
+ \normalvbox
+ {\normalvskip 2\testrulewidth
+ \visualhrule
+ \!!width2\testrulewidth
+ \!!height2\testrulewidth
+ \normalvskip 2\testrulewidth}%
+ \normalhss}%
+ \normalvfill
+ \else
+ \visualvrule
+ \!!width\zeropoint
+ \!!height\ifnegative-\fi\scratchskip
+ \normalhfill
+ \fi}
+ \fi
+ \testrulewidth2\testrulewidth
+ \setbox0\ruledvbox{\box0}% \make...
+ \smashbox0%
+ \setbox0\normalvbox
+ {\ifnegative\normalvskip\scratchskip\fi
+ \normalvcue
+ {\ifnegative\normalhskip-16\testrulewidth\fi\box0}}%
+ \smashbox0%
+ \normalpenalty\!!tenthousand
+ \box0
+ \prevdepth\nextdepth} % not \dp0=\nextdepth
+
+\def\doruledvkern
+ {\ifdim\pagegoal=\maxdimen
+ \ifinner
+ \dodoruledvkern
+ \fi
+ \else
+ \dodoruledvkern
+ \fi
+ \afterwards\scratchskip
+ \egroup}
+
+\unexpanded\def\ruledvkern#1%
+ {\bgroup
+ \let\afterwards#1\relax
+ \afterassignment\doruledvkern
+ \scratchskip=}
+
+\unexpanded\def\ruledkern
+ {\ifvmode
+ \expandafter\ruledvkern
+ \else
+ \expandafter\ruledhkern
+ \fi
+ \normalkern}
+
+%D A a bit more \TEX nice solution is:
+%D
+%D \starttyping
+%D \unexpanded\def\ruledkern%
+%D {\csname ruled\ifvmode v\else h\fi kern\endcsname\normalkern}
+%D \stoptyping
+
+%D \macros
+%D {ruledhglue,ruledvglue}
+%D
+%D The non-primitive glue commands are treated as kerns with
+%D stretch. This stretch is presented as a dashed line. I
+%D have to admit that until now, I've never used these glue
+%D commands.
+%D
+%D \startbuffer
+%D one
+%D \hglue +30pt plus 5pt
+%D two
+%D \hglue +30pt
+%D \hglue -10pt plus 5pt
+%D three
+%D \hglue 0pt
+%D four
+%D \hglue +30pt
+%D five
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledhglue
+ {\leavevmode
+ \scratchcounter\spacefactor
+ \visualvrule\!!width\zeropoint
+ \normalpenalty\!!tenthousand
+ \ruledhkern\normalhskip\scratchskip
+ \spacefactor\scratchcounter
+ \egroup}
+
+\unexpanded\def\ruledhglue
+ {\bgroup
+ \afterassignment\doruledhglue\scratchskip=}
+
+%D \startbuffer
+%D first line
+%D \vglue +30pt plus 5pt
+%D second line
+%D \vglue +30pt
+%D \vglue -10pt plus 5pt
+%D third line
+%D \par
+%D fourth line
+%D \vglue +30pt
+%D fifth line
+%D \vglue 0pt
+%D sixth line
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledvglue
+ {\endgraf % \par
+ \nextdepth\prevdepth
+ \visualhrule\!!height\zeropoint
+ \normalpenalty\!!tenthousand
+ \ruledvkern\normalvskip\scratchskip
+ \prevdepth\nextdepth
+ \egroup}
+
+\unexpanded\def\ruledvglue
+ {\bgroup
+ \afterassignment\doruledvglue\scratchskip=}
+
+%D \macros
+%D {ruledmkern,ruledmskip}
+%D
+%D Mathematical kerns and skips are specified in mu. This
+%D font related unit is incompatible with those of \DIMENSIONS\
+%D and \SKIPS. Because in math mode spacing is often a very
+%D subtle matter, we've used a very simple, not overloaded way
+%D to show them.
+
+\def\dodoruledmkern#1%
+ {\dontinterfere
+ \dontcomplain
+ \setbox0\normalhbox
+ {$\normalmkern\ifnegative-\fi\scratchmuskip$}%
+ \setbox0\normalhbox to \wd0
+ {\visualvrule
+ \!!height16\testrulewidth
+ \!!depth16\testrulewidth
+ \!!width\testrulewidth
+ \leaders
+ \visualhrule
+ \!!height\ifpositive16\else-14\fi\testrulewidth
+ \!!depth\ifpositive-14\else16\fi\testrulewidth
+ \normalhfill
+ \ifflexible
+ \normalhskip-\wd0
+ \leaders
+ \visualhrule
+ \!!height\testrulewidth
+ \!!depth\testrulewidth
+ \normalhfill
+ \fi
+ \visualvrule
+ \!!height16\testrulewidth
+ \!!depth16\testrulewidth
+ \!!width\testrulewidth}%
+ \smashbox0%
+ \ifnegative
+ #1\scratchmuskip
+ \box0
+ \else
+ \box0
+ #1\scratchmuskip
+ \fi
+ \egroup}
+
+%D \startbuffer
+%D $a \mkern3mu = \mkern3mu
+%D b \quad
+%D \mkern-2mu + \mkern-2mu
+%D \quad c$
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledmkern
+ {\investigatemuskip\scratchmuskip
+ \flexiblefalse
+ \dodoruledmkern\normalmkern}
+
+\unexpanded\def\ruledmkern
+ {\bgroup
+ \afterassignment\doruledmkern\scratchmuskip=}
+
+%D \startbuffer
+%D $a \mskip3mu = \mskip3mu
+%D b \quad
+%D \mskip-2mu + \mskip-2mu
+%D \quad c$
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledmskip
+ {\investigatemuskip\scratchmuskip
+ \flexibletrue
+ \dodoruledmkern\normalmskip}
+
+\unexpanded\def\ruledmskip
+ {\bgroup
+ \afterassignment\doruledmskip\scratchmuskip=}
+
+%D \macros
+%D {penalty}
+%D
+%D After presenting fills, skip, kerns and glue we've come to
+%D see penalties. In the first implementation --- most of the
+%D time needed to develop this set of macros went into testing
+%D different types of visualization --- penalties were mere
+%D small blocks with one black half, depending on the sign.
+%D This most recent version also gives an indication of the
+%D amount of penalty. Penalties can go from less than $-10000$
+%D to over $+10000$, and their behavior is somewhat
+%D non-lineair, with some values having special meanings. We
+%D therefore decided not to use its value for a lineair
+%D indicator.
+%D
+%D \startbuffer
+%D one
+%D \penalty +100
+%D two
+%D \penalty +100
+%D \penalty -100
+%D three
+%D \penalty 0
+%D four
+%D \penalty +100
+%D five
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+%D
+%D The small sticks at the side of the penalty indicate it
+%D size. The next example shows the positive and negative
+%D penalties of 0, 1, 10, 100, 1000 and 10000.
+%D
+%D \startlinecorrection
+%D \hbox
+%D {test \ruledhpenalty0
+%D test \ruledhpenalty1
+%D test \ruledhpenalty10
+%D test \ruledhpenalty100
+%D test \ruledhpenalty1000
+%D test \ruledhpenalty10000
+%D test}
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D \startlinecorrection
+%D \hbox
+%D {test \ruledhpenalty0
+%D test \ruledhpenalty-1
+%D test \ruledhpenalty-10
+%D test \ruledhpenalty-100
+%D test \ruledhpenalty-1000
+%D test \ruledhpenalty-10000
+%D test}
+%D \stoplinecorrection
+%D
+%D \blank
+%D
+%D This way stacked penalties of different severance can be
+%D shown in combination.
+%D
+%D test \ruledhpenalty10 \ruledhpenalty100
+%D test
+%D test \ruledhpenalty1000 \ruledhpenalty-1000
+%D test
+
+\def\setruledpenaltybox#1#2#3#4#5#6%
+ {\setbox#1\normalhbox
+ {\ifnum#2=0 \else
+ \edef\sign
+ {\ifnum#2>0 +\else-\fi}%
+ \dimen0=\ifnum\sign#2>9999
+ 28\else
+ \ifnum\sign#2>999
+ 22\else
+ \ifnum\sign#2>99
+ 16\else
+ \ifnum\sign#2>9
+ 10\else
+ 4
+ \fi\fi\fi\fi \testrulewidth
+ \ifnum#2<0
+ \normalhskip-\dimen0
+ \normalhskip-2\testrulewidth
+ \visualvrule
+ \!!width2\testrulewidth
+ \!!height#3\testrulewidth
+ \!!depth#4\testrulewidth
+ \fi
+ \visualvrule
+ \!!width\dimen0
+ \!!height#5\testrulewidth
+ \!!depth#6\testrulewidth
+ \ifnum#2>0
+ \visualvrule
+ \!!width2\testrulewidth
+ \!!height#3\testrulewidth
+ \!!depth#4\testrulewidth
+ \fi
+ \fi}%
+ \smashbox#1}
+
+\def\doruledhpenalty
+ {\dontinterfere
+ \dontcomplain
+ \investigatecount\scratchcounter
+ \testrulewidth2\testrulewidth
+ \boxrulewidth\testrulewidth
+ \setbox0\ruledhbox to 8\testrulewidth
+ {\ifnegative\else\normalhss\fi
+ \visualvrule
+ \!!depth8\testrulewidth
+ \!!width\ifzero0\else4\fi\testrulewidth
+ \ifpositive\else\normalhss\fi}%
+ \setruledpenaltybox{2}{\scratchcounter}{0}{8}{-3.5}{4.5}%
+ \normalpenalty\!!tenthousand
+ \setbox0\normalhbox
+ {\normalhskip-4\testrulewidth
+ \ifnegative
+ \box2\box0
+ \else
+ \box0\box2
+ \fi}%
+ \smashbox0%
+ \box0
+ \normalpenalty\scratchcounter
+ \egroup}
+
+\unexpanded\def\ruledhpenalty
+ {\bgroup
+ \afterassignment\doruledhpenalty
+ \scratchcounter=}
+
+%D The size of a vertical penalty is also shown on the
+%D horizontal axis. This way there is less interference with
+%D the often preceding or following skips and kerns.
+%D
+%D \startbuffer
+%D first line
+%D \par \penalty +100
+%D second line
+%D \par \penalty +100
+%D \par \penalty -100
+%D third line
+%D \par \penalty 0
+%D fourth line
+%D \par \penalty +100
+%D fifth line
+%D \stopbuffer
+%D
+%D \ShowBufferedExample
+
+\def\doruledvpenalty
+ {\ifdim\pagegoal=\maxdimen
+ \else
+ \nextdepth\prevdepth
+ \dontinterfere
+ \dontcomplain
+ \investigatecount\scratchcounter
+ \testrulewidth2\testrulewidth
+ \boxrulewidth\testrulewidth
+ \setbox0\ruledhbox
+ {\visualvrule
+ \!!height4\testrulewidth
+ \!!depth4\testrulewidth
+ \!!width\zeropoint
+ \visualvrule
+ \!!height\ifnegative.5\else4\fi\testrulewidth
+ \!!depth\ifpositive.5\else4\fi\testrulewidth
+ \!!width8\testrulewidth}%
+ \setruledpenaltybox{2}{\scratchcounter}{4}{4}{.5}{.5}%
+ \setbox0\normalhbox
+ {\normalhskip-4\testrulewidth
+ \ifnegative
+ \box2\box0
+ \else
+ \box0\box2
+ \fi
+ \normalhss}%
+ \smashbox0%
+ \normalpenalty\!!tenthousand
+ \nointerlineskip
+ \dp0\nextdepth % not \prevdepth=\nextdepth
+ \normalvbox
+ {\normalvcue{\box0}}%
+ \fi
+ \normalpenalty\scratchcounter
+ \egroup}
+
+\unexpanded\def\ruledvpenalty
+ {\bgroup
+ \afterassignment\doruledvpenalty
+ \scratchcounter=}
+
+\unexpanded\def\ruledpenalty
+ {\ifvmode
+ \expandafter\ruledvpenalty
+ \else
+ \expandafter\ruledhpenalty
+ \fi}
+
+%D At the cost of some more tokens, a bit more clever
+%D implementation would be:
+%D
+%D \starttyping
+%D \unexpanded\def\ruledpenalty%
+%D {\csname ruled\ifvmode v\else h\fi penalty\endcsname}
+%D \stoptyping
+
+%D \macros
+%D {showfils,dontshowfils,
+%D showboxes,dontshowboxes,
+%D showskips,dontshowskips,
+%D showpenalties,dontshowpenalties}
+%D
+%D For those who want to manipulate the visual cues in detail,
+%D we have grouped them.
+
+\newif\ifshowingcomposition % see later why we need this
+
+\def\showfils
+ {\showingcompositiontrue
+ \let\hss \ruledhss
+ \let\hfil \ruledhfil
+ \let\hfill \ruledhfill
+ \let\hfilneg \ruledhfilneg
+ \let\hfillneg \ruledhfillneg
+ \let\vss \ruledvss
+ \let\vfil \ruledvfil
+ \let\vfill \ruledvfill
+ \let\vfilneg \ruledvfilneg
+ \let\vfillneg \ruledvfillneg}
+
+\def\dontshowfils
+ {\let\hss \normalhss
+ \let\hfil \normalhfil
+ \let\hfill \normalhfill
+ \let\hfilneg \normalhfilneg
+ \let\hfillneg \normalhfillneg
+ \let\vss \normalvss
+ \let\vfil \normalvfil
+ \let\vfill \normalvfill
+ \let\vfilneg \normalvfilneg
+ \let\vfillneg \normalvfillneg}
+
+\def\showboxes
+ {\showingcompositiontrue
+ \baselineruletrue
+ \let\hbox \ruledhbox
+ \let\vbox \ruledvbox
+ \let\vtop \ruledvtop
+ \let\vcenter \ruledvcenter}
+
+\def\dontshowboxes
+ {\let\hbox \normalhbox
+ \let\vbox \normalvbox
+ \let\vtop \normalvtop
+ \let\vcenter \normalvcenter}
+
+\def\showskips
+ {\showingcompositiontrue
+ \let\hskip \ruledhskip
+ \let\vskip \ruledvskip
+ \let\kern \ruledkern
+ \let\mskip \ruledmskip
+ \let\mkern \ruledmkern
+ \let\hglue \ruledhglue
+ \let\vglue \ruledvglue}
+
+\def\dontshowskips
+ {\let\hskip \normalhskip
+ \let\vskip \normalvskip
+ \let\kern \normalkern
+ \let\mskip \normalmskip
+ \let\mkern \normalmkern
+ \let\hglue \normalhglue
+ \let\vglue \normalvglue}
+
+\def\showpenalties
+ {\showingcompositiontrue
+ \let\penalty \ruledpenalty}
+
+\def\dontshowpenalties
+ {\let\penalty \normalpenalty}
+
+%D \macros
+%D {showcomposition,dontshowcomposition,
+%D showingcomposition}
+%D
+%D All these nice options come together in three macros. One
+%D for turning the options on, one for turning them off, and a
+%D boolean for enabling the mechanism outside the scope of the
+%D user. The first two macros only do their job when we are
+%D actually showing the composition.
+%D
+%D \starttyping
+%D \showingcompositiontrue
+%D \showcomposition
+%D \stoptyping
+%D
+%D Because the output routine can do tricky things, like
+%D multiple column typesetting and manipulation of the
+%D pagebody, shifting things around and so on, the macro
+%D \type{\dontshowcomposition} best can be called when we enter
+%D this routine. Too much visual cues just don't make sense. In
+%D \CONTEXT\ this has been taken care of.
+
+\newif\ifshowingcomposition
+
+\def\showcomposition
+ {\ifshowingcomposition
+ \showfils
+ \showboxes
+ \showskips
+ \showpenalties
+ \fi}
+
+\def\dontshowcomposition
+ {\ifshowingcomposition
+ \dontshowfils
+ \dontshowboxes
+ \dontshowskips
+ \dontshowpenalties
+ \fi}
+
+%D \macros
+%D {showmakeup,
+%D defaulttestrulewidth}
+%D
+%D Just to make things even more easy, we have defined:
+%D
+%D \starttyping
+%D \showmakeup
+%D \stoptyping
+%D
+%D For the sake of those who don't (yet) use \CONTEXT\ we
+%D preset \type{\defaulttestrulewidth} to the already set
+%D value. Otherwise we default to a bodyfontsize related value.
+%D
+%D \starttyping
+%D \def\defaulttestrulewidth{.2pt}
+%D \stoptyping
+%D
+%D Beware, it's a macro not a \DIMENSION.
+
+\ifx\bodyfontsize\undefined
+ \edef\defaulttestrulewidth{\the\testrulewidth}
+\else
+ \def\defaulttestrulewidth{.02\bodyfontsize}
+\fi
+
+\def\showmakeup
+ {\testrulewidth\defaulttestrulewidth
+ \showingcompositiontrue
+ \showcomposition}
+
+\protect
+
+%D \ifCONTEXT \let\next=\relax \else \let\next=\endinput
+%D The documented source you have been reading was processed
+%D using some surrogate makeup. When this file is processed
+%D in \CONTEXT, a few more examples show up here, like a local
+%D table of contents and a local register.
+%D \fi \next
+
+%D Lets end with some more advanced examples.
+%D Definitions and enumerations come in many flavors. The
+%D next one for instance is defined as:
+%D
+%D \starttyping
+%D \definedescription[test][place=left,hang=3,width=6em]
+%D \stoptyping
+%D
+%D When applied to some text, this would look like:
+%D
+%D \bgroup
+%D \showmakeup
+%D \definedescription[test][location=left,hang=3,width=6em]
+%D
+%D \test{visual\\debugger} I would be very pleased if \TEX\
+%D had two more primitives: \type{\vnop} and \type{\hnop}. Both
+%D should act and show up as normal boxes, but stay invisible
+%D for \TEX\ when it's doing calculations. The \type{\vnop}
+%D for instance should not interact with the internal mechanism
+%D responsible for the disappearing skips, kerns and penalties
+%D at a pagebreak. As long as we don't have these two boxtypes,
+%D visual debugging will never be perfect.
+%D
+%D \egroup
+%D
+%D The index to this section looks like:
+%D
+%D {\setupreferencing[prefixprefix=dummy]\showmakeup\placeindex[criterium=local]}
+%D
+%D Although not impressive examples or typesetting, both
+%D show us how and where things happen. When somehow the last
+%D lines in this two column index don't allign, then this is
+%D due to some still unknown interference.
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/symb-cow.mkii b/Master/texmf-dist/tex/context/base/symb-cow.mkii
new file mode 100644
index 00000000000..fac6ca485bd
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/symb-cow.mkii
@@ -0,0 +1,132 @@
+%D \module
+%D [ file=symb-cow,
+%D version=2006.06.23,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Cow Symbols,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\loadmapfile[koeieletters.map]
+
+\definefontsynonym [Cows] [koeielett]
+\definefontsynonym [CowsContour] [koeielett-contour]
+\definefontsynonym [CowsLogo] [koeielogos]
+\definefontsynonym [CowsLogoContour] [koeielogos-contour]
+
+\definecolor [lsky] [r=.6,g=.6,b=1]
+\definecolor [dsky] [r=.1,g=.1,b=1]
+\definecolor [lground] [r=.3,g=.9,b=.3]
+\definecolor [dground] [r=0,g=.5,b=0]
+\definecolor [cspots] [r=.33,g=.1,b=0]
+
+\definecolor [tlsky] [t=.5,a=1,r=.6,g=.6,b=1]
+\definecolor [tdsky] [t=.5,a=1,r=.1,g=.1,b=1]
+\definecolor [tlground] [t=.5,a=1,r=.3,g=.9,b=.3]
+\definecolor [tdground] [t=.5,a=1,r=0,g=.5,b=0]
+\definecolor [tcspots] [t=.5,a=1,r=.33,g=.1,b=0]
+
+\definepalet
+ [cow]
+ [normal=lground,
+ contour=dground,
+ sky=lsky]
+
+\def\CowNormal#1%
+ {\dontleavehmode\hbox{\color[cow:normal]{\getglyph{Cows}{#1}}}}
+
+\def\ScaledCowNormal#1#2%
+ {\dontleavehmode\hbox{\color[cow:normal]{\definedfont[Cows sa #1]#2}}}
+
+\def\ScaledCowOverlay#1#2%
+ {\dontleavehmode\hbox
+ {\color[cow:contour]{\hsmash{\definedfont[CowsContour sa #1]#2}}%
+ \color[cow:normal] {\definedfont[Cows sa #1]#2}}}
+
+\def\CowOverlay#1%
+ {\dontleavehmode\hbox
+ {\color[cow:contour]{\hsmash{\getglyph{CowsContour}{#1}}}%
+ \color[cow:normal] {\getglyph{Cows} {#1}}}}
+
+\def\CowContour#1%
+ {\dontleavehmode\hbox
+ {\color[cow:contour]{\hsmash{\getglyph{CowsLogoContour}{#1}}}%
+ \color[cow:normal] {\getglyph{CowsLogo} {#1}}}}
+
+\def\CowLogo #1{\getglyph{CowsLogo} {\char#1\relax}}
+\def\CowContourLogo#1{\getglyph{CowsLogoContour}{\char#1\relax}}
+
+\chardef\CowPragmaNormal= 1
+\chardef\CowPragmaShaded=20
+
+\startsymbolset[cownormal]
+
+ \definesymbol[CowPragmaADE] [\CowLogo{0}]
+ \definesymbol[CowPragma] [\CowLogo{1}]
+ \definesymbol[CowConTeXt] [\CowLogo{2}]
+ \definesymbol[CowConTeXtComplete] [\CowLogo{3}]
+ \definesymbol[CowConTeXtShadow] [\CowLogo{4}]
+ \definesymbol[CowConTeXtContour] [\CowLogo{5}]
+ \definesymbol[CowConTeXtOutline] [\CowLogo{6}]
+ \definesymbol[CowConTeXtDots] [\CowLogo{7}]
+ \definesymbol[CowMP] [\CowLogo{8}]
+ \definesymbol[CowMPComplete] [\CowLogo{9}]
+ \definesymbol[CowTeX] [\CowLogo{10}]
+ \definesymbol[CowTeXComplete] [\CowLogo{11}]
+ \definesymbol[CowBoo] [\CowLogo{12}]
+ \definesymbol[CowCow] [\CowLogo{13}]
+ \definesymbol[CowExampleComplete] [\CowLogo{14}]
+ \definesymbol[CowFoxetComplete] [\CowLogo{15}]
+ \definesymbol[CowMetafun] [\CowLogo{16}]
+ \definesymbol[CowMetafunComplete] [\CowLogo{17}]
+ \definesymbol[CowTEXComplete] [\CowLogo{18}]
+ \definesymbol[CowWikiComplete] [\CowLogo{19}]
+ \definesymbol[CowPragmaADEComplete][\CowLogo{20}]
+ \definesymbol[CowPragmaComplete] [\CowLogo{21}]
+ \definesymbol[CowExample] [\CowLogo{22}]
+ \definesymbol[CowFoxet] [\CowLogo{23}]
+ \definesymbol[CowTEX] [\CowLogo{24}]
+ \definesymbol[CowWiki] [\CowLogo{25}]
+ \definesymbol[CowCowTeXtComplete] [\CowLogo{26}]
+ \definesymbol[CowCowTeXt] [\CowLogo{27}]
+
+\stopsymbolset
+
+\startsymbolset[cowcontour]
+
+ \definesymbol[CowPragmaADE] [\CowContourLogo{0}]
+ \definesymbol[CowPragma] [\CowContourLogo{1}]
+ \definesymbol[CowConTeXt] [\CowContourLogo{2}]
+ \definesymbol[CowConTeXtComplete] [\CowContourLogo{3}]
+ \definesymbol[CowConTeXtShadow] [\CowContourLogo{4}]
+ \definesymbol[CowConTeXtContour] [\CowContourLogo{5}]
+ \definesymbol[CowConTeXtOutline] [\CowContourLogo{6}]
+ \definesymbol[CowConTeXtDots] [\CowContourLogo{7}]
+ \definesymbol[CowMP] [\CowContourLogo{8}]
+ \definesymbol[CowMPComplete] [\CowContourLogo{9}]
+ \definesymbol[CowTeX] [\CowContourLogo{10}]
+ \definesymbol[CowTeXComplete] [\CowContourLogo{11}]
+ \definesymbol[CowBoo] [\CowContourLogo{12}]
+ \definesymbol[CowCow] [\CowContourLogo{13}]
+ \definesymbol[CowExampleComplete] [\CowContourLogo{14}]
+ \definesymbol[CowFoxetComplete] [\CowContourLogo{15}]
+ \definesymbol[CowMetafun] [\CowContourLogo{16}]
+ \definesymbol[CowMetafunComplete] [\CowContourLogo{17}]
+ \definesymbol[CowTEXComplete] [\CowContourLogo{18}]
+ \definesymbol[CowWikiComplete] [\CowContourLogo{19}]
+ \definesymbol[CowPragmaADEComplete][\CowContourLogo{20}]
+ \definesymbol[CowPragmaComplete] [\CowContourLogo{21}]
+ \definesymbol[CowExample] [\CowContourLogo{22}]
+ \definesymbol[CowFoxet] [\CowContourLogo{23}]
+ \definesymbol[CowTEX] [\CowContourLogo{24}]
+ \definesymbol[CowWiki] [\CowContourLogo{25}]
+ \definesymbol[CowCowTeXtComplete] [\CowContourLogo{26}]
+ \definesymbol[CowCowTeXt] [\CowContourLogo{27}]
+
+\stopsymbolset
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/symb-cow.mkiv b/Master/texmf-dist/tex/context/base/symb-cow.mkiv
new file mode 100644
index 00000000000..adfd484d868
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/symb-cow.mkiv
@@ -0,0 +1,130 @@
+%D \module
+%D [ file=symb-cow,
+%D version=2006.06.23,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Cow Symbols,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\definefontsynonym [Cows] [koeielett]
+\definefontsynonym [CowsContour] [koeielett-contour]
+\definefontsynonym [CowsLogo] [koeielogos]
+\definefontsynonym [CowsLogoContour] [koeielogos-contour]
+
+\definecolor [lsky] [r=.6,g=.6,b=1]
+\definecolor [dsky] [r=.1,g=.1,b=1]
+\definecolor [lground] [r=.3,g=.9,b=.3]
+\definecolor [dground] [r=0,g=.5,b=0]
+\definecolor [cspots] [r=.33,g=.1,b=0]
+
+\definecolor [tlsky] [t=.5,a=1,r=.6,g=.6,b=1]
+\definecolor [tdsky] [t=.5,a=1,r=.1,g=.1,b=1]
+\definecolor [tlground] [t=.5,a=1,r=.3,g=.9,b=.3]
+\definecolor [tdground] [t=.5,a=1,r=0,g=.5,b=0]
+\definecolor [tcspots] [t=.5,a=1,r=.33,g=.1,b=0]
+
+\definepalet
+ [cow]
+ [normal=lground,
+ contour=dground,
+ sky=lsky]
+
+\def\CowNormal#1%
+ {\dontleavehmode\hbox{\color[cow:normal]{\getnamedglyphdirect{Cows}{#1}}}}
+
+\def\ScaledCowNormal#1#2%
+ {\dontleavehmode\hbox{\color[cow:normal]{\definedfont[Cows sa #1]#2}}}
+
+\def\ScaledCowOverlay#1#2%
+ {\dontleavehmode\hbox
+ {\color[cow:contour]{\hsmash{\definedfont[CowsContour sa #1]#2}}%
+ \color[cow:normal] {\definedfont[Cows sa #1]#2}}}
+
+\def\CowOverlay#1%
+ {\dontleavehmode\hbox
+ {\color[cow:contour]{\hsmash{\getnamedglyphdirect{CowsContour}{#1}}}%
+ \color[cow:normal] {\getnamedglyphdirect{Cows} {#1}}}}
+
+\def\CowContour#1%
+ {\dontleavehmode\hbox
+ {\color[cow:contour]{\hsmash{\getnamedglyphdirect{CowsLogoContour}{#1}}}%
+ \color[cow:normal] {\getnamedglyphdirect{CowsLogo} {#1}}}}
+
+\def\CowLogo {\getnamedglyphdirect{CowsLogo}} % #1
+\def\CowContourLogo{\getnamedglyphdirect{CowsLogoContour}} % #1
+
+\chardef\CowPragmaNormal= 1
+\chardef\CowPragmaShaded=20
+
+\startsymbolset[cownormal]
+
+ \definesymbol[CowPragmaADE] [\CowLogo{P_r_a_g_m_a_A_d_e}]
+ \definesymbol[CowPragma] [\CowLogo{p_r_a_g_m_a_a_d_e}]
+ \definesymbol[CowConTeXt] [\CowLogo{c_o_n_t_e_x_t}]
+ \definesymbol[CowConTeXtComplete] [\CowLogo{contextlogo}]
+ \definesymbol[CowConTeXtShadow] [\CowLogo{contextlogo.shadow}]
+ \definesymbol[CowConTeXtContour] [\CowLogo{contextlogo.contour}]
+ \definesymbol[CowConTeXtOutline] [\CowLogo{contextlogo.skeleton}]
+ \definesymbol[CowConTeXtDots] [\CowLogo{contextlogo.dots}]
+ \definesymbol[CowMP] [\CowLogo{M_P}]
+ \definesymbol[CowMPComplete] [\CowLogo{mplogo}]
+ \definesymbol[CowTeX] [\CowLogo{T_e_X}]
+ \definesymbol[CowTeXComplete] [\CowLogo{texlogo.alt}]
+ \definesymbol[CowBoo] [\CowLogo{boo}]
+ \definesymbol[CowCow] [\CowLogo{cow}]
+ \definesymbol[CowExampleComplete] [\CowLogo{E_x_a_m_p_l_e}]
+ \definesymbol[CowFoxetComplete] [\CowLogo{F_o_X_e_t}]
+ \definesymbol[CowMetafun] [\CowLogo{m_e_t_a_f_u_n}]
+ \definesymbol[CowMetafunComplete] [\CowLogo{metafunlogo}]
+ \definesymbol[CowTEXComplete] [\CowLogo{texlogo}]
+ \definesymbol[CowWikiComplete] [\CowLogo{wikilogo}]
+ \definesymbol[CowPragmaADEComplete][\CowLogo{PragmaADElogo}]
+ \definesymbol[CowPragmaComplete] [\CowLogo{pragmaadelogo}]
+ \definesymbol[CowExample] [\CowLogo{examplelogo}]
+ \definesymbol[CowFoxet] [\CowLogo{foxetlogo}]
+ \definesymbol[CowTEX] [\CowLogo{T_E_X}]
+ \definesymbol[CowWiki] [\CowLogo{W_i_k_i}]
+ \definesymbol[CowCowTeXtComplete] [\CowLogo{cowtextlogo}]
+ \definesymbol[CowCowTeXt] [\CowLogo{C_o_w_t_e_x_t}]
+
+\stopsymbolset
+
+\startsymbolset[cowcontour]
+
+ \definesymbol[CowPragmaADE] [\CowLogo{P_r_a_g_m_a_A_d_e}]
+ \definesymbol[CowPragma] [\CowLogo{p_r_a_g_m_a_a_d_e}]
+ \definesymbol[CowConTeXt] [\CowLogo{c_o_n_t_e_x_t}]
+ \definesymbol[CowConTeXtComplete] [\CowLogo{contextlogo}]
+ \definesymbol[CowConTeXtShadow] [\CowLogo{contextlogo.shadow}]
+ \definesymbol[CowConTeXtContour] [\CowLogo{contextlogo.contour}]
+ \definesymbol[CowConTeXtOutline] [\CowLogo{contextlogo.skeleton}]
+ \definesymbol[CowConTeXtDots] [\CowLogo{contextlogo.dots}]
+ \definesymbol[CowMP] [\CowLogo{M_P}]
+ \definesymbol[CowMPComplete] [\CowLogo{mplogo}]
+ \definesymbol[CowTeX] [\CowLogo{T_e_X}]
+ \definesymbol[CowTeXComplete] [\CowLogo{texlogo.alt}]
+ \definesymbol[CowBoo] [\CowLogo{boo}]
+ \definesymbol[CowCow] [\CowLogo{cow}]
+ \definesymbol[CowExampleComplete] [\CowLogo{E_x_a_m_p_l_e}]
+ \definesymbol[CowFoxetComplete] [\CowLogo{F_o_X_e_t}]
+ \definesymbol[CowMetafun] [\CowLogo{m_e_t_a_f_u_n}]
+ \definesymbol[CowMetafunComplete] [\CowLogo{metafunlogo}]
+ \definesymbol[CowTEXComplete] [\CowLogo{texlogo}]
+ \definesymbol[CowWikiComplete] [\CowLogo{wikilogo}]
+ \definesymbol[CowPragmaADEComplete][\CowLogo{PragmaADElogo}]
+ \definesymbol[CowPragmaComplete] [\CowLogo{pragmaadelogo}]
+ \definesymbol[CowExample] [\CowLogo{examplelogo}]
+ \definesymbol[CowFoxet] [\CowLogo{foxetlogo}]
+ \definesymbol[CowTEX] [\CowLogo{T_E_X}]
+ \definesymbol[CowWiki] [\CowLogo{W_i_k_i}]
+ \definesymbol[CowCowTeXtComplete] [\CowLogo{cowtextlogo}]
+ \definesymbol[CowCowTeXt] [\CowLogo{C_o_w_t_e_x_t}]
+
+\stopsymbolset
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/symb-cow.tex b/Master/texmf-dist/tex/context/base/symb-cow.tex
deleted file mode 100644
index c04ca0108f7..00000000000
--- a/Master/texmf-dist/tex/context/base/symb-cow.tex
+++ /dev/null
@@ -1,132 +0,0 @@
-%D \module
-%D [ file=symb-cow,
-%D version=2006.06.23,
-%D title=\CONTEXT\ Symbol Libraries,
-%D subtitle=Cow Symbols,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright=\PRAGMA]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\loadmapfile[koeieletters.map]
-
-\definefontsynonym [Cows] [koeielett]
-\definefontsynonym [CowsContour] [koeielett-contour]
-\definefontsynonym [CowsLogo] [koeielogos]
-\definefontsynonym [CowsLogoContour] [koeielogos-contour]
-
-\definecolor [lsky] [r=.6,g=.6,b=1]
-\definecolor [dsky] [r=.1,g=.1,b=1]
-\definecolor [lground] [r=.3,g=.9,b=.3]
-\definecolor [dground] [r=0,g=.5,b=0]
-\definecolor [cspots] [r=.33,g=.1,b=0]
-
-\definecolor [tlsky] [t=.5,a=1,r=.6,g=.6,b=1]
-\definecolor [tdsky] [t=.5,a=1,r=.1,g=.1,b=1]
-\definecolor [tlground] [t=.5,a=1,r=.3,g=.9,b=.3]
-\definecolor [tdground] [t=.5,a=1,r=0,g=.5,b=0]
-\definecolor [tcspots] [t=.5,a=1,r=.33,g=.1,b=0]
-
-\definepalet
- [cow]
- [normal=lground,
- contour=dground,
- sky=lsky]
-
-\def\CowNormal#1%
- {\dontleavehmode\hbox{\color[cow:normal]{\getglyph{Cows}{#1}}}}
-
-\def\ScaledCowNormal#1#2%
- {\dontleavehmode\hbox{\color[cow:normal]{\definedfont[Cows sa #1]#2}}}
-
-\def\ScaledCowOverlay#1#2%
- {\dontleavehmode\hbox
- {\color[cow:contour]{\hsmash{\definedfont[CowsContour sa #1]#2}}%
- \color[cow:normal] {\definedfont[Cows sa #1]#2}}}
-
-\def\CowOverlay#1%
- {\dontleavehmode\hbox
- {\color[cow:contour]{\hsmash{\getglyph{CowsContour}{#1}}}%
- \color[cow:normal] {\getglyph{Cows} {#1}}}}
-
-\def\CowContour#1%
- {\dontleavehmode\hbox
- {\color[cow:contour]{\hsmash{\getglyph{CowsLogoContour}{#1}}}%
- \color[cow:normal] {\getglyph{CowsLogo} {#1}}}}
-
-\def\CowLogo #1{\getglyph{CowsLogo} {\char#1\relax}}
-\def\CowContourLogo#1{\getglyph{CowsLogoContour}{\char#1\relax}}
-
-\chardef\CowPragmaNormal= 1
-\chardef\CowPragmaShaded=20
-
-\startsymbolset[cownormal]
-
-\definesymbol[CowPragmaADE] [\CowLogo{0}]
-\definesymbol[CowPragma] [\CowLogo{1}]
-\definesymbol[CowConTeXt] [\CowLogo{2}]
-\definesymbol[CowConTeXtComplete] [\CowLogo{3}]
-\definesymbol[CowConTeXtShadow] [\CowLogo{4}]
-\definesymbol[CowConTeXtContour] [\CowLogo{5}]
-\definesymbol[CowConTeXtOutline] [\CowLogo{6}]
-\definesymbol[CowConTeXtDots] [\CowLogo{7}]
-\definesymbol[CowMP] [\CowLogo{8}]
-\definesymbol[CowMPComplete] [\CowLogo{9}]
-\definesymbol[CowTeX] [\CowLogo{10}]
-\definesymbol[CowTeXComplete] [\CowLogo{11}]
-\definesymbol[CowBoo] [\CowLogo{12}]
-\definesymbol[CowCow] [\CowLogo{13}]
-\definesymbol[CowExampleComplete] [\CowLogo{14}]
-\definesymbol[CowFoxetComplete] [\CowLogo{15}]
-\definesymbol[CowMetafun] [\CowLogo{16}]
-\definesymbol[CowMetafunComplete] [\CowLogo{17}]
-\definesymbol[CowTEXComplete] [\CowLogo{18}]
-\definesymbol[CowWikiComplete] [\CowLogo{19}]
-\definesymbol[CowPragmaADEComplete][\CowLogo{20}]
-\definesymbol[CowPragmaComplete] [\CowLogo{21}]
-\definesymbol[CowExample] [\CowLogo{22}]
-\definesymbol[CowFoxet] [\CowLogo{23}]
-\definesymbol[CowTEX] [\CowLogo{24}]
-\definesymbol[CowWiki] [\CowLogo{25}]
-\definesymbol[CowCowTeXtComplete] [\CowLogo{26}]
-\definesymbol[CowCowTeXt] [\CowLogo{27}]
-
-\stopsymbolset
-
-\startsymbolset[cowcontour]
-
-\definesymbol[CowPragmaADE] [\CowContourLogo{0}]
-\definesymbol[CowPragma] [\CowContourLogo{1}]
-\definesymbol[CowConTeXt] [\CowContourLogo{2}]
-\definesymbol[CowConTeXtComplete] [\CowContourLogo{3}]
-\definesymbol[CowConTeXtShadow] [\CowContourLogo{4}]
-\definesymbol[CowConTeXtContour] [\CowContourLogo{5}]
-\definesymbol[CowConTeXtOutline] [\CowContourLogo{6}]
-\definesymbol[CowConTeXtDots] [\CowContourLogo{7}]
-\definesymbol[CowMP] [\CowContourLogo{8}]
-\definesymbol[CowMPComplete] [\CowContourLogo{9}]
-\definesymbol[CowTeX] [\CowContourLogo{10}]
-\definesymbol[CowTeXComplete] [\CowContourLogo{11}]
-\definesymbol[CowBoo] [\CowContourLogo{12}]
-\definesymbol[CowCow] [\CowContourLogo{13}]
-\definesymbol[CowExampleComplete] [\CowContourLogo{14}]
-\definesymbol[CowFoxetComplete] [\CowContourLogo{15}]
-\definesymbol[CowMetafun] [\CowContourLogo{16}]
-\definesymbol[CowMetafunComplete] [\CowContourLogo{17}]
-\definesymbol[CowTEXComplete] [\CowContourLogo{18}]
-\definesymbol[CowWikiComplete] [\CowContourLogo{19}]
-\definesymbol[CowPragmaADEComplete][\CowContourLogo{20}]
-\definesymbol[CowPragmaComplete] [\CowContourLogo{21}]
-\definesymbol[CowExample] [\CowContourLogo{22}]
-\definesymbol[CowFoxet] [\CowContourLogo{23}]
-\definesymbol[CowTEX] [\CowContourLogo{24}]
-\definesymbol[CowWiki] [\CowContourLogo{25}]
-\definesymbol[CowCowTeXtComplete] [\CowContourLogo{26}]
-\definesymbol[CowCowTeXt] [\CowContourLogo{27}]
-
-\stopsymbolset
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/symb-eur.tex b/Master/texmf-dist/tex/context/base/symb-eur.mkii
index 400e88ac5cd..400e88ac5cd 100644
--- a/Master/texmf-dist/tex/context/base/symb-eur.tex
+++ b/Master/texmf-dist/tex/context/base/symb-eur.mkii
diff --git a/Master/texmf-dist/tex/context/base/symb-eur.mkiv b/Master/texmf-dist/tex/context/base/symb-eur.mkiv
new file mode 100644
index 00000000000..4ec5a8931cc
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/symb-eur.mkiv
@@ -0,0 +1,52 @@
+%D \module
+%D [ file=symb-eur,
+%D version=2000.06.22,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Adobe Euro Symbols,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\definefontsynonym [EuroSerif] [eurose]
+\definefontsynonym [EuroSerifBold] [euroseb]
+\definefontsynonym [EuroSerifItalic] [eurosei]
+\definefontsynonym [EuroSerifSlanted] [eurosei]
+\definefontsynonym [EuroSerifBoldItalic] [eurosebi]
+\definefontsynonym [EuroSerifBoldSlanted] [eurosebi]
+
+\definefontsynonym [EuroSans] [eurosa]
+\definefontsynonym [EuroSansBold] [eurosab]
+\definefontsynonym [EuroSansItalic] [eurosai]
+\definefontsynonym [EuroSansSlanted] [eurosai]
+\definefontsynonym [EuroSansBoldItalic] [eurosabi]
+\definefontsynonym [EuroSansBoldSlanted] [eurosabi]
+
+\definefontsynonym [EuroMono] [euromo]
+\definefontsynonym [EuroMonoBold] [euromob]
+\definefontsynonym [EuroMonoSlanted] [euromoi]
+\definefontsynonym [EuroMonoItalic] [euromoi]
+\definefontsynonym [EuroMonoBoldItalic] [euromobi]
+\definefontsynonym [EuroMonoBoldSlanted] [euromobi]
+
+\definesymbol [euro] [\getglyph{Euro}{\fontchar{Euro.127}}]
+
+% \unexpanded\def\euro{\doiftextelse\texteuro\texteuro{\symbol[euro]}}
+
+%D The next table shows the complete set of symbols:
+%D
+%D \starttabulate[|l|c|c|c|c|c|c|]
+%D \NC \NC \tex{tf} \NC \tex{bf} \NC \tex{sl}
+%D \NC \tex{it} \NC \tex{bs} \NC \tex{bi} \NC\NR
+%D \NC \rm Serif \NC \rm\tf\euro \NC \rm\bf\euro \NC \rm\sl\euro
+%D \NC \rm\it\euro \NC \rm\bs\euro \NC \rm\bi\euro \NC\NR
+%D \NC \ss Sans \NC \ss\tf\euro \NC \ss\bf\euro \NC \ss\sl\euro
+%D \NC \ss\it\euro \NC \ss\bs\euro \NC \ss\bi\euro \NC\NR
+%D \NC \tt Mono \NC \tt\tf\euro \NC \tt\bf\euro \NC \tt\sl\euro
+%D \NC \tt\it\euro \NC \tt\bs\euro \NC \tt\bi\euro \NC\NR
+%D \stoptabulate
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/symb-glm.tex b/Master/texmf-dist/tex/context/base/symb-glm.mkii
index 0b01ca7dfdb..0b01ca7dfdb 100644
--- a/Master/texmf-dist/tex/context/base/symb-glm.tex
+++ b/Master/texmf-dist/tex/context/base/symb-glm.mkii
diff --git a/Master/texmf-dist/tex/context/base/symb-ini.lua b/Master/texmf-dist/tex/context/base/symb-ini.lua
new file mode 100644
index 00000000000..1bc8ee2aaaf
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/symb-ini.lua
@@ -0,0 +1,38 @@
+if not modules then modules = { } end modules ['symb-ini'] = {
+ version = 1.001,
+ comment = "companion to symb-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+
+local variables = interfaces.variables
+
+fonts.symbols = fonts.symbols or { }
+local symbols = fonts.symbols
+
+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
+
+function symbols.uselibrary(name)
+ if name ~= variables.reset then
+ for name in listitem(name) do
+ commands.uselibrary(name,patterns,function(name,foundname)
+ -- context.startnointerference()
+ context.startreadingfile()
+ context.input(foundname)
+ status_symbols("loaded: library '%s'",name)
+ context.stopreadingfile()
+ -- context.stopnointerference()
+ end, function(name)
+ report_symbols("unknown: library '%s'",name)
+ end)
+ end
+ end
+end
+
+commands.usesymbols = symbols.uselibrary
diff --git a/Master/texmf-dist/tex/context/base/symb-ini.mkii b/Master/texmf-dist/tex/context/base/symb-ini.mkii
index f7bffd240f8..1df1fe68822 100644
--- a/Master/texmf-dist/tex/context/base/symb-ini.mkii
+++ b/Master/texmf-dist/tex/context/base/symb-ini.mkii
@@ -233,7 +233,7 @@
\let\currentsymboldef\empty
-\def\startsymbolset[#1]
+\def\startsymbolset[#1]%
{\def\currentsymboldef{#1}}
\def\stopsymbolset
@@ -255,7 +255,7 @@
%D
%D \showsetup{showsymbolset}
-\fetchruntimecommand \showsymbolset {\f!symbolprefix\s!run.mkii}
+\fetchruntimecommand \showsymbolset {\f!symbolprefix\s!run}
%D \macros
%D {usesymbols}
@@ -263,11 +263,12 @@
%D \showsetup{usesymbols}
\def\dousesymbols#1%
- {\makeshortfilename[\truefilename{\f!symbolprefix#1}]%
- \startreadingfile
- \readsysfile\shortfilename
+ {\startreadingfile
+ \readsysfile{\truefilename{\f!symbolprefix#1}.\mksuffix}
{\showmessage\m!symbols1{#1}}
- \donothing
+ {\readsysfile{\truefilename{\f!symbolprefix#1}}
+ {\showmessage\m!symbols1{#1}}
+ \donothing}%
\stopreadingfile}
\def\usesymbols[#1]%
diff --git a/Master/texmf-dist/tex/context/base/symb-ini.mkiv b/Master/texmf-dist/tex/context/base/symb-ini.mkiv
index f4f6bdd7965..8282649b033 100644
--- a/Master/texmf-dist/tex/context/base/symb-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/symb-ini.mkiv
@@ -17,6 +17,8 @@
\writestatus{loading}{ConTeXt Symbol Libraries / Initialization}
+\registerctxluafile{symb-ini}{1.001}
+
\unprotect
%D \macros
@@ -48,14 +50,6 @@
\unexpanded\def\definesymbol
{\dotripleempty\dodefinesymbol}
-% \def\dodefinesymbol[#1][#2][#3]% class name meaning
-% {\ifthirdargument
-% \setvalue{\??ss:#1:#2}{#3}%
-% \doifsomething{#1}{\addvalue{\??ss*#1}{#2}}%
-% \else
-% \setvalue{\??ss:\currentsymboldef:#1}{#2}%
-% \fi}
-
\def\dodefinesymbol[#1][#2][#3]% class name meaning
{\ifthirdargument
\setvalue{\??ss:#1:#2}{#3}%
@@ -65,11 +59,19 @@
\addvalue{\??ss*\currentsymboldef}{#1}%
\fi}
-\def\doifinsymbolsetelse#1#2{\doifdefinedelse{\??ss:#1:#2}}
-\def\doifinsymbolset #1#2{\doifdefined {\??ss:#1:#2}}
-\def\doifsymbolsetelse #1{\doifdefinedelse{\??ss*#1}}
+% \def\doifinsymbolsetelse#1#2{\doifdefinedelse{\??ss:#1:#2}}
+% \def\doifinsymbolset #1#2{\doifdefined {\??ss:#1:#2}}
+% \def\doifsymbolsetelse #1{\doifdefinedelse{\??ss*#1}}
+%
+% \def\symbolset#1{\executeifdefined{\??ss*#1}\empty} % no [#1], to be used in commalists etc
+
+\def\doifinsymbolsetelse#1#2{\ifcsname\??ss:#1:#2\endcsname\@EA\firstoftwoarguments\else\@EA\secondoftwoarguments\fi}
+\def\doifinsymbolset #1#2{\ifcsname\??ss:#1:#2\endcsname\@EA\firstofoneargument \else\@EA\gobbleoneargument \fi}
+\def\doifsymbolsetelse #1{\ifcsname\??ss*#1\endcsname \@EA\firstoftwoarguments\else\@EA\secondoftwoarguments\fi}
+
+\letvalue{\??ss*}\empty
-\def\symbolset#1{\executeifdefined{\??ss*#1}\empty} % no [#1], to be used in commalists etc
+\def\symbolset#1{\csname\??ss*\ifcsname\??ss*#1\endcsname#1\fi\endcsname} % no [#1], to be used in commalists etc
%D Since symbols are used frequently in interactive
%D documents, we speed up this one. Well, that was history,
@@ -84,8 +86,11 @@
\def\dodosymbol#1#2% \relax's prevent lookahead problems
{\nosymbolfalse{\the\everysymbol\csname\??ss:#1:#2\endcsname\relax}\relax}
+\letvalue{\??ss:}\firstofoneargument
+
\def\directsymbol#1#2% no \relax, there can be an argument, see lists
- {\executeifdefined{\??ss:#1:#2}\firstofoneargument}
+ {%\executeifdefined{\??ss:#1:#2}\firstofoneargument}
+ \csname\??ss:\ifcsname\??ss:#1:#2\endcsname#1:#2\fi\endcsname}
% We support both:
%
@@ -125,12 +130,8 @@
\fi}
\def\redosymbol#1%
-% {\doifinsymbolsetelse\empty{#1}{\dodosymbol\empty{#1}}{#1}} % more efficient:
{\doifinsymbolsetelse\empty{#1}{\dodosymbol\empty}\firstofoneargument{#1}}
-% % % % %
-% this should go in symb-fig, to be loaded after core-fig
-
%D \macros
%D {definefiguresymbol}
%D
@@ -163,12 +164,6 @@
\definesymbol[#1][{\dofiguresymbol[#2][#3]}]%
\fi}
-% but for the moment we keep it here
-% % % % % %
-
-%\def\objectsymbol[#1]%
-% {\dopresetfieldsymbol{#1}\dogetfieldsymbol{#1}}
-
%D \macros
%D {doifsymboldefinedelse}
%D
@@ -233,7 +228,7 @@
\let\currentsymboldef\empty
-\unexpanded\def\startsymbolset[#1]
+\unexpanded\def\startsymbolset[#1]%
{\def\currentsymboldef{#1}}
\unexpanded\def\stopsymbolset
@@ -255,23 +250,14 @@
%D
%D \showsetup{showsymbolset}
-\fetchruntimecommand \showsymbolset {\f!symbolprefix\s!run.mkiv}
+\fetchruntimecommand \showsymbolset {\f!symbolprefix\s!run}
%D \macros
%D {usesymbols}
%D
%D \showsetup{usesymbols}
-\def\dousesymbols#1%
- {\makeshortfilename[\truefilename{\f!symbolprefix#1}]%
- \startreadingfile
- \readsysfile\shortfilename
- {\showmessage\m!symbols1{#1}}
- \donothing
- \stopreadingfile}
-
-\def\usesymbols[#1]%
- {\processcommalist[#1]\dousesymbols}
+\def\usesymbols[#1]{\ctxcommand{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/symb-jmn.tex b/Master/texmf-dist/tex/context/base/symb-jmn.mkii
index 1ed65d16e60..392cac55260 100644
--- a/Master/texmf-dist/tex/context/base/symb-jmn.tex
+++ b/Master/texmf-dist/tex/context/base/symb-jmn.mkii
@@ -40,13 +40,8 @@
\loadmapfile[original-base.map] % \loadmapfile [original-context-symbol.map]
-\ifnum\texengine=\luatexengine
- \definefontsynonym[NavigationNormal] [hans.tfm]
- \definefontsynonym[NavigationShadowed] [hans-sh.tfm]
-\else
- \definefontsynonym[NavigationNormal] [hans]
- \definefontsynonym[NavigationShadowed] [hans-sh]
-\fi
+\definefontsynonym[NavigationNormal] [hans]
+\definefontsynonym[NavigationShadowed] [hans-sh]
\definefontsynonym[NavigationFont] [NavigationNormal]
%definefontsynonym[NavigationFont] [NavigationShadowed]
diff --git a/Master/texmf-dist/tex/context/base/symb-jmn.mkiv b/Master/texmf-dist/tex/context/base/symb-jmn.mkiv
new file mode 100644
index 00000000000..593e3e375bf
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/symb-jmn.mkiv
@@ -0,0 +1,196 @@
+%D \module
+%D [ file=symb-jmn,
+%D version=2004.08.02,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Special Navigational Symbols,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA ADE]
+%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 file defines a few navigational symbol vectors. The font used
+%D here is designed by Janusz M.~Nowacki, one of the Polish Font
+%D Gurus who made this font specially for me, hence the name. If you
+%D you want to meet its designer, come to Bachotek! In case you're
+%D not familiar with his work, take a look at the Antikwa, Iwona and
+%D Kurier fonts!
+%D
+%D \usesymbols[jmn]
+%D
+%D \showsymbolset[navigation 1]
+%D \showsymbolset[navigation 3]
+%D \showsymbolset[navigation 2]
+%D \showsymbolset[navigation 4]
+%D
+%D \page
+%D \showfont[NavigationNormal]
+%D \page
+%D \showfont[NavigationShadowed]
+%D \page
+
+% needed:
+%
+% - inverted crossed
+% - curved diamond
+% - begin/end bars
+
+\unprotect
+
+\definefontsynonym[NavigationNormal] [hans]
+\definefontsynonym[NavigationShadowed] [hans-sh]
+
+\definefontsynonym[NavigationFont] [NavigationNormal]
+%definefontsynonym[NavigationFont] [NavigationShadowed]
+
+\def\NavigationGlyph{\getnamedglyphdirect{NavigationFont}} % #1
+
+\unprotect
+
+% lowercase up/down
+
+\startsymbolset [navigation 1]
+
+ \definesymbol [\v!PreviousJump] [\NavigationGlyph{CC}]
+ \definesymbol [\v!NextJump] [\NavigationGlyph{DD}]
+ \definesymbol [\v!CloseDocument] [\NavigationGlyph{M}]
+
+ \definesymbol [\v!firstpage] [\NavigationGlyph{CCC}]
+ \definesymbol [\v!previouspage] [\NavigationGlyph{C}]
+ \definesymbol [\v!nextpage] [\NavigationGlyph{D}]
+ \definesymbol [\v!lastpage] [\NavigationGlyph{DDD}]
+
+ \definesymbol [\v!firstsubpage] [\NavigationGlyph{ccc}]
+ \definesymbol [\v!previoussubpage] [\NavigationGlyph{c}]
+ \definesymbol [\v!nextsubpage] [\NavigationGlyph{d}]
+ \definesymbol [\v!lastsubpage] [\NavigationGlyph{ddd}]
+
+ \definesymbol [\v!StartSound] [\NavigationGlyph{D}]
+ \definesymbol [\v!PauseSound] [\NavigationGlyph{YY}]
+ \definesymbol [\v!StopSound] [\NavigationGlyph{M}]
+
+ \definesymbol [\v!StartMovie] [\NavigationGlyph{D}]
+ \definesymbol [\v!PauseMovie] [\NavigationGlyph{YY}]
+ \definesymbol [\v!StopMovie] [\NavigationGlyph{M}]
+
+ \definesymbol [\v!StartRendering] [\NavigationGlyph{D}]
+ \definesymbol [\v!PauseRendering] [\NavigationGlyph{YY}]
+ \definesymbol [\v!StopRendering] [\NavigationGlyph{M}]
+ \definesymbol [\v!ResumeRendering] [\NavigationGlyph{D}]
+
+\stopsymbolset
+
+\startsymbolset [navigation 2]
+
+ \definesymbol [\v!PreviousJump] [\NavigationGlyph{AA}]
+ \definesymbol [\v!NextJump] [\NavigationGlyph{BB}]
+ \definesymbol [\v!CloseDocument] [\NavigationGlyph{N}]
+
+ \definesymbol [\v!firstpage] [\NavigationGlyph{AAA}]
+ \definesymbol [\v!previouspage] [\NavigationGlyph{A}]
+ \definesymbol [\v!nextpage] [\NavigationGlyph{B}]
+ \definesymbol [\v!lastpage] [\NavigationGlyph{BBB}]
+
+ \definesymbol [\v!firstsubpage] [\NavigationGlyph{aaa}]
+ \definesymbol [\v!previoussubpage] [\NavigationGlyph{a}]
+ \definesymbol [\v!nextsubpage] [\NavigationGlyph{b}]
+ \definesymbol [\v!lastsubpage] [\NavigationGlyph{bbb}]
+
+ \definesymbol [\v!StartSound] [\NavigationGlyph{B}]
+ \definesymbol [\v!PauseSound] [\NavigationGlyph{XX}]
+ \definesymbol [\v!StopSound] [\NavigationGlyph{N}]
+
+ \definesymbol [\v!StartMovie] [\NavigationGlyph{B}]
+ \definesymbol [\v!PauseMovie] [\NavigationGlyph{XX}]
+ \definesymbol [\v!StopMovie] [\NavigationGlyph{N}]
+
+ \definesymbol [\v!StartRendering] [\NavigationGlyph{B}]
+ \definesymbol [\v!PauseRendering] [\NavigationGlyph{XX}]
+ \definesymbol [\v!StopRendering] [\NavigationGlyph{N}]
+ \definesymbol [\v!ResumeRendering] [\NavigationGlyph{B}]
+
+\stopsymbolset
+
+\startsymbolset [navigation 3]
+
+ \definesymbol [\v!PreviousJump] [\NavigationGlyph{KK}]
+ \definesymbol [\v!NextJump] [\NavigationGlyph{LL}]
+ \definesymbol [\v!CloseDocument] [\NavigationGlyph{M}]
+
+ \definesymbol [\v!firstpage] [\NavigationGlyph{KKK}]
+ \definesymbol [\v!previouspage] [\NavigationGlyph{K}]
+ \definesymbol [\v!nextpage] [\NavigationGlyph{L}]
+ \definesymbol [\v!lastpage] [\NavigationGlyph{LLL}]
+
+ \definesymbol [\v!firstsubpage] [\NavigationGlyph{kkk}]
+ \definesymbol [\v!previoussubpage] [\NavigationGlyph{k}]
+ \definesymbol [\v!nextsubpage] [\NavigationGlyph{l}]
+ \definesymbol [\v!lastsubpage] [\NavigationGlyph{lll}]
+
+ \definesymbol [\v!StartSound] [\NavigationGlyph{L}]
+ \definesymbol [\v!PauseSound] [\NavigationGlyph{YY}]
+ \definesymbol [\v!StopSound] [\NavigationGlyph{M}]
+
+ \definesymbol [\v!StartMovie] [\NavigationGlyph{L}]
+ \definesymbol [\v!PauseMovie] [\NavigationGlyph{YY}]
+ \definesymbol [\v!StopMovie] [\NavigationGlyph{M}]
+
+ \definesymbol [\v!StartRendering] [\NavigationGlyph{L}]
+ \definesymbol [\v!PauseRendering] [\NavigationGlyph{YY}]
+ \definesymbol [\v!StopRendering] [\NavigationGlyph{M}]
+ \definesymbol [\v!ResumeRendering] [\NavigationGlyph{L}]
+
+\stopsymbolset
+
+\startsymbolset [navigation 4]
+
+ \definesymbol [\v!PreviousJump] [\NavigationGlyph{II}]
+ \definesymbol [\v!NextJump] [\NavigationGlyph{JJ}]
+ \definesymbol [\v!CloseDocument] [\NavigationGlyph{N}]
+
+ \definesymbol [\v!firstpage] [\NavigationGlyph{III}]
+ \definesymbol [\v!previouspage] [\NavigationGlyph{I}]
+ \definesymbol [\v!nextpage] [\NavigationGlyph{J}]
+ \definesymbol [\v!lastpage] [\NavigationGlyph{JJJ}]
+
+ \definesymbol [\v!firstsubpage] [\NavigationGlyph{iii}]
+ \definesymbol [\v!previoussubpage] [\NavigationGlyph{i}]
+ \definesymbol [\v!nextsubpage] [\NavigationGlyph{j}]
+ \definesymbol [\v!lastsubpage] [\NavigationGlyph{jjj}]
+
+ \definesymbol [\v!StartSound] [\NavigationGlyph{J}]
+ \definesymbol [\v!PauseSound] [\NavigationGlyph{XX}]
+ \definesymbol [\v!StopSound] [\NavigationGlyph{N}]
+
+ \definesymbol [\v!StartMovie] [\NavigationGlyph{J}]
+ \definesymbol [\v!PauseMovie] [\NavigationGlyph{XX}]
+ \definesymbol [\v!StopMovie] [\NavigationGlyph{N}]
+
+ \definesymbol [\v!StartRendering] [\NavigationGlyph{J}]
+ \definesymbol [\v!PauseRendering] [\NavigationGlyph{XX}]
+ \definesymbol [\v!StopRendering] [\NavigationGlyph{N}]
+ \definesymbol [\v!ResumeRendering] [\NavigationGlyph{J}]
+
+\stopsymbolset
+
+% 1 left : 065 067 073 075
+% 2 left : 128 132 144 148
+% 3 left : 129 133 145 149
+
+% 1 right : 066 068 074 076
+% 2 right : 130 134 146 150
+% 3 right : 131 135 147 151
+
+% crossed : 160 160 160 160
+% opened : 152 152 156 156
+% closed : 154 154 158 158
+
+% larrow : 208 210 212 214
+% rarrow : 209 211 213 215
+% barrow : 178 178 178 178
+% ocircle : 168 168 168 168
+% ccircle : 170 170 170 170
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/symb-mis.tex b/Master/texmf-dist/tex/context/base/symb-mis.mkii
index d108b89028e..9921fa94fb1 100644
--- a/Master/texmf-dist/tex/context/base/symb-mis.tex
+++ b/Master/texmf-dist/tex/context/base/symb-mis.mkii
@@ -31,14 +31,14 @@
\definesymbol [medcircle] [\hbox{\raise.1ex\hbox{\mathematics{\scriptstyle \bigcirc}}}]
\definesymbol [bigcircle] [\mathematics{\bigcirc}]
-\definesymbol [1] [{\symbol[bullet]}]
-\definesymbol [2] [{\symbol[dash]}]
-\definesymbol [3] [{\symbol[star]}]
-\definesymbol [4] [{\symbol[triangle]}]
-\definesymbol [5] [{\symbol[circle]}]
-\definesymbol [6] [{\symbol[medcircle]}]
-\definesymbol [7] [{\symbol[bigcircle]}]
-\definesymbol [8] [{\symbol[square]}]
+\definesymbol [1] [\symbol{bullet}]
+\definesymbol [2] [\symbol{dash}]
+\definesymbol [3] [\symbol{star}]
+\definesymbol [4] [\symbol{triangle}]
+\definesymbol [5] [\symbol{circle}]
+\definesymbol [6] [\symbol{medcircle}]
+\definesymbol [7] [\symbol{bigcircle}]
+\definesymbol [8] [\symbol{square}]
%D Special hyperlinks, namely those to pages or navigational
%D properties, are associated with symbols.
@@ -55,15 +55,15 @@
\definesymbol [\v!NextJump] [\goforjumpcharacter]
\definesymbol [\v!CloseDocument] [\closecharacter]
-\definesymbol [\v!first] [{\symbol[\v!firstpage]}]
-\definesymbol [\v!previous] [{\symbol[\v!previouspage]}]
-\definesymbol [\v!next] [{\symbol[\v!nextpage]}]
-\definesymbol [\v!last] [{\symbol[\v!lastpage]}]
+\definesymbol [\v!first] [\symbol{\v!firstpage}]
+\definesymbol [\v!previous] [\symbol{\v!previouspage}]
+\definesymbol [\v!next] [\symbol{\v!nextpage}]
+\definesymbol [\v!last] [\symbol{\v!lastpage}]
\definesymbol [\v!somewhere] [\gotosomewherecharacter]
\definesymbol [\v!nowhere] [\gonowherecharacter]
-\definesymbol [\v!backward] [{\symbol[\v!previouspage]}]
-\definesymbol [\v!forward] [{\symbol[\v!nextpage]}]
+\definesymbol [\v!backward] [\symbol{\v!previouspage}]
+\definesymbol [\v!forward] [\symbol{\v!nextpage}]
%D The next two symbols (\symbol[P] and \symbol[S]) are
%D variations in their math counterparts. The following ones
diff --git a/Master/texmf-dist/tex/context/base/symb-mis.mkiv b/Master/texmf-dist/tex/context/base/symb-mis.mkiv
new file mode 100644
index 00000000000..612886daa37
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/symb-mis.mkiv
@@ -0,0 +1,76 @@
+%D \module
+%D [ file=symb-mis,
+%D version=2002.05.07,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Miscelaneous,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA-ADE]
+%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
+
+%D We predefine some common symbols and conversions that will
+%D be understood by many commands. The \type {\mathematics}
+%D is no longer needed, although only math fonts might have
+%D these symbols.
+
+\definesymbol [\v!none] []
+
+\definesymbol [bullet] [\mathematics{\bullet}]
+\definesymbol [dash] [\mathematics{-}]
+\definesymbol [star] [\mathematics{\star}]
+\definesymbol [triangle] [\mathematics{\triangleright}]
+\definesymbol [circle] [\mathematics{\circ}]
+\definesymbol [square] [\mathematics{\square}]
+\definesymbol [diamond] [\mathematics{\diamond}]
+
+% I'm not sure about this ... I dislike the small bullet. So we provide
+% it as variant: \type {\setupsymbolset[text]}. Also, we want to be
+% backward compatible.
+
+\startsymbolset[text]
+
+ \definesymbol [bullet] [\textormathchar{"2022}] % • \bullet
+ \definesymbol [dash] [\textormathchar{"2013}] % –
+ \definesymbol [star] [\textormathchar{"22C6}] % ✴ \star
+ \definesymbol [triangle] [\textormathchar{"22B3}] % ⊳ \triangleright
+ \definesymbol [circle] [\textormathchar{"2218}] % ∘ \circ
+ \definesymbol [square] [\textormathchar{"25A1}] % □ \square
+ \definesymbol [diamond] [\textormathchar{"22C4}] % ⋄ \diamond
+ \definesymbol [checkmark] [\textormathchar{"2713}] % ✓ \checkmark
+
+ \definesymbol [blacktriangle] [\textormathchar{"25B6}] % ▶
+ \definesymbol [blacksquare] [\textormathchar{"25A0}] % ■
+ \definesymbol [blackdiamond] [\textormathchar{"25C6}] % ◆
+
+\stopsymbolset
+
+\definesymbol [smallcircle] [\hbox{\raise.1ex\hbox{\mathematics{\scriptscriptstyle\bigcirc}}}]
+\definesymbol [medcircle] [\hbox{\raise.1ex\hbox{\mathematics{\scriptstyle \bigcirc}}}]
+\definesymbol [bigcircle] [\mathematics{\bigcirc}]
+
+\definesymbol [1] [\symbol{bullet}]
+\definesymbol [2] [\symbol{dash}]
+\definesymbol [3] [\symbol{star}]
+\definesymbol [4] [\symbol{triangle}]
+\definesymbol [5] [\symbol{circle}]
+\definesymbol [6] [\symbol{medcircle}]
+\definesymbol [7] [\symbol{bigcircle}]
+\definesymbol [8] [\symbol{square}]
+
+\definesymbol [S] [\sectionmark]
+\definesymbol [P] [\paragraphmark]
+\definesymbol [Numero] [\textnumero]
+\definesymbol [numero] [\textnumero]
+\definesymbol [euro] [\texteuro]
+
+\let\euro\texteuro
+
+\def\Numero{\symbol[Numero]} % obsolete
+\def\numero{\symbol[numero]} % obsolete
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/symb-mvs.tex b/Master/texmf-dist/tex/context/base/symb-mvs.mkii
index 1dd3da0a00c..1dd3da0a00c 100644
--- a/Master/texmf-dist/tex/context/base/symb-mvs.tex
+++ b/Master/texmf-dist/tex/context/base/symb-mvs.mkii
diff --git a/Master/texmf-dist/tex/context/base/symb-mvs.mkiv b/Master/texmf-dist/tex/context/base/symb-mvs.mkiv
new file mode 100644
index 00000000000..312a50a8898
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/symb-mvs.mkiv
@@ -0,0 +1,263 @@
+%D \module
+%D [ file=symb-mvs,
+%D version=2010.12.08, % 2000.03.30,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Martin Vogels Symbole,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\definefontsynonym [MartinVogel] [marvosym.ttf]
+
+\def\MartinVogelSymbol{\getnamedglyphdirect{MartinVogel}} % #1
+
+\startsymbolset [astronomic]
+
+ \definesymbol [Sun] [\MartinVogelSymbol{Sun}]
+ \definesymbol [Moon] [\MartinVogelSymbol{Moon}]
+ \definesymbol [Mercury] [\MartinVogelSymbol{Mercury}]
+ \definesymbol [Venus] [\MartinVogelSymbol{Venus}]
+ \definesymbol [Mars] [\MartinVogelSymbol{Mars}]
+ \definesymbol [Jupiter] [\MartinVogelSymbol{Jupiter}]
+ \definesymbol [Saturn] [\MartinVogelSymbol{Saturn}]
+ \definesymbol [Uranus] [\MartinVogelSymbol{Uranus}]
+ \definesymbol [Neptune] [\MartinVogelSymbol{Neptune}]
+ \definesymbol [Pluto] [\MartinVogelSymbol{Pluto}]
+
+\stopsymbolset
+
+\startsymbolset [zodiac]
+
+ \definesymbol [Aries] [\MartinVogelSymbol{Aries}]
+ \definesymbol [Taurus] [\MartinVogelSymbol{Taurus}]
+ \definesymbol [Gemini] [\MartinVogelSymbol{Gemini}]
+ \definesymbol [Cancer] [\MartinVogelSymbol{Cancer}]
+ \definesymbol [Leo] [\MartinVogelSymbol{Leo}]
+ \definesymbol [Virgo] [\MartinVogelSymbol{Virgo}]
+ \definesymbol [Libra] [\MartinVogelSymbol{Libra}]
+ \definesymbol [Scorpio] [\MartinVogelSymbol{Scorpio}]
+ \definesymbol [Sagittarius] [\MartinVogelSymbol{Sagittarius}]
+ \definesymbol [Capricorn] [\MartinVogelSymbol{Capricorn}]
+ \definesymbol [Aquarius] [\MartinVogelSymbol{Aquarius}]
+ \definesymbol [Pisces] [\MartinVogelSymbol{Pisces}]
+
+\stopsymbolset
+
+\startsymbolset [europe]
+
+ \definesymbol [EUR] [\MartinVogelSymbol{EUR}]
+ \definesymbol [EURhv] [\MartinVogelSymbol{EurHv}]
+ \definesymbol [EURcr] [\MartinVogelSymbol{EurCr}]
+ \definesymbol [EURtm] [\MartinVogelSymbol{EurTm}]
+ \definesymbol [EURdig] [\MartinVogelSymbol{EurDig}]
+ \definesymbol [CEsign] [\MartinVogelSymbol{CESign}]
+
+\stopsymbolset
+
+\startsymbolset [martinvogel 1]
+
+ \definesymbol [MVZero] [\MartinVogelSymbol{MVZero}]
+ \definesymbol [MVOne] [\MartinVogelSymbol{MVOne}]
+ \definesymbol [MVTwo] [\MartinVogelSymbol{MVTwo}]
+ \definesymbol [MVThree] [\MartinVogelSymbol{MVThree}]
+ \definesymbol [MVFour] [\MartinVogelSymbol{MVFour}]
+ \definesymbol [MVFive] [\MartinVogelSymbol{MVFive}]
+ \definesymbol [MVSix] [\MartinVogelSymbol{MVSix}]
+ \definesymbol [MVSeven] [\MartinVogelSymbol{MVSeven}]
+ \definesymbol [MVEight] [\MartinVogelSymbol{MVEight}]
+ \definesymbol [MVNine] [\MartinVogelSymbol{MVNine}]
+
+ \definesymbol [MVAt] [\MartinVogelSymbol{MVAt}]
+ \definesymbol [MVArrowDown] [\MartinVogelSymbol{MVArrowDown}]
+ \definesymbol [MVComma] [\MartinVogelSymbol{MVComma}]
+ \definesymbol [MVDivision] [\MartinVogelSymbol{MVDivision}]
+ \definesymbol [MVLeftBracket] [\MartinVogelSymbol{MVLeftBracket}]
+ \definesymbol [MVMinus] [\MartinVogelSymbol{MVMinus}]
+ \definesymbol [MVMultiplication] [\MartinVogelSymbol{MVMultiplication}]
+ \definesymbol [MVPeriod] [\MartinVogelSymbol{MVPeriod}]
+ \definesymbol [MVPlus] [\MartinVogelSymbol{MVPlus}]
+ \definesymbol [MVRightArrow] [\MartinVogelSymbol{MVRightArrow}]
+ \definesymbol [MVRightBracket] [\MartinVogelSymbol{MVRightBracket}]
+ \definesymbol [MVspace] [\MartinVogelSymbol{MVspace}]
+
+\stopsymbolset
+
+% Office signs, crosses, circles, arrows (names as in file)
+
+\startsymbolset [martinvogel 2]
+
+ \definesymbol [AngleSign] [\MartinVogelSymbol{AngleSign}]
+ \definesymbol [Ankh] [\MartinVogelSymbol{Ankh}]
+ \definesymbol [ArrowOver] [\MartinVogelSymbol{ArrowOver}]
+ \definesymbol [AtForty] [\MartinVogelSymbol{AtForty}]
+ \definesymbol [AtNinetyFive] [\MartinVogelSymbol{AtNinetyFive}]
+ \definesymbol [AtSixty] [\MartinVogelSymbol{AtSixty}]
+ %definesymbol [BOLogo] [\MartinVogelSymbol{BOLogo}]
+ %definesymbol [BOLogoL] [\MartinVogelSymbol{BOLogoL}]
+ %definesymbol [BOLogoP] [\MartinVogelSymbol{BOLogoP}]
+ \definesymbol [BSEFree] [\MartinVogelSymbol{BSEFree}]
+ \definesymbol [BarOver] [\MartinVogelSymbol{BarOver}]
+ \definesymbol [Bat] [\MartinVogelSymbol{Bat}]
+ \definesymbol [Beam] [\MartinVogelSymbol{Beam}]
+ \definesymbol [Bearing] [\MartinVogelSymbol{Bearing}]
+ \definesymbol [Bicycle] [\MartinVogelSymbol{Bicycle}]
+ \definesymbol [Biohazard] [\MartinVogelSymbol{Biohazard}]
+ \definesymbol [Bleech] [\MartinVogelSymbol{Bleech}]
+ \definesymbol [Bouquet] [\MartinVogelSymbol{Bouquet}]
+ \definesymbol [CeltCross] [\MartinVogelSymbol{CeltCross}]
+ \definesymbol [CheckedBox] [\MartinVogelSymbol{CheckedBox}]
+ \definesymbol [CircPipe] [\MartinVogelSymbol{CircPipe}]
+ \definesymbol [CircSteel] [\MartinVogelSymbol{CircSteel}]
+ \definesymbol [CircledA] [\MartinVogelSymbol{CircledA}]
+ \definesymbol [CleaningA] [\MartinVogelSymbol{CleaningA}]
+ \definesymbol [CleaningF] [\MartinVogelSymbol{CleaningF}]
+ \definesymbol [CleaningFF] [\MartinVogelSymbol{CleaningFF}]
+ \definesymbol [CleaningP] [\MartinVogelSymbol{CleaningP}]
+ \definesymbol [CleaningPP] [\MartinVogelSymbol{CleaningPP}]
+ \definesymbol [ClockLogo] [\MartinVogelSymbol{ClockLogo}]
+ \definesymbol [Coffeecup] [\MartinVogelSymbol{Coffeecup}]
+ \definesymbol [ComputerMouse] [\MartinVogelSymbol{ComputerMouse}]
+ \definesymbol [Conclusion] [\MartinVogelSymbol{Conclusion}]
+ \definesymbol [Congruent] [\MartinVogelSymbol{Congruent}]
+ \definesymbol [Corresponds] [\MartinVogelSymbol{Corresponds}]
+ \definesymbol [Cross] [\MartinVogelSymbol{Cross}]
+ \definesymbol [CrossedBox] [\MartinVogelSymbol{CrossedBox}]
+ \definesymbol [CutLeft] [\MartinVogelSymbol{CutLeft}]
+ \definesymbol [CutLine] [\MartinVogelSymbol{CutLine}]
+ \definesymbol [CutRight] [\MartinVogelSymbol{CutRight}]
+ \definesymbol [CuttingLine] [\MartinVogelSymbol{CuttingLine}]
+ \definesymbol [Deleatur] [\MartinVogelSymbol{Deleatur}]
+ \definesymbol [Divides] [\MartinVogelSymbol{Divides}]
+ \definesymbol [DividesNot] [\MartinVogelSymbol{DividesNot}]
+ \definesymbol [EMail] [\MartinVogelSymbol{EMail}]
+ \definesymbol [Earth] [\MartinVogelSymbol{Earth}]
+ \definesymbol [EmailCT] [\MartinVogelSymbol{EmailCT}]
+ \definesymbol [Equivalence] [\MartinVogelSymbol{Equivalence}]
+ \definesymbol [Estatically] [\MartinVogelSymbol{Estatically}]
+ \definesymbol [EstimatedSign] [\MartinVogelSymbol{EstimatedSign}]
+ \definesymbol [Explosionsafe] [\MartinVogelSymbol{Explosionsafe}]
+ \definesymbol [EyesDollar] [\MartinVogelSymbol{EyesDollar}]
+ \definesymbol [FAX] [\MartinVogelSymbol{FAX}]
+ \definesymbol [FEMALE] [\MartinVogelSymbol{FEMALE}]
+ \definesymbol [Fax] [\MartinVogelSymbol{Fax}]
+ \definesymbol [Female] [\MartinVogelSymbol{Female}]
+ \definesymbol [FemaleFemale] [\MartinVogelSymbol{FemaleFemale}]
+ \definesymbol [FemaleMale] [\MartinVogelSymbol{FemaleMale}]
+ \definesymbol [FixedBearing] [\MartinVogelSymbol{FixedBearing}]
+ \definesymbol [FlatSteel] [\MartinVogelSymbol{FlatSteel}]
+ \definesymbol [Florin] [\MartinVogelSymbol{Florin}]
+ \definesymbol [Football] [\MartinVogelSymbol{Football}]
+ \definesymbol [Forward] [\MartinVogelSymbol{Forward}]
+ \definesymbol [ForwardToEnd] [\MartinVogelSymbol{ForwardToEnd}]
+ \definesymbol [ForwardToIndex] [\MartinVogelSymbol{ForwardToIndex}]
+ \definesymbol [Frowny] [\MartinVogelSymbol{Frowny}]
+ \definesymbol [Gentsroom] [\MartinVogelSymbol{Gentsroom}]
+ \definesymbol [HERMAPHRODITE] [\MartinVogelSymbol{HERMAPHRODITE}]
+ \definesymbol [HandWash] [\MartinVogelSymbol{HandWash}]
+ \definesymbol [Heart] [\MartinVogelSymbol{Heart}]
+ \definesymbol [Hermaphrodite] [\MartinVogelSymbol{Hermaphrodite}]
+ \definesymbol [HexaSteel] [\MartinVogelSymbol{HexaSteel}]
+ \definesymbol [HollowBox] [\MartinVogelSymbol{HollowBox}]
+ \definesymbol [IRONING] [\MartinVogelSymbol{IRONING}]
+ \definesymbol [Industry] [\MartinVogelSymbol{Industry}]
+ \definesymbol [Info] [\MartinVogelSymbol{Info}]
+ \definesymbol [Ironing] [\MartinVogelSymbol{Ironing}]
+ \definesymbol [Keyboard] [\MartinVogelSymbol{Keyboard}]
+ \definesymbol [LSteel] [\MartinVogelSymbol{LSteel}]
+ \definesymbol [Ladiesroom] [\MartinVogelSymbol{Ladiesroom}]
+ \definesymbol [LargerOrEqual] [\MartinVogelSymbol{LargerOrEqual}]
+ \definesymbol [Laserbeam] [\MartinVogelSymbol{Laserbeam}]
+ \definesymbol [LeftScissors] [\MartinVogelSymbol{LeftScissors}]
+ \definesymbol [LeftTorque] [\MartinVogelSymbol{LeftTorque}]
+ \definesymbol [LessOrEqual] [\MartinVogelSymbol{LessOrEqual}]
+ \definesymbol [Letter] [\MartinVogelSymbol{Letter}]
+ \definesymbol [Lightning] [\MartinVogelSymbol{Lightning}]
+ \definesymbol [Lineload] [\MartinVogelSymbol{Lineload}]
+ \definesymbol [LooseBearing] [\MartinVogelSymbol{LooseBearing}]
+ \definesymbol [MALE] [\MartinVogelSymbol{MALE}]
+ \definesymbol [Male] [\MartinVogelSymbol{Male}]
+ \definesymbol [MaleMale] [\MartinVogelSymbol{MaleMale}]
+ \definesymbol [ManFace] [\MartinVogelSymbol{ManFace}]
+ \definesymbol [MineSign] [\MartinVogelSymbol{MineSign}]
+ \definesymbol [Mobilefone] [\MartinVogelSymbol{Mobilefone}]
+ \definesymbol [MoveDown] [\MartinVogelSymbol{MoveDown}]
+ \definesymbol [MoveUp] [\MartinVogelSymbol{MoveUp}]
+ \definesymbol [MultiplicationDot] [\MartinVogelSymbol{MultiplicationDot}]
+ \definesymbol [Mundus] [\MartinVogelSymbol{Mundus}]
+ \definesymbol [Neutral] [\MartinVogelSymbol{Neutral}]
+ \definesymbol [NoBleech] [\MartinVogelSymbol{NoBleech}]
+ \definesymbol [NoBreakSpace] [\MartinVogelSymbol{NoBreakSpace}]
+ \definesymbol [NoChemicalCleaning] [\MartinVogelSymbol{NoChemicalCleaning}]
+ \definesymbol [NoIroning] [\MartinVogelSymbol{NoIroning}]
+ \definesymbol [NoTumbler] [\MartinVogelSymbol{NoTumbler}]
+ \definesymbol [NoWash] [\MartinVogelSymbol{NoWash}]
+ \definesymbol [NotCongruent] [\MartinVogelSymbol{NotCongruent}]
+ \definesymbol [OktoSteel] [\MartinVogelSymbol{OktoSteel}]
+ \definesymbol [PackingWaste] [\MartinVogelSymbol{PackingWaste}]
+ \definesymbol [ParallelPort] [\MartinVogelSymbol{ParallelPort}]
+ \definesymbol [PeaceDove] [\MartinVogelSymbol{PeaceDove}]
+ \definesymbol [Pfund] [\MartinVogelSymbol{Pfund}]
+ \definesymbol [Pickup] [\MartinVogelSymbol{Pickup}]
+ \definesymbol [PointingHand] [\MartinVogelSymbol{PointingHand}]
+ \definesymbol [Printer] [\MartinVogelSymbol{Printer}]
+ \definesymbol [Radioactivity] [\MartinVogelSymbol{Radioactivity}]
+ \definesymbol [RectPipe] [\MartinVogelSymbol{RectPipe}]
+ \definesymbol [RectSteel] [\MartinVogelSymbol{RectSteel}]
+ \definesymbol [Recycling] [\MartinVogelSymbol{Recycling}]
+ \definesymbol [Rewind] [\MartinVogelSymbol{Rewind}]
+ \definesymbol [RewindToIndex] [\MartinVogelSymbol{RewindToIndex}]
+ \definesymbol [RewindToStart] [\MartinVogelSymbol{RewindToStart}]
+ \definesymbol [RightScissors] [\MartinVogelSymbol{RightScissors}]
+ \definesymbol [RightTorque] [\MartinVogelSymbol{RightTorque}]
+ \definesymbol [RoundedLSteel] [\MartinVogelSymbol{RoundedLSteel}]
+ \definesymbol [RoundedTSteel] [\MartinVogelSymbol{RoundedTSteel}]
+ \definesymbol [RoundedTTSteel] [\MartinVogelSymbol{RoundedTTSteel}]
+ \definesymbol [SerialInterface] [\MartinVogelSymbol{SerialInterface}]
+ \definesymbol [SerialPort] [\MartinVogelSymbol{SerialPort}]
+ \definesymbol [Shilling] [\MartinVogelSymbol{Shilling}]
+ \definesymbol [ShortFifty] [\MartinVogelSymbol{ShortFifty}]
+ \definesymbol [ShortForty] [\MartinVogelSymbol{ShortForty}]
+ \definesymbol [ShortNinetyfive] [\MartinVogelSymbol{ShortNinetyfive}]
+ \definesymbol [ShortSixty] [\MartinVogelSymbol{ShortSixty}]
+ \definesymbol [ShortThirty] [\MartinVogelSymbol{ShortThirty}]
+ \definesymbol [Smiley] [\MartinVogelSymbol{Smiley}]
+ \definesymbol [SoftHyphen] [\MartinVogelSymbol{SoftHyphen}]
+ \definesymbol [SpecialForty] [\MartinVogelSymbol{SpecialForty}]
+ \definesymbol [SquarePipe] [\MartinVogelSymbol{SquarePipe}]
+ \definesymbol [SquareSteel] [\MartinVogelSymbol{SquareSteel}]
+ \definesymbol [Stopsign] [\MartinVogelSymbol{Stopsign}]
+ \definesymbol [StrikingThrough] [\MartinVogelSymbol{StrikingThrough}]
+ \definesymbol [TSteel] [\MartinVogelSymbol{TSteel}]
+ \definesymbol [TTSteel] [\MartinVogelSymbol{TTSteel}]
+ \definesymbol [Telephone] [\MartinVogelSymbol{Telefon}]
+ \definesymbol [ToBottom] [\MartinVogelSymbol{ToBottom}]
+ \definesymbol [ToTop] [\MartinVogelSymbol{ToTop}]
+ \definesymbol [Tumbler] [\MartinVogelSymbol{Tumbler}]
+ \definesymbol [Valve] [\MartinVogelSymbol{Valve}]
+ \definesymbol [WashCotton] [\MartinVogelSymbol{WashCotton}]
+ \definesymbol [WashSynthetics] [\MartinVogelSymbol{WashSynthetics}]
+ \definesymbol [WashWool] [\MartinVogelSymbol{WashWool}]
+ \definesymbol [Wheelchair] [\MartinVogelSymbol{Wheelchair}]
+ \definesymbol [WomanFace] [\MartinVogelSymbol{WomanFace}]
+ \definesymbol [WritingHand] [\MartinVogelSymbol{WritingHand}]
+ \definesymbol [YinYang] [\MartinVogelSymbol{YinYang}]
+ \definesymbol [arrowOver] [\MartinVogelSymbol{arrowOver}]
+ \definesymbol [barOver] [\MartinVogelSymbol{barOver}]
+ \definesymbol [fax] [\MartinVogelSymbol{fax}]
+ %definesymbol [hyphen] [\MartinVogelSymbol{hyphen}]
+ \definesymbol [ironing] [\MartinVogelSymbol{ironing}]
+ %definesymbol [nonmarkingreturn] [\MartinVogelSymbol{nonmarkingreturn}]
+
+\stopsymbolset
+
+%D \showsymbolset[astronomic]
+%D \showsymbolset[zodiac]
+%D \showsymbolset[europe]
+%D \showsymbolset[martinvogel 1]
+%D \showsymbolset[martinvogel 2]
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/symb-nav.tex b/Master/texmf-dist/tex/context/base/symb-nav.mkii
index 90a798e01bf..93badbc4d12 100644
--- a/Master/texmf-dist/tex/context/base/symb-nav.tex
+++ b/Master/texmf-dist/tex/context/base/symb-nav.mkii
@@ -15,11 +15,7 @@
\loadmapfile[original-base.map] % \loadmapfile [original-context-symbol.map]
-\ifnum\texengine=\luatexengine
- \definefontsynonym [ContextNavigation] [contnav.tfm]
-\else
- \definefontsynonym [ContextNavigation] [contnav]
-\fi
+\definefontsynonym [ContextNavigation] [contnav]
\def\ContextNavigationGlyph#1{\getglyph{ContextNavigation}{\char#1}}
diff --git a/Master/texmf-dist/tex/context/base/symb-nav.mkiv b/Master/texmf-dist/tex/context/base/symb-nav.mkiv
new file mode 100644
index 00000000000..0f5fd289fea
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/symb-nav.mkiv
@@ -0,0 +1,129 @@
+%D \module
+%D [ file=symb-nav,
+%D version=1998.07.20,
+%D title=\CONTEXT\ Symbol Libraries,
+%D subtitle=Navigational Symbols,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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
+
+\definesymbol [\v!first] [\symbol{\v!firstpage}]
+\definesymbol [\v!previous] [\symbol{\v!previouspage}]
+\definesymbol [\v!next] [\symbol{\v!nextpage}]
+\definesymbol [\v!last] [\symbol{\v!lastpage}]
+\definesymbol [\v!backward] [\symbol{\v!previouspage}]
+\definesymbol [\v!forward] [\symbol{\v!nextpage}]
+\definesymbol [\v!nowhere] [\symbol{bullet}]
+\definesymbol [\v!somewhere] [\startoverlay{\symbol\v!previouspage}{\symbol\v!nextpage}\stopoverlay]
+
+\definefontsynonym [ContextNavigation] [contnav]
+
+\def\ContextNavigationGlyph{\getnamedglyphdirect{ContextNavigation}} % #1
+
+\startsymbolset [navigation 1]
+
+ \definesymbol [\v!firstpage] [\ContextNavigationGlyph{char03}]
+ \definesymbol [\v!previouspage] [\ContextNavigationGlyph{char01}]
+ \definesymbol [\v!nextpage] [\ContextNavigationGlyph{char02}]
+ \definesymbol [\v!lastpage] [\ContextNavigationGlyph{char04}]
+
+ \definesymbol [\v!PreviousJump] [\ContextNavigationGlyph{char05}]
+ \definesymbol [\v!NextJump] [\ContextNavigationGlyph{char06}]
+
+ \definesymbol [\v!CloseDocument] [\ContextNavigationGlyph{char07}]
+
+ \definesymbol [\v!firstsubpage] [\ContextNavigationGlyph{char03}]
+ \definesymbol [\v!previoussubpage] [\ContextNavigationGlyph{char01}]
+ \definesymbol [\v!nextsubpage] [\ContextNavigationGlyph{char02}]
+ \definesymbol [\v!lastsubpage] [\ContextNavigationGlyph{char04}]
+
+ \definesymbol [\v!StartSound] [\ContextNavigationGlyph{char02}]
+ \definesymbol [\v!PauseSound] [\ContextNavigationGlyph{char08}]
+ \definesymbol [\v!StopSound] [\ContextNavigationGlyph{char07}]
+
+ \definesymbol [\v!StartMovie] [\ContextNavigationGlyph{char02}]
+ \definesymbol [\v!PauseMovie] [\ContextNavigationGlyph{char08}]
+ \definesymbol [\v!StopMovie] [\ContextNavigationGlyph{char07}]
+
+ \definesymbol [\v!StartRendering] [\ContextNavigationGlyph{char02}]
+ \definesymbol [\v!PauseRendering] [\ContextNavigationGlyph{char08}]
+ \definesymbol [\v!StopRendering] [\ContextNavigationGlyph{char07}]
+ \definesymbol [\v!ResumeRendering] [\ContextNavigationGlyph{char02}]
+
+\stopsymbolset
+
+\startsymbolset [navigation 2]
+
+ \definesymbol [\v!firstpage] [\ContextNavigationGlyph{char67}]
+ \definesymbol [\v!previouspage] [\ContextNavigationGlyph{char65}]
+ \definesymbol [\v!nextpage] [\ContextNavigationGlyph{char66}]
+ \definesymbol [\v!lastpage] [\ContextNavigationGlyph{char68}]
+
+ \definesymbol [\v!PreviousJump] [\ContextNavigationGlyph{char69}]
+ \definesymbol [\v!NextJump] [\ContextNavigationGlyph{char6a}]
+
+ \definesymbol [\v!CloseDocument] [\ContextNavigationGlyph{char6b}]
+
+ \definesymbol [\v!firstsubpage] [\ContextNavigationGlyph{char67}]
+ \definesymbol [\v!previoussubpage] [\ContextNavigationGlyph{char65}]
+ \definesymbol [\v!nextsubpage] [\ContextNavigationGlyph{char66}]
+ \definesymbol [\v!lastsubpage] [\ContextNavigationGlyph{char68}]
+
+ \definesymbol [\v!StartSound] [\ContextNavigationGlyph{char66}]
+ \definesymbol [\v!PauseSound] [\ContextNavigationGlyph{char6c}]
+ \definesymbol [\v!StopSound] [\ContextNavigationGlyph{char6b}]
+
+ \definesymbol [\v!StartMovie] [\ContextNavigationGlyph{char66}]
+ \definesymbol [\v!PauseMovie] [\ContextNavigationGlyph{char6c}]
+ \definesymbol [\v!StopMovie] [\ContextNavigationGlyph{char6b}]
+
+ \definesymbol [\v!StartRendering] [\ContextNavigationGlyph{char66}]
+ \definesymbol [\v!PauseRendering] [\ContextNavigationGlyph{char6c}]
+ \definesymbol [\v!StopRendering] [\ContextNavigationGlyph{char6b}]
+ \definesymbol [\v!ResumeRendering] [\ContextNavigationGlyph{char66}]
+
+\stopsymbolset
+
+\startsymbolset [navigation 3]
+
+ \definesymbol [\v!firstpage] [\ContextNavigationGlyph{charcb}]
+ \definesymbol [\v!previouspage] [\ContextNavigationGlyph{charc9}]
+ \definesymbol [\v!nextpage] [\ContextNavigationGlyph{charca}]
+ \definesymbol [\v!lastpage] [\ContextNavigationGlyph{charcc}]
+
+ \definesymbol [\v!PreviousJump] [\ContextNavigationGlyph{charcd}]
+ \definesymbol [\v!NextJump] [\ContextNavigationGlyph{charce}]
+
+ \definesymbol [\v!CloseDocument] [\ContextNavigationGlyph{charcf}]
+
+ \definesymbol [\v!firstsubpage] [\ContextNavigationGlyph{charcb}]
+ \definesymbol [\v!previoussubpage] [\ContextNavigationGlyph{charc9}]
+ \definesymbol [\v!nextsubpage] [\ContextNavigationGlyph{charca}]
+ \definesymbol [\v!lastsubpage] [\ContextNavigationGlyph{charcc}]
+
+ \definesymbol [\v!StartSound] [\ContextNavigationGlyph{charca}]
+ \definesymbol [\v!PauseSound] [\ContextNavigationGlyph{chard0}]
+ \definesymbol [\v!StopSound] [\ContextNavigationGlyph{charcf}]
+
+ \definesymbol [\v!StartMovie] [\ContextNavigationGlyph{charca}]
+ \definesymbol [\v!PauseMovie] [\ContextNavigationGlyph{chard0}]
+ \definesymbol [\v!StopMovie] [\ContextNavigationGlyph{charcf}]
+
+ \definesymbol [\v!StartRendering] [\ContextNavigationGlyph{charca}]
+ \definesymbol [\v!PauseRendering] [\ContextNavigationGlyph{chard0}]
+ \definesymbol [\v!StopRendering] [\ContextNavigationGlyph{charcf}]
+ \definesymbol [\v!ResumeRendering] [\ContextNavigationGlyph{charca}]
+
+\stopsymbolset
+
+%D \showsymbolset[navigation 1]
+%D \showsymbolset[navigation 2]
+%D \showsymbolset[navigation 3]
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/symb-run.mkiv b/Master/texmf-dist/tex/context/base/symb-run.mkiv
index 4e714832c52..33bbb7927c5 100644
--- a/Master/texmf-dist/tex/context/base/symb-run.mkiv
+++ b/Master/texmf-dist/tex/context/base/symb-run.mkiv
@@ -1,54 +1,53 @@
%D \module
-%D [ file=symb-run, % code moved from symb-ini
-%D version=1998.07.20,
+%D [ file=symb-run,
+%D version=2010.12.08, % 1998.07.20,
%D title=\CONTEXT\ Symbol Libraries,
%D subtitle=Runtime Macros,
%D author=Hans Hagen,
%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%D copyright=PRAGMA]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+\startluacode
+ function commands.showsymbolset(collection,symbols)
+ if type(symbols) == "string" then
+ symbols = utilities.parsers.settings_to_array(symbols)
+ end
+ context.start()
+ context.forcesymbolset { collection }
+ context.starttabulate { "|lT|l|l|" }
+ for i=1,#symbols do
+ local symbol = symbols[i]
+ context.NC()
+ context(symbol)
+ context.NC()
+ context.symbol(symbol)
+ context.NC()
+ context.color (
+ { "red" },
+ context.nested.ruledhbox(
+ context.nested.color (
+ { "black" },
+ context.nested.symbol(symbol)
+ )
+ )
+ )
+ context.NR()
+ end
+ context.stoptabulate()
+ context.stop()
+ end
+\stopluacode
+
\unprotect
-\gdef\doshowsymbolset[#1][#2]% todo: make nicer, use legend or so
- {\vbox\bgroup
- \blank
- \getparameters[\??ss][\c!n=5,#2]%
- \forcesymbolset[#1]%
- \doifsymbolsetelse{#1}
- {\global\let\allfigures\empty
- \doglobal\newcounter\figurecounter
- \setupcolors[\c!state=\v!start]% to prevent mps color conversion
- \dontcomplain
- \def\doshowsymbols% global needed due to grouping in alignment
- {\expanded{\globalprocesscommalist[\symbolset{#1}]}\docommand}%
- \def\docommand##1%
- {\vbox
- {\forgetall
- \tttf
- \halign
- {\hss\quad####\strut\quad\hss\cr
- \symbol[##1]\quad{\red\ruledhbox{\black\symbol[##1]}}\cr
- \tfx##1\cr}}%
- \doglobal\increment\figurecounter
- \ifnum\figurecounter=\@@ssn
- \doglobal\newcounter\figurecounter
- \def\next{\crcr\noalign{\vskip1ex}}%
- \else
- \def\next{&}%
- \fi
- \next}%
- \tabskip\zeropoint \!!plus 1fill
- \halign to \hsize
- {&\hss##\hss\cr\doshowsymbols\crcr}}%
- {}%
- \blank
- \egroup}
+\gdef\doshowsymbolset[#1]%
+ {\ctxcommand{showsymbolset("#1","\symbolset{#1}")}}
\gdef\showsymbolset
- {\dodoubleempty\doshowsymbolset}
+ {\dosingleargument\doshowsymbolset}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/symb-uni.tex b/Master/texmf-dist/tex/context/base/symb-uni.mkii
index fcd613e7f0a..fcd613e7f0a 100644
--- a/Master/texmf-dist/tex/context/base/symb-uni.tex
+++ b/Master/texmf-dist/tex/context/base/symb-uni.mkii
diff --git a/Master/texmf-dist/tex/context/base/symb-was.tex b/Master/texmf-dist/tex/context/base/symb-was.mkii
index d6c32486408..53132cd23ff 100644
--- a/Master/texmf-dist/tex/context/base/symb-was.tex
+++ b/Master/texmf-dist/tex/context/base/symb-was.mkii
@@ -35,6 +35,8 @@
\loadmapfile[original-wasy.map]
+\unprotect
+
% there are also fonts for 6, 7, 8, 9 pt; how can we access these automatically?
% how about the bold wasy font?
@@ -202,4 +204,4 @@
%D \showsymbolset[wasy physics]
%D \showsymbolset[wasy apl]
-\endinput
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/syst-aux.mkiv b/Master/texmf-dist/tex/context/base/syst-aux.mkiv
index fcc1ee88f1e..d2bc84ae8bc 100644
--- a/Master/texmf-dist/tex/context/base/syst-aux.mkiv
+++ b/Master/texmf-dist/tex/context/base/syst-aux.mkiv
@@ -1,5 +1,5 @@
%D \module
-%D [ file=syst-gen,
+%D [ file=syst-aux, % merge of syst-gen cum suis
%D version=1996.03.20,
%D title=\CONTEXT\ System Macros,
%D subtitle=General,
@@ -37,7 +37,20 @@
\unprotect
-\let\reportprotectionstate\relax
+%D \macros
+%D {unexpanded}
+%D
+%D Because we use this module only in \MKIV, we have removed the
+%D old protection code.
+%D
+%D \starttyping
+%D \unexpanded\def\somecommand{... ... ...}
+%D \stoptyping
+%D
+%D This overloads the \ETEX\ primitive but as we already had an \MKII\
+%D solution we keep the same name for a similar mechanism.
+
+\let\unexpanded\normalprotected
%D \macros
%D {doifolderversionelse}
@@ -46,21 +59,15 @@
%D to use development versions of \MKIV\ for real documents.
%D
%D \starttyping
-%D \doifolderversionelse\contextversion{2001.02.03}{yes}{no}
-%D \doifolderversionelse\contextversion{3001.02.03}{yes}{no}
+%D \doifolderversionelse\contextversion{1010.10.10} {OLDER} {OKAY} => OLDER
+%D \doifolderversionelse\contextversion{2020.20.20} {OLDER} {OKAY} => OKAY
+%D \doifolderversionelse\contextversion{2020} {OLDER} {OKAY} => OKAY
%D \stoptyping
%D
-%D The \type {yyyy.mm.dd} syntax is rather strict.
+%D The version pattern is \type {yyyy.mm.dd} (with mm and dd being optional).
-\def\@@versiontonumber#1.#2.#3#4#5\relax
- {\numexpr#1*\plustenthousand+#2*\plushundred+#3#4\relax}
-
-\def\doifolderversionelse#1#2%
- {\normalexpanded{\noexpand\ifnum\noexpand\@@versiontonumber#1\relax<\noexpand\@@versiontonumber#2\relax}\relax
- \expandafter\firstoftwoarguments
- \else
- \expandafter\secondoftwoarguments
- \fi}
+\def\doifolderversionelse#1#2{\ctxcommand{doifolderversionelse("#1","#2")}}
+\def\doifoldercontextelse #1{\ctxcommand{doifolderversionelse("#1")}}
%D \macros
%D {normalspace}
@@ -107,6 +114,11 @@
\def\!!plustwo {2} % alongside \plustwo
\def\!!plusthree {3} % alongside \plusthree
+\setnewconstant\uprotationangle 0
+\setnewconstant\rightrotatioangle 90
+\setnewconstant\downrotatioangle 180
+\setnewconstant\leftrotatioangle 270
+
\ifdefined\data \else \let\data \relax \fi % dep checker
%D \macros
@@ -156,73 +168,26 @@
%D commalist or when data stored in macros is fed to index of
%D list commands. If needed, one should use \type{\noexpand}
%D inside the argument. Later on we will meet some more clever
-%D alternatives to this command.
+%D alternatives to this command. Beware, only the simple one
+%D has \type {\noexpand} before its argument.
-\long\def\@@expanded{} % always long; global (less restores)
+ \long\def\@@expanded{} % always long; global (less restores)
\long\def\expanded#1%
{\long\xdef\@@expanded{\noexpand#1}\@@expanded}
-%D Beware, the next one has no \type {\noexpand} before its
-%D argument.
-
\long\def\startexpanded#1\stopexpanded % see x-fo for example
{\long\xdef\@@expanded{#1}\@@expanded}
%D Recent \TEX's have a primitive \expanded
-% \long\def\expanded
-% {\normalexpanded\bgroup\noexpand\gobblenexttoken}
-
-%D \macros
-%D {safeexpanded,everysafeexpanded}
-%D
-%D In addition we provide:
-
-\newtoks\everysafeexpanded
-
-\long\def\safeexpanded#1% why the \noexpand
- {\begingroup
- \the\everysafeexpanded\long\xdef\@@expanded{\noexpand#1}%
- \endgroup
- \@@expanded}
-
-\def\safeedef#1#2%
- {\begingroup
- \the\everysafeexpanded\long\xdef\@@expanded{\noexpand#2}%
- \endgroup
- \let#1\@@expanded}
-
-\def\safexdef#1#2%
- {\begingroup
- \the\everysafeexpanded\long\xdef\@@expanded{\noexpand#2}%
- \endgroup
- \global\let#1\@@expanded}
-
-%D You can append protective measures to the token register if
-%D needed, as we will do later.
-
-%D \macros
-%D {expandoneargafter,expandtwoargsafter}
-%D
-%D These two commands make macros more readable by hiding a
-%D lot of \type {\expandafter}'s. They expand the arguments
-%D after the first command.
-%D
-%D \starttyping
-%D \expandoneargafter \command{\abc}
-%D \expandtwoargsafter\command{\abc}{\def}
-%D \stoptyping
-%D
-%D These commands expect the arguments to be macros.
-
-\def\expandoneargafter #1{\@EA#1\@EA}
-\def\expandtwoargsafter#1#2{\@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA#2\@EA}\@EA}
-
-%D These two do a full expansion:
-
-\def\fullexpandoneargafter #1#2{\long\xdef\@@expanded{\noexpand#1{#2}}\@@expanded}
-\def\fullexpandtwoargsafter#1#2#3{\long\xdef\@@expanded{\noexpand#1{#2}{#3}}\@@expanded}
+% not yet as we need to adapt ##'s in calls
+%
+% \long\def\expanded#1%
+% {\normalexpanded{\noexpand#1}}
+%
+% \long\def\startexpanded#1\stopexpanded
+% {\normalexpanded{#1}}
%D \macros
%D {gobbleoneargument,gobble...arguments}
@@ -230,16 +195,22 @@
%D The next set of macros just do nothing, except that they
%D get rid of a number of arguments.
-\long\def\gobbleoneargument #1{}
-\long\def\gobbletwoarguments #1#2{}
-\long\def\gobblethreearguments #1#2#3{}
-\long\def\gobblefourarguments #1#2#3#4{}
-\long\def\gobblefivearguments #1#2#3#4#5{}
-\long\def\gobblesixarguments #1#2#3#4#5#6{}
-\long\def\gobblesevenarguments #1#2#3#4#5#6#7{}
-\long\def\gobbleeightarguments #1#2#3#4#5#6#7#8{}
-\long\def\gobbleninearguments #1#2#3#4#5#6#7#8#9{}
-\long\def\gobbletenarguments #1{\gobbleninearguments}
+\long\def\gobbleoneargument #1{}
+\long\def\gobbletwoarguments #1#2{}
+\long\def\gobblethreearguments#1#2#3{}
+\long\def\gobblefourarguments #1#2#3#4{}
+\long\def\gobblefivearguments #1#2#3#4#5{}
+\long\def\gobblesixarguments #1#2#3#4#5#6{}
+\long\def\gobblesevenarguments#1#2#3#4#5#6#7{}
+\long\def\gobbleeightarguments#1#2#3#4#5#6#7#8{}
+\long\def\gobbleninearguments #1#2#3#4#5#6#7#8#9{}
+\long\def\gobbletenarguments #1{\gobbleninearguments}
+
+\def\gobbleoneoptional [#1]{}
+\def\gobbletwooptionals [#1][#2]{}
+\def\gobblethreeoptionals[#1][#2][#3]{}
+\def\gobblefouroptionals [#1][#2][#3][#4]{}
+\def\gobblefiveoptionals [#1][#2][#3][#4][#5]{}
%D \macros
%D {doifnextcharelse}
@@ -278,6 +249,7 @@
\else
\@EA\inspectnextcharacterindeed
\fi}
+
\def\inspectnextcharacterindeed
{\ifx\nexttoken\charactertoken
\@EA\!!stringa
@@ -291,18 +263,23 @@
%D test in a run. Of course it also is more convenient to read a
%D trace then.
+\newif\ifnextblankspacetoken
+
\let\nextoptionalcharactertoken=[
\long\def\doifnextoptionalelse#1#2%
{\def\nextoptionalcommandyes{#1}%
\def\nextoptionalcommandnop{#2}%
+ \let\ifnextblankspacetoken\iffalse
\futurelet\nexttoken\inspectnextoptionalcharacter}
+
\def\inspectnextoptionalcharacter
{\ifx\nexttoken\blankspace
\@EA\reinspectnextoptionalcharacter
\else
\@EA\inspectnextoptionalcharacterindeed
\fi}
+
\def\inspectnextoptionalcharacterindeed
{\ifx\nexttoken\nextoptionalcharactertoken
\@EA\nextoptionalcommandyes
@@ -315,13 +292,16 @@
\long\def\doifnextbgroupelse#1#2%
{\def\nextbgroupcommandyes{#1}%
\def\nextbgroupcommandnop{#2}%
+ \let\ifnextblankspacetoken\iffalse
\futurelet\nexttoken\inspectnextbgroupcharacter}
+
\def\inspectnextbgroupcharacter
{\ifx\nexttoken\blankspace
\@EA\reinspectnextbgroupcharacter
\else
\@EA\inspectnextbgroupcharacterindeed
\fi}
+
\def\inspectnextbgroupcharacterindeed
{\ifx\nexttoken\nextbgroupcharactertoken
\@EA\nextbgroupcommandyes
@@ -334,13 +314,16 @@
\long\def\doifnextparenthesiselse#1#2%
{\def\nextparenthesiscommandyes{#1}%
\def\nextparenthesiscommandnop{#2}%
+ \let\ifnextblankspacetoken\iffalse
\futurelet\nexttoken\inspectnextparenthesischaracter}
+
\def\inspectnextparenthesischaracter
{\ifx\nexttoken\blankspace
\@EA\reinspectnextparenthesischaracter
\else
\@EA\inspectnextparenthesischaracterindeed
\fi}
+
\def\inspectnextparenthesischaracterindeed
{\ifx\nexttoken\nextparenthesischaractertoken
\@EA\nextparenthesiscommandyes
@@ -353,6 +336,7 @@
\long\def\doiffastoptionalcheckelse#1#2%
{\def\nextoptionalcommandyes{#1}%
\def\nextoptionalcommandnop{#2}%
+ \let\ifnextblankspacetoken\iffalse % not needed
\futurelet\nexttoken\dodoiffastoptionalcheckelse}
\def\dodoiffastoptionalcheckelse
@@ -382,13 +366,13 @@
\def\:{\let\blankspace= } \:
\def\:{\reinspectnextcharacter}
-\expandafter\def\: {\futurelet\nexttoken\inspectnextcharacter}
+\expandafter\def\: {\let\ifnextblankspacetoken\iftrue\futurelet\nexttoken\inspectnextcharacter}
\def\:{\reinspectnextoptionalcharacter}
-\expandafter\def\: {\futurelet\nexttoken\inspectnextoptionalcharacter}
+\expandafter\def\: {\let\ifnextblankspacetoken\iftrue\futurelet\nexttoken\inspectnextoptionalcharacter}
\def\:{\reinspectnextbgroupcharacter}
-\expandafter\def\: {\futurelet\nexttoken\inspectnextbgroupcharacter}
+\expandafter\def\: {\let\ifnextblankspacetoken\iftrue\futurelet\nexttoken\inspectnextbgroupcharacter}
\let\:\next
@@ -444,21 +428,6 @@
\def\globallet{\global\let} \let\glet\globallet
%D \macros
-%D {unexpanded}
-%D
-%D Because we use this module only in \MKIV, we have removed the
-%D old protection code.
-%D
-%D \starttyping
-%D \unexpanded\def\somecommand{... ... ...}
-%D \stoptyping
-%D
-%D This overloads the \ETEX\ primitive but as we already had an \MKII\
-%D solution we keep the same name for a similar mechanism.
-
-\let\unexpanded\normalprotected
-
-%D \macros
%D {doifundefined,doifdefined,
%D doifundefinedelse,doifdefinedelse,
%D doifalldefinedelse}
@@ -491,44 +460,10 @@
%D \ifundefined\NameB ... \else ... \fi
%D \stoptyping
-\def\ifundefined#1% ongelukkige naam .. obsolete
- {\unless\ifcsname#1\endcsname}
-
-% \def\p!doifundefined#1%
-% {\edef\p!defined{#1}%
-% \unless\ifcsname\detokenize\@EA{\p!defined}\endcsname}
-
-% \def\doifundefinedelse#1%
-% {\edef\p!defined{#1}%
-% \ifcsname\detokenize\@EA{\p!defined}\endcsname
-% \expandafter\secondoftwoarguments
-% \else
-% \expandafter\firstoftwoarguments
-% \fi}
-
-% \def\doifdefinedelse#1%
-% {\edef\p!defined{#1}%
-% \ifcsname\detokenize\@EA{\p!defined}\endcsname
-% \expandafter\firstoftwoarguments
-% \else
-% \expandafter\secondoftwoarguments
-% \fi}
-
-% \def\doifundefined#1%
-% {\edef\p!defined{#1}%
-% \ifcsname\detokenize\@EA{\p!defined}\endcsname
-% \expandafter\gobbleoneargument
-% \else
-% \expandafter\firstofoneargument
-% \fi}
-
-% \def\doifdefined#1%
-% {\edef\p!defined{#1}%
-% \ifcsname\detokenize\@EA{\p!defined}\endcsname
-% \expandafter\firstofoneargument
-% \else
-% \expandafter\gobbleoneargument
-% \fi}
+% \def\ifundefined#1% obsolete
+% {\unless\ifcsname#1\endcsname}
+%
+% use a real if like \ifcsname#1\endcsname\else instead
\ifdefined\suppressifcsnameerror
@@ -757,6 +692,7 @@
\else
\expandafter\dodoifinsetelse
\fi}
+
\long\def\dodoifinsetelse#1%
{\edef\!!stringb{#1}%
\ifx\!!stringb\empty
@@ -772,6 +708,7 @@
\else
\expandafter\dodoifinset
\fi}
+
\long\def\dodoifinset#1%
{\edef\!!stringb{#1}%
\ifx\!!stringb\empty
@@ -787,6 +724,7 @@
\else
\expandafter\dodoifnotinset
\fi}
+
\long\def\dodoifnotinset#1%
{\edef\!!stringb{#1}%
\ifx\!!stringb\empty
@@ -802,12 +740,14 @@
\else
\expandafter\dodocheckifiteminsetelse
\fi#2}
+
\def\dodocheckifiteminsetelse
{\ifx\!!stringb\rightoptionalbracket
\expandafter\thirdofthreearguments
\else
\expandafter\dododocheckifiteminsetelse
\fi}
+
\def\dododocheckifiteminsetelse
{\ifx\!!stringa\!!stringb
\expandafter\doquitifiteminsetelse
@@ -822,12 +762,14 @@
\else
\expandafter\dodocheckifiteminset
\fi#2}
+
\def\dodocheckifiteminset
{\ifx\!!stringb\rightoptionalbracket
\expandafter\gobbletwoarguments
\else
\expandafter\dododocheckifiteminset
\fi}
+
\def\dododocheckifiteminset
{\ifx\!!stringa\!!stringb
\expandafter\doquitifiteminset
@@ -842,12 +784,14 @@
\else
\expandafter\dodocheckifitemnotinset
\fi#2}
+
\def\dodocheckifitemnotinset
{\ifx\!!stringb\rightoptionalbracket
\expandafter\secondoftwoarguments
\else
\expandafter\dododocheckifitemnotinset
\fi}
+
\def\dododocheckifitemnotinset
{\ifx\!!stringa\!!stringb
\expandafter\doquitifitemnotinset
@@ -883,21 +827,6 @@
% !9yes=\doifcommonelse{,a,}{,,,a,}{yes}{nop}
% !9yes=\doifcommonelse{,,a,}{,,,a,}{yes}{nop}
-% \def\p!doifcommonelse#1#2#3#4%
-% {\donefalse
-% \def\p!docommoncheck##1{\doifinset{##1}{#4}\donetrue\ifdone\quitcommalist\fi}%
-% \processcommalist[#3]\p!docommoncheck
-% \ifdone\expandafter#1\else\expandafter#2\fi}
-%
-% \def\doifcommonelse
-% {\p!doifcommonelse\firstoftwoarguments\secondoftwoarguments}
-%
-% \def\doifcommon
-% {\p!doifcommonelse\firstofoneargument \gobbleoneargument}
-%
-% \def\doifnotcommon
-% {\p!doifcommonelse\gobbleoneargument \firstofoneargument}
-
\long\def\doquitifcommonelse#1],\relax#2],\relax{\firstoftwoarguments}
\long\def\doquitifcommonelsenop{\secondoftwoarguments}
@@ -946,23 +875,6 @@
\fi\fi
#1#2}
-% \def\p!doifcommonelse#1#2#3%
-% {\edef\!!stringa{#3}%
-% \ifx\!!stringa\empty
-% \expandafter\secondofthreearguments
-% \else
-% \expandafter\p!dodoifcommonelse
-% \fi
-% #1#2} % #4
-
-% \def\p!dodoifcommonelse#1#2#3%
-% {\edef\!!stringb{#3}%
-% \ifx\!!stringb\empty
-% \expandafter\secondoftwoarguments
-% \else
-% \expandafter\pp!doifcommonelse
-% \fi#1#2}
-
\def\pp!doifcommonelse
{\def\p!docommoncheck{\expandafter\docheckifcommonelsetwo\!!stringb,],\relax}%
\expandafter\docheckifcommonelseone\!!stringa,],\relax}
@@ -1008,21 +920,13 @@
\def\dododoprocesscommaitem
{\csname\s!next\the\commalevel\endcsname}
-% \def\dodoprocesscommaitem
-% {\ifx\nexttoken\blankspace
-% \@EA\redoprocesscommaitem
-% \else\ifx\nexttoken]%
-% \@EAEAEA\gobbleoneargument
-% \else
-% \@EAEAEA\dododoprocesscommaitem
-% \fi\fi}
-
\def\dodoprocesscommaitem
{\ifx\nexttoken\blankspace
\@EA\redoprocesscommaitem
\else
\@EA\dodoprocesscommaitemindeed
\fi}
+
\def\dodoprocesscommaitemindeed
{\ifx\nexttoken]%
\@EA\gobbleoneargument
@@ -1037,7 +941,7 @@
%D however are treated. We have to check for the special case
%D \type{[{a,b,c}]}.
-\def\processcommalist[%
+\unexpanded\def\processcommalist[%
{\futurelet\nexttoken\docheckcommaitem}
\def\docheckcommaitem
@@ -1108,20 +1012,8 @@
%D Commands that are part of the list are expanded, so the
%D use of this macro has its limits.
-% \def\processcommacommand[#1]%
-% {\expanded{\processcommalist[#1]}}
-
-\def\processcommacommand[#1]%
- {\expandafter\processcommalist\expandafter[\normalexpanded{#1}]}
-
-% \def\processcommacommand[#1]%
-% {\edef\expandedcommacommand{#1%
-% \ifx\expandedcommacommand\empty\else
-% \doprocesscommacommand
-% \fi}
-%
-% \def\doprocesscommacommand
-% {\expandafter\processcommalist\expandafter[\expandedcommacommand]}
+\unexpanded\def\processcommacommand[#1]%
+ {\normalexpanded{\processcommalist[#1]}}
%D The argument to \type{\command} is not delimited. Because
%D we often use \type{[]} as delimiters, we also have:
@@ -1151,7 +1043,7 @@
\long\unexpanded\def\startprocesscommacommand[#1]#2\stopprocesscommacommand
{\long\def\currentcommalistcommand##1{\def\currentcommalistitem{##1}#2}%
- \normalexpanded{\noexpand\processcommacommand[#1]}\currentcommalistcommand}
+ \normalexpanded{\processcommalist[#1]}\currentcommalistcommand}
%D \macros
%D {processaction,
@@ -1244,7 +1136,7 @@
\fi
\fi}
-\def\processfirstactioninset[#1]%
+\unexpanded\def\processfirstactioninset[#1]%
{\expandedaction\!!stringa{#1}%
\ifx\!!stringa\empty
\expandafter\processaction
@@ -1253,7 +1145,7 @@
\fi
[#1]}
-\def\processfirstactionsinsetindeed[#1]#2[#3]%
+\unexpanded\def\processfirstactionsinsetindeed[#1]#2[#3]%
{\def\p!doprocessaction##1%
{\def\p!dodoprocessaction####1%
{\p!compareprocessactionC[####1][##1]}%
@@ -1279,7 +1171,7 @@
\def\doprocessallactionsinset
{\csname\s!do\the\processlevel\endcsname}
-\def\processallactionsinset[#1]%
+\unexpanded\def\processallactionsinset[#1]%
{\expandedaction\!!stringa{#1}%
\ifx\!!stringa\empty
\expandafter\processaction
@@ -1288,7 +1180,7 @@
\fi
[#1]}
-\def\processallactionsinsetindeed[#1]#2[#3]%
+\unexpanded\def\processallactionsinsetindeed[#1]#2[#3]%
{\advance\processlevel \plusone
\expandafter\def\csname\s!do\the\processlevel\endcsname##1%
{\def\p!dodoprocessaction####1%
@@ -1434,25 +1326,10 @@
% replaces prev
-% \long\def\p!doifinstringelse#1#2% ##2 can be {abc}
-% {\long\@EA\def\@EA\pp!doifinstringelse\@EA##\@EA1#1##2##3\war{\unless\if##2@}% expand #1 here
-% \expanded{\pp!doifinstringelse#2#1}@@\war} % expand #2 here
-
\long\def\p!doifinstringelse#1#2% ##2 can be {abc}
{\long\@EA\def\@EA\pp!doifinstringelse\@EA##\@EA1#1##2##3\war{\unless\if##2@}% expand #1 here
\expandafter\pp!doifinstringelse\normalexpanded{#2#1}@@\war} % expand #2 here
-% faster but at some costs
-%
-% \def\setp!doifinstringelse#1#2% ##2 can be {abc}
-% {\long\expandafter\gdef\csname @diie:#1\@EA\endcsname\@EA##\@EA1#1##2##3\war{\unless\if##2@}}% expand #1 here
-%
-% \long\def\p!doifinstringelse#1#2% ##2 can be {abc}
-% {\ifcsname @diie:#1\endcsname \else
-% \setp!doifinstringelse{#1}{#2}%
-% \fi
-% \csname @diie:#1\expandafter\endcsname\normalexpanded{#2#1}@@\war} % expand #2 here
-
%D The next alternative proved to be upto twice as fast on
%D tasks like checking reserved words in pretty verbatim
%D typesetting! This is mainly due to the fact that passing
@@ -1552,7 +1429,7 @@
\expandafter\rawprocesscommaitem#1,],% \relax
\global\advance\commalevel \minusone }
-\def\rawprocesscommacommand[#1]% not really needed
+\unexpanded\def\rawprocesscommacommand[#1]% not really needed
{\normalexpanded{\rawprocesscommalist[#1]}}
% \def\rawdoifinsetelse#1#2{\doifinstringelse{,#1,}{,#2,}}
@@ -1839,10 +1716,6 @@
\let\p!doassign\p!n!doassign
-% \def\doassign [#1][#2]{\p!doassign\dosetvalue #1\@relax@#2==\empty\@relax@}
-% \def\doeassign [#1][#2]{\p!doassign\dosetevalue #1\@relax@#2==\empty\@relax@}
-% \def\undoassign[#1][#2]{\p!doassign\doresetvalue#1\@relax@#2==\empty\@relax@}
-
\def\doassign [#1][#2]{\let\setsomevalue\dosetvalue \p!doassign#1\@relax@#2==\empty\@relax@}
\def\doeassign [#1][#2]{\let\setsomevalue\dosetevalue \p!doassign#1\@relax@#2==\empty\@relax@}
\def\undoassign[#1][#2]{\let\setsomevalue\doresetvalue\p!doassign#1\@relax@#2==\empty\@relax@}
@@ -1861,12 +1734,12 @@
%D We can optimize this one if needed but it's not a core macro so hardly
%D worth the trouble and tokens.
-\def\processassignmentlist[#1]#2% #2 == \command{key}{value]
+\unexpanded\def\processassignmentlist[#1]#2% #2 == \command{key}{value]
{\def\doprocessassignmententry##1{#2}% {##2}{##3} % namespace is ignored
\dogetparameters\doprocessassignmententry[][#1]}
-\def\processassignmentcommand[#1]%
- {\normalexpanded{\noexpand\processassignmentlist[#1]}}
+\unexpanded\def\processassignmentcommand[#1]%
+ {\normalexpanded{\processassignmentlist[#1]}}
\long\unexpanded\def\startprocessassignmentlist[#1]#2\stopprocessassignmentlist
{\long\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}%
@@ -1874,7 +1747,7 @@
\long\unexpanded\def\startprocessassignmentcommand[#1]#2\stopprocessassignmentcommand
{\long\def\currentassignmentlistcommand##1##2{\def\currentassignmentlistkey{##1}\def\currentassignmentlistvalue{##2}#2}%
- \normalexpanded{\noexpand\processassignmentlist[#1]}\currentassignmentlistcommand}
+ \normalexpanded{\processassignmentlist[#1]}\currentassignmentlistcommand}
%D \macros{currentvalue}
%D
@@ -1913,16 +1786,6 @@
\def\xdoget@n@parameters#1]%
{\xprocesscommaitem#1,],\@relax@}
-% \def\xdoget@e@parameters#1]%
-% {\let\dosetnvalue\dosetvalue
-% \let\dosetvalue\dosetevalue
-% \let\p!doassign\p!e!doassign
-% \xprocesscommaitem#1,],\@relax@
-% \let\p!doassign\p!n!doassign
-% \let\dosetvalue\dosetnvalue
-% \let\xdogetparameters\xdoget@n@parameters
-% \let\currentvalue\empty}
-
\def\xdoget@e@parameters#1]%
{\let\dosetnvalue\setsomevalue
\let\setsomevalue\dosetevalue
@@ -2055,18 +1918,6 @@
\scratchtoks\expandafter{\expandafter[\commacommand]}%
\expandafter\getcommalistsize\the\scratchtoks }
-% to be tested first
-%
-% \def\getcommacommandsize[#1]%
-% {\expanded{\getcommalistsize[#1]}}
-
-% \def\p!dogetfromcommalist#1%
-% {\advance\commalistcounter \minusone
-% \ifcase\commalistcounter
-% \def\commalistelement{#1}%
-% \begingroup\def\doprocesscommaitem##1]{\endgroup}%
-% \fi}
-
\def\p!dogetfromcommalist#1%
{\advance\commalistcounter \minusone
\ifcase\commalistcounter
@@ -2234,13 +2085,11 @@
%D use the \type{\if...argument} boolean. For novice: watch
%D the stepwise doubling of \type{#}'s
-% idea: \ignorespaces afterwards
-
-\chardef\noexpectedarguments=0
-\chardef\expectedarguments =0
+\setnewconstant\noexpectedarguments\zerocount
+\setnewconstant\expectedarguments \zerocount
\def\showargumenterror#1#2%
- {\writestatus{systems}{\number#1 argument(s) expected in line #2}}
+ {\writestatus{system}{\number#1 argument(s) expected in line #2}}
\def\doshowargumenterror
{\ifnum\expectedarguments>\noexpectedarguments
@@ -2251,163 +2100,668 @@
\def\noshowargumenterror
{\let\expectedarguments\noexpectedarguments}
-\long\def\dogetargument#1#2#3#4%
- {\let\charactertoken=#1%
- \def\!!stringa{\noshowargumenterror#3\dodogetargument}%
- \def\!!stringb{\doshowargumenterror#4\dodogetargument#1#2}%
- \futurelet\nexttoken\inspectnextcharacter}
-
-\def\getsingleempty#1#2#3%
- {\def\dodogetargument%
- {#3}%
- \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
-
-\def\getdoubleempty#1#2#3%
- {\def\dodogetargument#1##1#2%
- {\def\dodogetargument%
- {#3#1{##1}#2}%
- \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
- \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
-
-\def\gettripleempty#1#2#3%
- {\def\dodogetargument#1##1#2%
- {\def\dodogetargument#1####1#2%
- {\def\dodogetargument%
- {#3#1{##1}#2%
- #1{####1}#2}%
- \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
- \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
- \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
-
-\def\getquadrupleempty#1#2#3%
- {\def\dodogetargument#1##1#2%
- {\def\dodogetargument#1####1#2%
- {\def\dodogetargument#1########1#2%
- {\def\dodogetargument%
- {#3#1{##1}#2%
- #1{####1}#2%
- #1{########1}#2}%
- \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
- \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
- \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
- \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
-
-\def\getquintupleempty#1#2#3%
- {\def\dodogetargument#1##1#2%
- {\def\dodogetargument#1####1#2%
- {\def\dodogetargument#1########1#2%
- {\def\dodogetargument#1################1#2%
- {\def\dodogetargument%
- {#3#1{##1}#2%
- #1{####1}#2%
- #1{########1}#2%
- #1{################1}#2}%
- \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
- \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
- \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
- \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
- \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
-
-\def\getsixtupleempty#1#2#3%
- {\def\dodogetargument#1##1#2%
- {\def\dodogetargument#1####1#2%
- {\def\dodogetargument#1########1#2%
- {\def\dodogetargument#1################1#2%
- {\def\dodogetargument#1################################1#2%
- {\def\dodogetargument%
- {#3#1{##1}#2%
- #1{####1}#2%
- #1{########1}#2%
- #1{################1}#2%
- #1{################################1}#2}%
- \dogetargument#1#2\sixthargumenttrue\sixthargumentfalse}%
- \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
- \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
- \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
- \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
- \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
-
-\def\getseventupleempty#1#2#3%
- {\def\dodogetargument#1##1#2%
- {\def\dodogetargument#1####1#2%
- {\def\dodogetargument#1########1#2%
- {\def\dodogetargument#1################1#2%
- {\def\dodogetargument#1################################1#2%
- {\def\dodogetargument#1################################%
- ################################1#2%
- {\def\dodogetargument%
- {#3#1{##1}#2%
- #1{####1}#2%
- #1{########1}#2%
- #1{################1}#2%
- #1{################################1}#2%
- #1{################################%
- ################################1}#2}%
- \dogetargument#1#2\seventhargumenttrue\seventhargumentfalse}%
- \dogetargument#1#2\sixthargumenttrue\sixthargumentfalse}%
- \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
- \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
- \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
- \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
- \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
-
-\def\dosingleempty {\getsingleempty []}
-\def\dodoubleempty {\getdoubleempty []}
-\def\dotripleempty {\gettripleempty []}
-\def\doquadrupleempty {\getquadrupleempty []}
-\def\doquintupleempty {\getquintupleempty []}
-\def\dosixtupleempty {\getsixtupleempty []}
-\def\doseventupleempty{\getseventupleempty[]}
+% \long\def\dogetargument#1#2#3#4%
+% {\let\charactertoken=#1%
+% \def\!!stringa{\noshowargumenterror#3\dodogetargument}%
+% \def\!!stringb{\doshowargumenterror#4\dodogetargument#1#2}%
+% \futurelet\nexttoken\inspectnextcharacter}
+
+% \def\getsingleempty#1#2#3%
+% {\def\dodogetargument%
+% {#3}%
+% \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+% \def\getdoubleempty#1#2#3%
+% {\def\dodogetargument#1##1#2%
+% {\def\dodogetargument%
+% {#3#1{##1}#2}%
+% \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+% \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+% \def\gettripleempty#1#2#3%
+% {\def\dodogetargument#1##1#2%
+% {\def\dodogetargument#1####1#2%
+% {\def\dodogetargument%
+% {#3#1{##1}#2%
+% #1{####1}#2}%
+% \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+% \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+% \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+% \def\getquadrupleempty#1#2#3%
+% {\def\dodogetargument#1##1#2%
+% {\def\dodogetargument#1####1#2%
+% {\def\dodogetargument#1########1#2%
+% {\def\dodogetargument%
+% {#3#1{##1}#2%
+% #1{####1}#2%
+% #1{########1}#2}%
+% \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+% \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+% \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+% \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+% \def\getquintupleempty#1#2#3%
+% {\def\dodogetargument#1##1#2%
+% {\def\dodogetargument#1####1#2%
+% {\def\dodogetargument#1########1#2%
+% {\def\dodogetargument#1################1#2%
+% {\def\dodogetargument%
+% {#3#1{##1}#2%
+% #1{####1}#2%
+% #1{########1}#2%
+% #1{################1}#2}%
+% \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
+% \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+% \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+% \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+% \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+% \def\getsixtupleempty#1#2#3%
+% {\def\dodogetargument#1##1#2%
+% {\def\dodogetargument#1####1#2%
+% {\def\dodogetargument#1########1#2%
+% {\def\dodogetargument#1################1#2%
+% {\def\dodogetargument#1################################1#2%
+% {\def\dodogetargument%
+% {#3#1{##1}#2%
+% #1{####1}#2%
+% #1{########1}#2%
+% #1{################1}#2%
+% #1{################################1}#2}%
+% \dogetargument#1#2\sixthargumenttrue\sixthargumentfalse}%
+% \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
+% \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+% \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+% \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+% \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+% \def\getseventupleempty#1#2#3%
+% {\def\dodogetargument#1##1#2%
+% {\def\dodogetargument#1####1#2%
+% {\def\dodogetargument#1########1#2%
+% {\def\dodogetargument#1################1#2%
+% {\def\dodogetargument#1################################1#2%
+% {\def\dodogetargument#1################################%
+% ################################1#2%
+% {\def\dodogetargument%
+% {#3#1{##1}#2%
+% #1{####1}#2%
+% #1{########1}#2%
+% #1{################1}#2%
+% #1{################################1}#2%
+% #1{################################%
+% ################################1}#2}%
+% \dogetargument#1#2\seventhargumenttrue\seventhargumentfalse}%
+% \dogetargument#1#2\sixthargumenttrue\sixthargumentfalse}%
+% \dogetargument#1#2\fifthargumenttrue\fifthargumentfalse}%
+% \dogetargument#1#2\fourthargumenttrue\fourthargumentfalse}%
+% \dogetargument#1#2\thirdargumenttrue\thirdargumentfalse}%
+% \dogetargument#1#2\secondargumenttrue\secondargumentfalse}%
+% \dogetargument#1#2\firstargumenttrue\firstargumentfalse}
+
+% \def\dosingleempty {\getsingleempty []}
+% \def\dodoubleempty {\getdoubleempty []}
+% \def\dotripleempty {\gettripleempty []}
+% \def\doquadrupleempty {\getquadrupleempty []}
+% \def\doquintupleempty {\getquintupleempty []}
+% \def\dosixtupleempty {\getsixtupleempty []}
+% \def\doseventupleempty{\getseventupleempty[]}
%D Because some of these are called quite often, we will now
%D replace the more general version by alternatives tuned for
%D speed.
-\def\dosingleempty#1% we can make dedicated doifnextoptional's
- {\noshowargumenterror % \relax % prevents lookahead, brr
+% \def\dosingleempty#1% we can make dedicated doifnextoptional's
+% {\noshowargumenterror % \relax % prevents lookahead, brr
+% \doifnextoptionalelse
+% {\firstargumenttrue#1}%
+% {\dosinglefakeempty#1}}
+%
+% \def\dosinglefakeempty#1%
+% {\firstargumentfalse#1[]}
+%
+% \def\dodoubleempty#1%
+% {\noshowargumenterror % \relax % prevents lookahead, brr
+% \doifnextoptionalelse
+% {\dodoubletestempty#1}%
+% {\dodoublefakeempty#1}}
+%
+% \def\dodoublefakeempty#1%
+% {\firstargumentfalse\secondargumentfalse#1[][]}
+%
+% \long\def\dodoubletestempty#1[#2]%
+% {\firstargumenttrue
+% \doifnextoptionalelse
+% {\secondargumenttrue #1[{#2}]}%
+% {\secondargumentfalse#1[{#2}][]}}
+%
+% \def\dotripleempty#1%
+% {\noshowargumenterror % \relax % prevents lookahead, brr
+% \doifnextoptionalelse
+% {\dotripletestempty#1}%
+% {\dotriplefakeempty#1}}
+%
+% \def\dotriplefakeempty#1%
+% {\firstargumentfalse\secondargumentfalse\thirdargumentfalse#1[][][]}
+%
+% \long\def\dotripletestempty#1[#2]%
+% {\firstargumenttrue
+% \doifnextoptionalelse
+% {\dotripletestemptyx #1[{#2}]}%
+% {\secondargumentfalse
+% \thirdargumentfalse #1[{#2}][][]}}
+%
+% \long\def\dotripletestemptyx#1[#2][#3]%
+% {\secondargumenttrue
+% \doifnextoptionalelse
+% {\thirdargumenttrue #1[{#2}][{#3}]}%
+% {\thirdargumentfalse#1[{#2}][{#3}][]}}
+
+%D We can obey following spaces with a bit more code.
+
+% 0.172 0.187 new (per 10000)
+% 0.156 0.140 old (per 10000)
+%
+% \def\test[#1]{(#1)}
+%
+% \dosingleempty\test[] xxx\par
+% \dosingleempty\test xxx\par
+%
+% \def\test[#1][#2]{(#1,#2)}
+%
+% \dodoubleempty\test[][] xxx\par
+% \dodoubleempty\test[] xxx\par
+% \dodoubleempty\test xxx\par
+%
+% \def\test[#1][#2][#3]{(#1,#2,#3)}
+%
+% \dotripleempty\test[][][] xxx\par
+% \dotripleempty\test[][] xxx\par
+% \dotripleempty\test[] xxx\par
+% \dotripleempty\test xxx\par
+
+%D Single:
+
+\def\dosingleempty#1%
+ {\noshowargumenterror
\doifnextoptionalelse
{\firstargumenttrue#1}%
- {\dosinglefakeempty#1}}
+ {\dosingleemptyNOPone#1}}
+
+\def\dosingleemptyNOPone#1%
+ {\firstargumentfalse
+ #1[]}
+
+%D Double
\def\dodoubleempty#1%
- {\noshowargumenterror % \relax % prevents lookahead, brr
+ {\noshowargumenterror
\doifnextoptionalelse
- {\dodoubletestempty#1}%
- {\dodoublefakeempty#1}}
+ {\dodoubleemptyYESone#1}%
+ {\dodoubleemptyNOPone#1}}
+
+\long\def\dodoubleemptyYESone#1[#2]%
+ {\firstargumenttrue
+ \doifnextoptionalelse
+ {\secondargumenttrue#1[{#2}]}%
+ {\dodoubleemptyNOPtwo#1{#2}}}
+
+\def\dodoubleemptyNOPone#1%
+ {\firstargumentfalse
+ \secondargumentfalse
+ #1[][]}
+
+\def\dodoubleemptyNOPtwo
+ {\secondargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dodoubleemptyonespaced
+ \else
+ \expandafter\dodoubleemptyonenormal
+ \fi}
+
+\def\dodoubleemptyonespaced#1#2{#1[{#2}][] }
+\def\dodoubleemptyonenormal#1#2{#1[{#2}][]}
+
+% Three
\def\dotripleempty#1%
- {\noshowargumenterror % \relax % prevents lookahead, brr
+ {\noshowargumenterror
+ \doifnextoptionalelse
+ {\dotripleemptyYESone#1}%
+ {\dotripleemptyNOPone#1}}
+
+\long\def\dotripleemptyYESone#1[#2]%
+ {\firstargumenttrue
\doifnextoptionalelse
- {\dotripletestempty#1}%
- {\dotriplefakeempty#1}}
+ {\dotripleemptyYEStwo#1{#2}}%
+ {\dotripleemptyNOPtwo#1{#2}}}
+
+\long\def\dotripleemptyYEStwo#1#2[#3]%
+ {\secondargumenttrue
+ \doifnextoptionalelse
+ {\thirdargumenttrue#1[{#2}][{#3}]}%
+ {\dotripleemptyNOPthree#1{#2}{#3}}}
+
+\def\dotripleemptyNOPone#1%
+ {\firstargumentfalse
+ \secondargumentfalse
+ \thirdargumentfalse
+ #1[][][]}
+
+\def\dotripleemptyNOPtwo
+ {\secondargumentfalse
+ \thirdargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dotripleemptytwospaced
+ \else
+ \expandafter\dotripleemptytwonormal
+ \fi}
+
+\def\dotripleemptyNOPthree
+ {\thirdargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dotripleemptythreespaced
+ \else
+ \expandafter\dotripleemptythreenormal
+ \fi}
-\def\dosinglefakeempty#1%
- {\firstargumentfalse#1[]}
+\def\dotripleemptytwospaced #1#2{#1[{#2}][][] }
+\def\dotripleemptytwonormal #1#2{#1[{#2}][][]}
+\def\dotripleemptythreespaced#1#2#3{#1[{#2}][{#3}][] }
+\def\dotripleemptythreenormal#1#2#3{#1[{#2}][{#3}][]}
-\def\dodoublefakeempty#1%
- {\firstargumentfalse\secondargumentfalse#1[][]}
+%D Four:
-\def\dotriplefakeempty#1%
- {\firstargumentfalse\secondargumentfalse\thirdargumentfalse#1[][][]}
+\def\doquadrupleempty#1%
+ {\noshowargumenterror
+ \doifnextoptionalelse
+ {\doquadrupleemptyYESone#1}%
+ {\doquadrupleemptyNOPone#1}}
-\long\def\dodoubletestempty#1[#2]%
+\long\def\doquadrupleemptyYESone#1[#2]%
{\firstargumenttrue
\doifnextoptionalelse
- {\secondargumenttrue #1[{#2}]}%
- {\secondargumentfalse#1[{#2}][]}}
+ {\doquadrupleemptyYEStwo#1{#2}}%
+ {\doquadrupleemptyNOPtwo#1{#2}}}
+
+\long\def\doquadrupleemptyYEStwo#1#2[#3]%
+ {\secondargumenttrue
+ \doifnextoptionalelse
+ {\doquadrupleemptyYESthree#1{#2}{#3}}%
+ {\doquadrupleemptyNOPthree#1{#2}{#3}}}
-\long\def\dotripletestempty#1[#2]%
+\long\def\doquadrupleemptyYESthree#1#2#3[#4]%
+ {\thirdargumenttrue
+ \doifnextoptionalelse
+ {\fourthargumenttrue#1[{#2}][{#3}][{#4}]}%
+ {\doquadrupleemptyNOPfour#1{#2}{#3}{#4}}}
+
+\def\doquadrupleemptyNOPone#1%
+ {\firstargumentfalse
+ \secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ #1[][][][]}
+
+\def\doquadrupleemptyNOPtwo
+ {\secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\doquadrupleemptytwospaced
+ \else
+ \expandafter\doquadrupleemptytwonormal
+ \fi}
+
+\def\doquadrupleemptyNOPthree
+ {\thirdargumentfalse
+ \fourthargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\doquadrupleemptythreespaced
+ \else
+ \expandafter\doquadrupleemptythreenormal
+ \fi}
+
+\def\doquadrupleemptyNOPfour
+ {\fourthargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\doquadrupleemptyfourspaced
+ \else
+ \expandafter\doquadrupleemptyfournormal
+ \fi}
+
+\def\doquadrupleemptytwospaced #1#2{#1[{#2}][][][] }
+\def\doquadrupleemptytwonormal #1#2{#1[{#2}][][][]}
+\def\doquadrupleemptythreespaced #1#2#3{#1[{#2}][{#3}][][] }
+\def\doquadrupleemptythreenormal #1#2#3{#1[{#2}][{#3}][][]}
+\def\doquadrupleemptyfourspaced #1#2#3#4{#1[{#2}][{#3}][{#4}][] }
+\def\doquadrupleemptyfournormal #1#2#3#4{#1[{#2}][{#3}][{#4}][]}
+
+%D Five:
+
+\def\doquintupleempty#1%
+ {\noshowargumenterror
+ \doifnextoptionalelse
+ {\doquintupleemptyYESone#1}%
+ {\doquintupleemptyNOPone#1}}
+
+\long\def\doquintupleemptyYESone#1[#2]%
{\firstargumenttrue
\doifnextoptionalelse
- {\dotripletestemptyx #1[{#2}]}%
- {\secondargumentfalse
- \thirdargumentfalse #1[{#2}][][]}}
+ {\doquintupleemptyYEStwo#1{#2}}%
+ {\doquintupleemptyNOPtwo#1{#2}}}
-\long\def\dotripletestemptyx#1[#2][#3]%
+\long\def\doquintupleemptyYEStwo#1#2[#3]%
{\secondargumenttrue
\doifnextoptionalelse
- {\thirdargumenttrue #1[{#2}][{#3}]}%
- {\thirdargumentfalse#1[{#2}][{#3}][]}}
+ {\doquintupleemptyYESthree#1{#2}{#3}}%
+ {\doquintupleemptyNOPthree#1{#2}{#3}}}
+
+\long\def\doquintupleemptyYESthree#1#2#3[#4]%
+ {\thirdargumenttrue
+ \doifnextoptionalelse
+ {\doquintupleemptyYESfour#1{#2}{#3}{#4}}%
+ {\doquintupleemptyNOPfour#1{#2}{#3}{#4}}}
+
+\long\def\doquintupleemptyYESfour#1#2#3#4[#5]%
+ {\fourthargumenttrue
+ \doifnextoptionalelse
+ {\fifthargumenttrue#1[{#2}][{#3}][{#4}][{#5}]}%
+ {\doquintupleemptyNOPfive#1{#2}{#3}{#4}{#5}}}
+
+\def\doquintupleemptyNOPone#1%
+ {\firstargumentfalse
+ \secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ #1[][][][][]}
+
+\def\doquintupleemptyNOPtwo
+ {\secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\doquintupleemptytwospaced
+ \else
+ \expandafter\doquintupleemptytwonormal
+ \fi}
+
+\def\doquintupleemptyNOPthree
+ {\thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\doquintupleemptythreespaced
+ \else
+ \expandafter\doquintupleemptythreenormal
+ \fi}
+
+\def\doquintupleemptyNOPfour
+ {\fourthargumentfalse
+ \fifthargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\doquintupleemptyfourspaced
+ \else
+ \expandafter\doquintupleemptyfournormal
+ \fi}
+
+\def\doquintupleemptyNOPfive
+ {\fifthargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\doquintupleemptyfivespaced
+ \else
+ \expandafter\doquintupleemptyfivenormal
+ \fi}
+
+\def\doquintupleemptytwospaced #1#2{#1[{#2}][][][][] }
+\def\doquintupleemptytwonormal #1#2{#1[{#2}][][][][]}
+\def\doquintupleemptythreespaced #1#2#3{#1[{#2}][{#3}][][][] }
+\def\doquintupleemptythreenormal #1#2#3{#1[{#2}][{#3}][][][]}
+\def\doquintupleemptyfourspaced #1#2#3#4{#1[{#2}][{#3}][{#4}][][] }
+\def\doquintupleemptyfournormal #1#2#3#4{#1[{#2}][{#3}][{#4}][][]}
+\def\doquintupleemptyfivespaced #1#2#3#4#5{#1[{#2}][{#3}][{#4}][{#5}][] }
+\def\doquintupleemptyfivenormal #1#2#3#4#5{#1[{#2}][{#3}][{#4}][{#5}][]}
+
+%D Six
+
+\def\dosixtupleempty#1%
+ {\noshowargumenterror
+ \doifnextoptionalelse
+ {\dosixtupleemptyYESone#1}
+ {\dosixtupleemptyNOPone#1}}
+
+\long\def\dosixtupleemptyYESone#1[#2]%
+ {\firstargumenttrue
+ \doifnextoptionalelse
+ {\dosixtupleemptyYEStwo#1{#2}}%
+ {\dosixtupleemptyNOPtwo#1{#2}}}
+
+\long\def\dosixtupleemptyYEStwo#1#2[#3]%
+ {\secondargumenttrue
+ \doifnextoptionalelse
+ {\dosixtupleemptyYESthree#1{#2}{#3}}%
+ {\dosixtupleemptyNOPthree#1{#2}{#3}}}
+
+\long\def\dosixtupleemptyYESthree#1#2#3[#4]%
+ {\thirdargumenttrue
+ \doifnextoptionalelse
+ {\dosixtupleemptyYESfour#1{#2}{#3}{#4}}%
+ {\dosixtupleemptyNOPfour#1{#2}{#3}{#4}}}
+
+\long\def\dosixtupleemptyYESfour#1#2#3#4[#5]%
+ {\fourthargumenttrue
+ \doifnextoptionalelse
+ {\dosixtupleemptyYESfive#1{#2}{#3}{#4}{#5}}%
+ {\dosixtupleemptyNOPfive#1{#2}{#3}{#4}{#5}}}
+
+\long\def\dosixtupleemptyYESfive#1#2#3#4#5[#6]%
+ {\fifthargumenttrue
+ \doifnextoptionalelse
+ {\sixthargumenttrue#1[{#2}][{#3}][{#4}][{#5}][{#6}]}%
+ {\dosixtupleemptyNOPsix#1{#2}{#3}{#4}{#5}{#6}}}
+
+\def\dosixemptyNOPone#1%
+ {\firstargumentfalse
+ \secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ #1[][][][][][]}
+
+\def\dosixtupleemptyNOPtwo
+ {\secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dosixemptytwospaced
+ \else
+ \expandafter\dosixemptytwonormal
+ \fi}
+
+\def\dosixtupleemptyNOPthree
+ {\thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dosixemptythreespaced
+ \else
+ \expandafter\dosixemptythreenormal
+ \fi}
+
+\def\dosixtupleemptyNOPfour
+ {\fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dosixemptyfourspaced
+ \else
+ \expandafter\dosixemptyfournormal
+ \fi}
+
+\def\dosixtupleemptyNOPfive
+ {\fifthargumentfalse
+ \sixthargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dosixemptyfivespaced
+ \else
+ \expandafter\dosixemptyfivenormal
+ \fi}
+
+\def\dosixtupleemptyNOPsix
+ {\sixthargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dosixemptysixspaced
+ \else
+ \expandafter\dosixemptysixnormal
+ \fi}
+
+\def\dosixemptytwospaced #1#2{#1[{#2}][][][][][] }
+\def\dosixemptytwonormal #1#2{#1[{#2}][][][][][]}
+\def\dosixemptythreespaced #1#2#3{#1[{#2}][{#3}][][][][] }
+\def\dosixemptythreenormal #1#2#3{#1[{#2}][{#3}][][][][]}
+\def\dosixemptyfourspaced #1#2#3#4{#1[{#2}][{#3}][{#4}][][][] }
+\def\dosixemptyfournormal #1#2#3#4{#1[{#2}][{#3}][{#4}][][][]}
+\def\dosixemptyfivespaced #1#2#3#4#5{#1[{#2}][{#3}][{#4}][{#5}][][] }
+\def\dosixemptyfivenormal #1#2#3#4#5{#1[{#2}][{#3}][{#4}][{#5}][][]}
+\def\dosixemptysixspaced #1#2#3#4#5#6{#1[{#2}][{#3}][{#4}][{#5}][{#6}][] }
+\def\dosixemptysixnormal #1#2#3#4#5#6{#1[{#2}][{#3}][{#4}][{#5}][{#6}][]}
+
+%D Seven:
+
+\def\doseventupleempty#1%
+ {\noshowargumenterror
+ \doifnextoptionalelse
+ {\doseventupleemptyYESone#1}%
+ {\doseventupleemptyNOPone#1}}
+
+\long\def\doseventupleemptyYESone#1[#2]%
+ {\firstargumenttrue
+ \doifnextoptionalelse
+ {\doseventupleemptyYEStwo#1{#2}}%
+ {\doseventupleemptyNOPtwo#1{#2}}}
+
+\long\def\doseventupleemptyYEStwo#1#2[#3]%
+ {\secondargumenttrue
+ \doifnextoptionalelse
+ {\doseventupleemptyYESthree#1{#2}{#3}}%
+ {\doseventupleemptyNOPthree#1{#2}{#3}}}
+
+\long\def\doseventupleemptyYESthree#1#2#3[#4]%
+ {\thirdargumenttrue
+ \doifnextoptionalelse
+ {\doseventupleemptyYESfour#1{#2}{#3}{#4}}%
+ {\doseventupleemptyNOPfour#1{#2}{#3}{#4}}}
+
+\long\def\doseventupleemptyYESfour#1#2#3#4[#5]%
+ {\fourthargumenttrue
+ \doifnextoptionalelse
+ {\doseventupleemptyYESfive#1{#2}{#3}{#4}{#5}}%
+ {\doseventupleemptyNOPfive#1{#2}{#3}{#4}{#5}}}
+
+\long\def\doseventupleemptyYESfive#1#2#3#4#5[#6]%
+ {\fifthargumenttrue
+ \doifnextoptionalelse
+ {\doseventupleemptyYESsix#1{#2}{#3}{#4}{#5}{#6}}%
+ {\doseventupleemptyNOPsix#1{#2}{#3}{#4}{#5}{#6}}}
+
+\long\def\doseventupleemptyYESsix#1#2#3#4#5#6[#7]%
+ {\sixthargumenttrue
+ \doifnextoptionalelse
+ {\seventhargumenttrue#1[{#2}][{#3}][{#4}][{#5}][{#6}][{#7}]}%
+ {\doseventupleemptyNOPseven#1{#2}{#3}{#4}{#5}{#6}{#7}}}
+
+\def\dosevenemptyNOPone#1%
+ {\firstargumentfalse
+ \secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \seventhargumentfalse
+ #1[][][][][][][]}
+
+\def\doseventupleemptyNOPtwo
+ {\secondargumentfalse
+ \thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \seventhargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dosevenemptytwospaced
+ \else
+ \expandafter\dosevenemptytwonormal
+ \fi}
+
+\def\doseventupleemptyNOPthree
+ {\thirdargumentfalse
+ \fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \seventhargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dosevenemptythreespaced
+ \else
+ \expandafter\dosevenemptythreenormal
+ \fi}
+
+\def\doseventupleemptyNOPfour
+ {\fourthargumentfalse
+ \fifthargumentfalse
+ \sixthargumentfalse
+ \seventhargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dosevenemptyfourspaced
+ \else
+ \expandafter\dosevenemptyfournormal
+ \fi}
+
+\def\doseventupleemptyNOPfive
+ {\fifthargumentfalse
+ \sixthargumentfalse
+ \seventhargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dosevenemptyfivespaced
+ \else
+ \expandafter\dosevenemptyfivenormal
+ \fi}
+
+\def\doseventupleemptyNOPsix
+ {\sixthargumentfalse
+ \seventhargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dosevenemptysixspaced
+ \else
+ \expandafter\dosevenemptysixnormal
+ \fi}
+
+\def\doseventupleemptyNOPseven
+ {\seventhargumentfalse
+ \ifnextblankspacetoken
+ \expandafter\dosevenemptysevenspaced
+ \else
+ \expandafter\dosevenemptysevennormal
+ \fi}
+
+\def\dosevenemptytwospaced #1#2{#1[{#2}][][][][][][] }
+\def\dosevenemptytwonormal #1#2{#1[{#2}][][][][][][]}
+\def\dosevenemptythreespaced #1#2#3{#1[{#2}][{#3}][][][][][] }
+\def\dosevenemptythreenormal #1#2#3{#1[{#2}][{#3}][][][][][]}
+\def\dosevenemptyfourspaced #1#2#3#4{#1[{#2}][{#3}][{#4}][][][][] }
+\def\dosevenemptyfournormal #1#2#3#4{#1[{#2}][{#3}][{#4}][][][][]}
+\def\dosevenemptyfivespaced #1#2#3#4#5{#1[{#2}][{#3}][{#4}][{#5}][][][] }
+\def\dosevenemptyfivenormal #1#2#3#4#5{#1[{#2}][{#3}][{#4}][{#5}][][][]}
+\def\dosevenemptysixspaced #1#2#3#4#5#6{#1[{#2}][{#3}][{#4}][{#5}][{#6}][][] }
+\def\dosevenemptysixnormal #1#2#3#4#5#6{#1[{#2}][{#3}][{#4}][{#5}][{#6}][][]}
+\def\dosevenemptysevenspaced#1#2#3#4#5#6#7{#1[{#2}][{#3}][{#4}][{#5}][{#6}][{#7}][] }
+\def\dosevenemptysevennormal#1#2#3#4#5#6#7{#1[{#2}][{#3}][{#4}][{#5}][{#6}][{#7}][]}
%D \macros
%D {strippedcsname}
@@ -2545,11 +2899,6 @@
%D potentially being an \type {conditional} token. Okay, these macros
%D are not called that often but it saves crap when tracing.
-% \def\dogetgroupargument#1#2%
-% {\let\dogroupargumentyes#1%
-% \let\dogroupargumentnop#2%
-% \futurelet\nextargument\dodogetgroupargument}
-
\def\dodogetgroupargument
{\ifx\nextargument\bgroup
\expandafter\dodogetgroupargumentA
@@ -2561,20 +2910,6 @@
{\noshowargumenterror
\dogroupargumentyes\dodogetargument}
-% \def\dodogetgroupargumentB
-% {\ifcase\@@permitspacesbetweengroups
-% \expandafter\dodogetgroupargumentC
-% \else
-% \expandafter\dodogetgroupargumentD
-% \fi}
-
-% \def\dodogetgroupargumentC
-% {\ifx\nextargument\lineending
-% \expandafter\dodogetgroupargumentE
-% \else
-% \expandafter\dodogetgroupargumentF
-% \fi}
-
\def\dodogetgroupargumentB
{\ifcase\@@permitspacesbetweengroups
\expandafter\dodogetgroupargumentF
@@ -2586,9 +2921,6 @@
{\doshowargumenterror
\dogroupargumentnop\dodogetargument{}}
-% \def\dodogetgroupargumentE
-% {\begingroup\def\\ {\endgroup\dogetgroupargument\dogroupargumentyes\dogroupargumentnop}\\}
-
\begingroup
\def\\ {\dogetgroupargument\dogroupargumentyes\dogroupargumentnop}
\global\let\dodogetgroupargumentE\\
@@ -2712,7 +3044,9 @@
\long\def\sixthofsixarguments #1#2#3#4#5#6{#6}
%D \macros
-%D {globalletempty,letempty,letvalueempty,letgvalueempty}
+%D {globalletempty,letempty,
+%D letvalueempty,letgvalueempty,
+%D letvaluerelax,letgvaluerelax}
%D
%D Trivial:
@@ -2721,6 +3055,8 @@
\def\letvalueempty #1{\expandafter\let\csname#1\endcsname\empty}
\def\letgvalueempty#1{\global\expandafter\let\csname#1\endcsname\empty}
+\def\letvaluerelax #1{\expandafter\let\csname#1\endcsname\relax}
+\def\letgvalurelax #1{\global\expandafter\let\csname#1\endcsname\relax}
%D \macros
%D {wait}
@@ -2753,8 +3089,8 @@
%D of the identification string with the macro \type
%D {\statuswidth}.
-\chardef\statuswidth=15
-\chardef\statuswrite=16
+\setnewconstant\statuswidth 15
+\setnewconstant\statuswrite 16
\ifdefined\writestring \else
@@ -2781,6 +3117,13 @@
{}
%D \macros
+%D {immediatemessage}
+%D
+%D A fully expandable message:
+
+\def\immediatemessage#1{\ctxlua{logs.status("message","#1")}}
+
+%D \macros
%D {debuggerinfo}
%D
%D For debugging purposes we can enhance macros with the
@@ -2935,7 +3278,7 @@
\dostarttexdefinition}
\gdef\dostarttexdefinition #1
- {\catcode13=\@@ignore%
+ {\catcode\endoflineasciicode\ignorecatcode%
\doifinstringelse\letterhash{\detokenize{#1}}\dodostarttexdefinition\nonostarttexdefinition#1
}
@@ -2944,17 +3287,22 @@
\long\gdef\dododostarttexdefinition#1#2#3\stoptexdefinition%
{\egroup%
- \long\setvalue{#1}#2{#3}}
+ \expandafter\def\csname#1\endcsname#2{#3}}
\long\gdef\nonostarttexdefinition#1
{\nononostarttexdefinition{#1}{}}
\long\gdef\nononostarttexdefinition#1#2#3\stoptexdefinition%
{\egroup%
- \long\setvalue{#1}{#3}}
+ \expandafter\def\csname#1\endcsname{#3}}
\egroup
+% This is a first variant, more might be added:
+
+\def\starttexcode{\unprotect}
+\def\stoptexcode {\protect}
+
%D \macros
%D {newcounter,
%D increment,decrement}
@@ -3068,8 +3416,6 @@
\edef#1{\the\maximumsignal}%
\fi}
-\let\newskimen\newdimen % it's all etex or later now
-
%D \macros
%D {strippedcsname}
%D
@@ -3080,10 +3426,6 @@
%D \csname if\strippedcsname\something\endcsname
%D \stoptyping
-\ifdefined\letterbackslash \else
- {\catcode`.=0 .catcode`.\ 12 .xdef.letterbackslash{.string\}} % hack
-\fi
-
\def\checkedstrippedcsname#1% this permits \strippedcsname{\xxx} and \strippedcsname{xxx}
{\expandafter\docheckedstrippedcsname\string#1}
@@ -3139,8 +3481,7 @@
%D conditionals. The next implementation is abaou as fast
%D and just as straightforward:
-% \def\settrue #1{\chardef#1\zerocount}
-% \def\setfalse#1{\chardef#1\plusone}
+% maybe reserve special zero and plusone
\def\settrue #1{\let#1\zerocount}
\def\setfalse#1{\let#1\plusone}
@@ -3150,6 +3491,15 @@
\let\then\relax % so that we can say: \ifnum1>2\then -)
+% demands that each conditional is defined .. it would be handy to have
+% a primitive \unless\ifcase .. then we could use better values
+%
+% \def\settrue #1{#1\zerocount}
+% \def\setfalse#1{#1\plusone}
+%
+% \def\newconditional#1{\ifdefined#1\else\newcount#1\fi\setfalse#1}
+% \let\ifconditional \ifcase
+
%D \macros
%D {ifzeropt}
%D
@@ -3237,7 +3587,7 @@
\else
\let\nextrecurse\exitstepwiserecurse
\fi
- \fi\normalexpanded{\noexpand\nextrecurse{\number#1}{\number#2}{\number#3}}}
+ \fi\normalexpanded{\nextrecurse{\number#1}{\number#2}{\number#3}}}
\long\def\dodostepwiserecurse#1#2#3% from to step
{\ifnum#1>#2\relax
@@ -3247,21 +3597,13 @@
\@EAEAEA\redostepwiserecurse\@EA
\fi\@EA{\the\numexpr\recurselevel+#3\relax}{#2}{#3}}
-\def\expandrecursecontent
+\unexpanded\def\expandrecursecontent
{\csname\@@arecurse\recursedepth\endcsname}
-\def\redostepwiserecurse
+\unexpanded\def\redostepwiserecurse
{\expandrecursecontent\dodostepwiserecurse}
-\long\def\dodostepwisereverse#1#2#3% from to step
- {\ifnum#1<#2\relax
- \@EA\nodostepwiserecurse
- \else
- \def\recurselevel{#1}%
- \@EAEAEA\redostepwisereverse\@EA
- \fi\@EA{\the\numexpr\recurselevel#3\relax}{#2}{#3}}
-
-\long\def\dodostepwisereverse#1#2#3% from to step
+\long\unexpanded\def\dodostepwisereverse#1#2#3% from to step
{\ifnum#1<#2\relax
\@EA\nodostepwiserecurse
\else
@@ -3271,21 +3613,21 @@
\@EAEAEA\redostepwisereverse\@EA
\fi\@EA{\the\innerrecurse}{#2}{#3}}
-\def\redostepwisereverse
+\unexpanded\def\redostepwisereverse
{\expandrecursecontent\dodostepwisereverse}
-\def\exitstepwiserecurse
+\unexpanded\def\exitstepwiserecurse
{\nodostepwiserecurse\relax}
-\def\nodostepwiserecurse#1#2#3#4%
+\unexpanded\def\nodostepwiserecurse#1#2#3#4%
{\@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
\global\advance\outerrecurse \minusone}
-\def\nonostepwiserecurse#1#2#3%
+\unexpanded\def\nonostepwiserecurse#1#2#3%
{\@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
\global\advance\outerrecurse \minusone}
-\def\dorecurse#1%
+\unexpanded\def\dorecurse#1%
{\dostepwiserecurse1{#1}1}
%D As we can see here, the simple command \type{\dorecurse} is
@@ -3307,7 +3649,7 @@
%D Because the simple case is used often, we implement it
%D more efficiently:
-\long\def\dorecurse#1%
+\long\unexpanded\def\dorecurse#1%
{\ifcase#1\relax
\expandafter\gobbletwoarguments
\or
@@ -3316,13 +3658,13 @@
\expandafter\xdorecurse
\fi{#1}}
-\long\def\xdorecurse#1#2%
+\long\unexpanded\def\xdorecurse#1#2%
{\global\advance\outerrecurse \plusone
\long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname{#2}%
\global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
\@EA\dodorecurse\@EA1\@EA{\number#1}}
-\long\def\ydorecurse#1#2%
+\long\unexpanded\def\ydorecurse#1#2%
{\global\advance\outerrecurse \plusone
\global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
\let\recurselevel\!!plusone
@@ -3330,7 +3672,7 @@
\@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
\global\advance\outerrecurse \minusone}
-\long\def\dodorecurse#1#2% from to
+\long\unexpanded\def\dodorecurse#1#2% from to
{\ifnum#1>#2\relax
\@EA\nodorecurse
\else
@@ -3338,7 +3680,7 @@
\@EAEAEA\redorecurse
\fi\@EA{\the\numexpr\recurselevel+\plusone\relax}{#2}}
-\long\def\dodorecurse#1#2% from to
+\long\unexpanded\def\dodorecurse#1#2% from to
{\ifnum#1>#2\relax
\@EA\nodorecurse
\else
@@ -3347,10 +3689,10 @@
\@EAEAEA\redorecurse
\fi\@EA{\the\innerrecurse}{#2}}
-\def\redorecurse
+\unexpanded\def\redorecurse
{\expandrecursecontent\dodorecurse}
-\def\nodorecurse#1#2#3%
+\unexpanded\def\nodorecurse#1#2#3%
{\@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
\global\advance\outerrecurse \minusone }
@@ -3374,29 +3716,29 @@
\let\endofloop\donothing
-\long\def\doloop#1%
+\unexpanded\long\def\doloop#1%
{\global\advance\outerrecurse \plusone
\long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname{#1}%
\global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
\let\endofloop\dodoloop
\dodoloop1} % no \plusone else \recurselevel wrong
-\long\def\dodoloop#1%
+\unexpanded\long\def\dodoloop#1%
{\def\recurselevel{#1}%
\@EA\redoloop\@EA{\the\numexpr\recurselevel+\plusone\relax}}
-\def\redoloop
+\unexpanded\def\redoloop
{\expandrecursecontent\endofloop}
-\def\nodoloop#1%
+\unexpanded\def\nodoloop#1%
{\let\endofloop\dodoloop % new, permits nested \doloop's
\@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
\global\advance\outerrecurse\minusone}
-\def\exitloop % \exitloop quits at end
+\unexpanded\def\exitloop % \exitloop quits at end
{\let\endofloop\nodoloop}
-\long\def\exitloopnow#1\endofloop % \exitloopnow quits directly
+\long\unexpanded\def\exitloopnow#1\endofloop % \exitloopnow quits directly
{\nodoloop}
%D The loop is executed at least once, so beware of situations
@@ -3440,13 +3782,13 @@
\def\expandrecursecontent
{\csname\@@arecurse\recursedepth\@EA\@EA\@EA\endcsname\@EA\@EA\@EA{\@EA\recurselevel\@EA}\@EA{\recursedepth}}
-\long\def\xdorecurse#1#2%
+\long\unexpanded\def\xdorecurse#1#2%
{\global\advance\outerrecurse \plusone
\long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#2}%
\global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
\@EA\dodorecurse\@EA1\@EA{\number#1}}
-\long\def\ydorecurse#1#2%
+\long\unexpanded\def\ydorecurse#1#2%
{\global\advance\outerrecurse \plusone
\global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
\let\recurselevel\!!plusone
@@ -3455,7 +3797,7 @@
\@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
\global\advance\outerrecurse \minusone}
-\long\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
+\long\unexpanded\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
{\global\advance\outerrecurse \plusone
\long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}%
\global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
@@ -3475,9 +3817,9 @@
\else
\let\nextrecurse\exitstepwiserecurse
\fi
- \fi\normalexpanded{\noexpand\nextrecurse{\number#1}{\number#2}{\number#3}}}
+ \fi\normalexpanded{\nextrecurse{\number#1}{\number#2}{\number#3}}}
-\long\def\doloop#1%
+\long\unexpanded\def\doloop#1%
{\global\advance\outerrecurse \plusone
\long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#1}%
\global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
@@ -3488,7 +3830,7 @@
% faster
-\long\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
+\long\unexpanded\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
{\global\advance\outerrecurse \plusone
\long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}%
\global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
@@ -3509,11 +3851,11 @@
\let\nextrecurse\exitstepwiserecurse
\fi
\fi
- \expandafter\nextrecurse\normalexpanded{{\number#1}{\number#2}{\number#3}}}
+ \normalexpanded{\nextrecurse{\number#1}{\number#2}{\number#3}}}
% slightly faster
-\long\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
+\long\unexpanded\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
{\global\advance\outerrecurse \plusone
\long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}%
\global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
@@ -3529,13 +3871,38 @@
\let\@swrd\dodostepwiserecurse
\let\@swrr\dodostepwisereverse
+% quite okay too, but untested
+%
+% \long\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4
+% {\global\advance\outerrecurse \plusone
+% \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}%
+% \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+% \normalexpanded
+% {\ifnum#3>\zerocount
+% \ifnum#2<#1
+% \exitstepwiserecurse
+% \else
+% \dodostepwiserecurse
+% \fi
+% \else
+% \ifnum#3<\zerocount
+% \ifnum#1<#2
+% \exitstepwiserecurse
+% \else
+% \dodostepwisereverse
+% \fi
+% \else
+% \exitstepwiserecurse
+% \fi
+% \fi{\number#1}{\number#2}{\number#3}}}
+
%D For special purposes:
\newcount\fastrecursecounter
\newcount\lastrecursecounter
\newcount\steprecursecounter
-\def\dofastrecurse#1#2#3#4%
+\unexpanded\def\dofastrecurse#1#2#3#4%
{\def\fastrecursebody{#4}%
\fastrecursecounter#1\relax
\lastrecursecounter#2\relax
@@ -3543,9 +3910,9 @@
\def\recurselevel{\number\fastrecursecounter}%
\dodofastrecurse}
-\def\resetrecurselevel{\let\recurselevel\!!zerocount}
+\unexpanded\def\resetrecurselevel{\let\recurselevel\!!zerocount}
-\def\dodofastrecurse
+\unexpanded\def\dodofastrecurse
{\ifnum\fastrecursecounter>\lastrecursecounter
% \resetrecurselevel % slows down
\else
@@ -3576,11 +3943,11 @@
%D The use of \type{\od} as a dilimiter would have made nested
%D use more problematic.
-%D Don't use this one, it's kind of obsolete.
-
-\def\for#1=#2\to#3\step#4\do#5%
- {\dostepwiserecurse{#2}{#3}{#4}
- {\let#1\recurselevel#5\let#1\recurselevel}}
+% obsolete:
+%
+% \def\for#1=#2\to#3\step#4\do#5%
+% {\dostepwiserecurse{#2}{#3}{#4}
+% {\let#1\recurselevel#5\let#1\recurselevel}}
%D \macros
%D {newevery,everyline,EveryLine,EveryPar}
@@ -3836,70 +4203,14 @@
%D \doifsamestringelse{\jobname}{oeps}{YES}{NO}
%D \stoptyping
-% \def\@@doifsamestringelse#1#2#3#4%
-% {\edef\!!stringa{#3}\convertcommand\!!stringa\to\!!stringa
-% \edef\!!stringb{#4}\convertcommand\!!stringb\to\!!stringb
-% \ifx\!!stringa\!!stringb\expandafter#1\else\expandafter#2\fi}
-
\def\@@doifsamestringelse#1#2#3#4%
{\edef\!!stringa{\detokenize\expandafter{\normalexpanded{#3}}}%
\edef\!!stringb{\detokenize\expandafter{\normalexpanded{#4}}}%
\ifx\!!stringa\!!stringb\expandafter#1\else\expandafter#2\fi}
\def\doifsamestringelse{\@@doifsamestringelse\firstoftwoarguments\secondoftwoarguments}
-\def\doifsamestring {\@@doifsamestringelse\firstofoneargument\gobbleoneargument}
-\def\doifnotsamestring {\@@doifsamestringelse\gobbleoneargument\firstofoneargument}
-
-%D \macros
-%D {ExpandFirstAfter,ExpandSecondAfter,ExpandBothAfter}
-%D
-%D These three commands support expansion of arguments before
-%D executing the commands that uses them. We can best
-%D illustrate this with an example.
-%D
-%D \starttyping
-%D \def\first {alfa,beta,gamma}
-%D \def\second {alfa,epsilon,zeta}
-%D
-%D \ExpandFirstAfter \doifcommon {\first} {alfa} {\message{OK}}
-%D \ExpandSecondAfter \doifcommon {alfa} {\second} {\message{OK}}
-%D \ExpandBothAfter \doifcommon {\first} {\second} {\message{OK}}
-%D
-%D \ExpandFirstAfter\processcommalist[\first]\message
-%D
-%D \ExpandAfter \doifcommon {\first} {alfa} {\message{OK}}
-%D \stoptyping
-%D
-%D The first three calls result in the threefold message
-%D \type{OK}, the fourth one shows the three elements of
-%D \type{\first}. The command \type{\ExpandFirstAfter} takes
-%D care of (first) arguments that are delimited by \type{[ ]},
-%D but the faster \type{\ExpandAfter} does not.
-
-\def\simpleExpandFirstAfter#1%
- {\long\xdef\@@expanded{\noexpand\ExpandCommand{#1}}\@@expanded}
-
-\def\complexExpandFirstAfter[#1]%
- {\long\xdef\@@expanded{\noexpand\ExpandCommand[#1]}\@@expanded}
-
-\def\ExpandFirstAfter#1%
- {\let\ExpandCommand#1%
- \doifnextoptionalelse\complexExpandFirstAfter\simpleExpandFirstAfter}
-
-\def\ExpandSecondAfter#1#2#3%
- {\scratchtoks{#2}%
- \long\xdef\@@expanded{\noexpand#1{\the\scratchtoks}{#3}}\@@expanded}
-
-\def\ExpandBothAfter#1#2#3%
- {\long\xdef\@@expanded{\noexpand#1{#2}{#3}}\@@expanded}
-
-\def\ExpandAfter#1#2%
- {\long\xdef\@@expanded{\noexpand#1{#2}}\@@expanded}
-
-%D Now we can for instance define \type{\ifinstringelse} as:
-
-\def\ifinstringelse
- {\ExpandBothAfter\p!doifinstringelse}
+\def\doifsamestring {\@@doifsamestringelse\firstofoneargument \gobbleoneargument }
+\def\doifnotsamestring {\@@doifsamestringelse\gobbleoneargument \firstofoneargument }
%D \macros
%D {ConvertToConstant,ConvertConstantAfter}
@@ -4221,7 +4532,7 @@
%D \CONTEXT only defines lowcased macros.
\def\showdefinederror#1#2%
- {\writestatus\m!systems{#1 #2 replaces a macro, use CAPITALS!}}
+ {\writestatus\m!system{#1 #2 replaces a macro, use CAPITALS!}}
\def\checkdefined#1#2#3%
{\doifdefined{#3}{\showdefinederror{#2}{#3}}}
@@ -4283,8 +4594,6 @@
\newtoks\BeforePar
\newtoks\AfterPar
-\let\endoflinetoken=^^M
-
\def\redowithpar\par
{\doifnextcharelse\par\redowithpar\dodowithpar}%
@@ -4419,7 +4728,7 @@
{\ifx#2\empty % redundant but gives cleaner extensions
#4{#1}%
\else\ifnum#1<\zerocount
- \normalexpanded{\noexpand\dorecurse{\number-\number#1}}{#4{-#2#3}}%
+ \normalexpanded{\dorecurse{\number-\number#1}}{#4{-#2#3}}%
\else\ifx#2+%
\dorecurse{#1}{#4{#3}}%
\else
@@ -4434,7 +4743,7 @@
%D \starttyping
%D \bgroup
%D
-%D \catcode`\*=\@@superscript
+%D \catcode`\*=\superscriptcatcode
%D
%D \gdef\redorepeatwithcommand[#1]%
%D {\redodorepeatwithcommand#1*\empty*\relax}
@@ -4941,9 +5250,9 @@
%D \PtToCm{dimension}
%D \stoptyping
-{\catcode`\.=\@@other
- \catcode`\p=\@@other
- \catcode`\t=\@@other
+{\catcode`\.=\othercatcode
+ \catcode`\p=\othercatcode
+ \catcode`\t=\othercatcode
\gdef\WITHOUTPT#1pt{#1}}
\def\withoutpt#1%
@@ -4976,18 +5285,16 @@
\def\numberofpoints #1{\the\numexpr\dimexpr#1\relax/\maxcard\relax}
%D \macros
-%D {swapdimens,swapmacros}
+%D {swapdimens,swapcounts,swapmacros}
%D
%D Simple but effective are the next two macros. There name
%D exactly states their purpose. The \type{\scratchdimen} and
%D \type{\!!stringa} can only be swapped when being the first
%D argument.
-\def\swapdimens#1#2%
- {\scratchdimen #1\redoglobal #1#2\dodoglobal #2\scratchdimen}
-
-\def\swapmacros#1#2%
- {\let\!!stringa#1\redoglobal\let#1#2\dodoglobal\let#2\!!stringa}
+\def\swapdimens#1#2{\scratchdimen #1\redoglobal #1#2\dodoglobal #2\scratchdimen}
+\def\swapcounts#1#2{\scratchcounter#1\redoglobal #1#2\dodoglobal #2\scratchcounter}
+\def\swapmacros#1#2{\let\!!stringa #1\redoglobal\let#1#2\dodoglobal\let#2\!!stringa}
%D \macros
%D {pushmacro,popmacro}
@@ -5259,38 +5566,38 @@
%D We have to use a two||step implementation, because the
%D expansion has to take place outside \type{\uppercase}.
-\def\p!DOIF#1#2%
- {\uppercase{\ifinstringelse{$#1$}{$#2$}}%
+\unexpanded\def\DOIF#1#2%
+ {\uppercase{{$#1$}{$#2$}}%
\expandafter\firstofoneargument
\else
\expandafter\gobbleoneargument
\fi}
-\def\p!DOIFNOT#1#2%
- {\uppercase{\ifinstringelse{$#1$}{$#2$}}%
+\unexpanded\def\DOIFNOT#1#2%
+ {\uppercase{{$#1$}{$#2$}}%
\expandafter\gobbleoneargument
\else
\expandafter\firstofoneargument
\fi}
-\def\p!DOIFELSE#1#2%
- {\uppercase{\ifinstringelse{$#1$}{$#2$}}%
+\unexpanded\def\DOIFELSE#1#2%
+ {\uppercase{{$#1$}{$#2$}}%
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
-\def\p!DOIFINSTRINGELSE#1#2%
- {\uppercase{\ifinstringelse{#1}{#2}}%
+\unexpanded\def\DOIFINSTRINGELSE#1#2%
+ {\uppercase{{$#1$}{$#2$}}%
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
-\def\DOIF {\ExpandBothAfter\p!DOIF}
-\def\DOIFNOT {\ExpandBothAfter\p!DOIFNOT}
-\def\DOIFELSE {\ExpandBothAfter\p!DOIFELSE}
-\def\DOIFINSTRINGELSE {\ExpandBothAfter\p!DOIFINSTRINGELSE}
+\def\DOIF #1#2{\normalexpanded{\p!DOIF {#1}{#2}}}
+\def\DOIFNOT #1#2{\normalexpanded{\p!DOIFNOT {#1}{#2}}}
+\def\DOIFELSE #1#2{\normalexpanded{\p!DOIFELSE {#1}{#2}}}
+\def\DOIFINSTRINGELSE #1#2{\normalexpanded{\p!DOIFINSTRINGELSE{#1}{#2}}}
%D \macros
%D {dosingleargumentwithset,
@@ -5619,8 +5926,8 @@
\def\untexsomething
{\begingroup
- \catcode`\{=\@@ignore
- \catcode`\}=\@@ignore
+ \catcode\leftbraceasciicode \ignorecatcode
+ \catcode\rightbraceasciicode\ignorecatcode
\escapechar\minusone
\dountexsomething}
@@ -5896,8 +6203,18 @@
%D helps a lot. The second boolena can be used to inhibit
%D processing completely.
-\newif\iftrialtypesetting \trialtypesettingfalse
-\newif\ifvisible \visibletrue
+\newif\ifvisible \visibletrue
+
+\newtoks\everysettrialtypesetting
+\newtoks\everyresettrialtypesetting
+
+\unexpanded\def\settrialtypesetting {\the\everysettrialtypesetting } % obeys grouping so
+\unexpanded\def\resettrialtypesetting{\the\everyresettrialtypesetting} % this one is seldom needed
+
+\let\iftrialtypesetting\iffalse % so we have no \trialtypesettingtrue|false in mkiv !
+
+\appendtoks \let\iftrialtypesetting\iftrue \to \everysettrialtypesetting
+\appendtoks \let\iftrialtypesetting\iffalse \to \everyresettrialtypesetting
%D \macros
%D {startlocal, startglobal}
@@ -6403,10 +6720,11 @@
%D
%D This is a dirty one: we simply append a unit and discard it when needed.
-\newdimen\roundingeps \roundingeps=10sp
+\newdimen \roundingeps \roundingeps=10sp
+\newconstant\compresult
\def\comparedimension#1#2%
- {\chardef\compresult
+ {\compresult
\ifdim#1<#2%
\zerocount
\else\ifdim#1<#2%
@@ -6416,7 +6734,7 @@
\fi\fi}
\def\comparedimensioneps#1#2% todo: use eps feature
- {\chardef\compresult
+ {\compresult
\ifdim\dimexpr#1-#2\relax<\roudingeps
\zerocount
\else\ifdim\dimexpr#2-#1\relax<\roudingeps
@@ -6461,9 +6779,10 @@
\dounspaced}
\def\unspaceargument#1\to#2%
- {\scratchcounter\catcode32\relax
- \catcode32\@@ignore\scantextokens{\edef#2{#1}}%
- \catcode32\scratchcounter}
+ {\scratchcounter\catcode\spaceasciicode
+ \catcode\spaceasciicode\ignorecatcode
+ \scantextokens{\edef#2{#1}}%
+ \catcode\spaceasciicode\scratchcounter}
\def\unspaceafter#1#2%
{\unspaceargument#2\to\ascii
@@ -6609,8 +6928,8 @@
% \fi
% \def\elapsedseconds{\expandafter\withoutpt\the\dimexpr\elapsedtime sp\relax}
-\def\resettimer {\ctxlua{commands.resettimer()}}
-\def\elapsedtime {\ctxlua{commands.elapsedtime()}}
+\def\resettimer {\ctxcommand{resettimer()}}
+\def\elapsedtime {\ctxcommand{elapsedtime()}}
\let\elapsedseconds \elapsedtime
\newcount\featuretest
@@ -6624,10 +6943,10 @@
\def\retestfeature % timer support is new per 10/5/2005
{\bgroup
\ifcase\interactionmode\let\wait\relax\fi
- \writestatus\m!systems{starting feature test}\wait
+ \writestatus\m!system{starting feature test}\wait
\resettimer
\featuretest\zerocount \dotestfeature
- \writestatus\m!systems{feature test done (\elapsedseconds s)}%
+ \writestatus\m!system{feature test done (\elapsedseconds s)}%
\wait
\egroup}
@@ -6659,32 +6978,6 @@
\def\negated#1{\if-#1\else-#1\fi} % does only work in macros or text
-% This permits things like ^\index{hans}^, where hans is
-% duplicated in the text.
-
-\newif\ifduplicate
-
-\bgroup
-
-\gdef\checkduplication % in line with Knuth
- {\ifmmode\expandafter^\else\expandafter\startduplication\fi}
-
-\gdef\insideduplication
- {\ifmmode\expandafter^\else\expandafter\egroup\fi}
-
-\catcode`\^=\@@active
-
-\gdef\enableduplication
- {\catcode`\^=\@@active \let^\checkduplication}
-
-\gdef\disableduplication
- {\catcode`\^=\@@superscript}
-
-\gdef\startduplication
- {\bgroup \duplicatetrue \let^\insideduplication}
-
-\egroup
-
\def\gobbleassigndimen#1\\{}
\def\assigndimen#1#2%
@@ -6744,14 +7037,6 @@
\long\def\@@if@@equal@@true #1\@@then#2#3{#2}
\long\def\@@if@@equal@@false#1\@@then#2#3{#3}
-%D new stuff :
-
-\def\partialexpanded#1%
- {\let\@@notexpanded\noexpand
- \long\xdef\@@expanded{\noexpand#1}%
- \let\@@notexpanded\empty
- \@@expanded}
-
\def\appended#1#2#3{\@EA#1\@EA#2\@EA{#2#3}}
\def\appendvalue #1{\@EA\appended\@EA \def\csname#1\endcsname}
\def\appendgvalue#1{\@EA\appended\@EA\gdef\csname#1\endcsname}
@@ -6769,6 +7054,8 @@
%D bibliography module. The numbers compressor converts the
%D list in a list of ranges. The normal compressor remove duplicate
%D and empty entries.
+%D
+%D This is now obsolete (and more a \LUA\ thing anyway).
\def\compresscommalistnrs[#1]%
{\let\compressedlist\empty
@@ -6877,18 +7164,6 @@
%D \stoplines
%D \macros
-%D {stripstring}
-%D
-%D Needed in bookmarks:
-%D
-%D \starttyping
-%D {\sanitizePDFdocencoding test \CONTEXT\ test \to\oeps\stripstring\oeps\tttf[\oeps]}
-%D \stoptyping
-
-\def\stripstring#1% #1 is \cs
- {\edef\cs{\ctxlua{tex.sprint(tex.vrbcatcodes,string.strip(\!!bs\detokenize\expandafter{#1}\!!es))}}}
-
-%D \macros
%D {dowithrange}
%D
%D This one is for Mojca Miklavec, who made me aware of the fact that
@@ -6954,6 +7229,7 @@
\def\doprocesswords#1 #2\od
{\doifsomething{#1}{\processword{#1} \doprocesswords#2 \od}}
+% {\doifsomething{\detokenize{#1}}{\processword{#1} \doprocesswords#2 \od}} % to be tested
\def\processwords#1%
{\doprocesswords#1 \od}% no \unskip
@@ -7012,7 +7288,18 @@
%D A variant for \type {\executeifdefined}:
-\def\expandcheckedcsname#1#2#3%
+% \def\expandcheckedcsname#1#2#3%
+% {\csname#1\ifcsname#1#2\endcsname#2\else#3\fi\endcsname}
+
+\def\expandcheckedcsname#1#2% #2 is often a \xxxparameter so let's expand it once
+ {\normalexpanded{\noexpand\doexpandcheckedcsname{#1}{#2}}}
+
+\def\doexpandcheckedcsname#1#2#3%
{\csname#1\ifcsname#1#2\endcsname#2\else#3\fi\endcsname}
+%D Signal. Some fonts have a char0 rendering so we need to make sure that it
+%D is not set in the font!
+
+\unexpanded\def\signalcharacter{\char\zerocount} % \zwj
+
\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 638f3c797bf..bcc0205286e 100644
--- a/Master/texmf-dist/tex/context/base/syst-con.lua
+++ b/Master/texmf-dist/tex/context/base/syst-con.lua
@@ -13,13 +13,23 @@ converters = converters or { }
the top of <l n='luatex'/>'s char range but outside the unicode range.</p>
--ldx]]--
+local tonumber = tonumber
local char, texsprint, format = unicode.utf8.char, tex.sprint, string.format
-function converters.hexstringtonumber(n) texsprint(tonumber(n,16)) end
-function converters.octstringtonumber(n) texsprint(tonumber(n, 8)) end
-function converters.rawcharacter (n) texsprint(char(0x110000+n)) end
-function converters.lchexnumber (n) texsprint(format("%x" ,n)) end
-function converters.uchexnumber (n) texsprint(format("%X" ,n)) end
-function converters.lchexnumbers (n) texsprint(format("%02x",n)) end
-function converters.uchexnumbers (n) texsprint(format("%02X",n)) end
-function converters.octnumber (n) texsprint(format("%03o",n)) end
+function converters.hexstringtonumber(n) tonumber(n,16) end
+function converters.octstringtonumber(n) tonumber(n, 8) end
+function converters.rawcharacter (n) char(0x110000+n) end
+function converters.lchexnumber (n) format("%x" ,n) end
+function converters.uchexnumber (n) format("%X" ,n) end
+function converters.lchexnumbers (n) format("%02x",n) end
+function converters.uchexnumbers (n) format("%02X",n) end
+function converters.octnumber (n) format("%03o",n) end
+
+function commands.hexstringtonumber(n) context(tonumber(n,16)) end
+function commands.octstringtonumber(n) context(tonumber(n, 8)) end
+function commands.rawcharacter (n) context(char(0x110000+n)) end
+function commands.lchexnumber (n) context(format("%x" ,n)) end
+function commands.uchexnumber (n) context(format("%X" ,n)) end
+function commands.lchexnumbers (n) context(format("%02x",n)) end
+function commands.uchexnumbers (n) context(format("%02X",n)) end
+function commands.octnumber (n) context(format("%03o",n)) end
diff --git a/Master/texmf-dist/tex/context/base/syst-con.mkiv b/Master/texmf-dist/tex/context/base/syst-con.mkiv
index f7d4150a6e2..1091be85970 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{\ctxlua{converters.lchexnumber(\number#1)}}
-\def\uchexnumber #1{\ctxlua{converters.uchexnumber(\number#1)}}
-\def\lchexnumbers#1{\ctxlua{converters.lchexnumbers(\number#1)}}
-\def\uchexnumbers#1{\ctxlua{converters.uchexnumbers(\number#1)}}
+\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)}}
\let\hexnumber\uchexnumber
@@ -58,7 +58,7 @@
%D
%D For unicode remapping purposes, we need octal numbers.
-\def\octnumber#1{\ctxlua{converters.octnumber(\number#1)}}
+\def\octnumber#1{\ctxcommand{octnumber(\number#1)}}
%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{\ctxlua{converters.hexstringtonumber("#1")}}
-\def\octstringtonumber#1{\ctxlua{converters.octstringtonumber("#1")}}
+\def\hexstringtonumber#1{\ctxcommand{hexstringtonumber("#1")}}
+\def\octstringtonumber#1{\ctxcommand{octstringtonumber("#1")}}
%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{\ctxlua{converters.rawcharacter(\number#1)}}
+\def\rawcharacter#1{\ctxcommand{rawcharacter(\number#1)}}
%D \macros
%D {twodigits, threedigits}
@@ -134,12 +134,18 @@
% \let\calculatecos\gobbleoneargument
% \let\calculatetan\gobbleoneargument
-% \def\calculatedsin#1{\ctxlua{tex.sprint(tex.ctxcatcodes,math.sin(#1))}}
-% \def\calculatedcos#1{\ctxlua{tex.sprint(tex.ctxcatcodes,math.cos(#1))}}
-% \def\calculatedtan#1{\ctxlua{tex.sprint(tex.ctxcatcodes,math.tan(#1))}}
+% \def\calculatedsin#1{\ctxsprint{math.sin(#1)}}
+% \def\calculatedcos#1{\ctxsprint{math.cos(#1)}}
+% \def\calculatedtan#1{\ctxsprint{math.tan(#1)}}
-\def\setcalculatedsin#1#2{\edef#1{\ctxlua{tex.sprint(tex.ctxcatcodes,math.sind(#2))}}}
-\def\setcalculatedcos#1#2{\edef#1{\ctxlua{tex.sprint(tex.ctxcatcodes,math.cosd(#2))}}}
-\def\setcalculatedtan#1#2{\edef#1{\ctxlua{tex.sprint(tex.ctxcatcodes,math.tand(#2))}}}
+% \def\setcalculatedsin#1#2{\edef#1{\ctxsprint{math.sind(#2)}}}
+% \def\setcalculatedcos#1#2{\edef#1{\ctxsprint{math.cosd(#2)}}}
+% \def\setcalculatedtan#1#2{\edef#1{\ctxsprint{math.tand(#2)}}}
+
+% this is actually 20% faster: some overhead in functions but less tokenization
+
+\def\setcalculatedsin#1#2{\edef#1{\cldcontext{math.sind(#2)}}}
+\def\setcalculatedcos#1#2{\edef#1{\cldcontext{math.cosd(#2)}}}
+\def\setcalculatedtan#1#2{\edef#1{\cldcontext{math.tand(#2)}}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/syst-ext.mkii b/Master/texmf-dist/tex/context/base/syst-ext.mkii
index 73fb98b728f..2357e81f1b1 100644
--- a/Master/texmf-dist/tex/context/base/syst-ext.mkii
+++ b/Master/texmf-dist/tex/context/base/syst-ext.mkii
@@ -121,21 +121,21 @@
\dodoglobal\@if#1{false}%
\escapechar\scratchcounter}
-%D Also new:
+%D Also:
\def\define#1%
{\ifx#1\undefined
- \expandafter\def
+ \expandafter\long\expandafter\def
\else
\message{[\noexpand#1is already defined]}%
- \expandafter\def\expandafter\gobbleddefinition
+ \expandafter\long\expandafter\def\expandafter\gobbleddefinition
\fi#1}
\def\redefine#1%
{\ifx#1\undefined\else
\message{[\noexpand#1is redefined]}%
\fi
- \def#1}
+ \long\def#1}
% \define\hans{hans}
% \redefine\hans{hans}
@@ -4991,9 +4991,9 @@
\def\comparedimensioneps#1#2%
{\chardef\compresult
- \ifdim\dimexpr(#1-#2)<\roudingeps
+ \ifdim\dimexpr#1-#2\relax<\roudingeps
\zerocount
- \else\ifdim\dimexpr(#2-#1)<\roudingeps
+ \else\ifdim\dimexpr#2-#1\relax<\roudingeps
\zerocount
\else\ifdim#1<#2%
\plusone
diff --git a/Master/texmf-dist/tex/context/base/syst-ini.tex b/Master/texmf-dist/tex/context/base/syst-ini.mkii
index 7c9d72127a7..c2c3e1947d2 100644
--- a/Master/texmf-dist/tex/context/base/syst-ini.tex
+++ b/Master/texmf-dist/tex/context/base/syst-ini.mkii
@@ -50,7 +50,7 @@
%.......
%catcode`\z = 11
-\chardef\active = 13
+\chardef\activecatcode = 13 % later this will become a counter
\def ^^L{\par}
\def\^^M{\ } % control <return> = control <space>
@@ -94,29 +94,27 @@
\ifnum\texengine=\luatexengine
\directlua 0 { % this info is stored in the format
- if lua.name then
- lua.name[0] = "main ctx instance"
+ lua.name[0] = "main ctx instance"
+ local extraprimitives = tex.extraprimitives
+ local enableprimitives = tex.enableprimitives
+ local core = extraprimitives('core')
+ local btex = extraprimitives('tex')
+ local etex = extraprimitives('etex')
+ local pdftex = extraprimitives('pdftex')
+ local luatex = extraprimitives('luatex')
+ local omega = {
+ "textdir", "pagedir", "mathdir", "pardir", "bodydir",
+ "leftghost", "rightghost", "localleftbox", "localrightbox",
+ "localinterlinepenalty", "localbrokenpenalty",
+ }
+ local aleph = {
+ "boxdir", "pagebottomoffset", "pagerightoffset",
+ }
+ for _, subset in next, { etex, pdftex, luatex, omega, aleph } do
+ enableprimitives('',subset)
end
- if tex.extraprimitives then
- local core = tex.extraprimitives('core')
- local btex = tex.extraprimitives('tex')
- local etex = tex.extraprimitives('etex')
- local pdftex = tex.extraprimitives('pdftex')
- local luatex = tex.extraprimitives('luatex')
- local omega = {
- "textdir", "pagedir", "mathdir", "pardir", "bodydir",
- "leftghost", "rightghost", "localleftbox", "localrightbox",
- "localinterlinepenalty", "localbrokenpenalty",
- }
- local aleph = {
- "boxdir", "pagebottomoffset", "pagerightoffset",
- }
- for _, subset in pairs { etex, pdftex, luatex, omega, aleph } do
- tex.enableprimitives('',subset)
- end
- for _, subset in pairs { core, btex, etex, pdftex, luatex, omega, aleph } do
- tex.enableprimitives('normal',subset)
- end
+ for _, subset in next, { core, btex, etex, pdftex, luatex, omega, aleph } do
+ enableprimitives('normal',subset)
end
}
\fi
@@ -157,6 +155,12 @@
%D
%D We reserve some registers for special (management) purposes:
+% 0 - 20 : scratch
+% 21 - 127 : internal
+% 128 - 254 : inserts
+% 255 : page
+% 256 - : user
+
\countdef \minallocatedregister = 52 \minallocatedregister = 256
\countdef \maxallocatedregister = 53 \maxallocatedregister = 32767
\countdef \minallocatediochannel = 54 \minallocatediochannel = -1
@@ -177,22 +181,28 @@
\countdef \lastallocatedread = 38 \lastallocatedread = \minallocatediochannel
\countdef \lastallocatedwrite = 39 \lastallocatedwrite = \minallocatediochannel
\countdef \lastallocatedmarks = 40 \lastallocatedmarks = \minallocatedregister
-\countdef \lastallocatedlanguage = 41 \lastallocatedlanguage = \minallocatedlanguage
+\countdef \lastallocatedlanguage = 41 \lastallocatedlanguage = \minallocatedlanguage % not used in context
\countdef \lastallocatedinsertion = 42 \lastallocatedinsertion = \minallocatedinsert
-\countdef \lastallocatedfamily = 43 \lastallocatedfamily = \minallocatedfamily
+\countdef \lastallocatedfamily = 43 \lastallocatedfamily = \minallocatedfamily % not used in context
\countdef \lastallocatedattribute = 44 \lastallocatedattribute = \minallocatedregister
\countdef \mincountervalue = 125 \mincountervalue = -"7FFFFFFF % beware, we use index 125 at the lua end
\countdef \maxcountervalue = 126 \maxcountervalue = "7FFFFFFF % beware, we use index 126 at the lua end
-\countdef \minusone = 127 \minusone = -1
-\chardef \zerocount = 0
-\chardef \plusone = 1
-\chardef \normalpagebox = 255 % hardcoded in the engine
+%countdef \minusone = 127 \minusone = -1
+%chardef \zerocount = 0
+%chardef \plusone = 1
+
+\countdef \zerocount = 120 \zerocount = 0
+\countdef \plusone = 121 \plusone = 1
+\countdef \minusone = 122 \minusone = -1
+
+%chardef \normalpagebox = 255
+\countdef \normalpagebox = 127 \normalpagebox = 255 % hardcoded in pdftex/xetex
% A few traditional allocations:
-\countdef \count@ = 255 % hm, used in \newif
+\countdef \count@ = 255 % hm, used in \newif .. todo: replace it there
\dimendef \dimen@ = 0
\dimendef \dimen@i = 1 % global only
\dimendef \dimen@ii = 2
@@ -216,12 +226,23 @@
\def\newread {\allocateregister\lastallocatedread \read \chardef \maxallocatediochannel}
\def\newwrite {\allocateregister\lastallocatedwrite \write \chardef \maxallocatediochannel}
\def\newmarks {\allocateregister\lastallocatedmarks \marks \mathchardef\maxallocatedregister}
-\def\newlanguage{\allocateregister\lastallocatedlanguage \language\chardef \maxallocatedlanguage}
\def\newinsert {\allocateregister\lastallocatedinsertion\insert \chardef \maxallocatedinsert}
+
+%D We don't need these in \CONTEXT:
+
+\def\newlanguage{\allocateregister\lastallocatedlanguage \language\chardef \maxallocatedlanguage}
\def\newfamily {\allocateregister\lastallocatedfamily \fam \chardef \maxallocatedfamily}
\let\newfam\newfamily
+% Watch out, for the moment we disable the check for already being defined
+% later we will revert this but first all chardefs must be replaced.
+
+\def\newconstant #1{\ifdefined#1\let#1\undefined\fi\newcount#1}
+\def\setnewconstant#1{\ifdefined#1\let#1\undefined\fi\newcount#1#1} % just a number
+
+% maybe setconstant with check
+
% %D The next definitions are really needed (in \CONTEXT):
%newlinechar=10 \def\outputnewlinechar{\rawcharacter{10}}
@@ -318,7 +339,7 @@
\newtoks \emptytoks
-%D And even more:
+%D And even more: (todo: countdefs 60+)
%newcount \minusone \minusone = -1
\newcount \minustwo \minustwo = -2
@@ -358,10 +379,15 @@
%D We prefer the more readable variant than in plain
%D \TEX. User should only use \type {\emptybox}:
-\newbox\voidbox
+\newbox\voidbox % public
+
+\let\normalhbox\hbox
+\let\normalvbox\vbox
-\def\emptybox {\box \voidbox}
\def\unvoidbox{\unhbox\voidbox}
+\def\emptybox {\box \voidbox} % used in initializations so no attributes
+\def\emptyvbox{\normalvbox{}} % no copy as we need to set attributes
+\def\emptyhbox{\normalhbox{}} % no copy as we need to set attributes
\let\leavevmode\unvoidbox % we prefer to use \dontleavehmode
@@ -415,6 +441,10 @@
\newif\ifdone
+%D Potential primitive in \LUATEX:
+
+\ifdefined\htdp \else \def\htdp#1{\dimexpr\ht#1+\dp#1\relax} \fi
+
%D \macros
%D {@@escape,@@begingroup,@@endgroup,@@mathshift,@@alignment,
%D @@endofline,@@parameter,@@superscript,@@subscript,
@@ -424,7 +454,8 @@
%D characters. Because we are not that good at remembering numbers,
%D we introduce some symbolic names.
-%D As we now have catc-* files, we also have more readable names
+%D As we now have catc-* files, we also have more readable names but
+%D We will keep the following around for a while.
\chardef\@@escape = 0
\chardef\@@begingroup = 1
@@ -438,8 +469,8 @@
\chardef\@@ignore = 9
\chardef\@@space = 10
\chardef\@@letter = 11
-\chardef\@@other = 12 \chardef\other = 12
-\chardef\@@active = 13 \chardef\active = 13
+\chardef\@@other = 12
+\chardef\@@active = 13
\chardef\@@comment = 14
%D Constants to be used with \type {\currentgrouptype}.
@@ -634,16 +665,20 @@
%D change.
\bgroup
- \catcode`\^^M=\active%
- \gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
+ \catcode`\^^M=\activecatcode%
+ \gdef\obeylines{\catcode`\^^M\activecatcode \let^^M\par}%
\global\let^^M\par%
\egroup
\bgroup
- \gdef\obeyspaces{\catcode`\ \active}%
+ \gdef\obeyspaces{\catcode`\ \activecatcode}%
\obeyspaces\global\let =\space%
\egroup
+%D A constant:
+
+\let\endoflinetoken=^^M
+
%D Also needed might be a simple loop structure and we borrow
%D plain \TEX's one as it is often expected to be present and
%D it is about the fastest you can get. Beware: this macro
diff --git a/Master/texmf-dist/tex/context/base/syst-ini.mkiv b/Master/texmf-dist/tex/context/base/syst-ini.mkiv
new file mode 100644
index 00000000000..18388fa2100
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/syst-ini.mkiv
@@ -0,0 +1,933 @@
+%D \module
+%D [ file=syst-ini,
+%D version=2008.11.04, % 2001.11.16, % 1999.03.17, % an oldie: 1995.10.10
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Bootstrapping \TEX,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 We used to load plain \TEX\ in a special way, but redefining
+%D a couple of primitives so that for instance font loading was
+%D ignored. For those interested, this loader is found in
+%D \type {syst-tex.tex}. Some of the comment's are Don Knuth's
+%D and more of it can be found in the plain \TEX\ format.
+
+%D Characters can have special states, that can be triggered
+%D by setting their category coded. Some are preset, others
+%D are to be set as soon as possible, otherwise we cannot
+%D define any useful macros.
+
+%catcode`\^^@ = 9 % ascii null is ignored
+%catcode`\\ = 0 % backslash is TeX escape character
+
+\catcode`\{ = 1 % left brace is begin-group character
+\catcode`\} = 2 % right brace is end-group character
+\catcode`\$ = 3 % dollar sign is math shift
+\catcode`\& = 4 % ampersand is alignment tab
+\catcode`\# = 6 % hash mark is macro parameter character
+\catcode`\^ = 7 % circumflex and uparrow are for superscripts
+\catcode`\_ = 8 % underline and downarrow are for subscripts
+\catcode`\^^I = 10 % ascii tab is a blank space
+
+%catcode`\^^M = 5 % ascii return is end-line
+%catcode`\% = 14 % percent sign is comment character
+%catcode`\ = 10 % ascii space is blank space
+%catcode`\^^? = 15 % ascii delete is invalid
+
+\catcode`\~ = 13 % tilde is active
+\catcode`\^^L = 13 % ascii form-feed
+
+%catcode`\A = 11
+%.......
+%catcode`\Z = 11
+
+%catcode`\a = 11
+%.......
+%catcode`\z = 11
+
+\chardef\activecatcode = 13 % later this will become a counter
+
+\def ^^L{\par}
+\def\^^M{\ } % control <return> = control <space>
+\def\^^I{\ } % same for <tab>
+
+%D In \CONTEXT, we simply ignore end||of||file tokens:
+
+\catcode`\^^Z=9
+
+%D It makes sense to know what engine we're running so let's
+%D try to deduce it.
+
+\chardef\unknownengine = 0
+\chardef\pdftexengine = 1
+\chardef\xetexengine = 2
+\chardef\luatexengine = 3
+
+\ifx\directlua\undefined
+ \ifx\XeTeXversion\undefined
+ \ifx\pdftexversion\undefined
+ \let\texengine\unknownengine
+ \else
+ \let\texengine\pdftexengine
+ \fi
+ \else
+ \let\texengine\xetexengine
+ \fi
+\else
+ \let\texengine\luatexengine
+\fi
+
+\ifnum\texengine=\luatexengine
+ % for historic reasons we keep some mkii code around
+\else
+ \immediate\write16{>>>}
+ \immediate\write16{>>> only luatex is supported}
+ \immediate\write16{>>>}
+ \let\dump\relax
+ \expandafter\end
+\fi
+
+% todo: pdfsave pdfrestore pdfcolor... don't initialize them
+
+\ifnum\texengine=\luatexengine
+ \directlua 0 { % this info is stored in the format
+ lua.name[0] = "main ctx instance"
+ local extraprimitives = tex.extraprimitives
+ local enableprimitives = tex.enableprimitives
+ local core = extraprimitives('core')
+ local btex = extraprimitives('tex')
+ local etex = extraprimitives('etex')
+ local pdftex = extraprimitives('pdftex')
+ local luatex = extraprimitives('luatex')
+ local omega = {
+ "textdir", "pagedir", "mathdir", "pardir", "bodydir",
+ "leftghost", "rightghost", "localleftbox", "localrightbox",
+ "localinterlinepenalty", "localbrokenpenalty",
+ }
+ local aleph = {
+ "boxdir", "pagebottomoffset", "pagerightoffset",
+ }
+ for _, subset in next, { etex, pdftex, luatex, omega, aleph } do
+ enableprimitives('',subset)
+ end
+ for _, subset in next, { core, btex, etex, pdftex, luatex, omega, aleph } do
+ enableprimitives('normal',subset)
+ end
+ }
+\fi
+
+%D \ETEX\ has a not so handy way of telling you the version number,
+%D i.e. the revision number has a period in it:
+
+\long\def\gobbleoneargument#1{} % will be defined later on anyway
+
+\mathchardef\etexversion =
+ \numexpr\eTeXversion*100+\expandafter\gobbleoneargument\eTeXrevision\relax
+
+%D First we define a simplified version of the \CONTEXT\
+%D protection mechanism.
+
+\def\unprotect{\catcode`@=11 }
+\def\protect {\catcode`@=12 }
+
+\unprotect
+
+%D Some pretty important definitions:
+
+\let\bgroup={
+\let\egroup=}
+
+%D Allocation of registers is done slightly different than in plain
+%D \TEX. First of all we use different reserved counters. We also
+%D don't implement a family handler because users are not supposed
+%D to implement their own math. We reserve the lowest 31 registers
+%D for scratch purposes. Keep in mind that in the core engine
+%D some registers are reserved: counters 0 upto 9, and counter 255.
+%D
+%D As with plain \TEX\ we recommend that macro designers always use
+%D \type {\global} assignments with respect to registers numbered 1,
+%D 3, 5 \unknown\ 31, and always non||\type {\global} assignments
+%D with respect to registers 0, 2, 4, \unknown\ 30. This will prevent
+%D \quote {save stack buildup} that might otherwise occur.
+%D
+%D We reserve some registers for special (management) purposes:
+
+% 0 - 20 : scratch
+% 21 - 127 : internal
+% 128 - 254 : inserts
+% 255 : page
+% 256 - : user
+
+\countdef \minallocatedregister = 52 \minallocatedregister = 256 % can change
+\countdef \maxallocatedregister = 53 \maxallocatedregister = 32767
+\countdef \minallocatediochannel = 54 \minallocatediochannel = -1
+\countdef \maxallocatediochannel = 55 \maxallocatediochannel = 16
+\countdef \minallocatedlanguage = 56 \minallocatedlanguage = 0
+\countdef \maxallocatedlanguage = 57 \maxallocatedlanguage = 255
+\countdef \maxallocatedinsert = 58 \maxallocatedinsert = 254
+\countdef \minallocatedinsert = 59 \minallocatedinsert = 128
+\countdef \minallocatedfamily = 60 \minallocatedfamily = 128
+\countdef \maxallocatedfamily = 61 \maxallocatedfamily = 255
+\countdef \minallocatedattribute = 62 \minallocatedattribute = 1024 % 127-1023 : private
+
+\countdef \lastallocatedcount = 32 \lastallocatedcount = \minallocatedregister
+\countdef \lastallocateddimen = 33 \lastallocateddimen = \minallocatedregister
+\countdef \lastallocatedskip = 34 \lastallocatedskip = \minallocatedregister
+\countdef \lastallocatedmuskip = 35 \lastallocatedmuskip = \minallocatedregister
+\countdef \lastallocatedbox = 36 \lastallocatedbox = \minallocatedregister
+\countdef \lastallocatedtoks = 37 \lastallocatedtoks = \minallocatedregister
+\countdef \lastallocatedread = 38 \lastallocatedread = \minallocatediochannel
+\countdef \lastallocatedwrite = 39 \lastallocatedwrite = \minallocatediochannel
+\countdef \lastallocatedmarks = 40 \lastallocatedmarks = \minallocatedregister
+\countdef \lastallocatedlanguage = 41 \lastallocatedlanguage = \minallocatedlanguage % not used in context
+\countdef \lastallocatedinsertion = 42 \lastallocatedinsertion = \minallocatedinsert
+\countdef \lastallocatedfamily = 43 \lastallocatedfamily = \minallocatedfamily % not used in context
+\countdef \lastallocatedattribute = 44 \lastallocatedattribute = \minallocatedattribute
+
+\countdef \mincountervalue = 125 \mincountervalue = -"7FFFFFFF % beware, we use index 125 at the lua end
+\countdef \maxcountervalue = 126 \maxcountervalue = "7FFFFFFF % beware, we use index 126 at the lua end
+
+%countdef \minusone = 127 \minusone = -1
+%chardef \zerocount = 0
+%chardef \plusone = 1
+
+\countdef \zerocount = 120 \zerocount = 0
+\countdef \plusone = 121 \plusone = 1
+\countdef \minusone = 122 \minusone = -1
+
+%chardef \normalpagebox = 255
+\countdef \normalpagebox = 127 \normalpagebox = 255 % hardcoded in pdftex/xetex
+
+% A few traditional allocations:
+
+\countdef \count@ = 255 % hm, used in \newif .. todo: replace it there
+\dimendef \dimen@ = 0
+\dimendef \dimen@i = 1 % global only
+\dimendef \dimen@ii = 2
+
+%D So, effectively we start allocating from 256 and upwards. The
+%D inserts sit in the range 128 upto 254. Page numbers use the
+%D counters 0 upto 9 and the pagebox is 255. Users can use the
+%D scratch registers upto 31 without problem but all others are
+%D reserved.
+
+\def\wlog#1{} % \def\wlog{\immediate\write\minusone} % write on log file (only)
+
+%D The allocators share a common helper macro.
+
+\def\newcount {\allocateregister\lastallocatedcount \count \countdef \maxallocatedregister}
+\def\newdimen {\allocateregister\lastallocateddimen \dimen \dimendef \maxallocatedregister}
+\def\newskip {\allocateregister\lastallocatedskip \skip \skipdef \maxallocatedregister}
+\def\newmuskip {\allocateregister\lastallocatedmuskip \muskip \muskipdef \maxallocatedregister}
+\def\newbox {\allocateregister\lastallocatedbox \box \mathchardef\maxallocatedregister}
+\def\newtoks {\allocateregister\lastallocatedtoks \toks \toksdef \maxallocatedregister}
+\def\newread {\allocateregister\lastallocatedread \read \chardef \maxallocatediochannel}
+\def\newwrite {\allocateregister\lastallocatedwrite \write \chardef \maxallocatediochannel}
+\def\newmarks {\allocateregister\lastallocatedmarks \marks \mathchardef\maxallocatedregister}
+\def\newinsert {\allocateregister\lastallocatedinsertion\insert \chardef \maxallocatedinsert}
+
+%D We don't need these in \CONTEXT:
+
+\def\newlanguage{\allocateregister\lastallocatedlanguage \language\chardef \maxallocatedlanguage}
+\def\newfamily {\allocateregister\lastallocatedfamily \fam \chardef \maxallocatedfamily}
+
+\let\newfam\newfamily
+
+% Watch out, for the moment we disable the check for already being defined
+% later we will revert this but first all chardefs must be replaced.
+
+\def\newconstant #1{\ifdefined#1\let#1\undefined\fi\newcount#1}
+\def\setnewconstant#1{\ifdefined#1\let#1\undefined\fi\newcount#1#1} % just a number
+
+% maybe setconstant with check
+
+% %D The next definitions are really needed (in \CONTEXT):
+
+%newlinechar=10 \def\outputnewlinechar{\rawcharacter{10}}
+\newlinechar=10 \edef\outputnewlinechar{^^J}
+
+%D One reason to start high with allocation is that it permits us to
+%D allocate consecutive ranges more easily, for instance if for \MPLIB\
+%D we want to allocate a continuous range of boxes. It also permits us
+%D to do a proper upward allocation for inserts. The current code
+%D evolved from code that dealt with older engines but as all engines
+%D now provide many registers we removed all traces.
+
+\ifdefined\writestatus \else
+ \def\writestatus#1#2{\immediate\write16{#1: #2}}
+\fi
+
+\def\allocateregisteryes#1#2#3#4#5% last class method max name
+ {\ifnum#1<#4\relax
+ \global\advance#1\plusone
+ \global#3#5=#1\relax
+ \else
+ \writestatus{warning}{no room for \string#2\space \string#5\space (max: \number#4)}%
+ \fi}
+
+\def\allocateregisternop#1#2#3#4#5% last class method max name
+ {\writestatus{warning}{\string#2 \string#5 is already defined (\string\relax\space it first)}}
+
+\def\allocateregister#1#2#3#4#5% last class method max name
+ {\ifx#5\undefined
+ \expandafter\allocateregisteryes
+ \else\ifx#5\relax
+ \expandafter\expandafter\expandafter\allocateregisteryes
+ \else
+ \expandafter\expandafter\expandafter\allocateregisternop
+ \fi\fi
+ #1#2#3#4#5}
+
+%D Since the number of chars exceed 256 now, we can use \type
+%D {\chardef} instead of the more limited \type {\mathchardef}.
+
+\ifnum\texengine>\pdftexengine
+ \def\newbox {\allocateregister\lastallocatedbox \box \chardef\maxallocatedregister}
+ \def\newmarks{\allocateregister\lastallocatedmarks\marks\chardef\maxallocatedregister}
+\fi
+
+%D Attributes are something very \LUATEX. In \CONTEXT\ you are not
+%D supposed to use the attributes directly but always allocate then
+%D first. For instance attribute~0 is reserved for special purposes
+%D (this might change). Attributes in the range 128-1023 are private
+%D and should not be touched.
+
+\ifnum\texengine=\luatexengine
+ \let\attributeunsetvalue\mincountervalue % used to be \minusone
+ \def\newattribute{\allocateregister\minallocatedattribute\attribute\attributedef\maxallocatedregister}
+\fi
+
+%D Not used by \CONTEXT\ but for instance \PICTEX\ needs it. It's a
+%D trick to force strings instead of tokens that take more memory.
+%D It's a trick to trick to force strings.
+
+\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
+
+%D \macros
+%D {scratchcounter,
+%D scratchdimen,scratchskip,scratchmuskip,
+%D scratchbox,
+%D scratchtoks}
+%D
+%D We now define a few scratch registers, so that successive
+%D loads at least have some available.
+
+\newcount \scratchcounter \newcount \globalscratchcounter
+\newdimen \scratchdimen \newdimen \globalscratchdimen
+\newskip \scratchskip \newskip \globalscratchskip
+\newmuskip \scratchmuskip \newmuskip \globalscratchmuskip
+\newtoks \scratchtoks \newtoks \globalscratchtoks
+\newbox \scratchbox \newbox \globalscratchbox
+
+\newcount\scratchcounterone \newcount\scratchcountertwo \newcount\scratchcounterthree
+\newdimen \scratchdimenone \newdimen \scratchdimentwo \newdimen \scratchdimenthree
+\newdimen \scratchskipone \newdimen \scratchskiptwo \newdimen \scratchskipthree
+\newbox \scratchmuskipone \newbox \scratchmuskiptwo \newbox \scratchmuskipthree
+\newtoks \scratchtoksone \newtoks \scratchtokstwo \newtoks \scratchtoksthree
+\newbox \scratchboxone \newbox \scratchboxtwo \newbox \scratchboxthree
+
+%D More allocations:
+
+\newskip \zeroskip \zeroskip = 0pt plus 0pt minus 0pt
+\newdimen\zeropoint \zeropoint = 0pt
+\newdimen\onepoint \onepoint = 1pt
+\newdimen\maxdimen \maxdimen = 16383.99999pt
+\newdimen\onebasepoint \onebasepoint = 1bp
+\newdimen\scaledpoint \scaledpoint = 1sp
+\newdimen\thousandpoint\thousandpoint= 1000pt
+
+\let\points\onepoint
+
+\newtoks \emptytoks
+
+%D And even more: (todo: countdefs 60+)
+
+%newcount \minusone \minusone = -1
+\newcount \minustwo \minustwo = -2
+%chardef \zerocount = 0
+%chardef \plusone = 1
+\chardef \plustwo = 2
+\chardef \plusthree = 3
+\chardef \plusfour = 4
+\chardef \plusfive = 5
+\chardef \plussix = 6
+\chardef \plusseven = 7
+\chardef \pluseight = 8
+\chardef \plusnine = 9
+\chardef \plusten = 10
+\chardef \plussixteen = 16
+\chardef \plushundred = 100
+\chardef \pluscxxvii = 127
+\chardef \pluscxxviii = 128
+\chardef \pluscclv = 255
+
+\ifnum\texengine=\luatexengine
+ \chardef \pluscclvi = 256
+ \chardef \plusthousand = 1000
+ \chardef \plustenthousand = 10000
+ \chardef \plustwentythousand = 20000
+ \chardef \medcard = 32768
+ \chardef \maxcard = 65536 % pdftex has less mathchars
+\else
+ \mathchardef\pluscclvi = 256
+ \mathchardef\plusthousand = 1000
+ \mathchardef\plustenthousand = 10000
+ \mathchardef\plustwentythousand = 20000
+ \newcount \medcard \medcard = 32768 % pdftex has less mathchars
+ \newcount \maxcard \maxcard = 65536 % pdftex has less mathchars
+\fi
+
+%D We prefer the more readable variant than in plain
+%D \TEX. User should only use \type {\emptybox}:
+
+\newbox\voidbox % public
+
+\let\normalhbox\hbox
+\let\normalvbox\vbox
+
+\def\unvoidbox{\unhbox\voidbox}
+\def\emptybox {\box \voidbox} % used in initializations so no attributes
+\def\emptyvbox{\normalvbox{}} % no copy as we need to set attributes
+\def\emptyhbox{\normalhbox{}} % no copy as we need to set attributes
+
+\let\leavevmode\unvoidbox % we prefer to use \dontleavehmode
+
+%D Some expected plain variants follow. We don't reuse registers
+%D because we don't want clashes.
+
+\newdimen\p@ \p@ \onepoint
+\newcount\m@ne \m@ne \minusone
+\newdimen\z@ \z@ \zeropoint
+\let \@ne \plusone
+\let \tw@ \plustwo
+\let \thr@@ \plusthree
+\let \sixt@@n \sixteen
+\let \@cclv \pluscclv
+\let \@cclvi \pluscclvi
+\newbox \voidb@x
+\newtoks \toks@
+
+%D We define \type {\newif} a la plain \TEX, but will
+%D redefine it later. As Knuth says:
+%D
+%D \startnarrower
+%D And here's a different sort of allocation: for example,
+%D
+%D \starttyping
+%D \newif\iffoo
+%D \stoptyping
+%D
+%D creates \type {\footrue}, \type {\foofalse} to go
+%D with \type {\iffoo}.
+%D \stopnarrower
+
+\def\newif#1%
+ {\count@\escapechar
+ \escapechar\minusone
+ \expandafter\expandafter\expandafter\def\@if #1{true}{\let#1\iftrue }%
+ \expandafter\expandafter\expandafter\def\@if#1{false}{\let#1\iffalse}%
+ \@if#1{false}% the condition starts out false
+ \escapechar\count@}
+
+\def\@if#1#2%
+ {\csname\expandafter\if@\string#1#2\endcsname}
+
+\bgroup % `if' is required
+
+ \uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}
+
+\egroup
+
+%D Let's test this one:
+
+\newif\ifdone
+
+%D Potential primitive in \LUATEX:
+
+\ifdefined\htdp \else \def\htdp#1{\dimexpr\ht#1+\dp#1\relax} \fi
+
+%D \macros
+%D {@@escape,@@begingroup,@@endgroup,@@mathshift,@@alignment,
+%D @@endofline,@@parameter,@@superscript,@@subscript,
+%D @@ignore,@@space,@@letter,@@other,@@active,@@comment}
+%D
+%D In \CONTEXT\ we sometimes manipulate the \CATCODES\ of certain
+%D characters. Because we are not that good at remembering numbers,
+%D we introduce some symbolic names.
+
+%D As we now have catc-* files, we also have more readable names but
+%D We will keep the following around for a while.
+
+\chardef\@@escape = 0
+\chardef\@@begingroup = 1
+\chardef\@@endgroup = 2
+\chardef\@@mathshift = 3
+\chardef\@@alignment = 4
+\chardef\@@endofline = 5
+\chardef\@@parameter = 6
+\chardef\@@superscript = 7
+\chardef\@@subscript = 8
+\chardef\@@ignore = 9
+\chardef\@@space = 10
+\chardef\@@letter = 11
+\chardef\@@other = 12
+\chardef\@@active = 13
+\chardef\@@comment = 14
+
+%D Constants to be used with \type {\currentgrouptype}.
+
+\chardef\@@bottomlevelgroup = 0
+\chardef\@@simplegroup = 1
+\chardef\@@hboxgroup = 2
+\chardef\@@adjustedhboxgroup = 3
+\chardef\@@vboxgroup = 4
+\chardef\@@vtopgroup = 5
+\chardef\@@aligngroup = 6
+\chardef\@@noaligngroup = 7
+\chardef\@@outputgroup = 8
+\chardef\@@mathgroup = 9
+\chardef\@@discretionarygroup = 10
+\chardef\@@insertgroup = 11
+\chardef\@@vcentergroup = 12
+\chardef\@@mathchoicegroup = 13
+\chardef\@@semisimplegroup = 14
+\chardef\@@mathshiftgroup = 15
+\chardef\@@mathleftgroup = 16
+
+\chardef\@@vadjustgroup = \@@insertgroup
+
+%D Constants to be used with \type {\interactionmode}.
+
+\chardef\@@batchmode = 0
+\chardef\@@nonstopmode = 1
+\chardef\@@scrollmode = 2
+\chardef\@@errorstopmode = 3
+
+%D Constants to be used with \type {\lastnodetype}. The \type
+%D {\lastnodetype} primitive is \ETEX\ compliant. The valid range is
+%D still -1 .. 15 and glyph nodes have number 0 (used to be char
+%D node) and ligature nodes are mapped to 7. That way macro packages
+%D can use the same symbolic names as in traditional \ETEX. Keep in
+%D mind that the internal node numbers are different and that there
+%D are more node types that 15.
+
+\chardef\@@charnode = 0
+\chardef\@@hlistnode = 1
+\chardef\@@vlistnode = 2
+\chardef\@@rulenode = 3
+\chardef\@@insertnode = 4
+\chardef\@@marknode = 5
+\chardef\@@adjustnode = 6
+\chardef\@@ligaturenode = 7
+\chardef\@@discretionarynode = 8
+\chardef\@@whatsitnode = 9
+\chardef\@@mathnode = 10
+\chardef\@@gluenode = 11
+\chardef\@@kernnode = 12
+\chardef\@@penaltynode = 13
+\chardef\@@unsetnode = 14
+\chardef\@@mathsnode = 15
+
+%D Constants to be used with \type {\currentiftype}.
+
+\chardef\@@charif = 1
+\chardef\@@catif = 2
+\chardef\@@numif = 3
+\chardef\@@dimif = 4
+\chardef\@@oddif = 5
+\chardef\@@vmodeif = 6
+\chardef\@@hmodeif = 7
+\chardef\@@mmodeif = 8
+\chardef\@@innerif = 9
+\chardef\@@voidif = 10
+\chardef\@@hboxif = 11
+\chardef\@@vboxif = 12
+\chardef\@@xif = 13
+\chardef\@@eofif = 14
+\chardef\@@trueif = 15
+\chardef\@@falseif = 16
+\chardef\@@caseif = 17
+\chardef\@@definedif = 18
+\chardef\@@csnameif = 19
+\chardef\@@fontcharif = 20
+
+%D Of course we want even bigger log files, so we copied this
+%D from the \ETEX\ source files.
+%D
+%D When watching such logs, beware of nasty side effects of
+%D \type {\scantokens}, as in:
+%D
+%D \starttyping
+%D \bgroup
+%D \lccode`a=12\lowercase{\xdef\whatever{a}}\egroup
+%D \def\whatever{test \whatever test}
+%D \scantokens\expandafter{\whatever}
+%D \egroup
+%D \stoptyping
+%D
+%D In \LUATEX\ we have ways around this.
+
+\def\tracingall
+ {\tracingonline \plusone
+ \tracingcommands \plusthree
+ \tracingstats \plustwo
+ \tracingpages \plusone
+ \tracingoutput \plusone
+ \tracinglostchars \plustwo
+ \tracingmacros \plustwo
+ \tracingparagraphs\plusone
+ \tracingrestores \plusone
+ \showboxbreadth \maxdimen
+ \showboxdepth \maxdimen
+ \tracinggroups \plusone
+ \tracingifs \plusone
+ \tracingscantokens\plusone
+ \tracingnesting \plusone
+ \tracingassigns \plustwo
+ \errorstopmode}
+
+\def\loggingall
+ {\tracingall
+ \tracingonline \zerocount}
+
+\def\tracingnone
+ {\tracingassigns \zerocount
+ \tracingnesting \zerocount
+ \tracingscantokens\zerocount
+ \tracingifs \zerocount
+ \tracinggroups \zerocount
+ \showboxdepth \plusthree
+ \showboxbreadth \plusfive
+ \tracingrestores \zerocount
+ \tracingparagraphs\zerocount
+ \tracingmacros \zerocount
+ \tracinglostchars \plusone
+ \tracingoutput \zerocount
+ \tracingpages \zerocount
+ \tracingstats \zerocount
+ \tracingcommands \zerocount
+ \tracingonline \zerocount}
+
+%D Just for tracing purposes we set:
+
+\tracingstats\plusone
+
+%D Here we also save \type {\input}, more will be saved later.
+
+\ifdefined\normalinput \else \let\normalinput\input \fi
+
+%D We don't like outer commands, and we always want access
+%D to the original \type {\input} primitive.
+
+\let\normalouter\outer \def\outer{} % no longer \relax
+
+%D To circumvent dependencies, we can postpone certain
+%D initializations to dumping time, by appending them to the
+%D \type {\everydump} token register.
+
+\ifdefined\normaldump \else \let\normaldump\dump \fi
+
+\newtoks\everydump
+
+\def\dump{\the\everydump\normaldump}
+
+%D The same applies for the startup actions.
+
+\ifdefined\normaleveryjob \else \let\normaleveryjob\everyjob \fi
+
+\let\everyjob\relax \newtoks\everyjob
+
+\normaleveryjob{\the\everyjob}
+
+\def\appendtotoks #1{\def\temp{#1}\afterassignment\doappendtotoks \scratchtoks=}
+\def\prependtotoks#1{\def\temp{#1}\afterassignment\doprependtotoks\scratchtoks=}
+
+\def\doappendtotoks {\expandafter\expandafter\expandafter{\expandafter\the\expandafter\temp\the\scratchtoks}}
+\def\doprependtotoks{\expandafter\expandafter\expandafter{\expandafter\the\expandafter\scratchtoks\the\temp}}
+
+%D \macros
+%D {begcsname}
+%D
+%D Handy for \ETEX-only usage (avoids making \type {\relax}'s:
+
+\def\begcsname#1\endcsname{\ifcsname#1\endcsname\csname#1\endcsname\fi}
+
+%D Now come a few macros that might be needed in successive loading:
+
+\let\endgraf\par
+\let\endline\cr
+
+\def\space{ }
+\def\empty{}
+\def\null {\hbox{}}
+
+%D The following two might be overloaded later on but some modules need
+%D then earlier. These functionality is reflected in the name and will not
+%D change.
+
+\bgroup
+ \catcode`\^^M=\activecatcode%
+ \gdef\obeylines{\catcode`\^^M\activecatcode \let^^M\par}%
+ \global\let^^M\par%
+\egroup
+
+\bgroup
+ \gdef\obeyspaces{\catcode`\ \activecatcode}%
+ \obeyspaces\global\let =\space%
+\egroup
+
+%D A constant:
+
+\let\endoflinetoken=^^M
+
+%D Also needed might be a simple loop structure and we borrow
+%D plain \TEX's one as it is often expected to be present and
+%D it is about the fastest you can get. Beware: this macro
+%D does not support nested loops. We use a namespace prefix
+%D \type {@@pln}.
+
+\long\def\loop#1\repeat{\long\def\@@plnbody{#1}\@@plniterate}
+
+%D The following makes \type {\loop} \unknown\ \type {\if}
+%D \unknown\ \type {\repeat} skippable (clever trick):
+
+\let\repeat\fi % so both \loop and \repeat are reserved words!
+
+%D The original (no \type {@@pln} there):
+%D
+%D \starttyping
+%D \def\@@plniterate{\@@plnbody\let\next\@@plniterate\else\let\next\relax\fi\next}
+%D \stoptyping
+%D
+%D A more efficient alternative:
+%D
+%D \starttyping
+%D \def\@@plniterate{\@@plnbody\expandafter\@@plniterate\else\expandafter\relax\fi}
+%D \stoptyping
+%D
+%D An even more efficient one:
+
+\def\@@plniterate{\@@plnbody\expandafter\@@plniterate\else\fi}
+
+%D We don't define a real output routine yet but at least get rid
+%D of pages:
+
+\output{\shipout\box\normalpagebox}
+
+%D Although we don't add pagenumbers yet we alias the default
+%D register used for counting pages:
+
+\countdef\pageno=0 \pageno=1 % first page is number 1
+
+%D Beside the raw counter \type {\pageno} the \type {\folio}
+%D macro provides the value.
+
+\def\folio{\the\pageno} % kind of expected and therefore reserved
+
+%D The following registers are kind of standard and (for the moment)
+%D we define them here. This might change.
+
+\newskip \bigskipamount \bigskipamount = 12pt plus 4pt minus 4pt
+\newskip \medskipamount \medskipamount = 6pt plus 2pt minus 2pt
+\newskip \smallskipamount \smallskipamount = 3pt plus 1pt minus 1pt
+
+\baselineskip = 12pt
+\lineskip = 1pt
+\lineskiplimit = 0pt
+
+%D Again a few kind-of-extensions the core:
+
+\newskip \hideskip \hideskip = -1000pt plus 1fill
+\newskip \centering \centering = 0pt plus 1000pt minus 1000pt
+
+\def\hidewidth % for alignment entries that can stick out
+ {\hskip\hideskip}
+
+\def\ialign % initialized \halign
+ {\everycr{}%
+ \tabskip\zeroskip
+ \halign}
+
+\newcount \mscount
+
+\def\spanomit{\span\omit} % bypass error message
+
+\def\multispan#1%
+ {\omit
+ \mscount#1\relax
+ \loop
+ \ifnum\mscount>\plusone
+ \spanomit \advance\mscount\minusone
+ \repeat}
+
+%D The next section deals with selective definitions in
+%D later modules. One can of course use the \type {\texengine}
+%D number that we defined earlier instead.
+
+\bgroup \obeylines
+ \gdef\pickupSOMETEX#1%
+ {\expandafter\gdef\csname begin#1\endcsname{\bgroup\obeylines\dopickupSOMETEX{#1}}}
+ \gdef\dopickupSOMETEX#1#2
+ % {\egroup\immediate\write16{special code for #1 -> [line \the\inputlineno] \detokenize{#2}}}
+ {\egroup}
+\egroup
+
+\let\endTEX \relax \long\def\beginTEX #1\endTEX {}
+\let\endETEX \relax \long\def\beginETEX #1\endETEX {}
+\let\endXETEX \relax \long\def\beginXETEX #1\endXETEX {}
+\let\endLUATEX\relax \long\def\beginLUATEX#1\endLUATEX{}
+\let\endOLDTEX\relax \long\def\beginOLDTEX#1\endOLDTEX{}
+\let\endNEWTEX\relax \long\def\beginNEWTEX#1\endNEWTEX{}
+
+\pickupSOMETEX{ETEX}
+
+\ifnum\texengine=\xetexengine
+ \pickupSOMETEX{XETEX}
+\fi
+\ifnum\texengine=\luatexengine
+ \pickupSOMETEX{LUATEX}
+\fi
+\ifnum\texengine<\xetexengine
+ \pickupSOMETEX{OLDTEX}
+\else
+ \pickupSOMETEX{NEWTEX}
+\fi
+
+%D \macros
+%D {bindprimitive}
+%D
+%D We can remap primitives (which is needed because of changes in
+%D for instance \PDFTEX).
+
+\def\bindprimitive#1 #2 % new old
+ {\ifcsname#1\endcsname \else \ifcsname#2\endcsname
+ \expandafter\let\csname#1\expandafter\endcsname\csname#2\endcsname
+ \fi \fi}
+
+%D Because \XETEX\ also implements some \PDFTEX\ functionality, we take
+%D care of this here instead of a dedicated module. Later modules need
+%D to handle the undefined cases.
+
+%D These messy checks will disappear.
+
+% new after 1.10, watch the change in prefix
+
+\bindprimitive quitvmode ptexquitvmode
+\bindprimitive noligatures ptexnoligatures
+\bindprimitive setrandomseed ptexsetrandomseed
+\bindprimitive uniformdeviate ptexuniformdeviate
+
+\bindprimitive quitvmode pdfquitvmode
+\bindprimitive noligatures pdfnoligatures
+\bindprimitive setrandomseed pdfsetrandomseed
+\bindprimitive uniformdeviate pdfuniformdeviate
+
+\bindprimitive resettimer pdfresettimer
+\bindprimitive elapsedtime pdfelapsedtime
+
+% new per 1.40
+
+\bindprimitive ifprimitive ifpdfprimitive
+\bindprimitive primitive pdfprimitive
+\bindprimitive ifabsdim ifpdfabsdim
+\bindprimitive ifabsnum ifpdfabsnum
+
+\ifnum\texengine=\xetexengine \else % this test might disappear some day
+
+ \pdfminorversion \plusfive
+
+ \ifdefined\pdfcompresslevel \else \newcount\pdfcompresslevel \fi
+ \ifdefined\pdfobjcompresslevel \else \newcount\pdfobjcompresslevel \fi
+ \ifdefined\pdfgentounicode \else \newcount\pdfgentounicode \fi \pdfgentounicode \plusone
+ \ifdefined\pdfinclusioncopyfonts\else \newcount\pdfinclusioncopyfonts \fi \pdfinclusioncopyfonts\plusone
+
+ \def\nopdfcompression {\pdfobjcompresslevel\zerocount \pdfcompresslevel\zerocount}
+ \def\maximumpdfcompression{\pdfobjcompresslevel\plusnine \pdfcompresslevel\plusnine }
+ \def\normalpdfcompression {\pdfobjcompresslevel\plusthree \pdfcompresslevel\plusthree}
+
+ \normalpdfcompression
+
+ \let\normalsetrandomseed \setrandomseed
+ \let\normaluniformdeviate\uniformdeviate
+
+\fi
+
+%D Handy.
+
+\ifnum\texengine=\luatexengine
+ \ifdefined\suppresslongerror % for the moment test
+ \suppresslongerror\plusone
+ \fi
+\fi
+
+%D Basic status stuff.
+
+\newif\ifproductionrun
+
+%D We need to make sure that we start up in \DVI\ mode, so,
+%D after testing for running \PDFTEX, we default to \DVI.
+
+\ifx\pdftexversion\undefined \newcount\pdfoutput \fi \pdfoutput=0
+
+%D For those who expect this \unknown
+
+\ifx\fmtname \undefined \def\fmtname {ConTeXt Minimized Plain TeX} \fi
+\ifx\fmtversion\undefined \def\fmtversion{3.1415926} \fi
+
+\let\normalfmtversion\fmtversion
+
+%D A few bonus macros:
+
+\def\modulonumber#1#2{\the\numexpr#2-((((#2+(#1/2))/#1)-1)*#1)\relax}
+\def\dividonumber#1#2{\the\numexpr(#2-(#1/2))/#1\relax}
+
+\ifnum\texengine=\xetexengine
+ \edef\xetexversion {\numexpr\XeTeXversion*100+(\expandafter\gobbleoneargument\XeTeXrevision-5)/10\relax}
+ \edef\xetexrevision {\the\numexpr(\expandafter\gobbleoneargument\XeTeXrevision-50)/100\relax}
+\fi
+
+\ifcase\texengine
+ \def\texenginename {impossible}
+ \edef\texengineversion{0}
+\or
+ \def\texenginename {pdfTeX}
+ \edef\texengineversion{\dividonumber{100}\pdftexversion.\modulonumber{100}\pdftexversion.\pdftexrevision}
+\or
+ \def\texenginename {XeTeX}
+ \edef\texengineversion{\dividonumber{100}\xetexversion .\modulonumber{100}\xetexversion .\xetexrevision}
+\or
+ \def\texenginename {LuaTeX}
+ \edef\texengineversion{\dividonumber{100}\luatexversion.\modulonumber{100}\luatexversion.\luatexrevision}
+\else
+ \def\texenginename {impossible}
+ \edef\texengineversion{0}
+\fi
+
+%D We only can set this one via directives (system.synctex).
+
+\let\synctex\undefined \newcount\synctex
+
+%D While cleaning this code up a bit I was listening to Heather
+%D Nova's \CD\ Redbird. The first song on that \CD\ ends with
+%D a few lines suitable for ending this initialization module:
+%D
+%D \startlines
+%D And there's so much I can do for you
+%D Given time I know that I can prove
+%D Now my world is opened up to you
+%D Come inside
+%D
+%D Welcome to my life
+%D Welcome to my world
+%D Come inside
+%D \stoplines
+%D
+%D So let's see what \TEX\ can do now that we've opened up
+%D the basic machinery.
+
+\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 64028295350..8a5a9531c1b 100644
--- a/Master/texmf-dist/tex/context/base/syst-lua.lua
+++ b/Master/texmf-dist/tex/context/base/syst-lua.lua
@@ -8,33 +8,19 @@ if not modules then modules = { } end modules ['syst-lua'] = {
local texsprint, texprint, texwrite, texiowrite_nl = tex.sprint, tex.print, tex.write, texio.write_nl
local format, find = string.format, string.find
-local lpegmatch = lpeg.match
+local tonumber = tonumber
+local S, Ct, lpegmatch, lpegsplitat = lpeg.S, lpeg.Ct, lpeg.match, lpeg.splitat
local ctxcatcodes = tex.ctxcatcodes
-commands = commands or { } cs = commands -- shorter
+commands = commands or { } -- cs = commands -- shorter, maybe some day, not used now
-function commands.writestatus(a,b,c,...)
- if c then
- texiowrite_nl(format("%-16s: %s\n",a,format(b,c,...)))
- else
- texiowrite_nl(format("%-16s: %s\n",a,b)) -- b can have %'s
- end
-end
-function commands.writedebug(a,b,c,...)
- if c then
- texiowrite_nl(format("%-16s| %s\n",a,format(b,c,...)))
- else
- texiowrite_nl(format("%-16s| %s\n",a,b)) -- b can have %'s
- end
-end
+function commands.writestatus(...) logs.status(...) end -- overloaded later
-function commands.report(s,t,...)
- commands.writestatus("!"..s,format(t,...))
-end
+-- todo: use shorter names i.e. less tokenization
local function testcase(b)
- if b then -- faster with if than with expression
+ if b then -- looks faster with if than with expression
texsprint(ctxcatcodes,"\\firstoftwoarguments")
else
texsprint(ctxcatcodes,"\\secondoftwoarguments")
@@ -51,6 +37,7 @@ function commands.doif(b)
texsprint(ctxcatcodes,"\\gobbleoneargument")
end
end
+
function commands.doifnot(b)
if b then
texsprint(ctxcatcodes,"\\gobbleoneargument")
@@ -67,7 +54,7 @@ function commands.doifelsespaces(str)
return commands.doifelse(find(str,"^ +$"))
end
-local s = lpeg.Ct(lpeg.splitat(","))
+local s = Ct(lpegsplitat(","))
local h = { }
function commands.doifcommonelse(a,b)
@@ -96,14 +83,25 @@ function commands.doifinsetelse(a,b)
return testcase(false)
end
-function commands. def (cs,value) texsprint(ctxcatcodes,format( "\\def\\%s{%s}",cs,value)) end
-function commands.edef (cs,value) texsprint(ctxcatcodes,format("\\edef\\%s{%s}",cs,value)) end
-function commands.gdef (cs,value) texsprint(ctxcatcodes,format("\\gdef\\%s{%s}",cs,value)) end
-function commands.xdef (cs,value) texsprint(ctxcatcodes,format("\\xdef\\%s{%s}",cs,value)) end
-function commands.chardef(cs,value) texsprint(ctxcatcodes,format("\\chardef\\%s=%s\\relax",cs,value)) end
-
local pattern = lpeg.patterns.validdimen
function commands.doifdimenstringelse(str)
testcase(lpegmatch(pattern,str))
end
+
+local splitter = lpegsplitat(S(". "))
+
+function commands.doifolderversionelse(one,two) -- one >= two
+ if not two then
+ one, two = environment.version, one
+ elseif one == "" then
+ one = environment.version
+ end
+ local y_1, m_1, d_1 = lpegmatch(splitter,one)
+ local y_2, m_2, d_2 = lpegmatch(splitter,two)
+ commands.testcase (
+ (tonumber(y_1) or 0) >= (tonumber(y_2) or 0) and
+ (tonumber(m_1) or 0) >= (tonumber(m_2) or 0) and
+ (tonumber(d_1) or 0) >= (tonumber(d_1) or 0)
+ )
+end
diff --git a/Master/texmf-dist/tex/context/base/syst-lua.mkiv b/Master/texmf-dist/tex/context/base/syst-lua.mkiv
index 40cd9f75685..3ed70cc0b77 100644
--- a/Master/texmf-dist/tex/context/base/syst-lua.mkiv
+++ b/Master/texmf-dist/tex/context/base/syst-lua.mkiv
@@ -15,15 +15,15 @@
\unprotect
-\def\expdoifelse#1#2{\ctxlua{commands.doifelse(\!!bs#1\!!es==\!!bs#2\!!es)}}
-\def\expdoif #1#2{\ctxlua{commands.doif (\!!bs#1\!!es==\!!bs#2\!!es)}}
-\def\expdoifnot #1#2{\ctxlua{commands.doifnot (\!!bs#1\!!es==\!!bs#2\!!es)}}
+\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)}}
% \testfeatureonce{100000}{\doifelse{hello world}{here i am}{}} % 0.3
% \testfeatureonce{100000}{\expandabledoifelse{hello world}{here i am}{}} % 1.5
-\def\expdoifcommonelse#1#2{\ctxlua{commands.doifcommonelse("#1","#2")}}
-\def\expdoifinsetelse #1#2{\ctxlua{commands.doifinsetelse("#1","#2")}}
+\def\expdoifcommonelse#1#2{\ctxcommand{doifcommonelse("#1","#2")}}
+\def\expdoifinsetelse #1#2{\ctxcommand{doifinsetelse("#1","#2")}}
% we define these here, just in case ...
@@ -32,6 +32,12 @@
\edef\!!bs{[\luastringsep[}
\edef\!!es{]\luastringsep]}
-\def\writestatus#1#2{\ctxlua{commands.writestatus(\!!bs#1\!!es,\!!bs#2\!!es)}}
+\def\writestatus#1#2{\ctxcommand{writestatus(\!!bs#1\!!es,\!!bs#2\!!es)}}
+
+% a handy helper (we can probably omit the tex.ctxcatcodes here as nowadays we seldom
+% change the regime at the tex end
+
+%def\luaexpr#1{\ctxlua {tex.sprint(tex.ctxcatcodes,tostring(#1))}}
+\def\luaexpr#1{\directlua\zerocount{tex.sprint(tex.ctxcatcodes,tostring(#1))}} % wrap in global function ?
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/syst-mes.mkiv b/Master/texmf-dist/tex/context/base/syst-mes.mkiv
new file mode 100644
index 00000000000..070c7af72f9
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/syst-mes.mkiv
@@ -0,0 +1,22 @@
+%D \module
+%D [ file=syst-mes,
+%D version=2010.06.03,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Messages,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\newtoks\everywritestring
+
+\def\writedirect {\immediate\write\statuswrite}
+\def\writeline {\writedirect{}}
+\def\writestring#1{\begingroup\the\everywritestring\writedirect{#1}\endgroup}
+\let\writebanner \writestring
+\let\message \normalmessage
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/syst-pln.tex b/Master/texmf-dist/tex/context/base/syst-pln.mkii
index f2b6129ff99..f2b6129ff99 100644
--- a/Master/texmf-dist/tex/context/base/syst-pln.tex
+++ b/Master/texmf-dist/tex/context/base/syst-pln.mkii
diff --git a/Master/texmf-dist/tex/context/base/syst-pln.mkiv b/Master/texmf-dist/tex/context/base/syst-pln.mkiv
new file mode 100644
index 00000000000..7fa91b73d40
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/syst-pln.mkiv
@@ -0,0 +1,120 @@
+%D \module
+%D [ file=syst-pln,
+%D version=2001.11.16, % 1999.03.17, % an oldie: 1995.10.10
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Efficient \PLAIN\ \TEX\ loading,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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
+
+%D This module set a couple of variables to the plain \TEX\
+%D values. Later they might be overloaded. There is not much
+%D difference between \MKII\ and \MKIV\ but at some point they
+%D might diverge.
+
+%D Build||in numeric variables.
+
+\adjdemerits = 10000
+\binoppenalty = 700
+\brokenpenalty = 100
+\clubpenalty = 150
+%day = 0
+\defaulthyphenchar = `\-
+\defaultskewchar = -1
+\delimiterfactor = 901
+\displaywidowpenalty = 50
+\doublehyphendemerits = 10000
+%endlinechar = `\^^M
+\errorcontextlines = 5
+%escapechar = `\\
+\exhyphenpenalty = 50
+%fam = 0
+\finalhyphendemerits = 5000
+%floatingpenalty = 0
+%globaldefs = 0
+%hangafter = 1
+\hbadness = 1000
+%holdinginserts = 0
+\hyphenpenalty = 50
+%interlinepenalty = 0
+%language = 0
+\lefthyphenmin = 2
+\linepenalty = 10
+%looseness = 0
+%mag = 1000
+%maxdeadcycles = 25
+%month = 0
+%newlinechar = -1 % commented i.e. no plain value
+%outputpenalty = 0
+%pausing = 0
+%postdisplaypenalty = 0
+\predisplaypenalty = 10000
+\pretolerance = 100
+\relpenalty = 500
+\righthyphenmin = 3
+\showboxbreadth = 5
+\showboxdepth = 3
+%time = 0
+\tolerance = 200
+%tracingcommands = 0
+\tracinglostchars = 1
+%tracingmacros = 0
+%tracingonline = 0
+%tracingoutput = 0
+%tracingpages = 0
+%tracingparagraphs = 0
+%tracingrestores = 0
+%tracingstats = 0
+\uchyph = 1
+\vbadness = 1000
+\widowpenalty = 150
+%year = 0
+
+%D Build in dimension variables.
+
+\abovedisplayshortskip = 0pt plus 3pt
+\abovedisplayskip = 12pt plus 3pt minus 9pt
+%baselineskip = 0pt
+\belowdisplayshortskip = 7pt plus 3pt minus 4pt
+\belowdisplayskip = 12pt plus 3pt minus 9pt
+\boxmaxdepth = \maxdimen
+\delimitershortfall = 5pt
+%displayindent = 0pt
+%displaywidth = 0pt
+%hangindent = 0pt
+\hfuzz = 0.1pt
+%hoffset = 0pt
+\hsize = 6.5in
+%leftskip = 0pt
+%lineskip = 0pt
+%lineskiplimit = 0pt
+%mathsurround = 0pt
+\maxdepth = 4pt
+\medmuskip = 4mu plus 2mu minus 4mu
+\nulldelimiterspace = 1.2pt
+\overfullrule = 5pt
+\parfillskip = 0pt plus 1fil
+\parindent = 20pt
+\parskip = 0pt plus 1pt
+%predisplaysize = 0pt
+%rightskip = 0pt
+\scriptspace = 0.5pt
+%spaceskip = 0pt
+\splitmaxdepth = \maxdimen
+\splittopskip = 10pt
+%tabskip = 0pt
+\thickmuskip = 5mu plus 5mu
+\thinmuskip = 3mu
+\topskip = 10pt
+\vfuzz = 0.1pt
+%voffset = 0pt
+\vsize = 8.9in
+%xspaceskip = 0pt
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/syst-str.mkiv b/Master/texmf-dist/tex/context/base/syst-str.mkiv
deleted file mode 100644
index 57d76dc0375..00000000000
--- a/Master/texmf-dist/tex/context/base/syst-str.mkiv
+++ /dev/null
@@ -1,36 +0,0 @@
-%D \module
-%D [ file=syst-str,
-%D version=2006.09.18,
-%D title=\CONTEXT\ System Macros,
-%D subtitle=String Processing,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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
-
-% nb: these macros might go away !
-%
-% todo: escape special chars in expr (\luaescapeexpression)
-
-%D I got tired of making dedicated clean up macros using the
-%D same mechanism again and again, so now we have:
-%D
-%D \starttyping
-%D \def\xxxx{abc.d} \replacecharacters\xxxx{a.}{-} \xxxx
-%D \stoptyping
-
-\def\replacecharacters#1#2#3% macro characters replacement
- {\dodoglobal\edef#1{\ctxlua{tex.sprint((string.gsub(\!!bs#1\!!es,\!!bs#2\!!es,"#3")))}}}
-
-\def\separatestring#1\to#2%
- {\dodoglobal\def#2{\ctxlua{tex.sprint((string.gsub(\!!bs#1\!!es,"\letterpercent s+",",")))}}}
-
-\def\unspacefilename#1\to#2%
- {\dodoglobal\def#2{\ctxlua{tex.sprint((string.gsub(\!!bs#1\!!es,"\letterpercent s+","-")))}}}
-
-\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 7d3fab0df37..06e3eca2943 100644
--- a/Master/texmf-dist/tex/context/base/tabl-ltb.mkiv
+++ b/Master/texmf-dist/tex/context/base/tabl-ltb.mkiv
@@ -59,8 +59,9 @@
\unprotect
-\chardef\linetablesplitstate\zerocount
-\chardef\linetableheadstate \zerocount
+\newconstant\linetablesplitstate
+\newconstant\linetableheadstate
+\newconstant\linetablemode
\edef\??ler{\??le:r:}
\edef\??lec{\??le:c:}
@@ -89,9 +90,9 @@
\initializetablebox \zerocount % holds repeater
-\chardef\linetablehmode \zerocount
-\chardef\linetablepage \zerocount
-\chardef\linetablerepeat\zerocount
+\newconstant\linetablehmode
+\newconstant\linetablepage
+\newconstant\linetablerepeat
\unexpanded\def\setuplinetable
{\dotripleempty\dosetuplinetable}
@@ -206,7 +207,7 @@
}%
\global\linetablecolumn\scratchcounter
\fi
- \chardef\linetablemode
+ \linetablemode
\iflinetablepreroll
\ifdim\scratchdimen>\zeropoint \zerocount \else \plustwo \fi
\else
@@ -218,7 +219,7 @@
\or
% fit, keep it simple
\or
- \chardef\linetablemode\plusone % line
+ \linetablemode\plusone % line
\else
% some already calculated height
\fi
@@ -375,14 +376,14 @@
\else
% after, later
\fi
- \chardef\linetableheadstate\plusthree
+ \linetableheadstate\plusthree
\global\setbox\tablebox\zerocount\emptybox % here
\fi
% reset \linetablerow will be an option, currently
% starts at zero after split
\globallet\linetablerow\!!zerocount
\globallet\linetableline\!!zerocount
- \global\chardef\linetablepage\zerocount
+ \global\linetablepage\zerocount
\global\linetablewidth\zeropoint
\setnoftableslines
\fi}
@@ -448,9 +449,9 @@
\savelinetablepart
\fi
\ifcase\linetablepage \or
- \global\chardef\linetablepage \plustwo
+ \global\linetablepage \plustwo
\else
- \global\chardef\linetablepage \plusone
+ \global\linetablepage \plusone
\fi
\doglobal\increment\linetablepart
\global\linetablewidth\wd\tablebox\zerocount
@@ -482,9 +483,9 @@
\stoplinetablepart
\savelinetablepart
\ifcase\linetablepage \or
- \global\chardef\linetablepage \plustwo
+ \global\linetablepage \plustwo
\else
- \global\chardef\linetablepage \plusone
+ \global\linetablepage \plusone
\fi
\doglobal\increment\linetablepart
\ifnum\linetablepart>\noflinetableparts
@@ -524,8 +525,8 @@
[\linetableparameter\c!stretch]
[ \v!no=>{\setuplinetable[\c!stretch=\maxdimen]},% no stretch
\v!yes=>{\setuplinetable[\c!stretch=\zeropoint]}]% max stretch
- \chardef\linetablerepeat\linetableparameter\c!nleft
- \chardef\linetablesplitstate % =
+ \linetablerepeat\linetableparameter\c!nleft
+ \linetablesplitstate % =
\ifdim\linetableparameter\c!maxwidth>\zeropoint
\zerocount \else \plusone
\fi
@@ -573,7 +574,7 @@
\unexpanded\def\stoplinetablerun
{\globallet\linetableline\!!maxcard
- \chardef\linetableheadstate\zerocount % blocked
+ \linetableheadstate\zerocount % blocked
\flushlinetableparts
\iflinetablepreroll \else
\linetableparameter\c!after
@@ -582,42 +583,6 @@
\globallet\noflinetableparts\!!zerocount
\egroup}
-% \def\checklinecolumnwidth
-% {\ifundefined{\??lew\number\linetablecolumn}%
-% \donetrue
-% \else\ifdim\getvalue{\??lew\number\linetablecolumn}<\wd\linetablecell
-% \donetrue
-% \else
-% \donefalse
-% \fi\fi
-% \ifdone
-% \setxvalue{\??lew\number\linetablecolumn}{\the\wd\linetablecell}%
-% \fi}
-%
-% \def\checklinecolumnwidth
-% {\ifcsname\??lew\number\linetablecolumn\endcsname
-% \ifdim\csname\??lew\number\linetablecolumn\endcsname<\wd\linetablecell
-% \donetrue
-% \else
-% \donefalse
-% \fi
-% \else
-% \donetrue
-% \fi
-% \ifdone
-% \setxvalue{\??lew\number\linetablecolumn}{\the\wd\linetablecell}%
-% \fi}
-
-% \def\checklinecolumnwidth
-% {\expandafter\xdef\csname\??lew\number\linetablecolumn\endcsname
-% {\expandafter\ifx\csname\??lew\number\linetablecolumn\endcsname\relax
-% \the\wd\linetablecell
-% \else\ifdim\csname\??lew\number\linetablecolumn\endcsname<\wd\linetablecell
-% \the\wd\linetablecell
-% \else
-% \csname\??lew\number\linetablecolumn\endcsname
-% \fi\fi}}
-
\def\checklinecolumndimension#1#2#3%
{\expandafter\xdef\csname#1\number#3\endcsname
{\expandafter\ifx\csname#1\number#3\endcsname\relax
@@ -649,7 +614,7 @@
% \else\ifx\linetableheight\v!fit
% % keep it simple
% \else\ifx\linetableheight\v!line
-% \chardef\linetablemode\plusone
+% \linetablemode\plusone
% \else
% \!!heighta\linetableheight
% \advance\!!heighta-\strutdepth
@@ -658,11 +623,11 @@
\linetableheight\zeropoint
\edef\!!stringa{\linetablerparameter\c!height}%
\ifx\!!stringa\empty
- \chardef\linetablehmode\zerocount
+ \linetablehmode\zerocount
\else\ifx\!!stringa\v!fit
- \chardef\linetablehmode\plusone
+ \linetablehmode\plusone
\else\ifx\!!stringa\v!line
- \chardef\linetablehmode\plustwo
+ \linetablehmode\plustwo
\else
\linetableheight\!!stringa
\advance\linetableheight-\strutdepth
@@ -703,10 +668,10 @@
\flushlinetablehead}
\def\checklinetablepage
- {\global\chardef\linetablepage\zerocount
+ {\global\linetablepage\zerocount
\ifcase\linetablerepeat \else \ifcase\linetablepage
\doif{\linetableparameter\c!repeat}\v!no
- {\global\chardef\linetablepage\doifoddpageelse\plusone\plustwo}%
+ {\global\linetablepage\doifoddpageelse\plusone\plustwo}%
\fi \fi}
\def\flushlinetablehead
@@ -718,9 +683,9 @@
% 2 head done
\or
% 3 trigger flush
- \chardef\linetableheadstate\plusone
+ \linetableheadstate\plusone
\the\@@linetablehead\relax
- \chardef\linetableheadstate\plustwo
+ \linetableheadstate\plustwo
\fi}
\def\linetableNC % first time special treatment
@@ -745,7 +710,7 @@
\unexpanded\def\startlinetableanalysis
{\bgroup
\linetableprerolltrue
- \trialtypesettingtrue
+ \settrialtypesetting
\startlinetablerun}
\unexpanded\def\stoplinetableanalysis
@@ -771,7 +736,7 @@
{\ifinlinetable
\@@linetablehead\emptytoks
\fi
- \chardef\linetableheadstate3 % full
+ \linetableheadstate\plusthree % full
\@@linetablehead{#1}%
\ifinlinetable
\flushlinetablehead
@@ -814,17 +779,6 @@
\startlinetableanalysis\readfile{#1}\donothing\donothing\stoplinetableanalysis
\startlinetablerun \readfile{#1}\donothing\donothing\stoplinetablerun
\egroup}
-
-% will go away:
-
-\def\processlinetableXMLfile#1%
- {\bgroup
- \let\startlinetable\donothing
- \let\stoplinetable \donothing
- \startlinetableanalysis\processXMLfile{#1}\stoplinetableanalysis
- \startlinetablerun \processXMLfile{#1}\stoplinetablerun
- \egroup}
-
\protect \endinput
\doifnotmode{demo}{\endinput}
diff --git a/Master/texmf-dist/tex/context/base/tabl-ntb.mkii b/Master/texmf-dist/tex/context/base/tabl-ntb.mkii
index 0bfcc20c68f..e243a55c21e 100644
--- a/Master/texmf-dist/tex/context/base/tabl-ntb.mkii
+++ b/Master/texmf-dist/tex/context/base/tabl-ntb.mkii
@@ -860,8 +860,12 @@
\crcr
\noalign
{\nointerlineskip
- \ifnum\gettblnob\tblrow=\zerocount
- \allowbreak
+ \ifnum\tblrow>\noftblheadlines
+ \ifnum\gettblnob\tblrow=\zerocount
+ \allowbreak
+ \fi
+ \else
+ \allowbreak % else no proper head split off
\fi
\bgroup % protect local vars
\@@tblsplitafter
diff --git a/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv b/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv
index b24eaa85d3c..96b1aabed82 100644
--- a/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv
+++ b/Master/texmf-dist/tex/context/base/tabl-ntb.mkiv
@@ -14,6 +14,7 @@
%D This is an unfinished, preliminary module. At least two
%D runs are needed to get the table fixed. Ugly code.
+% todo: TABLE TBL -> ntb
% todo: special parsetb for argless variant
% todo: protect \tbl...
% todo: tblnx also count
@@ -21,6 +22,22 @@
% todo: fast if
% todo: avoid halign (just do it manual) and thereby globals
+% \unexpanded\def\startrow {\bTR}
+% \unexpanded\def\stoprow {\eTR}
+% \unexpanded\def\startcell#1\stopcell{\bTD#1\eTD}
+% \let\stopcell \relax
+% \let\startcelltable \bTABLE
+% \let\stopcelltable \eTABLE
+
+% \starttext
+% \startcelltable
+% \startrow \startcell a \stopcell \stoprow
+% \startrow \startcell a \stopcell \stoprow
+% \startrow \startcell a \stopcell \stoprow
+% \startrow \startcell a \stopcell \stoprow
+% \stopcelltable
+% \stoptext
+
% optie=rek beschrijven
\writestatus{loading}{ConTeXt Table Macros / Natural Tables}
@@ -99,8 +116,11 @@
%D
%D \typebuffer \getbuffer
+\let\dotagTABLEalign\relax
+
\def\bTBLCELL % why not \doinhibitblank
{\inhibitblank
+ \dotagTABLEalign
\doconvertfont\tbltblstyle\empty
\everypar{\tbltblleft\delayedbegstrut}}
@@ -273,7 +293,7 @@
\processcommalist[#1]\dodosetupTABLE}
\def\nopTABLEparameters[#1][#2]%
- {\letvalue{\@@tblprefix#1}\empty}
+ {\letvalueempty{\@@tblprefix#1}} % can be made faster
\def\setTABLEparameters[#1][#2]%
{\pushTBLparameters
@@ -466,17 +486,17 @@
\newcount\currentcol
\newcount\tblspn
-\def\parseTR[#1][#2]% [#2] is dummy that kills spaces / no #3 argument
+\def\settblref#1#2{\expandafter\xdef\csname\@@tblprefix\number#1:\number#2:x\endcsname}
+\def\gettblref#1#2{\ifcsname\@@tblprefix\number#1:\number#2:x\endcsname\csname\@@tblprefix\number#1:\number#2:x\endcsname\fi}
+
+\def\parseTR[#1]%
{\currentcol\zerocount
\advance\maximumrow\plusone
\iffirstargument
\setvalue{\@@tblprefix\c!y++\number\maximumrow}{\getparameters[\@@tbl\@@tbl][#1]}% maybe also in mkii
\fi}
-\def\settblref#1#2{\expandafter\xdef\csname\@@tblprefix\number#1:\number#2:x\endcsname}
-\def\gettblref#1#2{\ifcsname\@@tblprefix\number#1:\number#2:x\endcsname\csname\@@tblprefix\number#1:\number#2:x\endcsname\fi}
-
-\long\def\parseTD[#1][#2]#3\eTD % [#2] is dummy that kills spaces
+\long\def\parseTD[#1]#2\eTD
{\def\tblny{\tblnr}%
\def\tblnx{\tblnc}%
\let\tblnc\plusone
@@ -493,7 +513,7 @@
\else\ifnum\@@tblnindeed=\currentcol\else
\scratchcounter\numexpr\@@tblnindeed-\currentcol+\minusone-\tblspn\relax
\ifnum\scratchcounter>\zerocount
- \normalexpanded{\noexpand\parseTD[\c!nx=\the\scratchcounter,\c!n=,\c!m=,*sq=\v!no][]}\eTD
+ \normalexpanded{\noexpand\parseTD[\c!nx=\the\scratchcounter,\c!n=,\c!m=,*sq=\v!no]}\eTD
\fi
% can also be made faster
\getparameters[\@@tbl][\c!ny=\tblnr,\c!nx=\tblnc,nc=1,nr=1,#1,\c!n=,\c!m=]%
@@ -502,7 +522,7 @@
\ifx\@@tblmindeed\empty \else
\ifnum\@@tblmindeed=\currentcol \else
\scratchcounter\numexpr\@@tblmindeed-\currentcol+\minusone-\tblspn\relax
- \dorecurse\scratchcounter{\normalexpanded{\noexpand\parseTD[\c!n=,\c!m=][]}\eTD}%
+ \dorecurse\scratchcounter{\normalexpanded{\noexpand\parseTD[\c!n=,\c!m=]}\eTD}%
% can be sped up
\getparameters[\@@tbl][\c!ny=\tblnr,\c!nx=\tblnc,nc=1,nr=1,#1,\c!n=,\c!m=]% kind of double, see prev
\fi
@@ -527,10 +547,11 @@
\lettbltag\maximumrow\currentcol\tblcell
\settblcol\maximumrow\currentcol{\number\tblnx}%
\settblrow\maximumrow\currentcol{\number\tblny}%
+ % the action key will change!
\settblref\maximumrow\currentcol{\ifcsname\@@tbl\c!action\endcsname\csname\@@tbl\c!action\endcsname\fi}%
% save text
\edef\celltag{{\number\maximumrow}{\number\currentcol}}%
- \@EA\settbltxt\@EA\maximumrow\@EA\currentcol\@EA{\@EA\handleTBLcell\celltag[#1]{#3}}}
+ \@EA\settbltxt\@EA\maximumrow\@EA\currentcol\@EA{\@EA\handleTBLcell\celltag[#1]{#2}}}
\def\presetTBLcell
{\row\maximumrow
@@ -588,8 +609,6 @@
\long\def\parseTH[#1]#2\eTH
{\parseTD[#1,\c!color=\tbltblheadcolor,\c!style=\tbltblheadstyle,\c!aligncharacter=\v!no]#2\eTD}
-
-%D new
\long\def\parseTN[#1]#2\eTN
{\parseTD[#1]\digits#2\relax\eTD}
@@ -664,14 +683,14 @@
\let\pushTBL\relax
\let\popTBL \relax
-\chardef\tblpass=0
+\newconstant\tblpass
\def\presetallTABLEparameters% each odd|even level / can be sped up but only once per table
{\executeifdefined{\@@rawtblprefix\v!start\v!each}\relax
\executeifdefined{\@@rawtblprefix\v!start\v!oddeven\TBLlevel}\relax
\executeifdefined{\@@rawtblprefix\v!start\number\TBLlevel}\relax}
-\def\bTABLE
+\unexpanded\def\bTABLE
{\dosingleempty\dobTABLE}
\def\dobTABLE[#1]%
@@ -700,7 +719,7 @@
[\tbltblheader]
[\v!repeat=>\multipleTBLheadstrue]%
\presetallTABLEparameters
- \ExpandFirstAfter\processallactionsinset
+ \processallactionsinset
[\tbltbloption]
[\v!stretch=>\autoTBLspreadtrue]%
\linewidth\tbltblrulethickness % needs to be frozen
@@ -714,19 +733,19 @@
\let\bTH\dobTH
\let\bTN\dobTN}
-\unexpanded\def\dobTR{\dodoubleempty\parseTR}
-\unexpanded\def\dobTD{\dodoubleempty\parseTD}
-\unexpanded\def\dobTH{\dodoubleempty\parseTH}
-\unexpanded\def\dobTN{\dodoubleempty\parseTN}
+\unexpanded\def\dobTR{\dosingleempty\parseTR}
+\unexpanded\def\dobTD{\dosingleempty\parseTD}
+\unexpanded\def\dobTH{\dosingleempty\parseTH}
+\unexpanded\def\dobTN{\dosingleempty\parseTN}
% permits \expanded{\bTD ... \eTD}
-\unexpanded\def\eTR{\ignorespaces} % handy in case we use a macro to generate rows
-\unexpanded\def\eTD{\ignorespaces}
-\unexpanded\def\eTH{\ignorespaces}
-\unexpanded\def\eTN{\ignorespaces}
+\let\bTR\relax \unexpanded\def\eTR{\ignorespaces} % handy in case we use a macro to generate rows
+\let\bTD\relax \unexpanded\def\eTD{\ignorespaces}
+\let\bTH\relax \unexpanded\def\eTH{\ignorespaces}
+\let\bTN\relax \unexpanded\def\eTN{\ignorespaces}
-\def\eTABLE % beware, we need to get rid of spurious spaces when in hmode
+\unexpanded\def\eTABLE % beware, we need to get rid of spurious spaces when in hmode
{% tricky and dirty order -)
\doifsometokselse\TBLhead % slow, better a flag
{\the\TBLhead
@@ -833,7 +852,7 @@
\def\eTBL{\tbltoks\@EA\@EA\@EA{\@EA\the\@EA\tbltoks\@EA\begintblrow\the\tblrowtoks\endtblrow}}%
\def\prelocateTBLerror
- {\writestatus\m!systems{fatal error: use \string\prelocateTBLrows\space to increase table memory (now: \number\prelocatedTBLrows)}}
+ {\writestatus\m!system{fatal error: use \string\prelocateTBLrows\space to increase table memory (now: \number\prelocatedTBLrows)}}
\def\prelocateTBLrows#1% we start at zero so we have one to much, better play safe anyway
{\dostepwiserecurse\prelocatedTBLrows{#1}\plusone{\expandafter\newtoks\csname tbl:\recurselevel\endcsname}%
@@ -885,8 +904,12 @@
\crcr
\noalign
{\nointerlineskip
- \ifnum\gettblnob\tblrow=\zerocount
- \allowbreak
+ \ifnum\tblrow>\noftblheadlines
+ \ifnum\gettblnob\tblrow=\zerocount
+ \allowbreak
+ \fi
+ \else
+ \allowbreak % else no proper head split off
\fi
\bgroup % protect local vars
\@@tblsplitafter
@@ -900,18 +923,38 @@
\fi
\egroup}}
+% \def\begintbl
+% {\global\tblspn\zerocount
+% \global\tblcol\zerocount
+% \global\tblrow\zerocount
+% \global\advance\tblrow\minusone
+% \tabskip\zeropoint
+% \halign\bgroup
+% \registerparoptions % new
+% \ignorespaces##\unskip&&\ignorespaces##\unskip\cr}
+
+% \def\endtbl
+% {\egroup}
+
+\let\dotagTABLEcell\relax
+
\def\begintbl
{\global\tblspn\zerocount
\global\tblcol\zerocount
\global\tblrow\zerocount
\global\advance\tblrow\minusone
\tabskip\zeropoint
+ \dostarttagged\t!table\empty
+ \dostarttagged\t!tablerow\empty
+ \appendtoks\dostoptagged\dostarttagged\t!tablerow\empty\to\everycr
\halign\bgroup
- \registerparoptions % new
- \ignorespaces##\unskip&&\ignorespaces##\unskip\cr}
+ \registerparoptions
+ % watch out: tagging the cell happens at the outer level (faster)
+ \ignorespaces##\unskip&&\dostarttagged\t!tablecell\empty\ignorespaces##\unskip\dostoptagged\cr} % one too many
\def\endtbl
- {\egroup}
+ {\dostoptagged\egroup
+ \dostoptagged}
\setvalue{\tblnone TBL}#1#2%
{\spanTBL{#1}{#2}}
@@ -936,10 +979,16 @@
{\global\tblspn\zerocount
\global\tblrow\zerocount
\global\tblcol\zerocount
- \chardef\tblpass\zerocount
+ \tblpass\zerocount
\tbltoks\emptytoks}
-\def\flushtbltoks{\begintbl\the\tbltoks\endtbl}
+\newtoks\everyTABLEpass
+
+\def\flushtbltoks
+ {\the\everyTABLEpass
+ \begintbl
+ \the\tbltoks
+ \endtbl}
\def\domakeTBLone#1 #2 %
{\gettbltxt{#1}{#2}}%
@@ -960,11 +1009,16 @@
\settblhei{#1}{\the\ht\scratchbox}%
\fi}%
+\let\dotagnoftablecolumns\relax
+\let\dotagnoftablerows \relax
+
\def\domakeTBLthree#1 #2 %
{% height
\!!counta \gettblcol{#1}{#2}\relax
\!!countb \gettblrow{#1}{#2}\relax
\!!heighta\gettblht {#1}{#2}\relax
+\dotagnoftablecolumns
+\dotagnoftablerows
\scratchdimen\zeropoint
\ifnum\!!counta=\maximumcol\relax
% case: nc=maxcolumns
@@ -1003,11 +1057,10 @@
\else
\normalexpanded{\noexpand\directgotobox{\box\scratchbox}[\!!stringa]}% to be checked
\fi
- \box\scratchbox}
+ \dotagTABLEcell} % right spot
\def\inTBLcell#1#2% hm, do we need #1 #2 ? we use tblcol anyway
- {\ExpandBothAfter\doifinsetelse\localwidth{\v!fit,\v!broad} % user set
- {}
+ {\doifnotinset\localwidth{\v!fit,\v!broad}% user set
{\scratchdimen\gettblaut\tblcol\relax
\ifdim\localwidth>\scratchdimen
\settblaut\tblcol{\the\dimexpr\localwidth\relax}%
@@ -1032,11 +1085,11 @@
\lettbldis\recurselevel\zeropoint}%
\dorecurse\maximumrow
{\lettblhei\recurselevel\maxdimen}%
- \chardef\tblpass\plusone
+ \tblpass\plusone
\let\makeTBL\domakeTBLone
\let\handleTBLcell\dohandleTBLcellA
- \setbox0\vbox{\trialtypesettingtrue \flushtbltoks}%
-% \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \setbox0\vbox{\settrialtypesetting \flushtbltoks}%
+% \setbox\scratchbox\vbox{\settrialtypesetting \flushtbltoks}%
\lettbldis\maximumcol\zeropoint
\ifautoTBLspread
% experimental, stretch non fixed cells to \hsize
@@ -1044,13 +1097,13 @@
\checktblwidthstwo % real run
\stretchtblwidths
\let\handleTBLcell\dohandleTBLcellB
- \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \setbox\scratchbox\vbox{\settrialtypesetting \flushtbltoks}%
\else\ifdim\wd0>\hsize
\ifautoTBLhsize
\checktblwidthsone % trial run
\checktblwidthstwo % real run
\let\handleTBLcell\dohandleTBLcellB
- \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \setbox\scratchbox\vbox{\settrialtypesetting \flushtbltoks}%
\fi
\else\ifautoTBLrowspan\ifnum\maximumrowspan>1 % max ?
% added jan 2002 because nx=* did no longer work
@@ -1061,16 +1114,16 @@
\hsize\savedhsize
%
\let\handleTBLcell\dohandleTBLcellC
- \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \setbox\scratchbox\vbox{\settrialtypesetting \flushtbltoks}%
\fi\fi\fi\fi
\let\handleTBLcell\dohandleTBLcellD
- \chardef\tblpass\plustwo
+ \tblpass\plustwo
\let\makeTBL\domakeTBLtwo
- \setbox\scratchbox\vbox{\trialtypesettingtrue \flushtbltoks}%
+ \setbox\scratchbox\vbox{\settrialtypesetting \flushtbltoks}%
\checktblheightsone
\checktblheightstwo
\let\handleTBLcell\dohandleTBLcellE
- \chardef\tblpass\plusthree
+ \tblpass\plusthree
\let\makeTBL\domakeTBLthree
\ifnum\TBLlevel>\plusone
\@EA\notsplittblbox
@@ -1348,7 +1401,7 @@
\fi
\fi
\fi
- \setbox2\null
+ \setbox2\emptyhbox
\wd2\wd\scratchbox \ht2\ht\scratchbox \dp2\dp\scratchbox
\box2
\egroup}
@@ -1360,7 +1413,7 @@
[\@@tbl\@@tbl]
[#4,#1,\c!frame=\v!off,\c!background=]
{\bTBLCELL#5\eTBLCELL}}%
- \setbox2\null
+ \setbox2\emptyhbox
\wd2\wd\scratchbox \ht2\ht\scratchbox \dp2\dp\scratchbox
\ifautoTBLrowspan
\scratchcounter\numexpr\tblrow+\plusone\relax
@@ -1546,51 +1599,6 @@
\fi
\fi}
-%D Spacing:
-%
-% \starttabulate
-% \NC text \NC text \NC \NR
-% \TB[small]
-% \NC text \NC text \NC \NR
-% \TB[4*big]
-% \NC text \NC text \NC \NR
-% \stoptabulate
-%
-% \starttable[|||]
-% \VL text \VL text \VL \AR
-% \TB[small]
-% \VL text \VL text \VL \AR
-% \TB[4*big]
-% \VL text \VL text \VL \AR
-% \stoptable
-
-\def\complexTableTB[#1]{\TABLEnoalign{\blank[#1]}}
-\def\simpleTableTB {\TABLEnoalign{\blank}}
-
-\def\TabulateTB
- {\complexorsimpleTable{TB}}
-
-\def\doTableinterline% #1
- {\ifnum\currentTABLEcolumn>\maxTABLEcolumn
- \chuckTABLEautorow
- \else\ifnum\currentTABLEcolumn=\zerocount
- \TABLEnoalign
- {\globalletempty\checkTABLEautorow
- \globalletempty\chuckTABLEautorow}%
- \else
- \setTABLEerror\TABLEmissingcolumn
- \handleTABLEerror
- \fi\fi
- \complexorsimpleTable} % {#1}
-
-\def\TableHL{\doTableinterline{HL}}
-\def\TableTB{\doTableinterline{TB}}
-
-\appendtoks\let\TB\TableTB \to\everytable
-\appendtoks\let\TB\TabulateTB\to\everytabulate % strange place
-
-\appendtoks \chardef\recodeverbatimmode\plustwo \to \everytable
-
% new (for Olivier Turlier)
%
% \defineTABLEsetup [xx] [foregroundcolor=red]
diff --git a/Master/texmf-dist/tex/context/base/tabl-nte.mkiv b/Master/texmf-dist/tex/context/base/tabl-nte.mkiv
index cde64a033d5..2a9e147038c 100644
--- a/Master/texmf-dist/tex/context/base/tabl-nte.mkiv
+++ b/Master/texmf-dist/tex/context/base/tabl-nte.mkiv
@@ -84,13 +84,9 @@
\expandafter\dododoTABLENC
\fi}
-% \long\def\dododoTABLENC#1\NC
-% {\ifconditional\inTABLEnc\else\settrue\inTABLEnc\parseTR[][]\fi
-% \parseTD[][]#1\eTD\NC}
-
\long\def\dododoTABLENC#1\NC
- {\ifconditional\inTABLEnc\else\settrue\inTABLEnc\parseTR[][]\fi
- \dodoubleempty\parseTD#1\eTD\NC}
+ {\ifconditional\inTABLEnc\else\settrue\inTABLEnc\dobTR[]\fi
+ \dobTD#1\eTD\NC}
%D The related structure commands are also available:
diff --git a/Master/texmf-dist/tex/context/base/tabl-pln.mkiv b/Master/texmf-dist/tex/context/base/tabl-pln.mkiv
index 39bb50f2329..9e65f7e40d8 100644
--- a/Master/texmf-dist/tex/context/base/tabl-pln.mkiv
+++ b/Master/texmf-dist/tex/context/base/tabl-pln.mkiv
@@ -19,11 +19,11 @@
\newdimen \@@plntabdimen
\def\cleartabs % visible
- {\global\setbox\@@plntabsyet\null
- \setbox\@@plntabs\null}
+ {\global\setbox\@@plntabsyet\emptyhbox
+ \setbox\@@plntabs\emptyhbox}
\def\settabs % visible
- {\setbox\@@plntabs\null
+ {\setbox\@@plntabs\emptyhbox
\futurelet\next\@@plnsettabs}
\def\tabalign % visible
@@ -61,7 +61,7 @@
\def\@@plnmaketabbox
{\begingroup
\global\setbox\@@plntabsyet\copy\@@plntabs
- \global\setbox\@@plntabsdone\null
+ \global\setbox\@@plntabsdone\emptyhbox
\def\cr
{\@@plncrtrue\crcr\egroup\egroup
\if@@plnusetab\unvbox\zerocount\lastbox\fi\endgroup
diff --git a/Master/texmf-dist/tex/context/base/tabl-tab.mkiv b/Master/texmf-dist/tex/context/base/tabl-tab.mkiv
index d926dab989a..24bbb4dd607 100644
--- a/Master/texmf-dist/tex/context/base/tabl-tab.mkiv
+++ b/Master/texmf-dist/tex/context/base/tabl-tab.mkiv
@@ -3,9 +3,9 @@
%D version=1997.10.10,
%D title=\CONTEXT\ Table Macros,
%D subtitle=\TABLE\ Embedding,
-%D author=Hans Hagen,
+%D author=Hans Hagen with copied and patched code from MJ Wichura,
%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%D copyright=PRAGMA-ADE (patched and extensions)]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
@@ -13,85 +13,1132 @@
\writestatus{loading}{ConTeXt Table Macros / TaBlE Embedding}
-% By now it makes more sense to merge the patches into the original
-% and clean that one up too.
+% Todo: consistent namespace and get rid of not used code
-% \starttable[|||]
-% \HL
-% \VL test \VS test \VL \FR
-% \VL test \VD test \VL \MR
-% \VL test \VT test \VL \LR
-% \HL
-% \stoptable
-
-% Don't change the splitter:
+% In \MKIV\ the old table macros are sort of obsolete. The
+% color extensions have been removed and some code is stripped.
+% For practical reasons the \TABLE\ macros that are used are
+% embedded in this file.
%
-% ... \NR
-% \TABLEnoalign{\page}\TABLEhead
-% \NC ...
-
-% e-tex: reverse rows or vadjust or ... in tables
-% \ifalign
-% \xhrule : calls for 'special' with width
-% BUG:
+% The following code is based on TABLE 1.0 by Michael J. Wichura
+% (August 1988. We used a patched version with many overloads
+% and extensions. The documented (and larger) source can be found
+% in \type {thrd-tab.tex}.
%
-% \starttable[|l|l|]
-% \HL
-% \RL\FR \VL Head 1 \VL Head 2 \VL\FR
-% \RL\LR \VL Head A \VL Head B \VL\LR % niet grijs ??
-% \HL
-% \VL 1 \VL 2 \VL\FR
-% \VL a \VL b \VL\LR
-% \HL
-% \stoptable
+% Some code has been stripped. Some color has been added. Some macros
+% have been renamed. Registers have been replaces. And probably much
+% more can be cleaned up.
-% melden als in kleur conflict, uitgestelde test op \SR\SR
+\unprotect
-% verengelsen
-% interface
+\newconditional\tablehasleftspacing
+\newconditional\tablehasrightspacing
-% footnotes flushen
-% \......TABLE........ namen
-% kolommen testen
-% unbreakable kop definieren
-% voetnoten
-% meldingen
-% als direct \use{max} dan fout
-% \BREAKPOINT
-% breedte lijn telt
-% errors: ook gray in handle
+\newdimen\tablelinethicknessunit
+\newdimen\tablestrutunit
+\newskip \tableintercolumnspaceunit
+\newdimen\tablecolumnwidthunit
+\newdimen\tablekernunit
-% \AR -> als in DL dan \DR
+\def\tablestrutheightfactor {8}
+\def\tablestrutdepthfactor {3}
+\def\tableintercolumnspacefactor {3}
+\def\tablecolumnwidthfactor {10}
+\def\tablevspacefactor {2}
+\def\tablekernfactor {1}
+\def\tablelinethicknessfactor {4}
-% nieuw:
-%
-% \NL / \NL[blanko] is skip, nog default?
-% geen \HL in a row
-% \HL[n]
-% \VL[n] + remembers
-% c{colorspec} key
-% \HC[color][width]
-% \VC[color]
-% meldingen row, column, use, advise
-% \AR: UITSTELLEN / EXPERIMENTEEL
-
-% WAARDELOZE ERROR HANDLER
-% THIS RENEWED MODULE WORKS OK BUT STILL LOOKS BAD
-
-%D We felt no need to write our own table building macros,
-%D simply because Michael Wichura made a terrific one. This
-%D package is quite complete and well documented. In \CONTEXT\
-%D we provide a shell for consistent spacing as well as color
-%D support. Implementing these features without adapting the
-%D original macros is not trivial. One easilly gets conflicts
-%D with \type{\omit}, \type{\span} and \type{\noalign}, which
-%D means that we end up postponing and overloading macros,
-%D mostly global. Now, let's start with loading the main
-%D macros:
-
-\doifundefined{BeginTable}{\doinputonce{table.tex}}
+\newtoks\everytable
+\newtoks\everytableparbox
-\unprotect
+\unexpanded\def\dotablebeginparbox#1%
+ {\setbox\scratchbox\vtop\bgroup % \setbox added
+ \hsize#1\relax
+ \dontcomplain
+ \dorestoretablelineskips
+ \normalbaselines
+ \let~\fixedspace
+ \blank[\v!disable]% % added
+ \the\everytableparbox}
+
+\unexpanded\def\dotableendparbox
+ {\removelastskip % itemize or so
+ \endgraf
+ \ifnum\prevgraf>\zerocount % we want at least
+ \verticalstrut \nowhitespace \vskip-\struttotal % one line of text
+ \egroup
+ \ifdim\dp\scratchbox>\lineheight % see (*) for an
+ \getnoflines{\dp\scratchbox}% % example of where
+ \dp\scratchbox\zeropoint % saving can go
+ \setbox\scratchbox % terrible wrong
+ \vtop to \noflines\lineheight{\box\scratchbox}%
+ \fi % esp between rows
+ \else % of paragraphs
+ \egroup
+ \fi
+ \box\scratchbox}
+
+\appendtoks
+ \parindent\zeropoint
+ \raggedright
+ \rightskip\zeropoint \!!plus 4em \relax
+\to \everytableparbox
+
+\newskip \tablelefttabskip
+\newskip \tablerighttabskip
+
+\newcount\!taColumnNumber
+\newcount\!taRecursionLevel % (Initially 0)
+
+\newdimen\!taDimenA % used by \Enlarge
+\newdimen\!taDimenB % used by \Enlarge
+\newdimen\!taDimenC % used by numeric.tex
+\newdimen\!taMinimumColumnWidth
+
+\newtoks \!taTableSpread
+\newtoks \!taPreamble
+\newtoks \!taDataColumnTemplate
+\newtoks \!taRuleColumnTemplate
+\newtoks \!taOldRuleColumnTemplate
+\newtoks \!taLeftGlue
+\newtoks \!taRightGlue
+
+\newskip \!taLastRegularTabskip
+
+\newif \if!taBeginFormat
+\newif \if!taOnceOnlyTabskip
+
+\def\!thToksEdef#1#2%
+ {\edef\!ttemp{#2}%
+ #1\expandafter{\!ttemp}%
+ \ignorespaces}
+
+\def\!thLoop#1\repeat
+ {\def\!thIterate{#1\expandafter \!thIterate\fi}%
+ \!thIterate
+ \let\!thIterate\relax}
+
+\def\dobegintableformat
+ {\!taPreamble\emptytoks
+ \!taColumnNumber\zerocount
+ \scratchskip\tableintercolumnspaceunit
+ \multiply\scratchskip\tableintercolumnspacefactor
+ \divide\scratchskip\plustwo
+ \!taRuleColumnTemplate\expandafter{\expandafter\tabskip\the\scratchskip}%
+ \!taLastRegularTabskip\scratchskip
+ \!taOnceOnlyTabskipfalse
+ \!taBeginFormattrue
+ \let\!tfRowOfWidths\empty
+ \doreadtableformatkeys}
+
+\def\!tfSetWidth
+ {\ifx\!tfRowOfWidths\empty % true if no prior "w" keys
+ \ifnum\!taColumnNumber>\zerocount % true if "w" key is to right of first "|"
+ \begingroup % RowOfWidths={&\omit || n copies of &\omit&\omit}, where n = number of column to the left of this one
+ \scratchcounter\plusone
+ \aftergroup \edef \aftergroup \!tfRowOfWidths \aftergroup {%
+ \aftergroup &\aftergroup \omit
+ \!thLoop
+ \ifnum \scratchcounter<\!taColumnNumber
+ \advance\scratchcounter\plusone
+ \aftergroup \!tfAOAO
+ \repeat
+ \aftergroup}%
+ \endgroup
+ \fi
+ \fi
+ \ifx[\!ttemp % \!tgGetValue sets \!ttemp = token after w
+ \expandafter\!tfSetWidthText
+ \else
+ \expandafter\!tfSetWidthValue
+ \fi}
+
+\def\!tfAOAO{&\omit&\omit}
+
+\def\!tfSetWidthText[#1]%
+ {\def\!tfWidthText{#1}%
+ \doreadtableformatkeys}
+
+\def\!tfSetWidthValue
+ {\!taMinimumColumnWidth=
+ \ifnum\!tgCode=\plusone
+ \ifx\!tgValue\empty \tablecolumnwidthfactor \else \!tgValue \fi \tablecolumnwidthunit
+ \else
+ \!tgValue
+ \fi
+ \let\!tfWidthText\empty % Override possible prior `w[sample entry]'
+ \doreadtableformatkeys}
+
+\def\!tfSetTabskip
+ {\ifnum\!tgCode=\plusone
+ \scratchskip\tableintercolumnspaceunit
+ \multiply\scratchskip \ifx\!tgValue\empty\tableintercolumnspacefactor\else\!tgValue\fi
+ \else
+ \scratchskip\!tgValue
+ \fi
+ \divide\scratchskip\plustwo
+ \ifnum\!taColumnNumber=\zerocount
+ %\!thToksEdef\!taRuleColumnTemplate{\the\!taRuleColumnTemplate\tabskip\the\scratchskip}%
+ \normalexpanded{\!taRuleColumnTemplate{\the\!taRuleColumnTemplate\tabskip\the\scratchskip}}%
+ \else
+ %\!thToksEdef\!taDataColumnTemplate{\the\!taDataColumnTemplate\tabskip\the\scratchskip}%
+ \normalexpanded{\!taDataColumnTemplate{\the\!taDataColumnTemplate\tabskip\the\scratchskip}}%
+ \fi
+ \if!taOnceOnlyTabskip\else
+ \!taLastRegularTabskip\scratchskip % Remember this Tabskip, for possible
+ \fi % restoration after a subsequent"OnceOnly"
+ \doreadtableformatkeys}
+
+\def\!tfSetVrule
+ {\!thToksEdef\!taRuleColumnTemplate
+ {\hfil
+ \vrule
+ \noexpand\!!width
+ \ifnum\!tgCode=\plusone
+ \ifx\!tgValue\empty
+ \tablevrulethicknessfactor
+ \else
+ \!tgValue
+ \fi
+ \tablelinethicknessunit
+ \else
+ \!tgValue
+ \fi
+ ####%
+ \hfil
+ \the\!taRuleColumnTemplate}%
+ \!tfAdjoinPriorColumn}
+
+\def\!tfSetAlternateVrule
+ {\afterassignment\!tfSetAlternateA
+ \scratchtoks}
+
+\def\!tfSetAlternateA
+ {\!thToksEdef\!taRuleColumnTemplate{\the\scratchtoks\the\!taRuleColumnTemplate}%
+ \!tfAdjoinPriorColumn}
+
+\def\!tfAdjoinPriorColumn
+ {\ifnum \!taColumnNumber=0
+ \!taPreamble=\!taRuleColumnTemplate % New \tabskip may have been added
+ \else
+ \ifx\!tfRowOfWidths\empty % no "w" keys specified yet, not even this col
+ \else
+ \!tfUpdateRowOfWidths
+ \fi
+ \!thToksEdef\!taDataColumnTemplate{\the\!taLeftGlue\the\!taDataColumnTemplate\the\!taRightGlue}%
+ \!thToksEdef\!taPreamble{\the\!taPreamble&\the\!taDataColumnTemplate&\the\!taRuleColumnTemplate}%
+ \fi
+ \advance \!taColumnNumber \plusone
+ \if!taOnceOnlyTabskip
+ \!thToksEdef\!taDataColumnTemplate{####\tabskip \the\!taLastRegularTabskip}%
+ \else
+ \!taDataColumnTemplate{##}%
+ \fi
+ \!taRuleColumnTemplate\emptytoks
+ \!taLeftGlue{\hfil}%
+ \!taRightGlue{\hfil}%
+ \!taMinimumColumnWidth\zeropoint
+ \let\!tfWidthText\empty
+ \!taOnceOnlyTabskipfalse
+ \doreadtableformatkeys}
+
+\def\!tfUpdateRowOfWidths
+ {\ifx\!tfWidthText\empty \else
+ \!tfComputeMinColWidth
+ \fi
+ \edef\!tfRowOfWidths
+ {\!tfRowOfWidths
+ &%
+ \omit
+ \ifdim \!taMinimumColumnWidth>\zeropoint
+ \hskip \the\!taMinimumColumnWidth
+ \fi
+ &
+ \omit}}
+
+\def\!tfComputeMinColWidth
+ {\setbox0\vbox
+ {\ialign{% Plain's initialized \halign; \tabskip=0pt \everycr={}
+ \span\the\!taDataColumnTemplate\cr
+ \!tfWidthText\cr}}%
+ \!taMinimumColumnWidth=\wd0 }
+
+\def\!tfFinishFormat
+ {\!thToksEdef\!taPreamble{####\tabskip\tablelefttabskip&\the\!taPreamble \tabskip\tablerighttabskip&####\tabskip\zeropoint\cr}
+ \!taBeginFormatfalse
+ \!ttDoHalign}
+
+\def\dotablereformat[#1]% will become local
+ {\omit
+ \!taDataColumnTemplate{##}%
+ \!taLeftGlue\emptytoks
+ \!taRightGlue\emptytoks
+ \begingroup
+ \@@useotherbar
+ \expanded{\endgroup\noexpand\doreadtableformatkeys#1]}}% appear in a \dotablereformat cmd; this is here as a safeguard.
+
+\appendtoks
+ \let\ReFormat\dotablereformat
+\to \everytable
+
+\def\!tfEndReFormat
+ {\!tfReFormat}
+
+\appendtoks \dotableparalignment \to \everytableparbox
+
+\def\!tfReFormat#1%
+ {\the \!taLeftGlue
+ \vbox{\forgetall\ialign{\span\the\!taDataColumnTemplate\cr#1\cr}}%
+ \the \!taRightGlue
+ \kern\zeropoint} % prevents \unskip / really needed
+
+\def\!tgGetValue#1%
+ {\def\!tgReturn{#1}%
+ \futurelet\!ttemp\!tgCheckForParen}
+
+\def\!tgCheckForParen%
+ {\ifx\!ttemp (%
+ \expandafter \!tgDoParen
+ \else
+ \expandafter \!tgCheckForSpace
+ \fi}
+
+\def\!tgDoParen(#1)%
+ {\def\!tgCode{2}% will be expanded
+ \def\!tgValue{#1}%
+ \!tgReturn}
+
+\def\!tgCheckForSpace
+ {\def\!tgCode{1}%
+ \let\!tgValue\empty
+ \ifx\!ttemp\!thSpaceToken
+ \expandafter \!tgReturn
+ \else
+ \expandafter \!tgCheckForDigit
+ \fi}
+
+% \def\!tgCheckForDigit
+% {\donefalse
+% \ifx 0\!ttemp \donetrue
+% \else\ifx 1\!ttemp \donetrue
+% \else\ifx 2\!ttemp \donetrue
+% \else\ifx 3\!ttemp \donetrue
+% \else\ifx 4\!ttemp \donetrue
+% \else\ifx 5\!ttemp \donetrue
+% \else\ifx 6\!ttemp \donetrue
+% \else\ifx 7\!ttemp \donetrue
+% \else\ifx 8\!ttemp \donetrue
+% \else\ifx 9\!ttemp \donetrue
+% \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+% \ifdone
+% \expandafter \!tgGetNumber
+% \else
+% \expandafter \!tgReturn
+% \fi}
+
+\def\!tgCheckForDigit % less tokens:
+ {\donetrue
+ \ifx 0\!ttemp \else \ifx 1\!ttemp \else
+ \ifx 2\!ttemp \else \ifx 3\!ttemp \else
+ \ifx 4\!ttemp \else \ifx 5\!ttemp \else
+ \ifx 6\!ttemp \else \ifx 7\!ttemp \else
+ \ifx 8\!ttemp \else \ifx 9\!ttemp \else
+ \donefalse
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \ifdone
+ \expandafter \!tgGetNumber
+ \else
+ \expandafter \!tgReturn
+ \fi}
+
+% \def\!tgCheckForDigit % does not work
+% {\relax\doifnumberelse\!ttemp\!tgGetNumber\!tgReturn}
+
+\def\!tgGetNumber {\afterassignment\!tgGetNumberA\scratchcounter=}
+\def\!tgGetNumberA{\edef\!tgValue{\the\scratchcounter}\!tgReturn}
+
+\def\!tgSetUpParBox
+ {\normalexpanded
+ {\noexpand \doreadtableformatkeys
+ b{\dotablebeginparbox
+ {\ifnum\!tgCode=\plusone
+ \ifx\!tgValue\empty
+ \tablecolumnwidthfactor
+ \else
+ \!tgValue
+ \fi
+ \tablecolumnwidthunit
+ \else
+ \!tgValue
+ \fi}}%
+ a{\dotableendparbox}}}
+
+\def\!tgInsertKern
+ {\edef\!ttemp
+ {\kern
+ \ifnum \!tgCode=\plusone
+ \ifx \!tgValue\empty
+ \tablekernfactor
+ \else
+ \!tgValue
+ \fi
+ \tablekernunit
+ \else
+ \!tgValue
+ \fi}%
+ \edef\!ttemp
+ {\noexpand\doreadtableformatkeys
+ \ifconditional\tablehasleftspacing
+ b{\!ttemp}
+ \fi
+ \ifconditional\tablehasrightspacing
+ a{\!ttemp}
+ \fi}%
+ \!ttemp}
+
+\def\newtableformatkey #1{\setvalue{!tk<\string#1>}}
+\def\doreadtableformatkeys#1{\getvalue{!tk<\string#1>}}
+
+% Key "b": b{TOKENS} adds TOKENS to the left of (before) the template
+
+\newtableformatkey b#1%
+ {\expandafter\!tkJoin\expandafter{\the\!taDataColumnTemplate}{#1}%
+ \doreadtableformatkeys}
+
+\def\!tkJoin#1#2%
+ {\!taDataColumnTemplate{#2#1}}%
+
+% Key "a": a{TOKENS} adds TOKENS to the right of (after) the template
+
+\newtableformatkey a#1%
+ {\!taDataColumnTemplate\expandafter{\the\!taDataColumnTemplate #1}%
+ \doreadtableformatkeys}
+
+% Key "\{": Enclose template in braces.
+
+\newtableformatkey \{%
+ {\!taDataColumnTemplate=\expandafter{\expandafter{\the\!taDataColumnTemplate}}%
+ \doreadtableformatkeys}
+
+% Key "*": "*{N}{KEY LETTERS}" is equivalent to specifying
+% <KEY LETTERS> N times.
+% KEY LETTERS may contain further * specifications
+
+\newtableformatkey *#1#2%
+ {\scratchcounter=#1\relax
+ \scratchtoks\emptytoks
+ \!thLoop
+ \ifnum\scratchcounter>\zerocount
+ \scratchtoks\expandafter{\the\scratchtoks#2}%
+ \advance\scratchcounter\minusone
+ \repeat
+ \expandafter\doreadtableformatkeys\the\scratchtoks}
+
+% Key "\LeftGlue": Specifies the glue (usually \hfil, or nothing) to be
+% added to extreme left of the template to position a column
+
+\newtableformatkey \LeftGlue#1%
+ {\!taLeftGlue{#1}%
+ \doreadtableformatkeys}
+
+\newtableformatkey \RightGlue#1%
+ {\!taRightGlue{#1}%
+ \doreadtableformatkeys}
+
+\newtableformatkey c%
+ {\prependtoks\raggedcenter\to\!taDataColumnTemplate
+ \doreadtableformatkeys \LeftGlue\hfil \RightGlue\hfil}
+
+\newtableformatkey l%
+ {\prependtoks\raggedright\to\!taDataColumnTemplate
+ \doreadtableformatkeys \LeftGlue\empty \RightGlue\hfil}
+
+\newtableformatkey r%
+ {\prependtoks\raggedleft\to\!taDataColumnTemplate
+ \doreadtableformatkeys \LeftGlue\hfil \RightGlue\empty}
+
+\newtableformatkey x%
+ {\prependtoks\notragged\to\!taDataColumnTemplate
+ \doreadtableformatkeys \LeftGlue\hfil \RightGlue\empty}
+
+% Key "k": Adds kerns to left and right of "#"
+% This key and the two below use Plain TeX's \if@h as if it were \if@left,
+% and \if@v as if it were \if@right. Table making goes on in a group,
+% so even in the unlikely circumstance that a \phantom is currently under
+% construction, there's no problem.
+
+\newtableformatkey k%
+ {\settrue\tablehasleftspacing
+ \settrue\tablehasrightspacing
+ \!tgGetValue{\!tgInsertKern}}
+
+% Key "i": Adds a kern to the left of "#"
+
+\newtableformatkey i%
+ {\settrue\tablehasleftspacing
+ \setfalse\tablehasrightspacing
+ \!tgGetValue{\!tgInsertKern}}
+
+% Key "j": Adds a kern to the right of "#"
+
+\newtableformatkey j%
+ {\setfalse\tablehasleftspacing
+ \settrue\tablehasrightspacing
+ \!tgGetValue{\!tgInsertKern}}
+
+% Key "n": numeric item , non-math mode.
+
+\newtableformatkey n%
+ {\def\!tnStyle{}%
+ \futurelet\!tnext\!tnTestForBracket}
+
+% Key "N": numeric item, math mode.
+
+\newtableformatkey N%
+ {\def\!tnStyle{$}%
+ \futurelet\!tnext\!tnTestForBracket}
+
+% Key "m": Math mode.
+
+\newtableformatkey m%
+ {\doreadtableformatkeys b$ a$}
+
+% Key "M": Displaymath mode.
+
+\newtableformatkey M%
+ {\doreadtableformatkeys \{ b{$\displaystyle} a$}
+
+% Key "\m": Template ${}#\hfil$
+\newtableformatkey \m%
+ {\doreadtableformatkeys l b{{}} m}
+
+% Key "\M": Template $\displaystyle{{}#\hfil}$
+
+\newtableformatkey \M%
+ {\doreadtableformatkeys l b{{}} M}
+
+% Key "f": Set font (E.g., f\it sets up italic font (assuming \it
+% has its usual meaning)
+
+\newtableformatkey f#1%
+ {\doreadtableformatkeys b{#1}}
+
+\newtableformatkey B{\doreadtableformatkeys f\bf} % Key "B": abbreviation for f\bf
+\newtableformatkey I{\doreadtableformatkeys f\it} % Key "I": abbreviation for f\it
+\newtableformatkey S{\doreadtableformatkeys f\sl} % Key "S": abbreviation for f\sl
+\newtableformatkey R{\doreadtableformatkeys f\rm} % Key "R": abbreviation for f\rm
+\newtableformatkey T{\doreadtableformatkeys f\tt} % Key "T": abbreviation for f\tt
+
+% Key "p": ParBox
+
+\newtableformatkey p%
+ {\!tgGetValue{\!tgSetUpParBox}}
+
+% Key "w": minimum column width
+
+\newtableformatkey w%
+ {\!tkTestForBeginFormat w{\!tgGetValue{\!tfSetWidth}}}
+
+% Key "s": Set tabskip for the inter-column space to the right
+% of the current column, and all subsequent spaces, until overriden
+% by a new "s" or "o" key.
+
+\newtableformatkey s%
+ {\!taOnceOnlyTabskipfalse % in case same column has a prior "o" key
+ \!tkTestForBeginFormat t{\!tgGetValue{\!tfSetTabskip}}}
+
+% Key "o": Apply the \tabskip stated for this column ONLY to the
+% inter-column space just to the right of this column; restore the
+% the previous \tabskip for subsequent columns.
+
+\newtableformatkey o%
+ {\!taOnceOnlyTabskiptrue
+ \!tkTestForBeginFormat o{\!tgGetValue{\!tfSetTabskip}}}
+
+% Key "|": Standard rule column designator
+
+\newtableformatkey |%
+ {\!tkTestForBeginFormat |{\!tgGetValue{\!tfSetVrule}}}
+
+% Key "\|": Non-standard rule column designator
+
+\newtableformatkey \|%
+ {\!tkTestForBeginFormat \|{\!tfSetAlternateVrule}}
+
+% Key ".": PERIOD -- end of \dobegintableformat section.
+
+\newtableformatkey .%
+ {\!tkTestForBeginFormat.{\!tfFinishFormat}}
+
+% Key "\doendtableformat": Equivalent to "."
+
+\newtableformatkey \doendtableformat
+ {\!tkTestForBeginFormat\doendtableformat{\!tfFinishFormat}}
+
+% Key "]": End of \dotablereformat section
+
+\newtableformatkey ]%
+ {\!tkTestForReFormat ] \!tfEndReFormat}
+
+% TEST FOR BEGIN FORMAT{<Key>}{Intended Action}: This test is run
+% on keys that can only be used by \dobegintableformat --- "s", "o",
+% "|", "\|", "w", ".", and "\doendtableformat".
+
+\def\!tkTestForBeginFormat#1#2%
+ {\if!taBeginFormat
+ \def\!ttemp{#2}%
+ \expandafter\!ttemp
+ \else
+ \toks0={#1}%
+ \toks2=\expandafter{\string\dotablereformat}%
+ \expandafter\!tkImproperUse
+ \fi}
+
+% TEST FOR RE FORMAT{<Key>}{Intended Action}: This test is run
+% on the key "]", which can only be used by \dotablereformat.
+
+\def\!tkTestForReFormat#1#2%
+ {\if!taBeginFormat
+ \toks0={#1}%
+ \toks2=\expandafter{\string\dobegintableformat}%
+ \expandafter\!tkImproperUse
+ \else
+ \def\!ttemp{#2}%
+ \expandafter\!ttemp
+ \fi}
+
+% NOTE: THE SPACE BETWEEN A NUMERIC ENTRY AND THE FOLLOWING '|', '"',
+% OR '\|' IS MANDATORY.
+% EMPTY NUMERIC ENTRIES ARE NOT ALLOWED: USE '{}' OR '\omit' INSTEAD.
+
+\def\!tnTestForBracket
+ {\ifx[\!tnext
+ \expandafter\!tnGetArgument
+ \else
+ \expandafter\!tnGetCode
+ \fi}
+
+% GET CODE: E.g. "4", or "4.0", "0.4", or "10.2"
+
+\def\!tnGetCode#1 %
+ {\!tnConvertCode #1..!}
+
+% CONVERT CODE: E.g. converts above to [0000], [0000.], [.0000],
+% [0000000000.00]
+
+\def\!tnConvertCode #1.#2.#3!%
+ {\begingroup
+ \aftergroup\edef \aftergroup\!ttemp \aftergroup{%
+ \aftergroup[%
+ \scratchcounter#1\relax
+ \!thLoop
+ \ifnum \scratchcounter>\zerocount
+ \advance\scratchcounter\minusone
+ \aftergroup0
+ \repeat
+ \def\!ttemp{#3}%
+ \ifx\!ttemp \empty
+ \else
+ \aftergroup.
+ \scratchcounter#2\relax
+ \!thLoop
+ \ifnum \scratchcounter>\zerocount
+ \advance\scratchcounter\minusone
+ \aftergroup0
+ \repeat
+ \fi
+ \aftergroup]\aftergroup}%
+ \endgroup\relax
+ \expandafter\!tnGetArgument\!ttemp}
+
+% GET ARGUMENT: [<sample left field> <optional .<sample right field>>
+
+\def\!tnGetArgument[#1]%
+ {\!tnMakeNumericTemplate\!tnStyle#1..!}
+
+% MAKE NUMERIC TEMPLATE
+
+\def\!tnMakeNumericTemplate#1#2.#3.#4!% #1=<empty> or $
+ {\def\!ttemp{#4}%
+ \ifx\!ttemp\empty
+ \!taDimenC\zeropoint
+ \else
+ \setbox\scratchbox=\hbox{\mathsurround\zeropoint #1.#3#1}%
+ \!taDimenC\wd\scratchbox
+ \fi
+ \setbox\scratchbox\hbox{\mathsurround\zeropoint #1#2#1}%
+ \!thToksEdef\!taDataColumnTemplate
+ {\noexpand\!tnSetNumericItem{\the\wd\scratchbox}{\the\!taDimenC}{#1}%
+ \the\!taDataColumnTemplate}% Might have tabskip glue in here
+ \doreadtableformatkeys}
+
+% SET NUMERIC ITEM
+
+\def\!tnSetNumericItem #1#2#3#4 %
+ {\!tnSetNumericItemA {#1}{#2}{#3}#4..!}
+
+\def\!tnSetNumericItemA #1#2#3#4.#5.#6!%
+ {\def\!ttemp{#6}%
+ \hbox to #1{\hss \mathsurround\zeropoint #3#4#3}%
+ \hbox to #2{\ifx\!ttemp\empty\else\mathsurround\zeropoint #3.#5#3\fi\hss}}
+
+% extensions
+
+\newtableformatkey q%
+ {\letempty\!tqStyle
+ \futurelet\!tnext\!tqTestForBracket}
+
+\newtableformatkey Q%
+ {\def\!tqStyle{$}%
+ \futurelet\!tnext\!tqTestForBracket}
+
+\def\!tqTestForBracket
+ {\ifx[\!tnext
+ \!thx\!tqGetArgument
+ \else
+ \!thx\!tqGetCode
+ \fi}
+
+\def\!tqGetCode#1 % note the blank
+ {\!tqConvertCode #1,,!}
+
+\def\!tqConvertCode #1,#2,#3!%
+ {\begingroup
+ \aftergroup\edef
+ \aftergroup\!ttemp
+ \aftergroup{%
+ \aftergroup[%
+ \scratchcounter#1\relax
+ \!thLoop
+ \ifnum \scratchcounter>\zerocount
+ \advance\scratchcounter\minusone
+ \aftergroup0
+ \repeat
+ \def\!ttemp{#3}%
+ \ifx\!ttemp\empty
+ \else
+ \aftergroup,
+ \scratchcounter#2\relax
+ \!thLoop
+ \ifnum\scratchcounter>\zerocount
+ \advance\scratchcounter\minusone
+ \aftergroup0
+ \repeat
+ \fi
+ \aftergroup]\aftergroup}%
+ \endgroup\relax
+ \!thx\!tqGetArgument\!ttemp}
+
+\def\!tqGetArgument[#1]%
+ {\!tqMakeQuantityTemplate\!tqStyle#1,,!}
+
+\def\!tqMakeQuantityTemplate#1#2,#3,#4!% #1=<empty> or $
+ {\def\!ttemp{#4}%
+ \ifx\!ttemp\empty
+ \!taDimenC\zeropoint
+ \else
+ \setbox\scratchbox\hbox{\mathsurround\zeropoint #1,#3#1}%
+ \!taDimenC\wd\scratchbox
+ \fi
+ \setbox\scratchbox\hbox{\mathsurround\zeropoint #1#2#1}%
+ \!thToksEdef\!taDataColumnTemplate
+ {\noexpand\!tqSetQuantityItem{\the\wd\scratchbox}{\the\!taDimenC}{#1}%
+ \the\!taDataColumnTemplate}%
+ \doreadtableformatkeys}
+
+\def\!tqSetQuantityItem #1#2#3#4 %
+ {\!tqSetQuantityItemA{#1}{#2}{#3}#4,,!}
+
+\def\!tqSetQuantityItemA #1#2#3#4,#5,#6!%
+ {\def\!ttemp{#6}%
+ \hbox to #1{\hss\mathsurround\zeropoint#3#4#3}%
+ \hbox to #2{\ifx\!ttemp\empty\else\mathsurround\zeropoint#3,#5#3\fi\hss}}
+
+% \Enlarge<extra height><extra depth><original>
+% \enlarge<multiple for extra height><multiple for extra depth><original>
+
+\def\dotableEnlarge#1#2%
+ {% 3rd argument is picked up later
+ % #1=extra height
+ % #2=extra depth
+ \!taDimenA=#1\relax
+ \!taDimenB=#2\relax
+ \let\!TsSpaceFactor\empty
+ \ifmmode
+ \expandafter\mathpalette
+ \expandafter\!TsEnlargeMath
+ \else
+ \expandafter\!TsEnlargeOther
+ \fi}
+
+\def\!TsEnlargeOther#1%
+ {\ifhmode
+ \setbox\scratchbox\hbox{#1\xdef\!TsSpaceFactor{\spacefactor\the\spacefactor}}%
+ \else
+ \setbox\scratchbox\hbox{#1}%
+ \fi
+ \!TsFinishEnlarge}
+
+\def\!TsEnlargeMath#1#2%
+ {\setbox\scratchbox\hbox{$\mathsurround\zeropoint#1{#2}$}%
+ \!TsFinishEnlarge}
+
+\def\!TsFinishEnlarge
+ {\ht\scratchbox\dimexpr\ht\scratchbox+\!taDimenA\relax
+ \dp\scratchbox\dimexpr\dp\scratchbox+\!taDimenB\relax
+ \box\scratchbox
+ \!TsSpaceFactor\relax}
+
+\def\dotableenlarge#1#2% 3rd argument is picked up later
+ {\dotableEnlarge{#1\tablestrutunit}{#2\tablestrutunit}}
+
+\appendtoks
+ \let\enlarge\dotableenlarge
+ \let\Enlarge\dotableEnlarge
+\to \everytable
+
+% BEGIN TABLE
+
+\let\dotablestandardend\relax
+
+\def\dotablestandardbegin[#1]% \!ttBeginTable (always argument)
+ {\if#1u% unboxed table
+ \ifmmode
+ \let\dotablestandardend\relax % user had better be in display math mode and have only one table at the outer level
+ \else % user had better be in vertical mode
+ \bgroup
+ \let\dotablestandardend\egroup
+ \fi
+ \else
+ \hbox\bgroup
+ \def\dotablestandardend{\egroup\egroup}%
+ \if#1t%
+ \vtop
+ \else\if#1b%
+ \vbox
+ \else
+ \def\dotablestandardend{\egroup$\egroup}%
+ %$\vcenter
+ \scratchtoks\everymath\everymath\emptytoks$\everymath\scratchtoks\vcenter
+ \fi\fi
+ \bgroup % for the \vtop, \vbox, or \vcenter
+ \fi
+ \advance\!taRecursionLevel\plusone
+ \let\!ttRightGlue\relax
+ \everycr\emptytoks
+ \ifnum\!taRecursionLevel=\plusone
+ \the\everytable
+ \fi}
+
+\bgroup \catcode\tildeasciicode\activecatcode
+
+ \appendtoks
+ \catcode\barasciicode\activecatcode
+ \def~{\kern.5em}%
+ \def\\{\ifhmode\space\else\par\fi}%
+ \to \everytable
+
+\egroup
+
+\let\!ttRightGlue\relax % This may be changed, in a group, by \JustCenter, etc
+
+% DO HALIGN: Invoked by END FORMAT (or the key ".")
+
+\def\!ttDoHalign
+ {\edef\dorestoretablelineskips
+ {\baselineskip \the\baselineskip
+ \lineskiplimit\the\lineskiplimit
+ \lineskip \the\lineskip
+ \tabskip \the\tabskip
+ \relax}%
+ \baselineskip \zeropoint
+ \lineskiplimit\zeropoint
+ \lineskip \zeropoint
+ \tabskip \zeropoint
+ \doifelsenothing\@@titextwidth
+ {\halign}
+ {\doifelse\@@titextwidth\v!max
+ {\halign to \hsize}
+ {\halign to \@@titextwidth}}%
+% \the\!taTableSpread
+ \bgroup
+ \span
+ \the\!taPreamble
+ \ifx\!tfRowOfWidths\empty\else
+ \!tfRowOfWidths\cr
+ \fi}
+
+% END TABLE
+
+\def\dotablenormalend
+ {\egroup % finishes the \halign
+ \dotablestandardend} % closes off the table envirnoment set up by \tablestandardbegin
+
+\def\donormaltablelineending
+ {\cr}
+
+\def\donormaltablelineformat#1#2%
+ {\vrule
+ \!!width \zeropoint
+ \!!height\dimexpr\tablestrutheightfactor\tablestrutunit+#1\tablestrutunit\relax
+ \!!depth \dimexpr\tablestrutdepthfactor \tablestrutunit+#2\tablestrutunit\relax
+ \relax
+ \cr}
+
+% INSERT VRULE
+
+\newcount\noftablevrules \noftablevrules\plusone
+
+\let\tablecurrentvrulecolor\empty
+\let\tablecurrenthrulecolor\empty
+
+\def\@VLd{.125em}
+
+\def\do!ttInsertVrule % will be merged in 2005
+ {\vrule\!!width
+ \ifnum\!tgCode=\plusone
+ \ifx\!tgValue\empty
+ \tablevrulethicknessfactor
+ \else
+ \!tgValue
+ \fi
+ \tablelinethicknessunit
+ \else
+ \!tgValue
+ \fi
+ \hskip\@VLd}
+
+\def\donormaltablesimplebar
+ {\unskip\!ttRightGlue&&}
+
+\def\donormaltablecomplexbar
+ {\unskip\!ttRightGlue&\omit
+ \hfil
+ \ifx\tablecurrentvrulecolor\empty\else
+ \switchtocolor[\tablecurrentvrulecolor]%
+ \fi
+ \ifcase\noftablevrules\or
+ \do!ttInsertVrule
+ \unskip
+ \else
+ \dorecurse\noftablevrules\do!ttInsertVrule
+ \global\noftablevrules\plusone
+ \unskip
+ \fi
+ \global\let\tablecurrentvrulecolor\empty
+ \hfil
+ &}
+
+\def\donormaltablenobar
+ {\unskip\!ttRightGlue&\omit&}
+
+\def\donormaltablesinglerule
+ {&\donormaltablelongrule&}
+
+\def\donormaltablemultirule
+ {&\!ttuse\tabledrulespan\donormaltablelongrule&}
+
+% USE
+
+\def\!ttuse#1%
+ {\ifnum#1>\plusone
+ \omit
+ \global\setfalse\istabledivision % added
+ \scratchcounter\currenttablecolumn % added
+ \advance\scratchcounter #1% % added
+ \advance\scratchcounter \minusone % added
+ \def\next % added
+ {\global\advance\currenttablecolumn #1% % added
+ \global\advance\currenttablecolumn \minusone % added
+ \scratchcounter#1%
+ \advance\scratchcounter \minusone
+ \advance\scratchcounter \scratchcounter
+ \!thLoop
+ \ifnum\scratchcounter>\plusone
+ \spanomit \advance\scratchcounter\minusone
+ \repeat
+ \span}%
+ \else % added
+ \def\next % conflicts with possible next \omit % added
+ {\global\advance\currenttablecolumn \plusone}%% added
+ \fi
+ \next} % added
+
+\def\!ttUse#1[%
+ {\!ttuse{#1}%
+ \dotablereformat[}
+
+\appendtoks
+ \let\use\!ttuse
+ \let\Use\!ttUse
+\to \everytable
+
+% rules
+
+\def\donormaltablefullrule
+ {\starttablenoalign
+ \!ttGetHalfRuleThickness
+ \hrule\!!height\scratchdimen\!!depth\scratchdimen
+ \stoptablenoalign}
+
+\def\donormaltableshortrule % was: \!ttShortHrule
+ {\omit
+ \!ttGetHalfRuleThickness
+ \leaders\hrule\!!height\scratchdimen\!!depth\scratchdimen\hfill
+ \emptyhbox
+ \ignorespaces}
+
+\def\donormaltablelongrule % was: \!ttLongHrule
+ {\omit\span
+ \omit\span
+ \donormaltableshortrule}
+
+\def\!ttGetHalfRuleThickness
+ {\scratchdimen\dimexpr
+ \ifnum\!tgCode=\plusone
+ \ifx\!tgValue\empty
+ \tablehrulethicknessfactor
+ \else
+ \!tgValue % user-specified integer
+ \fi
+ \tablelinethicknessunit
+ \else
+ \!tgValue % user-specified dimension
+ \fi
+ \divide\scratchdimen\plustwo}
+
+% \emptyhbox prevents \unskip
+
+\def\dotableLeft #1{#1\hfill\emptyhbox}
+\def\dotableCenter#1{\hfill#1\hfill\emptyhbox}
+\def\dotableRight #1{\hfill#1}
+
+\def\dotableOpenUp#1#2%
+ {\edef\tablestrutheightfactor{\withoutpt\the\dimexpr\tablestrutheightfactor\points+#1\points}%
+ \edef\tablestrutdepthfactor {\withoutpt\the\dimexpr\tablestrutdepthfactor \points+#2\points}}
+
+% SetTableToWidth -> textwidth=dimension [to dimension]
+% Expand -> textwidth=max [to \hsize]
+% WidenTableBy -> [spread #1]
+% \tablelefttabskip\zeropoint\!!plus1fill
+% \tablerighttabskip\tablelefttabskip
+% LongLines -> [spread \hsize]
+
+\def\dotableJustLeft {\omit\let\!ttRightGlue\hfill}
+\def\dotableJustCenter{\omit\hfill\emptyhbox\let\!ttRightGlue\hfill}
+\def\dotableJustRight {\omit\hfill\emptyhbox}
+
+\def\dotableSmash
+ {\relax
+ \ifmmode
+ \expandafter\mathpalette
+ \expandafter\!thDoMathVCS
+ \else
+ \expandafter\!thDoVCS
+ \fi}
+
+\def\!thDoVCS#1%
+ {\setbox\zerocount\hbox{#1}%
+ \!thFinishVCS}
+
+\def\!thDoMathVCS#1#2%
+ {\setbox\zerocount\hbox{$\mathsurround\zeropoint#1{#2}$}%
+ \!thFinishVCS}
+
+\def\!thFinishVCS
+ {\vbox to\zeropoint{\vss\box\zerocount\vss}}
+
+\def\dotableRaise
+ {\def\!thSign{+}%
+ \!tgGetValue\!thSetDimen}
+
+\def\dotableLower
+ {\def\!thSign{-}%
+ \!tgGetValue\!thSetDimen}
+
+\def\!thSetDimen
+ {\ifnum\!tgCode=\plusone
+ \ifx\!tgValue\empty
+ \!taDimenA\tablestrutheightfactor\tablestrutunit
+ \advance\!taDimenA\tablestrutdepthfactor\tablestrutunit
+ \divide\!taDimenA\plustwo
+ \else
+ \!taDimenA\!tgValue\tablestrutunit
+ \fi
+ \else
+ \!taDimenA\!tgValue
+ \fi
+ \!taDimenA\!thSign\!taDimenA\relax
+ \ifmmode
+ \expandafter\mathpalette
+ \expandafter\!thDoMathRaise
+ \else
+ \expandafter\!thDoSimpleRaise
+ \fi}
+
+\def\!thDoSimpleRaise#1%
+ {\setbox\zerocount\hbox{\raise \!taDimenA\hbox{#1}}%
+ \!thFinishRaise} % From Plain TeX: \ht0=0pt \dp0=0pt \box0
+
+\def\!thDoMathRaise#1#2%
+ {\setbox\zerocount\hbox{\raise \!taDimenA\hbox{$\mathsurround\zeropoint#1{#2}$}}%
+ \!thFinishRaise}
+
+\def\!thFinishRaise
+ {\ht\zerocount\zeropoint
+ \dp\zerocount\zeropoint
+ \box\zerocount}
+
+\def\dotableBackSpace
+ {\!tgGetValue\!thKernBack}
+
+\def\!thKernBack
+ {\kern -
+ \ifnum\!tgCode=\plusone
+ \ifx\!tgValue\empty
+ \tablekernfactor
+ \else
+ \!tgValue % user-specified integer
+ \fi
+ \tablekernunit
+ \else
+ \!tgValue % user-specified dimension
+ \fi
+ \ignorespaces}
+
+\def\dotableVspace
+ {\noalign
+ \bgroup
+ \!tgGetValue\!thVspace}
+
+\def\!thVspace
+ {\vskip
+ \ifnum\!tgCode=\plusone
+ \ifx\!tgValue\empty
+ \tablevspacefactor
+ \else
+ \!tgValue % user-specified integer
+ \fi
+ \tablestrutunit
+ \else
+ \!tgValue % user-specified skip
+ \fi
+ \egroup} % Ends the \noalign
+
+\appendtoks
+ \let\JustLeft \dotableJustLeft
+ \let\JustCenter \dotableJustCenter
+ \let\JustRight \dotableJustRight
+ \let\Smash \dotableSmash
+ \let\Raise \dotableRaise
+ \let\Lower \dotableLower
+ \let\BackSpace \dotableBackSpace
+ \let\Vspace \dotableVspace
+ \let\OpenUp \dotableOpenUp
+ \let\TableLeft \dotableLeft
+ \let\TableCenter \dotableCenter
+ \let\TableRight \dotableRight
+\to \everytable
%D \macros
%D {inintable, ifsplittables}
@@ -104,16 +1151,7 @@
\newif\ifintable
\newif\ifsplittables
-%D \macros
-%D {tracetablestrue}
-%D
-%D When I documented this module, I felt the need for tracing
-%D options. After implementing this feature, I also added
-%D warnings, error recovery and automatic spacing.
-
-\newif\iftracetables
-
-%D We show this feature in an eample that also shows some of
+%D We show this feature in an example that also shows some of
%D the basic table typesetting commands.
%D
%D \startbuffer
@@ -184,416 +1222,63 @@
%D in the last row.
%D
%D \getbuffer
-
-%D Bringing color into tables is complicated by the mere fact
-%D that color is not part of \TEX. The main complication is
-%D that we don't know in advance how wide a column will be. I
-%D implemented color support in tables in the early 90's
-%D because I needed it for some articles on color. I have to
-%D admit that I seldom use the mechanism.
-%D
-%D Most color support in \CONTEXT\ makes use of colored rules.
-%D At first sight, one is tempted to implement colors in tables
-%D in a similar way, but as said, we don't know the dimensions
-%D in advance. It turns out however that we don't have to,
-%D simply because alignments take care of stretching rules to
-%D the appropritate dimensions. This means that we can provide
-%D backgrounds by coloring rules with the height of a row,
-%D skipping upwards and finally drawing the content, like in:
%D
-%D \gdef\ShowExample
-%D {\startfiguretext
-%D {none}
-%D {\getbuffer}
-%D \typebuffer
-%D \stopfiguretext}
+%D Some simple color support is provided:
%D
%D \startbuffer
%D \starttable[|c|c|]
%D \HL
-%D \BL[2] \SR
-%D \VL test \VL test \VL\SR
-%D \HL
-%D \VL test \VL test \VL\FR
-%D \VL test \VL test \VL\MR
-%D \VL test \VL test \VL\LR
-%D \HL
-%D \stoptable
-%D \stopbuffer
-%D
-%D \ShowExample
-%D
-%D Just to be complete we show how the other columns can be
-%D given a background. Later we will provide more details over
-%D the commands used.
-%D
-%D \startbuffer
-%D \starttable[|c|c|c|]
-%D \HL
-%D \BL[3] \SR
-%D \VL test \VL test \VL test \VL\SR
-%D \HL
-%D \stoptable
-%D \stopbuffer
-%D
-%D \ShowExample
-%D
-%D \startbuffer
-%D \starttable[|c|c|c|]
-%D \HL
-%D \BC \BL[2] \SR
-%D \VL test \VL test \VL test \VL\SR
-%D \HL
-%D \stoptable
-%D \stopbuffer
-%D
-%D \ShowExample
-%D
-%D \startbuffer
-%D \starttable[|c|c|c|]
-%D \HL
-%D \BC \BC \BL \SR
-%D \VL test \VL test \VL test \VL\SR
-%D \HL
-%D \stoptable
-%D \stopbuffer
-%D
-%D \ShowExample
-%D
-%D \startbuffer
-%D \starttable[|c|c|c|]
-%D \HL
-%D \BC \BL \SR
-%D \VL test \VL test \VL test \VL\SR
-%D \HL
-%D \stoptable
-%D \stopbuffer
-%D
-%D \ShowExample
-%D
-%D \startbuffer
-%D \starttable[|c|c|c|]
-%D \BL \BL \SR
-%D \HL
-%D \VL test \VL test \VL test \VL\SR
+%D \VL test \VL test \VL \SR
+%D \HL[green,5]
+%D \VL[red] test \VL test \VL \FR
+%D \VL test \VL[10,red] test \VL \MR
+%D \VL test \VL test \VL[10] \LR
%D \HL
%D \stoptable
%D \stopbuffer
%D
-%D \ShowExample
+%D \typebuffer \getbuffer
-%D In these examples we can clearly see that for being a real
-%D background, the color or gray specification has to precede
-%D the content. Just to keep things simple, we can recall this
-%D specification later on:
-%D
-%D \startbuffer
-%D \starttable[|c|c|c|]
-%D \BC \BL \SR
-%D \HL
-%D \VL test \VL test \VL test \VL\SR
-%D \HL
-%D \BR\FR
-%D \VL test \VL test \VL test \VL\FR
-%D \BR\MR
-%D \VL test \VL test \VL test \VL\MR
-%D \BR\LR
-%D \VL test \VL test \VL test \VL\LR
-%D \HL
-%D \stoptable
-%D \stopbuffer
-%D
-%D \ShowExample
-%D
-%D Close study learns that we can put the specification
-%D before or after the \type{\HL}, whatever suits best. Keeping
-%D track of these specifications is taken care of by the next
-%D variables:
-
-\newif \ifTABLEgrayline % executing gray line
-\newif \ifTABLEgraydone % gray line executed
-\newtoks \TABLEgraytoks % gray line specification
-
-\newif\ifTABLEinbreak
-
-%D Nog vervangen:
-
-\def\c!Table{Table}
+\def\s!TaBlE{TaBlE}
\def\m!TABLE{TABLE}
-
+
%D We already saw that the table macros report errors and
%D provide automatic spacing. These features can only be
%D implemented by keeping track of the state, often the last
%D command on a row.
-\chardef\TABLEunknown = 0
+\newconstant\tableforcestate
+\newconstant\tableactionstate
+
+\setnewconstant\tableunknownstate 0
-\chardef\TABLEseparaterow = 1
-\chardef\TABLEfirstrow = 2
-\chardef\TABLEmidrow = 3
-\chardef\TABLElastrow = 4
-\chardef\TABLErule = 5
-\chardef\TABLEskip = 6
-\chardef\TABLEautorow = 7
+\setnewconstant\tableseparaterowstate 1
+\setnewconstant\tablefirstrowstate 2
+\setnewconstant\tablemidrowstate 3
+\setnewconstant\tablelastrowstate 4
+\setnewconstant\tablerulestate 5
+%setnewconstant\tableskipstate 6
+%setnewconstant\tableautorowstate 7
-\chardef\TABLEforcefirstrow = 1
-\chardef\TABLEforcelastrow = 2
+\setnewconstant\tableforcefirstrowstate 1
+\setnewconstant\tableforcelastrowstate 2
-\chardef\TABLEmissingrow = 1
-\chardef\TABLEmissingcolumn = 2
-\chardef\TABLEspanoverflow = 3
-\chardef\TABLEdivisionoverflow = 4
+\newconstant\tablerowfactor
+\newconstant\TABLEendofrowdepth
+\newconstant\TABLEendofrowheight
+\newconstant\TABLEcr
+\newconstant\tablerowzero
+\newconstant\TABLEn
-%D We store these states using efficient \type {\chardef}'s.
-%D Like most variables, these are global ones. When needed,
+%D We store these states using \type {constants}'s and
+%D like most variables, these are global ones. When needed,
%D especially when we flush the backgrounds, we can temporary
%D disable the assignment.
-\newif\ifsetTABLEaction
-
-\def\setTABLEaction#1%
- {\ifsetTABLEaction\global\chardef\TABLEaction#1\fi}
-
-\def\setTABLEforce#1%
- {\ifsetTABLEaction\global\chardef\TABLEforce#1\fi}
-
-\def\setTABLEerror#1%
- {\global\chardef\TABLEerror#1}
-
-%D Before we come to using these variables, we redefine and/or
-%D adapt some \TABLE\ macros. Within \TABLE's the \type{|} and
-%D \type{"} have special meanings in templates and are active
-%D during. Their meaning can therefore conflict with those
-%D elsewhere defined. To be compatible with traditional \TABLE\
-%D as well as \CONTEXT's \type{||} and the active \type{"}
-%D extensions for my german friends, we do some catcode magic.
-
-\newif\ifForgetTableBarAndQuote \ForgetTableBarAndQuotetrue
-
-% \bgroup
+\newconditional\tableactionstatepermitted
-% \catcode`\|=\@@active
-% \catcode`\"=\@@active
-%
-% \gdef\pushouterbarandquote
-% {\ifForgetTableBarAndQuote
-% \ifnum\catcode`\|=\@@active \let\outertablebar |\else\let\outertablebar \relax\fi
-% \ifnum\catcode`\"=\@@active \let\outertablequote"\else\let\outertablequote\relax\fi
-% \let|\letterbar
-% \let"\letterdoublequote
-% \fi}
-%
-% \gdef\popouterbarandquote
-% {\ifForgetTableBarAndQuote
-% \ifx\outertablebar \relax\else\let|\outertablebar \fi
-% \ifx\outertablequote\relax\else\let"\outertablequote\fi
-% \else
-% \redefinetablebarandquote
-% \fi}
-%
-% \egroup
-%
-% \def\ObeyTableBarAndQuote
-% {\ForgetTableBarAndQuotefalse
-% \ifintable
-% \redefinetablebarandquote
-% \fi}
-
-\let\ActivateBarAndQuote \relax
-\let\ObeyTableBarAndQuote\relax
-\let\pushouterbarandquote\relax
-\let\popouterbarandquote \relax
-
-%D \macros
-%D {ObeyTableBarAndQuote}
-%D
-%D As said, the \type{|} and \type{"} active characters are
-%D often used for other purposes. By default, the outside
-%D meanings are therefore preserved and available inside
-%D tables. If for some reason one wants to use the \TABLE\
-%D primitives, one can say:
-%D
-%D \starttyping
-%D \ObeyTableBarAndQuote
-%D \stoptyping
-%D
-%D To keep things verbose, as well as to show what \TABLE\
-%D commands we affect, we show some meanings.
-
-\def\normalTABLEshortrule {\!ttShortHrule} % \-
-\def\normalTABLElongrule {\!ttLongHrule} % \=
-\def\normalTABLEfullrule {\!ttFullHrule} % \_
-\def\normalTABLEendofrow {\!ttEndOfRow} % \\
-\def\normalTABLEsimplebar {\unskip\!ttRightGlue&&} % |
-\def\normalTABLEcomplexbar {\unskip\!ttRightGlue&\omit\!ttAlternateVrule} % \|
-\def\normalTABLEquote {\unskip\!ttRightGlue&\omit&} % "
-\def\normalTABLElineformat {\normalTABLEendofrow+}
-\def\normalTABLElineending {\normalTABLEendofrow0 }
-\def\normalTABLEsinglerule {&\normalTABLElongrule&}
-\def\normalTABLEmultirule#1{&\use{#1}\normalTABLElongrule&}
-
-%D The next hack is dedicated to Tobias, who found out that
-%D paragraph entries don't break well.
-
-\def\TABLEhack{\hskip\zeropoint}
-
-%D The first attemp to solve this problem was:
-%D
-%D \starttyping
-%D \def\normalTABLEquote%
-%D {\unskip\TABLEhack\!ttRightGlue&\omit&\TABLEhack}
-%D \stoptyping
-%D
-%D But, as usual, this interfered with \type {\omit}.
-%D
-%D The next attempt is redefining some core \TABLE\ macro:.
-%D This works ok, but breaks for instance the~\type{b}
-%D key handling.
-%D
-%D \starttyping
-%D \def\!tfAdjoinPriorColumn%
-%D {\ifnum\!taColumnNumber=0
-%D \!taPreamble=\!taRuleColumnTemplate
-%D ...
-%D \if!taOnceOnlyTabskip
-%D \!thToksEdef\!taDataColumnTemplate=
-%D {\TABLEhack####\TABLEhack\tabskip\the\!taLastRegularTabskip}
-%D \else
-%D \!taDataColumnTemplate{\TABLEhack##\TABLEhack}%
-%D \fi
-%D ...
-%D \ReadFormatKeys}
-%D \stoptyping
-
-% \newdimen\TABLEparheight
-
-\def\BeginTableParBox#1%
- {\setbox\scratchbox\vtop\bgroup % \setbox added
- \hsize#1\relax
- \dontcomplain
- \restoretablelineskips
- \normalbaselines
- \let~\!ttTie
- \let\-\!ttDH
- \blank[\v!disable]% % added
- \the\EveryTableParBox}
-
-\def\EndTableParBox
- {\removelastskip % itemize or so
- \endgraf
- \ifnum\prevgraf>\zerocount % we want at least
- \verticalstrut \nowhitespace \vskip-\struttotal % one line of text
- \egroup
- \ifdim\dp\scratchbox>\lineheight % see (*) for an
- \getnoflines{\dp\scratchbox}% % example of where
- \dp\scratchbox\zeropoint % saving can go
- \setbox\scratchbox % terrible wrong
- \vtop to \noflines\lineheight{\box\scratchbox}%
- \fi % esp between rows
- \else % of paragraphs
- \egroup
- \fi
-% \getboxheight\scratchdimen\of\box\scratchbox\relax% compensate for
-% \ifdim\scratchdimen>\TABLEparheight % funny depth of
-% \global\TABLEparheight\scratchdimen % multi-line box
-% \fi % i.e. vtop
- \box\scratchbox}
-
-% We also need to patch away the interfering math switch:
-
-% \mathpunctuationtrue
-
-% test, test
-% \starttable[|c|]
-% \NC1,,10\NC\AR
-% \stoptable
-% test, test
-
-\def\!ttBeginTableA[#1]{%
- \if #1u% % "unboxed" table
- \ifmmode
- \def\!ttEndTable{% % user had better be in display math mode
- \relax}% % and have only one table at the outer level
- \else % user had better be in vertical mode
- \bgroup
- \def\!ttEndTable{%
- \egroup}%
- \fi
- \else
- %\hbox\bgroup $
- %\def\!ttEndTable{%
- % \egroup % for the \vtop, \vbox, or \vcenter, yet to come
- % $% for math mode
- % \egroup}% for the \hbox
- %\if #1t%
- % \vtop
- %\else
- % \if #1b%
- % \vbox
- % \else
- % \vcenter % math mode was essential for this
- % \fi
- %\fi
- %
- \hbox\bgroup
- \def\!ttEndTable{\egroup\egroup}%
- \if#1t%
- \vtop
- \else\if#1b%
- \vbox
- \else
- \def\!ttEndTable{\egroup$\egroup}%
- %$\vcenter
- \scratchtoks\everymath\everymath\emptytoks$\everymath\scratchtoks\vcenter
- \fi\fi
- %
- \bgroup % for the \vtop, \vbox, or \vcenter
- \fi
- \advance\!taRecursionLevel 1 % RecursionLevel governs initialization
- \let\!ttRightGlue=\relax % This may be changed by \JustCenter, etc
- \everycr\emptytoks % ={}
- \ifnum \!taRecursionLevel=1
- \!ttInitializeTable
- \fi}
-
-%D The next redefinition is more robust than the original:
-
-\def\SetTableToWidth#1%
- {\doifelsenothing{#1}{\!taTableSpread\emptytoks}{\!taTableSpread{to #1}}}
-
-% (*) Try this one with \type {direction} and {girection};
-% the \PPCHTEX\ manual is a nice testcase.
-%
-% \startoverlay
-% {\starttable[ | l w(2cm) | w(8cm) | ]
-% \HL
-% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \FR
-% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \MR
-% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \LR
-% \HL
-% \stoptable}
-% {\starttable[ | l w(2cm) | p(8cm) | ]
-% \HL
-% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \FR
-% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \MR
-% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \LR
-% \HL
-% \stoptable}
-% \stopoverlay
-% \vskip2cm
-% \starttable[ | l w(2cm) | p(8cm) | ]
-% \HL
-% \VL direction \VL \showbaselines \dorecurse{3}{direction }\VL \FR
-% \VL direction \VL \showbaselines \dorecurse{8}{direction }\VL \LR
-% \HL
-% \stoptable
-% \vskip2cm
-% \starttable[ | l w(2cm) | p(8cm) | ]
-% \HL
-% \VL direction \VL \showbaselines \dorecurse{8}{direction }\VL \FR
-% \VL direction \VL \showbaselines \dorecurse{8}{direction }\VL \LR
-% \HL
-% \stoptable
+\def\dosettableaction#1{\ifconditional\tableactionstatepermitted\global\tableactionstate#1\fi}
+\def\dosettableforce #1{\ifconditional\tableactionstatepermitted\global\tableforcestate #1\fi}
%D To give an impression of what the (well documented) source
%D of \TABLE\ looks like, we first implement an alternative for
@@ -624,326 +1309,10 @@
%D of the numeric ones. To permit double loading of this
%D module, we check for the existence of one of the macros.
-\letvalue{!tk<\string q>}=\undefined
-\letvalue{!tk<\string Q>}=\undefined
-
-%D We just copy the original {\em comments}.
-%D
-%D \em Key \type{q}: quantity item, non||math mode.
-
-\NewFormatKey q%
- {\letempty\!tqStyle
- \futurelet\!tnext\!tqTestForBracket}
-
-%D \em Key \type{Q}: quantity item, math mode.
-
-\NewFormatKey Q%
- {\def\!tqStyle{$}%
- \futurelet\!tnext\!tqTestForBracket}
-
-%D \em Note: the space between a quantity entry and the
-%D following \type{|}, \type{"}, or \type{\|} is mandatory.
-%D empty quantity entries are not allowed: use \type{{}} or
-%D \type{\omit} instead.
-%D
-%D \em Test for bracket: invoked by the keys \type{q} and
-%D \type{Q}.
-
-\def\!tqTestForBracket
- {\ifx[\!tnext
- \!thx\!tqGetArgument
- \else
- \!thx\!tqGetCode
- \fi}
-
-%D \em Get code: e.g. \type{4}, or \type{4,0}, \type{0,4}, or
-%D \type{10,2}.
-
-\def\!tqGetCode#1 % note the blank
- {\!tqConvertCode #1,,!}
-
-%D \em Convert code: e.g. converts above to \type{[0000]},
-%D \type{[0000,]}, \type{[,0000]}, \type{[0000000000,00]}.
-
-\def\!tqConvertCode #1,#2,#3!%
- {\begingroup
- \aftergroup\edef
- \aftergroup\!ttemp
- \aftergroup{%
- \aftergroup[%
- \!taCountA #1
- \!thLoop
- \ifnum \!taCountA>\zerocount
- \advance\!taCountA \minusone
- \aftergroup0
- \repeat
- \def\!ttemp{#3}%
- \ifx\!ttemp\empty
- \else
- \aftergroup,
- \!taCountA #2
- \!thLoop
- \ifnum\!taCountA>\zerocount
- \advance\!taCountA \minusone
- \aftergroup0
- \repeat
- \fi
- \aftergroup]\aftergroup}%
- \endgroup\relax
- \!thx\!tqGetArgument\!ttemp}
-
-%D \em Get argument:
-%D
-%D \starttyping
-%D <sample left field> <optional, sample right field>
-%D \stoptyping
-
-\def\!tqGetArgument[#1]%
- {\!tqMakeQuantityTemplate\!tqStyle#1,,!}
-
-%D \em Make quantity template.
-
-\def\!tqMakeQuantityTemplate#1#2,#3,#4!% #1=<empty> or $
- {\def\!ttemp{#4}%
- \ifx\!ttemp\empty
- \!taDimenC\zeropoint
- \else
- \setbox0\hbox{\mathsurround\zeropoint #1,#3#1}%
- \!taDimenC\wd0
- \fi
- \setbox0\hbox{\mathsurround\zeropoint #1#2#1}%
- \!thToksEdef\!taDataColumnTemplate
- ={\noexpand\!tqSetQuantityItem{\the\wd0 }{\the\!taDimenC}{#1}%
- \the\!taDataColumnTemplate}%
- \ReadFormatKeys}
-
-%D \em Set numeric item.
-
-\def\!tqSetQuantityItem #1#2#3#4 %
- {\!tqSetQuantityItemA{#1}{#2}{#3}#4,,!}
-
-\def\!tqSetQuantityItemA #1#2#3#4,#5,#6!%
- {\def\!ttemp{#6}%
- \hbox to #1{\hss\mathsurround\zeropoint#3#4#3}%
- \hbox to #2{\ifx\!ttemp\empty\else\mathsurround\zeropoint#3,#5#3\fi\hss}}
-
-%D Here ends the Q||extension. Did you watch the clever use
-%D of aftergroup in \type{\!tqConvertCode}.
-
-% %D We also (have to) define a key for \type{\cap}:
-%
-% \letvalue{!tk<\string K>}=\undefined
-%
-% \NewFormatKey K%
-% {\ReadFormatKeys b\smallcapped}
-
-%D A few pages back we saw backgrounds, further on we will see
-%D colored rules, and here we provide a means to color the
-%D entries in a column. (We can of course always use the normal
-%D color commands for individual entries.) We could not use the
-%D lowercase~\type{c}, because that one is used to force {\em
-%D centering}.
-%D
-%D \startbuffer
-%D \starttable[|C{red}|C{green}|C{blue}|]
-%D \VL R(ed) \VL G(reen) \VL B(lue) \VL\SR
-%D \stoptable
-%D \stopbuffer
-%D
-%D \ShowExample
-
-\letvalue{!tk<\string C>}=\undefined
-
-\NewFormatKey C#1%
- {\ReadFormatKeys b{\startcolor[#1]} a{\stopcolor}}
-
-%D So now we have three new keys:
-%D
-%D \starttable[|||]
-%D \HL
-%D \NC \bf key \NC \bf meaning \NC\AR
-%D \HL
-%D \NC Q[x,y] \NC math mode formatted numbers \NC\AR
-%D \NC q[x,y] \NC text mode formatted numbers \NC\AR
-%D \NC C{identifier} \NC column entry color \NC\AR
-%D \HL
-%D \stoptable
-
%D To be compatible with the tabulate environment, we also
%D support the \type {l}, \type {c} and \type {r} keys for
%D paragraph entries.
-\letvalue{!tk<\string l>}=\undefined
-\letvalue{!tk<\string c>}=\undefined
-\letvalue{!tk<\string r>}=\undefined
-\letvalue{!tk<\string x>}=\undefined % not that needed
-
-\NewFormatKey c%
- {\prependtoks\raggedcenter\to\!taDataColumnTemplate
- \ReadFormatKeys \LeftGlue\hfil \RightGlue\hfil}
-
-\NewFormatKey l%
- {\prependtoks\raggedright\to\!taDataColumnTemplate
- \ReadFormatKeys \LeftGlue\empty \RightGlue\hfil}
-
-\NewFormatKey r%
- {\prependtoks\raggedleft\to\!taDataColumnTemplate
- \ReadFormatKeys \LeftGlue\hfil \RightGlue\empty}
-
-\NewFormatKey x%
- {\prependtoks\notragged\to\!taDataColumnTemplate
- \ReadFormatKeys \LeftGlue\hfil \RightGlue\empty}
-
-\appendtoks \TABLEparalignment \to \EveryTableParBox
-
-\def\!tfReFormat#1%
- {\the \!taLeftGlue
- \vbox{\forgetall\ialign{\span\the\!taDataColumnTemplate\cr#1\cr}}%
- \the \!taRightGlue
- \kern\zeropoint} % prevents \unskip / really needed
-
-%D Later on, we're going to implement multiple page table
-%D support, therefore the next \TABLE\ macro needs to be
-%D slightly adapted, i.c. the penalty is removed. We also
-%D add basic color support.
-
-\def\!ttFullHruleA
- {\!ttGetHalfRuleThickness
- \startglobalTABLEcolor % added
- \hrule\!thHeight\dimen0\!thDepth\dimen0
- \stopglobalTABLEcolor % added
- %\penalty0 % removed
- \egroup}
-
-%D We'll see that when we want to give a vertical rule a color,
-%D we have to set and reset states. After heavy testing it
-%D proved most useful to extend a \TABLE\ primitive with some
-%D hooks. One thing to keep in mind is that \type{&} keeps
-%D assignments local. Again, we add basic color support.
-
-\let\TABLEbeforebar\empty
-\let\TABLEafterbar \empty
-
-\def\@VLn{1}
-\def\@VLd{.125em}
-
-\def\do!ttInsertVrule % will be merged in 2005
- {\vrule \!thWidth
- \ifnum\!tgCode=\plusone
- \ifx\!tgValue\empty
- \LineThicknessFactor
- \else
- \!tgValue
- \fi
- \LineThicknessUnit
- \else
- \!tgValue
- \fi
- \hskip\@VLd}
-
-\def\!ttInsertVrule
- {\hfil
- \TABLEbeforebar % added
- \startglobalTABLEcolor % added
- % we could do without this speedup, some day merge 'm
- \ifcase\@VLn\or
- \do!ttInsertVrule
- \unskip
- \else
- \dorecurse\@VLn\do!ttInsertVrule
- \gdef\@VLn{1}%
- \unskip
- \fi
- \stopglobalTABLEcolor % added
- \TABLEafterbar % added
- \hfil
- &}
-
-%D The next two macros are only adapted to basis rule
-%D color support.
-
-\def\!tfSetVrule
- {\!thToksEdef\!taRuleColumnTemplate=
- {\noexpand\hfil
- \noexpand\startglobalTABLEcolor % added
- \noexpand\vrule
- \noexpand\!thWidth
- \ifnum\!tgCode=\plusone
- \ifx\!tgValue\empty
- \the\LineThicknessFactor
- \else
- \!tgValue
- \fi
- \!taLTU
- \else
- \!tgValue
- \fi
- ####%
- \noexpand\hfil
- \noexpand\stopglobalTABLEcolor % added
- \the\!taRuleColumnTemplate}%
- \!tfAdjoinPriorColumn}
-
-\def\!ttShortHruleA
- {\!ttGetHalfRuleThickness
- \startglobalTABLEcolor % added
- \leaders\hrule\!thHeight\dimen0\!thDepth\dimen0\hfill
- \stopglobalTABLEcolor % added
- \null
- \ignorespaces}
-
-%D We already showed the next one, but here we slightly adapt
-%D the macro by adding an \type{\expandafter}. The space after
-%D \type{#1} is crucial!
-
-\def\normalTABLEcomplexbar#1%
- {\unskip\!ttRightGlue&\omit\expandafter\!ttAlternateVrule#1 }
-
-%D To get rid of interfering \type{\omit}'s when we are
-%D checking the number of columns and reporting problems. The
-%D extensions concern the second level check, the first
-%D subbranch and advancing the column.
-
-\ifx\mscount\undefined \newcount\mscount \fi
-
-\def\!ttuse#1%
- {\ifnum#1>\plusone
- \omit
- \global\TABLEdivisionfalse
- \scratchcounter\currentTABLEcolumn % added
- \advance\scratchcounter #1% % added
- \advance\scratchcounter \minusone % added
- \ifnum\scratchcounter>\maxTABLEcolumn % added
- \def\next % added
- {\setTABLEerror\TABLEspanoverflow % added
- \handleTABLEerror}% % added
- \else % added
- \def\next % added
- {\global\advance\currentTABLEcolumn #1% % added
- \global\advance\currentTABLEcolumn \minusone % added
- \mscount#1% \mscount is in Plain
- \advance\mscount \minusone
- \advance\mscount \mscount
- \!thLoop
- \ifnum\mscount>\plusone
- \spanomit \advance\mscount\minusone
- \repeat
- \span}%
- \fi % added
- \else % added
- \def\next % conflicts with possible next \omit % added
- {\global\advance\currentTABLEcolumn \plusone}% % added
- \fi
- \next} % added
-
-% \starttable[|c|c|c|c|]
-% \HL
-% \VL {test} \VL \TWO{} \VL test \VL\FR
-% \DL \DC \DL\DR
-% \VL {test} \VL \TWO{} \VL test \VL\LR
-% \HL
-% \stoptable
-
%D All commands that are executed between rows are to be put in
%D \type {\noalign}. We can however not verify if we (that is
%D \TABLE) does or did not enter this mode. A moderate dirty
@@ -952,9 +1321,18 @@
%D such hacks become a second nature. However, redefining \type
%D {\omit} and \type{\span} is not that easy.}
-\def\TABLEnoalign
- {\noalign\bgroup\let\noalign\relax\let\next=}
-
+\def\tablenoalign
+ {\noalign
+ \bgroup
+ \let\noalign\relax
+ \let\tablenoalign\relax
+ \let\next=}
+
+\def\starttablenoalign
+ {\tablenoalign\bgroup}
+
+\let\stoptablenoalign\egroup
+
%D \macros
%D {starttable}
%D
@@ -980,8 +1358,15 @@
\newconditional\tablerepeathead
\newconditional\tablerepeattail
+
\unexpanded\def\starttable
{\bgroup
+ \dodoubleempty\dostarttable}
+
+\unexpanded\def\dostarttable[#1][#2]% preamble optional-settings
+ {\ifsecondargument
+ \getparameters[\??ti][#2]%
+ \fi
\let\stoptable\dostoptable
\doif\@@tisplit\v!auto
{\ifinsidesplitfloat\let\@@tisplit\v!yes\fi}%
@@ -992,7 +1377,8 @@
{\ifinsidefloat\else\startbaselinecorrection\fi}
{\startframedcontent[\@@tiframe]}%
\postponenotes
- \firststagestartTABLE}}
+ \firststagestarttable}%
+ [#1]}
% We cannot define \unexpanded\def\dostoptable a ssomehow lookahead
% in alignments fail then, so we relax it and define it locally.
@@ -1000,11 +1386,13 @@
\let\stoptabel\relax
\def\dostoptable
- {\chuckTABLEautorow % before the tail, else noalign problem
- \insertTABLEtail
- \TABLEnoalign{\globalletempty\@@TABLEhead}%
- \TABLEnoalign{\globalletempty\@@TABLEtail}%
- \finishTABLE
+ {\dochucktableautorow % before the tail, else noalign problem
+ \doinserttabletail
+ \starttablenoalign
+ \globalletempty\dotablehead
+ \globalletempty\dotabletail
+ \stoptablenoalign
+ \dofinishtable
\doifelsenothing\@@tiframe
{\ifinsidefloat\else
\stopbaselinecorrection
@@ -1016,15 +1404,10 @@
%D Before we can grab the argument, we have to make sure that
%D the \CATCODES\ are set. The first stage takes care of that.
-\def\firststagestartTABLE
- {\bgroup % kan-ie weg?
+\def\firststagestarttable%
+ {\bgroup
\global\intabletrue
- \pushouterbarandquote
- %catcode`\|=\@@other
- \complexorsimple\secondstagestartTABLE}
-
-\def\simplesecondstagestartTABLE#1%
- {\complexsecondstagestartTABLE[{#1}]}
+ \secondstagestarttable}
%D \macros
%D {definetabletemplate}
@@ -1047,19 +1430,19 @@
\unexpanded\def\definetabletemplate % to be redone
{\bgroup
- \catcode`\|=\@@other
+ \catcode\barasciicode\othercatcode
\doquadrupleempty\dodefinetabletemplate}
\def\dodefinetabletemplate[#1][#2][#3][#4]%
{\ifsecondargument
- \setgvalue{\c!Table#1}{\douseTABLEtemplate{#2}{#3}{#4}}%
+ \setgvalue{\s!TaBlE#1}{\dousetabletemplate{#2}{#3}{#4}}%
\fi
\egroup}
-\def\douseTABLEtemplate#1#2#3%
- {\gdef\TABLEhead{\getvalue{@@TABLEhead#2}}%
- \gdef\TABLEtail{\getvalue{@@TABLEtail#3}}%
- \complexsecondstagestartTABLE[#1]}
+\def\dousetabletemplate#1#2#3%
+ {\gdef\dotablehead{\getvalue{@@tablehead#2}}%
+ \gdef\dotabletail{\getvalue{@@tabletail#3}}%
+ \secondstagestarttable[#1]}
%D The optional third and fourth arguments define which table
%D head and tail to use.
@@ -1085,69 +1468,70 @@
%D The second half of the next macro prepares table
%D splitting.
-\def\insertTABLEhead
- {\TABLEnoalign{\global\settrue \preventTABLEbreak \global\setfalse\someTABLEhead}%
- \TABLEhead
- \TABLEnoalign{\global\setfalse\preventTABLEbreak}}
-
-\def\insertTABLEtail
- {\TABLEnoalign{\global\settrue \preventTABLEbreak \global\setfalse\someTABLEtail}%
- \TABLEtail
- \TABLEnoalign{\global\setfalse\preventTABLEbreak}}
-
-% \def\dorestartTABLE#1%
-% {\gdef\restartTABLE{#1}%
-% \restartTABLE
-% \insertTABLEhead
-% \ifsplittables \ifconditional \tablerepeattail
-% \TABLEnoalign{\goodbreak}%
-% \insertTABLEtail
-% \TABLEnoalign{\goodbreak}%
-% \fi \fi}
-
-\def\verysimpleTableHL
- {\TABLEnoalign{\expandafter\normalTABLEfullrule\@@tiHLheight}}
-
-\def\dorestartTABLE#1%
- {\gdef\restartTABLE{#1}%
- \restartTABLE
- \TABLEnoalign{\globalpushmacro\simpleTableHL\global\let\simpleTableHL\verysimpleTableHL}%
- \insertTABLEhead
+\def\doinserttablehead
+ {\starttablenoalign
+ \global\settrue\preventtablebreak
+ \global\setfalse\hassometablehead
+ \stoptablenoalign
+ \dotablehead
+ \starttablenoalign
+ \global\setfalse\preventtablebreak
+ \stoptablenoalign}
+
+\def\doinserttabletail
+ {\starttablenoalign
+ \global\settrue\preventtablebreak
+ \global\setfalse\hassometabletail
+ \stoptablenoalign
+ \dotabletail
+ \starttablenoalign
+ \global\setfalse\preventtablebreak
+ \stoptablenoalign}
+
+% \def\doverysimpletableHL % todo
+% {\starttablenoalign
+% \expandafter\donormaltablefullrule\@@tiHLheight
+% \stoptablenoalign}
+
+\def\dorestarttable#1%
+ {\gdef\restarttable{#1}%
+ \restarttable
+% \starttablenoalign
+% \globalpushmacro\simpletableHL
+% \global\let\simpletableHL\doverysimpletableHL
+% \stoptablenoalign
+ \doinserttablehead
\ifsplittables \ifconditional \tablerepeattail
- \TABLEnoalign{\goodbreak}%
- \insertTABLEtail
- \TABLEnoalign{\goodbreak}%
+ \tablenoalign{\goodbreak}%
+ \doinserttabletail
+ \tablenoalign{\goodbreak}%
\fi \fi
- \TABLEnoalign{\globalpopmacro\simpleTableHL}}
+% \starttablenoalign
+% \globalpopmacro\simpletableHL
+% \stoptablenoalign
+ }
-\bgroup \catcode`|=\@@other \catcode`"=\@@other
+\bgroup \catcode\barasciicode\othercatcode
-\gdef\complexsecondstagestartTABLE#1[#2]% brr nested mess
+\gdef\secondstagestarttable[#1]% brr nested mess
{\bgroup
\@@useotherbar
- \@@useotherquote
- \global\setfalse\someTABLEhead
- \global\setfalse\someTABLEtail
- \expanded{\doifinstringelse{|}{#2}}
- {\xdef\restartTABLE{\noexpand\dorestartTABLE{\noexpand\thirdstagestartTABLE{#2}}}}
- {\doifdefinedelse{\c!Table#2}
- {\gdef\restartTABLE{\getvalue{\c!Table#2}}}
- {\gdef\restartTABLE{\dorestartTABLE{\getvalue{#2}}}}}%
+ \global\setfalse\tableactionstatepermitted
+ \global\setfalse\hassometablehead
+ \global\setfalse\hassometabletail
+ \expanded{\doifinstringelse{|}{#1}}
+ {\xdef\restarttable{\noexpand\dorestarttable{\noexpand\thirdstagestarttable{#1}}}}
+ {\doifdefinedelse{\s!TaBlE#1}
+ {\gdef\restarttable{\getvalue{\s!TaBlE#1}}}
+ {\gdef\restarttable{\dorestartable{\getvalue{#1}}}}}%
\egroup
- \restartTABLE}
+ \restarttable}
\egroup
%D The third stage involves a lot of (re)sets, which we will
%D explain later.
-%D The next definition is convenient and more in tune with
-%D \CONTEXT.
-
-\let \everytable \EveryTable
-
-%D We immediately use this register:
-
\appendtoks
\fixedspaces
\let\_\normalunderscore
@@ -1155,39 +1539,27 @@
%D Now we can start the table.
-\def\thirdstagestartTABLE#1%
- {\global\setTABLEactiontrue
- \setTABLEaction\TABLEunknown
- \setTABLEforce\TABLEunknown
- \setTABLEerror\TABLEunknown
- \global\TABLEgraylinefalse
- \global\TABLEgraydonefalse
- \globalletempty\TABLEgrayline
- \globalletempty\nextTABLEgrayline
- \globalletempty\TABLEgraylineerror
- \globalletempty\TABLEgraylinestatus
- \resetVLvalues
- \appendtoks\popouterbarandquote\to\EveryTable
- \appendtoks\localTABLEsetup\to\EveryTable
- \BeginTable[\ifsplittables u\else b\fi]%
- \defineTABLEunits
- \defineTABLEsteps
- \defineTABLErules
- \defineTABLEdivisions
- \defineTABLEshorthands
- \defineTABLEbackgrounds
- \defineTABLEendings
+\newtoks \localtabledefinitions
+
+\def\thirdstagestarttable#1%
+ {\global\settrue\tableactionstatepermitted
+ \dosettableaction\tableunknownstate
+ \dosettableforce\tableunknownstate
+ \dotableresetVLvalues
+ \appendtoks\dolocaltablesetup\to\everytable
+ \dotablestandardbegin[\ifsplittables u\else b\fi]%
+ \the\localtabledefinitions
\forgetall % added
- \doifsomething{#1}
- {\def\TABLEformat{#1}%
- \getTABLEnofcolumns\TABLEformat
+ \edef\currenttableformat{#1}%
+ \doifsomething\currenttableformat
+ {\dogettablenofcolumns\currenttableformat
% more modern is to use catcode tables
- \expandafter\BeginFormat\TABLEformat\EndFormat}}
+ \expandafter\dobegintableformat\currenttableformat\doendtableformat}}
-\def\finishTABLE
- {\chuckTABLEautorow
+\def\dofinishtable
+ {\dochucktableautorow
\unskip\crcr
- \EndTable
+ \dotablenormalend
\global\intablefalse
\egroup}
@@ -1224,33 +1596,30 @@
\flushnotes
\setbox\tablecontentbox\vbox\bgroup
\forgetall
- \global\TABLEinbreakfalse
- \firststagestartTABLE}
+ \firststagestarttable}
\let\stoptables\relax % needed for \noalign
\def\dostoptables
- {\chuckTABLEautorow % AM: before the tail, else noalign problem
- \ifconditional\tablerepeattail\else\insertTABLEtail\fi
- \finishTABLE
+ {\dochucktableautorow % AM: before the tail, else noalign problem
+ \ifconditional\tablerepeattail\else\doinserttabletail\fi
+ \dofinishtable
\egroup
\dontcomplain
\dosplittablebox\tablecontentbox
\flushnotes
\egroup}
-\newdimen\TABLEcaptionheight % obsolete
-
\def\dosplittablebox#1%
{\resettsplit
\def\tsplitminimumfreelines{2}%
- \def\tsplitminimumfreespace{\TABLEcaptionheight}%
+ \def\tsplitminimumfreespace{\zeropoint}%
\setbox\tsplitcontent\box#1%
- \ifconditional\tablerepeathead \ifconditional\someTABLEhead
+ \ifconditional\tablerepeathead \ifconditional\hassometablehead
\setbox\tsplithead\vsplit\tsplitcontent to \lineheight
\setbox\tsplithead\vbox{\unvbox\tsplithead}%
\fi \fi
- \ifconditional\tablerepeattail \ifconditional\someTABLEtail
+ \ifconditional\tablerepeattail \ifconditional\hassometabletail
\setbox\tsplittail\vsplit\tsplitcontent to \lineheight
\setbox\tsplittail\vbox{\unvbox\tsplittail}%
\fi \fi
@@ -1265,15 +1634,15 @@
%D something like:
%D
%D \starttyping
-%D \starttablekop
+%D \starttablehead
%D \HL
%D \VL element \VL atom weight \VL\AR
%D \HL
-%D \stoptablekop
+%D \stoptablehead
%D
-%D \starttablestaart
+%D \starttabletail
%D \HL
-%D \stoptablestaart
+%D \stoptabletail
%D
%D \starttables[|||]
%D \VL ....... \VL ........... \VL\AR
@@ -1288,113 +1657,52 @@
%D the fact that the stopcondition is interface language
%D dependant.
-\let\@@TABLEhead\empty \def\TABLEhead{\@@TABLEhead}
-\let\@@TABLEtail\empty \def\TABLEtail{\@@TABLEtail}
+\let\dotablehead\empty % needs checking
+\let\dotabletail\empty % needs checking
-\letvalue{\e!start\v!tablehead}=\undefined
-\letvalue{\e!stop \v!tablehead}=\undefined
-\letvalue{\e!start\v!tabletail}=\undefined
-\letvalue{\e!stop \v!tabletail}=\undefined
+\letbeundefined{\e!start\v!tablehead}
+\letbeundefined{\e!stop \v!tablehead}
+\letbeundefined{\e!start\v!tabletail}
+\letbeundefined{\e!stop \v!tabletail}
\expanded
{\long\def\csname\e!start\v!tablehead\endcsname##1\csname\e!stop\v!tablehead\endcsname%
- {\noexpand\setTABLEhead##1\noexpand\end}}
+ {\noexpand\settablehead##1\noexpand\end}}
\expanded
{\long\def\csname\e!start\v!tabletail\endcsname##1\csname\e!stop\v!tabletail\endcsname%
- {\noexpand\setTABLEtail##1\noexpand\end}}
+ {\noexpand\settabletail##1\noexpand\end}}
%D The second argument is a dummy one, by scanning for it, we
%D get rid of interfering spaces.
-\def\setTABLEhead{\dodoubleempty\dosetTABLEhead}
-\def\setTABLEtail{\dodoubleempty\dosetTABLEtail}
+\newconditional\preventtablebreak
+\newconditional\hassometablehead
+\newconditional\hassometabletail
-\newconditional\preventTABLEbreak
-\newconditional\someTABLEhead
+\def\settablehead{\dodoubleempty\dosettablehead}
+\def\settabletail{\dodoubleempty\dosettabletail}
-\long\def\dosetTABLEhead[#1][#2]#3\end{\setvalue{@@TABLEhead#1}{\TABLEnoalign{\global\settrue\someTABLEhead}#3}}
-\long\def\dosetTABLEtail[#1][#2]#3\end{\setvalue{@@TABLEtail#1}{\TABLEnoalign{\global\settrue\someTABLEtail}#3}}
+\long\def\dosettablehead[#1][#2]#3\end{\setvalue{@@tablehead#1}{\tablenoalign{\global\settrue\hassometablehead}#3}}
+\long\def\dosettabletail[#1][#2]#3\end{\setvalue{@@tabletail#1}{\tablenoalign{\global\settrue\hassometabletail}#3}}
%D Redudant \type{\HL}'s are removed automatically, so
%D mid||lines can be used without problems.
-%D We need an alternative for the normal complex or simple
-%D commands, because assignments in these system commands
-%D conflict with \type{\noalign}. This alternative is about
-%D as efficient as possible.
-
-\def\complexorsimpleTable#1#2%
- {\csname\if[\noexpand#2\s!complex\else\s!simple\fi\c!Table#1\endcsname#2}
-
-%D The next one is used in \type{\VL} cum suis and honours
-%D the next grouping.
-
-\def\docomplexorsimpleTable#1#2%
- {\ifx\next\bgroup\@EA#2\else\@EA\dodocomplexorsimpleTable\@EA#1\@EA#2\fi}
-
-\def\dodocomplexorsimpleTable#1#2#3%
- {\if[\noexpand#3\@EA#1\else\@EA#2\fi#3}
-
%D The order of the next macros is more or less random. First
%D we implement error recovery. Errors are reported to the
%D screen and log file as well as visualized in the table in
%D teletype.
-\def\handleTABLEerror
- {\ifTABLEgrayline \else
- \ifnum\TABLEerror=\TABLEunknown \else
- \setTABLEaction\TABLEunknown
- \globalletempty\checkTABLEautorow
- \globalletempty\chuckTABLEautorow
- \fi
- \ifcase\TABLEerror
- % no error
- \or
- % \TABLEmissingrow
- \tttf [missing row]%
- \writestatus\m!TABLE{missing row}%
- \SR
- \or
- % \TABLEmissingcolumn
- \fillTABLEcolumns
- \tttf [missing column]%
- \writestatus\m!TABLE{missing column}%
- \SR
- \or
- % \TABLEspanoverflow
- \fillTABLEcolumns
- \tttf [columnspan too large]%
- \writestatus\m!TABLE{columnspan too large}%
- \SR
- \or
- % \TABLEdivisionoverflow
- \fillTABLEcolumns
- \tttf [division line too long]%
- \writestatus\m!TABLE{division line too long}%
- \SR
- \fi
- \fi
- \ifnum\TABLEerror=\TABLEunknown \else
- \finishTABLErow
- \fi}
-
-\def\finishTABLErow
+\def\dofinishtablerow
{\crcr
- \TABLEnoalign
- {\nobreak
- \setTABLEaction\TABLEunknown
- \setTABLEerror\TABLEunknown
- \globalletempty\checkTABLEautorow
- \globalletempty\chuckTABLEautorow
- \global\currentTABLEcolumn\zerocount}}
-
-\def\fillTABLEcolumns
- {\ifnum\currentTABLEcolumn>\maxTABLEcolumn \else
- \global\advance\currentTABLEcolumn \plusone
- \normalTABLEquote
- \expandafter\fillTABLEcolumns
- \fi}
+ \starttablenoalign
+ \nobreak
+ \dosettableaction\tableunknownstate
+ \globalletempty\dochecktableautorow
+ \globalletempty\dochucktableautorow
+ \global\currenttablecolumn\zerocount
+ \stoptablenoalign}
%D Next we enter the more complicated area of column and row
%D switching. I won't go into much detail from now on, but just
@@ -1439,72 +1747,47 @@
%D handles alignments, we cannot automate spacing for colored
%D rows and columns.
-\chardef\TABLErowzero=0
-
-\def\checkTABLErow#1% pure for message purposes
- {\unskip % added
- \ifTABLEgraydone
- \defconvertedargument\asciia{#1}%
- \defconvertedcommand \asciib\TABLEendBCL
- \ifx\asciia\asciib \else
- \writestatus\m!TABLE{confusing \asciia\space and \asciib}%
- \gdef\TABLEgraylineerror%
- {\globalletempty\TABLEgraylineerror
- [\asciia\unskip<->\asciib\unskip]}%
- \fi
- \global\TABLEgraydonefalse
- \fi}
+\setnewconstant\tablerowzero\zerocount
-\unexpanded\def\defineTABLEendings
- {\let\SR\TableSR
- \let\FR\TableFR
- \let\MR\TableMR
- \let\LR\TableLR
- \let\AR\TableAR}
-
-\def\TableSR
- {\ifTABLEgrayline \else
- \ifnum\TABLEaction=\TABLEfirstrow
- \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}%
- \else\ifnum\TABLEaction=\TABLEmidrow
- \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}%
- \else\ifnum\TABLEaction=\TABLEmidrow
- \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}%
- \fi\fi\fi
- \fi
- \checkTABLErow\SR
- \endTABLErow\TABLEseparaterow\TABLErowfactor\TABLErowfactor}
-
-\def\TableFR
- {\ifTABLEgrayline \else
- \ifnum\TABLEaction=\TABLEmidrow
- \writestatus\m!TABLE{change \string\FR\space into \string\MR/\string\LR}%
- \else\ifnum\TABLEaction=\TABLElastrow
- \writestatus\m!TABLE{change \string\FR\space into \string\MR/\string\LR}%
- \fi\fi
- \fi
- \checkTABLErow\FR
- \endTABLErow\TABLEfirstrow\TABLErowfactor\TABLErowzero}
-
-\def\TableMR
- {\ifTABLEgrayline \else
- \ifnum\TABLEaction=\TABLErule
- \writestatus\m!TABLE{change \string\MR\space into \string\FR/\string\SR}%
- \else\ifnum\TABLEaction=\TABLElastrow
- \writestatus\m!TABLE{change \string\MR\space into \string\FR}%
- \fi\fi
- \fi
- \checkTABLErow\MR
- \endTABLErow\TABLEmidrow00}
+\appendtoks
+ \let\SR\dotableSR
+ \let\FR\dotableFR
+ \let\MR\dotableMR
+ \let\LR\dotableLR
+ \let\AR\dotableAR
+\to \localtabledefinitions
+
+\unexpanded\def\dotableSR
+ {\ifnum\tableactionstate=\tablefirstrowstate
+ \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}%
+ \else\ifnum\tableactionstate=\tablemidrowstate
+ \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}%
+ \else\ifnum\tableactionstate=\tablemidrowstate
+ \writestatus\m!TABLE{change \string\SR\space into \string\MR/\string\LR}%
+ \fi\fi\fi
+ \doendtablerow\tableseparaterowstate\tablerowfactor\tablerowfactor}
+
+\unexpanded\def\dotableFR
+ {\ifnum\tableactionstate=\tablemidrowstate
+ \writestatus\m!TABLE{change \string\FR\space into \string\MR/\string\LR}%
+ \else\ifnum\tableactionstate=\tablelastrowstate
+ \writestatus\m!TABLE{change \string\FR\space into \string\MR/\string\LR}%
+ \fi\fi
+ \doendtablerow\tablefirstrowstate\tablerowfactor\tablerowzero}
-\def\TableLR
- {\ifTABLEgrayline \else
- \ifnum\TABLEaction=\TABLErule
- \writestatus\m!TABLE{change \string\LR\space into \string\FR/\string\SR}%
- \fi
+\unexpanded\def\dotableMR
+ {\ifnum\tableactionstate=\tablerulestate
+ \writestatus\m!TABLE{change \string\MR\space into \string\FR/\string\SR}%
+ \else\ifnum\tableactionstate=\tablelastrowstate
+ \writestatus\m!TABLE{change \string\MR\space into \string\FR}%
+ \fi\fi
+ \doendtablerow\tablemidrowstate00}
+
+\unexpanded\def\dotableLR
+ {\ifnum\tableactionstate=\tablerulestate
+ \writestatus\m!TABLE{change \string\LR\space into \string\FR/\string\SR}%
\fi
- \checkTABLErow\LR
- \endTABLErow\TABLElastrow\TABLErowzero\TABLErowfactor}
+ \doendtablerow\tablelastrowstate\tablerowzero\tablerowfactor}
%D \macros
%D {ifcheckTABLEcolums}
@@ -1517,122 +1800,69 @@
%D determine the available space are shown (in color). By default
%D checking is off.
-\newif\ifcheckTABLEcolumns
-
-\let\beforeTABLEline\empty
-\let\afterTABLEline \empty
-
-\def\doendTABLErow#1#2#3%
- {\handleTABLEbreak#2#3%
- \beforeTABLEline
+\def\doendtablerow#1#2#3%
+ {\dosettableaction#1%
\ifcase#1\relax
% unknown
\or
- \endofTABLEline[blue][\SR->\SR]\TABLErowfactor\TABLErowfactor
- \or
- \endofTABLEline[red][\FR->\FR]\TABLErowfactor\TABLErowzero
+ \doendoftableline\SR\SR\tablerowfactor\tablerowfactor
\or
- \ifnum\TABLEforce=\TABLEforcelastrow
- \endofTABLEline[red][\MR->\LR]\TABLErowzero\TABLErowfactor
- \else\ifnum\TABLEforce=\TABLEforcefirstrow
- \endofTABLEline[red][\MR->\FR]\TABLErowfactor\TABLErowzero
- \else
- \endofTABLEline[green][\MR->\MR]\TABLErowzero\TABLErowzero
- \fi\fi
- \or
- \endofTABLEline[red][\LR->\LR]\TABLErowzero\TABLErowfactor
- \fi
- \TABLEnoalign
- {\setTABLEforce\TABLEunknown
- \global\currentTABLEcolumn\zerocount}%
- \afterTABLEline}
-
-\def\endTABLErow#1#2#3%
- {\setTABLEaction#1%
- \ifTABLEgrayline
- \finishTABLErow
+ \doendoftableline\FR\FR\tablerowfactor\tablerowzero
+ \or\ifnum\tableforcestate=\tableforcelastrowstate
+ \doendoftableline\MR\LR\tablerowzero\tablerowfactor
+ \else\ifnum\tableforcestate=\tableforcefirstrowstate
+ \doendoftableline\MR\FR\tablerowfactor\tablerowzero
\else
- \ifnum\currentTABLEcolumn>\maxTABLEcolumn
- \doendTABLErow{#1}{#2}{#3}%
- \else\ifcheckTABLEcolumns
- \setTABLEerror\TABLEmissingcolumn
- \handleTABLEerror
+ \doendoftableline\MR\MR\tablerowzero\tablerowzero
+ \fi\fi\or
+ \doendoftableline\LR\LR\tablerowzero\tablerowfactor
+ \fi
+ \starttablenoalign
+ \dosettableforce\tableunknownstate
+ \global\currenttablecolumn\zerocount
+ \ifconditional\preventtablebreak
+ \nobreak
\else
- \doendTABLErow{#1}{#2}{#3}%
- \fi\fi
- \fi}
+ \goodbreak
+ \fi
+ \stoptablenoalign}
%D Handling \type{\AR} is postponed till the next row. The
%D check takes care of the first and mid rows, the chuck macro
%D |<|how about that name|>| handles the last row.
-\def\TableAR
- {\ifTABLEgraydone
- \globalletempty\checkTABLEautorow
- \globalletempty\chuckTABLEautorow
- \global\TABLEgraydonefalse
- \TABLEendBCL
- \else
- \globallet\checkTABLEautorow\docheckTABLEautorow
- \globallet\chuckTABLEautorow\dochuckTABLEautorow
- \fi}
+\unexpanded\def\dotableAR
+ {\globallet\dochecktableautorow\dodochecktableautorow
+ \globallet\dochucktableautorow\dodochucktableautorow}
-\let\checkTABLEautorow\empty
-\let\chuckTABLEautorow\empty
+\let\dochecktableautorow\empty
+\let\dochucktableautorow\empty
-\def\docheckTABLEautorow
- {\globallet\checkTABLEautorow\empty
- \ifnum\TABLEaction=\TABLErule \FR
- \else\ifnum\TABLEaction=\TABLEunknown \FR
- \else \MR
- \fi\fi}
+\def\dodochecktableautorow
+ {\globallet\dochecktableautorow\empty
+ \ifnum\tableactionstate=\tablerulestate \FR\else
+ \ifnum\tableactionstate=\tableunknownstate\FR\else
+ \MR\fi\fi}
+
+\def\dodochucktableautorow
+ {\globalletempty\dochecktableautorow
+ \globalletempty\dochucktableautorow
+ \ifnum\tableactionstate=\tablerulestate \SR\else
+ \ifnum\tableactionstate=\tableunknownstate\SR\else
+ \LR\fi\fi}
-\def\dochuckTABLEautorow
- {\globalletempty\checkTABLEautorow
- \globalletempty\chuckTABLEautorow
- \ifnum\TABLEaction=\TABLErule \SR
- \else\ifnum\TABLEaction=\TABLEunknown \SR
- \else \LR
- \fi\fi}
-
%D When a table is split, we also add a tail and when present
%D we repeat the table head.
-\def\handleTABLEbreak#1#2%
- {\globalletempty\beforeTABLEline
- \gdef\afterTABLEline{\TABLEnoalign{\ifconditional\preventTABLEbreak\nobreak\else\goodbreak\fi}}}
-
%D When tables are split, the spacing before and after a
%D horizontal rule is corrected according to what we expect.
-\def\endofTABLEline[#1][#2->#3]#4#5%
- {\ifx#2#3\else
- \writestatus\m!TABLE{\string#2\space changed into \string#3}%
+\def\doendoftableline#1#2#3#4%
+ {\ifx#1#2\else
+ \writestatus\m!TABLE{\string#1\space changed into \string#2}%
\fi
- \iftracetables
- \bgroup
- \tttf\space
- \ifnum\TABLEerror=\TABLEunknown
- \ifx#2#3\else\string#2->\fi
- \else
- ->%
- \fi
- \color[#1]{\string#3}%
- \ifx\TABLEgraylineerror\empty
- \space\TABLEgraylinestatus
- \else
- \space\TABLEgraylineerror
- \fi
- \egroup
- \else\ifx\TABLEgraylineerror\empty \else
- % \bgroup
- % \tttf\space\TABLEgraylineerror
- % \egroup
- \fi\fi
- \globalletempty\TABLEgraylinestatus
- \globalletempty\TABLEgraylineerror
- \expandafter\normalTABLElineformat#4#5\crcr % \crcr nodig ?
- \TABLEnoalign{\nobreak\global\setTABLEactiontrue}}
+ \expandafter\donormaltablelineformat#3#4\crcr % \crcr nodig ?
+ \tablenoalign{\nobreak\global\settrue\tableactionstatepermitted}}
%D In order to prevent (as good as possible) alignment overflow
%D and therefore \TEX\ error messages, we check the maximum
@@ -1641,8 +1871,7 @@
%D the number of \type{|}'s and \type{\VL}'s or alike is always
%D one more than the number of columns.
-\newcount\currentTABLEcolumn
-\newcount\maxTABLEcolumn
+\newcount\currenttablecolumn
%D While defining this macro we change the \CATCODE\ of
%D \type{|}. When counting the bars, we use a non active
@@ -1651,43 +1880,20 @@
%D \TABLE\ changes the catcode when needed.}
\bgroup
- \catcode`\|=\@@other \gdef\@@otherbar {|}
- \catcode`\"=\@@other \gdef\@@otherquote {"}
- \catcode`\|=\@@active \gdef\@@useotherbar {\let|\@@otherbar}
- \catcode`\"=\@@active \gdef\@@useotherquote{\let"\@@otherquote}
+ \catcode\barasciicode\othercatcode \gdef\@@otherbar {|}
+ \catcode\barasciicode\activecatcode \gdef\@@useotherbar {\let|\@@otherbar}
\egroup
-\bgroup \catcode`\|=\@@other
+\bgroup \catcode\barasciicode\othercatcode
-\gdef\getTABLEnofcolumns#1%
+\gdef\dogettablenofcolumns#1% todo: also divert this to lua as with tabulate
{\bgroup
\cleanupfeatures % needed !
\@@useotherbar
- \@@useotherquote
- \expanded{\defconvertedargument\noexpand\ascii{#1}}%
- \@EA\doglobal\@EA\counttoken\@EA|\@EA\in\ascii\to\maxTABLEcolumn
- \global\advance\maxTABLEcolumn \minusone
- % in case of & counting, divide by 2
\egroup}
\egroup
-\def\!ttDoHalign
- {\edef\restoretablelineskips
- {\baselineskip \the\baselineskip
- \lineskiplimit\the\lineskiplimit
- \lineskip \the\lineskip
- \tabskip \the\tabskip}%
- \baselineskip \zeropoint
- \lineskiplimit\zeropoint
- \lineskip \zeropoint
- \tabskip \zeropoint
- % does not work in normal tex
- % \expanded{\getTABLEnofcolumns{\the\!taPreamble}}% added
- \halign \the\!taTableSpread \bgroup
- \span\the\!taPreamble
- \ifx \!tfRowOfWidths \empty \else \!tfRowOfWidths \cr \fi}
-
%D \startitemize[3*ruim]
%D \sym{\type{\VL}} a vertical line
%D \sym{\type{\VC}} a vertical colored line
@@ -1695,56 +1901,46 @@
%D \sym{\type{\HC}} a horizontal colored line
%D \stopitemize
-% \unexpanded\def\defineTABLErules
-% {\let\VL\TableVL
-% \let\VC\TableVC
-% \let\HL\TableHL
-% \let\HC\TableHC}
-
-\unexpanded\def\defineTABLErules
- {\let\VL\TableVL
- \let\VC\TableVC
- \let\HL\TableHL
- \let\HC\TableHC
- \let\VS\TableVS
- \let\VD\TableVD
- \let\VT\TableVT
- \let\VN\TableVN}
-
-\def\TableVL
- {\checkTABLEautorow
- \nextTABLEgrayline
- \ifnum\currentTABLEcolumn>\maxTABLEcolumn
- \setTABLEerror\TABLEmissingrow
- \handleTABLEerror
- \else
- \global\advance\currentTABLEcolumn \plusone
- \expandafter\doTableVL
- \fi}
+\newcount\tablevrulethicknessfactor
+\newcount\tablehrulethicknessfactor
+\newcount\tabledrulespan
+\let \tablecurrentvrulecolor \empty
+\let \tablecurrenthrulecolor \empty
-\def\doTableVL
- {\futurelet\next\dodoTableVL}
-
-\def\dodoTableVL
- {\docomplexorsimpleTable\complexTableVL\simpleTableVL}
-
-\def\complexTableVL[#1]%
- {\scratchcounter=0#1%
- \multiply\scratchcounter \@@tiVLwidth
- \setxvalue{wVL\the\currentTABLEcolumn}{\the\scratchcounter}%
- \simpleTableVL}
-
-\def\simpleTableVL
- {\doifundefined{wVL\the\currentTABLEcolumn}%
- {\setgvalue{wVL\the\currentTABLEcolumn}{\@@tiVLwidth}}%
- \gdef\TABLEbeforebar
- {\getvalue{bVL\the\currentTABLEcolumn}%
- \letgvalueempty{bVL\the\currentTABLEcolumn}}%
- \gdef\TABLEafterbar
- {\getvalue{eVL\the\currentTABLEcolumn}%
- \letgvalueempty{eVL\the\currentTABLEcolumn}}%
- \edef\@@tiVLwidth{\getvalue{wVL\the\currentTABLEcolumn}}%
- \expanded{\normalTABLEcomplexbar\@@tiVLwidth\space}}% \relax breaks \use
+\appendtoks
+ \let\VL\dotableVL
+ \let\VC\dotableVC
+ \let\HL\dotableHL
+ \let\HC\dotableHC
+ \let\VS\dotableVS
+ \let\VD\dotableVD
+ \let\VT\dotableVT
+ \let\VN\dotableVN
+\to \localtabledefinitions
+
+\def\dotableresetVLvalues
+ {\global\currenttablecolumn\zerocount}
+
+\def\dotablevrulecommand#1% global assignments
+ {\doifnumberelse{#1}
+ {\global\tablevrulethicknessfactor#1\relax
+ \global\multiply\tablevrulethicknessfactor\@@tiVLwidth\relax}
+ {\xdef\tablecurrentvrulecolor{#1}}}
+
+\unexpanded\def\dotableVL
+ {\dochecktableautorow
+ \global\advance\currenttablecolumn\plusone
+ \dosingleempty\dodotableVL}
+
+\def\dodotableVL[#1]%
+ {\global\let\tablecurrentvrulecolor\empty
+ \global\tablevrulethicknessfactor\@@tiVLwidth\relax
+ \iffirstargument
+ \rawprocesscommalist[#1]\dotablevrulecommand
+ \fi
+ \donormaltablecomplexbar}% \relax breaks \use
+
+\let\dotableVC\dotableVL % for mojca
% \starttable[|||]
% \HL
@@ -1754,106 +1950,51 @@
% \HL
% \stoptable
-\def\TableVS {\VN1}
-\def\TableVD {\VN2}
-\def\TableVT {\VN3}
-\def\TableVN#1{\gdef\@VLn{#1}\VL}
-
-\def\resetVLvalues
- {\dostepwiserecurse\zerocount\maxTABLEcolumn\plusone
- {\setgvalue{wVL\recurselevel}{\@@tiVLwidth}%
- \letgvalueempty{bVL\recurselevel}%
- \letgvalueempty{eVL\recurselevel}}%
- \global\currentTABLEcolumn\zerocount}
-
-\def\TableVC
- {\checkTABLEautorow
- \nextTABLEgrayline
- \ifnum\currentTABLEcolumn>\maxTABLEcolumn
- \setTABLEerror\TABLEmissingrow
- \handleTABLEerror
- \else
- \global\advance\currentTABLEcolumn \plusone
- \expandafter\doTableVC
- \fi}
-
-\def\doTableVC
- {\futurelet\next\dodoTableVC}
-
-\def\dodoTableVC
- {\docomplexorsimpleTable\complexTableVC\simpleTableVC}
-
-\def\complexTableVC[#1]%
- {\global\setvalue{bVC\the\currentTABLEcolumn}{\startcolor[#1]}%
- \global\setvalue{eVC\the\currentTABLEcolumn}{\stopcolor}%
- \simpleTableVC}
-
-\def\simpleTableVC
- {\global\setvalue{bVL\the\currentTABLEcolumn}%
- {\getvalue{bVC\the\currentTABLEcolumn}}%
- \global\setvalue{eVL\the\currentTABLEcolumn}%
- {\getvalue{eVC\the\currentTABLEcolumn}}%
- \doTableVL}
-
-\def\TableHL
- {\ifnum\currentTABLEcolumn>\maxTABLEcolumn
- \chuckTABLEautorow
- \else\ifnum\currentTABLEcolumn=\zerocount
- %\chuckTABLEautorow
- \TABLEnoalign
- {\globalletempty\checkTABLEautorow
- \globalletempty\chuckTABLEautorow}%
+\unexpanded\def\dotableVS {\VN1}
+\unexpanded\def\dotableVD {\VN2}
+\unexpanded\def\dotableVT {\VN3}
+\unexpanded\def\dotableVN#1{\global\noftablevrules#1\relax\VL}
+
+\def\dotablehrulecommand#1% global assignments
+ {\doifnumberelse{#1}
+ {\global\tablehrulethicknessfactor#1\relax
+ \global\multiply\tablehrulethicknessfactor\@@tiHLheight\relax}
+ {\xdef\tablecurrenthrulecolor{#1}}}
+
+\unexpanded\def\dotableHL
+ {\dochucktableautorow
+ \dofinishtablerow
+ \starttablenoalign
+ \dosingleempty\dodotableHL}
+
+\def\dodotableHL[#1]%
+ {\nobreak
+ \ifnum\tableactionstate=\tablerulestate
+ \writestatus\m!TABLE{skipping \string\HL}% \statusmessage
\else
- \setTABLEerror\TABLEmissingcolumn
- \handleTABLEerror
- \fi\fi
- \complexorsimpleTable{HL}}
-
-\def\complexTableHL[#1]%
- {\TABLEnoalign
- {\scratchcounter0#1%
- \multiply\scratchcounter \@@tiHLheight
- \edef\@@tiHLheight{\the\scratchcounter}%
- \simpleTableHL}}
-
-\def\simpleTableHL
- {\TABLEnoalign
- {\nobreak
- \ifnum\TABLEaction=\TABLErule
- \writestatus\m!TABLE{skipping \string\HL}% \statusmessage
- \else
- \ifnum\TABLEaction=\TABLEmidrow
- \writestatus\m!TABLE{change \string\MR\space into \string\LR/\string\SR}%
- \else\ifnum\TABLEaction=\TABLEfirstrow
- \writestatus\m!TABLE{change \string\MR\space into \string\SR}%
- \fi\fi
- \startHLcommand
- \expandafter\normalTABLEfullrule\@@tiHLheight
- \stopHLcommand
- \globalletempty\startHLcommand
- \globalletempty\stopHLcommand
- \accountTABLElinewidth
- \fi
- \setTABLEaction\TABLErule
- \nobreak}}
-
-\let\startHLcommand\empty
-\let\stopHLcommand \empty
-
-\def\TableHC
- {\complexorsimpleTable{HC}}
-
-\def\complexTableHC[#1]%
- {\TABLEnoalign
- {\gdef\startHCcommand{\startcolor[#1]}%
- \gdef\stopHCcommand {\stopcolor}}%
- \simpleTableHC}
+ \ifnum\tableactionstate=\tablemidrowstate
+ \writestatus\m!TABLE{change \string\MR\space into \string\LR/\string\SR}%
+ \else\ifnum\tableactionstate=\tablefirstrowstate
+ \writestatus\m!TABLE{change \string\MR\space into \string\SR}%
+ \fi\fi
+ \bgroup
+ \global\tablehrulethicknessfactor\@@tiHLheight\relax
+ \iffirstargument
+ \global\let\tablecurrenthrulecolor\empty
+ \rawprocesscommalist[#1]\dotablehrulecommand
+ \ifx\tablecurrenthrulecolor\empty\else
+ \switchtocolor[\tablecurrenthrulecolor]%
+ \fi
+ \fi
+ \donormaltablefullrule
+ \egroup
+ \doaccounttablelinewidth
+ \fi
+ \dosettableaction\tablerulestate
+ \nobreak
+ \stoptablenoalign}
-\def\simpleTableHC
- {\TABLEnoalign
- {\globallet\startHLcommand\startHCcommand
- \globallet\stopHLcommand \stopHCcommand}%
- \HL}
+\let\dotableHC\dotableHL % for mojca
%D \startitemize[3*ruim]
%D \sym{\type{\NL}} a vertical skip
@@ -1864,508 +2005,177 @@
%D \sym{\type{\LC}} a last column
%D \stopitemize
-% n+1 uitleggen
-
-\unexpanded\def\defineTABLEsteps
- {\let\NL\TableNL
- \let\NR\TableNR
- \let\NC\TableNC
- \let\FC\TableNC
- \let\MC\TableNC
- \let\LC\TableNC}
-
-\def\TableNL
- {\complexorsimpleTable{NL}}
-
-\def\complexTableNL[#1]%
- {\TABLEnoalign
- {\edef\@@tiNL{#1}%
- \simpleTableNL}}%
-
-\def\simpleTableNL
- {\TABLEnoalign
- {\nobreak
- \setbox0\vbox{\blank[\@@tiNL]}%
- \vskip\ht0
- \nobreak}}
-
-\def\TableNR
- {\ifnum\currentTABLEcolumn>\maxTABLEcolumn
- \global\currentTABLEcolumn\zerocount
- \normalTABLElineending
- \else
- \setTABLEerror\TABLEmissingcolumn
- \handleTABLEerror
- \fi
- \TABLEnoalign
- {\nobreak
- \setTABLEaction\TABLEunknown}}
-
-\def\TableNC
- {\checkTABLEautorow
- \nextTABLEgrayline
- \ifnum\currentTABLEcolumn>\maxTABLEcolumn
- \setTABLEerror\TABLEmissingrow
- \handleTABLEerror
- \else
- \global\advance\currentTABLEcolumn \plusone
- \normalTABLEquote
- \fi}
+% \starttable[|||]
+% \VL text \VL text \VL \AR
+% \TB[small]
+% \VL text \VL text \VL \AR
+% \TB[4*big]
+% \VL text \VL text \VL \AR
+% \stoptable
-% \bgroup
-% \catcode`\|=\@@active
-% \catcode`\"=\@@active
-% \gdef\redefinetablebarandquote
-% {\def|{\VL}% % \normalTABLEsimplebar
-% \def\|##1{\VL[##1]}% % \normalTABLEcomplexbar
-% \def"{\NC}} % \normalTABLEquote
-% \egroup
+% n+1 uitleggen
-\let\redefinetablebarandquote\relax
+\appendtoks
+ \let\TB\dotableTB
+ \let\NL\dotableNL % old
+ \let\NR\dotableNR
+ \let\NC\dotableNC
+ \let\FC\dotableNC
+ \let\MC\dotableNC
+ \let\LC\dotableNC
+\to \localtabledefinitions
+
+\unexpanded\def\dotableTB
+ {\dochucktableautorow
+ \dofinishtablerow
+ \starttablenoalign
+ \dosingleempty\dotableTB}
+
+\def\dotableTB[#1]%
+ {\blank[\iffirstargument#1\else\@@tiNL\fi]%
+ \nobreak
+ \stoptablenoalign}
+
+\let\dotableNL\dotableTB
+
+\unexpanded\def\dotableNR
+ {\global\currenttablecolumn\zerocount
+ \donormaltablelineending
+ \starttablenoalign
+ \nobreak
+ \dosettableaction\tableunknownstate
+ \stoptablenoalign}
+
+\unexpanded\def\dotableNC
+ {\dochecktableautorow
+ \global\advance\currenttablecolumn \plusone
+ \donormaltablenobar}
-%D \startitemize[3*ruim]
+%D \startitemize[3*broad]
%D \sym{\type{\DL}}
%D \sym{\type{\DV}} (\type{\VD})
%D \sym{\type{\DC}}
%D \sym{\type{\DR}}
%D \stopitemize
-\newif\ifTABLEdivision
-
-% \unexpanded\def\defineTABLEdivisions
-% {\global\TABLEdivisionfalse % in start
-% \let\DL\TableDL
-% \let\DC\TableDC
-% \let\DV\TableDV
-% \let\VD\TableDV
-% \let\DR\TableDR}
-
-\unexpanded\def\defineTABLEdivisions
- {\global\TABLEdivisionfalse % in start
- \let\DL\TableDL
- \let\DC\TableDC
- \let\DV\TableDV
- \let\DR\TableDR}
-
-\def\checkTABLEdivision
- {\ifTABLEdivision \else
- \chuckTABLEautorow
- \global\currentTABLEcolumn\zerocount
- \global\TABLEdivisiontrue
+\newconditional\istabledivision
+
+\appendtoks
+ \global\setfalse\istabledivision
+ \let\DL\dotableDL
+ \let\DC\dotableDC
+ \let\DV\dotableDV
+ \let\DR\dotableDR
+\to \localtabledefinitions
+
+\def\dochecktabledivision
+ {\ifconditional\istabledivision\else
+ \dochucktableautorow
+ \global\currenttablecolumn\zerocount
+ \global\settrue\istabledivision
\fi}
-\def\TableDL
- {\checkTABLEdivision
- \complexorsimpleTable{DL}}
+\def\dotabledrulecommand#1% global assignments
+ {\doifnumberelse{#1}
+ {\ifcase\tabledrulespan
+ \global\tabledrulespan#1\relax
+ \else
+ \global\tablehrulethicknessfactor#1\relax
+ \global\multiply\tablehrulethicknessfactor\@@tiVLwidth\relax
+ \fi}
+ {\xdef\tablecurrenthrulecolor{#1}}}
-\def\simpleTableDL
- {\complexTableDL[1]}
+\unexpanded\def\dotableDL
+ {\dochecktabledivision
+ \dosingleempty\dotableDL}
-\def\complexTableDL[#1]%
- {\ifnum\TABLEaction=\TABLErule
+\def\dotableDL[#1]%
+ {\ifnum\tableactionstate=\tablerulestate
\writestatus\m!TABLE{skipping \string\DL}%
\else
- \ifnum\TABLEaction=\TABLEmidrow
+ \ifnum\tableactionstate=\tablemidrowstate
\writestatus\m!TABLE{change \string\MR\space into \string\LR/\string\SR}%
- \else\ifnum\TABLEaction=\TABLEfirstrow
+ \else\ifnum\tableactionstate=\tablefirstrowstate
\writestatus\m!TABLE{change \string\MR\space into \string\SR}%
\fi\fi
- \setTABLEaction=\TABLEunknown
- \ifnum\currentTABLEcolumn>\maxTABLEcolumn
- \setTABLEerror\TABLEmissingrow
- \handleTABLEerror
- \fi
- %\startHLcommand
- \ifnum#1=\plusone
- \global\advance\currentTABLEcolumn \plustwo
- \let\next\normalTABLEsinglerule
- \else
- \ifnum#1<\maxTABLEcolumn
- \global\advance\currentTABLEcolumn \plusone
- \def\next{\normalTABLEmultirule{#1}}%
- \else
- \setTABLEerror\TABLEdivisionoverflow
- \let\next\handleTABLEerror
+ \dosettableaction\tableunknownstate
+ \global\tablehrulethicknessfactor\@@tiHLheight\relax
+ \global\tabledrulespan\zerocount
+ \iffirstargument
+ \global\let\tablecurrenthrulecolor\empty
+ \rawprocesscommalist[#1]\dotabledrulecommand
+ \ifx\tablecurrenthrulecolor\empty\else
+ \switchtocolor[\tablecurrenthrulecolor]%
\fi
\fi
- \next
- %\stopHLcommand
- %\globalletempty\startHLcommand
- %\globalletempty\stopHLcommand
- \fi}
-
-\def\TableDV
- {\TableDCV\normalTABLEsimplebar}
-
-\def\TableDC
- {\TableDCV\normalTABLEquote}
-
-\def\TableDCV#1%
- {\checkTABLEdivision
- \checkTABLEautorow
- \ifnum\currentTABLEcolumn>\maxTABLEcolumn
- \setTABLEerror\TABLEmissingrow
- \handleTABLEerror
- \else
- \global\advance\currentTABLEcolumn \plusone
- #1%
- \fi}
-
-\def\TableDR
- {\ifnum\currentTABLEcolumn<\maxTABLEcolumn % silent recovery
- %\setTABLEerror\TABLEmissingcolumn % some day warning
- %\handleTABLEerror
- \finishTABLErow
- \else
- \global\currentTABLEcolumn\zerocount % nog check
- \normalTABLElineending
- \fi
- \TABLEnoalign
- {\nobreak
- \global\TABLEdivisionfalse
- \accountTABLElinewidth % temporary solution
- \setTABLEaction\TABLErule}}
-
-\def\accountTABLElinewidth
- {\scratchdimen\LineThicknessUnit}
-
-%D \startitemize[3*ruim]
-%D \sym{\type{\BC}}
-%D \sym{\type{\BR}}
-%D \sym{\type{\BACKGROUND}}
-%D \sym{\type{\CL}}
-%D \sym{\type{\RL}}
-%D \sym{\type{\BL}}
-%D \sym{\type{\RASTER}}
-%D \sym{\type{\COLOR}}
-%D \stopitemize
-
-% definieer: \BC \BL
-% herhaal: \BR
-% definieer: \CL \RL (eerste \CL[green] = hele row! / \CL[1,green])
-% dus: \CL en \RL mix tussen \HL en \BL
-
-\unexpanded\def\defineTABLEbackgrounds
- {\let\BC \TableBC
- \let\BL \TableBL
- \let\BR \TableBR
- \let\BACKGROUND\TableBR
- \let\CL \TableCL
- \let\RL \TableRL
- \let\COLOR \TableCOLOR
- \let\RASTER \TableRASTER
- \globallet\lastTABLEc\@@tibackgroundcolor
- \globallet\lastTABLEr\@@tibackgroundscreen
- \doifinsetelse\@@tibackground{c,color} % \v!color
- {\global\chardef\TABLEcr\plusone}
- {\global\chardef\TABLEcr\plustwo}}
-
-\def\TableBC
- {\ifTABLEgrayline
- \normalTABLEquote
- \else
- \TABLEnoalign\bgroup
- \globallet\nextTABLEgrayline\executeTABLEgrayline
- \globalletempty\TABLEgrayline % new
- \let\BL\doTableBL
- \let\BC\doTableBC
- \expandafter\doTableBC
- \fi}
-
-\def\doTableBC
- {\addtoTABLEgrayline{\BC}%
- \gobbleTableBCL}
-
-\def\TableBL
- {\TABLEnoalign\bgroup
- \globallet\nextTABLEgrayline\executeTABLEgrayline
- \globalletempty\TABLEgrayline % new
- \let\BL\doTableBL
- \let\CL\doTableCL
- \let\RL\doTableRL
- \let\BC\doTableBC
- \doTableBL}
-
-\def\doTableBL
- {\complexorsimpleTable{BL}}
-
-\def\simpleTableBL
- {\complexTableBL[,]}
-
-\def\complexTableBL[#1]%
- {\analyzeTABLEcr[#1]%
- \handleTABLEcr}
-
-\def\TableBR#1%
- {\TABLEnoalign
- {\globallet\nextTABLEgrayline\executeTABLEgrayline
- \checkTABLEgrayline#1\BR
- \global\TABLEgraylinetrue}}
-
-\def\analyzeTABLEcr[#1]%
- {\doanalyzeTABLEcr[#1,,]}
-
-\def\doanalyzeTABLEcr[#1,#2,#3]%
- {\doifnumberelse{#1x} % Is the x still needed here?
- {\dodoanalyzeTABLEcr[#1,#2,#3]}
- {\dodoanalyzeTABLEcr[1,#1,#2]}}
-
-\def\dodoanalyzeTABLEcr[#1,#2,#3]%
- {\global\chardef\TABLEn#1\relax
- \processaction
- [#2]
- [ c=>\global\chardef\TABLEcr1,%
- color=>\global\chardef\TABLEcr1,%
- r=>\global\chardef\TABLEcr2,%
- raster=>\global\chardef\TABLEcr2]%
- \ifcase\TABLEcr \or
- \doifsomething{#3}{\xdef\lastTABLEc{#3}}%
- \or
- \doifsomething{#3}{\xdef\lastTABLEr{#3}}%
- \fi}
-
-\def\handleTABLEcr
- {\relax % else funny side effect
- \ifcase\TABLEcr
- % Can't happen!
- \or
- \addtoTABLEgrayline{\complexTableCOLOR[\the\TABLEn,\lastTABLEc]}%
- \else
- \addtoTABLEgrayline{\complexTableRASTER[\the\TABLEn,\lastTABLEr]}%
- \fi
- \gobbleTableBCL}
-
-\def\analyzeTABLEcrl#1[#2]%
- {\doanalyzeTABLEcrl#1[#2,,]}
-
-\def\doanalyzeTABLEcrl#1[#2,#3,#4]%
- {\doifnumberelse{#2x} % x ????????????????????
- {\dodoanalyzeTABLEcr[#2,#1,#3]}
- {\dodoanalyzeTABLEcr[\ifTABLEgrayline1\else\maxTABLEcolumn\fi,#1,#2]}}
-
-\def\TableCL
- {\TABLEnoalign\bgroup
- \globallet\nextTABLEgrayline\executeTABLEgrayline
- \globalletempty\TABLEgrayline % new
- \let\BL\doTableBL
- \let\CL\doTableCL
- \let\RL\doTableRL
- \let\BC\doTableBC
- \doTableCL}
-
-\def\doTableCL
- {\complexorsimpleTable{CL}}
-
-\def\simpleTableCL% nog eens \'e\'en lijn van maken
- {\BL[\the\maxTABLEcolumn,c,\lastTABLEc]}
-
-\def\complexTableCL[#1]%
- {\analyzeTABLEcrl{c}[#1]%
- \handleTABLEcr}
-
-\def\TableRL
- {\TABLEnoalign\bgroup
- \globallet\nextTABLEgrayline\executeTABLEgrayline
- \globalletempty\TABLEgrayline % new
- \let\BL\doTableBL
- \let\CL\doTableCL
- \let\RL\doTableRL
- \let\BC\doTableBC
- \doTableRL}
-
-\def\doTableRL
- {\complexorsimpleTable{RL}}
-
-\def\simpleTableRL
- {\BL[\the\maxTABLEcolumn,r,\lastTABLEr]}
-
-\def\complexTableRL[#1]%
- {\analyzeTABLEcrl{r}[#1]%
- \handleTABLEcr}
-
-\def\checkTABLEgrayline#1#2%
- {\!!doneatrue
- \ifx#1\AR
- \!!doneafalse
- \else\ifx#1\SR\else\ifx#1\FR\else\ifx#1\MR\else\ifx#1\LR\else
- \!!doneafalse
- \fi\fi\fi\fi\fi
- \if!!donea
- \gdef\TABLEgraylinestatus
- {[\string#1]}%
- \gdef\TABLEendBCL
- {#1}%
- \else
- \gdef\TABLEgraylineerror
- {[\string#2\string#1->\string#2\string\SR]}%
- \gdef\TABLEendBCL
- {\SR}%
- \fi}
-
-\def\endTABLErowGL#1#2#3%
- {\ifcase#1\relax
- % unknown
- \or
- \doPreTableGL\TABLErowfactor\TABLErowfactor
- \or
- \doPreTableGL\TABLErowfactor\TABLErowzero
- \or
- \ifnum\TABLEforce=\TABLEforcelastrow
- \doPreTableGL\TABLErowzero\TABLErowfactor
- \else\ifnum\TABLEforce=\TABLEforcefirstrow
- \doPreTableGL\TABLErowfactor\TABLErowzero
+ \ifcase\tabledrulespan
+ \global\advance\currenttablecolumn \plusone
+ \donormaltablesinglerule
+ \or
+ \global\advance\currenttablecolumn \plustwo
+ \donormaltablesinglerule
\else
- \doPreTableGL\TABLErowzero\TABLErowzero
- \fi\fi
- \or
- \doPreTableGL\TABLErowzero\TABLErowfactor
+ \global\advance\currenttablecolumn \plusone
+ \donormaltablemultirule
+ \fi
\fi}
-\def\doPreTableGL#1#2% betere namen
- {\xdef\OldLineThicknessFactor{\the\LineThicknessFactor}%
- \xdef\OldLineThicknessUnit{\the\LineThicknessUnit}%
- \global\LineThicknessFactor\plusone
- \setbox0\hbox{\AugmentedTableStrut{#1}{#2}}%
- \getboxheight\dimen0\of\box0\relax
- \xdef\TABLEgraylineHeight{\the\dimen0}%
- \global\LineThicknessUnit\TABLEgraylineHeight}
-
-\def\doPostTableGL
- {\global\LineThicknessFactor\OldLineThicknessFactor
- \global\LineThicknessUnit \OldLineThicknessUnit}
+\unexpanded\def\dotableDV
+ {\dotableDCV\donormaltablesimplebar}
+
+\unexpanded\def\dotableDC
+ {\dotableDCV\donormaltablenobar}
+
+\unexpanded\def\dotableDCV#1%
+ {\dochecktabledivision
+ \dochecktableautorow
+ \global\advance\currenttablecolumn \plusone
+ #1}
+
+\unexpanded\def\dotableDR
+ {\global\currenttablecolumn\zerocount % nog check
+ \donormaltablelineending
+ \starttablenoalign
+ \nobreak
+ \global\setfalse\istabledivision
+ \doaccounttablelinewidth % temporary solution
+ \dosettableaction\tablerulestate
+ \stoptablenoalign}
+
+\def\doaccounttablelinewidth
+ {\scratchdimen\tablelinethicknessunit}
-% kan simpeler
-
-\def\docomplexTableCOLOR[#1]%
- {\dodocomplexTableGL\startcolor \stopcolor [#1,\lastTABLEc,,]}
+\def\dotableTWO {\use\plustwo}
+\def\dotableTHREE {\use\plusthree}
+\def\dotableFOUR {\use\plusfour}
+\def\dotableFIVE {\use\plusfive}
+\def\dotableSIX {\use\plussix}
-\gdef\docomplexTableRASTER[#1]%
- {\dodocomplexTableGL\startraster\stopraster[#1,\lastTABLEr,,]}
-
-\def\dodocomplexTableGL#1#2[#3,#4,#5,#6]%
- {\doifelsenothing{#4}{#1[#5]}{#1[#4]}%
- \doPreTableGL\TABLEendofrowheight\TABLEendofrowdepth
- \ifnum#3=\plusone % else conflict with \omit in \=
- \let\next\normalTABLEsinglerule
- \else
- \def\next{\normalTABLEmultirule{#3}}%
- \fi
- \next
- \doPostTableGL
- #2}
-
-\def\TableBACKGROUND
- {\TableBR}
-
-\def\simpleTableRASTER #1{\docomplexTableRASTER[1]#1}
-\def\complexTableRASTER[#1]{\docomplexTableRASTER[#1]}
-\def\simpleTableCOLOR {\docomplexTableCOLOR [1]}
-\def\complexTableCOLOR [#1]{\docomplexTableCOLOR [#1]}
+\appendtoks
+ \let\TWO \dotableTWO
+ \let\THREE\dotableTHREE
+ \let\FOUR \dotableFOUR
+ \let\FIVE \dotableFIVE
+ \let\SIX \dotableSIX
+ \let\SPAN \use
+ \let\REF \dotablereformat
+\to \localtabledefinitions
+
+\setvalue{\??ti:\c!distance:\v!none }{\dotableOpenUp00\def\LOW{\Lower6 }}
+\setvalue{\??ti:\c!distance:\v!small }{\dotableOpenUp00\def\LOW{\Lower6 }} % == baseline
+\setvalue{\??ti:\c!distance:\v!medium}{\dotableOpenUp11\def\LOW{\Lower7 }}
+\setvalue{\??ti:\c!distance:\v!big }{\dotableOpenUp22\def\LOW{\Lower8 }}
-\def\TableRASTER{\complexorsimpleTable{RASTER}}
-\def\TableCOLOR {\complexorsimpleTable{COLOR}}
+\appendtoks
+ \getvalue{\??ti:\c!distance:\@@tidistance}%
+\to \localtabledefinitions
-\def\addtoTABLEgrayline#1%
- {\TABLEgraytoks\expandafter{\TABLEgrayline}%
- \xdef\TABLEgrayline{\the\TABLEgraytoks\noexpand#1}}
-
-\def\setTableBCL#1#2%
- {\ifx#1#2%
- \gdef\TABLEgraylinestatus{[\string#1]}%
- \gdef\TABLEendBCL{#1}%
- \addtoTABLEgrayline{#1}%
- \else
- \gdef\TABLEgraylineerror{[\string#1->\string#2]}%
- \gdef\TABLEendBCL{#2}%
- \addtoTABLEgrayline{#2}%
- \fi}
+\appendtoks
+ \doifelse\@@tidistance\v!none
+ {\tablerowfactor\zerocount}
+ {\tablerowfactor\plustwo }%
+\to \localtabledefinitions
-\def\gobbleTableBCL#1%
- {\ifx#1\BC \let\next\doTableBC \else
- \ifx#1\BL \let\next\doTableBL \else
- \ifx#1\SR \setTableBCL\SR\SR \let\next\egroup \else
- \ifx#1\FR \setTableBCL\FR\FR \let\next\egroup \else
- \ifx#1\MR \setTableBCL\MR\MR \let\next\egroup \else
- \ifx#1\LR \setTableBCL\LR\LR \let\next\egroup \else
- \setTableBCL #1\SR \let\next\egroup
- \fi\fi\fi\fi\fi\fi
- \next}
-
-\def\executeTABLEgrayline
- {\TABLEnoalign
- {\def\BC
- {\advance\currentTABLEcolumn \plusone}%
- \def\dodocomplexTableGL##1##2[##3,##4,##5,##6]%
- {\BC\advance\currentTABLEcolumn ##3 }%
- \let\endTABLErow\endTABLEgrayrow
- \currentTABLEcolumn\zerocount
- \TABLEgrayline\TABLEendBCL % determine n of columns and height
- \advance\currentTABLEcolumn \minusone
- \ifnum\currentTABLEcolumn>\maxTABLEcolumn
- % error message too long line
- \globalletempty\TABLEgrayline
- \else
- % \message{n of color columns: \the\currentTABLEcolumn}\wait
- \global\TABLEgraylinetrue % vanaf hier nog checken
- \fi
- \global\currentTABLEcolumn\zerocount}%
- \unskip\TABLEgrayline\TABLEendBCL
- \TABLEnoalign
- {\nobreak
- \vskip-\TABLEgraylineHeight
- \nobreak
- \global\setTABLEactiontrue
- \global\currentTABLEcolumn\zerocount
- \globalletempty\nextTABLEgrayline
- \global\TABLEgraydonetrue
- \global\TABLEgraylinefalse}}
-
-\def\endTABLEgrayrow#1#2#3%
- {\ifcase#1\relax
- \global\chardef\TABLEendofrowheight\TABLErowfactor
- \global\chardef\TABLEendofrowdepth \TABLErowfactor
- \or
- \global\chardef\TABLEendofrowheight\TABLErowfactor
- \global\chardef\TABLEendofrowdepth \TABLErowfactor
- \or
- \global\chardef\TABLEendofrowheight\TABLErowfactor
- \global\chardef\TABLEendofrowdepth \TABLErowzero
- \or
- \ifnum\TABLEforce=\TABLEforcelastrow
- \global\chardef\TABLEendofrowheight\TABLErowzero
- \global\chardef\TABLEendofrowdepth \TABLErowfactor
- \else\ifnum\TABLEforce=\TABLEforcefirstrow
- \global\chardef\TABLEendofrowheight\TABLErowfactor
- \global\chardef\TABLEendofrowdepth \TABLErowzero
- \else
- \global\chardef\TABLEendofrowheight\TABLErowzero
- \global\chardef\TABLEendofrowdepth \TABLErowzero
- \fi\fi
- \or
- \global\chardef\TABLEendofrowheight\TABLErowzero
- \global\chardef\TABLEendofrowdepth \TABLErowfactor
- \fi}
-
-\unexpanded\def\defineTABLEshorthands%
- {\def\SPAN##1{\use{##1}}%
- \def\TWO {\use2}%
- \def\THREE {\use3}%
- \def\FOUR {\use4}%
- \def\FIVE {\use5}%
- \def\SIX {\use6}%
- \def\REF {\ReFormat}}
-
-\unexpanded\def\defineTABLEunits
- {\processaction
- [\@@tidistance]
- [ \v!none=>\OpenUp00\def\LOW{\Lower6 },
- \v!small=>\OpenUp00\def\LOW{\Lower6 }, % == baseline
- \v!medium=>\OpenUp11\def\LOW{\Lower7 },
- \v!big=>\OpenUp22\def\LOW{\Lower8 }]%
- \doifelse\@@tidistance\v!none
- {\chardef\TABLErowfactor\zerocount}
- {\chardef\TABLErowfactor\plustwo }}
-
\def\dohandlebar % here ?
{\ifmmode
\@EA\domathmodebar
@@ -2374,74 +2184,38 @@
\else
\@EAEAEA\dotextmodebar
\fi\fi}
-
-% De macro's t.b.v. instellingen.
\unexpanded\def\setuptables
{\dosingleargument\dosetuptables}
\def\dosetuptables[#1]%
{\getparameters[\??ti][#1]%
- \processaction
+ \processaction % we have a command for this
[\@@tialign]
- [ \v!right=>\def\TABLEparalignment{\raggedright},
- \v!left=>\def\TABLEparalignment{\raggedleft},
- \v!middle=>\def\TABLEparalignment{\raggedcenter},
- \s!default=>\def\TABLEparalignment{\notragged},
- \s!unknown=>\def\TABLEparalignment{\notragged}]%
+ [ \v!right=>\def\dotableparalignment{\raggedright},
+ \v!left=>\def\dotableparalignment{\raggedleft},
+ \v!middle=>\def\dotableparalignment{\raggedcenter},
+ \s!default=>\def\dotableparalignment{\notragged},
+ \s!unknown=>\def\dotableparalignment{\notragged}]%
\assignalfadimension\@@tiVL\@@tiVLwidth 246%
\assignalfadimension\@@tiHL\@@tiHLheight246}
-\def\localTABLEsetup
- {\@@ticommands\relax
- \expanded{\switchtobodyfont[\@@tibodyfont]}%
- \StrutHeightFactor 8
- \StrutDepthFactor 4
- \LineThicknessFactor4
- \NormalTLTU {.1pt}%
- \NormalTSU {\normalbaselineskip\divide\StrutUnit 12 }%
- \NormalTableUnits}
-
-%D And then I wrote the tabulate environment. That
-%D alternative supports setting the rule thickness and color,
-%D so here is the table alternative.
-
-\let\startglobalTABLEcolor\empty
-\let\stopglobalTABLEcolor \empty
-
-\def\localTABLEsetup
+\def\dolocaltablesetup
{\@@ticommands\relax
- % bodyfont
- \expanded{\switchtobodyfont[\@@tibodyfont]}%
- % linecolor
- \doifsomething\@@tirulecolor
- {\unexpanded\def\startglobalTABLEcolor{\startcolor[\@@tirulecolor]}%
- \unexpanded\def\stopglobalTABLEcolor {\stopcolor}}%
- % linethickness
- \LineThicknessFactor4
- \scratchdimen\@@tirulethickness
- \divide\scratchdimen \LineThicknessFactor
- \expanded{\NormalTLTU{\the\scratchdimen}}%
- % spacing, was depth=4 height=8 (counters, sigh, now macros)
+ \expanded{\switchtobodyfont[\@@tibodyfont]}% expanded ?
+ \tablelinethicknessunit\dimexpr\@@tirulethickness/\tablelinethicknessfactor\relax
\doifelse\@@tiheight\v!strut
- {\let\StrutHeightFactor\strutheightfactor}
- {\let\StrutHeightFactor\@@tiheight}%
+ {\let\tablestrutheightfactor\tablestrutheightfactor}
+ {\let\tablestrutheightfactor\@@tiheight}%
\doifelse\@@tidepth\v!strut
- {\let\StrutDepthFactor\strutdepthfactor}
- {\let\StrutDepthFactor\@@tidepth}%
- \scratchdimen\StrutHeightFactor\points \multiply\scratchdimen 10%
- \edef\StrutHeightFactor{\withoutpt\the\scratchdimen}%
- \scratchdimen\StrutDepthFactor \points \multiply\scratchdimen 10%
- \edef\StrutDepthFactor{\withoutpt\the\scratchdimen}%
- % units
- \NormalTSU{\normalbaselineskip\divide\StrutUnit 12 }%
- \NormalTableUnits}
-
-\def\OpenUp#1#2%
- {\scratchdimen\StrutHeightFactor \points \advance\scratchdimen #1\points
- \edef\StrutHeightFactor{\withoutpt\the\scratchdimen}%
- \scratchdimen\StrutDepthFactor \points \advance\scratchdimen #2\points
- \edef\StrutDepthFactor{\withoutpt\the\scratchdimen}}
+ {\let\tablestrutdepthfactor\tablestrutdepthfactor}
+ {\let\tablestrutdepthfactor\@@tidepth}%
+ \edef\tablestrutheightfactor{\withoutpt\the\dimexpr10\dimexpr\tablestrutheightfactor\points}%
+ \edef\tablestrutdepthfactor {\withoutpt\the\dimexpr10\dimexpr\tablestrutdepthfactor \points}%
+ \tablestrutunit\dimexpr\normalbaselineskip/12\relax % 12 is default bodyfont
+ \tableintercolumnspaceunit.5em plus 1fil minus .25em\relax
+ \tablecolumnwidthunit .5em\relax
+ \tablekernunit .5em\relax}
%D As one can see, we didn't only add color, but also more
%D control over spacing.
@@ -2492,7 +2266,7 @@
%D {$\vcenter{\getbuffer[b]}$}
%D {\hbox{tabulate}}
%D \stopcombination
-
+
\setuptables
[HL=\v!medium,
VL=\v!medium,
@@ -2501,6 +2275,7 @@
\c!align=\v!right,
\c!depth=.40, % \v!strut
\c!height=.80, % \v!strut
+ \c!textwidth=,
\c!rulethickness=\linewidth,
\c!rulecolor=,
\c!distance=\v!medium,
@@ -2511,6 +2286,4 @@
\c!backgroundcolor=,
\c!split=\v!auto]
-\def\ifintabel{\ifintable} % upward compatible
-
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/tabl-tbl.lua b/Master/texmf-dist/tex/context/base/tabl-tbl.lua
new file mode 100644
index 00000000000..86968721b86
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/tabl-tbl.lua
@@ -0,0 +1,37 @@
+if not modules then modules = { } end modules ['tabl-tbl'] = {
+ version = 1.001,
+ comment = "companion to tabl-tbl.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- A couple of hacks ... easier to do in Lua than in regular
+-- TeX. More will follow.
+
+local tonumber = tonumber
+local gsub, rep, sub = string.gsub, string.rep, string.sub
+
+local P, C, Cc, Ct, lpegmatch = lpeg.P, lpeg.C, lpeg.Cc, lpeg.Ct, lpeg.match
+
+local settexcount = tex.setcount
+
+local separator = P("|")
+local nested = lpeg.patterns.nested
+local pattern = Ct((separator * (C(nested) + Cc("")) * C((1-separator)^0))^0)
+
+function commands.presettabulate(preamble)
+ -- todo: lpeg but not now
+ preamble = gsub(preamble, "%*(%b{})(%b{})", function(n,p)
+ return rep(sub(p,2,-2),tonumber(sub(n,2,-2)) or 1)
+ end)
+ local t = lpegmatch(pattern,preamble)
+ local m = #t - 2
+ settexcount("global","noftabulatecolumns", m/2)
+ settexcount("global","tabulatehasfirstrulespec", t[1] == "" and 0 or 1)
+ settexcount("global","tabulatehaslastrulespec", t[m+1] == "" and 0 or 1)
+ for i=1,m,2 do
+ context.settabulateentry(t[i],t[i+1])
+ end
+ context.setlasttabulateentry(t[m+1])
+end
diff --git a/Master/texmf-dist/tex/context/base/tabl-tbl.mkiv b/Master/texmf-dist/tex/context/base/tabl-tbl.mkiv
index 400d8a659de..b8ebb5ee7c9 100644
--- a/Master/texmf-dist/tex/context/base/tabl-tbl.mkiv
+++ b/Master/texmf-dist/tex/context/base/tabl-tbl.mkiv
@@ -13,34 +13,35 @@
\writestatus{loading}{ConTeXt Table Macros / Tabulation}
-% \processbetween gebruiken in head/tail macros
-
-% todo: \aligntab \alignmark (after 0.60 is out)
-
\unprotect
-%D I can probably reimplement this using a \LUA||\TEX\ combination
+\registerctxluafile{tabl-tbl.lua}{1.001} % experiment
+
+%D I can probably reimplement this using a \LUATEX\ combination
%D but it does not pay of in development time. If I need something
%D else I will write it from scratch anyway.
+%D
+%D I never really looked at the preamble code of TaBlE (at that time
+%D I simply didn't look into alignments too much) but there seem to
+%D be some similarities with the following code. So, maybe it's not
+%D too much work to rewrite that package in a more contexty style. If
+%D it makes sense to do that remains to be seen. We might as well
+%D drop it.
+%D
+%D Be careful with changing the hsize calculation in p mode;
+%D the following code works quite well:
+%D
+%D \starttyping
+%D \setupfield [line][location=low,height=1.2\lineheight,width=\hsize]
+%D \definefield [test] [line] [line] []
+%D
+%D \starttabulate[|l|p|]
+%D \NC test \NC \field [test] \NC \NR
+%D \stoptabulate
+%D \stoptyping
-% watch out: don't change this model else trialtypesetting
-% compatibility problems
-
-% watch out, cells expand pretty late on a per row basis
-
-% |p2|p3| 2:3
-% spanning
-
-% Be careful with changing the hsize calculation in p mode;
-% the following code works quite well:
-%
-% \setupfield [line][location=low,height=1.2\lineheight,width=\hsize]
-% \definefield [test] [line] [line] []
+% |p2|p3| 2:3 -> spanning
%
-% \starttabulate[|l|p|]
-% \NC test \NC \field [test] \NC \NR
-% \stoptabulate
-
% In-text tabbing environment
%
% \starttabulate[| separated template] % eg [|l|p|] or [|l|p|p|]
@@ -49,7 +50,7 @@
%
% with: two pass auto width calculation when no p-width
% specified, even with multiple p's, see examples.
-
+%
% TaBlE compatible specifications:
%
% l align column/paragraph left
@@ -71,51 +72,58 @@
% i i<n> skip left of column
% j i<n> skip right of column
% k i<n> skip around column
-
+%
+% C [C\L\M\R] {color}
+%
+% | {color,n}
+%
% s setups
-
+%
% g g{char} align at char
% . align at .
% , align at ,
-
+%
% Still to be done
-
+%
% N math numbers (best hook into existing digits mechanism)
% n numbers (best hook into existing digits mechanism)
% Q math numbers (best hook into existing digits mechanism)
% q numbers (best hook into existing digits mechanism)
% ~ \hskip.5em
% | check
-
+%
% nesting
-
+%
% 10 evt auto stack; dan wel andere signal dan void nodig
-
+%
% present but not yet 100% ok
%
-% \FL top hrule
-% \ML mid hrule (with auto split)
-% \LL bottom hrule
-% \HL
-
-% \VL as soon as needed
-% color as soon as needed
-
-% \EQ \RQ \HQ equal (raw, hook)
-% \NC \RC \HC normal (raw, hook)
+% \TL [width,color] bottom hrule
+% \FL [width,color] first hrule
+% \ML [width,color] mid hrule (with auto split)
+% \LL [width,color] bottom hrule
+% \BL [width,color] last hrule
+%
+% \HL [width,color] top rule
+% \VL [width,color]
+%
+% \CC \CL \CM \CR color
+%
+% \EQ \RQ \HQ equal (raw, hook)
+% \NC \RC \HC normal (raw, hook)
%
% \NR
-
+%
% \HR : rule with lineheight
-
+%
% \autotabulaterule : with lineheight, not first/last
% \autotabulateline : spaced, not first/last
% \tabulaterule : with lineheight
% \tabulateline : spaced
-
+%
% tricky: align scans ahead, over # and expands ones before
% while doing
-
+%
% new:
%
% \starttabulate[|cg{.}|cg{,}|cg{,}|]
@@ -148,43 +156,107 @@
% \NC 500 \NC \NC 20 \NC \NC 100 \NC \NR
% \stoptabulate
-\newtoks \tabulatepreamble
-\newtoks \tabulatebefore
-\newtoks \tabulateafter
-\newtoks \tabulatebmath
-\newtoks \tabulateemath
-\newtoks \tabulatefont
-\newtoks \tabulatesettings
-\newtoks \tabulatedummy
+\newtoks \tabulatepreamble
+\newtoks \tabulatebefore
+\newtoks \tabulateafter
+\newtoks \tabulatebmath
+\newtoks \tabulateemath
+\newtoks \tabulatefont
+\newtoks \tabulatesettings
+\newtoks \tabulatedummy
+
+\newcount \nofautotabulate
+\newcount \tabulatecolumns
+\newcount \tabulatecolumn
+
+\newcount \noftabulatecolumns % set by parser
+
+\newcount \tabulateminplines
+\newcount \tabulatemaxplines
+
+\newif \iftracetabulate
+
+\newconditional \tabulatenopbreak
+\newconditional \tabulatefirstflushed
+\newconditional \tabulateequal
+\newconditional \tabulatesplit \settrue\tabulatesplit
+\newconditional \tabulateautomode
+\newconditional \tabulatehandlepbreak \settrue\tabulatehandlepbreak
+
+\newdimen \tabulatepwidth
+\newdimen \tabulatexwidth
+\newdimen \tabulatewidth
+\newdimen \tabulateunit
+\newdimen \tabulatemaxpheight
+
+\newskip \tabulatepreskip
+\newskip \tabulateposskip
+\newskip \firstpretabskip
+\newskip \lastposttabskip
+
+\newbox \tabulatebox
+
+\newtoks \everytabulaterow
+\newtoks \everytabulatepar
+\newtoks \everyaftertabulaterow
+\newtoks \everytabulate
+
+\newconditional \tabulateautorulespacing \settrue\tabulateautorulespacing
+\newcount \tabulatehasfirstrulespec % for the moment a count
+\newcount \tabulatehaslastrulespec % for the moment a count
+\newconditional \tabulatesomeamble
+\newconstant \tabulatepass
+
+\setnewconstant \tabulatesplitlinemode \plusone
+
+\newconstant \tabulatecolorspan
+\newconstant \tabulatelocalcolorspan
+
+\newdimen \defaulttabulatevrulethickness
+\newdimen \defaulttabulatehrulethickness
+\newdimen \tabulatevrulethickness
+\newdimen \tabulatehrulethickness
+\newdimen \tabulatelocalvrulethickness
+\newdimen \tabulatelocalhrulethickness
+
+\newskip \tabulateseparatorskip
+
+\newcount \maxtabularcolorcolumn
+
+\newif \iftolerantTABLEbreak % used in styles !
+
+\newcount \tabulaterepeathead
+\newcount \noftabulatelines
+\newcount \totalnoftabulatelines
+\newcount \minusnoftabulatelines
-\newcount \nofautotabulate
-\newcount \tabulatecolumns
-\newcount \tabulatecolumn
+\newconstant \tabulatetype
-\newcount \tabulateminplines
-\newcount \tabulatemaxplines
+% 0 = NC column next EQ equal column
+% 1 = RC column raw RQ equal column raw
+% 2 = HC column hook HQ equal column hook
+
+% for old times sake:
-\newif \ifautotabulate
-\newif \ifsplittabulate \splittabulatetrue
+\def\handletabulatepbreakfalse{\setfalse\tabulatehandlepbreak} % depricated
-\newif \ifhandletabulatepbreak \handletabulatepbreaktrue
-\newif \iftabulatenopbreak \tabulatenopbreakfalse
+% handy helper
-\newif \iftabulateequal
-\newif \iftracetabulate
-\newif \ifframedtabulate
+\def\tabulatenoalign
+ {\noalign
+ \bgroup
+ \let\noalign\relax
+ \let\tabulatenoalign\relax
+ \let\next=}
-\newdimen \tabulatepwidth
-\newdimen \tabulatexwidth
-\newdimen \tabulatewidth
-\newdimen \tabulateunit
-\newdimen \tabulatemaxpheight
+\def\starttabulatenoalign
+ {\tabulatenoalign\bgroup}
-\newbox \tabulatebox
+\let\stoptabulatenoalign\egroup
% [|lg{.}|] => \NG 12.34 \NC
-\gdef\handletabulatecharalign#1 % space delimited !
+\gdef\handletabulatecharalign#1 % space delimited ! (will be redone in lua)
{\edef\alignmentclass{\the\tabulatecolumn}%
\edef\alignmentcharacter{\csname\??tt:a:\the\tabulatecolumn\endcsname}%
\ifcase\tabulatepass\or
@@ -227,10 +299,10 @@
\fi}
\def\dotabulatenobreak
- {\noalign{\dodotabulatenobreak}}
+ {\tabulatenoalign{\dodotabulatenobreak}}
\unexpanded\def\notabulatehook
- {}
+ {}
\unexpanded\def\checktabulatehook
{\ifnum\tabulatetype<\plustwo
@@ -242,100 +314,89 @@
\unexpanded\def\checktabulatesetups
{\csname\??tt:s:\the\tabulatecolumn\endcsname}
-\let\pretabrule \donothing
-\let\posttabrule\donothing
-
-% 0 = NC column next EQ equal column
-% 1 = RC column raw RQ equal column raw
-% 2 = HC column hook HQ equal column hook
-% some entries can be left out if we test for them being set
-
-% \def\dodosettabulatepreamble#1#2%
-% {\ifzeropt\tabulatewidth
-% \ifcase\tabulatemodus\relax
-% \let\preamblebox\empty
-% \else
-% \def\preamblebox{\autotabulatetrue}%
-% \fi
-% \else
-% \ifcase\tabulatemodus\relax
-% \edef\preamblebox{\hbox to \the\tabulatewidth}%
-% \else
-% \edef\preamblebox{\hsize\the\tabulatewidth}%
-% \fi
-% \fi
-% %
-% % less bytes
-% %
-% %\edef\preamblebox%
-% % {\ifcase\tabulatewidth
-% % \ifcase\tabulatemodus\relax\else\noexpand\autotabulatetrue\fi
-% % \els
-% % \ifcase\tabulatemodus\relax\hbox to\else\hsize\fi\the\tabulatewidth
-% % \fi}%
-% %
-% \@EA\appendtoks \@EA&\@EA\hskip\pretabskip\pretabrule##&\to\!!toksa
-% \appendtoks \ignorespaces\to\!!toksa
-% \@EA\appendtoks\@EA\global\@EA\tabulatecolumn\the\tabulatecolumns\relax\to\!!toksa
-% \appendtoks \checktabulatesetups\to\!!toksa
-% \appendtoks \checktabulatehook\to\!!toksa
-% \@EA\appendtoks \preamblebox\to\!!toksa
-% \appendtoks \bgroup\bbskip\bgroup#1\to\!!toksa
-% \appendtoks\ifnum\tabulatetype=\plusone \else \to\!!toksa
-% \@EA\appendtoks \the\tabulatebmath\to\!!toksa
-% \@EA\appendtoks \the\tabulatefont\to\!!toksa
-% \@EA\appendtoks \the\tabulatesettings\to\!!toksa
-% \@EA\appendtoks \the\tabulatebefore\to\!!toksa
-% \appendtoks\fi \to\!!toksa
-% \appendtoks \bgroup\ignorespaces\to\!!toksa
-% %
-% \appendtoks \tabulatehook##\to\!!toksa
-% %
-% %%\doifdefinedelse{\??tt:a:\tabulatecolumns}
-% %\doifdefinedelse{\??tt:a:\the\tabulatecolumns}
-% % {\appendtoks\handletabulatecharalign## \to\!!toksa}
-% % {\appendtoks\tabulatehook ##\to \!!toksa}%
-% % waarom kan ik hier geen \xx{##} geven, om een of
-% % andere reden passeert dan tex de hele regel (incl \NC's)
-% % als argument; elke delimiter <> space gaat trouwens fout
-% \appendtoks \unskip\unskip\ifmmode\else\endgraf\fi\egroup\to\!!toksa
-% \appendtoks\ifnum\tabulatetype=1 \else \to\!!toksa
-% \@EA\appendtoks \the\tabulateafter\to\!!toksa
-% \@EA\appendtoks \the\tabulateemath\to\!!toksa
-% \appendtoks\fi \to\!!toksa
-% \appendtoks #2\egroup\egroup\to\!!toksa
-% \@EA\appendtoks \@EA&\@EA\posttabrule\@EA\hskip\postabskip##\to\!!toksa
-% \appendtoks\NC\to\tabulatedummy
-% \let\bbskip\empty
-% \def\pretabskip{.5\tabulateunit}%
-% \let\postabskip\pretabskip
-% \let\gettabulateexit\dogettabulateexit
-% \tabulatewidth\zeropoint}
-%
-% speedup:
-
-% is grouping really needed here?
-
\unexpanded\def\beforetabulateentry{\ignorespaces\tabulatehook}
\unexpanded\def\aftertabulateentry {\unskip\unskip\ifmmode\else\endgraf\fi}
\unexpanded\def\beginreshapedtabulatepar
{\dowithnextbox
- {\ctxlua{commands.doreshapeframedbox(\number\nextbox)}\ifvmode\unvbox\else\box\fi\nextbox}
+ {\ctxcommand{doreshapeframedbox(\number\nextbox)}\ifvmode\unvbox\else\box\fi\nextbox}
\vbox\bgroup}
\let\endreshapedtabulatepar\egroup
+\let\dotagtabulatealign\relax
+
+\unexpanded\def\dochecklocaltabulatecolor#1#2%
+ {\relax
+ \ifx\currenttabulatelocalcolor\empty
+ \gdef\currenttabulatecolor{#1}%
+ \else
+ \global\let\currenttabulatecolor\currenttabulatelocalcolor
+ \global\let\currenttabulatelocalcolor\empty
+ \fi
+ \ifcase\tabulatelocalcolorspan
+ \global\tabulatecolorspan#2\relax
+ \else
+ \global\tabulatecolorspan\tabulatelocalcolorspan
+ \global\tabulatelocalcolorspan\zerocount
+ \fi}
+
+\unexpanded\def\dochecklocaltabulatevrulecolor#1#2%
+ {\relax
+ \ifx\currenttabulatelocalvrulecolor\empty
+ \gdef\currenttabulatevrulecolor{#1}%
+ \else
+ \global\let\currenttabulatevrulecolor\currenttabulatelocalvrulecolor
+ \global\let\currenttabulatelocalvrulecolor\empty
+ \fi
+ \ifcase\tabulatelocalvrulethickness
+ \global\tabulatevrulethickness#2\relax
+ \else
+ \global\tabulatevrulethickness\tabulatelocalvrulethickness
+ \global\tabulatelocalvrulethickness\zeropoint
+ \fi}
+
+\unexpanded\def\dotabulatepreskip#1%
+ {\ifdim#1>\zeropoint
+ \hskip#1\relax
+ \else\ifnum\tabulatecolumn=\zerocount
+ \ifconditional\tabulateautorulespacing
+ \ifcase\tabulatehasfirstrulespec\else
+ \hskip\firstpretabskip\relax
+ \fi
+ \fi
+ \fi\fi}
+
+\unexpanded\def\dotabulatepostskip#1%
+ {\ifdim#1>\zeropoint
+ \hskip#1\relax
+ \else\ifnum\tabulatecolumns=\noftabulatecolumns
+ \ifconditional\tabulateautorulespacing
+ \ifcase\tabulatehaslastrulespec\else
+ \hskip\lastposttabskip\relax
+ \fi
+ \fi
+ \fi\fi}
+
\def\dodosettabulatepreamble#1#2% only makes sense for many tabulates
- {\normalexpanded{\!!toksa{\the\!!toksa
- &\hskip\pretabskip\noexpand\pretabrule##&%
- % \ignorespaces
+ {\normalexpanded{\tabulatepreamble{\the\tabulatepreamble
+ \dochecklocaltabulatevrulecolor{\currenttabulatevrulecolor}{\the\tabulatevrulethickness}%
+ \dochecklocaltabulatecolor{\currenttabulatecolor}{\number\tabulatecolorspan}%
+ \dorightsidetabulatecolor
+ \aligntab
+ \dotabulatevrule
+ \doleftsidetabulatecolor
+ \dotabulatepreskip{\the\tabulatepreskip}%
+ \alignmark\alignmark
+ \aligntab
+ \dobothsidetabulatecolor
+ \global\tabulatecolorspan\zerocount
\global\tabulatecolumn\the\tabulatecolumns\relax
\checktabulatesetups % unexpandable
\checktabulatehook % unexpandable
\ifzeropt\tabulatewidth
\ifcase\tabulatemodus\else
- \noexpand\autotabulatetrue
+ \noexpand\settrue\noexpand\tabulateautomode
\fi
\else
\ifnum\tabulatemodus=\zerocount
@@ -348,6 +409,8 @@
\bgroup
\noexpand\bbskip
\bgroup % we cannot combine the if because a cell may have only one ##
+ \noexpand\dostarttagged\noexpand\t!tabulatecell\noexpand\empty
+ \dotagtabulatealign
\noexpand#1%
\ifcase\tabulatereshape\else
\beginreshapedtabulatepar
@@ -359,10 +422,10 @@
\the\tabulatebefore
\noexpand\fi
% grouping needs to be outside macros (or expandable), nice test
- % example \NC \string & \NC which will fail otherwise (mk)
+ % example \NC \string \aligntab \NC which will fail otherwise (mk)
\bgroup
\beforetabulateentry
- ##%
+ \alignmark\alignmark
\aftertabulateentry
\egroup
\noexpand\ifnum\noexpand\tabulatetype=\plusone\noexpand\else
@@ -373,76 +436,73 @@
\endreshapedtabulatepar
\fi
\noexpand#2%
+ \noexpand\dostoptagged
\egroup
\egroup
- &\noexpand\posttabrule\hskip\postabskip##%
+ \aligntab
+ \dotabulatepostskip{\the\tabulateposskip}%
+ \alignmark\alignmark
}}%
\appendtoks\NC\to\tabulatedummy
- \let\bbskip\empty % ?
- \def\pretabskip{.5\tabulateunit}%
- \let\postabskip\pretabskip
- \let\gettabulateexit\dogettabulateexit
+ \tabulatepreskip.5\tabulateunit\relax
+ \ifnum\tabulatecolumns<\numexpr\noftabulatecolumns-\plusone\relax
+ \tabulateposskip\tabulatepreskip
+ \else
+ \tabulateposskip\zeropoint
+ \fi
+ %\let\gettabulateexit\dogettabulateexit % still needed ?
\tabulatewidth\zeropoint}
-\setvalue{\??tt>\meaning x}{\let\tabulatealign\zerocount\settabulatepreamble} % internal
-\setvalue{\??tt>\meaning l}{\let\tabulatealign\plusone\settabulatepreamble}
-\setvalue{\??tt>\meaning r}{\let\tabulatealign\plustwo\settabulatepreamble}
-\setvalue{\??tt>\meaning c}{\let\tabulatealign\plusthree\settabulatepreamble}
-\setvalue{\??tt>\meaning p}{\gettabulateparagraph}
-\setvalue{\??tt>\meaning s}{\gettabulatesetups}
-\setvalue{\??tt>\meaning w}{\gettabulatewidth}
-\setvalue{\??tt>\meaning f}{\gettabulatefont}
-\setvalue{\??tt>\meaning B}{\tabulatefont{\bf}\settabulatepreamble}
-\setvalue{\??tt>\meaning I}{\tabulatefont{\it}\settabulatepreamble}
-\setvalue{\??tt>\meaning S}{\tabulatefont{\sl}\settabulatepreamble}
-\setvalue{\??tt>\meaning T}{\tabulatefont{\tt}\settabulatepreamble}
-\setvalue{\??tt>\meaning R}{\tabulatefont{\rm}\settabulatepreamble}
-\setvalue{\??tt>\meaning m}{\tabulatebmath{$}\tabulateemath{$}\settabulatepreamble}
-\setvalue{\??tt>\meaning M}{\tabulatebmath{$\displaystyle}\tabulateemath{$}\settabulatepreamble}
-\setvalue{\??tt>\meaning h}{\gettabulatehook}
-\setvalue{\??tt>\meaning b}{\gettabulatebefore}
-\setvalue{\??tt>\meaning a}{\gettabulateafter}
-\setvalue{\??tt>\meaning i}{\gettabulatepreskip}
-\setvalue{\??tt>\meaning j}{\gettabulateposskip}
-\setvalue{\??tt>\meaning k}{\gettabulatepreposskip}
-\setvalue{\??tt>\meaning X}{\gettabulateexit} % internal
-\setvalue{\??tt>\meaning e}{\appendtoks\global\tabulateequaltrue\to\tabulatesettings\settabulatepreamble}
-\setvalue{\??tt>\meaning ~}{\appendtoks\fixedspaces\to\tabulatesettings\settabulatepreamble}
-\setvalue{\??tt>\meaning g}{\gettabulatealign}
-\setvalue{\??tt>\meaning .}{\gettabulatealign.}
-\setvalue{\??tt>\meaning ,}{\gettabulatealign,}
-
-\setvalue{\??tt>\s!unknown}{\message{unknown preamble key [\meaning\next]}\settabulatepreamble}
-\letvalue{\??tt>\meaning\relax}\donothing
+\setvalue{\??tt>\meaning x}{\let\tabulatealign\zerocount\settabulatepreamble} % internal
+\setvalue{\??tt>\meaning l}{\let\tabulatealign\plusone\settabulatepreamble}
+\setvalue{\??tt>\meaning r}{\let\tabulatealign\plustwo\settabulatepreamble}
+\setvalue{\??tt>\meaning c}{\let\tabulatealign\plusthree\settabulatepreamble}
+\setvalue{\??tt>\meaning p}{\gettabulateparagraph}
+\setvalue{\??tt>\meaning s}{\gettabulatesetups}
+\setvalue{\??tt>\meaning w}{\gettabulatewidth}
+\setvalue{\??tt>\meaning f}{\gettabulatefont}
+\setvalue{\??tt>\meaning B}{\tabulatefont{\bf}\settabulatepreamble}
+\setvalue{\??tt>\meaning I}{\tabulatefont{\it}\settabulatepreamble}
+\setvalue{\??tt>\meaning S}{\tabulatefont{\sl}\settabulatepreamble}
+\setvalue{\??tt>\meaning T}{\tabulatefont{\tt}\settabulatepreamble}
+\setvalue{\??tt>\meaning R}{\tabulatefont{\rm}\settabulatepreamble}
+\setvalue{\??tt>\meaning m}{\tabulatebmath{$}\tabulateemath{$}\settabulatepreamble}
+\setvalue{\??tt>\meaning M}{\tabulatebmath{$\displaystyle}\tabulateemath{$}\settabulatepreamble}
+\setvalue{\??tt>\meaning h}{\gettabulatehook}
+\setvalue{\??tt>\meaning b}{\gettabulatebefore}
+\setvalue{\??tt>\meaning a}{\gettabulateafter}
+\setvalue{\??tt>\meaning i}{\gettabulatepreskip}
+\setvalue{\??tt>\meaning j}{\gettabulateposskip}
+\setvalue{\??tt>\meaning k}{\gettabulatepreposskip}
+\setvalue{\??tt>\meaning e}{\appendtoks\global\settrue\tabulateequal\to\tabulatesettings\settabulatepreamble}
+\setvalue{\??tt>\meaning ~}{\appendtoks\fixedspaces\to\tabulatesettings\settabulatepreamble}
+\setvalue{\??tt>\meaning g}{\gettabulatealign}
+\setvalue{\??tt>\meaning .}{\gettabulatealign.}
+\setvalue{\??tt>\meaning ,}{\gettabulatealign,}
+\setvalue{\??tt>\meaning C}{\doparsecolortabulate}
+\setvalue{\??tt>\s!unknown }{\message{unknown preamble key [\meaning\next]}\settabulatepreamble}
+\setvalue{\??tt>\meaning\relax}{}
\def\dosettabulatepreamble
{\csname\??tt>\ifcsname\??tt>\meaning\next\endcsname\meaning\next\else\s!unknown\fi\endcsname}
-\def\dogettabulateexit
- {\let\postabskip\!!zeropoint
- \settabulatepreamble}
-
-\let\gettabulateexit\dogettabulateexit
-
\def\gettabulatepreskip#1%
{\doifnumberelse{#1}
- {\edef\pretabskip{\the\dimexpr#1\tabulateunit}\let\next\empty}
- {\edef\pretabskip{\the\dimexpr.5\tabulateunit}\def\next{#1}}%
+ {\tabulatepreskip#1\tabulateunit\let\next\empty}
+ {\tabulatepreskip.5\tabulateunit\def\next{#1}}%
\@EA\settabulatepreamble\next}
\def\gettabulateposskip#1%
{\doifnumberelse{#1}
- {\edef\postabskip{\the\dimexpr#1\tabulateunit}\let\next\empty}
- {\edef\postabskip{\the\dimexpr.5\tabulateunit}\def\next{#1}}%
- \let\gettabulateexit\settabulatepreamble
+ {\tabulateposskip#1\tabulateunit\let\next\empty}
+ {\tabulateposskip.5\tabulateunit\def\next{#1}}%
\@EA\settabulatepreamble\next}
\def\gettabulatepreposskip#1%
{\doifnumberelse{#1}
- {\edef\pretabskip{\the\dimexpr#1\tabulateunit}\let\next\empty}
- {\edef\pretabskip{\the\dimexpr.5\tabulateunit}\def\next{#1}}%
- \let\postabskip\pretabskip
- \let\gettabulateexit\settabulatepreamble
+ {\tabulatepreskip#1\tabulateunit\let\next\empty}
+ {\tabulatepreskip.5\tabulateunit\def\next{#1}}%
+ \tabulateposskip\tabulatepreskip
\@EA\settabulatepreamble\next}
\def\gettabulatesetups#1%
@@ -498,12 +558,12 @@
[#1]%
[ \v!fit=>\let\tabulatemodus\plusthree,
\v!fixed=>\let\tabulatemodus\plusthree
- \tabulatenopbreaktrue,
+ \settrue\tabulatenopbreak,
\v!auto=>\let\tabulatemodus\plusthree
\let\tabulatereshape\plusone,
\s!unknown=>\tabulatewidth#1\relax]%
\ifnum\tabulatedimen=\plusone
- \global\advance\tabulatepwidth\tabulatewidth
+ \global\advance\tabulatepwidth\tabulatewidth % accumulated parwidth
\fi
\settabulatepreamble}
@@ -545,9 +605,17 @@
\def\tabulatesetpreamblewidthsimple
{\dodosettabulatepreamble\xbskip\xeskip}
-\bgroup \catcode`\|=\@@other
+\def\doparsecolortabulate#1#2%
+ {\gdef\currenttabulatecolor{#2}%
+ \global\tabulatecolorspan\if#1L\plusone\else\if#1M\plustwo\else\if#1R\plusthree\else\zerocount\fi\fi\fi\relax
+ \settabulatepreamble}
+
+\def\dotabulatevrulecommand#1%
+ {\doifnumberelse{#1}
+ {\global\tabulatevrulethickness#1\defaulttabulatevrulethickness}
+ {\xdef\currenttabulatevrulecolor{#1}}}
-\gdef\nexttabulate#1|%
+\def\settabulateentry#1#2% rulespec template
{\let\tabulatealign\@@tabulatealign
\let\tabulatemodus\zerocount
\let\tabulatedimen\zerocount
@@ -558,9 +626,19 @@
\tabulateemath\emptytoks
\tabulatefont\emptytoks
\tabulatesettings\emptytoks
- \global\advance\tabulatecolumns\plusone
+ \global\let\currenttabulatecolor\empty
+ \global\let\currenttabulatevrulecolor\empty
+ \global\tabulatecolorspan\zerocount
+ \global\advance\tabulatecolumns\plusone % == #1
\expandafter\let\csname\??tt:s:\the\tabulatecolumns\endcsname\donothing
- \settabulatepreamble#1\relax\relax % permits i without n
+ \edef\currenttabulatetrulespec{#1}%
+ \ifx\currenttabulatetrulespec\empty
+ \global\tabulatevrulethickness\zeropoint
+ \else
+ \global\tabulatevrulethickness\defaulttabulatevrulethickness
+ \rawprocesscommalist[#1]\dotabulatevrulecommand
+ \fi
+ \settabulatepreamble#2\relax\relax % permits i without n
\ifcase\tabulatemodus\relax
\tabulatesetpreamblewidthnormal
\or % fixed width
@@ -569,27 +647,50 @@
\tabulatesetpreamblewidthauto
\or % simple
\tabulatesetpreamblewidthsimple
- \fi
- \futurelet\next\donexttabulate}
+ \fi}
-\egroup
+\def\setlasttabulateentry#1% rulespec
+ {\global\let\currenttabulatevrulecolor\empty
+ \rawprocesscommalist[#1]\dotabulatevrulecommand
+ \ifx\currenttabulatetrulespec\empty
+ \global\tabulatevrulethickness\zeropoint
+ \else
+ \global\tabulatevrulethickness\defaulttabulatevrulethickness
+ \rawprocesscommalist[#1]\dotabulatevrulecommand
+ \fi
+ \normalexpanded{\tabulatepreamble{\the\tabulatepreamble
+ \dochecklocaltabulatevrulecolor{\currenttabulatevrulecolor}{\the\tabulatevrulethickness}%
+ \dotabulatevrule}}}
-\def\donexttabulate
- {\ifx\next\relax\else
- \expandafter\nexttabulate
+\def\donormalizetabulatesplitline
+ {\ifcase\tabulatesplitlinemode
+ % nothing
+ \or
+ \ht\tabulatebox\strutht
+ \dp\tabulatebox\strutdp
+ \or
+ \ifdim\ht\tabulatebox<\strutht
+ \ht\tabulatebox\strutht
+ \fi
+ \ifdim\dp\tabulatebox<\strutdp
+ \dp\tabulatebox\strutdp
+ \fi
\fi}
-\def\splitofftabulatebox % overloaded in anch-pgr
+\def\flushtabulatesplitbox
+ {\box\tabulatebox}
+
+\def\splitofftabulatebox % overloads in anch-pgr
{\dontcomplain
\global\setbox\tabulatebox % % % global ? % % %
\vsplit\tablebox\tabulatecolumn to \lineheight
\setbox\tabulatebox\normalvbox
{\unvbox\tabulatebox}%
\setbox\tabulatebox\hbox to \wd\tabulatebox
- {\hss\dotabulatehook{\box\tabulatebox}\hss}%
- \ht\tabulatebox\strutht
- \dp\tabulatebox\strutdp
- \box\tabulatebox}
+ {\iftrialtypesetting\else\ifconditional\tabulatehascolors\repeatsettabulatecolor\fi\fi
+ \hss\dotabulatehook{\box\tabulatebox}\hss}%
+ \donormalizetabulatesplitline
+ \flushtabulatesplitbox}
\def\dotabulatehook {\csname\??tt:h:\the\tabulatecolumn\endcsname}
\def\dotabulatealign{\csname\??tt:a:\the\tabulatecolumn\endcsname}
@@ -610,25 +711,9 @@
\global\tabulatemaxpheight\scratchdimen
\fi}
-% \def\handletabulatepbreak
-% {\TABLEnoalign
-% {\ifhandletabulatepbreak
-% \iftabulatenopbreak
-% \dotabulatenobreak
-% \else\ifnum\tabulatemaxplines>\plusone
-% \ifnum\tabulateminplines=\plusone
-% \dotabulatenobreak
-% \fi
-% \global\advance\tabulateminplines\plusone
-% \ifnum\tabulateminplines=\tabulatemaxplines\relax
-% \dotabulatenobreak
-% \fi
-% \fi \fi
-% \fi}}
-
\def\dohandletabulatepbreak
- {\ifhandletabulatepbreak
- \iftabulatenopbreak
+ {\ifconditional\tabulatehandlepbreak
+ \ifconditional\tabulatenopbreak
\dotabulatenobreak
\else\ifnum\tabulatemaxplines>\plusone
\ifnum\tabulateminplines=\plusone
@@ -642,7 +727,7 @@
\fi}
\def\handletabulatepbreak
- {\TABLEnoalign{\dohandletabulatepbreak}}
+ {\tabulatenoalign{\dohandletabulatepbreak}}
%D \startbuffer
%D \starttabulate[|c|p|p|]
@@ -675,12 +760,10 @@
% \starttabulate[preamble]
% \starttabulate -> \starttabulate[|l|p|]
-\bgroup \catcode`\|=\@@other
-
-\gdef\definetabulate
+\def\definetabulate
{\dotripleempty\dodefinetabulate}
-\gdef\dodefinetabulate[#1][#2][#3]%
+\def\dodefinetabulate[#1][#2][#3]%
{\ifthirdargument
\ifcsname\??tt#1::\c!unit\endcsname \else
\copyparameters
@@ -691,35 +774,31 @@
\fi
\copyparameters
[\??tt#1::#2][\??tt#1::]%
- [\c!unit,\c!distance,\c!before,\c!bodyfont,\c!after,
- \c!inner,\c!indenting,\c!frame,\c!split,\c!header,\c!title,
- \c!margin,\c!align,\c!rulecolor,\c!rulethickness,EQ]%
- \setvalue{\e!start#1::#2}{\dofinalstarttabulate[#1][#2][#3]}%
- \setvalue{\e!start#1}{\bgroup\dosubstarttabulate[#1]}%
- \letvalue{\??tt#1-\v!header}\empty
- \letvalue{\??tt#1-\v!footer }\empty
+ [\c!frame,\c!distance,\c!unit,\c!before,\c!bodyfont,\c!after,
+ \c!inner,\c!indenting,\c!margin,\c!align,\c!header,\c!title,
+ \c!rulecolor,\c!rulethickness,\c!split,EQ]%
+ \setuvalue{\e!start#1::#2}{\dofinalstarttabulate[#1][#2][#3]}%
+ \setuvalue{\e!start#1}{\bgroup\dosubstarttabulate[#1]}%
+ \letvalueempty{\??tt#1-\v!header}%
+ \letvalueempty{\??tt#1-\v!footer}%
\else\ifsecondargument
\definetabulate[#1][][#2]%
\else
\definetabulate[#1][][|l|p|]%
\fi\fi}
-\egroup
-
\let\tabulateheadcontent\empty
\let\tabulatetailcontent\empty
-\newconditional\tabulatesomeamble
-
\def\processtabulateheadcontent
- {\TABLEnoalign{\global\settrue\tabulatesomeamble}%
+ {\tabulatenoalign{\global\settrue\tabulatesomeamble}%
\csname\??tt\currenttabulate-\v!header\endcsname
- \TABLEnoalign{\global\setfalse\tabulatesomeamble}}%
+ \tabulatenoalign{\global\setfalse\tabulatesomeamble}}%
\def\processtabulatetailcontent
- {\TABLEnoalign{\global\settrue\tabulatesomeamble}%
+ {\tabulatenoalign{\global\settrue\tabulatesomeamble}%
\csname\??tt\currenttabulate-\v!footer\endcsname
- \TABLEnoalign{\global\setfalse\tabulatesomeamble}}%
+ \tabulatenoalign{\global\setfalse\tabulatesomeamble}}%
\def\checkfulltabulatecontent % - needed, else confusion with \c!header
{\ifcsname\??tt\currenttabulate-\v!header\endcsname
@@ -733,11 +812,6 @@
\let\tabulatetailcontent\empty
\fi}
-% \def\fulltabulatecontent
-% {\tabulateheadcontent
-% \tabulatecontent
-% \tabulatetailcontent}
-
\def\fulltabulatecontent
{\tabulateheadcontent
\tabulatecontent
@@ -747,17 +821,17 @@
\def\removefunnytabulateline
{\ifhmode
\strut\crcr
- \TABLEnoalign{\kern-\lineheight}%
+ \tabulatenoalign{\kern-\lineheight}%
\fi}
-\setvalue{\e!start\v!tabulatehead}%
+\setuvalue{\e!start\v!tabulatehead}%
{\dosingleempty\dostartstarttabulatehead}
\def\dostartstarttabulatehead[#1]%
{\processcontent{\e!stop\v!tabulatehead}\next
{\letvalue{\??tt\iffirstargument#1\else\v!tabulate\fi::-\v!header}\next}}
-\setvalue{\e!start\v!tabulatetail}%
+\setuvalue{\e!start\v!tabulatetail}%
{\dosingleempty\dostartstarttabulatetail}
\def\dostartstarttabulatetail[#1]%
@@ -770,10 +844,21 @@
\def\dodosubstarttabulate[#1][#2]%
{\csname\e!start#1::\ifcsname\e!start#1::#2\endcsname#2\fi\endcsname}
-\setvalue{\e!start\v!tabulate}%
+\setuvalue{\e!start\v!tabulate}%
{\bgroup\dodoubleempty\donormalstarttabulate}
-\bgroup
+\def\doinhibitnestedtabulate
+ {\setuvalue{\e!start\v!tabulate}%
+ {\em Nested tabulate is not (yet) supported.\relax
+ \expandafter\gobbleuntil\csname\e!stop\v!tabulate\endcsname}}
+
+\appendtoks
+ \doinhibitnestedtabulate
+\to \everytabulate
+
+\setuvalue{\e!stop\v!tabulate }{}
+\setuvalue{\e!stop\v!tabulatehead}{}
+\setuvalue{\e!stop\v!tabulatetail}{}
\gdef\donormalstarttabulate[#1][#2]%
{\ifsecondargument
@@ -786,67 +871,18 @@
\fi
\next}
-\egroup
-
-% The much neede hook:
-
-\newtoks\everytabulate
-
-% An example of its usage:
-
-\appendtoks \optimizeverbatimfalse \to \everytabulate
-\appendtoks \let\recodeverbatimmode\plustwo \to \everytabulate
+% The much needed hook:
-% A status variable:
+% \appendtoks \optimizeverbatimfalse \to \everytabulate
-\chardef\tabulatepass=0
+% Todo: proper inheritance
\def\tabulateparameter#1{\csname\??tt\currenttabulate#1\endcsname}
-\bgroup
- \catcode`\|=\@@other \gdef\@@otherbar{|}
- \catcode`\|=\@@active \gdef\@@useotherbar{\let|\@@otherbar}
-\egroup
-
-\def\doparsetabulate
- {\futurelet\next\dodoparsetabulate}
-
-% \def\dodoparsetabulate % \@EAEAEA gebruiken
-% {\ifx\next\relax
-% % exit
-% \else\ifx*\next
-% \let\next\dorepeatparsetabulate
-% \else\ifx\bgroup\next
-% \let\next\dododoparsetabulate
-% \else
-% \let\next\dodododoparsetabulate
-% \fi\fi\fi
-% \next}%
-
-\def\dorepeatparsetabulate*#1#2%
- {\dorecurse{#1}{\!!toksb\expandafter{\the\!!toksb#2}}% \dorecurse{#1}{\appendtoks#2\to\!!toksb}%
- \doparsetabulate}
-
-\def\dododoparsetabulate#1%
- {\!!toksb\expandafter{\the\!!toksb{#1}}% \appendtoks{#1}\to\!!toksb
- \doparsetabulate}
-
-\def\dodododoparsetabulate#1%
- {\!!toksb\expandafter{\the\!!toksb#1}% \appendtoks#1\to\!!toksb
- \doparsetabulate}
-
-\letvalue{\??tt<\meaning *}\dorepeatparsetabulate
-\letvalue{\??tt<\meaning \bgroup}\dododoparsetabulate
-\letvalue{\??tt<\meaning \relax}\donothing
-\letvalue{\??tt<\s!unknown }\dodododoparsetabulate
-
-\def\dodoparsetabulate
- {\csname\??tt<\ifcsname\??tt<\meaning\next\endcsname\meaning\next\else\s!unknown\fi\endcsname}
-
-\setvalue{\??tt:\c!split:\v!yes }{\splittabulatetrue}
-\setvalue{\??tt:\c!split:\v!repeat}{\splittabulatetrue}
-\setvalue{\??tt:\c!split:\v!no }{\splittabulatefalse}
-\setvalue{\??tt:\c!split:\v!auto }{\ifinsidefloat\ifinsidesplitfloat\else\splittabulatefalse\fi\fi}
+\setvalue{\??tt:\c!split:\v!yes }{\settrue\tabulatesplit}
+\setvalue{\??tt:\c!split:\v!repeat}{\settrue\tabulatesplit}
+\setvalue{\??tt:\c!split:\v!no }{\setfalse\tabulatesplit}
+\setvalue{\??tt:\c!split:\v!auto }{\ifinsidefloat\ifinsidesplitfloat\else\setfalse\tabulatesplit\fi\fi}
\def\dofinalstarttabulate[#1][#2][#3]% identifier sub preamble
{\edef\currenttabulate{#1::#2}%
@@ -858,12 +894,12 @@
\resetcharacteralign
% todo: spacing around tabulate when bodyfont is set
% expansion en test needed ?
- \splittabulatetrue
+ \settrue\tabulatesplit
\csname\??tt:\c!split:\tabulateparameter\c!split\endcsname
\doifvaluesomething{\??tt\currenttabulate\c!bodyfont}
{\expanded{\switchtobodyfont[\tabulateparameter\c!bodyfont]}}%
\postponenotes % new, to be tested / will be configurable
- \let\tabulatepass\plusone
+ \tabulatepass\plusone
\widowpenalty\zerocount % otherwise lines are not broken
\clubpenalty \zerocount % but overlap in funny ways
\the\everytabulate
@@ -872,42 +908,146 @@
{\edef\tabulateindent{\the\dimexpr\leftskip+\hangindent+\parindent}}% \ctxparindent
{\edef\tabulateindent{\the\dimexpr\leftskip+\hangindent }}%
\global\tabulatecolumn\zerocount
- \!!toksb\emptytoks
- \bgroup
- \@@useotherbar
- \normalexpanded{\egroup\noexpand\doparsetabulate#3\relax}%
- \processcontent
- {\e!stop#1}% \currenttabulate}
- \tabulatecontent
- {\@EA\processtabulate\@EA[\the\!!toksb]}}
+ \processcontent{\e!stop#1}\tabulatecontent{\processtabulate[#3]}} % \currenttabulate
-\chardef\tabulatetype=0
+\def\tabulateEQ
+ {\ifconditional\tabulatefirstflushed\else\tabulateparameter{EQ}\fi
+ \global\setfalse\tabulateequal}
-% 0 = NC column next EQ equal column
-% 1 = RC column raw RQ equal column raw
-% 2 = HC column hook HQ equal column hook
+% The next ones will be token registers
-\newif\iftabulatefirstflushed
+\let\tabulatenormalpos\relax
+\let\tabulateequalpos \relax
-\def\tabulateEQ
- {\iftabulatefirstflushed\else\tabulateparameter{EQ}\fi
- \global\tabulateequalfalse}
+% color columns
-% \def\tabulatenormalcolumn#1%
-% {&\iftabulateequal\tabulateEQ\fi&\global\chardef\tabulatetype#1&}
-%
-% \def\tabulateequalcolumn#1%
-% {&\tabulateEQ&\global\chardef\tabulatetype#1&}
-%
-% however, \unskip en \ignorespaces permit usage in complex XML/\starttabulate
+\glet\previoustabulatecolor \empty
+\glet\currenttabulatecolor \empty
+\glet\currenttabulatelocalcolor \empty
+\glet\currenttabulatevrulecolor \empty
+\glet\currenttabulatelocalvrulecolor\empty
+
+\appendtoks
+ \glet\previoustabulatecolor \empty
+ \glet\currenttabulatecolor \empty
+ \glet\currenttabulatelocalcolor \empty
+ \glet\currenttabulatevrulecolor \empty
+ \glet\currenttabulatelocalvrulecolor\empty
+ \global\tabulatelocalvrulethickness \zeropoint
+\to \everytabulaterow
+
+\unexpanded\def\dorightsidetabulatecolor
+ {\iftrialtypesetting\else
+ \ifx\previoustabulatecolor\empty \else
+ \settabulatecolor\previoustabulatecolor
+ \glet\previoustabulatecolor\empty
+ \fi
+ \fi}
+
+\unexpanded\def\doleftsidetabulatecolor
+ {\iftrialtypesetting\else
+ \ifx\currenttabulatecolor\empty \else
+ \ifcase\tabulatecolorspan
+ \or
+ \settabulatecolor\currenttabulatecolor
+ \or
+ \settabulatecolor\currenttabulatecolor
+ \fi
+ \fi
+ \fi}
+
+\unexpanded\def\dobothsidetabulatecolor
+ {\iftrialtypesetting\else
+ \ifx\currenttabulatecolor\empty \else
+ \settabulatecolor\currenttabulatecolor
+ \ifcase\tabulatecolorspan
+ %\glet\previoustabulatecolor\empty
+ \or
+ \glet\previoustabulatecolor\empty
+ \or
+ \glet\previoustabulatecolor\currenttabulatecolor
+ \or
+ \glet\previoustabulatecolor\currenttabulatecolor
+ \fi
+ \fi
+ \fi}
+
+\def\tabulatecolorcolumn#1% overloaded
+ {\unskip
+ \doiffastoptionalcheckelse{\tabulatecolorcolumnyes#1}{\tabulatecolorcolumnnop#1}}
+
+\def\tabulatecolorcolumnnop
+ {\tabulatenormalcolumn}
+
+\def\tabulatecolorcolumnyes#1[#2]%
+ {\xdef\currenttabulatelocalcolor{#2}%
+ \tabulatenormalcolumn#1}
+
+% normal columns:
\def\tabulatenormalcolumn#1%
- {\unskip&\iftabulateequal\tabulateEQ\fi&\global\chardef\tabulatetype#1&%
- \ignorespaces}
+ {\unskip
+ \aligntab
+ \ifconditional\tabulateequal\tabulateequalpos\else\tabulatenormalpos\fi
+ \aligntab
+ \global\tabulatetype#1%
+ \aligntab}
+
+% equal columns
+
+\def\tabulateequalcolumn#1% overloaded
+ {\unskip
+ \aligntab
+ \tabulateequalpos
+ \aligntab\global\tabulatetype#1%
+ \aligntab}
+
+% ruled columns
+
+\def\tabulatevruledcolumn#1%
+ {\unskip % 0-n
+ \ifnum\tabulatecolumn=\plusone
+ \global\tabulatehasfirstrulespec\plusone
+ \else\ifnum\tabulatecolumn=\noftabulatecolumns
+ \global\tabulatehaslastrulespec\plusone
+ \fi\fi
+ \global\let\currenttabulatelocalvrulecolor\defaulttabulatevrulecolor
+ \global\tabulatelocalvrulethickness\defaulttabulatevrulethickness
+ \doiffastoptionalcheckelse{\tabulatevruledcolumnyes#1}{\tabulatevruledcolumnnop#1}}
+
+\def\tabulatevruledcolumnnop
+ {\tabulatenormalcolumn}
+
+\def\dotabulatevrulelocalcommand#1%
+ {\doifnumberelse{#1}
+ {\global\tabulatelocalvrulethickness#1\defaulttabulatevrulethickness}
+ {\xdef\currenttabulatelocalvrulecolor{#1}}}
+
+\def\tabulatevruledcolumnyes#1[#2]%
+ {\rawprocesscommalist[#2]\dotabulatevrulelocalcommand
+ \tabulatenormalcolumn#1}
+
+\def\donormaltabulatevrule
+ {\vrule\!!width\tabulatevrulethickness\relax}
+
+\def\docoloredtabulatevrule
+ {\faststartcolor[\currenttabulatevrulecolor]%
+ \vrule\!!width\tabulatevrulethickness\relax
+ \faststopcolor}
+
+\unexpanded\def\dotabulatevrule
+ {\ifcase\tabulatevrulethickness\else
+ \iftrialtypesetting
+ \donormaltabulatevrule
+ \else\ifx\currenttabulatevrulecolor\empty
+ \donormaltabulatevrule
+ \else
+ \docoloredtabulatevrule
+ \fi\fi
+ \fi
+ \global\tabulatevrulethickness\zeropoint} % nils second one
-\def\tabulateequalcolumn#1%
- {\unskip&\tabulateEQ&\global\chardef\tabulatetype#1&%
- \ignorespaces}
+% auto columns
\def\tabulateautocolumn
{\tabulatenormalcolumn\zerocount
@@ -921,52 +1061,164 @@
{\let#1\tabulateautocolumn
\let\\\tabulateautocolumn}
-\def\dotabulateruleseperator % can be sped up (will do when used frequently)
+\setvalue{\??tt:rs:\v!blank }{\tabulateseparatorskip\bigskipamount}
+\setvalue{\??tt:rs:\v!depth }{\tabulateseparatorskip\strutdp}
+\setvalue{\??tt:rs:\v!small }{\def\factor{.25}}
+\setvalue{\??tt:rs:\v!medium}{\def\factor{.5}}
+\setvalue{\??tt:rs:\v!big }{}
+\setvalue{\??tt:rs:\v!none }{\tabulateseparatorskip\zeropoint\def\factor{0}}
+\setvalue{\??tt:rs:\v!grid }{\tabulateseparatorskip\zeropoint\def\factor{0}}
+
+\def\dodotabulateruleseparator#1%
+ {\ifcsname\??tt:rs:#1\endcsname
+ \csname\??tt:rs:#1\endcsname
+ \else
+ \tabulateseparatorskip#1\relax
+ \fi}
+
+\def\dotabulateruleseparator % can be sped up (will do when used frequently)
{\bgroup
- \let\factor\!!plusone
- \scratchskip\strutdp
- \ExpandFirstAfter\processallactionsinset
- [\tabulateparameter\c!distance]
- [ \v!blank=>\scratchskip\bigskipamount,
- \v!depth=>\scratchskip\strutdp,
- \v!small=>\def\factor{.25},
- \v!medium=>\def\factor{.5},
- \v!big=>,
- \v!none=>\scratchskip\zeropoint\def\factor{0},
- \v!grid=>\scratchskip\zeropoint\def\factor{0},
- \s!unknown=>\scratchskip\commalistelement]%
- \scratchdimen\factor\scratchskip
- \ifconditional\tabulatesomeamble\kern\else\vskip\fi\scratchdimen % new
+ \edef\tabulateseparatordistance{\tabulateparameter\c!distance}%
+ \tabulateseparatorskip\strutdp
+ \ifx\tabulateseparatordistance\empty\else
+ \let\factor\!!plusone
+ \normalexpanded{\processcommalist[\tabulateparameter\c!distance]}\dodotabulateruleseparator
+ \tabulateseparatorskip\factor\tabulateseparatorskip
+ \fi
+ \ifconditional\tabulatesomeamble\kern\else\vskip\fi\tabulateseparatorskip % new
\egroup}
-\def\dodotabulaterule#1%
- {\color
- [\tabulateparameter\c!rulecolor]
- {\scratchdimen\tabulateparameter\c!rulethickness#1}}
+\def\tabulateignorehrulespec#1%
+ {%\global\let\currenttabulatelocalhrulecolor\empty
+ %\global\tabulatelocalhrulethickness\defaulttabulatehrulethickness
+ \doiffastoptionalcheckelse#1#1}
+
+\def\tabulatepickuphrulespec#1%
+ {\global\let\currenttabulatelocalhrulecolor\defaulttabulatehrulecolor
+ \global\tabulatelocalhrulethickness\defaulttabulatehrulethickness
+ \doiffastoptionalcheckelse{\tabulatepresethrule#1}#1}
+
+\def\dotabulatehrulelocalcommand#1%
+ {\doifnumberelse{#1}
+ {\global\tabulatelocalhrulethickness#1\defaulttabulatehrulethickness}
+ {\xdef\currenttabulatelocalhrulecolor{#1}}}
+
+\def\tabulatepresethrule#1[#2]%
+ {\rawprocesscommalist[#2]\dotabulatehrulelocalcommand
+ #1}
+
+\def\donormaltabulatehrule
+ {\hrule
+ \!!height.5\tabulatelocalhrulethickness
+ \!!depth .5\tabulatelocalhrulethickness
+ \relax}
+
+\def\docoloredtabulatehrule
+ {\faststartcolor[\currenttabulatelocalhrulecolor]%
+ \donormaltabulatehrule
+ \faststopcolor}
+
+\unexpanded\def\dotabulatehrule
+ {\ifcase\tabulatelocalhrulethickness\else
+ \iftrialtypesetting % does not happen as we nil the caller
+ \donormaltabulatehrule
+ \else\ifx\currenttabulatelocalhrulecolor\empty
+ \donormaltabulatehrule
+ \else
+ \docoloredtabulatehrule
+ \fi\fi
+ \fi}
+
+\def\donormaltabulatehlinerule
+ {\leaders \hrule
+ \!!height\dimexpr.5\lineheight-\strutdepth
+ \!!depth-\dimexpr.5\lineheight-\strutdepth+\tabulatelocalhrulethickness
+ \hfill}
-\def\dotabulaterule
- {\dodotabulaterule
- {\hrule\!!height.5\scratchdimen\!!depth.5\scratchdimen\relax
- \doifvalue{\??tt\currenttabulate\c!distance}\v!grid
- {\kern-\scratchdimen}}} % experimental tm-prikkels
+\def\docoloredtabulatehlinerule
+ {\faststartcolor[\currenttabulatelocalhrulecolor]%
+ \donormaltabulatehlinerule
+ \faststopcolor}
\def\dotabulatelinerule
{\multispan\totaltabulatecolumns % \multispan is a plain macro
% for the moment this one
\strut\hskip\tabulateparameter\c!margin
% neg values are ok !
- \hskip\tabulateindent % new august 2003
- \dodotabulaterule
- {\!!heighta.5\lineheight
- \advance\!!heighta-\strutdepth
- \!!deptha-\!!heighta
- \advance\!!deptha\scratchdimen
- \leaders\hrule\!!height\!!heighta\!!depth\!!deptha\hfill}%
+ \hskip\tabulateindent\relax % new august 2003
+ \ifcase\tabulatelocalhrulethickness\else
+ \iftrialtypesetting % does not happen as we nil the caller
+ \donormaltabulatehlinerule
+ \else\ifx\currenttabulatelocalhrulecolor\empty
+ \donormaltabulatehlinerule
+ \else
+ \docoloredtabulatehlinerule
+ \fi\fi
+ \fi
\cr}
-%D When set to true, no (less) break optimization is done.
+%D Color:
+
+% \starttabulate[||p||]
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC[green] \input tufte \NC[yellow] test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC[blue] test \NC[red] test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC[gray] test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC[blue] test \NC test \NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC test \NC[magenta] test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC[cyan] \dorecurse{10}{\input ward }\NC test \NC \NR
+% \NC test \NC test \NC test \NC \NR
+% \NC test \NC[yellow] test \NC test \NC \NR
+% \stoptabulate
+
+\unexpanded\def\settabulatecolor#1% we could store the attributes at the cost of a lua call
+ {\begingroup
+ \doinitializeboxbackgrounds
+ \global\settrue\tabulatehascolors
+ \ifnum\tabulatecolumn>\maxtabularcolorcolumn
+ \global\maxtabularcolorcolumn\tabulatecolumn
+ \fi
+ \setxvalue{\??tt:c:\the\tabulatecolumn}{#1}%
+ \attribute\backgroundattribute\plusone
+ \faststartcolor[#1]\strut\char0\faststopcolor
+ \endgroup}
+
+\def\repeatsettabulatecolor
+ {\begingroup
+ \ifcsname\??tt:c:\the\tabulatecolumn\endcsname
+ \attribute\backgroundattribute\plusone
+ \faststartcolor[\csname\??tt:c:\the\tabulatecolumn\endcsname]\strut\char0\faststopcolor
+ \fi
+ \endgroup}
+
+\def\resettabulatecolors
+ {\ifcase\maxtabularcolorcolumn\else
+ \doresettabulatecolors
+ \fi}
+
+\def\doresettabulatecolors
+ {\dorecurse\maxtabularcolorcolumn{\letgvalue{\??tt:c:\recurselevel}\undefined}} % slow
+
+\appendtoks
+ \resettabulatecolors
+\to \everyaftertabulaterow
+
+\appendtoks
+ \global\setfalse\tabulatehascolors
+\to \everytabulate
-\newif\iftolerantTABLEbreak % used in styles !
+%D When set to true, no (less) break optimization is done.
%D The main processing macro is large but splitting it up
%D would make things less clear.
@@ -987,8 +1239,6 @@
\glet\registertabulateparoptions\doregistertabulateparoptions
\to \everytabulate
-\newtoks\everytabulaterow
-
\appendtoks
\registertabulateparoptions
\to \everytabulaterow
@@ -1014,12 +1264,6 @@
%D cum suis, since \TEX's hard coded noalign lookahead fails
%D on it! I mistakenly added this for a while.
-\chardef\tabulaterepeathead\zerocount
-
-\newcount\noftabulatelines
-\newcount\totalnoftabulatelines
-\newcount\minusnoftabulatelines
-
\setvalue{\??tt:\c!align:\v!normal}{0}
\setvalue{\??tt:\c!align:\v!right }{1}
\setvalue{\??tt:\c!align:\v!left }{2}
@@ -1028,8 +1272,6 @@
\setvalue{\??tt:\c!header:\v!repeat}{\plusone}
\setvalue{\??tt:\c!header:\v!text }{\plustwo}
-\newtoks\everyaftertabulaterow
-
\def\tabulatebskipone {\setbox\tabulatebox\vbox\bgroup\glet\tabulatehook\notabulatehook}
\def\tabulateeskipone {\par\egroup\glet\tabulatehook\dotabulatehook}
\def\tabulatexbskipone{\hbox\bgroup\vbox\bgroup\glet\tabulatehook\notabulatehook}
@@ -1037,32 +1279,38 @@
\def\tabulatebaselinecorrection
{\def\dobaselinecorrection % todo: mkiv
- {\vskip-\prevdepth
- \vskip\strutdp
- \vskip\strutdp}%
+ {\vskip-\prevdepth+\strutdp+\strutdp\relax}%
\baselinecorrection}
-\unexpanded\def\tabulateNCone{\tabulatenormalcolumn0}
-\unexpanded\def\tabulateRCone{\tabulatenormalcolumn1}
-\unexpanded\def\tabulateHCone{\tabulatenormalcolumn2}
-\unexpanded\def\tabulateEQone{\tabulateequalcolumn 0}
-\unexpanded\def\tabulateRQone{\tabulateequalcolumn 1}
-\unexpanded\def\tabulateHQone{\tabulateequalcolumn 2}
+\unexpanded\def\tabulateVLone{\tabulatevruledcolumn\zerocount}
+\unexpanded\def\tabulateNCone{\tabulatenormalcolumn\zerocount}
+\unexpanded\def\tabulateRCone{\tabulatenormalcolumn\plusone}
+\unexpanded\def\tabulateHCone{\tabulatenormalcolumn\plustwo}
+\unexpanded\def\tabulateEQone{\tabulateequalcolumn \zerocount}
+\unexpanded\def\tabulateRQone{\tabulateequalcolumn \plusone}
+\unexpanded\def\tabulateHQone{\tabulateequalcolumn \plustwo}
\unexpanded\def\tabulateNGone{\NC\handletabulatecharalign}
\unexpanded\def\tabulateNNone{\NC\handletabulatedigits} % new, undocumented, test first
\unexpanded\def\tabulateNDone{\NC\handletabulatedigits} % same, for old times sake
+
\unexpanded\def\tabulateHRone{\doHR\zerocount}
-\unexpanded\def\tabulateHLone{\doHL\zerocount}
+
+\unexpanded\def\tabulateCCone{\global\tabulatelocalcolorspan\zerocount\tabulatecolorcolumn\zerocount}
+\unexpanded\def\tabulateCLone{\global\tabulatelocalcolorspan\plusone \tabulatecolorcolumn\zerocount}
+\unexpanded\def\tabulateCMone{\global\tabulatelocalcolorspan\plustwo \tabulatecolorcolumn\zerocount}
+\unexpanded\def\tabulateCRone{\global\tabulatelocalcolorspan\plusthree\tabulatecolorcolumn\zerocount}
\unexpanded\def\tabulateNRone % next row
{\global\advance\noftabulatelines\plusone
- \global\tabulatefirstflushedfalse
- \global\tabulateequalfalse
+ \global\setfalse\tabulatefirstflushed
+ \global\setfalse\tabulateequal
\global\tabulatecolumn\zerocount
\resettabulatepheight
\unskip\unskip\crcr\flushtabulated
- \TABLEnoalign{\the\everyaftertabulaterow}%
- \TABLEnoalign{\checktabulatepenaltiesa}}
+ \starttabulatenoalign
+ \the\everyaftertabulaterow
+ \checktabulatepenaltiesa
+ \stoptabulatenoalign}
\def\checktabulatepenaltiesa
{\iftolerantTABLEbreak\else
@@ -1085,7 +1333,7 @@
\fi\fi
\fi
\fi
- \global\tabulatefirstflushedfalse}
+ \global\setfalse\tabulatefirstflushed}
\def\tabulatebbskiptwo
{\ifvoid\tablebox\tabulatecolumn
@@ -1102,15 +1350,17 @@
\def\tabulatebskiptwo
{\ifvoid\tablebox\tabulatecolumn
+ % first line
\global\setbox\tablebox\tabulatecolumn\vbox
\bgroup
\glet\tabulatehook\notabulatehook
- \ifautotabulate\hsize\tabulatewidth\fi
+ \ifconditional\tabulateautomode\hsize\tabulatewidth\fi
% \begstrut % interferes with pre-\pars
% evt: \appendtoks\begstrut\to\everypar
\ignorespaces
\let\eskip\tabulatebskiptwoeskip
\else
+ % successive lines
\let\eskip\empty
\dontcomplain
\glet\tabulatehook\dotabulatehook
@@ -1120,18 +1370,6 @@
\def\tabulatexbskiptwo{\bskip}
\def\tabulatexeskiptwo{\eskip}
-% \def\tabulateflushtabulatedtwo
-% {\TABLEnoalign % noalign % no interference !
-% {\glet\flushtabulatedindeed\empty
-% \global\tabulatecolumn\zerocount
-% \handletabulatepbreak
-% \dorecurse\tabulatecolumns % was: \noftabcolumns
-% {\ifvoid\tablebox\recurselevel\else
-% \gdef\flushtabulatedindeed{\the\tabulatedummy}%
-% \fi}%
-% \global\tabulatefirstflushedtrue}%
-% \flushtabulatedindeed}
-
\def\dotabulateflushtabulatedtwo
{\glet\flushtabulatedindeed\empty
\global\tabulatecolumn\zerocount
@@ -1140,15 +1378,15 @@
{\ifvoid\tablebox\recurselevel\else
\gdef\flushtabulatedindeed{\the\tabulatedummy}%
\fi}%
- \global\tabulatefirstflushedtrue}
+ \global\settrue\tabulatefirstflushed}
\def\tabulateflushtabulatedtwo
- {\TABLEnoalign{\dotabulateflushtabulatedtwo}%
+ {\tabulatenoalign{\dotabulateflushtabulatedtwo}%
\flushtabulatedindeed}
\def\tabulatebskipthree
{\vtop\bgroup
- \ifautotabulate\hsize\tabulatewidth\fi
+ \ifconditional\tabulateautomode\hsize\tabulatewidth\fi
% \begstrut % interferes with pre-\pars
% evt: \appendtoks\begstrut\to\everypar
\ignorespaces}
@@ -1156,49 +1394,6 @@
\def\tabulateeskipthree % vertical strut added august 2003
{\par\verticalstrut\vskip-\struttotal\egroup}
-\def\tabulatedoHLfour#1% #1 ignored
- {\TABLEnoalign
- {\csname
- \ifnum\noftabulatelines=\zerocount F\else
- \ifnum\noftabulatelines=\totalnoftabulatelines L\else
- M\fi\fi
- L\endcsname}}%
-
-\def\tabulatedoHRfour#1% horizontal rule line (break untested)
- {\TABLEnoalign
- {\globallet\TABLEautoline\dotabulatelinerule
- \ifcase#1\or
- \ifnum\noftabulatelines=\zerocount
- \gdef\TABLEautoline{\TABLEnoalign{}}%
- \else\ifnum\noftabulatelines=\totalnoftabulatelines
- \gdef\TABLEautoline{\TABLEnoalign{}}%
- \fi\fi
- \fi
- \dotabulatenobreak}%
- \TABLEautoline
- \TABLEnoalign
- {\nobreak
- \ifx\TABLEautoline\dotabulatelinerule\kern-\lineheight\fi
- \ifnum\noftabulatelines=\totalnoftabulatelines
- \@EA\dotabulatenobreak
- \else
- \@EA\allowbreak
- \fi}%
- \TABLEautoline
- \TABLEnoalign
- {\dotabulatenobreak}}
-
-\def\tabulateFLfive{\TABLEnoalign
- {\ifinsidefloat\else
- \doifemptyvalue{\??tt\currenttabulate\c!before} % no expansion
- {\tabulatebaselinecorrection}%
- \fi
- \dotabulaterule
- \dotabulatenobreak
- \dotabulateruleseperator
- \prevdepth\strutdp
- \dotabulatenobreak}}
-
% see ***
%
% \enabletrackers[nodes.page_vspacing]
@@ -1206,52 +1401,163 @@
% \starttabulate[||] \dorecurse{100}{\NC Eins \NC \NR \HL} \stoptabulate
% \stoptext
-\def\tabulateMLfive{\TABLEnoalign
- {\dotabulateruleseperator
- \dotabulaterule
- \ifnum\noftabulatelines>\plusone
- \ifnum\noftabulatelines<\minusnoftabulatelines
- % *** somehow topskip messes up as it's intercepted
- % \vskip \topskip\allowbreak\vskip- \topskip
- % messy anyhow so this needs to be improved, so for
- % the momenet we keep this bugged variant
- \vskip1\topskip\allowbreak\vskip-1\topskip
- \vskip-\tabulateparameter\c!rulethickness
- \dotabulaterule
- \fi
- \fi
- \dotabulateruleseperator}}
+% old crap:
+%
+% \ifnum\noftabulatelines>\plusone
+% \ifnum\noftabulatelines<\minusnoftabulatelines
+% % *** somehow topskip messes up as it's intercepted
+% % \vskip \topskip\allowbreak\vskip- \topskip
+% % messy anyhow so this needs to be improved, so for
+% % the moment we keep this bugged variant
+% \vskip1\topskip
+% \allowbreak
+% \vskip-1\topskip
+
+\def\tabulateXXnone{\starttabulatenoalign\tabulateignorehrulespec\stoptabulatenoalign}
+
+\def\tabulateFLfive{\starttabulatenoalign\tabulatepickuphrulespec\dotabulateFLfive}
+\def\tabulateMLfive{\starttabulatenoalign\tabulatepickuphrulespec\dotabulateMLfive}
+\def\tabulateLLfive{\starttabulatenoalign\tabulatepickuphrulespec\dotabulateLLfive}
+\def\tabulateTLfive{\starttabulatenoalign\tabulatepickuphrulespec\dotabulateTLfive}
+\def\tabulateBLfive{\starttabulatenoalign\tabulatepickuphrulespec\dotabulateBLfive}
+%def\tabulateHLfive{\starttabulatenoalign\tabulatepickuphrulespec\dotabulateHLfive}
+
+% we can use one common spec: (saves 4 macros)
+%
+% \def\dotabulatecheckhrulespec#1%
+% {\iftrialtypesetting
+% \expandafter\tabulateignorehrulespec\expandafter\stoptabulatenoalign
+% \else
+% \expandafter\tabulatepickuphrulespec\expandafter\dotabulateFLfive
+% \fi}
-\def\tabulateLLfive{\TABLEnoalign
+\unexpanded\def\dotabulateFLfive
+ {\ifinsidefloat\else
+ \doifemptyvalue{\??tt\currenttabulate\c!before} % no expansion
+ {\tabulatebaselinecorrection}%
+ \fi
+ \dotabulatehrule
+ \dotabulatenobreak
+ \dotabulateruleseparator
+ \prevdepth\strutdp
+ \dotabulatenobreak
+ \stoptabulatenoalign}
+
+\unexpanded\def\dotabulateMLfive
+ {\dotabulateruleseparator
+ \dotabulatehrule
+ \vskip-\tabulateparameter\c!rulethickness
+ \dotabulatehrule
+ \nobreak
+ \dotabulateruleseparator
+ \stoptabulatenoalign}
+
+\unexpanded\def\dotabulateLLfive
{\dotabulatenobreak
- \dotabulateruleseperator
+ \dotabulateruleseparator
\dotabulatenobreak
- \dotabulaterule
+ \dotabulatehrule
\ifinsidefloat\else
\doifemptyvalue{\??tt\currenttabulate\c!after} % no expansion
{\vskip\strutdp
\verticalstrut
\vskip-\struttotal}%
- \fi}}
-
-\def\tabulateHLfive
- {\doHL\zerocount}
+ \fi
+ \stoptabulatenoalign}
-\def\tabulaterule {\HR}% a rule with lineheight
-\def\tabulateline {\HL}% just a spaced rule
-\def\tabulateautorule{\doHR\plusone}%
-\def\tabulateautoline{\doHL\plusone}%
+\unexpanded\def\dotabulateTLfive
+ {\dotabulatenobreak
+ \dotabulateruleseparator
+ \dotabulatenobreak
+ \dotabulatehrule
+ \dotabulatenobreak
+ \dotabulateruleseparator
+ %\prevdepth\strutdp % todo, might differ between TL and BL
+ \dotabulatenobreak
+ \stoptabulatenoalign}
-\bgroup \catcode`\|=\@@other
+\let\dotabulateBLfive\dotabulateTLfive
-\gdef\processtabulate[|#1|]% in the process of optimizing
+\def\tabulateHLfive
+ {\csname
+ \ifnum\noftabulatelines=\zerocount F\else
+ \ifnum\noftabulatelines=\totalnoftabulatelines L\else
+ M\fi\fi
+ L\endcsname}
+
+\def\tabulatedoHRfive % horizontal rule line (break untested)
+ {\starttabulatenoalign
+ \globallet\dotabulateautoline\dotabulatelinerule
+ %\ifcase#1\or % todo: check what this does
+ \ifnum\noftabulatelines=\zerocount
+ \glet\dotabulateautoline\donothing
+ \else\ifnum\noftabulatelines=\totalnoftabulatelines
+ \glet\dotabulateautoline\donothing
+ \fi\fi
+ %\fi
+ \dotabulatenobreak
+ \stoptabulatenoalign
+ \dotabulateautoline
+ \starttabulatenoalign
+ \nobreak
+ \ifx\dotabulateautoline\dotabulatelinerule\kern-\lineheight\fi
+ \ifnum\noftabulatelines=\totalnoftabulatelines
+ \@EA\dotabulatenobreak
+ \else
+ \@EA\allowbreak
+ \fi
+ \stoptabulatenoalign
+ \dotabulateautoline
+ \starttabulatenoalign
+ \dotabulatenobreak
+ \stoptabulatenoalign}
+
+% \dorecurse{10}{
+% \starttabulate[|l|]
+% \FL
+% \NC first line, bound to next rule \NC \NR
+% \TL
+% \NC bound to previous rule \NC \NR
+% \NC some line \NC \NR
+% \NC some line \NC \NR
+% \NC some line \NC \NR
+% \NC bound to next rule \NC \NR
+% \ML
+% \NC bound to previous rule \NC \NR
+% \NC bound to next rule \NC \NR
+% \BL
+% \NC last line, bound to previous rule \NC \NR
+% \LL
+% \stoptabulate
+% }
+
+% to be redone
+
+\def\tabulaterule {\HR} % a rule with lineheight
+\def\tabulateline {\HL} % just a spaced rule
+\def\tabulateautorule{\HR}%
+\def\tabulateautoline{\HL} % no longer different (to be looked into)
+
+% When support for vertical rules we needed a way to pick up the
+% specification for the final rule and a \type {|{}} interface was
+% chosen. As a result parsing had to become more complex and I was
+% not in the mood for messing up the code too much. Therefore from
+% now on the preamble is split by \LUA. There are definitely more
+% places where we can use \LUA\ code (for instance in alignment of
+% numbers. The repeat parser is replace at the \LUA\ end as well.
+
+\gdef\processtabulate[#1]% in the process of optimizing
{\tabulateunit\tabulateparameter\c!unit
\checkfulltabulatecontent
- \globallet\tabulateruledepth \!!zeropoint
- \globallet\tabulateruleheight\!!zeropoint
+ \defaulttabulatevrulethickness\tabulateparameter\c!rulethickness
+ \defaulttabulatehrulethickness\tabulateparameter\c!rulethickness
+ \edef\defaulttabulatevrulecolor{\tabulateparameter\c!rulecolor}%
+ \edef\defaulttabulatehrulecolor{\tabulateparameter\c!rulecolor}%
\edef\@@tabulatealign{\executeifdefined{\??tt:\c!align:\tabulateparameter\c!align}0}%
- \let\pretabskip\!!zeropoint
- \def\postabskip{.5\tabulateunit}%
+ \tabulateposskip.5\tabulateunit
+ \tabulatepreskip\zeropoint
+ \firstpretabskip\tabulateposskip
+ \lastposttabskip\tabulateposskip
\global\tabulatecolumns\zerocount
\global\nofautotabulate\zerocount
\global\noftabulatelines\zerocount
@@ -1259,7 +1565,7 @@
\minusnoftabulatelines\noftabulatelines
\global\tabulatepwidth\zeropoint
\global\tabulatexwidth\zeropoint
- \global\tabulateequalfalse
+ \global\setfalse\tabulateequal
\resettabulatepheight
\ifinsidesplitfloat
\donetrue
@@ -1269,8 +1575,9 @@
\donetrue
\fi\fi
\ifdone
- \chardef\tabulaterepeathead\executeifdefined{\??tt:\c!header:\tabulateparameter\c!header}\zerocount
+ \tabulaterepeathead\executeifdefined{\??tt:\c!header:\tabulateparameter\c!header}\zerocount
\fi
+ \let\VL\tabulateVLone
\let\NC\tabulateNCone
\let\RC\tabulateRCone
\let\HC\tabulateHCone
@@ -1280,32 +1587,41 @@
\let\NG\tabulateNGone
\let\NN\tabulateNNone
\let\ND\tabulateNDone
- \let\HR\tabulateHRone
- \let\HL\tabulateHLone
\let\NR\tabulateNRone
- \let\HL\empty % not needed ? ? ?
- \let\SR\NR \let\AR\NR
- \let\FL\empty \let\FR\NR
- \let\ML\empty \let\MR\NR
- \let\LL\empty \let\LR\NR
- \let\doHR\gobbleoneargument
- \let\doHL\gobbleoneargument
+ \let\CC\tabulateCCone
+ \let\CL\tabulateCLone
+ \let\CM\tabulateCMone
+ \let\CR\tabulateCRone
+ \let\SR\NR
+ \let\FR\NR
+ \let\MR\NR
+ \let\LR\NR
+ \let\AR\NR
+ \let\FL\tabulateXXnone
+ \let\ML\tabulateXXnone
+ \let\LL\tabulateXXnone
+ \let\TL\tabulateXXnone
+ \let\BL\tabulateXXnone
+ \let\HL\tabulateXXnone
+ \let\HR\tabulateXXnone
\glet\flushtabulated\empty
\tabskip\zeropoint
\ifdim\tabulateparameter\c!margin>\zeropoint
- \!!toksa{&\flushtabulateindent\strut##\tabskip\tabulateparameter\c!margin\strut&##\tabskip\zeropoint}%
+ \tabulatepreamble{\aligntab\flushtabulateindent\strut\alignmark\alignmark\tabskip\tabulateparameter\c!margin\strut\aligntab\alignmark\alignmark\tabskip\zeropoint}%
\else
- \!!toksa{&\flushtabulateindent\strut##&##\tabskip\zeropoint}%
+ \tabulatepreamble{\aligntab\flushtabulateindent\strut\alignmark\alignmark\aligntab\alignmark\alignmark\tabskip\zeropoint}%
\fi
\tabulatewidth\zeropoint
- \nexttabulate #1X|\relax
+ \ctxcommand{presettabulate(\!!bs\detokenize{#1}\!!es)}%
\edef\totaltabulatecolumns{\the\numexpr3*\tabulatecolumns+4}%
\tabulatewidth\zeropoint
\initializetableboxes\tabulatecolumns
- \appendtoks&##\global\advance\tabulatecolumn\plusone\to\!!toksa
+ \appendtoks\aligntab\alignmark\alignmark\global\advance\tabulatecolumn\plusone\to\tabulatepreamble
\appendtoks\NC\unskip\unskip\crcr\flushtabulated\to\tabulatedummy % no count
\global\tabulatecolumn\zerocount
\resettabulatepheight
+ \let\bbskip\empty
+ %\let\eeskip\empty
\let\bskip \tabulatebskipone
\let\eskip \tabulateeskipone
\let\xbskip\tabulatexbskipone
@@ -1318,12 +1634,13 @@
\setlocalhsize \hsize\localhsize
\fi
\dontcomplain
- \forgetall % hm, interference with \forgetparindent ^^^ probably bug, to be solved
+ \forgetall % hm, interference with preceding \forgetparindent probably bug, to be solved
+ \everypar\everytabulatepar
\setbox0\vbox % outside \if because of line counting
{\notesenabledfalse
\let\tabulateindent\!!zeropoint
- \trialtypesettingtrue % very important
- \@EA\halign\@EA{\the\!!toksa\crcr\fulltabulatecontent\crcr}}%
+ \settrialtypesetting % very important
+ \@EA\halign\@EA{\the\tabulatepreamble\crcr\fulltabulatecontent\crcr}}%
\ifnum\nofautotabulate>\zerocount
% so, even if the natural size is larger, in the final
% run, we force the calculated width
@@ -1334,7 +1651,7 @@
\fi
\let\xbskip\tabulatexbskiptwo
\let\xeskip\tabulatexeskiptwo
- \ifsplittabulate
+ \ifconditional\tabulatesplit
\splittopskip\strutht
\glet\flushtabulatedindeed\empty
\let\bbskip\tabulatebbskiptwo
@@ -1348,17 +1665,18 @@
\totalnoftabulatelines\noftabulatelines
\minusnoftabulatelines\numexpr\noftabulatelines+\minusone\relax
\global\noftabulatelines\zerocount
- \let\doHL\tabulatedoHLfour
- \let\doHR\tabulatedoHRfour
- \doifelsevalue{\??tt\currenttabulate\c!rule}\v!line
- {\let\HL\HR
- \let\tabulateautoline\tabulateautorule
- \let\tabulateline\tabulaterule}%
- {\let\HL\tabulateHLfive}%
\let\FL\tabulateFLfive
\let\ML\tabulateMLfive
\let\LL\tabulateLLfive
- \let\tabulatepass\plustwo
+ \let\TL\tabulateTLfive
+ \let\BL\tabulateBLfive
+ \let\HL\tabulateHLfive
+ \let\HR\tabulateHRfive
+ \doifvalue{\??tt\currenttabulate\c!rule}\v!line
+ {\let\HL\HR
+ \let\tabulateautoline\tabulateautorule
+ \let\tabulateline\tabulaterule}%
+ \tabulatepass\plustwo
%
\ifcase\tabulaterepeathead
\ifinsidesplitfloat
@@ -1370,8 +1688,13 @@
\setbox\tabulatebox\vbox \bgroup
\fi
%
- \@EA\halign\@EA{\the\!!toksa\crcr\fulltabulatecontent\crcr}%
- \prevdepth\strutdp % nog eens beter, temporary hack
+ \dostarttagged\t!tabulate\empty
+ \dostarttagged\t!tabulaterow\empty
+ \appendtoks\dostoptagged\dostarttagged\t!tabulaterow\empty\to\everycr
+ \@EA\halign\@EA{\the\tabulatepreamble\crcr\fulltabulatecontent\crcr}%
+ \dostoptagged
+ \dostoptagged
+ \ifhmode\par\prevdepth\strutdp\fi % nog eens beter, temporary hack
\doifvalue{\??tt\currenttabulate\c!distance}\v!grid{\vskip-\strutdp}% experimental tm-prikkels
%
\ifcase\tabulaterepeathead
@@ -1390,7 +1713,7 @@
\fi
\egroup}
-\egroup
+% \egroup
% \setuptabulate[split=yes,header=text,title=Vervolg van Tabel]
%
@@ -1441,7 +1764,45 @@
%D \NC tufte \NC \input tufte \NC \NR \tabulateautorule
%D \stoptabulate
%D \stoptyping
-
+
+%D Spacing:
+%
+% \starttabulate
+% \NC text \NC text \NC \NR
+% \TB[small]
+% \NC text \NC text \NC \NR
+% \TB[4*big]
+% \NC text \NC text \NC \NR
+% \stoptabulate
+
+\def\TabulateTB
+ {\starttabulatenoalign
+ \dosingleempty\doTabulateTB}
+
+\def\doTabulateTB[#1]%
+ {\iffirstargument
+ \blank[#1]
+ \else
+ \blank
+ \fi
+ \stoptabulatenoalign}
+
+% to be tested:
+%
+% \def\TabulateTB
+% {\starttabulatenoalign
+% \doiffastoptionalcheckelse\doTabulateTByes\doTabulateTBnop}
+%
+% \def\doTabulateTByes[#1]%
+% {\blank[#1]
+% \stoptabulatenoalign}
+%
+% \def\doTabulateTBnop[#1]%
+% {\blank
+% \stoptabulatenoalign}
+
+\appendtoks\let\TB\TabulateTB\to\everytabulate
+
% \starttabulatie[|mc|]
% \NC \digits{100.000,00} \NC\NR
% \NC \digits{@10.000,00} \NC\NR
@@ -1481,7 +1842,7 @@
% \NC \digits $@@@.@10,@@$ \NC\NR
% \NC \digits $@@@.@@1,@@$ \NC\NR
% \stoptabulatie
-
+
\unexpanded\def\setuptabulate
{\dotripleempty\dosetuptabulate}
diff --git a/Master/texmf-dist/tex/context/base/tabl-tsp.mkiv b/Master/texmf-dist/tex/context/base/tabl-tsp.mkiv
index 9ceb3af6e89..d274df6cb4a 100644
--- a/Master/texmf-dist/tex/context/base/tabl-tsp.mkiv
+++ b/Master/texmf-dist/tex/context/base/tabl-tsp.mkiv
@@ -13,14 +13,11 @@
\writestatus{loading}{ConTeXt Table Macros / Splitting}
-%D The code in this file is move here from other places.
+%D The code in this file is move here from other places and needs
+%D a mkiv cleanup.
\unprotect
-% only to be used with single tokens (will be prim)
-
-\ifx\htdp\undefined \def\htdp#1{\dimexpr\ht#1+\dp#1\relax} \fi
-
%D Although the name resembles floats, and therefore this should be
%D a page module, we decided to make it core functionality because the
%D table code depends on it. Othrwise there would be too much
@@ -29,12 +26,9 @@
% \splitfloat [settings] {\placetable[optional args]{test}} {content}
-% \def\s!noftablesplits{nofsplittables}
+% there is no need for a tracked structure number here
-\definenumber % we need a nicer name like nofsplittables, we then also need to set \s!parent
- [\??si]
- [\c!way=\v!by\v!text,
- \c!conversion=\@@siconversion]
+\newcount\noffloatssplits
\unexpanded\def\setupfloatsplitting
{\dodoubleargument\getparameters[\??si]}
@@ -59,8 +53,8 @@
\insidefloattrue
\insidesplitfloattrue
\getparameters[\??si][#1]%
- \resetnumber[\??si]%
- \def\floatcaptionsuffix{\convertednumber[\??si]}%
+ \global\noffloatssplits\zerocount
+ \def\floatcaptionsuffix{\convertnumber\@@siconversion\noffloatssplits}%
\let\extrasplitfloatlines\@@silines
\the\everysplitfloatsetup
\def\splitfloatcommand{#2}%
@@ -113,15 +107,20 @@
{\forgetall
\dontcomplain
\global\settrue\splitfloatdone
- \chardef\nodelocationmode\zerocount % bypass auto-renumbering
- \incrementnumber[\??si]%
- \ifcase\rawnumber[\??si]\or \ifconditional\onlyonesplitofffloat
- \let\floatcaptionsuffix\empty
- \fi \fi
+ \nodelocationmode\zerocount % bypass auto-renumbering
+ \global\advance\noffloatssplits\plusone
+ \ifcase\noffloatssplits\relax
+ \or
+ \ifconditional\onlyonesplitofffloat
+ \let\floatcaptionsuffix\empty
+ \fi
+ \else
+ \global\settrue\usesamefloatnumber % one shot
+ \fi
\bgroup
\ifconditional\somenextplitofffloat
\settrue\retainfloatnumber
-\notesenabledfalse % best here, experimental, brrr; test with note in caption
+ \notesenabledfalse % best here, experimental, brrr; test with note in caption
\else
\setfalse\retainfloatnumber
\fi
@@ -161,7 +160,7 @@
{\doif\extrasplitfloatlines\v!auto
{\bgroup
\settrue\retainfloatnumber
- \chardef\nodelocationmode\zerocount
+ \nodelocationmode\zerocount
\forcelocalfloats
\setuplocalfloats[\c!before=,\c!after=,\c!inbetween=]%
\splitfloatcommand{\hbox to \wd#1{\strut}}% dummy line
@@ -201,21 +200,25 @@
\newbox\tsplitnext
\newbox\tsplittail
-\def\resettsplit{% only \def's starting a a new line are seen by the dep checker
+\newtoks\everyresettsplit
+
+\def\resettsplit{\the\everyresettsplit}
+
+\appendtoks
\def\tsplitminimumfreelines{0}%
\def\tsplitminimumfreespace{0pt}%
- \setbox\tsplitcontent \vbox{}%
- \setbox\tsplitresult \vbox{}%
- \setbox\tsplithead \vbox{}%
- \setbox\tsplitnext \vbox{}%
- \setbox\tsplittail \vbox{}%
+ \setbox\tsplitcontent\emptyvbox
+ \setbox\tsplitresult \emptyvbox
+ \setbox\tsplithead \emptyvbox
+ \setbox\tsplitnext \emptyvbox
+ \setbox\tsplittail \emptyvbox
\let\tsplitbeforeresult\donothing
\let\tsplitafterresult \donothing
\let\tsplitinbetween \donothing
\let\tsplitbefore \donothing
\let\tsplitafter \donothing
\let\postprocesstsplit \donothing
-}
+\to \everyresettsplit
\resettsplit
diff --git a/Master/texmf-dist/tex/context/base/task-ini.lua b/Master/texmf-dist/tex/context/base/task-ini.lua
index aaa97ec4910..c1c22e8ccd9 100644
--- a/Master/texmf-dist/tex/context/base/task-ini.lua
+++ b/Master/texmf-dist/tex/context/base/task-ini.lua
@@ -11,84 +11,139 @@ if not modules then modules = { } end modules ['task-ini'] = {
--
-- we can disable more handlers and enable then when really used (*)
-tasks.appendaction("processors", "normalizers", "fonts.collections.process") -- todo
-tasks.appendaction("processors", "normalizers", "fonts.checkers.missing") -- disabled
-
-tasks.appendaction("processors", "characters", "chars.handle_mirroring") -- disabled
-tasks.appendaction("processors", "characters", "chars.handle_casing") -- disabled
-tasks.appendaction("processors", "characters", "chars.handle_digits") -- disabled
-tasks.appendaction("processors", "characters", "chars.handle_breakpoints") -- disabled
-tasks.appendaction("processors", "characters", "scripts.preprocess")
-
-tasks.appendaction("processors", "words", "kernel.hyphenation") -- always on
-tasks.appendaction("processors", "words", "languages.words.check") -- disabled
-
-tasks.appendaction("processors", "fonts", "nodes.process_characters") -- maybe todo
-tasks.appendaction("processors", "fonts", "nodes.inject_kerns") -- maybe todo
-tasks.appendaction("processors", "fonts", "nodes.protect_glyphs", nil, "nohead") -- maybe todo
-tasks.appendaction("processors", "fonts", "kernel.ligaturing") -- always on
-tasks.appendaction("processors", "fonts", "kernel.kerning") -- always on
-tasks.appendaction("processors", "fonts", "nodes.stripping.process") -- disabled (might move)
-
-tasks.appendaction("processors", "lists", "lists.handle_spacing") -- disabled
-tasks.appendaction("processors", "lists", "lists.handle_kerning") -- disabled
-
-tasks.appendaction("shipouts", "normalizers", "nodes.cleanup_page") -- maybe todo
-tasks.appendaction("shipouts", "normalizers", "nodes.add_references") -- disabled
-tasks.appendaction("shipouts", "normalizers", "nodes.add_destinations") -- disabled
-tasks.appendaction("shipouts", "normalizers", "nodes.rules.process") -- disabled
-tasks.appendaction("shipouts", "normalizers", "nodes.shifts.process") -- disabled
-
-tasks.appendaction("shipouts", "finishers", "shipouts.handle_color") -- disabled
-tasks.appendaction("shipouts", "finishers", "shipouts.handle_transparency") -- disabled
-tasks.appendaction("shipouts", "finishers", "shipouts.handle_colorintent") -- disabled
-tasks.appendaction("shipouts", "finishers", "shipouts.handle_negative") -- disabled
-tasks.appendaction("shipouts", "finishers", "shipouts.handle_effect") -- disabled
-tasks.appendaction("shipouts", "finishers", "shipouts.handle_viewerlayer") -- disabled
-
-tasks.appendaction("math", "normalizers", "noads.relocate_characters", nil, "nohead") -- always on
-tasks.appendaction("math", "normalizers", "noads.resize_characters", nil, "nohead") -- always on
-tasks.appendaction("math", "normalizers", "noads.respace_characters", nil, "nohead") -- always on
-
-tasks.appendaction("math", "builders", "noads.mlist_to_hlist") -- always on
-
--- quite experimental
-
-tasks.appendaction("finalizers", "lists", "nodes.repackage_graphicvadjust") -- todo
-
--- rather new
-
-tasks.appendaction("mvlbuilders", "normalizers", "nodes.migrate_outwards")
-tasks.appendaction("mvlbuilders", "normalizers", "nodes.handle_page_spacing") -- last !
-
-tasks.appendaction("vboxbuilders", "normalizers", "nodes.handle_vbox_spacing")
+local tasks = nodes.tasks
+local appendaction = tasks.appendaction
+local disableaction = tasks.disableaction
+local freezegroup = tasks.freezegroup
+local freezecallbacks = callbacks.freeze
+
+appendaction("processors", "normalizers", "fonts.collections.process") -- todo
+appendaction("processors", "normalizers", "fonts.checkers.missing") -- disabled
+
+appendaction("processors", "characters", "typesetters.cleaners.handler") -- disabled
+appendaction("processors", "characters", "typesetters.directions.handler") -- disabled
+appendaction("processors", "characters", "typesetters.cases.handler") -- disabled
+appendaction("processors", "characters", "typesetters.breakpoints.handler") -- disabled
+appendaction("processors", "characters", "scripts.preprocess")
+
+appendaction("processors", "words", "builders.kernel.hyphenation") -- always on
+appendaction("processors", "words", "languages.words.check") -- disabled
+
+appendaction("processors", "fonts", "builders.paragraphs.solutions.splitters.split") -- experimental
+appendaction("processors", "fonts", "nodes.handlers.characters") -- maybe todo
+appendaction("processors", "fonts", "nodes.injections.handler") -- maybe todo
+appendaction("processors", "fonts", "nodes.handlers.protectglyphs", nil, "nohead") -- maybe todo
+appendaction("processors", "fonts", "builders.kernel.ligaturing") -- always on
+appendaction("processors", "fonts", "builders.kernel.kerning") -- always on
+appendaction("processors", "fonts", "nodes.handlers.stripping") -- disabled (might move)
+
+appendaction("processors", "lists", "typesetters.spacings.handler") -- disabled
+appendaction("processors", "lists", "typesetters.kerns.handler") -- disabled
+appendaction("processors", "lists", "typesetters.digits.handler") -- disabled (after otf handling)
+
+appendaction("shipouts", "normalizers", "nodes.handlers.cleanuppage") -- disabled
+appendaction("shipouts", "normalizers", "typesetters.alignments.handler")
+appendaction("shipouts", "normalizers", "nodes.references.handler") -- disabled
+appendaction("shipouts", "normalizers", "nodes.destinations.handler") -- disabled
+appendaction("shipouts", "normalizers", "nodes.rules.handler") -- disabled
+appendaction("shipouts", "normalizers", "nodes.shifts.handler") -- disabled
+appendaction("shipouts", "normalizers", "structures.tags.handler") -- disabled
+appendaction("shipouts", "normalizers", "nodes.handlers.accessibility") -- disabled
+appendaction("shipouts", "normalizers", "nodes.handlers.backgrounds") -- disabled
+
+appendaction("shipouts", "finishers", "attributes.colors.handler") -- disabled
+appendaction("shipouts", "finishers", "attributes.transparencies.handler") -- disabled
+appendaction("shipouts", "finishers", "attributes.colorintents.handler") -- disabled
+appendaction("shipouts", "finishers", "attributes.negatives.handler") -- disabled
+appendaction("shipouts", "finishers", "attributes.effects.handler") -- disabled
+appendaction("shipouts", "finishers", "attributes.viewerlayers.handler") -- disabled
+
+appendaction("math", "normalizers", "noads.handlers.unscript", nil, "nohead") -- always on (maybe disabled)
+appendaction("math", "normalizers", "noads.handlers.relocate", nil, "nohead") -- always on
+appendaction("math", "normalizers", "noads.handlers.collapse", nil, "nohead") -- always on
+appendaction("math", "normalizers", "noads.handlers.resize", nil, "nohead") -- always on
+appendaction("math", "normalizers", "noads.handlers.respace", nil, "nohead") -- always on
+appendaction("math", "normalizers", "noads.handlers.check", nil, "nohead") -- always on
+appendaction("math", "normalizers", "noads.handlers.tags", nil, "nohead") -- disabled
+
+appendaction("math", "builders", "builders.kernel.mlist_to_hlist") -- always on
+
+-- quite experimental (nodes.handlers.graphicvadjust might go away)
+
+appendaction("finalizers", "lists", "nodes.handlers.graphicvadjust") -- todo
+appendaction("finalizers", "fonts", "builders.paragraphs.solutions.splitters.optimize") -- experimental
+
+-- still experimental
+
+appendaction("mvlbuilders", "normalizers", "nodes.handlers.migrate") --
+appendaction("mvlbuilders", "normalizers", "builders.vspacing.pagehandler") -- last !
+
+appendaction("vboxbuilders", "normalizers", "builders.vspacing.vboxhandler") --
-- speedup: only kick in when used
-tasks.disableaction("processors", "fonts.checkers.missing")
-tasks.disableaction("processors", "chars.handle_breakpoints")
-tasks.disableaction("processors", "chars.handle_casing")
-tasks.disableaction("processors", "chars.handle_digits")
-tasks.disableaction("processors", "chars.handle_mirroring")
-tasks.disableaction("processors", "languages.words.check")
-tasks.disableaction("processors", "lists.handle_spacing")
-tasks.disableaction("processors", "lists.handle_kerning")
-tasks.disableaction("processors", "nodes.stripping.process")
-
-tasks.disableaction("shipouts", "nodes.rules.process")
-tasks.disableaction("shipouts", "nodes.shifts.process")
-tasks.disableaction("shipouts", "shipouts.handle_color")
-tasks.disableaction("shipouts", "shipouts.handle_transparency")
-tasks.disableaction("shipouts", "shipouts.handle_colorintent")
-tasks.disableaction("shipouts", "shipouts.handle_effect")
-tasks.disableaction("shipouts", "shipouts.handle_negative")
-tasks.disableaction("shipouts", "shipouts.handle_viewerlayer")
-
-tasks.disableaction("shipouts", "nodes.add_references")
-tasks.disableaction("shipouts", "nodes.add_destinations")
-
-tasks.disableaction("mvlbuilders", "nodes.migrate_outwards")
-
-callbacks.freeze("find_.*_file", "find file using resolver")
-callbacks.freeze("read_.*_file", "read file at once")
-callbacks.freeze("open_.*_file", "open file for reading")
+disableaction("processors", "fonts.checkers.missing")
+disableaction("processors", "chars.handle_breakpoints")
+disableaction("processors", "typesetters.cleaners.handler")
+disableaction("processors", "typesetters.cases.handler")
+disableaction("processors", "typesetters.digits.handler")
+disableaction("processors", "typesetters.breakpoints.handler")
+disableaction("processors", "typesetters.directions.handler")
+disableaction("processors", "languages.words.check")
+disableaction("processors", "typesetters.spacings.handler")
+disableaction("processors", "typesetters.kerns.handler")
+disableaction("processors", "nodes.handlers.stripping")
+
+disableaction("shipouts", "typesetters.alignments.handler")
+disableaction("shipouts", "nodes.rules.handler")
+disableaction("shipouts", "nodes.shifts.handler")
+disableaction("shipouts", "attributes.colors.handler")
+disableaction("shipouts", "attributes.transparencies.handler")
+disableaction("shipouts", "attributes.colorintents.handler")
+disableaction("shipouts", "attributes.effects.handler")
+disableaction("shipouts", "attributes.negatives.handler")
+disableaction("shipouts", "attributes.viewerlayers.handler")
+disableaction("shipouts", "structures.tags.handler")
+disableaction("shipouts", "nodes.handlers.accessibility")
+disableaction("shipouts", "nodes.handlers.backgrounds")
+disableaction("shipouts", "nodes.handlers.cleanuppage")
+
+disableaction("shipouts", "nodes.references.handler")
+disableaction("shipouts", "nodes.destinations.handler")
+
+disableaction("mvlbuilders", "nodes.handlers.migrate")
+
+disableaction("processors", "builders.paragraphs.solutions.splitters.split")
+
+disableaction("finalizers", "builders.paragraphs.solutions.splitters.optimize")
+disableaction("finalizers", "nodes.handlers.graphicvadjust") -- sort of obsolete
+
+disableaction("math", "noads.handlers.tags")
+
+freezecallbacks("find_.*_file", "find file using resolver")
+freezecallbacks("read_.*_file", "read file at once")
+freezecallbacks("open_.*_file", "open file for reading")
+
+-- experimental:
+
+freezegroup("processors", "normalizers")
+freezegroup("processors", "characters")
+freezegroup("processors", "words")
+freezegroup("processors", "fonts")
+freezegroup("processors", "lists")
+
+freezegroup("finalizers", "normalizers")
+freezegroup("finalizers", "fonts")
+freezegroup("finalizers", "lists")
+
+freezegroup("shipouts", "normalizers")
+freezegroup("shipouts", "finishers")
+
+freezegroup("mvlbuilders", "normalizers")
+freezegroup("vboxbuilders", "normalizers")
+
+--~ freezegroup("parbuilders", "lists")
+--~ freezegroup("pagebuilders", "lists")
+
+freezegroup("math", "normalizers")
+freezegroup("math", "builders")
diff --git a/Master/texmf-dist/tex/context/base/thrd-pic.tex b/Master/texmf-dist/tex/context/base/thrd-pic.mkii
index 3c25d8a81d1..3c25d8a81d1 100644
--- a/Master/texmf-dist/tex/context/base/thrd-pic.tex
+++ b/Master/texmf-dist/tex/context/base/thrd-pic.mkii
diff --git a/Master/texmf-dist/tex/context/base/thrd-tab.tex b/Master/texmf-dist/tex/context/base/thrd-tab.mkii
index dd3838ce2d4..dd3838ce2d4 100644
--- a/Master/texmf-dist/tex/context/base/thrd-tab.tex
+++ b/Master/texmf-dist/tex/context/base/thrd-tab.mkii
diff --git a/Master/texmf-dist/tex/context/base/toks-ini.lua b/Master/texmf-dist/tex/context/base/toks-ini.lua
index ec60402d857..f8b5b94396d 100644
--- a/Master/texmf-dist/tex/context/base/toks-ini.lua
+++ b/Master/texmf-dist/tex/context/base/toks-ini.lua
@@ -6,9 +6,8 @@ if not modules then modules = { } end modules ['toks-ini'] = {
}
local utf = unicode.utf8
-local format, gsub, texsprint = string.format, string.gsub, tex.sprint
-
-local ctxcatcodes = tex.ctxcatcodes
+local utfbyte, utfchar = utf.byte, utf.char
+local format, gsub = string.format, string.gsub
--[[ldx--
<p>This code is experimental and needs a cleanup. The visualizers will move to
@@ -32,151 +31,156 @@ a module.</p>
-- actually, we can use token registers to store tokens
-tokens = tokens or { }
+local token, tex = token, tex
+
+local texsprint = tex.sprint
+
+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.vbox = token.create("vbox")
-tokens.hbox = token.create("hbox")
-tokens.vtop = token.create("vtop")
-tokens.bgroup = token.create(utf.byte("{"), 1)
-tokens.egroup = token.create(utf.byte("}"), 2)
+tokens = tokens or { }
+local tokens = tokens
-tokens.letter = function(chr) return token.create(utf.byte(chr), 11) end
-tokens.other = function(chr) return token.create(utf.byte(chr), 12) end
+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 = { }
+ local t, n = { }, 0
for chr in string.utfvalues(str) do
- t[#t+1] = token.create(chr, 11)
+ n = n + 1
+ t[n] = createtoken(chr, 11)
end
return t
end
-collectors = collectors or { }
-collectors.data = collectors.data or { }
+tokens.collectors = tokens.collectors or { }
+local collectors = tokens.collectors
+
+collectors.data = collectors.data or { }
+local collectordata = collectors.data
-function tex.printlist(data)
+collectors.registered = collectors.registered or { }
+local registered = collectors.registered
+
+local function printlist(data)
callbacks.push('token_filter', function ()
callbacks.pop('token_filter') -- tricky but the nil assignment helps
return data
end)
end
+tex.printlist = printlist
+
function collectors.flush(tag)
- tex.printlist(collectors.data[tag])
+ printlist(collectordata[tag])
end
function collectors.test(tag)
- tex.printlist(collectors.data[tag])
+ printlist(collectordata[tag])
end
-collectors.registered = { }
-
function collectors.register(name)
- collectors.registered[token.csname_id(name)] = name
+ registered[csname_id(name)] = name
end
---~ function collectors.install(tag,end_cs)
---~ collectors.data[tag] = { }
---~ local data = collectors.data[tag]
---~ local call = token.command_id("call")
---~ local relax = token.command_id("relax")
---~ local endcs = token.csname_id(end_cs)
---~ local expand = collectors.registered
---~ local get = token.get_next -- so no callback!
---~ while true do
---~ local t = get()
---~ local a, b = t[1], t[3]
---~ if a == relax and b == endcs then
---~ return
---~ elseif a == call and expand[b] then
---~ token.expand()
---~ else
---~ data[#data+1] = t
---~ end
---~ end
---~ end
+local call = command_id("call")
+local letter = command_id("letter")
+local other = command_id("other_char")
function collectors.install(tag,end_cs)
- collectors.data[tag] = { }
- local data = collectors.data[tag]
- local call = token.command_id("call")
- local endcs = token.csname_id(end_cs)
- local expand = collectors.registered
- local get = token.get_next
+ local data, d = { }, 0
+ collectordata[tag] = data
+ local endcs = csname_id(end_cs)
while true do
- local t = get()
+ local t = get_next()
local a, b = t[1], t[3]
if b == endcs then
- tex.print('\\' ..end_cs)
+ texsprint('\\' ..end_cs) -- to be checked, can be context[end_cs]()
return
- elseif a == call and expand[b] then
- token.expand()
+ elseif a == call and registered[b] then
+ expand()
else
- data[#data+1] = t
+ d = d + 1
+ data[d] = t
end
end
end
function collectors.handle(tag,handle,flush)
- collectors.data[tag] = handle(collectors.data[tag])
+ collectordata[tag] = handle(collectordata[tag])
if flush then
collectors.flush(tag)
end
end
-collectors.show_methods = { }
+local show_methods = { }
+collectors.show_methods = show_methods
function collectors.show(tag, method)
if type(tag) == "table" then
- collectors.show_methods[method or 'a'](tag)
+ show_methods[method or 'a'](tag)
else
- collectors.show_methods[method or 'a'](collectors.data[tag])
+ show_methods[method or 'a'](collectordata[tag])
end
end
-commands = commands or { }
-
-commands.letter = token.command_id("letter")
-commands.other = token.command_id("other_char")
-
-function collectors.default_words(t,str)
- t[#t+1] = tokens.bgroup
- t[#t+1] = token.create("red")
+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
- t[#t+1] = tokens.other('*')
+ n = n + 1
+ t[n] = tokens.other('*')
end
- t[#t+1] = tokens.egroup
+ n = n + 1
+ t[n] = tokens.egroup
end
-function collectors.with_words(tag,handle)
- local t, w = { }, { }
- handle = handle or collectors.default_words
- local tagdata = collectors.data[tag]
+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] == commands.letter then
- w[#w+1] = v[2]
+ if v[1] == letter then
+ wn = wn + 1
+ w[wn] = v[2]
else
- if #w > 0 then
+ if wn > 0 then
handle(t,w)
- w = { }
+ wn = 0
end
- t[#t+1] = v
+ tn = tn + 1
+ t[tn] = v
end
end
- if #w > 0 then
+ if wn > 0 then
handle(t,w)
end
- collectors.data[tag] = t
+ collectordata[tag] = t
end
-function collectors.show_token(t)
+local function showtoken(t)
if t then
- local cmd, chr, id, cs, name = t[1], t[2], t[3], nil, token.command_name(t) or ""
- if cmd == commands.letter or cmd == commands.other then
- return format("%s-> %s -> %s", name, chr, utf.char(chr))
+ 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 = token.csname_name(t) or nil
+ cs = csname_name(t) or nil
if cs then
return format("%s-> %s", name, cs)
elseif tonumber(chr) < 0 then
@@ -192,131 +196,145 @@ function collectors.show_token(t)
end
end
+collectors.showtoken = showtoken
+
function collectors.trace()
- local t = token.get_next()
- texio.write_nl(collectors.show_token(t))
+ local t = get_next()
+ texio.write_nl(showtoken(t))
return t
end
-collectors.show_methods.a = function(data) -- no need to store the table, just pass directly
- local template = "\\NC %s\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR "
- texsprint(ctxcatcodes, "\\starttabulate[|T|Tr|cT|Tr|T|]")
- texsprint(ctxcatcodes, format(template,"cmd","chr","","id","name"))
- texsprint(ctxcatcodes, "\\HL")
+-- 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(token.command_name(v) or "","_","\\_")
+ local name = gsub(command_name(v) or "","_","\\_")
if id > 0 then
- cs = token.csname_name(v) or ""
+ cs = csname_name(v) or ""
if cs ~= "" then cs = "\\string " .. cs end
else
id = ""
end
- if cmd == commands.letter or cmd == commands.other then
+ if cmd == letter or cmd == other then
sym = "\\char " .. chr
end
if tonumber(chr) < 0 then
- texsprint(ctxcatcodes, format(template, name, "", sym, id, cs))
+ row(name,"",sym,id,cs)
else
- texsprint(ctxcatcodes, format(template, name, chr, sym, id, cs))
+ row(name,chr,sym,id,cs)
end
end
- texsprint(ctxcatcodes, "\\stoptabulate")
+ context.stoptabulate()
end
-collectors.show_methods.b_c = function(data,swap) -- no need to store the table, just pass directly
- local template = "\\NC %s\\NC %s\\NC %s\\NC\\NR"
+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
- texsprint(ctxcatcodes, "\\starttabulate[|Tl|Tl|Tr|]")
+ context.starttabulate { "|Tl|Tl|Tr|" }
else
- texsprint(ctxcatcodes, "\\starttabulate[|Tl|Tr|Tl|]")
+ context.starttabulate { "|Tl|Tr|Tl|" }
end
- texsprint(ctxcatcodes, format(template,"cmd","chr","name"))
- texsprint(ctxcatcodes, "\\HL")
+ 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(token.command_name(v) or "","_","\\_")
+ local name = gsub(command_name(v) or "","_","\\_")
if id > 0 then
- cs = token.csname_name(v) or ""
+ cs = csname_name(v) or ""
end
- if cmd == commands.letter or cmd == commands.other then
+ if cmd == letter or cmd == other then
sym = "\\char " .. chr
- elseif cs ~= "" then
- if token.is_activechar(v) then
- sym = "\\string " .. cs
- else
- sym = "\\string\\" .. cs
- end
+ elseif cs == "" then
+ -- okay
+ elseif is_activechar(v) then
+ sym = "\\string " .. cs
+ else
+ sym = "\\string\\" .. cs
end
if swap then
- texsprint(ctxcatcodes, format(template, name, sym, chr))
+ row(name,sym,chr)
elseif tonumber(chr) < 0 then
- texsprint(ctxcatcodes, format(template, name, "", sym))
+ row(name,"",sym)
else
- texsprint(ctxcatcodes, format(template, name, chr, sym))
+ row(name,chr,sym)
end
end
- texsprint(ctxcatcodes, "\\stoptabulate")
+ context.stoptabulate()
end
-- Even more experimental ...
-collectors.show_methods.b = function(tag) collectors.show_methods.b_c(tag,false) end
-collectors.show_methods.c = function(tag) collectors.show_methods.b_c(tag,true ) end
+show_methods.b = function(data) show_b_c(data,false) end
+show_methods.c = function(data) show_b_c(data,true ) end
-collectors.remapper = {
- -- namespace
-}
+local remapper = { } -- namespace
+collectors.remapper = remapper
-collectors.remapper.data = {
- -- user mappings
-}
+local remapperdata = { } -- user mappings
+remapper.data = remapperdata
-function collectors.remapper.store(tag,class,key)
- local s = collectors.remapper.data[class]
+function remapper.store(tag,class,key)
+ local s = remapperdata[class]
if not s then
s = { }
- collectors.remapper.data[class] = s
+ remapperdata[class] = s
end
- s[key] = collectors.data[tag]
- collectors.data[tag] = nil
+ s[key] = collectordata[tag]
+ collectordata[tag] = nil
end
-function collectors.remapper.convert(tag,toks)
- local data = collectors.remapper.data[tag]
- local leftbracket, rightbracket = utf.byte('['), utf.byte(']')
+function remapper.convert(tag,toks)
+ local data = remapperdata[tag]
+ local leftbracket, rightbracket = utfbyte('['), utfbyte(']')
local skipping = 0
-- todo: math
if data then
- local t = { }
+ 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
- t[#t+1] = tok
+ n = n + 1 ; t[n] = tok
elseif two == rightbracket then
skipping = skipping - 1
- t[#t+1] = tok
+ 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
- t[#t+1] = new[n]
+ n = n + 1 ; t[n] = new[n]
end
else
- t[#t+1] = new[1]
+ n = n + 1 ; t[n] = new[1]
end
else
- t[#t+1] = tok
+ n = n + 1 ; t[n] = tok
end
else
- t[#t+1] = tok
+ n = n + 1 ; t[n] = tok
end
else
- t[#t+1] = tok
+ n = n + 1 ; t[n] = tok
end
end
return t
diff --git a/Master/texmf-dist/tex/context/base/toks-ini.mkiv b/Master/texmf-dist/tex/context/base/toks-ini.mkiv
index 22deca745dd..2aa2ed4a6ac 100644
--- a/Master/texmf-dist/tex/context/base/toks-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/toks-ini.mkiv
@@ -19,12 +19,12 @@
%D Handy for manuals \unknown
-\unexpanded\def\starttokens [#1]{\ctxlua{collectors.install("#1", "stoptokens")}}
+\unexpanded\def\starttokens [#1]{\ctxlua{tokens.collectors.install("#1","stoptokens")}}
\let\stoptokens \relax
-\def\flushtokens [#1]{\ctxlua{collectors.flush("#1")}}
-\def\showtokens [#1]{\ctxlua{collectors.show("#1")}}
-\def\testtokens [#1]{\ctxlua{collectors.with_words("#1")}}
-\def\registertoken #1{\ctxlua{collectors.register("#1")}}
+\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.
@@ -54,13 +54,13 @@
% {\expandafter\dograbuntil\expandafter{\csname#1\endcsname}}
\def\dostartremapper#1%
- {\ctxlua{collectors.install("#1", "\e!stop#1")}}
+ {\ctxlua{tokens.collectors.install("#1", "\e!stop#1")}}
\def\dostopremapper#1%
- {\ctxlua{collectors.handle("#1",function(str) return collectors.remapper.convert("#1",str) end, true)}}
+ {\ctxlua{tokens.collectors.handle("#1",function(str) return tokens.collectors.remapper.convert("#1",str) end, true)}}
\def\remaptokens#1%
- {\ctxlua{collectors.handle("#1",function(str) return collectors.remapper.convert("#1",str) end)}}
+ {\ctxlua{tokens.collectors.handle("#1",function(str) return tokens.collectors.remapper.convert("#1",str) end)}}
\unexpanded\def\defineremapper[#1]%
{\setvalue{\e!start#1}{\dostartremapper{#1}}%
@@ -72,7 +72,7 @@
{\dodoubleempty\doremapcharacter}
\def\doremapcharacter[#1][#2]#3%
- {\ctxlua{collectors.install("store", "ctxlua")}#3%
- \ctxlua{collectors.remapper.store("store","#1",\number#2)}}
+ {\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/trac-deb.lua b/Master/texmf-dist/tex/context/base/trac-deb.lua
index 97753f3e921..87434a13d9d 100644
--- a/Master/texmf-dist/tex/context/base/trac-deb.lua
+++ b/Master/texmf-dist/tex/context/base/trac-deb.lua
@@ -6,182 +6,217 @@ if not modules then modules = { } end modules ['trac-deb'] = {
license = "see context related readme files"
}
-if not lmx then lmx = { } end
-if not lmx.variables then lmx.variables = { } end
+local lpeg = lpeg
+local lpegmatch = lpeg.match
+local format, concat, match = string.format, table.concat, string.match
+local tonumber, tostring = tonumber, tostring
+local texdimen, textoks, texcount = tex.dimen, tex.toks, tex.count
-lmx.htmfile = function(name) return environment.jobname .. "-status.html" end
-lmx.lmxfile = function(name) return resolvers.find_file(name,'tex') end
+-- maybe tracers -> tracers.tex (and tracers.lua for current debugger)
-if not tracers then tracers = { } end
-if not tracers.list then tracers.list = { } end
-if not tracers.strings then tracers.strings = { } end
+local report_system = logs.reporter("system","tex")
-tracers.strings.undefined = "undefined"
+tracers = tracers or { }
+local tracers = tracers
-local splitter = lpeg.splitat(":")
-local lpegmatch = lpeg.match
+tracers.lists = { }
+local lists = tracers.lists
-function tracers.split(csname)
- return lpegmatch(splitter,csname)
-end
+tracers.strings = { }
+local strings = tracers.strings
+
+strings.undefined = "undefined"
+
+lists.scratch = {
+ 0, 2, 4, 6, 8
+}
+
+lists.internals = {
+ 'p:hsize', 'p:parindent', 'p:leftskip','p:rightskip',
+ 'p:vsize', 'p:parskip', 'p:baselineskip', 'p:lineskip', 'p:topskip'
+}
+
+lists.context = {
+ 'd:lineheight',
+ 'c:realpageno', 'c:userpageno', 'c:pageno', 'c:subpageno'
+}
+
+local types = {
+ ['d'] = tracers.dimen,
+ ['c'] = tracers.count,
+ ['t'] = tracers.toks,
+ ['p'] = tracers.primitive
+}
+
+local splitboth = lpeg.splitat(":")
+local splittype = lpeg.firstofsplit(":")
+local splitname = lpeg.secondofsplit(":")
function tracers.type(csname)
- tag, name = tracers.split(csname)
- if tag then return tag else return nil end
+ return lpegmatch(splittype,csname)
end
function tracers.name(csname)
- tag, name = tracers.split(csname)
- if tag then return name else return csname end
+ return lpegmatch(splitname,csname) or csname
end
function tracers.cs(csname)
- tag, name = tracers.split(csname)
- if tracers.types[tag] then
- return tracers.types[tag](name)
+ local tag, name = lpegmatch(splitboth,csname)
+ if name and types[tag] then
+ return types[tag](name)
else
return tracers.primitive(csname)
end
end
function tracers.dimen(name)
- return (tex.dimen[name] and number.topoints(tex.dimen[name])) or tracers.strings.undefined
+ local d = texdimen[name]
+ return d and number.topoints(d) or strings.undefined
end
function tracers.count(name)
- return tex.count[name] or tracers.strings.undefined
+ return texcount[name] or strings.undefined
end
-function tracers.toks(name)
- return (tex.toks[name] and string.limit(tex.toks[name],40)) or tracers.strings.undefined
+function tracers.toks(name,limit)
+ local t = textoks[name]
+ return t and string.limit(t,tonumber(limit) or 40) or strings.undefined
end
function tracers.primitive(name)
- return tex[name] or tracers.strings.undefined
+ return tex[name] or strings.undefined
end
-tracers.types = {
- ['d'] = tracers.dimen,
- ['c'] = tracers.count,
- ['t'] = tracers.toks,
- ['p'] = tracers.primitive
-}
-
function tracers.knownlist(name)
- return tracers.list[name] and #tracers.list[name] > 0
+ local l = lists[name]
+ return l and #l > 0
+end
+
+function tracers.showlines(filename,linenumber,offset,errorstr)
+ local data = io.loaddata(filename)
+ local lines = data and string.splitlines(data)
+ if lines and #lines > 0 then
+ -- this does not work yet as we cannot access the last lua error
+ -- table.print(status.list())
+ -- this will be a plugin sequence
+ local what, where = match(errorstr,"LuaTeX error <main (%a+) instance>:(%d+)")
+ if what and where then
+ -- lua error: linenumber points to last line
+ local start, stop = "\\start" .. what .. "code", "\\stop" .. what .. "code"
+ if lines[linenumber] == start then
+ local n = linenumber
+ for i=n,1,-1 do
+ if lines[i] == start then
+ local n = i + tonumber(where)
+ if n <= linenumber then
+ linenumber = n
+ end
+ end
+ end
+ end
+ end
+ offset = tonumber(offset) or 10
+ linenumber = tonumber(linenumber) or 10
+ local start = math.max(linenumber - offset,1)
+ local stop = math.min(linenumber + offset,#lines)
+ if stop > #lines then
+ return "<linenumber past end of file>"
+ else
+ local result, fmt = { }, "%" .. #tostring(stop) .. "d %s %s"
+ for n=start,stop do
+ result[#result+1] = format(fmt,n,n == linenumber and ">>" or " ",lines[n])
+ end
+ return concat(result,"\n")
+ end
+ else
+ return "<empty file>"
+ end
+end
+
+function tracers.printerror(offset)
+ local filename, linenumber = status.filename, tonumber(status.linenumber) or 0
+ if not filename then
+ report_system("error not related to input file: %s ...",status.lasterrorstring)
+ elseif type(filename) == "number" then
+ report_system("error on line %s of filehandle %s: %s ...",linenumber,filename,status.lasterrorstring)
+ else
+ -- currently we still get the error message printed to the log/console so we
+ -- add a bit of spacing around our variant
+ texio.write_nl("\n")
+ local errorstr = status.lasterrorstring or "?"
+ report_system("error on line %s in file %s: %s ...\n",linenumber,filename,errorstr) -- lua error?
+ texio.write_nl(tracers.showlines(filename,linenumber,offset,errorstr),"\n")
+ end
end
-function tracers.showdebuginfo()
+directives.register("system.errorcontext", function(v)
+ if v then
+ callback.register('show_error_hook', function() tracers.printerror(v) end)
+ else
+ callback.register('show_error_hook', nil)
+ end
+end)
+
+-- this might move
+
+lmx = lmx or { }
+
+lmx.htmfile = function(name) return environment.jobname .. "-status.html" end
+lmx.lmxfile = function(name) return resolvers.findfile(name,'tex') end
+
+function lmx.showdebuginfo(lmxname)
local variables = {
['title'] = 'ConTeXt Debug Information',
['color-background-one'] = lmx.get('color-background-green'),
['color-background-two'] = lmx.get('color-background-blue'),
}
- lmx.show('context-debug.lmx',variables)
+ if lmxname == false then
+ return variables
+ else
+ lmx.show(lmxname or 'context-debug.lmx',variables)
+ end
end
-function tracers.showerror()
- local filename = status.filename
- local linenumber = tonumber(status.linenumber or "0")
+function lmx.showerror(lmxname)
+ local filename, linenumber, errorcontext = status.filename, tonumber(status.linenumber) or 0, ""
+ if not filename then
+ filename, errorcontext = 'unknown', 'error in filename'
+ elseif type(filename) == "number" then
+ filename, errorcontext = format("<read %s>",filename), 'unknown error'
+ else
+ errorcontext = tracers.showlines(filename,linenumber,offset)
+ end
local variables = {
['title'] = 'ConTeXt Error Information',
['errormessage'] = status.lasterrorstring,
- ['linenumber'] = status.linenumber,
+ ['linenumber'] = linenumber,
['color-background-one'] = lmx.get('color-background-yellow'),
['color-background-two'] = lmx.get('color-background-purple'),
+ ['filename'] = filename,
+ ['errorcontext'] = errorcontext,
}
- if not filename then
- variables.filename, variables.errorcontext = 'unknown', 'error in filename'
- elseif type(filename) == "number" then
- variables.filename, variables.errorcontext = "<read " .. filename .. ">", 'unknown error'
- elseif io.exists(filename) then
- -- todo: use an input opener so that we also catch utf16 an reencoding
- lines = io.lines(filename)
- if lines then
- local context = { }
- n, m = 1, linenumber
- b, e = m-10, m+10
- s = string.len(tostring(e))
- for line in lines do
- if n > e then
- break
- elseif n > b then
- if n == m then
- context[#context+1] = string.format("%" .. s .. "d",n) .. " >> " .. line
- else
- context[#context+1] = string.format("%" .. s .. "d",n) .. " " .. line
- end
- end
- n = n + 1
- end
- variables.filename, variables.errorcontext = filename, table.concat(context,"\n")
- else
- variables.filename, variables.errorcontext = filename, ""
- end
+ if lmxname == false then
+ return variables
else
- variables.filename, variables.errorcontext = filename, 'file not found'
+ lmx.show(lmxname or 'context-error.lmx',variables)
end
- lmx.show('context-error.lmx',variables)
end
-function tracers.overloaderror()
- callback.register('show_error_hook', tracers.showerror)
+function lmx.overloaderror()
+ callback.register('show_error_hook', function() lmx.showerror() end) -- prevents arguments being passed
end
-tracers.list['scratch'] = {
- 0, 2, 4, 6, 8
-}
-
-tracers.list['internals'] = {
- 'p:hsize', 'p:parindent', 'p:leftskip','p:rightskip',
- 'p:vsize', 'p:parskip', 'p:baselineskip', 'p:lineskip', 'p:topskip'
-}
-
-tracers.list['context'] = {
- 'd:lineheight',
- 'c:realpageno', 'c:pageno', 'c:subpageno'
-}
+directives.register("system.showerror", lmx.overloaderror)
--- dumping the hash
+local debugger = utilities.debugger
--- \starttext
--- \ctxlua{tracers.dump_hash()}
--- \stoptext
-
-local saved = { }
-
-function tracers.save_hash()
- saved = tex.hashtokens()
-end
-
-function tracers.dump_hash(filename,delta)
- filename = filename or tex.jobname .. "-hash.log"
- local list = { }
- local hash = tex.hashtokens()
- local command_name = 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 kind = command_name(token)
- local dk = list[kind]
- if not dk then
- -- a bit funny names but this sorts better (easier to study)
- dk = { names = { }, found = 0, code = token[1] }
- list[kind] = dk
- end
- dk.names[name] = { token[2], token[3] }
- dk.found = dk.found + 1
- end
- end
- io.savedata(filename,table.serialize(list,true))
-end
-
-function tracers.register_dump_hash(delta)
- if delta then
- tracers.save_hash()
- end
- main.register_stop_actions(1,function() tracers.dump_hash(nil,true) end) -- at front
+local function trace_calls(n)
+ debugger.enable()
+ luatex.registerstopactions(function()
+ debugger.disable()
+ debugger.savestats(tex.jobname .. "-luacalls.log",tonumber(n))
+ end)
+ trace_calls = function() end
end
-directives.register("system.dumphash", function() tracers.register_dump_hash(false) end)
-directives.register("system.dumpdelta", function() tracers.register_dump_hash(true ) end)
+directives.register("system.tracecalls", function(n) trace_calls(n) end) -- indirect is needed for nilling
diff --git a/Master/texmf-dist/tex/context/base/trac-deb.mkiv b/Master/texmf-dist/tex/context/base/trac-deb.mkiv
index b004cdeb495..2eb44247a33 100644
--- a/Master/texmf-dist/tex/context/base/trac-deb.mkiv
+++ b/Master/texmf-dist/tex/context/base/trac-deb.mkiv
@@ -13,30 +13,11 @@
\writestatus{loading}{ConTeXt Tracing Macros / Debugger}
+\registerctxluafile{trac-lmx}{1.001}
\registerctxluafile{trac-deb}{1.001}
-\def\showdebuginfo{\ctxlua{tracers.showdebuginfo()}}
-\def\overloaderror{\ctxlua{tracers.overloaderror()}}
-
\def\breakpoint{\showdebuginfo\wait}
-\appendtoks
- \ctxlua {
- if debugger.tracing() then
- debugger.enable() ;
- end
- }%
-\to \everyjob
-
-\appendtoks
- \ctxlua {
- if debugger.tracing() then
- debugger.disable() ;
- debugger.savestats("\jobname-luacalls.log") ;
- end
- }%
-\to \everybye
-
\def\showtrackers {\ctxlua{trackers.show()}}
\def\enabletrackers [#1]{\ctxlua{trackers.enable("#1")}}
\def\disabletrackers [#1]{\ctxlua{trackers.disable("#1")}}
@@ -49,3 +30,8 @@
\def\showexperiments {\ctxlua{experiments.show()}}
\def\enableexperiments [#1]{\ctxlua{experiments.enable("#1")}}
\def\disableexperiments[#1]{\ctxlua{experiments.disable("#1")}}
+
+\def\showdebuginfo{\ctxlua{lmx.showdebuginfo()}}
+\def\overloaderror{\ctxlua{lmx.overloaderror()}} % \enabledirectives[system.showerror]
+
+\def\showlogcategories {\ctxlua{logs.show()}}
diff --git a/Master/texmf-dist/tex/context/base/trac-inf.lua b/Master/texmf-dist/tex/context/base/trac-inf.lua
index 72f03675a1c..5719b953f38 100644
--- a/Master/texmf-dist/tex/context/base/trac-inf.lua
+++ b/Master/texmf-dist/tex/context/base/trac-inf.lua
@@ -6,100 +6,96 @@ if not modules then modules = { } end modules ['trac-inf'] = {
license = "see context related readme files"
}
-local format = string.format
+-- As we want to protect the global tables, we no longer store the timing
+-- in the tables themselves but in a hidden timers table so that we don't
+-- get warnings about assignments. This is more efficient than using rawset
+-- and rawget.
-local statusinfo, n, registered = { }, 0, { }
+local format = string.format
+local clock = os.gettimeofday or os.clock -- should go in environment
+local write_nl = texio.write_nl
-statistics = statistics or { }
+statistics = statistics or { }
+local statistics = statistics
statistics.enable = true
statistics.threshold = 0.05
--- timing functions
-
-local clock = os.gettimeofday or os.clock
+local statusinfo, n, registered, timers = { }, 0, { }, { }
-local notimer
-
-function statistics.hastimer(instance)
- return instance and instance.starttime
+local function hastiming(instance)
+ return instance and timers[instance]
end
-function statistics.resettiming(instance)
- if not instance then
- notimer = { timing = 0, loadtime = 0 }
- else
- instance.timing, instance.loadtime = 0, 0
- end
+local function resettiming(instance)
+ timers[instance or "notimer"] = { timing = 0, loadtime = 0 }
end
-function statistics.starttiming(instance)
- if not instance then
- notimer = { }
- instance = notimer
+local function starttiming(instance)
+ local timer = timers[instance or "notimer"]
+ if not timer then
+ timer = { }
+ timers[instance or "notimer"] = timer
end
- local it = instance.timing
+ local it = timer.timing
if not it then
it = 0
end
if it == 0 then
- instance.starttime = clock()
- if not instance.loadtime then
- instance.loadtime = 0
+ timer.starttime = clock()
+ if not timer.loadtime then
+ timer.loadtime = 0
end
- else
---~ logs.report("system","nested timing (%s)",tostring(instance))
end
- instance.timing = it + 1
+ timer.timing = it + 1
end
-function statistics.stoptiming(instance, report)
- if not instance then
- instance = notimer
- end
- if instance then
- local it = instance.timing
- if it > 1 then
- instance.timing = it - 1
- else
- local starttime = instance.starttime
- if starttime then
- local stoptime = clock()
- local loadtime = stoptime - starttime
- instance.stoptime = stoptime
- instance.loadtime = instance.loadtime + loadtime
- if report then
- statistics.report("load time %0.3f",loadtime)
- end
- instance.timing = 0
- return loadtime
+local function stoptiming(instance, report)
+ local timer = timers[instance or "notimer"]
+ local it = timer.timing
+ if it > 1 then
+ timer.timing = it - 1
+ else
+ local starttime = timer.starttime
+ if starttime then
+ local stoptime = clock()
+ local loadtime = stoptime - starttime
+ timer.stoptime = stoptime
+ timer.loadtime = timer.loadtime + loadtime
+ if report then
+ statistics.report("load time %0.3f",loadtime)
end
+ timer.timing = 0
+ return loadtime
end
end
return 0
end
-function statistics.elapsedtime(instance)
- if not instance then
- instance = notimer
- end
- return format("%0.3f",(instance and instance.loadtime) or 0)
+local function elapsedtime(instance)
+ local timer = timers[instance or "notimer"]
+ return format("%0.3f",timer and timer.loadtime or 0)
end
-function statistics.elapsedindeed(instance)
- if not instance then
- instance = notimer
- end
- local t = (instance and instance.loadtime) or 0
- return t > statistics.threshold
+local function elapsedindeed(instance)
+ local timer = timers[instance or "notimer"]
+ return (timer and timer.loadtime or 0) > statistics.threshold
end
-function statistics.elapsedseconds(instance,rest) -- returns nil if 0 seconds
- if statistics.elapsedindeed(instance) then
- return format("%s seconds %s", statistics.elapsedtime(instance),rest or "")
+local function elapsedseconds(instance,rest) -- returns nil if 0 seconds
+ if elapsedindeed(instance) then
+ return format("%s seconds %s", elapsedtime(instance),rest or "")
end
end
+statistics.hastiming = hastiming
+statistics.resettiming = resettiming
+statistics.starttiming = starttiming
+statistics.stoptiming = stoptiming
+statistics.elapsedtime = elapsedtime
+statistics.elapsedindeed = elapsedindeed
+statistics.elapsedseconds = elapsedseconds
+
-- general function
function statistics.register(tag,fnc)
@@ -113,7 +109,7 @@ end
function statistics.show(reporter)
if statistics.enable then
- if not reporter then reporter = function(tag,data,n) texio.write_nl(tag .. " " .. data) end end
+ if not reporter then reporter = function(tag,data,n) write_nl(tag .. " " .. data) end end
-- this code will move
local register = statistics.register
register("luatex banner", function()
@@ -124,11 +120,11 @@ function statistics.show(reporter)
end)
register("callbacks", function()
local total, indirect = status.callbacks or 0, status.indirect_callbacks or 0
- return format("direct: %s, indirect: %s, total: %s", total-indirect, indirect, total)
+ return format("%s direct, %s indirect, %s total", total-indirect, indirect, total)
end)
+ collectgarbage("collect")
register("current memory usage", statistics.memused)
register("runtime",statistics.runtime)
--- --
for i=1,#statusinfo do
local s = statusinfo[i]
local r = s[2]()
@@ -136,13 +132,27 @@ function statistics.show(reporter)
reporter(s[1],r,n)
end
end
- texio.write_nl("") -- final newline
+ write_nl("") -- final newline
statistics.enable = false
end
end
-function statistics.show_job_stat(tag,data,n)
- texio.write_nl(format("%-15s: %s - %s","mkiv lua stats",tag:rpadd(n," "),data))
+local template, report_statistics, nn = nil, nil, 0 -- we only calcute it once
+
+function statistics.showjobstat(tag,data,n)
+ if not logs then
+ -- sorry
+ elseif type(data) == "table" then
+ for i=1,#data do
+ statistics.showjobstat(tag,data[i],n)
+ end
+ else
+ if not template or n > nn then
+ template, n = format("%%-%ss - %%s",n), nn
+ report_statistics = logs.reporter("mkiv lua stats")
+ end
+ report_statistics(format(template,tag,data))
+ end
end
function statistics.memused() -- no math.round yet -)
@@ -150,48 +160,35 @@ function statistics.memused() -- no math.round yet -)
return format("%s MB (ctx: %s MB)",round(collectgarbage("count")/1000), round(status.luastate_bytes/1000000))
end
-if statistics.runtime then
- -- already loaded and set
-elseif luatex and luatex.starttime then
- statistics.starttime = luatex.starttime
- statistics.loadtime = 0
- statistics.timing = 0
-else
- statistics.starttiming(statistics)
-end
+starttiming(statistics)
-function statistics.runtime()
- statistics.stoptiming(statistics)
- return statistics.formatruntime(statistics.elapsedtime(statistics))
+function statistics.formatruntime(runtime) -- indirect so it can be overloaded and
+ return format("%s seconds", runtime) -- indeed that happens in cure-uti.lua
end
-function statistics.formatruntime(runtime)
- return format("%s seconds", statistics.elapsedtime(statistics))
+function statistics.runtime()
+ stoptiming(statistics)
+ return statistics.formatruntime(elapsedtime(statistics))
end
function statistics.timed(action,report)
- local timer = { }
- report = report or logs.simple
- statistics.starttiming(timer)
+ report = report or logs.reporter("system")
+ starttiming("run")
action()
- statistics.stoptiming(timer)
- report("total runtime: %s",statistics.elapsedtime(timer))
+ stoptiming("run")
+ report("total runtime: %s",elapsedtime("run"))
end
-- where, not really the best spot for this:
commands = commands or { }
-local timer
-
-function commands.resettimer()
- statistics.resettiming(timer)
- statistics.starttiming(timer)
+function commands.resettimer(name)
+ resettiming(name or "whatever")
+ starttiming(name or "whatever")
end
-function commands.elapsedtime()
- statistics.stoptiming(timer)
- tex.sprint(statistics.elapsedtime(timer))
+function commands.elapsedtime(name)
+ stoptiming(name or "whatever")
+ tex.sprint(elapsedtime(name or "whatever"))
end
-
-commands.resettimer()
diff --git a/Master/texmf-dist/tex/context/base/trac-lmx.lua b/Master/texmf-dist/tex/context/base/trac-lmx.lua
index 664815c6618..b4bfc36d6e9 100644
--- a/Master/texmf-dist/tex/context/base/trac-lmx.lua
+++ b/Master/texmf-dist/tex/context/base/trac-lmx.lua
@@ -10,9 +10,15 @@ if not modules then modules = { } end modules ['trac-lmx'] = {
local gsub, format, concat, byte = string.gsub, string.format, table.concat, string.byte
-lmx = lmx or { }
+local allocate = utilities.storage.allocate
-local escapes = {
+lmx = lmx or { }
+local lmx = lmx
+
+lmx.variables = allocate()
+local lmxvariables = lmx.variables
+
+local escapes = allocate {
['&'] = '&amp;',
['<'] = '&lt;',
['>'] = '&gt;',
@@ -21,10 +27,6 @@ local escapes = {
-- variables
-lmx.variables = { } -- global, shared
-
-local lmxvariables = lmx.variables
-
lmxvariables['title-default'] = 'ConTeXt LMX File'
lmxvariables['title'] = lmx.variables['title-default']
lmxvariables['color-background-green'] = '#4F6F6F'
@@ -67,7 +69,7 @@ local function do_urlescaped(str)
return (gsub(str,"[^%a%d]",format("%%0x",byte("%1"))))
end
-function do_type(str)
+local function do_type(str)
if str then do_print("<tt>" .. do_escape(str) .. "</tt>") end
end
@@ -76,7 +78,7 @@ local function do_variable(str)
end
function lmx.loadedfile(name)
- name = (resolvers and resolvers.find_file and resolvers.find_file(name)) or name
+ name = (resolvers and resolvers.findfile and resolvers.findfile(name)) or name
return io.loaddata(name)
end
diff --git a/Master/texmf-dist/tex/context/base/trac-log.lua b/Master/texmf-dist/tex/context/base/trac-log.lua
index 0d4a1b0a9f1..13bb18b0682 100644
--- a/Master/texmf-dist/tex/context/base/trac-log.lua
+++ b/Master/texmf-dist/tex/context/base/trac-log.lua
@@ -6,300 +6,535 @@ if not modules then modules = { } end modules ['trac-log'] = {
license = "see context related readme files"
}
--- this is old code that needs an overhaul
+-- todo: less categories, more subcategories (e.g. nodes)
--~ io.stdout:setvbuf("no")
--~ io.stderr:setvbuf("no")
-local write_nl, write = texio.write_nl or print, texio.write or io.write
-local format, gmatch = string.format, string.gmatch
+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 escapedpattern = string.escapedpattern
local texcount = tex and tex.count
+local next, type = next, type
-if texlua then
- write_nl = print
- write = io.write
-end
+local setmetatableindex = table.setmetatableindex
--[[ldx--
-<p>This is a prelude to a more extensive logging module. For the sake
-of parsing log files, in addition to the standard logging we will
-provide an <l n='xml'/> structured file. Actually, any logging that
-is hooked into callbacks will be \XML\ by default.</p>
+<p>This is a prelude to a more extensive logging module. We no longer
+provide <l n='xml'/> based logging a sparsing is relatively easy anyway.</p>
--ldx]]--
-logs = logs or { }
-logs.xml = logs.xml or { }
-logs.tex = logs.tex or { }
+logs = logs or { }
+local logs = logs
---[[ldx--
-<p>This looks pretty ugly but we need to speed things up a bit.</p>
---ldx]]--
-
-logs.moreinfo = [[
-more information about ConTeXt and the tools that come with it can be found at:
+local moreinfo = [[
+More information about ConTeXt and the tools that come with it can be found at:
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage : http://www.pragma-ade.nl / http://tex.aanhet.net
wiki : http://contextgarden.net
]]
-logs.levels = {
- ['error'] = 1,
- ['warning'] = 2,
- ['info'] = 3,
- ['debug'] = 4,
-}
+-- basic loggers
-logs.functions = {
- 'report', 'start', 'stop', 'push', 'pop', 'line', 'direct',
- 'start_run', 'stop_run',
- 'start_page_number', 'stop_page_number',
- 'report_output_pages', 'report_output_log',
- 'report_tex_stat', 'report_job_stat',
- 'show_open', 'show_close', 'show_load',
-}
+local function ignore() end
-logs.tracers = {
-}
+setmetatableindex(logs, function(t,k) t[k] = ignore ; return ignore end)
-logs.level = 0
-logs.mode = string.lower((os.getenv("MTX.LOG.MODE") or os.getenv("MTX_LOG_MODE") or "tex"))
+local report, subreport, status, settarget, setformats, settranslations
-function logs.set_level(level)
- logs.level = logs.levels[level] or level
-end
+local direct, subdirect, writer, pushtarget, poptarget
+
+if tex and tex.jobname or tex.formatname then
+
+ local valueiskey = { __index = function(t,k) t[k] = k return k end } -- will be helper
-function logs.set_method(method)
- for _, v in next, logs.functions do
- logs[v] = logs[method][v] or function() end
+ local target = "term and log"
+
+ logs.flush = io.flush
+
+ local formats = { } setmetatable(formats, valueiskey)
+ local translations = { } setmetatable(translations,valueiskey)
+
+ writer = function(...)
+ write_nl(target,...)
end
-end
--- tex logging
+ report = function(a,b,c,...)
+ if c then
+ write_nl(target,format("%-15s > %s\n",translations[a],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s > %s\n",translations[a],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s >\n", translations[a]))
+ else
+ write_nl(target,"\n")
+ end
+ end
-function logs.tex.report(category,fmt,...) -- new
- if fmt then
- write_nl(category .. " | " .. format(fmt,...))
- else
- write_nl(category .. " |")
+ direct = function(a,b,c,...)
+ if c then
+ return format("%-15s > %s",translations[a],format(formats[b],c,...))
+ elseif b then
+ return format("%-15s > %s",translations[a],formats[b])
+ elseif a then
+ return format("%-15s >", translations[a])
+ else
+ return ""
+ end
end
-end
-function logs.tex.line(fmt,...) -- new
- if fmt then
- write_nl(format(fmt,...))
- else
- write_nl("")
+ subreport = function(a,s,b,c,...)
+ if c then
+ write_nl(target,format("%-15s > %s > %s\n",translations[a],translations[s],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s > %s > %s\n",translations[a],translations[s],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s > %s >\n", translations[a],translations[s]))
+ else
+ write_nl(target,"\n")
+ end
end
-end
---~ function logs.tex.start_page_number()
---~ local real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
---~ if real > 0 then
---~ if user > 0 then
---~ if sub > 0 then
---~ write(format("[%s.%s.%s",real,user,sub))
---~ else
---~ write(format("[%s.%s",real,user))
---~ end
---~ else
---~ write(format("[%s",real))
---~ end
---~ else
---~ write("[-")
---~ end
---~ end
+ subdirect = function(a,s,b,c,...)
+ if c then
+ return format("%-15s > %s > %s",translations[a],translations[s],format(formats[b],c,...))
+ elseif b then
+ return format("%-15s > %s > %s",translations[a],translations[s],formats[b])
+ elseif a then
+ return format("%-15s > %s >", translations[a],translations[s])
+ else
+ return ""
+ end
+ end
---~ function logs.tex.stop_page_number()
---~ write("]")
---~ end
+ status = function(a,b,c,...)
+ if c then
+ write_nl(target,format("%-15s : %s\n",translations[a],format(formats[b],c,...)))
+ elseif b then
+ write_nl(target,format("%-15s : %s\n",translations[a],formats[b]))
+ elseif a then
+ write_nl(target,format("%-15s :\n", translations[a]))
+ else
+ write_nl(target,"\n")
+ end
+ end
-local real, user, sub
+ 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
+ if target == "term" or target == "term and log" then
+ logs.flush = io.flush
+ else
+ logs.flush = ignore
+ end
+ end
+
+ local stack = { }
+
+ pushtarget = function(newtarget)
+ insert(stack,target)
+ settarget(newtarget)
+ end
+
+ poptarget = function()
+ if #stack > 0 then
+ settarget(remove(stack))
+ end
+ end
+
+ setformats = function(f)
+ formats = f
+ end
+
+ settranslations = function(t)
+ translations = t
+ end
+
+else
+
+ logs.flush = ignore
+
+ writer = write_nl
+
+ report = function(a,b,c,...)
+ if c then
+ write_nl(format("%-15s | %s",a,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s | %s",a,b))
+ elseif a then
+ write_nl(format("%-15s |", a))
+ else
+ write_nl("")
+ end
+ end
+
+ subreport = function(a,sub,b,c,...)
+ if c then
+ write_nl(format("%-15s | %s | %s",a,sub,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s | %s | %s",a,sub,b))
+ elseif a then
+ write_nl(format("%-15s | %s |", a,sub))
+ else
+ write_nl("")
+ end
+ end
+
+ status = function(a,b,c,...) -- not to be used in lua anyway
+ if c then
+ write_nl(format("%-15s : %s\n",a,format(b,c,...)))
+ elseif b then
+ write_nl(format("%-15s : %s\n",a,b)) -- b can have %'s
+ elseif a then
+ write_nl(format("%-15s :\n", a))
+ else
+ write_nl("\n")
+ end
+ end
+
+ direct = ignore
+ subdirect = ignore
+
+ settarget = ignore
+ pushtarget = ignore
+ poptarget = ignore
+ setformats = ignore
+ settranslations = ignore
-function logs.tex.start_page_number()
- real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
end
-function logs.tex.stop_page_number()
- if real > 0 then
- if user > 0 then
- if sub > 0 then
- logs.report("pages", "flushing realpage %s, userpage %s, subpage %s",real,user,sub)
- else
- logs.report("pages", "flushing realpage %s, userpage %s",real,user)
+logs.report = report
+logs.subreport = subreport
+logs.status = status
+logs.settarget = settarget
+logs.pushtarget = pushtarget
+logs.poptarget = poptarget
+logs.setformats = setformats
+logs.settranslations = settranslations
+
+logs.direct = direct
+logs.subdirect = subdirect
+logs.writer = writer
+
+-- installer
+
+-- todo: renew (un) locks when a new one is added and wildcard
+
+local data, states = { }, nil
+
+function logs.reporter(category,subcategory)
+ local logger = data[category]
+ if not logger then
+ local state = false
+ if states == true then
+ state = true
+ elseif type(states) == "table" then
+ for c, _ in next, states do
+ if find(category,c) then
+ state = true
+ break
+ end
+ end
+ end
+ logger = {
+ reporters = { },
+ state = state,
+ }
+ data[category] = logger
+ end
+ local reporter = logger.reporters[subcategory or "default"]
+ if not reporter then
+ if subcategory then
+ reporter = function(...)
+ if not logger.state then
+ subreport(category,subcategory,...)
+ end
end
+ logger.reporters[subcategory] = reporter
else
- logs.report("pages", "flushing realpage %s",real)
+ local tag = category
+ reporter = function(...)
+ if not logger.state then
+ report(category,...)
+ end
+ end
+ logger.reporters.default = reporter
end
- else
- logs.report("pages", "flushing page")
end
- io.flush()
+ return reporter
end
-logs.tex.report_job_stat = statistics.show_job_stat
+logs.new = logs.reporter -- for old times sake
+
+-- context specicific: this ends up in the macro stream
+
+local ctxreport = logs.writer
--- xml logging
+function logs.setmessenger(m)
+ ctxreport = m
+end
-function logs.xml.report(category,fmt,...) -- new
- if fmt then
- write_nl(format("<r category='%s'>%s</r>",category,format(fmt,...)))
+function logs.messenger(category,subcategory)
+ -- we need to avoid catcode mess (todo: fast context)
+ if subcategory then
+ return function(...)
+ ctxreport(subdirect(category,subcategory,...))
+ end
else
- write_nl(format("<r category='%s'/>",category))
+ return function(...)
+ ctxreport(direct(category,...))
+ end
end
end
-function logs.xml.line(fmt,...) -- new
- if fmt then
- write_nl(format("<r>%s</r>",format(fmt,...)))
+
+-- so far
+
+local function setblocked(category,value)
+ if category == true then
+ -- lock all
+ category, value = "*", true
+ elseif category == false then
+ -- unlock all
+ category, value = "*", false
+ elseif value == nil then
+ -- lock selective
+ value = true
+ end
+ if category == "*" then
+ states = value
+ for k, v in next, data do
+ v.state = value
+ end
else
- write_nl("<r/>")
+ states = utilities.parsers.settings_to_hash(category)
+ for c, _ in next, states do
+ if data[c] then
+ v.state = value
+ else
+ c = escapedpattern(c,true)
+ for k, v in next, data do
+ if find(k,c) then
+ v.state = value
+ end
+ end
+ end
+ end
end
end
-function logs.xml.start() if logs.level > 0 then tw("<%s>" ) end end
-function logs.xml.stop () if logs.level > 0 then tw("</%s>") end end
-function logs.xml.push () if logs.level > 0 then tw("<!-- ") end end
-function logs.xml.pop () if logs.level > 0 then tw(" -->" ) end end
-
-function logs.xml.start_run()
- write_nl("<?xml version='1.0' standalone='yes'?>")
- write_nl("<job>") -- xmlns='www.pragma-ade.com/luatex/schemas/context-job.rng'
- write_nl("")
+function logs.disable(category,value)
+ setblocked(category,value == nil and true or value)
end
-function logs.xml.stop_run()
- write_nl("</job>")
+function logs.enable(category)
+ setblocked(category,false)
end
-function logs.xml.start_page_number()
- write_nl(format("<p real='%s' page='%s' sub='%s'", texcount.realpageno, texcount.userpageno, texcount.subpageno))
+function logs.categories()
+ return table.sortedkeys(data)
end
-function logs.xml.stop_page_number()
- write("/>")
- write_nl("")
+function logs.show()
+ local n, c, s, max = 0, 0, 0, 0
+ for category, v in table.sortedpairs(data) do
+ n = n + 1
+ local state = v.state
+ local reporters = v.reporters
+ local nc = #category
+ if nc > c then
+ c = nc
+ end
+ for subcategory, _ in next, reporters do
+ local ns = #subcategory
+ if ns > c then
+ s = ns
+ end
+ local m = nc + ns
+ if m > max then
+ max = m
+ end
+ end
+ local subcategories = concat(table.sortedkeys(reporters),", ")
+ if state == true then
+ state = "disabled"
+ elseif state == false then
+ state = "enabled"
+ else
+ state = "unknown"
+ end
+ -- no new here
+ report("logging","category: '%s', subcategories: '%s', state: '%s'",category,subcategories,state)
+ end
+ report("logging","categories: %s, max category: %s, max subcategory: %s, max combined: %s",n,c,s,max)
end
-function logs.xml.report_output_pages(p,b)
- write_nl(format("<v k='pages' v='%s'/>", p))
- write_nl(format("<v k='bytes' v='%s'/>", b))
- write_nl("")
-end
+directives.register("logs.blocked", function(v)
+ setblocked(v,true)
+end)
-function logs.xml.report_output_log()
-end
+directives.register("logs.target", function(v)
+ settarget(v)
+end)
-function logs.xml.report_tex_stat(k,v)
- texiowrite_nl("log","<v k='"..k.."'>"..tostring(v).."</v>")
-end
+-- tex specific loggers (might move elsewhere)
-local level = 0
+local report_pages = logs.reporter("pages") -- not needed but saves checking when we grep for it
-function logs.xml.show_open(name)
- level = level + 1
- texiowrite_nl(format("<f l='%s' n='%s'>",level,name))
-end
+local real, user, sub
-function logs.xml.show_close(name)
- texiowrite("</f> ")
- level = level - 1
+function logs.start_page_number()
+ real, user, sub = texcount.realpageno, texcount.userpageno, texcount.subpageno
end
-function logs.xml.show_load(name)
- texiowrite_nl(format("<f l='%s' n='%s'/>",level+1,name))
+function logs.stop_page_number()
+ if real > 0 then
+ if user > 0 then
+ if sub > 0 then
+ report_pages("flushing realpage %s, userpage %s, subpage %s",real,user,sub)
+ else
+ report_pages("flushing realpage %s, userpage %s",real,user)
+ end
+ else
+ report_pages("flushing realpage %s",real)
+ end
+ else
+ report_pages("flushing page")
+ end
+ logs.flush()
end
---
+logs.report_job_stat = statistics and statistics.showjobstat
-local name, banner = 'report', 'context'
+local report_files = logs.reporter("files")
-local function report(category,fmt,...)
- if fmt then
- write_nl(format("%s | %s: %s",name,category,format(fmt,...)))
- elseif category then
- write_nl(format("%s | %s",name,category))
- else
- write_nl(format("%s |",name))
- end
+local nesting = 0
+local verbose = false
+local hasscheme = url.hasscheme
+
+-- we don't have show_open and show_close callbacks yet
+
+function logs.show_open(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- nesting = nesting + 1
+ -- report_files("level %s, opening %s",nesting,name)
+ -- else
+ -- write(format("(%s",name)) -- tex adds a space
+ -- end
+ -- end
end
-local function simple(fmt,...)
- if fmt then
- write_nl(format("%s | %s",name,format(fmt,...)))
- else
- write_nl(format("%s |",name))
- end
+function logs.show_close(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- report_files("level %s, closing %s",nesting,name)
+ -- nesting = nesting - 1
+ -- else
+ -- write(")") -- tex adds a space
+ -- end
+ -- end
end
-function logs.setprogram(_name_,_banner_,_verbose_)
- name, banner = _name_, _banner_
- if _verbose_ then
- trackers.enable("resolvers.locating")
- end
- logs.set_method("tex")
- logs.report = report -- also used in libraries
- logs.simple = simple -- only used in scripts !
- if utils then
- utils.report = simple
- end
- logs.verbose = _verbose_
+function logs.show_load(name)
+ -- if hasscheme(name) ~= "virtual" then
+ -- if verbose then
+ -- report_files("level %s, loading %s",nesting+1,name)
+ -- else
+ -- write(format("(%s)",name))
+ -- end
+ -- end
end
-function logs.setverbose(what)
- if what then
- trackers.enable("resolvers.locating")
- else
- trackers.disable("resolvers.locating")
+-- there may be scripts out there using this:
+
+local simple = logs.reporter("comment")
+
+logs.simple = simple
+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
+
+-- applications
+
+local function reportlines(t,str)
+ if str then
+ for line in gmatch(str,"(.-)[\n\r]") do
+ t.report(line)
+ end
end
- logs.verbose = what or false
end
-function logs.extendbanner(_banner_,_verbose_)
- banner = banner .. " | ".. _banner_
- if _verbose_ ~= nil then
- logs.setverbose(what)
+local function reportbanner(t)
+ local banner = t.banner
+ if banner then
+ t.report(banner)
+ t.report()
end
end
-logs.verbose = false
-logs.report = logs.tex.report
-logs.simple = logs.tex.report
-
-function logs.reportlines(str) -- todo: <lines></lines>
- for line in gmatch(str,"(.-)[\n\r]") do
- logs.report(line)
+local function reporthelp(t,...)
+ local helpinfo = t.helpinfo
+ if type(helpinfo) == "string" then
+ reportlines(t,helpinfo)
+ elseif type(helpinfo) == "table" then
+ local tags = { ... }
+ for i=1,#tags do
+ reportlines(t,t.helpinfo[tags[i]])
+ if i < #tags then
+ t.report()
+ end
+ end
end
end
-function logs.reportline() -- for scripts too
- logs.report()
+local function reportinfo(t)
+ t.report()
+ reportlines(t,moreinfo)
end
-logs.simpleline = logs.reportline
-
-function logs.reportbanner() -- for scripts too
- logs.report(banner)
+function logs.application(t)
+ t.name = t.name or "unknown"
+ t.banner = t.banner
+ t.report = logs.reporter(t.name)
+ t.help = function(...) reportbanner(t) ; reporthelp(t,...) ; reportinfo(t) end
+ t.identify = function() reportbanner(t) end
+ return t
end
-function logs.help(message,option)
- logs.reportbanner()
- logs.reportline()
- logs.reportlines(message)
- local moreinfo = logs.moreinfo or ""
- if moreinfo ~= "" and option ~= "nomoreinfo" then
- logs.reportline()
- logs.reportlines(moreinfo)
- end
-end
+-- somewhat special
+
+-- logging to a file
-logs.set_level('error')
-logs.set_method('tex')
+--~ local syslogname = "oeps.xxx"
+--~
+--~ for i=1,10 do
+--~ 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 = format("%s %s => %s => %s => %s\r",os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...))
for i=1,10 do
- local f = io.open(whereto,"a")
+ local f = io.open(whereto,"a") -- we can consider keepint the file open
if f then
- f:write(format("%s %s => %s => %s => %s\r",os.date("%d/%m/%y %H:%m:%S"),process,jobname,category,format(...)))
+ f:write(message)
f:close()
break
else
@@ -308,13 +543,45 @@ function logs.system(whereto,process,jobname,category,...)
end
end
---~ local syslogname = "oeps.xxx"
---~
---~ for i=1,10 do
---~ logs.system(syslogname,"context","test","fonts","font %s recached due to newer version (%s)","blabla","123")
---~ end
+local report_system = logs.reporter("system","logs")
-function logs.fatal(where,...)
- logs.report(where,"fatal error: %s, aborting now",format(...))
- os.exit()
+function logs.obsolete(old,new)
+ local o = loadstring("return " .. new)()
+ if type(o) == "function" then
+ return function(...)
+ report_system("function %s is obsolete, use %s",old,new)
+ loadstring(old .. "=" .. new .. " return ".. old)()(...)
+ end
+ elseif type(o) == "table" then
+ local t, m = { }, { }
+ m.__index = function(t,k)
+ report_system("table %s is obsolete, use %s",old,new)
+ m.__index, m.__newindex = o, o
+ return o[k]
+ end
+ m.__newindex = function(t,k,v)
+ report_system("table %s is obsolete, use %s",old,new)
+ m.__index, m.__newindex = o, o
+ o[k] = v
+ end
+ if libraries then
+ libraries.obsolete[old] = t -- true
+ end
+ setmetatable(t,m)
+ return t
+ end
+end
+
+if utilities then
+ utilities.report = report_system
+end
+
+if tex and tex.error then
+ function logs.texerrormessage(...) -- for the moment we put this function here
+ tex.error(format(...), { })
+ end
+else
+ function logs.texerrormessage(...)
+ print(format(...))
+ end
end
diff --git a/Master/texmf-dist/tex/context/base/trac-pro.lua b/Master/texmf-dist/tex/context/base/trac-pro.lua
new file mode 100644
index 00000000000..43c5ef7db74
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/trac-pro.lua
@@ -0,0 +1,208 @@
+if not modules then modules = { } end modules ['trac-pro'] = {
+ 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 getmetatable, setmetatable, rawset, type = getmetatable, setmetatable, rawset, type
+
+-- The protection implemented here is probably not that tight but good enough to catch
+-- problems due to naive usage.
+--
+-- There's a more extensive version (trac-xxx.lua) that supports nesting.
+--
+-- This will change when we have _ENV in lua 5.2+
+
+local trace_namespaces = false trackers.register("system.namespaces", function(v) trace_namespaces = v end)
+
+local report_system = logs.reporter("system","protection")
+
+namespaces = namespaces or { }
+local namespaces = namespaces
+
+local registered = { }
+
+local function report_index(k,name)
+ if trace_namespaces then
+ report_system("reference to '%s' in protected namespace '%s', %s",k,name,debug.traceback())
+ else
+ report_system("reference to '%s' in protected namespace '%s'",k,name)
+ end
+end
+
+local function report_newindex(k,name)
+ if trace_namespaces then
+ report_system("assignment to '%s' in protected namespace '%s', %s",k,name,debug.traceback())
+ else
+ report_system("assignment to '%s' in protected namespace '%s'",k,name)
+ end
+end
+
+local function register(name)
+ local data = name == "global" and _G or _G[name]
+ if not data then
+ return -- error
+ end
+ registered[name] = data
+ local m = getmetatable(data)
+ if not m then
+ m = { }
+ setmetatable(data,m)
+ end
+ local index, newindex = { }, { }
+ m.__saved__index = m.__index
+ m.__no__index = function(t,k)
+ if not index[k] then
+ index[k] = true
+ report_index(k,name)
+ end
+ return nil
+ end
+ m.__saved__newindex = m.__newindex
+ m.__no__newindex = function(t,k,v)
+ if not newindex[k] then
+ newindex[k] = true
+ report_newindex(k,name)
+ end
+ rawset(t,k,v)
+ end
+ m.__protection__depth = 0
+end
+
+local function private(name) -- maybe save name
+ local data = registered[name]
+ if not data then
+ data = _G[name]
+ if not data then
+ data = { }
+ _G[name] = data
+ end
+ register(name)
+ end
+ return data
+end
+
+local function protect(name)
+ local data = registered[name]
+ if not data then
+ return
+ end
+ local m = getmetatable(data)
+ local pd = m.__protection__depth
+ if pd > 0 then
+ m.__protection__depth = pd + 1
+ else
+ m.__save_d_index, m.__saved__newindex = m.__index, m.__newindex
+ m.__index, m.__newindex = m.__no__index, m.__no__newindex
+ m.__protection__depth = 1
+ end
+end
+
+local function unprotect(name)
+ local data = registered[name]
+ if not data then
+ return
+ end
+ local m = getmetatable(data)
+ local pd = m.__protection__depth
+ if pd > 1 then
+ m.__protection__depth = pd - 1
+ else
+ m.__index, m.__newindex = m.__saved__index, m.__saved__newindex
+ m.__protection__depth = 0
+ end
+end
+
+local function protectall()
+ for name, _ in next, registered do
+ if name ~= "global" then
+ protect(name)
+ end
+ end
+end
+
+local function unprotectall()
+ for name, _ in next, registered do
+ if name ~= "global" then
+ unprotect(name)
+ end
+ end
+end
+
+namespaces.register = register -- register when defined
+namespaces.private = private -- allocate and register if needed
+namespaces.protect = protect
+namespaces.unprotect = unprotect
+namespaces.protectall = protectall
+namespaces.unprotectall = unprotectall
+
+namespaces.private("namespaces") registered = { } register("global") -- unreachable
+
+directives.register("system.protect", function(v)
+ if v then
+ protectall()
+ else
+ unprotectall()
+ end
+end)
+
+directives.register("system.checkglobals", function(v)
+ if v then
+ report_system("enabling global namespace guard")
+ protect("global")
+ else
+ report_system("disabling global namespace guard")
+ unprotect("global")
+ end
+end)
+
+-- dummy section (will go to luat-dum.lua)
+
+--~ if not namespaces.private then
+--~ -- somewhat protected
+--~ local registered = { }
+--~ function namespaces.private(name)
+--~ local data = registered[name]
+--~ if data then
+--~ return data
+--~ end
+--~ local data = _G[name]
+--~ if not data then
+--~ data = { }
+--~ _G[name] = data
+--~ end
+--~ registered[name] = data
+--~ return data
+--~ end
+--~ function namespaces.protectall(list)
+--~ for name, data in next, list or registered do
+--~ setmetatable(data, { __newindex = function() print(string.format("table %s is protected",name)) end })
+--~ end
+--~ end
+--~ namespaces.protectall { namespaces = namespaces }
+--~ end
+
+--~ directives.enable("system.checkglobals")
+
+--~ namespaces.register("resolvers","trackers")
+--~ namespaces.protect("resolvers")
+--~ namespaces.protect("resolvers")
+--~ namespaces.protect("resolvers")
+--~ namespaces.unprotect("resolvers")
+--~ namespaces.unprotect("resolvers")
+--~ namespaces.unprotect("resolvers")
+--~ namespaces.protect("trackers")
+
+--~ resolvers.x = true
+--~ resolvers.y = true
+--~ trackers.a = ""
+--~ resolvers.z = true
+--~ oeps = { }
+
+--~ resolvers = namespaces.private("resolvers")
+--~ fonts = namespaces.private("fonts")
+--~ directives.enable("system.protect")
+--~ namespaces.protectall()
+--~ resolvers.xx = { }
diff --git a/Master/texmf-dist/tex/context/base/trac-set.lua b/Master/texmf-dist/tex/context/base/trac-set.lua
new file mode 100644
index 00000000000..27b5f17f2ad
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/trac-set.lua
@@ -0,0 +1,330 @@
+if not modules then modules = { } end modules ['trac-set'] = { -- might become util-set.lua
+ 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 type, next, tostring = type, next, tostring
+local concat = table.concat
+local format, find, lower, gsub, escapedpattern = string.format, string.find, string.lower, string.gsub, string.escapedpattern
+local is_boolean = string.is_boolean
+local settings_to_hash = utilities.parsers.settings_to_hash
+local allocate = utilities.storage.allocate
+
+utilities = utilities or { }
+local utilities = utilities
+utilities.setters = utilities.setters or { }
+local setters = utilities.setters
+
+local data = { } -- maybe just local
+
+-- We can initialize from the cnf file. This is sort of tricky as
+-- later defined setters also need to be initialized then. If set
+-- this way, we need to ensure that they are not reset later on.
+
+local trace_initialize = false -- only for testing during development
+
+function setters.initialize(filename,name,values) -- filename only for diagnostics
+ local setter = data[name]
+ if setter then
+ local data = setter.data
+ if data then
+ for key, value in next, values do
+ -- key = gsub(key,"_",".")
+ value = is_boolean(value,value)
+ local functions = data[key]
+ if functions then
+ if #functions > 0 and not functions.value then
+ if trace_initialize then
+ setter.report("executing %s (%s -> %s)",key,filename,tostring(value))
+ end
+ for i=1,#functions do
+ functions[i](value)
+ end
+ functions.value = value
+ else
+ if trace_initialize then
+ setter.report("skipping %s (%s -> %s)",key,filename,tostring(value))
+ end
+ end
+ else
+ -- we do a simple preregistration i.e. not in the
+ -- list as it might be an obsolete entry
+ functions = { default = value }
+ data[key] = functions
+ if trace_initialize then
+ setter.report("storing %s (%s -> %s)",key,filename,tostring(value))
+ end
+ end
+ end
+ return true
+ end
+ end
+end
+
+-- user interface code
+
+local function set(t,what,newvalue)
+ local data, done = t.data, t.done
+ if type(what) == "string" then
+ what = settings_to_hash(what) -- inefficient but ok
+ end
+ if type(what) ~= "table" then
+ return
+ end
+ for w, value in next, what do
+ if value == "" then
+ value = newvalue
+ elseif not value then
+ value = false -- catch nil
+ else
+ value = is_boolean(value,value)
+ end
+ w = "^" .. escapedpattern(w,true) .. "$" -- new: anchored
+ for name, functions in next, data do
+ if done[name] then
+ -- prevent recursion due to wildcards
+ elseif find(name,w) then
+ done[name] = true
+ for i=1,#functions do
+ functions[i](value)
+ end
+ functions.value = value
+ end
+ end
+ end
+end
+
+local function reset(t)
+ for name, functions in next, t.data do
+ for i=1,#functions do
+ functions[i](false)
+ end
+ functions.value = false
+ end
+end
+
+local function enable(t,what)
+ set(t,what,true)
+end
+
+local function disable(t,what)
+ local data = t.data
+ if not what or what == "" then
+ t.done = { }
+ reset(t)
+ else
+ set(t,what,false)
+ end
+end
+
+function setters.register(t,what,...)
+ local data = t.data
+ what = lower(what)
+ local functions = data[what]
+ if not functions then
+ functions = { }
+ data[what] = functions
+ if trace_initialize then
+ t.report("defining %s",what)
+ end
+ end
+ local default = functions.default -- can be set from cnf file
+ for _, fnc in next, { ... } do
+ local typ = type(fnc)
+ if typ == "string" then
+ if trace_initialize then
+ t.report("coupling %s to %s",what,fnc)
+ end
+ local s = fnc -- else wrong reference
+ fnc = function(value) set(t,s,value) end
+ elseif typ ~= "function" then
+ fnc = nil
+ end
+ if fnc then
+ functions[#functions+1] = fnc
+ -- default: set at command line or in cnf file
+ -- value : set in tex run (needed when loading runtime)
+ local value = functions.value or default
+ if value ~= nil then
+ fnc(value)
+ functions.value = value
+ end
+ end
+ end
+ return false -- so we can use it in an assignment
+end
+
+function setters.enable(t,what)
+ local e = t.enable
+ t.enable, t.done = enable, { }
+ enable(t,what)
+ t.enable, t.done = e, { }
+end
+
+function setters.disable(t,what)
+ local e = t.disable
+ t.disable, t.done = disable, { }
+ disable(t,what)
+ t.disable, t.done = e, { }
+end
+
+function setters.reset(t)
+ t.done = { }
+ reset(t)
+end
+
+function setters.list(t) -- pattern
+ local list = table.sortedkeys(t.data)
+ local user, system = { }, { }
+ for l=1,#list do
+ local what = list[l]
+ if find(what,"^%*") then
+ system[#system+1] = what
+ else
+ user[#user+1] = what
+ end
+ end
+ return user, system
+end
+
+function setters.show(t)
+ local category = t.name
+ local list = setters.list(t)
+ t.report()
+ for k=1,#list do
+ local name = list[k]
+ local functions = t.data[name]
+ if functions then
+ local value, default, modules = functions.value, functions.default, #functions
+ value = value == nil and "unset" or tostring(value)
+ default = default == nil and "unset" or tostring(default)
+ t.report("%-30s modules: %2i default: %6s value: %6s",name,modules,default,value)
+ end
+ end
+ t.report()
+end
+
+-- we could have used a bit of oo and the trackers:enable syntax but
+-- there is already a lot of code around using the singular tracker
+
+-- we could make this into a module but we also want the rest avaliable
+
+local enable, disable, register, list, show = setters.enable, setters.disable, setters.register, setters.list, setters.show
+
+local function report(setter,...)
+ local report = logs and logs.report
+ if report then
+ report(setter.name,...)
+ else -- fallback, as this module is loaded before the logger
+ write_nl(format("%-15s : %s\n",setter.name,format(...)))
+ end
+end
+
+function setters.new(name)
+ local setter -- we need to access it in setter itself
+ setter = {
+ data = allocate(), -- indexed, but also default and value fields
+ name = name,
+ report = function(...) report (setter,...) end,
+ enable = function(...) enable (setter,...) end,
+ disable = function(...) disable (setter,...) end,
+ register = function(...) register(setter,...) end,
+ list = function(...) list (setter,...) end,
+ show = function(...) show (setter,...) end,
+ }
+ data[name] = setter
+ return setter
+end
+
+trackers = setters.new("trackers")
+directives = setters.new("directives")
+experiments = setters.new("experiments")
+
+local t_enable, t_disable, t_report = trackers .enable, trackers .disable, trackers .report
+local d_enable, d_disable, d_report = directives .enable, directives .disable, directives .report
+local e_enable, e_disable, e_report = experiments.enable, experiments.disable, experiments.report
+
+-- nice trick: we overload two of the directives related functions with variants that
+-- do tracing (itself using a tracker) .. proof of concept
+
+local trace_directives = false local trace_directives = false trackers.register("system.directives", function(v) trace_directives = v end)
+local trace_experiments = false local trace_experiments = false trackers.register("system.experiments", function(v) trace_experiments = v end)
+
+function directives.enable(...)
+ if trace_directives then
+ d_report("enabling: %s",concat({...}," "))
+ end
+ d_enable(...)
+end
+
+function directives.disable(...)
+ if trace_directives then
+ d_report("disabling: %s",concat({...}," "))
+ end
+ d_disable(...)
+end
+
+function experiments.enable(...)
+ if trace_experiments then
+ e_report("enabling: %s",concat({...}," "))
+ end
+ e_enable(...)
+end
+
+function experiments.disable(...)
+ if trace_experiments then
+ e_report("disabling: %s",concat({...}," "))
+ end
+ e_disable(...)
+end
+
+-- a useful example
+
+directives.register("system.nostatistics", function(v)
+ statistics.enable = not v
+end)
+
+directives.register("system.nolibraries", function(v)
+ libraries = nil -- we discard this tracing for security
+end)
+
+-- experiment
+
+local flags = environment and environment.engineflags
+
+if flags then
+ if trackers and flags.trackers then
+ setters.initialize("flags","trackers", settings_to_hash(flags.trackers))
+ -- t_enable(flags.trackers)
+ end
+ if directives and flags.directives then
+ setters.initialize("flags","directives", settings_to_hash(flags.directives))
+ -- d_enable(flags.directives)
+ end
+end
+
+-- here
+
+if texconfig then
+
+ local function set(k,v)
+ v = tonumber(v)
+ if v then
+ texconfig[k] = v
+ end
+ end
+
+ directives.register("luatex.expanddepth", function(v) set("expand_depth",v) end)
+ directives.register("luatex.hashextra", function(v) set("hash_extra",v) end)
+ directives.register("luatex.nestsize", function(v) set("nest_size",v) end)
+ directives.register("luatex.maxinopen", function(v) set("max_in_open",v) end)
+ directives.register("luatex.maxprintline", function(v) set("max_print_line",v) end)
+ directives.register("luatex.maxstrings", function(v) set("max_strings",v) end)
+ directives.register("luatex.paramsize", function(v) set("param_size",v) end)
+ directives.register("luatex.savesize", function(v) set("save_size",v) end)
+ directives.register("luatex.stacksize", function(v) set("stack_size",v) end)
+
+end
diff --git a/Master/texmf-dist/tex/context/base/trac-tex.lua b/Master/texmf-dist/tex/context/base/trac-tex.lua
new file mode 100644
index 00000000000..dcfbf965d23
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/trac-tex.lua
@@ -0,0 +1,74 @@
+if not modules then modules = { } end modules ['trac-hsh'] = {
+ version = 1.001,
+ comment = "companion to trac-deb.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- moved from trac-deb.lua
+
+local format = string.format
+
+local texhashtokens = tex.hashtokens
+
+local trackers = trackers
+
+local saved = { }
+
+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
+ end
+ dk.names[name] = { token[2], token[3] }
+ dk.found = dk.found + 1
+ end
+ end
+ io.savedata(filename or tex.jobname .. "-hash.log",table.serialize(list,true))
+end
+
+local delta = nil
+
+local function dump_hash(wanteddelta)
+ if delta == nil then
+ saved = saved or texhashtokens() -- no need for trackers.dump_hash
+ luatex.registerstopactions(1,function() dump_hash(nil,wanteddelta) end) -- at front
+ end
+ delta = wanteddelta
+end
+
+directives.register("system.dumphash", function() dump_hash(false) end)
+directives.register("system.dumpdelta", function() dump_hash(true ) end)
+
+local report_dump = logs.reporter("resolvers","dump")
+
+local function saveusedfilesintrees(format)
+ local data = {
+ jobname = environment.jobname or "?",
+ version = environment.version or "?",
+ files = table.sortedkeys(resolvers.instance.foundintrees)
+ }
+ local filename = file.replacesuffix(environment.jobname or "context-job",'jlg')
+ if format == "lua" then
+ io.savedata(filename,table.serialize(data,true))
+ else
+ io.savedata(filename,table.toxml(data,"job"))
+ end
+end
+
+directives.register("system.dumpfiles", function(v)
+ luatex.registerstopactions(function() saveusedfilesintrees(v) end)
+end)
+
diff --git a/Master/texmf-dist/tex/context/base/trac-tex.mkiv b/Master/texmf-dist/tex/context/base/trac-tex.mkiv
index 9c596feabc3..37eca912342 100644
--- a/Master/texmf-dist/tex/context/base/trac-tex.mkiv
+++ b/Master/texmf-dist/tex/context/base/trac-tex.mkiv
@@ -13,6 +13,8 @@
\writestatus{loading}{ConTeXt Tracking Macros / TeX}
+\registerctxluafile{trac-tex}{1.001}
+
%D All tracing flags at the \TEX\ end will be redone this way so
%D that we have a similar mechanism for \TEX\ and \LUA. Also, the
%D currently used if's might become conditionals.
@@ -33,23 +35,8 @@
\def\doenabletextracer #1{\csname enabletracer#1\endcsname}
\def\dodisabletextracer#1{\csname disabletracer#1\endcsname}
-% context --directives=system.nostatistics ...
-
-\def\nomkivstatistics{\ctxlua{statistics.enable = false}} % for taco
-
-\def\tracersdumphash {\ctxlua{tracers.register_dump_hash(false)}}
-\def\tracersdumpdelta{\ctxlua{tracers.register_dump_hash(true)}}
-
-% wrong place:
-
-\def\traceluausage
- {\dosingleempty\dotraceluausage}
+% The next one is for Taco, although we can use directives as well:
-\def\dotraceluausage[#1]%
- {\ctxlua{debugger.enable()}%
- \appendtoks
- \ctxlua{debugger.disable() debugger.showstats(print,\doifnumberelse{#1}{#1}{5000})}^
- \to \everybye
- \gdef\dotraceluausage[#1]{}}
+\def\nomkivstatistics{\enabledirectives[system.nostatistics]}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/trac-tim.lua b/Master/texmf-dist/tex/context/base/trac-tim.lua
index a8725bb5c11..de7ceca4610 100644
--- a/Master/texmf-dist/tex/context/base/trac-tim.lua
+++ b/Master/texmf-dist/tex/context/base/trac-tim.lua
@@ -10,12 +10,9 @@ local format, gsub = string.format, string.gsub
local concat, sort = table.concat, table.sort
local next, tonumber = next, tonumber
-plugins = plugins or { }
-plugins.progress = plugins.progress or { }
-
-local progress = plugins.progress
-
-progress = progress or { }
+moduledata = moduledata or { }
+moduledata.progress = moduledata.progress or { }
+local progress = moduledata.progress
progress.defaultfilename = ((tex and tex.jobname) or "whatever") .. "-luatex-progress"
@@ -39,7 +36,7 @@ local params = {
local last = os.clock()
local data = { }
-function progress.save()
+function progress.save(name)
io.savedata((name or progress.defaultfilename) .. ".lut",table.serialize(data,true))
data = { }
end
@@ -48,7 +45,7 @@ function progress.store()
local c = os.clock()
local t = {
elapsed_time = c - last,
- node_memory = nodes.usage(),
+ node_memory = nodes.pool.usage(),
}
for k, v in next, params do
if status[v] then t[v] = status[v] end
@@ -129,8 +126,8 @@ local function convert(name)
sort(names)
processed[name] = {
names = names,
- top = top,
- bot = bot,
+ top = top,
+ bot = bot,
pages = pages,
paths = paths,
}
@@ -143,18 +140,23 @@ progress.convert = convert
function progress.bot(name,tag)
return convert(name).bot[tag] or 0
end
+
function progress.top(name,tag)
return convert(name).top[tag] or 0
end
+
function progress.pages(name,tag)
return convert(name).pages or 0
end
+
function progress.path(name,tag)
return convert(name).paths[tag] or "origin"
end
+
function progress.nodes(name)
return convert(name).names or { }
end
+
function progress.parameters(name)
return params -- shared
end
diff --git a/Master/texmf-dist/tex/context/base/trac-tra.lua b/Master/texmf-dist/tex/context/base/trac-tra.lua
deleted file mode 100644
index 052e4bba78f..00000000000
--- a/Master/texmf-dist/tex/context/base/trac-tra.lua
+++ /dev/null
@@ -1,341 +0,0 @@
-if not modules then modules = { } end modules ['trac-tra'] = {
- version = 1.001,
- comment = "companion to trac-tra.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- the <anonymous> tag is kind of generic and used for functions that are not
--- bound to a variable, like node.new, node.copy etc (contrary to for instance
--- node.has_attribute which is bound to a has_attribute local variable in mkiv)
-
-local debug = require "debug"
-
-local getinfo = debug.getinfo
-local type, next = type, next
-local concat = table.concat
-local format, find, lower, gmatch, gsub = string.format, string.find, string.lower, string.gmatch, string.gsub
-
-debugger = debugger or { }
-
-local counters = { }
-local names = { }
-
--- one
-
-local function hook()
- local f = getinfo(2,"f").func
- local n = getinfo(2,"Sn")
--- if n.what == "C" and n.name then print (n.namewhat .. ': ' .. n.name) end
- if f then
- local cf = counters[f]
- if cf == nil then
- counters[f] = 1
- names[f] = n
- else
- counters[f] = cf + 1
- end
- end
-end
-local function getname(func)
- local n = names[func]
- if n then
- if n.what == "C" then
- return n.name or '<anonymous>'
- else
- -- source short_src linedefined what name namewhat nups func
- local name = n.name or n.namewhat or n.what
- if not name or name == "" then name = "?" end
- return format("%s : %s : %s", n.short_src or "unknown source", n.linedefined or "--", name)
- end
- else
- return "unknown"
- end
-end
-function debugger.showstats(printer,threshold)
- printer = printer or texio.write or print
- threshold = threshold or 0
- local total, grandtotal, functions = 0, 0, 0
- printer("\n") -- ugly but ok
- -- table.sort(counters)
- for func, count in next, counters do
- if count > threshold then
- local name = getname(func)
- if not find(name,"for generator") then
- printer(format("%8i %s", count, name))
- total = total + count
- end
- end
- grandtotal = grandtotal + count
- functions = functions + 1
- end
- printer(format("functions: %s, total: %s, grand total: %s, threshold: %s\n", functions, total, grandtotal, threshold))
-end
-
--- two
-
---~ local function hook()
---~ local n = getinfo(2)
---~ if n.what=="C" and not n.name then
---~ local f = tostring(debug.traceback())
---~ local cf = counters[f]
---~ if cf == nil then
---~ counters[f] = 1
---~ names[f] = n
---~ else
---~ counters[f] = cf + 1
---~ end
---~ end
---~ end
---~ function debugger.showstats(printer,threshold)
---~ printer = printer or texio.write or print
---~ threshold = threshold or 0
---~ local total, grandtotal, functions = 0, 0, 0
---~ printer("\n") -- ugly but ok
---~ -- table.sort(counters)
---~ for func, count in next, counters do
---~ if count > threshold then
---~ printer(format("%8i %s", count, func))
---~ total = total + count
---~ end
---~ grandtotal = grandtotal + count
---~ functions = functions + 1
---~ end
---~ printer(format("functions: %s, total: %s, grand total: %s, threshold: %s\n", functions, total, grandtotal, threshold))
---~ end
-
--- rest
-
-function debugger.savestats(filename,threshold)
- local f = io.open(filename,'w')
- if f then
- debugger.showstats(function(str) f:write(str) end,threshold)
- f:close()
- end
-end
-
-function debugger.enable()
- debug.sethook(hook,"c")
-end
-
-function debugger.disable()
- debug.sethook()
---~ counters[debug.getinfo(2,"f").func] = nil
-end
-
-function debugger.tracing()
- local n = tonumber(os.env['MTX.TRACE.CALLS']) or tonumber(os.env['MTX_TRACE_CALLS']) or 0
- if n > 0 then
- function debugger.tracing() return true end ; return true
- else
- function debugger.tracing() return false end ; return false
- end
-end
-
---~ debugger.enable()
-
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
---~ print(math.sin(1*.5))
-
---~ debugger.disable()
-
---~ print("")
---~ debugger.showstats()
---~ print("")
---~ debugger.showstats(print,3)
-
-setters = setters or { }
-setters.data = setters.data or { }
-
---~ local function set(t,what,value)
---~ local data, done = t.data, t.done
---~ if type(what) == "string" then
---~ what = aux.settings_to_array(what) -- inefficient but ok
---~ end
---~ for i=1,#what do
---~ local w = what[i]
---~ for d, f in next, data do
---~ if done[d] then
---~ -- prevent recursion due to wildcards
---~ elseif find(d,w) then
---~ done[d] = true
---~ for i=1,#f do
---~ f[i](value)
---~ end
---~ end
---~ end
---~ end
---~ end
-
-local function set(t,what,value)
- local data, done = t.data, t.done
- if type(what) == "string" then
- what = aux.settings_to_hash(what) -- inefficient but ok
- end
- for w, v in next, what do
- if v == "" then
- v = value
- else
- v = toboolean(v)
- end
- for d, f in next, data do
- if done[d] then
- -- prevent recursion due to wildcards
- elseif find(d,w) then
- done[d] = true
- for i=1,#f do
- f[i](v)
- end
- end
- end
- end
-end
-
-local function reset(t)
- for d, f in next, t.data do
- for i=1,#f do
- f[i](false)
- end
- end
-end
-
-local function enable(t,what)
- set(t,what,true)
-end
-
-local function disable(t,what)
- local data = t.data
- if not what or what == "" then
- t.done = { }
- reset(t)
- else
- set(t,what,false)
- end
-end
-
-function setters.register(t,what,...)
- local data = t.data
- what = lower(what)
- local w = data[what]
- if not w then
- w = { }
- data[what] = w
- end
- for _, fnc in next, { ... } do
- local typ = type(fnc)
- if typ == "function" then
- w[#w+1] = fnc
- elseif typ == "string" then
- w[#w+1] = function(value) set(t,fnc,value,nesting) end
- end
- end
-end
-
-function setters.enable(t,what)
- local e = t.enable
- t.enable, t.done = enable, { }
- enable(t,string.simpleesc(tostring(what)))
- t.enable, t.done = e, { }
-end
-
-function setters.disable(t,what)
- local e = t.disable
- t.disable, t.done = disable, { }
- disable(t,string.simpleesc(tostring(what)))
- t.disable, t.done = e, { }
-end
-
-function setters.reset(t)
- t.done = { }
- reset(t)
-end
-
-function setters.list(t) -- pattern
- local list = table.sortedkeys(t.data)
- local user, system = { }, { }
- for l=1,#list do
- local what = list[l]
- if find(what,"^%*") then
- system[#system+1] = what
- else
- user[#user+1] = what
- end
- end
- return user, system
-end
-
-function setters.show(t)
- commands.writestatus("","")
- local list = setters.list(t)
- for k=1,#list do
- commands.writestatus(t.name,list[k])
- end
- commands.writestatus("","")
-end
-
--- we could have used a bit of oo and the trackers:enable syntax but
--- there is already a lot of code around using the singular tracker
-
--- we could make this into a module
-
-function setters.new(name)
- local t
- t = {
- data = { },
- name = name,
- enable = function(...) setters.enable (t,...) end,
- disable = function(...) setters.disable (t,...) end,
- register = function(...) setters.register(t,...) end,
- list = function(...) setters.list (t,...) end,
- show = function(...) setters.show (t,...) end,
- }
- setters.data[name] = t
- return t
-end
-
-trackers = setters.new("trackers")
-directives = setters.new("directives")
-experiments = setters.new("experiments")
-
--- nice trick: we overload two of the directives related functions with variants that
--- do tracing (itself using a tracker) .. proof of concept
-
-local trace_directives = false local trace_directives = false trackers.register("system.directives", function(v) trace_directives = v end)
-local trace_experiments = false local trace_experiments = false trackers.register("system.experiments", function(v) trace_experiments = v end)
-
-local e = directives.enable
-local d = directives.disable
-
-function directives.enable(...)
- commands.writestatus("directives","enabling: %s",concat({...}," "))
- e(...)
-end
-
-function directives.disable(...)
- commands.writestatus("directives","disabling: %s",concat({...}," "))
- d(...)
-end
-
-local e = experiments.enable
-local d = experiments.disable
-
-function experiments.enable(...)
- commands.writestatus("experiments","enabling: %s",concat({...}," "))
- e(...)
-end
-
-function experiments.disable(...)
- commands.writestatus("experiments","disabling: %s",concat({...}," "))
- d(...)
-end
-
--- a useful example
-
-directives.register("system.nostatistics", function(v)
- statistics.enable = not v
-end)
-
diff --git a/Master/texmf-dist/tex/context/base/trac-vis.mkiv b/Master/texmf-dist/tex/context/base/trac-vis.mkiv
index 6b0fdba9487..2056dc6355a 100644
--- a/Master/texmf-dist/tex/context/base/trac-vis.mkiv
+++ b/Master/texmf-dist/tex/context/base/trac-vis.mkiv
@@ -261,11 +261,11 @@
\newdimen\tractempheight
\newdimen\tractempdepth
-\def\cutmarklength {2\bodyfontsize}
+\def \cutmarklength {2\bodyfontsize}
-\chardef\horizontalcutmarks = 2
-\chardef\verticalcutmarks = 2
-\chardef\cutmarkoffset = 1
+\newcount\horizontalcutmarks \horizontalcutmarks = 2
+\newcount\verticalcutmarks \verticalcutmarks = 2
+\newcount\cutmarkoffset \cutmarkoffset = 1
\let\cutmarksymbol = \relax
\let\cutmarktoptext = \empty
diff --git a/Master/texmf-dist/tex/context/base/type-ghz.mkiv b/Master/texmf-dist/tex/context/base/type-ghz.mkiv
index e6a12d7e33b..34a3aa53c9c 100644
--- a/Master/texmf-dist/tex/context/base/type-ghz.mkiv
+++ b/Master/texmf-dist/tex/context/base/type-ghz.mkiv
@@ -151,16 +151,16 @@
\starttypescript[optima-nova]
\definetypeface[optima][ss][sans][optima-nova] [default][features=default]
\definetypeface[optima][rm][sans][optima-nova] [default][features=default]
- \definetypeface[optima][tt][mono][latin-modern][default][features=default,rscale=1.1]
- \definetypeface[optima][mm][math][latin-modern][default][features=default,rscale=1.1]
+ \definetypeface[optima][tt][mono][modern] [default][rscale=1.1]
+ \definetypeface[optima][mm][math][modern] [default][rscale=1.1]
\quittypescriptscanning
\stoptypescript
\starttypescript[optima-nova-os]
\definetypeface[optima-os][ss][sans][optima-nova-os] [default][features=default]
\definetypeface[optima-os][rm][sans][optima-nova-os] [default][features=default]
- \definetypeface[optima-os][tt][mono][latin-modern] [default][features=default,rscale=1.1]
- \definetypeface[optima-os][mm][math][latin-modern] [default][features=default,rscale=1.1]
+ \definetypeface[optima-os][tt][mono][modern] [default][rscale=1.1]
+ \definetypeface[optima-os][mm][math][modern] [default][rscale=1.1]
\quittypescriptscanning
\stoptypescript
@@ -192,7 +192,7 @@
\stoptypescript
-\starttypescript [serif] [palatino-nova-light] [name] % may change
+\starttypescript [serif] [palatino-nova-light] [name]% may change
\definefontsynonym [Serif] [PalatinoNova-Light]
\definefontsynonym [SerifItalic] [PalatinoNova-LightItalic]
@@ -203,7 +203,7 @@
\stoptypescript
-\starttypescript [serif] [palatino-nova-medium] [name] % may change
+\starttypescript [serif] [palatino-nova-medium] [name]% may change
\definefontsynonym [Serif] [PalatinoNova-Medium]
\definefontsynonym [SerifItalic] [PalatinoNova-MediumItalic]
@@ -269,24 +269,24 @@
\starttypescript[palatino,palatino-nova]
\definetypeface[palatino][rm][serif][palatino-nova][default][features=default]
\definetypeface[palatino][ss][sans] [palatino-sans][default][features=default]
- \definetypeface[palatino][tt][mono] [latin-modern] [default][features=default,rscale=1.1]
- \definetypeface[palatino][mm][math] [palatino] [default][features=default] % ,rscale=1.1]
+ \definetypeface[palatino][tt][mono] [modern] [default][rscale=1.1]
+ \definetypeface[palatino][mm][math] [palatino] [default]% [rscale=1.1]
\quittypescriptscanning
\stoptypescript
\starttypescript[palatino-sans]
\definetypeface[palatino][ss][sans] [palatino-sans][default][features=default]
\definetypeface[palatino][rm][serif][palatino-nova][default][features=default]
- \definetypeface[palatino][tt][mono] [latin-modern] [default][features=default,rscale=1.1]
- \definetypeface[palatino][mm][math] [palatino] [default][features=default] % ,rscale=1.1]
+ \definetypeface[palatino][tt][mono] [modern] [default][rscale=1.1]
+ \definetypeface[palatino][mm][math] [palatino] [default] % [rscale=1.1]
\quittypescriptscanning
\stoptypescript
\starttypescript[palatino-informal]
\definetypeface[palatino-informal][ss][sans] [palatino-informal][default][features=default]
\definetypeface[palatino-informal][rm][serif][palatino-nova] [default][features=default]
- \definetypeface[palatino-informal][tt][mono] [latin-modern] [default][features=default,rscale=1.1]
- \definetypeface[palatino-informal][mm][math] [palatino] [default][features=default] % ,rscale=1.1]
+ \definetypeface[palatino-informal][tt][mono] [latin-modern] [default][features=none,rscale=1.1]
+ \definetypeface[palatino-informal][mm][math] [palatino] [default][features=default]% ,rscale=1.1]
\quittypescriptscanning
\stoptypescript
diff --git a/Master/texmf-dist/tex/context/base/type-ini.lua b/Master/texmf-dist/tex/context/base/type-ini.lua
new file mode 100644
index 00000000000..fd1282474bc
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/type-ini.lua
@@ -0,0 +1,31 @@
+if not modules then modules = { } end modules ['type-ini'] = {
+ version = 1.001,
+ comment = "companion to type-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- more code will move here
+
+local format, gsub = string.format, string.gsub
+
+local patterns = { "type-imp-%s.mkiv", "type-imp-%s.tex", "type-%s.mkiv", "type-%s.tex" }
+
+function commands.doprocesstypescriptfile(name)
+ name = gsub(name,"^type%-","")
+ for i=1,#patterns do
+ local filename = format(patterns[i],name)
+ local foundname = resolvers.finders.doreadfile("any",".",filename)
+ if foundname ~= "" then
+ context.startreadingfile()
+ context.pushendofline()
+ context.unprotect()
+ context.input(foundname)
+ context.protect()
+ context.popendofline()
+ context.stopreadingfile()
+ return
+ end
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/type-ini.mkii b/Master/texmf-dist/tex/context/base/type-ini.mkii
index ac1e243f248..d15bb565b57 100644
--- a/Master/texmf-dist/tex/context/base/type-ini.mkii
+++ b/Master/texmf-dist/tex/context/base/type-ini.mkii
@@ -581,15 +581,16 @@
{\dododefinetypeface[#1][#2]%
\iffifthargument % sixth is optional
% we need to expand since in #6 there can be a \typescripttwo
- \expanded{\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!fallbacks=,\s!text=,#6]}% \geteparameters
+% \expanded{\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!fallbacks=,\s!text=,#6]}% \geteparameters
+ \expanded{\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!text=,#6]}% \geteparameters
\pushmacro\relativefontsize
\pushmacro\typefaceencoding
\pushmacro\fontclass
\let\relativefontsize\@@tsrscale
\let\typefaceencoding\@@tsencoding
\setcurrentfontclass{#1}%
- \letvalue{\fontclass\s!features }\@@tsfeatures % new per 16/6/2007
- \letvalue{\fontclass\s!fallbacks}\@@tsfallbacks % new per 12/10/2008
+% \letvalue{\fontclass\s!features }\@@tsfeatures % new per 16/6/2007
+% \letvalue{\fontclass\s!fallbacks}\@@tsfallbacks % new per 12/10/2008
\saverelativefontsize{#2}\relativefontsize % fall back
\savemathtextstyle\@@tstext % math text style (new per 28/4/2006)
\iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4] / \typefaceencoding}\fi
@@ -718,7 +719,7 @@
\the\scratchtoks
\fi}
-\fetchruntimecommand \typetypescript {\f!typeprefix\s!run.mkii}
+\fetchruntimecommand \typetypescript {\f!typeprefix\s!run}
% \usetypescript [berry] [ec]
diff --git a/Master/texmf-dist/tex/context/base/type-ini.mkiv b/Master/texmf-dist/tex/context/base/type-ini.mkiv
index cd65f8abb4a..46b46976dc0 100644
--- a/Master/texmf-dist/tex/context/base/type-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/type-ini.mkiv
@@ -13,50 +13,13 @@
\writestatus{loading}{ConTeXt Typescript Macros / Initialization}
+\registerctxluafile{type-ini}{1.001}
+
%D The default fontclass is empty. We could demand always using fontclasses,
%D and then make the calling macros simplier (always assume fontclass) but
%D apart from downward compatibility issues, it would make global, class
%D spanning definitions a pain. Some day we will introduce a default class.
-% torture test : proper typefaces (and namespace)
-%
-% \starttext
-% \usetypescript[modern][default] default: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
-% \usetypescript[modern][texnansi] texnansi: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
-% \usetypescript[modern][ec] ec: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
-% \usetypescript[modern][qx] qx: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
-% \usetypescript[modern][t5] t5: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
-% \stoptext
-%
-% torture test : no typeface, just definitions
-%
-% \starttext
-% {\setupbodyfont[reset] \setupbodyfont[cmr] cmr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
-% {\setupbodyfont[reset] \setupbodyfont[plr] plr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
-% {\setupbodyfont[reset] \setupbodyfont[csr] csr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
-% {\setupbodyfont[reset] \setupbodyfont[vnr] vnr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
-% {\setupbodyfont[reset] \setupbodyfont[aer] aer: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
-% \stoptext
-
-% \usetypescript [modern] [texnansi]
-%
-% normal : 1450 ms
-% exa quit : 1300 ms (150 ms)
-% preload : 825 ms (635 ms) (40-50%)
-%
-% \usetypescript [modern] [texnansi]
-% \usetypescript [palatino][texnansi]
-% \usetypescript [times] [texnansi]
-%
-% normal : 3200 ms
-% exa quit : 2700 ms ( 500 ms)
-% preload : 1300 ms (1900 ms) (60-70%)
-
-% \usetypescript [modern][\defaultencoding]
-% \usetypescript [map] [latin-modern-os] [\defaultencoding]
-% \setupbodyfont[modern]
-% test 1234 test
-
\unprotect
\unexpanded\def\starttypescriptcollection
@@ -90,6 +53,8 @@
\newtoks\documenttypescripts
+% tricky ... here we push/pop
+
\chardef\typescriptmethod\plusone % 1: empty==all==true 2: empty==false
\chardef\typescriptstate \plustwo % 1: process 2: store
@@ -128,11 +93,31 @@
\def\preloadtypescripts{\ifproductionrun\settrue\preloadingtypescripts\fi}
+\prependtoks
+ \preloadtypescripts
+\to \everyjob
+
+% \long\def\xxstarttypescript#1\stoptypescript
+% {\global\loadedtypescripts\@EA{\the\loadedtypescripts\starttypescript#1\stoptypescript}}
+%
+% \long\def\xxstarttypescriptcollection#1\stoptypescriptcollection
+% {\global\loadedtypescripts\@EA{\the\loadedtypescripts\starttypescriptcollection#1\stoptypescriptcollection}}
+
+\newcount\nofpreloadedtypescripts % it's faster to append references than blobs
+
\long\def\xxstarttypescript#1\stoptypescript
- {\global\loadedtypescripts\@EA{\the\loadedtypescripts\starttypescript#1\stoptypescript}}
+ {\global\advance\nofpreloadedtypescripts\plusone
+ \edef\currentpreloadedtypescript{\??ts:\the\nofpreloadedtypescripts}%
+ \setgvalue\currentpreloadedtypescript{\starttypescript#1\stoptypescript}%
+ %\global\loadedtypescripts\@EAEAEA{\@EA\the\@EA\loadedtypescripts\@EA\getvalue\@EA{\currentpreloadedtypescript}}}
+ \normalexpanded{\global\loadedtypescripts{\the\@EA\loadedtypescripts\noexpand\csname\currentpreloadedtypescript\endcsname}}}
\long\def\xxstarttypescriptcollection#1\stoptypescriptcollection
- {\global\loadedtypescripts\@EA{\the\loadedtypescripts\starttypescriptcollection#1\stoptypescriptcollection}}
+ {\global\advance\nofpreloadedtypescripts\plusone
+ \edef\currentpreloadedtypescript{\??ts:\the\nofpreloadedtypescripts}%
+ \setgvalue\currentpreloadedtypescript{\starttypescriptcollection#1\stoptypescriptcollection}%
+ %\global\loadedtypescripts\@EAEAEA{\@EA\the\@EA\loadedtypescripts\@EA\getvalue\@EA{\currentpreloadedtypescript}}}
+ \normalexpanded{\global\loadedtypescripts{\the\@EA\loadedtypescripts\noexpand\csname\currentpreloadedtypescript\endcsname}}}
\def\dododousetypescriptfile#1%
{\setfalse\quittingtypescript
@@ -166,14 +151,7 @@
\expandafter\let\csname\??ts:\c!file:\currenttypefile\endcsname\loadedtypescripts}
\def\doprocesstypescriptfile
- {\startreadingfile
- \pushendofline
- \unprotect
- % we could have something readfilewithMKfallback
- \readfile{\currenttypefile.\mksuffix}\donothing{\readfile\currenttypefile\donothing\donothing}%
- \protect
- \popendofline
- \stopreadingfile}
+ {\ctxcommand{doprocesstypescriptfile("\currenttypefile")}}
\def\usetypescriptonce
{\dotripleempty\dousetypescriptonce}
@@ -334,17 +312,9 @@
\def\loadmapfile{\dosingleempty\doloadmapfile}
\def\loadmapline{\dodoubleempty\doloadmapline}
-\def\doloadmapfile [#1]{\ctxlua{fonts.map.loadfile("#1")}}
-\def\doloadmapline [#1][#2]{\ctxlua{fonts.map.loadline("#1","#2")}}
-\def\forgetmapfiles {\ctxlua{fonts.map.reset()}}
-
-\let\loadallfontmapfiles\relax
-\let\allfontmapsfiles \empty
-\let\preloadmapfile \loadmapfile
-\let\resetmapfiles \forgetmapfiles
-\let\disablemapfiles \forgetmapfiles
-
-\newif\ifautoloadmapfiles
+\def\doloadmapfile [#1]{\ctxlua{fonts.mappings.loadfile("#1")}}
+\def\doloadmapline [#1][#2]{\ctxlua{fonts.mappings.loadline("#1","#2")}}
+\def\forgetmapfiles {\ctxlua{fonts.mappings.reset()}}
% \appendtoks
% \pdfmapfile{}% somehow does not work at the lua end
@@ -398,73 +368,46 @@
% #1=main #2=rm #3=serif #4=fontname #5=size #6=settings
-% we can use \rawgetparameters or \rawgeteparameters
-
-\def\typefaceencoding{\defaultencoding}
-
-% we need to keep typefaceencoding for a while as it can still be used to filter
-% old scripts as we just strip the texnansi- prefix
-
-% \def\dostarttypefacedefining#1#2%
-% {\pushmacro\fontclass
-% \setcurrentfontclass{#1}%
-% \pushmacro\relativefontsize
-% \let\relativefontsize\@@tsrscale % still needed ?
-% \savefontclassparameters{#2}\@@tsrscale\@@tsfeatures\@@tsfallbacks}
-%
-% \def\dostoptypefacedefining
-% {\popmacro\relativefontsize
-% \popmacro\fontclass}
-%
-% \def\dodefinetypeface[#1][#2][#3][#4][#5][#6]%
-% {\dododefinetypeface[#1][#2]%
-% \iffifthargument % sixth is optional, we need to expand since in #6 there can be a \typescripttwo
-% % \normalexpanded{\noexpand\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!fallbacks=,#6]}% \geteparameters
-% \geteparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!fallbacks=,#6]%
-% \dostarttypefacedefining{#1}{#2}%
-% \pushmacro\typefaceencoding
-% \let\typefaceencoding\@@tsencoding
-% \iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4]}\fi
-% \ifx\typefaceencoding\t!default
-% \usetypescript[#3][#4][\t!name,\t!default]% will be default some day
-% \else
-% \usetypescript[#3][#4][\t!name,\t!default,\typefaceencoding]%
-% \fi
-% \usetypescript[#3][#5][\t!size]%
-% %
-% \dostoptypefacedefining
-% %
-% \popmacro\typefaceencoding
-% \else\iffourthargument
-% \definetypeface[#1][#2][#3][#4][\s!default]%
-% \else\ifthirdargument
-% \getparameters[\??tf#1#2][#3]%
-% \fi\fi\fi}
+\let\typefaceencoding\s!default % obsolete
\def\dostarttypefacedefining#1#2#3%
- {\geteparameters[\??ts][\s!rscale=\plusone,\s!features=,\s!fallbacks=,#3]%
+ {\geteparameters[\??ts][\s!rscale=\plusone,\s!features=,\s!fallbacks=,\s!goodies=,#3]%
\pushmacro\fontclass
\setcurrentfontclass{#1}%
\pushmacro\relativefontsize
\let\relativefontsize\@@tsrscale % still needed ?
- \savefontclassparameters{#2}\@@tsrscale\@@tsfeatures\@@tsfallbacks}
+ \savefontclassparameters{#2}\@@tsrscale\@@tsfeatures\@@tsfallbacks\@@tsgoodies}
\def\dostoptypefacedefining
{\popmacro\relativefontsize
\popmacro\fontclass}
-\def\dodefinetypeface[#1][#2][#3][#4][#5][#6]%
+\def\dofastdefinetypeface#1#2#3#4#5%
{\dododefinetypeface[#1][#2]%
- \iffifthargument % sixth is optional, we need to expand since in #6 there can be a \typescripttwo
+ \dostarttypefacedefining{#1}{#2}{#5}%
+ \usetypescript[#3][#4][\t!size]%
+ \dostoptypefacedefining}
+
+\def\dodefinetypeface[#1][#2][#3][#4][#5][#6]%
+ {\iffifthargument % sixth is optional, we need to expand since in #6 there can be a \typescripttwo
\iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4]}\fi
+ \dododefinetypeface[#1][#2]%
\dostarttypefacedefining{#1}{#2}{#6}%
- \usetypescript[#3][#4][\t!name,\t!default]%
- \usetypescript[#3][#5][\t!size]%
+ \usetypescript[#3][#4][\t!name,\t!default]%
+ \usetypescript[#3][#5][\t!size]%
\dostoptypefacedefining
\else\iffourthargument
- \definetypeface[#1][#2][#3][#4][\s!default]%
+ \iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4]}\fi
+ \dododefinetypeface[#1][#2]%
+ \dostarttypefacedefining{#1}{#2}{}%
+ \usetypescript[#3][#4][\t!name,\t!default]%
+ \usetypescript[#3][\s!default][\t!size]%
+ \dostoptypefacedefining
\else\ifthirdargument
+ \dododefinetypeface[#1][#2]%
\getparameters[\??tf#1#2][#3]%
+ \else % use definitions in lfg file
+ \ctxlua{fonts.definetypeface(\!!bs#1\!!es,\!!bs#2\!!es)}%
\fi\fi\fi}
\def\dododefinetypeface[#1][#2]% saveguard against redefinition
@@ -500,9 +443,13 @@
\fi \fi \fi
\ifmmode\mr\else\tf\fi} % needed ?
-\def\usetypefile[#1]% recurses on path !
- {\edef\currenttypefile{\f!typeprefix#1}%
- \readfile{\currenttypefile.\mksuffix}\donothing{\readfile\currenttypefile\donothing\donothing}}
+% \def\usetypefile[#1]% recurses on path !
+% {\edef\currenttypefile{\f!typeprefix#1}%
+% \readfile{\currenttypefile.\mksuffix}\donothing{\readfile\currenttypefile\donothing\donothing}}
+
+\def\usetypefile[#1]% recurses on path ! % no storage? obsolete?
+ {\edef\currenttypefile{#1}%
+ \ctxcommand{doprocesstypescriptfile("\currenttypefile")}}
%D For Taco:
%D
@@ -539,7 +486,7 @@
\let\checkfontclass\gobbleoneargument
-\fetchruntimecommand \typetypescript {\f!typeprefix\s!run.mkiv} % will become module
+\fetchruntimecommand \typetypescript {\f!typeprefix\s!run} % will become module
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/type-one.mkii b/Master/texmf-dist/tex/context/base/type-one.mkii
index ccb97baf11a..f1e94fd7934 100644
--- a/Master/texmf-dist/tex/context/base/type-one.mkii
+++ b/Master/texmf-dist/tex/context/base/type-one.mkii
@@ -1483,7 +1483,7 @@
\definefontsynonym [AntykwaPoltawskiego-Expanded-CapsBold] [\typescriptthree-antpb6-sc] [encoding=\typescriptthree]
\definefontsynonym [AntykwaPoltawskiego-Expanded-CapsBoldItalic] [\typescriptthree-antpbi6-sc] [encoding=\typescriptthree]
- \loadmapfile[ap-\typescriptthree.map]
+ \loadmapfile[poltawski-\typescriptthree.map]
\stoptypescript
\starttypescript [serif] [antykwa-poltawskiego] [name]
@@ -1943,7 +1943,7 @@
\loadmapfile[q\typescriptprefix{f:\typescripttwo}-\typescriptthree.map]
\stoptypescript
- \starttypescript [serif] [chorus,chancery] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x]
+ \starttypescript [serif,calligraphy] [chorus,chancery] [ec,texnansi,cs,qx,rm,t5,t2a,t2b,t2c,l7x]
\definefontsynonym [TeXGyreChorus-MediumItalic] [\typescriptthree-qzcmi] [encoding=\typescriptthree]
\loadmapfile[qzc-\typescriptthree.map]
\stoptypescript
@@ -2353,6 +2353,8 @@
\starttypescriptcollection[Lucida]
+ % We can remove the intermediate names as no one will use them.
+
\definetypescriptprefix [e:ec] [8t]
\definetypescriptprefix [e:texnansi] [8y]
\definetypescriptprefix [e:8r] [8r]
diff --git a/Master/texmf-dist/tex/context/base/type-otf.mkii b/Master/texmf-dist/tex/context/base/type-otf.mkii
index 1567114bd26..0a43061f717 100644
--- a/Master/texmf-dist/tex/context/base/type-otf.mkii
+++ b/Master/texmf-dist/tex/context/base/type-otf.mkii
@@ -19,9 +19,9 @@
\starttypescriptcollection[fallback]
\starttypescript [fallback]
- \definetypeface [] [rm] [serif] [modern] [computer-modern]
- \definetypeface [] [ss] [sans] [modern] [computer-modern]
- \definetypeface [] [tt] [mono] [modern] [computer-modern]
+ \definetypeface [] [rm] [serif] [modern] [computer-modern] [features=default]
+ \definetypeface [] [ss] [sans] [modern] [computer-modern] [features=default]
+ \definetypeface [] [tt] [mono] [modern] [computer-modern] [features=default]
\definetypeface [] [mm] [math] [modern] [computer-modern]
\quittypescriptscanning
\stoptypescript
@@ -29,9 +29,9 @@
% faster
%
% \starttypescript [fallback]
-% \definetypeface [] [rm] [serif] [modern] [default]
-% \definetypeface [] [ss] [sans] [modern] [default]
-% \definetypeface [] [tt] [mono] [modern] [default]
+% \definetypeface [] [rm] [serif] [modern] [default] [features=default]
+% \definetypeface [] [ss] [sans] [modern] [default] [features=default]
+% \definetypeface [] [tt] [mono] [modern] [default] [features=default]
% \definetypeface [] [mm] [math] [modern] [default]
% \quittypescriptscanning
% \stoptypescript
@@ -511,25 +511,25 @@
\stoptypescript
\starttypescript [modern]
- \definetypeface [modern] [rm] [serif] [modern] [computer-modern]
- \definetypeface [modern] [ss] [sans] [modern] [computer-modern]
- \definetypeface [modern] [tt] [mono] [modern] [computer-modern]
+ \definetypeface [modern] [rm] [serif] [modern] [computer-modern] [features=default]
+ \definetypeface [modern] [ss] [sans] [modern] [computer-modern] [features=default]
+ \definetypeface [modern] [tt] [mono] [modern] [computer-modern] [features=default]
\definetypeface [modern] [mm] [math] [modern] [computer-modern]
\quittypescriptscanning
\stoptypescript
\starttypescript [modern-base]
- \definetypeface [modern] [rm] [serif] [modern] [default]
- \definetypeface [modern] [ss] [sans] [modern] [default]
- \definetypeface [modern] [tt] [mono] [modern] [default]
+ \definetypeface [modern] [rm] [serif] [modern] [default] [features=default]
+ \definetypeface [modern] [ss] [sans] [modern] [default] [features=default]
+ \definetypeface [modern] [tt] [mono] [modern] [default] [features=default]
\definetypeface [modern] [mm] [math] [modern] [default]
\quittypescriptscanning
\stoptypescript
\starttypescript [modernvariable]
- \definetypeface [modernvariable] [rm] [serif] [simple] [default]
- \definetypeface [modernvariable] [ss] [sans] [modern] [default]
- \definetypeface [modernvariable] [tt] [mono] [modern] [default]
+ \definetypeface [modernvariable] [rm] [serif] [simple] [default] [features=default]
+ \definetypeface [modernvariable] [ss] [sans] [modern] [default] [features=default]
+ \definetypeface [modernvariable] [tt] [mono] [modern] [default] [features=default]
\definetypeface [modernvariable] [mm] [math] [modern] [default]
\quittypescriptscanning
\stoptypescript
@@ -751,65 +751,65 @@
\stoptypescript
\starttypescript [times,termes]
- \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
- \definetypeface [\typescriptone] [ss] [sans] [helvetica] [default] [rscale=0.9]
- \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.05]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [features=default]
+ \definetypeface [\typescriptone] [ss] [sans] [helvetica] [default] [features=default,rscale=0.9]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [features=default,rscale=1.05]
\definetypeface [\typescriptone] [mm] [math] [times] [default]
\quittypescriptscanning
\stoptypescript
\starttypescript [palatino,pagella]
- \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
- \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [rscale=1.075]
- \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.075]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [features=default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [features=default,rscale=1.075]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [features=default,rscale=1.075]
\definetypeface [\typescriptone] [mm] [math] [palatino] [default]
\quittypescriptscanning
\stoptypescript
\starttypescript [schoolbook,schola]
- \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
- \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [rscale=1.1]
- \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.1]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [features=default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [features=default,rscale=1.1]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [features=default,rscale=1.1]
\definetypeface [\typescriptone] [mm] [math] [modern] [default] [rscale=1.1]
\quittypescriptscanning
\stoptypescript
\starttypescript [bookman,bonum]
- \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
- \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [rscale=1.1]
- \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.1]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [features=default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [features=default,rscale=1.1]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [features=default,rscale=1.1]
\definetypeface [\typescriptone] [mm] [math] [modern] [default] [rscale=1.1]
\quittypescriptscanning
\stoptypescript
\starttypescript [chancery,chorus]
- \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
- \definetypeface [\typescriptone] [ss] [sans] [modern] [default]
- \definetypeface [\typescriptone] [tt] [mono] [modern] [default]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [features=default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [features=default]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [features=default]
\definetypeface [\typescriptone] [mm] [math] [modern] [default]
\quittypescriptscanning
\stoptypescript
\starttypescript [helvetica,heros]
- \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default]
- \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [rscale=1.15]
- \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.15]
+ \definetypeface [\typescriptone] [ss] [sans] [\typescriptone] [default] [features=default]
+ \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [features=default,rscale=1.15]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [features=default,rscale=1.15]
\definetypeface [\typescriptone] [mm] [math] [modern] [default] [rscale=1.15]
\quittypescriptscanning
\stoptypescript
\starttypescript [avantgarde,adventor]
- \definetypeface [\typescriptone] [ss] [sans] [adventor] [default]
- \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [rscale=1.15]
- \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.15]
+ \definetypeface [\typescriptone] [ss] [sans] [adventor] [default] [features=default]
+ \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [features=default,rscale=1.15]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [features=default,rscale=1.15]
\definetypeface [\typescriptone] [mm] [math] [modern] [default]
\quittypescriptscanning
\stoptypescript
\starttypescript [courier,cursor]
- \definetypeface [\typescriptone] [tt] [mono] [\typescriptone] [default]
- \definetypeface [\typescriptone] [rm] [serif] [modern] [default]
- \definetypeface [\typescriptone] [ss] [sans] [modern] [default]
+ \definetypeface [\typescriptone] [tt] [mono] [\typescriptone] [default] [features=default]
+ \definetypeface [\typescriptone] [rm] [serif] [modern] [default] [features=default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [features=default]
\definetypeface [\typescriptone] [mm] [math] [modern] [default]
\quittypescriptscanning
\stoptypescript
@@ -839,6 +839,23 @@
\usemathcollection[default]
\stoptypescript
+ \starttypescript [math] [times] [name]
+ \definefontsynonym [MathRoman] [Times-Roman-Upright]
+ \definefontsynonym [MathExtension] [Times-Math-Extension]
+ \definefontsynonym [MathItalic] [Times-Math-Italic]
+ \definefontsynonym [MathSymbol] [Times-Math-Symbols]
+ \definefontsynonym [MathAlpha] [Times-Math-SymbolsA]
+ \definefontsynonym [MathBeta] [Times-Math-SymbolsB]
+ \stoptypescript
+
+ \starttypescript [math] [times] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [MathBeta]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [eusm10]
+ \stoptypescript
+
\starttypescript [math] [palatino] [all]
\definefontsynonym [Palatino-Roman-Upright] [pxr]
\definefontsynonym [Palatino-Roman-Italic] [pxi]
@@ -860,6 +877,23 @@
\usemathcollection[default]
\stoptypescript
+ \starttypescript [math] [palatino] [name]
+ \definefontsynonym [MathRoman] [Palatino-Roman-Upright]
+ \definefontsynonym [MathExtension] [Palatino-Math-Extension]
+ \definefontsynonym [MathItalic] [Palatino-Math-Italic]
+ \definefontsynonym [MathSymbol] [Palatino-Math-Symbols]
+ \definefontsynonym [MathAlpha] [Palatino-Math-SymbolsA]
+ \definefontsynonym [MathBeta] [Palatino-Math-SymbolsB]
+ \stoptypescript
+
+ \starttypescript [math] [palatino] [name]
+ \definefontsynonym [OldStyle] [MathItalic]
+ \definefontsynonym [Fraktur] [eufm10]
+ \definefontsynonym [Blackboard] [MathBeta]
+ \definefontsynonym [Gothic] [eufm10]
+ \definefontsynonym [Calligraphic] [eusm10]
+ \stoptypescript
+
\stoptypescriptcollection
\starttypescriptcollection[antykwa]
@@ -939,9 +973,9 @@
\stoptypescript
\starttypescript [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond]
- \definetypeface[antykwa][rm][serif][\typescriptone] [default]
- \definetypeface[antykwa][ss][sans] [modern] [default,rscale=1.05]
- \definetypeface[antykwa][tt][mono] [modern] [default,rscale=1.05]
+ \definetypeface[antykwa][rm][serif][\typescriptone] [default] [features=default]
+ \definetypeface[antykwa][ss][sans] [modern] [default] [features=default,rscale=1.05]
+ \definetypeface[antykwa][tt][mono] [modern] [default] [features=default,rscale=1.05]
\definetypeface[antykwa][mm][math] [\typescriptone] [default]
\quittypescriptscanning
\stoptypescript
@@ -1291,9 +1325,9 @@
% condensed and extended variants are still missing
\starttypescript [antykwa-poltawskiego,antykwa-poltawskiego-light]
- \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default]
- \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [rscale=1.05]
- \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [rscale=1.05]
+ \definetypeface [\typescriptone] [rm] [serif] [\typescriptone] [default] [features=default]
+ \definetypeface [\typescriptone] [ss] [sans] [modern] [default] [features=default,rscale=1.05]
+ \definetypeface [\typescriptone] [tt] [mono] [modern] [default] [features=default,rscale=1.05]
\definetypeface [\typescriptone] [mm] [math] [modern] [default] [rscale=1.05]
\quittypescriptscanning
\stoptypescript
@@ -1397,8 +1431,8 @@
\definefontsynonym [SansItalic] [Iwona-Light-Italic]
\definefontsynonym [SansBold] [Iwona-Medium-Regular]
\definefontsynonym [SansBoldItalic] [Iwona-Medium-Italic]
- \definefontsynonym [SansCaps] [Iwona-CapsLight]
- \definefontsynonym [SansItalicCaps] [Iwona-CapsLightItalic]
+ \definefontsynonym [SansCaps] [Iwona-CapsLight-Regular]
+ \definefontsynonym [SansItalicCaps] [Iwona-CapsLight-Italic]
\definefontsynonym [SansBoldCaps] [Iwona-CapsMedium]
\definefontsynonym [SansBoldItalicCaps] [Iwona-CapsMediumItalic]
\stoptypescript
@@ -1560,10 +1594,10 @@
\stoptypescript
\starttypescript [iwona,iwona-light,iwona-heavy,iwona-medium]
- \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default]
- \definetypeface[\typescriptone][rm][serif][modern] [default]
- \definetypeface[\typescriptone][tt][mono] [modern] [default]
- \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][text=ss]
+ \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default] [features=default]
+ \definetypeface[\typescriptone][rm][serif][modern] [default] [features=default]
+ \definetypeface[\typescriptone][tt][mono] [modern] [default] [features=default]
+ \definetypeface[\typescriptone][mm][math] [\typescriptone] [default] [features=default,text=ss]
\quittypescriptscanning
\stoptypescript
@@ -1688,347 +1722,13 @@
\starttypescriptcollection[postscript]
\starttypescript [postscript]
- \definetypeface [postscript] [rm] [serif] [times] [default]
- \definetypeface [postscript] [ss] [sans] [helvetica] [default] [rscale=0.9]
- \definetypeface [postscript] [tt] [mono] [courier] [default] [rscale=1.1]
+ \definetypeface [postscript] [rm] [serif] [times] [default] [features=default]
+ \definetypeface [postscript] [ss] [sans] [helvetica] [default] [features=default,rscale=0.9]
+ \definetypeface [postscript] [tt] [mono] [courier] [default] [features=default,rscale=1.1]
\definetypeface [postscript] [mm] [math] [times] [default]
\quittypescriptscanning
\stoptypescript
\stoptypescriptcollection
-\starttypescriptcollection[lucida]
-
- \definetypescriptprefix [e:ec] [8t]
- \definetypescriptprefix [e:texnansi] [8y]
- \definetypescriptprefix [e:8r] [8r]
-
- % Lucida Bright
-
- \starttypescript [serif] [lucida] [ec,texnansi,8r]
- \definefontsynonym [\typescriptthree-lbr] [hlhr\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright
- \definefontsynonym [\typescriptthree-lbd] [hlhb\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright-Demi
- \definefontsynonym [\typescriptthree-lbi] [hlhri\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright-Italic
- \definefontsynonym [\typescriptthree-lbdi] [hlhbi\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright-DemiItalic
- \definefontsynonym [\typescriptthree-lbsl] [hlhro\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBright-Oblique
- \definefontsynonym [\typescriptthree-lbrsc] [hlhrc\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBrightSmallcaps
- \definefontsynonym [\typescriptthree-lbdsc] [hlhbc\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBrightSmallcaps-Demi
-
- \definefontsynonym [LucidaBright] [\typescriptthree-lbr] [encoding=\typescriptthree]
- \definefontsynonym [LucidaBright-Demi] [\typescriptthree-lbd] [encoding=\typescriptthree]
- \definefontsynonym [LucidaBright-Italic] [\typescriptthree-lbi] [encoding=\typescriptthree]
- \definefontsynonym [LucidaBright-DemiItalic] [\typescriptthree-lbdi] [encoding=\typescriptthree]
- \definefontsynonym [LucidaBright-Oblique] [\typescriptthree-lbsl] [encoding=\typescriptthree]
- \definefontsynonym [LucidaBrightSmallcaps] [\typescriptthree-lbrsc] [encoding=\typescriptthree]
- \definefontsynonym [LucidaBrightSmallcaps-Demi] [\typescriptthree-lbdsc] [encoding=\typescriptthree]
-
- \loadmapfile[lucida.map]
- \stoptypescript
-
- % Lucida Bright Sans
-
- \starttypescript [sans] [lucida] [ec,texnansi,8r]
- \definefontsynonym [\typescriptthree-lsr] [hlsr\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans
- \definefontsynonym [\typescriptthree-lsd] [hlsb\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-Demi
- \definefontsynonym [\typescriptthree-lsb] [hlsu\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-Bold
- \definefontsynonym [\typescriptthree-lsi] [hlsri\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-Italic
- \definefontsynonym [\typescriptthree-lsdi] [hlsbi\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-DemiItalic
- \definefontsynonym [\typescriptthree-lsbi] [hlsui\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-BoldItalic
-
- \definefontsynonym [LucidaSans] [\typescriptthree-lsr] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-Demi] [\typescriptthree-lsd] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-Bold] [\typescriptthree-lsb] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-Italic] [\typescriptthree-lsi] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-DemiItalic] [\typescriptthree-lsdi] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-BoldItalic] [\typescriptthree-lsbi] [encoding=\typescriptthree]
-
- \loadmapfile[lucida.map]
- \stoptypescript
-
- % Lucida Bright Typewriter
-
- \starttypescript [mono] [lucida] [ec,texnansi,8r]
- \definefontsynonym [\typescriptthree-lbtr] [hlcrt\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaTypewriter
- \definefontsynonym [\typescriptthree-lbtb] [hlcbt\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaTypewriterBold
- \definefontsynonym [\typescriptthree-lbto] [hlcrot\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaTypewriterOblique
- \definefontsynonym [\typescriptthree-lbtbo] [hlcbot\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaTypewriterBoldOblique
-
- \definefontsynonym [LucidaTypewriter] [\typescriptthree-lbtr] [encoding=\typescriptthree]
- \definefontsynonym [LucidaTypewriterBold] [\typescriptthree-lbtb] [encoding=\typescriptthree]
- \definefontsynonym [LucidaTypewriterOblique] [\typescriptthree-lbto] [encoding=\typescriptthree]
- \definefontsynonym [LucidaTypewriterBoldOblique] [\typescriptthree-lbtbo] [encoding=\typescriptthree]
-
- \loadmapfile[lucida.map]
- \stoptypescript
-
- % Lucida Bright Sans Typewriter
-
- \starttypescript [mono] [lucida] [ec,texnansi,8r]
- \definefontsynonym [\typescriptthree-lstr] [hlsrt\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-Typewriter
- \definefontsynonym [\typescriptthree-lstb] [hlsbt\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-TypewriterBold
- \definefontsynonym [\typescriptthree-lsto] [hlsrot\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-TypewriterOblique
- \definefontsynonym [\typescriptthree-lstbo] [hlsbot\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaSans-TypewriterBoldOblique
-
- \definefontsynonym [LucidaSans-Typewriter] [\typescriptthree-lstr] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-TypewriterBold] [\typescriptthree-lstb] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-TypewriterOblique] [\typescriptthree-lsto] [encoding=\typescriptthree]
- \definefontsynonym [LucidaSans-TypewriterBoldOblique] [\typescriptthree-lstbo] [encoding=\typescriptthree]
-
- \loadmapfile[lucida.map]
- \stoptypescript
-
- % Lucida Calligraphy
-
- \starttypescript [calligraphy] [lucida] [texnansi,ec,8r]
- \definefontsynonym [\typescriptthree-lbc] [hlcrie\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaCalligraphy-Italic
-
- \definefontsynonym [LucidaCalligraphy-Italic] [\typescriptthree-lbc] [encoding=\typescriptthree]
-
- \loadmapfile[lucida.map]
- \stoptypescript
-
- % Lucida Casual
-
- \starttypescript [casual] [lucida] [texnansi,ec,8r]
- \definefontsynonym [\typescriptthree-lbkr] [hlcrn\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaCasual
- \definefontsynonym [\typescriptthree-lbki] [hlcrin\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaCasual-Italic
-
- \definefontsynonym [LucidaCasual] [\typescriptthree-lbkr] [encoding=\typescriptthree]
- \definefontsynonym [LucidaCasual-Italic] [\typescriptthree-lbki] [encoding=\typescriptthree]
-
- \loadmapfile[lucida.map]
- \stoptypescript
-
- % Lucida Handwriting
-
- \starttypescript [handwriting] [lucida] [texnansi,ec,8r]
- \definefontsynonym [\typescriptthree-lbh] [hlcriw\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaHandwriting-Italic
-
- \definefontsynonym [LucidaHandwriting-Italic] [\typescriptthree-lbh] [encoding=\typescriptthree]
-
- \loadmapfile[lucida.map]
- \stoptypescript
-
- % Lucida Fax
-
- \starttypescript [fax] [lucida] [texnansi,ec,8r]
- \definefontsynonym [\typescriptthree-lfr] [hlxr\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaFax
- \definefontsynonym [\typescriptthree-lfd] [hlxb\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaFax-Demi
- \definefontsynonym [\typescriptthree-lfi] [hlxri\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaFax-Italic
- \definefontsynonym [\typescriptthree-lfdi] [hlxbi\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaFax-DemiItalic
-
- \definefontsynonym [LucidaFax] [\typescriptthree-lfr] [encoding=\typescriptthree] % LucidaFax
- \definefontsynonym [LucidaFax-Demi] [\typescriptthree-lfd] [encoding=\typescriptthree] % LucidaFax-Demi
- \definefontsynonym [LucidaFax-Italic] [\typescriptthree-lfi] [encoding=\typescriptthree] % LucidaFax-Italic
- \definefontsynonym [LucidaFax-DemiItalic] [\typescriptthree-lfdi] [encoding=\typescriptthree] % LucidaFax-DemiItalic
-
- \loadmapfile[lucida.map]
- \stoptypescript
-
- \starttypescript [blackletter] [lucida] [texnansi,ec,8r]
- \definefontsynonym [\typescriptthree-lbl] [hlcrf\typescriptprefix{e:\typescriptthree}] [encoding=\typescriptthree] % LucidaBlackletter
-
- \definefontsynonym [LucidaBlackletter] [\typescriptthree-lbl] [encoding=\typescriptthree]
-
- \loadmapfile[lucida.map]
- \stoptypescript
-
- \starttypescript [lucida,lucidabfm,lucidaboldmath] [texnansi,ec,8r]
- \definetypeface [lucida] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucida] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucida] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucida] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucida] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
-
- \loadmapfile[lucida.map]
- \stoptypescript
-
- \starttypescript [math] [lucida] [texnansi,ec,8r]
- \definefontsynonym [LucidaBright] [hlcrm] % [encoding=\typescriptthree]
- \definefontsynonym [LucidaNewMath-AltItalic] [hlcrima]
- \definefontsynonym [LucidaNewMath-Arrows] [hlcra]
- \definefontsynonym [LucidaNewMath-Extension] [hlcrv]
- \definefontsynonym [LucidaNewMath-Roman] [hlcrm]
- \definefontsynonym [LucidaNewMath-Italic] [hlcrim]
- \definefontsynonym [LucidaNewMath-Symbol] [hlcry]
- \definefontsynonym [LucidaBlackletter] [hlcrf8y] % what a mess
- \loadmapfile [lucida.map]
- \stoptypescript
-
- \starttypescript [boldmath,bfmath] [lucida] [texnansi,ec,8r]
- \definefontsynonym [LucidaNewMath-AltDemiItalic] [hlcdima]
- \definefontsynonym [LucidaNewMath-Arrows-Demi] [hlcda]
- \definefontsynonym [LucidaNewMath-Extension] [hlcrv]
- \definefontsynonym [LucidaNewMath-Demi] [hlcdm]
- \definefontsynonym [LucidaNewMath-DemiItalic] [hlcdim]
- \definefontsynonym [LucidaNewMath-Symbol-Demi] [hlcdy]
- \loadmapfile [lucida.map]
- \stoptypescript
-
- % Lucida Bright
-
- \starttypescript [serif] [lucida] [name]
- \definefontsynonym [Serif] [LucidaBright]
- \definefontsynonym [SerifBold] [LucidaBright-Demi]
- \definefontsynonym [SerifItalic] [LucidaBright-Italic]
- \definefontsynonym [SerifBoldItalic] [LucidaBright-DemiItalic]
- \definefontsynonym [SerifSlanted] [LucidaBright-Oblique]
- \definefontsynonym [SerifBoldSlanted] [LucidaBright-DemiItalic]
- \definefontsynonym [SerifCaps] [LucidaBrightSmallcaps]
- \definefontsynonym [SerifBoldCaps] [LucidaBrightSmallcaps-Demi]
- \stoptypescript
-
- % Lucida Bright Sans
-
- \starttypescript [sans] [lucida] [name]
- \definefontsynonym [Sans] [LucidaSans]
- \definefontsynonym [SansBold] [LucidaSans-Demi]
- \definefontsynonym [SansItalic] [LucidaSans-Italic]
- \definefontsynonym [SansBoldItalic] [LucidaSans-DemiItalic]
- \definefontsynonym [SansSlanted] [LucidaSans-Italic]
- \definefontsynonym [SansBoldSlanted] [LucidaSans-DemiItalic]
- \definefontsynonym [SansCaps] [LucidaSans]
- \stoptypescript
-
- % Lucida Bright Typewriter
-
- % only one family may be used as mono; sans used to be that since the beginning,
- % so we keep using that as default
-
- % \starttypescript [mono] [lucida] [name]
- % \definefontsynonym [Mono] [LucidaTypewriter]
- % \definefontsynonym [MonoBold] [LucidaTypewriterBold]
- % \definefontsynonym [MonoItalic] [LucidaTypewriterOblique]
- % \definefontsynonym [MonoBoldItalic] [LucidaTypewriterBoldOblique]
- % \definefontsynonym [MonoSlanted] [LucidaTypewriterOblique]
- % \definefontsynonym [MonoBoldSlanted] [LucidaTypewriterBoldOblique]
- % \definefontsynonym [MonoCaps] [LucidaTypewriter]
- % \stoptypescript
-
- % Lucida Bright Sans Typewriter
-
- \starttypescript [mono] [lucida] [name]
- \definefontsynonym [Mono] [LucidaSans-Typewriter]
- \definefontsynonym [MonoBold] [LucidaSans-TypewriterBold]
- \definefontsynonym [MonoItalic] [LucidaSans-TypewriterOblique]
- \definefontsynonym [MonoBoldItalic] [LucidaSans-TypewriterBoldOblique]
- \definefontsynonym [MonoSlanted] [LucidaSans-TypewriterOblique]
- \definefontsynonym [MonoBoldSlanted] [LucidaSans-TypewriterBoldOblique]
- \definefontsynonym [MonoCaps] [LucidaSans-Typewriter]
- \stoptypescript
-
- % Lucida Calligraphy
-
- \starttypescript [calligraphy] [lucida] [name]
- \definefontsynonym [Calligraphy] [LucidaCalligraphy-Italic]
- \stoptypescript
-
- % Lucida Casual
-
- % \starttypescript [casual] [lucida] [name]
- % % LucidaCasual
- % % LucidaCasual-Italic
- % \stoptypescript
-
- % Lucida Handwriting
-
- \starttypescript [handwriting] [lucida] [name]
- \definefontsynonym [Handwriting] [LucidaHandwriting-Italic]
- \stoptypescript
-
- % Lucida Fax
- %
- % \starttypescript [fax] [lucida] [name]
- % \definefontsynonym [FaksRegular] [LucidaFax]
- % \definefontsynonym [FaksBold] [LucidaFax-Demi]
- % \definefontsynonym [FaksItalic] [LucidaFax-Italic]
- % \definefontsynonym [FaksBoldItalic] [LucidaFax-DemiItalic]
- % \stoptypescript
-
- % Lucida Black Letter
- %
- % \starttypescript [blackletter] [lucida] [name]
- % \definefontsynonym [Blackletter] [LucidaBlackletter]
- % \stoptypescript
-
- % Lucida Math
-
- \starttypescript [math] [lucida] [name]
- \definefontsynonym [MathRoman] [LucidaBright]
- \definefontsynonym [MathExtension] [LucidaNewMath-Extension]
- \definefontsynonym [MathItalic] [LucidaNewMath-AltItalic]
- \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol]
- \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows]
- \definefontsynonym [MathBeta] [LucidaNewMath-Roman]
- \stoptypescript
-
- \starttypescript [math] [lucida] [name]
- \definefontsynonym [OldStyle] [MathItalic]
- \definefontsynonym [Fraktur] [eufm10]
- \definefontsynonym [Blackboard] [MathAlpha]
- \definefontsynonym [Gothic] [eufm10]
- \definefontsynonym [Calligraphic] [MathSymbol] % math caligraphic !
- \stoptypescript
-
- \starttypescript [boldmath] [lucida] [name]
- \definefontsynonym [MathRoman] [LucidaBright-Demi]
- \definefontsynonym [MathExtension] [LucidaNewMath-Extension]
- \definefontsynonym [MathItalic] [LucidaNewMath-AltDemiItalic]
- \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol-Demi]
- \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows-Demi]
- \definefontsynonym [MathBeta] [LucidaNewMath-Demi]
- \stoptypescript
-
- \starttypescript [bfmath] [lucida] [name]
- \definefontsynonym [MathRomanBold] [LucidaNewMath-Demi]
- \definefontsynonym [MathExtensionBold] [LucidaNewMath-Extension]
- \definefontsynonym [MathItalicBold] [LucidaNewMath-AltDemiItalic]
- \definefontsynonym [MathSymbolBold] [LucidaNewMath-Symbol-Demi]
- \definefontsynonym [MathAlphaBold] [LucidaNewMath-Arrows-Demi]
- \definefontsynonym [MathBetaBold] [LucidaNewMath-Demi]
- \stoptypescript
-
- \starttypescript [lucida,lucidabfm,lucidaboldmath] [texnansi,ec,8r,uc]
- \definetypeface [lucida] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucida] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucida] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucida] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucida] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
- \loadmapfile[lucida.map]
- \stoptypescript
-
- \starttypescript [lucida] [texnansi,ec,8r]
- \definetypeface [lucida] [mm] [math] [lucida] [default] [encoding=\typescripttwo]
- \stoptypescript
-
- \starttypescript [lucidabfm] [texnansi,ec,8r]
- \definetypeface [lucida] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo]
- \stoptypescript
-
- \starttypescript [lucidaboldmath] [texnansi,ec,8r]
- \definetypeface [lucida] [mm] [boldmath] [lucida] [default] [encoding=\typescripttwo]
- \stoptypescript
-
- \starttypescript [lucidabfm] [texnansi,ec,8r,uc]
- \definetypeface [lucidabfm] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucidabfm] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucidabfm] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucidabfm] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucidabfm] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucidabfm] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo]
- \loadmapfile[lucida.map]
- \stoptypescript
-
- \starttypescript [lucidaboldmath] [texnansi,ec,8r,uc]
- \definetypeface [lucidaboldmath] [rm] [serif] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucidaboldmath] [ss] [sans] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucidaboldmath] [tt] [mono] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucidaboldmath] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucidaboldmath] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo]
- \definetypeface [lucidaboldmath] [mm] [boldmath] [lucida] [default] [encoding=\typescripttwo]
- \loadmapfile[lucida.map]
- \stoptypescript
-
-\stoptypescriptcollection
-
\endinput
diff --git a/Master/texmf-dist/tex/context/base/type-otf.mkiv b/Master/texmf-dist/tex/context/base/type-otf.mkiv
index 02540d76a2d..71f8cd1e36d 100644
--- a/Master/texmf-dist/tex/context/base/type-otf.mkiv
+++ b/Master/texmf-dist/tex/context/base/type-otf.mkiv
@@ -15,15 +15,17 @@
%D consult its database. However, here we use the names that we used
%D in good old \TEX, and these may differ a bit. Here we also see
%D some oldstyle definitions which normally are done with features.
+%D
+%D The ComputerModern* names will become obsolete (all LM now).
% \starttypescriptcollection[myfonts]
%
% \starttypescript [serif] [myserif] [name]
% \setups[font:fallback:serif]
-% \definefontsynonym [Serif] [file:myserif.ttf] [features=default]
-% \definefontsynonym [SerifBold] [file:myserifbold.ttf] [features=default]
-% \definefontsynonym [SerifItalic] [file:myserifitalic.ttf] [features=default]
-% \definefontsynonym [SerifBoldItalic] [file:myserifbolditalic.ttf] [features=default]
+% \definefontsynonym [Serif] [\s!file:myserif.ttf] [features=default]
+% \definefontsynonym [SerifBold] [\s!file:myserifbold.ttf] [features=default]
+% \definefontsynonym [SerifItalic] [\s!file:myserifitalic.ttf] [features=default]
+% \definefontsynonym [SerifBoldItalic] [\s!file:myserifbolditalic.ttf] [features=default]
% \stoptypescript
%
% \starttypescript[myfont]
@@ -62,8 +64,6 @@
% \definefontsynonym [LMRoman10-DemiOblique] [\s!name:LMRoman10-DemiOblique] [\s!features=\s!default]
% \definefontsynonym [LMRoman10-DemiOblique] [lmroman10-demioblique] [\s!features=\s!default]
-\unprotect
-
% \starttypescript [math] [modern,computer-modern,latin-modern]
% \definefontsynonym[MathSymbol][MathSymbol-Regular@symbol-math]
% \loadfontgoodies[symbol-math]
@@ -75,7 +75,7 @@
%D any more. Filename changes will be catched in luatex (fallbacks) but not in
%D other tex's.
- \starttypescript [serif] [modern,latin-modern,computer-modern]
+ \starttypescript [serif] [modern,latin-modern,computer-modern,default]
\definefontsynonym [LMRoman5-Regular] [\s!file:lmroman5-regular] [\s!features=\s!default]
\definefontsynonym [LMRoman6-Regular] [\s!file:lmroman6-regular] [\s!features=\s!default]
\definefontsynonym [LMRoman7-Regular] [\s!file:lmroman7-regular] [\s!features=\s!default]
@@ -105,7 +105,7 @@
\definefontsynonym [LMRoman10-BoldOblique] [\s!file:lmromanslant10-bold] [\s!features=\s!default]
\definefontsynonym [LMRoman10-Demi] [\s!file:lmromandemi10-regular] [\s!features=\s!default]
\definefontsynonym [LMRoman10-DemiOblique] [\s!file:lmromandemi10-oblique] [\s!features=\s!default]
- \definefontsynonym [LMRoman10-CapsRegular] [\s!file:lmromancaps10-regular] [\s!features=\s!default] % features=smallcaps?
+ \definefontsynonym [LMRoman10-CapsRegular] [\s!file:lmromancaps10-regular] [\s!features=\s!default]
\definefontsynonym [LMRoman10-CapsOblique] [\s!file:lmromancaps10-oblique] [\s!features=\s!default]
\definefontsynonym [LMRoman10-Dunhill] [\s!file:lmromandunh10-regular] [\s!features=\s!default]
@@ -113,7 +113,7 @@
\definefontsynonym [LMRoman10-Unslanted] [\s!file:lmromanunsl10-regular] [\s!features=\s!default]
\stoptypescript
- \starttypescript [sans] [modern,latin-modern,computer-modern]
+ \starttypescript [sans] [modern,latin-modern,computer-modern,default]
\definefontsynonym [LMSans8-Regular] [\s!file:lmsans8-regular] [\s!features=\s!default]
\definefontsynonym [LMSans9-Regular] [\s!file:lmsans9-regular] [\s!features=\s!default]
\definefontsynonym [LMSans10-Regular] [\s!file:lmsans10-regular] [\s!features=\s!default]
@@ -136,15 +136,14 @@
\definefontsynonym [LMSansQuotation8-BoldOblique] [\s!file:lmsansquot8-boldoblique] [\s!features=\s!default]
\stoptypescript
- \starttypescript [mono] [modern,modern-variable,modern-condensed,latin-modern,latin-modern-variable,latin-modern-condensed,computer-modern]
-
+ \starttypescript [mono] [modern,modern-variable,modern-condensed,latin-modern,latin-modern-variable,latin-modern-condensed,computer-modern,default]
\definefontsynonym [LMTypewriter8-Regular] [\s!file:lmmono8-regular] [\s!features=\s!none]
\definefontsynonym [LMTypewriter9-Regular] [\s!file:lmmono9-regular] [\s!features=\s!none]
\definefontsynonym [LMTypewriter10-Regular] [\s!file:lmmono10-regular] [\s!features=\s!none]
\definefontsynonym [LMTypewriter12-Regular] [\s!file:lmmono12-regular] [\s!features=\s!none]
\definefontsynonym [LMTypewriter10-Italic] [\s!file:lmmono10-italic] [\s!features=\s!none]
\definefontsynonym [LMTypewriter10-Oblique] [\s!file:lmmonoslant10-regular] [\s!features=\s!none]
- \definefontsynonym [LMTypewriter10-CapsRegular] [\s!file:lmmonocaps10-regular] [\s!features=\s!none] % features=smallcaps?
+ \definefontsynonym [LMTypewriter10-CapsRegular] [\s!file:lmmonocaps10-regular] [\s!features=\s!none]
\definefontsynonym [LMTypewriter10-CapsOblique] [\s!file:lmmonocaps10-oblique] [\s!features=\s!none]
\definefontsynonym [LMTypewriter10-Light] [\s!file:lmmonolt10-regular] [\s!features=\s!none]
@@ -163,7 +162,7 @@
\definefontsynonym [LMTypewriterVarWd10-DarkOblique] [\s!file:lmmonoproplt10-boldoblique] [\s!features=\s!default]
\stoptypescript
- \starttypescript [math] [modern,latin-modern,computer-modern]
+ \starttypescript [math] [modern,latin-modern,computer-modern,default]
\definefontsynonym[LMMathRoman5-Regular] [LMMath5-Regular@lmroman5-math]
\definefontsynonym[LMMathRoman6-Regular] [LMMath6-Regular@lmroman6-math]
\definefontsynonym[LMMathRoman7-Regular] [LMMath7-Regular@lmroman7-math]
@@ -190,7 +189,7 @@
\loadfontgoodies[lm-math]
\stoptypescript
- \starttypescript [serif] [modern,latin-modern,computer-modern] [name]
+ \starttypescript [serif] [modern,latin-modern,computer-modern,default] [name]
\definefontsynonym [Serif] [LMRoman-Regular]
\definefontsynonym [SerifBold] [LMRoman-Bold]
\definefontsynonym [SerifItalic] [LMRoman-Italic]
@@ -201,7 +200,7 @@
\definefontsynonym [SerifCapsSlanted] [LMRoman-CapsOblique]
\stoptypescript
- \starttypescript [sans] [modern,latin-modern,computer-modern] [name]
+ \starttypescript [sans] [modern,latin-modern,computer-modern,default] [name]
\definefontsynonym [Sans] [LMSans-Regular]
\definefontsynonym [SansBold] [LMSans-Bold]
\definefontsynonym [SansItalic] [LMSans-Oblique]
@@ -212,7 +211,7 @@
\definefontsynonym [SansCapsSlanted] [LMSans-Oblique]
\stoptypescript
- \starttypescript [mono] [modern,latin-modern,computer-modern] [name]
+ \starttypescript [mono] [modern,latin-modern,computer-modern,default] [name]
\definefontsynonym [Mono] [LMTypewriter-Regular]
\definefontsynonym [MonoBold] [LMTypewriter-Dark]
\definefontsynonym [MonoItalic] [LMTypewriter-Italic]
@@ -224,14 +223,15 @@
\definefontsynonym [MonoVariable] [LMTypewriterVarWd-Regular]
\stoptypescript
- \starttypescript [math] [modern,latin-modern,computer-modern] [name]
+ \starttypescript [math] [modern,latin-modern,computer-modern,default] [name]
\definefontsynonym [MathRoman] [LMMathRoman-Regular]
+ \definefontsynonym [MathRomanBold] [LMMathRoman-Bold]
%definefontsynonym [MathExtension] [LMMathExtension-Regular]
%definefontsynonym [MathItalic] [LMMathItalic-Italic]
%definefontsynonym [MathSymbol] [LMMathSymbols-Italic]
\stoptypescript
- \starttypescript [serif] [modern-variable,latin-modern-variable] [name]
+ \starttypescript [serif] [modern-variable,latin-modern-variable,default] [name]
\definefontsynonym [Serif] [LMTypewriterVarWd-Regular]
\definefontsynonym [SerifBold] [LMTypewriterVarWd-Oblique]
\definefontsynonym [SerifItalic] [LMTypewriterVarWd-Oblique]
@@ -242,7 +242,7 @@
\definefontsynonym [SerifCapsSlanted] [LMTypewriterVarWd-Oblique]
\stoptypescript
- \starttypescript [mono] [modern-condensed,latin-modern-condensed,modern-light-condensed,latin-modern-light-condensed] [name]
+ \starttypescript [mono] [modern-condensed,latin-modern-condensed,modern-light-condensed,latin-modern-light-condensed,default] [name]
\definefontsynonym [Mono] [LMTypewriter-LightCondensed]
\definefontsynonym [MonoBold] [LMTypewriter-LightCondensed]
\definefontsynonym [MonoItalic] [LMTypewriter-LightCondensedOblique]
@@ -253,7 +253,7 @@
\definefontsynonym [MonoCapsSlanted] [LMTypewriter-LightCondensed]
\stoptypescript
- \starttypescript [mono] [modern-light,latin-modern-light] [name]
+ \starttypescript [mono] [modern-light,latin-modern-light,default] [name]
\definefontsynonym [Mono] [LMTypewriter-Light]
\definefontsynonym [MonoBold] [LMTypewriter-Light]
\definefontsynonym [MonoItalic] [LMTypewriter-LightOblique]
@@ -266,7 +266,7 @@
% Later we will map the real fonts, here we just map synonyms.
- \starttypescript [serif] [modern,latin-modern,computer-modern]
+ \starttypescript [serif] [modern,latin-modern,computer-modern,default]
\definefontsynonym [LMRoman-DemiOblique] [LMRoman10-DemiOblique]
\definefontsynonym [LMRoman-Bold] [LMRoman10-Bold]
\definefontsynonym [LMRoman-BoldItalic] [LMRoman10-BoldItalic]
@@ -278,7 +278,7 @@
\definefontsynonym [LMRoman-Oblique] [LMRoman10-Oblique]
\stoptypescript
- \starttypescript [sans] [modern,latin-modern,computer-modern]
+ \starttypescript [sans] [modern,latin-modern,computer-modern,default]
\definefontsynonym [LMSans-Regular] [LMSans10-Regular]
\definefontsynonym [LMSans-BoldOblique] [LMSans10-BoldOblique]
\definefontsynonym [LMSans-Bold] [LMSans10-Bold]
@@ -287,7 +287,7 @@
\definefontsynonym [LMSans-Oblique] [LMSans10-Oblique]
\stoptypescript
- \starttypescript [mono] [modern,latin-modern,modern-variable,latin-modern-variable,modern-condensed,latin-modern-condensed]
+ \starttypescript [mono] [modern,latin-modern,modern-variable,latin-modern-variable,modern-condensed,latin-modern-condensed,default]
\definefontsynonym [LMTypewriter-CapsRegular] [LMTypewriter10-CapsRegular]
\definefontsynonym [LMTypewriter-CapsOblique] [LMTypewriter10-CapsOblique]
\definefontsynonym [LMTypewriter-Light] [LMTypewriter10-Light]
@@ -307,7 +307,7 @@
\definefontsynonym [LMTypewriterVarWd-DarkOblique] [LMTypewriterVarWd10-DarkOblique]
\stoptypescript
- \starttypescript [serif] [modern,latin-modern,computer-modern]
+ \starttypescript [serif] [modern,latin-modern,computer-modern,default]
\definefontsynonym [ComputerModern] [LMRoman-Regular]
\definefontsynonym [ComputerModern-Italic] [LMRoman-Italic]
\definefontsynonym [ComputerModern-Slanted] [LMRoman-Oblique]
@@ -318,7 +318,7 @@
\definefontsynonym [ComputerModern-CapsSlanted] [LMRoman-CapsOblique]
\stoptypescript
- \starttypescript [sans] [modern,latin-modern,computer-modern]
+ \starttypescript [sans] [modern,latin-modern,computer-modern,default]
\definefontsynonym [ComputerModernSans] [LMSans-Regular]
\definefontsynonym [ComputerModernSans-Italic] [LMSans-Oblique]
\definefontsynonym [ComputerModernSans-Slanted] [LMSans-Oblique]
@@ -329,7 +329,7 @@
\definefontsynonym [ComputerModernSans-CapsSlanted] [LMSans-Oblique]% [LMSans-CapsOblique]
\stoptypescript
- \starttypescript [mono] [modern,latin-modern,computer-modern]
+ \starttypescript [mono] [modern,latin-modern,computer-modern,default]
\definefontsynonym [ComputerModernMono] [LMTypewriter-Regular]
\definefontsynonym [ComputerModernMono-Italic] [LMTypewriter-Italic]
\definefontsynonym [ComputerModernMono-Slanted] [LMTypewriter-Oblique]
@@ -341,7 +341,7 @@
\definefontsynonym [ComputerModernMono-Variable] [LMTypewriterVarWd-Regular]
\stoptypescript
- \starttypescript [mono] [modern-light,latin-modern-light]
+ \starttypescript [mono] [modern-light,latin-modern-light,default]
\definefontsynonym [ComputerModernMono] [LMTypewriter-Light]
\definefontsynonym [ComputerModernMono-Italic] [LMTypewriter-LightOblique]
\definefontsynonym [ComputerModernMono-Slanted] [LMTypewriter-LightOblique]
@@ -353,7 +353,7 @@
\definefontsynonym [ComputerModernMono-Variable] [LMTypewriterVarWd-Light]
\stoptypescript
- \starttypescript [serif] [modern-variable,latin-modern-variable]
+ \starttypescript [serif] [modern-variable,latin-modern-variable,default]
\definefontsynonym [ComputerModernVariable] [LMTypewriterVarWd-Regular]
\definefontsynonym [ComputerModernVariable-Italic] [LMTypewriterVarWd-Oblique]
\definefontsynonym [ComputerModernVariable-Slanted] [LMTypewriterVarWd-Oblique]
@@ -364,7 +364,7 @@
\definefontsynonym [ComputerModernVariable-CapsSlanted] [LMTypewriterVarWd-Oblique]
\stoptypescript
- \starttypescript [serif] [modern-variable-light,latin-modern-variable-light]
+ \starttypescript [serif] [modern-variable-light,latin-modern-variable-light,default]
\definefontsynonym [ComputerModernVariable] [LMTypewriterVarWd-Light]
\definefontsynonym [ComputerModernVariable-Italic] [LMTypewriterVarWd-LightOblique]
\definefontsynonym [ComputerModernVariable-Slanted] [LMTypewriterVarWd-LightOblique]
@@ -375,18 +375,18 @@
\definefontsynonym [ComputerModernVariable-CapsSlanted] [LMTypewriterVarWd-LightOblique]
\stoptypescript
- \starttypescript [math] [modern,latin-modern]
- % isn't this obsolete now?
- \definefontsynonym [LMMathRoman-Regular] [LMMathRoman10-Regular]
- \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold]
- %definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic]
- %definefontsynonym [LMMathSymbols-Italic] [LMMathSymbols10-Italic]
- %definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular]
- %definefontsynonym [LMMathItalic-Italic] [LMMathItalic10-Italic]
- %definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic]
+ \starttypescript [math] [modern,latin-modern,default]
+ \definefontsynonym [LMMathRoman-Regular] [LMMathRoman10-Regular]
+ \definefontsynonym [LMMathRoman-Bold] [LMMathRoman10-Bold]
+ \stoptypescript
+
+ \starttypescript [math] [modern,latin-modern,default]
+ % \loadfontgoodies[lm-math]
+ \definefontsynonym [LMMathRoman-Regular] [\v!file:lmmath.otf] [\s!features=\s!math]
+ % \definefontsynonym [LMMathRoman-Bold] [\v!file:lmmathbold.otf] [\s!features=\s!math]
\stoptypescript
- \starttypescript [modern]
+ \starttypescript [modern,default]
\definetypeface [modern] [rm] [serif] [modern] [computer-modern]
\definetypeface [modern] [ss] [sans] [modern] [computer-modern]
\definetypeface [modern] [tt] [mono] [modern] [computer-modern]
@@ -432,7 +432,7 @@
\quittypescriptscanning
\stoptypescript
- \starttypescript [serif] [simple] [name] % bad, will be changed but in sycn with manuals that use it
+ \starttypescript [serif] [simple] [name]% bad, will be changed but in sycn with manuals that use it
\definefontsynonym [Simple] [cmvtt10]
%setupfontsynonym [Simple] [handling=pure]
\stoptypescript
@@ -446,11 +446,11 @@
\definetypescriptprefix [f:heros] [heros] \definetypescriptprefix [f:helvetica] [heros]
\definetypescriptprefix [f:bonum] [bonum] \definetypescriptprefix [f:bookman] [bonum]
\definetypescriptprefix [f:schola] [schola] \definetypescriptprefix [f:schoolbook] [schola]
- \definetypescriptprefix [f:adventor][adventor] %definetypescriptprefix [f:adventor] [adventor]
+ \definetypescriptprefix [f:adventor][adventor]% \definetypescriptprefix [f:adventor] [adventor]
\definetypescriptprefix [f:cursor] [cursor] \definetypescriptprefix [f:courier] [cursor]
- \definetypescriptprefix [f:chorus] [chorus] \definetypescriptprefix [f:chancery] [chorus] % not the full set
+ \definetypescriptprefix [f:chorus] [chorus] \definetypescriptprefix [f:chancery] [chorus]
- \starttypescript [serif,sans,mono] [adventor,bonum,bookman,cursor,courier,heros,helvetica,pagella,palatino,schola,schoolbook,termes,times]
+ \starttypescript [serif,sans] [adventor,bonum,bookman,heros,helvetica,pagella,palatino,schola,schoolbook,termes,times]
\definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-regular] [\s!features=\s!default]
\definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-italic] [\s!features=\s!default]
\definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-bold] [\s!features=\s!default]
@@ -461,18 +461,25 @@
\definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-bolditalic] [\s!features=\s!smallcaps]
\stoptypescript
+ \starttypescript [mono] [cursor,courier]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-regular] [\s!features=\s!none]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-italic] [\s!features=\s!none]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-bold] [\s!features=\s!none]
+ \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [\s!file:texgyre\typescriptprefix{f:\typescripttwo}-bolditalic] [\s!features=\s!none]
+ \stoptypescript
+
\starttypescript [serif,calligraphy] [chorus,chancery]
\definefontsynonym [TeXGyreChorus-MediumItalic] [\s!file:texgyrechorus-mediumitalic] [\s!features=\s!default]
\stoptypescript
- \definetypescriptprefix [n:pagella] [TeXGyrePagella] \definetypescriptprefix [n:palatino] [TeXGyrePagella]
- \definetypescriptprefix [n:termes] [TeXGyreTermes] \definetypescriptprefix [n:times] [TeXGyreTermes]
- \definetypescriptprefix [n:heros] [TeXGyreHeros] \definetypescriptprefix [n:helvetica] [TeXGyreHeros]
- \definetypescriptprefix [n:bonum] [TeXGyreBonum] \definetypescriptprefix [n:bookman] [TeXGyreBonum]
- \definetypescriptprefix [n:schola] [TeXGyreSchola] \definetypescriptprefix [n:schoolbook] [TeXGyreSchola]
- \definetypescriptprefix [n:adventor] [TeXGyreAdventor] %definetypescriptprefix [n:adventor] [TeXGyreAdventor]
- \definetypescriptprefix [n:cursor] [TeXGyreCursor] \definetypescriptprefix [n:courier] [TeXGyreCursor]
- \definetypescriptprefix [n:chorus] [TeXGyreChorus] \definetypescriptprefix [n:chancery] [TeXGyreChorus] % not the full set
+ \definetypescriptprefix [n:pagella] [TeXGyrePagella] \definetypescriptprefix [n:palatino] [TeXGyrePagella]
+ \definetypescriptprefix [n:termes] [TeXGyreTermes] \definetypescriptprefix [n:times] [TeXGyreTermes]
+ \definetypescriptprefix [n:heros] [TeXGyreHeros] \definetypescriptprefix [n:helvetica] [TeXGyreHeros]
+ \definetypescriptprefix [n:bonum] [TeXGyreBonum] \definetypescriptprefix [n:bookman] [TeXGyreBonum]
+ \definetypescriptprefix [n:schola] [TeXGyreSchola] \definetypescriptprefix [n:schoolbook] [TeXGyreSchola]
+ \definetypescriptprefix [n:adventor] [TeXGyreAdventor]% \definetypescriptprefix [n:adventor] [TeXGyreAdventor]
+ \definetypescriptprefix [n:cursor] [TeXGyreCursor] \definetypescriptprefix [n:courier] [TeXGyreCursor]
+ \definetypescriptprefix [n:chorus] [TeXGyreChorus] \definetypescriptprefix [n:chancery] [TeXGyreChorus] % not the full set
\starttypescript [serif] [pagella,palatino,termes,times,bonum,bookman,schola,schoolbook] [name]
\definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular]
@@ -629,6 +636,41 @@
\stoptypescriptcollection
+\starttypescriptcollection[dejavu]
+
+ \starttypescript [serif] [dejavu] [name]
+ \setups[font:fallback:serif]
+ \definefontsynonym [Serif] [name:dejavuserif] [features=default]
+ \definefontsynonym [SerifBold] [name:dejavuserifbold] [features=default]
+ \definefontsynonym [SerifItalic] [name:dejavuserifitalic] [features=default]
+ \definefontsynonym [SerifBoldItalic] [name:dejavuserifbolditalic] [features=default]
+ \stoptypescript
+
+ \starttypescript [sans] [dejavu] [name]
+ \setups[font:fallback:sans]
+ \definefontsynonym [Sans] [name:dejavusans] [features=default]
+ \definefontsynonym [SansBold] [name:dejavusansbold] [features=default]
+ \definefontsynonym [SansItalic] [name:dejavusansoblique] [features=default]
+ \definefontsynonym [SansBoldItalic] [name:dejavusansboldoblique] [features=default]
+ \stoptypescript
+
+ \starttypescript [mono] [dejavu] [name]
+ \setups[font:fallback:mono]
+ \definefontsynonym [Mono] [name:dejavusansmono] [features=none]
+ \definefontsynonym [MonoBold] [name:dejavusansmonobold] [features=none]
+ \definefontsynonym [MonoItalic] [name:dejavusansmonooblique] [features=none]
+ \definefontsynonym [MonoBoldItalic] [name:dejavusansmonoboldoblique] [features=none]
+ \stoptypescript
+
+ \starttypescript[dejavu]
+ \definetypeface [dejavu] [rm] [serif] [dejavu] [default]
+ \definetypeface [dejavu] [ss] [sans] [dejavu] [default]
+ \definetypeface [dejavu] [tt] [mono] [dejavu] [default]
+ \definetypeface [dejavu] [mm] [math] [xits] [default] [rscale=auto]
+ \stoptypescript
+
+\stoptypescriptcollection
+
\starttypescriptcollection[antykwa]
% Antykwa Torunska (GUST)
@@ -1259,9 +1301,9 @@
\starttypescriptcollection[symbols]
\starttypescript
- \definefontsynonym [ZapfDingbats] [uzdr]
+ \definefontsynonym [ZapfDingbats] [\s!file:uzdr][goodies=dingbats]
\definefontsynonym [RalfSmithFormalScript] [rsfs10]
- \definefontsynonym [MartinVogel] [fmvr8x]
+ \definefontsynonym [MartinVogel] [\s!file:marvosym.ttf]
\stoptypescript
\stoptypescriptcollection
@@ -1269,13 +1311,13 @@
\starttypescriptcollection[charter]
\starttypescript [serif] [charter]
- \definefontsynonym [Charter-Roman] [\s!name:CharterBT-Roman] % or: [bchr8a]
- \definefontsynonym [Charter-Italic] [\s!name:CharterBT-Italic] % or: [bchri8a]
- \definefontsynonym [Charter-Bold] [\s!name:CharterBT-Bold] % or: [bchb8a]
- \definefontsynonym [Charter-BoldItalic] [\s!name:CharterBT-BoldItalic] % or: [bchbi8a]
- \definefontsynonym [Charter-Slanted] [\s!name:CharterBT-Italic] % or: [bchri8a]
- \definefontsynonym [Charter-BoldSlanted] [\s!name:CharterBT-BoldItalic] % or: [bchbi8a]
- \definefontsynonym [Charter-Roman-Caps] [Charter-Roman] % not present
+ \definefontsynonym [Charter-Roman] [\s!name:CharterBT-Roman]
+ \definefontsynonym [Charter-Italic] [\s!name:CharterBT-Italic]
+ \definefontsynonym [Charter-Bold] [\s!name:CharterBT-Bold]
+ \definefontsynonym [Charter-BoldItalic] [\s!name:CharterBT-BoldItalic]
+ \definefontsynonym [Charter-Slanted] [\s!name:CharterBT-Italic]
+ \definefontsynonym [Charter-BoldSlanted] [\s!name:CharterBT-BoldItalic]
+ \definefontsynonym [Charter-Roman-Caps] [Charter-Roman]
\stoptypescript
\starttypescript [serif] [charter] [name]
@@ -1394,21 +1436,6 @@
\definefontsynonym [SansCaps] [LucidaSans]
\stoptypescript
- % Lucida Bright Typewriter
-
- % only one family may be used as mono; sans used to be that since the beginning,
- % so we keep using that as default
-
- % \starttypescript [mono] [lucida] [name]
- % \definefontsynonym [Mono] [LucidaTypewriter]
- % \definefontsynonym [MonoBold] [LucidaTypewriterBold]
- % \definefontsynonym [MonoItalic] [LucidaTypewriterOblique]
- % \definefontsynonym [MonoBoldItalic] [LucidaTypewriterBoldOblique]
- % \definefontsynonym [MonoSlanted] [LucidaTypewriterOblique]
- % \definefontsynonym [MonoBoldSlanted] [LucidaTypewriterBoldOblique]
- % \definefontsynonym [MonoCaps] [LucidaTypewriter]
- % \stoptypescript
-
% Lucida Bright Sans Typewriter
\starttypescript [mono] [lucida] [name]
@@ -1427,38 +1454,16 @@
\definefontsynonym [Calligraphy] [LucidaCalligraphy-Italic]
\stoptypescript
- % Lucida Casual
-
- % \starttypescript [casual] [lucida] [name]
- % % LucidaCasual
- % % LucidaCasual-Italic
- % \stoptypescript
-
% Lucida Handwriting
\starttypescript [handwriting] [lucida] [name]
\definefontsynonym [Handwriting] [LucidaHandwriting-Italic]
\stoptypescript
- % Lucida Fax
- %
- % \starttypescript [fax] [lucida] [name]
- % \definefontsynonym [FaksRegular] [LucidaFax]
- % \definefontsynonym [FaksBold] [LucidaFax-Demi]
- % \definefontsynonym [FaksItalic] [LucidaFax-Italic]
- % \definefontsynonym [FaksBoldItalic] [LucidaFax-DemiItalic]
- % \stoptypescript
-
- % Lucida Black Letter
- %
- % \starttypescript [blackletter] [lucida] [name]
- % \definefontsynonym [Blackletter] [LucidaBlackletter]
- % \stoptypescript
-
\starttypescript [lucida]
\definetypeface [lucida] [rm] [\s!serif] [lucida] [\s!default] [\s!features=\s!default]
\definetypeface [lucida] [ss] [\s!sans] [lucida] [\s!default] [\s!features=\s!default]
- \definetypeface [lucida] [tt] [\s!mono] [lucida] [\s!default] [\s!features=\s!default]
+ \definetypeface [lucida] [tt] [\s!mono] [lucida] [\s!default] [\s!features=\s!none]
\definetypeface [lucida] [hw] [\s!handwriting] [lucida] [\s!default] [\s!features=\s!default]
\definetypeface [lucida] [cg] [\s!calligraphy] [lucida] [\s!default] [\s!features=\s!default]
\definetypeface [lucida] [mm] [\s!math] [lucida] [\s!default]
@@ -1492,13 +1497,14 @@
\stoptypescript
\starttypescript [math] [asana] [name]
- \definefontsynonym [MathRoman] [AsanaMath] [\s!features=math\mathsizesuffix]
+ \loadfontgoodies[asana-math]
+ \definefontsynonym [MathRoman] [AsanaMath] [\s!features=\s!math\mathsizesuffix,\s!goodies=asana-math]
\stoptypescript
\starttypescript[asana]
\definetypeface [\typescriptone] [rm] [\s!serif] [palatino] [\s!default]
- \definetypeface [\typescriptone] [ss] [\s!sans] [modern] [\s!default] [rscale=1.075]
- \definetypeface [\typescriptone] [tt] [\s!mono] [modern] [\s!default] [rscale=1.075]
+ \definetypeface [\typescriptone] [ss] [\s!sans] [modern] [\s!default] [\s!rscale=1.075]
+ \definetypeface [\typescriptone] [tt] [\s!mono] [modern] [\s!default] [\s!rscale=1.075]
\definetypeface [\typescriptone] [mm] [\s!math] [\typescriptone] [\s!default]
\quittypescriptscanning
\stoptypescript
@@ -1527,13 +1533,16 @@
\stoptypescript
\starttypescript [math] [cambria,cambria-m,cambria-a] [name]
- \definefontsynonym [MathRoman] [CambriaMath] [\s!features=math\mathsizesuffix]
+ \loadfontgoodies[cambria-math]
+ \definefontsynonym [MathRoman] [CambriaMath] [\s!features=\s!math\mathsizesuffix]
\stoptypescript
\starttypescript [math] [cambria-x] [name]
- \definefontsynonym [MathRoman] [CambriaMath] [\s!features=math]
+ \loadfontgoodies[cambria-math]
+ \definefontsynonym [MathRoman] [CambriaMath] [\s!features=\s!math]
\stoptypescript
\starttypescript [math] [cambria-y] [name]
- \definefontsynonym [MathRoman] [CambriaMath] [\s!features=math-nostack\mathsizesuffix]
+ \loadfontgoodies[cambria-math]
+ \definefontsynonym [MathRoman] [CambriaMath] [\s!features=\s!math-nostack\mathsizesuffix]
\stoptypescript
\starttypescript [serif] [cambria,cambria-m,cambria-a] [name]
@@ -1565,12 +1574,12 @@
\definefontsynonym [\s!SansBoldItalic] [\s!file:candaraz] [\s!features=\s!default]
\stoptypescript
- \starttypescript [sans] [consolas] [name]
- \setups[\s!font:\s!fallback:\s!sans]
- \definefontsynonym [\s!Sans] [\s!file:consola] [\s!features=\s!default]
- \definefontsynonym [\s!SansBold] [\s!file:consolab] [\s!features=\s!default]
- \definefontsynonym [\s!SansItalic] [\s!file:consolai] [\s!features=\s!default]
- \definefontsynonym [\s!SansBoldItalic] [\s!file:consolaz] [\s!features=\s!default]
+ \starttypescript [mono] [consolas] [name]
+ \setups[\s!font:\s!fallback:\s!mono]
+ \definefontsynonym [\s!Mono] [\s!file:consola] [\s!features=\s!none]
+ \definefontsynonym [\s!MonoBold] [\s!file:consolab] [\s!features=\s!none]
+ \definefontsynonym [\s!MonoItalic] [\s!file:consolai] [\s!features=\s!none]
+ \definefontsynonym [\s!MonoBoldItalic] [\s!file:consolaz] [\s!features=\s!none]
\stoptypescript
\starttypescript [serif] [constantia] [name]
@@ -1613,18 +1622,18 @@
\starttypescript [sans] [mscorearial] [name]
\setups[\s!font:\s!fallback:\s!sans]
- \definefontsynonym [\s!Sans] [\s!file:arial.ttf] [\s!features=default]
- \definefontsynonym [\s!SansBold] [\s!file:arialbd.ttf] [\s!features=default]
- \definefontsynonym [\s!SansItalic] [\s!file:ariali.ttf] [\s!features=default]
- \definefontsynonym [\s!SansBoldItalic] [\s!file:arialbi.ttf] [\s!features=default]
+ \definefontsynonym [\s!Sans] [\s!file:arial.ttf] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBold] [\s!file:arialbd.ttf] [\s!features=\s!default]
+ \definefontsynonym [\s!SansItalic] [\s!file:ariali.ttf] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBoldItalic] [\s!file:arialbi.ttf] [\s!features=\s!default]
\stoptypescript
\starttypescript [mono] [mscorecourier] [name]
\setups[\s!font:\s!fallback:\s!mono]
- \definefontsynonym [\s!Mono] [\s!file:cour.ttf] [\s!features=\s!default]
- \definefontsynonym [\s!MonoBold] [\s!file:courbd.ttf] [\s!features=\s!default]
- \definefontsynonym [\s!MonoItalic] [\s!file:couri.ttf] [\s!features=\s!default]
- \definefontsynonym [\s!MonoBoldItalic] [\s!file:courbi.ttf] [\s!features=\s!default]
+ \definefontsynonym [\s!Mono] [\s!file:cour.ttf] [\s!features=\s!none]
+ \definefontsynonym [\s!MonoBold] [\s!file:courbd.ttf] [\s!features=\s!none]
+ \definefontsynonym [\s!MonoItalic] [\s!file:couri.ttf] [\s!features=\s!none]
+ \definefontsynonym [\s!MonoBoldItalic] [\s!file:courbi.ttf] [\s!features=\s!none]
\stoptypescript
\starttypescript [sans] [mscoreverdana] [name]
@@ -1637,16 +1646,23 @@
\starttypescript[mscore]
\definetypeface [mscore] [rm] [serif] [mscoretimes] [default]
- \definetypeface [mscore] [ss] [sans] [mscorearial] [default] [rscale=0.860]
- \definetypeface [mscore] [tt] [mono] [mscorecourier] [default] [rscale=1.065]
- \definetypeface [mscore] [mm] [math] [times] [default] [rscale=1.020]
+ \definetypeface [mscore] [ss] [sans] [mscorearial] [default] [\s!rscale=0.860]
+ \definetypeface [mscore] [tt] [mono] [mscorecourier] [default] [\s!rscale=1.065]
+ \definetypeface [mscore] [mm] [math] [times] [default] [\s!rscale=1.020]
\stoptypescript
+ % \starttypescript[mscoress]
+ % \definetypeface [mscoress] [ss] [sans] [mscorearial] [default]
+ % \definetypeface [mscoress] [rm] [serif] [mscoretimes] [default] [rscale=1.160]
+ % \definetypeface [mscoress] [tt] [mono] [mscorecourier] [default] [rscale=1.240]
+ % \definetypeface [mscoress] [mm] [math] [times] [default] [rscale=1.185]
+ % \stoptypescript
+
\stoptypescriptcollection
\starttypescriptcollection[liberation]
- \starttypescript [serif] [liberationserif] [name]
+ \starttypescript [serif] [liberation] [name]
\setups[\s!font:\s!fallback:\s!serif]
\definefontsynonym [\s!Serif] [\s!file:liberationserif-regular] [\s!features=\s!default]
\definefontsynonym [\s!SerifBold] [\s!file:liberationserif-bold] [\s!features=\s!default]
@@ -1654,7 +1670,7 @@
\definefontsynonym [\s!SerifBoldItalic] [\s!file:liberationserif-bolditalic] [\s!features=\s!default]
\stoptypescript
- \starttypescript [sans] [liberationsans] [name]
+ \starttypescript [sans] [liberation] [name]
\setups[\s!font:\s!fallback:\s!sans]
\definefontsynonym [\s!Sans] [\s!file:liberationsans-regular] [\s!features=\s!default]
\definefontsynonym [\s!SansBold] [\s!file:liberationsans-bold] [\s!features=\s!default]
@@ -1662,19 +1678,19 @@
\definefontsynonym [\s!SansBoldItalic] [\s!file:liberationsans-bolditalic] [\s!features=\s!default]
\stoptypescript
- \starttypescript [mono] [liberationmono] [name]
+ \starttypescript [mono] [liberation] [name]
\setups[\s!font:\s!fallback:\s!mono]
- \definefontsynonym [\s!Mono] [\s!file:liberationmono-regular] [\s!features=\s!default]
- \definefontsynonym [\s!MonoBold] [\s!file:liberationmono-bold] [\s!features=\s!default]
- \definefontsynonym [\s!MonoItalic] [\s!file:liberationmono-italic] [\s!features=\s!default]
- \definefontsynonym [\s!MonoBoldItalic] [\s!file:liberationmono-bolditalic] [\s!features=\s!default]
+ \definefontsynonym [\s!Mono] [\s!file:liberationmono-regular] [\s!features=\s!none]
+ \definefontsynonym [\s!MonoBold] [\s!file:liberationmono-bold] [\s!features=\s!none]
+ \definefontsynonym [\s!MonoItalic] [\s!file:liberationmono-italic] [\s!features=\s!none]
+ \definefontsynonym [\s!MonoBoldItalic] [\s!file:liberationmono-bolditalic] [\s!features=\s!none]
\stoptypescript
\starttypescript[liberation]
- \definetypeface [liberation] [rm] [serif] [liberationserif] [default]
- \definetypeface [liberation] [ss] [sans] [liberationsans] [default] [rscale=0.870]
- \definetypeface [liberation] [tt] [mono] [liberationmono] [default] [rscale=0.870]
- \definetypeface [liberation] [mm] [math] [times] [default] [rscale=1.040]
+ \definetypeface [liberation] [rm] [serif] [liberation] [default]
+ \definetypeface [liberation] [ss] [sans] [liberation] [default] [\s!rscale=0.870]
+ \definetypeface [liberation] [tt] [mono] [liberation] [default] [\s!rscale=0.870]
+ \definetypeface [liberation] [mm] [math] [times] [default] [\s!rscale=1.040]
\stoptypescript
\stoptypescriptcollection
@@ -1699,32 +1715,43 @@
\definefontsynonym [Libertine-Italic] [\s!file:fxlri]
\definefontsynonym [Libertine-Bold] [\s!file:fxlb]
\definefontsynonym [Libertine-BoldItalic] [\s!file:fxlbi]
- \definefontsynonym [Libertine-SmallCaps] [file:fxlrc]
+ \definefontsynonym [Libertine-SmallCaps] [\s!file:fxlr] [\s!features=\s!smallcaps]
\stoptypescript
\starttypescript [serif] [libertine] [name]
\setups[\s!font:\s!fallback:\s!serif]
\definefontsynonym [\s!Serif] [Libertine-Regular] [\s!features=\s!default]
\definefontsynonym [\s!SerifItalic] [Libertine-Italic] [\s!features=\s!default]
- % \definefontsynonym [\s!SerifSlanted] [Libertine-Italic] [\s!features=\s!default]
\definefontsynonym [\s!SerifBold] [Libertine-Bold] [\s!features=\s!default]
\definefontsynonym [\s!SerifBoldItalic] [Libertine-BoldItalic] [\s!features=\s!default]
- % \definefontsynonym [\s!SerifBoldSlanted][Libertine-BoldItalic] [\s!features=\s!default]
- \definefontsynonym [\s!SerifCaps] [Libertine-SmallCaps] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifCaps] [Libertine-Regular] [\s!features=\s!smallcaps]
\stoptypescript
- \starttypescript [libertine]
- \definetypeface [libertine] [tt] [mono] [default] [default]
- \definetypeface [libertine] [ss] [sans] [default] [default]
- \definetypeface [libertine] [rm] [serif] [libertine] [default]
+ \starttypescript [sans] [biolinum]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [Biolinum-Regular] [\s!file:fxbr.otf]
+ \definefontsynonym [Biolinum-Bold] [\s!file:fxbb.otf]
+ \definefontsynonym [Biolinum-Italic] [\s!file:fxbri.otf]
+ \definefontsynonym [Biolinum-Slanted] [\s!file:fxbro.otf]
+ \definefontsynonym [Biolinum-BoldItalic] [\s!file:fxbbo.otf]
\stoptypescript
\starttypescript [sans] [biolinum] [name]
\setups[\s!font:\s!fallback:\s!sans]
- \definefontsynonym [\s!Sans] [\s!file:fxbr.otf] [\s!features=\s!default]
- %definefontsynonym [\s!SansBold] [\s!file:fxbb.otf] [\s!features=\s!default] % unfinished
- %definefontsynonym [\s!SansItalic] [\s!file:fxbri.otf] [\s!features=\s!default] % nonexistent
- %definefontsynonym [\s!SansBoldItalic] [\s!file:fxbbi.otf] [\s!features=\s!default] % nonexistent
+ \definefontsynonym [\s!Sans] [Biolinum-Regular] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBold] [Biolinum-Bold] [\s!features=\s!default]
+ \definefontsynonym [\s!SansItalic] [Biolinum-Italic] [\s!features=\s!default]
+ \definefontsynonym [\s!SansSlanted] [Biolinum-Slanted] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBoldItalic] [Biolinum-BoldItalic] [\s!features=\s!default]
+ \definefontsynonym [\s!SansCaps] [Biolinum-Regular] [\s!features=\s!smallcaps]
+ \stoptypescript
+
+ \starttypescript [libertine]
+ \definetypeface [libertine] [rm] [serif] [libertine] [default]
+ \definetypeface [libertine] [ss] [sans] [biolinum] [default]
+ \definetypeface [libertine] [tt] [mono] [default] [default]
+ %definetypeface [libertine] [mm] [math] [times] [default]
+ \quittypescriptscanning
\stoptypescript
\stoptypescriptcollection
@@ -1761,15 +1788,15 @@
\stoptypescript
\starttypescript [math] [euler] [name]
- % \definefontsynonym [MathRoman] [EulerMath] [\s!features=math]
- \definefontsynonym [MathRoman] [EulerMath] [\s!features=math\mathsizesuffix]
+ % \definefontsynonym [MathRoman] [EulerMath] [\s!features=\s!math]
+ \definefontsynonym [MathRoman] [EulerMath] [\s!features=\s!math\mathsizesuffix]
\stoptypescript
\starttypescript [pagella-euler]
\definetypeface [\typescriptone] [rm] [\s!serif] [pagella] [\s!default]
- % \definetypeface [\typescriptone] [ss] [\s!sans] [pagella] [\s!default] [\s!rscale=auto]
- \definetypeface [\typescriptone] [tt] [\s!mono] [modern] [\s!default] [\s!rscale=auto]
- \definetypeface [\typescriptone] [mm] [\s!math] [euler] [\s!default] [\s!rscale=auto]
+ % \definetypeface [\typescriptone] [ss] [\s!sans] [pagella] [\s!default]
+ \definetypeface [\typescriptone] [tt] [\s!mono] [modern] [\s!default]
+ \definetypeface [\typescriptone] [mm] [\s!math] [euler] [\s!default]
\quittypescriptscanning
\stoptypescript
@@ -1780,7 +1807,7 @@
\starttypescript [euler]
\definetypeface [euler] [rm] [\s!serif] [euler] [\s!default]
- \definetypeface [euler] [tt] [\s!mono] [modern] [\s!default] [\s!rscale=auto]
+ \definetypeface [euler] [tt] [\s!mono] [modern] [\s!default]
\definetypeface [euler] [mm] [\s!math] [euler] [\s!default]
\quittypescriptscanning
\stoptypescript
@@ -1796,7 +1823,7 @@
% to be ttf files as well. BTW, why 'italic' infull and 'bol' without 'd'?
\starttypescript [math] [stix] [name]
- \definefontsynonym[MathRoman][file:stixgeneral.otf] [features=math]
+ \definefontsynonym[MathRoman][\s!file:stixgeneral.otf] [\s!features=\s!math]
\stoptypescript
\starttypescript [serif] [stix] [name]
@@ -1817,10 +1844,13 @@
\starttypescriptcollection[xits]
% This one makes more sense. Xits uses the glyph collection from stix but packages
- % it in a proper OpenType Math font.
+ % it in a proper OpenType Math font. From the Stix site: Version 1.1, which will
+ % include fonts packaged for use with Microsoft Office applications, is scheduled
+ % for release by the end of 2010. Version 1.2, which will include Type 1 fonts for
+ % use with LaTeX, will follow in 2011. So, we are on our own anyway.
\starttypescript [math] [xits] [name]
- \definefontsynonym[MathRoman][file:xits-math.otf][\s!features=\s!math\mathsizesuffix]
+ \definefontsynonym[MathRoman][\s!file:xits-math.otf][\s!features=\s!math\mathsizesuffix,\s!goodies=xits-math]
\stoptypescript
\starttypescript [serif] [xits] [name]
@@ -1840,9 +1870,80 @@
\stoptypescriptcollection
-% \starttypescript [math] [hvmath]
-% \definefontsynonym[MathRoman][hvmath@hvmath-math]
-% \loadfontgoodies[hvmath-math]
-% \stoptypescript
+\starttypescriptcollection[punk]
+
+ \definefontfeature [punknova] [mode=node,script=latn,rand=yes,kern=yes,liga=yes,tlig=yes]
+ \definefontfeature [punknova-slanted] [punknova] [slant=.25]
+
+ \starttypescript [serif] [punknova]
+ \definefontsynonym [Serif] [\s!file:punknova-regular] [\s!features=punknova]
+ \definefontsynonym [SerifSlanted] [\s!file:punknova-regular] [\s!features=punknova-slanted]
+ \definefontsynonym [SerifBold] [\s!file:punknova-bold] [\s!features=punknova]
+ \definefontsynonym [SerifBoldSlanted][\s!file:punknova-bold] [\s!features=punknova-slanted]
+ \definefontsynonym [SerifItalic] [SerifSlanted]
+ \definefontsynonym [SerifBoldItalic] [SerifBoldSlanted]
+ \stoptypescript
+
+ % \definefontfeature [slanted-25] [slant=.25]
+ % \starttypescript [serif] [punknova]
+ % \definefontsynonym [SerifSlanted] [\s!file:punknova-regular] [\s!features={punknova,slanted-25}]
+ % \stoptypescript
+
+ \starttypescript [punknova]
+ \definetypeface [punknova] [rm] [serif] [punknova] [default]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[hvmath]
+
+ \starttypescript [math] [hvmath]
+ \definefontsynonym[MathRoman][hvmath@hvmath-math]
+ \loadfontgoodies[hvmath-math]
+ \stoptypescript
+
+ \starttypescript [hvmath]
+ \definetypeface [hvmath] [ss] [sans] [heros] [default] [rscale=0.9]
+ \definetypeface [hvmath] [rm] [serif] [termes] [default]
+ \definetypeface [hvmath] [tt] [mono] [cursor] [default] [rscale=1.05]
+ \definetypeface [hvmath] [mm] [math] [hvmath] [default]
+ \stoptypescript
+
+\stoptypescriptcollection
+
+\starttypescriptcollection[computer-modern-unicode]
+
+ \starttypescript [serif,sans,mono] [computer-modern-unicode]
+ \definefontsynonym [\s!Serif] [\s!file:cmunrm] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifItalic] [\s!file:cmunti] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifSlanted] [\s!file:cmunsl] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBold] [\s!file:cmunbx] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBoldItalic] [\s!file:cmunbi] [\s!features=\s!default]
+ \definefontsynonym [\s!Sans] [\s!file:cmunss] [\s!features=\s!default]
+ \definefontsynonym [\s!SansItalic] [\s!file:cmunsi] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBold] [\s!file:cmunsx] [\s!features=\s!default]
+ \definefontsynonym [\s!SansBoldItalic] [\s!file:cmunso] [\s!features=\s!default]
+ \definefontsynonym [\s!Mono] [\s!file:cmuntt] [\s!features=\s!none]
+ \definefontsynonym [\s!MonoItalic] [\s!file:cmunit] [\s!features=\s!none]
+ \definefontsynonym [\s!MonoSlanted] [\s!file:cmunst] [\s!features=\s!none]
+ \definefontsynonym [\s!MonoBold] [\s!file:cmuntb] [\s!features=\s!none]
+ \definefontsynonym [\s!MonoBoldItalic] [\s!file:cmuntx] [\s!features=\s!none]
+ \stoptypescript
+
+ \starttypescript [serif] [computer-modern-unicode-concrete]
+ \definefontsynonym [\s!Serif] [\s!file:cmunorm] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifItalic] [\s!file:cmunoti] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBold] [\s!file:cmunobx] [\s!features=\s!default]
+ \definefontsynonym [\s!SerifBoldItalic] [\s!file:cmunobi] [\s!features=\s!default]
+ \stoptypescript
+
+ \starttypescript[computer-modern-unicode]
+ \definetypeface[computer-modern-unicode][rm][\s!serif][computer-modern-unicode][\s!default]
+ \definetypeface[computer-modern-unicode][ss][\s!sans] [computer-modern-unicode][\s!default]
+ \definetypeface[computer-modern-unicode][tt][\s!mono] [computer-modern-unicode][\s!default]
+ \definetypeface[computer-modern-unicode][mm][\s!math] [modern] [\s!default]
+ \stoptypescript
+
+\stoptypescriptcollection
-\protect \endinput
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/type-run.mkiv b/Master/texmf-dist/tex/context/base/type-run.mkiv
index e91398095ac..60061bcbe9e 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}
- {\ExpandBothAfter\doifcommonelse{##1}{##2}\donetrue\donefalse}}
+ {\doifcommonelse{##1}{##2}\donetrue\donefalse}}
\edef\typescriptone {\truetypescript{#1}}%
\edef\typescripttwo {\truetypescript{#2}}%
\edef\typescriptthree{\truetypescript{#3}}%
diff --git a/Master/texmf-dist/tex/context/base/type-set.mkii b/Master/texmf-dist/tex/context/base/type-set.mkii
index 0316f95c787..2845b1dbbee 100644
--- a/Master/texmf-dist/tex/context/base/type-set.mkii
+++ b/Master/texmf-dist/tex/context/base/type-set.mkii
@@ -64,15 +64,15 @@
\stopsetups
\ifnum\texengine=\xetexengine
- \usetypescriptfile[\f!typeprefix def]
- %usetypescriptfile[\f!typeprefix tmf]
+ %usetypescriptfile[\f!typeprefix def] % preloaded in context.mkii
+ %usetypescriptfile[\f!typeprefix tmf] % replaced
\usetypescriptfile[\f!typeprefix siz]
\usetypescriptfile[\f!typeprefix otf]
\usetypescriptfile[\f!typeprefix xtx]
\usetypescriptfile[\f!typeprefix loc]
\else
- \usetypescriptfile[\f!typeprefix def]
- %usetypescriptfile[\f!typeprefix tmf]
+ %usetypescriptfile[\f!typeprefix def] % preloaded in context.mkii
+ %usetypescriptfile[\f!typeprefix tmf] % replaced
\usetypescriptfile[\f!typeprefix siz]
\usetypescriptfile[\f!typeprefix one]
\usetypescriptfile[\f!typeprefix loc]
diff --git a/Master/texmf-dist/tex/context/base/type-set.mkiv b/Master/texmf-dist/tex/context/base/type-set.mkiv
index d12c333fe3c..a67be14af41 100644
--- a/Master/texmf-dist/tex/context/base/type-set.mkiv
+++ b/Master/texmf-dist/tex/context/base/type-set.mkiv
@@ -17,7 +17,7 @@
\definetypescriptprefix [sans] [Sans]
\definetypescriptprefix [mono] [Mono]
-\definefontsynonym [DefaultFont] [cmvtt10]
+\definefontsynonym [DefaultFont] [\s!file:lmmonoprop10-regular] % was cmvtt10
\startsetups [font:fallback:serif]
\definefontsynonym [Serif] [DefaultFont]
@@ -67,11 +67,11 @@
%definefontsynonym [SansCaps] [SansBold]
\stopsetups
-\usetypescriptfile[\f!typeprefix def]
-\usetypescriptfile[\f!typeprefix lua]
-%usetypescriptfile[\f!typeprefix tmf]
-\usetypescriptfile[\f!typeprefix siz]
-\usetypescriptfile[\f!typeprefix otf]
-\usetypescriptfile[\f!typeprefix loc]
+%usetypescriptfile[def] % preloaded in main context.mkiv file
+%usetypescriptfile[lua] % preloaded in main context.mkiv file
+%usetypescriptfile[tmf] % replaced by otf (mkiv) en one (mkii)
+\usetypescriptfile[siz]
+\usetypescriptfile[otf]
+\usetypescriptfile[loc]
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/type-siz.mkiv b/Master/texmf-dist/tex/context/base/type-siz.mkiv
index f513c7392a3..35bc8fb4446 100644
--- a/Master/texmf-dist/tex/context/base/type-siz.mkiv
+++ b/Master/texmf-dist/tex/context/base/type-siz.mkiv
@@ -55,7 +55,7 @@
[cg] [default]
\stoptypescript
-\starttypescript [casual] [default] [size] % maps onto rm !
+\starttypescript [casual] [default] [size]
\definebodyfont
[4pt,5pt,6pt,7pt,8pt,9pt,10pt,11pt,12pt,14.4pt,17.3pt]
[rm] [default]
diff --git a/Master/texmf-dist/tex/context/base/typo-brk.lua b/Master/texmf-dist/tex/context/base/typo-brk.lua
index 8f7a00f9df9..fe0258bccd6 100644
--- a/Master/texmf-dist/tex/context/base/typo-brk.lua
+++ b/Master/texmf-dist/tex/context/base/typo-brk.lua
@@ -13,32 +13,56 @@ local next, type, tonumber = next, type, tonumber
local utfbyte, utfchar = utf.byte, utf.char
local format = string.format
-local settings_to_array = aux.settings_to_array
+local trace_breakpoints = false trackers.register("typesetters.breakpoints", function(v) trace_breakpoints = v end)
+
+local report_breakpoints = logs.reporter("typesetting","breakpoints")
+
+local nodes, node = nodes, node
+
+local settings_to_array = utilities.parsers.settings_to_array
local has_attribute = node.has_attribute
local unset_attribute = node.unset_attribute
local set_attribute = node.set_attribute
local copy_node = node.copy
+local copy_nodelist = node.copy_list
local free_node = node.free
local insert_node_before = node.insert_before
local insert_node_after = node.insert_after
-local make_penalty_node = nodes.penalty
-local make_glue_node = nodes.glue
-local make_disc_node = nodes.disc
-local make_glyph_node = nodes.glyph
local remove_node = nodes.remove -- ! nodes
-local tonodes = blobs.tonodes
+local link_nodes = nodes.link
+
+local texattribute = tex.attribute
+
+local nodepool = nodes.pool
+local tasks = nodes.tasks
+
+local new_penalty = nodepool.penalty
+local new_glue = nodepool.glue
+local new_disc = nodepool.disc
+
+local nodecodes = nodes.nodecodes
+local kerncodes = nodes.kerncodes
+
+local glyph_code = nodecodes.glyph
+local kern_code = nodecodes.kern
+
+local kerning_code = kerncodes.kerning
+
+local typesetters = typesetters
-local glyph = node.id("glyph")
-local kern = node.id("kern")
+typesetters.breakpoints = typesetters.breakpoints or {}
+local breakpoints = typesetters.breakpoints
-breakpoints = breakpoints or { }
-breakpoints.mapping = breakpoints.mapping or { }
-breakpoints.methods = breakpoints.methods or { }
-breakpoints.attribute = attributes.private("breakpoint")
+breakpoints.mapping = breakpoints.mapping or { }
+local mapping = breakpoints.mapping
-storage.register("breakpoints/mapping", breakpoints.mapping, "breakpoints.mapping")
+breakpoints.methods = breakpoints.methods or { }
+local methods = breakpoints.methods
-local mapping = breakpoints.mapping
+local a_breakpoints = attributes.private("breakpoint")
+breakpoints.attribute = a_breakpoints
+
+storage.register("typesetters/breakpoints/mapping", breakpoints.mapping, "typesetters.breakpoints.mapping")
function breakpoints.setreplacement(id,char,language,settings)
char = utfbyte(char)
@@ -54,33 +78,35 @@ function breakpoints.setreplacement(id,char,language,settings)
end
local left, right, middle = settings.left, settings.right, settings.middle
cmap[language or ""] = {
- kind = tonumber(settings.kind) or 1,
+ type = tonumber(settings.type) or 1,
nleft = tonumber(settings.nleft) or 1,
nright = tonumber(settings.nright) or 1,
left = left ~= "" and left or nil,
right = right ~= "" and right or nil,
middle = middle ~= "" and middle or nil,
- } -- was { kind or 1, before or 1, after or 1 }
+ } -- was { type or 1, before or 1, after or 1 }
end
local function insert_break(head,start,before,after)
- insert_node_before(head,start,make_penalty_node(before))
- insert_node_before(head,start,make_glue_node(0))
- insert_node_after(head,start,make_glue_node(0))
- insert_node_after(head,start,make_penalty_node(after))
+ insert_node_before(head,start,new_penalty(before))
+ insert_node_before(head,start,new_glue(0))
+ insert_node_after(head,start,new_glue(0))
+ insert_node_after(head,start,new_penalty(after))
end
-breakpoints.methods[1] = function(head,start)
+methods[1] = function(head,start)
if start.prev and start.next then
insert_break(head,start,10000,0)
end
return head, start
end
-breakpoints.methods[2] = function(head,start) -- ( => (-
+
+methods[2] = function(head,start) -- ( => (-
if start.prev and start.next then
local tmp
head, start, tmp = remove_node(head,start)
- head, start = insert_node_before(head,start,make_disc_node())
+ head, start = insert_node_before(head,start,new_disc())
+ start.attr = copy_nodelist(tmp.attr) -- todo: critical only
start.replace = tmp
local tmp, hyphen = copy_node(tmp), copy_node(tmp)
hyphen.char = languages.prehyphenchar(tmp.lang)
@@ -90,11 +116,13 @@ breakpoints.methods[2] = function(head,start) -- ( => (-
end
return head, start
end
-breakpoints.methods[3] = function(head,start) -- ) => -)
+
+methods[3] = function(head,start) -- ) => -)
if start.prev and start.next then
local tmp
head, start, tmp = remove_node(head,start)
- head, start = insert_node_before(head,start,make_disc_node())
+ head, start = insert_node_before(head,start,new_disc())
+ start.attr = copy_nodelist(tmp.attr) -- todo: critical only
start.replace = tmp
local tmp, hyphen = copy_node(tmp), copy_node(tmp)
hyphen.char = languages.prehyphenchar(tmp.lang)
@@ -104,36 +132,41 @@ breakpoints.methods[3] = function(head,start) -- ) => -)
end
return head, start
end
-breakpoints.methods[4] = function(head,start) -- - => - - -
+
+methods[4] = function(head,start) -- - => - - -
if start.prev and start.next then
local tmp
head, start, tmp = remove_node(head,start)
- head, start = insert_node_before(head,start,make_disc_node())
+ head, start = insert_node_before(head,start,new_disc())
+ start.attr = copy_nodelist(tmp.attr) -- todo: critical only
start.pre, start.post, start.replace = copy_node(tmp), copy_node(tmp), tmp
insert_break(head,start,10000,10000)
end
return head, start
end
-breakpoints.methods[5] = function(head,start,settings) -- x => p q r
+
+methods[5] = function(head,start,settings) -- x => p q r
if start.prev and start.next then
local tmp
head, start, tmp = remove_node(head,start)
- head, start = insert_node_before(head,start,make_disc_node())
- start.pre, start.post, start.replace = tonodes(settings.right,tmp), tonodes(settings.left,tmp), tonodes(settings.middle,tmp)
+ head, start = insert_node_before(head,start,new_disc())
+ local attr = tmp.attr
+ start.attr = copy_nodelist(attr) -- todo: critical only
+ start.pre = link_nodes(settings.right,tmp,attr)
+ start.post = link_nodes(settings.left,tmp,attr)
+ start.replace = link_nodes(settings.middle,tmp,attr)
free_node(tmp)
insert_break(head,start,10000,10000)
end
return head, start
end
-local methods = breakpoints.methods
-
-function breakpoints.process(namespace,attribute,head)
+local function process(namespace,attribute,head)
local done, numbers = false, languages.numbers
local start, n = head, 0
while start do
local id = start.id
- if id == glyph then
+ if id == glyph_code then
local attr = has_attribute(start,attribute)
if attr and attr > 0 then
unset_attribute(start,attribute) -- maybe test for subtype > 256 (faster)
@@ -151,11 +184,11 @@ function breakpoints.process(namespace,attribute,head)
local next = start.next
while next do -- gamble on same attribute (not that important actually)
local id = next.id
- if id == glyph then -- gamble on same attribute (not that important actually)
+ if id == glyph_code then -- gamble on same attribute (not that important actually)
if map[next.char] then
break
elseif m == 1 then
- local method = methods[smap.kind]
+ local method = methods[smap.type]
if method then
head, start = method(head,start,smap)
done = true
@@ -165,7 +198,7 @@ function breakpoints.process(namespace,attribute,head)
m = m - 1
next = next.next
end
- elseif id == kern and next.subtype == 0 then
+ elseif id == kern_code and next.subtype == kerning_code then
next = next.next
-- ignore intercharacter kerning, will go way
else
@@ -187,7 +220,7 @@ function breakpoints.process(namespace,attribute,head)
else
-- n = n + 1 -- if we want single char handling (|-|) then we will use grouping and then we need this
end
- elseif id == kern and start.subtype == 0 then
+ elseif id == kern_code and start.subtype == kerning_code then
-- ignore intercharacter kerning, will go way
else
n = 0
@@ -197,12 +230,23 @@ function breakpoints.process(namespace,attribute,head)
return head, done
end
-chars.handle_breakpoints = nodes.install_attribute_handler {
- name = "breakpoint",
+function breakpoints.set(n)
+ if trace_breakpoints then
+ report_breakpoints("enabling breakpoints handler")
+ end
+ tasks.enableaction("processors","typesetters.breakpoints.handler")
+ function breakpoints.set(n)
+ texattribute[a_breakpoints] = n
+ end
+ breakpoints.set(n)
+end
+
+breakpoints.handler = nodes.installattributehandler {
+ name = "breakpoint",
namespace = breakpoints,
- processor = breakpoints.process,
+ processor = process,
}
function breakpoints.enable()
- tasks.enableaction("processors","chars.handle_breakpoints")
+ tasks.enableaction("processors","typesetters.breakpoints.handler")
end
diff --git a/Master/texmf-dist/tex/context/base/typo-brk.mkiv b/Master/texmf-dist/tex/context/base/typo-brk.mkiv
index 38afbb454b6..4c21093ec4f 100644
--- a/Master/texmf-dist/tex/context/base/typo-brk.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-brk.mkiv
@@ -17,7 +17,7 @@
\registerctxluafile{typo-brk}{1.001}
-\definesystemattribute[breakpoint] \chardef\breakpointattribute \dogetattributeid{breakpoint}
+\definesystemattribute[breakpoint][public]
% compound stuff (under construction)
@@ -33,7 +33,7 @@
\def\dodefinebreakpoints[#1]%
{\ifcsname\??bp:#1\endcsname \else
\global\advance\maxbreakpointsid\plusone
- \setxvalue{\??bp:#1}{\the\maxbreakpointsid}%
+ \setxvalue{\??bp:#1}{\number\maxbreakpointsid}%
\fi}
\def\installbreakpoint
@@ -49,8 +49,8 @@
{\ifcsname\??bp:#1\endcsname
\begingroup
\getparameters[\??bp][\c!type=1,\c!nleft=3,\c!nright=3,\s!language=,\c!left=,\c!right=,\c!middle=,#3]%
- \ctxlua{breakpoints.setreplacement(\csname\??bp:#1\endcsname, "#2", "\@@bplanguage", {
- kind = \@@bptype,
+ \ctxlua{typesetters.breakpoints.setreplacement(\csname\??bp:#1\endcsname, "#2", "\reallanguagetag\@@bplanguage", {
+ type = \@@bptype,
nleft = "\@@bpnleft",
nright = "\@@bpnright",
right = "\@@bpright",
@@ -60,10 +60,8 @@
\endgroup
\fi}
-\def\setbreakpoints
- {\ctxlua{breakpoints.enable()}%
- \gdef\setbreakpoints[##1]{\attribute\breakpointattribute\csname\??bp:##1\endcsname\relax}%
- \setbreakpoints}
+\unexpanded\def\setbreakpoints[#1]%
+ {\ctxlua{typesetters.breakpoints.set(\number\csname\??bp:#1\endcsname)}}
\letvalue{\??bp:\s!reset}\attributeunsetvalue
diff --git a/Master/texmf-dist/tex/context/base/typo-cap.lua b/Master/texmf-dist/tex/context/base/typo-cap.lua
index 5f741da7c1d..2e20a95e7e4 100644
--- a/Master/texmf-dist/tex/context/base/typo-cap.lua
+++ b/Master/texmf-dist/tex/context/base/typo-cap.lua
@@ -8,36 +8,73 @@ if not modules then modules = { } end modules ['typo-cap'] = {
local next, type = next, type
local format, insert = string.format, table.insert
+local div = math.div
-local trace_casing = false trackers.register("nodes.casing", function(v) trace_casing = v end)
+local trace_casing = false trackers.register("typesetters.casing", function(v) trace_casing = v end)
-local has_attribute = node.has_attribute
-local unset_attribute = node.unset_attribute
-local set_attribute = node.set_attribute
-local traverse_id = node.traverse_id
+local report_casing = logs.reporter("typesetting","casing")
-local glyph = node.id("glyph")
-local kern = node.id("kern")
+local nodes, node = nodes, node
-local fontdata = fonts.ids
-local fontchar = fonts.chr
-local chardata = characters.data
+local has_attribute = node.has_attribute
+local unset_attribute = node.unset_attribute
+local set_attribute = node.set_attribute
+local traverse_id = node.traverse_id
+local copy_node = node.copy
-cases = cases or { }
-cases.actions = { }
-cases.attribute = attributes.private("case")
+local texattribute = tex.attribute
-local actions = cases.actions
-local lastfont = nil
+local nodecodes = nodes.nodecodes
+local skipcodes = nodes.skipcodes
+local kerncodes = nodes.kerncodes
--- we use char0 as placeholder for the larger font
+local glyph_code = nodecodes.glyph
+local kern_code = nodecodes.kern
-local function helper(start, code, codes, special, attribute, once)
+local kerning_code = kerncodes.kerning
+local userskip_code = skipcodes.userskip
+
+local tasks = nodes.tasks
+
+local fonthashes = fonts.hashes
+local fontdata = fonthashes.identifiers
+local fontchar = fonthashes.characters
+
+local chardata = characters.data
+
+typesetters = typesetters or { }
+local typesetters = typesetters
+
+typesetters.cases = typesetters.cases or { }
+local cases = typesetters.cases
+
+cases.actions = { }
+local actions = cases.actions
+cases.attribute = c_cases -- no longer needed
+local a_cases = attributes.private("case")
+
+local lastfont = nil
+
+-- we use char(0) as placeholder for the larger font, so we need to remove it
+-- before it can do further harm
+--
+-- we could do the whole glyph run here (till no more attributes match) but
+-- then we end up with more code .. maybe i will clean this up anyway as the
+-- lastfont hack is somewhat ugly .. on the other hand, we need to deal with
+-- cases like:
+--
+-- \WORD {far too \Word{many \WORD{more \word{pushed} in between} useless} words}
+
+local uccodes = characters.uccodes
+local lccodes = characters.lccodes
+
+local function helper(start, codes, special, attribute, once)
local char = start.char
- local dc = chardata[char]
+ local dc = codes[char]
if dc then
local fnt = start.font
if special then
+ -- will become function
if start.char == 0 then
lastfont = fnt
local prev, next = start.prev, start.next
@@ -45,24 +82,24 @@ local function helper(start, code, codes, special, attribute, once)
if next then
next.prev = prev
end
+--~ node.free(start)
return prev, true
- elseif lastfont and start.prev.id ~= glyph then
+ elseif lastfont and start.prev.id ~= glyph_code then
fnt = lastfont
start.font = lastfont
end
end
- -- local ifc = fontdata[fnt].characters
local ifc = fontchar[fnt]
- local ucs = dc[codes]
- if ucs then
+ if type(dc) == "table" then
local ok = true
- for i=1,#ucs do
- ok = ok and ifc[ucs[i]]
+ for i=1,#dc do
+ ok = ok and ifc[dc[i]]
end
if ok then
+ -- tood; use generic injector
local prev, original = start, start
- for i=1,#ucs do
- local chr = ucs[i]
+ for i=1,#dc do
+ local chr = dc[i]
prev = start
if i == 1 then
start.char = chr
@@ -84,10 +121,8 @@ local function helper(start, code, codes, special, attribute, once)
end
if once then lastfont = nil end
return start, false
- end
- local uc = dc[code]
- if uc and ifc[uc] then
- start.char = uc
+ elseif ifc[dc] then
+ start.char = dc
if once then lastfont = nil end
return start, true
end
@@ -98,28 +133,32 @@ end
actions[1] = function(start,attribute)
lastfont = nil
- return helper(start,'uccode','uccodes')
+ return helper(start,uccodes)
end
actions[2] = function(start,attribute)
lastfont = nil
- return helper(start,'lccode','lccodes')
+ return helper(start,lccodes)
end
-actions[3] = function(start,attribute)
+actions[3] = function(start,attribute,attr)
lastfont = nil
local prev = start.prev
- if prev and prev.id == kern and prev.subtype == 0 then
+ if prev and prev.id == kern_code and prev.subtype == kerning_code then
prev = prev.prev
end
- if not prev or prev.id ~= glyph then
+ if not prev or prev.id ~= glyph_code then
--- only the first character is treated
- for n in traverse_id(glyph,start.next) do
- if has_attribute(n,attribute) then
+ for n in traverse_id(glyph_code,start.next) do
+ if has_attribute(n,attribute) == attr then
unset_attribute(n,attribute)
+ else
+ -- break -- we can have nested mess
end
end
- return helper(start,'uccode','uccodes')
+ -- we could return the last in the range and save some scanning
+ -- but why bother
+ return helper(start,uccodes)
else
return start, false
end
@@ -128,22 +167,22 @@ end
actions[4] = function(start,attribute)
lastfont = nil
local prev = start.prev
- if prev and prev.id == kern and prev.subtype == 0 then
+ if prev and prev.id == kern_code and prev.subtype == kerning_code then
prev = prev.prev
end
- if not prev or prev.id ~= glyph then
- return helper(start,'uccode','uccodes')
+ if not prev or prev.id ~= glyph_code then
+ return helper(start,uccodes)
else
return start, false
end
end
actions[5] = function(start,attribute) -- 3
- return helper(start,'uccode','uccodes',true,attribute,true)
+ return helper(start,uccodes,true,attribute,true)
end
actions[6] = function(start,attribute) -- 4
- return helper(start,'uccode','uccodes',true,attribute,false)
+ return helper(start,uccodes,true,attribute,false)
end
actions[8] = function(start)
@@ -152,59 +191,89 @@ actions[8] = function(start)
local mr = math.random
-- local tfm = fontdata[start.font].characters
local tfm = fontchar[start.font]
- if chardata[ch].lccode then
+ if lccodes[ch] then
while true do
local d = chardata[mr(1,0xFFFF)]
if d then
- local uc = d.uccode
- if uc and tfm[uc] then
+ local uc = uccodes[d]
+ if uc and tfm[uc] then -- this also intercepts tables
start.char = uc
return start, true
end
end
end
- elseif chardata[ch].uccode then
+ elseif uccodes[ch] then
while true do
local d = chardata[mr(1,0xFFFF)]
if d then
- local lc = d.lccode
- if lc and tfm[lc] then
+ local lc = lccodes[d]
+ if lc and tfm[lc] then -- this also intercepts tables
start.char = lc
return start, true
end
end
end
- else
- return start, false
end
+ return start, false
end
-- node.traverse_id_attr
-function cases.process(namespace,attribute,head) -- not real fast but also not used on much data
+local function process(namespace,attribute,head) -- not real fast but also not used on much data
lastfont = nil
+ local lastattr = nil
local done = false
- for start in traverse_id(glyph,head) do
- local attr = has_attribute(start,attribute)
- if attr and attr > 0 then
- unset_attribute(start,attribute)
- local action = actions[attr]
- if action then
- local _, ok = action(start,attribute)
- done = done and ok
+ local start = head
+ while start do -- while because start can jump ahead
+ local id = start.id
+ if id == glyph_code then
+ local attr = has_attribute(start,attribute)
+ if attr and attr > 0 then
+ if attr ~= lastattr then
+ lastfont = nil
+ lastattr = attr
+ end
+ unset_attribute(start,attribute)
+ local action = actions[attr%100] -- map back to low number
+ if action then
+ start, ok = action(start,attribute,attr)
+ done = done and ok
+ if trace_casing then
+ report_casing("case trigger %s, instance %s, result %s",attr%100,div(attr,100),tostring(ok))
+ end
+ elseif trace_casing then
+ report_casing("unknown case trigger %s",attr)
+ end
end
end
+ if start then
+ start = start.next
+ end
end
lastfont = nil
return head, done
end
-chars.handle_casing = nodes.install_attribute_handler {
- name = "case",
- namespace = cases,
- processor = cases.process,
-}
+local m, enabled = 0, false -- a trick to make neighbouring ranges work
-function cases.enable()
- tasks.enableaction("processors","chars.handle_casing")
+function cases.set(n)
+ if not enabled then
+ tasks.enableaction("processors","typesetters.cases.handler")
+ if trace_casing then
+ report_casing("enabling case handler")
+ end
+ enabled = true
+ end
+ if m == 100 then
+ m = 1
+ else
+ m = m + 1
+ end
+ texattribute[a_cases] = m * 100 + n
end
+
+cases.handler = nodes.installattributehandler {
+ name = "case",
+ namespace = cases,
+ processor = process,
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-cap.mkiv b/Master/texmf-dist/tex/context/base/typo-cap.mkiv
index af4e12bc28a..1b3e0df26e9 100644
--- a/Master/texmf-dist/tex/context/base/typo-cap.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-cap.mkiv
@@ -2,7 +2,7 @@
%D [ file=typo-cap,
%D version=2009.03.27, % code moved from core-spa.mkiv
%D title=\CONTEXT\ Typesetting Macros,
-%D subtitle=Mirroring,
+%D subtitle=Capping,
%D author=Hans Hagen,
%D date=\currentdate,
%D copyright=\PRAGMA]
@@ -17,7 +17,7 @@
\registerctxluafile{typo-cap}{1.001}
-\definesystemattribute[case] \chardef\caseattribute \dogetattributeid{case}
+\definesystemattribute[case][public]
%D \macros
%D {Word, Words, WORD, WORDS}
@@ -51,10 +51,8 @@
% test \word{test TEST \TeX} test
% test \Word{test TEST \TeX} test
-\unexpanded\def\setcharactercasing
- {\ctxlua{cases.enable()}%
- \gdef\setcharactercasing[##1]{\attribute\caseattribute##1\relax}%
- \setcharactercasing}
+\unexpanded\def\setcharactercasing[#1]%
+ {\ctxlua{typesetters.cases.set(\number#1)}}
% todo: names casings
@@ -133,9 +131,9 @@
% we use char0 as placeholder for the larger font
-\unexpanded\def\pseudosmallcapped{\groupedcommand{\setcharactercasing[\plusone ]\char\zerocount\tx}{}} % all upper
-\unexpanded\def\pseudoSmallcapped{\groupedcommand{\setcharactercasing[\plusfive]\char\zerocount\tx}{}} % one upper + font
-\unexpanded\def\pseudoSmallCapped{\groupedcommand{\setcharactercasing[\plussix ]\char\zerocount\tx}{}} % some upper + font
+\unexpanded\def\pseudosmallcapped{\groupedcommand{\setcharactercasing[\plusone ]\signalcharacter\tx}{}} % all upper
+\unexpanded\def\pseudoSmallcapped{\groupedcommand{\setcharactercasing[\plusfive]\signalcharacter\tx}{}} % one upper + font
+\unexpanded\def\pseudoSmallCapped{\groupedcommand{\setcharactercasing[\plussix ]\signalcharacter\tx}{}} % some upper + font
\unexpanded\def\realsmallcapped {\groupedcommand{\sc\setcharactercasing[\plusone ]}{}} % all lower
\unexpanded\def\realSmallcapped {\groupedcommand{\sc\setcharactercasing[\plusthree]}{}} % one upper + font
@@ -168,7 +166,7 @@
%D As suggested by WS:
-\unexpanded\def\notsmallcapped{\groupedcommand{\setcharactercasing[\plustwo]\char\zerocount}{}}
+\unexpanded\def\notsmallcapped{\groupedcommand{\setcharactercasing[\plustwo]\signalcharacter}{}}
%D \macros
%D {setupcapitals}
diff --git a/Master/texmf-dist/tex/context/base/typo-cln.lua b/Master/texmf-dist/tex/context/base/typo-cln.lua
new file mode 100644
index 00000000000..a8542c1a130
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-cln.lua
@@ -0,0 +1,91 @@
+if not modules then modules = { } end modules ['typo-cap'] = {
+ version = 1.001,
+ comment = "companion to typo-cap.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- This quick and dirty hack took less time than listening to a CD (In
+-- this case Dream Theaters' Octavium. Of course extensions will take
+-- more time.
+
+local utfbyte = utf.byte
+
+local trace_cleaners = false trackers.register("typesetters.cleaners", function(v) trace_cleaners = v end)
+local trace_autocase = false trackers.register("typesetters.cleaners.autocase",function(v) trace_autocase = v end)
+
+local report_cleaners = logs.reporters("nodes","cleaners")
+local report_autocase = logs.reporters("nodes","autocase")
+
+typesetters.cleaners = typesetters.cleaners or { }
+local cleaners = typesetters.cleaners
+
+local nodecodes = nodes.nodecodes
+local tasks = nodes.tasks
+
+local texattribute = tex.attribute
+
+local has_attribute = node.has_attribute
+local traverse_id = node.traverse_id
+
+local glyph_code = nodecodes.glyph
+local uccodes = characters.uccodes
+
+local a_cleaner = attributes.private("cleaner")
+
+local resetter = { -- this will become an entry in char-def
+ [utfbyte(".")] = true
+}
+
+-- Contrary to the casing code we need to keep track of a state.
+-- We could extend the casing code with a status tracker but on
+-- the other hand we might want to apply casing afterwards. So,
+-- cleaning comes first.
+
+local function process(namespace,attribute,head)
+ local inline, done = false, false
+ for n in traverse_id(glyph_code,head) do
+ local char = n.char
+ if resetter[char] then
+ inline = false
+ elseif not inline then
+ local a = has_attribute(n,attribute)
+ if a == 1 then -- currently only one cleaner so no need to be fancy
+ local upper = uccodes[char]
+ if type(upper) == "table" then
+ -- some day, not much change that \SS ends up here
+ else
+ n.char = upper
+ done = true
+ if trace_autocase then
+ report_autocase("")
+ end
+ end
+ end
+ inline = true
+ end
+ end
+ return head, done
+end
+
+-- see typo-cap for a more advanced settings handler .. now needed now
+
+local enabled = false
+
+function cleaners.set(n)
+ if not enabled then
+ tasks.enableaction("processors","typesetters.cleaners.handler")
+ if trace_cleaners then
+ report_cleaners("enabling cleaners")
+ end
+ enabled = true
+ end
+ texattribute[a_cleaner] = n
+end
+
+cleaners.handler = nodes.installattributehandler {
+ name = "cleaner",
+ namespace = cleaners,
+ processor = process,
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-cln.mkiv b/Master/texmf-dist/tex/context/base/typo-cln.mkiv
new file mode 100644
index 00000000000..d247b20d2b6
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-cln.mkiv
@@ -0,0 +1,30 @@
+%D \module
+%D [ file=typo-cln,
+%D version=2011.02.11,
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Cleaning,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%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 / Cleaning}
+
+\unprotect
+
+\registerctxluafile{typo-cln}{1.001}
+
+\definesystemattribute[cleaner][public]
+
+%D Currently there is no interface.
+%D
+%D 1: Autocap first character of a line
+%D 2: Maybe dropped caps.
+
+\unexpanded\def\setcharactercleaning[#1]% This name might change!
+ {\ctxlua{typesetters.cleaners.set(\number#1)}}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/typo-dig.lua b/Master/texmf-dist/tex/context/base/typo-dig.lua
index c1b44e39f74..1e4a02fc6b9 100644
--- a/Master/texmf-dist/tex/context/base/typo-dig.lua
+++ b/Master/texmf-dist/tex/context/base/typo-dig.lua
@@ -6,48 +6,69 @@ if not modules then modules = { } end modules ['typo-dig'] = {
license = "see context related readme files"
}
+-- we might consider doing this after the otf pass because now osf do not work
+-- out well in node mode.
+
local next, type = next, type
local format, insert = string.format, table.insert
-local round = math.round
+local round, div = math.round, math.div
+
+local trace_digits = false trackers.register("typesetters.digits", function(v) trace_digits = v end)
+
+local report_digits = logs.reporter("typesetting","digits")
+
+local nodes, node = nodes, node
+
+local has_attribute = node.has_attribute
+local unset_attribute = node.unset_attribute
+local set_attribute = node.set_attribute
+local hpack_node = node.hpack
+local traverse_id = node.traverse_id
+local insert_before = node.insert_before
+local insert_after = node.insert_after
-local trace_digits = false trackers.register("nodes.digits", function(v) trace_digits = v end)
+local texattribute = tex.attribute
-local has_attribute = node.has_attribute
-local unset_attribute = node.unset_attribute
-local set_attribute = node.set_attribute
-local hpack_node = node.hpack
-local traverse_id = node.traverse_id
-local insert_before = node.insert_before
-local insert_after = node.insert_after
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
-local glyph = node.id("glyph")
-local kern = node.id("kern")
+local nodepool = nodes.pool
+local tasks = nodes.tasks
-local new_glue = nodes.glue
+local new_glue = nodepool.glue
-local fontdata = fonts.identifiers
-local chardata = fonts.characters
-local quaddata = fonts.quads
-local charbase = characters.data
+local fonthashes = fonts.hashes
+local fontdata = fonthashes.identifiers
+local chardata = fonthashes.characters
+local quaddata = fonthashes.quads
-digits = digits or { }
-digits.actions = { }
-digits.attribute = attributes.private("digits")
+local charbase = characters.data
+local getdigitwidth = fonts.helpers.getdigitwidth
-local actions = digits.actions
+typesetters = typesetters or { }
+local typesetters = typesetters
+
+typesetters.digits = typesetters.digits or { }
+local digits = typesetters.digits
+
+digits.actions = { }
+local actions = digits.actions
+
+local a_digits = attributes.private("digits")
+digits.attribute = a_digits
-- at some point we can manipulate the glyph node so then i need
--- to rewrite this
+-- to rewrite this then
-function nodes.aligned(start,stop,width,how)
- local prv, nxt, head = start.prev, stop.next, nil
- start.prev, stop.next = nil, nil
+function nodes.aligned(head,start,stop,width,how)
if how == "flushright" or how == "middle" then
- head, start = insert_before(start,start,new_glue(0,65536,65536))
+ head, start = insert_before(head,start,new_glue(0,65536,65536))
end
if how == "flushleft" or how == "middle" then
- head, stop = insert_after(start,stop,new_glue(0,65536,65536))
+ head, stop = insert_after(head,stop,new_glue(0,65536,65536))
end
+ local prv, nxt = start.prev, stop.next
+ start.prev, stop.next = nil, nil
local packed = hpack_node(start,width,"exactly") -- no directional mess here, just lr
if prv then
prv.next, packed.prev = packed, prv
@@ -55,38 +76,45 @@ function nodes.aligned(start,stop,width,how)
if nxt then
nxt.prev, packed.next = packed, nxt
end
- return packed, prv, nxt
+ if packed.prev then
+ return head, packed
+ else
+ return packed, packed
+ end
end
-actions[1] = function(start,attribute)
+actions[1] = function(head,start,attribute,attr)
+ local font = start.font
local char = start.char
- if charbase[char].category == "nd" then
- local font = start.font
- local oldwidth, newwidth = start.width, fonts.get_digit_width(font)
+ local unic = chardata[font][char].tounicode
+ local what = unic and tonumber(unic,16) or char
+ if charbase[what].category == "nd" then
+ local oldwidth, newwidth = start.width, getdigitwidth(font)
if newwidth ~= oldwidth then
- local start = nodes.aligned(start,start,newwidth,"middle") -- return three node pointers
- return start, true
+ if trace_digits then
+ report_digits("digit trigger %s, instance %s, char 0x%05X, unicode 0x%05X, delta %s",
+ attr%100,div(attr,100),char,what,newwidth-oldwidth)
+ end
+ head, start = nodes.aligned(head,start,start,newwidth,"middle")
+ return head, start, true
end
end
- return start, false
+ return head, start, false
end
-function digits.process(namespace,attribute,head)
+local function process(namespace,attribute,head)
local done, current, ok = false, head, false
while current do
- if current.id == glyph then
+ if current.id == glyph_code then
local attr = has_attribute(current,attribute)
if attr and attr > 0 then
unset_attribute(current,attribute)
- local action = actions[attr]
+ local action = actions[attr%100] -- map back to low number
if action then
- if current == head then
- head, ok = action(current,attribute)
- current = head
- else
- current, ok = action(current,attribute)
- end
+ head, current, ok = action(head,current,attribute,attr)
done = done and ok
+ elseif trace_digits then
+ report_digits("unknown digit trigger %s",attr)
end
end
end
@@ -95,12 +123,26 @@ function digits.process(namespace,attribute,head)
return head, done
end
-chars.handle_digits = nodes.install_attribute_handler {
- name = "digits",
- namespace = digits,
- processor = digits.process,
-}
+local m, enabled = 0, false -- a trick to make neighbouring ranges work
-function digits.enable()
- tasks.enableaction("processors","chars.handle_digits")
+function digits.set(n)
+ if not enabled then
+ tasks.enableaction("processors","typesetters.digits.handler")
+ if trace_digits then
+ report_digits("enabling digit handler")
+ end
+ enabled = true
+ end
+ if m == 100 then
+ m = 1
+ else
+ m = m + 1
+ end
+ texattribute[a_digits] = m * 100 + n
end
+
+digits.handler = nodes.installattributehandler {
+ name = "digits",
+ namespace = digits,
+ processor = process,
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-dig.mkiv b/Master/texmf-dist/tex/context/base/typo-dig.mkiv
index d8f73141817..6e0299291aa 100644
--- a/Master/texmf-dist/tex/context/base/typo-dig.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-dig.mkiv
@@ -17,35 +17,42 @@
\registerctxluafile{typo-dig}{1.001}
-\definesystemattribute[digits] \chardef\digitsattribute \dogetattributeid{digits}
+\definesystemattribute[digits][public]
%D This could as well be a dynamic font feature but why bother.
%D
%D \macros
%D {\equaldigits}
%D
-%D \starttyping
+%D \startbuffer
%D test test \ruledhbox{123} test test\par
%D test test \ruledhbox{\equaldigits{123}} test test\par
%D test test \equaldigits{123} test test\par
-%D \stoptyping
+%D \stopbuffer
%D
%D \typebuffer
%D
%D This calls result in:
%D
-%D \startvoorbeeld
%D \startlines
%D \getbuffer
%D \stoplines
-%D \stopvoorbeeld
-\unexpanded\def\setdigitsmanipulation
- {\ctxlua{digits.enable()}%
- \gdef\setdigitsmanipulation[##1]{\attribute\digitsattribute##1\relax}%
- \setdigitsmanipulation}
+\unexpanded\def\setdigitsmanipulation[#1]%
+ {\ctxlua{typesetters.digits.set(\number#1)}}
+
+\unexpanded\def\resetdigitsmanipulation
+ {\attribute\digitsattribute\attributeunsetvalue}
+
+\appendtoks
+ \resetdigitsmanipulation
+\to \everyresettypesetting
\unexpanded\def\equaldigits{\groupedcommand{\setdigitsmanipulation[\plusone]}{}}
\unexpanded\def\dummydigit {\hphantom{\setdigitsmanipulation[\plusone]0}}
+\appendtoks
+ \resetcharacterspacing
+\to \everyinitializeverbatim
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/typo-mir.lua b/Master/texmf-dist/tex/context/base/typo-dir.lua
index 6c119c2f289..54c2e6e9882 100644
--- a/Master/texmf-dist/tex/context/base/typo-mir.lua
+++ b/Master/texmf-dist/tex/context/base/typo-dir.lua
@@ -1,6 +1,6 @@
-if not modules then modules = { } end modules ['typo-mir'] = {
+if not modules then modules = { } end modules ['typo-dir'] = {
version = 1.001,
- comment = "companion to typo-mir.mkiv",
+ comment = "companion to typo-dir.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
@@ -14,7 +14,11 @@ local utfchar = utf.char
-- vertical space handler
-local trace_mirroring = false trackers.register("nodes.mirroring", function(v) trace_mirroring = v end)
+local nodes, node = nodes, node
+
+local trace_directions = false trackers.register("typesetters.directions", function(v) trace_directions = v end)
+
+local report_directions = logs.reporter("typesetting","directions")
local has_attribute = node.has_attribute
local unset_attribute = node.unset_attribute
@@ -24,13 +28,35 @@ local insert_node_before = node.insert_before
local insert_node_after = node.insert_after
local remove_node = nodes.remove
-local glyph = node.id("glyph")
-local whatsit = node.id("whatsit")
-local mthnode = node.id('math')
+local texattribute = tex.attribute
+local unsetvalue = attributes.unsetvalue
+
+local nodecodes = nodes.nodecodes
+local whatcodes = nodes.whatcodes
+local mathcodes = nodes.mathcodes
+
+local tasks = nodes.tasks
+
+local glyph_code = nodecodes.glyph
+local whatsit_code = nodecodes.whatsit
+local math_code = nodecodes.math
+
+local localpar_code = whatcodes.localpar
+local dir_code = whatcodes.dir
+
+local nodepool = nodes.pool
+
+local new_textdir = nodepool.textdir
+
+local beginmath_code = mathcodes.beginmath
+local endmath_code = mathcodes.endmath
-local fontdata = fonts.ids
-local fontchar = fonts.chr
-local chardata = characters.data
+local fonthashes = fonts.hashes
+local fontdata = fonthashes.identifiers
+local chardata = fonthashes.characters
+
+local chardata = characters.data
+local chardirs = characters.directions -- maybe make a special mirror table
--~ Analysis by Idris:
--~
@@ -57,42 +83,40 @@ local chardata = characters.data
-- elseif d == "ws" then -- Whitespace
-- elseif d == "on" then -- Other Neutrals
-mirroring = mirroring or { }
-mirroring.strip = false
-mirroring.attribute = attributes.private("mirroring")
+typesetters.directions = typesetters.directions or { }
+local directions = typesetters.directions
-local state = attributes.private('state')
-local mirrora = attributes.private('mirroring')
+local a_state = attributes.private('state')
+local a_directions = attributes.private('directions')
-local directions = characters.directions -- maybe make a special mirror table
+local skipmath = true
+local strip = false
-- todo: delayed inserts here
-- todo: get rid of local functions here
-- beware, math adds whatsits afterwards so that will mess things up
-local skipmath = true
-
local finish, autodir, embedded, override, done = nil, 0, 0, 0, false
local list, glyphs = nil, false
local finished, finidir, finipos = nil, nil, 1
local head, current, inserted = nil, nil, nil
local function finish_auto_before()
- head, inserted = insert_node_before(head,current,nodes.textdir("-"..finish))
+ head, inserted = insert_node_before(head,current,new_textdir("-"..finish))
finished, finidir = inserted, finish
- if trace_mirroring then
- insert(list,#list,format("finish %s",finish))
+ if trace_directions then
+ insert(list,#list,format("auto finish inserted before: %s",finish))
finipos = #list-1
end
finish, autodir, done = nil, 0, true
end
local function finish_auto_after()
- head, current = insert_node_after(head,current,nodes.textdir("-"..finish))
+ head, current = insert_node_after(head,current,new_textdir("-"..finish))
finished, finidir = current, finish
- if trace_mirroring then
- list[#list+1] = format("finish %s",finish)
+ if trace_directions then
+ list[#list+1] = format("auto finish inserted after: %s",finish)
finipos = #list
end
finish, autodir, done = nil, 0, true
@@ -108,15 +132,15 @@ local function force_auto_left_before()
finish, autodir, done = "TRT", -1, true
end
if finidir == finish then
- remove_node(head,finished,true)
- if trace_mirroring then
- list[finipos] = list[finipos].." (deleted)"
- insert(list,#list,format("start %s (deleted)",finish))
+ head = remove_node(head,finished,true)
+ if trace_directions then
+ list[finipos] = list[finipos] .. " (deleted afterwards)"
+ insert(list,#list,format("start text dir %s (embedded: %s)",finish,embedded))
end
else
- head, inserted = insert_node_before(head,current,nodes.textdir("+"..finish))
- if trace_mirroring then
- insert(list,#list,format("start %s",finish))
+ head, inserted = insert_node_before(head,current,new_textdir("+"..finish))
+ if trace_directions then
+ insert(list,#list,format("start text dir %s (embedded: %s)",finish,embedded))
end
end
end
@@ -131,38 +155,39 @@ local function force_auto_right_before()
finish, autodir, done = "TLT", 1, true
end
if finidir == finish then
- remove_node(head,finished,true)
- if trace_mirroring then
- list[finipos] = list[finipos].." (deleted)"
- insert(list,#list,format("start %s (deleted)",finish))
+ head = remove_node(head,finished,true)
+ if trace_directions then
+ list[finipos] = list[finipos] .. " (deleted afterwards)"
+ insert(list,#list,format("start text dir %s (embedded: %s)",finish,embedded))
end
else
- head, inserted = insert_node_before(head,current,nodes.textdir("+"..finish))
- if trace_mirroring then
- insert(list,#list,format("start %s",finish))
+ head, inserted = insert_node_before(head,current,new_textdir("+"..finish))
+ if trace_directions then
+ insert(list,#list,format("start text dir %s (embedded: %s)",finish,embedded))
end
end
end
-function mirroring.process(namespace,attribute,start) -- todo: make faster
+-- todo: use new dir functions
+
+function directions.process(namespace,attribute,start) -- todo: make faster
if not start.next then
return start, false
end
head, current, inserted = start, start, nil
finish, autodir, embedded, override, done = nil, 0, 0, 0, false
- list, glyphs = trace_mirroring and { }, false
+ list, glyphs = trace_directions and { }, false
finished, finidir, finipos = nil, nil, 1
local stack, top, obsolete = { }, 0, { }
local lro, rlo, prevattr, inmath = false, false, 0, false
while current do
local id = current.id
--~ print(id,attribute,has_attribute(current,attribute))
- if skipmath and id == mthnode then
+ if skipmath and id == math_code then
local subtype = current.subtype
- if subtype == 0 then
- -- begin math
+ if subtype == beginmath_code then
inmath = true
- elseif subtype == 1 then
+ elseif subtype == endmath_code then
inmath = false
else
-- todo
@@ -179,17 +204,17 @@ function mirroring.process(namespace,attribute,start) -- todo: make faster
elseif attr ~= prevattr then
-- no pop, grouped driven (2=normal,3=lro,4=rlo)
if attr == 3 then
- if trace_mirroring then
+ if trace_directions then
list[#list+1] = format("override right -> left (lro) (bidi=%s)",attr)
end
lro, rlo = true, false
elseif attr == 4 then
- if trace_mirroring then
+ if trace_directions then
list[#list+1] = format("override left -> right (rlo) (bidi=%s)",attr)
end
lro, rlo = false, true
else
- if trace_mirroring and
+ if trace_directions and
current ~= head then list[#list+1] = format("override reset (bidi=%s)",attr)
end
lro, rlo = false, false
@@ -197,18 +222,18 @@ function mirroring.process(namespace,attribute,start) -- todo: make faster
prevattr = attr
end
end
- if id == glyph then
+ if id == glyph_code then
glyphs = true
if attr and attr > 0 then
local char = current.char
- local d = directions[char]
+ local d = chardirs[char]
if rlo or override > 0 then
if d == "l" then
- if trace_mirroring then
+ if trace_directions then
list[#list+1] = format("char %s (%s / U+%04X) of class %s overidden to r (bidi=%s)",utfchar(char),char,char,d,attr)
end
d = "r"
- elseif trace_mirroring then
+ elseif trace_directions then
if d == "lro" or d == "rlo" or d == "pdf" then -- else side effects on terminal
list[#list+1] = format("override char of class %s (bidi=%s)",d,attr)
else -- todo: rle lre
@@ -217,19 +242,19 @@ function mirroring.process(namespace,attribute,start) -- todo: make faster
end
elseif lro or override < 0 then
if d == "r" or d == "al" then
- set_attribute(current,state,4) -- maybe better have a special bidi attr value -> override (9) -> todo
- if trace_mirroring then
+ set_attribute(current,a_state,4) -- maybe better have a special bidi attr value -> override (9) -> todo
+ if trace_directions then
list[#list+1] = format("char %s (%s / U+%04X) of class %s overidden to l (bidi=%s) (state=isol)",utfchar(char),char,char,d,attr)
end
d = "l"
- elseif trace_mirroring then
+ elseif trace_directions then
if d == "lro" or d == "rlo" or d == "pdf" then -- else side effects on terminal
list[#list+1] = format("override char of class %s (bidi=%s)",d,attr)
else -- todo: rle lre
list[#list+1] = format("char %s (%s / U+%04X) of class %s (bidi=%s)",utfchar(char),char,char,d,attr)
end
end
- elseif trace_mirroring then
+ elseif trace_directions then
if d == "lro" or d == "rlo" or d == "pdf" then -- else side effects on terminal
list[#list+1] = format("override char of class %s (bidi=%s)",d,attr)
else -- todo: rle lre
@@ -265,7 +290,7 @@ function mirroring.process(namespace,attribute,start) -- todo: make faster
force_auto_left_before()
end
elseif d == "lro" then -- Left-to-Right Override -> right becomes left
- if trace_mirroring then
+ if trace_directions then
list[#list+1] = "override right -> left"
end
top = top + 1
@@ -273,7 +298,7 @@ function mirroring.process(namespace,attribute,start) -- todo: make faster
override = -1
obsolete[#obsolete+1] = current
elseif d == "rlo" then -- Right-to-Left Override -> left becomes right
- if trace_mirroring then
+ if trace_directions then
list[#list+1] = "override left -> right"
end
top = top + 1
@@ -281,7 +306,7 @@ function mirroring.process(namespace,attribute,start) -- todo: make faster
override = 1
obsolete[#obsolete+1] = current
elseif d == "lre" then -- Left-to-Right Embedding -> TLT
- if trace_mirroring then
+ if trace_directions then
list[#list+1] = "embedding left -> right"
end
top = top + 1
@@ -289,12 +314,12 @@ function mirroring.process(namespace,attribute,start) -- todo: make faster
embedded = 1
obsolete[#obsolete+1] = current
elseif d == "rle" then -- Right-to-Left Embedding -> TRT
- if trace_mirroring then
+ if trace_directions then
list[#list+1] = "embedding right -> left"
end
top = top + 1
stack[top] = { override, embedded }
- embedded = 1
+ embedded = -1 -- was 1
obsolete[#obsolete+1] = current
elseif d == "pdf" then -- Pop Directional Format
-- override = 0
@@ -302,27 +327,27 @@ function mirroring.process(namespace,attribute,start) -- todo: make faster
local s = stack[top]
override, embedded = s[1], s[2]
top = top - 1
- if trace_mirroring then
+ if trace_directions then
list[#list+1] = format("state: override: %s, embedded: %s, autodir: %s",override,embedded,autodir)
end
else
- if trace_mirroring then
+ if trace_directions then
list[#list+1] = "pop (error, too many pops)"
end
end
obsolete[#obsolete+1] = current
end
- elseif trace_mirroring then
+ elseif trace_directions then
local char = current.char
- local d = directions[char]
+ local d = chardirs[char]
list[#list+1] = format("char %s (%s / U+%04X) of class %s (no bidi)",utfchar(char),char,char,d or "?")
end
- elseif id == whatsit then
+ elseif id == whatsit_code then
if finish then
finish_auto_before()
end
local subtype = current.subtype
- if subtype == 6 then
+ if subtype == localpar_code then
local dir = current.dir
local d = sub(dir,2,2)
if d == 'R' then -- find(dir,".R.") / dir == "TRT"
@@ -330,11 +355,11 @@ function mirroring.process(namespace,attribute,start) -- todo: make faster
else
autodir = 1
end
- embeddded = autodir
- if trace_mirroring then
+ -- embedded = autodir
+ if trace_directions then
list[#list+1] = format("pardir %s",dir)
end
- elseif subtype == 7 then
+ elseif subtype == dir_code then
local dir = current.dir
-- local sign = sub(dir,1,1)
-- local dire = sub(dir,3,3)
@@ -352,13 +377,13 @@ function mirroring.process(namespace,attribute,start) -- todo: make faster
finish, autodir = nil, 0
end
end
- if trace_mirroring then
+ if trace_directions then
list[#list+1] = format("textdir %s",dir)
end
end
else
- if trace_mirroring then
- list[#list+1] = format("node %s (subtype %s)",node.type(id),current.subtype)
+ if trace_directions then
+ list[#list+1] = format("node %s (subtype %s)",nodecodes[id],current.subtype)
end
if finish then
finish_auto_before()
@@ -373,20 +398,20 @@ function mirroring.process(namespace,attribute,start) -- todo: make faster
current = cn
end
end
- if trace_mirroring and glyphs then
- logs.report("bidi","start log")
+ if trace_directions and glyphs then
+ report_directions("start log")
for i=1,#list do
- logs.report("bidi","%02i: %s",i,list[i])
+ report_directions("%02i: %s",i,list[i])
end
- logs.report("bidi","stop log")
+ report_directions("stop log")
end
- if done and mirroring.strip then
+ if done and strip then
local n = #obsolete
if n > 0 then
for i=1,n do
remove_node(head,obsolete[i],true)
end
- logs.report("bidi","%s character nodes removed",n)
+ report_directions("%s character nodes removed",n)
end
end
return head, done
@@ -395,10 +420,10 @@ end
--~ local function is_right(n) -- keep !
--~ if n then
--~ local id = n.id
---~ if id == glyph then
+--~ if id == glyph_code then
--~ local attr = has_attribute(n,attribute)
--~ if attr and attr > 0 then
---~ local d = directions[n.char]
+--~ local d = chardirs[n.char]
--~ if d == "r" or d == "al" then -- override
--~ return true
--~ end
@@ -408,12 +433,23 @@ end
--~ return false
--~ end
-chars.handle_mirroring = nodes.install_attribute_handler {
- name = "mirroring",
- namespace = mirroring,
- processor = mirroring.process,
-}
+--~ function directions.enable()
+--~ tasks.enableaction("processors","directions.handler")
+--~ end
-function mirroring.enable()
- tasks.enableaction("processors","chars.handle_mirroring")
+function directions.set(n)
+ if trace_directions then
+ report_breakpoints("enabling directions handler")
+ end
+ tasks.enableaction("processors","typesetters.directions.handler")
+ function directions.set(n)
+ texattribute[a_directions] = n == 0 and unsetvalue or n
+ end
+ directions.set(n)
end
+
+directions.handler = nodes.installattributehandler {
+ name = "directions",
+ namespace = directions,
+ processor = directions.process,
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-mir.mkiv b/Master/texmf-dist/tex/context/base/typo-dir.mkiv
index 4c85262aab2..b4e7cb67fb0 100644
--- a/Master/texmf-dist/tex/context/base/typo-mir.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-dir.mkiv
@@ -1,8 +1,8 @@
%D \module
-%D [ file=typo-mir,
+%D [ file=typo-dir,
%D version=2009.03.27, % code moved from core-spa.mkiv
%D title=\CONTEXT\ Typesetting Macros,
-%D subtitle=Mirroring,
+%D subtitle=Directions,
%D author=Hans Hagen,
%D date=\currentdate,
%D copyright=\PRAGMA]
@@ -11,23 +11,22 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\writestatus{loading}{ConTeXt Typesetting Macros / Mirroring}
+\writestatus{loading}{ConTeXt Typesetting Macros / Directions}
\unprotect
-\registerctxluafile{typo-mir}{1.001}
+\registerctxluafile{typo-dir}{1.001}
-\definesystemattribute[mirroring] \chardef\mirroringattribute \dogetattributeid{mirroring}
+\definesystemattribute[directions][public]
-% experimental mirroring
+% experimental directions
-\def\setcharactermirroring
- {\ctxlua{mirroring.enable()}%
- \gdef\setcharactermirroring[##1]{\attribute\mirroringattribute##1\relax}%
- \setcharactermirroring}
+\unexpanded\def\setdirection[#1]% todo: symbolic names
+ {\ctxlua{typesetters.directions.set(#1)}}
-\def\resetcharactermirroring
- {\attribute\mirroringattribute\attributeunsetvalue}
+\unexpanded\def\resetdirection
+ %{\ctxlua{typesetters.directions.set(0)}}
+ {\attribute\directionsattribute\attributeunsetvalue}
\newtoks\everysetupdirections
@@ -35,7 +34,7 @@
{\getparameters[\??di][#1]%
\the\everysetupdirections}
-\chardef\directionsbidimode=0
+\newconstant\directionsbidimode
\letvalue{\??di:bidi:\v!off }\zerocount
\letvalue{\??di:bidi:\v!global}\plusone
@@ -43,15 +42,15 @@
\letvalue{\??di:bidi:\v!on }\plustwo
\appendtoks
- \chardef\directionsbidimode\executeifdefined{\??di:bidi:\@@dibidi}\zerocount\relax
+ \directionsbidimode\executeifdefined{\??di:bidi:\@@dibidi}\zerocount\relax
\ifcase\directionsbidimode
- \resetcharactermirroring
+ \resetdirection
\or
- \setcharactermirroring[1]% global, chars
+ \setdirection[1]% global, chars
\or
- \setcharactermirroring[2]% local, attributes
+ \setdirection[2]% local, attributes
\or
- \setcharactermirroring[1]% default
+ \setdirection[1]% default
\fi
\to \everysetupdirections
@@ -68,10 +67,10 @@
\unexpanded\def\dirlre{\ifcase\directionsbidimode\or\bidilre\or\textdir TLT\fi}
\unexpanded\def\dirrle{\ifcase\directionsbidimode\or\bidirle\or\textdir TRT\fi}
-\unexpanded\def\dirlro{\ifcase\directionsbidimode\or\bidilro\or\setcharactermirroring[3]\fi}
-\unexpanded\def\dirrlo{\ifcase\directionsbidimode\or\bidirlo\or\setcharactermirroring[4]\fi}
+\unexpanded\def\dirlro{\ifcase\directionsbidimode\or\bidilro\or\setdirection[3]\fi}
+\unexpanded\def\dirrlo{\ifcase\directionsbidimode\or\bidirlo\or\setdirection[4]\fi}
-% for the moment: \setcharactermirroring[\plusone]
+% for the moment: \setdirection[\plusone]
\protect \endinput
@@ -86,11 +85,11 @@
\font\Arabic=arabtype*arab at 20pt
-\def\LATIN{LATIN} {\setcharactermirroring[1]} % enable this
+\def\LATIN{LATIN} {\setdirection[1]} % enable this
\def\ARAB {محمد}
\startluacode
- function document.split_tokens(str)
+ function documentdata.split_tokens(str)
for s in str:bytes() do
tex.sprint(tex.ctxcatcodes,string.format("\\hbox{\\char %s}",s))
end
@@ -100,10 +99,10 @@
\def\biditest#1#2#3% font text raw
{\dontleavehmode\hbox
{\framed[offset=overlay]{\tttf#2}\quad
- \enabletrackers[nodes.mirroring]%
+ \enabletrackers[typesetters.directions]%
\framed[offset=overlay]{#1#3}\quad
- \disabletrackers[nodes.mirroring]%
- \tttf\ctxlua{document.split_tokens([[\detokenize{#3}]])}}}
+ \disabletrackers[typesetters.directions]%
+ \tttf\ctxlua{documentdata.split_tokens([[\detokenize{#3}]])}}}
\startbuffer[bidi-sample]
\biditest\Arabic{LATIN BARA}{\textdir TLT\relax \LATIN\ \ARAB}\par
diff --git a/Master/texmf-dist/tex/context/base/typo-ini.lua b/Master/texmf-dist/tex/context/base/typo-ini.lua
new file mode 100644
index 00000000000..40fe7dfaaee
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-ini.lua
@@ -0,0 +1,9 @@
+if not modules then modules = { } end modules ['typo-ini'] = {
+ version = 1.001,
+ comment = "companion to typo-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- nothing yet
diff --git a/Master/texmf-dist/tex/context/base/typo-ini.mkiv b/Master/texmf-dist/tex/context/base/typo-ini.mkiv
index 1317021ef29..10be160539b 100644
--- a/Master/texmf-dist/tex/context/base/typo-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-ini.mkiv
@@ -20,6 +20,8 @@
\writestatus{loading}{ConTeXt Typographic Macros / Initialization}
+\registerctxluafile{typo-ini}{1.001}
+
\unprotect
%D \macros
@@ -37,4 +39,9 @@
\def\vhbox{\ifvertical\vbox\else\hbox\fi}
+%D \marcros
+%D {everyresettypesetting}
+
+\newtoks\everyresettypesetting
+
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/typo-krn.lua b/Master/texmf-dist/tex/context/base/typo-krn.lua
index 746773e0a88..a9428439cd8 100644
--- a/Master/texmf-dist/tex/context/base/typo-krn.lua
+++ b/Master/texmf-dist/tex/context/base/typo-krn.lua
@@ -11,57 +11,80 @@ local utf = unicode.utf8
local next, type = next, type
local utfchar = utf.char
+local nodes, node, fonts = nodes, node, fonts
+
local has_attribute = node.has_attribute
local unset_attribute = node.unset_attribute
local find_node_tail = node.tail or node.slide
local free_node = node.free
+local free_nodelist = node.flush_list
local copy_node = node.copy
+local copy_nodelist = node.copy_list
local insert_node_before = node.insert_before
local insert_node_after = node.insert_after
-local make_glue_spec = nodes.glue_spec
-local make_kern_node = nodes.kern
-local glyph = node.id("glyph")
-local kern = node.id("kern")
-local disc = node.id('disc')
-local glue = node.id('glue')
-local hlist = node.id('hlist')
-local vlist = node.id('vlist')
+local texattribute = tex.attribute
+
+local nodepool = nodes.pool
+local tasks = nodes.tasks
+
+local new_gluespec = nodepool.gluespec
+local new_kern = nodepool.kern
+
+local nodecodes = nodes.nodecodes
+local kerncodes = nodes.kerncodes
+local skipcodes = nodes.skipcodes
+
+local glyph_code = nodecodes.glyph
+local kern_code = nodecodes.kern
+local disc_code = nodecodes.disc
+local glue_code = nodecodes.glue
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+
+local kerning_code = kerncodes.kerning
+local userkern_code = kerncodes.userkern
+local userskip_code = skipcodes.userskip
+
+local fonthashes = fonts.hashes
+local fontdata = fonthashes.identifiers
+local chardata = fonthashes.characters
+local quaddata = fonthashes.quads
-local fontdata = fonts.identifiers
-local chardata = fonts.characters
-local quaddata = fonts.quads
+typesetters = typesetters or { }
+local typesetters = typesetters
-kerns = kerns or { }
-kerns.mapping = kerns.mapping or { }
-kerns.factors = kerns.factors or { }
-kerns.attribute = attributes.private("kern")
+typesetters.kerns = typesetters.kerns or { }
+local kerns = typesetters.kerns
-storage.register("kerns/mapping", kerns.mapping, "kerns.mapping")
-storage.register("kerns/factors", kerns.factors, "kerns.factors")
+kerns.mapping = kerns.mapping or { }
+kerns.factors = kerns.factors or { }
+local a_kerns = attributes.private("kern")
+kerns.attribute = kerns.attribute
+
+storage.register("typesetters/kerns/mapping", kerns.mapping, "typesetters.kerns.mapping")
+storage.register("typesetters/kerns/factors", kerns.factors, "typesetters.kerns.factors")
local mapping = kerns.mapping
local factors = kerns.factors
-function kerns.setspacing(factor)
- local a = factors[factor]
- if not a then
- a = #mapping + 1
- factors[factors], mapping[a] = a, factor
- end
- tex.attribute[kerns.attribute] = a
- return a
-end
-
-- one must use liga=no and mode=base and kern=yes
-- use more helpers
-- make sure it runs after all others
-- there will be a width adaptor field in nodes so this will change
-- todo: interchar kerns / disc nodes / can be made faster
-local function process(namespace,attribute,head,force)
- local scale = tex.scale -- will go
+local gluefactor = 4 -- assumes quad = .5 enspace
+
+kerns.keepligature = false -- just for fun (todo: control setting with key/value)
+kerns.keeptogether = false -- just for fun (todo: control setting with key/value)
+
+-- can be optimized .. the prev thing .. but hardly worth the effort
+
+local function do_process(namespace,attribute,head,force) -- todo: glue so that we can fully stretch
local start, done, lastfont = head, false, nil
+local keepligature = kerns.keepligature
+local keeptogether = kerns.keeptogether
while start do
-- faster to test for attr first
local attr = force or has_attribute(start,attribute)
@@ -70,50 +93,65 @@ local function process(namespace,attribute,head,force)
local krn = mapping[attr]
if krn and krn ~= 0 then
local id = start.id
- if id == glyph then
+ if id == glyph_code then
lastfont = start.font
local c = start.components
if c then
+if keepligature and keepligature(start) then
+ -- keep 'm
+else
+ c = do_process(namespace,attribute,c,attr)
local s = start
+ local p, n = s.prev, s.next
local tail = find_node_tail(c)
- if s.prev then
- s.prev.next = c
- c.prev = s.prev
+ if p then
+ p.next = c
+ c.prev = p
else
head = c
end
- if s.next then
- s.next.prev = tail
+ if n then
+ n.prev = tail
end
- tail.next = s.next
+ tail.next = n
start = c
- start.attr = s.attr
- s.attr = nil
s.components = nil
- free_node(s)
+ -- we now leak nodes !
+ -- free_node(s)
done = true
+end
end
local prev = start.prev
if prev then
local pid = prev.id
if not pid then
-- nothing
- elseif pid == kern and prev.subtype == 0 then
- prev.subtype = 1
- prev.kern = prev.kern + scale(quaddata[lastfont],krn)
+ elseif pid == kern_code and prev.subtype == kerning_code then
+if keeptogether and prev.prev.id == glyph_code and keeptogether(prev.prev,start) then -- we could also pass start
+ -- keep 'm
+else
+ prev.subtype = userkern_code
+ prev.kern = prev.kern + quaddata[lastfont]*krn -- here
done = true
- elseif pid == glyph then
+end
+ elseif pid == glyph_code then
if prev.font == lastfont then
local prevchar, lastchar = prev.char, start.char
+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 = scale(kern+quaddata[lastfont],krn)
+ krn = kern + quaddata[lastfont]*krn -- here
+ insert_node_before(head,start,new_kern(krn))
+ done = true
+end
else
- krn = scale(quaddata[lastfont],krn)
+ krn = quaddata[lastfont]*krn -- here
+ insert_node_before(head,start,new_kern(krn))
+ done = true
end
- insert_node_before(head,start,make_kern_node(krn))
- done = true
- elseif pid == disc then
+ 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
@@ -125,7 +163,7 @@ local function process(namespace,attribute,head,force)
pre.prev = before
before.next = pre
before.prev = nil
- pre = process(namespace,attribute,before,attr)
+ pre = do_process(namespace,attribute,before,attr)
pre = pre.next
pre.prev = nil
disc.pre = pre
@@ -137,7 +175,7 @@ local function process(namespace,attribute,head,force)
tail.next = after
after.prev = tail
after.next = nil
- post = process(namespace,attribute,post,attr)
+ post = do_process(namespace,attribute,post,attr)
tail.next = nil
disc.post = post
free_node(after)
@@ -152,7 +190,7 @@ local function process(namespace,attribute,head,force)
tail.next = after
after.prev = tail
after.next = nil
- replace = process(namespace,attribute,before,attr)
+ replace = do_process(namespace,attribute,before,attr)
replace = replace.next
replace.prev = nil
after.prev.next = nil
@@ -160,42 +198,41 @@ local function process(namespace,attribute,head,force)
free_node(after)
free_node(before)
else
- if prv and prv.id == glyph and prv.font == lastfont then
+ if prv and prv.id == glyph_code and prv.font == lastfont then
local prevchar, lastchar = prv.char, start.char
local kerns = chardata[lastfont][prevchar].kerns
local kern = kerns and kerns[lastchar] or 0
- krn = scale(kern+quaddata[lastfont],krn)
+ krn = kern + quaddata[lastfont]*krn -- here
else
- krn = scale(quaddata[lastfont],krn)
+ krn = quaddata[lastfont]*krn -- here
end
- disc.replace = make_kern_node(krn)
+ disc.replace = new_kern(krn)
end
end
end
- elseif id == glue and start.subtype == 0 then
+ elseif id == glue_code and start.subtype == userskip_code then
local s = start.spec
local w = s.width
if w > 0 then
- local width, stretch, shrink = w+2*scale(w,krn), s.stretch, s.shrink
- start.spec = make_glue_spec(width,scale(stretch,width/w),scale(shrink,width/w))
- -- local width, stretch, shrink = w+2*w*krn, s.stretch, s.shrink
- -- start.spec = make_glue_spec(width,stretch*width/w,shrink*width/w))
+ local width, stretch, shrink = w+gluefactor*w*krn, s.stretch, s.shrink
+ start.spec = new_gluespec(width,stretch*width/w,shrink*width/w)
done = true
end
- elseif false and id == kern and start.subtype == 0 then -- handle with glyphs
+ elseif false and id == kern_code and start.subtype == kerning_code then -- handle with glyphs
local sk = start.kern
if sk > 0 then
- -- start.kern = scale(sk,krn)
start.kern = sk*krn
done = true
end
- elseif lastfont and (id == hlist or id == vlist) then -- todo: lookahead
- if start.prev then
- insert_node_before(head,start,make_kern_node(scale(quaddata[lastfont],krn)))
+ elseif lastfont and (id == hlist_code or id == vlist_code) then -- todo: lookahead
+ local p = start.prev
+ if p and p.id ~= glue_code then
+ insert_node_before(head,start,new_kern(quaddata[lastfont]*krn))
done = true
end
- if start.next then
- insert_node_after(head,start,make_kern_node(scale(quaddata[lastfont],krn)))
+ local n = start.next
+ if n and n.id ~= glue_code then
+ insert_node_after(head,start,new_kern(quaddata[lastfont]*krn))
done = true
end
end
@@ -208,16 +245,31 @@ local function process(namespace,attribute,head,force)
return head, done
end
-kerns.process = function(namespace,attribute,head)
- return process(namespace,attribute,head) -- no direct map, because else fourth argument is tail == true
+local enabled = false
+
+function kerns.set(factor)
+ if not enabled then
+ tasks.enableaction("processors","typesetters.kerns.handler")
+ enabled = true
+ end
+ if factor ~= 0 then
+ local a = factors[factor]
+ if not a then
+ a = #mapping + 1
+ factors[factors], mapping[a] = a, factor
+ end
+ factor = a
+ end
+ texattribute[a_kerns] = factor
+ return factor
+end
+
+local function process(namespace,attribute,head)
+ return do_process(namespace,attribute,head) -- no direct map, because else fourth argument is tail == true
end
-lists.handle_kerning = nodes.install_attribute_handler {
- name = "kern",
+kerns.handler = nodes.installattributehandler {
+ name = "kern",
namespace = kerns,
- processor = kerns.process,
+ processor = process,
}
-
-function kerns.enable()
- tasks.enableaction("processors","lists.handle_kerning")
-end
diff --git a/Master/texmf-dist/tex/context/base/typo-krn.mkiv b/Master/texmf-dist/tex/context/base/typo-krn.mkiv
index b7a6113bc86..bb4a48a5d71 100644
--- a/Master/texmf-dist/tex/context/base/typo-krn.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-krn.mkiv
@@ -17,7 +17,7 @@
\registerctxluafile{typo-krn}{1.001}
-\definesystemattribute[kern] \chardef\kernattribute\dogetattributeid{kern}
+\definesystemattribute[kern][public]
% more
%
@@ -28,7 +28,7 @@
\def\dodefinecharacterkerning[#1][#2]%
{\getparameters[\??ck#1][\c!factor=0.125,#2]%
- \setgvalue{\??ck:#1}{\ctxlua{kerns.setspacing(\csname\??ck#1\c!factor\endcsname)}}}
+ \setuvalue{\??ck:#1}{\dosetcharacterkerning{#1}}}
\unexpanded\def\setupcharacterkerning
{\dodoubleargument\dosetupcharacterkerning}
@@ -40,12 +40,20 @@
\dodefinecharacterkerning[#1][#2]% bonus
\fi}
-\unexpanded\def\setcharacterkerning
- {\ctxlua{kerns.enable()}%
- \unexpanded\gdef\setcharacterkerning[##1]{\csname\??ck:##1\endcsname}%
- \setcharacterkerning}
+\unexpanded\def\dosetcharacterkerning#1%
+ {\ctxlua{typesetters.kerns.set(\csname\??ck#1\c!factor\endcsname)}}
-\letvalue{\??ck:\s!reset}\attributeunsetvalue
+\unexpanded\def\setcharacterkerning[#1]%
+ {\csname\??ck:#1\endcsname}
+
+\unexpanded\def\resetcharacterkerning % fast one
+ {\attribute\kernattribute\attributeunsetvalue}
+
+\letvalue{\??ck\s!reset\c!factor}\attributeunsetvalue % trick
+
+\appendtoks
+ \resetcharacterkerning
+\to \everyresettypesetting
\definecharacterkerning [extrakerning] [\c!factor=.125] % used in manuals
diff --git a/Master/texmf-dist/tex/context/base/typo-mar.lua b/Master/texmf-dist/tex/context/base/typo-mar.lua
new file mode 100644
index 00000000000..6bc98586888
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-mar.lua
@@ -0,0 +1,579 @@
+if not modules then modules = { } end modules ['typo-mar'] = {
+ version = 1.001,
+ comment = "companion to typo-mar.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- todo:
+--
+-- * autoleft/right depending on available space (or distance to margin)
+-- * stack across paragraphs, but that is messy and one should reconsider
+-- using margin data then as also vertical spacing kicks in
+-- * floating margin data, with close-to-call anchoring
+
+local format = string.format
+local insert, remove = table.insert, table.remove
+local setmetatable, next = setmetatable, next
+
+local attributes, nodes, node, variables = attributes, nodes, node, variables
+
+local trace_margindata = false trackers.register("typesetters.margindata", function(v) trace_margindata = v end)
+
+local report_margindata = logs.reporter("typesetters","margindata")
+
+local tasks = nodes.tasks
+local prependaction = tasks.prependaction
+local disableaction = tasks.disableaction
+local enableaction = tasks.enableaction
+
+local variables = interfaces.variables
+
+local conditionals = tex.conditionals
+
+local v_top = variables.top
+local v_depth = variables.depth
+local v_local = variables["local"]
+local v_global = variables["global"]
+local v_left = variables.left
+local v_right = variables.right
+local v_flushleft = variables.flushleft
+local v_flushright = variables.flushright
+local v_inner = variables.inner
+local v_outer = variables.outer
+local v_margin = variables.margin
+local v_edge = variables.edge
+local v_default = variables.default
+local v_normal = variables.normal
+local v_yes = variables.yes
+local v_first = variables.first
+
+local has_attribute = node.has_attribute
+local set_attribute = node.set_attribute
+local unset_attribute = node.unset_attribute
+local copy_node_list = node.copy_list
+local slide_nodes = node.slide
+local hpack_nodes = node.hpack -- nodes.fasthpack not really faster here
+local traverse_id = node.traverse_id
+local free_node_list = node.free_list
+
+local link_nodes = nodes.link
+
+local nodecodes = nodes.nodecodes
+local listcodes = nodes.listcodes
+local gluecodes = nodes.gluecodes
+local whatsitcodes = nodes.whatsitcodes
+
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local glue_code = nodecodes.glue
+local whatsit_code = nodecodes.whatsit
+local line_code = listcodes.line
+local leftskip_code = gluecodes.leftskip
+local rightskip_code = gluecodes.rightskip
+local userdefined_code = whatsitcodes.userdefined
+
+local nodepool = nodes.pool
+
+local new_kern = nodepool.kern
+local new_stretch = nodepool.stretch
+local new_usernumber = nodepool.usernumber
+
+local texcount = tex.count
+local texdimen = tex.dimen
+local texbox = tex.box
+
+local isleftpage = layouts.status.isleftpage
+
+local a_margindata = attributes.private("margindata")
+
+local inline_mark = nodepool.userids["margins.inline"]
+
+local margins = { }
+typesetters.margins = margins
+
+local locations = { v_left, v_right, v_inner, v_outer } -- order might change
+local categories = { }
+local displaystore = { } -- [category][location][scope]
+local inlinestore = { } -- [number]
+local nofsaved = 0
+local nofstored = 0
+local nofinlined = 0
+local nofdelayed = 0
+
+local mt1 = {
+ __index = function(t,location)
+ local v = { [v_local] = { }, [v_global] = { } }
+ t[location] = v
+ return v
+ end
+}
+
+local mt2 = {
+ __index = function(stores,category)
+ categories[#categories+1] = category
+ local v = { }
+ setmetatable(v,mt1)
+ stores[category] = v
+ return v
+ end
+}
+
+setmetatable(displaystore,mt2)
+
+local defaults = {
+ __index = {
+ location = v_left,
+ align = v_normal,
+ method = "",
+ name = "",
+ threshold = 0, -- .25ex
+ margin = v_normal,
+ scope = v_global,
+ distance = 0,
+ hoffset = 0,
+ voffset = 0,
+ category = v_default,
+ line = 0,
+ vstack = 0,
+ dy = 0,
+ baseline = false,
+ inline = false,
+ }
+}
+
+local enablelocal, enableglobal -- forward reference (delayed initialization)
+
+function margins.save(t)
+ setmetatable(t,defaults)
+ local inline = t.inline
+ local location = t.location
+ local category = t.category
+ local scope = t.scope
+ local store
+ if inline then
+ store = inlinestore
+ else
+ store = displaystore[category][location]
+ if not store then
+ report_margindata("invalid location: %s",location)
+ return
+ end
+ store = store[scope]
+ end
+ if not store then
+ report_margindata("invalid scope: %s",scope)
+ return
+ end
+ if enablelocal and scope == "local" then
+ enablelocal()
+ end
+ if enableglobal and scope == "global" then
+ enableglobal()
+ end
+ nofsaved = nofsaved + 1
+ nofstored = nofstored + 1
+ local name = t.name
+ if name and name ~= "" then
+ for i=#store,1,-1 do
+ local si = store[i]
+ if si.name == name then
+ local s = remove(store,i)
+ free_node_list(s.box)
+ end
+ end
+ end
+ -- better make a new table and make t entry in t
+ t.box = copy_node_list(texbox[t.number])
+ t.n = nofsaved
+ -- used later (we will clean up this natural mess later)
+ -- nice is to make a special status table mechanism
+ local leftmargindistance = texdimen.naturalleftmargindistance
+ local rightmargindistance = texdimen.naturalrightmargindistance
+ t.strutdepth = texbox.strutbox.depth
+ t.strutheight = texbox.strutbox.height
+ t.leftskip = tex.leftskip.width
+ t.rightskip = tex.rightskip.width
+ t.leftmargindistance = leftmargindistance
+ t.rightmargindistance = rightmargindistance
+ t.leftedgedistance = texdimen.naturalleftedgedistance
+ + texdimen.leftmarginwidth
+ + leftmargindistance
+ t.rightedgedistance = texdimen.naturalrightedgedistance
+ + texdimen.rightmarginwidth
+ + rightmargindistance
+ t.lineheight = texdimen.lineheight
+ --
+ -- t.realpageno = texcount.realpageno
+ if inline then
+ context(new_usernumber(inline_mark,nofsaved))
+ store[nofsaved] = t -- no insert
+ nofinlined = nofinlined + 1
+ else
+ insert(store,t)
+ end
+ if trace_margindata then
+ report_margindata("saved: %s, location: %s, scope: %s, inline: %s",nofsaved,location,scope,tostring(inline))
+ end
+end
+
+-- Actually it's an advantage to have them all anchored left (tags and such)
+-- we could keep them in store and flush in stage two but we might want to
+-- do more before that so we need the content to be there unless we can be
+-- sure that we flush this first which might not be the case in the future.
+--
+-- When the prototype inner/outer code that was part of this proved to be
+-- okay it was moved elsewhere.
+
+local status, nofstatus = { }, 0
+
+local function realign(current,candidate)
+ local location = candidate.location
+ local margin = candidate.margin
+ local hoffset = candidate.hoffset
+ local distance = candidate.distance
+ local hsize = candidate.hsize
+ local width = candidate.width
+ local align = candidate.align
+ -- local realpageno = candidate.realpageno
+ local leftpage = isleftpage(false,true)
+ local delta = 0
+ local leftdelta = 0
+ local rightdelta = 0
+ local leftdistance = distance
+ local rightdistance = distance
+ if margin == v_normal then
+ --
+ elseif margin == v_local then
+ leftdelta = - candidate.leftskip
+ rightdelta = candidate.rightskip
+ elseif margin == v_margin then
+ leftdistance = candidate.leftmargindistance
+ rightdistance = candidate.rightmargindistance
+ elseif margin == v_edge then
+ leftdistance = candidate.leftedgedistance
+ rightdistance = candidate.rightedgedistance
+ end
+ if leftpage then
+ leftdistance, rightdistance = rightdistance, leftdistance
+ end
+ if location == v_left then
+ delta = hoffset + width + leftdistance + leftdelta
+ elseif location == v_right then
+ delta = -hoffset - hsize - rightdistance + rightdelta
+ elseif location == v_inner then
+ if leftpage then
+ delta = -hoffset - hsize - rightdistance + rightdelta
+ else
+ delta = hoffset + width + leftdistance + leftdelta
+ end
+ elseif location == v_outer then
+ if leftpage then
+ delta = hoffset + width + leftdistance + leftdelta
+ else
+ delta = -hoffset - hsize - rightdistance + rightdelta
+ end
+ end
+ -- we assume that list is a hbox, otherwise we had to take the whole current
+ -- in order to get it right
+ current.width = 0
+ current.list = hpack_nodes(link_nodes(new_kern(-delta),current.list,new_kern(delta)))
+ current.width = 0
+ if trace_margindata then
+ report_margindata("realigned: %s, location: %s, margin: %s",candidate.n,location,margin)
+ end
+end
+
+local function realigned(current,a)
+ local candidate = status[a]
+ realign(current,candidate)
+ nofdelayed = nofdelayed - 1
+ status[a] = nil
+ return true
+end
+
+local stacked = { }
+
+local function resetstacked()
+ for i=1,#locations do
+ stacked[locations[i]] = false
+ end
+end
+
+resetstacked()
+
+local function inject(parent,head,candidate)
+ local box = candidate.box
+ local width = box.width
+ local height = box.height
+ local depth = box.depth
+ local shift = box.shift
+ local stack = candidate.stack
+ local location = candidate.location
+ local method = candidate.method
+ local voffset = candidate.voffset
+ local line = candidate.line
+ local baseline = candidate.baseline
+ local offset = stacked[location]
+ local firstonstack = offset == false
+ nofstatus = nofstatus + 1
+ nofdelayed = nofdelayed + 1
+ status[nofstatus] = candidate
+ -- yet untested
+ if baseline == true then
+ baseline = false
+ -- hbox vtop
+--~ for h in traverse_id(hlist_code,box.list.list) do
+--~ baseline = h.height
+--~ break
+--~ end
+ end
+ candidate.width = width
+ candidate.hsize = parent.width -- we can also pass textwidth
+ if firstonstack then
+ offset = 0
+ else
+ offset = offset + height
+ end
+ if stack == v_yes then
+ offset = offset + candidate.dy
+ shift = shift + offset
+ end
+ -- -- --
+ -- Maybe we also need to patch offset when we apply methods, but how ...
+ -- This needs a bit of playing as it depends on the stack setting of the
+ -- following which we don't know yet ... so, consider stacking partially
+ -- experimental.
+ -- -- --
+ if method == v_top then
+ local delta = height - parent.height
+ if trace_margindata then
+ report_margindata("top aligned: %s, amount: %s",candidate.n,delta)
+ end
+ if delta < candidate.threshold then
+ shift = shift + voffset + delta
+ end
+ elseif method == v_first then
+ if baseline then
+ shift = shift + voffset + height - baseline -- option
+ else
+ shift = shift + voffset -- normal
+ end
+ elseif method == v_depth then
+ local delta = candidate.strutdepth
+ if trace_margindata then
+ report_margindata("depth aligned, amount: %s",candidate.n,delta)
+ end
+ shift = shift + voffset + delta
+ elseif method == v_height then
+ local delta = - candidate.strutheight
+ if trace_margindata then
+ report_margindata("height aligned, amount: %s",candidate.n,delta)
+ end
+ shift = shift + voffset + delta
+ elseif voffset ~= 0 then
+ shift = shift + voffset
+ end
+ -- -- --
+ if line ~= 0 then
+ local delta = line * candidate.lineheight
+ shift = shift + delta
+ offset = offset + delta
+ end
+ box.shift = shift
+ box.width = 0
+ if head then
+ head.prev = box
+ box.next = head
+ end
+ head = box
+ set_attribute(box,a_margindata,nofstatus)
+ if trace_margindata then
+ report_margindata("injected: %s, location: %s",candidate.n,location)
+ end
+ -- we need to add line etc to offset as well
+ offset = offset + depth
+ stacked[location] = offset
+ return head
+end
+
+local function flushinline(parent,head,done)
+ local current = head
+ while current and nofinlined > 0 do
+ local id = current.id
+ if id == whatsit_code then
+ if current.subtype == userdefined_code and current.user_id == inline_mark then
+ local n = current.value
+ local candidate = inlinestore[n]
+ if candidate then -- no vpack, as we want to realign
+ inlinestore[n] = nil
+ nofinlined = nofinlined - 1
+ head = inject(parent,head,candidate) -- maybe return applied offset
+ done = true
+ nofstored = nofstored - 1
+ end
+ end
+ elseif id == hlist_code or id == vlist_code then
+ -- optional (but sometimes needed)
+ current.list, done = flushinline(current,current.list,done)
+ end
+ current = current.next
+ end
+ return head, done
+end
+
+local function flushed(scope,parent) -- current is hlist
+ local done = false
+ local head = parent.list
+ for c=1,#categories do
+ local category = categories[c]
+ for l=1,#locations do
+ local location = locations[l]
+ local store = displaystore[category][location][scope]
+ while true do
+ local candidate = remove(store,1)
+ if candidate then -- no vpack, as we want to realign
+ head = inject(parent,head,candidate) -- maybe return applied offset
+ done = true
+ nofstored = nofstored - 1
+ else
+ break
+ end
+ end
+ end
+ end
+ if nofinlined > 0 then
+ if done then
+ parent.list = head
+ end
+ head, done = flushinline(parent,head,false)
+ end
+ if done then
+ parent.list = hpack_nodes(head,parent.width,"exactly")
+ resetstacked()
+ end
+ return done
+end
+
+-- only when group : vbox|vmode_par
+-- only when subtype : line, box (no indent alignment cell)
+
+local function handler(scope,head,group)
+ if nofstored > 0 then
+ -- if trace_margindata then
+ -- report_margindata("flushing stage one, stored: %s, scope: %s, delayed: %s, group: %s",nofstored,scope,nofdelayed,group)
+ -- end
+ local current = head
+ local done = false
+ while current do
+ local id = current.id
+ if (id == vlist_code or id == hlist_code) and not has_attribute(current,a_margindata) then
+ if flushed(scope,current) then
+ set_attribute(current,a_margindata,0) -- signal to prevent duplicate processing
+ if nofstored <= 0 then
+ break
+ end
+ done = true
+ end
+ end
+ current = current.next
+ end
+ -- if done then
+ -- resetstacked()
+ -- end
+ return head, done
+ else
+ return head, false
+ end
+end
+
+function margins.localhandler(head,group)
+ if conditionals.inhibitmargindata then
+ return head, false
+ elseif nofstored > 0 then
+ return handler("local",head,group)
+ else
+ return head, false
+ end
+end
+
+function margins.globalhandler(head,group)
+--~ print(group)
+ if conditionals.inhibitmargindata then
+ return head, false
+ elseif nofstored > 0 and group == "hmode_par" then
+ return handler("global",head,group)
+ else
+ return head, false
+ end
+end
+
+local function finalhandler(head)
+ if nofdelayed > 0 then
+ local current = head
+ local done = false
+ while current do
+ local id = current.id
+ if id == hlist_code then
+ local a = has_attribute(current,a_margindata)
+ if not a or a == 0 then
+ finalhandler(current.list)
+ elseif realigned(current,a) then
+ done = true
+ if nofdelayed == 0 then
+ return head, true
+ end
+ end
+ elseif id == vlist_code then
+ finalhandler(current.list)
+ end
+ current = current.next
+ end
+ return head, done
+ else
+ return head, false
+ end
+end
+
+function margins.finalhandler(head)
+ if nofdelayed > 0 then
+ -- if trace_margindata then
+ -- report_margindata("flushing stage two, instore: %s, delayed: %s",nofstored,nofdelayed)
+ -- end
+ return finalhandler(head)
+ else
+ return head, false
+ end
+end
+
+prependaction("finalizers", "lists", "typesetters.margins.localhandler")
+prependaction("vboxbuilders", "normalizers", "typesetters.margins.localhandler")
+prependaction("mvlbuilders", "normalizers", "typesetters.margins.globalhandler")
+prependaction("shipouts", "normalizers", "typesetters.margins.finalhandler")
+
+disableaction("finalizers", "typesetters.margins.localhandler")
+disableaction("vboxbuilders", "typesetters.margins.localhandler")
+disableaction("mvlbuilders", "typesetters.margins.globalhandler")
+disableaction("shipouts", "typesetters.margins.finalhandler")
+
+enablelocal = function()
+ enableaction("finalizers", "typesetters.margins.localhandler")
+ enableaction("vboxbuilders", "typesetters.margins.localhandler")
+ enableaction("shipouts", "typesetters.margins.finalhandler")
+ enablelocal = nil
+end
+
+enableglobal = function()
+ enableaction("mvlbuilders", "typesetters.margins.globalhandler")
+ enableaction("shipouts", "typesetters.margins.finalhandler")
+ enableglobal = nil
+end
+
+statistics.register("margin data", function()
+ if nofsaved > 0 then
+ return string.format("%s entries, %s pending",nofsaved,nofdelayed)
+ else
+ return nil
+ end
+end)
diff --git a/Master/texmf-dist/tex/context/base/typo-mar.mkiv b/Master/texmf-dist/tex/context/base/typo-mar.mkiv
new file mode 100644
index 00000000000..aba3ef95a74
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/typo-mar.mkiv
@@ -0,0 +1,351 @@
+% macros=mkvi
+
+%D \module
+%D [ file=typo-mar,
+%D version=2010.02.15, % was experimental code
+%D title=\CONTEXT\ Typesetting Macros,
+%D subtitle=Margindata,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=\PRAGMA]
+%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: tags
+
+\writestatus{loading}{ConTeXt Typesetting Macros / Margindata}
+
+\unprotect
+
+%D This module has been on the agenda for a while. Actually, it is
+%D one of the things that I really need myself, for instance when
+%D rendering rather unpredictable (educational) tests encoded in
+%D XML. This module permits anchoring for instance item numbers and
+%D also overload them when they have subnumbers. In the future it
+%D might replace the current maginal note mechanism (that then
+%D will be just an instance).
+%D
+%D In spite of what might be expected, the more advanced \LUA\ based
+%D variant is upto twice as fast on simple entries. Also, we no longer
+%D need an extra pass to get inner and outer alignments in sync with
+%D the pagebuilder.
+
+\registerctxluafile{typo-mar}{1.001}
+
+%definesystemattribute[margindata] % only at the lua end
+
+%D In \MKII\ we have three categories and their historically meaning
+%D is as follows:
+%D
+%D marginlines: These are flushed relative to the start of a line and
+%D need to be invoked there.
+%D
+%D marginwords: These can be issued in the text flow and will migrate
+%D sidewards; in spite of the name, it can be a paragraph of text as
+%D well, but normally it's words.
+%D
+%D margintexts: These can be set beforehand and are flushed at the
+%D next paragraph of text (of header).
+%D
+%D In \MKIV\ we have further integrated the mechanism and we now have:
+%D
+%D margindata: This can be anything that needs to go into the margin.
+%D It can be anchored in the text or given beforehand in which case
+%D it gets flushed at the first occasion.
+%D
+%D margintext: This runs on top of margindata and the only difference
+%D is that it uses the framed mechanism for packaging.
+%D
+%D Stacking is done differently as is inner and outer alignment (in
+%D most cases more efficient). The functionality is mostly the same
+%D as in \MKII, but there are a few additions, like names entries,
+%D where later ones overload preceding not yet flushed ones. Data can
+%D get catagorized and is then treated as a group (e.g. when stacking
+%D is needed).
+%D
+%D The amount of \TEX\ code is less than in \MKII\ because we do all
+%D trickery in at the \LUA\ end. At the end of this file we define
+%D several commands, like \type {\inleftmargin} and \type {\inleft}.
+%D You can configure them individually or as a group. There is an
+%D inheritance model in place.
+%D
+%D The following notes will be stacked:
+%D
+%D \starttyping
+%D \ininner[line=2]{IM A}
+%D \ininner[stack=yes]{IM B}
+%D \ininner[stack=yes]{IM C}
+%D \stoptyping
+%D
+%D The distance between them is determined by \type {dy}:
+%D
+%D \starttyping
+%D \ininner[stack=yes,dy=2ex][frame=on] {IM A}
+%D \ininner[stack=yes,dy=2ex][frame=on] {IM B}
+%D \stoptyping
+%D
+%D There are several methods of vertical alignment.
+%D
+%D \starttyping
+%D \inmargin [method=first] [frame=on] {first\\second} \input ward \par
+%D \inmargin [method=first] [frame=on,offset=3pt] {first\\second} \input ward \par
+%D \inmargin [method=first,voffset=-3pt][frame=on,offset=3pt,rulethickness=3pt] {first\\second} \input ward \par
+%D \inmargin [method=first,voffset=-6pt][frame=on,offset=3pt,rulethickness=3pt] {first\\second} \input ward \par
+%D \stoptyping
+%D
+%D You sometimes need to combine \type {voffset} with \type {offset}. The first
+%D argument concerns the data, the second the framed. Not sharing the setup is
+%D on purpose: location, offset, alignment and other parameters might clash.
+
+\def\??mc{@@mc} % margincategory
+\def\??mf{@@mf} % marginframed
+
+\installcommandhandler\??mc{margindata}\??mc
+\installcommandhandler\??mf{marginframed}\??mf
+
+\setupmargindata
+ [\c!location=\v!left,
+ % \c!align=,
+ % \c!method=,
+ \c!style=\v!bold,
+ \c!color=, % maybe textcolor
+ % \c!name=,
+ % \c!category=,
+ \c!threshold=.25ex,
+ \c!margin=\v!normal,
+ \c!scope=\v!global,
+ \c!width=,
+ % \c!stack=,
+ \c!line=0,
+ \c!dy=\zeropoint,
+ \c!distance=\zeropoint,
+ \c!hoffset=\zeropoint,
+ \c!voffset=\zeropoint]
+
+\setupmarginframed % so, align should be set with the data command
+ [\c!strut=\v!yes,
+ \c!offset=\v!overlay,
+ \c!fr!analyze=\v!yes,
+ \c!frame=\v!off,
+ \c!width=\margindataparameter\c!width,
+ \c!align=\margindataparameter\c!align]
+
+\appendtoks
+ \setuevalue\currentmargindata{\margindata[\currentmargindata]}%
+\to \everydefinemargindata
+
+\newconditional\inhibitmargindata % This one is used at the Lua end!
+\newtoks \everymargindatacontent % Later on we will set this one.
+
+\unexpanded\def\margindata[#name]%
+ {\setfalse\inhibitmargindata % flushing afterwards
+ \begingroup
+ %\settrue\inhibitmargindata % no flushing in here
+ \def\currentmargindata{#name}%
+ \dodoubleempty\domargindata}
+
+\appendtoks
+ \settrue\inhibitmargindata
+\to \everyforgetall
+
+% option test -> ruled
+
+\appendtoks
+ \forgetall
+ \tf
+ \deactivatecolor
+\to \everymargindatacontent
+
+\unexpanded\def\domargindata[#dataparameters][#textparameters]#content%
+ {\iffirstargument
+ \setupmargindata[\currentmargindata][#dataparameters]%
+ \fi
+ \edef\currentmargindatastrut{\margindataparameter\c!strut}%
+ \the\everymargindatacontent
+ \dostarttagged\t!margintext\currentmargindata
+ \ifcsname\??mf\currentmargindata\s!parent\endcsname
+ \setbox\nextbox\hbox\bgroup
+ \the\everymargindatacontent
+ \dosetmargindataattributes\c!style\c!color
+ \localframedwithsettings[\??mf\currentmargindata][\c!location=\v!normal,#textparameters]\bgroup
+ \ifx\currentmargindatastrut\empty \else
+ \dosetupstrut[\currentmargindatastrut]%
+ \fi
+ \begstrut\margindataparameter\c!command{#content}\endstrut
+ \egroup
+ \egroup
+ \edef\currentmarginfirstheight{\number\dimexpr\framedfirstheight}%
+ \else
+ \edef\currentmargindatawidth{\margindataparameter\c!width}%
+ \ifx\currentmargindatawidth\empty
+ \setbox\nextbox\hbox\bgroup
+ \the\everymargindatacontent
+ \dosetmargindataattributes\c!style\c!color
+ \ifx\currentmargindatastrut\empty \else
+ \dosetupstrut[\currentmargindatastrut]%
+ \fi
+ \begstrut\margindataparameter\c!command{#content}\endstrut
+ \egroup
+ \let\currentmarginfirstheight\empty
+ \else
+ \dosetraggedcommand{\margindataparameter\c!align}%
+ \setbox\nextbox\hbox \bgroup\vtop \bgroup % hbox is needed
+ \the\everymargindatacontent
+ \dosetmargindataattributes\c!style\c!color
+ \hsize\currentmargindatawidth
+ \raggedcommand
+ \ifx\currentmargindatastrut\empty \else
+ \dosetupstrut[\currentmargindatastrut]%
+ \fi
+ \begstrut\margindataparameter\c!command{#content}\endstrut
+ \egroup \egroup
+ \edef\currentmarginfirstheight{true}%
+ \fi
+ \fi
+ \dostoptagged
+ \ctxlua{typesetters.margins.save{
+ \c!location = "\margindataparameter\c!location",
+ \c!method = "\margindataparameter\c!method",
+ \c!category = "\margindataparameter\c!category",
+ \c!name = "\margindataparameter\c!name",
+ \c!margin = "\margindataparameter\c!margin", % local normal margin edge
+ \c!distance = \number\dimexpr\margindataparameter\c!distance,
+ \c!hoffset = \number\dimexpr\margindataparameter\c!hoffset,
+ \c!voffset = \number\dimexpr\margindataparameter\c!voffset,
+ \c!dy = \number\dimexpr\margindataparameter\c!dy,
+ \ifx\currentmarginfirstheight\empty \else
+ baseline = \currentmarginfirstheight,
+ \fi
+ threshold = \number\dimexpr\margindataparameter\c!threshold, % will change
+ \ifhmode
+ inline = true,
+ \fi
+ \c!scope = "\margindataparameter\c!scope",
+ \c!align = "\margindataparameter\c!align",
+ \c!line = "\margindataparameter\c!line",
+ \c!stack = "\margindataparameter\c!stack",
+ \c!number = \number\nextbox
+ }}%
+ \endgroup}
+
+%D Downward compatible hack:
+
+\unexpanded\def\spaceorpar
+ {\endgraf\ifhmode\space\fi}
+
+\appendtoks
+ \let\\\spaceorpar
+\to \everymargindatacontent
+
+%D Another one:
+
+% \letvalue{\??mc->\v!left }\v!right
+% \letvalue{\??mc->\v!right }\v!left
+% \letvalue{\??mc->\v!inner }\v!outer
+% \letvalue{\??mc->\v!outer }\v!inner
+% \letvalue{\??mc->\v!normal}\v!normal
+%
+% \def\oppositemargin#1%
+% {\csname\??mc->\ifcsname\??mc->#1\endcsname#1\else\v!normal\fi\endcsname}
+
+%D Definitions:
+
+% common to lines and text
+
+\setupmargindata [\v!left ] [\c!method=\v!first,\c!location=\v!left ,\c!margin=\v!margin,\c!align=\v!flushright,\s!parent=\??mc] % we could autoparent when no define yet
+\setupmargindata [\v!right] [\c!method=\v!first,\c!location=\v!right,\c!margin=\v!margin,\c!align=\v!flushleft, \s!parent=\??mc]
+\setupmargindata [\v!outer] [\c!method=\v!first,\c!location=\v!outer,\c!margin=\v!margin,\c!align=\v!inner, \s!parent=\??mc]
+\setupmargindata [\v!inner] [\c!method=\v!first,\c!location=\v!inner,\c!margin=\v!margin,\c!align=\v!outer, \s!parent=\??mc]
+
+% lines
+
+\definemargindata [inleftmargin] [\v!left ] [\c!margin=\v!margin,\c!width=\leftmarginwidth ,\c!style=,\c!color=]
+\definemargindata [inrightmargin] [\v!right] [\c!margin=\v!margin,\c!width=\rightmarginwidth,\c!style=,\c!color=]
+\definemargindata [inoutermargin] [\v!outer] [\c!margin=\v!margin,\c!width=\outermarginwidth,\c!style=,\c!color=]
+\definemargindata [ininnermargin] [\v!inner] [\c!margin=\v!margin,\c!width=\innermarginwidth,\c!style=,\c!color=]
+
+\definemargindata [inleftedge] [\v!left ] [\c!margin=\v!edge ,\c!width=\leftedgewidth ,\c!style=,\c!color=,\c!category=\v!edge]
+\definemargindata [inrightedge] [\v!right] [\c!margin=\v!edge ,\c!width=\rightedgewidth ,\c!style=,\c!color=,\c!category=\v!edge]
+\definemargindata [inouteredge] [\v!outer] [\c!margin=\v!edge ,\c!width=\outeredgewidth ,\c!style=,\c!color=,\c!category=\v!edge]
+\definemargindata [ininneredge] [\v!inner] [\c!margin=\v!edge ,\c!width=\inneredgewidth ,\c!style=,\c!color=,\c!category=\v!edge]
+
+\definemargindata [atleftmargin] [\v!left ] [\c!margin=\v!normal,\c!width=\leftmarginwidth ,\c!style=,\c!color=]
+\definemargindata [atrightmargin] [\v!right] [\c!margin=\v!normal,\c!width=\rightmarginwidth,\c!style=,\c!color=]
+
+% text
+
+\definemargindata [inleft] [\v!left ] [\c!margin=\c!margin,\c!width=\leftmarginwidth ,\c!align=\v!flushright]
+\definemargindata [inright] [\v!right] [\c!margin=\c!margin,\c!width=\rightmarginwidth,\c!align=\v!flushleft]
+\definemargindata [inouter] [\v!outer] [\c!margin=\c!margin,\c!width=\outermarginwidth,\c!align=\v!inner]
+\definemargindata [ininner] [\v!inner] [\c!margin=\c!margin,\c!width=\innermarginwidth,\c!align=\v!outer]
+
+% no longer auto auto-other
+
+\definemargindata [inmargin] [\v!left] [\c!margin=\c!margin,\c!width=\leftmarginwidth, \c!align=\v!flushright]
+\definemargindata [inother] [\v!right] [\c!margin=\c!margin,\c!width=\rightmarginwidth,\c!align=\v!flushleft]
+
+\definemargindata [margintext] [\v!left] [\c!margin=\c!margin,\c!width=\leftmarginwidth, \c!align=\v!flushright]
+
+\setupmarginframed [\v!left ] [\c!method=\v!first,\c!align=\v!flushright,\s!parent=\??mf] % we could autoparent when no define yet
+\setupmarginframed [\v!right] [\c!method=\v!first,\c!align=\v!flushleft, \s!parent=\??mf]
+\setupmarginframed [\v!outer] [\c!method=\v!first,\c!align=\v!inner, \s!parent=\??mf]
+\setupmarginframed [\v!inner] [\c!method=\v!first,\c!align=\v!outer, \s!parent=\??mf]
+
+\definemarginframed [inleft] [\v!left ]
+\definemarginframed [inright] [\v!right]
+\definemarginframed [inouter] [\v!outer]
+\definemarginframed [ininner] [\v!inner]
+\definemarginframed [inmargin] [\v!inleft]
+\definemarginframed [inother] [\v!inright]
+
+\let\marginword \margintext
+\let\margintitle\margintext
+
+%definemargindata [inouterextra] [\v!outer] [\c!margin=\c!edge,\c!location=\v!outer,\c!width=\outeredgewidth,\c!align=\v!outer,\c!category=\v!edge]
+%definemargindata [ininnerextra] [\v!inner] [\c!margin=\c!edge,\c!location=\v!inner,\c!width=\inneredgewidth,\c!align=\v!inner,\c!category=\v!edge]
+%
+%definemarginframed [inouterextra] [\v!outer]
+%definemarginframed [ininnerextra] [\v!inner]
+
+%D As we have more control we are not backward compatible although in
+%D practice it won't hurt that much.
+%D So, from now on use:
+%D
+%D \starttyping
+%D \setupmargindata
+%D \setupmargintext
+%D \stoptyping
+
+% The following sort of works okay:
+%
+% \let\definemarginline\definemargindata
+%
+% \unexpanded\def\defineinmargin
+% {\doquadrupleempty\dodefineinmargin}
+%
+% \def\dodefineinmargin[#name][#location][#align][#settings]% not completely compatible
+% {\definemargindata[#name][\c!location=#location,\c!align=#align,#settings]%
+% \definemarginframed[#name][#location][\c!align=#align,#settings]}
+
+\let\setupinmargin\setupmargindata
+
+% The following is too dangerous:
+%
+% \unexpanded\def\setupinmargin
+% {\dodoubleempty\dosetupinmargin}
+%
+% \def\dosetupinmargin[#1][#2]%
+% {\ifsecondargument
+% \processcommalist[#1]{\dodosetupinmargin[#2]}%
+% \else
+% \setupmargindata [#1]% beware, here we can have clashes, so
+% \setupmarginframed[#1]% don't use setupinmargin any more
+% \fi}
+%
+% \def\dodosetupinmargin[#1]#2% [settings]{class}
+% {\setupmargindata[#2][#1]%
+% \setupmargintext[#2][#1]}
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/typo-rep.lua b/Master/texmf-dist/tex/context/base/typo-rep.lua
index 6fde21482c7..5ecff558623 100644
--- a/Master/texmf-dist/tex/context/base/typo-rep.lua
+++ b/Master/texmf-dist/tex/context/base/typo-rep.lua
@@ -13,21 +13,28 @@ if not modules then modules = { } end modules ['typo-rep'] = {
local trace_stripping = false trackers.register("nodes.stripping", function(v) trace_stripping = v end)
trackers.register("fonts.stripping", function(v) trace_stripping = v end)
+local report_stripping = logs.reporter("fonts","stripping")
+
+local nodes, node = nodes, node
+
local delete_node = nodes.delete
local replace_node = nodes.replace
local copy_node = node.copy
local has_attribute = node.has_attribute
-local chardata = characters.data
-local collected = false
-local glyph = node.id("glyph")
-local attribute = attributes.private("stripping")
-local fontdata = fonts.ids
+local chardata = characters.data
+local collected = false
+local attribute = attributes.private("stripping")
+local fontdata = fonts.hashes.identifiers
+local tasks = nodes.tasks
+
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
+
+-- todo: other namespace -> typesetters
-nodes.stripping = nodes.stripping or { }
-local stripping = nodes.stripping
-stripping.glyphs = stripping.glyphs or { }
-local glyphs = stripping.glyphs
+nodes.stripping = nodes.stripping or { } local stripping = nodes.stripping
+stripping.glyphs = stripping.glyphs or { } local glyphs = stripping.glyphs
local function initialize()
for k,v in next, chardata do
@@ -43,29 +50,29 @@ end
local function process(what,head,current,char)
if what == true then
if trace_stripping then
- logs.report("fonts","deleting 0x%05X from text",char)
+ report_stripping("deleting 0x%05X from text",char)
end
head, current = delete_node(head,current)
elseif type(what) == "function" then
head, current = what(head,current)
current = current.next
if trace_stripping then
- logs.report("fonts","processing 0x%05X in text",char)
+ report_stripping("processing 0x%05X in text",char)
end
elseif what then -- assume node
head, current = replace_node(head,current,copy_node(what))
current = current.next
if trace_stripping then
- logs.report("fonts","replacing 0x%05X in text",char)
+ report_stripping("replacing 0x%05X in text",char)
end
end
return head, current
end
-function nodes.stripping.process(head)
+function nodes.handlers.stripping(head)
local current, done = head, false
while current do
- if current.id == glyph then
+ if current.id == glyph_code then
-- it's more efficient to keep track of what needs to be kept
local todo = has_attribute(current,attribute)
if todo == 1 then
@@ -87,49 +94,11 @@ function nodes.stripping.process(head)
return head, done
end
-tasks.appendaction("processors","fonts","nodes.stripping.process",nil,"nodes.process_characters")
-tasks.disableaction("processors","nodes.stripping.process")
+tasks.appendaction("processors","fonts","nodes.handlers.stripping",nil,"nodes.handlers.characters")
+tasks.disableaction("processors","nodes.handlers.stripping")
function nodes.stripping.enable()
if initialize then initialize() end
- tasks.enableaction("processors","nodes.stripping.process")
+ tasks.enableaction("processors","nodes.handlers.stripping")
function nodes.stripping.enable() end
end
-
--- bonus:
-
-local initializers, methods = fonts.initializers, fonts.methods
-
-local function processformatters(head,font)
- local how = fontdata[font].shared.features.formatters -- slow
- if how == nil or how == "strip" then -- nil when forced
- local current, done = head, false
- while current do
- if current.id == glyph and current.subtype<256 and current.font == font then
- local char = current.char
- local what = glyphs[char]
- if what then
- head, current = process(what,head,current,char)
- done = true
- else -- handling of spacing etc has to be done elsewhere
- current = current.next
- end
- else
- current = current.next
- end
- end
- return head, done
- else
- return head, false
- end
-end
-
-function initializers.common.formatters(tfmdata,value)
- if initialize then initialize() end
-end
-
-initializers.base.otf.formatters = initializers.common.formatters
-initializers.node.otf.formatters = initializers.common.formatters
-
-methods.node.otf.formatters = processformatters
-methods.base.otf.formatters = processformatters
diff --git a/Master/texmf-dist/tex/context/base/typo-rep.mkiv b/Master/texmf-dist/tex/context/base/typo-rep.mkiv
index 2f1d8b4cbee..75902d7be37 100644
--- a/Master/texmf-dist/tex/context/base/typo-rep.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-rep.mkiv
@@ -15,8 +15,8 @@
% experimental stripping
-%D For a while we had stripping built into the analyzer. Khaled
-%D suggested to generalize this so I changed the code into a
+%D For a while we had stripping of special chars built into the analyzer
+%D but Khaled suggested to generalize this so I changed the code into a
%D manipulator there.
%D
%D \starttyping
@@ -35,7 +35,7 @@
\registerctxluafile{typo-rep}{1.001}
-\definesystemattribute[stripping] \chardef\strippingattribute \dogetattributeid{stripping}
+\definesystemattribute[stripping][public]
\def\setcharacterstripping
{\ctxlua{nodes.stripping.enable()}%
@@ -48,6 +48,6 @@
% maybe .. this might disappear, but is handy for testing
\def\forcecharacterstripping % secret command
- {\ctxlua{fonts.otf.features.register("formatters",true)}}
+ {\ctxlua{fonts.handlers.otf.features.register("formatters",true)}}
\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/typo-spa.lua b/Master/texmf-dist/tex/context/base/typo-spa.lua
index 48c7263c70e..e81a59bda95 100644
--- a/Master/texmf-dist/tex/context/base/typo-spa.lua
+++ b/Master/texmf-dist/tex/context/base/typo-spa.lua
@@ -13,47 +13,52 @@ local utf = unicode.utf8
local next, type = next, type
local utfchar = utf.char
-local trace_hspacing = false trackers.register("nodes.hspacing", function(v) trace_hspacing = v end)
+local trace_spacing = false trackers.register("typesetters.spacing", function(v) trace_spacing = v end)
+
+local report_spacing = logs.reporter("typesetting","spacing")
+
+local nodes, fonts, node = nodes, fonts, node
local has_attribute = node.has_attribute
local unset_attribute = node.unset_attribute
local insert_node_before = node.insert_before
local insert_node_after = node.insert_after
local remove_node = nodes.remove
-local make_penalty_node = nodes.penalty
-local make_glue_node = nodes.glue
-local glyph = node.id("glyph")
-local fontdata = fonts.identifiers
-local quaddata = fonts.quads
+local fonthashes = fonts.hashes
+local fontdata = fonthashes.identifiers
+local quaddata = fonthashes.quads
-spacings = spacings or { }
-spacings.mapping = spacings.mapping or { }
-spacings.attribute = attributes.private("spacing")
+local texattribute = tex.attribute
-storage.register("spacings/mapping", spacings.mapping, "spacings.mapping")
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
-function spacings.setspacing(id,char,left,right,alternative)
- local mapping = spacings.mapping[id]
- if not mapping then
- mapping = { }
- spacings.mapping[id] = mapping
- end
- local map = mapping[char]
- if not map then
- map = { }
- mapping[char] = map
- end
- map.left, map.right, map.alternative = left, right, alternative
-end
+local nodepool = nodes.pool
+local tasks = nodes.tasks
+
+local new_penalty = nodepool.penalty
+local new_glue = nodepool.glue
-function spacings.process(namespace,attribute,head)
+typesetters = typesetters or { }
+local typesetters = typesetters
+
+typesetters.spacings = typesetters.spacings or { }
+local spacings = typesetters.spacings
+
+spacings.mapping = spacings.mapping or { }
+local a_spacings = attributes.private("spacing")
+spacings.attribute = a_spacings
+
+storage.register("typesetters/spacings/mapping", spacings.mapping, "typesetters.spacings.mapping")
+
+local function process(namespace,attribute,head)
local done, mapping = false, spacings.mapping
local start = head
-- head is always begin of par (whatsit), so we have at least two prev nodes
-- penalty followed by glue
while start do
- if start.id == glyph then
+ if start.id == glyph_code then
local attr = has_attribute(start,attribute)
if attr and attr > 0 then
local map = mapping[attr]
@@ -61,7 +66,9 @@ function spacings.process(namespace,attribute,head)
map = map[start.char]
unset_attribute(start,attribute) -- needed?
if map then
- local left, right, alternative = map.left, map.right, map.alternative
+ local left = map.left
+ local right = map.right
+ local alternative = map.alternative
local quad = quaddata[start.font]
local prev = start.prev
if left and left ~= 0 and prev then
@@ -72,19 +79,16 @@ function spacings.process(namespace,attribute,head)
local prevprev = prev.prev
local somepenalty = nodes.somepenalty(prevprev,10000)
if somepenalty then
- if trace_hspacing then
- logs.report("spacing","removing penalty and space before %s", utfchar(start.char))
+ if trace_spacing then
+ report_spacing("removing penalty and space before %s (left)", utfchar(start.char))
end
head, _ = remove_node(head,prev,true)
head, _ = remove_node(head,prevprev,true)
else
- local somespace = nodes.somespace(prev,true)
- if somespace then
- if trace_hspacing then
- logs.report("spacing","removing space before %s", utfchar(start.char))
- end
- head, _ = remove_node(head,prev,true)
+ if trace_spacing then
+ report_spacing("removing space before %s (left)", utfchar(start.char))
end
+ head, _ = remove_node(head,prev,true)
end
end
ok = true
@@ -92,11 +96,11 @@ function spacings.process(namespace,attribute,head)
ok = not (nodes.somespace(prev,true) and nodes.somepenalty(prev.prev,true)) or nodes.somespace(prev,true)
end
if ok then
- if trace_hspacing then
- logs.report("spacing","inserting penalty and space before %s", utfchar(start.char))
+ if trace_spacing then
+ report_spacing("inserting penalty and space before %s (left)", utfchar(start.char))
end
- insert_node_before(head,start,make_penalty_node(10000))
- insert_node_before(head,start,make_glue_node(tex.scale(quad,left)))
+ insert_node_before(head,start,new_penalty(10000))
+ insert_node_before(head,start,new_glue(tex.scale(quad,left)))
done = true
end
end
@@ -109,8 +113,8 @@ function spacings.process(namespace,attribute,head)
local nextnext = next.next
local somespace = nodes.somespace(nextnext,true)
if somespace then
- if trace_hspacing then
- logs.report("spacing","removing penalty and space after %s", utfchar(start.char))
+ if trace_spacing then
+ report_spacing("removing penalty and space after %s (right)", utfchar(start.char))
end
head, _ = remove_node(head,next,true)
head, _ = remove_node(head,nextnext,true)
@@ -118,8 +122,8 @@ function spacings.process(namespace,attribute,head)
else
local somespace = nodes.somespace(next,true)
if somespace then
- if trace_hspacing then
- logs.report("spacing","removing space after %s", utfchar(start.char))
+ if trace_spacing then
+ report_spacing("removing space after %s (right)", utfchar(start.char))
end
head, _ = remove_node(head,next,true)
end
@@ -129,11 +133,11 @@ function spacings.process(namespace,attribute,head)
ok = not (nodes.somepenalty(next,10000) and nodes.somespace(next.next,true)) or nodes.somespace(next,true)
end
if ok then
- if trace_hspacing then
- logs.report("spacing","inserting penalty and space after %s", utfchar(start.char))
+ if trace_spacing then
+ report_spacing("inserting penalty and space after %s (right)", utfchar(start.char))
end
- insert_node_after(head,start,make_glue_node(tex.scale(quad,right)))
- insert_node_after(head,start,make_penalty_node(10000))
+ insert_node_after(head,start,new_glue(tex.scale(quad,right)))
+ insert_node_after(head,start,new_penalty(10000))
done = true
end
end
@@ -146,22 +150,32 @@ function spacings.process(namespace,attribute,head)
return head, done
end
-lists.handle_spacing = nodes.install_attribute_handler {
- name = "spacing",
- namespace = spacings,
- processor = spacings.process,
-}
+local enabled = false
+
+function spacings.setup(id,char,left,right,alternative)
+ local mapping = spacings.mapping[id]
+ if not mapping then
+ mapping = { }
+ spacings.mapping[id] = mapping
+ end
+ local map = mapping[char]
+ if not map then
+ map = { }
+ mapping[char] = map
+ end
+ map.left, map.right, map.alternative = left, right, alternative
+end
-function spacings.enable()
- tasks.enableaction("processors","lists.handle_spacing")
+function spacings.set(id)
+ if not enabled then
+ tasks.enableaction("processors","typesetters.spacings.handler")
+ enabled = true
+ end
+ texattribute[a_spacings] = id
end
---~ local data = {
---~ name = "spacing",
---~ namespace = spacings,
---~ processor = spacings.process,
---~ }
---~ nodes.process_attribute = process_attribute
---~ function lists.handle_spacing(head)
---~ return process_attribute(head,data)
---~ end
+spacings.handler = nodes.installattributehandler {
+ name = "spacing",
+ namespace = spacings,
+ processor = process,
+}
diff --git a/Master/texmf-dist/tex/context/base/typo-spa.mkiv b/Master/texmf-dist/tex/context/base/typo-spa.mkiv
index e059b62e454..7a72e95adae 100644
--- a/Master/texmf-dist/tex/context/base/typo-spa.mkiv
+++ b/Master/texmf-dist/tex/context/base/typo-spa.mkiv
@@ -17,7 +17,7 @@
\registerctxluafile{typo-spa}{1.001}
-\definesystemattribute[spacing] \chardef\spacingattribute \dogetattributeid{spacing}
+\definesystemattribute[spacing][public]
% experimental spacing
%
@@ -38,20 +38,22 @@
{\ifcsname\??ch:#1\endcsname
\begingroup % for the moment we use modes, in ordere to avoid interface translation
\getparameters[\??ch][\c!left=0,\c!right=0,\c!alternative=0,#3]%
- \ctxlua{spacings.setspacing(\getvalue{\??ch:#1},\number#2,\@@chleft,\@@chright,\@@chalternative)}%
+ \ctxlua{typesetters.spacings.setup(\getvalue{\??ch:#1},\number#2,\@@chleft,\@@chright,\@@chalternative)}%
\endgroup
\fi}
-\def\setcharacterspacing
- {\ctxlua{spacings.enable()}%
- \gdef\setcharacterspacing[##1]{\attribute\spacingattribute\csname\??ch:##1\endcsname\relax}%
- \setcharacterspacing}
+\unexpanded\def\setcharacterspacing[#1]%
+ {\ctxlua{typesetters.spacings.set(\number\csname\??ch:#1\endcsname)}}
-\def\resetcharacterspacing
+\unexpanded\def\resetcharacterspacing % fast one
{\attribute\spacingattribute\attributeunsetvalue}
\letvalue{\??ch:\s!reset}\attributeunsetvalue
+\appendtoks
+ \resetcharacterspacing
+\to \everyresettypesetting
+
% \setcharacterspacing[frenchpunctuation]
% «\type{bla}»\crlf « \type{bla}»\crlf
% «bla »\crlf « bla»\crlf « bla »\crlf
diff --git a/Master/texmf-dist/tex/context/base/unic-003.mkii b/Master/texmf-dist/tex/context/base/unic-003.mkii
index d37563d264c..3f994a662e4 100644
--- a/Master/texmf-dist/tex/context/base/unic-003.mkii
+++ b/Master/texmf-dist/tex/context/base/unic-003.mkii
@@ -136,7 +136,7 @@
\strippedcsname \unknownchar \or
\strippedcsname \unknownchar \or % kappa alt
\strippedcsname \greekrhoalt \or
- \strippedcsname \unknownchar \or
+ \strippedcsname \greeksigmalunate \or
\strippedcsname \unknownchar \or
\strippedcsname \unknownchar \or
\strippedcsname \greekepsilonalt \else
diff --git a/Master/texmf-dist/tex/context/base/unic-004.mkii b/Master/texmf-dist/tex/context/base/unic-004.mkii
index b6e210193a7..67ce877288a 100644
--- a/Master/texmf-dist/tex/context/base/unic-004.mkii
+++ b/Master/texmf-dist/tex/context/base/unic-004.mkii
@@ -284,8 +284,8 @@
% Мама и Папа % Some russian characters
% \stopbuffer
%
-% \chardef\utfunicodetracer=0 \blank \getbuffer \blank
-% \chardef\utfunicodetracer=2 \blank \getbuffer \blank
-% \chardef\utfunicodetracer=7 \blank \getbuffer \blank
+% \utfunicodetracer=0 \blank \getbuffer \blank
+% \utfunicodetracer=2 \blank \getbuffer \blank
+% \utfunicodetracer=7 \blank \getbuffer \blank
%
% \stoptext
diff --git a/Master/texmf-dist/tex/context/base/unic-ini.lua b/Master/texmf-dist/tex/context/base/unic-ini.lua
new file mode 100644
index 00000000000..cca1f06175a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/unic-ini.lua
@@ -0,0 +1,19 @@
+if not modules then modules = { } end modules ['unic-ini'] = {
+ version = 1.001,
+ comment = "companion to unic-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+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))
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/unic-ini.mkii b/Master/texmf-dist/tex/context/base/unic-ini.mkii
index f386494f2cd..7e358341ddd 100644
--- a/Master/texmf-dist/tex/context/base/unic-ini.mkii
+++ b/Master/texmf-dist/tex/context/base/unic-ini.mkii
@@ -25,7 +25,7 @@
% Ññ
% ÒÓÔÕÖòóôõö
% Øø
-% ÙÚÛÜùúû
+% ÙÚÛÜùúûü
% Ýýÿ
% ß
@@ -276,10 +276,10 @@
%D By default, the converter produces a character representation,
%D but for tracing purposes, you can set a trace option.
-\chardef\utfunicodetracer=0
+\newconstant\utfunicodetracer
%D \def\TraceUnic#1%
-%D {\chardef\utfunicodetracer#1\relax\enableregime[utf]Ű}
+%D {\utfunicodetracer#1\relax\enableregime[utf]Ű}
%D
%D \starttabulate[|c|c|c|c|c|c|]
%D \NC option \NC number\NC mapping\NC glyph\NC string\NC example \NC \NR
@@ -317,7 +317,7 @@
%D \startbuffer
%D \enableregime[utf] \dostepwiserecurse{0}{8}{1}
%D {\recurselevel:
-%D \chardef\utfunicodetracer=\recurselevel aap‒noot coördinatie – één
+%D \utfunicodetracer\recurselevel aap‒noot coördinatie – één
%D \crlf}
%D \stopbuffer
%D
@@ -761,8 +761,8 @@
%D Goodies:
-\fetchruntimecommand \showunicodevector {\f!unicprefix\s!run.mkii}
-\fetchruntimecommand \showunicodetable {\f!unicprefix\s!run.mkii}
+\fetchruntimecommand \showunicodevector {\f!unicprefix\s!run}
+\fetchruntimecommand \showunicodetable {\f!unicprefix\s!run}
%D Well, let's at least preload a few familiar ones. Here we
%D also load the \UTF\ regime.
diff --git a/Master/texmf-dist/tex/context/base/unic-ini.mkiv b/Master/texmf-dist/tex/context/base/unic-ini.mkiv
index 51c300e4ca4..62fd822429e 100644
--- a/Master/texmf-dist/tex/context/base/unic-ini.mkiv
+++ b/Master/texmf-dist/tex/context/base/unic-ini.mkiv
@@ -13,14 +13,26 @@
\writestatus{loading}{ConTeXt Unicode Support / Initialization}
+\registerctxluafile{unic-ini}{1.001}
+
\unprotect
-\let \keeputfcharacters\relax % used in xtag
-\chardef\utfunicodetracer \zerocount % used in xtag
+\let\keeputfcharacters\relax % used in xtag
+\newconstant\utfunicodetracer % used in xtag
-\def\unicodechar #1{\char\numexpr#1\relax} % no lookahead
+%def\unicodechar #1{\char\numexpr#1\relax} % no lookahead
\def\unicodenumber #1{\the \numexpr#1\relax} % no lookahead
-\def\unicodehexnumber#1{\ctxlua{tex.sprint(number.toevenhex(\number#1))}}
+\def\unicodehexnumber#1{\cldcontext{number.toevenhex(\number#1))}}
+
+%D Better is:
+%D
+%D \startbuffer
+%D \unicodechar{left square bracket}okay\unicodechar{right square bracket}
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+\def\unicodechar #1{\ctxcommand{unicodechar("#1")}}
\unexpanded\def\unknownchar{{\hbox{\vrule\!!width.5em\!!height1ex\!!depth\zeropoint}}}
diff --git a/Master/texmf-dist/tex/context/base/unic-run.mkii b/Master/texmf-dist/tex/context/base/unic-run.mkii
index b8e154fd45d..09c70151189 100644
--- a/Master/texmf-dist/tex/context/base/unic-run.mkii
+++ b/Master/texmf-dist/tex/context/base/unic-run.mkii
@@ -39,8 +39,8 @@
\stoptable}
%D \starttyping
-%D \chardef\utfunicodetracer=0
-%D \chardef\utfunicodetracer=7
+%D \utfunicodetracer=0
+%D \utfunicodetracer=7
%D
%D \showunicodevector[000]
%D \showunicodevector[001]
@@ -66,11 +66,11 @@
\dostepwiserecurse{0}{15}{1}
{\bTD
\edef\entrypoint{\the\numexpr#1*256+#2+##1*16\relax}%
- \chardef\utfunicodetracer0{\dontleavehmode \strut\unicodechar\entrypoint\endgraf}%
+ \utfunicodetracer\zerocount{\dontleavehmode \strut\unicodechar\entrypoint\endgraf}%
\tt
- \chardef\utfunicodetracer7{\dontleavehmode\txx\strut\unicodechar\entrypoint\endgraf}%
- \chardef\utfunicodetracer3{\dontleavehmode\txx\strut\unicodechar\entrypoint\endgraf}%
- \chardef\utfunicodetracer8{\dontleavehmode\txx\strut\unicodechar\entrypoint\endgraf}%
+ \utfunicodetracer\plusseven{\dontleavehmode\txx\strut\unicodechar\entrypoint\endgraf}%
+ \utfunicodetracer\plusthree{\dontleavehmode\txx\strut\unicodechar\entrypoint\endgraf}%
+ \utfunicodetracer\pluseight{\dontleavehmode\txx\strut\unicodechar\entrypoint\endgraf}%
\eTD}%
\bTD\uchexnumber{#2}\eTD
\eTR}
diff --git a/Master/texmf-dist/tex/context/base/util-deb.lua b/Master/texmf-dist/tex/context/base/util-deb.lua
new file mode 100644
index 00000000000..ce55de5c7cb
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/util-deb.lua
@@ -0,0 +1,157 @@
+if not modules then modules = { } end modules ['util.deb'] = {
+ 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"
+}
+
+-- the <anonymous> tag is kind of generic and used for functions that are not
+-- bound to a variable, like node.new, node.copy etc (contrary to for instance
+-- node.has_attribute which is bound to a has_attribute local variable in mkiv)
+
+local debug = require "debug"
+
+local getinfo = debug.getinfo
+local type, next, tostring = type, next, tostring
+local format, find = string.format, string.find
+local is_boolean = string.is_boolean
+
+utilities = utilities or { }
+utilities.debugger = utilities.debugger or { }
+local debugger = utilities.debugger
+
+local counters = { }
+local names = { }
+
+-- one
+
+local function hook()
+ local f = getinfo(2,"f").func
+ local n = getinfo(2,"Sn")
+-- if n.what == "C" and n.name then print (n.namewhat .. ': ' .. n.name) end
+ if f then
+ local cf = counters[f]
+ if cf == nil then
+ counters[f] = 1
+ names[f] = n
+ else
+ counters[f] = cf + 1
+ end
+ end
+end
+
+local function getname(func)
+ local n = names[func]
+ if n then
+ if n.what == "C" then
+ return n.name or '<anonymous>'
+ else
+ -- source short_src linedefined what name namewhat nups func
+ local name = n.name or n.namewhat or n.what
+ if not name or name == "" then name = "?" end
+ return format("%s : %s : %s", n.short_src or "unknown source", n.linedefined or "--", name)
+ end
+ else
+ return "unknown"
+ end
+end
+
+function debugger.showstats(printer,threshold)
+ printer = printer or texio.write or print
+ threshold = threshold or 0
+ local total, grandtotal, functions = 0, 0, 0
+ printer("\n") -- ugly but ok
+ -- table.sort(counters)
+ for func, count in next, counters do
+ if count > threshold then
+ local name = getname(func)
+ if not find(name,"for generator") then
+ printer(format("%8i %s", count, name))
+ total = total + count
+ end
+ end
+ grandtotal = grandtotal + count
+ functions = functions + 1
+ end
+ printer(format("functions: %s, total: %s, grand total: %s, threshold: %s\n", functions, total, grandtotal, threshold))
+end
+
+-- two
+
+--~ local function hook()
+--~ local n = getinfo(2)
+--~ if n.what=="C" and not n.name then
+--~ local f = tostring(debug.traceback())
+--~ local cf = counters[f]
+--~ if cf == nil then
+--~ counters[f] = 1
+--~ names[f] = n
+--~ else
+--~ counters[f] = cf + 1
+--~ end
+--~ end
+--~ end
+--~ function debugger.showstats(printer,threshold)
+--~ printer = printer or texio.write or print
+--~ threshold = threshold or 0
+--~ local total, grandtotal, functions = 0, 0, 0
+--~ printer("\n") -- ugly but ok
+--~ -- table.sort(counters)
+--~ for func, count in next, counters do
+--~ if count > threshold then
+--~ printer(format("%8i %s", count, func))
+--~ total = total + count
+--~ end
+--~ grandtotal = grandtotal + count
+--~ functions = functions + 1
+--~ end
+--~ printer(format("functions: %s, total: %s, grand total: %s, threshold: %s\n", functions, total, grandtotal, threshold))
+--~ end
+
+-- rest
+
+function debugger.savestats(filename,threshold)
+ local f = io.open(filename,'w')
+ if f then
+ debugger.showstats(function(str) f:write(str) end,threshold)
+ f:close()
+ end
+end
+
+function debugger.enable()
+ debug.sethook(hook,"c")
+end
+
+function debugger.disable()
+ debug.sethook()
+--~ counters[debug.getinfo(2,"f").func] = nil
+end
+
+--~ debugger.enable()
+
+--~ print(math.sin(1*.5))
+--~ print(math.sin(1*.5))
+--~ print(math.sin(1*.5))
+--~ print(math.sin(1*.5))
+--~ print(math.sin(1*.5))
+
+--~ debugger.disable()
+
+--~ print("")
+--~ debugger.showstats()
+--~ print("")
+--~ debugger.showstats(print,3)
+
+local is_node = node and node.is_node
+
+function inspect(i) -- global function
+ local ti = type(i)
+ if ti == "table" then
+ table.print(i,"table")
+ elseif is_node and is_node(i) then
+ table.print(nodes.astable(i),tostring(i))
+ else
+ print(tostring(i))
+ end
+end
diff --git a/Master/texmf-dist/tex/context/base/l-dimen.lua b/Master/texmf-dist/tex/context/base/util-dim.lua
index da5ab143e58..4e2cc166265 100644
--- a/Master/texmf-dist/tex/context/base/l-dimen.lua
+++ b/Master/texmf-dist/tex/context/base/util-dim.lua
@@ -1,4 +1,4 @@
-if not modules then modules = { } end modules ['l-dimen'] = {
+if not modules then modules = { } end modules ['util-dim'] = {
version = 1.001,
comment = "support for dimensions",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -18,12 +18,18 @@ table.</p>
local format, match, gsub, type, setmetatable = string.format, string.match, string.gsub, type, setmetatable
local P, S, R, Cc, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.Cc, lpeg.match
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
+
+--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
-local dimenfactors = {
+local dimenfactors = allocate {
["pt"] = 1/65536,
["in"] = ( 100/ 7227)/65536,
["cm"] = ( 254/ 7227)/65536,
@@ -80,9 +86,7 @@ local dimenfactors = {
format (string) is implemented using this table.</p>
--ldx]]--
--- was:
-
-local function todimen(n,unit,fmt)
+local function numbertodimen(n,unit,fmt)
if type(n) == 'string' then
return n
else
@@ -101,21 +105,21 @@ end
--ldx]]--
number.maxdimen = 1073741823
-number.todimen = todimen
+number.todimen = numbertodimen
number.dimenfactors = dimenfactors
-function number.topoints (n) return todimen(n,"pt") end
-function number.toinches (n) return todimen(n,"in") end
-function number.tocentimeters (n) return todimen(n,"cm") end
-function number.tomillimeters (n) return todimen(n,"mm") end
-function number.toscaledpoints(n) return todimen(n,"sp") end
-function number.toscaledpoints(n) return n .. "sp" end
-function number.tobasepoints (n) return todimen(n,"bp") end
-function number.topicas (n) return todimen(n "pc") end
-function number.todidots (n) return todimen(n,"dd") end
-function number.tociceros (n) return todimen(n,"cc") end
-function number.tonewdidots (n) return todimen(n,"nd") end
-function number.tonewciceros (n) return todimen(n,"nc") end
+function number.topoints (n) return numbertodimen(n,"pt") end
+function number.toinches (n) return numbertodimen(n,"in") end
+function number.tocentimeters (n) return numbertodimen(n,"cm") end
+function number.tomillimeters (n) return numbertodimen(n,"mm") end
+function number.toscaledpoints(n) return numbertodimen(n,"sp") end
+function number.toscaledpoints(n) return n .. "sp" end
+function number.tobasepoints (n) return numbertodimen(n,"bp") end
+function number.topicas (n) return numbertodimen(n "pc") end
+function number.todidots (n) return numbertodimen(n,"dd") end
+function number.tociceros (n) return numbertodimen(n,"cc") end
+function number.tonewdidots (n) return numbertodimen(n,"nd") end
+function number.tonewciceros (n) return numbertodimen(n,"nc") end
--[[ldx--
<p>More interesting it to implement a (sort of) dimen datatype, one
@@ -138,21 +142,28 @@ the table with factors, the metatable will be consulted for an
alternative index function.</p>
--ldx]]--
-local mt = { } setmetatable(dimenfactors,mt)
-
-mt.__index = function(t,s)
+setmetatableindex(dimenfactors, function(t,s)
-- error("wrong dimension: " .. (s or "?")) -- better a message
return false
-end
+end)
-function string:todimen()
- if type(self) == "number" then
- return self
- else
- local value, unit = lpegmatch(dimenpair,self)
- return value/unit
- end
-end
+--[[ldx--
+<p>We redefine the following function later on, so we comment it
+here (which saves us bytecodes.</p>
+--ldx]]--
+
+-- function string.todimen(str)
+-- if type(str) == "number" then
+-- return str
+-- else
+-- local value, unit = lpegmatch(dimenpair,str)
+-- return value/unit
+-- end
+-- end
+--
+-- local stringtodimen = string.todimen
+
+local stringtodimen -- assigned later (commenting saves bytecode)
local amount = S("+-")^0 * R("09")^0 * S(".,")^0 * R("09")^0
local unit = P("pt") + P("cm") + P("mm") + P("sp") + P("bp") + P("in") +
@@ -160,7 +171,7 @@ local unit = P("pt") + P("cm") + P("mm") + P("sp") + P("bp") + P("in") +
local validdimen = amount * unit
-lpeg.patterns.validdimen = pattern
+lpeg.patterns.validdimen = validdimen
--[[ldx--
<p>This converter accepts calls like:</p>
@@ -174,12 +185,6 @@ string.todimen("10pt")
string.todimen("10.0pt")
</typing>
-<p>And of course the often more efficient:</p>
-
-<typing>
-somestring:todimen("12.3cm")
-</typing>
-
<p>With this in place, we can now implement a proper datatype for dimensions, one
that permits us to do this:</p>
@@ -197,28 +202,28 @@ local dimensions = { }
<p>The main (and globally) visible representation of a dimen is defined next: it is
a one-element table. The unit that is returned from the match is normally a number
(one of the previously defined factors) but we also accept functions. Later we will
-see why.</p>
+see why. This function is redefined later.</p>
--ldx]]--
-function dimen(a)
- if a then
- local ta= type(a)
- if ta == "string" then
- local value, unit = lpegmatch(pattern,a)
- if type(unit) == "function" then
- k = value/unit()
- else
- k = value/unit
- end
- a = k
- elseif ta == "table" then
- a = a[1]
- end
- return setmetatable({ a }, dimensions)
- else
- return setmetatable({ 0 }, dimensions)
- end
-end
+-- function dimen(a)
+-- if a then
+-- local ta= type(a)
+-- if ta == "string" then
+-- local value, unit = lpegmatch(pattern,a)
+-- if type(unit) == "function" then
+-- k = value/unit()
+-- else
+-- k = value/unit
+-- end
+-- a = k
+-- elseif ta == "table" then
+-- a = a[1]
+-- end
+-- return setmetatable({ a }, dimensions)
+-- else
+-- return setmetatable({ 0 }, dimensions)
+-- end
+-- end
--[[ldx--
<p>This function return a small hash with a metatable attached. It is
@@ -228,35 +233,35 @@ shared some of the code but for reasons of speed we don't.</p>
function dimensions.__add(a, b)
local ta, tb = type(a), type(b)
- if ta == "string" then a = a:todimen() elseif ta == "table" then a = a[1] end
- if tb == "string" then b = b:todimen() elseif tb == "table" then b = b[1] end
+ if ta == "string" then a = stringtodimen(a) elseif ta == "table" then a = a[1] end
+ if tb == "string" then b = stringtodimen(b) elseif tb == "table" then b = b[1] end
return setmetatable({ a + b }, dimensions)
end
function dimensions.__sub(a, b)
local ta, tb = type(a), type(b)
- if ta == "string" then a = a:todimen() elseif ta == "table" then a = a[1] end
- if tb == "string" then b = b:todimen() elseif tb == "table" then b = b[1] end
+ if ta == "string" then a = stringtodimen(a) elseif ta == "table" then a = a[1] end
+ if tb == "string" then b = stringtodimen(b) elseif tb == "table" then b = b[1] end
return setmetatable({ a - b }, dimensions)
end
function dimensions.__mul(a, b)
local ta, tb = type(a), type(b)
- if ta == "string" then a = a:todimen() elseif ta == "table" then a = a[1] end
- if tb == "string" then b = b:todimen() elseif tb == "table" then b = b[1] end
+ if ta == "string" then a = stringtodimen(a) elseif ta == "table" then a = a[1] end
+ if tb == "string" then b = stringtodimen(b) elseif tb == "table" then b = b[1] end
return setmetatable({ a * b }, dimensions)
end
function dimensions.__div(a, b)
local ta, tb = type(a), type(b)
- if ta == "string" then a = a:todimen() elseif ta == "table" then a = a[1] end
- if tb == "string" then b = b:todimen() elseif tb == "table" then b = b[1] end
+ if ta == "string" then a = stringtodimen(a) elseif ta == "table" then a = a[1] end
+ if tb == "string" then b = stringtodimen(b) elseif tb == "table" then b = b[1] end
return setmetatable({ a / b }, dimensions)
end
function dimensions.__unm(a)
local ta = type(a)
- if ta == "string" then a = a:todimen() elseif ta == "table" then a = a[1] end
+ if ta == "string" then a = stringtodimen(a) elseif ta == "table" then a = a[1] end
return setmetatable({ - a }, dimensions)
end
@@ -321,23 +326,9 @@ is loaded, the relevant tables that hold the functions needed may not
yet be available.</p>
--ldx]]--
-function dimensions.texify() -- todo: %
- local fti, fc = fonts and fonts.ids and fonts.ids, font and font.current
- if fti and fc then
- dimenfactors["ex"] = function() return fti[fc()].ex_height end
- dimenfactors["em"] = function() return fti[fc()].quad end
- else
- dimenfactors["ex"] = 1/65536* 4 -- 4pt
- dimenfactors["em"] = 1/65536*10 -- 10pt
- end
-end
-
---[[ldx--
-<p>In order to set the defaults we call this function now. At some point
-the macro package needs to make sure the function is called again.</p>
---ldx]]--
-
-dimensions.texify()
+ dimenfactors["ex"] = 4 * 1/65536 -- 4pt
+ dimenfactors["em"] = 10 * 1/65536 -- 10pt
+-- dimenfactors["%"] = 4 * 1/65536 -- 400pt/100
--[[ldx--
<p>The previous code is rather efficient (also thanks to <l n='lpeg'/>) but we
@@ -389,27 +380,40 @@ function dimen(a)
end
end
-function string:todimen()
- if type(self) == "number" then
- return self
+function string.todimen(str) -- maybe use tex.sp when available
+ if type(str) == "number" then
+ return str
else
- local k = known[self]
+ local k = known[str]
if not k then
- local value, unit = lpegmatch(dimenpair,self)
+ local value, unit = lpegmatch(dimenpair,str)
if value and unit then
- k = value/unit
+ k = value/unit -- to be considered: round
else
k = 0
end
- -- print(self,value,unit)
- known[self] = k
+ -- print(str,value,unit)
+ known[str] = k
end
return k
end
end
+--~ local known = { }
+
+--~ function string.todimen(str) -- maybe use tex.sp
+--~ local k = known[str]
+--~ if not k then
+--~ k = tex.sp(str)
+--~ known[str] = k
+--~ end
+--~ return k
+--~ end
+
+stringtodimen = string.todimen -- local variable defined earlier
+
function number.toscaled(d)
- return format("0.5f",d/2^16)
+ return format("%0.5f",d/2^16)
end
--[[ldx--
@@ -424,7 +428,7 @@ probably use a hash instead of a one-element table.</p>
function number.percent(n) -- will be cleaned up once luatex 0.30 is out
local hsize = tex.hsize
if type(hsize) == "string" then
- hsize = hsize:todimen()
+ hsize = stringtodimen(hsize)
end
return (n/100) * hsize
end
diff --git a/Master/texmf-dist/tex/context/base/util-fmt.lua b/Master/texmf-dist/tex/context/base/util-fmt.lua
new file mode 100644
index 00000000000..e049d0b94b3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/util-fmt.lua
@@ -0,0 +1,96 @@
+if not modules then modules = { } end modules ['util-fmt'] = {
+ 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"
+}
+
+utilities = utilities or { }
+utilities.formatters = utilities.formatters or { }
+local formatters = utilities.formatters
+
+local concat, format = table.concat, string.format
+local tostring, type = tostring, type
+local strip = string.strip
+
+local P, R, Cs = lpeg.P, lpeg.R, lpeg.Cs
+local lpegmatch = lpeg.match
+
+-- temporary here
+
+local digit = R("09")
+local period = P(".")
+local zero = P("0")
+local trailingzeros = zero^0 * -digit -- suggested by Roberto R
+local case_1 = period * trailingzeros / ""
+local case_2 = period * (digit - trailingzeros)^1 * (trailingzeros / "")
+local number = digit^1 * (case_1 + case_2)
+local stripper = Cs((number + 1)^0)
+
+--~ local sample = "bla 11.00 bla 11 bla 0.1100 bla 1.00100 bla 0.00 bla 0.001 bla 1.1100 bla 0.100100100 bla 0.00100100100"
+--~ collectgarbage("collect")
+--~ str = string.rep(sample,10000)
+--~ local ts = os.clock()
+--~ lpegmatch(stripper,str)
+--~ print(#str, os.clock()-ts, lpegmatch(stripper,sample))
+
+lpeg.patterns.stripzeros = stripper
+
+function formatters.stripzeros(str)
+ return lpegmatch(stripper,str)
+end
+
+function formatters.formatcolumns(result,between)
+ if result and #result > 0 then
+ between = between or " "
+ local widths, numbers = { }, { }
+ local first = result[1]
+ local n = #first
+ for i=1,n do
+ widths[i] = 0
+ end
+ for i=1,#result do
+ local r = result[i]
+ for j=1,n do
+ local rj = r[j]
+ local tj = type(rj)
+ if tj == "number" then
+ numbers[j] = true
+ end
+ if tj ~= "string" then
+ rj = tostring(rj)
+ r[j] = rj
+ end
+ local w = #rj
+ if w > widths[j] then
+ widths[j] = w
+ end
+ end
+ end
+ for i=1,n do
+ local w = widths[i]
+ if numbers[i] then
+ if w > 80 then
+ widths[i] = "%s" .. between
+ else
+ widths[i] = "%0" .. w .. "i" .. between
+ end
+ else
+ if w > 80 then
+ widths[i] = "%s" .. between
+ elseif w > 0 then
+ widths[i] = "%-" .. w .. "s" .. between
+ else
+ widths[i] = "%s"
+ end
+ end
+ end
+ local template = strip(concat(widths))
+ for i=1,#result do
+ local str = format(template,unpack(result[i]))
+ result[i] = strip(str)
+ end
+ end
+ return result
+end
diff --git a/Master/texmf-dist/tex/context/base/util-lua.lua b/Master/texmf-dist/tex/context/base/util-lua.lua
new file mode 100644
index 00000000000..54c2468baf6
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/util-lua.lua
@@ -0,0 +1,48 @@
+if not modules then modules = { } end modules ['util-lua'] = {
+ 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"
+}
+
+utilities = utilities or {}
+utilities.lua = utilities.lua or { }
+utilities.report = logs and logs.reporter("system") or print
+
+function utilities.lua.compile(luafile,lucfile,cleanup,strip) -- defaults: cleanup=false strip=true
+ utilities.report("lua: compiling %s into %s",luafile,lucfile)
+ os.remove(lucfile)
+ local command = "-o " .. string.quoted(lucfile) .. " " .. string.quoted(luafile)
+ if strip ~= false then
+ command = "-s " .. command
+ end
+ local done = os.spawn("texluac " .. command) == 0 or os.spawn("luac " .. command) == 0
+ if done and cleanup == true and lfs.isfile(lucfile) and lfs.isfile(luafile) then
+ utilities.report("lua: removing %s",luafile)
+ os.remove(luafile)
+ end
+ return done
+end
+
+--~ local getmetatable, type = getmetatable, type
+
+--~ local types = { }
+
+--~ function utilities.lua.registerdatatype(d,name)
+--~ types[getmetatable(d)] = name
+--~ end
+
+--~ function utilities.lua.datatype(d)
+--~ local t = type(d)
+--~ if t == "userdata" then
+--~ local m = getmetatable(d)
+--~ return m and types[m] or "userdata"
+--~ else
+--~ return t
+--~ end
+--~ end
+
+--~ utilities.lua.registerdatatype(lpeg.P("!"),"lpeg")
+
+--~ print(utilities.lua.datatype(lpeg.P("oeps")))
diff --git a/Master/texmf-dist/tex/context/base/util-mrg.lua b/Master/texmf-dist/tex/context/base/util-mrg.lua
new file mode 100644
index 00000000000..acf04fead70
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/util-mrg.lua
@@ -0,0 +1,138 @@
+if not modules then modules = { } end modules ['util-mrg'] = {
+ 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"
+}
+
+-- hm, quite unreadable
+
+local gsub, format = string.gsub, string.format
+local concat = table.concat
+local type, next = type, next
+
+utilities = utilities or {}
+utilities.merger = utilities.merger or { } -- maybe mergers
+utilities.report = logs and logs.reporter("system") or print
+
+local merger = utilities.merger
+
+merger.strip_comment = true
+
+local m_begin_merge = "begin library merge"
+local m_end_merge = "end library merge"
+local m_begin_closure = "do -- create closure to overcome 200 locals limit"
+local m_end_closure = "end -- of closure"
+
+local m_pattern =
+ "%c+" ..
+ "%-%-%s+" .. m_begin_merge ..
+ "%c+(.-)%c+" ..
+ "%-%-%s+" .. m_end_merge ..
+ "%c+"
+
+local m_format =
+ "\n\n-- " .. m_begin_merge ..
+ "\n%s\n" ..
+ "-- " .. m_end_merge .. "\n\n"
+
+local m_faked =
+ "-- " .. "created merged file" .. "\n\n" ..
+ "-- " .. m_begin_merge .. "\n\n" ..
+ "-- " .. m_end_merge .. "\n\n"
+
+local function self_fake()
+ return m_faked
+end
+
+local function self_nothing()
+ return ""
+end
+
+local function self_load(name)
+ local data = io.loaddata(name) or ""
+ if data == "" then
+ utilities.report("merge: unknown file %s",name)
+ else
+ utilities.report("merge: inserting %s",name)
+ end
+ return data or ""
+end
+
+local function self_save(name, data)
+ if data ~= "" then
+ if merger.strip_comment then
+ -- saves some 20K
+ local n = #data
+ data = gsub(data,"%-%-~[^\n\r]*[\r\n]","")
+ utilities.report("merge: %s bytes of comment stripped, %s bytes of code left",n-#data,#data)
+ end
+ io.savedata(name,data)
+ utilities.report("merge: saving %s",name)
+ end
+end
+
+local function self_swap(data,code)
+ return data ~= "" and (gsub(data,m_pattern, function() return format(m_format,code) end, 1)) or ""
+end
+
+local function self_libs(libs,list)
+ local result, f, frozen, foundpath = { }, nil, false, nil
+ result[#result+1] = "\n"
+ if type(libs) == 'string' then libs = { libs } end
+ if type(list) == 'string' then list = { list } end
+ for i=1,#libs do
+ local lib = libs[i]
+ for j=1,#list do
+ local pth = gsub(list[j],"\\","/") -- file.clean_path
+ utilities.report("merge: checking library path %s",pth)
+ local name = pth .. "/" .. lib
+ if lfs.isfile(name) then
+ foundpath = pth
+ end
+ end
+ if foundpath then break end
+ end
+ if foundpath then
+ utilities.report("merge: using library path %s",foundpath)
+ local right, wrong = { }, { }
+ for i=1,#libs do
+ local lib = libs[i]
+ local fullname = foundpath .. "/" .. lib
+ if lfs.isfile(fullname) then
+ utilities.report("merge: using library %s",fullname)
+ right[#right+1] = lib
+ result[#result+1] = m_begin_closure
+ result[#result+1] = io.loaddata(fullname,true)
+ result[#result+1] = m_end_closure
+ else
+ utilities.report("merge: skipping library %s",fullname)
+ wrong[#wrong+1] = lib
+ end
+ end
+ if #right > 0 then
+ utilities.report("merge: used libraries: %s",concat(right," "))
+ end
+ if #wrong > 0 then
+ utilities.report("merge: skipped libraries: %s",concat(wrong," "))
+ end
+ else
+ utilities.report("merge: no valid library path found")
+ end
+ return concat(result, "\n\n")
+end
+
+function merger.selfcreate(libs,list,target)
+ if target then
+ self_save(target,self_swap(self_fake(),self_libs(libs,list)))
+ end
+end
+
+function merger.selfmerge(name,libs,list,target)
+ self_save(target or name,self_swap(self_load(name),self_libs(libs,list)))
+end
+
+function merger.selfclean(name)
+ self_save(name,self_swap(self_load(name),self_nothing()))
+end
diff --git a/Master/texmf-dist/tex/context/base/util-pck.lua b/Master/texmf-dist/tex/context/base/util-pck.lua
new file mode 100644
index 00000000000..c802a09ed81
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/util-pck.lua
@@ -0,0 +1,142 @@
+if not modules then modules = { } end modules ['util-pck'] = {
+ 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"
+}
+
+-- moved from core-uti
+
+local next, tostring, type = next, tostring, type
+local sort, concat = table.sort, table.concat
+
+utilities = utilities or { }
+utilities.packers = utilities.packers or { }
+local packers = utilities.packers
+packers.version = 1.00
+
+local function hashed(t)
+ local s, ns = { }, 0
+ for k, v in next, t do
+ ns = ns + 1
+ if type(v) == "table" then
+ s[ns] = k .. "={" .. hashed(v) .. "}"
+ else
+ s[ns] = k .. "=" .. tostring(v)
+ end
+ end
+ sort(s)
+ return concat(s,",")
+end
+
+local function simplehashed(t)
+ local s, ns = { }, 0
+ for k, v in next, t do
+ ns = ns + 1
+ s[ns] = k .. "=" .. v
+ end
+ sort(s)
+ return concat(s,",")
+end
+
+packers.hashed = hashed
+packers.simplehashed = simplehashed
+
+--~ local function pack(t,keys,hash,index)
+--~ for k,v in next, t do
+--~ if type(v) == "table" then
+--~ pack(v,keys,hash,index)
+--~ end
+--~ if keys[k] and type(v) == "table" then
+--~ local h = hashed(v)
+--~ local i = hash[h]
+--~ if not i then
+--~ i = #index + 1
+--~ index[i] = v
+--~ hash[h] = i
+--~ end
+--~ t[k] = i
+--~ end
+--~ end
+--~ end
+
+local function pack(t,keys,hash,index)
+ for k,v in next, t do
+ if type(v) == "table" then
+ pack(v,keys,hash,index)
+ if keys[k] then
+ local h = hashed(v)
+ local i = hash[h]
+ if not i then
+ i = #index + 1
+ index[i] = v
+ hash[h] = i
+ end
+ t[k] = i
+ end
+ end
+ end
+end
+
+local function unpack(t,keys,index)
+ for k,v in next, t do
+ if keys[k] and type(v) == "number" then
+ local iv = index[v]
+ if iv then
+ v = iv
+ t[k] = v
+ end
+ end
+ if type(v) == "table" then
+ unpack(v,keys,index)
+ end
+ end
+end
+
+function packers.new(keys,version)
+ return {
+ version = version or packers.version,
+ keys = table.tohash(keys),
+ hash = { },
+ index = { },
+ }
+end
+
+function packers.pack(t,p,shared)
+ if shared then
+ pack(t,p.keys,p.hash,p.index)
+ elseif not t.packer then
+ pack(t,p.keys,p.hash,p.index)
+ if #p.index > 0 then
+ t.packer = {
+ version = p.version or packers.version,
+ keys = p.keys,
+ index = p.index,
+ }
+ end
+ p.hash, p.index = { }, { }
+ end
+end
+
+function packers.unpack(t,p,shared)
+ if shared then
+ if p then
+ unpack(t,p.keys,p.index)
+ end
+ else
+ local tp = t.packer
+ if tp then
+ if tp.version == (p and p.version or packers.version) then
+ unpack(t,tp.keys,tp.index)
+ else
+ -- fatal error, wrong version
+ end
+ t.packer = nil
+ end
+ end
+end
+
+function packers.strip(p)
+ p.hash = nil
+end
diff --git a/Master/texmf-dist/tex/context/base/util-prs.lua b/Master/texmf-dist/tex/context/base/util-prs.lua
new file mode 100644
index 00000000000..59145376031
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/util-prs.lua
@@ -0,0 +1,229 @@
+if not modules then modules = { } end modules ['util-prs'] = {
+ 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 P, R, V, C, Ct, Carg = lpeg.P, lpeg.R, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Carg
+local lpegmatch = lpeg.match
+local concat, format, gmatch = table.concat, string.format, string.gmatch
+local tostring, type, next = tostring, type, next
+
+utilities = utilities or {}
+utilities.parsers = utilities.parsers or { }
+local parsers = utilities.parsers
+parsers.patterns = parsers.patterns or { }
+
+local setmetatableindex = table.setmetatableindex
+local sortedhash = table.sortedhash
+
+-- we could use a Cf Cg construct
+
+local escape, left, right = P("\\"), P('{'), P('}')
+
+lpeg.patterns.balanced = P {
+ [1] = ((escape * (left+right)) + (1 - (left+right)) + V(2))^0,
+ [2] = left * V(1) * right
+}
+
+local space = P(' ')
+local equal = P("=")
+local comma = P(",")
+local lbrace = P("{")
+local rbrace = P("}")
+local nobrace = 1 - (lbrace+rbrace)
+local nested = P { lbrace * (nobrace + V(1))^0 * rbrace }
+local spaces = space^0
+
+lpeg.patterns.nested = nested
+
+local value = P(lbrace * C((nobrace + nested)^0) * rbrace) + C((nested + (1-comma))^0)
+
+local key = C((1-equal-comma)^1)
+local pattern_a = (space+comma)^0 * (key * equal * value + key * C(""))
+local pattern_c = (space+comma)^0 * (key * equal * value)
+
+local key = C((1-space-equal-comma)^1)
+local pattern_b = spaces * comma^0 * spaces * (key * ((spaces * equal * spaces * value) + C("")))
+
+-- "a=1, b=2, c=3, d={a{b,c}d}, e=12345, f=xx{a{b,c}d}xx, g={}" : outer {} removes, leading spaces ignored
+
+local hash = { }
+
+local function set(key,value)
+ hash[key] = value
+end
+
+local function set(key,value)
+ hash[key] = value
+end
+
+local pattern_a_s = (pattern_a/set)^1
+local pattern_b_s = (pattern_b/set)^1
+local pattern_c_s = (pattern_c/set)^1
+
+parsers.patterns.settings_to_hash_a = pattern_a_s
+parsers.patterns.settings_to_hash_b = pattern_b_s
+parsers.patterns.settings_to_hash_c = pattern_c_s
+
+function parsers.make_settings_to_hash_pattern(set,how)
+ if how == "strict" then
+ return (pattern_c/set)^1
+ elseif how == "tolerant" then
+ return (pattern_b/set)^1
+ else
+ return (pattern_a/set)^1
+ end
+end
+
+function parsers.settings_to_hash(str,existing)
+ if str and str ~= "" then
+ hash = existing or { }
+ lpegmatch(pattern_a_s,str)
+ return hash
+ else
+ return { }
+ end
+end
+
+function parsers.settings_to_hash_tolerant(str,existing)
+ if str and str ~= "" then
+ hash = existing or { }
+ lpegmatch(pattern_b_s,str)
+ return hash
+ else
+ return { }
+ end
+end
+
+function parsers.settings_to_hash_strict(str,existing)
+ if str and str ~= "" then
+ hash = existing or { }
+ lpegmatch(pattern_c_s,str)
+ return next(hash) and hash
+ else
+ return nil
+ end
+end
+
+local separator = comma * space^0
+local value = P(lbrace * C((nobrace + nested)^0) * rbrace) + C((nested + (1-comma))^0)
+local pattern = Ct(value*(separator*value)^0)
+
+-- "aap, {noot}, mies" : outer {} removes, leading spaces ignored
+
+parsers.patterns.settings_to_array = pattern
+
+-- we could use a weak table as cache
+
+function parsers.settings_to_array(str)
+ if not str or str == "" then
+ return { }
+ else
+ return lpegmatch(pattern,str)
+ end
+end
+
+local function set(t,v)
+ t[#t+1] = v
+end
+
+local value = P(Carg(1)*value) / set
+local pattern = value*(separator*value)^0 * Carg(1)
+
+function parsers.add_settings_to_array(t,str)
+ return lpegmatch(pattern,str,nil,t)
+end
+
+function parsers.hash_to_string(h,separator,yes,no,strict,omit)
+ if h then
+ local t, tn, s = { }, 0, table.sortedkeys(h)
+ omit = omit and table.tohash(omit)
+ for i=1,#s do
+ local key = s[i]
+ if not omit or not omit[key] then
+ local value = h[key]
+ if type(value) == "boolean" then
+ if yes and no then
+ if value then
+ tn = tn + 1
+ t[tn] = key .. '=' .. yes
+ elseif not strict then
+ tn = tn + 1
+ t[tn] = key .. '=' .. no
+ end
+ elseif value or not strict then
+ tn = tn + 1
+ t[tn] = key .. '=' .. tostring(value)
+ end
+ else
+ tn = tn + 1
+ t[tn] = key .. '=' .. value
+ end
+ end
+ end
+ return concat(t,separator or ",")
+ else
+ return ""
+ end
+end
+
+function parsers.array_to_string(a,separator)
+ if a then
+ return concat(a,separator or ",")
+ else
+ return ""
+ 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
+end
+
+function parsers.simple_hash_to_string(h, separator)
+ local t, tn = { }, 0
+ for k, v in sortedhash(h) do
+ if v then
+ tn = tn + 1
+ t[tn] = k
+ end
+ end
+ return concat(t,separator or ",")
+end
+
+local value = lbrace * C((nobrace + nested)^0) * rbrace
+local pattern = Ct((space + value)^0)
+
+function parsers.arguments_to_table(str)
+ return lpegmatch(pattern,str)
+end
+
+-- temporary here (unoptimized)
+
+function parsers.getparameters(self,class,parentclass,settings)
+ local sc = self[class]
+ if not sc then
+ sc = { }
+ self[class] = sc
+ if parentclass then
+ local sp = self[parentclass]
+ if not sp then
+ sp = { }
+ self[parentclass] = sp
+ end
+ setmetatableindex(sc,sp)
+ end
+ end
+ parsers.settings_to_hash(settings,sc)
+end
+
+function parsers.listitem(str)
+ return gmatch(str,"[^, ]+")
+end
diff --git a/Master/texmf-dist/tex/context/base/util-seq.lua b/Master/texmf-dist/tex/context/base/util-seq.lua
new file mode 100644
index 00000000000..22733b022db
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/util-seq.lua
@@ -0,0 +1,276 @@
+if not modules then modules = { } end modules ['util-seq'] = {
+ 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"
+}
+
+--[[ldx--
+<p>Here we implement a mechanism for chaining the special functions
+that we use in <l n="context"> to deal with mode list processing. We
+assume that namespaces for the functions are used, but for speed we
+use locals to refer to them when compiling the chain.</p>
+--ldx]]--
+
+-- todo: delayed: i.e. we register them in the right order already but delay usage
+
+-- todo: protect groups (as in tasks)
+
+local format, gsub, concat, gmatch = string.format, string.gsub, table.concat, string.gmatch
+local type, loadstring = type, loadstring
+
+utilities = utilities or { }
+local tables = utilities.tables
+local allocate = utilities.storage.allocate
+
+local sequencers = { }
+utilities.sequencers = sequencers
+
+local functions = allocate()
+sequencers.functions = functions
+
+local removevalue, insertaftervalue, insertbeforevalue = tables.removevalue, tables.insertaftervalue, tables.insertbeforevalue
+
+local function validaction(action)
+ if type(action) == "string" then
+ local g = _G
+ for str in gmatch(action,"[^%.]+") do
+ g = g[str]
+ if not g then
+ return false
+ end
+ end
+ end
+ return true
+end
+
+function sequencers.reset(t)
+ local s = {
+ list = { },
+ order = { },
+ kind = { },
+ askip = { },
+ gskip = { },
+ dirty = true,
+ runner = nil,
+ }
+ if t then
+ s.arguments = t.arguments
+ s.returnvalues = t.returnvalues
+ s.results = t.results
+ end
+ return s
+end
+
+function sequencers.prependgroup(t,group,where)
+ if t then
+ local order = t.order
+ removevalue(order,group)
+ insertbeforevalue(order,where,group)
+ t.list[group], t.dirty, t.runner = { }, true, nil
+ end
+end
+
+function sequencers.appendgroup(t,group,where)
+ if t then
+ local order = t.order
+ removevalue(order,group)
+ insertaftervalue(order,where,group)
+ t.list[group], t.dirty, t.runner = { }, true, nil
+ end
+end
+
+function sequencers.prependaction(t,group,action,where,kind,force)
+ if t then
+ local g = t.list[group]
+ if g and (force or validaction(action)) then
+ removevalue(g,action)
+ insertbeforevalue(g,where,action)
+ t.kind[action], t.dirty, t.runner = kind, true, nil
+ end
+ end
+end
+
+function sequencers.appendaction(t,group,action,where,kind,force)
+ if t then
+ local g = t.list[group]
+ if g and (force or validaction(action)) then
+ removevalue(g,action)
+ insertaftervalue(g,where,action)
+ t.kind[action], t.dirty, t.runner = kind, true, nil
+ end
+ end
+end
+
+function sequencers.enableaction (t,action)
+ if t then
+ t.askip[action], t.dirty, t.runner = false, true, nil
+ end
+end
+
+function sequencers.disableaction(t,action)
+ if t then
+ t.askip[action], t.dirty, t.runner = true, true, nil
+ end
+end
+
+function sequencers.enablegroup(t,group)
+ if t then
+ t.gskip[group], t.dirty, t.runner = false, true, nil
+ end
+end
+
+function sequencers.disablegroup(t,group)
+ if t then
+ t.gskip[group], t.dirty, t.runner = true, true, nil
+ end
+end
+
+function sequencers.setkind(t,action,kind)
+ if t then
+ t.kind[action], t.dirty, t.runner = kind, true, nil
+ end
+end
+
+function sequencers.removeaction(t,group,action,force)
+ local g = t and t.list[group]
+ if g and (force or validaction(action)) then
+ removevalue(g,action)
+ t.dirty, t.runner = true, nil
+ end
+end
+
+local function localize(str)
+ return (gsub(str,"[%.: ]+","_"))
+end
+
+local function construct(t,nodummy)
+ local list, order, kind, gskip, askip = t.list, t.order, t.kind, t.gskip, t.askip
+ local arguments, returnvalues, results = t.arguments or "...", t.returnvalues, t.results
+ local variables, calls, n = { }, { }, 0
+ for i=1,#order do
+ local group = order[i]
+ if not gskip[group] then
+ local actions = list[group]
+ for i=1,#actions do
+ local action = actions[i]
+ if not askip[action] then
+ if type(action) == "function" then
+ local name = localize(tostring(action))
+ functions[name] = action
+ action = format("utilities.sequencers.functions.%s",name)
+ end
+ local localized = localize(action)
+ n = n + 1
+ variables[n] = format("local %s = %s",localized,action)
+ if not returnvalues then
+ calls[n] = format("%s(%s)",localized,arguments)
+ elseif n == 1 then
+ calls[n] = format("local %s = %s(%s)",returnvalues,localized,arguments)
+ else
+ calls[n] = format("%s = %s(%s)",returnvalues,localized,arguments)
+ end
+ end
+ end
+ end
+ end
+ t.dirty = false
+ if nodummy and #calls == 0 then
+ return nil
+ else
+ 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)
+ else
+ t.compiled = format("%s\nreturn function(%s)\n%s\nend",variables,arguments,calls)
+ end
+ return t.compiled -- also stored so that we can trace
+ end
+end
+
+sequencers.tostring = construct
+sequencers.localize = localize
+
+local function compile(t,compiler,n)
+ if not t or type(t) == "string" then
+ -- weird ... t.compiled = t .. so
+ return false
+ elseif compiler then
+ t.compiled = compiler(t,n)
+ else
+ t.compiled = construct(t)
+ end
+ local runner = loadstring(t.compiled)()
+ t.runner = runner
+ return runner -- faster
+end
+
+sequencers.compile = compile
+
+function sequencers.autocompile(t,compiler,n) -- to be used in tasks
+ t.runner = compile(t,compiler,n)
+ local autorunner = function(...)
+ return (t.runner or compile(t,compiler,n))(...) -- ugly but less bytecode
+ end
+ t.autorunner = autorunner
+ return autorunner -- one more encapsulation
+end
+
+-- we used to deal with tail as well but now that the lists are always
+-- double linked and the kernel function no longer expect tail as
+-- argument we stick to head and done (done can probably also go
+-- as luatex deals with return values efficiently now .. in the
+-- past there was some copying involved, but no longer)
+
+local template = [[
+%s
+return function(head%s)
+ local ok, done = false, false
+%s
+ return head, done
+end]]
+
+function sequencers.nodeprocessor(t,nofarguments) -- todo: handle 'kind' in plug into tostring
+ local list, order, kind, gskip, askip = t.list, t.order, t.kind, t.gskip, t.askip
+ local vars, calls, args, n = { }, { }, nil, 0
+ if nofarguments == 0 then
+ args = ""
+ elseif nofarguments == 1 then
+ args = ",one"
+ elseif nofarguments == 2 then
+ args = ",one,two"
+ elseif nofarguments == 3 then
+ args = ",one,two,three"
+ elseif nofarguments == 4 then
+ args = ",one,two,three,four"
+ elseif nofarguments == 5 then
+ args = ",one,two,three,four,five"
+ else
+ args = ",..."
+ end
+ for i=1,#order do
+ local group = order[i]
+ if not gskip[group] then
+ local actions = list[group]
+ for i=1,#actions do
+ local action = actions[i]
+ if not askip[action] then
+ local localized = localize(action)
+ n = n + 1
+ vars[n] = format("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)
+ else
+ calls[n] = format(" head, ok = %s(head%s) done = done or ok",localized,args)
+ end
+ end
+ end
+ end
+ end
+ local processor = format(template,concat(vars,"\n"),args,concat(calls,"\n"))
+ -- print(processor)
+ return processor
+end
diff --git a/Master/texmf-dist/tex/context/base/util-sto.lua b/Master/texmf-dist/tex/context/base/util-sto.lua
new file mode 100644
index 00000000000..f4521c91fce
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/util-sto.lua
@@ -0,0 +1,168 @@
+if not modules then modules = { } end modules ['util-sto'] = {
+ 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 setmetatable, getmetatable = setmetatable, getmetatable
+
+utilities = utilities or { }
+utilities.storage = utilities.storage or { }
+local storage = utilities.storage
+
+function storage.mark(t)
+ if not t then
+ texio.write_nl("fatal error: storage '%s' cannot be marked",t)
+ os.exit()
+ end
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m.__storage__ = true
+ return t
+end
+
+function storage.allocate(t)
+ t = t or { }
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m.__storage__ = true
+ return t
+end
+
+function storage.marked(t)
+ local m = getmetatable(t)
+ return m and m.__storage__
+end
+
+function storage.checked(t)
+ if not t then
+ texio.write_nl("fatal error: storage '%s' has not been allocated",t)
+ os.exit()
+ end
+ return t
+end
+
+--~ function utilities.storage.delay(parent,name,filename)
+--~ local m = getmetatable(parent)
+--~ m.__list[name] = filename
+--~ end
+--~
+--~ function utilities.storage.predefine(parent)
+--~ local list = { }
+--~ local m = getmetatable(parent) or {
+--~ __list = list,
+--~ __index = function(t,k)
+--~ local l = require(list[k])
+--~ t[k] = l
+--~ return l
+--~ end
+--~ }
+--~ setmetatable(parent,m)
+--~ end
+--~
+--~ bla = { }
+--~ utilities.storage.predefine(bla)
+--~ utilities.storage.delay(bla,"test","oepsoeps")
+--~ local t = bla.test
+--~ table.print(t)
+--~ print(t.a)
+
+function storage.setinitializer(data,initialize)
+ local m = getmetatable(data) or { }
+ m.__index = function(data,k)
+ m.__index = nil -- so that we can access the entries during initializing
+ initialize()
+ return data[k]
+ end
+ setmetatable(data, m)
+end
+
+local keyisvalue = { __index = function(t,k)
+ t[k] = k
+ return k
+end }
+
+function storage.sparse(t)
+ t = t or { }
+ setmetatable(t,keyisvalue)
+ return t
+end
+
+-- table namespace ?
+
+local function f_empty () return "" end -- t,k
+local function f_self (t,k) t[k] = k return k end
+local function f_ignore() end -- t,k,v
+
+local t_empty = { __index = empty }
+local t_self = { __index = self }
+local t_ignore = { __newindex = ignore }
+
+function table.setmetatableindex(t,f)
+ local m = getmetatable(t)
+ if m then
+ if f == "empty" then
+ m.__index = f_empty
+ elseif f == "key" then
+ m.__index = f_self
+ else
+ m.__index = f
+ end
+ else
+ if f == "empty" then
+ setmetatable(t, t_empty)
+ elseif f == "key" then
+ setmetatable(t, t_self)
+ else
+ setmetatable(t,{ __index = f })
+ end
+ end
+end
+
+function table.setmetatablenewindex(t,f)
+ local m = getmetatable(t)
+ if m then
+ if f == "ignore" then
+ m.__newindex = f_ignore
+ else
+ m.__newindex = f
+ end
+ else
+ if f == "ignore" then
+ setmetatable(t, t_ignore)
+ else
+ setmetatable(t,{ __newindex = f })
+ end
+ end
+end
+
+function table.setmetatablecall(t,f)
+ local m = getmetatable(t)
+ if m then
+ m.__call = f
+ else
+ setmetatable(t,{ __call = f })
+ end
+end
+
+function table.setmetatablekey(t,key,value)
+ local m = getmetatable(t)
+ if not m then
+ m = { }
+ setmetatable(t,m)
+ end
+ m[key] = value
+end
+
+function table.getmetatablekey(t,key,value)
+ local m = getmetatable(t)
+ return m and m[key]
+end
diff --git a/Master/texmf-dist/tex/context/base/util-str.lua b/Master/texmf-dist/tex/context/base/util-str.lua
new file mode 100644
index 00000000000..adcbf1654d2
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/util-str.lua
@@ -0,0 +1,107 @@
+if not modules then modules = { } end modules ['util-str'] = {
+ 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"
+}
+
+utilities = utilities or {}
+utilities.strings = utilities.strings or { }
+local strings = utilities.strings
+
+local find, gsub, rep = string.find, string.gsub, string.rep
+local Cs, C, Cp, P, Carg = lpeg.Cs, lpeg.C, lpeg.Cp, lpeg.P, lpeg.Carg
+local patterns, lpegmatch = lpeg.patterns, lpeg.match
+
+-- str = " \n \ntest \n test\ntest "
+-- print("["..string.gsub(string.collapsecrlf(str),"\n","+").."]")
+
+local rubish = patterns.spaceortab^0 * patterns.newline
+local anyrubish = patterns.spaceortab + patterns.newline
+local anything = patterns.anything
+local stripped = (patterns.spaceortab^1 / "") * patterns.newline
+local leading = rubish^0 / ""
+local trailing = (anyrubish^1 * patterns.endofstring) / ""
+local redundant = rubish^3 / "\n"
+
+local pattern = Cs(leading * (trailing + redundant + stripped + anything)^0)
+
+function strings.collapsecrlf(str)
+ return lpegmatch(pattern,str)
+end
+
+-- The following functions might end up in another namespace.
+
+--~ function strings.tabtospace(str,tab)
+--~ -- we don't handle embedded newlines
+--~ while true do
+--~ local s = find(str,"\t")
+--~ if s then
+--~ if not tab then tab = 7 end -- only when found
+--~ local d = tab-(s-1) % tab
+--~ if d > 0 then
+--~ str = gsub(str,"\t",rep(" ",d),1)
+--~ else
+--~ str = gsub(str,"\t","",1)
+--~ end
+--~ else
+--~ break
+--~ end
+--~ end
+--~ return str
+--~ end
+
+local extra, tab, start = 0, 0, 4, 0
+
+local pattern =
+ Carg(1) / function(t)
+ extra, tab, start = 0, t or 7, 1
+ end
+ * Cs((
+ Cp() * patterns.tab / function(position)
+ local current = (position - start + 1) + extra
+ local spaces = tab-(current-1) % tab
+ if spaces > 0 then
+ extra = extra + spaces - 1
+ return rep(" ",spaces)
+ else
+ return ""
+ end
+ end
+ + patterns.newline * Cp() / function(position)
+ extra, start = 0, position
+ end
+ + patterns.anything
+ )^1)
+
+function strings.tabtospace(str,tab)
+ return lpegmatch(pattern,str,1,tab or 7)
+end
+
+--~ local t = {
+--~ "1234567123456712345671234567",
+--~ "\tb\tc",
+--~ "a\tb\tc",
+--~ "aa\tbb\tcc",
+--~ "aaa\tbbb\tccc",
+--~ "aaaa\tbbbb\tcccc",
+--~ "aaaaa\tbbbbb\tccccc",
+--~ "aaaaaa\tbbbbbb\tcccccc\n aaaaaa\tbbbbbb\tcccccc",
+--~ "one\n two\nxxx three\nxx four\nx five\nsix",
+--~ }
+--~ for k=1,#t do
+--~ print(strings.tabtospace(t[k]))
+--~ end
+
+function strings.striplong(str) -- strips all leading spaces
+ str = gsub(str,"^%s*","")
+ str = gsub(str,"[\n\r]+ *","\n")
+ return str
+end
+
+--~ local template = string.striplong([[
+--~ aaaa
+--~ bb
+--~ cccccc
+--~ ]])
diff --git a/Master/texmf-dist/tex/context/base/util-tab.lua b/Master/texmf-dist/tex/context/base/util-tab.lua
new file mode 100644
index 00000000000..818266d3c62
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/util-tab.lua
@@ -0,0 +1,105 @@
+if not modules then modules = { } end modules ['util-tab'] = {
+ 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"
+}
+
+utilities = utilities or {}
+utilities.tables = utilities.tables or { }
+local tables = utilities.tables
+
+local format, gmatch = string.format, string.gmatch
+local concat, insert, remove = table.concat, table.insert, table.remove
+local setmetatable, getmetatable, tonumber, tostring = setmetatable, getmetatable, tonumber, tostring
+
+function tables.definetable(target) -- defines undefined tables
+ local composed, t, n = nil, { }, 0
+ for name in gmatch(target,"([^%.]+)") do
+ n = n + 1
+ if composed then
+ composed = composed .. "." .. name
+ else
+ composed = name
+ end
+ t[n] = format("%s = %s or { }",composed,composed)
+ end
+ return concat(t,"\n")
+end
+
+function tables.accesstable(target)
+ local t = _G
+ for name in gmatch(target,"([^%.]+)") do
+ t = t[name]
+ end
+ return t
+end
+
+function tables.removevalue(t,value) -- todo: n
+ if value then
+ for i=1,#t do
+ if t[i] == value then
+ remove(t,i)
+ -- remove all, so no: return
+ end
+ end
+ end
+end
+
+function tables.insertbeforevalue(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i,extra)
+ return
+ end
+ end
+ insert(t,1,extra)
+end
+
+function tables.insertaftervalue(t,value,extra)
+ for i=1,#t do
+ if t[i] == extra then
+ remove(t,i)
+ end
+ end
+ for i=1,#t do
+ if t[i] == value then
+ insert(t,i+1,extra)
+ return
+ end
+ end
+ insert(t,#t+1,extra)
+end
+
+-- experimental
+
+local function toxml(t,d,result)
+ for k, v in table.sortedpairs(t) do
+ if type(v) == "table" then
+ result[#result+1] = format("%s<%s>",d,k)
+ toxml(v,d.." ",result)
+ result[#result+1] = format("%s</%s>",d,k)
+ elseif tonumber(k) then
+ result[#result+1] = format("%s<entry n='%s'>%s</entry>",d,k,v,k)
+ else
+ result[#result+1] = format("%s<%s>%s</%s>",d,k,tostring(v),k)
+ end
+ end
+end
+
+function table.toxml(t,name,nobanner)
+ local noroot = name == false
+ local result = (nobanner or noroot) and { } or { "<?xml version='1.0' standalone='yes' ?>" }
+ if noroot then
+ toxml( t, "", result)
+ else
+ toxml( { [name or "root"] = t }, "", result)
+ end
+ return concat(result,"\n")
+end
diff --git a/Master/texmf-dist/tex/context/base/x-asciimath.lua b/Master/texmf-dist/tex/context/base/x-asciimath.lua
index c2b15e3132f..50f4b0391a8 100644
--- a/Master/texmf-dist/tex/context/base/x-asciimath.lua
+++ b/Master/texmf-dist/tex/context/base/x-asciimath.lua
@@ -10,7 +10,13 @@ if not modules then modules = { } end modules ['x-asciimath'] = {
<p>Some backgrounds are discussed in <t>x-asciimath.mkiv</t>.</p>
--ldx]]--
-local trace_mapping = false if trackers then trackers.register("asciimath.mapping", function(v) trace_mapping = v end) end
+local trace_mapping = false if trackers then trackers.register("modules.asciimath.mapping", function(v) trace_mapping = v end) end
+
+local asciimath = { }
+local moduledata = moduledata or { }
+moduledata.asciimath = asciimath
+
+local report_asciimath = logs.reporter("mathematics","asciimath")
local format = string.format
local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
@@ -164,22 +170,22 @@ local parser
local function converted(original,totex)
local ok, result
if trace_mapping then
- logs.report("asciimath","original : %s",original)
+ report_asciimath("original : %s",original)
end
local premapped = lpegmatch(premapper,original)
if premapped then
if trace_mapping then
- logs.report("asciimath","prepared : %s",premapped)
+ report_asciimath("prepared : %s",premapped)
end
local parsed = lpegmatch(parser,premapped)
if parsed then
if trace_mapping then
- logs.report("asciimath","parsed : %s",parsed)
+ report_asciimath("parsed : %s",parsed)
end
local postmapped = lpegmatch(postmapper,parsed)
if postmapped then
if trace_mapping then
- logs.report("asciimath","finalized : %s",postmapped)
+ report_asciimath("finalized: %s",postmapped)
end
result, ok = postmapped, true
else
@@ -262,6 +268,5 @@ parser = Cs { "main",
}
-asciimath = { }
-asciimath.reserved = reserved
-asciimath.convert = converted
+asciimath.reserved = reserved
+asciimath.convert = converted
diff --git a/Master/texmf-dist/tex/context/base/x-asciimath.mkiv b/Master/texmf-dist/tex/context/base/x-asciimath.mkiv
index c9252408d83..fac3980a089 100644
--- a/Master/texmf-dist/tex/context/base/x-asciimath.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-asciimath.mkiv
@@ -13,7 +13,9 @@
%D Lua code.
-\ctxloadluafile{x-asciimath}{}
+\registerctxluafile{x-asciimath}{}
+
+\def\ctxmoduleasciimath#1{\directlua\zerocount{moduledata.asciimath.#1}}
%D The following code is not officially supported and is only meant
%D for the Math4All project.
@@ -62,13 +64,13 @@
\writestatus{asciimath}{beware, this is an experimental (m4all only) module}
-\unexpanded\def\asciimath#1{\ctxlua{asciimath.convert(\!!bs\detokenize{#1}\!!es,true)}}
+\unexpanded\def\asciimath#1{\ctxmoduleasciimath{convert(\!!bs\detokenize{#1}\!!es,true)}}
\protect
\doifnotmode{demo}{\endinput}
-\enabletrackers[asciimath.mapping]
+\enabletrackers[modules.asciimath.mapping]
\starttext
diff --git a/Master/texmf-dist/tex/context/base/x-calcmath.lua b/Master/texmf-dist/tex/context/base/x-calcmath.lua
index e4d5da139f9..bcf72f26f6e 100644
--- a/Master/texmf-dist/tex/context/base/x-calcmath.lua
+++ b/Master/texmf-dist/tex/context/base/x-calcmath.lua
@@ -9,11 +9,9 @@ if not modules then modules = { } end modules ['x-calcmath'] = {
local format, lower, upper, gsub, sub = string.format, string.lower, string.upper, string.gsub, string.sub
local lpegmatch = lpeg.match
-tex = tex or { }
-
-texsprint = tex.sprint or function(catcodes,str) print(str) end
-
-calcmath = { }
+local calcmath = { }
+local moduledata = moduledata or { }
+moduledata.calcmath = calcmath
local list_1 = {
"median", "min", "max", "round", "ln", "log",
@@ -77,7 +75,7 @@ local function nsub(str,tag,pre,post)
end))
end
-function calcmath.totex(str,mode)
+local function totex(str,mode)
if not frozen then freeze() end
local n = 0
-- crap
@@ -162,19 +160,18 @@ function calcmath.totex(str,mode)
end
-- csnames
str = gsub(str,"(\\[A-Z]+)", lower)
- -- trace
---~ print(str)
-- report
return str
end
+calcmath.totex = totex
+
function calcmath.tex(str,mode)
- texsprint(tex.texcatcodes,calcmath.totex(str))
+ context(totex(str))
end
function calcmath.xml(id,mode)
- local str = lxml.id(id).dt[1]
- texsprint(tex.texcatcodes,calcmath.totex(str,mode))
+ context(totex(lxml.id(id).dt[1],mode))
end
-- work in progress ... lpeg variant
diff --git a/Master/texmf-dist/tex/context/base/x-calcmath.mkiv b/Master/texmf-dist/tex/context/base/x-calcmath.mkiv
index c726843fa4f..7dfa60e0e92 100644
--- a/Master/texmf-dist/tex/context/base/x-calcmath.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-calcmath.mkiv
@@ -13,14 +13,16 @@
%D Lua code.
-\ctxloadluafile{x-calcmath}{}
+\registerctxluafile{x-calcmath}{}
+
+\def\ctxmodulecalcmath#1{\directlua\zerocount{moduledata.calcmath.#1}}
%D Interface:
\unprotect
-\def\inlinecalcmath #1{\mathematics{\ctxlua{calcmath.tex("#1",1)}}}
-\def\displaycalcmath#1{\startformula\ctxlua{calcmath.tex("#1",2)}\stopformula}
+\unexpanded\def\inlinecalcmath #1{\mathematics{\ctxmodulecalcmath{tex("#1",1)}}}
+\unexpanded\def\displaycalcmath#1{\startformula\ctxmodulecalcmath{tex("#1",2)}\stopformula}
\let\calcmath\inlinecalcmath
@@ -37,24 +39,24 @@
\xmlregistersetup{xml:cam:define}
% tex -> lua -> tex -> lua -> tex
-% \mathematics{\ctxlua{calcmath.xml(\!!bs\xmlflush{#1}\!!es,1)}}
+% \mathematics{\ctxmodulecalcmath{xml(\!!bs\xmlflush{#1}\!!es,1)}}
% tex -> lua -> tex
-% \mathematics{\ctxlua{calcmath.xml("#1",1)}}%
+% \mathematics{\ctxmodulecalcmath{xml("#1",1)}}%
\startxmlsetups cam:i
- \mathematics{\ctxlua{calcmath.xml("#1",1)}}%
+ \mathematics{\ctxmodulecalcmath{xml("#1",1)}}%
\stopxmlsetups
\startxmlsetups cam:d
- \startformula\ctxlua{calcmath.xml("#1",2)}\stopformula
+ \startformula\ctxmodulecalcmath{xml("#1",2)}\stopformula
\stopxmlsetups
\startxmlsetups cam:icm
- \mathematics{\ctxlua{calcmath.xml("#1",1)}}
+ \mathematics{\ctxmodulecalcmath{xml("#1",1)}}
\stopxmlsetups
\startxmlsetups cam:dcm
- \startformula\ctxlua{calcmath.xml("#1",2)}\stopformula
+ \startformula\ctxmodulecalcmath{xml("#1",2)}\stopformula
\stopxmlsetups
\protect \endinput
@@ -76,12 +78,3 @@
% \calcmath{D(x+D(y))}
% \calcmath{Df(x)}
% \calcmath{g(x)}
-
-\calcmath{sqrt(sin^2(x)+cos^2(x))}
-
-\startXMLdata
-test <icm>sqrt(sin^2(x)+cos^2(x))</icm> test
-test <dcm>sqrt(sin^2(x)+cos^2(x))</dcm> test
-\stopXMLdata
-
-\stoptext
diff --git a/Master/texmf-dist/tex/context/base/x-cals.lua b/Master/texmf-dist/tex/context/base/x-cals.lua
index 5d15b4e302d..904dc39c95b 100644
--- a/Master/texmf-dist/tex/context/base/x-cals.lua
+++ b/Master/texmf-dist/tex/context/base/x-cals.lua
@@ -13,9 +13,9 @@ local n_todimen, s_todimen = number.todimen, string.todimen
-- there is room for speedups as well as cleanup (using context functions)
-lxml.cals = lxml.cals or { }
-
-local cals = lxml.cals
+local cals = { }
+moduledata.cals = cals
+lxml.mathml = cals -- for the moment
cals.ignore_widths = false
cals.shrink_widths = false
diff --git a/Master/texmf-dist/tex/context/base/x-cals.mkiv b/Master/texmf-dist/tex/context/base/x-cals.mkiv
index 32d5767c1c7..e0d2ac11f8b 100644
--- a/Master/texmf-dist/tex/context/base/x-cals.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-cals.mkiv
@@ -15,18 +15,18 @@
\startmodule [cals]
-\ctxloadluafile{x-cals}{}
+\registerctxluafile{x-cals}{}
% \startxmlsetups xml:cals:process
% \xmlsetsetup {\xmldocument} {cals:table} {*}
% \stopxmlsetups
% \startxmlsetups cals:table
-% \ctxlua{lxml.cals.table("#1")}
+% \ctxlua{moduledata.cals.table("#1")}
% \stopxmlsetups
% \xmlregistersetup{xml:cals:process}
\startxmlsetups xml:cals:process
- \xmlsetfunction {\xmldocument} {cals:table} {lxml.cals.table}
+ \xmlsetfunction {\xmldocument} {cals:table} {moduledata.cals.table}
\stopxmlsetups
\xmlregistersetup{xml:cals:process}
diff --git a/Master/texmf-dist/tex/context/base/x-chemml.lua b/Master/texmf-dist/tex/context/base/x-chemml.lua
new file mode 100644
index 00000000000..387935c8ba5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/x-chemml.lua
@@ -0,0 +1,51 @@
+if not modules then modules = { } end modules ['x-chemml'] = {
+ version = 1.001,
+ comment = "companion to x-chemml.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- not yet acceptable cld
+
+local format, lower, upper, gsub, sub = string.format, string.lower, string.upper, string.gsub, string.sub
+local concat = table.concat
+
+local chemml = { }
+local moduledata = moduledata or { }
+moduledata.chemml = chemml
+
+function chemml.pi(id)
+ local str = xml.content(lxml.id(id))
+ local _, class, key, value = str:match("^(%S+)%s+(%S+)%s+(%S+)%s+(%S+)%s*$")
+ if key and value then
+ context("\\setupCMLappearance[%s][%s=%s]",class, key, value)
+ end
+end
+
+function chemml.do_graphic(id)
+ local t = { }
+ for r, d, k in xml.elements(lxml.id(id),"cml:graphic") do
+ t[#t+1] = xml.tostring(d[k].dt)
+ end
+ concat(concat(t,","))
+end
+
+function chemml.no_graphic(id)
+ local t = { }
+ for r, d, k in xml.elements(lxml.id(id),"cml:text|cml:oxidation|cml:annotation") do
+ local dk = d[k]
+ if dk.tg == "oxidation" then
+ t[#t+1] = format("\\chemicaloxidation{%s}{%s}{%s}",r.at.sign or "",r.at.n or 1,xml.tostring(dk.dt))
+ elseif dk.tg == "annotation" then
+ local location = r.at.location or "r"
+ local caption = xml.content(xml.first(dk,"cml:caption"))
+ local text = xml.content(xml.first(dk,"cml:text"))
+ t[#t+1] = format("\\doCMLannotation{%s}{%s}{%s}",location,caption,text)
+ else
+ t[#t+1] = xml.tostring(dk.dt) or ""
+ end
+ end
+ context(concat(t,","))
+end
+
diff --git a/Master/texmf-dist/tex/context/base/x-chemml.mkiv b/Master/texmf-dist/tex/context/base/x-chemml.mkiv
index f9ed3296041..9ad8ed6c12b 100644
--- a/Master/texmf-dist/tex/context/base/x-chemml.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-chemml.mkiv
@@ -13,6 +13,10 @@
\writestatus{loading}{ConTeXt XML Macros / Chemistry}
+\registerctxluafile{x-chemml}{}
+
+\def\ctxmodulechemml#1{\directlua\zerocount{moduledata.chemml.#1}}
+
\usemodule[pictex,chemic] % someday we will do structural fomulas in mp
%D The following code assumes a load||flush approach to \XML.
@@ -20,7 +24,6 @@
\unprotect
\startxmlsetups xml:cml:process
-
\xmlstrip {\xmldocument} {cml:chem|cml:ichem|cml:dchem|cml:reaction|cml:molecule|cml:ion|cml:structure}
\xmlgrab {\xmldocument} {cml:*} {*}
@@ -39,16 +42,6 @@
\setupCMLappearance [ion] [\c!alternative=\v!a]
-\startluacode
- function lxml.cml_do_pi(id)
- local str = xml.content(lxml.id(id))
- local _, class, key, value = str:match("^(%S+)%s+(%S+)%s+(%S+)%s+(%S+)%s*$")
- if key and value then
- tex.sprint(tex.ctxcatcodes,string.format("\\setupCMLappearance[%s][%s=%s]",class, key, value))
- end
- end
-\stopluacode
-
\def\doifelseCMLvariable#1#2#3% id key value
{\doifelse{\xmlatt{#1}{#2}}{#3}
\firstoftwoarguments
@@ -57,7 +50,7 @@
\secondoftwoarguments}}
\startxmlsetups cml:pi
- \ctxlua{lxml.cml_do_pi(#1)}
+ \ctxmodulechemml{pi(#1)}
\stopxmlsetups
\startxmlsetups cml:chem
@@ -194,62 +187,35 @@
% It makes not much sense to adapt ppchtex to accept different input. Maybe some day.
-\startluacode
- function lxml.cml_do_graphic(id)
- local t = { }
- for r, d, k in xml.elements(lxml.id(id),"cml:graphic") do
- t[#t+1] = xml.tostring(d[k].dt)
- end
- tex.sprint(tex.ctxcatcodes,table.concat(t,","))
- end
- function lxml.cml_no_graphic(id)
- local t = { }
- for r, d, k in xml.elements(lxml.id(id),"cml:text|cml:oxidation|cml:annotation") do
- local dk = d[k]
- if dk.tg == "oxidation" then
- t[#t+1] = string.format("\\chemicaloxidation{%s}{%s}{%s}",r.at.sign or "",r.at.n or 1,xml.tostring(dk.dt))
- elseif dk.tg == "annotation" then
- local location = r.at.location or "r"
- local caption = xml.content(xml.first(dk,"cml:caption"))
- local text = xml.content(xml.first(dk,"cml:text"))
- t[#t+1] = string.format("\\doCMLannotation{%s}{%s}{%s}",location,caption,text)
- else
- t[#t+1] = xml.tostring(dk.dt) or ""
- end
- end
- tex.sprint(tex.ctxcatcodes,table.concat(t,","))
- end
-\stopluacode
-
\startxmlsetups cml:component
\expanded {
\chemical
- [\ctxlua{lxml.cml_do_graphic("#1")}]
- [\ctxlua{lxml.cml_no_graphic("#1")}]
+ [\ctxmodulechemml{do_graphic("#1")}]
+ [\ctxmodulechemml{no_graphic("#1")}]
}
\stopxmlsetups
\unexpanded\def\doCMLannotation#1% #2#3% loc caption text
- {\XMLval{cml:a:l}{#1}{\chemicalright}}% {#2}{#3}}
-
-\mapXMLvalue {cml:a:l} {t} {\chemicaltop}
-\mapXMLvalue {cml:a:l} {b} {\chemicalbottom}
-\mapXMLvalue {cml:a:l} {l} {\chemicalleft}
-\mapXMLvalue {cml:a:l} {r} {\chemicalright}
-\mapXMLvalue {cml:a:l} {lc} {\chemicalleftcentered} % \mapXMLvalue {cml:a:l} {cl} {\chemicalleftcentered}
-\mapXMLvalue {cml:a:l} {rc} {\chemicalrightcentered} % \mapXMLvalue {cml:a:l} {cr} {\chemicalrightcentered}
-\mapXMLvalue {cml:a:l} {tl} {\chemicaltopleft} % \mapXMLvalue {cml:a:l} {lt} {\chemicaltopleft}
-\mapXMLvalue {cml:a:l} {bl} {\chemicalbottomleft} % \mapXMLvalue {cml:a:l} {lb} {\chemicalbottomleft}
-\mapXMLvalue {cml:a:l} {tr} {\chemicaltopright} % \mapXMLvalue {cml:a:l} {rt} {\chemicaltopright}
-\mapXMLvalue {cml:a:l} {br} {\chemicalbottomright} % \mapXMLvalue {cml:a:l} {rb} {\chemicalbottomright}
-\mapXMLvalue {cml:a:l} {lt} {\chemicallefttop} % \mapXMLvalue {cml:a:l} {tl} {\chemicallefttop}
-\mapXMLvalue {cml:a:l} {lb} {\chemicalleftbottom} % \mapXMLvalue {cml:a:l} {bl} {\chemicalleftbottom}
-\mapXMLvalue {cml:a:l} {rt} {\chemicalrighttop} % \mapXMLvalue {cml:a:l} {tr} {\chemicalrighttop}
-\mapXMLvalue {cml:a:l} {rb} {\chemicalrightbottom} % \mapXMLvalue {cml:a:l} {br} {\chemicalrightbottom}
-\mapXMLvalue {cml:a:l} {x} {\chemicaltighttext}
-\mapXMLvalue {cml:a:l} {sl} {\chemicalsmashedleft} % \mapXMLvalue {cml:a:l} {ls} {\chemicalsmashedleft}
-\mapXMLvalue {cml:a:l} {sm} {\chemicalsmashedmiddle} % \mapXMLvalue {cml:a:l} {ms} {\chemicalsmashedmiddle}
-\mapXMLvalue {cml:a:l} {sr} {\chemicalsmashedright} % \mapXMLvalue {cml:a:l} {rs} {\chemicalsmashedright}
+ {\xmlval{cml:a:l}{#1}{\chemicalright}}% {#2}{#3}}
+
+\xmlmapvalue {cml:a:l} {t} {\chemicaltop}
+\xmlmapvalue {cml:a:l} {b} {\chemicalbottom}
+\xmlmapvalue {cml:a:l} {l} {\chemicalleft}
+\xmlmapvalue {cml:a:l} {r} {\chemicalright}
+\xmlmapvalue {cml:a:l} {lc} {\chemicalleftcentered} % \xmlmapvalue {cml:a:l} {cl} {\chemicalleftcentered}
+\xmlmapvalue {cml:a:l} {rc} {\chemicalrightcentered} % \xmlmapvalue {cml:a:l} {cr} {\chemicalrightcentered}
+\xmlmapvalue {cml:a:l} {tl} {\chemicaltopleft} % \xmlmapvalue {cml:a:l} {lt} {\chemicaltopleft}
+\xmlmapvalue {cml:a:l} {bl} {\chemicalbottomleft} % \xmlmapvalue {cml:a:l} {lb} {\chemicalbottomleft}
+\xmlmapvalue {cml:a:l} {tr} {\chemicaltopright} % \xmlmapvalue {cml:a:l} {rt} {\chemicaltopright}
+\xmlmapvalue {cml:a:l} {br} {\chemicalbottomright} % \xmlmapvalue {cml:a:l} {rb} {\chemicalbottomright}
+\xmlmapvalue {cml:a:l} {lt} {\chemicallefttop} % \xmlmapvalue {cml:a:l} {tl} {\chemicallefttop}
+\xmlmapvalue {cml:a:l} {lb} {\chemicalleftbottom} % \xmlmapvalue {cml:a:l} {bl} {\chemicalleftbottom}
+\xmlmapvalue {cml:a:l} {rt} {\chemicalrighttop} % \xmlmapvalue {cml:a:l} {tr} {\chemicalrighttop}
+\xmlmapvalue {cml:a:l} {rb} {\chemicalrightbottom} % \xmlmapvalue {cml:a:l} {br} {\chemicalrightbottom}
+\xmlmapvalue {cml:a:l} {x} {\chemicaltighttext}
+\xmlmapvalue {cml:a:l} {sl} {\chemicalsmashedleft} % \xmlmapvalue {cml:a:l} {ls} {\chemicalsmashedleft}
+\xmlmapvalue {cml:a:l} {sm} {\chemicalsmashedmiddle} % \xmlmapvalue {cml:a:l} {ms} {\chemicalsmashedmiddle}
+\xmlmapvalue {cml:a:l} {sr} {\chemicalsmashedright} % \xmlmapvalue {cml:a:l} {rs} {\chemicalsmashedright}
\startxmlsetups cml:forever
\left[\xmlflush{#1}\right]
diff --git a/Master/texmf-dist/tex/context/base/x-chemml.tex b/Master/texmf-dist/tex/context/base/x-chemml.tex
deleted file mode 100644
index 65d33b5ecd8..00000000000
--- a/Master/texmf-dist/tex/context/base/x-chemml.tex
+++ /dev/null
@@ -1,16 +0,0 @@
-%D \module
-%D [ file=m-chemml,
-%D version=2001.09.12,
-%D title=\CONTEXT\ XML Modules,
-%D subtitle=Loading CHEMML Filters,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\loadmarkfile{x-chemml}
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/x-css.lua b/Master/texmf-dist/tex/context/base/x-css.lua
new file mode 100644
index 00000000000..1bf559d6627
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/x-css.lua
@@ -0,0 +1,94 @@
+if not modules then modules = { } end modules ['lxml-css'] = {
+ version = 1.001,
+ comment = "companion to lxml-css.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local tonumber = tonumber
+local P, S, C, R, Cb, Cg, Carg = lpeg.P, lpeg.S, lpeg.C, lpeg.R, lpeg.Cb, lpeg.Cg, lpeg.Carg
+local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns
+
+local css = { }
+local moduledata = moduledata or { }
+moduledata.css = css
+
+local dimenfactors = number.dimenfactors
+
+local bpf, cmf, mmf, inf = 1/dimenfactors.bp, 1/dimenfactors.cm, 1/dimenfactors.mm, 1/dimenfactors["in"]
+
+local validdimen = Cg(lpegpatterns.number,'a') * (
+ Cb('a') * P("pt") / function(s) return tonumber(s) * bpf end
+ + Cb('a') * P("cm") / function(s) return tonumber(s) * cmf end
+ + Cb('a') * P("mm") / function(s) return tonumber(s) * mmf end
+ + Cb('a') * P("in") / function(s) return tonumber(s) * inf end
+ + Cb('a') * P("px") * Carg(1) / function(s,pxf) return tonumber(s) * pxf end
+ + Cb('a') * P("%") * Carg(2) / function(s,pcf) return tonumber(s) * pcf end
+ + Cb('a') * P("ex") * Carg(3) / function(s,exf) return tonumber(s) * exf end
+ + Cb('a') * P("em") * Carg(4) / function(s,emf) return tonumber(s) * emf end
+ + Cb('a') * Carg(1) / function(s,pxf) return tonumber(s) * pxf end
+ )
+
+local pattern = (validdimen * lpegpatterns.whitespace^0)^1
+
+-- todo: default if ""
+
+local function padding(str,pixel,percent,exheight,emwidth)
+ local top, bottom, left, right = lpegmatch(pattern,str,1,pixel,percent,exheight,emwidth)
+ if not bottom then
+ bottom, left, right = top, top, top
+ elseif not left then
+ bottom, left, right = top, bottom, bottom
+ elseif not right then
+ bottom, left, right = left, bottom, bottom
+ end
+ return top, bottom, left, right
+end
+
+css.padding = padding
+
+-- local hsize = 655360*100
+-- local exheight = 65536*4
+-- local emwidth = 65536*10
+-- local pixel = emwidth/100
+--
+-- print(padding("10px",pixel,hsize,exheight,emwidth))
+-- print(padding("10px 20px",pixel,hsize,exheight,emwidth))
+-- print(padding("10px 20px 30px",pixel,hsize,exheight,emwidth))
+-- print(padding("10px 20px 30px 40px",pixel,hsize,exheight,emwidth))
+--
+-- print(padding("10%",pixel,hsize,exheight,emwidth))
+-- print(padding("10% 20%",pixel,hsize,exheight,emwidth))
+-- print(padding("10% 20% 30%",pixel,hsize,exheight,emwidth))
+-- print(padding("10% 20% 30% 40%",pixel,hsize,exheight,emwidth))
+--
+-- print(padding("10",pixel,hsize,exheight,emwidth))
+-- print(padding("10 20",pixel,hsize,exheight,emwidth))
+-- print(padding("10 20 30",pixel,hsize,exheight,emwidth))
+-- print(padding("10 20 30 40",pixel,hsize,exheight,emwidth))
+--
+-- print(padding("10pt",pixel,hsize,exheight,emwidth))
+-- print(padding("10pt 20pt",pixel,hsize,exheight,emwidth))
+-- print(padding("10pt 20pt 30pt",pixel,hsize,exheight,emwidth))
+-- print(padding("10pt 20pt 30pt 40pt",pixel,hsize,exheight,emwidth))
+
+local currentfont = font.current
+local texdimen = tex.dimen
+local hashes = fonts.hashes
+local quads = hashes.quads
+local xheights = hashes.xheights
+
+local function padding(str)
+ local font = currentfont()
+ local exheight = xheights[font]
+ local emwidth = quads[font]
+ local hsize = texdimen.hsize/100
+ local pixel = emwidth/100
+ return padding(str,pixel,hsize,exheight,emwidth)
+end
+
+--~ function css.simplepadding(str)
+--~ context("%ssp",padding(str,pixel,hsize,exheight,emwidth))
+--~ end
+
diff --git a/Master/texmf-dist/tex/context/base/x-css.mkiv b/Master/texmf-dist/tex/context/base/x-css.mkiv
new file mode 100644
index 00000000000..cc7f8682a07
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/x-css.mkiv
@@ -0,0 +1,39 @@
+%D \module
+%D [ file=x-css,
+%D version=2010.01.28,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Css Helpers,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright=PRAGMA]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\registerctxluafile{x-css}{}
+
+\def\ctxmodulecss#1{\directlua\zerocount{moduledata.css.#1}}
+
+% No stable interface yet.
+
+% \edef\CellPadding{\xmlatt{#1}{cellpadding}}
+% \ifx\CellPadding\empty
+% \edef\CellPadding{.25ex}
+% \else
+% \edef\CellPadding{\cssgetsinglepadding{\xmlatt{#1}{cellpadding}}}
+% \fi
+
+% \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
+
+\endinput
diff --git a/Master/texmf-dist/tex/context/base/x-ct.mkiv b/Master/texmf-dist/tex/context/base/x-ct.mkiv
index d282193a15b..ad20eea05c9 100644
--- a/Master/texmf-dist/tex/context/base/x-ct.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-ct.mkiv
@@ -15,7 +15,7 @@
\startmodule [ct]
-\ctxloadluafile{x-ct}{}
+\registerctxluafile{x-ct}{}
\startxmlsetups xml:context:process
\xmlsetfunction {\xmldocument} {context:tabulate} {lxml.context.tabulate}
diff --git a/Master/texmf-dist/tex/context/base/x-dir-05.mkiv b/Master/texmf-dist/tex/context/base/x-dir-05.mkiv
index c29c9ea2aba..120f725caaf 100644
--- a/Master/texmf-dist/tex/context/base/x-dir-05.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-dir-05.mkiv
@@ -22,6 +22,8 @@
% \savefilestate[zip-latest][context/latest/cont-#2.zip]%
+% TODO: move to module namespace
+
\startluacode
local filestates = { }
function commands.savefilestate(tag,name)
diff --git a/Master/texmf-dist/tex/context/base/x-fdf-00.tex b/Master/texmf-dist/tex/context/base/x-fdf-00.mkii
index fd4bea7e74c..fd4bea7e74c 100644
--- a/Master/texmf-dist/tex/context/base/x-fdf-00.tex
+++ b/Master/texmf-dist/tex/context/base/x-fdf-00.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-fig-00.tex b/Master/texmf-dist/tex/context/base/x-fig-00.mkii
index d293dc39f96..d293dc39f96 100644
--- a/Master/texmf-dist/tex/context/base/x-fig-00.tex
+++ b/Master/texmf-dist/tex/context/base/x-fig-00.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-fig-01.tex b/Master/texmf-dist/tex/context/base/x-fig-01.mkii
index c2f97fea901..c2f97fea901 100644
--- a/Master/texmf-dist/tex/context/base/x-fig-01.tex
+++ b/Master/texmf-dist/tex/context/base/x-fig-01.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-fig-02.tex b/Master/texmf-dist/tex/context/base/x-fig-02.mkii
index 22d49d27adf..22d49d27adf 100644
--- a/Master/texmf-dist/tex/context/base/x-fig-02.tex
+++ b/Master/texmf-dist/tex/context/base/x-fig-02.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-fig-03.tex b/Master/texmf-dist/tex/context/base/x-fig-03.mkii
index 1317528235e..1317528235e 100644
--- a/Master/texmf-dist/tex/context/base/x-fig-03.tex
+++ b/Master/texmf-dist/tex/context/base/x-fig-03.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-fo.mkii b/Master/texmf-dist/tex/context/base/x-fo.mkii
index b2b0b59f927..83cfe2433ee 100644
--- a/Master/texmf-dist/tex/context/base/x-fo.mkii
+++ b/Master/texmf-dist/tex/context/base/x-fo.mkii
@@ -28,8 +28,6 @@
\useXMLfilter[prs,run]
-% \input xtag-run
-
\unprotect
% syst-new.tex
diff --git a/Master/texmf-dist/scripts/context/lua/x-ldx.lua b/Master/texmf-dist/tex/context/base/x-ldx.lua
index e0f21d68cd9..18e7b9b38df 100644
--- a/Master/texmf-dist/scripts/context/lua/x-ldx.lua
+++ b/Master/texmf-dist/tex/context/base/x-ldx.lua
@@ -10,6 +10,10 @@ subsystem. On the other hand, we cannot expect proper <logo label='tex'/>
ad for educational purposed the syntax migh be wrong.
--ldx]]--
+-- there is anice parser on from http://lua-users.org/wiki/LpegRecipes (by
+-- Patrick Donnelly) but lua crashes when I apply functions to some of the
+-- matches
+
banner = "version 1.0.1 - 2007+ - PRAGMA ADE / CONTEXT"
--[[
@@ -186,7 +190,7 @@ function ldx.enhance(data) -- i need to use lpeg and then we can properly autoin
for k=1,#t do
t[k] = "<variable>" .. t[k] .. "</variable>"
end
- return table.join(t,", ") .. rest
+ return table.concat(t,", ") .. rest
end)
-- so far
lines[k] = v
@@ -269,10 +273,10 @@ The next function wraps it all in one call:
--ldx]]--
function ldx.convert(luaname,ldxname)
- if not file.isreadable(luaname) then
+ if not file.is_readable(luaname) then
luaname = luaname .. ".lua"
end
- if file.isreadable(luaname) then
+ if file.is_readable(luaname) then
if not ldxname then
ldxname = file.replacesuffix(luaname,"ldx")
end
diff --git a/Master/texmf-dist/tex/context/base/x-ldx.tex b/Master/texmf-dist/tex/context/base/x-ldx.mkiv
index 398ca2345f0..bf9bdf71a74 100644
--- a/Master/texmf-dist/tex/context/base/x-ldx.tex
+++ b/Master/texmf-dist/tex/context/base/x-ldx.mkiv
@@ -1,8 +1,7 @@
-\doifnotmode{mkiv}{\endinput}
-
-\setupxml[method=mkiv,default=hidden]
+\setupxml[default=hidden]
\usemodule[x][mathml]
+\usemodule[abr-02]
\xmlregisterdocumentsetup{ldx}{xml:mml:define}
\xmlregisterdocumentsetup{ldx}{xml:ldx:define}
@@ -134,13 +133,11 @@
\def\xmldocument{ldx}
-\usemodule[abr-02]
-
-% key -> kw
-% dqs -> dq
-% sqs -> sq
-% line -> ln
-% code -> cd
+% key -> kw
+% dqs -> dq
+% sqs -> sq
+% line -> ln
+% code -> cd
% comment -> tx (text)
\definetypeface[mainfacenormal] [ss][sans] [iwona] [default]
@@ -186,6 +183,4 @@
backspace=2cm,
topspace=2cm]
-% \usemodule[inf-02]
-
\endinput
diff --git a/Master/texmf-dist/tex/context/base/x-mathml.lua b/Master/texmf-dist/tex/context/base/x-mathml.lua
index 2ee3cd09093..434aefc553a 100644
--- a/Master/texmf-dist/tex/context/base/x-mathml.lua
+++ b/Master/texmf-dist/tex/context/base/x-mathml.lua
@@ -12,11 +12,13 @@ local texsprint, ctxcatcodes = tex.sprint, tex.ctxcatcodes
local format, lower, find, gsub = string.format, string.lower, string.find, string.gsub
local utfchar, utffind, utfgmatch, utfgsub = utf.char, utf.find, utf.gmatch, utf.gsub
local xmlsprint, xmlcprint, xmltext, xmlcontent = xml.sprint, xml.cprint, xml.text, xml.content
-local lxmltext, get_id = lxml.text, lxml.get_id
+local lxmltext, getid = lxml.text, lxml.getid
local utfcharacters, utfvalues = string.utfcharacters, string.utfvalues
local lpegmatch = lpeg.match
-lxml.mml = lxml.mml or { }
+local mathml = { }
+moduledata.mathml = mathml
+lxml.mathml = mathml -- for the moment
-- an alternative is to remap to private codes, where we can have
-- different properties .. to be done; this will move and become
@@ -27,55 +29,55 @@ lxml.mml = lxml.mml or { }
local doublebar = utfchar(0x2016)
local n_replacements = {
--- [" "] = utfchar(0x2002), -- "&textspace;" -> tricky, no &; in mkiv
- ["."] = "{.}",
- [","] = "{,}",
- [" "] = "",
+-- [" "] = utfchar(0x2002), -- "&textspace;" -> tricky, no &; in mkiv
+ ["."] = "{.}",
+ [","] = "{,}",
+ [" "] = "",
}
local l_replacements = { -- in main table
- ["|"] = "\\mmlleftdelimiter\\vert",
- ["{"] = "\\mmlleftdelimiter\\lbrace",
- ["("] = "\\mmlleftdelimiter(",
- ["["] = "\\mmlleftdelimiter[",
- ["<"] = "\\mmlleftdelimiter<",
- [doublebar] = "\\mmlleftdelimiter\\Vert",
+ ["|"] = "\\mmlleftdelimiter\\vert",
+ ["{"] = "\\mmlleftdelimiter\\lbrace",
+ ["("] = "\\mmlleftdelimiter(",
+ ["["] = "\\mmlleftdelimiter[",
+ ["<"] = "\\mmlleftdelimiter<",
+ [doublebar] = "\\mmlleftdelimiter\\Vert",
}
local r_replacements = { -- in main table
- ["|"] = "\\mmlrightdelimiter\\vert",
- ["}"] = "\\mmlrightdelimiter\\rbrace",
- [")"] = "\\mmlrightdelimiter)",
- ["]"] = "\\mmlrightdelimiter]",
- [">"] = "\\mmlrightdelimiter>",
- [doublebar] = "\\mmlrightdelimiter\\Vert",
+ ["|"] = "\\mmlrightdelimiter\\vert",
+ ["}"] = "\\mmlrightdelimiter\\rbrace",
+ [")"] = "\\mmlrightdelimiter)",
+ ["]"] = "\\mmlrightdelimiter]",
+ [">"] = "\\mmlrightdelimiter>",
+ [doublebar] = "\\mmlrightdelimiter\\Vert",
}
local o_replacements = { -- in main table
- ["@l"] = "\\mmlleftdelimiter.",
- ["@r"] = "\\mmlrightdelimiter.",
- ["{"] = "\\mmlleftdelimiter\\lbrace",
- ["}"] = "\\mmlrightdelimiter\\rbrace",
- ["|"] = "\\mmlleftorrightdelimiter\\vert",
- [doublebar] = "\\mmlleftorrightdelimiter\\Vert",
- ["("] = "\\mmlleftdelimiter(",
- [")"] = "\\mmlrightdelimiter)",
- ["["] = "\\mmlleftdelimiter[",
- ["]"] = "\\mmlrightdelimiter]",
- ["<"] = "\\mmlleftdelimiter<",
- [">"] = "\\mmlrightdelimiter>",
- ["#"] = "\\mmlchar{35}",
- ["$"] = "\\mmlchar{36}", -- $
- ["%"] = "\\mmlchar{37}",
- ["&"] = "\\mmlchar{38}",
- ["^"] = "\\mmlchar{94}{}", -- strange, sometimes luatex math sees the char instead of \char
- ["_"] = "\\mmlchar{95}{}", -- so we need the {}
- ["~"] = "\\mmlchar{126}",
- [" "] = "",
- ["°"] = "^\\circ", -- hack
-
- [utfchar(0xF103C)] = "\\mmlleftdelimiter<",
+ ["@l"] = "\\mmlleftdelimiter.",
+ ["@r"] = "\\mmlrightdelimiter.",
+ ["{"] = "\\mmlleftdelimiter \\lbrace",
+ ["}"] = "\\mmlrightdelimiter\\rbrace",
+ ["|"] = "\\mmlleftorrightdelimiter\\vert",
+ [doublebar] = "\\mmlleftorrightdelimiter\\Vert",
+ ["("] = "\\mmlleftdelimiter(",
+ [")"] = "\\mmlrightdelimiter)",
+ ["["] = "\\mmlleftdelimiter[",
+ ["]"] = "\\mmlrightdelimiter]",
+ -- ["<"] = "\\mmlleftdelimiter<",
+ -- [">"] = "\\mmlrightdelimiter>",
+ ["#"] = "\\mmlchar{35}",
+ ["$"] = "\\mmlchar{36}", -- $
+ ["%"] = "\\mmlchar{37}",
+ ["&"] = "\\mmlchar{38}",
+ ["^"] = "\\mmlchar{94}{}", -- strange, sometimes luatex math sees the char instead of \char
+ ["_"] = "\\mmlchar{95}{}", -- so we need the {}
+ ["~"] = "\\mmlchar{126}",
+ [" "] = "",
+ ["°"] = "^\\circ", -- hack
+
+ -- [utfchar(0xF103C)] = "\\mmlleftdelimiter<",
[utfchar(0xF1026)] = "\\mmlchar{38}",
- [utfchar(0xF103E)] = "\\mmlleftdelimiter>",
+ -- [utfchar(0xF103E)] = "\\mmlleftdelimiter>",
}
@@ -137,250 +139,253 @@ local i_replacements = {
["as"] = "{\\mr as}",
}
+-- we could use a metatable or when accessing fallback on the
+-- key but at least we now have an overview
+
local csymbols = {
arith1 = {
- lcm = "lcm",
- big_lcm = "lcm",
- gcd = "gcd",
- big_gcd = "big_gcd",
- plus = "plus",
- unary_minus = "minus",
- minus = "minus",
- times = "times",
- divide = "divide",
- power = "power",
- abs = "abs",
- root = "root",
- sum = "sum",
- product ="product",
+ lcm = "lcm",
+ big_lcm = "lcm",
+ gcd = "gcd",
+ big_gcd = "big_gcd",
+ plus = "plus",
+ unary_minus = "minus",
+ minus = "minus",
+ times = "times",
+ divide = "divide",
+ power = "power",
+ abs = "abs",
+ root = "root",
+ sum = "sum",
+ product = "product",
},
fns = {
- domain = "domain",
- range = "codomain",
- image = "image",
- identity = "ident",
---~ left_inverse = "",
---~ right_inverse = "",
- inverse = "inverse",
- left_compose = "compose",
- lambda = "labmda",
+ domain = "domain",
+ range = "codomain",
+ image = "image",
+ identity = "ident",
+ -- left_inverse = "",
+ -- right_inverse = "",
+ inverse = "inverse",
+ left_compose = "compose",
+ lambda = "labmda",
},
linalg1 = {
- vectorproduct = "vectorproduct",
- scalarproduct = "scalarproduct",
- outerproduct = "outerproduct",
- transpose = "transpose",
- determinant = "determinant",
- vector_selector = "selector",
---~ matrix_selector = "matrix_selector",
+ vectorproduct = "vectorproduct",
+ scalarproduct = "scalarproduct",
+ outerproduct = "outerproduct",
+ transpose = "transpose",
+ determinant = "determinant",
+ vector_selector = "selector",
+ -- matrix_selector = "matrix_selector",
},
logic1 = {
- equivalent = "equivalent",
- ["not"] = "not",
- ["and"] = "and",
---~ big_and = "",
- ["xor"] = "xor",
---~ big_xor = "",
- ["or"] = "or",
---~ big-or= "",
- implies = "implies",
- ["true"] = "true",
- ["false"] = "false",
+ equivalent = "equivalent",
+ ["not"] = "not",
+ ["and"] = "and",
+ -- big_and = "",
+ ["xor"] = "xor",
+ -- big_xor = "",
+ ["or"] = "or",
+ -- big-or = "",
+ implies = "implies",
+ ["true"] = "true",
+ ["false"] = "false",
},
nums1 = {
---~ based_integer = "based_integer"
- rational = "rational",
- inifinity = "infinity",
- e = "expenonentiale",
- i ="imaginaryi",
- pi = "pi",
- gamma = "gamma",
- NaN, "NaN",
+ -- based_integer = "based_integer"
+ rational = "rational",
+ inifinity = "infinity",
+ e = "expenonentiale",
+ i = "imaginaryi",
+ pi = "pi",
+ gamma = "gamma",
+ NaN = "NaN",
},
relation1 = {
- eq = "eq",
- lt = "lt",
- gt = "gt",
- neq = "neq",
- leq = "leq",
- geq = "geq",
- approx = "approx",
+ eq = "eq",
+ lt = "lt",
+ gt = "gt",
+ neq = "neq",
+ leq = "leq",
+ geq = "geq",
+ approx = "approx",
},
set1 = {
- cartesian_product = "cartesianproduct",
- empty_set = "emptyset",
- map = "map",
- size = "card",
---~ suchthat = "suchthat",
- set = "set",
- intersect = "intersect",
---~ big_intersect = "",
- union = "union",
---~ big_union = "",
- setdiff = "setdiff",
- subset = "subset",
- ["in"] = "in",
- notin = "notin",
- prsubset = "prsubset",
- notsubset = "notsubset",
- notprsubset = "notprsubset",
+ cartesian_product = "cartesianproduct",
+ empty_set = "emptyset",
+ map = "map",
+ size = "card",
+ -- suchthat = "suchthat",
+ set = "set",
+ intersect = "intersect",
+ -- big_intersect = "",
+ union = "union",
+ -- big_union = "",
+ setdiff = "setdiff",
+ subset = "subset",
+ ["in"] = "in",
+ notin = "notin",
+ prsubset = "prsubset",
+ notsubset = "notsubset",
+ notprsubset = "notprsubset",
},
veccalc1 = {
- divergence = "divergence",
- grad = "grad",
- curl = "curl",
- Laplacian = "laplacian",
+ divergence = "divergence",
+ grad = "grad",
+ curl = "curl",
+ Laplacian = "laplacian",
},
calculus1 = {
- diff = "diff",
---~ nthdiff = "",
- partialdiff = "partialdiff",
- int = "int",
---~ defint = "defint",
+ diff = "diff",
+ -- nthdiff = "",
+ partialdiff = "partialdiff",
+ int = "int",
+ -- defint = "defint",
},
integer1 = {
- factorof = "factorof",
- factorial = "factorial",
- quotient = "quotient",
- remainder = "rem",
+ factorof = "factorof",
+ factorial = "factorial",
+ quotient = "quotient",
+ remainder = "rem",
},
linalg2 = {
- vector = "vector",
- matrix = "matrix",
- matrixrow = "matrixrow",
+ vector = "vector",
+ matrix = "matrix",
+ matrixrow = "matrixrow",
},
mathmkeys = {
---~ equiv = "",
---~ contentequiv = "",
---~ contentequiv_strict = "",
+ -- equiv = "",
+ -- contentequiv = "",
+ -- contentequiv_strict = "",
},
rounding1 = {
- ceiling = "ceiling",
- floor = "floor",
---~ trunc = "trunc",
---~ round = "round",
+ ceiling = "ceiling",
+ floor = "floor",
+ -- trunc = "trunc",
+ -- round = "round",
},
setname1 = {
- P = "primes",
- N = "naturalnumbers",
- Z = "integers",
- rationals = "rationals",
- R = "reals",
- complexes = "complexes",
+ P = "primes",
+ N = "naturalnumbers",
+ Z = "integers",
+ rationals = "rationals",
+ R = "reals",
+ complexes = "complexes",
},
complex1 = {
---~ complex_cartesian = "complex_cartesian", -- ci ?
- real = "real",
- imaginary = "imaginary",
---~ complex_polar = "complex_polar", -- ci ?
- argument = "arg",
- conjugate = "conjugate",
+ -- complex_cartesian = "complex_cartesian", -- ci ?
+ real = "real",
+ imaginary = "imaginary",
+ -- complex_polar = "complex_polar", -- ci ?
+ argument = "arg",
+ conjugate = "conjugate",
},
interval1 = { -- not an apply
---~ "integer_interval" = "integer_interval",
- interval = "interval",
- interval_oo = { tag = "interval", closure = "open" },
- interval_cc = { tag = "interval", closure = "closed" },
- interval_oc = { tag = "interval", closure = "open-closed" },
- interval_co = { tag = "interval", closure = "closed-open" },
+ -- integer_interval = "integer_interval",
+ interval = "interval",
+ interval_oo = { tag = "interval", closure = "open" },
+ interval_cc = { tag = "interval", closure = "closed" },
+ interval_oc = { tag = "interval", closure = "open-closed" },
+ interval_co = { tag = "interval", closure = "closed-open" },
},
linalg3 = {
---~ vector = "vector.column",
---~ matrixcolumn = "matrixcolumn",
---~ matrix = "matrix.column",
+ -- vector = "vector.column",
+ -- matrixcolumn = "matrixcolumn",
+ -- matrix = "matrix.column",
},
minmax1 = {
- min = "min",
---~ big_min = "",
- max = "max",
---~ big_max = "",
+ min = "min",
+ -- big_min = "",
+ max = "max",
+ -- big_max = "",
},
piece1 = {
- piecewise = "piecewise",
- piece = "piece",
- otherwise = "otherwise",
+ piecewise = "piecewise",
+ piece = "piece",
+ otherwise = "otherwise",
},
error1 = {
---~ unhandled_symbol = "",
---~ unexpected_symbol = "",
---~ unsupported_CD = "",
+ -- unhandled_symbol = "",
+ -- unexpected_symbol = "",
+ -- unsupported_CD = "",
},
limit1 = {
---~ limit = "limit",
---~ both_sides = "both_sides",
---~ above = "above",
---~ below = "below",
---~ null = "null",
- tendsto = "tendsto",
+ -- limit = "limit",
+ -- both_sides = "both_sides",
+ -- above = "above",
+ -- below = "below",
+ -- null = "null",
+ tendsto = "tendsto",
},
list1 = {
---~ map = "",
---~ suchthat = "",
---~ list = "list",
+ -- map = "",
+ -- suchthat = "",
+ -- list = "list",
},
multiset1 = {
- size = { tag = "card", type="multiset" },
- cartesian_product = { tag = "cartesianproduct", type="multiset" },
- empty_set = { tag = "emptyset", type="multiset" },
---~ multi_set = { tag = "multiset", type="multiset" },
- intersect = { tag = "intersect", type="multiset" },
---~ big_intersect = "",
- union = { tag = "union", type="multiset" },
---~ big_union = "",
- setdiff = { tag = "setdiff", type="multiset" },
- subset = { tag = "subset", type="multiset" },
- ["in"] = { tag = "in", type="multiset" },
- notin = { tag = "notin", type="multiset" },
- prsubset = { tag = "prsubset", type="multiset" },
- notsubset = { tag = "notsubset", type="multiset" },
- notprsubset = { tag = "notprsubset", type="multiset" },
+ size = { tag = "card", type = "multiset" },
+ cartesian_product = { tag = "cartesianproduct", type = "multiset" },
+ empty_set = { tag = "emptyset", type = "multiset" },
+ -- multi_set = { tag = "multiset", type = "multiset" },
+ intersect = { tag = "intersect", type = "multiset" },
+ -- big_intersect = "",
+ union = { tag = "union", type = "multiset" },
+ -- big_union = "",
+ setdiff = { tag = "setdiff", type = "multiset" },
+ subset = { tag = "subset", type = "multiset" },
+ ["in"] = { tag = "in", type = "multiset" },
+ notin = { tag = "notin", type = "multiset" },
+ prsubset = { tag = "prsubset", type = "multiset" },
+ notsubset = { tag = "notsubset", type = "multiset" },
+ notprsubset = { tag = "notprsubset", type = "multiset" },
},
quant1 = {
- forall = "forall",
- exists = "exists",
+ forall = "forall",
+ exists = "exists",
},
s_dist = {
---~ mean = "mean.dist",
---~ sdev = "sdev.dist",
---~ variance = "variance.dist",
---~ moment = "moment.dist",
+ -- mean = "mean.dist",
+ -- sdev = "sdev.dist",
+ -- variance = "variance.dist",
+ -- moment = "moment.dist",
},
s_data = {
- mean = "mean",
- sdev = "sdev",
- variance = "vriance",
- mode = "mode",
- median = "median",
- moment = "moment",
+ mean = "mean",
+ sdev = "sdev",
+ variance = "vriance",
+ mode = "mode",
+ median = "median",
+ moment = "moment",
},
transc1 = {
- log = "log",
- ln = "ln",
- exp = "exp",
- sin = "sin",
- cos = "cos",
- tan = "tan",
- sec = "sec",
- csc = "csc",
- cot = "cot",
- sinh = "sinh",
- cosh = "cosh",
- tanh = "tanh",
- sech = "sech",
- csch = "cscs",
- coth = "coth",
- arcsin = "arcsin",
- arccos = "arccos",
- arctan = "arctan",
- arcsec = "arcsec",
- arcscs = "arccsc",
- arccot = "arccot",
- arcsinh = "arcsinh",
- arccosh = "arccosh",
- arctanh = "arstanh",
- arcsech = "arcsech",
- arccsch = "arccsch",
- arccoth = "arccoth",
+ log = "log",
+ ln = "ln",
+ exp = "exp",
+ sin = "sin",
+ cos = "cos",
+ tan = "tan",
+ sec = "sec",
+ csc = "csc",
+ cot = "cot",
+ sinh = "sinh",
+ cosh = "cosh",
+ tanh = "tanh",
+ sech = "sech",
+ csch = "cscs",
+ coth = "coth",
+ arcsin = "arcsin",
+ arccos = "arccos",
+ arctan = "arctan",
+ arcsec = "arcsec",
+ arcscs = "arccsc",
+ arccot = "arccot",
+ arcsinh = "arcsinh",
+ arccosh = "arccosh",
+ arctanh = "arstanh",
+ arcsech = "arcsech",
+ arccsch = "arccsch",
+ arccoth = "arccoth",
},
}
@@ -442,44 +447,33 @@ function xml.functions.remapopenmath(e)
e.rn = "mml"
end
-function lxml.mml.checked_operator(str)
+function mathml.checked_operator(str)
texsprint(ctxcatcodes,(utfgsub(str,".",o_replacements)))
end
-function lxml.mml.stripped(str)
+function mathml.stripped(str)
tex.sprint(ctxcatcodes,str:strip())
end
-function table.keys_as_string(t)
- local k = { }
- for k,_ in next, t do
- k[#k+1] = k
- end
- return concat(k,"")
-end
-
---~ local leftdelimiters = "[" .. table.keys_as_string(l_replacements) .. "]"
---~ local rightdelimiters = "[" .. table.keys_as_string(r_replacements) .. "]"
-
-function characters.remapentity(chr,slot)
+function characters.remapentity(chr,slot) -- brrrrrr
texsprint(format("{\\catcode%s=13\\xdef%s{\\string%s}}",slot,utfchar(slot),chr))
end
-function lxml.mml.mn(id,pattern)
+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(get_id(id)) or ""
+ local str = xmlcontent(getid(id)) or ""
str = gsub(str,"(%s+)",utfchar(0x205F)) -- medspace e.g.: twenty one (nbsp is not seen)
texsprint(ctxcatcodes,(gsub(str,".",n_replacements)))
end
-function lxml.mml.mo(id)
- local str = xmlcontent(get_id(id)) or ""
+function mathml.mo(id)
+ local str = xmlcontent(getid(id)) or ""
texsprint(ctxcatcodes,(utfgsub(str,".",o_replacements)))
end
-function lxml.mml.mi(id)
- local str = xmlcontent(get_id(id)) or ""
+function mathml.mi(id)
+ local str = xmlcontent(getid(id)) or ""
-- str = gsub(str,"^%s*(.-)%s*$","%1")
local rep = i_replacements[str]
if rep then
@@ -489,8 +483,8 @@ function lxml.mml.mi(id)
end
end
-function lxml.mml.mfenced(id) -- multiple separators
- id = get_id(id)
+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]
texsprint(ctxcatcodes,"\\enabledelimiter")
@@ -562,7 +556,7 @@ local function flush(e,tag,toggle)
return not toggle
end
-function lxml.mml.mmultiscripts(id)
+function mathml.mmultiscripts(id)
local done, toggle = false, false
for e in lxml.collected(id,"/*") do
local tag = e.tg
@@ -609,8 +603,8 @@ local frametypes = {
-- crazy element ... should be a proper structure instead of such a mess
-function lxml.mml.mcolumn(root)
- root = get_id(root)
+function mathml.mcolumn(root)
+ root = getid(root)
local matrix, numbers = { }, 0
local function collect(m,e)
local tag = e.tg
@@ -705,9 +699,9 @@ end
local spacesplitter = lpeg.Ct(lpeg.splitat(" "))
-function lxml.mml.mtable(root)
+function mathml.mtable(root)
-- todo: align, rowspacing, columnspacing, rowlines, columnlines
- root = get_id(root)
+ root = getid(root)
local at = root.at
local rowalign = at.rowalign
local columnalign = at.columnalign
@@ -763,8 +757,8 @@ function lxml.mml.mtable(root)
--~ context.eTABLE()
end
-function lxml.mml.csymbol(root)
- root = get_id(root)
+function mathml.csymbol(root)
+ root = getid(root)
local at = root.at
local encoding = at.encoding or ""
local hash = url.hashed(lower(at.definitionUrl or ""))
@@ -775,8 +769,8 @@ function lxml.mml.csymbol(root)
texsprint(ctxcatcodes,"\\mmlapplycsymbol{",full,"}{",base,"}{",encoding,"}{",text,"}")
end
-function lxml.mml.menclosepattern(root)
- root = get_id(root)
+function mathml.menclosepattern(root)
+ root = getid(root)
local a = root.at.notation
if a and a ~= "" then
texsprint("mml:enclose:",gsub(a," +",",mml:enclose:"))
diff --git a/Master/texmf-dist/tex/context/base/x-mathml.mkiv b/Master/texmf-dist/tex/context/base/x-mathml.mkiv
index a5245c83588..44e2b7432f5 100644
--- a/Master/texmf-dist/tex/context/base/x-mathml.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-mathml.mkiv
@@ -21,7 +21,9 @@
\startmodule [mathml]
-\ctxloadluafile{x-mathml}{}
+\registerctxluafile{x-mathml}{}
+
+\def\ctxmodulemathml#1{\directlua\zerocount{moduledata.mathml.#1}}
\startxmlsetups xml:mml:define
\xmlsetsetup{\xmldocument} {(formula|subformula)} {mml:formula}
@@ -327,7 +329,7 @@
\startxmlsetups mml:apply:mml:fn
\xmldoifelse {#1} {/mml:ci} {
- \edef\mmlfnci{\xmlcontent{#1}{/mml:ci}}% replaces \XMLfnoperator
+ \edef\mmlfnci{\xmlcontent{#1}{/mml:ci}}%
\doifsetupselse{mml:fn:\mmlfnci} { % was mmc:fn:...
\xmlsetup{#1}{mml:fn:\mmlfnci} % \MMLdoL/MMLdoR to be handled in plugin
} {
@@ -391,12 +393,12 @@
\let\MMCfnright\relax
\fi
\xmldoifelse {#1} {/mml:ci} { % first
- \edef\mmlfnci{\xmlcontent{#1}{/mml:ci}}% replaces \XMLfnoperator
+ \edef\mmlfnci{\xmlcontent{#1}{/mml:ci}}%
\doifsetupselse{mml:fn:\mmlfnci} { % was mmc:fn:...
\xmlsetup{#1}{mml:fn:\mmlfnci} % \MMLdoL/MMLdoR to be handled in plugin
} {
\MMLcreset
- \getXMLstackdata\plusone
+ \mmlfirst{#1}
}
} {
\xmldoifelse {#1} {/mml:apply} { % first
@@ -422,7 +424,7 @@
\startxmlsetups mmc:fn:apply % where used?
\xmldoifelse {#1} {/mml:ci} { % first
- \edef\mmlfnci{\xmlcontent{#1}{/mml:ci}}% replaces \XMLfnoperator
+ \edef\mmlfnci{\xmlcontent{#1}{/mml:ci}}%
\doifsetupselse{mml:fn:\mmlfnci} { % was mmc:fn:...
\xmlsetup{#1}{mml:fn:\mmlfnci} % \MMLdoL/MMLdoR to be handled in plugin
} {
@@ -465,7 +467,7 @@
\stoptexdefinition
\startxmlsetups mml:csymbol
- \ctxlua{lxml.mml.csymbol("#1")}
+ \ctxmodulemathml{csymbol("#1")}
\stopxmlsetups
\startxmlsetups mml:csymbol:cdots
@@ -475,22 +477,6 @@
% \startxmlsetups mml:csymbol:<url> \stopxmlsetups
%D Alternative b will convert periods into comma's:
-%D
-%D \startbuffer
-%D \startXMLdata
-%D <imath><apply><cn>1.23</cn></apply></imath>
-%D <dmath><apply><cn>1.23</cn></apply></dmath>
-%D \stopXMLdata
-%D
-%D \type{\setupMMLappearance[cn] [alternative=b]}
-%D
-%D \startXMLdata
-%D <imath><apply><cn>1.23</cn></apply></imath>
-%D <dmath><apply><cn>1.23</cn></apply></dmath>
-%D \stopXMLdata
-%D \stopbuffer
-%D
-%D \start \typebuffer \getbuffer \stop
\setupMMLappearance[cn] [\c!alternative=\v!a]
\setupMMLappearance[polar] [\c!alternative=\v!a] % a|b|c
@@ -564,7 +550,7 @@
\doifelse \MMLbasesymbol \v!no {
\MMLcCNbasedata{\xmlflush{#1}}
} {
- \MMLcCNbasedata{\xmlflush{#1}}_{
+ \MMLcCNbasedata{\xmlflush{#1}}\normalsubscript{
\hbox {$
\mr
\scriptscriptstyle
@@ -599,13 +585,11 @@
\stopxmlsetups
\startxmlsetups mml:cn:polar:b
-% {\mr e}^{\xmlsnippet{#1}{1}\mskip2mu\getXMLentity{imaginaryi}}
- {\mr e}^{\xmlsnippet{#1}{1}+\xmlsnippet{#1}{3}\thinspace{\mr i}}
+ {\mr e}\normalsuperscript{\xmlsnippet{#1}{1}+\xmlsnippet{#1}{3}\thinspace{\mr i}}
\stopxmlsetups
\startxmlsetups mml:cn:polar:c
-% \exp\left(\xmlsnippet{#1}{1}\mskip2mu\getXMLentity{imaginaryi}\right)}
- \exp\left(\xmlsnippet{#1}{1}+\xmlsnippet{#1}{3}\thinspace\getXMLentity{imaginaryi}\right)
+ \exp\left(\xmlsnippet{#1}{1}+\xmlsnippet{#1}{3}\thinspace{\mr i}\right)
\stopxmlsetups
\startxmlsetups mml:cn:complex-polar
@@ -635,7 +619,7 @@
\else
\first
\doifelse \MMLfloatsymbol {dot} \cdot \times
- 10^{\last}
+ 10\normalsuperscript{\last}
\fi \fi
}
\stopxmlsetups
@@ -652,7 +636,7 @@
} {
\xmlsnippet{#1}{1}
\doifelse \MMLenotationsymbol {dot} \cdot
- \times10^{\xmlsnippet{#1}{3}}
+ \times10\normalsuperscript{\xmlsnippet{#1}{3}}
}
\stopxmlsetups
@@ -860,7 +844,7 @@
\startxmlsetups mml:minmax
\xmldoif {#1} {/mml:bvar} {
- {}_{\xmlfirst{#1}{/mml:bvar}}
+ {}\normalsubscript{\xmlfirst{#1}{/mml:bvar}}
}
\left\{
\xmlconcat{#1}{/!(mml:bvar\string|mml:max\string|mml:min)}{\MMLseparator,}
@@ -969,13 +953,13 @@
\gdef\MMLpowerelement{\mmlthird{#1}}% postpone, no xdef
\MMLcreset\mmlsecond{#1}
} {
- \left(\MMLcreset\mmlsecond{#1}\right)^{\MMLcreset\mmlthird{#1}}
+ \left(\MMLcreset\mmlsecond{#1}\right)\normalsuperscript{\MMLcreset\mmlthird{#1}}
}
} {
- \left(\MMLcreset\mmlsecond{#1}\right)^{\MMLcreset\mmlthird{#1}}
+ \left(\MMLcreset\mmlsecond{#1}\right)\normalsuperscript{\MMLcreset\mmlthird{#1}}
}
} {
- \mmlsecond{#1}^{\MMLcreset\mmlthird{#1}}
+ \mmlsecond{#1}\normalsuperscript{\MMLcreset\mmlthird{#1}}
}
\stopxmlsetups
@@ -1061,7 +1045,7 @@
\def\mmlforallexistslist{mml:bvar\string|mml:forall\string|mml:exists\string|mml:condition}
\startxmlsetups mml:forallexists
- _{\xmlconcat{#1}{/mml:bvar}{\MMLseparator,}}
+ \normalsubscript{\xmlconcat{#1}{/mml:bvar}{\MMLseparator,}}
\xmldoifelse {#1} {/mml:condition} {
\thickspace
\begingroup
@@ -1203,17 +1187,17 @@
\startxmlsetups mml:int
\MMLcreset
\xmldoifelse {#1} {/mml:domainofapplication} {
- \int \doMMLlimits{int}_{\xmlfirst{#1}{/mml:domainofapplication}}\relax
+ \int \doMMLlimits{int}\normalsubscript{\xmlfirst{#1}{/mml:domainofapplication}}\relax
} {
\xmldoifelse {#1} {/mml:condition} {
- \int \doMMLlimits{int}_{\xmlfirst{#1}{/mml:condition}}\relax
+ \int \doMMLlimits{int}\normalsubscript{\xmlfirst{#1}{/mml:condition}}\relax
} {
\xmldoifelse {#1} {/mml:lowlimit} {
- \int \doMMLlimits{int}_{\xmlfirst{#1}{/mml:lowlimit}}^{\xmlfirst{#1}{/mml:uplimit}}
+ \int \doMMLlimits{int}\normalsubscript{\xmlfirst{#1}{/mml:lowlimit}}\normalsuperscript{\xmlfirst{#1}{/mml:uplimit}}
} {
% funny, why do we have lowlimit/uplimit then
\xmldoifelse {#1} {/mml:apply/mml:interval} {
- \int \doMMLlimits{int}_{\xmlindex{#1}{/mml:apply}{2}}^{\xmlindex{#1}{/mml:apply}{3}}
+ \int \doMMLlimits{int}\normalsubscript{\xmlindex{#1}{/mml:apply}{2}}\normalsuperscript{\xmlindex{#1}{/mml:apply}{3}}
} {
\int
}
@@ -1240,41 +1224,25 @@
\setupMMLappearance[diff][\c!location=\v!top,\c!alternative=\v!a]
-% \setupMMLappearance[diff][alternative=b]
-%
-% \startXMLdata
-% <math><apply><apply><diff/><bvar><ci>x</ci></bvar><ci>f</ci></apply><ci>a</ci></apply></math>
-% <math><apply><apply><diff/><bvar><ci>x</ci></bvar><degree>2</degree><ci>f</ci></apply><ci>a</ci></apply></math>
-% \stopXMLdata
-
-% d^y/dx^2
-%
-% \startXMLdata
-% <math><apply><diff/>
-% <bvar><ci>x</ci><cn type="integer">2</cn></bvar>
-% <lambda><bvar><ci>x</ci></bvar><ci>y</ci></lambda>
-% </apply></math>
-% \stopXMLdata
-
\startxmlsetups mml:diff
\MMLcreset
\doifelse \MMLdiffalternative \v!a {
\xmldoifelse {#1} {/mml:lambda} {
% a special case (mathadore/openmath)
\frac {
- d^{\xmlfirst{#1}{/mml:bvar}\xmlfirst{#1}{/mml:cn}}{\xmlfirst{#1}{/mml:lambda}\xmlfirst{#1}{/mml:ci}}
+ d\normalsuperscript{\xmlfirst{#1}{/mml:bvar}\xmlfirst{#1}{/mml:cn}}{\xmlfirst{#1}{/mml:lambda}\xmlfirst{#1}{/mml:ci}}
} {
- d{\xmlfirst{#1}{/mml:bvar}\xmlfirst{#1}{/mml:ci}}^{\xmlfirst{#1}{/mml:bvar}\xmlfirst{#1}{/mml:cn}}
+ d{\xmlfirst{#1}{/mml:bvar}\xmlfirst{#1}{/mml:ci}}\normalsuperscript{\xmlfirst{#1}{/mml:bvar}\xmlfirst{#1}{/mml:cn}}
}
} {
\xmldoifelse {#1} {/mml:bvar} {
\frac {
{\mr d}{
\xmldoifelse {#1} {/mml:degree} {
- ^{\xmlconcat{#1}{/mml:degree}\empty}
+ \normalsuperscript{\xmlconcat{#1}{/mml:degree}\empty}
} {
\xmldoif {#1} {/mml:bvar/mml:degree} {
- ^{\xmlconcat{#1}{/mml:bvar/mml:degree}+}
+ \normalsuperscript{\xmlconcat{#1}{/mml:bvar/mml:degree}+}
}
}
}
@@ -1290,22 +1258,22 @@
{\mr d}
\xmlfirst{#1}{/mml:bvar/!mml:degree}
\xmldoif {#1} {/mml:bvar/mml:degree} {
- ^{\xmlfirst{#1}{/mml:bvar/mml:degree}}
+ \normalsuperscript{\xmlfirst{#1}{/mml:bvar/mml:degree}}
}
}
\doifnot \MMLdifflocation \v!top {
\left(\MMLcreset\xmlfirst{#1}{/(mml:apply\string|mml:ci)}\right)
}
} {
- \xmlconcatrange{#1}{/*}{2}{}^\prime
+ \xmlconcatrange{#1}{/*}{2}{}\normalsuperscript\prime
}
}
} {
\MMLcreset
\xmlfirst{#1}{/(mml:apply\string|mml:ci)}
- % there can be problems with nested diff's: ^^{} error
+ % there can be problems with nested diff's: \normalsuperscript\normalsuperscript{} error
% so we add an empty group here
- {}^
+ {}\normalsuperscript
{
\xmldoifelse {#1} {/mml:degree} {
\edef\mmldegree{\xmlfirst{#1}{/mml:degree/mml:cn}}
@@ -1323,7 +1291,7 @@
\startxmlsetups mml:partialdiff
\xmldoifelse {#1} {/mml:list} {
- {\mr D}_{
+ {\mr D}\normalsubscript{
\begingroup
\setfalse\mmllistdelimiters
\xmlall{#1}{/mml:list}
@@ -1333,7 +1301,7 @@
} {
\xmldoifelse {#1} {/mml:bvar} {
\frac {
- {\mr d}^{
+ {\mr d}\normalsuperscript{
\xmldoifelse {#1} {/mml:degree} {
\xmlconcat{#1}{/mml:degree}\empty
} {
@@ -1348,7 +1316,7 @@
}
{\mr d}\xmlfirst{#1}{/(mml:apply\string|mml:reln\string|mml:ci\string|mml:cn)}
\xmldoif {#1} {/mml:bvar/mml:degree} {
- ^{\xmlfirst{#1}{/mml:bvar/mml:degree}}
+ \normalsuperscript{\xmlfirst{#1}{/mml:bvar/mml:degree}}
}
}
} {
@@ -1360,7 +1328,7 @@
\startxmlsetups mml:divergence \mathopnolimits{div} \xmlall{#1}{/!mml:divergence} \stopxmlsetups
\startxmlsetups mml:grad \mathopnolimits{grad} \xmlall{#1}{/!mml:grad} \stopxmlsetups
\startxmlsetups mml:curl \mathopnolimits{curl} \xmlall{#1}{/!mml:curl} \stopxmlsetups
-\startxmlsetups mml:laplacian \nabla^2 \xmlall{#1}{/!mml:laplacian} \stopxmlsetups
+\startxmlsetups mml:laplacian \nabla\normalsuperscript2 \xmlall{#1}{/!mml:laplacian} \stopxmlsetups
\startxmlsetups mml:ident \mathopnolimits{identity} \xmlall{#1}{/!mml:ident} \stopxmlsetups
\setupMMLappearance[domain] [symbol=]
@@ -1370,7 +1338,7 @@
\doifelsenothing \MMLdomainsymbol {
\mathopnolimits{domain}\MMLcreset\xmlall{#1}{/!mml:domain}
} {
- \MMLdomainsymbol_{\xmlall{#1}{/!mml:domain}}
+ \MMLdomainsymbol\normalsubscript{\xmlall{#1}{/!mml:domain}}
}
\stopxmlsetups
@@ -1378,7 +1346,7 @@
\doifelsenothing \MMLcodomainsymbol {
\mathopnolimits{codomain}\MMLcreset\xmlall{#1}{/!mml:codomain}
} {
- \MMLcodomainsymbol_{\xmlall{#1}{/!mml:codomain}}
+ \MMLcodomainsymbol\normalsubscript{\xmlall{#1}{/!mml:codomain}}
}
\stopxmlsetups
@@ -1448,7 +1416,7 @@
\begingroup
\xmldoifelse {#1} {/(mml:condition\string|mml:bvar\string|mml:lowlimit)} {
\def\mmlsumprodlower{
- _{
+ \normalsubscript{
\xmldoifelse {#1} {/mml:condition} {
\mmlstackedsubscripts{\xmlconcat{#1}{/mml:condition}{\crcr}}
} {
@@ -1464,7 +1432,7 @@
\let\mmlsumprodlower\empty
}
\xmldoifelse {#1} {/mml:uplimit} {
- \def\mmlsumprodupper{^{\xmlfirst{#1}{/mml:uplimit}}}
+ \def\mmlsumprodupper{\normalsuperscript{\xmlfirst{#1}{/mml:uplimit}}}
} {
\let\mmlsumprodupper\empty
}
@@ -1472,10 +1440,10 @@
\edef\mmlintervalfrom{\xmlindex{#1}{/mml:interval}{1}}
\edef\mmlintervalto {\xmlindex{#1}{/mml:interval}{2}}
\ifx \mmlintervalfrom \empty \else
- \def\mmlsumprodlower{_{\xmldoif{#1}{/mml:bvar}{\xmlfirst{#1}{/mml:bvar}{=}}\mmlintervalfrom}}
+ \def\mmlsumprodlower{\normalsubscript{\xmldoif{#1}{/mml:bvar}{\xmlfirst{#1}{/mml:bvar}{=}}\mmlintervalfrom}}
\fi
\ifx \mmlintervalto \empty \else
- \def\mmlsumprodupper{^{\mmlintervalto}}
+ \def\mmlsumprodupper{\normalsuperscript{\mmlintervalto}}
\fi
}
\MMLcreset
@@ -1493,7 +1461,7 @@
\startxmlsetups mml:limit
\MMLcreset \lim
- \doMMLlimits {limit}_{
+ \doMMLlimits {limit}\normalsubscript{
\MMLcreset
\xmldoifelse {#1} {/mml:condition} {
\xmlfirst{#1}{/mml:condition}
@@ -1529,18 +1497,18 @@
\setupMMLappearance[log][\c!location=\v!right]
\startxmlsetups mml:exp
-% {\mr e}^{\xmlfirst{#1}{/mml:apply\string|mml:reln\string|mml:ci\string|mml:cn}}
- {\mr e}^{\xmlfirst{#1}{/!mml:exp}}
+% {\mr e}\normalsuperscript{\xmlfirst{#1}{/mml:apply\string|mml:reln\string|mml:ci\string|mml:cn}}
+ {\mr e}\normalsuperscript{\xmlfirst{#1}{/!mml:exp}}
\stopxmlsetups
\startxmlsetups mml:log
\xmldoifelse {#1} {/mml:logbase} {
\doifelse \MMLloglocation \v!left {
\mathop {
- {}^{\xmlfirst{#1}{/mml:logbase}}\negthinspace\mathopnolimits{log}
+ {}\normalsuperscript{\xmlfirst{#1}{/mml:logbase}}\negthinspace\mathopnolimits{log}
}
} {
- \mathopnolimits{log}_{\xmlfirst{#1}{/mml:logbase}}
+ \mathopnolimits{log}\normalsubscript{\xmlfirst{#1}{/mml:logbase}}
}
% \MMLcreset
\xmlfirst{#1}{/(mml:apply\string|mml:reln\string|mml:ci\string|mml:cn)}
@@ -1562,20 +1530,20 @@
% statistics
-\startxmlsetups mml:mean \overline {\mmlsecond{#1}} \stopxmlsetups
-\startxmlsetups mml:sdev \sigma \left(\MMLcreset\mmlsecond{#1}\right) \stopxmlsetups
-\startxmlsetups mml:variance \sigma \left(\MMLcreset\mmlsecond{#1}\right)^2 \stopxmlsetups
-\startxmlsetups mml:median \mathopnolimits{median}\left(\MMLcreset\mmlsecond{#1}\right) \stopxmlsetups
-\startxmlsetups mml:mode \mathopnolimits{mode} \left(\MMLcreset\mmlsecond{#1}\right) \stopxmlsetups
+\startxmlsetups mml:mean \overline {\mmlsecond{#1}} \stopxmlsetups
+\startxmlsetups mml:sdev \sigma \left(\MMLcreset\mmlsecond{#1}\right) \stopxmlsetups
+\startxmlsetups mml:variance \sigma \left(\MMLcreset\mmlsecond{#1}\right)\normalsuperscript2 \stopxmlsetups
+\startxmlsetups mml:median \mathopnolimits{median}\left(\MMLcreset\mmlsecond{#1}\right) \stopxmlsetups
+\startxmlsetups mml:mode \mathopnolimits{mode} \left(\MMLcreset\mmlsecond{#1}\right) \stopxmlsetups
% moments
\startxmlsetups mml:moment
\left\langle
- \xmlfirst{#1}{/(mml:apply\string|mml:reln\string|mml:ci\string|mml:cn)}^{\xmlfirst{#1}{/mml:degree}}
+ \xmlfirst{#1}{/(mml:apply\string|mml:reln\string|mml:ci\string|mml:cn)}\normalsuperscript{\xmlfirst{#1}{/mml:degree}}
\right\rangle
\xmldoif {#1} {mml:momentabout} {
- _{\xmlfirst{#1}{mml:momentabout}}
+ \normalsubscript{\xmlfirst{#1}{mml:momentabout}}
}
\stopxmlsetups
@@ -1630,11 +1598,11 @@
\stopxmlsetups
\startxmlsetups mml:transpose
- \mmlsecond{#1}^{\mathopnolimits{T}}
+ \mmlsecond{#1}\normalsuperscript{\mathopnolimits{T}}
\stopxmlsetups
\startxmlsetups mml:selector
- \MMLmathinner{\mmlsecond{#1}_{\MMLcreset\xmlconcatrange{#1}{/*}{3}{}{\MMLseparator,}}}
+ \MMLmathinner{\mmlsecond{#1}\normalsubscript{\MMLcreset\xmlconcatrange{#1}{/*}{3}{}{\MMLseparator,}}}
\stopxmlsetups
\startxmlsetups mml:vectorproduct \mmlsecond{#1}\times \mmlthird{#1} \stopxmlsetups
@@ -1734,10 +1702,10 @@
\startxmlsetups mml:function
\ifx\MMLpowerelement\empty
- \ifconditional\xmlinversefunction^{-1}\fi
+ \ifconditional\xmlinversefunction\normalsuperscript{-1}\fi
\setfalse\xmlinversefunction
\else
- ^{\ifconditional\xmlinversefunction-\fi\MMLpowerelement}
+ \normalsuperscript{\ifconditional\xmlinversefunction-\fi\MMLpowerelement}
\setfalse\xmlinversefunction
\glet\MMLpowerelement\empty
\fi
@@ -1848,12 +1816,12 @@
% setups
\startxmlsetups mml:mi % todo: mathvariant mathsize mathcolor mathbackground
- \ctxlua{lxml.mml.mi("#1")}
+ \ctxmodulemathml{mi("#1")}
\stopxmlsetups
\startxmlsetups mml:mn % todo: mathvariant mathsize mathcolor mathbackground
\begingroup
- \mr \ctxlua{lxml.mml.mn("#1")}% no \hbox, would be ok for . , but spoils rest
+ \mr \ctxmodulemathml{mn("#1")}% no \hbox, would be ok for . , but spoils rest
\endgroup
\stopxmlsetups
@@ -1864,7 +1832,7 @@
\startxmlsetups mml:mo
\doif {\xmlatt{#1}{maxsize}} {1} {\settrue\mmlignoredelimiter}
\doif {\xmlatt{#1}{stretchy}} {false} {\settrue\mmlignoredelimiter}
- \ctxlua{lxml.mml.mo("#1")}
+ \ctxmodulemathml{mo("#1")}
\setfalse\mmlignoredelimiter
\stopxmlsetups
@@ -1872,7 +1840,7 @@
\def\MMLleft {\left }% weird
\def\MMLright {\right}
\def\MMLmiddle{\middle}
- \ctxlua{lxml.mml.mfenced("#1")}
+ \ctxmodulemathml{mfenced("#1")}
\stopxmlsetups
\defineoverlay [mml:enclose:box] [\useMPgraphic{mml:enclose:box}]
@@ -1934,7 +1902,7 @@
\stopuseMPgraphic
\startxmlsetups mml:menclose
- \edef\mmlmenclosenotation{\ctxlua{lxml.mml.menclosepattern("#1")}}
+ \edef\mmlmenclosenotation{\ctxmodulemathml{menclosepattern("#1")}}
\ifx\mmlmenclosenotation\empty
\xmlflush{#1}
\else
@@ -1987,7 +1955,7 @@
\frac{\mmlfirst{#1}}{\mmlsecond{#1}}
}
\else
- \doifXMLvalelse {mml:mfrac:linethickness} \mmlfraclinethickness {
+ \doifelse {\xmlval{mml:mfrac:linethickness}{\mmlfraclinethickness}{}} {} {
\scratchdimen\xmlval{mml:mfrac:linethickness}\mmlfraclinethickness{.4pt}
} {
\setdimensionwithunit\scratchdimen\mmlfraclinethickness{pt}
@@ -2025,7 +1993,7 @@
\domathtext {
\applymmlsometext{#1}{
\doifelse\MMLscriptsalternative\v!a {
- %\ctxlua{lxml.mml.stripped(\!!bs\xmlflush{#1}\!!es)}
+ %\ctxmodulemathml{stripped(\!!bs\xmlflush{#1}\!!es)}
\ignorespaces
\xmlflush{#1}
\unskip
@@ -2109,25 +2077,25 @@
\startxmlsetups mml:msub
\doifelse\MMLscriptsalternative\v!a {
- {\mmlfirst{#1}}_{\mmlsecond{#1}}
+ {\mmlfirst{#1}}\normalsubscript{\mmlsecond{#1}}
} {
- \mmlfirst{#1} _{\mmlsecond{#1}}
+ \mmlfirst{#1} \normalsubscript{\mmlsecond{#1}}
}
\stopxmlsetups
\startxmlsetups mml:msup
\doifelse\MMLscriptsalternative\v!a {
- {\mmlfirst{#1}}^{\mmlsecond{#1}}
+ {\mmlfirst{#1}}\normalsuperscript{\mmlsecond{#1}}
} {
- \mmlfirst{#1} ^{\mmlsecond{#1}}
+ \mmlfirst{#1} \normalsuperscript{\mmlsecond{#1}}
}
\stopxmlsetups
\startxmlsetups mml:msubsup
\doifelse\MMLscriptsalternative\v!a {
- {\mmlfirst{#1}}_{\mmlsecond{#1}}^{\mmlthird{#1}}
+ {\mmlfirst{#1}}\normalsubscript{\mmlsecond{#1}}\normalsuperscript{\mmlthird{#1}}
} {
- \mmlfirst{#1} _{\mmlsecond{#1}}^{\mmlthird{#1}}
+ \mmlfirst{#1} \normalsubscript{\mmlsecond{#1}}\normalsuperscript{\mmlthird{#1}}
}
\stopxmlsetups
@@ -2192,17 +2160,17 @@
\startxmlsetups mml:munderover
\edef\mmlbasetoken{\xmlraw{#1}{/mml:*[1]}}
\edef\mmlbasecommand{\utfmathcommand\mmlbasetoken}
- \mmlexecuteifdefined\mmlbasecommand{\mathematics{\mmlfirst{#1}}}_{\mmlsecond{#1}}^{\mmlthird{#1}}
+ \mmlexecuteifdefined\mmlbasecommand{\mathematics{\mmlfirst{#1}}}\normalsubscript{\mmlsecond{#1}}\normalsuperscript{\mmlthird{#1}}
\stopxmlsetups
% tables (mml:mtable, mml:mtr, mml:mlabledtr, mml:mtd)
\startxmlsetups mml:mtable % some more attributes need to be supported
- \vcenter{\ctxlua{lxml.mml.mtable("#1")}}
+ \vcenter{\ctxmodulemathml{mtable("#1")}}
\stopxmlsetups
\startxmlsetups mml:mcolumn
- \ctxlua{lxml.mml.mcolumn("#1")}
+ \ctxmodulemathml{mcolumn("#1")}
\stopxmlsetups
\def\mmlsetfakewidth#1{\setbox\scratchbox\hbox{#1}\scratchdimen\wd\scratchbox}
@@ -2283,34 +2251,21 @@
\startxmlsetups mml:mprescripts \stopxmlsetups
\startxmlsetups mml:mmultiscripts
- \ctxlua{lxml.mml.mmultiscripts("#1")}
+ \ctxmodulemathml{mmultiscripts("#1")}
\stopxmlsetups
-\stopmodule
+% goodie
-\protect \endinput
+\definebuffer[mml]
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\stopmml{\xmlprocessbuffer{@mml@}{\thedefinedbuffer{mml}}{}}
-% TODO:
-
-\startmoduletestsection
-
-\def\xflushXMLstackwith#1#2#3#4% num bgroup egroup whatever
- {\dostepwiserecurse{#1}\XMLstacklevel\plusone
- {#2\relax
- \ifnum\recurselevel>#1\relax#4\fi
- \getXMLstackdata\recurselevel
- #3}}
+\stopmodule
-\def\xflushXMLstackfrom#1#2#3%
- {\dostepwiserecurse{#1}\XMLstacklevel\plusone
- {#2\getXMLstackdata\recurselevel#3}}
+\protect \endinput
+% TODO:
+%
% <apply><divide/>
% <apply><minus/>
% <apply><minus/><ci>b</ci></apply>
@@ -2324,46 +2279,59 @@
% </apply>
% </apply>
-\startxmlsetups mml:minus
- \doif \MMLsignreduction \v!yes {
- \setMMLcreset{fn,\MMLcfunctionlist}
- }
- \ifcase\XMLstacklevel
- \or
- % self
- \or
- -\getXMLstackdata\plustwo
- \else
- \dostepwiserecurse \plustwo \XMLstacklevel \plusone {
- \begingroup
- \doifelse {\getXMLstackname\recurselevel} {apply} {
- \ifnum\recurselevel=\plustwo
- \begingroup
- \dodoifelseMMCfunctioninapply \recurselevel {minus} {
- \ifnum\XMLstacklevel>\plustwo
- \endgroup
- \else
- \endgroup
- \MMLcreset
- \fi
- } {
- \endgroup
- }
- \else
- \doifelseMMCfunctioninapply \recurselevel {\MMLcfunctionlist,\MMLcconstructlist} {
- \MMLcreset
- } {
- }
- \fi
- } {
- }
- \getXMLstackdata\recurselevel
- \ifnum\recurselevel<\XMLstacklevel\relax
- -
- \fi
- \endgroup
- }
- \fi
-\stopxmlsetups
-
-\stopmoduletestsection
+% \startmoduletestsection
+%
+% \def\xflushXMLstackwith#1#2#3#4% num bgroup egroup whatever
+% {\dostepwiserecurse{#1}\XMLstacklevel\plusone
+% {#2\relax
+% \ifnum\recurselevel>#1\relax#4\fi
+% \getXMLstackdata\recurselevel
+% #3}}
+%
+% \def\xflushXMLstackfrom#1#2#3%
+% {\dostepwiserecurse{#1}\XMLstacklevel\plusone
+% {#2\getXMLstackdata\recurselevel#3}}
+%
+% \startxmlsetups mml:minus
+% \doif \MMLsignreduction \v!yes {
+% \setMMLcreset{fn,\MMLcfunctionlist}
+% }
+% \ifcase\XMLstacklevel
+% \or
+% % self
+% \or
+% -\getXMLstackdata\plustwo
+% \else
+% \dostepwiserecurse \plustwo \XMLstacklevel \plusone {
+% \begingroup
+% \doifelse {\getXMLstackname\recurselevel} {apply} {
+% \ifnum\recurselevel=\plustwo
+% \begingroup
+% \dodoifelseMMCfunctioninapply \recurselevel {minus} {
+% \ifnum\XMLstacklevel>\plustwo
+% \endgroup
+% \else
+% \endgroup
+% \MMLcreset
+% \fi
+% } {
+% \endgroup
+% }
+% \else
+% \doifelseMMCfunctioninapply \recurselevel {\MMLcfunctionlist,\MMLcconstructlist} {
+% \MMLcreset
+% } {
+% }
+% \fi
+% } {
+% }
+% \getXMLstackdata\recurselevel
+% \ifnum\recurselevel<\XMLstacklevel\relax
+% -
+% \fi
+% \endgroup
+% }
+% \fi
+% \stopxmlsetups
+%
+% \stopmoduletestsection
diff --git a/Master/texmf-dist/tex/context/base/x-mathml.tex b/Master/texmf-dist/tex/context/base/x-mathml.tex
deleted file mode 100644
index 8ad493eeb54..00000000000
--- a/Master/texmf-dist/tex/context/base/x-mathml.tex
+++ /dev/null
@@ -1,16 +0,0 @@
-%D \module
-%D [ file=x-mathml,
-%D version=1999.12.20,
-%D title=\CONTEXT\ XML Modules,
-%D subtitle=Loading \MATHML\ Filters,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\loadmarkfile{x-mathml}
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/x-newcml.tex b/Master/texmf-dist/tex/context/base/x-newcml.mkii
index 76d69ed516b..76d69ed516b 100644
--- a/Master/texmf-dist/tex/context/base/x-newcml.tex
+++ b/Master/texmf-dist/tex/context/base/x-newcml.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-newmme.tex b/Master/texmf-dist/tex/context/base/x-newmme.mkii
index 5e17ea7a469..5e17ea7a469 100644
--- a/Master/texmf-dist/tex/context/base/x-newmme.tex
+++ b/Master/texmf-dist/tex/context/base/x-newmme.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-newmml.tex b/Master/texmf-dist/tex/context/base/x-newmml.tex
deleted file mode 100644
index 9eb994021f1..00000000000
--- a/Master/texmf-dist/tex/context/base/x-newmml.tex
+++ /dev/null
@@ -1,16 +0,0 @@
-%D \module
-%D [ file=x-newmml,
-%D version=2005.06.10, % 1999.12.20,
-%D title=\CONTEXT\ XML Macros,
-%D subtitle=MathML Renderer,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA ADE}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\loadmarkfile{x-newmml}
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/x-newmmo.tex b/Master/texmf-dist/tex/context/base/x-newmmo.mkii
index c3b56cc16b3..c3b56cc16b3 100644
--- a/Master/texmf-dist/tex/context/base/x-newmmo.tex
+++ b/Master/texmf-dist/tex/context/base/x-newmmo.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-newpml.tex b/Master/texmf-dist/tex/context/base/x-newpml.mkii
index d69231e3fdd..d69231e3fdd 100644
--- a/Master/texmf-dist/tex/context/base/x-newpml.tex
+++ b/Master/texmf-dist/tex/context/base/x-newpml.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-openmath.tex b/Master/texmf-dist/tex/context/base/x-openmath.mkii
index 38474996e1b..38474996e1b 100644
--- a/Master/texmf-dist/tex/context/base/x-openmath.tex
+++ b/Master/texmf-dist/tex/context/base/x-openmath.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-pending.mkiv b/Master/texmf-dist/tex/context/base/x-pending.mkiv
deleted file mode 100644
index 20fe5fb6ae2..00000000000
--- a/Master/texmf-dist/tex/context/base/x-pending.mkiv
+++ /dev/null
@@ -1,39 +0,0 @@
-%D \module
-%D [ file=x-pending,
-%D version=2008.04.04,
-%D title=\CONTEXT\ Style File,
-%D subtitle=Track \MKII\ \XML\ usage in \MKIV,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 Including this module will result in the production of
-%D a file \type {jobname-pending-xml.log} which has a
-%D \LUA\ table with \XML\ elements that are still catched by
-%D \MKII\ code, when enabled.
-
-\startluacode
- dofile(resolvers.find_file("lxml-inf.lua"))
- local list = { }
- function document.check_pending_xml_element(str)
- list[str] = (list[str] and (list[str]+1)) or 1
- end
- function document.show_pending_xml_elements()
- io.savedata("\jobname-pending-xml-mkii.log", table.serialize(list))
- io.savedata("\jobname-pending-xml-mkiv.log", table.serialize(lxml.get_command_status()))
- end
-\stopluacode
-
-\defineXMLcommand
- [default]
- {\ctxlua{document.check_pending_xml_element("\currentXMLelement")}}
-
-\appendtoks
- \ctxlua{document.show_pending_xml_elements()}%
-\to \everystoptext
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/x-physml.tex b/Master/texmf-dist/tex/context/base/x-physml.tex
deleted file mode 100644
index 10768db5164..00000000000
--- a/Master/texmf-dist/tex/context/base/x-physml.tex
+++ /dev/null
@@ -1,16 +0,0 @@
-%D \module
-%D [ file=m-physml,
-%D version=2001.09.04,
-%D title=\CONTEXT\ XML Modules,
-%D subtitle=Loading PHYSML Filters,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\loadmarkfile{x-physml}
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/x-res-00.tex b/Master/texmf-dist/tex/context/base/x-res-00.mkii
index 9878d0a5834..9878d0a5834 100644
--- a/Master/texmf-dist/tex/context/base/x-res-00.tex
+++ b/Master/texmf-dist/tex/context/base/x-res-00.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-res-01.tex b/Master/texmf-dist/tex/context/base/x-res-01.mkii
index dc14e70548b..dc14e70548b 100644
--- a/Master/texmf-dist/tex/context/base/x-res-01.tex
+++ b/Master/texmf-dist/tex/context/base/x-res-01.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-res-01.mkiv b/Master/texmf-dist/tex/context/base/x-res-01.mkiv
new file mode 100644
index 00000000000..b82d604848b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/x-res-01.mkiv
@@ -0,0 +1,428 @@
+%D \module
+%D [ file=x-fig-01,
+%D version=2001.03.21,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Figure Base Generation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 See \type {x-fig-00.tex} and \type {x-fig-04.tex} for more
+%D information on how to use and generate figure databases.
+%D This file loads the file named \type {\jobfilename}
+%D (\TEXEXEC\ will set this variable). You can apply this
+%D style to a database by saying:
+%D
+%D \starttyping
+%D context --input=d-res-01.xml auto:x-res-01.mkiv
+%D \stoptyping
+%D
+%D The following modes are supported (not all yet in mkiv):
+%D
+%D \starttabulate[|lT|l|]
+%D \NC letter \NC map the preview on letter size \NC \NR
+%D \NC compact \NC use an alternative presentation \NC \NR
+%D \NC clipgrid-distance \NC add a copy with grid overlayed \NC \NR
+%D \NC clipgrid-steps \NC add a copy with grid overlayed \NC \NR
+%D \NC previewpage-A4 \NC show graphic relative to A4 \NC \NR
+%D \NC previewpage-letter \NC show graphic relative to letter \NC \NR
+%D \NC previewpage-S6 \NC show graphic relative to S6 \NC \NR
+%D \stoptabulate
+%D
+%D The resulting file has the following characteristics:
+%D
+%D \startitemize[packed]
+%D \startitem the document is split into three sections: first each
+%D figure is shown at its own page, then an overview of figures is
+%D shown with some data alongside, and finally an index and table of
+%D contents shows up \stopitem
+%D \startitem there is no title page, which means that one can access
+%D a figure by page number without offset \stopitem
+%D \startitem the document is opened at the first overview page, that
+%D is, when the viewer supports it \stopitem
+%D \startitem the graphic is shown 3~times: on a page of its own,
+%D scaled to a fixed dimension, and relative to a4 or letter paper
+%D size \stopitem
+%D \startitem the labels can be accessed in an index and list at the
+%D end of the document \stopitem
+%D \stopitemize
+
+\defineregister
+ [figureindex]
+ [figureindices]
+
+\setupregister
+ [figureindex]
+ [criterium=text,
+ interaction=text,
+ pagenumber=no,
+ indicator=no]
+
+\setuptolerance
+ [verytolerant]
+
+\setupbuttons
+ [offset=10pt,
+ width=broad,
+ strut=no,
+ rulethickness=1pt,
+ framecolor=darkred]
+
+\setuplayout
+ [topspace=15pt,
+ backspace=15pt,
+ header=0pt,
+ footer=0pt,
+ bottom=20pt,
+ bottomdistance=10pt,
+ width=middle,
+ height=fit]
+
+\setupbackgrounds
+ [page]
+ [background=,
+ backgroundcolor=gray]
+
+\setupinteractionscreen
+ [width=max,
+ height=max]
+
+\setupinteraction
+ [style=,
+ color=,
+ contrastcolor=,
+ state=start]
+
+\setuphead
+ [section]
+ [style=bfb]
+
+\setupinteractionmenu
+ [bottom]
+ [left=\hfill,
+ middle=\hskip10pt,
+ frame=off,
+ style=bold,
+ background=color,
+ backgroundcolor=darkred,
+ foregroundcolor=white]
+
+\startinteractionmenu[bottom]
+ \but [begin] begin \\
+ \but [index] index \\
+ \but [list] list \\
+ \but [CloseDocument] close \\
+ \but [PreviousJump] go back \\
+\stopinteractionmenu
+
+\setupinteraction
+ [openaction=begin]
+
+\setuppapersize
+ [S6][S6]
+
+\setupbackgrounds
+ [page]
+ [background=color]
+
+\setupinteraction
+ [menu=on]
+
+\setupbodyfont
+ [tt,10pt]
+
+\definesymbol [attachment] [{\strut\bf\color[darkred]{\jobname.xml}}]
+\setupattachments [symbol=attachment,alternative=]
+\useattachment [datafile] [\inputfilename]
+
+\xmlloadonly{main}{\inputfilename}{}
+
+\mainlanguage[\xmlattributedef{main}{/rl:library}{language}{en}]
+
+\startxmlsetups xml:resource:asis
+ \startTEXpage[pagestate=start]
+ \xmldoifelsetext{#1}{/rl:label} {
+ \edef\CurrentLabel{\xmltext{#1}{rl:label}}
+ } {
+ \edef\CurrentLabel{\xmltext{#1}{rl:file}}
+ }
+ \pagereference [
+ asis:\CurrentLabel
+ ]
+ \gotobox {
+ \externalfigure[\xmltext{#1}{/rl:file}]
+ }[% tricky no space before [
+ data:\CurrentLabel
+ ]
+ \stopTEXpage
+\stopxmlsetups
+
+\definemeasure[figure:width] [210mm]
+\definemeasure[figure:height][297mm]
+
+\startmode[letter]
+ \enablemode[previewpage-letter]
+\stopmode
+
+\startmode[previewpage-A4]
+ \definemeasure[figure:width] [210mm]
+ \definemeasure[figure:height][297mm]
+\stopmode
+
+\startmode[previewpage-letter]
+ \definemeasure[figure:width] [8.5in]
+ \definemeasure[figure:height][11in]
+\stopmode
+
+\startmode[previewpage-S6]
+ \definemeasure[figure:width] [600pt]
+ \definemeasure[figure:height][450pt]
+\stopmode
+
+\startxmlsetups xml:resource:a
+ \button
+ [
+ width=150pt,
+ height=100pt,
+ offset=10pt,
+ frame=off,
+ background=color,
+ backgroundcolor=white,
+ color=
+ ]
+ {
+ \externalfigure
+ [\xmltext{#1}{rl:file}]
+ [factor=max]
+ }
+ [
+ grid:\CurrentLabel
+ ]
+\stopxmlsetups
+
+\startxmlsetups xml:resource:b
+ \framed
+ [
+ width=150pt,
+ height=100pt,
+ offset=10pt,
+ frame=off,
+ background=color,
+ backgroundcolor=white,
+ color=
+ ]
+ {
+ \externalfigure [
+ \xmltext{#1}{rl:file}
+ ] [
+ factor=max
+ ]
+ }
+\stopxmlsetups
+
+\startxmlsetups xml:resource:data
+
+ % using a layer makes more sense but we had this ...
+
+ \xmldoifelsetext{#1}{/rl:label} {
+ \edef\CurrentLabel{\xmltext{#1}{rl:label}}
+ } {
+ \edef\CurrentLabel{\xmltext{#1}{rl:file}}
+ }
+
+ \button {
+ \hbox to \hsize {
+ \forgetall
+ \dontcomplain
+ \pagereference[data:\CurrentLabel]
+
+ %\ifnum\CurrentPage=1 \pagereference[begin]\fi
+
+ \expanded{\figureindex{\xmltext{#1}{/rl:label}}}
+
+ \vbox to 100pt {
+ \hsize30pt
+ \vskip5pt
+ \hbox to \hsize {
+ \hss
+ \strut
+ \bf
+ \at[asis:\CurrentLabel]
+ \hss
+ }
+ \vfill
+ }
+ \advance\hsize by -30pt
+ \doifmodeelse {clipgrid-distance,clipgrid-steps} {
+ \xmlsetup{#1}{xml:resource:a}
+ } {
+ \xmlsetup{#1}{xml:resource:b}
+ }
+ \edef\CurrentWidth {\the\dimexpr\figurenaturalwidth}
+ \edef\CurrentHeight{\the\dimexpr\figurenaturalheight}
+ \advance\hsize by -150pt
+ \hskip10pt
+ \advance\hsize by -10pt
+ \vbox to 100pt {
+ \hsize40pt
+ \framed [
+ offset=overlay,
+ framecolor=darkred,
+ rulethickness=.5pt
+ ] {
+ \scale [
+ width=40pt
+ ] {
+ \framed [
+ width=\measure{figure:width},
+ height=\measure{figure:height},
+ offset=overlay,
+ frame=off,
+ background=color,
+ backgroundcolor=white
+ ] {
+ \externalfigure
+ [
+ \xmltext{#1}{rl:file}
+ ] [
+ reset=yes
+ ]
+ }
+ }
+ }
+ \vfill
+ }
+ \advance\hsize by -40pt
+ \hskip10pt
+ \advance\hsize by -10pt
+ \vbox to 100pt {
+ \blank[disable]
+ \starttabulate[|Bel|p|]
+ \NC file \NC \xmltext{#1}{/rl:file} \NC \NR
+ \xmldoif{#1}{/rl:label} {\NC label \NC \xmltext{#1}{/rl:label} \NC \NR}
+ \NC dimensions \NC \CurrentWidth\ * \CurrentHeight \NC \NR
+ \xmldoif{#1}{/rl:copyright} {\NC copyright \NC \xmltext{#1}{/rl:copyright} \NC \NR}
+ \xmldoif{#1}{/rl:status} {\NC status \NC \xmltext{#1}{/rl:status} \NC \NR}
+ \xmldoif{#1}{/rl:comment} {\NC comment \NC \xmltext{#1}{/rl:comment} \NC \NR}
+ \stoptabulate
+ \vfill
+ }
+ }
+ } [
+ asis:\CurrentLabel
+ ]
+
+ \vskip10pt
+
+\stopxmlsetups
+
+\startxmlsetups xml:description
+
+ \starttabulate[|lBe|p|]
+ \xmldoif{#1}{/rl:organization} {\NC organization \NC \xmltext{#1}{/rl:organization} \NC \NR}
+ \xmldoif{#1}{/rl:project} {\NC project \NC \xmltext{#1}{/rl:project} \NC \NR}
+ \xmldoif{#1}{/rl:product} {\NC product \NC \xmltext{#1}{/rl:product} \NC \NR}
+ \xmldoif{#1}{/rl:comment} {\NC comment \NC \xmltext{#1}{/rl:comment} \NC \NR}
+ \NC specification \NC \attachment[datafile] \NC \NR
+ \stoptabulate
+
+\stopxmlsetups
+
+\starttext
+
+ \xmlfilter{main}{/rl:library/rl:resource/command(xml:resource:asis)}
+
+ \subject {Figure collection}
+
+ \xmlfilter{main}{/rl:library/rl:description/command(xml:description)}
+
+ \subject [list] {List of figures}
+
+ \xmlfilter{main}{/rl:library/rl:resource/command(xml:resource:data)}
+
+ \page
+
+ \subject [index] {Index of figures}
+
+ \startcolumns
+ \placeregister[figureindex]
+ \stopcolumns
+
+\stoptext
+
+% \doifmodeelse{clipgrid-distance,clipgrid-steps}{\page}{\stoptext}
+
+% \startuniqueMPgraphic{clipgrid}{dx,dy,nx,ny,type}
+% numeric gdx, gdy, lbx, lby ;
+% if \MPvar{type}=1 :
+% gdx := \MPvar{dy} ;
+% gdy := \MPvar{dx} ;
+% else :
+% gdx := OverlayWidth /\MPvar{nx} ;
+% gdy := OverlayHeight/\MPvar{ny} ;
+% fi ;
+% lbx := gdx ;
+% lby := gdy ;
+% defaultfont := "\truefontname{Mono}" ;
+% defaultscale := .5 ;
+% numeric pen ; pen := .25pt ;
+% def MyGrid text t =
+% draw vlingrid (0,OverlayWidth ,gdy,OverlayWidth ,OverlayHeight) t ;
+% draw hlingrid (0,OverlayHeight,gdx,OverlayHeight,OverlayWidth ) t ;
+% enddef ;
+% pickup pencircle scaled pen ;
+% MyGrid withcolor white ;
+% MyGrid dashed evenly scaled pen ;
+% draw OverlayBox withcolor white ;
+% draw OverlayBox dashed evenly scaled pen ;
+% draw vlinlabel.bot(0,eps+OverlayWidth /lby,2,OverlayWidth ) ;
+% draw hlinlabel.lft(0,eps+OverlayHeight/lbx,2,OverlayHeight) ;
+% setbounds currentpicture to OverlayBox enlarged (2*EmWidth) ;
+% \stopuniqueMPgraphic
+
+% \presetMPvariable[clipgrid][dx=10pt]
+% \presetMPvariable[clipgrid][dy=10pt]
+% \presetMPvariable[clipgrid][nx=10]
+% \presetMPvariable[clipgrid][ny=10]
+
+% \startmode[clipgrid-distance]
+% \defineoverlay[grid][\uniqueMPgraphic{clipgrid}{type=1}]
+% \stopmode
+
+% \startmode[clipgrid-steps]
+% \defineoverlay[grid][\uniqueMPgraphic{clipgrid}{type=2}]
+% \stopmode
+
+% \setupexternalfigures
+% [background={color,foreground,grid},
+% backgroundcolor=white]
+
+% \def\StartFigureD
+% {\StartFigureA}
+
+% \def\StopFigureD
+% {\doglobal\increment\CurrentPage
+% \setupbackgrounds[page][background=page]
+% \startpagefigure[\XMLflush{rl:file}][offset=20pt]%
+% \doifelsenothing{\XMLflush{rl:label}}
+% {\expanded{\definereference[Description][about:\XMLflush{rl:file}]}%
+% \expanded{\pagereference[grid:\XMLflush{rl:file}]}}
+% {\expanded{\definereference[Description][about:\XMLflush{rl:label}]}%
+% \expanded{\pagereference[grid:\XMLflush{rl:label}]}}
+% \stoppagefigure
+% %\pagefigure[\XMLflush{rl:file}][offset=20pt]
+% \setupbackgrounds[page][background=]
+% \egroup}
+
+% \defineXMLignore [rl:description]
+% \defineXMLenvironment [rl:figure] \StartFigureD \StopFigureD
+
+% \doglobal\newcounter\CurrentPage
+
+% \processXMLfilegrouped{\jobfullname} \page
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/x-res-02.tex b/Master/texmf-dist/tex/context/base/x-res-02.mkii
index a29f446f345..a29f446f345 100644
--- a/Master/texmf-dist/tex/context/base/x-res-02.tex
+++ b/Master/texmf-dist/tex/context/base/x-res-02.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-res-03.tex b/Master/texmf-dist/tex/context/base/x-res-03.mkii
index bf5ea226cff..bf5ea226cff 100644
--- a/Master/texmf-dist/tex/context/base/x-res-03.tex
+++ b/Master/texmf-dist/tex/context/base/x-res-03.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-res-04.tex b/Master/texmf-dist/tex/context/base/x-res-04.mkii
index b5032f5503f..b5032f5503f 100644
--- a/Master/texmf-dist/tex/context/base/x-res-04.tex
+++ b/Master/texmf-dist/tex/context/base/x-res-04.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-res-08.tex b/Master/texmf-dist/tex/context/base/x-res-08.mkii
index 3d0625f8c93..3d79b00e47a 100644
--- a/Master/texmf-dist/tex/context/base/x-res-08.tex
+++ b/Master/texmf-dist/tex/context/base/x-res-08.mkii
@@ -29,9 +29,7 @@
%D </rl:library>
%D \stoptyping
-\doifnotmode{\systemmodeprefix\v!first}{\endinput}
-
-\unprotect
+\unprotect \doifnotmode{\systemmodeprefix\v!first}{\protect\endinput}
\def\XMLrlprefix{rl:}
diff --git a/Master/texmf-dist/tex/context/base/x-res-09.tex b/Master/texmf-dist/tex/context/base/x-res-09.mkii
index 60823615623..60823615623 100644
--- a/Master/texmf-dist/tex/context/base/x-res-09.tex
+++ b/Master/texmf-dist/tex/context/base/x-res-09.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-res-10.tex b/Master/texmf-dist/tex/context/base/x-res-10.mkii
index f23c503586e..f23c503586e 100644
--- a/Master/texmf-dist/tex/context/base/x-res-10.tex
+++ b/Master/texmf-dist/tex/context/base/x-res-10.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-res-11.tex b/Master/texmf-dist/tex/context/base/x-res-11.mkii
index b8569d22e6f..b8569d22e6f 100644
--- a/Master/texmf-dist/tex/context/base/x-res-11.tex
+++ b/Master/texmf-dist/tex/context/base/x-res-11.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-res-12.tex b/Master/texmf-dist/tex/context/base/x-res-12.mkii
index 1cff4871715..1cff4871715 100644
--- a/Master/texmf-dist/tex/context/base/x-res-12.tex
+++ b/Master/texmf-dist/tex/context/base/x-res-12.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-res-20.tex b/Master/texmf-dist/tex/context/base/x-res-20.mkii
index 3ff069ffd2f..3ff069ffd2f 100644
--- a/Master/texmf-dist/tex/context/base/x-res-20.tex
+++ b/Master/texmf-dist/tex/context/base/x-res-20.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-res-50.tex b/Master/texmf-dist/tex/context/base/x-res-50.mkii
index 382256fd4cb..6fa1a3e4fd2 100644
--- a/Master/texmf-dist/tex/context/base/x-res-50.tex
+++ b/Master/texmf-dist/tex/context/base/x-res-50.mkii
@@ -45,6 +45,8 @@
% output=pdftex
+% \nopdfcompression
+
% bugs in recognizing embedded stream cq. player
% bugs in layers + hide/vide
% bugs in save javascripts
diff --git a/Master/texmf-dist/tex/context/base/x-res-50.mkiv b/Master/texmf-dist/tex/context/base/x-res-50.mkiv
new file mode 100644
index 00000000000..87b63dd97ec
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/x-res-50.mkiv
@@ -0,0 +1,431 @@
+%D \module
+%D [ file=x-res-50,
+%D version=2004.02.18,
+%D title=\CONTEXT\ Style File,
+%D subtitle=Multimedia Presentation,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={\PRAGMA\ / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The xml mapping has to be redone!
+
+\endinput
+
+%D This is a preliminary module, using a preliminary xml media format that
+%D looks as follows (record is embedded in resource library element):
+%D
+%D \starttyping
+%D <rl:mediaclip label="sample 1">
+%D <rl:name>Sample One</rl:name>
+%D <rl:mime>application/x-shockwave-flash</rl:mime>
+%D <rl:file>http://localhost/mb.swf</rl:file>
+%D <rl:width>8cm</rl:width>
+%D <rl:height>6cm</rl:height>
+%D <rl:text>Nothing special to be said.</rl:text>
+%D <rl:picture>cow.pdf</rl:picture>
+%D </rl:mediaclip>
+%D
+%D <rl:mediaclip label="sample 2">
+%D <rl:name>Sample Two</rl:name>
+%D <rl:mime>audio/mpeg</rl:mime>
+%D <rl:file>mb.mp3</rl:file>
+%D <rl:picture>mb.jpg</rl:picture>
+%D </rl:mediaclip>
+%D \stoptyping
+%D
+%D \starttyping
+%D texexec --pdf --use=med-show yourfile.xml
+%D \stoptyping
+%D
+%D Bonus:
+%D
+%D \starttyping
+%D --arg="url=http://localhost:8881/e:/media"
+%D \stoptyping
+
+% output=pdftex
+
+% \nopdfcompression
+
+% bugs in recognizing embedded stream cq. player
+% bugs in layers + hide/vide
+% bugs in save javascripts
+% bugs all over the place
+
+% in principe kan menu overal hetzelfde zijn als we via JS per pagina de clip var zetten,
+% hoewel, misschien zal het menu gaan afhangen van de soort clip
+
+% viewerlayer (eigenschap) aan framed en layer
+
+\usemodule[meta-dum] \usemodule[contml] \autoXMLnamespace [context]
+
+\doifelsevariable{environment}{url}
+ {\setvariables[mediaclip][url=\getvariable{environment}{url}/]}
+ {\setvariables[mediaclip][url=]}
+
+\startmode [silent]
+
+ \setvariables[mediaclip:option][start=]
+
+\stopmode
+
+\startnotmode [silent]
+
+ \setvariables[mediaclip:option][start=auto]
+
+\stopnotmode
+
+\chardef\XMLtokensreduction=1 \dontcomplain % \showframe \pdfcompresslevel=0
+
+\setuppapersize
+ [S6][S6]
+
+\definemeasure [GapSize] [\dimexpr( 15pt)]
+\definemeasure [EdgeWidth] [\dimexpr(100pt)]
+\definemeasure [TextWidth] [\dimexpr(.5\textwidth)]
+\definemeasure [RenderingWidth] [\dimexpr(\textwidth)]
+\definemeasure [RenderingHeight] [\dimexpr(\textheight)]
+
+% \XMLflush{rl:ratio}\dimexpr(.75\textwidth),
+
+\setuplayout
+ [backspace=\measure{GapSize},
+ topspace=\measure{GapSize},
+ header=0pt,
+ footer=0pt,
+ margin=0pt,
+ edgedistance=2\measure{GapSize},
+ rightedge=\measure{EdgeWidth},
+ bottomdistance=2\measure{GapSize},
+ bottom=2\measure{GapSize},
+ height=fit,
+ width=fit]
+
+\setupinteraction
+ [state=start,
+ color=lightgray,
+ contrastcolor=lightgray,
+ openaction=PresetFields,
+ closeaction=ForgetChanges,
+ menu=on,
+ click=no]
+
+\setupinteractionscreen
+ [option=max]
+
+\setupcolors
+ [state=start]
+
+\usetypescript
+ [palatino][texnansi]
+
+\setupbodyfont
+ [palatino]
+
+\definecolor[darkgray] [s=.2]
+\definecolor[mediumgray][s=.5]
+\definecolor[lightgray] [s=.8]
+\definecolor[transgray] [s=1,t=.9,a=1]
+
+\setupbackgrounds
+ [page]
+ [backgroundoffset=\measure{GapSize},
+ background={color,pagebutton},
+ backgroundcolor=black]
+
+\definelayer
+ [main]
+ [width=\textwidth,
+ height=\textheight]
+
+\definelayer
+ [extra]
+ [width=\rightedgewidth,
+ height=\bottomheight]
+
+\setupbackgrounds
+ [text]
+ [backgroundoffset=0pt,
+ background=main]
+
+\setupbackgrounds
+ [bottom][rightedge]
+ [backgroundoffset=0pt,
+ background=extra]
+
+% java scripts
+
+\startJSpreamble {handy} used now
+
+ function ForgetChanges ()
+ { this.dirty = false }
+
+ function PresetFields ()
+ { this.syncAnnotScan() }
+
+\stopJSpreamble
+
+\definereference[PresetFields] [JS(PresetFields)]
+\definereference[ForgetChanges][JS(ForgetChanges)]
+
+% layers
+
+\defineviewerlayer [menulayer] [title=menulayer]
+\defineviewerlayer [textlayer] [title=textlayer,state=stop]
+\defineviewerlayer [datalayer] [title=datalayer,state=stop]
+
+\setupfield
+ [rollbutton]
+ [fieldlayer=menulayer]
+
+\setupfield
+ [rollbutton]
+ [option=auto]
+
+\definepalet
+ [rollover]
+ [n=darkgray,
+ r=lightgray,
+ d=darkgray]
+
+% list
+
+\definelist
+ [clips]
+ [expansion=yes,
+ criterium=text,
+ alternative=f]
+
+% navigation
+
+\defineoverlay[pagebutton][\overlaybutton{HideLayer{textlayer},HideLayer{datalayer},ToggleLayer{menulayer}}]
+\defineoverlay[textbutton][\overlaybutton{HideLayer{textlayer},HideLayer{datalayer}}]
+\defineoverlay[databutton][\overlaybutton{HideLayer{textlayer},HideLayer{datalayer}}]
+
+% clips
+
+\defineXMLenvironment
+ [rl:mediaclip]
+ {\setups[mediaclip:start]}
+ {\setups[mediaclip:stop]}
+
+\newcounter\MediaClip
+
+\startsetups[mediaclip:start]
+
+ \bgroup \startXMLignore
+
+ % no \startstandardmakeup here since we need the dsta in the menuconstruction
+
+ \defineXMLsave [rl:name]
+ \defineXMLsave [rl:visualization]
+ \defineXMLsave [rl:file]
+ \defineXMLsave [rl:mime]
+ \defineXMLsave [rl:picture] [backgroundcolor=lightgray]
+
+ \defineXMLsavecontent [rl:text] {No additional info.}
+ \defineXMLsavecontent [rl:width] {\measure{RenderingWidth}}
+ \defineXMLsavecontent [rl:height] {\measure{RenderingHeight}}
+ \defineXMLsavecontent [rl:aspect] {1}
+
+\stopsetups
+
+\startsetups[mediaclip:stop]
+
+ \startstandardmakeup
+
+ \doifXMLdataelse{rl:file}
+ {\setups[mediaclip:file:yes]}
+ {}
+
+ \doifXMLdataelse{rl:picture}
+ {\doifelse{\XMLflush{rl:picture}}{self}
+ {\setups[mediaclip:picture:self]}
+ {\setups[mediaclip:picture:yes]}}
+ {\setups[mediaclip:picture:no]}
+
+ \doifXMLdata{rl:text}
+ {\setups[mediaclip:text]}
+
+ \setlayerframed
+ [extra]
+ [preset=rightbottom]
+ [frame=off,offset=overlay,width=fit,background=databutton,align=left]
+ {\startviewerlayer[datalayer]\setups[mediaclip:data]\stopviewerlayer}
+
+ \doifXMLdataelse{rl:name}
+ {\writetolist[clips]{}{\XMLflush{rl:name}}}
+ {\writetolist[clips]{}{\XMLpar{rl:mediaclip}{label}{unknown}}}
+
+ \stopstandardmakeup
+
+ \stopXMLignore \egroup
+
+\stopsetups
+
+\setuptabulate
+ [before=,
+ after=]
+
+\def\rlCleanupFileName#1%
+ {\bgroup
+ \def\cleanup##1##2{\ifnum##1##2=20 \space\else\char\octnumber{##1##2}\fi}%
+ \defineactivecharacter 37 {\cleanup}%
+ \scantokens{#1}%
+ \egroup}
+
+\startsetups[mediaclip:data]
+
+ \noindent \buttonframed
+ [framecolor=lightgray,
+ foregroundcolor=lightgray]
+ {\bf\expanded{\rlCleanupFileName{\XMLflush{rl:file}}}}
+
+ \vskip.75\measure{GapSize}
+
+ \noindent \buttonframed
+ [framecolor=lightgray,
+ foregroundcolor=lightgray]
+ {\bf\XMLflush{rl:mime}}
+
+\stopsetups
+
+\startsetups[mediaclip:picture:self]
+
+ \definerenderingwindow
+ [mediaclip]
+ [width=\XMLflush{rl:width},
+ height=\XMLflush{rl:height},
+ frame=off,
+ openpageaction=StartCurrentRendering,
+ closepageaction=StopCurrentRendering]
+
+ \setlayer
+ [main]
+ {\placerenderingwindow[mediaclip][mediaclip-\MediaClip]}
+
+\stopsetups
+
+\startsetups[mediaclip:picture:yes]
+
+ \setlayer
+ [main]
+ {\externalfigure
+ [\XMLflush{rl:picture}]
+ [background=color,
+ backgroundcolor=\XMLpar{rl:picture}{backgroundcolor}{lightgray},
+ factor=max,
+ width=\XMLflush{rl:width},
+ height=\XMLflush{rl:height}]}
+
+\stopsetups
+
+\startsetups[mediaclip:picture:no]
+
+ \setlayer
+ [main]
+ {\externalfigure
+ [dummy]
+ [width=\XMLflush{rl:width},
+ height=\XMLflush{rl:height}]}
+
+\stopsetups
+
+\startsetups[mediaclip:file:yes]
+
+ \doglobal\increment\MediaClip
+
+ \useexternalrendering
+ [mediaclip-\MediaClip]
+ [\XMLflush{rl:mime}]
+ [\getvariable{mediaclip}{url}\XMLflush{rl:file}]
+ [\getvariable{mediaclip:option}{start}]
+
+\stopsetups
+
+\defineinteractionmenu
+ [navigation] [right]
+
+\defineinteractionmenu
+ [control] [bottom]
+
+\setupinteractionmenu
+ [navigation,control]
+ [state=start,
+ frame=on,
+ middle=\hskip.5\measure{GapSize},
+ inbetween=\vskip.5\measure{GapSize}]
+
+\setupinteractionmenu
+ [right,bottom]
+ [distance=overlay]
+
+\startinteractionmenu [navigation]
+ \rob [HideLayer{textlayer},FirstPage] First Page \\
+ \rob [HideLayer{textlayer},PreviousPage] Previous Page \\
+ \rob [HideLayer{textlayer},NextPage] Next Page \\
+ \rob [HideLayer{textlayer},LastPage] Last Page \\
+ \rob [HideLayer{textlayer},clips] List Of Clips \\
+ \rob [ForgetChanges,CloseDocument] Close Document \\
+\stopinteractionmenu
+
+\startinteractionmenu [control]
+ \rob [StartRendering{mediaclip-\MediaClip}] Start \\
+ \rob [StopRendering{mediaclip-\MediaClip}] Stop \\
+ \rob [PauseRendering{mediaclip-\MediaClip}] Pause \\
+ \rob [ResumeRendering{mediaclip-\MediaClip}] Resume \\
+ \rob [ToggleLayer{datalayer}] Info \\
+ \doifXMLdata{rl:text}{\rob [HideLayer{datalayer},ToggleLayer{textlayer}] Text \\}
+\stopinteractionmenu
+
+\startsetups[mediaclip:text]
+
+ \setlayer
+ [extra]
+ [preset=rightbottom]
+ {\startviewerlayer[textlayer]
+ \framed
+ [align=normal,
+ frame=off,
+ width=\measure{TextWidth},
+ foregroundcolor=darkgray,
+ background={color,textbutton},
+ backgroundcolor=lightgray]
+ {\XMLflush{rl:text}}
+ \stopviewerlayer}
+
+\stopsetups
+
+\setupcolors[textcolor=lightgray]
+
+\startsetups [library:start]
+
+ \starttext
+
+ \setupinteractionmenu[control][state=stop]
+
+ \title[clips]{List of Media Clips}
+
+ \placelist[clips] \page
+
+ \setupinteractionmenu[control][state=start]
+
+\stopsetups
+
+\startsetups [library:stop]
+
+ \stoptext
+
+\stopsetups
+
+\defineXMLenvironment [rl:resourcelibrary]
+ {\setups[library:start]}
+ {\setups[library:stop]}
+
+\doifelsenothing{\inputfilename}
+ {\processXMLfile{mediaclient.xml}}
+ {\processXMLfile{\inputfilename}}
diff --git a/Master/texmf-dist/tex/context/base/x-sch-00.tex b/Master/texmf-dist/tex/context/base/x-sch-00.mkii
index 379d19cf2f8..379d19cf2f8 100644
--- a/Master/texmf-dist/tex/context/base/x-sch-00.tex
+++ b/Master/texmf-dist/tex/context/base/x-sch-00.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-sch-01.tex b/Master/texmf-dist/tex/context/base/x-sch-01.mkii
index d72cbf89c84..d72cbf89c84 100644
--- a/Master/texmf-dist/tex/context/base/x-sch-01.tex
+++ b/Master/texmf-dist/tex/context/base/x-sch-01.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-set-01.tex b/Master/texmf-dist/tex/context/base/x-set-01.mkii
index 75e1d43e24b..75e1d43e24b 100644
--- a/Master/texmf-dist/tex/context/base/x-set-01.tex
+++ b/Master/texmf-dist/tex/context/base/x-set-01.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-set-02.tex b/Master/texmf-dist/tex/context/base/x-set-02.mkii
index bb0b7583c33..bb0b7583c33 100644
--- a/Master/texmf-dist/tex/context/base/x-set-02.tex
+++ b/Master/texmf-dist/tex/context/base/x-set-02.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-set-11.mkii b/Master/texmf-dist/tex/context/base/x-set-11.mkii
index 450382a953b..3207ef5f9df 100644
--- a/Master/texmf-dist/tex/context/base/x-set-11.mkii
+++ b/Master/texmf-dist/tex/context/base/x-set-11.mkii
@@ -16,7 +16,271 @@
%
% texmfstart texexec --int=nl --pdf --global --result=setup-nl x-set-12
-\usemodule[set-99] % interface messages
+\startmessages dutch library: setup
+ title: setup
+ formula: formule
+ number: getal
+ list: lijst
+ dimension: maat
+ mark: markering
+ reference: verwijzing
+ command: commando
+ file: file
+ name: naam
+ identifier: naam
+ text: tekst
+ section: sectie
+ singular: naam enkelvoud
+ plural: naam meervoud
+ matrix: n*m
+ see: zie
+ inherits: erft van
+ 1: de karakters < en > zijn globaal actief!
+ 2: -- wordt verwerkt
+ 3: -- is niet gedefinieerd
+ 4: -- wordt nogmaals verwerkt
+ optional: optioneel
+ displaymath: formule
+ index: ingang
+ math: formule
+ nothing: leeg
+ file: file
+ position: positie
+ reference: verwijzing
+ csname: naam
+ destination: bestemming
+ triplet: triplet
+ word: woord
+ content: tekst
+\stopmessages
+
+\startmessages english library: setup
+ title: setup
+ formula: formula
+ number: number
+ list: list
+ dimension: dimension
+ mark: mark
+ reference: reference
+ command: command
+ file: file
+ name: name
+ identifier: identifier
+ text: text
+ section: section
+ singular: singular name
+ plural: plural name
+ matrix: n*m
+ see: see
+ inherits: inherits from
+ 1: the characters < and > are globally active!
+ 2: -- is processed
+ 3: -- is undefined
+ 4: -- is processed again
+ optional: optional
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages german library: setup
+ title: Setup
+ formula: Formel
+ number: Nummer
+ list: Liste
+ dimension: Dimension
+ mark: Beschriftung
+ reference: Referenz
+ command: Befehl
+ file: Datei
+ name: Name
+ identifier: Name
+ text: Text
+ section: Abschnitt
+ singular: singular
+ plural: plural
+ matrix: n*m
+ see: siehe
+ inherits: inherits from
+ 1: Die Zeichen < und > gelten global!
+ 2: -- wird verarbeitet
+ 3: -- ist undefiniert
+ 4: -- ist mehrmals verarbeitet
+ optional: optioneel
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages czech library: setup
+ title: setup
+ formula: rovnice
+ number: cislo
+ list: seznam
+ dimension: dimenze
+ mark: znacka
+ reference: reference
+ command: prikaz
+ file: soubor
+ name: jmeno
+ identifier: jmeno
+ text: text
+ section: sekce
+ singular: jmeno v singularu
+ plural: jmeno v pluralu
+ matrix: n*m
+ see: viz
+ inherits: inherits from
+ 1: znaky < a > jsou globalne aktivni!
+ 2: -- je zpracovano
+ 3: -- je nedefinovano
+ 4: -- je zpracovano znovu
+ optional: optioneel
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages italian library: setup
+ title: setup
+ formula: formula
+ number: number
+ list: list
+ dimension: dimension
+ mark: mark
+ reference: reference
+ command: command
+ file: file
+ name: name
+ identifier: name
+ text: text
+ section: section
+ singular: singular name
+ plural: plural name
+ matrix: n*m
+ see: see
+ inherits: inherits from
+ 1: the characters < and > are globally active!
+ 2: -- is processed
+ 3: -- is undefined
+ 4: -- is processed again
+ optional: optioneel
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages romanian library: setup
+ title: setari
+ formula: formula
+ number: numar
+ list: lista
+ dimension: dimensiune
+ mark: marcaj
+ reference: referinta
+ command: comanda
+ file: fisier
+ name: nume
+ identifier: nume
+ text: text
+ section: sectiune
+ singular: nume singular
+ plural: nume pluram
+ matrix: n*m
+ see: vezi
+ inherits: inherits from
+ 1: caracterele < si > sunt active global!
+ 2: este procesat --
+ 3: -- este nedefinit
+ 4: -- este procesat din nou
+ optional: optioneel
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages french library: setup
+ title: réglage
+ formula: formule
+ number: numéro
+ list: liste
+ dimension: dimension
+ mark: marquage
+ reference: reference
+ command: commande
+ file: fichier
+ name: nom
+ identifier: identificateur
+ text: texte
+ section: section
+ singular: nom singulier
+ plural: nom pluriel
+ matrix: n*m
+ see: vois
+ inherits: herite de
+ 1: les caractères < et > sont globalement actifs !
+ 2: -- est traité
+ 3: -- n'est pas défini
+ 4: -- est traité de nouveau
+ optional: optionel
+ displaymath: formule
+ index: entrée
+ math: formule
+ nothing: vide
+ file: fichier
+ position: position
+ reference: réference
+ csname: nom
+ destination: destination
+ triplet: triplet
+ word: mot
+ content: texte
+\stopmessages
\unprotect
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 784df311389..ceba34f3d54 100644
--- a/Master/texmf-dist/tex/context/base/x-set-11.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-set-11.mkiv
@@ -12,6 +12,9 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% we can make this module a bit cleaner using more recent features
+% like sorting the xml directly
+
% \startluacode
% collectgarbage("stop")
% function collectgarbage() return 0 end
@@ -26,24 +29,288 @@
% \setup{setupinterlinespace:1}
% \setup{setupinterlinespace:2}
%
-% cd:include -> @file
+% cd:include -> filename
% cd:choice
%
% register, interaction
-\usemodule[set-99] % interface messages
+\startmessages dutch library: setup
+ title: setup
+ formula: formule
+ number: getal
+ list: lijst
+ dimension: maat
+ mark: markering
+ reference: verwijzing
+ command: commando
+ file: file
+ name: naam
+ identifier: naam
+ text: tekst
+ section: sectie
+ singular: naam enkelvoud
+ plural: naam meervoud
+ matrix: n*m
+ see: zie
+ inherits: erft van
+ 1: de karakters < en > zijn globaal actief!
+ 2: -- wordt verwerkt
+ 3: -- is niet gedefinieerd
+ 4: -- wordt nogmaals verwerkt
+ optional: optioneel
+ displaymath: formule
+ index: ingang
+ math: formule
+ nothing: leeg
+ file: file
+ position: positie
+ reference: verwijzing
+ csname: naam
+ destination: bestemming
+ triplet: triplet
+ word: woord
+ content: tekst
+\stopmessages
+
+\startmessages english library: setup
+ title: setup
+ formula: formula
+ number: number
+ list: list
+ dimension: dimension
+ mark: mark
+ reference: reference
+ command: command
+ file: file
+ name: name
+ identifier: identifier
+ text: text
+ section: section
+ singular: singular name
+ plural: plural name
+ matrix: n*m
+ see: see
+ inherits: inherits from
+ 1: the characters < and > are globally active!
+ 2: -- is processed
+ 3: -- is undefined
+ 4: -- is processed again
+ optional: optional
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages german library: setup
+ title: Setup
+ formula: Formel
+ number: Nummer
+ list: Liste
+ dimension: Dimension
+ mark: Beschriftung
+ reference: Referenz
+ command: Befehl
+ file: Datei
+ name: Name
+ identifier: Name
+ text: Text
+ section: Abschnitt
+ singular: singular
+ plural: plural
+ matrix: n*m
+ see: siehe
+ inherits: inherits from
+ 1: Die Zeichen < und > gelten global!
+ 2: -- wird verarbeitet
+ 3: -- ist undefiniert
+ 4: -- ist mehrmals verarbeitet
+ optional: optioneel
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages czech library: setup
+ title: setup
+ formula: rovnice
+ number: cislo
+ list: seznam
+ dimension: dimenze
+ mark: znacka
+ reference: reference
+ command: prikaz
+ file: soubor
+ name: jmeno
+ identifier: jmeno
+ text: text
+ section: sekce
+ singular: jmeno v singularu
+ plural: jmeno v pluralu
+ matrix: n*m
+ see: viz
+ inherits: inherits from
+ 1: znaky < a > jsou globalne aktivni!
+ 2: -- je zpracovano
+ 3: -- je nedefinovano
+ 4: -- je zpracovano znovu
+ optional: optioneel
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages italian library: setup
+ title: setup
+ formula: formula
+ number: number
+ list: list
+ dimension: dimension
+ mark: mark
+ reference: reference
+ command: command
+ file: file
+ name: name
+ identifier: name
+ text: text
+ section: section
+ singular: singular name
+ plural: plural name
+ matrix: n*m
+ see: see
+ inherits: inherits from
+ 1: the characters < and > are globally active!
+ 2: -- is processed
+ 3: -- is undefined
+ 4: -- is processed again
+ optional: optioneel
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages romanian library: setup
+ title: setari
+ formula: formula
+ number: numar
+ list: lista
+ dimension: dimensiune
+ mark: marcaj
+ reference: referinta
+ command: comanda
+ file: fisier
+ name: nume
+ identifier: nume
+ text: text
+ section: sectiune
+ singular: nume singular
+ plural: nume pluram
+ matrix: n*m
+ see: vezi
+ inherits: inherits from
+ 1: caracterele < si > sunt active global!
+ 2: este procesat --
+ 3: -- este nedefinit
+ 4: -- este procesat din nou
+ optional: optioneel
+ displaymath: formula
+ index: entry
+ math: formula
+ nothing: empty
+ file: file
+ position: position
+ reference: reference
+ csname: name
+ destination: destination
+ triplet: triplet
+ word: word
+ content: text
+\stopmessages
+
+\startmessages french library: setup
+ title: réglage
+ formula: formule
+ number: numéro
+ list: liste
+ dimension: dimension
+ mark: marquage
+ reference: reference
+ command: commande
+ file: fichier
+ name: nom
+ identifier: identificateur
+ text: texte
+ section: section
+ singular: nom singulier
+ plural: nom pluriel
+ matrix: n*m
+ see: vois
+ inherits: herite de
+ 1: les caractères < et > sont globalement actifs !
+ 2: -- est traité
+ 3: -- n'est pas défini
+ 4: -- est traité de nouveau
+ optional: optionel
+ displaymath: formule
+ index: entrée
+ math: formule
+ nothing: vide
+ file: fichier
+ position: position
+ reference: réference
+ csname: nom
+ destination: destination
+ triplet: triplet
+ word: mot
+ content: texte
+\stopmessages
\unprotect
% general
-\unexpanded\def\setupnumfont {}
-\unexpanded\def\setuptxtfont {}
-\unexpanded\def\setupintfont {\WORD}
-\unexpanded\def\setupvarfont {\sl}
-\unexpanded\def\setupoptfont {\sl}
-\unexpanded\def\setupalwcolor {}
-\unexpanded\def\setupoptcolor {darkgray}
+\unexpanded\def\setupnumfont {}
+\unexpanded\def\setuptxtfont {}
+\unexpanded\def\setupintfont {\WORD}
+\unexpanded\def\setupvarfont {\sl}
+\unexpanded\def\setupoptfont {\sl}
+\unexpanded\def\setupalwcolor{}
+\unexpanded\def\setupoptcolor{darkgray}
\def\c!setup!definereserved#1#2%
{\setvalue{c!setup!:r:#1}{#2}}
@@ -97,7 +364,7 @@
\let\currentSETUPfullname\s!unknown
\startxmlsetups xml:setups:assemblename
- \doifelse {\xmlatt{#1}{environment}} {yes} {
+ \doifelse {\xmlatt{#1}{type}} {environment} {
\let\currentSETUPprefix\e!start
} {
\let\currentSETUPprefix\empty
@@ -127,6 +394,7 @@
\stopxmlsetups
\startxmlsetups xml:setups:basics
+ \xmlinclude{#1}{include}{filename}%
\xmlsetsetup {#1} {
sequence|string|variable|assignments|keywords|content|displaymath|index|math|
nothing|file|position|reference|csname|destination|triplet|word|
@@ -148,13 +416,13 @@
{\doonlyonce{setups:#1}
{\doglobal\prependtocommalist{setups:#1}\loadedsetups % last overloads first
\xmlloadonly{setups:#1}{#1}{setups}%
- \xmlfilter{setups:#1}{/interface/command/command(xml:setups:register)}}}} % qualified path saves > 50% runtime
+ \xmlfilter{setups:#1}{interface/command/command(xml:setups:register)}}}} % qualified path saves > 50% runtime
\newif\ifshortsetup
\unexpanded\def\setup {\shortsetupfalse\doshowsetup}
-\def\showsetup {\shortsetupfalse\doshowsetup}
-\def\shortsetup{\shortsetuptrue \doshowsetup}
+\unexpanded\def\showsetup {\shortsetupfalse\doshowsetup}
+\unexpanded\def\shortsetup{\shortsetuptrue \doshowsetup}
\unexpanded\def\setupsetup{\dodoubleargument\getparameters[\??stp]}
%unexpanded\def\showsetupinlist#1#2#3{\shortsetupfalse\showsetupindeed{#3}\par}
@@ -176,8 +444,11 @@
{\registersort[texcommand][stp:x:#1]%
\showsetupindeed{#1}}
+% \def\showsetupindeed#1%
+% {\xmlfilterlist{\loadedsetups}{interface/command[@name='#1']/command(xml:setups:typeset)}}
+
\def\showsetupindeed#1%
- {\xmlfilterlist{\loadedsetups}{/interface/command[@name='#1']/command(xml:setups:typeset)}}
+ {\xmlfilterlist{\loadedsetups}{interface/command['#1' == (@type=='environment' and 'start' or '') .. @name]/command(xml:setups:typeset)}}
\unexpanded\def\placesetup {\placelistofsorts[texcommand][\c!criterium=\v!used]}
\unexpanded\def\placeallsetups{\placelistofsorts[texcommand][\c!criterium=\v!all ]}
@@ -205,6 +476,7 @@
\doglobal\newcounter\currentSETUPargument
\xdef\maximumSETUPargument{\xmlcount{#1}{/arguments/*}}
\bgroup
+ \enablemode[setups-pass-one]%
\doif {\xmlatt{#1}{generated}} {yes} {
\ttsl
}
@@ -226,12 +498,13 @@
}
\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/variable/first()}
+ \xmlfilter{#1}{/sequence/first()}
\ignorespaces
\egroup
}
@@ -256,7 +529,7 @@
\startxmlsetups xml:setups:resolve
\ignorespaces
- \xmlfilterlist{\loadedsetups}{/interface/define[@name='\xmlatt{#1}{name}']/first()}
+ \xmlfilterlist{\loadedsetups}{interface/define[@name='\xmlatt{#1}{name}']/first()}
\stopxmlsetups
%D This is the first pass; here we generate the top line.
diff --git a/Master/texmf-dist/tex/context/base/x-set-11.tex b/Master/texmf-dist/tex/context/base/x-set-11.tex
deleted file mode 100644
index 920fd7426d0..00000000000
--- a/Master/texmf-dist/tex/context/base/x-set-11.tex
+++ /dev/null
@@ -1,110 +0,0 @@
-%D \module
-%D [ file=x-set-11,
-%D version=2004.10.31,
-%D remark=setupx.tex: 1998.07.20 and later,
-%D title=\CONTEXT\ Setup Definitions,
-%D subtitle=Macro Definitions,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\loadmarkfile{x-set-11}
-
-\endinput
-
-% Old code, a mixture of loading in mkiv and processing in mkii.
-
-\startluacode
- do
- document = document or { }
-
- document.setups = {
- loaded = { },
- root = nil,
- used = { },
- }
-
- function document.setups.load(filename)
- filename = resolvers.find_file(filename) or ""
- if filename ~= "" and not document.setups.loaded[filename] then
- local loaded = xml.load(filename)
- if loaded then
- if document.setups.root then
- xml.inject(document.setups.root,"/",loaded)
- else
- document.setups.root = loaded
- end
- document.setups.loaded[filename] = true
- end
- end
- end
- function document.setups.name(ek)
- local at = ek.at
- local name = at.name
- if at.type == 'environment' then
- name = "start" .. name
- end
- if at.variant then
- name = name .. ":" .. at.variant
- end
- if at.generated == "yes" then
- name = name .. "*"
- end
- return name:lower()
- end
- function document.setups.show(name)
- if document.setups.root then
- local name = name:gsub("[<>]","")
- local setup = xml.first(document.setups.root,"cd:command[@name='" .. name .. "']")
- document.setups.used[#document.setups.used+1] = setup
- xml.sprint(setup)
- end
- end
- function document.setups.showused()
- if document.setups.root and next(document.setups.used) then
- for k,v in ipairs(table.sortedkeys(document.setups.used)) do
- xml.sprint(document.setups.used[v])
- end
- end
- end
- function document.setups.showall()
- if document.setups.root then
- local list = { }
- xml.each_element(document.setups.root,"cd:command", function(r,d,t)
- local ek = d[t]
- list[document.setups.name(ek)] = ek
- end )
- for k,v in ipairs(table.sortedkeys(list)) do
- xml.sprint(list[v])
- end
- end
- end
- function document.setups.resolve(name)
- if document.setups.root then
- local e = xml.filter(document.setups.root,string.format("cd:define[@name='%s']/text()",name))
- if e then
- xml.sprint(e)
- end
- end
- end
- end
-\stopluacode
-
-\def\mkloadsetups #1{\ctxlua{document.setups.load("#1")}}
-\def\mkshowsetup #1{\ctxlua{document.setups.show("#1")}}
-\def\mkshowusedsetups {\bgroup\enableXML\ctxlua{document.setups.showused()}\egroup}
-\def\mkshowallsetups {\bgroup\enableXML\ctxlua{document.setups.showall ()}\egroup}
-
-\def\mkshowsetup #1{\bgroup\enableXML\ctxlua{document.setups.show("#1")}\egroup}
-
-\defineXMLenvironmentsave [cd:define] [name=]
- {}
-
-\defineXMLsingular [cd:resolve] [name=]
- {\enableXML\ignorespaces\ctxlua{document.setups.resolve("\XMLop{name}")}}
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/x-set-12.tex b/Master/texmf-dist/tex/context/base/x-set-12.mkii
index d7990143365..d7990143365 100644
--- a/Master/texmf-dist/tex/context/base/x-set-12.tex
+++ b/Master/texmf-dist/tex/context/base/x-set-12.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-set-12.mkiv b/Master/texmf-dist/tex/context/base/x-set-12.mkiv
new file mode 100644
index 00000000000..d95aff4a3f4
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/x-set-12.mkiv
@@ -0,0 +1,258 @@
+%D \module
+%D [ file=x-set-12,
+%D version=2004.10.31,
+%D remark=setupx.tex: 1998.07.20 and later,
+%D title=\CONTEXT\ Setup Definitions,
+%D subtitle=Macro Definitions,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\usemodule[set-11]
+
+\unprotect
+
+% \starttext
+% \setup{installlanguage}
+% \placesetup
+% \stoptext
+
+\definecolor[TitleColor][r=.375,g=.125,b=.125]
+\definecolor[TitleColor][r=.125,g=.375,b=.125]
+\definecolor[TitleColor][r=.125,g=.125,b=.375]
+\definecolor[TitleColor][r=.375,g=.375,b=.125]
+\definecolor[TitleColor][r=.375,g=.125,b=.375]
+\definecolor[TitleColor][r=.125,g=.375,b=.375]
+
+\definecolor[TitleColor][r=.25,g=.20,b=.15]
+\definecolor[TitleColor][r=.25,g=.15,b=.20]
+\definecolor[TitleColor][r=.20,g=.15,b=.25]
+\definecolor[TitleColor][r=.20,g=.25,b=.15]
+\definecolor[TitleColor][r=.15,g=.20,b=.25]
+\definecolor[TitleColor][r=.15,g=.25,b=.20]
+
+\startinterface english \loadsetups[cont-en.xml] \stopinterface
+\startinterface dutch \loadsetups[cont-nl.xml] \stopinterface
+\startinterface german \loadsetups[cont-de.xml] \stopinterface
+\startinterface french \loadsetups[cont-fr.xml] \stopinterface
+\startinterface italian \loadsetups[cont-it.xml] \stopinterface
+\startinterface czech \loadsetups[cont-cs.xml] \stopinterface
+\startinterface romanian \loadsetups[cont-ro.xml] \stopinterface
+
+\startinterface dutch \definecolor[LocalColor][r=.75,g=.25,b=.25] \stopinterface
+\startinterface english \definecolor[LocalColor][r=.25,g=.75,b=.25] \stopinterface
+\startinterface german \definecolor[LocalColor][r=.25,g=.25,b=.75] \stopinterface
+\startinterface french \definecolor[LocalColor][r=.75,g=.75,b=.25] \stopinterface
+\startinterface czech \definecolor[LocalColor][r=.75,g=.25,b=.75] \stopinterface
+\startinterface italian \definecolor[LocalColor][r=.25,g=.75,b=.75] \stopinterface
+\startinterface romanian \definecolor[LocalColor][r=.5,g=.4,b=.3] \stopinterface
+% \definecolor[LocalColor][r=.5,g=.3,b=.4]
+% \definecolor[LocalColor][r=.4,g=.3,b=.5]
+% \definecolor[LocalColor][r=.4,g=.5,b=.3]
+% \definecolor[LocalColor][r=.3,g=.4,b=.5]
+% \definecolor[LocalColor][r=.3,g=.5,b=.4]
+
+\startinterface english \definecolor[TitleColor][r=.375,g=.125,b=.125] \stopinterface
+\startinterface dutch \definecolor[TitleColor][r=.125,g=.375,b=.125] \stopinterface
+\startinterface german \definecolor[TitleColor][r=.125,g=.125,b=.375] \stopinterface
+\startinterface french \definecolor[TitleColor][r=.375,g=.375,b=.125] \stopinterface
+\startinterface italian \definecolor[TitleColor][r=.375,g=.125,b=.375] \stopinterface
+\startinterface czech \definecolor[TitleColor][r=.125,g=.375,b=.375] \stopinterface
+\startinterface romanian \definecolor[TitleColor][r=.25,g=.20,b=.15] \stopinterface
+% \definecolor[TitleColor][r=.25,g=.15,b=.20]
+% \definecolor[TitleColor][r=.20,g=.15,b=.25]
+% \definecolor[TitleColor][r=.20,g=.25,b=.15]
+% \definecolor[TitleColor][r=.15,g=.20,b=.25]
+% \definecolor[TitleColor][r=.15,g=.25,b=.20]
+
+\definecolor [lightgray] [s=.9]
+\definecolor [darkgray] [s=.1]
+
+\usetypescript[palatino]
+\setupbodyfont[palatino,9pt]
+
+\setupcolors
+ [\c!state=\v!start]
+
+\defineoverlay
+ [cover]
+ [\hbox to \paperwidth{\hss\reuseMPgraphic{cover+back}}]
+
+\defineoverlay
+ [back]
+ [\hbox to \paperwidth{\reuseMPgraphic{cover+back}\hss}]
+
+\startreusableMPgraphic{cover+back}
+ numeric h, w ; path p, q, r ; color f, d ; pair s ;
+ h := OverlayHeight ; w := 2*OverlayWidth ;
+ r := unitsquare xyscaled (w,h) ;
+ fill r withcolor \MPcolor{lightgray} ;
+ set_grid(w,h,w/8,w/16) ;
+ forever :
+ s := center r randomized (w,h) ;
+ if new_on_grid(xpart s, ypart s) :
+ s := (dx,dy) ;
+ p := fullsquare xyscaled(w/4,w/8) ;
+ q := (-4w,ypart ulcorner p) -- .5[ulcorner p, urcorner p] -- (4w,ypart urcorner p) ;
+ q := q shifted (0,-w/24) ;
+ p := p randomized (w/40,w/40) ;
+ q := q randomized (0,w/100) ;
+ q := q cutafter (p cutafter point 3 of p) ;
+ q := q cutbefore (p cutbefore point 3 of p) ;
+ d := .5[\MPcolor{LocalColor},\MPcolor{lightgray}] randomized (.5,.9) ;
+ f := \MPcolor{lightgray} randomized (.5,.9) ;
+ pickup pencircle scaled (w/100) ;
+ fill p shifted s withcolor f ;
+ draw p shifted s withcolor d ;
+ draw q shifted s withcolor d ;
+ fi ;
+ exitif grid_full ;
+ endfor ;
+ setbounds currentpicture to r ;
+\stopreusableMPgraphic
+
+\definelayout
+ [titlepage]
+ [\c!backspace=1cm,
+ \c!topspace=1cm,
+ \c!width=\v!middle,
+ \c!height=\v!middle,
+ \c!header=0pt,
+ \c!footer=0pt]
+
+\setuplayout
+ [\c!backspace=2cm,
+ \c!topspace=1.5cm,
+ \c!header=0cm,
+ \c!footer=0cm,
+ \c!width=\v!middle,
+ \c!height=\v!middle]
+
+\setuppagenumbering
+ [\c!alternative=\v!doublesided]
+
+\setupsetup
+ [\c!criterium=\v!all,
+ \c!reference=0]
+
+\setupframedtexts
+ [setuptext]
+ [\c!before=\blank,
+ \c!after=\blank,
+ \c!frame=\v!on,
+ \c!rulethickness=1pt,
+ \c!framecolor=TitleColor]
+
+\setupunderbar
+ [\c!rulethickness=1pt,
+ \c!rulecolor=TitleColor]
+
+\starttext
+
+\setupbackgrounds
+ [\v!rightpage]
+ [\c!background=cover]
+
+\setuplayout
+ [titlepage]
+
+\startsetups text:commands
+ \startinterface dutch \strut commando's \par \stopinterface
+ \startinterface english \strut commands \par \stopinterface
+ \startinterface german \strut befehle \par \stopinterface
+ \startinterface french \strut commandes \par \stopinterface
+ \startinterface czech \strut p\v{r}ikazy \par \stopinterface
+ \startinterface italian \strut comandi \par \stopinterface
+ \startinterface romanian \strut comenzile \par \stopinterface
+\stopsetups
+
+\startsetups text:uppercase
+ \startinterface dutch NL\stopinterface
+ \startinterface english EN\stopinterface
+ \startinterface german DE\stopinterface
+ \startinterface french FR\stopinterface
+ \startinterface czech CS\stopinterface
+ \startinterface italian IT\stopinterface
+ \startinterface romanian RO\stopinterface
+\stopsetups
+
+\startsetups text:lowercase
+ \startinterface dutch \strut nl / nederlands \par \stopinterface
+ \startinterface english \strut en / english \par \stopinterface
+ \startinterface german \strut de / deutsch \par \stopinterface
+ \startinterface french \strut fr / fran\c{c}ais \par \stopinterface
+ \startinterface czech \strut cs / \v{c}esk\'y \par \stopinterface
+ \startinterface italian \strut it / italiano \par \stopinterface
+ \startinterface romanian \strut ro / rom\^{a}n\u{a} \par \stopinterface
+\stopsetups
+
+\startmakeup[\v!standard]
+ \dontcomplain
+ \setupalign[\v!left]
+ \startcolor[TitleColor]
+ \definedfont[RegularBold at 100pt]\setstrut
+ \strut Con\TeX t \par
+ \definedfont[RegularBold at 50pt]\setstrut
+ \setups[text:commands]
+ \vfill
+ \definedfont[RegularBold at 150pt]\setstrut
+ \setups[text:uppercase]
+ \stopcolor
+\stopmakeup
+
+\setuplayout % needed ?
+
+\setupbackgrounds
+ [\v!rightpage]
+ [\c!background=]
+
+\startmakeup[\v!standard]
+ \dontcomplain
+ \startcolor[TitleColor]
+ \definedfont[RegularBold at 100pt]\setstrut
+ \setupalign[\v!left]
+ \strut Con\TeX t \par
+ \definedfont[RegularBold at 50pt]\setstrut
+ \setups[text:commands]
+ \vfill
+ \definedfont[RegularBold at 24pt]\setupinterlinespace
+ \setups[text:lowercase]
+ \par \strut \currentdate \par
+ \stopcolor
+\stopmakeup
+
+\protect
+
+\placeeverysetup
+
+\unprotect
+
+\page[\v!yes,\v!blank,\v!right,\v!left]
+
+\setuplayout
+ [titlepage]
+
+\setupbackgrounds
+ [\v!leftpage]
+ [\c!background=back]
+
+\startmakeup[\v!standard][\c!page=]
+ \dontcomplain
+ \startcolor[TitleColor]
+ \definedfont[RegularBold at 24pt]\setupinterlinespace
+ \setupalign[\v!left]
+ \vfill
+ PRAGMA ADE \par
+ Ridderstraat 27 \par
+ 8061GH Hasselt NL \par
+ www.pragma-ade.com \par
+ \stopcolor
+\stopmakeup
+
+\protect
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/base/x-set-99.tex b/Master/texmf-dist/tex/context/base/x-set-99.tex
deleted file mode 100644
index 64d2b1db385..00000000000
--- a/Master/texmf-dist/tex/context/base/x-set-99.tex
+++ /dev/null
@@ -1,283 +0,0 @@
-%D \module
-%D [ file=x-set-99,
-%D version=2004.10.31,
-%D remark=setupx.tex: 1998.07.20 and later,
-%D title=\CONTEXT\ Setup Definitions,
-%D subtitle=Macro Definitions,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% shared list
-
-\startmessages dutch library: setup
- title: setup
- formula: formule
- number: getal
- list: lijst
- dimension: maat
- mark: markering
- reference: verwijzing
- command: commando
- file: file
- name: naam
- identifier: naam
- text: tekst
- section: sectie
- singular: naam enkelvoud
- plural: naam meervoud
- matrix: n*m
- see: zie
- inherits: erft van
- 1: de karakters < en > zijn globaal actief!
- 2: -- wordt verwerkt
- 3: -- is niet gedefinieerd
- 4: -- wordt nogmaals verwerkt
- optional: optioneel
- displaymath: formule
- index: ingang
- math: formule
- nothing: leeg
- file: file
- position: positie
- reference: verwijzing
- csname: naam
- destination: bestemming
- triplet: triplet
- word: woord
- content: tekst
-\stopmessages
-
-\startmessages english library: setup
- title: setup
- formula: formula
- number: number
- list: list
- dimension: dimension
- mark: mark
- reference: reference
- command: command
- file: file
- name: name
- identifier: identifier
- text: text
- section: section
- singular: singular name
- plural: plural name
- matrix: n*m
- see: see
- inherits: inherits from
- 1: the characters < and > are globally active!
- 2: -- is processed
- 3: -- is undefined
- 4: -- is processed again
- optional: optional
- displaymath: formula
- index: entry
- math: formula
- nothing: empty
- file: file
- position: position
- reference: reference
- csname: name
- destination: destination
- triplet: triplet
- word: word
- content: text
-\stopmessages
-
-\startmessages german library: setup
- title: Setup
- formula: Formel
- number: Nummer
- list: Liste
- dimension: Dimension
- mark: Beschriftung
- reference: Referenz
- command: Befehl
- file: Datei
- name: Name
- identifier: Name
- text: Text
- section: Abschnitt
- singular: singular
- plural: plural
- matrix: n*m
- see: siehe
- inherits: inherits from
- 1: Die Zeichen < und > gelten global!
- 2: -- wird verarbeitet
- 3: -- ist undefiniert
- 4: -- ist mehrmals verarbeitet
- optional: optioneel
- displaymath: formula
- index: entry
- math: formula
- nothing: empty
- file: file
- position: position
- reference: reference
- csname: name
- destination: destination
- triplet: triplet
- word: word
- content: text
-\stopmessages
-
-\startmessages czech library: setup
- title: setup
- formula: rovnice
- number: cislo
- list: seznam
- dimension: dimenze
- mark: znacka
- reference: reference
- command: prikaz
- file: soubor
- name: jmeno
- identifier: jmeno
- text: text
- section: sekce
- singular: jmeno v singularu
- plural: jmeno v pluralu
- matrix: n*m
- see: viz
- inherits: inherits from
- 1: znaky < a > jsou globalne aktivni!
- 2: -- je zpracovano
- 3: -- je nedefinovano
- 4: -- je zpracovano znovu
- optional: optioneel
- displaymath: formula
- index: entry
- math: formula
- nothing: empty
- file: file
- position: position
- reference: reference
- csname: name
- destination: destination
- triplet: triplet
- word: word
- content: text
-\stopmessages
-
-\startmessages italian library: setup
- title: setup
- formula: formula
- number: number
- list: list
- dimension: dimension
- mark: mark
- reference: reference
- command: command
- file: file
- name: name
- identifier: name
- text: text
- section: section
- singular: singular name
- plural: plural name
- matrix: n*m
- see: see
- inherits: inherits from
- 1: the characters < and > are globally active!
- 2: -- is processed
- 3: -- is undefined
- 4: -- is processed again
- optional: optioneel
- displaymath: formula
- index: entry
- math: formula
- nothing: empty
- file: file
- position: position
- reference: reference
- csname: name
- destination: destination
- triplet: triplet
- word: word
- content: text
-\stopmessages
-
-\startmessages romanian library: setup
- title: setari
- formula: formula
- number: numar
- list: lista
- dimension: dimensiune
- mark: marcaj
- reference: referinta
- command: comanda
- file: fisier
- name: nume
- identifier: nume
- text: text
- section: sectiune
- singular: nume singular
- plural: nume pluram
- matrix: n*m
- see: vezi
- inherits: inherits from
- 1: caracterele < si > sunt active global!
- 2: este procesat --
- 3: -- este nedefinit
- 4: -- este procesat din nou
- optional: optioneel
- displaymath: formula
- index: entry
- math: formula
- nothing: empty
- file: file
- position: position
- reference: reference
- csname: name
- destination: destination
- triplet: triplet
- word: word
- content: text
-\stopmessages
-
-\startmessages french library: setup
- title: réglage
- formula: formule
- number: numéro
- list: liste
- dimension: dimension
- mark: marquage
- reference: reference
- command: commande
- file: fichier
- name: nom
- identifier: identificateur
- text: texte
- section: section
- singular: nom singulier
- plural: nom pluriel
- matrix: n*m
- see: vois
- inherits: herite de
- 1: les caractères < et > sont globalement actifs !
- 2: -- est traité
- 3: -- n'est pas défini
- 4: -- est traité de nouveau
- optional: optionel
- displaymath: formule
- index: entrée
- math: formule
- nothing: vide
- file: fichier
- position: position
- reference: réference
- csname: nom
- destination: destination
- triplet: triplet
- word: mot
- content: texte
-\stopmessages
-
-\endinput
diff --git a/Master/texmf-dist/tex/context/base/m-steps.mkii b/Master/texmf-dist/tex/context/base/x-steps.mkii
index 3e1f86312de..408a7e191ce 100644
--- a/Master/texmf-dist/tex/context/base/m-steps.mkii
+++ b/Master/texmf-dist/tex/context/base/x-steps.mkii
@@ -13,6 +13,8 @@
%D The \XML\ interface:
+\usemodule[m][steps]
+
\unprotect
\defineXMLdirective [stepchart] [charts] \setupSTEPcharts
diff --git a/Master/texmf-dist/tex/context/base/x-steps.mkiv b/Master/texmf-dist/tex/context/base/x-steps.mkiv
new file mode 100644
index 00000000000..61681880920
--- /dev/null
+++ b/Master/texmf-dist/tex/context/base/x-steps.mkiv
@@ -0,0 +1,99 @@
+%D \module
+%D [ file=m-steps,
+%D version=2001.05.28,
+%D title=\CONTEXT\ Modules,
+%D subtitle=Step Charts \& Tables,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE / Hans Hagen \& Ton Otten}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+%D The \XML\ interface. This module can be made way more efficient
+%D in \MKIV\ using textext but it makes only sense to do this when
+%D I really need it in a demanding application. Probably half of the
+%D code in m-steps.tex can go.
+
+\usemodule[m][steps]
+
+\unprotect
+
+\def\xmlstepchartdirective#1{\executeifdefined{@@stepchart@@#1}\gobbletwoarguments} % {#2}{#3}
+\def\xmlsteptabledirective#1{\executeifdefined{@@steptable@@#1}\gobbletwoarguments} % {#2}{#3}
+
+\setvalue{@@stepchart@@charts}{\setsomevalue\@@STPC}
+\setvalue{@@stepchart@@cells}{\setsomevalue\@@STEC}
+\setvalue{@@stepchart@@texts}{\setsomevalue\@@STET}
+\setvalue{@@stepchart@@lines}{\setsomevalue\@@STEL}
+
+\setvalue{@@steptable@@tables}{\setsomevalue\@@STPT}
+\setvalue{@@steptable@@cells}{\setsomevalue\@@STEC}
+\setvalue{@@steptable@@texts}{\setsomevalue\@@STET}
+\setvalue{@@steptable@@lines}{\setsomevalue\@@STEL}
+
+\startxmlsetups xml:ct:define
+ \xmlsetsetup {#1} {ct:*} {xml:ct:*}
+ \xmlsetsetup {#1} {ct:stepaligntable/cells} {xml:ct:stepaligntable:cells}
+ \xmlsetsetup {#1} {ct:stepaligntable/lines} {xml:ct:stepaligntable:lines}
+\stopxmlsetups
+
+\xmlregisterns{ct}{stepcharts}
+
+\xmlregistersetup{xml:ct:define}
+
+\startxmlsetups xml:ct:prep
+ \expanded{\prep[\xmltoparameters{#1}]}{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:ct:text
+ \expanded{\text[\xmltoparameters{#1}]}{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:ct:texts
+ \expanded{\texts[\xmltoparameters{#1}]}{\xmltext{#1}{/top}} {\xmltext{#1}{/bot}}
+\stopxmlsetups
+
+\startxmlsetups xml:ct:cell
+ \expanded{\cell[\xmltoparameters{#1}]}{\xmlflush{#1}}
+\stopxmlsetups
+
+\startxmlsetups xml:ct:cells
+ \expanded{\cells[\xmltoparameters{#1}]}{\xmltext{#1}{/top}} {\xmltext{#1}{/bot}}
+\stopxmlsetups
+
+\startxmlsetups xml:ct:lines
+ \expanded{\startlines[\xmltoparameters{#1}]}
+ \xmlflush{#1}
+ \stoplines
+\stopxmlsetups
+
+\startxmlsetups xml:ct:steptable
+ \expanded{\startSTEPtable[\xmltoparameters{#1}]}
+ \xmlflush{#1}
+ \stopSTEPtable
+\stopxmlsetups
+
+\startxmlsetups xml:ct:stepchart
+ \expanded{\startSTEPchart[\xmltoparameters{#1}]}
+ \xmlflush{#1}
+ \stopSTEPchart
+\stopxmlsetups
+
+\startxmlsetups xml:ct:stepaligntable
+ \expanded{\startSTEPaligntable[\xmltoparameters{#1}]}
+ \xmlflush{#1}
+ \stopSTEPaligntable
+\stopxmlsetups
+
+\startxmlsetups xml:ct:stepaligntable:cells
+ \expanded{\cells[\xmltoparameters{#1}]} {\xmltext{#1}{/ct:c1}} {\xmltext{#1}{/ct:c2}} {\xmltext{#1}{/ct:c3}}
+\stopxmlsetups
+
+\startxmlsetups xml:ct:stepaligntable:lines
+ \expanded{\setupSTEPlines[\xmltoparameters{#1}]}
+ \xmlflush{#1}
+\stopxmlsetups
+
+\protect \endinput
diff --git a/Master/texmf-dist/tex/context/base/x-xml-01.tex b/Master/texmf-dist/tex/context/base/x-xml-01.mkii
index 9502ab71a3e..9502ab71a3e 100644
--- a/Master/texmf-dist/tex/context/base/x-xml-01.tex
+++ b/Master/texmf-dist/tex/context/base/x-xml-01.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-xml-02.tex b/Master/texmf-dist/tex/context/base/x-xml-02.mkii
index 24f811c4dad..24f811c4dad 100644
--- a/Master/texmf-dist/tex/context/base/x-xml-02.tex
+++ b/Master/texmf-dist/tex/context/base/x-xml-02.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-xml-11.tex b/Master/texmf-dist/tex/context/base/x-xml-11.mkii
index c1b185b559f..c1b185b559f 100644
--- a/Master/texmf-dist/tex/context/base/x-xml-11.tex
+++ b/Master/texmf-dist/tex/context/base/x-xml-11.mkii
diff --git a/Master/texmf-dist/tex/context/base/x-xtag.mkiv b/Master/texmf-dist/tex/context/base/x-xtag.mkiv
index d7e2f25595d..be593300c83 100644
--- a/Master/texmf-dist/tex/context/base/x-xtag.mkiv
+++ b/Master/texmf-dist/tex/context/base/x-xtag.mkiv
@@ -11,13 +11,20 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D Here we load the \MKII\ (mostly) streaming \XML\ parser. We
+%D define a couple of catcode regimes first.
+
\ifdefined\XMLbanner \endinput \fi
-\loadcorefile{xtag-ini}
-\loadcorefile{xtag-ext}
-\loadcorefile{xtag-exp}
-\loadcorefile{xtag-pre} % has old encoding code
-\loadcorefile{xtag-xsd} % will go away (stub anyway)
-\loadcorefile{xtag-rng} % will go away (stub anyway)
+\writestatus{xtag}{this module is obsolete, use the mkiv-xml features or use mkii instead}
+
+\loadmarkfile{catc-xml}
+
+\loadcorefile{xtag-ini.mkii}
+\loadcorefile{xtag-ext.mkii}
+\loadcorefile{xtag-exp.mkii}
+\loadcorefile{xtag-pre.mkii} % has old encoding code
+\loadcorefile{xtag-xsd.mkii} % will go away (stub anyway)
+\loadcorefile{xtag-rng.mkii} % will go away (stub anyway)
\endinput
diff --git a/Master/texmf-dist/tex/context/base/xetx-utf.mkii b/Master/texmf-dist/tex/context/base/xetx-utf.mkii
index 79bd0074541..a337c9e7601 100644
--- a/Master/texmf-dist/tex/context/base/xetx-utf.mkii
+++ b/Master/texmf-dist/tex/context/base/xetx-utf.mkii
@@ -1986,4 +1986,9 @@
\setXTXcharcodes "201C "201C "201C
\setXTXcharcodes "201D "201D "201D
+% patch needed for french
+
+% \setXTXcharcodes "0027 "0027 "0027
+\setXTXcharcodes "2019 "2019 "2019
+
\endinput
diff --git a/Master/texmf-dist/tex/context/base/xtag-cml.tex b/Master/texmf-dist/tex/context/base/xtag-cml.mkii
index 6da7fd26f87..6da7fd26f87 100644
--- a/Master/texmf-dist/tex/context/base/xtag-cml.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-cml.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-ent.tex b/Master/texmf-dist/tex/context/base/xtag-ent.mkii
index f4c3e4b0648..f4c3e4b0648 100644
--- a/Master/texmf-dist/tex/context/base/xtag-ent.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-ent.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-exp.tex b/Master/texmf-dist/tex/context/base/xtag-exp.mkii
index 337b4934879..337b4934879 100644
--- a/Master/texmf-dist/tex/context/base/xtag-exp.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-exp.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-ext.tex b/Master/texmf-dist/tex/context/base/xtag-ext.mkii
index 9a132c677b7..9a132c677b7 100644
--- a/Master/texmf-dist/tex/context/base/xtag-ext.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-ext.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-hyp.tex b/Master/texmf-dist/tex/context/base/xtag-hyp.mkii
index e4e048e2bf0..e4e048e2bf0 100644
--- a/Master/texmf-dist/tex/context/base/xtag-hyp.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-hyp.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-ini.tex b/Master/texmf-dist/tex/context/base/xtag-ini.mkii
index e48ef3da6ff..85b48141991 100644
--- a/Master/texmf-dist/tex/context/base/xtag-ini.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-ini.mkii
@@ -16,6 +16,26 @@
%D Beware: don't rely on \longempty things, since this may
%D change!
+%D \macros
+%D {defineinputmode,setinputmode}
+%D
+%D For old times sake we still support:
+
+\unexpanded\def\defineinputmode[#1]{\expandafter\newtoks\csname every#1inputmode\endcsname}
+\unexpanded\def\setinputmode [#1]{\the\executeifdefined{every#1inputmode}\emptytoks}
+
+\defineinputmode [TEX]
+\defineinputmode [XML]
+
+\setinputmode [TEX]
+
+%D Finally we make sure that the compound handler keeps doingits job.
+
+\ifx\normalcompound\undefined \let\normalcompound=| \fi
+
+\appendtoks \catcode`|=\activecatcode \let|\normalcompound \to \everyTEXinputmode
+\appendtoks \catcode`|=\lettercatcode \to \everyXMLinputmode
+
%D This module is highly optimized for speed, which sometimes
%D leads to rather unreadable code. Sorry for this.
@@ -192,7 +212,7 @@
\newif\ifignoreXMLspaces
\newif\iffixedXMLfont
\newif\iftraceXMLelements
-%newif\ifprocessingXML
+\newif\ifprocessingXML
\newcount\XMLlevel % scratchcounter
\newcount\XMLdepth % used here
@@ -2308,7 +2328,7 @@
\simplifyXMLelements
\let\getXMLentity\firstofoneargument
\XMLrawentitiestrue
- \chardef\utfunicodetracer7% new
+ \utfunicodetracer\plusseven % new
\xdef\@@XML@@string{\csname\@@XMLdata:#2\endcsname}%
\egroup
\defconvertedcommand#1\@@XML@@string}
@@ -2324,7 +2344,7 @@
\enableXMLexpansion
\simplifyXMLelements
\simplifyXMLentities
- \chardef\utfunicodetracer7% new
+ \utfunicodetracer\plusseven % new
\let\getXMLentity\expandedXMLentity % should this go in \simplify ?
\xdef\@@XML@@string{\csname\@@XMLdata:#2\endcsname}%
\egroup
@@ -2524,7 +2544,7 @@
%D \stoptyping
\long\def\startdefineXMLhandlers
- {\bgroup\catcode`\^^M=\@@space
+ {\bgroup\catcode\endoflineasciicode\spacecatcode
\dodoubleempty\dostartdefineXMLhandlers}
\long\def\dostartdefineXMLhandlers[#1][#2]#3#4\stopdefineXMLhandlers % #2 is dummy
@@ -2740,9 +2760,10 @@
%D ...
\def\protectXMLdata
- {\catcode`\^^I\@@space
- \catcode`\^^M\@@space
- \catcode`\^^L\@@space
+ {\catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode\spacecatcode
+ \catcode\formfeedasciicode \spacecatcode
+ \catcode\endoffileasciicode\spacecatcode
\catcode`\#\@@other}
\long\def\startXMLcode
@@ -2869,10 +2890,13 @@
\def\douseXMLfilter#1%
{\doifundefined{\c!file\f!xtagprefix#1}
{\letvalue{\c!file\f!xtagprefix#1}\empty
- \makeshortfilename[\truefilename{\f!xtagprefix#1}]%
\startreadingfile
- % will be \showmessage
- \readsysfile\shortfilename{\writestatus{xml}{loading module #1}}\donothing
+ % \truefilename removed
+ \readsysfile{\f!xtagprefix#1.mkii}
+ {\writestatus{xml}{loading module #1.mkii}}
+ {\readsysfile{\f!xtagprefix#1.tex}
+ {\writestatus{xml}{loading module #1.tex}}
+ \donothing}%
\stopreadingfile}}
%D Temporarily here.
diff --git a/Master/texmf-dist/tex/context/base/xtag-map.tex b/Master/texmf-dist/tex/context/base/xtag-map.mkii
index f8471d6a784..cbde4f1b175 100644
--- a/Master/texmf-dist/tex/context/base/xtag-map.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-map.mkii
@@ -448,10 +448,10 @@
\let\par\XMLremappedpar
\the\everyXMLremapping
%\ignorelines
- \catcode`\^^I=\@@space
- \catcode`\^^M=\@@space
- \catcode`\^^L=\@@space
- \catcode`\^^Z=\@@space
+ \catcode\tabasciicode \spacecatcode
+ \catcode\endoflineasciicode\spacecatcode
+ \catcode\formfeedasciicode \spacecatcode
+ \catcode\endoffileasciicode\spacecatcode
\pushmacro\unicodechar
\let\unicodechar\relax
\xdef\remappedXMLdata{#4\empty}%
diff --git a/Master/texmf-dist/tex/context/base/xtag-mea.tex b/Master/texmf-dist/tex/context/base/xtag-mea.mkii
index d56d6c54ba9..d56d6c54ba9 100644
--- a/Master/texmf-dist/tex/context/base/xtag-mea.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-mea.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-meb.tex b/Master/texmf-dist/tex/context/base/xtag-meb.mkii
index ba370cadf94..ba370cadf94 100644
--- a/Master/texmf-dist/tex/context/base/xtag-meb.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-meb.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-mec.tex b/Master/texmf-dist/tex/context/base/xtag-mec.mkii
index 9e941897c61..9e941897c61 100644
--- a/Master/texmf-dist/tex/context/base/xtag-mec.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-mec.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-meh.tex b/Master/texmf-dist/tex/context/base/xtag-meh.mkii
index 1636f2a2b9d..1636f2a2b9d 100644
--- a/Master/texmf-dist/tex/context/base/xtag-meh.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-meh.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-men.tex b/Master/texmf-dist/tex/context/base/xtag-men.mkii
index d548c83940e..d548c83940e 100644
--- a/Master/texmf-dist/tex/context/base/xtag-men.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-men.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-meo.tex b/Master/texmf-dist/tex/context/base/xtag-meo.mkii
index f19f80fbe30..f19f80fbe30 100644
--- a/Master/texmf-dist/tex/context/base/xtag-meo.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-meo.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-mer.tex b/Master/texmf-dist/tex/context/base/xtag-mer.mkii
index becff584a9c..becff584a9c 100644
--- a/Master/texmf-dist/tex/context/base/xtag-mer.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-mer.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-mmc.tex b/Master/texmf-dist/tex/context/base/xtag-mmc.mkii
index 27e2c42ea4b..27e2c42ea4b 100644
--- a/Master/texmf-dist/tex/context/base/xtag-mmc.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-mmc.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-mml.tex b/Master/texmf-dist/tex/context/base/xtag-mml.mkii
index 051d15b0078..051d15b0078 100644
--- a/Master/texmf-dist/tex/context/base/xtag-mml.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-mml.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-mmp.tex b/Master/texmf-dist/tex/context/base/xtag-mmp.mkii
index ef1479ee658..75167c9e90c 100644
--- a/Master/texmf-dist/tex/context/base/xtag-mmp.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-mmp.mkii
@@ -271,14 +271,14 @@
{\firstXMLRelement#1{\secondXMLRelement}}}%
#2}
-\def\MMLpSUP#1{\MMLpSUBP^}
-\def\MMLpSUB#1{\MMLpSUBP_}
+\def\MMLpSUP#1{\MMLpSUBP ^}
+\def\MMLpSUB#1{\MMLpSUBP _}
\remapXMLsequence [msubsup] [CPA] \MMLpSUBSUP
\def\MMLpSUBSUP#1#2%
{\withnextthreeXMLRelements
- {\firstXMLRelement_{\secondXMLRelement}^{\thirdXMLRelement}}%
+ {\firstXMLRelement _{\secondXMLRelement}^{\thirdXMLRelement}}%
#2}
\remapXMLsequence [mover] [CPA] \MMLpOVER
diff --git a/Master/texmf-dist/tex/context/base/xtag-mxa.tex b/Master/texmf-dist/tex/context/base/xtag-mxa.mkii
index 5e83367df79..5e83367df79 100644
--- a/Master/texmf-dist/tex/context/base/xtag-mxa.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-mxa.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-mxb.tex b/Master/texmf-dist/tex/context/base/xtag-mxb.mkii
index c325a9e4493..c325a9e4493 100644
--- a/Master/texmf-dist/tex/context/base/xtag-mxb.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-mxb.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-mxc.tex b/Master/texmf-dist/tex/context/base/xtag-mxc.mkii
index e692f2a249b..e692f2a249b 100644
--- a/Master/texmf-dist/tex/context/base/xtag-mxc.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-mxc.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-mxh.tex b/Master/texmf-dist/tex/context/base/xtag-mxh.mkii
index 3cf0103c804..3cf0103c804 100644
--- a/Master/texmf-dist/tex/context/base/xtag-mxh.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-mxh.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-mxn.tex b/Master/texmf-dist/tex/context/base/xtag-mxn.mkii
index 35eeade9a1a..35eeade9a1a 100644
--- a/Master/texmf-dist/tex/context/base/xtag-mxn.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-mxn.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-mxo.tex b/Master/texmf-dist/tex/context/base/xtag-mxo.mkii
index 045b4f40696..045b4f40696 100644
--- a/Master/texmf-dist/tex/context/base/xtag-mxo.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-mxo.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-mxr.tex b/Master/texmf-dist/tex/context/base/xtag-mxr.mkii
index ed1498f8137..ed1498f8137 100644
--- a/Master/texmf-dist/tex/context/base/xtag-mxr.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-mxr.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-pml.tex b/Master/texmf-dist/tex/context/base/xtag-pml.mkii
index 53d22c52af0..53d22c52af0 100644
--- a/Master/texmf-dist/tex/context/base/xtag-pml.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-pml.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-pmu.tex b/Master/texmf-dist/tex/context/base/xtag-pmu.mkii
index b913475f5e8..b913475f5e8 100644
--- a/Master/texmf-dist/tex/context/base/xtag-pmu.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-pmu.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-pre.tex b/Master/texmf-dist/tex/context/base/xtag-pre.mkii
index 94a213d941b..94a213d941b 100644
--- a/Master/texmf-dist/tex/context/base/xtag-pre.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-pre.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-prs.tex b/Master/texmf-dist/tex/context/base/xtag-prs.mkii
index 02bdcf21c1c..02bdcf21c1c 100644
--- a/Master/texmf-dist/tex/context/base/xtag-prs.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-prs.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-raw.tex b/Master/texmf-dist/tex/context/base/xtag-raw.mkii
index e6dfdea4174..e6dfdea4174 100644
--- a/Master/texmf-dist/tex/context/base/xtag-raw.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-raw.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-rng.tex b/Master/texmf-dist/tex/context/base/xtag-rng.mkii
index 254282424b5..254282424b5 100644
--- a/Master/texmf-dist/tex/context/base/xtag-rng.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-rng.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-run.tex b/Master/texmf-dist/tex/context/base/xtag-run.mkii
index 9a460373159..03526810455 100644
--- a/Master/texmf-dist/tex/context/base/xtag-run.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-run.mkii
@@ -234,7 +234,7 @@
\let\executeXMLentity\@XMLentity
\enableXML\verbatimXML
\enableregime[utf]%
- \chardef\utfunicodetracer8
+ \utfunicodetracer\pluseight
\veryraggedright
\readfile{\truefilename{#1}}\donothing\donothing\endgraf
\removelastskip % really needed
diff --git a/Master/texmf-dist/tex/context/base/xtag-stk.tex b/Master/texmf-dist/tex/context/base/xtag-stk.mkii
index e126ae5c74a..e126ae5c74a 100644
--- a/Master/texmf-dist/tex/context/base/xtag-stk.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-stk.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-utf.tex b/Master/texmf-dist/tex/context/base/xtag-utf.mkii
index fec84d27984..fec84d27984 100644
--- a/Master/texmf-dist/tex/context/base/xtag-utf.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-utf.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-xsd.tex b/Master/texmf-dist/tex/context/base/xtag-xsd.mkii
index 96169afa2ee..96169afa2ee 100644
--- a/Master/texmf-dist/tex/context/base/xtag-xsd.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-xsd.mkii
diff --git a/Master/texmf-dist/tex/context/base/xtag-xsl.tex b/Master/texmf-dist/tex/context/base/xtag-xsl.mkii
index 3ad096c280a..3ad096c280a 100644
--- a/Master/texmf-dist/tex/context/base/xtag-xsl.tex
+++ b/Master/texmf-dist/tex/context/base/xtag-xsl.mkii
diff --git a/Master/texmf-dist/tex/context/bib/bibl-apa.tex b/Master/texmf-dist/tex/context/bib/bibl-apa.tex
index 20bbccb95c8..b0403e54227 100644
--- a/Master/texmf-dist/tex/context/bib/bibl-apa.tex
+++ b/Master/texmf-dist/tex/context/bib/bibl-apa.tex
@@ -106,7 +106,7 @@
%D Some shortcuts.
% ((#1(type\ |)chapter#2)|#3)
-
+
\def\insertchap#1#2#3%
{\insertchapter
{#1\insertbibtype{}{\ }{chapter\ }}{#2}%
@@ -164,12 +164,12 @@
\setuppublicationlayout[book]{%
\insertauthors{}{ }{\inserteditors{}{, editor%
\ifnum\getvalue{editor@num}> 1 s\fi
- \ \global\editedbooktrue
+ \ \global\editedbooktrue
}{\insertthekey{}{. }{}}}%
\insertpubyear{(}{). }{\unskip.}%
\inserttitle
{\bgroup\it }%
- {\/\egroup
+ {\/\egroup
\ifeditedbook
\global\editedbookfalse
\insertvolume
@@ -182,7 +182,7 @@
\else
\insertcrossref
{\insertchap{, }{}{}%
- \insertpages{, pages }{. }{. }%
+ \insertpages{\unskip, pages }{. }{. }%
\insertvolume{Volume~}{ of~}{}%
}%
{}%
@@ -194,7 +194,7 @@
{}}
{}%
\insertchap{, }{}{}%
- \insertpages{, pages }{.}{.}%
+ \insertpages{\unskip, pages }{.}{.}%
}%
\fi}%
{}%
@@ -207,7 +207,7 @@
\setuppublicationlayout[inbook]{%
\insertauthors{}{ }{\inserteditors{}{, editor%
\ifnum\getvalue{editor@num}> 1 s\fi
- \ \global\editedbooktrue
+ \ \global\editedbooktrue
}{\insertthekey{}{. }{}}}%
\insertpubyear{(}{). }{\unskip.}%
\inserttitle
@@ -225,7 +225,7 @@
\else
\insertcrossref
{\insertchap{, }{}{}%
- \insertpages{, pages }{. }{. }%
+ \insertpages{\unskip, pages }{. }{. }%
\insertvolume{Volume~}{ of~}{}%
}%
{}%
@@ -237,7 +237,7 @@
{}}
{}%
\insertchap{, }{}{}%
- \insertpages{, pages }{.}{}%
+ \insertpages{\unskip, pages }{.}{}%
}%
\fi}%
{ }%
@@ -275,19 +275,19 @@
{, editor\ifnum\getvalue{editor@num}> 1 s\fi, }%
{}%
\bgroup\it}%
- {\egroup
+ {\egroup
\insertseries
{\insertvolume{, number }{~in }{ }}%
{}%
{}%
\insertchap{\unskip, }{ }{ }%
- \insertpages{\unskip, pages~}{. }{\unskip. }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
\insertedition{ }{ edition}{}%
\insertpublisher{ }{.}{.}%
}%
{In \insertcrossref{}{}{}%
\insertchap{\unskip, }{ }{ }%
- \insertpages{\unskip, pages~}{. }{\unskip. }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
}%
\insertnote{ }{.}{}%
}
@@ -301,18 +301,18 @@
{, editor\ifnum\getvalue{editor@num}> 1 s\fi, }%
{}%
\bgroup\it}%
- {\egroup
+ {\egroup
\insertseries
{\insertvolume{, number }{~in }{ }}%
{}%
{}%
\insertchap{\unskip, }{ }{ }%
- \insertpages{, pages~}{}{}%
+ \insertpages{\unskip, pages~}{}{}%
\insertorg{. }{.}{.}%
}%
{In \insertcrossref{}{}{}%
\insertchap{\unskip, }{ }{ }%
- \insertpages{\unskip, pages~}{. }{\unskip. }%
+ \insertpages{\unskip, pages~}{. }{\unskip. }%
}%
\insertnote{ }{.}{}%
}
@@ -320,18 +320,18 @@
\setuppublicationlayout[proceedings]{%
\inserteditors{}{, editor%
\ifnum\getvalue{editor@num}> 1 s\fi
- \ \global\editedbooktrue
+ \ \global\editedbooktrue
}{\insertthekey{}{ }{}}%
\insertpubyear{(}{). }{}%
\inserttitle
{\bgroup\it}%
- {\egroup
+ {\egroup
\insertseries
{\insertvolume{, number }{~in }{ }}%
{}%
{}%
\insertchap{\unskip, }{ }{ }%
- \insertpages{, pages~}{}{}%
+ \insertpages{\unskip, pages~}{}{}%
\insertorg{. }{.}{.}%
}%
{}%
diff --git a/Master/texmf-dist/tex/context/bib/sample.bib b/Master/texmf-dist/tex/context/bib/sample.bib
new file mode 100644
index 00000000000..3f8df623eeb
--- /dev/null
+++ b/Master/texmf-dist/tex/context/bib/sample.bib
@@ -0,0 +1,38 @@
+@STRING{hh = {Hans Hagen}}
+
+@ELECTRONIC{hh2010,
+ author = hh,
+ year = {2010},
+ title = {Metafun. \CONTEXT\ mkiv},
+ url = {http://www.pragma-ade.nl/general/manuals/metafun-s.pdf},
+}
+
+@ARTICLE{hh2010a,
+ author = hh,
+ title = {The Font Name Mess},
+ journal = {MAPS},
+ year = {2010},
+ volume = {40},
+ pages = {2-8},
+ keywords = {context},
+}
+
+@ARTICLE{hh2010b,
+ author = hh,
+ title = {Grouping in Hybrid Environments},
+ journal = {MAPS},
+ year = {2010},
+ volume = {40},
+ pages = {67-71},
+ keywords = {context},
+}
+
+@BOOK{Eijkhout1991,
+ title = {\TeX\ by Topic. A \TeX nician's Reference},
+ publisher = {Addison-Wesley},
+ year = {1991},
+ author = {Victor Eijkhout},
+ address = {London},
+ keywords = {general},
+}
+
diff --git a/Master/texmf-dist/tex/context/config/cont-de.ini b/Master/texmf-dist/tex/context/config/cont-de.ini
index b44ff333107..1d62331ca07 100644
--- a/Master/texmf-dist/tex/context/config/cont-de.ini
+++ b/Master/texmf-dist/tex/context/config/cont-de.ini
@@ -1,2 +1,2 @@
-\input cont-de
+\input cont-de.mkii
diff --git a/Master/texmf-dist/tex/context/config/cont-en.ini b/Master/texmf-dist/tex/context/config/cont-en.ini
index 36df33db1f5..1e83879082e 100644
--- a/Master/texmf-dist/tex/context/config/cont-en.ini
+++ b/Master/texmf-dist/tex/context/config/cont-en.ini
@@ -1,2 +1,2 @@
-\input cont-en
+\input cont-en.mkii
diff --git a/Master/texmf-dist/tex/context/config/cont-fr.ini b/Master/texmf-dist/tex/context/config/cont-fr.ini
index c9b560210f5..4f565a33b1a 100644
--- a/Master/texmf-dist/tex/context/config/cont-fr.ini
+++ b/Master/texmf-dist/tex/context/config/cont-fr.ini
@@ -1,2 +1,2 @@
-\input cont-fr
+\input cont-fr.mkii
diff --git a/Master/texmf-dist/tex/context/config/cont-it.ini b/Master/texmf-dist/tex/context/config/cont-it.ini
index e0935cb9393..da6b81f008c 100644
--- a/Master/texmf-dist/tex/context/config/cont-it.ini
+++ b/Master/texmf-dist/tex/context/config/cont-it.ini
@@ -1,2 +1,2 @@
-\input cont-it
+\input cont-it.mkii
diff --git a/Master/texmf-dist/tex/context/config/cont-nl.ini b/Master/texmf-dist/tex/context/config/cont-nl.ini
index 3ccab8334c8..52079929546 100644
--- a/Master/texmf-dist/tex/context/config/cont-nl.ini
+++ b/Master/texmf-dist/tex/context/config/cont-nl.ini
@@ -1,2 +1,2 @@
-\input cont-nl
+\input cont-nl.mkii
diff --git a/Master/texmf-dist/tex/context/config/cont-ro.ini b/Master/texmf-dist/tex/context/config/cont-ro.ini
index ea9b42d448b..9222d4aca72 100644
--- a/Master/texmf-dist/tex/context/config/cont-ro.ini
+++ b/Master/texmf-dist/tex/context/config/cont-ro.ini
@@ -1,2 +1,2 @@
-\input cont-ro
+\input cont-ro.mkii
diff --git a/Master/texmf-dist/tex/context/config/cont-usr.tex b/Master/texmf-dist/tex/context/config/cont-usr.tex
deleted file mode 100644
index 5a3070362f8..00000000000
--- a/Master/texmf-dist/tex/context/config/cont-usr.tex
+++ /dev/null
@@ -1,109 +0,0 @@
-%D \module
-%D [ file=cont-usr,
-%D version=1997.10.05,
-%D title=\CONTEXT\ User Format Specifications,
-%D subtitle=System Specific Setups,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%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 User Settings}
-
-\unprotect
-
-%D Additional languages can be defined here. Beware of
-%D encoding incompatibilities. Please take a look at the
-%D \type {cont-en.tex}, \type {cont-nl.tex}, enz.\ files
-%D first. Normally you don't have to change a byte. If you
-%D want to play safe, use \typ {texexec --make --alone
-%D --all}.
-
-% \preloadallpatterns % will load them all
-
-% \installlanguage [\s!af] [\c!state=\v!start] % afrikaans
-% \installlanguage [\s!ca] [\c!state=\v!start] % catalan
-% \installlanguage [\s!cs] [\c!state=\v!start] % czech
-% \installlanguage [\s!da] [\c!state=\v!start] % danish
-% \installlanguage [\s!de] [\c!state=\v!start] % german
-% \installlanguage [\s!en] [\c!state=\v!start] % english us
-% \installlanguage [\s!es] [\c!state=\v!start] % spanish
-% \installlanguage [\s!fi] [\c!state=\v!start] % finnish
-% \installlanguage [\s!fr] [\c!state=\v!start] % french
-% \installlanguage [\s!hr] [\c!state=\v!start] % croatian
-% \installlanguage [\s!hu] [\c!state=\v!start] % hungarian
-% \installlanguage [\s!it] [\c!state=\v!start] % italian
-% \installlanguage [\s!la] [\c!state=\v!start] % latin
-% \installlanguage [\s!nl] [\c!state=\v!start] % dutch
-% \installlanguage [\s!nb] [\c!state=\v!start] % bokmal
-% \installlanguage [\s!nn] [\c!state=\v!start] % nynorsk
-% \installlanguage [\s!pl] [\c!state=\v!start] % polish
-% \installlanguage [\s!pt] [\c!state=\v!start] % portuguese
-% \installlanguage [\s!ro] [\c!state=\v!start] % romanian
-% \installlanguage [\s!ru] [\c!state=\v!start] % russian
-% \installlanguage [\s!sk] [\c!state=\v!start] % slovak
-% \installlanguage [\s!sl] [\c!state=\v!start] % slovenian
-% \installlanguage [\s!sv] [\c!state=\v!start] % swedish
-% \installlanguage [\s!tr] [\c!state=\v!start] % turkish
-% \installlanguage [\s!ua] [\c!state=\v!start] % ukrainian
-% \installlanguage [\s!gb] [\c!state=\v!start] % english uk
-% \installlanguage [\s!vn] [\c!state=\v!start] % vietnamese
-
-% \installlanguage [deo] [\c!state=\v!start] % old german
-
-%D The next lines can be used for setting the language to be
-%D used at startup time.
-
-% \setupcurrentlanguage[\s!af]
-% \setupcurrentlanguage[\s!ca]
-% \setupcurrentlanguage[\s!cs]
-% \setupcurrentlanguage[\s!da]
-% \setupcurrentlanguage[\s!de]
-% \setupcurrentlanguage[\s!en]
-% \setupcurrentlanguage[\s!es]
-% \setupcurrentlanguage[\s!fi]
-% \setupcurrentlanguage[\s!fr]
-% \setupcurrentlanguage[\s!hr]
-% \setupcurrentlanguage[\s!hu]
-% \setupcurrentlanguage[\s!it]
-% \setupcurrentlanguage[\s!la]
-% \setupcurrentlanguage[\s!nl]
-% \setupcurrentlanguage[\s!nb]
-% \setupcurrentlanguage[\s!nn]
-% \setupcurrentlanguage[\s!pl]
-% \setupcurrentlanguage[\s!pt]
-% \setupcurrentlanguage[\s!ro]
-% \setupcurrentlanguage[\s!ru]
-% \setupcurrentlanguage[\s!sk]
-% \setupcurrentlanguage[\s!sl]
-% \setupcurrentlanguage[\s!sv]
-% \setupcurrentlanguage[\s!tr]
-% \setupcurrentlanguage[\s!ua]
-
-%D Local font settings can go here. Normally suitable
-%D defaults are already preloaded, almost certainly the
-%D Computer Modern Roman typefaces or some derivate. So, the
-%D next line is only meant as sample, take a look at the
-%D format related files first.
-
-% This is obsolete due to latin modern:
-%
-% \definefilesynonym [font-cmr] [font-csr] % czech & slovak
-% \definefilesynonym [font-cmr] [font-plr] % polish
-
-%D In some languages, compound characters, like \type {"e}
-%D are used to get accented and non latin characters.
-
-% Per 21/9/2006 one needs to explicitly enable this.
-
-% \useencoding[fde] % german
-% \useencoding[ffr] % french
-% \useencoding[fro] % romanian
-% \useencoding[fpl] % polish
-
-%D Don't remove the next few lines.
-
-\protect \endinput
diff --git a/Master/texmf-dist/tex/context/fonts/antykwapoltawskiego.lfg b/Master/texmf-dist/tex/context/fonts/antykwapoltawskiego.lfg
new file mode 100644
index 00000000000..d5c902c6bf0
--- /dev/null
+++ b/Master/texmf-dist/tex/context/fonts/antykwapoltawskiego.lfg
@@ -0,0 +1,245 @@
+return {
+ name = "antykwapoltawskiego",
+ version = "1.00",
+ comment = "Goodies that complement Antykwa Poltawskiego, one of Mojca's favourites",
+ author = "Hans & Mojca",
+ copyright = "ConTeXt development team",
+ files = {
+ name = "antykwapoltawskiego", -- shared
+ list = {
+ ["AntPoltLtCond-Regular.otf"] = {
+ -- name = "antykwapoltawskiego",
+ weight = "light",
+ style = "regular",
+ width = "condensed",
+ },
+ ["AntPoltLtCond-Italic.otf"] = {
+ weight = "light",
+ style = "italic",
+ width = "condensed",
+ },
+ ["AntPoltCond-Regular.otf"] = {
+ weight = "normal",
+ style = "regular",
+ width = "condensed",
+ },
+ ["AntPoltCond-Italic.otf"] = {
+ weight = "normal",
+ style = "italic",
+ width = "condensed",
+ },
+ ["AntPoltLtCond-Bold.otf"] = {
+ weight = "medium",
+ style = "regular",
+ width = "condensed",
+ },
+ ["AntPoltLtCond-BoldItalic.otf"] = {
+ weight = "medium",
+ style = "italic",
+ width = "condensed",
+ },
+ ["AntPoltCond-Bold.otf"] = {
+ weight = "bold",
+ style = "regular",
+ width = "condensed",
+ },
+ ["AntPoltCond-BoldItalic.otf"] = {
+ weight = "bold",
+ style = "italic",
+ width = "condensed",
+ },
+ ["AntPoltLtSemiCond-Regular.otf"] = {
+ weight = "light",
+ style = "regular",
+ width = "semicondensed",
+ },
+ ["AntPoltLtSemiCond-Italic.otf"] = {
+ weight = "light",
+ style = "italic",
+ width = "semicondensed",
+ },
+ ["AntPoltSemiCond-Regular.otf"] = {
+ weight = "normal",
+ style = "regular",
+ width = "semicondensed",
+ },
+ ["AntPoltSemiCond-Italic.otf"] = {
+ weight = "normal",
+ style = "italic",
+ width = "semicondensed",
+ },
+ ["AntPoltLtSemiCond-Bold.otf"] = {
+ weight = "medium",
+ style = "regular",
+ width = "semicondensed",
+ },
+ ["AntPoltLtSemiCond-BoldItalic.otf"] = {
+ weight = "medium",
+ style = "italic",
+ width = "semicondensed",
+ },
+ ["AntPoltSemiCond-Bold.otf"] = {
+ weight = "bold",
+ style = "regular",
+ width = "semicondensed",
+ },
+ ["AntPoltSemiCond-BoldItalic.otf"] = {
+ weight = "bold",
+ style = "italic",
+ width = "semicondensed",
+ },
+ ["AntPoltLt-Regular.otf"] = {
+ weight = "light",
+ style = "regular",
+ width = "normal",
+ },
+ ["AntPoltLt-Italic.otf"] = {
+ weight = "light",
+ style = "italic",
+ width = "normal",
+ },
+ ["AntPolt-Regular.otf"] = {
+ weight = "normal",
+ style = "regular",
+ width = "normal",
+ },
+ ["AntPolt-Italic.otf"] = {
+ weight = "normal",
+ style = "italic",
+ width = "normal",
+ },
+ ["AntPoltLt-Bold.otf"] = {
+ weight = "medium",
+ style = "regular",
+ width = "normal",
+ },
+ ["AntPoltLt-BoldItalic.otf"] = {
+ weight = "medium",
+ style = "italic",
+ width = "normal",
+ },
+ ["AntPolt-Bold.otf"] = {
+ weight = "bold",
+ style = "regular",
+ width = "normal",
+ },
+ ["AntPolt-BoldItalic.otf"] = {
+ weight = "bold",
+ style = "italic",
+ width = "normal",
+ },
+ ["AntPoltLtSemiExpd-Regular.otf"] = {
+ weight = "light",
+ style = "regular",
+ width = "semiexpanded",
+ },
+ ["AntPoltLtSemiExpd-Italic.otf"] = {
+ weight = "light",
+ style = "italic",
+ width = "semiexpanded",
+ },
+ ["AntPoltSemiExpd-Regular.otf"] = {
+ weight = "normal",
+ style = "regular",
+ width = "semiexpanded",
+ },
+ ["AntPoltSemiExpd-Italic.otf"] = {
+ weight = "normal",
+ style = "italic",
+ width = "semiexpanded",
+ },
+ ["AntPoltLtSemiExpd-Bold.otf"] = {
+ weight = "medium",
+ style = "regular",
+ width = "semiexpanded",
+ },
+ ["AntPoltLtSemiExpd-BoldItalic.otf"] = {
+ weight = "medium",
+ style = "italic",
+ width = "semiexpanded",
+ },
+ ["AntPoltSemiExpd-Bold.otf"] = {
+ weight = "bold",
+ style = "regular",
+ width = "semiexpanded",
+ },
+ ["AntPoltSemiExpd-BoldItalic.otf"] = {
+ weight = "bold",
+ style = "italic",
+ width = "semiexpanded",
+ },
+ ["AntPoltLtExpd-Regular.otf"] = {
+ weight = "light",
+ style = "regular",
+ width = "expanded",
+ },
+ ["AntPoltLtExpd-Italic.otf"] = {
+ weight = "light",
+ style = "italic",
+ width = "expanded",
+ },
+ ["AntPoltExpd-Regular.otf"] = {
+ weight = "normal",
+ style = "regular",
+ width = "expanded",
+ },
+ ["AntPoltExpd-Italic.otf"] = {
+ weight = "normal",
+ style = "italic",
+ width = "expanded",
+ },
+ ["AntPoltLtExpd-Bold.otf"] = {
+ weight = "medium",
+ style = "regular",
+ width = "expanded",
+ },
+ ["AntPoltLtExpd-BoldItalic.otf"] = {
+ weight = "medium",
+ style = "italic",
+ width = "expanded",
+ },
+ ["AntPoltExpd-Bold.otf"] = {
+ weight = "bold",
+ style = "regular",
+ width = "expanded",
+ },
+ ["AntPoltExpd-BoldItalic.otf"] = {
+ weight = "bold",
+ style = "italic",
+ width = "expanded",
+ },
+ },
+ },
+ typefaces = { -- for Mojca (experiment, names might change)
+ ["antykwapoltawskiego-light"] = {
+ shortcut = "rm",
+ shape = "serif",
+ fontname = "antykwapoltawskiego",
+ normalweight = "light",
+ boldweight = "medium",
+ width = "normal",
+ size = "default",
+ features = "default",
+ },
+ ["antykwapoltawskiego"] = {
+ shortcut = "rm",
+ shape = "serif",
+ fontname = "antykwapoltawskiego",
+ normalweight = "normal",
+ boldweight = "bold",
+ width = "normal",
+ size = "default",
+ features = "default",
+ },
+ ["antykwapoltawskiego-condensed"] = {
+ shortcut = "rm",
+ shape = "serif",
+ fontname = "antykwapoltawskiego",
+ normalweight = "light",
+ boldweight = "medium",
+ width = "condensed",
+ size = "default",
+ features = "default",
+ },
+ },
+}
diff --git a/Master/texmf-dist/tex/context/fonts/asana-math.lfg b/Master/texmf-dist/tex/context/fonts/asana-math.lfg
new file mode 100644
index 00000000000..f845ca4dee1
--- /dev/null
+++ b/Master/texmf-dist/tex/context/fonts/asana-math.lfg
@@ -0,0 +1,52 @@
+-- This patch code is moved from font-pat.lua to this goodies
+-- files as it does not belong in the core code.
+
+local patches = fonts.handlers.otf.enhancers.patches
+
+local function patch(data,filename,threshold)
+ local m = data.metadata.math
+ if m then
+ local d = m.DisplayOperatorMinHeight or 0
+ if d < threshold then
+ patches.report("DisplayOperatorMinHeight(%s -> %s)",d,threshold)
+ m.DisplayOperatorMinHeight = threshold
+ end
+ end
+end
+
+patches.register("after","check math parameters","asana",function(data,filename) patch(data,filename,1350) end)
+
+local function less(value,target,original) return 0.25 * value end
+
+return {
+ name = "asana-math",
+ version = "1.00",
+ comment = "Goodies that complement asana.",
+ author = "Hans Hagen",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ parameters = {
+ -- StackBottomDisplayStyleShiftDown = 0,
+ -- StackBottomShiftDown = 0,
+ -- StackDisplayStyleGapMin = 0,
+ -- StackGapMin = 0,
+ -- StackTopDisplayStyleShiftUp = 0,
+ -- StackTopShiftUp = 0,
+ -- StretchStackBottomShiftDown = 0,
+ -- StretchStackGapAboveMin = 0,
+ -- StretchStackGapBelowMin = 0,
+ -- StretchStackTopShiftUp = 0,
+ StackBottomDisplayStyleShiftDown = less,
+ StackBottomShiftDown = less,
+ StackDisplayStyleGapMin = less,
+ StackGapMin = less,
+ StackTopDisplayStyleShiftUp = less,
+ StackTopShiftUp = less,
+ StretchStackBottomShiftDown = less,
+ StretchStackGapAboveMin = less,
+ StretchStackGapBelowMin = less,
+ StretchStackTopShiftUp = less,
+ }
+ }
+}
+
diff --git a/Master/texmf-dist/tex/context/fonts/cambria-math.lfg b/Master/texmf-dist/tex/context/fonts/cambria-math.lfg
new file mode 100644
index 00000000000..3fd15d8a03d
--- /dev/null
+++ b/Master/texmf-dist/tex/context/fonts/cambria-math.lfg
@@ -0,0 +1,26 @@
+-- This patch code is moved from font-pat.lua to this goodies
+-- files as it does not belong in the core code.
+
+local patches = fonts.handlers.otf.enhancers.patches
+
+local function patch(data,filename,threshold)
+ local m = data.metadata.math
+ if m then
+ local d = m.DisplayOperatorMinHeight or 0
+ if d < threshold then
+ patches.report("DisplayOperatorMinHeight(%s -> %s)",d,threshold)
+ m.DisplayOperatorMinHeight = threshold
+ end
+ end
+end
+
+patches.register("after","check math parameters","cambria", function(data,filename) patch(data,filename,2800) end)
+patches.register("after","check math parameters","cambmath",function(data,filename) patch(data,filename,2800) end)
+
+return {
+ name = "cambria-math",
+ version = "1.00",
+ comment = "Goodies that complement cambria.",
+ author = "Hans Hagen",
+ copyright = "ConTeXt development team",
+}
diff --git a/Master/texmf-dist/tex/context/fonts/demo.lfg b/Master/texmf-dist/tex/context/fonts/demo.lfg
new file mode 100644
index 00000000000..6c7f6b62d39
--- /dev/null
+++ b/Master/texmf-dist/tex/context/fonts/demo.lfg
@@ -0,0 +1,52 @@
+local yes = "yes"
+
+local default = {
+ analyze = yes,
+ mode = "node",
+ language = "dflt",
+ script = "dflt",
+}
+
+local smallcaps = {
+ smcp = yes,
+}
+
+local function statistics(tfmdata)
+ commands.showfontparameters
+end
+
+local function squeeze(tfmdata)
+ for k, v in next, tfmdata.characters do
+ v.height = 0.75 * (v.height or 0)
+ v.depth = 0.75 * (v.depth or 0)
+ end
+end
+
+return {
+ name = "demo",
+ version = "1.00",
+ comment = "An example of goodies.",
+ author = "Hans Hagen",
+ featuresets = {
+ default = {
+ default,
+ },
+ smallcaps = {
+ default, smallcaps,
+ },
+ },
+ colorschemes = {
+ default = {
+ [1] = {
+ "one", "three", "five", "seven", "nine",
+ },
+ [2] = {
+ "two", "four", "six", "eight", "ten",
+ },
+ }
+ },
+ postprocessors = {
+ statistics = statistics,
+ squeeze = squeeze,
+ },
+}
diff --git a/Master/texmf-dist/tex/context/fonts/dingbats.lfg b/Master/texmf-dist/tex/context/fonts/dingbats.lfg
new file mode 100644
index 00000000000..eab069c7273
--- /dev/null
+++ b/Master/texmf-dist/tex/context/fonts/dingbats.lfg
@@ -0,0 +1,213 @@
+return {
+ name = "dingbats",
+ version = "1.00",
+ comment = "Goodies that complement dingbats (funny names).",
+ author = "Hans Hagen",
+ copyright = "ConTeXt development team",
+ remapping = {
+ tounicode = true,
+ unicodes = {
+ a1 = 0x2701,
+ a10 = 0x2721,
+ a100 = 0x275E,
+ a101 = 0x2761,
+ a102 = 0x2762,
+ a103 = 0x2763,
+ a104 = 0x2764,
+ a105 = 0x2710,
+ a106 = 0x2765,
+ a107 = 0x2766,
+ a108 = 0x2767,
+ a109 = 0x2660,
+ a11 = 0x261B,
+ a110 = 0x2665,
+ a111 = 0x2666,
+ a112 = 0x2663,
+ a117 = 0x2709,
+ a118 = 0x2708,
+ a119 = 0x2707,
+ a12 = 0x261E,
+ a120 = 0x2460,
+ a121 = 0x2461,
+ a122 = 0x2462,
+ a123 = 0x2463,
+ a124 = 0x2464,
+ a125 = 0x2465,
+ a126 = 0x2466,
+ a127 = 0x2467,
+ a128 = 0x2468,
+ a129 = 0x2469,
+ a13 = 0x270C,
+ a130 = 0x2776,
+ a131 = 0x2777,
+ a132 = 0x2778,
+ a133 = 0x2779,
+ a134 = 0x277A,
+ a135 = 0x277B,
+ a136 = 0x277C,
+ a137 = 0x277D,
+ a138 = 0x277E,
+ a139 = 0x277F,
+ a14 = 0x270D,
+ a140 = 0x2780,
+ a141 = 0x2781,
+ a142 = 0x2782,
+ a143 = 0x2783,
+ a144 = 0x2784,
+ a145 = 0x2785,
+ a146 = 0x2786,
+ a147 = 0x2787,
+ a148 = 0x2788,
+ a149 = 0x2789,
+ a15 = 0x270E,
+ a150 = 0x278A,
+ a151 = 0x278B,
+ a152 = 0x278C,
+ a153 = 0x278D,
+ a154 = 0x278E,
+ a155 = 0x278F,
+ a156 = 0x2790,
+ a157 = 0x2791,
+ a158 = 0x2792,
+ a159 = 0x2793,
+ a16 = 0x270F,
+ a160 = 0x2794,
+ a161 = 0x2192,
+ a162 = 0x27A3,
+ a163 = 0x2194,
+ a164 = 0x2195,
+ a165 = 0x2799,
+ a166 = 0x279B,
+ a167 = 0x279C,
+ a168 = 0x279D,
+ a169 = 0x279E,
+ a17 = 0x2711,
+ a170 = 0x279F,
+ a171 = 0x27A0,
+ a172 = 0x27A1,
+ a173 = 0x27A2,
+ a174 = 0x27A4,
+ a175 = 0x27A5,
+ a176 = 0x27A6,
+ a177 = 0x27A7,
+ a178 = 0x27A8,
+ a179 = 0x27A9,
+ a18 = 0x2712,
+ a180 = 0x27AB,
+ a181 = 0x27AD,
+ a182 = 0x27AF,
+ a183 = 0x27B2,
+ a184 = 0x27B3,
+ a185 = 0x27B5,
+ a186 = 0x27B8,
+ a187 = 0x27BA,
+ a188 = 0x27BB,
+ a189 = 0x27BC,
+ a19 = 0x2713,
+ a190 = 0x27BD,
+ a191 = 0x27BE,
+ a192 = 0x279A,
+ a193 = 0x27AA,
+ a194 = 0x27B6,
+ a195 = 0x27B9,
+ a196 = 0x2798,
+ a197 = 0x27B4,
+ a198 = 0x27B7,
+ a199 = 0x27AC,
+ a2 = 0x2702,
+ a20 = 0x2714,
+ a200 = 0x27AE,
+ a201 = 0x27B1,
+ a202 = 0x2703,
+ a203 = 0x2750,
+ a204 = 0x2752,
+ a205 = 0xF8DD,
+ a206 = 0xF8DF,
+ a21 = 0x2715,
+ a22 = 0x2716,
+ a23 = 0x2717,
+ a24 = 0x2718,
+ a25 = 0x2719,
+ a26 = 0x271A,
+ a27 = 0x271B,
+ a28 = 0x271C,
+ a29 = 0x2722,
+ a3 = 0x2704,
+ a30 = 0x2723,
+ a31 = 0x2724,
+ a32 = 0x2725,
+ a33 = 0x2726,
+ a34 = 0x2727,
+ a35 = 0x2605,
+ a36 = 0x2729,
+ a37 = 0x272A,
+ a38 = 0x272B,
+ a39 = 0x272C,
+ a4 = 0x260E,
+ a40 = 0x272D,
+ a41 = 0x272E,
+ a42 = 0x272F,
+ a43 = 0x2730,
+ a44 = 0x2731,
+ a45 = 0x2732,
+ a46 = 0x2733,
+ a47 = 0x2734,
+ a48 = 0x2735,
+ a49 = 0x2736,
+ a5 = 0x2706,
+ a50 = 0x2737,
+ a51 = 0x2738,
+ a52 = 0x2739,
+ a53 = 0x273A,
+ a54 = 0x273B,
+ a55 = 0x273C,
+ a56 = 0x273D,
+ a57 = 0x273E,
+ a58 = 0x273F,
+ a59 = 0x2740,
+ a6 = 0x271D,
+ a60 = 0x2741,
+ a61 = 0x2742,
+ a62 = 0x2743,
+ a63 = 0x2744,
+ a64 = 0x2745,
+ a65 = 0x2746,
+ a66 = 0x2747,
+ a67 = 0x2748,
+ a68 = 0x2749,
+ a69 = 0x274A,
+ a7 = 0x271E,
+ a70 = 0x274B,
+ a71 = 0x25CF,
+ a72 = 0x274D,
+ a73 = 0x25A0,
+ a74 = 0x274F,
+ a75 = 0x2751,
+ a76 = 0x25B2,
+ a77 = 0x25BC,
+ a78 = 0x25C6,
+ a79 = 0x2756,
+ a8 = 0x271F,
+ a81 = 0x25D7,
+ a82 = 0x2758,
+ a83 = 0x2759,
+ a84 = 0x275A,
+ a85 = 0xF8DE,
+ a86 = 0xF8E0,
+ a87 = 0xF8E1,
+ a88 = 0xF8E2,
+ a89 = 0xF8D7,
+ a9 = 0x2720,
+ a90 = 0xF8D8,
+ a91 = 0xF8DB,
+ a92 = 0xF8DC,
+ a93 = 0xF8D9,
+ a94 = 0xF8DA,
+ a95 = 0xF8E3,
+ a96 = 0xF8E4,
+ a97 = 0x275B,
+ a98 = 0x275C,
+ a99 = 0x275D,
+ },
+ },
+}
diff --git a/Master/texmf-dist/tex/context/fonts/husayni.lfg b/Master/texmf-dist/tex/context/fonts/husayni.lfg
index 2cc4d6111e4..ff456f63ca3 100644
--- a/Master/texmf-dist/tex/context/fonts/husayni.lfg
+++ b/Master/texmf-dist/tex/context/fonts/husayni.lfg
@@ -1,4 +1,4 @@
-local yes = "yes", "node"
+local yes = "yes"
local basics = {
analyze = yes,
@@ -74,8 +74,12 @@ return {
},
solutions = { -- here we have references to featuresets, so we use strings!
experimental = {
- less = { "shrink" },
- more = { "minimal_stretching", "medium_stretching", "maximal_stretching", "wide_all" },
+ less = {
+ "shrink"
+ },
+ more = {
+ "minimal_stretching", "medium_stretching", "maximal_stretching", "wide_all"
+ },
},
},
stylistics = {
@@ -159,16 +163,34 @@ return {
colorschemes = {
default = {
[1] = {
- "Onedotabove", "Onedotbelow", "Twodotsabove", "Twodotsbelow", "Threedotsabove", "Twodotsabove.vrt", "Twodotsbelow.vrt", "Twodotsabove.KBA", "Threedotsabove.KBA", "Threedotsbelowinv", "Hamzahabove", "Hamzahbelow", "MaaddahHamzah.identity", "Waslah","Hamzah.initial_medial",
+ "Onedotabove", "Onedotbelow", "Twodotsabove", "Twodotsbelow", "Threedotsabove", "Twodotsabove.vrt",
+ "Twodotsbelow.vrt", "Twodotsabove.KBA", "Threedotsabove.KBA", "Threedotsbelowinv", "Hamzahabove",
+ "Hamzahbelow", "MaaddahHamzah.identity", "Waslah", "Hamzah.initial_medial",
},
[2] = {
- "Fathah", "Dammah", "Kasrah", "FathahVertical", "DammahInverted", "KasrahVertical", "FathahVertical.alt1", "KasrahVertical.alt1", "FathahTanwiin", "DammahTanwiin", "KasrahTanwiin", "Shaddah", "Sukuun", "MaaddahHamzah", "Jazm", "Maaddah", "DammahTanwiin_alt2", "DammahTanwiin_alt1", "FathahTanwiin_alt1", "KasrahTanwiin_alt1", "Fathah.mkmk", "Dammah.mkmk", "Kasrah.mkmk", "FathahVertical.mkmk", "DammahInverted.mkmk", "KasrahVertical.mkmk", "FathahTanwiin.mkmk", "DammahTanwiin.mkmk", "KasrahTanwiin.mkmk", "DammahTanwiin_alt1.mkmk", "Waawsmall", "Yaasmall", "FathahVertical.alt2", "Waawsmall.isol", "Yaasmall.isol", "FathahVertical.isol", "Hamzah","Shaddah.lillaah","FathahVertical.alt1_mkmk","Sifr.empty","Maaddah.small","FathahVertical.alt2","Waawsmall.isol","Yaasmall.isol","FathahTanwiin.alt1_mkmk","KasrahTanwiin.alt1_mkmk",
+ "Fathah", "Dammah", "Kasrah", "FathahVertical", "DammahInverted", "KasrahVertical",
+ "FathahVertical.alt1", "KasrahVertical.alt1", "FathahTanwiin", "DammahTanwiin", "KasrahTanwiin",
+ "Shaddah", "Sukuun", "MaaddahHamzah", "Jazm", "Maaddah", "DammahTanwiin_alt2", "DammahTanwiin_alt1",
+ "FathahTanwiin_alt1", "KasrahTanwiin_alt1", "Fathah.mkmk", "Dammah.mkmk", "Kasrah.mkmk",
+ "FathahVertical.mkmk", "DammahInverted.mkmk", "KasrahVertical.mkmk", "FathahTanwiin.mkmk",
+ "DammahTanwiin.mkmk", "KasrahTanwiin.mkmk", "DammahTanwiin_alt1.mkmk", "Waawsmall", "Yaasmall",
+ "FathahVertical.alt2", "Waawsmall.isol", "Yaasmall.isol", "FathahVertical.isol", "Hamzah",
+ "Shaddah.lillaah", "FathahVertical.alt1_mkmk", "Sifr.empty", "Maaddah.small", "FathahVertical.alt2",
+ "Waawsmall.isol", "Yaasmall.isol", "FathahTanwiin.alt1_mkmk", "KasrahTanwiin.alt1_mkmk",
},
[3] = {
- "Ttaa.waqf", "SsLY.waqf", "QLY.waqf", "Miim.waqf", "LA.waqf", "Jiim.waqf", "Threedotsabove.waqf", "Siin.waqf", "Ssaad.waqf", "Qaaf.waqf", "SsL.waqf", "QF.waqf", "SKTH.waqf", "WQFH.waqf", "Kaaf.waqf", "Ayn.ruku", "Miim.nuun_high", "Siin.Ssaad", "Nuunsmall", "emptydot_low", "emptydot_high", "Sifr.fill", "Miim.nuun_low", "Nuun.tanwiin",
+ "Ttaa.waqf", "SsLY.waqf", "QLY.waqf", "Miim.waqf", "LA.waqf", "Jiim.waqf", "Threedotsabove.waqf",
+ "Siin.waqf", "Ssaad.waqf", "Qaaf.waqf", "SsL.waqf", "QF.waqf", "SKTH.waqf", "WQFH.waqf",
+ "Kaaf.waqf", "Ayn.ruku", "Miim.nuun_high", "Siin.Ssaad", "Nuunsmall", "emptydot_low",
+ "emptydot_high", "Sifr.fill", "Miim.nuun_low", "Nuun.tanwiin",
},
[4] = {
- "ZeroArabic.ayah", "OneArabic.ayah", "TwoArabic.ayah", "ThreeArabic.ayah", "FourArabic.ayah", "FiveArabic.ayah", "SixArabic.ayah", "SevenArabic.ayah", "EightArabic.ayah", "NineArabic.ayah", "FourFarsi.ayah", "FiveFarsi.ayah", "SixFarsi.ayah", "FourFarsi.urdu_ayah", "SevenFarsi.urdu_ayah","ZeroArabic.ayah_small","OneArabic.ayah_small","TwoArabic.ayah_small","ThreeArabic.ayah_small","FourArabic.ayah.001","FiveArabic.ayah_small","SixArabic.ayah_small","SevenArabic.ayah_small","EightArabic.ayah_small","NineArabic.ayah_small",
+ "ZeroArabic.ayah", "OneArabic.ayah", "TwoArabic.ayah", "ThreeArabic.ayah", "FourArabic.ayah",
+ "FiveArabic.ayah", "SixArabic.ayah", "SevenArabic.ayah", "EightArabic.ayah", "NineArabic.ayah",
+ "FourFarsi.ayah", "FiveFarsi.ayah", "SixFarsi.ayah", "FourFarsi.urdu_ayah", "SevenFarsi.urdu_ayah",
+ "ZeroArabic.ayah_small", "OneArabic.ayah_small", "TwoArabic.ayah_small", "ThreeArabic.ayah_small",
+ "FourArabic.ayah.001", "FiveArabic.ayah_small", "SixArabic.ayah_small", "SevenArabic.ayah_small",
+ "EightArabic.ayah_small", "NineArabic.ayah_small",
},
[5] = {
"Ayah", "Ayah.alt1", "Ayah.alt2", "Ayah.alt3", "Ayah2",
diff --git a/Master/texmf-dist/tex/context/fonts/hvmath-math.lfg b/Master/texmf-dist/tex/context/fonts/hvmath-math.lfg
index a7ec1ce89b8..0eba3db23f6 100644
--- a/Master/texmf-dist/tex/context/fonts/hvmath-math.lfg
+++ b/Master/texmf-dist/tex/context/fonts/hvmath-math.lfg
@@ -6,7 +6,7 @@ return {
copyright = "ConTeXt development team",
mathematics = {
mapfiles = {
- -- todo
+ "hvm-pem.map",
},
virtuals = {
["hvmath-math"] = {
diff --git a/Master/texmf-dist/tex/context/fonts/informal-math.lfg b/Master/texmf-dist/tex/context/fonts/informal-math.lfg
index 67fb73b392f..a1f461740e1 100644
--- a/Master/texmf-dist/tex/context/fonts/informal-math.lfg
+++ b/Master/texmf-dist/tex/context/fonts/informal-math.lfg
@@ -9,13 +9,13 @@ return {
"original-micropress-informal.map",
},
virtuals = {
- ["hvmath-math"] = {
+ ["informal-math"] = {
{ name = "file:ifrg.afm", features = "virtualmath", main = true },
- { name = "ifrm10cm.tfm", vector="tex-mr" },
- { name = "ifmi10", vector = "tex-mi", skewchar=0x7F },
- { name = "ifmi10.tfm", vector = "tex-it", skewchar=0x7F },
- { name = "ifsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true },
- { name = "ifex10.tfm", vector = "tex-ex", extension = true },
+ { name = "file:ifrm10cm.tfm", vector="tex-mr" },
+ { name = "file:ifmi10.tfm", vector = "tex-mi", skewchar=0x7F },
+ { name = "file:ifmi10.tfm", vector = "tex-it", skewchar=0x7F },
+ { name = "file:ifsy10.tfm", vector = "tex-sy", skewchar=0x30, parameters = true },
+ { name = "file:ifex10.tfm", vector = "tex-ex", extension = true },
}
}
}
diff --git a/Master/texmf-dist/tex/context/fonts/lm-math.lfg b/Master/texmf-dist/tex/context/fonts/lm-math.lfg
index 361b5bb86ab..43de0c51ef1 100644
--- a/Master/texmf-dist/tex/context/fonts/lm-math.lfg
+++ b/Master/texmf-dist/tex/context/fonts/lm-math.lfg
@@ -1,3 +1,34 @@
+-- This patch code is moved from font-pat.lua to this goodies
+-- files as it does not belomg in the core code.
+
+local patches = fonts.handlers.otf.enhancers.patches
+
+local function patch(data,filename)
+ local uni_to_ind = data.map.map
+ if not uni_to_ind[0x391] then
+ -- beware, this is a hack, features for latin often don't apply to greek
+ -- but lm has not much features anyway (and only greek for math)
+ patches.report("adding 13 greek capitals")
+ uni_to_ind[0x391] = uni_to_ind[0x41]
+ uni_to_ind[0x392] = uni_to_ind[0x42]
+ uni_to_ind[0x395] = uni_to_ind[0x45]
+ uni_to_ind[0x397] = uni_to_ind[0x48]
+ uni_to_ind[0x399] = uni_to_ind[0x49]
+ uni_to_ind[0x39A] = uni_to_ind[0x4B]
+ uni_to_ind[0x39C] = uni_to_ind[0x4D]
+ uni_to_ind[0x39D] = uni_to_ind[0x4E]
+ uni_to_ind[0x39F] = uni_to_ind[0x4F]
+ uni_to_ind[0x3A1] = uni_to_ind[0x52]
+ uni_to_ind[0x3A4] = uni_to_ind[0x54]
+ uni_to_ind[0x3A7] = uni_to_ind[0x58]
+ uni_to_ind[0x396] = uni_to_ind[0x5A]
+ end
+end
+
+patches.register("after","prepare glyphs","^lmroman", patch)
+patches.register("after","prepare glyphs","^lmsans", patch)
+patches.register("after","prepare glyphs","^lmtypewriter",patch)
+
-- rm-lmr5 : LMMathRoman5-Regular
-- rm-lmbx5 : LMMathRoman5-Bold ]
-- lmbsy5 : LMMathSymbols5-BoldItalic
@@ -14,6 +45,7 @@ local five = {
{ name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
{ name = "msam5.tfm", vector = "tex-ma" },
{ name = "msbm5.tfm", vector = "tex-mb" },
+ { name = "stmary10.afm", vector = "tex-mc" },
-- { name = "rm-lmbx5.tfm", vector = "tex-bf" } ,
{ name = "lmroman5-bold", vector = "tex-bf" } ,
{ name = "lmmib5.tfm", vector = "tex-bi", skewchar=0x7F } ,
@@ -36,6 +68,7 @@ local six = {
{ name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
{ name = "msam5.tfm", vector = "tex-ma" },
{ name = "msbm5.tfm", vector = "tex-mb" },
+ { name = "stmary10.afm", vector = "tex-mc" },
-- { name = "rm-lmbx6.tfm", vector = "tex-bf" } ,
{ name = "lmroman6-bold.otf", vector = "tex-bf" } ,
{ name = "lmmib5.tfm", vector = "tex-bi", skewchar=0x7F } ,
@@ -61,6 +94,7 @@ local seven = {
{ name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
{ name = "msam7.tfm", vector = "tex-ma" },
{ name = "msbm7.tfm", vector = "tex-mb" },
+ { name = "stmary10.afm", vector = "tex-mc" },
-- { name = "rm-lmbx7.tfm", vector = "tex-bf" } ,
{ name = "lmroman7-bold.otf", vector = "tex-bf" } ,
{ name = "lmmib7.tfm", vector = "tex-bi", skewchar=0x7F } ,
@@ -84,6 +118,7 @@ local eight = {
{ name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
{ name = "msam7.tfm", vector = "tex-ma" },
{ name = "msbm7.tfm", vector = "tex-mb" },
+ { name = "stmary10.afm", vector = "tex-mc" },
-- { name = "rm-lmbx8.tfm", vector = "tex-bf" } ,
{ name = "lmroman8-bold.otf", vector = "tex-bf" } ,
{ name = "lmmib7.tfm", vector = "tex-bi", skewchar=0x7F } ,
@@ -107,6 +142,7 @@ local nine = {
{ name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
{ name = "msam10.tfm", vector = "tex-ma" },
{ name = "msbm10.tfm", vector = "tex-mb" },
+ { name = "stmary10.afm", vector = "tex-mc" },
-- { name = "rm-lmbx9.tfm", vector = "tex-bf" } ,
{ name = "lmroman9-bold.otf", vector = "tex-bf" } ,
{ name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } ,
@@ -133,6 +169,7 @@ local ten = {
{ name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
{ name = "msam10.tfm", vector = "tex-ma" },
{ name = "msbm10.tfm", vector = "tex-mb" },
+ { name = "stmary10.afm", vector = "tex-mc" },
-- { name = "rm-lmbx10.tfm", vector = "tex-bf" } ,
{ name = "lmroman10-bold.otf", vector = "tex-bf" } ,
{ name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } ,
@@ -152,6 +189,7 @@ local ten_bold = {
-- copied from roman:
{ name = "msam10.tfm", vector = "tex-ma" },
{ name = "msbm10.tfm", vector = "tex-mb" },
+ { name = "stmary10.afm", vector = "tex-mc" },
-- { name = "rm-lmbx10.tfm", vector = "tex-bf" } ,
{ name = "lmroman10-bold.otf", vector = "tex-bf" } ,
{ name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } ,
@@ -174,6 +212,7 @@ local twelve = {
{ name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
{ name = "msam10.tfm", vector = "tex-ma" },
{ name = "msbm10.tfm", vector = "tex-mb" },
+ { name = "stmary10.afm", vector = "tex-mc" },
-- { name = "rm-lmbx12.tfm", vector = "tex-bf" } ,
{ name = "lmroman12-bold.otf", vector = "tex-bf" } ,
{ name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } ,
@@ -194,6 +233,7 @@ local seventeen = {
{ name = "lmex10.tfm", vector = "tex-ex", extension = true } ,
{ name = "msam10.tfm", vector = "tex-ma" },
{ name = "msbm10.tfm", vector = "tex-mb" },
+ { name = "stmary10.afm", vector = "tex-mc" },
-- { name = "rm-lmbx12.tfm", vector = "tex-bf" } ,
{ name = "lmroman12-bold.otf", vector = "tex-bf" } ,
{ name = "lmmib10.tfm", vector = "tex-bi", skewchar=0x7F } ,
@@ -225,6 +265,15 @@ return {
["lmroman10-boldmath"] = ten_bold,
["lmroman12-math"] = twelve,
["lmroman17-math"] = seventeen,
- }
+ },
+ variables = {
+ joinrelfactor = 3, -- default anyway
+ },
+ parameters = { -- test values
+ -- FactorA = 123.456,
+ -- FactorB = false,
+ -- FactorC = function(value,target,original) return 7.89 * target.factor end,
+ -- FactorD = "Hi There!",
+ },
}
}
diff --git a/Master/texmf-dist/tex/context/fonts/lucida-math.lfg b/Master/texmf-dist/tex/context/fonts/lucida-math.lfg
index 83c3c272d65..443f52acea2 100644
--- a/Master/texmf-dist/tex/context/fonts/lucida-math.lfg
+++ b/Master/texmf-dist/tex/context/fonts/lucida-math.lfg
@@ -1,4 +1,6 @@
-fonts.enc.math["lbr-ma"] = {
+local mathencodings = fonts.encodings.math
+
+mathencodings["lbr-ma"] = {
[0x025CB] = 0x00, -- circle
[0x025CF] = 0x01, -- blackcircle
[0x025A1] = 0x02, -- square
@@ -188,7 +190,7 @@ fonts.enc.math["lbr-ma"] = {
[0x022AF] = 0xFB, -- nVDash
}
-fonts.enc.math["lbr-mb"] = {
+mathencodings["lbr-mb"] = {
[0x00393] = 0x00, -- Gamma
[0x00394] = 0x01, -- Delta
[0x00398] = 0x02, -- Theta
@@ -248,7 +250,14 @@ fonts.enc.math["lbr-mb"] = {
[0x1D718] = 0x9B, -- varkappa
}
-fonts.enc.math["lbr-sy"] = {
+
+mathencodings["lbr-sy"] = {
+
+ -- [0x022C5] = 0x01, -- cdot,
+
+ [0x0002B] = 0x82, -- plus
+ [0x0003D] = 0x83, -- equal
+
[0x021CB] = 0x8D, -- leftrightharpoons
[0x021CC] = 0x8E, -- rightleftharpoons
[0x02214] = 0x89, -- dotplus
@@ -293,13 +302,18 @@ fonts.enc.math["lbr-sy"] = {
[0x025CA] = 0x05, -- lozenge
}
-fonts.enc.math["lbr-sy"] = table.merged(fonts.enc.math["tex-sy"],fonts.enc.math["lbr-sy"])
+
+mathencodings["lbr-sy"] = table.merged(mathencodings["tex-sy"],mathencodings["lbr-sy"])
+
+mathencodings["lbr-fraktur"] = { }
+
+fonts.handlers.vf.math.setletters(mathencodings, "lbr-fraktur", 0x1D504, 0x1D51E)
return {
name = "lucida-math",
version = "1.00",
comment = "Goodies that complement lucida math.",
- author = "Aditya, Hans, Mojca",
+ author = "Aditya, Hans, Mojca with help from Zhichu Chen",
copyright = "ConTeXt development team",
mathematics = {
mapfiles = {
@@ -314,7 +328,15 @@ return {
{ name = "hlcrv.tfm", vector = "tex-ex", extension = true },
{ name = "hlcra.tfm", vector = "lbr-ma" },
{ name = "hlcrm.tfm", vector = "lbr-mb" },
- }
+ { name = "file:lbd.afm", vector = "tex-bf" },
+ { name = "file:lbdi.afm", vector = "tex-bi" } ,
+ { name = "file:lsr.afm", vector = "tex-ss" },
+ { name = "file:lstr.afm", vector = "tex-tt" },
+ { name = "file:lbl.afm", vector = "lbr-fraktur" }, -- more complete
+ },
+ },
+ variables = {
+ joinrelfactor = 4, -- default is 3
}
}
}
diff --git a/Master/texmf-dist/tex/context/fonts/px-math.lfg b/Master/texmf-dist/tex/context/fonts/px-math.lfg
index b261f07013a..1d18bad361a 100644
--- a/Master/texmf-dist/tex/context/fonts/px-math.lfg
+++ b/Master/texmf-dist/tex/context/fonts/px-math.lfg
@@ -18,7 +18,13 @@ return {
{ name = "pxex.tfm", vector = "tex-ex", extension = true } ,
{ name = "pxsya.tfm", vector = "tex-ma" },
{ name = "pxsyb.tfm", vector = "tex-mb" },
+ { name = "texgyrepagella-bold.otf", vector = "tex-bf" } ,
+ { name = "texgyrepagella-bolditalic.otf", vector = "tex-bi" } ,
+ { name = "lmsans10-regular.otf", vector = "tex-ss", optional=true },
+ { name = "lmmono10-regular.otf", vector = "tex-tt", optional=true },
},
}
}
}
+
+
diff --git a/Master/texmf-dist/tex/context/fonts/tx-math.lfg b/Master/texmf-dist/tex/context/fonts/tx-math.lfg
index f1d5327733e..8423aaaf4ab 100644
--- a/Master/texmf-dist/tex/context/fonts/tx-math.lfg
+++ b/Master/texmf-dist/tex/context/fonts/tx-math.lfg
@@ -18,6 +18,10 @@ return {
{ name = "txex.tfm", vector = "tex-ex", extension = true } ,
{ name = "txsya.tfm", vector = "tex-ma" },
{ name = "txsyb.tfm", vector = "tex-mb" },
+ { name = "texgyretermes-bold.otf", vector = "tex-bf", skewchar=0x7F } ,
+ { name = "texgyretermes-bolditalic.otf", vector = "tex-bi" } ,
+ { name = "lmsans10-regular.otf", vector = "tex-ss", optional=true },
+ { name = "lmmono10-regular.otf", vector = "tex-tt", optional=true },
}
}
}
diff --git a/Master/texmf-dist/tex/context/fonts/xits-math.lfg b/Master/texmf-dist/tex/context/fonts/xits-math.lfg
new file mode 100644
index 00000000000..a97a7599d9b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/fonts/xits-math.lfg
@@ -0,0 +1,25 @@
+-- \setupbodyfont[xits]
+--
+-- \starttext
+-- $ABC$ $\cal ABC$ $\mathalternate{cal}\cal ABC$
+-- \stoptext
+
+return {
+ name = "xits-math",
+ version = "1.00",
+ comment = "Goodies that complement xits (by Khaled Hosny).",
+ author = "Hans Hagen",
+ copyright = "ConTeXt development team",
+ mathematics = {
+ alternates = {
+ cal = { feature = 'ss01', value = 1, comment = "Mathematical Calligraphic Alphabet" },
+ greekssup = { feature = 'ss02', value = 1, comment = "Mathematical Greek Sans Serif Alphabet" },
+ greekssit = { feature = 'ss03', value = 1, comment = "Mathematical Italic Sans Serif Digits" },
+ monobfnum = { feature = 'ss04', value = 1, comment = "Mathematical Bold Monospace Digits" },
+ mathbbbf = { feature = 'ss05', value = 1, comment = "Mathematical Bold Double-Struck Alphabet" },
+ mathbbit = { feature = 'ss06', value = 1, comment = "Mathematical Italic Double-Struck Alphabet" },
+ mathbbbi = { feature = 'ss07', value = 1, comment = "Mathematical Bold Italic Double-Struck Alphabet" },
+ upint = { feature = 'ss08', value = 1, comment = "Upright Integrals" },
+ }
+ }
+}
diff --git a/Master/texmf-dist/tex/context/interface/cont-cs.xml b/Master/texmf-dist/tex/context/interface/cont-cs.xml
index d6783304124..a7b2466553d 100644
--- a/Master/texmf-dist/tex/context/interface/cont-cs.xml
+++ b/Master/texmf-dist/tex/context/interface/cont-cs.xml
@@ -1,13 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- versions:
comment : user interface definitions of ConTeXt
- authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach, Wolfgang Schuster, and others
versions : 2004.11.17 : initial version
2006.08.02 : define + resolve
-->
+
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="cs" version="2006.08.02">
<cd:define name="align">
@@ -869,6 +872,15 @@
<cd:parameter name="barva">
<cd:constant type="cd:name" default=""/>
</cd:parameter>
+ <cd:parameter name="vlevo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="vpravo">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="prikaz">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -1148,6 +1160,10 @@
<cd:constant type="ano"/>
<cd:constant type="ne"/>
</cd:parameter>
+ <cd:parameter name="odstavec">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne" default="yes"/>
+ </cd:parameter>
<cd:parameter name="faktor">
<cd:constant type="cd:number"/>
</cd:parameter>
@@ -3166,6 +3182,10 @@
<cd:parameter name="prikaz">
<cd:constant type="cd:command"/>
</cd:parameter>
+ <cd:parameter name="obrazovka">
+ <cd:constant type="ano" default="yes"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -4893,8 +4913,14 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="misto">
+ <cd:constant type="zde"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ </cd:assignments>
<cd:content n="3"/>
+ <cd:content n="4"/>
</cd:arguments>
</cd:command>
@@ -4907,7 +4933,13 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="misto">
+ <cd:constant type="zde"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="3"/>
</cd:arguments>
</cd:command>
@@ -5025,7 +5057,7 @@
<cd:constant type="uvod"/>
<cd:constant type="vse"/>
</cd:parameter>
- <cd:parameter name="hranicestranky">
+ <cd:parameter name="extras">
<cd:constant type="cd:list"/>
</cd:parameter>
<cd:parameter name="pismeno">
@@ -5056,10 +5088,11 @@
<cd:constant type="cd:oneargument"/>
</cd:parameter>
<cd:parameter name="interakce">
- <cd:constant type="cd:sectionnumber"/>
- <cd:constant type="cd:text"/>
+ <cd:constant type="cislooddilu"/>
+ <cd:constant type="text"/>
<cd:constant type="cislostranky"/>
<cd:constant type="vse"/>
+ <cd:constant type="zadny"/>
</cd:parameter>
<cd:parameter name="pred">
<cd:constant type="cd:command"/>
@@ -5142,6 +5175,11 @@
<cd:parameter name="maxsirka">
<cd:constant type="cd:dimension"/>
</cd:parameter>
+ <cd:parameter name="order">
+ <cd:constant type="prikaz"/>
+ <cd:constant type="vse"/>
+ <cd:constant type="normalni"/>
+ </cd:parameter>
<cd:inherit name="nastavoramovani" n="2"/>
</cd:assignments>
</cd:arguments>
@@ -6062,6 +6100,10 @@
<cd:constant type="ano"/>
<cd:constant type="ne"/>
</cd:parameter>
+ <cd:parameter name="interakce">
+ <cd:constant type="seznam"/>
+ <cd:constant type="zadny"/>
+ </cd:parameter>
<cd:inherit name="nastavnadpisy" n="1"/>
</cd:assignments>
</cd:arguments>
@@ -6855,12 +6897,6 @@
<cd:parameter name="vyska">
<cd:constant type="cd:dimension"/>
</cd:parameter>
- <cd:parameter name="voffset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="hoffset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
<cd:parameter name="stranka">
<cd:constant type="vlevo"/>
<cd:constant type="ano"/>
@@ -8513,6 +8549,11 @@
<cd:parameter name="prefix">
<cd:constant type="cd:text"/>
</cd:parameter>
+ <cd:parameter name="interakce">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ <!-- more will follow -->
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -9319,6 +9360,12 @@
<cd:constant type="cd:name"/>
<cd:constant type="vse"/>
</cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="sila">
+ <cd:constant type="ano"/>
+ <cd:constant type="ne"/>
+ </cd:parameter>
+ </cd:assignments>
</cd:arguments>
</cd:command>
@@ -9587,7 +9634,7 @@
<cd:command name="comment" type="environment">
<cd:sequence>
- <cd:string value="komentar"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -9601,7 +9648,7 @@
<cd:command name="comment">
<cd:sequence>
- <cd:string value="komentar"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -10220,6 +10267,8 @@
</cd:arguments>
</cd:command>
+ <!-- mkii:
+
<cd:command name="definefontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="definujsynonumumfontu"/>
@@ -10248,6 +10297,33 @@
</cd:arguments>
</cd:command>
+ -->
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="definujsynonumumfontu"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="fallbacks">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="goodies">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="setupfontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="setupfontsynonym"/>
diff --git a/Master/texmf-dist/tex/context/interface/cont-de.xml b/Master/texmf-dist/tex/context/interface/cont-de.xml
index 6ba3e691ed5..61441dd9ca0 100644
--- a/Master/texmf-dist/tex/context/interface/cont-de.xml
+++ b/Master/texmf-dist/tex/context/interface/cont-de.xml
@@ -1,13 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- versions:
comment : user interface definitions of ConTeXt
- authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach, Wolfgang Schuster, and others
versions : 2004.11.17 : initial version
2006.08.02 : define + resolve
-->
+
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="de" version="2006.08.02">
<cd:define name="align">
@@ -869,6 +872,15 @@
<cd:parameter name="farbe">
<cd:constant type="cd:name" default=""/>
</cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="befehl">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -1148,6 +1160,10 @@
<cd:constant type="ja"/>
<cd:constant type="nein"/>
</cd:parameter>
+ <cd:parameter name="absatz">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein" default="yes"/>
+ </cd:parameter>
<cd:parameter name="faktor">
<cd:constant type="cd:number"/>
</cd:parameter>
@@ -3166,6 +3182,10 @@
<cd:parameter name="befehl">
<cd:constant type="cd:command"/>
</cd:parameter>
+ <cd:parameter name="bildschirm">
+ <cd:constant type="ja" default="yes"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -4893,8 +4913,14 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="platz">
+ <cd:constant type="hier"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ </cd:assignments>
<cd:content n="3"/>
+ <cd:content n="4"/>
</cd:arguments>
</cd:command>
@@ -4907,7 +4933,13 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="platz">
+ <cd:constant type="hier"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="3"/>
</cd:arguments>
</cd:command>
@@ -5025,7 +5057,7 @@
<cd:constant type="intro"/>
<cd:constant type="alles"/>
</cd:parameter>
- <cd:parameter name="seitenbegrenzung">
+ <cd:parameter name="extras">
<cd:constant type="cd:list"/>
</cd:parameter>
<cd:parameter name="stil">
@@ -5056,10 +5088,11 @@
<cd:constant type="cd:oneargument"/>
</cd:parameter>
<cd:parameter name="interaktion">
- <cd:constant type="cd:sectionnumber"/>
- <cd:constant type="cd:text"/>
+ <cd:constant type="abschnittsnummer"/>
+ <cd:constant type="text"/>
<cd:constant type="seitennummer"/>
<cd:constant type="alles"/>
+ <cd:constant type="kein"/>
</cd:parameter>
<cd:parameter name="vor">
<cd:constant type="cd:command"/>
@@ -5142,6 +5175,11 @@
<cd:parameter name="maxbreite">
<cd:constant type="cd:dimension"/>
</cd:parameter>
+ <cd:parameter name="order">
+ <cd:constant type="befehl"/>
+ <cd:constant type="alles"/>
+ <cd:constant type="normal"/>
+ </cd:parameter>
<cd:inherit name="stelleumrahmtein" n="2"/>
</cd:assignments>
</cd:arguments>
@@ -6062,6 +6100,10 @@
<cd:constant type="ja"/>
<cd:constant type="nein"/>
</cd:parameter>
+ <cd:parameter name="interaktion">
+ <cd:constant type="liste"/>
+ <cd:constant type="kein"/>
+ </cd:parameter>
<cd:inherit name="stelleueberschriftenein" n="1"/>
</cd:assignments>
</cd:arguments>
@@ -6855,12 +6897,6 @@
<cd:parameter name="hoehe">
<cd:constant type="cd:dimension"/>
</cd:parameter>
- <cd:parameter name="voffset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="hoffset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
<cd:parameter name="seite">
<cd:constant type="links"/>
<cd:constant type="ja"/>
@@ -8513,6 +8549,11 @@
<cd:parameter name="prefix">
<cd:constant type="cd:text"/>
</cd:parameter>
+ <cd:parameter name="interaktion">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ <!-- more will follow -->
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -9319,6 +9360,12 @@
<cd:constant type="cd:name"/>
<cd:constant type="alles"/>
</cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="zwinge">
+ <cd:constant type="ja"/>
+ <cd:constant type="nein"/>
+ </cd:parameter>
+ </cd:assignments>
</cd:arguments>
</cd:command>
@@ -9587,7 +9634,7 @@
<cd:command name="comment" type="environment">
<cd:sequence>
- <cd:string value="kommentar"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -9601,7 +9648,7 @@
<cd:command name="comment">
<cd:sequence>
- <cd:string value="kommentar"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -10220,6 +10267,8 @@
</cd:arguments>
</cd:command>
+ <!-- mkii:
+
<cd:command name="definefontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="defineschriftsynonym"/>
@@ -10248,6 +10297,33 @@
</cd:arguments>
</cd:command>
+ -->
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="defineschriftsynonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="fallbacks">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="goodies">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="setupfontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="setupfontsynonym"/>
diff --git a/Master/texmf-dist/tex/context/interface/cont-en.xml b/Master/texmf-dist/tex/context/interface/cont-en.xml
index 5421df6e375..b532f2b219f 100644
--- a/Master/texmf-dist/tex/context/interface/cont-en.xml
+++ b/Master/texmf-dist/tex/context/interface/cont-en.xml
@@ -1,13 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- versions:
comment : user interface definitions of ConTeXt
- authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach, Wolfgang Schuster, and others
versions : 2004.11.17 : initial version
2006.08.02 : define + resolve
-->
+
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="en" version="2006.08.02">
<cd:define name="align">
@@ -869,6 +872,15 @@
<cd:parameter name="color">
<cd:constant type="cd:name" default=""/>
</cd:parameter>
+ <cd:parameter name="left">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="right">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="command">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -1148,6 +1160,10 @@
<cd:constant type="yes"/>
<cd:constant type="no"/>
</cd:parameter>
+ <cd:parameter name="paragraph">
+ <cd:constant type="yes"/>
+ <cd:constant type="no" default="yes"/>
+ </cd:parameter>
<cd:parameter name="factor">
<cd:constant type="cd:number"/>
</cd:parameter>
@@ -3166,6 +3182,10 @@
<cd:parameter name="command">
<cd:constant type="cd:command"/>
</cd:parameter>
+ <cd:parameter name="display">
+ <cd:constant type="yes" default="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -4893,8 +4913,14 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="location">
+ <cd:constant type="here"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ </cd:assignments>
<cd:content n="3"/>
+ <cd:content n="4"/>
</cd:arguments>
</cd:command>
@@ -4907,7 +4933,13 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="location">
+ <cd:constant type="here"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="3"/>
</cd:arguments>
</cd:command>
@@ -5025,7 +5057,7 @@
<cd:constant type="intro"/>
<cd:constant type="all"/>
</cd:parameter>
- <cd:parameter name="pageboundaries">
+ <cd:parameter name="extras">
<cd:constant type="cd:list"/>
</cd:parameter>
<cd:parameter name="style">
@@ -5056,10 +5088,11 @@
<cd:constant type="cd:oneargument"/>
</cd:parameter>
<cd:parameter name="interaction">
- <cd:constant type="cd:sectionnumber"/>
- <cd:constant type="cd:text"/>
+ <cd:constant type="sectionnumber"/>
+ <cd:constant type="text"/>
<cd:constant type="pagenumber"/>
<cd:constant type="all"/>
+ <cd:constant type="none"/>
</cd:parameter>
<cd:parameter name="before">
<cd:constant type="cd:command"/>
@@ -5142,6 +5175,11 @@
<cd:parameter name="maxwidth">
<cd:constant type="cd:dimension"/>
</cd:parameter>
+ <cd:parameter name="order">
+ <cd:constant type="command"/>
+ <cd:constant type="all"/>
+ <cd:constant type="normal"/>
+ </cd:parameter>
<cd:inherit name="setupframed" n="2"/>
</cd:assignments>
</cd:arguments>
@@ -6062,6 +6100,10 @@
<cd:constant type="yes"/>
<cd:constant type="no"/>
</cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="list"/>
+ <cd:constant type="none"/>
+ </cd:parameter>
<cd:inherit name="setupheads" n="1"/>
</cd:assignments>
</cd:arguments>
@@ -6855,12 +6897,6 @@
<cd:parameter name="height">
<cd:constant type="cd:dimension"/>
</cd:parameter>
- <cd:parameter name="voffset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="hoffset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
<cd:parameter name="page">
<cd:constant type="left"/>
<cd:constant type="yes"/>
@@ -8513,6 +8549,11 @@
<cd:parameter name="prefix">
<cd:constant type="cd:text"/>
</cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ <!-- more will follow -->
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -9319,6 +9360,12 @@
<cd:constant type="cd:name"/>
<cd:constant type="all"/>
</cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="force">
+ <cd:constant type="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
</cd:arguments>
</cd:command>
@@ -10220,6 +10267,8 @@
</cd:arguments>
</cd:command>
+ <!-- mkii:
+
<cd:command name="definefontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="definefontsynonym"/>
@@ -10248,6 +10297,33 @@
</cd:arguments>
</cd:command>
+ -->
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="definefontsynonym"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="fallbacks">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="goodies">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="setupfontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="setupfontsynonym"/>
diff --git a/Master/texmf-dist/tex/context/interface/cont-fr.xml b/Master/texmf-dist/tex/context/interface/cont-fr.xml
index 043a2b91fd3..615eda784ba 100644
--- a/Master/texmf-dist/tex/context/interface/cont-fr.xml
+++ b/Master/texmf-dist/tex/context/interface/cont-fr.xml
@@ -1,13 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- versions:
comment : user interface definitions of ConTeXt
- authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach, Wolfgang Schuster, and others
versions : 2004.11.17 : initial version
2006.08.02 : define + resolve
-->
+
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="fr" version="2006.08.02">
<cd:define name="align">
@@ -869,6 +872,15 @@
<cd:parameter name="couleur">
<cd:constant type="cd:name" default=""/>
</cd:parameter>
+ <cd:parameter name="gauche">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="droite">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="commande">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -1148,6 +1160,10 @@
<cd:constant type="oui"/>
<cd:constant type="non"/>
</cd:parameter>
+ <cd:parameter name="paragraphe">
+ <cd:constant type="oui"/>
+ <cd:constant type="non" default="yes"/>
+ </cd:parameter>
<cd:parameter name="facteur">
<cd:constant type="cd:number"/>
</cd:parameter>
@@ -3166,6 +3182,10 @@
<cd:parameter name="commande">
<cd:constant type="cd:command"/>
</cd:parameter>
+ <cd:parameter name="affichage">
+ <cd:constant type="oui" default="yes"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -4893,8 +4913,14 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="emplacement">
+ <cd:constant type="ici"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ </cd:assignments>
<cd:content n="3"/>
+ <cd:content n="4"/>
</cd:arguments>
</cd:command>
@@ -4907,7 +4933,13 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="emplacement">
+ <cd:constant type="ici"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="3"/>
</cd:arguments>
</cd:command>
@@ -5025,7 +5057,7 @@
<cd:constant type="intro"/>
<cd:constant type="tout"/>
</cd:parameter>
- <cd:parameter name="limitespage">
+ <cd:parameter name="extras">
<cd:constant type="cd:list"/>
</cd:parameter>
<cd:parameter name="style">
@@ -5056,10 +5088,11 @@
<cd:constant type="cd:oneargument"/>
</cd:parameter>
<cd:parameter name="interaction">
- <cd:constant type="cd:sectionnumber"/>
- <cd:constant type="cd:text"/>
+ <cd:constant type="numerosection"/>
+ <cd:constant type="texte"/>
<cd:constant type="numeropage"/>
<cd:constant type="tout"/>
+ <cd:constant type="rien"/>
</cd:parameter>
<cd:parameter name="avant">
<cd:constant type="cd:command"/>
@@ -5142,6 +5175,11 @@
<cd:parameter name="largeurmax">
<cd:constant type="cd:dimension"/>
</cd:parameter>
+ <cd:parameter name="order">
+ <cd:constant type="commande"/>
+ <cd:constant type="tout"/>
+ <cd:constant type="normal"/>
+ </cd:parameter>
<cd:inherit name="regleencadre" n="2"/>
</cd:assignments>
</cd:arguments>
@@ -6062,6 +6100,10 @@
<cd:constant type="oui"/>
<cd:constant type="non"/>
</cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="liste"/>
+ <cd:constant type="rien"/>
+ </cd:parameter>
<cd:inherit name="regletetes" n="1"/>
</cd:assignments>
</cd:arguments>
@@ -6855,12 +6897,6 @@
<cd:parameter name="hauteur">
<cd:constant type="cd:dimension"/>
</cd:parameter>
- <cd:parameter name="voffset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="decalagehauteur">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
<cd:parameter name="page">
<cd:constant type="gauche"/>
<cd:constant type="oui"/>
@@ -8513,6 +8549,11 @@
<cd:parameter name="prefixe">
<cd:constant type="cd:text"/>
</cd:parameter>
+ <cd:parameter name="interaction">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ <!-- more will follow -->
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -9319,6 +9360,12 @@
<cd:constant type="cd:name"/>
<cd:constant type="tout"/>
</cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="force">
+ <cd:constant type="oui"/>
+ <cd:constant type="non"/>
+ </cd:parameter>
+ </cd:assignments>
</cd:arguments>
</cd:command>
@@ -9587,7 +9634,7 @@
<cd:command name="comment" type="environment">
<cd:sequence>
- <cd:string value="commentaire"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -9601,7 +9648,7 @@
<cd:command name="comment">
<cd:sequence>
- <cd:string value="commentaire"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -10220,6 +10267,8 @@
</cd:arguments>
</cd:command>
+ <!-- mkii:
+
<cd:command name="definefontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="definitsynonymepolice"/>
@@ -10248,6 +10297,33 @@
</cd:arguments>
</cd:command>
+ -->
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="definitsynonymepolice"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="fallbacks">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="goodies">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="setupfontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="setupfontsynonym"/>
diff --git a/Master/texmf-dist/tex/context/interface/cont-it.xml b/Master/texmf-dist/tex/context/interface/cont-it.xml
index 9e470fe684d..5038f13ac83 100644
--- a/Master/texmf-dist/tex/context/interface/cont-it.xml
+++ b/Master/texmf-dist/tex/context/interface/cont-it.xml
@@ -1,13 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- versions:
comment : user interface definitions of ConTeXt
- authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach, Wolfgang Schuster, and others
versions : 2004.11.17 : initial version
2006.08.02 : define + resolve
-->
+
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="it" version="2006.08.02">
<cd:define name="align">
@@ -869,6 +872,15 @@
<cd:parameter name="colore">
<cd:constant type="cd:name" default=""/>
</cd:parameter>
+ <cd:parameter name="sinistra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="destra">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="comando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -1148,6 +1160,10 @@
<cd:constant type="si"/>
<cd:constant type="no"/>
</cd:parameter>
+ <cd:parameter name="capoverso">
+ <cd:constant type="si"/>
+ <cd:constant type="no" default="yes"/>
+ </cd:parameter>
<cd:parameter name="fattore">
<cd:constant type="cd:number"/>
</cd:parameter>
@@ -3166,6 +3182,10 @@
<cd:parameter name="comando">
<cd:constant type="cd:command"/>
</cd:parameter>
+ <cd:parameter name="display">
+ <cd:constant type="si" default="yes"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -4893,8 +4913,14 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="luogo">
+ <cd:constant type="qui"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ </cd:assignments>
<cd:content n="3"/>
+ <cd:content n="4"/>
</cd:arguments>
</cd:command>
@@ -4907,7 +4933,13 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="luogo">
+ <cd:constant type="qui"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="3"/>
</cd:arguments>
</cd:command>
@@ -5025,7 +5057,7 @@
<cd:constant type="intro"/>
<cd:constant type="tutti"/>
</cd:parameter>
- <cd:parameter name="limitipagina">
+ <cd:parameter name="extras">
<cd:constant type="cd:list"/>
</cd:parameter>
<cd:parameter name="stile">
@@ -5056,10 +5088,11 @@
<cd:constant type="cd:oneargument"/>
</cd:parameter>
<cd:parameter name="interazione">
- <cd:constant type="cd:sectionnumber"/>
- <cd:constant type="cd:text"/>
+ <cd:constant type="numerosezione"/>
+ <cd:constant type="testo"/>
<cd:constant type="numeropagina"/>
<cd:constant type="tutti"/>
+ <cd:constant type="nessuno"/>
</cd:parameter>
<cd:parameter name="prima">
<cd:constant type="cd:command"/>
@@ -5142,6 +5175,11 @@
<cd:parameter name="ampiezzamax">
<cd:constant type="cd:dimension"/>
</cd:parameter>
+ <cd:parameter name="order">
+ <cd:constant type="comando"/>
+ <cd:constant type="tutti"/>
+ <cd:constant type="normale"/>
+ </cd:parameter>
<cd:inherit name="impostaincorniciato" n="2"/>
</cd:assignments>
</cd:arguments>
@@ -6062,6 +6100,10 @@
<cd:constant type="si"/>
<cd:constant type="no"/>
</cd:parameter>
+ <cd:parameter name="interazione">
+ <cd:constant type="elenco"/>
+ <cd:constant type="nessuno"/>
+ </cd:parameter>
<cd:inherit name="impostateste" n="1"/>
</cd:assignments>
</cd:arguments>
@@ -6855,12 +6897,6 @@
<cd:parameter name="altezza">
<cd:constant type="cd:dimension"/>
</cd:parameter>
- <cd:parameter name="voffset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="hoffset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
<cd:parameter name="pagina">
<cd:constant type="sinistra"/>
<cd:constant type="si"/>
@@ -8513,6 +8549,11 @@
<cd:parameter name="prefisso">
<cd:constant type="cd:text"/>
</cd:parameter>
+ <cd:parameter name="interazione">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ <!-- more will follow -->
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -9319,6 +9360,12 @@
<cd:constant type="cd:name"/>
<cd:constant type="tutti"/>
</cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="forza">
+ <cd:constant type="si"/>
+ <cd:constant type="no"/>
+ </cd:parameter>
+ </cd:assignments>
</cd:arguments>
</cd:command>
@@ -9587,7 +9634,7 @@
<cd:command name="comment" type="environment">
<cd:sequence>
- <cd:string value="commento"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -9601,7 +9648,7 @@
<cd:command name="comment">
<cd:sequence>
- <cd:string value="commento"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -10220,6 +10267,8 @@
</cd:arguments>
</cd:command>
+ <!-- mkii:
+
<cd:command name="definefontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="definiscisinonimofont"/>
@@ -10248,6 +10297,33 @@
</cd:arguments>
</cd:command>
+ -->
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="definiscisinonimofont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="fallbacks">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="goodies">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="setupfontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="setupfontsynonym"/>
diff --git a/Master/texmf-dist/tex/context/interface/cont-nl.xml b/Master/texmf-dist/tex/context/interface/cont-nl.xml
index 990b915c9d8..2d53444fb99 100644
--- a/Master/texmf-dist/tex/context/interface/cont-nl.xml
+++ b/Master/texmf-dist/tex/context/interface/cont-nl.xml
@@ -1,13 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- versions:
comment : user interface definitions of ConTeXt
- authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach, Wolfgang Schuster, and others
versions : 2004.11.17 : initial version
2006.08.02 : define + resolve
-->
+
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="nl" version="2006.08.02">
<cd:define name="align">
@@ -869,6 +872,15 @@
<cd:parameter name="kleur">
<cd:constant type="cd:name" default=""/>
</cd:parameter>
+ <cd:parameter name="links">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="rechts">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="commando">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -1148,6 +1160,10 @@
<cd:constant type="ja"/>
<cd:constant type="nee"/>
</cd:parameter>
+ <cd:parameter name="alinea">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee" default="yes"/>
+ </cd:parameter>
<cd:parameter name="factor">
<cd:constant type="cd:number"/>
</cd:parameter>
@@ -3166,6 +3182,10 @@
<cd:parameter name="commando">
<cd:constant type="cd:command"/>
</cd:parameter>
+ <cd:parameter name="scherm">
+ <cd:constant type="ja" default="yes"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -4893,8 +4913,14 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="plaats">
+ <cd:constant type="hier"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ </cd:assignments>
<cd:content n="3"/>
+ <cd:content n="4"/>
</cd:arguments>
</cd:command>
@@ -4907,7 +4933,13 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="plaats">
+ <cd:constant type="hier"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="3"/>
</cd:arguments>
</cd:command>
@@ -5025,7 +5057,7 @@
<cd:constant type="intro"/>
<cd:constant type="alles"/>
</cd:parameter>
- <cd:parameter name="paginaovergangen">
+ <cd:parameter name="extras">
<cd:constant type="cd:list"/>
</cd:parameter>
<cd:parameter name="letter">
@@ -5056,10 +5088,11 @@
<cd:constant type="cd:oneargument"/>
</cd:parameter>
<cd:parameter name="interactie">
- <cd:constant type="cd:sectionnumber"/>
- <cd:constant type="cd:text"/>
+ <cd:constant type="sectienummer"/>
+ <cd:constant type="tekst"/>
<cd:constant type="paginanummer"/>
<cd:constant type="alles"/>
+ <cd:constant type="geen"/>
</cd:parameter>
<cd:parameter name="voor">
<cd:constant type="cd:command"/>
@@ -5142,6 +5175,11 @@
<cd:parameter name="maxbreedte">
<cd:constant type="cd:dimension"/>
</cd:parameter>
+ <cd:parameter name="order">
+ <cd:constant type="commando"/>
+ <cd:constant type="alles"/>
+ <cd:constant type="normaal"/>
+ </cd:parameter>
<cd:inherit name="stelomlijndin" n="2"/>
</cd:assignments>
</cd:arguments>
@@ -6062,6 +6100,10 @@
<cd:constant type="ja"/>
<cd:constant type="nee"/>
</cd:parameter>
+ <cd:parameter name="interactie">
+ <cd:constant type="lijst"/>
+ <cd:constant type="geen"/>
+ </cd:parameter>
<cd:inherit name="stelkoppenin" n="1"/>
</cd:assignments>
</cd:arguments>
@@ -6855,12 +6897,6 @@
<cd:parameter name="hoogte">
<cd:constant type="cd:dimension"/>
</cd:parameter>
- <cd:parameter name="voffset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="hoffset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
<cd:parameter name="pagina">
<cd:constant type="links"/>
<cd:constant type="ja"/>
@@ -8513,6 +8549,11 @@
<cd:parameter name="prefix">
<cd:constant type="cd:text"/>
</cd:parameter>
+ <cd:parameter name="interactie">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ <!-- more will follow -->
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -9319,6 +9360,12 @@
<cd:constant type="cd:name"/>
<cd:constant type="alles"/>
</cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="forceer">
+ <cd:constant type="ja"/>
+ <cd:constant type="nee"/>
+ </cd:parameter>
+ </cd:assignments>
</cd:arguments>
</cd:command>
@@ -9587,7 +9634,7 @@
<cd:command name="comment" type="environment">
<cd:sequence>
- <cd:string value="commentaar"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -9601,7 +9648,7 @@
<cd:command name="comment">
<cd:sequence>
- <cd:string value="commentaar"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -10220,6 +10267,8 @@
</cd:arguments>
</cd:command>
+ <!-- mkii:
+
<cd:command name="definefontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="definieerfontsynoniem"/>
@@ -10248,6 +10297,33 @@
</cd:arguments>
</cd:command>
+ -->
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="definieerfontsynoniem"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="fallbacks">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="goodies">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="setupfontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="setupfontsynonym"/>
diff --git a/Master/texmf-dist/tex/context/interface/cont-pe.xml b/Master/texmf-dist/tex/context/interface/cont-pe.xml
index c4e82e1d504..12a54339dad 100644
--- a/Master/texmf-dist/tex/context/interface/cont-pe.xml
+++ b/Master/texmf-dist/tex/context/interface/cont-pe.xml
@@ -1,13 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- versions:
comment : user interface definitions of ConTeXt
- authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach, Wolfgang Schuster, and others
versions : 2004.11.17 : initial version
2006.08.02 : define + resolve
-->
+
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="pe" version="2006.08.02">
<cd:define name="align">
@@ -869,6 +872,15 @@
<cd:parameter name="رنگ">
<cd:constant type="cd:name" default=""/>
</cd:parameter>
+ <cd:parameter name="چپ">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="راست">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="فرمان">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -1148,6 +1160,10 @@
<cd:constant type="بله"/>
<cd:constant type="نه"/>
</cd:parameter>
+ <cd:parameter name="پاراگراف">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه" default="yes"/>
+ </cd:parameter>
<cd:parameter name="عامل">
<cd:constant type="cd:number"/>
</cd:parameter>
@@ -3166,6 +3182,10 @@
<cd:parameter name="فرمان">
<cd:constant type="cd:command"/>
</cd:parameter>
+ <cd:parameter name="نمایش">
+ <cd:constant type="بله" default="yes"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -4893,8 +4913,14 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="مکان">
+ <cd:constant type="اینجا"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ </cd:assignments>
<cd:content n="3"/>
+ <cd:content n="4"/>
</cd:arguments>
</cd:command>
@@ -4907,7 +4933,13 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="مکان">
+ <cd:constant type="اینجا"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="3"/>
</cd:arguments>
</cd:command>
@@ -5025,7 +5057,7 @@
<cd:constant type="پیشگفتار"/>
<cd:constant type="همه"/>
</cd:parameter>
- <cd:parameter name="مرزهای‌صفحه">
+ <cd:parameter name="extras">
<cd:constant type="cd:list"/>
</cd:parameter>
<cd:parameter name="سبک">
@@ -5056,10 +5088,11 @@
<cd:constant type="cd:oneargument"/>
</cd:parameter>
<cd:parameter name="پانل">
- <cd:constant type="cd:sectionnumber"/>
- <cd:constant type="cd:text"/>
+ <cd:constant type="شماره‌بخش"/>
+ <cd:constant type="متن"/>
<cd:constant type="شماره‌صفحه"/>
<cd:constant type="همه"/>
+ <cd:constant type="هیچکدام"/>
</cd:parameter>
<cd:parameter name="قبل‌از">
<cd:constant type="cd:command"/>
@@ -5142,6 +5175,11 @@
<cd:parameter name="بیشترین‌عرض">
<cd:constant type="cd:dimension"/>
</cd:parameter>
+ <cd:parameter name="order">
+ <cd:constant type="فرمان"/>
+ <cd:constant type="همه"/>
+ <cd:constant type="نرمال"/>
+ </cd:parameter>
<cd:inherit name="بارگذاری‌قالبی" n="2"/>
</cd:assignments>
</cd:arguments>
@@ -6062,6 +6100,10 @@
<cd:constant type="بله"/>
<cd:constant type="نه"/>
</cd:parameter>
+ <cd:parameter name="پانل">
+ <cd:constant type="لیست"/>
+ <cd:constant type="هیچکدام"/>
+ </cd:parameter>
<cd:inherit name="بارگذاری‌سرها" n="1"/>
</cd:assignments>
</cd:arguments>
@@ -6855,12 +6897,6 @@
<cd:parameter name="ارتفاع">
<cd:constant type="cd:dimension"/>
</cd:parameter>
- <cd:parameter name="آفست‌ع">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="آفست‌ا">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
<cd:parameter name="صفحه">
<cd:constant type="چپ"/>
<cd:constant type="بله"/>
@@ -8513,6 +8549,11 @@
<cd:parameter name="پیشوند">
<cd:constant type="cd:text"/>
</cd:parameter>
+ <cd:parameter name="پانل">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ <!-- more will follow -->
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -9319,6 +9360,12 @@
<cd:constant type="cd:name"/>
<cd:constant type="همه"/>
</cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="اجبار">
+ <cd:constant type="بله"/>
+ <cd:constant type="نه"/>
+ </cd:parameter>
+ </cd:assignments>
</cd:arguments>
</cd:command>
@@ -9587,7 +9634,7 @@
<cd:command name="comment" type="environment">
<cd:sequence>
- <cd:string value="توضیح"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -9601,7 +9648,7 @@
<cd:command name="comment">
<cd:sequence>
- <cd:string value="توضیح"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -10220,6 +10267,8 @@
</cd:arguments>
</cd:command>
+ <!-- mkii:
+
<cd:command name="definefontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="تعریف‌مترادف‌قلم"/>
@@ -10248,6 +10297,33 @@
</cd:arguments>
</cd:command>
+ -->
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="تعریف‌مترادف‌قلم"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="fallbacks">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="goodies">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="setupfontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="setupfontsynonym"/>
diff --git a/Master/texmf-dist/tex/context/interface/cont-ro.xml b/Master/texmf-dist/tex/context/interface/cont-ro.xml
index dcaa288dad9..b7fa62d59d4 100644
--- a/Master/texmf-dist/tex/context/interface/cont-ro.xml
+++ b/Master/texmf-dist/tex/context/interface/cont-ro.xml
@@ -1,13 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?> <!-- versions:
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- versions:
comment : user interface definitions of ConTeXt
- authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach
+ authors : Hans Hagen, Taco Hoekwater, Patrick Gundlach, Wolfgang Schuster, and others
versions : 2004.11.17 : initial version
2006.08.02 : define + resolve
-->
+
<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="ro" version="2006.08.02">
<cd:define name="align">
@@ -869,6 +872,15 @@
<cd:parameter name="culoare">
<cd:constant type="cd:name" default=""/>
</cd:parameter>
+ <cd:parameter name="stanga">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="dreapta">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
+ <cd:parameter name="comanda">
+ <cd:constant type="cd:command"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -1148,6 +1160,10 @@
<cd:constant type="da"/>
<cd:constant type="nu"/>
</cd:parameter>
+ <cd:parameter name="paragraf">
+ <cd:constant type="da"/>
+ <cd:constant type="nu" default="yes"/>
+ </cd:parameter>
<cd:parameter name="factor">
<cd:constant type="cd:number"/>
</cd:parameter>
@@ -3166,6 +3182,10 @@
<cd:parameter name="comanda">
<cd:constant type="cd:command"/>
</cd:parameter>
+ <cd:parameter name="display">
+ <cd:constant type="da" default="yes"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -4893,8 +4913,14 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="locatie">
+ <cd:constant type="aici"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ </cd:assignments>
<cd:content n="3"/>
+ <cd:content n="4"/>
</cd:arguments>
</cd:command>
@@ -4907,7 +4933,13 @@
<cd:constant type="cd:section"/>
<cd:constant type="cd:name"/>
</cd:keywords>
- <cd:content n="2"/>
+ <cd:assignments n="2" list="yes">
+ <cd:parameter name="locatie">
+ <cd:constant type="aici"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
+ </cd:assignments>
+ <cd:content n="3"/>
</cd:arguments>
</cd:command>
@@ -5025,7 +5057,7 @@
<cd:constant type="intro"/>
<cd:constant type="tot"/>
</cd:parameter>
- <cd:parameter name="marginipagina">
+ <cd:parameter name="extras">
<cd:constant type="cd:list"/>
</cd:parameter>
<cd:parameter name="stil">
@@ -5056,10 +5088,11 @@
<cd:constant type="cd:oneargument"/>
</cd:parameter>
<cd:parameter name="interactiune">
- <cd:constant type="cd:sectionnumber"/>
- <cd:constant type="cd:text"/>
+ <cd:constant type="numarsetiune"/>
+ <cd:constant type="text"/>
<cd:constant type="numarpagina"/>
<cd:constant type="tot"/>
+ <cd:constant type="niciunul"/>
</cd:parameter>
<cd:parameter name="inainte">
<cd:constant type="cd:command"/>
@@ -5142,6 +5175,11 @@
<cd:parameter name="latimemaxima">
<cd:constant type="cd:dimension"/>
</cd:parameter>
+ <cd:parameter name="order">
+ <cd:constant type="comanda"/>
+ <cd:constant type="tot"/>
+ <cd:constant type="normal"/>
+ </cd:parameter>
<cd:inherit name="seteazainconjurat" n="2"/>
</cd:assignments>
</cd:arguments>
@@ -6062,6 +6100,10 @@
<cd:constant type="da"/>
<cd:constant type="nu"/>
</cd:parameter>
+ <cd:parameter name="interactiune">
+ <cd:constant type="lista"/>
+ <cd:constant type="niciunul"/>
+ </cd:parameter>
<cd:inherit name="seteazatitluri" n="1"/>
</cd:assignments>
</cd:arguments>
@@ -6855,12 +6897,6 @@
<cd:parameter name="inaltime">
<cd:constant type="cd:dimension"/>
</cd:parameter>
- <cd:parameter name="voffset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
- <cd:parameter name="hoffset">
- <cd:constant type="cd:dimension"/>
- </cd:parameter>
<cd:parameter name="pagina">
<cd:constant type="stanga"/>
<cd:constant type="da"/>
@@ -8513,6 +8549,11 @@
<cd:parameter name="prefix">
<cd:constant type="cd:text"/>
</cd:parameter>
+ <cd:parameter name="interactiune">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ <!-- more will follow -->
+ </cd:parameter>
</cd:assignments>
</cd:arguments>
</cd:command>
@@ -9319,6 +9360,12 @@
<cd:constant type="cd:name"/>
<cd:constant type="tot"/>
</cd:keywords>
+ <cd:assignments n="3" optional="yes" list="yes">
+ <cd:parameter name="fortat">
+ <cd:constant type="da"/>
+ <cd:constant type="nu"/>
+ </cd:parameter>
+ </cd:assignments>
</cd:arguments>
</cd:command>
@@ -9587,7 +9634,7 @@
<cd:command name="comment" type="environment">
<cd:sequence>
- <cd:string value="comentariu"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -9601,7 +9648,7 @@
<cd:command name="comment">
<cd:sequence>
- <cd:string value="comentariu"/>
+ <cd:string value="comment"/>
</cd:sequence>
<cd:arguments>
<cd:keywords n="1" optional="yes">
@@ -10220,6 +10267,8 @@
</cd:arguments>
</cd:command>
+ <!-- mkii:
+
<cd:command name="definefontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="definestesinonimfont"/>
@@ -10248,6 +10297,33 @@
</cd:arguments>
</cd:command>
+ -->
+
+ <cd:command name="definefontsynonym" file="font-ini.tex">
+ <cd:sequence>
+ <cd:string value="definestesinonimfont"/>
+ </cd:sequence>
+ <cd:arguments>
+ <cd:keywords n="1">
+ <cd:constant type="cd:text"/>
+ </cd:keywords>
+ <cd:keywords n="2">
+ <cd:constant type="cd:name"/>
+ </cd:keywords>
+ <cd:assignments n="3" optional="yes">
+ <cd:parameter name="fallbacks">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="features">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ <cd:parameter name="goodies">
+ <cd:constant type="cd:name"/>
+ </cd:parameter>
+ </cd:assignments>
+ </cd:arguments>
+ </cd:command>
+
<cd:command name="setupfontsynonym" file="font-ini.tex">
<cd:sequence>
<cd:string value="setupfontsynonym"/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-cs.xml b/Master/texmf-dist/tex/context/interface/keys-cs.xml
index 93d81caa677..f91cc06f58d 100644
--- a/Master/texmf-dist/tex/context/interface/keys-cs.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-cs.xml
@@ -71,12 +71,14 @@
<cd:variable name='after' value='po'/>
<cd:variable name='all' value='vse'/>
<cd:variable name='always' value='vzdy'/>
+ <cd:variable name='and' value='and'/>
<cd:variable name='answerarea' value='answerarea'/>
<cd:variable name='appendices' value='dodatky'/>
<cd:variable name='appendix' value='dodatek'/>
<cd:variable name='april' value='duben'/>
<cd:variable name='atmargin' value='naokraji'/>
<cd:variable name='atpage' value='nastrance'/>
+ <cd:variable name='attachment' value='attachment'/>
<cd:variable name='august' value='srpen'/>
<cd:variable name='author' value='autor'/>
<cd:variable name='auto' value='auto'/>
@@ -93,6 +95,7 @@
<cd:variable name='bib' value='bib'/>
<cd:variable name='big' value='velke'/>
<cd:variable name='bigbodyfont' value='bigbodyfont'/>
+ <cd:variable name='bigger' value='bigger'/>
<cd:variable name='bigpreference' value='vysokapriorita'/>
<cd:variable name='blank' value='prazdny'/>
<cd:variable name='blockquote' value='blockquote'/>
@@ -127,6 +130,7 @@
<cd:variable name='content' value='obsah'/>
<cd:variable name='contents' value='obsah'/>
<cd:variable name='continue' value='pokracovat'/>
+ <cd:variable name='continued' value='continued'/>
<cd:variable name='controls' value='controls'/>
<cd:variable name='conversion' value='konverze'/>
<cd:variable name='current' value='aktualni'/>
@@ -144,6 +148,7 @@
<cd:variable name='down' value='down'/>
<cd:variable name='each' value='kazdy'/>
<cd:variable name='edge' value='hrana'/>
+ <cd:variable name='embed' value='embed'/>
<cd:variable name='empty' value='prazdne'/>
<cd:variable name='end' value='end'/>
<cd:variable name='endnote' value='endnote'/>
@@ -367,6 +372,7 @@
<cd:variable name='random' value='nahodny'/>
<cd:variable name='readonly' value='pouzeprocteni'/>
<cd:variable name='rectangular' value='pravouhly'/>
+ <cd:variable name='reference' value='odkaz'/>
<cd:variable name='referral' value='znacka'/>
<cd:variable name='register' value='rejstrik'/>
<cd:variable name='regular' value='pravidelne'/>
@@ -414,6 +420,7 @@
<cd:variable name='smallbolditalic' value='maletucnekurzivni'/>
<cd:variable name='smallboldslanted' value='maletucnesklonene'/>
<cd:variable name='smallcaps' value='kapitalky'/>
+ <cd:variable name='smaller' value='smaller'/>
<cd:variable name='smallitalic' value='malekurzivni'/>
<cd:variable name='smallitalicbold' value='malekurzivnitucne'/>
<cd:variable name='smallnormal' value='malenormalni'/>
@@ -525,6 +532,7 @@
<cd:constant name='after' value='po'/>
<cd:constant name='afterhead' value='pohlavicce'/>
<cd:constant name='afterkey' value='klavesapo'/>
+ <cd:constant name='aftersection' value='aftersection'/>
<cd:constant name='align' value='zarovnani'/>
<cd:constant name='aligncharacter' value='aligncharacter'/>
<cd:constant name='alignmentcharacter' value='alignmentcharacter'/>
@@ -544,6 +552,7 @@
<cd:constant name='authoretallimit' value='authoretallimit'/>
<cd:constant name='authoretaltext' value='authoretaltext'/>
<cd:constant name='auto' value='auto'/>
+ <cd:constant name='autocase' value='autocase'/>
<cd:constant name='autofile' value='autofile'/>
<cd:constant name='autofocus' value='autoostreni'/>
<cd:constant name='autohang' value='autohang'/>
@@ -557,10 +566,12 @@
<cd:constant name='backgroundoffset' value='offsetpozadi'/>
<cd:constant name='backgroundradius' value='polomerpozadi'/>
<cd:constant name='backgroundscreen' value='rastrpozadi'/>
+ <cd:constant name='backreference' value='backreference'/>
<cd:constant name='backspace' value='zpetnamezera'/>
<cd:constant name='balance' value='rovnovaha'/>
<cd:constant name='before' value='pred'/>
<cd:constant name='beforehead' value='predhlavickou'/>
+ <cd:constant name='beforesection' value='beforesection'/>
<cd:constant name='bet' value='bet'/>
<cd:constant name='big' value='velky'/>
<cd:constant name='blank' value='prazdny'/>
@@ -575,8 +586,10 @@
<cd:constant name='bottomoffset' value='offsetspodku'/>
<cd:constant name='bottomspace' value='bottomspace'/>
<cd:constant name='bottomstate' value='statusspodku'/>
+ <cd:constant name='buffer' value='buffer'/>
<cd:constant name='cache' value='cache'/>
<cd:constant name='calculate' value='pocitat'/>
+ <cd:constant name='category' value='category'/>
<cd:constant name='ccommand' value='cprikaz'/>
<cd:constant name='click' value='klik'/>
<cd:constant name='clickin' value='klikuvnitr'/>
@@ -584,6 +597,7 @@
<cd:constant name='clipoffset' value='clipoffset'/>
<cd:constant name='closeaction' value='zavriakci'/>
<cd:constant name='closecommand' value='closecommand'/>
+ <cd:constant name='closepage' value='closepage'/>
<cd:constant name='closepageaction' value='akcezavrenistranky'/>
<cd:constant name='closesymbol' value='closesymbol'/>
<cd:constant name='color' value='barva'/>
@@ -635,6 +649,7 @@
<cd:constant name='editoretallimit' value='editoretallimit'/>
<cd:constant name='editoretaltext' value='editoretaltext'/>
<cd:constant name='empty' value='prazdne'/>
+ <cd:constant name='entries' value='entries'/>
<cd:constant name='equalheight' value='equalheight'/>
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
@@ -659,6 +674,7 @@
<cd:constant name='footer' value='upati'/>
<cd:constant name='footerdistance' value='vzdalenostupati'/>
<cd:constant name='footerstate' value='statusupati'/>
+ <cd:constant name='force' value='sila'/>
<cd:constant name='foregroundcolor' value='foregroundcolor'/>
<cd:constant name='foregroundstyle' value='foregroundstyle'/>
<cd:constant name='format' value='formatovat'/>
@@ -705,11 +721,13 @@
<cd:constant name='intent' value='intent'/>
<cd:constant name='interaction' value='interakce'/>
<cd:constant name='interlinespace' value='meziradkovamezera'/>
+ <cd:constant name='internalgrid' value='internalgrid'/>
<cd:constant name='itemalign' value='itemalign'/>
<cd:constant name='items' value='polozky'/>
<cd:constant name='juniorsep' value='juniorsep'/>
<cd:constant name='ken' value='ken'/>
<cd:constant name='keyexpansion' value='keyexpansion'/>
+ <cd:constant name='keys' value='keys'/>
<cd:constant name='keyword' value='keyword'/>
<cd:constant name='label' value='popisek'/>
<cd:constant name='lastnamesep' value='lastnamesep'/>
@@ -752,6 +770,7 @@
<cd:constant name='margintext' value='textmarginalie'/>
<cd:constant name='marking' value='znaceni'/>
<cd:constant name='marstyle' value='stylsnacky'/>
+ <cd:constant name='mask' value='mask'/>
<cd:constant name='max' value='max'/>
<cd:constant name='maxdepth' value='maxdepth'/>
<cd:constant name='maxheight' value='maxvyska'/>
@@ -805,6 +824,7 @@
<cd:constant name='oddmargin' value='lichyokraj'/>
<cd:constant name='offset' value='offset'/>
<cd:constant name='openaction' value='otevriakci'/>
+ <cd:constant name='openpage' value='openpage'/>
<cd:constant name='openpageaction' value='akceotevrenistranky'/>
<cd:constant name='option' value='volba'/>
<cd:constant name='order' value='order'/>
@@ -857,6 +877,7 @@
<cd:constant name='previous' value='predchozi'/>
<cd:constant name='previousnumber' value='predchozicislo'/>
<cd:constant name='process' value='process'/>
+ <cd:constant name='profile' value='profile'/>
<cd:constant name='pubsep' value='pubsep'/>
<cd:constant name='radius' value='polomer'/>
<cd:constant name='random' value='nahodne'/>
@@ -950,6 +971,7 @@
<cd:constant name='sub' value='pod'/>
<cd:constant name='subtitle' value='podtitulek'/>
<cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='suffixseparator' value='suffixseparator'/>
<cd:constant name='surnamesep' value='surnamesep'/>
<cd:constant name='sx' value='sx'/>
<cd:constant name='sy' value='sy'/>
@@ -975,6 +997,7 @@
<cd:constant name='textstate' value='statustextu'/>
<cd:constant name='textstyle' value='styltextu'/>
<cd:constant name='textwidth' value='sirkatextu'/>
+ <cd:constant name='threshold' value='threshold'/>
<cd:constant name='title' value='titul'/>
<cd:constant name='titlecolor' value='barvatitulek'/>
<cd:constant name='titlecommand' value='titlecommand'/>
@@ -997,6 +1020,7 @@
<cd:constant name='urlalternative' value='urlalternativa'/>
<cd:constant name='urlspace' value='prostorurl'/>
<cd:constant name='validate' value='validovat'/>
+ <cd:constant name='values' value='values'/>
<cd:constant name='vcommand' value='vprikaz'/>
<cd:constant name='veroffset' value='offsethlavicky'/>
<cd:constant name='vfil' value='vfil'/>
@@ -1057,7 +1081,6 @@
<cd:command name='CAPPED' value='KAP'/>
<cd:command name='Character' value='Znak'/>
<cd:command name='Characters' value='Znaky'/>
- <cd:command name='LABELTEXT' value='TEXTPOPISKU'/>
<cd:command name='MONTH' value='MESIC'/>
<cd:command name='Numbers' value='Cisla'/>
<cd:command name='Romannumerals' value='Rimskecislice'/>
@@ -1096,7 +1119,6 @@
<cd:command name='colorbar' value='barevnalista'/>
<cd:command name='colorvalue' value='hodnotabarvy'/>
<cd:command name='column' value='sloupec'/>
- <cd:command name='comment' value='komentar'/>
<cd:command name='comparecolorgroup' value='porovnejskupinubarev'/>
<cd:command name='comparepalet' value='porovnejpaletu'/>
<cd:command name='completepagenumber' value='completepagenumber'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-de.xml b/Master/texmf-dist/tex/context/interface/keys-de.xml
index 4c60d2be495..9f01c61b43f 100644
--- a/Master/texmf-dist/tex/context/interface/keys-de.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-de.xml
@@ -71,12 +71,14 @@
<cd:variable name='after' value='nach'/>
<cd:variable name='all' value='alles'/>
<cd:variable name='always' value='immer'/>
+ <cd:variable name='and' value='und'/>
<cd:variable name='answerarea' value='answerarea'/>
<cd:variable name='appendices' value='anhaenge'/>
<cd:variable name='appendix' value='anhang'/>
<cd:variable name='april' value='April'/>
<cd:variable name='atmargin' value='amrand'/>
<cd:variable name='atpage' value='aufseite'/>
+ <cd:variable name='attachment' value='attachment'/>
<cd:variable name='august' value='August'/>
<cd:variable name='author' value='autor'/>
<cd:variable name='auto' value='auto'/>
@@ -93,6 +95,7 @@
<cd:variable name='bib' value='bib'/>
<cd:variable name='big' value='gross'/>
<cd:variable name='bigbodyfont' value='bigbodyfont'/>
+ <cd:variable name='bigger' value='bigger'/>
<cd:variable name='bigpreference' value='grosszuegig'/>
<cd:variable name='blank' value='blanko'/>
<cd:variable name='blockquote' value='blockquote'/>
@@ -127,6 +130,7 @@
<cd:variable name='content' value='inhalt'/>
<cd:variable name='contents' value='inhalte'/>
<cd:variable name='continue' value='fortsetzten'/>
+ <cd:variable name='continued' value='continued'/>
<cd:variable name='controls' value='controls'/>
<cd:variable name='conversion' value='konversion'/>
<cd:variable name='current' value='aktuell'/>
@@ -144,6 +148,7 @@
<cd:variable name='down' value='down'/>
<cd:variable name='each' value='jede'/>
<cd:variable name='edge' value='kante'/>
+ <cd:variable name='embed' value='embed'/>
<cd:variable name='empty' value='leer'/>
<cd:variable name='end' value='end'/>
<cd:variable name='endnote' value='endnote'/>
@@ -367,6 +372,7 @@
<cd:variable name='random' value='zufaellig'/>
<cd:variable name='readonly' value='nurlesbar'/>
<cd:variable name='rectangular' value='rechteckig'/>
+ <cd:variable name='reference' value='referenz'/>
<cd:variable name='referral' value='merkmal'/>
<cd:variable name='register' value='register'/>
<cd:variable name='regular' value='regular'/>
@@ -414,6 +420,7 @@
<cd:variable name='smallbolditalic' value='kleinfettitalic'/>
<cd:variable name='smallboldslanted' value='kleinfettgeneigt'/>
<cd:variable name='smallcaps' value='smallcaps'/>
+ <cd:variable name='smaller' value='smaller'/>
<cd:variable name='smallitalic' value='kleinitalic'/>
<cd:variable name='smallitalicbold' value='kleinitalicfett'/>
<cd:variable name='smallnormal' value='kleinnormal'/>
@@ -525,6 +532,7 @@
<cd:constant name='after' value='nach'/>
<cd:constant name='afterhead' value='nachkopf'/>
<cd:constant name='afterkey' value='nachtaste'/>
+ <cd:constant name='aftersection' value='aftersection'/>
<cd:constant name='align' value='ausrichtung'/>
<cd:constant name='aligncharacter' value='aligncharacter'/>
<cd:constant name='alignmentcharacter' value='alignmentcharacter'/>
@@ -544,6 +552,7 @@
<cd:constant name='authoretallimit' value='authoretallimit'/>
<cd:constant name='authoretaltext' value='authoretaltext'/>
<cd:constant name='auto' value='auto'/>
+ <cd:constant name='autocase' value='autocase'/>
<cd:constant name='autofile' value='autofile'/>
<cd:constant name='autofocus' value='autofocus'/>
<cd:constant name='autohang' value='autohang'/>
@@ -557,10 +566,12 @@
<cd:constant name='backgroundoffset' value='hintergrundoffset'/>
<cd:constant name='backgroundradius' value='hintergrundradius'/>
<cd:constant name='backgroundscreen' value='hintergrundraster'/>
+ <cd:constant name='backreference' value='backreference'/>
<cd:constant name='backspace' value='rumpfspatium'/>
<cd:constant name='balance' value='ausgleichen'/>
<cd:constant name='before' value='vor'/>
<cd:constant name='beforehead' value='vorkopf'/>
+ <cd:constant name='beforesection' value='beforesection'/>
<cd:constant name='bet' value='bet'/>
<cd:constant name='big' value='gross'/>
<cd:constant name='blank' value='blanko'/>
@@ -575,8 +586,10 @@
<cd:constant name='bottomoffset' value='untenoffset'/>
<cd:constant name='bottomspace' value='bottomspace'/>
<cd:constant name='bottomstate' value='untenstatus'/>
+ <cd:constant name='buffer' value='buffer'/>
<cd:constant name='cache' value='cache'/>
<cd:constant name='calculate' value='berechnen'/>
+ <cd:constant name='category' value='category'/>
<cd:constant name='ccommand' value='cbefehl'/>
<cd:constant name='click' value='klick'/>
<cd:constant name='clickin' value='klickin'/>
@@ -584,6 +597,7 @@
<cd:constant name='clipoffset' value='clipoffset'/>
<cd:constant name='closeaction' value='schliessenaktion'/>
<cd:constant name='closecommand' value='closecommand'/>
+ <cd:constant name='closepage' value='closepage'/>
<cd:constant name='closepageaction' value='closepageaction'/>
<cd:constant name='closesymbol' value='closesymbol'/>
<cd:constant name='color' value='farbe'/>
@@ -635,6 +649,7 @@
<cd:constant name='editoretallimit' value='editoretallimit'/>
<cd:constant name='editoretaltext' value='editoretaltext'/>
<cd:constant name='empty' value='leer'/>
+ <cd:constant name='entries' value='entries'/>
<cd:constant name='equalheight' value='equalheight'/>
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
@@ -659,6 +674,7 @@
<cd:constant name='footer' value='fusszeile'/>
<cd:constant name='footerdistance' value='fusszeilenabstand'/>
<cd:constant name='footerstate' value='fusszeilenstatus'/>
+ <cd:constant name='force' value='zwinge'/>
<cd:constant name='foregroundcolor' value='foregroundcolor'/>
<cd:constant name='foregroundstyle' value='foregroundstyle'/>
<cd:constant name='format' value='formatieren'/>
@@ -705,11 +721,13 @@
<cd:constant name='intent' value='intent'/>
<cd:constant name='interaction' value='interaktion'/>
<cd:constant name='interlinespace' value='zeilenabstande'/>
+ <cd:constant name='internalgrid' value='internalgrid'/>
<cd:constant name='itemalign' value='itemalign'/>
<cd:constant name='items' value='posten'/>
<cd:constant name='juniorsep' value='juniorsep'/>
<cd:constant name='ken' value='ken'/>
<cd:constant name='keyexpansion' value='keyexpansion'/>
+ <cd:constant name='keys' value='keys'/>
<cd:constant name='keyword' value='keyword'/>
<cd:constant name='label' value='label'/>
<cd:constant name='lastnamesep' value='lastnamesep'/>
@@ -752,6 +770,7 @@
<cd:constant name='margintext' value='marginaltext'/>
<cd:constant name='marking' value='beschriftung'/>
<cd:constant name='marstyle' value='beschrstil'/>
+ <cd:constant name='mask' value='mask'/>
<cd:constant name='max' value='max'/>
<cd:constant name='maxdepth' value='maxdepth'/>
<cd:constant name='maxheight' value='maxhoehe'/>
@@ -805,6 +824,7 @@
<cd:constant name='oddmargin' value='ungeraderand'/>
<cd:constant name='offset' value='offset'/>
<cd:constant name='openaction' value='oeffenaktion'/>
+ <cd:constant name='openpage' value='openpage'/>
<cd:constant name='openpageaction' value='openpageaction'/>
<cd:constant name='option' value='option'/>
<cd:constant name='order' value='order'/>
@@ -857,6 +877,7 @@
<cd:constant name='previous' value='vorige'/>
<cd:constant name='previousnumber' value='vorigenummer'/>
<cd:constant name='process' value='process'/>
+ <cd:constant name='profile' value='profile'/>
<cd:constant name='pubsep' value='pubsep'/>
<cd:constant name='radius' value='radius'/>
<cd:constant name='random' value='zufaellig'/>
@@ -950,6 +971,7 @@
<cd:constant name='sub' value='unter'/>
<cd:constant name='subtitle' value='untertitel'/>
<cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='suffixseparator' value='suffixseparator'/>
<cd:constant name='surnamesep' value='surnamesep'/>
<cd:constant name='sx' value='sx'/>
<cd:constant name='sy' value='sy'/>
@@ -975,6 +997,7 @@
<cd:constant name='textstate' value='textstatus'/>
<cd:constant name='textstyle' value='textstil'/>
<cd:constant name='textwidth' value='textbreite'/>
+ <cd:constant name='threshold' value='threshold'/>
<cd:constant name='title' value='titel'/>
<cd:constant name='titlecolor' value='titelfarbe'/>
<cd:constant name='titlecommand' value='titlecommand'/>
@@ -997,6 +1020,7 @@
<cd:constant name='urlalternative' value='urlalternative'/>
<cd:constant name='urlspace' value='urlspatium'/>
<cd:constant name='validate' value='validieren'/>
+ <cd:constant name='values' value='values'/>
<cd:constant name='vcommand' value='vbefehl'/>
<cd:constant name='veroffset' value='kopfoffset'/>
<cd:constant name='vfil' value='vfil'/>
@@ -1057,7 +1081,6 @@
<cd:command name='CAPPED' value='KAP'/>
<cd:command name='Character' value='Buchstabe'/>
<cd:command name='Characters' value='Buchstaben'/>
- <cd:command name='LABELTEXT' value='LABELTEXT'/>
<cd:command name='MONTH' value='MONAT'/>
<cd:command name='Numbers' value='Ziffern'/>
<cd:command name='Romannumerals' value='Roemischezahlen'/>
@@ -1096,7 +1119,6 @@
<cd:command name='colorbar' value='farbbalken'/>
<cd:command name='colorvalue' value='farbewert'/>
<cd:command name='column' value='spalte'/>
- <cd:command name='comment' value='kommentar'/>
<cd:command name='comparecolorgroup' value='vergleichefarbengruppe'/>
<cd:command name='comparepalet' value='vergleichepalette'/>
<cd:command name='completepagenumber' value='completepagenumber'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-en.xml b/Master/texmf-dist/tex/context/interface/keys-en.xml
index 26ee20ad313..b2954aa3a41 100644
--- a/Master/texmf-dist/tex/context/interface/keys-en.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-en.xml
@@ -71,12 +71,14 @@
<cd:variable name='after' value='after'/>
<cd:variable name='all' value='all'/>
<cd:variable name='always' value='always'/>
+ <cd:variable name='and' value='and'/>
<cd:variable name='answerarea' value='answerarea'/>
<cd:variable name='appendices' value='appendices'/>
<cd:variable name='appendix' value='appendix'/>
<cd:variable name='april' value='April'/>
<cd:variable name='atmargin' value='atmargin'/>
<cd:variable name='atpage' value='atpage'/>
+ <cd:variable name='attachment' value='attachment'/>
<cd:variable name='august' value='August'/>
<cd:variable name='author' value='author'/>
<cd:variable name='auto' value='auto'/>
@@ -93,6 +95,7 @@
<cd:variable name='bib' value='bib'/>
<cd:variable name='big' value='big'/>
<cd:variable name='bigbodyfont' value='bigbodyfont'/>
+ <cd:variable name='bigger' value='bigger'/>
<cd:variable name='bigpreference' value='bigpreference'/>
<cd:variable name='blank' value='blank'/>
<cd:variable name='blockquote' value='blockquote'/>
@@ -127,6 +130,7 @@
<cd:variable name='content' value='content'/>
<cd:variable name='contents' value='contents'/>
<cd:variable name='continue' value='continue'/>
+ <cd:variable name='continued' value='continued'/>
<cd:variable name='controls' value='controls'/>
<cd:variable name='conversion' value='conversion'/>
<cd:variable name='current' value='current'/>
@@ -144,6 +148,7 @@
<cd:variable name='down' value='down'/>
<cd:variable name='each' value='each'/>
<cd:variable name='edge' value='edge'/>
+ <cd:variable name='embed' value='embed'/>
<cd:variable name='empty' value='empty'/>
<cd:variable name='end' value='end'/>
<cd:variable name='endnote' value='endnote'/>
@@ -367,6 +372,7 @@
<cd:variable name='random' value='random'/>
<cd:variable name='readonly' value='readonly'/>
<cd:variable name='rectangular' value='rectangular'/>
+ <cd:variable name='reference' value='reference'/>
<cd:variable name='referral' value='referral'/>
<cd:variable name='register' value='register'/>
<cd:variable name='regular' value='regular'/>
@@ -414,6 +420,7 @@
<cd:variable name='smallbolditalic' value='smallbolditalic'/>
<cd:variable name='smallboldslanted' value='smallboldslanted'/>
<cd:variable name='smallcaps' value='smallcaps'/>
+ <cd:variable name='smaller' value='smaller'/>
<cd:variable name='smallitalic' value='smallitalic'/>
<cd:variable name='smallitalicbold' value='smallitalicbold'/>
<cd:variable name='smallnormal' value='smallnormal'/>
@@ -525,6 +532,7 @@
<cd:constant name='after' value='after'/>
<cd:constant name='afterhead' value='afterhead'/>
<cd:constant name='afterkey' value='afterkey'/>
+ <cd:constant name='aftersection' value='aftersection'/>
<cd:constant name='align' value='align'/>
<cd:constant name='aligncharacter' value='aligncharacter'/>
<cd:constant name='alignmentcharacter' value='alignmentcharacter'/>
@@ -544,6 +552,7 @@
<cd:constant name='authoretallimit' value='authoretallimit'/>
<cd:constant name='authoretaltext' value='authoretaltext'/>
<cd:constant name='auto' value='auto'/>
+ <cd:constant name='autocase' value='autocase'/>
<cd:constant name='autofile' value='autofile'/>
<cd:constant name='autofocus' value='autofocus'/>
<cd:constant name='autohang' value='autohang'/>
@@ -557,10 +566,12 @@
<cd:constant name='backgroundoffset' value='backgroundoffset'/>
<cd:constant name='backgroundradius' value='backgroundradius'/>
<cd:constant name='backgroundscreen' value='backgroundscreen'/>
+ <cd:constant name='backreference' value='backreference'/>
<cd:constant name='backspace' value='backspace'/>
<cd:constant name='balance' value='balance'/>
<cd:constant name='before' value='before'/>
<cd:constant name='beforehead' value='beforehead'/>
+ <cd:constant name='beforesection' value='beforesection'/>
<cd:constant name='bet' value='bet'/>
<cd:constant name='big' value='big'/>
<cd:constant name='blank' value='blank'/>
@@ -575,8 +586,10 @@
<cd:constant name='bottomoffset' value='bottomoffset'/>
<cd:constant name='bottomspace' value='bottomspace'/>
<cd:constant name='bottomstate' value='bottomstate'/>
+ <cd:constant name='buffer' value='buffer'/>
<cd:constant name='cache' value='cache'/>
<cd:constant name='calculate' value='calculate'/>
+ <cd:constant name='category' value='category'/>
<cd:constant name='ccommand' value='ccommand'/>
<cd:constant name='click' value='click'/>
<cd:constant name='clickin' value='clickin'/>
@@ -584,6 +597,7 @@
<cd:constant name='clipoffset' value='clipoffset'/>
<cd:constant name='closeaction' value='closeaction'/>
<cd:constant name='closecommand' value='closecommand'/>
+ <cd:constant name='closepage' value='closepage'/>
<cd:constant name='closepageaction' value='closepageaction'/>
<cd:constant name='closesymbol' value='closesymbol'/>
<cd:constant name='color' value='color'/>
@@ -635,6 +649,7 @@
<cd:constant name='editoretallimit' value='editoretallimit'/>
<cd:constant name='editoretaltext' value='editoretaltext'/>
<cd:constant name='empty' value='empty'/>
+ <cd:constant name='entries' value='entries'/>
<cd:constant name='equalheight' value='equalheight'/>
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
@@ -659,6 +674,7 @@
<cd:constant name='footer' value='footer'/>
<cd:constant name='footerdistance' value='footerdistance'/>
<cd:constant name='footerstate' value='footerstate'/>
+ <cd:constant name='force' value='force'/>
<cd:constant name='foregroundcolor' value='foregroundcolor'/>
<cd:constant name='foregroundstyle' value='foregroundstyle'/>
<cd:constant name='format' value='format'/>
@@ -705,11 +721,13 @@
<cd:constant name='intent' value='intent'/>
<cd:constant name='interaction' value='interaction'/>
<cd:constant name='interlinespace' value='interlinespace'/>
+ <cd:constant name='internalgrid' value='internalgrid'/>
<cd:constant name='itemalign' value='itemalign'/>
<cd:constant name='items' value='items'/>
<cd:constant name='juniorsep' value='juniorsep'/>
<cd:constant name='ken' value='ken'/>
<cd:constant name='keyexpansion' value='keyexpansion'/>
+ <cd:constant name='keys' value='keys'/>
<cd:constant name='keyword' value='keyword'/>
<cd:constant name='label' value='label'/>
<cd:constant name='lastnamesep' value='lastnamesep'/>
@@ -752,6 +770,7 @@
<cd:constant name='margintext' value='margintext'/>
<cd:constant name='marking' value='marking'/>
<cd:constant name='marstyle' value='marstyle'/>
+ <cd:constant name='mask' value='mask'/>
<cd:constant name='max' value='max'/>
<cd:constant name='maxdepth' value='maxdepth'/>
<cd:constant name='maxheight' value='maxheight'/>
@@ -805,6 +824,7 @@
<cd:constant name='oddmargin' value='oddmargin'/>
<cd:constant name='offset' value='offset'/>
<cd:constant name='openaction' value='openaction'/>
+ <cd:constant name='openpage' value='openpage'/>
<cd:constant name='openpageaction' value='openpageaction'/>
<cd:constant name='option' value='option'/>
<cd:constant name='order' value='order'/>
@@ -857,6 +877,7 @@
<cd:constant name='previous' value='previous'/>
<cd:constant name='previousnumber' value='previousnumber'/>
<cd:constant name='process' value='process'/>
+ <cd:constant name='profile' value='profile'/>
<cd:constant name='pubsep' value='pubsep'/>
<cd:constant name='radius' value='radius'/>
<cd:constant name='random' value='random'/>
@@ -950,6 +971,7 @@
<cd:constant name='sub' value='sub'/>
<cd:constant name='subtitle' value='subtitle'/>
<cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='suffixseparator' value='suffixseparator'/>
<cd:constant name='surnamesep' value='surnamesep'/>
<cd:constant name='sx' value='sx'/>
<cd:constant name='sy' value='sy'/>
@@ -975,6 +997,7 @@
<cd:constant name='textstate' value='textstate'/>
<cd:constant name='textstyle' value='textstyle'/>
<cd:constant name='textwidth' value='textwidth'/>
+ <cd:constant name='threshold' value='threshold'/>
<cd:constant name='title' value='title'/>
<cd:constant name='titlecolor' value='titlecolor'/>
<cd:constant name='titlecommand' value='titlecommand'/>
@@ -997,6 +1020,7 @@
<cd:constant name='urlalternative' value='urlalternative'/>
<cd:constant name='urlspace' value='urlspace'/>
<cd:constant name='validate' value='validate'/>
+ <cd:constant name='values' value='values'/>
<cd:constant name='vcommand' value='vcommand'/>
<cd:constant name='veroffset' value='veroffset'/>
<cd:constant name='vfil' value='vfil'/>
@@ -1057,7 +1081,6 @@
<cd:command name='CAPPED' value='CAP'/>
<cd:command name='Character' value='Character'/>
<cd:command name='Characters' value='Characters'/>
- <cd:command name='LABELTEXT' value='LABELTEXT'/>
<cd:command name='MONTH' value='MONTH'/>
<cd:command name='Numbers' value='Numbers'/>
<cd:command name='Romannumerals' value='Romannumerals'/>
@@ -1096,7 +1119,6 @@
<cd:command name='colorbar' value='colorbar'/>
<cd:command name='colorvalue' value='colorvalue'/>
<cd:command name='column' value='column'/>
- <cd:command name='comment' value='comment'/>
<cd:command name='comparecolorgroup' value='comparecolorgroup'/>
<cd:command name='comparepalet' value='comparepalet'/>
<cd:command name='completepagenumber' value='completepagenumber'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-fr.xml b/Master/texmf-dist/tex/context/interface/keys-fr.xml
index ba648336512..bcb18fca16a 100644
--- a/Master/texmf-dist/tex/context/interface/keys-fr.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-fr.xml
@@ -71,13 +71,15 @@
<cd:variable name='after' value='apres'/>
<cd:variable name='all' value='tout'/>
<cd:variable name='always' value='toujours'/>
+ <cd:variable name='and' value='and'/>
<cd:variable name='answerarea' value='answerarea'/>
<cd:variable name='appendices' value='annexes'/>
<cd:variable name='appendix' value='annexe'/>
<cd:variable name='april' value='avril'/>
<cd:variable name='atmargin' value='alamarge'/>
<cd:variable name='atpage' value='alapage'/>
- <cd:variable name='august' value='aout'/>
+ <cd:variable name='attachment' value='attachment'/>
+ <cd:variable name='august' value='août'/>
<cd:variable name='author' value='auteur'/>
<cd:variable name='auto' value='auto'/>
<cd:variable name='autointro' value='autointro'/>
@@ -93,6 +95,7 @@
<cd:variable name='bib' value='bib'/>
<cd:variable name='big' value='grand'/>
<cd:variable name='bigbodyfont' value='grandepolicecorp'/>
+ <cd:variable name='bigger' value='bigger'/>
<cd:variable name='bigpreference' value='grandepreference'/>
<cd:variable name='blank' value='vide'/>
<cd:variable name='blockquote' value='blockquote'/>
@@ -127,6 +130,7 @@
<cd:variable name='content' value='contenu'/>
<cd:variable name='contents' value='contenus'/>
<cd:variable name='continue' value='continue'/>
+ <cd:variable name='continued' value='continued'/>
<cd:variable name='controls' value='controles'/>
<cd:variable name='conversion' value='conversion'/>
<cd:variable name='current' value='courant'/>
@@ -144,6 +148,7 @@
<cd:variable name='down' value='down'/>
<cd:variable name='each' value='chaque'/>
<cd:variable name='edge' value='bord'/>
+ <cd:variable name='embed' value='embed'/>
<cd:variable name='empty' value='vide'/>
<cd:variable name='end' value='end'/>
<cd:variable name='endnote' value='notefin'/>
@@ -367,6 +372,7 @@
<cd:variable name='random' value='aleatoire'/>
<cd:variable name='readonly' value='lectureseule'/>
<cd:variable name='rectangular' value='rectangulaire'/>
+ <cd:variable name='reference' value='reference'/>
<cd:variable name='referral' value='referral'/>
<cd:variable name='register' value='registre'/>
<cd:variable name='regular' value='regulier'/>
@@ -414,6 +420,7 @@
<cd:variable name='smallbolditalic' value='italiquegraspetit'/>
<cd:variable name='smallboldslanted' value='inclinegraspetit'/>
<cd:variable name='smallcaps' value='petitescapitales'/>
+ <cd:variable name='smaller' value='smaller'/>
<cd:variable name='smallitalic' value='italiquepetit'/>
<cd:variable name='smallitalicbold' value='grasitaliquepetit'/>
<cd:variable name='smallnormal' value='normalpetit'/>
@@ -525,6 +532,7 @@
<cd:constant name='after' value='apres'/>
<cd:constant name='afterhead' value='aprestete'/>
<cd:constant name='afterkey' value='aprescle'/>
+ <cd:constant name='aftersection' value='aftersection'/>
<cd:constant name='align' value='alignement'/>
<cd:constant name='aligncharacter' value='caracterealigne'/>
<cd:constant name='alignmentcharacter' value='alignementcaractere'/>
@@ -544,6 +552,7 @@
<cd:constant name='authoretallimit' value='authoretallimit'/>
<cd:constant name='authoretaltext' value='authoretaltext'/>
<cd:constant name='auto' value='auto'/>
+ <cd:constant name='autocase' value='autocase'/>
<cd:constant name='autofile' value='autofile'/>
<cd:constant name='autofocus' value='autofocus'/>
<cd:constant name='autohang' value='autohang'/>
@@ -557,10 +566,12 @@
<cd:constant name='backgroundoffset' value='decalagearriereplan'/>
<cd:constant name='backgroundradius' value='rayonarriereplan'/>
<cd:constant name='backgroundscreen' value='ecranarriereplan'/>
+ <cd:constant name='backreference' value='backreference'/>
<cd:constant name='backspace' value='retour'/>
<cd:constant name='balance' value='equilibre'/>
<cd:constant name='before' value='avant'/>
<cd:constant name='beforehead' value='avanttete'/>
+ <cd:constant name='beforesection' value='beforesection'/>
<cd:constant name='bet' value='bet'/>
<cd:constant name='big' value='grand'/>
<cd:constant name='blank' value='vide'/>
@@ -575,8 +586,10 @@
<cd:constant name='bottomoffset' value='decalageinf'/>
<cd:constant name='bottomspace' value='espaceinf'/>
<cd:constant name='bottomstate' value='etatinf'/>
+ <cd:constant name='buffer' value='buffer'/>
<cd:constant name='cache' value='cache'/>
<cd:constant name='calculate' value='calculer'/>
+ <cd:constant name='category' value='category'/>
<cd:constant name='ccommand' value='ccommande'/>
<cd:constant name='click' value='clic'/>
<cd:constant name='clickin' value='clicinterieur'/>
@@ -584,6 +597,7 @@
<cd:constant name='clipoffset' value='clipoffset'/>
<cd:constant name='closeaction' value='actionfermeture'/>
<cd:constant name='closecommand' value='closecommand'/>
+ <cd:constant name='closepage' value='closepage'/>
<cd:constant name='closepageaction' value='actionfermeturepage'/>
<cd:constant name='closesymbol' value='closesymbol'/>
<cd:constant name='color' value='couleur'/>
@@ -635,6 +649,7 @@
<cd:constant name='editoretallimit' value='editoretallimit'/>
<cd:constant name='editoretaltext' value='editoretaltext'/>
<cd:constant name='empty' value='vide'/>
+ <cd:constant name='entries' value='entries'/>
<cd:constant name='equalheight' value='equalheight'/>
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
@@ -659,6 +674,7 @@
<cd:constant name='footer' value='pdp'/>
<cd:constant name='footerdistance' value='dsitancepdp'/>
<cd:constant name='footerstate' value='etatpdp'/>
+ <cd:constant name='force' value='force'/>
<cd:constant name='foregroundcolor' value='couleurpremierplan'/>
<cd:constant name='foregroundstyle' value='stylepremierplan'/>
<cd:constant name='format' value='formatter'/>
@@ -705,11 +721,13 @@
<cd:constant name='intent' value='intent'/>
<cd:constant name='interaction' value='interaction'/>
<cd:constant name='interlinespace' value='espaceinterligne'/>
+ <cd:constant name='internalgrid' value='internalgrid'/>
<cd:constant name='itemalign' value='itemalign'/>
<cd:constant name='items' value='elements'/>
<cd:constant name='juniorsep' value='juniorsep'/>
<cd:constant name='ken' value='ken'/>
<cd:constant name='keyexpansion' value='keyexpansion'/>
+ <cd:constant name='keys' value='keys'/>
<cd:constant name='keyword' value='motcle'/>
<cd:constant name='label' value='etiquette'/>
<cd:constant name='lastnamesep' value='lastnamesep'/>
@@ -752,6 +770,7 @@
<cd:constant name='margintext' value='textemarge'/>
<cd:constant name='marking' value='marquage'/>
<cd:constant name='marstyle' value='stylemarquage'/>
+ <cd:constant name='mask' value='mask'/>
<cd:constant name='max' value='max'/>
<cd:constant name='maxdepth' value='maxdepth'/>
<cd:constant name='maxheight' value='hauteurmax'/>
@@ -805,6 +824,7 @@
<cd:constant name='oddmargin' value='margepaire'/>
<cd:constant name='offset' value='offset'/>
<cd:constant name='openaction' value='actionouverture'/>
+ <cd:constant name='openpage' value='openpage'/>
<cd:constant name='openpageaction' value='actionouverturepage'/>
<cd:constant name='option' value='option'/>
<cd:constant name='order' value='order'/>
@@ -857,6 +877,7 @@
<cd:constant name='previous' value='precedent'/>
<cd:constant name='previousnumber' value='numeroprecedent'/>
<cd:constant name='process' value='process'/>
+ <cd:constant name='profile' value='profile'/>
<cd:constant name='pubsep' value='pubsep'/>
<cd:constant name='radius' value='rayon'/>
<cd:constant name='random' value='aleatoire'/>
@@ -950,6 +971,7 @@
<cd:constant name='sub' value='sous'/>
<cd:constant name='subtitle' value='soustitre'/>
<cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='suffixseparator' value='suffixseparator'/>
<cd:constant name='surnamesep' value='surnamesep'/>
<cd:constant name='sx' value='sx'/>
<cd:constant name='sy' value='sy'/>
@@ -975,6 +997,7 @@
<cd:constant name='textstate' value='etattexte'/>
<cd:constant name='textstyle' value='styletexte'/>
<cd:constant name='textwidth' value='largeurtexte'/>
+ <cd:constant name='threshold' value='threshold'/>
<cd:constant name='title' value='titre'/>
<cd:constant name='titlecolor' value='couleurtitre'/>
<cd:constant name='titlecommand' value='titlecommand'/>
@@ -997,6 +1020,7 @@
<cd:constant name='urlalternative' value='alternativeurl'/>
<cd:constant name='urlspace' value='espaceurl'/>
<cd:constant name='validate' value='valider'/>
+ <cd:constant name='values' value='values'/>
<cd:constant name='vcommand' value='vcommande'/>
<cd:constant name='veroffset' value='veroffset'/>
<cd:constant name='vfil' value='vfil'/>
@@ -1057,7 +1081,6 @@
<cd:command name='CAPPED' value='CAP'/>
<cd:command name='Character' value='Caractere'/>
<cd:command name='Characters' value='Caracteres'/>
- <cd:command name='LABELTEXT' value='LABELTEXTE'/>
<cd:command name='MONTH' value='MOIS'/>
<cd:command name='Numbers' value='Numeros'/>
<cd:command name='Romannumerals' value='Chiffresromains'/>
@@ -1096,7 +1119,6 @@
<cd:command name='colorbar' value='barrecouleur'/>
<cd:command name='colorvalue' value='valeurcouleur'/>
<cd:command name='column' value='colonne'/>
- <cd:command name='comment' value='commentaire'/>
<cd:command name='comparecolorgroup' value='comparegroupecouleur'/>
<cd:command name='comparepalet' value='comparepalette'/>
<cd:command name='completepagenumber' value='completenumeropage'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-it.xml b/Master/texmf-dist/tex/context/interface/keys-it.xml
index 098aba8992b..0a156e8425e 100644
--- a/Master/texmf-dist/tex/context/interface/keys-it.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-it.xml
@@ -71,12 +71,14 @@
<cd:variable name='after' value='dopo'/>
<cd:variable name='all' value='tutti'/>
<cd:variable name='always' value='sempre'/>
+ <cd:variable name='and' value='and'/>
<cd:variable name='answerarea' value='answerarea'/>
<cd:variable name='appendices' value='appendici'/>
<cd:variable name='appendix' value='appendice'/>
<cd:variable name='april' value='aprile'/>
<cd:variable name='atmargin' value='almargine'/>
<cd:variable name='atpage' value='apagina'/>
+ <cd:variable name='attachment' value='attachment'/>
<cd:variable name='august' value='agosto'/>
<cd:variable name='author' value='autore'/>
<cd:variable name='auto' value='auto'/>
@@ -93,6 +95,7 @@
<cd:variable name='bib' value='bib'/>
<cd:variable name='big' value='grande'/>
<cd:variable name='bigbodyfont' value='grossofontdeltesto'/>
+ <cd:variable name='bigger' value='bigger'/>
<cd:variable name='bigpreference' value='grandepreferenza'/>
<cd:variable name='blank' value='rigovuoto'/>
<cd:variable name='blockquote' value='blockquote'/>
@@ -127,6 +130,7 @@
<cd:variable name='content' value='indice'/>
<cd:variable name='contents' value='indici'/>
<cd:variable name='continue' value='continua'/>
+ <cd:variable name='continued' value='continued'/>
<cd:variable name='controls' value='controlli'/>
<cd:variable name='conversion' value='coversione'/>
<cd:variable name='current' value='corrente'/>
@@ -144,6 +148,7 @@
<cd:variable name='down' value='down'/>
<cd:variable name='each' value='ogni'/>
<cd:variable name='edge' value='bordo'/>
+ <cd:variable name='embed' value='embed'/>
<cd:variable name='empty' value='vuoto'/>
<cd:variable name='end' value='end'/>
<cd:variable name='endnote' value='endnote'/>
@@ -367,6 +372,7 @@
<cd:variable name='random' value='casuale'/>
<cd:variable name='readonly' value='solalettura'/>
<cd:variable name='rectangular' value='rettangolare'/>
+ <cd:variable name='reference' value='riferimento'/>
<cd:variable name='referral' value='referral'/>
<cd:variable name='register' value='registro'/>
<cd:variable name='regular' value='regolare'/>
@@ -414,6 +420,7 @@
<cd:variable name='smallbolditalic' value='piccolograssettocorsivo'/>
<cd:variable name='smallboldslanted' value='piccolograssettoinclinato'/>
<cd:variable name='smallcaps' value='maiuscoletto'/>
+ <cd:variable name='smaller' value='smaller'/>
<cd:variable name='smallitalic' value='piccolocorsivo'/>
<cd:variable name='smallitalicbold' value='piccolocorsivograssetto'/>
<cd:variable name='smallnormal' value='piccolonormale'/>
@@ -525,6 +532,7 @@
<cd:constant name='after' value='dopo'/>
<cd:constant name='afterhead' value='dopotesta'/>
<cd:constant name='afterkey' value='dopotasto'/>
+ <cd:constant name='aftersection' value='aftersection'/>
<cd:constant name='align' value='allinea'/>
<cd:constant name='aligncharacter' value='allineacarattere'/>
<cd:constant name='alignmentcharacter' value='carattereallineamento'/>
@@ -544,6 +552,7 @@
<cd:constant name='authoretallimit' value='authoretallimit'/>
<cd:constant name='authoretaltext' value='authoretaltext'/>
<cd:constant name='auto' value='auto'/>
+ <cd:constant name='autocase' value='autocase'/>
<cd:constant name='autofile' value='autofile'/>
<cd:constant name='autofocus' value='autofocus'/>
<cd:constant name='autohang' value='autohang'/>
@@ -557,10 +566,12 @@
<cd:constant name='backgroundoffset' value='offsetsfondo'/>
<cd:constant name='backgroundradius' value='raggiosfondo'/>
<cd:constant name='backgroundscreen' value='schermosfondo'/>
+ <cd:constant name='backreference' value='backreference'/>
<cd:constant name='backspace' value='backspace'/>
<cd:constant name='balance' value='bilanciamento'/>
<cd:constant name='before' value='prima'/>
<cd:constant name='beforehead' value='primaditesta'/>
+ <cd:constant name='beforesection' value='beforesection'/>
<cd:constant name='bet' value='bet'/>
<cd:constant name='big' value='grande'/>
<cd:constant name='blank' value='rigovuoto'/>
@@ -575,8 +586,10 @@
<cd:constant name='bottomoffset' value='offsetfondo'/>
<cd:constant name='bottomspace' value='spaziofondo'/>
<cd:constant name='bottomstate' value='statofondo'/>
+ <cd:constant name='buffer' value='buffer'/>
<cd:constant name='cache' value='cache'/>
<cd:constant name='calculate' value='calcola'/>
+ <cd:constant name='category' value='category'/>
<cd:constant name='ccommand' value='ccomando'/>
<cd:constant name='click' value='click'/>
<cd:constant name='clickin' value='clickdentro'/>
@@ -584,6 +597,7 @@
<cd:constant name='clipoffset' value='clipoffset'/>
<cd:constant name='closeaction' value='azionechiudi'/>
<cd:constant name='closecommand' value='closecommand'/>
+ <cd:constant name='closepage' value='closepage'/>
<cd:constant name='closepageaction' value='azionechiudipagina'/>
<cd:constant name='closesymbol' value='closesymbol'/>
<cd:constant name='color' value='colore'/>
@@ -635,6 +649,7 @@
<cd:constant name='editoretallimit' value='editoretallimit'/>
<cd:constant name='editoretaltext' value='editoretaltext'/>
<cd:constant name='empty' value='vuoto'/>
+ <cd:constant name='entries' value='entries'/>
<cd:constant name='equalheight' value='equalheight'/>
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
@@ -659,6 +674,7 @@
<cd:constant name='footer' value='piedipagina'/>
<cd:constant name='footerdistance' value='distanzapdp'/>
<cd:constant name='footerstate' value='statopdp'/>
+ <cd:constant name='force' value='forza'/>
<cd:constant name='foregroundcolor' value='coloreprimopiano'/>
<cd:constant name='foregroundstyle' value='foregroundstyle'/>
<cd:constant name='format' value='format'/>
@@ -705,11 +721,13 @@
<cd:constant name='intent' value='intent'/>
<cd:constant name='interaction' value='interazione'/>
<cd:constant name='interlinespace' value='interlinea'/>
+ <cd:constant name='internalgrid' value='internalgrid'/>
<cd:constant name='itemalign' value='itemalign'/>
<cd:constant name='items' value='elementi'/>
<cd:constant name='juniorsep' value='juniorsep'/>
<cd:constant name='ken' value='ken'/>
<cd:constant name='keyexpansion' value='keyexpansion'/>
+ <cd:constant name='keys' value='keys'/>
<cd:constant name='keyword' value='parolachiave'/>
<cd:constant name='label' value='etichetta'/>
<cd:constant name='lastnamesep' value='lastnamesep'/>
@@ -752,6 +770,7 @@
<cd:constant name='margintext' value='testomargine'/>
<cd:constant name='marking' value='marcatura'/>
<cd:constant name='marstyle' value='stilemarcatura'/>
+ <cd:constant name='mask' value='mask'/>
<cd:constant name='max' value='max'/>
<cd:constant name='maxdepth' value='maxdepth'/>
<cd:constant name='maxheight' value='altezzamax'/>
@@ -805,6 +824,7 @@
<cd:constant name='oddmargin' value='marginedispari'/>
<cd:constant name='offset' value='offset'/>
<cd:constant name='openaction' value='azioneapri'/>
+ <cd:constant name='openpage' value='openpage'/>
<cd:constant name='openpageaction' value='azioneapripagina'/>
<cd:constant name='option' value='opzione'/>
<cd:constant name='order' value='order'/>
@@ -857,6 +877,7 @@
<cd:constant name='previous' value='precedente'/>
<cd:constant name='previousnumber' value='numeroprecedente'/>
<cd:constant name='process' value='process'/>
+ <cd:constant name='profile' value='profile'/>
<cd:constant name='pubsep' value='pubsep'/>
<cd:constant name='radius' value='raggio'/>
<cd:constant name='random' value='casuale'/>
@@ -950,6 +971,7 @@
<cd:constant name='sub' value='sotto'/>
<cd:constant name='subtitle' value='sottotitolo'/>
<cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='suffixseparator' value='suffixseparator'/>
<cd:constant name='surnamesep' value='surnamesep'/>
<cd:constant name='sx' value='sx'/>
<cd:constant name='sy' value='sy'/>
@@ -975,6 +997,7 @@
<cd:constant name='textstate' value='statotesto'/>
<cd:constant name='textstyle' value='stiletesto'/>
<cd:constant name='textwidth' value='ampiezzatesto'/>
+ <cd:constant name='threshold' value='threshold'/>
<cd:constant name='title' value='titolo'/>
<cd:constant name='titlecolor' value='coloretitolo'/>
<cd:constant name='titlecommand' value='titlecommand'/>
@@ -997,6 +1020,7 @@
<cd:constant name='urlalternative' value='alternativaurl'/>
<cd:constant name='urlspace' value='spaziourl'/>
<cd:constant name='validate' value='verifica'/>
+ <cd:constant name='values' value='values'/>
<cd:constant name='vcommand' value='vcomando'/>
<cd:constant name='veroffset' value='veroffset'/>
<cd:constant name='vfil' value='vfil'/>
@@ -1057,7 +1081,6 @@
<cd:command name='CAPPED' value='CAP'/>
<cd:command name='Character' value='Lettera'/>
<cd:command name='Characters' value='Lettere'/>
- <cd:command name='LABELTEXT' value='TESTOETICHETTA'/>
<cd:command name='MONTH' value='MESE'/>
<cd:command name='Numbers' value='Numeri'/>
<cd:command name='Romannumerals' value='Numeriromani'/>
@@ -1096,7 +1119,6 @@
<cd:command name='colorbar' value='barracolori'/>
<cd:command name='colorvalue' value='valorecolore'/>
<cd:command name='column' value='colonna'/>
- <cd:command name='comment' value='commento'/>
<cd:command name='comparecolorgroup' value='confrontagruppocolori'/>
<cd:command name='comparepalet' value='confrontatavolozza'/>
<cd:command name='completepagenumber' value='numeropaginacompleto'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-nl.xml b/Master/texmf-dist/tex/context/interface/keys-nl.xml
index d9eb3341011..eb156cf5a50 100644
--- a/Master/texmf-dist/tex/context/interface/keys-nl.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-nl.xml
@@ -71,12 +71,14 @@
<cd:variable name='after' value='na'/>
<cd:variable name='all' value='alles'/>
<cd:variable name='always' value='altijd'/>
+ <cd:variable name='and' value='en'/>
<cd:variable name='answerarea' value='antwoordgebied'/>
<cd:variable name='appendices' value='bijlagen'/>
<cd:variable name='appendix' value='bijlage'/>
<cd:variable name='april' value='april'/>
<cd:variable name='atmargin' value='opmarge'/>
<cd:variable name='atpage' value='oppagina'/>
+ <cd:variable name='attachment' value='aanhangsel'/>
<cd:variable name='august' value='augustus'/>
<cd:variable name='author' value='auteur'/>
<cd:variable name='auto' value='auto'/>
@@ -93,6 +95,7 @@
<cd:variable name='bib' value='bib'/>
<cd:variable name='big' value='groot'/>
<cd:variable name='bigbodyfont' value='grootkorps'/>
+ <cd:variable name='bigger' value='groter'/>
<cd:variable name='bigpreference' value='grotevoorkeur'/>
<cd:variable name='blank' value='blanko'/>
<cd:variable name='blockquote' value='blokcitaat'/>
@@ -127,6 +130,7 @@
<cd:variable name='content' value='inhoud'/>
<cd:variable name='contents' value='inhouden'/>
<cd:variable name='continue' value='verder'/>
+ <cd:variable name='continued' value='vervolgd'/>
<cd:variable name='controls' value='sturing'/>
<cd:variable name='conversion' value='conversie'/>
<cd:variable name='current' value='huidige'/>
@@ -144,6 +148,7 @@
<cd:variable name='down' value='omlaag'/>
<cd:variable name='each' value='elk'/>
<cd:variable name='edge' value='rand'/>
+ <cd:variable name='embed' value='sluitin'/>
<cd:variable name='empty' value='leeg'/>
<cd:variable name='end' value='eind'/>
<cd:variable name='endnote' value='eindnoot'/>
@@ -367,6 +372,7 @@
<cd:variable name='random' value='willekeurig'/>
<cd:variable name='readonly' value='alleenleesbaar'/>
<cd:variable name='rectangular' value='recht'/>
+ <cd:variable name='reference' value='referentie'/>
<cd:variable name='referral' value='kenmerk'/>
<cd:variable name='register' value='register'/>
<cd:variable name='regular' value='regular'/>
@@ -414,6 +420,7 @@
<cd:variable name='smallbolditalic' value='kleinvetitalic'/>
<cd:variable name='smallboldslanted' value='kleinvetschuin'/>
<cd:variable name='smallcaps' value='smallcaps'/>
+ <cd:variable name='smaller' value='kleiner'/>
<cd:variable name='smallitalic' value='kleinitalic'/>
<cd:variable name='smallitalicbold' value='kleinitalicvet'/>
<cd:variable name='smallnormal' value='kleinnormaal'/>
@@ -525,6 +532,7 @@
<cd:constant name='after' value='na'/>
<cd:constant name='afterhead' value='kopna'/>
<cd:constant name='afterkey' value='natoets'/>
+ <cd:constant name='aftersection' value='nasectie'/>
<cd:constant name='align' value='uitlijnen'/>
<cd:constant name='aligncharacter' value='karakteruitlijnen'/>
<cd:constant name='alignmentcharacter' value='uitlijnkarakter'/>
@@ -544,6 +552,7 @@
<cd:constant name='authoretallimit' value='authoretallimit'/>
<cd:constant name='authoretaltext' value='authoretaltext'/>
<cd:constant name='auto' value='auto'/>
+ <cd:constant name='autocase' value='autocase'/>
<cd:constant name='autofile' value='autofile'/>
<cd:constant name='autofocus' value='autofocus'/>
<cd:constant name='autohang' value='autohang'/>
@@ -557,10 +566,12 @@
<cd:constant name='backgroundoffset' value='achtergrondoffset'/>
<cd:constant name='backgroundradius' value='achtergrondstraal'/>
<cd:constant name='backgroundscreen' value='achtergrondraster'/>
+ <cd:constant name='backreference' value='terugreferentie'/>
<cd:constant name='backspace' value='rugwit'/>
<cd:constant name='balance' value='balanceren'/>
<cd:constant name='before' value='voor'/>
<cd:constant name='beforehead' value='kopvoor'/>
+ <cd:constant name='beforesection' value='voorsectie'/>
<cd:constant name='bet' value='bet'/>
<cd:constant name='big' value='groot'/>
<cd:constant name='blank' value='blanko'/>
@@ -575,8 +586,10 @@
<cd:constant name='bottomoffset' value='onderoffset'/>
<cd:constant name='bottomspace' value='bodemwit'/>
<cd:constant name='bottomstate' value='onderstatus'/>
+ <cd:constant name='buffer' value='buffer'/>
<cd:constant name='cache' value='cache'/>
<cd:constant name='calculate' value='bereken'/>
+ <cd:constant name='category' value='categorie'/>
<cd:constant name='ccommand' value='ccommando'/>
<cd:constant name='click' value='klik'/>
<cd:constant name='clickin' value='klikin'/>
@@ -584,6 +597,7 @@
<cd:constant name='clipoffset' value='clipoffset'/>
<cd:constant name='closeaction' value='sluitactie'/>
<cd:constant name='closecommand' value='sluitcommando'/>
+ <cd:constant name='closepage' value='sluitpagina'/>
<cd:constant name='closepageaction' value='sluitpaginaactie'/>
<cd:constant name='closesymbol' value='sluitsymbool'/>
<cd:constant name='color' value='kleur'/>
@@ -635,6 +649,7 @@
<cd:constant name='editoretallimit' value='editoretallimit'/>
<cd:constant name='editoretaltext' value='editoretaltext'/>
<cd:constant name='empty' value='leeg'/>
+ <cd:constant name='entries' value='ingangen'/>
<cd:constant name='equalheight' value='equalheight'/>
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
@@ -659,6 +674,7 @@
<cd:constant name='footer' value='voet'/>
<cd:constant name='footerdistance' value='voetafstand'/>
<cd:constant name='footerstate' value='voetstatus'/>
+ <cd:constant name='force' value='forceer'/>
<cd:constant name='foregroundcolor' value='voorgrondkleur'/>
<cd:constant name='foregroundstyle' value='voorgrondletter'/>
<cd:constant name='format' value='formatteer'/>
@@ -705,11 +721,13 @@
<cd:constant name='intent' value='intent'/>
<cd:constant name='interaction' value='interactie'/>
<cd:constant name='interlinespace' value='interlinie'/>
+ <cd:constant name='internalgrid' value='interngrid'/>
<cd:constant name='itemalign' value='itemuitlijnen'/>
<cd:constant name='items' value='items'/>
<cd:constant name='juniorsep' value='juniorsep'/>
<cd:constant name='ken' value='ken'/>
<cd:constant name='keyexpansion' value='sleutelexpansie'/>
+ <cd:constant name='keys' value='sleutels'/>
<cd:constant name='keyword' value='trefwoord'/>
<cd:constant name='label' value='label'/>
<cd:constant name='lastnamesep' value='lastnamesep'/>
@@ -752,6 +770,7 @@
<cd:constant name='margintext' value='margetekst'/>
<cd:constant name='marking' value='markering'/>
<cd:constant name='marstyle' value='marletter'/>
+ <cd:constant name='mask' value='masker'/>
<cd:constant name='max' value='max'/>
<cd:constant name='maxdepth' value='maxdepth'/>
<cd:constant name='maxheight' value='maxhoogte'/>
@@ -805,6 +824,7 @@
<cd:constant name='oddmargin' value='onevenmarge'/>
<cd:constant name='offset' value='offset'/>
<cd:constant name='openaction' value='openactie'/>
+ <cd:constant name='openpage' value='openpagina'/>
<cd:constant name='openpageaction' value='openpaginaactie'/>
<cd:constant name='option' value='optie'/>
<cd:constant name='order' value='order'/>
@@ -857,6 +877,7 @@
<cd:constant name='previous' value='vorige'/>
<cd:constant name='previousnumber' value='vorigenummer'/>
<cd:constant name='process' value='proces'/>
+ <cd:constant name='profile' value='profile'/>
<cd:constant name='pubsep' value='pubsep'/>
<cd:constant name='radius' value='straal'/>
<cd:constant name='random' value='willekeur'/>
@@ -950,6 +971,7 @@
<cd:constant name='sub' value='sub'/>
<cd:constant name='subtitle' value='subtitel'/>
<cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='suffixseparator' value='suffixscheider'/>
<cd:constant name='surnamesep' value='surnamesep'/>
<cd:constant name='sx' value='sx'/>
<cd:constant name='sy' value='sy'/>
@@ -975,6 +997,7 @@
<cd:constant name='textstate' value='tekststatus'/>
<cd:constant name='textstyle' value='tekstletter'/>
<cd:constant name='textwidth' value='tekstbreedte'/>
+ <cd:constant name='threshold' value='threshold'/>
<cd:constant name='title' value='titel'/>
<cd:constant name='titlecolor' value='titelkleur'/>
<cd:constant name='titlecommand' value='titelcommando'/>
@@ -997,6 +1020,7 @@
<cd:constant name='urlalternative' value='urlvariant'/>
<cd:constant name='urlspace' value='urlspatie'/>
<cd:constant name='validate' value='valideer'/>
+ <cd:constant name='values' value='waarden'/>
<cd:constant name='vcommand' value='vcommando'/>
<cd:constant name='veroffset' value='kopoffset'/>
<cd:constant name='vfil' value='vfil'/>
@@ -1057,7 +1081,6 @@
<cd:command name='CAPPED' value='KAP'/>
<cd:command name='Character' value='Letter'/>
<cd:command name='Characters' value='Letters'/>
- <cd:command name='LABELTEXT' value='LABELTEKST'/>
<cd:command name='MONTH' value='MAAND'/>
<cd:command name='Numbers' value='Cijfers'/>
<cd:command name='Romannumerals' value='Romeins'/>
@@ -1096,7 +1119,6 @@
<cd:command name='colorbar' value='kleurenbalk'/>
<cd:command name='colorvalue' value='kleurwaarde'/>
<cd:command name='column' value='kolom'/>
- <cd:command name='comment' value='commentaar'/>
<cd:command name='comparecolorgroup' value='vergelijkkleurgroep'/>
<cd:command name='comparepalet' value='vergelijkpalet'/>
<cd:command name='completepagenumber' value='volledigepaginanummer'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-pe.xml b/Master/texmf-dist/tex/context/interface/keys-pe.xml
index 2b0a3f25bfd..2dd57b3d127 100644
--- a/Master/texmf-dist/tex/context/interface/keys-pe.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-pe.xml
@@ -71,12 +71,14 @@
<cd:variable name='after' value='بعداز'/>
<cd:variable name='all' value='همه'/>
<cd:variable name='always' value='همواره'/>
+ <cd:variable name='and' value='and'/>
<cd:variable name='answerarea' value='answerarea'/>
<cd:variable name='appendices' value='پیوستها'/>
<cd:variable name='appendix' value='پیوست'/>
<cd:variable name='april' value='آوریل'/>
<cd:variable name='atmargin' value='درحاشیه'/>
<cd:variable name='atpage' value='درصفحه'/>
+ <cd:variable name='attachment' value='attachment'/>
<cd:variable name='august' value='آگوست'/>
<cd:variable name='author' value='author'/>
<cd:variable name='auto' value='خودکار'/>
@@ -93,6 +95,7 @@
<cd:variable name='bib' value='bib'/>
<cd:variable name='big' value='بزرگ'/>
<cd:variable name='bigbodyfont' value='قلم‌بدنه‌بزرگ'/>
+ <cd:variable name='bigger' value='bigger'/>
<cd:variable name='bigpreference' value='اولویت‌بزرگ'/>
<cd:variable name='blank' value='خالی'/>
<cd:variable name='blockquote' value='نقل‌بلوک'/>
@@ -127,6 +130,7 @@
<cd:variable name='content' value='محتوا'/>
<cd:variable name='contents' value='محتویات'/>
<cd:variable name='continue' value='ادامه'/>
+ <cd:variable name='continued' value='continued'/>
<cd:variable name='controls' value='کنترلها'/>
<cd:variable name='conversion' value='تبدیل'/>
<cd:variable name='current' value='جاری'/>
@@ -144,6 +148,7 @@
<cd:variable name='down' value='down'/>
<cd:variable name='each' value='هر'/>
<cd:variable name='edge' value='لبه'/>
+ <cd:variable name='embed' value='embed'/>
<cd:variable name='empty' value='تهی'/>
<cd:variable name='end' value='end'/>
<cd:variable name='endnote' value='ته‌نوشت'/>
@@ -367,6 +372,7 @@
<cd:variable name='random' value='تصادفی'/>
<cd:variable name='readonly' value='تنهاخواندنی'/>
<cd:variable name='rectangular' value='چهارگوشه'/>
+ <cd:variable name='reference' value='مرجع'/>
<cd:variable name='referral' value='مراجعه'/>
<cd:variable name='register' value='ثبت'/>
<cd:variable name='regular' value='منظم'/>
@@ -414,6 +420,7 @@
<cd:variable name='smallbolditalic' value='ایتالیک‌مشکی‌کوچک'/>
<cd:variable name='smallboldslanted' value='خوابیده‌مشکی‌کوچک'/>
<cd:variable name='smallcaps' value='smallcaps'/>
+ <cd:variable name='smaller' value='smaller'/>
<cd:variable name='smallitalic' value='ایتالیک‌کوچک'/>
<cd:variable name='smallitalicbold' value='مشکی‌ایتالیک‌کوچک'/>
<cd:variable name='smallnormal' value='نرمال‌کوچک'/>
@@ -525,6 +532,7 @@
<cd:constant name='after' value='بعداز'/>
<cd:constant name='afterhead' value='بعدازسر'/>
<cd:constant name='afterkey' value='بعدازکلید'/>
+ <cd:constant name='aftersection' value='aftersection'/>
<cd:constant name='align' value='تنظیم'/>
<cd:constant name='aligncharacter' value='حرف‌تنظیم'/>
<cd:constant name='alignmentcharacter' value='حرف‌تنظیم‌کردن'/>
@@ -544,6 +552,7 @@
<cd:constant name='authoretallimit' value='authoretallimit'/>
<cd:constant name='authoretaltext' value='authoretaltext'/>
<cd:constant name='auto' value='خودکار'/>
+ <cd:constant name='autocase' value='autocase'/>
<cd:constant name='autofile' value='پرونده‌خودکار'/>
<cd:constant name='autofocus' value='تمرکز‌خودکار'/>
<cd:constant name='autohang' value='آویزان‌خودکار'/>
@@ -557,10 +566,12 @@
<cd:constant name='backgroundoffset' value='آفست‌پس‌زمینه'/>
<cd:constant name='backgroundradius' value='شعاع‌پس‌زمینه'/>
<cd:constant name='backgroundscreen' value='پرده‌پس‌زمینه'/>
+ <cd:constant name='backreference' value='backreference'/>
<cd:constant name='backspace' value='فضای‌پس'/>
<cd:constant name='balance' value='تعادل'/>
<cd:constant name='before' value='قبل‌از'/>
<cd:constant name='beforehead' value='قبل‌ازسر'/>
+ <cd:constant name='beforesection' value='beforesection'/>
<cd:constant name='bet' value='bet'/>
<cd:constant name='big' value='بزرگ'/>
<cd:constant name='blank' value='خالی'/>
@@ -575,8 +586,10 @@
<cd:constant name='bottomoffset' value='آفست‌پایین'/>
<cd:constant name='bottomspace' value='فضای‌پایین'/>
<cd:constant name='bottomstate' value='وضعیت‌پایین'/>
+ <cd:constant name='buffer' value='buffer'/>
<cd:constant name='cache' value='میانگیر'/>
<cd:constant name='calculate' value='محاسبه'/>
+ <cd:constant name='category' value='category'/>
<cd:constant name='ccommand' value='فرمان'/>
<cd:constant name='click' value='فشردن'/>
<cd:constant name='clickin' value='فشردن‌داخل'/>
@@ -584,6 +597,7 @@
<cd:constant name='clipoffset' value='آفست‌کلیپ'/>
<cd:constant name='closeaction' value='بستن‌کنش'/>
<cd:constant name='closecommand' value='بستن‌فرمان'/>
+ <cd:constant name='closepage' value='closepage'/>
<cd:constant name='closepageaction' value='بستن‌عمل‌صفحه'/>
<cd:constant name='closesymbol' value='بستن‌نماد'/>
<cd:constant name='color' value='رنگ'/>
@@ -635,6 +649,7 @@
<cd:constant name='editoretallimit' value='editoretallimit'/>
<cd:constant name='editoretaltext' value='editoretaltext'/>
<cd:constant name='empty' value='تهی'/>
+ <cd:constant name='entries' value='entries'/>
<cd:constant name='equalheight' value='ارتفاع‌یکسان'/>
<cd:constant name='equalwidth' value='عرض‌یکسان'/>
<cd:constant name='escape' value='فرار'/>
@@ -659,6 +674,7 @@
<cd:constant name='footer' value='ته‌برگ'/>
<cd:constant name='footerdistance' value='فاصله‌ته‌برگ'/>
<cd:constant name='footerstate' value='وضعیت‌ته‌برگ'/>
+ <cd:constant name='force' value='اجبار'/>
<cd:constant name='foregroundcolor' value='رنگ‌پیش‌زمینه'/>
<cd:constant name='foregroundstyle' value='سبک‌پیش‌زمینه'/>
<cd:constant name='format' value='شمایل'/>
@@ -705,11 +721,13 @@
<cd:constant name='intent' value='intent'/>
<cd:constant name='interaction' value='پانل'/>
<cd:constant name='interlinespace' value='فضای‌بین‌خط'/>
+ <cd:constant name='internalgrid' value='internalgrid'/>
<cd:constant name='itemalign' value='تنظیم‌آیتم'/>
<cd:constant name='items' value='آیتمها'/>
<cd:constant name='juniorsep' value='juniorsep'/>
<cd:constant name='ken' value='ken'/>
<cd:constant name='keyexpansion' value='گسترش‌کلید'/>
+ <cd:constant name='keys' value='keys'/>
<cd:constant name='keyword' value='کلید‌واژه'/>
<cd:constant name='label' value='برچسب'/>
<cd:constant name='lastnamesep' value='lastnamesep'/>
@@ -752,6 +770,7 @@
<cd:constant name='margintext' value='متن‌حاشیه'/>
<cd:constant name='marking' value='نشانه‌گذاری'/>
<cd:constant name='marstyle' value='سبک‌حاش'/>
+ <cd:constant name='mask' value='mask'/>
<cd:constant name='max' value='بیشترین'/>
<cd:constant name='maxdepth' value='maxdepth'/>
<cd:constant name='maxheight' value='بیشترین‌ارتفاع'/>
@@ -805,6 +824,7 @@
<cd:constant name='oddmargin' value='حاشیه‌فرد'/>
<cd:constant name='offset' value='آفست'/>
<cd:constant name='openaction' value='عمل‌باز'/>
+ <cd:constant name='openpage' value='openpage'/>
<cd:constant name='openpageaction' value='عمل‌صفحه‌باز'/>
<cd:constant name='option' value='گزینه'/>
<cd:constant name='order' value='order'/>
@@ -857,6 +877,7 @@
<cd:constant name='previous' value='قبلی'/>
<cd:constant name='previousnumber' value='شماره‌قبلی'/>
<cd:constant name='process' value='پردازش'/>
+ <cd:constant name='profile' value='profile'/>
<cd:constant name='pubsep' value='pubsep'/>
<cd:constant name='radius' value='شعاع'/>
<cd:constant name='random' value='تصادفی'/>
@@ -950,6 +971,7 @@
<cd:constant name='sub' value='زیر'/>
<cd:constant name='subtitle' value='زیرعنوان'/>
<cd:constant name='suffix' value='پسوند'/>
+ <cd:constant name='suffixseparator' value='suffixseparator'/>
<cd:constant name='surnamesep' value='surnamesep'/>
<cd:constant name='sx' value='sx'/>
<cd:constant name='sy' value='sy'/>
@@ -975,6 +997,7 @@
<cd:constant name='textstate' value='وضعیت‌متن'/>
<cd:constant name='textstyle' value='سبک‌متن'/>
<cd:constant name='textwidth' value='عرض‌متن'/>
+ <cd:constant name='threshold' value='threshold'/>
<cd:constant name='title' value='عنوان'/>
<cd:constant name='titlecolor' value='رنگ‌عنوان'/>
<cd:constant name='titlecommand' value='فرمان‌عنوان'/>
@@ -997,6 +1020,7 @@
<cd:constant name='urlalternative' value='urlalternative'/>
<cd:constant name='urlspace' value='urlspace'/>
<cd:constant name='validate' value='تاییداعتبار'/>
+ <cd:constant name='values' value='values'/>
<cd:constant name='vcommand' value='vcommand'/>
<cd:constant name='veroffset' value='آفست‌عم'/>
<cd:constant name='vfil' value='vfil'/>
@@ -1057,7 +1081,6 @@
<cd:command name='CAPPED' value='CAP'/>
<cd:command name='Character' value='Character'/>
<cd:command name='Characters' value='Characters'/>
- <cd:command name='LABELTEXT' value='LABELTEXT'/>
<cd:command name='MONTH' value='MONTH'/>
<cd:command name='Numbers' value='Numbers'/>
<cd:command name='Romannumerals' value='Romannumerals'/>
@@ -1096,7 +1119,6 @@
<cd:command name='colorbar' value='میله‌رنگ'/>
<cd:command name='colorvalue' value='مقداررنگ'/>
<cd:command name='column' value='ستون'/>
- <cd:command name='comment' value='توضیح'/>
<cd:command name='comparecolorgroup' value='مقایسه‌گروه‌رنگ'/>
<cd:command name='comparepalet' value='لوح‌مقایسه'/>
<cd:command name='completepagenumber' value='شماره‌صفحه‌کامل'/>
diff --git a/Master/texmf-dist/tex/context/interface/keys-ro.xml b/Master/texmf-dist/tex/context/interface/keys-ro.xml
index 46f2ecd1e86..c0ebc9c96d0 100644
--- a/Master/texmf-dist/tex/context/interface/keys-ro.xml
+++ b/Master/texmf-dist/tex/context/interface/keys-ro.xml
@@ -71,12 +71,14 @@
<cd:variable name='after' value='dupa'/>
<cd:variable name='all' value='tot'/>
<cd:variable name='always' value='totdeauna'/>
+ <cd:variable name='and' value='and'/>
<cd:variable name='answerarea' value='answerarea'/>
<cd:variable name='appendices' value='apendixuri'/>
<cd:variable name='appendix' value='apendix'/>
<cd:variable name='april' value='aprilie'/>
<cd:variable name='atmargin' value='lamargine'/>
<cd:variable name='atpage' value='lapagina'/>
+ <cd:variable name='attachment' value='attachment'/>
<cd:variable name='august' value='august'/>
<cd:variable name='author' value='autor'/>
<cd:variable name='auto' value='auto'/>
@@ -93,6 +95,7 @@
<cd:variable name='bib' value='bib'/>
<cd:variable name='big' value='mare'/>
<cd:variable name='bigbodyfont' value='bigbodyfont'/>
+ <cd:variable name='bigger' value='bigger'/>
<cd:variable name='bigpreference' value='preferintamare'/>
<cd:variable name='blank' value='blank'/>
<cd:variable name='blockquote' value='blockquote'/>
@@ -127,6 +130,7 @@
<cd:variable name='content' value='cuprins'/>
<cd:variable name='contents' value='cuprinsuri'/>
<cd:variable name='continue' value='continuu'/>
+ <cd:variable name='continued' value='continued'/>
<cd:variable name='controls' value='controale'/>
<cd:variable name='conversion' value='conversie'/>
<cd:variable name='current' value='curent'/>
@@ -144,6 +148,7 @@
<cd:variable name='down' value='down'/>
<cd:variable name='each' value='fiecare'/>
<cd:variable name='edge' value='bordura'/>
+ <cd:variable name='embed' value='embed'/>
<cd:variable name='empty' value='gol'/>
<cd:variable name='end' value='end'/>
<cd:variable name='endnote' value='endnote'/>
@@ -367,6 +372,7 @@
<cd:variable name='random' value='aleator'/>
<cd:variable name='readonly' value='readonly'/>
<cd:variable name='rectangular' value='rectangular'/>
+ <cd:variable name='reference' value='referinta'/>
<cd:variable name='referral' value='referinta'/>
<cd:variable name='register' value='registru'/>
<cd:variable name='regular' value='regular'/>
@@ -414,6 +420,7 @@
<cd:variable name='smallbolditalic' value='micaldininclinat'/>
<cd:variable name='smallboldslanted' value='micaldininclinat'/>
<cd:variable name='smallcaps' value='majusculemici'/>
+ <cd:variable name='smaller' value='smaller'/>
<cd:variable name='smallitalic' value='micitalic'/>
<cd:variable name='smallitalicbold' value='micitalicaldin'/>
<cd:variable name='smallnormal' value='micnormal'/>
@@ -525,6 +532,7 @@
<cd:constant name='after' value='dupa'/>
<cd:constant name='afterhead' value='dupatitlu'/>
<cd:constant name='afterkey' value='dupatasta'/>
+ <cd:constant name='aftersection' value='aftersection'/>
<cd:constant name='align' value='aliniere'/>
<cd:constant name='aligncharacter' value='aliniazacaracter'/>
<cd:constant name='alignmentcharacter' value='alierecaracter'/>
@@ -544,6 +552,7 @@
<cd:constant name='authoretallimit' value='authoretallimit'/>
<cd:constant name='authoretaltext' value='authoretaltext'/>
<cd:constant name='auto' value='auto'/>
+ <cd:constant name='autocase' value='autocase'/>
<cd:constant name='autofile' value='autofile'/>
<cd:constant name='autofocus' value='autofocus'/>
<cd:constant name='autohang' value='autohang'/>
@@ -557,10 +566,12 @@
<cd:constant name='backgroundoffset' value='offsetfundal'/>
<cd:constant name='backgroundradius' value='razafundal'/>
<cd:constant name='backgroundscreen' value='ecranfundal'/>
+ <cd:constant name='backreference' value='backreference'/>
<cd:constant name='backspace' value='spatiuspate'/>
<cd:constant name='balance' value='balanta'/>
<cd:constant name='before' value='inainte'/>
<cd:constant name='beforehead' value='inaintetitlu'/>
+ <cd:constant name='beforesection' value='beforesection'/>
<cd:constant name='bet' value='bet'/>
<cd:constant name='big' value='mare'/>
<cd:constant name='blank' value='blanc'/>
@@ -575,8 +586,10 @@
<cd:constant name='bottomoffset' value='offsetjos'/>
<cd:constant name='bottomspace' value='spatiujos'/>
<cd:constant name='bottomstate' value='starejos'/>
+ <cd:constant name='buffer' value='buffer'/>
<cd:constant name='cache' value='cache'/>
<cd:constant name='calculate' value='calculeaza'/>
+ <cd:constant name='category' value='category'/>
<cd:constant name='ccommand' value='comandac'/>
<cd:constant name='click' value='click'/>
<cd:constant name='clickin' value='clickintru'/>
@@ -584,6 +597,7 @@
<cd:constant name='clipoffset' value='clipoffset'/>
<cd:constant name='closeaction' value='actiuneinchidere'/>
<cd:constant name='closecommand' value='closecommand'/>
+ <cd:constant name='closepage' value='closepage'/>
<cd:constant name='closepageaction' value='actiuneinchiderepagina'/>
<cd:constant name='closesymbol' value='closesymbol'/>
<cd:constant name='color' value='culoare'/>
@@ -635,6 +649,7 @@
<cd:constant name='editoretallimit' value='editoretallimit'/>
<cd:constant name='editoretaltext' value='editoretaltext'/>
<cd:constant name='empty' value='gol'/>
+ <cd:constant name='entries' value='entries'/>
<cd:constant name='equalheight' value='equalheight'/>
<cd:constant name='equalwidth' value='equalwidth'/>
<cd:constant name='escape' value='escape'/>
@@ -659,6 +674,7 @@
<cd:constant name='footer' value='subsol'/>
<cd:constant name='footerdistance' value='distantasubsol'/>
<cd:constant name='footerstate' value='staresubsol'/>
+ <cd:constant name='force' value='fortat'/>
<cd:constant name='foregroundcolor' value='foregroundcolor'/>
<cd:constant name='foregroundstyle' value='foregroundstyle'/>
<cd:constant name='format' value='format'/>
@@ -705,11 +721,13 @@
<cd:constant name='intent' value='intent'/>
<cd:constant name='interaction' value='interactiune'/>
<cd:constant name='interlinespace' value='spatiereinterliniara'/>
+ <cd:constant name='internalgrid' value='internalgrid'/>
<cd:constant name='itemalign' value='itemalign'/>
<cd:constant name='items' value='elemente'/>
<cd:constant name='juniorsep' value='juniorsep'/>
<cd:constant name='ken' value='ken'/>
<cd:constant name='keyexpansion' value='keyexpansion'/>
+ <cd:constant name='keys' value='keys'/>
<cd:constant name='keyword' value='keyword'/>
<cd:constant name='label' value='eticheta'/>
<cd:constant name='lastnamesep' value='lastnamesep'/>
@@ -752,6 +770,7 @@
<cd:constant name='margintext' value='textmargine'/>
<cd:constant name='marking' value='marcaje'/>
<cd:constant name='marstyle' value='stilmarcaj'/>
+ <cd:constant name='mask' value='mask'/>
<cd:constant name='max' value='max'/>
<cd:constant name='maxdepth' value='maxdepth'/>
<cd:constant name='maxheight' value='inaltimemaxima'/>
@@ -805,6 +824,7 @@
<cd:constant name='oddmargin' value='margineimpara'/>
<cd:constant name='offset' value='offset'/>
<cd:constant name='openaction' value='actiunedeschidere'/>
+ <cd:constant name='openpage' value='openpage'/>
<cd:constant name='openpageaction' value='actiunedeschiderepagina'/>
<cd:constant name='option' value='optiune'/>
<cd:constant name='order' value='order'/>
@@ -857,6 +877,7 @@
<cd:constant name='previous' value='precendent'/>
<cd:constant name='previousnumber' value='numarprecedent'/>
<cd:constant name='process' value='process'/>
+ <cd:constant name='profile' value='profile'/>
<cd:constant name='pubsep' value='pubsep'/>
<cd:constant name='radius' value='raza'/>
<cd:constant name='random' value='aleator'/>
@@ -950,6 +971,7 @@
<cd:constant name='sub' value='sub'/>
<cd:constant name='subtitle' value='subtitlu'/>
<cd:constant name='suffix' value='suffix'/>
+ <cd:constant name='suffixseparator' value='suffixseparator'/>
<cd:constant name='surnamesep' value='surnamesep'/>
<cd:constant name='sx' value='sx'/>
<cd:constant name='sy' value='sy'/>
@@ -975,6 +997,7 @@
<cd:constant name='textstate' value='staretext'/>
<cd:constant name='textstyle' value='stiltext'/>
<cd:constant name='textwidth' value='latimetext'/>
+ <cd:constant name='threshold' value='threshold'/>
<cd:constant name='title' value='titlu'/>
<cd:constant name='titlecolor' value='culoaretitlu'/>
<cd:constant name='titlecommand' value='titlecommand'/>
@@ -997,6 +1020,7 @@
<cd:constant name='urlalternative' value='urlalternativ'/>
<cd:constant name='urlspace' value='spatiuurl'/>
<cd:constant name='validate' value='verifica'/>
+ <cd:constant name='values' value='values'/>
<cd:constant name='vcommand' value='comandav'/>
<cd:constant name='veroffset' value='veroffset'/>
<cd:constant name='vfil' value='vfil'/>
@@ -1057,7 +1081,6 @@
<cd:command name='CAPPED' value='KAP'/>
<cd:command name='Character' value='Litera'/>
<cd:command name='Characters' value='Litere'/>
- <cd:command name='LABELTEXT' value='TEXTETICHETA'/>
<cd:command name='MONTH' value='LUNA'/>
<cd:command name='Numbers' value='Numere'/>
<cd:command name='Romannumerals' value='Numereromane'/>
@@ -1096,7 +1119,6 @@
<cd:command name='colorbar' value='baraculoare'/>
<cd:command name='colorvalue' value='valoareculoare'/>
<cd:command name='column' value='coloana'/>
- <cd:command name='comment' value='comentariu'/>
<cd:command name='comparecolorgroup' value='comparagrupculoare'/>
<cd:command name='comparepalet' value='comparapaleta'/>
<cd:command name='completepagenumber' value='completeazanumarpagina'/>
diff --git a/Master/texmf-dist/tex/context/patterns/lang-af.hyp b/Master/texmf-dist/tex/context/patterns/lang-af.hyp
new file mode 100644
index 00000000000..97e2f46749c
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-af.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-af.rme
+
+% used: a d l n s
+
+\hyphenation{
+sandaal} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-af.lua b/Master/texmf-dist/tex/context/patterns/lang-af.lua
new file mode 100644
index 00000000000..57a184e3aaf
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-af.lua
@@ -0,0 +1,47 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["characters"]="adlns",
+ ["data"]="sandaal",
+ ["n"]=1,
+ },
+ ["metadata"]={
+ ["mnemonic"]="af",
+ ["source"]="hyph-af",
+ ["texcomment"]="% Afrikaans Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% Hyphenation patterns for Afrikaans\
+%\
+% This work may be distributed and/or modified under the\
+% conditions of the LaTeX Project Public License, either version 1.3\
+% of this license or (at your option) any later version.\
+% The latest version of this license is in\
+% http://www.latex-project.org/lppl.txt\
+% and version 1.3 or later is part of all distributions of LaTeX\
+% version 2005/12/01 or later.\
+% -----------------------------------------------------------------\
+% VERSION: 0.9 (October 2010)\
+%\
+% AUTHORS: Tilla Fick and Chris Swanepoel\
+% hyphen at rekenaar dot net\
+% -----------------------------------------------------------------\
+%\
+% Define lefthyphenmin to one and righthyphenmin to two\
+% (although righthyphenmin could technically be made one,\
+% in allmost all cases a value of two gives better results): \
+% \\lefthyphenmin=1 \\righthyphenmin=2\
+%\
+% -----------------------------------------------------------------\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="-abcdefghijklmnopqrstuvwxyzäèêëîïôöûü’",
+ ["data"]=".aan5s4 .aä7lawa .a6bc-b .a4b5la .ab7salo .a6b-ja .ac7cra. .a6farm .af7arm. .a6feet .af7eet. .a4f5en .a6fets .af7ets. .a6foes .af7oes. .a4f5oo .a4f5ra .af6ro’ .a7fro’s .af6ro- .a7fro-h .a6fry. .af3s .ag6aam .agte6r5 .a6guur .a9ha. .ah7lers .a3kw .a6leer .al7eer. .alf4 .al7fagr .al5fr .al6lda .a4l3o .al6oïe .a7loïen .al3p .al5st .al7thea .al7twee .al6zhe .amp4s .amps5w .a6naër .an7aëro .an6cpl .and4 .an5dr .ang4 .an5gl .angs5 .a4n5io .an7thro .a3pr .ap7side .a5rag .ara6p. .ar7thur .ar6zbe .as7jas. .a6snog .a6sof. .a5sti .a7straa .a7s6tral .at6hol .a7thol. .a5tsj .atte4 .au7drey .b6aanv .ba6din .ba4d5o .ba7loi. .ba7ragw .ba7rins .ba6sek .ba7tho. .be7deks .be6kaf .bek7af. .be5la .be7lol. .be7skos .be7thel .be7thul .bi7sho. .bli4 .blus5 .bo7kerf .bo7kies .bo7kors .bo7maat .b4on .bo7plaa .bo5ro .bo7sor. .bo5sta .bo7trit .bo7tswa .bo7uit. .bout5j .b4re .bu6eno .bu6lol .bu7thel .by6ldr .by6lho .by6lne .by6lpi .by7port .bys4 .by6tal .ca7thy. .ca7yenn .chlo7e. .ci6rca .ci7trus .cos7ta. .cy6pri .d2 .da7gon. .dag5s .da6kat .da6koo .da7tage .da6tji .dat7jie .da6wki .de6k7laa .de6klo .de6kwe .de5la .de7roga .de6sal .de6sok .de4sp .diep5l .di6jks .di4si .di7thak .do4m5a .do4m5o .dor7ste. .dr6oef .dun5s .du6pre .dut5j .dy7spie .e6bcu. .ed5wa .ed7win. .eer6sk .ee4t .e6fron .ef7ron. .eg7gofo .e6indu .ei5st .ek4s5k .ek7sopa .ek7sord .eks7tri .eks7tro .en7dres .enk4 .en5kl .e6noft .en7ofta .en4t5j .en7topt .ep7soms .er4d5a .er6dwo .er6fle .er6foo .er6inv .ern4 .er4t4 .er5te .ert5j .ert7se. .erts5w .e2s .e9sau .e4s3k .e3so .es3p .es8p. .es6pma .es3t .es6tco .es6tni .es5tr .e7tage. .et4sn .eur5a .eu7stac .ex7odus .e6zra. .f2 .fo6chv .fo6wle .f4ri .fy6tji .g2 .ga7lage .ga7lago .ga6lap .ga6loo .g6arbo .ga6sen .ge7dart .ge3g .ge7geks .ge7guil .gekun5 .gekuns6 .ge5la .ge7mopp .ge7muit .ge7nève .ge7rogg .ges4 .ge7sjab .ge7sjar .ge5sk .ge5so .ges7pe. .ge7sper. .ge7steg .gif3 .gi7gagr .gi6sen .gly3 .gly5k .g6lyna .g4oo .gou7da. .gr6äbe .g6ruba .gui7do. .hang5s .he6blu .he6gor .he6gra .h6eind .hek5o .he7rakl .he6r5en .he6wle .hi8v. .ho6fet .ho6laa .ho6loo .hooi5 .ho7taze .ho4t5o .hy6gro .ic7teru .i4gl .ile7us. .i2n1 .i9n8a. .in6ari .i7narie .ind4 .in7dwar .ing4 .in5gr .in5gw .in6iti .in5kl .in6kly .in5kn .in5kw .in6osi .i7nosie .in3s4 .in7snee .in7twyf .i5raa .i3sa .i4sk .i3so .ja6gli .jah7we. .ja6spa .ja7taga .j6äger .je7sopp .jo7dofo .jo7safa .ju6kos .juk7os. .j6ü6rge .jy6sel .k2 .kaar4 .kade4 .kadet5 .k4af .kaï7ro. .ka7nont .ka6pla .ka7plak .k6arbe .ka7thar .ka7thu. .ka6toë .kat7oë. .ka6tui .ke6ple .ker6k5a .ker6k5l .kerk5r .ker6sa .ker6sl .ker6s5p .ke4s5t .kie6st .ki6pli .ki4r .kit7se. .k4la .k6leyn .k4li .klip5 .knik5 .kn6opn .ko6maa .ko6maf .k4op .kope4 .koper7a .ko6pla .kop5o .ko7rag. .kor6st .kors7te. .k6rak. .kr6üge .kryt5 .ku7mon. .k4we .k4wo .ky7otop .l’7etji .la6eti .la6kwa .la5sa .lei5s4 .lek7oë. .le6poo .le5pr .le7shab .le6son .le4sp .les5t .le6suu .lig5e .li4gi .li6gom .li6gre .li7pase .l6loyd .lo6chn .lof7ui. .lo6glê .l6ontd .los5k .lu6gen .lui5sl .l6üder .m2 .m’7etji .ma6cdo .ma6nal .ma6nur .ma7stek .ma7thes .ma6zda .mel6k5a .mel6k5l .mer6k5l .mes5m .me4sw .me6tem .mi6dos .mi6rba .mi7traa .m4ne .mo7djad .mo7flam .mo6sin .mo4sk .mu4e .my6nen .my6n5in .my7unis .n2 .n6aand .na5fl .na6gro .na7groe .na7smaa .na7stor .na7uurs .ne4k5a .ne4k5o .ne6kri .nek7rin .ne6kys .ne4s3 .ne7serh .n6etik .ne4t5j .ne6tru .ne6wca .ne6wfo .ne6wla .ne6wma .ni4e .ni6jho .ni6rva .nix7on. .n6kosa .noet4 .noe5tj .no6gee .no4k .n6ondu .nu4l .ny7lont .oe5kr .oe4r .oe7ralg .oe7rang .oer7os. .oe4s3 .o4gl .oh7rigs .o6klah .ok7laho .ol6ieu .o7lieui .oms4 .o2n1 .ond6ui .on7duit .o6nemo .on6ias .o7nias. .on3k .on7parm .on3s4 .on6she .on6sse .on6t7eer .on6t5er .on4tr .ont7ras .ont5ri .o9nus .on6us. .oon4 .oon7de. .o4op .oor5n .oor5s4 .oo4s .o6peet .op7eet. .o6peg. .o6pein .o6p5erd .o4pof .o4pr .op5ra .ops4 .op7smuk .o7ragie .or6kne .o3ro .orto5 .o4sk .os5ko .os7oog. .ot6hel .o7thell .ou6doo .ou7nôi. .ou5tj .p2 .pa4d3 .pa7die. .pa6vlo .pe5la .pel6sk .per6st .pe4sk .pe4st .pie6tj .pi7laf. .pit5s .p4la .po6dzo .p6oefe .poen4 .p6ontw .po6sad .p4re .pu6tad .py6paa .py6pla .py6pol .pyp5r .py7thon .r2 .r’7etji .r6aard .ra7dart .ra6seg .ras7eg. .re7aumu .re6gru .rek5s .re6mas .rem7as. .re6mco .re4sl .rie4t .riet5j .riet5r .ri6ple .roc7ky. .ro6gak .ron7do. .rond5s .ro5py .ros5t .ro6tre .ro6wli .ru7klip .ruk4o .ru7kope .ru7staa .ru6suu .ry4k5a .ry6ste .s6aans .s4af .s4ag .sa7gopa .s6akty .s4am .sa6vlo .s4ca .se6an. .see5ra .see7ys. .se7khuk .se6laa .se6lop .se7reni .se6sle .ses5t .se6suu .se6tap .se4tr .sex5y .s6fale .s4fi .s4gr .s4ha4 .s4he .s4hi .s4ho .s4hu .s4in .si6nes .si7pho. .si7rag. .s4ja .s4ka .s4ke .s4kl .s4ko .s4kr .s4ku .slag5 .s4ma .s4me .s4mi .s4mo .s4mu .s6nags .s4ne .sod4 .so7dafa .so7dwan .so7iets .so6kop .some4 .s6oms. .s4on .so6neg .s4op .so6pek .so7phok .so7ross .s4pe .s4pl .spo4g .s6pren .s4py .s8ri. .s4ta .s6temp .ste7rol .ster6ta .ster6t7j .s4ti .s4to .straf5 .s6trei .s6tuar .stuc5 .su7biet .sub5m .sub5p .su8e. .s4ui .su5kr .su7ther .su7tra. .s4we .s4wi .s4wo .sy1 .sy6lvi .sy7nagr .sy7slag .t2 .t6afsy .t4ag .tee5k .te6flo .te7rafi .te7ragr .ter6tj .tert7ji .te4s5t .te7stud .ti6ene .tie6t5j .ti4k .ti6ner .t6jaai .tjok5 .toe7ys. .to6kla .to7ky7o. .to6lun .to7ront .tou3 .trap5r .trek5 .tre4s .trie4 .tries5 .t4sa .ts4h .ts6jaa .ty6daa .ty6dor .ty6dra .ui6laa .ui4t3 .ui5ti .ui5t6ji .um7hlan .uns4 .un5st .u5raa .u5tra .va6kad .va6kei .va6naf .va4n5o .va7raan .va6sen .va6swa .vas7ys. .ve7cino .ve7laar .ve7lare .ve7lêr. .ve7loer .ve7lome .ve7meng .ve7rema .ve7rena .ve7reve .ve7skaf .ve7tore .vlas5 .vo6gin .vo6lyw .vo6sko .wa7ghri .wa4n .wa7smou .wa6spa .web5m .we4bo .we6b-o .week7lan .wee4t5 .we6kuu .we4l5a .we6lin .wel7ing .we6nan .werk5l .wer6k5r .we4s5k .we6soe .we6swa .w8hê. .w4hi .wi6id. .wins5 .wi4p .wi4t .wî9e. .wy7kwas .wy7nand .wy6net .x2 .y6amin .y6anni .y6asud .yk7loon .ys3 .ys6ere .ys5la .ze5us .z6üric .z4wa .z4wi aa2 aad1 aa4da aa4de aa4do aa4d3r aaf7emme aaf6sat aag5al aag7asem aag7elas aag3r aag7rond aag5s4l aag5sp aag5st aag7swee aai7lag. aak1 aa4ka aa4ko aak3r aak7ster aak3w aal1 aal6dys aald7ys. aal5fe aal6fpo aal5sa aal7sfee aam1 aa4ma aa4me aa4mo aam7smul aan1 aan6dou aand6re aan7dren aan7dros aan7gons aan3k4 aan5kl 5aankon aan7kry. 5aanleg aan7sage aan6see aans7eer aan6sek 5aansig aan7skem aan5sl aan5sn aan6som aan6son aan5sp aan7tuig 5aanva aap1 aa4pa aa4po aap3r aa4pu aar3a aar6dan aard7ang aard7as. aar5de aar7ding aar4du aar3e aar3i aar7kwek aar6lbe aar6lka aar6lva aar6lzi aar6l-o aar3o aar7ser. aar7seri aar6sid aars8teek aars8tell aars6ti 5aartap aar6tin aar7tomo aar7tryb aar3u aas3 aa4so aas7omel aat1 aat7nagt aa4to aat3r aat6sef aat7sfee aat7slim aat6slo aat6sly aat7sonn aat6sow aat6sti aau6wbe aä5ron aba6kas abak7as. aba7komb abare4 aba7ster ab3d aber6sp ab5lau ab5rup 3abso abu7scha ab5wie ac5que a2d a3da a4d3aa adam4 adam7pe. ada4r a3de ades7lan ade7smee a3di adi6eus 5adjud 5admin a3do a4dow a3dr 5adres. ads7erwe ad4sn ads6op. ad5sor ads7teso ad4su a3du ad5uit adu7spel adu5tj 5advert a3dy ady7smit a1e ael7atoo ae4l5ei ae4lo aes5to aes5tr aes7tuur aë1 4afee af5eks afel5aa af4fre af5gha af5inr af3l a4fof af1r af5raa af5ram af5ran a4f3re 3afri a4f5rit a4f3ro a5frod a4f3ru af3s4w 3afva afval5 ag3aa a6gaanv a4gaar ag5adv a4g3ak ag5alg ag5api ag5are 4age. 4ageb 4aged age6ddo a4gei 4agem a4g5erv 4ages a6g5ewen agge7us. a3gi a5ging a4g5ins agi5s6tr ag1l ag5ogg ag5ord ag5ork ag5oud a4g3re ag5rei a4g3ru ag3sa ags7abno ag6sins ag5ska ags7koev ag5skol ag5skr ag5sky ags4lo ag4sn ags6oep ag5som. ags6oom ags6op. ag5spe ag5s6por ags4t ags7taal ag5sti ags6waa ags6wee ag4tu agt7uur. a4g3ui ag5ure ag5uur ag-7lag. aher4 ahe5ri a4hs. ai1 aig6ne. aiï5er ai4lp ain6ste aip6eis ai3s4k ai5sla ais4p ais7prys ais4t ai3tj ai3t4r a4k5aan ak5arb ake6lee ake6lof ak5ess ak5ins akis4 akis7te. 5akkoo a2k3l a5klank ak6leet a2k3n ako6bre ak5oms a1kr a4k3re ak5rig ak4sc ak5sme ak3sp a4k3ui a2kw ak3we ak5win a3ky a4kys a1la ala7gadi a5lagm al5agt ala7kled alan7gaa al5dei a4lef ale6str al4f3e alf6eni al4fh al5fie al4fj alf7olie alf6sko alf6sni alf6sta alfs7tan al4fu alf4- 5algori alien5s ali6gal ali7glas alk7aard alk7laag alk7oond alk5sp al4kui alk7wyk. 5alleen alm7eier alm7lont a1lo als4a als7agti als7ghaa al6skel als7kelk als5li al4s5oo als7pret als5waa als7werw alt6hea alt6hus alt7rots alt6sas alt6wee a1lu alve5o a2m a3ma ama3k4 aman6t5j ama7rins am5atoo 5ambag 5ambass a3me am5egt ame6sin ame5sm ame6spo a3mi ami7skyw amm6afu 5ammun a3mo amp7arre amp7lag. amp7leer amp7lig. amp7lug. amp7omhe amp7seël amp7sfee amp7sier amp7staf amp7staw ams7esel am6s5kop ams7lend am6smet ams7meti ams6mul am4s3o ams7pels am6swan am6swar ams7wyn. a3mu a4mui am5uit a3my an5agt ana7kwal an5alf ana6spi an4c- and7aans and7adel an6dakt an5dan and7anal an4dap an6dase an6datt and7attr an6degt and7egte and5eks and7emal an6derf and7erf. an6dete and7etes and7eval an6dinw and7inwa and6ja. and6jar an4d5om an4don an4d5op and7oud. an6drak an4dro and6ser and6s7kop and7spaa and7spre and7steg and7swee an7dwing and7wyn. ane6ron ang7aal. ang7adem ang7ghor ang6hai ang6lad an5g4li an6glig ang7lig. ang7lip. ang6nol ang6ons ang7ore. ang7repu ang7sakm ang6ska ang7snee ang6s7te. ang7stem ang6sur ang7ure. anie6t5r an5inl ani5sf ani7slaw an6kase ank7asem ank7refe an4kry ank3w an5ops an5opt an5opv an5ord an5org ano7roei ano7stoe anr6hyn ans7aalw an4s5am an6sass ans7asse an4sc ans7eila ans7eura an6sink ans7ink. an6sjek ans7jekk ans7jord an4ske ans5kei an6skin an6s5kop ans7kous an6slat ans7mada an4sn ans7oran an4s5pa an6sper ans7pet. an4spo ans4ti ans7toil ant5aan ant5aar an6tass ant7asso an4tei an6teks ant7ekst 5antenn ant7ete. an6tins ant5jo an4tol ant7opru ant7rest ant5rin ant7rob. ant6ski ant6sko an4tui 5antwo a1ny a1o a2p a3pa a4p5aan a4p5agt ap5aks ap5arm 5aparth a3pe ape6nop a3pi api6rfa ap3l a3po apo6kaa ap5ond apo5sta 5appar ap1r ap5rol ap3ru a4pry ap5ryk a5prys ap6sall aps7alli ap6seko aps7iden ap6skof ap6s5taa ap5sti aps7toet aps5we a3pu a4pui ap5uit a3py a1ra ara7gwan ara7klee ara6kop ara3p4 ara6ppa ar6d5agt ar6das. ar6datm ar5der ar6deti ar6d5opp 3area aree5s areg7swe ar3ei are7knip ar5fla arg4h ar5gha 5argite ar4gl arg4o arie4f ari6jke ar6k5ana ar6kini ark7leer ar5klo ark6los ark7onvo arko6v. ark7snui ark5sp ar4kw ark5wa arn6avo a1ro aroet6j aroe7tji aroo5h aroom4 aroo5p aroo5s ar3op aro6wva ar5rag arres5t ars5ag ars7elek 5arsena ar5sie ars6kou ars7krap ar6skre ars7kree ar6skro ars7pan. ar4spr ar6stal ars7tall ars7tee. ars6-in ar6taas art7aasv ar6talb art7albu ar4t5as ar4tc ar5te. art7eend ar5teh ar4tei art6hol art6hur art6omo art5oog art5oor ar4tor art7reek art7roep art6ryb art7samb art6slu art6spr art7spyn a1ru arus6o. a1ry ary7taal as3ag as5app as3c as4d. as4dh as5egt ase6rak as5ete as3f asg6hit as4hi asi7freu a4sj. a4sjm a2s3k a5skool a5skri as5kru a2s3l as5laag as3m a4smy a4sna as3no as9of. as5ogi a4s3oo as3op as3p as4por as3t as4t. a5staa as4th ast6les a5stof a7strak. a5s6tran a5s6troo as3w a4sys as5yst at5aar a4tag ata3s4 ata6sse atas7se. ata6wba ate5it 5atelj ate6rar ate6rer ate6ron a6tetes ath7cart a5t4hee ath7kinp ath7lone atie6te a2t3j atk6v-s 5atleet 5atmos at5oog at5ry. ats7alma at6sint ats7inte at4sj at6skin ats6kom at6skop ats7kop. ats7krip at4s5le ats7lykh at4sm ats6maa ats7nood at6somw ats7omwe at4son ats5ond ats7onko ats7onlu ats5op ats7ower ats7tend ats7trek ats8treke at6stro ats3w at5the att6hys at4tu atu6maa 2au aud6rey au5gra aug6sbu aul6spo au3p aure5u auri5s4 aus4t aus7tin. au5str aus7tus. aut6ste ava6lop ave7lott avlo6v. 3avon awa7glas awas4 awe5ga awe4r5a awer6ui aws6han ax5ofo a3ya ay4a. ay5ist ayn6ard ayn6or. a3yo a3yw azoo7ka. azz7agti az4zl azz7orke 1ä 1b2 2b. babak4 bab7wiër ba4d5ra bad5sp ba4kin ba3kl ba4kla ba6kleu ba4k3o ba4k3r bak3w bal6kla ba4lo bal7onts bal5or bal7tsas ban4da ban6dek ban4d5r ban7glad bang7ste bangs8te. ban4k5a ban6kre ban4kw bar7kaan bar4s3 bar5th bas7ekst bas7ghit bas7jan. ba4sn ba5spe bas7peer bat5aan ba3t4j 2bb b3ba b3be b3bi b3bl b3bo b3by 2bd b3de b3di b3do bed7slaa bed6sta beds7taa be3dw beel6dr bek7neus bek7wind bel6aga belk6li bel7klik bel6ldo ber6gaa berg7aar ber4gl ber4g5r ber7grys ber6gzi bers7pan ber6spr bers7pre bert6sk bes6aan bes4k be5ska be3sl be3sm be3so be5son be5sôr be3s4t be6s5ter be5sti be6stia bes7tial bes7trol bet4h be5tha bet7hesd be5ton be3tw 2b1f 2b1g b3ge bid3s bi4du bid7ure. bie6dui bie4g bieg5r bi4jl bin6dri bio7sfee bi4rc bis4a bis6ho. bis7scho bi3tr 2bj b3je 2b1k b3kl b3ko b3ku bla4d5a bla6don bla4d5r bla5so 4blau bleem5 ble4s ble7ser. bles5k ble6tji blet7jie blê6rfl blik5o blix7en. blo4k3 blo7kaal blo4m3 blu6sem bly7mare bly3s4 2b1n b3no bob7slee boe6kil boe6kom boe6koo boer6st boers7te boe4s5k bog7gher bog7skut bo2k1 bo3ka bok6aak bok6ale bok6as. bok6erf bok6ies bok3l bo7kleed bok6om. bok6ors bok6ost bok3r bok6rag bo4m5aa bom6aat bo4m3o bon6dam bon6dra bond7raa bon6tel bon4t5r bo9op. bop6laa bor6dak bor6des bor4g5a bor6gri b4ors bor6saa bor4s5k bor4s5l bor4s5t bo2s bos7anem bos7jamb bos7pepe bos7taai bo5s4tr bos7uil. bo5t4ha bot6sto bou6it. bou3s4 b3pr brand5a breek5 br4ei brei5s4 brengs7t brie6kw briek7wa 3bro bro4n bro4sk bro6vni bro6wni bru4l 4brup br4üm 2b1s b3se b3si b3sk b3so b3sp b3st bs4ti b3su 2bt b3te b3ti buc7cleu buik5s bui5t4j bult7af. bul4t5j bul6top bult7op. bul6tui bun7senb bus6had bus7toer but6hel buu7rend 2bv b3ve b3vi 2bw b3we by1 by3d by3k by4lb by4lt by3n4a by3s bys6kot bys4l bys6tek bys7ter. bys6tor bys4w byt7alka byt7eier by3tr 1c2 2c. ca4es cam5ph ca3pr ca3ra car6lto caru7so. cat4h ca5tha 2cc c3ca c3ch c3ci c3co ce4st ces5te 2ch. che6lan 5chemi che6reg che5r4i che7ryl. che7styl che6vvi ch5hoe ch5lei ch5nik cho7rage ch5sia 2cht 2ck c3ke cot7rand cove7ry. 2ct c3ta c3to c3tu cus5to cyp7rian 1d 2d. 4d5aanb d5aand 4d5aank d5aansl daard5u 4dabs 2d1af da2g da5gas dag5et da5gha dag6ham da5gra dag4sk dag5so dag7ster dak7lei. dak7oorh da4k3r dak5wa 4d5alar 4damb dam6plu 3dan dan6k7erk dan6sak dan6sko dans5m dan4so dan4s5t dan4t5r daph7ne. dap4l da5pla 4d3arm 4dart d5arti da4s. das7lag. das7traa da3t4j 2db dby6lvo 2dd dda5kl dda3s4 dde6lee ddel5so dder7aal dde6ras dder7as. d3dh dd4hi deba4t dee4g deeg5r dee4l dee7lig. 4d5eenh deë7skou 4deg. 2dei de3ka dek6aan de6klad de6k5lat de6klei dek7lei. de4kna 6dekono de6krie dek7riet 4deksa dek6ska del7appe del5eeu del5egg d5elekt del7elek 6d5eleme de6leng del7enge del6fer del5fi del6fos delf7os. del5oor del7oper del6ser del4so del7sold del7sone del4sp del6str del7stre delt6ag del7tagt del7weis 4demm dem6pla den6din 4d3eng 4denj den6kar den6kja den4k5l den4kr dens7pre den4t5j den6tri deo7plek deo7sfee 3dep der5ast de6reen der7een. der7emig der7ent. der7flap de6rin. derm7ins der5na de4ro de5rob de5roe der5of de5rol der5on der5ow der5ps der6sjo der5s6kr der6slu der6spu der7thal der6uit de5sag des7alni des5ap de6seng des7enge de4s5in deskat5 de6skor des7leed de4sn des7offe des7oksi de4s5on de4sor de4spa des7pari des7poës des7prik des7taal des7tele de4sti de5stig de4sw des7weë. 4d5ete. deten6te de3tw 4deuro deur5s6w 2d1f 2d1g dge5sp dg4li 2dh dias4 dia7stol dia6zvi dic7kie. dic7tio. die6fal die6kes 5diens die4pl die6tom die4t5u dig6ofa di4gre digs4 dig7skro dig7som. di6kamp dik7amp. di4k3l di4kr dik7ribs di4kw dik7wyn. di4l5al din6gas din4gr 4d3inl 4dins 4d3int 4d3inv di6sass dis7assi di4so di5son dis6pne dis7quis dit6hak dit7jies 2dj dja7dji. d4ji. d4jia 2d1k dklo4 2d1l d3la 2dm 2d1n doek5r doe6lon doe6sko does7kop 2dof 4dogi do4l5os dol6sou dols7ou. 3dom dom6pli dom6sap 4d5omse dom7slim dom6swê 4domt don4sk 4d5oord 4dopn dop6rof dop6rys 3dor 4d3org dor7othy dor4sl dor4st dos6tel dou3t do3y doy4e 2dp d2r 3dra dra6gaa 4d5rand dra7stan 4dreë 4d3reg d4rela d4rew 4driff d5rigt d5riss 4driv droë7ys. 4d5rond d5rooi 4d5roos dr4op dro6pan dro5pn dro7sfee 4d3rug d5ruim d5ruit 4d3rus 4d3ry. 4d3rye 4d3ryk 4drym d4ryw 2ds ds5aamb ds5aar d4s3ad d5sakr ds5aks ds5angs d4s3ar ds3as d3se d4s5een ds5eis. d4s5eko dse4l dse7leer d4s5eng d4s5era dser6tj dsert7ji d4s5erv d5sfeer ds3id ds5imp ds5inde d4s5ins ds5int d2s3j d5skee d4skin ds5kind d4skis d5skole d4skom d5skoo d6skraa d6skrit d6skroo d4s3le ds3li ds6luie ds3m d5s4mee ds6moor d4sna ds5neu ds5noo ds5not d2s1o d3soe d5some ds3on d7sonde. d7sondes dson4t ds5oog ds3op ds3ow d5s4pel d5spes d3spi ds5pop ds6prek d7spreker ds7preki d1st ds5taak d4staf d5stand ds5tea d5stel ds5tent d5ster. ds5terr d5sters ds4ti d3str d3stu ds3w d3sy 2dt dter6tj dtert7ji du4e- duns6te dur6rhe dusie5k dus6kap dus6pel 2dv dverdiens9 dverdien8st dve6sid dvie4 2dw d4waal d5waar 5d4wang dwa6nor 4dwarm dwar7se. d3wat d4weil 5dwerg dwerk5o dwe6tar d3wil d4wing 4dwoo d4wyn dys5ag dys6mit dys7tuin 2d- d-r6hod e1a eam6ses eang4 eate4 eau7mont e3ba eb5adr eb9cu. ebou5t ebou6t. eb4re ebrons5 eb5tui ec5cle e4chn ech7tiaa eda7gaat eda5go e3de ed5eis eder7as. ede7ring ede6sap ed5off edors5 ed4ra ed5rep ed6saks eds7kalm ed4sl eds7lafe eds5om ed3sp ed5s4we ed5uit ed2w ed5woo ed5yst ed3yw ee5agt eed6atu eed5we ee4dy ee2f eef7laag eef7lopi eef7rant eef7rek. eeg3l eeg5ru eeg3s4 eeg6sdi e5eila ee2k eek5ass ee5klaa ee5klag eek5lo eek3n eek5og eek7oors eek7rooi eek3w eek6wal eel5ap eel6doo eel7doos eel5een eel7eer. eel5ei eel7indr eeling7s6 ee6lins eel5int ee4l3o ee5lob eel6ood eel6oon eel5sa eel7snag eem7onde eem5ou ee2n1 5eendj een6ema ee5nen 3eenj eenk4 een5kl een7slot een5sm eens6pa een7swee een7topp ee4ny eep7esel eep7leer eep7loog ee4pop eep7roes eep6sam eep7skep eeps5ko eep7skui eep6sti ee2r eer5ap ee5red eer5ee eer5end eer5in ee5rob eer7oes. eer5om eer5on ee5row eer5ps eer7skur eers7lam eer7smed eer6sow eer3u eer6ust eery4 eer5ys ee2s3 ee4s. ees6ala ees6ap. ees6lep ees5me ees7muil ee5sna ee5sny ees6op. ees6pre ee5staa ees6tal ees4tr ee6styd ee4sw ee5syd ees6yfe eet7appe eet7eenh ee4ti eet5in eet7rek. ee6troe eet7roed eet7ruik eet7wiel eeu3g4 eeu5in eeus4 eeu7spoe eeu5tj eeu6ur. ee5yst e3êr eë5aan eëks5t eël7eier eël7yste eë4na e3ër eër7agti eë5ran eër7arm. eë5rod eër6ske eë4sk eët6ste eëts7te. e4faf ef5afs ef5eks 5effek ef5inh e1fl ef5loo e4fly ef5oms ef5oue ef3st efs6tal eg5amp ega5s4k e3ge ege6las egel7as. eges7per eges4t ege6vwo e6ginko eg5ogg eg5rig egs7enti eg6sins eg6s5int eg3sk egs6lot egs6pre egs6pri egs6pyk eg6s7taal egte6re e4g3ui eher6in ehe7rinn eho6kra eib7niz. eid7rok. eid7saam eid7salo eid7sirk eid7skou eid7sku. eid7spa. eid7spek eid7ste. eid7stoo eid7sug. ei1e eie7naan eig6h-n eig7opro eik7aard ei5kno eik7wydt eil6spa 3eind ei4n5ed ein7eed. ein7glas ei4non ein7oord ei4n5op ein7otte ein6sad ein6sep eis7angs ei5sei ei6s5ind ei5sja eis7kamm eis6kaw ei5skê eis6kot eis6laa 4eiso eis7ouer eis6pir ei5s6tel ei5s6tre eit2 eit7hand ei3tj eit7klin eit7nisp eit7onde ei5tra eits5ko eits5l eits5o eit7spor eit7stak eit7stra eits5w eï5mit eï4na eïn7klin eï4no eï4nu eï5oni eï4sl eja7stas ek5aan ekaars8te ek5aks e3kan ek5asg e3ke ek5een eke7naar eke6tam e3kê e4k5ins ek3k e4k5les e5kleu e4klê ek5log e3koe eko6mol ekom4s ek5omsl ekoms5t 5ekono ek5ooi e3kop eko6pap e4k5opm ek5opn ekor6da eko7rum. ekou6st ek5owe e1kr ek5rad e4k5rok e5krom ek5rug ek6sapp 5eksemp eks5esk eks7inge eks7logi eks7loks eks7outo eks5pir eks5po eks6poe eks6tel ek6sten ek4sti eks7uur. ek5uit e4kwê ek5wie e4kwu e1ky e1la e6l5aand el5aanh e6laanv el5aard el5adm el5adv el3af el3ag e5lag. ela7klon e4l3al e5lari e4l5arm ela7slan el5asp eld7adel el4dap el5de. el6d5ele eld7erfe eld7evan eld7olie eld7onde eld7smid e3le el5eien eleis6t elei7sta e6lelek el5erts ele7sett ele6too el4faa elf6abr elf6eit elf7en-d elf5erk elf6lan elf6les el4fon elf7onth elf7ontp el6foop elf7oops el6foor elf7oors elf6ron elf7twyf e3li eling8stell el5inh e6linko el5inv elk7nage elks4 el4kwi el4lv elm5agt e1lo el4ob e4lol el5oli el5ond el5ont e4loor e4l5opd el6ope. e4l3or el5phi els7angs el5sfe el6sind els7indr el6skan el6skom els7korr els7krit els7lof. el5smi els7mora els6nag els7nood els7onde els7oork el6stek el6s7tran els7ware el5swee elt7akke e1lu el5uit eluit6j elui7tji e3ly ely6kaa em5app e5masj eme6lek eme6lew eme6ron eme4s eme7sis. emes5m emes5t e5metf em5eva e4moef em3op em5org emp7laag emp6skr ems4p em5spl e4naf ena7glas en5agt en5akk en5alt e4n5art ena6spe en6d5agt ende7ro. end7raak end7rit. ends7oë. end7sons end7ure. end6wer en5eil en4en e4n5ent 5energ ener6tj enert7ji eng6hor eng4la eng6lor e3ni en4ig en4im en5inh e6n5ink. eni7soms 3enji en6kinh enkom4 enkoms5 enk3w e5nomm eno7ryn. en5out ens7adem en6sall ens7are. ens7eise ens7elek ens7elik en5sen ens5erv ens7esse ens6haw en5sie ens7inga en5sji ens7koei ens7kyke ens7luik ens6med ens7nuk. en4son ens7onru ens7onva en6spei ens7pist ens7pot. en6spou ens7pous ens7taak en6stak ens6tam en6steh ens6tei ens6tel ens7tele en7sters en7s6tes. ens6tet ens6teu ens6too ens7toom ens7trek ens7uil. ens7ure. en5sy. ent5akt en6teks ent7inte ent7rif. ent7rok. ent6sin ent6son ent6spa ent6wen en3ui enu6lin enu5sk enu5st e3ny en-7steg e1o eoe4s eo5fag eo3g4n eoi6ste eop6lek eo3ro eo1s eos4t eo3tr e4paf e4p3ag epe6loo ep5emm ep5epi epers7te 5epidem e4p5int ep4la ep5lap ep5ligg ep5lus epoet4 epo6nin ep5ops e4p5rei eps7ameu ep6s5eis eps5id ep4sj ep4sk eps7kano ep5ski eps7kohe ep4slu eps7luik eps6oms eps5on ep4s5pr eps7waar ep5uit e1ra er4a. er5aan er5afd er5afh er5afsk er5aft er5afv er5afw er3ag era7gree era7kles er5aks er5akt er5alb er6ald. er5alt er5ana e5randa e4rapp er3ar era6ser era7uitv erd7ryle erd7slip erd7tree er3dw er4eb er6eenk er5eers er5eff er5eie er5eil er4ek er5ekst er5elm e4r5emm e6rengt e4reni e4renj er5erg er5erv e3r4es er5esel ere7spio eres6ta ere6stp ere7temm e5rewa e1rê er4fh er6flaa erf7leen er6flet erf7lett er5flo erf7lug. erf7lus. erf7omhe erf7oom. er4fp erf7reuk erf7ruik erg7aren erg7lyn. erg7renm erg7rymp erg6rys erg6sho erg7stra erg7uitj er4id eri5fr e3rig eri4g5a e4r5ind e6rink. e6rinna er5ins e4r5int e6r5ital eri7trea erk5aan erk7esel erk6has erk7ink. er6kins erk7inwy er4kj er6klat er5kle erk7onde erk6opn erk6s5on erk7spas erk6sto erk7uurr er6kweë erk7weë. erk7ywer er5lik er5lui erm4a erm7aanh erm7afsl ern7eiwi ern7kwes er4nm er4nn ern7oes. er4nr e1ro er5oew er3oë er5ogg e3roï e5rok. e4r5oks e4r5oli er5om. er5omh er5oms er6ona. er5oog e5room er5oond e5roos e4r3op e5ropa er6opla e5ropo e4ror e5rora 5erosi e4r5oss ero7stil er5oud er5oue erou6t. erp7anke er6pinh erp7inho erp6lan erp7ruik erp6sig err6ein ers7assi er6s5eli ers7ete. ers7inda ers7jean ers7kaia er6skaj ers7kaju er7skake ers7kaki ers7kete ers7kiss ers7koet ers7koor ers7kop. er5sky ers7less ers7lone ers7luid ers6mal er7smara er6smat er4s5om ers7onvr ers6opn ers7ower ers7pien ers7put. ers7scen er5ste ers7tele ers6teo ers4ti ers7treg ers7waar ert5aan er6taap ert7aap. er5tap ert7ape. er6tend ert7end. er5tes ert6hal ert7jakk ert7opin ert7orre er6tres ert7rok. erts5l ert7uur. ert6wak er5twi e1ru erug3 er5uin er5uit er3uu e1ry ery7doel ery7salf erys6ma ery7smaa ery7suur ery7trek e5saan. e5sage es5agt es4ak es5all esa6mol es4an es3c es4dh e3se e4s5een e4s5epi es4er e3si es4ia es4ie es4if esi6gei e4sill esin6s5i es4it e2sj e4s5ke. es5kle eskor6s eskors7t e5s4kut e3sla es5lem es4lip e1sm es4me es5me. es5men es9mè. e5smou es4mu es5nie es5noo es4ny esoet6j esoe7tji eso7fagu es4ol e3s4oo es4ou e1sp e5spel es5pen e4sper es5pet es5pir es4pli es4pra ess6opv e1st es4t. e5stad es5tas e4s5te. es5tea es5teli e4s5tes estes5o est6her es6tik. es5toi es5tos e6strak es4tre e5stuk e3sw es4yd e4t3ag eta7stas e3te e4t5eie ete5r6aa etie4l5 5etike et7jie-k etk6ysi eto6nop et5opv e4t5ord e4t5ram e6treke e6treko etre7kor et5rim ets7fyn. et6skat ets7kato ets7kous ets7krie et6s5lap ets6maa ets5ong et6spaa et4spr et6stek ett6re. et5uits et5unie et4wi et5win et4wy et5yst 2eu. eug6rie e3uit euk7inte euk4l eul7eien eu4loo eu5mon eum7uitg eu4na eun6sla eup7aand eu4ra eur5aa eur6aal eu5ral eu4ree eur7eet. eu6reg. eu6regt eur7egth eur7ekst eur7elem eur7spar eu4sa eus7ape. eus7jig. eus6kot eus6tac eute4l eu5tem eu3tr e1uu 2eu- eva7kwaa eva6les evr6ore evu6es. ewal4s5 ew4ar ewee4 ewe7gaan ewe7goed ewe7inde e5weis ewe6nee ewen8stes ewe6res ewe7span ewik4s ewiks7te exy7ste. eyn4o e5yste e3yw e4zka ez9ra. è1r ê1 êe4ro êla7flui ê4rde êre6loe ê4rhe 1ë ë1g ëi3e ëk4sk ëks3p ëks6pek ëk4st ë3laa ël5agt ël5alb ël5as. ë4lei ël5ent ëlf4l ël5fle ë5loop ëls7kuil ën5agt ën4tr ënt5re ëpre4 ër5aan ër5afd ër5off ërog4 ëro3s ër5owe ërs7kent ë1ry ë1s 2f. 1fa f5aanb f3aar f3ad 2f1ag f4agi fah7renh fai6r-n fak6ste faks7te. fan4t5j fan4tr fant6s5t f3ap f3art faru6q. 2fb 2fd f5dein fde4s fde7sake fde7sess fde7skei fde7stor fde7stra fde7sust f3d2w 1fe 4feen 3f4ees f3eie fe4l5ap fel7asem fel7enti fe6loon fel7oond fel5s4m fel6spoo fe4lu fe4ly fel5ys fer6skr fers7kra fer6sku fers7kui f5erts fe2s fes3t fet7ete. f1f ffe6las ffe6ret ffe6tet ffi6eek ffies6m ff5rei f1g fge7sper fg4ha fg4li fg4ly fgod4s5 1fi fi3d fid6ji- fie7ekst fie7lafo fie7smaa fie4s5o fie6tol fi5lag fil4m5a 4finr fi5sto fit4z 2f1k fkom6st fkoms7te fla4p flap5o f2le f5lees f5lese fle4t flet5j flex7or. 2fli 5f4liek 3f4lit 2fm fmo4no f1n fni4s3 1fo f3of 4foff fok4s5t fol4k3 4foms 5fonds fond6sk fond6st fonds7te f5ontb 5fonte f5ontl f5oorl 2fop fo4po fop7spen f5orde f3org for7oksi fo5rom fo3ru fos7feen fout5j fox7hill fox7stra fp4sa 1f2r frag6aa 4fram f4ras f4ren fre4s5k 4f3rig fri6too f4rod fru5ga f3ry 2f1s fs5agt f4s5ank f4s5eko f4skon fs5log f3sm f4sma fs4me fs4mi f3sp fs4pl f4spro f4s5tak fs4ti 2ft ftre4 ftre5d ftrek5 1fu fu4ch fur6ore fu3so 4fuur f5uur. 2fv fva4l 2fw 1fy fyn7goud 2f1ys fyt7appe fyt7jie. 2g. 1ga g4aai gaam6s7te g4aan. g5aanbi g6aandh g5aanl g5aanw g4aat 4g3add 2g1af g4afo 2g1ag g4agr ga5gre gag6rep gak4l ga5kla gal7afsk gal7appe galei5 gal7oog. gan6gra 4g5anke gans7ke. g3app ga3ra 4g3arb 4g3arm gar4s3 gars6ti gar7stig g5arti ga6sarm gas7arm. gas6mok ga4so ga5sol gas6pel gas6tre ga4tr gat7ruik gay7nor. 2gb gbys4 2gd gde7roof gdut7jie g3dw gd4wa 1ge ge3d gedi4s g5eenh gee6tal geet7al. geës3 geë6sti ge3f 4ge4ff gef4l ge1g2 4geg. geges5p geg6uil g3eie geï7migr ge7k6lik. 4geks gek4y gel6agk gel6dad gel4do ge5lol ge5loo ge6loon gel7oond gel6s7te. gemi7au. gem6opp 3gen gen4dr gen6dur genes5t 4geng ge4oi gep4a ge5pag geper6st gepon6s 3ger ge5rap ger6ard ger5ete ger7iden ge6roef ger6ogg ger6spo ger5sw ger6uit ge3sa ge5sfe ge5sin ges7jagt ges4k ges7kade ge3sl ge3s4m ge5sne ge3sp ges7perb ges7pers ges7pes. ge3st ges6tas ges6tig ges4w ge5tja ge3tw ge3ui ge5um. gev7woes gewens7te ge1y 2g1f g3fl gf4li 2g1g2 g3ga gga7kwee gga7stre gga5t4j gge6sti 2gh 5g4hoer gho7ghok gho4l 5gholf g4hs. ghu6moe 1gi g5iden gie6far gi4fa 4gimp gin6gaa 4g5inri gip4s gip7siet gis7enti gi5tra git5sw 2g1k gkaar4 5g4lans gla4sa gla6sel gla6ska glas5o g4le. 5g4len. gli6don g4lif gli6gur 4glik g4lim g4lip 3glis g4lob 4glod 3g4loe g4lof 3g4lom g3lop 3g4lot g4lo- g3lus 3g4luu g4ly. 4glyn 2gm gma7skui 2g1n gneem5 gneet5 gnie6ko 1go god6sak god6sid 4g3oef goe7krui 4goes g5oes. g5oeta goe7the. goë7lary 2g1of 3gogi gol4f5o 4g5olie go4mag 4g3ong gon6sto g3ont goo5gl 4g3oor 2g1op go5pla 3g4opo g5orig go3sl gos7pelr g5osse go3s4t gou4d3 goud6a. gou7dief gou7dini gou7dink goud6s. gow7rie. go9ya. 2gp 1g2r g4rab g5rak. gra4ma gra7mado gra4m5o g4ras gra4s5a gra4se 4g3red g4ree4 g5reek greep5 4greë g4ren gren6st g5rese gre4sp gre6sur gre6tji gret7jie g4reu griek6s7t grie6t5j 4grig gri4p g5rit. 4g3rok g4ron 4g5rooi g5rook g5room g5rowe 4grug g5ruim 4g3ryk 4grym gry6ste 2gs g2s1a g5saam gs3ad gs6ade. g4saf gs5agt gs5aks g5sala g5sale gs5ana gs5ant gs5app gs6appe gs3ar gs3as g4s5een g4s3ef gs5eis. g6seise gs5eko gs5eks g5sekt g4s5ele g4s5eli g4s5ene g4s5est g4sew gs5ewe gs3f g5s6feer g4sid gs5ide g6simpa gs5inde gs5ini gs5inl gs5ins g2s3j g2s1k g5skaal gs5kab g5skad g6skapa g5skatt g5sked g5sker g7skeur. gs7keurd g3ski g4s5kin g4skl g5skof g5skole g4skom g5skoo g6s5koor gs5korr g5skot g5skou gs3kr g2s3l g3s4la g5s4lop gs3m g5snel g2s3o gs4ol gso6pro gs4ou gs3p g5s4pel gs5per g5spes g3s4pi g6spill gs4poe gs6pore g7sports g5s4pru g1st g6s5taak g4s5tab gs6tabi g4stak g4stal g4star g4s5tek g6stelg g6stera gs5teri g6sterr gster6s g6stese g4sti g5stigt g4stoe g7stoele gs5toer gs5toet g4s5ton gs5trad g6strak g6stran g6strap g6strib gs5troe gs7troon g6struu g4s3ui gs3w gs6werw 2gt gte7eenh gte7lagi gte6ras gte6rer gte4ro gte7roer gte7rol. gtes4 gte7sfee gte7smee gt5uri 1gu gu2a gu2e gu5ela guid6o. gui6rla 4guit 2gv 2gw g3yst 2g- 1h2 2h. 2ha. hal4f3 hal6m5ag 4halo hal4s5k hal6s5tr ham7pagn ham6skr hams7kra han6dan han7dja. han4dr han4du han6gli han6gor hangs6l hang5s6w han4s5k han6ska har6dop hard7op. har6sel har6sol har6spa har6t5aa har4t5j har4to har7toem ha4wk haw7shan hay6eli heb7lus. hee4l heer8s7te. hees6e. heg7orga heg7rank heg7spyk 5heid. heid7stem he4ko hek7saan he4k3w hel7ange hend4 hen4so he2r her3a he9ra. her6akl he7rald. he5r4an he3re her7egpa he4r5ek he4r5ev herf4 herfs5 her3i her6ib. he5rid he5rod he5rol her5ond her7ontm he5ros her6oss he5rou her5ow her7sche her3u her5yk he4sp hes7peru he4s3t hete5r6o heu6paa he3us hev3 he4vr hewen7st hie4r hier7in. hie7roni hie7rony hië1 hil6lbr 5hings hing6s5t hipe4 hi4rl hi4sp his5pa hi4v- 2hl h3li 2hm h3ma 2hn hode6sl hodes7la hoe7kaai hoe6kys hoe6spi hoe4s5t hoër7op. ho4fa hof5aa hof7amp. hof7uits hog6hok hoi7swer hok7rakk hol7aar. holes5 4holf hol5in hol7oog. 4hon. hon6daa hon6dag hon6dro hop7land hop7smaa ho3ro hor4s hor4t5j hos6hol ho4ta hou4t5a hout5j hou6tol hou6tom hou6who 2hr hre6sto hrie4 hries5 hris5t h3te h3to hu9go. hui6daa hui6dui hui6sef huit6ji hui7tjie huk6hun hul4p5a hul6pek hul6ple hul6por hul6ste huls7te. hu3mo hum7oes. humus5 huter6s hut7jie. hut6spo hut6ste huts7te. h5vill 2hw hyg7roma hys3k hys7tang i1a iaan6so iaan6sp iaan6st iaans7te iam7son. ia4nop ias6koo ia5spo ia5sta ia5s4tr i4baf i4bag ibou6s. ic5ky. i2d i3da ida7groe id5agt idde6ra i3de ide7snui i3dê i3di idia5s id4ja i5djan i3do i3dr id2s1 id4s5et ids7inoe id4ska ids7kerm ids5kr ids3l ids7lags ids7nye. ids3o ids3p ids6pa. ids6pek ids6pie id6spil ids6pri id6spry ids7taal ids7tee. ids7teks ids7tele ids5ti ids5toe id6s7trek ids7ure. i3du id3uu ieding6s7 ied7ione ied5rol ied3w i1ee i4eee ie5een ieë7aard ieë6lys ief7alar ie5fie ie4f3r ief7stal ief7uitg ie5gla ieg7loka ieg7riem ie6grit ieg5st iek7asyn ie5ke. ie6k5erv iek7esse ie5kie ie6klaa iek7laai ie4kni ie6k5ond iek7ople ie6kops iek7opse iek5opv ie4kre iek7revu iek7rigt iek7ware iek7wees ie4k5wi iek6wos iek7wyd. ie4laa iel6afo ie6lene iel7oor. iel6san iel6s5on ien7anal ien7glor ien6kro ien7olie ie4n5oo ien4s ien7sakk iens5or ien7sout ien7span iens5t ien7stam ien7stel ien8stele ien7stet ien7stoo ien5suu ie4n5ur ie6poog iep7oog. ie6proo iep7rooi ier7afma ie6rafs ier7engt ier7eter ier7neff ier7omtr ie4r5on ier6oni ier6ony ier7swee ies6amp ie5se. ie6senk ies7enke ies7ents ies7ferw ies7kaf. ie6skon ies7kop. ies7kraa ies6kry ies7laag ie6slep ies7lepe ies5li ies7luik ies7meub ies7mooi ie3so ies7oes. ies5ond ies7oorp ie6sopn ies7opne ies7pane ies5per ies7plig ie6s7taal ies6tas ies7tee. ie6steh ies7tele ies7tent ies6tin ies5uil ie4s3w iet7aans iet7aard iet7alba ie5te. iet7erts iet7omse iet7reke iet7reko iet4sl iet7uie. ie5twi ie4tys i1eu i4eub i4eud i4eug ieu7grie i4e3ui ieu7ing. i4eul i4eum ieu7skot i4euu i4euv i4euw ie5wie ie4w- ie5yst ie-7klik i3èr i1ê iël6sku iën6tji iënt7jie ië4s3t i4fei i4fim i4fin if1l i2f3r i4f3ui i4g5aan i4gap igare4 igaret5 ig5eff ige6naa ig5ete ig5ins ig1l ig5loe ig4op ig5opt ig5org igo7roos ig5res ig5roo i4g3ry ig3sa igs6ins igs7kaps ig7skend igs5ko ig5sku igs6mee igs6ona ig5soo igs7poei ig5sti ig7stoei igu7era. ihu6ahu i1i ike6roe iket5j ik5kli i2k3n iko6nat i1kr ik6sakt iks7akte iks7iden ik4sin iks7inve iks7juk. ik6skom iks7paar iks6pad iks7pare iks6tik iks6tuu iks6wel ik5wan i4k3we i4kwy 2il i1la il5agt ila6too ilbe6st ild7agti ild7smaa ild6stj ild7temm ilet5a ile6tji ilet7jie ilf4l il5fli il5gha ilinde6 illo4w 3illu il4m5at ilm7oper i1lo ilo5sk ils7insp ils7orde il4spr ilt7aar. i1lu i2m i3ma im5agt i3me i4mek im5eks ime7laar iment6s ime4s imes5t i3mê i3mi 5immigr i3mo i4m3o4p imo7theu 5implik i3mu imu6maa in5aard i4naf i4n3ag in5akk in5arg in4d5aa in4das inder7as 5indiv ind6oef in6doog ind7oogm in6d5oor ind7sleu ind5sw 3indu in5dwi inee7tji ine5ra 2inf ing7aars in5gan ing7eter ing6hpa in6gind in6ginf ing7infr ing7inst ing6leb ing6ope ing6opl ing5ou ing7pseu in4g5ru ing7saag ing7sap. ing7see. ing7sekr ing7seku ing7sfer ing7sin. ing7sinj ing7skal ing7skêr ing7skud ing7slep ing7slym ing7sofa ing7som. ing7somm ing6s7pil ings9telle ing7stin ing7suie ing7suil ing7swel ing7uil. i3ni ini6gaa in4ik in5inf 5inisia ink7erts ink7laag ink7ler. ink7nerf ink5nu ink7ogie in4kol ink7olie 5inkom ink7ring in6krol ink5st ink7wit. 5innam 5innemi innes6t inne7ste in5ong ino7skaa in5rag 5inrig ins7epou in6s5ete 5insets in4sg ins7kaps ins6kin in3sl ins7molt ins7moor ins6ond 5inspek ins7prie ins4t 5insti insti7t. ins6ton ins7twis int7appe int5ess inte6s5t int6he. int6uit int6wyf inu5e. 5invlo i1o io3pr ior6ubr io1s ios4k io5skl ios4p ios4t io3tr i2p i3pa i4p3ag i3pe i3pi i3pl ip4lo i3po ipo4s5t i3pr ipre4 ip4s. ips7kopi i3pu i4pui i3py i1r ir4ch irke4 irkel5o irop4 iro5pr iru4s i4rwa is3ag i5sagi i4s5aks i6sangs is3ar i4sarg is5asp i4sav is3c i4s3ei i4s3et ise5um i5sfeer ish7nie. i4s5int is5inv i2sj i4sj. is5jan is5joe i2s3k is4k. i4ska is6kaaf is5kan is4kê is5kui i2s3l is5laa i5slag is3m i5s4mit i2s3n is5oes is5ond is3or is3p is4p. is3t is4t. is4th isto7pho i5s4tyn i4s3ui i5suik isu6maa is3w i2t i3ta it3ag ita6tis it3b i3te ite7dwal ite7glas itek7te. ite6mas i5tenh it4er ite5ru i4t5ete i3tê i3ti it4in i4t5ins i3to ito5fa ito7plan ito7rowe it1r it3re it3ry it4sc it5ser its5ete its7jood it4s5oo its7perk its6tek its7tori its7uur. i3tu itu6saa it5win i3ty ity7sokk itz7laan i1u ium1 iu4ma iu4me iu4mi iu5mie ium6uur iwel6s5k iwe7mos. iwes4 iwe7spor iwe5st 1ï ï2m ïn5akt ïn3o ïns4t ïn5und ïs5lam ïs3t 1j 3jaa jaar6s7kr 3jac ja4cq 3jag ja4ga jan7ghai jan7knap jap4l ja5pla 3jare 3jari ja4sm jas7pant jas6tas jaz4z jaz7zeri je4kn je4kr jek7rasi je5rop jes7nië. jes4t je4t3r jet6sjn jeu4g 5jie5kn jie6nan jie6nol jien5s 5jieon 5jieop jie6ska jie7skap jies7kat jie6ski jie6skop jie6s5lo jie6slu jie6sol jie6son jie6spa jie6s5tr jie6sui jie7suik ji4eu jin7gope ji4rp job4s3 joe7kwee joen6sk 5joern 3jong jos6afa jou7kuit juit6sp juk7riem 3jun jun6kre 2k. 1ka k4aal k5aand kaan8s7te. k5aanw kaar7se. kaars7te 5kaart kaar6ti kaar6t5j kade6la kade6sl 4k3adv 5kafee kaf6oef 4kafr 4k3afs 2k1ag 5kagem k4agg 5kagge k4ago k4agr 4kaks kal4k5a kal4k5l 5kalko kal6koo kal4kw kal4s5p kal4st 3kam kam6par kam6ple kams4 3kana kaner5o 3kank kan6ont kan6sko kan6ste kans7te. 3kant kan4t5j kant7om. kan4t5r ka4pak 5kapas kap7inte 5kapit kap6lak kap7lat. kapo4 ka5pri kap7seis kap6spr kap6stek 5kapte 3kar. 5karak 4k5arbe k5arm. ka5roo kar6oor kar4st k5arti kar5to 3kas 4kasg kas7laai kas6maa kas7traa ka5s6tro 5kateg kat7etes kat6har kat6hu. ka4too kat7ryk. kats4 kat5sw kat7uil. kay6aku 2kb kbe6kwi kbout7ji 2kd k3de 1ke kede6lo kee2 keel5a 4keen keep6s5t keer6so keer6ste keë6laa keël7aar 4keff kei6dro keids7pr 4keik keis4 kei5st 4k3eks ke4l5ak ke6lane kel7anem kel7assi kel7eenh 4k5elem ke6linb kel7inbr kel6mag ke4l5ou kels8onde kem6afa 4k3emm ken6aar ken6dra ken7eel. 4k3enj 3kenm 3kenn ke4nou ken7son. kep7laai kep7ler. ke4p5lo kep5sk ker7een. ke4rel ker7els. ker7flan 3kerk ker6kal ker6kin ker6k5or ker6kow ker4kr ker7kris ker6kui kerk7uil kerk5wy ker6m7eng ker6naf ker6nei ker6nen ker4n5o ker7oes. ke4r5on ker6pru ker6set ker4sk ker7skil kers7kom ker6slo ker4sn ker4so ker7son. ker6s5pi kers5w 4kerts 6k5ervar kes6el. ke4sn ke6trol ket6ska 5ketti ke4tu keu6ror 3keus keut7jie key7kleu key7nooi kê4rb 2k1f 2k1g kga7laga kge5la 2kh kha7yeli k4hoi khu7khun 1ki ki2e kie6dro kie7laai kie6mas kiem7as. kie6sent kie4s5k kie7skry kies5l kie6slo kies7tan kie4ta kieu5s ki4kl ki4ma 4kimm 5kind. 6k5indel kin5dr 4kindu k3inh 4kinl 4k5inst kio4s kios7ke. kip7ling ki4rc 3kis. kis7obli ki5s4po ki5s6tew kit4s kits5k 2k1k kk4ag kka7smaa kka5str k3ke kke6nee kker5kr kk4li 1k2l k5ladi 4kland k5lang k4lank klas3 klas6e. kla6sin k5leerd 4kleg k5lege k4l4ei 4klel 4k3len 3kle4p klep7as. k4ler 5klere kle5us k3lê 4klied k4lier 4k3lig 4k3lik 5klikk kli6kop k4lim kli6moe k4lin 5klink k5linn kli4p3 k4lis kli7sjee 4klog klo6kon k5loos. k4lou klub5h klu6bre 4klug 2k3ly 2km kman7spo 1k2n k4nap 4knav 5kneg. 4knei 4knem kne4t knet5j 3kni kni6kla kni4p3 knoe4 knoe7te. 4k3nom k5noot k4nop knor7os. 1ko kob7rego 3kod 4k3oef 3koek koe6kei koe4l5o koe5pl 3koer koe4s3 koe7sist 3koë 4koë. k4ofi 4kogi kok7onth kok6skr ko5lag kol6for 3koll 3kolo 3kolw 3kom kom7aan. kom7bina 4komg kom7ghad k5omhu kom7miss kom7saal kom4sp kon7atoo 4k5ontl kon5tr 4k5onts 4k3oog ko4op 5koord 3koö ko4pag kop7ape. kope7la. kop7las. 4koplo 3kopm 4kopn 5kopno ko4po 6kopper kop7uits kord7aan kor6doe kor6foo k3org koring7s k3ork ko3ro 3korp kor4s5l kor7sten kor4t5a kor6tji kort7jie 3kos kos7eetp kos7inko kos7juff ko4sk ko5ski kos5ko kos5pe kos5taa ko4t5ak 5kotel kous7te. kou5tj kovi7ev. ko4vk ko4vs k5owerh 2kp kpro6pa kp4si k2r k5raad 3kra4g kra7gers krag5o k5rak. 4krand 5krank 5kredi 5kreet. k4reëe 4k3reg 4k3rek k3rel k5rese 3kret 4kri4f3 4krig kri4k3 kri6moo 3krin kri4p krip7lee 3kris 4k3riv k5roet k5rolp 5kroon kr4or 4k3row 4krub 3krui 4kruim kru6kas kruk6s. kru4l k5rusp kry6fin krygs5t 4k3ryk kry7sket 3kryt 2k1s ks6aan. ks5agt ks4ak ks5chi k4s5een k4s5erv k4s5eti k3si k6singe ks5ins ks6jari k4skan ks5kin k4skon k4slê ks3li k5s6maak ks5moo k5smou k2s3n k5snob k4sob ks5obj k4s5ond ks5onl ks5opk k2sp k5spek k5spel ks5pen ks5per k5spes k3spi k4spir k5spra k5spri ks5pur k6s5taal ks5tant k6steken k6stemp ks5tens k6stera k6s5teri k6sterr kster6t7j ks5tet ks5tip k7strado k6s5trah k5s6trak ks5tur ks5tuu k3sty ks3ui k4s5ure ks3w k5swei ksyn4 2kt kte6rad kte6ron kter6sp ktes4 k4the k3ti k3to kto6rev k3tu kt4wi 1ku kud7aksi 3kuik 4kuim kuin4 kuins5t 4kuit kul6der kul6plo kul6poo 3kult 3kun 4k3uni kun6sin 3kurs 3kus ku6seen kus7lang kus7node kus7taak kut3r kut6slu kuus6te kuu7ste. 2kv kvang6s 1k2w 4k5waar k3wae k4wan 3k4war kwa7skaa k4week 4kwees 4kweg 4k3wer kwê7lafl kwik3 kwi6kwa 3kwis 2k3wo 3k4wot k3wu ky4fa kyk7uit. k1ys 2k- k-5kli 2l. 4laanb 4laanh 4laard laat7slo laat6str lad7onde la4du 4ladv 2laf la4fa l3afd 2lag l4ag. la4ga la5ga. la5gas l4agi la5gie l4agl lag7lag. l4ago lag5ri lag7some lai6rgo lak7albu lak6led lak7okul lak7oore 4l5aksi lak3w lak7ware lamb7da. la4m5oo lam6pli lam6pol lamp7oli lam6sko lam6sle lam6spe 3land lan6daa land7aar lan6dad lan4d5r land6sta land6s7te lan6gaa lan7gnol lan4go lang7ste langs8te. lan6gur lan4k5a lan4k5l lan6kop lank7ope lan4k5r lan6kwi lan4s5k lan4sp lan4s5t lan6taa lan7taat lan4t5j lan6tre 4lantw lap3r 4l3art las7elek las6ie. la4sn la4so la5sol la4sp las5pa late5r6a 5lawaa lba6spe lbe6kne lbo6wvi lb4re ld5amb ldan7ha. ld5apt l4d5een ld5eis lde6rat lder7os. ld5ins ld3of ld5oor ld6oor. ld5ord l4dow ld5owe l5draa l4d3re lds4k lds6maa ld3so lds6ond ld3sp l4d5uit 1le lec5tr lee2 lee4g3 4leep3 leer5a leer7eis 5leerl leer5o leer5s lee4s lees7tra lee7tjie lee7vaar 4l3eff leg7slot 4leien lei7gleu lei6kaa lei6naa lei6not lei7skoo lei6spa leis7pan lei7spir leit5s lek7loti le4kn lek6suu 3leli 5lengt 4lenj len6sel len6ste lens7te. len6tji lent7jie le5pel lep5li lep7oog. lep7ratw lep5sk lep6szy leps7zy. ler4a 5leraa ler6kam lerk7amp lerk5sp 4lerts le4see le4set les5ete les6hab les7insl le4ske les7kes. les7lie. les7onde le4s5oo le3st les7taak le4ste le5stel les6tin les5tra les4ty les7uur. les7wete l5etan le4tc let5em let7oorb let7rol. let6sko 4leuf le3u4m leun5s leur7eg. leu4r5o leute4 lew6ein 6l5ewena 4l5ewig 3ley 1lê lê4rw lf5aan lfa7stra lf3ei l4fek lf5eks l4fen l4f3ev lf4ie l4fin lf5ing lf3l l5flap lf5onde l5fone lf5onts lf3op l2f3r lf6skar lfs7karm lfs7kop. lfs7kuil lfs7nier lfs7oog. lfs7perk lft4w l4f3ui l4f3uu l1g lg4ha l4gli lgo7lagn lg6ordy lgs6mee 1li liat6ji lia7tjie 3lid lid7onts 3lied lie6gli lie6kwy lie5la liers5w lie5sme lie7steg lie7stys lie7swak 4l3i4eu lig7inte lig6las lig6ny. lig7omge lig7rekl lig7riet li4gro lig7skag lig7sona lig5s4p lig5s4w lig7ure. lik7aspa 4likk 5likkew li4kl lik7opsi lik6see lik6sju lik6soo li4k5wa lin6gid lin6gin lin6gli lin6goo ling7ooi 4linh lin4k5l lin4kr l5inli 4l3inr l5insp lin4t5j 4linv li4pa li4p3l lip5la li5plo li6poml lip7omly li4p3r lips4 lip7soom 5lisen l5item liter6t7j lit3j litjie6 lit3r lit7sha. lit4sp lit4s5t lit6zdo ljus4 l1k l4kaf lka6tio lkat7ion lk5een lks7emos lks7epos lk6skap lk4sku lk4sl lk4son lks7ower lk5spe lk5spr lk6stel lks7tell lkter6t lktert7j lk5uil lk5wat lk5wit l4kwy lk5wyf 2l1l l3la llat6ji lla7tjie llei5s lle7knop lle6rui lle6swe lleve7ë. llo5sk lls7moor l4maf lmo6kal lmo4no lm3sm l1n lne4s lob7eend loe6dal loe6det loe7dja. loe6don loe4d5r 4loef loe6gos loeg7os. loers7te loe6skr loe4st lof7opri lof6spa 4logig log4o lo5gop log7sot. log4st log7stok lo4k3l lok7onde lok7swin lo5kwi l5olie. lomer4 lomert5 loms4 4lond lon6gaa long7aar lon6spa lon6ste lons7te. 4lont lon4t5j 3lood loofs5w l4oop 5loopb l5oore 5loosh loo7stra lop7emme 4lopl lop6rys lo3ro lo5ryn 5lose. lo4sj lo4sk los7laat los5ta los7trum los7wikk lo4tak lot7riet lot7ruïn lot7swan lot5ui loui7sa. lou3t lou6wna lou6wre lou6wtj lo4wr low5ry lox7era. lö4jd löj6don lp5aan lpe6nin lp4he l4pon lp5ond l1r 2l1s l4s5aar l4sad ls5arm l4s5asp l4s5eko lse4l lse5le lse6mek ls5erva ls5fei lsg6haa lsi6g5aa ls5jas l4s5kin l4skon l6skorr l4skre l4skru l5s6maak l5s4mee l4snaa ls5opw ls6plet l5s4pli l4spu l3st ls4ti l6stoeg ls5waar ls5wet ls5wyn l4t3ag l4t5amp lta7spie lter6sk lt5oond l5t4wak lu4bh lu4bl lub5le lub7loka lu2g1 lug6er. lu5gub 3lui. 4l5uie. lui7masi lui7slan 4luit luk5raa luk7rake luk6s5pa l5unie. luns6a. lur6pag lus7moor lu3t4h lut6zpu luus6te luu7ste. lva7soor lve5ti lwe4r5a lwe6rui 1ly lyce7um. ly4fe ly4fo lyk7aant lyk7lope lyk7lug. ly4kn ly4k3o lyk6ont lyk7rede lyk5sk ly4ma lym5ag lym7uint 3lyn lyn6aaf ly3pl ly3sp lyt7ring 1m 2m. mac7dona made7us. mae4s m1af 4mafd m4afo ma5fro 4mafs mag6sta ma4hd mah5di mak6lot ma3kw ma5lag mal7thus mamat6j mama7tji man7djar man3g4 man7gona man6n-p man7salm man7spen man6spr man6s7taa man6sto man7ure. map4l ma3ra mar6kek mar6kle mar6kom mar6kon mar4k5r mar6lpr mar4s5k mar4s5t mar6tro mary7na. mas6koo mas6kri mas6kui mas6tek ma5s4tr mat6hes mat7thys may7nard 2mb mb4re 2md mdo6poë mdop7oë. md5soo m3dw md4wa 4meder mee7kole mee5kr 5meel. mee5l4o mee5ne mee7reis mee7reke mee5sl mee7spre meest7al mee6tre me3ga megas4 mega5st 4megt mei6nee mel6aar mel7ekwa mel6kal mel6kjo mel6kla mel6kna mel4k5r melk5s mel4k5w mel7spul mel6too mem7phis men7angs men7eise men7opga men6sky men6snu men4s5p men6s5ta men6tin men4t5j men4t5r me5phi me4rak me6rass mer7asse mer5ast mer7dein me4rei me6reng mer7enge mer7esse mering8s9taa mer6kli mer6kna mer7kopn mer4kw mer7kwar mer5oes mer7onth mer7treë mes4a me4sal me4s5ka me6s7koor me6skor mes7kore me6skro mes7kroe me4sl me5slu mes7moss mes7port me6stas me4s5to mes7ware me4t5ee met7emps meter6so meu6las meul7as. 2m1f mfloer6 2m1g mgang4 mgangs5 mgeper6 mges7per 2mh mh4ei 4mid. mid7osea 4mids mids5t mie6kas mie6kwa mie6ret mie4r5y mie6skr mie6taa mie6tji miet7jie mig6re. migu7el. mih7rab. mil6taa min7gopl 4m5insp 6minstu mi4rl mi3sf mis7sêr. mis6tkr mis6tok mit7swa. mi4v- 2m1k mkaar4 mkom6st mkoms7te 2m1l m3la 2mm mma5sp mmas6to mma7stor mmat6ji mma7tjie mme7loor mme6res mme4r5o mmi7stok 2m1n 3mod mode4l mod6jad 3moe moed4s moe6nes moe4st mof6lam mok7alba mole4s5 m5olie. mol4m5a mon6dch mon6dop 4m5onts 3moon moor6da 2mop m3opl 4morg mo3ro mor6sju mor6spo mor4s5t mo5saa mos3f mos7fles mos7inen mo4ske mos7keë. mo5sta 3mot mote7us. mot6heu motor5a mou5fl mou7slip mou6ste mous7te. mou6tek mo9ya. 5môre. 2mp m4pag mpa7gne. mp5agt mpe6lys mpen6to mp4her mp5ops mps7kraa mp5sli mps7taal 2m1r 2m1s ms5app m4s5kat m4skon ms7kraal m5slin m3s4me ms3op ms5pen m6s5taal ms4te m5steg m5steo m3sw 2mt mter6t5j muc7klen mues7li. muf7smaa mui6les 4muit 3mul mum7aant muns4 mun5st mun6tou mur4g mur7gie. 3mus 2mv mvi6tra 2mw myl7afst myl6sla 3myn myn7ent. myn7impa myn7inge m1ys 2m- 2n. 1na 3naal 3n4aam 4n3aan 6n5aardi naar6skr n5admi 4n3adv nae6lys nael7yst n1af n4afi naf6lad nag6aand na6gaap na4g5ap na6gemm nag7emme nag6las n4ago nag5ron nag3s 4nagt n5agtig na4gu nai7set. na5kli nak6lip 4nalf 4nalt 3nam na3p4l na3pr nap7roet 4n3arb 4narea na3s4k nas7klip na3s4l nas6maa na3sp nas6pel nas4pr na5s4ta nas6ten nas6tor na5s4tr na5stu nas6tuu nas4w na5swe na5t4ha nat6jie nat7onde 3nav 5nawee na9yl. 2nb nba6chs 4nche 2nd nda7gesk nd5akt nd5app n4d5arb nd5art n4d5ass nda7stoe nde7eier n4d5een nd5eg. nd3ei nd5eksa ndel8s7kor ndel8s7taa nd5emm nde6rad nde6raf nder7af. nde6rar nde6rem nde6r7ent nde6r7ess nde6rim nder7in. n6deros nde7rosi nde7sill nde6zvo nd5ide ndi5go nd5ins nd3of n5dome nd5omt nd5ond nd5ont n4d5opb ndo5st nd5rak nd5rat n4d3re nd6resd nd5riff nd5riv nd5roe nd5rok nd5rot n6druim nds7ertj nds7geru nd6sinl nds7kenn nds7koor nds7kraa nd6s7laag nds6leg nd5s6maa nds6ons nds7oorn nd5sor nd6spre nd5spu nds7taal nd6stek nds7toet nds7troe nds6wee ndt6wis ndu4e n4d5uit ndu7kraa n4d3ys 1ne nebe6st nec7ticu 5neder nee2 nee4l neel5a n4eem 4n5eend 4n5eenh neer5o neer5s nee6tew neeu3 nee7uur. nee7woor 4neff 4neg. ne5gla n3eie 4neil 4neksp n5ekspe nel6lma ne6loon nel7oond nel6spo 3nem nem6afi nen4sl nep7olie 3ner. ner6faf nerf7af. ne4ros ner7psig ner6sle ner5sw ners6we nes7evan nes6tas ne4ste net7omge ne4tri ne5um. neu7moko neu7raal neu6sji neu6ska neu7stoo neu6toë neut7oë. ne4wt 3nez 1nê 2n1f2 n3fl nfy6tap 2ng n4gad n4g3ak n4g5apt n4g5ase ng5ass n4g5een n4g3ei ng5eks nge6r7aap nge6r5al nger6d5r nge6ret nges7per ng5eten n6geter ng5imp n4g5ink n6ginst ng1l ng6lasu n4goë ng5oë. n4g3on n4g5oog n4gou ngp6seu n6g5raad ng5ran ng5rat n4g3ri ng7sade. ngs7agit ng7sappe ng4see ngs7eise ng4sek ng6serk ngs7erke ng6sero ng6serv ngs6fer ngs7impa ng4sin ngs5int ngs5kan ng7skat. ng7skoel ngs7koep ngs7kop. ng7skors ngs7kort ngs7kurw ngs7kuur ng6s5laa ng6slab ngs7labo ngs7ladi ngs6lep ng7s6loop ngs6lym ng4sn ng5sni ngs6oet ngs6ofa ngs6omm ngs7pelo ngs7pill ng5spoe ng7stabi ngs7tal. ng6steh ng6stei ngs7teik ngs7telg ng6stem ngs7tema ng7stemm ngs7temp ng6s5ten ngs7tese ngs6tin ng6stou ngs7tou. ngs7trap ngs7truu ngs6uie ngs7ure. ngs6wel ng5uit 2nh 1ni nie6kaa nie7knik nie6raa nier7aar niers5w nie6uin nig7aard ni4g5ee ni4g5ie niks7py. nik7warm 4n3ind 4ninf nin6g7ele nin6get 4ninh 4n3ins 4n3int 4ninv n5invo n2is nis7alma nis6ara ni5see nis5id nis7insp nis6oms ni4son ni3tr nit7sare nje7glas nje7krui njie6st 2n1k nkaar4 nk5aard n4k3af n4kak nk5aks nk5eff n4kei nk5eie nke6las nke6lit nke6ree nkers6w nker7swe n4k3li n2kn nk3na nk5nes nk5neu n4k3of n5kofi nk5psi nk5rig nk5rol n4k5roo nk5ros nk5rye nks6noe nk4s5om nk3sp nks4t nk3s4w nk5uit n2kw nk5wat n5kwen 2n1l n3la nli4ga nlu4s n1n nna6spo nna7tjie nne6pol nne6sev nni4s 1no 4noef 4noes noe4st no4g5al nog7eens nok5as no9ko. nok7riww 3n4oma n4omm nomo7yi. no4n3a 4n3ond 4n3ont noo6dan n3oog noor6di 4nopb no5pla nop6laa 4noplo nop7omhu nop6rod 4norg n5orga nor6kla 3norm nor7tham nos6kaa no3sp 3nota 3note not4r no5tre 2np n1r nroet6j nroe7tji 2n1s n4s5aar ns3ag ns4an ns5angs ns4e. ns4el nse4pr nser6to nser6tr ns3f ns6feer ns5gel n3si ns4ia ns4ie ns4ig nsi6gar ns7inges nsi6tri ns4iu ns3ja n6skafe n5skap n4skar n4s5kel ns5kin n6skous n4s5kra n2sl n3sla ns5lam n6sland ns3le n4s3li n4s3lo ns6lotg ns6lott n3slu ns4mee n5snar n4sne n5snel ns5noo n5soek n4soë ns5oë. ns5ond nson4t5 ns5onw ns3op ns5par ns5pas n4s5per ns7portr n4spot n6sprat ns6prek n6staak n4staf ns5teh ns6tel. ns6tels n5s6ter. ns6ters ns5trak n3s4tu n4s3tw nst6wyf ns5tyd ns3w ns6weer n4syw ns5ywe 2nt nt5ags nt5ark n4t5art nta5tj n4t5eie nte6ram nte5sm nte6sti n5t4hon nti7kwaa nt5inv nt3ja n4tjo nto7fakt nt7oksie n4t5oli nto6nad nt5ond n4top nt5ops n4t5org nt7radin nt5raf n5tref ntre7kor nt5rim nt5roe nt5rom nt5ron nt5room n5troos n5trou nt5row nt5rui nt5ryk nt3sa nts7inge nt6skan nts7kand nt4s5le nt3s4m nts7onde nts5paa nt3st nt5uit ntu4m3 n4t3ys 1nu 3nua nu4e. nu4es. 2nui nuk4w nu5kwa nul7soms 4nuni nu5skr nu6skra nus4t nu3tr 4n3uur 2nv nva6lis 2nw ny4so nza6cs. o1a o4bag ob5agt o3bo ob5vor oby6nro ock7wyn. oda5gr od5een ode7leie ode7spaa od5lui od3op od3re ods7akke ods7kish od6slak ods7lake ods7lopi ods5oo ods6op. ods6org ods7paar ods7rogg ods6uit ods6waa ods6war ods6wyg odu4k oe4d5aa oe4d5ag oe4dei oed7eie. oed7ette oe6dind oed6ja. oed7onde oe4d5oo oe4d5op oe4d5or oe4d5ro oed7stry oe4du oed3w oed7wyn. oe4f5aa oe4f5an 3oefe oe4fek oe4f5lo oe4f3o oef7rit. oeg7aand oeg7laer oeg7lam. oe4gog oeg3s oeg7yska oei1 oeien6a oeis4 oei7sker oe4kaa oek7eier oe6kerf oek7erf. oek7eval oe4k3l oek6lap oek7olie oek7oort oe4kr oek5rak oek5re oek5ro oek7sten oe4k3w oe4lei oe5leie oe6lemm oel7emme oel7eter oeling6 oelings7 oe6lins oel7inst oel7onbe oel7opri oel6ser oel6skr oel7slik oe4nei oen7eike oe6nert oen7ertj oen7esse oenk4 oen5kl oen7knoo oen5kw oe4n3o oens5ko oen5sm oens4o oen7ysbe oep7aang oep7inst oe6pinv oe4pl oe5pla oep5li oe5plo oep6s5ee oep6s5in oep4sl oe4pu oeras5e oer3k oe4r5on oer5ou oer6ske oer7twak oe5ser oe5sie oe5sje oes7kraa oes7limt oe4s5lo oes7medi oes7pil. oe4s5po oes5ter oes7troe oe4swe oet7aanp oe4t5am oet6he. oe4t3j oe6t5oli oe4t5oo oe4t5ri oe4t5ru oets7kra oet6sna oet6spe oet6s5te oet6sti oet5wy oë5rug of3at of5een 5offis o4f3in of3l o4fok of5oks o4f3om of5psa o2f3r of6sant ofs7iden of6sins ofs7insi of4s5le of4s5oo ofs7paar o4fui o1g og4d. oge4s5t ogge6lo oggel7oo ogi7faal 3ogig og1l og4nat ogo7steo o4gry og5rye og4s. og4sg ogs6inf og5ska ogs7last ogs6ot. ogs4p ogs7pad. ogs7pris ogs6uip ogs6wan oi1 oig6aff oi3k oile4 ois4a oi5sag oi5ski ois6kuu oi5sky oi5sla ois4p ois4t ois7teïs ois6wer oi3tj oje4k ojek5l o4k5aas o4kag ok4am ok4an oke4t oket5j okie4 o4k5ins ok5lat ok6leed ok3n oko7seil oko6sol o4kou o1kr o4k3ro ok4s. ok5sig ok6sins ok4sj oks7kraa oks6lip ok3sp ok3st oks6win o2k3w ok4win o1la ol5agt olf7ent. ol5fèg olf6lap olf6sku olf6sme ol4gl olg7onde ol4g5or olg7smee 5olieb olies6m olie7sma 5olifa oli7gny. olk6sem olk6sep olk6sow olk6sti o1lo olo5kw o4l5oor olo5sp olp6hta ol4sar ols7are. olt6zha o1lu olyf5o o2m o3ma om5agt oma7pleg o4m5arm omat6ji oma7tjie o3me ome4s ome5us omg6had o3mi omka5s4 5omloop o3mo omos6fe omo7sfee omp7ligs omp7oor. om6pop. oms6aal om5sla oms6lag oms7perk 5omstan oms6tin o4n3ag o5n4age o3n4an ona6skl ona7sten ond7aap. ond5agt ond7ampt ond7dwaa 4ondes onde7us. on4did on4dom ond7rol. ond5sle ond5so ond5sp ond6spl ond7twis on5eff o4n3ei ong5aan on4g5os o3n4ik o4nil onin6gr onk7ert7j on4kj on5kno onk7omge onk7rugh onne5st o4n5oks ono7sfee on4s. onse4p5 ons7iden ons7kepe ons7kori ons7pamp ons7self ons4t on5ste ons7tol. on6t5aar 3ontd ont7elsi 5ontgi ont5raa on4tri ont7rol. on4t5ru ont7slik 3ontw o1ny ony7okol oo2 oo5agt ood3a oo5deb ood5ee oo5dek ood5er ood5et ood5ok ood7onge ood3r ood6san ood7smoo ood7sorg ood7spui ood7suit ood7swaa ood7swar ood5ui oof1 oof6ser oof6sid oog3 oog6enh oog6les 5oogpu oog7sinf oog7suip oog6-lo ooi6spa ook3 oo4ka ook6sst ool1 ool6and ool7snaa oom1 oo4ma oo4me oo4mo oon1 oon6ag. oong4 oons6ko oon5sl oop1 oo4pa oo4pe oop7klik o4opn oo4po oop6swe oor1 oor6daa oor7daad oor6dap oor7darm oor6dca oor6d5om oor7doop oor7frek oor3i oor7klik 5oorlog oor6ot. 4oort. oor6taa oor6t5in oort7ja. oor6tyl oort7yl. oorve7ë. oos3a oos3k oo4so oos7pers oot1 oo4ta oot6aai oot6en. oo4ti oo4to oo4t3r oo4tu oo3v oö5spo o2p o3pa o4paf op5agt opa6les o4p3am 5opdrag o3pe op5een op9eg. 5openi op4er oper7aar ope7rage op6horu o3pi opie6le opk6lik op3l op4lan op6lein 3oplo 1opn 4opno o3po opo7fagi op5off op5ont opo7sfee 5opperv op3r o5p4rot o4pru op6skre ops6maa ops7neus op5son ops5or op3st op3sw ops7wels o3pu o1ra or5afd or5agt ora6lee ora6loo orat6ji ora7tjie ord7akti ord6arm ord7eksa ord7ierl ord7inst ord5oes or4d5oo ord6oop or6dord ord7orde or4d5ri ord7roma ore7ster o3rê orf7oond 4org. or3gh or4glo 4orgp org7ring 3orië orings8ku or5kaa orkes5 ork7lag. ork6lik ork7ney. orkom6s orkoms7t or6maan or4mj or4nj or5ond or5ong o5rot. oro7thy. or3p4h orp6ski orp4sn ors7aar. ors5ag ors7jurk ors5mo ors7pot. ors7teri ors7tery or4sti ors7trek ort7aan. ort5aar ort5akt or4tar ort6ham 5ortod ort7onde ort7rol. ort7ruk. ort5sw or1u o3r4us o3ry. ory4s os3ag osa7phat os5api osas4 osa7tjie os5cen o3se ose7phin ose7phus o3si osi6nen o4sjo os1k o4s3ka os5kee os5kis os5koe os5kop. os5kor os5kou os5kow os3kr o5skri o4sku o2s3l os3m o2s3n os5oli os5oor o4sor os5ord os3p os4pe os5ste os3t os4t. os4ta os5taf os5tak os5tal os5tar os4td os4th ost7impe os4tm o5strat os6trev ost7revo ost6roo os4tw os4t- os3w os-7lond o2t o3ta ot5akk otas4 ota5st ota7tjie o3te oteek5 ote4s5a ote6sno ote6spr ote4s5t o4the oth7nage o3ti ot3j o3to ot5opm oto6ran oto6ren otor5o otos4 oto5sk ot3re o3tro ot5ryk ots7eila ots7karr ot4s5ko ot4sl ots5la ot4s5po ots7rûe. ots7tee. ot6stek ots7toet ot4stu otte6l5o o3tu o4tui otu6set oua6che oud7agti ou6dakt oud7akti oud6ief oud6ini oud6ink oud7oorg oud7styd ou4du oud7uitg oue6rio ou3g ou4gh ou4gl oug4r ou1i ou5ill ouis6a. ou1k oul7ontl ou3m ou5nyw ou5rei ous6kak ous6ken ou5ski ous6lip ous6ouw ou3s4p ous7pan. ou3s4t ous7tert ou7stiek ous7ties out7aar. out7aksy ou4t5as out7ekst out7emme 5outoma out7omhe ou4t5oo out3r out6rap out6rei ou4wb ouw7rens ou4wv ou4-o ove5re over6y. ovie6v. ov5ket owe6nal owen7al. owe6ral ower7al. ower7kon oy4a. oy4eu ô1 ô2i ôi3e ôre5st 1ö öjd7onde ö1l 1p 2p. 5paaie. 4paanv paar7dui 3pad. pa4da pad6ie. pa4d3r pad6-eg p1af pag6ne. 3pak pa4ke pak5es paki3 pakket5 pa4ko pak5os 4p5akti 3pale pal7esse pal5fr pal6mol pa4nop pan5sp pan4t5j 3pap pa5pri pap7ryp. paps4 pap7saf. pap7smee 3pa3ra pa6ramn par7amne 3park par6kar par4ko park5r 4parm par4sk par6ste pars7te. 5party pa5sja pa4so p5aspi 3pass 5paste pas7til. pa4taa pat7are. 4patel pat4j pa5tji 3patr pats4 pat5sj pav7lov. 2pb pbe6koo pbreng6 2pd p3dw pd4wa pd4wi 3pe. pe4ak pe4ar 3ped pede4r pe5dof pee2 peel5a peel5u 4peen peet3 3pei 4peie p5eien 4p3eis pek7nek. pe4k3r pel7aktr pe4l5oe pel7oond pels7kra pel6tak pel7yste 4pemm pe6nars 3penn pen7opsl pen6slu pen7smed pen6sop 4pepi 3pera pe6raap per7aap. per7admi per6ary per7asid pera5s6t 5perd. per6dag per6dry per6dwy per7enke per5est 3peri pe4rok 3pers pers5ag per6set per6sje pers7med 5perso per6s7ond pers8tel. 5pertj per6top per7tsja per7uran 3pes. 4pesi pe4sl pe4s5te peu6rel 2p1f p3fl pf4li 2p1g pges4 pge5sp pg4ly 2ph phe6ars p2hi phi5s4t p3hit piek5n pie6raf pie6rom pie4ru pie7samp pie6ska pik7erts pik3s4 6p5inges ping6la pin7glas pin5kl 4pinst pipe4 pipet5 pi3s4k pit3j pit4s5k pit4st pits5te pits7tek pit6suu pit6zko 2pj 2p1k pkom4s5 p2l pla6kal pla6kok 5plan. 5p4lant 4p3lap 3p4las 3p4lat pla4t5r plee4 pleet5 p5leie ple4k 5pleks 4p3lep pleu7ra. p3lê pli4g pli4t5e 4plits p5loos p5lose plu6ska 4plyn 2pm 2p1n p4neum poe6doe 3poei poe4s5t poe6tol po4fa pog7rest pog5sk pok5aa pok7olie 3pol 3pom 4pomh 3pone pon7opbr pon4s5k pons7te. 4pont 5pont. p5onts 4poor. 5poort. 3poot poo6tel po4pag 4popd pop6lek 4pops p5ordo po3ro por6tak 6portso por6t5ui 3pos po4sk pos6tim pos6tko pos6tna po4t5as 3pote pou6ste 2pp ppe6las ppel7as. ppe6rad ppe4ro ppie6sl ppoor6t ppoort7j p2r p4raa 4praak p5raam 5praat pra6esi 5prakt 3pren 3pres pre4s5t 4preu 3p4ria p3rib p4rie4 prie7ël. 5pries5 priet5j 5prins 3prio 3prob 3prod pr4oe 3prof 3p4rog 3proj 4p5rok. 3p4rop pro6pop pro5pr pr4or 3pros pro5sa pro7sopa pru4t 3pry pry4st 2p1s p4sad p4s5aks p4sakt 5psalm. p4sas ps5asp p4sat p4sid 5p4sigi 5psigo p4s5ing p4s5int ps3j p5skaa p4s5ket ps5kof p4skon ps5loj ps3m ps4my p4son p5son. p4s3oo p4sor ps7portr p6stera ps4ti p6stoet p4ston p5swar ps5wer 2pt ptos4 3pub pue4b 4puit 3pun pun4t5j pus7tipo put7adde put7emme put5ji put7rioo 2pv 2pw 3pyn 3pyp pyp7aard pyp3l pyp7las. pyp3o py4pr pys3k 4p5yste py5tha pyt6hon 2p- 1q qu2 qua7driv que6str qui7nas. 2r. raa6min 4raan r6aans. 4r5aard 4rabs rac5te 5radio 4r3adv 4rafd ra4fek 4rafh ra4foe 4raft ra4fu raf7urn. 4rafv 4rafw 2rag rag6aal 5rageb ra5gie ra6ginl rag7inli r4agr rag7raad rag7ryer rag6sab rag6sak rag6sin rag7soep ragu5e rag6wan rai7gne. rak6les rak7oper rak7wate 4ralb ral7eer. ral7oor. 4ralt ram7argi 4r5ameu ram6pla r4anda ran6daa ran7dafe ran6d7akk ran6dem ran6dev ran6doe ran4dr ran4g5o rank5l ran4k5r ran6saa ran6seu ran6sjo ran6sko ran6sor ran4s5p ran4s5t ran6tad ran6tet ran4t5j ran4tr 4r3any rapa7da. ra6pas. ra5pes rap7ewen rap6loï ra4pon rap7onge rap7para rap7rem. rap7righ r4ari 4rarm 4rarr 4rart r5asia ras6tan ra5s4to ra5s4tr ra4su ras5ui ra5t4ho 4r5atom rats5o rbo6lol rd5agti r4d5ame rd5eil r6delek rd5esel rde5sm rd5euro r3do r4d5oli r4d5ont r4d5oon rdô6nne rd7raais r6droma rds6lip rd3so rd3sp rdt6ree rdu6sol rd4wa r5dwar r4dwu r4d5yst 1re 3r2e. 3reak reed5a ree4k reek5e ree7kier ree7loon 4r5eend 4r5eenh 4reenv ree6pes ree6ple ree6pro 4reers ree7sala ree7stra 3reë 4reë. 4reff 3reg. reg7ruk. reg6sen reg6skw regs7om. reg7spre 4reie 4reil rei6nar 4reind rei6noo rei6ser rei6sou reit7ze. re4kn rek7naar rek5ne rek4r rek7spoe 4rekst re4kwa rel4d rel7dae. rel7diag rel7dopp reld7ran rel7duik rel7oest ren6agt r4end 5rend. r5enig ren7shaw ren4so ren4sp rens7te. ren6sto ren6str ren6tak ren6tcl ren4t5j ren4t5r 4rerg 4r3er4t rert5j 4resel re4s5ka res7lap. res5lo re3s4m res7ore. re4spi re4ste re5stel re4sti res7toet res7toma res7ure. ret5art reu6kin reu4kl reu4k5o re5usg r4ewa rey5no rê4rh r4faa rf5laa rf5lat r3fle r5f4lie r5flui rf5opv r4fre rf5reg rf4sl r1g r4gak rg5akt rgek6li rge7klik rg5eng rgeper6 rge6rid rg4hu rg5hut rg4len rg4let rg5loo r4g3lu rg4ly rgo6wri rgrie4 rg5ros rg3s rg4s. rgs4p rguit6j rgui7tji 1r2i 3rib. rib7file rie6dio rie6dop rieket5 rie6klo rie5me rie6pri ries6e. rie6skr rie6taa ri4fa rif6ree rig6ska rig7smee rig7styf ri4kl rik6sid rik5sj rik7spad ri4kw rim4s 4r3inf rin6gaa rin7gaan ring7aar 6r7ingest rin7gleb rin4g5r rin6gui 4r3inh rin6kar 4r5inko rink5w rin6kwa 4r3inl 4r3inr 4rins r5inst rin7the. r3inv 4rinve rio7rye. rip4s5t ri5s4ko ris4o ri5son ris5op ris6per rit5ji rit7oond rit6rea ri5tro rit6zri 5rivie rix7tont 2r1k r4kaan rk5een rk5eik rke6lap rke4s3 rke7sel. r6kink. rk5inl rk5leie r4klid r5klip r4k5los rk5nei rk5omg rkom6sti r4k5opd r4k5ops rk5rand rk5red rk5rib rk5rok rks6maa rk5spo rks6uid rk5twi rk5uit r4k5ure rk5wag r4k5wat rk5wee r4k5wet rk5wil rk5win r4kwy r1l r3la rli4g rlo6gja rloo7ple rlo6wpa 2rm r6maanh rma5gô rma6gun rma7klot rma7plaa rma7raan rme6raa rmer7aar rme5sa rmi4l rmos4 rmo7stro rm5uit rmy6nim 2r1n r5nagte rna6spl r4n5ele rne4s rne4t5a rne6tom rn5oor rn6stig rns6tin r3nu roduk5 roe6fas roef7as. roe4f5l roe6fri roe4ga roe7glas roe4n5a roe4pa roep5l roe4p5o roe4s5k roe6sla roes7lag roe4s5t roes5w roe6taa 4roew rog7akke 4rogg rog6lis ro5gna ro4kn rok4r rok7slip rok4s5p ro5kyn ro4l5aa rol7gord r6olien rol7mops romp7op. 4roms ron7aar. ron6dag ron6dak ron6d7er6t7 ron6d5et ron4d5o rond6o. ron4d5r ronds4 rond5sw ron4du ron6gaa ron6kaa ronker6 ron6kert ron4k5l ron6kow ron4kr ronk7wa. ron6ske ron6ste rons7te. ron7stel ron6s5ti r5ontp ron4t5r ron6tui 4rontw roo7dewa roo7dist 3roof 4roog roo7gron roo7mens roo7nag. 4roond roop6la 4r3oor roo7taai r4opa rop7aans rop7anys ro5pee rop6een 4r5open r4opi r4opo r1or r4ora ro3ro ros6afr 4r5osea ros7kie. ro3s4p ro5sta ros6til rot6hsc ro5ton ro3tr rot4sa 4roud rou7floe rou5sk rou3t rovi7ch. rov7nik. ro4w- rox9y. r2ö rpe4s3 r4pid rp5ide r4p5lik rp5opd r4p5reg rps7idio rp4sl rps5no rp6spri rp4stu 2r1r2 rre7glob rre7nagt rre4st rre7stau rres5tr rri6gin rron7kaa 2rs r4sakt rs5alm r4s3ar r5scha rs5eila rseuns6 rs3f r5s6feer rs4ie rsi7flag r6sinda rs5inko r6sinsp r6sinst r5sjam r6skaki r5skap r6skapa r6skapi r6skeus r4s5kin rs6kink r6skoet rs6komm rs6koni r4skor r5skors r5skou rs5krib r6skroo r4skur r4slê rs5lis r4s5los rs5lyf rs6maad rs6maai r5s6maak r6smaat rs6magt rs6mak. r6smake rs6mara rs6mede rs4mee r5smeer rs4mel rsnee5m r5snoo r4snot r4s3og rsonde6 rsonder7 rs5ong rs5oog r6soors rs3op rs4op. rs5ord r1sp r6spaar r4s5par r6spien r5spri r1st r6s5tal. r4stb r6stegn rs6terp r5s6ters rs6tigl rs4tik rs4tis r4s5tit r4stj r6s5toet r6streg r3sty rs3un rsu4s rs5wa. rs5wap rs3we rs6werf rs5wyk 2rt rt5afd rt7angel rt5art r6teend rte6loe rtie4s rting4 rti7saan r4t3om rt5ont rt5opr rt5org r6treda rt5reis rt5ren r4t5rie r6trol. r4t3ry rt6s5aar rts5ond rts6pyn rt5uits rt4wis rt4wyf 3rub ru4ga rug6-sk rui6lek rui6moe 5ruimte rui6niv 4ruit5s ru2k3 ru5kaa ruk6lip ruk6opp ruk6-en rul5aa rul7ape. rul7yste r2um rum7grok 4runi rup7lys. ru5spi rus6tak rus6tka rus6tma rus6tvo rus7uur. rut7oond 2ruu ruus6te ruu7ste. rweg5a rwe6gei rwe6skr rwi7sje. rwoes5 rwy6sak rwy6see ry4fa ryf7ink. ry4fo ryf7ode. ryf6sch ryf6sin ryf6ska ryg7stek ryg6str ry6kinr ryk3l ry5klu 3rym. ryn4s5l ryp7arm. ry5ple ryp7lus. ryp7nagt ry4s3a rys6alf ry6sinl rys5pi rys5po ry3st rys4ti ry4su ry4ta ry5tra s2 2s. s’9ie. 1sa 3sa. s4aad saa6dui 3saak 3saal 4s3aan 4s3aap 4s5aard 4s3aas 4s3adm s5adre 4s3adv 2s3af 2sag 3s4ag. sa4gal s3age s4agi s4ag4n sa5gne 3s4ago sag6opa 5sagte. 5s6agtew 3sak. s5akad 3sake 3sakk sa6k5rok sa6krus saks4 s3akt 4s5akti sa6lamm sal7ammo 4salb s5albu 3salf sal6fol 4s3alg 4salm sal6mei sal6tro 3sam 4samba same4n 4s3amp sam6swy 4sana s5anal san6d5ag san6dak sand7akk san6dru 3sang san4g5a san6gre sang7ste 4s5anke sap6hat s5appa s5appel sa3pr 4s3arb 4sarea sar7olie 4s3art 4sase s5asem 4s5aspe sa5spr sat6jie 4s3atl 4s5atta sav7lon. 2sb s3ba s3be s3bi s3bl s3bo s3br s3bu s3by s3ca s3ci 2sd s3da s3de s3di s3do s3dr s3du s3dw sd4wa s3dy 1se 3se. s5eed. see3f see3k s5eenhe see6plo see5ram seer7as. see5rei see7roet see3s4 see7soog see5sw seë7kran s5egpa 4segt 4s3eie 4seik s5eik. 4seila sei6nan 4seind 4seis. sek6huk 4seksa s5eksam sek4s5k sek4s5p sek4st 3sel sel5aan sel7anal se4l5el sel4f5a sel7fabr sel6fer self5i sel6fid 6seliks sel5of sel7oor. sel5op sels7kak sel6slo sel7spen sel6s7taa se4m5ag 4s5emal sem7ekst sen6dan sen7ghor sen7sord sen6str sep6hus ser7afse 4serf s5erf. ser6s5in ser6skr ser6sta sers7taa ser7stad sers7tal ser6tuu s5ervar ses6aan 4se4s5ka ses7lett se4s5po se4st se4s5ur ses7uur. se4sw ses7weke s4et. sewes6t sewe7ste sey7stof 1sê 2s1f2 s3fa s3fi s3fl s3fo s3fr s3fu 2s1g s3ga sga4s5e s3ge sges7per s3gi s3gl sg4ly s3go s3gr s3gu 2sh s3ha s4ha. sha7ron. s3he s3hi s3ho sho7shol s3hu 1si 4s5idea s5idee. 4s5ideo 3sie sie7kwos sies6li sies7mee si5fle sif6reu 4si3go si4gro 4simpl 3sin. si5nag s5indek 5sindr 4sindu sin7enti sin7este 4s3inf s4ing sin6gaa sing7aan 6singes sin7gle. sin6gre s5ingry 4s3inh sin6kch sin4kl 4sinko s5inlig 4s3inm 4s3inr sin6see sin6sin 6sinslu sin5sn 4sinv sip6ho. s4ist sit6are 4s5item si3tr si4tre sit7riem sit6sik sit5sl 3situ siu6mur 1sj 2sja sje6ans 5sjoko 4sjuf 1sk2 2sk. 5skaaf skaar6s 6skaart s5kafe 3skak 6skakeb s5kakt 4s5kalf 4skam 4skant 3skap ska6pin ska6pon skap5r 4skar. 4skara 4skas s5kata ska6tel ska6tit 5skawe 3skem 4skenn 3s4kep ske6pla ske4p5r 4skerk 4s5kern ske7smee 5skets 4skett s5kiem ski7klub s4kil 4s5kilj ski6lol s4kip 5skip. 4skis. 2s3kl 2s3kn 4skod 4s5koeë 5s4koen 4skoer sko6kaa sko4ko 4skoll 4skolo 4skolw 4skomb 4skomi 4skomp s3kon s4kone 4skonf 4skong 4skons 4skont 6skoord s4koot 4skoö 4skos sko6see 5skott 4skow 6skraan 4skrag 4skran sk4re 6skreet s5kres 5skrif 4skrin 5s4krip 4skris 4skrui 3s4kry 4s5kryt sku6dak 4skuik s5kuip 5skuld 4skult 4skun 5skurf 4skus sku6tar 2s3kw sky7drin s4kyf s4kyw 1sl s4laa 4s3lad s4la4g 4slam 4s5land s4lang s5lant 4s3las 4s3lat s4law 4s3led 5sleep 4s5leer 4s3leë s4leë. 4s3lei 4s3lek 4slel 4sleng sle6tji slet7jie s4leu 4s5leue s5leus 5sleut 4s3lew 4sley s3lê 2sli slib3 5slier s3li4g 5slinge slo6bee s4lof 4sloj 4slok 4s5loon 4s5loos 4slop slo4t5a s5loter s4low sl4öj 4s3lug 4slui. 4s5luia s5luih 5sluit 4s3lus 4s3lye 4slyf sly6mui 4slyn sly6paf 4s3lys 2sm s3ma s4mad 5s4mart s3me s5melk 5s4melt s3mi 5smid. smi4s smit4h5 3smok s5mol. s3mon s3mu 3smy smy6nin s4myt 1sn s5naai 4snaam s5naat 4s3na4g snag5e snag6s. 4snam sna6pro s4nar s3nas 4snat 4snav snee7tji 4s3nek 3s4nel 4s3nes 4s3net 4sneu sni6kwa sni6tre s4nob 5snoet 4s3nom 4snoo 4snorm s4nui sny3 s4nye 5snyer sny6-ys 1so 4soef 3s4oek soe6kal soe6kev soe6kol soe4k5u s4oen soe6nys 4soes 5soet. soets6t soet7ste sof6agu 4soff so3fr sof6ree sog4l soi6ets sok7opho 3sol s5olie. sol6lme solo5s s4om. s4ome 4s3omg 4s3oms 4s3omv 3s4on. s6onde. s7ondern 3s4one so6neek son7eekh son5eg 4son3g son7kwas so4n5op son4so 4s3ont son7uit. s4onv 4sonw 4soog 3s4ool 4s5oond soon4s 4s5oor. 4s5oorb 4s5oord 4s5oore s5oorg 4s5oorl s5oors 5soort. s5oortr 2s1op 3sop. sop7ekst so5phi sop6hok s4opi 5sopie s3opl 3sopo so3pr 5s4op4ra s3ops s3opt s3opv 4sord 5sorg. 4s5orga sor6gee sor6gra sorg7raa s5orke so5ror 4sorto sos4h so5sha so3th sot4ho so3tr 3sou 4soud s5oude sou6spa sou4s5t sou6taa sou6tak 4souto s5outom so9ya. s5paal 5spaan 4spad 4spak 3s4pan span5o spa6noo 4spap 4spark 4s5pas. 4spast spa6tar 4spatr 4spe. 3s4pee spe4k5l spe6kne spe6lak 5speler s4pell 6spelot 4spen s5pen. 4sperd 4sperk 5sperm. 4spers 4spes. 5spesi 4spet s4peu 4s5piek s4pio 2s3pl 5s4plee 5s4plin 5splits 3s4ply 4spoei 4spol 4spom spon6st 5spoor. 4spoot 5spore 6sportr 4spos 4spote s5poti 5spraak 6sprakt 4s5prat spreek5 s5prem 4spres 5spreu 4sprob 5sproei 4sprof 4sprog 5s4pron 4spros 5spruit 4spry s3ps sp4si 4spub 3s4pul 4spun 4spyn 4spyp 2s1r s3ra sra4e s3re s3ri s3ro s3ru s3ry 2s1s s3sa ss4af ss4ag ssa6rol ssay7is. s3se sse6nas sse4n5i sser4s sse5st s3si ssie6l7ei s3sk ss4ko s3sl s3sm ss4ma ss4me s3sn s3so s3sp ss4pl s3st ss4ti s3su s3sw s3sy 2st. 4sta. s4taa st5aard 5staat 3s4tad 4stafe sta6las stal7as. 4stale sta6lee sta6lem 4stali 5s4talt 5s4tam. sta4m5o 5s4tan. stand8s7ta 4stari 3s4tat s5tatr 4stea s4tedd 5s4tede s4tee4k 5s4teen 4steer 4steg ste6gre st4ei ste6kli ste6lek stel7eks 6stelev 5s6telse stel6tj stelt7ji 5s4tem. 5stemm ste6mom ste6nou 4stent s5teny 4steo 6sterap ste6r5ei 5sterkt 4sterm ste6rom ster5sm ste6rys ster7ys. ste6ser ste6sin ste6ska ste6ski ste4sl ste6sma 2sth s3ti 4stie s4tigt 4s5tiku sti6laa s4timu sting5a 5stinkh s4tip 4stir 4s5tite s3tj 4sto. s5toeg s5toek 5stoel. 6stoela s5toen 4stoer 4stoes s5toev s4tof sto6fek sto6fem sto6fen sto4fo 4stog sto4ka sto6kle sto6kre 3s4tom 4stone 4stoon st4op sto6poo 4stos sto4st 3s4tot s4tow s4traa 4strad s6trak. 4s5trei s4trew 4s5tril 6strins 4stroe s5trog str6ont 6stroon 6strosp 4strot s5trots 4strou 4strov s4tru 5struk 4s5trus 3s4try stu4c 3s4tud 4stuig 3s4tuk stu6kin stu7klep stu7stra stu4to stu6tys st4wi 2sty 4styd 5styf. 3s4tyl sty6loo 1su su2b1 sub3a sub7gids sub7hoof sub7nasi sub5oo sub7reko 3suid sui6daf sui6dei s4uik s4uil suip5l sui6pro 4s3uit s4uiw sul6tin sum7aans 2sun s3uni su4su sut6her su9yo. 2sv s3va s3ve s3vi s3vl s3vo s3vr s3vu s3vy svy7kraa 2sw 5s4waai 5swael s5waen 3s4wak 3s4wa4m swam5a s5wand 5swart s3wat 3s4waw 6sweefs s6weeft s5week 5s4weep 5s4weet 4sweg 5sweis s4welg 3s4we4m 5s4werm swe6tre s3wê s3wi s4wik 4swil s3wo 5swoeg swor6st 4swort s3wr s3wu 3swyg 1sy 5syfer sy3k syn6agr syn6sin syn5sm sy5pla sy3sk 4syst s5yster 4sywe s5ywer 2s- 1t 2t. 3ta. taa6nam 4taand taan5s6f 6taansi 4taant 4t5aanv 3tabb 4tadm ta4d5ro tad6ser tad4s5i tad6ska tads5n tads5p tad6ste tad6s5to 4taf. 4tafd 3tafe tafe4l 4ta4fr 4t3afs 4tafv 4t3afw t4age 4t5agen 4tags 4t3agt tai4l ta5inv tai7peis 5take. tak6lep ta5kli ta4kr tak7rol. 3takt tak7wyn. 3tale tal7eenh tal7emme 5talig tal6kaa tal6sor ta6mind tam7inde tan6dat tan4dr tand7rin tand6sto tang5st 4t5anna tan4sk tap5ro 3tari 4tark 4tarm t5arm. tar5oo t5artik ta4s. t5asem tas4p tas6tas tat7isol tat4j tat7jies ta4t5ra 2tb tba6lun tby6tei 2td tdy7ing. teby6s. 3tedo teek5r tee6lee tee7lood tee6mev tee4mo tee4n 4teenh 3teer tee7raad tee7renv tees4 tee5sk tee5sl tee5st tee7suik 4t3eeu tef7lon. 3tegn teg6ori teg7ren. 5tehui tei6noo tek2 5tekam tek7bak. 5teken teke8n7aap tek7haak tek7limi 5tekor tek7semp tek6sin teks5k teks5t tek7stel tek5vo te6laap tel7aap. te4l5ak te4l5ap tel7dwei te4l5el tel7fles tel7idee 5telik tel6lho tel7oes. tel7oog. te6loon tel7oond tel7smed tem7asse 4temm tem7omva te6moog tem7oog. 5tempo tena6ge 5tend. t4enh ten6kaa ten6koo ten7ouer ten6san ten7slot 5tenso ten4s5u ten4t5j ten4tr tent7reg ten7treu ten7twen 3teo te3p4h ter7adel 5te4r5af ter6afi ter6ago te4rak ter7akro ter7als. ter7aman ter7amer te6ramp ter7amp. 5terap ter5app ter6arg ter6dro terd7roo ter5een te4r5el te4rem 4terft te6rin. ter7ink. terk7wyn 3term ter7omra ter5ond ter5ont 5teror ter5os. te4r5ow ter7raan 5terrei ter7rein 5terri ter6sas ter6sef ter6seg ter6skop ter7sopn ters6we ter7swee ter7syst ter6tap te4rui ter7uie. te6ryst ter7yste ter6-in 3tesi tes7inst tes7loe. tes7lydi tes7mart tes7meto tes7proe tes7teri tes6tud te5sty te4s3w 3teti teun5s4 2t1f tf4li 2t1g tg4af tge6nap tg4li 2th 3tha. t4has 4thei 3t4hen ther6aa the7raan the5ro 3t2hi 4thit t5hitt th5leh t4ho. tho6nat ths7chil t4hy. tib7niet tie4f tief5o tie6gri tie6kap tie4k5l tie6kom tie4k5r tie4k5w tie6roë tie7smoo 4tif. 4tiff 4tigm tike4 ti4kla tik7lug. tik5ro tik6waa 4til. til7aan. 4tild 4til3s 4tilt 4t3ind tin7erts tin4ga tin7gaal ting7aan ting7eg. tin4g5r ting6su tings7uu 4tinkh tink7wa. 4t3inl 4tinv 5tipe. 5tipes ti4rp tis6aan ti3sj ti3tr tive5r t2j 2tja tje6sni tjo4k 2t1k tki6sob tkom4s5 2t1l t3la tla6sin t3li t3lo t5lont 2tm tme6sti 2t1n tne6ywe tnot4s5 3to. toe7eien 4toef 5toef. toe7gly. toe7klap toe5kr 4toel. 5toe5la 4toele toe6let toe6lop 4toelt 4toep. toe7plei 5toern toe6rou 5toeru 3toes toe5sl toe5sm toe7swel toë7roti to4fa tof7ekst tof7emis to4f5io tof7onde 3tog to4gl tok7las. tok7lett tok5ou t5olie. 4tom. 4tond 3tone ton4gr tong5s 4tont t5ontl t5onts 3toon t5oper to5p4he 4topm top7oorl 4topv tor7eien tor7eval to6rint tor7inte tor6m5ag tor6mom to1s to3sf tos6tro to3tr tot6ste tou3s4 tou7tjie tou6wsr to4wn toy7ota. 2tp tpen6sk tpie6tj tpiet7ji tplek5 tpoor6t tpoort7j tp4sa t5psal t2r 4t5raad t5raam 5tradis 4traf tra6fas traf5o tra6foo 5trakta 5transa 5transf tra6paf trap7as. tra6pew tra7ploï 5trapp trat4 tra5tj 4tratu 4trea t3rec t5reda t5redd t4ree 4treek 4t5reen 4treë 4treg. t5regi tr4ei t5reini tre6ink 4treis tre4ka tre4k5l tre4ko tre4kr trek5w tre6kwi t4rer t5rese tre4st tre4t tre7talb tret5j t5reuk t5rewo 5tribu t5rief trie6kl 5tries tri5g4l 4tring trobo5 4t5roer tro6las trol7as. tro6lin tro6naf troo4 4troom tro6ski 3trou 3trov 4trub 4t3rug truit6j trui7tji 4truk tru7kopp trust5r 4tryk 2t1s ts5agt t4sam t4sar ts5arg t4s5eks t4s5eng tse6raf tse6rys tser7ys. t6singr t4s5ins ts5inv tsi7tsik ts5jae t4skar ts5kok t4skon t4skor t6skrie t6skrip t4skru ts5lam t5s6maak t5s4mee ts4mel t4smo ts5mot t5smou ts5nat ts5neu ts5oon t4s5pas ts5pen ts5pot t4s5pro ts5tea t5stel t6stend ts4ti ts5toer ts5tron t3stu t3su ts5waar t5swar t5swen ts6wing ts5wyn 2tt tta5tj tte6loë tte6ral tte6ram tte7ridg tte4ro tte7ruil tte6slo tte6s5ta tte5us tt4he tting5a tt5uur 3tua 3tue 3tuig 3tuin 4tuits tu4kl tum7aanw tur6kna 4turt tus7aart tus7eter tussen5 tu5têr 2tv tv4li 2tw twee5k twee5l twees4 twerp5o twi6sap 3tyd tyd7aanw tyd7lont tyd7orde tyd3r tyd6sat 3tye tyl7oorw 3tyn tyn7spre ty3o t5yster 2tz tze6nel 2t- u1a ua4e4s uahu6a. u4b3ag ubas4 uba7slag ub5eko ub3f ub5gro ub5int u3bl u4blu ub5lun ub3or ub5sch ub3t ub3v ub5wyk uck6len u4d3ar udi6top u4d3re u4dri uds6med ud5sor ud6stoe uds6tyd u1e ueb5lo uer7ione ue4ron uer7onde ues7tria ue5uni u4fri uf5rin ufs6maa ug5aan u4gei uge6ska ug1l u2go ugo6mol ug3or u2g3r ug3s ugs4k ugs4l ug4soo ugs4p ug5ste ugs6tek ug5sto ug5sui ug4ub ui4dag uid7arts ui4d3o ui4dr uid7reek uid7simb uid7skat uid7skel uid7skil uid7slui uid5spr uids6to uid7stoe uid7uits ui1e uiers6w uies6ma uie7smaa ui4f3a uif7eend uif5le ui4go ui4g3r uig3s4 ui4k3a ui4k3l ui4k3r uik7sfee uik6sta uik7uitk ui4kw uil7aap. uil5eks uil7esel ui4l5oo uil7tjan ui4ma uim7oes. ui4na ui5nae uin5ar uin7asyn uind4 uin7drek uin7ivoo uin7kole ui4n3o uin7ser. uin5si uin6ska ui4pl ui4po uip5oo uip7ore. uip7roes ui4s3a uis3j ui4s3o uis5ta ui4t3a uit7dein ui4t5ee ui5ter uit3j uit3r uit4sj uit6-as uk4aa ukaar4 uk5loo u4kof uk5off u4kor u5krat uk3ry ukse4s uk4ski uks4m uks7pop. uk4sv uk4th uku7yama u2k3w u1la ul3ag uld5erk ule6sta ulê6r-w ulf6api ul5ins u1lo ul5oog ulp7eksa ulp7oort ulp7orga ul4saa uls6oms ult7inge ult7uit. u1lu u2m u3ma um5agt umat4 uma5tj u3me umg6rok u3mi um4ie um5ond um4s. ums7feld u3mu u4mui umu4s un5arm uner6st 5unifo 3univ unk7reda un2s3 uns6enb un4sid uns6kap un5s6kol un7s6kool uns7lagg uns7taal un5str unt7eenh un6tinn unt7real unt6roe unts6ko unt5sw unug6s. u1o upi6lop u4ply u4pon u1ra ur5aar ur3af ur5agt ur3ak u5ra5s4t ur5atl ur5een u4ref ur5eff ure5um urf7loop urg6h-s urg7laag u4r5int urke5s urk7nael u1ro uro7pesi urp7agti urr7heim urs7agte ur4s5ek urs6fee ur6sloo urs7mous ur4sno ur4s5oo urs7paar urs6par ur4spr urs6wee urs6wie ur6t5oor ur4top urt7room u1ru u1ry us3ag usa7lag. u4sap us5een use5st ush7die. ush7koal usie4k usiek5l u4s5ins u2s3k us4k. us4kok us4kri u2s3l u3s4lu u4sno u2s3o us4ol us4or us3p us4pie u4spo us5pot usse7us. us3t us4t. ust5akt usta6v. us4tb us4tf us4tg us4th us6tink us4to us6trek us5tru us4ts us3w u2t u3ta ut5adm u4t3ag uta7spek u3te ute7ling ute7rago u3ti u3to u4topl ut5org ut4rek uts7luis ut4spr u3tu u3ty uu2 uur1 uur3i uur6s5in uus3 uus6khe uut3j uwees4 uwe7smit u5yste u3yu û1 1ü1 1v2 vaar6st va4kar vak7eie. va4kes va4ki va5kie va4k3o va4kr val7este val7fees val7funk val7isog valk7oë. val7opto val4sa val6spa vals7pan val6spo val6spr val6s5te val6sth va4n5ee van7effe van6gap van6gre van7uit. vari5et var6kja var6kle var4k5n var4k5o var4k5r vas7ent. vas6oor vas7waai ve2 ve3d vee7kong vee5kr vee4l veer5a vee3s4 ve9ga. veis4 vei5st vel6don vel4d5r vel5oo ve5lop vel5sm vel7sple ve5lum ve3na ve3ne ve5nor ven4t5j ve3nu vep7legi 3ver1 ve9ra. verd4 verdien7s8 ve5reb ve5rek ver6ema ver6ena ve5rend ver6eve ver6flu ver6fru ve3ri ve6r5inn verk4 ver5kl ver5kw ve7rona. ver5sa vers6ki ver7skin vers8kop. ver5sl ver5sm vers6mag ver5sp ver7stal ver5s4w vers8waar ver4t5j ver5tw ves3p ves3t ves7taal ve5suv vet5in vet5ji vet7opga vet3r vets4 vet5sm vid5so vie7ring vig4s vi5rag vi4rg vi4r- vi4sar vi4so vis5ol vis7oog. vis5tr vi3tr vit7rate vlag5s vla4k vla7koek vla6sak vle4k vlek5l v4lie vlie6so voe6rek voe6rui voë4l voël7oë. vog7inho vo4gr vo4lei vol4g5a vol6gon vo4l3o vol7song vol7uit. vol7ywer vond6s7te von6klo voo7doo. voor5s4 vor4s5t vor7ster vou7pops vou5tj vra6gry v4re. vree6tj vreet7ji vrie6sp vri6jze vry7duik vry7kyk. vry3s4 vry5st vry7uit. vu4e. vu9yo. vyf7armi vy3s 1w 2w. 4wael wae6lat 4wa4eo 3wag. wag6las wal6ste wand6sk wan6gaa wan7inge wans4 wan5sm 5wapen 3warm war4s3 wars6e. 4wart war6thi war4t5j war6toë wart7oë. war6too war4t5r war6tys wa5shi was6kaa was5la was6mou was7pan. wa5str wate6ra water7aa wat5so we4bad we4bm we4b5ru web7taal web7vlie 3wed we4d3r we5dra we5dry we4dy 5weefse weeg6s. wee5ran wee5sa wee7skaa wee5sko wee5sl wee5s4p wee5st wee6tru 3weg we4ga weg7dof. weg3l we4go weg7orde we4g3r weg3s4 weg5st we4gu 4weis we4k5ro wek7uur. wel7aanb we6larg we4l5ee wel7flan wel7fron wel5oor we4l5op wel6ske we4m3o wem6os. we4nak we4n5as wen7eens wen6sad wen6san wen6sar wen6sei wen6ser wen6ses wen4sk wens5ka wen7skud wen4s5l wen4so wen6spr wen6ste wens7tes wen4s5u wer7esse wer6fom wer6gar wer6gre wer6int 3werk wer6kad wer6k5af wer6kes wer4kl werk7laa wer7klan wer7klap wer7klok wer6koms wer6kon wer7kony wer6kre wer6kro wer6kuu wer4kw wer5kwa wer4ky we4r3o wer6paf wer6pan wer6plo wer6pon wer6poo wer6por wer7smed wer7uil. wes6mit wes7oewe we4sp wes7pemi we4s3t we5sta wes4th we5s4tr wes7waar 3wet. wet7regu wet4s5o wet4s5t wet7wysi 3wêr 4wfon wids7tor wiel5a wie4t5j wi4gr wi4kl wi4ko wiks7te. wil6dag wil6sin wil4sk wind7as. win6del win6dop wind7op. win4dr wind7ruk win6kle win4sk win7sky. win4s5t win7ston win6tap win6tes wip7lig. wip7roos wit5el wit7inkb wit5ji wi4t3o wit5ro 2wj wje6tun 4woeg woe4s wo4l3a wol7invo wol6klo wo4l3o woor6dr wo5rum wou6dag w2r wree4 wri6gon 2ws wur4gr wur4m wurm5a 2ww wwe7rint wyd5oo wyd7uite wyk6was wyn6and wyn5sm 3wys wys7aksi wys3k wys3p wys5ta wyt7raak x’9ie. x1a xe1 x3em xerox7e. x2h x1i xys6te. y1a y4ama ybe6lil y2d y3da y3de yden4s ydgele6 ydg6leu y3di yd3of yd3re yd3ro yd4sin yd6skat yds7krit yds7orde y1e y4enn yer2 yer7hof. yer7maat yer4s yer7ton. yer7vill yer7voël yes6agt 3yeu yf3aa y4far yf5as. yf3l y2f3r yf5ren yf4sl yf4su y1g yg4le yg4li yg4ly yg5saa ygs7kans yg5sko ygs5le ygs6tek yg4sto yg4stu ykaar4 yker6st y4k5ins y2kl yk3li yk4lu yk5lui yk5lus ykoms4 y4kor yk3ri yk4s5ad yk4sk yks7kans yk3sp yks4t yk4su y2k3w y1la y1lo y4loe yls7laar y2n1a yn4a. y4nei y4n5ete yn1g2 yn5kli yn5kwa y2n1o y3n4om yns6agt yn4s5am yns5ins yn5sly yns4m yns7maan yn4s5or yn4sp yns7paar yns4t yn3u yo9yo. y2p y3pa y3pe y3pi y5plan yp3li yp5org y3pr y3pu y1r y4sam ys4ig y4s5ind y4s5ins y2sk ys5kar ys3ko y5s4koo y2s3l y2s3n y2s3o ys4ok ys4ou ys5poe ys3t ys4ta y4s5taf y5s4tel y4ster y3s4tr ys4tu ys3ui ys3w y2t y3ta yt3ag y3te yt4ha y3ti y3tj y3to y3tu y3ty yve7sant 1z 2z. 4zbur zee7rust zen7elle zi2c zi5cat 4zman zook6a. 2zz 2-1 -er4t -ert5j -ha-7ha. -k4li -na6gew -s4ti -t4we -5twee",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=10342,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-af.pat b/Master/texmf-dist/tex/context/patterns/lang-af.pat
new file mode 100644
index 00000000000..58ea7372b6b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-af.pat
@@ -0,0 +1,10349 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-af.rme
+
+% used: - 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 ä è ê ë î ï ô ö û ü ’
+
+\patterns{
+.aan5s4
+.aä7lawa
+.a6bc-b
+.a4b5la
+.ab7salo
+.a6b-ja
+.ac7cra.
+.a6farm
+.af7arm.
+.a6feet
+.af7eet.
+.a4f5en
+.a6fets
+.af7ets.
+.a6foes
+.af7oes.
+.a4f5oo
+.a4f5ra
+.af6ro'
+.a7fro's
+.af6ro-
+.a7fro-h
+.a6fry.
+.af3s
+.ag6aam
+.agte6r5
+.a6guur
+.a9ha.
+.ah7lers
+.a3kw
+.a6leer
+.al7eer.
+.alf4
+.al7fagr
+.al5fr
+.al6lda
+.a4l3o
+.al6oïe
+.a7loïen
+.al3p
+.al5st
+.al7thea
+.al7twee
+.al6zhe
+.amp4s
+.amps5w
+.a6naër
+.an7aëro
+.an6cpl
+.and4
+.an5dr
+.ang4
+.an5gl
+.angs5
+.a4n5io
+.an7thro
+.a3pr
+.ap7side
+.a5rag
+.ara6p.
+.ar7thur
+.ar6zbe
+.as7jas.
+.a6snog
+.a6sof.
+.a5sti
+.a7straa
+.a7s6tral
+.at6hol
+.a7thol.
+.a5tsj
+.atte4
+.au7drey
+.b6aanv
+.ba6din
+.ba4d5o
+.ba7loi.
+.ba7ragw
+.ba7rins
+.ba6sek
+.ba7tho.
+.be7deks
+.be6kaf
+.bek7af.
+.be5la
+.be7lol.
+.be7skos
+.be7thel
+.be7thul
+.bi7sho.
+.bli4
+.blus5
+.bo7kerf
+.bo7kies
+.bo7kors
+.bo7maat
+.b4on
+.bo7plaa
+.bo5ro
+.bo7sor.
+.bo5sta
+.bo7trit
+.bo7tswa
+.bo7uit.
+.bout5j
+.b4re
+.bu6eno
+.bu6lol
+.bu7thel
+.by6ldr
+.by6lho
+.by6lne
+.by6lpi
+.by7port
+.bys4
+.by6tal
+.ca7thy.
+.ca7yenn
+.chlo7e.
+.ci6rca
+.ci7trus
+.cos7ta.
+.cy6pri
+.d2
+.da7gon.
+.dag5s
+.da6kat
+.da6koo
+.da7tage
+.da6tji
+.dat7jie
+.da6wki
+.de6k7laa
+.de6klo
+.de6kwe
+.de5la
+.de7roga
+.de6sal
+.de6sok
+.de4sp
+.diep5l
+.di6jks
+.di4si
+.di7thak
+.do4m5a
+.do4m5o
+.dor7ste.
+.dr6oef
+.dun5s
+.du6pre
+.dut5j
+.dy7spie
+.e6bcu.
+.ed5wa
+.ed7win.
+.eer6sk
+.ee4t
+.e6fron
+.ef7ron.
+.eg7gofo
+.e6indu
+.ei5st
+.ek4s5k
+.ek7sopa
+.ek7sord
+.eks7tri
+.eks7tro
+.en7dres
+.enk4
+.en5kl
+.e6noft
+.en7ofta
+.en4t5j
+.en7topt
+.ep7soms
+.er4d5a
+.er6dwo
+.er6fle
+.er6foo
+.er6inv
+.ern4
+.er4t4
+.er5te
+.ert5j
+.ert7se.
+.erts5w
+.e2s
+.e9sau
+.e4s3k
+.e3so
+.es3p
+.es8p.
+.es6pma
+.es3t
+.es6tco
+.es6tni
+.es5tr
+.e7tage.
+.et4sn
+.eur5a
+.eu7stac
+.ex7odus
+.e6zra.
+.f2
+.fo6chv
+.fo6wle
+.f4ri
+.fy6tji
+.g2
+.ga7lage
+.ga7lago
+.ga6lap
+.ga6loo
+.g6arbo
+.ga6sen
+.ge7dart
+.ge3g
+.ge7geks
+.ge7guil
+.gekun5
+.gekuns6
+.ge5la
+.ge7mopp
+.ge7muit
+.ge7nève
+.ge7rogg
+.ges4
+.ge7sjab
+.ge7sjar
+.ge5sk
+.ge5so
+.ges7pe.
+.ge7sper.
+.ge7steg
+.gif3
+.gi7gagr
+.gi6sen
+.gly3
+.gly5k
+.g6lyna
+.g4oo
+.gou7da.
+.gr6äbe
+.g6ruba
+.gui7do.
+.hang5s
+.he6blu
+.he6gor
+.he6gra
+.h6eind
+.hek5o
+.he7rakl
+.he6r5en
+.he6wle
+.hi8v.
+.ho6fet
+.ho6laa
+.ho6loo
+.hooi5
+.ho7taze
+.ho4t5o
+.hy6gro
+.ic7teru
+.i4gl
+.ile7us.
+.i2n1
+.i9n8a.
+.in6ari
+.i7narie
+.ind4
+.in7dwar
+.ing4
+.in5gr
+.in5gw
+.in6iti
+.in5kl
+.in6kly
+.in5kn
+.in5kw
+.in6osi
+.i7nosie
+.in3s4
+.in7snee
+.in7twyf
+.i5raa
+.i3sa
+.i4sk
+.i3so
+.ja6gli
+.jah7we.
+.ja6spa
+.ja7taga
+.j6äger
+.je7sopp
+.jo7dofo
+.jo7safa
+.ju6kos
+.juk7os.
+.j6ü6rge
+.jy6sel
+.k2
+.kaar4
+.kade4
+.kadet5
+.k4af
+.kaï7ro.
+.ka7nont
+.ka6pla
+.ka7plak
+.k6arbe
+.ka7thar
+.ka7thu.
+.ka6toë
+.kat7oë.
+.ka6tui
+.ke6ple
+.ker6k5a
+.ker6k5l
+.kerk5r
+.ker6sa
+.ker6sl
+.ker6s5p
+.ke4s5t
+.kie6st
+.ki6pli
+.ki4r
+.kit7se.
+.k4la
+.k6leyn
+.k4li
+.klip5
+.knik5
+.kn6opn
+.ko6maa
+.ko6maf
+.k4op
+.kope4
+.koper7a
+.ko6pla
+.kop5o
+.ko7rag.
+.kor6st
+.kors7te.
+.k6rak.
+.kr6üge
+.kryt5
+.ku7mon.
+.k4we
+.k4wo
+.ky7otop
+.l'7etji
+.la6eti
+.la6kwa
+.la5sa
+.lei5s4
+.lek7oë.
+.le6poo
+.le5pr
+.le7shab
+.le6son
+.le4sp
+.les5t
+.le6suu
+.lig5e
+.li4gi
+.li6gom
+.li6gre
+.li7pase
+.l6loyd
+.lo6chn
+.lof7ui.
+.lo6glê
+.l6ontd
+.los5k
+.lu6gen
+.lui5sl
+.l6üder
+.m2
+.m'7etji
+.ma6cdo
+.ma6nal
+.ma6nur
+.ma7stek
+.ma7thes
+.ma6zda
+.mel6k5a
+.mel6k5l
+.mer6k5l
+.mes5m
+.me4sw
+.me6tem
+.mi6dos
+.mi6rba
+.mi7traa
+.m4ne
+.mo7djad
+.mo7flam
+.mo6sin
+.mo4sk
+.mu4e
+.my6nen
+.my6n5in
+.my7unis
+.n2
+.n6aand
+.na5fl
+.na6gro
+.na7groe
+.na7smaa
+.na7stor
+.na7uurs
+.ne4k5a
+.ne4k5o
+.ne6kri
+.nek7rin
+.ne6kys
+.ne4s3
+.ne7serh
+.n6etik
+.ne4t5j
+.ne6tru
+.ne6wca
+.ne6wfo
+.ne6wla
+.ne6wma
+.ni4e
+.ni6jho
+.ni6rva
+.nix7on.
+.n6kosa
+.noet4
+.noe5tj
+.no6gee
+.no4k
+.n6ondu
+.nu4l
+.ny7lont
+.oe5kr
+.oe4r
+.oe7ralg
+.oe7rang
+.oer7os.
+.oe4s3
+.o4gl
+.oh7rigs
+.o6klah
+.ok7laho
+.ol6ieu
+.o7lieui
+.oms4
+.o2n1
+.ond6ui
+.on7duit
+.o6nemo
+.on6ias
+.o7nias.
+.on3k
+.on7parm
+.on3s4
+.on6she
+.on6sse
+.on6t7eer
+.on6t5er
+.on4tr
+.ont7ras
+.ont5ri
+.o9nus
+.on6us.
+.oon4
+.oon7de.
+.o4op
+.oor5n
+.oor5s4
+.oo4s
+.o6peet
+.op7eet.
+.o6peg.
+.o6pein
+.o6p5erd
+.o4pof
+.o4pr
+.op5ra
+.ops4
+.op7smuk
+.o7ragie
+.or6kne
+.o3ro
+.orto5
+.o4sk
+.os5ko
+.os7oog.
+.ot6hel
+.o7thell
+.ou6doo
+.ou7nôi.
+.ou5tj
+.p2
+.pa4d3
+.pa7die.
+.pa6vlo
+.pe5la
+.pel6sk
+.per6st
+.pe4sk
+.pe4st
+.pie6tj
+.pi7laf.
+.pit5s
+.p4la
+.po6dzo
+.p6oefe
+.poen4
+.p6ontw
+.po6sad
+.p4re
+.pu6tad
+.py6paa
+.py6pla
+.py6pol
+.pyp5r
+.py7thon
+.r2
+.r'7etji
+.r6aard
+.ra7dart
+.ra6seg
+.ras7eg.
+.re7aumu
+.re6gru
+.rek5s
+.re6mas
+.rem7as.
+.re6mco
+.re4sl
+.rie4t
+.riet5j
+.riet5r
+.ri6ple
+.roc7ky.
+.ro6gak
+.ron7do.
+.rond5s
+.ro5py
+.ros5t
+.ro6tre
+.ro6wli
+.ru7klip
+.ruk4o
+.ru7kope
+.ru7staa
+.ru6suu
+.ry4k5a
+.ry6ste
+.s6aans
+.s4af
+.s4ag
+.sa7gopa
+.s6akty
+.s4am
+.sa6vlo
+.s4ca
+.se6an.
+.see5ra
+.see7ys.
+.se7khuk
+.se6laa
+.se6lop
+.se7reni
+.se6sle
+.ses5t
+.se6suu
+.se6tap
+.se4tr
+.sex5y
+.s6fale
+.s4fi
+.s4gr
+.s4ha4
+.s4he
+.s4hi
+.s4ho
+.s4hu
+.s4in
+.si6nes
+.si7pho.
+.si7rag.
+.s4ja
+.s4ka
+.s4ke
+.s4kl
+.s4ko
+.s4kr
+.s4ku
+.slag5
+.s4ma
+.s4me
+.s4mi
+.s4mo
+.s4mu
+.s6nags
+.s4ne
+.sod4
+.so7dafa
+.so7dwan
+.so7iets
+.so6kop
+.some4
+.s6oms.
+.s4on
+.so6neg
+.s4op
+.so6pek
+.so7phok
+.so7ross
+.s4pe
+.s4pl
+.spo4g
+.s6pren
+.s4py
+.s8ri.
+.s4ta
+.s6temp
+.ste7rol
+.ster6ta
+.ster6t7j
+.s4ti
+.s4to
+.straf5
+.s6trei
+.s6tuar
+.stuc5
+.su7biet
+.sub5m
+.sub5p
+.su8e.
+.s4ui
+.su5kr
+.su7ther
+.su7tra.
+.s4we
+.s4wi
+.s4wo
+.sy1
+.sy6lvi
+.sy7nagr
+.sy7slag
+.t2
+.t6afsy
+.t4ag
+.tee5k
+.te6flo
+.te7rafi
+.te7ragr
+.ter6tj
+.tert7ji
+.te4s5t
+.te7stud
+.ti6ene
+.tie6t5j
+.ti4k
+.ti6ner
+.t6jaai
+.tjok5
+.toe7ys.
+.to6kla
+.to7ky7o.
+.to6lun
+.to7ront
+.tou3
+.trap5r
+.trek5
+.tre4s
+.trie4
+.tries5
+.t4sa
+.ts4h
+.ts6jaa
+.ty6daa
+.ty6dor
+.ty6dra
+.ui6laa
+.ui4t3
+.ui5ti
+.ui5t6ji
+.um7hlan
+.uns4
+.un5st
+.u5raa
+.u5tra
+.va6kad
+.va6kei
+.va6naf
+.va4n5o
+.va7raan
+.va6sen
+.va6swa
+.vas7ys.
+.ve7cino
+.ve7laar
+.ve7lare
+.ve7lêr.
+.ve7loer
+.ve7lome
+.ve7meng
+.ve7rema
+.ve7rena
+.ve7reve
+.ve7skaf
+.ve7tore
+.vlas5
+.vo6gin
+.vo6lyw
+.vo6sko
+.wa7ghri
+.wa4n
+.wa7smou
+.wa6spa
+.web5m
+.we4bo
+.we6b-o
+.week7lan
+.wee4t5
+.we6kuu
+.we4l5a
+.we6lin
+.wel7ing
+.we6nan
+.werk5l
+.wer6k5r
+.we4s5k
+.we6soe
+.we6swa
+.w8hê.
+.w4hi
+.wi6id.
+.wins5
+.wi4p
+.wi4t
+.wî9e.
+.wy7kwas
+.wy7nand
+.wy6net
+.x2
+.y6amin
+.y6anni
+.y6asud
+.yk7loon
+.ys3
+.ys6ere
+.ys5la
+.ze5us
+.z6üric
+.z4wa
+.z4wi
+aa2
+aad1
+aa4da
+aa4de
+aa4do
+aa4d3r
+aaf7emme
+aaf6sat
+aag5al
+aag7asem
+aag7elas
+aag3r
+aag7rond
+aag5s4l
+aag5sp
+aag5st
+aag7swee
+aai7lag.
+aak1
+aa4ka
+aa4ko
+aak3r
+aak7ster
+aak3w
+aal1
+aal6dys
+aald7ys.
+aal5fe
+aal6fpo
+aal5sa
+aal7sfee
+aam1
+aa4ma
+aa4me
+aa4mo
+aam7smul
+aan1
+aan6dou
+aand6re
+aan7dren
+aan7dros
+aan7gons
+aan3k4
+aan5kl
+5aankon
+aan7kry.
+5aanleg
+aan7sage
+aan6see
+aans7eer
+aan6sek
+5aansig
+aan7skem
+aan5sl
+aan5sn
+aan6som
+aan6son
+aan5sp
+aan7tuig
+5aanva
+aap1
+aa4pa
+aa4po
+aap3r
+aa4pu
+aar3a
+aar6dan
+aard7ang
+aard7as.
+aar5de
+aar7ding
+aar4du
+aar3e
+aar3i
+aar7kwek
+aar6lbe
+aar6lka
+aar6lva
+aar6lzi
+aar6l-o
+aar3o
+aar7ser.
+aar7seri
+aar6sid
+aars8teek
+aars8tell
+aars6ti
+5aartap
+aar6tin
+aar7tomo
+aar7tryb
+aar3u
+aas3
+aa4so
+aas7omel
+aat1
+aat7nagt
+aa4to
+aat3r
+aat6sef
+aat7sfee
+aat7slim
+aat6slo
+aat6sly
+aat7sonn
+aat6sow
+aat6sti
+aau6wbe
+aä5ron
+aba6kas
+abak7as.
+aba7komb
+abare4
+aba7ster
+ab3d
+aber6sp
+ab5lau
+ab5rup
+3abso
+abu7scha
+ab5wie
+ac5que
+a2d
+a3da
+a4d3aa
+adam4
+adam7pe.
+ada4r
+a3de
+ades7lan
+ade7smee
+a3di
+adi6eus
+5adjud
+5admin
+a3do
+a4dow
+a3dr
+5adres.
+ads7erwe
+ad4sn
+ads6op.
+ad5sor
+ads7teso
+ad4su
+a3du
+ad5uit
+adu7spel
+adu5tj
+5advert
+a3dy
+ady7smit
+a1e
+ael7atoo
+ae4l5ei
+ae4lo
+aes5to
+aes5tr
+aes7tuur
+aë1
+4afee
+af5eks
+afel5aa
+af4fre
+af5gha
+af5inr
+af3l
+a4fof
+af1r
+af5raa
+af5ram
+af5ran
+a4f3re
+3afri
+a4f5rit
+a4f3ro
+a5frod
+a4f3ru
+af3s4w
+3afva
+afval5
+ag3aa
+a6gaanv
+a4gaar
+ag5adv
+a4g3ak
+ag5alg
+ag5api
+ag5are
+4age.
+4ageb
+4aged
+age6ddo
+a4gei
+4agem
+a4g5erv
+4ages
+a6g5ewen
+agge7us.
+a3gi
+a5ging
+a4g5ins
+agi5s6tr
+ag1l
+ag5ogg
+ag5ord
+ag5ork
+ag5oud
+a4g3re
+ag5rei
+a4g3ru
+ag3sa
+ags7abno
+ag6sins
+ag5ska
+ags7koev
+ag5skol
+ag5skr
+ag5sky
+ags4lo
+ag4sn
+ags6oep
+ag5som.
+ags6oom
+ags6op.
+ag5spe
+ag5s6por
+ags4t
+ags7taal
+ag5sti
+ags6waa
+ags6wee
+ag4tu
+agt7uur.
+a4g3ui
+ag5ure
+ag5uur
+ag-7lag.
+aher4
+ahe5ri
+a4hs.
+ai1
+aig6ne.
+aiï5er
+ai4lp
+ain6ste
+aip6eis
+ai3s4k
+ai5sla
+ais4p
+ais7prys
+ais4t
+ai3tj
+ai3t4r
+a4k5aan
+ak5arb
+ake6lee
+ake6lof
+ak5ess
+ak5ins
+akis4
+akis7te.
+5akkoo
+a2k3l
+a5klank
+ak6leet
+a2k3n
+ako6bre
+ak5oms
+a1kr
+a4k3re
+ak5rig
+ak4sc
+ak5sme
+ak3sp
+a4k3ui
+a2kw
+ak3we
+ak5win
+a3ky
+a4kys
+a1la
+ala7gadi
+a5lagm
+al5agt
+ala7kled
+alan7gaa
+al5dei
+a4lef
+ale6str
+al4f3e
+alf6eni
+al4fh
+al5fie
+al4fj
+alf7olie
+alf6sko
+alf6sni
+alf6sta
+alfs7tan
+al4fu
+alf4-
+5algori
+alien5s
+ali6gal
+ali7glas
+alk7aard
+alk7laag
+alk7oond
+alk5sp
+al4kui
+alk7wyk.
+5alleen
+alm7eier
+alm7lont
+a1lo
+als4a
+als7agti
+als7ghaa
+al6skel
+als7kelk
+als5li
+al4s5oo
+als7pret
+als5waa
+als7werw
+alt6hea
+alt6hus
+alt7rots
+alt6sas
+alt6wee
+a1lu
+alve5o
+a2m
+a3ma
+ama3k4
+aman6t5j
+ama7rins
+am5atoo
+5ambag
+5ambass
+a3me
+am5egt
+ame6sin
+ame5sm
+ame6spo
+a3mi
+ami7skyw
+amm6afu
+5ammun
+a3mo
+amp7arre
+amp7lag.
+amp7leer
+amp7lig.
+amp7lug.
+amp7omhe
+amp7seël
+amp7sfee
+amp7sier
+amp7staf
+amp7staw
+ams7esel
+am6s5kop
+ams7lend
+am6smet
+ams7meti
+ams6mul
+am4s3o
+ams7pels
+am6swan
+am6swar
+ams7wyn.
+a3mu
+a4mui
+am5uit
+a3my
+an5agt
+ana7kwal
+an5alf
+ana6spi
+an4c-
+and7aans
+and7adel
+an6dakt
+an5dan
+and7anal
+an4dap
+an6dase
+an6datt
+and7attr
+an6degt
+and7egte
+and5eks
+and7emal
+an6derf
+and7erf.
+an6dete
+and7etes
+and7eval
+an6dinw
+and7inwa
+and6ja.
+and6jar
+an4d5om
+an4don
+an4d5op
+and7oud.
+an6drak
+an4dro
+and6ser
+and6s7kop
+and7spaa
+and7spre
+and7steg
+and7swee
+an7dwing
+and7wyn.
+ane6ron
+ang7aal.
+ang7adem
+ang7ghor
+ang6hai
+ang6lad
+an5g4li
+an6glig
+ang7lig.
+ang7lip.
+ang6nol
+ang6ons
+ang7ore.
+ang7repu
+ang7sakm
+ang6ska
+ang7snee
+ang6s7te.
+ang7stem
+ang6sur
+ang7ure.
+anie6t5r
+an5inl
+ani5sf
+ani7slaw
+an6kase
+ank7asem
+ank7refe
+an4kry
+ank3w
+an5ops
+an5opt
+an5opv
+an5ord
+an5org
+ano7roei
+ano7stoe
+anr6hyn
+ans7aalw
+an4s5am
+an6sass
+ans7asse
+an4sc
+ans7eila
+ans7eura
+an6sink
+ans7ink.
+an6sjek
+ans7jekk
+ans7jord
+an4ske
+ans5kei
+an6skin
+an6s5kop
+ans7kous
+an6slat
+ans7mada
+an4sn
+ans7oran
+an4s5pa
+an6sper
+ans7pet.
+an4spo
+ans4ti
+ans7toil
+ant5aan
+ant5aar
+an6tass
+ant7asso
+an4tei
+an6teks
+ant7ekst
+5antenn
+ant7ete.
+an6tins
+ant5jo
+an4tol
+ant7opru
+ant7rest
+ant5rin
+ant7rob.
+ant6ski
+ant6sko
+an4tui
+5antwo
+a1ny
+a1o
+a2p
+a3pa
+a4p5aan
+a4p5agt
+ap5aks
+ap5arm
+5aparth
+a3pe
+ape6nop
+a3pi
+api6rfa
+ap3l
+a3po
+apo6kaa
+ap5ond
+apo5sta
+5appar
+ap1r
+ap5rol
+ap3ru
+a4pry
+ap5ryk
+a5prys
+ap6sall
+aps7alli
+ap6seko
+aps7iden
+ap6skof
+ap6s5taa
+ap5sti
+aps7toet
+aps5we
+a3pu
+a4pui
+ap5uit
+a3py
+a1ra
+ara7gwan
+ara7klee
+ara6kop
+ara3p4
+ara6ppa
+ar6d5agt
+ar6das.
+ar6datm
+ar5der
+ar6deti
+ar6d5opp
+3area
+aree5s
+areg7swe
+ar3ei
+are7knip
+ar5fla
+arg4h
+ar5gha
+5argite
+ar4gl
+arg4o
+arie4f
+ari6jke
+ar6k5ana
+ar6kini
+ark7leer
+ar5klo
+ark6los
+ark7onvo
+arko6v.
+ark7snui
+ark5sp
+ar4kw
+ark5wa
+arn6avo
+a1ro
+aroet6j
+aroe7tji
+aroo5h
+aroom4
+aroo5p
+aroo5s
+ar3op
+aro6wva
+ar5rag
+arres5t
+ars5ag
+ars7elek
+5arsena
+ar5sie
+ars6kou
+ars7krap
+ar6skre
+ars7kree
+ar6skro
+ars7pan.
+ar4spr
+ar6stal
+ars7tall
+ars7tee.
+ars6-in
+ar6taas
+art7aasv
+ar6talb
+art7albu
+ar4t5as
+ar4tc
+ar5te.
+art7eend
+ar5teh
+ar4tei
+art6hol
+art6hur
+art6omo
+art5oog
+art5oor
+ar4tor
+art7reek
+art7roep
+art6ryb
+art7samb
+art6slu
+art6spr
+art7spyn
+a1ru
+arus6o.
+a1ry
+ary7taal
+as3ag
+as5app
+as3c
+as4d.
+as4dh
+as5egt
+ase6rak
+as5ete
+as3f
+asg6hit
+as4hi
+asi7freu
+a4sj.
+a4sjm
+a2s3k
+a5skool
+a5skri
+as5kru
+a2s3l
+as5laag
+as3m
+a4smy
+a4sna
+as3no
+as9of.
+as5ogi
+a4s3oo
+as3op
+as3p
+as4por
+as3t
+as4t.
+a5staa
+as4th
+ast6les
+a5stof
+a7strak.
+a5s6tran
+a5s6troo
+as3w
+a4sys
+as5yst
+at5aar
+a4tag
+ata3s4
+ata6sse
+atas7se.
+ata6wba
+ate5it
+5atelj
+ate6rar
+ate6rer
+ate6ron
+a6tetes
+ath7cart
+a5t4hee
+ath7kinp
+ath7lone
+atie6te
+a2t3j
+atk6v-s
+5atleet
+5atmos
+at5oog
+at5ry.
+ats7alma
+at6sint
+ats7inte
+at4sj
+at6skin
+ats6kom
+at6skop
+ats7kop.
+ats7krip
+at4s5le
+ats7lykh
+at4sm
+ats6maa
+ats7nood
+at6somw
+ats7omwe
+at4son
+ats5ond
+ats7onko
+ats7onlu
+ats5op
+ats7ower
+ats7tend
+ats7trek
+ats8treke
+at6stro
+ats3w
+at5the
+att6hys
+at4tu
+atu6maa
+2au
+aud6rey
+au5gra
+aug6sbu
+aul6spo
+au3p
+aure5u
+auri5s4
+aus4t
+aus7tin.
+au5str
+aus7tus.
+aut6ste
+ava6lop
+ave7lott
+avlo6v.
+3avon
+awa7glas
+awas4
+awe5ga
+awe4r5a
+awer6ui
+aws6han
+ax5ofo
+a3ya
+ay4a.
+ay5ist
+ayn6ard
+ayn6or.
+a3yo
+a3yw
+azoo7ka.
+azz7agti
+az4zl
+azz7orke
+1ä
+1b2
+2b.
+babak4
+bab7wiër
+ba4d5ra
+bad5sp
+ba4kin
+ba3kl
+ba4kla
+ba6kleu
+ba4k3o
+ba4k3r
+bak3w
+bal6kla
+ba4lo
+bal7onts
+bal5or
+bal7tsas
+ban4da
+ban6dek
+ban4d5r
+ban7glad
+bang7ste
+bangs8te.
+ban4k5a
+ban6kre
+ban4kw
+bar7kaan
+bar4s3
+bar5th
+bas7ekst
+bas7ghit
+bas7jan.
+ba4sn
+ba5spe
+bas7peer
+bat5aan
+ba3t4j
+2bb
+b3ba
+b3be
+b3bi
+b3bl
+b3bo
+b3by
+2bd
+b3de
+b3di
+b3do
+bed7slaa
+bed6sta
+beds7taa
+be3dw
+beel6dr
+bek7neus
+bek7wind
+bel6aga
+belk6li
+bel7klik
+bel6ldo
+ber6gaa
+berg7aar
+ber4gl
+ber4g5r
+ber7grys
+ber6gzi
+bers7pan
+ber6spr
+bers7pre
+bert6sk
+bes6aan
+bes4k
+be5ska
+be3sl
+be3sm
+be3so
+be5son
+be5sôr
+be3s4t
+be6s5ter
+be5sti
+be6stia
+bes7tial
+bes7trol
+bet4h
+be5tha
+bet7hesd
+be5ton
+be3tw
+2b1f
+2b1g
+b3ge
+bid3s
+bi4du
+bid7ure.
+bie6dui
+bie4g
+bieg5r
+bi4jl
+bin6dri
+bio7sfee
+bi4rc
+bis4a
+bis6ho.
+bis7scho
+bi3tr
+2bj
+b3je
+2b1k
+b3kl
+b3ko
+b3ku
+bla4d5a
+bla6don
+bla4d5r
+bla5so
+4blau
+bleem5
+ble4s
+ble7ser.
+bles5k
+ble6tji
+blet7jie
+blê6rfl
+blik5o
+blix7en.
+blo4k3
+blo7kaal
+blo4m3
+blu6sem
+bly7mare
+bly3s4
+2b1n
+b3no
+bob7slee
+boe6kil
+boe6kom
+boe6koo
+boer6st
+boers7te
+boe4s5k
+bog7gher
+bog7skut
+bo2k1
+bo3ka
+bok6aak
+bok6ale
+bok6as.
+bok6erf
+bok6ies
+bok3l
+bo7kleed
+bok6om.
+bok6ors
+bok6ost
+bok3r
+bok6rag
+bo4m5aa
+bom6aat
+bo4m3o
+bon6dam
+bon6dra
+bond7raa
+bon6tel
+bon4t5r
+bo9op.
+bop6laa
+bor6dak
+bor6des
+bor4g5a
+bor6gri
+b4ors
+bor6saa
+bor4s5k
+bor4s5l
+bor4s5t
+bo2s
+bos7anem
+bos7jamb
+bos7pepe
+bos7taai
+bo5s4tr
+bos7uil.
+bo5t4ha
+bot6sto
+bou6it.
+bou3s4
+b3pr
+brand5a
+breek5
+br4ei
+brei5s4
+brengs7t
+brie6kw
+briek7wa
+3bro
+bro4n
+bro4sk
+bro6vni
+bro6wni
+bru4l
+4brup
+br4üm
+2b1s
+b3se
+b3si
+b3sk
+b3so
+b3sp
+b3st
+bs4ti
+b3su
+2bt
+b3te
+b3ti
+buc7cleu
+buik5s
+bui5t4j
+bult7af.
+bul4t5j
+bul6top
+bult7op.
+bul6tui
+bun7senb
+bus6had
+bus7toer
+but6hel
+buu7rend
+2bv
+b3ve
+b3vi
+2bw
+b3we
+by1
+by3d
+by3k
+by4lb
+by4lt
+by3n4a
+by3s
+bys6kot
+bys4l
+bys6tek
+bys7ter.
+bys6tor
+bys4w
+byt7alka
+byt7eier
+by3tr
+1c2
+2c.
+ca4es
+cam5ph
+ca3pr
+ca3ra
+car6lto
+caru7so.
+cat4h
+ca5tha
+2cc
+c3ca
+c3ch
+c3ci
+c3co
+ce4st
+ces5te
+2ch.
+che6lan
+5chemi
+che6reg
+che5r4i
+che7ryl.
+che7styl
+che6vvi
+ch5hoe
+ch5lei
+ch5nik
+cho7rage
+ch5sia
+2cht
+2ck
+c3ke
+cot7rand
+cove7ry.
+2ct
+c3ta
+c3to
+c3tu
+cus5to
+cyp7rian
+1d
+2d.
+4d5aanb
+d5aand
+4d5aank
+d5aansl
+daard5u
+4dabs
+2d1af
+da2g
+da5gas
+dag5et
+da5gha
+dag6ham
+da5gra
+dag4sk
+dag5so
+dag7ster
+dak7lei.
+dak7oorh
+da4k3r
+dak5wa
+4d5alar
+4damb
+dam6plu
+3dan
+dan6k7erk
+dan6sak
+dan6sko
+dans5m
+dan4so
+dan4s5t
+dan4t5r
+daph7ne.
+dap4l
+da5pla
+4d3arm
+4dart
+d5arti
+da4s.
+das7lag.
+das7traa
+da3t4j
+2db
+dby6lvo
+2dd
+dda5kl
+dda3s4
+dde6lee
+ddel5so
+dder7aal
+dde6ras
+dder7as.
+d3dh
+dd4hi
+deba4t
+dee4g
+deeg5r
+dee4l
+dee7lig.
+4d5eenh
+deë7skou
+4deg.
+2dei
+de3ka
+dek6aan
+de6klad
+de6k5lat
+de6klei
+dek7lei.
+de4kna
+6dekono
+de6krie
+dek7riet
+4deksa
+dek6ska
+del7appe
+del5eeu
+del5egg
+d5elekt
+del7elek
+6d5eleme
+de6leng
+del7enge
+del6fer
+del5fi
+del6fos
+delf7os.
+del5oor
+del7oper
+del6ser
+del4so
+del7sold
+del7sone
+del4sp
+del6str
+del7stre
+delt6ag
+del7tagt
+del7weis
+4demm
+dem6pla
+den6din
+4d3eng
+4denj
+den6kar
+den6kja
+den4k5l
+den4kr
+dens7pre
+den4t5j
+den6tri
+deo7plek
+deo7sfee
+3dep
+der5ast
+de6reen
+der7een.
+der7emig
+der7ent.
+der7flap
+de6rin.
+derm7ins
+der5na
+de4ro
+de5rob
+de5roe
+der5of
+de5rol
+der5on
+der5ow
+der5ps
+der6sjo
+der5s6kr
+der6slu
+der6spu
+der7thal
+der6uit
+de5sag
+des7alni
+des5ap
+de6seng
+des7enge
+de4s5in
+deskat5
+de6skor
+des7leed
+de4sn
+des7offe
+des7oksi
+de4s5on
+de4sor
+de4spa
+des7pari
+des7poës
+des7prik
+des7taal
+des7tele
+de4sti
+de5stig
+de4sw
+des7weë.
+4d5ete.
+deten6te
+de3tw
+4deuro
+deur5s6w
+2d1f
+2d1g
+dge5sp
+dg4li
+2dh
+dias4
+dia7stol
+dia6zvi
+dic7kie.
+dic7tio.
+die6fal
+die6kes
+5diens
+die4pl
+die6tom
+die4t5u
+dig6ofa
+di4gre
+digs4
+dig7skro
+dig7som.
+di6kamp
+dik7amp.
+di4k3l
+di4kr
+dik7ribs
+di4kw
+dik7wyn.
+di4l5al
+din6gas
+din4gr
+4d3inl
+4dins
+4d3int
+4d3inv
+di6sass
+dis7assi
+di4so
+di5son
+dis6pne
+dis7quis
+dit6hak
+dit7jies
+2dj
+dja7dji.
+d4ji.
+d4jia
+2d1k
+dklo4
+2d1l
+d3la
+2dm
+2d1n
+doek5r
+doe6lon
+doe6sko
+does7kop
+2dof
+4dogi
+do4l5os
+dol6sou
+dols7ou.
+3dom
+dom6pli
+dom6sap
+4d5omse
+dom7slim
+dom6swê
+4domt
+don4sk
+4d5oord
+4dopn
+dop6rof
+dop6rys
+3dor
+4d3org
+dor7othy
+dor4sl
+dor4st
+dos6tel
+dou3t
+do3y
+doy4e
+2dp
+d2r
+3dra
+dra6gaa
+4d5rand
+dra7stan
+4dreë
+4d3reg
+d4rela
+d4rew
+4driff
+d5rigt
+d5riss
+4driv
+droë7ys.
+4d5rond
+d5rooi
+4d5roos
+dr4op
+dro6pan
+dro5pn
+dro7sfee
+4d3rug
+d5ruim
+d5ruit
+4d3rus
+4d3ry.
+4d3rye
+4d3ryk
+4drym
+d4ryw
+2ds
+ds5aamb
+ds5aar
+d4s3ad
+d5sakr
+ds5aks
+ds5angs
+d4s3ar
+ds3as
+d3se
+d4s5een
+ds5eis.
+d4s5eko
+dse4l
+dse7leer
+d4s5eng
+d4s5era
+dser6tj
+dsert7ji
+d4s5erv
+d5sfeer
+ds3id
+ds5imp
+ds5inde
+d4s5ins
+ds5int
+d2s3j
+d5skee
+d4skin
+ds5kind
+d4skis
+d5skole
+d4skom
+d5skoo
+d6skraa
+d6skrit
+d6skroo
+d4s3le
+ds3li
+ds6luie
+ds3m
+d5s4mee
+ds6moor
+d4sna
+ds5neu
+ds5noo
+ds5not
+d2s1o
+d3soe
+d5some
+ds3on
+d7sonde.
+d7sondes
+dson4t
+ds5oog
+ds3op
+ds3ow
+d5s4pel
+d5spes
+d3spi
+ds5pop
+ds6prek
+d7spreker
+ds7preki
+d1st
+ds5taak
+d4staf
+d5stand
+ds5tea
+d5stel
+ds5tent
+d5ster.
+ds5terr
+d5sters
+ds4ti
+d3str
+d3stu
+ds3w
+d3sy
+2dt
+dter6tj
+dtert7ji
+du4e-
+duns6te
+dur6rhe
+dusie5k
+dus6kap
+dus6pel
+2dv
+dverdiens9
+dverdien8st
+dve6sid
+dvie4
+2dw
+d4waal
+d5waar
+5d4wang
+dwa6nor
+4dwarm
+dwar7se.
+d3wat
+d4weil
+5dwerg
+dwerk5o
+dwe6tar
+d3wil
+d4wing
+4dwoo
+d4wyn
+dys5ag
+dys6mit
+dys7tuin
+2d-
+d-r6hod
+e1a
+eam6ses
+eang4
+eate4
+eau7mont
+e3ba
+eb5adr
+eb9cu.
+ebou5t
+ebou6t.
+eb4re
+ebrons5
+eb5tui
+ec5cle
+e4chn
+ech7tiaa
+eda7gaat
+eda5go
+e3de
+ed5eis
+eder7as.
+ede7ring
+ede6sap
+ed5off
+edors5
+ed4ra
+ed5rep
+ed6saks
+eds7kalm
+ed4sl
+eds7lafe
+eds5om
+ed3sp
+ed5s4we
+ed5uit
+ed2w
+ed5woo
+ed5yst
+ed3yw
+ee5agt
+eed6atu
+eed5we
+ee4dy
+ee2f
+eef7laag
+eef7lopi
+eef7rant
+eef7rek.
+eeg3l
+eeg5ru
+eeg3s4
+eeg6sdi
+e5eila
+ee2k
+eek5ass
+ee5klaa
+ee5klag
+eek5lo
+eek3n
+eek5og
+eek7oors
+eek7rooi
+eek3w
+eek6wal
+eel5ap
+eel6doo
+eel7doos
+eel5een
+eel7eer.
+eel5ei
+eel7indr
+eeling7s6
+ee6lins
+eel5int
+ee4l3o
+ee5lob
+eel6ood
+eel6oon
+eel5sa
+eel7snag
+eem7onde
+eem5ou
+ee2n1
+5eendj
+een6ema
+ee5nen
+3eenj
+eenk4
+een5kl
+een7slot
+een5sm
+eens6pa
+een7swee
+een7topp
+ee4ny
+eep7esel
+eep7leer
+eep7loog
+ee4pop
+eep7roes
+eep6sam
+eep7skep
+eeps5ko
+eep7skui
+eep6sti
+ee2r
+eer5ap
+ee5red
+eer5ee
+eer5end
+eer5in
+ee5rob
+eer7oes.
+eer5om
+eer5on
+ee5row
+eer5ps
+eer7skur
+eers7lam
+eer7smed
+eer6sow
+eer3u
+eer6ust
+eery4
+eer5ys
+ee2s3
+ee4s.
+ees6ala
+ees6ap.
+ees6lep
+ees5me
+ees7muil
+ee5sna
+ee5sny
+ees6op.
+ees6pre
+ee5staa
+ees6tal
+ees4tr
+ee6styd
+ee4sw
+ee5syd
+ees6yfe
+eet7appe
+eet7eenh
+ee4ti
+eet5in
+eet7rek.
+ee6troe
+eet7roed
+eet7ruik
+eet7wiel
+eeu3g4
+eeu5in
+eeus4
+eeu7spoe
+eeu5tj
+eeu6ur.
+ee5yst
+e3êr
+eë5aan
+eëks5t
+eël7eier
+eël7yste
+eë4na
+e3ër
+eër7agti
+eë5ran
+eër7arm.
+eë5rod
+eër6ske
+eë4sk
+eët6ste
+eëts7te.
+e4faf
+ef5afs
+ef5eks
+5effek
+ef5inh
+e1fl
+ef5loo
+e4fly
+ef5oms
+ef5oue
+ef3st
+efs6tal
+eg5amp
+ega5s4k
+e3ge
+ege6las
+egel7as.
+eges7per
+eges4t
+ege6vwo
+e6ginko
+eg5ogg
+eg5rig
+egs7enti
+eg6sins
+eg6s5int
+eg3sk
+egs6lot
+egs6pre
+egs6pri
+egs6pyk
+eg6s7taal
+egte6re
+e4g3ui
+eher6in
+ehe7rinn
+eho6kra
+eib7niz.
+eid7rok.
+eid7saam
+eid7salo
+eid7sirk
+eid7skou
+eid7sku.
+eid7spa.
+eid7spek
+eid7ste.
+eid7stoo
+eid7sug.
+ei1e
+eie7naan
+eig6h-n
+eig7opro
+eik7aard
+ei5kno
+eik7wydt
+eil6spa
+3eind
+ei4n5ed
+ein7eed.
+ein7glas
+ei4non
+ein7oord
+ei4n5op
+ein7otte
+ein6sad
+ein6sep
+eis7angs
+ei5sei
+ei6s5ind
+ei5sja
+eis7kamm
+eis6kaw
+ei5skê
+eis6kot
+eis6laa
+4eiso
+eis7ouer
+eis6pir
+ei5s6tel
+ei5s6tre
+eit2
+eit7hand
+ei3tj
+eit7klin
+eit7nisp
+eit7onde
+ei5tra
+eits5ko
+eits5l
+eits5o
+eit7spor
+eit7stak
+eit7stra
+eits5w
+eï5mit
+eï4na
+eïn7klin
+eï4no
+eï4nu
+eï5oni
+eï4sl
+eja7stas
+ek5aan
+ekaars8te
+ek5aks
+e3kan
+ek5asg
+e3ke
+ek5een
+eke7naar
+eke6tam
+e3kê
+e4k5ins
+ek3k
+e4k5les
+e5kleu
+e4klê
+ek5log
+e3koe
+eko6mol
+ekom4s
+ek5omsl
+ekoms5t
+5ekono
+ek5ooi
+e3kop
+eko6pap
+e4k5opm
+ek5opn
+ekor6da
+eko7rum.
+ekou6st
+ek5owe
+e1kr
+ek5rad
+e4k5rok
+e5krom
+ek5rug
+ek6sapp
+5eksemp
+eks5esk
+eks7inge
+eks7logi
+eks7loks
+eks7outo
+eks5pir
+eks5po
+eks6poe
+eks6tel
+ek6sten
+ek4sti
+eks7uur.
+ek5uit
+e4kwê
+ek5wie
+e4kwu
+e1ky
+e1la
+e6l5aand
+el5aanh
+e6laanv
+el5aard
+el5adm
+el5adv
+el3af
+el3ag
+e5lag.
+ela7klon
+e4l3al
+e5lari
+e4l5arm
+ela7slan
+el5asp
+eld7adel
+el4dap
+el5de.
+el6d5ele
+eld7erfe
+eld7evan
+eld7olie
+eld7onde
+eld7smid
+e3le
+el5eien
+eleis6t
+elei7sta
+e6lelek
+el5erts
+ele7sett
+ele6too
+el4faa
+elf6abr
+elf6eit
+elf7en-d
+elf5erk
+elf6lan
+elf6les
+el4fon
+elf7onth
+elf7ontp
+el6foop
+elf7oops
+el6foor
+elf7oors
+elf6ron
+elf7twyf
+e3li
+eling8stell
+el5inh
+e6linko
+el5inv
+elk7nage
+elks4
+el4kwi
+el4lv
+elm5agt
+e1lo
+el4ob
+e4lol
+el5oli
+el5ond
+el5ont
+e4loor
+e4l5opd
+el6ope.
+e4l3or
+el5phi
+els7angs
+el5sfe
+el6sind
+els7indr
+el6skan
+el6skom
+els7korr
+els7krit
+els7lof.
+el5smi
+els7mora
+els6nag
+els7nood
+els7onde
+els7oork
+el6stek
+el6s7tran
+els7ware
+el5swee
+elt7akke
+e1lu
+el5uit
+eluit6j
+elui7tji
+e3ly
+ely6kaa
+em5app
+e5masj
+eme6lek
+eme6lew
+eme6ron
+eme4s
+eme7sis.
+emes5m
+emes5t
+e5metf
+em5eva
+e4moef
+em3op
+em5org
+emp7laag
+emp6skr
+ems4p
+em5spl
+e4naf
+ena7glas
+en5agt
+en5akk
+en5alt
+e4n5art
+ena6spe
+en6d5agt
+ende7ro.
+end7raak
+end7rit.
+ends7oë.
+end7sons
+end7ure.
+end6wer
+en5eil
+en4en
+e4n5ent
+5energ
+ener6tj
+enert7ji
+eng6hor
+eng4la
+eng6lor
+e3ni
+en4ig
+en4im
+en5inh
+e6n5ink.
+eni7soms
+3enji
+en6kinh
+enkom4
+enkoms5
+enk3w
+e5nomm
+eno7ryn.
+en5out
+ens7adem
+en6sall
+ens7are.
+ens7eise
+ens7elek
+ens7elik
+en5sen
+ens5erv
+ens7esse
+ens6haw
+en5sie
+ens7inga
+en5sji
+ens7koei
+ens7kyke
+ens7luik
+ens6med
+ens7nuk.
+en4son
+ens7onru
+ens7onva
+en6spei
+ens7pist
+ens7pot.
+en6spou
+ens7pous
+ens7taak
+en6stak
+ens6tam
+en6steh
+ens6tei
+ens6tel
+ens7tele
+en7sters
+en7s6tes.
+ens6tet
+ens6teu
+ens6too
+ens7toom
+ens7trek
+ens7uil.
+ens7ure.
+en5sy.
+ent5akt
+en6teks
+ent7inte
+ent7rif.
+ent7rok.
+ent6sin
+ent6son
+ent6spa
+ent6wen
+en3ui
+enu6lin
+enu5sk
+enu5st
+e3ny
+en-7steg
+e1o
+eoe4s
+eo5fag
+eo3g4n
+eoi6ste
+eop6lek
+eo3ro
+eo1s
+eos4t
+eo3tr
+e4paf
+e4p3ag
+epe6loo
+ep5emm
+ep5epi
+epers7te
+5epidem
+e4p5int
+ep4la
+ep5lap
+ep5ligg
+ep5lus
+epoet4
+epo6nin
+ep5ops
+e4p5rei
+eps7ameu
+ep6s5eis
+eps5id
+ep4sj
+ep4sk
+eps7kano
+ep5ski
+eps7kohe
+ep4slu
+eps7luik
+eps6oms
+eps5on
+ep4s5pr
+eps7waar
+ep5uit
+e1ra
+er4a.
+er5aan
+er5afd
+er5afh
+er5afsk
+er5aft
+er5afv
+er5afw
+er3ag
+era7gree
+era7kles
+er5aks
+er5akt
+er5alb
+er6ald.
+er5alt
+er5ana
+e5randa
+e4rapp
+er3ar
+era6ser
+era7uitv
+erd7ryle
+erd7slip
+erd7tree
+er3dw
+er4eb
+er6eenk
+er5eers
+er5eff
+er5eie
+er5eil
+er4ek
+er5ekst
+er5elm
+e4r5emm
+e6rengt
+e4reni
+e4renj
+er5erg
+er5erv
+e3r4es
+er5esel
+ere7spio
+eres6ta
+ere6stp
+ere7temm
+e5rewa
+e1rê
+er4fh
+er6flaa
+erf7leen
+er6flet
+erf7lett
+er5flo
+erf7lug.
+erf7lus.
+erf7omhe
+erf7oom.
+er4fp
+erf7reuk
+erf7ruik
+erg7aren
+erg7lyn.
+erg7renm
+erg7rymp
+erg6rys
+erg6sho
+erg7stra
+erg7uitj
+er4id
+eri5fr
+e3rig
+eri4g5a
+e4r5ind
+e6rink.
+e6rinna
+er5ins
+e4r5int
+e6r5ital
+eri7trea
+erk5aan
+erk7esel
+erk6has
+erk7ink.
+er6kins
+erk7inwy
+er4kj
+er6klat
+er5kle
+erk7onde
+erk6opn
+erk6s5on
+erk7spas
+erk6sto
+erk7uurr
+er6kweë
+erk7weë.
+erk7ywer
+er5lik
+er5lui
+erm4a
+erm7aanh
+erm7afsl
+ern7eiwi
+ern7kwes
+er4nm
+er4nn
+ern7oes.
+er4nr
+e1ro
+er5oew
+er3oë
+er5ogg
+e3roï
+e5rok.
+e4r5oks
+e4r5oli
+er5om.
+er5omh
+er5oms
+er6ona.
+er5oog
+e5room
+er5oond
+e5roos
+e4r3op
+e5ropa
+er6opla
+e5ropo
+e4ror
+e5rora
+5erosi
+e4r5oss
+ero7stil
+er5oud
+er5oue
+erou6t.
+erp7anke
+er6pinh
+erp7inho
+erp6lan
+erp7ruik
+erp6sig
+err6ein
+ers7assi
+er6s5eli
+ers7ete.
+ers7inda
+ers7jean
+ers7kaia
+er6skaj
+ers7kaju
+er7skake
+ers7kaki
+ers7kete
+ers7kiss
+ers7koet
+ers7koor
+ers7kop.
+er5sky
+ers7less
+ers7lone
+ers7luid
+ers6mal
+er7smara
+er6smat
+er4s5om
+ers7onvr
+ers6opn
+ers7ower
+ers7pien
+ers7put.
+ers7scen
+er5ste
+ers7tele
+ers6teo
+ers4ti
+ers7treg
+ers7waar
+ert5aan
+er6taap
+ert7aap.
+er5tap
+ert7ape.
+er6tend
+ert7end.
+er5tes
+ert6hal
+ert7jakk
+ert7opin
+ert7orre
+er6tres
+ert7rok.
+erts5l
+ert7uur.
+ert6wak
+er5twi
+e1ru
+erug3
+er5uin
+er5uit
+er3uu
+e1ry
+ery7doel
+ery7salf
+erys6ma
+ery7smaa
+ery7suur
+ery7trek
+e5saan.
+e5sage
+es5agt
+es4ak
+es5all
+esa6mol
+es4an
+es3c
+es4dh
+e3se
+e4s5een
+e4s5epi
+es4er
+e3si
+es4ia
+es4ie
+es4if
+esi6gei
+e4sill
+esin6s5i
+es4it
+e2sj
+e4s5ke.
+es5kle
+eskor6s
+eskors7t
+e5s4kut
+e3sla
+es5lem
+es4lip
+e1sm
+es4me
+es5me.
+es5men
+es9mè.
+e5smou
+es4mu
+es5nie
+es5noo
+es4ny
+esoet6j
+esoe7tji
+eso7fagu
+es4ol
+e3s4oo
+es4ou
+e1sp
+e5spel
+es5pen
+e4sper
+es5pet
+es5pir
+es4pli
+es4pra
+ess6opv
+e1st
+es4t.
+e5stad
+es5tas
+e4s5te.
+es5tea
+es5teli
+e4s5tes
+estes5o
+est6her
+es6tik.
+es5toi
+es5tos
+e6strak
+es4tre
+e5stuk
+e3sw
+es4yd
+e4t3ag
+eta7stas
+e3te
+e4t5eie
+ete5r6aa
+etie4l5
+5etike
+et7jie-k
+etk6ysi
+eto6nop
+et5opv
+e4t5ord
+e4t5ram
+e6treke
+e6treko
+etre7kor
+et5rim
+ets7fyn.
+et6skat
+ets7kato
+ets7kous
+ets7krie
+et6s5lap
+ets6maa
+ets5ong
+et6spaa
+et4spr
+et6stek
+ett6re.
+et5uits
+et5unie
+et4wi
+et5win
+et4wy
+et5yst
+2eu.
+eug6rie
+e3uit
+euk7inte
+euk4l
+eul7eien
+eu4loo
+eu5mon
+eum7uitg
+eu4na
+eun6sla
+eup7aand
+eu4ra
+eur5aa
+eur6aal
+eu5ral
+eu4ree
+eur7eet.
+eu6reg.
+eu6regt
+eur7egth
+eur7ekst
+eur7elem
+eur7spar
+eu4sa
+eus7ape.
+eus7jig.
+eus6kot
+eus6tac
+eute4l
+eu5tem
+eu3tr
+e1uu
+2eu-
+eva7kwaa
+eva6les
+evr6ore
+evu6es.
+ewal4s5
+ew4ar
+ewee4
+ewe7gaan
+ewe7goed
+ewe7inde
+e5weis
+ewe6nee
+ewen8stes
+ewe6res
+ewe7span
+ewik4s
+ewiks7te
+exy7ste.
+eyn4o
+e5yste
+e3yw
+e4zka
+ez9ra.
+è1r
+ê1
+êe4ro
+êla7flui
+ê4rde
+êre6loe
+ê4rhe
+1ë
+ë1g
+ëi3e
+ëk4sk
+ëks3p
+ëks6pek
+ëk4st
+ë3laa
+ël5agt
+ël5alb
+ël5as.
+ë4lei
+ël5ent
+ëlf4l
+ël5fle
+ë5loop
+ëls7kuil
+ën5agt
+ën4tr
+ënt5re
+ëpre4
+ër5aan
+ër5afd
+ër5off
+ërog4
+ëro3s
+ër5owe
+ërs7kent
+ë1ry
+ë1s
+2f.
+1fa
+f5aanb
+f3aar
+f3ad
+2f1ag
+f4agi
+fah7renh
+fai6r-n
+fak6ste
+faks7te.
+fan4t5j
+fan4tr
+fant6s5t
+f3ap
+f3art
+faru6q.
+2fb
+2fd
+f5dein
+fde4s
+fde7sake
+fde7sess
+fde7skei
+fde7stor
+fde7stra
+fde7sust
+f3d2w
+1fe
+4feen
+3f4ees
+f3eie
+fe4l5ap
+fel7asem
+fel7enti
+fe6loon
+fel7oond
+fel5s4m
+fel6spoo
+fe4lu
+fe4ly
+fel5ys
+fer6skr
+fers7kra
+fer6sku
+fers7kui
+f5erts
+fe2s
+fes3t
+fet7ete.
+f1f
+ffe6las
+ffe6ret
+ffe6tet
+ffi6eek
+ffies6m
+ff5rei
+f1g
+fge7sper
+fg4ha
+fg4li
+fg4ly
+fgod4s5
+1fi
+fi3d
+fid6ji-
+fie7ekst
+fie7lafo
+fie7smaa
+fie4s5o
+fie6tol
+fi5lag
+fil4m5a
+4finr
+fi5sto
+fit4z
+2f1k
+fkom6st
+fkoms7te
+fla4p
+flap5o
+f2le
+f5lees
+f5lese
+fle4t
+flet5j
+flex7or.
+2fli
+5f4liek
+3f4lit
+2fm
+fmo4no
+f1n
+fni4s3
+1fo
+f3of
+4foff
+fok4s5t
+fol4k3
+4foms
+5fonds
+fond6sk
+fond6st
+fonds7te
+f5ontb
+5fonte
+f5ontl
+f5oorl
+2fop
+fo4po
+fop7spen
+f5orde
+f3org
+for7oksi
+fo5rom
+fo3ru
+fos7feen
+fout5j
+fox7hill
+fox7stra
+fp4sa
+1f2r
+frag6aa
+4fram
+f4ras
+f4ren
+fre4s5k
+4f3rig
+fri6too
+f4rod
+fru5ga
+f3ry
+2f1s
+fs5agt
+f4s5ank
+f4s5eko
+f4skon
+fs5log
+f3sm
+f4sma
+fs4me
+fs4mi
+f3sp
+fs4pl
+f4spro
+f4s5tak
+fs4ti
+2ft
+ftre4
+ftre5d
+ftrek5
+1fu
+fu4ch
+fur6ore
+fu3so
+4fuur
+f5uur.
+2fv
+fva4l
+2fw
+1fy
+fyn7goud
+2f1ys
+fyt7appe
+fyt7jie.
+2g.
+1ga
+g4aai
+gaam6s7te
+g4aan.
+g5aanbi
+g6aandh
+g5aanl
+g5aanw
+g4aat
+4g3add
+2g1af
+g4afo
+2g1ag
+g4agr
+ga5gre
+gag6rep
+gak4l
+ga5kla
+gal7afsk
+gal7appe
+galei5
+gal7oog.
+gan6gra
+4g5anke
+gans7ke.
+g3app
+ga3ra
+4g3arb
+4g3arm
+gar4s3
+gars6ti
+gar7stig
+g5arti
+ga6sarm
+gas7arm.
+gas6mok
+ga4so
+ga5sol
+gas6pel
+gas6tre
+ga4tr
+gat7ruik
+gay7nor.
+2gb
+gbys4
+2gd
+gde7roof
+gdut7jie
+g3dw
+gd4wa
+1ge
+ge3d
+gedi4s
+g5eenh
+gee6tal
+geet7al.
+geës3
+geë6sti
+ge3f
+4ge4ff
+gef4l
+ge1g2
+4geg.
+geges5p
+geg6uil
+g3eie
+geï7migr
+ge7k6lik.
+4geks
+gek4y
+gel6agk
+gel6dad
+gel4do
+ge5lol
+ge5loo
+ge6loon
+gel7oond
+gel6s7te.
+gemi7au.
+gem6opp
+3gen
+gen4dr
+gen6dur
+genes5t
+4geng
+ge4oi
+gep4a
+ge5pag
+geper6st
+gepon6s
+3ger
+ge5rap
+ger6ard
+ger5ete
+ger7iden
+ge6roef
+ger6ogg
+ger6spo
+ger5sw
+ger6uit
+ge3sa
+ge5sfe
+ge5sin
+ges7jagt
+ges4k
+ges7kade
+ge3sl
+ge3s4m
+ge5sne
+ge3sp
+ges7perb
+ges7pers
+ges7pes.
+ge3st
+ges6tas
+ges6tig
+ges4w
+ge5tja
+ge3tw
+ge3ui
+ge5um.
+gev7woes
+gewens7te
+ge1y
+2g1f
+g3fl
+gf4li
+2g1g2
+g3ga
+gga7kwee
+gga7stre
+gga5t4j
+gge6sti
+2gh
+5g4hoer
+gho7ghok
+gho4l
+5gholf
+g4hs.
+ghu6moe
+1gi
+g5iden
+gie6far
+gi4fa
+4gimp
+gin6gaa
+4g5inri
+gip4s
+gip7siet
+gis7enti
+gi5tra
+git5sw
+2g1k
+gkaar4
+5g4lans
+gla4sa
+gla6sel
+gla6ska
+glas5o
+g4le.
+5g4len.
+gli6don
+g4lif
+gli6gur
+4glik
+g4lim
+g4lip
+3glis
+g4lob
+4glod
+3g4loe
+g4lof
+3g4lom
+g3lop
+3g4lot
+g4lo-
+g3lus
+3g4luu
+g4ly.
+4glyn
+2gm
+gma7skui
+2g1n
+gneem5
+gneet5
+gnie6ko
+1go
+god6sak
+god6sid
+4g3oef
+goe7krui
+4goes
+g5oes.
+g5oeta
+goe7the.
+goë7lary
+2g1of
+3gogi
+gol4f5o
+4g5olie
+go4mag
+4g3ong
+gon6sto
+g3ont
+goo5gl
+4g3oor
+2g1op
+go5pla
+3g4opo
+g5orig
+go3sl
+gos7pelr
+g5osse
+go3s4t
+gou4d3
+goud6a.
+gou7dief
+gou7dini
+gou7dink
+goud6s.
+gow7rie.
+go9ya.
+2gp
+1g2r
+g4rab
+g5rak.
+gra4ma
+gra7mado
+gra4m5o
+g4ras
+gra4s5a
+gra4se
+4g3red
+g4ree4
+g5reek
+greep5
+4greë
+g4ren
+gren6st
+g5rese
+gre4sp
+gre6sur
+gre6tji
+gret7jie
+g4reu
+griek6s7t
+grie6t5j
+4grig
+gri4p
+g5rit.
+4g3rok
+g4ron
+4g5rooi
+g5rook
+g5room
+g5rowe
+4grug
+g5ruim
+4g3ryk
+4grym
+gry6ste
+2gs
+g2s1a
+g5saam
+gs3ad
+gs6ade.
+g4saf
+gs5agt
+gs5aks
+g5sala
+g5sale
+gs5ana
+gs5ant
+gs5app
+gs6appe
+gs3ar
+gs3as
+g4s5een
+g4s3ef
+gs5eis.
+g6seise
+gs5eko
+gs5eks
+g5sekt
+g4s5ele
+g4s5eli
+g4s5ene
+g4s5est
+g4sew
+gs5ewe
+gs3f
+g5s6feer
+g4sid
+gs5ide
+g6simpa
+gs5inde
+gs5ini
+gs5inl
+gs5ins
+g2s3j
+g2s1k
+g5skaal
+gs5kab
+g5skad
+g6skapa
+g5skatt
+g5sked
+g5sker
+g7skeur.
+gs7keurd
+g3ski
+g4s5kin
+g4skl
+g5skof
+g5skole
+g4skom
+g5skoo
+g6s5koor
+gs5korr
+g5skot
+g5skou
+gs3kr
+g2s3l
+g3s4la
+g5s4lop
+gs3m
+g5snel
+g2s3o
+gs4ol
+gso6pro
+gs4ou
+gs3p
+g5s4pel
+gs5per
+g5spes
+g3s4pi
+g6spill
+gs4poe
+gs6pore
+g7sports
+g5s4pru
+g1st
+g6s5taak
+g4s5tab
+gs6tabi
+g4stak
+g4stal
+g4star
+g4s5tek
+g6stelg
+g6stera
+gs5teri
+g6sterr
+gster6s
+g6stese
+g4sti
+g5stigt
+g4stoe
+g7stoele
+gs5toer
+gs5toet
+g4s5ton
+gs5trad
+g6strak
+g6stran
+g6strap
+g6strib
+gs5troe
+gs7troon
+g6struu
+g4s3ui
+gs3w
+gs6werw
+2gt
+gte7eenh
+gte7lagi
+gte6ras
+gte6rer
+gte4ro
+gte7roer
+gte7rol.
+gtes4
+gte7sfee
+gte7smee
+gt5uri
+1gu
+gu2a
+gu2e
+gu5ela
+guid6o.
+gui6rla
+4guit
+2gv
+2gw
+g3yst
+2g-
+1h2
+2h.
+2ha.
+hal4f3
+hal6m5ag
+4halo
+hal4s5k
+hal6s5tr
+ham7pagn
+ham6skr
+hams7kra
+han6dan
+han7dja.
+han4dr
+han4du
+han6gli
+han6gor
+hangs6l
+hang5s6w
+han4s5k
+han6ska
+har6dop
+hard7op.
+har6sel
+har6sol
+har6spa
+har6t5aa
+har4t5j
+har4to
+har7toem
+ha4wk
+haw7shan
+hay6eli
+heb7lus.
+hee4l
+heer8s7te.
+hees6e.
+heg7orga
+heg7rank
+heg7spyk
+5heid.
+heid7stem
+he4ko
+hek7saan
+he4k3w
+hel7ange
+hend4
+hen4so
+he2r
+her3a
+he9ra.
+her6akl
+he7rald.
+he5r4an
+he3re
+her7egpa
+he4r5ek
+he4r5ev
+herf4
+herfs5
+her3i
+her6ib.
+he5rid
+he5rod
+he5rol
+her5ond
+her7ontm
+he5ros
+her6oss
+he5rou
+her5ow
+her7sche
+her3u
+her5yk
+he4sp
+hes7peru
+he4s3t
+hete5r6o
+heu6paa
+he3us
+hev3
+he4vr
+hewen7st
+hie4r
+hier7in.
+hie7roni
+hie7rony
+hië1
+hil6lbr
+5hings
+hing6s5t
+hipe4
+hi4rl
+hi4sp
+his5pa
+hi4v-
+2hl
+h3li
+2hm
+h3ma
+2hn
+hode6sl
+hodes7la
+hoe7kaai
+hoe6kys
+hoe6spi
+hoe4s5t
+hoër7op.
+ho4fa
+hof5aa
+hof7amp.
+hof7uits
+hog6hok
+hoi7swer
+hok7rakk
+hol7aar.
+holes5
+4holf
+hol5in
+hol7oog.
+4hon.
+hon6daa
+hon6dag
+hon6dro
+hop7land
+hop7smaa
+ho3ro
+hor4s
+hor4t5j
+hos6hol
+ho4ta
+hou4t5a
+hout5j
+hou6tol
+hou6tom
+hou6who
+2hr
+hre6sto
+hrie4
+hries5
+hris5t
+h3te
+h3to
+hu9go.
+hui6daa
+hui6dui
+hui6sef
+huit6ji
+hui7tjie
+huk6hun
+hul4p5a
+hul6pek
+hul6ple
+hul6por
+hul6ste
+huls7te.
+hu3mo
+hum7oes.
+humus5
+huter6s
+hut7jie.
+hut6spo
+hut6ste
+huts7te.
+h5vill
+2hw
+hyg7roma
+hys3k
+hys7tang
+i1a
+iaan6so
+iaan6sp
+iaan6st
+iaans7te
+iam7son.
+ia4nop
+ias6koo
+ia5spo
+ia5sta
+ia5s4tr
+i4baf
+i4bag
+ibou6s.
+ic5ky.
+i2d
+i3da
+ida7groe
+id5agt
+idde6ra
+i3de
+ide7snui
+i3dê
+i3di
+idia5s
+id4ja
+i5djan
+i3do
+i3dr
+id2s1
+id4s5et
+ids7inoe
+id4ska
+ids7kerm
+ids5kr
+ids3l
+ids7lags
+ids7nye.
+ids3o
+ids3p
+ids6pa.
+ids6pek
+ids6pie
+id6spil
+ids6pri
+id6spry
+ids7taal
+ids7tee.
+ids7teks
+ids7tele
+ids5ti
+ids5toe
+id6s7trek
+ids7ure.
+i3du
+id3uu
+ieding6s7
+ied7ione
+ied5rol
+ied3w
+i1ee
+i4eee
+ie5een
+ieë7aard
+ieë6lys
+ief7alar
+ie5fie
+ie4f3r
+ief7stal
+ief7uitg
+ie5gla
+ieg7loka
+ieg7riem
+ie6grit
+ieg5st
+iek7asyn
+ie5ke.
+ie6k5erv
+iek7esse
+ie5kie
+ie6klaa
+iek7laai
+ie4kni
+ie6k5ond
+iek7ople
+ie6kops
+iek7opse
+iek5opv
+ie4kre
+iek7revu
+iek7rigt
+iek7ware
+iek7wees
+ie4k5wi
+iek6wos
+iek7wyd.
+ie4laa
+iel6afo
+ie6lene
+iel7oor.
+iel6san
+iel6s5on
+ien7anal
+ien7glor
+ien6kro
+ien7olie
+ie4n5oo
+ien4s
+ien7sakk
+iens5or
+ien7sout
+ien7span
+iens5t
+ien7stam
+ien7stel
+ien8stele
+ien7stet
+ien7stoo
+ien5suu
+ie4n5ur
+ie6poog
+iep7oog.
+ie6proo
+iep7rooi
+ier7afma
+ie6rafs
+ier7engt
+ier7eter
+ier7neff
+ier7omtr
+ie4r5on
+ier6oni
+ier6ony
+ier7swee
+ies6amp
+ie5se.
+ie6senk
+ies7enke
+ies7ents
+ies7ferw
+ies7kaf.
+ie6skon
+ies7kop.
+ies7kraa
+ies6kry
+ies7laag
+ie6slep
+ies7lepe
+ies5li
+ies7luik
+ies7meub
+ies7mooi
+ie3so
+ies7oes.
+ies5ond
+ies7oorp
+ie6sopn
+ies7opne
+ies7pane
+ies5per
+ies7plig
+ie6s7taal
+ies6tas
+ies7tee.
+ie6steh
+ies7tele
+ies7tent
+ies6tin
+ies5uil
+ie4s3w
+iet7aans
+iet7aard
+iet7alba
+ie5te.
+iet7erts
+iet7omse
+iet7reke
+iet7reko
+iet4sl
+iet7uie.
+ie5twi
+ie4tys
+i1eu
+i4eub
+i4eud
+i4eug
+ieu7grie
+i4e3ui
+ieu7ing.
+i4eul
+i4eum
+ieu7skot
+i4euu
+i4euv
+i4euw
+ie5wie
+ie4w-
+ie5yst
+ie-7klik
+i3èr
+i1ê
+iël6sku
+iën6tji
+iënt7jie
+ië4s3t
+i4fei
+i4fim
+i4fin
+if1l
+i2f3r
+i4f3ui
+i4g5aan
+i4gap
+igare4
+igaret5
+ig5eff
+ige6naa
+ig5ete
+ig5ins
+ig1l
+ig5loe
+ig4op
+ig5opt
+ig5org
+igo7roos
+ig5res
+ig5roo
+i4g3ry
+ig3sa
+igs6ins
+igs7kaps
+ig7skend
+igs5ko
+ig5sku
+igs6mee
+igs6ona
+ig5soo
+igs7poei
+ig5sti
+ig7stoei
+igu7era.
+ihu6ahu
+i1i
+ike6roe
+iket5j
+ik5kli
+i2k3n
+iko6nat
+i1kr
+ik6sakt
+iks7akte
+iks7iden
+ik4sin
+iks7inve
+iks7juk.
+ik6skom
+iks7paar
+iks6pad
+iks7pare
+iks6tik
+iks6tuu
+iks6wel
+ik5wan
+i4k3we
+i4kwy
+2il
+i1la
+il5agt
+ila6too
+ilbe6st
+ild7agti
+ild7smaa
+ild6stj
+ild7temm
+ilet5a
+ile6tji
+ilet7jie
+ilf4l
+il5fli
+il5gha
+ilinde6
+illo4w
+3illu
+il4m5at
+ilm7oper
+i1lo
+ilo5sk
+ils7insp
+ils7orde
+il4spr
+ilt7aar.
+i1lu
+i2m
+i3ma
+im5agt
+i3me
+i4mek
+im5eks
+ime7laar
+iment6s
+ime4s
+imes5t
+i3mê
+i3mi
+5immigr
+i3mo
+i4m3o4p
+imo7theu
+5implik
+i3mu
+imu6maa
+in5aard
+i4naf
+i4n3ag
+in5akk
+in5arg
+in4d5aa
+in4das
+inder7as
+5indiv
+ind6oef
+in6doog
+ind7oogm
+in6d5oor
+ind7sleu
+ind5sw
+3indu
+in5dwi
+inee7tji
+ine5ra
+2inf
+ing7aars
+in5gan
+ing7eter
+ing6hpa
+in6gind
+in6ginf
+ing7infr
+ing7inst
+ing6leb
+ing6ope
+ing6opl
+ing5ou
+ing7pseu
+in4g5ru
+ing7saag
+ing7sap.
+ing7see.
+ing7sekr
+ing7seku
+ing7sfer
+ing7sin.
+ing7sinj
+ing7skal
+ing7skêr
+ing7skud
+ing7slep
+ing7slym
+ing7sofa
+ing7som.
+ing7somm
+ing6s7pil
+ings9telle
+ing7stin
+ing7suie
+ing7suil
+ing7swel
+ing7uil.
+i3ni
+ini6gaa
+in4ik
+in5inf
+5inisia
+ink7erts
+ink7laag
+ink7ler.
+ink7nerf
+ink5nu
+ink7ogie
+in4kol
+ink7olie
+5inkom
+ink7ring
+in6krol
+ink5st
+ink7wit.
+5innam
+5innemi
+innes6t
+inne7ste
+in5ong
+ino7skaa
+in5rag
+5inrig
+ins7epou
+in6s5ete
+5insets
+in4sg
+ins7kaps
+ins6kin
+in3sl
+ins7molt
+ins7moor
+ins6ond
+5inspek
+ins7prie
+ins4t
+5insti
+insti7t.
+ins6ton
+ins7twis
+int7appe
+int5ess
+inte6s5t
+int6he.
+int6uit
+int6wyf
+inu5e.
+5invlo
+i1o
+io3pr
+ior6ubr
+io1s
+ios4k
+io5skl
+ios4p
+ios4t
+io3tr
+i2p
+i3pa
+i4p3ag
+i3pe
+i3pi
+i3pl
+ip4lo
+i3po
+ipo4s5t
+i3pr
+ipre4
+ip4s.
+ips7kopi
+i3pu
+i4pui
+i3py
+i1r
+ir4ch
+irke4
+irkel5o
+irop4
+iro5pr
+iru4s
+i4rwa
+is3ag
+i5sagi
+i4s5aks
+i6sangs
+is3ar
+i4sarg
+is5asp
+i4sav
+is3c
+i4s3ei
+i4s3et
+ise5um
+i5sfeer
+ish7nie.
+i4s5int
+is5inv
+i2sj
+i4sj.
+is5jan
+is5joe
+i2s3k
+is4k.
+i4ska
+is6kaaf
+is5kan
+is4kê
+is5kui
+i2s3l
+is5laa
+i5slag
+is3m
+i5s4mit
+i2s3n
+is5oes
+is5ond
+is3or
+is3p
+is4p.
+is3t
+is4t.
+is4th
+isto7pho
+i5s4tyn
+i4s3ui
+i5suik
+isu6maa
+is3w
+i2t
+i3ta
+it3ag
+ita6tis
+it3b
+i3te
+ite7dwal
+ite7glas
+itek7te.
+ite6mas
+i5tenh
+it4er
+ite5ru
+i4t5ete
+i3tê
+i3ti
+it4in
+i4t5ins
+i3to
+ito5fa
+ito7plan
+ito7rowe
+it1r
+it3re
+it3ry
+it4sc
+it5ser
+its5ete
+its7jood
+it4s5oo
+its7perk
+its6tek
+its7tori
+its7uur.
+i3tu
+itu6saa
+it5win
+i3ty
+ity7sokk
+itz7laan
+i1u
+ium1
+iu4ma
+iu4me
+iu4mi
+iu5mie
+ium6uur
+iwel6s5k
+iwe7mos.
+iwes4
+iwe7spor
+iwe5st
+1ï
+ï2m
+ïn5akt
+ïn3o
+ïns4t
+ïn5und
+ïs5lam
+ïs3t
+1j
+3jaa
+jaar6s7kr
+3jac
+ja4cq
+3jag
+ja4ga
+jan7ghai
+jan7knap
+jap4l
+ja5pla
+3jare
+3jari
+ja4sm
+jas7pant
+jas6tas
+jaz4z
+jaz7zeri
+je4kn
+je4kr
+jek7rasi
+je5rop
+jes7nië.
+jes4t
+je4t3r
+jet6sjn
+jeu4g
+5jie5kn
+jie6nan
+jie6nol
+jien5s
+5jieon
+5jieop
+jie6ska
+jie7skap
+jies7kat
+jie6ski
+jie6skop
+jie6s5lo
+jie6slu
+jie6sol
+jie6son
+jie6spa
+jie6s5tr
+jie6sui
+jie7suik
+ji4eu
+jin7gope
+ji4rp
+job4s3
+joe7kwee
+joen6sk
+5joern
+3jong
+jos6afa
+jou7kuit
+juit6sp
+juk7riem
+3jun
+jun6kre
+2k.
+1ka
+k4aal
+k5aand
+kaan8s7te.
+k5aanw
+kaar7se.
+kaars7te
+5kaart
+kaar6ti
+kaar6t5j
+kade6la
+kade6sl
+4k3adv
+5kafee
+kaf6oef
+4kafr
+4k3afs
+2k1ag
+5kagem
+k4agg
+5kagge
+k4ago
+k4agr
+4kaks
+kal4k5a
+kal4k5l
+5kalko
+kal6koo
+kal4kw
+kal4s5p
+kal4st
+3kam
+kam6par
+kam6ple
+kams4
+3kana
+kaner5o
+3kank
+kan6ont
+kan6sko
+kan6ste
+kans7te.
+3kant
+kan4t5j
+kant7om.
+kan4t5r
+ka4pak
+5kapas
+kap7inte
+5kapit
+kap6lak
+kap7lat.
+kapo4
+ka5pri
+kap7seis
+kap6spr
+kap6stek
+5kapte
+3kar.
+5karak
+4k5arbe
+k5arm.
+ka5roo
+kar6oor
+kar4st
+k5arti
+kar5to
+3kas
+4kasg
+kas7laai
+kas6maa
+kas7traa
+ka5s6tro
+5kateg
+kat7etes
+kat6har
+kat6hu.
+ka4too
+kat7ryk.
+kats4
+kat5sw
+kat7uil.
+kay6aku
+2kb
+kbe6kwi
+kbout7ji
+2kd
+k3de
+1ke
+kede6lo
+kee2
+keel5a
+4keen
+keep6s5t
+keer6so
+keer6ste
+keë6laa
+keël7aar
+4keff
+kei6dro
+keids7pr
+4keik
+keis4
+kei5st
+4k3eks
+ke4l5ak
+ke6lane
+kel7anem
+kel7assi
+kel7eenh
+4k5elem
+ke6linb
+kel7inbr
+kel6mag
+ke4l5ou
+kels8onde
+kem6afa
+4k3emm
+ken6aar
+ken6dra
+ken7eel.
+4k3enj
+3kenm
+3kenn
+ke4nou
+ken7son.
+kep7laai
+kep7ler.
+ke4p5lo
+kep5sk
+ker7een.
+ke4rel
+ker7els.
+ker7flan
+3kerk
+ker6kal
+ker6kin
+ker6k5or
+ker6kow
+ker4kr
+ker7kris
+ker6kui
+kerk7uil
+kerk5wy
+ker6m7eng
+ker6naf
+ker6nei
+ker6nen
+ker4n5o
+ker7oes.
+ke4r5on
+ker6pru
+ker6set
+ker4sk
+ker7skil
+kers7kom
+ker6slo
+ker4sn
+ker4so
+ker7son.
+ker6s5pi
+kers5w
+4kerts
+6k5ervar
+kes6el.
+ke4sn
+ke6trol
+ket6ska
+5ketti
+ke4tu
+keu6ror
+3keus
+keut7jie
+key7kleu
+key7nooi
+kê4rb
+2k1f
+2k1g
+kga7laga
+kge5la
+2kh
+kha7yeli
+k4hoi
+khu7khun
+1ki
+ki2e
+kie6dro
+kie7laai
+kie6mas
+kiem7as.
+kie6sent
+kie4s5k
+kie7skry
+kies5l
+kie6slo
+kies7tan
+kie4ta
+kieu5s
+ki4kl
+ki4ma
+4kimm
+5kind.
+6k5indel
+kin5dr
+4kindu
+k3inh
+4kinl
+4k5inst
+kio4s
+kios7ke.
+kip7ling
+ki4rc
+3kis.
+kis7obli
+ki5s4po
+ki5s6tew
+kit4s
+kits5k
+2k1k
+kk4ag
+kka7smaa
+kka5str
+k3ke
+kke6nee
+kker5kr
+kk4li
+1k2l
+k5ladi
+4kland
+k5lang
+k4lank
+klas3
+klas6e.
+kla6sin
+k5leerd
+4kleg
+k5lege
+k4l4ei
+4klel
+4k3len
+3kle4p
+klep7as.
+k4ler
+5klere
+kle5us
+k3lê
+4klied
+k4lier
+4k3lig
+4k3lik
+5klikk
+kli6kop
+k4lim
+kli6moe
+k4lin
+5klink
+k5linn
+kli4p3
+k4lis
+kli7sjee
+4klog
+klo6kon
+k5loos.
+k4lou
+klub5h
+klu6bre
+4klug
+2k3ly
+2km
+kman7spo
+1k2n
+k4nap
+4knav
+5kneg.
+4knei
+4knem
+kne4t
+knet5j
+3kni
+kni6kla
+kni4p3
+knoe4
+knoe7te.
+4k3nom
+k5noot
+k4nop
+knor7os.
+1ko
+kob7rego
+3kod
+4k3oef
+3koek
+koe6kei
+koe4l5o
+koe5pl
+3koer
+koe4s3
+koe7sist
+3koë
+4koë.
+k4ofi
+4kogi
+kok7onth
+kok6skr
+ko5lag
+kol6for
+3koll
+3kolo
+3kolw
+3kom
+kom7aan.
+kom7bina
+4komg
+kom7ghad
+k5omhu
+kom7miss
+kom7saal
+kom4sp
+kon7atoo
+4k5ontl
+kon5tr
+4k5onts
+4k3oog
+ko4op
+5koord
+3koö
+ko4pag
+kop7ape.
+kope7la.
+kop7las.
+4koplo
+3kopm
+4kopn
+5kopno
+ko4po
+6kopper
+kop7uits
+kord7aan
+kor6doe
+kor6foo
+k3org
+koring7s
+k3ork
+ko3ro
+3korp
+kor4s5l
+kor7sten
+kor4t5a
+kor6tji
+kort7jie
+3kos
+kos7eetp
+kos7inko
+kos7juff
+ko4sk
+ko5ski
+kos5ko
+kos5pe
+kos5taa
+ko4t5ak
+5kotel
+kous7te.
+kou5tj
+kovi7ev.
+ko4vk
+ko4vs
+k5owerh
+2kp
+kpro6pa
+kp4si
+k2r
+k5raad
+3kra4g
+kra7gers
+krag5o
+k5rak.
+4krand
+5krank
+5kredi
+5kreet.
+k4reëe
+4k3reg
+4k3rek
+k3rel
+k5rese
+3kret
+4kri4f3
+4krig
+kri4k3
+kri6moo
+3krin
+kri4p
+krip7lee
+3kris
+4k3riv
+k5roet
+k5rolp
+5kroon
+kr4or
+4k3row
+4krub
+3krui
+4kruim
+kru6kas
+kruk6s.
+kru4l
+k5rusp
+kry6fin
+krygs5t
+4k3ryk
+kry7sket
+3kryt
+2k1s
+ks6aan.
+ks5agt
+ks4ak
+ks5chi
+k4s5een
+k4s5erv
+k4s5eti
+k3si
+k6singe
+ks5ins
+ks6jari
+k4skan
+ks5kin
+k4skon
+k4slê
+ks3li
+k5s6maak
+ks5moo
+k5smou
+k2s3n
+k5snob
+k4sob
+ks5obj
+k4s5ond
+ks5onl
+ks5opk
+k2sp
+k5spek
+k5spel
+ks5pen
+ks5per
+k5spes
+k3spi
+k4spir
+k5spra
+k5spri
+ks5pur
+k6s5taal
+ks5tant
+k6steken
+k6stemp
+ks5tens
+k6stera
+k6s5teri
+k6sterr
+kster6t7j
+ks5tet
+ks5tip
+k7strado
+k6s5trah
+k5s6trak
+ks5tur
+ks5tuu
+k3sty
+ks3ui
+k4s5ure
+ks3w
+k5swei
+ksyn4
+2kt
+kte6rad
+kte6ron
+kter6sp
+ktes4
+k4the
+k3ti
+k3to
+kto6rev
+k3tu
+kt4wi
+1ku
+kud7aksi
+3kuik
+4kuim
+kuin4
+kuins5t
+4kuit
+kul6der
+kul6plo
+kul6poo
+3kult
+3kun
+4k3uni
+kun6sin
+3kurs
+3kus
+ku6seen
+kus7lang
+kus7node
+kus7taak
+kut3r
+kut6slu
+kuus6te
+kuu7ste.
+2kv
+kvang6s
+1k2w
+4k5waar
+k3wae
+k4wan
+3k4war
+kwa7skaa
+k4week
+4kwees
+4kweg
+4k3wer
+kwê7lafl
+kwik3
+kwi6kwa
+3kwis
+2k3wo
+3k4wot
+k3wu
+ky4fa
+kyk7uit.
+k1ys
+2k-
+k-5kli
+2l.
+4laanb
+4laanh
+4laard
+laat7slo
+laat6str
+lad7onde
+la4du
+4ladv
+2laf
+la4fa
+l3afd
+2lag
+l4ag.
+la4ga
+la5ga.
+la5gas
+l4agi
+la5gie
+l4agl
+lag7lag.
+l4ago
+lag5ri
+lag7some
+lai6rgo
+lak7albu
+lak6led
+lak7okul
+lak7oore
+4l5aksi
+lak3w
+lak7ware
+lamb7da.
+la4m5oo
+lam6pli
+lam6pol
+lamp7oli
+lam6sko
+lam6sle
+lam6spe
+3land
+lan6daa
+land7aar
+lan6dad
+lan4d5r
+land6sta
+land6s7te
+lan6gaa
+lan7gnol
+lan4go
+lang7ste
+langs8te.
+lan6gur
+lan4k5a
+lan4k5l
+lan6kop
+lank7ope
+lan4k5r
+lan6kwi
+lan4s5k
+lan4sp
+lan4s5t
+lan6taa
+lan7taat
+lan4t5j
+lan6tre
+4lantw
+lap3r
+4l3art
+las7elek
+las6ie.
+la4sn
+la4so
+la5sol
+la4sp
+las5pa
+late5r6a
+5lawaa
+lba6spe
+lbe6kne
+lbo6wvi
+lb4re
+ld5amb
+ldan7ha.
+ld5apt
+l4d5een
+ld5eis
+lde6rat
+lder7os.
+ld5ins
+ld3of
+ld5oor
+ld6oor.
+ld5ord
+l4dow
+ld5owe
+l5draa
+l4d3re
+lds4k
+lds6maa
+ld3so
+lds6ond
+ld3sp
+l4d5uit
+1le
+lec5tr
+lee2
+lee4g3
+4leep3
+leer5a
+leer7eis
+5leerl
+leer5o
+leer5s
+lee4s
+lees7tra
+lee7tjie
+lee7vaar
+4l3eff
+leg7slot
+4leien
+lei7gleu
+lei6kaa
+lei6naa
+lei6not
+lei7skoo
+lei6spa
+leis7pan
+lei7spir
+leit5s
+lek7loti
+le4kn
+lek6suu
+3leli
+5lengt
+4lenj
+len6sel
+len6ste
+lens7te.
+len6tji
+lent7jie
+le5pel
+lep5li
+lep7oog.
+lep7ratw
+lep5sk
+lep6szy
+leps7zy.
+ler4a
+5leraa
+ler6kam
+lerk7amp
+lerk5sp
+4lerts
+le4see
+le4set
+les5ete
+les6hab
+les7insl
+le4ske
+les7kes.
+les7lie.
+les7onde
+le4s5oo
+le3st
+les7taak
+le4ste
+le5stel
+les6tin
+les5tra
+les4ty
+les7uur.
+les7wete
+l5etan
+le4tc
+let5em
+let7oorb
+let7rol.
+let6sko
+4leuf
+le3u4m
+leun5s
+leur7eg.
+leu4r5o
+leute4
+lew6ein
+6l5ewena
+4l5ewig
+3ley
+1lê
+lê4rw
+lf5aan
+lfa7stra
+lf3ei
+l4fek
+lf5eks
+l4fen
+l4f3ev
+lf4ie
+l4fin
+lf5ing
+lf3l
+l5flap
+lf5onde
+l5fone
+lf5onts
+lf3op
+l2f3r
+lf6skar
+lfs7karm
+lfs7kop.
+lfs7kuil
+lfs7nier
+lfs7oog.
+lfs7perk
+lft4w
+l4f3ui
+l4f3uu
+l1g
+lg4ha
+l4gli
+lgo7lagn
+lg6ordy
+lgs6mee
+1li
+liat6ji
+lia7tjie
+3lid
+lid7onts
+3lied
+lie6gli
+lie6kwy
+lie5la
+liers5w
+lie5sme
+lie7steg
+lie7stys
+lie7swak
+4l3i4eu
+lig7inte
+lig6las
+lig6ny.
+lig7omge
+lig7rekl
+lig7riet
+li4gro
+lig7skag
+lig7sona
+lig5s4p
+lig5s4w
+lig7ure.
+lik7aspa
+4likk
+5likkew
+li4kl
+lik7opsi
+lik6see
+lik6sju
+lik6soo
+li4k5wa
+lin6gid
+lin6gin
+lin6gli
+lin6goo
+ling7ooi
+4linh
+lin4k5l
+lin4kr
+l5inli
+4l3inr
+l5insp
+lin4t5j
+4linv
+li4pa
+li4p3l
+lip5la
+li5plo
+li6poml
+lip7omly
+li4p3r
+lips4
+lip7soom
+5lisen
+l5item
+liter6t7j
+lit3j
+litjie6
+lit3r
+lit7sha.
+lit4sp
+lit4s5t
+lit6zdo
+ljus4
+l1k
+l4kaf
+lka6tio
+lkat7ion
+lk5een
+lks7emos
+lks7epos
+lk6skap
+lk4sku
+lk4sl
+lk4son
+lks7ower
+lk5spe
+lk5spr
+lk6stel
+lks7tell
+lkter6t
+lktert7j
+lk5uil
+lk5wat
+lk5wit
+l4kwy
+lk5wyf
+2l1l
+l3la
+llat6ji
+lla7tjie
+llei5s
+lle7knop
+lle6rui
+lle6swe
+lleve7ë.
+llo5sk
+lls7moor
+l4maf
+lmo6kal
+lmo4no
+lm3sm
+l1n
+lne4s
+lob7eend
+loe6dal
+loe6det
+loe7dja.
+loe6don
+loe4d5r
+4loef
+loe6gos
+loeg7os.
+loers7te
+loe6skr
+loe4st
+lof7opri
+lof6spa
+4logig
+log4o
+lo5gop
+log7sot.
+log4st
+log7stok
+lo4k3l
+lok7onde
+lok7swin
+lo5kwi
+l5olie.
+lomer4
+lomert5
+loms4
+4lond
+lon6gaa
+long7aar
+lon6spa
+lon6ste
+lons7te.
+4lont
+lon4t5j
+3lood
+loofs5w
+l4oop
+5loopb
+l5oore
+5loosh
+loo7stra
+lop7emme
+4lopl
+lop6rys
+lo3ro
+lo5ryn
+5lose.
+lo4sj
+lo4sk
+los7laat
+los5ta
+los7trum
+los7wikk
+lo4tak
+lot7riet
+lot7ruïn
+lot7swan
+lot5ui
+loui7sa.
+lou3t
+lou6wna
+lou6wre
+lou6wtj
+lo4wr
+low5ry
+lox7era.
+lö4jd
+löj6don
+lp5aan
+lpe6nin
+lp4he
+l4pon
+lp5ond
+l1r
+2l1s
+l4s5aar
+l4sad
+ls5arm
+l4s5asp
+l4s5eko
+lse4l
+lse5le
+lse6mek
+ls5erva
+ls5fei
+lsg6haa
+lsi6g5aa
+ls5jas
+l4s5kin
+l4skon
+l6skorr
+l4skre
+l4skru
+l5s6maak
+l5s4mee
+l4snaa
+ls5opw
+ls6plet
+l5s4pli
+l4spu
+l3st
+ls4ti
+l6stoeg
+ls5waar
+ls5wet
+ls5wyn
+l4t3ag
+l4t5amp
+lta7spie
+lter6sk
+lt5oond
+l5t4wak
+lu4bh
+lu4bl
+lub5le
+lub7loka
+lu2g1
+lug6er.
+lu5gub
+3lui.
+4l5uie.
+lui7masi
+lui7slan
+4luit
+luk5raa
+luk7rake
+luk6s5pa
+l5unie.
+luns6a.
+lur6pag
+lus7moor
+lu3t4h
+lut6zpu
+luus6te
+luu7ste.
+lva7soor
+lve5ti
+lwe4r5a
+lwe6rui
+1ly
+lyce7um.
+ly4fe
+ly4fo
+lyk7aant
+lyk7lope
+lyk7lug.
+ly4kn
+ly4k3o
+lyk6ont
+lyk7rede
+lyk5sk
+ly4ma
+lym5ag
+lym7uint
+3lyn
+lyn6aaf
+ly3pl
+ly3sp
+lyt7ring
+1m
+2m.
+mac7dona
+made7us.
+mae4s
+m1af
+4mafd
+m4afo
+ma5fro
+4mafs
+mag6sta
+ma4hd
+mah5di
+mak6lot
+ma3kw
+ma5lag
+mal7thus
+mamat6j
+mama7tji
+man7djar
+man3g4
+man7gona
+man6n-p
+man7salm
+man7spen
+man6spr
+man6s7taa
+man6sto
+man7ure.
+map4l
+ma3ra
+mar6kek
+mar6kle
+mar6kom
+mar6kon
+mar4k5r
+mar6lpr
+mar4s5k
+mar4s5t
+mar6tro
+mary7na.
+mas6koo
+mas6kri
+mas6kui
+mas6tek
+ma5s4tr
+mat6hes
+mat7thys
+may7nard
+2mb
+mb4re
+2md
+mdo6poë
+mdop7oë.
+md5soo
+m3dw
+md4wa
+4meder
+mee7kole
+mee5kr
+5meel.
+mee5l4o
+mee5ne
+mee7reis
+mee7reke
+mee5sl
+mee7spre
+meest7al
+mee6tre
+me3ga
+megas4
+mega5st
+4megt
+mei6nee
+mel6aar
+mel7ekwa
+mel6kal
+mel6kjo
+mel6kla
+mel6kna
+mel4k5r
+melk5s
+mel4k5w
+mel7spul
+mel6too
+mem7phis
+men7angs
+men7eise
+men7opga
+men6sky
+men6snu
+men4s5p
+men6s5ta
+men6tin
+men4t5j
+men4t5r
+me5phi
+me4rak
+me6rass
+mer7asse
+mer5ast
+mer7dein
+me4rei
+me6reng
+mer7enge
+mer7esse
+mering8s9taa
+mer6kli
+mer6kna
+mer7kopn
+mer4kw
+mer7kwar
+mer5oes
+mer7onth
+mer7treë
+mes4a
+me4sal
+me4s5ka
+me6s7koor
+me6skor
+mes7kore
+me6skro
+mes7kroe
+me4sl
+me5slu
+mes7moss
+mes7port
+me6stas
+me4s5to
+mes7ware
+me4t5ee
+met7emps
+meter6so
+meu6las
+meul7as.
+2m1f
+mfloer6
+2m1g
+mgang4
+mgangs5
+mgeper6
+mges7per
+2mh
+mh4ei
+4mid.
+mid7osea
+4mids
+mids5t
+mie6kas
+mie6kwa
+mie6ret
+mie4r5y
+mie6skr
+mie6taa
+mie6tji
+miet7jie
+mig6re.
+migu7el.
+mih7rab.
+mil6taa
+min7gopl
+4m5insp
+6minstu
+mi4rl
+mi3sf
+mis7sêr.
+mis6tkr
+mis6tok
+mit7swa.
+mi4v-
+2m1k
+mkaar4
+mkom6st
+mkoms7te
+2m1l
+m3la
+2mm
+mma5sp
+mmas6to
+mma7stor
+mmat6ji
+mma7tjie
+mme7loor
+mme6res
+mme4r5o
+mmi7stok
+2m1n
+3mod
+mode4l
+mod6jad
+3moe
+moed4s
+moe6nes
+moe4st
+mof6lam
+mok7alba
+mole4s5
+m5olie.
+mol4m5a
+mon6dch
+mon6dop
+4m5onts
+3moon
+moor6da
+2mop
+m3opl
+4morg
+mo3ro
+mor6sju
+mor6spo
+mor4s5t
+mo5saa
+mos3f
+mos7fles
+mos7inen
+mo4ske
+mos7keë.
+mo5sta
+3mot
+mote7us.
+mot6heu
+motor5a
+mou5fl
+mou7slip
+mou6ste
+mous7te.
+mou6tek
+mo9ya.
+5môre.
+2mp
+m4pag
+mpa7gne.
+mp5agt
+mpe6lys
+mpen6to
+mp4her
+mp5ops
+mps7kraa
+mp5sli
+mps7taal
+2m1r
+2m1s
+ms5app
+m4s5kat
+m4skon
+ms7kraal
+m5slin
+m3s4me
+ms3op
+ms5pen
+m6s5taal
+ms4te
+m5steg
+m5steo
+m3sw
+2mt
+mter6t5j
+muc7klen
+mues7li.
+muf7smaa
+mui6les
+4muit
+3mul
+mum7aant
+muns4
+mun5st
+mun6tou
+mur4g
+mur7gie.
+3mus
+2mv
+mvi6tra
+2mw
+myl7afst
+myl6sla
+3myn
+myn7ent.
+myn7impa
+myn7inge
+m1ys
+2m-
+2n.
+1na
+3naal
+3n4aam
+4n3aan
+6n5aardi
+naar6skr
+n5admi
+4n3adv
+nae6lys
+nael7yst
+n1af
+n4afi
+naf6lad
+nag6aand
+na6gaap
+na4g5ap
+na6gemm
+nag7emme
+nag6las
+n4ago
+nag5ron
+nag3s
+4nagt
+n5agtig
+na4gu
+nai7set.
+na5kli
+nak6lip
+4nalf
+4nalt
+3nam
+na3p4l
+na3pr
+nap7roet
+4n3arb
+4narea
+na3s4k
+nas7klip
+na3s4l
+nas6maa
+na3sp
+nas6pel
+nas4pr
+na5s4ta
+nas6ten
+nas6tor
+na5s4tr
+na5stu
+nas6tuu
+nas4w
+na5swe
+na5t4ha
+nat6jie
+nat7onde
+3nav
+5nawee
+na9yl.
+2nb
+nba6chs
+4nche
+2nd
+nda7gesk
+nd5akt
+nd5app
+n4d5arb
+nd5art
+n4d5ass
+nda7stoe
+nde7eier
+n4d5een
+nd5eg.
+nd3ei
+nd5eksa
+ndel8s7kor
+ndel8s7taa
+nd5emm
+nde6rad
+nde6raf
+nder7af.
+nde6rar
+nde6rem
+nde6r7ent
+nde6r7ess
+nde6rim
+nder7in.
+n6deros
+nde7rosi
+nde7sill
+nde6zvo
+nd5ide
+ndi5go
+nd5ins
+nd3of
+n5dome
+nd5omt
+nd5ond
+nd5ont
+n4d5opb
+ndo5st
+nd5rak
+nd5rat
+n4d3re
+nd6resd
+nd5riff
+nd5riv
+nd5roe
+nd5rok
+nd5rot
+n6druim
+nds7ertj
+nds7geru
+nd6sinl
+nds7kenn
+nds7koor
+nds7kraa
+nd6s7laag
+nds6leg
+nd5s6maa
+nds6ons
+nds7oorn
+nd5sor
+nd6spre
+nd5spu
+nds7taal
+nd6stek
+nds7toet
+nds7troe
+nds6wee
+ndt6wis
+ndu4e
+n4d5uit
+ndu7kraa
+n4d3ys
+1ne
+nebe6st
+nec7ticu
+5neder
+nee2
+nee4l
+neel5a
+n4eem
+4n5eend
+4n5eenh
+neer5o
+neer5s
+nee6tew
+neeu3
+nee7uur.
+nee7woor
+4neff
+4neg.
+ne5gla
+n3eie
+4neil
+4neksp
+n5ekspe
+nel6lma
+ne6loon
+nel7oond
+nel6spo
+3nem
+nem6afi
+nen4sl
+nep7olie
+3ner.
+ner6faf
+nerf7af.
+ne4ros
+ner7psig
+ner6sle
+ner5sw
+ners6we
+nes7evan
+nes6tas
+ne4ste
+net7omge
+ne4tri
+ne5um.
+neu7moko
+neu7raal
+neu6sji
+neu6ska
+neu7stoo
+neu6toë
+neut7oë.
+ne4wt
+3nez
+1nê
+2n1f2
+n3fl
+nfy6tap
+2ng
+n4gad
+n4g3ak
+n4g5apt
+n4g5ase
+ng5ass
+n4g5een
+n4g3ei
+ng5eks
+nge6r7aap
+nge6r5al
+nger6d5r
+nge6ret
+nges7per
+ng5eten
+n6geter
+ng5imp
+n4g5ink
+n6ginst
+ng1l
+ng6lasu
+n4goë
+ng5oë.
+n4g3on
+n4g5oog
+n4gou
+ngp6seu
+n6g5raad
+ng5ran
+ng5rat
+n4g3ri
+ng7sade.
+ngs7agit
+ng7sappe
+ng4see
+ngs7eise
+ng4sek
+ng6serk
+ngs7erke
+ng6sero
+ng6serv
+ngs6fer
+ngs7impa
+ng4sin
+ngs5int
+ngs5kan
+ng7skat.
+ng7skoel
+ngs7koep
+ngs7kop.
+ng7skors
+ngs7kort
+ngs7kurw
+ngs7kuur
+ng6s5laa
+ng6slab
+ngs7labo
+ngs7ladi
+ngs6lep
+ng7s6loop
+ngs6lym
+ng4sn
+ng5sni
+ngs6oet
+ngs6ofa
+ngs6omm
+ngs7pelo
+ngs7pill
+ng5spoe
+ng7stabi
+ngs7tal.
+ng6steh
+ng6stei
+ngs7teik
+ngs7telg
+ng6stem
+ngs7tema
+ng7stemm
+ngs7temp
+ng6s5ten
+ngs7tese
+ngs6tin
+ng6stou
+ngs7tou.
+ngs7trap
+ngs7truu
+ngs6uie
+ngs7ure.
+ngs6wel
+ng5uit
+2nh
+1ni
+nie6kaa
+nie7knik
+nie6raa
+nier7aar
+niers5w
+nie6uin
+nig7aard
+ni4g5ee
+ni4g5ie
+niks7py.
+nik7warm
+4n3ind
+4ninf
+nin6g7ele
+nin6get
+4ninh
+4n3ins
+4n3int
+4ninv
+n5invo
+n2is
+nis7alma
+nis6ara
+ni5see
+nis5id
+nis7insp
+nis6oms
+ni4son
+ni3tr
+nit7sare
+nje7glas
+nje7krui
+njie6st
+2n1k
+nkaar4
+nk5aard
+n4k3af
+n4kak
+nk5aks
+nk5eff
+n4kei
+nk5eie
+nke6las
+nke6lit
+nke6ree
+nkers6w
+nker7swe
+n4k3li
+n2kn
+nk3na
+nk5nes
+nk5neu
+n4k3of
+n5kofi
+nk5psi
+nk5rig
+nk5rol
+n4k5roo
+nk5ros
+nk5rye
+nks6noe
+nk4s5om
+nk3sp
+nks4t
+nk3s4w
+nk5uit
+n2kw
+nk5wat
+n5kwen
+2n1l
+n3la
+nli4ga
+nlu4s
+n1n
+nna6spo
+nna7tjie
+nne6pol
+nne6sev
+nni4s
+1no
+4noef
+4noes
+noe4st
+no4g5al
+nog7eens
+nok5as
+no9ko.
+nok7riww
+3n4oma
+n4omm
+nomo7yi.
+no4n3a
+4n3ond
+4n3ont
+noo6dan
+n3oog
+noor6di
+4nopb
+no5pla
+nop6laa
+4noplo
+nop7omhu
+nop6rod
+4norg
+n5orga
+nor6kla
+3norm
+nor7tham
+nos6kaa
+no3sp
+3nota
+3note
+not4r
+no5tre
+2np
+n1r
+nroet6j
+nroe7tji
+2n1s
+n4s5aar
+ns3ag
+ns4an
+ns5angs
+ns4e.
+ns4el
+nse4pr
+nser6to
+nser6tr
+ns3f
+ns6feer
+ns5gel
+n3si
+ns4ia
+ns4ie
+ns4ig
+nsi6gar
+ns7inges
+nsi6tri
+ns4iu
+ns3ja
+n6skafe
+n5skap
+n4skar
+n4s5kel
+ns5kin
+n6skous
+n4s5kra
+n2sl
+n3sla
+ns5lam
+n6sland
+ns3le
+n4s3li
+n4s3lo
+ns6lotg
+ns6lott
+n3slu
+ns4mee
+n5snar
+n4sne
+n5snel
+ns5noo
+n5soek
+n4soë
+ns5oë.
+ns5ond
+nson4t5
+ns5onw
+ns3op
+ns5par
+ns5pas
+n4s5per
+ns7portr
+n4spot
+n6sprat
+ns6prek
+n6staak
+n4staf
+ns5teh
+ns6tel.
+ns6tels
+n5s6ter.
+ns6ters
+ns5trak
+n3s4tu
+n4s3tw
+nst6wyf
+ns5tyd
+ns3w
+ns6weer
+n4syw
+ns5ywe
+2nt
+nt5ags
+nt5ark
+n4t5art
+nta5tj
+n4t5eie
+nte6ram
+nte5sm
+nte6sti
+n5t4hon
+nti7kwaa
+nt5inv
+nt3ja
+n4tjo
+nto7fakt
+nt7oksie
+n4t5oli
+nto6nad
+nt5ond
+n4top
+nt5ops
+n4t5org
+nt7radin
+nt5raf
+n5tref
+ntre7kor
+nt5rim
+nt5roe
+nt5rom
+nt5ron
+nt5room
+n5troos
+n5trou
+nt5row
+nt5rui
+nt5ryk
+nt3sa
+nts7inge
+nt6skan
+nts7kand
+nt4s5le
+nt3s4m
+nts7onde
+nts5paa
+nt3st
+nt5uit
+ntu4m3
+n4t3ys
+1nu
+3nua
+nu4e.
+nu4es.
+2nui
+nuk4w
+nu5kwa
+nul7soms
+4nuni
+nu5skr
+nu6skra
+nus4t
+nu3tr
+4n3uur
+2nv
+nva6lis
+2nw
+ny4so
+nza6cs.
+o1a
+o4bag
+ob5agt
+o3bo
+ob5vor
+oby6nro
+ock7wyn.
+oda5gr
+od5een
+ode7leie
+ode7spaa
+od5lui
+od3op
+od3re
+ods7akke
+ods7kish
+od6slak
+ods7lake
+ods7lopi
+ods5oo
+ods6op.
+ods6org
+ods7paar
+ods7rogg
+ods6uit
+ods6waa
+ods6war
+ods6wyg
+odu4k
+oe4d5aa
+oe4d5ag
+oe4dei
+oed7eie.
+oed7ette
+oe6dind
+oed6ja.
+oed7onde
+oe4d5oo
+oe4d5op
+oe4d5or
+oe4d5ro
+oed7stry
+oe4du
+oed3w
+oed7wyn.
+oe4f5aa
+oe4f5an
+3oefe
+oe4fek
+oe4f5lo
+oe4f3o
+oef7rit.
+oeg7aand
+oeg7laer
+oeg7lam.
+oe4gog
+oeg3s
+oeg7yska
+oei1
+oeien6a
+oeis4
+oei7sker
+oe4kaa
+oek7eier
+oe6kerf
+oek7erf.
+oek7eval
+oe4k3l
+oek6lap
+oek7olie
+oek7oort
+oe4kr
+oek5rak
+oek5re
+oek5ro
+oek7sten
+oe4k3w
+oe4lei
+oe5leie
+oe6lemm
+oel7emme
+oel7eter
+oeling6
+oelings7
+oe6lins
+oel7inst
+oel7onbe
+oel7opri
+oel6ser
+oel6skr
+oel7slik
+oe4nei
+oen7eike
+oe6nert
+oen7ertj
+oen7esse
+oenk4
+oen5kl
+oen7knoo
+oen5kw
+oe4n3o
+oens5ko
+oen5sm
+oens4o
+oen7ysbe
+oep7aang
+oep7inst
+oe6pinv
+oe4pl
+oe5pla
+oep5li
+oe5plo
+oep6s5ee
+oep6s5in
+oep4sl
+oe4pu
+oeras5e
+oer3k
+oe4r5on
+oer5ou
+oer6ske
+oer7twak
+oe5ser
+oe5sie
+oe5sje
+oes7kraa
+oes7limt
+oe4s5lo
+oes7medi
+oes7pil.
+oe4s5po
+oes5ter
+oes7troe
+oe4swe
+oet7aanp
+oe4t5am
+oet6he.
+oe4t3j
+oe6t5oli
+oe4t5oo
+oe4t5ri
+oe4t5ru
+oets7kra
+oet6sna
+oet6spe
+oet6s5te
+oet6sti
+oet5wy
+oë5rug
+of3at
+of5een
+5offis
+o4f3in
+of3l
+o4fok
+of5oks
+o4f3om
+of5psa
+o2f3r
+of6sant
+ofs7iden
+of6sins
+ofs7insi
+of4s5le
+of4s5oo
+ofs7paar
+o4fui
+o1g
+og4d.
+oge4s5t
+ogge6lo
+oggel7oo
+ogi7faal
+3ogig
+og1l
+og4nat
+ogo7steo
+o4gry
+og5rye
+og4s.
+og4sg
+ogs6inf
+og5ska
+ogs7last
+ogs6ot.
+ogs4p
+ogs7pad.
+ogs7pris
+ogs6uip
+ogs6wan
+oi1
+oig6aff
+oi3k
+oile4
+ois4a
+oi5sag
+oi5ski
+ois6kuu
+oi5sky
+oi5sla
+ois4p
+ois4t
+ois7teïs
+ois6wer
+oi3tj
+oje4k
+ojek5l
+o4k5aas
+o4kag
+ok4am
+ok4an
+oke4t
+oket5j
+okie4
+o4k5ins
+ok5lat
+ok6leed
+ok3n
+oko7seil
+oko6sol
+o4kou
+o1kr
+o4k3ro
+ok4s.
+ok5sig
+ok6sins
+ok4sj
+oks7kraa
+oks6lip
+ok3sp
+ok3st
+oks6win
+o2k3w
+ok4win
+o1la
+ol5agt
+olf7ent.
+ol5fèg
+olf6lap
+olf6sku
+olf6sme
+ol4gl
+olg7onde
+ol4g5or
+olg7smee
+5olieb
+olies6m
+olie7sma
+5olifa
+oli7gny.
+olk6sem
+olk6sep
+olk6sow
+olk6sti
+o1lo
+olo5kw
+o4l5oor
+olo5sp
+olp6hta
+ol4sar
+ols7are.
+olt6zha
+o1lu
+olyf5o
+o2m
+o3ma
+om5agt
+oma7pleg
+o4m5arm
+omat6ji
+oma7tjie
+o3me
+ome4s
+ome5us
+omg6had
+o3mi
+omka5s4
+5omloop
+o3mo
+omos6fe
+omo7sfee
+omp7ligs
+omp7oor.
+om6pop.
+oms6aal
+om5sla
+oms6lag
+oms7perk
+5omstan
+oms6tin
+o4n3ag
+o5n4age
+o3n4an
+ona6skl
+ona7sten
+ond7aap.
+ond5agt
+ond7ampt
+ond7dwaa
+4ondes
+onde7us.
+on4did
+on4dom
+ond7rol.
+ond5sle
+ond5so
+ond5sp
+ond6spl
+ond7twis
+on5eff
+o4n3ei
+ong5aan
+on4g5os
+o3n4ik
+o4nil
+onin6gr
+onk7ert7j
+on4kj
+on5kno
+onk7omge
+onk7rugh
+onne5st
+o4n5oks
+ono7sfee
+on4s.
+onse4p5
+ons7iden
+ons7kepe
+ons7kori
+ons7pamp
+ons7self
+ons4t
+on5ste
+ons7tol.
+on6t5aar
+3ontd
+ont7elsi
+5ontgi
+ont5raa
+on4tri
+ont7rol.
+on4t5ru
+ont7slik
+3ontw
+o1ny
+ony7okol
+oo2
+oo5agt
+ood3a
+oo5deb
+ood5ee
+oo5dek
+ood5er
+ood5et
+ood5ok
+ood7onge
+ood3r
+ood6san
+ood7smoo
+ood7sorg
+ood7spui
+ood7suit
+ood7swaa
+ood7swar
+ood5ui
+oof1
+oof6ser
+oof6sid
+oog3
+oog6enh
+oog6les
+5oogpu
+oog7sinf
+oog7suip
+oog6-lo
+ooi6spa
+ook3
+oo4ka
+ook6sst
+ool1
+ool6and
+ool7snaa
+oom1
+oo4ma
+oo4me
+oo4mo
+oon1
+oon6ag.
+oong4
+oons6ko
+oon5sl
+oop1
+oo4pa
+oo4pe
+oop7klik
+o4opn
+oo4po
+oop6swe
+oor1
+oor6daa
+oor7daad
+oor6dap
+oor7darm
+oor6dca
+oor6d5om
+oor7doop
+oor7frek
+oor3i
+oor7klik
+5oorlog
+oor6ot.
+4oort.
+oor6taa
+oor6t5in
+oort7ja.
+oor6tyl
+oort7yl.
+oorve7ë.
+oos3a
+oos3k
+oo4so
+oos7pers
+oot1
+oo4ta
+oot6aai
+oot6en.
+oo4ti
+oo4to
+oo4t3r
+oo4tu
+oo3v
+oö5spo
+o2p
+o3pa
+o4paf
+op5agt
+opa6les
+o4p3am
+5opdrag
+o3pe
+op5een
+op9eg.
+5openi
+op4er
+oper7aar
+ope7rage
+op6horu
+o3pi
+opie6le
+opk6lik
+op3l
+op4lan
+op6lein
+3oplo
+1opn
+4opno
+o3po
+opo7fagi
+op5off
+op5ont
+opo7sfee
+5opperv
+op3r
+o5p4rot
+o4pru
+op6skre
+ops6maa
+ops7neus
+op5son
+ops5or
+op3st
+op3sw
+ops7wels
+o3pu
+o1ra
+or5afd
+or5agt
+ora6lee
+ora6loo
+orat6ji
+ora7tjie
+ord7akti
+ord6arm
+ord7eksa
+ord7ierl
+ord7inst
+ord5oes
+or4d5oo
+ord6oop
+or6dord
+ord7orde
+or4d5ri
+ord7roma
+ore7ster
+o3rê
+orf7oond
+4org.
+or3gh
+or4glo
+4orgp
+org7ring
+3orië
+orings8ku
+or5kaa
+orkes5
+ork7lag.
+ork6lik
+ork7ney.
+orkom6s
+orkoms7t
+or6maan
+or4mj
+or4nj
+or5ond
+or5ong
+o5rot.
+oro7thy.
+or3p4h
+orp6ski
+orp4sn
+ors7aar.
+ors5ag
+ors7jurk
+ors5mo
+ors7pot.
+ors7teri
+ors7tery
+or4sti
+ors7trek
+ort7aan.
+ort5aar
+ort5akt
+or4tar
+ort6ham
+5ortod
+ort7onde
+ort7rol.
+ort7ruk.
+ort5sw
+or1u
+o3r4us
+o3ry.
+ory4s
+os3ag
+osa7phat
+os5api
+osas4
+osa7tjie
+os5cen
+o3se
+ose7phin
+ose7phus
+o3si
+osi6nen
+o4sjo
+os1k
+o4s3ka
+os5kee
+os5kis
+os5koe
+os5kop.
+os5kor
+os5kou
+os5kow
+os3kr
+o5skri
+o4sku
+o2s3l
+os3m
+o2s3n
+os5oli
+os5oor
+o4sor
+os5ord
+os3p
+os4pe
+os5ste
+os3t
+os4t.
+os4ta
+os5taf
+os5tak
+os5tal
+os5tar
+os4td
+os4th
+ost7impe
+os4tm
+o5strat
+os6trev
+ost7revo
+ost6roo
+os4tw
+os4t-
+os3w
+os-7lond
+o2t
+o3ta
+ot5akk
+otas4
+ota5st
+ota7tjie
+o3te
+oteek5
+ote4s5a
+ote6sno
+ote6spr
+ote4s5t
+o4the
+oth7nage
+o3ti
+ot3j
+o3to
+ot5opm
+oto6ran
+oto6ren
+otor5o
+otos4
+oto5sk
+ot3re
+o3tro
+ot5ryk
+ots7eila
+ots7karr
+ot4s5ko
+ot4sl
+ots5la
+ot4s5po
+ots7rûe.
+ots7tee.
+ot6stek
+ots7toet
+ot4stu
+otte6l5o
+o3tu
+o4tui
+otu6set
+oua6che
+oud7agti
+ou6dakt
+oud7akti
+oud6ief
+oud6ini
+oud6ink
+oud7oorg
+oud7styd
+ou4du
+oud7uitg
+oue6rio
+ou3g
+ou4gh
+ou4gl
+oug4r
+ou1i
+ou5ill
+ouis6a.
+ou1k
+oul7ontl
+ou3m
+ou5nyw
+ou5rei
+ous6kak
+ous6ken
+ou5ski
+ous6lip
+ous6ouw
+ou3s4p
+ous7pan.
+ou3s4t
+ous7tert
+ou7stiek
+ous7ties
+out7aar.
+out7aksy
+ou4t5as
+out7ekst
+out7emme
+5outoma
+out7omhe
+ou4t5oo
+out3r
+out6rap
+out6rei
+ou4wb
+ouw7rens
+ou4wv
+ou4-o
+ove5re
+over6y.
+ovie6v.
+ov5ket
+owe6nal
+owen7al.
+owe6ral
+ower7al.
+ower7kon
+oy4a.
+oy4eu
+ô1
+ô2i
+ôi3e
+ôre5st
+1ö
+öjd7onde
+ö1l
+1p
+2p.
+5paaie.
+4paanv
+paar7dui
+3pad.
+pa4da
+pad6ie.
+pa4d3r
+pad6-eg
+p1af
+pag6ne.
+3pak
+pa4ke
+pak5es
+paki3
+pakket5
+pa4ko
+pak5os
+4p5akti
+3pale
+pal7esse
+pal5fr
+pal6mol
+pa4nop
+pan5sp
+pan4t5j
+3pap
+pa5pri
+pap7ryp.
+paps4
+pap7saf.
+pap7smee
+3pa3ra
+pa6ramn
+par7amne
+3park
+par6kar
+par4ko
+park5r
+4parm
+par4sk
+par6ste
+pars7te.
+5party
+pa5sja
+pa4so
+p5aspi
+3pass
+5paste
+pas7til.
+pa4taa
+pat7are.
+4patel
+pat4j
+pa5tji
+3patr
+pats4
+pat5sj
+pav7lov.
+2pb
+pbe6koo
+pbreng6
+2pd
+p3dw
+pd4wa
+pd4wi
+3pe.
+pe4ak
+pe4ar
+3ped
+pede4r
+pe5dof
+pee2
+peel5a
+peel5u
+4peen
+peet3
+3pei
+4peie
+p5eien
+4p3eis
+pek7nek.
+pe4k3r
+pel7aktr
+pe4l5oe
+pel7oond
+pels7kra
+pel6tak
+pel7yste
+4pemm
+pe6nars
+3penn
+pen7opsl
+pen6slu
+pen7smed
+pen6sop
+4pepi
+3pera
+pe6raap
+per7aap.
+per7admi
+per6ary
+per7asid
+pera5s6t
+5perd.
+per6dag
+per6dry
+per6dwy
+per7enke
+per5est
+3peri
+pe4rok
+3pers
+pers5ag
+per6set
+per6sje
+pers7med
+5perso
+per6s7ond
+pers8tel.
+5pertj
+per6top
+per7tsja
+per7uran
+3pes.
+4pesi
+pe4sl
+pe4s5te
+peu6rel
+2p1f
+p3fl
+pf4li
+2p1g
+pges4
+pge5sp
+pg4ly
+2ph
+phe6ars
+p2hi
+phi5s4t
+p3hit
+piek5n
+pie6raf
+pie6rom
+pie4ru
+pie7samp
+pie6ska
+pik7erts
+pik3s4
+6p5inges
+ping6la
+pin7glas
+pin5kl
+4pinst
+pipe4
+pipet5
+pi3s4k
+pit3j
+pit4s5k
+pit4st
+pits5te
+pits7tek
+pit6suu
+pit6zko
+2pj
+2p1k
+pkom4s5
+p2l
+pla6kal
+pla6kok
+5plan.
+5p4lant
+4p3lap
+3p4las
+3p4lat
+pla4t5r
+plee4
+pleet5
+p5leie
+ple4k
+5pleks
+4p3lep
+pleu7ra.
+p3lê
+pli4g
+pli4t5e
+4plits
+p5loos
+p5lose
+plu6ska
+4plyn
+2pm
+2p1n
+p4neum
+poe6doe
+3poei
+poe4s5t
+poe6tol
+po4fa
+pog7rest
+pog5sk
+pok5aa
+pok7olie
+3pol
+3pom
+4pomh
+3pone
+pon7opbr
+pon4s5k
+pons7te.
+4pont
+5pont.
+p5onts
+4poor.
+5poort.
+3poot
+poo6tel
+po4pag
+4popd
+pop6lek
+4pops
+p5ordo
+po3ro
+por6tak
+6portso
+por6t5ui
+3pos
+po4sk
+pos6tim
+pos6tko
+pos6tna
+po4t5as
+3pote
+pou6ste
+2pp
+ppe6las
+ppel7as.
+ppe6rad
+ppe4ro
+ppie6sl
+ppoor6t
+ppoort7j
+p2r
+p4raa
+4praak
+p5raam
+5praat
+pra6esi
+5prakt
+3pren
+3pres
+pre4s5t
+4preu
+3p4ria
+p3rib
+p4rie4
+prie7ël.
+5pries5
+priet5j
+5prins
+3prio
+3prob
+3prod
+pr4oe
+3prof
+3p4rog
+3proj
+4p5rok.
+3p4rop
+pro6pop
+pro5pr
+pr4or
+3pros
+pro5sa
+pro7sopa
+pru4t
+3pry
+pry4st
+2p1s
+p4sad
+p4s5aks
+p4sakt
+5psalm.
+p4sas
+ps5asp
+p4sat
+p4sid
+5p4sigi
+5psigo
+p4s5ing
+p4s5int
+ps3j
+p5skaa
+p4s5ket
+ps5kof
+p4skon
+ps5loj
+ps3m
+ps4my
+p4son
+p5son.
+p4s3oo
+p4sor
+ps7portr
+p6stera
+ps4ti
+p6stoet
+p4ston
+p5swar
+ps5wer
+2pt
+ptos4
+3pub
+pue4b
+4puit
+3pun
+pun4t5j
+pus7tipo
+put7adde
+put7emme
+put5ji
+put7rioo
+2pv
+2pw
+3pyn
+3pyp
+pyp7aard
+pyp3l
+pyp7las.
+pyp3o
+py4pr
+pys3k
+4p5yste
+py5tha
+pyt6hon
+2p-
+1q
+qu2
+qua7driv
+que6str
+qui7nas.
+2r.
+raa6min
+4raan
+r6aans.
+4r5aard
+4rabs
+rac5te
+5radio
+4r3adv
+4rafd
+ra4fek
+4rafh
+ra4foe
+4raft
+ra4fu
+raf7urn.
+4rafv
+4rafw
+2rag
+rag6aal
+5rageb
+ra5gie
+ra6ginl
+rag7inli
+r4agr
+rag7raad
+rag7ryer
+rag6sab
+rag6sak
+rag6sin
+rag7soep
+ragu5e
+rag6wan
+rai7gne.
+rak6les
+rak7oper
+rak7wate
+4ralb
+ral7eer.
+ral7oor.
+4ralt
+ram7argi
+4r5ameu
+ram6pla
+r4anda
+ran6daa
+ran7dafe
+ran6d7akk
+ran6dem
+ran6dev
+ran6doe
+ran4dr
+ran4g5o
+rank5l
+ran4k5r
+ran6saa
+ran6seu
+ran6sjo
+ran6sko
+ran6sor
+ran4s5p
+ran4s5t
+ran6tad
+ran6tet
+ran4t5j
+ran4tr
+4r3any
+rapa7da.
+ra6pas.
+ra5pes
+rap7ewen
+rap6loï
+ra4pon
+rap7onge
+rap7para
+rap7rem.
+rap7righ
+r4ari
+4rarm
+4rarr
+4rart
+r5asia
+ras6tan
+ra5s4to
+ra5s4tr
+ra4su
+ras5ui
+ra5t4ho
+4r5atom
+rats5o
+rbo6lol
+rd5agti
+r4d5ame
+rd5eil
+r6delek
+rd5esel
+rde5sm
+rd5euro
+r3do
+r4d5oli
+r4d5ont
+r4d5oon
+rdô6nne
+rd7raais
+r6droma
+rds6lip
+rd3so
+rd3sp
+rdt6ree
+rdu6sol
+rd4wa
+r5dwar
+r4dwu
+r4d5yst
+1re
+3r2e.
+3reak
+reed5a
+ree4k
+reek5e
+ree7kier
+ree7loon
+4r5eend
+4r5eenh
+4reenv
+ree6pes
+ree6ple
+ree6pro
+4reers
+ree7sala
+ree7stra
+3reë
+4reë.
+4reff
+3reg.
+reg7ruk.
+reg6sen
+reg6skw
+regs7om.
+reg7spre
+4reie
+4reil
+rei6nar
+4reind
+rei6noo
+rei6ser
+rei6sou
+reit7ze.
+re4kn
+rek7naar
+rek5ne
+rek4r
+rek7spoe
+4rekst
+re4kwa
+rel4d
+rel7dae.
+rel7diag
+rel7dopp
+reld7ran
+rel7duik
+rel7oest
+ren6agt
+r4end
+5rend.
+r5enig
+ren7shaw
+ren4so
+ren4sp
+rens7te.
+ren6sto
+ren6str
+ren6tak
+ren6tcl
+ren4t5j
+ren4t5r
+4rerg
+4r3er4t
+rert5j
+4resel
+re4s5ka
+res7lap.
+res5lo
+re3s4m
+res7ore.
+re4spi
+re4ste
+re5stel
+re4sti
+res7toet
+res7toma
+res7ure.
+ret5art
+reu6kin
+reu4kl
+reu4k5o
+re5usg
+r4ewa
+rey5no
+rê4rh
+r4faa
+rf5laa
+rf5lat
+r3fle
+r5f4lie
+r5flui
+rf5opv
+r4fre
+rf5reg
+rf4sl
+r1g
+r4gak
+rg5akt
+rgek6li
+rge7klik
+rg5eng
+rgeper6
+rge6rid
+rg4hu
+rg5hut
+rg4len
+rg4let
+rg5loo
+r4g3lu
+rg4ly
+rgo6wri
+rgrie4
+rg5ros
+rg3s
+rg4s.
+rgs4p
+rguit6j
+rgui7tji
+1r2i
+3rib.
+rib7file
+rie6dio
+rie6dop
+rieket5
+rie6klo
+rie5me
+rie6pri
+ries6e.
+rie6skr
+rie6taa
+ri4fa
+rif6ree
+rig6ska
+rig7smee
+rig7styf
+ri4kl
+rik6sid
+rik5sj
+rik7spad
+ri4kw
+rim4s
+4r3inf
+rin6gaa
+rin7gaan
+ring7aar
+6r7ingest
+rin7gleb
+rin4g5r
+rin6gui
+4r3inh
+rin6kar
+4r5inko
+rink5w
+rin6kwa
+4r3inl
+4r3inr
+4rins
+r5inst
+rin7the.
+r3inv
+4rinve
+rio7rye.
+rip4s5t
+ri5s4ko
+ris4o
+ri5son
+ris5op
+ris6per
+rit5ji
+rit7oond
+rit6rea
+ri5tro
+rit6zri
+5rivie
+rix7tont
+2r1k
+r4kaan
+rk5een
+rk5eik
+rke6lap
+rke4s3
+rke7sel.
+r6kink.
+rk5inl
+rk5leie
+r4klid
+r5klip
+r4k5los
+rk5nei
+rk5omg
+rkom6sti
+r4k5opd
+r4k5ops
+rk5rand
+rk5red
+rk5rib
+rk5rok
+rks6maa
+rk5spo
+rks6uid
+rk5twi
+rk5uit
+r4k5ure
+rk5wag
+r4k5wat
+rk5wee
+r4k5wet
+rk5wil
+rk5win
+r4kwy
+r1l
+r3la
+rli4g
+rlo6gja
+rloo7ple
+rlo6wpa
+2rm
+r6maanh
+rma5gô
+rma6gun
+rma7klot
+rma7plaa
+rma7raan
+rme6raa
+rmer7aar
+rme5sa
+rmi4l
+rmos4
+rmo7stro
+rm5uit
+rmy6nim
+2r1n
+r5nagte
+rna6spl
+r4n5ele
+rne4s
+rne4t5a
+rne6tom
+rn5oor
+rn6stig
+rns6tin
+r3nu
+roduk5
+roe6fas
+roef7as.
+roe4f5l
+roe6fri
+roe4ga
+roe7glas
+roe4n5a
+roe4pa
+roep5l
+roe4p5o
+roe4s5k
+roe6sla
+roes7lag
+roe4s5t
+roes5w
+roe6taa
+4roew
+rog7akke
+4rogg
+rog6lis
+ro5gna
+ro4kn
+rok4r
+rok7slip
+rok4s5p
+ro5kyn
+ro4l5aa
+rol7gord
+r6olien
+rol7mops
+romp7op.
+4roms
+ron7aar.
+ron6dag
+ron6dak
+ron6d7er6t7
+ron6d5et
+ron4d5o
+rond6o.
+ron4d5r
+ronds4
+rond5sw
+ron4du
+ron6gaa
+ron6kaa
+ronker6
+ron6kert
+ron4k5l
+ron6kow
+ron4kr
+ronk7wa.
+ron6ske
+ron6ste
+rons7te.
+ron7stel
+ron6s5ti
+r5ontp
+ron4t5r
+ron6tui
+4rontw
+roo7dewa
+roo7dist
+3roof
+4roog
+roo7gron
+roo7mens
+roo7nag.
+4roond
+roop6la
+4r3oor
+roo7taai
+r4opa
+rop7aans
+rop7anys
+ro5pee
+rop6een
+4r5open
+r4opi
+r4opo
+r1or
+r4ora
+ro3ro
+ros6afr
+4r5osea
+ros7kie.
+ro3s4p
+ro5sta
+ros6til
+rot6hsc
+ro5ton
+ro3tr
+rot4sa
+4roud
+rou7floe
+rou5sk
+rou3t
+rovi7ch.
+rov7nik.
+ro4w-
+rox9y.
+r2ö
+rpe4s3
+r4pid
+rp5ide
+r4p5lik
+rp5opd
+r4p5reg
+rps7idio
+rp4sl
+rps5no
+rp6spri
+rp4stu
+2r1r2
+rre7glob
+rre7nagt
+rre4st
+rre7stau
+rres5tr
+rri6gin
+rron7kaa
+2rs
+r4sakt
+rs5alm
+r4s3ar
+r5scha
+rs5eila
+rseuns6
+rs3f
+r5s6feer
+rs4ie
+rsi7flag
+r6sinda
+rs5inko
+r6sinsp
+r6sinst
+r5sjam
+r6skaki
+r5skap
+r6skapa
+r6skapi
+r6skeus
+r4s5kin
+rs6kink
+r6skoet
+rs6komm
+rs6koni
+r4skor
+r5skors
+r5skou
+rs5krib
+r6skroo
+r4skur
+r4slê
+rs5lis
+r4s5los
+rs5lyf
+rs6maad
+rs6maai
+r5s6maak
+r6smaat
+rs6magt
+rs6mak.
+r6smake
+rs6mara
+rs6mede
+rs4mee
+r5smeer
+rs4mel
+rsnee5m
+r5snoo
+r4snot
+r4s3og
+rsonde6
+rsonder7
+rs5ong
+rs5oog
+r6soors
+rs3op
+rs4op.
+rs5ord
+r1sp
+r6spaar
+r4s5par
+r6spien
+r5spri
+r1st
+r6s5tal.
+r4stb
+r6stegn
+rs6terp
+r5s6ters
+rs6tigl
+rs4tik
+rs4tis
+r4s5tit
+r4stj
+r6s5toet
+r6streg
+r3sty
+rs3un
+rsu4s
+rs5wa.
+rs5wap
+rs3we
+rs6werf
+rs5wyk
+2rt
+rt5afd
+rt7angel
+rt5art
+r6teend
+rte6loe
+rtie4s
+rting4
+rti7saan
+r4t3om
+rt5ont
+rt5opr
+rt5org
+r6treda
+rt5reis
+rt5ren
+r4t5rie
+r6trol.
+r4t3ry
+rt6s5aar
+rts5ond
+rts6pyn
+rt5uits
+rt4wis
+rt4wyf
+3rub
+ru4ga
+rug6-sk
+rui6lek
+rui6moe
+5ruimte
+rui6niv
+4ruit5s
+ru2k3
+ru5kaa
+ruk6lip
+ruk6opp
+ruk6-en
+rul5aa
+rul7ape.
+rul7yste
+r2um
+rum7grok
+4runi
+rup7lys.
+ru5spi
+rus6tak
+rus6tka
+rus6tma
+rus6tvo
+rus7uur.
+rut7oond
+2ruu
+ruus6te
+ruu7ste.
+rweg5a
+rwe6gei
+rwe6skr
+rwi7sje.
+rwoes5
+rwy6sak
+rwy6see
+ry4fa
+ryf7ink.
+ry4fo
+ryf7ode.
+ryf6sch
+ryf6sin
+ryf6ska
+ryg7stek
+ryg6str
+ry6kinr
+ryk3l
+ry5klu
+3rym.
+ryn4s5l
+ryp7arm.
+ry5ple
+ryp7lus.
+ryp7nagt
+ry4s3a
+rys6alf
+ry6sinl
+rys5pi
+rys5po
+ry3st
+rys4ti
+ry4su
+ry4ta
+ry5tra
+s2
+2s.
+s'9ie.
+1sa
+3sa.
+s4aad
+saa6dui
+3saak
+3saal
+4s3aan
+4s3aap
+4s5aard
+4s3aas
+4s3adm
+s5adre
+4s3adv
+2s3af
+2sag
+3s4ag.
+sa4gal
+s3age
+s4agi
+s4ag4n
+sa5gne
+3s4ago
+sag6opa
+5sagte.
+5s6agtew
+3sak.
+s5akad
+3sake
+3sakk
+sa6k5rok
+sa6krus
+saks4
+s3akt
+4s5akti
+sa6lamm
+sal7ammo
+4salb
+s5albu
+3salf
+sal6fol
+4s3alg
+4salm
+sal6mei
+sal6tro
+3sam
+4samba
+same4n
+4s3amp
+sam6swy
+4sana
+s5anal
+san6d5ag
+san6dak
+sand7akk
+san6dru
+3sang
+san4g5a
+san6gre
+sang7ste
+4s5anke
+sap6hat
+s5appa
+s5appel
+sa3pr
+4s3arb
+4sarea
+sar7olie
+4s3art
+4sase
+s5asem
+4s5aspe
+sa5spr
+sat6jie
+4s3atl
+4s5atta
+sav7lon.
+2sb
+s3ba
+s3be
+s3bi
+s3bl
+s3bo
+s3br
+s3bu
+s3by
+s3ca
+s3ci
+2sd
+s3da
+s3de
+s3di
+s3do
+s3dr
+s3du
+s3dw
+sd4wa
+s3dy
+1se
+3se.
+s5eed.
+see3f
+see3k
+s5eenhe
+see6plo
+see5ram
+seer7as.
+see5rei
+see7roet
+see3s4
+see7soog
+see5sw
+seë7kran
+s5egpa
+4segt
+4s3eie
+4seik
+s5eik.
+4seila
+sei6nan
+4seind
+4seis.
+sek6huk
+4seksa
+s5eksam
+sek4s5k
+sek4s5p
+sek4st
+3sel
+sel5aan
+sel7anal
+se4l5el
+sel4f5a
+sel7fabr
+sel6fer
+self5i
+sel6fid
+6seliks
+sel5of
+sel7oor.
+sel5op
+sels7kak
+sel6slo
+sel7spen
+sel6s7taa
+se4m5ag
+4s5emal
+sem7ekst
+sen6dan
+sen7ghor
+sen7sord
+sen6str
+sep6hus
+ser7afse
+4serf
+s5erf.
+ser6s5in
+ser6skr
+ser6sta
+sers7taa
+ser7stad
+sers7tal
+ser6tuu
+s5ervar
+ses6aan
+4se4s5ka
+ses7lett
+se4s5po
+se4st
+se4s5ur
+ses7uur.
+se4sw
+ses7weke
+s4et.
+sewes6t
+sewe7ste
+sey7stof
+1sê
+2s1f2
+s3fa
+s3fi
+s3fl
+s3fo
+s3fr
+s3fu
+2s1g
+s3ga
+sga4s5e
+s3ge
+sges7per
+s3gi
+s3gl
+sg4ly
+s3go
+s3gr
+s3gu
+2sh
+s3ha
+s4ha.
+sha7ron.
+s3he
+s3hi
+s3ho
+sho7shol
+s3hu
+1si
+4s5idea
+s5idee.
+4s5ideo
+3sie
+sie7kwos
+sies6li
+sies7mee
+si5fle
+sif6reu
+4si3go
+si4gro
+4simpl
+3sin.
+si5nag
+s5indek
+5sindr
+4sindu
+sin7enti
+sin7este
+4s3inf
+s4ing
+sin6gaa
+sing7aan
+6singes
+sin7gle.
+sin6gre
+s5ingry
+4s3inh
+sin6kch
+sin4kl
+4sinko
+s5inlig
+4s3inm
+4s3inr
+sin6see
+sin6sin
+6sinslu
+sin5sn
+4sinv
+sip6ho.
+s4ist
+sit6are
+4s5item
+si3tr
+si4tre
+sit7riem
+sit6sik
+sit5sl
+3situ
+siu6mur
+1sj
+2sja
+sje6ans
+5sjoko
+4sjuf
+1sk2
+2sk.
+5skaaf
+skaar6s
+6skaart
+s5kafe
+3skak
+6skakeb
+s5kakt
+4s5kalf
+4skam
+4skant
+3skap
+ska6pin
+ska6pon
+skap5r
+4skar.
+4skara
+4skas
+s5kata
+ska6tel
+ska6tit
+5skawe
+3skem
+4skenn
+3s4kep
+ske6pla
+ske4p5r
+4skerk
+4s5kern
+ske7smee
+5skets
+4skett
+s5kiem
+ski7klub
+s4kil
+4s5kilj
+ski6lol
+s4kip
+5skip.
+4skis.
+2s3kl
+2s3kn
+4skod
+4s5koeë
+5s4koen
+4skoer
+sko6kaa
+sko4ko
+4skoll
+4skolo
+4skolw
+4skomb
+4skomi
+4skomp
+s3kon
+s4kone
+4skonf
+4skong
+4skons
+4skont
+6skoord
+s4koot
+4skoö
+4skos
+sko6see
+5skott
+4skow
+6skraan
+4skrag
+4skran
+sk4re
+6skreet
+s5kres
+5skrif
+4skrin
+5s4krip
+4skris
+4skrui
+3s4kry
+4s5kryt
+sku6dak
+4skuik
+s5kuip
+5skuld
+4skult
+4skun
+5skurf
+4skus
+sku6tar
+2s3kw
+sky7drin
+s4kyf
+s4kyw
+1sl
+s4laa
+4s3lad
+s4la4g
+4slam
+4s5land
+s4lang
+s5lant
+4s3las
+4s3lat
+s4law
+4s3led
+5sleep
+4s5leer
+4s3leë
+s4leë.
+4s3lei
+4s3lek
+4slel
+4sleng
+sle6tji
+slet7jie
+s4leu
+4s5leue
+s5leus
+5sleut
+4s3lew
+4sley
+s3lê
+2sli
+slib3
+5slier
+s3li4g
+5slinge
+slo6bee
+s4lof
+4sloj
+4slok
+4s5loon
+4s5loos
+4slop
+slo4t5a
+s5loter
+s4low
+sl4öj
+4s3lug
+4slui.
+4s5luia
+s5luih
+5sluit
+4s3lus
+4s3lye
+4slyf
+sly6mui
+4slyn
+sly6paf
+4s3lys
+2sm
+s3ma
+s4mad
+5s4mart
+s3me
+s5melk
+5s4melt
+s3mi
+5smid.
+smi4s
+smit4h5
+3smok
+s5mol.
+s3mon
+s3mu
+3smy
+smy6nin
+s4myt
+1sn
+s5naai
+4snaam
+s5naat
+4s3na4g
+snag5e
+snag6s.
+4snam
+sna6pro
+s4nar
+s3nas
+4snat
+4snav
+snee7tji
+4s3nek
+3s4nel
+4s3nes
+4s3net
+4sneu
+sni6kwa
+sni6tre
+s4nob
+5snoet
+4s3nom
+4snoo
+4snorm
+s4nui
+sny3
+s4nye
+5snyer
+sny6-ys
+1so
+4soef
+3s4oek
+soe6kal
+soe6kev
+soe6kol
+soe4k5u
+s4oen
+soe6nys
+4soes
+5soet.
+soets6t
+soet7ste
+sof6agu
+4soff
+so3fr
+sof6ree
+sog4l
+soi6ets
+sok7opho
+3sol
+s5olie.
+sol6lme
+solo5s
+s4om.
+s4ome
+4s3omg
+4s3oms
+4s3omv
+3s4on.
+s6onde.
+s7ondern
+3s4one
+so6neek
+son7eekh
+son5eg
+4son3g
+son7kwas
+so4n5op
+son4so
+4s3ont
+son7uit.
+s4onv
+4sonw
+4soog
+3s4ool
+4s5oond
+soon4s
+4s5oor.
+4s5oorb
+4s5oord
+4s5oore
+s5oorg
+4s5oorl
+s5oors
+5soort.
+s5oortr
+2s1op
+3sop.
+sop7ekst
+so5phi
+sop6hok
+s4opi
+5sopie
+s3opl
+3sopo
+so3pr
+5s4op4ra
+s3ops
+s3opt
+s3opv
+4sord
+5sorg.
+4s5orga
+sor6gee
+sor6gra
+sorg7raa
+s5orke
+so5ror
+4sorto
+sos4h
+so5sha
+so3th
+sot4ho
+so3tr
+3sou
+4soud
+s5oude
+sou6spa
+sou4s5t
+sou6taa
+sou6tak
+4souto
+s5outom
+so9ya.
+s5paal
+5spaan
+4spad
+4spak
+3s4pan
+span5o
+spa6noo
+4spap
+4spark
+4s5pas.
+4spast
+spa6tar
+4spatr
+4spe.
+3s4pee
+spe4k5l
+spe6kne
+spe6lak
+5speler
+s4pell
+6spelot
+4spen
+s5pen.
+4sperd
+4sperk
+5sperm.
+4spers
+4spes.
+5spesi
+4spet
+s4peu
+4s5piek
+s4pio
+2s3pl
+5s4plee
+5s4plin
+5splits
+3s4ply
+4spoei
+4spol
+4spom
+spon6st
+5spoor.
+4spoot
+5spore
+6sportr
+4spos
+4spote
+s5poti
+5spraak
+6sprakt
+4s5prat
+spreek5
+s5prem
+4spres
+5spreu
+4sprob
+5sproei
+4sprof
+4sprog
+5s4pron
+4spros
+5spruit
+4spry
+s3ps
+sp4si
+4spub
+3s4pul
+4spun
+4spyn
+4spyp
+2s1r
+s3ra
+sra4e
+s3re
+s3ri
+s3ro
+s3ru
+s3ry
+2s1s
+s3sa
+ss4af
+ss4ag
+ssa6rol
+ssay7is.
+s3se
+sse6nas
+sse4n5i
+sser4s
+sse5st
+s3si
+ssie6l7ei
+s3sk
+ss4ko
+s3sl
+s3sm
+ss4ma
+ss4me
+s3sn
+s3so
+s3sp
+ss4pl
+s3st
+ss4ti
+s3su
+s3sw
+s3sy
+2st.
+4sta.
+s4taa
+st5aard
+5staat
+3s4tad
+4stafe
+sta6las
+stal7as.
+4stale
+sta6lee
+sta6lem
+4stali
+5s4talt
+5s4tam.
+sta4m5o
+5s4tan.
+stand8s7ta
+4stari
+3s4tat
+s5tatr
+4stea
+s4tedd
+5s4tede
+s4tee4k
+5s4teen
+4steer
+4steg
+ste6gre
+st4ei
+ste6kli
+ste6lek
+stel7eks
+6stelev
+5s6telse
+stel6tj
+stelt7ji
+5s4tem.
+5stemm
+ste6mom
+ste6nou
+4stent
+s5teny
+4steo
+6sterap
+ste6r5ei
+5sterkt
+4sterm
+ste6rom
+ster5sm
+ste6rys
+ster7ys.
+ste6ser
+ste6sin
+ste6ska
+ste6ski
+ste4sl
+ste6sma
+2sth
+s3ti
+4stie
+s4tigt
+4s5tiku
+sti6laa
+s4timu
+sting5a
+5stinkh
+s4tip
+4stir
+4s5tite
+s3tj
+4sto.
+s5toeg
+s5toek
+5stoel.
+6stoela
+s5toen
+4stoer
+4stoes
+s5toev
+s4tof
+sto6fek
+sto6fem
+sto6fen
+sto4fo
+4stog
+sto4ka
+sto6kle
+sto6kre
+3s4tom
+4stone
+4stoon
+st4op
+sto6poo
+4stos
+sto4st
+3s4tot
+s4tow
+s4traa
+4strad
+s6trak.
+4s5trei
+s4trew
+4s5tril
+6strins
+4stroe
+s5trog
+str6ont
+6stroon
+6strosp
+4strot
+s5trots
+4strou
+4strov
+s4tru
+5struk
+4s5trus
+3s4try
+stu4c
+3s4tud
+4stuig
+3s4tuk
+stu6kin
+stu7klep
+stu7stra
+stu4to
+stu6tys
+st4wi
+2sty
+4styd
+5styf.
+3s4tyl
+sty6loo
+1su
+su2b1
+sub3a
+sub7gids
+sub7hoof
+sub7nasi
+sub5oo
+sub7reko
+3suid
+sui6daf
+sui6dei
+s4uik
+s4uil
+suip5l
+sui6pro
+4s3uit
+s4uiw
+sul6tin
+sum7aans
+2sun
+s3uni
+su4su
+sut6her
+su9yo.
+2sv
+s3va
+s3ve
+s3vi
+s3vl
+s3vo
+s3vr
+s3vu
+s3vy
+svy7kraa
+2sw
+5s4waai
+5swael
+s5waen
+3s4wak
+3s4wa4m
+swam5a
+s5wand
+5swart
+s3wat
+3s4waw
+6sweefs
+s6weeft
+s5week
+5s4weep
+5s4weet
+4sweg
+5sweis
+s4welg
+3s4we4m
+5s4werm
+swe6tre
+s3wê
+s3wi
+s4wik
+4swil
+s3wo
+5swoeg
+swor6st
+4swort
+s3wr
+s3wu
+3swyg
+1sy
+5syfer
+sy3k
+syn6agr
+syn6sin
+syn5sm
+sy5pla
+sy3sk
+4syst
+s5yster
+4sywe
+s5ywer
+2s-
+1t
+2t.
+3ta.
+taa6nam
+4taand
+taan5s6f
+6taansi
+4taant
+4t5aanv
+3tabb
+4tadm
+ta4d5ro
+tad6ser
+tad4s5i
+tad6ska
+tads5n
+tads5p
+tad6ste
+tad6s5to
+4taf.
+4tafd
+3tafe
+tafe4l
+4ta4fr
+4t3afs
+4tafv
+4t3afw
+t4age
+4t5agen
+4tags
+4t3agt
+tai4l
+ta5inv
+tai7peis
+5take.
+tak6lep
+ta5kli
+ta4kr
+tak7rol.
+3takt
+tak7wyn.
+3tale
+tal7eenh
+tal7emme
+5talig
+tal6kaa
+tal6sor
+ta6mind
+tam7inde
+tan6dat
+tan4dr
+tand7rin
+tand6sto
+tang5st
+4t5anna
+tan4sk
+tap5ro
+3tari
+4tark
+4tarm
+t5arm.
+tar5oo
+t5artik
+ta4s.
+t5asem
+tas4p
+tas6tas
+tat7isol
+tat4j
+tat7jies
+ta4t5ra
+2tb
+tba6lun
+tby6tei
+2td
+tdy7ing.
+teby6s.
+3tedo
+teek5r
+tee6lee
+tee7lood
+tee6mev
+tee4mo
+tee4n
+4teenh
+3teer
+tee7raad
+tee7renv
+tees4
+tee5sk
+tee5sl
+tee5st
+tee7suik
+4t3eeu
+tef7lon.
+3tegn
+teg6ori
+teg7ren.
+5tehui
+tei6noo
+tek2
+5tekam
+tek7bak.
+5teken
+teke8n7aap
+tek7haak
+tek7limi
+5tekor
+tek7semp
+tek6sin
+teks5k
+teks5t
+tek7stel
+tek5vo
+te6laap
+tel7aap.
+te4l5ak
+te4l5ap
+tel7dwei
+te4l5el
+tel7fles
+tel7idee
+5telik
+tel6lho
+tel7oes.
+tel7oog.
+te6loon
+tel7oond
+tel7smed
+tem7asse
+4temm
+tem7omva
+te6moog
+tem7oog.
+5tempo
+tena6ge
+5tend.
+t4enh
+ten6kaa
+ten6koo
+ten7ouer
+ten6san
+ten7slot
+5tenso
+ten4s5u
+ten4t5j
+ten4tr
+tent7reg
+ten7treu
+ten7twen
+3teo
+te3p4h
+ter7adel
+5te4r5af
+ter6afi
+ter6ago
+te4rak
+ter7akro
+ter7als.
+ter7aman
+ter7amer
+te6ramp
+ter7amp.
+5terap
+ter5app
+ter6arg
+ter6dro
+terd7roo
+ter5een
+te4r5el
+te4rem
+4terft
+te6rin.
+ter7ink.
+terk7wyn
+3term
+ter7omra
+ter5ond
+ter5ont
+5teror
+ter5os.
+te4r5ow
+ter7raan
+5terrei
+ter7rein
+5terri
+ter6sas
+ter6sef
+ter6seg
+ter6skop
+ter7sopn
+ters6we
+ter7swee
+ter7syst
+ter6tap
+te4rui
+ter7uie.
+te6ryst
+ter7yste
+ter6-in
+3tesi
+tes7inst
+tes7loe.
+tes7lydi
+tes7mart
+tes7meto
+tes7proe
+tes7teri
+tes6tud
+te5sty
+te4s3w
+3teti
+teun5s4
+2t1f
+tf4li
+2t1g
+tg4af
+tge6nap
+tg4li
+2th
+3tha.
+t4has
+4thei
+3t4hen
+ther6aa
+the7raan
+the5ro
+3t2hi
+4thit
+t5hitt
+th5leh
+t4ho.
+tho6nat
+ths7chil
+t4hy.
+tib7niet
+tie4f
+tief5o
+tie6gri
+tie6kap
+tie4k5l
+tie6kom
+tie4k5r
+tie4k5w
+tie6roë
+tie7smoo
+4tif.
+4tiff
+4tigm
+tike4
+ti4kla
+tik7lug.
+tik5ro
+tik6waa
+4til.
+til7aan.
+4tild
+4til3s
+4tilt
+4t3ind
+tin7erts
+tin4ga
+tin7gaal
+ting7aan
+ting7eg.
+tin4g5r
+ting6su
+tings7uu
+4tinkh
+tink7wa.
+4t3inl
+4tinv
+5tipe.
+5tipes
+ti4rp
+tis6aan
+ti3sj
+ti3tr
+tive5r
+t2j
+2tja
+tje6sni
+tjo4k
+2t1k
+tki6sob
+tkom4s5
+2t1l
+t3la
+tla6sin
+t3li
+t3lo
+t5lont
+2tm
+tme6sti
+2t1n
+tne6ywe
+tnot4s5
+3to.
+toe7eien
+4toef
+5toef.
+toe7gly.
+toe7klap
+toe5kr
+4toel.
+5toe5la
+4toele
+toe6let
+toe6lop
+4toelt
+4toep.
+toe7plei
+5toern
+toe6rou
+5toeru
+3toes
+toe5sl
+toe5sm
+toe7swel
+toë7roti
+to4fa
+tof7ekst
+tof7emis
+to4f5io
+tof7onde
+3tog
+to4gl
+tok7las.
+tok7lett
+tok5ou
+t5olie.
+4tom.
+4tond
+3tone
+ton4gr
+tong5s
+4tont
+t5ontl
+t5onts
+3toon
+t5oper
+to5p4he
+4topm
+top7oorl
+4topv
+tor7eien
+tor7eval
+to6rint
+tor7inte
+tor6m5ag
+tor6mom
+to1s
+to3sf
+tos6tro
+to3tr
+tot6ste
+tou3s4
+tou7tjie
+tou6wsr
+to4wn
+toy7ota.
+2tp
+tpen6sk
+tpie6tj
+tpiet7ji
+tplek5
+tpoor6t
+tpoort7j
+tp4sa
+t5psal
+t2r
+4t5raad
+t5raam
+5tradis
+4traf
+tra6fas
+traf5o
+tra6foo
+5trakta
+5transa
+5transf
+tra6paf
+trap7as.
+tra6pew
+tra7ploï
+5trapp
+trat4
+tra5tj
+4tratu
+4trea
+t3rec
+t5reda
+t5redd
+t4ree
+4treek
+4t5reen
+4treë
+4treg.
+t5regi
+tr4ei
+t5reini
+tre6ink
+4treis
+tre4ka
+tre4k5l
+tre4ko
+tre4kr
+trek5w
+tre6kwi
+t4rer
+t5rese
+tre4st
+tre4t
+tre7talb
+tret5j
+t5reuk
+t5rewo
+5tribu
+t5rief
+trie6kl
+5tries
+tri5g4l
+4tring
+trobo5
+4t5roer
+tro6las
+trol7as.
+tro6lin
+tro6naf
+troo4
+4troom
+tro6ski
+3trou
+3trov
+4trub
+4t3rug
+truit6j
+trui7tji
+4truk
+tru7kopp
+trust5r
+4tryk
+2t1s
+ts5agt
+t4sam
+t4sar
+ts5arg
+t4s5eks
+t4s5eng
+tse6raf
+tse6rys
+tser7ys.
+t6singr
+t4s5ins
+ts5inv
+tsi7tsik
+ts5jae
+t4skar
+ts5kok
+t4skon
+t4skor
+t6skrie
+t6skrip
+t4skru
+ts5lam
+t5s6maak
+t5s4mee
+ts4mel
+t4smo
+ts5mot
+t5smou
+ts5nat
+ts5neu
+ts5oon
+t4s5pas
+ts5pen
+ts5pot
+t4s5pro
+ts5tea
+t5stel
+t6stend
+ts4ti
+ts5toer
+ts5tron
+t3stu
+t3su
+ts5waar
+t5swar
+t5swen
+ts6wing
+ts5wyn
+2tt
+tta5tj
+tte6loë
+tte6ral
+tte6ram
+tte7ridg
+tte4ro
+tte7ruil
+tte6slo
+tte6s5ta
+tte5us
+tt4he
+tting5a
+tt5uur
+3tua
+3tue
+3tuig
+3tuin
+4tuits
+tu4kl
+tum7aanw
+tur6kna
+4turt
+tus7aart
+tus7eter
+tussen5
+tu5têr
+2tv
+tv4li
+2tw
+twee5k
+twee5l
+twees4
+twerp5o
+twi6sap
+3tyd
+tyd7aanw
+tyd7lont
+tyd7orde
+tyd3r
+tyd6sat
+3tye
+tyl7oorw
+3tyn
+tyn7spre
+ty3o
+t5yster
+2tz
+tze6nel
+2t-
+u1a
+ua4e4s
+uahu6a.
+u4b3ag
+ubas4
+uba7slag
+ub5eko
+ub3f
+ub5gro
+ub5int
+u3bl
+u4blu
+ub5lun
+ub3or
+ub5sch
+ub3t
+ub3v
+ub5wyk
+uck6len
+u4d3ar
+udi6top
+u4d3re
+u4dri
+uds6med
+ud5sor
+ud6stoe
+uds6tyd
+u1e
+ueb5lo
+uer7ione
+ue4ron
+uer7onde
+ues7tria
+ue5uni
+u4fri
+uf5rin
+ufs6maa
+ug5aan
+u4gei
+uge6ska
+ug1l
+u2go
+ugo6mol
+ug3or
+u2g3r
+ug3s
+ugs4k
+ugs4l
+ug4soo
+ugs4p
+ug5ste
+ugs6tek
+ug5sto
+ug5sui
+ug4ub
+ui4dag
+uid7arts
+ui4d3o
+ui4dr
+uid7reek
+uid7simb
+uid7skat
+uid7skel
+uid7skil
+uid7slui
+uid5spr
+uids6to
+uid7stoe
+uid7uits
+ui1e
+uiers6w
+uies6ma
+uie7smaa
+ui4f3a
+uif7eend
+uif5le
+ui4go
+ui4g3r
+uig3s4
+ui4k3a
+ui4k3l
+ui4k3r
+uik7sfee
+uik6sta
+uik7uitk
+ui4kw
+uil7aap.
+uil5eks
+uil7esel
+ui4l5oo
+uil7tjan
+ui4ma
+uim7oes.
+ui4na
+ui5nae
+uin5ar
+uin7asyn
+uind4
+uin7drek
+uin7ivoo
+uin7kole
+ui4n3o
+uin7ser.
+uin5si
+uin6ska
+ui4pl
+ui4po
+uip5oo
+uip7ore.
+uip7roes
+ui4s3a
+uis3j
+ui4s3o
+uis5ta
+ui4t3a
+uit7dein
+ui4t5ee
+ui5ter
+uit3j
+uit3r
+uit4sj
+uit6-as
+uk4aa
+ukaar4
+uk5loo
+u4kof
+uk5off
+u4kor
+u5krat
+uk3ry
+ukse4s
+uk4ski
+uks4m
+uks7pop.
+uk4sv
+uk4th
+uku7yama
+u2k3w
+u1la
+ul3ag
+uld5erk
+ule6sta
+ulê6r-w
+ulf6api
+ul5ins
+u1lo
+ul5oog
+ulp7eksa
+ulp7oort
+ulp7orga
+ul4saa
+uls6oms
+ult7inge
+ult7uit.
+u1lu
+u2m
+u3ma
+um5agt
+umat4
+uma5tj
+u3me
+umg6rok
+u3mi
+um4ie
+um5ond
+um4s.
+ums7feld
+u3mu
+u4mui
+umu4s
+un5arm
+uner6st
+5unifo
+3univ
+unk7reda
+un2s3
+uns6enb
+un4sid
+uns6kap
+un5s6kol
+un7s6kool
+uns7lagg
+uns7taal
+un5str
+unt7eenh
+un6tinn
+unt7real
+unt6roe
+unts6ko
+unt5sw
+unug6s.
+u1o
+upi6lop
+u4ply
+u4pon
+u1ra
+ur5aar
+ur3af
+ur5agt
+ur3ak
+u5ra5s4t
+ur5atl
+ur5een
+u4ref
+ur5eff
+ure5um
+urf7loop
+urg6h-s
+urg7laag
+u4r5int
+urke5s
+urk7nael
+u1ro
+uro7pesi
+urp7agti
+urr7heim
+urs7agte
+ur4s5ek
+urs6fee
+ur6sloo
+urs7mous
+ur4sno
+ur4s5oo
+urs7paar
+urs6par
+ur4spr
+urs6wee
+urs6wie
+ur6t5oor
+ur4top
+urt7room
+u1ru
+u1ry
+us3ag
+usa7lag.
+u4sap
+us5een
+use5st
+ush7die.
+ush7koal
+usie4k
+usiek5l
+u4s5ins
+u2s3k
+us4k.
+us4kok
+us4kri
+u2s3l
+u3s4lu
+u4sno
+u2s3o
+us4ol
+us4or
+us3p
+us4pie
+u4spo
+us5pot
+usse7us.
+us3t
+us4t.
+ust5akt
+usta6v.
+us4tb
+us4tf
+us4tg
+us4th
+us6tink
+us4to
+us6trek
+us5tru
+us4ts
+us3w
+u2t
+u3ta
+ut5adm
+u4t3ag
+uta7spek
+u3te
+ute7ling
+ute7rago
+u3ti
+u3to
+u4topl
+ut5org
+ut4rek
+uts7luis
+ut4spr
+u3tu
+u3ty
+uu2
+uur1
+uur3i
+uur6s5in
+uus3
+uus6khe
+uut3j
+uwees4
+uwe7smit
+u5yste
+u3yu
+û1
+1ü1
+1v2
+vaar6st
+va4kar
+vak7eie.
+va4kes
+va4ki
+va5kie
+va4k3o
+va4kr
+val7este
+val7fees
+val7funk
+val7isog
+valk7oë.
+val7opto
+val4sa
+val6spa
+vals7pan
+val6spo
+val6spr
+val6s5te
+val6sth
+va4n5ee
+van7effe
+van6gap
+van6gre
+van7uit.
+vari5et
+var6kja
+var6kle
+var4k5n
+var4k5o
+var4k5r
+vas7ent.
+vas6oor
+vas7waai
+ve2
+ve3d
+vee7kong
+vee5kr
+vee4l
+veer5a
+vee3s4
+ve9ga.
+veis4
+vei5st
+vel6don
+vel4d5r
+vel5oo
+ve5lop
+vel5sm
+vel7sple
+ve5lum
+ve3na
+ve3ne
+ve5nor
+ven4t5j
+ve3nu
+vep7legi
+3ver1
+ve9ra.
+verd4
+verdien7s8
+ve5reb
+ve5rek
+ver6ema
+ver6ena
+ve5rend
+ver6eve
+ver6flu
+ver6fru
+ve3ri
+ve6r5inn
+verk4
+ver5kl
+ver5kw
+ve7rona.
+ver5sa
+vers6ki
+ver7skin
+vers8kop.
+ver5sl
+ver5sm
+vers6mag
+ver5sp
+ver7stal
+ver5s4w
+vers8waar
+ver4t5j
+ver5tw
+ves3p
+ves3t
+ves7taal
+ve5suv
+vet5in
+vet5ji
+vet7opga
+vet3r
+vets4
+vet5sm
+vid5so
+vie7ring
+vig4s
+vi5rag
+vi4rg
+vi4r-
+vi4sar
+vi4so
+vis5ol
+vis7oog.
+vis5tr
+vi3tr
+vit7rate
+vlag5s
+vla4k
+vla7koek
+vla6sak
+vle4k
+vlek5l
+v4lie
+vlie6so
+voe6rek
+voe6rui
+voë4l
+voël7oë.
+vog7inho
+vo4gr
+vo4lei
+vol4g5a
+vol6gon
+vo4l3o
+vol7song
+vol7uit.
+vol7ywer
+vond6s7te
+von6klo
+voo7doo.
+voor5s4
+vor4s5t
+vor7ster
+vou7pops
+vou5tj
+vra6gry
+v4re.
+vree6tj
+vreet7ji
+vrie6sp
+vri6jze
+vry7duik
+vry7kyk.
+vry3s4
+vry5st
+vry7uit.
+vu4e.
+vu9yo.
+vyf7armi
+vy3s
+1w
+2w.
+4wael
+wae6lat
+4wa4eo
+3wag.
+wag6las
+wal6ste
+wand6sk
+wan6gaa
+wan7inge
+wans4
+wan5sm
+5wapen
+3warm
+war4s3
+wars6e.
+4wart
+war6thi
+war4t5j
+war6toë
+wart7oë.
+war6too
+war4t5r
+war6tys
+wa5shi
+was6kaa
+was5la
+was6mou
+was7pan.
+wa5str
+wate6ra
+water7aa
+wat5so
+we4bad
+we4bm
+we4b5ru
+web7taal
+web7vlie
+3wed
+we4d3r
+we5dra
+we5dry
+we4dy
+5weefse
+weeg6s.
+wee5ran
+wee5sa
+wee7skaa
+wee5sko
+wee5sl
+wee5s4p
+wee5st
+wee6tru
+3weg
+we4ga
+weg7dof.
+weg3l
+we4go
+weg7orde
+we4g3r
+weg3s4
+weg5st
+we4gu
+4weis
+we4k5ro
+wek7uur.
+wel7aanb
+we6larg
+we4l5ee
+wel7flan
+wel7fron
+wel5oor
+we4l5op
+wel6ske
+we4m3o
+wem6os.
+we4nak
+we4n5as
+wen7eens
+wen6sad
+wen6san
+wen6sar
+wen6sei
+wen6ser
+wen6ses
+wen4sk
+wens5ka
+wen7skud
+wen4s5l
+wen4so
+wen6spr
+wen6ste
+wens7tes
+wen4s5u
+wer7esse
+wer6fom
+wer6gar
+wer6gre
+wer6int
+3werk
+wer6kad
+wer6k5af
+wer6kes
+wer4kl
+werk7laa
+wer7klan
+wer7klap
+wer7klok
+wer6koms
+wer6kon
+wer7kony
+wer6kre
+wer6kro
+wer6kuu
+wer4kw
+wer5kwa
+wer4ky
+we4r3o
+wer6paf
+wer6pan
+wer6plo
+wer6pon
+wer6poo
+wer6por
+wer7smed
+wer7uil.
+wes6mit
+wes7oewe
+we4sp
+wes7pemi
+we4s3t
+we5sta
+wes4th
+we5s4tr
+wes7waar
+3wet.
+wet7regu
+wet4s5o
+wet4s5t
+wet7wysi
+3wêr
+4wfon
+wids7tor
+wiel5a
+wie4t5j
+wi4gr
+wi4kl
+wi4ko
+wiks7te.
+wil6dag
+wil6sin
+wil4sk
+wind7as.
+win6del
+win6dop
+wind7op.
+win4dr
+wind7ruk
+win6kle
+win4sk
+win7sky.
+win4s5t
+win7ston
+win6tap
+win6tes
+wip7lig.
+wip7roos
+wit5el
+wit7inkb
+wit5ji
+wi4t3o
+wit5ro
+2wj
+wje6tun
+4woeg
+woe4s
+wo4l3a
+wol7invo
+wol6klo
+wo4l3o
+woor6dr
+wo5rum
+wou6dag
+w2r
+wree4
+wri6gon
+2ws
+wur4gr
+wur4m
+wurm5a
+2ww
+wwe7rint
+wyd5oo
+wyd7uite
+wyk6was
+wyn6and
+wyn5sm
+3wys
+wys7aksi
+wys3k
+wys3p
+wys5ta
+wyt7raak
+x'9ie.
+x1a
+xe1
+x3em
+xerox7e.
+x2h
+x1i
+xys6te.
+y1a
+y4ama
+ybe6lil
+y2d
+y3da
+y3de
+yden4s
+ydgele6
+ydg6leu
+y3di
+yd3of
+yd3re
+yd3ro
+yd4sin
+yd6skat
+yds7krit
+yds7orde
+y1e
+y4enn
+yer2
+yer7hof.
+yer7maat
+yer4s
+yer7ton.
+yer7vill
+yer7voël
+yes6agt
+3yeu
+yf3aa
+y4far
+yf5as.
+yf3l
+y2f3r
+yf5ren
+yf4sl
+yf4su
+y1g
+yg4le
+yg4li
+yg4ly
+yg5saa
+ygs7kans
+yg5sko
+ygs5le
+ygs6tek
+yg4sto
+yg4stu
+ykaar4
+yker6st
+y4k5ins
+y2kl
+yk3li
+yk4lu
+yk5lui
+yk5lus
+ykoms4
+y4kor
+yk3ri
+yk4s5ad
+yk4sk
+yks7kans
+yk3sp
+yks4t
+yk4su
+y2k3w
+y1la
+y1lo
+y4loe
+yls7laar
+y2n1a
+yn4a.
+y4nei
+y4n5ete
+yn1g2
+yn5kli
+yn5kwa
+y2n1o
+y3n4om
+yns6agt
+yn4s5am
+yns5ins
+yn5sly
+yns4m
+yns7maan
+yn4s5or
+yn4sp
+yns7paar
+yns4t
+yn3u
+yo9yo.
+y2p
+y3pa
+y3pe
+y3pi
+y5plan
+yp3li
+yp5org
+y3pr
+y3pu
+y1r
+y4sam
+ys4ig
+y4s5ind
+y4s5ins
+y2sk
+ys5kar
+ys3ko
+y5s4koo
+y2s3l
+y2s3n
+y2s3o
+ys4ok
+ys4ou
+ys5poe
+ys3t
+ys4ta
+y4s5taf
+y5s4tel
+y4ster
+y3s4tr
+ys4tu
+ys3ui
+ys3w
+y2t
+y3ta
+yt3ag
+y3te
+yt4ha
+y3ti
+y3tj
+y3to
+y3tu
+y3ty
+yve7sant
+1z
+2z.
+4zbur
+zee7rust
+zen7elle
+zi2c
+zi5cat
+4zman
+zook6a.
+2zz
+2-1
+-er4t
+-ert5j
+-ha-7ha.
+-k4li
+-na6gew
+-s4ti
+-t4we
+-5twee} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-af.rme b/Master/texmf-dist/tex/context/patterns/lang-af.rme
new file mode 100644
index 00000000000..d57a822264a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-af.rme
@@ -0,0 +1,28 @@
+% generated by mtxrun --script pattern --convert
+
+Afrikaans Hyphenation Patterns
+
+(more info about the licence to be added later)
+
+% Hyphenation patterns for Afrikaans
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+% -----------------------------------------------------------------
+% VERSION: 0.9 (October 2010)
+%
+% AUTHORS: Tilla Fick and Chris Swanepoel
+% hyphen at rekenaar dot net
+% -----------------------------------------------------------------
+%
+% Define lefthyphenmin to one and righthyphenmin to two
+% (although righthyphenmin could technically be made one,
+% in allmost all cases a value of two gives better results):
+% \lefthyphenmin=1 \righthyphenmin=2
+%
+% -----------------------------------------------------------------
diff --git a/Master/texmf-dist/tex/context/patterns/lang-agr.hyp b/Master/texmf-dist/tex/context/patterns/lang-agr.hyp
index 9e36be3de79..831a09e823d 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-agr.hyp
+++ b/Master/texmf-dist/tex/context/patterns/lang-agr.hyp
@@ -1,32 +1,8 @@
-% context hyphenation file, see lang-all.xml for original comment
+% generated by mtxrun --script pattern --convert
-% source of data: grahyph4.tex oldgrhyph.tex
+% for comment and copyright, see e:/tmp/patterns/lang-agr.rme
-% begin description data
-
-% <!-- copied from lang-all.xml
-%
-% <?xml version='1.0' standalone='yes'?>
-%
-% <description language='agr'>
-% <sourcefile>grahyph4.tex</sourcefile>
-% <title>TeX hyphenation patterns for the ancient Greek language</title>
-% <copyright>
-% <year>2004</year>
-% <owner>Dimitrios Filippou</owner>
-% <comment>These hyphenation patterns are explained in "ancient.pdf".
-% Hyphenation examples are given in the file "anc-test.pdf".
-% Some doubtful patterns are marked by three question marks "???".</comment>
-% </copyright>
-% </description>
-%
-% end of copy -->
-
-% end description data
-
-% begin hyphenation data
-
-\hyphenation {}
-
-% end hyphenation data
+% used:
+\hyphenation{
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-agr.lua b/Master/texmf-dist/tex/context/patterns/lang-agr.lua
new file mode 100644
index 00000000000..0024abf3659
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-agr.lua
@@ -0,0 +1,56 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="agr",
+ ["source"]="hyph-grc",
+ ["texcomment"]="% Hyphenation patterns for Ancient Greek\
+% \
+% (more info about the licence to be added later)\
+% \
+% ****************************************************************\
+%\
+% File name: grahyph5-unicode.tex\
+%\
+% This file was first created by mechanical translation from \
+% GRAhyph5.tex via \"elhyph-utf8 -a -c\" (version 0.1 by Peter \
+% Heslin -- p.j.heslin@durham.ac.uk). Some additions were \
+% also made by hand.\
+%\
+% Created: June 6, 2008\
+%\
+% Hyphenation patterns for Ancient Greek.\
+%\
+% Created by Dimitrios Filippou with some ideas borrowed from \
+% Yannis Haralambous, Kostis Dryllerakis and Claudio Beccari.\
+% \
+% These hyphenation patterns are explained in \"ancient.pdf\".\
+% Hyphenation examples are given in the file \"anc-test.pdf\".\
+% Some doubtful patterns are marked by three question marks \"???\". \
+% \
+% Documentation in English can be found in: D. Filippou, \
+% \"Hyphenation patterns for Ancient and Modern Greek,\" in \
+% \"TeX, XML, and Digital Typography\" (A. Syropoulos et al.,\
+% eds.), Lecture Notes in Computer Science 3130, Springer-Verlag\
+% Berlin-Heidelberg, 2004. ISBN 3-540-22801-2.\
+% \
+% Thanks to Thomas Schmitz (thomas.schmitz@uni-bonn.de) \
+% for pointing out a few mistakes. (Marked by %%%TS%%%)\
+%\
+% ****************************************************************\
+%\
+% \\message{UTF-8 hyphenation patterns for Ancient Greek}\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="ʼΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϲἀἁἂἃἄἅἆἇἐἑἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀὁὂὃὄὅὐὑὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾐᾑᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾲᾳᾴᾶᾷ᾽᾿ῂῃῄῆῇῒΐῖῗῢΰῤῥῦῧῲῳῴῶῷ’",
+ ["data"]="α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 ἥ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 ὣ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 ᾠ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 ῷ1 ά1 έ1 ή1 ί1 ό1 ύ1 ώ1 ΐ1 ΰ1 ά1 έ1 ή1 ί1 ό1 ύ1 ώ1 ΐ1 ΰ1 α2ι α2ί α2ί α2ὶ α2ῖ α2ἰ α2ἴ α2ἲ α2ἶ α2ἱ α2ἵ α2ἳ α2ἷ ά3ι ά3ι ᾶ3ι ἀ3ι ἁ3ι α2υ α2ύ α2ύ α2ὺ α2ῦ α2ὐ α2ὔ α2ὒ α2ὖ α2ὑ α2ὕ α2ὓ α2ὗ ά3υ ά3υ ᾶ3υ ἀ3υ ἁ3υ ε2ι ε2ί ε2ί ε2ὶ ε2ῖ ε2ἰ ε2ἴ ε2ἲ ε2ἶ ε2ἱ ε2ἵ ε2ἳ ε2ἷ έ3ι έ3ι ἐ3ι ἑ3ι ε2υ ε2ύ ε2ύ ε2ὺ ε2ῦ ε2ὐ ε2ὔ ε2ὒ ε2ὖ ε2ὑ ε2ὕ ε2ὓ ε2ὗ έ3υ έ3υ ἑ3υ ἐ3υ η2υ η2ύ η2ύ η2ὺ η2ῦ η2ὐ η2ὔ η2ὒ η2ὖ η2ὑ η2ὕ η2ὓ η2ὗ ή3υ ή3υ ῆ3υ ἠ3υ ἡ3υ ο2ι ο2ί ο2ί ο2ὶ ο2ῖ ο2ἰ ο2ἴ ο2ἲ ο2ἶ ο2ἱ ο2ἵ ο2ἳ ο2ἷ ό3ι ό3ι ὀ3ι ὁ3ι ο2υ ο2ύ ο2ύ ο2ὺ ο2ῦ ο2ὐ ο2ὔ ο2ὒ ο2ὖ ο2ὑ ο2ὕ ο2ὓ ο2ὗ ό3υ ό3υ ὀ3υ ὁ3υ υ2ι υ2ί υ2ί υ2ὶ υ2ῖ υ2ἰ υ2ἴ υ2ἲ υ2ἶ υ2ἱ υ2ἵ υ2ἳ υ2ἷ ύ3ι ύ3ι ῦ3ι ὐ3ι ὑ3ι ου3ι όυ4ι όυ4ι ὀυ4ι ὁυ4ι ο3υί ο3υί ο3υῖ 4β. 4γ. 4δ. 4ζ. 4θ. 4κ. 4λ. 4μ. 4ν. 4ξ. 4π. 4ρ. 4σ. 4ϲ. 4ς. 4τ. 4φ. 4χ. 4ψ. 4’ 4ʼ 4᾿ 4β’ 4βʼ 4β᾿ 4γ’ 4γʼ 4γ᾿ 4δ’ 4δʼ 4δ᾿ 4ζ’ 4ζʼ 4ζ᾿ 4θ’ 4θʼ 4θ᾿ 4κ’ 4κʼ 4κ᾿ 4λ’ 4λʼ 4λ᾿ 4μ’ 4μʼ 4μ᾿ 4ν’ 4νʼ 4ν᾿ 4ξ’ 4ξʼ 4ξ᾿ 4π’ 4πʼ 4π᾿ 4ρ’ 4ρʼ 4ρ᾿ 4σ’ 4σʼ 4σ᾿ 4ϲ’ 4ϲʼ 4ϲ᾿ 4τ’ 4τʼ 4τ᾿ 4φ’ 4φʼ 4φ᾿ 4χ’ 4χʼ 4χ᾿ 4ψ’ 4ψʼ 4ψ᾿ .β4 .γ4 .δ4 .ζ4 .θ4 .κ4 .λ4 .μ4 .ν4 .ξ4 .π4 .ρ4 .σ4 .ϲ4 .τ4 .φ4 .χ4 .ψ4 2β1β 2γ1γ 2δ1δ 2ζ1ζ 2θ1θ 2κ1κ 2λ1λ 2μ1μ 2ν1ν 2π1π 2ρ1ρ 2ῤ1ῥ 2σ1σ 2ϲ1ϲ 2τ1τ 2φ1φ 2χ1χ 2ψ1ψ 2β1γ 2β1ζ 2β1θ 2β1κ 2β1ξ 2β1π 2β1σ 2β1ϲ 2β1τ 2β1φ 2β1χ 2β1ψ 2γ1β 2γ1ζ 2γ1θ 2γ1κ 2γ1ξ 2γ1π 2γ1σ 2γ1ϲ 2γ1τ 2γ1φ 2γ1χ 2γ1ψ 2δ1β 2δ1γ 2δ1ζ 2δ1θ 2δ1κ 2δ1λ 2δ1ξ 2δ1π 2δ1σ 2δ1ϲ 2δ1τ 2δ1φ 2δ1χ 2δ1ψ 2ζ1β 2ζ1γ 2ζ1δ 2ζ1θ 2ζ1κ 2ζ1λ 2ζ1μ 2ζ1ν 2ζ1ξ 2ζ1π 2ζ1ρ 2ζ1σ 2ζ1ϲ 2ζ1τ 2ζ1φ 2ζ1χ 2ζ1ψ 2θ1β 2θ1γ 2θ1δ 2θ1ζ 2θ1κ 2θ1ξ 2θ1π 2θ1σ 2θ1ϲ 2θ1τ 2θ1φ 2θ1χ 2θ1ψ 2κ1β 2κ1γ 2κ1δ 2κ1ζ 2κ1θ 2κ1ξ 2κ1π 2κ1σ 2κ1ϲ 2κ1φ 2κ1χ 2κ1ψ 2λ1β 2λ1γ 2λ1δ 2λ1ζ 2λ1θ 2λ1κ 2λ1μ 2λ1ν 2λ1ξ 2λ1π 2λ1ρ 2λ1σ 2λ1ϲ 2λ1τ 2λ1φ 2λ1χ 2λ1ψ 2μ1β 2μ1γ 2μ1δ 2μ1ζ 2μ1θ 2μ1κ 2μ1λ 2μ1ξ 2μ1π 2μ1ρ 2μ1σ 2μ1ϲ 2μ1τ 2μ1φ 2μ1χ 2μ1ψ 2ν1β 2ν1γ 2ν1δ 2ν1ζ 2ν1θ 2ν1κ 2ν1λ 2ν1μ 2ν1ξ 2ν1π 2ν1ρ 2ν1σ 2ν1ϲ 2νς. 2νϲ. 2ν1τ 2ν1φ 2ν1χ 2ν1ψ 2ξ1β 2ξ1γ 2ξ1δ 2ξ1ζ 2ξ1θ 2ξ1κ 2ξ1λ 2ξ1μ 2ξ1ν 2ξ1π 2ξ1ρ 2ξ1σ 2ξ1ϲ 2ξ1τ 2ξ1φ 2ξ1χ 2ξ1ψ 2π1β 2π1γ 2π1δ 2π1ζ 2π1θ 2π1κ 2π1ξ 2π1σ 2π1ϲ 2π1φ 2π1χ 2π1ψ 2ρ1β 2ρ1γ 2ρ1δ 2ρ1ζ 2ρ1θ 2ρ1κ 2ρ1λ 2ρ1μ 2ρ1ν 2ρ1ξ 2ρ1π 2ρ1σ 2ρ1ϲ 2ρ1τ 2ρ1φ 2ρ1χ 2ρ1ψ 2σ1δ 2ϲ1δ 2σ1ζ 2ϲ1ζ 2σ1λ 2ϲ1λ 2σ1ν 2ϲ1ν 2σ1ξ 2ϲ1ξ 2σ1ρ 2ϲ1ρ 2σ1ψ 2ϲ1ψ 2τ1β 2τ1γ 2τ1δ 2τ1ζ 2τ1θ 2τ1κ 2τ1ξ 2τ1π 2τ1σ 2τ1ϲ 2τ1φ 2τ1χ 2τ1ψ 2φ1β 2φ1γ 2φ1δ 2φ1ζ 2φ1κ 2φ1ξ 2φ1π 2φ1σ 2φ1ϲ 2φ1τ 2φ1χ 2φ1ψ 2χ1β 2χ1γ 2χ1δ 2χ1ζ 2χ1κ 2χ1ξ 2χ1π 2χ1σ 2χ1ϲ 2χ1τ 2χ1φ 2χ1ψ 2ψ1β 2ψ1γ 2ψ1δ 2ψ1ζ 2ψ1θ 2ψ1κ 2ψ1λ 2ψ1μ 2ψ1ν 2ψ1ξ 2ψ1π 2ψ1ρ 2ψ1σ 2ψ1ϲ 2ψ1τ 2ψ1φ 2ψ1χ 4βδ’ 4βδʼ 4βδ᾽ 4βδ᾿ 4βλ’ 4βλʼ 4βλ᾽ 4βλ᾿ 4βμ’ 4βμʼ 4βμ᾽ 4βμ᾿ 4βν’ 4βνʼ 4βν᾽ 4βν᾿ 4βρ’ 4βρʼ 4βρ᾽ 4βρ᾿ 4γδ’ 4γδʼ 4γδ᾽ 4γδ᾿ 4γλ’ 4γλʼ 4γλ᾽ 4γλ᾿ 4γμ’ 4γμʼ 4γμ᾽ 4γμ᾿ 4γν’ 4γνʼ 4γν᾽ 4γν᾿ 4γρ’ 4γρʼ 4γρ᾽ 4γρ᾿ 4δμ’ 4δμʼ 4δμ᾽ 4δμ᾿ 4δν’ 4δνʼ 4δν᾽ 4δν᾿ 4δρ’ 4δρʼ 4δρ᾽ 4δρ᾿ 4ζβ’ 4ζβʼ 4ζβ᾽ 4ζβ᾿ 4θλ’ 4θλʼ 4θλ᾽ 4θλ᾿ 4λμ’ 4λμʼ 4λμ᾽ 4λμ᾿ 4θν’ 4θνʼ 4θν᾽ 4θν᾿ 4θρ’ 4θρʼ 4θρ᾽ 4θρ᾿ 4κλ’ 4κλʼ 4κλ᾽ 4κλ᾿ 4κμ’ 4κμʼ 4κμ᾽ 4κμ᾿ 4κν’ 4κνʼ 4κν᾽ 4κν᾿ 4κρ’ 4κρʼ 4κρ᾽ 4κρ᾿ 4κτ’ 4κτʼ 4κτ᾽ 4κτ᾿ 4μν’ 4μνʼ 4μν᾽ 4μν᾿ 4πλ’ 4πλʼ 4πλ᾽ 4πλ᾿ 4πμ’ 4πμʼ 4πμ᾽ 4πμ᾿ 4πν’ 4πνʼ 4πν᾽ 4πν᾿ 4πρ’ 4πρʼ 4πρ᾽ 4πρ᾿ 4πτ’ 4πτʼ 4πτ᾽ 4πτ᾿ 4σβ’ 4σβʼ 4σβ᾽ 4σβ᾿ 4ϲβ’ 4ϲβʼ 4ϲβ᾽ 4ϲβ᾿ 4σγ’ 4σγʼ 4σγ᾽ 4σγ᾿ 4ϲγ’ 4ϲγʼ 4ϲγ᾽ 4ϲγ᾿ 4σδ’ 4σδʼ 4σδ᾽ 4σδ᾿ 4ϲδ’ 4ϲδʼ 4ϲδ᾽ 4ϲδ᾿ 4σθ’ 4σθʼ 4σθ᾽ 4σθ᾿ 4ϲθ’ 4ϲθʼ 4ϲθ᾽ 4ϲθ᾿ 4σκ’ 4σκʼ 4σκ᾽ 4σκ᾿ 4ϲκ’ 4ϲκʼ 4ϲκ᾽ 4ϲκ᾿ 4σμ’ 4σμʼ 4σμ᾽ 4σμ᾿ 4ϲμ’ 4ϲμʼ 4ϲμ᾽ 4ϲμ᾿ 4σπ’ 4σπʼ 4σπ᾽ 4σπ᾿ 4ϲπ’ 4ϲπʼ 4ϲπ᾽ 4ϲπ᾿ 4στ’ 4στʼ 4στ᾽ 4στ᾿ 4ϲτ’ 4ϲτʼ 4ϲτ᾽ 4ϲτ᾿ 4σφ’ 4σφʼ 4σφ᾽ 4σφ᾿ 4ϲφ’ 4ϲφʼ 4ϲφ᾽ 4ϲφ᾿ 4σχ’ 4σχʼ 4σχ᾽ 4σχ᾿ 4ϲχ’ 4ϲχʼ 4ϲχ᾽ 4ϲχ᾿ 4φθ’ 4φθʼ 4φθ᾽ 4φθ᾿ 4φλ’ 4φλʼ 4φλ᾽ 4φλ᾿ 4φμ’ 4φμʼ 4φμ᾽ 4φμ᾿ 4φν’ 4φνʼ 4φν᾽ 4φν᾿ 4φρ’ 4φρʼ 4φρ᾽ 4φρ᾿ 4χθ’ 4χθʼ 4χθ᾽ 4χθ᾿ 4χλ’ 4χλʼ 4χλ᾽ 4χλ᾿ 4χμ’ 4χμʼ 4χμ᾽ 4χμ᾿ 4χν’ 4χνʼ 4χν᾽ 4χν᾿ 4χρ’ 4χρʼ 4χρ᾽ 4χρ᾿ ἀγω2ν1άρ ἀγω2ν1άρ ἀγω2ν1αρ ἀδιέ2ξ1 ἀδιέ2ξ1 ἀδιε2ξ1 ἀδυ2σ1ώ ἀδυ2σ1ώ ἀδυ2ϲ1ώ ἀδυ2ϲ1ώ ἀδυ2σ1ω ἀδυ2ϲ1ω ἁλό2σ1 ἁλό2σ1 ἁλό2ϲ1 ἁλό2ϲ1 ἁλο2σ1 ἁλο2ϲ1 ἀμπαλί2ν1 ἀμπαλί2ν1 ἀμπαλι2ν1 ἀμφί2σ1β ἀμφί2σ1β ἀμφί2ϲ1β ἀμφί2ϲ1β ἀμφι2σ1β ἀμφι2ϲ1β ἀμφί2σ1ω ἀμφί2σ1ω ἀμφί2ϲ1ω ἀμφί2ϲ1ω ἀμφι2σ1ώ ἀμφι2σ1ώ ἀμφι2ϲ1ώ ἀμφι2ϲ1ώ ἀ2ν1αγής. ἀ2ν1αγής. ἀ2ν1αγήϲ. ἀ2ν1αγήϲ. ἀ2ν1αγὴς. ἀ2ν1αγὴϲ. ἀ2ν1αγήσ. ἀ2ν1αγήσ. ἀ2ν1αγὴσ. ἀ2ν1αγο ἀ2ν1αγεῖ. ἀ2ν1αγῆ. ἀ2ν1αγές. ἀ2ν1αγές. ἀ2ν1αγέϲ. ἀ2ν1αγέϲ. ἀ2ν1αγὲς. ἀ2ν1αγὲϲ. ἀ2ν1αγέσ. ἀ2ν1αγέσ. ἀ2ν1αγὲσ. ἀ2ν1αγεῖς. ἀ2ν1αγεῖϲ. ἀ2ν1αγεῖσ. ἀ2ν1αγῶν. ἀ2ν1αγέσι ἀ2ν1αγέσι ἀ2ν1αγέϲι ἀ2ν1αγέϲι ἀ2ν1αγῆ ἀ2ν1άγκυ ἀ2ν1άγκυ ἀ2ν1αγκύ ἀ2ν1αγκύ ἄ2ν1αγν ἀ2ν1άγν ἀ2ν1άγν ἀ2ν1αγν ἀ3ν2αγνά ἀ3ν2αγνά ἀ3ν2αγνω ἀ3ν2άγνω ἀ3ν2άγνω ἀ3ν2αγνώ ἀ3ν2αγνώ ἀ2ν1αγρί ἀ2ν1αγρί ἀ2ν1αγρῖ ἀ2ν1αγρι ἀ2ν1άγωγ ἀ2ν1άγωγ ἀ2ν1αγώγ ἀ2ν1αγώγ ἀ3ν2αγώγι ἀ3ν2αγώγι ἀ3ν2αγωγί ἀ3ν2αγωγί ἀ4ν3αγωγία ἀ4ν3αγωγία ἀ2ν1άδελ ἀ2ν1άδελ ἀ2ν1αδέλ ἀ2ν1αδέλ ἀ2ν1άελπ ἀ2ν1άελπ ἀ2ν1αέλπ ἀ2ν1αέλπ ἄ2ν1αθλ ἀ2ν1άθλ ἀ2ν1άθλ ἀ2ν1αίδ ἀ2ν1αίδ ἀ2ν1αιδ ἄ2ν1αιμ ἀ2ν1αίμ ἀ2ν1αίμ ἀ2ν1αιμ ἀ2ν1αίσθ ἀ2ν1αίσθ ἀ2ν1αίϲθ ἀ2ν1αίϲθ ἀ2ν1αισθ ἀ2ν1αιϲθ ἀ2ν1αισι ἀ2ν1αιϲι ἀ2ν1αισί ἀ2ν1αισί ἀ2ν1αιϲί ἀ2ν1αιϲί ἀ2ν1αίσχ ἀ2ν1αίσχ ἀ2ν1αίϲχ ἀ2ν1αίϲχ ἀ2ν1αισχ ἀ2ν1αιϲχ ἀ2ν1αίτ ἀ2ν1αίτ ἀ2ν1αιτ ἀ2ν1άκαν ἀ2ν1άκαν ἀ2ν1ακάν ἀ2ν1ακάν ἀ2ν1ακόλο ἀ2ν1ακόλο ἀ2ν1ακολο ἀ2ν1αλγ ἀ2ν1αλδ ἀ3ν2αλδα ἀ3ν2αλδήσκ ἀ3ν2αλδήσκ ἀ3ν2αλδήϲκ ἀ3ν2αλδήϲκ ἀ2ν1άλειπ ἀ2ν1άλειπ ἀ2ν1αλείπ ἀ2ν1αλείπ ἀ2ν1αλειφ ἀ2ν1άλειφ ἀ2ν1άλειφ ἀ2ν1αλείφ ἀ2ν1αλείφ ἀ2ν1αλήθ ἀ2ν1αλήθ ἀ2ν1αληθ ἀ2ν1άλθ ἀ2ν1άλθ ἀ2ν1αλθ ἀ2ν1άλιπ ἀ2ν1άλιπ ἀ2ν1αλίπ ἀ2ν1αλίπ ἀ2ν1άλιστ ἀ2ν1άλιστ ἀ2ν1άλιϲτ ἀ2ν1άλιϲτ ἀ2ν1αλίστ ἀ2ν1αλίστ ἀ2ν1αλίϲτ ἀ2ν1αλίϲτ ἀ2ν1αλκ ἄ2ν1αλκ ἀ2ν1άλκ ἀ2ν1άλκ ἀ2ν1άλλ ἀ2ν1άλλ ἀ2ν1αλλ ἀ3ν2άλλο ἀ3ν2άλλο ἀ3ν2άλλε ἀ3ν2άλλε ἄ2ν1αλμ ἀ2ν1άλμ ἀ2ν1άλμ ἀ2ν1αλμ ἄ2ν1αλο ἀ2ν1άλου ἀ2ν1άλου ἀ2ν1άλῳ. ἀ2ν1άλῳ. ἄ2ν1αλε. ἀ2ν1άλοι ἀ2ν1άλοι ἀ2ν1άλων. ἀ2ν1άλων. ἄ2ν1αλτ ἀ2ν1άλτ ἀ2ν1άλτ ἀ2ν1αμάξ ἀ2ν1αμάξ ἀ2ν1αμαξ ἀ2ν1αμάρτ ἀ2ν1αμάρτ ἀ2ν1αμαρτ ἀ2ν1αμέλγ ἀ2ν1αμέλγ ἀ2ν1αμελγ ἀ2ν1αμπ ἀ2ν1άμπ ἀ2ν1άμπ ἀ2ν1αμφ ἀναμφι2σ1 ἀναμφι2ϲ1 ἀ2ν1ανάγκ ἀ2ν1ανάγκ ἀ2ν1αναγκ ἄ2ν1ανδ ἀ2ν1άνδ ἀ2ν1άνδ ἀ2ν1ανθ ἀ3ν2ανθέ ἀ3ν2ανθέ ἀ4ν3ανθές. ἀ4ν3ανθές. ἀ4ν3ανθέϲ. ἀ4ν3ανθέϲ. ἀ4ν3ανθὲς. ἀ4ν3ανθὲϲ. ἀ4ν3ανθέσ. ἀ4ν3ανθέσ. ἀ4ν3ανθὲσ. ἀ4ν3ανθέσι ἀ4ν3ανθέσι ἀ4ν3ανθέϲι ἀ4ν3ανθέϲι ἀ2ν1άνιο ἀ2ν1άνιο ἀ2ν1ανίο ἀ2ν1ανίο ἀ2ν1ανίω ἀ2ν1ανίω ἀ2ν1ανταγ ἀ2ν1ανταπ ἀ2ν1αντί ἀ2ν1αντί ἀ2ν1αντι ἀνα2ξ1αγ ἀνά2ξ1αν ἀνά2ξ1αν ἀνα2ξ1άν ἀνα2ξ1άν ἀνα2ξ1αν ἀνά2ξ1αρ ἀνά2ξ1αρ ἀνα2ξ1άρ ἀνα2ξ1άρ ἀνά2ξ1ιπ ἀνά2ξ1ιπ ἀνα2ξ1ίπ ἀνα2ξ1ίπ ἀ2ν1αξιόλ ἀ2ν1αξιόλ ἀ2ν1αξιολ ἀ2ν1αξιόπ ἀ2ν1αξιόπ ἀ2ν1αξιοπ ἀ2ν1άξιο ἀ2ν1άξιο ἀ2ν1αξίο ἀ2ν1αξίο ἀ2ν1αξίω ἀ2ν1αξίω ἀ2ν1αξία ἀ2ν1αξία ἀ2ν1αξῖα ἀ2ν1απάλλα ἀ2ν1απάλλα ἀ2ν1απαλλά ἀ2ν1απαλλά ἀ2ν1απάρτ ἀ2ν1απάρτ ἀ2ν1απαρτ ἀ2ν1απαύδ ἀ2ν1απαύδ ἀ2ν1απαυδ ἀ2ν1απόβ ἀ2ν1απόβ ἀ2ν1αποβ ἀ2ν1απόγ ἀ2ν1απόγ ἀ2ν1απογ ἀ2ν1αποδή ἀ2ν1αποδή ἀ2ν1αποδη ἀ2ν1απόδο ἀ2ν1απόδο ἀ2ν1αποδό ἀ2ν1αποδό ἀ2ν1απόδρ ἀ2ν1απόδρ ἀ2ν1αποδρ ἀ2ν1απόλαυ ἀ2ν1απόλαυ ἀ2ν1απολαύ ἀ2ν1απολαύ ἀ2ν1απολό ἀ2ν1απολό ἀ2ν1απολο ἀ2ν1απόλυ ἀ2ν1απόλυ ἀ2ν1απολύ ἀ2ν1απολύ ἀ2ν1απόν ἀ2ν1απόν ἀ2ν1απον ἀ2ν1απόπ ἀ2ν1απόπ ἀ2ν1αποπ ἀ2ν1απόσ ἀ2ν1απόσ ἀ2ν1απόϲ ἀ2ν1απόϲ ἀ2ν1αποσ ἀ2ν1αποϲ ἀ2ν1απότε ἀ2ν1απότε ἀ2ν1αποτε ἀ2ν1απότμ ἀ2ν1απότμ ἀ2ν1αποτμ ἀ2ν1απότρ ἀ2ν1απότρ ἀ2ν1αποτρ ἀ2ν1αρά ἀ2ν1αρά ἀ2ν1αρα ἀ2ν1άρ ἀ2ν1άρ ἀ2ν1αρ ἄ2ν1αρ ἀ3ν2αρίτ ἀ3ν2αρίτ ἀ3ν2αρῖτ ἀ3ν2αριτ ἀ3ν2αρπ ἀ3ν2άρρ ἀ3ν2άρρ ἀ3ν2αρρ ἀ4ν3αρραγ ἀ3ν2αρτ ἀ3ν2αρύτ ἀ3ν2αρύτ ἀ2ν1άσκη ἀ2ν1άσκη ἀ2ν1άϲκη ἀ2ν1άϲκη ἀ2ν1ασκή ἀ2ν1ασκή ἀ2ν1αϲκή ἀ2ν1αϲκή ἄ2ν1ασπι ἄ2ν1αϲπι ἀ2ν1ασπί ἀ2ν1ασπί ἀ2ν1αϲπί ἀ2ν1αϲπί ἀ2ν1άσσατ ἀ2ν1άσσατ ἀ2ν1άϲϲατ ἀ2ν1άϲϲατ ἀ2ν1ασσάτ ἀ2ν1ασσάτ ἀ2ν1αϲϲάτ ἀ2ν1αϲϲάτ ἀ2ν1άστει ἀ2ν1άστει ἀ2ν1άϲτει ἀ2ν1άϲτει ἀ2ν1αστεί ἀ2ν1αστεί ἀ2ν1αϲτεί ἀ2ν1αϲτεί ἀ3ν2αστείβ ἀ3ν2αστείβ ἀ3ν2αϲτείβ ἀ3ν2αϲτείβ ἀ3ν2άστειρ ἀ3ν2άστειρ ἀ3ν2άϲτειρ ἀ3ν2άϲτειρ ἀ3ν2αστείρ ἀ3ν2αστείρ ἀ3ν2αϲτείρ ἀ3ν2αϲτείρ ἀ3ν2άστειχ ἀ3ν2άστειχ ἀ3ν2άϲτειχ ἀ3ν2άϲτειχ ἀ3ν2αστείχ ἀ3ν2αστείχ ἀ3ν2αϲτείχ ἀ3ν2αϲτείχ ἀ2ν1ατεὶ. ἀ2ν1ατεί. ἀ2ν1ατεί. ἀ2ν1ατὶ. ἀ2ν1ατί. ἀ2ν1ατί. ἄ2ν1ατος. ἄ2ν1ατοϲ. ἄ2ν1ατοσ. ἀ2ν1άτου. ἀ2ν1άτου. ἀ2ν1άτω ἀ2ν1άτω ἄ2ν1ατον. ἄ2ν1ατε ἄ2ν1ατοι. ἀ2ν1άτοις. ἀ2ν1άτοις. ἀ2ν1άτοιϲ. ἀ2ν1άτοιϲ. ἀ2ν1άτοισ. ἀ2ν1άτοισ. ἀ2ν1άττ ἀ2ν1άττ ἀ2ν1αττ ἀ2ν1αύγ ἀ2ν1αύγ ἀ2ν1αυγ ἀ2ν1αύδ ἀ2ν1αύδ ἀ2ν1αυδ ἀ3ν2αυδί ἀ3ν2αυδί ἀ3ν2αυδι ἄ2ν1αυδ ἄ2ν1αυλ ἀ2ν1αύλ ἀ2ν1αύλ ἀ2ν1αύξ ἀ2ν1αύξ ἀ2ν1αυξ ἀ2ν1αύχ ἀ2ν1αύχ ἀ2ν1αυχ ἀ2ν1αφαίρ ἀ2ν1αφαίρ ἀ2ν1αφαιρ ἀ2ν1αφή ἀ2ν1αφή ἀ2ν1αφὴ ἀ2ν1αφοῦ ἀ2ν1αφῆ ἀ2ν1αφεῖ ἀ2ν1αφοῖ ἀ2ν1εφῶν. ἀ2ν1αφέ ἀ2ν1αφέ ἀ2ν1αφὲ ἀ3ν2αφῆν ἀ2ν1αφρόδ ἀ2ν1αφρόδ ἀ2ν1αφροδ ἄ2ν1αφρ ἀ2ν1άφρ ἀ2ν1άφρ ἀ2ν1αχύρ ἀ2ν1αχύρ ἀ2ν1αχυρ ἀνδρό2σ1α ἀνδρό2σ1α ἀνδρό2ϲ1α ἀνδρό2ϲ1α ἀνδρο2σ1α ἀνδρο2ϲ1α ἀ2ν1έγγ ἀ2ν1έγγ ἀ2ν1εγγ ἀ2ν1έγερτ ἀ2ν1έγερτ ἀ2ν1εγέρτ ἀ2ν1εγέρτ ἀ2ν1εγκ ἀ2ν1έγκ ἀ2ν1έγκ ἀ2ν1εγχ ἀ2ν1εδά ἀ2ν1εδά ἀ2ν1εδα ἀ2ν1έδεσ ἀ2ν1έδεσ ἀ2ν1έδεϲ ἀ2ν1έδεϲ ἀ2ν1εδέσ ἀ2ν1εδέσ ἀ2ν1εδέϲ ἀ2ν1εδέϲ ἀ2ν1έδρασ ἀ2ν1έδρασ ἀ2ν1έδραϲ ἀ2ν1έδραϲ ἀ2ν1εδράσ ἀ2ν1εδράσ ἀ2ν1εδράϲ ἀ2ν1εδράϲ ἀ2ν1εέρ ἀ2ν1εέρ ἀ2ν1εερ ἀ2ν1εθέλ ἀ2ν1εθέλ ἀ2ν1εθελ ἀ2ν1έθι ἀ2ν1έθι ἀ2ν1εθί ἀ2ν1εθί ἀ2ν1είδε ἀ2ν1είδε ἀ2ν1ειδέ ἀ2ν1ειδέ ἀ2ν1είδω ἀ2ν1είδω ἀ2ν1ειδώ ἀ2ν1ειδώ ἀ2ν1είκα ἀ2ν1είκα ἀ2ν1εικά ἀ2ν1εικά ἀ2ν1εικό ἀ2ν1εικό ἀ2ν1εικο ἀ2ν1ειλεί ἀ2ν1ειλεί ἀ2ν1ειλει ἀ2ν1είμα ἀ2ν1είμα ἀ2ν1εί2σ1ακ ἀ2ν1εί2σ1ακ ἀ2ν1εί2ϲ1ακ ἀ2ν1εί2ϲ1ακ ἀ2ν1ει2σ1άκ ἀ2ν1ει2σ1άκ ἀ2ν1ει2ϲ1άκ ἀ2ν1ει2ϲ1άκ ἀ2ν1εί2σ1ο ἀ2ν1εί2σ1ο ἀ2ν1εί2ϲ1ο ἀ2ν1εί2ϲ1ο ἀ2ν1ει2σ1ό ἀ2ν1ει2σ1ό ἀ2ν1ει2ϲ1ό ἀ2ν1ει2ϲ1ό ἀ2ν1ει2σ1φορ ἀ2ν1ει2ϲ1φορ ἀ2ν1εί2σ1φορ ἀ2ν1εί2σ1φορ ἀ2ν1εί2ϲ1φορ ἀ2ν1εί2ϲ1φορ ἀ2ν1ει2σ1φόρ ἀ2ν1ει2σ1φόρ ἀ2ν1ει2ϲ1φόρ ἀ2ν1ει2ϲ1φόρ ἀ2ν1έκ ἀ2ν1έκ ἀ2ν1εκ ἀ3ν2έκα ἀ3ν2έκα ἀ3ν2εκάς. ἀ3ν2εκάς. ἀ3ν2εκάϲ. ἀ3ν2εκάϲ. ἀ3ν2εκὰς. ἀ3ν2εκὰϲ. ἀ3ν2εκάσ. ἀ3ν2εκάσ. ἀ3ν2εκὰσ. ἀ3ν2εκτ ἀ4ν3έ2κ1τιτ ἀ4ν3έ2κ1τιτ ἀ4ν3ε2κ1τίτ ἀ4ν3ε2κ1τίτ ἀνε2κ1λιπ ἀνε2κ1λό ἀνε2κ1λό ἀνε2κ1λο ἀ2ν1έλαι ἀ2ν1έλαι ἀ2ν1ελαι ἀ2ν1ελάτ ἀ2ν1ελάτ ἀ2ν1ελατ ἀ2ν1έλεγκ ἀ2ν1έλεγκ ἀ2ν1ελέγκ ἀ2ν1ελέγκ ἀ2ν1ελεγξ ἀ2ν1ελέη ἀ2ν1ελέη ἀ2ν1ελεή ἀ2ν1ελεή ἀ2ν1έλεο ἀ2ν1έλεο ἀ2ν1ελέο ἀ2ν1ελέο ἀ2ν1ελέω ἀ2ν1ελέω ἀ2ν1έλεε ἀ2ν1έλεε ἀ2ν1ελκή ἀ2ν1ελκή ἀ2ν1ελκὴ ἀ2ν1ελκο ἀ2ν1ελκῆ ἀ2ν1ελκές. ἀ2ν1ελκές. ἀ2ν1ελκέϲ. ἀ2ν1ελκέϲ. ἀ2ν1ελκὲς. ἀ2ν1ελκὲϲ. ἀ2ν1ελκέσ. ἀ2ν1ελκέσ. ἀ2ν1ελκὲσ. ἀ2ν1ελκε ἀ2ν1ελκῶ ἀ2ν1ελκέσ ἀ2ν1ελκέσ ἀ2ν1ελκέϲ ἀ2ν1ελκέϲ ἄ2ν1ελκτ ἀ2ν1έλκτ ἀ2ν1έλκτ ἀ2ν1έλκω ἀ2ν1έλκω ἀ2ν1ελκώ ἀ2ν1ελκώ ἀ2ν1έλλ ἀ2ν1έλλ ἀ2ν1έλπι ἀ2ν1έλπι ἀ2ν1ελπί ἀ2ν1ελπί ἀ2ν1έλυτρ ἀ2ν1έλυτρ ἀ2ν1ελύτρ ἀ2ν1ελύτρ ἀ2ν1έμβ ἀ2ν1έμβ ἀ2ν1εμβ ἀ2ν1έμετ ἀ2ν1έμετ ἀ2ν1εμέτ ἀ2ν1εμέτ ἀ2ν1έμπ ἀ2ν1έμπ ἀ2ν1εμπ ἀ2ν1έμφ ἀ2ν1έμφ ἀ2ν1εμφ ἀ2ν1έν ἀ2ν1έν ἀ2ν1εν ἀ3ν2ένει ἀ3ν2ένει ἀ3ν2ενή ἀ3ν2ενή ἀ3ν2έντες. ἀ3ν2έντες. ἀ3ν2έντεϲ. ἀ3ν2έντεϲ. ἀ3ν2έντεσ. ἀ3ν2έντεσ. ἀ2ν1ε2ξ1 ἀ3ν2ε3ξ2ίκα ἀ3ν2ε3ξ2ίκα ἀ3ν2ε3ξ2ικά ἀ3ν2ε3ξ2ικά ἀ2ν1έορ ἀ2ν1έορ ἀ2ν1εόρ ἀ2ν1εόρ ἀ2ν1επ ἀ3ν2επν ἀ3ν2επτ ἀ2ν1εραστ ἀ2ν1εραϲτ ἀ2ν1έραστ ἀ2ν1έραστ ἀ2ν1έραϲτ ἀ2ν1έραϲτ ἀ2ν1εράστ ἀ2ν1εράστ ἀ2ν1εράϲτ ἀ2ν1εράϲτ ἀ2ν1εργ ἄ2ν1εργ ἀ2ν1έργ ἀ2ν1έργ ἀ2ν1έρεικ ἀ2ν1έρεικ ἀ2ν1ερείκ ἀ2ν1ερείκ ἀ2ν1έρεισ ἀ2ν1έρεισ ἀ2ν1έρειϲ ἀ2ν1έρειϲ ἀ2ν1ερείσ ἀ2ν1ερείσ ἀ2ν1ερείϲ ἀ2ν1ερείϲ ἀ2ν1ερεύνητ ἀ2ν1ερεύνητ ἀ2ν1ερευνήτ ἀ2ν1ερευνήτ ἀ2ν1ερί ἀ2ν1ερί ἀ2ν1ερι ἀ2ν1ερυθρίαστ ἀ2ν1ερυθρίαστ ἀ2ν1ερυθρίαϲτ ἀ2ν1ερυθρίαϲτ ἀ2ν1ερυθριάστ ἀ2ν1ερυθριάστ ἀ2ν1ερυθριάϲτ ἀ2ν1ερυθριάϲτ ἀ2ν1έστι ἀ2ν1έστι ἀ2ν1έϲτι ἀ2ν1έϲτι ἀ2ν1εστί ἀ2ν1εστί ἀ2ν1εϲτί ἀ2ν1εϲτί ἀ2ν1έται ἀ2ν1έται ἀ2ν1εταί ἀ2ν1εταί ἀ2ν1έτοι ἀ2ν1έτοι ἀ2ν1ετοί ἀ2ν1ετοί ἀ2ν1ετυ ἀ2ν1έτυ ἀ2ν1έτυ ἀ2ν1ετύ ἀ2ν1ετύ ἀ2ν1εύθ ἀ2ν1εύθ ἀ2ν1ευθ ἄ2ν1ευκ ἀ2ν1εύκ ἀ2ν1εύκ ἀ2ν1ευλ ἀ2ν1εύρετ ἀ2ν1εύρετ ἀ2ν1ευρέτ ἀ2ν1ευρέτ ἀ2ν1ευφήμητ ἀ2ν1ευφήμητ ἀ2ν1ευφημήτ ἀ2ν1ευφημήτ ἀ2ν1εύχ ἀ2ν1εύχ ἀ2ν1ευχ ἀ2ν1εύξ ἀ2ν1εύξ ἀ2ν1ευξ ἀ2ν1ηυξ ἀ2ν1ηῦγ ἀ2ν1ηυγ ἀ2ν1ευκτ ἀ2ν1έφ ἀ2ν1έφ ἀ2ν1εφ ἀ3ν2εφάλ ἀ3ν2εφάλ ἀ3ν2έφελ ἀ3ν2έφελ ἀ3ν2εφέλ ἀ3ν2εφέλ ἀ2ν1εχέ ἀ2ν1εχέ ἀ2ν1εχε ἀ2ν1έψα ἀ2ν1έψα ἀ2ν1εψά ἀ2ν1εψά ἀ2ν1ηγεμ ἀ2ν1ήδ ἀ2ν1ήδ ἀ2ν1ηδ ἀ2ν1ήκεσ ἀ2ν1ήκεσ ἀ2ν1ήκεϲ ἀ2ν1ήκεϲ ἀ2ν1ηκέσ ἀ2ν1ηκέσ ἀ2ν1ηκέϲ ἀ2ν1ηκέϲ ἀ2ν1ήκο ἀ2ν1ήκο ἀ2ν1ηκό ἀ2ν1ηκό ἀ2ν1ηκο ἀ2ν1ηλάκ ἀ2ν1ηλάκ ἀ2ν1ηλακ ἀ2ν1ήλατος. ἀ2ν1ήλατος. ἀ2ν1ήλατοϲ. ἀ2ν1ήλατοϲ. ἀ2ν1ήλατοσ. ἀ2ν1ήλατοσ. ἀ2ν1ηλάτου ἀ2ν1ηλάτου ἀ2ν1ηλάτω ἀ2ν1ηλάτω ἀ2ν1ήλατον. ἀ2ν1ήλατον. ἀ2ν1ήλατε. ἀ2ν1ήλατε. ἀ2ν1ηλάτοι ἀ2ν1ηλάτοι ἀ2ν1ήλατοι ἀ2ν1ήλατοι ἀ2ν1ήλατα ἀ2ν1ήλατα ἀ2ν1ηλεγ ἀ2ν1ηλεή ἀ2ν1ηλεή ἀ2ν1ηλεὴ ἀ2ν1ηλεο ἀ2ν1ηλεε ἀ2ν1ηλεῶ ἀ2ν1ηλεέ ἀ2ν1ηλεέ ἀ2ν1ηλεὲ ἀ2ν1ηλεῆ ἀ2ν1ηλέη ἀ2ν1ηλέη ἀ2ν1ήλειπ ἀ2ν1ήλειπ ἀ2ν1ηλείπ ἀ2ν1ηλείπ ἀ2ν1ηλή ἀ2ν1ηλή ἀ2ν1ηλὴ ἀ2ν1ηλοῦ ἀ2ν1ηλεῖ ἀ2ν1ηλῆ ἀ2ν1ηλέ ἀ2ν1ηλέ ἀ2ν1ηλὲ ἀ2ν1ηλοῖ ἀ2ν1ηλῶ ἀ2ν1ήλικ ἀ2ν1ήλικ ἀ2ν1ηλίκ ἀ2ν1ηλίκ ἀ2ν1ήλιο ἀ2ν1ήλιο ἀ2ν1ηλίο ἀ2ν1ηλίο ἀ2ν1ηλίω ἀ2ν1ηλίω ἀ2ν1ήλια ἀ2ν1ήλια ἀ2ν1ήλιπ ἀ2ν1ήλιπ ἀ2ν1ηλίπ ἀ2ν1ηλίπ ἀ2ν1ηλιφ ἀ2ν1ήμ ἀ2ν1ήμ ἀ2ν1ημ ἀ2ν1ήνυ ἀ2ν1ήνυ ἀ2ν1ηνύ ἀ2ν1ηνύ ἀ2ν1ήρει ἀ2ν1ήρει ἀ2ν1ηρεί ἀ2ν1ηρεί ἀ2ν1ηρέμ ἀ2ν1ηρέμ ἀ2ν1ηρεμ ἀ2ν1ηρεφ ἀ2ν1ήρι ἀ2ν1ήρι ἀ2ν1ηρί ἀ2ν1ηρί ἀ2ν1ήροτ ἀ2ν1ήροτ ἀ2ν1ηρότ ἀ2ν1ηρότ ἀ2ν1ήσσ ἀ2ν1ήσσ ἀ2ν1ήϲϲ ἀ2ν1ήϲϲ ἀ2ν1ησσ ἀ2ν1ηϲϲ ἀ2ν1ήττ ἀ2ν1ήττ ἀ2ν1ηττ ἀ2ν1ήφα ἀ2ν1ήφα ἀ2ν1ηφα ἀ2ν1ίατ ἀ2ν1ίατ ἀ2ν1ιάτ ἀ2ν1ιάτ ἀ2ν1ίδιο ἀ2ν1ίδιο ἀ2ν1ιδίο ἀ2ν1ιδίο ἀ2ν1ιδίω ἀ2ν1ιδίω ἀ2ν1ίδια ἀ2ν1ίδια ἀ2ν1ιδιτ ἄ2ν1ιδρος ἄ2ν1ιδροϲ ἄ2ν1ιδροσ ἀ2ν1ίδρου ἀ2ν1ίδρου ἀ2ν1ίδρω ἀ2ν1ίδρω ἄ2ν1ιδρον ἄ2ν1ιδρε ἀ2ν1ίδροι ἀ2ν1ίδροι ἄ2ν1ιδροι ἀ2ν1ίδρυτ ἀ2ν1ίδρυτ ἀ2ν1ιδρύτ ἀ2ν1ιδρύτ ἀ2ν1ιδρωτ ἀ2ν1ιδρώτ ἀ2ν1ιδρώτ ἀ2ν1ίερ ἀ2ν1ίερ ἀ2ν1ιέρ ἀ2ν1ιέρ ἀ2ν1ιεράτ ἀ2ν1ιεράτ ἀ3ν2ιέρω ἀ3ν2ιέρω ἀ2ν1ίκ ἀ2ν1ίκ ἀ2ν1ικ ἄ2ν1ικ ἀ3ν2ίκη ἀ3ν2ίκη ἀ3ν2ική ἀ3ν2ική ἀ2ν1ίλ ἀ2ν1ίλ ἀ2ν1ιλ ἀ2ν1ίμαστ ἀ2ν1ίμαστ ἀ2ν1ίμαϲτ ἀ2ν1ίμαϲτ ἀ2ν1ιμάστ ἀ2ν1ιμάστ ἀ2ν1ιμάϲτ ἀ2ν1ιμάϲτ ἀ2ν1ίου ἀ2ν1ίου ἀ2ν1ιού ἀ2ν1ιού ἄ2ν1ιππ ἀ2ν1ίππ ἀ2ν1ίππ ἀ2ν1ισ ἀ2ν1ιϲ ἄ2ν1ισ ἄ2ν1ιϲ ἀ2ν1ίσ ἀ2ν1ίσ ἀ2ν1ίϲ ἀ2ν1ίϲ ἀ3ν2ισᾶτ ἀ3ν2ιϲᾶτ ἀ3ν2ισάτ ἀ3ν2ισάτ ἀ3ν2ιϲάτ ἀ3ν2ιϲάτ ἀ3ν2ίστ ἀ3ν2ίστ ἀ3ν2ίϲτ ἀ3ν2ίϲτ ἀ3ν2ιστ ἀ3ν2ιϲτ ἀ4ν3ιστορη ἀ4ν3ιϲτορη ἀ4ν3ιστόρη ἀ4ν3ιστόρη ἀ4ν3ιϲτόρη ἀ4ν3ιϲτόρη ἀ4ν3ιστορή ἀ4ν3ιστορή ἀ4ν3ιϲτορή ἀ4ν3ιϲτορή ἀ3ν2ίσχ ἀ3ν2ίσχ ἀ3ν2ίϲχ ἀ3ν2ίϲχ ἀ4ν3ίσχυ ἀ4ν3ίσχυ ἀ4ν3ίϲχυ ἀ4ν3ίϲχυ ἄ2ν1ιχ ἀ2ν1ίχ ἀ2ν1ίχ ἀ2ν1ιχνεύτ ἀ2ν1ιχνεύτ ἀ2ν1ίψ ἀ2ν1ίψ ἀ2ν1ιψ ἀ2ν1όδε ἀ2ν1όδε ἀ2ν1οδέ ἀ2ν1οδέ ἄ2ν1οζ ἀ2ν1όζ ἀ2ν1όζ ἀ2ν1οικε ἀ2ν1οικον ἄ2ν1οικ ἀ2ν1οίκ ἀ2ν1οίκ ἀ2ν1οικτί ἀ2ν1οικτί ἄ2ν1οικτ ἀ2ν1οίκτ ἀ2ν1οίκτ ἀ2ν1οίμωκ ἀ2ν1οίμωκ ἀ2ν1οιμώκ ἀ2ν1οιμώκ ἀ2ν1οιμωκ ἀ2ν1οιν ἄ2ν1οιν ἀ2ν1οίν ἀ2ν1οίν ἄ2ν1οιστρ ἄ2ν1οιϲτρ ἀ2ν1οίστρ ἀ2ν1οίστρ ἀ2ν1οίϲτρ ἀ2ν1οίϲτρ ἀ2ν1όλ ἀ2ν1όλ ἀ2ν1ολ ἄ2ν1ολ ἀ3ν2ολκ ἀ3ν2ολο ἀ2ν1ομβρί ἀ2ν1ομβρί ἀ2ν1ομβρῖ ἄ2ν1ομβρο ἀ2ν1όμβρο ἀ2ν1όμβρο ἀ2ν1όμβρω ἀ2ν1όμβρω ἄ2ν1ομβρα ἀ2ν1ομήλ ἀ2ν1ομήλ ἀ2ν1ομηλ ἀ2ν1ομίλ ἀ2ν1ομίλ ἀ2ν1ομιλ ἀ2ν1όμιχ ἀ2ν1όμιχ ἀ2ν1ομιχ ἀ2ν1όμο ἀ2ν1όμο ἀ2ν1ομό ἀ2ν1ομό ἀ2ν1ομο ἀ3ν2ομοθ ἀ3ν2όμου. ἀ3ν2όμου. ἀ3ν2όμῳ. ἀ3ν2όμῳ. ἀ3ν2όμω. ἀ3ν2όμω. ἀ2ν2όμοιν. ἀ2ν2όμοιν. ἀ3ν2όμων. ἀ3ν2όμων. ἀ3ν2όμοις. ἀ3ν2όμοις. ἀ3ν2όμοιϲ. ἀ3ν2όμοιϲ. ἀ3ν2όμοισ. ἀ3ν2όμοισ. ἀ3ν2όμους. ἀ3ν2όμους. ἀ3ν2όμουϲ. ἀ3ν2όμουϲ. ἀ3ν2όμουσ. ἀ3ν2όμουσ. ἀ2ν1όν ἀ2ν1όν ἀ2ν1ον ἄ2ν1οπ ἀ2ν1όπ ἀ2ν1όπ ἀ2ν1όρ ἀ2ν1όρ ἀ2ν1ορ ἄ2ν1ορ ἀ3ν2οργάζ ἀ3ν2οργάζ ἄ3ν2ορθ ἀ3ν2όρθ ἀ3ν2όρθ ἀ3ν2ορμά ἀ3ν2ορμά ἀ3ν2ορτ ἀ3ν2ορύ ἀ3ν2ορύ ἀ2ν1όσι ἀ2ν1όσι ἀ2ν1όϲι ἀ2ν1όϲι ἀ2ν1οσί ἀ2ν1οσί ἀ2ν1οϲί ἀ2ν1οϲί ἀ2ν1οσι ἀ2ν1οϲι ἄ2ν1οσμ ἄ2ν1οϲμ ἀ2ν1όσμ ἀ2ν1όσμ ἀ2ν1όϲμ ἀ2ν1όϲμ ἀ2ν1όσφρ ἀ2ν1όσφρ ἀ2ν1όϲφρ ἀ2ν1όϲφρ ἀ2ν1οσφρ ἀ2ν1οϲφρ ἀ2ν1ούα ἀ2ν1ούα ἀ2ν1ουά ἀ2ν1ουά ἀ2ν1ούσι ἀ2ν1ούσι ἀ2ν1ούϲι ἀ2ν1ούϲι ἀ2ν1ουσί ἀ2ν1ουσί ἀ2ν1ουϲί ἀ2ν1ουϲί ἀ2ν1ούτ ἀ2ν1ούτ ἀ2ν1ουτ ἀ2ν1οφθ ἀ2ν1όχευτ ἀ2ν1όχευτ ἀ2ν1οχεύτ ἀ2ν1οχεύτ ἄ2ν1οχλ ἀ2ν1όχλ ἀ2ν1όχλ ἀ2ν1οψ ἄ2ν1οψ ἀ2ν1όψ ἀ2ν1όψ ἀντα2ν1ισ ἀντα2ν1ιϲ ἀντα2ν1ίσ ἀντα2ν1ίσ ἀντα2ν1ίϲ ἀντα2ν1ίϲ ἀντει2σ1 ἀντει2ϲ1 ἀντε2κ1 ἀντε2ν1 ἀντε2ξ1 ἀντιδυ2σ1 ἀντιδυ2ϲ1 ἀντιπαρε2κ1 ἀντιπαρε2ξ1 ἀντιπρο2σ1 ἀντιπρο2ϲ1 ἀντιπροσ3κ2υ ἀντιπροϲ3κ2υ ἀντισύ2ν1 ἀντισύ2ν1 ἀντιϲύ2ν1 ἀντιϲύ2ν1 ἀντισυ2ν1 ἀντιϲυ2ν1 ἀ2ν1ύ ἀ2ν1ύ ἀ2ν1υ ἀ3ν2υμ ἀ3ν2ύσ ἀ3ν2ύσ ἀ3ν2ύϲ ἀ3ν2ύϲ ἀ3ν2υσ ἀ3ν2υϲ ἀ2ν1υπέ2ρ1 ἀ2ν1υπέ2ρ1 ἀ2ν1υπε2ρ1 ἄ2ν1ῳδ ἀ2ν1ῴδ ἀ2ν1ώδυ ἀ2ν1ώδυ ἀ2ν1ωδύ ἀ2ν1ωδύ ἀ2ν1ώι ἀ2ν1ώι ἀ2ν1ωί ἀ2ν1ωί ἀ2ν1ώλ ἀ2ν1ώλ ἀ2ν1ωλ ἀ2ν1ώμ ἀ2ν1ώμ ἀ2ν1ωμ ἀ2ν1ών ἀ2ν1ών ἀ2ν1ων ἀ2ν1ωρ ἄ2ν1ωρ ἀ2ν1ώρ ἀ2ν1ώρ ἄ2ν1ωτο ἀ2ν1ώτο ἀ2ν1ώτο ἀ2ν1ωφέλ ἀ2ν1ωφέλ ἀ2ν1ωφελ ἀ2ν1ώχυ ἀ2ν1ώχυ ἀ2ν1ωχύ ἀ2ν1ωχύ ἀπα2ν1αι ἀπά2ν1ου ἀπά2ν1ου ἀπα2ν1ούρ ἀπα2ν1ούρ ἁπα2ξ1 ἀπε2κ1λ ἁπε2ρ1 ἀποσυ2ν1 ἀποϲυ2ν1 ἀπρό2σ1 ἀπρό2σ1 ἀπρό2ϲ1 ἀπρό2ϲ1 ἀπρο2σ1 ἀπρο2ϲ1 ἀπρό3σ2κε ἀπρό3σ2κε ἀπρό3ϲ2κε ἀπρό3ϲ2κε ἀπρο3σ2κέ ἀπρο3σ2κέ ἀπρο3ϲ2κέ ἀπρο3ϲ2κέ ἀπρό3σ2κο ἀπρό3σ2κο ἀπρό3ϲ2κο ἀπρό3ϲ2κο ἀπρο3σ2κό ἀπρο3σ2κό ἀπρο3ϲ2κό ἀπρο3ϲ2κό ἀπρο3σ2τ ἀπρο3ϲ2τ ἁρπα2ξ1 ἀρρε2ν1ω ἀρχισυ2ν1 ἀρχιϲυ2ν1 ἀστε2ρ1ω ἀϲτε2ρ1ω ἀσύ2ν1 ἀσύ2ν1 ἀϲύ2ν1 ἀϲύ2ν1 ἀσυ2ν1 ἀϲυ2ν1 ἀξύ2ν1 ἀξύ2ν1 ἀξυ2ν1 αὐτέ2κ1μ αὐτέ2κ1μ αὐτε2κ1μ αὐτε2ξ1 ἀω2σ1φ ἀω2ϲ1φ .γερα2σ1φ .γερα2ϲ1φ .δα2σ1π .δα2ϲ1π .διαμφι2σ1β .διαμφι2ϲ1β .διέ2κ1ρο .διέ2κ1ρο .διε2κ1ρό .διε2κ1ρό .διέ2ξ1 .διέ2ξ1 .διε2ξ1 .δικα2σ1π .δικα2ϲ1π .διό2σ1κ .διό2σ1κ .διό2ϲ1κ .διό2ϲ1κ .διο2σ1κ .διο2ϲ1κ .διό2σ1π .διό2σ1π .διό2ϲ1π .διό2ϲ1π .διο2σ1π .διο2ϲ1π .δί2σ1α .δί2σ1α .δί2ϲ1α .δί2ϲ1α .δι2σ1ά .δι2σ1ά .δι2ϲ1ά .δι2ϲ1ά .δί2σ1η .δί2σ1η .δί2ϲ1η .δί2ϲ1η .δι2σ1ή .δι2σ1ή .δι2ϲ1ή .δι2ϲ1ή .δί2σ1ε .δί2σ1ε .δί2ϲ1ε .δί2ϲ1ε .δι2σ1ε .δι2ϲ1ε .δι2σ1θ .δι2ϲ1θ .δύ2σ1 .δύ2σ1 .δύ2ϲ1 .δύ2ϲ1 .δυ2σ1 .δυ2ϲ1 δύ3σ2ω. δύ3σ2ω. δύ3ϲ2ω. δύ3ϲ2ω. δύ3σ2εις. δύ3σ2εις. δύ3ϲ2ειϲ. δύ3ϲ2ειϲ. δύ3σ2εισ. δύ3σ2εισ. δύ3σ2ει. δύ3σ2ει. δύ3ϲ2ει. δύ3ϲ2ει. .δύ3σ2ετ .δύ3σ2ετ .δύ3ϲ2ετ .δύ3ϲ2ετ δύ3σ2ομεν. δύ3σ2ομεν. δύ3ϲ2ομεν. δύ3ϲ2ομεν. δύ3σ2ουσιν. δύ3σ2ουσιν. δύ3ϲ2ουϲιν. δύ3ϲ2ουϲιν. δύ3σ2οιμι. δύ3σ2οιμι. δύ3ϲ2οιμι. δύ3ϲ2οιμι. δύ3σ2οις. δύ3σ2οις. δύ3ϲ2οιϲ. δύ3ϲ2οιϲ. δύ3σ2οισ. δύ3σ2οισ. δύ3σ2οι. δύ3σ2οι. δύ3ϲ2οι. δύ3ϲ2οι. δύ3σ2οιτον. δύ3σ2οιτον. δύ3ϲ2οιτον. δύ3ϲ2οιτον. δυ3σ2οίτην. δυ3σ2οίτην. δυ3ϲ2οίτην. δυ3ϲ2οίτην. δύ3σ2οιμεν. δύ3σ2οιμεν. δύ3ϲ2οιμεν. δύ3ϲ2οιμεν. δύ3σ2οιτε. δύ3σ2οιτε. δύ3ϲ2οιτε. δύ3ϲ2οιτε. δύ3σ2οιεν. δύ3σ2οιεν. δύ3ϲ2οιεν. δύ3ϲ2οιεν. δύ3σ2ειν. δύ3σ2ειν. δύ3ϲ2ειν. δύ3ϲ2ειν. δύ3σ2ων. δύ3σ2ων. δύ3ϲ2ων. δύ3ϲ2ων. δύ3σ2ον δύ3σ2ον δύ3ϲ2ον δύ3ϲ2ον δυ3σ2όν δυ3σ2όν δυ3ϲ2όν δυ3ϲ2όν δύ3σ2ουσ δύ3σ2ουσ δύ3ϲ2ουϲ δύ3ϲ2ουϲ δυ3σ2ούσ δυ3σ2ούσ δυ3ϲ2ούϲ δυ3ϲ2ούϲ δύ3σ2ῃ δύ3σ2ῃ δύ3ϲ2ῃ δύ3ϲ2ῃ δύ3σ2ητον. δύ3σ2ητον. δύ3ϲ2ητον. δύ3ϲ2ητον. δύ3σ2ωμεν. δύ3σ2ωμεν. δύ3ϲ2ωμεν. δύ3ϲ2ωμεν. δύ3σ2ωσι. δύ3σ2ωσι. δύ3ϲ2ωϲι. δύ3ϲ2ωϲι. δύ3σ2αιμι. δύ3σ2αιμι. δύ3ϲ2αιμι. δύ3ϲ2αιμι. δύ3σ2αις. δύ3σ2αις. δύ3ϲ2αιϲ. δύ3ϲ2αιϲ. δύ3σ2ειας. δύ3σ2ειας. δύ3ϲ2ειαϲ. δύ3ϲ2ειαϲ. δύ3σ2αισ. δύ3σ2αισ. δύ3σ2ειασ. δύ3σ2ειασ. δύ3σ2αι. δύ3σ2αι. δύ3ϲ2αι. δύ3ϲ2αι. δύ3σ2ειε. δύ3σ2ειε. δύ3ϲ2ειε. δύ3ϲ2ειε. δύ3σ2αιτον. δύ3σ2αιτον. δύ3ϲ2αιτον. δύ3ϲ2αιτον. δυ3σ2αίτην. δυ3σ2αίτην. δυ3ϲ2αίτην. δυ3ϲ2αίτην. δύ3σ2αιμεν. δύ3σ2αιμεν. δύ3ϲ2αιμεν. δύ3ϲ2αιμεν. δύ3σ2αιτε. δύ3σ2αιτε. δύ3ϲ2αιτε. δύ3ϲ2αιτε. δύ3σ2αιεν δύ3σ2αιεν δύ3ϲ2αιεν δύ3ϲ2αιεν δύ3σ2ειαν. δύ3σ2ειαν. δύ3ϲ2ειαν. δύ3ϲ2ειαν. δύ3σ2ον. δύ3σ2ον. δύ3ϲ2ον. δύ3ϲ2ον. δυ3σ2άτω. δυ3σ2άτω. δυ3ϲ2άτω. δυ3ϲ2άτω. δύ3σ2ατον. δύ3σ2ατον. δύ3ϲ2ατον. δύ3ϲ2ατον. δυ3σ2άτων. δυ3σ2άτων. δυ3ϲ2άτων. δυ3ϲ2άτων. δύ3σ2ατε. δύ3σ2ατε. δύ3ϲ2ατε. δύ3ϲ2ατε. δυ3σ2άντων. δυ3σ2άντων. δυ3ϲ2άντων. δυ3ϲ2άντων. δύ3σ2ας. δύ3σ2ας. δύ3ϲ2αϲ. δύ3ϲ2αϲ. δύ3σ2αν. δύ3σ2αν. δύ3ϲ2αν. δύ3ϲ2αν. δύ3σ2αντ δύ3σ2αντ δύ3ϲ2αντ δύ3ϲ2αντ δυ3σ2άντ δυ3σ2άντ δυ3ϲ2άντ δυ3ϲ2άντ δύ3σ2ασ δύ3σ2ασ δύ3ϲ2αϲ δύ3ϲ2αϲ δυ3σ2άσ δυ3σ2άσ δυ3ϲ2άϲ δυ3ϲ2άϲ δύ3σ2ομαι. δύ3σ2ομαι. δύ3ϲ2ομαι. δύ3ϲ2ομαι. .δύ3σ2εσ .δύ3σ2εσ .δύ3ϲ2εϲ .δύ3ϲ2εϲ δυ3σ2όμεθα. δυ3σ2όμεθα. δυ3ϲ2όμεθα. δυ3ϲ2όμεθα. δύ3σ2ονται. δύ3σ2ονται. δύ3ϲ2ονται. δύ3ϲ2ονται. δυ3σ2οίμην. δυ3σ2οίμην. δυ3ϲ2οίμην. δυ3ϲ2οίμην. δύ3σ2οιο. δύ3σ2οιο. δύ3ϲ2οιο. δύ3ϲ2οιο. δύ3σ2οιτο. δύ3σ2οιτο. δύ3ϲ2οιτο. δύ3ϲ2οιτο. δύ3σ2οισθον. δύ3σ2οισθον. δύ3ϲ2οιϲθον. δύ3ϲ2οιϲθον. δυ3σ2οίσθην. δυ3σ2οίσθην. δυ3ϲ2οίϲθην. δυ3ϲ2οίϲθην. δυ3σ2οίμεθα. δυ3σ2οίμεθα. δυ3ϲ2οίμεθα. δυ3ϲ2οίμεθα. δύ3σ2οισθε. δύ3σ2οισθε. δύ3ϲ2οιϲθε. δύ3ϲ2οιϲθε. δύ3σ2οιντο. δύ3σ2οιντο. δύ3ϲ2οιντο. δύ3ϲ2οιντο. δύ3σ2εσθαι. δύ3σ2εσθαι. δύ3ϲ2εϲθαι. δύ3ϲ2εϲθαι. .δυ3σ2όμεν .δυ3σ2όμεν .δυ3ϲ2όμεν .δυ3ϲ2όμεν .δυ3σ2ομέν .δυ3σ2ομέν .δυ3ϲ2ομέν .δυ3ϲ2ομέν δύ3σ2ωμαι. δύ3σ2ωμαι. δύ3ϲ2ωμαι. δύ3ϲ2ωμαι. δύ3σ2ηται. δύ3σ2ηται. δύ3ϲ2ηται. δύ3ϲ2ηται. δυ3σ2ώμεθα δυ3σ2ώμεθα δυ3ϲ2ώμεθα δυ3ϲ2ώμεθα δύ3σ2ησθε. δύ3σ2ησθε. δύ3ϲ2ηϲθε. δύ3ϲ2ηϲθε. δυ3σ2αίμην. δυ3σ2αίμην. δυ3ϲ2αίμην. δυ3ϲ2αίμην. δύ3σ2αιο. δύ3σ2αιο. δύ3ϲ2αιο. δύ3ϲ2αιο. δύ3σ2αιτο. δύ3σ2αιτο. δύ3ϲ2αιτο. δύ3ϲ2αιτο. δύ3σ2αισθον. δύ3σ2αισθον. δύ3ϲ2αιϲθον. δύ3ϲ2αιϲθον. δυ3σ2αίσθην. δυ3σ2αίσθην. δυ3ϲ2αίϲθην. δυ3ϲ2αίϲθην. δυ3σ2αίμεθα. δυ3σ2αίμεθα. δυ3ϲ2αίμεθα. δυ3ϲ2αίμεθα. δύ3σ2αισθαι. δύ3σ2αισθαι. δύ3ϲ2αιϲθαι. δύ3ϲ2αιϲθαι. δύ3σ2αιντο. δύ3σ2αιντο. δύ3ϲ2αιντο. δύ3ϲ2αιντο. δυ3σ2άσθω. δυ3σ2άσθω. δυ3ϲ2άϲθω. δυ3ϲ2άϲθω. δύ3σ2ασθον. δύ3σ2ασθον. δύ3ϲ2αϲθον. δύ3ϲ2αϲθον. δυ3σ2άσθων. δυ3σ2άσθων. δυ3ϲ2άϲθων. δυ3ϲ2άϲθων. δύ3σ2ασθε. δύ3σ2ασθε. δύ3ϲ2αϲθε. δύ3ϲ2αϲθε. δύ3σ2ασθαι. δύ3σ2ασθαι. δύ3ϲ2αϲθαι. δύ3ϲ2αϲθαι. δυ3σ2άμεν δυ3σ2άμεν δυ3ϲ2άμεν δυ3ϲ2άμεν δυσ3σ2αμέν δυσ3σ2αμέν δυϲ3ϲ2αμέν δυϲ3ϲ2αμέν δύ3σ2ατο. δύ3σ2ατο. δύ3ϲ2ατο. δύ3ϲ2ατο. δύ3σ2ετο. δύ3σ2ετο. δύ3ϲ2ετο. δύ3ϲ2ετο. δύ3σ2αντο. δύ3σ2αντο. δύ3ϲ2αντο. δύ3ϲ2αντο. δύ3σ2εο. δύ3σ2εο. δύ3ϲ2εο. δύ3ϲ2εο. .δυσεί2σ1β .δυσεί2σ1β .δυϲεί2ϲ1β .δυϲεί2ϲ1β .δυσει2σ1β .δυϲει2ϲ1β .δυσέ2κ1 .δυσέ2κ1 .δυϲέ2κ1 .δυϲέ2κ1 .δυσε2κ1 .δυϲε2κ1 .δυσέ2ξ1 .δυσέ2ξ1 .δυϲέ2ξ1 .δυϲέ2ξ1 .δυσε2ξ1 .δυϲε2ξ1 .δυ3σ2ιθ .δυ3ϲ2ιθ δύ3σ2ις. δύ3σ2ις. δύ3ϲ2ιϲ. δύ3ϲ2ιϲ. δύ3σ2ισ. δύ3σ2ισ. δύ3σ2εω δύ3σ2εω δύ3ϲ2εω δύ3ϲ2εω δύ3σ2ιν. δύ3σ2ιν. δύ3ϲ2ιν. δύ3ϲ2ιν. δύ3σ2ι. δύ3σ2ι. δύ3ϲ2ι. δύ3ϲ2ι. δυ3σ2έοιν. δυ3σ2έοιν. δυ3ϲ2έοιν. δυ3ϲ2έοιν. δύ3σ2εσι. δύ3σ2εσι. δύ3ϲ2εϲι. δύ3ϲ2εϲι. δύ3σ2εσιν. δύ3σ2εσιν. δύ3ϲ2εϲιν. δύ3ϲ2εϲιν. .δύ3σ2κε .δύ3σ2κε .δύ3ϲ2κε .δύ3ϲ2κε .δυ3σ2μή. .δυ3σ2μή. .δυ3ϲ2μή. .δυ3ϲ2μή. .δυ3σ2μὴ. .δυ3ϲ2μὴ. .δυ3σ2μῆς. .δυ3ϲ2μῆϲ. .δυ3σ2μῆσ. .δυ3σ2μῇ .δυ3ϲ2μῇ .δυ3σ2μῆ. .δυ3ϲ2μῆ. .δυ3σ2μᾶ .δυ3ϲ2μᾶ .δυ3σ2μα .δυ3ϲ2μα .δυ3σ2μῶ .δυ3ϲ2μῶ .δυσξύ2ν1 .δυσξύ2ν1 .δυϲξύ2ν1 .δυϲξύ2ν1 .δυσξυ2ν1 .δυϲξυ2ν1 .δύ3σ2ταν .δύ3σ2ταν .δύ3ϲ2ταν .δύ3ϲ2ταν .δυ3σ2τάν .δυ3σ2τάν .δυ3ϲ2τάν .δυ3ϲ2τάν .δυ3σ2την .δυ3ϲ2την .δυ3σ2τήν .δυ3σ2τήν .δυ3ϲ2τήν .δυ3ϲ2τήν ἐδυ2σ1τ ἐδυ2ϲ1τ εἰ2ν1όδ εἰ2ν1όδ εἰ2ν1οδ εἰ2σ1 εἰ2ϲ1 εἴ2σ1 εἴ2ϲ1 εἰ3σ2ί. εἰ3σ2ί. εἰ3ϲ2ί. εἰ3ϲ2ί. εἰ3σ2ὶ. εἰ3ϲ2ὶ. εἰ3σ2ι. εἰ3ϲ2ι. εἰ3σ2ίν. εἰ3σ2ίν. εἰ3ϲ2ίν. εἰ3ϲ2ίν. εἰ3σ2ὶν. εἰ3ϲ2ὶν. εἰ3σ2ιν. εἰ3ϲ2ιν. εἴ3σ2ομ εἴ3ϲ2ομ εἴ3σ2ῃ. εἴ3ϲ2ῃ. εἴσει. εἴϲει. εἴ3σ2εται. εἴ3ϲ2εται. εἴ3σ2εσθον. εἴ3ϲ2εϲθον. εἰ3σ2όμ εἰ3σ2όμ εἰ3ϲ2όμ εἰ3ϲ2όμ εἴ3σ2εσθε. εἴ3ϲ2εϲθε. εἴ3σ2ονται εἴ3ϲ2ονται εἰ3σ2οίμην εἰ3σ2οίμην εἰ3ϲ2οίμην εἰ3ϲ2οίμην εἴ3σ2οιο εἴ3ϲ2οιο εἴ3σ2οιτο εἴ3ϲ2οιτο εἴ3σ2οισθον εἴ3ϲ2οιϲθον εἰ3σ2οίσθην εἰ3σ2οίσθην εἰ3ϲ2οίϲθην εἰ3ϲ2οίϲθην εἰ3σ2οίμεθα εἰ3σ2οίμεθα εἰ3ϲ2οίμεθα εἰ3ϲ2οίμεθα εἴ3σ2οισθε εἴ3ϲ2οιϲθε εἴ3σ2οιντο εἴ3ϲ2οιντο εἴ3σ2εσθαι εἴ3ϲ2εϲθαι εἰ3σ2όμεν εἰ3σ2όμεν εἰ3ϲ2όμεν εἰ3ϲ2όμεν εἰ3σ2ομέν εἰ3σ2ομέν εἰ3ϲ2ομέν εἰ3ϲ2ομέν εἴ3σ2άμην. εἴ3σ2άμην. εἴ3ϲ2άμην. εἴ3ϲ2άμην. εἴ3σ2ω εἴ3ϲ2ω εἴ3σ2ατο εἴ3ϲ2ατο εἴ3σ2ασθον εἴ3ϲ2αϲθον εἰ3σ2άσθην εἰ3σ2άσθην εἰ3ϲ2άϲθην εἰ3ϲ2άϲθην εἰ3σ2άμεθα εἰ3σ2άμεθα εἰ3ϲ2άμεθα εἰ3ϲ2άμεθα εἴ3σ2ασθε εἴ3ϲ2αϲθε εἴ3σ2αντο εἴ3ϲ2αντο εἴ3σ2ωμαι εἴ3ϲ2ωμαι εἴ3σ2ησθον εἴ3ϲ2ηϲθον εἰ3σ2ώμεθα εἰ3σ2ώμεθα εἰ3ϲ2ώμεθα εἰ3ϲ2ώμεθα εἴ3σ2ησθε εἴ3ϲ2ηϲθε εἴ3σ2ωνται εἴ3ϲ2ωνται εἰ3σ2αίμην εἰ3σ2αίμην εἰ3ϲ2αίμην εἰ3ϲ2αίμην εἴ3σ2αιο εἴ3ϲ2αιο εἴ3σ2αιτο εἴ3ϲ2αιτο εἴ3σ2αισθον εἴ3ϲ2αιϲθον εἴ3σ2αίσθην εἴ3σ2αίσθην εἴ3ϲ2αίϲθην εἴ3ϲ2αίϲθην εἰ3σ2αίμεθα εἰ3σ2αίμεθα εἰ3ϲ2αίμεθα εἰ3ϲ2αίμεθα εἴ3σ2αισθε εἴ3ϲ2αιϲθε εἴ3σ2αιντο εἴ3ϲ2αιντο εἰ3σ2άσθω εἰ3σ2άσθω εἰ3ϲ2άϲθω εἰ3ϲ2άϲθω εἰ3σ2άσθων εἰ3σ2άσθων εἰ3ϲ2άϲθων εἰ3ϲ2άϲθων εἴ3σ2ασθαι εἴ3ϲ2αϲθαι εἰ3σ2άμεν εἰ3σ2άμεν εἰ3ϲ2άμεν εἰ3ϲ2άμεν εἰ3σ2αμέν εἰ3σ2αμέν εἰ3ϲ2αμέν εἰ3ϲ2αμέν ἐ2κ1λ ἐ3κ2λήθη ἐ3κ2λήθη ἐ3κ2λάζ ἐ3κ2λάζ ἐ3κ2λάγ ἐ3κ2λάγ ἐ3κ2λάο ἐ3κ2λάο ἐ3κ2λάσ ἐ3κ2λάσ ἐ3κ2λάϲ ἐ3κ2λάϲ ἐ3κ2λαί ἐ3κ2λαί ἐ3κ2λαύ ἐ3κ2λαύ ἐ3κ2λεί ἐ3κ2λεί ἐ4κ3λείπ ἐ4κ3λείπ ἐ4κ3λείψ ἐ4κ3λείψ ἐ3κ2λῄ ἐ3κ2κλέπ ἐ3κ2κλέπ ἐ3κ2κλέψ ἐ3κ2κλέψ ἐ3κ2λάπ ἐ3κ2λάπ ἐ3κ2λαπ ἐ4κ3λάπτ ἐ4κ3λάπτ ἐ4κ3λαπτ ἐ3κ2λέφ ἐ3κ2λέφ ἐ3κ2λεφ ἐ3κ2λήρ ἐ3κ2λήρ ἐ3κ2ληρ ἐ3κ2λίν ἐ3κ2λίν ἐ3κ2λιν ἐ3κ2λύ ἐ3κ2λύ ἐ4κ3λύσεω ἐ4κ3λύσεω ἐ4κ3λύϲεω ἐ4κ3λύϲεω ἐ4κ3λύσει ἐ4κ3λύσει ἐ4κ3λύϲει ἐ4κ3λύϲει ἐ4κ3λύσεοι ἐ4κ3λύσεοι ἐ4κ3λύϲεοι ἐ4κ3λύϲεοι ἐ4κ3λύσεσι ἐ4κ3λύσεσι ἐ4κ3λύϲεϲι ἐ4κ3λύϲεϲι ἐ3κ2λόμ ἐ3κ2λόμ ἐ3κ2κλώσ ἐ3κ2κλώσ ἐ3κ2κλώϲ ἐ3κ2κλώϲ ἔ2κ1λει ἔ3κ2λεισ ἔ3κ2λειϲ ἔ2κ1λυσ ἔ2κ1λυϲ ἐ2κ1μ ἔ2κ1μ ἐ2κ1ν ἔ2κ1ν ἔ3κ2ναι ἐ3κ2ναί ἐ3κ2ναί ἔ3κ2νησ ἔ3κ2νηϲ ἐ3κ2νήσ ἐ3κ2νήσ ἐ3κ2νήϲ ἐ3κ2νήϲ ἐ3κ2νυ ἐ2κ1ρ ἔ2κ1ρ ἐ3κ2ράδ ἐ3κ2ράδ ἐ3κ2ραδ ἔ3κ2ραζ ἐ3κ2ράζ ἐ3κ2ράζ ἔ3κ2ραγ ἐ3κ2ράγ ἐ3κ2ράγ ἐ3κ2ράτ ἐ3κ2ράτ ἐ3κ2ρατ ἐ3κ2ραύγ ἐ3κ2ραύγ ἐ3κ2ραυγ ἔ3κ2ραι ἐ3κ2ραί ἐ3κ2ραί ἔ3κ2ραν ἐ3κ2ράν ἐ3κ2ράν ἐ3κ2ρήη ἐ3κ2ρήη ἐ3κ2ράα ἐ3κ2ράα ἐ3κ2ραά ἐ3κ2ραά ἐ3κ2ράθ ἐ3κ2ράθ ἐ3κ2ραθ ἔ3κ2ρεκ ἐ3κ2ρέκ ἐ3κ2ρέκ ἔ3κ2ρεξ ἐ3κ2ρέξ ἐ3κ2ρέξ ἐ3κ2ρέμ ἐ3κ2ρέμ ἐ3κ2ρεμ ἐ3κ2ρήμ ἐ3κ2ρήμ ἐ3κ2ρημ ἔ3κ2ριν ἐ3κ2ρίν ἐ3κ2ρίν ἐ3κ2ρίθ ἐ3κ2ρίθ ἐ3κ2ρότ ἐ3κ2ρότ ἐ3κ2ροτ ἔ3κ2ρου ἐ3κ2ρού ἐ3κ2ρού ἔ3κ2ρυπ ἐ3κ2ρύπ ἐ3κ2ρύπ ἔ3κ2ρυψ ἐ3κ2ρύψ ἐ3κ2ρύψ ἐ3κ2ρύβ ἐ3κ2ρύβ ἐ3κ2ρύφ ἐ3κ2ρύφ ἐ3κ2ρυσ ἐ3κ2ρυϲ ἔ3κ2ρωζ ἐ3κ2ρώζ ἐ3κ2ρώζ ἔ3κ2ρωξ ἐ3κ2ρώξ ἐ3κ2ρώξ ἐ2κ1ταθ ἔ2κ1ταμε. ἐ2κ1τάμν ἐ2κ1τάμν ἐ2κ1ταν ἐ2κ1ταρ ἐ2κ1τάσ ἐ2κ1τάσ ἐ2κ1τάϲ ἐ2κ1τάϲ ἐ2κ1τε ἐ2κ1τέ ἐ2κ1τέ ἐ3κ2τείν ἐ3κ2τείν ἐ2κ1τήκ ἐ2κ1τήκ ἐ2κ1τι ἔ2κ1τι ἐ2κ1τί ἐ2κ1τί ἔ3κ2τιζ ἐ3κ2τίζ ἐ3κ2τίζ ἔ3κ2τισα ἔ3κ2τιϲα ἐ3κ2τίσα ἐ3κ2τίσα ἐ3κ2τίϲα ἐ3κ2τίϲα ἐ2κ1τό ἐ2κ1τό ἐ2κ1το ἔ2κ1το ἐ3κ2τός. ἐ3κ2τός. ἐ3κ2τόϲ. ἐ3κ2τόϲ. ἐ3κ2τὸς. ἐ3κ2τὸϲ. ἐ3κ2τόσ. ἐ3κ2τόσ. ἐ3κ2τὸσ. ἐ2κ1τρ ἔ2κ1τυπο ἐ2κ1τύπου. ἐ2κ1τύπου. ἐ2κ1τύπῳ. ἐ2κ1τύπῳ. ἔ2κ1τυπε. ἐ2κ1τύπω. ἐ2κ1τύπω. ἐ2κτύποι. ἐ2κτύποι. ἐ2κ1τύπων. ἐ2κ1τύπων. ἐ2κ1τύποις. ἐ2κ1τύποις. ἐ2κ1τύποιϲ. ἐ2κ1τύποιϲ. ἐ2κ1τύποισ. ἐ2κ1τύποισ. ἐ2κ1τύπους. ἐ2κ1τύπους. ἐ2κ1τύπουϲ. ἐ2κ1τύπουϲ. ἐ2κ1τύπουσ. ἐ2κ1τύπουσ. ἔ2κ1τυπα. ἐ2κ1τυ ἑλλή2σ1π ἑλλή2σ1π ἑλλή2ϲ1π ἑλλή2ϲ1π ἑλλη2σ1π ἑλλη2ϲ1π ἐ2ν1 ἔ2ν1 ἐ3ν2άκις ἐ3ν2άκις ἐ3ν2άκιϲ ἐ3ν2άκιϲ ἐ3ν2ακισ ἐ3ν2ακιϲ ἐ3ν2ακόσ ἐ3ν2ακόσ ἐ3ν2ακόϲ ἐ3ν2ακόϲ ἐ3ν2ακοσ ἐ3ν2ακοϲ ἔ3ν2αρα. ἐ3ν2άρων. ἐ3ν2άρων. ἐ3ν2άροις. ἐ3ν2άροις. ἐ3ν2άροιϲ. ἐ3ν2άροιϲ. ἐ3ν2άροισ. ἐ3ν2άροισ. ἐ3ν2αρηφ ἐ4ν3αραρ ἐ3ν2άρεε ἐ3ν2άρεε ἐ3ν2αρέω ἐ3ν2αρέω ἐ3ν2αρέα ἐ3ν2αρέα ἐ3ν2αρεά ἐ3ν2αρεά ἐ3ν2άριε ἐ3ν2άριε ἐ3ν2αρίω ἐ3ν2αρίω ἐ3ν2αρία ἐ3ν2αρία ἐ3ν2αριά ἐ3ν2αριά ἔ3ν2ασσ ἔ3ν2αϲϲ ἐ3ν2άσσ ἐ3ν2άσσ ἐ3ν2άϲϲ ἐ3ν2άϲϲ ἐ3ν2άσθ ἐ3ν2άσθ ἐ3ν2άϲθ ἐ3ν2άϲθ ἐ3ν2ασθ ἐ3ν2αϲθ ἔ3ν2ατ ἐ3ν2άτ ἐ3ν2άτ ἐνδυ2σ1τ ἐνδυ2ϲ1τ ἐ3ν2έγκ ἐ3ν2έγκ ἐ3ν2εγκ ἔ3ν2εικ ἐ3ν2εῖκ ἐ3ν2εικ ἐ3ν2είκ ἐ3ν2είκ ἔ3ν2ειμ ἐ3ν2είμ ἐ3ν2είμ ἐ3ν2εμέσσ ἐ3ν2εμέσσ ἐ3ν2εμέϲϲ ἐ3ν2εμέϲϲ ἐ3ν2εμήθ ἐ3ν2εμήθ ἐ3ν2ενή ἐ3ν2ενή ἐ3ν2εό ἐ3ν2εό ἐ3ν2εὸ ἐ3ν2εο ἐ3ν2εῶ ἐ3ν2εά ἐ3ν2εά ἐ3ν2εὰ ἐ3ν2εᾶ ἐ3ν2έπει ἐ3ν2έπει ἔ3ν2ερθε ἔ3ν2ευσ ἔ3ν2ευϲ ἐ3ν2εύσ ἐ3ν2εύσ ἐ3ν2εύϲ ἐ3ν2εύϲ ἐ3ν2έχθ ἐ3ν2έχθ ἐ3ν2εχθ ἔ3ν2ησ ἔ3ν2ηϲ ἐ3ν2ήσ ἐ3ν2ήσ ἐ3ν2ήϲ ἐ3ν2ήϲ ἐ3ν2ηή ἐ3ν2ηή ἐ3ν2ηὴ ἔ3ν2ην. ἐ3ν2ηεί ἐ3ν2ηεί ἐ3ν2ηο ἐ3ν2ηῶ ἐ3νηέ ἐ3νηέ ἐ3ν2ήνο ἐ3ν2ήνο ἐ3ν2ί ἐ3ν2ί ἐ3ν2ι ἔ3ν2ι ἐ4ν3ιαύ ἐ4ν3ιαύ ἐ5ν4ιαύσ ἐ5ν4ιαύσ ἐ5ν4ιαύϲ ἐ5ν4ιαύϲ ἐ5ν4ιαυσ ἐ5ν4ιαυϲ ἐ4ν3ιδρ ἐ4ν3ίδρ ἐ4ν3ίδρ ἐ4ν3ίζ ἐ4ν3ίζ ἐ4ν3ίη ἐ4ν3ίη ἐ4ν3ιέτον. ἐ4ν3ιέτον. ἐ4ν3ίεμεν. ἐ4ν3ίεμεν. ἐ4ν3ίω. ἐ4ν3ίω. ἐ4ν3ιππ ἐ4ν3ίππ ἐ4ν3ίππ ἐ4ν3ίπτ ἐ4ν3ίπτ ἐ4ν3ίψ ἐ4ν3ίψ ἐ4ν3ίσσ ἐ4ν3ίσσ ἐ4ν3ίϲϲ ἐ4ν3ίϲϲ ἐ4ν3ίστ ἐ4ν3ίστ ἐ4ν3ίϲτ ἐ4ν3ίϲτ ἐ4ν3ιστ ἐ4ν3ιϲτ ἐ4ν3ισχ ἐ4ν3ιϲχ ἐ4ν3ίσχ ἐ4ν3ίσχ ἐ4ν3ίϲχ ἐ4ν3ίϲχ ἔ3ν2ος. ἔ3ν2οϲ. ἔ3ν2οσ. ἔ3ν2ου. ἔ3ν2ον. ἔ3ν2ω ἔ3ν2οι. ἔ3ν2οις. ἔ3ν2οιϲ. ἔ3ν2οισ. ἔ3ν2ης. ἔ3ν2ηϲ. ἔ3ν2ησ. ἔ3ν2ῃ. ἔ3ν2η. ἔ3ν2οσι ἔ3ν2οϲι ἐ3ν2όσε ἐ3ν2όσε ἐ3ν2όϲε ἐ3ν2όϲε ἐ3ν2υάλ ἐ3ν2υάλ ἐ3ν2υαλ ἔ3ν2υξ ἐ3ν2υξ ἐ3ν2ύξ ἐ3ν2ύξ ἐ3ν2ύσ ἐ3ν2ύσ ἐ3ν2ύϲ ἐ3ν2ύϲ ἐ3ν2υσ ἐ3ν2υϲ ἐ3ν2υώ ἐ3ν2υώ ἐ3ν2υὼ ἐ3ν2υόο ἐ3ν2υόο ἐ3ν2υοῦς ἐ3ν2υοῦϲ ἐ2ξ1 ἔ2ξ1 ἐ3ξ2ήρ ἐ3ξ2ήρ ἐ3ξ2ηρ ἐ3ξ2υ2ν1 ἐ3ξ2υρ ἐ3ξ2ύρ ἐ3ξ2ύρ ἔ3ξ2υσ ἔ3ξ2υϲ ἔ3ξ2ω. ἑ2ξ1ήρετμ ἑ2ξ1ήρετμ ἑ2ξ1ηρέτμ ἑ2ξ1ηρέτμ ἐπεί2σ1 ἐπεί2σ1 ἐπεί2ϲ1 ἐπεί2ϲ1 ἐπει2σ1 ἐπει2ϲ1 ἐπεί3σ2ατον. ἐπεί3σ2ατον. ἐπεί3ϲ2ατον. ἐπεί3ϲ2ατον. ἐπει3σ2άτην. ἐπει3σ2άτην. ἐπει3ϲ2άτην. ἐπει3ϲ2άτην. ἐπεί3σ2αμεν. ἐπεί3σ2αμεν. ἐπεί3ϲ2αμεν. ἐπεί3ϲ2αμεν. ἐπεί3σ2ατε ἐπεί3σ2ατε ἐπεί3ϲ2ατε ἐπεί3ϲ2ατε ἐπει3σ2άμην. ἐπει3σ2άμην. ἐπει3ϲ2άμην. ἐπει3ϲ2άμην. ἐπεί3σ2ω. ἐπεί3σ2ω. ἐπεί3ϲ2ω. ἐπεί3ϲ2ω. ἐπεί3σ2ατο ἐπεί3σ2ατο ἐπεί3ϲ2ατο ἐπεί3ϲ2ατο ἐπεί3σ2ασθον. ἐπεί3σ2ασθον. ἐπεί3ϲ2αϲθον. ἐπεί3ϲ2αϲθον. ἐπει3σ2άμεθα. ἐπει3σ2άμεθα. ἐπει3ϲ2άμεθα. ἐπει3ϲ2άμεθα. ἐπεί3σ2ασθε. ἐπεί3σ2ασθε. ἐπεί3ϲ2αϲθε. ἐπεί3ϲ2αϲθε. ἐπεί3σ2αντο. ἐπεί3σ2αντο. ἐπεί3ϲ2αντο. ἐπεί3ϲ2αντο. ἐπεί3σ2θ ἐπεί3σ2θ ἐπεί3ϲ2θ ἐπεί3ϲ2θ ἐπει3σ2θ ἐπει3ϲ2θ ἐπε2κ1τεί ἐπε2κ1τεί ἐπέ2κ1τει ἐπέ2κ1τει ἐπε2κ1τρ ἐπέ2κ1τρ ἐπέ2κ1τρ ἐπε2ξ1 ἐπε2σ1β ἐπε2ϲ1β ἐπιπρό2σ1θ ἐπιπρό2σ1θ ἐπιπρό2ϲ1θ ἐπιπρό2ϲ1θ ἐπιπρο2σ1θ ἐπιπρο2ϲ1θ ἐπισυ2ν1 ἐπιϲυ2ν1 ἐ2σ1 ἐ2ϲ1 ἐ3σ2άω ἐ3σ2άω ἐ3ϲ2άω ἐ3ϲ2άω ἐ3σ2ημ ἐ3ϲ2ημ ἐ3σ2θ ἐ3ϲ2θ ἐ4σ3θέσ ἐ4σ3θέσ ἐ4ϲ3θέϲ ἐ4ϲ3θέϲ ἐ3σ2ιγ ἐ3ϲ2ιγ ἐ3σ2κ ἐ3ϲ2κ ἐ4σ3κά ἐ4σ3κά ἐ4ϲ3κά ἐ4ϲ3κά ἐ4σ3κα ἐ4ϲ3κα ἐ3σ2μὲν. ἐ3ϲ2μὲν. ἐ3σ2μέν. ἐ3σ2μέν. ἐ3ϲ2μέν. ἐ3ϲ2μέν. ἐ3σ2τ ἐ3ϲ2τ ἐ3σ2όμεθα ἐ3σ2όμεθα ἐ3ϲ2όμεθα ἐ3ϲ2όμεθα ἐ3σ2οίμην ἐ3σ2οίμην ἐ3ϲ2οίμην ἐ3ϲ2οίμην ἐ3σ2όμ ἐ3σ2όμ ἐ3ϲ2όμ ἐ3ϲ2όμ ἐ3σ2ομ ἐ3ϲ2ομ ἐ3σ2οῦ ἐ3ϲ2οῦ ἐ3σ2ού ἐ3σ2ού ἐ3ϲ2ού ἐ3ϲ2ού ἐ3σ2ου ἐ3ϲ2ου ἐ3σ2υ ἐ3ϲ2υ ἐ3σ2ύ ἐ3σ2ύ ἐ3ϲ2ύ ἐ3ϲ2ύ ἐσύ2ν1 ἐσύ2ν1 ἐϲύ2ν1 ἐϲύ2ν1 ἐσυ2ν1 ἐϲυ2ν1 ἐ3σ2χ ἐ3ϲ2χ ἐ4σ3χέ ἐ4σ3χέ ἐ4ϲ3χέ ἐ4ϲ3χέ ἐ3σ2ώ ἐ3σ2ώ ἐ3ϲ2ώ ἐ3ϲ2ώ ἐ3σ2ω ἐ3ϲ2ω ἔ2σ1οπ ἔ2ϲ1οπ εὐε2ξ1 εὐε3ξ2ί εὐε3ξ2ί εὐε3ξ2ι εὐπρό2σ1 εὐπρό2σ1 εὐπρό2ϲ1 εὐπρό2ϲ1 εὐπρο2σ1 εὐπρο2ϲ1 εὐσύ2ν1 εὐσύ2ν1 εὐϲύ2ν1 εὐϲύ2ν1 εὐσυ2ν1 εὐϲυ2ν1 εὐξύ2ν1 εὐξύ2ν1 εὐξυ2ν1 ἐω2σ1φ ἐω2ϲ1φ ἤ2ν1οψ. ἤ2ν1οπ ἠ2ν1όπ ἠ2ν1όπ .θεμι2σ1κρ .θεμι2ϲ1κρ .θεό2σ1δ .θεό2σ1δ .θεό2ϲ1δ .θεό2ϲ1δ .θεο2σ1δ .θεο2ϲ1δ .θεοι2σ1εχθρ .θεοι2ϲ1εχθρ .θη2ρ1αγρ .θυο2σ1κ .θυο2ϲ1κ .καθυπε2ρ1 .καλω2σ1ορ .καλω2ϲ1ορ .καλω2σ1όρ .καλω2σ1όρ .καλω2ϲ1όρ .καλω2ϲ1όρ .κα2ν1είς. .κα2ν1είς. .κα2ν1είϲ. .κα2ν1είϲ. .κα2ν1εὶς. .κα2ν1εὶϲ. .κα2ν1είσ. .κα2ν1είσ. .κα2ν1εὶσ. .κα2ν1εν .κα2ν1έν .κα2ν1έν .καταδυ2σ1ωπ .καταδυ2ϲ1ωπ .κατεδυ2σ1ώπ .κατεδυ2σ1ώπ .κατεδυ2ϲ1ώπ .κατεδυ2ϲ1ώπ .κατει2σ1 .κατει2ϲ1 .κατε2ν1αί .κατε2ν1αί .κατε2ν1ή .κατε2ν1ή .κατε2ξ1α2ν1ί .κατε2ξ1α2ν1ί .κατε2ξ1α2ν1έσ .κατε2ξ1α2ν1έσ .κατε2ξ1α2ν1έϲ .κατε2ξ1α2ν1έϲ .κερα2σ1φ .κερα2ϲ1φ .κρά2σ1π .κρά2σ1π .κρά2ϲ1π .κρά2ϲ1π .κρα2σ1π .κρα2ϲ1π .κυνό2σ1α .κυνό2σ1α .κυνό2ϲ1α .κυνό2ϲ1α .κυνό2σ1β .κυνό2σ1β .κυνό2ϲ1β .κυνό2ϲ1β .κυνο2σ1β .κυνο2ϲ1β .κυνό2σ1ο .κυνό2σ1ο .κυνό2ϲ1ο .κυνό2ϲ1ο .κυνο2σ1ο .κυνο2ϲ1ο .κυνο2σ1φ .κυνο2ϲ1φ .μελα2ν1άγ .μελα2ν1άγ .μελα2ν1αγ .μελα2ν1άε .μελα2ν1άε .μελα2ν1αέ .μελα2ν1αέ .μελα2ν1αθ .μελα2ν1αιγ .μελα2ν1αυγ .μελα2ν1είμ .μελα2ν1είμ .μελα2ν1εῖμ .μελά2ν1ιππ .μελά2ν1ιππ .μελα2ν1ίππ .μελα2ν1ίππ .μελα2ν1όμμ .μελα2ν1όμμ .μελα2ν1ομμ .μελά2ν1οσσ .μελά2ν1οσσ .μελά2ν1οϲϲ .μελά2ν1οϲϲ .μελα2ν1όσσ .μελα2ν1όσσ .μελα2ν1όϲϲ .μελα2ν1όϲϲ .μελά2ν1οστ .μελά2ν1οστ .μελά2ν1οϲτ .μελά2ν1οϲτ .μελα2ν1όστ .μελα2ν1όστ .μελα2ν1όϲτ .μελα2ν1όϲτ .μελά2ν1ουρ .μελά2ν1ουρ .μελα2ν1ούρ .μελα2ν1ούρ .μελα2ν1ουρ .μελά2ν1υ .μελά2ν1υ .μελα2ν1ύ .μελα2ν1ύ .μετε2ξ1α .μετε2ξ1έ .μετε2ξ1έ .μετε2ξ1ε .μογι2σ1 .μογι2ϲ1 .μογο2σ1τ .μογο2ϲ1τ .μυ2σ1π .μυ2ϲ1π .μυ2σ1επ .μυ2ϲ1επ .νεώ2σ1οικ .νεώ2σ1οικ .νεώ2ϲ1οικ .νεώ2ϲ1οικ .νεω2σ1οίκ .νεω2σ1οίκ .νεω2ϲ1οίκ .νεω2ϲ1οίκ .νου2ν1ε .ξυ2ν1αγ .ξυ2ν1ε .ξυ2ν1έ .ξυ2ν1έ .ξύ2ν1ε .ξύ2ν1ε .ξυ3ν2εώ .ξυ3ν2εώ .ξυ3ν2εῶ .ξυ2ν1ῆκ .ξύ2ν1ι .ξύ2ν1ι .ξυ2ν1ί .ξυ2ν1ί οἱο2ν1εί. οἱο2ν1εί. οἱο2ν1εὶ. οἱό2σ1 οἱό2σ1 οἱό2ϲ1 οἱό2ϲ1 οἰ2σ1πώτ οἰ2σ1πώτ οἰ2ϲ1πώτ οἰ2ϲ1πώτ οἰ2σ1πωτ οἰ2ϲ1πωτ ὁλο2ν1έν. ὁλο2ν1έν. ὁλο2ν1ὲν. ὁπω2σ1 ὁπω2ϲ1 ὅ2σ1γε. ὅ2ϲ1γε. ὁσο2ν1ῶν. ὁϲο2ν1ῶν. ὅ2σ1περ. ὅ2ϲ1περ. ὅ2σ1τις ὅ2ϲ1τιϲ οἷ2σ1τισι οἷ2ϲ1τιϲι οὕ2σ1τινας οὕ2ϲ1τιναϲ ἧ2σ1τινος ἧ2ϲ1τινοϲ αἷ2σ1τισι αἷ2ϲ1τιϲι ἅ2σ1τινας ἅ2ϲ1τιναϲ ὁ2σ1τι2σ1οῦν. ὁ2ϲ1τι2ϲ1οῦν. ἡτι2σ1οῦν. ἡτι2ϲ1οῦν. ὁποιου2σ1τινα2σ1οῦν. ὁποιου2ϲ1τινα2ϲ1οῦν. οὐδενό2σ1ω οὐδενό2σ1ω οὐδενό2ϲ1ω οὐδενό2ϲ1ω οὐδενο2σ1ώ οὐδενο2σ1ώ οὐδενο2ϲ1ώ οὐδενο2ϲ1ώ .παλι2ν1 .παλί2ν1 .παλί2ν1 .πα2ν1 .πά2ν1 .πά2ν1 .πα3ν2ός. .πα3ν2ός. .πα3ν2όϲ. .πα3ν2όϲ. .πα3ν2ὸς. .πα3ν2ὸϲ. .πα3ν2όσ. .πα3ν2όσ. .πα3ν2ὸσ. .πα3ν2ί. .πα3ν2ί. .πα3ν2ὶ. .πάνα. .πάνα. .πα3ν2ῶν. .πα3ν2ικ .πα3ν2ίσδ .πα3ν2ίσδ .πα3ν2ίϲδ .πα3ν2ίϲδ .πα3ν2ισδ .πα3ν2ιϲδ .πα3ν2οῦ. .πα3ν2ῷ. .πα3ν2ό. .πα3ν2ό. .πα3ν2ὸ. .πα3ν2όν. .πα3ν2όν. .πα3ν2ὸν. .πα3ν2έ. .πα3ν2έ. .πα3ν2ὲ. .πα3ν2οί. .πα3ν2οί. .πα3ν2οὶ. .πα3ν2οῖς. .πα3ν2οῖϲ. .πα3ν2οῖσ. .πα3ν2ούς. .πα3ν2ούς. .πα3ν2ούϲ. .πα3ν2ούϲ. .πα3ν2οὺς. .πα3ν2οὺϲ. .πα3ν2ούσ. .πα3ν2ούσ. .πα3ν2οὺσ. .παρα2ν1ίσχ .παρα2ν1ίσχ .παρα2ν1ίϲχ .παρα2ν1ίϲχ .παρεί2σ1 .παρεί2σ1 .παρεί2ϲ1 .παρεί2ϲ1 .παρει2σ1 .παρει2ϲ1 .παρε2κ1λ .παρε2κ1τρ .παρε2ν1εῖ .παρε2ν1ο .παρε2ξ1 .παρέ2ξ1 .παρέ2ξ1 παρέ3ξ2ω. παρέ3ξ2ω. παρέ3ξ2εις. παρέ3ξ2εις. παρέ3ξ2ειϲ. παρέ3ξ2ειϲ. παρέ3ξ2εισ. παρέ3ξ2εισ. παρέ3ξ2ει. παρέ3ξ2ει. παρέ3ξ2ετον. παρέ3ξ2ετον. παρε3ξ2έτην. παρε3ξ2έτην. παρέ3ξ2ομεν. παρέ3ξ2ομεν. παρέ3ξ2ετε. παρέ3ξ2ετε. παρέ3ξ2ουσι. παρέ3ξ2ουσι. παρέ3ξ2ουϲι. παρέ3ξ2ουϲι. παρέ3ξ2ομαι παρέ3ξ2ομαι παρέ3ξ2ῃ παρέ3ξ2ῃ παρέ3ξ2εται. παρέ3ξ2εται. παρέ3ξ2εσθον. παρέ3ξ2εσθον. παρέ3ξ2εϲθον. παρέ3ξ2εϲθον. παρε3ξ2όμεθα. παρε3ξ2όμεθα. παρέ3ξ2εσθε. παρέ3ξ2εσθε. παρέ3ξ2εϲθε. παρέ3ξ2εϲθε. παρέ3ξ2ονται. παρέ3ξ2ονται. .πλεο2ν1έ .πλεο2ν1έ .πλεο2ν1ε .προει2σ1 .προει2ϲ1 .προε2κ1 .προε2ν1 .προε2ξ1 .προέ2ξ1 .προέ2ξ1 .προ2σ1 .προ2ϲ1 .προ3σ2άβ .προ3σ2άβ .προ3ϲ2άβ .προ3ϲ2άβ .προ3σ2αβ .προ3ϲ2αβ .προσει2σ1 .προϲει2ϲ1 .προ3σ2εί .προ3σ2εί .προ3ϲ2εί .προ3ϲ2εί .προ3σ2έσει .προ3σ2έσει .προ3ϲ2έϲει .προ3ϲ2έϲει .προ3σ2εσεί .προ3σ2εσεί .προ3ϲ2εϲεί .προ3ϲ2εϲεί .προσε2ν1 .προϲε2ν1 .προσε2ξ1 .προϲε2ξ1 .πρό3σ2θι .πρό3σ2θι .πρό3ϲ2θι .πρό3ϲ2θι .προ3σ2θί .προ3σ2θί .προ3ϲ2θί .προ3ϲ2θί .προ4σ3θιγ .προ4ϲ3θιγ .πρό3σ2κοπ .πρό3σ2κοπ .πρό3ϲ2κοπ .πρό3ϲ2κοπ .προ3σ2κόπ .προ3σ2κόπ .προ3ϲ2κόπ .προ3ϲ2κόπ .προ3σ2τασ .προ3ϲ2ταϲ .προ3σ2τάτ .προ3σ2τάτ .προ3ϲ2τάτ .προ3ϲ2τάτ .προ3σ2τατ .προ3ϲ2τατ .προ3σ2ταυ .προ3ϲ2ταυ .προ3σ2τεί .προ3σ2τεί .προ3ϲ2τεί .προ3ϲ2τεί .προ3σ2τεν .προ3ϲ2τεν .προ3σ2τέν .προ3σ2τέν .προ3ϲ2τέν .προ3ϲ2τέν .προ3σ2τερν .προ3ϲ2τερν .πρό3σ2τερν .πρό3σ2τερν .πρό3ϲ2τερν .πρό3ϲ2τερν .προ3σ2τέρν .προ3σ2τέρν .προ3ϲ2τέρν .προ3ϲ2τέρν .προ3σ2τήσ .προ3σ2τήσ .προ3ϲ2τήϲ .προ3ϲ2τήϲ .προ3σ2τόμ .προ3σ2τόμ .προ3ϲ2τόμ .προ3ϲ2τόμ .προ3σ2τομ .προ3ϲ2τομ .πρό3σ2τῳ .πρό3σ2τῳ .πρό3ϲ2τῳ .πρό3ϲ2τῳ .προ3σ2τῴ .προ3ϲ2τῴ .προ3σ2υγ .προ3ϲ2υγ .προ3σ2υμ .προ3ϲ2υμ .προ3σ2υ2ν1 .προ3ϲ2υ2ν1 .πρό3σ2φαγμ .πρό3σ2φαγμ .πρό3ϲ2φαγμ .πρό3ϲ2φαγμ .προ3σ2φάγμ .προ3σ2φάγμ .προ3ϲ2φάγμ .προ3ϲ2φάγμ .προ3σ2φάζ .προ3σ2φάζ .προ3ϲ2φάζ .προ3ϲ2φάζ .προ3σ2φάττ .προ3σ2φάττ .προ3ϲ2φάττ .προ3ϲ2φάττ .πρό3σ2χημ .πρό3σ2χημ .πρό3ϲ2χημ .πρό3ϲ2χημ .προ3σ2χήμ .προ3σ2χήμ .προ3ϲ2χήμ .προ3ϲ2χήμ .πρό3σ2ω. .πρό3σ2ω. .πρό3ϲ2ω. .πρό3ϲ2ω. .πρό3σ2ωθεν. .πρό3σ2ωθεν. .πρό3ϲ2ωθεν. .πρό3ϲ2ωθεν. .προ3σ2ώτ .προ3σ2ώτ .προ3ϲ2ώτ .προ3ϲ2ώτ .προ3σ2ωτ .προ3ϲ2ωτ .προϋπε2ξ1 .πυ2ρ1άγ .πυ2ρ1άγ .πυ2ρ1αγ .πυ2ρ1αίθ .πυ2ρ1αίθ .πυ2ρ1αιθ .πυ2ρ1ῆθ .πυ2ρ1ηθ .πυ2ρ1ήθ .πυ2ρ1ήθ .πυ2ρ1ακ .πύ2ρ1αυ .πύ2ρ1αυ .πυ2ρ1αύ .πυ2ρ1αύ .πυ2ρ1αυ .πυ2ρ1ήνεμ .πυ2ρ1ήνεμ .πυ2ρ1ηνέμ .πυ2ρ1ηνέμ .πυ2ρ1ωπ .σελα2σ1φό .σελα2σ1φό .ϲελα2ϲ1φό .ϲελα2ϲ1φό .σελα2σ1φο .ϲελα2ϲ1φο .συμπαρει2σ1 .ϲυμπαρει2ϲ1 .συ2ν1 .ϲυ2ν1 .σύ2ν1 .σύ2ν1 .ϲύ2ν1 .ϲύ2ν1 .συνδιέ2ξ1 .συνδιέ2ξ1 .ϲυνδιέ2ξ1 .ϲυνδιέ2ξ1 .συνδιε2ξ1 .ϲυνδιε2ξ1 .συνδυ2σ1 .ϲυνδυ2ϲ1 .συνε2ξ1 .ϲυνε2ξ1 .τεσσαρε2σ1κ .τεϲϲαρε2ϲ1κ .τρει2σ1κ .τρει2ϲ1κ .τρι2σ1 .τρι2ϲ1 .τρι3σ2μό .τρι3σ2μό .τρι3ϲ2μό .τρι3ϲ2μό .τρι3σ2μο .τρι3ϲ2μο .τρι3σ2μῶ .τρι3ϲ2μῶ .τρι3σ2π .τρι3ϲ2π .τρί3σ2τ .τρί3σ2τ .τρί3ϲ2τ .τρί3ϲ2τ .τρι3σ2τ .τρι3ϲ2τ .τρι3σ2ώ .τρι3σ2ώ .τρι3ϲ2ώ .τρι3ϲ2ώ .τρι3σ2ω .τρι3ϲ2ω ὑο2σ1κ ὑο2ϲ1κ ὑπεί2σ1 ὑπεί2σ1 ὑπεί2ϲ1 ὑπεί2ϲ1 ὑπει2σ1 ὑπει2ϲ1 ὑπεί3σ2ας ὑπεί3σ2ας ὑπεί3ϲ2αϲ ὑπεί3ϲ2αϲ ὑπεί3σ2ασ ὑπεί3σ2ασ ὑπεί3σ2αν ὑπεί3σ2αν ὑπεί3ϲ2αν ὑπεί3ϲ2αν ὑπει3σ2άν ὑπει3σ2άν ὑπει3ϲ2άν ὑπει3ϲ2άν ὑπει3σ2άσ ὑπει3σ2άσ ὑπει3ϲ2άϲ ὑπει3ϲ2άϲ ὑπε2κ1λαμ ὑπε2κ1λήψ ὑπε2κ1λήψ ὑπε2κ1τ ὑπε2ν1 ὑπε2ξ1 ὑπε2ρ1 ὑπέ2ρ1 ὑπέ2ρ1 ὑπέ3ρ2α. ὑπέ3ρ2α. ὑπέ3ρ2ης. ὑπέ3ρ2ης. ὑπέ3ρ2ηϲ. ὑπέ3ρ2ηϲ. ὑπέ3ρ2ησ. ὑπέ3ρ2ησ. ὑπέ3ρ2ᾳ. ὑπέ3ρ2ᾳ. ὑπέ3ρ2αν. ὑπέ3ρ2αν. ὑπέ3ρ2αι. ὑπέ3ρ2αι. ὑπε3ρ2ῶν. ὑπέ3ρ2αις. ὑπέ3ρ2αις. ὑπέ3ρ2αιϲ. ὑπέ3ρ2αιϲ. ὑπέ3ρ2αισ. ὑπέ3ρ2αισ. ὑπέ3ρ2ας. ὑπέ3ρ2ας. ὑπέ3ρ2αϲ. ὑπέ3ρ2αϲ. ὑπέ3ρ2ασ. ὑπέ3ρ2ασ. ὑπε3ρ2εθ ὑπε3ρ2έθ ὑπε3ρ2έθ ὑπε3ρ2εί ὑπε3ρ2εί ὑπέ3ρ2υθ ὑπέ3ρ2υθ ὑπε3ρ2ύθ ὑπε3ρ2ύθ ὑπε3ρ2υθ ὑπερε2κ1τε ὑπερε2κ1τί ὑπερε2κ1τί ὑπε3ρ2έπτ ὑπε3ρ2έπτ ὑπε3ρ2επτ ὑπε3ρ2έψ ὑπε3ρ2έψ ὑπε3ρ2εψ ὑπε3ρ2έω ὑπε3ρ2έω ὑπε3ρ2ῶ ὑπε3ρ2έε ὑπε3ρ2έε ὑπε3ρ2εῖς. ὑπε3ρ2εῖϲ. ὑπε3ρ2εῖσ. ὑπε3ρ2εῖ. ὑπε3ρ2έο ὑπε3ρ2έο ὑπε3ρ2οῦ ὑπε3ρ2εῖτ ὑπε3ρ2ώ ὑπε3ρ2ώ ὑπε3ρ2ω ὕ2σ1τρ ὕ2ϲ1τρ ὑ2σ1τρ ὑ2ϲ1τρ .φαε2σ1φ .φαε2ϲ1φ .φω2σ1φ .φω2ϲ1φ .χαρι2σ1ανδρ .χαρι2ϲ1ανδρ .χαρι2σ1άνδρ .χαρι2σ1άνδρ .χαρι2ϲ1άνδρ .χαρι2ϲ1άνδρ .χει2ρ1άγ .χει2ρ1άγ .χει2ρ1αγ .χει2ρ1απ .χει2ρ1αψ .χει2ρ1ου .χει2ρ1ῶν .χει2ρ1άν .χει2ρ1άν .χει2ρ1αν .χη2ν1ναλ ὡ2σ1α2ν1εί. ὡ2σ1α2ν1εί. ὡ2ϲ1α2ν1εί. ὡ2ϲ1α2ν1εί. ὡ2σ1α2ν1εὶ. ὡ2ϲ1α2ν1εὶ. ὡ2σ1αύτως. ὡ2σ1αύτως. ὡ2ϲ1αύτωϲ. ὡ2ϲ1αύτωϲ. ὡ2σ1αύτωσ. ὡ2σ1αύτωσ. ὡ2σ1εί. ὡ2σ1εί. ὡ2ϲ1εί. ὡ2ϲ1εί. ὡ2σ1εὶ. ὡ2ϲ1εὶ. ὥ2σ1περ. ὥ2ϲ1περ. ὡ2σ1πε2ρ1εί. ὡ2σ1πε2ρ1εί. ὡ2ϲ1πε2ρ1εί. ὡ2ϲ1πε2ρ1εί. ὡ2σ1πε2ρ1εὶ. ὡ2ϲ1πε2ρ1εὶ. ὥ2σ1τε ὥ2ϲ1τε ι2σ1χίλιοι. ι2σ1χίλιοι. ι2ϲ1χίλιοι. ι2ϲ1χίλιοι. ι2σ1χιλίων. ι2σ1χιλίων. ι2ϲ1χιλίων. ι2ϲ1χιλίων. ι2σ1χιλίοις. ι2σ1χιλίοις. ι2ϲ1χιλίοιϲ. ι2ϲ1χιλίοιϲ. ι2σ1χιλίοισ. ι2σ1χιλίοισ. ι2σ1χιλίους. ι2σ1χιλίους. ι2ϲ1χιλίουϲ. ι2ϲ1χιλίουϲ. ι2σ1χιλίουσ. ι2σ1χιλίουσ. ι2σ1χίλιαι. ι2σ1χίλιαι. ι2ϲ1χίλιαι. ι2ϲ1χίλιαι. ι2σ1χιλίαις. ι2σ1χιλίαις. ι2ϲ1χιλίαιϲ. ι2ϲ1χιλίαιϲ. ι2σ1χιλίαισ. ι2σ1χιλίαισ. ι2σ1χιλίας. ι2σ1χιλίας. ι2ϲ1χιλίαϲ. ι2ϲ1χιλίαϲ. ι2σ1χιλίασ. ι2σ1χιλίασ. ι2σ1χίλια. ι2σ1χίλια. ι2ϲ1χίλια. ι2ϲ1χίλια. ι2σ1μύριοι. ι2σ1μύριοι. ι2ϲ1μύριοι. ι2ϲ1μύριοι. ι2σ1μυρίων. ι2σ1μυρίων. ι2ϲ1μυρίων. ι2ϲ1μυρίων. ι2σ1μυρίοις. ι2σ1μυρίοις. ι2ϲ1μυρίοιϲ. ι2ϲ1μυρίοιϲ. ι2σ1μυρίοισ. ι2σ1μυρίοισ. ι2σ1μυρίους. ι2σ1μυρίους. ι2ϲ1μυρίουϲ. ι2ϲ1μυρίουϲ. ι2σ1μυρίουσ. ι2σ1μυρίουσ. ι2σ1μύριαι. ι2σ1μύριαι. ι2ϲ1μύριαι. ι2ϲ1μύριαι. ι2σ1μυρίαις. ι2σ1μυρίαις. ι2ϲ1μυρίαιϲ. ι2ϲ1μυρίαιϲ. ι2σ1μυρίαισ. ι2σ1μυρίαισ. ι2σ1μυρίας. ι2σ1μυρίας. ι2ϲ1μυρίαϲ. ι2ϲ1μυρίαϲ. ι2σ1μυρίασ. ι2σ1μυρίασ. ι2σ1μύρια. ι2σ1μύρια. ι2ϲ1μύρια. ι2ϲ1μύρια. ι2σ1χιλιοστ ι2ϲ1χιλιοϲτ ι2σ1μυριοστ ι2ϲ1μυριοϲτ ι2σ1χιλιάκις. ι2σ1χιλιάκις. ι2ϲ1χιλιάκιϲ. ι2ϲ1χιλιάκιϲ. ι2σ1χιλιάκισ. ι2σ1χιλιάκισ. ι2σ1μυριάκις. ι2σ1μυριάκις. ι2ϲ1μυριάκιϲ. ι2ϲ1μυριάκιϲ. ι2σ1μυριάκισ. ι2σ1μυριάκισ.",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=4237,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-agr.pat b/Master/texmf-dist/tex/context/patterns/lang-agr.pat
index 122bcda219b..409b8570d2a 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-agr.pat
+++ b/Master/texmf-dist/tex/context/patterns/lang-agr.pat
@@ -1,32 +1,10 @@
-% context pattern file, see lang-all.xml for original comment
+% generated by mtxrun --script pattern --convert
-% source of data: grahyph4.tex oldgrhyph.tex
+% for comment and copyright, see e:/tmp/patterns/lang-agr.rme
-% begin description data
+% used: ʼ ΐ ά έ ή ί ΰ α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω ϊ ϋ ό ύ ώ ϲ ἀ ἁ ἂ ἃ ἄ ἅ ἆ ἇ ἐ ἑ ἒ ἓ ἔ ἕ ἠ ἡ ἢ ἣ ἤ ἥ ἦ ἧ ἰ ἱ ἲ ἳ ἴ ἵ ἶ ἷ ὀ ὁ ὂ ὃ ὄ ὅ ὐ ὑ ὒ ὓ ὔ ὕ ὖ ὗ ὠ ὡ ὢ ὣ ὤ ὥ ὦ ὧ ὰ ά ὲ έ ὴ ή ὶ ί ὸ ό ὺ ύ ὼ ώ ᾀ ᾁ ᾂ ᾃ ᾄ ᾅ ᾆ ᾇ ᾐ ᾑ ᾒ ᾓ ᾔ ᾕ ᾖ ᾗ ᾠ ᾡ ᾢ ᾣ ᾤ ᾥ ᾦ ᾧ ᾲ ᾳ ᾴ ᾶ ᾷ ᾽ ᾿ ῂ ῃ ῄ ῆ ῇ ῒ ΐ ῖ ῗ ῢ ΰ ῤ ῥ ῦ ῧ ῲ ῳ ῴ ῶ ῷ ’
-% <!-- copied from lang-all.xml
-%
-% <?xml version='1.0' standalone='yes'?>
-%
-% <description language='agr'>
-% <sourcefile>grahyph4.tex</sourcefile>
-% <title>TeX hyphenation patterns for the ancient Greek language</title>
-% <copyright>
-% <year>2004</year>
-% <owner>Dimitrios Filippou</owner>
-% <comment>These hyphenation patterns are explained in "ancient.pdf".
-% Hyphenation examples are given in the file "anc-test.pdf".
-% Some doubtful patterns are marked by three question marks "???".</comment>
-% </copyright>
-% </description>
-%
-% end of copy -->
-
-% end description data
-
-% begin pattern data
-
-\patterns {
+\patterns{
α1
ε1
η1
@@ -34,9 +12,128 @@
ο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
+ἱ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
+ὧ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
+ᾤ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
+ί1
+ό1
+ύ1
+ώ1
+ΐ1
+ΰ1
+ά1
+έ1
+ή1
+ί1
+ό1
+ύ1
+ώ1
α2ι
α2ί
α2ί
@@ -203,6 +300,24 @@
4φ.
4χ.
4ψ.
+4'
+4β'
+4γ'
+4δ'
+4ζ'
+4θ'
+4κ'
+4λ'
+4μ'
+4ν'
+4ξ'
+4π'
+4ρ'
+4σ'
+4τ'
+4φ'
+4χ'
+4ψ'
.β4
.γ4
.δ4
@@ -459,6 +574,55 @@
2ψ1τ
2ψ1φ
2ψ1χ
+4βδ'
+4βλ'
+4βμ'
+4βν'
+4βρ'
+4γδ'
+4γλ'
+4γμ'
+4γν'
+4γρ'
+4δμ'
+4δν'
+4δρ'
+4ζβ'
+4θλ'
+4λμ'
+4θν'
+4θρ'
+4κλ'
+4κμ'
+4κν'
+4κρ'
+4κτ'
+4μν'
+4πλ'
+4πμ'
+4πν'
+4πρ'
+4πτ'
+4σβ'
+4σγ'
+4σδ'
+4σθ'
+4σκ'
+4σμ'
+4σπ'
+4στ'
+4σφ'
+4σχ'
+4φθ'
+4φλ'
+4φμ'
+4φν'
+4φρ'
+4χθ'
+4χλ'
+4χμ'
+4χν'
+4χρ'
ἀγω2ν1άρ
ἀγω2ν1άρ
ἀγω2ν1αρ
@@ -1483,6 +1647,7 @@
ἀ2ν1ῴδ
ἀ2ν1ώδυ
ἀ2ν1ώδυ
+ἀ2ν1ωδύ
ἀ2ν1ωδύ
ἀ2ν1ώι
ἀ2ν1ώι
@@ -2324,7 +2489,9 @@
ἐ3σ2όμ
ἐ3σ2ομ
ἐ3σ2οῦ
+ἐ3σ2ού
ἐ3σ2ού
+ἐ3σ2ου
ἐ3σ2υ
ἐ3σ2ύ
ἐ3σ2ύ
@@ -2873,8 +3040,4 @@
ι2σ1μυριάκις.
ι2σ1μυριάκις.
ι2σ1μυριάκισ.
-ι2σ1μυριάκισ.
-}
-
-% end pattern data
-
+ι2σ1μυριάκισ.} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-agr.rme b/Master/texmf-dist/tex/context/patterns/lang-agr.rme
new file mode 100644
index 00000000000..2e6ba153d77
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-agr.rme
@@ -0,0 +1,39 @@
+% generated by mtxrun --script pattern --convert
+
+Hyphenation patterns for Ancient Greek
+
+(more info about the licence to be added later)
+
+% ****************************************************************
+%
+% File name: grahyph5-unicode.tex
+%
+% This file was first created by mechanical translation from
+% GRAhyph5.tex via "elhyph-utf8 -a -c" (version 0.1 by Peter
+% Heslin -- p.j.heslin@durham.ac.uk). Some additions were
+% also made by hand.
+%
+% Created: June 6, 2008
+%
+% Hyphenation patterns for Ancient Greek.
+%
+% Created by Dimitrios Filippou with some ideas borrowed from
+% Yannis Haralambous, Kostis Dryllerakis and Claudio Beccari.
+%
+% These hyphenation patterns are explained in "ancient.pdf".
+% Hyphenation examples are given in the file "anc-test.pdf".
+% Some doubtful patterns are marked by three question marks "???".
+%
+% Documentation in English can be found in: D. Filippou,
+% "Hyphenation patterns for Ancient and Modern Greek," in
+% "TeX, XML, and Digital Typography" (A. Syropoulos et al.,
+% eds.), Lecture Notes in Computer Science 3130, Springer-Verlag
+% Berlin-Heidelberg, 2004. ISBN 3-540-22801-2.
+%
+% Thanks to Thomas Schmitz (thomas.schmitz@uni-bonn.de)
+% for pointing out a few mistakes. (Marked by %%%TS%%%)
+%
+% ****************************************************************
+%
+% \message{UTF-8 hyphenation patterns for Ancient Greek}
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-bg.lua b/Master/texmf-dist/tex/context/patterns/lang-bg.lua
new file mode 100644
index 00000000000..b9ef27474d8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-bg.lua
@@ -0,0 +1,64 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="bg",
+ ["source"]="hyph-bg",
+ ["texcomment"]="% Bulgarian Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% Bulgarian hyphenation patterns, version 1.7, July 2008\
+% Copyright 1994-2008 Georgi Boshnakov\
+% Georgi dot Boshnakov at manchester dot ac dot uk\
+% \
+% This file can be redistributed and/or modified under the terms\
+% of the LaTeX Project Public License distributed from CTAN\
+% archives in directory macros/latex/base/lppl.txt; either\
+% version 1 of the License, or any later version.\
+%\
+%\
+% First version: 1994\
+% Modified: June 2000 (minor changes)\
+% Modified: May 2006 (added copyright notice)\
+% Modified: June 2008 (changed encoding to utf-8)\
+%\
+% Please send wrongly hyphenated words and suggestions for\
+% corrections to the address given towards the beginning of this\
+% file.\
+%\
+%\
+% Note: The original name of this file was 'bghyphsi.tex' which is\
+% part of the package 'bghyphen'. The package 'bghyphen' is now\
+% obsolete but it is still available on CTAN and currently (June 2008)\
+% gives the same hyphenation results.\
+% \
+%\
+%\
+% To make TeX use these patterns:\
+%\
+% (1) Make sure that the hyph-utf8 package is present in your TeX\
+% system.\
+%\
+% (2) generate the necessary formats (TeX, LaTeX, pdfLaTeX, etc),\
+% instructing TeX to load 'loadhyph-bg.tex' for Bulgarian\
+% hyphenation.\
+%\
+% The LaTeX babel package sets \\lefthyphenmin and \\righthyphenmin to 2\
+% when the language is switched to Bulgarian. Developers who write\
+% support for Bulgarian outside LaTeX and/or babel need to take care\
+% of this.\
+% \
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="абвгдежзийклмнопрстуфхцчшщъьюя",
+ ["data"]="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 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 0ь0 1ю1 1я1 б4а б4е б4и б4о б4у б4ъ б4ю б4я в4а в4е в4и в4о в4у в4ъ в4ю в4я г4а г4е г4и г4о г4у г4ъ г4ю г4я д4а д4е д4и д4о д4у д4ъ д4ю д4я ж4а ж4е ж4и ж4о ж4у ж4ъ ж4ю ж4я з4а з4е з4и з4о з4у з4ъ з4ю з4я й4а й4е й4и й4о й4у й4ъ й4ю й4я к4а к4е к4и к4о к4у к4ъ к4ю к4я л4а л4е л4и л4о л4у л4ъ л4ю л4я м4а м4е м4и м4о м4у м4ъ м4ю м4я н4а н4е н4и н4о н4у н4ъ н4ю н4я п4а п4е п4и п4о п4у п4ъ п4ю п4я р4а р4е р4и р4о р4у р4ъ р4ю р4я с4а с4е с4и с4о с4у с4ъ с4ю с4я т4а т4е т4и т4о т4у т4ъ т4ю т4я ф4а ф4е ф4и ф4о ф4у ф4ъ ф4ю ф4я х4а х4е х4и х4о х4у х4ъ х4ю х4я ц4а ц4е ц4и ц4о ц4у ц4ъ ц4ю ц4я ч4а ч4е ч4и ч4о ч4у ч4ъ ч4ю ч4я ш4а ш4е ш4и ш4о ш4у ш4ъ ш4ю ш4я щ4а щ4е щ4и щ4о щ4у щ4ъ щ4ю щ4я ь4а ь4е ь4и ь4о ь4у ь4ъ ь4ю ь4я 4б3б4 2б3в2 2б3г2 2б3д2 2б3ж2 2б3з2 2б3й2 2б3к2 2б3л2 2б3м2 2б3н2 2б3п2 2б3р2 2б3с2 2б3т2 2б3ф2 2б3х2 2б3ц2 2б3ч2 2б3ш2 2б3щ2 2в3б2 4в3в4 2в3г2 2в3д2 2в3ж2 2в3з2 2в3й2 2в3к2 2в3л2 2в3м2 2в3н2 2в3п2 2в3р2 2в3с2 2в3т2 2в3ф2 2в3х2 2в3ц2 2в3ч2 2в3ш2 2в3щ2 2г3б2 2г3в2 4г3г4 2г3д2 2г3ж2 2г3з2 2г3й2 2г3к2 2г3л2 2г3м2 2г3н2 2г3п2 2г3р2 2г3с2 2г3т2 2г3ф2 2г3х2 2г3ц2 2г3ч2 2г3ш2 2г3щ2 2д3б2 2д3в2 2д3г2 4д3д4 3д4ж 2д3з2 2д3й2 2д3к2 2д3л2 2д3м2 2д3н2 2д3п2 2д3р2 2д3с2 2д3т2 2д3ф2 2д3х2 2д3ц2 2д3ч2 2д3ш2 2д3щ2 2ж3б2 2ж3в2 2ж3г2 2ж3д2 4ж3ж4 2ж3з2 2ж3й2 2ж3к2 2ж3л2 2ж3м2 2ж3н2 2ж3п2 2ж3р2 2ж3с2 2ж3т2 2ж3ф2 2ж3х2 2ж3ц2 2ж3ч2 2ж3ш2 2ж3щ2 2з3б2 2з3в2 2з3г2 2з3д2 2з3ж2 4з3з4 2з3й2 2з3к2 2з3л2 2з3м2 2з3н2 2з3п2 2з3р2 2з3с2 2з3т2 2з3ф2 2з3х2 2з3ц2 2з3ч2 2з3ш2 2з3щ2 2й3б2 2й3в2 2й3г2 2й3д2 2й3ж2 2й3з2 4й3й4 2й3к2 2й3л2 2й3м2 2й3н2 2й3п2 2й3р2 2й3с2 2й3т2 2й3ф2 2й3х2 2й3ц2 2й3ч2 2й3ш2 2й3щ2 2к3б2 2к3в2 2к3г2 2к3д2 2к3ж2 2к3з2 2к3й2 4к3к4 2к3л2 2к3м2 2к3н2 2к3п2 2к3р2 2к3с2 2к3т2 2к3ф2 2к3х2 2к3ц2 2к3ч2 2к3ш2 2к3щ2 2л3б2 2л3в2 2л3г2 2л3д2 2л3ж2 2л3з2 2л3й2 2л3к2 4л3л4 2л3м2 2л3н2 2л3п2 2л3р2 2л3с2 2л3т2 2л3ф2 2л3х2 2л3ц2 2л3ч2 2л3ш2 2л3щ2 2м3б2 2м3в2 2м3г2 2м3д2 2м3ж2 2м3з2 2м3й2 2м3к2 2м3л2 4м3м4 2м3н2 2м3п2 2м3р2 2м3с2 2м3т2 2м3ф2 2м3х2 2м3ц2 2м3ч2 2м3ш2 2м3щ2 2н3б2 2н3в2 2н3г2 2н3д2 2н3ж2 2н3з2 2н3й2 2н3к2 2н3л2 2н3м2 4н3н4 2н3п2 2н3р2 2н3с2 2н3т2 2н3ф2 2н3х2 2н3ц2 2н3ч2 2н3ш2 2н3щ2 2п3б2 2п3в2 2п3г2 2п3д2 2п3ж2 2п3з2 2п3й2 2п3к2 2п3л2 2п3м2 2п3н2 4п3п4 2п3р2 2п3с2 2п3т2 2п3ф2 2п3х2 2п3ц2 2п3ч2 2п3ш2 2п3щ2 2р3б2 2р3в2 2р3г2 2р3д2 2р3ж2 2р3з2 2р3й2 2р3к2 2р3л2 2р3м2 2р3н2 2р3п2 4р3р4 2р3с2 2р3т2 2р3ф2 2р3х2 2р3ц2 2р3ч2 2р3ш2 2р3щ2 2с3б2 2с3в2 2с3г2 2с3д2 2с3ж2 2с3з2 2с3й2 2с3к2 2с3л2 2с3м2 2с3н2 2с3п2 2с3р2 4с3с4 2с3т2 2с3ф2 2с3х2 2с3ц2 2с3ч2 2с3ш2 2с3щ2 2т3б2 2т3в2 2т3г2 2т3д2 2т3ж2 2т3з2 2т3й2 2т3к2 2т3л2 2т3м2 2т3н2 2т3п2 2т3р2 2т3с2 4т3т4 2т3ф2 2т3х2 2т3ц2 2т3ч2 2т3ш2 2т3щ2 2ф3б2 2ф3в2 2ф3г2 2ф3д2 2ф3ж2 2ф3з2 2ф3й2 2ф3к2 2ф3л2 2ф3м2 2ф3н2 2ф3п2 2ф3р2 2ф3с2 2ф3т2 4ф3ф4 2ф3х2 2ф3ц2 2ф3ч2 2ф3ш2 2ф3щ2 2х3б2 2х3в2 2х3г2 2х3д2 2х3ж2 2х3з2 2х3й2 2х3к2 2х3л2 2х3м2 2х3н2 2х3п2 2х3р2 2х3с2 2х3т2 2х3ф2 4х3х4 2х3ц2 2х3ч2 2х3ш2 2х3щ2 2ц3б2 2ц3в2 2ц3г2 2ц3д2 2ц3ж2 2ц3з2 2ц3й2 2ц3к2 2ц3л2 2ц3м2 2ц3н2 2ц3п2 2ц3р2 2ц3с2 2ц3т2 2ц3ф2 2ц3х2 4ц3ц4 2ц3ч2 2ц3ш2 2ц3щ2 2ч3б2 2ч3в2 2ч3г2 2ч3д2 2ч3ж2 2ч3з2 2ч3й2 2ч3к2 2ч3л2 2ч3м2 2ч3н2 2ч3п2 2ч3р2 2ч3с2 2ч3т2 2ч3ф2 2ч3х2 2ч3ц2 4ч3ч4 2ч3ш2 2ч3щ2 2ш3б2 2ш3в2 2ш3г2 2ш3д2 2ш3ж2 2ш3з2 2ш3й2 2ш3к2 2ш3л2 2ш3м2 2ш3н2 2ш3п2 2ш3р2 2ш3с2 2ш3т2 2ш3ф2 2ш3х2 2ш3ц2 2ш3ч2 4ш3ш4 2ш3щ2 2щ3б2 2щ3в2 2щ3г2 2щ3д2 2щ3ж2 2щ3з2 2щ3й2 2щ3к2 2щ3л2 2щ3м2 2щ3н2 2щ3п2 2щ3р2 2щ3с2 2щ3т2 2щ3ф2 2щ3х2 2щ3ц2 2щ3ч2 2щ3ш2 4щ3щ4 ааа4 аае4 ааи4 аао4 аау4 ааъ4 ааю4 аая4 аеа4 аее4 аеи4 аео4 аеу4 аеъ4 аею4 аея4 аиа4 аие4 аии4 аио4 аиу4 аиъ4 аию4 аия4 аоа4 аое4 аои4 аоо4 аоу4 аоъ4 аою4 аоя4 ауа4 ауе4 ауи4 ауо4 ауу4 ауъ4 аую4 ауя4 аъа4 аъе4 аъи4 аъо4 аъу4 аъъ4 аъю4 аъя4 аюа4 аюе4 аюи4 аюо4 аюу4 аюъ4 аюю4 аюя4 аяа4 аяе4 аяи4 аяо4 аяу4 аяъ4 аяю4 аяя4 еаа4 еае4 еаи4 еао4 еау4 еаъ4 еаю4 еая4 ееа4 еее4 ееи4 еео4 ееу4 ееъ4 еею4 еея4 еиа4 еие4 еии4 еио4 еиу4 еиъ4 еию4 еия4 еоа4 еое4 еои4 еоо4 еоу4 еоъ4 еою4 еоя4 еуа4 еуе4 еуи4 еуо4 еуу4 еуъ4 еую4 еуя4 еъа4 еъе4 еъи4 еъо4 еъу4 еъъ4 еъю4 еъя4 еюа4 еюе4 еюи4 еюо4 еюу4 еюъ4 еюю4 еюя4 еяа4 еяе4 еяи4 еяо4 еяу4 еяъ4 еяю4 еяя4 иаа4 иае4 иаи4 иао4 иау4 иаъ4 иаю4 иая4 иеа4 иее4 иеи4 иео4 иеу4 иеъ4 иею4 иея4 ииа4 иие4 иии4 иио4 ииу4 ииъ4 иию4 иия4 иоа4 иое4 иои4 иоо4 иоу4 иоъ4 иою4 иоя4 иуа4 иуе4 иуи4 иуо4 иуу4 иуъ4 иую4 иуя4 иъа4 иъе4 иъи4 иъо4 иъу4 иъъ4 иъю4 иъя4 июа4 июе4 июи4 июо4 июу4 июъ4 июю4 июя4 ияа4 ияе4 ияи4 ияо4 ияу4 ияъ4 ияю4 ияя4 оаа4 оае4 оаи4 оао4 оау4 оаъ4 оаю4 оая4 оеа4 оее4 оеи4 оео4 оеу4 оеъ4 оею4 оея4 оиа4 оие4 оии4 оио4 оиу4 оиъ4 оию4 оия4 ооа4 оое4 оои4 ооо4 ооу4 ооъ4 оою4 ооя4 оуа4 оуе4 оуи4 оуо4 оуу4 оуъ4 оую4 оуя4 оъа4 оъе4 оъи4 оъо4 оъу4 оъъ4 оъю4 оъя4 оюа4 оюе4 оюи4 оюо4 оюу4 оюъ4 оюю4 оюя4 ояа4 ояе4 ояи4 ояо4 ояу4 ояъ4 ояю4 ояя4 уаа4 уае4 уаи4 уао4 уау4 уаъ4 уаю4 уая4 уеа4 уее4 уеи4 уео4 уеу4 уеъ4 уею4 уея4 уиа4 уие4 уии4 уио4 уиу4 уиъ4 уию4 уия4 уоа4 уое4 уои4 уоо4 уоу4 уоъ4 уою4 уоя4 ууа4 ууе4 ууи4 ууо4 ууу4 ууъ4 уую4 ууя4 уъа4 уъе4 уъи4 уъо4 уъу4 уъъ4 уъю4 уъя4 уюа4 уюе4 уюи4 уюо4 уюу4 уюъ4 уюю4 уюя4 уяа4 уяе4 уяи4 уяо4 уяу4 уяъ4 уяю4 уяя4 ъаа4 ъае4 ъаи4 ъао4 ъау4 ъаъ4 ъаю4 ъая4 ъеа4 ъее4 ъеи4 ъео4 ъеу4 ъеъ4 ъею4 ъея4 ъиа4 ъие4 ъии4 ъио4 ъиу4 ъиъ4 ъию4 ъия4 ъоа4 ъое4 ъои4 ъоо4 ъоу4 ъоъ4 ъою4 ъоя4 ъуа4 ъуе4 ъуи4 ъуо4 ъуу4 ъуъ4 ъую4 ъуя4 ъъа4 ъъе4 ъъи4 ъъо4 ъъу4 ъъъ4 ъъю4 ъъя4 ъюа4 ъюе4 ъюи4 ъюо4 ъюу4 ъюъ4 ъюю4 ъюя4 ъяа4 ъяе4 ъяи4 ъяо4 ъяу4 ъяъ4 ъяю4 ъяя4 юаа4 юае4 юаи4 юао4 юау4 юаъ4 юаю4 юая4 юеа4 юее4 юеи4 юео4 юеу4 юеъ4 юею4 юея4 юиа4 юие4 юии4 юио4 юиу4 юиъ4 юию4 юия4 юоа4 юое4 юои4 юоо4 юоу4 юоъ4 юою4 юоя4 юуа4 юуе4 юуи4 юуо4 юуу4 юуъ4 юую4 юуя4 юъа4 юъе4 юъи4 юъо4 юъу4 юъъ4 юъю4 юъя4 ююа4 ююе4 ююи4 ююо4 ююу4 ююъ4 ююю4 ююя4 юяа4 юяе4 юяи4 юяо4 юяу4 юяъ4 юяю4 юяя4 яаа4 яае4 яаи4 яао4 яау4 яаъ4 яаю4 яая4 яеа4 яее4 яеи4 яео4 яеу4 яеъ4 яею4 яея4 яиа4 яие4 яии4 яио4 яиу4 яиъ4 яию4 яия4 яоа4 яое4 яои4 яоо4 яоу4 яоъ4 яою4 яоя4 яуа4 яуе4 яуи4 яуо4 яуу4 яуъ4 яую4 яуя4 яъа4 яъе4 яъи4 яъо4 яъу4 яъъ4 яъю4 яъя4 яюа4 яюе4 яюи4 яюо4 яюу4 яюъ4 яюю4 яюя4 яяа4 яяе4 яяи4 яяо4 яяу4 яяъ4 яяю4 яяя4 й4бб й4бв й4бг й4бд й4бж й4бз й4бй й4бк й4бл й4бм й4бн й4бп й4бр й4бс й4бт й4бф й4бх й4бц й4бч й4бш й4бщ й4вб й4вв й4вг й4вд й4вж й4вз й4вй й4вк й4вл й4вм й4вн й4вп й4вр й4вс й4вт й4вф й4вх й4вц й4вч й4вш й4вщ й4гб й4гв й4гг й4гд й4гж й4гз й4гй й4гк й4гл й4гм й4гн й4гп й4гр й4гс й4гт й4гф й4гх й4гц й4гч й4гш й4гщ й4дб й4дв й4дг й4дд й4дж й4дз й4дй й4дк й4дл й4дм й4дн й4дп й4др й4дс й4дт й4дф й4дх й4дц й4дч й4дш й4дщ й4жб й4жв й4жг й4жд й4жж й4жз й4жй й4жк й4жл й4жм й4жн й4жп й4жр й4жс й4жт й4жф й4жх й4жц й4жч й4жш й4жщ й4зб й4зв й4зг й4зд й4зж й4зз й4зй й4зк й4зл й4зм й4зн й4зп й4зр й4зс й4зт й4зф й4зх й4зц й4зч й4зш й4зщ й4йб й4йв й4йг й4йд й4йж й4йз й4йй й4йк й4йл й4йм й4йн й4йп й4йр й4йс й4йт й4йф й4йх й4йц й4йч й4йш й4йщ й4кб й4кв й4кг й4кд й4кж й4кз й4кй й4кк й4кл й4км й4кн й4кп й4кр й4кс й4кт й4кф й4кх й4кц й4кч й4кш й4кщ й4лб й4лв й4лг й4лд й4лж й4лз й4лй й4лк й4лл й4лм й4лн й4лп й4лр й4лс й4лт й4лф й4лх й4лц й4лч й4лш й4лщ й4мб й4мв й4мг й4мд й4мж й4мз й4мй й4мк й4мл й4мм й4мн й4мп й4мр й4мс й4мт й4мф й4мх й4мц й4мч й4мш й4мщ й4нб й4нв й4нг й4нд й4нж й4нз й4нй й4нк й4нл й4нм й4нн й4нп й4нр й4нс й4нт й4нф й4нх й4нц й4нч й4нш й4нщ й4пб й4пв й4пг й4пд й4пж й4пз й4пй й4пк й4пл й4пм й4пн й4пп й4пр й4пс й4пт й4пф й4пх й4пц й4пч й4пш й4пщ й4рб й4рв й4рг й4рд й4рж й4рз й4рй й4рк й4рл й4рм й4рн й4рп й4рр й4рс й4рт й4рф й4рх й4рц й4рч й4рш й4рщ й4сб й4св й4сг й4сд й4сж й4сз й4сй й4ск й4сл й4см й4сн й4сп й4ср й4сс й4ст й4сф й4сх й4сц й4сч й4сш й4сщ й4тб й4тв й4тг й4тд й4тж й4тз й4тй й4тк й4тл й4тм й4тн й4тп й4тр й4тс й4тт й4тф й4тх й4тц й4тч й4тш й4тщ й4фб й4фв й4фг й4фд й4фж й4фз й4фй й4фк й4фл й4фм й4фн й4фп й4фр й4фс й4фт й4фф й4фх й4фц й4фч й4фш й4фщ й4хб й4хв й4хг й4хд й4хж й4хз й4хй й4хк й4хл й4хм й4хн й4хп й4хр й4хс й4хт й4хф й4хх й4хц й4хч й4хш й4хщ й4цб й4цв й4цг й4цд й4цж й4цз й4цй й4цк й4цл й4цм й4цн й4цп й4цр й4цс й4цт й4цф й4цх й4цц й4цч й4цш й4цщ й4чб й4чв й4чг й4чд й4чж й4чз й4чй й4чк й4чл й4чм й4чн й4чп й4чр й4чс й4чт й4чф й4чх й4чц й4чч й4чш й4чщ й4шб й4шв й4шг й4шд й4шж й4шз й4шй й4шк й4шл й4шм й4шн й4шп й4шр й4шс й4шт й4шф й4шх й4шц й4шч й4шш й4шщ й4щб й4щв й4щг й4щд й4щж й4щз й4щй й4щк й4щл й4щм й4щн й4щп й4щр й4щс й4щт й4щф й4щх й4щц й4щч й4щш й4щщ б4ь в4ь г4ь д4ь ж4ь з4ь й4ь к4ь л4ь м4ь н4ь п4ь р4ь с4ь т4ь ф4ь х4ь ц4ь ч4ь ш4ь щ4ь ь4ь .дз4в .дж4р .дж4л .вг4л .вд4л .вг4р .вг4н .вп4л .вк4л .вк4р .вт4р .сг4л .зд4р .сг4р .сб4р .сд4р .жд4р .ск4л .сп4л .сп4р .ст4р .ск4р .шп4р .ск4в .вз4р .вс4л .вс4м .вс4р .св4р .сх4л .сх4р .хв4р .вс4т .сх4в .см4р н4кт. н4кс. к4ст.",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=1660,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-bg.rme b/Master/texmf-dist/tex/context/patterns/lang-bg.rme
index 890f04fba12..bb232f42f62 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-bg.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-bg.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Bulgarian Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% Bulgarian hyphenation patterns, version 1.7, July 2008
% Copyright 1994-2008 Georgi Boshnakov
% Georgi dot Boshnakov at manchester dot ac dot uk
@@ -40,4 +44,4 @@
% when the language is switched to Bulgarian. Developers who write
% support for Bulgarian outside LaTeX and/or babel need to take care
% of this.
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-ca.lua b/Master/texmf-dist/tex/context/patterns/lang-ca.lua
new file mode 100644
index 00000000000..ca50ff168c8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-ca.lua
@@ -0,0 +1,148 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["characters"]="abcdeghijklnoprstuvwxy",
+ ["data"]="cu-rie cu-ries gei-sha gei-shes goua-che goua-ches hip-py hip-pies hob-by hob-bies jeep jeeps joule joules klee-nex klee-nexs lar-ghet-ti lar-ghet-to lied lieder nos-al-tres ro-yal-ties ro-yal-ty vos-al-tres whis-ky whis-kies",
+ ["n"]=26,
+ },
+ ["metadata"]={
+ ["mnemonic"]="ca",
+ ["source"]="hyph-ca",
+ ["texcomment"]="% Catalan Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: cahyph.tex (2003-09-08)\
+% Author: Gonçal Badenes <g.badenes at ieee.org>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% Hyphenation patterns for Catalan.\
+% This is version 1.11\
+% Compiled by Gonçal Badenes and Francina Turon,\
+% December 1991-January 1995.\
+%\
+% Copyright (C) 1991-2003 Gonçal Badenes\
+%\
+% -----------------------------------------------------------------\
+% IMPORTANT NOTICE:\
+%\
+% This program can be redistributed and/or modified under the terms\
+% of the LaTeX Project Public License Distributed from CTAN\
+% archives in directory macros/latex/base/lppl.txt; either\
+% version 1 of the License, or any later version.\
+% -----------------------------------------------------------------\
+%\
+%%% ====================================================================\
+%%% @TeX-hyphen-file{\
+%%% author = \"Gonçal Badenes\",\
+%%% version = \"1.11\",\
+%%% date = \"15 July 2003\",\
+%%% time = \"15:08:12 CET\",\
+%%% filename = \"cahyph.tex\",\
+%%% email = \"g.badenes@ieee.org\",\
+%%% codetable = \"UTF-8\",\
+%%% keywords = \"TeX, hyphen, catalan\",\
+%%% supported = \"yes\",\
+%%% abstract = \"Catalan hyphenation patterns\",\
+%%% docstring = \"This file contains the hyphenation patterns\
+%%% for the catalan language\",\
+%%% }\
+%%% ====================================================================\
+%\
+% NOTICE: Version 1.11 is identical to version 1.10 (issued on January 17,\
+% 1995) except for the updated copyright notice above.\
+%\
+% The macros used were created for ghyph31.tex by Bernd Raichle (see the\
+% German hyphenation pattern files for further details)\
+%\
+% This patterns have been created using standard, conservative\
+% hyphenation rules for catalan. The results have refined running them\
+% through patgen. In that way, the number of hits has been increased.\
+%\
+% These rules produce no wrong patterns (Results checked against the\
+% ``Diccionari Ortogr\\`afic i de Pron\\'uncia'', Enciclop\\`edia\
+% Catalana. The percentage of valid hyphen misses is lower than 1%\
+%\
+% Some of the patterns below represent combinations that never\
+% happen in Catalan. We have tried to keep them to a minimum.\
+%\
+% *** IMPORTANT ***\
+% \\lefthyphenmin and \\righthyphenmin should be set to 2 and 2\
+% respectively. If you set them below these values incorrect breaks\
+% will happen (specially at the beginning of foreign words and words\
+% which begin with some prefixes).\
+% *** IMPORTANT ***\
+%\
+% Please report any problem you might have to the authors!!!\
+%\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+% \\message{Catalan Hyphenation Patterns `cahyphen' Version 1.11 <2003/07/15>}\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijlmnopqrstuvxyzàçèéíïòóúü",
+ ["data"]="1ba 1be 1bi 1bo 1bu 1ca 1ce 1ci 1co 1cu 1da 1de 1di 1do 3du 1fa 1fe 1fi 1fo 1fu 1ga 1ge 1gi 1go 1gu 1ha 1he 1hi 1ho 1hu 1ja 1je 1ji 1jo 1ju 1la 1le 1li 1lo 1lu 1ma 1me 1mi 1mo 1mu 1na 1ne 3ni 1no 1nu 1pa 3pe 3pi 3po 1pu 1qu 1ra 1re 1ri 1ro 1ru 1sa 1se 1si 1so 1su 1ta 1te 1ti 1to 1tu 1va 1ve 1vi 1vo 1vu 1xa 1xe 1xi 1xo 1xu 1za 1ze 1zi 1zo 1zu 1bé 1bí 1bó 1bú 1bà 1bè 1bò 1cé 1cí 1có 1cú 1cà 1cè 1cò 1ço 1ça 1çu 1çó 1çú 1çà 1çò 1dé 1dí 1dó 1dú 1dà 1dè 1dò 1fé 1fí 1fó 1fú 1fà 1fè 1fò 1gé 1gí 1gó 1gú 1gà 1gè 1gò 1gü 1hé 1hí 1hó 1hú 1hà 1hè 1hò 1jé 1jí 1jó 1jú 1jà 1jè 1jò 1lé 1lí 1ló 1lú 1là 1lè 1lò 1mé 1mí 1mó 1mú 1mà 1mè 1mò 1né 1ní 1nó 1nú 1nà 1nè 1nò 1pé 1pí 1pó 1pú 1pà 1pè 1pò 1qü 1ré 1rí 1ró 1rú 1rà 1rè 1rò 1sé 1sí 1só 1sú 1sà 1sè 1sò 1té 1tí 1tó 1tú 1tà 1tè 1tò 1vé 1ví 1vó 1vú 1và 1vè 1vò 1xé 1xí 1xó 1xú 1xà 1xè 1xò 1zé 1zí 1zó 1zú 1zà 1zè 1zò 3l2la 1l2le 1l2li 3l2lo 1l2lu 1b2la 1b2le 1b2li 1b2lo 1b2lu 1b2ra 1b2re 1b2ri 1b2ro 1b2ru 1c2la 1c2le 1c2li 1c2lo 1c2lu 1c2ra 1c2re 1c2ri 1c2ro 1c2ru 1d2ra 1d2re 1d2ri 1d2ro 1d2ru 1f2la 1f2le 1f2li 1f2lo 1f2lu 1f2ra 1f2re 1f2ri 1f2ro 1f2ru 1g2la 1g2le 1g2li 1g2lo 1g2lu 1g2ra 1g2re 1g2ri 1g2ro 1g2ru 1p2la 1p2le 1p2li 1p2lo 1p2lu 1p2ra 1p2re 1p2ri 1p2ro 1p2ru 1t2ra 1t2re 1t2ri 1t2ro 1t2ru 1n2ya 1n2ye 1n2yi 1n2yo 1n2yu 1l2lé 1l2lí 1l2ló 1l2lú 1l2là 1l2lè 1l2lò 1b2lé 1b2lí 1b2ló 1b2lú 1b2là 1b2lè 1b2lò 1b2ré 1b2rí 1b2ró 1b2rú 1b2rà 1b2rè 1b2rò 1c2lé 1c2lí 1c2ló 1c2lú 1c2là 1c2lè 1c2lò 1c2ré 1c2rí 1c2ró 1c2rú 1c2rà 1c2rè 1c2rò 1d2ré 1d2rí 1d2ró 1d2rú 1d2rà 1d2rè 1d2rò 1f2lé 1f2lí 1f2ló 1f2lú 1f2là 1f2lè 1f2lò 1f2ré 1f2rí 1f2ró 1f2rú 1f2rà 1f2rè 1f2rò 1g2lé 1g2lí 1g2ló 1g2lú 1g2là 1g2lè 1g2lò 1g2ré 1g2rí 1g2ró 1g2rú 1g2rà 1g2rè 1g2rò 1p2lé 1p2lí 1p2ló 1p2lú 1p2là 1p2lè 1p2lò 1p2ré 1p2rí 1p2ró 1p2rú 1p2rà 1p2rè 1p2rò 1t2ré 1t2rí 1t2ró 1t2rú 1t2rà 1t2rè 1t2rò 1n2yé 1n2yí 1n2yó 1n2yú 1n2yà 1n2yè 1n2yò a1a a1e a1o e1a e1e e1o i1a i1e i1o o1a o1e o1o u1a u1e u1o a1é a1í a1ó a1ú a1à a1è a1ò a1ï a1ü e1é e1í e1ó e1ú e1à e1è e1ò e1ï e1ü i1é i1í i1ó i1ú i1à i1è i1ò i1ï i1ü o1é o1í o1ó o1ú o1à o1è o1ò o1ï o1ü u1é u1í u1ó u1ú u1à u1è u1ò u1ï u1ü é1a é1e é1o é1ï é1ü í1a í1e í1o í1ï í1ü ó1a ó1e ó1o ó1ï ó1ü ú1a ú1e ú1o ú1ï ú1ü à1a à1e à1o à1ï à1ü è1a è1e è1o è1ï è1ü ò1a ò1e ò1o ò1ï ò1ü ï1a ï1e ï1o ï1é ï1í ï1ó ï1ú ï1à ï1è ï1ò ï1i ü1a ü1e ü1o ü1é ü1í ü1ó ü1ú ü1à ü1è ü1ò a1i2a a1i2e a1i2o a1i2u a1u2a a1u2e a1u2i a1u2o a1u2u e1i2a e1i2e e1i2o e1i2u e1u2a e1u2e e1u2i e1u2o e1u2u i1i2a i1i2e i1i2o i1i2u i1u2a i1u2e i1u2i i1u2o i1u2u o1i2a o1i2e o1i2o o1i2u o1u2a o1u2e o1u2o o1u2i o1u2u u1i2a u1i2e u1i2o u1i2u u1u2a u1u2e u1u2i u1u2o u1u2u a1i2é a1i2í a1i2ó a1i2ú a1i2à a1i2è a1i2ò a1u2é a1u2í a1u2ó a1u2ú a1u2à a1u2è a1u2ò e1i2é e1i2í e1i2ó e1i2ú e1i2à e1i2è e1i2ò e1u2é e1u2í e1u2ó e1u2ú e1u2à e1u2è e1u2ò i1i2é i1i2í i1i2ó i1i2ú i1i2à i1i2è i1i2ò i1u2é i1u2í i1u2ó i1u2ú i1u2à i1u2è i1u2ò o1i2é o1i2í o1i2ó o1i2ú o1i2à o1i2è o1i2ò o1u2é o1u2í o1u2ó o1u2ú o1u2à o1u2è o1u2ò u1i2é u1i2í u1i2ó u1i2ú u1i2à u1i2è u1i2ò u1u2é u1u2í u1u2ó u1u2ú u1u2à u1u2è u1u2ò é1i2a é1i2e é1i2o é1i2u é1u2a é1u2e é1u2o é1u2i é1u2u í1i2a í1i2e í1i2o í1i2u í1u2a í1u2e í1u2o í1u2i í1u2u ó1i2a ó1i2e ó1i2o ó1i2u ó1u2a ó1u2e ó1u2o ó1u2i ó1u2u ú1i2a ú1i2e ú1i2o ú1i2u ú1u2a ú1u2e ú1u2o ú1u2i ú1u2u à1i2a à1i2e à1i2o à1i2u à1u2a à1u2e à1u2o à1u2i à1u2u è1i2a è1i2e è1i2o è1i2u è1u2a è1u2e è1u2o è1u2i è1u2u ò1i2a ò1i2e ò1i2o ò1i2u ò1u2a ò1u2e ò1u2o ò1u2i ò1u2u ï1i2a ï1i2e ï1i2o ï1i2é ï1i2í ï1i2ó ï1i2ú ï1i2à ï1i2è ï1i2ò ï1i2u ï1u2a ï1u2e ï1u2o ï1u2é ï1u2í ï1u2ó ï1u2ú ï1u2à ï1u2è ï1u2ò ï1u2i ï1u2u ü1i2a ü1i2e ü1i2o ü1i2é ü1i2í ü1i2ó ü1i2ú ü1i2à ü1i2è ü1i2ò ü1i2u ü1u2a ü1u2e ü1u2o ü1u2é ü1u2í ü1u2ó ü1u2ú ü1u2à ü1u2è ü1u2ò ü1u2i ü1u2u .hi2a .hi2e .hi2o .hi2u .hu2a .hu2e .hu2i .hu2o .i2è .i2ò .u2è .u2ò .hi2é .hi2ó .hi2ú .hi2à .hi2è .hi2ò .hu2é .hu2í .hu2ó .hu2à .hu2è .hu2ò gu2a gu2e gu2i gu2o qu2a qu2e qu2i qu2o gu2é gu2í gu2ó gu2à gu2è gu2ò qu2é qu2í qu2ó qu2à qu2è qu2ò gü2e gü2é gü2í gü2è gü2i qü2e qü2é qü2í qü2è qü2i a1isme. e1isme. i1isme. o1isme. u1isme. a1ista. e1ista. i1ista. o1ista. u1ista. a1um. e1um. i1um. o1um. u1um. .antihi2 .be2n .be2s .bi2s .ca2p .ce2l .cla2r .co2ll .co2n .co2r .de2s .di2s .en3a .hipe2r .hiperm2n .in3ac .in3ad .in3ap .in3es .in3o .inte2r .ma2l .mal1t2hus .pa2n .pe2r .pe3ri .pos2t .psa2l .rebe2s .re2d .su2b .sub3o .subde2s .supe2r .tran2s g2no p2si p2se p2neu g2nò p2sí .ch2 .th2 ein1s2tein ru1t2herford ni2etz1sc2he 3exp 3nef 3nei 3pr 3ser a3ne a3ri bi3se des3ag des3ar des3av des3enc e3ism e3le e3rio e3ris es3aco es3af es3ap es3arr es3as es3int ig3n in3ex n3si o3ro qui3e s3emp s3esp sub3a ui3et o3gnò",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=869,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-ca.rme b/Master/texmf-dist/tex/context/patterns/lang-ca.rme
index 656141fbf47..11c34acbf6f 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-ca.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-ca.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Catalan Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -122,4 +126,4 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \message{Catalan Hyphenation Patterns `cahyphen' Version 1.11 <2003/07/15>}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-cs.lua b/Master/texmf-dist/tex/context/patterns/lang-cs.lua
new file mode 100644
index 00000000000..366a206d14a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-cs.lua
@@ -0,0 +1,108 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["characters"]="acefhijklnoprtyíúčř",
+ ["data"]="koe-fi-ci-ent koe-fi-ci-en-ty pro-jek-ční úhlo-příč-ka úhlo-příč-ky",
+ ["n"]=5,
+ },
+ ["metadata"]={
+ ["mnemonic"]="cs",
+ ["source"]="hyph-cs",
+ ["texcomment"]="% Czech Hyphenation Patterns (Pavel Sevecek, v3, 1995)\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: czhyphen.tex (), czhyphen.ex ()\
+% Author: Pavel Ševeček <pavel at lingea.cz>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+%%% ====================================================================\
+% This is CZHYPHEN.TEX, containing czech hyphenation patterns.\
+% Prepared by:\
+% Pavel Ševeček\
+% Lingea s.r.o., Brno, Czech Republic\
+% E-mail: pavel@lingea.cz\
+%\
+% This is free software; you can redistribute it and/or modify\
+% it under the terms of the GNU General Public License as published by\
+% the Free Software Foundation; either version 2 of the License, or\
+% (at your option) any later version.\
+%\
+% This file is distributed in the hope that it will be useful,\
+% but WITHOUT ANY WARRANTY; without even the implied warranty of\
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\
+% GNU General Public License for more details.\
+%\
+% You should have received a copy of the GNU General Public License\
+% along with this program; if not, write to the Free Software\
+% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\
+%%% --------------------------------------------------------------------\
+% \\message {Czech Hyphenation Patterns (Pavel Sevecek, v3, 1995)}\
+%\\lefthyphenmin=2\\righthyphenmin=2\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyzáéíóúýčďěňřšťůž",
+ ["data"]=".a2 .a4da .a4de .a4di .a4do .a4dé .a4kl .a4ko .a4kr .a4ku .ale3x .a4ra .a4re .a4ri .a4ro .a4ry .a4rá .a4sa .a4se .a4so .as3t3 .a4sy .a4ta .a4te .at3l .a4to .a4tr .a4ty .a4ve .b2 .c2 .ch2 .cyk3 .d2 .dez3 .d4na .dne4 .dneš4k .d4ny .dos4 .d4ve .d4vě .d4ví .e2 .e4ch .e4ko .es3k .es3t .e4ve .f4ri .g2 .h2 .h4le .h4ne .i2 .i4na .i4ni .i4no .is3l .j2 .j4ak .je4dl .j4se .j4zd .jád4 .k2 .k4li .k4ly .kří3d .l2 .le4gr .li3kv .m2 .mi3st4 .moud3 .na3č4 .ne3c .neč4 .ne3š .ni2t .no4s3t .n4vp .ná1 .nář4k .o2 .o4bé .ode3 .od3l .od3rá .o4ka .o4ko .o4na .o4ne .o4ni .o4no .o4nu .o4ny .o4ně .o4ní .o4pe .o4po .o4se .o4sl .os4to .os3t3r .os4tě .ot3rá .ot3v .o4tí .o4tř .ově4t .o4za .oz3do .o4zi .o4zo .o4zu .o4šk .o4šl .o4ži .p2 .pa4re .pa3tř .polk4l .po3č4 .p4ro .p4rý .p4se .pu3b .r2 .rej4 .re3s .ro4k .roze3 .roz3r .ru4dl .s2 .s4ch .s4ci .sem4 .se3pn .s4ke .sk4l .s4ká .s4le .s4na .s4ny .s4pe .s4po .st2 .s4tá .s4ži .t2 .u2 .u4ba .u4be .u4bi .u4bo .u4de .u4di .u4do .u4du .u4dí .uh4n .uj4m .u4ko .u4ku .ul4h .u4ma .u4me .u4mi .u4mu .u4ne .u4ni .u4pa .u4pe .u4pi .up4n .u4po .u4pu .u4pá .u4pě .u4pí .u4ra .u4ro .u4rá .us2 .u4so .u4st .u4sy .u4sí .ut2 .u4vi .u4ze .u4če .u4či .u4čí .u4še .u4ši .u4šk .uš4t .u4ší .u4ži .už4n .u4žo .u4ží .v2 .va4dl .v4po .vy3 .v4zá .vý1 .v4ži .y4or .y4ve .z2 .za3 .zao3s .zar2 .zač2 .zd2 .z4di .z4dr .z4ky .z4mn .z4no .z4nu .z4ně .z4ní .z4pe .z4po .z4tř .z4ve .z4vi .č2 .č4te .é2 .í2 .ó2 .š2 .še3t .š4ka .š4ke .š4ky .š4ťo .š4ťá .ú2 .ú4dů .ž2 a1 2a. aa3t2 ab3lon ab4lý ab3ri ab4sb ab2st ac4ci a2d a3da a3de a3di ad2la a4dli a4dlá a4dlé ad4me ad4mu a3do ado4s a3d3ra ad3ri a3drž a3du a4duž 3a3dva ad3vo a3dy a3dá a3dé a3dě a3dí ad4úz ad4úř a3dů a3dý ae4vi afi2a a2g a3ga ag4fa a3go ag3ro a3gu a3gá ah4li ah3v a2i a3in ai4re a3iv a2jd a2jm aj4me aj2o a2k a3ke a3ki a3kl ak4ni a3ko a3kr a3ku a3ky a3ká a3ké a3kó a3ků a3ký al4fb al4kl al4tz al3ží am4bd am4kl am4nu amo3s am4ži a4nae a4name an4dt ane4sk aneu4 an4sc an4sg an4sl an4sm an2sp an4sv an4tč an4žh ao4ed ao4hm ao4stř ao4tč ap4r. a4pso ap3t a4př. a2r a3ra ar4dw a3re a4rer ar4gl a3ri ar4kh a3ro a4rox ar3st a3ru ar2va a3ry a3rá a3ró ar3š2 ar4šr a3rů arůs3 a3rý a2s a3sa a3se a3sh a3sin as3ná a3so as3pi as4tat a4stk as4tm a4stru. as3tv a3su a3sv a3sy a3sá a3sé a3sí a3sů a2t a3ta at4ch a3te a3ti a4tio at4kl at3lo a3to a3tr at3re at3ron at3rov a4tru at4rá at4th a3tu a3tv a3ty a3tá a3té a3tě a3tí a3tó at1ř a4tří. a3tů a3tý a2u au4gs a3uj auj4m aus3t a3uč 2av av3d av4d. av3lo a4vlu a4vlí av3t av4ti 2ay ay4on az3k az3la az4lé az3ni a3zp a2č a3ča a3če a3či a3čl ač4má a3čo a3ču a3čá a3čí a3čů a2ň a3ňo a3ňu aře4k a3ří a4špl a4špy a2ť aú3t 2b. 3ba. ba4br ba4chr ba3ka ba4se 2b1c b1d be4ef be4et bej4m be3p beu4r be2z3 beze3 b1h 1bi bi2b3 bis3 bist4 bi4tr b1j 2bk 3bl. bl4bl b2lem b2les 3blk b4lán b2lém b1m 2bn 1bo bo4et bo4jm bo4ok bo4tr bou3s bo4šk b2ral b2ran 2bri b4rodit b4rou broz4 b2ru b3ru. b3rub b2rán 2b1s2 bs3tr 2b1t btáh4 bu2c bu4en 3by. bys3 by4sm by4tč by4zn b2z 1bá 2b1č bé4rc 1bě. bě3ta 1bí 3bín bí4rc 2bň b3řa b3ře. bře4s b1ří 2bš2 2c. 1ca cad4l ca4es 2cc 1ce cech4 ced4l celo3 ce4ns ce4ov ce4ps cer4v ce2u 2ch. 1cha 4chalg 3che 4che. 2chl ch4ly ch4mb 2ch3n 2cht 4chte 1chu ch4u. 1chy 1chá 2chř 1ci cien4c cik4l 2ck2 c4ket ckte4rý 2cl c3la c3lé 2cn 1co co4at co4mm co4žp c2p 2ct c2ti ctis4 ct4la ct2n c3tv c2tě cuk1 1c2v cy2 1cá 1cí cí4pl 2cň 1ců 2d. 1da da3d da4jš da4kl da4tr d1b d2ba 4dbat. d2bá 2d1c dch4l 3dch4n d1d dd4ha 1de de4bre de3hn de3jd dej4mo de3kl de3kv de2na de2oz de3sl de4sm de4so de2sp des4t de3str de1x de4xt de2z de3zn dez3o de3čt de4žp 2d1h 1di di4gg 4dind dis3k di4so d1j dj4us 2dk d3kv 3dl. d1la d4lab d4lak d3li 1dln d2lou d3lou. d2lu d3luč d4láž d1lé 2d1lí d2lů d1m 1dmd dmýš4 2dn 1do 4dobl 4doboj dob4rat do3by do3bě do3bý do1d 4do4dd 4do4dj dod4n do3h doj4m 4dokn 4doly do3mn domoh4 do3p do4pc dop4n dor2v do1s dos4p dos4tiv do3t do3uk do3uč do3z2 doz4n do3č 4do4čn doč4t do4žp 4dran d4rap d1re d4ren 3drobn d3ros d3rou d3roš dr4sc d3ruš d3ré d3rý d4rýv 2d1s2 ds4ků ds4po d1t d3tl d3tř 1du dum3ř du3na du3p du4pn 2dur du3si du4í. d2v d4vac d3ve d3vl d3vr d3vy d3vá d3vě d3ví 1dy dy4su d3zb d3zd d3zn 1dá 2d1č 1dé 1dě 3děj 1dí 2dň d1řa dře4k d4řep dře4pn d4řev d1ří d2řít 2dš2 d3šk d3št 1dů 3dů. dů3s 1dý d2ž2 2e. e1a ea3dr e2ar e1b eb4er ebez2 eb4li e2bř e4ch. e3chl. e4chm e3cho e2chr e3chv e4chť ed4be ed4kv ed1l ed2ma e3dmn ed3v ed4ří e1e ee4th ee3xi eg4gi e1ha e1he ehno4 eh4ně e1ho e1hr e1hu e1hy e1há e1hý e1i eilus3 ej3ag e3jas e1je e3jed ej3ele e3jez ej3in e3jis ej1m ej3mo e3jmu ej1o ej1u eju3st ej3v e2k e3ka e3ke e4kly e3ko e3kr e3ku e3ky e3ká e3ké e3kó e3kř e3ků e1la e4lau el4dv e1le e1lo e1lu e1ly el4ze e1lá e1lé e1lí e1ml e4mlí emo3k e1mr e1my e3má e1mě e1mí e3mř e3mů e1mý em3že en4dv enitos4 en4sc en4si ent3r e1o eo3by eoch3r eod3l eo4du e4ole eo1s eo2st eo4tř eo3z eo4zb eo4zd eoše3 epa3t e2pl e4pni ep2no e4pný epoč3t epro4zř ep4tl ep4tm ep4tn e4ptu epy3 2er e1ra er4a. e1re e1ri e1ro er3s er4s. er4sn e1ru e1ry e1rá e1ré e1rů e1rý e1s e4sag e2sce e4sin esi4s e2sk es4k. e4s4kn es3ku. es3ky es3ké e2sl e4s3li e4sly es2m e4sp. es4pe e2st e4st. e4ste es3tiž es4tol e4strou es3tán e1t e4tki e4tkr e4tli e4tly et3ri et3ro et3rů et1ř et4ún e1u eu3b eu3ct eu3d eu3k eu3m eu4m. eu3n eu3p eu3r eu4r. e4ura eu4ras eu4rg eu3s2 eu3t e4u4t. eu4tra eu4ts eu3v eu3z eu3ž e3vd eve4š e3v2k e4vsk evy3 evyjad4 evypá4t evy4čk evě4tr ex4ta e3xu ey4or ey4ov ezaos3 ez4ap ez4bo ez3de ez3dov ez3du ez4dě e3ze ez4ed2 ez4ej ez4el ez4er ez4es ez4ez ez4eš ezis4 ez4it ez4le ez4ná ez4ně ez4py ez2t ez4ác ez4áh ez4če e3zí e3zř ez4ře e1á eč4kat e1čt eč4te e4čti e4čtí e2ň e3ňo e3ňu e3ňá e3ón e1ř eře4k eř4ku e3ří e2š e3še e3ši e4ška e3šl eš4lá e3šo eš4to eštíh4 e3ší eú1 eúmy4 eú3n eú3p eú3t eú3č ežíš4 1f 2f. fe4in fene4 fe4ue fi4em fi4fl f2l f3lí fló4r fm4no 2fn 2fr f4ran f4ras 3frek f1ri 2fs fs4te 2ft fu4ch 2fé f2ú 1g 2g. ga4uč ge2s ghou4 3gic 3gin gi4ím g4lom 2g1m 2gn g4noi g4nos go1 go4hm 3graf gu4el gu4it gu3m gu4m. gus4t gu3v 2h. ha4ag ha4ar ha4bl ha4br ha3dl ha4dla ha4ke has3t hatos4 ha4yd h2b h2c 2hd he4br he4id hej4s he2s he2u he3x hi4an hi3er hi4gh hi4re 2hk 4hla. h4led h3len 2hli 4h3lo. h3lob h3lop h3lov h3luj 2h1ly 4hlá. h4lás h3lí. 4hlík 2hlý h2m 2h2n h3ne h4ned h3niv h4noj 3hněd 3hodin ho3str hos4tě 4hove 4hovna 4hovny 4hovná 4hovně h2r hra4p 2h1t h4tin h2tě h4tít hu4ch hu3mo hu4tň 2h2v hyd1 hy4do hy4ps hys3 hy2t3r hy4zd h1č 2hň hř2 hř4by hý4bl h2ž 2i. i1a ia3d ia3g2 i4al. ias4t ia4tr i1b ib2l i2b1r i1ch i4chž i1d id4ge id2l id4lo. i4dlý i1em i1en i1et if1r ig4ne i1h i2hl i3hl. i4hli ih3n ih4na i3im i1j ijed4 ij4me ij4mi i2kl ik3le ik3lo. ik3m ik4ry i4kve ik4úř i1l il4ba ilič4n i4lnu ilu3 i1m i4mla i4mly i4mun i2n i3na ina3d in4cm in4dl i3ne 3infe in4gh in4gp in4gs in4gt i3ni i3no i3nu i3ny i3ná i3né i3ně i3ní in4šp i3nů i3ný i1o io4sk i2ps i1r iro4s i1sa is3c is4ch is4k. is3ka is3ke is3ko. is3kr is3ku is3kv is3ky i3slav is3lo is3lé is3pl is3po is1t is4tal is4tat is4th ist3v is3tí i1sy i3sá i1t it1r it4rh it4rp it4se it4su i2tv i1um iv3d i1x ix4td i3zp iz1r i1á i1čl ič3t ič4tl ič4to i2ď i1é ié4re. i1íc i1ím i1ó i1ř iř4kl iř4če i2š i3še i3ši iš3k iš4kr iš4kv i3šo iš4to i3šu i3šá i3ší i2ž i3ža i3že i3ži i3žo i3žu i3žá 2j. ja2b2 jac4k ja4cq ja3d ja3g j3akt j1b2 jbyst3 2j1c j2d j3dob j3dok j3dos j3dr j3dá jd4ří j3dů jech4 j3ef j3ex jez3dí jg4ra 2j1h 1ji ji4ch jih3l ji4mž j4ina jis3k jit4ro ji2zv j1j 2jk j3kv 2j1l j2m j3ma j3mi jmou3d 2jmí 2jn jne3 j1ob j1od jod2ř j1oh j1op j4ora j1os jo3sv j2ov j3ovl j1o3z2 2jp jpor4 jpo4zv jpříz4 2j1r 2j1s2 j4sem j4si. j4sk. js4ko js4ká j4s4ků j4s4me j3sn j4sou. j4souc js4po j4s4te 2j1t j3tl ju4an ju3na ju3p j1us ju3sp ju3t ju4t. ju3v ju4xt ju3z j1už ju3ži 2jv2 j3vd j3vn 2jz j3zb j3zd j3zk j3zn j3zp jád2r 2j1č 2jď 1jí j3št jš4ti j3šť 2jú1 jú3n jú3č jú3ž 2jž 1k 2k. ka4bl ka4ch ka3dl 3kaj ka3ka 3kami 3kaně ka2p3l ka2p3r ka2ps ka4pv ka2př kas3t kast3r 3kat ka4uč 3kav 3kač 3kař kaš3l ka4šp 2k1c k2d k2e ke4bl ke3jo ke4pr ke4ps 3ket 2kf 2kk k2l 3kl. 4k3la. k3lej 4k3li. k4lib k3lic 4klička 4klo. k3los 2k3ly k3lá. k3lé k3ló k3lý 2k2m k3mě 2kn kna4s ko3by 3kof ko4jm ko2př ko4sk ko2t3v kous3k 3kov ko3zá 4kroa k3rob k3rof kr2s kr4ú. 2ks 2k1t kt2r kuch4 ku4fř ku4hr 3kuj ku3se ku3si ku3su ku4th ku3v 2k2v k4vrň 3kyn ky2pr kyp3ř ky4zn 3kác ká4pl 3kár 3kář 2kč k2ň k2ř2 k3řej kš4ti 3ků. 2l. 1la. la4br lab4s la3ka la4nq la4ps 4la3si la4vš la4y. la2zm 2l1b 2l1c 2l1d ld4ne le4ad le4au lech3t leh3n le2i 1lej le3jo 4lejšk 1lel 4lench lepa3d lepo4s le4pr le4ps le4sc le4sm le4sv let4li let3m le2tr le4tč le4uk le4vh le4vk le3xi lez3n 2lf 2lg 2lh 3lhan 1li li4az li4bl li4bv li4dm lind4 3lio li4tň li4vr 2liž 2lj 2lk l4kat l2kl lk4nu 2ll 2l1m 2ln l4nul lo3br lo4id lo4is 1los lo3sp lo3stř lo3sv lo2tr lo4tř lo4u. lo3z loz4d lo4šk 2lp l2pě 2l1s2 l4sla ls3n lst4n l4stí 2l1t lt4ra lt4ru lt4ry lu4id lu4j. lu4k. lu4lk lu4m. lu4mn lu3pr lu3va lu3vl lu3vy lu3ví 2lv 2lz 1lá. lá4jš lá4vš 2l1č 1lé. 1lík lí4pl lí4zn 1líř 2lň 2lš2 l3št l4štý 1lů 1lý lý2t 2l2ž 2m. 1ma maj4s ma4kl ma4kr 4mald mas3k mat3r ma4tra ma4vš maz3l 2m1b 2m1c 2m1d2 m2dl 1me 3me. me4go me4is met3re me3x mezi3s 2mf mh4le 1mi mid3l mik3r mi4xt 2mk2 3m2kl mk4la mk4li m2l 4mla. 2mle ml3h ml4h. 2mli ml4sc ml4sk 4mlu. 2mn m3na mna4s m4noh m3nos m4noz 3množ m3ná m3né m4néz m3něj m3ný 1mo mod3r mo2hl mo2k mo2s mo4s. mot3ř 4mout moza4 mo3zř moú3 2mp m4plo mpo4s m2ps mp4se mp2t mr2s 2m1s2 m4stl 2m1t 1mu mu4fl mu3n mu4n. mu4nd mu4nn mu4ns mu4nš 2muš 2mv mys3lo my4šk 2mz 3má. málo3 má2s 2mč m2če mí1c mí4rň 2m2š mš4či mš3ť mš4ťan. 3mů. 3mý. m2ž 1n 2n. 3na. na3ch na4do na4em na3h na4h. na3jd na3ka nam4ne na3p2 na3s2 na4s. nat2 na3tl na3tř na3z naz4k na4zš na4č. na3š naž4n 2nb 2n1c n4chc 2n1d nd4hi ndo4t nd2re nd4ri nd4ří ne1d ne4gl ne1h ne3h4n ne2j nej3t nej3u ne3kl ne4kro ne3kv ne4m. ne3p ne3s2 ne4s. nes4le ne4ss 4nesti ne3tl net4r ne3ud ne3v2 ne4v. ne3z nez4n ne3šk ne3šť 2nf n3fr 2ng ng1l ng4la ng4le ng4lí n4gro ng4vi nik4t ni4mr ni4mž 3nio 3nisk 2nitř n1j 2nk 2n1l 2nn no3b2 no4bs no3hn no4hs no4ir no4mž no4sky no3sm no3str not4r no3z no4zd no4šk 2nož 2n1s2 n2sa ns3ak ns4ko n4soc ns3po nst4ra 2n1t nte4r3a nt4lem nt4r. nt3ru nt3rá 2nub nu4gg 3ny. 2nz 3nák ná3s2 ná4s. 2n1č 2nď 2nív 2níž 2nó 2nš2 n3št nš4ťo nů2 2nž 2o. o1a oang4 o1ba o1be obe3j obe3s obe3z ob1l ob1r ob4rň o1bu obys4 ob3z o3bé ob3řez o1c o4chl o2chr oc4ke oc4ko o4ct. oct3n ocy3 oc4ún od3b odej4m ode3p ode3s od1l o4doc odos4 odo4tk od3ra od4ran od3rů o3drž od3v od1ř o1e2 oe3g oe3ti o2fl ofrek4 og2 o3gn o1h oh4ne o1i oi4ce o4int o1j o4jar oje4dl o4jmi o4jmov o4jmu o4jmů oj2o o4juz 2oka ok2te o1l ol4gl ol4to o1m om4kl om2n o2n o3na ona4s o3ne o3ni o3no ont4ra o3nu o3ny o3ná onář4ka o3ně o3ní o3nů o3ný o1o oo4hř oote2 opoč3t opro4s o2ps o4ptu opá4t o4př. opřej4 opře4jm o1ra o4rae or4dm o1re o1ri o1ro or3st o1ru or4vá o1ry o1rá o3ré o1rů orůs3 o3rý o1sa o4sai ose4s osi4d o1sk o4s3ke o4sku osk3v o4ská o4ský o1sl os4la os4li os4lý os3mo os4mu o4st. o4stg o4stm os4tor os3trů o4sté o4stš o4stý o1sy o1t ot4kl o4tlý oto3s ot3ro ot3ví o3tí o3tř ot3ři o2u ou3bě ou3dě ou4fl ou4il ou4is ou4k. ou3ka o4ukl ou3kr ou3ká ou3m oup3n oupo4 ou4s. ou3sa ou3se ou4sk ou3sm ou4tv ou3v ou4vl ou4vn ouz3d o4učk ou3ži ovi4dla o4vsk ovy2p o2všt o1x o2z o3za oz1b oz4d. oz3dá oz3dě oz3dí o3ze oze3d2 ozer4 oz1h o3zi oz3j oz3k oz4ko oz1l oz3m o4zn. o3zo oz3p oz4py oz4pě oz4pí oz3ro oz3ru oz3rů oz3t o3zu o4zut oz3vr oz3vá o3zí o3zů ozů4s o1č oč2k oč4ka o2ň o3ňa o3ňo o1ř oři2s o3šk o4šku o4šky o3šl oš4lá oš4mo oš4ti oš4ťu o3žl ož4mo 1p 2p. pa4ed pa4es pa4kl pa3si pa4t. pat4ri 2p1c pe4al pede4 pe4ig pe4np peri3 pes3t3 pe4tra 3peč pi4kr pi4pl 2pk p2kl p2l 3pl. 4p3la. pl3h pl4h. 4p3li. 4plo. 2pn p2nu po1b2 po3c2 3pod podbě4h pod4nes po3dru po3drá po3h poly3 po3m2 po4mp po4ol po3p po4p. po4pm po1s2 pos4p post4r po3t2 po4t. po4tn po3uk po3uč po3už 3po3v po3z2 po4zd poč2 po3čk poč3te po3ří po4šv 2pp 4pra. pra3st pr2c pro1 prob2 pro3p pro3t4 pro3z pr2s 4prán prů3 pse4s 2p1sk p4sut 2pt p4tej p4ter p4tev pt4ri p3tu p4tá. pu4dl pu4tr pyt3l pá1 pá2c pád3l pá4nv pá4sl 2pč pé4rh 2př. pře3h pře3j pře3t4 pře3z pře3č2 při3 přih4 2pš pš4ti 2pť qu2 2r. 1ra. ra4br ra4em ra4es ra4ff ra4hl ra4hm ra4jg ra4jš 2rak ra4nh ra3si rast4r ra4vv ra4wl ra4y. ra4yo ra4ďm 4raži r1b r2bl r1c rca3 r3cha r3cho rc4ki r1d r4dla rdo2s re4ad re4au red4r re4et re3kl re3kvi re4mr re2sb res3l retis4 ret4r re4um r1ha r3hl. rh3n r1ho r3hu r1há ri4bb 1ric ric4ku ri4dg ri4dr ri4fl ri4gh ri4zm 2rk r2kl r1l 2r1m r4mio 2rn rna4vš rn4dr ro4ad ro3by rod2l ro3d4r 3rofy ro3h ro4h. ro4jb ro4kš rom3n romy4s ropát4 ro2sb ro4skv ro4sky ro3sv ro3ti ro3tl ro4tč ro3vd rově4t 3rový roz3d roz3n ro4zo roz3v ro3zá ro4čp rpa3d 2rr rr4ha rr4ho 2r1s r2st r4stu rs3tvě rs3tvý 2r1t r2th r4trá rt4sm rtu3 r2t3v rt4zu 1ru. ru3se ru3si rus3k ru3ži 3rvaní r1x 1ry. rych3 ryd2 rys3ky rys3t ry4zk ry4zn ry4í. ry4šk 2rz rz3d rz3l rád4l rá4dž 1rák rá3ri 1rář r1č 4rčitý. rč3t 3ré. 2ró 2rš rš4ní rů4m. růs3ta rů4v. 3rý. rý4zn 2s. sa4pf sa4pr sas3k s2b2 s2c s3ca s3ce. sch2 sch4l sch4n 3schop s3ci sci4e s3cí s2d 1se se4au se3h se4ig se4il sej4m se4ku 3sel se3lh 3sem ser4va se3s2 ses4k se4ss se4stra se4stru se4stř set2 se3tk se3tř se4ur se3z se3čt 2sf s3fo 3sfé s3fú 1si 3sic 3sif si4fl sig4no 3sik si3ste 3sit s2j s3ju s2k 4skac s4kak 4skam s4kok 2skon skos4 4skot sk4ra sk4ru sk4ry 4skve sk4vo s3kán s3ků 3sl. 4s3la. s4lav s3le. s4led s3lem s3len s3let s4lib s4liči 3sln 4s3lo. s2ly s3ly. s1lí s2ma s4mek s2mo 2sn s2na s3nat s2ne s3ne. sn4tl s2ná s3ná. s4níd 1so sob4l so3br so4sk so4tv sou3h sou3s souz4 so4šk s2p s4pol spro4s 1sr 2ss ss4sr 2st. 4sta. s3taj s2tan st4at 4stec s4tep st4er s4tero s4tich 2stil s4tink 4stit. 4stič st3lo 2stn 4sto. s4tona 4stou. 4str. 4stram s4trik 4strn 4strác 4stupni s2tv st4ve 3ství 4sty. s4tyl 3styš s2tá 4stá. s3tář 4stě. s4těd 3stěh s2těr s2těž s1tí 2stí. s3třej 1su su4ba su4bo suma4 su3ve s2v sy3c sych3r sy4nes sá2d 3sáh sá2kl 2s2č s3či 1sé 1sí 2sň 2sť s3ťo 1sů s2ž 2t. 1ta. ta2bl tac4tvo t2a3d 1taj ta4jf ta4jg 4talt 4tand 3taně t1ao 2tark tast4 ta3str ta4čk 2t1b 2t1c 1te 3te. te4ak te4fl te4in 4teném teob4 tep3l ters4 tes3ta te4tr te4uc te4ur te4ut 2tf 2tg 1ti ti4gr 2tih ti3kl tin4g ti4pl ti3sl tis4tr ti4tr 2titu tiz4r 4tizí tiú3 2tiž 2tk2 t4kal 4t2kan t4kat t2kl tk4la tk4li 4tkně t2ká 2tl 3tl. 4tla. t1le tles3 3tlm t3lo. t4lou tlu3 tlu4s t1ly t1lé 2tm t2ma 2tn t3ní 1to to4as to3b tob4l to3dr to4hm to4ir 2toj tol4s to4ol 4top. 4topt 4topu 2torn 2toup 2tp t3rant t4rea t4ref tre4t 4tric. trip4 t4rit t4rog t3rol tro4sk t4rou 4trouh 4troň. 4trun t4rus 4t4ruž t3ráln 4tráš 2trč t3rům t3rův 2trý 2t1s ts4ko ts2t 2t1t tt4ch tt4ri 1tu. tu4ff 1tuj tu4lk 2tup tu4r. tu3ry tu4s. tu4ť. tu3ži t2v 2tve 2t3vi t4vinn t4viš t4výc 1ty. ty4gř ty2la ty4ře ty4řh ty4řj ty4řo ty4řr ty4řú 3tá. tá4fl t2č t3či 2tčí 1té té2bl 3tém 1tě tě3d4l 2těh 2těnn 2těp 1tíc 4tíc. 4tíce 1tím 2tín 2tír 2tř t4řeb třeh3n t2řel t2řic t3řil tř4ti t1řu t2řá 3třáb tří4s 2tš t3št tš4ti 1tů 1tý. 1tým 1týř 3týš u1 2u. u2at u2b u3ba u3be u3bi u3bo ubs4t u3bu u3bá u3bí. u3bů uc4tí 2u2d u3de u3di u3do u3dru u3du u3dy u3dí ue4fa 2uf u2hl uh3lá uh3no u2in u2jm u2k u3ka. uk4aj uk4al uk4at u3ke uk3la uk3le u3ko u3ku u3ky uk4á. u3ků ul4fa ul1h ul4pí u2m u3ma u3me u3mi um4pl um4ru u3mu u3má 3umř u2n un4dl u3ne u3no u3nu u3ně u3ní u3nů un4žr u2p u3pa u3pe upe2r3 u3pi u3pln u3pu u3py u3pá u3pě u3pí u3pů u2r u3ra u3re u3ri 2u3ro u3ru u3ry. u3rá 1urč u3rů u2s us3ky us3ká us3ké us3ký us1l us2lo u3so u4ste u4sty u4sté u4stě u3stř u4stš u4stý u3su. u3sy u3sá u3sí u3sů u4tro u4trá u2v u3vi u3vu u2z u3ze u3zi uz1l u3zo u3zu u3zí u2č u3ča u3če u3či u3čo uč3t u3ču u3čá u3čí u2ď u2ň u2š u3še u3ši uš4kl u3šo uš3tí u3šu u3šá u3ší u2ž u3že u3žo u3žu u3žá u3ží 1v 2v. va3dl va4jť va4kl 2v1b 2v1c v2ch 2v2d v4dal v3di v4děk v4děč ve3dle ve3jd 3ven ve2p ve3ps vep3ř ves3l ve4sm ves4p ve3sta ve3t4ř ve2z3m vi4ch vide2 vi4dr vi4et vi4kr vi2tr 2vk v2kr v2l 2v3la. 4vle. 4vlem 2vlo 2vm 2vn v4nad vo3b vo4ic vo4ja vo4jb vo4jd vo4jj vo4jm vo4jř vo2s vo4tř vou3 vous2 v2p vr2c vr2dl 4vrny v1ro vr4st vrst3v vrs4tvě 2vs2 v1sk v3stv 2v2t vy3c vy3d2 vy4dra vyp2 vy3s2 vy4sn vys4t vy3t vy3č vyč4k vyš2 vy4š. vy4šm vy4šš vy4žl v2z2 vz4no vz4né vz4ně vz4ní vá3ri 2v2č v3čá v3čí v4čír vě4cm vě3t4a více3 ví4hat 3vín 2vň 2vří v3řín v2š2 vše3s v3ští. 3výs vý3t 3vý3z v2ž2 wa4fd 3war wa4re we2 2x. xand4 2xf xisk4 2xn 3xov x1t xt4ra xy4sm y1 y2a y2bl yb3ri y2ch y4chr y2d1l yd4lá y2dr yd4y. y2e y2gr y3hn yh4ne yj4ma yj4me y2kl yk3la y3klop yk4ly ymané4 ym4kl yna4s y3ni ype4r yp4si yp4tá y2př yr2v y2s y3sa y3se y3si ys3lu y3sm y3so y3sp ys2t ys3te yst4r y3su y3sv y3sy y3sá y3sé y3sí yt4me yu3ž y3vs yvě4t y3zb y3zd y3zk y3zn yz4ně yz4ní y3zp yz4po yč2k y2ň yř3b yřk4n yř4če y3ří y2š y3še y3ši y3šk yš1l y3šo y3šp y3šu y3ší yž2 y3žd 1z 2z. zab2l za4bs za4dk za3dl za4dn za3h za3i za3j za4jk za3k za4kt zal4k zam4n za3p2 za3s2 zat2 za3tl zat4r za4ut za3z zaz4n za4zš za4č. za3š zaš4k za4šs 2zb zban4 z2by zbys4 2z1c 2z2d z3di zdně4ní z4doba z4dobný zd4re zd4ví z2e ze3h ze3p2 4zerot ze3s2 zes4p zet2 zev2 ze3vn ze3z ze4z. 2z2f z1há z4ine z2j z3jí 2z2k z3ka. z3ky z3ké z3ků z3ký 2zl 3zl. zlhos4 zlik3 z3ly. z2m2 2zme z3mn z3my z4měn 2z2n 3znak z4nal z3ne. z3nic z3no z3nu z3ny z3né z3ně z4něl z3ní z4nít z4nív z3ný zo4tr zo4šk 2z2p z3pt z4pát 3zrak 2z1s2 2zt ztros3 z4trá z3tř 3zu. zu3mo zu3mě zu3mí zu3š z2v zva4d z3vař z3vi zvik4 zv4ně z3vod z3voj z4von zv4ro z4ván z4věs z3víj 3zy. 2zz zá1 záh2 zá4kl. 3záp zá3s2 zá3z záš2 2zč z3čl 2zň z2ř zřej3 z3řez z3řeš 2zš2 z3šk zš4ka z3št 2z2ú1 zú3č zú3ž zů3s á1b á2bl áb4ry á4bř. á3cho ác3ti3 á1d á2dl ádo4s ádos4ti ád1ř á1ha á3he áh1l á3hl. áh3n á1ho á1hr á1há á1j á4jmu áj4mů á4kli ák4ni á1la á1le á1lo á1lu á1ly á3lé á1lí á3my á3mé á1mě á3mí á3mý áne4v á1ra á1re ár2m á1ro á1ru á3rů á1s á2sc á2s3k ás4k. ás4kl ás4kn á2sla ás4ly á2sm ás4po á2st át3k át1r á1tu á1ty á1tí á3tý áv4si áv4sí áz3k áz3ni ázni4c áz4vi á2ň á1ř ář4ke ář4ků á2š á3še á3ší 2č. 1ča ča4br 2čb 2č1c 1če 3če. če1c čes3k 1či 2čk č3ka. č3ko č3ku č3ky 2č1m 2čn č2ne 1čo č2p 2čs č1sk čs4la čs4sr 2č2t č4tené. č4tený čt4la č4tový. 3čtv 4čtěn č3tí 1ču 1čá 1čí čís3l 1čů 2ď. 1ďa 1ďo ďs4te 2ď1t 3ďuj é1 é2d é3di é3do é2f é3fo éf1r é2kl é2l é2m é3ma é3me é3mi é3mo é3mu é3mů 4ére. é2s é2t é3ta é3to é3tá é2š é2ž ě1c ěd3r ě3ha ě3he ě3hl. ěh3lo ěh3n ě1ho ě3hu ě3hů ě3ja ě1je ě1jo ě3jů ě4klé ě3k2t ě1l ě1ra ěra3d ě1re ě1ro ěr3s ěrs4t ě1ru ě1ry ě1rů ěs3k ěs3n ět1a3 ět4ac ět1l ě1tr ět3ra ě4traj ět3v ě1tí ět3ří ě2v ě3va ě3ve ě3vl ě3vo ě3vu ě3vá ěv3č ě2z ě3ze ě3zi ěz3n ě3zo ě3zí ě1ř ě2š ě3še ě3ši ě3šo ě3šu ě3šá ě3ší ěš3ť ěš4ťs ě2ť ě3ťo ě2ž ě3že ě3ži ě3žo ě3žu ě3ží í1b íb3ř í3cho ích4t íd1l í1h í2hl íh3n í1j íjed4 íj4mů í2kr í1l í1má í3mé í1mě í1r í1sa í2s3k ís4kl ís4kn ís4l. ís3le ís4ln ísáh2 í1t ít3k í3t3ře íz3da íz3de íz3k í3zna í3z3ni í3zněn í2ň í1ř í2š í3še í3ši í3šo í3ší 1ň 2ň. 2ňa ňa3d 2ňk 2ňm 3ňov ň1s 2ň1t ó1 ó2z ó3za ó3zi ó3zo ó3zy 2ř. řa4pl řa4ďm 2ř2b 2řc 2řd ře3ch ře4dob ře1h ře3jd ře3kl ře3kv ře4kří řeo4r ře3p2 ře4p. ře4pk ře4pč řer4v 2řes ře3ska ře3sko ře2sp řes3po ře4sr ře3sta ře3stu ře3stá ře3stř ře3tl řet4ř ře3zd ře3zk 4řezl ře3čt ři1 řia3 ři3h ři4h. ři4hn ři4jď ři4l. ři4lb řil2n 4řine řis2 3ři4t. ři4v. ři4vk ři4vn ři3z řič4t ři3ř ři4š. 2řk ř2kl řk4la řk4li řk4ly řk4no 2ř1l 2ř1m 2řn 1řo 2řou 2ř2p 2ř1s řs4to 2ř1t ř2v 2řz řá4pl řá2sl 2ř1č 2říd ří4kř ří1s 2řš ř3št řš4ti 1š 2š. šab3 ša4vl 2š1c šej4d šep3t ši4mr 2š2k š3ka š3ke š3k3li 4š3kou 4škov 3škr šk4ro š3ku. š3ky 2šl š2la š2li š3liv š2lo šlá2 š2lé š2lý 2š1m šmi4d 2šn š2p 2š1s 2št š4tip št4ka št4kl š4těk š2těs š4těv š4típ š2v ší3d š2ň š3ší 2š2ť š3ťo š3ťu š3ťá 1ť 2ť. 3ťal 2ťk 2ťm 2ťt ťáč4k 1ú ú2c2 ú2d új4ma ú2k ú2l ú2n ú2p ú2t út4ko ú2v ú2z úz3k ú2č 3úče úře4z úš4ti ú2ž ů1b ů1c ů1hl ů3jd ů4jmový ů1le ů1my ů1mě ů1ra ůr4va ůr4vy ů1s2 ů2st ůs3te ůs3tán ůt2 ů3tkl ů2v ů3va ů3vo ů3vě ů2z ů3zo ů2ž ů3že ů3ži ů3žo ý1b ý3cho ý1d ýd4la ý1h ý1j ý1l ý1ml ý1mě ý2n ý3no ýpo3č4 ý1r ý1s2 ý2sk ý1t ýt4ku ýt4ky ý1u ý4vli ý3zk ý3zn ý4zvu ýč4ně ý1ř ýš3l 1ž 2ž. ža3d ža4tv 3žač 2ž1b 2ž1c 2ž1d že2b3 žeh3n že4ml že4zg ži4dl ži4jm 3žil ži2vl 2žk žk4ni 2žl ž4lic 3žlo 2ž1m 2žn žon2 2ž1s2 2ž1t ž2v žá4br žá4nr 2žď ží4zn 2žň 2žš žš4ti žš4tě",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=3636,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-cs.rme b/Master/texmf-dist/tex/context/patterns/lang-cs.rme
index 672dac5a990..3fd4c78a63f 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-cs.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-cs.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Czech Hyphenation Patterns (Pavel Sevecek, v3, 1995)
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -82,4 +86,4 @@
% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
%%% --------------------------------------------------------------------
% \message {Czech Hyphenation Patterns (Pavel Sevecek, v3, 1995)}
-%\lefthyphenmin=2\righthyphenmin=2 \ No newline at end of file
+%\lefthyphenmin=2\righthyphenmin=2
diff --git a/Master/texmf-dist/tex/context/patterns/lang-cy.lua b/Master/texmf-dist/tex/context/patterns/lang-cy.lua
new file mode 100644
index 00000000000..f6396a93ae2
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-cy.lua
@@ -0,0 +1,85 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="cy",
+ ["source"]="hyph-cy",
+ ["texcomment"]="% Welsh Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: cyhyph.tex ()\
+% Author: Yannis Haralambous\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% Welsh patterns\
+% Yannis Haralambous 1996\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghilmnoprstuwyáâêëïôö",
+ ["data"]=".ac4t .ad3ae .add5as .add3o .ad4eg .ad4eny .ad4fer .adl4 .ad3r .ae3a .af3a .af4an .aff3 .afl4u .af5lw .ag3w .am4le .am3s .an5ad .an4g3 .anghen5a .anghen4r .an2o .anrhyd4 .ansodd4e .an5te .an3w4 .an5we .ar4bo .ar4cha .ar5ddel .ared4 .ar4en .arff4 .ar4ge .ar2i .ar3we .ar4wed .as3g .as3t .aw4e .ban4as .ban4ed .bara5t .bel3y .be3t4a .bl2 .bl4e .br2 .br4e .call5 .ce4n .ch2 .ch4e .ch4l .ch4o .chollad4 .chr2 .chwyn5 .cl2 .cr2 .cy5we .dad3r .dd2 .ddefn5 .dd4i .ddi5an .ddi5dd .ddi3e .ddill5adas .ddill5ade .ddill5ado .ddill5adw .ddin4 .ddiw5eddas .ddiw5edde .ddiw5eddo .ddiw5eddw .ddwl3 .ddy5fala .ddy5fale .ddy5falo .ddy5falw .ddylad4 .deallad4 .defn3 .der4w .deth5 .di5an .di5dd .di3e .di3gy .dill5adas .dill5ade .dill5ado .dill5adw .din4 .diw5eddas .diw5edde .diw5eddo .diw5eddw .dr4e .dwl3 .dy5fala .dy5fale .dy5falo .dy5falw .dy5fo .dylad4 .dyrchafad4 .eb2 .eb3r .eb4rw .ec2 .ed2 .edl4 .edr4 .eg2 .egn3 .el4or .els4 .en3as .eny5na .er2 .erfy5na .ern4 .ewy5na .fadd3 .falch5 .fan3a .farn4ais. .fasg4 .fas5ge .ff2 .ff4a .ffer4a .ffe5ras .ffer4e .ff4o .ffor5t .ff4y .ffydd5 .ffynad4 .ffy5nas .fign5 .fis5g .fon4edi .fordd4 .for4o .for4w .for4y .fr4i .fryn4d .fydd5 .fyn5as .fyw3 .gal3e .gal5o .gan3l .gan5olas .gan5ole .gen5as .ger5b .geu5d .ghwy5na .gl2 .glaf5y .gl4e .gleid4 .gl4y .glyn3 .glywad4 .god3y .gof3a .goffad4wy .gollad4 .gr2 .grynho4em .grynho4wn .gwedd4er .gyd3 .gyf5al .gyf5arc .gyfer5byna .gyfer5byni .gyfer5bynn .gyffel5 .gym3o .gyn3a .gyn5e .gynef5 .gyth5ru .gy5we .hac4 .hadl4 .haf4a .haf3l4 .hagr3 .ham4le .han5as .han4g5 .hanghen5a .han5t .han5w4 .har5ddel .hared4 .har4en .har3n .harn4a .har3w .has3g .haw4 .heb2 .hec2 .hed2 .hedl4 .he4o .herfy5na .her4w .heur5 .hof4r3 .hol4y .holyn5 .hw2 .hwn4 .hwyl5u .hwyn5a .hwyr5 .hwyth4au .hyd4 .hydr4 .hy3ff .hyf4od .hy5fry .hy3g .hyl4 .hym3e .hym4u .hym4y .hymy5na .hymysg4 .hyn2 .hy3no .hy3rw .iach4 .iac5has .iac5he .iac5hw .ir3 .ladr3 .ledr4e .le3na .le3o .lest4 .lin3 .ll2 .llaw4e .lle5na .llo5nas .llon4e .llythr5 .lo3na .lon4e .ludd3 .lygr3 .lyn3a .lythr5 .man4ed .mant4a .mar4f .mign5 .mis5g .mol3 .mon4edi .mwyth5a .mwyth5w .myn5as .neilltu4ad .neis4i .nen3a .ner4w .ng2 .ngen5as .nghyt5u .nghy5wa .ngl4 .ng4w .ngy4 .ni5an .ni3e .ni5fei .nig2 .ni5ga .ni3ge .ni3gw .ni3gy .ni5re .ni3wa .niwl5 .no4e .no4w .nwl3 .nwyn3 .oddefad4 .od4l .of3a .of4o .of4u .og2 .og4l4 .ol2 .oll3 .ol5yga .ol5yge .olyn3 .or1 .orddad4 .pl4a .pl4e .rad3r .rag3l .ra3na .ran5d4 .rew3 .rhi5a .ria4 .rin4t .rug4l5 .ry3n4a .ryn4e .sas4 .ses4 .st2 .sych3 .sych5e .talad4 .tan4e .th2 .thag5 .th4i .tho5e .th4r4 .thrad4 .th4u .torad4 .tr2 .tr4a .trad4 .tr4o .tro4en .uch2 .wa5r4as .war4es .wedd4er .weithiad4 .welad4 .wen3a .west4 .wn4io .wobr3 .wybr4 .wy3by .wy4r .wyw3 .ydd4 .yd4l .yf4ar .ym4adw .ym3e .ym4yl .ymysg4 .yn4d .ys4b .ysg4 .ys4i .ys4n .ys4t a1a a3ar2 2ab ab3a ab4ad ab3ed ab3el ab5ine abl1 a2b1o ab4or abr3 a1bu a4bu. a4bum 2ac ac1a ac5ade acan3 ac4aol ac3ei ace3ne ac5enni. ach1 a4ch. ach5ac ach5aw a5chef ach3o ach3r ach5us a3chwa achwyn5 achy4 aci5mw acl3 ac3o ac3ta ac3te 4ad3ac ad3ad ad5afa ad3arf adar4g a4dd. add3ad ad3dal ad3dd add3eu add5ew add3f add3i add2o ad4du addun4 add3yc add3ys 2ad1e ad3eg ad3el ad4el. ad4ena ad4ene ad4eni ad4eno ad4enw ad3i 2adl ad3len ad5lys ad2na adnabydd4e adnabydded4 ad2no 2ado ad3oc ad3od ad3of ad3on 4adr. ad4red ad3ri adr4od adr3on ad4ru 4adunia ad5uniad ad5uro adwel4ed. ad3wi ad5wr. 3ad3wys ad5wyt ad1y ady4n ad4yrn 2aea ae4ada ae5an. aedd3 ae3i ael1 ael4edda aen3 ae3oc ae3og aer1 aerw4 aer5we aer5wy aes3 aest4 aeth5a aethr4 ae1w ae5wyd af3adw 4af5aid af4al af3an afan5e af4ann 4afar3 af5arn af4at 4af3au 2af3e 2aff aff3a aff3ed aff3ei aff3i affl3 aff3w aff3y aff4yr af3i afl3a afl5edi af4l3u 2afn1 af3odd 4afol af3ont 2afr af3ra af3res af5rif af4ru af5rwy af1u 2af1w af1y 2a2g ag1a ag3ad ag3al age3na age5ne ag3law agl3o ag3lu agl3w ag3n ag3od ag3of ag4ori ag1r ag3ri ag3ry ag1u ag2w ag3wa ag3wel ag3wn ag3wr ag5yma agy4w a1h2 ahan3 ahanad4 ahedr4 a2i 2aig 2ail1 ailen3 2ain 4ainc 2ait 2al al5abr al3ad 4al3ae alaf3 4alaid al3an al5arc al5aso al3ce alch3w al5cwl al4di al1e al5edau al3ei al3en al4ena al4es. al2fo al3fy al3i al4is all3a all3e all3i all3oc all3w all3y 3aln al3oc al3od al4ogia alo3na alo3n4e al3ono al3or alp4e al1u 4alwc alw3e 4alwr al5wst al3wy 4alwy. al1y 2am ambl3 am3d amdan5 amel5o am3er amgym5r amhen4 amhobl4 amhryd4 am5las am4led am4lf am4lg am5nif am4of am2or amor5w am4pa a4mwa am5wed am5wri am5wyd am3wyt amyn3 a2n 2an. an1a a4nab anadl3 a4nae a4naf an4afi a4nai an2as an3at4 a4nau a4naw 4anco an2da an5dda an4ddy an2de an2do an1e an2ed an3ed. an5eda an5edd. an5edo a4n3eg a4nel an3eli an5er. an5ewi 2anf an3fy 2ang1 ang3ad an4gd ang3e an4gf anghaff4 anghelf4 anghredad4 anghrist4 anghy4 anghyd4 anghydna4 anghyf4 anghyfar4 anghyff4 anghyfiawn4 anghym4 anghyn4e angl4 ang5or an3if an3igi 4annau an3oc an3od. an3odd an5og. an5og4ae 4anol an3ol. an3om an3ont an3or 1anr an5sic ans4ie ans4iw an5siwn an4ta ant5ac an5the ant3rw an1w an3wes 4anwl anwy4 an3wyd anwyn3 an1y any4l3 a1oe ap3a ap4cy ap5elw ap3l apl4a ap5ost ap5rwn ap5ryn ap5wll 2ar ar3ab aradr3 arae3 ar3af. ara5ff ar3an ar4an. aran3a aran3e arat4 ar3aw ar4ber arc3as arch5en ar5clo ar2da ar2de ard5es ar4dr ardyn3 ar1e ar2eb ar2ei ar5eid ar3eit ar3fa arfan5 arf5ed ar5fel ar4ff ar3fod ar1i ar4ian ar2m 4arn. arn5adwy. ar4nd 3arnh ar4no ar4nw ar4ny ar1o ar4od. ar4odi arogl3 3aror ar3os 5aros. ar4p3as arp3w ar3sy ar3te ar4th3 ar3ug ar3ut aru5wc 3arwai ar5wch arwd2 arw5der ar3wed 3ar3wi arw3n ar3wn. ar3wni ar3wy 4arwyn ar3y 2as. 2asas as5awr 1asb as5boe 2asd 2ased as4enn 2asf 2asg as5gal asgl3 asg4oda as3gwr asg3wy 2asia 4asie 2asl 2asn as4ny as4od. 2asoe 2asr 2ast as4tal as3tan astat5 as3te as4tl as4tr as5trus ast2w as5ty. as3tyl astyn3 2asu as3ur as5wir 2aswr 2asy as5ynn 2a2t at3ad at5alf ateb3 at3em ath3a athl3 ath3o ath4r3e athr3w athr5yc ath3w ath3y ato2i at3ol a3tô at3ran atr5oc at3rod atro5e atr5yc at3wy aty3na aty5ne a2u 2aul 2aw aw1a aw5art aw5chw aw5ddr aw5dry aw3ed aw3ei aw3el aw3es aw3f aw3ga aw1i awl5ed awn3a awr1 awr3d awy4r3 3áu. 1â bab4i bab5yd b3ac bach3 badd3 b3adw 1bae 2baet b1af b1ai b1an ban3a ban3e b4ann ban3o 5barch bar4f bar4lys. barn3 bar4wy b1as bas3g2 bast4 bat4a b4ath b1au bawd4a bawe5na b1d b1ec 2bed beir4a be4iw b1em ben4ae be3nas be5ned bengl4 bens4 bent4 b3ent. ben3w benwy5na b3ert b3esi bgal4 2b1i b3ia bi5aidd 3bib1 b3id3 b3ie 3b2ig1 b4inc bin2e b3io b3ir bisg4 b3it bl3af bl5air bla3na bla5nedi bla5nes 2blau bl5awd bl3ec bl4enni. blew3 4blwr b4lyc 4blyn bl5yn. bo4b4l b1oc 4b3odd bol3 b1om b2on bon4d b2r bra3na br3ed breg3y br3em br4enn br2i br4il br3ir brod4iae brog4 br4wd bryf3 bryn4d b1s2 bse3na bse5ne 2bu. 1bua budd4l bu4lo 3buo bw3a b1wc 3bwll b1wn b4wns bwr1 4bwyd b3wyd. 4b3wyf bwyllt4 3bwyn bwy4r3 2by b3ych. bydd5i b2yl 3bylla by3na by3ned by3nes byrf4 b4yrw 3byst. byw3 cabl4en c1ad cad3a cad3l cae4a caethiw4ed c1af c3ai cal3e cal3o cam4enn camn4 can3a ca4ne canghe5na can3l c4ann can5olas can5ole c3ant can4yd car4en car4ped. c1as casg4e 3cat ca4t3r c3au c3áu c1b cd2 c1e c3ed c5edig ceg3 c3el c2en ce3na c3ent cer5by cer4f cer3y ceu4l c3ff 3chae ch3af. ch4afb ch4afi chan3a changhe5na char4enn chasg4e chdr5y ch3eba ch3ebe ch3ebi ch3ebo ch3ebw ch3ech ch3ed. ch3edi 5chein chelad4 ch3ent chen3y ch3er. cher4f ch3esg 3chest 4chestio 4chestol 4chestwa 4chestwe ch3eta ch5ig. chleid4 chl5ent 4chmyni 4chmynnol chn5eg chob3 chobl4 ch3odd chon5ad4 ch3ont chon4y chra4 ch4ro 4chu. ch4ub 4chus 5chwant ch3wch chw4f ch4wi ch3wn. ch3wyf chyd3 chym4an ch4ynn chysg3 chys5o chyt3u chy5wa c1i cib3 cig1 c3in ci3od. cl2e cleid4 cl2i c1ll cllon3 cloe4 cl2w cl4wm cly4w clywad4 cn2 cno4en cn4yw cob1 co4bl4 c1oc c1od cod4l coffad4wy collad4 c1om c1on con4y corn4an cosb3 cr3ae cra4m 3crat credad4 cr4el cr3ie cring4 crof4 crog3 cron4a cro5nas cron4e cryg3 crygl4 cr4yl cr4ym crynho4em crynho4i cs3a c3s4aw cs3yn ct2a c4teg ct4id c1to ctor3 c3tr 1cu 2cus c1w c3wa cwast3 cw4fa cwm3 cwn4ed c3wy c4wyn3 cwy4r cyb3y 2c1yc cych3 cyd3 cydl4 cydr4 cy4f3a cyfer3 cyffel5 c1yl cyll5a cym3 cym4an cym4ero c1yn cyn3a c5ynau cyn3e cynef3 c2yny cy4se cysg3 cys5on cys3t cys3w cyth5rud cy1w cy3wa cy3wi cy3wy d1a2 dach3 d3ach. d5achwr d2ad dad3u dad3w d5adwy dae5ara dae5ared dae5ari dae5arw d2ael d4afe d4afo dag1 dag3w 4dail da5ion d4ait d4al. d4ald d4aln d4alr d2an3a d2an3e dan3f d2ano d2anu d2anw d2any dar3a dar4ana dar4d darf2 d5arne dar3w d5aryd 2das 2dau 2daw dawd3 d5awd. d1b ddad3r 4ddaf 3ddang dd4ani dd3ara dd3ari dd3arw 2ddas dd4aw ddd2 d4dda ddd4e dd4d4i4 dd3dr dd4du dd4dy dd5dy. dd3er. ddeth5 ddeuad4 dd4eug dd4ew dd2f dd4fg 2ddi. dd4ic dd4if ddif3a dd4ig. ddi3gy dd4il dd4im dd4ini 4ddit dd1l2 dd5len 2ddo. 4ddoc dd3odd 4ddom 4ddon3 dd2or3 ddr2 ddr4a ddr4e ddr4i ddr4o ddr4w dd4ry d2du 4dd3un dd5us. dd5waw 4ddwc dd2we 4ddwn 5ddwrn dd4wyn 3ddwyr dd2y 4ddyc dd4ydd dd5yf. ddym4d dd4yn ddy5nad 5ddyni 4ddynt 3ddyr 3deb. debr3 d1ec dech4a d1ed d5edd. deddf3 def3a d1eg d5egol. de1h deheu5 d2eil d4eim delff5 d3ella d3elle d3elli d3ello dellt5 d3ellw del3o d1em d3em. 2d1en1 d4eng d3ent de2o der3f derfyn5 2d1es d3esi 5destu d1et det5an deth4o d1eu1 deul4 deu4ny d4eut d1f2 d3f4ae df4ann df4ao d4fa5ol df4at df4aw dfed5r d3fei dfe5ne d5ferf d4fery dff4y d2fi df4id df4od d4f3ol df4ry d2fu dfwr2 d4fyd dfyn3a dfyn4ed. d1g2 dgam2 dgan5e dg4ei dgl2 dgrynho5 dgyf5ar d1h2 dha5ol dhegl5 2d1i di5ach di1b2 dibryd4 di1d did2e di5den d4ido di5dos di4et di3eu dif4an di5fat di3fe di3ffr di5fli di5flo di5fra di3fw di5gab dig2e di5gel di3gen dige5na dige5ne digl4 di5gof di3gry di3gw dig2y di3gym4 di3gys dil4a dil4e di5lec di5les dill4a di3lu dil2w di3lys d3in. di5niw di3nod d4inoe di3or d2ir d3ir. di3ra d4i3r2e di5rif 3d4iro di4rw di3rym dis3g di3so dis3t di3sw di3sy 4d3it. d2iw2 d4iw. di3w4a d4iwe di5wen d3iwyf d1ï d3ladd dladr3 dl3af d3lam d4lau dl3ed d3l4ei d4len. dle3na dle5ne d4lent dl3er d3lew d2lo dl3oc dl3od d3lon3 dlon5e d1lu dludd3 d2lw dl3yc d3lyd. d3lyn dl4yr d3lyw d1m2 dm4ar dm4er dm4od d3my d1n d3nap dn3as d3naw dneb4 d2n3ed dn3es d2ni d3ni. dno2i d3nos d2n1w d2ny d1o d3och d2od. d2odi d4odia dod3r 2doe do4en d2of dof5yddio d3ol. d4oll dol4wg d3om don2a don2e d3ont dor2a dor4da dor5we dos3 do2w 2dr. 3dra. dr3ad. dr3ada dradd3 dr3adw dr3a4f dr5aid dr5ain dram4g dr4an. dra3na dra3ne dr4ann dr3ant dr5au. dr3c dr3ed dr4edo dr3en d4reu drew3 dr3f drff4 dr4iau d4r3id d4rir d4roe dro3es 4drog drog4e dr3ol dr5ol. dr3on. dron3a dr3ont d4rwg dr3wn dr3wyf dr3yd dr3yn. d3ryw d1s2 d1ug1 d4un. dun3a d4unia d1ur d1us 1dut du5wch d1w dw2a dw3adw d3wae dw3af d3wait d3wal dw3an dw3as dwb3 dwbl4 d3wc dwd2 dw3edi d2wen dwer5y d4w3id d4w3ir d4wit dw5mig dw3o dwr3e d2wrn dwy3b d4wyc dwyn3 dwy4on. d2wyr 3dy. d1yc d5ych. d1yd d3yd. 4dydd dyd2w dydw5y dyf5an dyff4 dyf4n3 dyf4od dyf5odd dy5fodi dyf2r3 dyfrad4 d3yg. d3ygl dy3gy d2yl dyl5ad dy3lan dyll3 dy3lu d1ym dymag5 dym5od 3dyna dy3nas dy3nes dy3n4od dy3r2a dyr2e dy3ri dy5ryd 2dys. 4dysa dys4g dysg5a 4dyso 2ea e1ad e4adf e4adl eaf1 e3af. ea4fa e4afg e1ai e1an3 e4ang ear1 earf2 ear5fo earn4i e1as e1au e3aw eb3ad eb5ar. eb1e ebl2 eb1o eb3ont ebra5ne ebr3e eb4r3i ebr3o eb1w eb3wy eb5yll 2ec1a 2ec3e ech1 ech5od echr4 ech3ry ech5we ech5wyd echwy5na echwy5ne 2eco econ2 eco5no ec5ord ecr1 2ect ec4to 2ecw ec3y 2ed3a ed4al edd3ad edd3al edd3ar edd3e 2eddf eddf3a eddf5i eddf3o eddf3w eddf3y 4eddg edd3o edd3yc edd3yg edd5yla edd5yled edd5ylo edd5ylw edd5yn ed1e ed3eg ed2ei eden5a ed3fa ed3fe ed3fi edf4w 4edia edi4f ed3ig ed3i4n ed3ir ed3iw 3edï 2edl1 ed4lo 4edr. edr3e edr3o edr4yd 2edw ed2we edw3en edw5lw ed3wy4 ed3y edym4 2e1e ef5adwy. ef3an ef5an. ef3ar3 ef3au ef1e efer2 eff4e eff3r4 eff5re effro4er eff3y ef3id ef3ig ef2l3 ef4lo efn1 ef5nos ef1o ef4odo ef2r efr3e ef4ri ef4ry ef4us ef1w efyddad5 efy3na efy5ne e2g1 4eg5an. eg4ana egar3 egeir4 eg5ell 4egen. 2egf eg5ig. egl3a egl3e egl3o 2ego eg4on. 4egos eg5os. egr3a egr3e egr3i egr3o egr3w eg3ry egr3yc eg2u eg3yr e1ho e1hy e2i 2ei1a eiaf3 ei5afr ei3bre eich3 eidal5 eidd3 eidd5y ei5der eidl2 eid5la 2eidr eidr5o ei1e 2eig eigl5ad eig5lenn eigl3w ei4gr 3eilad 4eiladwy. eil5ec eil5eg eil3es ei4ll ein2a eind5i ein4drw 4einf eing4a ein5io 4einl 4einy 2ei1o ei3ont eir3y 2eit eith5e ei1w ei3y 2e2l el1a el5ain elan5e el4co el1e el3ed el4eno el4era el4ere el5far el5fed elgri5 3elh el5iff 4elig ell1 ell5ac ellt4ir ell5wy ell3y el2m3 el5myn el1o el2od el3odd 4elog el4oga el2ri el4wi el3wy el5ybia el5ybr el3yc 4elyd el5yd. el3ydd elyn3 el3yna el5yned elyng4 el3ynn el3yr el3ys el4ysg el4yst em5ain em4at 2em3e 2emo em4os 2emp empr3 em5ryn 2emt em5tas 2emy en5ada e4n3adu e4nae en3af e4nag en5ago en3ai en3an e4nar3 enar4g e4n3aw en5byl en3c en4ct en4cy 2end endig3 endr4 en3ec en3ed. en5edd en3el en3em en3en en3er en3est en3eu e4new enew5y en5fyd eng3h en4gi engl3 en5gl4og en5ise en3it en3o en4oli 4enti ent4ir en3tr ent4wr 4enty en5tya en5uch enw3ad en3wc en3wn en3wr en3wyd en3wyf en3yc en5ych. en5ychase en5ychia en4yg 2eo e5och. e1od e1oe e4olae e4olaid e4olau e1om e1on eor3 ep5ach ep3l er1a er5ain er2c erc3a er4ch 4erco 2er2d er3de erd3y er1e 2erf er5fan erf5au er3fed er3ff er4fl er4fu er3fyd er3gl er2gy er3i er4ic er4il erin3 er5ir. er5it. er2l er5lys er4md er4mw er4my er3na ern4i er5ni5as er5nyw er1o 4erob erog4 4erol er5oli er4ony er2se er5sei 2ert erw3a er4w3e er4wl er3wn er4wre er3wy er4wyc er4wydd er3yc er3ydd er3yg er3yl eryl3e er4yll er3yn eryn4a eryn4e es3a es3ba es3e es5gar es4ge es4gn es4g3w es4gyn es3n es4ne es4t3a es5tam est3er 2estf 2estl est5ol 4estu es5tyll. esty5na esty5ne 2esu esurad4 es4yd. es3yn3 e2t et3ac et3ad e3tae et5eg. eter4 et3er. eth1 eth3e eth3i eth4le eth3os eth4r3 eth3w et5iro et1o et5re. et5swy et1w 4etwr ety5wy e2u eu3a 4euau 2eu1b2 2eud2 eu3da eu3d4e eud4i 2eu1f eu1g eull4 eu5lys 2eun2 eu5nan eu5nos eu5nyddi eu5sil eus3t eu4th eu4tu eu3w 2ew ew1a ew3d ew1e ew3g ewgl4 ewg4w ew3ir ewis3 ewl1 ew3o ew5par e3wyd. e3wyf 2ey e1yc ey4en 1ë 3fa. fab3 fab4i fach3 fac4w fadd2 fad4ei fad4r3 fael3 f1af 3fag fag4d fagl3 f1ai falch4 f4al5on f4alu f3am f4an. fan3d fan5edd fan4es f3anf fan3o fant2 3faoe far3a far4ch3 4far2e f3arf far4fa far4l 3farn farn3a f3arp f3art f4arwe f3arwy f1as fas4iw f3at fat4o fawd4a 3fawr f1b2 f1d2 fdd2 f2dw fd5wr. f4eb. febr3 f1ec fed4n f2edr 3feia 3feie fe4io feiriad4u feith3 fe4iw f4el. f3ell fel5yno f1em fe3na feng3 fent4 fentr5 fenw3 fen3y 2fera ferch4er ferdd4 2f2ere 2f2eri fer4in 2f2ero f2erw ferw5yc f4er3y f1es feth3 f4eth. f4etha feu1 3fey f2f ff3ad ff3ant ff4at ff3au ff3ed. ff5edig ff5eio ff5el. ffen5ed ff3ent ff3er. 3ffert ff3esu ffet4 2ffi ffidl5 ff2l ff4la ffl4ac ff4lo ff5log ff5los ff3n ff3od ffod5e ff4odi 3ffon. ffo3n4a ffo3n4e ff3ont ff2or 5ffor. ff4os ff2ra ff2ri ff4rod ff2rw 4ffry ffr3yn ff2t 5ffurf3 ff5wyf ff5yl. f1g fg4wr f1h2 fha5ol f1i f4iadae 2fic fic4e f2id f3id. fig4en. fil3y fin3 f4in. f3ind fin4t fisg4 f2ï fl2 fl3ad flaf4 fl3ai flamad4 fla3na flan5ed f2las flaw4 fl3ec fl5eis fl3em fle3na fle5ne fl4eo fl3id fl4ig flin3e fl3ir fl4iw fl3om f3lon fl5rwy f4l3wr f1ly f5lychw f4l4yd fl4yf flyn3a flyn3e f2n fn3a fn3d f4n3ec f4n3ed f4n3em f4nen f3nif fn3ig f3nith fn5lu. f4n3oc f4n3om f4n3on fn3w fn2y f4n3yc fn3yn f1oc fodd3 fod4enn f4odf fodr4 fod3rw f4odu f3oedd f1og fol3 fol4enn f1om fon4d 5fonog f4ony f4or. for4c f4ord for3f f3os2 fos4i fos3o f3ot f4otr fr2a f2raf f2rai fra3na fra5ned fras4au f4r3au fr3d frdd2 fre2 f2rec f4red. f4reg freg3y f2rem f4ren f3reo f2rer fr3f f2rh f2rid fr3id. f2rir f4rit fr2o f3roa f5roadw f2roc frod4iae fro2e fro4en fro5esi f3ro2i f2rom f2ron f3roo fr4ot f3row fro4wc fro4wn f1ru fr2w f2rwc f2ry f3ryn f1ta f3ter fudd4l fud3w fu2l f1un3 f4urf f3wa f1wc fwd3 f1we 4fwl. f1wn2 f3wr. fwr5ne f4wy. f3wyd fwyllt4 fwyn3 f4wyn. f4wys f1yc fyd2 fyddad4 fydd4l fydd5y fyd4l3 f4ydr fyd3y 3fyf fyf4y f1yl f4yl. f2yn 4fyn. f3yng fyn3o fyn5od f2yr fy3r2a f3yrd fyr2e fyrf4y fyr4y fys4t fystyr4o fys4w gabl4en g5ach. gad1 gad3a 5gadar g4ad2u 5gaduri g4adwr g1ae gae3a g3af. gaf3a gaf4r3 g1ai 1gal2 gal5ara gal5are gal5ari gal5aro gal5arwy galed5 4gall gam4enn gamn4 gan3a gan4d ga4ne ganghe5na g3ant 4ganwr g3ao gar3eg gar4enn g3arf gar4ge 3gart 4garthia gar4we g1as 5gased gasg4e ga4t3r 2g1au 4gawe 2g1b gb4er g1c 2g1d2 gdd2 gddig5 gdo3ra gdo5r4e g2dw gd5wr. g1ec g1ed gedd3 g2ede g4edi. g4edid g4edir g4edit g2edo g4edu g4edyc geg3 g2egy g2ei. g3eid g4el. gell5a gel3o g1em gen4d g5enni. gen2r g3ent g4enu g3er. 3g4erd ger4f ger3y g1es geu4l g1f2 gfa3na gfa5ne gfe5ne gfyn3 g3ga gh2 ghae4 ghan3a ghanghe5na ghar4en ghasg4e ghen5i gher4f gh4le ghleid4 gh4ne ghob3 ghobl4 ghof5r gh4og ghon4y ghr2 ghra4 ghred4adu ghred4inia ghw4f ghyd3 ghym4an ghysg3 g1i gib3 g4ida gi5en. g2ig1 3gil 1gip g3iw g2l gl3ac gl3adw glaf2 glan5e gl3ant glas3 g5las. g3lat gl5au. gl2e g3le. gl3ech gl3edi g5leisiaso g3leo gl3es gl3eu gl3f gl3ia gl3id g3liw gl4odi gl4ody glo4e gl4of 5gl4oga glo2i g4lu. g4lwc g4l4wm g4l3wn g4lwyf gl3yc g3lyd. gl4ym gl4ys gl4yw g2n gn2i gn3io g4niw g3nï1 gno3e gn2of gn2u gn1w gn4yw gobl4 g1oc goddefad4 go5ddr g2od2y god5yn g2oe go5fau go3fer goff4au gof4un gog2 go3gan gog3e gog4l4 go5gyn g3ol. goleu5 3g4oll3 go4lw gol5yga gol5yge gol5ygwy g3om. go3me gon5ad g4one g3ont gon4yn g2or gor5chy gorddad4 gord5i g4orf gorn4an g4orol gor3t 1gos gosb3a g3ota g3ote g3oti g3oto g3otw g2r gra4m gran3a gr4el gr3f gr2i g4rid4 gr3ie gring4 g4r3ir g4rit. gr2o gr3od gr4oe gr5oed grof4 grog3 gron4a gro5nas gron4ed gron4es gr4ono grwn5a gr3wo gr4wt gr2wy g5rwydd g4ryc gryg3 grygl4 gr4ym gr4yn g1s2 gsym4 gub3 gudr4 gu5edd gu4to gw2 gwa5r4as gwar4es gw4as g3wc gweithiad4 gwelad4 gwel5e gwen3a gwerthad4 gwm3 gwn4a gw4n4e gwobr3 g3wr. g4wrd g5wth. gwy3by g3wyd. gwydr5 g3wyf gwy4r gwyw3 3gyb gyb3y g1yc gych3 g4ycho gydd4f5 g2ydi gydl4 gyd3r4 g4ydu g4ydy 3gyf gyf5an gy4fe gy4fl gy4fr g3yl3a 3gylc g3yle g4ylio g3ylo g3ylw g2ym gym4an gym3u gyng3 g2yno g2yr g4yro g2ys gy4se gysg3 gys5on gys3t gys5to 3gyw gy3wa gy3wed gy3wi gy3wy hab3yd hadd5as hadd3o had4eg had4eny h4adf had4fer hadl4a had3n had3r4 h5aeol ha4f3a h4afl haf5ol h4afs hag3w h1ai h4aif hal3e hall3o hal3o ham4enn hamn4 ham3s han3ad h4anau hanc4 han3d ha4ne han5edd han4er h4ange hanghen4r han3ig han3l han2o han4oda han5olai han5olas han5ole han5olwy hanrhyd4 hansodd4ei har5adwy. hara3t harato4en har4bwr har4cha har4fo h1as h3asf hast4a ha4tr hatr3e h1au hawe5nas hawe5ne hawl3 h2â h1b2 hbl4a h1d2 hddad3 h3di hd4ir hdo3na hdo3ne hd4ra hdr3e hdr5oc hdr5od hdro5ed hdr5wyd h4dwr h2eb h3eb. heb3ra hedd3 hedd4fo h2ede hed5fo hed5fw h4edid h4edir h4edit h2edo hedr5wy h4edu h4edy h2ef h2eg hegn3 h4egy he4ho h2ei2 h4e3ia h4eil heimlad4w h4el. 4helad 4helaf 4helai 4helan 4helas h3eld 2hele 4heli 2hel3o hels4 2helw 4hely hel3yd h1em hen5cy hen4id hens4 hen3wy henwy5na henwy5ne heny5na he3ol her3b h2ero h3esi h2et h3ete h3eto 5heuae heu4aetha heu3d heu2l he4wi hewy5nas h1f2 hfil4 hfonhedd5 hf4os hf4wy h1g2 hgan3 hgap2 hgi5ai h1i2 hiach4 hiac5has hiac5he hiac5hw hi4a4n hib3 hidl3 h2ig1 hig3y hin4t hir3 hi4wa h2ï1 hï4en hl2 hl4ad hl5adw hl4am hla3na h5las. hl3asi hl3aso hl4aw hl5ech. hl5edig hledr5 h3lef 4hleit hl4en hl4et hl3id hlon3a hlon5e h4lus h4lwm h5lyd. hl3ydd hlym4u h4lyn hl3yn. hlywad4 h1m2 h3myg hmygad4 h3myn. hmy3na hmy5ne h5myni hn2 h3nad h2neg h4new hn4ie h1nï1 hnod3 h2nol hn5ole hn4yw ho4ad. ho4bl hod4l ho4dy ho4en hoffad4wy h3og. h3o4ga hog5lu ho2h h2ol h3ol. hol5ud h1om h2or h3or. hor4c horn4an h4os. hosb3 hos3o h2ow hp2 h2r hra3dd hr3adw hr3af. hra3g hr4aid. hr3ant h5raul hr5edig hr3em. hr3f hr2i hr3ia hr3id. hrid4a hr3ie hring4 hr3ir hrisiad4 hr3it hr3iwy hr2o hro4ad4 hr5och. hr3odd hrog3 hr3om. hron4a hro5nas hron4e hrong5 hr3ont hr4ud hr3wn. hr5wyd. h5rwydd. hr3wyf h4ryc hryg3 hrygl4 hry3l hr4ym hrynho4e hrynho4i hrynho4wn h4rys h1s2 hsef4 h2t h2u hub5on hudd3 hudd5y hudr4 hud3w hud5yl h4uge hug4l hun3ad h4unn h3ur. h3us. h4use h4ust h4usw hw2a hw4as hwbl5e hwd3 hw2e hwedl5 h3wei h4wel. hwen3 hwen4y hwe5nychaso hwe5nyched hwerw5 hwe5ug hw2i hwiw5g hwm3 hwn4e h3wr. h2wy h4wy. h4wya hwybr4 hw4yc hwyll5t hw4ym h4wyo h5wyol hwy4r hyb4l hyb4wyl hyb3y hydd4id hyd4fo h2ydi hydl4 hyd4naw hy4f3a hyfad4 hyf4ae hyfar5f hyfer3 hyffel5 hyffred4in. hyf4iai hy4ga hygl4o hygl4w hygr4 hyll3a hym4adw hym4ant hym5el hym4en. hymerad4 hym3o hymp4 hym3u hym5yr hym5ys hyn3a hyn3e hynef3 hyn3yc hyr3a hyrdd5 hyrf3 hyr5n4o hyr2w hys4b hy4se hysg5od hys4ig hys4n hys5oni hyt4bw hyth5ru hyt2u hytun4deba hy3was hy3we hy5wed hy3wi hy3wyd 1ia iab4a iach2 iad3 i4ada 5iadaeth. iad4lo 5iaduro i3ael 3iaet 4iafo iag3w 2ial1 ial4ae 2i3am2 iam3h ia3na 4iand ian5da ia3n2e 4i3ang iang4e ianghen5 ian3o ian3w 2iar i3ard i3arf iar4l iarll5 iar4s i3asg iat5er i2au iawnad4 2ib ib3ed ib3el iben5y ib3es ibetr4 ib3i ib4il ibl3e ibl3o ibl3w ib5og. ib3on ibr3a ibr3w iby4nad4 2ic ic3en ichl4 ic5ied icon2 ic5oni ic5rwy ics4i ic5siw ic3t2 2ida idal4 2idd i4ddai idd4au i2dde idd3f4 idd3i i4ddir i4ddod idd3r 2ide idel4 ider4 2idf idf4w 2id3i idi4a id4lo idl3w 2idm 2i2d2o id3og i3dola i3dole i3dolo i5dolwy ido3na ido5ne i3dor 2idr idr4a idr4o id3rwy 2idu 2idw idw3a idwad4w id4wr 2idy id3yl id2ym 1ie 4iedd 4iedi. iedif5 ied4yl 2i3ef i3eg iegwydd4 2iei i3eid ieis4 4ien. ien4a ien4c 4iend i3ene 2ienn ienw4 i3eny i3esg 2if if4add if4ae if4al ifan3a ifan5e if4ao if4ar if5ard ifar3e if4at if5ath if4aw if5bin i4fec i4fed. i4fedi i5feio i5feiw i4fem ife4n i4fent i4fer. i3fery i4fesi i3fet iffl3 iff5or i3ffu2 iffy5na iffy5ne if3i i3flas if4on. i3fre i3fry i1fu i4fwc i4fwn i4fwyd i4fwyf i1fy i4fyc i4f4yl ify5re ig3ad ig3af ig4ain 2igan 4i3gar ig1e ig3ed ig3es ig5hal4 2ig3i ig5lan. ig5lann ig5law ig5let ig4l3o ig4ly ig5lyd igl3yn ign1 2igo ig3odd ig4ode ig3oe ig3om 2igr i3gre igref4 i3gro ig3rw igryb4 2igw ig5wai i4gwc i4g3wn ig4wrn 2ig1y igyff4 ig5yn. ig4yna ig4yr igys4 ig5yso igysyllt4 igyt4 igy4w 2i1h2 i2han ihat4 ihe4w 2i1i i3iw 2i2l il3a 5ilau. ilc2 ild5ir il3ed il5en. ilew4 il1f ilf4y il3i il4ip ill3 ill5iw illt4 il3oc il3od il5ofy il3on il2s3 il4sy il4ti iludd4 il3un il1w il5wai ilwen3 il4ws il3yd il3yg4 il3yn. ily3na ily5ne i4lysia il5ywa 2im2 im4bi im3i iml3 im4le 2in in1a in3ac in3ad in3af in3ai in3an in2be inc4e in4ci inc2o in4cy in4dai in1e 3in4eb in3f ing5en in4g3o ing3w ing5yl in5gyn in3ia in3id in5iew in3ig iniw4 in4iwe in1o in4ode in4odi in4ody in3oed in3on in3os int4a in4te in2t3r in4ty in3w2 in5wyc in1y 1io 3io. 2iod. i3odde iod5le iod5wy 2ioe 2i1of iog3 4iolc iom3 i2on ion3a ior4c ior4f i4orw 2ios 2iot 2ip ip5ell ip4og ir1 ir2a ir5agl ir3an ir4áf ir3b irch3 irdy5na irdy5ne 2ir3f 2iri i4ria ir3io i3ris ir4li ir4ll ir3na irnad4wy. ir3no irn4y 2ir3o ir3w irw2i ir4wo ir2y ir3yn i3ryw 2is isaf4 is3b is5eld is2er is5er. is4gam is4ge isg3o is3gr isg5wyd is3gy is4la is5myn is2o is5odd is3ol is3on ist2 is4ti is5tol is2w is3wn is5wyd. is4yc is4yr 1it. 3it2a 2ith1 ith3a ith4au ith3eg ith3i ith5or ith3w ith3y 2iw. iw3adw iw3af i4wair i3wal iw3an iw3as 3iwc iw4ch 2iw1d2 iwd4i iw5edd. iw3edi iw3eid iwg4w 2iw1i iw1l2 iwl4e iwl4i iwl4o iwl4w iwm4e iwmp4 3iwn iwn4i 4iwnl iw3o i3wre i3wrt iw5ter 1iwy iw4yd iw4yf iwyn3 4iwyr 1iy 2iyd 2i1ym iyn3 2i1ys ï3ae ï2i l1ac lach3 2lad. l4ad4d3 lad2m lad2o lad3r4w 4laen l3af. 5lafar l1ai l4ain l4air l4ait lam3 l4an. lan5ced lan5de landr3 l2ane lan4es l4ann lan3o 4lant3 lar3a lar4ia lar3n l1as l4as. lasg4 last2 las5ta 4lat. lathr3 lats5i 2l3au law5dde lawen3 law3l law3no lawr2 law5ro law3y 2l1b lb4an l2c lch1 lch5io lch5iw lch3r lch5wyd. l3co lc3yn. 2l1d2 ldd2 ld3i ld4ir ldro3 ldy5na ldy5ne 1le. le3a le4ad. le4ada lebr3 lech3 l3ed. leddf5 l4eddog led5fy led3l4 l4edr lef1 lef3e lef3y l2ega leg5ar. l2egw leg5yr le5iau le3id. lei3l4 le3ir. le3it. le4iw l3el 2l1em l3em. l2ema len2d len5di len5ig l3ent len3y 1leo le3oc le4on. l3er. l4erau ler5ig lesg5e l4esn let4em le4tr l4euad l4euh 4leuon l5euon. le3wch le3wn lew3yn lf2 lf5air l3fan lfe3ne lf4fa lff4y l1fi lf5icy l1fo lf5oda l1fr lf4wy lf3yd lfy5re l1g2 lg4an lgo4f3 2l1h2 l3ha l3he l3hi l3ho l3hw l1i2 liach3 4lian libr3 2lid li3de 1lif1 li4fr 4lio. li5oed li5pal 2lir l3ir. lis4g3 l3it. lith4r3 l4iw. l2l 2ll. ll4ada lladr3 ll5adwy. ll3ant ll5arn lledr4e ll4edy lle3o llest4 lleu4a ll1f llf4y llin3e ll3odd llosgad4 ll5tyr lludd3 llw2 ll3wa llw4e 5llyd. llygr3 ll4ynn ll4yr2 ll5yro lm2 l1ma l4mad l4maf lm3ai l2m3as l4mau lm3o lm3w lm4yn l1n 2lo. lob5yn 2loc loch3 2lod lodd3 lo3ed. l1og3 logl2 l1ol lol2w lolyg4 2l1om l3om. lon2a lon3d lon4es 4l3ont l3or. l4orau l4org l4ory 2lot lo5ynn lp3a l3pu l1r2 l3rh ls4ig l4syn l2t lt3ad lt5eg. lt3em l5tera l5tero l4tia lt4ig l4tio lt1o l3tra ltr4e l3tu l4tu. lt1w 2lu. l2ud ludd5y lud3w lu4edd l2un3 l4un. lur5ig lust5l lw1a lwadd4 lw4ae l1wc l3wch lw3ed lw3er lw3es lw4fa lwfr5e l4wgr lw1i lw4ig l1wn l3wn. lw3o l1wr1 4lwre l4wyc l4wydi lwyd4io l4wyn3 l4wyr 3l4wyt lyb3 2lyc l3ych. lyd2 l4yd. 2lydd lydn3 lydr3 lyf3a lyf5an5 lyf4n3 lyf4r3 5lyfr. l2yg 4lygedd 4lygia lym3 l4ynau lyng3a l4yn3y lyr3a 4lysau 4lysen. lys3ga lys3ge l4ysl 4lysn 4lysr 4lysyn lyw1 m1 mab3 mab4i m3ac mac4w m4adad m4adaf m4adai m4adan m4adas m2adi mad4r3 m4adwc m4adwn m4ady mael3 maf4l3 m3ag 2mai m3am man3a man3e m4anf man2o m3ar m4ar. mar4ch3 m4are m4ari mar4l marn3 m4aru mar4wy masg2 mas3ge m3at mat5eg mat4o m3aw mawd4a mbarato5 m3bi m3by mcan3 md2 m4dai mdan4a mda5nas mda5n4e mdd2 mddadl4 mddef3 mddi4d m5der. m4dera mdog4aetho mdo3na mdo5ne mdro3e mdwy4 mdyng5 mdy5re 4meda 4meddia 4meddwr 4medi 4medï medr3 meg3n4 megni3 meith3 me4iw mel5yno mens4 ment4e mentr5 5menty men5yd m2er m3er. m3erad m4eradwy. m4eraf m4erai m4eran m4eras merch4er merdd4 m4ere m5eriada m4eroc m4erom m4eron m4erw m4ery 4mesia 4mesol mest4 4meswr 4mesy meu1 mfalchi5a mfalchi5e mffl4 mfydd4 mg2 mgyff4 mgyffr5o mgym4 mgym5eria mgys2 mh2 mhar5ad mheir4a mhe3na mhe5ned mhe5nes mhen3t4 mhen5w mhet2 mhe3ta m2heu mhob4l mhr4a mhryf5 mhyd4 mhy3f 2mi m3ias m3id3 m3ie mi5gei min1 min4t m3io m3ir mis2 misg4 mis4i m3it m3iw m3iy ml2 m2las ml5blw m3led mlew3 m3lin m5liwiais m5liwiase m5liwiwy mlo3na mlon4ed mlyn3 m2n m3na mn4as m3ne m4ned mn5edi m5niau m3nï3 m2od m3odd mod4ig mod3r mof5yd m3og m4on. mon3a mon4d m4onï mor2 mor3c mordd4 morddiw5 mor4o m3os2 mos4i mo5siy m2p mpr3a mpr3o mpr3w mp5wai mr2 m2r3ai mra3na m2r4ed mreg3y m4ria m4rie m4rig mro4ad mrod4iae mrod4ir m2roe m2roi m2roo m2row m4roy m4ryn mryn4d mrys4o ms2 m3sa m2se mse3na mse5ne m2so mstr4 m2t mt2a mtas4 m3th m2u mu4an mudd4l mud3w mu2l3 mun3 m3us m3w2a mw3as m3wch m3wi mwr2 mwr3i m3wt mwy3b mwyllt4 mwyn3 m5wyse mwyth4adw mwyth4af mwyth4asan mwyth4aso mwyth4asw mwyth4ec mwyth4em mwyth4er mwyth4i mwyth4oc mwyth4w mwyth4y 2m2y m3yc mych3 m3yd mydd5i mydr3 myd3y myf4y m4yl. myl3a m4yln m3ym myn4ai. m3yr myr4as myr5asa myr4edi myrf4 m3ys m4ysg. mys4w myw3y 3na3b2 na4bl na4bo na4ch3 n2ad n3adl nad4n nadna4 n4ado nad3r nad3u nad3w n3adwr n1ae nae5ara nae5arw nael4 n2afa n5afau n2af3o n4afy n4aic n4aig n4ain n4air n3al nan3a nan3e nan3f nap4om n3ar narllenad4 n3asg n4asol n3as4t 1nat nau3 n1b2 nbyd5r n2c nc3an nc5des nc4ed nc2ei nc5en. n3ch nchwiliad4 n4cia n4cid n4cie n4cio n5ciod. n4cir n4cit n4ciw n4ciy n3cl ncr1 nct1 n5cyd. n5cyny n1d2 nd3as nd3aw ndd2 nd4da nden2 n4d3ia nd3ie n3di3f n3di4g n3dil nd3io nd4ir n3dis n3dit nd3iw nd3iy n3dod nd3oe ndo3ra ndo5r4e n2dwr ndy5na ndy5ne n4dys neallad4 n2eb1 neb3o n5ebry neddf5 n2ede n4edid n5ediga n4edir n4edit n2edo n4edu n3edy n1ef nefn3 n4efy n1eg neg5in ne3h n3eidd n2eis n1el 3nel. nel5yn 3nenty ner3a nerch5 n4erg n4erl 3nert 3nese 4nesia n4esio nes4m 3neso n2est 3nesw n2esy neth5o n2eu neu3d n4euf neul4 3new new5yll. newyn3 n1f2 nfadd4 nf4am nfan3 nfan5e nfan4t nfa5ol nf4at nfel2 nff2 nf4fa nff4o nffyn4 nffynad4 nf4id n4fil nfod4l n2fon nfon5a n5fonedi nf4ri nf4wy n2fy n5fyd. nfyd3a ng2ad ng5adwy. n4gai ngal4 n3gam n3gar n4gau ng4ddy ngel4 nghwyn5 n2gi n2gl2 n3glwm n4gly n5glym nglyn3 ngn2 ng3oe ngof3a ngol4ed ng3on ngop2 n1gr ngr4a n2gw ng4wi ngwy5nas ngy3f n4gyn 2n1h2 nha3o nhar4 nhaws4 nheb5r nhe3na nhe3ne nhep2 nh4es nho3ed nho5esi nho3n4a nhon4e nhudd4ed. nhu4e nhyc4 nhyd2 nhyl4 nhym4 n1i 4ni4ad n5iald ni1b nib4a nib4e nibryd4 ni1d nidd4 ni5dde nid4e n3ie ni4et ni3eu n4iew ni3fed ni3fen ni4feryc ni3ffr ni3fw n2ig n5igam nige5na 4nigiad n5igiad. n5igiada 5nigiadw 4nigion n5igion. 5nigiont 4n5igiwr nigl4 4nigy ni3gym4 nilead4 nill5adas n5illio ni3lu ni3lys nin2 ni3no nin4w ni3or ni3ra nir4e ni3ri ni4rw ni3rym nis3g ni3so nis3ty ni3sw ni3sy nith4e niw2 niw4a ni4wc niw5eddas niw5edde niw5eddo niw5eddw niwl3 niwl5e niwl5o niwl5w ni5ydd n2ïi nï4yc n1l2 nladr3 nlin3 nll2 nllon4 nl4lw n4llyn n2ly nly3na nly3ne n1m2 nmolad4 n1n2 nn4al nn4ar nned4 nneth4 n3nh nni2 nnif4 nni4l nnill4 nni4o nnis4 nni4w n5nos4b nn4wy nny3na nny5ne nn4yw no4ada n3ob n2od. n2odo nod3r n2oe noe4o no3er 3no4et n1of1 nof4el n2ofy n1og nol5eg nom3 n4omi n5ones n1or norch4 nor4f 2nos3 nö5es. np4et n1r2 nre4o n1s2 n2se n3sei ns3en ns3i ns4ic ns4ig n3s4il ns4iy ns5iyc n3siyn nsy3na nsy3ne nt3ad nt5af. nt5aid nt4ana nt3aw n2te n3tei nt3el nt3em nt3er. ntew3 nth2 n4tia nt5il. nt4in n3tis nt3oc nt3od nt5od. nt3oe n4t3or n1tr nt1w nt3yn nty3ra nty3r4e n1u nud2o nun4i nut1 nw3af n3wait nw3an n3war nwar4ed. nw3as nwbl4 nwb5le nwd3e n5wedd nw3edi n3wei nweithi5au nwelad4 nwen5d nw4ia nw3id nwir4 nw3ir. n3wis nw3o nwr5ei n4wy. nwybod4a n4wyc n3wyl n2wyn n4wyn. n3wyt nych3 nyf2 ny5fala ny5fale ny5falo nyff4 nyf4n nyf4o ny5fod nyfr3 n2yg ny3gy n1yl ny3lan ny3lu nym4a nym4y n5ynnau ny3n4od ny3ra nyrchafad4 ny3ri n1ys n4ys. nys4g n3yw 2o1a 2o2b ob3ae ob4an ob5ant ob3ed ob3el ob5en. oben5y ob5er. obl3a obl5ed ob3ler obl5es obl3o obl3w o3b4ly ob3o obr1 ob3yd oc1a oc5byn oc3e och3a och5an och5en ochl3a ochl5es ochl3o ochl3w och3n och4ni och3o ochr3 och3w och3y 2oci 2ocr 2oct 2od3a od4ao odar4 odd3a oddf5y odd5il oddiw3 odd3r odd5ri 4oddu odd3y odd5yd odd5yn odeb3 o5debau o5debu od5edi od5eid od3el od3er od3i odl3a odl3ec odl5esi odl3w od5off 2odog od4oga 2odr odr3a odr5ec odr5em odr3o odr5wyd. od4ry odr5yc 2odw od3wa od5wed od5wen od3yc od3yn od4ynn o1ec o4edd3 oed3i o3edig oedl4a oed5lan oed5ra oeg3 oel3c o1em oen3 o3ent oer3 oes3 oesg4o oet5an oetr3 2of. of3ad of3ai ofan3 ofan5e of3ant ofa5ol of5ebi of3ed of3el of3en of4enn of3er. o4ferl o4fery of4f3a off3ed off5id off3w ofiad4w ofl3 of3n of4na of4nd of4ne of4nf of1o of4odo ofr3a of3re of4rec of4red of4rem of4rer of5wyf of4yn ofy3na ofy3ne og1 og3ai og2an3 o4ganau o4ganu og3as og4edy og5elyn og3er og5erd og3es 2ogf og3i 2ogl ogl3w ogl3y 2ogn3 3og2o4f og5oru og3rwy o3gry og3yd ogyf4 og4yl og5yrn o1h2 oheb3 oher4 o1id oig1 o1ir o1it ol1 2olau ol4ce ol3d ol4da 4oleu ol3eua ol4eued ol5euo ol4euwr olew3 ol3i oll1 oll3e oll5ed ol4lt oll5wy olo2 o3los ol3s ol4sb 2olu 2olwr olw4y ol3wyd ol5wyno ol4yne ol4yni ol4yno ol4ynw 2oma om4at 2omb om2e om5eda om5edi om5eg. om3ei om3en om5isi 2oml om4og4 2omp om5pre on1 on5ach. on5adu on3af o4n3ai 4onair on3an o4n3au on5au. 2onb on5cyf 2ond on5did on2do 2one on5edd. on3el onest3 2onf ongl3 ong2o ong3w on4gyr 2oni 2onn 4onnu on5of. 2onog on2t 4onto on3w 2o1o 2op op3a op4ao op5aon opl3 opr5ai op5ren or1a 4orac or3ach or5aeth. or5aetha or3af or3ai or3an o4r3au or3aw4 or3b or2c or3chw or4dd or5ddyn ord3en or5din or4d5yn or1e or2eb or4edd ore5ddy 4oreg or4egw or4et or3fa orfa5na orfa5ne orff4e or3fo or3f4y 2or3g or3i or3l or4mu or4my orn3a or3nel or1o or3of or4oh oron5a or3one or5oni. or5onid or5onir or5onit or5pws 4orth. ort4i or4ty or5uwc or1w or5wah orw4e or4wel or5wgl or1y or3ydd 2os os3a os4ana osb3as osb5ed osb3o osb3w osb3y os5eai osg3a os3gl osgo5e os3gor osg3wy os5iae os5ibi os2o os3odd os3ol os3on os3te os3tr4 os4tu os3w os3y 2ot1 3ot. ot3e ot5esa oth3 ots4i ot5sia o2u o1wc owg3 owl5as owl3e o1wn owt5er o1wy o1yc oyw3 oy4we ôr3f p1 p2a pab5yd 2p3ad 2p3af 2p3ai 2p3an pa3od para3t par4c par3w past4 p3au pawe5na 2pec 4p5edig p2ei peir4a p5eli. pel3y 2pem pengl4 pens4 pen3t2 pen3w penwy5na 2per 2pes pet2 pe3ta p2h2 pheir4a phen3t4 phen5w phet2 phe3ta phob4l phr4a phryf5 p3ia pib1 p3ie p3io p3iw p2l pla3na p4lau pl5eda p4lyc 3plyg po4b4l pog4y pol3 p2r2 pr3as pryf3 pr5ynn p2s ps4iw pt2 p2ud p4usr pw2 pwd3 pwr1 p4wy. pydr3 p2yr r4abe r4abi rab5lyd rab3y rach5wy r4a4ci racs4 r4a4ct r2ada r4add radd5ol rad4ri radwr4i r2ae raed4 raeddad4 r4aen ra5fann ra5fán r4aff rag1 ra4ge rag3o ra3gra ra4ha ra5hau r1ai 4raidd ram3od ra5mor ra3m2w ran4d3 ran2e r4anf ran3o r4anod. ra5phe r3ar3 rar4c 2r1as ras4ie ras3t2 r3atao rat3e 2r1au raw3e 5rawes 3rawi rawn3 2r1b r2ba r3bar r4bec r4bem r4bent rb4er r4bes r2bl r4boc r4bom r4bont r4bwc r4bwd r4bwn rbyd3 rc2a rc5adw rc5af. r3car rc3e rc4er r2ch rch3ad rch3an rch3ar5 rch5eb r5chei rch3et rch3l r3chm rch3oc rch3oe rch3og r3chu r3chwa r3chwi rch5wyd r5chwyn rch3yc rchyf4 rchym4 r1cy 2rd2 r1da r3dai rdan3 rd5au. r2dd rdd3ad rdd5as rdd5ell rdd5in rdd5iwy rdd3o rdd4od. r5ddodi r3dd4u r4ddu. rddw4 rdd3yc r5ddychw rddyrch5 r5ddyw r1de rd3i rd4in rd4ir r1do r5dod. r1dr rdro3 rdro4ada r3dw r1dy rdy4n rd3yn. re3a r3ebai r3ebas r3ebe r3ebi rebl3 r3ebo rech3 rec3i 4redd r5edd. r4edio r4edol r4edwr red4yn. re4fa refn5y ref3y r4egl r5egl. r4egog re5iau r4eic re5id. reidd5 r4eig r4eil r4eine re5ir. re5it. re4iw r3ell r4emi ren4d r4eng3 r4eni ren3in r4ennyd re1o r1er r4er4id rer5in restr3 r4esw r4eua r4euo r2euy re4wi rew5id re5wn. rew5ynn 2r2f r1fa r4f3ad r4faeth. r4faf r4fai rf4ao r4fas rf4at r4fau r3fedw rfel3 rf3en rf4eny rf4ey r4ff. rff3i rff3l rff3o r3ffw rff3y rf3id r5fil. r3fl rf3lu rfodad4 rf5ol. rf3on rfor2 rf5ord r3fr r3fu rf1w rf5wis rfyn5yc rf4yr r3fys 2r1g2 rgal4 rgan3 r3ge rgel4y rge3na rge5ne rgo4f r1h2 rhag5e rhag3l rhag3o rha3n4a rhan4e r4haw rh4es rhew5y rhif3 rho4ec rhon5a rhost4ir rhugl5 rhyf2 rhy3n4a rhyn4e ri2 2ria r4iaethu riaf3 r4iag ri5agl r3iai r4i5aidd ri5all ri4an r5iant r3ias r4iaw ri5awd rib3e ribl3 rib3w rib3y ri5can r4ida ridd3 ridd5y r4idi rid4yllau 2rie ri3ei rif1 rig3 r4igo ri3i rin5dir rin3e ringl5 r4ini r4inl 2rio r3ioc ri5odad ri5odaf ri5odai ri5odan ri5odasai ri5odasan ri5odase ri5odasi ri5odasoc ri5odasom ri5odasw r3iodd ri3ode ri3odi ri5odoc ri5odod ri5odom ri5odon ri5odwc ri5odwn ri5odwy ri5ody r4ioe r3iom ri3ong r3iont r1ir ris4g risgl3 rist3 3r4ith 2riw ri4wa riw3l4 r5iwr. 2r3iy r1l2 rla3na rla3ne r3lew rl3ia rl3ie rl3io r3ll r4ll. rll4e rllen3 rl4l4w rl5og. r3lon rludd4 r3lw r2lym rlyn3 rl5yn. r1m2 r2ma rm4ac rm3i rm4il r2mo rm4od r3my 2r2n1 r4nai. r4nau rn4es. rn4esa r5nest rng4e rn3i rn5iae rn4ii rn5iol r3n2ï1 rn4os rn3y rn4yw 2roa 4road 4roau rob3l4 roch3 rochl4 ro3cr rodd3 r4odr rod5rw ro4ea roed3 ro4eo ro3er r2of rof3l4 rofun4ed. rof3w r3og. r4ogae ro4ge rol3 r1om3 r4onau rongl4 rong5lwy ron3i r4os. r4osf rosg4 ros3o 2rot rö5edi rp2 r1pa rpar3 r1pe rp5ech rp5em. r2pen rp5ent rp5er. rp5esi rp3i rp3o rp3wy rp3y r1r2 r3ra rr4og r1s2 rs4ai r4sau r2s3en rs3i rs4in rs5li. r2s3t2 r2sy r1t2a r4tau r4ted r3teis r4ten r4tes rth3a rth4eg r3thin rth3la rth3o rth5ol rth5ru r5thryc r4thw rth5wyon. rth5ydd rt4iy r1tr rtr4a rt5rwy rt2u rt3y rub4a r3uc rudd3 3rudd. run4i r1us rw2a rw3ad rw3af r3w4ag r3wait rwb5an rwbl3 r1wc r5wdenn rwedd3 r4weddog r4weddol r4w3eid r3wel r3wer r2wg rw5hel rw1i rw3in r3wl r4wnc rw4ni rw4n3o rwobr4 rw3od rw5old r1wr rwr5es rwr4iaetho rw2y r4wyb r5wydden. rwydd4iad4u r4wyde r4wydo rwydr3 r4wydy 3rwym rwyn3 r4wys 3ry. 3rybl ry3bo rych5wai r2yd r4yd. ry5dano rydd4on. rydl4 ry3f4a ryf2e ry3fer ryf4od ryl3a ryl2e ryl5it rym2r3 ryn3a rync4 4rynd ryn3e ryn3f ryng5a 4rynn rynod4 ryno5ded ryno5der ryn3yc rys3b rys5ba rysg5w rysg3y ry3wa ryw3i s1 sach3 saf3a saf3o san3a san3e san3o sarf5a sat4a sath4 sathraw4 s3au sá4it s2b2 sbad4w s4bai s3bet sb3iw sb5iyc s3bl sbr5io sd4or se2 sec4an sedd3 3sef se5ion sen5ol senw3 s4erc serch5 s4eri s2et sf4am sfedd4 sff4y sf4wy sf4yr s2g s5g4adr sg3adw s3gam sg3an sgar5a s3gaw s3geda s3gede s4gedig s5gedo s5gedw sgel4 sg5en. s3ge3na sge5ne s4gia s4gl. sgl3a sgl3o s3gn sg3ni sg3od sg4od. sgo4g3 sg4ol sg3om sg3on sg5oty sg5rwy sg5ryw s4gwc sg3wn s4gyc sgy4f3 sgy3na sgy5nes 2si s5ial. s5ialu si4am 5siand s4iar s3id3 sid4a s3ie s4iet s2ig s3ig. si4ga s3ige sigl3 5sigl. s3igr s5igyn sil4f sins4 s3io s3ir s3it si4wr s2iyn 2s2ï1 2sl2 sl4au slo3na slo3n4e s3ly slyw4 sm2 sm4ar sm4er smwyt5haso s4nau sn2e sneg2 s2n3i sn4ob s3oc sodd3 sod4l3 s3oe sof4l 2s3og3 s3om3 son3 s4on. s4onau son4deba son4der s3one s4ong sra3na sra5ne s2t st3ac s4tade s4taf st4am st2an st3as s4tau st5awc s4tec s4ted s4tei s4t3em s4ten s4tes st3f s5tiro stl3o st5lyt st2o s3tod. sto3ra sto3r4e st4ra s3tra. str3ec str3es str3oc str3ol s4tr3w str3yc st2u st3ur st5us. s5twyi styr3 s2u sur3 s3us sw2a s3wc swcr3 s3we s4wed sw5edd swen3 2swi swmp3 s3wyf swyn3 swy4r s2y s3yc s5ych. s3yd syf4l3 2syg syll3a syllt3 sym4l3 symudad4 2s3yn. syn4fe s3yr syr2a syr2e s3ys 3syt s4ywa 1tac tach3 3tad4l3 tad3r t1af ta4fa taf4l tag3 t1ai t3aid t5aliae tal2m3 t1an 4tanc tan3e tang5n tan3o tan3w t3ao 3tar4d tar4f t1as tat1 t1au tawl3 t1b t3ch t1ec t1ed tedd3 4teg. 4tegio t3eidi teimlad4w tel4y t3em. t4emi t1en ten4d te4ne terf4 terfyn5 t1es t4esa tes4io tet4a 3tew 4tew. 4tewc tew5id t1f tff2 tff4e tfod4 tfydd4 t1g2 tg4af tg4an tg4en tg4er tgl4a tgn2 t2gor t5gor. t5goria t5gorn tg4wc tg4wy tgy3w t2h thalad4 thal4m3 thang5n th4ar thar4f th4at that5y th1e th4ef th5ell therfyn5 thet4 thl3a thl5ent th5let th3n th5nod th1o th5old thollt4 thon4e thorad4 thr3ac th3red thr5ent thrid4 thro3f th5rwf thryd4 thry5da th3ug th3um th3un th3us th1w th3wa th4wl th3wyd th3wyf thwysg4 th3ych thydd5 th5yma thyrf4au thyr3w thy4w 2t1i t3ia tid3 t3ie t3in ting3 t4ino tion4 t4iono tï5ol. tl3a tl4ae tl1e tl4en. tl3on tl3wy t3lyd t1n2 t3och t4od. t3odd to4ec to3edi to4em to3esi tof3 t3og3 3tois t2ol tollt4 tol3y t1om t3om. t1on ton4e t3ont 3tor tor2a tor4c t3os to4wc to4wn tra3c tra3dd tr3adw tr3af. tra3g tra3na tra5ne tr3ant 3traw tr3ed 3tr4ef tref5a tref3l 4treg tr3em. tr3ent 3trew tr3id4 tr5ig. tro4ada tr3odd tro5fa tr3ola tr3olo tr3olw tron4o tr3ont 2trw tr4wm tr3wn tr5wyd. t5r4wydd tr3wyf try3da tryd4y try3f try3l tr5yn. 3tryw ts2 ts5ach t1se ts3i 3tud tudr4 1tum t1un3 1tur t4urm tw2 t3wai t1wc t1wn t1wr1 twr4n 3twya t3wyd 3twye t3wyf tw4ym 3twyo twysg4 3twyw t1yc t1yd tydd5y ty5gar ty3li tymp4 4t3yn. tyng5ad 1tyr tyr2a tyr4es ty3wr 2u1a ual3 u2and u4ane u3ar u3aw ub1 2uc uch1 uch3e uch5ed ud3ad u5dale udd1 udd3a udd4eg udd3el udd3f udd3i ud5eir ud3er ud3i ud1l udr3 ud5rwydd ud2w ud3wn ud3wr ud3yn u1e uedd3 u4estai. u4estau u4estwr u4esty uf5au. uff4y uf3y ug3ad ug3af ug3en ug3i ugl3a ugl3e ug3lw ugn3 ug1o ug1u ug1w ug3y u1h2 u1i ul3ad ul3af u5lan. u5lann ul3ant u5lath ul3d u2l1e ul1f ul5igr ull1 u1lo ul3oc ul3od ulon3 ulon5e ul1u ul1w ul3yc u3lyd un1 un4edy un5ell un5es. un3i unig3 un5od. un2ol un5ol. 2u1o uog3 u3os3 up2 ur1 urb4w ur5ddu ur3e ur5fau ur4fl ur2gy 4urn. urof4 ur2s3 ur4ty ur4ud u5rwydd ur3y ur4yw 1us. us4edda us5end usg1 4usi. us3o 3usr us3ter us3tod us3tr ut3a ut1e uth4r3 uth3u uth4un ut3o utr3 2u1w u2wc uwch3 u1y 2wa wac5ew wadd3 wad2n3 w5adwy. waen4i waer2 wag1 w1ai w3ai. w3aid w2air w3ais w4ait wallt5 w4an. wan3a wan3e wan3o war5ddr war3e war4edd war5ia warth4 wart5hai wart5has wart5hi wart5hw war3w 3w4as. w3ase was4g w3asi w3aso w4as4t w3asw wat5er w1au 2wb wbl5es w2c 2wca wc4ed wch1 4wchu 2wci wc5wll wc4yn 2wd wdd3eg w5ddew wd2e wd3ed wde3n4a wde5n4e wd3i wd4ih wd3ly w3dod. wdr1 wd4ra wdry4 wd2u w1eb3 2w1ec 2w3ed. w4eda 4weddf 4weddi 4wedi w3edig we4gi wegr4 wein3 well5ti wel3o welw5l 2w1em wen3au wen4d 2w3ent wenwyn5 wen3y 2w3er. wer4i wer5id w4ers wer4yd 2wes 4w3esi w4esir w4esit 5west. west4ai w1et w4eth 2weu weu2g weun3 2wf2 w1fa w1fe wff3a w1fi wf4id w1fo wfor2 w1fw wf4wy w3fy wg1 2wg. w5gig. 2wgl wg3n 2w1h2 w3he w3hw 2wi wi4an wib5an wibl5a wib5ol widl3 wi4fr 3wig1 wigl5e wil3 win5gada win5gade win5gadi win5gado w4ione wir3 wisg3 w1it 3wiw. wiw4e 2wl 3wlad. wlan3 wl4co wl3in w4lip wll5yn wl5ws. wl4yc 2wm wm3a wman3 wm4br wm2i wm5iai wm5ian wm4wl wn1 wn5adwy. wn2ae 2wnd wn3de wn3di wndr3 wn4ei wn4êl 2wn3g wngl4 wn3in wn3l wn2o w4n3oc wn3odd wn3og wn3ol w4n3om w4n3on 2wnw 2w1o w2od w3od. w3odd w2ol w3ol. w3olae w2or 2wp wp3e wpl1 wp5wrd wr5aet wrb5yn wrc2 wr3ca wr4ce wr4ch3 wr4ci wr5cwd 2wrd wr5dei wr3ed wreig3 wr5esi wr3f wr5fau wr4fi 4wri. wrid3 wr3id. wr3ie wr3l wr4ll wr3n2a wrn4es wr3no wr1o wr2t wrth3 wr1w wr4ws w5rwydd wry4w ws5bre ws3e ws3g ws4gl ws4ig ws4og ws4ta wst5an ws5ter. wstr3 ws4us ws3wa 2wt wt3a wtan3 wt3em wt5ery wth1 4wth. wth3w wt3od wt3wy wt3y 2w1w 2wya wy5alc 4wybr wybr5y wy3bu w1yc wych3 wyd3a 2wydd wydd4ly wydd4yd wydr3o 2wydy 2wye wy3fr wy3h 2wyi 2wyl wyl4deb wyll3a wyn5ad. 4wynd wyn3eg wyn3f wyn3g4 wy4ni wyn3o wyn3y 2wyo wyr3ad wy3ran 5wyrdd. wyrl3i 2wys 2wyt 2wyw wy3wr wy3wy 2wyy 2y1a y3ar3 y4ar. y4arn 2yb yb4ac yb5edd yber4 ybl1 yb3ly ybr1 ybr3i yb3w ych1 ychan5 ych4anwr ych5ei ych3r 4ychwe ych3wy ychwy5na ychwy5ne ycl3 2yd. 2yda yd3ad yd4al yd2an3 y3dana y3dane yd3ant y5danw y3dar yd3as yd3au ydd3 ydd5an yd4de yd4df4 yd4di4 ydd4in. ydd4of ydd5yn. yddy5ne ydd4ysg 2yde y3deb yd3ed yd4eddau yd3ei yd3er yd4eu yd5ffu ydfwr3 ydfyn3 yd3i yd1l yd4ma yd2ne ydne5b 2yd3o yd4od. ydol3 yd4os 4ydrau ydr3ec ydr3em ydr5esid yd3rew yd4ri 4ydria ydr3oc 4ydrol ydr5wyd. yd5rwydd 4ydry ydr3yc 2ydw yd3wa yd5wed ydweithi5ol ydwel5e yd3wr yd1y ydy4l y1e y3el y4era y4ern 2yf1 y4f3ag yf3ai yfan3t yf3are yf3arh yfar5wa yf3eda yf3ede yf3edi yf3edo yf3edw yf3ei yfel3 yf5erf yfer3n yf5esi yf5ewi yff1 yf4fa yf5fait yf5fei y4ff3i yff5in y4ffl yffr3a yffro5ed yffro5em yffro5en yffro5wc yffr3w yff3ry yf3i yfl4ed yflo3e yf3ne yf3no yf3ny yf3o yf5od. yfogl4 yf5rait yfra5ne yf5ryw yf3u yf5wng yf3yg yf5yn. yfy3na yfy5ne yfyng5 yf4yt yg1 yg3a yg5adu yg4ar ygeg4 yg4eid yg3i yg4il 3ygin ygl3a ygl3o ygl3w ygl3y ygn3 yg3o yg4oe yg4of ygr1 ygrad4 yg5wyd y4gyc 4ygyd y1h2 y2he yhe3i yhe3w y1i y3ie yl3ad. yl5adwy. yl3af ylan3 yl3ant y5law. 2ylc ylch3w yl4dera yl1e yl1f y3lin y4lit yll5ad. yll3e 4yllf yll5ida yll3o yll3w yll3y yl5nos yl3oc yl3od yl3on yl5ore y4lu. 4ylwe yl3wy yl1y ym5ait ym4al ym5an. yman5t ymar5w ymbl2 ym5edr ym4eri ym5es3u 3ymg ym3heu ym2le ym2li ymlo5ne ym4oli ym3on ymp3a ym4pi ymp5od ym3pr ymra5ne ymr5ig ymro5e ym4ru ym3se ym4um 5ymwyb ym3y ymyn5y ym5yra ym5yre ym5yri ym5yro ym5yrw yn4ada yn3ae yn3af yn3ai yn3an3 ynas3 2yn3au yn4aw yn5byn ync5ed yn3dir yn4eb yn3ec yn3ed. yn3edd yn2eg yn3ei yn3em yn3en yn3er y3nesa y4nesau 2ynf ynfyd3 2yng1 yn4ge yng5er yn3gl yniaw4 yni4d yn3i4f y3nig yn5igy yn3il3 yn3n yn1o yn5o5ad yn5odd yn4odi yn4ody yn3oe yn3os4 2ynr ynt1 ynt4a yn4te yn4ti yn4to yn4tu yn4ud yn1w yn3wa yn2w4e yn3wy yn4wyr yn1y yn2yc ynydd5 y1o ypl3a ypl3e ypl3o ypl3w yp3ly yr3ae yr3af yra3na yra3ne yr3ant y4r3au yr4ch yrch3e yrch3o yrch3w yrch3y yr4dd3 yr5ddyd yr1e yr2ei yr5el. yren5d yrf3e yr3ff4 yr4fu yrf5yd y4ria yr3id yr2l yr3ly yrn3 yr1o yr5ol. yr2s yr1w yr5way yr1y 2ysa ys3aw 2ysb ysb5ïw ys4bl ysb3yd 2yse ys5etl 2ysf 4ysgar. ys5garai ys5garasa ys5garia ys5garwy ysge4 ysgl4e ysg5lw ys4gn 3ysgr ys4gy 2ysi ys5ni. 2yso ys3od 4ysol ys5ol. ys3ta 4yste yst5eb ys5ted ys3ter ys4try yst4w ys3u 2ysw ys4we ys4wi 2ys3y ys4yg yt3ad yt1e yth3a yth3e ythi3e yth3l yth3o yth4re ythr5ec ythr5ed ythr5es yth5reu ythr3o yth5rwb ythr5yc yth5ur yth3w yth3yn yt5iro yt3o ytr2 yt3ras yt3s ytw5ad yt3wy yt5ysa 2yw yw4ae y3wait y1wc y3wedd y5weddia yw5eg. y4wel yw5en. yw3es yw1g2 y4wia yw3id y4wio y4wir. y1wn yw3ol y2wr1 ywr4a ywr5ain y4wyc y3wyf ywy3na ywy5ne y1y",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=6728,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-cy.rme b/Master/texmf-dist/tex/context/patterns/lang-cy.rme
index 7a7ed664048..e921b877fcf 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-cy.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-cy.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Welsh Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -61,4 +65,4 @@
%------------------------------------------------------------------------------
%
% Welsh patterns
-% Yannis Haralambous 1996 \ No newline at end of file
+% Yannis Haralambous 1996
diff --git a/Master/texmf-dist/tex/context/patterns/lang-da.lua b/Master/texmf-dist/tex/context/patterns/lang-da.lua
new file mode 100644
index 00000000000..148ea7bfeed
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-da.lua
@@ -0,0 +1,95 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="da",
+ ["source"]="hyph-da",
+ ["texcomment"]="% Danish Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: dkcommon.tex (yyyy-mm-dd), dkspecial.tex (yyyy-mm-dd)\
+% Author: Frank Jensen <frank.jensen at hugin.com>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% This file contains the hyphenation patterns for Danish.\
+%\
+%% Copyright 1994 Frank Jensen (Frank.Jensen@hugin.com)\
+%\
+% This work may be distributed and/or modified under the\
+% conditions of the LaTeX Project Public License, either version 1.3\
+% of this license or (at your option) any later version.\
+% The latest version of this license is in\
+% http://www.latex-project.org/lppl.txt\
+% and version 1.3 or later is part of all distributions of LaTeX\
+% version 2003/12/01 or later.\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyzåæø",
+ ["data"]=".ae3 .an3k .an1s .be5la .be1t .bi4tr .der3i .diagno5 .her3 .hoved3 .ne4t5 .om1 .ove4 .po1 .til3 .yd5r ab5le 3abst a3c ade5la 5adg a1e 5afg 5a4f1l af3r af4ri 5afs a4gef a4gi ag5in ag5si 3agti a4gy a3h ais5t a3j a5ka a3ke a5kr aku5 a3la a1le a1li al3k 4alkv a1lo al5si a3lu a1ly am4pa 3analy an4k5r a3nu 3anv a5o a5pe a3pi a5po a1ra ar5af 1arb a1re 5arg a1ri a3ro a3sa a3sc a1si a3sk a3so 3a3sp a3ste a3sti a1ta1 a1te a1ti a4t5in a1to ato5v a5tr a1tu a5va a1ve a5z 1ba ba4ti 4bd 1be be1k be3ro be5ru be1s4 be1tr 1bi bi5sk b1j 4b1n 1bo bo4gr bo3ra bo5re 1br4 4bs bs5k b3so b1st b5t 3bu bu4s5tr b5w 1by by5s 4c1c 1ce ce5ro 3ch 4ch. ci4o ck3 5cy 3da 4d3af d5anta da4s d1b d1d4 1de de5d 4de4lem der5eri de4rig de5sk d1f d1g d3h 1di di1e di5l d3j d1k d1l d1m 4d1n 3do 4dop d5ov d1p 4drett 5d4reve 3drif 3driv d5ros d5ru ds5an ds5in d1ski d4sm d4su dsu5l ds5vi d3ta d1te dt5o d5tr dt5u 1du dub5 d1v 3dy e5ad e3af e5ag e3ak e1al ea4la e3an e5ap e3at e3bl ebs3 e1ci ed5ar edde4 eddel5 e4do ed5ra ed3re ed3rin ed4str e3e 3eff e3fr 3eft e3gu e1h e3in ei5s e3je e4j5el e1ka e3ke e3kl 4e1ko e5kr ek5sa 3eksem 3eksp e3ku e1kv e5ky e3lad el3ak el3ar e1las e3le e4lek 3elem e1li 5elim e3lo el5sa e5lu e3ly e4mad em4p5le em1s en5ak e4nan 4enn e4no en3so e5nu e5ol e3op e1or e3ov epi3 e1pr e3ra er3af e4rag e4rak e1re e4ref er5ege 5erhv e1ri e4rib er1k ero5d er5ov er3s er5tr e3rum er5un e5ry e1ta e1te etek4s e1ti e3tj e1to e3tr e3tu e1ty e3um e3un 3eur e1va e3ve e4v3erf e1vi e5x 1fa fa4ce fags3 f1b f1d 1fe fej4 fejl1 f1f f1g f1h 1fi f1k 3fl 1fo for1en fo4ri f1p f1s4 4ft f3ta f1te f1ti f5to f5tvi 1fu f1v 3fy 1ga g3art g1b g1d 1ge 4g5enden ger3in ge3s g3f g1g g1h 1gi gi4b gi3st 5gj g3k g1l g1m 3go 4g5om g5ov g3p 1gr gs1a gsde4len g4se gsha4 g5sla gs3or gs1p g5s4tide g4str gs1v g3ta g1te g1ti g5to g3tr gt4s g3ud gun5 g3v 1gy g5yd 4ha. heds3 he5s 4het hi4e hi4n5 hi3s ho5ko ho5ve 4h3t hun4 hund3 hvo4 i1a i3b i4ble i1c i3dr ids5k i1el i1en i3er i3et. if3r i3gu i3h i5i i5j i1ka i1ke ik1l i5ko ik3re ik5ri iks5t ik4tu i3ku ik3v i3lag il3eg il5ej il5el i3li i4l5id il3k i1lo il5u i3mu ind3t 5inf ings1 in3s in4sv inter1 i3nu i3od i3og i5ok i3ol ion4 ions1 i5o5r i3ot i5pi i3pli i5pr i3re i3ri ir5t i3sc i3si i4sm is3p i1ster i3sti i5sua i1ta i1te i1ti i3to i3tr it5re. i1tu i3ty i1u i1va i1ve i1vi j3ag jde4rer jds1 jek4to 4j5en. j5k j3le j3li jlmeld5 jlmel4di j3r jre5 ju3s 5kap k5au 5kav k5b kel5s ke3sk ke5st ke4t5a k3h ki3e ki3st k1k k5lak k1le 3klu k4ny 5kod 1kon ko3ra 3kort ko3v 1kra 5kry ks3an k1si ks3k ks1p k3ste k5stu ks5v k1t k4tar k4terh kti4e kt5re kt5s 3kur 1kus 3kut k4vo k4vu 5lab lad3r 5lagd la4g3r 5lam 1lat l1b ldiagnos5 l3dr ld3st 1le. 5led 4lele le4mo 3len 1ler 1les 4leu l1f lfin4 lfind5 l1go1 l3h li4ga 4l5ins 4l3int li5o l3j l1ke l1ko l3ky l1l l5mu lo4du l3op 4l5or 3lov 4l3p l4ps l3r 4ls lses1 ls5in l5sj l1ta l4taf l1te l4t5erf l3ti lt3o l3tr l3tu lu5l l3ve l3vi 1ma m1b m3d 1me 4m5ej m3f m1g m3h 1mi mi3k m5ing mi4o mi5sty m3k m1l m1m mmen5 m1n 3mo mo4da 4mop 4m5ov m1pe m3pi m3pl m1po m3pr m1r mse5s ms5in m5sk ms3p m3ste ms5v m3ta m3te m3ti m3tr m1ud 1mul mu1li 3my 3na 4nak 1nal n1b n1c 4nd n3dr nd5si nd5sk nd5sp 1ne ne5a ne4da nemen4 nement5e neo4 n3erk n5erl ne5sl ne5st n1f n4go 4n1h 1ni 4nim ni5o ni3st n1ke n1ko n3kr n3ku n5kv 4n1l n1m n1n 1no n3ord n5p n3r 4ns n3si n1sku ns3po n1sta n5sti n1ta nta4le n1te n1ti ntiali4 n3to n1tr nt4s5t nt4su n3tu n3ty 4n1v 3ny n3z o3a o4as ob3li o1c o4din od5ri od5s od5un o1e of5r o4gek o4gel o4g5o og5re og5sk o5h o5in oi6s5e o1j o3ka o1ke o3ku o3la o3le o1li o1lo o3lu o5ly 1omr on3k ook5 o3or o5ov o3pi op3l op3r op3s 3opta 4or. or1an 3ordn ord5s o3re. o3reg o3rek o3rer o3re3s o3ret o3ri 3orient or5im o4r5in or3k or5o or3sl or3st o3si o3so o3t o1te o5un ov4s 3pa pa5gh p5anl p3d 4pec 3pen 1per pe1ra pe5s pe3u p3f 4p5h 1pla p4lan 4ple. 4pler 4ples p3m p3n 5pok 4po3re 3pot 4p5p4 p4ro 1proc p3sk p5so ps4p p3st p1t 1pu pu5b p5ule p5v 5py3 qu4 4raf ra5is 4rarb r1b r4d5ar r3dr rd4s3 4reks 1rel re5la r5enss 5rese re5spo 4ress re3st re5s4u 5rett r1f r1gu r1h ri1e ri5la 4rimo r4ing ringse4 ringso4r 4rinp 4rint r3ka r1ke r1ki rk3so r3ku r1l rmo4 r5mu r1n ro1b ro3p r3or r3p r1r rre5s rro4n5 r1sa r1si r5skr r4sk5v rs4n r3sp r5stu r5su r3sv r5tal r1te r4teli r1ti r3to r4t5or rt5rat rt3re r5tri r5tro rt3s r5ty r3ud run4da 5rut r3va r1ve r3vi ry4s s3af 1sam sa4ma s3ap s1ar 1sat 4s1b s1d sdy4 1se s4ed 5s4er se4se s1f 4s1g4 4s3h si4bl 1sig s5int 5sis 5sit 5siu s5ju 4sk. 1skab 1ske s3kl sk5s4 5sky s1le s1li slo3 5slu s5ly s1m s4my 4snin s4nit so5k 5sol 5som. 3somm s5oms 5somt 3son 4s1op sp4 3spec 4sper 3s4pi s1pl 3sprog. s5r4 s1s4 4st. 5s4tam 1stan st5as 3stat 1stav 1ste. 1sted 3stel 5stemo 1sten 5step 3ster. 3stes 5stet 5stj 3sto st5om 1str s1ud 3sul s3un 3sur s3ve 3s4y 1sy1s 5ta. 1tag tands3 4tanv 4tb tede4l teds5 3teg 5tekn teo1 5term te5ro 4t1f 6t3g t1h tialis5t 3tid ti4en ti3st 4t3k 4t1l tli4s5 t1m t1n to5ra to1re to1ri tor4m 4t3p t4ra 4tres tro5v 1try 4ts t3si ts4pa ts5pr t3st ts5ul 4t1t t5uds 5tur t5ve 1typ u1a 5udl ud5r ud3s 3udv u1e ue4t5 uge4ri ugs3 u5gu u3i u5kl uk4ta uk4tr u1la u1le u5ly u5pe up5l u5q u3ra u3re u4r3eg u1rer u3ro us5a u3si u5ska u5so us5v u1te u1ti u1to ut5r ut5s4 5u5v va5d 3varm 1ved ve4l5e ve4reg ve3s 5vet v5h vi4l3in 1vis v5j v5k vl4 v3le v5li vls1 1vo 4v5om v5p v5re v3st v5su v5t 3vu y3a y5dr y3e y3ke y5ki yk3li y3ko yk4s5 y3kv y5li y5lo y5mu yns5 y5o y1pe y3pi y3re yr3ek y3ri y3si y3ti y5t3r y5ve zi5o .så3 .ær5i .øv3r a3tø a5væ brød3 5bæ 5drøv dstå4 3dæ 3dø e3læ e3lø e3rø er5øn e5tæ e5tø e1væ e3æ e5å 3fæ 3fø fø4r5en giø4 g4sø g5så 3gæ 3gø1 3gå i5tæ i3ø 3kø 3kå lingeniø4 l3væ 5løs m5tå 1mæ 3mø 3må n3kæ n5tæ 3næ 4n5æb 5nø o5læ or3ø o5å 5præ 5pæd på3 r5kæ r5tæ r5tø r3væ r5æl 4røn 5rør 3råd r5år s4kå 3slå s4næ 5stø 1stå 1sæ 4s5æn 1sø s5øk så4r5 ti4ø 3træk. t4sø t5så t3væ u3læ 3værd 1værk 5vå y5væ æb3l æ3c æ3e æg5a æ4gek æ4g5r ægs5 æ5i æ5kv ælle4 æn1dr æ5o æ1re ær4g5r æ3ri ær4ma ær4mo ær5s æ5si æ3so æ3ste æ3ve øde5 ø3e ø1je ø3ke ø3le øms5 øn3st øn4t3 ø1re ø3ri ørne3 ør5o ø1ve å1d å1e å5h å3l å3re års5t å5sk å3t",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=1144,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-da.rme b/Master/texmf-dist/tex/context/patterns/lang-da.rme
index 2b9c01b54ae..b8de3bf194e 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-da.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-da.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Danish Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -71,4 +75,4 @@
% http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-de.lua b/Master/texmf-dist/tex/context/patterns/lang-de.lua
new file mode 100644
index 00000000000..885f48f018a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-de.lua
@@ -0,0 +1,53 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="de",
+ ["source"]="hyph-de-1996",
+ ["texcomment"]="% German Hyphenation Patterns (Reformed Orthography)\
+% \
+% (more info about the licence to be added later)\
+% \
+% dehyphn-x-2009-06-19.pat\
+% \
+% \\message{German Hyphenation Patterns (Reformed Orthography, 2006) `dehyphn-x' 2009-06-19 (WL)}\
+% \
+% TeX-Trennmuster für die reformierte (2006) deutsche Rechtschreibung\
+%\
+%\
+% Copyright (C) 2007, 2008 Werner Lemberg <wl@gnu.org>\
+%\
+% This program can be redistributed and/or modified under the terms\
+% of the LaTeX Project Public License Distributed from CTAN\
+% archives in directory macros/latex/base/lppl.txt; either\
+% version 1 of the License, or any later version.\
+%\
+%\
+% The word list is available from\
+%\
+% http://repo.or.cz/w/wortliste.git?a=commit;h=e4826ce7db99bceb6043be48983ff2b67d56669f\
+%\
+% The used patgen parameters are\
+%\
+% 1 1 | 2 5 | 1 1 1\
+% 2 2 | 2 5 | 1 2 1\
+% 3 3 | 2 6 | 1 1 1\
+% 4 4 | 2 6 | 1 4 1\
+% 5 5 | 2 7 | 1 1 1\
+% 6 6 | 2 7 | 1 6 1\
+% 7 7 | 2 13 | 1 4 1\
+% 8 8 | 2 13 | 1 8 1\
+% \
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyzßàáâäçèéêëíñóôöü",
+ ["data"]=".ab1a .abi4 .ab3l .abo2 .ab3ol .ab1or .ack2 .ag4n .ag4r .ag2u .ai2s .akt2a .al3br .al2e .al5l4en .al4tei .alt3s .ampe4 .amt4s3 .an3d2 .anden6k .and4ri .ang2 .an3gli .angs4 .angst3 .an3s .an4si. .ans2p .ans2t .an4tag .an3th .apo1 .aps2 .ari1e .ark2a .ar4m3ac .ar2sc .ar4t3ei .as3t .as4ta .at4h .au3d .au2f3 .au4s3 .ausch3 .ax4 .äm3 .ät2s .be3erb .bei6ge. .be3ra .be3r2e .berg3a .ber6gab .ber4g3r .boge2 .bo4s3k .bu4ser .by4t .ch2 .dab4 .da2r1 .da4rin .darm1 .da4te. .da4tes .de2al .de1i .de4in. .de1o2 .de3r4en .de1s .des2e .de3sk .des2t .dien4e .do2mo .do1pe .dorf1 .dü1b .dys1 .ebe2r1 .ehe1i .ei3e2 .ei4na .einen6g .ei2sp .ei4st .ei4tr .eke2 .el2bi .elb3s .em3m2 .en1 .en4d3er .en5der. .en2d3r .end3s .enn2 .enns3 .en2t3 .en4tei .en4tr .er8brecht .er2da .er4dan .er4dar .er4dei .er4der .er1e .ere3c .erf4 .er1i .er8stein .er8stritt. .er8stritten. .er4zen4 .es1p .es3ta .es5t4e .est2h .es3to .es5tr .et2s .eu1 .eu3g4 .eu3t .eve4r .ext4 .fe2i .fer4no .fi3est .fi4le. .fi4len .fi2s .flug1 .for2t .fs4 .fu2sc .ga4t .gd2 .ge5nar .ge3ne .ge3r2a .ge3r2e .ge3u .gs4 .guss1 .hau2t1 .he2 .he3fe .her3an .he3ri .he6r5inn .ho4met .ia4 .im2a .ima4ge .im5m .in1 .in3e .ink4 .inn2e .int6 .inu1 .ire3 .is2a .jor3 .ka2b5l .ka2i .kamp2 .ka4t3io .ki4e .kle2i .kopf1 .ks2 .kus2 .le4ar .li2f .li4tu .lo4g3in .lo3ver .lus4tr .ma3d .ma2i .ma3la .ma2st .md2 .me2e .mel2a .men8schl .men8schw .men3t4 .mi4t1 .mm2 .näs1c .ne4s .ni4e .nob4 .no4th .nus2 .oa3 .ob1a .obe2 .oper4 .or2a .ort2 .orts3e .oste2 .ost5end .os8ten8de .oste6re .ost3r .ozo4 .öd2 .pa4r1e .par3t4h .pf4 .ph4 .poka2 .pro1 .ps2 .ram3s .reb3s2 .re3cha .rein4t .reli1 .reli3e .res6tr .ri2as .richt6e .ro4a .ro3m2a .rö2s1 .rü1b .rü6cker6 .sali3e .sch4 .se3ck .sen3s .ser2u .se2t1 .sha2 .sim3p4 .si4te .ski1e .spiege8lei .st4 .sto4re .sucher6 .tage4s .tal2e .tan4k3l .ta2to .te2e .te2f .te3no .te2s .te4st .th4 .ti2a .tid1 .ti2s .ti5ta .tite4 .to4nin .to4pl .to2w .tri3es .tro2s .ts2 .tu3ri .uf2e2 .ufer1 .ul4mei .um3 .umo2 .un3a2 .un3d .un3e .un3g .uni4t .un3s .uns4t .ur1 .ur2i .urin4s .ur3o2m .uro2p .ur3s2 .ut2a .ut3r .übe4 .ve5n2e .vo4r .wah4l .wa2s .wei4ta .wi4e .wor2 .wort5en6 .wor8tend .wor4tu .xe3 .ya4l .za2s .zi2e .zin4st .zwe2 2aa a1ab aa2be aa1c aa2gr 4a1a2n 4a2ar aa2r1a aar3f4 aart4 aas5t aat4s3 a3au a1ä a1b 2aba ab1auf ab1ä ab2äu 1abd ab1eb abe1e abei1 ab1eil 2abel abe2la a3ber ab1erk ab1err ab1erz ab3esse 2abet 2abew 1abf 3abfi 1abg 1abh 2abi ab1ins ab1ir ab1it 1abk ab1l 1a2bla ab5lag 1a2blä 2able ab4le. ab3li ab4lo 3a2blö a2blu 1abn a2bo. ab2of a2bon 2abor ab3r a3bra a4brä 2abrü 1abs 2abs. abs2a 2absar ab3s2i ab3sp abst4 2abst. ab3ste ab3sz 1abtei 2abu ab1ur 2abü 1abw 2aby aby4t 1abz 2ac. 2aca 2ac1c a1cem 2ach. ach1a a1chal ach3au 2achb a1che a2ch1e2c ach1ei a4cherf a4cherk a4cherö a4ch3erw 4achf a1chi ach3l ach3m ach3n a1cho a3cho. ach1o2b ach1or ach3ö ach3r ach3su a4cht acht5erg ach2t1o ach8traum ach8träume. ach8träumen. ach6trit a1chu ach1u2f ach3ü 2achv 4ach1w a1ci ac1in a1ckar ack2en a2ckin ack2se ack3sl ack3sta4 a1cl acon4n 2acu a1ç a1d 2ada. a3d2ab ad2ag ad3ama a2d1an 3a4dap a3d2ar3 4adav 1a2dä ad1c 1add 2ade. ade2al adefi4 a2dein 2aden ade1r2a a2deri 4ade1s ade3s2p ades4s ade5str 2adf 2adh 4a3di adi3en 5adj 2ado ad2ob 2adp 2adq 2ad3rec ad4res ad3ru 2ads2 ad3st ad3sz 2ad2t1 ad4te ad4tr 2adu 2a1e ae2b ae2c ae2d a2ek a2ela a2ele ae2o3 ae2p 3a2er2o1 aes5t a2et a2ew ae2x af1a a2fak a2fan a3far af4at a2fau 2afe a2f1ec a2fent af1erl a2fex af2fl af4flu 2afi 2af3l afo1s a2fö af3ra af3rä af3re af3rö af3s2a af2sp af2t1a af2tei af4t3erl af2t3r af4t5re af2tur a2f3ur a1g 2aga ag1ab ag1a2d ag1ar ag1au ag2di ag2dr ag2du age1i age4na age4neb a2gent a4gentu age4ral 2ages age2sa age4sel age4si age2s3p ag3esse age4s3ti ag3gl 1aggr 3a2git 2a2gl ag4la a4glö ag2n ag4ne. ag4nu a2g3re a2g3ri ag4ro agsa2 ag4sam ag4set ags3p ag4spo ag3sta ag3ste ags4toc 2agt ag2th a2gund 2ah. 2a1ha ah4at 2a1he a2h1erh ahe1s a1h2i ahin3 ahl3a2 ah4l1ei ah4l3erh ah2lö ahl3sz ah4n1a ahner4e ahnt2 1ahor ah1os a2h3ö ahr1a ah3r2e ahre4s3 ah3ri ahrta4 ahr6tri 2ahs aht3s a1hu ah1w a1hy 2ai aian3 aid2s ai1e2 aien3 aif2 ai3g4 a3ik. ai3ke ai3ku a2il ai2lo a1ind ain4e a1ing ain3sp ai2sa a3isch. ai3s2e aiso2 a3iv. aive3 a3ivl a3ivs a1j aje2 2ak. 1a2k4ad 2akal 2a3kam 2akar ak4at 1a2kaz 2akb 2akc 2akd 4a1ke a2kef aken2n a2keu 2a1ki 2ak3l ak4li 4ako 2a1kr 4akra ak3rau 3akro 2aks ak3sh 2akta ak5tan 2aktb 2aktik ak2t3r ak5t4ri 2aktst 2a1ku a2kun 4a3kü 1akz a1la 2ala. al1ab ala5ch2 al1af ala2g al1age a3lal al1am al3ame alami5 al3amp al1ana a2l1ang al1ans al1anz a2lar a3lar. a3lare al2arm al3arr ala4s al1asi al1ass 2alat al1au al3aug a1lä al1äm alb3ein alb3eis al4berh al4b3erw al2b1l alb3li al2boh al2br alb3ru alb3s al2dä al2dr alds2t al3du 2ale 3a2l1e2b 3a2l1ef a4l1eh a2l1ei a4l3ein a2l1el alen1 al3ends a2leng ale2p al1epo a2l1erf a2l1erh al1erl 3alerm a2l1ert 3a2lerz a2l1esk ale4t al1eta al1eth a2l1eu a4leur 3a2lex alf4r 3algi al2gli 2ali ali4ene ali4nal al1ins a2linv alk1ar 1alkoh alk3s2 alks4t al2lab al2l3a4r al2lau al3lend all5erfa al3les alli5er. alli7ers. al2lob 3almb 2alo a2l1o2b alo2ga al1ope al1orc a2l1ö al2ös 3alpe. 1alph al3skl al4spal al5s6terb al3sun al2tak al3tam alt3eig al4t3erf al2tre al2tri alt3ric al2tro alt2se alt4stü a1lu al2uf a2lum al1umb al1ur 4aly alzer4z al2zw 2am. 2am2a amab4 amad2 ama3g 2amä 2ambiq 2am4e 4ame. a2meb ame2n1 amer2a a2meri ame3ru a4mesh a3met a2mew 2amf a3mi. a3mie 2a3mir a3mis ami3ta ami3ti 2amk 2aml 2ammal am2mei am2min 2amml ammu2 a2mö amp2fa2 am3pr 2am2s am3sa am4schl am3str 1amt. am2t1a am2t1ä am4tel 2amtem am4t3ern am4tö am2t3r am4tre am2tu 2amu 2ana. 2anab ana3c anadi3 a3nak an1alg ana4lin 2anam 2anan 2ana1s4 an1äs 1anb 2anbu an3ch 2and. an3dac and4art andel4s ande2s an2dex an2d3rü and4sas and6spas and3ste and2su 2andu and1ur 2ane an3e2c a3nee an2ei. an3eif an1e4k 3a4n1erb an1eth 1anf 2anfi anft5s an3f2u 4ang. 3angeb an2g1ei an4g3erf an4g3erl an4g3erz 2angf 2angh 2angie ang1l an2gla 2ango ang1r an2g3ra 4angs. ang4s3po 1anh 2a3ni an2id ani5ers. 3a4nim a4nins 2anj 2ank. an2k1an an2kei an3kl an4klö an2k3no ank1r an2k3ra an2k3rä ankt4 an2ky 1anl 2anmu 2ann 3an3na ann2ab 3annä an3n2e an1od a3nol a2n1or a3nos a1nö 2anpr 1anr 1ansä 1ansc ans2en an2seu 2ansk an3skr ans1pa 1anspr an3s2z 2ant. an2t3a4r 1antá 1antei 3antenn an3t4he 1anthr 2anto 1antr ant3rin an2tro 1antw 2a1nu anu3s a1nü 1anw 2anwet 2anzb 1anzei 2anzg an2z1i4n 2anzs 1anzü 2anzw an2zwi 2ao ao1i a1op a1or a1os3 ao3t2 a3ot. a1ö a1p 2ap. 2apa 2ape a2pef a3pel a2pé a2pf ap2fa a3pfl a3phä a2pht 2ap3l ap2n a2pot 3appl ap3pu 2apr 2a3pu 2aq 2ar. a1ra a3ra. ar2ab ar3abt ara3d2 a2r3al a3ra3li a2r1ang a2r1ans a2r1anz a2r3app 2a2rar a2r1au a1rä 1arb 2arb. 4arba ar2bau ar2bec 2arben 2arbi ar2bl 2arbr ar2bre 2arbs2 2arbt 2arbu ar2b3un 1ar1c ar2dro 2are a2rea ar1eff a4reg a2reh ar1ehr a2rein a4rek a3ren aren4se are3r2a ar2erf a2r1erh a2reri a2rerl are3u ar2ew 2arf arf1r ar2f3ra ar2gl ar2gn 2arh 2ari ar2ia ari3e4n ari3erd ari3erg ar1im arin3it ar1int a3riu ar2kal ark3amt ar2k1ar ark3aue ark3lag ar2kor ar4kri ark1s4 ark3sa ark3sh ark4tre ar2les arm2ä ar4merk ar3m2or ar2nan arn2e 2a1ro ar1ob a2r1o2d a2r1op a2ror 2arr ar2r3ad arre4n3 ar2rh arr3he 2arsa ar4schl arse3 ar3s2h 2arsi ar2st ar3sta ar3t2e ar2the ar3t2i artin2 2arto art3r ar4tram ar6tri 2arts 2aru ar1uh ar1um a2rü 2arv arwa2 2ary ar2zä 2arze 1arzt ar2z1w as1ala as3au a2s1ä a2sca a3sche a4schec a3schi asch3la a2schm a3schu 4as2e a2seb a2s3e2m a3ses 4ash a3s2hi asin2g 2asis aska3s a3skop a2s1o2f as1or a2sö a2s1p as3pan as2ph as2pi as2po a3spu as3s2a as3s2e as4s3ei as3s2i as2s1p as2st ass3ti as3str as3stu 2as3ta a1s4tas as4tau as3te as2th as3ti as3to as4tof 2astr ast3rä as6t3re a2sü aswa2s 3a2syl a1ß aße2 aßen3 2a1t ata1 at1ab at2af at4ag a2t1akt ata3l a3tam at1apf at1au a2taus a2t1ä at2c at2e 4ate. a2teb at3eig a2teli 4aten a2tep ater3s2 ate2ru 4ates at2h at3ha 4athe1 3athl 4a3ti atil4s ati2st 3atm 4atmus ato4man 4ator a2t1ort at1ö 4atr atra4t at3rä at3re at3rom at2sa at4schn at2se at4set at2si at2so at2s1p at3ta at4tak att3ang at4tau at2tei at3t4hä at2t3rä att3s a3tub atu2n a3tü atz1er at4zerk at4zerw at2z1in at2zo atz3t2 at2z1w a2u 2au. 2au1a2 2aub au2bli au2blo 4auc auch3ta au2dr 2aue aue2b au5erein aue2s au2fa auf1an 2aufe. 2aufeh auf1er au4ferk auff4 3aufn 2aufs. 2aug 4augeh 4au1i au2is 2auj aule2s au3lü 4aum au2mal au2m1o aum3p2 aum3s6 4aun au3n4a aun2e au2nio au1nu a4unz au1o 2aup2 aup4ter 2au3r2 au2s1ah ausan8ne. au2sau 2ausc au4schm au4scho 1ausd aus3erp au4s3erw 3ausf 1ausg 1ausl au2so au2spr 1ausr aus3s2 3aussag aus4se. auster6m aus5tri 1ausü 1ausz 2aut. au2t1äu 2aute au4ten4g au4t3erh 1auto 2auts4 2auu 2auw 2aux 2auz auz2w 2a1ü 2a1v a3v4a ava3t4 4avi a2vr 2a1w awi3e a1x ax4am ax2e 2a1ya a1yeu ays4 aysi1 ay3t 2a1z az2a az2o az2u ä1a ä1b ä2b3l äb2s ä1che äche1e ä1chi äch3l ä2chr äch2sp äch4st ä1chu ä1ck äck2e ä1d ä2da ä2d1ia ä2dr äd2s 2ä1e äf2fl äf3l äf3r äf2s äft4s3 ä1g äge1i äge3s ä2g3l äg2n ä2g3r äg4ra äg3str 1ä2gy äh1a 2ä3he ä3hi ähl1a ähl2e äh4l3e4be 2ähm äh3ne äh3ri 2ähs 2äh3t4 ä1hu äh1w ä1im ä1is. ä3isch. ä1isk ä1j ä1k ä2k3l ä2k3r ä1la älbe2 äl2bl 2äle äl2l1a äl2p3 äl4schl ä1lu ämi3en 2äml äm2s ämt2e 2än. än5de än2dr 2äne äne2n1 äne1s än2f5 2änge än2gl än2gr äng3se 2ä3ni änk2e än2k3l än2kr änk2s än3n4e2 2äns än2s1c änse3h ä1on ä1pa äp2pl äp2pr äp2s1c äp4st 1äq ä2r3a2 är4af är1ä är1c 4äre ä2r1ei äre2n ä2r1ene är2gr är1int är2k3l ärk2s är4ment ärm2s är1o2 ä1rö ärse2 är4si är2st ärt4e är2th ärt2s3 ä2rü 1ärz är2zw ä5s4e äse3g2 äser4ei äse4ren äser2i äse3t äskop2 äskopf3 ä3s2kr ä2s1p äs6s1c äss2e äs4s3erk äs2st ä4s3t2 äs4tr ä3su ä1ß äß1erk ä4t1a2 ä3te ät2e1i ätein2 äte2n ät2h ät1ob ä2t3r ät2sa ät2sä ät4schl ät4schr ät2s1i äts3l ät2s1p ät2s3t ät4tr ät2zw äu2br äu1c äude3 äu3el ä2uf äuf2e 1äug äug3l 4äul 2äum äu2ma äum4s5 ä2un äun2e äu1nu 2äur 2ä3us. äu4schm äu3se ä3usg ä3usk ä3usn äu2sp äus2s1c 1äuß äu2tr 4ä1v 1äx ä1z â1t á1n ba2bl 2babs bach7t4e backs4 b1a2dr 2b1af 3bah bah2nu bais2 ba2ka ba2k1er ba2k1i bak1l bak1r ba2kra 3bal bal2a bal4l3eh bal6lerg bal3th 2b1am ban2a 3b2and ban2dr ba3n2e b1ang ban2k1a ban4kl ban2kr 2banl 2b1ans ban3t b1anz bar3b bar3de ba2rei bar2en bar3n bar3zw 3bas ba3s2a ba2sc ba2st bau3g bau1s bau3s2k bau3sp ba1yo 3b2ä1c b2är b2äs 4b1b b3be bben3 bbens2 bbe4p bb3ler bb2lö bbru2c bb2s bbu1 2b1c 2b3d4 bde1s 3be. 3bea be3an be3ar be3as 3beb b2ebe 1be1c be2del bedi4 be1eh be2erk be1erl be1eta 3bef4 be3g2 2b1eier bei1f4 beik4 beil2 bei3la 2b1eime b2ein be1ind be1in2h bei3sc beis2e bei1st beit2s 3bek 3bel be3las be3lec be3lei be2l1en be2let be3li bel3la bel3sz bel3t4 1bem 1ben. ben3ar ben3dor be3nei 3ben3g be3n2i ben3n ben2se ben4spa ben4spr benst4 ben2su 2bentb b2enti ben5t4r b1ents 2bentw ben3un ben3z2 be1o be1ra ber3am be2ran ber4ei. be4r3eiw be4rerk bere4s ber6gan. ber4in. ber3iss ber3na b1ernt be2rob be3rop ber3st4a be3rum 3be1s bes2a be2s1er be3slo bes2po bess4e b3esst. bes3sz be6stein be4s3tol be3s4ze 3bet be2tap be3tha be1ur 3b2ew 2b1ex 1bez 2b5f4 bfal2 2b1g2 bge3 bges4 2b5h2 bhut2 1bi bi3ak bib2 bibe2 bien3s bie2s bik2a bi2ke. bi2kes 3bil bil2a bi2lau 4b1illu bi2lu 2b1inb bin2e 2b1inf bin3gl 2b1int bi2o1 bio3d bi3on biri1 bi3se b1iso bi2sol bi2sp bis2s1c bi2s5t b2it. b2it2a b2ite bi2tu b2i3tus biz2 4b1j bjek4to 2b1k4 bl2 2bl. bla3b4 b3lad b2lanc 3blat b2latt 2b3law b2le 3ble2a b3leb 2b3leg 2b3leid b3lein 3blem 3blen b3lese ble3sz b4let b3leu 2blich 3blick b2lie 2blig bling4 b3lis b2lit 3blitz b2lo b4loc b3los 2blun 3blut 3blü 2b1m 4b3n2 bni2 bnis1 bo4a bo5as b1ob3 bo2bl bo2br bo2c bo3ch2 bo3d2 boe1 bo2e3i 2b1of bo3fe bo1is bo2l1an 3bon. bond1 bon2de bo2ne 3bons b1op bo1r2a bo4rä bor2d1i bor2d3r bo2rei bo4rig bor2s b1ort bor2t3r bo2sc bo4s3p bote3n4e bo3th bot2st bo2xi bö2b3 2böf 2b1p2 bpa2g 2b1q b2r4 2br. b4ra. 2b3rad b4rah b4ra3k bra1st4 3brä brä4u 2bre. 3brea 6b5rechte 2b3ref 2breg b3reif 3brem 2b3rep b4rer 2b3riem bri2er 2brig b4rio b3roh 2b3rol b4ron b4ruc bru4s brust3 bru2th 3brü 4b1s b2s1ad b3sand bs3ar bsat2 b3sä b4sär bs2äu b5sc bs2ca b6schan b6schef bs4cu b3se. bse2b b3sel. bse2n1 b4s1erf bs3e4r3in b4s1ers b3s2es bsi4t bs2ku b4sl b2s1of bso2r b2sö bs2pl b3s2pu bss2 bs2t bst1a2b bst3ac bst1ak bs3tät bst3er b2stip b3sto b4stod b3stö b2s3trä bs3treu bs4tri b3stü b4stüb b2s1un 4b3t btal3 btast3r b5te b4th btil4 bt4r b4ts2 btü1 bu2chi bu2e3 bu2f bu3li bul2la 2b3umk bung4 b2urg bu3r4i bu2sa bu4s3cha bu4schl bu4schm bu4schw bus1er bu2sin bu2s1p bu2s1u bü1c bügel3e 2b1v 2b1w 3by1 by3p bys2 2b3z2 bzeit1 1ca 2c1ab ca1ch ca2e3 ca3g4 ca1h cal3t 3cam c4an ca2pe 3car car3n carri1 ca3s2a3 cas3t ca3t4h ca1y2 cä3 cäs2 2cc c1ce c1ch2 c2d2 c3do 2cec ce2dr 2cef ce1i 2cek 1cen cen3g 1cer cere3 ce3sh 1cet 2ceta ce1u 1cé 2c1f c4h 4ch. 2chab ch3a2bi cha2ck 2chaf 2ch1ak ch2anb 3chanc ch1ang ch3anst 4chanz 1chao 4char. 1chara 3charta cha2sc 3chato 4chatu ch1ärm ch1äs 1châ 2chb 2chc 2chd ch3e4ben 1chef 3chef. che4fer 3chefi 3chefs 4chei ch1eim 4chelem che4ler 4chents 4chentw cher3a che3rei 6chergeb cher6zie ch1ess 2cheta 2ch1e4x 1ché 2chf 2chg 2chh 1ch1ia 2chic chi3na 4chind 3chines 2chinf 2chinh ch1ins ch1int 2ch1inv 1chiru 2chj 2chk 2chl2 ch2le ch3lein ch2lu 4ch2m 2chn4 chner8ei. 2chob cho2f ch1off ch1oh ch1orc 2chp ch2r4 4chre chre3s ch3rh 1chron 4chs 2cht 2chuf 2chuh 2chum 2ch1unf 2chunt 4chü 2chv 4chw 2chz ci1c ci2s c1j c4k 4ck. ck1a 1cka. 2ckac 1ckag 2ckal 2ck3an cka4r1 2ckau ck1ä 2ckb 2ckc 2ckd 1cke 4ckeff 2ckeh ck1ehe 4ck1ei 4ckense ck1ent 4ckentw cke2ra ck2ere 6ckergeb ck1erh 4ckerhö 4ckerke ck2ern 2ckero 2ck1err 4ckerze 2ck1ese 2ckex 2ckf 2ckg 2ckh 1cki 2ck1id ck1im ck1in 3ckis 2ckk 2ck3l 2ckm 2ck3n ck1o2 2ckp 2ck3r 4cks ck4stro 2ckt ckt2e 1cku 2ck1um3 2ckunt 2ck1up 2ckv 2ckw 1cky 2ckz c4l2 clet4 clo1 1clu c2m2 3co co2c co3ch co2d2 co4der. co3di coff4 coi2 co1it co2ke co2le col2o com4te. comtes4 con2ne co2pe co1ra cor3d co3re cos4 co4te cô4 2cp 2c1q 1c4r2 cre2 cre4mes cry2 2cs cs2a c2si c1s4tr 4c1t cte3e cti2 cti4o ctur6 3cu cu2p3 cussi4 1cy 2c1z 3da. da1a 2d1ab 3d2abä da2ben 3d2abl da2bre dab4rü 2d1ac dach3a da2cho dach1s 4d3achse d1af d1ag dagi2 dah3l da1ho 3d4ai da1in da1is dal2a 2d1alar dal3b2 da3lö d1alt d1amma 2d1ammä damo3 d4amp dampf8erf 2d1amt d2an. 2d1ana dan4ce. 2d1an3d2 d1ang 2dange dan4kl dan5kla dan2k1o dan2kr 2d1ans 2dantw 2danw d2anz. 4danzi 2d1ap d2aph 4dapp da2r3a 2darb2 3d2arl dar2ma dar2m1i da2ro d3arr d2ar3s d1art da2ru d2arw da1s da3s2h das4t dat2a dat4e2 da3tei date4n 4d3atl 4datm dau3e 2d1au2f 2dauk 2d1aus3 4daush 2d1äh 2d1ämt 2d1änd 2d1äng 2d1äp 2därz dä2u dä3us 2d1b4 dbu2c 2dc d1ch dco4r 2d1d2 ddar2 d3dh d5do 1de de2ad de3as de3a2t de3b4 2d1e4ben 3de1c de4ca. de2cka deco3 de1e4 2d1eff deg2 de3gl dehe2 de3ho 2d1ehr d1ei d2eic 3d2e1im dein2d dein2s de2l1a4g de4l3aug del1än del1ec delei4g de3lein 2delek 2delem 2delfm delle2 del4leb del4lei de2l1ob de2lop de3lor de2lö del4san del5sc del2s5e del2so del2s1p del5ster del3t4 dem2ar 2d1emp d2en. dend2 de4n3end 4denerg den3g d2enh de2ni den4k3li 4den4sem den4sen den6s5tau den3th 2dentw de1nu de1on depi2 d4er. dera2b de1rad de2rap der2bl 2derdb de2re2b de4reck der3edi derer3 de3r4erb de3r4erf de4r3ero derer4t 4d3erhöh 3derie derin4f 4derklä der3m2 4derneu 4d3ersat der3tau der6t5en6d de3ru de4ruh de4rum des1 de2sa de3sac desa4g de4sam des2äc de2seb de4seh de2sei des3elt de2sen1 de4set de2sin de2sor de2sp des3s2 dest5alt de2sto dest5rat de4stre des4tum de2su det2 deten4t 2d1etw de1un de1url de3us de2xis 2dexp 2d1f4 2d1g2 dga2 d2ge. dge4t1e d3gl 2d1h2 dha1s4 d2his 1di di4ab di2ad di4am 3dic di1ce di2e di3e2d die4neb di3eni di3ens. die2s3c diet3 die2th dige4s dik2a dil2s5 2d1imb din2a 2d1ind 2d1inf 2d1inh 2d1in1it 4d3inner 2d1ins 2d1int di2ob dion3s di1p di4re. di2ren di2ris 2d1irl di2sp 2d1isr dist2 di2s5te di2ta di4teng di4t3erl di4t3erm di4t3ers di2th di4t3r dit3s di2tu di5v di3z2 2d1j 2d1k4 4d1l2 d3la d3le dle2ra dli2f dl3m dl3s 2d3m2 4d5n2 dni2 dnis1 d1ob d2oba 2dobe dob4l d2obr 2d1o2f dole4 doll2 do2mar do5n4a doni1e do2o 2dope 2d1opf d2opp d2o3r4a 2dorc 2dord dor2f1a dor2fä dor2fl dor2fr 2d1org do2rie d2orp 2dort dor2ta d2os. dos3s dost1r dot6h do3un d1ö dö2l1 3d2ör dö2s1c 2d3p2 2d1q d2r4 3d4ra. 2d3rad drag4 2drahm d3rai 3d4ram d3rand 2d3rast 2d3rauc 2dräd d4räh 2d3rät 2d3räu 4dre. d4rea. d4reas 3d4reck 2dreg 3d4reh 2d3reic d4reiv 4drem 4d3ren 2d3rep 4d3rer 4dres. d4resc 2d3rh d3ri d4ri. 3d4ria 2d5ric d4rid d4rie d5rieg d4rif d4rik d4ril d4rin. 3d4risc 3d4rit 4dritu d3rob d3roc 2d3rod d4roi 2d3rot d3rou 2d3rov d3rö drö2s1 d5rub 3d4ruc 2d3ruh drunge3 2d5rut drü1b drü5cke 2d1s d4s1amt d2san ds3assi d2sau2 ds1än 4dsb d4schin d2s1e2b d2s1ef d3sei ds2eig d4seins d2s1eng d2s1ent d2s1erf d2serh d2s1erk ds1err d2s1erz dse4t d4s1eta d3s2ha d3sho d2s1im ds2inf d3s2kan d3skul 4dsl d2s1op dso2r ds1ori d2sö d2s1par ds1pas d2spä ds2po d2spro ds2pu dss4 dst4 ds3tab d4stag d4s3täti d2ste d4stea d3stei d3stell d4stem d3s4tern ds2ti ds4til ds4tip ds2tu ds1ums d2sun ds2zen 2d1t dta2d d5tea d2th d4thei dt3ho dto2 d3tö dt3r dtran2 dt5s2 d3tü 1du du1alv du1ar dub3l du2bli du2f 2d1ufe 2d1uh du1i 2d1umb 2dumd 2d1u2m1e 2dumf 2dumg 2d3umk 2duml d2ump 2dumr d1ums d2ums. 2d1umv 2d1un3d dund2a 2d1unf dung4 dun3ke dun2kl 2dunr dun2s 2dunt du1o dur2 2d1url 2dursa du4schn du4schr du4schw dus3t 2düb 3düf 3dün 2d1v2 2d1w dwa2 dwest3 dy2s 2d1z 2e1a e3a2b eab3l ea2c ea3der eadli4 ea2dr ea2g4 ea3ga ea4ge ea3gl eak1 eakt2 ea2la e3alei e4aler. eam3 eam1o ea2na e2ano e3ar. ea2ra e3a4rene e3arr e3arv e2as eas3s eat4e2 eater1 e3ath ea5tr eat3s2 e3at5t4 e3au2f e3aug eau1st e1ä2 e1b 2eba e3b2ak 2ebed ebe2i 2ebel eb2en ebens3e 2ebet 2ebl eb3ler eb4leu e3blie eb3lo eb2lö 2eb2o ebot2 ebö2s 2ebr eb3rei eb4ru eb2s1 eb6sche ebse2 ebs3pa eb3sta eb4stät ebs3tem ebs3t2h eb3str e3bu ebu2t1 2e3ca e1ce ech1ä 2e3che ech1ei e6ch5erzi e1chi ech3l ech3m ech3n e2cho. ech1o2b e2ch3r ech3ta ech3t4ei e1chu ech1uh ech1w e1ci eci6a eck3se 2eckt 2e1cl 2eco e3cr ec1s4 2ect e1d e3d2a ed2dr ed2e ede2al e3dei ede3n2e edens1 eden4se eden4sp ede2r eder3t2 edi4al e3d2o ed2ö eds2ä ed2s1es ed2s1o ed2s1p ed2s3tr ed2su edu2s e3dy3 4ee ee3a2 eeb2l ee2ce ee1ch ee2cho ee2ck eede3 eed3s2 ee1e e1eff eef4l eef3s eeg2 e1ei ee1im eein4se eel2e ee2lek ee3len e1emp e1en eena2 ee4nag e2enä e2enc ee3ni e2eno een3s e1e2pi ee1ra e1erbt e1erd ee3r2e ee4r3en4g eere2s ee4ret e1erk ee1rö eer2ös eert2 e1ertr ee3r2u e1erz ee3s2 ees3k ee3ta ee4tat ee2th ee1u2 eewa4r e1e2x e1f 2ef. 2efa e2f1ad ef1ana ef1ar e2fat e2fäu 2efe e3fe. e2f1e2b ef1em e2fent ef2er 2eff. 1effi ef2fl 2efi e2f1i2d e2f1ins efi2s 1efku 2efl e3f4lu 2e3f2o e3fra ef3rea ef3rol ef3rom ef4rü efs2 ef3so ef3sp ef2tan 2efu e2fum 2efü e1g egas3 egd4 e3ge ege4n3a4 ege2ra ege4str ege1u e2glo e2gn eg3ni eg4sal eg4se4r1 eg4sto eg2th 2egu egung4 egus3 2e1ha eh1ach e3h2al eh2aus 2e1hä e1he eh2ec eh1eff eh2el ehen6t3 1e2hep e3her ehe1ra ehe3str e1hi eh1int eh1lam eh1lä ehle2 ehl3ein eh4lent eh5l2er eh2lin eh3lo ehl2se 2ehm eh3mu e1ho e3hol ehr1a2 ehr1ä ehr1e2c eh2rei ehr3erl ehr6erle ehre3s eh3ri eh1ro2 ehr1ob ehr1of ehs2 eh3sh eh1ste 2eht e1hu e2hunt e1hü eh3üb eh1w e1hy 2ei3a2 4eib ei2bar ei2bl eibu4t ei4b3ute ei2cho e2id ei2d1a ei3dan ei3de ei4d3err 2eidn ei3dra ei1e 4eien3 eienge4 1eifr ei3g2a 4eigeno eig2er 2eigew ei3gl 1ei2g3n 2eigru 2eigt 2eigu eik2ar ei3kau eik4la e4il 2eil. ei2lar ei2lau 2eilb eil3d ei4lein eilen1 eil3f4 eil3ins 2eiln 1eilzu ei2m1a4g eim3all ei2mor e1imp eim2pl ei2n1a ei4nas ei4nä ein3dr 2eindu ei4neng ei2neu 2einfo ein4fo. ein4fos ein3g2 ein4hab e1init ein3k ein6karn 3einkom ei2n1o2 3einsat ein6stal ein4sz e4inver ei3o2 ei1p eip2f 2eir ei3re e1irr e2is. ei2sa4 ei6schwu ei4s3erw eis2pe eis4th ei1sto ei2sum e2it ei2tab ei2tan ei2tar 2eitä ei3te ei2th ei2tro eitt4 eit3um 2eiu 2e1j e1k ek2a 1ekd e3ke. e3ken e3kes e3key e3k2l ek4n ek2o ek4r ek1s4t 2ekt ekt4ant ekt3erf ekt3erg ek4t3erz ekt2o ek5tri ek2u e3k2w e1la ela4ben el2abt ela2c el1af ela2h e2l1ak e2l3a2m el4ami el4amp el1ans el1anz 2elao e2l1ap e2l1a2r el3ari ela4s el1asi el1asp el2ast 2e1lä 3elbis el2da eld5erst el4d3erw eld3s2 2ele. elea2 ele2c 2eleh 2elei e6l5eier. e2l1ein e3leine e4leing 1elek e2l1el 1e2lem e3lem. el1emp 2e3len. e4lense e2l1ent e3lep el1erd el1erf e4ler4fa e2l1erg el1erk el1erl e4ler4la e4l3ernä e2l1err 2eles2 el1ess e4l1e4ta e3leu 2elev ele2x 1elf. el3fe elf4l 1elfm 1elft elgi5er. elgi5ers 2eli e2l1id e3lie eli2ne el1ita el3kl el3lan el3le el5le. ell3ebe el4l3ein ell3eis el3lin ell3sp elm2a 2eln el5na 2elo e2lof e2lol elon2 el1ope e2l1or elo2ri el2öf elö2s el2sum elte2k elt3eng 3eltern elto2 el2t3r elt3s2k elt3s2p 2e1lu e2l1um el1ur el3use e1lü e2lya 2elz elz2e el2zwa e1m 2ema e2m1ad ema2k e2m3anf e2m1ans 3emanz em2d3a2 e3m2en emen4t3h e6mentsp e2m1erw eme2s 1e2meti e2m1im em1int emi3ti 2emm emma3u em2mei e2mop 3empf em3pfl em2p3le em2sa em2spr em2st em3t2 1emul 2emü e2n1a 4ena. 2enac e3nad e4naf 4enah e4nak ena3l2i 4enam en4ame e4nand en3ang en3are en2asc 4enat en3att e3naue e2n1är en1äu en4ce. en3d2ac en2dal en4d3ess end4ort end3rom end3si end3s2p end3sz end2um 2ene. ene4ben en1e2c e2neff e4nein e2n1el ene4le 2enem 2enen e4n1ent en4entr 4e3ner. e2n1erd e2nerf 1e2nerg e4nerh e4nerk e2n1erl e4n3ermo 4enern e2n1err e2n1ers e2n1ert e2n3eru e2n1erw e4nerz 2enes e4n3ess en3f enf2a enf2u 1engad 3engag en3ge en3g2i en2gl en3glo 1engp eng3se e3ni. e3nic e4nid e3nie eni3er. eni5ers. e2n1i4m e2n1in e3nio 2enis eni3se e3nit 2eniv en3k2ü e2n1o2b enob4le e2nof en1oh e3nol eno2ma en1on e2n1op e2n1o2r enost3 e3not eno2w 2e1nö en1ö2d e4nr en3sac en2sau en5sch4e en2seb ens2el 1ensem ensen1 en3ska en3s2po enst5alt en4s3tät 2ensto e4nt ent4ag 1entd en2teb en4terb 1entfa 3entga en2thi 3entla 1entn en4t3rol 3entspr 2entü 1entw 4entwet 1entz en1u 2enut e1nü enü1st 4enwü e1ny en4z3erf en4z3erg en4z3erk enz3ert e1ñ 2eo e1o2b1 e1of eo2fe e1oh e4ol e1on. e1ond e1onf e1onl e1onr e1ons e1ope e1opf eop4t e1or e3or. e3orb e3ors e3orw eo1s2 e3os. eo3ul e1ov e1ö2 e1p e3pa epa2g e3p2f4 1episo ep3le 1e2poc ep2pa ep4pl ep2pr ept2a ep2tal e3pu epu2s e1q er1a e3ra. e3rad. er3adm eraf4a era1fr era2g e1rai er3aic e2rak e1ral er3all eran3d e3rane er3anf e2ranh er3anm e1rap er3apf e2rar e3rari e1ras e2r3a4si era2ß e2rath e3rati e2ratm e1raub er3aue erau2f er3aug e1raw e1raz e1rä er1äh er1äm erb2e er3br erb4sp er1c er3chl er3da 1erdb er3de 2erdec erd3erw 4ere. er1eb e3rech er3echs er1e2ck ere4dit er1eff e2r1e2h 4e3rei. er1eig e2rein e4r3eis. ere2l er1ele 2e3rem 2eren 4e3ren. e3rena e4rense e4r3entf e4rentn e3renz eren8z7end 2erer 4erer. e2r3erf e2r1erh e4rerl 4erern e3rero er1err er1ers e2rert er1erw 2eres er1ess er3e4ti er1eul ere4vid erf2e erf4r 4erfür 3ergebn 4ergehä erg3el4s3 1ergol erg3s ergs4t er3h 1erhab 2erhü 2eri e2riat e3rib 4e3ric 4e3rie eri3e4n3 e3ri3k4 4e3rin. er1inb e2r1ini er1ink er1int e3rio er1ita 2erk. 1erklä 2erkre erk3t 3erlebn ermen4s erm3ers ern1os e1ro e3ro. er3oa er1o2b er1of er1oh e3ron e2r1o2p e4ro2r e3ros e3row er1ö erö2d 2erök er3p4 er3rä 2errü ers2a er3se ers2i er3sk er3smo er3sn er3sp er3sz ert2ak er6terei er4ters er2tho 4erti ert3ins ert4ra erts2e 2eru eruf4s er1u4m er1und erung4 er1uns er3uz erü4b 3erweck 6erweis es3ab es2ach es3ak es3anz e3s2as e4s3ato 2esb es2c es3cap e3sce esch2 e3scha e2s3ein es2el ese4ler es3eva 2esf 4esh es2har es2hu es2id e2sil es3int es2ir es2kat e4ske es3kl es3ku e4sky es3l es4log 2esm es2ort e3sot es2ö 2esp e3s2pek e3spi e3s2por e3s4pra 2esr es2sau es3sc es3se 4essem ess4e3re ess3erg 2esso es2sof es2s1pa es2spu es3str es3stu estab4b est1ak e1star e4starb 1e2stas e1stat e1s2tec e3stel es4t3eng es4t3erh es4t3ess e1stil e2stip estmo6de est3ori e1str es4tri es3trop e1stu es4tü e2s1um es3ums es3w e3sy es3z e1ß eße3r2e e1t etab4 et1am 3etap et4at et1äh e3te e4tein et2en eten3d2 ete2o eter4hö eter4tr et2h et3hal et3hü e3ti eti2m eti2ta 2e3to eto2b e4t1of etons4 e3tö 2etr e4traum e6t3rec e2tres et4rig etsch3w ets2p et3su ett1a et2tab et2t3au et2tei ette4n1 et2th et2t3r et4tro ett3sz et4t1um e3tü etwa4r 2etz et2zä et4z3ent etze4s et2zw eu1a2 eu3erei eue6reif eu2esc eu2ga eu4gent eu3g2er eu4gla eugs4 euil4 eu1in 1euk eu2kä e1um e3um. e3umb e3uml e3um2s eum4sc eums1p eum3st 2eun eun2e eu4nei e3un2g eu2nio eun3ka eu1o2 eu1p eur2e 3eu3ro eu3sp eust4 eu1sta eu1sto eu1str 2eut eut2h eut6schn 2eux eu2zw e3ü 2e1v e2vela e2vent 4ever eve5r2i e3vo e1w 2ewa e3wä ewä2s 2ewe e2we. ewinde3 e3wir ewi2s e3wit ew2s 2ex. ex3at 1e2xem ex1er e1xi e2x1in 1exis ex3l 3exp 2ext. ex2tin ex2tu 2exu 2e3xy ey1 ey4n eys4 e1z e3z2a e2z1enn e3zi ezi2s ez2w é1b é1c é1g égi2 é1h é1l élu2 é1o é1p é1r é1s é1t2 é1u2 é1v é1z2 è1c è1m è1n è1r ê1p ê4t 1fa fab4 f1abe fa2ben fab5s 3fac fa4cheb facher5f fa2ch1i fa2cho f1ader fa2dr f4ah faib4 fa2ke f2al fa3l2a fal2kl fal6l5erk fal6scha fal6schm fal3te falt2s 2fanb 2fanf fan2gr 2f1ank 2fanl f1anp 2fanr fan3s 2fanw f1an3z 2f1ap f2ar far2br 2f3arc 3fari farr3s 3f4art 2f3arz fa3s4a fa3sh f3at fa2to3 2f1auf f3aug f1ausb 3f4av fa2xa 1fä fä1c fäh2r1u 2f1ärm fä2ßer f1äu 2f1b2 2f1c 2f3d4 fdie2 1fe featu4 fe2c f2ech 2f1eck fe2dr fe2ei fe1em fef4l feh4lei f4eie 2f1eing 4f1einh fe1ini 2f1einw f1eis fek2ta fe2l1a fel2dr 2fe2lek fe2l1er fe2les fe2l1o fel4soh fel3t f2em. fem4m 2femp fe2nä fen3g fe2no fen3sa f1ent f2er. fe1ra fer2an fe4rang fe4r3anz fe2rau ferde3 f2ere fer2er fer3erz f1erfa f2erl. 4ferneu f4erpa f2ers. f2ert f1erw fe2st fest1a fest3ei 2f1e4ta 3fete fet2t3a feuer3e feu4ru 3few f1ex 2fexp 3fez 1fé 2f1f ff3ar ff1au ff2e ffe2e f2f3ef ff3ei ffe1in ffe2m f2f3emi ff4en f2fex fff4 ff3l ff4la ff4lä ff4lo f3flu f3flü f3f4rä ff3ro ff3rö ff2s ff3sho ffs3t ffs4tr 4f3g2 fge3s 2f1h2 1fi 3fi. fi3at fid2 fi4ds fid3sc fien3 fi1er2f fi2kin fi3kl fik1o2 fi2kob fi2kr fi2l1an fil4auf fil3d fi2les filg4 fi3li fi4lin fil2ip f2ina fi3ni fin2s fin3sp 2f1int fi2o fi3ol fi2r fi3ra 3fis fis2a fisch3o fis2p fi2s5t fit1o2 fi2tor fi3tu 3fiz 2f1j 4f1k4 f2l2 2fl. f3lad f3lap 1flä 3f4läc 2f5läd f3län 2f3läu 2f3leb f4lee 2f3lein f3ler f4lé f3li. 3f6lim fli4ne 2f5lon 1f4lop 1f4lot flo2w f3lö f4luc 1f4lug flu4ger f4lü 2f3m2 2f3n2 fni2s 1fo fob2l 2f1of foli3 fo2na fo2nu 2f1op fo1ra 4f3org fo3rin 3form for4m3a4g forni7er. for4st for4tei for2th for2t3r for3tu 2f1o2x 1fö 2föf 2f1ök 2f1öl för2s 4f1p2 2f1q f2r2 f4rac frach6tr f5rad fra4m f3rand f5rap 1f4rän 2fre. f3rec f3red 2freg freik2 frein4 f3rep f4reu 2f3ric fri3d fri2e 2frig 1fris f4risc f3roc 1f4ron fro2na fro2s f3rot f3ru f3rü 4f1s fs1all fs4amm f2san fs3ar f2s1as f2sauf f2saus f2saut f3sc f4sce f4schan f4schef fs4co fs1e2b f4s1ehr f2s1em f2s1ent f2s1er fse4t f4s1eta f3si f2si2d f3s2kie f2s1o2 f3span f2s1pas fs1pen f2sph f3s2pl f3s2por fs1pr f2spre fs2pri f2spro fs2pru fs3s4 fs2t f2stas f4s3täti f4stech f3stei f3s4tel f3stern fs3th f2stip f3st4r f4s3tres f4s3tüte f2s1un f2sü f3sy 4f1t f4ta. f2tab ft1a2be ft1af f2t1al ft1an ft1ar f3tat ft1e2h ft1eig ft1eis f4t1ent f4t1e4ti f2th f4thei ft3ho ft1op f3tö f2t3ro f2t3rö f3t4ru ft2s1 ftsa4 ft4sam ft3s2c ft4sche ftse4 ft4seh fts3el ft3st ft4s3tan ft4s3tä fts2ti ft4stri f2tum ft1url f3tü ftwa4 ft3z2 1fu 3fug 3f2uh f1um 2f1unf fung4 2f1u2ni fun2kl fun2ko fun2k3r 2f1unm 2funt f2ur fu4re. fus2sa fus2s1p fus2st fu2ß1er 3fut 1fü 2füb fü2r 2f1v 2f1w 1fy 2f1z fz2a fzeiten6 fzei8tend fz2ö fzu3 fzu4ga 3ga. 2gabf ga2b5l gab4r 2gabz ga1c 2gadl 2ga2dr ga1fl ga3ge 5gai ga1k ga2ka gal2a g4amo 2g1amt 2ganb gan3d gan2g1a 4gangeb gan2gr 2ganh 2g3anku 2ganl g3anla 3g2ano 2ganw ga1ny 2garb 2garc 3gard 2g1arm ga3r2o g1arti ga3ru 2g1arz ga2sa gas3ei ga2si ga2sor ga3sp ga4spe ga4spr gas3s gas4ta gas5tan ga4ste gas4t3el gat2a 2gatm gat4r gau1c 2g1auf g2auk g1aus 2g1aut 2g1äp 2gärz gäs5 gä4u 2g1b2 gber2 gbi2 gby4t 2g1c 2gd g1da g2d1au g2d1er gd1in g1do g1dö g1d3r gd3s2 gdt4 gd1u 1ge ge3a2 geb2a gebe4am geb4r ge1c ged4 ge1e2 ge3ec ge2es gef4 ge3g2l ge1im ge2in. gein2s ge2int gein2v ge1ir ge2is 2g1eise2 gei3sh g2el ge4lanz gelb1r gel4b3ra gel6ders ge3le ge5leh ge4l3ers ge4less gell2a ge3lor gels2t gel3ste gel3sz gel3t2a ge3lum ge3lü gelz2 ge3mi gem2u 3gen ge3na ge4nam ge4nar gen4aug gen2d1r gen1eb ge3nec gen3eid gen3ern gen3g gen3n gen4sam gen3sz 2g1entf gen3th 4gentw geo2r ge1ou ge3p4 ge1ra ge2rab 4g3ereig ge4reng ge4ren4s ge4r3ent ger2er gerin4f ger4inn gerin4t germ4 ger3no ge1r2ö ger4sto ge3r2u g2e1s2 ges3auf ge3sc ges3elt ge2s3er ge3si ges4pi ges3s2t gest2 ge3ste ge4s3ter ges3th ge3t2a 2getap ge5tr ge3t4u ge1ul ge1ur 2g1ex 2g1f4 4g1g gga4t g3ge gge2ne g2g3l gg4lo g2g3n gg4r 2g1h 4gh. gh2e 3g2het 3g2hie gh1l 3gh2r g2hu gh1w gi3alo gie3g gi2e1i gi2el gien2e1 gie1st gi2gu gi2me. gi4mes gi2met 2g1ind gi3ne gin2ga 2g1ins 2g3isel gi3t2a gi3tu gi4us 2g1j 4g3k2 4gl. g1lab g1lac 3glad g2lade 2g1lag 3glanz 3g2laub 2g1lauf 3glät 2gläuf g2l4e 2gle. 3glea 2g3leb g3lec g3leg 2gleh 4g3lein glei4t5r g3len 4g5ler 2gles g3lese g4lia 2glib 3g2lid 3g2lie 2glif g2lik 4glin g2lio 2glis 4g3lisc 3g2lit g2liz 3g2loa 3g2lob g3loch glo3g 3g4lok g2lom 3g2lop 3g2lot 2gls 2g1lu glu2t 3glü g2ly 2g1m2 g1n 2gn. g2n2a g4na. 2gnac g4nat 3g2nä gn2e g3neh gne2tr 2gneu 2gng g2nie g2nif g4nin 2gni2s1 3g2no gno1r 4g3not 2gnp 2gns 2gnt 2gnu 3g2num. g2nü g2ny 2gnz go4a goa3li 2g1of 2gog 2g1oh go1i gol2a 2gonis 2g1ope 2g1opf g2o1ra 2gord 2gorg go2s1 go3st go3th got6t5erg go1y 2g1p2 2g1q g2r4 gra2bi gra2bl 2gradl 2g3rah 2g3rak grammen6 gram8m7end 2g3räu 2g5re. g4reb 2g3rec 2g3rede g4re2e 2g3reic 2g3rein g3reit g4rem 2g3renn gren6z5ei g4rer g3ret g3rev 2g3ric gri2e g3riese 3grif 2grig 2g3ring 2groc 2groh gron4 g4ros gros6sel gro4u 2g3röh g4ruf 2g3rui 2g3rum 3g4runs 3g4rup 2grut 2g3rüc 3g4rün 4g2s1 gsa4g g3s2ah g4s3a2k g3sal g4salt gs3ama gs3an gs3ar gs3aug g3s2c g4sca g4s3ce gsch4 g4schef gs4chi g4sco g4s3cr gse2 gs2eh g3s2eil g3sel. gs3eli g3seln gsen1 gs3er gs5erk gse4t g4seta gsi2d g3sil g4sl gso2 gsp4 g3s2pek g3spi gs4pie g4spin gs2pit gs3pl g3s2por gsrat4 gsrü2 gs5s4 gs3ta g3stan g3star g3s4tati g4s3tä g5stäm g3stel gst3ent gst3err g1steu gst2he g3stir g3sto gs3toc g4stol gs3top g4s3tor g3stö gs3tr gst4ra gs4trat gst4ri gs4t3ros g3stu g4stur gs3tü gs4tüc g4sw g3sy 2g1t g3te gti2m gt4r gt2s g3tü 1gu gu3am gu1an. gu1ant gu1c gu2e 2gued guet4 2g1u2f 2g1uh gu1ins gu1is 3gumm 2g1unf g2ung. gunge2 4gungew 2g1ungl g2un4s 2gunt2 2g1url gurt3s gu2s3a guschi5 gus4ser gus2sp gus2st gu4st gu2t gut1a gu4t3erh gut3h 2güb gür1 güs3 2g1v 2g1w 2g3z2 3haa hab2a hab2e h2abs ha2cho ha2del ha4din h1adle haf3f4l haft4s3p h1ah ha1kl 2h2al. halan4c ha2lau hal2ba hal4bei halb3r 2hale hal2la hal6lerf h1alp hal2st hal4t3r h1amt h2an. h2and hand3s h4ann 2hanr 2hant h1ap ha2pl ha2pr h4a3ra 2harb h2ard h1arm. har4me. har4mes har2th h1arti h2as 2ha3sa hasi1 hat5t2 hau3f4li 2h1aufm h1aukt hau2sa hau2sc hau4spa hau5stei hau6terk 2hauto hau2tr h1äff hä6s5chen häu2s1c hä3usp 2h3b2 hba2r3a 2h1c 2h3d4 hdan2 2hea he2ad he3be he4b1ei he2bl he3br he5ch2e he1cho h1echt he3cke hed2g he3di he2e3l hee4s he2fan he2fä he2f1ei hef3erm 2heff he4f3ing he2f3l he2fr he3fri he2fu he3gu h1eie h1eif h1eig he2im heim3p hei4mu heine2 hei4neh h1eink 4heio he1ism he1ist heit4s3 h1eiw he2l3au hel1ec h3e2lek he3len hel3ers he3li hel4l3au hel4mei he3lo he4lof he2lö 3hemd he3mi 3hemm 4h1emp h2en. he4n3a4 he2nä hend2s he2n1e2b hen3end hen3erg he2net heng2 2heni he2no henst2 hen5tr h1ents 2h3entw hen3z 4he2o he3on he3op he3ph her3a2b he2ral 2herap he3ras herb4s he4reck 4hereig he4r3eis he2rel he4rerw h1er2fo h1erfü herg2 herin4f he6rin6nu herin4s herin8ter h1erke h3erlau 2herm he3ro he4r3o4b h1erö hert2 her3th her2zw he1sta he2s5tr he2tap heter2 he3th het2i he3t4s h2e2u heu3g he3x he1x4a he1y2 1hè 2h3f4 hfell1 hfel6ler hfi2s 2h3g2 hget4 2h1h2 2hi. 2hia hi2ac hi2ang hi1ce hich6ter 2hi3d h2ide h1i4di hi2e hi3ens hier1i hie4rin hiers2 hif3f4r hi2kr hi2l3a4 hil2fr hi2n h1indu hi3nel hin2en h1inf h1inh hi3n2i hin3n2 hi3no hin3s2 hin4t1a 2hio hi4on hi3or 2hip1 hi2ph hi2pi h2i2r hi3ra 2hi3re hi3ri hirn1 hir4ner hi3ro hir2s his2a hi2se his2p hi2st hi1th hi3ti 2hiu h1j 2h1k4 2hl h4lac hla2n hl1anz h1las h1lat h1laut h3läd h1läs h1läu hlb4 hld4 h3leb hle3e h5len. hlen3g hl2enn h3ler hle2ra hl1erg h6l3ernä hle3run hl1erw h4lerz h3les h4lesi h3lex hlg4 h2lie h2lif hl1ind h2lip h2lis h3list h2lit hll2 hlm2 h2lo h3loc hl1of hl1op h4lor hlo2re h3losi hl2ö h3löc h2lös hl2san hl2ser hl3sku hl3slo hl3t2 h3luf h3luk h1lüf 2h1m h2mab h3mag h3man h3mar h4mäc h4mäh h4mäl h4mäu h3me. hme1e hme1in h3men hmen2s hme2ra h2mo h4mon h3mö hm3p4 hm2s hm3sa hms1p h2mu 2hn h2na hn1ad h3nam hn1an h2nä hn3d4 hn2e hn3eig hn3ein h2nel hne4n1 hne4pf hner3ei h3nerl h3nerz hn3ex h2nic h2nid h2nie hn1im hn1in h2nip hn3k4 h2nor hn3s2k hnts2 h1nu h2nuc h2nul hn1unf h3nunge ho2bl ho2ch3 ho2cka ho6ckerl hock3t 2hod hoe4 ho2ef ho4fa ho2f3r 2hoi hol1au 4holdy 3hole ho2l1ei hol3g4 4holo ho4lor 3hol3s h1o2ly 3holz hol6zene hom2e ho2mec ho2med h2on hono3 2hoo 2hop ho1ra hor3d h1org ho4sei ho3sl ho2sp ho4st 2hot. ho3th hotli4 2hot3s2 3hov 2ho2w1 h1o2x ho1y2 1h2ö hö2c hö3ck h4ör hö2s1 h3öst 2h3p2 h1q 2hr hr1ac hr3ad h1rai h1rane h3räu hr1c hr3d h2rec h3rech h3red h3ref h4rei. hrei4ba h3reic h4r3eig h3rel h3r2en h3rep hr2erg hr2erk h6rerleb hr2erm hr2erz h3re2s1 hre2t h2r1eta h3rev hrf2 hrg2 h2ri h3ric h4rick hri4e h3riesl h3rin h4rine h4rinh h4rist h2rob h3roh h3rol h4rome h4romi h4ron h2ror h3rou hrr4 hr2s1ac hr2s3an hr2sau hr3schl hr2s1en hr2ser hr4set hr4s1in hrs3k hr4s1of hr2su hr4sw hr2tab hr2tan hr2th hr2tor hrt3ri hr2tro hrt2sa hrt2se h3ruh hr1ums h3rü h4rüb h2ry hrz2 4hs h2s1ach h2san h2sau h4schan h2s1ec hse4ler h2s1erl h3s2ex h2s1ing h2s1of h2s1par h2sph hs2por h2sprä h2spro hss2 h1sta hst3alt hst2an h2s3tau h1stec h3stein h5stell h3s4terb hst2he h1s2ti h1sto h2stor h1s4tr hst3ran hst3ri h1stun h2s1u hs2ung 4h1t h2t1a h3t4akt. h3takts h3t2al h4t3alt h4t3a2m hta4n ht3ane h3tank ht2as h4t3ass h4tasy ht3a2t h2tär ht1e2c h2t1ef ht1eh hte2he h2teif h4teilz h2t1eim h2t1eis h4t3elit h2temp h4tentf h4t3ents ht3erfo ht3erfü h2t1erh ht5erken h4terkl h6terneu h4t3erre ht3ersc h6t5erspa ht3erst h6tersta ht6erste h2t1erz hte2s h4t1ese h4t1ess hte3sta h2t1eu h2t1ex h2th h4thei hthe3u h4tho h2t1in hto2 h2toly h2torg h3töp h4t3rak ht3rand h2t3rat ht6raume h4tref ht4ri h4t5rin h2t3rol h2t3ros ht3rö h4t1rös h2t3ru h2t3rü h4ts ht2so ht2sp ht3spri ht4stab hts2ti hts4tie ht4s3tur ht4s3tür htt4 htti2 h2t1urs h3tü ht3z2 hu2b1a hu2b3ei hu2b1en hu2b3l hu4b3r hu2bu hu1c hu2h1a hu2h1i huko3 huk3t4 hu2l3a hu2lä hu2l3ei hu4l3eng hu4lent hu2ler hu2let hu2l1in hu2lo hu3m2a h1ums hu2n h1una hung4s hu3ni1 h1up. h1ups 2hur hurg2 hu3sa hu2so hus4sa hus2sp hu2tab hu3t2h hu2ti hut2t hut4zen hut4z3er hutz1i h2ü h4übs h3übu hühne4 hüs3 2h1v hvi2 hvil4 2hw h2wall hwe1c h1weib 3hyg 3hyp hy2pe. 2hy2t h1z hz2o hzug4 i1a 2ia. i4aa i2ab iab4l 2iac i2af iaf4l i4a3g2 i2ah i2aj i2ak i3ak. i3akt 2ial i5al. ia2l1a4 ia2lä ial3b ial3d i3alei i3alent i3alerf i3alerh ia4l3erm i3a2let i3a4lia ialk2 i3all ial3la ia2lor ial3t4 ia2lu ial3z2 i2am i4amo 2ian ia2nal i3and2 ian2e i3ann i2ano i3ant i3anz i2ap ia3p2f ia1q i3ar. ia2ra 2ias i2asc ia3sh i2asi i2a3sp ias3s iast4 i3at. i3a4ta i4ate i3at4h 1iatr i3ats i3au ia3un 2iav 2iä i1äm iär2 i1är. i1ärs i1ät. i1äta i1ät3s4 2i1b i2b1auf ib2bli ib1ei i2beig i2beis ibela2 ibe4n iben3a ibi2k i3bla i3ble i2blis ib2o i2b1ö i4brä ib3ren ib4ste i2bunk i2bunt ibu2s1 2ic ic1c ice1 ich1a ich1ä i1che ich1ei i1chi i2chin ich3l i3chlo ich3m i1cho i2ch3r ich2t3r i1chu ich1w i1ci i3ck2e i1cl i1d id2ab4 i3dam id2an i2d1au 1i2dee i2dei idel2ä ide3so ide3sp 1i2dio idni3 i2dol 1idol. 2i2dr i3d2sc id2s1p idt4 i2dy ie3a4 ie2bä ie2bl ie2bre ieb4sto ieb4str ie1c ie2cho ie2ck ie2dr ie1e2 ie2f1ak ie2f1an ie2fau ief3f4 ie2f3l ie2fro ie4g5l ie3g4n ie2g3r ie3g4ra iegs3c i1ei i2e2l1a ie3las iel3au iel3d iel1ec ieler8geb i1ell ielo4b iel3sz iel3ta 2i1en i3en. i3ena iena2b ie4n3a4g i3e2nä i3end i2ene ien1eb ie3ner ien4erf ie4n3erg i3enf i3en3g ienge4f i3enh i3enj i3enk i3enm i3enn i3e2no i3enö i3enp i3enr ien2s ien3sc ien3s2e ien3si iens2k ien3sp ienst5rä ien3sz ie1nu i3env i3enw i3enz ie1o2 ier3a2 ie2rap i2ere ie3r2er ie4rerf ie4r3erz ie3res i3ereu i4eri ierin3 ier3k2 i1ern i3ern. i2er5ni ie2rö ier4seh iers2t ier3sta ier3ste ier3te iesen3s4 ies2sp ies2s3t ie1sta ie3su ie2t1a ie4t3erh ie4t3ert ie2t3ho ie4t1o ie4t1ö4 ie2tri iet2se i1ett ieu2e ie1un i1ex 2if if1ar i2f3arm if4at if1au i2fec ife2i if2en ifens2 if1erg if1erh if2fl if3l i1f4la if4lä i1flü if3r if4ra i1frau i1fre if4rei if4rü if2s if3se if3sp if2ta ift3erk if2top if4t3ri ift3s2p ift3sz 2i1g iga3i i2g1ang ig1art iga1s4 i4gefar ige4na ig1erz i2g1im i2gl ig1lä ig4na i4gnä i3g4neu ig4no i3go ig4ra ig3rei ig4sal ig3sä ig4se ig3so ig3spr ig3stei ig4sto ig4stö ig3str ig4stre ig3stü igung4 2i1h i2h1am i2har i3he ihe1e ihe4n ih3m ih3n ih3r ihs2 i2h1um ih1w ii2 ii3a4 i1ie i3i4g i1im i1in i1i4s i2is. ii3t i1j 2i1k i2k1a4k ik1amt i2k1ano ik1anz i4kanze ik1art ik3att i2k1au i2kär 4ike i2k1ei ike2l1 i2k1e2r2e ik1erf iker6fah i2ker2l i2k1eta i3ki. ik1in i2kind i2k3l i3kla i3k4lä i2kn ik3no ik2o3p4 iko3s i2köl i2k3ra ik3rä ik3re ik1s2 ik3so ik3sz ikt2e ikt3erk ikt3r ik2tre i2kun i3kus i1la i2l3ab il1a2d i2l1ak i2l3a2m il1ans il1asp il1au il4aufb il3aus i2laut i1lä1 6ilb il2c il2da il4d3en4t ild2er ild1o il2dor il2dr il1e2c ile2h il1ehe il1ein il1el i4lents i2l1erf i2l1erg i2l1err ilf2 il2f3l il2f3re ilf4s3 ilie4n ilig1a2 ili4gab i2l1ind i2l1ip i3lip. i3lips 2ill. il3l2a il3l2er il3l2i 2ills il2mak il4mang il2m3at il2mau il2min 2ilo i2l1or il3t2h i1lu2 i2lum ilung4 i3lus ilv4 il2z1ar ilz3erk 2im. i2manw i2m1arm im4at ima2tr imat5sc ima4tur i2meg i2mej i2mek i2mele i2melf i2m1erf i2m1erz i4mesh i2meti i2mew i2m1inf i2m1ins im2mei im4m3ent 1immo 2imo im1org 1impo imp4s im3pse 1impu im2st im3sta 2imt imt3s2 2imu in3a2c i4nack i2n1ad in2af in3am i3nap in2ara in2ars ina4s i2n3au in1äs in2dal in2dan 1index in3do 2indr ind4ri in3drü 1indus 2ine i2n1e2be in1ehe in3ei i2n1eng in3erbe i4nerbi in2erh iner4lö i4ner4tr i4nesk in1eu ine3un ine2x in3f 1info. 1infos 2inga ing1af in2g1a4g in2gl ing4sam 1inhab 2inhar 2inhau 4inhe in2i3d i3nie 2inig ini3kr in2ir 2inis ini3se i3nitz 3inkarn inma4le 2inn. in4n3erm 2innl in2nor inn4sta 1innta 2ino in1od in3ols in1or ino1s2 ino3t i1nö in1ö2d 2inp 2inr ins2am insch2 in2seb 2insen ins3ert in3skan in3skr 1insta in4s3tät in3stel in3su 1insuf in4s3um in3s2z 1integ int2h in3t4r in5tri in1u i3n2um in3unz invil4 i1ny in3zw i1ñ 2i1o io1c io2d i2oda io3e4 iof4l i2o3h io2i3d io3k4 i3ol. i3om. i3oms ion2 i3on. ional3a io2nau ion3d i3ons3 ion4spi ion4st i2ony i2o1p io4pf i3ops i3opt i2or i3or. i3orc iore4n i3orp i3ors i3ort io3s2 i2ost i3ot. i3ots i2ou i2ov io2x i3oz. i1ö2k i3ön i1ös. 2ip. i1pa i1pe ipen3 i3per ip3fa iph2 2i1pi ipi3el ipi3en ipi2s ip4l ip2pl ip3pu i1pr 2ips 2ipu 2i1q i1r2a i3rad 1i2rak irat2 i1rä ir2bl ir1c ir2e i3ree 2irek 2i3ré ir2gl irg4s ir2he ir2i 2irig 2irk ir2k3l irli4n ir2mak ir2mau ir4mä ir2m1ei ir2mum ir4m3unt ir2nar ir2no i1ro 1iron iro2s i1rö irpla4 irr2h ir4sch3w ir3se ir3sh ir2st irt2st iru2s1 i3sac i4s1amt is2ap is3are i2sau i2s1än 2isb i2sca isch3ar i3s2che i4schef i4sch3e4h i4sch3ei i4schin i5sching i2sch1l isch3le i2schm isch3ob isch3re isch3ru i4schwa i6schwir i4schwo isch3wu is1chy i2s3cr 2ise ise3e ise3ha ise3hi ise3inf i4seint ise2n1 is2end isen3s i2serh i2s1erm iser2u i2s1ess i4s3etat is2has isi2a i2s1id i2s1of iso6nend is1op 3i2sot is1pa i2spar is1pe is1pic is2pit i2spro is3sa is4s1ac is4sau is4s3che is2st is3sta is3sto iss3tr is3stu is2sum is3t is4tab is4tam ist2an i1s4tat is4tel iste4n istes3 i1s4teu i1s4til is4toc is4tö is5tör ist4ra ist3re is4tü isum3p i2sü i1ß iß1ers it1ab. ital1a it1alt it1am it1an it2an. it3a4re it1art i3tat it1au i3tauc i4t1ax 4itä it2är i2t1äs ität2 i2t1ei i4teig it2eil i4tein 2itel ite2la ite4n iten3s2 i4tepo i2tex i5thr i2t1id 1itii iti4kan i2t1in1 it2inn itmen2 i5toc i2t1of i3tö it3raf i2t3ran it3ras it3rau it3räu it3re it3ric it3rom it4ron i3tru it3run it2sa its1a4g it2s1e4 its3er1 it2so it2s1pe it4staf it2sto it2teb it4tri itt2sp it1uh i2t1um i2tuns it1urg itut4 i3tü 2itz it2zä it4z3erg it2z1w 2i3u2 ium1 i1ü 2i1v i2v1ak iv1ang i2veb i2v1ei iv1elt ive4n i2v1ene i2v1ent i2v1ur 2i1w iwur2 2i1x i2xa ix2em i3xi 2i1z iz1ap iz1au izei3c ize2n i2z1ene iz4er i2z1ir izo2b i2zö i2z1w í1l ja1c jah4r3ei jahr4s ja3l2a ja3ne jani1 ja1st 2jat je2a jean2s je1c je2g jek4ter jekto2 jektor4 jek2tr je3na je2p je4s3t je2t1a je2t3h je2t3r jet3s2 jet3t je2t1u2 je3w ji2a jit3 ji2v joa3 jo2b1 job3r jo2i joni1 jo1ra jord2 jo2sc jou4l j2u ju2bl jugen2 jugend3 ju2k jung3s4 ju3ni jur2o jus3 jut2e1 2j1v 1ka 3ka. k3a2a ka3ar kab2bl ka2ben 2kabh 2kabla 2kablä 2k1a2bo ka3b4r 2kabs 2k1abt ka1c k2ad 2k3ada 2k3a2dr ka1f4l ka1fr kaf3t2 k2ag ka1in ka3ka kaken4 2kala. ka2lan ka3lei ka3len. ka4lens kal3eri kal2ka kal2kr k1all kalo5 kal4tr k3ama kamp8ferf kan2al ka4n1a4s ka2nau kand4 2kanda kan2e 2k1ang kan3k4 2kanl 2k1anna k1ans k2ans. 6kantenn ka3nu 2kanw k2anz. ka2o 2k1apf 3kara 2karb k2ard k2arg ka3r2i kari3es k2ark 2k1arm k2arp3 kar2pf k2ars kar3t k2arta 2k1arti karu2 k2arw 3kas ka3se kasi1 kas3s ka2s3t ka3tan ka3t4h ka4t3r 2katt kau2f1o 4kaufr kauf4sp k1aus kau3t2 2kauto 1kä k1äh k1ä2mi k1än kär2 kä2s1c käse3 2k3b4 kbo4n kbu2s kby4 2k3c 2k3d2 kdamp2 2k1e1c k1eff kefi4 kege2 ke2gl ke2he. kehr2s kehr4s3o 2k1eic 2k1eig k1ein ke1in2d 2keinh kei1s 2k1eise keit2 ke2la kel1ac ke3lag kel1au ke2lä kel3b4 2ke2lek ke2len 2ke3let kell4e kel3s2k k4elt 2k1emp k2en. ken3au 4ken4gag 2kenlä ke2no kens2k ken5stei ken3sz k2ente k3enten ken3th k2entr 2k1ents k2entu 2kentw 2keo2 ke2pl k2er. ke1rad k2erc 4kerfah k4erfam k3ergeb ker6gebn k3er4hö ke6rin6nu kerin6st kerin4t ker4ken k2erko k2erl k3er4lau k3er4leb k6erlebe ker4neu k1e2ro k2ers. kerz2 ker4zeu 2k1er2zi k6es. ke2sel ke4t1a ke2t3h ket3s ke1up keu6schl 2k1e2x 2k3f4 2k1g2 2k1h4 kho3m ki3a4 ki1c 2k1i2de ki3dr ki2el kie2l3o ki1f4l ki1f4r ki3k4 2kil2a ki3li ki3lo k2imi k2in. k2ing 2kinh k2ini k2inn ki3n4o3 kin3s 2k1inse 2k1int ki3or kio4s 3kir kis2p kist2 kis4to 2kiz ki3zi 2k3j 2k1k4 kl2 4kl. 4kla. k4lar 4k1last k2le 4kle. kle3ari 4kleh k4leid 4k3leit k3lem. 2k3ler kle2ra 2k3leu kle3us 2klic 2klig k2lin k3lip k2lir k2lisc 2klist klit2s 4kliz 2k3loc klo2i3 k4lop klost4 klö2s k2löt k1lu kluf2 klung4 2k1lüc 2kly 2k1m k2n2 3knab k3ne k4nei 2k5ner kno4bl 2k5nor k3nu 3knü 1ko ko2al 2kobj 2k1o2fe koff4 koh3lu ko1i2 kol4a ko3le kol2k5 3kom ko4mu k2on ko3n2e kon3s4 ko3nu 2kop. ko1pe kop4fen 2kops 2kopz ko1r2a 2k1orc kor6derg ko3ri k2os ko2sp ko2st ko3ta kot3s2 kot4tak 2k1ou 3kow ko2we k1o2x 1kö kö2f k1öl 2k1p2 k1q k2r4 2k3rad k3rats 2kraum k4raz 2k3rät 2k3räum 2kre. 2k3rec 2k3rede 2k3ref 2kreg k3reic kre1i2e4 kreier4 k3reih 2k3rh 2krib 2k3ric k3ries 2krip 3kris 3k4ron 2kruf krü1b 2ks k4s1amt k2san ks3ar k2sau ks2än ksch4 ks1e2b k2s1em k2sent ks1erl k2s1ers k2s1erw ks3ha k2s1id k2s1in k2s1o2 k3sof ks1pa k3spe ks2por ks2pu ks3s2 kst4 k1sta k4s3tanz k3stat4 k1ste k1s2ti k1sto k2stor k1str k2strä k1stu k2stum k2s1u ks2zen 4k1t k2t1ad kt1akt k3tal kt1am kt1an k2t3a2r kta4re k2t1au ktä3s kte3e kt1ei k2temp k2tent k4t3erfo k2t1erh kte3ru k2tex k2th kt3ho k2t1id kt1im k2t1ing kt1ins kti4ter k2t1of k3top kt1ope k4torga kt3orie kt4ran kt3ras k4tref kt4ro ktro1s kt3run kt3s4 ktt2 k2tuns k3tü kt3z ku1c kuh1 2k1uhr kul2a ku3l2e ku3l2i 4kulp 2k3uml kum2s1 k2u3n2a kung4 kun4s4 kunst3 2kunt 2k1up. kur2bl ku2rei kuri2e kuri4er ku2ro kur2sp kur2st ku4schl ku2sp kus3t ku2su 1kü 2küb kü1c kür4s 2k1v 2k1w 2k3z2 kze3l 3la. la3ba 2labb 4l3aben 2labf 2labg 2labh 4l1a2bl lab2o l2abr lab4ra lab4ri 2l3abs l1abt 3labu 2labw la1ce la2ce. 1lad lad2i l1adl 2ladm 2l1a2dr 3ladu l1adv 2laf la2fa laf3s laf3t la2ga la2gio la2gn lago2 la2g1ob 2la1ho 1lai la2k1i l2akk la1k4l 2l1al 4lall 4lalp l2ami la3min 1lammf l2amp 2l1amt lamt4s la4mun l1anal la2nau 2lanb 3l2and lan2d3a2 lan6d5erw lan6d5erz lan2d3r 2lanf lan2gl lang3s4 2lanhä l2anhe 2lanl 4lanli 2l3ann l1anp 2lans 4lansä 2lantr lan2zw 3lao l1a2po2 lap4pl la2r1an la2r1ei la4rene 3l4ar3g lar3ini lar3s 2l1ar3t l3arti la2ru la2sau 4lasd la3se 2lash 2lasi la2so 2lasp 3lasser la2st last1o lat2a la3te la4tel 2l3ath la2t3ra lat2s 2lat2t1a lat4tan lat4t3in lat2t3r laub4se l2auf. lau2fo l2aufz 1laug 2lausl 2lausr 2l1auss 2lauto 1law lawa4 lay1 lä1c 1läd 2läf 2l1ähn 1länd lär2m1a lä2s1c 4lät 2läub 2läuc 2läue 1läuf 1là 2l1b l3bac l2b1ede l4beta l2b1id l2b1ins lb2lat l3blä lb3le l2bli l3blo l4bre. lb3rit lb2s lb3sa lb3se lb4sk lb3sp lbs6t lbst3e lb4sto lb2u l2b3uf lbzei2 2l1c l3che l3chi lch3l lch3r lch3ü lch1w l3cl 4l1d ld3a2b1 l3d2ac ld3a2ck l2d1a2d lda4g l2d1ak ld1al l3dam ld1amm l2d3a2n l2d1a2r ld3ari l3das l3dat ld1au ld1är l2dei l2dele l3der. ld1erp l2d1e2se l2dex l2d1id l2d1im ldo2r ld2os ld2ö2 ld3r l2dran l2dre l3d4ru ld4rü ld3sa ld3st ldt4 ld3th l2d1um 1le 3le. le2ad leben4s3 le2bl 2lec le2chi lecht4e 3led 4ledd le3de le2e le3ei lef2a le2g1as le2gau le2gä le2gl leg4r 3leh leh3r2e 4lehs 4leht 3lei. lei2br l2eic l2eid 4l1eig l2ein. l2eind lein4du l2eine lei6nerb 2leink l2eint leis6s5er l4eist lei4ßer l2eit lei2ta lei8t7er8sc leit3s2 lekt2a 2lektr 3l2ela 2le2lek lel3s 3lemes le2m1o2 4lemp lem3s l2en. le4nad le2nä 4lendet 2lendu le4n3end 4lenerg l2enf le3ni l2enk 2l1enni l2e2no len4sem len3sz l1ents 2l3entw lent4wä 5lentwet 4lentz len2zi le1os 2lep 3lepa 3lepf lepositi8 3lepr l2er. l2e1ra le2ra4g le2rau lerb4 4l3ereig le4r3eim le4rers l1erfo l2erfr l2erfü 3lergeh l3ergen 3l4ergew 2l1ergi lerin4s lerk2 l2erka l2erko l2erle 2l1er2ö 3l2erra l4ers. lers2k lers2t ler3t 6lerwerb l1erz l2erza les2am les2e 2l1esel le3ser le3sh lesi1 le3sk les2t leste3 le1sto 4lesw 2lesy le2tat 2le3th 2leto let4tu le2u 4leud 2leuro 3leut 3lev 2lexe le2xis 2lexz 2l1f l3fah lfang3 l2f1ec lfe1e l4feis l3f4lä lf3lo l3f4lu lf3ram lf2tr lf4u lfur1 l3fü 2l1g lga3t lgd4 lgen2a lge3ra lgeräu3 l2geti l3go lg3re l3gro 2l1h2 3lhi. 1li 3lia li3ac li3ak li3ar lia1s libi3 li1c 3lichem 3licher li3chi 4lick li2cka li3d2a li2deo 2l1ido li4ds lid3sc l2ie 3lie. liebe4s li3ene lien3s lie2s3c lie2st 3lig lig4n li2gre li3ke li2kr lik2sp lik4ter li3l lil2a 2lim li3m2a 3limo li3n2a lin3al 2l1indu li2nef li2neh li2nep li2nes 2l1inf lings5 2l1inh 2l1in1it 2l1inj lin2k1a link2s li2nol l2ins. l2insa l2insc 2linsp 2linst 2l1int l1inv 2linz li2o li4om li3os. li2p3a 3lis. li3s2a li4schu 4lish 2l1isl 2l1i4so li2sp liss2 lit2a li2tal li3te lit2h lit1s2 lit3sz li3tu 3liu 2lixi li2za lizei3 4l1j 2l1k lk1alp l3k2an l3kar. lken3t lk2l lk3lo l3k4lu lk4ne lkor2b1 lk4ra l2k3ro l2k3ru lk2s1 lk3sä lks3t lk4stä l3k2ü 4l1l ll1abb ll1a2be l2labt ll1aff ll1akt l3l2al l2l1a2m ll3ama lla2n ll2anw ll1anz l3lap ll1arm ll1au ll3aug l2laus l2l1äm llb4 llch4 ll3d4 ll1ech lle3en l2l1ef ll1eim ll2em l3len. lle4n3a ll3endu llen3g l4lents l3ler. lle2ra l4lerfo l6lergen l4lergo ll3ernt ll3ertr l2lerz ll2es l2lex llg4 ll1imb ll1imp l2l1ind ll1ins llk4 ll3l2 ll5m lln2 ll1ob l2lobe l2l1of ll1opf l2l1o2r l3lor. l3lore l2l1ou l3low l2löf ll1ö4se ll3sh ll3s2k ll2spr ll5t4 llti2m llt5s2 llu2f ll1ur llus5t6 ll3z2 2l1m l2m3a2b l2marc lm1aus lm1c lme2e lm3eins l2m1e2p l2m1erz lm1ind lm1ins l2möl lm3p lmpf4 lms2t lm3ste lm3s2z lm3t 4ln lna4r ln3are lnd2 l3n4e l3ni l1nu l1nü 1lo 3l2ob. lo2ber 2lobj 2l1o2bl l2obr lob4ri l1o2fe lo1fl lof4r lo2gau lo3h2e 2l1ohr loi4r 3lok lo2k3r lol2a l1o2ly lo2min lo2n1o lo2o 2lopf 2lopt lo1ra lo4rä 2lorc l1ord lo3ren 2l1or3g2 lo3ro 3lorq 3los. lo4sa 3lose lo4ske lo2spe loss2e lo4ste los3t4r lo2ta lo3tha loti4o 2l1ov lo2ve 2lox 1lö lö2b3 2löd lö2f 2l3öfe 4lög l1öhr 2l1ö4l3 4löß 2l1p l3pa lpe2n3 lp2f l2p1ho lp3t4 l3pu 2l1q 2l3r2 lrat4s lre1s lrut4 lrü1b 4l1s l3sac l2s1a2d l3s2al l4s1amb l2sann l3sare l2sau l4schin l4schmü l2s1e2b l2s1ec l2s1em ls1ere ls1erg l2serh ls1erl l2s1ers l2s1erw l3sex l4sha lsho2 l2s1imp ls2log ls3ohne l4s3ort. l3s2pi ls2po l2spro l3s2pu ls3s2 lst2a lstab6 ls4taf l4s3täti l2ste l3stec l3stei l3stel l4stem ls6terne ls6terns ls2tie l2stit ls4tr ls2tu ls1um l2sun lsu3s ls2zen 4l1t l2tab ltag4 lt1ak lt1a2m l4t3ame lt3and lt1ang l3tarb lt1art l2t3ato l2t1au lt1eh l2t1eis l4te4lem lt3eli lt2en l5ten. lter3a lt2erg lt4erö l4t1e4sk lte2th l2t1eu l2th l4thei lt3ho l3thu ltimo4 l2tob l2t1of lt1op l2t1o2ri lto2w lt1öl l3tör lt1ös l4t3öt ltra3l l3trä lt3räu lt3re lt4rie lt3roc lt3ros l2t3rö l6ts lt3sc lt2so lt4stab lt4stoc ltt2 lt1uh l2t1um ltu4ran ltu2ri l3tü lu1an 4lu4b3 luba2 lubs2 lu2dr lu2es 1luf 2l1ufe 2luff luf2t1a luf2t1e luf2t5r lu2g1a lu2g1e2b lu4g3l lu2go lu2g3r lug3sa lug3sp lu2gu 2l1uh lu1id. lu1is. lume2 2lumf 2luml l2ump l1ums l1umw 1lu2n 2l1una 2l1unf lung4sc 2l1uni 2lunt 2lunw 4luo 2lur l1urn l1urt 2luse lu2sp lus4s3a lus2s1c luss3er lus6serf lus6serk lus6sers lus2s1o lus2s3p lus2s3t lus4stä lu4st lus4t1a lust3re lu2s1u lu2t1a lu2tä lu4teg lu4t3erg lut1o2f lu2top lu4t3r 3lux 2lüb 5lüd lüh1l 2l1v 2l3w 2lx 1ly ly1ar ly3c 2lymp 3lyn ly3no ly1o ly3u 2l1z l2z3ac l3z2an lz2erk lz1ind lzo2f l2zö lz3t2 l2z1u4fe lz1w lz2wec 1ma m1ab m2abe 2mabk m2ab4r 2mabs 2mabt mach4tr ma2ci ma3da ma2d4r ma4d2s mae2 ma1f ma2ge. ma2geb ma2gef ma2geg ma2gek ma2gep ma4ges. ma2get ma2gev ma2gew 2m1agg magi5er. magi5ers ma3g4n 2m1ago mai4se 2m1akt mal1ak ma4lakt ma2lan ma4l3at ma2lau mal3d ma3ler mali1e mal3lo 2mallt malu4 ma2l3ut mam3m 2m1anal ma2nau 2manb man4ce. man3d2 man3ers ma2net m2anf 2m1angr m2anh 2manl m4ann 2mansa 2mansä 2mansc 2mantw 2manz ma2or m2app 2marb mar3g2 4ma3r2o maro3d 4marr mar6schm mar6schr ma3r2u m1arz 3mas ma3s2pa 4m1aspe massen3 mas4tel ma1s4tr 3maß ma2ta2b ma2tan mat4c ma2tel ma4t3erd ma5tri mat3se mat3sp 2m1au2f ma3un 2mausg m4ay ma1yo 3mä m1ähn mä1i2 4m1änd m1ärg mä3t4r mäu2s1c 2m1b2 mbe2e mb4l m3b4r mby4 2mc m3ch 2m1d md1a m2d1ä m2dei mds2e m2d1um 1me meb4 m2e1c medi3 medie4 medien3 2medy me1ef mee2n1 mega1 3meh 2m1eif 2m1eig m2eil mein4da me1i4so 3meist me3lam 3meld me2lek me2ler melet4 2melf. mell2 mel2se mel5t4 6mel6tern 2m1e2mi m2en. mena2b me3nal men3ar men3au men3gl me3nor m2ens men4sk men2so men3ta men6tanz 2mentn 4m3entwi me1o 2meou 2meö 3mer. me1ra me2r3ap me4rens mer2er 4m3ergän 3merin merin4d merin4t me2ro 3mers merz4en 3mes mes1a me2sal me4sä 4meser 2me3sh 4m1essa mes6serg mes2s1o mes2s1p mes2st meste2 me1sto 4mesu me3t2a me3th meu1 2m1ex 1mé 2m1f4 mfi4l 4m1g2 2m1h4 1mi mi2ad mi3ak mibi1 mi1c mi3da mie3dr mi2e1i mie3l mien3s mi2er mierer4 mie2ro mi4et mie4ti 3mig mi2kar mi2ki mi2ku 3mil mi3l2a milch1 mil4che mild4s 4milz 2m1imp minde4s min2en min2eu min2ga ming3s4 mi3ni 3min2o mi1nu 3mir. mi3ra 3miri 3mirs 3mirw mi2sa mi4scha mi4schn mi4schw mise1 mis2s1c mi2s5te 3mit mi2ta mi2th mi2t1r mit3s2 mit5sa mi5tsu mi2t1u 4mitz 2m1j 4m1k4 m3ka mk5re. 4m1l2 ml3c ml3l ml3s 2m1m m2mab m2m1ak m2m1al mm1ang m2m1ans mm1anz m2m1au mmd2 mm1ei mme4lin mme4na m4mentw mme2ra2 mme4rec mme2sa mm1inb mm1inf mm1inh mm1ins mm1int mmi3sc mmi1s4t mmm2 mm3p mm2s mm3si mm3sp mm3sta mm3str m2mum mm2un mmül2 mmüll1 2m3n2 m4nesi 1mo moa3 2mobj 3m2od mode3s mo2dr 4mog. mo2gal 3moh mo2i3 mo2k1l 2mol. 3mom mom2e 3m2on mo3ne mo4n1er mon2s3 mon3su 3mo2o 2m1ope 2mopt mo1ra mo2rar 2m1orc mor2d3a mor2dr mo2rer morgen5s6 mork4 3mos mos4ta moster4 3mot m1o2x mo1y 1mö mö2c 4mök m1öl 2m1p m2pf mp4f3erg mpf3erp mpf3err mp4f3erz mp2fl mpf3li mpf1or m3pon mp3ta m3pu 2m1q 2m3r2 2m1s m2san ms3and m4sap ms1as m2sau m3sä m3sc msch2 m4sco m3se m4s1ef ms1erw m4sex ms1ini mso2r ms1ori m2spä m2sped ms2po m2spot m2spro ms2pu ms3s2 m4stag m3stel m3s2ti m3sto ms4tr ms5trä ms5tren m3s2tu ms4tü ms1um m2sü m3sy 4m1t mt1ab mt1ak m3tam mt1ar mt3are mt1elt m2t1erf m4t1erg m2t1erl m2t1ers m2t1ert m4t1eta m2t1eu m2th mt3ho m2t1im m2t1ins mti2s mtmen2 m3tö mt1ös m4ts1 mt2sa mt2se mt3s2ka mt2spr mtt2 mt1um mt1urt m3tü mt3z 1mu mu1a mu3cke 2m3uh mu3la 2muls 3mun mun2d1a 4m3unf 4m3ungeb mu3ni m4unk munt2 4munz mu3ra mu4r1u2f m4us mu4s1a 3musi mu2s1o mu2sp mus3t mu2su mut1au muts3 mut2st 1mü 2müb mül4len 3mün 3müt mütter3 2m1v mvoll1 2m1w2 mwa2 mwa4r mwel4 1my my4s 2m1z 1na 3na. 2n1ab na2bä 4nabg 4nabh na2bl n2abo na2br 4n3abs 4nabt 3n2ac na2ch1 na3chen nach3s nacht6ra 4nadd n2ade 4na2dr n1af na1f4r 3n2ag na2gem 3n2ah na2h1a n3ahn 3nai nai2e n3aig n3air 2n1ak na2ka 3nako n2al. na2l1a2 na2lä 3n2ald n4ale na4lent na2let nal3la nalmo2 na2lop nal2ph n2als. nal3t4 na2lu 2naly n4am. 3name n4amen 4n3a2mer na3m4n 3namo 2n1amt namt4s n1an. 4n1a2na 4nanb n1and2 4n1ang 2nanh 2nani 4nank 2nanl 3nann na3no n1anp 2nanr 2n1ans 2nantr 2nanw nap2si n1ar 5nar. na2r1a 2narc n2ard 4narg 3nari n2ark n2arle 2narm n2arp 4n3art na3r2u 3nas n2as. na4schw 4nasp 4n1a2sy nasyl2 3nat n4ata na3t4h 4natm nats1 nat4sa nat4sc 4natt n1au 4nauf nauf4fr n3aug 5naui 3n2aul 4nausb 4nausg n2auso 4nauss n4auste 4nausw navi5er. navi5ers 1nä 3n2äc 3näe n1ähn 2n1ä2m 2n1än när4s5 3näs nä2sc n2äss 2näu 3nä1um 2n3b4 nbe2in nbe3n nbe3r2e nbes4 nbu2s nby4 2n1c n3ce2n3 nch3m n2ck 2n1d nd2ag n2d1ak n2danl nd1ann n2d1anz ndat2 nd1au nd1c nde4al. n2dei nde4län n4d3ents nde4rob nder5ste nde2se ndi2a3 n2dob ndo2be ndo1c nd1op nd1or n2dö n2d3rat n2d3re n2drob nd3rol nd3ros n2drö n2drui n4d3run nd2sor nd2spr nd4stab nds3tau nd3th ndt4r n2dü4 ndy3 1ne 3ne. ne2ap ne3as ne3at ne2bl 2n1ebn 2nec 3neca ne1ck 3ned ne2de 2nee3 ne2e2i4 ne3ein n1ef neg4 2ne2he. 3nehm 4n1ehr 2n1ei n2eid 4neif 3neigt 4n3eing 4n3eink ne2ke nek3t4 ne2l 3nela nel3b 2n1ele 4nelek 4nelem ne3len ne3li nel4la 3ne3l2o 3ne3lu n2em. 2n1emb n1e2mi 2n3emp 2n1ems 3nen n4en. nen3a2 n2enb n2enc 4n1endb 4n1endd 4n1endf n1endg 4n1endh 4n1endk 4n1endp 4n1endt 4n1endw ne2n1e2b nen3ei nenen1 ne4nene 4nengb nen4ge. nen4gen 4nengs 4nengt n2enh ne2ni n2enj nen3k ne2no n2ens nens4e nen3sk 5n2en3t2a n1entb 4n1entl 4nentn 5nentr n1ents 4n3entw 4nentz ne2n3u n2env n2enw ne2ob ne1os 2nepf 2n1epo ne2pos n2er. ne1ra ne2ra2b ne3r4al ne2r3am ne2ran ne2rap ne2rau 4nerbe. 4nerben n1erbi nere2 ne2reb n1erf 4n5erfo nerfor4 2nerfü 3nergr n1erh 2n3erhö 3neri n1erk n2erli 2n1erlö n1ermä ner4mit n2ern. 4n1ernt ne2ro ne1rös n2erp 3n2ers. 2n3ersa ner8schle n2ert. n1ertr ne2rup n2erv 2n1erz 3n2es n4es. ne3san nes4c nesi1e ne3ska nes1o ne2s1p 4n3essi ne1sta nes3ti ne2tad ne2t1ak ne2t1an ne2tap n1etat ne2tau ne2th net3ha nett4sc n1e2tu net2zi ne2u neu1c neu3g 2n1eup n2ew 2n1ex 3nez 1né 2n1f nf1ak nfalt4 nf2ä nff4 n3fi nfi4le. nf4l nf5lin nf2o nfo1s nf4r nf3s nft2o nft4s3 n2f1u 4n1g ng2abs n2g1ac ng1ad n2g1ak n2g3a2m n2g1and ng2anf ng1anz n2g1äl ng3d4 n3gef n2g1ein ng2en ngen2a n3ger nge4ram n4g3erse nge4zän ng3g4 ng3hu n2g1i2d n3gläs n2glic n2glo n3g2loc n2glö ng3m n2gn ng3ne ng1or ng3rat ng3roc ngs3c ng4s3e4h ngs3pa ngs5tri ng3ts n2gum 2n1h4 n3han n3har n3hau n3hä n3he nhe2r n3hu 1ni 3nia nib4l nich1s nich8ters n1id ni2de ni3de. ni3dr n4ie nie3b ni1el nie3l2a nie4n3 ni3ene ni1ero nifes3 nig2a 2n3i2gel nig3r ni2gre nig4sp 3nik ni2kal ni2kar ni3ker ni4k3ing ni3kl ni2kr 3n2il nim2o 4n1imp nin1 3n2in. n2in4a 4n3ind 2ninf 3n2ing4 4n1inh ni2nor 2n1ins n2ins. 4ninse 4n1int 2n1inv ni2ob ni3ok ni3ol n2ip ni3ra 3n2is ni4schw ni2s1e ni2s1p ni3spi nis3s4 ni2s1u 2nit ni2ti ni3t4r nit4s ni3tsc nitts1 nitt4sa ni3tu ni3v 3nix n1j 2n1k n2k3ad n2k1ak n3k2al n4k3alg nk2am n2kans n2kaus n2käh n2k1är nke2c n4k3erfa nk4erg nk1inh n2k1ins nk3len nk3les n2klie nk2lo nk2lu nk3lun nk4na n2kne n2k1ort nk2öf n2köl n2k3ro nk2s1al nks2ei nk3s2z nk2tak nk2tan nkt1it nk4top nk2tru 2n3l2 2n1m4 nmen2s 4n1n nna2be n2nada n4n1all n2n1an n2nau nnen3g n4nents nn2erh nn2erk nne2rö n4n3er4wa nner2z nne2s nnes1e nne4st nn2ex nn3f nng4 n3ni n2nof nn1o2r nn3sc nn3se nn3s2p nn2th n2n1uf n2n1unf nn1ur 1no 3no. 3nobl no2bla n2o3ble 2n1ob2s no1c 2no2d no3dr n1of 2n3o2fe n3ole no2leu n2on. 3n2opa 3nor. nor2a no2rad no1rak no3ral 2norc nor2d5r 3norh 3norm 3nors n1ort 3n2os. no3sh no2sp n2oste nost1r 2nostv no3tab no2tä no4t3ei no2tel no3t3h no4tha no2t3in no2t1op no2tr 3nov 3now 2n1o2x 3noz 2nöd 2nö2f 4n1ö4l 2n3p4 npa2g npro1 npsy3 2n1q 2n3r2 nräu3s nre3sz nrö2s1 6n1s n2s1a2d n2s1all n2sang n2sant n2saus n3sav n2s1än n2s1äus ns2ca n6schef n4schro nsch7werd ns1eb ns1e2d nseh5ere nsen4sp ns1ent n2s1ep ns1erf ns1erg n2serh n2s1erk n2s1erö ns1ers n2s1erw n2s1erz nse2t n4s1eta n3sex nsfi4l nsho2f n3sil n2simp n2s1ini nsi4te nsi2tr ns2kal n2s1op n4s3ort. nsp4 n2spat n2sph n3s2pi ns4pie n2spo ns3pon n2sprä n4s3prie n4spro nsrü2 ns3s2 nst1ak n3star n3stat n4stat. n4s3tate nst3eif n3stemm ns4tent ns6terbe n5s6terne n5s6terns nst4erö ns2ti nst5opfe ns4tor n4strac n4strie ns2tu nst2ü nstü1b n2sty ns2um n2s1un ns2ung ns4unr ns4uns n3sy n4s3zi 2n1t nt3abs n3t2a3c n3t2al nta3m nt1ang n4tanza nt2arb nt1ark nt2arm nt4at nt1äm n2t1äu nte3au nte2b nt1ebe nte1e nte3g6 nt1eh n2teig nt2en nt4ene nten6te. n3ter nt4ern nt4ers nt4ert n4t1ess nteu3 nte3v nt2her n2t3ho n3thr n3t4hu nti3c nti3k4l n2tinf n2t1inh ntini1 nt2ins n3ti1t ntmen2 ntmo2 n3to nto3me nton2s1 n3tö nt3rec nt3reif n5trep nt4rig n5trop n2t3rü n4ts nt3sa nt4sau nts2o nts2p nt4s3par nts2t nt2sto n3tu 3n4tu. ntum4 ntu2ra ntu4re. ntu4res n3tü nt3z2 1nu. 1nu1a nu3ar nubi1 1nu1c 1nud 3nue nu2es nuf2 nu2fe 1nug 2n1uh 1nui nu3k4 n2um. 2n3umb 2numf 2numg 3numm 2numr 2n1ums 2n3umz nu2n 2nuna 1n2ung4 3nung. n3ungl 2n1uni 2nunt 1nuo 2nup 2nur 3nu2s nu3sc nu3se nu3sl 1nut nu2ta nu4t3r 1nuu 1nux 1nuz 3nü. 2nü4b nür1c 3nüs 1nüt 2n1v2 n3ver 4n1w 1ny. 1nyh 2nymu n1yo 1nyr 1nys 1nyw 2n1z n2zad n2z1a4g n2zan n2z1au n2z1än n2zär nzdi1s nz1ec n4zense n4zentw n4zentz nz3erwe nzi2ga nzig4s nz1ini n2zor nz2öl nz3s n2zurk n2z1wa n2z1wä n2zwö n2z1wu ño1 2o3a2 o4abi o4ac oa3che oa3chi o4ad oa3de oa4g o4ah o4a3i oa3ke oa4k1l o4a3la o4a3mi oanne4 o2ar o2as 3oa3se o4at o5au o1b ob2al 2oban o3bar 2o3b2ä 2obb ob2e 2obe. 2obea ob3ein 2o3b4en oben3d4 oben3se ober3in4 obe4ris 2obew 2o3b2i obi4t ob3ite 1obj ob1l o2b3li 2o3blo 2o3bo o2b3re o3bri ob3s2h ob3sk obs2p ob2sta 2o3bu obu2s 2o3bü 2oby4 2oc o3ca oc1c o1ce och1a ocha2b o1che oche4b o2ch1ec och1ei ocher4k och3l och3m och1o och3ö2 och3r och1s ocht2 och3te o1chu ochu2f och1w o1ci o1ck o2ckar o3cke ock2er o3cki o2cko ock3sz o1cl o1ç o1d o3d2a od2dr o3deb o3d2e1i odein3 ode2n1 odene4 ode3sp o3dex 2o3dia o3dir o3div o2don odo4s 2odr o2dre odt4 2o3du 2o1e2 o2ec oen1 o4e3s o2e3t o3et. o3ets o1ë 2ofa of1a2c of1am of1au o2f1ei of2en o3fer of2f1a of2f1in 1offiz of2f5l of2f3r offs2 of2fu 2ofi of3l of1la of4lä of4lö 2ofo 2o1f1r of3ra of3rä of4rü ofs1a of4sam of2spe of2spr of2s1u 2oft of2tei of3th 2o1g o2g1ab oga3d og1ala og1ang o2g1ei oge2l1i o3gh ogi2er og2lo o3g4n ogs2 og3sp og1ste o1ha o1hä o1he o2h1eis ohen3s o2h1ert o2h1erz o1hi ohl1a ohl3au oh3lec ohl1ei oh3lem oh3len oh3lep oh4lerg oh4l3erh oh4lerw oh3lo ohls2e oh2lu 3ohng oh2ni 1ohnm oh2n1o o1ho oho2la oh1o2p o2h3ö ohr1a oh4rin oh1ro oh1s oh3t o1hu oh1w 2o1hy 2oi o1i2d o3ie o1im oimmu4 o1in oi2r o2isc o3isch. o1ism oiss2 oi1th 2o1j 2o1k oka2la okale4 3o2kel oki2o ok1lä ok4n 4okr ok2s1p okt4 2ol o1la o2lab o2l1ak ol2ar olars2 ol1auf o1lä ol4dam ol4dr ole3e ol1eie ol1eis oler2 ole3s ol1ex o1lé ol2fa ol2fl olf1r ol2fra ol2gl ol2gr ol2i oli3k4 ol2kl olk3r ol2kre ol2lak ol2l3au oll1e2c ol2l1ei ol2lel oll5ends ol4lerk oll5erwe o3lo ol2of olo3p2 ol1ort ol2str o1lu 3oly 1olym ol2z1a ol4z3ern ol2zin ol2zw 2om o2mab oma4ner om2anw om1art o2m1au o2meb ome3c o2m1ei o3m2eis o2mel o3men. o2mep o2meru om1erz om2es omiet1 o2m1ind om1ing o2m1int om3ma om1org om3pf oms2 omtu3 o4munt omy1 2ona ona2b o2nae o3nal on1ap o2narb on2au on3aus 2onä onbe3 2onc onderer5 2one one2i one2n3 onens2 o2n1erb o2n1erd on1erg on1erö o3nett on3f2 on3g2l ong4r ong3s 4o3ni on2i3d o4nikr o4n1im on3ing on3k2 onli4 onlo2c on3n2an on3n2e ono1 o3nod o2noke on1orc ono3s ons1a onsa4g on4sam on2seb onse2l onsi2 ons3l ons1p onst2h on3t2a ont3ant on4t3end ont3erw ont2h on4t3ri ont3s o1nu 2onuk on3v 1ony on3z o1ñ oof2 oo2k3l o1op o1or oor3f oo4sk oo2tr 2o1ö2 o1pa opab4 o2p3ad op3akt opa5s o1pec o1pei o1pe4n 2opf. op2f3a op3fah o2pfe op4ferd opf5erde opf1l opf3la op1flü 4oph2 o3phe o1pi opi5a4 opi3er. opi5ers. opin2 op5lag o2p3le op3li 2o3po op4pl op2pr 2o1pr 1opsi op3sz 1op3t4 o1q 2or. or1a or3a2b o1rad 2orak 2oral o2r3alm or4alt 3oram or2and o2ranh or3arb o1ras or3att o3rä or1änd or1ät or2bar orb2l or1c 2orca or2ce 4orda or2d3am or2dau or4d3eng or2deu or2d1ir or2dit 1ordn or2do 2ordr 2ords ord3s2t or2dum 2ordw 4ore ore4as o2r1e2ck o2r1ef ore2h or1eig o2rein or1er o2rerf or1eth 2orf or2fle orf3s4 or3ga 2orget or3g2h 2orgia orgi1e or2gl or3gle or2gn 2orh 2o3ric o4rient o3rier 4oril 4orin1 2orit ork2a or2k3ar ork2s 2orm or4mans or4ment or5ne. or3n2o1 2o1ro oro3n2a 2o1rö 2orq 2orr orr4a or3rh 2ors2 or3s4a orsch5li or3sh or3sz or2t1ak or4t1an or2t1au or2tär or2tef ort3eig or4t3ent or4t3ere ort3erf or2t3ev or2the ort3ins or4t3off or2tor or4tö or4trau or4t3räu ort3re ort3ric or2t1um o3ru or2uf o4r3un o2r3ü o2rya 2o3s2a os3ad os4an osa1s o3sche os4co 2o3se ose3e o2s1ei ose2n o4sents 2osh o3s2hi o3sho 2osi o3sk o4ska os3ke o4ski 2os2kl 2os2ko os2lo 2oso 2os1p o2s3per o3s2po os2sa oss3and os4sä os2sei os4s3en4k os4s3enz os2s3o os4son os2s3p os2s3t ost1a osta2b os4t3am os3tarr ost4art os4ta4s os4tei oster3e os6t5er6we os2t3h os3til os3to os4t1ob ost3ran ost3rä ost3re ost3rot ost3uf 2osu4 2o3sy o3s2ze o2ß1el o2ß1en2k o2ß1enz o2ß1ere o2ß1erf 2o1t ota2go o5tark o2t1au ot3aug o2teb o3t2e1i otei4n ote2l1a ote4lei ot4em3 otemp2 o2t1erw ote2s 4ot2h ot4he ot5hel o4t3hi ot3hos o2thr o2t1i2m ot2in otli2 ot4ol ot1opf ot2or oto2ra oto1s o3tra o2t3re ot3rin ot2sa ot3sc ots1p ot4spa ots2pe ot2spr ot4terk ot2th ot2t3r ot4tri o3tü o2u oub4 ou2ce ou1f4l oug2 ou2ge ou3gl o3uh ou4le. o3um o3unds oun4ge. 2our ouri4 our4ne. ou3s2i outu4 2ouv 2o1ü o1v ove3s 2ovi oviso3 2ovo 2o1w o3wec owe2r1 o3wi o1x ox2a ox2e 1o2xid ox3l o2xu 1oxy o1y2en o1yo oy1s4 2o1z oz2e ozen4ta o3zi ozon1 órd2 ö1b öbe2la öbe4li öb2l ö2ble ö2b3r öb2s3 2ö1c öch1l ö2chr öch2s öchs4tu öcht4 ö1d ödi3 öd2st ö1e 1öf öf2fl öf3l ögen2s1 ög3l ög3r ö1he öh3l2e öh3ri ö1hu ö3ig. ö1ke ö2ko3 ök3r 3öl. öl1a2 öl1ei öl1em öl4en öl2f1ei öl1im öl1in öl2k3l öl3la öl2nar öl1o2 öls2 öl3sa öl3sz ö2l1u öl2ung ölz2w öm2s 2ön ön2e ö3ni önn2e ön2s ön3sc ön3sp ö1nu öo1 ö1pe öpf3l öp4s3t ör3a2 ör1c ör2dr ö2r3ec ö2r1ei ö2r1e2l ör2erg ö2rerl ö3r2erz ör2f3l ör2gl ö2r1im ör2kl örner2 ör1o2 örs2e ör3s2k ört2e ör2tr öru4 ö2r1une ö2sa ö2scha ö4sch3ei ö2schl ö2sch3m ö2schw ö2s1ei ö2sp ös2s1c ös2st ö2st ös3te ös2th ös3tr ö3su ö1ß 2ö1t ö2t3a öte4n3 öt2h öts2 öt2sc öt2tr ö1v ö1w ö1z öze3 özes4 p2a 1pa. 1paa 1pac pa3da pa2dr pa2el pa1f4r pag4 pa3gh pa1ho 1pak pa1k4l pak2to 1pala pala3t 1palä pa3li 2palt pa2nar pa3nei pa2neu pan3k4 2panl 3pa2no pan3sl pant2 3panz4 1pap papi2 papieren8 papie8r7end 3para pa2r3af par3akt 1parc pa5reg pa5rek 2par2er 2parg pargel6d 1park. par4kam par4kau par2kl par2kr 1paro 2parp 1partn 1party par3z2 pa3s2p pa4st 2paß 1pat pat4c pat4e2 pa5t4r 1pau p3auf pa3uni 1pä 3pä2c pä3cke 3päd 3pär 3päs pä4t1e2h pä4t3ent pä2t3h pä2to pät3s4 2p1b 2p3c 2p1d2 pda4 p2e 1pe. pe2a pea4r pech1 1ped pe2en pef4 pei1 2peic pe1im pekt4s 2peku 1pel pe2l3a4 pel3d pe2let pe2lex pe3li4n pe4l3ink pell2a pell4e 1pem pena4 pe3n2al pen3da pe4nen 1penn pe2n1o 3pensi 1pensu pen3z2 1pep pe1ra per2an pere2 1perl per4na 3pero pe2rob per2r1a 5pers perwa4 pe3sa pes3s2 pe2st 3pet 1pé 4pf. p2fab p2fad p2faf pf3ai p2f1ak pf1ans p2fa4r pf3are p2f1au 4p3fe. p2fei pf1eim pf1ein p3fen. p2fent p3fer. pf2erw p3f2es pff4 p2f1in3s p2f3lä pf3lei pf3lie pf3lo pf3lu p2for pf3r pf1ra 2pfs2 pf3sl pf3sz 2pf3t 2p1g pgra2 1ph 4ph. ph2a 2phä 2phb 4phd 2p1hei phen3d phen3s 2ph1ers 2phf 4phg phi2ka 4phk ph2l 2phm 2phn p3hop 2phö ph4r 2phs ph3t2 2phthe phu4s 2p1hü 2phz pi2a3 pias4 pi3as. pi3chl p4id2 piegelei8en pi2el piela2 3pier 3pik 1pil pi3le pil4zer pin2e pingen4 ping3s 3pinse pi2o pi3oi pi3onu 3pip pi2pe pi3ri 3pirin 3pis 4piso pi3t2a pi1th pit2s pi2z1in p1j 2p1k2 pku2 pkur1 1p2l4 2pl. 3p4la p5la. p5lad plan3g 3plä 2ple. ple1c p4leg p4lem 3ple5n4 2plig p4lik p4liz p4lo 2p3lu 2p1m2 2p1n 1p2o po3b4 po1c 3pod 2p3oh po2i po3id 3poin 3pok 3p4ol po2lau po3li po4lor 2pond po1o2b po2p3ak po2p3ar po1pe po2pl po3pt po1ral po1rau 2porn por3s por4tin por4tre por6tri pos2e po4sta pos4t3ag po4stä po2s3te post3ei po2sto pos6tr post3ra po3ta 3pote po2t1u po2w po3x pö2bl pö2c 2p1p p2p3a2b pp3anl ppe4ler ppe2n1 p2p1f4 p2p1h p3p2ho pp3l pp5lan pp1lä p2ple p2p3ra p2p3re p2pri pp3sa ppt2 p2r2 1prak 1prax p4rä 1präd 1präg 3präm 3präs 2pre. 2prec 1pred pre2e1 1prei 3preis 2p3rer 3p4res pri4e 2prig 1prinz 1p4ro 3prob 2proc 3prod 3prog 3proj 2pross pro1st 3prot 1prüf 2prün 2p1s 4ps. ps4an p3se p3s2h ps1id p2sö ps2po p2st p3sta p3stea p3stel p3s2ti pst3r ps2tu p3stü 3p2sy ps2ze 2p1t pt1a pt2ab pt3alb pt3at p3te p4t3ec p4t1ei pte4l p4tele p4t1ent pt3erei p4t1erw p4t1erz p2th pt1in1 pto3me p4tos pto2w p2t3r pt3s2 ptt2 pt1um pt1urs ptü4 3p2ty pt3z 1pu pu1a pub4 2puc pu2dr 2p1uh pul2sp 2pund pun2s 2punt 2pur pu2s3t 3put put2s 1püf 2pül pün2 2p1v 2p1w pwa4r 3py1 pys4 py3t 2p1z qu4 1queu 1ra. ra2ab 2r3aac r3aal ra3ar r1ab ra2bar rab2bl 2rabd r2aber 2rabf 2rabg 1r4abi ra2br 2rabs 2rabt 2r3abw 1raby ra1ce 2r1acet ra4cheb ra4chin racht3r rach6trä ra2chu r2ack r2ad r4ad. rada2 ra2dam 2radap 3radf 3radl r3a2d3r rad5t 1rae r2af raf3ar ra2fer ra3ge ra3gle ra2gn 3r2ahm 4raht 2raic rail4l 2r3air 1rake 3ra1k4l ra2kre ra2kro 2rakti 3rakü r2al r4al. ra2la2 ral3ab rala4g r3alar ral3b 3r4ald ra3le 2ralg r4ali rali5er. rali5ers ralk2 ral3la rall2e 2rallg 2r3alm. r3alp. 2ralpe r4als r3al3t r4alt2h ra2lu 3raly rama3s ra2mer 1r2ami r2amm ram4man ram6m5ers ram4m3u ram2p3l 2r1amt ramt4s r2an. 4ranc r4anda r4ande ran4dep ran4d3er rand3s 4r3anei r4aner 2ranf 1rangi rani1e ran2kr 2ranl 2r1anm 2r1anp 2ranr r2ans. r2ansp ran4spa 2rantr 2r3anw r2ap 2rapf r1ar r2ara 2rarb 3rarei rar3f4 ra2r1in r2ark r2arp 2r3arz r2as r4as. ras2a ra4schl 2r3asph 2raß 1rat r4at. ra2t1a r3atl rat4r rat2st 2r3atta 4rau. 3raub. 4raud rau3e2n 2rauf 2raug 3raum rau4m3ag rau4man rau2mi 3rausc 2rausg rau2sp 2raus5s raut5s 1raü r2ax 3r2äd 4räf 4räg 2räh 2räm 3rän. 3räni 3räns 2r1är r2är. rä3ra rä2s1c 3rätse rä2u räu2s räu5sche 4räut 2r1b r2b1ab r2b1a2de r2bak rbal3a rba3re rb1art rb1auf rbb2 rb1ech r4belä rb1ent rbe3r2e r3b2la rbla2d r8blasser r4b3last r3blä r2ble. rb3ler rb2lin rb2lö rb2o rb4ri rb2s rb3se rb4sei rb3ska rbs1o rb3sp rb4stä rb3str rb2u rby4t 2rc r1ce r1che. r1chen r1chi rch3l rch3m rch3r rch1s2 rch3sp rchst4r rch3ta rch6terw rch1w r1ci r2ck1 r1cl r1ç 2r1d r3d2ac r2daf r2d1ak r2d1al rd2am rdani1 rd1ant rd1anz r4dap r2dei rd2ei. r2d1elb r3den rden3d rden4gl rde3re rder4er rderin6s r4d3ernt rde3sp rdi3a2 rdia4l r2d1inn rd1it rdo2be r3don rd1os r2dö rd3rat rd4ri rdt4 rd3ta rd3th rdwa4 1re 3re. re3aler re2alt re2am re3as re3at. re3ats 2reä re2b1a re2b1l reb1r reb3ra re2bü r2ech rech3ar 4rechs 2reck. 2recki 4redd 2redit re1el re1er 3refe 4reff 3refl 3refo 3reg 5reg. rege4l3ä re2hac re4h3ent re2h1i rehl4 re2h1o r2ei. rei4bl r2eie 2reig 3reigew rei3l2a rei3l2i reim2p r1ein rei3nec 4reing r3eink 4reinr rein8s7tre re1in2v reister6 3rek 4re2ke re3la 2r1elb rel2e re3lei 2re2lek 2r1elf re3lo 2r1elt relu2 r4em. r2emi 4rempf 4remu r4en. r2ena rena2b re3nal re2nä 3rendi ren3dr re4n3end ren4gl 2rengp re2ni r1ense 2r1entl 2r1ents 2rentw 4r3entz r2enz re3or 3repe 3repo 4repp 3r4er. 2r1erb r2erbr 2r1erd r1erf r1erg r4ergen r1erk 4r3erken r2erki r1erl 4r3erlau 2rerlö 2r1erm rer2n 2r1ernä 4r3erns 4r3ernt r2ero re2rob r1erö 3r2ers. 2r1ersa r2erse 2rersp r1ert r2erte 2rertr 2r1erz rer5ze r2erzy 3r4es. re2sa 3rese 3reso 2ress ress2e res6s5erw 3rest re1sta re2s2tu 3resu re2thy re2u reu3g2 2reul re3uni 2r1eur 2reü 2r3evid r1ew rewa4r re2wi 2r3e2x1 3rez 4rezi 1ré 2r1f rf1ält rf2äu r2fent rf2es rfi4le. rf3lic rf3lin rf4lö r3flü rfolg4s r3for rf4ru rf4rü rf2sa rf2s1ä rf4s1id rf2s3pr rf2s3t rf2ta rf3t4r rf2u 4r1g rg2ab r2g1a2d r2g1ah r2g1ak rg2an rge4an rge2bl rge4l3er rgen4z3w rge4ral rge4tap r2geto rgi4sel r2glan r2gleu r2glig r2gno r2g1ob r2g3ral r2greg r2gres r2gret rg3rin rg3s2p rgs4tr rg5s2tu r1h4 2rh. 2rha r2ha. 2rhä 3r4he. 3r4hen r3her r2hoe rho2i3 2rhol 2rhö 2rhs rhu2s 1ri ri3am ria1s ri3at rib2bl ri1ce ri1cha rid2 ri2d3an 2ridol r2ie rie2fr ri1el riene4 rien3s rie2nu ri1er. ri4ere ri3ers. ri3esti ri1eu ri2f1a ri2f1ei ri2fer ri2f1o ri2fr rif3s rif4ter 3rig 5rig. 5rige ri4gene 5rigj rig1l 4rigr rik1l ri4kla r2imb 2rimp rim2s rim4sc r2i3na 2r1ind rin4dex rin4diz ri3n4e rine1i 2r1inf rin2fo ring3l rin2gr 2r1inh 2rinit 2rink 3rinn 6r5innenm 4r3inner 4rinnta r1innu 2r1ins 3r4ins. rin4so rin2sp r4inspi 2rint rin4teg rin4t5r r1inv r2inva 2rinve 4r1ir r2is ris2a ri4scho ri4schw 3risik ri3so ri4s1p 3riss ri2st ris6t5ers r2it r3i2tal ri3t2i rit4r rit2tr 5ritu rix1 1rí 2r1j 2r1k rk2am r2käh r3klau r2klis rk4lo rk2lu rk4n r2k5nu rk3räu r2k3rea r3kri rk3rin rk2s1e rk3shi rk2sp rk1st rkstati6 rk4stec rk2ta rk4t3eng rk4t3erf rkt3ers rk6tersc rk4t3erw rk2tin rk2t1o2 rk2t3r rk3tra rk4tri rk1uh rk2um rku2n rk1uni 4r1l r3l2a rl2e rle2a r3lec rle2i r3let r3l2i rli2s r3l2o rl2ö rlös3s rl2s1p rl3ste rl2s3to rl3t 4r1m r3m2ag rma2la r2m1ald rm1ans rm1anz rm1a2p r2maph rm2är rm3d2 r3me. r2m1ef r2meo rm2es r2mide r2m1im r2m1o2ri rmo1s rm3sa rm3sta rmt2a rm2u rm3ums 4rn rna2b rna4n rn2and rn3ani r2n1anz rn2a2r rn3are rn3ari r2nau rnd4 rn3dr r3ne rn3e4ben r4nef rn2ei rn3eif r4n3eis rne2n r4n1ene rn3ense r4nerf r4n1erg rn4erhi r4nerk r4n1ert r5nes rn2et r4nex rn3f rng2 r3ni r4n1in r3nod r2n1op r2n1or rn1ö r1nöt rn3s2ä rn3s2p rn3s2z rn3t2e r1nu rn1ur r1nü r1ny ro2bei 2robj 3robo 2robs ro1c 3rock. r2o3de ro3e4 2rof roh1l roh3na 3r2ohr 3roi ro1ir ro3le rol4lan rol3l4en rol3s 2roly 4rom. ro2mad ro2mer 4romm 4romt r2on 3ronn rons2 ron4tan ro1ny ro1pe ro3ph r1or r2ora ror3al ro2rat ro2rei ro2r1o ror3th ro3sh ro3s2i ro3smo ros2p ros2s1c ro3st2a rost1r 4roß ro2ßu ro4tag rote3i ro2tho ro4tri rots2o rot2ta ro3t2u ro3unt 3rout 2rox rö2b3l rö2du 2röf 4rög 1r2öh r1ök 1r2öl 3römi 4röp r1ör r2ös. r2öse 2r1p2 rp4a rp4e rpe2re rpe4r3in rpf4 r2pli r3po rpro1 rps3t rp3t r3pu r1q 2r1r rr2ab rr2ar rr1äm rrb2 rr1c r3r2e rre4ale rrer4s rre2st r4rew rr2he rrik2 rr2n3a rr2o r2r3ob rro3m rr2st rr3stu rr2th r3ru r3r2ü rrü1b 4r1s rs3ab r2s1a2d r4samp r4s1amt rs2an r2s3ang rs3anp rs3ant rs3ar r3sch2e r6scherl rsch2l r3schu r3schw r2sein rse2n1 rs2end rse4ne rs1ere rs1erö rs1ers rs1erz rs1eta r3sho r3si rs2kal rs2kan rs2kie rs2kis rs2kl r4sko r4skr r4sku rs3l rs4no r3so r4sob r4s1op r4sord r4s3ort. rs2p4 r2s3ph rs3s2 r4stant rs2tec r6st5eing rs4temp rs4terb rs4t3er4w rs2th rs2ti r3stie r2stin rst3ing r2stip r3sto rs4tob r4stot r3stö r3s4tr rst3ran r6strang rs2tu r3s4tü r3swi r3sy 4r1t rtal2 r2t1alm rtals1 rt1am rt1ang rt1ann rt1ant rt1anz r2t1ar rt3a4re r2t3att rt1är rte1e2 rt4eif rtei3la rtei1s4 r2telf r2temo rte2n1 rten3s2 rt3erei r4terfo r4t3erh r2t1erk r4t3er4la r4t3erle r4t3ernä rter4re rt1ers rte3s2k r2thi rt3hol rt2hum r2t1id r2t1ima r2tinf rto1p rt1or rto2ri r3tö r4trak rt3rec r4treis r5tri rt1ros rtrü2c r4ts rt4s1eh rt2so rt2spa rt2spr rtt4 r2t1urt r3tü rt3z 1ru ru1a ru3a2r3 rube2 ruch3st ru6ckerl ru2cku rude2a ru2dr 3ruf ru2fa ruf2s3 4rug 2r1uhr 3ruin ru1ins ru1is 2rum 4rumf ru2mi 4ruml r2ums. 4rumz 2r1una 2rund run2d1a r2unde rund3er run6derl run6ders run6derw 2r1unf 2rungl 2r1u2ni 4r3unio run2kr 2r1unl 2r1unm 4runn 4r3unt 2runw ru3pr 4r3ur ru2ra ru2r1e 5ruro ru2si rus2s1p rus4st ru2st ru3sta 3rut rut3h ru2t1o2 ru2t3r 4ruz ru2zw 1rü 2rüb rü1ben rü1ch 4rümm 2r1v rve4n1e 2r1w rwun3s 4r1x 1ry ry2c 2r1z rz1a2c rz2an r2zar r2zas r5zene rz1eng r4z3ents r2z1erf r2z1erg r2z1erk r2z1erw rz1id r3z2of rz1op rz2ö rz3te rz2th rz2t3ro rzug2u r3zwä r3z2wec 1sa 3sa. 3saa 2s1ab sa2be 3sabet sa2bl sa3ble sa2br 4sabs sa2cho2 sach3t 2s1ada s1adm 2s1a2dr 3safa sa2fe 2s3aff 3safi sa1f4r 3saga sa4gent sag4n sa2gr 3sai sa3i2k1 sail4 2s1ak sa2ka 3saki 3sakr 4sakt 3s2al. sa4l3erb sa2l1id 3salo sal2se 2s1alt 3s2alz 3sam s3ameri 5samm 6s1amma 4s1amn s1amp sam2to s1an s2an. 2s3a2na s3anb s2an2c s2and s4and. san4dri 3sang. 2s3anh 3sani 2s3anl 2s3ans san4sk 4s3antr 2s3anw 2s1ap sa2po 3sapr 2s1ar 3s4ar. 3s2ara 4s3arb 3s2ard 3sari s3arr 3s2ars 4sarti s1asp 4s3a2sy 3sat sat2a 4s3ath 4s3atl 4satm sa2tr sa3ts sat4z3en s1a4u 3sau. 3sauc 3saue 2s3aufb sau2gr 3saum 3saur sauri1 2s3ausb 3s2ause s3ausw 2s3av sa2vo 1sä s3ähn 3säl s1ält 2s1äm 2s1änd 3sänge 2s1är 3s2ät 3säul 2säuß 4s3b4 sba4n sbe3r2e 1sc 2sc. 2scam s2can s2cap 2scar 2s1ce 6sch. 2schak s4ch2al 4schanc 4schang 2schao s4chä 4schb 4schc 2schd 3sche. 2schef sch3ei. 4schemp sch2en 3sches 4schess 4schex 2schf 2schg 2schh schi4e s4chim 4schiru 3schis 2schk s4chl 4schle. 6schlein sch6lit 2schmö 2schn. 2schox s4chö 2schp 2schq 4schre. 4schrin sch3rom 4schrou 6schs schs2e sch3s2k 4sch3t scht2a scht4r s4chu 4schunt sch2up 3schü 2schv 4schwet sch4wil 2schz 2scj 4s3cl 2sco 3s4cop 3sco4r s2cr 2scs 2scu 4s3d2 sda3me sde1s sdien4e sd4r 1se se3at. 2s1e2ben seb4r 2s1echo s1echt 2s1e2ck 3see se1ec se2e1i4 see3ig seein2 se1er. se1erö 2s1eff se2gal se2gl seg4r 3seh se2h1a4 se3he se4h1ei se4hel se4herk se2hin seh1l seh3re seh1s seh3t se2hüb 2s1ei. 2s1eig s1ein 5s4ein. 2seinb sein4du sei3n2e sein4fo 4seing 2seinh 4seink 2seinl 2seinn 4seinr s4eins. 4seinsp 4seinst 2seinw 4s1eis 3s2eit 3s2ek s2el. se2l1a se3lad sela4g se3lam sel1ec 4selem se4l3erl sel3ers 2self. s3elix se2l3ö s2els sel3sz sel3tr s4e3ma 2s1emp 3s2en. se4nag se2nä 2s1endl sen3gl 3s2eni 3senk se2no se4nob 3s2ens s2ent. 4s1entf 2s3entg s2enti 2s1ents 2sentw 2sentz se2n3u seo2r 4s1e2pos 3seq s4er. 3sera ser3a2d se2r3al se5ref s3ereig 6sereign se4r3eim se4r3enk ser2er 2s1erfo s2erfr s3erfü 4serfül ser3g s2ergr s1erh 2serhö 3seri 4serken 2s3ernt se2rob 4s3eröf s2ers. 2sersa 4serseh s4ert. s2erta seru2 se4r1uf se3rum se3rund 3s4erv 5ses. se2sel se1sta se3su 3set 4se4tap se2tat 4s1e2th se1u2n 2s1ex se2xe 4sexp sex3t 1sé 4s3f4 sfal6l5er sflo4 4s3g2 2s1h sh2a 3s2ha. sha2k 4s3han 1shas s3hä s3h2e 3shi. 3shid shi4r sh3n s3hoc 4shof 3shop sho4re 3show s3hö sh4r 1si si2ach si3ach. si2ad si3am. 2siat sib4 5si1c 2s1i2deo s2ido 3s4ie siege4s sien3 si3ene si1err sie2s si1f4 3s4ig si2g1a2 sig4n si3gnu si2g3r sig4st si2k1ab si2k1ä sik3erl si2ki si4k1l si2kr sik3s sik3t4 si2ku 3silo 2s1imm si3n4a 2s1ind 2s1inf sing1a sin3gh sin3g4l sin2gr sing3sa 4s1inh sin1i sini1e 2s1inq 2s1ins 2s1int 4s1inv 3sio sion4 3s2is si2sa si4schu si2s1e si2s1o si2s1p sis3s 3s2it si2tau sit3r si2tra si3tu siv1a sive3 si2vr 1sí 2s1j 2s1k2 4sk. 3skala 4skam 4skanz s3kar 4skas ska4te. 4skateg ska4tes 4skb s4kep 3s2ki. s2kif s2kig 3s2kik 4skir ski1s 3skiz sk4l 4s3klas sk4n 4skom 4skor 4skow 4skö 4sks 4sk3t 3skulp 2s1l2 3slal 4slan s2law s3lä sl3b s3le sler3s s3li 3s4lip sli4tu s3lo. slo3be s3loe 2s3m2 2s3n4 4sna snab4 sni3er. sni3ers 4s5not 4snö 1so 3so. so4a 2s1o2b so1c so3et 3soft 3sog s1o2he 4sohng 2s1ohr 3sol so3la so4l1ei sol4ler 4so2ly 3som 3s2on son3au sone2 son5ende son3sä so2ny so3o 2sopf 3sor. so1ral s1orc 2s3ord so2rei 2s1orga 5s2orge 2s1o2rie so2r1o2 3sors so4ru 3sos s4os. 4s1ost so3unt 3sov 4s1o2ve 3sow 2s1ox 3soz 1sö sö2c sö2f 2s1ök 2s1ö2l s1ös 1sp2 2sp. 2spaa 2spak s2pan spani7er. 2spap 2spara 2sparo 3sparu 3spaß 2spau s2paz s2pä 3späh 2spär s2pee 2spel 4spensi spe3p4 2s1peri 2sperl s2perr 2spers 2spet 3s2pez 4s3pf 2spha s3phe 2sphi 3s2pi4e 4spier4 spi2k 4spil 3spio 4spip 4spis 2spl 4spla 4splä 3s2pli s3p4lu s3pn 2spod 2spog s2poi 2spok 4spol 4s3pos s2pott 4spr. s2prac s2pran 2sprax 2spräm 4spräs 3s4prec 2spred 2spres 2sprob 3spross 3spru 2sprüf 2s3ps 2spt 2spun 2spup 3spur 4sput 4spy 2s1q 4s3r4 srat2s srat4sc sret3 srö2s1 srücker6 srü2d 6s1s ssa3bo ss1a2ck s5saf s3sag ss1aj s3sal s4s1ala s4s1alb s4s3amt s4s3ang s2sano s4sans ss2ant s4s3anz s3sa1s2 ss3att s3s2ä s4sce s4sco ss1ec s2s1ega sse3ha sse3inf sse3in4t sse6r5att ss1erö ss3erse s3s2es sse3ta ss3l ss1off ssoi4 s2s1op ss1ori ss2po s2spro ssquet4 ss3s4 sst2a s3stel ss2th ss2ti ss4tip ss2tur s3stü ss1ums s1t 6st. s2ta 4sta. 3staa 2stabb st2ac 3s4tad 3staff 2stag 3stah 2stak 2stale s3ta3li 2stalk st1alp st1ami 4stan. sta4na 3stand 2stani 4s3tann 2stans 2stanw s4tar. 4stari s4t2ars s3tat. s4tau. 2stauf 2staum 3staur 2staus 3staus. 2stax 3s2tä 4stäg 4stält s4tänd 5stätt s3täus 2stb 2st3c 2std st2e 4s5te. 2stea 4stechn s2ted 4stee 3s2teg ste2gr 3s4teh s2te2i 3steig 4steil 3steilh stei4na 1s2tel 2stel. stel4l3ä 2steln 2stels 2stem 4stem. ste4mar 4sten s5ten. s4t3ends s4t3engl st4ens s4t3entf s2tep 2ster 6s5ter. ste6rers 4sterm 3sternc 4stes s4t3ese stes6se. ste4st 2stet s4teti 3s4tett 3s2teu 1steue 4steuf st3ev 4stex 2stf 2stg 4sth s4thä s4thi s2t3ho s2thu 2stia 2stib s2tic sti2e 2stie. s2tieg s2tiel 2stien 3s2tif 2stig 2stik s2til 3s4tim s4tinf s3tinn st1ins 2stio 1s2ti2r 2stis st1i4so 1stitu 2stiv 2stj 2stk 4stl 4stm 2stn s2to 2sto. s3tob 2sto3d 4stod. 1stof s4toff s4t3om 4ston 4stoo 2stopo 2stor. 2store 2storg 2stori s3tort 2stose sto3s2t 1stoß 4stote 4stou 2stow 2stoz 1stö 2stöch 2stöt 2stp 2stq s2tr 2strad 2strag 1s4trah 4strai 4strak 2stral 4strans 3s4tras 5straß 4straum 4s5träg 4sträne 4s5tref 4streib 5st4reif st3renn 2s4trig 1s4tri2k 2s5tris st3roll stro4ma 1stru 2strua 2strug 3struk 4st3run 2strup 2s4t3s4 2st3t4 st2u 1stub 4stuc 3s4tud 2stue 3stuf 3stuh 2stum2s stum4sc 2stumt stu2n 2stun. 3s4tund s2t3uni 4stunn 2s3tuns 2stunt stu3re st3url 2sturn 2st3urt 2s3tus 1stü 2stüch 2stür. 2stüre 2stürg 2stürs 3stüt 2stv 2stw 3s2tyl 4st3z 1su su1an 3su2b3 su4ba2 4subi 3su1c su2cha such4st 2s1u2f 2s1uh su1is su1it. sul2a sul2i sult2 su2mar su2mau 3s2ume su2mel su6m5ents s3umfe 3summ sum1o2 su2mor s3umsa s3umst su2n 3sun. sun6derh su4ne s1unf 2s1uni 4sunt 3s2up sup3p su2ra 2s1url s1urt s4u2s1 su3sa su3sh su3si sus3s 3suv 1sü 2sü4b 3süc sü2d1 süden2 3sün 4s3v 2s1w s3wa s3we sweh2 4swie 4swil 1s4y syl1 sy4n3 2s1z 4s3za 4s3zei s2zena 3s4zene 4szent s2zes 4s3zet s2zis sz2o 4s3zu s3zü 4s3zw 2ß1a2 2ß1b2 2ß1c 2ß1d 1ße 2ß1ec 2ß1e2g 2ß1ei ße2l1a ßen3g ße2ni ße2no ße2ro ß2ers. 2ßerse ßer3t 2ß1f 2ß3g2 ßge2bl 2ß1h 1ßi ßi2g1a2 ßig4s 2ß1in ß1j 2ß1k4 2ß1l ßler3 2ß1m 2ß1n2 ß1o2 ßos2 2ß1p2 2ß3r2 2ß1s2 ßst2 2ß1t 1ßu 2ß1um 2ß1ü 2ß1v 2ß1w 2ß1z 1ta 3ta. 4taa 5taan 4tab. ta2b1an 2t1abb 3tabel 2taben ta4bend 2tabf 2tabg 2tabh 2tabk 3table 2t3abn ta2br 4tabs 2t3abt ta2bü 2tabw 2tabz 2t1ac 3tacu t1ada tadi3 2t1a2dr ta3d2s 3taf. 3taf2e 4taff t1afg t1af4r 3t2ag ta2ga2 ta2g1ei 4t3a4gent 4ta3gl t3ago tag4st tah2 tah3le tahl3sk ta3i2k tai2l ta1ins tai4r ta1ir. t1a2ka ta2kro tak6ta 3taktb 3t2aktu 2takz 3t2al. ta2la ta3lag ta3lak tal3d 3t4ale ta4lens tal2lö 3talo ta2l1op 2talt 2tam 3tame ta2mer ta2mi t1ampl t1amt 3tan. t1a2na 2tanb 4t2and ta3ne 4tanf 2tang 3tani t2ank t3ankl 4tanl 2t1anme 4t1anna t2ano t1ans 3t2ans. 4t3ansi 4t3ansp ta2nu 2tanwa 2tanwä t2anz. t1anza tan6zerh t1anzu ta3or ta2pe. ta2pes 2tapf ta2pl 2tarb ta4rens ta4r3ere 3t4a3ri 4tark 2t1arm 2tart t1arti tar2to ta2ru 2t1arz 3tas ta3sa 4t1asp ta2ta2b ta2tan ta2tau tat3ei ta2tem ta2t3er ta2th tat3he t3atl t4atm ta2tom 4tatue ta2t1um 2t1auf 4taufg tau3f4li 4taufn t1auk 3taum t1ausb 3tausc tau6schr tau6schw t2ause 4t3ausg t1ausk 4tausl 4t3auss 4t1ausw 3tav 3tax taxi1s 1tä 4täb tä1c 4täd 3täe 3täg 4tägy 2täh 2t1ält 4täm t1ämt t1ängs 3tänz t1äp t2är. tä2ru tä2s t2ät 4tätt 2täuß 2täx 1tà 4t3b2 tbe3r2e tblock5e tblocken8 4t1c t3cha t3che tch2i tch3l t2chu tch1w t4ck t3cl t3cr 4t3d4 tdun2 1te 3te. te2a2 2teak te3al te3an 3teba 3t4ebb 4t1e2ben t2ech te3cha 3techn 2teck teck2e te2cki te1em te2en3 te1erw te2es 2teff teg3re 2teh 3teha 3tehä 3t2ei. t2eie t3eifr teik4 3teil 4teilhe 2t1ein tein3e4c t3einge t3einla 4teinn t3eis. t3eisb 5tel. 3tela te2l3ab te2l1ac te2l1au telb4 3te3le tel1eb tele4be te4l1ec te4l1eh te4lein 2telem tel1en te4lerd te4leu 4t3elf. 3telg te2l1in te2lit 3telk tell2e 5teln te4lost te2l1ö 3telp 5tels tel3s2k 3telt4 tel3ta tel3th 3tem. te2m1ei te2min 2temme te2m1o2r 3temper 2tempf tem3s te4m1u 3ten t6en. ten3a tena2b te4na2d te4na4g te4nas te4nau te2nä t4enb ten3da 4t3endf t6endi 4t1endl t6endo 4t3endp ten3d4r te2n1e2b te2nef te3n4ei. ten3eid ten3ens 4tenerg te2net ten3g 4t1eng. ten4gla t4enh te2ni te4n3in t4enj t4enm ten3n tens2e 4tensem t4enta t3entb 4tentd t4ente 4tentn tent3ri 4t3entw 4t3entz ten6zerh ten3zw t3e2pi 3t4er. tera2b te1raf ter3am te3ran. 4terbs 4terbt 3terc 4t3erde. te2re2b te4r3eif te2rel ter3end te4reng te4rerk terer4z 4terfol t4erfr 4terfül 3ter3g2 6tergrei t6ergru t4eri te3ria 4terklä 2t1erlö ter4mer 3termi ter4n3ar 2ternc t3erneu t4ero t3erö ter4re. t4ers. t6erscha ter4ser terst4 t4erst. t4ersti t4erstu tert2 teru2 te4r1uf ter4wäh 6terwerb ter3za 2t3erzb 3tes tesa2c te2san tesä2c te2sel te2spr tes3s2 t2est tes3tan test3ei tes6ter6g tes6terk testes4 te2su 3tet2 t2et. te2tat 4teth 4tetl teu3ere teu3eri 3teuf 3teum te1un 3teur. teu2r3a te2vi te1xa 2t3e2xe 2t1e2xi 4texp 3text 2t1exz 4t1f4 tfi2l 4t1g2 tger2 t1h 4th. 2th4a 3t4ha. t2hag t3hai t2hak 3thal. 4t3hau 2t3hä th2e 1t2he. 3thea 2theb t2hec 2t3hei t4hein t2hek t2hem 1then t4hene t4heni 3theo 2therr t2hes 3these t2heu 1thi t2hik 2t3hil 2t3him 2thk 4th3l 4th3m 2th3n 1t2ho 2t3hoc t3hof 2t3hoh t4hol. t3hor 2t3hot thou2 4t3hö 2thp 1th2r2 4thrin. 4thrins 2ths 2thub 4thun 2thü 2thv t2hy 1ti ti2ad ti3a2m 3tib4 ti1ce tiden2 ti4dend ti2deo 3tief. tieg4 2tieh ti1el ti3e4n3 3ti2er tie4rec ti1et ti1eu 3tif. ti1fr 4tift 3tig ti4gerz 3tik ti2kam ti2kar ti3k2er ti2kin ti2krä ti2lar ti2lau ti2lei ti2lel 3tilg ti2lö til3s tilt4 ti2lu ti2ma2g t2imi tim2m1a 4t1imp 3t2in. ti3na t1inb 4t1ind ti3n2e t1inf tin2g1a ting3l ting3s t1in1it 2t1inj tin2k1l 3t2ins. 4t1inse 2t1int ti1nu 4t1inv 3tio ti3or 3tip ti3pl ti4que. ti1rh 3tis ti4scha tisch3w ti2sei ti2sp ti1sta 3ti3t2e 2ti3tu tium2 3tiv ti2van tive3 ti2vel ti4v3erl ti2v1o ti2v3r ti2za 2t1j 4t3k4 4t3l tl4e tle2r3a 6t5li tlung4 4t3m2 tmal2 tmen6t3 tmo4des 4t5n4 tnes2 tnes4s 1to 3to. to4as to5at 4tobj tob2l to1c 3tocht to6ckent 3tod tode2 4to2d1er to4d1u toi4r 3tok to3la 3tole 4tolz tom1e2 to2men 2tomg 3ton to2nau 3too to2pak to2pat 3topo 2topt 3tor. to1ra to2rau to4rän 4torc t1ord 3tore to2rel to3ren t1org t3orga 3torin tor3int to2rö 3tors t1ort. to2ru t2orw to3sc 3tose to4sk tos2p 4toss 3tost4 to1sta 4toß 3to3te to2tho 3totr tots2 3t4ou touil4 to3un 3tow 2tö 3töch 4töf 4t1ök tö4l 3tön t1öst 4töß 3töt 4t3p2 tpf4 2t1q 1t2r4 2tr. 5tra. 3trac tra3cha 4tract t3rad. tra4dem tra4far 3trag 6trahm 5t4rai 3trak 3tral 3t4ran. 2trand 3trank t3rann 3trans t3rase t3rasi 4traß 5träc 3träg 3träne 4träs 4träß 4t5re. tre4ale 4treb tre2br 4trec t3rech t4reck 6t3red 5t4ree 3tref 4trefe 4trefo 4treg t4rei. 3t4reib 4treic 2treif t3reig 2t3reih t3rein t3reis 6treit t3reiz 2trek 6t3rel t4rem t4ren. 3trend 4trendi t3rent 2trepe 2trepo t4repr t4rer t4res. t4ret tre2t3r t4reu 3treuh t3rev 2trez 5t4ré 2t3rh 3tri 4tric 2trid 5trieb tri4er 5trigg t3rind 4tring tri3ni 4trinn t4rip 4tript tri2x trizi1 3tro. 3troe 3t4roi tro2ke 4trom. tro2mi 4troml 3tron 2t3roo t4rop 3tropf 3troy t3röc 2tröh 3trös 2t3röt 3trua 4truk trum2 trums1 2trund 3t4runk 5t4rup tru2th t4rüb trü1be trü1bu 2t3rüc trücker6 t4rüg try1 2ts 4ts. t4sa4b t3s2ac ts1ad t2s1ah ts1al t4s1amt4 t2san t4s3ar ts1as t2sau t2s1än t3s2cha t4schar t3sch2e t4schef ts4chem tsch4li t4schro ts4cor t2s1e2b t3seil t4seind ts1em tse2n1 t2s1eng t2s1ent t2s1er t4s3esse t2s1i2d ts1ini t2s1ir ts3kr t1slal ts1o tso2r t3sou t2sö t3spal ts1par ts4pare t2spä ts2ped t3spek t2sph t3s2pi t2spo t3s2pon t3s2por t4sprei ts3s4 t1st4 t4stag ts3tak ts4tal ts3täti t2s3tep t3s4tero t2stip t4stit ts3toc ts3tor ts3trad t4stran ts3trau t2s3trä t4streu t2stri t4strop t2s3trü ts2tu t2s1u 1tsub t3sy 4t1t tt1ab tta2be tt2ac t2t1ad tta6gess tt1ak tt2al tt2ant tt1art tta1s tt1ebe tt1eif tt1eis t3tel tte2la tte4leb tte4len ttel1o ttes1 tte2sa tte2sä t4teti tt2häu t2t3ho t3ti t3to tto1s t3tö t3tro tt3ru tt3rü tt2sen tt2sor tts1p tt2spe tt2spr tt2sti ttt4 t3tu tt2un t3tü 1tu tu1alm tu3an 2tub 3tuc tu2chi 2tud 3tue 4tuf tuf2e tu3fen t3u2fer tuff3 2tuh 2tuk t3u2kr tul2a t2um. 3t2ume 2t3umf 2t3umg 2t3umk 2t3umr tum2si tum2so tums5tr 2t3umt 2t3umz 3tun. 2t1una 2t1und 3tune 2t3unf 3tung t3unga tung4s5 2tunif 2t1u2nio 2t3unt t1up. tu2r1a4g tu2rä tur1c tu2re. tu2rei tu2r1er tu2res tu2r1e4t turin1 3turn tu2ro tu4ru tu2sa tu4schl tu2so tu3ta 2tü 4tüb 3tüch tück2s 3tüf 3tüm 3tür. tür1c 3türe 3türg 3tür3s 3tüten 4tütz 4t3v 4t3w twa2 twi4e 1ty1 3typ ty2pa tys4 4t1z t2za4 tz1ag tz1al tz1ar tz1au tz1ä t3ze. t2z1e2c t2z1eie t2z1eis tze4n1 tz2ene tz3ents tz1erl tz2ers t3ze2s tzgel2 tz1ind tz1int t2zor tz2ö tz2th tz2tin tz1wä tz1wi tz1wu 2ua u1a2b u1a2c uad4r u1al. ua2lau u1alb u3alet u1alf u3a2lo u1alr u1als u1alt ua2lu u1am u1ans u3ar. uara2b u1ars ua3sa ua2th uat2i u3au u1ay u1äm u1äu 2u1b u2be2c u3b4i ubi3os. ub2l ub3lic u2b3lu u2bop ub1r ub3rä u2b3rit ub2san ub2s1o ub2spa u2büb 2uc uc1c u1ce uch1a u1cha. uch1ä u1che u2ch1e4c uch1ei u3ches u1chi uch1il uch1in uch3l uch3m uch3n u2ch3r uch2so uch4spr uchst4 uch4tor uch2t3r u1chu uch3ü uch1w u1ci u2ckem u4ckent u3ck2er u2cki u1cl 2u1d u3d2a uden3s2 uder2e udi3en uditi4 u2don ud3ra u3dru 2u1e ue2ck u2ed ue2en u2eg u2ela ue2le ueli4 ue2mi uen1 ue2nä ue2ner uenge4 ue2ni ue2no uen2zu u2ep ue2r3a ue2r1ä u2ere u3ereh ue3reig u3erer ue4rerg ue4rerk u3erex uer3g2 u4erinn u3erin4t uer2ne uer4ner uern3s4t ue2r3o u3err uer3sc uer3t2 u3erum u3erunf u3erunt ue2ta ue4tek u3fah uf1ak uf3ar u3fas uf1au u2f1äs u2f1ä2ß u2f1ei u2f1em u3fen. u2fent u2f1erh u4ferle uf2ern 2uff uff4l uf2fro uffs4 uf3l u2fob ufo2r uf1ori uf3r uf3sä uf4sin uf4so uf2spo ufs3tem uf2t1eb uft3s2 u2fum 2u1g u4gabte ug1af ug1ak u2g1ap uga4s ug1au ug3d2 u2g1ei u2g1erf u2g1erl ugge4st ug3hu u2g1l ug3lad ug3lo u3g2lö u4glu u2g3n ugo3 ug1or u2gö u4g3reis ug3ro ug3rüs ug3se ug4ser ug3si ug3spa ug4spr ug4spu ug5stä ug3str ug3stü u2gü u1h 2uh. uhe3s6 uh1la uh1lä uh2li uhme4 uhr1a uh2rer uh3ri uh4rin uhrt4 uh2ru uh4rü uh1w 2ui ui2ch u1ie ui1em u3ig u4ige u1in. u3isch. u3ischs uisi4n ui4s5t u1j uk2a u3käu u1ke u1ki u1k2l ukle1i uk4n uk2ö u1k4r uk2ta uk2t1in uk2t3r u1ku uku2s u1l ul1ab ul1am ula2s ul1äm ulb4 ul2dr uld2se u2l1el ule4n ul1erf ul1erh ul1erw ule2sa ule2t ul1eta u2lex ul3f4 ulg4 uli2k ul1ins ul3ka ul2kn ull2a ul2les ull3s ulm3ein ulo2i ul1or ul2p1h ul2sa ul4sam uls2th uls3z 2ulta ul3th ul4tri ult3s u2lü ul2vr ulz2w u2m3a2k um1all um1anz u2m1art u2m1aus u2maut 1um3d2 um2en ument4s umer2a u2m1erg u2m1erl u2m1erw 1umf 1umg um1ins um1ir 1umk 1um3l 4umm umm2a umpf4li um2p3le 1umr 3umsat um4ser um2sim um2s1pe um2su um3t2 um2un u2m1ur 1umz un1 4un. 2una. 1unab un3ac un4al u3n2am u2n3an 2un2as un3at 1unda un4dab 1undd un4dei un4d3erf und5erha 1undf 2undg un2did 1undn un2dor un2d3r 4unds. und3sp und3st un2d1um 1undv 1undz u3ne une2b une2h un2ei. un3ein unen2t un4es4 1unget 1ungew ung5h 1unglü un2g1r ung3ra ung3ri ung4sa un2id un3ide 1u2nif unik4 un2im uni2r 2unis un3isl u3n2it 3u2niv 2unk un2k1a2 un2kei unks2 unk4tit unk2t3r 3unku unna2 un2n3ad un3n2e uno4r un2os 1unr uns2 2uns. un3se 1unsi un3sk un3sp uns4t1r 1unt un3ta unte4ri un3tr unt3s 2untu unvol2 unvoll3 1unw 2unz 2uo u1o2b u3of u3or. u1or3c u3ors uos2 u1os. uote2 u1pa u1pe2 uper1 up2fa u2pf2e u2pf1i u3pi up2pl up2pr u1pr up4t3a2 upt3erg upt1o up4tr u1q 2ur. u1ra u2rab u3raba ura2be u2r3a2m u2r1ana ur2anb u2r1ang ur2anh u2r1an5s u2rar ur3a4ren u2r3att u2r1au 2u1rä ur1än ur3b2a urch1 urd2 ur3di 2ure ur1eff u2rele ure4n u4r1ep ur1erh ur1erw 2urf urf3t ur2gri urgros4 urg3s4 uri2c ur1im ur1ini ur3ins ur1int u2rinv urk2s 1urlau 4u1ro u3rol uro1s u1rö ur3p ur3sac ur2san ur2sau ur2ser ur4sin urst4r ur4sw ur3s2ze urt2 u3ru urü2 ur2za ur2zä ur2zi ur2zo ur2z1w 2us u4saf us4ann u6schent usch5wer u2s1ec u2s1ei u3seid u3sep use1ra u2serp u2s1ese usi3er. usi5ers. us3kl u4sko us3oc u3soh u2s1op us1ou us3part u2s1pas u2spat us1pe u3s2pek us1pic u5s4piz u2spo us2por u2spu us4sez us2sof ust3abe u1stal us3tau us2th ust2in us3tr u5stras us6tris u1stu u2stun u2stur us2ur u2sü 2u1ß 2u1t ut1alt ut3a2m u2t1ap u2t1ar u2tär u3te ut1eg ute4ge ute2n1 u2tent uter4er u4t3ersa ut2es ut2et u4tev u4t1ex utfi4 ut2he u2thi u2t3ho u2thu uto1 uto4ber uto3c ut1opf u2tops ut4or utos4 u3tö ut3rea ut3rü ut3s2a ut2s1ä ut4schl ut4schm ut4schö ut2spa ut3te ut5t4l utts2 utu4re utu5ru u3tü utz3eng ut2zin ut2zo ut2z1w 2u1u2 uufe2 u1ü2 2u1v4 u2ve. uve3rä u1w 2u1x ux2e ux2o ux3t u1ya 2u1z uz1we uz3z4 1üb 2übc 2übd übe2 übe3c über3 üb3l üb3r üb2s3t 2üc ü1che üch3l üch2s1c ücht4e ü3cken ück1er ück3eri ü4ckers ück4spe 2üd üd3a4 ü3den. üden4g ü3d2ens üd1o4 üd3r üd3s2 üdsa1 üd3t4 üdwes2 ü2f1a ü2f1ei üfer2 ü2f1erg üf2fl ü2f1i üf3l üf2to ü1g üge6leis ü2g3l ü2gn üg3s üg4st üh1a ü1he ü2h1ei ü2h1eng ü2h1erk ü2h1erz üh1i ühla2 ühl1ac ühl2e üh3mo üh3ne ühn2s üh3r2e ühr3ei. üh1ro ühr3ta üh1s ühs2p üh3t üh4th ü1hu üh1w ü1k ül1a ül2c ül4e ül2la ül2l1ei ül2lo ül2lö ü1lu ü2ment 2ün ü2n1a ün2da ün2dr ünd3s ünen3 ün2fa ün2f1ei ün2fli ün2fr ün2g3l ünn2s ün2s ün3sc ün3se ün3sp ün3str ünt2 ü1nu ün2za ü1pe ü1pi üp2pl ür1a ü2r1ei ür2fl ür2fr ür4g3en4g ü3r2o1 ürr2 ür2s ür3sc ür3se ür3sp ürt2h üs2a ü2schl üse3h üse3l üse1s üs2s1c üss2e üs2st ü2st üste3ne ü1ß 2üt ü2t1al ü2t3r üt2s1 üt2tr ü1v ü1z 2v1ab va1c val2s 2vang 2varb va1s v4at va2t3a4 va2tei va2t3h vatik2 va4t1in vati8ons. va2t3r vat3s4 va2t1u 2v1au 2v1b 2v1d 1ve2 ve3ar ve3b ve3c ve3d ve3g ve3h ve4i veit4 veits3 ve3la ve4l1au ve3le ve3li ve3lo ve3ma ve3mu ve3nal ven2c ve3ne venen4d ve3ni ve3nö ve3o ver1 ver3a ve3rad ve3rand ve3ras ver3b2 verd2 vere2 ve4rek verf4 verg4 ve3ri ve4rin ver3k ver3st vert2 ver5te ver3u ves1 2ve3sc 2ve3s2e ves3ti ve3ta vete1 ve3tr 2veü ve3v ve3x2 2v1f4 2v1g 2v1h vi3ar vi4a3t vi2c vid3s2t vie2h3a vi2el vi2er vie4rec vie2w1 vig2 2vii vi2l1a vi4leh vi2l1in 2v1i2m vima2 vi4na vin2s 2v1int vi3sa vise4 vi3s2o vi2sp vis2u 2v1k 2v1l2 2v1m 2v1n 2v1ob vo3ga vo2gu 3vol voll1a vollen4 vol6l5end vol2li 2v1op vo2r1 vor3a vor3d vor3e vor3g vo3ri vormen4 3voy vö2c 2v1p v2r 2v3ra v3re v4ree 2v3ro 2vs vs2e v1sta v1steu v3s2z 2v3t vu2et 2vumf 2v1v 2v1w 2v1z w2a 1waa wab2bl wa3che wach6stu wach4t4r waffe2 waffel3 1wag wa5ge wa2g3n wa3go 1wah wahl5ent wah4ler wah2li wai2b 1wal 2walb wal4da 2walm wal2ta wal2to walt4st wa3na wandels6 wang4s wa2p 1war2e ware1i war3ste wart4e 1was wa3sa wa4scha wa3se wa3sh wass4e w2ä 1wäh 1wäl 2wäng 1wäs wäs2c wä3sche 2w1b2 wbu2 2w1c 2w1d we2a we2ba 4webeb we2bl web3s we3cke. we5cken. we3ckes we2e4 weed3 we2fl 1weg we2g1a we2g3l we2g3r weg3s4 1weh we2i wei4bl 2weie weik4 weis4s3p wei3str wei4tr wel6schl wel6schr wel2t1 wel4t3a4 wel6t5en6d wel4tr wen3a4 we3ni wen4k3ri we2r3a wer2bl 1werbu werd2 5werdens 1werdu werer2 wer2fl wer4gel we4r3io 1werk. wer2ka 1werke wer2kl wer2ku we2rö wer2s wer2ta wer6t5erm wer2to 1werts 1wese we2s1p we4st west1a west3ei wes2th west1o2 west3r wes4tu 1wet wet2s wett3s 2w1ey 2w1g 2w3h wi3cka 1wid wi2e wie3l wien2e wie2st wik2 1wil wim2ma wim4m3u win4d3e4c win2dr win2e 2wing win8n7ersc 1wi4r wi3s2e wi2sp 1wiss wi3th 1witzl 2w1k 2w1l 2w1m 2wn wn3s 1wo1c wo2cha woche4 1woh woh2le 1wolf wolf4s3 wol4ler wor3a wo2r3i wor2t3r wo4r3u wot2 1wöc wört2h 2w1p w2r w3ro 2w1s w3s2k ws2t 2w1t wti2 w2u 1wuc wul2 wul3se wun2s 4wur. wur2fa wur2s 1wurst wus2 wus3te 1wu4t1 1wüh wül2 wün3 2w1w x1a 1xa. 2xa2b 1x2ad 1xae xa1fl 1x2ag x3a2m x2anz 1x2as 2x1b 2xc x1ce x1ch x1cl 4x1d 1xe x1e4g 2xek xe2l xe3lei x1em 3x2em. x2en xen3s2 x2er. x2ere xers2 3xes 2x3eu 2x1f 2x1g 2x1h xib4 xi1c xich2 xide2 xi2d1em x1i2do xie3l xi3g xil1 xil2a xi2lo xi2lu xin3s2 x2is1 xis2c xi2se xi2so2 xis3s xis4tä xi2su x1i2tu x1j 2x1k2 2x2l2 x3lä x3le 2x1m 2x1n x1or 4x1p xpor6ter x1q 2x1r 2x3s2 4x1t x2t1a xt2as xt1ä x2tän xtblo4 x2t1e2d x2t1ei x4tent x2t1er2f x2t3ev xtfi4 x2t1il2l xtra3b4 x2t3ran xt3s2 xt1u x3tur 1xu xu1a x1u2n xu2s 2xv 2x1w 2xy 3xy. 3xys x1z 2y1ab 1yac y1al. y1a2m yan2g y1ank y1ät y1b y1c2 y2chi y3chis ych3n y1d4 y1e y2ef yen4n y2ere y2es. yes2p ye2th y1f2 y1g ygi2 ygie5 yg2l y1h yhr2 y1i4 y1j y1k2 yke3n yk3s2 y1l y2l3a2m yl4ante yl3c y4le. yli4n yloni1 yl3s2 y2l1u yma4t ym3p4 ympi1 y2n1o yno4d ynt2 y1nu y1of yom2 yon4i y1ont y1ou y1p ypa2 yp3an ype2 y2pf y3ph y2p1in ypo3 y4p3s y1r y3r2e y3ri yri2a yri1e y3r4o yrr2 ys2an y3s2c yse1 y3s2h y4s3l ysme3 ys2po ys1pr ys3t4 y1s4ty y2s1u2 y3s2z y1t2 y2te. y2tes y3to1 yu2r yure3 y1v y1w y1y y1z2 2z3a2b zab3l za1c z1a2d za3de 2z1af za3gr 3zah 2z3a2k zale3 2z1all 2z1am 3zambiq z1an za2na 2z3anf 3zani 2z3anl 2zarb 2zarc z1arm z1arti zar2tr 2z1arz z1as za1st4 2z3at3 3zaub z1au2f z3aug 3zaun zä2 2z1äc 3z2äh 2z1äm z1ärg z1ärm 4z3b4 zbü1b zbübe3 2z3c 2z3d2 zdan2 zdä1 2z1e2ben 2zecho 2z1eck ze1e 2z1eff zeik4 zei3la zeile4 2z1ein zei3s4 zeist4 zei2t1a zeit5end zei4t3er zei2tr ze2l1a2 ze2len ze2l1er ze2l1in zell2a zel3sz zel3t2h zelu2 2z1emp 5zen. ze4n3ac zen3n ze2no zens2e zen4sem 3zent zent3s zen4zer z2er. ze2r3a ze2re2b 2z1ergä 4z3ergeb z3erhal 2zerhö zerin4t zerk2 z2erl. 2zerlö z2ern zer4neb zer4n3ei ze2ro 2z1erq zers2 2z1ersa 4z3erste zert1a4 zer4t3ag zert4an zer6tere zer4tin zer6t5rau 4zerwei 2z1erz 3z2erza ze2sä ze3sc zes1e zes1i ze3sku ze2sp zessen4 zes6s5end zes2sp zes2st ze2s3t ze3sta ze2tr 2zetts 2z1ex 2z1f4 2z1g2 zger2a 2z1h z2hen zhir3 zi3alo zi3ar zid3r zi1erh ziers1 zi1es. zil2e 2z1imp zin2e zin4er 2z1inf 2z1inh zin1it zin2sa zin4ser 4zinsuf 2z1inv zi2o3 zi3op zirk2 zirk6s zi3s2z zi1t2h 2z1j 2z3k4 2z1l2 2z1m2 zme2e 2z3n4 2z1ob 2z1of zo2gl 2z1oh 3zol zon4ter zo2o 2zope z1or zo2ri zor4ne 2z1osz 2z3ot 2zö2f z1öl 2z3p4 2z1q 2z3r2 4z1s2 z3sa z3sh z3sk z3sz 2z1t z2t1au z4tehe z3t2her zt3ho zt1ins z3tö zt3rec zt3s2 z3tü zu1 zu3a zub4 zu4ch zu3cke zud4 zudi4 zu2el zu3f4 zu2g1ar zu4gent zu3gl zug1un 2z1uhr zu3k 2z1um. zumen2 2zumf 2zumg 2zuml 2z1ums zun2e zung4 2zunt zup2fi zu3r2a z1urk 2z1url 2z1urs 2z1urt zu3s4 zu5t2 zuz2 2züb zür1c 2z1v zw2 z1wac 4zwah zwan2d1 z2wang z1war 2zwas 4zwäl 2zweg z2weig z1weis 2z1wel 2z1wen 2z1wer z2werg 2z1wes 2zwet 4zwir z2wit 2z1wo z1wör z1wur 2z1wü 4z1z z3z4a zzi1s4 z3z2o zz2ö",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=14211,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-de.rme b/Master/texmf-dist/tex/context/patterns/lang-de.rme
index ac6e14344b8..2fa886b6b0c 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-de.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-de.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+German Hyphenation Patterns (Reformed Orthography)
+
+(more info about the licence to be added later)
+
% dehyphn-x-2009-06-19.pat
\message{German Hyphenation Patterns (Reformed Orthography, 2006) `dehyphn-x' 2009-06-19 (WL)}
@@ -29,3 +33,4 @@
% 6 6 | 2 7 | 1 6 1
% 7 7 | 2 13 | 1 4 1
% 8 8 | 2 13 | 1 8 1
+
diff --git a/Master/texmf-dist/tex/context/patterns/lang-deo.lua b/Master/texmf-dist/tex/context/patterns/lang-deo.lua
new file mode 100644
index 00000000000..c20f09c17d3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-deo.lua
@@ -0,0 +1,53 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="deo",
+ ["source"]="hyph-de-1901",
+ ["texcomment"]="% German Hyphenation Patterns (Traditional Orthography)\
+% \
+% (more info about the licence to be added later)\
+% \
+% dehypht-x-2009-06-19.pat\
+% \
+% \\message{German Hyphenation Patterns (Traditional Orthography) `dehypht-x' 2009-06-19 (WL)}\
+% \
+% TeX-Trennmuster für die traditionelle deutsche Rechtschreibung\
+%\
+%\
+% Copyright (C) 2008 Werner Lemberg <wl@gnu.org>\
+%\
+% This program can be redistributed and/or modified under the terms\
+% of the LaTeX Project Public License Distributed from CTAN\
+% archives in directory macros/latex/base/lppl.txt; either\
+% version 1 of the License, or any later version.\
+%\
+%\
+% The word list is available from\
+%\
+% http://repo.or.cz/w/wortliste.git?a=commit;h=e4826ce7db99bceb6043be48983ff2b67d56669f\
+%\
+% The used patgen parameters are\
+%\
+% 1 1 | 2 5 | 1 1 1\
+% 2 2 | 2 5 | 1 2 1\
+% 3 3 | 2 6 | 1 1 1\
+% 4 4 | 2 6 | 1 4 1\
+% 5 5 | 2 7 | 1 1 1\
+% 6 6 | 2 7 | 1 6 1\
+% 7 7 | 2 13 | 1 4 1\
+% 8 8 | 2 13 | 1 8 1\
+% \
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyzßàáâäçèéêëíñóôöü",
+ ["data"]=".ab1a .ab3l .abo2 .ab3ol .ab1or .ack2 .ag4n .ag4r .ag2u .ai2s .akt2a .al3br .al2e .al5l4en .al4tei .alt3s .ampe4 .amt4s1 .an3d2 .anden6k .and4ri .ang2 .an3gli .ang4s2 .angst3 .an3s .an4si. .ans2p .an4tag .an3th .aps2 .ari1e .ark2a .ar4m3ac .ar2sc .ar4t3ei .as6sest .as2t .ata1 .at4h .au3d .au2f3 .aufs2 .au2s1 .ausch3 .au6stes .ax2 .äm3 .ät2s .äu3 .be3erb .bei6ge. .be3ra .be3r2e .berg3a .ber6gab .ber4g3r .boge2 .bo4s3k .bu4ser .bus5sen .bu7sser. .ch2 .dab4 .da2r1 .da4rin .darm1 .da4te. .da4tes .de2al .de1i .de4in. .de1o2 .de3r4en .derma3 .dermas6 .de3sk .dien2 .do2mo .do1pe .dorf1 .dü1b .ebe2r1 .ehe1i .ei3e2 .ei4na .einbus6 .einen6g .ei2sp .ei2s1t .ei2tr .eke2 .el2bi .em3m2 .en1 .en4d3er .en5der. .en2d3r .enn2 .en2t3 .epi1 .er8brecht .er2da .er4dan .er4dar .er4dei .er4der .er1e .ere3c .erf4 .er1i .ers2 .er8stein .er8sterb .er8stritt. .er8stritten. .er4zen4 .es1p .es2st .es2t .est4e .est2h .et2s .eu1 .eu3g4 .eu3t .eve4r .ext4 .fä4s .fe2i .fer4no .fe4sta .fi4le. .fi4len .fi2s .flö8s7se. .flö8s7sen. .flö8sses .fs4 .fu2sc .ga2t .gd2 .ge5nar .ge3ne .ge3r2a .ge3r2e .ge3s4 .get4 .ge3u .grif8fes .guss1 .haft3s .hal2s .hau2t1 .he2 .he3fe .her3an .he3ri .he6r5inn .ho4met .ia2 .im2a .ima4ge .im5m .in1 .in3e .ink4 .inn2e .int6 .inu1 .ire3 .is2a .jor3 .ka2b5l .ka2i .kamp2 .ka4t3io .ken6num .ker3s .ki4e .kle2i .kopf1 .ks2 .kus2 .le4ar .li2f .lo4g3in .lo3ver .lö4s3s .lu4str .ma3d .ma2i .ma3la .ma4str .md2 .me2e .mel2a .men8schl .men8schw .men3t4 .mi2t .mm2 .näs5c .ni4e .nob4 .no2c .no2s .no4th .nul2 .nus2 .ob1a .obe2 .ohr5s .om2a .oper4 .or2a .ort2 .orts3e .ort4st .oste2 .ost5end .osten8de .oste6re .ost3r .ozo4 .pa4r1e .par3t4h .pf4 .ph4 .poka2 .po4str .ps2 .ra4s3s .reb3s2 .re3cha .rein4t .reli1 .reli3e .ri2as .richt6e .ro4a .ro3m4a .rö2s1c .ru5s6ses .rü1b .rücker6 .rü4ss .sali1 .sas2 .sa5sse .säs4 .sä5ss .sch4 .sen3s .ser2u .se2t1 .sha2 .sim3p4 .si2te .ski1e .spas4 .spä5s4 .spiege8lei .st4 .sto4re .sucher6 .tal2e .tan4k3l .ta2to .te2e .te2f .te3no .th4 .ti2a .tid1 .ti2s .tite4 .to4nin .to4pl .to2w .tras3 .tra4ss .tri3e4s .ts2 .tu3ri .uf2e2 .ufer1 .ul4mei .um3 .umo2 .un3a2 .un3d .un3e .un3g .uni2t .ur1 .ur2i .urin4s .ur3o2m .uro2p .ur3s2 .ut2a .ut3r .übe4 .ve5n2e .vo4r .wah4l .wa2s .weg5s .wei4ta .wi4e .wor2 .wort5en6 .xe3 .ya4l .zeit3s .zi2e .zin4st 2aa a1ab aa2be aa1c aa2gr 4a1a2n 4a2ar aa2r1a aar3f4 aart4 aas1t aat4s1 a3au a1ä a1b 2aba ab1auf ab1ä ab2äu 1abd ab1eb abe1e ab1eil 2abel abe2la 2a3ber ab1erk ab1err ab1erz ab3esse abes2t ab1eß 2abet 2abew 1abf 3abfi 1abg 1abh 2abi ab1ins ab1ir ab1it 1abk ab1l 1a2bla ab5lag 1a2blä 2able ab4le. ab3li ab4lo 3a2blö a2blu abma3s 1abn 2abo a2bo. ab2of 3a2bon ab3r a3bra a4brä 2abrü abs2a 1absc ab3s2i 1ab3sp abs4t4 1absta ab3sz 1abtei 2abu ab1ur 2abü 1abw 2aby 1abz 2ac. 2aca 2ac1c a1cem 2ach. ach1a a1chal ach3au 2achb a1che a2ch1e2c ach1ei a4cherf a4cherk a4cherö a4ch3erw 4achf a1chi ach3l ach3m ach3n a1cho a3cho. ach1o2b ach1or ach3ö ach3r ach3su a4cht acht5erg ach2t1o ach8traum ach8träume. ach8träumen. ach6trit a1chu ach1u2f ach3ü 2achv 4ach1w a1ci ac1in 2ack. ack2en ackmu4 ackmus3 ack2se ack3sl ack3sta4 a1cl a3co acon4n 2acu a1ç a1d 2ada. a3d2ab ad2ag adai4 ad3ama a2d1an 3a4dap a3d2ar3 4adav 1a2dä ad1c 1add 2ade. ade2al adefi4 a2dein 2aden ade1r2a a2deri 4ades2 ade3sp ades6s 2adf 2adh 4a3di adi3en 5adj 2ado ad2ob 2adp 2adq 2ad3rec ad4res ad3ru 2ads2 ad3sz 2ad2t1 2adu 2a1e1 ae2b ae2d ae2i a2ek a2ela a2ele ae2o3 ae2p 3a2er2o a2et a2ew ae2x af1a a2fak a2fan a3far af4at a2fau 2afe a2f1ec a2fent af1erl a2fex af2fl af4flu 2afi 2af3l a2fö af3ra af3rä af3re af3rö af3s2a af2sp af2t1a af2tei af4t3erl af2t3r aft5re af2tur a2f3ur a1g 2aga ag1ab ag1a2d ag1ar ag1au ag2di ag2dr ag2du age1i age4na age4neb a2gent a4gentu age4ral 2ages age2sa age4sel age4si age2s3p ages5s ag3esse age6stem ag3gl 1aggr 3a2git 2a2gl ag4la a4glö ag2n ag4ne. ag4nu a2g3re a2g3ri ag4ro agsa2 ag4sam ag3sc ags3p ag6spo ag4sti ag2str 2agt ag2th a2gund 2ah. 2a1ha ah4at 2a1he a2h1erh a1h2i ahin3 ahl3a2 ah4l1ei ah4l3erh ah2lö ahl3sz ah4n1a ah2nä ahner4e ahnt2 1ahor ah1o2s a2h3ö ahr1a ah3r2e ahre4s3 ah3ri ahrta4 ahr4tri 2ah2s aht1s a1hu ah1w a1hy 2ai aian3 aid4s aids1t ai1e2 aif2 ai3g4 a3ik. ai3ke ai3ku ai2lo a1ind ain4e a1ing ain3sp ai2sa a3isch. ai3s2e aiso2 aiss2 ais3sen ais5st a3iv. aive3 a3ivl a3ivs a1j 2ak. 1a2k4ad 2akal 2a3kam 2akar ak4at 1a2kaz 2akb 2akc 2akd 4a1ke a2kef aken2n a2keu 2a1ki 2ak3l ak4li 4ako 2a1kr ak3rau 3akro3 2aks ak3sh 2akta 2aktb ak3te ak4tei 2aktik ak2t3r ak3t4ri 2aktst 2a1ku a2kun 4a3kü 1akz a1la 2ala. ala5ch2 al1af ala2g al1age a3lal al1am alami5 al3amp al1ana a2l1ang al1ans al1anz a2lar a3lar. a3lare al2arm al3arr ala2s al1asi al1ass 2alat al1au al3aug a1lä al1äm alb3ein alb3eis al4berh al4b3erw al2b1l alb3li al2boh al2br alb3ru alb3s al2dä al2dr al3du 2ale 3a2l1e2b 3a2l1ef a4l1eh a2l1ei a4l3ein a2l1el alen1 al3ends a2leng ale2p al1epo a2l1erf a2l1erh al1erl 3alerm a2l1ert 3a2lerz a2l1esk ale4t al1eta al1eth a2l1eu a4leur 3a2lex alf4r 3algi al2gli 1algo 2ali ali4ene al2imb ali4nal al1ins a2linv alk1ar 1alkoh alk3s2 al2lab al2l3a4r al2lau al4lec al3lend all5erfa al3les alli5er. alli7ers. al2lob 3almb 2alo a2l1o2b alo2ga al1ope al1orc a2l1ö al2ös 3alpe. 1alph al3skl al4spal al2sum al3sun al2tak alt3eig al3ter al4t3erf al2tö al2tre al2tri alt3ric al2tro alt2se alt4stü a1lu al2uf a2lum al1umb al1ur 4aly alzer4z al2zw 2am. 2am2a amab4 amad2 ama3g 2amä 2ambiq am4e 2ame. a2meb ame2n1 amer2a a2meri ame3ru a4mesh a3met a2mew a3mi. a3mie 2a3mir a3mis ami3t2a ami3ti 2aml am2mac 2ammal am2mei am2min 2amml am4mod am2mus ammu2t a2mö amp2fa2 am3pr 2ams am4schl 1amt. am2t1a am2t1ä am2tel am4t3ern am2tö am2t3r am2tu 2amu 2ana. 2anab ana3c anadi3 a3nak an1alg ana4lin 2anam 2anan 2anas an1äs 1anb 2anbu an3ch 2and. an3dac and4art ande4sc an2dex an2d3rü and4sas and6spas and6s5paß and2su 2andu and1ur 2ane an3ec a3nee an2ei. an3eif an1e4k 3a4n1erb an1eth 1anf 2anfi anft3s an3f2u 4ang. 1anga 3angeb an2g1ei an4g3erf an4g3erl an4g3erz 2angf 2angh 2angie ang1l an2gla 2ango ang1r an2g3ra 4angs. ang3sc ang6s3po 1anh 2a3ni an2id ani5ers. 3a4nim a4nins 2anj 2ank. an2k1an an2kei an3kl an4klö an2k3no ank1r an2k3ra an2k3rä ankt4 an2ky 1anl anma3s2 2anmu 2ann 3an3na 3annä an3n2e an1od a3nol a2n1or a3nos a1nö 1anr 1ansä 1ansc ans2en an2seu 2ansh 2ansk an3skr ans1pa 1anspr ans2te an3s2z 2ant. an2t3a4r 1antá 1antei 3antenn an3t4he 1anthr 2anto anton4 3antr ant3rin an2tro 1antw 2a1nu anu3s a1nü 1anw 2anwet 2anzb 1anzei 2anzes 2anzg an2z1i4n 2anzs 1anzü 2anzw an2zwi 2ao ao1i4 a1op a1or a1os ao3t2 a3ot. a1ö a1p 2ap. 2a3pa 2ape a2pef a3pel a2pé a2pf ap2fa a3pfl a3phä a2pht 2ap3l ap2n a2pot 3appl ap3pu 2apr 2a3pu 2aq 2ar. a1ra a3ra. ar2ab ar3abt ara3d2 a2r3al a3ra3li a2r1ang a2r1ans a2r1anz a2r3app 2a2rar a2r1au a1rä 1arb 2arb. 4arba ar2bau ar2bec 2arben 2arbi ar2bl 2arbr ar2bre 2arbs2 2arbt 2arbu ar2b3un 1ar1c ar2dro 2are a2rea ar1eff a4reg a2reh ar1ehr a2rein a4rek a3ren aren4se are3r2a ar2erf a2r1erh a2reri a2rerl are3u ar2ew 2arf arf1r ar2f3ra ar2gl ar2gn 2arh 2ari ar2ia ari3e4n ari3erd ari3erg ari5ers. ar1im arin3it ar1int a3riu ar2kal ark3amt ar2k1ar ark3aue ark3lag ar2kor ar4kri arks4 ark3sa ark3sh ar2les arm2ä ar4merk ar3m2or ar2nan arn2e 2a1ro ar1ob a2r1o2d a2r1op a2ror 2arr ar2r3ad arre4n3 ar2rh arr3he 2arsa ar4schl arse3 ar3s2h 2arsi ar3t2e ar2the art2i artin2 2arto art3r ar4tram 2arts 2aru ar1uh ar1um a2rü 2arv arwa2 2ary ar2zä 2arze 1arzt ar2z1w as1ala asas2 asa3sse as3au asau2s1 as1ä a2sca a3sche a4schec a3schi asch3la a2schm a3schu 4a3s2e a4seb as3e2m a4sex 4ash a4s3ha as4hi asin2g 2a5sis asi4st a3skop a4s3l a4sn a1so1 as1o2f a3sol as1or as1p as3pan a4s2ph as2pi a4spl as2po a1spu as3s2a ass2e as2s3ei as3sel as3ser asserma6 as3s2i as2s1p as4st ass1ti ass1to as5str as5stu 2asta a3stä a4s3tep as2ter 2astr as4trau a4s2t3rä a2s2t3re a4strol a2stum a3su a4sw aswa2s 3a2syl aße2 aßen3 2a1t at1ab at2a1f at4ag a2t1akt ata3l a3tam at1apf at1au a2taus a2t1ä at2c at2e 4ate. a2teb at3eig a4teli 4aten a2tep ate2ru 4ates atex3 at2h at3ha 4athe1 3athl 4a3ti atingma5 3atm 4atmus ato4man 4ator a2t1ort a2t1ö 4atr atra4t at3rä at3re at3rom at2sa at4schn at2se at4set at2si ats1p at3ta at4tak att3ang at4tau at2tei at3t4hä at2t3rä att3s4 at3tu atu2n atz1er at4zerk at4zerw at2z1i at2zo atz3t2 at2z1w a2u 2au. 2au1a2 2aub au2bli au2blo 4auc auch3ta au2dr 2aue aue2b au3en. au2ere au5erein au2fa auf1an 2aufe. 2aufeh auf1er au4ferk auff4 3aufn 2aug 4augeh au3ha 4au1i au2is 2auj aule2s au3lü 4aum au2mal au2m1o aum3p2 aum3s2 4aun au3n4a aun2e au2nio au1nu a4unz 2aup2 aup4ter 2au3r2 au2s1ah ausan8ne. au2sau 2ausc au4schm au4scho 1ausd aus3erp au4s3erw 1ausf 1ausg 1ausl au2so au2spr 1ausr auss2 3aussag au3sse aus4se. au8ssende au2sta au4stec auster6m aus3tie aus3tri 1ausü 1ausz au3ß a4ut 2aut. au2t1äu 2aute au4ten4g au4t3erh 3auto 2auts 2auu 2auw 2aux 2auz auz2w 2a1ü 2a1v a3v4a ava3t4 4a3vi a2vr av2s 2a1w awi3 awi1e a1x ax2am ax2e axi2s 2a1ya a1yeu aysi1 ay3t 2a1z az2a3 az2o az2u ä1a ä1b ä5be ä2b3l äb2s ä1che äche1e ächenma5 ächenmas8 ä1chi äch3l ä2chr äch2sp ä1chu äck2e ä1d ä2da ä2d1ia ä2dr äd2s 2ä1e äf2fl äf3l äf3r äf2s äft2 äft4s ä1g ä5ge äge1i ä2g3l äg2n ä2g3r äg4ra äg2s2 äg3sc äg3str 1ä2gy äh1a 2ä3he ä3hi ähl1a ähl2e äh4l3e4be 2ähm äh3ne äh3ri 2äh2s 2äh3t4 ä1hu äh1w ä1im ä1is. ä3isch. ä1isk ä1j ä1k ä2k3l ä2k3r ä1la älbe2 äl2bl ä5le äl2l1a äl2p3 äl4schl ä1lu ämi3en 2äml äm4ma äm2s ämt2e 2än. än5de än2dr 2äne äne2n1 än2f5 2änge än2gl än2gr äng3se 2ä3ni änk2e än2k3l än2kr än3n4e2 2äns än2s1c änse3h ä1on ä1pa äp2pl äp2pr äp2s1c 1äq ä2r3a2 är4af är1ä är1c 4äre ä2r1ei äre2n ä2r1ene är2gr är1int är2k3l är4ment ärme3s är1o2 ä1rö ärse2 är2seb är2si ärt4e är2th ärt4s3 ä2rü 1ärz är2zw ä3s äs4c äs4e äse3g2 äser4ei äse4ren äser2i äse3t ä5si ä4sko äskop2 äskopf3 äs2kr ä4sl ä4s1p äs2s äs4s1c äss2e äss3erk äs4s1t äst2 äs2te ä4str ä4sw ä1ß äß1erk ä2t1a2 ä3te ät2e1i ätein2 äte2n ä2t2h ä1ti ä1to ät1ob ät3r ät2sa ät2sä ät4schl ät4schr ät2s1i äts3l äts1p ät2s1t ät4s3te ät4sti ät2tr ä1tu ät2zw äu2br äu1c äude3 äu3el ä2uf äuf2e 1äug äu4g3l 2äul 2äum äu2ma äum2s1 ä2un äun2e äu1nu 2äur äu1s 2ä3us. äu4schä äu4schm äu3se ä3usg ä3usk ä3usn äu2sp äu3s2s äuss1c 1äuß äu2tr 4ä1v 1äx ä1z â1t á1n ba2bl 2b1abs bach7t4e backs4 b1a2dr 2b1af bah2nu bais2 ba2ka ba2k1er ba2k1i bak1l bak1r ba2kra 3bal bal2a bal2lä bal4leb bal4leh bal6lerg bal4lig bal3th 2b1am ban2a 3b2and ban2dr ba3n2e b1ang ban2k1a ban4kl ban2kr 2banl 2b1ans ban3t b1anz bar3b bar3de ba2rei bar2en bar3n bar3zw 3bas ba3s2a ba2sc ba2str bau3g bau3s2k bau3sp ba1yo 3b2äc bä1ch b2är b2ä4s3 4b1b b3be bbe4p bb3ler bb2lö bbru2c bb2s bbu1 2b1c 2b3d4 3be. 3bea be3an be3ar be3as 3beb b2ebe 1bec be1ch be2del bedi4 be1eh be2erk be1erl be1eta 3bef4 be3g2 2b1eier bei1f4 beik4 beil2 bei3la 2b1eime b2ein be1ind be1in2h bei3s2 beit2s 3bek 3bel be3las be3lec be3lei be2l1en be2let be3li bel3la bel3li bel3sz bel3t4 1bem bema5sse bemas8sen 1ben. ben3ar ben3dor be3nei 3ben3g be3n2i ben3n ben2se ben4spa ben4spr benst4 ben2su 2bentb b2enti bent4r b1ents 2bentw ben3un ben3z2 be1o be1ra ber3am be2ran beras4 ber4ei. be4r3eiw be4rerk bere4s ber6gan. bergeschos8 bergescho7sse ber4in. ber3iss berma7sse bermas8se. berma8ssen ber3na b1ernt be1rop berö4 ber3st4a be3rum 3bes bes2a besä5s be2s1er be5slo bes2po bess4e b3esst. bes3sz be6stein be4s3tol be4stor be3s2ze 3bet be2tap be3tha be1ur 3b2ew 2b1ex 1bez 2b5f4 bfal2 bflö4 bflös3 2b1g2 bgas1 bga4st bge3 bges2 2b5h2 bhut2 1bi bi3ak bib2 bibe2 bie4str bik2a bi2ke. bi2kes 3bil bil2a bi2lau 4b1illu bi2lu 2b1inb bin2e 2b1inf bin3gl 2b1int bi2o1 bio3d bi3on biri1 bi3se b1iso bi2sol bi2sp bis4s1c bis3si bi2stu bi2stü b2it. b2ita b2ite bi2tu bi3tum b2i3tus biz2 4b1j bjek4to 2b1k4 bl2 2bl. bla3b6 b3lad b2lanc 3blat b2latt 2b3law b2le 3ble2a b3leb 2b3leg 2b3leid b3lein 3blem 3blen b3lese ble3sz b4let b3leu 2blich 3blick b2lie 2blig bling4 b3lis b2lit 3blitz b2lo b4loc b3los2 blo3sse blös4s 2blun 3blut 3blü 2b1m bmas2 4b3n2 bni2 bnis1 bo4a bo5as b1ob3 bo2bl bo2br bo1ch2 bo3d2 boe1 bo2ei 2b1of bo3fe bo1is bo2l1an 3bon. bond1 bon2de bo2ne 3bons b1op bo1r2a bo4rä bor2d1i bor2d3r bo2rei bo4rig b1ort bor2t3r bo2sc bo4s3p bote3n4e bo3th bot2s3t bo2xi bö2b3 2böf 2b1p2 bpa2g 2b1q b2r4 2br. b4ra. 2b3rad b4rah b4ra3k bra4ss brast4 3brä brä4u 2bre. 3brea 6b5rechte 2b3ref 2breg b3reif 3brem 2b3rep b4rer 2b3riem bri2er 2brig b4rio bro1 b3roh 2b3rol b4ron b4ruc bru4s brust3 bru2th 3brü brü4ss 4b1s b2s1ad b3sand bs3ar bsas2 bsa3sse bsat2z b3sä b4sär b5sc bs2ca b6schan b6schef bs4cu b3se. bs1e2b b3sel. bs1ele bse2n1 b3sen. bs1ent bs1er b4serf bs3e4r3in b4sers b3ses b3set bsi2t bs2ku b4sl b2s1of bs1op bso2r b2sö bs2pl b3s2pu b4ss2 bs2t bst1a2b bst3ac bst1ak b3stä bs3tät bst3er b4stern b2stip b3sto b4stod b3stö b3stra b2s3trä bs3treu b3stü b4stüb b2s1un 4b1t b3ta btal3 bta4st3r b5te b2th bt4r bts2 btü1 bu2chi bu2e3 bu2f bu3li bul2la 2b3umk bunde4s b2urg bu3r4i burt4s bu2sa bu4s3cha bu4schl bu4schm bu4schw bus1er bu2sin bu2s1p bu4sses bu6sterm bu2s1tr bu2s1u bü1c bügel3e bü3s4 2b1v 2b1w bwel3 3by1 by3p bys2 2b3z2 bzeit1 bzu1 1ca 2c1ab ca1ch ca2e3 ca3g4 ca1h cal3t c4an ca2pe 3car car3n carri1 ca3s2a3 cas2t ca3t4h ca1y2 cä1 cäs2 2cc c1ce c1ch2 c2d2 c3do 2cec ce2dr 2cef ce1i 2cek 1cen cen3g ce1nu 1cer cere3 ce1ro ce3sh 1cet 2ceta ce1u 1cé c1f c4h 4ch. 2chab ch3a2bi 2ch1ak ch2anb 3chanc ch1ang ch3anst 2chanz 1chao 2char. 1chara 3charta cha2sc 1chato 2chatu ch1ärm ch1äs 1châ 2chb 6chc 2chd ch3e4ben 1chef 3chef. che4fer 3chefs 4chei ch1eim 4chelem che4ler 4chents 4chentw cher3a che3rei 6chergeb cher6zie ch1ess 2cheta 2ch1e4x 1ché 2chf 2chg 2chh 1ch1ia chi3na 4chind 3chines 2chinf 2chinh ch1ins ch1int 2ch1inv 1chiru 2chj 2chk 2chl2 ch2le ch3lein ch2lu 4ch2m 2chn4 chner8ei. 2chob cho2f ch1off ch1oh ch1orc 2chp ch2r4 2chre chre3s ch3rh 1chron 4chs ch4stal 2cht 2chuf 2chuh 2ch1unf 2chunt 2chü 2chv 2chw 2chz ci1c ci2s c1j 2c4k ck1a ck3an cka4r1 ck1ä ck1ehe ck1ei ck1ent 4cker cke2ra ck2ere ck1erh ck2ern ck1err ck1ese ck1id ck1im ck1in ck3l ck3n ck1o2 ck3r ck4stro ckt2e ck1um3 ck1up c4l2 clet2 clo1 1clu c2m2 1co co1ch co2d2 co4der. co3di coff4 coi2 co1it co2ke co2le col2o com4te. comtes4 con2ne co2pe co1ra cor3d co3re cos4 co2st co2te 2cp c1q 1c4r2 cre2 cre4mes cry2 2c1s2 c2si 4c1t cte3e cti2 cti4o ctur6 3cu cu2p3 cussi4 1cy c1z 3da. da1a 2d1ab d2abä da2ben 3d2abl da2bre dab4rü 2d1ac dach3a dachgeschos8 dachgescho7sse da2cho 4d3achse d1af d1ag dagi2o dah3l da1ho 3d4ai2 da1in da1is dal2a 2d1alar dal3b2 da3lö d1alt d1amma 2d1ammä damo3 d2amp dampf8erf 2d1amt d2an. 2d1ana dan4ce. 2d1an3d2 d1ang 2dange dan4kl dan5kla dan2k1o dan2kr 2d1ans 2dantw 2danw d2anz. 4danzi 2d1ap d2aph 4dapp da2r3a 2darb2 3d2arl dar2ma dar2m1i da2ro d3arr d2ars d1art da2ru d2arw da3s2h dat4e2 da3tei date4n 4d3atl 4datm 3dau3e 2d1au2f 2d1aus 4daush 2d1äh 2d1ämt 2d1änd 2d1äng 2d1äp 2därz dä2u dä3us 2d1b4 dbu2c dbu3s2 2dc d1ch dco4r 2d1d2 ddar2m d3dh d5do 1de de2ad de3as de3a2t de3b4 2d1e4ben 3dec de1ch deco3 de1e2 2d1eff deg2 de3gl dehe2 de3ho 2d1ehr d1ei d2eic 3d2e1im dein2d dein2s de2l1a4g de4l3aug del1än del1ec delei4g de3lein 2d1elek 2delem 2delfm delle2 del4lei del2lö de2l1ob de2lop de3lor de2lö del4san del2s5e del2so del2s1p del3t4 dem2ar 2d1emp d2en. de4n3end 4denerg den3g d2enh de2ni den4k3li 4den4sem den4sen den6s5tau den3th 2dentw de1nu de1on depi4so d4er. dera2b de2rap der2bl 2derdb de2re2b de4reck der3edi derer3 de3r4erb de3r4erf de4r3ero derer4t 4d3erhöh 3derie derin4f 4derklä der3m2 4derneu de1ro de2rop derö4 4d3ersat der3tau der6t5en6d de3ru de4ruh de4rum de2s1a de3sac de4sa4g de4sam des3an des1än de4seh des1en1 des1et des1in des1o de2sor de2s1p des5s2 dest5alt de4stam de6stant de4stei de4stit dest5rat de3stri de3stro de2s1u deten4t 2d1etw de1un de1url de3us de2xis 2dexp 2d1f4 2d1g2 dga4str d2ge. dgeschos8 dgescho7sse dge2ta dge4t1e d3gl 2d1h2 d2his 1di di4ab di2ad di4am 3dic di1ce di2e di3e2d die4neb di3eni di3ens. die4s3c diet3 die2th dige4s dik2a dil2s3 2d1imb din2a 2d1ind 2d1inf 2d1inh 2d1in1it 4d3inner 2d1ins 2d1int di2ob dion5s di1p di4re. di2ren di2ris 2d1irl di2sp 2d1isr dist2 di2ta di4teng di4t3erl di4t3erm di4t3ers di2t3r dit1s di2tu di5v diz2 2d1j 2d1k4 4d1l2 d3le dle2ra dli2f dl3m dl3s 2d3m2 4d5n2 dni2 dnis1 d1ob d2oba 2dobe dob4l d2obr do1chi 2d1o2f doll2 do2mar do5n4a doni1 do2o 2dope 2d1opf d2opp d2o3r4a 2dorc 2dord dor2f1a dor2fä dor2fl dor2fr 2d1org do2rie d2orp 2dort dor2ta d2os. dos3s do4sta dost1r dot6h do3un d1ö dö2l1 3d2ör dö2s1c 2d3p2 2d1q d2r4 3d4ra. 2d3rad 2drahm d3rai 3d4ram d3rand 2d3rast 2d3rauc 2dräd d4räh 2d3rät 2d3räu 4dre. d4rea. d4reas 3d4reck 2dreg 3d4reh 2d3reic d4reiv 4drem 4d3ren 2d3rep 4d3rer 4dres. d4resc 2d3rh d3ri d4ri. 3d4ria 2d5ric d4rid d4rie d5rieg d4rif d4rik d4ril d4rin. 3d4risc 2driß 3d4rit 4dritu d3rob d3roc 2d3rod d4roi drom2 2d3rot d3rou 2d3rov d3rö drö2s1 d5rub 3d4ruc 2d3ruh drunge3 2d5rut drü1b 2d1s ds3ab d4s1amt d2san ds3assi d2sau2 ds1än 4dsb d4schef d4schin dsch4r d2s1e2b d2s1ef d3sei ds2eig d4seins d2s1eng d2s1ent d2s1erf d2serh d2s1erk ds1err d2s1erz dse4t d2s1eta d3s2ha d3sho d2s1im ds2inf d3s2kan d3skul 4dsl d2s1op dso2r ds1ori d2sö d2s1par ds1pa4s d2spä ds2po d2spro ds2pu dss2 ds3si dst4 ds1tab d4s3täti d4stea ds2til ds2tip d2s1tis d2stod ds1ums d2sun ds2zen 2d1t dta2d d3tea d2th d4thei dt3ho dto2 dt3r dtran2 dt5s2 1du du1alv du1ar dub3l du2bli du2f 2d1ufe 2d1uh du1i 2d1umb 2dumd 2d1u2m1e 2dumf 2dumg 2d3umk 2duml d2ump 2dumr d1ums d2ums. 2d1umv 2d1un3d dund2a 2d1unf dun3ke dun2kl 2dunr 2dunt du1o dur2c 2d1url 2dursa du4schn du4schr du4schw 2düb 3düf 3dün 2d1v2 2d1w dwa2 dwest3 dy1 dy2s1 2d1z 2e1a e3a2b eab3l ea3der eadli4 ea2dr ea2g4 ea3ga ea4ge ea3gl eakt2 ea2la e3alei e4aler. e2ame eam1o eam3t ea2na e2ano e3ar. ea2ra e3a4rene e3arr e3arv e2as eas5s eat4e2 eater1 e3ath eat3s2 e3at3t4 e3au2f e3aug eaus3s eau3st e1ä4 e1b 2eba e3b2ak 2ebed ebe2i 2ebel eb2en ebens3e 2ebet 2ebl eb3ler eb4leu e3blie eb3lo eb2lö 2eb2o ebö2s 2ebr eb3rei eb4ru eb2s eb6sche ebse2 ebs1i ebs1o ebs1p ebs3pa eb4stät ebs3t2h eb4s3ti eb4s3tot eb3str ebs1u e3bu ebus3s ebu2t1 2eca e1ce ech1ä 2e3che ech1ei e6ch5erzi e1chi ech3l ech3m ech3n e2cho. ech1o2b e2ch3r ech3ta ech3t4ei e1chu ech1uh ech1w e1ci eci6a eck3se 2eckt 2e1cl 2eco 2ect e1d e3d2a ed2dr ed2e ede2al ede4c e3dei ede3n2e eden4se eden4s3p ede2r eder3t2 edi4al edma3s2 e3d2o ed2ö eds2ä ed2s1es ed2s1o ed2s1p ed2s3tr ed2su edu2s e3dy3 4ee ee3a2 eeb2l ee2ce ee1ch ee2cho eede3 eed3s2 ee1e e1eff eef4l eeg2 e1ei ee1im eein4se eei5se eel2e e1e2lek ee3len e1emp e1en eena2 ee4nag e2enä e2enc ee3ni e2eno een3s e1e2pi ee1ra e1erbt e1erd eerde3 ee3r2e ee4r3en4g eere4s1 ee4ret e1erk ee1ro ee1rö eer2ös eert2 e1ertr ee3r2u e1erz ees2 ee3sh ees3k ee3ta ee4tat ee2th ee1u2 eewa4r e1e2x e1f 2ef. 2efa e2f1ad ef1ana ef1ar e2fat efäs4 e2fäu 2efe e3fe. e2f1e2b ef1em e2fent ef2er 2eff. 1effi ef2fl 2efi e2f1i2d e2f1ins efi2s 1efku 2efl e3f4lu 2e3f2o e3fra ef3rea ef3rol ef3rom ef4rü efs2 ef3so ef3sp ef2tan 2efu e2fum 2efü e1g egd4 e3ge ege4n3a4 ege2ra ege4s3to ege4str ege1u eg1la e2glo e2gn eg3ni egro5sse eg4sal eg3se eg4sei egse4r1 eg4sto eg2th 2egu 2e1ha eh1ach e3h2al eh2aus 2e1hä ehäs3 e1he eh2ec eh1eff eh2el ehen2t3 1e2hep e3her ehe1ra e1hi eh1int ehis4 eh1lam eh1lä ehle2 ehl3ein eh4lent eh5l2er eh2lin eh3lo ehl2se 2ehm eh3mu e1ho e3hol eh2r1a2 ehr1ä ehr1ec eh2rei ehr3erl ehr6erle ehre3s eh3ri eh1ro2 ehr1ob ehr1of eh2s2 eh3se eh3sh eh3si eh3so eh3sp eh3sta e1hu e2hunt e1hü eh3üb eh1w e1hy 2ei3a2 4eib ei2bar ei2bl eibu4t ei4b3ute ei2cho e2id ei2d1a ei3dan ei3de ei4d3err 2eidn ei3dra eid2sc ei1e 4eien eienge4 eie4s 1eifr ei3g2a 4eigeno eig2er 2eigew ei3gl 1ei2g3n 2eigru 2eigt 2eigu eik2ar ei3kau eik4la e4il 2eil. ei2lar ei2lau 2eilb eil3d ei4lein eilen1 eil3f4 eil3ins 2eiln 1eilzu ei2m1a4g eim3all ei2mor e1imp eim2pl ei2n1a ei4nas ei2nä ein3dr 2eindu ei4neng ei2neu 2einfo ein4fo. ein4fos ein3g2 ein4hab e1init ein3k ein6karn 3einkom ei2n1o2 einsas4 einsa7sse 3einsat ein6stal ein4sz e4inver ei3o2 ei1p eip2f 2eir ei3re e1irr e2is. ei2sa4 ei6schin ei6schwu ei4s3erw eis2pe ei3s2s ei2str ei2sum e2it ei2tab ei2tan ei2tar 2eitä ei3te ei2th ei2tro eitt4 eit3um 2eiu 2e1j e1k ek2a 1ekd e3ke. e3ken e3kes e3key e3k2l ek4n ek2o ek4r 2ekt ekt4ant ekt3erf ekt3erg ek4t3erz ekt2o ek2u e3k2w e1la ela4ben el2abt el1af ela2h e2l1ak e2l1a2m el1ans el1anz 2elao e2l1ap e2l1a2r el3ari el1asi el1asp el2ast 2e1lä 3elbis el2da eld5erst el4d3erw eld3s2 2ele. 2eleh 2elei e6l5eier. e2l1ein e3leine e4leing e2l1el 1e2lem e3lem. el1emp 2e3len. e4lense e2l1ent e3lep el1erd el1erf e4ler4fa e2l1erg el1erk el1erl e4ler4la e4l3ernä e2l1err 2eles2 el1ess e4l1e4ta e3leu 2elev ele2x 1elf. el3fe elf4l 1elfm 1elft elgi5er. elgi5ers 2eli e2l1id e3lie eli2ne el1ita el3kl elks2 el3lan ell2au el2leb ell3ebe el4l3ein ell3eis el3ler el2lic el3l2in ell3sp elm2a 2eln el5na 2elo e2lof e2lol elon2 el1ope e2l1or elo2ri el2öf el2sum elt2ak elte2k el4t3eng el4tent 3eltern el3tes elto2 el2t3r el3tri elt1s2 elt3se elt3sk 2e1lu e2l1um el1ur el3use e1lü e2lya 2elz elz2e el2zwa e1m 2ema e2m1ad ema2k e2m3anf e2mans 3emanz emas8sens em2d3a2 e3m2en emen4t3h e6mentsp e2m1erw 1e2meti e2m1im em1int emi3ti 2emm em2map emma3u em2mei e2mop 3empf em3pfl em2p3le em2sa em2spr em3t2 1emul 2emü emü3s e2n1a 4ena. 2enac e3nad e4naf 4enah e4nak ena3l2i 4enam en4ame e4nand en3ang en3are en2asc 4enat en3att e3naue e2n1är en1äu enbu4s3 en2ce. en3d2ac en2dal endermas8 en4d3ess end4ort end3rom end3si end3s2p end3sz end2um 2ene. ene4ben en1ec e2neff e4nein e2n1el ene4le 2enem 2enen e4n1ent en4entr 4e3ner. e2n1erd e2nerf 1e2nerg e4nerh e4nerk e2n1erl e4n3ermo 4enern e2n1err e2n1ers e2n1ert e2n3eru e2n1erw e4nerz 2enes e4n3ess en3f enf2a enf2u 1engad 3engag en3ge en3g2i en2gl en3glo 1engp eng1s eng3sc eng3se e3ni. e3nic e4nid e3nie eni3er. eni5ers. e2n1i4m e2n1in e3nio 2enis eni3se e3nit 2eniv en3k2ü e2n1o2b enob4le e2nof en1oh e3nol eno2ma en1on e2n1op e2n1o2r eno2s enost3 e3not eno2w 2e1nö en1ö2d e4nr en3sac ensas2 ensa5sse en2sau en5sch4e en2seb 1ensem ensen1 ens3eng en3ska en3s2po enst5alt en4s3tät en6s5test 2ensto en6s5trie e4nt ent4ag 1entd en2teb en4terb en3tes 1entfa 3entga en2thi 3entla 1entn en4t3rol 3entspr 2entü 1entw 4entwet 1entz en1u 2enut e1nü 4enwü e1ny en4z3erf en4z3erg en4z3erk enz3ert e1ñ 2eo e1o2b1 e1of eo2fe e1oh e4ol e1on. e1ond e1onf e1onl e1onr e1ons e1ope e1opf eop4t e1or e3or. e3orb e3ors e3orw eos2 e3os. eo3ul e1ov e1ö2 e1p e3pa epa2g e3p2f4 1episo ep3le 1e2poc ep2pa ep4pl ep2pr ept2a ep2tal e3pu epu2s e1q er1a e3ra. e3rad. er3adm eraf4a era1fr era2g e1rai er3aic e2rak e1ral er3all eran3d e3rane er3anf e2ranh er3anm e1rap er3apf e2rar e3rari e1ras e2r3a6si era4s3s era2ß e2rath e3rati e2ratm e1raub er3aue erau2f er3aug e1raw e1raz e1rä er1äh er1äm erä4s erb2e er3br erb4sp er1c er3chl er3da 1erdb er3de 2erdec erd3erw 4ere. er1eb e3rech er3echs er1eck ere4dit er1eff e2r1e2h 4e3rei. er1eig e2rein e4r3eis. ere2l er1ele 2e3rem 2eren e3ren. e3rena e4rense e4r3entf e4rentn e3renz eren8z7end 2erer. e2r3erf e2r1erh e4rerl 2erern e3rero er1err er1ers e2rert er1erw 2eres er1ess er1eß er3e4ti er1eul ere4vid erf2e erf4r 4erfür 3ergebn 4ergehä erg3els 1ergol e2r3h 1erhab 2erhü 2eri e2riat e3rib 4e3ric 4e3rie eri3e4n3 eri5ers. e3ri3k4 4e3rin. er1inb e2r1ini er1ink er1int e3rio er1ita 2erk. 1erklä 2erkli 2erkre erk3t 3erlebn ermen4s erm3ers ern1os e1ro. er3oa er1o2b e2r1of e1rog e1r1oh e1rok e1rol e1rom e3ron er1o2p e4ro2r e1ros e1rou e1row e1roz er1ö erö2d 2erök er3p4 er3rä erri3er 2errü ers2a er3se er5sen er3s2i er3sk ersma3s4 er5smo er3sn er3sp ers2te er3sz ert2ak er6terei er4ters er2tho 4erti ert3ins ert4ra ert3s2e 2eru eruf4s er1u4m er1und er1uns er3uz erü4b 3erweck 6erweis e1s e4s3ab es1ad es2an es3ant e3s2as esa3sse esas6sen e4s3ato esäs4 es2äu 2esb e3sc es2ca es3cap es2ce esch2 e4sco e4scu e3se. es1ebe es3ehr e2sein ese4ler es3eva 2esf 4esh es3ha es4har es2hu e3sig e2s1il es1ini e4s3ins es3int es2kat e4s3ke e4sky e4s3l es4log 2esm e4sn es2ort es2ö 2esp e3s2pek e3s2por e3s4pra es2pu 2esr es2sau 4essem ess4e3re ess3erg es3si 2esso es2sof es2s1pa es4ste estab4b est1ak e3stan e4starb 1e2stas es2tau es2te e4st3eng e4st3erh e4st3ess e5stev e3sti e4stip estmo6de e2stod est3ori 2estro es3trop es2tu e3s2tü es2ty e2s1um es1ur e4sw e3sy eße3r2e e1t etab4 et1am 1etap etari1 et4at et1äh e3te e4tein et2en eten3d2 ete2o eter4hö eter4tr et2h et3hal et3hü e3ti eti2m eti2ta 2e3to eto2b e4t1of 2etr e4traum et3rec e2tres etsch3w et1s2p et1su ett1a et2tab et4tanz et2t3au et2tä et2tei ette4n1 et2th et2t3r et4tro ett3sz et2t1um et2tur et2tü etwa4r 2etz et2zä et4z3ent etze4s et2zw eu1a2 eue6reif eu2e5sc eu2g1a eu4gent eu3g2er eu4gla eug1s2 euil4 eu1in 1euk eu2kä e1um e3um. e3umb e3uml e3um2s eums1p eum3st 2eun eun2e eu4nei e3un2g eu2nio eun3ka eu1o2 eu1p e2ur2e 3eu3ro eu1s4 eu3sp eu3ss eust4 2eut eut2h eut6schn 2eux eu2zw e3ü 2e1v e2vela e2vent 4ever eve5r2i e3vo ev2s e1w 2ewa e3wä4 ewä6s 2ewe e2we. e3wir ewi2s e3wit ew2s 2ex. ex3at 1e2xem ex1er e1xi e2x1in 1exis ex3l 3exp 2ext. ex2tin ex2tu 2exu 2e3xy ey4n eys2 e1z e3z2a e2z1enn e3zi ezi2s ez2w é1b é1c é1g égi2 é1h é1l élu2 é1o é1p é1r é1s é1t2 é1u2 é1v é1z2 è1c è1m è1n è1r ê1p 1fa fab4 fa2ben f3abf f2abr fab5s 3fac fa4cheb facher5f fa2ch1i fa2cho f1ader fa2dr f4ah faib4 fa2ke f2al fa3l2a fal2kl fal6lenk fal6l5erk fal2li fal6scha fal6schm falt2s 2fanb 2fanf fan2gr 2f1ank 2fanl f1anp 2fanr fan3s 2fanw f1an3z 2f1ap f2ar far2br 2f3arc 3fari 3f4art 2f3arz fa3s4a fa3sh f3at fa2to3 2f1auf f3aug fau2s f1ausb 3f4av fa2xa 1fä fä1c fäh2r1u 2f1ärm fä4s3ser fä2ßer f1äu 2f1b2 2f1c 2f3d4 fdie2 1fe featu4 f2ech 2f1eck fe2dr fe2ei fe1em fef4l feh4lei f4eie 2f1eing 4f1einh fe1ini 2f1einw f1ei3s fek2ta fe2l1a fel2dr 2f1e2lek fe2l1er fe2les fe2l1o fel4soh fel3t f2em. fem4m 2femp fe2nä fen3g fe2no fen3sa fens2t f1ent f2er. fe1ra fer2an fe4rang fe4r3anz fe2rau ferde3 f2ere fer2er fer3erz f1erfa f2erl. 4ferneu fe1ro f4erpa f2ers. f2ert f1erw fes2t fe2st1a fe4st3ei fe2str 2f1e4ta 3fete fet2t3a feuer3e feu4ru 3few f1ex 2fexp 3fez 1fé 2f1f ff2ab ff3ar ff4arb ff1au ff2e ffe2e f2f3ef ff3ei ffe1in ffe2m f2f3emi f2fetz f2fex fff4 ff3l ff4la ff4lä ff4lo f3flu f3flü f3f4rä ff3ro ff3rö ff2sa ff3sho ff2sp 4f3g2 fge3s 2f1h2 1fi 3fi. fi3at fi4ds fi1er2f fi2kin fi3kl fik1o2 fi2kob fi2kr fi2l1an fil4auf fil3d fi2les filg4 fi3li fi4lin fil2ip f2ina fi3ni 2f1int fi2o fi3ol fi2r fi3ra 3fis fis4a fisch3o fi3so fis2p fit1o2 fi2tor fi3tu 3fiz 2f1j 4f1k4 f2l2 2fl. f3lad f3lap 1flä 3f4läc 2f5läd f3län 2f3läu 2f3leb f4lee 2f3lein f3ler f4lé f3li. 3f6lim fli4ne 2f5lon 1f4lop flo7s8ses. 1f4lot flo2w f3lö f4luc 1f4lug flu4ger flus3se f4lü 2f3m2 fmas2s fma3sse 2f3n2 fni2s 1fo fob2l 2f1of foli3 fo2na fo2nu 2f1op 4f3org fo3rin 3form for4m3a4g forni7er. for4sta for4sti for4tei for2th for2t3r for3tu 2f1o2x 1fö 2föf 2f1ök 2f1öl 4f1p2 2f1q f2r2 f4rac frach6tr f5rad fra4m f3rand f5rap 1f4rän 2fre. f3rec f3red 2freg freik2 frein4 f3rep f4reu 2f3ric fri3d fri2e 2frig 1fris f4risc fri6ster f3roc 1f4ron fro2na fro2sc f3rot f3ru f3rü 4f1s fs2amm f2san fs3ar f2s1as f2sauf f2saus f2saut fsä4 f3sc f4sce f4schan f4schef f2s1e2b f4s3ehr f2s1em f2s1ent f2s1er fse4t f2s1eta fsi2d f3s2kie f2s1o2 f3span f2s1pas f2sph f3s2pl f3s2por fs1pr f2spre fs2pri f2spro fs2pru fs3s4 f2stas f4s3täti f4stech f4stemp f2stip f2s1tis fst4r f4s3tres f4s3tüte f2sty f2s1un f2sü f3sy 4f1t f2ta. f2tab ft1a2be ft1af f2t1al ft1an ft1ar f3tat ft1e2h ft1eig ft1eis f2t1ent f2t1e4ti f2th f4thei ft3ho ft1op f2t3ro f2t3rö f3t4ru fts1 ft2sa4 ft4sag ft4sam fts2c ft4sche ft2se4 ft4seh fts3el ft2si ft2stä ft4ster ft4stes fts2ti fttra4 f2tum ft1url ftwa4 ft3z2 1fu 3fug 3f2uh f1um 2f1unf 2f1u2ni fun2kl fun2ko fun2k3r 2f1unm 2funt f2ur fu4re. fus2 fu3sse fus6sen fu4sser fuss1p fus4s1t fu2ß1er 3fut 1fü 2füb fü2r fü3s2 2f1v 2f1w 1fy 2f1z fz2a fzeiten6 fzei8tend fz2ö fzu3 fzu4ga 3ga. 2gabf ga2b5l gab4r 2gabz ga1ch 2gadl 2ga2dr ga1fl ga1k ga2ka gal2a g4amo 2g1amt 2ganb gan3d gan2g1a 4gangeb gan2gr 2ganh 2g3anku 2ganl g3anla 3g2ano 2ganw ga1ny 2garb 2garc 3gard 2g1arm ga3r2o g1arti ga3ru 2g1arz ga2s ga3sc ga4s3ei ga4sem ga3sp ga4spe ga4spr gas5s ga3s6ses gas3tan ga4st3el ga3str ga4stra ga4stre gas1tu gat2a 2gatm gat4r gau1c 2g1auf g2auk g1aus 2g1aut 2g1äp 2gärz gäs2 gä4u 2g3b2 gbau5s gber2 gbi2 2g1c 2gd g1da g2d1au g2d1er gd1in g1do g1dö g1d3r gd3s2 gdt4 gd1u 1ge ge3a2 geb2a gebe4am geb4r ge1c ged4 ge1e2 ge3ec ge2es gef4 ge3g2l ge1im ge2in. gein2s ge2int gein2v ge1ir ge2is4 2g1eise2 gei3sh gei4sta g2el ge4lanz gelb1r gel4b3ra gel6ders ge3le ge5leh ge4l3ers ge4less gell2a ge3lor gels2t gel3sz gel3t2a ge3lum ge3lü gelz2 ge3mi gem2u 3gen ge3na ge4nam ge4nar gen4aug gen2d1r gen1eb ge3nec gen3eid gen3ern gen3g genma7sse. gen3n gen3sz 2g1entf gen3th 4gentw geo2r ge1ou ge3p4 ge1ra ge2rab 4g3ereig ge4reng ge4ren4s ge4r3ent ger2er gerin4f ger4inn gerin4t germ4 germas6s ger3no ge1ro ge1r2ö ger4sto ge3r2u ges2c ges3elt ge2s1er ge3s2i ges2p ges4pi gess2t gest2 ge3t2a 2getap ge3t4u ge1ul 2g1ex 2g1f4 4g1g gga2t g3ge gge2ne g2g3l gg4lo g2g3n gg4r 2g1h 4gh. gh2e 3g2het 3g2hie gh1l 3gh2r g2hu gh1w gi3alo gia2s gie3g gi2e1i gi2el gien2e1 gi2gu gi2me. gi4mes gi2met 2g1ind gi3ne gin2ga 2g1ins 2g3isel gi3t2a gi4us 2g1j 4g3k2 4gl. gl2a g1lab 3glad g2lade 2g1lag 3glanz gla4s3ti gla4stu 3g2laub 2g1lauf g1läß 3glät 2gläuf g2l4e 2gle. 3glea 2g3leb g3lec g3leg 2gleh 4g3lein glei4t5r g3len 4g5ler 2gles g3lese g4lia 2glib 3g2lid 3g2lie 2glif g2lik 4glin g2lio 2glis 4g3lisc 3g2lit g2liz 3g2loa 3g2lob g3loch glo3g 3g4lok g2lom 3g2lop 3g2lot 2gls 2g1lu2 3glü g2ly 2g1m2 g1n 2gn. g2n2a g4na. 2gnac g4nat 3g2nä gn2e g3neh gne2tr 2gneu 2gng g2nie g2nif g4nin 2gni2s1 g2no1 g3not 2gnp 2gns 2gnt 2gnu 3g2num. g2nü g2ny 2gnz go4a goa3li 2g1of 2gog 2g1oh go1i2 gol2a 2gonis 2g1ope 2g1opf g2o1ra 2gord 2gorg go2s go3th got6t5erg go1y 2g1p2 2g1q g2r4 gra2bi gra2bl 2gradl 2g3rah 2g3rak grammen6 gram8m7end 2g3räu 2g5re. g4reb 2g3rec 2g3rede g4re2e 2g3reic 2g3rein g3reit g4rem 2g3renn gren6z5ei g4rer g3ret g3rev 2g3ric gri2e g3riese 3grif 2grig 2g3ring 2groc 2groh gron4 g4ros2 gro5sse. gro7ssen. gro7sser. gro5sses g4roß gro4u 2g3röh g4ruf 2g3rui 2g3rum 3g4runs 3g4rup grus2s gru3sse 2grut 2g3rüc 3g4rün 4gs g2sa gs1ac gs1ad gs1af g4s1a4g g3sah g4s3a2k g3sal g4salt gs3ama g4s1amb gs3an gs3ar gs1as gs3aug gs1ä g4sca g4sce gsch4 g4schef gs2chi gs3cr g2s1e2 g3s2eil g3sel. gs3eli g3seln gsen1 g4s3er gse4t g4seu g2s1i gsi2d g3sig g3sil gs1o2 gs1p4 g3s2pek gs4pie gs2pit gs3pl g5s2por gsrat4 gs3s2 g3star gs1tau gs1tä g5stel g4stemp gst3ent g4sterm gst3err g4s3test gst2he g3sti gs1tis g3sto g4ston g4s1tor gs1tot gs1tr gst4ra gst4ri gst3ros g3stun gs1tü gs2tüc gs1u g3sy 4g1t g3te gti2m gt4r gt2se 1gu gu3am gu1an. gu1ant gu2e 2gued guet2 2g1u2f 2g1uh gu1ins gu1i4s 3gumm 2g1unf g2ung. gunge2 4gungew 2g1ungl g2uns 2gunt2 3gur 4g1url gurt3s gu2s3a guschi5 gus2sp gus4st gu3sti gu2ß1 gu2t gut1a gu4t3erh gut3h 2güb gür1 gü3st 2g1v 2g1w 2g3z2 3haa hab2a hab2e ha2cho ha2del ha4din h1adle haf3f4l haft2s hafts3p h1ah ha1kl 2h2al. halan4c ha2lau hal2ba hal4bei halb3r 2hale hal2la hal4leh hal6lerf h1alp halt3r h1amt h2an. h2and h4ann 2hanr 2hant hao2s h1ap ha2pl ha2pr h4a3ra 2harb h2ard h1arm. har4me. har4mes har2th h1arti h2as 2ha3sa hasi1 ha2ß1 hatt2 hau3f4li 2h1aufm h1aukt hau2sa hau2sc hau4spa hau4ss haus5sen hau4s3ti hau4sto hau6terk 2hauto hau2tr h1äff hä4s hä5sc hä6s5chen häu2s1c hä3usp 2h3b2 hba2r3a 2h1c 2h3d4 hdan2 2hea he2ad hea5t he3be he4b1ei he2bl he3br he5ch2e he1cho h1echt hed2g he3di he2e3l hee2s he2fan he2fä he2f1ei hef3erm 2heff he4f3ing he2f3l he2fr he3fri he2fu he3gu h1eie h1eif h1eig he2im heim3p hei4mu heine2 hei4neh h1eink 4heio he1ism he1i4st heit4s1 h1eiw he2l3au hel1ec h3e2lek he3len hel3ers he3li hel4l3au hel4mei he3lo he4lof he2lö 3hemd he3mi 3hemm 4h1emp h2en. he4n3a4 he2nä he2n1e2b hen3end hen3erg he2net heng2 2heni he2no hen3st2 h1ents 2h3entw hen3z 4he2o he3on he3op he3ph her3a2b he2ral 2herap he3ras herau2 he4reck 4hereig he4r3eis he2rel he4rerw h1er2fo h1erfü herg2 herin4f he6rin6nu herin4s herin8ter h1erke h3erlau 2herm herma3s he3ro he4r3o4b h1erö hert2 her3th her2zw he2tap heter2 he3th het2i he3t4s h2e2u heu3g he3x he1x2a he1y2 1hè 2h3f4 hfell1 hfel6ler hfi2s 2h3g2 hget4 2h1h2 2hi. 2hia hi2ac hi2ang hi1ce hich6ter 2hi3d h2ide h1i4di hi2e hi3ens hier1i hie4rin hif3f4r hi2kr hi2l3a4 hil2fr hi2n h1indu hi3nel hin2en h1inf h1inh hi3n2i hin3n2 hi3no hin2t1a 2hio hi4on hi3or 2hip1 hi2ph hi2pi h2i2r hi3ra 2hi3re hi3ri hirn1 hir4ner hi3ro hir2s his2a hi2se his2p hi3ti 2hiu h1j 2h1k4 4hl h4lac hla2n hl1anz h1las h1laß h1lat h1laut h3läd h1läs h1läß h1läu hlb4 hld4 h3leb hle3e h5len. hlen3g hl2enn h3ler hle2ra hl1erg h6l3ernä hle3run hl1erw h4lerz h3les h4lesi h3lex hlg4 h2lie h2lif hl1ind h2lip h2lis h3list h2lit hll2 hlm2 hlma3s h2lo h3loc hl1of hl1op h4lor hlo2re h3losi hl2ö h3löc h2lös3 hlö4ss hl2san hl2ser hl3sku hl3slo hl2sto hl3t2 h3luf h3luk h1lüf 2h1m h2mab h3mag h3man h3mar hma3sse h4mäc h4mäh h4mäl h4mäu h3me. hme1e hme1in h3meist h3men hmen2s hme2ra h2mo h4mon h3mö hm3p4 hm2s1p h2mu 2hn h2na hn1ad h3nam hn1an hn3d4 hn2e hn3eig hn3ein h2nel hne4n1 hne4pf hner3ei h3nerl h3nerz hn3ex h2nic h2nid h2nie hn1im hn1in h2nip hn3k4 h2nor hn3s2k hns2t hntra4 hnts2 h1nu h2nuc h2nul hn1unf h3nunge ho2bl ho2c hoch3 hock3t 2hod hoe4 ho2ef ho4fa ho2f3r 2hoi hol1au 4holdy 3hole ho2l1ei hol3g4 4holo ho4lor 3hols h1o2ly 3holz hol6zene hom2e ho2mec ho2med h2on hono3 2hoo 2hop ho1ra hor3d h1org ho4sei ho3sl ho2sp ho3s4se. ho5s6ses. ho3ssi ho4sta ho2str 2hot. ho3th hotli4 2hot1s2 3hov 2ho2w1 h1o2x ho1y2 hô1 1h2ö hö2c h4ör hö4s hös1c hös3se h3öst 2h3p2 h1q 2hr hr1ac hr3ad h1rai h1rane h3rat h3räu hr1c hr3d h2rec h3rech h3red h3ref h4rei. hrei4ba h3reic h4r3eig h3rel h3r2en h3rep hr2erg hr2erk h6rerleb hr2erm hr2erz h3re2s1 hre2t h2r1eta h3rev hrf2 hrg2 h2ri h3ric h4rick hri4e h3riesl h3rin h4rine h4rinh h4rist h2rob h2rof h3roh h3rol h4rome h4romi h4ron h2ror h3rou hrr4 hr2s1ac hr2s3an hr2sau hr3sch hr2s1en hr2ser hr2set hr2s1in hrs3k hr2s1of hr4stec hr2su hr4sw hr2tab hr2tan hr2th hr2tor hrt3ri hr2tro hrt2sa hrt2se hrt4ste h3ruh hr1ums h3rü h4rüb h2ry hrz2 4h1s h2s1ach h2san h2sau hsä4s h3sc h4schan h2s1ec hse4ler h2s1erl h3s2ex h2s1ing h2s1of h2s1par h2sper h2sph hs2por h2sprä h2spro hss2 hst3alt hst2an h4starb h2stau h2stäl h4stea h5stel hst2he hs1tie h2stin h2s1tor h3stö h3str hst3ran hst3ri h2stu h3stun h3stü h2s1u hs2ung h3sy 4h1t h2t1a h3t4akt. h3takts h3t2al h4t3alt hta2m hta4n ht3ane h3tank h3t2as h4t3ass h4tasy ht3a2t h2tär h3te. ht1ec h2t1ef ht1eh h3teha h3tehä hte2he h2teif h4teilz h2t1eim h2t1eis h4t3elit htelma4 htelmas5 h2temp h3ten h4tentf h4t3ents ht3erfo ht3erfü h2t1erh ht5erken h4terkl h4t3erre ht3ersc h6t5erspa ht3erst h6tersta ht6erste h2t1erz h2t1ese h2t1ess h3tet h2t1eu h2t1ex htgeschos8 htgescho7sse h2th h4thei hthe3u h4tho h2t1in htni2 hto2 h2toly h2torg ht3rak ht3rand h2t3rat ht6raume ht4ri h2t5rin h2t3rol h2t3ros ht3rö h2t1rös h2t3ru h2t3rü h4ts ht3spri ht4stab hts2ti ht4s3tur ht4s3tür htt4 htti2 htu2e h2t1urs ht3z2 hu2a hu2b1a hu2bei hu2b1en hu2b3l hu4b3r hu2bu hu2h1a hu2h1i huk3t4 hu2l3a hu2lä hu2l3ei hu4l3eng hu4lent hu2ler hu2let hu2l1in hu2lo hu3ma h1ums hu2n h1una hu3ni1 h1up. h1ups 2hur hurg2 hu3sa hu2so hus4sa hus3se hus2sp hus4st hu2tab hu3t2h hu2ti hut2t hut4zen hut4z3er hutz1i h2ü h4übs h3übu hühne4 hüs3s 2h1v hvi2 hvil4 2hw h2wall hwe1c h1weib 3hyg 3hyp hy2pe. 2hy2t h1z hz2o hzug4 i1a 2ia. i4aa i2ab iab4l 2iac i2af iaf4l i4a3g2 i2ah i2aj i2ak i3ak. i3akt 2ial i5al. ia2l1a4 ia2lä ial3b ial3d i3alei i3alent i3alerf i3alerh ia4l3erm i3a2let i3a4lia ialk2 i3all ial3la ia2lor ial3s ial3t4 ia2lu ial3z2 i2am4 i4amo 2ian ia2nal i3and2 ian2e i3ann i2ano i3ant i3anz i2ap ia3p2f ia1q i3ar. ia2ra 2ias i2asc ia3sh i2asi i2a1sp ias5s iast4 i3at. i3a4ta i4ate i3at4h 1iatr i3ats i3au ia3un iau2s1 2iav 2iä i1äm i1är. i1ärs i1ät. i1äta i1ät3s4 2i1b i2b1auf ib2bli ib1ei i2beig i2beis ibe4n iben3a ibi2k i3bla i3ble i2blis ib2o i2b1ö i4brä ib3ren ib4ste i2bunk i2bunt ibus1c ibus3s 2ic ic1c ich1a ich1ä i1che ich1ei ichermas8 ichgro3 i1chi i2chin ich3l i3chlo ich3m ichmas4 i1cho i2ch3r ich2t3r i1chu ich1w i1ci ick2e icks2 i1cl i1d id2ab4 i3dam id2an i2d1au 1i2dee i2dei idel2ä ide3so ide3sp 1i2dio idni3 i2dol 1idol. 2i2dr i3dsc id2s1p idt4 i2dy ie3a4 ie2bä ie2bl ie2bre ieb4sto ieb4str ie1c ie2cho ie2dr ie1e2 ie2f1ak ie2f1an ie2fau ief3f4 ie2f3l ie2fro ie4g3l ie3g4n ie2g3r ie3g4ra ieg2s iegs1c ieg4se ieg4st i1ei i2e2l1a ie3las iel3au iel3d iel1ec ieler8geb i1ell ielo4b iel3sz iel3ta 2i1en i3en. i3ena iena2b ie4n3a4g i3e2nä i3en3d i2ene ien1eb ie3ner ien4erf ie4n3erg i3enf i3en3g ienge4f i3enh i3enj i3enk i3enm ienma3s4 i3enn i3e2no i3enö i3enp i3enr ien3s2e iens2k ien6stof ien6stop iens4tr ienst5rä ien3sz ie1nu i3env i3enw i3enz ie1o2 ier3a2 ie2rad ie2rap i2ere ie3r2er ie4rerf ie4r3erz ie3res i3ereu i4eri ierin3 ier3k4 i1ern i3ern. i2er5ni ie2rö iers2e ier4s3eh ier3sta ier3te ie3s2 ie4sh ie4sk ies4s ie5sset iess1t ie4stas ie2t1a ie4t3erh ie4t3ert ie2t3ho ie4t1o ie2t1ö2 ie2tri iet2se i1ett ieu2e ie1un i1ex 2if if1ab if1ar i2f3arm if4at if1au i2fec ife2i if2en if1erg if1erh if2fah if6feste if2fl if3l i1f4la if4lä i1flü if3r if4ra i1frau i1fre if4rei if4rü if2ta ift3erk if2top if2t3ri ift1s2p ift3sz 2i1g iga1i i2g1ang ig1art iga3s i4gefar ige4na igerma3 ig1erz i2g1im i2gl ig1lä ig4na i4gnä i3g4neu ig4no i3go ig4ra ig3rei igro3 ig4sal ig1so ig4sti ig4s1to ig2stö ig4stre 2i1h i2h1am i2har i3he ihe1e ihe4n ih3m ih3n ih3r ih2s ih3sp i2h1um ih1w ii2 ii3a4 i1ie i3i4g i1im i1in i1i4s i2is. ii3t i1j 2i1k i2k1a4k ik1amt i2k1ano ik1anz i4kanze ik1art ik3att i2k1au i2kär ikbu2 4ike i2k1ei ike2l1 i2k1e2r2e ik1erf iker6fah i2ker2l i2k1eta i3ki. ik1in i2kind i2k3l i3kla i3k4lä i2kn ik3no ik2o3p4 i2köl i2k3ra ik3rä ik3re ikro3 ik3so ik3s2z ikt2e ikt3erk ikt3r ik2tre i2kun i3kus i1la i2l3ab il1a2d i2l1ak i2l3a2m il1ans il1asp il1au il4aufb il3aus i2laut i1lä1 4ilb il2c il2da il4d3en4t ild2er ild1o il2dor il2dr il1ec ile2h il1ehe ileid4 il1ein il1el i4lents i2l1erf i2l1erg i2l1err ilf2 il2f3l il2f3re ilf4s1 ilie4n ilig1a2 ili4gab i2l1ind i2l1ip i3lip. i3lips 2ill. il3l2a il4lad ill4an il3l2er il3l2i 2ills il2mak il4mang il2m3at il2mau il2min 2ilo i2l1or il3t2h i1lu2 i2lum i3lus ilv4 il2z1ar ilz3erk 2im. i2manw i2m1arm im4at ima2tr imat5sc ima4tur i2meg i2mej i2mek i2m1ele i2melf i2m1erf i2m1erz i4mesh i2meti i2mew i2m1inf i2m1ins im2mei4 im4m3ent 1immo imni2 2imo im1org 1impo imp4s im3pse 1impu im2str 2imt imtu2 2imu in3ac i4nack i2n1ad in2af in1am i3nap in2ara in2ars ina4s i2n3au2 inaus1 in1äs in2dal in2dan in3dau indes4t 1index in3do 2indr ind4ri in3drü 1indus 2ine i2n1e2be in1ehe in3ei i2n1eng inenma3 inenmas6 in3erbe i4nerbi in2erh iner4lö i4ner4tr i4nesk in1eu ine3un ine2x in3f 1info. 1infos 2inga ing1af in2g1a4g in2gl ingmas4 ing4sam ing3sc 1inhab 2inhar 2inhau 4inhe in2i3d i3nie 2inig ini3kr in2ir 2inis ini3se i3nitz 3inkarn ink4ste inma4le 2inn. in4n3erm 2innl in2nor inn4sta 1innta 2ino in1od in3ols in1or ino3t i1nö in1ö2d 2inp 2inr ins2am insch2 in2seb 2insen ins3ert in3skan in3skr 1insta in4s3tät in3su 1insuf in4s3um in3s2z i4nt 1integ int2h in3t4r in1u i3n2um in3unz invil4 i1ny in3zw i1ñ 2i1o ioa4 io1c io2d i2oda io3e2 iof4l i2o3h io2i3d io3k4 i3ol. i3om. i3oms ion2 i3on. ional3a io2nau ion3d i3on4s3 i2ony i2o1p io4pf i3ops i3opt i2or i3or. i3orc iore4n i3orp i3ors i3ort io3s i2ost i3ot. i3ots i2ou i2ov io2x i3oz. i1ö2k i3ön i1ös. 2ip. i1pa i1pe ipen3 i3per ipf2 ip3fa iph2 2i1pi ipi3el ipi3en ip4l ip2pl ip3pu i1pr 2ips 2ipu 2i1q i1r2a i3rad 1i2rak ira4s irat2 i1rä ir2bl ir1c ir2e i3ree 2irek i3ré irg2 ir2gl irg4s ir2he ir2i 2irig 2irk ir2k3l irli4n ir2mak ir2mau ir4mä ir2m1ei ir2mum ir4m3unt ir2nar ir2no i1ro 1iron i1rö irpla4 ir4rei irr2h ir4sch3w ir3se ir3sh irt4st iru2s1 i1s i3sac i4s1amt is2ap is3are i2sau i2s1än 2isb i2sca isch3ar i3s2che i4schef i4sch3e4h i4sch3ei i2sch1l isch3le i2schm isch3ob isch3re isch3ru i4schwa i6schwir i4schwo isch3wu is1chy i2s3cr 2ise ise3e ise3ha ise3hi ise3inf i4seint ise2n1 is2end isen3s i2serh i2s1erm iser2u i2s1ess i4s3etat isi2a i2s1id i2s1of iso6nend is1op 3i2sot 2isp is1pa i2spar is1pe is1pic is2pit i2spro is3sa is4s1ac is4sau is3sc is4s3che is3senk issermas8 is3so is3spa is3spi is3spo is2s1t is3sta is4ste is3sto is3stu is2su i2stab i4stam ist2an i4stea iste4n is2ter ist4ra ist3re is1trü i2stur is1tüm i2sty isum3p i2sü i1ß iß1ers i1ta it1ab. it1abs ital1a it1alt it1am it1ang it3a4re it1art i3tat it1au i3tauc i2t1ax 4i1tä it2är i2t1äs ität2 i1te i2tei i4t1eig i4tein 2itel ite2la ite4n it2ens2 i4tepo i2tex i3thr i1ti i2t1id 1itii iti4kan i2t1in1 it2inn i3tis i3tiv itmen2 i1to i3toc i2t1of i1tö i1tr i3tra. it3raf i2t3ran it3ras it3rau it3räu it3re it3ric it3rom it4ron i3tru it3run it2sa it4s1a4g it2s1e4 its3er1 it4set its1pe it4staf it4stec it4s3tem it4s3tes it2sti it4stie it2sto it2teb it4temp it2tri i1tu it1uh i2t1um i2tuns it1urg itut4 i1tü 2itz it2zä it4z3erg it2z1w 2i3u2 ium1 ius1t i1ü 2i1v i2v1ak iv1ang i2veb i2v1ei iv1elt ive4n i2v1ene i2v1ent i2v1ur 2i1w iwur2 2i1x i2xa ix2em i3xi ixt2 2i1z iz1ap iz1au izei3c ize2n i2z1ene iz4er i2z1ir izo2b i2zö i2z1w í1l jah4r3ei jahr4s ja3l2a ja3ne jani1 2jat je2a jean2s je2g jek4ter jekto2 jektor4 jek2tr je3na je2p je2t1a je2t3h je2t3r jet3t je2t1u2 ji2a ji2v joa3 jo2b1 job3r jo2i joni1 jo1ra jord2 jo2sc jou4l j2u ju2bl jugen2 jugend3 ju2k jung5s ju3ni jur2o jut2e3 2j1v 1ka 3ka. k3a2a ka3ar kab2bl ka2ben 2kabh 2kabla 2kablä 2k3a2bo ka3b4r 2k1abs 2k1abt ka1c k2ad 2k3ada 2k3a2dr ka1f4l ka1fr kaf3t2 k2ag ka1in ka3ka kaken4 2kala. ka2lan ka3lei ka3len. ka4lens kal3eri kal2ka kal2kr k1all kalo5 kal4tr k3ama kamp8ferf kan2al ka4n1a4s ka2nau kand4 2kanda kan2e 2k1ang kan3k4 2kanl 2k1anna k1ans k2ans. 6kantenn ka3nu 2kanw k2anz. ka2o 2k1apf 3kara 2karb k2ard k2arg ka3r2i kari3es k2ark 2k1arm k2arp3 kar2pf k2ars kar3t k2arta 2k1arti karu2 k2arw kasi1 ka2sp kas3s ka3t2an ka3t4h ka2t3r kat3se 2katt kau2f1o 4kaufr kauf4sp k1aus kau3t2 2kauto 1kä k1äh k1ä2mi k1än kär2 kä4s5c käse3 kä3th 2k3b4 kbe1 kbo4n kby2 2k3c 2k3d2 kdamp2 2k1ec k1eff kefi4 kege2 ke2gl ke2he. kehr2s kehrs3o kehr4st 2k1eic 2k1eig k1ein ke1in2d 2keinh 2k1eise ke2la kel1ac ke3lag kel1au ke2lä kel3b4 2k1e2lek ke2len 2ke3let kell4e kel3s2k k4elt 2k1emp k2en. ken3au kenbu5s4 4ken4gag 2kenlä ke2no kens2k ken5s4te ken3sz k2ente k3enten ken3th k2entr 2k1ents k2entu 2kentw 2keo2 ke2pl k2er. k2erc 4kerfah k4erfam k3ergeb ker6gebn k3er4hö ke6rin6nu kerin6st kerin4t ker4ken k2erko k2erl k3er4lau k3er4leb k6erlebe ker4neu k1ero k2ers. kerz2 ker4zeu 2k1er2zi k6es. ke2sel ke4t1a ke2t3h ket3s ke1up keu6schl 2k1e2x 2k3f4 2k1g2 2k1h4 kho3m ki3a4 ki1ch 2k1i2de ki3dr ki2el kie2l3o ki1f4l ki1f4r ki3k4 2kil2a ki3li ki3lo k2imi k2in. k2ing 2kinh k2ini k2inn ki3n4o kin3s 2k1inse 2k1int ki3or kio4s 5kir kis2p kist2 2kiz ki3zi 2k3j 2k1k4 kl2 4kl. 4kla. k4lar 4k1last k2le 4kle. kle3ari 4kleh k4leid 4k3leit k3lem. 2k3ler kle2ra 2k3leu kle3us 2klic 2klig k2lin k3lip k2lir k2lisc 2klist klit2s 4kliz 2k3loc klo2i3 k4lop klo3s2 klost4 k2löt k1lu kluf2 2k1lüc 2kly 2k1m kmas2 k2n2 3knab k3ne k4nei 2k5ner kno4bl 2k5nor k3nu 3knü 1ko ko2al 2kobj 2k1o2fe koff4 koh3lu ko1i2 kol2a ko3le kol2k5 3kom ko4mu k2on ko3n2e kons4 ko3nu 2kop. ko1pe kop4fen 2kops 2kopz ko1r2a 2k1orc kor6derg ko3ri k2os ko2sp ko3ta kot1s2 kot4tak 2k1ou 3kow ko2we k1o2x 1kö kö2f k1öl 2k1p2 k1q k2r4 2k3rad kra4s3 k3rats 2kraum k4raz 2k3rät 2k3räum 2kre. 2k3rec 2k3rede 2k3ref 2kreg k3reic kre1i2e4 kreier4 k3reih 2k3rh 2krib 2k3ric k3ries 2krip 3kris 3k4ron kro4ss 2kruf krü1b 2k1s k4s1amt k2san k2sau ks2än ksch4 ks1e2b k2s1em k2sent ks1erl k2s1ers k2s1erw k2s1id k2s1in k2s1o2 k3sof ks1pa k3spe ks2por ks2pu kss2 kst4 k4s3tanz kstat4 k4stea k2s1tis k2s1tor k2strä k2stum k2s1u ks2zen 4k1t kt1abs k2t1ad kt1akt k3tal kt1am kt1an k2t3a2r kta4re k2t1au2 ktä5s kte3e kt1ei k2temp k2tent k4t3erfo k2t1erh kte3ru k2tex k2th kt3ho k2t1id kt1im k2t1ing kt1ins kti4ter k2t1of k3top kt1ope k4torga kt3orie kt4ran kt3ras kt4ro kt3run kt3s2 kts4t ktt2 k2tuns kt3z ku1c kuh3 2k1uhr kul2a ku3l2e ku3l2i 2kulp 2k3uml kum2s k2u3n2a kun4s kunst3 2kunt 2k1up. kur2bl ku2rei kuri2e ku2ro kur2sp kur4st ku4schl ku2sp kus3ses ku2su ku2ß 1kü 2küb kü1c kür2s 2k1v 2k1w 2k3z2 kze3l 5la. l1ab la3ba 2labb 4l3aben 2labf 2labg 2labh 4la2bl lab2o l2abr lab4ra lab4ri 2labs 3labu 2labw la1ce la2ce. 1lad lad2i l1adl 2ladm 2l1a2dr 3ladu l1adv 2laf la2fa laf3t la2ga la2gio la2gn lago2 la2g1ob lag5se 2la1ho 1lai lai4s1t la2k1i l2akk la1k4l 2l1al 4lall 4lalp l2ami la3min lam4ma 1lammf l2amp 2l1amt lamt4s la4mun l1anal la2nau 2lanb 3l2and lan2d3a2 lan6d5erw lan6d5erz lan2d3r 2lanf lan2gl lang3s2 2lanhä l2anhe 2lanl 4lanli 2l3ann l1anp 2lans 4lansä 2lantr lan2zw 3lao l1a2po lap4pl la2r1an la2r1ei la4rene 3l4ar3g lar3ini 2l1ar3t l3arti la2ru la2sau 4lasd la5se 2lash 2lasi la2so 2la2sp 3lasser la2sta last1o la2str las3tur la2stü la2ß3 lat2a la3te la4tel 2l3ath la2t3ra lat2s 2lat2t1a lat4tan lat4t3in lat2t3r laub4se lau2fo l2aufz 1laug 2lausl 2lausr 2l1auss 2lauto 1law lawa4 lä1c 2läf 2l1ähn 1länd lär2m1a lä4s5c lä4s3s 4lät 2läub 2läuc 2läue 1läuf 1là 2l1b l3bac l2b1ede l4beta l2b1id l2b1ins lb2lat l3blä lb3le l2bli l3blo l4bre. lb3rit lb2s lb3sa lb3se lb4sk lb3sp lb4st3e lb4sto lb2u l2b3uf lbus3s lbzei2 2l1c l3che lchermas8 l3chi lch3l lch3r lch3s lch3ü lch1w l3cl l3co 4l1d ld3a2b1 l3d2ac ld3ack l2d1a2d lda4g l2d1ak ld1al l3dam ld1amm l2d3a2n l2d1a2r ld3ari l3das l3dat ld1au ld1är l2dei l2dele l3der. ld1erp l2d1e2se l2dex ldi2c l2d1id l2d1im ldo2r ld2os ld2ö2 ld3r l2dran l2dre l3d4ru ld4rü ld3sa lds2t ldt4 ld3th l2d1um ldy3 ldys2 1le 3le. le2ad 3leba leben4s le2bl 2lec le2chi lecht4e 3led 4ledd le3de le2e le3ei lef2a le2g1as le2gau le2gä le2gl leg4r 3leh leh3r2e 4lehs 4leht 3lei. lei2br l2eic l2eid 4l1eig l2ein. leinbu4 leinbus5 l2eind lein4du l2eine lei6nerb 2leink l2eint lei6ss5er l4eist lei4ßer l2eit lei2ta lei8t7er8sc lekt2a 2lektr 3l2ela 2l1e2lek lel3s 3lemes le2m1o2 4lemp l2en. le4nad le2nä 4lendet 2lendu le4n3end 4lenerg l2enf le3ni l2enk 2l1enni l2e2no len4sem len3sz l1ents 2l3entw lent4wä 5lentwet 4lentz len2zi le1os 2lep 3lepa 3lepf 3lepr l2er. l2e1ra le2ra4g le2rau lerb4 4l3ereig le4r3eim le4rers l1erfo l2erfr l2erfü 3lergeh l3ergen lergeschos8 lergescho7sse 3l4ergew 2l1ergi lergro3 lerin4s lerk2 l2erka l2erko l2erle le1ro 2l1er2ö 3l2erra l4ers. lers2k ler3t 6lerwerb l1erz l2erza les2am les2e 2l1esel le3sh lesi1 le3sk les3s leste3 4lesw 2lesy le2tat 2le3th 2leto le2u 4leud 2leuro 3leut 3lev 2lexe le2xis 2lexz 2l1f l3fah lfä4s3 l2f1ec lfe1e l4feis l3f4lä lf3lo l3f4lu lf3ram lf2tr lf4u lfur1 l3fü 2l1g lga3t lgd4 lgen2a lge3ra lgeräu3 l2geti l3go lg3re l3gro lgro3s lg2s lg4s1t 2l1h2 3lhi. 1li 3lia li3ac li3ak li3ar libi3 li1c 3lichem 3licher li3chi 4lick li3d2a li2deo 2l1ido li4ds l2ie 3lie. liebe4s li3ene lie4s3c lie5sse lie4sta 3lig lig4n li2gre lig1s2 li3ke li2kr lik2sp lik4ter li3l lil2a 2lim li3m2a l1imb 3limo li3n2a lin3al 2l1indu li4ned li2nef li2neh li2nep li2nes 2l1inf lings3 2l1inh 2l1in1it 2l1inj lin2k1a link2s li2nol l2ins. l2insa l2insc 2linsp 2linst 2l1int l1inv 2linz li2o li4om lion5s li3os. li2p3a 3lis. li3s2a li4schu 4lish 2l1isl 2l1i2so li2sp liss4 2liß li2tal li3te li1t2h lit1s2 lit3sz li2tur 3liu 2lixi li2za lizei3 4l3j 2l1k lk1alp l3k2an l3kar. lken3t lk2l lk3lo l3k4lu lk4ne lkor2b1 lk4ra l2k3ro l2k3ru lk2s1 lk3sä l3k2ü 4l1l lla2be l2labt ll1aff ll1akt l3l2al l2l1a2m ll3ama lla2n ll2ang ll2anw ll1anz l3lap ll1arm ll1au ll4aufe ll3aug l2l3aus l2l1äm llb4 llch4 ll3d4 l3lec ll1ech lle3en l2l1ef l2legt l2legu ll1eim ll2em l3len. lle4n3a ll3endl ll3endu llen3g l4lents l3ler. lle2ra l4lerfo l6lergen l4lergo ll3ernt ll3ertr l2lerz ll2es l2lex llg4 l4lieg ll1imp l2l1ind ll1ins llk4 ll5m lln2 ll1ob l2lobe l2l1of ll1opf l2l1o2r l3lor. l3lore l2l1ou l2löf ll1ö2se ll3sh ll3s2k ll2spr ll4s3tor ll3t4 llti2m llt5s2 llu2f ll1ur llust6 ll3z2 2l1m l2m3a2b l2marc lmas2 lma3sse lm1aus lm1c lme2e lm3eins l2m1e2p l2m1erz lm1ind lm1ins l2möl lm3p lmpf4 lm3s2z lm3t 4ln lna4r ln3are l3n4e l3ni l1nu l1nü 1lo 3l2ob. lo2ber 2lobj 2l1o2bl l2obr lob4ri l1o2fe lo1fl lof4r lo2gau lo3h2e 2l1ohr loi4r 3lok lo2k3r lol2a l1o2ly lo2min lo2n1o lo2o 2lopf 2lopt lo1ra lo4rä 2lorc l1ord lo3ren 2l1or3g2 3lorq 3los. lo4sa 3lose lo4ske lo2spe loss2e lo4steu lo2s3to lo2s3t4r lo2ßu lo2t1a lo3tha loti4o 2l1ov lo2ve 2lox 1lö lö2b3 2löd lö2f 2l3öfe 4lög l1öhr 2l1ö4l 4löß 2l1p l3pa lpe2n3 lp2f l2p1ho lp3t4 l3pu 2l1q 2l3r2 lra4ss lrat4s lrom2 lrö4 lrös3 lrut4 lrü1b 4l1s l3sac l2s1a2d l3s2al l4s1amb l2sanf l2sann l3sare l2sau2 lsä4s l4schin l4schmü l3se. l2s1e2b l2s1ec l2s1em ls1ere ls1erg ls1erl l2s1ers l2s1erw l3ses l3sex l4sha lsho2 l2s1imp ls2log ls3ohne l4s3ort. l3s2pi ls2po l2spro l3s2pu ls3s2 lst2a lstab6 ls2taf l4s3täti l2s1tis l2stit ls2tr ls1um l2sun lsu3s ls2zen 4l1t l2tab lt1abs ltag4 lt1ak lt1a2m l3tami lt3and lt1ang l3tarb lt1art l2t3ato l2t1au l3te. lt1eh l2t1eis lte4lem lt3eli l3t2en lter3a l3t2erg lt4erö l2t1esk lte3str l3tet. lte2th l2t1eu l2th l4thei lt3ho l3thu ltimo4 l2tob l2t1of lt1op l2t1o2ri lto2w lt1öl lt1ös lt3öt lt4rak ltra3l l3trä lt3räu lt3re lt4rie lt3roc lt3ros l2t3rö l4ts lt3sc lt1spa lt4stab lt5ste lt4stoc ltt2 lt1uh l2t1um ltu4ran ltu2ri lu1an 4lu4b3 luba2 lubs2 lu2dr lu2es 1luf 2l1ufe 2luff luf2t1a luf2t1e luf2t5r lu2g1a lu2g1e2b lug3erp lu4g3l lu2go lu2g3r lug3sa lu2gu 2l1uh lu1id. lu1is. lume2 2lumf 2luml l2ump l1ums l1umw 1lu2n 2l1una 2l1unf 2l1uni 2lunt 2lunw 4lu2o lu2pf 2lur l1urn l1urt 2luse lu2sp lus4s3a lus2s1c lus3sen lus2s1o lus2s3p lus4s1t lus2t lu2st1a lu2stä lu2sto lu3str lust3re lu2s1u 4lu2ß1 lu2t1a lu4teg lu4t3erg lut1o2f lu2top lu2t3r 3lux 2lüb 5lüd lüh1l lüs3 2l1v 2l3w 2lx 1ly ly1ar ly3c 2lymp 3lyn ly3no ly1o lys2 ly3te ly1u 2l1z l2z3ac l3z2an lz2erk lz1ind lzo2f l2zö lz3t2 l2z1u4fe lzug4s lz1w lz2wec 1ma maa2 m1ab m2abe 2mabk m2ab4r 2mabs 2mabt mach4tr ma2ci ma3da ma2d4r ma4d2s ma1f ma2ge. ma2geb ma2gef ma2geg ma2gek ma2gep ma4ges. ma2get ma2gev ma2gew 2m1agg magi5er. magi5ers ma3g4n 2m1ago mai4se 2m1akt mal1ak ma4lakt ma2lan ma4l3at ma2lau mal3d ma3ler mali1 mal3lo 2mallt malu4 ma2l3ut mam3m 2m1anal ma2nau 2manb man4ce. man3d2 man3ers ma2net m2anf 2m1angr m2anh 2manl m4ann m1ans m2ans. 2mansa 2mansä 2mansc 2mantw 2manz ma2or m2app 2m3arb mar3g2 4ma3r2o maro3d 4marr mar6schm mar6schr ma3r2u m3arz 3mas ma1s2pa 4m1aspe ma3sses mas6ses. mas6sest ma6sset ma3s2su mas2t 3maß ma2ta2b ma2tan mat4c ma2tel ma4t3erd mat3se mat1sp 2m1au2f ma3un 2mausg m4ay ma1yo 3mä m1ähn mä1i2 4m1änd m1ärg mä1t4r mäu2s1c 2m1b2 mbe2e mb4l m3b4r mby2 2mc m3ch 2m1d md1a m2d1ä m2dei mds2e m2d1um 1me meb4 m2e1c medi3 medie4 medien3 2medy me1ef mee2n1 mega3 3meh 2m1eif 2m1eig m2eil mein4da meis2 me1i2so m2eist me3lam 3meld me2lek me2ler melet2 2melf. mel2se mel3t4 6mel6tern 2m1e2mi m2en. mena2b me3nal men3ar men3au men3gl me3nor m2ens men4sk men2so men3ta 2mentn 4m3entwi me1o 2meou 2meö 3mer. me1ra me2r3ap me4rens mer2er 4m3ergän 3merin merin4d merin4t 3mers merz4en 3mes me2sal me4sä mes2e 4meser 2me3sh 4m1essa mes6serg mes2s1o mes2s1p meste2 me2str 4mesu 3me2ß1 me3t2a me3th meu1 2m1ex 1mé 2m1f4 mfi4l 4m1g2 2m1h4 1mi mi2ad mi3ak mibi1 mi1ch mi3da mie3dr mi2e1i mie3l mi2er mierer4 mi2et mie4ti 3mig migescho7 migeschos8 mi2kar mi2ki mi2ku 3mil mi3l2a milch1 mil4che 4milz 2m1imp min2en min2eu min2ga mings2 mi3ni 3min2o mi1nu 3mir. mi3ra 3miri 3mirs 3mirw mi2sa mi4scha mi4schn mi4schw mise1 mis4s1c mis4ser mis3si mis4st mi2ß1 3mit1 mi2ta mi2th mi2tr mit3s2 mit5sa mi3tsu mi2tu 4mitz 2m1j 2m1k4 m3ka mk5re. 2m1l2 ml3c ml3l ml3s 2m1m m2mab m2m1ak m2m1al mm1ang m2mans mm1anz m2m1au mmd2 mm1ei mmeis3t mme4lin mme4na m4mentw mme2ra2 mme4rec mme2s3a mm1inb mm1inf mm1inh mm1ins mm1int mmi3sc mm3p mms2 m2mum mm2un mmül2 2m3n2 m4nesi 1mo moa3 2mobj 3m2od mode3s mo2dr 4mog. mo2gal 3moh mo2i3 mo2k1l 2mol. 3mom mom2e 3m2on mo3ne mo4n1er mon3s 3mo2o 2m1ope 2mopt mo1ra mo2rar 2m1orc mor2d3a mor2dr mo2rer mork4 3mos moster4 mo2sto 3mot m1o2x mo1y 1mö mö2c 4mök m1öl 2m1p m2pf mp4f3erg mpf3erp mpf3err mp4f3erz mp2fl mpf3li mpf1or m3pon mp3ta m3pu 2m1q 2m3r2 2m1s m2san ms3and ms1as m3sä msch2 m2s1ef ms1erf ms1erw ms1ini mso2r ms1ori m2spä m2sped ms2por m2spot m2spro ms2pu ms3s2 m4stag m2stal ms1um m2sü 4m1t mt1ab mt1ak m3tam mt1ar mt3are mt1elt m2t1erf m2t1erg m2t1erl m2t1ers m2t1ert m2t1eta m2t1eu m2th mt3ho m2t1im m2t1ins mti2s mtmen2 mt1ös mtra4s3 m4ts mt2sa mt2s1e mt3s2ka mts1p mt1spa mtt2 mt1um mt1urt mt3z 1mu mu1a 2m3uh mu3la 2muls 3mun mun2d1a 4m3unf 4m3ungeb mu3ni m4unk munt2 4munz mu3ra mu4r1u2f mu4s1a 3musi mu2s1o mu2sp mu3s4se. mu3s4ses mus2te mu2s1to mu2str mu2su muße3 mu2t1au muts3 mut2st 1mü 2müb mül4len 3mün mü3ssi 3müt 2m1v mvoll1 2m1w2 mwa2 mwa4r 1my 2m1z mzug4 1na 3na. 2n1ab na2bä 4nabg 4nabh na2bl na2br 4n3abs 4nabt 3n2a2c nach1 na3chen nach3s nacht6ra 4nadd n2ade 4na2dr n1af na1f4r 3n2ag na2gem 3n2ah na2h1a n3ahn 3nai nai2e n3aig n3air 2n1ak na2ka 3nako n2al. na2l1a2 na2lä 3n2ald n4ale na4lent na2let nal3l2a nalmo2 na2lop nal2ph n2als. nal3t4 na2lu 2naly 3name n2amen 4n1a2mer na3m4n 3namo nam2sp 2n1amt namt4s n1an. 4n1a2na 4nanb n1and2 4n1ang 2nanh 2nani 4nank 2nanl 3nann na3no n1anp 2nanr 2n1ans 2nantr 2nanw nap2si n1ar 5nar. na2r1a 2narc n2ard 4narg 3nari n2ark n2arle 2narm n2arp 4n3art na3r2u 3nas n2as. na4schw 4nasp 4n1a2sy nasyl2 3naß 3nat n4ata na3t4h 4natm nats1 nat4sa nat4sc 4natt n1au 4nauf nauf4fr n3aug 5naui 3n2aul 4nausb 4nausg n2auso 4nauss n4auste 4nausw navi5er. navi5ers 1nä 2näb 3n2äc 3näe n1ähn 2n1ä2m 2n1än 2näp nä4sc n2ä4s3s 2näu 3nä1um 2n3b4 nbe2in nbe3n nbe3r2e nbu3s nby2 2n1c n3ce2n3 nch3m 2n1d nd2ag n2d1ak n2danl nd1ann n2d1anz ndat2 n2d1au nd1c nde4al. n2dei nde4län n4d3ents nde4rob nde2s ndes1e ndi2a3 n2dob ndo2be nd1op nd1or n2dö n2d3rat n2d3re n2drob nd3rol nd3ros n2drö n2drui n4d3run nd2sor nd2spr nd4stab nds3tau nd3th ndt4r n2dü4 ndy3 1ne 3ne. ne2ap ne3a4s ne3at ne2bl 2n1ebn 2nec 3neca 3ned ne2de 2nee3 ne2e2i4 ne3ein n1ef neg4 2ne2he. 3nehm 4n1ehr 2n1ei n2eid 4neif 3neigt 4n3eing 4n3eink ne2ke nek3t4 ne2l 3nela nel3b 2n1ele 4nelek 4nelem ne3len ne3li nel4la nel2lä 3ne3l2o 3ne3lu n2em. 2n1emb n1e2mi 2n3emp 2n1ems 3nen n2en. nen3a2 n2enb n2enc 4n1endb 4n1endd 4n1endf n1endg 4n1endh 4n1endk 4n1endp 4n1endt 4n1endw ne2n1e2b nen3ei nenen1 ne4nene 4nengb nen4ge. nen4gen 4nengs 4nengt n2enh ne2ni n2enj nen3k ne2no n2ens nens4e nen3sk 5n2en3t2a n1entb 4n1entl 4nentn 5nentr n1ents 4n3entw 4nentz ne2n3u n2env n2enw ne2ob ne1os 2nepf 2n1epo ne2pos n2er. ne1ra ne2ra2b ne3r4al ne2r3am ne2ran ne2rap ne2rau 4nerbe. 4nerben n1erbi nere2 ne2reb n1erf 4n5erfo nerfor4 2nerfü 3nergr n1erh 2n3erhö 3neri n1erk n2erli 2n1erlö nerma3 nermas4 n1ermä ner4mit n2ern. 4n1ernt ne1rös n2erp 3n2ers. 2n3ersa ner8schle n2ert. n1ertr ne2rup n2erv 2n1erz 3n2es n4es. nes2c ne2sei ne2sev nesi1e ne3ska nes1o ne2sor ne2s1p 4n3essi ne2tad ne2t1ak ne2t1an ne2tap n1etat ne2tau ne2th net3ha nett4sc n1e2tu net2zi ne2u neu1c neu3g 2n1eup n2ew 2n1ex 3nez 1né 2n1f nf1ak nf2ä nfä4s nff4 n3fi nfi4le. nf4l nf5lin nflös4 nf2o nf4r nft2o nft2s3 nft4st n2f1u 4n1g n2g1ac ng1ad n2g1ak n2g1a2m n2g1and ng2anf ng1anz n2g1äl ng3d4 n3gef n2g1ein ng2en ngen2a ngens2 n3ger nge4ram n4g3erse ng6es nges2t nge4zän ng3g4 nggeschos8 nggescho7sse ng3hu n2g1i2d n3gläs n2glic n2glo n3g2loc n2glö ng3m n2gn ng3ne ng1or ng3rat ng3roc ngro3s ng2s ngs1c ng4s3e4h ngs3pa ng3ts n2gum 2n1h2 n3han n3har n3hau n3hä n3he nhe2r n3hu 1ni 3nia nib4l nibu2 nich8ters n1id ni2de ni3de. ni3dr n4ie nie3b ni1el nie3l2a nie4n ni3ene ni1ero nig2a 2n3i2gel nig3r ni2gre 3nik ni2kal ni2kar ni3ker ni4k3ing ni3kl nikma3 ni2kr 3n2il nim2o 4n1imp nin1 3n2in. n2in4a 4n3ind 2ninf 3n2ing4 4n1inh ni2nor 2n1ins n2ins. 4ninse 4n1int 2n1inv ni2ob ni3ok ni3ol n2ip ni3ra 3n2is ni4schw ni2s1e ni2s1p ni3spi nis5s2 ni2stu ni3stun ni2s1u 2nit ni1th ni2ti ni3t4r nit2s ni3tsc nit4tec nitt4sa ni3tu ni3v 3nix n1j 2n1k n2k3ad n2k1ak n3k2al n4k3alg nk2am n2kans n2kau4s n2käh n2k1är n4k3erfa nk4erg nk1inh n2k1ins nk3len nk3les n2klie nk2lo nk2lu nk3lun nk4na n2kne n2k1ort nk2öf n2köl n2k3ro nk2sal nks2ei nk3s2z nk2tak nk2tan nkt1it nk4top nk2tru 2n3l2 2n1m4 nmen2s 4n1n nna2be n2nada n4n1all n2n1an n2nau n3nä nn3d nnen3g n4nents nn2erh nn2erk nne2rö4 n4n3er4wa nner2z nne2s1e nn2ex nn3f nng4 n3ni n2nof nn1o2r nn3se nn3s2p nn2th n2n1uf n2n1unf nn1ur 1no 3no. 3nobl no2bla n2o3ble 2n1obs no1c 2no2d no3dr n1of 2n3o2fe n3ole no2leu n2on. 3n2opa 3nor. nor2a no2rad no1rak no3ral 2norc nor2d5r 3norh 3norm 3nors n1ort 3n2os. no3sh no2sp no4ss n2oste nost1r 2nostv no3tab no2tä no4t3ei no2tel no3t3h no4tha no2t3in no2t1op no2tr 3nov 3now 2n1o2x 3noz 2nöd 2nö2f 4n1ö4l nö4s3s 2n3p4 npa2g npsy3 2n1q 2n3r2 nra4s3s nräu3s nre3sz nrö2s1 6n1s n2s1a2d n2sall n2sang n2sant n2saus n3sav n2s1än nsä4s n2s1äus ns2ca n6schef n4schro nsch7werd ns1eb ns1e2d nseh5ere n3senk nsen4sp ns1ent n2s1ep ns1erf n4serfo ns1erg n2serh n3seri n2s1erk n2s1erö ns1ers n2s1erw n2s1erz nse2t n2s1eta n3sex nsfi4l nsho2f n2simp n2s1ini nsi2te nsi2tr ns2kal n2s1op n4s3ort. nsp4 nspas2 n2spat n2sph ns2pi n2spo ns3pon n2sprä n4s3prie n4spro ns3s2 ns2t1ak n4stat. n4s3tate ns2tau n5s4te. n4st3eif n5s4tel ns4tem. ns4ten. n4stent ns2ter ns4ter. nst4erö ns4tes. n5steu nst5opfe ns2tor n4strac ns2tum nst2ü nstü1b n2sty ns2um n2s1un ns2ung ns2unr n4s3zi 2n1t nt3abs n3t2a3c n3t2al nta3m n4tanza nt2arb nt1ark nt2arm nt4at nt1äm n2t1äu n3te. nte3au nte2b nt1ebe nte1e nte3g6 nt1eh n2teig n3t2en nt4ene nten6te. n3ter nt4ern nt4ers nt4ert n2t1ess n3tet nteu3 nte3v nt2her n2t3ho n3thr n3t4hu nti3k4l n2tinf n2t1inh ntini1 nt2ins n3tit ntmen2 ntmo2 n3to nto3me nton2s1 ntras3s nt3rec nt3reif n3trep nt4rig n3trop n2t3rü n4t1s nt3sa nt4sau nts2o nts2p nt4s3par nts2t nt4sto 3n4tu. ntum2 ntu2ra ntu4re. ntu4res nt3z2 1nu. 1nu1a nu3ar nubi1 1nuc 1nud 3nue nu2es nuf2 nu2fe 1nug 2n1uh 1nui nu3k4 n2um. 2n3umb 2numf 2numg 3numm 2numr 2n1ums 2n3umz nu2n 2nuna 1n2ung 3nung. n3ungl 2n1uni 2nunt 1nuo 2nup 2nur 3nu2s nu3sc nu3se nu3sl nu4s1t 1nu2ß 1nut nu2t1a nu2t3r 1nuu 1nux 1nuz 3nü. 2nü4b nür1c 3nüs 1nüt 2n1v2 n3ver 4n1w nwei4st 2nx 1ny. 1nyh 2nymu n1yo 1nyr 1nys 1nyw 2n1z n2zad n2z1a4g n2zan n2z1au n2z1än n2zär nz1ec n4zense n4zentw n4zentz nz3erwe nzi2ga n2zinh nz1ini n2zor nz2öl nzug2s n2zurk n2z1wa n2z1wä n2zwö n2z1wu ño1 2o3a2 o4abi o4ac oa3che oa3chi o4ad oa3de oa4g o4ah o4a3i oa3ke oak1l o4a3la o4a3mi oanne4 o2ar o2a3s 3oase oa4si o4at oa3te o5au o1b ob2al 2oban o3bar 2o3b2ä 2obb ob2e 2obe. 2obea ob3ein 2o3b4en oben3d4 oben3se ober3in4 obe4ris 2obew 2o3b2i obi2t ob3ite 1obj ob1l o2b3li 2o3blo 2o3bo o2b3re o3bri ob3s2h ob3sk obs2p ob2sta 2o3bu obus3s 2o3bü 2oby2 2oc oc1c o1ce och1a ocha2b o1che oche4b o2ch1ec och1ei ocher4k och3l och3m och1o och3ö2 och3r ocht2 och3te o1chu ochu2f och1w o1ci ock2er ock3sz o1cl o3co o1ç o1d o3d2a od2dr o3deb ode2c o3d2e1i odein3 ode2n1 odene2 o3dex 2o3dia o3dir o3div o2don odo4s 2odr o2dre odt4 2o3du 2o1e oe2b o2ec oe2d oe2h oe2l oe2n1 o4es o2et o3et. o3ets oe2x o1ë 2ofa of1ac of1am of1au o2f1ei of2en o3fer of2f1a of2f1in of2fir 1offiz of2f5l of2fo of2f3r offs2 of2fu 2ofi of3l of1la of4lä of4lö 2ofo 2o1f1r of3ra of3rä of4rü ofs1a of4sam of2spe of2spr of2s1u 2oft of2tei of3th 2o1g o2g1ab oga3d og1ala og1ang o2g1ei oge2l1i ogenmas6 o3gh ogi2er og2lo o3g4n ogoi3 og2s2 og3sc og3si og3sp o1ha o1hä o1he o2h1eis o2h1ert o2h1erz o1hi ohl1a oh3lec ohl1ei oh3lem oh3len oh3lep oh4lerg oh4l3erh oh4lerw oh3lo ohls2e oh2lu 3ohng oh2ni 1ohnm oh2n1o o1ho oho2la oh1o2p o2h3ö ohr1a oh4rin oh1ro oh3t o1hu oh1w 2o1hy 2oi o1i2d o3ie o1im oimmu4 o1in oi2r o2isc o3isch. oi3se o1ism oiss2 oi4st 2o1j 2o1k oka2la okale4 3o2kel oki2o ok1lä ok4n 4okr ok2s1p okt4 2ol o1la o2lab o2l1ak ol2ar ol1auf o1lä ol4dam ol4dr ole3e ol1eie ol1eis oler2 ol1ex o1lé ol2fa ol2fl olf1r ol2fra ol2gl ol2gr ol2i oli3k4 oli3tu ol2kl olk3r ol2kre ol2lad ol2lak oll3ans ol2las ol2lau ol2läd ol4l1ec ol2l1ei ol2l1el oll5ends ol4lerk oll5erwe o3lo ol2of olo1p2 ol1ort ols2t ol2str o1lu 3oly 1olym ol2z1a ol4z3ern ol2zin ol2zw 2om o2mab oma4ner om2anw om1art o2m1au o2meb ome3c o2m1ei o3m2eis o2mel o3men. o2mep o2meru om1erz om2es omiet1 o2m1ind om1ing o2m1int om3ma om1org om3pf oms2 omtu3 o4munt omy1 2ona ona2b o2nae o3nal on1ap o2narb on2au on3aus 2onä onbe3 2onc onderer5 2one one2i one2n1 onen3g o2n1erb o2n1erd on1erg on1erö o3nett on3f2 on3g2l ong4r ong3s 4o3ni on2i3d o4nikr o4n1im on3ing on3k2 onli4n onlo2c on3n2an on3n2e ono1 o3nod o2noke on1orc ono3s ons1a onsa4g on2seb onse2l on4sh onsi2d ons3l ons1p onst2h on3t2a on4t3end ont3erw ont2h on2t3ri o1nu 2onuk on3v 1ony on3z o1ñ oo2k3l o1op o1or oor3f oo4sk oo2tr 2o1ö2 o1pa opab4 o2p3ad op3akt o1pec o1pei o1pe4n 2opf. op2f3a op3fah op4ferd opf5erde opf1l opf3la op1flü 4oph2 o3phe o1pi opi5a4 opi3er. opi5ers. opin2 op5lag o2p3le op3li 2o3po op4pl op2pr 2o1pr 1opsi op3sz 1op3t4 o1q 2or. or1a or3a2b 2orak 2oral o2r3alm or4alt 3or2am or2and o2ranh or3arb o1ras or3att o3rä or1änd or1ät or2bar orb2l or1c 2orca or2ce 2orda or2d1am or2dau or4d3eng or2deu or2d1ir or2dit 1ordn or2do 2ordr 2ords or2dum 2ordw 4ore ore4as o2r1eck o2r1ef ore2h or1eig o2rein or1er o2rerf or1eth 2orf or2fle or3g4a 2orget or3g2h 2orgia orgi1e or2gl or3gle or2gn 2orh 2o3ric o4rient o3rier 4oril 4orin1 2orit ork2a or2k3ar ork3s 2orm or4mans or4ment or5ne. or3n2o 2o1ro oro3n2a 2o1rö 2orq 2orr orr4a or3rh 2ors2 or3s4a orsch5li or3sh or3si or3sz or2t1ak or2t1an or2t1au or2tär or2tef ort3eig or4t3ent or4t3ere ort3erf or2t3ev or2the ort3ins or4t3off or2tor or2tö or4trau or4t3räu ort3re ort3ric or2t1um o3ru or2uf o4r3un orus3 o2r3ü o2rya o1s 2o3s2a os3ad os4an o3sche 2o3se ose3e o2s1ei ose2n o4sents 2osh o3s2hi 2osi o3sk o4s3ka o4ski 2os2kl 2os2ko os2lo 2oso 2os1p o2s3per o3s2po os2pr os2sa oss3and os4sä o6ssel o3ssem oss3en4k o3ssent oss3enz os2s3o os4son os2s3p os4s3t os2su os2t ost1a o2sta2b o3stal. o4stam ost4art osta4s o4sterd oster3e ost5er6we ost3h o2stin ost1ob o4s3ton. ost3ran o2st3rä ost3re ost3rot ost3uf 2osu4 2o3sy o3s2ze o2ß1el o2ß1en2k o2ß1enz o2ß1ere o2ß1erf oß3t 2o1t ota2go o3tark o2t1au ot3aug otau4s o3t2ax o2teb o3t2e1i otei4n ote2l1a ote4lei ot4em3 otemp2 o2t1erw 4ot2h ot4he ot5hel o4t3hi ot3hos o2thr o2t1i2m ot2in o4tl otli2 ot4ol ot1opf ot2or oto2ra o3tra o2t3re ot3rin ot2sa ots1p ot2spa ots2t ots3tri ot4terk ot2th ot2t3r o2u oub4 ou2ce ou1f4l oug2 ou2ge ou3gl o3uh ou4le. o3um o3unds oung5 oun4ge. oungs2 o4up 2our ouri2e our4ne. ou3s2i ous2t outu4 2ouv 2o1ü o1v 2ovi oviso3 2ovo 2o1w o3wec owe2r1 o3wi o1x ox2a ox2e 1o2xid ox3l o2xu 1oxy o1y2en o1yo 2o1z oz2e ozen4ta o3zi ozon1 órd2 ö1b öbe2la öbe4li öb2l ö2ble ö2b3r 2öc ö1ch öch1l ö2chr öchs2t öch4str öcht4 ö1d ödi3 ö1e 1öf öf2fl öf3l ögen4s1 ög3l ög3r ög2s ö1he öh3l2e öh3ri öh2s ö1hu ö3ig. ö1ke ö2ko ök3r ök2s 3öl. öl1a2 öl1ei öl1em öl2f1ei öl1im öl1in öl2k3l öl3la öllma4 öllmas3 öl2nar öl1o2 öls2 öl3sa öl3sz ö2l1u öl2ung ölz2w öm2s 2ön ön2e ö3ni önn2e ö1nu öo1 ö1pe öpf3l ör3a2 ör1c ör2dr ö2r3ec ö2r1ei ö2r1e2l ör2erg ö2rerl ö3r2erz ör2f3l ör2gl ö2r1im ör2kl örner2 ör1o2 örs2e ör3s2k ört2e ör2tr öru4 ö2r1une ö1s ö2sa ö2scha ö4sch3ei ö2schl ö2sch3m ö2schw ö2s1ei ös4en ös4es ö2sp ö3s2s ös4s1c ös3ses ös3set ös4st ös4t ö2sta ös4u ö1ß 2ö1t ö2t3a öte4n3 öt2h öt2sc öt2tr ö1v ö1w ö1z öze3 özes4 p2a 1pa. 1paa 1pac pa3da pa2dr pa2el pa1f4r pag4 pa3gh pa1ho 1pak pa1k4l pak2to 1pala pala3t 1palä pa3li 2palt pa2nar pan3d pan4ds pa3nei pa2neu pan3k4 2panl 3pa2no pan3sl pant2 3panz4 1pap papi2 papieren8 papie8r7end 3para pa2r3af par3akt 1parc pa5reg pa5rek 2par2er 2parg pargel6d 1park. par4kam par4kau par2kl par2kr 1paro 2parp 1partn 1party par3z2 pa1s2p pa2ßu 1pat pat4c pat4e2 pat4r 1pau p3auf pa3uni 1pä 3päc 3päd 3pär 3pä4s3 pä4t1e2h pä4t3ent pät3h pä2to pät3s 2p1b pbe1 2p3c 2p1d2 pda2 p2e 1pe. pe2a pea4r 1ped pe2en pef4 pei1 2peic pe1im pekt4s 2peku 1pel pe2l3a4 pel3d pe2let pe2lex pe3li4n pe4l3ink pel3l4e pel3li 1pem pena4 pe3n2al pen3da pe4nen 1penn pe2n1o pens2 3pensi 1pensu pen3z2 1pep pe1ra per2an 1perl per4na 3pero per2ra perr3an per4rä per6rieg 3pers perwa4 pe3sa pes3s2 3pet 1pé 4pf. p2f1ab p2fad p2faf pf3ai p2f1ak pf1ans p2fa4r pf3are p2f1au 4p3fe. p2fei pf1eim pf1ein p3fen. p2fent p3fer. pf2erw p3f2es pff4 p2f1ins p2f3lä pf3lei pf3lie pf3lo pf3lu p2for pf3r pf1ra pfs2 pf3sl pf3sz pf3t 2p1g pgra2 1ph 4ph. ph2a 2phä 2phb 4phd 2p1hei phen3d2 phen3s 2ph1ers 2phf 4phg phi2ka 4phk ph2l 2phm 2phn p3hop 2phö ph4r 2phs ph3t2 2phthe phu4s 2p1hü 2phz pi2a3 pi3as. pi3chl p4id piegelei8en pi2el piela2 3pier pie3t 3pik 1pil pi3le pil4zer pin2e pingen4 ping3s 3pinse pi2o pi3oi pi3onu 3pip pi2pe pi3ri 3pirin 3pis 4piso pis2t pi3t2a pit2s pi2z1in p1j 2p1k2 pku2 pkur1 1p2l4 2pl. 3p4la p5lad plan3g 3plä 2ple. ple1c p4leg p4lem 3ple5n4 2plig p4lik p4liz p4lo 2p3lu 2p1m2 pma1 2p1n 1p2o po3b4 po1c 3pod 2p3oh po2i po3id 3poin 3pok 3p4ol po2lau po3li po4lor 2pond 2ponn po1o2b po2p3ak po2p3ar po1pe po2pl po3pt po1ral po1rau 2porn por4tin por4tre por4tri pos2e pos4t po2sta post3ag po2stä po4st3ei post3ra po3ta 3pote po2t1u po2w po3x pö2bl pö2c 2p1p p2p3a2b pp3anl ppe4ler ppe2n1 p2p1f4 p2p1h p3p2ho pp3l pp5lan pp1lä p2ple p2p3ra p2p3re p2pri pp3sa ppt2 p2r2 1prak pra4s3 1prax p4rä 1präd 1präg 3präm 3präs 2pre. 2prec 1pred pre2e1 1prei 3preis prei4ss 2p3rer 3p4res 1preß pri4e 2prig 1prinz 1p4ro1 3prob 2proc 3prod 3prog 3proj 2pros3s 3prot 1prüf 2prün 2p1s 4ps. ps4an p3se p3s2h ps1id p2sö ps2po ps2te p2st3r p2stu 3p2sy ps2ze 2p1t pt1a pt2ab pt3alb pt3at p3te p4t3ec p4t1ei pte4l p4tele p4t1ent pt3erei p4t1erw p4t1erz p2th pt1in1 pto3me p4tos pto2w ptpo4 p2t3r pt1s2 ptt2 pt1um p3tung pt1urs p2tü4 3p2ty pt3z 1pu pu1a pub4 2puc pu2dr 2p1uh pul2sp 2pund pun2s 2punt 2pur 3put put2s 1püf 2pül pün2 2p1v 2p1w pwa4r 3py1 py3t 2p1z qu4 1queu qui3s 1ra. ra2ab 2r3aac r3aal ra3ar r1ab ra2bar rab2bl 2rabd 2rabf 2rabg 1r4abi ra2br 2rabs 2rabt 2r3abw 1raby ra1ce 2r1acet ra4cheb ra4chin racht3r rach6trä ra2chu r2ack 1r2ad r4ad. rada2 ra2dam 2radap 3radf 3radl r3a2d3r rad3t 1rae r2af raf3ar ra2fer ra3ge ra3gle ra2gn 3r2ahm 4raht 2raic rail4l 2r3air 1rake 3ra1k4l ra2kre ra2kro 2rakti 3rakü r2al r4al. ra2la4 ral3ab r3alar ral3b 3r4ald ra3le 2ralg r4ali rali5er. rali5ers ralk2 ral3la rall2e 2rallg 2r3alm. r3alp. 2ralpe r4als r3al3t r4alt2h ra2lu 3raly r2ame ra2mer 1r2ami r2amm ram4man ram6m5ers ram4m3u ram2p3l 2r1amt ramt4s r2an. 4ranc r4anda r4ande ran4dep ran4d3er 4r3anei r4aner 2ranf 1rangi rani1e ran2kr 2ranl 2r1anm 2r1anp 2ranr r2ans. r2ansp ran4spa 2rantr 2r3anw r2ap 2rapf r1ar r2ara 2rarb 3rarei rar3f4 ra2r1in r2ark r2arp 2r3arz r2a3s2 r4as. ras4a ra4schl ra5se ra5si ra4sk 2r3asph ra4ssi 2raß 1rat r4at. ra2t1a ra3ta. ra3te r3atl rat4r rat2st 2r3atta 4rau. 3raub. 4raud rau3e2n 2rauf 2raug r2auh 3raum rau4m3ag rau4man rau2mi 3rausc 2rausg rau2sp 2rauss rau4sti raus3tr raut5s 1raü r2ax raxi4s1 räch4s 3r2äd 4räf 4räg 2räh 2räm 3rän. 3räni 3räns 2r1är r2är. rä3ra rä4sa rä4s5c rä5sse rä2st 3rätse rä2u räu2s räu5sche 4räut 2r1b r2b1ab r2b1a2de r2bak rbal3a rba3re rb1art rb1auf rbb2 rb1ech r4belä rb1ent rbe3r2e r3b2la rbla2d r8blasser r4b3last r3blä r2ble. rb3ler rb2lin rb2lö rbmas3 rb2o rb4ri rb2s rb3se rb4sei rb3ska rbs1o rb3sp rb4stä rb3str rb2u 2rc r1ce r1che. r1chen r1chi rch3l rch3m rch3r rchs2 rch3sp rchst4r rch3ta rch6terw rch1w r1ci r1cl r1ç 2r1d r3d2ac r2daf r2d1ak r2d1al rdani1 rd1ant rd1anz r4dap r2dei rd2ei. r2d1elb r3den rden3d2 rden4gl rde3re rder4er rderin6s r4d3ernt rde3sp rdi3a2 rdia4l r2d1inn rd1it rdo2be r3don rd1os rdo4st r2dö rd3rat rd4ri rdrü4 rdt4 rd3ta rd3th rdwa4 1re 3re. re3aler re2alt re2am re3as re3at. re3ats 2reä re2b1a re2b1l reb1r reb3ra re2bü r2ech rech3ar 4rechs 2reck. 2recki 4redd 2redit re1el re1er 3refe 4reff 3refl 3refo 3reg 5reg. rege4l3ä re2hac re4h3ent re2h1i rehl4 re2h1o r2ei. rei4bl r2eie 2reig 3reigew rei3l2a rei3l2i reim2p r1ein rei3nec 4reing r3eink 4reinr rein8s7tre re1in2v reister6 reis5tro 3rek 4re2ke re3la 2r1elb rel2e relea4 re3lei 2re2lek 2r1elf re3lo 2r1elt relu2 r4em. r2emi 4rempf 4remu r4en. r2ena rena2b re3nal re2nä 3rendi ren3dr re4n3end ren4gl 2rengp re2ni ren4nes r1ense 2r1entl 2r1ents 2rentw 4r3entz r2enz re3or 3repe 3repo 4repp 3r4er. 2r1erb r2erbr 2r1erd r2erer r1erf r1erg r4ergen r1erk 4r3erken r2erki r1erl 4r3erlau 2rerlö 2r1erm rer2n 2r1ernä 4r3erns 4r3ernt r2e1ro re2rob r1erö 3r2ers. 2r1ersa r2erse 2rersp r1ert r2erte 2rertr 2r1erz rer5ze r2erzy 3r4es. re2sa res3an 3rese 3reso 2ress ress2e res6s5erw 3rest res3tem re2stu 3resu 2re2ß1 re2thy re2u reu3g2 2reul re3uni 2r1eur 2reü 2r3evid r1ew rewa4r re2wi 2r3e2x1 3rez 4rezi 1ré 2r1f rfall4s rf1ält rfä4s3 rf2äu r2fent rf2es rfgeschos8 rfgescho7sse rfi4le. rf3lic rf3lin rf4lö r3flü r3for rf4ru rf4rü rf2sa rf2s1ä rf2s1id rf2s3pr rf2ta rf3t4r rf2u 4r1g r2g1a2d r2g1ah r2g1ak rg2an rga5ssen rgas2t rga4str rge4an rge2bl rge4l3er rgen4z3w rge4ral rge4tap r2geto rgi4sel r2glan rgleich8s7 r2gleu r2glig r2gno r2g1ob r2g3ral r2greg r2gres r2gret rg3rin rgro5sse rg1s2p rgs2tr r1h4 2rh. 2rha r2ha. 2rhä 3r4he. 3r4hen r3her r2hoe rho2i3 2rhol 2rhö 2rhs 1ri ri3am ri3at rib2bl ri1ce ri1cha rid2 ri2dan 2ridol r2ie rieb4s3t rie2fr ri1el riene4 rie2nu ri1er. ri4ere ri3e4sti ri1eu ri2f1a ri2f1ei ri2fer ri2f1o ri2fr rif4ter 3rig 5rig. 5rige ri4gene 5rigj rig1l 4rigr rik1l ri4kla r2imb 2rimp rim2s r2i3na 2r1ind rin4dex rin4diz ri3n4e rine1i 2r1inf rin2fo ring3l rin2gr 2r1inh 2rinit 2rink 3rinn 6r5innenm 4r3inner 4rinnta r1innu 2r1ins 3r4ins. rin2so rin2sp r4inspi 2rint rin4teg rin4t5r r1inv r2inva 2rinve 4r1ir r2is ris4a ri4scho ri4schw 3risik rismu2 ri3so ri4s1p 3riss ris3si rist5ers ristes4 ri6stess ri2ß1 r2it r3i2tal ri3t2i rit4r rit2tr 5ritu rix1 1rí 2r1j 2r1k rk2am r2käh r3klau r2klis rk4lo rk2lu rk4n r2k5nu rk3räu r2k3rea r3kri rk3rin rk2s1e rk3sen rk2sp rkstati6 rk4stec rk4s1ti rk2ta rk4t3eng rk4t3erf rkt3ers rk6tersc rk4t3erw rk2tin rk2t1o2 rk2t3r rk3tra rk1uh rk2um rku2n rk1uni rkus3s rku4s1t 4r1l r3l2a rl2e rle2a r3lec rle2i rle2st r3let r3l2i r3l2o rl2ö rlös5s rl2s1p rl2s1to rl3t rlu4str 4r1m r3m2ag rma2la r2m1ald rm1anz rm1a2p r2maph rma5ssen rmas8sens rm2är rm3d2 r3me. r2m1ef r2meo rm2es r2mide r2m1im r2m1o2ri rm3sa rms2t rm3sta rmt2a rm2u rm3ums 4rn rna2b rna4n rn2and rn3ani r2n1anz rn2a2r rn3are rn3ari r2nau r3näp rn3d4r r3ne rn3e4ben r4nef rn2ei rn3eif r4n3eis rne2n r4n1ene rn3ense r4nerf r4n1erg rn4erhi r4nerk r4n1ert r5nes rn2et r4nex rn3f rng2 r3ni r4n1in r3nod r2n1op r2n1or rn1ö r1nöt rn3s2ä rn3s2p rn3s2z rn3t2e r1nu rn1ur r1nü r1ny ro2bei 2robj 1robo 2robs ro1ch 3rock. r2o3de ro3e4 roh1l roh3na 3r2ohr 3roi ro3le rol4lan rol3l4en 2roly 4rom. ro2mad ro2mer 4romm 4romt r2on 3ronn rons2 ron4tan ro1ny ro1pe 2ro2pf ro3ph r1or r2ora ror3al ro2rat ro2rei ro2r1o ror3th ro3sh ro3s2i ro5smo ros2p ros6san ross1c ros4t ro3st2a ro2st1r ro2ßu ro4tag rote3i ro2tho ro2tri rot1s2 rot2ta ro3t2u ro3unt 3rout rö2b3l rö2du 2röf 4rög 1r2öh r1ök 1r2öl 3römi 4röp r1ör r2ös. r2öse 2r1p2 rp4a rp4e rpe2re rpe4r3in rpf4 r2pli r3po rpo4str rps1t rp3t r3pu r1q 2r1r rr2ab rr2ar rra4s3s rr1äm rrb2 rr1c r3r2e rre4ale rrer4s r4rew rr2he rrik2 rr2n3a rr2o r2r3ob rro3m2 rr2th r3ru r3r2ü rrü1b 4r1s rs3ab r2s1a2d r4samp r4s1amt rs2an r2s3ang rs3anp rs3ar r3sch2e r6scherl rsch2l rs1ebe r2sein rse2n1 rs2end rse4ne rs1ere rs1erö rs1ers rs1erz rs1eta r3sho rs2kal rs2kan rs2kie rs2kis rs2kl r4sko r4skr r4sku rs3l rs4no r2s1op r4s3ort. rs2p4 rspa3s2 r2s3ph r4s3s2 r5stad r4stant rs2tau r6st5eing r6sterbt r4st3er4w rs2th rst3ing r2stip r2s1tot rs2tr rst3ran r6strang rs2tu rsü3s r3swi 4r1t rt1abs r2t1alm rtals1 rt1am rt1ang rt1ann rt1ant rt1anz r2t1ar rt3a4re r2t3att rt1är r3te. rte1e2 rt4eif rtei3la r2telf rte2n1 r3ten. rt3erei r4terfo r4t3erh r2t1erk r4t3er4la r4t3erle r4t3ernä rter4re rt1ers r3tes2 rte3sk r2thi rt3hol rt2hum r2t1id r2t1ima r2tinf rto1p rt1or rto2ri r2trak rtra4s3 rt3rec r4treis rt1ros r4ts rt4s1eh rt1spe rtt4 r2t1urt rt3z 1ru ru1a ru3a2r3 rube2 rude2a ru2dr 3ruf ru2fa ruf2s1 4rug 2r1uhr 3ruin ru1ins ru1is 2rum 4rumf ru2mi 4ruml r2ums. 4rumz 2r1una 2rund run2d1a r2unde rund3er run6derl run6ders run6derw 2r1unf 2rungl 2r1u2ni 4r3unio run2kr 2r1unl 2r1unm 4runn 4r3unt 2runw ru3pr 4r3ur ru2ra ru2r1e 5ruro ru2si rus3sen rus2s1p rus6s3t 3rut rut3h ru2t1o2 ru2t3r 4ruz ru2zw 1rü 2rüb rü1ben rü1ch rücks2 4rümm rü3s2s rüs3si 2r1v rve4n1e rve5s rv2s 2r1w rwun3s 4r1x 1ry ry2c 2r1z rz1ac rz2an r2zar r2zas r5zene rz1eng r4z3ents r2z1erf r2z1erg r2z1erk r2z1erw rz1id r3z2of rz1op rz2ö rz3te rz2th rz2t3ro rzug2u r3zwä r3z2wec 1sa 3sa. 3saa 2s1ab sa2be 3sabet sa2bl sa3ble sa2br 4sabs sa2cho2 sach3t 2s1ada s1adm 2s1a2dr sa2fe 2s3aff 3safi sa1f4r 3sag sa4gent sag4n 4s1a2gr 3sai sa3i2k1 sail4 2s1ak sa2ka 3saki 3sakr 4s3akt 3sal. sa4l3erb sa2l1id s1all 3salo sal2se 2s1alt 3s2alz 3sam s3ameri 5samm 6s1amma 4s1amn s1amp sam2to s1an s2an. 2s3a2na 2s3anb s2an2c s2and s4and. san4dri 3sang. sang4s 2s3anh 3s4ani 2s3anl 2sanp 2s3ans san4sk 4santr 2s3anw s3anz 2s1ap sa2po 3sapr 2s1ar 3s4ar. 3s2ara 4s3arb 3s2ard 3sari s3arr 3s2ars 4sarti s1a2sp sas6sest 4s3a2sy 3sat sat2a 4s3ath 4s3atl 4satm sa2tr sa3ts sat4z3en s1a4u 3sau. 3sauc 3saue 2s3aufb sau2gr 3saum 3saur sauri1 2s3ausb 3s2ause 2s3av sa2vo 3säc s3ähn 3säl s1ält 2s1äm 2s1änd 2s1är sä2s3 3s2ät 1säu 2säuß 4s3b4 sba4n sbe3r2e sbus3 1sc 2sc. 2scam s2cap 4scar 2s1ce 6sch. 3schaf 2schak s2ch2al 4schanc 4schang 5schanz 4schao s2chau 3s2chä 2schb 2schc 2schd 3sche. sch3ei. 4schemp sch2en 3sches 4schess 4schex 4schf 2schg 2schh schi4e s4chim 3sching 4schiru 3schis 2schk 4schle. 6schlein sch6lit 2schmö 2schn. 2schox 3s2chö 4schöl 4schp 2schq 4schre. 4schrin sch3rom 4schrou 6schs2 sch3sk 6sch3t scht2a scht4r s4chu 4schunt sch2up 5schü 2schv 4schwet sch4wil 2schz 2scj 6s1cl 2sco 3s2cop 3sco4r s2cr 2scs 2scu 4s3d2 sda3me sdien4e sd4r 1se se3at. seau4 2s1e2ben seb4r 2s1echo s1echt 2s1eck 3see se1ec se2e1i4 see3ig seein2 se1er. se1erö 2s1eff 3seg se2gal se2gl seg4r 3s2eh se2h1a4 se3he se4h1ei se4hel se4herk se2hin seh1l seh3re seh3s seh3t se2hüb 2s1ei. 2s1eig s1ein 5s2ein. 2seinb sein4du sei3n2e sein4fo 2seing 2seinh 4seink 2seinl 2seinn 2seinr s4eins. 4seinsp 4seinst 2seinw 4s1eis 5s2eit 3s2ek s2el. se2l1a se3lad sela4g se3lam 3selb sel1ec 2selem se4l3erl sel3ers 2self. s3elix se2l3ö s2els sel3sz sel3tr s4e3ma 2s1emp s2en. se4nag se2nä 3sendet 4s1endl sen3gl 5s2eni 3senku se2no se4nob s2ens s2ent. 2s1entf 4s3entg s2enti 2s1ents 2sentw 2sentz se2n3u 3senva seo2r 4s1e2pos 3seq s4er. se2r3a2d se2r3al se5ref s3ereig se4r3eim se4r3enk ser2er s1erfo s2erfr s3erfü 4serfül ser3g s1ergä s2ergr s1erh 5serie s3erken s1erkl 3serl. s1ernä 2s3ernt se1rot s3eröf s2ers. 2sersa s4ert. seru2 se4r1uf se3rum se3rund 3s4erv se2sel 2sesh se3su 2se4tap se2tat s1e2th 3setz se1u2n 2s1ex se2xe 4sexp sex3t 6s3f4 sfal6l5er sflo4 4s3g2 sges2 sgro3 2s1h 4sh. sh2a 3s2ha. sha2k 4s3han 4shc s3h2e 3shi. 3shid shi4r 4shk sh3n 4shof 3shop sho4re 3show sh4r 4shs 4sht 4s3hü 1si si2ach si3ach. si2ad si3am. sia4s 2siat sib4 5si1c 2s1i2deo s2ido 3s4ie siege4s si3ene si1err si1f4 si2g1a 3sigh sig4n si3gnu si2g3r si2k1ab si2k1ä sik3erl si2ki si4k1l si2kr sik3s2 sik3t4 si2ku 3silo 2s1imm si3n4a 2s1ind 2s1inf sing1a sin3gh sin3g4l sin2gr sing3sa 2s1inh sin1i1 2s1inq 2s1ins 2s1int 2s1inv 3sio 3s2is si2sa si4schu si2s1e si2s1o si2s1p sis3s2 si2stu 3s2it si2tau sit3r si2tra si3tu 3siv siv1a sive3 si2vr 1sí 4s3j 2s1k2 4sk. 1skala 4skam 4skanz 4skas ska4te. 4skateg ska4tes 4skb skelma4 skelmas5 s2kep 3s2ki. s2kif s2kig 3s2kik 4skir 3skiz sk4l 4s3klas sk4n 4skom 4s3kor 4skow 4skö 4sks 4sk3t 3skulp skus3 2s1l2 4sl. 3slal 4slan s2law sl3b s5le s3li 3s4lip 4sln s3lo. slo3be s3loe s3lu 4s3m2 2s3n4 4sna snab4 sni3er. sni3ers 4s5not 4snö 3so. so4a 2s1o2b so3et 3soft 3sog s1o2he 6sohng 2s1ohr 1sol so3la so4l1ei sol4ler 2so2ly 3som 3s2on son3au sone2 son5ende son3sä so2ny so3o 2s1opf 3sor. so1ral s1orc 2s1ord so2rei 2s1orga 5s2orge 2s1o2rie so2r1o2 3sors so4ru 3so3s2 s4os. 4s1ost 1sou so3unt 3sov 4s1o2ve 3sow 2s1ox 5soz sö2f 2s1ök 2s1ö2l s1ö4s sp2 2sp. 2spaa 2spak s2pan spani7er. 2spano 4spap 2spara 1spare 2sparo 3sparu spa3sse spa3ssi 3s2paß 2spau s2paz s2pä 2spär s2pee 4s3pel 4spensi spe3p4 2s1peri 4sperl s2perr 2spers 2spet 1s2pez 2s3pf 2spha s3phe 2sphi 1spi 3s2pi4e 4spier4 spi2k 2spil 3spio 4spip 4spis 2spl 4spla 4splä 3s2pli s3p4lu s3pn 2spod 2spog s2poi 2spok 4spol 1spon 1spor 4s3pos s2pott 4spr. s2prac s2pran 2sprax 2spräm 4spräs 3s4prec 2spred 2spres 2sprob 5spross 3spru 2sprüf 3sprün 2s3ps 2spt 2spun 2spup 3spur 4sput 1spü 4spy 2s1q 4s3r4 srat2s srat4sc sret3 srom2 srö2s srös1c srücker6 srü2d 2s1s 6ss. 4ssa ssa3bo ss1ack ss1aj s3sal s4s1ala s4s1alb s4s3amt s5sand s4s3ang s2sano s4sans ss2ant s4sanz s3sas ss3att 4s3s2ä 4ssb 6ssc 4ssd 4ss1ec 4ssee 4sseg s4s1ega 4sseh sse3ha 4ssei sse3inf sse3in4t 4ssek 6ssendet 4s3sendu ssenmas6 sse6r5att s2s1erö 4ss3erse s3sersu ss2es 4ssesc 3ssesh 4sset sse3ta 4ssez 4ssf 4ssg 4ssh 4ssic 4ssie s2sig s4sinf s4sinst s4sint 4ssio 4ssit 4ssk s3skala 4s4s3l 4ssm 4ssn 4sso ss1off ssoi4 s2s1op ss1ori 4ssp s3spe ss2po ssquet4 4ssr 4ss3s2 4sst sst2a s5stad ss2tar s3stä ss1te s4ste. s5stel s4sten s4stes s4stet s5steu ss2th ss2tip ss1tis ss2top ss2tur s3s2tü 4ssum ss1ums 4ssü 4ssv 4ssw 4s3sy 4ssz 1st 6st. 3staa 2stabb 2stabh s2tabi 2stabt 2stabz st2ac 3s2tad 4stada 4stadr 3staff 2stag 3stah 2stak 2stal. 2stale 3sta3li 2stalk st1alp 3stam st1ami 4stamt sta4na 3stand 4stanf 4stanl 4stann 2stanw 4stanza s2tar. s2t2ars 3start 3stat 3s4tau. 2stauf 2staum 5staur 2staus 3staus. 2stax 3stäb 3städ 2stäg 2stält 2stämt s2tär 3stätt 2stäus 4stb 4st3c 4std 3st2e s2tean 4stechn 4stee ste2gr ste2i 5s2teig 4s3teil stei4na s2tel s3telem stel4l3ä ste4mar 4stempf 4st3ends st3engl st4ens 4st3entf 4stentw 4stepi ste6rers s2terl s2tern 6sterras s2ters 4st3ese 4stests s2teu 4steuf 4st3ev 4stex 4stf 2stg 4sth st3ho 3sti2e 4stief. stierma5 3stif 3stim 2stinb 2stinf 2st1ins s4tio sti2r st3i2so 2stj 2stk 4s4tl 4stm stma3s2 2stn 3stoc sto3d s2tode 2st3om 2stopo 2stord 2storg 3stos 4stou 2stöch 5s2tör 2stöt 4stp 2stq 3s2traf 2strag 3strah 4strai 3s2tral 4strans 3s2tras4 3straß 4straum s2träf 2sträg s2trän 4sträne 2stre. 4strech 4stred 4stref 4streg 3st4reif 4streis st3renn 2strep 2stret 2strev 2stri. 3s4tria 2strib 4strig stri2k 4strisi 2stroc 3s2trof 3s2trok st3roll stro4ma s2tros s2trö 3struk s2trum 4st3run 2strup 4st3s4 stsas2 2st3t4 st2u 3s2tub 4stuc 3stud 2stue 3stuf 3stuh 2stuk 2stumr stum2s 2stumz stu2n 2stun. 2stunf 2st3uni 2stuns 2stunt 3stuö stu3re st3url 2s3turn 2st3urt 4stüch s2tück 2stür. 2stüre 2stürg 2stürs 2stv 2stw 2sty. 2stys 4st3z 1su. su1an 3su2b3 su4ba2 4subi 5su1c su2cha such4st 2s1u2f 2s1uh su1is su1it. sul2a sul2i sult2 su2mar su2mau 3s2ume su2m1el su6m5ents s3umfe 3summ sum1o2 su2mor s3umsa s3umst su2n sun6derh su4ne s1unf 2s1uni 4sunt 3s2up sup3p su2ra 2s1url s1urt su2s1 su3sa su3sh su3si sus3s 2sü4b 3süc sü2d1 süden2 3sün süs4 sü3sse sü3ssi 4s3v 2s1w s3we sweh2 4swie 4swil s3wö s3wu 1s2y syl1 sy4n3 sy5s 2s1z 4s3za 4s3zei s2zena 5s4zene 4szent s2zes s2zeß s3zet s2zis sz2o 4s3zu 4s3zw 2ß3a2 ß1ä 2ß1b2 ßbus3 2ß1c 2ß1d4 ßdie3 1ße 2ß1ec 2ß1e2g 2ß1ei ße2l1a ße2le ßen3g ße2ni ße2no ß2ers. 2ßerse ßer3t ße2s ße2t ß1ex 2ß1f 2ß3g2 ßge2bl 2ß1h2 1ßi ßi2g1a 2ß1in ß1j 2ß1k4 2ß1l2 2ß1m 2ß1n2 ß1o2 ß1ö 2ß1p2 2ß1q ßquet2 4ß3r2 ßrus3 2ß3s2 2ß1t ß2th ßts2 1ßu2 ß1uf 2ß1um ß1uni ß1ü 2ß1v 2ß1w 2ß1z 2tab. ta2b1an 2t1abb 1tabel 2taben ta4bend 2tabf 2tabg 2tabh 2tabk 1table 2t3abn ta2br 4tabs 2t3abt ta2bü 2tabw 2tabz 2t1ac 3tacu t1ada tadi3 2t1a2dr ta3d2s 1taf2e 2taff t1afg t1af4r 3t2ag ta2ga2 ta2g1ei 4t3a4gent ta3gl t3ago tag2s tag4st tah2 tah3le tahl3sk ta3i2k tai2l ta1ins tai4r ta1ir. 1tak t3a2ka ta2kro tak2ta 3taktb 3t2aktu 2takz 3t2al. ta2la ta3lag ta3lak 1talbu tal3d 1t4ale ta4lens tal4leg tal2lö ta2l1op tal2se 2talt 2tam ta2mer ta2mi t1ampl t1amt t1a2na 2tanb t2and ta3ne 4tanf 2tang t2ank t3ankl 2tanl 2t1anme 4t1anna t1ans t2ans. 4t3ansi 2t3ansp ta2nu 2tanwa 2tanwä t2anz. t1anza 4tanzei tan6zerh t1anzu ta3or ta2pe. ta2pes 2tapf ta2pl 2tarb ta4rens ta4r3ere 3t4a3ri 2tark 2t1arm 2tart t1arti tar2to ta2ru 2t1arz ta3sa 1tasc t1asp 1tas2t 1tat. ta2ta2b ta2tan ta2tau tat3ei ta2tem ta2t3er ta2th tat3he t3atl t4atm ta2tom 1tats ta2t1um 2t1auf 4taufg tau3f4li 4taufn 1taug t1auk 3taum 1taus t1ausb tau6schr tau6schw t2ause 4t3ausg t1ausk 2tausl 4t3auss 4t1ausw 1tax taxi3s tä1c 2täd 3täe 1täg 2tägy 2täh 2t1ält 2täm t1ämt t1ängs 1tänz t1äp t2är. tä2ru tä4s t2ät 2tätt 1täus 2täuß 2täx 1tà 4t3b2 tbe3r2e tblock5e tblocken8 tbus3 2t1c t3cha t3che tch2i tch3l t2chu tch1w t4ck t3cl t3cr 2t3d4 tdun2 1te2a4 te3al te3an 3t4ebb 4t1e2ben 1t2ech te1cha 3techn 2teck teck2e 1tee te1em te2en3 te1erw te2es 2teff teg2 teg3re 2teh t2ei. t2eie t3eifr teik4 1teil 2t1ein teinbus6 tein3ec t3einge t3einla 4teinn t3eis. t3eisb tei3st tek3t tela4 te2l3ab te2l1ac te2l1au telb4 te3le tel1eb tele4be te4l1ec 3telef 3teleg te4l1eh te4lein 2telem tel1en te4lerd te4leu 4t3elf. te2l1in te2lit tell2e te4lost te2l1ö tel3s2k tel3ta tel3th tel3t4r te2m1ei te2min 2temo te2m1o2r 3temper 1tempo te4m1u t6en. ten3a tena2b te4na2d te4na4g te4nas te4nau te2nä t4enb ten3da 4t3endf t6endi 2t1endl t6endo 4t3endp ten3d4r te2n1e2b te2nef te3n4ei. ten3eid ten3ens 4tenerg te2net ten3g 4t1eng. tengeschos8 tengescho7sse ten4gla t4enh te2ni te4n3in t4enj t2enl t4enm ten3n t2eno tens2e 4tensem t4enta t3entb 4tentd t4ente 4tentn ten4t3ri 4t3entw 4t3entz ten6zerh ten3zw t3e2pi t4er. tera2b te2rad te1raf ter3am te3ran. 4terbs 4terbt t3erde. te2re2b te4r3eif te2rel ter3end te4reng te4rerk terer4z 4terfol t4erfr 4terfül ter3g2 tergeschos8 tergescho7sse 6tergrei t6ergru 2t1ergu 4tergü t4eri te3ria 4terklä 2t1erlö 1term terma3s4 ter4mer ter4n3ar 4t3erneu t4ero t3erö 3terras ter4re. 1terro t4ers. t6erscha ter4ser terst4 t4erst. t4ersti t4erstu tert4a teru2 te4r1uf ter4wäh 6terwerb ter3za 4t3erzb te2s tes1ac te3ser te3si te3so te3sp te4spr tess2 3tesse. t2es2t tes3tät te4st3ei te6ster6g te6sterk testes4 1tests t2et. te2tat 4tetl teu3eri 3teuf te1un teu2r3a4 te2vi 1tex te1xa t3e2xe 2t1e2xi 4texp 3text 2t1exz 2t1f4 tfä4s3 tfi2l 2t1g2 tger2 tgro3 t1h 4th. 2th2a 3t4ha. t2hag t3hai t2hak 3thal. 4t3hau 2t3hä 4thc 1th2e t2he. 3thea 2theb t2hec 2t3hei t4hein t2hek t2hem t4hene t4heni 3theo 2therr t2hes 3these t2heu 1thi. t2hik 2t3hil 2t3him 2thk 4th3l 4th3m 2th3n t2ho 2t3hoc t3hof 2t3hoh t4hol. t3hor 2t3hot thou2 2t3hö 2thp 1th2r2 4thrin. 4thrins 2ths 2thub 4thun 2thü 2thv t2hy ti2ad ti3a2m tib4 ti1ce ti3chr tiden2 ti4dend ti2deo t2ie 1tief. ti1el ti3e4n1 ti2er tie4rec tiermas6 1tierr tie5sse 2tieß ti1et ti1eu 1tif. ti1fr ti4gerz tihi4 ti2kam ti2kar ti3k2er ti2kin ti2krä tiks2 ti2lar ti2lau ti2lei ti2lel 1tilg til4leb til4leg ti2lö tilt4 ti2lu ti2ma2g t2imi tim2m1a 4t1imp t2in. ti3na t1inb 4t1ind ti3n2e t1inf tin2g1a ting3l ting3s2 t1in1it 2t1inj tin2k1l t2ins. 4t1inse 2t1int ti1nu 4t1inv 3tio ti3or 1tip 3tip. ti3pl 3tipp ti4que. ti1rh t2is ti4scha tisch3w ti2sei ti2sp 3ti3te tium2 ti2van tive3 ti2vel ti4v3erl ti2v1o ti2v3r ti2za 2t1j 2t3k4 2t3l2 tl4e tle2r3a 4t5li 2t1m2 tmal2 tmen4t3 tmo4des t3mu 2t5n4 tnes4 to4as to5a4t 1tob 2tobj tob2l to1ch 3tocht 2tock 1tod 3tod. tode2 to2d1er tode4s1 to4d1u toi4r to3la tom1e2 to2men 2tomg 1ton to2nau 3too to2pak to2pat 1topo 2topt to1ra to2rau to4rän 2torc t1ord 1tore. to2r1el to3ren t1org t3orga tor3int to2rö 1tort t1ort. to2ru t2orw to3s2 to4sk tost4 1toten to2tho 3t4ou touil4 to3un tö2c 1töch 2töf 2t1ök tö4l 3tön t1ö4st 1töt 4t3p2 tpf4 2t1q t2r4 2tr. 1trac tra3cha t3rad. tra4dem tra4far 1trag 2trahm 3t4rai 1tram 3t4ran. 2trand 1trank t3rann 1trans t3rase t3rasi tra4str 2traß 1traum traus2 1trä 3träg 2träh 3träne 2träs 2träß 2träus 2träuß 4t5re. tre4ale 2treb tre2br 2trec t3rech t4reck 2t3red 3t4ree 1tref 2trefe 3treff 2trefo 2treg t4rei. 1t4reib 2treif t3reig 2t3reih t3rein t3reis t3reiz 2trek 2t3rel t4rem t4ren. 1trend t3rent 1trep 2trepe 2trepo t4repr t4rer t4res. 1t4ret tre2t3r t4reu t3rev 2trez 3t4ré 2t3rh 1trib 2trid 3trieb. 3triebs tri2er 1trin t3rind 2tring tri3ni 3trio t4rip t3riß 1triu tri2x trizi1 1troc t4roi tro2ke tro2mi 2t3roo t4rop 3tropf 2t3roß t3röc 2tröh trö4s3s 2t3röt 1trug 2truk trum2 trums1 2trund 1t4runk 3t4rup t3ruß tru2th t4rüb trü1be trü1bu 2t3rüc trücker6 t4rüg 3trümm try1 2ts t4s3a4b t3s2ac ts1ad t2s1ah ts1al t4s1amt4 t2san t4s3ar ts1as tsa3sse t2sau t1sä t2s1än t4schar t3sch2e t4schef tsch4li t4schro ts2cor t2s1e2b ts3eh t3seil t4seind ts1em tse2n1 t2s1eng t3sens t2s1ent t2s1er t4s3esse t3set t4seth t2s1i2d ts1ini t2s1ir t3skala ts3kr ts1o tso2r t1spal t1span ts1par ts4pare t1spas ts2ped t1spek ts2pi ts2pon ts2por ts3s2 tst4 ts2tat ts3täti t4stea t4s1tep t4sterm t4s3terr ts1tie t2s3tis t2stit ts2to ts3toc ts3tor t4s3trad t2strä t2s1tri ts2tro t4strop t2s3trü ts1u 1tsub t1sü 4t1t tt1ab tta2be tt2ac t2t1ad tta6gess tt1ak tt2al tt2ant tt1art tta3s tt1ebe tt1eif tt1eis tte2la tte4leb tte4len ttel1o t3ter tt2erg tterma8s7s tte4s1ä t2teti tt2häu t2t3ho ttras3s t3tro tt3ru tt3rü tt2sen tts1p tt4s3tem tt4ster tt4sti ttt4 t2tuc tt2un tu1alm tu3an 1tuc tu2chi 1tue tu2ere 2tuf tuf2e tu3fen t3u2fer 2tuh t3u2kr tul2a 1tum t2um. t2ume 2t3umf t3umg 2t3umk 2tump t3umr tum2si tum2so 2t3umt t3umz 1tun. 2t1una 2t1und 2t3unf t3unga tung6s 2tunif 2t1u2nio 1tunn 1tuns 2t3unt t1up. tu2r1a4g tu2rä tur1c tu2re. tu2rei tu2r1er tu2res tu2r1e4t turin1 1turn tu2ro tur3s tu4ru tu2sa tu4schl tu2so tu3ta 2tüb 1tüch tück2s 1tüf 1tür. tür1c 1türe 1türg 1türs 1tüten 2tütz 2t3v 4t3w twa2 twä4 twi4e 1ty 3ty. 3typ ty2pa 3tys 4t1z t2za4 tz1ag tz1al tz1ar tz1au tz1ä t3ze. t2z1ec t2z1eie t2z1eis tze4n1 tz2ene tz3ents tz1erl tz2ers t3zes tzes3t tzgel2 tz1int t2zor tz2ö tz2th tz2tin tz1wä tz1wi tz1wu 2ua u3a2b u1a2c uad4r u1ah u1al. ua2lau u1alb u3alet u1alf u3a2lo u1alr u1als u1al3t ua2lu u1am u1ans u3ar. uara2b u1ars ua3sa ua2th uat2i u3au uau2s u1ay u1äm u1än u1äu 2u1b u2bec ub3ein u3b4i ubi3os. ub2l ub3lic u2b3lu u2bop ub1r ub3rä u2b3rit ub2san ub2s1o ub2spa ubus3 u2büb 2uc uc1c u1ce4 uces3 uch1a u1cha. uch1ä u1che u2ch1ec uch1ei ucherma8s u3ches u1chi uch1il uch1in uch3l uch3m uchma6ss uch3n u2ch3r uch2so uch4spr uchst4 uch4tor uch2t3r u1chu u2chum uch3ü uch1w u1ci uck2er u1cl 2u1d u3d2a uder2e udi3en uditi4 u2don ud3ra u3dru 2u1e u2ed ue2en u2eg u2ela ue2le ueli4 ue2mi uen1 ue2nä ue2ner uenge4 ue2ni ue2no uen2sa uen2zu u2ep ue2r3a ue2r1ä ue3reig u3eremp u3erent ue4rerg ue4rerk uer3g2 u4erinn u3erin4t uerma6s uer2ne uer4ner uer3o u3err uer3sc uer3t2 u3erum u3erunf u3erunt ue4s ue5se ue5sp ue2ta ue4tek uf1ab u3fah uf1ak uf3ar uf1au u2f1ä4s u2f1ä2ß u2f1ei u2f1em u3fen. u2fent u2f1erh u4ferle uf2ern u2f1eß 2uff uff4l uf2fro uf3l u2fob ufo2r uf1ori uf3r uf3sä uf2spo uf4s3tem uf4ster uf2t1eb uf3ten uft3s2 u2fum 2u1g u4gabte ug1af ug1ak ugang4 u2g1ap uga4s ug1au ug3d2 u2g1ei ugenma3 ugenmas6 u2g1erf u2g1erl ug3hu u2g1l ug3lad ug3lo u3g2lö u4glu u2g3n ugo3 ug1or u2gö u4g3reis ug3ro ugro3s ug3rüs ug3sc ug3se ug3si ugsma3 ugsmas4 ug1spa u2gü u1h 2uh. uh1la uh1lä uh2li uhme4 uhr1a uh2rer uh3ri uh4rin uhrt4 uh2ru uh4rü uh1w 2ui ui2c u1ie ui1em u3ig u4ige u1im u1in. u3isch. u3ischs uisi4n ui2st u1j uk2a u3käu u1ke u1ki u1k2l ukle1i u1k4n u3ko uk2ö u1k4r uk2ta uk2t1in uk2t3r u1ku uku2s u1l ul1am ul1äm ulb4 ul2dr uld2se u2l1el ule4n ul1erf ul1erh ul1erw ule2sa ule2t ul1eta u2lex ulf4 ulg4 uli2k ul1ins ul3ka ul2kn ull2a ul3len ul2les ul2lö ulm3ein ulo2i ul1or ul2p1h ul2sa ul4sam uls2t uls3z 2ulta ul3th ul2tri ult3s u2lü ul2vr ulz2w u2m3a2k um1all um2an um3anz u2m1art u2m1aus u2maut 1um3d2 um2en ument4s umer2a u2m1erg u2m1erl u2m1erw 1umf 1umg um1ins um1ir 1umk 1um3l 4umm umm2a umpf4li um2p3le 1umr 3umsat um2sau um2ser um2sim um2s1pe um4stem um2su um3t2 um2un u2m1ur 1umz un1 2un. 2una. 1unab un3ac un4al u3n2am u2n3an 2un2as un3at 1unda un4dab 1undd un4dei un4d3erf und5erha 1undf 2undg un2did 1undn un2dor un2d3r 4unds. und3sp un2d1um 1undv 1undz u3ne une2b une2h un2ei. un3ein unen2t un4es2 1unget 1ungew 1unglü un2gr ung3ra ung3ri ung4s1 un2id un3ide 1u2nif unik4 un2im uni2r 2unis un3isl u3n2it 3u2niv 2unk un2k1a2 un2kei unks2 unk4tit unk2t3r 3unku un2n3a2d un3n2e uno4r un2os 1unr uns2 2uns. un3se 1unsi un3sk un3sp unst1r 1unt un3ta unte4ri un3tr unt3s 2untu u1nü unvol2 unvoll3 1unw 2unz 2uo u1o2b u3of u1op u1or u3or. u3or3c u3ors u1os. uote2 u1pa u1pe2 uper1 up2fa upf2e upf1i u1pfl u3pi up2pl up2pr u1pr upt3a2 upt3erg upt1o u1q 2ur. u1ra u2rab u3raba ura2be u2r3a2m u2r1ana ur2anb u2r1ang ur2anh u2r1an5s u2rar ur3a4ren u2r3att u2r1au 2u1rä ur1än ur3b2a urch1 ur3d2i ur1eff u2rele ure4n u4r1ep ur1erh ur1erw 2urf urf3t ur2gri urgs2 uri2c ur1im ur1ini ur3ins ur1int u2rinv 1urlau 4u1ro u3rol u1rö ur3p 2urr ur2san ur2sau ur2ser urst4r ur4sw urs2ze urt2 u3ru ur2za ur2zä ur2zi ur2zo ur2z1w 2us u4saf us4ann us5art u1sä u6schent usch5wer u2s1ec u2s1ei u3seid u3sep use1ra u2serp u2s1ese usi3er. usi5ers. us3kl u4sko usmas2 usma5sse u1so us3oc u3soh u3sol u2s1op us1ou u1sö u1sp us3part u2s1pas u2spat us1pe u3s2pek us1pic u3s2piz u2spo us2por u2spu u4s3sel us2sen us5sende us6seni ussenma7s us2ser us4serf uss5erfa us2sez u3ssig us2sof u2stab ust3abe u3stal us2tat us2ten us4ter. us2th ust2in u3stis u2s1tor u2strä u4strit u3s4trop u2s1tur u2sty u1su us2ur 2uß u2ß1u 2u1t u3ta. ut1alt ut3a2m u2t1ap u2t1ar u2tär u3te ut1eg ute4ge ute2n1 u2tent uter4er u4t3ersa ut2es ut2et u4tev u4t1ex utfi4 ut2he u2thi u2t3ho u2thu utmas2 utma5sse u3to. uto4ber uto3c u3tom ut1opf u2tops ut4or ut3rea ut3rü ut3s2a ut2s1ä ut4schl ut4schm ut4schö ut1sp ut2spa ut3te ut3t4l utt1s2 utu4re utu5ru utz3eng ut2zin ut2zo ut2z1w 2u1u2 uufe2 u1ü2 u1v4 u2ve. uve3rä u1w 2u1x ux2e ux2o ux3t u1ya 2u1z uz1we uz3z4 1üb 2übc 2übd übe2 über3 üb3l üb3r 2üc ü1che üch3l üch4s1c ücht4e ück1er ück3eri ück4spe üd3a4 ü3den. üden4g ü3d2ens üd1o4 üdö4 üd3r üd3s2 üdsa1 üd3t4 üdwe2 ü2f1a ü2f1ei üfer2 ü2f1erg üf2fl ü2f1i üf3l üf2to ü1g üge6leis ü2g3l ü2gn üg3s üh1a ü1he ü2h1ei ü2h1eng ü2h1erk ü2h1erz üh1i ühl1ac ühl2e üh3mo üh3ne üh3r2e ühr3ei. üh1ro ühr3ta ühs2 üh3stu üh3t üh4th ü1hu üh1w ü1k2 2ül ül1a ül2c ül4e ül2la ül2l1ei ül2lo ül2lö ü1lu ü2ment ü2n1a ün2da ün2dr ünen3 ün2fa ün2f1ei ün2fli ün2fr ün2g3l ünt2 ü1nu ün2za ü1pe ü1pi üp2pl ür1a ü2r1ei ür2fl ür2fr ür4g3en4g ü1r2o1 ür4ster ürt2h üs2a üs4c ü2schl ü5se üse3h üse3l ü1sp üs4s1c üss2e ü4s3sel üs4st üs2su üs4t ü2sta üste3ne ü2str ü1su ü1ß 2üt ü1ta ü2t1al ü1te ü1ti üt3r üt2s1 üt2tr ü1tu ü1v ü1z 2v1ab va1c val2s 2vang 2varb vas2 v4at va2t3a4 va2tei va2t3h vatik2 va4t1in vati8ons. va2t3r vat3s4 va2t1u vat3z 2v1au vä1 2v1b 2v1d 1ve2 ve3ar ve3b ve3c ve3d ve3g ve3h ve4i veit2 veits1 ve3la ve4l1au ve3le ve3li ve3lo ve3ma ve3mu ve3nal ven2c ve3ne venen4d ve3ni ve3nö ve3o ver1 ver3a ve3rad ve3rand ve3ras ver3b2 verd2 vere2 ve4rek verf4 verg4 vergas6 ve3ri ve4rin ver3k vermas8sen ver3sta vert2 ver5te ver3u ve3s 2vesc 2vese ve4sh ve4s1p ves4t ve3ta vete1 ve3tr 2veü ve3v ve3x2 2v1f4 2v1g 2v1h vi3ar vi4a3t vi2c vie2h3a vi2el vi2er vie4rec vie2w1 vig2 2vii vi2l1a vi4leh vi2l1in 2v1i2m vima2 vi4na vin2s 2v1int vi3sa vise4 vi3s2o vi2sp vis2u 2v1k 2v1l2 2v1m 2v1n 2v1ob vo3ga vo2gu 3vol vollen4 vol6l5end vol2li 2v1op vo2r1 vor3a vor3d vor3e vor3g vo3ri vormen4 vorö4 3voy 2v1p v2r 2v3ra v3re v4ree 2v3ro 2v1s vs2e v3s2z 2v1t vu2et 2vumf 2v1v 2v1w 2v1z w2a 1waa wab2bl wa3che wach6stu wach4t4r waffe2 waffel3 1wag wa5ge wa2g3n wa3go 1wah wahl5ent wah4ler wah2li wai2b 1wal 2walb wal4da 2walm wal2ta wal2to walt4st wa3na wang4s wa2p 1war2e ware1i wart4e 1was wa3sa wa4scha wa3sh wass4e w2ä 1wäh 1wäl wäm3 2wäng 1wäs3 wä5sc wä4ss 2w1b2 wbu2 2w1c 2w1d we2a we2ba 4webeb we2bl web3s we2e4 weed3 we2fl 1weg we2g1a we2g3l we2g3r weg1s2 1weh we2i wei4bl 2weie weik4 weis4s3p wei4tr weit1s wel6schl wel6schr wel2t1 wel4t3a4 wel6t5en6d wel4tr wen3a4 we3ni wen4k3ri we2r3a wer2bl 1werbu werd2 5werdens 1werdu werer2 wer2fl wer4gel we4r3io 1werk. wer2ka 1werke wer2kl wer2ku we2rö wer4sta wer2ta wer6t5erm wer2to 1werts 1wese wesen4s3 we2s1p wes2t we2st1a we4st3ei we4steu we4sti we2st1o2 we2stö we2st3r we4stu 1wet wet2s wett3s 2w1ey 2w1g 2w3h 1wid wi2e wie3l wien2e wie4st wik2 1wil wim2ma wim4m3u win4d3ec win2dr win2e 2wing win8n7ersc win4num 1wi4r wi3s2e wi2sp 1wiss wi3st wi3th 1witzl 2w1k 2w1l 2w1m 2wn wn3s 1wo1c wo2cha woche4 1woh woh2le 1wolf wolf2s1 wol4la wol4ler wor3a wo2r3i wor2t3r wo4r3u wot2 1wöc wört2h 2w1p w2r w3ro 2w1s w3s2k 2w1t wti2 w2u 1wuc wuch4sc wuls2 wun2s 4wur. wur2fa 1wurst wus4 1wu4t1 1wüh wüs4 2w1w x1a 1xa. 2xa2b 1x2ad 1xae xa1fl 1x2ag xa2m x2anz 1x2as xau3 xaus2 2x1b 2xc x1ce x1ch x1cl 4x1d 1xe x1e4g 2xek xe2l xe3lei x1em 3x2em. x2en xen3s2 x2er. x2ere xers2 3xes 2x3eu 2x1f 2x1g 2x1h xib4 xi1c xich2 xide2 xi2d1em x1i2do xie3l xi3g xil1 xil2a xi2lo xi2lu xin3s2 x2is xi2s1e xi2s1o2 xis5s xi3stä xi2su x1i2tu x1j 2x1k2 2x2l2 x3lä x3le 2x1m 2x1n x1or 4x1p xpor6ter x1q 2x1r 2x3s2 4x1t x2t1a x3ta. x3t2as xt1ä x2tän x2t1e2d x2t1ei x2tent x2t1er2f x2t3ev xtfi4 x2t1il2l xtra3b4 x2t3ran xt1s2 xt1u x3t2ur 1xu xu1a x1u2n xu2s 2xv 2x1w 2xy 3xy. 3xys x1z 2y1ab 1yac y1al. y1a2m yan2g y1ank y1ät y1b y1c2 y2chi y3chis ych3n y1d4 y1e y2ef yen4n y2ere yes2 y2es. ye4st ye2th y1f2 y1g ygi2 ygie5 yg2l y1h yhr2 y1i4 y1j y1k2 yke3n yk3s2 y1l y2l3a2m yl4ante yl3c y4le. yli4n yloni1 y2l1u yma2t ym3p2 ympi1 y2n1o yno4d ynt2 y1of yom2 yon4i y1ont y1ou y1p ypa2 yp3an ype2 y2pf y3ph y2p1in ypo3 y4p3s y1r y3r2e y3ri yri2a yri1e y3r4o yrr2 y1s ys2an ys2c yse1 y3s2h y4s3l ysme3 ys2pa yst4 y2s1u2 y3s2z y1t2 y2te. y2tes y3to yu2r yure3 y1v y1w y1y y1z2 za2 2z3ab zab3l za3cha za3chä z1ad 2z1af za3ge za3gr 3zah 2z3ak zale3 za3li 2z1all 2z1am 3zambiq z1an za3ne 2z3anf 3zani 2z3anl za3no za3ra 2zarb 2zarc za3re za3ri z1arm za3ro z1arti zar2tr 2z1arz z1as zast4 2z3at3 3zaub z1au2f z3aug 3zaun zä2 2z1äc 3z2äh 2z1äm z1ärg z1ärm 4z3b4 zbü1b zbübe3 2z3c 2z3d2 zdan2 zdä1 zeau3 zeaus4 2z1e2ben 2zecho 2z1eck ze1e 2z1eff zeik4 zei3la zeile4 2z1ein zeinbus6 zei3s2 zeist4 zei2t1a zeit5end zei4t3er zei2tr ze2l1a2 ze2len ze2l1er ze2l1in zell2a zel4leh zel4lin zel3sz zel3t2h zelu2 2z1emp 5zen. ze4n3ac zen3n ze2no zens2e zen4sem 3zent zent3s zen4zer z2er. ze2r3a ze2re2b 2z1ergä 4z3ergeb z3erhal 2zerhö zerin4t zerk2 z2erl. 2zerlö z2ern zer4neb zer4n3ei 2z1erq zers2 2z1ersa 4z3erste zert1a4 zer4t3ag zert4an zer6tere zer4tin zer6t5rau 4zerwei 2z1erz 3z2erza ze2s zes1e zes1i ze3sku zessen4 zes6s5end zes2sp zes1tr ze2ß1 ze2tr 2zetts 2z1ex 2z1f4 zfä4s3 2z1g2 zger2a 2z1h z2hen zhir3 3zi. zi3alo zi3ar zid3r zi1erh zi1es. 3zig zil2e z2imm 2z1imp zin2e zin4er 2z1inf z1inh zin1it zin2sa zin4ser 4zinsuf z1inv zi2o3 zi3op zirk2 zirk6s zi3s2z zit2h 2z1j 2z3k4 2z1l2 2z1m2 zme2e 2z3n4 2z1ob 2z1of zo2gl 2z1oh 3zol zon4ter zo2o 2zope z1or zo2ri zor4ne 2z1osz 2z3ot 2zö2f z1öl 2z3p4 2z1q 2z3r2 4z1s2 z3sa z3sh z3sk z3str z3sz 2z1t z2t1au z4tehe zte3str z3t2her zt3ho zt1ins zt3rec zt3s2 zu3a zub4 zu4c zud4 zudi4 zu2el zu3f4 zu2g1ar zu4gent zu3gl zugs1t zug4ste zug1un 2z1uhr zu1i zu3k 2z1um. zumen2 2zumf 2zumg 2zuml 2z1ums zun2e 2zunt zup2fi zu3r2a z1urk 2z1url 2z1urs 2z1urt zu3s2 zu3t2 zuz2 2züb zür1c 2z1v zw2 z1wac 4zwah zwan2d1 z2wang z1war 2zwas 4zwäl 2zweg z2weig z1wei3s 2z1wel 2z1wen 2z1wer z2werg 2z1wes 2zwet 4zwir z2wit 2z1wo z1wör z1wur 2z1wü 4z1z z3z4a zze3s z3z2o zz2ö",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=14379,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-deo.rme b/Master/texmf-dist/tex/context/patterns/lang-deo.rme
index b3a2b69ccbc..11d9ea01c19 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-deo.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-deo.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+German Hyphenation Patterns (Traditional Orthography)
+
+(more info about the licence to be added later)
+
% dehypht-x-2009-06-19.pat
\message{German Hyphenation Patterns (Traditional Orthography) `dehypht-x' 2009-06-19 (WL)}
@@ -29,3 +33,4 @@
% 6 6 | 2 7 | 1 6 1
% 7 7 | 2 13 | 1 4 1
% 8 8 | 2 13 | 1 8 1
+
diff --git a/Master/texmf-dist/tex/context/patterns/lang-es.lua b/Master/texmf-dist/tex/context/patterns/lang-es.lua
new file mode 100644
index 00000000000..0c30b34d81d
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-es.lua
@@ -0,0 +1,47 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="es",
+ ["source"]="hyph-es",
+ ["texcomment"]="% Spanish Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% DIVISI'ON DE PALABRAS\
+% ~~~~~~~~~~~~~~~~~~~~~\
+% hyph-es.tex 4.6\
+% This files corresponds to eshyph.tex 4.6.\
+%\
+% (c) Javier Bezos 1993 1997.\
+% (c) Javier Bezos and CervanTeX 2001-2010\
+% Some parts, (c) by Francesc Carmona\
+% Licence: LPPL\
+%\
+% For further info, bug reports and comments:\
+%\
+% http://www.tex-tipografia.com/spanish_hyphen.html\
+%\
+% I would like to thanks Francesc Carmona for his permission\
+% to steal parts of his work without restrictions.\
+%\
+% 2010-05-18\
+%\
+% _____________________________________________________________\
+% Javier Bezos | http://www.cervantex.es/\
+% .............................................................\
+% TeX y tipografia | http://www.tex-tipografia.com/\
+% \
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyzáéíñóú",
+ ["data"]="1b 4b. 2bb 2bc 2bd 2bf 2bg 2b1h 2bj 2bk 2bm 2bn 2bp 2bq 2bs 2bt 2bv 2bw 2bx 2by 2bz 1c 4c. 2cb 2cc 2cd 2cf 2cg 2cj 2ck 2cm 2cn 2cp 2cq 2cs 2ct 2cv 2cw 2cx 2cy 2cz 1d 4d. 2db 2dc 2dd 2df 2dg 2d1h 2dj 2dk 2dl 2dm 2dn 2dp 2dq 2ds 2dt 2dv 2dw 2dx 2dy 2dz 1f 4f. 2fb 2fc 2fd 2ff 2fg 2f1h 2fj 2fk 2fm 2fn 2fp 2fq 2fs 2ft 2fv 2fw 2fx 2fy 2fz 1g 4g. 2gb 2gc 2gd 2gf 2gg 2g1h 2gj 2gk 2gm 2gn 2gp 2gq 2gs 2gt 2gv 2gw 2gx 2gy 2gz 4h. 2hb 2hc 2hd 2hf 2hg 2h1h 2hj 2hk 2hl 2hm 2hn 2hp 2hq 2hr 2hs 2ht 2hv 2hw 2hx 2hy 2hz 1j 4j. 2jb 2jc 2jd 2jf 2jg 2j1h 2jj 2jk 2jl 2jm 2jn 2jp 2jq 2jr 2js 2jt 2jv 2jw 2jx 2jy 2jz 1k 4k. 2kb 2kc 2kd 2kf 2kg 2k1h 2kj 2kk 2km 2kn 2kp 2kq 2ks 2kt 2kv 2kw 2kx 2ky 2kz 1l 4l. 2lb 2lc 2ld 2lf 2lg 2l1h 2lj 2lk 2lm 2ln 2lp 2lq 2lr 2ls 2lt 2lv 2lw 2lx 2ly 2lz 1m 4m. 2mb 2mc 2md 2mf 2mg 2m1h 2mj 2mk 2ml 2mm 2mn 2mp 2mq 2mr 2ms 2mt 2mv 2mw 2mx 2my 2mz 1n 4n. 2nb 2nc 2nd 2nf 2ng 2n1h 2nj 2nk 2nl 2nm 2nn 2np 2nq 2nr 2ns 2nt 2nv 2nw 2nx 2ny 2nz 1p 4p. 2pb 2pc 2pd 2pf 2pg 2p1h 2pj 2pk 2pm 2pn 2pp 2pq 2ps 2pt 2pv 2pw 2px 2py 2pz 1q 4q. 2qb 2qc 2qd 2qf 2qg 2q1h 2qj 2qk 2ql 2qm 2qn 2qp 2qq 2qr 2qs 2qt 2qv 2qw 2qx 2qy 2qz 1r 4r. 2rb 2rc 2rd 2rf 2rg 2r1h 2rj 2rk 2rl 2rm 2rn 2rp 2rq 2rs 2rt 2rv 2rw 2rx 2ry 2rz 1s 4s. 2sb 2sc 2sd 2sf 2sg 2s1h 2sj 2sk 2sl 2sm 2sn 2sp 2sq 2sr 2ss 2st 2sv 2sw 2sx 2sy 2sz 1t 4t. 2tb 2tc 2td 2tf 2tg 2t1h 2tj 2tk 2tm 2tn 2tp 2tq 2ts 2tt 2tv 2tw 2tx 2ty 2tz 1v 4v. 2vb 2vc 2vd 2vf 2vg 2v1h 2vj 2vk 2vm 2vn 2vp 2vq 2vs 2vt 2vv 2vw 2vx 2vy 2vz 1w 4w. 2wb 2wc 2wd 2wf 2wg 2w1h 2wj 2wk 2wl 2wm 2wn 2wp 2wq 2wr 2ws 2wt 2wv 2ww 2wx 2wy 2wz 1x 4x. 2xb 2xc 2xd 2xf 2xg 2x1h 2xj 2xk 2xl 2xm 2xn 2xp 2xq 2xr 2xs 2xt 2xv 2xw 2xx 2xy 2xz 1y 4y. 2yb 2yc 2yd 2yf 2yg 2y1h 2yj 2yk 2yl 2ym 2yn 2yp 2yq 2yr 2ys 2yt 2yv 2yw 2yx 2yy 2yz 1z 4z. 2zb 2zc 2zd 2zf 2zg 2z1h 2zj 2zk 2zl 2zm 2zn 2zp 2zq 2zr 2zs 2zt 2zv 2zw 2zx 2zy 2zz 1ñ 4ñ. c4h 4ch. 2chb 2chc 2chd 2chf 2chg 2chh 2chj 2chk ch2l 2chm 2chn 2chp 2chq ch2r 2chs 2cht 2chv 2chw 2chx 2chy 2chz l4l 4ll. 2llb 2llc 2lld 2llf 2llg 2llh 2llj 2llk 2lll 2llm 2lln 2llp 2llq 2llr 2lls 2llt 2llv 2llw 2llx 2lly 2llz b2l 4bl. 2bl2b 2bl2c 2bl2d 2bl2f 2bl2g 2bl2h 2bl2j 2bl2k 2bl2l 2bl2m 2bl2n 2bl2p 2bl2q 2bl2r 2bl2s 2bl2t 2bl2v 2bl2w 2bl2x 2bl2y 2bl2z c2l 4cl. 2cl2b 2cl2c 2cl2d 2cl2f 2cl2g 2cl2h 2cl2j 2cl2k 2cl2l 2cl2m 2cl2n 2cl2p 2cl2q 2cl2r 2cl2s 2cl2t 2cl2v 2cl2w 2cl2x 2cl2y 2cl2z f2l 4fl. 2fl2b 2fl2c 2fl2d 2fl2f 2fl2g 2fl2h 2fl2j 2fl2k 2fl2l 2fl2m 2fl2n 2fl2p 2fl2q 2fl2r 2fl2s 2fl2t 2fl2v 2fl2w 2fl2x 2fl2y 2fl2z g2l 4gl. 2gl2b 2gl2c 2gl2d 2gl2f 2gl2g 2gl2h 2gl2j 2gl2k 2gl2l 2gl2m 2gl2n 2gl2p 2gl2q 2gl2r 2gl2s 2gl2t 2gl2v 2gl2w 2gl2x 2gl2y 2gl2z k2l 4kl. 2kl2b 2kl2c 2kl2d 2kl2f 2kl2g 2kl2h 2kl2j 2kl2k 2kl2l 2kl2m 2kl2n 2kl2p 2kl2q 2kl2r 2kl2s 2kl2t 2kl2v 2kl2w 2kl2x 2kl2y 2kl2z p2l 4pl. 2pl2b 2pl2c 2pl2d 2pl2f 2pl2g 2pl2h 2pl2j 2pl2k 2pl2l 2pl2m 2pl2n 2pl2p 2pl2q 2pl2r 2pl2s 2pl2t 2pl2v 2pl2w 2pl2x 2pl2y 2pl2z v2l 4vl. 2vl2b 2vl2c 2vl2d 2vl2f 2vl2g 2vl2h 2vl2j 2vl2k 2vl2l 2vl2m 2vl2n 2vl2p 2vl2q 2vl2r 2vl2s 2vl2t 2vl2v 2vl2w 2vl2x 2vl2y 2vl2z b2r 4br. 2br2b 2br2c 2br2d 2br2f 2br2g 2br2h 2br2j 2br2k 2br2l 2br2m 2br2n 2br2p 2br2q 2br2r 2br2s 2br2t 2br2v 2br2w 2br2x 2br2y 2br2z c2r 4cr. 2cr2b 2cr2c 2cr2d 2cr2f 2cr2g 2cr2h 2cr2j 2cr2k 2cr2l 2cr2m 2cr2n 2cr2p 2cr2q 2cr2r 2cr2s 2cr2t 2cr2v 2cr2w 2cr2x 2cr2y 2cr2z d2r 4dr. 2dr2b 2dr2c 2dr2d 2dr2f 2dr2g 2dr2h 2dr2j 2dr2k 2dr2l 2dr2m 2dr2n 2dr2p 2dr2q 2dr2r 2dr2s 2dr2t 2dr2v 2dr2w 2dr2x 2dr2y 2dr2z f2r 4fr. 2fr2b 2fr2c 2fr2d 2fr2f 2fr2g 2fr2h 2fr2j 2fr2k 2fr2l 2fr2m 2fr2n 2fr2p 2fr2q 2fr2r 2fr2s 2fr2t 2fr2v 2fr2w 2fr2x 2fr2y 2fr2z g2r 4gr. 2gr2b 2gr2c 2gr2d 2gr2f 2gr2g 2gr2h 2gr2j 2gr2k 2gr2l 2gr2m 2gr2n 2gr2p 2gr2q 2gr2r 2gr2s 2gr2t 2gr2v 2gr2w 2gr2x 2gr2y 2gr2z k2r 4kr. 2kr2b 2kr2c 2kr2d 2kr2f 2kr2g 2kr2h 2kr2j 2kr2k 2kr2l 2kr2m 2kr2n 2kr2p 2kr2q 2kr2r 2kr2s 2kr2t 2kr2v 2kr2w 2kr2x 2kr2y 2kr2z p2r 4pr. 2pr2b 2pr2c 2pr2d 2pr2f 2pr2g 2pr2h 2pr2j 2pr2k 2pr2l 2pr2m 2pr2n 2pr2p 2pr2q 2pr2r 2pr2s 2pr2t 2pr2v 2pr2w 2pr2x 2pr2y 2pr2z r2r 4rr. 2rr2b 2rr2c 2rr2d 2rr2f 2rr2g 2rr2h 2rr2j 2rr2k 2rr2l 2rr2m 2rr2n 2rr2p 2rr2q 2rr2r 2rr2s 2rr2t 2rr2v 2rr2w 2rr2x 2rr2y 2rr2z t2r 4tr. 2tr2b 2tr2c 2tr2d 2tr2f 2tr2g 2tr2h 2tr2j 2tr2k 2tr2l 2tr2m 2tr2n 2tr2p 2tr2q 2tr2r 2tr2s 2tr2t 2tr2v 2tr2w 2tr2x 2tr2y 2tr2z v2r 4vr. 2vr2b 2vr2c 2vr2d 2vr2f 2vr2g 2vr2h 2vr2j 2vr2k 2vr2l 2vr2m 2vr2n 2vr2p 2vr2q 2vr2r 2vr2s 2vr2t 2vr2v 2vr2w 2vr2x 2vr2y 2vr2z 2b3p2t 2c3p2t 2d3p2t 2l3p2t 2m3p2t 2n3p2t 2r3p2t 2s3p2t 2t3p2t 2x3p2t 2y3p2t 4pt. 2b3c2t 2c3c2t 2d3c2t 2l3c2t 2m3c2t 2n3c2t 2r3c2t 2s3c2t 2t3c2t 2x3c2t 2y3c2t 4ct. 2b3c2n 2c3c2n 2d3c2n 2l3c2n 2m3c2n 2n3c2n 2r3c2n 2s3c2n 2t3c2n 2x3c2n 2y3c2n 4cn. 2b3p2s 2c3p2s 2d3p2s 2l3p2s 2m3p2s 2n3p2s 2r3p2s 2s3p2s 2t3p2s 2x3p2s 2y3p2s 4ps. 2b3m2n 2c3m2n 2d3m2n 2l3m2n 2m3m2n 2n3m2n 2r3m2n 2s3m2n 2t3m2n 2x3m2n 2y3m2n 4mn. 2b3g2n 2c3g2n 2d3g2n 2l3g2n 2m3g2n 2n3g2n 2r3g2n 2s3g2n 2t3g2n 2x3g2n 2y3g2n 4gn. 2b3f2t 2c3f2t 2d3f2t 2l3f2t 2m3f2t 2n3f2t 2r3f2t 2s3f2t 2t3f2t 2x3f2t 2y3f2t 4ft. 2b3p2n 2c3p2n 2d3p2n 2l3p2n 2m3p2n 2n3p2n 2r3p2n 2s3p2n 2t3p2n 2x3p2n 2y3p2n 4pn. 2b3c2z 2c3c2z 2d3c2z 2l3c2z 2m3c2z 2n3c2z 2r3c2z 2s3c2z 2t3c2z 2x3c2z 2y3c2z 4cz. 2b3t2z 2c3t2z 2d3t2z 2l3t2z 2m3t2z 2n3t2z 2r3t2z 2s3t2z 2t3t2z 2x3t2z 2y3t2z 4tz. 2b3t2s 2c3t2s 2d3t2s 2l3t2s 2m3t2s 2n3t2s 2r3t2s 2s3t2s 2t3t2s 2x3t2s 2y3t2s 4ts. san4c5t plan4c5t 2no. 2t2l 4caca4 4cago4 4caga4 4cagas. 4teta. 4tetas. 4puta4 4puto4 .hu4mea .hu4meo .he4mee 4meo. 4meable. 4meables. 4pedo4 4culo4 3mente. 4i3go. 4es. 4és 4e. 4e3mos. 4éis. 4en. 4ía. 4ías. 4ía3mos. 4íais. 4ían. 4í. 4í4s3te. 4í4s3tes. 4í3tes. 4í3mos. 4ís3teis. 4e3ré. 4e3rás. 4e3rés. 4e3rís. 4e3rá. 4e3re3mos. 4e3réis. 4e3rán. 4i3ga. 4i3gas. 4i3gás. 4i3gamos. 4i3gáis. 4a4i3gan. 4e3ría. 4e3rías. 4e3ríamos. 4e3ríais. 4e3rían. 4i3gá3mosme. 4i3gá3mosmele. 4i3gá3mosmelo. 4i3gá3mos3mela. 4i3gá3mosmeles. 4i3gá3mosmelos. 4i3gá3mos3melas. 4i3gá3moste. 4i3gá3mostele. 4i3gá3mostelo. 4i3gá3mos3tela. 4i3gá3mosteles. 4i3gá3mostelos. 4i3gá3mos3telas. 4i3gá3mosle. 4i3gá3mosla. 4i3gá3moslo. 4i3gá3mosele. 4i3gá3moselo. 4i3gá3mosela. 4i3gá3moseles. 4i3gá3moselos. 4i3gá3moselas. 4i3gá3monos. 4i3gá3monosle. 4i3gá3monoslo. 4i3gá3monosla. 4i3gá3monosles. 4i3gá3monoslos. 4i3gá3monoslas. 4i3gá3moos. 4i3gá3moosle. 4i3gá3mooslo. 4i3gá3moosla. 4i3gá3moosles. 4i3gá3mooslos. 4i3gá3mooslas. 4i3gá3mosles. 4i3gá3moslas. 4i3gá3moslos. 4ed. 4é. 4edme. 4édmele. 4édmelo. 4éd3mela. 4édmeles. 4édmelos. 4éd3melas. 4edte. 4édtele. 4édtelo. 4éd3tela. 4édteles. 4édtelos. 4éd3telas. 4edle. 4eedla. 4edlo. 4édsele. 4édselo. 4édsela. 4édseles. 4édselos. 4édselas. 4ednos. 4édnosle. 4édnoslo. 4édnosla. 4édnosles. 4édnoslos. 4édnoslas. 4eos. 4éosle. 4éoslo. 4éosla. 4éosles. 4éoslos. 4éoslas. 4edles. 4edlas. 4edlos. 4er. 4erme. 4érmele. 4érmelo. 4ér3mela. 4érmeles. 4érmelos. 4ér3melas. 4erte. 4értele. 4értelo. 4ér3tela. 4érteles. 4értelos. 4ér3telas. 4erle. 4erla. 4erlo. 4erse. 4érsele. 4érselo. 4érsela. 4érseles. 4érselos. 4érselas. 4ernos. 4érnosle. 4érnoslo. 4érnosla. 4érnosles. 4érnoslos. 4érnoslas. 4e3ros. 4é3rosle. 4é3roslo. 4é3rosla. 4é3rosles. 4é3roslos. 4é3roslas. 4erles. 4erlas. 4erlos. 4í3do. 4í3da. 4í3dos. 4í3das. 4o. 4as. 4a. 4ás. 4a3mos. 4áis. 4an. 4aste. 4astes. 4ó. 4ates. 4asteis. 4a3ron. 4a3ba. 4a3bas. 4á3bamos. 4a3bais. 4a3ban. 4a3ría. 4a3rías. 4a3ríamos. 4a3ríais 4a3rían. 4a3ré. 4a3rás. 4a3rés. 4a3rís. 4a3rá. 4a3remos. 4a3réis. 4a3rán. 4a3ra. 4a3ras. 4á3ramos. 4a3rais. 4a3ran. 4a3re. 4a3res. 4á3remos. 4a3reis. 4a3ren. 4a3se. 4a3ses. 4á3semos. 4a3seis. 4a3sen. 4ad. e5r4as. e5r4a3mos. e5r4áis. e5r4an. e5r4aste. e5r4astes. e5r4ates. e5r4asteis. e5r4a3ron. e5r4a3ba. e5r4a3bas. e5r4á3bamos. e5r4a3bais. e5r4a3ban. e5r4a3ría. e5r4a3rías. e5r4a3ríamos. e5r4a3ríais e5r4a3rían. e5r4a3ré. e5r4a3rás. e5r4a3rés. e5r4a3rís. e5r4a3rá. e5r4a3remos. e5r4a3réis. e5r4a3rán. e5r4a3ra. e5r4a3ras. e5r4á3ramos. e5r4a3rais. e5r4a3ran. e5r4a3re. e5r4a3res. e5r4á3remos. e5r4a3reis. e5r4a3ren. e5r4a3se. e5r4a3ses. e5r4á3semos. e5r4a3seis. e5r4a3sen. e5r4ad. 4adme. 4ádmele. 4ádmelo. 4ád3mela. 4ádmeles. 4ádmelos. 4ád3melas. 4adte. 4ádtele. 4ádtelo. 4ád3tela. 4ádteles. 4ádtelos. 4ád3telas. 4adle. 4eadla. 4adlo. 4ádsele. 4ádselo. 4ádsela. 4ádseles. 4ádselos. 4ádselas. 4adnos. 4ádnosle. 4ádnoslo. 4ádnosla. 4ádnosles. 4ádnoslos. 4ádnoslas. 4aos. 4áosle. 4áoslo. 4áosla. 4áosles. 4áoslos. 4áoslas. 4adles. 4adlas. 4adlos. 4ar. 4a4rme. 4á4rmele. 4á4rmelo. 4á4r3mela. 4á4r3meles. 4á4r3melos. 4á4r3melas. 4a4r3te. 4á4r3tele. 4á4r3telo. 4á4r3tela. 4á4r3teles. 4á4r3telos. 4á4r3telas. 4a4r3le. 4a4r3la. 4a4r3lo. 4a4r3se. 4á4r3sele. 4á4r3selo. 4á4r3sela. 4á4r3seles. 4á4r3selos. 4á4r3selas. 4a4r3nos. 4á4r3nosle. 4á4r3noslo. 4á4r3nosla. 4á4r3nosles. 4á4r3noslos. 4á4r3noslas. 4a3ros. 4árosle. 4ároslo. 4árosla. 4árosles. 4ároslos. 4ároslas. 4a4r3les. 4a4r3las. 4a4r3los. 4a3do. 4a3da. 4a3dos. 4a3das. e5r4a3do. e5r4a3da. e5r4a3dos. e5r4a3das. 4ando 4ándole. 4ándolo. 4ándola. 4ándoles. 4ándolos. 4ándolas. 4ándonos. 4ándoos. 4ándome. 4ándomelo. 4ándomela. 4ándomele. 4ándomelos. 4ándomelas. 4ándomeles. 4ándote. 4ándoteme. 4ándotelo. 4ándotela. 4ándotele. 4ándotelos. 4ándotelas. 4ándoteles. 4ándotenos. 4ándose. 4ándoseme. 4ándoselo. 4ándosela. 4ándosele. 4ándoselos. 4ándoselas. 4ándoseles. 4ándosenos. 4a3dor. 4a3dora. 4a3dores. 4a3doras. e5r4a3dor. e5r4a3dora. e5r4a3dores. e5r4a3doras. acto1h acto1a2 acto1e2 acto1i2 acto1o2 acto1u2 acto1á2 acto1é2 acto1í2 acto1ó2 acto1ú2 afro1h afro1a2 afro1e2 afro1i2 afro1o2 afro1u2 afro1á2 afro1é2 afro1í2 afro1ó2 afro1ú2 .a2 .an2a2 .an2e2 .an2i2 .an2o2 .an2u2 .an2á2 .an2é2 .an2í2 .an2ó2 .an2ú2. ana3lí .aná3li .ana3li .an3aero .an3e2pigr .ane3xa .ane3xá .ane3xe .ane3xé .ane3xio .ane3xió .an3h .ani3mad .ani3mád .ani3dar .ani3ll .ani3m .aniña .ani3q .an3i2so .an3i2só .ani3vel .ano5che .ano5din .ano5mal .ano5nad .anó3nim .anó5mal .ano5nim .ano5ta .ano3tá .anua3l .anua4lm .anu3bl .anu3da .anu3l asu3b2 aero1h aero1a2 aero1e2 aero1i2 aero1o2 aero1u2 aero1á2 aero1é2 aero1í2 aero1ó2 aero1ú2 anfi1h anfi1a2 anfi1e2 anfi1i2 anfi1o2 anfi1u2 anfi1á2 anfi1é2 anfi1í2 anfi1ó2 anfi1ú2 anglo1h anglo1a2 anglo1e2 anglo1i2 anglo1o2 anglo1u2 anglo1á2 anglo1é2 anglo1í2 anglo1ó2 anglo1ú2 ante1h ante1a2 ante1e2 ante1i2 ante1o2 ante1u2 ante1á2 ante1é2 ante1í2 ante1ó2 ante1ú2 .ante2o3je acante2 4ísmo. 4ísmos. 4ísta. 4ístas. 4ístico. 4ísticos. 4ística. 4ísticas. t4eo3nes. mante4a e4a3miento .anti1h .anti1a2 .anti1e2 .anti1i2 .anti1o2 .anti1u2 .anti1á2 .anti1é2 .anti1í2 .anti1ó2 .anti1ú2 ti2o3qu ti2o3co archi1h archi1a2 archi1e2 archi1i2 archi1o2 archi1u2 archi1á2 archi1é2 archi1í2 archi1ó2 archi1ú2 auto1h auto1a2 auto1e2 auto1i2 auto1o2 auto1u2 auto1á2 auto1é2 auto1í2 auto1ó2 auto1ú2 biblio1h biblio1a2 biblio1e2 biblio1i2 biblio1o2 biblio1u2 biblio1á2 biblio1é2 biblio1í2 biblio1ó2 biblio1ú2 bio1h bio1a2 bio1e2 bio1i2 bio1o2 bio1u2 bio1á2 bio1é2 bio1í2 bio1ó2 bio1ú2 bi1u2ní cardio1h cardio1a2 cardio1e2 cardio1i2 cardio1o2 cardio1u2 cardio1á2 cardio1é2 cardio1í2 cardio1ó2 cardio1ú2 cefalo1h cefalo1a2 cefalo1e2 cefalo1i2 cefalo1o2 cefalo1u2 cefalo1á2 cefalo1é2 cefalo1í2 cefalo1ó2 cefalo1ú2 centi1h centi1a2 centi1e2 centi1i2 centi1o2 centi1u2 centi1á2 centi1é2 centi1í2 centi1ó2 centi1ú2 centi5área ciclo1h ciclo1a2 ciclo1e2 ciclo1i2 ciclo1o2 ciclo1u2 ciclo1á2 ciclo1é2 ciclo1í2 ciclo1ó2 ciclo1ú2 o4i3dea. o4i3deas. o4i3dal. o4i3dales. 4o2i3de. 4o2i3des. 4i2dal. 4i2dales. 4i3deo. 4i3deos. cito1h cito1a2 cito1e2 cito1i2 cito1o2 cito1u2 cito1á2 cito1é2 cito1í2 cito1ó2 cito1ú2 3c2neor cnico1h cnico1a2 cnico1e2 cnico1i2 cnico1o2 cnico1u2 cnico1á2 cnico1é2 cnico1í2 cnico1ó2 cnico1ú2 .co2a2 .co2e2 .co2i2 .co3o4 .co2u2 .co2á2 .co2é2 .co2í2 .co2ó2 .co2ú2 co4á3gul co4acci co4acti co4adju co4a3dun co4adyu co3agen co4a3gul co4a3lic co4aptac co4art co4árt co4e3fic co4erc co4erz co4e3tá co3exis co4imbr co4inci co4i3to co3n4imbri co4o3per co4o3pér co4opt co4ord con1imbr con1urb cripto1h cripto1a2 cripto1e2 cripto1i2 cripto1o2 cripto1u2 cripto1á2 cripto1é2 cripto1í2 cripto1ó2 cripto1ú2 crono1h crono1a2 crono1e2 crono1i2 crono1o2 crono1u2 crono1á2 crono1é2 crono1í2 crono1ó2 crono1ú2 contra1h contra1a2 contra1e2 contra1i2 contra1o2 contra1u2 contra1á2 contra1é2 contra1í2 contra1ó2 contra1ú2 deca1h deca1a2 deca1e2 deca1i2 deca1o2 deca1u2 deca1á2 deca1é2 deca1í2 deca1ó2 deca1ú2 4e3dro. 4e3dros. 4é3drico. 4é3dricos. 4é3drica. 4é3dricas. .de2sa2 .de2se2 .de2si2 .de2so2 .de2su2 .de2sá2 .de2sé2 .de2sí2 .de2só2 .de2sú2 deca2i3mient decimo1 3sa. 3sas. de2s3órde de2s3orde de2s3abast de2s3aboll de2s3aboto de2s3abr desa3brid de2s3abroch de2s3aceit de2s3aceler desa3cert desa3ciert de2s3acobar de2s3acomod de2s3acomp de2s3acons de2s3acopl de2s3acorr de2s3acostum de2s3acot desa3craliz de2s3acredit de2s3activ de2s3acuart de2s3aderez de2s3adeud de2s3adorar de2s3adormec de2s3adorn de2s3advert de2s3aferr de2s3afic de2s3afil de2s3afin de2s3afor desa3gú desa3garr de2s3agraci de2s3agrad de2s3agravi de2s3agreg de2s3agrup de2s3agu desa3guisado de2s3aherr de2s3ahij de2s3ajust de2s3alagar de2s3alent de2s3alfom de2s3alfor de2s3aliñ desa3lin de2s3alien de2s3aline desa3liv de2s3alm de2s3almid de2s3aloj de2s3alquil de2s3alter de2s3alumbr desa3marr desa3mobl de2s3amold de2s3amort de2s3amuebl de2s3ampa de2s3and de2s3angel de3sangr de2s3anid de2s3anim de2s3aním de2s3anud desa3pañ desa3pacib de2s3apadr de2s3apare de2s3aparec de2s3aparic de2s3apeg de2s3apercib de2s3apes de2s3aplic de2s3apolill de2s3apoy de2s3aprend de2s3apret de2s3apriet de2s3aprob de2s3apropi de2s3aprovech de2s3arbol de2s3aren de2s3arm des4arme de2s3arraig de2s3arregl de2s3arrend de2s3arrim desa3rroll de2s3arrop de2s3arrug de2s3articul de2s3asent de2s3asist de2s3asn desa3soseg desa3sosieg de2s3atenc de2s3atend de2s3atiend de2s3atent desa3tin de2s3atorn de2s3atranc de2s3autor de2s3avis desa3yun desa3zón desa3zon de2s3embal de2s3embál de2s3embar de2s3embár de2s3embarg de2s3embols de2s3emborr de2s3embosc de2s3embot de2s3embrag de2s3embrág de2s3embrave de2s3embráve de2s3embroll de2s3embróll de2s3embruj de2s3embrúj de3semej de2s3empañ de2s3empáñ de2s3empac de2s3empaquet de2s3empaquét de2s3emparej de2s3emparéj de2s3emparent de2s3empat de2s3empé de2s3empedr de2s3empeg de2s3empeor de2s3emperez de2s3empern de2s3emple de2s3empolv de2s3empotr de2s3empoz de2s3enam de2s3encab de2s3encad de2s3encaj de2s3encáj de2s3encall de2s3encáll de2s3encam de3sencant de2s3encap de2s3encar de2s3encár de2s3ench de2s3encl de2s3enco de2s3encr de2s3encu de2s3end de3senfad de3senfád de2s3enfi de2s3enfo de2s3enfó de3senfren de2s3enfund de2s3enfur de3sengañ de3sengáñ de2s3enganch de2s3engar de2s3engas de2s3engom de2s3engoz de2s3engra de2s3enhebr de2s3enj de2s3enlad de2s3enlaz de2s3enlo de2s3enm de2s3enr de2s3ens de2s3enta de3sentend de3sentien de3sentién de2s3enter de2s3entier de2s3entiér de2s3ento de2s3entr de2s3entu de2s3envain de3senvolvim de3seo de2s3eq de3s4erci de3s4ert de3s4ért de2s3espa de3sesperac de2s3esperanz de3sesper de2s3estabil de2s3estim de3sider de3sidia de3sidio de3siert de3sign de3sigual de3silusi de2s3imagin de2s3iman de2s3impon de2s3impres de2s3incent de2s3inclin de2s3incorp de2s3incrust de3sinenc de3sinfec de3su3dar de3su3das de3su3dan de2s3inflam de2s3infl de2s3inform de2s3inhib de2s3insect de2s3instal ini3ci iní3ci de3s4integr de3s4inter de2s3intox de2s3inver de3sisten de3isti de2s3obedec de2s3oblig de2s3obstr de3socup de2s3odor de3solac de3solad de3soll de2s3orej de2s3orient de3sortij de2s3organi de3suell de3sonce de2s3ovi de2s3oxi de2s3oye de2s3oyé de3s4ubstan de3s4ustan de3s4oseg de2s3ub4ic de2s3unir de2s3unier de2s3unim .dieci1o2 dodeca1h dodeca1a2 dodeca1e2 dodeca1i2 dodeca1o2 dodeca1u2 dodeca1á2 dodeca1é2 dodeca1í2 dodeca1ó2 dodeca1ú2 ecano1h ecano1a2 ecano1e2 ecano1i2 ecano1o2 ecano1u2 ecano1á2 ecano1é2 ecano1í2 ecano1ó2 ecano1ú2 eco1h eco1a2 eco1e2 eco1i2 eco1o2 eco1u2 eco1á2 eco1é2 eco1í2 eco1ó2 eco1ú2 ectro1h ectro1a2 ectro1e2 ectro1i2 ectro1o2 ectro1u2 ectro1á2 ectro1é2 ectro1í2 ectro1ó2 ectro1ú2 .en2a2 .en2e2 .en2i2 .en2o2 .en2u2 .en2á2 .en2é2 .en2í2 .en2ó2 .en2ú2 .ene3mist .ene3míst .eno3jar .enu3mera .enu3merá .enu3mere 4o3lógico. 4o3lógica. 4o3lógicos. 4o3lógicas. 4o3lógicamente. 4o3logía. 4o3logías. 4ó3logo. 4ó3loga. 4ó3logos. 4ó3logas. endo1h endo1a2 endo1e2 endo1i2 endo1o2 endo1u2 endo1á2 endo1é2 endo1í2 endo1ó2 endo1ú2 ento1h ento1a2 ento1e2 ento1i2 ento1o2 ento1u2 ento1á2 ento1é2 ento1í2 ento1ó2 ento1ú2 4emboca entre1h entre1a2 entre1e2 entre1i2 entre1o2 entre1u2 entre1á2 entre1é2 entre1í2 entre1ó2 entre1ú2 euco1h euco1a2 euco1e2 euco1i2 euco1o2 euco1u2 euco1á2 euco1é2 euco1í2 euco1ó2 euco1ú2 euro1h euro1a2 euro1e2 euro1i2 euro1o2 euro1u2 euro1á2 euro1é2 euro1í2 euro1ó2 euro1ú2 extra1h extra1a2 extra1e2 extra1i2 extra1o2 extra1u2 extra1á2 extra1é2 extra1í2 extra1ó2 extra1ú2 u4teri .cau5t .deu5t fono1h fono1a2 fono1e2 fono1i2 fono1o2 fono1u2 fono1á2 fono1é2 fono1í2 fono1ó2 fono1ú2 foto1h foto1a2 foto1e2 foto1i2 foto1o2 foto1u2 foto1á2 foto1é2 foto1í2 foto1ó2 foto1ú2 gastro1h gastro1a2 gastro1e2 gastro1i2 gastro1o2 gastro1u2 gastro1á2 gastro1é2 gastro1í2 gastro1ó2 gastro1ú2 geo1h geo1a2 geo1e2 geo1i2 geo1o2 geo1u2 geo1á2 geo1é2 geo1í2 geo1ó2 geo1ú2 gluco1h gluco1a2 gluco1e2 gluco1i2 gluco1o2 gluco1u2 gluco1á2 gluco1é2 gluco1í2 gluco1ó2 gluco1ú2 hecto1h hecto1a2 hecto1e2 hecto1i2 hecto1o2 hecto1u2 hecto1á2 hecto1é2 hecto1í2 hecto1ó2 hecto1ú2 helio1h helio1a2 helio1e2 helio1i2 helio1o2 helio1u2 helio1á2 helio1é2 helio1í2 helio1ó2 helio1ú2 hemato1h hemato1a2 hemato1e2 hemato1i2 hemato1o2 hemato1u2 hemato1á2 hemato1é2 hemato1í2 hemato1ó2 hemato1ú2 hemi1h hemi1a2 hemi1e2 hemi1i2 hemi1o2 hemi1u2 hemi1á2 hemi1é2 hemi1í2 hemi1ó2 hemi1ú2 hemo1h hemo1a2 hemo1e2 hemo1i2 hemo1o2 hemo1u2 hemo1á2 hemo1é2 hemo1í2 hemo1ó2 hemo1ú2 2al. 2ales. hexa1h hexa1a2 hexa1e2 hexa1i2 hexa1o2 hexa1u2 hexa1á2 hexa1é2 hexa1í2 hexa1ó2 hexa1ú2 hidro1h hidro1a2 hidro1e2 hidro1i2 hidro1o2 hidro1u2 hidro1á2 hidro1é2 hidro1í2 hidro1ó2 hidro1ú2 hipe2r3r hipe2r1a2 hipe2r1e2 hipe2r1i2 hipe2r1o2 hipe2r1u2 hipe2r1á2 hipe2r1é2 hipe2r1í2 hipe2r1ó2 hipe2r1ú2 pe3r4e3mia histo1h histo1a2 histo1e2 histo1i2 histo1o2 histo1u2 histo1á2 histo1é2 histo1í2 histo1ó2 histo1ú2 homo1h homo1a2 homo1e2 homo1i2 homo1o2 homo1u2 homo1á2 homo1é2 homo1í2 homo1ó2 homo1ú2 icono1h icono1a2 icono1e2 icono1i2 icono1o2 icono1u2 icono1á2 icono1é2 icono1í2 icono1ó2 icono1ú2 .i2n2a2 .i2n2e2 .i2n2i2 .i2n2o2 .i2n2u2 .i2n2á2 .i2n2é2 .i2n2í2 .i2n2ó2 .i2n2ú2 .in3abord .in3abarc .in3acent .in3aguant .in3adapt .ina3movib .in3analiz .ina3nic .in3anim .iná3nim .in3apel .in3aplic .in3aprens .in3apreci .in3arrug .in3asist .iné3dit .in3efic .in3efici .in3eludi .ine3narr ini3cia iní3cia ini3ciá ini3cie .rei3na re3ini3cia re3iní3cia re3ini3ciá re3ini3cie .ini3cuo .ini3cua .ino3cuo .ino3cua .ino3cula .ino3culá .ino3cule .inú3til .inu3tiliz infra1h infra1a2 infra1e2 infra1i2 infra1o2 infra1u2 infra1á2 infra1é2 infra1í2 infra1ó2 infra1ú2 .inte2r3r .inte2r1a2 .inte2r1e2 .inte2r1i2 .inte2r1o2 .inte2r1u2 .inte2r1á2 .inte2r1é2 .inte2r1í2 .inte2r1ó2 .inte2r1ú2 .in3ter2e3sa .in3ter2e3se .in3ter2e3so .in3ter2e3sá .in3ter2e3sé .in3ter2e3só .de3s4in3ter2e3sa .de3s4in3ter2e3se .de3s4in3ter2e3so .de3s4in3ter2e3sá .de3s4in3ter2e3sé .de3s4in3ter2e3só 3te3ri3n 4te4r5i4nsu .in3te3r4rog .in3te3r4rupc .in3te3r4rupt .in3te3r4rump intra1h intra1a2 intra1e2 intra1i2 intra1o2 intra1u2 intra1á2 intra1é2 intra1í2 intra1ó2 intra1ú2 iso1h iso1a2 iso1e2 iso1i2 iso1o2 iso1u2 iso1á2 iso1é2 iso1í2 iso1ó2 iso1ú2 kilo1h kilo1a2 kilo1e2 kilo1i2 kilo1o2 kilo1u2 kilo1á2 kilo1é2 kilo1í2 kilo1ó2 kilo1ú2 macro1h macro1a2 macro1e2 macro1i2 macro1o2 macro1u2 macro1á2 macro1é2 macro1í2 macro1ó2 macro1ú2 mal2 ma4l3h .ma4l3e4du mal3b mal3c mal3d mal3f mal3g mal3m mal3p mal3q mal3s mal3t mal3v bien2 bien3h bien3v bien3q bien3m bien3t b4ien3do. .su3b4ien b4ien3das. maxi1h maxi1a2 maxi1e2 maxi1i2 maxi1o2 maxi1u2 maxi1á2 maxi1é2 maxi1í2 maxi1ó2 maxi1ú2 megalo1h megalo1a2 megalo1e2 megalo1i2 megalo1o2 megalo1u2 megalo1á2 megalo1é2 megalo1í2 megalo1ó2 megalo1ú2 mega1h mega1a2 mega1e2 mega1i2 mega1o2 mega1u2 mega1á2 mega1é2 mega1í2 mega1ó2 mega1ú2 melano1h melano1a2 melano1e2 melano1i2 melano1o2 melano1u2 melano1á2 melano1é2 melano1í2 melano1ó2 melano1ú2 micro1h micro1a2 micro1e2 micro1i2 micro1o2 micro1u2 micro1á2 micro1é2 micro1í2 micro1ó2 micro1ú2 mili1h mili1a2 mili1e2 mili1i2 mili1o2 mili1u2 mili1á2 mili1é2 mili1í2 mili1ó2 mili1ú2 familia3ri ia5res. amili6a a3rio li5área mini1h mini1a2 mini1e2 mini1i2 mini1o2 mini1u2 mini1á2 mini1é2 mini1í2 mini1ó2 mini1ú2 2os. 2o3so. 2o3sos. 2o3sa. 2o3sas. 2o3samente. mini4a5tur multi1h multi1a2 multi1e2 multi1i2 multi1o2 multi1u2 multi1á2 multi1é2 multi1í2 multi1ó2 multi1ú2 miria1h miria1a2 miria1e2 miria1i2 miria1o2 miria1u2 miria1á2 miria1é2 miria1í2 miria1ó2 miria1ú2 mono1h mono1a2 mono1e2 mono1i2 mono1o2 mono1u2 mono1á2 mono1é2 mono1í2 mono1ó2 mono1ú2 2i3co. 2i3cos. 2i3ca. 2i3cas. namo1h namo1a2 namo1e2 namo1i2 namo1o2 namo1u2 namo1á2 namo1é2 namo1í2 namo1ó2 namo1ú2 necro1h necro1a2 necro1e2 necro1i2 necro1o2 necro1u2 necro1á2 necro1é2 necro1í2 necro1ó2 necro1ú2 neo1h neo1a2 neo1e2 neo1i2 neo1o2 neo1u2 neo1á2 neo1é2 neo1í2 neo1ó2 neo1ú2 neto1h neto1a2 neto1e2 neto1i2 neto1o2 neto1u2 neto1á2 neto1é2 neto1í2 neto1ó2 neto1ú2 norte1h norte1a2 norte1e2 norte1i2 norte1o2 norte1u2 norte1á2 norte1é2 norte1í2 norte1ó2 norte1ú2 octo1h octo1a2 octo1e2 octo1i2 octo1o2 octo1u2 octo1á2 octo1é2 octo1í2 octo1ó2 octo1ú2 octa1h octa1a2 octa1e2 octa1i2 octa1o2 octa1u2 octa1á2 octa1é2 octa1í2 octa1ó2 octa1ú2 oligo1h oligo1a2 oligo1e2 oligo1i2 oligo1o2 oligo1u2 oligo1á2 oligo1é2 oligo1í2 oligo1ó2 oligo1ú2 omni1h omni1a2 omni1e2 omni1i2 omni1o2 omni1u2 omni1á2 omni1é2 omni1í2 omni1ó2 omni1ú2 i2o. i2os. paleo1h paleo1a2 paleo1e2 paleo1i2 paleo1o2 paleo1u2 paleo1á2 paleo1é2 paleo1í2 paleo1ó2 paleo1ú2 para1h para1a2 para1e2 para1i2 para1o2 para1u2 para1á2 para1é2 para1í2 para1ó2 para1ú2 para2is. aí5so. aí5sos. penta1h penta1a2 penta1e2 penta1i2 penta1o2 penta1u2 penta1á2 penta1é2 penta1í2 penta1ó2 penta1ú2 piezo1h piezo1a2 piezo1e2 piezo1i2 piezo1o2 piezo1u2 piezo1á2 piezo1é2 piezo1í2 piezo1ó2 piezo1ú2 pluri1h pluri1a2 pluri1e2 pluri1i2 pluri1o2 pluri1u2 pluri1á2 pluri1é2 pluri1í2 pluri1ó2 pluri1ú2 poli1h poli1a2 poli1e2 poli1i2 poli1o2 poli1u2 poli1á2 poli1é2 poli1í2 poli1ó2 poli1ú2 poli4u3r poli4o5mie poli4arq poli4árq poli4éste poli4andr poli4antea expoli4 .pos2t2a2 .pos2t2e2 .pos2t2i2 .pos2t2o2 .pos2t2u2 .pos2t2á2 .pos2t2é2 .pos2t2í2 .pos2t2ó2 .pos2t2ú2 .pos3tin .pos3tín pos3ta. pos3tas. s3te. s3tes. s3tal. s3ta3les. s3ti3lla. s3ti3llas. s3ti3llón. s3ti3llones. .pos3tó3ni .pos3terg .pos3te3ri .pos3ti3go .pos3ti3la .pos3ti3ne .pos3ti3za .pos3ti3zo .pos3tu3ra s3tor. s3tora. s3toras. s3tores. .pos3tu3la .pos3tu3lá .pos3tu3le .pos3tu3lé .post3elec .post3impr .post3ind .post3ope .post3rev .pre2a2 .pre2e2 .pre2i2 .pre2o2 .pre2u2 .pre2h2 .pre2á2 .pre2é2 .pre2í2 .pre2ó2 .pre2ú2 pre3elij pre3elig pre3exis pre3emin preo3cup preo2cúp pre3olí pre3opin .pro2a2 .pro2e2 .pro2i2 .pro2o2 .pro2u2 .pro2h2 .pro2á2 .pro2é2 .pro2í2 .pro2ó2 .pro2ú2 proto1h proto1a2 proto1e2 proto1i2 proto1o2 proto1u2 proto1á2 proto1é2 proto1í2 proto1ó2 proto1ú2 radio1h radio1a2 radio1e2 radio1i2 radio1o2 radio1u2 radio1á2 radio1é2 radio1í2 radio1ó2 radio1ú2 ranco1h ranco1a2 ranco1e2 ranco1i2 ranco1o2 ranco1u2 ranco1á2 ranco1é2 ranco1í2 ranco1ó2 ranco1ú2 .re2a2 .re3e4 .re2i2 .re2o2 .re2u2 .re2á2 .re2é2 .re2í2 .re2ó2 .re2ú2 ea3cio. ea3cios. ea3cia. ea3cias. .re3abr .re3ábr .re3afirm .re3afírm .re3ajust .rea3júst .rea3liza .rea3lizá .rea3líza .re3alim .rea3lism .rea3list .re3anim .re3aním .re3aparec .re3ubica .re3ubíca .reu3mati .reu3máti .re3unir .re3unír .re3usar .re3usár .re3utiliz .re3utilíz rmano1h rmano1a2 rmano1e2 rmano1i2 rmano1o2 rmano1u2 rmano1á2 rmano1é2 rmano1í2 rmano1ó2 rmano1ú2 retro1h retro1a2 retro1e2 retro1i2 retro1o2 retro1u2 retro1á2 retro1é2 retro1í2 retro1ó2 retro1ú2 romo1h romo1a2 romo1e2 romo1i2 romo1o2 romo1u2 romo1á2 romo1é2 romo1í2 romo1ó2 romo1ú2 sobre1h sobre1a2 sobre1e2 sobre1i2 sobre1o2 sobre1u2 sobre1á2 sobre1é2 sobre1í2 sobre1ó2 sobre1ú2 semi1h semi1a2 semi1e2 semi1i2 semi1o2 semi1u2 semi1á2 semi1é2 semi1í2 semi1ó2 semi1ú2 i2a. i2as. 2ótic emi2o2 seudo1h seudo1a2 seudo1e2 seudo1i2 seudo1o2 seudo1u2 seudo1á2 seudo1é2 seudo1í2 seudo1ó2 seudo1ú2 o2os. .so3a4s socio1h socio1a2 socio1e2 socio1i2 socio1o2 socio1u2 socio1á2 socio1é2 socio1í2 socio1ó2 socio1ú2 a3rio. a3rios. 3logía 4ón. 4ones. 4i4er. 4o2ico. 4o2icos. 4o2ica. 4o2icas. .su2b2a2 .su2b2e2 .su2b2i2 .su2b2o2 .su2b2u2 .su2b2á2 .su2b2é2 .su2b2í2 .su2b2ó2 .su2b2ú2 .sub2i3ll .sub2i3mien .sub3índ .sub3ími .su4b3ray .sub3aflue .sub3arr .sub3enten .sub3estim .sub3estím .sub3ofici .sub3urba .sub3alter .sub3insp .su3bién .su3bir .su3bam .su3bordin .su3bordín .sub3acuá .sub3espe .sub3esta .su3burbi .su4b5rein supe2r3r supe2r1a2 supe2r1e2 supe2r1i2 supe2r1o2 supe2r1u2 supe2r1á2 supe2r1é2 supe2r1í2 supe2r1ó2 supe2r1ú2 supe3r4a4r supe3r4á4r supe3r4á3vit. supe3r4á3vits. 4a3ción. 4a3ciones. 4e3rior. 4e3riores. 4e3riora. 4e3rioras. 4e3riormente. 4e3rioridad. 4e3rioridades. 4e3ra3ble. 4e3ra3bles. 4e3ra3blemente. pe5r4ante perpon5d6r supra1h supra1a2 supra1e2 supra1i2 supra1o2 supra1u2 supra1á2 supra1é2 supra1í2 supra1ó2 supra1ú2 sup6ra talmo1h talmo1a2 talmo1e2 talmo1i2 talmo1o2 talmo1u2 talmo1á2 talmo1é2 talmo1í2 talmo1ó2 talmo1ú2 tele1h tele1a2 tele1e2 tele1i2 tele1o2 tele1u2 tele1á2 tele1é2 tele1í2 tele1ó2 tele1ú2 4ósteo. 4ósteos. termo1h termo1a2 termo1e2 termo1i2 termo1o2 termo1u2 termo1á2 termo1é2 termo1í2 termo1ó2 termo1ú2 tetra1h tetra1a2 tetra1e2 tetra1i2 tetra1o2 tetra1u2 tetra1á2 tetra1é2 tetra1í2 tetra1ó2 tetra1ú2 topo1h topo1a2 topo1e2 topo1i2 topo1o2 topo1u2 topo1á2 topo1é2 topo1í2 topo1ó2 topo1ú2 tropo1h tropo1a2 tropo1e2 tropo1i2 tropo1o2 tropo1u2 tropo1á2 tropo1é2 tropo1í2 tropo1ó2 tropo1ú2 poi3de. poi3des. ultra1h ultra1a2 ultra1e2 ultra1i2 ultra1o2 ultra1u2 ultra1á2 ultra1é2 ultra1í2 ultra1ó2 ultra1ú2 xeno1h xeno1a2 xeno1e2 xeno1i2 xeno1o2 xeno1u2 xeno1á2 xeno1é2 xeno1í2 xeno1ó2 xeno1ú2 inter4és inter4esar inter4in inter4ino inter4ior mili4ar mili4ario para4íso para4ulata super4able super4ación super4ior tran4sacc trans4ar trans4eúnte trans4iber trans4ición trans4ido trans4igen trans4igir trans4istor trans4itab trans4it trans4itorio trans4ubsta ultra4ísmo wa3s4h .bi1anual .bi1aur .bien1and .bien1apa .bien1ave .bien1est .bien1int .bi1ox .bi1ó2x .bi1un .en1aceit .en1aciy .en1aguach .en1aguaz .en1anch .en1apa .en1arb .en1art .en2artr .en1ej .hepta1e .intra1o .intra1u .mal1acon .mal1acos .mala1e .mal1andant .mal1andanz .mal1est .mal1int .pa4n1a4meri .pa4n1europ .pa4n1afri .pa4n1ópti 3p2sic 3p2siq .re3a2eg .re3a2q .re3a2z .re3a2grup .re3i2m .re3inc .re3ing .re3ins .re3int .re3o2b .re1oc .re1oj .re3orga .re1unt .retro1a .su2d1a2fr .su2d1a2me .su2d1est su4d3oes .sur1a2me .sur1est .sur1oes .tele1imp .tele1obj .tra2s1a .tra2s1o .tra2s2oñ .tran2s1alp .tran2s1and .tran2s1atl .tran2s1oce .tran2s1ur .tri1ó2x",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=3371,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-es.rme b/Master/texmf-dist/tex/context/patterns/lang-es.rme
index eab0c448559..237969d3df1 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-es.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-es.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Spanish Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% DIVISI'ON DE PALABRAS
% ~~~~~~~~~~~~~~~~~~~~~
% hyph-es.tex 4.6
@@ -23,3 +27,4 @@
% Javier Bezos | http://www.cervantex.es/
% .............................................................
% TeX y tipografia | http://www.tex-tipografia.com/
+
diff --git a/Master/texmf-dist/tex/context/patterns/lang-et.lua b/Master/texmf-dist/tex/context/patterns/lang-et.lua
new file mode 100644
index 00000000000..5421ca92c89
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-et.lua
@@ -0,0 +1,101 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="et",
+ ["source"]="hyph-et",
+ ["texcomment"]="% Estonian Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: eehyph.tex (2004-04-13)\
+% Author: E. Saar\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% Estonian hyphenation patterns\
+% Copyright 2003 E. Saar\
+%\
+% This work may be distributed and/or modified under the conditions\
+% of the LaTeX Project Public License, either version 1.3 of this\
+% license or (at your option) any later version. The latest version\
+% of this license is in http://www.latex-project.org/lppl.txt and\
+% version 1.3 or later is part of all distributions of LaTeX\
+% version 2003/12/01 or later. \
+% \
+% This work has the LPPL maintenance status \"author-maintained\".\
+% This work consists of this file only (eehyph.tex).\
+%\
+% The patterns were generated long ago by applying patgen to\
+% an Estonian dictionary; a few patterns were added later manually \
+% to prohibit aa-bits type cases. \
+% Declare the special characters\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abdefghijklmnoprstuvzäõöüšž",
+ ["data"]=".aa4 .aasta5 .ahe4li .al4a .al4gas .antiik5 .ap3l .ap3r .art5r .au3a .eba3 .ee4 .eela4 .ek3l .ek5r .gu4a .hie5 .idi4 .inim5a .ise5e .is4o .ja4e .ja4t .ka4e .ka2o .ke5hi .kip5r .ku4pl .ku5sa .kusee4 .la4pl .le4e .le5hi .lemmik5 .le5se .lõpp3 .ma4a .maa5a .ma5j .mi5sa .mo4e .nek3 .ni4p .nisu5 .noa3 .oa3 .oo4 .pap4p .pea3a .raadio5 .re4a .re2o .rep3r .re5so .rü5hi .sak5r .sap3r .se4a .sk4 .skaa5 .so5li .sp4 .st4 .teoo4 .tet3r .tina5 .toa3 .ts4 .tsi4s .turba5 .tus2 .tu3sa .ul4ga .ulu4k .um2b .uu4 .vaa3l .vask3 .vere3 .õppe5 .ää4 .õõ4 .öö4 .ühi4s .üle3e .ür2 .üü4 aaa5l a1aas 4aab aa4bi. 5aadel. aadio5a a1ae a4aer aa4fe aa4gan aa2h aa4has aa1i aai4g aa4is a5ait aa2j aa2la aa4lae aala4r aa4las aa4leh aa4lek aa4lel aalg4 aali4ke aal3k a5allik aal3t4 aa2l3õ aa4lü aa4mad aa4man aa4mee a5ameer aa4mö 4aan aa4nam aa4nat a5andm aan4duu aa5ni aant4 aa4pek aa4pen aa4ra4b aa4raf aa4raj aara4l a5arter aa2r3õ aa4rö aa4rü aa4sab aa4sai aa4sar aa2se4 aa4so 3aas5ta a5a4sul aa4sut aa4sü 4aat aa4taa aa4tas aa4teh 5aatom aa4tõ aa4tüh a1au aaši5 a1b 4a3ba a5be 3abie a4bij 5abs a1d a4dad a4deo a2der a3di adu4r adu3se a4dö a5eali ae2d 3aed. 2aee a3ees ae4f 1aeg. ae4ga4j ae4gi 3aegn 2a1e2h 4aei 4aek a3eks 2ael a5elani ae2le ae4lo ae4lu. 4ae2m 4aen ae4pi ae2s a3esi 4aett a1f a4fek a1g 3a4gent agia4 a3go 5agreg agud4 1a2hi. ah4kar 5ahnu 4ai. ai2a 5aian ai4hu ai4ke ai4kl a3ilm ai4lu ai4me. aimp4 4ain. a5inf a5inime 4ains a3inse ai4pr ai2sa 5aistin aist4r ai4va a1j a3ja. a4jale 5ajalo a4jalu 1a2jam 4ajo ajut4 a1k akaa4s a4kaat ak4as 3aken. a3ki ak4kis ak4kr a3klas ak4lau a5klii a3krii ak3ro 4aks ak4te4l a2ku. aku4map a5kvali 3alald ala4mas a4laüh ale4le al4et alet4t 5algat al4ged a3li ali4san a4liste 5allee. al4le4h al4luj al2lü a4lob als4 4alt 4alu. a4lud 1alun alü4h a4lüt a1m 4am. a5ma. a4maad 3ametn amit4 am4o am4pal 5amper. 4amü 2an. 3analü 5anatoom an4das an4deo an4dog 2ane a4neh a3ni a4niso 4anj an4kr 3anku an4nah 4ano anos4 3ansam 4anst 3anten 5antilo ao4d ao4he a3oht ao4j ao2le ao2lu ao2m a3oma ao4nu aoo4p ao2pe a5opera ao2r a5oras a1osa ao4su a1ots a1p a2par 5aparaa a5part a3parv a3pi a3pla a3po ap4pal ap4pin ap4pis ap3ri ap3ron a4pru a3pä 4ara arak4k a4rase 5areng 3aretu 3arhit 2ari ari4al ari4ap 4ark ar4kel 5armast 5armee. a4ro4l 1arst 5artikk 3arua 3arvam 5arvestus 1arvu ar4vää asa4las a4same a4sau ase4ma as5ema. 1a2sen a4seos a4sese a4sett 3a4setu as4fä 1a2si. asi4ala asi3an a4sind asip4 5asjan askõ4 as4kõl a5slaav a4sok as3ole aso4p as4pet as3pl as2po a3spor as4san ass5t 4asti 5astme ast4rak a4su4b a4sud asui4 a4suss a5suu a1t a3ta a4taž 5ateljee atii4v atmi4k 5atroo at4ros at4rus at4soo ats4p at4sü att4s 4atu au2a aua3l au4ba. 4aud au4de. a3ui 4au2j au4ke aulu3 aulus4 au4pü4 a5urg aus4o au2su a3usul 1auto autoo4 auto5s aut4r a1v av4a a4vans a3var a4veh a1õ2 a1ö2 a1ä2 a1ü2 až4ni 4a1š 5baa baa4g baa4k baa4s bab4 bae4 bag4 ba4he ba4ju. ba3k4r bak4s bak4v bap4l bap4r ba4rõ basa4s bas4ko bas4pe bat4r 4bb 2bd be3a4 beb2 bef4 beg4 be4lü4 be2ra2 berk4 bero4 be4rõ4 be4si be4st bes4tis bet4r 4bf 4bh bha4 bi4ala bia4v 2bi1e bi4en 4binõ bi4pla bis4a bi4si bis4k 2b1j 2b1k 2b1l bl4e blet4 b2lon 2bm 2bn 4bort 2bp 2b1r 3brig bros4 2bs b3so 2bt4 4buks bu4lõ 3bum buse5 bu4si4 bus4kr 2b3v 1da daa2 da5ab daala4 da4do dae4 daf4 d5ain da4leh da4lum da4lus 5dam 4dann da4num dao4 darat4 4darb dar4de 4da4re 4daru 2darv d3arv. 4dasen da4sum 2d5b2 2dd 1de dea2 2deaa de5av ded4 2dee. dee4le 4dehe dek3l dek4s 5del. de4lau 4de4lek 4deluv de4pr dep5ressi dere4 de4rel de4rep 5dero deru4 2df 2d5g 2d1h 1di dia4v did4 dig4 dii4g diina4 dii4sa dii4su 4dilm 4dini di2os di4plo dis4ai di4sar di4sas dis4pr dit4r 2d1j 2d3k4 dkop4 2d1l dle4v dlust4 2d1m dmee4 dmi4k 2d1n 1do do4h doi4r 2dos d3osa 5dosk 2d3p4 2d1r4 5draama. drao4 3dreen d4rel d2ren 3drena 2d1s4 dsar4 2d3t2 1du du4b due4 2d5uks d4u2s du4s1a du4see dusk4 2d1v 2dõ dõ4l 4dä 2dül dü4li 4dü4r 5düü 4dž 2d2š 3dšem eaa2 ea3aj e1aas ea2b e3abi e1ae ea2hi e1ai ea2j eak4s eak4v ea2la e3ala. e1a4lu ea2me e5amet e5ann ea4nu eao4 ea2pa e1ar ea4re ea2s e4ass e5aste e5asut e3au ea2v e3ava. e1b e1d ed4a e3eali e3ees ee4fe eei4 eek4r ee2la 3eelar e5elekt eel5uu ee4nai ee4nal ee4nam ee4no eent4 ee4pai e5e4pit 5eepos ee4ral eer5ap ee4ros ee4rot ee4sin e5esine ee4s5ist 5eeskir ee4sü ee4tõm ee4tä e1f e1g egaa4 egas4t e4goi 4eha e2he. e2hi e3hin 5ehist 1e4hit 5ehiti eh4ta4 4ehä ei4dul ei4e eie5ri ei2ga e3iga. ei4ha ei4he e3ilm ei2lu ei4mem 5eine. ei4roo e5i4sa. ei4sist ei4tau ei4tõ ei4va. e3j e3ka e4kahi e3ke ek4kap ek2l ek4lo e3k4o ek3re e3krii 4eks. 5eksam. 3eksem eksi3k 3ekska eksp3r 5ekstr ek4tül e3kü elaa4v e4lagr e2lam 3elamu el4an 5elanik eleis4 e4leks 5elektro 3eleme 5elevaato e3li e4lid elii4t el4kus e4l4ob elo4p els4t elt2r el4tü e2lu 1elu. e5lub elu5i4 1e4lun e3lus. e4luss el5uss. el4üh e1m 5emand. e5mat emne3 emos4 emp4r 5emuls endus3 5enelas e5nem 3energ e4nese e4nesl enk5l enk4r en4sal en4tos en4tü eo5a eo4ja e3o4le eo2lu eo2ma eoo4p eo5pl e3osa. e3osak e5osali e5osav eos4f e3ots. e1p e3pl e4pli ep4lu e1r e3raa 5erakon 5erald e4rao erei2 erek4 5ergut erih4 eri4uu er4nau e4ro4r erp4 er2pr ers4k er4taa er4tak er4tes e4rud es1an 1e2se. e5sek e5sen e5sil eska4j eska4s eske4 es5kel esk3l esk3r es2k5ö es4laa es3ole es4or es2po e3spor es4sist 4est es4tü e3su esup4 e1t e3t4a e2ten 5etendus. etii4s et2ra et4sin et4soo et4sü et4taj 1ette et4tru et4tä et4tü 4etu e4tõ4d e4tüm eu4de e3u2j e3u2l e5u2n eu4p eu4s e5usk e3uu e1v e3v4a e1õ2 e3ö4 e1ä2 e1ü4 e1š 5faa faa4n 4fa4d 2ff 1fi fii4t 4fj 4fk 2f1l f2lo 5floora 2f1n 1fo folk5 fo4ro 2f1r f2re 3frees 2fs 2f1t ftat4 3fu 3gaa gaa4r 4gaast 4gab 4gaed gag4 2gah ga2hi gai4g ga5is ga3k4 5gam ga3o ga3p 4gart 4garv g4as 4ga4suk 5gata gat4r gau4 ga4va. ga4van 2g3b 2gd4 gea4 ge4du. gek4 ge5kl 4gekse ge4lah gela4s ge4leh ge3lu ge4lä ge4nan geok4 ge4or 4geos 4gerg ge4rus 4gf 4gg 2g1h gi2aj gii4s gi3k 4ginf 4gint gio4r gi3pl gi4san gi4sil gi4sö git4r gi4vaj 2g1j 2g1k 2g1l g4lüt 2g1m 2g1n gne4ta gne4te4 4goh go4le go4ma go4po 2g1p4 2g1r g2ran 5granaa 3g2rav g2ru 3grup 4g1s4 2g1t2 g3tr 3gu gub4 gue4 gu5i gu4nel gu3o gup4 gu4sen gu4sä guu4j 2g1v 2g3õ4 4gä gü4l 3ha haa4ri haa4s hal4lai 5har hasa4 hat4r 1he hee4m hee4s hei4s hek4v 2hel. hels4 het4r 4h1h hhe4l 1hi hia2 hii4s 5hil 5him hio2 hi4san hi4sar hise4l hi4st4 hi4sü 5hits h1j hjaa4 4hk h4kal h4kas h4kis hk3l h4ko4 hk3r hks4 hkt4 h4kusk h4ku4su h4kõ h4kä h1l hle4n 4h1m h4mo4 h4mü h1n hnika5 1ho hom4o 4hp4 hrs4 4ht h2ta hta2j h5tak hta4l ht5ar hta4su h4teg hte4n hte4r h4tid h4to h4tr ht5s4 h4tö h4tä 1hu hu3a hue4 hui4d huk4l hup4 hu3sa 2h1v hvad4 hvast4 hve4l h4vini h4vo hvu4s 1hõ 3hö 1hä 3hü 4ia iaa2 iaa4l ia5alane i3aast i5a4bi ia4bo i1ae ia2g ia2h i3aine i1a2j ia4kr i3akt i1a2la i5alb i3alli i1a2lu ia2me i5amet. ia2na i5andj i5andm ia4ne i5anne ia2p4 i3apar ia5pr ia2re i3arm ia4ru i1arv ia2s ias4ke i5aste. i3asu ia4tel iat4r i1au iau4l i5a4vaj i5avald i1b i4bad i4bau i1d 5ideaa idii4 idlu4 ie2 i3eali i1eel iei4 i1eks i5elani i1elu i3eos ie4ri iers4 i3esi ie5so i5ess ie4st i3eten ietu4s i1f i1g i4ga4g i5gar 5igatsu i4gav ig4ram ih4le ih4te ih4tin ii4a ii4deo ii4du. iie3 ii4es ii4gaa ii4ga4s ii4ha iika4 ii4kis iik4ro iiks4t iikt4 ii4lab ii4lad ii4lae ii4last ii4leh ii4lel ii4les ii2lõ4 ii4lü ii4mai iimat4 ii4met ii4nai ii4nau i5inde i5inf ii3ni i5inimen iinit4 iink4 iino4 ii4nol ii4nos ii4nõ ii4pr ii4ran ii4rau iirs4 ii4rü ii4san iise4l ii4sev ii4sik. ii2ta ii4teh iito4 ii4tom ii4tos iit5re ii4tõ ii4tü ii4ves ii4vet ii2vo i1j i1k i4kalu i4ka4re i4kark i4kaut i4k5elu ike4si i3klaa i3klas ik4ler i5klub ikop4 ikos4 i4kov i3kre ik3ro ik4sar iks4k iks4po ik3t2r i3ku iku3a il4a ila4s i4lasi ilia4 i4lisi il4kan il4kõ ille5s illo4 5ilme. il4mot 3ilmut ilo5g2 ilp3l il4ti i5lun ilu3sa 5ilustu ilü4h i1m i4melu imi4g imisu4 i4mo4l 5imper i1n ind3al 5indeks inde4r ind4re 2ine inee4s i4neh i4neks ini4kü i2nim ini4mas i4nime 5inimene 5iniml i4nini inna5a inni4si 3insen 1insp 1inst 3inven io4de io4h i3oht i5ohv io4j i5oks. io2le i3olek io2lu i5oluk io4lü io2ma i5oman ioo4da ioo4ne iooni3 io2p i3oper i5ork i1osa ios4f ios4p ios4t iost4r io4su i3ots. i3otsi io4tü i1p i3pla ip4lu ip4ro ip4sas ipse4 ip4sep ip4sus i4ra4b i4rase ir4dis ir4nõ i2rui iruu4 isaa4v isa4ja i4sana isa4re i4sarh i4selo i3sem iset4s isi4g i2so 3isola i5soli is5oma iso4r i3sot i3s4pek is3pl i3s4por is3sp 5istand i5s4tiil 5istme ist4ru ist4se i5stsee 5istutu i3su i4sõm i2sü4l isü4r 2it itaa2 itee4l it4rak it4ras it2ru4 its3k it4so itte1 itt4s iu4b iu2da iu4gi iu2j i3uju iu4la iu4mar iu4me4 iu2mo iu4ni iu4pu iu5sa i5uss. iu2su iuti4 i3uu i1v i4vad i4vakt i4va4lus i4vant i4vau i4veh ive4l iviil5 i4vü i1õ2 i1ä4 i1ü2 i1ž j4a 3jaa ja1aj jaa4l jaa4r jaa4s jab4 jad4 ja5el jae4r jag4 ja3i2 ja5kra 5jama 5jame jao4h ja3p4 jas4ke jas4tii jat4r jat4su jau4b jau4l je3lu 3jo joo4k jue4 5juma ju4sei juse4l 5jõ 5jä 1ka kaa4da kaa3de ka5aj ka4al kaa4ra kaa4sis kaa4ta 4kader 4kaed 4kaeg kae3lu kag4 kahe5i 4kaia 2kain ka5ist kaitse5 ka4jav ka4ju. k5a4lus ka4pl ka2pr 4karm 4kaset k5asj kat4r 2k3b 2kd4 1k2e ke4el kee3lu 2kehi 4keks ke4laj ke4lak ke4lok 4kemb 2ken. 5kene keo2 kes2k kesk3a4 ket5ra ket4te4 2kf4 4kg 2k1h4 1ki kie4 kik4r 4kinf kio4 ki4pr kis4a ki4san ki4sik 4kiste kit4r kiu4d kiu3su 2k1j 4k1k k3kra kks4 kku4ro 2k1l4 k2la k3la. 3klaas k3lai 3k4lamb k3lan 3klapp 5klassi k3lat 5klaver kle4a k4lee k2lei 3kleit k3lem k4lib 5klibu klig4 k2lii 3kliim 5kliiste k3lik k3lin k4link k2lo k3loom 3klots k2lub k3lus. klu4sa klu4sõ k4lut 2k1m 2k1n knaa4 k4nip 1ko 2koks k4ol ko4len koo4sa 4ko4rie 4korpi k5osa. ko4va 2k3p4 2k2r k4raan 5kraana 3kraav 3krab 3k4rae k3rai 3kramp 4kran k3rau 5kredii 3k4reem 4kreg 5k4res k5ret 4krip 5kristal k4roh 3krohv k4rook k3rut 3kruu 3kruvi 4k3rü 4k1s k5sae k4sai ksek4 ksi2k ksika4 ksit4 ksk4l ks5kõ ksp5lo ks2pr kst3r ks4tü 2kt kt2ra 1ku kui4s 4kujuj 4kujum kuk3la 4kuks kul2d 2kulp kumi4su4 kummi5 3kus ku4siv kut4r kuu4ni kuuse5 4kuž 2k1v k4van 3kvart 5kviitu 1kõ kõ4de. 2kõi k5õis 4kõp 1kö 4köd 1kä käi5s 2käk 4käm 1kü 2kühe 4küle 4küll. 2kž4 4kš 1la 5laag la4aj laa2r laar5a laa4sa 2laav 5laava 4ladj 5ladu lae4r 3laev 4lahv lai5ek5 lai4ga la4jap la4jav la3k4r lak4v la4la. 4lald la4les 4lals la4lus 3lama 3lamp 4lams la4nes 2lani lap4l 4l1arv 4larü la4sas 4lasb la4sei la4sem 4lasen l2asi 4la4sut 3lau 5laud lau4n lau5su 4lavh 2l1b l4bau lb4lo 4l1d l4dala l5dist l4don l4dü 1le le1a2 3lee leek5l lee4le leep5r le3hi 4lehit 5leht 3lej 4lekk 5leks. 4lektr lektri5 4lele le4lek 5lema. le4mor lenaa4 leo2 le3oh le5olu le4pl le2s 4lese. le3sõ 3let 4lette 4l1f lfoo4 lf4t l1g l4gae l4gai l4gall l4gann l4gase lgas4k l4ge4le l4gi4d l2go l4gu4j 2l1h 1li li4ala li5am lia4v 3lid li4dan li4ga. 4liia liie4 5liig lii4na 5lik. likai4 li3kla lik4ro 4lilm 4li4lus limi4s 4linf 4linim 4lins lin4te 4linv lio4k li3p4l li4sah li4sik 4lisol li4suj li4sõl li4sö lit4r li5tu 2liže 2l1j lja1a lja5os 2l1k lkk4 l4kli lk4lu l3kr 2l1l l5ler lli3tr l2lor l4lots llp4 lls4 llt4 l3lu l4lää 2l1m lmaa4v lmat4 l4mau l4meks lmp4 2l1n 1lo lod4r lof4 lo4gal 4loha 4lohv 5loi lok4r 2lo2l l1ole l3olij 3lolo lo4man 5loog loo4ram 4lord 4lorn 2losa l3osa. 2l1p l3plaa lp4le l4puk 2l1r lrih4 2l1s ls4ka lske4 ls4o lste4 2lt l4tau lti4l l4tok lt4sel lt4sis l4tuk l4tõm l4tää l4tüt 1lu 3lua lu3al lud4 lue4 3lug4 4luhk 4luim lu4juk 4luk. 3lukk 2lun lu4nin lu4nio luo3r lu4rau lu4see lus4tii lu4sum lu4sö 3luta lut4r 3luu 2l1v lvel4 1lõ 4lõd 4lõie 5lõik 4lõis 4lõit lõ4l lõ3pe lõp2p 1lö 4löe 1lä 4län län4gi lääne5 1lü lü3h lü4ma 1ma 3maa maa2b4 ma3abi maa3la maa3p ma4bi ma1e2 mag4l 5mahl 4mahv 4majam 4ma4ju. ma3kl mak4v 3mal ma4la. mal4ma ma4om ma3pl 4mart 4marv ma5se ma5sin ma4st 4ma4sul ma4sä 4maut 2m1b mbat4 mbe2r3 mblu4 mbo4j mb5usa 2md4 1me me1a4 me4an 3mee mee5la mee4s me3hi 4mekv mers4 mert4 me5s4o m4et 4met. 4metl 2metn met4se 4mett me5u4 2m1f 4mg4 2m1h 1mi mia4m mia4r 4mide mi4kaj mi4nah 4minf mi3ni mip4 mi2s mis1a2 mi3si mi4sig mi4sih 4mi4sik mi4sil mis3k4 mis4tii mist4r mis3ts mitte3 2m1j 2m3k4 2m1l 2m1m m4maat mma4s mm4e mme4r mmika4 mmi4kal m4mor 2m1n4 1mo 4moh mo4ha m3oks 4morg 4morn mo3sa 2mp mpa4l m4pap mp3l mp3r 2m1r mruu4 2m1s ms4o ms4p 2m1t2 m5ts 1mu mua4 mu5ah mud4 mue4 mui4m 4muls mup4 5mus mut4ra 2m1v mõ4d 4mõig 4mõp 3mö 4mök 3mä 4mäk mär4gel 3mü 4müh 4mž 1na n4aa na5ah naa4lu naa4r5a nad4 na5ei nag4l nah4ke nai4d nai4si na4kru 2nal4ü 4na4mer na4mii n5amiid nants5a na3o4 nap4l na4ret 4narv n4as 4nasb nass4 nat4ra nau4b 4nb4 4n1d n4daas n4dab n4dae nda4ko nda4l n4dau ndif4 ndip4 n4do4r n4duj ndu4sõ n4dü 1ne 5ne. nea2 nee3la nee4le nee3lu nei4v ne4lah 4nelas ne4lek neo4d ne4pl 2nerg n4es ne4tan ne4tõm 2n1f 2n1g n4gai n4gall n4gase n4gau ng4lü n4go4r ng3r ngud4 ngus4t n2gü 2n1h 1ni ni3ap nia4v nig4 nii4g nii4tu nikkel5 4nilm 5nima nima4s 5nimet 3nimi ni4mig 4niml 4nint ni4sid nis4ke 4nisl 2n1j 2nk n4ka4n nk3r nk4se nkst4 2n1l4 2n1m 2n1n nna3e nna5i nnak4r n4ne4f nnio4 nnk4 1no 4nob nod4 4noks noo4na n4or 2n3p4 2n1r 2ns n4salp ns4e nsk5r n3so nso4r nste4 ns4tee ns4tem nstis4 nst3r ns4tu nsu4s 2nt ntaa4r n4teh nte4l ntig4 n4tiso n4tots n4tr nt3ra nt3re nt4sab nt4sal nt4san nt4sar nt5sü ntt4 n4tüh n4tük 1nu nu4da nui4g nur2k nus4p 2n1v 1nõ nõ4l 4nõli 1nö 1nä 1nü 4nül 4nž 4nš oa2 oa4a o1ae o5aku o3anal o5apa oau4b o1b oba4s 1obj 4o1d odaa4 odaal3 o4deh odu4sõ od4š oe5a4 oe4fe oe2l o3ele oe4mi oe4mu o4eo oe4rah oe4rõ oe4si oet4r o1f of5r o1g og4la og4li 3ohaka oh5to 5ohvits oi2ta oiu5a o1j oju2s okast4 okku5 ok3la ok5liin okoos4 ok3r ok4re ok4ri o5kris ok4ru o3la o4lae olag4 ola4las ola4su ol4do ole4an 3olek. o4lend olig4 o3lii olii4g o4li4lu o3lis 4olj ol4lae ollis4 ol4lü ol4mai 4o3lo ol4tam ol4tar 1olu. 5olukor o4luks olõ4 o4lä 3omadu om4baj om4ban o4mok ona4a o4naj ona4ko o4neh o4nele on4gos onit4r oniu4 onsoo4 ont4re o4nuu 2o2o oo1a oo4kal ook4r oo4kää oo4lau oo4lee oo4lig oo4list oo4log oo4lõ oo4lü oo4nah oo4nar oo4nau oon4dee oonk4 oono4 oo4noh oons4 oon5t4 o5opti oo4rat oo4ree oo3sa oo4sel oo4tõ o3pa op5last. op4lu op3ra op3ri o2r3ai o4ralg ora4mii o4rana 5orav 3order 1org org4r oria4 3orju 5orkeste 3orna or4nel or4tal ort3r oru4s or4võ o2sa o4sake 3osako 4o3sau 4ose o4seks 4osf o2si. 4osin 3oskus 4osl 4oso o4sok os1ol os4pa 4oss os4saj os4sü os5taas os4tem 4osto ost4ru 5osuti 4osõ oto5a otok4 ot2ra o3tran 3otsa o5tsö ot4ta ot4teo otus4ta otü4l ou4b ou4n o1v ovaa4l ovio4 ovol4 o4vu4n o3õ4 oü2 1pa paa4ka pa3a2m paa4tel pa4e pa4lus pans4 pa4pr 5paras 3park 4parta pa4sp 4pb 4pd 1pe pe2a pea5j peas4 pe4au pea3v pe4f 4pektr pela4 4pe4lev pel4t pe4lü4 p4em pe4ol 5perd pe4tap peti4k 2pf4 pg4 2ph 1pi pii4v pik5r pin2d pin4gis pip3r pis5ta piu4g 2p1j 2p1k 2p2l4 4pla. p4laa p5laasi 3plaat p4lak p3lam p5lane. 3plasm 5plastik plek2 3plekk 4p3lem p3li 5pliia pliig4 3plok p3lom p3lu 3pluus 4plõ 2p1m 2p1n p4neu 1p4o 5po4e 3pon 3poo poo4la poola4v pordi5 4p1p ppa4k p4pas ppe3a ppee4 pp3l p2p3r pps4 p4pud p4põ p4pü p2r4 2pra 3praa 3prag 3prakt p5rau p4rep p4resi 4prib 2prii p5riit p4rog p4roo 4p4ros 3p4rot 4prum 5pruu 2p1s ps4a p4sor 3p2sü 2p1t p4tak 3pu pua4 pu4da puha4 pui4t puk4k pul4ti 4purt pus4p 2p1v 3põ põhi3 p4õi põi4s põli4 5pö 1pä pär4gu 4päs 3pü pü3he 4pž 4pš 1ra raal3a 4raale 5raalne raa4lu raamatu5 raa4ta4 4raatt raa4tu 4raav 5raaš raie3 2rain r3aine rai4si r5a4la. ral4t ra4lus 3rame ran4dem ra3om 4rapa ra4pl 4rapt 4rarb ra4ren 4rars 2rarv ra4sal 4rasen ra4sis rast4r ra4suk ra4sul ra4sut 5ratas ratiiv5a rat4sen raua3 rau2d raud5o 2rauk 4raum 4raur rau4te 5ravi 2r1b r4bae 4r1d r4dae r2dar rde3a rd4re r4duj r4dü 1re 5re. 5rea reb2 ree4le ree4ma. ree4man 3reer 3reet 5reg 2rehi rei4se rek3l 4reks re4lai re4liit 5relv re4mää 4repp re2pr rep3re re4sin re3te ret4k re4tr ret5s 2r1f rf4r 2r1g r4gae rg3ah rga4re r4geh rgi4me r5g2ra 2r1h 1ri 3ria ri3am ri5ast 5rid 2rig ri4ga. 3rige rig4r 2riib 5riie 4riinu ri4kis ri3k4r 4rilm 3rim ri5oks rio4r 3rip rip4li 4rip2p 4ri4sa. ri4sah ri4sar ri4ses 4risol ri4tol ri3t2r 5riu 5riv 4riö 2r1j 2r1k r4kad rk5ain rka4se r4kek rkt4 2r1l 2r1m r4mald r4me4le r4mig rmo4ra rmo4s rmp4 rms4 2r1n r4nad r4neh rnk4 1ro roa4 ro3e2 rok4k rol4la rol4le 4romb 2romi ro4nop roo4ga 4rosa ros4po ro5staati rost4r 4rož 2r1p rp5ret 2r1r r3ri 2rs rsaa4l rs4l rs4o r5s2po rs4tak 2rt r4tah r4tos rt2r rt4ra r4tri rt5roo rt4sai 1ru 2rua4 rud4 r4uj ru3kr 3ruma 4rumb 2rumm 4rump 5rus. ru4set ru4sin ru4sul rut4r ruum5a 4ruur 2r1v rva4la rva4lu r4vann rvas5k rvis4k r4voh r4vok 1rõ 2rõ2l r5õli rõn4gu 4rõr 3rö 4rök röö4pe rööp5l 1rä 4rä4r 1rü 4rük 4rüm 4rü4r 4rž 4rš 1sa 3s2aa saa5j saa4lu sa4an 4s3aas 3saba sa4bi. 4sabo s4ad 5sada 4sade s5ader 2s1ae sae4l 5sa5ga s4age sa4gu 4sahv 3sai. 4saia s1ain s4ajan sa4ju. sak4ro 5saks 4saku. sa4kää 4s3a4la. 4salas s4alat 5salat. sa4lev 4salla 4sallu 3salt sa4lum 5salv 3s4am 4samp 4sank 4s5ann s4ant 4santi s4anu sa4num sa2pr sa4ris s4arv. sar4va sase4 3sasti sas4tii sa4suk sa4sum 3sat 4satl s5avald 2s3b2 2s3d2 1se 3sead se3ala s5eali se5aval se4du. 4seela see4le s5eeln see4ma 4seepi 3seer see4si see4ta4 4se4fe 5seg sega5a 2seh 3seha 3seho 5sehu 5sehä 3sei sei4d sei4si 3seka se3kl 4s5eksp se4laj 4selek 5seli 4sellu 3selt 2selu 4sens se5oh seo4k se5om seo4p seo4r 3sep sepat4 4serem 4sese. se4si. 4se4sin s5esit ses4k 3sest 4s5eten se3t2r 4sette 2s1f2 2s1g2 2s1h 1si 3sia sia4h sie4 5sign sig4ra s5i4ha. sii4g sii4sa sii4se 4siits sii4tu si4ket siko4d siks4p sikt4 sik4vi 4sinim s5inime 4sins sio4le si4pro 4sirr 5siru 4si4sa. si3se s5i4sik sis2p sisse3 s5istuj 5sisu 2s1j sja5ar 2s1k 4ska 5skaa5la ska4no 5skeem. s4kela 5skelet s5ken ski4g sk2l s5klas 5skler skuk4 3skulp sku4si 2s1l 4s1m sma4sa 2s1n sne4p 1so 3sobi 3soe s1oht 3soi s5oks. 2so2l s3olek s3olij 5solo so3lut so2ma 3son 3soo soo5o 4so4pe so4pr 5sor. s3orj 3sort 2s1os 4sotsu 2s1p s5per 2s1r 2s1s ssel4l ss2fä ssin4 s4sinf ssk4 ss4ke ss2p s5spor ss2t s5stat ss4ti sst5r s4suss 2s1t s2taa 3staad 5staaš s4tain 4stam 5standard 3start s4tati 5statis s4teno 5stepp stet4 s4toh s4top s4tot 5streik 5strek 5struktu st4so stt4 stu2s stu4s5a 3stuud stä4 s4tär s4tüh 1su sua2 su4bar sud4r su4du su5e su4jul 4suks s5uks. 5sulg sul4ga sun4de4 su4nis supe4 supe5s su4pr 4surb 5sus. sus4aa su4ses s5uss. sus4ti su4sun sut4r sut4ü 4suug suu4ra suusa3 2s1v svus4t 1sõ 5sõda sõ4de 4s3õh 3sõid 4sõie 2s1õig 2s5õis 3sõit sõ2l 2s3õli 3sõlm 3sõn 2s1õp 5sõr sõsa4 2s3õu 1sö 4söd sö2k 2sön 1sä 4säk 4säm 1sü 4süa 5süd 5süg 2süh s3ühi 2sük s3üks sü4la sül5di sü3lem 4sülo sü4ra 3süs 3süü 4sž 1ta 3ta. 3taat. 2tabi 4t3aed t3aine 4tais 4ta4ko t2al 4ta4laj ta4lev tal4las ta3lu ta4lus 3tam 5tama 4tanda ta4ot ta4pla ta4pr 4ta4ret 4tarm 2tart ta4se4r ta4ses ta4set ta4sis ta4sü 2taut 3tav ta4vaj 2t1b4 2td2 1t2e te4aa tea4g tea4h te3an te5as 3tee tee5lu te4et te3hi tehi4s te3kl tek4r tek4v tel4ke te4lok te3lu. 4tepiv tep4l 2tepp 3ter 5ter. te5r4a terd4 4terg ters4 tes4a te4sin tes4k 2t1f 4t1g4 2t1h thõl4 3ti tia2 ti3e tii2k tii4ma tii4sa tii4ve tik4o ti3k4r tik4vi 4tilm 5tima 4tinf tin4ga ti4sai tisa4v ti4sik titee4 2t1j 2t1k2 t3kl t3kr 2t1l4 tlu4 2t1m tmika4 tmis3 2t1n 3t2o 4to4da toen4 tog6 4toks. toksi5k to4lek to4lu. to4lum tonis4 to4o too4no too4pe to4rau tos4p tost4 2t3p4 2t1r t4rad t2raf 3trafo t4rahh 5trall t2ran 3trans t4rate 5traum t2re 3treen t4rei 5treim 3trep t3rig 5triib 5triip 5trikoo. tri4pl t4ross 3trumm 5t4rup 3t2ruu 3t2rü 4trüü 2t1s t3s2a ts4aa tsa5is t4saju tsa4lan 3tsehh tse3la 5tsellu 5tsemen 4tsena 5tsensu tsig4 5tsiitsi t4sink 5tsiste ts4laa t2soo t4sor tsp4 t4suss 2t1t t4tad ttee2 ttes2 t5tsem 3tu 4tuim tu4raj tus1a tu4s5ee tu2si tus3s 4t5uss. tus3t2 tu5su tu4sä4 tusü4 4tutop 4tuud tuule5 2t1v 1tõ 5tõb 2tõi tõ4l 4tõ4n 4tõp 2t5õun 1tö 4töe 4tök töö5k töö3p 1tä täh4t3a tä5ke 4täm 1tü tü5he. tü3hi 2t1ž t2že 5tžek 3tžem uaa4 u3aast ua2b u5abi u1ae ua4he uai4k u3ain ua2ja u3akt ua2l u3all u3amet u1an ua4nu u5apar ua2re ua5ree u5art ua2s u3ast u1au uau4d ua2v u5avald u1b u4dalu u4deh udeo4 udo4r u5eal u3eel u3eks ue2ma ueo4 ue4r u1f u1g u4gi4d ug2ra u5graa u4gü uh4tem uh4ter uh4tin uh4tis uidu5 ui2ga ui4h u3iha u3ilm 5uim. uina2 uinas5 ui4si 3uisut uite4h ui4to ui4vala ui4vel ui4vo u1j u5ja u4juj u4jum 3ujumi u1k ukaa4s ukii4g ukki5 ukop4 u3kraa u5kro uku4sa uk4vi ul4a ul4deh uldi4 ul4kr ul4len ul4lui ultra5 u3lu uluo4 4u1m umaf4 u4mau 5umbroh umet4 umf4 umia4 umit4 um5p4r unaa4 unaal5 un4dak un4dan un4das un4do u4ni. u1o2 uo4h u2or u3org u1p u3pla up3le uppe4 up4pis uraa4l u4rag ura4ju u4rala u4rap ur5auk ura4va 3urb. urde3 urea4 u4reos ures4k u4rett urgas4 5urge. u4ri4met u4rini uris4k urka4v uro4r u4rulu u2sa2 u5sa. usad4 u4sae u4salu us5aste u3sea useg4 us5elek u4sett u3setu u5sev us4fä us5g u4si4d usi4g u4si4h us5ind usi4va us3kr u2so us5o2h us3ole uso4r us3p4 u3s4por usui4 3usuli u4suss u2sõ u2sü us3üh u1t ut4kl utos2 utot4 ut4ru ut4so utt4r utu4s utü4h uu5al 4uud uu4du. uu4kak uuk5ri uu4mal uu4mis uu4pü uu4ran uu4ras uu4rau uu4rav uu3sa uusa3k uus4ke u3uss. uu4sul 4uut uu4tas uu4tis uu4tüh u5uuri u1v u4vau u1õ2 uä2 u3är u1ü2 už4l vaa4re4 va4as 4vabi vae4r vag4 va5he 4vaia 4v3ain vak4v va4la. va4lai 4valdi val4ga4 va4lü vana5i vane2 4vanku van4ta van4te vap4r v4ar 4varm var4p 2vart 4varuh 4varve va4sas vas4k vast4r vat4r 4vatud vau4d vav4 4vb 2v1d 3ve vee3a vee3k vee5la vee3sp 4vehi vei4sa ve4ol veot4 ve4rah ves4p 2vf 2vg4 2v1h 3vi via2 vid4 4videa vip4 vi3pl vir4k vi4sak vis4ko4d 2v1j 2v1k 2v1l 2v1m 2v1n voo5lu 2v5p 2v1r 2v1s 2v1t2 v3tr vu4sa vu4su4 2v1v 3võ 4võig 4võ4li 4võm võr4k5 3vä vää4re4 vää4ru 3zo zook4 zoos4 õ1b õbe3 õ1d õea4 õe4lan õe3lu õet2 õeu4 õ1g õh4vu õi4a õi4b õie5k 3õiel 3õigu õi4ko õise4 õi4su4 õ1j õk4kõ õl2d õ4lim õ4lit õl4mad 3õmbl õnet4s õ2p õ3pa õpi5e õp2pa 4õp3r õranda5 õra4s õr4da õr4gaa õr4gar õr4go 4õs õs4a õ4tü4 õude3 õ1v4 õõ5p õõre4 õõ4rel õõ4ta öa2 ö1b ö1d 5ö2dee ödi4k 3öeld öep4 öet4r ö1g4 ö1h öi4a öi4g öi4s ö1j ö1k ö2kon 3ökono ök4v ö1l öli2s ölis5a ö1m öo2 ö2p3au öp4lu ö4raa ö4rau ör4da ör4dell ör4e ö4ri4l ö4ro4 ö4rä ö4rül ös4tii ö4to4 ö4tü4 ö1v ö3õ öö3a öö3e4 öö5i 3öölan öö3o ööt4r öü4 äa4 ä1b äbus5 äbut4 ä1d äe3a4 äe1o ä1g äga4ri ähe5a äidi4s äike3 äi4lo äi4lu äi2s äisa4 äi4sõ äi4tar ä3j ä2ke 3äke. ä5ker ä4kõ äli2s äl4ko 5ämbl ä4nah än4deo änet4 än4to4 äok4 ä4ra5a ära3o4 ä4rar äre4lis äret4 ärge4l ärii4 äri4kl äri4sel ä4riste är4kar ä4ro 5ärrit är4ta är2va ä4rõ äs4ko äs4nai äs4p äs4san äs4so ät4ri äu4d ä1v ävee4 ää4kin ääo4 ää4rase 5ääris. üaa4 ü1b üdame5 ü1g ü2h ühe5i4 1ühen 3ühik. ü3hit ü1j ükan4 ük4kas ük3l ül2d üld5a2 ü2le 3ülek ü5lel üle4mas 1üles ülesä4 ül4gav ül4gee ü4lih ülii4 3üliko ü4liõ ül5kl ül5la ül4mei ülo4r ülp4 ült4 üma4rak üma4ru ümi4ko ü5ne üni4s üot4 üp3l üp5p4 üp3r üpsu4 ürd4 ürik4 üs4o üs4pr üs4tal üs4tas üta4r ütee4l 5ütlev ü4t3r üt4ru ü1v ü4ü üü2l3a2 üü4le üü4lo üü4pe 1ža 4žb 1že 5žee 5žer 4žf 1ži 4žj 4žk 4žl 4žm 4žn 3žo 4žp 4žt 5žö 5žü 2žž 3ša 4šak 4šau 1še 3š4i šis4k 4šk 5šo 4št 3šu4",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=3691,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-et.rme b/Master/texmf-dist/tex/context/patterns/lang-et.rme
index 366ddcb9089..38c21f4ad25 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-et.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-et.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Estonian Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -77,4 +81,4 @@
% an Estonian dictionary; a few patterns were added later manually
% to prohibit aa-bits type cases.
% Declare the special characters
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-eu.lua b/Master/texmf-dist/tex/context/patterns/lang-eu.lua
new file mode 100644
index 00000000000..1af8e9b1fad
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-eu.lua
@@ -0,0 +1,66 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="eu",
+ ["source"]="hyph-eu",
+ ["texcomment"]="% Basque Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% Hyphenation patterns for Basque.\
+%\
+% This file has first been written by Juan M. Aguirregabiria\
+% (juanmari.aguirregabiria@ehu.es) on February 1997 based on the\
+% shyphen.sh script that generates the Spanish patterns as compiled\
+% by Julio Sanchez (jsanchez@gmv.es) on September 1991.\
+%\
+% In June 2008 the generating script has been rewritten into ruby and\
+% adapted for native UTF-8 TeX engines. Patterns became part of hyph-utf8\
+% package and were renamed from bahyph.tex into hyph-eu.tex.\
+% Functionality should not change apart from adding ñ by default.\
+%\
+% The original Copyright followed and applied also to precessor of this file\
+% whose last version will be always available by anonymous ftp\
+% from tp.lc.ehu.es or by poynting your Web browser to\
+% http://tp.lc.ehu.es/jma/basque.html\
+%\
+% For more information about the new UTF-8 hyphenation patterns and\
+% links to this file see\
+% http://www.tug.org/tex-hyphen/\
+%\
+% COPYRIGHT NOTICE\
+%\
+% These patterns and the generating script are Copyright (c) JMA 1997, 2008\
+% These patterns are made public in the hope that they will benefit others.\
+% You can use this software for any purpose.\
+% However, this is given for free and WITHOUT ANY WARRANTY.\
+%\
+% You are kindly requested to send any changes to the author.\
+% If you change the generating script, you must include code\
+% in it such that any output is clearly labeled as generated\
+% by a modified script.\
+%\
+% END OF COPYRIGHT NOTICE\
+%\
+% Open vowels: a e o\
+% Closed vowels: i u\
+% Consonants: b c d f g j k l m n ñ p q r s t v w x y z\
+%\
+% Some of the patterns below represent combinations that never\
+% happen in Basque. Would they happen, they would be hyphenated\
+% according to the rules.\
+% \
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefgijklmnopqrstuvwxyzñ",
+ ["data"]="1ba 1be 1bo 1bi 1bu 1ca 1ce 1co 1ci 1cu 1da 1de 1do 1di 1du 1fa 1fe 1fo 1fi 1fu 1ga 1ge 1go 1gi 1gu 1ja 1je 1jo 1ji 1ju 1ka 1ke 1ko 1ki 1ku 1la 1le 1lo 1li 1lu 1ma 1me 1mo 1mi 1mu 1na 1ne 1no 1ni 1nu 1ña 1ñe 1ño 1ñi 1ñu 1pa 1pe 1po 1pi 1pu 1qa 1qe 1qo 1qi 1qu 1ra 1re 1ro 1ri 1ru 1sa 1se 1so 1si 1su 1ta 1te 1to 1ti 1tu 1va 1ve 1vo 1vi 1vu 1wa 1we 1wo 1wi 1wu 1xa 1xe 1xo 1xi 1xu 1ya 1ye 1yo 1yi 1yu 1za 1ze 1zo 1zi 1zu 1l2la 1l2le 1l2lo 1l2li 1l2lu 1r2ra 1r2re 1r2ro 1r2ri 1r2ru 1t2sa 1t2se 1t2so 1t2si 1t2su 1t2xa 1t2xe 1t2xo 1t2xi 1t2xu 1t2za 1t2ze 1t2zo 1t2zi 1t2zu 1b2la 1b2le 1b2lo 1b2li 1b2lu 1b2ra 1b2re 1b2ro 1b2ri 1b2ru 1d2ra 1d2re 1d2ro 1d2ri 1d2ru 1f2la 1f2le 1f2lo 1f2li 1f2lu 1f2ra 1f2re 1f2ro 1f2ri 1f2ru 1g2la 1g2le 1g2lo 1g2li 1g2lu 1g2ra 1g2re 1g2ro 1g2ri 1g2ru 1k2la 1k2le 1k2lo 1k2li 1k2lu 1k2ra 1k2re 1k2ro 1k2ri 1k2ru 1p2la 1p2le 1p2lo 1p2li 1p2lu 1p2ra 1p2re 1p2ro 1p2ri 1p2ru 1t2ra 1t2re 1t2ro 1t2ri 1t2ru su2b2r su2b2l",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=192,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-eu.rme b/Master/texmf-dist/tex/context/patterns/lang-eu.rme
index 9ad59af7dd8..7f18201e6a7 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-eu.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-eu.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Basque Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% Hyphenation patterns for Basque.
%
% This file has first been written by Juan M. Aguirregabiria
@@ -42,4 +46,4 @@
% Some of the patterns below represent combinations that never
% happen in Basque. Would they happen, they would be hyphenated
% according to the rules.
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-fi.lua b/Master/texmf-dist/tex/context/patterns/lang-fi.lua
new file mode 100644
index 00000000000..cee3a745917
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-fi.lua
@@ -0,0 +1,99 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="fi",
+ ["source"]="hyph-fi",
+ ["texcomment"]="% Finnish Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: fihyph.tex (yyyy-mm-dd)\
+% Author: Kauko Saarinen\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% -----> Finnish hyphenation patterns for MLPCTeX <------\
+% First release January -86 by Kauko Saarinen,\
+% Computing Centre, University of Jyvaskyla, Finland\
+%\
+% Completely rewritten January -88. The new patterns make\
+% much less mistakes with foreign and compound words.\
+% The article \"Automatic Hyphenation of Finnish\"\
+% by Professor Fred Karlsson is also referred\
+% ---------------------------------------------------------\
+%\
+% 8th March -89 (vers. 2.2), some vowel triples by Fred Karlsson added.\
+% 9th January - 95: added \\uccode and \\lccode by Thomas Esser\
+%\
+% ********* Patterns may be freely distributed **********\
+%\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvyäö",
+ ["data"]="1ba 1be 1bi 1bo 1bu 1by 1da 1de 1di 1do 1du 1dy 1dä 1dö 1fa 1fe 1fi 1fo 1fu 1fy 1ga 1ge 1gi 1go 1gu 1gy 1gä 1gö 1ha 1he 1hi 1ho 1hu 1hy 1hä 1hö 1ja 1je 1ji 1jo 1ju 1jy 1jä 1jö 1ka 1ke 1ki 1ko 1ku 1ky 1kä 1kö 1la 1le 1li 1lo 1lu 1ly 1lä 1lö 1ma 1me 1mi 1mo 1mu 1my 1mä 1mö 1na 1ne 1ni 1no 1nu 1ny 1nä 1nö 1pa 1pe 1pi 1po 1pu 1py 1pä 1pö 1ra 1re 1ri 1ro 1ru 1ry 1rä 1rö 1sa 1se 1si 1so 1su 1sy 1sä 1sö 1ta 1te 1ti 1to 1tu 1ty 1tä 1tö 1va 1ve 1vi 1vo 1vu 1vy 1vä 1vö 1st2r ä2y y1a2 y1o2 o1y ö2y u1y2 y1u2 ö3a2 ö3o2 ä3a2 ä3o2 ä1u2 ö1u2 a1ä a1ö o1ä o1ö u1ä2 u1ö2 ä2ä ö2ö ä2ö ö2ä aa1i2 aa1e2 aa1o2 aa1u2 ee1a2 ee1i2 ee1u2 ee1y2 ii1a2 ii1e2 ii1o2 uu1a2 uu1e2 uu1o2 uu1i2 e1aa i1aa o1aa u1aa u1ee a1uu i1uu e1uu o1uu ää1i ää1e ää3y i1ää e1ää y1ää i1öö a1ei a1oi e1ai i1au y1ei ai1a ai1e ai1o ai1u au1a au1e eu1a ie1a ie1o ie1y io1a2 io1e2 iu1a iu1e iu1o oi1a oi1e oi1o oi1u o1ui ou1e ou1o ue1a ui1e uo1a uo1u e1ö2 ö1e2 .ä2 u2s yli1o2p ali1a2v 1sp2li alous1 keus1 rtaus1 2s1ohje 2s1a2sia 1a2sian 1a2siat 1a2sioi r2as l2as 2s1o2pisk 2n1o2pet 2s1a2loi 2n1o2pist 2s1o2pist 2s1o2sa 2n1o2sa alkei2s1 perus1 2s1i2dea. 2s1i2dean 2s1e2sity 2n1e2dus 2s1ajatu 2s1ase 2s1apu 2s1y2rit .ydi2n1 .suu2r1a2 2s1y2hti 2n1otto 2n1oton 2n1anto 2n1anno 2n1a2jan 2n1aika 2n1o2mai 2n1y2lit 2s1a2len 2n1a2len 1a2siaka2s1 ulo2s1 2n1a2jo 2s1a2jo b2l 1b2lo bib3li b2r 1b2ri 1b2ro 1b2ru d2r 1d2ra f2l 1f2la f2r 1f2ra 1f2re g2l 1g2lo g2r 1g2ra k2l 1k2ra 1k2re 1k2ri 1k2v 1k2va p2l p2r 1p2ro c2l q2v 1q2vi sc2h ts2h ch2r",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=286,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-fi.rme b/Master/texmf-dist/tex/context/patterns/lang-fi.rme
index e41b98a9e4a..624b72ddcd1 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-fi.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-fi.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Finnish Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -75,4 +79,4 @@
%
% ********* Patterns may be freely distributed **********
%
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-fr.lua b/Master/texmf-dist/tex/context/patterns/lang-fr.lua
new file mode 100644
index 00000000000..fd91762466f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-fr.lua
@@ -0,0 +1,127 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="fr",
+ ["source"]="hyph-fr",
+ ["texcomment"]="% French hyphenation patterns (V2.12, 2002/12/11)\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: frhyph.tex <2006-10-20>\
+% Author: R. Bastian, D. Flipo, B. Gaulle <cesure-l at gutenberg.eu.org>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% French hyphenation patterns\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+% This file is available for free and can used and redistributed\
+% asis for free. Modified versions should have another name.\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+% \\message{frhyph.tex - French hyphenation patterns (V2.12) <2002/12/11>}\
+%\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+% *BEFORE* using this file *PLEASE* run checksum on it: %\
+% checksum -v frhyph.tex %\
+% to make sure that it hasn't been damaged. %\
+% Then if you notice anything wrong in french hyphenation please report to %\
+% R. Bastian, D. Flipo, B. Gaulle at the email address: %\
+% cesure-l@gutenberg.eu.org %\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+%% checksum = \"37208 1458 3078 34821\"\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+%%%%%%%% The most famous good guys who worked hard to obtain something usable. \
+% Jacques Desarmenien, Universite de Strasbourg :\
+% - << how to run TeX in a French environment: hyphenation, fonts,\
+% typography. >> in Tugboat, 5 (1984) 91-102. and TeX85 conference\
+% - << La division par ordinateur des mots francais :\
+% application a TeX >> in TSI vol. 5 No 4, 1986 (C) AFCET-\
+% Gauthier-Villars\
+% Norman Buckle, UQAH (nb; many additions)\
+% Michael Ferguson, INRS-Telecommunications (mjf) June 1988\
+% Justin Bur, Universite de Montreal (jbb; checked against original list)\
+% all patterns including apostrophe missing from nb list\
+% after that, GUTenberg and specially Daniel Flipo and Bernard Gaulle\
+% did their best effort to improve the list of patterns.\
+%\
+% -----------------------------------------------------------------\
+%\
+% Adaption of these patterns for\
+% - TeX Version 3.x and MLTeX 3.x (2.x)\
+% and\
+% - all fonts in T1/`Cork' and/or CM/OT1 encoding\
+% by Bernd Raichle 1996/08/28 (using ideas from `ghyph31.tex'\
+% as of 1994-02-13 maintained by Bernd Raichle).\
+% (An adaption for the old MLTeX 2.x exists but can not be\
+% tested in lack of an executable.)\
+%\
+% -----------------------------------------------------------------\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyzàâçèéêîïôûœ’",
+ ["data"]="2’2 .a4 ’a4 .â4 ’â4 ab2h .ab3réa ’ab3réa ad2h a1è2dre .ae3s4ch ’ae3s4ch 1alcool a2l1algi .amino1a2c ’amino1a2c .ana3s4tr ’ana3s4tr 1a2nesthési .anti1a2 ’anti1a2 .anti1e2 ’anti1e2 .anti1é2 .anti2enne ’anti2enne ’anti1é2 .anti1s2 ’anti1s2 .apo2s3ta ’apo2s3ta apo2s3tr archi1é2pis .as2ta ’as2ta a2s3tro 1ba 1bâ .bai2se3main 1be 1bé 1bè 1bê 4be. 4bes. 2bent. 1bi 1bî .bi1a2c .bi1a2t .bi1au .bio1a2 .bi2s1a2 .bi1u2 1b2l 4ble. 4bles. 2blent. 1bo 1bô 1b2r 4bre. 4bres. 2brent. 1bu 1bû 1by 1ç 1ca 1câ ca3ou3t2 1ce 1cé 1cè 1cê 4ce. 4ces. 2cent. ja3cent. ac3cent. é3cent. munifi3cent. réti3cent. privatdo3cent. inno3cent. es3cent. acquies4cent. is3cent. immis4cent. .ch4 1c2h 4ch. 2chb 4che. 4ches. 2chent. .chè2vre3feuille 2chg ch2l 4chle. 4chles. chlo2r3a2c chlo2r3é2t 2chm 2chn 2chp ch2r 4chre. 4chres. 2chs 2cht 2chw 1ci 1cî .ci2s1alp 1c2k 4ck. 2ckb 4cke. 4ckes. 2ckent. 2ckf 2ckg 2ck3h 2ckp 2cks 2ckt 1c2l 4cle. 4cles. 2clent. 1co 1cô co1acc co1acq co1a2d co1ap co1ar co1assoc co1assur co1au co1ax 1cœ co1é2 co1ef co1en co1ex .con4 .cons4 .contre1s2c .contre3maître co2nurb .co1o2 .co2o3lie 1c2r 4cre. 4cres. 2crent. 1cu 1cû 1cy .cul4 1d’ 1da 1dâ .dacryo1a2 d1d2h 1de 1dé 1dè 1dê 4de. 4des. 2dent. déca3dent. é3dent. cci3dent. inci3dent. confi3dent. tri3dent. dissi3dent. chien3dent. .ar3dent. impu3dent. pru3dent. .dé1a2 .dé1io .dé1o2 .dé2s .dé3s2a3cr .dés2a3m .dé3s2a3tell .dé3s2astr .dé3s2c .dé2s1é2 .dé3s2é3gr .dé3s2ensib .dé3s2ert .dé3s2exu .dé2s1i2 .dé3s2i3d .dé3s2i3gn .dé3s2i3li .dé3s2i3nen .dé3s2invo .dé3s2i3r .dé3s2ist .dé3s2o3dé .dé2s1œ .dé3s2o3l .dé3s2o3pil .dé3s2orm .dé3s2orp .dé3s2oufr .dé3s2p .dé3s2t .dé2s1u2n 3d2hal 3d2houd 1di 1dî di2s3cop .di1a2cé .di1a2cid .di1ald .di1a2mi .di1a2tom .di1e2n .di2s3h 2dlent. 1do 1dô 1d2r 4dre. 4dres. 2drent. d1s2 1du 1dû 1dy .dy2s3 .dy2s1a2 .dy2s1i2 .dy2s1o2 .dy2s1u2 .e4 ’e4 .ê4 ’ê4 .é4 ’é4 .è4 ’è4 éd2hi 1é2drie 1é2drique 1é2lectr 1é2lément .en1a2 ’en1a2 1é2nerg e2n1i2vr .en1o2 ’en1o2 épi2s3cop épi3s4cope e2s3cop .eu2r1a2 ’eu2r1a2 eu1s2tat extra1 extra2c extra2i 1fa 1fâ 1fe 1fé 1fè 1fê 4fe. 4fes. 2fent. 1fi 1fî 1f2l 4fle. 4fles. 2flent. 1fo 1fô 1f2r 4fre. 4fres. 2frent. f1s2 1fu 1fû 1fy 1ga 1gâ 1ge 1gé 1gè 1gê 4ge. 4ges. 2gent. ré3gent. entre3gent. indi3gent. dili3gent. intelli3gent. indul3gent. tan3gent. rin3gent. contin3gent. .ar3gent. ’ar3gent. ser3gent. ter3gent. résur3gent. 1g2ha 1g2he 1g2hi 1g2ho 1g2hy 1gi 1gî 1g2l 4gle. 4gles. 2glent. 1g2n ’a2g3nat .a2g3nat a2g3nos co2g3niti ’i2g3né .i2g3né ’i2g3ni .i2g3ni .ma2g3nicide .ma2g3nificat .ma2g3num o2g3nomoni o2g3nosi .pro2g3nath pu2g3nable pu2g3nac .sta2g3n .syn2g3nath wa2g3n 4gne. 4gnes. 2gnent. 1go 1gô 1g2r 4gre. 4gres. 2grent. 1gu 1gû g1s2 4gue. 4gues. 2guent. .on3guent. ’on3guent. 1gy 1ha 1hâ 1he 1hé 1hè 1hê hémi1é hémo1p2t 4he. 4hes. 1hi 1hî 1ho 1hô 1hu 1hû 1hy hypera2 hypere2 hyperé2 hyperi2 hypero2 hypers2 hype4r1 hyperu2 hypo1a2 hypo1e2 hypo1é2 hypo1i2 hypo1o2 hypo1s2 hypo1u2 .i4 ’i4 .î4 ’î4 i1algi i1arthr i1è2dre il2l cil3l rcil4l ucil4l vacil4l gil3l hil3l lil3l l3lion mil3l mil4let émil4l semil4l rmil4l armil5l capil3l papil3la papil3le papil3li papil3lom pupil3l piril3l thril3l cyril3l ibril3l pusil3l .stil3l distil3l instil3l fritil3l boutil3l vanil3lin vanil3lis vil3l avil4l chevil4l uevil4l uvil4l xil3l 1informat .in1a2 ’in1a2 .in2a3nit ’in2a3nit .in2augur ’in2augur .in1e2 ’in1e2 .in1é2 ’in1é2 .in2effab ’in2effab .in2é3lucta ’in2é3lucta .in2é3narra ’in2é3narra .in2ept ’in2ept .in2er ’in2er .in2exora ’in2exora .in1i2 ’in1i2 .in2i3miti ’in2i3miti .in2i3q ’in2i3q .in2i3t ’in2i3t .in1o2 ’in1o2 .in2o3cul ’in2o3cul .in2ond ’in2ond .in1s2tab ’in1s2tab ’inte4r3 .intera2 ’intera2 .intere2 ’intere2 .interé2 ’interé2 .interi2 ’interi2 .intero2 ’intero2 .inte4r3 .interu2 ’interu2 .inters2 ’inters2 .in1u2 ’in1u2 .in2uit ’in2uit .in2u3l ’in2u3l io1a2ct i1oxy i1s2tat 1j 2jk 4je. 4jes. 2jent. 1ka 1kâ 1ke 1ké 1kè 1kê 4ke. 4kes. 2kent. 1k2h 4kh. .kh4 1ki 1kî 1ko 1kô 1k2r 1ku 1kû 1ky 1la 1lâ 1là la2w3re 1le 1lé 1lè 1lê 4le. 4les. 2lent. .ta3lent. iva3lent. équiva4lent. monova3lent. polyva3lent. re3lent. .do3lent. indo3lent. inso3lent. turbu3lent. succu3lent. fécu3lent. trucu3lent. opu3lent. corpu3lent. ru3lent. sporu4lent. 1li 1lî 1lo 1lô l1s2t 1lu 1lû 1ly 1ma 1mâ .ma2c3k .macro1s2c .ma2l1a2dres .ma2l1a2dro .ma2l1aisé .ma2l1ap .ma2l1a2v .ma2l1en .ma2l1int .ma2l1oc .ma2l1o2d .ma2r1x 1me 1mé 1mè 1mê .mé2g1oh .mé2sa .mé3san .mé2s1es .mé2s1i .mé2s1u2s .méta1s2ta 4me. 4mes. â2ment. da2ment. fa2ment. amalga2ment. cla2ment. ra2ment. tempéra3ment. ta2ment. testa3ment. qua2ment. è2ment. carê2ment. diaphrag2ment. ryth2ment. ai2ment. rai3ment. abî2ment. éci2ment. vidi2ment. subli2ment. éli2ment. reli2ment. mi2ment. ani2ment. veni2ment. ri2ment. détri3ment. nutri3ment. inti2ment. esti2ment. l2ment. flam2ment. gram2ment. .gem2ment. om2ment. .com3ment. ô2ment. slalo2ment. chro2ment. to2ment. ar2ment. .sar3ment. er2ment. antifer3ment. .ser3ment. fir2ment. or2ment. as2ment. au2ment. écu2ment. fu2ment. hu2ment. fichu3ment. llu2ment. plu2ment. bou2ment. bru2ment. su2ment. tu2ment. 1mi 1mî .milli1am 1m2némo 1m2nès 1m2nési 1mo 1mô 1mœ .mono1a2 .mono1e2 .mono1é2 .mono1i2 .mono1ï2dé .mono1o2 .mono1u2 .mono1s2 mon2t3réal m1s2 1mu 1mû 1my moye2n1â2g 1na 1nâ 1ne 1né 1nè 1nê 4ne. 4nes. 2nent. réma3nent. imma3nent. perma3nent. .émi3nent. préémi3nent. proémi3nent. surémi3nent. immi3nent. conti3nent. perti3nent. absti3nent. 1ni 1nî 1no 1nô 1nœ .no2n1obs 1nu 1nû n3s2at. n3s2ats. n1x 1ny .o4 ’o4 ’ô4 .ô4 o2b3long 1octet o1d2l o1è2dre o1ioni ombud2s3 omni1s2 o1s2tas o1s2tat o1s2téro o1s2tim o1s2tom o1s2trad o1s2tratu o1s2triction .oua1ou ’oua1ou .ovi1s2c ’ovi1s2c oxy1a2 1pa 1pâ paléo1é2 .pa2n1a2f .pa2n1a2mé .pa2n1a2ra .pa2n1is .pa2n1o2ph .pa2n1opt .pa2r1a2che .pa2r1a2chè .para1s2 .pa2r3hé 1pe 1pé 1pè 1pê 4pe. 4pes. 2pent. re3pent. .ar3pent. ’ar3pent. ser3pent. .pen2ta per3h pé2nul .pe4r .per1a2 .per1e2 .per1é2 .per1i2 .per1o2 .per1u2 pé1r2é2q .péri1os .péri1s2 .péri2s3s .péri2s3ta .péri1u2 1p2h .ph4 4ph. .phalan3s2t 4phe. 4phes. 2phent. ph2l 4phle. 4phles. 2phn photo1s2 ph2r 4phre. 4phres. 2phs 2pht 3ph2talé 3ph2tis 1pi 1pî 1p2l 4ple. 4ples. 2plent. .pluri1a 1p2né 1p2neu 1po 1pô po1astre poly1a2 poly1e2 poly1é2 poly1è2 poly1i2 poly1o2 poly1s2 poly1u2 .pon2tet .pos2t3h .pos2t1in .pos2t1o2 .pos2t3r .post1s2 1p2r 4pre. 4pres. 2prent. .pré1a2 .pré2a3la .pré2au .pré1é2 .pré1e2 .pré1i2 .pré1o2 .pré1u2 .pré1s2 .pro1é2 .pro1s2cé pro2s3tat .prou3d2h 1p2sych .psycho1a2n 1p2tèr 1p2tér 1pu .pud1d2l 1pû 1py 1q 4que. 4ques. 2quent. é3quent. élo3quent. grandilo3quent. 1ra 1râ radio1a2 1re 1ré 1rè 1rê .ré1a2 .ré2a3le .ré2a3lis .ré2a3lit .ré2aux .ré1é2 .ré1e2 .ré2el .ré2er .ré2èr .ré1i2 .ré2i3fi .ré1o2 .re1s2 .re2s3cap .re2s3cisi .re2s3ciso .re2s3cou .re2s3cri .re2s3pect .re2s3pir .re2s3plend .re2s3pons .re2s3quil .re2s3s .re2s3t .re3s4tab .re3s4tag .re3s4tand .re3s4tat .re3s4tén .re3s4tér .re3s4tim .re3s4tip .re3s4toc .re3s4top .re3s4tr .re4s5trein .re4s5trict .re4s5trin .re3s4tu .re3s4ty .réu2 .ré2uss .rétro1a2 4re. 4res. 2rent. .pa3rent. appa3rent. transpa3rent. é3rent. tor3rent. cur3rent. 1r2h 4rhe. 4rhes. 2r3heur 2r3hydr 1ri 1rî 1ro 1rô 1ru 1rû 1ry 1sa 1sâ .sch4 1s2caph 1s2clér 1s2cop 1s2ch e2s3ch i2s3ché i2s3chia i2s3chio 4sch. 4sche. 4sches. 2schs 1se 1sé 1sè 1sê sesqui1a2 4se. 4ses. 2sent. ab3sent. pré3sent. .res3sent. .seu2le .sh4 1s2h 4sh. 4she. 4shes. 2shent. 2shm 2s3hom 2shr 2shs 1si 1sî 1s2lav 1s2lov 1so 1sô 1sœ 1s2patia 1s2perm 1s2por 1s2phèr 1s2phér 1s2piel 1s2piros 1s2tandard 1s2tein stéréo1s2 1s2tigm 1s2tock 1s2tomos 1s2troph 1s2tructu 1s2tyle 1su 1sû .su2b1a2 .su3b2alt .su2b1é2 .su3b2é3r .su2b1in .su2b3limin .su2b3lin .su2b3lu sub1s2 .su2b1ur supero2 supe4r1 supers2 .su2r1a2 su3r2ah .su3r2a3t .su2r1e2 .su3r2eau .su3r2ell .su3r2et .su2r1é2 .su2r3h .su2r1i2m .su2r1inf .su2r1int .su2r1of .su2r1ox 1sy 1ta 1tâ 1tà tachy1a2 tchin3t2 1te 1té 1tè 1tê télé1e2 télé1i2 télé1o2b télé1o2p télé1s2 4te. 4tes. 2tent. .la3tent. .pa3tent. compé3tent. éni3tent. mécon3tent. omnipo3tent. ventripo3tent. équipo3tent. impo3tent. mit3tent. .th4 1t2h 4th. 4the. 4thes. thermo1s2 2t3heur 2thl 2thm 2thn th2r 4thre. 4thres. 2ths 1ti 1tî 1to 1tô 1t2r tran2s1a2 tran3s2act tran3s2ats tran2s3h tran2s1o2 tran2s3p tran2s1u2 4tre. 4tres. 2trent. .tri1a2c .tri1a2n .tri1a2t .tri1o2n t1t2l 1tu 1tû tung2s3 1ty .u4 ’u4 .û4 ’û4 uni1o2v uni1a2x u2s3tr 1va 1vâ 1ve 1vé 1vè 1vê vélo1s2ki 4ve. 4ves. 2vent. conni3vent. .sou3vent. 1vi 1vî 1vo 1vô vol2t1amp 1v2r 4vre. 4vres. 2vrent. 1vu 1vû 1vy 1wa 1we 4we. 4wes. 2went. 1wi 1wo 1wu 1w2r 2xent. .y4 ’y4 y1asth y1s2tom y1algi 1za 1ze 1zé 1zè 4ze. 4zes. 2zent. privatdo3zent. 1zi 1zo 1zu 1zy",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=1141,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-fr.pat b/Master/texmf-dist/tex/context/patterns/lang-fr.pat
index 2523c85cd88..7b66b5468ec 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-fr.pat
+++ b/Master/texmf-dist/tex/context/patterns/lang-fr.pat
@@ -2,30 +2,44 @@
% for comment and copyright, see e:/tmp/patterns/lang-fr.rme
-% used: 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 à â ç è é ê î ï ô û œ
+% used: 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 à â ç è é ê î ï ô û œ ’
\patterns{
+2'2
.a4
+'a4
.â4
+'â4
ab2h
.ab3réa
+'ab3réa
ad2h
a1è2dre
.ae3s4ch
+'ae3s4ch
1alcool
a2l1algi
.amino1a2c
+'amino1a2c
.ana3s4tr
+'ana3s4tr
1a2nesthési
.anti1a2
+'anti1a2
.anti1e2
+'anti1e2
.anti1é2
.anti2enne
+'anti2enne
+'anti1é2
.anti1s2
+'anti1s2
.apo2s3ta
+'apo2s3ta
apo2s3tr
archi1é2pis
.as2ta
+'as2ta
a2s3tro
1ba
1bâ
@@ -153,6 +167,7 @@ co2nurb
1cû
1cy
.cul4
+1d'
1da
1dâ
.dacryo1a2
@@ -236,22 +251,29 @@ d1s2
.dy2s1o2
.dy2s1u2
.e4
+'e4
.ê4
+'ê4
.é4
+'é4
.è4
+'è4
éd2hi
1é2drie
1é2drique
1é2lectr
1é2lément
.en1a2
+'en1a2
1é2nerg
e2n1i2vr
.en1o2
+'en1o2
épi2s3cop
épi3s4cope
e2s3cop
.eu2r1a2
+'eu2r1a2
eu1s2tat
extra1
extra2c
@@ -300,6 +322,7 @@ tan3gent.
rin3gent.
contin3gent.
.ar3gent.
+'ar3gent.
ser3gent.
ter3gent.
résur3gent.
@@ -315,10 +338,13 @@ résur3gent.
4gles.
2glent.
1g2n
+'a2g3nat
.a2g3nat
a2g3nos
co2g3niti
+'i2g3né
.i2g3né
+'i2g3ni
.i2g3ni
.ma2g3nicide
.ma2g3nificat
@@ -347,6 +373,7 @@ g1s2
4gues.
2guent.
.on3guent.
+'on3guent.
1gy
1ha
1hâ
@@ -381,7 +408,9 @@ hypo1o2
hypo1s2
hypo1u2
.i4
+'i4
.î4
+'î4
i1algi
i1arthr
i1è2dre
@@ -426,35 +455,65 @@ uvil4l
xil3l
1informat
.in1a2
+'in1a2
.in2a3nit
+'in2a3nit
.in2augur
+'in2augur
.in1e2
+'in1e2
.in1é2
+'in1é2
.in2effab
+'in2effab
.in2é3lucta
+'in2é3lucta
.in2é3narra
+'in2é3narra
.in2ept
+'in2ept
.in2er
+'in2er
.in2exora
+'in2exora
.in1i2
+'in1i2
.in2i3miti
+'in2i3miti
.in2i3q
+'in2i3q
.in2i3t
+'in2i3t
.in1o2
+'in1o2
.in2o3cul
+'in2o3cul
.in2ond
+'in2ond
.in1s2tab
+'in1s2tab
+'inte4r3
.intera2
+'intera2
.intere2
+'intere2
.interé2
+'interé2
.interi2
+'interi2
.intero2
+'intero2
.inte4r3
.interu2
+'interu2
.inters2
+'inters2
.in1u2
+'in1u2
.in2uit
+'in2uit
.in2u3l
+'in2u3l
io1a2ct
i1oxy
i1s2tat
@@ -661,6 +720,8 @@ n3s2ats.
n1x
1ny
.o4
+'o4
+'ô4
.ô4
o2b3long
1octet
@@ -678,7 +739,9 @@ o1s2trad
o1s2tratu
o1s2triction
.oua1ou
+'oua1ou
.ovi1s2c
+'ovi1s2c
oxy1a2
1pa
1pâ
@@ -702,6 +765,7 @@ paléo1é2
2pent.
re3pent.
.ar3pent.
+'ar3pent.
ser3pent.
.pen2ta
per3h
@@ -1025,7 +1089,9 @@ t1t2l
tung2s3
1ty
.u4
+'u4
.û4
+'û4
uni1o2v
uni1a2x
u2s3tr
@@ -1064,6 +1130,7 @@ vol2t1amp
1w2r
2xent.
.y4
+'y4
y1asth
y1s2tom
y1algi
diff --git a/Master/texmf-dist/tex/context/patterns/lang-fr.rme b/Master/texmf-dist/tex/context/patterns/lang-fr.rme
index 04967549f55..050c0e49982 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-fr.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-fr.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+French hyphenation patterns (V2.12, 2002/12/11)
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -103,4 +107,4 @@
% tested in lack of an executable.)
%
% -----------------------------------------------------------------
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-gb.lua b/Master/texmf-dist/tex/context/patterns/lang-gb.lua
new file mode 100644
index 00000000000..cd35d7d9f71
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-gb.lua
@@ -0,0 +1,83 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["characters"]="aceghimnoprstuvwy",
+ ["data"]="uni-ver-sity uni-ver-sit-ies how-ever ma-nu-script ma-nu-scripts re-ci-pro-city through-out some-thing",
+ ["n"]=8,
+ },
+ ["metadata"]={
+ ["mnemonic"]="gb",
+ ["source"]="hyph-en-gb",
+ ["texcomment"]="% Hyphenation Patterns for British English\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file has been renamed from ukhyphen.tex to hyph-en-gb.tex in June 2008\
+% for consistency with other files with hyphenation patterns in hyph-utf8 package.\
+% No other changes made. See http://www.tug.org/tex-hyphen for more details.\
+% \
+% File: ukhyphen.tex\
+% TeX hyphenation patterns for UK English\
+% \
+% Unlimited copying and redistribution of this file\
+% is permitted so long as the file is not modified\
+% in any way.\
+%\
+% Modifications may be made for private purposes (though\
+% this is discouraged, as it could result in documents\
+% hyphenating differently on different systems) but if\
+% such modifications are re-distributed, the modified\
+% file must not be capable of being confused with the\
+% original. In particular, this means\
+%\
+%(a) the filename (the portion before the extension, if any)\
+% must not match any of :\
+%\
+% UKHYPH UK-HYPH\
+% UKHYPHEN UK-HYPHEN\
+% UKHYPHENS UK-HYPHENS\
+% UKHYPHENATION UK-HYPHENATION\
+% UKHYPHENISATION UK-HYPHENISATION\
+% UKHYPHENIZATION UK-HYPHENIZATION\
+%\
+% regardless of case, and\
+%\
+%(b) the file must contain conditions identical to these,\
+% except that the modifier/distributor may, if he or she\
+% wishes, augment the list of proscribed filenames.\
+% \
+% $Log: ukhyph.tex $\
+% Revision 2.0 1996/09/10 15:04:04 ucgadkw\
+% o added list of hyphenation exceptions at the end of this file.\
+%\
+%\
+% Version 1.0a. Released 18th October 2005/PT.\
+%\
+% Created by Dominik Wujastyk and Graham Toal using Frank Liang's PATGEN 1.0.\
+% Like the US patterns, these UK patterns correctly hyphenate about 90% of\
+% the words in the input list, and produce no hyphens not in the list\
+% (see TeXbook pp. 451--2).\
+%\
+% These patterns are based on a file of 114925 British-hyphenated words\
+% generously made available to Dominik Wujastyk by Oxford University Press.\
+% This list of words is copyright to the OUP and may not be redistributed.\
+% The hyphenation break points in the words in the abovementioned file is\
+% also copyright to the OUP.\
+%\
+% We are very grateful to Oxford University Press for allowing us to use\
+% their list of hyphenated words to produce the following TeX hyphenation\
+% patterns. This file of hyphenation patterns may be freely distributed.\
+%\
+% These patterns require a value of about 14000 for TeX's pattern memory size.\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyz",
+ ["data"]=".ab4i .ab3ol .ace4 .acet3 .ach4 .ac5tiva .ad4din .ad3e .ad3o .ae5d .aer3i .af3f .af3t .ag4a .ag5n .air3 .al5im .al1k .al3le .am5ar .ama5te .am2i .am3pe .am3ph .an1 .ana3b .ana3s .and2 .an5da .an4el .an4en .an4gl .an4on. .an3s .ant3a .an3ti3 .ant4ic .an4t5o .any5 .aph5or .ap4i .ar5ab .ar5ap .ar4ci .ar5d .ar4e .ari4 .ar4ise .ar4isi .ar5sen .art5icl .as1 .as4q .as5sib .at5ar .ateli4 .at5omise .at5omiz .at3r .at3t .au3b .au3g4u .aur4e5 .aus5 .authen5 .av4 .av5era .bap5tism .barri5c .bas4i .ba5sic .be3di .be3lo .be5r4a .be5sm .bi4er .blaz5o .bo3lo .bos5om .boun4d .bov4 .bra5ch .bre2 .burn5i .ca3de .ca4gin .cam5i .cam3o .can1 .can5ta .ca5pitu .car4i .cas5ual .ca4ti .cen5so .cen5tena .cent5ri .cer4i .ch4 .cit4a .clem5e .clima5to .co5it .co3pa .cop5ro .co3ru .co3si .co5ter .cotyle5 .cri5tici .custom5 .dav5 .dea5co .de5lec .del5eg .de3li .deli5r .de1m .de5nit .de3no .der2 .de3ra .de5res .de3ri .de5scrib .de5serv .de5signe .de5sir .de5sis .de5spoi .determ5i .de3ve .de4w .di4al. .dia3s .di4at .din4a .dio5c .do2 .do4e .domest5 .du4al. .du4c .dys3 .east5 .echin5 .eco3 .ec3t .ed5em .ed4it. .ed4iti .eg4 .ei3d .ei5r .el3ev3 .el2i .elu5s .em3b .em5in .emp4 .em5py .en1 .en5c .en4ded .en3s .ent2 .en5ta .eos5 .epi1 .epi3d .er2a .er5em5 .er4i4 .er4o2 .eros4 .erot3 .er4ri .es1 .escal5 .es3p .es3t .etern5 .eth3e .eu1 .eur4 .eval3 .evol5ut .ew4 .ex1 .ex3a .eye3 .fal4le .far4i .fec5unda .fen4d .feoff5 .fi2 .fi5lia .fil5tr .fin5ess .fin3g .fi5n4it .fis4c5 .fo3c .fran5ch .fu5ga .ga4m .gam5et .gen4et .ge5neti .gen5ia .ge3ro .glor5io .gnost4 .go3no .gos3 .hab2 .ha5bili .hama5 .han4de .hast5i .he4i .hem5a .hi2 .hi3b .ho2l .ho5rol .hov3 .hy3lo .ico3s .idi2 .ig3 .ig1n .il4i .im5b .in1 .in3d .in3e2 .in2i .in3o .in3t .invest5i .ir3r .is4c .is4li .is4o .iso5m .ka5ro .ki4e .kin3e .lab4o .la4me .lam5enta .lan5i .lash4e .le4m .len5ti .le2p .lep5r .les5son .le5van .librar5 .lig3a .li3o .li4ons .li4p .loc3a .lo4gia .lo2p .loph3 .lous5i .lov5er .lub3 .lyo3 .mac5u .mal5ad5 .ma5lin .mar5ti .math5 .me5lodio .ment4 .men5ta .me5rid .me5rin .met4er .mi4e .mi3gr .min5ue .mirk4 .mis1 .mi5to .mo3bi .mo5lec .mon3a .mor5ti .mu3ni .mu3si .musi5co .myth3 .na5k .nari4 .nast4 .nas5ti .nec3t .ni4c .ni5tro .no4c .nom3o .nos3t .no5tic .nucle5 .obed5 .ob3el .ob3l .od4 .oed5 .oe5so .of5t .oi4 .ol4d .ome2 .om5el .on4ce .on4e .op2i .opt5a .or1 .or4at4 .ora5tori .or5che .or3d .ore4 .or3eo .or4i .orner4 .or2o .os1 .osi4 .oth5 .out1 .ov4 .pal5i .para5dis .par5af .para5t .pa5ta .pa4tio .pec3t4 .pecu3 .ped3e .pend4 .pen5de .pep3t .peri5n .perse5c .pe5titi .ph2 .phe5nom .phon4i .pi2e .pi3la .plast4 .plic4 .plica4 .plos4 .po3la .po5lite .po2p .pop5l .po5sitio .pos5si .pro5bat .pur4r .put4te .ra5cem .ran5gi .re3ca .ref5ere .re5gar .re1i .re5lin .re1m .re5o .res5ci .re5sen .re5spo .re5stat .re5store .re5str .re3ta .re5u .re3w .rib5a .rin4 .rit2 .rol4la .ros3a .sa2 .sac5r .sal4i .sa5lin .salt5er .sanc5 .sap5a .sa3vo .sci3e .sea3s .sect4 .sec5to .se3gr .sen3t .se1q .ser4ie .ses1 .sev5era .sh2 .si5gno .sis3 .st4 .stat4o .stra5to .string5i .su5da .sulph5a .sul3t .tact4i .tac5tic .ta4m .tamar5 .tar5o .tect4 .tel5a .tell5e .te4m .te5ra5t .ter4p .th4 .tho4 .thol4 .ti2 .til4 .ti5ni .tit4is .tor1 .tran4c .tri5bal .tri3d .trin4a .tri5sti .tro4ph .troph5o .tro4v .tular5 .turb4 .turi4 .tu5te .tu3to .ul4l .ulti5mat .un5ce .un5ch .un3d2 .under5 .un3e .un3g .uni3c .uni3o .un3k4 .un5s .un3t4 .un5u .up1 .up3l .ura4 .ur5eth .ur4o .va5led .ve2 .vec5 .ve5lo .vent5il .ver4ie .ver3n .vic5to .vi2s .vis3i .vi5so .vo1c .vo5lut .wine5s .xy3l .za5r a4a 1ab 2ab. 2aba ab5are abay4 2abb ab5ber 2abe4 ab3erd ab3err a3bet ab1ic a3bie 2abin 4abio abi5on ab3ita ab4itu ab3la abli4 4abolic ab3om ab3ota 3about ab1r 2abs. ab1ul abu4lo ab3use ab3usi 2aby ac2a ac5abl ac3al 5acanth ac5ard a5cat ach5al a5chini ach5ism achro4 ach5ur 2aci a4cic aci4ers acif4 4acit ack5a ac3li 4aco. aco3d ac5onr 4acos 4acou ac1r ac3ry act5ate act5ile ac2to act5ory ac2t5r ac5uat a5dai ada3v 4adee ad5eni ad4ha ad3ica a5dif 4adil adi4op adi4p adis4i a3diti 3adju 5admit a2do 4adoe 4adoi ad3ol a3dos ad1ow ad1r adram4 4a2du ad3ula ad3um 4ady ae5a ae4cit aeco3 4aed aed5is ae5g ae3on ae5p aerody5 ae4s ae5si aes3t aet4a aeth4 aet4or. aev3a 4af. 4afe af5ta a4fu ag4ari 4ageri a5ghe a5gia agi4as 4agino 4agl agli4 4ag1n ag3oni agor4a ag5ot a2gr ag3ri agru5 2ah a1h2a ahar2 aha5ra a1he ah4n a5hoo 2ai2 4ai. ai3a a1ic aid4a aid5er aig2 ai5gu ail3er ail3o aim5er ain5ders ai5nea a3ing. ain3i ain5o aint5er air5a air5p air3s ais1i a5ism 2a1j a4ju 2ak akel4 ak5u al5abl alact4 a1lae al5ais ala3ma al5ance al3at a5lav alc3at al3ch ald5ri 2ale a3lec aleg4 ale5ma al5ende a1leo a2let al3ibr ali4ci al5ics al1id al3if 5alig al1in a5lini alin5o al5ipe al5ipot 4alis. 4aliu 4alk alk5ie al4lab al4lag alli5an allig4 al4lish a5loe al3ogr a3lom a3loo al1or al4orim alos4 a4lou al3ous a5low al5pen al3ph al5tati al3tie alu3b al5ued al3ues a5lumnia al1va al5ver alv5u 2a1ly4 a5lyn 2a2m a5mad ama4g aman5d a5marine a3mas. am1at a5m4atic am5atu am4bin 3ambu am5elo a3men amen4d am3era am5erl am1i ami2c am5ica amic5r 3amid a3mili am5ily amini4f am5iniz aminos4 a5mis. a4mium. a3mon amor5a amort3 am5ose am2p am5peri amphi5g amp3li ampo5l am3ul amyl5 a2n an2a a5nadi an3ae an3age ana5k an3ali an3arc a5nast an4con an3d4at and5au and5eer an5del an5dif and5ist an5dit an4doni an4ea an5eer an3ell anel5li an3eu an3gan angov4 an4gur 4anh an3ic ani3f an5ifo 4anig an5ion anis5te 4anity 4aniu an5no 4anny an1o an2oe an3oma anor3 an2os an5ot an2s an3sc an4sco ans3il an4sur an2t2a ant5abl an3tal an5tam an2te 1anth an4thi 3anthr 4antic an4tie an4ting ant4iv an4tone ant4r an4tus an5tym an3ul an3um. an5ums a3nur a5nut an2y an5ya a5nyi 2ao aol3i 5aow 2ap 4ap. 4apa a1pac ap3al ap5aro ape5li a5peu aph5em aph3i aph5ol aphyl3 ap1i ap5icu ap3in ap4ine a5pir a3plan ap5li apo5str apo3th a2pr ap5ron 4aps apt5at apu5lar a5pun a4q a5qui a2r 4arabi ara5bo aract4i ara2g ar3age ar4aged ar5agi ar3ago a3raj ar3all ara3m aran4g aran5te ar5apa ar1at a3rau ara3v ar3ba arb5et ar4bid ar4bl arb3li ar4bul ar5chet arch5o ar5dina ar4done ar3en aren5d ar5ett ar3ev5 ar5gh ar3gu ar3h ar1i ar5iff ar4ill a5ri5net ar5ini a5rishi arm3er ar5mit ar3nal ar3nis ar3od ar5oid aro4mas aro4n a5roti a5rouc ar3ox arp5ers ar4pu 2arr ar2rh ar2s ars5al ar3so art5at ar2th arth4e arth3r ar5tiz 2aru ar3um ar5un4 a3ryo a5ryt ar5z as1a as4af asan2 2asc as5con as5cot as2cr as2e as3ect 4ased asep4 ash5ay ash5il as5ily as3in a5sio a3sit as5iv ask5er aski4 as4la as4lo 2aso as5och a4soned as5or as3ph ass2 assa5gi ass5ibl as4sil assit5 2asta as4tat as4tia as3tis as4tit 4asto2 as3tra as4tri as1u as4un as5ur 2a2ta 4atabi a5talis atam4 ata3p atar3a ata3s ata3t4 at3eau at3ech at5eer a5tel. ate5le at5enat at3ent 4ater at3era at5ernis at5erniz 4atess at5et 4a2th ath3a a3then ath5erin ath5ero ath5ete ath3i ath3od a5thon ath5r 4a3tia ati2c at5icis ati5cit at5iciz a2tif a4t1i4l a4tim a2t3in 4atina at5ing 4at4is. at1it atit3u atitud5i 4atiu at4ivi a5tiviz a2to 5at5od 4atog 2atol 4aton a3too a4tops a5torian a4tory atos4 a5toz 2a2tr at3ra a4tre 5at5ress at1ri atric5u at3ron at5rou at4tag 2a2tu at1ul atu4m at3ura at3urg 4a2ty 2au2 4au. aub5i 4auc au5cer auc3o aud5er audic4 aul3i aul4t aul5ted ault5er ault5i au3ma aun2 aun5chie aun3d aun4dre au5reo aur4o au5ror 4aus. aus5er aus5p aus4ted aut3ar aut3er au3th 2av av4ab ava4g av3age ava5la av5alr av5ant av5ar avas3 av3end av3ern av3ig aviol4 av1is aw5er. aw5ers aw1i aw5nie aw5y a4x ax2id 4ay ay5la ay3m ayn4 ays2 ay5si ay5sta ayth4 2az2 az3ar aze4 az5ee azyg4 azz4l 2ba. ba5bir 3back baen4 bag4a 5bah ba4i bal3a balm5i ba5lon bal5u bam4a ban4a ba5nan b4ane 5bang b4aniti b4ans ba4p1 5barb bar4d bardi4 bar4n ba5rom bar3on 5bars 1bas bas4te ba4th4 3batic ba5tio bat5on battle5 2b1b2 b4bata b3bli b4bone b1c2 bcord4 2b1d bdeac5 bde4b bdi4v b2e 4be. 3bea 4beas be3ca 3becu 2bed be3da bed5el bed2i be4do be5dra be4du 5bee 3bef be3go be5gr be3gu 1bel be3la 2bele be3lit bel4t be3m ben4d bend5a bend5er be1ne be5nig be5nu 4beo be3q 2bere berga5m berl4 5berr ber5s b5ertin be1s2 2bes. be3sl be3tr be3w 2b1f bfa4 4b1h b4ha 2bi. 1bia bi4b1 bicen5 3b2id bid5i b4ie bi4ers bif4 bi4fid. bi5ga bigu3 b1il b2ile 5biles 3b2ill 4bim bimet5 5bina 5bin4d bind3e bin5et bin5i4 1bi2o bio3l bio5m bi3ou bip4 bi5q bir4 bi3re4 bi5rus b2is 5bism bis4o bisul5 3bitua 4bity bi5ve b1j 4b5k4 2bl2 5blac blag4 b3lan 5blast bla5tu blem5at 3bler 5blesp 4blik blim3a bli3o bli2q b3lis 4bly 2b1m bment4 bmi4 4b1n bo2 4bo. 3boa bo5am 5bob bod5i bo5h 2boid 4boke bol4e 4boled bol3i bol4t 3bon bon4c bon4e bon4ie boni4f bon4sp 1boo b3orat bor3d bor5ee bor5et 3bori bor5ic bor5io bor4n bot3an 5boti boun5ti 3bour bous4 bow2 bow3s 4boxy 5boy br4 3brach 4bral bram4 b2ran bran4d 4bre. b4reas 4b2res brev5et b2rid 5brief bring5 bri4os b5rist b4roa bro4ma bros4 brum4 4bry. 4b1s2 b3sc bscon4 bsen4 bserv5an b5si bsin4 bso2 bsol3e bso3lu b4stac bstupe5 2b1t b5tlet 4bu. 5bub buf5fer b4uli b4ulos bun2 bun4a b5u5nat bunt4 bur3e bur4ri busi4e buss2 bus5si 3bust bu5tar b3ute b5utin 3butio but4iv b5ut5o b1v 4b3w 2by 4by. 3byi bys4 5byt 2ca. cab5in c4ace caco3 cad4r 5caf ca3go 5cai 5cak c1al c4ala ca5laman cal5ar 3calc ca5lef call5in cal4m ca3ly ca3ma cam4i ca5nar c2an4e c4ano ca3noe can5tar can5ted can4tic can4tr 5cao 1cap ca5pil capt4 cap3ti cap3u 1car ca3ra5c car5ame ca3ree ca3r4i3c car3if car5m car3ni car3ol car5on car5oo ca3rou car4v case5 cashi4 3cas3s cas5tig 3casu3 c1at c4at. c2atc c4atom ca3t2r c4ats cat4u 3cau caulk4i cav3il 3cay c1c4 ccent5r cces4sa c3ch cci3d4 ccip4 ccle3 4ce. 4ceab cean3 3ceas ce4ci 2ced 5ceda ce3dar 3cede 3cedi 4cef ce5g 3ceiv cel3ai cel5ib5 5cell cel5lin celo4 ce5lom 4cely 2cem ce4met 3cemi ce4mo 1cen2 5cenc cen5ci cen5ded cend5en cend5er cen3i 2cenn 3cent cent4a cen5ted cen5ter. cen5ters cen5tes 1cep cept3a cep5tic 3cera cer4bi 3cerd ce3rem 5cern 5cess cest5o ces5tr ce2t cew4 2ch 4ch. 4chab 3chae 3chai cham5per chan5gi cha3pa chec4 4ched 3chee 3chem che3ol ch1er ch4eri 5cherin ch4erl 4ches 3chete ch5eu che5va 3chew ch5ex 5chi. 3chia 3chico ch3ily ch4in. ch3inn 3chio 5chip chizz4 ch5k 5chlor 4chm 1cho cho3a 5choc 4choi ch5oid 3chor 4chored chor5ol 4choso 3chot 4choti ch5ous chow5 3chr chur4 3chut 5chyd 3chyl 3chym 1c2i2 4ci. 4ciac cia4m ci3ca 4cids 4cie. ci3er ci3est ci5et ci3f cifi4 4cig ci3ga cigar5 3cil cil5lin 2cim cim3a ci3me 5cimen 4cinab 4cind cine5a cine5mat ci5ness 4cint ci3ol ci5om ci4po cisi4 cit3r ck1 ckar5 cka5t c4ke ck5if ck4sc cl2 cla5rif 3clas c2le2 2cle. c5lec clemat4 clev3 cli1m c3ling cli2q clo4q c4lotr clue4 clyp5 5clys cn2 c3ni 1c2o2 4co. 3coa co5ba 3coc co3ci co5cu co3dic co3dif 4cody 3coe co5et co3gr 4c3oid co3inc 4col. col3a co3log 5colou co5ly co5mas co4me co3mo4 comp4 con1 con4ati con4ch cond5er con4ey con4ie con3s con3t conta5d 3coo coop4 co3or cop4e co3ph co5pl co3po cop4t 2cora cor5ded cord5er 4cored co3rel 3corn 4coro co5rol 5cort 3cos. cost3a cost5er co5ta 3co3tr 5coty cous5t cov1 co3va cow5a coz4 co5zi c1q cr2 5craf craft5i c4ran 5crani cra5niu cras3t cra4te c2re 4crean cre3at cre4p3 5creti cre4to cret5or cri3l cron4 crost4 4crou 5c4rus cry2 crym3 cryo3 4c5s4 csim5 2ct c2ta c3tac ctac5u c5ta5g ct1an ct5ant c5taria c3tato c1te c4tea c2t5ee c4tent cter4ia ct5es ct5et ct2ic c5ticia c4tics ctifi4e c3tim ct4in. ct4ina ct5ing c3tini c5tin5o c5tio c3t2is c3tit c4titu c4tity ct5ive ct4ivit ct5olo c1tom c3ton c5toris c5toriz c1tr c2tre ctro5t c1tu c2tum c1ty cub3at c4uf cu5ity cul5ab c2uli cull5er cull5in 1c2ult cu4mi 5cuna cun4e 5cuni 5cuol cu5pa cu3pi c3upl 1cur cur4er cur5ial 4cur4o 1cus cus5a c3utiv c3utr 5cuu cu5v 2cy. cy4bi 1cyc cyl3 cy4m cy5no cys4 cys5to cy4t cz2 4da. d4abr 1d2ac dach4 d5ache 3dact d1ag d4a4gi d4ale d4alg dal5ler dam5a 3dame d3ami da5mu 3dang d1an4t d3ap d3ard 5darm 3d4as2 dast5a d1at dativ4 dat4u daugh3 daun5te 3dav d3b d3c4 d1d4 d4dere d3di d3dler d3dli d3dyi 2de. deac3t de5aw de4bi deb5it 3dec de5cant de4cil de1cr 4dect ded3i defor5e de4fy. de3g de4gu de3io 5de3is de3lat deli4e del5ler del5li de5lo 1d4em 4demie 4dem4is demo4n de4mons de3mor de4mos 4demy de1n2a den4d 4dene d3enh deni4e dens5a dens5er den5tit de3od deo3l deon2 deont5 de1p depen4 deposi4 de2pu d3eq derac4 de3rai d4ere 4dered de5reg 3derer 1deri der3k 3derm der4mi der5min 5derne 3dero4 der5os der3s 5deru 4des. de3sa 5desc des4ca de5scal de3sec des4i de3sid des5igna des1p des5pon de3sq d3est. des3ti 1de1t de3tes de5th de2ti dev3il de3vis de3vit de4voi devol5u 3dex 2d5f dfol4 d2g dg4a dgel4 d4gen d3gr 4d1h dhot4 d4hu 4di. 1dia di2ad 3diar diat5om 4d1ib d1ic. dic5am di4ce di3ch d5icl dic5ol 1dict dic5tat dic4te 5dicul d5icur 1did di4ers 3di3ev d4ifo dig3al di3gam dil4 5dill dilo4 di3lu di5mer dimet4 di1mi 2d1in din4e din5gi di5nos 3di1o dio4c di4ola dip5t 3dire di3ri 4d5iro di4s1 d4isc disen3 3disia 3diss d4itas d4iter dithe4 d3ito ditor3 2dity 1diu 1di1v2 di4val di5vine dix4i d1j 2dl4 d1la 5dlef 5dlest 3dlew dlin4 d1lo d5lu 2d1m 4d1n2 1do 4do. d4ob do4c3u dog4a do4j d4ol. dol3en do5line dol5it do4lon d4ols 5dom. doman4 domin5 dom5ino dom5it do5mo don4at 4dony 3doo d2or 4dor. dor4m dort4 d4os do5sim dossi4 dot1a dot4tin 2dous d4own 3dox d1p dr2 d5rail d3ral 3dram dran4 d4ras drast4 3drel dres4 dress5o dri4e d4rif dri4g3 d4rom dropho4 drunk3 4d1s2 d5sl ds3m ds4mi d4sw dt4 dt5ho 1du 2du. du1at 3duc duch5 duci5an du4co du5eli du5ell du5en du5ett du5in dul3c d3ule dul4l dum4be dun4a d5un4c du2p du3pl 5duro d5use dust5er du3u d1v dver2 dvert3 dvoc5at 2d1w dwell3 2d2y dy4ad. dy5ar 5dy4e 5dyk dyl2 dyll3 5dymi 3dyn dys3p d3zo ea2 4eab e1act eac4te ea5cu e5add ead3er ead1i ead3li ea4g eak1 eal3a eal3er ea3log eam4bl eam3er ean5i eap2 eap5er e3app ear3a ear3er ear4li e5ar2r ear4te earth5i eas5er ea4soni e1as1s eassem4 eas4t east5i eat5eni eat3er eat5ie e3atif eatit4 eat4itu e3atri e4atu eau3 eav5i eavi4e eav5ou eaz5i e1b ebar4 eb2b ebe4 e4bel. e4bels e2ben eb5et eb2i e5bil e4bin e4bis e4bl e4bos ebot3o e2br eb1ra eb2t e4buc ebus5i ec2a ec3ade ecad5en ecal5e e5cam e4capo ec3at ec5ath e1ce ecent5o ech3i e4cib eci4f ecip5i e1cl ec3lip econ4sc econstit5 ec3ora ec5oro ec3rat ec5rean e4crem ec1ro ect5ati ec4ter ecti4c ec4tit ec4t5us ec1ul e5culi 2ed e5dans e2dat ede2 e4ded e5deh e4dele edes3t ede3te edeter5 e3dev e5dew ed4g edi4als ed5ical ed5ics ediges4 ed5igr ed3ime ed1it edi2v ediv5id ed3li edor4 e4dox ed1ro edu5cer e2dul ed3ulo e4d5ur ee4ce eed3er ee4do ee2f ee5g ee1i ee2l1i ee2m eem5er eem3i eep1 ee4pa eer4ine eesi4 ee3to e1f efact5o efal4 ef5eree ef5inite e4fite ef4l efor5est 2efu e4fug efut5a egel3 egi5a e4gib e3gla eg3le eg4mi eg5nab e5g4on e2gr e5gur e1h2 e5ho eh5s ehy2 ehyd5r eid4 5eido 4eif eig2 e5ignit e4in. e3inc e2ine e1ing ein5i e4ins. ei4p4 eir3o 4eis eis3i eit5er eith4 e2iv eiv3er e2iz e1j ejudic4 ek3en ek5is ek4l e4lac e5lad el5age elam4 el5anc elast3 e4lates el5ative elch5er eld3er 2ele elea5g 4e4led el5eni el3eno ele3o ele5ph el1er e1les e5less e4leste el3et3o elev3a ele3vi el5ex e4l3ica4 e1lie eli4ers e3lim el3ing eli3on e4li4s elit4t e3liv el4lab ell5iz e3loa e3loc elo5ca eloc3u elo4di e2log elom5ate el5op. el5ops elp5in el3so el5tie e1lu elu4m elus4 elv4 e5lyi 3elyt em3ago em3ana emar4 emarc5a em5atiz emat5ol em5bi e1me4 e4mee e4mel e3mem e4m3era em5ero emet4e em4icis e4mie e2mig emig5ra em3ina em5ing e3mio em3ism e4mita e4miu em4mae 4emnit emo3bi emod4u e2mog e4moi em3olo em5om 4emon e3moni emon5ol e2mor em5oris em3orr e4motic e5moz empa5r empara5 em5pes 4empli. em4pre em3um e5mut en3ac e4nal en3am3o en4ann e2n3ar en3as. ena5ture 3encep en4cile enct4 2end en4d5al en4dedl end5rit 4ene ene5d en3ee e5nelle e5nep e2ner e5nereo ener5v en5esi e3ness en1et en4ett e2n3eu e3new en3gi en3ic en5ier en3ig3r en5in enit5u en3k en1o en3oi eno2m en3oty enov3 en2s ens5al en3sp en4sum en4sus ent3ar en4ters en5tia en4tify en2to en4tri ent5rin ent5up en4tus 4enu en3ua en3uf en3ur en5ut 5enwa eo3b e4och e4oda eof2 eo2l eol5ar. eol5at eologi4 e5olu eo3m eon4a e3ont eop4t e1or1 eor4de eor3e eor5o eo1s2 eo4to e1pa ep4al ep5arc epa4t epend5en ep5ert e4pete epe5titio ep5ex eph1 eph4i e2pig e5pla ep3lic epol3a epol3i epolit5 ep3reh epres5e ep5rim e4p5rob5 ept3or e1p4u e3pur5 e4puta equin4 equi5no er1 era4cie era4do era4g era4l er3aph er3api er3apy 4erati. 4eratim er5atu er3bat er3be erb5os 2erc er3ch er3cl 2erd erd5ar erdi4e 2ere er3eal 4ered er3egr er5el. er5ell er5els e4reme er3en 5erend eren4e ere5ol e3req er3er ere4s er5ese er3esi er5este er5esti eres5tr eret4 er3et. er3ets er3ett ere4v er3ex ergi3v er3gl er3ia. er4ian eri4cid 5er5ick er2id er3ie er3iff er4imet er3in eri4na eri4on er3iou er4isc eri5sta 4eri2t e3riv er5iz 4erj erk4 er3me er4moi 5ernacl er5nalis ern3er ern3is ern3it 4ero. er3oid ero5is ero5st erpent5in erre5la er4rep er5sine er5ted er4ter ert5er. ert5ers er4thi ert5iz 2eru eru4b eru5d erund5 er4vil 5erwau eryth3 2erz 4es. es5am es5an e2sc es5can es5che esci5e escut5 e3sea e3sect e5see e5seg5 ese4l es5enc e3sh4a e1shi e5shu esi4an es5ic. e5sick es5iden esi5diu es5ies es3im es3in e5sion e4sit es4it. es4its e3skin e3s4mi es4od es3ola es3ol3u es3ona eso3p e1sor es3per3 es5pira es5pit es4pl esplen5 es5pot e5s2pr es4s3an essar5 ess5ee es4sil es2so esta4b est3an e5star es5tau e2sti est5ifi est5igati e3stoc es5too est4r estud4 e1su e2s3ul es4ur5 et2a et3al. et5allis et3al5o eta5me eta3p et3ari et5ary et4as et3ate et3ati et5ay et3eer etell5i etend5er et5eni eter2 et3er3a et5eria etex4 e2th1 ethyl3 2etia e3ticu eti4gi e5tim et3in eti4na e3tir et5itiv eti4u et5olo e5tomete e2ton et3ona etor3i etra5g 4e4tral etra5m et4ran et5ress et1ri et4ria etrib5a e4trim et1ro et2t et3ter etud4 et3ude e4tum et4we et5z eudio5 eue4 euk5 4eum e3urg eur5i eus4 eu5ten eu3ter eut3i ev4abi eval5e eva2p3 ev3ast ev3at ev5eli eve4n ev5erat ev5eren ever4er e4veri e4ves e1via e4viab e2vic evictu4 evid3 ev5ig ev4ile ev5ish evis5in evis5o e4viu evoc3 evol5e evol5ute evu4 e1wa e4wag e5way ew1er e3wh ew5ie ew1in ew5ish e3wit e1wr ex5ic ex4on. 1exp 4ey. ey4as eyl4 ey3s2 ez5er. ez5ers ez5ie 1f2a 2fa. fab4i fa3cet fact2 fa2c3u 2f3ag fall5in 5falo fa5lon fals5ifie 4fan3a fan5tasiz fant3i 5far far3i 5faw 4f5b 2f5d 2fe. 3feas fea3tu feb5r 3fec 2fed1 5fei fe1li fem3i femin5 fend5er f5eni 4fered fer3ee 3fero fe5roc fer5om 3ferr fer3v 2fes. fess3o fest3a fest5i fe4t fet4al fet4in fet4o 3feu fe5veri 2ff f1fe ffec4te f5fet f1fi f5fia f3fic f5fie ffil3 f2f3is ff4le ff3lin ffoc3 ffoni4 ffor3e f3fr ffranch5 4f5h fi5ance fib5u 4fic. 4fical 3fici 4fics fi5del fid3en fiel4 fier4c fight5 1fi2l 2fin fin2a fi3nal find3 fin2e f1ing 5finin fin4ni fir2m1 f3ita f5itee fl2 3fla fle2s f3lica flin4 3flo flo5ric 3flu flum4i 1fo 4fo. 3foc fo2e foeti4 fo1l4i fo4lie foment4 fo2n fon4de 3foo fo5ram for5ay for5b for4di fore3t 5form for4m3a fortu5na fo3v 1fr2 frag5a frant4 frar4 fratch4 fre4s frost5i fruc4 2f3s fs4p 2ft f1ted f4ter. ft5es fti4et ft4ine 3fu 4fu. fu4c fuel5li fug4a fu4min fun2g 4fured fur3n fu3sil fus5o fu5til 4ga. ga4cie gadi4 ga4dos 3gag 3gai 3gale ga5len gali4a gal5ler 3galo gam4bl gan5at 4ganed gang5er g5ant. gan4tr g5ants g5arc g4are gar3ee gariz4a ga5rot gar5p 5garr 1ga4s gas5i gas3o gasol5 gass5in gast3r g1at g4at. gat5iv g4ato. g4atos g4att gat5u gaud5 ga5za g1b g5d4 2ge. 5geal 3gean 2ge4d 3gedi 5gedn 4gef 1gel 4gele ge4li gel4in gel5li ge4lu 2gely gem3i 5gemo 3gen gen4du gen5it gen3o gen5ti ge4o geo3lo 4gere 3germ4 2ges. 5gess gest5at 3get get3a 2g1f 2g1g gg4a g2ge g5gedl g3ger g5gerer ggi4a5 g3gli gglu3 g5gly ggrav3 g4gro 2gh g5hai gh5eni g3ho g4hos gh2t 1g2i 4gi. gi4all gi4at 3gib gi5co gi4g gi5gan gin5gi 3gio gi4or gi4ot 5gip gi5pa g4i4s 5gis. gi2t1 5gitu giv5en. 2gl2 g3lar 5glass. glec4 3gler g4leto g4letr g4ley gli5on g5lis4 3glo 4g5lod glom3 4glop 3glu glu5te glu5ti 3glyp 2g1m4 2gn2 g1na g4nab g5nate 5gnath g5nati gna5tur gn5edl gn5ee gn3er g1ni g4nia g2n3in gn4in. g4ni2o g2no 5gnori gno4s 2go. 5goa 3goc 5god 3goe go4et go4ge 4gogram g5oid go3is go2me 5gonn go5nom 3goo goph4 4gor. 5gorg 4gors g4ory 3gos gos4t 2gou gour4i g1ous gov1 g3p 1gr2 grab4 3gram 4grame gra2p g4re gril4 grim3a g4ro gro4g g5ron grop4 3gru gru3en gru5i grum4b 2g1s gs4c gs4t g4sti gth5eni g5to g4u2a gu5ab 5guan 3guard g5uat 2gue 5gueu 5guit4 gui5ta gu2ma gu4mi 3gun g4uras g4ured gur4n gur4u 4gury gust5a 2g1w 2gy gy2b 5gym 3gyn gyn5o g5z2 ha2 4ha. h4ac hadi4e had4ine hae3o haged5 hagi3o hag5u ha5ic hais4 hak4ine hal5ant ha4m ham5an han4cro han2g h1ani4 h5aniz han4t hant3a ha4pe hap3l har1a har5b har4d har5die harge4 ha5rism har3o har4ted har4ti has4te hat5o haught5 havel4 hav5ersi hav5o h1b h1c h1d hdeac5 hdu4 he2 4he. h2ea 1head 3hear hearch4 heast5 heav5en hec3t4 he5del he3do heek4 h4ei he3is he5lat h5elin he3lio he5liu hel4li h3el3o hem1a he3men hemis4 he5mop hem4p hende5 he3or hep1 h1er. her4as her2b herb3a herb3i here3a here3o h5erett h5erh her5ial h5erine h1erl her5om h4eron h1ers h5erwa hes3tr het1 h4et3a het3i het4ted heu2 heum3 heumat5 he4v4 hev5i hex5o h1f h5h 2hi. hi4ar h1ic hi3c4an hi4cin h4icl h5ie. h1ier h4i4ers h1ies h3ifi4 h3ify hig4o hi5ka hi4l hi5ma4 hi5mer himos4 h1in hin4d h2in2e hi5nie h5iniz hi5nop h2ins hio5lo h4ior hi2p hip3l h4ir hir4r hirr5i hit4a hiv5a 4hl h3la h1le h3let h1l2i hli4a 2h1m h4manic h5mica 2h1n2 hnocen5 4ho. ho3an ho4co ho3don ho5du ho5ep hol3ar hold1 hol4is. ho5lys ho4mag hom5in h2o4n hon5em ho5neu hon3ey hong3i ho5nio hon1o 1hood hoo5r h4ope ho2p5r h4op4te hor5et h4orn horn5i ho5rog hort5h hosi4 ho4ton h2ou 3house3 4h1p 2hr hras5eo hre4 hre5ma hr5er hres4 hri4 hrill5in hrim4 h5rit h3rod hrom4i hry4 h3rym3 2h1s hsi4 h4sk ht5ag ht5ee ht3en. ht5ener ht3eni ht3ens ht5eo ht5es ht4foo h1th ht4ine hu4g hu4mat hu5mer hu4min hun4c hunk4 hun4t hur3i hu3sia huz4 h1w h4wart h2y hy2l hyl5en hy2m hyn4 hy3o hyol5i hy1pe hy3ph hyr4 hys3te hy4t 2i1a2 ia4bl iab5olis iab5oliz i2ach iac3o i2ac2r ia5cri ia5dem i5ae iaf4 i2ag4 ia3gn i5a4g5o ia3gr i3ah i5ai ialect4 i3alit ial5li 4ialn i2a3lo ia5ly i5amb ia3me ianch5 i3ant i5ape ia3ph i2ard 4iarit i3at ia5the i5atom iat4u iatur4a i3au iav4 ib3era ib1i ibio4 ibios4 ib5li 4ibo i4bon ibor4 i4bose i5bou ib1ri 4ibu ib3uta ic3ac ic5ado i4cal ic1an 2icar iccu4 4ice i5ceo 4ich ich4i ich5ing ich5ol 4icin i5cio 2ick ic4lo 2i2co ico3c ic5ola icon3o i5cop icotyle5 2i1cr i4cri i4cru i4cry ic4tedl ic4ter ict5ic 2icu icu4lu ic3um i5cun4 i5cut 2i1cy i2d id1a i5day ide4m id3enc id3era iderm5 i3dicu id3if i5dig i5dil i3dim id4ines idios4 idir4 id1is4 id4ist 2i4d1it idi4v id3li id3ol idol3a 4idomi id3ow 4idr id5ri id3ul ie2 4iec 2ieg2 ie3ga ie5i i5ell 4iem 2i1en ien2d i1er i3eres i2eri ieri4n 4iern ier2o i4ert i3esc ies3el i1es2t i3est. 2i1et i4et. iet3ie 4ieu i5euti iev3a iev3er iev3o 2i1f i2fe if4fa iff5ler if3ic. i4ficac if5ics ifi4d ifi4n 4i2fl i3fo ifoc5 if5tee i3fy 2ig i3gad ig3and 3igar i1ge i3ger ight5er. ight5ers 4igi ign5iz igno5m i3gon ig1or ig3ot i5gret i4g5ro igu5it ig1ur 2i1h ihy4 2ii i5in ija4 4iju 2ik2 ik5an ike4b i2l3a ila4g ila5tel i5later il4ax il5dr il4du i3len ilesi4 il3f il3ia. il3iar ili4arl i3lici i5lien ili4er ili4fe il4ific il1in il5ine. 4iliou il5ipp il5iq il4ite ilit5u il4mo i5lon il3ou ilth4 il2tr 4ilu il5ul i5lum il5ure il3v 4ilym ima4c im2ag im3age im1al im5am i5m2as i4mated i4matin imat5u im1i i3m2ie im4ine im5ino im5mes i2mo i5mog i3mon im5oo i3mos. impar5a imparad5 im5pie impot5 im5pr impu4 im1ul im5um in3ab 4inace in4ado in5agl in3air ina4l 4inalit in5am in3an in3ap in4ars i3nas. 4inata inator5 in3au in4aw 2inc inc4tua 2ind in5dar inde5p indes5 inde3t indeterm5 in5dro 4inea 4ined in5ee in5ega 4in5eo ine4s in3esi ine5te 4ineu inev5 infilt5 infol4 4infu 4inga in5gal 4inge ing5ha 4ingi 4ingle 4ingli 4ingo 4ingu ing3um 2ini in5ia. 4inic in4ici in3ion in4itud 4ink ink4ine 4inl 2inn 2ino 4ino. in3oi i5nole 4inos i3nos. in5ose in3osi 4inq ins2 in4sch5 inse2 insect5 insec5u in3si 5insk insolv5 in4tee int5ess in3til int5res intu5m 2inu in5ul in5um in3un in3ur invol5u 2io2 ioact4 i1od iod3i4 iod5o ioe4 io3gr 4i1ol io3ma i4omani io3mo i5ope io3ph i5opo iop4s i1or iora4m 4iore 4iorit 5ioriz 4iorl ior4n io3sc i3ose i3osi i4oso io5sta i3ot iot4a io5th iot5ic io5tr i4oty i4our. i4ours i5ox 2ip ip3al ipap4 ipar3o ipart5ite ip1at i3pend i1ph2e iphen3 i5pheri iphi4 i4phu ip3id i5pil ip3in ip4ine ipir4 ip5is ip1i4t ip4iti ip3lin ip3lo i3po i4pog i4poli i4pom ipon3 i4pow ip2pl ip3pli ip4re ip5tori ip1ul i5put ipy4 2iq i3qua 2ir ir1a ir4abi ira4c ir4ae. ir4ag ir4alin ir4alli i5raso irassi4 iray4 ird3i ire3a ir3ec ir5ee irel4 ire5li ires4 ir5ess ir1i ir2i4d ir4im ir4is. 5iriz irl5ing ir5och ir5ol ir3om ir4q ir2s ir5ta ir5tee irwo4me i4sa is5ad is3age is1al is3am is1an is3ar is5av 4isb i2s3c is5chi isci5c 4i1sec ise5cr is3ell 4is3en is2er is5ere i2s3et 4iseu is3har ish5ee 4ishio ish3op is5hor 2isia is5ic is3ie 4isim is3inc 4isis is4ke is1l islun4 2isma is1on is5oner iso5p is1p i3s2ph 5ispr 2is1s iss5ad is4sal is5san iss4iv iss4o 4ista is4tal ist5enc ist5ent is5terer 4isth is4t3ic 4istl i4s1to 4is4tom is1tr 3istry 4isty i5sul is3ur 2isy it1a it5ab ita4c 4itai it3am it4ana it4as it3at i3tect it3ee it3enc it3ent it3era 2ith itha5l ith5i i5thol ith3r ithy5 2itia iti4co it5icu it1ie it3ig 4itim it4in. it4ins 4itio. 4itione i5tiq 4i5tit it3iv it4li it5lo 4ito. it5ol 2iton it1ou 2itr it5ress i4tric 2itt it4tit itu4als it5uar 4itue it1ul it1ur it3us 2i1u2 i3um iur5e 2iva iv5anc iv1at i4ved iv5el. iv5eling iv5els i4ver. iv3eri i4vers. iver5sal ives4 iv3et i4vie iv3if i5vilit 5ivist. 5ivists iv1it i2vo ivoc3 i5vore 2i1w 2ix ix3o i5ye 1iz 4izah iz3i2 2izo iz5oi 2izz 1ja 2ja. 3jac ja2c5o jac3u jag5u jal4 ja5lo ja5pan jel5la jeo2 jeop3 4jes jeu4 jew3 2ji 3jig jil4 jill5 5jis. 3jo2 4jo. joc5o joc5u jol4e 4jr 4js ju1di jui4 ju5l ju3ni juscu4 jut3a ju1v k4abi k2a5bu kach4 k3a4g kais5 ka4l ka5lim kal4is k4an ka3o kap4 kar4i 1kas. kaur4 kav4 k1b4 k1c kcom4 k5d2 kdo4 kdol5 4ked ke5da k5ede 3kee ke4g ken4d keno4 kep5t ker5a k4ere k5erel ker4j ker5o kes4i ket5a key4wo k1f kfur4 k3ho 5kih ki2l kilo3 k1in k2in. 3kind kinema4 kin5et k3ing kin4i k2ins kir3m kir4r kis4 3kis. k1ish kit5c ki4w kk4 k5ker k2l2 k3la k5lea k3ler k3let k3li k3lo k1m kn2 k2no 1know ko5a kol4 ko5mi ko5pe k1p k5ro4 k3ru 4k1s k3sl ks2mi ks4t k1t kur5 k5v k1w 3kyl l2a 4la. 5laa lab5ar label4 5labr l4ac la2ca la5ceo la5cer la4ch la2co 5la5col lac5on la3cu la4de l5adm l4ae l4af la3ger la4gis lag3r 5lah4 la4ic. l4al 4lale 5lamandr la5melli lam4ie lam1o l5amu lan3at lan2d 3land. land3i 3lands lan4er lan3et lan5tine lan4tr la4p lapi4 lar5an lar5de 4lared l4as lat5al la4te 5latilis 5latiliz 5latini lat5us l4au 5laur lav5at l4aw 4laz l3b lbe4 l4bit l4by l1c2 l2cat lce4 lcen4 l4cere lch4e l3dar l3ded l3deh l5dera ld3est l5dew ldi2 l3die ld4ine l5di5nes ld3ish ld5li l3do 4le. 3leagu le5atio leav5er l3eb5ra le3ca le5cha lect5ica 2led le5dr leg1a l3egan 3legg le4gin leg3o le3gra lek4 4leled lel5o lelu5 lem5enc lem3is l5emiz 5lemm l3emn le2mo lem5on l5enda len5dar lend4e len4do le1ne le5nie len3o 4lentio len5u le3on leo4s le5q 2ler le5rec 5l4eria l4eric le5rig ler3om leros4 ler3ot 4les. le3sco 3les4s 1let le5tra le5tre 5le5tu5 leur5 2lev l3eva 5leve lev5ita le4wi l5exa 1ley lf5id l2fo lf3on l1g2 l4gal l4gem lgi4a l4gid l4goi l3h 4li. li4ani lias4 lib1r l1ic. 5lich li4cie 5licio l3ic3on lict4o li4cu l3ida l4idar 5lidif 3lieu l4ife l4ifo lift5er 1lig li5ger light5i 5lih 3lik 1l4il lil4i lim2b limet4e lim4p l4ina. l4inas lin4d l4ine 5lin3ea lin4er. lin4ers lin4ger ling3i 5lingt 3lingu 3linq lint5i 3liog li4ol lio3m liot4 li3ou 5liph lipt5 li1q 3lir l1is l4isk 5lisse l1it l2it. l3it5a 5liter 3lith 5litia 3litr lit4u l4iv l5ivat liv3er liv5id lkal5o lk5at lk3er. lk3ers ll2 l1la lla4ba llact4 l5las l4law l5leb l1lec l1leg l3lei l1lel lle5m l1len l3lep l3leu l3lev ll3f l1li lli5am lli4an llib4e llic4 l4licl lli5co l5lie lligat4 l2lin l5lin. l3lina l3line l5lio lli5v ll3m l1lo lloc3a lloc5u llo2q l4lov llow5er ll3p ll3s ll5t l1lu llun4 l5lya l3lyc l3lyg l3lyh l3lyi l5lym lm2 l1ma l1me l4mer lm3ing l5mip l2m3od l1n4 l3ne lneo4 2lo. 5load 5lob3a 1loc loc3al loc5ul lo4cus. 2locy l3odis 3lo3dr 1log lo5gan 4loi. lo5mi lom4m lon4al lon4e l5onel lo5ney long5in 3lonia loni4e l3onis l3oniz loom5er lop4e 5lo5pen l3opm 1lo1q l4ored lor5iat lor4ife lo5rof loros4 l4os. lo1so loss4 los5sie lot5at loth4ie lo5tu 5loup lp1at lp3er lph2 l5phe l3phin l2pho l3pie l3pit lr4 l3ri l3ro l5ru 4ls l5sam ls5an lsi4fia lsi4m ls4is l5sk ls4p l1s2t ltan3e l4tang lt5ant l5tar l1te l4tei ltern3 lth3i lti4ci ltim4a ltin4 lti3t l3t4iv lt4or l1tr ltramont5 l1tu l4tus 4lu. lu1a luch4 lu2c5o luc5ra lu4cu 4lue lu1en lu5er lu1i lu4it lum4bri lu4mo 5lump lu2m5u lunch5eo 5lune l3unta lu3ori 5lup 3lur3o lusk5 luss4 lut5an 4lut5ar 5lutioniz lu5toc lut5r lu1v lv5ate l5vet4 l4vi l4vor l3w lx4 2ly 4ly. ly1c ly4ca lyc4l lyc5os lym2 lymph5 lyp2 ly4pa lypt5o 3lyr lys5er 3lyw 3lyz lz4 4ma. m4aca mac3ad ma5chine 5machy ma4cis mact4 4mad. 4mada 4mads ma4ge 5magn 2mago4 2mah ma5ho 3ma4i 4mai. maid3 5mak mal3ap mal5ari 5male2 mal5ed mal3ef m3alg m3alis mal4is. mal3le mal4li 2mam mament4 m5ament. 1man 3m4an. man3a man5dar man3dr manic4 man4ica ma5nil m4ans mantel5 2map m3aph 1mar 5maran mar5ol ma5ron ma3roo mar5ri mar4shi mar3v ma3son massi4 mass5ing 3mas1t mas4ted mast4ic mas4tin m4at. m4aten ma3ter mater5n4 m4atit mat4iti m4atiza ma3tog mat5om ma3top m4ats 3m4att ma5ture mav4 2m1b mbat4t mb4d m5bec m5berer m4bery m4bes mb2i m2bic m5bil5 m4b3ing m4bis mb5ist mbival5 m5bler m3bli mbru4 mbu3l mbur4 m1c m5d m2e 2me. mea5g me5and me4ba me4bi 2med 4med. 3media med5icat 4medie m5ed5ies 3medit me4do m5edy me2g 5meg2a1 mega5t 4mele mel5ee mel5ler mel3on mel4t melt5er me2m 4m5eme 1men 3men. 2mena men4ag mend5er mend5o me1ne ment5or 5ments 5meog me4p m5eran 4mere mer4ia 2me2s mes5en me5si4a mes5q 3mesti4 1me2t meta3t met1e 4meted meth4i meti4c met5ici met3o met3ri m1f 4m3h 4mi. m1ic mi4cin mi3co 3micro m4ict mi3cul mi4cus m4idi mid4in mid5on mi5fi mig5a migh5ti mi2gr 4mij mi5ka m2il m3ila mil4ad 4m5ilie mil5ies 3mill mi5lo mil4t 3m2im mim5i 5min4d mind5er min4er. min4ers ming5li min5ie m4init min3ol 1m4int minth5o mi3o mi3p mirab4 mi5racu m2is. m4isc mi4se 4misem mis3ha 5missi m3ist. mis4tin m3ists mi2t m5itan 4mity 3miu 5mix 4m1l mlo5cuti mlun4 2m1m2 mman4d mmand5er m3medi mmel5li mmet4e mmig3 mmin3u mmis3 mmob3 m5moc mmor3 mmut3a 4m1n2 mnif4 m4nin mni5o mnis4 mno5l 1mo 4mo. 2moc mod1 mod5ifie mogast4 mo4go mog5ri m5oir mok4i mol3a 4molog. 4mologs 4mologu mo3ly mo1m mo4mis m4on mona4 4moned mon1g mo4no monolo4 monolog5i m4op mophil5i mop4t m3orab m3orat4 mor4ato m5ord mo5rel 3moria m5oriz mor5on 3morp 3morse mor5tal mo3sp 5most mo3sta 2m1ous m1p m3pa m4panc m4pant mpath3 mpel5li m5perer mper3i mpet5it mphal5o m4phe m4phl m2pi mp5id m5pig mp3ily mp1in m3pir mp3is m3po mpol5it mpo2t mpov5 mp3to mp5tr m3pu m5q m3r m4ry 4m1s msel5f m5si msol4 mtu4 muck4e muff4 mul1t2 m5unc mu5nio mun3is mus5co mu4se mus5ke mu3til m1v m3w 2my 5my3c my4d my3e 3myi 5myst4 3myt n1a 2na. na2c nach4 na5cious. na5ciousl nac4te nac5tiva na5culari na4d4a nadi4 nad4op n2ae. naffil4 nag4a n4agen 5na5geri na4gi n5ago 5n4a3gr 5nah 5nail na5iv nak2 4naled n5alg n4alia na3ly 1nam 3name nam4n na5nas nannot4 nan4ta nan5ted nan4to na5o 4n4ard nar5tisti n2as nas5i nas5p nas3s nas5te nat5al na5tat n4atee na3the nath4l nati4 n4ati. nat5ic n4ato. na3tom na4tos nat4r na5turi naugh5ti naus3 3naut naut3i na2v na5vel n3b4 nbarric5 nbeau4 nbe4n nbene4 nbet4 nbit4 n1c2a n4cal. ncarn5at ncel4i ncent5ri n4cept. n3cer ncer4e n4ces. n5cet n5cey n3cha nch4ie n3cho nch5olo n3chu n4cic ncid5en n4cif ncip5ie n1c2l n4cles ncoc4 nco5pat n1cr nc1t nc4tin nct4ivi nct2o n1cu ncu4lo n4cun n4curvi ncus4t 4nd n2da n3da4c n3dal n4dale n3dam nd3anc nde2 n3dea nde3ci n1ded nde4l ndeleg4 nd3enc ndepre4 n3derl nde4s ndes5cr n5dez nd4hi n1dic ndic5u ndid5a n3die nd5ily nd4ine nd3ise nd5is4i nd5ism. nd5ity nd3ler nd1li n5doc ndor4 n2dou nd5our ndrag5 ndram4 n5dron ndu4b nduct5iv n4dun nd2we n3dyi 2ne. ne3alo n3ear ne2b3u 5neck ne4cl ne2co n5ectom 2ned 3nedi ne4du4 neg3a ne3go 5negu neis4 2nele ne5lia neli4g n4ely ne2mo 4n1en n3end neo3l neon4 ne2p n1er 4nered 5nering ner5o ner4r5 ner2v nerv5in 2nes. n1esc ne3sia 1ness n1est nes3tr net3a net3ic ne4tog net1r neuma5to neut5r nev5er n4ew news3 n4eys. n3f nfo4 nform5er nfortu5 nfran3 4ng ng2a n4gae n5gee n3geri n5gero ngh4 n2gi n5gic ngio4g n5glem n3glie n5glio ng1n n1go n4gry n1gu n2gum n1h2 nhab3 nho4 nhy2 nhyd5 n1i 4ni. 3niac ni3ba n4icab ni4cen 4nicl nict5a ni4cul4 ni4dio n2ie ni4ers nif4f nift4 nif5ti ni2g night5i n3igm 3nign nik5e n2il nil4a n3im1 n4ime 5nimet n4ines nin4j 5ninn n4inu 5niol ni1ou 3nipu 5niq n4is. n4isk nis4l nis4o n5iss nis5ter. nis5ters nitch4 ni4te ni3tho n4itos ni5tra nit5res ni3tri nit4ur n2iv niv4a ni3vo nivoc4 niz5en n1j njam2 njur5i 4n2k nk5ar n5kero n3key nk5if nk5il 4n1l2 nland5 n3le nlet4 n3m nmater4 nmor5ti n1n4 nne4 nnel5li nnerv5a n3ni nni3ki nnov3 n5nyi 4no. n5obi no5bil nob4l no5blem nobser4 n5ocula no4di n4ody noe4c no4fa nois5i n5ol. no3la nol4i nom3al 1nomi no2mo 4none 3nonic 5nood nop5i nora4t nor5di nor4ia nor4is nor3ma n4oro nor4t n4os. nos4o no3sp not1a 3note n1ou n4oug 3noun 2nous nou5v nova4l nove2 nov3el novel5e n4ow now5er now3l n3p4 npil4 npla4 npoin4 npo5la npos4 npri4 n1q n4quef n1r nre4i nre3m nres5tr 4n1s ns2c n2sco ns3cot n4scu n5sec nsec4te n2ses n5seu n3sh2 n2si ns3ib n4sic n5sick n3sid n3sie ns5ifi ns3ing n3sio n3s2is nsi2t ns3iv nsolu4 n5son n4sore n4sory n3spir n3s2t nsta4 nstil4 n3su nsur4e n3swa ntab4u nt3age nt1al n4t3anc nt5and ntan5eo n4t3ant nt4ariu n5tasis nt3ast nt1at nt5ath nt3ati nt5ativ n5tau n1te n4tec n4tee. n4tees n3tel ntend5en n4teo n4ter. n3teri n5tern ntern5al nter5nat nth2 n1the nther5 nth5ine nt2i nt4ib n4tic. n5ticis n5ticiz n4tics ntic4u4 n3tid4 n1tie n4tify. n3tig nt5ilati n5till nt3ing nt5ing. nti3p n4tipar n4tis. nt3ism nt3ist n5titio nt3iz n2tj n1t2o n3tom ntoni4 n5top n1tr ntra3d nt3ral n4trant n3trat nt5ress nt3ril ntrol5ler n5trym n1tu n3tua ntub5 ntup5li n5tur n2ty n2u nu1a 5nuc 3nud nud5i nu3en nug4a nu3i nu4is 5nuk n4ulo n3ult nultim5 nu1me 5numenta 5numer 5numi 3nunc nu3tat n5utiv nu4to nu1tr n3v2 nve2 nvel3 nven4e nven5o nvers5an nvi4t nvoc5at n5w nwin4 nwom4 n2x4 2ny2 5nyc nym5it nyth4 n1z2 nzy4 2oa2 o5ace o3act oad5er oad5i o3ag oak5er o3ales oal4i oal5in o5alit oan4t oap5i oar5er oar4se oast5er oat5a oat5ee oat5er 4oba obe4l ob2i ob3ing 2obi3o ob3it o3bla ob1li 4obo ob3oc o5bol o5bot o3bra obrom4 ob5t ob3ul o3bus 2oc oc2a o4cab o3cad oc5ag o5calli o4c5ativ oc5ato 4o3ce2 o4cea ocen5o ocess4i och4e och5in o3chon ochro4n o5chu oci3ab oci4al o1cl o2cle o1cr ocre3 oct2 oc2te oc1to ocu4lu ocum4 oc5uo ocuss4 ocus5si ocut5r o1cy o5cyt ocyt5o od3al. ode4c o5deg ode4ga o5dend o3dent odes4 od3ica o4d1ie od3iga od4il od1is2 odis5ia od5it 5odiz od3li o2do od5olo od5ous o3dro od5ru o2du odu5cer o4duct. o4ducts od3ul o5dyt oe3a oe4bi oe5cu oe4d o5ee oe5ic o3elec oelli4 oelo4 oe3o4p oep5 o5eq o3er oes3t o1et o4et. oet3i oet4r 3oeu o3ev o3ex oflu4 4ofo o4ful ofun4 2o1g o2ga o3gam og5ar5 o3gas ogen1 o5gey o3gi o4gio og2na ogoni4 o4got o2gri o4gro og4sh o2gu o5gyr o1h2 o3ha ohab3 o3he oher4er o3ho4 ohy4 2oi oi4c o3ic. oi5ch o2i4d 4oide oig4 oi5ki5 oil3er oil5i oin3de o3ing oin4t5er oin4tr oi4o 4ois o3ism oi4t oit4al oith4 o1j ok4ine ok3l ok5u ola4c o4lack o5lali ol4an olan5d ol5ast olat5er ol5ch ole2c4 ol5eci ol5efi o3leo ole4on o3lep ol1er o3lest o3leu o1lia ol3ica o3lice ol5iciz ol5ick ol3ics ol5id. oli2e o3lier ol5ies. o5lif oli4f3e oli5go o5lina ol3ing oli5os ol5ip4 olis4 ol2it olle2 ollim3 ol4lope ol4lyi ol3mi o1lo 4oloc ol3oid o4lona olon5el ol1or o3los ol1ou 4ol1ub o3lumi o5lunte ol3us. oly3ph 4olyt 2om o1ma o4mab o2mac o2mal o4mane omast4 o3mat om4be ome4d ome4g omeg5a ome3li om3ena omen4t o3meri om1i o3mia omi2c omic5r om4ie. omil4 om4iny omiss4 om2it omme4 om2na omni3 o4moi omoli3 o2mo4n om5ony o4mos. omot5iv o2mou om5pil ompt5er ona4d on3ai o5nas. onast5i on5ativ 4onau on1c oncat3 on4cho 5ond5ar ond5ent on3der on3dr on5dy o2ne 4onea onec4r 4oned on1ee on5ell o3neo on3ess on1et ong3at on4gu 4onh 4o1nia on5iar 2oni4c onic5a onical4 on4id on3ies on3if o5nig o1nio onk4s 4onnes on5odi on5oi ono4mi 4o5nomic ono3s o5nota ons2 2ont ont5ane. on4ter onti5fi onton5 ont4r on4tre on5ur o5nus onvo5lu on2z 2oo oof3er oo1i ook3er ook3i oo4le ool5ie oo4m oon3i oo2p oop4ie o3opt oo4se oost5er oo2t oot3er ooz5er o1pa o4pab o5pali opa5ra opath5 o5pec opens4 op1er 3opera 4operag o1pha o4phe oph4ie o5phil op5hol o1phy ophy5la op1i op3ies op5ing o3p2it 4opl oplast4 o4poi opol3i opon4 op5ony op5ori opoun4 o2p5ov op2pl op5pli oprac4 op3ran opre4 opro4l op5rop op5so 1op1t op2ta op1u o5quial or1a or5ado ora4g o5rai or5al 4orals oram4 oran3e orator5 orb3in or4ch orch3i or4du 2ore or5ead ore5ar ore5ca ore3f ore3g or3ei oreo5l or3esc ore3sh or3ess orest5at or5este or5ett ore4v 5orex or4fr or5gn or1i 4ori. or3ia. 4orian ori4ci ori5cid orien4 or3if 5orig ori5ga ori4no 4orio. or5ion 4orios ork5a 2orm orm1i or3n4a 5ornis or3nit or3one o5roo or5ose or5oso or1ou orrel3 orres3 or4sc or4sey or4sti 2ort ort3an ort3at ort3er or5tes. or3thi or4thr or4tit ort3iz or4tor or5tra ort3re 4or1u or4un ory5p osa5i os3al osar5 o1sc os4ca os4ce o2sch o4sci osclero5s o3sec osec3u ose5g os5enc osens4 os5eo oser4 o2set os5eu o3sia osi4al osi4an os5ide o3sier os5if os1in o4sis o5ske o5son o3soph os3opo 4osp o3spec os1pi os4sa oss5ar os4sit 4osta ost5age os4tar os5tee os5ten osten5t ost5ica os3til o5stome ost3or 4osu os1ur 2ot ot3a4g o5talit ot3am ot4anic o3tap ot4atio o5ta5v o3tax o4ted oter4m ot5esta 4oth othalam5 oth5erin o5therm otherm5a o5thor o5tia o5till 5ot5iniz ot4iv o3tiva o5tivi o1t2o o5tone o4torn o4tou 4o1tr oturi4 oty3le o4u2 5ou3a oub2 ou5br ou5ca ou5co oud5i 4oue ou3et oug4 ou5ga ought5i ou5gi oul4t oult5i ou3m 2oun oun2d ound5a ound5el oun5gin oun3tr oup5li our3er ou5san 2ouse 5ousia ouss4 out5ish ouv5a ova3le o5var 4ovati ov5eling o4ver. over3b over3s ov4ete ovid5en o1vis ovis5o o2v5os ow3ag ow3an o5way owd4i owd3l ow1el owel5li ow5ha owhith4 ow1i ow5in owi5ne ows4 ow5sh ow5sl ow5y o4x ox3i oxic5ol ox5o 2oy oy5a oys4 2oz o1zo ozo5i o3zyg 4pa. pac4te pa5dou pad4r paes4 pa3gan 4pagat pag4ati pain2 4pairm pa5lan pal3in pa3lo p4als pan5ac pan1e pan3i pa4pa pa3pe pap3u pa3py 1par para5s par3l pa3roc pa3rol par5on 1p4as pass5ive pas1t pas4tin pa3ter pati4n p5ato pat4ric pa5tricia 5pau paul5e pau3p pa5vil 5paw pawk4 paw5ki 2p1b p1c4 p5d2 2pe. pearl5i pe4co pec4tu 2ped 5ped3a 3pede 3pedi ped3is 3peds pe2du p4ee pe2f 4pele pe5leo pel5v pen4at 5p4enc pend5er pen5dr pen4ic 3p4enn pens5ati pen5u pe5on 5perc percent5 4pere perem5i p4eri 5p4er3n p3eron per4os. per5tin pert5is per3v p4ery 2pes pes4s3 pes5til 3pet pet5all pet3en pe2ti pet3r pe4wa 4pex p1f p5g 2ph. 4phae pha5ged ph5al. ph2an phant5i phe4 ph5esi ph3et 3phib 4phic 1phil phi4n ph1is phi5th ph2l 1pho 4phobl 4phoned 3phor ph5oriz phos3p ph3ou 3phra 4phs 1phu phu5i 2phy. 3phyl 4pi. 3piar 4pica p5ical pi3co pi4cr pict4 p2ie p4iest pi5eti p5ifie pig3n p2il 3pile pill5in 5pilo pi3lot pim2 pin4e pin5et 3pinge p4inn 5p4ins 3pi1o pip4a pi4pe 5piq pir5ac pir4t p4is. p4isc pis2s piss5a pis5til pis4tr p2itu 2p3k2 p2l2 1pla pla5no plant5er plas5tici pla5t4o 4ple. 4pled. 3pleg 3plen 2ples 4plism 4plist plu2m plum4be plumb5er p4ly 2p1m 2pn pnos4 1po 4po. po3ca 3pod 4pof 2p5oid pois5i po5lemic po4ly1 poly3s poman5 pom4e p4o2n pon4ac pon4ce pon4i4e 3ponif pon5ta 2pony po4pa po5ple 4porato por3ea 4pored pori4f por3p 3port por5tie 3p4os pos1s2 po1te poult5e pound5er pout5er p5oxi 5poy 4p1p2 ppar3 pparat5 p4pene ppet3 pph4 ppi4c p4pled p5pler p5plet ppress5o pprob5a 1pr2 prac1 pra5d prar4 4pre. preb3 pre1d pref5ere prel5ate 3prem pre5mat pren3 pres3a pre5scin p3rese 5pressi 5prici pri4es 4pri4m pring5er pring5i 4prio p5riol pri4os pris5in priv2 4priva 4pro. pro3bo p3roc3a pro4ch pro1l pron4a proph5e propyl5 pro3r2 pros4i pros5tr pro3th 4pry 2ps2 p3sac psal5t p3sh p1si p5sin. pso3m p1st psul3i 3psyc 2pt2 pt3ab p4tad p4tan p2tar pt5arc p1ted p5tena pt5enn 5ptery p5tet pt4ic p5tie p3til p2t3in pt4ine p3tise p5tisi p5tom p4tr p1tu pub1 pu5be puc4 puch4 pudi4c pu5er puff5er pu4lar pu5lar. pu5lis p4u4m pum4o p4un pun4a 3punc pun5gi pun3i pun2t pu3pi pur5b pur3c p4us push4ie pu3tat p5u5tis pu3tr 4p1w 2p4y py3e 3pyg 3pyl pyr3e py5t 4qf qu4 5quak 4quar qua5tio 2que. 3quera 4quere 4ques. 1quet 5quina 5quir 3quito 4quitu 4ra. ra3ba 5rabe 3ra3bin r2abo ra3bol rac4a r2acu rac5ula ra5culo r2ad ra4de rad4ine rag5ou ra3gr 3raill ra5ist 4ralia ra3ly r5amn ra3mu r4andi ran5dish ran4du ra5nee ran4gen ra3nia ra3noi ran2t ran5ted 5rantel rant5in rant5o rapol5 rap5to 4rarc rare2 rar3ef rar5ia. ras2 ras3c r2ase r4ask ra3so rass5a rass5in r4as5te ra5tap ra5tat rat5eu rath4e rat3if rat4in. ra5toc 5ra5tol 4r4atom ra4tos ra5tui rat5um rat3ur rav5ai rav5eli rav3it rawn4 ra3zie r1b r2ba r4bag rb3ali rb1an rbar3 r2be rbe5c r3bel rbel5o rb3ent r4bes rb2i rbic4 rbic5u r2bin r5bine rbit1 r2bos r4bum rbu5t4 r1c2 rcant5 rca4s r4cele rcen5er rcen5tena r2ces rcha3i rch3al rch5ard rch5ate r3cheo r4cher rch4ier r4chin rch3is r3chit rcil4 rci5nog rcis2 rciz4i r2cl r4cle r5clo rcolo4 rcrit5 rcriti4 rct4 rc5ti r5dam r4d1an4 rd4an. r2dar r5de4l r3dens r4des rd5ess rd5ian r4die r5dig rd2in rd3ing rdi3o rd1is2 rd5ler rd3li r4dol rd5ous r2e 4re. rea4 r4ea. react5iv re3af re3ag re5alt re5amb re3ani re5ant re5asc reas3o r5eau 3reav r5ebrate reb5uc re3cal rec4ce re3ce reced5en re3cha reci5si r4e1c2r rec4t3r re3cu 2r4ed re1de re3dis re4dol re1dr reed5i ree3m 3reer re2fe re3fin re5gali re5gra re3gre reg3ri re3gro reg3ul rei4 re3if re1in re3is reit3 reit4i re1la re1le 4reled re3lia rel3ic re5lig reli4q rel3li r5em. rem5ac reman4d rem5ato r3emp rem5ul rena4 ren5at r4endi rene2 ren4es r4eni renic5 ren4it ren4ter re5num re3oc 3reog re5ola re3oli 3reos re1pe re4per re5ph rep5id re3pin re3ple re4pre re1q rer4a rere4 re5rea re3r2u 2res. re3scr re3sel re3sem re3ser res5ist re5sit re3spe r3esq re5stal rest5er re5stu 3retar re3ten re4t4er3 re5term re1t2o re5ton re3tra re3tre re5tri re3tu re3un reur4 re1v rev3el revi4t r1f rf4l rfu4m r1g2 r4gag rgal4 r2ge r5gee r4gene r3geo r3ger rg5li rgu5f rh2 r5hel4 rhe5ol rhos4 3r2hy 4ri. ri3am ri5ap 2r2ib ri3bo rica5tu 2rice rich5om rick4en r4icl ri5cli ri3col ri5cor ri4cra 2ricu rid4al rid4e ri5el ri3er ri2es rift5er rif5tie 5rifuga ri5gam rig5ant ri5l4a r4ile rill5er. rill5ings 4rim. ri2ma rima4g rim5an4 rim3at r4imb rimen4 4rimm 4rims rin4e r4inet ring5ie rink5er r4ino rin4s rins5i rin4t5er ri3o rio4g 5rione ri4op ri5or ri5p2a ri5pie rip5lica ri5r ris4c ris4is r2isp ris4pa ris4pe ris5ter 4risti ri3ton r5it5r r2i4v riv4al ri5vall riv5eli riv3en riv3il 5ri5zo r1j r2k r5kas rk5ati r5kell rk5eni rk1er r3ket r3key r3kier r5kiest r5kin. r5kins rks4me r1la rlat3 r1le r3l4ic r3line r5lins r4lit r1lo r3mac rma5ce r5mad r2mal r4manc r4mano r4mari r4mary rm4as r4m3ati rma5toc r5ma5tol rme2a r2mic rm4ica r5m2id rm4ie r5mig rmil5 rmin4e rm3ing r4ming. r4mite. r3moc rmol4 r1mu rmu3li r2n2 rn3ab r3nac r5nad rn5ar rn3ate rn5atin rn5edl r3nel r3ness rn5est r3net r3ney r5nia rn5ib r3nic rn3in rn4ine r1nis rn3ist rni5v rn3iz rn5n r3noc r5nog rnt4 rnuc4 r5nut 4ro. ro4be rob3le ro5br 5rocc ro3cu r2od ro3do rody4n ro1fe ro3gn 4roi ro3ic roid3 ro3la r4oled rol5ite ro3ly romant4 ro5mel ro3mit romolec5 rom4p ro3mu ron4ac 4ronal ro5nate ron5ch ron4do rong5i r5onme ro1no ron4ton roo4 1room 5root r2op 4rop. ro3pel rop4ine r4opr r5opte ror5d 4rore r4osa rosi4a ro5sol 4ross ro5stat ros4ti ros5tit ro3tat ro1te ro4ter ro3tu 5roue roul3 round5er rou5sel 4rouss r4out r4ow row3er 4rox rpass5in rp3at rpe2 r3pent rp5er. r2ph rph5e r3phol rp3ing rp5is rpol3a r2p5ou rpre4 rpret5er r3pu r1q 4r1r4 rra4h rran5gi rrap4 rre2l r4reo4 rrhe3 r3ri rric4 rricu4 rri4fy. rrin5ge rri4os rrob3 rrog5 rro4t r5ru rry5 r3ryi r3rym 2r1s2 r4sag r2sal r5salis r5saliz r2san r4sar r2se r3sea r3sec rsel4 rsell5 rs3er. rs3ers r3set r3sha r3shi r4shie r5si2a rs3ib r5sie r4sil rs3ing r3sio r4sit rs3iv rs5li rstor4 rstrat4 r3su r4sus rswear4 rt2 rt3ab rta4g rt3age r3tar r4tare rt3c r1ted r4tedl r3tel4 r5tend rt3eni r5terer r5tet r5teu r4thene rth2i rth5ing. rth3ri r1t4ic r4ticl r5tiet r5tila r5till rtil5le rt5ily r2tin r3tina rt3ing r3titi rti5tu rt3iv r2tiz rt5let rt3li r1t4o rto5l rt5rid rt5si r1tu r4tus rtwis4 ru3a r4ube rub3r ru4ce r2ud rue4l r4uf ru3in ruis5i ru2l r4ume r4umi ru4more run4cl runcu4 runcul5 run2d4 run2e ru5net run4g run4t ru2p rup5lic ru3pu rur4i rus4p rust5at rust5ee rus5tic rus4t5u ru3tal ru3ti r1v2 r4vanc r2ve rvel4i r3ven rven4e rv5er. rv5ers. r3vest r3vet r3vey rvi4t r1w 2r2y ry5er 5rygm ry4go rym4b 3ryngo 4ryngol ryp5a ry2t ryth4i r2z 2sa. 2sab s3abl 5sack sac4q s3act sac4te sad5i sad5o 5sae sa4g 3sai sain4t 5sak sa2l sa5lac 3sale sa3lie s4al4t sa3lu sa4m sa5min sam5o samp4 san3a san4ded s4an4e san5gar san5if 2sant sant5ri s3ap sap3r sar5s 3sas. sas3s sassem4 s2a1t sa2te s5ativ s5atory sat1u 1sau sau5ci saur5 savi2 sa3vou 4s3b s4bei sbe4s sby3 sc2 s1ca sca5len sca2p scar4c scav3 s1ce s4ced 4scei 4s4ces sch2 scid5 s2co scof4 s4coi 3s4cope 5scopic 5scripti 2s1cu 4scura. 4scuras 2s1d2 2se. se2a s4eam seas4 sea3w sec4a sec5an se2co secon4 2sed se4da sed4it 3seed 3sei sei3g 5sela 4sele se3lec selen5 5self 2s4eme sem2i semi5d sem4o sen5g 3sens sen5sati sen5sori sent5ee 5sentm seo5log se2p sep3a sep4si 3sept sep3ti ser4an se5rene ser4to 4servo s2es 4ses. se5sh s5esta 1set 5seum 3sev sev3en sewo4 3sex sexo2 3sey 2s1f sfact5o sfi4 sfor5e sfran5 2s1g4 s2h 4shab sh4abi sh1er sh5et shil5li sh5iness sh3io 5ship s3hon 4shu4 shys4 si4all siast5 4s1ib s3icat 3sicc 2s5icl si4cu si5cul s4id 4sid. si4de side5l sid3en sid5eri 4sids 5sid5u4a si4ers sif4 sif5f si4g 1sili sim4ply 2sin s2ine sin5et 5sing5er sin3i 5sink si5nol si3nus 1sio4 4sio. si5o5s 3sip si4pr s1is2 4sish 4sism sist3a sist3o s1it si4te sit5om 4s1iv 5siva s1j s2k2 4sk. s5kar ske2 s3ket s5key s3kier s5kiest sk5ily sk5ines 4sks sky3l 2sl4 slang5i s1lat 3slau slav5eri s2le s5lea s3let s5ley s3lit slo3c slov5 s5luc 2s1m4 s3man smas4 s3men smi3g 3smith smo4d smu5tatio s1n2 s2na 2so. 2s3od sod3o sody4 3soe 4s3oid s2ol sol3a so5lan sol4er so3lic 3solve solv5er 1so2m soma5to 3some. so5mete so3mo s2ona son5at s4one son5or s2o2p 4sor3ie 5sorio sor4it s5oriz sor3o s3ory sos4 4sose so5th 3sou sov5e so3vi spast4 spens5a 4speo 3sperm s5pero spers5a sph2 s3pha 3spher spic5ul s2pid sp5id. s5pier spil4l s2pin sp3ing spi5ni spital5 s1pl sple2 s4ply s2po 5spom spon5gi 3spons 3spoon spru5d s4py s1r sre2 sreg5 srep5u sre4s 4ss s1sa s5sam2 s1sel s5seng s3sent ssent5er ss3er. s5seri ss3ers s5seu ssev3 s3sia s1sic s1sif ss1in ss4in. s4sine ss4is. s3s2it ss4ivi ss5li ss3m s4sn s1so ssol3u ssolu4b s4sore ssor5ial ss5po s1su ss3w st2 4st. stab2 sta3bi 4stak s4tale stant5iv s3tas. 5static st3c ste2 ste5ar ste5at s4teb s4tec 4s1ted s4tedl s4tedn 4stere ster4ia s4tern. s3tero st5est s1th s4tha s4thu s3ti3a 3stick s3ticu stil5ler s4tily st3ing 5s4tir s5tiz 4stl st3ler st3li s4toe 3ston stone3 ston4ie s5torat stor5ian s4tose s2tou s4tray stre4 strep3 3struc stru5d 2st3s s1tu s4tud stu4m stur4e 4stw s4ty 1styl 4su. su5an su4b1 subt2 suct4 sud4a su3et suf3f sug3 3sui sui5c su5ing 1s2ul s4u2m sum3i sun4a su5pe su3pin supra3 sur4as sur3c s4urg sur3pl su5su su5z 2s3v svers5a sves4 svest5i sw2 5swee swell5i 4swered 2swo s2y 4sy. sy4bi sy1c sy4ce sy4chr sy4d 1syl 3syn syn5e sy5pho syr5i 2ta. 2tab ta5blem 3tabli t2abo ta3bol ta4bou t4a3ce ta5chom ta3chy ta4cid t5ade tad4i 5t2adj ta5dor tad2r tae5n taf4 tage5o ta5gog 3tagr 3tah 1tai 3tail 2tair t4ais 1tak tal2c tal5ent ta5lep t4alia t4alin tal4l3a 5tallu t2alo4 ta3ly tam5ari 5ta3met tamorph5 tan5at tand5er t4ane 5tanel tan5ie t5aniz tant5an ta4pa 1tard tar5ia. tark5i tar3n 3tarr tas3i t3asm 5tass tas4t ta3sta tast5i4c t4ateu 3tatis t4ato. tat4ou tat4r tat3ut tau3to t5awa tawn4 t4ax 4t3b 2tc2 t1ca tcas4 tch5ett tch5u 4t1d4 4te. te5cha 5techn te3cr t4ed te5d2a 4tedd 4tedo 4teei te2g 5tegic t3ego teg1r teg3u tei4 te2l 4teled tel5iz 1tell 4te3lo 3tels tem3a 4teme te5mon ten4ag 4tenar 4tene t5enm 5tenna 4teno te5nog tent4a te2o teo5l 2tep te3pe tep5i tera4c t4erag t4erato 3ter3b 5terd 2tere4 ter3eb ter5ec 5terel te3reo 3teres4 1teri ter3ia ter5id ter5if t4erin ter5iorit ter3it ter5k 5ternit ter5no 3terr 2t2es 4tes. tesi4 t3esq t3ess. t5esses tes4t test3a 5teste test5er test5in test5or tes5tu teti4 tet1r tetr5o tew3ar 3tex 2t3f t3g 2th. tha4 th5al. thal3m 4the. 4thea th5eas 4thed 1thei 3theo theo3l t4her 5therap th5erc t5herd 4thered th3ern th3ery 4thi. t5hill 3think 5th4io th4is. th5lo 2thm2 th4mi th3oli 4t5hoo 4thopt 4thores 3thot 5thoug 1th2r 2ths 5thur 5thym 3thyr thys4 4ti. 1ti2a ti3ab 2t3ib 5ti5bu t1ic t3ic. tic5as t2ici tici5ar 3ti3cin t4icity ti3col tic1u 4ticule t3id. t4ida 3tidi ti3die t5ids 3ti2en 1tif2 ti3fe 4tiff 4tific. 3tigi tigi5o 4tigm 5tigu ti4ka ti4let 5tilin t4ill til4l5ag t4ilt 1tim tim1a 5timet4 t1in 5ti5nad 4tined tin3et ting5ing 3tinn 4tins t4int tin4te tin5ted tint5er tin3ue 1tio ti3oc tiol3a ti5omo 4tionem 1tip ti5plex ti3pli ti4q ti5qua t3iris 2t1is 3tisan tis4c tish5i 3tiss tis2t 5t4iste t4istr ti5t4an tith4e tit5il t3itis 3titl ti3tra 3tiu 2t1iv tiv5all t3ive tiv3is 2tl t1la tlant4 5tleb 5tledr 3tlef 3tlem 5tlen 5tletr 5tlew t1li tlin4 4t3m tmet2 tmo4t5 2t3n2 t4nere 2to. toas4 to1b 4tocc tode5c tod4i to5do 3toe 1tog 2t3oid 5tok 4toled tol4l tolu5 to5ly tom3ac toma4n tomat5ol tom4b to4mog tom5os ton4e ton5ea 3tonn ton3s top4e to5pia to4pos t1or to5rad 4tore tor5er tori4as tor5oi tor5p tor4q 3tos. to3s4p tos4t to5str to5talis to5taliz to3tem tot5u tou4f 5tour t3ous 4tov to3war t3p tr2 tra4co 4tradd 4traist tra5q trarch4 tra5ven tra5vers trav5est 3tray 4tre. 4tred tre4mo tren4 trend5i tre5pr tres4s 4trew t5ricl 3tricu t2rie tri5fli trifu5ga 2tril tri3li tri3me t2rit 4trix t4rod tro5f 5troop tro4pha tro3sp t2rot t5roto tro1v 3troy t4ruc tru3i 2t4ry trys4 4t1s t2sc ts4h ts2i t4sil tstay4 2t1t4 tta4 t3tab t5tan t5tas t3ted t4tere t5terer t5test t3ti tti3tu ttitud4 ttitu5di t3tler t3tli t5toi t5tor t3tos tt5s t4tupe t2ty 4tu. tu1a tu4al5li tuari4 tu4bin tu5bu tu5den tud5ie tu5en 4tuf tu1i tu4is 2tum. 3tumi 4tums 3tun tun4a tu4ne tun5it tup5let tup5lic tu5rac t4uran turb3a tur4d turf5i 5turit tur4n 5tur5o 1tut 4tut4iv t1w t3wa4 t2wi twi5li t3wit t3wo twon4 4ty. ty4a 5tych ty4let tyl5i ty5mi 1typ 3type 1tyr1 2tz2 t5zia t5zie 2ua2 ua3ci u2ag ua5h u1al ua5lu uan4o uant5is uant5it uar3a uar2d uar3i uari4n uar5ters uar4t5i ua5tern uba4 ub5bly u1b2i u4bicu ub3lin ub5lo ub3ra 4uc u1c2a uccen5 u4cend u4ch u5chr uc3l u4com uco5t uc2tr uc3ub uc5ul u5cum u5dac ud1al ud4e ud5ep u4der udev4 ud4g udi4cin ud3ied u5dinis udi3o u5ditio u2do u5doi ud5on u5dor ueb4 u4ed uen4o uen4ter uer3a ues4s uest5rat ues5tri ue4t uf2 3ufa u3fl u4fo uft4 uga4c ug5lif ug2ni u4go ug3ul ug3ura uhem3 2ui2 ui3al u2ic uicent5 uid5o uil4a uild5er ui3lib uil4t uinc5u uin4s uint4 uin4ta ui5pr uis3er uis4t uisti4 uit5er ui5val5 ui3vo u2iz 4ul. u1la u4lab 4ulac ul5ard u5lat ul4bo ul3ca ul4ch 5ulche 5ulchre 4ulea u5lee u1len4 4ulenci u5lent ulet4 ul4ev ul2fa ul2i ul4ia u3line ul3ing ul5ish u5liti u5lity 4ull ul4lat ul4l5ib ul4lis ul4lit ul3m u1lo u5lom ulph3i ulph3o ulp5ing ul4po 2uls ul3sif u1lu ul1v4 u1ma um3am umar4 u5mas um4bar. um2bi umen4t u1mi u4mic u2m5if umi4fy umi5lia umin4ar u4mined u4m3ing u4mora u4mos um2p um4pa ump3er ump5li umpt4 ump5te u1mu umu4lo un1 u4n3a4 un5ab unabu4 un4ae un4as. un2ce un4dal un3ded unde4t undeter5m undi4c un4die un3do un4dus u3n2er unho5li un2i u1nic un4ie un3in un4ine uni5p uni3so un3ist uni1v un3iz unk5eri un5ket un3kn 2unn un4nag un5o un5r un3s4 un5sh un2ti until4 unu4 un3us uo3de uodent4 u5oros u3os uo5tatio u1ou 2up u1pat u1pe u5pee uper3 u1ph u5pid up3ing u4po u5pol u2pr upre4 u5quet u4r ur1a 4ura. ura4ci 4urae ura2g 4uranti uras5 urb5ing ur2c urc3a ur5den. ur5deni ur5die ur4du ur3ea ur5ee ur1er ur3ers ur1e2t ur3ett ur2f ur3fa ur1i u5ri5cu ur4ie. ur5ifie uril4 ur4ili ur5ion uri4os. url5er ur5lie url5ing ur1m4 urn3al urn3er urn5s ur1o uro4d ur5o4m ur5ot uroti4 urpen5t urph4 ur2s urs5al urs5er ur3sh urs3or ur5ta ur1te ur5tes urth2 ur3the urti4 ur1u ur4va u3sad us3ag us3al us4ap us3at 2usc us4can ush5a us5ian usil5 u4s1in usk5er us1p us4pa uss4e 4ust us3tac us5tan ust4ic us5tici ust5ig ust3il us1to4 us1tr us4tre usur4e us5uri u3tane utch4e ut5eni u5teo u4tere ut2i u3tie ut3ing u5tini u3tio ut5ism ut3ist 5u5tiz ut3le utli4 ut2o u4to5s u4t1ra uts2 ut5sm ut4tone u3tu u4tul uu4 uv2 u4va uve2 uven3 uv5eri u5vin ux2o uy4a uy5er 4va. 2v3ab 5vac va1ca va5ceo vacu1 v4ad 3vag3a va4ge 4vaged vager4 vag5r v1al. 1vale vali2 va5lie val4ise 5valu 5val4v vam4i va5mo 5vann vanta4 4vantl var4is 4vase vas5el5 v5a4so vast3a v4at. 5vatee vat4ina 4vatu 2ve. vect4 ve3g 3vei 2vel vel3at 4vele v3eler ve5line v1ell v4ella vel5ler vel3li vel5opi ven4al ven4do ve1ne ve5nia vent5o ven4tr 4venu v5en5ue 5ve3o 5verb verde5v 4v4ere4 ver5ea ver3ei v5erie ver3m4 ver4ne 5verse 4ves. 4vi. 5vialit vi4atr vi1b4 vic2 vi4ca vi5cari vice3r 5vict2 5vicu 5vider vign3 vi4l vil3i 3vili4a v5ilise v5ilize vil5lin vim4 5vime 2v1in vin4ac 3vinci vin2e 5vinit v5iniz vint4 vin5ta 3vi1o viol3 vi5om 5vi3p vire4 vi5rid vir3u 5visecti 5visio v3ism 2v5ist vi2t vit2a vi3tal vi5tel v5itie vit1r vi3tu v3ity viv5al viv5or vi5zo 1vo 2vo. vo2l vo5litio vol4ubi volv4 4von vo5rac 3vorc 4vore 3voro vo3tar 2vow vr4 v5ra4 v5ri v5ro vrot4 4vs v3ure 2vv2 v5ver v5vi 4vy 4wab wag3o wais4 w3al. wall5er w3als wan5gli wank5er war5ded ward5er ward5r war4f war4te war5thi wass4 was4t wa1te wav4ine w1b4 w4bon w5c w5die w3dr we4b w4ed 3weed 5wei weight5i weir4 wel3i weliz4 wel4izi wel4li went4 wes4 west3 w5est. w5f wh2 w5hid wi2 wid4e wi5er will5in wim2p win2e wing5er win4tr 3w4ise with5eri w3la wl1er wl1i wl4ie w1m 1wo wol4 wol5ver 3wom won2t word5i wotch4 woun4 wp5in wra4 ws5ing w5ster wt4 w5te w3to wy2 wz4 x1a x4ach x4ade x2ag x3agg xa5met x3ami xan5d xano4 x2as xas5p x3c4 xcav3 xcor5 xe4 x1ec xec3r xe5cutio xecut5o xe2d x5edl x5edn x5eg x1em x3en xen4op x3er xer4g xer3o x1h xhort4a x1i x3ia. x4ias xi4c x5ige xim3a x4ime ximet4 x3io xi4p x4it. x4its x1o x4ode x5om xo4mat xo4n x4os xotrop4 x3p xpel4 xpo5n2 xpoun4 x1s2 x1t2 x4ted xtens5o xter3i xter4m3 xtern3 x4th xti4 xtra5d xtra3v xtre4 xu4o x1ur xur4b x5us x5w xx4 xys4 xy3t y1a2 y5ac 1y2ar 3yard yas4i 4y1b yb2i yca5m y5chede ych5is y3cho y4chose yc1l yclam4 y4coli y4coll ycom4 y2cos y1d4 yda4 yder4 ydro5s y4drou y3ee yel5o y3en y1er y3est. yes5te y5ett y5f y1g ygi2 ygi5a y3gl ygo4i y1h y1i y3in yle2 ylin5de yllab5i yl3os yl5ou y1me4 y3men y5met y5mia ym5in ymot4 ym4pha yn1 ynago4 ynand5 yn5ap4 yn5ast yn4ci ynd4 yn2e yn3er yng4 yn4gol yni4c yn4y y1o2 yo3d yo4gis youn4 young5 2yp yp5al yper3 y5pere y4peri y4pero y4pet y2ph yph4e yph3i y4p1i yp1n ypo1 y4pox y2pr yp5ri yp4si yp5syf ypt3a y5pu y3rag yr3at yr3ic y5rig yr3is yr3i4t yr5olo yr4r yr4s yr5u 4y2s ys5ag ys5at y3s2c y3sh ys1ic ys3in ysi4o yso5 ys4so ys1t ys4to y3u yv4 y3w yz5er yzy4 z1a1 2za. za4bi za2i z4as za4te zd4 zeb4 ze4d zen4a z5eng zer5a z3et4 z1i zib5 5zic4 z2ie zi5m zin4c3i z3ing zing5i z4is 3zlem z3ler z3li 4zo. 5zoa zo3an 3zoo2 zo3ol zo3on zo5op zo5oti zo5p zot2 z5s 5zum 4zy. zz2 z3zar z5zas z3zie zzo3 z5zot",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=8527,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-gb.rme b/Master/texmf-dist/tex/context/patterns/lang-gb.rme
index ce156c82421..5a90a5a34b8 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-gb.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-gb.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Hyphenation Patterns for British English
+
+(more info about the licence to be added later)
+
% This file has been renamed from ukhyphen.tex to hyph-en-gb.tex in June 2008
% for consistency with other files with hyphenation patterns in hyph-utf8 package.
% No other changes made. See http://www.tug.org/tex-hyphen for more details.
@@ -57,4 +61,4 @@
% patterns. This file of hyphenation patterns may be freely distributed.
%
% These patterns require a value of about 14000 for TeX's pattern memory size.
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-hr.lua b/Master/texmf-dist/tex/context/patterns/lang-hr.lua
new file mode 100644
index 00000000000..353c41ec738
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-hr.lua
@@ -0,0 +1,91 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="hr",
+ ["source"]="hyph-hr",
+ ["texcomment"]="% Croatian Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: hrhyph.tex (1996-04-10)\
+% Author: Marinović Igor <migor at student.math.hr>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% Hyphenation patterns for Croatian language\
+%\
+% The first version was realised in late 1994. \
+% Second, much more improved version was realised in the beginning of 1996.\
+% Date of the last change: 19.03.1996.\
+%\
+% Marinović Igor\
+% migor@student.math.hr\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnoprstuvzćčđšž",
+ ["data"]="a1a2 a1e2 a1i2 a1o2 a1u2 e1a2 e1e2 e1i2 e1o2 e1u2 i1a2 i1e2 i1i2 i1o2 i1u2 o1a2 o1e2 o1i2 o1o2 o1u2 u1a2 u1e2 u1i2 u1o2 u1u2 a1ba a1be a1bi a1bo a1bu a1ca a1ce a1ci a1co a1cu a1ča a1če a1či a1čo a1ču a1ća a1će a1ći a1ćo a1ću a1da a1de a1di a1do a1du a1dža a1dže a1dži a1džo a1džu a1đa a1đe a1đi a1đo a1đu a1fa a1fe a1fi a1fo a1fu a1ga a1ge a1gi a1go a1gu a1ha a1he a1hi a1ho a1hu a1ja a1je a1ji a1jo a1ju a1ka a1ke a1ki a1ko a1ku a1la a1le a1li a1lo a1lu a1lja a1lje a1lji a1ljo a1lju a1ma a1me a1mi a1mo a1mu a1na a1ne a1ni a1no a1nu a1nja a1nje a1nji a1njo a1nju a1pa a1pe a1pi a1po a1pu a1ra a1re a1ri a1ro a1ru a1sa a1se a1si a1so a1su a1ša a1še a1ši a1šo a1šu a1ta a1te a1ti a1to a1tu a1va a1ve a1vi a1vo a1vu a1za a1ze a1zi a1zo a1zu a1ža a1že a1ži a1žo a1žu e1ba e1be e1bi e1bo e1bu e1ca e1ce e1ci e1co e1cu e1ča e1če e1či e1čo e1ču e1ća e1će e1ći e1ćo e1ću e1da e1de e1di e1do e1du e1dža e1dže e1dži e1džo e1džu e1đa e1đe e1đi e1đo e1đu e1fa e1fe e1fi e1fo e1fu e1ga e1ge e1gi e1go e1gu e1ha e1he e1hi e1ho e1hu e1ja e1je e1ji e1jo e1ju e1ka e1ke e1ki e1ko e1ku e1la e1le e1li e1lo e1lu e1lja e1lje e1lji e1ljo e1lju e1ma e1me e1mi e1mo e1mu e1na e1ne e1ni e1no e1nu e1nja e1nje e1nji e1njo e1nju e1pa e1pe e1pi e1po e1pu e1ra e1re e1ri e1ro e1ru e1sa e1se e1si e1so e1su e1ša e1še e1ši e1šo e1šu e1ta e1te e1ti e1to e1tu e1va e1ve e1vi e1vo e1vu e1za e1ze e1zi e1zo e1zu e1ža e1že e1ži e1žo e1žu i1ba i1be i1bi i1bo i1bu i1ca i1ce i1ci i1co i1cu i1ča i1če i1či i1čo i1ču i1ća i1će i1ći i1ćo i1ću i1da i1de i1di i1do i1du i1dža i1dže i1dži i1džo i1džu i1đa i1đe i1đi i1đo i1đu i1fa i1fe i1fi i1fo i1fu i1ga i1ge i1gi i1go i1gu i1ha i1he i1hi i1ho i1hu i1ja i1je i1ji i1jo i1ju i1ka i1ke i1ki i1ko i1ku i1la i1le i1li i1lo i1lu i1lja i1lje i1lji i1ljo i1lju i1ma i1me i1mi i1mo i1mu i1na i1ne i1ni i1no i1nu i1nja i1nje i1nji i1njo i1nju i1pa i1pe i1pi i1po i1pu i1ra i1re i1ri i1ro i1ru i1sa i1se i1si i1so i1su i1ša i1še i1ši i1šo i1šu i1ta i1te i1ti i1to i1tu i1va i1ve i1vi i1vo i1vu i1za i1ze i1zi i1zo i1zu i1ža i1že i1ži i1žo i1žu o1ba o1be o1bi o1bo o1bu o1ca o1ce o1ci o1co o1cu o1ča o1če o1či o1čo o1ču o1ća o1će o1ći o1ćo o1ću o1da o1de o1di o1do o1du o1dža o1dže o1dži o1džo o1džu o1đa o1đe o1đi o1đo o1đu o1fa o1fe o1fi o1fo o1fu o1ga o1ge o1gi o1go o1gu o1ha o1he o1hi o1ho o1hu o1ja o1je o1ji o1jo o1ju o1ka o1ke o1ki o1ko o1ku o1la o1le o1li o1lo o1lu o1lja o1lje o1lji o1ljo o1lju o1ma o1me o1mi o1mo o1mu o1na o1ne o1ni o1no o1nu o1nja o1nje o1nji o1njo o1nju o1pa o1pe o1pi o1po o1pu o1ra o1re o1ri o1ro o1ru o1sa o1se o1si o1so o1su o1ša o1še o1ši o1šo o1šu o1ta o1te o1ti o1to o1tu o1va o1ve o1vi o1vo o1vu o1za o1ze o1zi o1zo o1zu o1ža o1že o1ži o1žo o1žu u1ba u1be u1bi u1bo u1bu u1ca u1ce u1ci u1co u1cu u1ča u1če u1či u1čo u1ču u1ća u1će u1ći u1ćo u1ću u1da u1de u1di u1do u1du u1dža u1dže u1dži u1džo u1džu u1đa u1đe u1đi u1đo u1đu u1fa u1fe u1fi u1fo u1fu u1ga u1ge u1gi u1go u1gu u1ha u1he u1hi u1ho u1hu u1ja u1je u1ji u1jo u1ju u1ka u1ke u1ki u1ko u1ku u1la u1le u1li u1lo u1lu u1lja u1lje u1lji u1ljo u1lju u1ma u1me u1mi u1mo u1mu u1na u1ne u1ni u1no u1nu u1nja u1nje u1nji u1njo u1nju u1pa u1pe u1pi u1po u1pu u1ra u1re u1ri u1ro u1ru u1sa u1se u1si u1so u1su u1ša u1še u1ši u1šo u1šu u1ta u1te u1ti u1to u1tu u1va u1ve u1vi u1vo u1vu u1za u1ze u1zi u1zo u1zu u1ža u1že u1ži u1žo u1žu b1b b1c b1č b1ć b1d b1dž b1đ b1f b1g b1h 1bj 2bj. b1k 1bl 2bl. 2b1lj b1m b1n b1nj b1p 1br 2br. b1s b1š b1t 1bv 2bv. b1z b1ž c1b c1c c1č c1ć c1d c1dž c1đ c1f c1g c1h 1cj 2cj. c1k 1cl 2cl. 2c1lj c1m c1n c1nj c1p 1cr 2cr. c1s c1š c1t 1cv 2cv. c1z c1ž č1b č1c č1č č1ć č1d č1dž č1đ č1f č1g č1h 1čj 2čj. č1k 1čl 2čl. 2č1lj č1m č1n č1nj č1p 1čr 2čr. č1s č1š č1t 1čv 2čv. č1z č1ž ć1b ć1c ć1č ć1ć ć1d ć1dž ć1đ ć1f ć1g ć1h ć1j ć1k 1ćl 2ćl. 2ć1lj ć1m ć1n ć1nj ć1p 1ćr 2ćr. ć1s ć1š ć1t 1ćv 2ćv. ć1z ć1ž d1b d1c d1č d1ć d1d d2ž d1đ d1f 2d1g d1h 1dj 2dj. d1k 2d1l 2d1lj d1m d1n d1nj d1p 1dr 2dr. d1s d1š d1t 1dv 2dv. d1z dž1b dž1c dž1č dž1ć dž1d dž1dž dž1đ dž1f dž1g dž1h 1džj 2džj. dž1k 1džl 2džl. 2dž1lj dž1m dž1n dž1nj dž1p 1džr 2džr. dž1s dž1š dž1t 1džv 2džv. dž1z dž1ž đ1b đ1c đ1č đ1ć đ1d đ1dž đ1đ đ1f đ1g đ1h 1đj 2đj. đ1k 1đl 2đl. 2đ1lj đ1m đ1n đ1nj đ1p 1đr 2đr. đ1s đ1š đ1t 1đv 2đv. đ1z đ1ž f1b f1c f1č f1ć f1d f1dž f1đ f1f f1g f1h 1fj 2fj. f1k 1fl 2fl. 2f1lj f1m f1n f1nj f1p 1fr 2fr. f1s f1š f1t 1fv 2fv. f1z f1ž g1b g1c g1č g1ć g1d g1dž g1đ g1f g1g g1h 1gj 2gj. g1k 1gl 2gl. 2g1lj g1m g1n g1nj g1p 1gr 2gr. g1s g1š g1t 1gv 2gv. g1z g1ž h1b h1c h1č h1ć h1d h1dž h1đ h1f h1g h1h 1hj 2hj. h1k 1hl 2hl. 2h1lj h1m h1n h1nj h1p 1hr 2hr. h1s h1š h1t 1hv 2hv. h1z h1ž j1b j1c j1č j1ć j1d j1dž j1đ j1f j1g j1h j1j j1k j1l 2j1lj j1m j1n j1nj j1p j1r j1s j1š j1t j1v j1z j1ž k1b k1c k1č k1ć k1d k1dž k1đ k1f k1g k1h 1kj 2kj. k1k k1l 1k2lj 2klj. k1m k1n k1nj k1p 1kr 2kr. k1s k1š k1t k1v k1z k1ž l1b l1c l1č l1ć l1d l1dž l1đ l1f l1g l1h l1k l1l 2l1lj l1m l1n l1nj l1p l1r l1s l1š l1t l1v l1z l1ž lj1b lj1c lj1č lj1ć lj1d lj1dž lj1đ lj1f lj1g lj1h lj1k 1ljl 2ljl. lj1lj lj1m lj1n lj1nj lj1p 1ljr 2ljr. lj1s lj1š lj1t 1ljv 2ljv. lj1z lj1ž m1b m1c m1č m1ć m1d m1dž m1đ m1f m1g m1h 1mj 2mj. m1k 1ml 2ml. 2m1lj m1m m1n m1nj m1p 1mr 2mr. m1s m1š m1t 1mv 2mv. m1z m1ž n1b n1c n1č n1ć n1d n1dž n1đ n1f n1g n1h 2nj. n1k 1nl 2nl. 2n1lj n1m n1n n1nj n1p n1r n1s n1š n1t 1nv 2nv. n1z n1ž nj1b nj1c nj1č nj1ć nj1d nj1dž nj1đ nj1f nj1g nj1h 1njj 2njj. nj1k 1njl 2njl. 2nj1lj nj1m nj1n nj1nj nj1p 1njr 2njr. nj1s nj1š nj1t 1njv 2njv. nj1z nj1ž p1b p1c p1č p1ć p1d p1dž p1đ p1f p1g 2p1h 1pj 2pj. p1k 1pl 2pl. 2p1lj p1m p1n p1nj p1p 1pr 2pr. p1s p1š p1t 1pv 2pv. p1z p1ž r1b r1c r1č r1ć r1d r1dž r1đ r1f r1g r1h r1j r1k r1l 2r1lj r1m r1n r1nj r1p r1r r1s r1š r1t r1v r1z r1ž 1sb 2sb. s1c 1sč 2sč. 1sć 2sć. 1sd 2sd. 1sdž 2sdž. 1sđ 2sđ. 1sf 2sf. 1sg 2sg. 1sh 2sh. 1sj 2sj. 1sk 2sk. s1l 1slj 2slj. 1sm 2sm. s1n 2sn. 1snj 2snj. s1p 1sr 2sr. 1ss 2ss. 1sš 2sš. s1t 2st. 1sv 2sv. 1sz 2sz. 1sž 2sž. 1šb 2šb. š1c š1č š1ć 1šd 2šd. 1šdž 2šdž. 1šđ 2šđ. 1šf 2šf. 1šg 2šg. 1šh 2šh. 1šj 2šj. 1šk 2šk. š1l 2š1lj 1šm 2šm. š1n 2š1nj 1šp 2šp. 1šr 2šr. 1šs 2šs. 1šš 2šš. 1št 2št. 1šv 2šv. 1šz 2šz. 1šž 2šž. t1b t1c t1č t1ć t1d t1dž t1đ t1f t1g t1h 1tj 2tj. t1k 1tl 2tl. 2t1lj t1m t1n t1nj t1p 1tr 2tr. t1s t1š t1t 1tv 2tv. t1z t1ž v1b v1c v1č v1ć v1d v1dž v1đ v1f v1g v1h v1j 1v2je vj. v1k v1l 2v1lj v1m v1n v1nj v1p 1vr v1s v1š v1t v1v v1z v1ž z1b 1zc 2zc. 1zč 2zč. 1zć 2zć. z1d 1zdž 2zdž. 1zđ 2zđ. 1zf 2zf. z1g 1zh 2zh. 1zj 2zj. 1zk 2zk. z1l 2z1lj z1m z1n 1znj 2znj. 1zp 2zp. z1r z1s 1zš 2zš. 1zt 2zt. 1zv 2zv. 1zz 2zz. 1zž 2zž. ž1b 2žb. 1žc 2žc. 1žč 2žč. 1žć 2žć. 1žd 2žd. 1ždž 2ždž. 1žđ 2žđ. 1žf 2žf. 1žg 2žg. 1žh 2žh. ž1j 1žk 2žk. 1žl 2žl. ž1lj 1žm 2žm. ž1n 2žn. 2ž1nj 1žp 2žp. 1žr 2žr. 1žs 2žs. 1žš 2žš. 1žt 2žt. 1žv 2žv. 1žz 2žz. 1žž 2žž. 2d1vj 2d1vr z1g2nj ć1s2t d1s2m j1z2g r2n1t r2z1n m2p1t 2d1vl r2t1c r2n1c r2č1k 2s1hr z1v2l 2z1vr r2k1n r2c1n r2h1nj s2p1n j1s2l r2d1n .zg2 r2dž1b 2š1tv r2t1s n2t1s 2s1kr r2n1k d1š2k d1s2p r2t1m 1r2je k2s1p t1s2t l2m1s r2h1k j1s2t s1v2l r2p1c t1k2l s1k2l n2t1n 2d1ja 2rt. z1r2j d1s2t n2k1c r2t1k r2g1n r2h1t .na2j1 .be2z1 .iz1 .is1 .ne2o3 r2t1n r2v1n r1s2t n2s1t l2f1t",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=1475,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-hr.rme b/Master/texmf-dist/tex/context/patterns/lang-hr.rme
index 31dd3308abb..470a82b71f3 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-hr.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-hr.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Croatian Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -67,4 +71,4 @@
% Date of the last change: 19.03.1996.
%
% Marinović Igor
-% migor@student.math.hr \ No newline at end of file
+% migor@student.math.hr
diff --git a/Master/texmf-dist/tex/context/patterns/lang-hu.lua b/Master/texmf-dist/tex/context/patterns/lang-hu.lua
new file mode 100644
index 00000000000..209c4969829
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-hu.lua
@@ -0,0 +1,32 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="hu",
+ ["source"]="hyph-hu",
+ ["texcomment"]="% Hungarian Hyphenation Patterns (v20031107)\
+% \
+% (more info about the licence to be added later)\
+% \
+% Huhyphn - hungarian hyphenation patterns v20081106\
+%\
+% Copyright (C) 2003-2008, Bence Nagy <nagybence@tipogral.hu>\
+% This file can be distributed under the terms of the\
+% GNU General Public License version 2.\
+% \
+% Encoding: UTF8\
+%\
+% \\message{Huhyphn - hungarian hyphenation patterns v20081106}\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyzáäéíóöúüőű",
+ ["data"]=".a2 .adatát1a2 .ada2t1e2 .adás1s .adá2s3z .ad1yé. .ad1yi .ag1os .ag2ra .agyag1g .agy1á2ram .agy1árt .agy1e2 .agyo2 .agyon1 .agy1ó2 .agy1ű2 .akác1c .aká2cs .ak2h .ako2 .ak2t1ér. .ak2t1orr .ak2t1ő2 .aku1p2 .ala2g1 .alak1a2 .ala2k1ö2 .ala2k1ő2 .ala2pa .ala2p1á .al1eg .al1is .al2járn .alje2 .al2j1el .aljel1ö2 .alo2m1 .al1os .al2t1a2k .al2t1erj .al2tén .al2térn .al2tért .al2tin .am1ak .ango2l1ó2 .an1th .anti1s .apa1p2 .apá2ly1á2z .ara2ny1e2 .ara2sze .ar1á2c .ar2cal .arc3c .ar2c1e2 .ar2cél .ar2c3há .ar2c3hoz .ar2cin .ar2cio .ar2col .ar2cö .ar2c3s .ar1kh .at2h .az1a2 .az1ám .aze2 .az1ó2 .á2 .ács1ék .ág1árn .ág1árt .ág1ó2 .ágy1ala .ágy1asz .ágy1árt .ágy1á2z .ál1a2 .ál1é .ál1i2 .áligaz1 .ál2l1alj .ál2l1alt .ál2lin .ál1o2k .ál1ú .ár1aj .ár1aktá .ár1a2l .ára2m1e .ár1a2p .ára2sz .ár1aszó .ár1ác .ár1ál .ár1á2z .ár1d2 .áre2 .ár1em .áré2 .ár1ir .ár2nyel .ár1ol .ár1om .ár1os .árrés1s .ár1s2 .ár1t2r .ász1ál .ász1árb .ász1á2ré .ász1á2ri .ász1á2ro .át1a2d .át1a2k .át1alt .át1a2n .át1ar .át1a2s .át1av .át1á2 .át1e2 .át1é2 .át1i2 .át1ol .át1o2r .át1o2s .átó2 .át1óh .át1óv .át1ö2 .át1u .át1ü2 .át1ű .b2 .ba2b1a2rá .ba2bál .ba2b1e2 .ba2bol .ba2j1á2rat .ba2j1e .bak1aszt .ba2kál .ba2k1á2ro .baké2 .ba2k1ö2 .ba2kur .ba2l1e2g .ba1ts .ba2u .bá2l1ó2 .bár1a .bá1th .be2at. .be1d2 .bei2 .be1kr .be1str .be1szk .beté2t1e2l .be1tr .bér2c3sí .bé2r1o .bi2ke .bi2os .bi2ot .bita2 .bi2tag .bi2t1á2 .bi2tel .bi2t1er .bi2t1orr .bi2tur .bo2g1ó2 .bol2ta .bo2ly1ó2 .bo2nav .bo2raj .bo2ran .bo2ras .bo2rat .bo2rác .bo2rál .bo2r1odv .bor2sét .bort2 .bo2tá .bra2i .bu2sz1e .c2 .cen2t1á .cen2t1ó2 .ce2t1e2l .ce2t1ű .cé2l1e2 .ci2n1á2 .cito1 .cs2 .csa2k1 .csa2p1á2g .csa2t1é2 .cse2l1ő2r .d2 .dac1c .da2c3s .da2i .dal1an .da2lás .da2l1e2 .da2l1ék .da2lén .da2l1í2 .da3lol .da2l1ó2 .dan1n .da2u .den2g1 .dé2la .dére2 .dé2res .dé2sa .di2afo .di2aka .di2al .di2csá .di2ómá .dó2mor .dú2ra .e2 .eb1eg .eb1ir .eb1í .eb1u2 .eg2é .egres1s .egy1a2 .egy1á2 .egy1e2lőr .egy1ev .egy1in .egy1ö2 .egy1ü2l .el1a2k .el1an .el1ap .ela2s .el1ass .el1aszn .el1aszo .el1aszv .el1á2 .el1e2c .el1eger .ele2gyá .el1e2h .el1ejt .el1e2l .ele2ma .ele2má .ele2meg .ele2mel .el1emele .el1emels .el1emelt .el1e2més .el1e2n .el1e2p .el1e2r .el1e2se .el1e2sés .el1esh .el1e2si .el1esn .el1e2ső .el1ess .el1este .el1estél .el1estü .el1e2sü .el1esv .el1e2sz .el1e2t .el1e2vet .el1e2vez .el1evi .elé2d .el1éde .el1é2gek .el1éh .el1ékez .el1é2le .elé2n .el1éne .el1é2p .el1é2r .el1é2tet. .el1é2v .el1id .el1ig .el1i2h .el1ik .el1i2mit .el1in .el1ir .el1i2s .eli2t1o .el1itta. .el1itták .el1izz .el1í .ellege2 .elo2 .el1okk .el1oko .el1or .el1ó2 .elö2 .el1ök .el1öle .el1ölé .el1ölh .el1öli .el1ölj. .el1ölje .el1öljé .el1öljü .el1ölne .el1ölné. .el1ölném .el1ölni .el1ölő .el1ölt. .el1ölte .el1ölté .el1öltn .el1öltü .el1ölün .el1ölv .el1öv .előé2 .el1s2 .el1t2 .el1u .elü2 .el1ül. .el1ülh .el1üli .el1ülj .el1üln .el1ülte .el1ülv .el2v1el .el2v1ég. .es1er .ese2tel .es2t1a .es2t1á .es2t1é2ke. .es2t1é2kek .et2h .etilén1g2 .evés1s .ex1el .ez1á .ez1e2l .é2 .édes3s .ég1a2 .ég1eg .ég1e2rei .ége2s .ég1esz .ég1ér. .ég1é2ré .ég1érn .égés3s .égé2sz .ég1észb .ég1észe .ég1észé .ég1észn .ég1észr .ég1ö2 .ég1u2 .éh1év .éj1a2 .éj1á2 .éj1el .éj1u .ék1a2 .ék1á .ékes1s .ék1ir .ék1o .él1a2 .él2c1i .éli2k .él1ike .él2v1á2 .ép1es .ép2pa .ép2p1el .ép2pé .ép2po .ér1a2n .ér2c1e2l .ér2c1é2j .ér2cék .ér2c3sí .ér1e2l .ér1e2s .éré2sz .ér1észé .ér1é2t .érü2 .ér1ül .ér2vad .ér2val .ér2v1ég. .ész1a2l .ész1á .észe2 .ész1el .ész1em .ész1es .ész1é2k .észigaz1 .ész1o .ész1ő2 .ész2t1örv .észü2 .ész1ülő .év1á2g .év1essz .év1é2g .év1é2k .f2 .fa2it. .fa2leg .fa2n1év .fa2r1ont .fas2 .fa1st .fat2 .fa1tr .fe2leme .fe2l1essz .fe2lev .fé2k1e2l .fé2m1a2 .fé2m1á2 .fil2méré .fin2ge .fogó2s3zá .fol2t1a2 .fö2lő .fö2lül. .fölül1e2 .g2 .ga2zan .gát1al .gá2te .gá2z1ó2 .gázs2 .gá2zsu .gáz1z .gene2a .ge2od .ge2os .gesz2t1í .gé2d1 .gé2na .gé2ná .gén3n .gé2pe2lem .gé2p1i2p .giga1s .gonor1 .gonorr2 .gó2ce .gó2la .gó2lá .gó2lel .gó2l1e2s .góli2g .gó2l1iga .gó2lis .gő2z1á2 .gő2zen .gő2z1ő .gő2zs .gu2i .h2 .ha2b1e2 .ha2b1ol .ha2bor .ha2b1ő .ha2b1u .ha2dal .ha2d1e2 .ha2dz .ha2ik .ha2j1e2 .ha2jom .ha2lác .halá2l1ó2 .ha2lárv .ha2leg .ha2l1el .ha2lep .ha2let .ha2l1e2v .ha2lis .han2gad .han2g1e .ha2sor .has3sz .ha2tag .ha2t1at .ha2t1e2 .ha2told .há2m1a .há2ny1in .háro2m1e .há2t1alj .há2tus .há2zol .há2zó .he2i .hé2t1ez .hé2t1o .hit1a .hi2tis .hodás1 .hol1l .hol2t1e .ho2ne .hő2sá .i2 .ike2r1i .ikerü2 .ike2r1ülé .ikon1s .ima1s .im1p2la .in1aktí .in2gin .inte2r1a .io2n1a2 .io2n1á .io2ne .ion3n .ipa2re .izo2m1ért .í2 .íjá2t .íj1áto .ín1e .írá2s1ág .írá2s3z .ív1a2 .ív1á2r .ív1ell .íz1a .íz1in .j2 .jaké2 .ja2kér .ja2kov .járműká2 .já2szá .já2szó .je2gy1a2 .je2gy1á2 .je2l1a .je2leg .je2lev .job2b1ol .jó2dal .jó2s1e2 .jó2t1á .k2 .kale2i .ka2nar .ka2n1e .kapolc1 .ka2rala .ka2ras .ka2r1á2s .kar2c3se .kare2 .ka2rem .ka2rék .ka2ring .ka2rí .ka2ró2ra .ka2r1ó2rák .ka2r1ü .ka1th .ka1tz .kár1a2d .kás2 .kása3l .ke2csó .ke2l1á2 .ke2l1e2g .ke2l1e2ve .kel1ö .ker2ta .ké2nét .ké2p1és .kéta2 .ké2tab .ké2tad .ké2t1ag .ké2taka .ké2tal .ké2tan .ké2tap .ké2tas .ké2tat .ké2tau .ké2t1á2 .ké2t1ele .ké2t1ez .ké2t1o2 .kéze2 .ké2z1el .ké2zem .ké2zs .kéz1z .kiá2 .ki1g2 .ki1krá .kió2 .ki2ság .kiű2 .kla2uz .kle2i .kló2re .ko2rác .ko2rí .ko2sis .kó2d1a2 .kó2r1e .kó2r1é2s .kö2b1öl .kö2d1ő .kö2zis .kö2z1ő .köz1z .kr2 .kun1a .kvar3k. .l2 .lak1a2d .la2kal .la2k1an .la2kép .la2kor .la2kő .lan2t1e .lan2t1ó2 .la2pal .la2p1ác .la2p1á2r .la2p1e2 .la2p1or .la2p1osz .la2pó .lá2b1e2 .lá2bil .lá2bor .lán2c3s .lá2nyan .lá2ny1e2 .lá2p1e .lá2p1il .lá2z1ó2 .lá2z3s .le3dé .le2g1 .le3g2ali .le3g2elés .le3g2esle2g1 .le3g2esle3g2esle2g1 .lege2t .le4géne .leg3g .le3gy .lei2d .leí2ro .leí2ród .leí2ru .le1kl .le1k2r .lemez1z .le1p2ré .le1s2m .le1t2r .leü2 .lé2c3s .lé2g1a2 .lé2g1á .lége2 .lé2g1el .lé2gér .lé2go .lé2gy1á2 .lé2p1a2 .lépü2 .lép1ülé .lé2t1a2 .lé2t1á2 .lé2t1e2l .lé2t1érd .lé2tör .lisz2ta .lisz2t1á2 .lisz2ter .lito1s .lob1e .lobi2 .lo2bin .lo2mag .lo2mal .lo2m1á .lom2b1e2 .lo2me .lo2m1é2t .lon2csi .lófo2g1a2d .lő2cs1ö2v .lőrés3s .ly1o .m2 .ma2e .ma2gal .ma2gar .ma2gál .ma2g1e2 .mag1g .magó2 .ma2gór .ma2in. .ma2r1ác .ma2r1ing .masz2k1or .masz2k1ö .ma1th .ma2uz .má2r1is .me2g1e2 .me2g1é2 .meg1if .mego2 .me2g1ő2 .me2i .mel2lá .me2ny1u2 .me2zá .médi2af .mé2ná .mé2no .mé2sza .mé2szet .mé2szi .mé2szo .mé2zis .mi3rá .mo2lyan .műi2 .mű1kr .mű1s .n2 .na2gya .na2gyá .na2gye .na2gyú .na2pap .na2p1ar .na2pál .na2p1e .na2pés .na2p1o2r .na2pö .ne2ma .ne2meg .ne2m1el .ne2min .ne2ol .ne2szá .net2t1a2 .ne2um .né2gyá .né2pa .né2v1ál .né2vel .no2r1 .nya2k1á2ro .nya2k1e2 .nya2k1ö2 .nyol2c1an .o2 .oda1 .ok1a2d .ok1a2l .okka2 .ola2j1e2 .ola2sz1ó2 .olda2l1út .or2r1aj .or2r1alt .or2ran .or2r1e2 .orré2 .or2r1és .or2v1a2 .or2vá .or2v1é .orvi2 .or2vis .ot1tr .ó2 .ólo2m1a .óme3g2 .ón1a2 .ón1á2 .ón1e2 .ón1év .óvá2s1árt .ö2 .ön1d2 .ön1e2 .öni2 .ön1í .ön1k2 .ön3n .ön1o .ön1ő .ön1s .ön1ü .össz1a .össz1á .öte2 .öt1eg .öt1el .öt1t2 .öv1e2g .öv1e2l .öv1ő2 .ő2 .őa3l .ői3r .őr1ab .őr1an .őr1e2g .őr1é2g .őr1é2s .őr1ist .őr1o .őr2s1ág .őr1u2 .őr1üg .ős1a2 .ős1á2 .ős1eg .ős1e2l .ős1e2r .ős1e2s .ős1é2g .ős1ért .ős1í2 .ős1o .ős1ó2 .ős1p .ős1tr .ős1u2 .ős1ú .ősz1a2 .ősz1á .ősz1e2g .ősz1el .ősz1em .ős3zene .ős3zené .őz1a2 .őz1eg .őz1e2l .őze2t .őz1ete .őz1ék .őz1ére .őz1ő .őz3s .őz1u .p2 .pa2da .pa2d1á2 .pa2din .pa2d1ó2 .pa2i .pa2par .pa2pál .pa2pe .para1f2r .parke2 .par2ker .par2ta .par2tel .par2ter .pá2c3s .pán2ta .pár2t1ö .pen3ny .pe2r1a2 .pe2r1á .pe2r1enc .pe2rok .pe2rül .pe2s .pia2c3s .pina1 .pin2t1ó .ple2i .ponta2 .pon2te .po2rad .po2ral .po2ran .po2rác .po2rál .po2re .po2r1us .pó2kis .pó2k1ö .pó2rás .pó2t1e .pó2t1é .pre1k2 .prés3s .proto1p2 .q2 .r2 .ra2b1as .ra2b1á .ra2be .rabic1 .ra2b1il .ra2b1i2z .ra2bí .ra2bor .ra2bö .ra2b1ő2 .ra2bú .ra2gal .ra2j1ö2 .rajtó2 .raj2t1ór .rá2cs1á2z .rá1dr .rá1fr .rá1gr .rái2 .rán2c1e .rány2 .rá1spr .rá1s2t .rát2 .rá1tk .rá1tr .re1k2re .ren2d1a2 .ren2d1ő2 .re1p2ri .rep2ro .re1prod .rete2k1 .ré2m1emb .ré2mu .ré3p2a .ré2sa .rés3szer .ré2sza .ré2szá2 .ré2sz1e2le .ré2szell .ré2szer .ré2szí .ré2szo .ré2sző .ré2t1a2 .ré2t1á2 .ré2v1á .ré2zá .ré2zel .ré2zet .ré2zis .ré2z1o .réz1z .ri2zso .rizs3z .rí2má .ro1c2kos .romé2 .ro2m1ét .ro2min .ro2mis .ros2t1e2 .rug1g .ru2m1a .ru2mil .rú2de .s2 .sa2h1a .saj2te .sa2s1or .sa2vad .sa2v1ara .sa2v1ál .sa2vári .sa2v1e2 .sa2v1é2 .sá2r1ó .sá2rú .sás1s .sá2s3z .sá2v1a .sá2vá .sá2vó .sc2 .se2bal .se2b1á .se2bel .se2besz .se2b1o .sé2fi .s3gr .si2em .si2ók .sín3n .sí2p1ő2 .sí2r1a2 .sí2rát .sk2 .so2kél .so2kil .so2kis .so2kol .so2m1ag .so2mat .so1ny2 .so2ral .so2rál .sör1e2g .sp2 .spor2t1á2 .st2 .star2t1a2 .sz2 .szaba2d1e .sza2k1at .sza2k1ás .sza2k1e .sza2kö .sza2k1ü .szá2l1ó2 .száz1z .szeg1ér. .sze2gí .sze2i .sze2m1á .sze2m1ér. .sze2m1é2ri .sze2r1ág .szer2v1a2d .szer2v1e2v .sze2szá .sze2szeg .sze2sz1ó2 .szé2fa .szén1n .szé2t1 .széte2 .szín3n .szk2 .szo2l1ó .szókész1 .szó2szak .szószö2 .szó2sz1öv .szt2 .t2 .ta2gal .ta2g1a2r .ta2g1á .ta2g1e .ta2gép .tag1g .ta2g1i2n .ta2gö .ta2nag .ta2n1as .ta2nál .tan1d2 .ta2n1e2 .ta2n1év .tané2ve .ta2nis .tan1n .ta2n1ó2 .tant2 .ta2n1u2s .ta3rá .ta2t1ál .ta2t1árai .ta2t1e2 .ta2t1í .ta2tor .ta2tur .tá2l1ó2 .tán2cse .tá2p1ol .tár2sor .tár2s1ö2 .tár2t1es .tár2t1ölt .tá2v1a .távi2 .tá2v1ir .tbc1 .te2aka .te2ar .te2j1á2 .te2j1eg .terape2 .ter2v1a2 .ter2v1á2 .tes2ték .tes2t1öl .tetraé2 .teza2 .té3k .té2nyem .té2nyí .té2ra .té2rá .té2ret .tér1int .tí2z1ó2 .tí2zs .tízü2 .to2káro .tol2le .topa3u2 .to2r1á2l .to2r1odv .tor2z3se .tó1st .tó2t1ér. .tön2k1a .tőa2 .tőe2 .tő2gya .tő2r1éss .tő2r1é2sz .tra2u .turnus1s .tus3s .tu2sz .tus3zá .tú2r1att .tű2z1ért .tű2z1ő2r .tű2zse .tyú2ka .u2 .ugrás1s .un1in .uni2o .utas1s .utás4 .uto2 .utó2d1ö .ú2 .új1as .új1e .úr1a2 .úr1á2 .úr1e .úszós2 .úszó1sp .út1a2 .út1á2 .út1e2 .út1ol .út1ő .út1ü2 .ü2 .ügy1ér. .ük1a2 .üstö2l .üs2t1ölő .ütőkész1 .üve2g1e2l .ű2 .űr1a2 .űr1á2 .űr1e2 .űr1é2s .űr1éte .űri2 .űr1ita .űr1öss .űr1s .űrt2 .v2 .va2d1al .va2dár .va2dét .va2d1o2r .va2dóv .va2d1ö .va2d3z .va2gy1i .va2j1e .va2k1ak .va2kal .va2k1an .va2kap .va2k1ár .va2k1e2 .va2k1ö .va2rak .va2r1á2s .va2r1e2 .va2r1ing .va2sab .va2sar .va2s1a2tom .va2s1á2g .va2sárk .va2sás .va2s1e .va2sék .va2s1i2r .va2sol .va2s1or .va2só .vas3s .vas1tr .va2s1ü .va2s3z .vács1 .vá2dá .vá2d1e .vá2ma .vár1a2dá .vá2r1i2s .vá2r1ol .verés1s .ver2s1ég .ver2s1o .ver2sz .vé2g1é2k .vé2g1o .vé2nyel .vé2r1a2 .vé2rá .vé2r1eb .vé2r1eg .vé2rik .vé2r1o .vé2ró .vér2t1ék .vé2ru .vé2sza .vé2szá .vé2szer .vé2szí .vé2szo .vé2sz1ó2 .vi1g2n .ví2zed .ví2zem .vona2t1út .von2z1e2 .w2 .x2 .y2 .z2 .za2be .za2b1i2n .zai2 .za2j1e2 .za2j1ö .za2jut .zá2r1a2dá .zá2r1e .zá2r1ó2ra .zárta2n .zár2t1any .zár2t1é .zár2t1ö2v .ze2i .zé2t1 .zs2 .zű2r1ő 2a. a1a aa2be aa2cé aa2ch aa2da aadás1s aa2dássz aa2dó aa2du aa2fo aa2ga aa2gi aa2gó aa2gy aa2já aa2ka aa2ká aa2ko aa2ku a2al. aa2la aala2g1 aa2lá aal1eg aa2lé aalmana2 aalmanac3 aa2lo aal1os aa2lu aa2ma aa2na aa2ne aa2ni aa2no a2ans aa2ny aa2pa aa2pá aa2po aa2pu aa2ra aa2rá aa2ré aa2ri a2arl aa2ro aa2sz aa2to aa2ty aa2ur aa2ut aa2va a2avo aa2zo a1á aá2bé aá2cs aá2fá aá2ga aá2gá aá2gé aá2gi aá2go aá2gu aá2gy aá2hí aá2ju a2ál. aá2la aá2lo aá2po aá2ra aá2rá aá2r1e2 aá2ré aá2ri aá2ro aá2ru aá2rú aá2sa aá2sá aá2so aá2só aá2ta aá2t1á2 aá2t1e2 aá2té aá2t1i2 aá2tí aá2to aá2t1ö aá2tu aá2tú aá2tü aá2zá aá2zó 2abab ab1adó aba2dz 1a2bajg ab1akk 2abal 2aban aba2nal aba1pr 2abar aba2rat a2b1a2ráb a2b1au 2abáb abá2b1u2r 2abád 2abán a2b1áp abá2rak ab1á2ron ab1á2rú 2abáz abb2a 1abbah 2abea abeá2 a2b1e2b 2abec ab1edé 2abeé 2abef 2abeh 2abei 2abej ab1ejt ab1ela ab1e2lá 2abele abe2lem 2abels ab1elsz a2b1elt ab1elv 2abem ab1emb a2b1erd 2abetá 2abete 2abeté 2abeto 2abetö 2abev a2b1ex 2abék 2abél 2abén a2b1é2ne a2b1ép 2abér a2b1érz 2abétá a2b1éve ab1fl ab1fr 2abic ab1i2do 2abie ab1i2ke ab1iks a2b1i2nai abi2náb a2b1ing 2abir ab1irkái ab1ism 2abit a2b1i2ta 2abiz a2b1íj ab1írn ab1kr 1ablaká 1ablakh 1ablakk 1ablakos 1ablakr 2ablo a1b2lú 2abog 2aboh 2abok 2abolt ab1oltó 2abom abo2rak abo2r1as abo2rin 2abot a2b1öb abö2l ab1ölő ab1ölt a2b1ös a2b1öt a2b1ö2z ab1őrl ab1pr ab2rek 2abri a1b2rike ab2rin a1b2rit 2abró ab2rók ab1st a2b1urd ab1úr. ab1úrt abú2s1á ab1úsz ab1ü2l ab1üs ab1üv a2b1üz aca2la aca2lá aca2l1e2 aca2lét a2c1a2n aca2tá a2c1ág a2c1ál acci2ó ac2cö ac3cse ac3csí ac3csü acc3sz a2ce. ac1ebé a2c1eg ace2l a2c1ele a2c1elé a2c1elh ac1elle a2c1elm a2c1elo a2c1elv ac1emb 2acen ace2ta a2c1e2v a2c1ex a2célá acél1e2 a2célé a2c1ép a2c1é2re a2c1érte ac1fr a2chá ac3héj ac3hí a2c3hoz ac3hó a2c3hö a2c3hú ac1ide a2c1i2gá a2c1i2gé a2c1ike 2acin. a2c1ind ac1inf a2c1ist a2c1ír ac1ív ack1aro ac2kál ac2k1e2v acké2r ac2k1ére ack1éte ac2kil ac2k1osz ac2kös ac2kű ac2lu a2c1op ac1ös ac1őr ac1pl ac1pr 2acsal acs1alj. acsa2p1á2g a2cs1atk acs1áll a2csáru acse2c acs1egy ac3seml 1a2cséb a2cs1ék 2acsi 2acsí 2acson acs1orm a2cs1öc acs1s ac3str a2csúl a2cs1úr acsü2l a2csüt ac3szá ac3sze ac3szö ac1tr a2c1ud 2acula a2c1ut ac1új ac1üg ac1ür ac1üz ac3za ac3zá ac3ze ac3zs ac3zu a2d1a2da a2d1a2dá 1a2dag. ada2gá 1a2dagb a2dagg 1a2dagh 1adagi 1a2dagj 1a2dagn 1a2dago 1a2dagr 1a2dagt 1adagu 1a2dagú a2d1aktá ada2lap ada2l1es 1adalé ada2lén ada2l1osz ada2l1ó2 ada2l1út a2d1ana a2d1ann 1adapt 2adar ada2ral ada2re ada2r1és ada2r1in ada2rut ada2tab ada2tal ada2t1a2n ada2t1ár. ada2t1á2rak ada2t1á2ram ada2t1á2rat ada2t1á2rá ada2t1árb ada2t1árr ada2t1á2ru 1a2datáu ada2t1e2g ada2tel ada2t1es adaté2r ada2t1érd ada2t1érő 1a2datin ada2tint ada2tis ada2tív a2datm ada2t1old ada2t1öl ada2t1ő a2datv ad1azo a2d1ág adára2 adá2rak adá2ris ad2del ade2g ad1ege ad1egé ad1egy ade2i a2d1ej adel1ej ad1elh ad1elm ad1eln a2d1e2lő ad1elr ad1elt a2d1emb ad1e2mé a2d1eml a2d1emu ad1eng ad1e2pe ad1epr a2derd ad1erő ade2ti a2deu a2d1e2v a2d1ex adé2kat adé2k1e2 adé2kés adé2kis adé2kü adé2kű ad1éle 2adémont a2d1ép a2d1érz adé2s adé2te a2d1é2ve ad1fl adfo2k1út ad1gr 1adhé 2adia adia2n ad1i2bo 2adid adi2kut 2adin ad1i2na. ad1i2nai ad1ind a2d1ing adi2o1g2ra 2adip 2adis 2adiv a2d1í2z ad2ji adka2na ad1kr 2adob 2adoc a2d1okke 2adol ad1ola 1a2domá 2adomb 2adomi 1a2dop a2d1orc a2d1org 2adorh 2adorian 2adorig ad1orv a2d1orz a2d1osz a2dógu 1a2dóku a2dómé a2dórá 1a2dósat 2adósi. ad1ó2vás 1a2dózó a2d1ö2k a2d1ö2l ad1örd a2d1ös adőr1a adő2rel ad1ő2s ad1pl ad1pr a1d2rac ad2ram ad2raz 2adrá ad2rám 2adro ad2rog a1d2rót ad2ruk ad1sp ad1st 2adug 2adum 2adup ad1u2rá ad1úsz adú2t a2d1úto a2d1üg ad1ü2lé a2d1üt ad1üz a2d1űr ad1űz ad1yéh ad1yér ad3zab ad3zav ad3zár ad3zel ad3zón a2d3zö ad3zsí a1e ae2bé ae2ce ae2cs ae2dé ae2dz ae2ge ae2gé ae2gy ae2he ae2ke ae2ké ae2la ae2l1á2 ae2le ael1ej ae3len ael1érh ae2l1í2 ae2lo ae2l1ö2 ae2lő ae2lu ae2me ae2mé ae2mi ae2mu ae2ne ae2pe ae2pé ae2pi ae2po ae2red ae2ré aero1s ae2ró ae2rő ae2se aes1er ae2sé ae2si ae2ső ae2sü ae2sz ae2ta ae2tá ae2te ae2ti ae2tű ae2va ae2ve ae2vé ae2vi ae2vo ae2vő ae2xe ae2zü a1é aé2derv aé2ge aé2gé aé2gő aé2he aé2je aé2ke aé2kí aé2le aé2lé aé2li aé2lő aé2lü aé2lű aé2ne aé2pí aé2pü aérde2m1 aé2ri aé2te aé2va aé2ve aé2vé aé2vi aé2vü 2afa. 2afaj. 2afaja 2afajá 2afajb 2afa2j1e2 2afajj 2afajn 2afajo 2afajt. 2afaju 2afajz 2afak 2afal 2afam 2afao 2afar 2afas afe2l1e2m 2afék 2aféli 2afélő 2afélt 2afén 2afér 2afés 1affé afi2ap afi2asz afi2ke afi2t1a2 afi2t1e2 af2le a1f2lo a1f2ló a1f2lö a1f2lu 2afoc 2afog 2afok 2afol 2afon 2aford 2aforg 2aformác 2aformál 2aformátu 2aformáz 2aformu 2aforr 2afos 2afot af2rak 2a1f2re af2riz af2rí 2afro af2ron 2a1f2rö af3tá afus3s a2g1abl ag1abr ag1a2cé ag1aga a2g1a2ka a2g1akk a2g1akt 2agal a2g1a2lak a2g1a2lap a2g1a2lá a2g1alj a2g1alm aga2lom a2g1alt ag1ang ag1a2no ag1ant a2gany a2gap ag1apa ag1apá a2g1arc a2g1aré a2g1a2ro a2g1art aga2tom ag1a2tó a2g1a2ur ag1aut a2g1ava 2agaz ag1a2zon agá2c a2g1ács. a2g1ácsi ag1á2ga 1a2gák a3gála a2g1álm agá2lyan a2g1áp a2gár. a2g1árad a2g1á2rai a2g1á2rak a2g1áras a2g1árat a2gá2rá a2gárb a2g1árc a2gáre a2gáré agá2rév a2gárf a2gárh a2gá2ri a2gárj a2gárk a2gárm a2gárn ag1árná a2gáro a2gárr a2gárs a2gárt a2g1á2ru a2g1á2rú ag1ásv a2g1átá a2g1á2t1e2 ag1átfe a2g1áth a2g1átk a2g1átm agá2tol a2g1áts ag1átü a2g1átv ag1bl ag2del agdí2j1a2da a2ge. ag1e2cs a2g1e2d a2g1e2g age2l a2g1ela ag1elb ag1eld ag1ele ag1elé ag1elf ag1elh ag1eli ag1elm ag1eln a2g1elo a2g1elő ag1elr ag1els ag1elt ag1elű ag1elv ag1elz a2g1e2m ag1eng a2g1eny a2g1e2p a2g1erd age2red a2g1erk a2g1erő age2s a2g1e2v a2g1ex a2g1ez a2g1é2j a2g1ék. a2g1ékn a2g1é2l agé2né agé2p1i2p a2g1é2pül a2g1ér. a2g1é2re a2g1é2ré a2g1érh a2g1é2ri a2g1érk ag1érl ag1érm ag1érte ag1érté ag1érth a2g1értő ag1ész a2g1éte a2g1éve ag1fl ag1fr 1agg. ag2g1a2ty ag2g1em ag2git 1aggl 1aggod 1aggok ag3gyar ag3gye ag3gyi ag3gyo ag3gyü agi3a ag1ide a2g1i2ga a2g1ige a2g1igé ag1ike a2gill ag1inf a2g1ing a2g1int a2g1i2oni agi2ó a2g1ip ag1iro a2g1ist agi2sz a2gita ag1izé ag1izm a2g1íj ag1ín a2g1ír ag1ív a2g1íz agká2rok ag1kl ag1kr ag2ne. a1g2non a2g1ob ag1oltó ago2ly1a2 2agom 2agona agon3n ago2n1osz a2g1op a2g1org ag1orj a2g1orn a2g1orr a2g1ors a2g1orv a2g1otth agó2rái a2g1ö2l ag1önk ag1önt a2g1örö ag1örv a2g1ös a2g1öt a2g1ö2v a2g1ö2z a2g1őr a2g1ő2s ag1pl ag1pr 2agrammj a1g2rav 2agrá a1g2róf ag1sk ag1sp ag1sr ag1st agsz2 ag1szt ag1tr a2g1und a2guram agu2rat ag1u2rá ag1urn ag1u2tá a2g1új ag1úta a2g1úti ag1útt a2g1ü2l a2g1ür a2g1üs a2g1üt a2g1üv a2g1üz ag1űr ag1űz a2gy1a2c a2gyad agy1a2dó agy1a2gya a2gyaj 1a2gyak. a2gyakb agya2la agy1alap agy1alg a2gyalj agy1alko agy1alm 1a2gyam agy1ana a2gy1any a2gy1apa agy1apja agy1apjá a2gy1a2pó a2gy1apr agya2sz a2gy1aszó a2gyál agy1árv a2gy1e2c agy1e2g a2gy1el agy1em agy1est agy1esz a2gyev a2gy1ez agy1ék. agy1éke agy1ékk agy1ér. a2gy1é2re agy1érn agy1érr agy1érs a2gyima agy2nyá agyo2r a2gy1oro a2gyorr a2gy1ö2l a2gy1ő2r agyu2r agy1urá 1a2gyú. 1a2gyúa a2gyún agy1úr. agy1ú2sz a2gyút 2agyű aha2l1e aha2sábr ahelyü2kü ahert2 aher1tze ahé2j1út ahitköz1 ah1o2vi ahú2sár ahús3s a1i ai2bo 2ai2de ai2dom 2ai2dő a2iék ai2ga ai2gá ai2ge ai2gé ai2gy ai2ia ai2ib ai2ih ai2ij ai2in ai2ir ai2it ai2je aika2 ai2kab ai2k1ad ai2k1al ai2k1ar ai2k1as ai2k1á ai2ke2 aik1el aiki2 ai2kik ai2kis ai2k1ol ai2k1osz ai2kő ai2kü a2ilb a2ile 2aill ail2le. ail2lo ai2ma. 2ai2má 2aimi ai2mit 2aimp ai2na. ai2na2l ain1ala 2ai2nas ainá2 ai2n1álo ai2nár 2aind ai2ne ai2nél 2ainf 2aing ai2n1in ai2nol 2ainp 2ains 2aint ai2nü ai2onb ai2onn ai2ono ai2onr ai2ont ai2pa a2ir. ai2ram 2ai2rat 2ai2rá ai2re. ai2ré ai2ri 2airo ai2rod a2i2se ai2si 2aisk 2aism 2aist 2aisz ai2sza ai2szo 2ai2ta ai2vad ai2var ai2vás 2ai2vó ai2zé ai2zom a1í aí2gé aí2ja aí2já aí2ju aí2ra aí2rá aí2ro aí2ró aí2ru aí2té aí2vá aí2ve aí2vé aí2vi aí2vó aí2vü aí2vű aí2ze aí2zé aí2zü aí2zű a2j1a2dó a2j1adu aj1aga aj1agr aja2kol a2j1akó aja2kú a2j1ana a2j1ant a2j1any aj1apr a2j1áa ajá2c aj1á2go 1a2jánd 1ajánl a2j1áp 2ajár a2j1árb a2j1árc a2j1áre a2j1áré a2j1árr aj1ásá aj1ásv a2j1á2t1e2 ajá2z aj1ázá aj1bl aj1br aj2d1alm aj2d1a2lom. aj2d1a2lomm aj2d1a2lomn aj2d1a2lomr aj2d1a2lomt a2j1e2c a2j1ef a2j1egé a2j1ela aje2leme a2j1elf aj1ellá a2j1elo aj1elő aj1elvá aj1elvo a2j1e2m aj1ene aj1enz a2j1e2r aj1e2se a2j1ex a2j1ez a2j1ége a2j1égé aj1égő a2j1é2k a2j1él a2j1ép ajé2r a2j1ére a2j1éte aj1fl aj1fr aj1g2r a2j1i2d a2j1ij a2j1ik a2j1im a2j1int a2j1io a2j1ip a2j1iz aj1ír aj1íz aj1kl 1ajkú. ajobb1o ajo2g1á2sza a2j1ola aj1old a2j1o2v a2j1ócskás ajó2sár aj1öb a2j1ök a2j1ör a2j1öz aj1őr aj1ő2s aj1pl aj1pr aj1sh aj1sk aj1sp aj2tág aj2teg aj2t1é2t ajt1org aju2hi a2j1új aj1úsz a2j1úto a2j1útr aj1üg aj1ül aj1üs aj1üz aj1űz ajz1aka ajz1atl aj2zer aj2zí aj2zü 2akab aka2cse a2kadag a2k1a2data a2k1a2datb a2k1a2datn a2k1a2dato a2k1a2datr a2k1a2datt 1akadál 1a2kadém a2k1adm a2k1aga 2akal ak1a2lag a2k1a2lak aka2lapú a2k1aleg ak1alko 2akam 2akan 2akao 2akap aka2pád ak1app ak1a2rai ak1arasz a2k1a2ráb a2k1a2rák 2akarc a2karch 2akard ak1a2rén 2akari 2akarr 2akasí 2akast aka2szaj ak1a2szat aka2szel aka2szö a2k1asztr 2akata aka2tab 2akate aka2tel aka2ter akati2 aka2tik aka2tim aka2tin 2akau a2k1autó 2akav 2akaz 1akác. a2k1áf a2k1ág aká2l1a aká2lis a2k1álló ak1árad a2k1árb a2k1árj a2kárk aká2rokn a2k1ártó a2k1á2ru aká2sad aká2saj aká2sal aká2sar aká2sav aká2sást akás3s ak1á2szán aká2szu a2k1ászun akát1a a2k1átla ak1bl akció2s1ű2 a2ke. ake2cs a2k1e2dz ak1e2ge ak1e2gé a2k1ela a2k1elá ake2lem ak1elh a2k1elj a2k1elo ake2lők a2k1elr a2k1elv a2k1emb ak1e2mel a2kerd ak1e2rei a2k1e2ró a2k1e2rő a2kesp a2k1est ak1eszk ak1eszm a2k1e2te ak1e2ti a2k1e2vez ak1é2kem ak1é2kes a2k1é2ké a2k1ékh ak1ékrő 2akém 2akény 2akép. 2aképb 2aképe 2aképé 2aképh 2aképk 2aképl 2aképn 2aképpel 2aképpé 2aképr 2aképt 2aképü 2aképz a2k1érc 2akérd a2kérdek 2akére 2akéré a2k1érm 2akérő a2k1é2rői a2k1é2rőj a2k1érr a2kérteke a2k1értel a2k1értet a2k1értő 2akérv a2k1érz 2akés a2k1észa a2k1é2te 2akéts a2k1étt 2akéz ak1fl ak1fr akgerinc1 ak1gr 2akia 2akib 2akic 2akid a2k1i2dé ak1idi 2akie2 2akié 2akif ak1iga a2k1igé 2akigy 2akih 2akií 2akij 2akil a2k1ill ak1ily 2akim a2k1i2má a2k1imi 2akin ak1ind a2k1ing a2k1ins a2k1ion 2akir aki2rom 2akis a2k1isi a2k1isk ak1ism a2k1ist 2akit 2akiv 2akiz a2k1izm a2kíté a2k1í2z ak2k1a2d ak2kaj ak2k1a2la akk1alk ak2k1arc ak2kál ak2k1á2p ak2k1ed akk1ell ak2kelm akk1elt ak2kem ak2k1eró akke2s akk1ese ak2ket ak2kola 1akkord akk1ölt ak2k1ös ak2kőr 1akku. 1akkum ak2lau ak2lav ak2lor ak2lón ak2lór 1aknai 1aknáb 1aknáh 1aknái 1aknáka 1aknáko 1aknás 1aknát. 1aknáv 1aknáz 2akoa ak1obj 2akoc 2akof 2akokt akolás3s a2k1olda a2k1o2ly 2akom 2akonc 2akond 2akonf 2akong 2akonk 2akons 2akont 2akonv 2akony 2akonz 2akoo 2akop a2k1o2pe ak1o2rat 2akorb 2akord a2k1org 2akori a2k1orj 2akorl 2akorm 2akoro 2akorp 2akorr 2akors 2akort 2akoru 2akorú a2k1orv 2akos 2akóni 2akó1p2 a2k1ó2rá ak1ó2ród 1a2kózá ak1össz akö2z1é2l aközrea3 ak1őr. ak1ős. ak1pl ak1pr ak1ps akrádi2 ak2rát 2akre ak2rea 2akré a1k2réme ak2réta ak2rétá 2akri a1k2rit 2akrí ak2ríz 1akrob 2akrónik ak1sp ak1sz2t ak2t1au aktár2s1a2d akt1emb 1akti. ak2tim 1aktívb aktí2ve ak2t1íve. 1aktívk 1aktívo 1aktívs 1aktívt akto2r1ál akt1osz ak1trá 1aktua 1aktú. a2k1udv a2k1ujj 2akun 1akupu a2k1úg a2k1új a2k1úrr a2k1üg a2k1ü2le a2k1ü2lé a2k1üln a2k1ü2t a2k1ü2v ak1ya a2l1abl alac1c alace2 alaci2 ala2cit ala2cor a2lacsé ala2c3sö ala2csü a2ladag a2l1a2datá ala2gál ala2g1e ala2gép ala2gol ala2gya ala2j1a2d ala2jas ala2j1e2 a2lakad ala2k1an a2l1a2kas ala2kál ala2k1áp ala2kes 1a2lakí a2l1akna. a2laknák a2laknát ala2kol a2l1a2kód ala2k1öl a2l1aktu 1alaku a2lakul. a2lakult al1alg a2l1alj a2l1alk al1all al1alm al1a2lo al1alt ala2n1e 1a2lanny a2lany ala2nyal ala2ny1e2 ala2p1a2d ala2pak ala2pal a2lapan ala2p1á2r ala2p1e2 ala2pill ala2pin ala2pir 1a2lapítv ala2p1ol ala2por ala2p1osz alap1ó2 alap1p al1a2ra al1a2rá al1arg ala1s2p a2l1aszp alaszta2l alat1any alatát1a2 ala2t1e2v ala2t1inf ala2tív ala2t1ol alató2 ala2tór a2l1attak 1a2latti ala2t1ü2 al1ava ala2zúr 1a2láa 1a2láá alába2d alá2b1ada al1ábrá 1a2lábúj alá2dal alá2d1ap 1a2láf a2l1ág. a2lága al1á2gá al1ágb a2l1ágg al1ágh al1á2gi al1ágk al1ágn al1á2go a2l1ágr al1ágt al1á2gú al1ágya 1a2láí 1a2lámo a2l1árad a2lárak a2lárá alá2rár a2l1árk aláste2 alás2tel alás2t1ér. a2l1átd a2láte a2láté al1átép a2l1átf alá2ti a2l1átl a2l1átm a2látö a2látr a2látú al1bl al1br 1album al1d2r a2le. 2alea 2aleb al1ebé 2alec al1ece ale2g1e2lé al1egés alegész1 al1egys a2legyü 2aleh 2aleí2 2alej ale2k1a a2l1ela a2l1elág a2l1eld al1e2led ale2lem. ale2lemb ale2leme ale2lemk ale2lemm ale2lemt a2l1elg a2l1elh al1elm a2l1eln ale2lők ale2lőt a2l1elr a2l1els al1elté a2l1elv 2alem a2l1emb a2l1e2mel al1e2mé a2l1eml 2alen a2l1ene 2alep ale2pe. a2lerd a2l1e2re a2l1erk a2l1ern 2ales al1esem a2lesi ale2sik ale2tet alet2t1est aleü2 2alev ale2vol ale2vői 2alex a2l1exp 2aléc 2alég al1égő alé2kal alé2k1an alé2kat alé2k1em alé2ker alé2kes alé2kor a2lél. al1é2len a2l1é2let a2l1élé a2l1éll al1é2lő a2l1élü 2alén a2léneke a2l1érd al1érs a2l1érte a2l1érté a2l1értő a2l1érz 2alét alé2tek a2l1é2tel al1étl a2l1évi 1alfás 1algásat 1algor al1gr 2alic al1ide a2lidé al1i2do al1ifj a2l1igé 2alik al1ill 2alim a2l1i2má a2linas ali2nin alió2ra al1i2pa a2l1irá a2l1iro a2l1i2si a2lism ali1s2po al1iste 2alite al1izma al1íj a2l1í2v alja2iké 1aljaka 1aljakb 1aljaké 1aljakk 1aljako 1aljas 1aljái alj1árna al2j1á2ro 1aljb 1aljc 1aljd 1aljer 1aljf 1aljg 1aljh 1aljia al2jí 1aljj 1aljk 1aljl 1aljm 1aljn 1aljr 1aljs 1aljt 1aljú 1al2jü 1aljv 1aljz al2k1a2pó alkele2 1alkím 1alkoh 1alkotá 1alkotm 1alkotó al1kre al1kro 1alku. 1alkud 1alkun al2l1aj al2l1akt al2l1akv alla2l al2l1ala al2lalk al2lau all1áll all1ázs al2led all1egy all1emb 1allerg all1ese all1est all1e2vő all1é2jé al2l1id al2lim all1int al2lip al2l1isk al2lí all1óri al2lös al2l1ő2 al2lü 1allű 1almád 2alob al1obe alogos1s alo2g1ó2 a2l1okta al2old. aloma2 alo2mad alo2mak alo2m1al alo2m1an alo2map alo2mar alo2mas alo2mác alo2már alo2m1át alo2mer alo2min alo2mis alo2mit alom1p2 alo2m1ú alo2n1á alon1d2 alon3n 2alop al1opc a2l1ope al1o2ra al1orc al1orn al1o2ro a2l1orr alos3s a2l1ostá a2l1oszl 2alov aló2c3se 3alóguses alóigaz1 alói2ko al1ó2lo al1ónn alóó2 aló2ráj aló2rák aló2zan aló2zis a2l1öb a2l1ö2l a2l1ön a2l1ör a2l1ös a2l1ö2z alpe2l alp1ele al2piz al1sh al1sk al1sl al1sm al1sp alsz2 al1szt al2tada al2t1alap alt1anya alt1elv alt1emb al2t1e2p al2t1e2v al2t1é2k alté2n alt1éne alt1érne al2t1é2rő al2t1érr alt1értő al2t1i2m alti2n alt1ina alti2p alt1ipa al2t1ir al2t1old 1altonk al2t1osz al2tóc al2tön al1trak al1tran al1trav al2tur al2t1út al2tür 1altvé al1ty alu1p 1a2luss alu1str a2l1új al1úr. al1úrb al1úrh al1úri al1úrk al1úrn al1úrr a2l1úté a2l1úth a2l1útj a2l1útn a2l1útt al1üg al1ül al1ün al1ür al1üs al1üt al1üv a2l1üz al1űr al1űz 1alveo 1alvó a2ly1ap a2lyar a2lyál a2ly1e2 a2lyév a2ly1id a2lyim a2lyis a2lyö a2lyug a2ly1ü2 am1abb am1abl 2amad a2m1a2dat am1a2dás a2m1adm a2m1a2dó a2m1a2du 2amag ama2gát 2amaj am1ajt ama2kar a2m1akt a2m1akv a2m1a2lak am1a2lap a2m1a2l1e ama2nya amaó2 2amap 2amas ama2sz1a2k ama2szeg ama2sz1em ama2szél ama2szö ama2tad amata2n ama2tárá ama2tel ama2told ama2t1osz ama2t1ó2 a2m1a2u a2mazo a2m1álm a2m1á2rai a2m1á2rak amá2rá amát1a2dó. a2m1átk a2m1átl a2m1átt am2b1ag am2bal am2b1at am2b1ászá am2b1e2g am2b1e2le am2bep am2b1e2te am2b1ér. 1ambula am1dr a2me. am1e2ce 2ameg am1elá am1e2lem a2m1e2l1i am1elj am1elk a2m1eln a2m1elo a2m1e2lő a2m1els a2m1elt a2m1elv a2m1e2me a2m1eng 2amenn amens1s amen2t1á2ro a2m1erd a2m1e2rő a2mesk 2amest a2m1e2v a2m1ex am1ezr amé2hes amé2k am1éké amé2let a2m1ép a2m1érd a2m1értek a2mértel a2m1étk a2m1évé 1amforá am1fr am1gr amid1i2 ami2g a2m1iga a2m1igá a2m1igé a2mimá am1imi am1imp ami2na. ami2nan ami2nin a2m1inté amió2 a2m1irá a2m1iro amise2 ami2sel ami2sep ami2sz 1amitbo 1a2mitha 1a2mitm 1a2mitö 1amitro 1amitrú 1a2mits 1a2mittá 1a2mittö a2míg am1kl am1kr amme2g am2m1egy am2meta am2m1é2t 2amod a2m1oke a2m1okm a2m1o2koz am1ola a2m1old a2m1oltá a2m1op a2m1ors 1a2mort a2m1orv 2amos amos3s 2amot 2amoz am1ó2ri am1ö2r am1ös am1öt am1ö2z am1ő2r am1ős am1pla am1p2r 1amput am1sk am1sp am1sr am1st am1t2r 2amun a2muni amu2riz amu1sl a2m1u2tas a2m1új am1üg am1ü2l am1üt am1üz 2anad a2n1a2dat a2n1adu a2n1aga a2n1agá an1a2gya a2n1ah 2anai 1a2nakr ana2lap 1analí an1alk an1alm 1a2naló an1a2mo a2n1ana 1a2naná an1ann an1a2ny 2anap ana2pa2 an1apa. a2n1apá a2n1a2pó an1appo an1a2rab an1a2rá a2narc ana2sz1e2 ana2szén ana2szin ana2sz1í2 ana2szó ana2szü ana2t1e ana2tö 2anav a2n1a2va a2n1az a2n1ág a2n1álmi a2n1á2lom a2n1á2p a2násat 2anát a2n1áta a2n1átk a2n1átr an1br anca3u an2c1ál ance2 an2ce. an2c1ér. an2c3hit an2cho anci2al an2c1ó2 an2csaj an2csar ancs1ell ancs1emb an2cs1en ancs1e2p ancs1et an2cséré an2cs1ill an2csiz an2cs1í2z an2cs1or an2csö ancső2 ancs1t an2csut an2cs1ü an2d1alk anda1s and1atl and1e2le and1elk an2d1elő and1els an2derd an2d1es 1andez an2dél an2dil an2d1ö an2d1ő2 an2dús an2dün an2dű an1dy an2dzá a2n1eb an1edd an1e2gé 1a2nekd ane2la ane2l1á ane2l1e2l ane2l1emb ane2lél ane2lő 2anem an1emu an1e2re an1ern an1err 2aneu 2anev a2n1ex ane2z an1ez. a2n1eze an1ezé an1ezt an1ezz a2n1é2ké a2n1éle an1épí a2n1éri a2n1érv a2n1étk a2n1étt a2n1évc an1évem an1éves an1évet ané2véb ané2vén ané2vét ané2vév an1évha ané2vig an1évke an1évkö a2n1évü a2névz anfé2l1é2v an1fl an1f2r anga2d an2g1ada an2g1ado an2g1ala an2g1a2ra an2g1ass ang1azo an2g1ác an2g1áll angár1a2d ang1áta an2g1átj an2g1átt an2g1ed an2g1eg an2g1elf an2g1elh an2g1elj an2g1ell an2g1eln an2g1elő an2g1elt an2g1elv an2gem ang1emb ang1eng an2g1e2r ang1ese ang1éle ang1élv an2g1é2ne an2g1ér. ang1érő an2g1és an2gim an2giz an2gí an2g1osz an2g1óri an2g1öl an2g1ös an2g1ő2 ang1sz an2gü an2gű angye2 angy1el an2gyék an1ide ani2g a2n1iga a2n1igé a2n1i2ko an1ind a2n1inf an1i2on 2anip a2n1i2pa an1i2rá a2n1iro a2n1isi a2n1isk a2n1ism a2nita an1itt a2n1íg a2n1íj 2anív a2n1íz ank1abl an2kaj an2k1a2k ank1ale an2k1a2n ank1arc ank1ari an2k1atl an2k1au an2kaz an2k1ál an2k1e2g an2k1ek an2k1e2l an2k1e2m an2k1e2reit an2k1erj an2k1es ank1érde ank1érem an2kérte an2k1érté an2k1i2d an2k1i2p an1klu an2k1old ank1oszt an2k1ö2römb an2kös an2k1ö2v an2kőr ank1t2 an2k1ü an2ne. an3ny. an3nye an3nyo a2n1oj a2n1okta a2n1old 1a2nomá 2anor a2n1o2ro a2n1orr a2n1ors 2anos a2n1ott a2nódd a2nódo anó1g2 a2n1óni a2n1óno a2n1ó2rá an1óri a2n1öl a2n1ön a2n1ör a2n1ös a2n1ö2t an1pl an1pr an2s1e2l an1ska an2sö an1s2p ans3sze an1sta an2szal an2sz1á2bó an2sz1á2h an2szár ansz1es an2szél an2sz1én an2sz1é2p an2szil an2szin an2szó ansz1t2 ansz1ü2l an2t1abl ant1aga an2t1eg 1anten an2t1e2se ant1esz anti1llát an2t1ing an1t2re a2n1ud a2n1ug a2n1uj 2anuk a2n1u2r anu2szi a2n1u2t a2n1úg an1ü2g anü2l a2n1ülő an1ü2z an1űr an1űz any1a2dó anyag1ár. anyag1árr 1anyagb 1a2nyagé anyag1g 1anyagh 1anyagk 1anyagm 1anyagr 1anyagt 1anyagú a2nyakad a2ny1a2kas a2ny1alk a2ny1all a2ny1ass any1aszt a2ny1a2tom a2nyaz 1anyádt 1anyáék any1álo a2ny1árá a2ny1árb a2ny1árf any1árk a2ny1árn a2ny1á2ro a2ny1árr any1á2sz any1d 2anye a2ny1e2c a2ny1ed a2nyeg any1egé any1egy a2ny1e2k a2nyela anye2leme any1elev a2ny1ell a2ny1elo a2ny1em a2ny1en any1e2re. any1e2rei any1e2ret any1e2rén any1e2rér any1e2rét any1e2rév any1e2rőm any1e2rőr any1e2rőt a2ny1ég a2nyéhe a2ny1é2j a2ny1ék any1élv a2ny1ér. a2ny1érb a2ny1érc a2ny1érd a2ny1ére a2ny1érg a2ny1érh a2ny1é2ri a2ny1érk a2ny1érm a2ny1érn a2nyérő a2ny1érp a2ny1érr a2ny1érs a2ny1érte a2nyérté a2ny1értő a2ny1érv a2nyéve a2nyévé anyha2j1ón anyha2j1ó2r 2anyi anyigaz1 any1ing a2ny1io 2anyí 2anyo any1old a2ny1o2r any1órá any1ök any1ö2r any1öz a2ny1ő2 any1s anyt2 any1tr a2nyur 2anyú 2anyü any1ül a1o ao2áz ao2be ao2cs ao2da ao2dú ao2ka ao2ká ao2la aolaja2d aola2j1ada ao2mo ao2pá ao2pe ao2ra ao2ro ao2so ao2ut ao2ve ao2vi ao2xi a1ó aóá2r a2óbar a2óbá a2óbi a2óbo aó2ce aó2dá a2ódi a2ófá a2ófe a2ófo a2ófő a2ófü a2óhé a2óhi a2óhü a2óil a2óis a2ói2v a2óká a2óke aó1kré a2óku aó2la a2óle a2ólé a2óli aó2lo aó2lu a2ómag a2ómar a2ómas a2óme a2ómi a2ómo a2óné a2ónö a2ónő aó2rá a2óré aó2ri a2ósí a2ósű a2óta a2óte a2óté aó2vo aó2vó a1ö aö2bö aö2cs aö2dé aö2ko aö2kö aö2le aö2lé aö2lő aö2ná aö2rö aö2ve aö2vi aö2vö aö2zö a1ő aő2re aő2ré aő2ri aő2rö aő2rü aő2se aő2sö aő2sz apa2cs1a2v apa2cs1i a2p1a2da a2p1aga a2p1ajá a2p1akc 2apal apa2lag apa2lak a2p1alb a2p1alj a2p1alt apa2mas a2p1ant 2apap apa2pán ap1a2rán 1apasá a2p1asp apa2tad apa2t1ala apata2n apa2t1as apa2tál apa2t1ö ap1aut 2apav a2pava ap1a2zo a2pájú ap1állap a2p1állá a2p1állo apán1n a2p1á2rad ap1á2rai a2p1á2rak ap1á2ram ap1á2ras ap1á2rat apá2ráé apá2ráh apá2rán apá2rár apá2ráv apárba2 a2p1áre a2p1á2ré a2p1árf ap1árka ap1árko a2p1árny ap1ártó a2p1áru a2p1á2rú apáská2 apá2túr 1a2páu ap1bl ap1dr a2pe. ap1e2dé a2p1e2g ap1e2l1a ap1elb ap1e2lé a2p1elf ap1elg a2p1elh ap1elj ap1elk a2pell ap1elm ap1eln ap1elo ap1e2lő ap1elr a2p1elt a2p1elv ape2m ap1emb ap1eme ap1ene ap1eni ap1e2ny ap1e2rő ape2s ap1ese ap1esé ap1eső a2p1e2v a2p1ex a2p1é2he a2p1éje a2p1é2le a2p1éll ap1élm a2p1é2ne ap1épü a2p1ér. ap1észl a2p1éte a2p1éve ap1fl ap1f2r ap1gr a2p1ide a2pidé apigaz1 ap1i2ko ap1ikr a2p1i2nár ap1ind ap1inj a2p1ins ap1i2rat a2p1i2rá a2p1irk a2p1ism a2p1íg a2p1ín a2píté ap1ív a2p1íz ap1kl ap1kr ap1kv ap2laz ap2léd apmeg1 apmű1 apműt2 a2p1ob ap1o2laj ap1oltár ap1opc ap1ope ap1opt apo2rad ap1orcá ap1orsó apor2t1ő2 apo2t1ál a2p1ov 1a2póká ap1ólo ap1óri a2p1öb ap1öl ap1ön ap1örv a2p1ös ap1öv a2p1ö2z ap1ő2r 1appará ap2p1árn ap1ph app1ing ap1pla ap1pri ap1pró ap1p2s ap1py ap2res ap2réd a1p2rém ap2rés. a1p2rím 2apro ap2roc a1p2rod 1apród 1aprózó ap2s1i2kon ap2síz aps1ork apsz1ert ap1szf apsz2t aptára2d aptá2r1ada ap1t2r apuá2 a2p1udv apu1p2 apus3s a2p1u2tas a2p1után a2putc a2p1új a2p1üd a2p1üg a2p1ü2l a2p1ün a2p1üt a2p1üv a2p1üz ap1űr ap1wh ara2b1ár ara2b1í2 ar1abla 2arad ar1a2data ar1a2dato ar1a2datr 2arag ara2g1e 2araj ar1ajkáró 2arak a2r1a2kol ara2kóh ara2kói ara2kós ara2kót a2r1akt. ar1alk a2r1alm a2r1ana 1a2rann arany1a2gá ara2nyal 1aranyb 1aranyh ara2nyí 1aranyk 1aranyn 1aranyr 1aranys ara2pa. ar1arc 1arasz. arasz2t1e ar1aszú ara2tal ara2tel ara2tin ara2t1ő2 aratű2 ara2tűr ar1aul aravasz1 1a2raw ara2zon 2arác a2r1ác. a2r1á2csi a2rácsom a2r1ág. a2r1á2ga. a2r1á2gai a2r1á2gak a2rágan a2r1á2gat ará2gáb ará2gáh ará2gán ará2gár ará2gát ará2gáv a2r1ágb a2r1áge a2r1á2gé a2r1ágf a2r1ágg a2r1ágh a2r1á2gi a2r1ágk a2r1ágl ará2gon a2r1ágr a2r1ágs a2r1ágt a2r1á2guk a2r1á2gun a2r1á2gú a2r1á2gy ar1álc a2r1állá a2r1állo 2arám ará2m1e2 ará2nye a2r1á2rak a2r1á2rá a2r1árk a2r1árr ar1á2ru ar1árú ar1árv ará2sze a2r1á2szoki ará2tal ará2t1ö aráz4s ará2zsál arázsi2 arázs3z ar2c1a2d arc1agy arc1ala arca2n arc1any ar2car ar2cat ar2ceg ar2c1es ar2cev ar2c1é2h arc1él. arc1élb arc1éll arc1élt ar2c1é2n ar2cés 1archí arc1ing ar2c1int ar2ciz arcolás1s ar2có ar2cő arcs1ala ar2csál arc3sere ar2csip ar2c3sor ar2cü ar2cű ard1acé ar2d1alj ar2d1áll arde2l ard1ele ard1elő ard1elt ar2d1e2m ar2d1é2l ar2d1ina ar2d1ing ar2dor ar2dö ar2d1ur ar2dü a2r1e2dz ar1egés a2r1e2gy are2i areil2 a2r1e2le ar1elh ar1elm ar1eln ar1elr ar1elt ar1elü ar1elű ar1elv a2r1emb ar1emel ar1e2més a2remu a2r1e2r ar1e2se ar1e2ső a2r1eszek a2r1eszé a2r1eszü ar1etű ar1e2ve ar1e2vé a2rew aréé2 ar1ég. ar1é2ge aré2k1a2l aré2kek ar1él. ar1élt 2arém aré2nek aré1p a2r1épü a2r1é2ri a2r1érő ar1észj aré1sz2tá aré1tra ar1f2r ar1gha 2ari. 2aria ar1i2de a2ridé a2r1i2ga a2rimád ar1i2mi a2r1i2na. a2r1i2naké a2r1i2nas a2r1i2nat a2r1i2náb a2r1i2náh a2r1i2nán a2r1i2nár a2r1i2nát a2r1i2náv a2r1ingé ari2nit arink2 a2r1inté ari2nü ar1i2ono a2r1i2ón 2arip a2r1isp a2r1iste ari1szf 2ariz ari2zom ar1í2té ar2j1áz ar2j1er arkas3s arká2p arká2s ar2k1eg ark1elá ar2kéj ar2képü ar2k1érd ar2k1in. ar2k1i2ont ar2kiz ar2k1orm ar2k1ovi ar2kud ar2k1u2s ar2les ar2m1a2gy arma2te arm1áll ar2me. ar2meo arme2s arm1ing ar2m1is ar2m1osz ar2m1ö ar2mü arnis3s aro2k1á2 aro2k1e aro2kin a2r1olda 1a2romát aro2mis a2r1opt ar1org ar1o2ro ar1ors a2r1ovi aró1p a2r1ó2rak a2r1ó2ráj a2r1ó2rám aró2s3zár aró2vár ar1ózd a2r1ö2b a2r1ök a2r1ö2l ar1öng a2r1ör a2r1ös a2r1ö2z ar1őr ar1ős ar1pl ar1pr ar1ry ar1ska ar1srá ar1sta ar1sto ar1str 2art. art1abl ar2t1a2lap arta2n1á2s art1aszt ar2t1a2u ar2t1álla ar2t1e2g art1e2lő art1emb art1e2rei ar2tég ar2t1é2l ar2t1érp ar2t1i2na. ar2t1i2nát ar2t1i2náv art1orz ar2t1ö2v ar2t1ut artvis1s ar1ty2 a2r1uml a2runi aru2tas a2r1új a2r1úsz ar1útj ar1útr a2r1üt ar1üz ar1ű2z ar2vala arvas1s arv1ágy ar2v1árh ar2v1á2ri 2asabl as1abr a2sadag asag2 as1aga as1agg as1a2gy 2asaj a2s1a2kar 2asal as1alab a2s1a2lap as1alf a2s1alján a2s1alji a2s1alk as1alm a2s1anó a2s1ant a2s1a2ny 2asap as1apr 2asar as1aran a2s1a2rá asa2t1ó2 as1a2ty 2asav asa2vo a2s1á2c asá2g1ikr as1áll 2asám a2s1árnak a2s1á2ro a2s1árr a2s1árt a2s1á2ru asás1s as1ásvá as1áth 2asáto 2asáv as1bl as1d2r a2s1e2d as1ege a2s1e2gy ase2k as1eke as1eké as1ell a2s1emb a2s1e2n a2serd as1e2ré as1erő a2s1es ase2t as1eti a2s1ez a2s1éhe a2s1éke a2s1é2l 2asém a2s1ép 2asér a2s1ér. as1érb as1érc a2s1érd asé1s2 as1étv as1é2ve as1fr as1gl as1gr as1ide as1ido as1i2ga as1i2gá as1inj a2s1i2o 2asiv as1izé as1i2zo a2s1íj 2asík 2asín 2asír asírta2 asír2tal a2s1í2v as1ízü 2aská as1kl asko2s1a2rá asko2s1á as2koz as1k2r as2luk as2már 2asodr a2s1of as1okke as1okl as1okos 2asoks as1okta asom1or aso2né 2asor a2s1ord a2s1orm as1osz a2s1ox asó1p2 as1ó2rá a2s1ö2k a2s1ö2l as1örd as1örv a2s1ös as1ö2ve as1őr as1p2l as2pot asp2r a1s2pu as1s2p as3szabá as3szin asszí2ve assz1íve. assz1ívek assz1ívne 1asszoc 1asszony as3szü as3szű 2asta a1stand 2astá a1s2tád 2asti astil2 as2tim 2astí 2asto as2top 2astr as1trag as1trav a1st2ru 2astú a2s1ud 2asug a2s1uj 2asuly asu2r as1ura as1urn a2s1u2sz as1u2tak a2s1u2tas a2s1u2tá as1u2tu a2s1ú2s a2s1ú2t asút1a2 a2s1üd a2s1ü2lő as1üst a2s1üz as1űz 2aszab a2sz1a2d 2aszak a2sz1akc asza2k1e a2sz1akt asza2k1ü a2sz1alk 1aszaló asz1asp asz1ass asza2t1a2 asza2t1e a2szath a2szati 2aszav a2sz1ág. asz1á2ga asz1á2gá asz1ágb asz1ágg asz1á2gi asz1ágk asz1á2go asz1ágr asz1ágt a2szálc a2szálm 2aszám aszá2rada a2száram asz1árnyé a2szárp a2száta a2száth asz1átl a2sz1á2to asz1áts 2aszed 2aszeg aszegész1 asz1eh 2aszek 2aszel asz1e2lem asz1elj 2aszemc 2aszeme 2aszemé 2aszemp a2szemu 2aszemü 2aszemű 2aszen a2sz1eng asz1e2pi 2aszer. 2aszere a2sz1erej 2aszeré 2aszerk 2aszern a2sz1ero a2szerő 2aszerr 2aszers 2aszert 2aszerv 2aszerz asze2s a2sz1ese asz1est 2aszez 2aszék aszé2k1el asz1é2let asz1élés aszé2n1ég aszén1n a2sz1é2re asz1éré 2aszét asz2fér a2sz1ill 2aszin a2sz1inf asz1ing 2aszir a2sz1ism asz1ist 2asziv a2sz1iz 2aszí a2sz1ír asz1í2vi asz2karc asz2k1áp asz2kell asz2kes 2aszob 2aszoc 2aszof aszon1n aszo2n1o a2sz1orr asz1ors a2sz1osz 1aszóa asz1ó2dá 2aszót 2aszök asz1ölt a2sz1ön 2aször asz1öss a2szöt 2aszöv 2asző aszőlőé2 asz3su asz2tab asz2t1apo asz2tác asz2táll asz2t1emb asz2téne asz2t1és asz2t1ing asz2t1olt asz2t1oro asz2t1orr asz2tors asz2t1osz asz2töv asz2tős asz2t1ül asztvíz1 2aszur 1aszús asz1útr 2aszü aszü2g asz1ügg a2sz1ü2z 2aszű asz2vit asz1z 2atab at1abla a2t1a2cé ata2dat at1a2dó 2atag a2t1agya a2taján 2atak a2t1akara ata2kár ata2kel ata2k1é2pes ata2k1ö2v a2t1aktu at1a2lag ata2lap. ata2lapb ata2lapj ata2lapo ata2lapp ata2lapr ata2lapú ata2lat a2t1aleg ata2lik a2t1alle a2t1almás 2atan a2t1anal ata2nó at1a2nyag at1a2nyás 2atap at1app ata2puk ata2pun 2atar a2t1a2rab ata2ran a2t1a2rén ata1st atau2r a2t1a2ut a2t1azo 2atáb at1ábr 2atág at1ág. a2t1á2ga at1ágr 2atáj 2atál a2t1állá a2t1álló a2t1álm 2atám atá2nal a2t1á2pol 2atár atá2rada atá2rado atá2ramh a2táramk atá2ramn atá2r1az atá2rét atá2ris at1árkár atársá2g atár2s1ágá at1ártás 2atás atá2s1á2g atá2sz atá2tal atátá2 atá2tár a2t1átb a2t1átf a2t1áth a2t1áti a2t1átj a2t1átk a2t1átl a2t1átr a2t1áts a2t1átt a2t1átu a2t1átv 2atáv at1bl at1br at1cl at1dr at1e2gé ate2jel ateké2r ate2kére ate2kó a2t1e2l1a a2t1elb at1elc a2t1eld at1e2led at1eleg at1e2lem at1e2l1en a2t1elf a2t1elh at1eljá at1elkö at1elkü a2t1elm at1eln a2t1e2lo at1e2lőn ate2lőt a2t1elr a2t1els at1elta at1eltá at1elté at1eltü a2t1elu a2t1elű a2t1elv a2t1elz a2t1emb at1e2mel a2t1emé a2t1eml a2t1emó a2t1enc a2t1ene at1epi at1epo a2t1erd at1e2rec ate2r1ék a2t1erő a2t1e2se a2t1esé a2tesk ates2t1á ates2tő at1eszm at1eszű ate2tol a2t1e2z 2atég até2get a2t1éhe até2k1a2l até2ke2 a2t1éke. aték1el 2atél a2t1é2le a2t1é2lé a2t1élm a2t1élv 2atém até2ne a2t1éps 2atér até2rá a2t1érdek a2t1érin a2t1érl a2t1érm a2t1értel at1érvek a2t1érz at1észa at1észl 2atét até2tét a2t1étv at1fj at1fl at1fr at1gl at1gr a1t2hus 2ati. a2t1iat a2t1i2de a2t1ido ati2g a2t1ige a2t1igé a2t1igy a2till at1ille at1i2má at2i3mádá at1i2mi a2t1imp 2atin a2t1ing. a2t1inga a2t1ingb a2t1inge atinó2 ati2n1ór at1inté at1into 2atip a2t1i2pa 2atir a2t1irá a2t1iro 2atis a2t1isk a2t1ism ati2sz a2t1iszo 2atit a2t1i2ta a2t1izé a2t1izg a2tizmo a2t1i2zo a2t1íg a2t1íj 2atíp 2atír a2t1í2t at1í2vek atív1e2l at1í2vet atí2vét a2t1íz 2atki 2at1kl 2atko 2atkö 2atku at1kv at1ojt atoka2 a2t1o2k1al ato2koss a2t1o2koz a2t1okta a2t1o2ku at1oldá a2t1oldó ato2m1á 1atombe ato2mer 1a2tomj a2toml 1a2tomok 1a2tomos 1a2toms 1atomú at1opc at1ope a2t1opt 2ator ato2rál a2t1ord a2t1org ato2rú a2t1orv a2t1orzá atos3s ato1sz2f a2t1oszl ató1p2 a2t1ó2rák ató2rán ató2riá ató1stá ató1sz ató2s3zár ató2s3zené ató1tr at1öko atö2l a2t1öle a2t1ölé a2t1ölő at1öná atön2k1a at1ö2röm a2t1ös a2t1öt atö2vi. a2t1ö2z atő2ra at1őrl a2t1ő2s atpen1 at1pl at1pr at1ps atrac1c a1t2rad 2atraj 2atrak at2ramb a1trap a1trau a1t2rav 2atré a1t2réf at2rén atré2szel a1t2ril at2roj a1t2róg 2atrón a1t2rü at2sán at1sh at1sk at1sl at1sp at1st at1s2v atszá2m1é atszáraz1 att1adó 1attakok 1attasé at2t1e2g at2tez att1ing attó2 at2t1ór at1t2re 2atud a2t1udv a2t1ug 2atul a2t1und a2tuni 2atur at1utá at1utó a2t1új 2atúl at1ú2sz a2t1üg 2atük at1ü2lé at1ült 2atün at1üst a2t1ü2v 2atüz at1üzem at1űri. at1űrl 2atűz a1u au2b1in au2bor a2udá au2de au2ga a2ug2h au2go 1a2ukc aul2l aul2t1a aul2ti a2umae a2umaf a2umak a2umam a2umar a2umav a2umáb a2umád a2umáé a2umáh a2umái a2umám a2umán a2umár a2umáv au1ph au2rad au2r1ikr au2rö au2sz1e a2ut. au2tad au2tal au2tam au2tas au2tat 2autá au2tál a2uti 1a2uton a2utó 1autób 1autóé 1autóh 1autói 1autóm 1autón 1autór 1autós 1autót 1autóv a2utr a2utt au2tu au2zí au2zs a2uzú au2z1ü a1ú aú2jí aú2jo aú2ré aú2r1i aú2sz aú2ti aú2to a1ü aü2dí aü2dü aü2ge aü2gy aü2le aü2lé aü2li aü2lö aü2lő aü2lü aü2nő aü2re aü2rí aü2rö aü2rü aü2sz aü2te aü2té aü2ti aü2ve aü2vö aü2zem. aü2zemb aü2zemen aü2zemet aü2zemé aü2zemh aü2zemm aü2zemn aü2zemr aü2zen aü2zé a1ű aű2ri aű2rö aű2ze aű2zé aű2zi aű2zö aű2ző 2avad 2avak av1akti a2v1anh 1a2vant a2v1a2nya a2vanz ava2rac ava2r1ag ava2r1e2 ava2rék ava2sze ava2szü 1a2vatá 1a2vató 2avád avá2nan 2avár avá2r1al avá2ria. avá2riai a2v1á2riá a2v1áta a2v1átt avá2zal av1bl av1e2le av1elv 2aves av1est 2avet 2avez avi2cse av1ing av1kr a2v1old av1oltó avo1s a2v1ox a2v1öm a2v1ös av1ős av1őz av1pr av1sp av1st a2v1ut av1ü2l av1ür av1ü2z a2wag aw2hi awhisky2 awhiskyk2 a2x1ab a2x1ad a2x1ak a2x1al a2x1an a2x1av ax1bl ax1eg ax1el ax1inf ax1ing ax1int axió2r axi2se ax1ír ax1ös ax1öz ax1pr a2x1ut ax1új ax1üz ax1űr a1ye. a1yed a1yei a1yek ay1e2l a1yen a1yes ayet2 ay1fl a1yi. ay1il ay1ing a1yit ayma2 ay1s2t aza2ch aza2cik azai2ko azal2t1a aza1p2 aza1s2 az1áll az1ált azá2nö azá2r1ó2ra azá2s1e azási2k azá2siko azás3s az2du a2z1e2g az1e2le az1elj az1elm az1elő a2z1em a2z1ex a2z1ég azé2k1e2 azé2kol a2z1érté a2z1ing a2z1i2o az1irá az1irt azma1g a2z1ob 2azol azo2nal azo2n1á azont2 a2z1op a2z1or a2z1osz azót2 azó1tr a1z2rí az4sé a2z3sike az3sor az3sp a2z3sü az3sz az1ut a2z1új azú2r1é az1üz 2á. á1a áa2da áa2dá áadás1s áa2do áa2dó áa2du áa2já áa2ka áa2la áa2lu áa2ra áa2sz áa2ut áa2va á1á áá2cs áá2ga áá2gy áá2ju áá2mu áá2ra áá2ru áá2sá áá2sí áá2so áá2só áá2su áá2zo áá2zu á2b1adu áb1akc á2b1a2la á2b1alk á2b1ambu á2b1a2ny ába1p áb1art ába3se á2b1á2g áb1áll áb1álm á2b1áp á2b1árá á2b1árn á2b1á2ru á2b1átj á2b1átl á2b1átm á2b1átv á2b1áz áb2b1a2d ábba2l áb2b1ala áb2b1and áb2b1ár áb2ben áb2b1e2r áb2b1é2l áb2bid áb2bim áb2b1i2s áb2b1ita ább1o2so ább1oss áb2bör áb2b1ül áb2bű áb1dr á2b1ed á2b1e2g ábe2l1a ábe2l1á ábe2l1eg ábe2l1el ábe2l1e2r ábe2lég ábe2l1in á2belnö á2b1e2m á2b1e2n áb1e2ro áb1erő 1á2béc á2b1é2g áb1é2ke á2b1éks á2b1é2les á2b1élt á2b1ép á2b1ér. á2b1é2ri á2b1érs á2b1érte á2b1érté áb1fr á2b1i2d ábi2g áb1iga áb1igé á2b1ikr áb1illa á2b1im ábi2nai á2binas á2b1ind á2b1ing á2b1int á2b1is áb1izm áb1izz á2b1ív áb1kl áb1kr ábla1kr ábla1p á2b1olda á2b1op ábo2raj ábo2ran ábo2rál ábo2ris á2b1osz á2b1o2v áb1öb áb1ö2d áb1öl áb1ön áb1ö2r áb1ös áb1öv áb1őr áb1pr 1ábrái áb2rek áb1sp áb1st áb1sz2 áb1tr á2b1ujjal ábu1sz2 áb1úr. áb1üg áb1ü2l áb1üs áb1üt áb1üv á2c1a2g ác1ajt áca1k2l ác1akn á2c1a2la ác1alm á2c1a2ny á2c1ág á2c1ál ác3cse ác3cso ác1e2l1 ácele2 ác1en ác1er á2c1ép á2c1ére á2c3ha á2c3há ác3he á2c3hé ác3hon á2c3hu áci2as á2c1il ác1inc ác1ing ácin2til áci2ósű á2c1i2s ác1ív á2c1or á2c1osz ác1ór ác1ö2l ács1abl á2cs1a2g á2cs1ajt á2csaka á2cs1akn ács1alap ács1alj ács1alom ács1app ács1atk á2csatom á2cs1á2c á2cs1ál ác3sárg á2cs1árk á2cs1árn á2csáru á2cs1á2ta ácsboz1 á2csef á2cs1e2g á2cs1e2l á2csene á2csent á2cser ácse2t á2cs1ev ács1é2g ácsé2k ács1éki ács1ékk ács1ékn á2csél á2csép ács1é2te ácsi2g á2cs1iga á2cs1ille á2csimi ács1int ácsi2p á2cs1ipa ács1isk ácsí2 ács1ír á2csokta 1á2csolat 1á2csomk ács1orr á2csosz á2cs1ov ác3só. ács1ó2r ác3sót ác3sóv ács1ö2k á2cs1ö2l á2cs1ös á2csöt ács1ő2s ács1s á2csuj á2csut á2cs1úr ács1ü2l á2cs1ü2t á1csy ács3zen á2c1ut ác1úr ác1ül ác1ür ád1abl á2d1a2do á2d1akc ád1a2lap á2d1alb á2d1alj á2d1alk ád1a2nya ád1a2nyá áda1p á2d1a2pá ád1arc á2d1aty á2d1ág á2d1ál ád1á2sz ád1átl ád1dr ád3dz ád1e2c á2d1e2g á2d1ej á2d1e2l ádele2 ádel1ej ádel1eme á2d1e2m á2d1ep áde2r1á ád1erő ád1e2ti ádéd2 ádé1dr ádé1g2 á2d1é2ge ádé1kré ád1éne á2d1érte á2d1érz ádé1st ádi2cse á2d1i2d á2d1i2ga ád1i2ko ád1ill ád1imi ád1ind á2d1int ádi2ódar ádióé2r ádi2óéra ádi2ói2v ádi2óko ádi2ó1k2ra á2d1i2p ád1ist ád1ív ád1kl ád1kr ádo2ga ádo2gá ádo2ge ádo2rak á2d1osz ádós2 ádö2b á2d1ös ád1öv ád1ö2z ád1ő2r ád1pr ád1ps á1d2rót ád1st ád1tr ád1udv á2d1ú2s á2d1üg ád1ü2lé á2d1üz ád3za á2d3zá á2d3ze ád3zú á1e áe2cs áe2dz áe2ge áe2gé áe2gy áe2le áe2lő áe2me áe2re áe2rő áe2se áe2sé áe2si áe2ső áe2sü áe2te áe2ve áe2vé áe2vő á1é áé2de áé2ge áé2gé áé2gő áé2he áé2ke áé2le áé2ne áé2pí áé2pü áé2re áé2ré áé2ri áé2rő áé2rü áé2te á2f1a2gya á2f1alg á2fáb á2f1ág 1á2fák á2f1áp 1á2fás á2fát áf1dr áf1elm á2f1e2m á2f1e2t áf1é2ne áfi2ad áfi2am á2f1i2d á2f1im á2f1ing. á2f1ordá á2f1osz áf2rec á1f2rö áfus3s á2f1ün á2g1abl ág1abr ága2c ág1acé 1ágacska á2gad ág1a2dá 1ágadd ág1a2dó á2g1a2j á2gaka ág1a2kar ág1a2kas 1á2gakb 1á2gakh 1á2gaki 1á2gakk 1á2gakn 1á2gakr á2gakt á2g1a2la á2g1alj á2g1all ág1alt 1á2gam ága2n ág1ana á2g1ang 1á2gank ág1ant á2g1any á2g1a2p á2g1a2r ág1asp á2g1asz ága2tol á2g1au 1á2gaza ága2zon á2g1á2g á2g1áld ág1álm ág1á2mu ágá2nyal á2g1áp á2g1árad á2g1árb á2g1á2ré á2g1árh á2g1á2ria ágá2rokb á2g1árv á2g1ásó ágás3s ágá2sz á2g1át1a2 á2g1átá á2g1áté á2g1átf á2g1áth á2g1áti á2g1átl á2g1átm á2g1átn ágá2tokk á2g1átr á2g1áts á2g1átt ág1átü á2g1átv ág1bl ág1br ág1d2r á2g1e2c á2g1e2d ág1ef á2g1e2g á2g1e2l á2g1e2m á2ge2n ág1enc ág1ene á2g1e2p áge2ra áge2rá áge2r1el á2g1e2s á2g1e2t á2g1e2v á2g1ex á2g1é2g á2g1é2he á2g1éj á2g1é2k á2g1é2l á2g1é2ne á2g1épí ág1é2pü á2g1ér. á2g1érá á2g1é2ré á2g1éri ág1érm á2g1é2rő ág1érte ág1érté á2g1érv á2g1és á2g1éte á2g1éve á2g1évé ág1fl ág1fr ág1g2l ág1gr ág3gyar ág3gye ág3gyú ághá2nyi ági2al ági2asz ági2d á2g1ide á2g1if ági2g á2g1iga á2g1igén á2gill ág1ima á2g1i2mi á2g1i2na. ág1inf á2g1ing ág1ins á2g1int á2g1iri ág1iro á2g1ist á2g1isz á2g1i2ta á2g1iz á2g1íg á2g1ín á2g1ír á2gíté á2g1íz ágká2rok ág1kl ág1kr ág1kv á2g1oá á2g1okl á2g1o2li ág1oltó á2g1op á2g1or á2g1osko ágos3s á2g1oszl ágó1dr á2g1ó2rá á2g1ö2k á2g1ö2l ág1önt ágö2r ág1örö ág1örv á2g1ös á2g1öt á2g1öv á2g1ö2z ág1ő2r ág1ő2s ág1pl ágport2 ágpor1tr ág1pr ág1ps ág1sh ág1sk ág1sl ág1sp ág1st ágsz2 ág1tr á2g1ud á2g1uj águ2n á2g1una á2g1und á2g1u2ra á2g1u2rá á2g1u2t á2g1új á2g1ús ág1útt ág1üd ág1ü2g ág1ü2l ág1ün ág1üv ág1üz ág1ű2r ág1űz ágya1g ágy1alj ágy1alk ágy1alm 1á2gyasn á2gyassa á2gy1á2l á2gy1á2ram ágyás1s á2gy1e2 á2gyél ágy1ér. 1ágygyű á2gyid á2gyil á2gyivad á2gyob á2gyosz ágy1otth á2gy1ó2s ágy1ö2l ágy1ös á2gyur á2gyúh á2gyút á2gy1ü2 áh1ajk áh1ass 1á2hít á2h1ors á1i ái2dom ái2dő ái2ga ái2gé ái2gy ái2ha ái2je ái2má ái2ram ái2rá ái2sz ái2ta ái2vá ái2vo ái2zé á1í áí2gé áí2rá áí2ve áí2vo á2j1adó á2j1akc á2j1akv á2j1a2la áj1ambu á2j1ana áj1ant á2j1any á2j1ar á2j1atl á2j1ax áj1azo á2j1ág á2j1ál á2j1áp ájás3s á2j1át1a á2j1átá á2j1átt áj1bl áj1br áj2ch á2j1e2c áj1egé áj1elm áj1eln áj1elő áj1elv á2j1em á2j1e2n á2j1es áj1e2t á2j1e2v áj1ex á2j1é2g á2j1él á2j1ép ájé2r á2j1ére á2j1éte áj1fl áj1fr á2j1i2d á2j1il á2j1im á2j1iz áj1íj áj1ír áj1ív áj1íz ájk1ell áj2k1ő2 áj2kü áj2lad ájl1akt áj2l1an áj2l1as áj2l1at áj2lik áj2lob áj2nár áj2nin áj2nü á2j1ob á2j1op á2j1or á2j1öb áj1ök áj1öl á2j1ör áj1őr áj1ős áj1pl áj1pr áj1sn áj1sp áj1st2 áj1t2r á2j1ud áj1úsz áj1üg áj1ül áj1ür áj1ü2t áj1üv áj1üz áj1űr áj2zab áj2zaj áj2z3sa ák1abr á2k1a2d á2k1aj ák1aka á2k1a2lapí ák1ale ák1alj ák1ant ák1ara á2k1a2rá ák1arm ák1arz á2k1ass á2k1atl á2k1a2u á2k1á2c á2k1á2l ák1áta ák1átk ák1bl ák1ebé á2k1e2g ák1e2le á2k1elk á2kellene á2k1elm á2k1e2lő ák1emb ák1e2rő á2k1e2vé á2k1e2vo á2k1é2l á2k1é2ne á2k1érm á2k1érte á2k1értő á2k1érv á2k1érz ák1éss á2k1é2te á2k1étk á2k1étt á2k1é2ve ák1fl ák1fr á2k1i2d á2k1if áki2g ák1iga á2k1igé ák1ill á2k1i2m ák1ing á2k1int ák1iro á2k1i2s áki2t ák1ita á2k1i2v ák1ír ák1k2l ák1k2r ák2lar á2k1oks á2k1o2la á2k1old á2k1o2li á2k1oll á2k1o2pe á2k1orv ákos3s á2k1ott ák1óni ákö2l á2k1ölő ák1ö2r ák1ő2r ák1pr ák2rák á1k2reá á1k2ris ák1sp ák1sr ák1st ák1sz2 ák1t2r á2k1uj á2kuni áku2r ák1ura ák1utó ák1új ákú2t á2k1úto ák1üd á2k1üg ákü2l ák1ün ák1ür ák1ü2t ák1űr á1k2vat 2ála. ál1abl ál1acé á2l1adag á2l1a2dó ál1a2já ál1ajt ála2kar á2l1akna. 2álal ál1alak á2l1alát ál1alg á2l1alk á2l1alm á2l1ane á2l1ang á2l1ant á2l1a2nya ál1a2nyái ál1a2nyán á2l1a2nyát ál1a2nyáv á2l1a2pos ál1apó ál1a2ra ála2szek ála2szel ála2sz1ék ála2szö ála2szű ála2tat ála2tet ála2t1ér. ála2tikr ála2tint ál1atlé ála2told ála2t1ó2 á2l1atti á2l1a2ty ál1aut á2l1ábr ál1ág. ál1á2gi á2l1á2gú ál1áll á2l1á2rak ál1árf ál1árk á2l1árn á2l1á2ro álá2s3z á2l1átc á2l1átk á2l1átm á2l1átú á2l1átvá ál1bl ál1br álcai2 1áldás 1áldoz ál1d2r ál1dy á2l1e2c á2l1e2d á2l1ef ál1elk ál1elm ál1elo ál1e2lő ál1elr ál1emu á2l1e2r ál1esem á2l1e2ső á2l1esz á2l1e2t ál1ez á2l1ég á2l1é2he álé2kal álé2k1an álé2k1e2l álé2kü ál1é2le ál1é2lő á2l1é2ne á2l1ér. á2l1érb á2l1érd á2l1érf á2l1érg á2l1érh á2l1é2ri á2l1érm á2l1érr á2l1érs á2l1értá á2l1érte á2l1érté á2l1érz á2l1év. á2l1é2vé ál1fl ál1fr ál1gr 1álhaja áli2as ál1i2bo áli2d ál1ide ál1idé áli2g á2l1iga á2l1ige á2l1igé ál1ill ál1imp á2l1ind ál1inf á2l1i2onb á2l1i2ont á2l1i2p ál1irá á2l1iro áli2s1e áli2s1ék áli2sis ális3s ál1iste á2l1iz ál1ín ál1í2r ál1ít ál1í2v álká2rok ál1k2l ál1k2r ál2l1a2dó 1állag ál2laj ál2l1a2lak 1államá álla2m1e 1államot 1államti ál2l1a2pá ál2l1a2r 1állata álla2tas álla2t1e2 álla2t1or álla2t1ö2 1állatu ál2l1á2g ál2l1á2l ál2l1árr állás1s ál2l1áth ál2l1átm ál2led ál2l1e2h ál2l1ej áll1éké ál2l1iz 1állomá ál2lü 1álmaim 1álmok. 1álmom 1álmot. 1álmuk 1álmunkb ál1obj á2l1o2ka. á2l1o2kai 1álokaih 1álokain 1álokair á2l1o2ká 1álokán 1álokát 1álokáu álo2kok 1álokonk álo2kos á2l1okta 1á2l1o2ku á2l1ol áloma2 álo2mad álo2m1al álo2m1an álo2mar álo2mas álo2m1á álo2m1e álo2m1it álo2mot á2loms álo2m1ú á2l1ont ál1opc á2l1ope á2l1or á2l1osz á2l1ox álóa2 álóá2 álóó2 áló2ráj áló2s1ű2 álót2 ál1öb á2l1öd á2l1ö2l á2l1ös ál1öz á2l1őr ál1p2l ál1p2r ál1p2s ál1sk ál1sl ál1st ál1trad ál1t2rak ál1t2ran ál1t2re ál1tré á2l1ug álu2n á2l1una á2l1u2r á2l1u2t á2l1uz á2l1új á2l1úr álú2t ál1útj ál1útk ál1útn á2l1úto á2l1útr á2l1útt ál1üg ál1ün ál1ür ál1üt ál1üv ál1üz ál1űr ál1űz ály1ada álya1g2 ály1ant ály1anya álya1p ály1ass á2lyál á2ly1e2 á2lyéj á2lyél á2ly1é2ne á2lyére á2lyéve á2lyide á2lyí ály1k2 ály1odv á2lyol á2ly1ó2 á2ly1ö á2lyő ály1s á2lyug á2ly1ü2 á2ly1ű2 á2m1abl á2m1abr ám1a2cé ám1adm ám1agg á2m1ajt á2m1akt ám1a2lap ám1all ám1alt ámaó2 á2m1app á2m1arc áma2sz1ál áma2szel áma2szív áma2sz1odv áma2sz1ü2 ám1atl á2m1att á2m1aty ám1aud ám1a2zo ámá2c ám1áf á2m1ág ám1álla ám1állo ámán1n ámán1tr á2m1á2rak ám1á2ram á2m1áras á2m1á2rá á2m1árb á2m1á2ri á2m1árn á2m1á2ro á2m1árr á2m1á2ru ám1ásv á2m1átb ám1á2t1e á2m1áti á2m1átm ám1á2zó ám1bl ám1dr á2m1e2b á2m1ej á2m1ela ám1elá ám1e2lem ám1elé á2m1elh ám1elí á2m1elj ám1elk á2m1elm ám1elo á2m1e2lő ám1els ám1elt ám1elü ám1elv á2m1e2m á2m1erd ám1e2rek á2m1erk á2m1e2ro áme2rők áme2rőt áme2rőv ám1e2se ám1ess ám1esz áme2t á2m1eti á2m1etű á2m1ev á2m1ex á2m1ez ám1éke á2m1é2le á2m1ép á2m1érc á2m1érd á2m1értel á2m1étk ám1fr ám1gr ámi2ab ámi2al ámi2am á2mide á2m1idé ám1i2dő á2m1iga á2m1igá á2m1igé á2m1ill á2mimá á2mimm á2m1imp á2m1ind á2m1inf á2m1ing á2m1inte á2m1inté á2m1inv á2m1i2pa á2m1irá á2m1iro á2m1irt á2m1isk á2m1ism ám1i2szá á2m1i2z ám1íg á2m1íj á2m1ír á2m1í2v ám1íz ám1kl ám1kr ám1kv ámla3t2 á2m1ob á2m1of á2m1oká á2m1okl á2m1okm á2m1okta ámo2lyas á2m1op ámo2r1á2l ámo2ris ámo2r1odv ámo2sas ámos3s ám1osto á2m1osz á2m1ov á2m1ox ám1ó2r ám1ö2k ám1öl ám1ön ám1ör ám1ös ám1öt ám1öv ám1ö2z ám1ő2r ám1ő2s ám1őz ámpa1p2 ám1p2l ám1p2r ám1p2s ám1sk ám1sm ám1sn ám1sp ám1st ám1sz2 ám1t2r á2m1ud á2m1ug á2m1uj á2m1und á2muni á2m1u2r á2m1utá á2m1új ám1üd ám1üg ám1ü2l ám1ür ám1üt ám1üv ám1üz á3műt ám1ű2z ámva2s1u2 á2n1abl á2n1a2cé án1ach án1ada ánae2 án1afr án1agya án1ajt á2n1aká á2n1akc á2n1akr á2n1a2la án1alk á2n1all á2n1anó án1anya á2n1a2o ána2p án1apa ánap1i án1ara á2n1arc án1assz ána2t1ér. ána2tol ána2tor ána2t1ű á2n1a2u án1ava án1ábr á2n1ág á2n1áll án1ár. án1árad án1á2ri án1árm án1árn án1áro án1áru án1ásv áná2t1a áná2t1á á2n1á2z án1bl án1br án2cac án2c1ad án2caj án2cal án2c1a2n án2car án2c1as án2cat án2c1au án2c1ál án2c1á2ro án2cás án2c1ed án2c1e2g ánce2l ánc1ele án2c1elt án2c1er án2c1e2s án2c1et án2cez ánc1éhe ánc1é2ne án2c1ér. án2c3h án2c1ill án2cim ánci2p ánc1ipa án2c1ir án2c1i2s án2c1ó2 án2c1ö2 án2cő áncs1an ánc3sás án2c3seb áncs1es ánc3spo ánc3sza án2cü án2cz áne2d án1edé á2n1ef á2n1e2g á2n1e2l án1emb án1e2mi án1eml án1e2mu á2n1en á2n1e2p án1es á2n1e2t án1e2u á2n1ex án1ez á2n1é2d á2n1é2g á2n1ék. á2n1ékn án1éks á2n1é2l á2n1é2ne án1épí án1épü á2n1ér. á2n1érc á2nérd á2n1éré á2n1érl án1éte á2névad á2n1éve á2n1é2vé án1f2r án2gab án2g1a2r án2g1ára ángás1s án2g1át án2ged án2g1el ánge2s án2g1ér. án2g1é2s áng3g án2g1it án2g1iv án2gí án2g1osz án2gőr án2g1us án2gü 1ángy. án2gyas á2n1i2d á2n1if á2n1i2ga án1igé áni2k1a áni2k1á áni2ke án1ill á2n1im án1ind án1inn á2n1i2p á2nirr án1irt án1isk án1ism á2n1i2sz áni2tá áni2t1e2 áni2t1í áni2tol áni2t1or án1izo án1íg án1ív án1íz án2kaj ánk1aro án2kern án1k2li án1k2lo án1klu án1k2rá án3nye án3nyí án3nyo án3nyu á2n1o2b á2n1okir á2n1okta á2n1o2ku án1old án1oli á3nom áno2n1i2m á2n1o2r án1oszl án1ott á2n1ox án1óri án1ök á2n1öl án1öm á2n1ön á2n1ör á2n1ös á2n1öt án1övö á2n1őr án1ő2s á2n1ő2z án1pl án1pr án2ses án2s1ér án2sis án2siz án1s2pe án1s2pi ánst2 án1str áns1üld án1szl ánt1acé ánt1a2ny án2taz án2t1á2g ántá2p án2t1árb án2t1ári án2t1ed ánt1eké ánt1elh án2tez ánt1éke án2térte án2tid án2t1ipa ánt1ist án2t1iz án2t1ív án2tök án2t1ös án1t2rak án1tran án2t1ü2l á2n1ud á2n1ug á2n1uj á2n1u2r á2n1u2t án1úr ánú2t án1útj á2n1úto án1útt án1ü2g án1ü2l án1ü2t án1ü2v án1ü2z án1űz ány1adás ány1a2dó ány1agg ány1akc ány1alap ány1alk ány1all ány1anya ány1anyá ány1apá ány1ara ány1ará ány1art ány1assz ány1aszt á2ny1á2l ány1á2ras á2ny1á2rá á2ny1árb ány1árc á2ny1árf ány1árh ány1árk á2ny1árn á2ny1á2ro á2ny1árr á2ny1árs á2ny1árt ány1áru ány1árú á2ny1átl á2ny1á2z ány1ed á2ny1e2g ányegyez1 ány1el ánye2le á2ny1e2m ány1en á2ny1ep ány1eső ány1et ány1e2v á2ny1éd á2ny1ég á2nyéhe á2ny1é2j á2ny1é2k á2ny1él á2ny1é2ne ány1érc. ány1érre á2ny1érte á2ny1érté ányé2r1ü ány1érvé á2ny1és á2nyéte á2nyétk á2ny1étt á2nyéve ányfé2l1é2v á2ny1id á2nyigé á2nyike á2ny1ikr á2nyirat á2nyiro á2nyisk á2ny1isz á2nyita ány1í2ró á2ny1oml á2ny1ont á2ny1o2r á2nyosz ány1ök ány1ö2r á2ny1ös ány1öz á2ny1ő2 ány1tr á2nyug á2ny1ur ány1ut á2nyúto á2ny1ü2 á2ny1ű2 án2zál á1o áo2cs áo2ká áo2ko áo2mo áo2pe áo2so áo2szan áo2sz1e áo2szis áo2sziv áo2szú á1ó áó2ha áó2va á1ö áö2le áö2mö áö2re áö2rö á1ő áő2sz á2p1a2dot ápa1tr ápa3u2 á2p1ág áp1áll áp1áta áp1dr áp1eg áp1e2l áp1e2m ápe2n á2p1e2s áp1e2t á2p1ég áp1é2te ápi2ac ápi2av á2p1im áp1inj áp1int ápi2t á2p1ita á2p1ín á2poll ápo2r1e áp1őr áp2ro áp1t2r á2p1ug á2p1u2t á2p1úr áp1üg áp1üz á2r1abl á2r1abr á2r1abs ár1adag á2radata á2radatá á2radatb 1áradaté á2radatn á2radato 1á2radatr á2radatt ár1a2gá á2r1ajk á2r1a2kad á2r1a2kas á2r1akc á2r1akna. á2raknát á2r1akt. ár1akti ár1aktí ár1alá á2r1alj. á2r1alja. á2raljak á2r1aljá ár1alk ár1all á2r1alm ár1alt á2r1alv 1á2rama. 1áramai 1á2ramá ára2mál ára2m1el ára2m1érté 1á2rami ára2m1in 1á2ramkö 1á2ramok 1á2ramol 1á2ramot 1á2rams 1á2ramu 1á2ramú ár1ana ár1ang ár1a2no á2r1ant ár1a2pá ár1a2pó ár1aps á2r1a2rá á2r1arc ár1a2ri á2r1asp ára2taj ára2tal ára2tav ára2tál ára2t1inf ár1atlé ára2t1ü2 ár1aty á2r1ábr árá2c árá2g ár1ága ár1ágr ár1ágy ár1á2lo á2r1á2p ár1ár. á2r1á2rak á2r1á2rá á2r1árb á2r1árf á2r1á2ri á2r1árk á2r1á2ro á2r1árr á2r1árt ár1á2ru ár1árú ár1árv á2r1ásás árá2szó á2r1á2ta árát1a2d á2r1átá ár1átb á2r1átc á2r1átd ár1á2t1e2 á2r1áté á2r1átf á2r1áth á2r1á2ti á2r1átj á2r1átk á2r1átm á2r1á2tö á2r1átr á2r1áts á2r1átt á2r1átú á2r1átv ár1bl 1árboc ár1br ár2d1ál árd1ell árd1eme ár2d1é2n ár2d1őr ár1drá ár2dud áre2á ár1e2d á2r1e2g ár1ej á2r1e2l árelői3r áre2ma áre2mél áre2n ár1ene ár1eng á2r1e2r ár1e2sé ár1e2ső ár1evé á2r1ex ár1ébr ár1éde á2r1é2g ár1éj. ár1é2je ár1éjs á2r1é2ke á2r1é2ké á2r1éks á2r1é2l á2r1é2ne á2r1ép á2r1éré á2r1é2ri ár1éss ár1ész á2rétk á2r1étr á2r1étt á2r1étv á2r1év. áré2vek á2r1évk á2r1évr ár1fl ár1f2r árgás1s ár1gl ár1g2r ár2gyárv ár2gyir ár2gyol ár2gyó á2r1i2de á2r1i2dé á3r2i3dőtl ár1ifj ári2g á2r1iga á2r1igá á2r1ige á2r1ill á2r1i2má ár1imb á2r1i2mi á2rinas á2r1inc á2r1ind á2r1inf á2r1ing ár1inn á2r1int á2r1inv á2rio á2r1i2paro ári2s1e ár1isko ár1iste ár1i2sza á2r1i2ta ár1i2zo á2r1ír ár1ív á2r1í2z árka1k2 1árkádo ár1k2l 1árkok ár1kré ár1k2v árnás3s árnya2n ár2ny1any árnye2l ár2ny1ele ár2nyelő ár2nyem ár2nyes ár2nyok ár2ny1ol ár2nyos ár2nyö ár2nyü ár1odv á2ro2ká áro2k1e á2rokha á2rokm áro2kol á2r1o2koz á2rokre 1á2roks á2rokta á2r1olda ároma2 áro2maj áro2mak áro2m1al áro2m1as áro2már áro2m1ok áro2m1os ár1opt á2r1o2r áro2sas áro2sál áros3s á2r1ostr á2r1osty ár1otth á2r1o2v áróé2r ár1ó2nét ár1ó2név áró1p2 á2r1ó2rak áró2rák á2r1óri áró1ská áró1s2p ár1ö2b ár1öc ár1ök á2r1ö2l á2r1ön ár1ör á2r1ös ár1öv á2r1ö2z ár1ő2r ár1ő2s 1árpa. ár1pl ár1p2r ár1p2s ár2s1ala árs1asz ár2s1ál ár2sed ár2s1e2l ár2sem ár2s1en ár2ses ár2s1é2g ár2sip ár2sirá árs1okt ár2s1ol ár2sóv ár2s1ön árs3s ár1s2tab ár2sut ársza2ké ár2s3zene ár2tado ár2t1aj 1ártalo árta2n1á2s árt1ará árt1a2ris árta3u2 árt1áll ár2t1árn ár2t1á2ru ár2t1e2g árt1elh árt1eli árt1ell árt1eln ár2t1elő árt1emb ár2t1erk árte2s árt1ese árt1esth árt1eti árt1éle ár2t1érd ár2t1érte ár2tid ár2tif ár2t1ins ár2t1int árt1izg ár2tít ár2t1okta ár2top árt1otth ár2t1ön ár2t1ös ár2t1ura árt1u2sz ár2t1ut 1á2ru. 1á2rua áruá2 1á2ru1b2 1á2ruc á2rud 1áruda 1árudá 1á2rue 1á2rué 1á2ruf 1árugy 1á2rui á2ruj 1árujá 1á2rum 1á2run. 1á2runa 1á2runá á2r1und á2runi 1á2ruo 1á2ru1p2 á2rur 1árura. ár1urá 1á2rus árus3s á2rut 1árut. áru2tal áru2tas 1árute áru1tr áru2tun 1á2ruü 1á2ruv ár1u2z 1á2rúé 1á2rúk ár1úré ár1úrf ár1úsz á2r1úta á2r1útb á2r1úté á2r1úth á2r1ú2ti á2r1útj ár1útl á2r1útn á2r1ú2to á2r1útr ár1úts á2r1útt ár1ü2g ár1ü2l ár1ün ár1ür ár1ü2s ár1üt ár1ü2v ár1üz ár1űr ár1ű2z 1árvác ása2b á2s1abl ás1abo ás1a2dat á2s1a2dá ás1a2do á2s1a2dó á2s1a2já ás1ajtó á2s1a2kar á2s1akc á2s1akv ás1a2la ás1alg ás1a2li ás1alj ás1alk ás1all ás1alm á2s1alt á2s1amb ása2n á2s1ana á2s1anó á2s1ant á2s1any ás1a2pá ás1app ás1apu ás1a2ra ás1a2rán á2s1arc á2s1aré á2s1a2ri ás1art ás1arz ás1asp á2sass 1á2satá á2s1atl á2sato ás1aty á2s1a2u á2s1azo á2sábé á2s1ábr ásá2gai á2s1ágb á2s1á2gig á2s1ágk ás1ágn á2s1á2gú á2s1ál á2s1á2p ás1áras ásá2rét ásáró2 ásá2rón 1á2sásb 1á2sási 1ásásk ás1ásv ás1á2ta á2s1átá ás1áté ás1áth ás1áti ás1átj ás1átk á2s1átl á2s1átr ás1áts ás1átt ás1átv á2s1á2z ás1bl ás1br áscsa2p1á2 ás1d2r ás1e2b á2s1e2d á2s1ef ás1e2gy á2s1e2l á2s1e2m á2s1e2n ás1epi ás1erk ás1erő á2s1e2s á2s1e2t ás1e2v ás1ex ás1ez á2s1é2g á2s1éhe á2s1éj á2s1é2k á2s1é2l á2s1é2ne á2s1ép á2s1ér. á2s1érd á2s1é2re á2s1é2ré á2s1é2ri á2s1érl á2s1érs á2s1érte á2s1érté á2s1értő á2s1érv á2s1é2s á2s1é2te ás1étk ás1étt á2s1é2ve ás1fl ás1fr ás1gl ás1gr á2s1i2d á2s1if ási2g ás1iga ás1ige ási2k1e á2s1ill á2s1imá ás1imp ás1ind ás1inf á2s1ing á2s1ini á2s1int ás1inv á2s1i2p á2s1i2rat á2s1i2rá ás1iro ás1irt á2s1isk á2s1ism ás1ist ás1i2sz ás1ita á2s1iz ás1íg á2s1íj ás1íns ásí2r ás1írá ás1író á2s1í2v á2s1í2z ás1kl ás1k2r ás1kv 1ásnu á2s1ob ásoda2 áso2d1al áso2d1an áso2d1as áso2dau áso2d1ál ás1okl ás1okm ás1okta ás1oldó ás1oli á2s1ont á2s1op ás1o2rá á2s1org á2sori á2s1ork ás1orr á2s1ors á2s1orv ás1osz á2s1o2v 1á2sób 1á2sóé 1á2sóg 1á2sói 1á2sój 1á2sók 1á2són ásó1p2 á2sór ás1ó2rá ás1óri 1ásóró á2sós ás1ó2sá 1á2sót á2sóv á2s1ö2k ás1ö2l ás1ön á2s1ö2r á2s1ös ás1ö2v á2s1ö2z ás1ő2r ás1ő2s á1spic ás1p2l á1s2pór ásp2r ás1ps ás1s2k ás1s2p ás1sr ás1s2t ássz2 ás3szab ás3szag ás3szaka ás3szaké ás3száj ás3szám ás3száz ás3sze ás3szél ás3szf ás3szi ás3szí ás3szk ás3szoc ás3szok ás3szol ás3szor ás3szó ás3szö ás3szt ás3szú ás3szű ás2teg ást1elem ás2tir ás2t1ös ás1t2re ás1tri ás1tróf á2s1ud á2s1uj á2s1u2r á2s1u2s ásu2t ás1uta á2s1utá ás1utó á2s1u2z ás1úr. ás1úrn ás1ú2sz ás1úti ás1úto ás1üd á2s1üg ás1üld ás1üle á2s1ün á2s1ür ás1ü2ve á2s1üz ás1űr ás1ű2z á2s3zac á2sz1a2d ász1aga ász1agá á2sz1agy á2szaj á2sz1akc ász1a2kol á2sz1akt ász1ale á2sz1alk ásza2n á2szana á2sz1ant á2sz1any á2sz1ap ásza2s ász1asz ásza2t1e á2sz1au ás3zavar ász1ágg ász1ágy ász1á2lo ás3záp ászá2r1as ász1á2rih á2sz1á2rú ászás1s á2száta á2sz1áz ász1e2b ászebé2 ászeb1éde ász1e2gé ász1e2gy ász1eln ász1elv ász1emb ás3zene ás3zené ász1eng ász1e2p á2sz1erd á2sz1e2ré á2sz1e2s ász1e2t ász1e2v ász1ex á2sz1éj á2sz1ékb á2sz1é2l á2sz1é2ne á2sz1ép ász1éré á2sz1éte á2sz1étt á2sz1éve á2szid á2szif á2sz1ill á2szind ász1ing ászi2p á2sz1ipa á2sziro á2sz1isk á2sz1ism ász1ist ász1ita á2sziz á2szír ász1k2 1ászkái á2szokl á2sz1okm ász1ors á2sz1osz ászó1s2p á2sz1ö2b ászö2l ász1ölt á2sz1ö2r á2sz1ös ász1övé ász1őr ász1ő2s ász3sa ás3zsu ászt2 ász1tr á2szuni á2szur á2szut ász1ú2s á2sz1ü2g á2sz1ün á2sz1ü2z ász1z át1abr át1a2já át1ajk át1ajt áta1kré á2t1akt. á2t1akto át1alh á2t1alja á2t1alm át1als át1a2lu át1alvá á2t1a2ra á2t1ará á2t1arc át1arz áta2sá át1aut át1azo átá2c át1ág. át1ál átá2p át1ápo á2t1á2rad á2t1á2rai át1áram á2t1á2rá á2t1árb á2t1árn á2t1á2ro á2t1árt á2t1á2ru 1á2t1ásás átá2s3z á2t1átf á2t1átu át1átv át1bl át1br 1átbu át1dr át1e2c át1ej át1ell át1eln át1elv á2t1emb át1eml át1eng áte2rá áteri2 áte2rik át1erő át1ex át1é2d átée2 áté2g át1ége át1égé áté2kaj áté2k1a2l áté2kas áté2ke áték1em áték1es áté2kol áté2k1ü át1é2l áté2p á2t1érb á2t1é2ri á2t1érr á2t1érz áté2t1á2 1átfés át1fr át1gr át2hi. át2hia 1áthid áti2ag áti2al áti2d áti2g á2t1igé át1ill á2t1ing át1i2pa á2t1irá át1isk át1ist á2t1i2ta á2t1izé á2t1izm á2t1i2zo át1íg á2t1í2r át1í2v 1átkel át1kl át1k2r átle2g1 átlege2 átműt2r át1oj áto2kol át1okol. át1o2koz át1okta 2átolj 2átolt át1oml át1ont át1op áto2ran áto2ras áto2rác áto2rál áto2re áto2ris áto2r1ol át1orzá á2t1o2x átói2ko átó1p2 át1óri át1öb átö2l át1ölé át1öml át1ön át1öt á2t1ö2v át1ö2z át1ő2r át1pl át1pr át1ps át2ril át1sk át1sl át1sm át1sp át1sr át1st 1átszű 1átteki át3t2é át1t2r á2t1udv á2t1ug á2t1uh á2t1uj átu2min átu2n á2t1u2r átu2sze á2t1u2t át1új á2t1úr. á2t1úrb á2t1úrh át1úri á2t1úrn á2t1ú2ro á2t1úrr á2t1ú2s á2t1üg át1ül á2t1üt á2t1ü2v át1űr 1átvár 1átvev á1u áu2ga áu2go áu2ná áu2no áu2nó áu2nu áu2sz áu2ta áu2tá á1ú áú2sz á1ü áü2ge áü2gy áü2le áü2lé áü2lö áü2lő áü2lü áü2rí áü2té áü2ti áü2tö áü2tő áü2tü áü2vö á1ű áv1adm á2v1ajk áv1akt áv1alk áv1alt áv1asp áva1st áva1sz2 áva1t2 á2v1au áv1azo áv1áls áv1áte áv1átf á2v1áth á2v1átj á2v1átk á2v1átu ávegész1 á2v1e2l ável1é áv1é2de ávé1dr á2v1é2ri á2v1érte á2v1érté áv1fr á2v1iga á2v1igé áv1ind á2v1inf á2v1ing á2v1int á2v1i2rá á2v1iro á2v1i2si áv1isk áv1ism áv1izm áv1izo áv1ír á2v1ob á2v1olv á2v1op á2v1osz áv1órá áv1ör áv1ös áv1öv áv1őr áv1pr áv1sk áv1sp áv1st áv1tr á2v1ug á2v1ur á2v1ú2sz ávú2t á2v1úti á2v1úto áv1üg áv1ü2z á2z1abl áz1abs áza2dal áza2d1e2 áza2dott áza2dü áz1ajt áz1akc á2z1a2kó á2z1akt. á2z1akta áz1aktá á2z1aktu áz1a2lap á2z1a2le á2z1alk áza2n á2z1ana á2z1ano á2z1any á2z1a2p áz1a2rá áz1arc áz1arm á2z1assz á2z1aszt áza2t1a2l áza2tan ázate2 áza2t1el áza2t1ér. áza2t1érv áza2tés áza2tik áza2tí áz1aty á2z1a2u á2z1á2g á2z1á2l á2z1á2rai á2z1á2rak á2z1á2ram á2z1á2ras á2z1á2rat ázá2rár ázá2rát á2z1árb á2z1árc á2z1árd á2z1á2ré áz1árf á2z1á2ri á2z1árjáb á2z1árjáv á2z1árka á2z1á2rokk á2z1á2rokr á2z1árp á2z1árrá áz1á2runkn áz1á2runkr ázá3rus. ázás3s á2z1á2ta á2z1á2t1á áz1átb á2z1á2t1e2 á2z1áté áz1áth á2z1átr áz1áts á2z1átü á2z1áz áz1bl áz1d2r áz1ef áz1e2g áz1e2m áz1ep áz1e2r áz1e2s áz1e2t áz1ex áz1e2z á2z1ég á2z1é2l á2z1é2p á2z1ér. á2z1érő á2z1érte á2z1érté á2z1értő á2z1érz á2z1é2te á2z1éve áz1évi áz1fl áz1fr áz1g2r á2z1i2d á2z1igé á2z1i2kon á2z1ill á2z1imá á2z1imi áz1imp á2z1inf á2z1ing á2z1inj á2z1int á2z1i2par áz1irá áz1iro ázi2s1e ázi2sir ázi2s1í2 ázis3s ázi2s1ü ázi2szó ázi2z áz1izm áz1izo áz1íj áz1í2v áz1k2l áz1k2r á2z1olda á2zoltal á2z1oltó áz1oml á2z1ont á2z1o2r á2z1osz ázói2ko áz1ól. áz1ó2rá á2z1óri ázó1s2p ázó1sz áz1öb áz1öd áz1ö2l áz1öm áz1ön áz1ös áz1ö2t áz1ö2v áz1öz áz1ő2r áz1pl áz1p2r á2zsab á2zs1a2d á2zs1a2g ázs1ajt á2zs1akn ázs1ala ázs1alk ázs1all á2zs1amu ázs1any á2zsar ázs1ará á2zsat á2zs1au á2zs1áll á2z3sár. á2zse áz3seb ázs1e2c ázs1ef ázs1eg ázs1e2l ázs1e2m ázs1es á2zséj á2zs1é2k ázs1éne á2zs1ére á2zs1éri ázsé2t ázs1éte á2zsia á2zsiá á2zside ázsi2g á2zs1iga ázs1igá á2zsige á2zsimm á2zs1ing á2zs1int á2zsinv á2zsió á2zsip ázs1isk á2zs1ita á2zsiz á2zs1í2 áz3sor áz3sóh ázs1ó2r á2zsö á2zs1ő2 ázs1s á2zs1uj á2zs1ut á2zsúto á2zsü ázs1ü2v á2z3sű áz3szá ázs3zon áz1t2r á2z1ud á2z1ug á2z1uj á2z1u2r á2z1ut á2z1új á2z1úr á2z1ü2g ázü2l áz1ür áz1ü2z ázy1i áz3zse 2b. 1ba baa2d ba2b1a2dat ba2b1ajk baba1k2 ba2b1ara ba2b1arc ba2b1aszt ba2b1ábr babá2c ba2b1ácsi ba2b1ág bab1áll ba2b1á2ro ba2bátv ba2b1érc babé2t bab1éte ba2bév ba2bik ba2b1i2na. ba2bola bab1old ba2b1ó2r ba2b1ult ba2bü ba2c3hu ba2csor 2b1a2dag ba2das 2b1a2dato ba2d1ár ba2deg ba2d1e2s ba2dog 2badomá ba2dód ba2dói ba2dój ba2dók ba2dót ba2duj ba2dús baegész1 bae2r baé2r ba1fl ba1f2r ba2gai ba1g2n ba1g2r 2b1agy. bai2z ba2jag ba2j1á2ru ba2j1á2to 2bajkú ba2j1ó2r ba2jü ba2jű ba2k1a2pó 2bakas ba2kaszt 2ba2kác bak1á2cs bak1áll 2bakc ba2keg ba2k1ér. ba2k1éri bak1k ba1k2li ba1klu ba2k1o2v ba1k2ri bak1t2 2b1aktu baku2r bak1ura bak1urá ba2ky 2b1alany 2b1a2lál ba2l1e2s ba2l1í bal2lak bal2lan bal2lál bal2l1ás bal2láz balle2 bal2leg bal2l1el bal2lem bal2les bal2l1é2l bal2lin bal2lór bal2té bal2tiz ba2lud 2b1amp 2banal 2b1a2nat banás3s ban2c1e banc3s 2b1angy ban2kab ban2k1a2d ban2k1a2l ban2kar banke2 ban2ker ban2kép ban2kérd ban2kir ban2kol banku2 ban2kut ba2nyó bao2k bao2l baó2r ba1p2l ba1pro 2b1arc. 2b1arcé 2b1arcn 2b1arco 2b1arcr bar2csad bar2csal bar2csan bar2csö 2b1arcú 2b1argu baro2ma 2b1arté baság1g ba2seb ba1slá ba1s2m ba1sni 2b1aspe ba1s2pó bas3sze ba1s2ta ba1s2tá ba2t1esti ba1t2rá ba1tre ba1tré ba2ud 2b1a2ul bau2r 2b1a2vat ba1yi 1bá bá2bal bá2b1ass bá2bál bá2b1es bá2bik bá2bö bá2b1ü bá2csor bá2csü 2b1á2ga b1á2gú bá2gyal bá2gyar bá2gyott bá2gyö bá2gyú bá2j1e2 báj2n1á bá2j1ó2 bá2j1ö2 báj2t1a2k bá2jü bákos1 bá2laj bá2l1ap bá2l1e2 bálé2 bá2l1éj bá2lid bá2l1ing bá2l1i2o bál2is 2b1állí 2b1állo 2b1állv 2bálm bá2lö bá2lü bá2lyad bá2ly1al bá2ly1a2n bá2ly1á2z báni2as bán2ré bánya2ié bá2po 2b1á2rad 2b1á2rai bá2r1aj 2b1á2ram bá2rap bá2ras 2bá2ra2t 2b1á2ráb bá2rág bá2rár bá2r1ás 2b1á2rát bár2das bár2d1á bár2de bá2r1e bá2rén 2b1á2riá bár1i2o bá2r1i2p bá2rí 2b1árny bá2r1ó2né. 2báru. 2báruf 2b1á2rug 2b1á2ruh 2b1áruj 2b1á2ruk 2b1árur bár1u2ra. 2bárus 2b1árut 2báruv 2bárú bá2rúr bá2rü bá2s1á2ré bá2se bá2sis bá2sz1ak bá2szan bá2szas bá2sz1ál bá2sz1á2ru bá2sze bá2szil bá2szip bá2szí bá2szö bá2szü bá2t1a2k bá2t1al bá2t1á2 2b1á2t1e2 bá2tö bá2tü bb1a2da bb1add bb1a2kas b2b1alk b2b1als b2b1alu b2b1alv b2b1a2ny b2b1ap b2b1a2ra bba2t b2b1au bbá2gyas b2b1áll bb1álm b2b1áp bb1árn bb1á2ru b2b1á2s b2b1át bb1dr bbe2g b2b1e2kén b2b1elv b2b1emb bb1eng bb1erj bb1ern bb1erő bb1e2rű bb1esté b2b1etn b2b1ex b2b1ég bb1él. bb1éle bb1élh bb1élj bb1éln bb1élt bb1é2lű bb1élv b2b1ép bb1érl b2b1érm b2b1érte b2b1érté bb1érv b2b1évi bb1fr bb1i2de b2b1iga bbigaz1 bb1illa b2b1ind b2b1int b2b1inv bbi2tat b2b1itt b2b1í2r b2b1ív bb1kl bb1kr b2b1okt bb1oltá b2b1olv b2b1op bb1ott b2b1ób bb1ó2r b2b1ö2m bbö2r bb1örö b2b1ös bb1őri bb1őrz b2b1ő2s bb1pl bb1pr bb1sk bb1sp bb1st2 bb1t2r b2b1ud b2b1u2g b2b1uj bbu2r bb1ura b2b1u2t bbúgás1 b2b1új b2b1ú2s b2b1üg b2b1ür b2b1üz bb1ű2z bb2ví bc3sz bda2cs1a2pá bda1d2 bda1p2 bda1s2 bdasz2 bda1t2 bdé2n bd2rá bd2ro bd2ró 1be be2ac bea2d bea2j bea2k bea2l bea2n bea2r bea2s bea2t1e be2ati bea2tin be2atk be2atl bea2v beá2j beá2s beá2z be1bl be1b2r be2csar be2csár be2csért be2cs1é2te be2dén be2dz bee2l bee2s beé2r be1fl be1fr begés3s begész1 be1g2r be2gyel b1egyl bei2g bei2s beí2r be2j1elt 2bejt 2b1e2ke. beke2csa 2b1e2kétő be1k2ré be1kri be1kró be1k2v be2lál beleí2 bel1els be2lemz bele1p2r belet2 bele1tr be2l1é2k be2l1ér. be2l1é2ren be2l1érr be2lí be2lof be2löl 2b1e2lőa be2lőr bel1p2 2bemel 2b1eml b1e2mus be2n1ál be2n1ék ben2n1a2 ben2ná ben2n1e2r ben2nég be2ny1e2g beo2k beo2l beo2m beó2v beö2r be2pe. be2ped 2b1e2pé be1p2l be1p2r be2r1ad ber1alá ber1all bera2n ber1any be2r1a2p be2r1a2r ber1ass be2r1a2t be2r1av be2raz be3rág ber1áll b1erdei 2berdő ber1egé ber1egy be2r1e2ke. bere2k1eg be2r1ekék be2r1ell be2r1elm be2relődö be2r1előn be2r1e2mé be2r1eml be2r1e2pé be2r1e2r ber1e2szü be2r1e2tet be2rég be2r1ékk ber1éss ber1ingü be2rism be2r1ist ber1iszo ber1old be2ror ber1osz be2ról be2r1ó2r be2rő 2b1erőd ber1ős. ber1ő2se ber1ő2si ber1ő2sü ber3s2 berta2n1á2s be2r1ub be2r1un be2rur be2r1ut be2r1ü2g berü2l be2r1üld be2r1ülé be2r1ült be2sem 2b1esél 2b1e2sés be1ska be1ská be1s2l be1s2m 2b1e2ső be1s2p2 bessz1a bessz1á be1s2ta 2beste 2besté be1s2til be1sto 2b1e2szet 2b1e2szét b1eszm besz2t1a2 besz2t1á beteg1ér. beté2t1elb beté2telk be1t2hi be1t2ra be1trá be1t2ré be1t2ro beu2g beu2t beü2t be2vező 2b1e2vol 2b1e2vő 2b1ezr 1bé 2b1ébr bé2csú bé2d1as bé2d1á 2bédé 2bédh 2bédj 2bédl bé2d1o bé2dö 2bédr 2bédü 2bédv bé2gő bék1alk 2b1éksz bé2l1akt bé2l1a2n bé2l1a2p bé2l1a2r bé2lál bé2l1áto bé2l1á2z bé2l1ed bé2l1e2g bé2lek bé2l1e2r 2b1é2let bé2l1é2j bé2liz bé2lí 2bélj bé2l1o bé2ló bé2lö 2b1é2lő bélt2 bél1tr bé2lul bé2lú bé2ly1ec bé2l3yen bé2lyin bé2lyö bé2pí bé2pü 2b1é2rai bé2r1aj bé2ral bé2r1a2n bé2rap bé2rar bé2rá 2b1éráb 2b1éráh 2b1éráv 2b1érde bé2reb bé2r1eleme bé2r1e2lemé bé2r1e2lemh bé2r1e2lemk bé2r1e2lemn bé2r1e2lemr bé2r1ell bé2relm bé2r1elői bé2r1eng bér1essz bé2r1esz bé2r1id bé2rir bé2rí b1érni bé2rö bér1s bért2 2bértel 2b1értés bér1tr bé2rut bé2rú bé2sz1a2 bé2szá bé2sz1o béta1s 2bétel bé1t2h 2b1étk 2b1étt 2b1év. bé2vek 2b1é2ven 2b1é2ves bé2vet bé2vi. 2b1évn bé2zsú bfej1els bfe2len bfé2n bf2la bf2rá bf2re bf2ri bf2ro bg2ra bg2rá bgyökö2 bgyö2k1öl 1bi bia2d bi2ae bi2ag bia2la bia2v bi1br bi1by bic3sz bida2 bi2d1ad bi2d1al bi2deg bi2del 2b1i2dő bi2ed bie2l bi1fr bi2gaz 2b1i2gáj 2bigén 2b1i2hat bik1ala bi2k1ál bi2k1em bi2kik bi1klu bi2k1ő2 bi1k2ro bik1s bil1ima bil1int bilis3s 2billé 2b1illő 2billu bi2lü bi2ma. 2b1i2mi 2b1imp bi2nab 2b1i2nad bi2naj 2b1i2nat. bi2n1árb 2b1indá bi2n1éte 2b1inká bin3n bi2nü bi1ny bi2oa bi2oá bi2ob bi2oc bi2od bi2oe bi2oé bi2of bi2oge bi2ok bi2ol bi2om 2b1i2on bi2or bió2r bi2par bi1p2l bi1pr 2b1i2ram 2b1i2rat 2b1i2rán 2birkái 2birodá 2b1irr 2b1irtá 2b1irtó bis2hi 2b1i2si 2bism bi2sö bi1s2p bis3s bi1s2to bit1ará bi2t1e2g bit1elh bit1elr bit1elt bite2r1a bi2t1ing bi2t1int bi2t1i2o bi2t1on bit1t2 bit1ura bi2t1ut biú2s bi2var 2b1i2vás 1bí bí2ja bíróé2r bí2ve bí2vé bí2vű 2b1í2zü bkés3s bk2li bk2lu bk2ra bk2rá bk2re bk2ré bk2ri bk2rí bk2ro bk2ró 1b2labl blai2k blak1a2d bla2kal bla2k1an bla2k1átm bla2k1átt bla2kem bla2kik bla2k1ol bla2kü blap1e bla1p2l bla1s2t blás1s bl2be ble2r1i bles2 ble2t1ak ble2t1a2n ble2t1á2 ble2t1e2l ble2ter ble2tesz ble2tél ble2t1érd ble2t1étk bletigaz1 ble2t1o ble2tó ble2t1ö2 ble2tu ble2tüz bleü2 bleves1s bl2he bli2af bli2as bli2of b1ljana bl2ne 1b2lok blok2k1ö2 blo2n1á blon3n b2l1őzé bl2re bl2rő bl2tő blu2esz 1bo bo2aá bo2ab bo2ad bo2ae bo2af bo2ah bo2aj bo2am bo2ar bo2at bo2av bo2c1ak bo2ce bo2cé bo2c3h bo2csé bo1dy bo2ei bo1fl bo2g1a2k bo2g1a2t bo2g1á2c bogás1s bo2g1e bo2g1osz bogó2szá bo2gyo boka1p 2b1o2kí b1o2koz bok2szak bok2szal bok2sz1ál bok2szel bokszé2 bok2szél bok2sz1in bok2szó bok2sz1ő 2b1okta 2bolaj. bolás1s 2b1oldó 2b1o2lim bolo1g2 bol2t1e bol2t1ö2 bol2t1ü2 2bolvas bona1 bon1ava bon2can bon2c1e bon2ch 2bond bo2n1e2 bo2n1ér. bo2n1or bon2t1i bo2nü bo2og bo2ok bo2om bo2ot bo2pe bo2r1a2d bo2r1aka bor1akk bo2r1akv bo2r1a2l bora2n bor1any bo2rar bor1asz bor1atr bo2r1au bo2r1av bo2raz bor1ács bo2r1áll bo2r1áz bor1d2 bo2re bor1e2c bor1el bor1e2r bor1es bor1f2 borfi2úké bo2r1i2ko bo2r1il bo2r1ing bo2r1int bo2r1isk bo2r1iss bo2r1ist bo2r1itt bo2r1iz bor1k2 2b1ornam bo2r1ond bo2r1ó2r bo2rö bo2rő 2b1orr. 2b1orrú bor2s1eprű bor2sors bor1str bor2sül bor2süt bor1tre bor1tré bo2rü borvíz1 bor2z1á2rak bor2zsa bor2z3se 2b1oszt bo2t1a2g bo2t1al bo2tar bo2tas bo2t1a2u bo2t1ác bo2tár bo2t1e2 bo2t1il bot1inf bot1int bo2t1i2p bo2tí bo2t1ó2 bo2tö bo2tur botú2 bo2túr bo2tü bo2tű bo2ui bo2ul bo2ur bo1ya bo1yá bo1yé bo1yi bo1yo bo1yu bo2zar bo2zál bo2z1e2 bo2zid bo2z1i2p bo2z1ir bo2zí bo2z1old bo2z3s bo2zü bo2zű 1bó bóa2d bóá2g bóá2r bó2bé bó2cal bó2ch bó2cü bó1fl bó1kré bóli2a b1ólm bó1p2l bó1p2r bó2r1ad bó2r1an bó2rat 2bórá bó2rás bór1ásv bó2reg bó2rel bó2r1in bó2riz bó2r1ol bóró2 bó2rós bó2rö bórt2 bó2rü bó1s2p bó1sz 1bö bö2ch bö2lá 2bölb böl2csü 2b1ö2lér 2bölhö 2bölig 2bölk b1ölkú 2bölr 2b1öltö 2böltő bö2lú bö2lyökö b1öml bö2ná 2b1önt bö2ra bö2r1e bö2ro 2b1össz 2b1ötl 2b1öts bö2ve 1bő bő2r1a2 bő2r1á2 bő2r1e2g bő2r1e2l bő2r1em bő2r1en bő2r1e2r bő2r1é2g bő2rék bő2r1és bő2ril bő2r1ing bő2rip bő2r1i2s bő2riz bőr1izg 2bőrl bő2r1o2 bőr1öl bő2rő bőrren2 bőr1s2 bő2r1u bő2rú bő2r1ü2g bő2r1ü2l 2bősi bp2la bp2lá bp2le bp2re bp2ré bp2rí bp2ro b1proj bp2ró bra2k1á2 bra2kös bra1p2 1braty brá2nag brá2nas brá2n1át bránt2 brá2sz1ál brá2sze b2ric bri2da bri2dá bri2der 1b2rig bri2no bri2ód bri2óf bri2óm bri2tel b2rosú bró2m1a bró2me 1b2rum bsé2g1el b1s2ká bs2lá bs2pe bs2pi bs2po bs2ta bs2tá bs2ti bs2tí bs2tú bszá2r1a2da bsz2f b1sz2k bsz2tá btermo1 btermosz2 bt2rá b1t2re bt2ré b1t2ri b1t2ro b1t2ró 1bu bu2ch 2b1udv bué2r bu2g1i2 bu2il 2b1ujj. 2bujja. 2bujjad buj2j1a2da 2bujjai 2bujjak 2bujjam 2bujjas 2bujjat 2b1ujjá 2bujjb 2bujjc 2bujjd 2bujje 2bujjé 2bujjf 2bujjg 2bujjh 2bujji 2bujjk 2bujjl 2bujjm 2bujjn 2b1ujjo 2bujjp 2bujjr 2bujjs 2bujjt 2bujju 2bujjú 2bujjv buk2j1e bu2maj bu2mel bu2m1i2k bu2m1ina bu2mis bu2mol 2b1ural b1urb 2burn 2b1u2rú bu2se bu2sin bu2sol bu1s2p bus3sze bu2szab busz1aj bu2szal bu2szas bu2sz1ál bu2sz1á2rak bu2sz1árn busz1en bu2sz1él bu2sz1é2p bu2szid bu2sz1il bu2szim bu2szin bu2szip bu2sziz buszí2 busz1íj busz3s bu2szü 1bú bú2jí 2búr. 2b1ú2ri 2búrt 2búsz bú2szá b1ú2ti b1útm 1bü bü2dü bü2ge bü2gy bü2ku 2b1üld bü2l1é2n bü2ne 2bürü 2b1ü2te 2b1ü2té b1ü2tő 2b1ü2ve bü2ze 1bű bű2na bű2ná bű2nel bű2nem bű2nes bű2n1e2t bűn1n bű2no bű2nó bű2n1ő2 bű2nu bű2nű bű2ri bű2v1e2 bű2z1a2 bű2z1á bű2zo bű2z1ő bű2z3s bvá2nyad bvá2nyí by2te 2c. 1ca 2c1abl ca1b2r ca2cél ca2ch ca2dás 2c1a2dó ca2es caéne2 ca1fro 2c1agg ca2gya cagy1a2d ca2gyu 2c1ajk 2c1a2kad ca2kác ca2k1áz 2c1akc cak2kol cak2k1ö ca1kri cala2g1 ca2lan ca2l1a2s 2c1albu ca2l1este ca2l1é2l calé2t cal1éte ca2lim ca2l1ip cal1osz cal1p cal1s ca2lü ca1ly ca2nal ca2nar 2c1a2ni can2ne caó2r ca2pó ca1p2ró ca1p2s ca2ran ca2rán 2c1arc ca2ris ca1s2p 2c1assz cast2 ca1sto ca1str 2c1aszt ca2tau ca2tem 2c1atl c1a2uk cau2n ca2vat 2c1a2zo 1cá 2c1ábr cá2ga cá2gú cá2gy cá2la c1állá 2c1álm cá2ne cá2nét cá2nir cá3p2a3 2c1á2po 2c1á2rad 2c1á2rak cá2r1as cá2ria cá2riá cá2r1i2n 2cárk 2c1árp 2cáru. 2c1á2ruh 2cárus cá2sás 2c1á2só 2c1ásv 2c1á2szai 2c1á2szo 2c1á2t1a2 c1áth 2c1á2t1i2 2c1átm 2c1átr 2c1átt 2c1á2tü 2c1átv cb2lo cb2ra c2c1a2j c2c1ak cc1alb cc1a2ny c2c1a2r c2c1au c2c1ág c2c1ál cc1bl cc1ef c2c1elm c2c1ember c2c1ép c2c1ér. c2c1érte cc3he cc3hí c2c3ho cc3hő cc3hú c2c1i2m cci2na. cc1ing cci2óv cc1i2pa cc1iro c2c1i2z cc1ír cc1kl cc1k2r cc1oá c2c1ov cc1ön cc1ös cc1öz cc1pl cc1pr c2cs c3csap c3csar ccs1as c3csat ccs1ál c3csáp ccs1ás ccs1átl ccs1eg ccs1elem ccs1ell ccs1elv ccs1embe ccs1eml c3csep ccs1él ccs1érté ccs1iv c3csop ccs1ork cc3soro ccs1ö2l ccs1önt ccs1s ccs1ut c3csú c3csű cc3sza cc3szá ccs3zen cc3szó cc1új c2c1üg cc1ür cc3zá cc3ze cc3zs cda2l1é2 cda2l1i cde2m1e2ké cde2m1el cd2ra cd2rá 1ce cea2l ce2at ce2au ceá2r ce2béd ce1bl ce2ch cec3he 2c1e2dz ce2gas ce2g1é2k cegés3s ce2gina ce2gor ce1g2rá ce2gu ce2gú c1egy. c1egyb ce2gyen c1e2gyi c1egym c1egyr 2c1egys 2c1e2ke. ce1kl 2c1elad 2c1e2lág cel1ér 2c1elf 2c1elha 2c1eljá 2c1e2los c1e2lőa 2celődöt. 2c1e2lőf 2c1e2lőí c1e2lőő 2c1első 2c1eltá c1elto 2c1elvá 2c1e2melő 2c1eml cenc1c cen2c1eg cen2c3s 2c1eng cen2s1ég cen2tau ceo2l ceo2r 2c1e2pe. 2c1e2pi ce1p2r cep2sz1a2 cep2sz1é2p cep2szi cep2t1a2 cep2t1ér. cep2tim cep2t1ol 2c1e2rej ce2róz 2c1e2rő cer2t1a2 certá2 cer2tár cer2teg cer2t1e2l cer2t1emb cer2t1est cer2tél cer2t1én cer2t1ol cer2t1ö cer2tu certü2 cer2t1üz ce2sem 2c1e2sés 2c1e2ső ces2t1é2j ces2t1ék ce1stra ce2t1e2g ce2t1essz ce2t1esz ce2t1é2t 2ceth cet1ill ce2t1i2n ce2tiz 2cetn 2ceton ce1t2ra ce2t1us ce2tűd cetű2z ceü2t ce2vés ce2vő 2c1e2zer 2cezrede 1cé 2c1ébr cé2dél cé2g1a2 cé2g1á2 cé2g1eg cé2g1e2l cé2ge2r cég1ere cég1eré cé2g1esem cé2geté cé2gető cé2g1ék cé2gép 2c1é2gés cég1g cé2g1i2d cég1iga cé2gigé cé2gim cé2gir cé2g1iz cégo2 cé2g1ok cé2gol cé2gó cé2gö cé2g1u2 cé2gú céha2 cé2hal cé2han cé2har cé2hed cé2h1e2g cé2hir cé2hu cé2hú 2c1éks cé2la cél1a2n cé3lap cél1a2r cé2láb cé2lál cé2l1á2r cé2l1á2t cé2le. cé2led cé2leg cé2lei cé2lek cé2l1e2l cé2lem cél1emb cé2len cé2l1er cé2l1e2s 2c1é2let 2c1é2lez cé2léb cé2l1é2k cé2lénk cé2lép cé2lére cé2lés cé2lim cé2lin cé2lir cé2l1is cé2liz cé2lí cé2ló cé2l1ö2 cé2l1ő2 célt2 cél1tr célu2 cé2l1ut cé2lü 2c1é2lű cé2pí cé2pü cé2rag 2c1érd 2c1é2rés cé2rin 2c1érint cé2ris cér1s 2c1érté 2c1értő. cé2rú 2c1érz cés3s 2c1észh 2c1étk 2c1étt 2c1év. 2c1évad 2c1é2ve. 2cévei 2c1é2vek 2c1é2ven 2c1é2ves 2c1é2vet 2c1é2vét cé2vi. 2c1évn 2c1é2vü cf2ló cf2ra cf2ri cf2ro cg2ra cg2ri c2h 1cha c3had 2c3haj 2cham 2chang 2c3harc 2charm 2chatá 2c3hav 1chá 2c3hám c3hány c3ház ch1bl 1che 2c3heg 2chev 2c3hez 1ché 1chi 2c3hib 2c3hió 2chitel 2chitet c3hiú 1chí 1cho cho1d2 2c3hor 2c3hoss 1chó 1chö 1chő ch1pr ch1sc ch1sp 1chu chu2r 2c3huz 1chú 1chü 1chű 1ci ci2aa ci2aá cia1b2 ci2aba ci2abo ci2abr ci2ac ci2a1d2 ci2ae ci2aé cia1f cia2fag ci2afr ci2a1g2 ci2ah ci2aik ci2aí ci2aj ci2akar ci2akas ci2akén. ci2akó ci2ala ci2alá ci2ale ci2alé ci2alo ci2am ci2any ci2ao ci2aó ci2aö ci2aő ci2a1p2 ci2ar ci2asza ci2aszá ci2aszé ci2aszo ci2aszó cia1t2 ci2ata ci2atá ci2até ci2ato ci2atű ci2au2 ci2aú ci2aü ci2aű ci2av ci2az ciá2lan ciá2nár ci2áó 2c1i2deg ci2deo 2c1i2dé 2c1i2dom 2c1i2dő cie2r 2c1ifj 2c1i2ga. 2c1i2gaz ci2ge. ci1g2r ci2ker cikka2 cik2kaj cik2kan cik2k1o ci1k2la 2c1ikrá ci2l1á2t 2cillu ci2mit 2cimpu ci2n1al ci2n1árt cin1d2 ci2n1e2re 2cinf 2c1inge 2c1ingr ci2nim cin2kac cin2k1a2l cin2kért cin2kol cin2kors cin2kö ci2nö cin2tar cin2t1es cinus1s ci2nü 2c1inv ci2od ci2of ci2og cio1gra ci2oi ci2ol ci3olo 2c1i2onn ci2op cio2v ci2óa ci2óá ci2óc ci2ódar ci2óe ci2óg ci2óí ci2ókal ci2ókam ci2óká ci2óke ci2ó1kl ci2ókom ci2ókos ci2óku ci2ól ci2ómag ci2ómá ci2óné ci2óo ci2óó ci2óö ci2óő ci2ó1p ci2ósá ci2óse ció2s1ér ci2ó1s2ká ci2ószo ci2ótá ci2óú ci2óü ci2ózón ciő2r ci2rat 2c1i2rán 2c1i2rod 2c1irt ci2si. 2c1isko 2c1ism 2c1isp ci1stad ci2sz1i ci2t1aj citá2r cit1ár. cit1ára cit1áré cit1áro cit1érr ci2tik ci2t1ol ci1ty ciumi2 ciu2min ciu2m1io ciumköz1 ciu2t 2c1i2vad 2c1i2vás 1cí cí2ja cí2jé cí2m1a2 cí2m1á cí2m1e2l cí2m1é2l cí2mí cí2mo cí2mö cí2mő cí2mu cí2rá cí2ró cí2vá cí2ve cí2vé cí2zs cí2zü ckaka2 c2k1alj c2k1arc cka2rom c2k1ág ck1áll c2k1árn c2k1e2g cke1p 1cker. 1ckerk 1ckern cké2p1e2l c2k1é2ré c2k1érl c2k1érté ck1fl ck1fr ck1ill c2k1íz ck1kl ck1k2r ck2lu c2k1o2la ck1o2pe c2k1orro c2korru c2korrú 1c2kosak c2k1ou c2k1öb ck1öss ck2reá c1k2ri c1k2rí ck1sp c2k1üg ck1ült c2k1üt c2k1ü2v ck1űr ck2va cli2s clu2b1a cmelo1 cnya2k cnyol2c1an 1co co2at co2áz co2be co2eu co2kar co2ká co2ke co2kél co2kép 2c1o2kí 2c1o2laj co2l1áro 2c1olda 2c1oldá 2c1oldó co2le co2l1ibr co2li2m col1ima co2l1i2na. co2l1ind co2l1ing co2l1inu co2l1o2r 2colvad 2colvas comba2 com2bal com2b1e2 com2biz com2bol com2bór com2bö 2c1oml co2ol 2c1o2pe cop2f1ő co1py 2c1orc 2c1o2ri 2c1orm c1o2rom 2c1orro 2c1orrú 2corv 2c1oskol co2s1o2ku cos3s cos3zs 2c1oszt co2ul co2un co2uv co2vi 1có c1ó2ni 2c1ó2rá c1ó2ri có2vó 1cö c1öltö c1ösv c1ösz c1ötb c1ö2t1e c1ö2té c1ötf c1öth c1ö2ti c1ötk c1ötm c1ötn c1ötr c1öts c1ött c1ö2tü c1öv. cö2zö 1cő cő2rü cp2la cp2ra cp2re cp2ré cp2ri cp2ro cp2ró c2s 1csa 2csabl 2cs1a2dat 2cs1a2dá 2cs1a2dó 2cs1akc csa2lakj csa2lapú 2csaláí 2csalát 2csalb 2cs1alg 2cs1alk cs1alle 2cs1alm csa2lomb cs1amb 2csant csa2pál 2csapka 2csapká csa2por 2csapóká 2csapókr 2csapósab 2cs1arc 2csarg 2csark 2cs1arz 2cs1ass csa2t1ó2r csavar1a2 cs1azo 1csá csá2be 2csáf 2cság cs1á2gak cs1á2gu 2cs1árad 2cs1á2rak 2csáram 2csárat csá2rát 2cs1árny cs1á2ruk 2cs1ásá 2c3sási 2cs1ásó 2csátásás 2csátf 2csátm 2csátr 2csáv. 2c3sávo cs1bl cs1br cs1d2r 1cse 2csebé cs1e2ce cse2csa 2cs1e2dé 2cs1edz cs1eff cs1e2ges 2csegí 2cs1e2ke. 2cself 2csellá 2cselőí 2cselta 2cseltá 2cselv. 2c3sely 2cs1ember 2cs1e2mel 2cseml 2csemu csen2d1ő2 cse2nis cse2n3yen 2csenz cse1p2ré cse2rál cse2r1e2ped 2cseró 2cserő 2cseső 2cseszm cse2tüz 2csevő 2cs1ex 1csé 2cség c3ség. c3ségb c3ségg c3ségh c3ségi c3ségn c3ségr 2cséhes 2cséhs 2cs1é2ka 2cséks 2cs1éle csé2m1a 2csénekb 2cséneke 2cséneké 2csénekk 2csénekr 2cséneks 2csénekt 2csénekü 2csépí 2csépü 2csérde csé2résk 2c3sérv. 2csérvb 2csérvh 2csérvr 2csérvv 2csérz csé2sza csé2tab 2csév. 2csévek 2csévn 2csévr 2csévv cs1fr cs1gl cs1gr 1csi csiá2 2csidő 2csigé 2csimí 2csimog 2csimpo 2cs1i2na. 2csinas 2cs1ind 2cs1inp 2cs1inv 2csiono 2csipí 2csiví 2csivó 1csí 2csíki 2c3sírb 2c3sírj cs1í2ró 2cs1í2v 2csíze 2csízl cs1ízn 2csízt cs1ízü cska1s cskasz2 cs1kl cs1kv c3slág 1cso 2cs1o2á 2csobj cso2k1á 2csokk. 2csokoz 2csolaj 2csolda 2csoldá 2csoldó. 2csoldók 2csoldóm 2csoldón 2csoldór 2csoldót 2csoldóv 2cs1oli 2csolló 2csolvas cso2mor cson2t1a2 2csopc 2cs1orc 2csori 2csork 2c3sorv 2csoszl 2csoszt 1csó cs1ódá csó2kes csó2k1ö2 2cs1óné 1csö 2csökrü cs1öml csön3n 2csör. c3söre 2csössz 2csöv. 2csözön 1cső 3cső. 3csőb csőé2h 2csőrz cső2sz1á2ra cső2szék cső2sző 3csőv c3s2pek cs1p2l csp2r cs1ps cs1sl cs1s2p cs1s2t cs3sz2 cssza2kü c3s2tab cs2top cst2r c3stru 1csu 2csudv 2csug 2c3suho cs1ujj 2cs1una 2csuni 2cs1ura 2cs1u2rá cs1u2tas 2cs1utá cs1utó 1csú csú1p2 2csútn 1csü 2csüd 2csügé 2csügy 2cs1ünn cs1ü2te 2c3süv 2cs1üz 1csű c4s3zac cs3zaj csza2ké cs3zam c3szál c3szám cs3záp cs3zát c3száz c3sz2c c3szer c3szé c3sz2f c3szi c3szí c3sz2l c3szob cs3zokn c3szol cs3zon c3szor cs3zón c3sző cs3zs csz2t cs3zug cs3zú c3szü c3szű c3sz2v ct2ra ct2re ct2ré ct2ri ct2ro ct2rü 1cu cucci2 cuc2cin cuko2r1a cula2te cu2lü 2c1und 2c1u2no 2c1u2ra 2c1u2tá 1cú cú2jí c1úr. c1úrr c1ú2ti cú2to 1cü cü2ge cü2gy 2c1ü2lé cü2lő c1ünn cü2re cü2rí cü2rü cü2te cü2té cü2tő cü2ve cü2ze 1cű cű2ző cva2nem cva2név cve2név cven3n c2z 1cza cza2ib cza2ié cza2ih cza2ik cza2in cza2ir cza2it cza2iv 1czá 1cze 2c3zen 1czé c3zéh 1czi 1czí 1czo 1czó 1czö 1cző 1czu 1czú 1czü 1czű 1czy 2d. 1da daa2d daát1 2d1abla da2c1ir da2cz da2dag dad1ala 2dadato 2d1a2dó da1drá da1dro dae2r daé2d daé2r da1f2l da1f2r da2g1el dag3g 2d1ahh da2ire 2d1a2ján 2d1ajt 2d1a2kad daká2r 2d1akkora d1akku da1kl da1k2ré da1k2ri 2d1aktu dal1a2ga dal1ajt da2lakj da2l1akta da2l1aktá da2laku da2lakú 2d1alakz da2l1a2l da2lapc da2lapk da2lapn da2lapr da2l1aps da2lapt 2d1a2lapú da2lar da2l1asz da2latt da2l1á2g da2l1ál dal1á2rak dal1árá da2l1árb da2l1árn da2l1árr dal1á2sz da2l1áti dale2l dal1elá dal1ele dal1ell dal1e2sé dalé2ke2 dal1él. da2l1é2ne da2l1ér. dal1f2 da2lid da2l1i2ko da2l1ikr da2l1i2m da2l1i2nát da2lind da2l1inf da2l1ing da2l1inj da2l1int da2l1i2nu da2l1itt dali2z dal1izo 2d1alji dal3l 2d1allo dalo2m1e dalomo2 da2l1or da2lőr dal1p2 dal1ud da2l1ur da2l1u2s da2l1u2t dalú2t da2l1úto dal1útr da2lü 2d1amc 2d1amf 2d1a2nal 2d1ang d1a2nyag 2d1a2nyó dao2k daó2r daó2v 2d1a2pa. 2d1a2pai da2paké da2páb da2pád da2páé da2páh da2pái da2pák da2pám da2pát da2páv 2d1apj da1p2l da2pó. 2d1app da1pro da1p2s 2dapt dara2be da2r1a2dó dar1ala da2rant da2r1azo da2r1áta da2r1átf dar2c1e2 dar2c3h dar2cso 2d1arcú dar2d1a2l dar2d1á dar2del dar2d1es dar2d1ó2 da2r1el da2r1il darus3s dar1uta da2r1ü da2sál da1s2l da1spe 2d1assz da1s2ta da1szl daszt2 dasz2tá 2daszú da2t1akt da2t1akv da2t1a2la da2t1alk dat1apu dat1ará dat1ass da2t1att da2taz da2t1áll da2t1árad datá2ramm datá2ramr da2t1áta da2t1átá da2telem dat1e2l1é dat1elí da2t1elk dat1ell da2t1elő dat1elt da2t1é2g da2térte da2t1érté da2t1érth da2t1érv da2tid dati2k da2t1iko da2tim da2t1inf dat1inte dat1ist da2tiz da2t1ír dat1íve dat1k2 2d1atlas da2t1osz da2tóc 2datóm da2t1ó2r dató2s dat1ósá dat1t2 da2t1u2t da2tút da2tűr da2tya da2tyá 2d1a2uk da2up 2d1a2ur dau2s dau2ta da3u2tóp daü2t daü2z 2d1a2vat 2d1avv da1ye da1yé 2d1az. da2zál 2d1a2zé da2zok da2zon 1dá 2d1á2bé 2d1ábr dá2c3ho dá2fá dá2ga dá2gá dá2gú 2d1á2gy dá2lál dá2lár dá2l1e 2d1állí dá2lü dá2ly1a2n dályú2 dá2ly1ús dámu2 dá2m1ut dá2m1ú dá2ny1a2d dá2ny1al dá2ny1a2n dá2nyaz dá2nyó dá2po 2d1á2rad dá2r1ag 2d1á2rai dá2r1a2j dá2ral 2d1á2ram dá2r1a2n dá2r1a2p dá2rar dá2ras dár1ass dá2rat dár1atk dá2rá dár1ál dá2r1e2 dá2réb 2d1á2ria. dá2rij dá2ril dá2r1i2p dár1isk dár1ism dá2rí dá2rod dá2r1ond dá2r1ot dá2rö dá2rő dár1s2 dárt2 dár1tr 2dáru. dá2ruk dáru2s1ág. dáru2s1á2ga dá2rú2 2d1árú. dá2rü dá2rű dá2s1a2d dá2sal dá2sar dá2s1á2g dá2s1árad dá2s1árh dá2s1á2ru d1á2sás dását1a2 dá2s1e2 dásfé2l1é2v dá2sim dá2sis dá2sol dá2sor dá2só2 dás1ór dá2sö dá2ső dást2 dás1tr dá2sut dá2s1ü2 dá2szag dá2szaka dá2szal dá2szar dá2szav dá2sz1ál dá2szárk dá2sz1á2ro dá2sze dász1el dász1em dász1er dá2széb dá2szip dá2szir dá2szis dá2sz1í2 2dászkái dá2sz1ö dá2sző dász3s dá2sz1us dá2sz1ú dá2sz1ü2 dá2sz1ű 2d1á2ta dát1al 2d1á2tá 2d1átd dá2t1e2 2d1á2té 2d1átf 2d1á2tí 2d1átj 2d1átk 2d1átm 2d1átr 3dátu 2d1á2tú 2d1átv dba2l1 db2lo db2lú db2ro db2ró dc2lu dcsa2p1á2g dd1elh d2d1i2d ddí2s d2d1o2d dd2rá dd2ró d2dz d3dzs 1de de2aa de2aá de2ac dea2d de2ae de2aé de2agy de2ah de2aí de2ala de2alá de2alo de2am dea2n de2ao de2ap dea1sz2 de2aszf de2at 2d1e2bé ded1ell 2d1e2dén de2d1ó2v de1dra de2d1ú2 2d1e2dz de2ep dee2s deé2r 2d1eff de1fr de2g1a2l de2g1a2n de2g1ál de2g1e2l degen3n de2ger de2g1ék deg1éri de2gés deg1éss degész1 deg3g de2giz 2dego de2gor degö2 de2g1öl de2gör de2g1ös 2de2gő 2d1e2gye degyez1 2degz 2d1ehh deho2g de2if dei2g deí2r de2k1a2k de2kaz de2k1e2g de2kellen de2kep dek1e2rő de2k1esz dek1ékb dek1é2ke de2k1él de2k1éri de2kérte de2k1érté de2k1érv de2k1érz de1klu dek1old dek1s deksz2 2d1elad de2lef 2d1e2legy dele2m1a dele2má dele2meg de2lemek dele2mel delem1ele dele2mu 2d1e2lemű 2d1e2lemz dele2t1a2 2d1eleteté 2d1e2l1é2k 2d1e2lél delés3s 2d1elha 2d1elho 2delkezdé 2delkezdő del2lal del2l1an del2l1e2g delle2l del2l1ele del2lelk 2dellená 2d1ellene del2l1ent del2ler del2l1é2j del2l1é2k del2l1in del2l1is del2los del2lór del2lőr 2d1elma 2d1elnö de2los 2delö de2löl de2lőad 2d1e2lőka 2delőrej 2d1elsa 2d1eltett. 2d1eltér 2d1elv. 2d1elvá 2d1elves 2d1elvo 2d1elvű. 2d1elvűe 2d1elvűk 2d1elvűn 2d1elvűr 2d1elvűs 2d1elvűt 2d1elvűv de2mad de2m1a2l de2maz de2m1ál de2mez de2m1é2rem de2m1érm de2mim dem1ing 2demoi dem1p de2mus demü2l de2nal 2d1e2ner denkié2ne de2nol de2n1ó2 dens1s de2od de2of de2o1g2 de2oj de2olo de2om de2ot de2pe. 2d1e2pé de1p2re de1pro de1p2s de2rad der1aka de2rala de2r1a2n de2r1ar de2r1á2g de2r1á2r de2rás der1ázt 2derdő dere2c 2deredm 2d1e2reje 2derején 2derejér 2d1e2rejét de2r1e2kei der1e2le der1ell der1e2lő der1elt de2rer de2r1e2ső de2r1él de2rid de2r1il de2r1i2m de2r1in de2r1i2p de2r1i2s der2nék de2r1osz de2r1ó2r de2rő d1erő. der1ős. d1erőt d1erőv der1sp deru2 de2rut de2r1ü2g de2r1üld der1üle der1ültet dervis1s 2de2s1a2 2desg de2sip 2deskü 2destes de1sto de2sur desú2 de2s1úr 2d1eszm de1sz2ta de2szű. de2t1ék de2tika de2tiká 2d1e2vő 2d1evv de2xa dexi2 de2xin de2xiz de2xí de2x1o de2xö 2deza de2zak de2zér de2zil de2zin de2z1or dezőe2 dezőkész1 2d1ezr 1dé 2d1ébr dé2dap dé2d1ő dé2du dé1fl dé2g1a2 dé2g1á2 dé2g1e2b dé2g1eg dé2gép dé2g1érk dé2gés dég1ész dég3g dég1iga dé2gigé dé2gin dé2gí dé2g1ok dé2got dé2gó dég1s dé2g1u2 dé2gú dé2gű 2d1é2hes 2d1éhs 2d1éj. 2d1éjb dé2k1ab dé2kac dé2k1a2d dé2k1a2l dé2k1a2n dé2k1ap dé2k1as dé2k1au dé2kaz dé2k1ág dé2k1árt dé2kás dékát1a2 dé2k1e2g déke2l dé2k1ele dék1ell dék1elő dé2k1elt dé2k1er dé2k1esz dé2k1eti dé2kez dé2k1é2j dé2k1é2k dé2k1é2l dé2k1ér. dé2k1éte dék1isz dé2kivá dé2kí dékkulcs1 dé2k1old dé2kop dé2k1or dé2k1osz dékó2 dé2kór dé2k1ö2v dé2köz dé2kő dék2rém dé2k1ut dé2lad dé2lam dé2l1á2 dé2leg dé2le2l dél1elő dé2les dél1est 2d1é2let dé2lim dé2lio délkö2z1ön dé2lo dé2l1ö2 2d1é2lő dé2l1u2 dé2lük dé2lyö dé2m1e2l dé2m1e2m déna2 dén1ac dénár1a2 2d1é2neke dé2ny1el dé2nyid dé2nyo dé2nyö dép2i 2d1é2pí 2d1é2pü dé2rag dé2ral dé2r1an dé2rar dé2ras dé2rá dér1d2 dé2reg dér1eml dér1esé dé2r1est dé2rez dé2rés dé2rif dé2r1ik dé2rí dé2rot déró2 dé2rór dé2rö 2d1érté 2d1érth dé2r1út dé1ry 2d1érzé désa2 dé2s1aj dé2sal dé2sap dé2sar dé2s1az désá2 dé2s1ár dé2seg dé2s1e2l dé2s1eti dé2s1ég dé2sí dé2sú dé2s1ü2t dész1ak dé2s3zá dé2sz1ék dé2szév dé2sz1o dé2szú dé2t1as dé2t1e2g dé2t1is 2d1étke dé2tőr 2d1év. 2d1évb 2d1é2ve. 2dévei 2d1é2vek 2d1é2vem 2d1é2ven 2d1é2ves. 2dévesb 2d1é2vesek 2d1é2vesen 2d1é2vesh 2dévesi 2dévesk 2d1é2vesn 2dévesr 2d1é2vess 2d1é2vet 2d1évez 2d1é2véb 2d1é2véi 2dévén 2dévér 2d1é2vét 2d1é2vév 2d1évf 2d1évh 2d1é2vi 2d1évk 2d1évn 2d1évr 2d1évs 2d1évt 2d1é2vu 2d1é2vü 2d1évv 2d1évz dfé2nyem df2lo df2ló df2rá df2re df2ri df2ro df2rö dgá2zár dgázát1 dgá2zi dgá2zó d2ge. dg2le dg2li dg2ló dg2ra dg2rá dg2ró d2gyu d2hali dhan2g1e dhé2t1 d2hi. d2hié d2hih d2hii d2hij d2hik d2hir dhú2s1á2 1di di2aa di2aá dia1b di2abá di2abi di2abr di2ac dia1d2 dia3da di2adi di2ado di2ae di2aé di2afa di2agy di2ah di2ai2k di2aí di2aj di2akép di2akol di2ala di2alá di2ali di2am di2ana di2aná di2ani di2anó di2ao di2aó di2aö di2aő di2a1p2 di2ara di2asza di2aszk di2aszó di2a1t2 di2au2 di2aú di2aü di2aű di2av di2az diá2k1e diá2kol dián3n di1c2k di2cs1aj di2cs1e2r 2d1i2deg 2didej di2deo 2d1i2dén di2d1i2o 2d1i2dő di2eu di1fl di2ga. 2d1i2gáná di2ge. di2g1e2l 2d1i2gén di2gét 2dijes di2kép di1k2l 2d1i2konh di1k2ro dik1u2ta di1k2v di2lan dile2m dilig2 di2lö di2l1ő di2lü di1ly di2ma. 2d1i2má di2mit 2d1imp 2d1i2naka 2dind 2d1inf dinga2 din2gal 2d1ingá 2d1inger 2d1i2nic di2n1ing 2d1inj di2nód di2n1óm di2n1ó2n di2n1ó2r 2d1inp 2d1inté 2d1inv di2oa di2oi di2ok di2ol di2ome di2ov di2óa di2óá di2óe di2óg di2óí di2ókam di2óká di2ó1kl di2ókok di2óku di2ómé di2óo di2óó di2óö di2óő di2ó1p2 di2órá di2óri dió2si2 diós1ik di3ósor. di2óspe di2ószű di2óu di2óú di2óü 2dipar. 2d1i2pará 2diparb 2d1i2pari 2d1i2paro 2d1i2rat 2d1i2rá 2d1i2rod 2d1irt di2saj 2d1i2si. 2d1isko 2d1ism 2d1iste di2tal dit1a2la dit1ará di2t1e2g dit1t2 di2tü diumé2 diu2m1én diu2mil diú2t di2vad 2d1i2var diva2t1a 2d1i2zé 1dí dí2gé dí2j1áto dí2je dí2jí dí2jö dí2jü 2d1í2rá díri2 dí2rik 2d1í2ró dí2sz1a dí2szer dí2szö dítés3s 2d1ív. 2d1í2ve 2dívn 2d1í2vü 2d1í2vű dí2zi dí2zs dí2zü dí2zű dj2eg dje2gya dj1is djo2n1 dka2n1á2 dkia2 dkie2 dk2la dk2li dk2lo dk2lu dk2rá dk2ré dk2ri dk2ro dk2ró dk2va dk2vi dlás3s dlá2s3z dleí2 dló1g2 dlót2 dlő1kr dme2g1ér dna2pe dné2v1á dnö2k1ö2l 1do do2áz do2b1ag do2b1a2l doba2n do2b1any do2b1ár do2bát dobe2 do2b1el do2b1ill do2bí 2dobje do2boá do2b1old do2b1or do2bö do2bü do2bű 2d1o2dú do2gar dogasz1 do2gár dogás1s do2g1ol do2gor dogos3s do1g2rá do2gü do2kal do2kas do2káj do2k1ál do2k1e do2k1é2l do2kép dokkö2 dok2k1öb dok2kő do2k1ott 2d1o2koz do2kö dokú2t dok1úto do2kü 2d1o2laj dola2tar dola2t1e dola2t1ör 2d1olda 2d1oldá 2d1oldo 2d1oldó 2d1oltár 2d1oltás 2dolvas dom1a2cé do2m1árb do2m1áré do2m1árh do2m1árj do2m1árk do2m1árl do2m1árn do2m1á2ron do2m1árr do2m1ártó dom2ba2l dom2bel dom2bol dom2bón do2mel 2domí 2doml do2m1ond do2mő 2domú do2mü do2n1ad dona2l don1ala do2n1a2r do2n1as do2n1ál do2n1áta do2n1átj do2n1áts do2n1átv don1d2 do2n1e donos1s do2n1osz do2nö don1s dont2 don1tr do2nü do2nyal do2nyar do2nye do2nyó 2d1o2pe do1p2l dor1akn do2r1a2l1 do2r1a2p do2r1as do2rat dor1áll do2r1á2lo dord2 dor1dr do2r1e2 do2rid do2r1il do2r1is do2r1ita dor1k2 do2r1okl dor1oszt do2rö do2rő 2d1orrú dors2 dor1sp dor1tró dorú2t do2rü 2dorvos do2ug do2ut do2vi do1ye 1dó dóa2d dóá2g dóá2r dó1bl 2dóez dó1fl dó1f2r 2dógá dó1g2r dói2g dóí2v dó1k2l dó1kré dó1k2v dó2mab dó2mak dóm1org dó2mő dóó2r dó1p2l dó1p2r dó2rád d1ó2rák dó2riá dó2sam dó2sas dó2sel 3dósi. dó2sip dó2sis dó2sír dó1s2ká dó1spe dó1spi dó1s2rá dós3s dó1stáb dó1str dó2s1ű2 dósz2 dó1szf dó1szp dó1t2r 2d1ó2vó 1dö d1öbl dö2ga dö2gá dö2g1el dö2gev dög3g dögna2 dö2go dö2gó dög1ö2lő dö2g1ő dö2gu dö2ka dö2ká dö2k1el dö2k1e2r dö2kék dö2k1ér. dö2kí 2döntöz dö2ra dö2rá dö2ro 2d1ö2röks 2d1ösz d1ötl döt2tért dö2ve dö2vi 1dő dőa2n dőá2g dő1bl dő1cl dő1dra dőe2l dőe2r dőé2l dőé2te dő1fl dő1f2r dőgé2p1e2ké dő1gr dőirá2 dői2ta dő1kl dő1kv dő2ny1a dő2nyele dő1pl dő1pr 2dőráb 2d1őrál 2d1ő2reb dőr1egy dőr1ele dőr1elő 2d1ő2rem 2d1ő2ré. 2d1ő2réh 2dőrék 2d1őrél 2dőrén 2d1őrh 2d1őrif 2d1ő2ril 2d1ő2r1in 2d1ő2rip dő2r1is 2dőrok 2d1őror 2dőros dő2röd dő2r1öz 2dőrőr 2dőrun 2dőrur 2d1ő2rut 2d1ő2rü2 dőr1üg dőr1ül 2d1őrz dő2s1érv dő1ská dő1s2m dő1sni dőso2d dős1odo dő1spe dő1s2pi dő1spó dő1s2ta dő1sté dő1str dő1sv dő1sz2 dőt1áll dő1t2r dp2la dp2le dp2lé dp2ra dp2re dp2ré dp2ri dp2rí dp2ro dp2ró dp2sz dra1ps dravasz1 drág1g drá2sz1ál drá2sze dráta2 drá2tal drá2t1e2 drá2t1ér dren2d1ő2 1d2ressz. 1d2resszb 1d2ressze 1d2resszh 1d2resszk 1d2resszr 1d2resszü dré2szá dro2g1a dro2gá dro2gen drogé2n1i2 drog3g dro2g1ó2 dro2n1a2 dro2nyi drosz2 dro1szf dro1t2r dró2baj dró2t1a2 dró2t1á2 dró2tis dró2t1ü2 d2rui dru2se dru2si dság1g dsé2g1el dsé2gül ds2ká ds2li ds2pe ds2pi ds2po ds2rá ds2ta ds2tá ds2tí dst2r dsza2ké dszá2las dszáraz1 dsz2e dsze2ra dsze2r1á dsze2r1elv dsze2r1o dszert2 d1sz2l d1szn d1sz2p d1sz2t2 d1sz2v dta2g1a2 dtalpa2d dtal2p1ada dtal2p1al dta2n1á2s d2t1ékn d1t2rá d1t2ré d1t2ri d1t2ro d1t2róf d2t1ül 1du du2cem du2c3h du2cö du2cü due2l du2gal du2g1ár 2d1ugr 2duit 2d1ujj dula1k2 dula2t1í du2l1e du2lép duli2 du2l1im du2l1in du2lis du2lí du2lö du2lű 2d1u2ni 2d1u2no 2d1unt du2óa du2óá du2ód du2óf du2ól du2óp du2rai du2rak du2ral 2d1u2rat du2ráb du2ráh du2rát du2ruk du2sal du2san du2sar du2s1as du2sál du2seg du2s1érté du2sin du2s1iv du2sol du2ső du2s1ű 2duszo dus3zs du2t1i 2d1u2to du2tó. du2tór du2tu 1dú dú2ce dú2ch dú2cse dú2c3so dúc3sz dú1dr dú2j1é2 dú2jí dú2r1a2c dú2ral dú2r1e2 dú2rén 2d1ú2ron dú2rö dú2szá dú2szó dú2t1a2 dú2té 2d1útj d1útl 2d1útn dú2ton 2d1útr 1dü dü2dü dü2gy dügy1érn dü2ha dü2há dü2hel dü2ho dü2hő dü2két dü2lá 2d1üld dü2lep dülős2 2d1ünne dü2rí dü2te dü2té dü2tő dü2ve dü2ze dü2zé 1dű dű1pr d1űrl dű1sz dű1tr dű2zé dű2ző dva2raj dva2r1e dva2r1ó2 dvá2nyan dvá2nyí dv1áta dv1áte dv1ece dv1e2leg dv1elk dven2t1í dve2ral dve2rár dve2rip dver1s d2v1e2sés d2v1e2teté dv1élm d2v1ép d2v1érd d2v1é2ri d2v1érté d2v1érz dv1fr dvi2csa dvi2csá d2v1iga dvigaz1 dvitéz1 dv1or dvö2l dv1ölő dv1ős dv1őz dv1pr dv1un dv1ú2t d2v1üg d2v1ü2z d2v1űz dwa1yi dy1as d1yéb d1yén dy1étő d1yév dy2jé dy2ke dyk2k dyk2n dyk2t dy2vé d2z 1dza dzaé2 2d3zaj dzak2 dza1kr 1dzá dzá2r1ó2ra dzás1s d3zász 1dze 1dzé dzé2sa 1dzi 2d3zil 1dzí 1dzo 1dzó 1dzö 1dző dzőa2 2dzőbő 2dződ 2dzőj 2dzőné 2dzőr 1dzsa 1dzsá 1dzse 2dzs1e2g 2dzs1esz 1dzsé 1dzsi 2dzsir 2dzs1is d3zsiv 1dzsí 2dzso2 dzs1ok 1dzsó 1dzsö 1dzső dzs1s 1dzsu 1dzsú 2dzsúj 1dzsü 1dzsű 1dzu 1dzú 1dzü 1dzű 2e. e1a ea2bál e2abo e2abő ea2da ea2dá eadás1s ea2dó ea1d2r ea2du eaé2d e2afá e2afe e2afi e2afo e2afö e2afő e2afü e2afű ea2gi e2agó e2aid e2ail e2aim e2aip e2ais ea2ja e2ak. ea2kas e2akat e2aká e2akb e2ake e2akép e2akh e2aki e2akí e2a1kl e2ako e2akó e2akö e2a1k2r e2akú e2akü e2alán eal1eg ea2lu e2am. e2ama e2amá e2amel e2amer e2amé e2amin ea2mo e2amu e2amú e2amű e2ane e2ané e2anö e2ans ea2nya e2api e2apo e2apó ea1p2ro e2ar. ea2ran ea2ras ea2rat ea2rá e2arb e2are e2arh e2arj e2arn e2aró e2arr e2aru e2arü e2aso e2a1st2 e2asü e2asű e2aszem e2aszé e2ata e2atá e2atc e2ate ea2t1eg e2até2 ea2tél ea2t1éne e2atf e2atg e2ath ea2tid eat1ing ea2tip ea2tir e2atm eatmo1s eatmosz2 e2atn e2ato ea2t1or e2ató e2atö ea1t2rak eat2rón e2ats e2atu e2a2tü e2atű e2atz e2au. ea2ut e2a2ux e2avi ea1vy ea2zo e1á eá2bé eá2cs eá2ga eá2gá eá2gi eá2go eá2gu eá2gy eá2hí eá2k1e eá2k1osk eála2 eá2lad eá2l1ak eá2lál eá2l1á2r eá2l1e2 eálé2 eá2lél eálfe2 eá2lid eá2l1in eá2lir eá2lism eá2lop eá2l1ór eá2lö eá2mu eá2nac eá2nal eá2n1at eáná2 eá2nár eá2n1át eá2n1e2 eá2ny1a2l eá2ny1a2n eá2nyap eá2nyar eá2ny1as eá2nyav eá2ny1e2 eá2nyén eá2ny1ér. eá2nyif eá2ny1ing eá2nyis eá2ny1o2ku eá2nyö eá2po eá2rad eá2ram eá2ras eá2raz eá2ru eá2rú eá2sa eá2sá eá2sí eá2só eá2su eá2sz eáta2 eá2t1e2 eá2té eá2tí eá2tu eá2tü e2ba2d eb1adó eb1adta eb1aga e2b1ajk e2b1a2la e2b1alk eb1ant eb1a2ny eb1atl e2b1au eb1a2zo eb1ágg e2b1áp eb1ára ebeá2 e2b1e2he eb1ejt ebe2l1á e2b1e2lef ebe2l1eme e2b1elhel e2b1enc eb1este eb1esté ebe2szek e2b1ex e2b1ég eb1ép e2b1érd e2b1érté e2b1érz eb1gr e2b1id e2b1i2na e2b1inf e2b1ing e2b1irá e2b1i2s e2b1izz eb1kl eb1kr eb2lat e1b2lú eb1okt eb1o2la eb1orv eb1öb eb1ös eb2rus eb1st2 eb1tr e2b1üg ebü2l eb1ülé e2b1ür eb1üz ec1ajt ec1alk e2c1a2n e2c1az ec1ág e2c1ál ec1ár ec1bl ec2c1a2 ec2c1ér ec2c3h ec2c1i eccs1át ec3cso ec2cú e2c1eg e2c1elo e2c1elv 2ecento e2cetb ece2t1o 1e2cets 1e2cett e2cetü ece2tüz e2c1evé ec3har ec3hen ec3hi. ech1in 1e2chó ech1u ec2le ec2lu e2csad e2cs1a2la e2cs1a2n ecsa2p1á2g e2cs1a2pák ecs1ará ecsá2r ecs1árá ecs1árb ecs1áro e2cs1á2t e2cs1é2l e2cs1ér. ecs1érté e2cs1ol e2cs1öl ecs1s ecsúszós1 e2c3sükb e2c3süt ec3sze e2c1ud ec3zá ec3ze e2d1ab e2d1a2dá ed1a2ny e2d1a2z e2d1á2c e2d1ág e2d1áp ed1egy edeleme2 e2d1elo e2d1eml ede2rak ede2r1ál ede2rel ede2r1ék ede2r1o ede2r1ü2l ede2s1o ede2tá ede2tel ede2t1ér. e2d1é2j edé2ká edé2kis edé2k1o edé2lyá edé2lyo 1e2dénn 1e2dény e2d1ép e2d1érd edé2sa edé2so edés3s edé2s3z ed1é2vén ed1é2vér ed1gr 2edic e2dide e2d1i2ga edigaz1 ed1ill e2d1int e2d1ira ed1iro e2d1ír ed1ívn e2d1íz ed1old ed1orv e2d1os e2d1ös e2d1őrs edő2s1ü ed1pl ed1pr ed2ram e1d2rog e1d2ró e2d1üg e2d1üt e2d1űz ed2v1a2 edvá2 ed2v1ár ed2vát edv1ér. ed2v1öz edy1i e2d3zá 1e2dzői 1edzőj 1edzőr 1e2dzőv 1edzv e1e ee2bé ee2cs ee2dz ee2ge ee2gé eegész1 ee2gy ee2he ee2ke e2el. ee2la ee2le e2eléb ee2léd e2elg ee2lo ee2lő ee2me ee3men ee2mé ee2mu e2en. e2enb e2enj e2ent e2enw ee2ny ee2pe ee2pé ee2po ee2re ee2ro ee2ró ee2rő ee2sé ee2sü ee2sz ee2te e2e1t2h ee2to ee2ve ee2vé ee2vi ee2vo ee2vő ee2zü e1é eé2de eé2ge eé2gé eé2gő eé2gü eé2he eé2je eé2jé eé2ke eé2kí eé2le eé2lé eé2li eé2lő eélőkész1 eé2lü eé2lű eé2me eé2ne eé2pí eépítés1s eé2pü eé2ré eé2ri eé2rő eé2rü eé2sz eé2te eé2ve eé2vé eé2vi eé2vü efa2x1i efek2tá efek2t1í2 efenyőé2 ef2f1in ef2f1o e1f2la efle2x1i2k ef2lu efo2n1alk efo2nik eforma2 efor2m1al ef1pl e1f2rá ef2rö e2g1a2bá ega2be eg1abl eg1abr e2g1a2cé ega2cs e2g1a2d e2g1a2g ega2i e2g1a2j e2g1a2k e3gaké ega2lac ega2lak ega2lan eg1a2lap e2g1a2lá e2g1alh e2g1alj e2g1alm e2g1als e2g1alt e2g1a2m eg1ang eg1ann eg1ant eg1a2ny e2g1a2pa eg1apá ega2po eg1a2pó e2g1apr eg1arc ega2ri eg1a2ro eg1art e2g1ass e2g1a2sza e2g1a2szo e2gaszú eg1atk ega1t2r e3g2aty e2g1a2u eg1a2va e3gazol ega2zon e3gába e3gábó eg1á2cs e2g1áf e2g1á2g eg1áh e3g2ái e3gája e3gájá egá2ju egá2m e3g2án e2g1áp e2g1á2rá e2g1árb e3g2árg e2g1árn egá2ro eg1árt egá2ru egá2rú egá2sa e3gát. e3g2átu e3gáva egá2zá egá2zi egá2zu eg1bl eg1br eg1d2r e2g1e2bé ege2cs1ö2 eg1edz eg1e2ge eg1ehe e2g1e2kés e2gela e3geled ege2leg ege2lej e2gelekt eg1e2lemb e2g1e2leme e2g1e2lemn e2g1e2lemr e2g1e2lemt ege2l1e2s eg1elég eg1e2lér e2g1elf e3g2elg e2g1elha e3g2elit e2g1eljá e2g1elm e3g2elne e2g1elo e3g2előá ege2lőbbe e3g2előd e3g2előf e3g2elői e3g2előm e3gelőnye e2g1eltá e3g2eltet e3g2eltü e2g1elvá e2g1elz e2gemel e3gend e3genye eg1epe eg1epr e3gerá e2gerd 1egere. e2gered 1e2gerek e2geré ege2rény eg1erk e3gerl e2g1eró e2g1erő eg2esek e2g1esete e2g1eszk e2getal eg1e2ve e2g1ex e2g1é2g e3gémb e2g1é2neke e2g1é2nekk egé2ny1e2l e2g1épí eg1éps e2gér. e2gérb egé2r1es egé2re2t egér1ete egé2rez e2géré egé2rés e2gérg e2géri egé2ri. e2gérk e2gérn eg1é2rő. e2gérr e2gérs eg1érté eg1érth e2gértő e2gérv e2gész eg1észl 1egészs eg1éte eg1fl eg2gim eg3gyal eg3gyan eg3gyás eg3gyú e3gi. eg1ibr eg1idd eg1i2de e3gie egi2g e3gig. e2g1iga e2g1igé eg1ij e2g1i2ko eg1ikr e2gill eg1imb e2gimm eg1inf e2g1ing eg1ino eg1ins e3g2io eg1ira eg1i2ro eg1iss eg1ist egi2sz e2g1i2ta e3gitá e2g1iva e2g1ivá e3give eg1izé eg1izg eg1izm eg1izz e2g1íg e2g1ín e2g1í2r e2g1ív e2g1íz eg1kl eg1kr eg1kv e2g1ob e2goc e2g1o2d e2goi e2g1o2k eg1o2la e2g1old eg1olv e3goly 2egom ego2mi e2gont e2g1op eg1org e3g2orom ego2ros e2g1orr e2g1orv e2g1o2s e2g1ot e3gó. e3g2ób egó2do e3g2ój eg1ó2ra eg1órá eg1óv e2g1öb eg1ök eg1önt eg1örö e3görög egö2röm eg1öt eg1öv e2g1ö2z egőkész1 e3gőre eg1őri eg1őrö egő2szi e3g2őz eg1pl eg1pr eg1ps e1g2rat e1g2róf eg1sk eg1sl eg1sm eg1sp eg1s2t egsz2 eg1szt eg1tr e3g2ub eg1ud e3g2um eg1u2n e2g1u2ra. e2g1u2rai e2g1u2rak e2g1u2ras e2g1u2rat e2g1u2rá e3guru e2g1u2s e2g1u2t eg1u2z eg1új e3g2ún eg1úr eg1ús eg1út e2g1üd egü2gye e2g1ü2le eg1ü2li e2g1üs e2g1üt e2g1üv e2g1üz e2g1űz egvárosi2 e2gy1a2d egy1a2g e2gy1aj egy1akt egy1a2la e2gy1ará e2gy1as egy1a2t e2gy1au egy1az e2gy1ál egy1á2rá egy1árf e2gyát egy1eleg egy1elf egy1ell egy1elo egy1e2lőj egy1e2lőv egy1elz e2gyeni 1e2gyenl 1e2gyens egy1eszt 1egyezm egy1éks 1egyéni egy1ér. e2gyip e2gyis e2gy1iz egy1ok e2gy1ol egyo2r e2gy1os egy1ot e2gy1ó2r egy1ö2l e2gy1ös e2gy1öz egy1ő2r egyu2 egy1ur egy1ut 1együt 1egzis eha2de ehá2zal eh1ellá ehe2lyes ehe2rál ehe2rát ehere2 ehe2r1el ehe2r1em ehe2ren ehe2res ehe2rin ehe2rol e2h1é2je ehé2ná ehé2név ehé2zá ehé2zo e2h1ors eh1sz e1i ei2áb ei2áh ei2áj ei2án ei2ár ei2át ei2áv e2ibn ei2deá ei2dei ei2deo ei2dén ei2dom ei2dő e2idp e2ier ei2gá ei2gé e2i1g2n ei2gy ei2ha eil2le. ei2ma. ei2man ei2má ei2mit e2imk e2ims e2imz ei2na2 ein1ad ei2n1á2 ei2neg e2inér e2inét ei2n1ita ei2nol ei2nő ein1t2r ei2nü ei2on ei2pa ei2ram ei2rat ei2ri ei2rod e2iró ei2ta e2itb e2itj e2itn e2itr ei2va ei2vá ei2vo ei2vó ei2zé e2izmi ei2zo e1í eí2gé eí2já eí2jú eí2ra eí2rá eí3rásbe eí3rásil eí3rásoc eí3rásonk eí2ró. eí2róa eí2róá eí2rób eí2ródn eí2róf eí2róg eí2róh eí2rói. eí2róik eí2róin eí2róit eíróí2 eí2rója eí2rójá eí2róje eí2róju eí2rók eí2róm eí2rón. eí2róna eí2róná eí2róny eí2rór eí2rót eí2róv eí2té eí2vá eí2ve eí2vé eí2vi eí2vo eí2vó eí2ze eí2zü eí2zű ej1ab e2j1a2d ej1a2g e2jak ej1akk ej1a2l ej1a2n ej1ar ej1au ej1a2z ej1áb e2j1á2g ej1ál e2j1ártó ej1á2t1e2 ej1átv ej1bl ej1br ejcsa2p1 ej1dr eje2c e2j1ecse e2j1ef ej1e2ged e2j1e2gé e2jekc e2j1ela e2j1elc e2jelede e2j1e2lemb e2j1e2leme ej1e2lemé e2j1e2lemn e2j1elf e2j1elha e2j1elhel e2j1elo ej1elszá ej1eltér e2j1elu e2j1eng e2j1enz e2j1essz eje2sz e2j1ex e2j1é2j e2j1é2k e2j1él e2j1ép e2j1éte ej1fr ej1g2r e2j1i2d e2j1im ej1ina e2j1int e2j1ip e2j1iz ej1íg ej1ív ej1kl ej1kv ej2mok ej1ol ej1op ej1óc ej1ón ejó2sá ej1ót ej1óv e2j1öb e2j1öl ej1ö2ve. e2j1őz ej1pl ej1pr ej1sp ej1st2 ej2tad ej2tau ej2tál ej2tát ej2t1elk ej2t1este ej2tev ejté2r ejt1éré ej2tin ej2tiz ej2tos ej2t1ó2r ej2töd ej2t1ö2l ej2tön ej2tös ej1tra ej1tró ej2tür ej1új ej1úr ej1ú2t e2j1üg e2j1ür e2j1ü2t e2j1üv e2j1üz e2k1abl ek1a2cé ek1a2dá e2k1a2dó eka2gy ek1a2ja e2k1ajtó. e2k1ajtói e2k1ajtók e2k1ajtón e2k1ajtór e2k1ajtót ek1a2kar e2k1alj e2k1a2lo ek1alt ek1ang e2k1ani ek1a2nyá ek1arc. ek1arca ek1arcr ek1arcú eka2sip e2k1au ek1azo e2k1ág ek1állo ek1álm ek1árad eká2rai ek1á2rak ek1áras e2k1á2rá e2k1árd e2k1árf e2k1árh e2k1árk e2k1árm e2k1árn e2k1á2ron e2k1árr e2k1á2ru e2k1á2rú e2k1árv ek1ásó ek1áta ek1átd e2k1áth ek1átj e2k1átm ek1á2to e2k1átt ek1bl ek1br 1ekcém ekci2óf ek1cl ek1dr e2k1ebé e2k1e2dz e2k1egg e2k1e2gye e2k1e2kébő e2k1e2kés e2kela e2k1e2leg eke2leme ek1elha e2k1elk e2kellá e2k1elm e2k1elo e2k1előn e2k1elr ek1elta ekel2t1é2r e2k1e2ma e2k1e2mel ek1e2més ek1e2pi e2k1estr eke2szele eke2szo e2k1e2vé e2k1evi 1e2kééh e2k1ég 1e2kéik ek1ékek e2k1ékt ek1é2le ek1éln ek1élő e2k1épí e2k1érin ek1értékb eké2rül e2k1ész. e2k1észh e2k1észn eké2tel e2k1étk e2k1étl e2k1étt e2k1é2ve. e2k1é2vek ek1é2vet e2k1évi ek1fr ek1gn ek1gr ekiá2 ek1i2ga ekigaz1 ek1i2ge e2k1igé ekii2 ek1ill e2k1ima eki2már e2k1iná ek1ind e2k1isk ek1ism e2k1isp ek1i2zo e2k1íj ek1írá ek1íz ekka2ró2 ek2k1ele ek2k1elf ekk1osz ek1kri ek2kű eklés3s ek2lim ek3nő e2k1oá ek1obj e2k1odv e2k1o2la ek1olló e2k1olv e2k1o2pe ekor2da ekor2d1á2 ek1o2rom ek1orra e2k1orv ek1otth e2k1ó2h ek1ó2ra ek1ó2rá ekö2k e2k1ökö e2k1ö2lé ek1ö2lő e2k1öm e2k1önk e2k1önt ekö2ri e2k1örv ek1pl ek1pr ek1ps e1k2ram e1krétá ek2ris e1k2rí ek2róm ek1sl ek1sm ek1sp ek1st eksz1al ek2szip ek2tau ek2taz ekt1elk ek2t1esz ek2t1érd ek2til ek2tim ek2t1i2o ek2t1ok ektus1s e2k1ud e2k1u2ra ek1uro e2k1utá e2k1utó e2k1uz e2k1új e2k1úr. ekú2t ek1úto ek1útv e2k1ünn ekü2t ek1ütő ek1üzl e1k2vó el1a2ba el1abl el1a2bort e2l1a2c e2l1a2d el1agg el1a2gy el1a2j e2l1akad e2l1a2kas el1akc e2l1a2l el1a2m el1ana elan2di el1a2ne el1a2ni el1ann ela2ny el1a2pa ela2r el1ara el1ará el1aré el1asza el1aszi el1aszó el1aszu e2l1a2u el1a2va el1a2ve el1azo elá2bé el1ág. e2l1á2ga el1ágg el1á2gi el1ágn el1á2go el1á2j el1áld el1áll el1á2lo elá2m el1ámí el2án elá2ná elá2ne elá2nó el1á2p el1ár. el1á2rá el1árb el1árc el1á2re el1á2ré el1árf el1árh el1árk el1árn el1á2ro el1árö el1árr el1árt el1á2ru el1á2rú elá2s eláta2 el1át1e2 el1átf el1átk el1átl el1átm el1átr el1ázi el1ázo el1ázt el1bl el1br 2eld. el1d2r ele1bre 2eled. 1e2ledel el1eff ele2g1e2lé el1e2gyene e2legyü el1egz eleí3ran ele1k2l ele2k1os ele1krá 1elektr e2l1elb e2l1e2lemb e2l1elm e2lelőz el1elr ele2mad e2l1ember 1eleme. 1e2lemei 1elemek ele2mell 1e2lemem. 1e2lememm 1e2lemes. 1e2lemesn ele2mesz ele2mélt ele2mérd 1e2lemük 1e2lemünk 1e2lemzé 1e2lemző 2elend e2lener ele2nél eleó2 ele2pal ele2pap ele2pele ele2pell ele2p1ő2r e2lerd el1e2red el1e2rei el1erj e2l1ern ele2róz ele2sege ele2sésb ele2sése ele2sésé ele2sésh ele2sési ele2sésk ele2sésn ele2sésr ele2séss ele2sést ele2sésü ele2sik. e2l1esnén ele2sőb ele2sős e2l1essél ele1sta ele2szek ele2t1e2két ele2teti ele2tetn ele2tető ele2t1ék ele2tél e2l1ették eleü2 1e2l1e2vők el1e2xi e2lébb elé2du el1é2ges el1é2get el1égj el1égtek el1égv el1é2het eléka2 elé2kak elé2k1an elé2k1á elé2k1e2le elé2kev elé2keze elé2kezi elé2kezt el1ékí elé2kö elé2ku el1él. el1éld elé2led el1é2let el1é2lé el1élh el1é2li el1élj el1éln el1éls e2l1élt el1é2lü e2l1élv e2l1é2neke e2l1é2nekh e2l1é2red e2l1é2rem elé2rend e2l1é2rez elé2rét. elé2ri. e2l1érp e2l1érrő e2lértel e2l1érté el1érth e2l1értő e2l1é2rü e2l1érz 2elésétő elé2so 2elész. 2elészel 2elészem 2elészne 2elészné 2elésző 2elészü 2elészv elé2tel e2l1é2tes elé2tete e2l1étk e2l1étt e2l1év. el1fl el1f2r el1gl 1elhap el2ib el1ideg el1idé el1i2do el1iga e2l1igé el1ill e2l1i2ma e2limá e2l1imp e2l1i2na e2l1into el1i2on eliő2 e2l1i2p e2l1ira e2l1i2ro e2l1i2si e2lism el1iss el1iste eli2tin eli2tol elitu2 el1i2vá e2l2ix el1i2zo e2l1íg el1í2rá el1í2v elka2r1á 1elkezdé 1elkezdő el3ki el1k2l el1k2r el1kv el2l1a2dá el2l1a2dó ell1alk el2l1amb el2lamp ella1t el2lau el2l1ábr el2l1áll 1ellátáso 1ellátásü 1ellátm el2lef elle2g1ó2 ell1elké el2lelm 1ellená 1ellenes 1ellenf 1ellenő 1ellens 1ellenz el2lid ell1inf ell1ing. ell1int el2l1or ell1osz ell1órá el2lön el2lös el2l1űr 1elmééh 1elmél 1elméte 1elnép 1elnök el1obj el1off el1oj e2l1o2ká el1okm e2l1o2l el1oml el1omo el1ont el1opc e2l1ope el1oro el1orr el1os e2losz e2l1ox eló2ig eló2in e2l1ó2ri el1öb el1ö2m e2l1ön e2l1ör e2l1ös e2l1ö2z 2előáp 2előár 2előbé 2előbi 2előbo 1elődei elő2d1í2 1elődje. 2elődo 1elődöt. előe2r 1e2lőfú 2előfü 2előfű 1e2lőhív 1előhű 2előib 2előik 2előim 2előiv 2előja 2előké. 2előkért 1előkése 1e2lőkést 2előkl 2előkő 2előkt 2előku 2előkü 2előmö 2előmű 2előna 1előnn 2előnö 1előny. 1előnyb 2előnyer 1előnyh 2előnyi 1előnyk 1előnyn 1előnyö 1előnyr 1előnyt 1előnyü 2előö el1őr. 1e2lőreg 1előreh 1előrej el1őriz el1őrl 2előro e2l1őrü 2elősá 2előso 2elősö elő1s2p 2elősze 2előszé 2előszi 2előszó 2előtü 2előü 2elővis 2előviz 1e2lőz. e2lőze 2e3lőzene 1előzm el1p2l el1pró el1sk el1sl el1sm el1sz2t el2t1aj eltára2d eltár1ada 2elte. el2t1e2rei 2eltes 2eltet. 2eltete 2elteté 2elteth 2elteti 2eltetj 2eltetn 2eltets 1eltettk 2eltetü 2eltetv 2eltéb 2eltél 2eltét el1t2ra el1trá el1tré 2eltük e2l1ud el1u2g elu2n el1und el1u2r e2l1u2t e2l1uz el1új el1ús el1ú2t el1üc e2l1üd e2l1üg elügy1ér. elügy1érn elü2kén e2l1ültet e2l1ür e2l1üs e2l1üt e2l1üv e2l1üz el1űrt e2l1űz elv1ada elv1a2dó el2v1at el2v1árai el2v1áras el2v1árár elv1ász el2vát el2v1enc el2v1égü elv1éle el2v1ér. el2v1éri el2vik elv1olt el2v1ó2 el2vöd el2vő el2vú e2ly1a2 e2ly1á2 e2ly1e2kén. e2ly1el e2lyer ely1eszt ely1é2jé ely1é2ké e2ly1él e2lyés e2ly1i2ko e2ly1ira ely2kéj e2ly1o e2ly1ó e2lyöm e2lyön e2lyös e2lyő ely1ul elyü2l e2ly1ülé e2m1ab em1a2dat em1a2dás e2m1a2do e2m1a2dó e2m1adt e2m1a2gi em1a2ja e2m1ajá em1ajk e2m1ajt em1a2ka em1aká e2m1aku em1a2lap e2m1all em1almá em1alv e2m1ana 1emaná e2m1a2ny ema2p em1apá em1apr em1a2rán em1asszo e2m1atl e2m1a2u e2m1a2v e2m1a2zo e2m1áb emá2l em1ála em1áld em1áli e2m1áp emá2r e2m1ára e2m1árn e2m1áro e2m1áru em1árv e2m1ásá emát1a2 e2m1áte e2m1átl em1átm e2m1átt e2m1átu 1embarg 1embered 1emberf ember1ő2 1embers emb2len 1emblé em1bre 1embri em1bro em1dr e2m1ef eme3ger eme3gi em1egyet em1egyé e2m1egz e2m1e2kés e2m1ela em1elb 1emelet 1emelke e2m1ellá e2m1elm 2e2m1elo 1emelőb 1emelőe em1előny 1emelős 1emelőv 1emelty e2m1ember e2m1e2mel e2m1emu e2mener emenes1s e2m1e2p e2m1e2rény e2m1e2rő eme2sa em1e2seté e2m1e2sés em1e2szem e2m1e2szet e2m1eszk e2m1eszm e2m1eu e2m1e2v eme2z1a eme2z1á2 eme2z1o eme2z3s e2m1ég e2m1é2he. e2m1é2hen e2m1é2hes e2méhs e2m1é2j emé2k e2m1éke em1ékr em1é2let e2méneke e2m1ép e2mértel e2m1értéke e2m1értéké e2m1értékn em1észl emé2t1a2 emé2tár e2m1é2tek emé2tel e2m1étel. emét1elh emét1els em1fl emfoga2d emfo2gada em1f2r em1gr e2midé em1i2dő emi2g e2m1iga e2m1ige e2m1igé em1iks emi2m em1ima e2mimá e2m1inf e2m1ins e2m1inte e2m1i2p e2m1ira e2mirá e2m1iro e2m1irt e2m1isk e2m1ism e2m1iste emi2sza emi2szá emi2szo em1izé em1izg e2m1i2zo e2míg e2m1íj e2mír e2m1í2v em1kl em1kr 1emlékm 1emlékv emo2k e2m1okl em1oko e2m1okt em1ola e2m1old em1oll e2m1olt e2m1o2p e2m1ork e2m1ors e2m1orv emo1t2 emó2ra em1ó2rá e2m1öb emö2k e2m1ökö emö2l e2m1öld em1ölé e2m1ön e2m1ö2r e2m1ös em1öv e2m1ö2z em1őr. em1őrk em1őrn em1ő2rö em1őrr em1őrt 1empát em1pc em1p2re em1pré em1pro em1pró em1p2s em1sk em1sm em1sp em1s2t em1t2r 1e2mu. e2mud e2mug e2muj 1e2muk 1emulz 1e2mum em1uno e2mur e2musz em1utal e2m1u2tá e2mutc e2m1utó e2m1új em1úr e2m1út e2m1üd e2m1üg e2m1ü2lő e2m1ünn e2m1ür e2m1üt e2m1üv e2m1üz e2m1űz em1zr e2n1ab en1a2do en1agi e2n1a2j e2n1a2k en1a2la en1alk en1all en1alm e2n1a2n en1a2pá ena2p1e en1a2rá en1arc en1asz en1atk en1aut en1ábr en1ág en1áld en1álm e2n1ára en1árn en1á2ro e2n1áru en1átk en1átm en1átv e2n1áz en1bl en2c1a2 en2c1ár en2c3h en2c1ip en2cí en2c1ol en2c1os en2c1ö2 enc3ség en2c3sor enc3s2p enc3sz en2cu en2d1adá en2d1alk en2dano en2d1áll en2d1árn en2d1átl end1é2jé en2d1ér. en2d1érr en2d1értő en2d1érz en2d1or en2d1ón en2d1ó2r en2dös en1d2rá en2dú en2dza eneá2 e2n1egér e2n1egg en1e2lek en1eljá en1elk e2n1ell en1elm en1elny en1elü en1elvá e2n1eml eneó2 ene1p2 2enerá 1e2nerg e2n1ern e2nerv 2enes ene1sztá ene2tal ene2tos e2n1ex ené2k1a ené2kel enéki2 ené2kis en1épí en1épü e2n1ér. e2nérd e2n1éré e2n1éri e2n1érte e2n1érv ené2sza ené2szer ené2sz1in e2n1étk e2n1éves ené2vig en1f2l enfluo2 enga2 en2gan 1engedé enger1ő2 engés3s eng1g e2nidé enidi2o e2n1i2ga e2n1ige e2n1igé en1ill e2nimá e2n1ina en1ind e2n1inf e2n1inte e2n1inv e2n1ira en1i2rá en1isk e2n1ism eni2sza eni2szer eni2szo eni2sz1ó2 e2n1ív en1k2j en2n1eme en2nes enn1ége enné2k en2n1éke en2nér en2nir en2n1ol en2nú en2n1ül enny1a2d enny1as enny1á en3nyer enny1í2 en3nyu e2n1ob e2n1of e2n1oi en1old e2n1olv eno2ni en1opt eno2r1á2 e2n1ost en1oszt e2n1ox enóta2 enó2tal enó2t1e2 e2n1öb e2n1öl en1ön e2n1ös e2n1ö2t e3növ enő2rü en1pr en1ry en2s1ab en2s1a2l en2s1a2n en2sas en2s1el en2s1érté ens3szá en2s3zon en2t1a2c en2tada ent1agy enta1k2 en2t1a2la ent1alj en2t1alk ent1a2lo ent1and en2t1a2ny ent1ass en2t1á2rak en2t1á2rat en2t1árá en2t1á2rú en2t1elmé ente2r1a en2t1este en2t1esté en2t1esti ente1t2r en2t1é2g en2tép en2térm en2t1é2ve. en2tigé en2t1i2o enti2p ent1ipa enti2sz en2t1okt en2tön en1trad ent2ran en2tun en2t1u2r en2t1ü2z en1uta en1úr en1út e2n1űz e2nyab e2ny1a2d e2ny1ae enya2g eny1aga eny1agá e2ny1aj eny1alk e2ny1a2n eny1aré e2ny1as e2ny1at e2ny1au eny1d2 eny1e2dzé e2nyelm eny1előn eny1elvo eny1elvű e2ny1e2rő eny1eve e2nyéva 1enyhi. eny2h1ős e2ny1id e2nying e2ny1ira e2nyiz eny1í2ró e2nyok e2ny1o2l e2ny1or e2ny1os e2ny1ó2 enyö2k e2ny1ökö e2nyöt eny1s enyt2 eny1tr eny1út enyva2 eny2van 1enyve. eny2v1e2l enyves1s en2zal 1enzim e1o eo2áz e2obo e2ode eo2dú eog2rafi e2oka eo2kád e2okár e2oké e2o1k2l e2okon eo2kos eo2kö eo2laj e2oló eo2ly e2ome e2omé e2omi eo2n1al eo2nan eon1any eo2natom eo2n1au eo2n1ál eo2nár eon1d2 eo2ner eon1f2 eo2niz eo2nö eon1t2r eo2n1ú eo2nü e2opa eo2pe e2o1p2l eo1pro eo2r1a2 eo2r1á2 eo2res eo2r1és eorgi2a e2orgi2áb eori2tá eor1k2 eo2rö eor1s2 eo2so e2ost e2osza eo1sz2f e2otí e2oto eo1t2r eo2vi e1ó eóa2d e2óbö eó2ce eó2dá e2ófa e2óhe e2óje e2ókap e2ókép e2ókor e2ómi e2ómű e2óné eó2no eó1pr eó2rá e2óre e2ósu e2ószo e2óta e2ótá e2óte e2óté e2óti e2ótí eó1tré eó2vak e2óve e2óvé e2óví eó2vo eó2vó e1ö eö2bö eö2dé eö2kö eö2le eö2lé eö2li eö2lö eö2lő eö2lü eö2mö eö2nö eö2rö eö2rü e2ös. eö2ve eö2vi eö2vü eö2zö e1ő eő2re eő2rö eő2rü eő2sz e2p1ab e2p1a2da e2p1a2dá e2p1a2dó ep1a2gy e2p1aka e2p1akk e2p1akn ep1a2lak ep1a2lap e2p1alj e2p1alk epa2lom e2p1a2ny epa2rán ep1atró ep1aut ep1a2zo e2p1áb e2p1á2g ep1állá e2p1á2ra epá2s e2p1ása ep1áta ep1átc e2p1á2t1é ep1átf e2p1átm ep1á2t1o ep1átt ep1átü e2p1átv ep1bl ep1br ep1dr e2p1e2dz ep1e2lemr e2p1e2let e2p1ellá e2p1elo e2p1ene epe2ral epe2r1e2c epe2rev epe2rin epe2rül e2p1esti epe2szá e2peszmé e2p1ex 1e2péd 1epééb 1epééi 1epéén e2p1ég 1e2péit e2péj ep1ékh ep1éle ep1élm 1e2pénk e2p1ér. ep1fl ep1ido e2p1i2ko ep1ind e2p1inga e2p1i2rá e2p1irt e2p1ism e2piz e2p1íg e2p1íj e2p1ín e2p1ív ep1kl ep1kr ep2lag e1p2laká e1p2lan e1p2lán e2p1ob e2poch ep1okt e2p1olv ep1ope e2p1orn ep1orsó 1eposz. 1eposza 1eposzá 1eposzt. ep1osztá e2p1ö2l ep1önt e2p1ös e2p1öv e2p1őri ep2pan ep2pát ep2p1e2le ep2p1elh epp1eró eppó2 ep2pór ep2pö ep1pro ep1pró ep3ret e1p2réd e1p2rin e1proj e1p2rot ep1s2k ep1sp ep1st ep2tad ep2t1aj ep2t1í2v ep2t1op e2p1ug e2p1u2ta e2p1utó ep1új ep1út e2p1üg e2p1üt e2p1üz e2p1űz er1abla er1a2bor e2r1abr er1abs era2dat e2r1a2dá er1adm er1a2do e2r1a2dó era1dr er1a2ge er1agr e2r1a2ja e2r1ajk er1ajtó e2r1a2kad e2r1a2kas e2r1akc e2r1akti er1a2la e2r1alg e2r1alj er1alk e2r1a2lo er1als e2r1alt er1alv er1amb er1amp er1angy er1ann er1a2nya er1a2pa. er1app er1aps e2r1a2ro e2r1asp era2sz1a2l era2szav era2szárn era2szel era2sz1é2p e2r1atk e2r1atl era1t2r er1att er1aut e2r1a2zo e2r1ábr erá2fé er1áge er1á2gú e2r1á2gy er1állá er1állé er1állo er1álló er1állv er1ápo e2r1ár. er1á2rak er1á2rá e2r1árb er1áre er1áré er1árf er1árk e2r1á2ro e2r1árr er1árs er1á2ru er1árú er1árv er1ásá e2r1á2sz er1á2t1e2 e2r1áth er1á2ti e2r1átí e2r1átj e2r1átk er1átl e2r1átm e2r1átn e2r1átr e2r1átt e2r1átv erb1i2na er2c1a2l er2car er2c1ár er2c1át erc1ell er2c3ho er2cid er2c1ina er2c1iná er2c1i2pá er2cis erc1k2 erco2 er2cö er2csad er2cs1an ercs1ál er2cú er2cz 1erdej 1erdő ereá2 1eredetű e2redén 1e2redm eree2 er1eff ere2gál ere2gel e2r1e2ger erei2g 1e2rején 1e2rejér ere2k1el erek1e2szű erek1é2j ere2kot erek1t ere2k1ú2s e2r1e2leg er1elér e2r1ellen er1elli e2r1elö e2r1elr erem1egy ere2m1emb erem1érté ere2m1ut e2r1enz ereo1gra ere2pan ere2pas erepá2 ere2p1ál ere2p1e2sé ere2pin ere2pos er1erk er1ern er1eró e2r1esti e2r1estj e2r1estr e2resze. ere2szí e2reszü ere2tál ere2tát ere2t1eg ere2t1erj ere2t1é2rő. ere2t1é2ve. eretö2 er1e2vés e2r1ex 1e2rezet. 1e2rezete 1erezőkh erébe2 eré2bes er1ég. er1é2ge er1égé e2r1éj. e2r1éjb er1éjf e2r1éjn e2r1éjs eré2k1a2 eré2ká eré2kol eré2k1ö e2réneke e2r1é2neké eré2p1a eré2pá e2r1é2ren e2r1é2ré e2r1é2ri eré2sa eré2s1elv eré2sza eré2szá eré2szo eré2szö er1é2ter e2r1étk e2r1év. er1é2ve. e2r1é2vek e2réven e2r1é2ves e2r1é2vet e2r1é2vén er1é2vét er1évf er1évh e2r1é2vi e2r1évn e2r1évr er1évt er1évv erfé2l1é2v er1fl er1f2r er1gl e2r1i2deg e2ridé e2r1ido er1idu eri2ga e2r1i2gá e2r1i2kon e2r1i2mi eri2no erint2 e2rinteg erin1tr e2r1i2on eri2os e2r1i2par e2r1ira er1iró e2r1isk er1ism eri2szo e2r1ita e2r1i2zé e2r1izg er1íg er1íj. er1íjá e2r1ír e2r1í2z er1k2r er1k2v erme2k1a2 erme2ká erme2kesz erme2ko erme2köl erme2sz1á er2mind erm1isi ern1ala ern1ékn ern3n er2n1ó2d 1ernyő er1okl e2r1okm er1olda e2r1o2li ero2nal er1ope e2r1opt er1orc er1ord er1orm er1orn er1o2ro er1ors e2r1orv erosz2f e2r1o2ve e2r1ovi e2r1óc er1ó2dá er1ólo er1ó2rá er1óri e2r1ö2c erö2k er1ökl er1öko e2r1ökö e2r1ö2l e2r1ör e2r1ös e2r1öt e2r1ö2z e2rődd erőé2n 1erőlt 1e2rőmé 1erőmh 1e2rőnö 1e2rőö e2r1őri er1őrö er1p2l er1p2s er2rév er1ry er2s1a2d ers1alk er2s1an er2sat er2s1á2gi ers1ára ers1eml er2sérte er2s1érté er2s1értő er2sid er2s1im er2s1i2n er1ská er2s1od er2s1ol er2s1ón er1spor er1srá er1stra er2sut ersz2to er2t1ai ertá2p ert1ápo ertára2d ertár1ada er2t1elké ert1estj ert1esze er2t1é2j er2t1ékn er2t1évén er2t1é2vév er2tid er2t1i2m er2t1íz er2tos ert1órá er2t1ös er2t1öz er1t2ran er1trén ert1s er2t1út erubi2 1e2rup e2r1u2ra er1urá er1uru er1u2sz er1u2tá e2r1új e2r1úr e2r1ú2s er1útj er1útl er1ú2to er1útr e2r1üd e2r1ügg er1ügyb er1ügyn er1ügyr e2r1üled e2r1ür e2r1üs e2r1üt e2r1ü2v e2r1üz e2r1ű2z er2v1ala er2v1alt erva2n erv1any er2v1á2ru er2vása er2v1átk erv1e2lőké er2vereze er2v1e2sze er2vék er2vérte er2v1érz er2vos er2vös er2vú er1ya 2esa. e2s1a2b e2s1a2d 2esait e2s1alja es1alm esa2n es1any esa2p es1apá es1arc es1ass es1asz es1a2ty e2s1au 2esábó e2s1á2g 2esán es1ára es1á2ru 2esát es1bl es1br es2ch 1esdő es1dró 1esedez ese1fr ese2gye e2s1elm e2seng es1epri e2s1erd eseren2 1e2settü 2esé. esé2g1el 1eséll 1esély e2s1ép es1érc esés3s e2s1i2d esike2t1 e2s1ina es1i2pa e2s1isk 1esítőst es1í2zű e1s2kat e1s2kál es2kic 1eskü es2lat eslege2l esle2t1o es2lin e1s2lu e1s2mac esná2 2esok. 2esoka 2esokbó 2esokk 2esokr 2eson e2s1op 2esos. 2esosa es1osz es1ott e2s1ó2r esőká2 e2sőz es2pan es2pec es1p2l e1s2pó e1s2rá es1stá es3szab essz1aga essz1a2r 1esszenc es3szerű essz1élet essz1élt essz1int essz1ok es3szö e1s2tab es2taf es2t1a2l es2tana es2t1a2ny estapolc1 es2t1a2ra est1ará e1s2tat es2taz es2t1á2p est1áram es2t1ári es2t1árn es2t1át 1esteko es2tenz este2r1a es2t1este es2t1esti 1estéih 1estéj 1estém 1esténk es2t1ér. es2t1éri es2t1érr es2térte es2t1é2rü es2t1ill es2t1ina es2t1int es2tip es2t1isz es2tiz es2t1ol e1s2top esto2r es2t1os es2t1ó2r estö2 es2t1ös es2t1őr. es2t1őrk es2t1őrö es2t1őrr es2t1őrt es2tun es2tú es2tür es2t1ü2z e2s1ud esu2r es1ura es1urá e2s1utá es1úr. es1úrb es1úré es1úrh es1úri es1úrk es1úrn es1úrp es1úrr es1úrt e2s1ú2t e2s1üz e2sza2c esz1acé e2szad e2sz1a2e esz1ajt esza2k1é esz1akn esz1alj esz1any e2sz1ara e2sz1au e2száru e2sz1ás eszá2t esz1áts e2szece eszeg1ér e2sz1egy esz1ekés e2sz1ela e2sz1e2mel 1eszenc e2sz1erd e2szev e2sz1ex eszé2do esz1é2pí e2sz1é2ri esz1g2 esz1i2pa esz1isk esz1ist e2sz1ita e2sz1iz eszke2l 1eszme. 1eszméb 1eszméi 1eszméj 1eszmék 1eszmén 1eszmét 1eszmév e2sz1old eszö2l esz1ölő e2sz1ön es3zsá esz3se esz2tab esz2tad esz2t1a2gá esz2taj esz2t1ala esz2t1alj esz2t1ap eszt1árf esz2t1árn esz2t1e2v esz2t1ér. esztés3s 1esztéti esz2tid esz2t1ol esz2t1ó2r esztö2 esz2t1öl esz2t1őr. esz2tut esz2t1út esz2tüz e2sz1ü2g e2sz1ü2z 1e2szűs 1e2szűt esz1z et1abr eta2c et1acé e2t1a2d e2t1a2gá e2t1a2gy e2t1a2j et1a2kas e2t1akc et1akó e2t1aku eta2lag eta2lak et1a2lás e2t1alb et1ald et1alf e2t1alg et1alj e2t1alk 1e2talo eta2n1é eta2nyag e2tapr et1a2ra e2t1ará e2t1arc e2t1arz et1asp e2t1ass et1a2szá e2t1atk e2t1a2to e2t1aty e2t1a2u e2t1a2z et1ábr e2t1á2cs e2t1áf et1ág. e2t1á2ga et1ágb et1ágg et1ágn et1ágr e2t1áh et1áju et1áll e2t1álm e2t1á2rad et1áre et1árny etá2ron et1á2rú e2t1á2ta etát1a2d e2t1áth et1átl et1áts et1átu e2t1átv et1bl et1br et2ch et1dr etea2 eteg1á ete2g1e2l ete2gó e2t1e2ke. e2t1e2kei e2t1e2kek ete2k1ék e2t1e2kénk e2t1e2kés e2t1elc et1eldo ete2lege ete2legy et1e2lej e2telemz e2t1e2lesé e2t1eléré etelés1s e2t1elha e2t1elhá et1elhel e2t1eliga e2t1eljá e2t1ellá e2tellen e2t1elme e2t1elmén. e2t1elméne e2t1elmét e2t1elnev e2telnö e2t1elny e2t1e2lo ete2lőad et1elszá e2t1eltá e2t1elter et1eltérí e2t1elvá e2t1elvez e2t1elvo e2t1elz ete2mal e2t1ember ete2mel e2t1enz ete1p2 e2t1erd ete2rén etero1 e2t1erő ete2s1a e2t1este. e2t1eszté ete2teté ete2t1ér. 1e2tetésen 1e2tetésn ete2tos ete2t1ö ete1tra e2t1ezr etéé2 et1ég. et1égb et1é2gé et1égg e2t1é2gi et1égn eté2k1a2 eté2k1á2 eté2k1e2l et1ékí eté2kos e2t1élm e2t1érc e2t1é2ré. e2t1é2rén e2t1é2rér e2t1é2rét eté2rie e2t1érke e2t1érm e2t1é2rős e2t1értel e2t1érz eté2sa eté2s1ég eté2so etés3s eté2sza et1észl et1észr eté2t1a2 eté2ter. eté2tere eté1tra e2t1é2ven eté2ves. e2t1é2vet e2t1é2véh eté2véig e2t1é2véne eté2vétő et1évh et1évt et1fr et1gl et1gr et2hei eti2d et1ide et1ido eti2g e2t1ige e2t1igé e2t1igy e2till et1i2ma e2t1imá e2t1i2mi 1e2timo e2t1imp etina1 e2t1ind e2t1inf e2t1ins e2t1inte e2t1inv e2tinz e2t1i2pa e2t1i2ra e2t1iri e2t1iro e2t1iró e2t1ism e2t1iste e2t1i2sza e2t1i2szon e2t1i2ta et1izé e2t1izg e2t1izo e2t1izz e2t1íg e2t1íj e2t1ín e2t1í2r e2t1í2v e2t1íz et1kl et1k2r et1kv 1etnol et1oda e2t1okm e2t1okt e2t1oml eto2n1a2 eto2nál eto2n1is eton1n et1opc et1ope e2t1opt 2etor et1ord e2t1org e2t1orm et1orom e2t1ors e2t1orv et1ost etosz2f et1oszl et1oszt e2t1ou e2t1ó2c et1ó2ra et1ó2rá e2t1ó2v et1öko etö2l e2t1öl. et1ölé e2t1ölő e2t1ön e2t1ös e2t1öt et1ö2vü e2t1ö2z etőa2 etőe2l etőé2b etőfé2l1é2v e2t1őr. e2t1őrb et1őrc et1ő2réh ető2ri. et1őrk et1őrl e2t1őrn ető2rök et1őrp e2t1őrr e2t1őrs et1ő2rü ető1s2p et1pl et1pr et1ps e1trap e1trau e1t2rág e1tréf e1t2ril et1sk et1sn et1sp et1st et3tad ettai2 etta2n1ó2 et2telem et2t1ing et2tír et1t2rá et1tri etty1á2 e2t1ug et1una et1und et1u2ra etu2sz et1utá et1utó et1utu e2t1új e2t1ú2ri e2t1út e2t1üd e2t1üg e2t1üld e2t1üt e2t1ü2v et1ü2zem et3ya e1u eu2bo eu2ga eu1k2h eu2mal eu2m1e eu2mim eu2m1i2p eu2mis eu2m1iz eu2mí eu2mór eu2mő eum1p2 eu2mü eu2na eu2ná eu2ni eu2no eu2nó e2ur. eu2rá eur1áz eu2ri. eu2rig e2urt eu2szí e2utai eu2tal e2utan eu2taz e2utái e2utájá e2utáka e2utákk e2utákná e2utákr e2utánk e2utár eu2tó e2uts eu2zs e1ú eú2jí eú2sz eú2ti eú2to e1ü eü2dü eü2ge eü2gy eü2le eü2lé eü2li eü2lö eü2lő eü2lü eü2re eü2rí eü2rü eü2sz eü2te eü2tő eü2tü eü2ve eü2vö eü2ze e1ű eű2ri eű2ze eű2zé eű2zi eű2zö eű2ző evá2r1al eve2szö evé2lá evé2l1e2l evé2nyel evé2r1emb evé2rö evé2so evé2sza evé2szö evízi2óét ex1ab ex1al ex1ap ex1áb ex1á2r e2x1át ex1bl ex1br ex1dr e2xeg e2x1elm e2x1elvá e2x1er e2x1ék e2x1él e2x1ép ex1idő e2x1igé ex1inf e2x1ing e2x1int ex1izz e2x1íj e2x1ír e2x1ob ex1op ex1ön ex1ör ex1ös 1expan ex1sk ex1sp ex1st ex1új e2x1üg e2x1üv e2x1üz eza2c ez1acé e2z1a2d e2z1af ez1ajt e2z1a2l e2z1a2n ez1arz e2z1as ez1aut ez1áll ezá2ma ez1árb ez1árr ez1á2rú e2z1át ez1bl ez2dál ez1e2gy ez1e2kék e2z1ela e2z1e2leme e2z1elér e2z1elm e2z1el1ö e2z1e2mel ezen2t1e2 eze2r1a eze2rá eze2red eze2r1el eze2r1em eze2r1es eze2r1o ez1erő ez1este e2z1e2sz eze2t1a2 eze2t1á eze2t1eg eze2t1e2l eze2t1esz eze2t1ér. eze2t1é2rő. eze2t1é2ve. eze2t1o eze2tu e2z1ég e2z1é2j ezé2ká ezé2k1o e2z1él ezér1emb ezé2rett ezé2ru ezé2sa ezéskész1 e2z1é2te ez1fr ez1gr ez1i2do ezi2g e2z1igé e2z1i2ko e2z1ill ez1imp ez1iná ez1ind ez1inf ez1int ezi2o ez1ion e2z1i2p ez1i2r ezisé2g ezi2s1égé e2z1ism ezi2ta e2z1í2v ez1k2r ezkupac1 ez1kv e2z1ob ez1old ezo2nár ezon3n ez1opt e2z1ox e2z1ó2l e2z1ó2r ez1ó2t ez1ö2b ez1ös ez1ö2v ezőe2l e2z1ő2ri ez1őrl e2z1őrs ez1ő2rü ez1őrz ezős1orra ez1pl ez1p2r 1ezrede 1ezreds 1ezrel 1ezrem 1ezresn 1ezrű ez3saj ez3sap ez3sát ez3sáv e2z3sé ezsió2 ez3sl ez3sor ez3s2p ez3s2ta ez3str e2z3sü ez3sz ez1t2r ez1u2r ez1ut ez1új ez1ú2t e2z1üg 1e2züs e2z1üt e2z1ü2z 2é. é1a éa2da éa2dá éa2do éa2dó éa2ga éa2gi éa2já éa2ka éa2la éa2l1e éa2na éa2ny éa2ré éa2ri éa2ro éa2uk é1á éá2fá éá2gy éá2ju éá2ra éá2ro éá2ru éá2rú é2b1ag é2b1a2j é2b1a2k é2b1a2l éba2n é2b1any é2b1a2v éb1ál ébá2r éb2b1á éb1eszű é2b1é2k é2b1él é2b1ép ébié2 éb1isk éb1i2va éb1íz éb1kr éb1pl éb1pr 1ébres é2b1ug éb1üg éc1a2d éc1aj éc1a2k éc1a2l éc1a2n éc1ál éc1ár é2c1e2lem é2c1elv é2c1ember é2c1e2mel éc1gr éc3ha éc3há éc3hí éc3ho é2c1i2d é2c1il éc1ima éc1ob éc1os éc1őr éc1pr éc3sab écs1ol éc3sz é2c1u2t é2c1ül éc3zs é2d1ab é2d1a2c é2d1a2d é2d1a2g é2d1a2j éd1akc éd1akt éd1a2ku éd1alk é2d1a2n éd1apa éd1a2pá é2d1arc éd1asp éd1ass éd1a2ti éd1att é2d1ág éd1áp éd1dr é2d1e2g é2d1ej é2d1e2ke. éde2kétő é2d1e2l1a é2d1elk é2d1ell é2d1elo éd1ember é2d1eml é2d1enz é2d1ep éd1erd é2derei é2derem é2derg é2derl é2derné é2d1erő é2derrá é2derrő é2ders é2dertő 1édesa é2desem 1édesg 1é2desí é2d1ég é2d1é2j é2d1ékb é2d1é2ké é2d1ékk édé2l é2d1éle é2d1élm é2d1ép é2d1ér. é2d1é2ri é2d1érs é2d1érte é2d1értő é2d1érv é2d1érz éd1fr édi2ad édi2aka édi2al édi2ar édi2a1s édiasz2 é2d1i2d édi2g é2d1iga é2d1ige é2d1igé éd1i2ko éd1ill é2d1i2m éd1i2na éd1ind é2d1ini éd1ins é2d1int é2d1i2p é2d1iro é2d1i2z é2d1ín é2d1ír éd1ív éd1kl éd1okta é2d1op é2d1or é2d1osz éd1ott éd1ó2r éd1öl éd1ön é2d1ö2r éd1öt éd1öv éd1öz é2d1őrm é2d1őrn édős2 édő1sp éd1pl éd1pr é1d2ram éd2raz é1d2rám éd1sk éd1sp éd1sr éd1st éd1t2r é2d1ud éd1uj éd1ura é2d1u2t é2d1új éd1úr éd1ú2t é2d1üd é2d1üg é2d1üt é2d1üz éd3za éd3zá éd3ze éd3zó éd3zü é1e ée2bé ée2la ée2le ée2lő ée2me ée2pi ée2rő ée2se ée2sé ée2si ée2ső ée2sz1a2 ée2sz1á ée2szel ée2szép ée2szir ée2szis éeszt2 éesz1tr ée2uf ée2vé ée2vő é1é éé2ge éé2le éé2pí éé2ra éé2te éf1ai éf1ajtó éf1ing é2f1is éf1kl é2f1os ég1abl ég1abr ég1a2d ég1aka ég1akk ég1akn ég1alj ég1am ég1a2ny ég1a2p é2g1a2r ég1aut ég1a2v éga2z é2g1á2g é2g1ál ég1áp ég1árt égát1a2d ég1átá ég1á2t1e2 ég1átf ég1átj ég1átm ég1áts ég1átt ég1átv ég1bl ég1br ég1d2r ég1ece é2gedén é2g1edz ég1e2ge é2g1ej é2g1e2kés é2g1ela é2g1elb ége2leg ég2elek ége2lemb é2ge2leme ége2lemn ége2lemt é2g1elér é2g1elf é2g1elha ég1elhá ége2lin é2g1elis é2g1eljá é2g1elk é2g1ellá é2g1ellen é2g1elm é2gelnö ég1elny é2g1elö é2g1e2lőa ége2lőm é2g1e2lőn ég1e2lőt é2g1elp é2g1elr é2g1elsa é2g1elszí ég1elta é2g1eltá é2g1elvá é2g1elz é2g1enc é2g1e2ne é2g1eng ége1p ég1epi ége2rál é2g1erede ége2r1el égeri2 ége2rim ége2rin é2g1eró ég1erő ége2rül 1é2gesd é2g1essz ége2sze é2g1eszk é2g1eszt 1é2getj 1é2getőh 1é2getőn 1é2getőt ég1eva ég1e2ve ég1e2vé ég1evo é2g1ex é2g1é2g é2g1é2l é2g1é2neke é2g1é2neké é2génekk é2g1é2nekn ég1épí é2g1épü ég1é2ret é2g1é2rez égé2ré. é2g1érh é2g1é2ri ég1érl ég1érm ég1é2rő. ég1é2rők égért2 ég1érte ég1érté 1é2gésé 1é2gésn é2gést é2g1éva ég1fl ég1fr ég1g2l ég1g2r ég3gyo 1éghes 1éghü égi2as ég1i2den égi2g é2g1iga. égig1ap égig1as ég1igaz égig1á é2gill é2g1imá ég1ina ég1inf é2g1ing é2g1inj ég1ins é2g1int é2g1ira ég1iro é2g1i2ta é2g1iva é2g1i2zésn é2g1izg ég1íg ég1íj ég1ín ég1ír ég1ív ég1íz 1égj. égkia2 ég1kl ég1kr ég1kv 1égne. 1égnék 1égnén 1égnét 1égni é2g1ob ég1oki ég1ola ég1old ég1oli ég1oll ég1olt é2g1op é2g1o2r é2g1os ég1ott é2g1o2v é2g1ox é2g1óc ég1ó2r ég1öb é2g1ö2d é2g1ö2l ég1ön égö2r ég1örö é2g1ös é2g1öt é2göv é2g1ö2z 1égő. 1égők é2gőr ég1őri ég1őrö ég1ősi 1égőt 1égőv ég1pl ég1pr ég1ps ég1sk ég1sp ég1s2t égsz2 1égsz. égszáraz1 ég1tr é2g1ud ég1un é2g1u2t ég1úg ég1új ég1úr ég1ús ég1ú2t é2g1üd é2g1ü2g é2g1ür é2g1üs é2g1üt é2g1üv é2g1üz é2g1űz égvezé2 é2gy1a2 é2gyál é2gyedé é2gy1eg é2gyelek é2gyeleme égye2m é2gy1emb é2gy1eme égye2seké é2gy1esz é2gy1e2v é2gyeze é2gy1ék é2gyél égy1é2ne égyi2 é2gyin é2gyir é2gy1is é2gy1iv é2gyí égyo2 égy1ok égy1os égy1ot é2gy1ó2 égy1ö2l é2gy1u2 é2gy1ú é2gy1ü2l é2gyür éha2l éh1ala éh1any é2h1arc éh1art é2h1au é2h1a2v éh1edé 2éheg éh1e2gé éh1e2le éh1elé éh1elf éh1elh éh1ell éh1e2lő éh1elt éh1elv é2h1enz é2h1e2r é2h1esem é2h1e2to éh1evé é2h1ex é2heze 1é2hezé 1éhező 1é2hezt é2hezü é2hezv éh1ég éh1é2k é2h1é2l é2h1ép éh1érb éh1fl é2h1ic é2h1if é2h1i2n é2h1ip éhi2r éh1ira éh1irt é2hit éh1ita é2h1iz éh1ín éh1kr é2h1od éh1old éh1öb éh1ö2d éh1ös éh1pl éh1pr 1éhsé éh1sk éh1sp éh1ud éh1új é2h1üg é2h1ür é2h1üt é2h1űr é1i éi2dő éi2ga éi2gé éi2má éi2pa éi2rá éi2ro éi2ta éi2vás éi2vó é1í éí2rá éí2ro éí2ró éí2vá éí2ze é2j1ab é2j1a2da é2j1a2l é2j1any é2j1a2r é2j1á2l é2j1áp é2j1árn éj1eb é2j1e2lem é2j1elh éj1elm é2j1elv éj1emb é2j1esz é2j1e2v é2j1é2g éjé2j é2j1é2k é2j1él é2j1ép é2j1é2te 1é2ji. é2j1il é2j1im éj1i2n é2j1ip é2j1iz é2j1o2l éj1ó2r éj1öd éj1ön éj1ör éj1pl éj1pr éj1sp éj1sz éj1ud éj1u2r éju2t éj1uta é2j1úr é2jül é2j1űz ék1abl ék1a2cé éka2dat ék1a2dá ék1a2dó ék1ajt éka2kad é2k1aká é2k1akk é2k1akn éka2lag ék1a2lak é2k1alg é2k1alj ék1alko é2k1all é2k1alt ék1alu ék1amb ék1ang ék1app é2k1a2rá ék1arc ék1a2ré ék1arz é2k1asp é2k1ass ék1aszt ék1a2tom ék1a2ve ék1azo é2k1ál é2k1á2p ék1árad é2k1á2rak é2k1á2rá ék1árb é2k1á2ré ék1árh é2k1árk é2k1árn é2k1á2ro ék1árr é2k1á2ru ék1á2rú ék1ásó ék1ásv é2k1áta é2k1átá é2k1átc é2k1átd é2k1áte ék1áté é2k1átf é2k1áth é2k1áti é2k1átí é2k1átk é2k1átl é2k1átm é2k1átö é2k1átr é2k1áts ék1átt é2k1átu é2k1átv é2k1áz ék1bl ék1br ék1dr ék1egé é2k1e2kés é2k1elb é2k1e2leg ék1e2leme ék1e2lemé éke2lemm ék1e2lér é2k1elf é2k1elk é2kellá é2k1ellen é2k1elm é2k1elo ék1elp é2k1elta ék1eltá é2k1eltér ék1elül ék1elvi é2k1e2mel ék1eng éke1p2 é2k1erd é2k1e2rec é2kered é2k1e2rei é2k1e2rez é2k1erg é2k1e2ró é2k1e2rő é2k1e2sete ék1eszk éke1szl é2k1e2tet éke2tik éke2vés é2k1e2vo é2k1ex é2k1ég ék1éjs é2k1épí é2k1épü é2k1érc é2k1é2rem é2k1é2ren é2k1é2ré é2k1é2ri é2k1érk é2k1érl é2k1érm é2k1é2rő. é2k1é2rői é2k1é2rők é2k1érp é2k1érr é2k1érte é2k1érté é2k1értő é2k1é2rü é2k1érv é2k1érz 2ékés ékés3s ék1észl é2k1étk ék1étv é2k1é2ve. é2k1é2vek ék1é2vet é2k1é2véb é2k1é2vén é2k1é2vét é2k1é2vév é2k1évi ék1fj ék1fl ék1fr ék1g2r ékia2 éki2d é2k1ide ék1idé ék1ido é2k1idő éki2g ék1iga ék1ige é2k1igé ék1i2ko ék1ikr é2k1ill é2k1ima é2k1imá ék1imi ék1ind é2k1ing é2k1inh é2k1inn é2k1int é2k1inv é2k1i2o é2k1i2p é2kirán é2k1iro é2k1isk ék1ism é2k1ist éki2sza é2k1i2ta é2k1i2z ék1íj é2k1ír é2k1í2v é2k1í2z ék2kál ék1k2l ék1k2r ék1kv é1k2lu é2k1ob ék1of é2k1oká é2k1o2laj é2k1olda ék1oltás é2k1oml ék1opc ék1o2pe é2k1org é2k1orm é2k1orr é2k1orz é2k1osto é2k1ott é2k1ou é2k1ox é2k1óc ék1ó2l é2k1ón ék1ó2ra ék1ó2rá é2k1ó2v é2k1ó2z é2k1ö2b ékö2l é2k1öm ék1önt ék1ö2rö é2k1ös é2k1ötl ék1ö2vö ék1ö2zö ék1ő2r ék1ős ék1pl ék1pr ék1ps é1k2reá ék2rim ék1sh ék1sk ék1sl ék1sp ék1s2r ék1st ék1sz2 ék1t2r é2k1ud é2k1ug é2k1uj é2k1und é2kuni é2k1u2tac é2k1u2tak ék1u2tal é2k1u2tas é2k1utá é2k1új ék1úr. ék1úrn ékú2t é2k1úth é2k1úti é2k1útj é2k1útn é2k1úto é2k1útr é2k1útt é2kútv é2k1üd é2k1üg ék1ü2le é2k1ünn é2k1ür é2k1ü2s é2k1ü2t é2k1ü2v é2k1üz ék1űr. ék1űrb ék1ű2rö é2k1űz él1abl él1abr él1a2cé él1a2da él1a2do él1a2dó él1a2g é2l1a2j él1a2ka él1akc él1akn él1ako é2l1a2l él1amc él1a2me él1and él1apó él1arm él1asp él1ass él1asz él1a2to él1a2u é2l1a2va él1azo él1ábr é2l1á2g élá2l é2l1áll é2l1álmá é2lálmot é2l1álo é2l1á2p él1ár. él1á2rá él1árb él1árf él1á2ri él1árk é2l1árn él1á2ro él1árr él1á2ru él1á2rú él1árv él1át1a2 él1átc élát1e2 é2l1átf él1áth él1á2ti él1átj é2l1átm élá2tok él1átr él1áts él1átt él1átü él1átv él1bl él1br élc3sz él1d2r éle2b é2l1ebé é2l1e2dz él1eff él1e2gé élegész1 él1e2gy éle2k1a2 éle2k1á éle2k1e2l éle2kem éle2ker éle2k1es é2l1e2kés éle2kis éle2kol éle2k1on éle2kot éle2kó éle2k1ö2 éle2ku éle2k1ú él1e2l1a é2l1e2leg él1elf é2l1elo é2l1előe éle2lőj é2l1e2lők éle2lőt é2lemb é2l1e2mi é2l1emp éle2n é2l1ene é2l1eng é2lenj é2l1enn é2l1eny é2l1enz él1e2ró é2l1e2sés éle2szü éle2szű éle2t1a2 éle2t1á2 éle2t1eg éle2t1e2l éle2t1e2r éle2tesz éle2t1ék éle2tél éle2t1ér. éle2t1érd éle2t1é2rő. éle2térü éle2tés éle2téte éle2tété éle2t1étn éle2t1é2ve. éle2t1é2ved éle2t1é2vén éle2tik éle2tisz éle2t1o éle2tó életö2 éle2t1öl éle2t1ör éle2t1u2 éle2tüz éle2t1ű2z é2l1e2vő é2l1ex élé2d é2l1éde é2l1é2g él1é2hes él1ékek él1ékí é2l1é2l él1épü é2l1ér. é2l1érb é2l1érd él1é2rem é2l1é2ret é2l1é2ré é2l1érm é2l1érn é2l1érte é2l1érté é2l1é2rü é2l1érz élé2sa élés3s é2l1é2te é2l1étk é2l1év. é2l1é2v1á é2l1é2ves é2l1é2vet é2l1évez él1é2vén é2l1é2vér é2l1é2vi él1évü él1f2l él1f2r él1g2r é2l1i2d é2l1iga éli2gá é2l1i2ge é2l1igé é2l1i2ko él1ill éli2m él1ima él1imi él1imp é2l1ind é2l1inf é2l1ing él1int él1inv él1inz él1i2on é2l1i2p é2l1irá él1iro é2lism éli1s2p é2l1i2szá él1i2va é2l1i2vá él1izg é2l1izm é2l1i2zo él1íj él1í2r él1í2v él1íz él1k2l él1k2r él3lyu él2mat 1élmén é2l1ob é2l1okm é2l1oks é2l1ol é2l1o2r élos3s é2l1osz é2l1óc él1ó2n é2l1ó2r él1öb él1öc1 élö2k él1ö2l él1ön él1ör él1ös é2l1ö2z élőe2 él1őrü 1é2lősk él1p2l él1p2r élrádi2 élre1pr él1sk él1sp él1st él2sz1árnn él1szt éltal2p1al él1trá él1tré él1tri él1tró é2l1ud é2l1ug é2l1uj él1ult él1u2r é2l1u2tas él1utó é2l1új él1úr é2l1üg él1üll él1ült é2l1ür é2l1üs é2l1üt é2l1üv é2l1üz él1űz 1élvező é2ly1ab é2ly1a2d é2lyaj é2ly1a2l ély1a2n é2ly1ap ély1a2r é2ly1as ély1au é2ly1av ély1az é2ly1á2l élye2c é2lyef ély1egy é2lyekés é2ly1el é2lyeml é2lyene é2ly1ent é2lyer é2lyeti é2ly1é2j é2ly1ék é2lyél é2lyés ély1f2 é2ly1ira ély1k2 é2lyol é2ly1ó é2lyös é2ly1öz é2lyő ély1s élyú2 é2lyültet é2lyüt ém1abr éma1d2 ém1a2da ém1a2dó émae2 émai2k ém1ajt ém1akk ém1all ém1alm ém1app ém1arc ém1arm émas2 éma1sp émat2 éma1tr ém1aut ém1a2zo émá2c émá2l ém1álm ém1álo é2m1áp ém1árn é2m1áru émát1a é2m1átt ém1b2l ém1b2r ém1dr éme2c éme2g é2m1e2ke. é2m1e2kés ém1ela éme2led é2m1elh é2m1ell ém1e2lő ém1els é2m1elv ém1e2re ém1ern ém1e2rő éme2s1á é2m1esemé é2m1esz éme2ta éme2tel éme2t1ék éme2to é2m1e2v é2m1ex ém1éks é2m1é2l é2m1ép é2m1érc ém1érd é2m1éri é2m1érm é2m1érté é2m1és é2m1é2te ém1fl ém1fr ém1gr émi2al é2m1i2d émi2g é2m1igé ém1iks ém1ill ém1ind ém1inf é2m1inv é2m1i2o é2m1i2p ém1irá ém1irh é2m1iro ém1isk ém1ism émi2sz ém1i2ta ém1izo é2m1ír ém1í2v ém1íz ém1kl ém1kr émo2nac émo2ne émon1n émont2 ém1o2p ém1ost ém1ox ém1ó2l ém1ó2r ém1öb ém1ö2l ém1ön ém1ös ém1öt ém1öv ém1ő2r ém1p2l ém1p2r ém1sk ém1sl ém1sp ém1s2r ém1s2t ém1sz2 ém1t2r ém1uj ému2n ém1una é2m1u2r é2m1úr é2m1üg é2m1ür é2m1üt é2m1üv é2m1üz ém1wh én1abb é2n1abl é2na2dal én1adá én1a2do én1agá én1agr én1akc é2n1akn én1akt én1alk én1ana én1ano én1ant éna1pré én1arc énas2 éna1sp é2n1ass én1atm é2n1a2tom éna1t2r é2n1au é2n1ág éná2l én1ála én1álc én1áld é2n1áll é2n1á2p é2n1á2rak énás1s én1ásv én1áta én1átb én1áte én1átk én1átö é2n1átr én1átt én1átü é2n1átv énba2 én1bl én1br én1d2r é2n1ef én1e2gy 1é2ne2k1a2 1é2nekd é2neke. 1é2nekei 1é2nekek 1é2nekem éne2ker 1é2nekes éne2k1é2j 1é2nekf 1é2nekg éne2kiz 1é2nekí 1énekj 1énekka 1é2nekl éne2kó éne2k1ö 1é2neks én1ela én1elg én1elh én1elj én1ell én1eln én1e2lő én1elp én1els én1elt én1elv én1eml éne2n é2n1ene éne2r1a éne2r1á2 éne2reme én1eró é2n1e2sz éne2t1a2 éne2t1á2 éne2t1e2l éne2test éne2to é2n1e2v é2n1ex én1éjb én1ékb én1é2ké én1é2ki én1é2kű éné2l é2n1éle é2n1élő éné2m1a én1éneke é2n1ér. é2n1érc é2n1éré éné2ter 2énéz én1f2r énfüstö2 énfüs2t1öl én1g2r én1ido éni2g é2n1igé én1iko én1ill én1imi én1ina én1ind én1inf én1inh én1int é2n1i2p én1ism é2n1ita é2n1iva é2n1i2z én1íj én1ín é2n1ív én1k2l én1k2rá én1k2ré én1kri énmű1 én3nyo é2n1ol én1oml én1ond é2n1or é2n1osz én1ot é2n1ox én1óc é2n1ó2r én1ök én1öl én1ön én1ör én1öt 2énöv é2n1ö2z én1ő2s énpe2 én1pl én1pr én2sas én1s2p én1s2t2 én2sú én1tra én1trá én1t2ri én1tró é2n1u2t én1út é2n1ü2g é2n1üle é2n1ür é2n1üs é2n1ü2v é2n1ü2z é2ny1a2 é2ny1á2 énye2c é2ny1ece é2nyecse é2ny1e2dz é2nyef é2ny1egy é2nyekés é2nyela é2nyelá é2ny1ell é2ny1elo é2ny1elvá ény1elvű ény1elvv é2nyema ény1enc é2ny1ep é2nyerd ény1ered é2ny1e2rő é2ny1e2sett é2ny1e2sés é2ny1e2ső é2ny1essz é2ny1esté é2ny1e2sz é2nyeta é2nyeti é2nyetű é2ny1ev é2ny1ég é2ny1é2j ényé2k ény1éke ény1ékh ény1ékn ény1ékt é2ny1é2l é2ny1ér. é2ny1érd é2nyéré é2ny1é2ri é2ny1érn é2nyérte é2ny1érté é2ny1é2rü é2ny1érv é2ny1érz é2ny1és é2ny1é2te é2ny1étt é2nyéva é2ny1if ényi2g é2ny1igé é2ny1i2ko é2ny1ing é2ny1ira é2nyiro é2nyisk é2nyita é2nyiz ényí2r ény1írá ény1író é2ny1ok é2ny1o2l é2ny1o2r é2ny1os é2ny1ó2 ényö2 é2nyön ény1ör é2ny1ös ény1öz é2ny1ő2 ény1s ényt2 ény1tr é2nyu ény1u2r ény1us é2nyúj ény1út é2ny1ü2lő é2ny1üs é2ny1üv é2nyüz énza2 én2z1ad én2zag én2zak én2z1al én2zar én2zau én2z1ál én2z1ás én2z1át én2z1e2r én2z1im én2z1in én2zis én2zí énzo2 én2z1ol én2zor én2zos én2zör én2z1ő én2zsa én2zse én2zur én2zú énz1z é1o éo2la éo2pe éo2sz é1ó éó2ra éó2ri é1ö é1ő ép1ado é2p1a2j ép1alk épa2ny ép1apo épa1pr ép1arc ép1aré ép1ass ép1atl épau2s ép1aut ép1a2va é2p1á2g é2p1álla é2p1állo ép1áp ép1ár. ép1árb ép1árf ép1ári ép1á2ro ép1á2ru ép1á2rú ép1átb ép1átj ép1átl ép1átm ép1áts ép1átü ép1átv ép1bl ép1br ép1dr é2peb ép1e2gé ép1e2gy é2p1e2kés 2épel é2p1ela é2p1elá é2p1elb é2p1elc ép1e2lemb é2p1e2leme ép1e2lemr é2p1elér é2p1elf é2p1e2lin ép1eljá é2p1elk ép1ellá é2p1ellen é2p1elm é2p1elo é2p1e2lőke é2p1elr é2p1eltér ép1elu épe2n é2p1ene é2p1e2p é2p1er épe2rő é2p1esem é2p1e2ser é2p1e2sett é2p1e2sés é2p1e2ső é2p1este é2p1esté é2p1esti é2p1estj épe2sz é2p1esze é2p1eszk é2p1eta ép1e2tete épe2teté é2p1etű ép1eva é2p1ex é2p1ég é2p1é2k é2p1é2l é2p1é2neke é2p1ér. é2p1éri épé2sa é2p1éte ép1fl ép1gr é2p1i2d é2p1i2ko é2p1imp ép1ind ép1ing é2p1ins é2p1int ép1i2pai é2p1i2ra é2p1i2rá é2p1i2ro é2p1irt ép1isk é2p1ism é2p1ist é2p1i2ta é2p1iz ép1ín é2p1í2r 1építm é2p1ív épká2r ép1kl ép1kr ép1kv éple2t1ö ép1ob é2p1ok ép1old ép1olv ép1on ép1op ép1orm ép1ors ép1osz é2p1óc é2p1ó2h ép1ó2r ép1öl ép1öm ép1ön épö2r ép1ös ép1ö2z ép2p1ek ép2pí ép1p2l ép2p1od ép1p2r é1prog ép2rózá ép1sh ép1sk ép1s2n ép1sp ép1s2t épsz2 ép1t2r ép1udv ép1ug é2p1uj épu2n ép1uno é2p1u2r épu2s é2p1u2t ép1új ép1ús ép1út é2p1üd é2p1üg é2p1üld 1épüle é2p1ür ép1üs é2p1üv é2p1üz ér1abl ér1abs é2r1a2d ér1a2gá ér1agg ér1agy ér1a2ja ér1ajt é2r1a2ka é2r1akc é2r1a2la ér1alá ér1alg ér1alk ér1alm ér1alv ér1amb ér1amp ér1ane ér1ani ér1a2no ér1ant ér1a2pá ér1a2pó ér1app ér1apr ér1a2ra ér1a2rá ér1arc ér1asp ér1ass ér1a2ti ér1atk ér1atl ér1a2to éra1t2r ér1att ér1aty é2r1a2u ér1a2va é2r1a2x ér1a2zo é2r1ábr ér1ág. é2r1á2ga ér1ágb ér1ágg ér1ágy é2r1á2l ér1á2p ér1árá ér1árk ér1á2ro ér1árp ér1árr ér1á2ru ér1á2t1a2 ér1á2t1á2 ér1átc ér1á2t1e2 ér1áté ér1átf ér1áth ér1átj ér1átl ér1átm ér1á2tö ér1átr ér1átú ér1átü ér1átv é2r1áz 1érbán ér1bl ér1br ér2caj ér2c1a2l ér2c1a2n ér2c1as érc3c 1ércd ér2cedé ér2c1emb ér2c1esz ér2c3h ér2cil ér2c1im ér2ciz ér2c1o ér2có ér2c1ö ér2cő ér2c3seb ér2c3sis ér2cú ér2cz ér2d1am ér2d1á2 1érdekbő 1érdeke. 1érdekei 1érdekel 1érdekl 1érdekt 1érdekü 1érdekű 1érdemé ér2d1erő érd1este érdés3s ér2d1i2ná ér2d1iz ér1dra érdü2l ér2d1ülé ér2d1ülő ér2d3z ére2b ér1eba é2r1ebe é2r1ebé é2r1ebr ér1eff ére2g1a2 ére2g1á ére2ged ére2gel ére2g1em ére2gen ére2g1e2r ére2gev ére2g1él éreg1g ére2gin ére2go ére2g1ö2 é2r1e2gy éregyez1 é2r1ej é2r1e2kén. é2r1elá é2r1e2leg é2relemz ér1e2lég é2r1elis é2r1elk é2r1elo é2r1e2lőa ére2lőir é2r1e2lől é2r1e2lőme é2r1e2lőn ér1elr ér1eltá ére2m1a ére2má é2rember ére2m1eg é2r1emel ére2mes é2r1e2més ér1e2mis é2reml ére2m1o ére2m1ó é2re2mu ére2n é2r1ene é2r1e2r ére2ső é2r1eső. é2r1esőb é2r1esőj é2r1esőn éres1ő2r é2r1esőt é2r1esté ére2t1a ére2tá ére2t1eg ére2t1el ére2t1ér. ére2t1é2ve. ér1e2ve é2r1e2vé é2r1é2d é2r1é2g é2r1éj. é2r1é2jét é2r1é2k é2r1é2l é2r1é2neke é2r1ép é2r1é2ri éré2s1el éré2sza éré2szá éré2ter é2r1étk ér1é2ve. é2r1évn ér1évv érfiá2 ér1fl érfo2g1ón. érfo2g1ós érfoto1 ér1f2r ér1g2r éri2al éri2csi é2r1ido érié2n ér1ifj éri2g é2r1iga é2r1ige é2r1i2ko é2r1ill é2r1i2ma é2r1i2má é2r1i2mi é2r1i2na é2r1ind é2r1inf é2r1ing é2r1inj é2r1ins é2rint ér1inv é2rinz é2r1i2o é2r1i2pa ér1ira é2r1isk ér1ism é2r1ist é2r1i2sz é2r1i2ta é2r1iva é2r1ivá é2r1i2z ér1íg ér1íj é2r1ín é2r1ír é2r1í2v é2r1í2z ér2jan ér1k2l érkö2z1e2pé ér1k2r ér1k2v érle2t1öl 1érméé 1érméj 1érmék 1érmi. é2r1o2l ér1ont éro2p ér1ope é2r1o2r ér1ott ér1ovi é2r1o2x éró2l ér1ólo ér1óri é2r1ö2b é2r1ö2c ér1öko é2r1ö2l é2r1öm é2r1ön é2r1ör é2r1ös ér1öt ér1öv é2r1ö2z érő1f2 ér1pl ér1p2r 1érsek ér1s2k ér1sl ér1s2p ér1s2r ér1s2t érsz2 ér1szk ér2tat 1értekez ér2t1ela 1értelm 1értesí 1értékil 1értékm értés3s ért1ö2ve 1értőc 1értőg 1értőü ér1t2ran ér1trá ér1t2ren ér1t2ré 1ér1t2ro ér1tró ér1uga é2r1uj éru2m1e éru2n ér1una é2r1u2r éru2s1ér ér1u2sz ér1uta ér1utá ér1u2to é2r1u2z é2r1új ér1ú2r ér1ú2s érú2t é2r1ü2g érü2ké. é2r1ür é2r1üs é2r1üt é2r1ü2v é2r1üz é2r1ű2z érv1a2dó érv1ala ér2v1a2n ér2v1á2gy 1érvel ér2v1elem ér2v1égb ér2v1égh ér2vék ér2vél ér2vu 2érzá 1érzék. 1érzékb 1érzéké 1érzékh 1érzékk 1érzékn 1érzékr 1érzékt 1érzékü 1érzékű 1érzésil és1abl é2s1a2d és1agy és1ajt és1a2ka és1akl és1akn és1ako és1akt és1a2la és1alg és1alk és1all és1alt és1alv é2s1am és1ana és1ant és1a2ny és1apa és1apr és1ara és1a2rá és1arc és1aré és1arm és1arz és1asp és1ass é2s1a2u ésá2c é2s1ál és1árt ésá2s és1áta és1áth és1átl és1bl és1d2r ése2b é2s1ebé é2s1ef és1e2ge és1e2gy é2s1e2ke. é2s1e2kei é2s1e2kés é2s1eks é2s1ekv és1ela és1elá és1elb és1elk é2s1elm és1elo és1elr é2s1elvé és1elz és1ember é2s1e2mel é2s1eml ése2n é2s1ene é2s1eng é2s1eny é2s1e2p és1erő é2s1esz é2s1eto é2s1ev é2s1ex és1égb é2s1é2géb é2s1é2géé és1é2géh és1é2gén é2s1é2gév é2s1égh é2s1é2gi é2s1égn é2s1égv é2s1é2hen é2s1é2j é2s1é2k é2s1é2l é2s1ép é2s1ér. és1érb és1érc é2s1érd é2s1é2rem é2s1é2ren é2s1é2ré é2s1érh é2s1érl é2s1érn é2s1é2rő. é2s1é2rők é2s1é2rőv és1érr é2s1érte é2s1érté é2s1értő é2s1é2rü é2s1érv és1ész é2s1é2te és1é2ve. és1é2vet és1é2véb és1é2vét és1é2vév és1fl és1fr és1gr é2s1ic é2s1id é3sidet ésié2 ési2g és1iga és1ige é2s1ikt é2s1ill é2s1imi és1imp és1ind és1inf é2s1ing é2s1int és1inv é2s1i2p é2s1ira é2s1i2rá és1iro é2s1i2s é2s1i2ta é2s1i2vá é2s1í2r é2s1ív és2katu és1kl és1k2r és1kv é1slág é2s1ob és1oko és1okt é2s1o2l é2s1om é2s1op 2ésor és1org és1orn és1orv é2s1os é2s1ot és1o2v és1óc és1ó2l és1ón és1ó2r é2s1ö2l é2s1ön é2s1ös é2s1öt é2s1ö2v é2s1ö2z és1p2l és1p2r és2pri és1ps és1s2k és1s2p és1s2t éssz2 és3szab és3szag és3szak és3szap és3szá és4szel. és3szere és3széle és3szf és3szi és3szí és3szo és3szó és3szö és3sző és3szt és3szú és3szül és3szű ést2r és1tra és1trá és1tré é1stru és1ud és1u2r é2s1u2t é2s1ú2t é2s1üg é2s1ünn é2s1ür és1ü2té é2s1üz ész1abl é2sz1a2d ész1agy é2szaj északá2 észa2k1áz é2szakc észa2k1ü ész1ale ész1alg ész1all észa2n ész1ant ész1any észa2p ész1apo é2sz1a2r é2sz1as ész1a2to é2sz1au é2szaz 2észá é2száb é2sz1á2g észá2l ész1állá és3záp ész1áram é2szárá ész1árán ész1árf ész1árk é2sz1árn ész1á2ru é2szás é2sz1á2t ész1á2z é2sz1e2ge. é2sz1e2gei é2sz1e2gy é2sz1ej észe2k1a2 észe2ká ész1ekés észekö2 észe2köv é2sz1ela é2sz1e2leg ész1e2lemb ész1e2leme ész1e2lemé ész1e2lemm ész1e2lemn é2sz1elk ész1előd é2sz1előr é2szelőz ész1ember é2sz1emi é2s3zené é2sz1eng é2sz1ep ész1e2rez ész1e2rén ész1erkö é2szerő ész1e2sete ész1eszt észeta2 észe2t1ak észe2t1e2l észe2t1ér. észe2t1o észe2t1ör ész1e2ve é2sz1ex é2szég é2sz1ékt é2sz1é2l é2sz1é2p ész1éré é2széró é2szész é2sz1é2te é2sz1étk é2sz1i2d é2szif ész1i2ko é2sz1ikt é2sz1ill é2sz1im é2szina é2sz1ind é2sz1inf ész1ing é2sz1inté ész1io é2sz1i2p é2szira é2sziro é2szirt é2sz1i2s é2sz1ita é2sz1iz ész1í2j é2szír ész1í2vá ész1í2vé ész1í2vó ész1k2 ész1okt észo2l ész1old ész1olt é2szop ész1ors é2sz1os é2sz1ot é2s3zón 2észö és3zöld ész1ölt é2sz1ön é2sz1ös é2szöt ész1őrs ész1p2 ész3su ész3sű észtés1s ész2tors észtorz1 ész1tra ész1tri és3zul ész1ut ész1úrn é2sz1út é2sz1ü2g é2szünn é2szüt é2sz1ü2z é2szűz ész1z ét1abla ét1a2do ét1a2dó ét1adt ét1agg éta1gr étai2k é2t1ajk é2t1ajt ét1akc éta1kr ét1akt é2t1alj é2t1alk ét1als é2t1alt é2t1ani é2t1ann é2t1ant ét1anya ét1anyá é2t1aps é2t1arc é2t1arg ét1aszt état2 ét1atom étaü2 ét1azo ét1ábr é2t1á2g é2t1áll ét1á2rad ét1á2ram ét1á2rá é2t1á2ri é2t1á2rú ét1árv ét1áti é2t1átr é2t1átv ét1bl ét1dr étea2 é2tedén éte2g1a2 éte2gele éte2g1elv éte2ger éte2go é2t1e2ke. é2t1e2kei éte2la éte2l1á éte2l1e2l éte2l1er éte2l1ék éte2l1ér. éte2l1é2ren éte2léré é2telfog é2tellen éte2lo é2t1e2lől éte2l1ő2r é2t1e2mel étera2 éte2rad éte2r1ag éte2r1á2 éte2reg éte2rel étermo1 é2t1erő éte2sik é2t1estün é2t1esv é2t1eszm ét1e2vi été2g ét1ég. ét1ége ét1égé ét1égn ét1égt é2t1é2j é2t1é2l é2t1é2ren é2t1é2ré é2t1é2ri é2t1é2rőt é2t1érte é2t1érté é2t1é2rü é2t1érv é2t1érz ét1észl é2t1étb é2t1é2té é2t1étn é2t1étr é2t1é2ves ét1fl ét1fr ét1gr é2t1i2d éti2g é2t1ige é2t1igé é2t1i2ko é2t1i2m é2t1ind é2t1inf é2t1int éti2p é2t1ipa é2t1irá ét1iro étis3s éti2sz é2t1i2vá ét1izé é2t1í2r é2t1í2v ét1kl ét1kr 1étkű ét1kv étmeg1g ét1o2ká ét1o2ki ét1okm ét1o2l é2tola é2tolv ét1oml é2t1op ét1ord ét1org éto2ris ét1orm ét1ors é2t1óc ét1ó2ha ét1ón. ét1órá étö2k étö2l é2t1ömö é2t1ön étö2rül é2t1ös ét1ö2t ét1ö2v é2t1ö2z ét1őr. ét1őrb ét1őri ét1őrm ét1őrö ét1őrü é2t1ő2s é2t1ő2z étpen1 ét1pf ét1pl ét1pr é1t2rafá ét2réf étro2m1é2 ét1sl ét1sm ét1sp ét1st ét1t2r ét1udv é2t1ug é2t1uj étu2n ét1una ét1und é2t1u2r é2t1u2t ét1ú2s é2t1üg é2t1ür ét1üs é2t1üt é2t1ü2v é2t1ü2z étű2z é2t3ye é1u éu2ni éu2ta éu2tá éu2zs é1ú é1ü éü2gy éü2le éü2lé éü2lö éü2lő éü2rü éü2té éü2tö éü2tü éü2ze é1ű é2vad 1évad. év1adó 1évadr év1agy év1ajá é2v1a2la é2valá é2v1alk é2v1am é2v1a2n év1arc év1au év1ava é2v1a2z é2v1állo é2v1áta év1áth év1átk é2v1átr évá2z év1ázá 1évbeo é2v1e2g 1é2vei 1é2vekt év1ela 1évelf 1é2v1eli é2v1ell év1eln é2v1elo é2velő é2v1els é2v1elt é2v1elv é2v1eng 1é2venk 1é2vent év1e2ri é2v1e2rő 1é2vesb 1évesé év1e2sés 1évesf 1é2vesi 1é2vesk 1é2vesr év1esté év1eve év1é2ge év1é2gé év1égr év1égt év1ér. év1é2ré évé2ri. év1érr é2v1érte é2v1érté évé1ska évé1s2p évé1stá év1gr évi2g év1iga é2v1igé 1é2vih 1é2vik 1é2vim é2vin év1ind 1évine 1éviné év1ing év1int év1ism 1é2vitő 1é2viv é2v1ír 1évkös év1kr 1évny év1ok év1os év1ó2r év1ö2r év1ös év1öt 1é2vőd év1pr év1sk év1st év1sz évsza2k1as évtá2r1a2d 1évtő. év1ur év1új év1ú2t é2v1üg é2vük. é2vükb é2vüke é2vükh é2vüki é2vükn é2vükt é2vülj é2v1üt é2v1üz 1évzá éz1a2d éza2gal éza2ge éz1a2j éz1akr é2z1a2l éza2n éz1any éz1a2r éz1as é2z1a2t éz1az é2z1á2g é2z1á2l éz1ásv éz1áz éz1bl éz1d2r éze2c éz1ece é2z1e2dé éz1e2gé éz1e2gy é2z1ela é2z1eld é2z1e2le ézel1en é2z1elf é2z1elh é2z1ell éz1előb éz1előé éz1előg éz1elői éz1előj é2z1e2lőké éz1előn éz1előp éz1elős éz1előt éz1előv é2z1els é2z1elv é2z1emb éz2en. éze2n1á éz1enz é2z1e2p éze2r1a éze2r1á éze2r1in éze2rip éze2ro éz1erő éz1e2rű éz1esz éze2ta éze2t1á éze2t1eg éze2t1e2kéh éze2t1el é2z1e2v é2z1ex é2z1é2d é2z1ég é2z1ék é2z1é2l é2z1ér. é2z1érc é2z1é2ri é2z1érm é2z1érp é2z1érté é2z1érz éz1fr ézgé2 éz1g2r ézi2d éz1ido é2z1igé é2z1ill éz1imp éz1ind éz1ing é2z1int ézi2o éz1ion é2z1i2pa é2z1ipá é2z1i2r é3zire é3zirő ézis3s ézi2s1ú ézi2sza ézi2s3zá éz1i2ta é2z1i2vá éz1izm éz1izo é2z1izz éz1í2j éz1ír éz1í2v éz1íz ézkar2c3h éz1k2l éz1k2r éz1ola éz1old éz1op é2z1or éz1osz é2z1ox éz1öb éz1ö2k éz1ön éz1ör éz1ös éz1öt éz1ö2v ézőa2 éz1őr. éz1pl éz1p2r éz3saj éz3sar éz3seb éz3ser éz3sik éz3sín éz3sod ézsó2 é2z3sók ézs1ór éz3sö éz3spi ézs1s éz3sug ézs1ú2r é2z3sü éz3sz éz1t2r éz1ug éz1uj é2z1u2r éz1ut é2z1ü2g é2z1ür é2z1üs é2z1üt é2z1ü2z éz1űr éz3zsa 2f. 1fa faát1 fa1b2ro fa2chi fac3hi. fa2c3ho fa1d2r faegyez1 fae3lek fae2r faé2d fa1f2r fa1g2r fagyé2 fa2gyék fa2gyol fa2győ fa2gyúr fai2d fai2s fa2j1a2l fa2j1az fa2j1ág fa2j1á2ru fa2j1egys fa2jelem fa2j1elk fa2jelm fa2j1eln fa2j1elv fa2j1es fa2j1ö fa2jő fajt2 faj1tr faju2r faj1ura fa2jü fa1k2l fa1k2r fa1k2v fa2l1a2dá fa2l1a2dó fa2lajá fa2l1a2kó fa2l1a2l fala2n fal1any fa2lav fa2l1azú fa2l1ábr fa2l1ál fa2l1á2ro fa2l1áth fa2l1átv fal1e2gy fa2l1elem fa2l1elő fal1ese fa2l1éri fal1f2 fa2lid fa2l1inj fa2l1iz fa2l1í2 fa2l1ol fa2l1oml fa2lor fa2l1os fal1órá falö2 fa2lök fa2l1öv fa2l1őr fal1p2 fal2s1ín. falta2n fal2tem fal2tip fal2tüz fa2lü fa2n1e2vet fan1évb fan1évr 2f1a2nya. faó2r fa1p2l fa1p2r fa2r1a2dá fa2ragy fa2r1a2kó fa2r1a2l fa2r1at fa2r1a2v fa2r1ácc fa2r1ál fa2r1á2z fa2r1em fa2r1e2pe fa2r1id fa2r1iná fa2r1ing fa2r1izm fa2r1izo far2k1al far2kol far2mál far2min far2m1unká fa2r1okke fa2r1osz fa2r1ut fa1s2k fa1s2p fa1sta fa1sté fa2sz1ív. fa1tri fau2r fau2s fau2tá faü2t faü2z fa2xe faxi2 fa2x1ik fa2xin fa2xí fa2xö fa2xú fa2xü fa2xű fa1ya fa1ye 1fá f1ábr fá2c3h fá2gép fáj2lak fáj2lá fáj2l1e2 fáj2l1í2 fá2ní fánka2 fán2kar fán2ká fán2tad fán2t1a2g fán2tan fán2t1á2 fán2t1e2 fán2tis fán2tor fán2tö fá2po fá2ram f1á2rá fás3s fá2t1a2 fá2t1á fá2te fá2t1érd fá2t1i2s fátmű1 fá2t1ol fá2t1ü2 fázi2s1ág fázi2s3z fba2l1 fc2lu fd2ró 1fe fe2aa fe2aá fe2ab fe2ac fe2ad fe2ae fe2aé fe2af fe2ag fe2ah fe2ai fe2aj fe2am fe2an fe2a1p2 fe2ar fe2as fe2at fe2aú fe2av 2f1e2dz fe2ed fe2el fe1f2r fe2gy1i fe2győ fei2n1i fe2ja fe2j1á2 fe2j1egy fe2j1elm fe2j1e2r fe2j1esz fe2j1e2v fe2j1o fe2j1ös fej1tr fe2j1u fe2jú fek2t1emb fe2l1a2 fe2l1á2 fele2c fe2l1e2dz fe2l1e2g fe2l1e2h fe2l1elev fe2l1e2mel fe3lemen fe3lemet fe2l1e2més fe2l1eml fe2l1eng fe2l1enn fe2l1e2re fe2l1esd fe2lesed fel1eseg fe2l1e2sett fe2l1esés fe2l1esik fe2l1esk fe2l1esni fe2l1e2ső fe2l1essen fe2l1este fe2l1estü fe2l1e2sz fe2l1e2tes fe2l1e2tet fe2l1ettek fe2l1ettél fel1e2ve fel1e2vé fel1evi felé2d fe2l1éde fe2l1é2g fe2l1é2k fe2l1é2l fe2l1é2p fe2l1ér. fe2l1é2rek fe2l1éren fe2l1érh fe2l1éri fe2l1érj fe2l1érk fe2l1érn fe2l1érs fe2l1ért fe2l1érv fe2l1étet fe2l1i2 fe3lib fe2l1í2 fel3l fe2l1o2 fe2l1ó2 fe2l1ö2 fe2l1őg fe2l1őr fel1p2 felt2 fe2l1u2 fe2lú 2f1e2ner fen2n1a2 fen2ná fenne2 fen2nev fen1sc fer1abl fe2rak fe2r1áll fe2r1á2r fere2g fer1egy fe2r1old fe2r1olj fe2r1oln fe2r1olt fe2sem fe2s1er 2f1e2sé feu2m1é2 fe2vő fe2z1ér. fe2zó fe2zs 1fé féka2 fé2k1ad fé2k1ag fé2k1al fé2kas fé2k1au fé2k1á2 fé2k1e2g fék1ell fé2k1er fé2k1ék fé2k1é2l fé2k1ér. fé2k1o2l fé2k1or fé2kön fé2k1u2 fé2k1ú fé2l1a2 fé2l1á2j fé2l1á2r fé2leg fé2l1ekk fél1elé fé2l1ell fé2l1elő féle2m fél1emb fé2l1eme fé2l1e2r fé2l1ese fé2l1esz 2f1é2let fé2l1ez fé2l1éva féligaz1 fé2lin fé2lir fé2l1is fé2liv fé2lí fé2l1ok fé2los fé2ló fé2l1ö fé2lőr félpen1 fél1t2r fé2l1ú2 fé2mab fé2mad fé2m1a2g fé2m1a2j fé2m1a2n fé2m1ap fé2mau fé2maz fé2m1ác fé2m1ál fé2m1ec fé2medé fé2me2két. fé2m1e2l fé2m1emb fé2mer fé2mez fé2m1é2k fémé2r fé2m1éré fé2m1i2n fé2m1ir fé2m1is fé2mit fé2m1iz fé2mí fé2m1o fé2mó fé2mö fé2m1u fémü2 fé2m1ül fé2ny1e2g fé2ny1e2l fé2ny1e2r fé2ny1is fé2ny1í fé2nyo fé2nyö fé2nyú fé2pí fé2pü 2féraá 2féraf 2férai 2féral 2férar 2férád 2féráé 2férám fér2cem fére2g1e2 fé2s1orr fész1al fészá2 fész1ár fé2szeg fé2sz1el féta3u2 2f1évk fé2zs fézs1e2 fézs1o ffe3li ffi2ac ffi2ag ffi2aka ffi2am ffi2at ffli2 ff1sh 1f2fy fg2ló 1fi fi2aa fi2aá fi2ae fi2aé fi2af fi2ah fi2aí fia2la fi2ao fi2aó fi2aö fia1p fi2apa fia2ra fia2rá fi2aré fi2aszá fi2aszo fi2au fi2aü fi2avá fi2ave fiá2l fi2c3h fici2t1á fi2dan fi2d1á fi1drá fie2l fie2n fie2r fie2s fies1e fie2t fi1fl fi1fr 2f1i2gaz fi1k2l fi1krá fi1kré fi1kri fi1k2v fi2lac fil1ada fil1akn fil1akt fi2lal fi2lam fi2l1ál fi2lár fil1elt fi2l1en fi2les fil1esz fil1ért fi2l1i2d fi2l1i2m fi2l1in fil2mad fil2mak fil2man fil2m1as fil2mat fil2m1á2 fil2mos fil2mu fi2lö fi2lü 2f1i2má fimeg1 2f1i2nas 2find fin1osz fi2n1ó fint2 fin1tr fi2n1u2 fi2nú 2finx fio2v fi3ók fió2k1a2l fió2kar fió2k1e2 fió2kép fió2kol fió2kö fió2r fiő2r fi1p2l fi1p2r fi2rod fis1arc fi1s2p fist2 fi1str fi2t1ad fit1a2la fit1alj fi2tág fit1árak fitá2t fi2t1áta fi2t1éh fi2t1érd fi2tik fi2t1in fi2tir fi2t1i2z fito1p2 fi2t1osz fi2tön fi2t1őr fi2t1ur fiu2min fiu2t fi2úa fi2úá fi2úe fi2úf fi2úg fi2úí fi2úl fi2úo fi2úö fi2úő fi2úp fi2úsz fi2úti fi2úu fi2úú fi2úü fi2x1ár fi2x1el fi2xö 1fí fí2rá fírcsa2 fí2r1in f1í2ró fír1tr fí2rü fjú1sz fki2s1 fk2li fk2lu fk2ró f2lak f2lan f2lep f2lip fli2s1é flo2n1á flo2né f2lot f2luk 1fo fo2am fo2g1á2c fo2gál fo2g1árk fo2g1áro fo2g1e fog3g fo2gí fo2g1or fo2g1os fo2gö fo2gur fo2gü fohá2szat fo2kal fok1áll fo2k1árr fo2k1e2 fok1ing fo2kí fok1k2 fo2kola fo2k1or folta2n fol2t1e fol2t1ö fo2n1ada fo2nado fo2nak fon1alap fona2l1e2 fon1alja fon1aljo fona2n fon1any fo2n1asz fo2n1au fo2n1á2r fonás1s fo2n1át fond2 fon1dr fo2neg fo2n1el1 fo2ner fo2n1es fo2nék fon1f2 fon1i2ko fo2n1i2m fo2nin fo2n1is fo2niz fo2ní fon1k fo2n1or fo2n1osz fo2nö fo2nő2 fons2 fon1st fon2t1i2n fontó2 fon2tón fo2nü fonya1 fo2r1ad forakész1 fo2r1ala fo2r1a2n for1ato fo2reg fo2r1el fo2r1er forgás1s fo2r1il fo2r1i2o for2m1e2l for2m1em for2merő for2mes for2m1érté for2mil for2m1in fo2r1ol fo2rö 2f1orrú fors2 for1sp for2t1ál for2t1e2l for2t1érd for2tü fo2rü foto1s fo2vi 1fó fó2rá fósza2 1fö fö2la fö2lá föl2dök fö2l1e2 fö3le. 2f1ö2lésbel fö2liv fö2lí föl1k2 fö2lo fö2ló fö2lön fölt2 föl1tr fö2lu fö2lú fön2n1 fönne2 fö2sá 1fő főa2n főá2g fő1bl fő1br fő1dra főe2l főe2r főe2s főé2h főé2te fő1fl fő1f2r fő1gl fő1gn fő1gr fői2d főigaz1 fői2ta főí2t fő1kl fő1kv fő2n1ag fő2n1apj fő1pl fő1pr fő2r1aj fő2rem főre2s fő2r1ék főri2 fő2r1is fő2rül főr1ülé fő1sl 2fősö fő1sta fő1str fősz2 fő1szl fő1szp fő1szt fő1t2r főü2l főzőé2 fp2la fp2ro fra1s frá2ma frá2má frá2m1e2 frá2nye f2rás f2resk fré2ná fré2nén 1f2ric f3rich f2rig f3rip 1f2ris fron2t1a2 fron2t1e2 f2röc f2rus fs2ho fs2po fs2tí fst2r ft1aj fta1kr ft1alj ft1bl f2t1ef fte2m f2t1eme f2t1ér. fti2g f2t1ige f2t1ing ft1ös ft1út f2t1üg ft1üt f2t1ü2z 1fu fuga1 fura2t1e fu2s1as fu2seg fu2sis fu2sz1á2 fu2sz1ol fu2szü futókész1 futó1s2p 1fú fúj2tal 2f1ú2ré 2f1úrr fú2zs 1fü 2f1ü2gy fü2la fü2lá füle2c fü2l1eml fü2l1e2p fü2l1e2v fü2l1é2j fü2l1é2k fü2lí fül3l fü2lo 2fülő fü2lőt fül3t2 fü2ma fü2má fü2m1e fü2mo fü2mő fü2mú 2f1ünn für2t1ő füstü2 füs2t1ülé 2f1ü2té 2f1ü2tő 2f1üzl 1fű fű1dr fű1fr fű1pr fű1sr fűsze2r1el fű1t2r fű2zá fű2zis fű2zo fű2z1ölt fvárosé2 1fy 2g. 1ga 2g1abc 2gabr 2g1abs ga1by 2g1a2dag g1adap 2g1a2data 2g1a2datb gadás1s 2g1adm ga2dog 2gadomá gadói2ko 2gadósat 2g1a2du. 2g1a2duk gae2r 2g1aff ga1fl ga2ga. 2g1agg ga1g2rá g1agy. ga2gyu g1a2gyú 2g1aján 2g1ajk 2g1ajt 2g1a2kad ga2kác 2g1akc g2a3ké 2gakév ga1kl 2gaknai g1aktu g1akv gala2g1ú ga2lat 2galáf 2galáí ga2láv 2g1alb 2g1alc gale2g1e2 2g1alk galo2m1e 3galop g1a2los 2g1a2lud ga2lul ga2lusz 2galvó ga2m1a2gá 2g1amc 2g1amp ga2nab 2g1a2nal 2gancs gan2csal gancs1ág gan2cse gan1d2 3g2ané gan2ga g1a2nim ga2nyag ga2ny1at ganye2l ga2nyér g1a2nyó ga2nyö gaó2r ga2pa. ga2paá ga2pac ga2pas ga2pán ga2pát ga1p2l ga2pok ga2pó. ga2pób ga2pók ga2pón ga2póv 2g1app ga1p2ré ga1pro gara2t1í 2g1a2rák 2g1a2rány ga2rén gar1k2 ga2rő ga2seg ga2s1is ga2s1ín ga1s2pi ga1spr gas3sze gas3szí gast2 ga1s2ta ga1sto ga1str gasz1agg ga2sz1an ga2szág ga2szás ga2sz1es gasz2tár ga2t1a2d gat1ará ga2tav ga2t1ál ga2t1á2ram ga2t1eg ga2tep gaté2s ga1thi ga2tim gat1old ga2tomi g1a2uk ga2ul ga2us ga2van ga2var ga2vat 2g1a2vu gaza2n gaz1any gaza2te ga2zál 3g2azd 3g2aze ga2zer 2gazg 2gazítá gazmus1s 2gazod 2gazon ga2zü 1gá g2ába 2g1á2bé g2ábó 2g1ábr 3g2áci gács1a2va gá2cse gá2cs1il gá2csü gáda2 gá2d1al gá2dá gá2d1él gá2d1ia gá2dis gá2dő gá2d1ü gá2fo 2g1ág. gá2gak gá2gat gá2gaz 2g1ágg 2g1á2gi 2g1á2gú 2g1á2gy gágy1asz 2g1á2hí g2ája g2ájá gá2j1e2 gá2jü gála1p 2g1álc 2g1áldo gá2l1es g2áli 3gális 2g1áll. 2g1állí 2g1állu 2g1álmo 3g2ály g2ám. gá2mal gá2m1e2 2g1á2mí gá2mü gána2 gá2nac gá2nal gá2nap gá2n1at gá2nás gán2cse gán2csi gán2cs1ö2 gán1d2 gá2n1e 2gángy. gá2nig gá2n1io gá2nis 2g1á2niz gá2nol gá2n1ó2 gán1sz2 gánt2 gán1tr gá2n1ú gá2nü gá2ny1a2n gá2nyar gá2ny1as gá2ny1e2 gá2nyérd gá2nyérz gá2nyij gányká2 gá2nyö gá2po gá2rad gá2r1ag gá2r1aj 2g1á2ram gá2r1a2n gá2rar gá2ras gá2ra2t gár1ato gár1att gá2r1av 2g1á2raz gá2rág gá2r1ál gá2r1á2z gá2re2 gár1em gár1es gár1et gár1éte gá2rif gá2r1i2p gá2r1isk gá2r1ism gá2r1iz gá2rí 2g1árnyé gá2r1ol gá2rop gár1ost gá2r1osz gáró2 gá2r1ór gá2rö gá2rő gár1s2 gár1tr 2gáru. 2g1árud gá2rug 2g1á2ruh 2g1á2rulá 2g1á2ruló 2g1árur 2gárus gár1uta gár1utu gá2rúr gá2rút gá2rü gá2rű g2ás. gá2s1a2d gá2sal 2gásatá gá2s1á2g gá2s1árad gá2s1árn 2g1á2sás gá2s1á2to gá2s1e2 gá2s1im gá2sis gá2sí gá2sor gá2só gás1ó2r gá2sö gá2ső gás3szé gás3szü gást2 gás1tr gá2sut gá2s1ü2 gá2sű gá2szal gá2szas gá2szatl gá2s3zav gá2sz1ál gá2sz1e2 gá2szis gá2szit gá2szí 2g1ászká gászkész1 gá2sz1okta gá2sz1ól gá2s3zón gá2szöv gá2szü g2át. 2gátad gá2taj 2gá2tal gát1a2la gát1alj gátá2 gá2tál gá2t1ár gá2tát 2g1átbo gá2t1eg gá2t1e2l gá2t1e2m gá2ten gá2tél gáté2r gá2t1ér. gá2t1ére 2gátfe 2g1átg 2g1átha gá2til gá2tis gá2tiz 2g1á2tí g1átmé gá2t1olda gátó2 gá2tór 2g1á2t1ö gá2tő 2g1áttű 2gá2tü2 g1átvi g2áva g1á2vó gá2z1a2d gáz1akn gáz1akt gá2z1a2l gá2zar gá2z1a2t gá2z1av gá2z1ár. gá2z1árá gáz1áre gá2z1árh gá2z1árk gá2z1árn gá2z1á2ro gá2z1árr gá2z1árt gá2záru 2g1á2zásos gá2z1e2 gázi2g gá2z1iga gá2zim gá2z1i2p gá2z1i2s gá2z1iz gá2zí gá2zö gá2ző gáz3sp gáz3sta gáz3ste gáz3sug gá2zsú gáz3sü gáz3sz gá2zü gbeá2 gbé2lá gbé2rem gb2la gb2le gb2lo gb2lú gb2ra gb2ri gb2ro gb2ru gcsapá2 gcsa2p1ág gda2u gd1ell gde1p2 g2d1é2k g2d1ér. gd1ina. gd1ináb gd1ináh gd1inár gd1inát gd1ináv g1d2rá gd2re gd2ro gd1t2r g2d3zö 1ge gea2c gea2g gea2l geá2r g2ebe g1e2cet 3g2eci g1eddz 2gedénn 2gedény ge2dze ge2dzé ge2dzi ge2dző 2g1eff 2gege 2g1e2gé 3gegom ge2gye ge2gyé ge2gyo 2g1e2gyü ge2hes ge2het 2g1e2hü 2g1ejt 2g1e2ke. 2g1e2kei 2g1e2kek 2g1e2kéé ge2kéj ge2kék 2g1e2kés. ge1k2li 2g1eks 3g2el. g1elad ge2lag 3g2elap ge2las ge2lál ge2l1ár 2g1elcs 3geld. 2g1eldo 2g1eldö ge2lef ge2legi g1elegy 3g2elek. 2ge2lemé ge2lemi 2ge2lemk 2g1e2lemm 2g1e2lemz gele2n 3gelend ge2l1eng ge2l1eny gel1este ge2lev ge2lég 3g2elésb 3g2elések 3g2elésen 3g2elésén 3g2elésér 3g2elésh 3g2elési. 3g2elésk 3g2elésrő 3g2eléss 3g2eléstő 3g2elésü 2g1elész 3gelész. 3gelésző 3gelészü 3gelészv 2g1elhel 3g2elhes 3g2elhet 3g2eli. 3g2elik gel1int 3g2elj. 3g2elje 3g2eljé 3g2eljü 2g1elkü 2gellenő 2g1elmé 2g1elnev 3g2elnén 3g2elni 2g1e2los ge2lö 3g2elő. ge2lőbbr 3g2előbe 3gelőbé 3gelőbi 3gelőbo 3g2előbő 3g2előc 3g2előe 3g2előé 3g2előg 3g2előh 3gelőja 3g2előjé 3g2előjo 3g2előjü 3g2előjű 3g2elők. 3g2előka 3g2előkb ge2lőkel 3g2előker 3g2előket 3g2előkez 3gelőké. 3g2előkén 2g1előkés 3g2előkh 3g2előki 3g2előkk 3gelőkl 3g2előkn 3g2előkö 3gelőkő 3g2előkr 3gelőkt 3gelőku 3gelőkü 2g1e2lől 2g1előm 3g2előn. 3gelőna 3g2előne 3g2előné 3g2előnk 3gelőnö 3gelőnyi 3g2előo 3gelőö 3g2előő 3g2előp g2előre. 3g2előrés 3gelőro 3g2előrő 3g2elős. 3gelősá 3gelőso 3gelősö 3g2elősza 3gelősze 3gelőszé 3gelőszi 3gelőszó ge2lőszö 3g2előt. 3g2előtá 2g1előté 3g2előtő 3gelőtü 3gelőü 3g2elővá 3g2előve 3g2elővé 3gelővis 3gelőviz 2g1e2lőz g1első 3g2elsz. 2g1elszá 2g1elszo 3g2elt. 3gelte. 3g2eltek 3g2eltem 3geltes 2g1eltett. 2g1eltettn 3geltéb 3g2elték 3geltél 2g1eltér 3geltét 2g1elto 2g1eltű ge2lül 3g2elün 2g1elv. 2g1elvb 2g1elven 2g1elvét 2g1elvh 2g1elvn 2g1elvo 2g1elvr 2g1elvű 2g1elvv ge2ly1e2g ge2lyid ge2man 2g1ember 2g1embl g1e2mel 2gemelé 2gemelk ge3mell 2gemelő 2g1e2més 2g1eml ge2moc 2g1emp gena2 ge2n1ad ge2nar ge2n1as ge2nau ge2n1ál ge2nár ge2nát g2end ge2n1eg 3generá ge2nere 2generg ge2n1esz ge2n1e2vet ge2n1e2vez gené2k ge2n1éké ge2n1ékn ge2n1ékt geni2d1 ge2n1in ge2n1is gen1k2 g1enni g1ennü gen3nya ge2nop ge2n1or ge2n1os gen2sért gens3s gent2 gen1tr ge2n1ur g2enye 2g1enyh g1enyv 2g1enz ge2ob ge2oc ge2of ge2ok ge2om ge2orgia ge2ot geó2r ge2ped ge2per ge2pés 2gepi ge2pos ge2rab ge2r1ad ge2r1aj ge2ral ge2r1a2n ge2r1a2p ge2r1as ge2rau ge2ráb ge2r1á2g ger1áll gerá2r ge2r1ára ge2rát g1erde 3g2ereb 2geredm ge2reg g1erege ger1egy 2g1e2rej ge2r1e2lők ge2r1eml ge2r1eny ge2r1er ge2resz ge2r1e2v ge2réj ge2r1ék ge2rél ger1éle ger1é2lé ge2r1ép ge2r1étt ge2r1i2na ge2r1ing ge2r1i2p ger2is ge2r1iz ge2rog ge2ror ger1osz ge2rot ge2ró ge2rök ge2r1ön ge2rő g1erő. g1erők g1erőv ger1őz geru2 ge2rur ge2r1ü2g ger1üld ge2r1ü2lé g2es. ge2s1á ge1sc gesd2 g2eseb 3g2esei ge2s1e2l ge2s1emb g2esen. ge2send 2g1e2s1er 2g1e2setb 2g1e2setet 2g1e2seté ge2setl 2g1e2setr 2g1e2sett 2g1esél 2g1e2sés g1e2sik 2geskü gesleg1 g1esni 2g1e2ső g2esr gess2 3g2essé. 3g2esség g2est. 2g1este 2g1esté 2g1esti 2g1estj g1esvé 2g1e2szek ge2szes ge2szet g1eszl 2g1eszm ge2t1ak ge2tal ge2t1a2ny get1ap ge2t1as get1e2gy 2g1e2tetőn ge2t1é2k geté2l get1éle ge2t1ér. ge2t1é2rü ge2t1é2ve. getó2 ge2t1ór getőkész1 get1őrt ge1t2ró get2t1ebbé ge2tut ge2t1ü2z ge2ur geu2s ge2vic 2gevo ge2vol 2g1e2vő ge1yé ge2zo gezőa2 2g1ezr 1gé gé2ber 2g1ébr géc3c gé2d1a2 gé2d1á2 gé2d1e2l gé2d1e2r gé2d1esz gé2dik gé2din gé2dir gé2dí gé2d1o gé2dö gé2d1ő2 gé2d1u2 gé2d1ú2 gédü2 gé2d1ülé gé2dű gé2d3z gé2gi gé2gő gé2gü 2g1é2he. 2g1é2hek 2g1é2hen 2g1é2hes 2g1é2het 2g1éhh 2g1éhs 2g1éj. gé2jért 2g1éjh 2g1éjj 2g1éjs gé2kei g1é2kel g1é2kes gékes1s g1é2kez 2g1éks gé2lál gé2lel 2géles 2g1é2let 2g1é2lez gé2lén 2g1élm gélvvá2 gé2lya gé2lyá gé2lyeg gé2lyo gé2lyú gé2m1a2 gé2m1á g2émb gé2m1eg gé2mel gé2mer gé2mér gé2m1o géna2 gé2nab gé2n1ad gé2nag gé2n1al gé2n1an gé2n1ar gé2n1at géná2 gé2n1ár gé2nát 3g2énd gé2neg 2génekes 2génekl gé2n1e2l gé2n1e2r gé2n1e2t gé2n1é2g gé2n1in gé2ní g2énn gé2nó gé2n1ö gént2 gé2nú génü2 g2ény gé2ny1e2g gé2nyid gé2nyis gé2nyír gé2nyo gé2nyö gé2nyú 3gép. gé2p1a2 gé2p1á2 gé2p1e2g 3gépel gé2p1ell gé2p1esé gé2p1esz gé2pik gé2pí 2g1épít gé2p1o2 gé2pó gé2pö gé2pő 3g2épp géptá2v gé2p1u gé2pú gé2pülé géra2 gé2rag gé2rak gé2ral gé2r1an gé2rap gé2rar gé2ras gé2rá 2g1érc. 2g1érd gé2r1el gér1eml 2géret 2géré. gé2rie 2g1é2rin gé2ris gérká2 2gérl 2gérm gé2ro gé2rö 2gérő. 2gérők 2gérte 2gérté 2gérth g1érti g1értj g1értl g1értő. g1értőe g1értők g1értőv g1érts g1értv gé2r1u2 gé2r1ú 2g1érv. 2gérvé 2g1érz 3gérzá gé2sar gé2seg gé2s1e2l gé2s1é2g gé2sim gé2s1o gé2só gés3sza gé2sza gés3zav gé2szá 3gészítőü gé2sz1o gé2szó 2g1é2tel gé2ter gé2tet 2g1étk 2g1é2to 2g1étr 2g1étt 2g1év. 2g1évb 2g1é2ve. 2g1é2ved 2gévei 2g1é2vek 2g1é2ven 2g1é2vet gé2véb 2g1é2vén 2g1é2vét 2g1é2vév 2g1évf 2g1é2vi 2g1évj 2g1évk 2g1évn 2g1évr 2g1évs 2g1évt 2g1évv gé2zan gé2zőr géz3s2 gfala2d gfa2l1ada gfa2le gfi2úké gf2la gf2lo gf2ló gf2lu gfö2l1üle g1f2ra gf2rá g1f2re gf2rí g1f2ro g1f2rö gf2ru g2g1a2p gg1arc gga2s g2g1aszá g2g1aszó gge2lest ggés3s gg1i2ta g2g1iz gg1orv ggó2n g2g1óni ggős2 g1g2raf g1g2ran g2gre gg2ro gg1sp g2g1ü2g g2gy g3gyak g3gyalá g3gyap g3gyara ggy1aro g3gyat g3gyár g3gyáv ggy1á2z ggy1e2lő g3gyeng g3gyep g3gyer g3gyérü g3gyil ggy1ol g3gyom g3gyor g3gyó g3gyö g3győ g3gyu g4gyút ggy1ült g3gyür g3gyű gha2d1e2 ghajói2ko g2ham. g2hamb g2hame g2hamh g2hamm g2hamn g2hamr g2hamt gha2sábr g2hia 1ghy 1gi gi2aa gi2aá gia1b2 gi2aba gi2abá gi2abi gi2abo gi2ac gi2a1d2 gi2ae gi2aé gia1f gi2afr gi2a1g2 gi2ah gi2aim gi2aí gi2aj gi2akar gi2akas gi2ala gi2alá gi2alé gi2am gi2anó gi2any gi2ao gi2aó gi2aö gi2aő gi2a1p2 gi2ar gia1sz2 gi2asza gi2aszá gi2aszem gi2aszé gi2aszf gi2aszi gi2aszo gi2aszó gi2at gia1t2r gi2au2 gi2aú gi2aü gi2aű gi2av gi2az 2gibr 2g1i2dea 2g1i2deá 2g1i2deg gi2dei 2gidej 2g1i2deo 2g1i2dé gi2dió 2g1i2do 2g1i2dő gi1fl gig1ad gig1ara gig1ass gig1au 2gigaz gig1ál 2g1i2ge. gig1e2c gig1eg gig1eh gig1eng gig1enn gige2r gig1ere gig1e2s gig1et gig1e2v gi2gé gig1éh gig1é2l gig1ém gig1é2ne gig1é2r 2g1igéz gig3g gi2g1i2 gi2gí gi2g1o2 gi2g1ó2 gi2g1ö gi2g1u gi2gú gi2g1ü gi2gű g1i2gy 2g1i2ha 2g1ihl 2gijes gi2ker gi2kes 3gile g1ill gi2ma. gi2man gi2máb 2gimád gi2már 2g1i2máz gi2me. 2g1imp gina1p2 gi2nas gi2n1á2z 2g1ind 3giné 2ginf 2g1inkv g1inná g1inni g1inno g1innu 2g1inp 2gins 2g1inta 3gintc 2g1inte 2g1inté g1inth g1inti g1intj g1intő. g1ints g1intu g1intv 2g1inv 2g1inz gi2one 2g1ioné gi2ono gi2ot gi2óa gi2óá gi2óc gi2óe gi2óf gi2óg gi2óká gi2ókom gi2ól gi2ó1p gi2órá gi2ó1sp gi2óta gi2ótá gi2óú gi2óü gi2óz 2g1i2pa 3g2ips gip2sza gip2szá gip2szo gi2ram 2g1i2rat 2g1i2rá gi2rig 2giro gi2rod 2g1i2rón 2g1irt g1isc 2g1i2si 2g1isk 2g1isl 2g1ism 2g1isp 2g1istál 2g1iste 2g1i2szá 2g1i2szo gi2szu gi2tas g2itá 2gitác 3g2iti 3gitte g1ittu 2g1i2vad 2g1i2vás g1i2vo 2g1i2vó 2g1i2zé. gi2zév 2g1i2zo 1gí gí2gé gí2ja gí2já gí2m1a2 gí2má gí2né gí2ny gí2ra gí2rá gí2re gí2ri gí2ro gí2ró g1í2tész gí2vá gí2ve gí2vé gí2vo gí2vó gí2vü gí2ze gí2zü gí2zű gka2ró2r gké2p1e2l gkia3dóná gkiá2 gkis1s gk2la gk2li gk2lí gk2lo gk2ló gk2lu gkö2zén gkö2z1ér gkővá2 gk2ra gk2rá gk2re gk2ré gk2ri gk2rí gk2ro gk2ró gk2va gk2vó gla1p2l gla1s2t gla3t glá2sza gle2g1a2 glege2l gle2g1elé gleí2 gle2t1a2 gle2tá gle2t1el gle2t1é2rőt gle2t1étn gle2tos gleü2 glé2nyel g2lor 1g2los glóó2 glós2 glőre2 glő2reg glő2rel glő2ro gme2g1a2 gme2g1e gme2g1é gmens1s gmen2sz gmus3s gna2d gn1ada g2n1a2j g2n1alk gna2pe g2n1a2r 1g2náb 1g2náh 1g2nái g2nán. g2náná g2nára gná2s3z g2nát. g2nátó 1g2náv gn1br gne2i g2n1e2l gne2m1e2l gne2sir gnes3s gne2szá gneto1 gné2l g2n1éle gnév1a gné2v1á gni2g g2n1iga g2n1ing g2n1i2p g2n1i2r g2n1is gnit1a2 gni2tel g2n1okt g2nol gn1olt 1g2nora 1g2nore 1g2noré gn1ök gn1ös gn1pr gn1s2k gn1st gn1t2r g2núj gn1üg gn1üz 1go go2áz go2be 2g1obj 2g1o2dú go2et g1o2ka. gok1a2d g1o2kai 2g1o2k1a2l 2g1o2ká goki2 gok1ir goklá2 2g1okm g1o2kok 2g1o2kos g1o2kot 2g1o2koz 2g1okta 2g1o2laj go2l1a2l 2g1olda 2g1oldá 2g1oldó gol2f1a gol2f1e gol2fin go2lim go2l1ó2rá 2goltalo 2g1oltár 2g1oltás 2g1oltó. 2g1oltv 2golvad 2golvas go2m1as 3g2omb gom2b1árn gom2b1árt gom2b1e2 3g2ome 2g1oml go2n1a2to go2n1áll gonc3c gon2d1á2 gon2d1ér. gondi2 gon2dik gon2doks gon2d1or gon2dó go2n1e2 gon2g1a gon2gál g2ono go2nol 2g1onto go2nü go2nye go2od go2pá 2g1o2pe gor1ass gorasz2 gora1t2 gor1áll 2g1orc go2r1el 2gorie 2g1orm go2roz go2rö 2gorz go2se go2sö 2gosto 2g1ostr g1osty go2sü go2s3za go2s3zá go2szó go2ua go2ub go2ud go2ur go2ut go2vác 2g1o2ve go2xi go1ya go1yá 1gó góa2d góá2g góá2r gó1bl gó2c3h gó2c1ol gócsapá2 gócsa2p1ág gó2cü 2g1ó2dán gó2div gó1dru gó1f2r góí2v gó1kl gó1kré gó2lar góle2l gól1elő gó2l1é2h gó2lí gó2lü 2g1ó2nu góó2r gó1p2l gó1p2r g1ó2rad g1ó2ras gó2ráka gó2rár 3g2óro 3g2ósa gó2s1aj gó1s2ká gó1s2p gó1s2rá gós3s gó1s2ta gó1stá gó1str gó1sz2 gó2s3zám gó2s3záras gó2s3zárá gós3zárú gó2tau gó2t1is gó1tré gó1tri 3g2óval 2góvod 2g1ó2vó gó2vu 3g2ózá 3g2ózi 3g2ózo 3g2ózu 1gö 2g1öbl 2g1ö2ko gö2ku 2g1ö2lá 2g1ölb g1ö2le 2g1ölr 3g2ömb göm2b1a gömbe2 göm2bel göm2b1er 2g1öml 2g1ö2na g1ö2ná gö2ne gö2nö 2gönt gö2ra 3g2örb 3g2örc gör2csa gör2csá gör2csel gör2cső 3gördí 3gördü 2g1ö2re 3g2örg 3g2örn gö2rök g1ö2rü 2görv gösé2 gö2s1én 2g1össz 2g1ösz 2g1ötl g1öv. g1övb g1ö2ve g1ö2vé g1övh g1övn g1ö2vö g1övr g1övt g1ö2vü g1ö2vű g1övv 1gő gőa2n gőá2g gő1br gőe2l gőe2r gőé2b gő1fr gő1gl gő2g1ő2 gői2ta gő1kl gő1kv gőnyá2 gő1pl gő1pr 2g1őr. g1őrb g1őrh g2őrit gő2riz 2g1őrj g1őrk 2g1őrl g1őrn gő2rök 2g1őrr g1őrs g1őrt 2g1ő2rü 2g1őrz 3gőrzősö gő2s1ep gő2sib gő1spi gő1sta gő2s1ü2v gő1tr gőu2t gőü2l gő2zát gő2zeg gő2z1e2k gő2z1e2l gő2z1o gőző2s gő2zsö gő2z3su gő2z3sű gő2zú gpe2c3h gp1e2lu gpia2c1i2o gp2la gp2lá gp2le gp2lu gpon2ga gpo2re gp2ra gp2rá gp2re gp2ré gp2ri gp2rí gp2ro gp2ró gp2rű gp2sz 1graff grafo1 gra2mad gra2maj gra2mal gra2m1a2r gra2m1as gram1a2z gra2m1á2 gra2m1e2 gra2m1érté gra2mik gra2m1in gra2m1is 1grammj gramu2 gra2mut 1g2ra1p 1g2raví grá2cs1i gráfa2 1g2rá2f1an 1g2ráfb grá2f1e2 1g2ráffe 1gráfid 1g2ráfl 1g2ráft grá2lát grá2l1e2 g2ráná grán1d g2ráni grá2rá grá2r1i2p grá2s3za gre2e gren2d1ő2 g2ril gril2l1a gri2s1á gris3s grisü2 gri2süt g2ríz gróa2 gróá2 gró2f1a gró2fú gró1p 1g2rup gság1g gsé2gel gs2ho gs2ka gs2ká gs2ko gsk2r gs2la gs2lá gs2li gs2má gs2mi gs2mu gs2ná gso2k1o gsors3s gs2pa gs2pá gs2pe gs2pé gs2pi gs2po gs2pó gsp2r gs2rá g1s2ta gs2tá gs2te gs2té g1s2ti g1s2tí gsto2 gst2r g1stra g1stru gs2tu g1s2tú gsugá2 gs2vé gsza2ké gsza2k1ü gszála2d gszá2l1ada gszá2li gszá2r1a2da g1sz2c gszé2t g1sz2f g1sz2k g1sz2l gsz2m g1sz2p gszt2 g1sz2tá gta2g1ar gtag1g gta2n1ó2 gtára2d gtá2r1ada gtermo1 gtermosz2 gté2rá gti2m gt2ra gt2rá gt2re gt2ré gt2ri gt2ro gt2ró gt2rö gt2ru gt2rü gtű2z1ő2r 1gu gu2at gu2ay 2g1u2bo gu2el gu2er2 g1u2ga 3g2ugg g1u2go 2g1ugr gu2id gu2in gu2ir 2g1ujj gula2te gula2t1í gu2ná 2g1u2ni gu2nó gu2nu 3g2urí gus1abl gu2sad gu2s1a2n gu2sas gu2sat gu2s1av gu2sál gu2s1e2 gu2s1érté gu2sil gu2sis gu2s1í gu2sol gu2sor gu2s1ó2 gu2sö gu2ső gus3s2 gussz2 gust2 gu2sü gu2szá gus3zs gu2tac gu2tak gu2tal gu2tam gu2tan gu2tas gu2tat gu2taz 2g1utc 2g1u2tó gutó2d1o2ku 2g1u2tu gu1ya 1gú gú2ja gú2jí gú2ju gú2ny1e gú2ny1í2 2g1úr. gú2ré gú2ri 2g1úrn gú2ro 2g1ú2sz 2gú2t1a2 2g1ú2t1á2 2g1útb 2g1útc 2g1útd 2g1ú2t1e2 2g1ú2té 2g1útf 2g1útg 2g1úth 2g1ú2ti. 2g1ú2tia 2g1ú2tig 2g1ú2tih 2gútij 2gútiko 2g1ú2tina 2gútiná 2gútir gú2tis 2g1ú2tit 2g1ú2tiv 2gútiz 2g1útj 2g1útk 2g1útl 2g1útm 2g1útn 2g1ú2to 2g1útp 2g1útr 2g1úts 2gútt 2g1útv 2g1útz gú2zi 1gü gü2cs gü2dé gü2dí gü2dü gü2ge gügy1ér. 2g1ü2gyi 2g1ügyl 2g1ügyv 2g1üld gü2len gü2lep gü2lik gü2löm 2g1ünn 3g2ürc 2g1ü2re 3g2üri 2g1ü2rí 2g1ü2rü gü2te gü2té gü2ti gü2tö gü2tő gü2tü gü2ve gü2vö gü2ze gü2zé 1gű 2g1űr. 2g1űrb gűre2 g1űrh gű2ri 2g1űrj 2g1űrl 2g1űrm 2g1űrn 2g1ű2rö 2g1űrt gű2ru gű2rü gű2ze gű2zé gű2zi gű2zö gű2ző gva2s1u2 gvá2gy1a2da gvá2nyan gvás1s gverés3s gvezé2rel gvé2nyel gvi2na gvó1s2 g2y 1gya gy1abl 2gy1a2cé 2gyadag gya2dal 2gyadatb gy1a2dót 2gyag. 2gyagb gya2ge gya2gép 2gyagg 2gyagh gya2gis 2gyagk 2gyagn gya2g1ol 2gyagt 2gyagya gy1a2gyu 2gy1aja 2gy1akc 2gyaknák 2gyakt. 2gyaktu gya2laj gyal1akt gya2lapo gya2lapp gy1alat 2gyaláí gya2lel gya2lik gyan1ab gya2n1e 2gy1a2nya gy1a2nyá gya2pak gy1a2páh 2gyapái 2gyapák 2gyapám 2gy1a2pán gy1a2pás 2gyapátó 2gyapjá gya2pón gya2pór 2gyapp gy1aps gy1aran 2gyaraw gyard2 2gyardom gya2rel gy1argó 3gyari gya2r1ón gya2r1ó2r gya2róv 2gyarú 2gyasak 2gyasat 2gyasra 2gyaty 2gyazá 1gyá 2gyábr 2gy1ág gy1álc gy1áll gy1álm 3gyám 2gy1áp 2gyáre 2gyárf 2gy1á2rok 2gyárus 2gy1árú gyá2szó 2gyáta 2gyátk gy1átl 2gyátv gy1bl gy1br gy1dr 1gye gye2d1ős 2gy1e2dz gy1e2ge gy1e2gé gy1e2gye 2gyeke. 2gy1e2kés 2gyeleg gye2legy 2gyelemű 2gyelnö 2gyeltér 2gy1elvá gy1elvű 2gyembl 2gy1e2mel gy1eml 2gyenget 2gy1e2ny 2gyenz gye2pal 2gy1erd gy1e2red 2gyerej gy1e2res gye2rén 2gy1ern 2gyero 2gy1e2rő 2gy1ers gye2seg 2gyesél 2gyesg gy1e2ső 2gy1este 2gyestés 2gy1esti 2gyestű gye2szü 2gyetem 2gyetet 2gyezm 2gyezrede 2gyezrel 2gyezs 1gyé 2gyébr 2gy1ég 2gyéhes 2gyéhs 2gyéji gy1é2ke. gy1é2kes 2gy1é2le 2gy1élt gy1élv 3gyém 2gyéneke 2gyéni 2gy1ép 2gyér. 2gy1érd 2gy1érem 2gyérez gyé2rét gy1érg 2gy1érh 2gy1é2ri 3gyérí gy1érke 2gy1érm 2gyérn 2gyérr 2gy1érte 2gy1érté gy1értő 2gy1érv 2gy1érz 2gy1été 2gyétk 2gyév. 2gyévad 2gyévb 2gyéve. 2gyévei 2gyévek 2gyéven 2gyéves 2gyévet 2gyévh 2gyévi 2gyévn 2gyévr 2gyévt 2gyévü 2gyévv gy1fl gy1f2r gy1gl gy1gr 1gyi 2gy1ide 2gyidé 2gyidő 2gyiga 2gyigá 2gy1ige 2gy1i2gé 2gyigm gy1iha 2gyiker 2gy1ill 2gyimá 2gyind 2gyinf 2gy1ing 2gy1ipa 2gy1i2rat 2gyirá 2gy1iro 2gyirt 2gyish gy1isk 2gyism 2gy1isn 2gy1ita 2gyivó 2gyizg 2gy1i2zo 1gyí 2gy1íg 2gy1í2r 2gy1ív gy1íz gy1kl gy1k2r gy1kv gymás1s 1gyo 2gyokos 2gy1old 2gyolvas gyo2m1as gyo2mi 2gyope 2gy1orc gy1orm 2gyorsó 2gy1orv gy1ou 1gyó 2gyódár 2gyódásak gy1ó2rá 2gyóri 1gyö 2gy1öb gy1ödé 2gy1ökl 2gyötöd. 2gyötödd 2gyötöde 2gyötödé 2gyötödne 2gyötödöt 2gyötödr 2gyötödü 2gyött 2gyötv 2gyöv 2gyözön 1győ gy1őre gy1őrü 2gy1ő2s 3győz gypárba2 gypen1 gy1pl gy1pr gy1ps gyrövid1 gy1sc gy1sk gy1sl gy1sm gy1sn gy1sp gy1sr gy1s2t gy2sur gy1t2r 1gyu 2gy1ud 2gy1ug 2gy1uj 2gyund 2gyuni 2gy1u2ra 2gyurá 2gyuru 1gyú 2gyúd 2gyúé 2gyúi 2gyújí 2gyújr 2gyújs 2gyúm 2gyúrb 2gyúré 2gyúri 2gyúrk 2gyúrr gy1úti 2gyúü 1gyü 2gy1üd 2gyüg 3gyüle 3gyüm 2gyünn 2gyüre 2gyürü 2gyüs gy1üst 2gyüt 2gyüv gy1üve 2gy1üz 1gyű 3gyűl 2gyűré. 2gy1ű2z gy1zr gza2táp gza2t1e gza2tö gza2t1ű2 gzá2r1ó2r gzá2se gzás3s gze2t1a2 gze2t1á2 gze2t1el gze2tin gze2t1o gze2t1ő2 gzőa2 2h. 1ha haa2d 3hab. ha2bak ha2b1a2l ha2b1a2n ha2b1ág ha2b1árb ha2bed ha2b1ér. ha2bid hab1ill ha2b1im ha2b1i2na. ha2b1int 3habo hab1old hab1o2ra hab1orr ha2b1ost hab1sz habu2r ha2bü ha2d1ag had1alk ha2d1ap hada2s ha2d1asz ha2d1á2c ha2d1ál hadás1s ha2d1ásv ha2d1á2szo ha2deg ha2d1el ha2dem ha2dél hadia2 hadié2 hadi2n ha2d1ina ha2dor ha2dos ha2d1u2r ha2d1úr. ha2d1ú2ré ha2d1úrh ha2d1ú2ri ha2d1úrk ha2d1úrn ha2d1úrr ha2d1úrt ha2dús ha2dü ha2dza ha2d3zá hae2r ha1fl ha1f2r 2hagore ha2if ha2j1á2s ha2j1á2to ha2jáz ha2j1in haj1k2 haj1oml ha2jö ha2jő haj1s haj1t2r ha2jü ha2k1ál ha1k2li ha1k2r h1akt ha1k2v ha2l1ach ha2l1a2g ha2l1aj ha2l1a2l hala2n hal1any ha2l1a2r hala2sz ha2l1asza ha2l1aszá ha2l1aszó ha2l1atk ha2l1a2tom ha2l1att 3halá hal1á2cs ha2l1á2g halá2l1e2 hal1á2rak hal1á2rá ha2l1árb ha2l1á2ro ha2l1árr hal1árve hal1áte ha2leb ha2lec hal1e2gy hale2l hal1ele hal1elő ha2lem ha2l1en hal1epe ha2l1ese ha2l1e2ső hal1ete hal1e2to hal1evo hal1e2vő ha2lez ha2l1é2l ha2l1ér. ha2l1éte ha2l1étk ha2l1étt ha2lid ha2l1ik ha2l1i2m ha2l1ing ha2l1inv ha2l1i2ono ha2l1i2ont ha2lip hali2s hal1isz ha2l1iv ha2l1i2z ha2lí hal2k1a2pu halke2l1 hal2k1ele hal2l1aszt hallás1s hal2l1á2t hal2léj hal3ly 3halm halma2z1ó2 ha2l1ol ha2l1ó2ri ha2l1ö ha2l1ő2 hal1p2 ha2l1ug ha2l1u2s ha2l1u2t ha2lü ha2lű ha2l3ya ha2m1ál ha2m1árb hamb2 hame2l ham1ele ham1esz ha2mez ham1ism hamkész1 ha2m1osz 3hamu ha2mü hanás1s han2ch 2hanész 3hang han2gal hange2 han2gen han2g1es han2gél hang3g han2g1ó2 han2gö han2gut han2t1ó2 ha2nyél haó2r ha1p2r hara2g1ó2 harang1g ha2r1ál har2c1al har2can harc3c har2c1e2 har2c3h ha2rel ha2ret 3harmó ha2r1ol ha2r1osz ha2r1ór ha2rű 3hasa haság1g ha2s1iz ha2s1ol has1ors ha1s2pe ha1s2po ha3s2út ha2sür ha2s1ű2 ha1szp ha2t1ab hat1agy ha2t1aj 3hatá határa2d határ1ada ha2t1e2v ha2t1én ha2t1é2v ha2t1í2v hat1olda ha2t1osz ha2t1órá ha2t1ö2v ha1t2rá hatt2 hat1tr ha2tül ha2ue hau2n hau2s ha2ut haü2z 1há 3hábo há2gy há2jús háma2 há2m1al há2m1á há2m1e2 hámi2 há2m1is há2m1ol há2mö hán2cs1e hán2csi há2ny1a2l hánya2n há2ny1ar hányás1s há2ny1e2 há2nyö hára2 há2r1ad há2r1al há2r1au hári2 há2r1iv 3hárí hár1k2 hármas1s háro2m1a háro2mo hár2s1al hár2se 3hárt há2rü há1ry há2sí hász1a2tom há2sz1e há2sziv 2h1ászka. há2sző hát1a2dó há2t1a2la há2t1a2n há2tar há2táp há2t1e2 háté2 há2tél há2t1ér. há2t1ére há2t1érn há2t1i2s há2tí há2t1ol há2t1o2r hátó2 há2t1ós há2tö há2tő hát1u2sz há2t1ü há2tű hátvé2d1el há2z1a2dó há2zaj há2z1ala há2z1asz há2z1av há2z1á2p há2z1árn há2z1á2ru há2z1e2 há2z1isk há2z1ism há2z1ist há2z1í ház1okt ház1old há2zos ház1otth há2zö há2ző házs2 há2z3sa ház3se há2z3sé há2z3si ház3sp ház3st ház3sü ház3sz há2z1ü há1zy hb2le 1he he2ad he2av hec2c1emb hecc3s 2hecu he2dén he2e2s he2f1i he2f1u2 he2g1a2 hegész1 he2gy1a he2gyá he2gyeg hegyes1s he2gy1o he2gyó he2győ he2gyú 2heidp 2h1e2kék 3hekt he2lég helés1s 2helf hel2fr 2hellá 2hellen he2lyeg he2lyeml he2lyesz he2ly1é2j 2hema 2h1embl 2h1eml henés1s 3heng he2ny1e2ge. he2nyo he2ol he2rab he2r1a2d he2r1aj he2r1a2r he2rau her1áll her1át1a2 her1áté her1eng here1p her1ese herevíz1 her1int he2rö her1s2 he2rut he2rű he2s1a he2s1á h1e2sés hes2t1o 3hety 2heusz 2hevé he2vés 3heví he2z1á 2hezh 2hezi 2hezn 2hező 2hezz 1hé hé2hé 3héi. 3héit héje2 hé2j1eg hé2j1el hé2jö 3hékn hé2nal hé2nan hé2nar hé2nát héne2 hé2n1el hé2nem hé2n1et hén1év. hé2nid hé2nil hé2n1is hén3n hé2nö hént2 hé2nu hé2nü hé1ph hé2pü héra2 hé2rar hé2r1as hé2rat hé2rin 2h1érz hé2szá hé2szeg hé2szesz hé2sz1ö héta2 hé2t1ab hé2t1aj hé2tal hé2tar hé2tál hé2t1e2l hé2t1e2m hé2t1es hé2t1ezres hé2t1é2v hé2tí hé2tol hé2tor hé2t1os hétó2 hé2t1ór hé2t1ö hé2tu hé2t1ü2 hé2v1á hé2ve. hé2vég hé2v1érz héze2 hé2z1ek hé2zio hé2zip hézo2 hé2z3s hf2ló 1hi 2hia. hi2aa hi2aá hi2abelie hi2ac hi2ad hi2ae hi2aé hi2ag hi2ah hi2aj hi2al hi2am hi2ant hi2ap hi2ar hi2at 3hida hidro1s 2hiév higa2nye 3higi 2hila 2him. 2hime 2himé 2h1i2nán 3hinás 2hing h1ing. 2hink h1insp hi2om hi2pa 2h1ips 2hise hi2se. 2hisn 2hiso hi2ta hit1ak hita2l hit1a2n hi2t1á2 hi2t1e2gy 3hitel hite2l1e2l hi2t1elesé hi2t1elő hi2t1elve. hi2t1eng hi2t1er hi2t1esz 3hitet hi2tél hi2t1ér. hi2t1érte hi2t1érv hi2t1é2te hi2t1é2ve. hi2t1im hi2t1int hitkész1 hi2t1o hitó2 hi2t1ón hi2t1ór hitö2 hi2t1ör hi2t1őr hi2t1u2 hi2tú hi2tül hi2zo 1hí hí2da hí2dá hí2de hí2dí hí2dö hí2dő hí2dú hí2dü hí2dz hí2g1e hí2jé hí2m1a2 hí2má hí2m1el hí2m1emb hí2mer hí2mo hí2mö hí2mu hí2r1a2 hí2r1á2 hí2r1ing hí2rí hí2r1o hí2r1ó2 hí2rő hír1s hí2r1u hí2rú hkas3s hká2r hk2ri hle2g1e2lé hle2t1el hle2tö 1ho ho2dú 2ho2eá ho2ef ho2ii ho2it 2hokl hola2 ho2l1ad ho2l1al ho2lam ho2l1at ho2l1au ho2l1ál ho2l1á2r hol2dá hol2dem hol2d1ó2r ho2l1e2 ho2lig ho2l1in ho2lip ho2l1i2v hol1k2 hol2mes hol2nik ho2lor ho2l1osz ho2lot ho2l1ó2r ho2lö holta2n holt1any holte2 hol2t1el ho2lü ho2ly1al 3homb 3homo homo1s ho2n1a2g ho2n1a2l ho2n1a2n ho2n1a2p ho2n1au ho2n1a2v ho2n1ál ho2n1át1a2 ho2n1á2to hone2 ho2neg ho2n1el ho2n1ik ho2n1i2m ho2ní ho2n1orj ho2n1o2ro ho2n1orr ho2n1ó2 ho2nö ho2nő ho2nü hor2d1e2 ho2re 2ho1ry hossz1e2 hosszé2 hossz1ék hossz1ü2 2hosz ho1th ho2us ho2we ho2zál ho2z1e hozi2 ho2zü 1hó hóa2k hóá2g hó1bl hó2cal hó2cat hóc3c hó2cel hó2c1é2g hó2c3h hó2cim hó2có hó2c1ö hó2csü hó2cz hó2d1a2ra. hó2d1a2rá hó2d1á2 hó2dem hó2d1é hó2d1ó2 hó2dö hó2dü hó2d3z hó2l1ej hó2l1e2ped hó2l1e2vet hó2nal hón1apa 2hórá hó2rár hó1sh hóví2 hóza2t1e 1hö hökö1 höl2gya höl2gy1á höl2gyel 1hő hőa2n hő1br hőe2l hőe2m hőe2r hőé2n hő1fl hő1gl hő1gr hő1kv hő1pr hősa2 hő2s1al hő2sas hő2s1av hő2s1el hő2sep hő2ses hő2sim hő2sis hő1s2pi hős3s hő1s2tab hős1tr hő2sut hő2s1ú hő2s1ült hő2s1ü2v hősű2 hő2s1űr hő1tr hőü2l hp2la hp2ra hp2ré hp2ri hp2ro hp2ró hru1s2 hs2ch hsé2gel hs2ka hs2pi hs2po hs1s2t hsza2ké hszá2j1a2da hsz2l ht1cl ht1kl h2t1ol ht2rá h1tref h2t1u2t 1hu hu1hy 2hurá hur2t1e hur2tit 2hus. 2husi huszon1 1hú hú2gy1a2 hú2gye hú2gyi hú2gyú hú2r1a2 hú2r1á hú2re húrt2 húr1tr hú2s1ak hú2sal hú2san hú2sap hú2sar hú2s1á2g hú2s1ál hú2s1e2 hú2sim hú2sí hú2sor hú2sö hú2ső hús3szak hús3szá hús3szé hú2sü hú2s3zab hú2sz1ál hú2sz1e2 hú2sz1í2 hú2szol hú2szos hú2sz1ó2 hú2sz1ü2 1hü hü2gy 2h1ünn hü2re hü2rü hü2tő h1ü2vö 1hű hű2ré hű2ri hű2rö hy1ér hy1év hy1ig 2i. i1a iaa2d iaát1 iaáta2 i2abaj i2aber i2abes i2abí i2abon i2abor i2abö i2abő i2abu i2abú i2abü i2abű ia2c1al iac3c i2acet iac1élé ia2c1ér. ia2c3h ia2cid iac1i2ko ia2c1im ia2c1int i2ací ia2c1or ia2có ia2cö ia2cő ia2c3sé iac3sp iac3st iac3sz ia2cü ia2cz iadás1s i2ade i2adí ia2dot ia2dóe iadó1st i2adö i2adő i2adú iae2l iae2r iae2t iaé2r i2afá i2afe i2afi i2a1fl i2afó i2afö i2afő i2afri ia1fro i2afu i2afú i2afü i2afű i2agá i2age i2agé i2agi i2agö i2agő i2agu ia2gyu i2aig i2aip i2ai2z ia2ján i2aje i2ajo ia2kad i2aká i2ake i2akí i2a1k2l i2akód i2akór i2akö i2akő ia1k2re ia1k2ré ia1k2ri ia1krí i2aku i2akú i2akü i2a1kv ia3lan ia2lat i2aleg i2alib i2alí ia2lom i2alö ia2lud ia2lus i2aly i2amá i2ame i2amó ia2m1ur i2amú i2amű ia2nek i2ané i2anö i2anő iao2k iaó2r ia2pát i2ape i2apé ia1p2l i2apo ia1p2s iarádi2 i2are ia2rén i2aro i2aró i2arö i2aru i2arú i2ase i2a1sh i2asi ia1s2ká i2a1s2l i2a1s2m i2asó i2asö i2a1s2p iast2 ia1s2ta ia1s2tá ia1sti ia1sto ia1str i2asú i2asü i2asű ia2sz1an i3aszerű ia2szes ia2szép iasz2k1e2r ia2szop i2aszú i2ate i2ató i2atö i2atő ia1tré ia2ty i2aud i2au2r iau2s iaü2z ia2vat i2avé i2avi i2aví i2avo i2azá i2aze ia2zo i2azs i2azú i1á iá2cs iá2ga iá2gá iá2ge iá2gi iá2go iá2gy iá2hí iáka2 iá2kab iá2kak iá2k1al iá2k1an iá2k1ap iá2k1ar iá2k1as iá2k1á2 iá2keb iá2k1el iá2kem iá2k1en iá2k1e2s iá2k1ér. iá2k1érd iá2kés iáki2 iá2kin iá2kir iá2kit iá2kí iá2kop iá2k1or iá2k1osz iá2k1ó2 iá2k1ö iá2kő iá2kur iá2k1ut iá2k1ú2 iá2k1ü iá2kű iála2 iál1ana iá2lál iá2l1ár iá2l1e2 iá2lim iá2l1in iá2lop iá2nar iá2n1as iá2nem iá2nir iá2nis iá2nö iánt2 ián1tr iá2nü iá2ny1ad iá2ny1a2l iá2nyan iá2nyar iá2ny1e2 iá2nyérz iá2nyö iá2ói iá2po iá2rad iá2rak iá2ram iár2das iár2d1e iár2d3z iá2re iá2rim iár1s2 iá2ru iá3run iá2rú iá2sal iá2sar iá2s1as iá2s1á2g iá2s1ám iá2sás iá2s1e2 iá2sikr iá2sí iá2sor iá2só iá2sö iá2ső iás3szo iást2 iás1tr iá2s1ü2 iá2sű iásví2 iá2szás iá2s3ze iás3zs iá2ta iá2t1e2l iáti2 iá2t1ir iba1d2 ibas2 ibat2 ibau2 ibaü2 ibá2l1a ibe2lér ibe2r1in ibe1s ibi2o ib2lo ib2ró ib2ru ica1f2 ica1g2 ica1kl ica1k2r ica2los ica1pr ica1t2 icca2l ic2can ic2c1á2 ic2c3h ic2cin ic2cir ic2cí ic2c1o ic2c1ö iccse2l iccs1ol iccs1ő2 ic2cú ic2cz ic3ha. ic3hek i2chiná ic3hoz i2c3hű ici2t1a2 ici2tár ici2tel ici2ter i1c2lu i2c1ol i2cs1a2d ics1a2la icsa2p1á2g i2cs1au ics1ág ics1áll i2cs1eb i2cs1e2g icse2t i2cs1ete i2cs1ev ics1é2g i2cs1é2ré. ics1ipa ics1s ics1út i2cs1ül i2cs1ü2t ic3sze ic1üz i2d1a2j id1ana id1a2ny i2d1au id1áll id1áru i2d1ásv id1br 1iddo id3dz ide2av ide2g1á ide2g1él ideg1ér. 1i2dej ide1k2v 2idel id1elj id1elm id1elo id1elt i2d1emb ide1p2 ide2red i2dero ide3sa ideu2 i2d1é2g idé2kel i2dény idér2c3s 2idész 1i2déz id2ge idi2as 1i2dil id1ionj id1ionn i2d1i2ono i2d1i2ont idi2os idi2ód i2d1ita idíja2d idí2j1ada id1kr id1old i2d1olv ido2mac ido2m1an 1i2domá 1i2domo 1idomú id1ös 1i2dő. 1i2dőb 1i2dőd 1i2dőé 1i2dőh 1i2dői 1i2dők 1i2dőm i2dőne i2dőné i2dőnk 1i2dőp 1i2dőr 1i2dős idő2sod idő1s2p 1i2dőt idő2tál 1i2dőv i2dőz id1pr id2rót i1d2ru id1st id1t2r id1u2t id1üg i2d1üz i2d3zá i2d3ze i2d3zó i2dzs1a i2dzs1á i2dzsen i2dzsél i2dzs1í2 i1e ie2be ie2cs ie2dz ie2f1a2 ie2fá ie2f1i ie2f1ü2 ie2gé ie2gy ie2he i2eld ie2lo ie2lőa ie2ma ien2sá ien2s1o iens3s ie2ny ie2pe ie2r1a2d ie2rag ie2r1aj ie2r1a2k ie2ral ie2ram ie2r1an ie2ras ie2r1á ier1d2 ie2reg ier1egy ie2r1el ie2r1ember ie2r1est ie2r1iga ie2r1in ie2r1iste ie2rí ie2r1ol ie2ror ie2rö ie2rő iersz2 iert2 ier1tr ie2r1u2 ie2r1ú ie2r1ü2g ie2sel ie2sem ie2sett ie2sés ie2sik ie2ső ie2sz ieté1sz2 ietz1 ie2ur ie2ve ie2vé ie2vi ie2vő i1é i2édo i2éfe ié2ge ié2gé ié2gő ié2gü i2éha ié2hes i2éhi i2éil ié2le ié2lé ié2li ié2lő i2éme i2émé i2émo ié2neke ié2nekh ié2nekk ié2nekü ié2pí ié2pü ié2rek i2éren ié2rez ié2ré ié2ri ié2rő. ié2rők ié2rőt ié2rü i2észi iéta1s ié2tel i2étö ié2ve. ié2vek ifa1st ifa1t2 i2fe. ifenyőé2h ifio2 if1ír 1ifjí 1ifju 1ifjú. 1ifjúb 1ifjúé 1ifjúi 1ifjúké 1ifjún 1ifjúr 1ifjús 1ifjút 1ifjúv i1f2la if2le if2lo if2lö if2lu ifogo2 ifon1n i1f2ri i1f2ro i1f2rö if2ru if2t1a if2t1á2 if2t1e2l if2tin if2tö if2tú ig1a2git ig1a2ka ig1als ig1alv ig1and iga2nyal iganye2 iga2ny1es iga2ras 1i2garz iga1sl iga2szag igasz1al igau2r 1i2gaz. 1igazí ig1á2cs ig1álm ig1ásh i3gász ig1á2t1e2 ig1br ig1d2r ig1edz i2geg igek2 ige1kl ig1e2le ig1ell ig1elm 1i2genl ige2rá ig1erő ig1e2se ig1esi ige2tál ige2teg ige2tél ige2t1o ige2tőr ig1evi i2g1ex 1i2géd ig1é2g ig1é2li ig1é2lő ig1é2lü ig1élv i2gém igé2na igé2ná 1i2gény i3gépe ig1épí ig1ér. ig1érj ig1érl ig1érn ig1é2rü ig1érv ig1ész 1i2géü ig1fl ig1g2r ig1ív ig1íz ig1kl ig1kr ig2lac ig2nad ig2n1e2g igne2r ig2n1osz ig2nö ig2nü igo2rál ig1o2s igóé2 ig1öb ig1ö2k ig1öl ig1ö2z ig1pr i1g2raf ig1sk ig1sl ig1sm ig1sp ig1st ig1sz ig1tr ig1ug igu2n igu2t ig1ús ig1üc ig1üd ig1ü2g igü2l ig1üt ig1üv ig1űz i2gya. i2gyam i2gyák i2gyál i2gy1eg i2gy1e2kéh i2gy1ékt igy1ér. i2gy1ért iha2re i1i ii2de ii2dé ii2dő ii2ga ii2gá ii2gé ii2gy ii2ha ii2je ii2má ii2mi ii2pa ii2ram ii2rat ii2rá ii2ro ii2sz ii2ta ii2vá ii2vo ii2vó ii2zé ii2zo i1í ií2gé ií2ra ií2rá ií2ro ií2ró ií2ru ií2té ií2ve ií2ze 1i2jed ije2gy1á2 1i2jes ikabe2j1 ikabejá2 i2k1abl ik1ajt ika2lak ik1ang ikaó2 ika1p2l ika1p2r ika2ró2r ikas2 ika1sp ika1t2r i2k1árk i2k1áru ikás1s iká2tol ik1dr ik1ebé i2k1eg ik1elo ik1eng ike2r1a2 ike2r1á2 ike2r1e2dz ike2r1e2l ike2r1ev ike2ris ike2r1o ik1e2rő iker1s ike2ru ike2t1ült ik1evo iké2kekk i2k1épí i2k1épü i2k1érz ik1fl ik1fr i2k1id ik1i2ko ik1ikr ik1ind ik1ins i2k1int i2k1i2o ik1isk ikka2l ik2k1ala ikk1any ik2k1a2r ikk1ára ik2káz ik2kev ikk1érde ik2kin ik2k1i2p ik2k1ol ik2k1ó ik2k1ös ik2köt ik2k1ö2z ik2k1u2 ik2küz ikla1tr ik2ler ik2lor i1klub ik2lum i1knéd ikoma2 iko2m1ar 1ikonbá 1ikonén 1i2konl 1i2konta 1ikontö 1i2kontü 1ikonzs ikó1p ik1ó2rá ikó2s3zá ikő2res ik1pl ik1pr 1ikrei 1ikrek ik2rém i1k2róm i1k2ru ik1st ikszind2 iksz2t iktus1s iktu2sz 2iku. 2ikub ik1udv 2ikuf 2ikuh 2ikui 2ikuí 2ikuj 2ikuk 2ikur iku2sav 2ikut 2ikuv ik1ü2v il1abr il1a2ce il1a2cé il1a2dó il1a2la il1ald i2l1alk il1amb ila2n i2l1ana i2l1any ila2pin ila2pol i2l1a2r ilá2g1e2 ilág3g ilá2gö il1á2gyo ilányfé2 i2l1á2p i2l1árn il1á2ro il1áru il1á2rú ilá2sz i2l1ászo il1átf il1átm il1átr il1bl il2c1a2 ilc3c il2ch il2c3sap il2c3sik ilc3sz il2cz il1e2lem i2l1emb i2l1eml il1exp ilé2n1á i2l1é2nekh i2l1é2nekn ilé1sp il1f2l il1fr il1g2r i2l1icc il1ide i2l1igáh i2l1igáj i2l1igás i2l1igát ili1gra i2l1i2kon. i2l1i2konb i2likoné i2l1i2konh i2l1i2konj i2l1i2konn i2l1i2kono i2l1i2konr i2l1i2kont i2likonz il1ill ili2ma. il1i2mi il1imp ilin1n ili2p1á il1iró il1k2l il1k2r illa2g1ó2 1illatb 1illatr 1illatt il2l1este il2l1esté 1illésé illé2t ill1éte ill1étt il2l1id illig2 illi1gr il2l1ö 1illu 1illú ilm1ada il2m1agy il2m1aj ilm1aka il2m1a2l ilm1ank ilm1any il2m1ap il2m1arc ilm1atl il2m1a2z il2m1ál ilme2g il2m1egé il2m1egy il2m1e2l il2m1ep il2m1e2r il2m1esz il2m1é2j il2m1ék ilmé2l il2m1éle il2m1ér. il2m1érd ilm1é2rést il2mérte il2m1érté il2m1és il2mid il2m1i2k il2mim il2mir il2m1is il2miz il2m1í2 il2m1ok il2mol il2m1or ilm1osz il2m1ó2r il2mö il2mő ilmu2 il2m1ut ilo1g2 i2l1or ilót2 iló1tr il1öb il1ös il1p2l il1p2r il1sh il1sp il1s2t 2ilte ilumi2 ilumin1 ilus3s i2l1üg il1ür il1üv i2l1üz ilva1k2 ima1gl im1akk imaó2 ima1p 2imar. i2marit 1i2mád i2mákt im1dr imeg1g im1elem ime2m i2m1eme ime2ra ime2rin i2m1érd im1inh im1inté imi2t1a2 imi2t1á2r imi2tin 1immu i2m1old i2m1om im1ó2rá imót2 im1ös 1impé 1impu 1imrei i2m1ür iműt2r i2n1abl i2n1a2cé i2n1adá in1ade i2nado in1a2já in1ajt inaka2r 1i2nakat. i2n1akc i2nakk i2nakn i2nakt i2n1akv in1ald i2n1alk in1all 1i2nam. i2n1a2mit. in1ana ina1pla ina2rán 1i2nas. ina2sis 1i2nasn ina2tell i2n1ág iná2lad in1á2rak in1árh i2náru i2n1ásv in1bl in1br in2c1a2g in2cal inca2n inc1elt in2c1él in2chi in2c3ho in2c1is in2c1os in2có in2c1ö in2cő incs1an in2cs1e2r in2cs1é2j in2cs1ér. inc3sérv in2csor inc3sor. in2csú inc3süt inc3sza in2cú in2d1ab 1indai in2d1az in2deb in2d1ed in2d1e2g ind1ekö in2d1e2m in2d1ett 1index in2d1e2z in2d1ég in2d1én in2dés ind1ink 1indiv 1indít indö2 in2d1ör in2dös in1dra 1indul 2ine. i2n1e2dé i2n1ef ineg1g in1e2gy ine2ku i2n1e2l in1emu i2n1eny 2iner i2n1erd i2n1erj ine2t1a ine2t1ér ine2tül i2n1ex 2inéb in1é2ge iné1kré iné2l i2n1éle i2n1élt i2n1élv in1épí i2n1ér. i2nérd i2n1éré in1érte iné2tá iné2te 2inév 1infek 1infl in2gadó in2g1ala ing1áll ing1árá ing1áré ing1á2ro ing1árt ing1áru ingás3s 1ingec in2g1eg 1ingei ing1eljá ing1elk in2g1ell ing1els in2g1enc 1ingerb 1ingerc 1ingeré inge2r1és 1ingerg 1ingerh 1ingeri 1ingerk 1ingerm 1ingern 1ingerp 1ingerr 1ingers 1ingert 1ingerü in2g1e2v in2g1é2j in2g1ék in2g1él ingés3s ing3g ing1i2na in2gí in1glo in2gor in2g1öl in2g1ös ing2rád. ing2rádb ing2rádd ing2rádn ing2rádo ing2rádt 1inguj in2g1u2t in2gú ing1ült 2inie 2inié i2nigar i2n1ige in1ikra ini1kro i2n1ill i2n1i2ma. in1i2mi in1ind 2ining i2n1inh i2n1i2o 2inir ini2s1ég i2n1isk i2n1ism i2n1ital 2iniu i2n1íz 1injekc ink1acé in2k1a2d in2k1ato in2k1árn in2k1esz ink1érté in2kio ink1old ink1orsó in2kös 1inkub 1inna. in2nor i2n1ob i2n1okl i2n1old i2n1olt i2n1olv in1org i2n1ox in1óda in1ó2dá inó2rá i2n1öl in1ön in1őz in1pl in1pr in1s2k in1s2m 1inspi in1spr 1insta in1s2to in2t1aktu int1ann int1árai int1árak int1árat in2t1á2rá in2t1árf in2t1ári int1áron in2t1árr int1ársz in2t1áru int1á2ta 1intege 1integr in2t1e2gy int1előt int1elté in2t1enn in2t1e2ny 1intenz in2t1e2rez 1interfé int1essz inte2t1ős in2t1é2j in2t1ész 1intézé 1intézk 1intézm 1intéző 2intézőc in1t2hos in1thu in2tid in2tigé int1illa in2t1ing in2t1ip in2t1ivá in2t1i2z int1oml in2t1osz in2t1ös intőkész1 int1őr. int1ura intus1s in2t1ut in2tús in2t1út i2n1ug i2n1uj in1új in1ú2s i2n1ú2t i2n1ü2g in1ült in1ünn in1ür in1üs i2n1ü2t i2n1ü2v i2n1ü2z in1űr 1inven in2xa 1inzu i1o ioá2r io1b2r io2cs io1d2r io2dú i2ogá iog2raf io1g2ráf. io1g2ráff i2ogy io2ik io2ká io2kí io2ko io2ku i3old io2l1i2v iol1k2 iol1okk i2oló i3olv io2mar io2m1árt io2mil io2mö io2nad io2n1a2g io2nak io2n1a2n io2n1a2r io2n1as io2n1a2t io2n1av io2n1át io2neg io2n1el io2nen ionim1 io2nin ion1k2 io2nop io2n1oszt io2nö ions2 ion1st ion1t2r io2pe io1p2r io2r1a io2r1i2ko io2so io1sz2f i2ote io2xidj io2xidt i1ó ióa2d ió2ap ióá2g ióá2r ióát1a2 i2óbá i2óbes i2óbé i2óbí i2ó1bl i2óbo i2óbö i2óbő i2ó1b2r i2óbu i2óbú i2óbü i2óbű i2óce i2ócé i2óci i3ócsk i2ócu i2óde i2ódé i2ódi i2ódí i2ódó i2ódö ió1drá i2ódú i2ódü i2ódz i2óég i2óék i2óél i2óép i2óés i2óév. i2ófá i2ófe i2ófi i2ó1fl i2ófó i2ófö i2ófő i2ó1f2r i2ófu i2ófü i2ófű ió1g2r i2óha i2óhá i2óhe i2óhé i2óhi i2óhí i2óhó i2óhö i2óhő i2óhu i2óhü i2óhű iói2g i2óip i2óis i2óiz ióí2v i2óje i2ójo i2ójó ió2kad ió2kaj iók1arc ió2k1aszt ió2kál ió2k1e2g ió2k1i2d i2ókí iókköz1 iók1old i2ókort i2ókö i2ókő ió2küz i2óla i2ólá i2óle i2ólé i2óli i2ólo i2óme i2ómó i2ómu i2ómú i2ómű i2óne i2ónó i2ónö ióo2k ióó2r ió1p2s ió2rab i2órag i2órak i2óran i2órap ió2ras i2órád i2óre i2óré i2ória i2óro i2órö i2óru ió2s1aj ió2sel ió2si. ió1slá ió2só iós3s ió1s2tá ió1str i2ósú ió1sz2 i2óte i2óté i2óti i2ótí i2ótö i2ótő i2ó1t2r i2ótu i2ótú i2ótü i2ótű i2óug i2óun i2óur i2óut i2óvár i2óvás i2óve i2óvé i2óvi i2óví i2óvö i2ózár i2óze i2ózs i1ö iö2kö iö2le iö2lé iö2li iö2lö iö2lő iö2mö iö2re iö2rö iö2rü iö2tö iö2ve iö2zö i1ő iő1dr i2őha i2őké i2őku i2őra iő2ri2 i2ő1s2p i2ő1st i2őte i2őté i2őva i2ővá ipa2cse 1i2par. 1ipara. ipa2ral ipa2rál 1i2parán 1i2parát 1iparb ipa2r1en ipa2r1es 1i2paré 1i2parh 1iparil 1i2parin ipa2ris 1i2parm 1i2parn i2parok i2paron 1iparr 1i2pars i2parta 1i2partá 1i2parte 1i2partó 1i2paru ipau2 ipánk2 ipán1n ip1átm i2p1ef ip1e2gy ip1e2lu i2p1esé i2p1ev ip1fl ip2fu ip1kl ip1kr ipo1kl ipor2tel ipor2t1ő ip1ö2l ip1ös ip2p1a2d ip2paj ip2par ip2pár ipp1ing ip2pö i1prof i1prog i1proj ip2rop i1p2rot ipsz1a2l ipsz1ál ip2sz1emb ip2szip ip2sz1í2 ipsz1or i2p1ug iralo2 1i2rama 1i2ramá iramis1s ira2tal irata2n ira2t1any ira2t1as ira2t1at ira2tál 1i2ratb 1i2ratc 1i2ratd ira2tel 1i2raté 1i2ratf 1i2rati 2i3ratill 1i2ratm ira2t1ol 1iratoz. ira2t1ö2 1i2ratp 1i2ratr 1i2ratü irádi2ók irádi2ót irá2f1a2 irá2g1al irá2g1ál irá2g1á2rak irá2g1á2ro irá2g1áto irá2gáz irá2g1e irág1g irá2g1ol irá2g1ó2r irá2gö irá2l1a irá2l1e2 1i2ránn 1i2rány irá2nyal irá2nye2 ir2ch i2rei 1irga irin2c iri2zo irka1s irkasz2 irke1 2iro. 2irob 1i2roda. 1i2rodá iro1g2r iro2ka iro2ká iro2k1e iro2kér iro2l1a iro2m1a iros3s iró2ke i2róno 1irri ir2s1a2 ir2s1á2 ir2sil irs3s ir2s1ü ir2sz irté2 ir2t1él ir2tiz ir2t1o2r ir2t1ö2 ir2tür iru2sze i2s1abl is1a2da is1a2dá is1a2do i2s1a2g is1aja is1ajk isa2k1e isa2kol is1a2la is1alf i2s1alj is1alk is1alm is1amb isa2n i2s1ana i2s1ano i2s1ant i2s1any isa2p is1apá is1apo is1a2rá is1ass is1aut i2s1a2z i2s1ábr is1ággy iságy1út is1áll is1á2po i2s1á2rak i2s1á2rá i2s1árb i2s1árf i2s1árh i2s1árké i2s1árn isá2ron i2s1árr i2s1árt i2s1á2ru isárus1 is1á2t1a2 is1átk i2s1átl is1átv is1bl is1br is1dr is1edz is1eff i2s1ege is1e2gér i2s1e2ke. is1elf is1elm i2s1elo i2s1eml i2s1enc i2s1ene is1eng i2s1e2pi is1epri is1erő is1e2set is1esé isé2ge2l isé2gés isé2gid iségkész1 is1élv i2s1ér. i2s1é2ri i2s1érté is1é2ve. is1é2vet is1é2vén is1é2vét is1évh isé2vi. isföl2 is1fr is2hin is2his is1ido isi2g is1iga is1ind is1inf is1int is1inv isió2 i2sipa isi2par is1iro i2s1isten is1ita is1i2zo i1s2katu is1kl is1k2r is1kv is2lag i1s2lat 1isme. 1ismek 1ismere 1ismérv 2ismo 2ismű i2s1ob i2s1o2l i2s1orc i2s1ord iso2rosz i2s1orra i2s1orró is1orv i2s1osko is1osz i2s1ott is1ó2rá i2s1öb i2s1ö2c is1öl is1ön isö2r is1örd is1öre is1ös is1ö2v is1ő2r i1s2pan i1s2pek isp2r i1s2pur is1s2p is1sta is1stá issz1e2rei issz1e2rek issz1erem issz1e2res is3szig is3szil is3szí is3szó is3szö is3sző is3szú is3szű ista1s istasz2 1istáp 1istenh iste2n1o i1s2til is1trez is1tré is1tri is1tro 1istv i2s1ud is1ujj isu2t is1uta is1utá i2s1új i2s1üg is1üst i2s1ü2tőt i2s1üz isva2d1áss i1svin isvíz1 isza2k1o isza2p1á2 isza2p1e is3zárá isz1árk is3zárl is3zárú isz1e2gy i2sz1elv is3zene isz1esem i2széj isz2fér i2szimi isz1ing isz1isk isz1ist isz1kl isz2k1ö2v isz2k1ú isz1öl isz1ös isz3s isz2tati iszt1áras isz2t1árb isz2tárt isz2t1ékn isz2t1ér. isz2t1ill iszt1i2nai isz2t1öl isz2t1őr. isz2tüz i2sz1ü2g i2szüt is3zűrödn it1a2cé ita1d2 it1a2dó ita1g2r it1agya i2t1akk i2t1akn 1i2tal. ita2lad ita2l1á2rú i2talb ita2l1el italé2 i2talh itali2n ita2lina i2talj i2talk it1allo 1i2talm 1i2taln i2talo ita2l1ó2 1i2talr i2talt2 i2talu it1anó it1ant i2t1ara i2t1au it1ács. it1ág. it1á2ga itána2 itá2n1at itá2rak i2t1á2ram it1á2ras it1á2rat itá2rár itá2rát i2t1á2ria itá2rig itá2ris itáró2 itá2r1ór itá2ruk itá2rú itáskész1 itá2s3z itá2tal it1átf it1bl it1br it1dr ite2l1a ite2l1á ite2leg i2telemz ite2leng ite2lesé ite2lex ite2lél ite2l1ér. ite2linj it1eljá i2t1ellen it2elmély ite2lo ite2lőz i2t1e2mel i2t1eml i2t1e2p 2iter i2t1e2rez i2t1erő i2t1e2sete it1ezr ité2g i2t1ége it1é2le it1élm i2t1é2ret i2t1érz ité2tek i2t1étt it1fl it1fr it1gl it1gn it1gr i2t1id iti2g itigaz1 i2t1igé it1i2ko it1ikr itikus1s it1ill it1imp i2t1ind i2t1inf it1i2pa i2t1irá i2t1iro it1iró it1isk i2t1ism it1isza it1i2szo i2t1íg i2t1íz it1kl itkos1s it1kr ito2b it1obe ito2k1aj ito2kak ito2k1ol ito2n1á2 itop2la ito2r1as ito2rál ito2ril 2itosz ito1sz2f i2t1ov itóa2 itó1f2 1i2tókán i2t1ó2né i2t1ónn i2t1ónt itó1p2 it1órá itós2 itó1sp itó1st it1önt i2t1ös it1őrl it1pl it1pr it1sp 1ittad 1ittam itta2n1á2s itta2n1é itta2n1ó2 2itte it2t1eg it2t1i2na it2t1ing it1tra it1tró 1ittuk 1ittun itty1i i2t1ug i2t1und itu2n1i itu2ral it1u2rán it1új i2t1üg it1üld it1üst i2t1üt i1t2zé i1t2zi i1u iu2ga iu2go iu2mab iu2mac iu2m1ad iu2maf iu2m1ag iu2mal iu2m1am iu2m1a2n iu2m1a2r iu2m1as iu2m1a2t iu2m1av iu2maz iu2m1á2l iu2meg iu2m1el iu2m1en iu2mer iu2m1es iu2mez iu2mél iu2m1éré iu2m1i2d ium1ill iu2m1im ium1inj iu2m1i2p iu2m1is iu2m1iz iu2mí iu2mol iu2m1or iu2m1ó2 iu2mö iu2mő ium1p2 iu2mü iu2na iu2no iu2ra iu2rá iu2ru ius3sze iu2ta iu2tó iu2tu iu2zs i1ú i2úbá i2úbe i2úbé i2úbi i2úbo i2úbö i2ú1br i2úci i2úcí i2údá i2úde i2údo i2údz i2úél iú1fr i2úha i2úhá i2úhe i2úhi i2úhö i2úhő i2úhu i2úhú i2úif i2úje iú2jí i2újó i2úke i2úkí i2ú1kl i2úkó i2úkö i2úku i2úme i2úmó i2úmu i2úmű i2úne i2úné i2únö i2úre iú2ri iú2ro i2úru i2úse i2úso i2ú1sp i2úta i2útá i2úte iú2té i2útí i2útö i2útú i2úve i2úvé i2úvi i2úvo i2úze i1ü iü2cs iü2ge iü2gy iü2le iü2lé iü2li iü2lö iü2lő iü2lü iü2re iü2rí iü2rü iü2te iü2té iü2ti iü2tö iü2tő iü2tü iü2ve iü2vö iü2ze i1ű iű2ze iű2zé iű2ző iva2csal iva2cs1e 1i2vadé iva2r1ai iva2raj iva2re iva2rin iva2rol iva2ró ivar1s iva2t1a2n iva2t1e2 iva2tin iva2tol iva2t1ó2 iva2t1ö 1i2vás. 1i2vásb 1i2vásé 1i2vásn 1i2vásr 1i2váss i2ve. 1ivot ivókész1 ivós2 ivőé2 iv2ré i2x1ab i2x1ad i2x1an i2x1ar ix1as i2x1ág ix1bl i2x1ef i2x1eg i2x1ex i2x1ép ix1fr i2x1im i2x1in i2x1io i2x1ir i2x1is ixi2t i2x1ob i2x1op ix1öd ix1ös ix1őr ix1ős ix1pl ix1pr i2x1új i2x1ül iz1akn izala2g1 iz1alk izas2 iza1sp iz1árny iz1bl ize2d1á2 ize2d1ék iz1egy i2z1e2lem izele2tel i2z1e2lér i2z1e2lőí iz1ember izene2g izen3n ize2s1á2 i2z1esemé i2z1ev i2zéd i2z1ég 1i2zéj 1i2zék i2zél i2z1é2p 1i2zésí iz1fl 1izgal 1izgatot i2z1iga i2z1igé iz1inf iz1int iz1iro i2z1isk i2z1ism izi1s2p 1izmok 1izmuk izmus1s 1izmú iz1okt 1i2zolá izo2m1a izo2mál 1i2zomb 1izomé 1izomf 1i2zomm 1i2zomn 1i2zomr 1izoms 1i2zomt 1izomz izo1p2 i2zos izo1szta 1izotó izó2d1a2 iz1órá iz1pl iz1pr i2zs1ad izsa2ik i2zsakn i2zs1all izs1ara izsa3u2tók iz4s1ág i2zs1ál i2zsec i2zs1embe i2zsev izsé2t izs1éte i2zsil i2zs1imp izs1ist i2zsita i2zsiz iz3sor i2zs1ő izs1s iz3str i2zs1ül iz3sze iztos1s iz1udv izura1 iz1ú2t i2z1ü2g i2z1üt i2z1ü2z 1izzi 1izzí 1izzot 2í. í1a í1á íba2l1 í2bis íbo2r1as ícius1s íd1a2c íd1a2d íd1a2l ídala2g1 íd1a2n íd1a2v íd1a2z íd1ág íd1ál íd1á2r íd1át íd1bl íd1e2g íd1e2l íd1e2m í2d1é2g í2d1él í2d1ép í2d1ér. í2d1érz ídi2g í2d1iga í2d1igé í2d1in í2d1i2r íd1ív í2d1ol í2d1om í2d1os íd1ös íd1ő2r íd1pr íd1st í2d1ud í2d1ug íd1új íd1üg íd1ün íd1üz íd3zá íd3zs í1e í1é íé2le í2g1a2g íg1e2p íge2s í2g2ér í2g1op íg1tr ígyá2 í1i íi2ro í1í í2j1a2dá í2j1a2dó í2j1a2j í2j1akc í2j1a2l íj1any í2j1a2r í2j1a2u í2j1á2c í2j1á2g í2j1árá í2j1áre í2j1árt í2j1áru 1í2jás íjá2sze íj1ászka í2j1áta í2j1á2te í2j1áth í2j1átl íjá2tos í2j1átt í2j1átu í2j1átv í2j1á2z íj1e2g íj1e2l íjel2i íj1e2m íj1en íj1e2r íj1e2s íj1ép íjé2r í2j1ére íj1fr í2j1i2d í2j1im í2j1int í2j1ir íjirá2 íj1íg íj1ín íj1kr í2j1o2d í2j1ok í2j1ol í2j1os í2j1ot íj1ön íj1ös íj1ö2v íj1öz íj1pl íj1pr íj1sk íj1sp íj1st2 í2j1ug í2j1u2t í2j1út íj1üg íj1ü2t í2k1abl í2k1a2c í2k1a2g í2k1a2l í2k1an ík1ar íka2s ík1asz ík1a2v í2k1áb í2k1ág ík1ál í2k1á2r í2k1eg í2k1e2l ík1em í2k1es ík1ev í2k1é2k í2k1ér. í2k1érb í2k1é2rő ík1fr í2k1i2d í2k1ing í2k1i2r ík1ín ík1ír ík1k2r í1k2lu ík1oll í2k1op í2k1orn í2k1orr í2k1ors íkö2l í2k1ö2v ík1pl ík1pr ík1sp ík1sz2 í2k1ug í2kuni í2k1u2r í2k1u2t í2k1ú2t ík1ü2v íl1aj íl1a2k íl1a2l í2l1á2g ílási2 ílá2s1ik ílás3s ílá2s3z í2l1át íl1bl íl1br íl1e2g í2l1érz íli2as í2l1i2m í2l1i2r í2l1is íl1í2r íl1í2v íl1kr íl1ös íl1ö2z íl1st íltá2 íl2t1árk íl2t1áro íl2t1árt íl2t1e íl2t1é2 í2l1u2r ílu2sab ílu2se ílus3s ílu2s3z íma2n íma1p í2m1á2l ímá2ris ímás1s ím1bl ím1b2r ím1dr í2m1e2g ím1elí í2m1elm íme2r1a2 íme2r1á íme2reg ím1e2rő í2m1esem í2m1e2v í2m1é2het í2m1é2k í2m1ép í2m1ér. í2m1é2ré í2m1é2rő. í2m1é2rői í2m1érr í2m1érte í2m1érté í2m1i2d ími2g í2m1iga í2m1igé í2m1ill í2m1ind í2m1inf í2m1ira í2m1is í2m1i2v ím1ír ím1kr ím1o2k1 ím1ol ím1on ím1o2p ím1os ím1ök ím1ö2l ím1ös ím1öt ím1ő2r ím1p2r ím1sp ím1st ím1u2r ím1u2t í2m1üg í2m1ünn í2m1üt í2n1ab ín1a2cé ína2d ín1ada ín1adá ín1ado í2n1a2g í2n1a2j í2n1aka í2n1akk ín1a2la ín1alj ín1alk ín1ana ín1a2ny í2n1a2p í2n1a2rá í2n1arc ín1ass ín1atl ín1att í2n1au í2n1az ín1ábr í2n1á2c í2n1ág í2nálhaj í2n1álm í2n1á2p ín1á2t1a2 ín1átc ín1áte ín1átf ín1áth ín1átl ín1átm ín1átt ín1átv í2n1á2z ín1bl ín1br ín1d2r í2n1ef í2n1e2g í2n1e2ke. í2n1elc í2n1e2le í2n1elh í2n1elj í2n1elk í2n1ell í2n1elm í2n1elny í2n1e2lo í2n1elö í2n1e2lőh í2n1elr í2n1eltá í2n1elto í2n1elvá í2n1e2mel í2n1eml í2n1e2mu íne2n í2n1ene í2nesd í2n1e2sz í2n1e2vé ín1ég íné2l í2n1éle ín1élé ín1élő ín1élt í2n1é2p í2n1ér. í2nérd í2n1éri í2n1érl í2n1érm í2n1érü íné2sza íné2szer íné2szint íné2szo í2n1éte í2n1é2ven ín1f2r ín1g2r íni2g í2n1iga í2n1igé í2n1i2ko í2n1ill ín1ind í2n1inf í2n1ing í2n1int 1í2nio ín1i2rá í2n1iro í2n1ism í2n1i2z ín1íz ín1k2l ín1k2r ín1k2v ín3nyú í2n1ob í2n1ol í2n1op í2n1or í2n1osz ín1ó2l ín1ön ín1ör ín1ös ín1öt ín1ö2v ín1ö2z ín1pl ín1pr ín1ps ín1s2k ínso2k1 ín1s2p ín1s2t2 ín1sz2 ín1t2r ín1ug ín1új í2n1üd í2n1ü2g í2n1ült í2n1ü2t í2n1ü2v íny1e2c íny1e2g íny1el íny1e2r íny1ing í1o í1ó íó2vo í1ö í1ő í2p1a2g í2p1a2n í2p1álc í2p1él ípés3s í2p1i2z íp3ro í2p1uj ípu2san ípus3s ípus3z ír1a2dó ír1akc ír1akn ír1akt ír1a2la ír1alj ír1alk íra1pl íra1pr ír1arc í2r1a2u í2r1ábr í2r1á2g í2r1á2p ír1ár. ír1árak í2r1á2ro ír1á2ru í2r1ásás írá2se íráskész1 írás3s í2rász ír1á2t1a ír1á2t1e2 í2r1áth ír1áts ír1átv ír1áza ír1bl ír1br ír1d2r ír1e2dé í2r1e2g í2r1e2kés í2r1e2l írel1a í2r1ember ír1eml ír1emu íre2n ír1ene í2r1e2r í2r1esem í2r1e2ső í2r1eszk í2r1ev í2r1é2g í2r1éj í2r1é2k í2r1é2l í2r1ép í2r1é2ri í2r1és í2r1é2te ír1évh ír1f2r ír1gl ír1g2r íri2g í2r1iga ír1iko í2r1ill í2r1im ír1ind í2r1inf í2r1inj ír1ins í2r1int í2r1i2p ír1ira í2ris íri2sz1á í2r1i2z ír1ín ír1ír ír1ív ír1í2z ír1k2l ír1k2r ír1kv 1írnok í2r1o2b 1írog í2r1okl í2r1okm íro2l í2r1ola í2r1old í2r1olv í2r1o2r í2r1osz í2r1o2v í2r1o2x íróá2 í2ródj í2ródo í2ródó í2ródt í2róí író1p2 író1s2p író1sz írót2 író1tr ír1ön ír1ör í2r1ös í2r1ö2z í2r1ő2r ír1ő2s ír1p2l ír1p2r ír1sh ír1s2k ír1s2p ír1s2r ír1s2t írsz2 írszt2 ír2t1ag írt1alap írt1é2te írtha2 ír1tran ír1tro ír2t1u2r íru2n í2r1und í2r1uni í2r1u2r íru2s1e2 írus3s í2r1u2t í2r1új í2r1úr í2r1ú2s í2r1útj í2r1útn í2r1ú2to í2r1útr í2r1útt í2r1ü2g írü2l ír1ür ír1ü2v í2r1üz ír1ű2z ís2po ís2tí ísz1aj ísza2k íszak1o ísz1a2l ísz1as ísz1at ísz1au í2sz1á2 í2sz1eb í2szedé í2sz1e2g í2sz1e2lem í2sz1ell í2szeln í2sz1e2lő í2sz1elv í2sz1emb í2sz1e2mel í2sz1eml í2sz1erk í2szég í2sz1é2l í2sz1é2p ísz1érem í2sz1ért í2sz1étk ísz1g2 íszi2 í2sz1id í2sz1in í2szír í2sz1ív ísz1k2 í2sz1o2 í2sz1ó2 ísz1öl ísz1ön í2sz1ő2 ísz1p2 ísz3s ísz1tr í2sz1u í2sz1ú íszü2l í2sz1ülé í2szünn í2szüt ísz1z íta3u2 ítá2s1á2g íté2k1a2l íté2k1e2l 1í2tél íté2sa íté2s1ég. íté2s1é2gé íté2s1égr íté2sza íté2szá íté2szo ítész3s ítóa2 ító1f ítógé2p1é2s ító1p2 ító1sp ító1sta ítót2 ító1tr ít2ré ítus3s í1u í1ú í1ü íü2dü í1ű í2v1a2d ív1a2já ív1ajk ív1ajt í2v1a2la í2v1alj í2v1a2na ív1ang í2v1anó í2v1a2ny ív1arc ív1a2ri í2v1aszt ív1ábr í2v1á2g í2v1ál ív1á2rad í2v1á2ram í2v1árk í2v1árn í2v1árt í2váru ívás3s ívá2s3z ív1áta ív1bl ív1dr íve2c í2v1e2dz í2v1e2g í2v1ej í2velek ív1e2lemb ív1e2leme ív1e2lemé ív1e2lemr í2velg ív1e2lől í2v1ember íve2n í2v1end í2v1ene íve2r ív1ere ív1eré ív1erő í2v1esemé í2v1esz í2v1e2tet í2v1é2g í2v1é2k í2v1é2le í2v1élm í2v1é2lő ív1élt í2v1ép í2v1ér. í2v1érd í2v1é2ri í2v1érr ív1érté í2v1érv í2v1érz í2v1é2te ív1fr í2v1i2d ívi2g í2v1iga ívi2k ív1ike í2v1ill í2v1im í2v1in í2v1i2p ív1iro ívi2s1el ívi2ses ívis1s ív1iva í2v1i2z ív1kl ív1kr í2v1ol í2v1op í2v1or í2v1osz í2v1ox ívó1s2p í2v1öb í2v1ö2r í2v1ös ív1öv í2v1ö2z ív1pl ív1pr ívren2de ív1sk ív1sp ív1st ívsz2 ív1szk ív1tr í2v1ug ív1ult í2v1ur í2v1u2t ív1új ív1út í2v1üg í2v1ür í2v1üt í2v1ü2v í2v1üz íz1ab íz1a2d íz1a2g íz1aj íz1a2k íz1a2l íza2n íz1ar íz1a2u íz1á2g íz1ál íz1á2p íz1á2r ízár1ó2 ízás1s íz1á2t ízát1a2d ízát1á ízát1e2 íz1bl íz1d2r í2z1ef í2z1e2g í2z1ej í3zelá íze2l1el íze2lö íze2lő í2z1emel í2zemé íze2n í2z1ene í2z1e2r 1í2zesí í2z1e2sz í2z1e2ti í2z1eu í2z1e2v í2z1ex í2z1e2z í2z1ég íz1ékk í2z1é2l í2z1é2p í2z1ér. í2z1érb í2z1érd í2z1érel í2z1é2ren í2z1érh í2z1é2r1i í2z1érk í2z1érm í2z1érn í2z1érr í2z1érs í2z1érte í2z1érté í2z1értő í2z1érv í2z1érz ízé2sa íz1ész íz1évi íz1fr íz1gl íz1icc ízi2g í2z1igé íz1iko í2z1ill í2zimá í2z1imi í2z1imp í2z1ind í2z1inf í2z1int ízióé2r ízi2óéra ízi2óto í2z1i2pa í2z1ira íz1irá ízi2so ízi2sza ízi2szo ízi2szó í2z1i2ta í2z1i2vá íz1í2v íz1íz íz1kl íz1k2r ízo2k íz1on íz1or íz1os íz1ó2rá íz1öb íz1öd íz1ök íz1ö2l íz1öm íz1ön íz1ör íz1ös íz1ö2v íz1öz ízpen1 íz1pf íz1pl íz1p2r í2zsa2 ízs1al ízs1as ízs1au íz4s1ág ízsá2r ízs1áro íz3sáv íz3seb í2zs1e2l ízse2s ízs1ese í2zs1in í2zs1it íz3sí í2zso ízs1ok íz3sor í2zs1ó2 í2zsö ízs1s íz3str í2z3su í2zsú íz3sz íz1t2r í2z1ug í2z1uj ízu2me ízu2m1i íz1und í2z1u2r í2z1ut íz1úr íz1ú2t í2z1ü2g í2züle í2z1ür í2z1üs í2z1üt í2z1üv í2z1ü2z í2zűe í2zűn 1í2zűr í2zűv 2j. 1ja j1a2cé 2j1a2dag 2j1a2dal ja2datá 2j1a2dato 2j1adm 2j1a2dom 2j1a2dot ja2dóh ja2dós ja2dót ja2dóv ja2dóz ja2dus ja1f2r ja2ga. 2j1agg 2j1a2gi 2jakad ja2kadé ja2k1ál ja2k1á2p ja2k1árn 2j1akci ja2k1ec ja2k1el ja2k1e2m ja2kes jak1ére ja2k1éri 2jakf ja2k1im. ja2k1iz ja2k1í2r jak1k2 2j1akku jako2v jak1ovi ja2kók ja2k1ölts ja2k1ös 2j1akro jakt2 2j1akt. 2j1akti 2j1aktu 2j1alg 2j1alk 2j1all 2j1alm jam2be 2jambu ja2mes 2jana. 2jana2i ja2nal ja2nat 2j1a2no jan2sze jan2szü ja2nya ja2ran 2j1a2rá 2j1arc ja2rom 2j1a2szás 2j1atk 2j1atró ja2ur ja2uto 2javat ja2xi ja2zon 1já já2ar 2j1á2bé 2j1ábr 2j1ág. 2j1á2ga. 2j1ág1a2d 2j1á2gai 2j1á2gak 2j1á2gas 2j1á2gat 2j1á2gaz 2j1á2gá 2j1ágb 2j1ágf 2j1ágg 2j1á2gi 2j1ágk 2j1ágr 2j1á2gy jáí2r 2j1áll já2n1e já2nék 2jánl já2po 2j1á2rada 2j1á2rai 2j1á2rak 2j1á2ram já2rar já2r1av 2j1á2rán járás3s járá2s3z 2j1á2rát 2j1á2ráv járe2 já2r1em já2res já2rér 2j1á2rig já2r1is 2j1árki 2j1árko 2j1árny 2j1á2ron já2r1ot já3ró já2rő 2j1ártal 2j1ártás 2j1á2ruk 2járus j1árut 2j1árvál 2j1árz já2s1ad já2sal já2san já2s1ág já2s1á2rai já2s1árak já2sás já2s1e2 já2sit já2s1í já2s1ol 2j1á2só já2sö jást2 já2s1ü2 já2sz1al jásze2 já2szis já2sz1okta jász1ói jász1ón jász1ó2r ját1a2dó. ját1a2dók. ját1a2dón. ját1a2dót 2j1á2tal já2t1á2 2j1átáz játék1e2 2j1átfe 2j1áthá 2j1á2ti 2j1átír 2j1átlé 2j1átm ját1osz 2j1á2t1ö 2játszű 2j1á2tü 2j1átvé 2j1átvi já3zs jba2l1 jb2lo jb2ri jb2ró jbű2n1ü2 jc3ho jcsapá2 jcs1s jdo2nal j1d2rá j1d2ro j1d2ru jdúköz1 1je jea2l jea2n je2bé 2j1e2dén 2j1e2dz jee2n je1f2r 2jeged je2gés jegész1 je2gyeg je2gyel jegy1els jegy1elv 2j1e2gyesí je2gy1é2k je2gy1in je2gy1o je2győ je2gyu je2gy1ú je2gy1ű2rű j1ekcé je1kri jek2t1a2 jek2t1á2r jek2t1e2l jek2ter je2laj je2l1an je2l1ap je2lar je2lav je2laz jelá2 je2l1áb je2lág je2lál je2l1ár je2l1át1 je2láz jel1e2gy je2l1e2l1e2v je2l1elk je2l1ell je2l1e2lőá je2l1e2lőb je2l1els je2l1emel 2jelemé je2l1eml 2j1e2lemz je2l1eng je2l1e2r jel1esés jel1esik je2l1esni je2l1e2ső jel1este je2l1esz je2l1etet jel1evo je2lég je2l1éj je2lél je2l1ép je2lérte je2l1ige je2lim je2l1inf je2l1ing je2l1int je2l1í2 2j1ellen je2l1o2 je2l1öv je2lőa 2j1e2lőfe je2lőí 2j1e2lőtu jel1p2 2jelszá 2jelszo 2j1eltett. 2jeltér je2lu je2lú 2j1emba 2j1ember 2j1e2mel je2mu je2n1á jen1d2 je2n1e2ke. je2n1el je2ner jene2s je2n1esz je2n1in je2n1o je2n1ő2re je2n1ős je2n1ü je1p2r 2j1erd je2red je2ró 2j1e2rő je2s1a je2s1emb 2j1e2setb 2j1e2sett je2s1ér je2ső jest2 je1sta je1str je2su je2s1ü2v jes3zac je2t1am je2tál jet1ell je2t1em je2t1ék je2t1o je1tra je2tun je2tut jeu2r 2j1e2vő jezőkész1 1jé 2j1ébr jé2g1a2 jé2g1á2 jégár1a2d jé2gec jé2ged jé2g1e2k jé2g1el jé2g1em jé2g1erk jé2g1es jé2get jé2gép jé2g1ér. jé2gés jég3g jégi2 jé2g1id jé2gigé jé2gim jé2g1is jé2g1o jé2gó jé2gö 2jé2gő jé2g1u2 jé2gú 2j1é2hen 2j1é2hes 2j1éhs jé2k1os jé2kü 2j1é2le jé2lő 2j1élt jé2nad jé2n1ess jé2n1é2g jé2nil jé2no jé2nú jé2pí jé2pü 2j1ér. 2j1érb 2j1érd jé2reg 2j1é2ren 2j1é2ré 2j1érh 2j1é2ri 2j1érk 2j1érl 2j1érm 2j1érn 2j1érr 2j1érte 2j1érté 2j1értő 2j1é2rü 2j1érv 2j1érz jé2tel 2j1étk 2j1étt 2j1év. 2j1évb jé2ve. 2j1é2vek 2j1é2vet jé2vén jé2vér jé2vét j1évh j1é2vi j1évk 2j1évn 2j1évr j1évt 2j1é2vü j1évv jfeles1s jf2le jf2lo jf2ló jfölös1s jf2ra jf2re jf2ri jf2rí jf2ro jf2rö jfu2na j1g2le j1g2ló jg2ru jhá2r1e 1ji ji2do j1i2dő 2j1i2ga 2j1i2gé ji2je 2j1ikr 2j1ill ji2ma ji2má ji2mi 2j1i2na. ji2náb 2j1ind 2j1inf 2j1ing 2j1inj 2j1ins 2j1inte 2j1inté ji2on ji2pa 2j1i2rat 2j1i2rá 2j1i2ro 2j1irr 2j1irt 2j1isk 2j1ism 2j1ist 2j1i2ta 2j1i2vá 2j1i2vó ji2zé ji2zo 1jí jí2gé jí2rá jí2ró jítókész1 jí2ve jí2vé jí2vó jí2ze jí2zé jí2zü jí2zű j2j1alj j2j1a2z jjá1s jje2lesé jje2lesi jje2lest jje2l1ül jj1e2r j2j1im j2j1iz jj1ív jj1íz j2j1ol j2j1os jj1pr jj1üg jka1pr jk1ard jkau2 j2k1e2g j2k1e2lő j2k1e2s jké2p1e2ké jkia2 jkiá2 j2k1id jkie2 jk2la jk2lá j1k2li j1k2lo jkme2 j2k1old jko2r1á2s jko2r1in jk1órá jk1pl jk1pr j1k2ré j1k2ri j1k2rí jk1st j2k1u2s jk1üg jk2va j1k2vó j2l1abl jl1a2da j2l1a2lap j2l1all j2l1ar jla2t1e2 j2l1azo jlás3s jl1á2t1a jl1átn jl1bl jl1e2gy jleí2 jl1elé jl1ell jl1eln jle2t1é2te jlé2cel jlé2c3s j2l1év. jli2k jl1iko j2l1ind j2l1inf j2l1int jl1obj j2l1ol jlo2n1á jlo2ni j2l1ös jl1pr jl1sp jl1st jl1t2r jme2g jm1oká j2m1old jna2l1e jna2lég jna2lis jn1á2rá jn1á2ru jnév1a jn1ing jn1st jn1ü2g 1jo jo2g1a2d jo2g1aka jo2gal jo2g1an jo2g1a2z jo2g1á2c jo2g1á2l jo2g1e2 jog3g jo2g1í jo2g1ol jo2g1or jo2g1osz jogó2 jo2g1óv jo2gö jo2gő jo2gur jo2gü 2j1o2koz 2j1oks 2j1okta jo2laj jo2lim joma2 jo2m1ag jo2m1an jo2mar jo2m1as jo2m1á jo2m1e2 jo2m1é2t jo2mév jom1f2 jo2mij jo2m1ik jo2m1is jo2m1iv jo2m1ol jo2m1or jo2mö jo2mő jom1p2 jo2mü jo2mű jonc1c jon2ch jon2cil jon2c3s 2j1ond jo2ób jo2pá jo2pe jo2r1ing 2j1orr. jo2rü 2j1osto 2j1osz jo2ui jo2uk jo2ul jo2ur jo2ut jo2va 1jó jóa2k jóá2g jóá2r jó1bl jó1b2r jó2ce jó2dad jó2dak jód1all jó2d1a2n jóda2t jó2d1ato jóde2 jó2del jó2dig jó2diz jó2d1ol jódó2 jó2dór jó2dü jó2d3z jó1fl jó1kl jó1kro jó2l1e2s 2j1ónn jó1p2r jó2rák 2j1ó2ri jó2sal jó2sas jó2sál jós1árk jó2seg jó2sem jó2sén jó2sip jó2sis jó2s1o2do jó2sö jós3s jós1üld jó2s1ün jó2s3zár jó1t2r 1jö jö2dé jö2ko jö2lé 2j1önt jö2re jö2rö j1ösv j1ötv 2j1öv. 2jöve. j1ö2vez 2j1ö2vén jö2zö 1jő j1őrl jő2rö 2j1őrt jő2rü jő2ze jpárba2 jp2la jp2le jp2re jp2ré jp2ri jp2ro jp2ró jra3d2 jra1f jrai2 jra1p2 jra1s2 jrau2 jré2sz1e2l jré2szí jsa2v1e jsa2v1é jsa2vo jsa2v1ón. jsa2v1ó2r jság1g js2ho js2ká js2ki js2ni js2pe js2pi js2po js2pó jsp2r j1s2ta js2ti j1s2tí j1s2to j1st2ra j1st2ru j1s2tú jszabás1s jszá2l1a2da jszáraz1 jszín3n jsz2k jszt2 j2t1a2da jt1a2do jt1a2dó jt1akn jt1a2lap jt1alk j2t1all j2t1alv jt1a2nyag jta1p2 j2t1a2pá jt1a2rom j2t1arz jta1sp j2t1atk j2t1a2ut j2t1ác jt1ága j2t1áll jtá2rai j2t1á2rak j2t1árka jtá2s3z jt1á2t1a j2t1e2gy j2t1e2ke. j2t1e2leg j2t1e2leme j2telemz j2t1elf j2t1elh jt1eljá j2t1ell j2telmél j2t1e2lo j2t1e2lő j2t1elp j2t1elr j2t1els j2t1elv j2t1eml j2tener j2t1enz jt1e2red jt1e2rez j2t1erő j2t1e2tetőe jt1e2vés jt1evo j2t1e2vő j2t1é2le jt1élm j2t1érl j2t1érm jtés3s jt1fl jt1fr j2t1i2d jti2m j2timá j2t1imi j2t1imp jt1inf j2t1ing jt1int j2t1i2pa j2t1ir jti2s jt1isi j2t1izg jt1i2zo j2t1í2v j2t1í2z jt1kl jt1kr j2t1olda j2t1orjáb j2t1ors jt1osz j2t1o2x jtóa2 jtóé2ra jtó1p2 jtó1s2po jtó1sta jtó1str jtó1sz jtó1tr jt1ödé jt1öng jt1öss jtőa2 jtőe2 jtőé2 jtő1s2p jt1pl jt1pr j1t2ran jtrádi2 j1t2rág jt2ri j1t2roj jt2róf jt1sp jt1st jt1t2r j2t1udv j2t1und jt1utá j2t1új j2t1üg j2t1ü2l j2t1üt 1ju ju2ga jugo1 ju2had ju2h1a2k ju2hal ju2h1a2n juha2ra ju2hat ju2hál ju2h1e2 ju2h1éj ju2h1is ju2hor ju2hő ju2hü 2jula 2juls 2jural ju2ru ju2sz1a2v ju2szim ju2sz1í2 ju2tak 2j1u2tál 1jú jú1fr jú2jí jújjáé3 jú1pl jú1p2r jú1s2p jú1s2t jú2szó jú1szv 2j1útb jú2ton 2j1útv 1jü jü2ge jü2gy jü2le jü2lé j1ü2lő j1ült jü2re jü2rí jü2rü jü2ta j1ü2tő jü2ve jü2ze 1jű jű2ri jű2ző j2z1abl j2z1a2d jza2j j2z1ajá jz1ajt jza2kad jz1akc j2z1a2l j2z1a2ny j2z1ar j2z1as jza2tan j2z1ál j2z1á2rad j2z1á2rán j2z1e2l j2z1em jze2r jz1eré j2z1es j2z1él j2z1érté jz1fr jzi2g j2z1igé j2zill j2z1int j2z1i2r j2z1isk j2z1ism jz1k2l jz1k2r j2z1ob jz1okta j2z1olda j2zolvas j2z1osz j2z1ó2d j2z1ó2r jzó1s2 j2z1ös j2z1öt jz1pl jz1p2r jz3sab j2zs1a2l j2zs1ál jzscsa2p1 j2zs1eg j2zsen j2zs1er j2zs1in jz3sín jz3sor j2zs1ö2 j2zs1ő jzs1s j2zs1u2t jz3sza jz3szá jz3sze j2z1ut jz1ü2g 2k. 1ka kaa2d kaát1 kaáta2 kab2a 2kabbah 2k1abhá kabi2ná 2k1ablak. 2k1ablaka 2kablaká 2k1ablakb 2kablakh 2kablakk 2k1ablakok 2k1ablakon 2kablakos 2k1ablakot 2kablakr ka1b2le ka1bre 2k1abs ka2cél. ka2c3h kacs1á2g ka2cs1ús ka2cü ka2cz k1adap 2kadál kadás1s 2k1a2dot ka2dói ka2dój 2k1a2dóso ka2dóu ka2dóz ka1d2rá kaegész1 kae2l kae2r kaé2r ka1f2r ka2gan 2k1agg ka1g2r 2k1agy. ka2gyu kai2z 2kajánl 2k1ajk 2k1ajtóh ka2kadé ka2kadó kakas3s ka2kác 2k1akc ka1k2l ka2kó. ka1k2ré ka1kri 2k1akt. 2k1akti ka1k2va ka2lapa 2kalapítv 2k1alb kal1egy 2k1alf 2k1alj. 2k1alji 2k1alka 2kalko 2k1alle 2k1alti kama2te 2k1ambu kana2g ka2nalí 2k1a2nam k1a2nat ka2n1e2g ka2n1el 2kang ka2nim ka2nio ka2n1iv ka2nol ka2nód 2kante ka2nű 2k1a2nya. 2k1a2nyag 2k1a2nyai ka2nyáb ka2nyó ka2óa ka2óá ka2óc ka2óe ka2óg ka2óha ka2óí ka2óko ka2ókr ka2óp ka2óü ka2óz 2kapád ka2páto 2kapp ka1p2re ka1p2ré 2k1aprí ka1prof ka2r1a2d ka2rakk ka2r1a2kó kar1a2lap 2k1arank ka2r1a2r kara2s 2ka2rasz 2karat. 2karatn 2karato ka2rau ka2r1ácsh ka2r1ácsn ka2r1ácst ka2r1ál 2k1a2rány kar2c1el kar2dac kar2dál kar2dz ka2rel ka2rev kar1éke karé2kor ka2rél ka2r1éne karfe2l1 ka2rid ka2r1i2ko ka2r1ikr ka2rind ka2r1ing. kar1ingb kar1inge kar1ingg kar1ingr ka2r1isk ka2r1ism kari2z ka2r1izo 2k1a2roma. 2karomá ka2ror kars2 2k1arti ka2sag kaság1g ka2sál ka2sid kasi2p kas1ipa ka2siz ka2s1ol ka2s1ó2r ka1s2po kas3sze kas3szé 2k1asszi 2kasszony kas3sző kast2 ka1str ka2sür kasz1ajt 2kaszat ka2szág kat1ará ka2tél kat1iko kat1int ka2t1i2o 2k1atká ka2tolda katrádi2 ka1t2ri ka2tyá ka2ud 2k1a2ul kau2n kau2r kau2s kau2ta 2k1a2uto 2k1autó. 2kautób ka3utóc 2kautóé 2kautóh 2kautói 2k1autój 2k1autók 2kautóm 2kautón 2kautós 2kautót 2kautóv kaü2t kaü2z 2k1a2vat 2k1a2zon 1ká 2kábé 2k1ábr ká2cak ká2ce 2ká2c3h ká2có ká2c3sar ká2csat ká2cse ká2cs1ék ká2csip ká2csis ká2c3sor ká2csö ká2cső ká2cü ká2dab ká2dar ká2d1ác ká2dát ká2dil ká2dí ká2d1ö ká2d1ü2 ká2d3z ká2fá 2k1ág. ká2ga 2k1ága. 2kágacska ká3gacská 2k1ágai 2k1ágak 2k1ágat 2k1ágaz 2k1á2gá 2k1ágb 2k1á2ge k1á2gé 2k1ágg 2k1ágh 2k1á2gi 2k1ágk 2k1ágn 2k1á2go 2k1ágr 2k1ágs 2k1ágt 2k1á2gu 2k1á2gú 2k1á2gy 2k1á2hí ká2jö ká2jü ká2lág 2kálái 2kálák 2kálán 2káláv 2káláz 2k1álc k1áldo ká2l1e2 ká2lén 2kállamti 2k1állap 2k1állás kál2l1e2 kállé2 kál2lék 2k1állí 2k1állom ká2lü ká2lyod 2k1á2mí 2k1á2mu ká2n1ag ká2n1a2n ká2n1as ká2nem ká2n1is ká2n1ó2 ká2ny1ag ká2ny1a2l ká2ny1a2n ká2nyap ká2nyar ká2ny1á2to ká2ny1e2 ká2nyis ká2nyiv ká2nyö 2k1á2polá ká2poló 2ká2rad ká2r1a2g 2k1á2rakr ká2rakt kár1akta kár1aktá ká2r1a2l 2k1á2ram ká2r1a2p ká2rar ká2ras kár1ass 2k1á2rat ká2raz kár1azo kár1áll ká2r1á2z kár1d2 ká2r1e2 kár1éte 2k1á2riá k1árká kárkié2h ká2r1old ká2r1osz ká2rö ká2rő kárpszi2 kárpszic3 kár1s2 kárt2 kár1tr ká2ruh ká2rü kás1ajt kás1ass ká2s1á2go ká2s1á2rai ká2s1árak ká2s1á2rá ká2s1árb ká2s1á2ro ká2s1árr ká2s1árv ká2s1árz 2k1á2sásá 2kásást ká2s1e2 ká2s1i2k ká2sim ká2sis ká2sír káská2r ká2s1ol ká2s1ott ká2só ká2sö ká2ső kás1p kást2 kás1tr ká2sut ká2s1ü2 2k1á2száb ká2szár kás3zár. 2k1á2szát ká2sze ká2szé ká2szis ká2sziv 2k1á2szom ká2s3zü ká2tab 2k1átad ká2taj ká2tal kát1a2la ká2t1a2n ká2tar ká2tau ká2t1á2 2k1átbe ká2t1e2 ká2tég k1átfo ká2tip ká2t1ir ká2tis ká2tí k1átló 2k1átme ká2t1osz kátó2 ká2tór ká2t1ö ká2tü k1átvá kba2l1 kbé2rel kb2la kb2le kb2lo kb2rá kb2ri kb2ro kb2ró kci2ófa kci2ósi kci2óspe kc2lu kcsa2p1á2g kdi2al kd2ra kd2rá kd2re kd2ro kd2ró kd2ru 1ke kea2j kea2k kea2l kea2n kea2r kea2s keá2l keá2r keá2t1 2k1eb. ke2bei ke2bek ke2béd kecs1alj kecs1ón kecs1ó2r ke1d2ra keegyez1 kee2n ke2ep kee2s 2k1eff ke1fl ke1f2r 2k1e2gér kegész1 2kegyb ke2gyék ke2gy1in 2k1egyl 2kegyn ke2gyö 2kegyr 2kegys ke2gyu ke2gy1ú 2kegyü 2k1e2ke. 2k1e2kei 2k1e2kek 2k1e2kéé 2k1e2kék ke1k2l ke1k2ré kek2sza 2k1ekv 2k1elad ke2l1an ke2l1a2t 2k1elav ke2l1á2g 2k1e2lef ke2lekc 2k1e2lekt ke2l1e2l k1e2lemb 2keleme 2kelemé k1e2lemh 2kelemm 2k1e2lemn k1e2lemr 2k1e2lemz ke2l1e2pe. ke2l1e2pei kele2p1ü2 ke2l1e2sé ke2l1esze kele2t1el kele2t1o 2keley ke2l1é2k 2k1e2lél kel1érh kelés3s kelé2s3z 2k1elhel 2k1elho kel1id kel2ig 2k1e2lim ke2lio 2k1elism 2k1e2l1í2 2k1eljá k1ellá 2kellát 2kellená 2kellenő 2k1ellent 2k1elnev 2k1elny 2k1e2los 2ke2lö2l 2k1e2lőa kelőé2 2kelőfú ke2lőhí 2k1e2lőí 2k1e2lőképz 2k1e2lőkés 2k1e2lől ke2lőny 2k1e2lőo ke2lőté 2k1e2lőtt k1e2lőz k1elra 2k1elsa 2k1első 2k1elszá kel2t1é2rő. 2k1elto 2keltű 2kelül ke2lűr 2k1elv. 2k1elvá 2k1elvei 2k1elvek 2k1elven 2kelvi k1elvk 2k1elvo 2k1elvt 2k1elvű ke2lyemb ke2ly1ékn kelyköz1 2k1elz 2k1ember 2k1embl 2k1embr 2k1eml 2k1emul ke2nal 2k1enci kende2rül ken2d1ék 2k1endo 2k1e2ner 2k1enge ke2n1ip ke2nis ke2n1o kens3s kensz2 2k1enyv keo2l keo2r keó2d keó2h keó2l keó2r ke2pik ke2ral ke2rap ke2r1a2r ke2r1as ke2rau ke2r1ál ke2r1ár ke2rás ker2csá ker2csell kercsí2 ker2csír 2kerde 2kerdő 2k1e2rege 2k1e2rej kere2k1eg kerekes3s ker1ell ker1elv ke2r1ember ke2r1er kere2ta kere2t1e2l kere2t1ö ke2rég ke2r1é2l ke2r1ép ker1éte ke2r1id ker1iga ke2r1ill ke2rim ke2r1ind ke2r1int ke2r1inv ke2rio ker1ist ke2r1iz ker1k2 2kernel. ke2r1ol ke2ror ke2ród ke2r1ó2r ke2rőde ke2rőe ke2rőké ke2rőo ke2rősí ke2rőte kers2 ker1sp ker1st kersz2 ker2taj ker2táp ker2tás ker2t1ebbé ker2teg ker2t1este ker2t1esz ker2télv ker2t1é2vét ker2tön ker2töv ker2t1őr ker2t1ős ker1tró ke2rút kerü2g 2k1esemé ke2seté 2k1e2sett 2k1esél 2k1e2sés ke2sis 2kesítőst 2keskü 2k1e2ső ke1s2po kes3széke kes3szó ke1sta 2k1este 2k1esté 2k1esti 2k1estj 2k1estk 2k1estn ke1stra 2k1estre 2k1estt 2k1estün ke2szaj ke2szép 2keszmén ke2tál ke1tc ke2t1e2kéh 2k1e2teté ke2tid ke1t2ra ke1t2ré ke1t2ri kettes1s ke2tűd keu2r keu2s kevés3s ke2vid 2k1e2vő keze2tés kezőa2 kezőe2 kezőkész1 2k1ezr 1ké 2k1é2ber 2k1ébr ké2ge ké2gé ké2gő 2k1é2hem 2k1é2hen 2k1é2hes 2kéhezé 2kéhezt 2k1éhs ké2j1ak ké2j1elé ké2jö ké2jut 2k1é2ke. 2k1é2kei 2kékekk 2kékem ké2k1e2r kékes3s kéke2s3z ké2kén ké2k1o2 2k1é2kük 2k1é2kű ké2lel 2kéles 2k1é2letek 2k1é2letet 2k1élm ké2lőd 2k1é2lől 2k1élr 2k1é2lű ké2lya ké2ly1esz ké2lyid ké2ly1ü2l kéma2 ké2mad ké2m1al ké2m1an ké2map ké2m1as ké2m1á kémi2as ké2min ké2mis ké2mí ké2mo ké2mö ké2mő ké2m1u2 kéna2 ké2n1al ké2nan ké2n1ar ké2n1at kéndio2 2k1é2neke 2k1é2nekh 2k1é2neki 2k1é2nekk 2kénekl ké2n1e2l ké2n1em ké2n1er kén1éte ké2nig ké2nil ké2n1ing ké2no ké2ny1e2g ké2ny1elv ké2nyú ké2p1a2 ké2p1á képá2r ké2peg ké2p1e2lő ké2p1elté ké2p1elv képe2r ké2p1ill ké2pim ké2p1i2p ké2pí 2k1épít ké2p1o ké2pó ké2p1ö ké2pő kép1s ké2pu ké2pú ké2p1ü2lé ké2p1ü2lő kéra2 ké2rab ké2ral ké2ram ké2r1an ké2rar ké2r1as ké2rat ké2r1á2 2k1érdeke kér1dr 2k1é2retts ké2ro ké2rö 2kértelm 2kértékb 2k1értéke 2k1értékh 2k1értékn 2k1értékr 2k1értés kértő2iké ké2r1u2 ké2r1ú kérü2 kér1ülé 2k1érvek 2k1érzé késa2 ké2san ké2s1á2 ké2s1é2g ké2s1o ké2só kés3sza kés3szer kés3szél ké2su ké2süt ké2sza2 kész1al ké2sz1á2 ké2szeg késze2l ké2szeml ké2szesz ké2széd ké2sz1ékné ké2szin ké2szir ké2szo ké2sz1ó2 ké2szö ké2szőr készt2 ké2szu ké2sz1ú két1akar ké2takn ké2t1akó két1ala két1asp ké2tál ké2t1ed ké2t1eg ké2tel. ké2teln ké2t1e2m ké2t1ep 2ké2te2r két1ere két1erk két1erű ké2tesé ké2t1esté ké2t1esz ké2t1e2v ké2t1é2 ké2t1i2 ké2tí ké2tol ké2t1or kétó2 ké2t1ór ké2t1ö ké2tud ké2t1ü2 2kétv 2k1év. 2k1évad 2k1évb 2kévei 2k1é2vem 2k1é2ven 2kévet 2k1évf 2k1évh 2k1é2vi. ké2vig 2k1évin 2k1évk 2k1évn 2k1évr 2k1évs 2k1évt 2k1é2vü 2k1évv ké2z1a ké2z1á2 ké2zeg kéz1elt kéze2m kéz1eme ké2z1e2r ké2z1ism ké2zí ké2z1o ké2zö kézs2 ké2z3sé kéz3st ké2zsu ké2z1u2 kfe2l1em kfil2mér kfi2sar kf2jo kf2la kf2le kf2li kf2lo kf2ló kfolyói2k kfo2n1ó2 kf2ra kf2rá kf2re kf2ri kf2rí kf2ro kf2rö kf2ru kg2la kg2nó kg2ra k1g2ráf. kg2ri kg2rí kg2ru khá2t1al khelyköz1 1k2hia khiá2b k2hil kh2me 1ki kia2d ki2aé ki2af kia2g kia2j kia2kar kia2kas kia2lap kia2lá kia2n kia2p kia2ra kia2sz ki2aú kia2v kiá2z ki1b2l ki1b2r 2k1i2deá 2k1i2deg 2kidej 2k1i2dét 2kidéz 2kidi ki2dio 2kidőb 2kidők 2kidőm 2k1i2dőn 2kidőt ki1dró kie2l kie2m kie2r ki2eset. kie2t ki2ew kié2d kié2k 2k1ifj ki1f2r 2kiga ki2ga. 2kigá ki2gát 2kige ki2gén ki2géz ki1g2r ki1k2l ki2konn ki2kono ki1k2ré ki1k2ri ki1k2v 2k1ille 2kily ki2lye 2k1i2ma. 2k1i2mai ki2mak ki2máb 2kimád ki2mái ki2máj ki2mák 2k1i2mám ki2mán 2kimár ki2mát ki2máv ki2mit 2k1imp 2k1i2na. 2k1i2nai 2k1i2náb 2k1i2nár kin2csa kin2csá kin2csel kin2cso 2kind 2k1inf kin2gas 2k1inj 2k1integ kio2l kio2m 2k1i2onn 2k1i2ono 2kiont. ki3óh 2k1i2ón. 2kipar ki1pf ki1p2la ki1ple ki1p2r 2k1ips 2k1i2rat 2kiránn 2kirány 2kirg 2k1irh 2k1irk 2k1i2rod 2kirom 2k1irr 2k1irt ki2sad ki2s1ajtó ki2s1akn ki2sal ki2sap ki2sas ki2sál ki2s1e2c ki2s1elő ki2s1emb ki2s1es ki2s1é2k ki2si. ki2s1in kis1ipa ki2s1i2ra ki2s1isk ki1skál 2kism ki1smár ki1s2min kis2nyá kis1oko ki2s1oros ki2sör ki2ső kisp2 kis1pl ki1s2por ki1s2pó kis3sz kist2 ki1s2tar ki1steri ki1stí ki1stop ki1str ki1stu ki1t2r kit2t1er kit2t1ö kiu2s kiu2t kiú2s kiú2t kivíz1 2k1i2vó 1kí 2k1í2gé k1így. kí2ja kí2nal kí2n1árb kí2n1e kí2nél kí2n1ó2 kí2rá 2k1í2re 2k1í2ró 2kítm kítőa2 kítőe2 2k1ív. 2k1ívb 2k1í2ve 2k1í2vé 2k1í2vű kí2zé kí2zü kí2zű kk1abl k2k1a2da kk1ajt k2k1a2kad k2k1akk k2kalá k2k1alj k2k1alm kka2ró2ra k2k1a2u k2k1azo k2k1áll kk1árf kká2rok k2k1á2ru kká2s k2k1ásá k2k1áth k2k1átl kk1átu k2k1átv kk1á2zó kk1br kke2c kk1ecse kk1e2dz kk1e2gé kke2l1e2g k2k1e2lem k2k1ellő kke2lőá kk1emu kke2ra kk1erd kke2ró k2k1e2rő kk1e2ti kk1e2vé k2k1ég k2k1é2l k2k1épí k2k1érté k2k1érz kk1fr kk1gr kkiá2 kk1i2do kkie2 kk1i2ga k2k1igé k2kill kk1ind k2k1ing k2k1ink k2k1int kk1i2par k2k1i2ro kk1isko kk1ism k2k1í2r k2k1íz k1k2lí kk2ló. k1k2lu kko2laj kk1olló k2k1o2pe kkor2dá k2k1org kko2r1os kko2r1út k2k1orz k2k1oszl kkó1p2 kk1ó2rá kkö2l kk1ölő k2k1önt kk1ötl kk1ő2ri kk1ő2rö kk1őrs kk1őrü kk1pr kk2ris kk2rit kk2rí kk1sm kk1sp kk1st kk1t2r kk1udv kk1urt k2k1utá k2k1új k2k1üg kk1ü2lő k2k1ü2t k2k1ü2v kk1üzl kk1űr kk2vó kla1g kla3ko kla1kri kla2p1áta kla1pla kla1s2k kla2uzá kláma2 klá2mal klá2m1an klá2mas klá2m1á2 klámár1a2d klá2m1e2g klá2m1eh klá2mel klá2mer klá2m1ér. klá2m1érté klá2m1i2k klá2min klá2mis klá2mol kleí2 kle2t1a2n kle2tál kle2t1elv kle2t1e2r kle2t1e2v kle2t1ér. kle2t1étbe kle2t1é2té kle2t1é2ve. kle2tin k2lini klió2 kli2pel k2lisé kli2só 1k2lím k2loá k2lopf k2loty kló2rad kló2raj kló2ran kló2rat kló2ris kló2rol k2lub klu2b1a klu2bá klu2b1e klu2bir klu2bol klu2se klus3s klu2s3z kma1b kmai2ko kmas2 kmá2nyan knag2 knak2 kna1kr kni2a2 knika2 kni2k1al kni2k1as kni1sz2 knőc1c kn2ő3r 1ko ko2áz ko2be 2k1obs ko2cho 2k1o2dav 2k1o2dú kogás1s ko1g2ra ko2kád 2koke2 ko2k1er 2k1o2k1ir 2k1o2kí 2k1okl 2k1okm 2k1o2kol ko2k1o2v 2k1o2koz kok2sze 2k1okta kol1ajt kol1áro 2k1oldal 2k1oldá 2k1oldó ko2lid ko2l1igá ko2limp ko2l1i2na. ko2lita kol2l1ad kol2lál kol2lel kol2les kol2l1ét ko2lö 2k1oltár 2kolvas 2k1ombu ko2mil kom2p1ér. kom2p1ol ko2n1a2d ko2naj ko2n1a2l ko2n1a2n ko2n1ar ko2n1as ko2n1au ko2n1ál 2konbá 2konbet konc1c koncé2 kon2ch kon2csá kon2c3sor. kon2c3soro ko2n1e 2konén ko2n1ér. 2kongu 2konhab ko2nir 2konog ko2n1ol 2konola ko2nor 2konosn 2konosr 2konost 2konpa 2konpr 2konrét 2kontö ko2nü ko2nyag ko2nyal ko2nye ko2nyó konz2 2konzs ko2ón kopá2sé 2kopc ko1pro 2kopti ko2r1a2d ko2rag ko2r1aj ko2r1a2n kor1ass ko2r1aszt ko2r1átl 2k1orch kor2csal kor2dad kor2d1ag kor2d1a2s kor2dác kord1d kor2d1e2l kor2dem kor2des k1ordít kor2d1ö kor2d3z ko2r1e2c ko2reg ko2r1el ko2r1er ko2r1es kor1f2 korgás1s 2korie kor1ill ko2r1ing ko2r1inte kor1isk ko2r1i2zom ko2rosz ko2r1o2v ko2r1ói ko2rón ko2rö ko2rő 2k1orr. 2korrk 2k1orrt kor1s2 kor1t2r ko2r1úto ko2rü ko2s1as ko2sál ko2se kos3sze kos3szo kos3szü 2k1ostr ko2sü ko2szal ko2szer ko2szir ko2szí k2oszo ko2szó 2kosztá kotókész1 kotó1st ko2ut 2kovaria ko2vié ko2xi koza2tal kozókész1 kozóköz1 2kozóö 1kó kóa2d kó1bl kóc3c kó2cem kó2ch kó2d1ab kó2dak kó2d1a2l kó2d1a2n kó2daz kód1d kó2d1e2l kó2dem kó2d1e2r kó2d1es kó2d1és kó2din kó2dö kó2dü kó2dzá kóé2r kó1f2r kói2g kóí2v kó1kré kó1kv 2k1ó2né. kó2nét 2k1ó2ni. 2k1ó2no kó2pan kó2p1as kó2p1e2l kó2pir kópó2 kó2p1ór kó2pü 2k1ó2raa kó2r1a2c 2k1ó2rai kó2r1a2n kó2ras kó2ráb kó2rád kó2rág kó2rái k1ó2ráj kó2rám kó2rán kó2rár kó2rát kó2ráv kó2rel kóre2s kó2réj kó2r1éve kó2r1ir kó2r1ok kóro2ka kóro2ko kór1osto 2kóród kó2r1ódá kó2rő 2k1ó2ságú kó1slá kó2s1os kó1s2pe kó1spi kó1s2po kó1str kó2s1ü2 kó2s3zára 2k1ó2vó kó2z1a2m 1kö kö2ba köb1öll köb1öln köb1ölr köb1ölt kö2da kö2dá kö2del kö2der kö2dev kö2do kö2dó kö2du kö2dú kö2dz 2k1ö2ko 2k1ökrö köl2csal köl2csá köl2csel köl2cs1ő2 2k1ölel köles3s 2k1ö2léssz kö2lí kö2lőe költa2 köl2tal köl2t1e2v 2k1öng k1önté k1öntő k1öntv köny2v1a köny2vá kö2ra kö2rá k1ördö kö2red kö2r1e2g kö2rék kö2r1étt kör1f2 kö2rik kö2r1iz kö2ro kö2ró kö2r1ö2l kö2r1ő2 kör1p2 kör1s2 kört2 kör1tr kö2ru kö2rú körü2l1et körü2lé kö2r1ülés körü2lő kö2r1ülő. 2körv. 2körvb 2körvh 2körvn 2k1örvö 2körvr 2körvt 2körvü 2körvű 2körvv k1öszt 2kötlé k1ötvö 2k1öv. 2k1övb 2k1övh 2k1ö2vig 2k1övr 2k1övv kö2za kö2zá kö2zen kö2z1é2k kö2z1í kö2zo kö2zó közőe2 kö2z3s kö2zu kö2zú kö2z1ü2lé kö2z1ü2lő 1kő kőa2n kő1bl kő2ch kő1dra kőe2k kőe2l kőe2r kőé2l kőé2ne kő1f2r kő1gn kő1gr kői2t kő1kr kő1pl kő1pr kőr1an k1ő2rei kőre2s kőr1esz k1ő2ri. kő2ril kő2rip kő2riv k1őrl kőr1s2 kő2rül 2k1őrz kő1s2k kő2sö kő1s2t kő1tr kőu2t kpára2 kpá2rad kpá2r1at kpá2r1ál kpá2r1út kp2la kp2le kp2lé kp2lu kpó2t kp2ra kp2re kp2ré kp2ri kp2rí kp2ro kp2ró kp2sz k2rach kra2chi 1k2rajc k2rakk kra1p krá2sz1e kren2d1ő2 k2reo k2repá 1k2rémh 1k2réml 1k2rémr kré3p2 1k2rist 1k2riti kro1g2 1krokett. 1krokod kro2n1a2 kro2ná kron1d2 kro2n1e kro1p2 kro1str kro1sz2f kró2mar kró2m1e kró2mis k2rómo 1k2rónik k2rup k2s1a2rá ks1elo ksé2gele ksé2gis kségü2l ksé2g1ülé k1s2ká ks2ko k1s2la ks2lá ks2lu ks2mi k1s2ni ks2pa ks2pe ks2pi ks2po ks2pó ksp2r ks2rá k1s2ta k1s2tá ks2ti k1s2tí ks2to k1st2r k1s2tu k1s2tú k2sz1a2d kszae2 k2szagy k2sz1aj ksza2ke ksza2ké ksza2k1ü k2sz1am ksz1any ksz1aré k2sz1ág kszáraz1 k2sz1e2gy k2sz1ela k2szemu k2sz1eng k2szev ksz1élet kszé2t1 k2sz1id kszilá2 kszi2p ksz1ipa ksz1isk k2szír k2sz1old k2szoltó k2sz1osz kszö2g1ell kszö2g1elv kszt2 k2szuni k2szut k2sz1üg k2szüt k2sz1ü2z ksz1z kt1a2da kt1ajá kt1a2lap k2t1alb k2t1all kta2n1á2s kta2n1ó2 kta1p2 k2t1arm kt1a2ud kt1azo kt1ábr ktá2lal kt1álló k2t1álm ktára2d ktá2r1ada ktár1adó ktá2raj ktá2r1az k2t1átf k2t1átv k2t1e2g k2t1elg k2t1elh kt1eljá k2t1ell k2t1els k2t1elv k2t1enz kte2rad kte2ral kte2rár kte2rát kte2reg kte2r1e2l kte2r1in kte2rosz k2t1esem kté2lő k2t1érl k2térmi k2t1érte k2t1éss k2t1é2vet kt1fr kt1gr k2t1id kti2g k2t1igé kt1ill kti2m kt1ima k2t1ind k2t1inf k2t1i2r k2t1isk k2t1ism k2t1i2vás k2t1íg k2t1í2r ktív1e2l kto1g2ra kto2n1á kt1ope kto2ras kto2r1e kto2rol k2t1ös k2t1öt kt1pr k1t2ran k1trau k1tréf k1t2rén k1t2rió ktro2ná k1t2rón kt1sp kt1st kt1sz kt1t2r ktu2m1e ktu2min ktu2sab ktu2s1an ktu2szár ktu2sze ktu2szé ktü2l k2t1ülé k2t1üt k2t1ü2v 1ku kuá2r 2k1ucc kue2l kue2r kue2s ku1f2r 2k1u2go 2k1ugr ku2gya 2k1ujj. 2kujja. 2kujjad kuj2j1a2da 2kujjai 2kujjak 2k1ujjal 2kujjam 2kujjas 2kujjat 2k1ujjá 2kujjb 2kujjg 2kujjh 2kujji 2kujjk 2kujjn 2k1ujjo 2kujjp 2kujjr 2kujjs 2kujjt 2kujju 2kujjú kuk2k1ó2 kula1k kul2csal kul2cse kulus1s ku2m1a2d ku2mal ku2mü ku2nad ku2nal ku2n1ás ku2ne ku2n1in kun3n ku2nor ku2n1ó2 ku2nü 2k1up. 2kupr 2kupu ku2rad 2k1u2rai ku2rak 2kural ku2ram ku2ráu 2k1urn ku2rol kuru2c3s ku2sal ku2sas ku2sál ku2s1e2 ku2sis ku2s1i2z ku2s1ó2 ku2sö kus3sze ku2s1ú ku2sü ku2szal ku2szar kusz1es ku2sz1é2l ku2sz1é2p ku2szét ku2sz1il ku2szis ku2szü 2kutaló 2k1u2tasí 2k1u2taz ku2tál 2k1u2tán 2k1utc 2k1u2tol 2k1u2tód ku2tóp ku2zs 1kú kú2jí 2k1újs kú2p1a2 kú2p1á kú2p1e kú2t1a2 kú2t1á2 kú2t1e kútfé2 kútfél1 kú2tos kú2t1ő 2kú2tu kú2t1ü2 1kü kü2ge kü2gy 2k1ü2lep kü2lo kül2t1á 2küreg 2k1ü2rí kü2rü 2k1üst kü2szá kü2szí 2k1ütk küvés3s 2k1ü2vö 2k1ü2ze 1kű 2k1űrh 2k1űrm kű2ro kű2r1ős kű2zé kű2ző 1k2van k2varc 1k2vark kvá2nyol kvárosi2 kvé2sel kvé2so kvés3s 1k2vin 1k2vitt k2vóc k2vóta k2vótá kvőcsa2 1ky kyd2n ky2fajtán ky2fajtár ky2fajtát ky1i2s ky1i2v kyk2k kyk2ne ky2se ky2s1ü2 ky1üz kza2tal kza2t1e2 kza2t1ó2 2l. 1la laa2d laát1 laáta2 2labár 3labd 2labr 2l1abs la2c1ag la2c1aj la2c1al la2cem la2c1ete la2c3ha la2ché lac1ita lac2k1orr lac1orr la2c1ö2 la2cő la2csalj lac3ság la2c3sor lac3sül lac3süt lac3sz la2cú la2cü 2l1a2data 2l1a2datb 2l1a2datk 2l1a2datn 2l1a2dato 2l1a2datr 2l1a2datt 2l1a2datu ladás1s 2l1adl 2l1a2dog 2ladomá 3l2a3don ladói2ko 2l1a2duk la1dy2 lae2d lae2l lae2r laé2d laé2r 2laff la1fl la2gac lag1a2dó la2g1a2n lag1ass la2g1a2t la2gau la2gav la2gág lag1áll lag1ár. lag1árá lag1árb lag1áre lag1á2ré lag1árf lag1árh lag1árk lag1árm lag1árn lag1á2ro lag1árr lag1árs lag1árt la2g1ere la2gés la2gid la2g1i2k la2gim la2gis la2gí la2g1ont la2g1osz la2góc la2g1ó2rá la2góvá la2gön la2g1ud la2g1ur la2g1ut la2g1ü la2gű la2gyú la2ire la2jag la2j1a2l la2jap la2j1ar laj1ass laj1a2sz la2j1az la2j1ál 2lajánl la2j1ár. la2j1árh la2j1árn la2j1árs la2j1árt la2jás la2j1áth la2j1áts la2j1elt la2jen la2j1es laji2 la2jin la2j1is la2jí la2j1ol la2j1oml la2j1or 2lajoz la2j1ór la2j1ös la2jő l2ajs laj1sz la2j1u2t la2j1ü2 la2kad lak1alj la2k1alm la2k1a2lo laka2t1a2n la2k1ác la2k1álk lak1áll la2k1árn lak1ásás 2lakci la2k1eg la2k1e2l la2k1ér. la2kérte la2k1iko la2k1ír lak2k1as lak2kec lak2kel lak2kol 2l1akkor lak2köl la1klu 2laknáb 2laknáh 2laknás la2kob la2k1op la2k1orm la2k1osz la2k1ov 2lakóz la2k1ös la1k2rém lak2rip la1k2ru lakt2 2l1akt. 2l1aktiv la2kuj 2lakulá 2lakulg 2lakulh 2lakulj 2lakuln 2lakulo 2lakuló 2lakuls 2lakulu 2lakulv 2lakús la2k1ú2to 2lakúv 2lakza la2la2g1 la2laku 2laláí lalás1s 2l1alb 2l1alc 2l1alf 2laljn 2l1alka 2l1alkot 2l1alku 2l1alle lal2tár lal2te 2l1alti. 2laltonk lal2t1ó2 lal2t1ü2 2laltvé 2l1alvi lam1ada la2m1aka la2m1any la2m1a2p la2m1ará la2m1a2z lame2g la2m1egy la2m1ele lam1emb la2m1esz la2mék lam1éle la2méne la2m1érv la2minv la2m1ism la2m1ist la2m1í2 2l1ammó la2m1ol lam1org la2m1osz la2m1ó2r la2mö la2m1ur la2m1ü la2n1a2d lana2g la2n1aj la2nal lan1ala la2nam la2nar la2n1áll la2n1ár. la2n1á2rai la2n1á2rak la2n1á2rá la2n1árr la2n1árv lanás1s lan2csel lan2csem lan2csi lan2csol lan2d1ál lan2d1el lan2d1ér. lan2diz la2ner la2nes la2n1ép lan2g1as lan2gen lang3g 2l1angin la2nil la2nip la2nis 2l1ankét lan1kr la2n1osz lans2 lan2tag 2lantác la2nü la2nyag lany1a2la la2nyau 2lanyái la2ny1ál 2lanyán la2nyás 2lanyáv la2ny1e2lem lany1e2rő la2ny1í2r la2ny1ol la2nyó la2nyü laó2r 2l1a2pa. lap1akk lap1akt lap1a2la lap1alk la2p1atm la2p1att la2p1a2u la2paz la2páb la2p1á2g la2pák la2pán lap1á2rá lap1árh la2p1árr la2pe2l lap1ele la2pem la2p1en la2p1es la2pik lap1illa lap1ille la2p1im la2p1i2na. la2p1ing la2p1int la2p1i2p la2p1i2s la2p1ita la2p1iz lap2lat la2p1o2ku lap1org lap1orn lap1orz lapos1s la2pó. la2pób la2pón la2pór la2pö la2pő 2lappar 2laprí lap1s2 2lapún 2lapúv la2pű la2ra. la2ran 2l1arc larc3c 2l1a2rén lar2m1e lar2min 2l1art 2l1arz la1s2pa la1s2pi la1stra la2sz1abl lasz1alt. la2szas 2l1a2szat la2szás la2sz1én la2szód lasz3s lasz2t1alj l1asztam la2sz1út la2t1a2d la2t1aj lat1alak la2t1alk la2t1alt lat1ará la2t1a2ro lat1arti lat1aszt lat1att la2tau la2taz la2t1áj lat1áll la2t1árad la2t1á2rai la2t1á2rak la2t1á2ram la2t1á2rat la2t1á2ráb la2t1á2ráh la2t1á2rán la2t1á2ré la2t1árh la2t1árn la2t1á2rok la2t1árr lat1ártá la2t1ártó la2t1á2rú la2t1árv lat1ász la2t1áta latdi2al la2t1e2g la2telem la2t1ell la2tep la2t1erk late2s la2t1ess la2tesze la2t1eti la2t1eto la2t1e2vő la2t1éke lat1é2ké lat1ékk la2t1é2ré la2t1é2rő la2térte la2t1érv lat1éss la2t1i2ko lat1ikra lat1inte la2t1inv la2t1ist la2t1iz la2t1ír lat1ívé lat1k2 la2toj la2t1okm lat1olda la2toll lat1oml la2t1osz la2t1otth la2t1órá la2t1óri la2t1övi la2t1ö2vö la2t1őr 2l1attako latta2n1ó2 2lattv la2tut la2tül lat1üze latű2z la2t1űző la2tyá la2ub la2uk la2us la2uto laü2z la2vat 2l1a2vu la1yé la1yig 2layrő lazac1c laza2c3s lazma1 2lazmá 2l1a2zon 1lá lá2bar lábas1s lá2bál lá2b1e2l lá2b1ina lá2b1i2z láb1org láb1orr lá2bö lá2bő 2lábrá lá2b1u2s lá2bü lácsé2 lá2csét lá2cs1il lá2csip lá2csí láda1s lá2d1az lá2d1e2r lá2det lá2dim lá2d1or lá2d1ott lá2d1ó lá2dül lá2dz lá2gab lá2gac lág1a2da lá2g1a2g lá2g1al lá2gan lá2gas lág1ass lága2t lá2g1atl lá2g1ato lá2g1att lá2gál lág1áll lá2gám lá2g1á2rak lá2g1á2ro lá2g1á2to lá2gép lá2gid lá2gigé lá2gim lá2g1ott lá2g1ó2 lá2gő lág1s lá2gü lá2gű 2lágyá 2lágyo lá2has 2láhe láí2r lá2lad lá2l1aka lá2l1al lála2n lá2l1any lá2l1ar lá2lau lá2l1ág lá2l1á2l lálás1s lá2l1átj 2láldás 2láldoz lá2lel lá2l1est lá2l1e2v lá2lél lá2lim lá2l1is lá2lí 2l1állam 2l1állat 2l1állás 2l1állk 2l1állom 2l1állv 2lálmaim 2lálmok. 2lálmom 2l1álmos 2lálmuk 2lálmunkb 2lálokaih 2lálokain 2lálokair 2lálokán 2lálokát 2lálokáu lá2l1o2ko 2lálokonk 2láloku lál1órá lálö2 lá2l1öv 2l1álut lá2l1út lá2lü lá2lű lá2m1a2d lá2m1aj lám1ass lá2m1au lá2m1ál lá2m1á2z lám1b2 lám1ell lám1erő lá2mes lá2mék lá2m1érv lá2m1int lám1ist lá2mí lá2m1or lá2mó lá2mö lá2mő lá2m1út. lá2mü lá2mű lána2 lá2n1ag lá2nal lá2n1an lá2nar lá2n1as láná2 lá2nár lánc3c lán2cel lán2c1ég lán2csá lá2nem lá2n1er lá2nép lán2g1at lán2gál lán2g1e lá2nil lá2n1is lán2k1e2l lán2k1ó2ra lán2k1ö2v lá3nok lá2nol lán1sp lán1sz lánt2 lán1tr lá2nü lá2nyaj lá2nyala lá2nyam lánya2n lá2nyar lá2ny1as lá2nyav lá2nyel lá2ny1ér. lá2nyó lá2nyö lá2pét lápi2 2l1á2pol lá2rad 2l1á2rai lá2raka l1á2rakb l1á2rakk l1á2rakr lá2r1a2l 2l1á2ram 2l1á2rat lá2r1av l1á2raz 2láren lá2res l1árkot 2l1árnya lár1s2 lárt2 lár1tr 2láru. lá2rug 2l1á2ruh 2l1á2ruk 2l1á2rul 2lárus 2l1árut 2láruv lá2rúa lá2rü lá2s1a2d lá2s1aj lá2sal lá2s1a2r lá2saz lá2s1á2g lá2s1á2rai lá2s1árak lá2s1á2rá lá2s1árb lá2s1á2ré lá2s1árh lá2s1árr lá2s1árt 2l1á2sás lá2s1á2to lá2se lásegyez1 lá2sír lá2sott lás1otth lásó2 2l1á2só. lás1ór lá2ső lás3szé lá2sut lá2sű lá2szas lás3zav 2lászed lá2szeg lá2sz1e2m lá2szen lá2szip lászkész1 lászö2 lá2szöl lá2szöv lász3s lá2szü lá2taj lá2t1e2re láté2tel 2l1áthe lá2t1i2o 2l1á2tí 2látkö lá2t1osz lá1t2rá lá1tri 2l1átte 2l1áttö 2l1áttű l1átús 2l1átvé l1átvi 2lávi lá2viz 2l1á2vó 2lávu lá2z1adot lá2z1al lá2z1árh láz2árus 3lázb lá2z1el lá2z1i2s lázo2 lá2z1olt lá2zsal lá2zsan lá2zsó láz3sz l2b1is lb2li lb2lo lb2lú lb2ra lb2re lb2ri lb2ro lb2ró lb2ru lc1ajt lc1alk l2c1a2to l2c1ág l2c1ál lc3csi lc3cso lc3csö l2c1e2le lc1elr l2c1emb lc1emel lc1esz l2c1e2v lce2z l2c1eze l2c1ép lc1évi lc1fr lc3ha lc3há lc3ho lc3hu lc3hú lc3hü l2c1i2d lci2tér lc1ív lc1k2r l1c2lu l2c1ost l2c1osz lc1ó2r lc1ök lc1ös lc1pr l2cs1a2d l2csakt lcs1alap l2cs1a2n lcsa2p1á2g lcs1apr lcsa2r lcs1ara lcs1aro l2cs1a2s l2csaz lcs1ág l2cs1ál l2cs1á2t1a2 l2csátá l2cs1áth l2cs1átj l2csátv l2csec l2cs1e2g l2c3sej lcs1elf l2cs1elt l2cs1elv lcs1emb lcs1eml l2cserd lcse2r1e2l lcs1erő lcs1ese lcse2t l2cs1ete l2csél l2cs1é2rés l2csérle l2csérte l2cs1érté lcs1érve l2cs1érvé lcsé2sz1ék l2cs1é2te l2cs1étk l2cs1é2vét l2csidé l2csimi l2cs1inf l2cs1ing l2cs1int l2cs1i2pa l2cs1irt l2cs1isk l2cs1ism l2csita l2cs1í2z lcs1k2 l2cs1okm lcs1ors l2cs1ö2l lcs1ő2sé lcs1s lc3str lc3sug lcs1ült lc3szo lc3szó lc1tr l2c1uj lc1ül lc1üt lc3zá lc3zo ld1abl ld1abr l2d1a2cé ld1a2dato l2d1a2dá ldai2 lda2lag lda2laj lda2l1e2g lda2lel lda2les lda2l1é2l lda2liz lda2l1í2 lda2los ldalt2 l2d1ant lda2nya lda2nyá ld1apó l2d1aran l2d1arc l2d1ark lda2t1as lda2t1eg lda2t1in lda2tós ld1ág ld1áll ld1álm ld1árn ldás3s ld1br ld1egy l2d1e2kék l2d1e2kén l2d1e2kétő l2d1e2l1a l2d1e2leme l2d1e2lemi l2d1e2lemn l2d1elér l2d1elk l2d1ellá l2d1elo l2d1e2lőh l2d1e2lővez l2d1els l2d1eltá l2d1elvé l2d1ember l2d1e2mel l2d1eml lde1p2 ld1epe l2d1erő ld1e2vé l2d1ex l2d1é2g l2d1é2jér ld1élm l2d1ép l2d1érc l2d1éré l2d1é2ri l2d1érte l2d1érz l2d1ész ldé2ves ld1fl ld1fr ld1gl ld1gr l2d1i2ga l2d1igé l2d1ill l2d1imi ld1ind l2d1int ldi2p ld1ipa l2d1isza l2d1ín l2d1ír l2d1íz ld1kr ld1kv ldo2g1as l2d1ola l2d1old l2d1olt ld1oml ld1orc ld1org l2d1osz l2d1ó2rá l2d1óri l2d1öb ld1ökle l2d1örök l2d1öv ld1őri ld1ősk ld1pl ld1pr ld2rót ld1sp ld1st ld1udv ldu2r ld1ura ldus3s l2d1u2t l2d1új l2d1úr l2d1ú2t l2d1üg l2d1üle l2d1ür l2d1üz l2d1űr ld3zá ld3zó ld3zu 1le lea2bá lea2d lea2g lea2k lea2l lea2n lea2p le2aré lea2sz lea2v leá2j leá2s leá2z 2l1e2béd le2bin le1bla le1bra leb2rek leb2s 2lecc 2l1e2cet 2l1ecset l1eddi le1d2res le1dro lee2s leé2r lefona2 lefo2nal le1fr 2l1eft le2gala lega2r le2g1a2s le2g1áll le3g2áto le3g2áz le3geb le2g1e2g le3g2elem. leg1ell le3g2előa le3g2előj le3g2előké le3g2előt le3gelőze le3g2elve. le3g2elvé le2gene le3g2erj le3ges. le3geseb le3gesek le3gesen. le3g2esn le3gesr le3gest le2g1e2sz legé2d legé2l le3gén legg2 le2gid le2g1is legmeg1 le3g2on le2góv le3göng le2g1ös legpec1 legvíz1 legyá2 2legyb 2legyed l1e2gyel legy1e2lőr l1e2gyenge l1e2gyék le3gyi 2legyí 2l1egyl le3gyo 2legys l1egysé le3gyú le3gyű 2l1egyv le2ic lei2g lei2rá lei2s lej2ta lej2t1á le2kad le2k1a2pu. le2k1ál leká2p le2k1ár. le2k1ára le2k1árb 2l1e2ke. le2k1eg lek1els lek1emb lek1eme lek1erj lek1e2rő le2k1értő 2l1e2kés. le2k1id le2kij le2k1ik lek1ist le2kiz lekkész1 le1kli lek1olt le2k1orz le2k1ó2r le2k1ő2 2lektro 2lektró le2k1út le2küd 2l1elad l1eldo 2l1e2lekt lele2ma 2lelemei 2le2lemek 2l1e2lemes 2lelemz lele2t1a2 lele2tel lele2to 2lelég 2l1e2l1ér lelés1s lelé2s3z 2l1elgo 2l1elha 2l1elhá 2l1elhel l1elho le2lim lel1ing le2l1iz 2l1eljá 2l1ellá 2l1ellé 2l1ellő 2l1elméj 2l1elmés 2l1elnev 2l1elnö 2l1elny 2l1e2los 2l1e2l1ö2l 2l1e2lőél 2l1e2lőfo le2lőí le2lőszű l1elso l1elsö 2l1elszá 2l1elta l1eltáv 2l1eltér 2l1elto l1eltö 2l1elv. 2l1elvá 2l1elvét 2l1elvh l1elvn 2l1elvs 2l1elz 2l1e2mel. 2l1e2meld l1emeled l1emelek 2le2melé l1emelés 2l1e2melg le2melh l1emelhe 2l1e2meli 2l1e2melj l1emellek 2l1e2meln le2melő 2l1emelő. 2lemelős le2mels le2melt l1emelt. l1emelté l1emeltü 2l1e2melü le2melv l1emelve lem1erk le2m1essz lem1eszt le2m1e2ti le2m1ék le2m1éle lem1élte le2m1élv lem1érde 2l1e2méss le2m1ill le2mind le2m1ing le2m1isz le2mita le2m1itt l1emlege le2mok le2mol le2m1org le2m1osz le2m1ó2r le2möl le2m1ő2 lem1p2 lem1u2r le2n1a2d le2nal le2n1ál le2nát lenc1c len2cel len2ceme l2end le2n1e2g le2n1e2l le2ner lene2tel lené2k le2n1éke le2n1ékk le2n1ékt lené2l len1élé lenés3s le2n1ész le2n1év. len2g1e2l le2nid le2n1ip le2n1o2k le2nol le2n1or le2n1óv len1őré len1s2p len1sta len1tra len1t2ren lenu2 le2n1ur le2n1ut le2n1üg le2n1üt 2l1enyv le2oa le2oc leo2k le2oli leo2m le2oz leó2c leö2r le2p1aj lepa2p lep1apa lep1álla le2p1eg lepe2le le2pék le2pél lep1illé lep1iz le1p2lo le2p1osz le2p1ó2d lep2p1elv le1p2rése le1p2ri le1pro le1pró le2p1ü2lőh 2lerdő 2leredm le2rejé le2r1ék ler1éte le2r1il le2rir 2leróz 2l1e2rő le2s1al le2s1ál l1esdé 2lesege le2s1e2kéh 2l1esemé l1e2setb 2l1e2setei lese2tel 2l1e2seté l1e2seth l1e2seti l1e2setk l1e2setn lese2t1o2 l1e2setr le2sésű le1s2ka le1ski 2leskü le1sla le1s2li le1sma le1s2mi le1s2p2 les3sza les3szá le1s2tar le1stemp 2l1esten l1estébe 2lesti. le1s2til 2l1estj les2t1or 2lestr l1estt 2l1eszkö le1szto le2t1ab le2tac let1a2la let1all le2t1am le2t1ana let1apr le2t1e2kéb le2t1e2la le2t1elb let1eleg le2t1elf let1elk let1előa le2t1e2lőké let1elr let1emel le2t1eml le2tene le2t1ent let1ered le2t1eré le2t1erk le2testé let1eszk 2l1e2teté 2l1e2teth 2l1e2tetj 2l1e2tetv le2t1éd le2t1é2j leté2l let1éle let1élé let1élv le2t1é2nekn le2t1érb le2t1é2ren le2t1é2ri le2t1érr le2t1értő let1é2rül leté2sz let1éter let1é2té. leté2vede let1éves le2t1é2véb le2t1évéi le2t1é2vér le2t1é2vét le2t1é2vév le2tid let1ikr let1ill le2tim le2t1ing le2t1ist leti2sz let1iszo le2tivá le2tod le2t1o2k le2t1on let1ora le2t1ox le2t1ö2v letőe3d le2t1őri le1traf let2teg letü2l le2t1ülé let1üzé 2lety leu2g le2uk leu2r leu2t 2levene 2levení 2levenü l1e2vez. l1e2vezg l1e2vezh l1e2vezn l1e2vezt le2vezü l1e2vezv levél1l le2volú le2xá le2x1el le2x1e2p lexkész1 le2xö le1yé le2zer lezőa2 lezőe2r lezőé2n lező1s2p 2l1ezr 1lé 2l1ébr lé2ca lé2cá léc3c lé2c1ék lé2c3h léci2 lé2cim lé2co lécs2 léc3sk lé2d1as lé2d1el lé2d1emb lé2dél lé2d1és lé2dil lé2dos lé2dot lé2dö lé2d1ő2 lée2r léé2r lé1f2r lé2gal lé2g1e2c 2léged lé2g1eg lég1ell lég1els lé2g1em lé2g1e2r lég1ér. 2l1é2gés l1éghet lé2gil 2légí lé2g1ö 2lé2gő lé1g2ráf l1égtem l1égtet l1égtél lé2gú 2légü l1é2gün lé2gyel lé2gyes lé2gyi lé2gyo lé2gyö 3légz léh1asz 2l1é2he. lé2hed lé2h1em 2léhes 2léhet 2léhező lé2h1é lé2hol 2léhs 2l1éj. 2l1é2ji 2l1éjj 2l1éjs lé2kab lé2k1a2d lé2k1a2g lé2k1aj lék1aka lé2k1a2la léka2p lé2k1apo lé2k1as léka2t lék1ato lé2k1au lé2k1av lé2kaz lé2k1e2g lé2k1ep lé2kesí lé2k1e2sz lék1evé lé2k1é2k léké2l lé2k1éle lé2k1élv lé2k1é2te lé2kid lé2kít lékköz1 lék1ors lé2k1osz lé2k1öl lé2kör lé2köz lé2kő lé2k1u2r lékü2l lé2k1ülé lé2k1ült lékve2g l1élc 2l1é2le. 2l1é2lei 2l1é2les lé2léb lé2lén lé2lér 2l1élm lélőkész1 2l1élr lé2lük 2l1é2lű 2l1é2mel lé2nag léná2 lé2neg lé2nekb 2lénekl lé2nel 2lénkí lé2no lé2nyö lé2p1a2l lé2p1el lépés3s 2l1é2pí lé2pó 2lépül lé2pülé lé3rad lé2ral lé2rap lé2ras lé2rat lé2rav lé2r1á 2l1érc. 2l1ércb 2l1érde lé2reg lé2r1e2l lé2r1eső 2l1é2rez. 2l1é2rezv lé2r1é2j 2l1é2rés 2l1é2rik lé2ris lé2rit lé2rí 2l1érni 2l1érnü lé2r1osz lé2rö 2l1é2rő. lé2rőd 2l1é2rőe lé2rői 2l1é2rőj 2l1é2rők lé2rőn 2l1é2rőt 2l1é2rőv 2lértelm 2l1érték 2l1értj 2l1értő. lé2rut 2lérvel 2l1érvén 2l1érze 2l1érzé lésa2 lé2s1aj lé2sak lé2sal lé2sar lé2s1az lé2s1á2 lé2seg lé2s1e2l lé2s1eti lé2s1é2g lé2sés lé2s1ikr lé2só lé2s1ő lés3sza lés3szer lésü2l lé2s1ülé lé2s1ülő lé2s1üt lész1ék 2lészést 2l1észl lés3zse lé2tag lé2taz lé2t1eg lé2tel. lét1elo lét1elő lét1elv lé2tene lé2tesé 2l1é2teth lé2teti 2l1é2tetn lé2tev lé2t1ér. lé2t1é2te lé2t1is lé2tít 2létl lé2t1o2k 3l2étó lé2tóh lé3tól lé2t1ó2r létö2 lét1örö lét2rág lé2tun 2l1évad 2l1évb 2l1é2ve. 2l1é2ved 2lévei 2l1é2vek 2lévelf 2léveli 2l1é2vem 2l1é2ven 2l1é2vet. 2l1é2véb 2l1é2véh 2l1é2véi 2lévén lév1ért 2l1é2vét 2l1é2vév 2l1évf 2l1évh 2l1é2vi. 2l1é2vig lé2vir lé2vis 2l1évk 2l1évl 2l1évm 2l1évn 2l1é2vó 2l1évr 2l1évs 2l1évt 2lévü lé2vük lé2vün 2l1é2vű 2l1évv 2l1évz lfa2l1e2 lfat2 lfa1tr lf1aut lfá2t1i2 lf1cl lf1ese lfe2t lf1eti lfé2l1é2v l2f1élm lfé2m1e2ké lfi2d1é lfin3n lfi2nos lf1iro lf1isk lf1kl lf2lo lf2ló lf2lö lf2lu l2f1okta l2f1ó2r lf1pr lf2ri l1f2rí l1f2ro lf2rö lf2rő lf1sp lf1sz2 lf1ülő lga1p2 lgatói2ko lgau2 lgár1as lgés3s lgi2as lg2la lg2lo lg2ló lgör2cso l1g2ra lg2ru l2gy1ad l2gy1ag l2gyaj lgy1ala lgy1alj lgy1any l2gy1a2s l2gy1au l2gyáb l2gyál l2gyát l2gy1e2g l2gyelá l2gy1e2le l2gy1elz l2gyembe lgy1eré l2gy1esem l2gy1e2v l2gyél lgy1ér. l2gy1és l2gyid l2gyikr l2gyip l2gyis l2gy1ok l2gy1ol l2gyop l2gy1os l2gy1ó2r l2gy1ö2r l2gy1ös l2gy1u2t l2gy1út lhai2 lhón1al 1li li2aa li2aá li2abi li2abo lia2cé li2aci li2acs li2acu li2a1d2 li2ae li2aé li2ag li2ah li2aid li2aí li2aj li2akép li2ala li2ale li2ali li2amé li2amo li2ao li2aó li2aő li2ap li2ara li2aré li2asá li2aso lia1sz li2asza li2aszá li2aszé li2aszf li2aszi li2a1t2 li2aü li2av li2az li3be lic3sz li2cü li1cy li2deá 2li2deg li2dén li2dét 2l1i2di 2l1i2dő li2ec lie2d 2lien lié2d lié2k lié2n lié2vé lifé2l1é2v li2fí li1fl li1f2r l2ig. 2l1i2gaz ligán1n li2ge. 2l1i2geb 2l1i2gek 2l1i2gep li2géb li2géh li2géi li2géj li2gék li2gén li2gér li2gés li2gét li2gév li2géz li2hat 2l1ihl 2l1i2ker. 2l1i2kerb lik2k1ell lik2k1elv lik2k1e2r lik2kérd li1k2l 2l1i2konc 2l1i2konf 2l1i2kong 2l1i2konig 2l1i2konk 2likonl 2l1i2konm 2l1i2konp 2l1i2kons li1kré 2lill 2lima. 2limád li2mák li2máv l1imbo li2me. lime2rá lim1p2 2limpo limű1 li2nakr li2nal lin1any lin1ará 2linas. lin2cs1ö2 2l1indu li2ne. li2neg linék2 2l1inger lin1grá ling2rádi 2l1ingré lin1ing lin1inj lin1kl lin3ny li2nor 2l1integ 2l1intéz li2n1u2s li2n1ut 2l1i2nú li2oc lio2l li2oni li2óke lió2raj li2őá li2őd li2őe li2őf li2őg li2őm li2őp li2pa. li2pai li2p1aj li2p1á2r li2pát li2peg lip1ele li2p1elv li2p1esz li2pö li2p1ő2 li1pro 2l1i2ram 2l1i2rat 2l1i2rán 2l1irh li2rig li2rod 2l1irr 2l1irt li2sál li2s1el lise2s li2sid lis1isk 2l1iskol l1ism lis1p2 2l1ispá 2l1isten 2l1istr li2s1ü2t lis1ü2v 2l1iszl lisz2t1á2z li1sztir li2t1a2g 2lital. li2tala lit1alk li2t1áta li2t1e2g li2t1e2l li2t1emb li2tez li2t1érd li2térte li2til lit1int li2t1i2o li2t1is li2t1okt li2t1old li2tön litő2 li2t1őr l1ittak l1ittas l1ittat li2t1ura liú2t 2l1i2vad li2vot l1i2vó 3lix. l1izél 2l1i2zén 2lizésí l1izgu 2l1izmo 2lizzí 2l1izzó 1lí lí2gé lí2ja lí2ju líma1 2l1íns l1í2ny línyenc1 l1írd l1írh l1írj l1írl lí2rod lí2rog lí2rok lí2rom 2l1í2ró l1írs l1í2ru lítés3s lítőa2 lítő2p3r 2lív. líva1 lívak2 2l1íz. 2l1í2ze l2ízi lízis3s 2l1ízl 2l1í2zü l1í2zű l2j1a2da l2j1e2lő l2j1er ljes1s ljharc1 l2j1ip l2j1ir l2j1iz lj1ír l2j1or l2j1os lj1pr lj1sp lj1üz lka1sl lka2tel lka2t1é lka2tin lka2t1ó2 lké2p1ell lké2szel lkia2k lkiá2 l1k2lin lk2lí l1k2lu lkö2z1ön. l1k2rá lk2reá l1k2rémb l1k2ri l1k2rí lk2rom l1k2ró lk1sh lkukész1 lk2va lk2vá lk2vó lla2dój lla1f2 lla2g1ad lla2gal lla2g1a2s lla2gál lla2gen lla2gép llag3g lla2gol ll1a2ja ll1akad l2l1akc ll1a2kóz l2l1akti l2l1a2lap l2l1alm lla2mad lla2mal lla2mem lla2mél lla2mor l2l1anal lla2nyer llany1ó2 lla2pal ll1aszf llata2l lla2tala llat1any lla2t1ál lla2t1ár. llatár1a2d lla2t1árb lla2tés lla2tint lla2t1olt l2latomo lla2tors lla2t1ű l2l1aty l2l1aut l2l1á2ga l2l1ágb l2l1ágg ll1ágy. ll1ágyá l2l1állo l2l1álm llá2mag llá2m1al llá2m1e2 llá2m1érté llá2mik llá2mis llá2m1ut llán2k1e2 l2l1á2p llára2 llár1ad llá2rak llá2r1á2 llá2s1ikr llá2sü llá2sza l2l1átd l2l1átf l2l1á2ti l2l1átk ll1bl ll1br ll1cl ll1d2r l2l1e2dz ll1eff lle2ger lleg1g lle2gyé lleí2 l2l1e2kés lle2l1a lle2lin l2l1ell l2l1e2lőa l2l1e2lőd lle2m1a2 lle2m1á lle2m1e2g lle2mel ll1emelé llem1ell lle2mer lle2m1él lle2m1ér. lle2m1érté lle2m1o2 lle2mu lle2na llen3n lle2n1ő2r llens2 lle2r1in l2l1e2ró l2l1e2sőt ll1estr lle2tos l2l1e2vet l2l1ex ll1é2het l2l1é2jek llé2k1aps lléká2 llé2kár llé2k1ol llé2kos llé2kó llé2k1út l2l1é2let. l2l1é2letb l2l1é2lete l2l1é2letén l2l1é2letét l2l1é2letk l2l1élt l2l1élv llé3nya llé1sp l2l1é2ter llét2o l2l1év. ll1é2vén ll1f2l ll1fr ll1g2r ll1ide l2l1i2ga l2l1igé ll1ill l2l1i2ma l2l1imp ll1ina. l2l1ind ll1inga l2l1ingf l2l1ingm l2l1ings lli2nin l2l1inv lli2p l2l1ipa2 l2l1irá l2l1iro l2l1isi ll1isko l2lism l2l1iste lli2ta l2l1ita. l2lital l2l1izé ll1izma ll1izmá l2l1i2zo l2l1íg l2l1íj l2l1í2v ll1k2l ll1k2r ll1kv l2l1oá ll1obj l2l1off l2l1o2l ll1ope llos3s llóá2 lló1gr llóó2 lló2rák lló2rát lló2riá l2lóvo l2l1öb l2l1öl ll1önt l2l1ör ll1öss ll1ösz l2l1ö2z l2l1őr. ll1ő2rei l2l1ő2rö l2l1őrt l2l1ő2si l2l1ő2ze. ll1p2l ll1p2r ll2si. ll1sk ll1sp lls3s llsz2 ll1szt ll1tré ll1tri ll1tró ll1u2bo l2l1ug ll1ult llus1s l2l1u2t l2l1ús l2l1ú2to l2l1üd l2l1üg l2l1ür l2l1üt l2l1üz l2l1űz llvé2d1e2l l2ly lly1ö l3lyw lma2kad lma1kré l2m1ant lma1trá l2m1att lmá2l lm1álm lm1álo lmá2nyan lmá2ny1út lmá2ris lm1átk lm1átt lm1bl lm1b2r lm1cl lm1dr lme3gon lme1kl lm1elb lm1e2li lm1elm lm1e2lő l2m1ember l2m1enc l2m1eng lmeó2 lm1epi lm1e2seté l2m1essz l2m1etn l2m1etű l2m1ex l2m1ég l2m1élv l2m1é2neke l2m1ép l2m1értő l2m1éva lm1gl lm1gr lm1i2dő lmi2g l2m1iga lmigaz1 l2m1ind l2m1inf l2m1ing l2m1ins l2m1inte l2m1inté l2m1inv l2m1i2p lm1irá lm1iro lm1isk lm1izz lm1íg lm1ír lm1íz lm1kl lm1kr lm1old lm1olv l2m1o2p lm1ors l2m1ov l2m1ódá lm1ó2rá lm1ö2k lm1ön lm1ö2r lm1ös lm1öt lm1ö2z lm1ő2r lm1p2l lm1p2r lm1sk lm1sl lm1sn lm1sp lm1st lm1sz2 lm1t2r l2m1u2g l2m1u2r lm1utó l2m1új l2m1üg l2m1ünn l2m1üz lnak2 lna2p1e lná2ris lné2v1á lni2ker lni2s1 1lo lo2áz lo2b1a2r 2lobá lo2b1á2c 2lo2be lo2b1iv lo2b1ó2 2lobu lo1by lo2ch lo1cy lo2éc lo2éo lo2ép lo2éz lo2g1a2d lo2gal lo2g1ál logás1s lo2ger lo2gí lo2g1or lo2gö lo1g2ráf. lo1g2ráff lo2g1ú lo2gü lo2ir lo2kab lo2k1a2d lo2k1aj 2l1o2kak lo2kárb lo2k1á2ro lo2k1árr lo2k1áru lo2k1átj lo2káu lo2k1e2 lo2kék lo2kid lok1is lo2k1i2z lo2kí lokka2l lok2k1ala lok2k1el lok2k1ó2 lok2kös lok2k1ut lo2k1ol lo2konk lo2kor 2l1o2koz lo2kü lo2laj 2l1old 2l1o2li 2l1olló 2l1oltár lom1adá lom1aga lo2m1ajt lom1aka lom1a2lap lom1a2lo lom1ará lom1ass lo2m1att lo2maz lom1ács lo2mág lo2m1ál lo2m1áré lom1ári lom1árk lo2m1árn lo2m1á2ro lomba2l lom2bala lom2bav lo2med lo2meg lo2men lom1erk lom1erő lo2m1es lo2méd lo2mék lo2mél lom1é2ne lo2m1éri lo2m1i2d lo2m1i2k lo2m1im lo2mink lom1int lomi2s lom1isz lo2miz lo2m1í2 l1omló lo2m1okoz lo2mol lo2m1o2r lo2m1osz lom1ott lo2m1ó2 lo2mö lo2mő lom1p2l lo2mü lo2mű lo2nab lo2n1a2d lo2n1a2g lo2naj lo2nak lo2n1a2l lo2n1ar lo2n1as lo2n1au lo2n1av lo2n1á2z lon2ch lon2cil lon2d1ó2 lo2n1el lo2n1ir lon1k2 lo2nol lo2n1ó2 lo2nö lon1s2 lon1tr lo2nü lo2oi lo2oj lo2or lo2ós lo2pap lop1ál lo2pe lop1e2l lo2piz lo2pí lo2p1o2r lo2p1osz lo2pö lop2p1in lop1t2 2l1opti lo2pü lor2din lore2t 2l1org 2l1orm 2lorn 2l1ors 2l1orv 2l1orz l2os. l2osa l2osb lo2se lo2sü lo1t2ha 2lottl lo2xá lo2xi 1ló lóa2d lóá2r ló1bl ló1br lóc3c ló2cem ló2ch lócsa2p1á2g 2l1ó2dát ló1dro lófé2l1é2v lófi2úké ló1fl lóg1g ló2gí ló1grá lóí2v ló1k2l ló1kré ló2nar 2l1ó2ni. 2lónn 2lóno 2lónr 2lónt lópárba2 ló1p2l ló1p2r ló2rac lór1ada lór1a2la lóra2n lór1any ló2rar 2lórái 2lóráj ló2rámr 2lórár 2lórát ló2rem ló2r1e2s ló2r1ér ló2r1ing lór1ism ló2rí lór1old ló2rü ló2s1aj lósa2n lós1any ló1ski ló1sla ló1spe ló1s2po ló1s2rá lós3s ló1s2ta ló1str ló1sz ló1t2rá ló1tre ló1tré ló1tri ló1tro 2lóvod l1ó2vó ló2zad ló2z1a2k ló2zal lóza2n lóz1any lóza2t1e ló2zál ló2z1es ló2zim ló2z1ir lóz1isk lóz1ism ló2zolv ló2ző ló2zü ló2z1ű 1lö lö2bö lö2ca löc3c lö2ch lö2cő 2l1ö2dé lö2ka lö2ká lö2ko l1öldö löl2t1a löl2tá 2l1öltés l1ölthe löl2to l1öltöt l1öltöz l1öltő 2l1öml lö2möl lö2na lö2ná lön2b1ékét lö2ne lö2né lö2n1o lö2nó lö2nu lö2nú lö2pa lö2pá lö2pe lö2pöl löpü2 lö2p1ülé lö2p1ülő lö2re lö2rö lös3szá 2lössze lö2sü lö2sze lö2szis 2l1ötl löt2ter 2l1ötv 2l1öv. 2l1övb l1ö2ve. l1ö2vez 2l1övh 2l1övn l1ö2vön 2l1övr l1ö2vük 2l1övv 1lő lőa2c lőa2n lőá2g lő1bl lő1br lő2dad lő2dá 2lőde. 2lődei lő2del lő2d1ék lő2din lő2d1iv 2lődje. 2lődjét lődköz1 2lődöke 2lődökn 2lődökr 2lődöt. lő2d3ze lőe2l lőe2s 2lőesé lő1fl lő1f2r lőgépi2 lőgé2p1ip l1őgyel 2lőhű lői2ta 2lőít 2lőkése lő1kl lőko2r1út lő1kv 2lőlege 2lőnn 2lőny. lő2nyal lő2nyár 2lőnyb 2lőnye. 2lőnyei lő2ny1elvi 2lőnyéb 2lőnyén 2lőnyér 2lőnyét 2lőnyév 2lőnyh 2lőnyk 2lőnyn 2lőnyö 2lőnyr 2lőnyt 2lőnyü lőőr2s1é2g 2lőpán lő1pl lő1pr lő1ps 2lőreh 2lőrej lőre3m 2lőret 2lőréb lő2r1is lő2rül 2l1őrz lő2sál lő2sin lő1s2ka lő1ská lő1sla lősó2 lő2sór lő2s1ót lő2ső lő1s2pi lő1spr lő1srá lős3s lős2tar lő1str lő1sy lősz2 lős3zára lős3zárr lő1szf l1ő2szít lő1szt 2lőtét. 2lőtolá lő1tre lőu2t lőü2l 2lővig 2l1ő2zét 2lőzié 2lőzl 2lőzm 2l1ő2zük lp1a2lag l2p1a2lap l2p1alát l2p1a2láv l2p1alk lpanto1 l2p1any l2p1áll l2p1átm l2p1áts lpcsa2p1 l2p1eg lp1e2lu l2p1e2m lpen1n l2p1e2rő l2p1ég lpé2l l2p1éle lpé2r l2p1éri l2p1i2d l2p1i2na lp1izm lp1i2zo l2p1ív l1p2lá l2p1old lpo2n lpon1á lp1p2r l1prd l1p2ri l1p2ro l1p2rób lpu2s lp1uszo lrá2k1e lrei2 lre1p2ré lre1sz lreü2 lsa2v1a2m lság3g ls1eprik ls2ho ls2ka ls2ká ls2ki ls2la ls2lá ls2li ls2ma ls2mi lsors1s lsóé2r lső1sz2 l1s2pa l1s2pe l1s2pé l1s2pi l1s2po l1s2pó l1sp2r l1s2rá l1s2ró l1s2ta ls2tá lste2i l1s2ti l1s2tí l1s2to l1st2r l1s2tu l1s2tú lsza2ké lsza2k1ü lszá2rú l2sz1e2gű l1sz2f l1sz2l l1sz2p lszt2 lsz2tá l1sztr l1sz2v lta2gyá lt1ajá lta2lapb lta2l1á2s lta2l1á2z lta2len lta2l1ev lta2l1é2 lta2liz ltal1l lta2lö l2t1amp l2t1apr lt1ará l2t1arc lta2riá lt1assz lt1aszt l2t1a2u lt1azo lt1ág. lt1á2ga lt1ágb lt1ágg lt1ágn lt1ágr l2t1áll ltána2 ltá2nan ltá2rada ltár2s1ág lt1árur ltá2s1á2g ltá2tal l2t1átr lt1bl lt1br l2t1ell l2t1elö l2t1emu lte2rad l2t1e2reik l2t1erő l2teru lte2t1a2 lte2ték l2t1ékné lté2l lt1éle lt1élm lt1érc l2t1érz lté2sa lté2s1é2g ltés3s lté2t1é2 lté2ves. lt1fl lt1gl lt1gr lt1ide ltig2 l2t1i2gé lti1kl l2t1ill lt1imp l2t1ind l2t1ing l2t1i2o l2t1isi lt1ism l2t1ist l2t1i2ta l2t1ín l2t1í2r lt1ít l2t1í2v ltív1e2l l2t1í2z lt1kr l2t1oml l2t1ord l2t1org l2t1orj l2t1orr lt1ors ltos3s l2t1o2x ltó1p ltó1s2p ltó1sz ltót2 ltö2l l2t1ölé lt1önt lt1öss ltőa2 ltőe2l lt1ő2rö lt1pl lt1pr ltra1s lt2rág lt2rén lt2rik lt2ril lt2róf l1t2rón lt2róp ltsé2g1el lt1sl lt1sp lt1st lt1t2r l2t1udv l2t1una ltu2n1i lt1ura ltu2sze l2t1u2t ltú2ri l2t1üg lt1ü2lé lt1üst l2t1ü2v lt1ü2zem 1lu lua2g luá2r lu2b1a2d lu2bal luba2n lu2b1as lu2bár lu2b1e2g lube2r lu2bes lu2bél lu2b1in lubó2 lu2bór lu2bö lub1t2 lu2bü 2ludj 2ludv lu1dy lue2l lu2esé lugas1s lu2gat lu1g2l 2l1u2gor 2l1ugr lui2r 2l1ujj lu1kl lu2k1os lu2k1o2v lu2l1inf lu2lí 2lulr lu2mad lu2maz lu2mál lumen1n lu2mer lu2mes lu2m1i2k lu2m1ip 2lumí lum2pel 2lund l1unh 2l1u2ni l1unj l1unl l1unn l1u2no l1u2nó l1unv lu2rak lu2ram lu2rat 2l1u2ru 2l1u2rú lu2sad lu2s1aka lu2sakr lu2sal lu2s1a2n lu2s1ág lu2sál lu2s1e2r lu2s1érté lu2sim lu2sis lu2sír luskész1 lu2s1ó2 lusö2 lu2sör lu2ső lus3sze lus3szi lust2 2lutánz 2l1utc lu1t2h lu2tód lu1tra lu2zs 1lú lú2d1a lú2dá lú2de lú2dét lú2d3z lú2ga lú2g1á lú2ge lúg3g lú2gi lú2gol 2l1újd 2l1ú2jí lú2ju lú2ri lú2ru lú2rü 2l1ú2sz lú2té. 2l1útv lú2z1a2n 1lü lü2cs lü2dí lü2dü lü2ge lü2gy lü2lá l1üldö lü2lel lü2l1e2m l1ülep lü2lé lül1ér 2l1ülés 2l1ülhet. 2l1ülhetne 2l1ülhets lü2lí 2l1üljek 2l1ülnek 2l1ülnék 2l1ülni 2l1ü2lö 2l1ü2lő 2l1ülsz. 2l1ült. l1ülte. 2l1ültek 2l1ültem 2l1ültes 2l1ültet. 2l1ültete 2l1ülteti 2l1ültetj 2lültetl 2l1ültetn 2lültets 2l1ültett 2l1ültetü 2l1ültetv 2lülté l1ültéi l1ülték l1ültél l1ültén l1ültér l1ültét l1ültn 2l1ültü lü2lú lü2lü 2l1ülün 2l1ülve. 2l1ünn lü2re lü2rí lü2rü lü2sz lü2te lü2té lü2ti lü2tö lü2tő lü2tü lü2ve lü2vö lü2ze lü2zé 1lű lű2rá 2l1űrb 2l1ű2ri l1űrl lű2ze lű2zé lű2zi lű2zö lű2ző lű2zü lva2dat l2v1adm lvaj1ak lva2j1e lv1akad l2v1akc l2v1a2la l2v1alg l2v1alk l2v1ant l2v1a2ny l2v1a2rás l2v1a2z lvá2gy1ón l2v1állat l2v1állt l2v1áp lvá2rain l2v1á2rak. lvá2ras lvá2rár l2v1árny lvá2rol l2v1á2rul lvás3s lvá2szi lv1áta lv1áth lv1átk lv1br l2v1e2dz lv1egys lv1egyv lv1e2kéb l2ve2leme l2v1elk l2v1ell l2v1eró l2v1ex l2v1é2gés lvé2gül l2v1élm l2v1é2neke l2v1ép lvé2ri. l2vértel l2v1érté l2v1é2rü l2vérzési lvé2sza lv1fr l2v1i2de l2v1i2do l2v1iga lv1iko l2v1i2m lv1inté lv1i2pa l2v1iro l2v1irt l2v1isko l2v1ism l2v1izm l2v1izo l2v1í2ve lvíze2 lvíz1es lv1kl lv1kr l2v1ok l2v1old l2v1olv l2v1onto l2v1op l2v1or l2v1os lv1ödé lvö2l l2v1ölé l2v1ölt l2v1ön l2v1ös l2v1öv l2v1ö2z lv1ő2r lv1ős lv1pr lv1ps lv1sp lv1st l2v1ut lv1új l2v1üg l2v1üt l2y 1lya lya2dat 2ly1adm 2ly1a2dó 2lyagy. 2lyagyr 2lyajt 2ly1a2kas ly1akc 2ly1akná 2lyakós 2lyakt ly1a2lat 2ly1alb 2ly1alk 2ly1alm ly1a2lom ly1alt lya2maj lya2mará lya2m1el lya2mem lya2m1érté 2lyang 2lyani lya2nyag ly1a2nyá ly1a2pán lya1p2r 2ly1arc lya2sal ly1aspe ly1assz 2ly1atl lya1t2r 2lyaty 2lyazo 1lyá 2lyábé 2lyábr 2ly1ág ly1áld ly1áll 2ly1áp 2ly1á2rad 2ly1á2rak 2ly1á2ram 2ly1á2rat ly1árk 2ly1árn 2ly1árr 2ly1á2ru lyás3s lyá2sz 2lyáta 2lyátf 2lyáth 2lyátlá 2lyátlé 2lyátm 2lyáts 2lyátt 2lyátv ly1bl ly1br ly1dr 1lye lye2ga ly1e2gye lyegyez1 ly1ej 2lyeke. 2lyekek 2ly1e2kéb 2ly1e2kérő ly1e2le ly1elf ly1elh ly1ell ly1elm ly1e2lő ly1elr ly1els ly1elt ly1elü ly1elv ly1elz lye2m1a 2lyember 2ly1e2mel lye2min 2lyemlí 2ly1eng ly1erk ly1e2rő 2ly1esd 2ly1esemé 2ly1e2sete 2lyeseté 2ly1e2sett 2lyesél 2ly1e2sés 2ly1este 2lyeszk 2lyeszm 2lyeszű 2lyetet 2lyevő 2ly1ex 1lyé 2ly1ég 2lyéhe. 2lyéhen 2lyéhet lyé2l ly1éle ly1élm 2lyéneke 2ly1ép 2ly1ér. 2ly1érc 2ly1érd 2ly1é2ré 2ly1érm 2lyérő. 2lyérői 2lyérők 2ly1érr 2ly1érte 2ly1érté 2ly1é2rü 2ly1érv 2ly1érz ly1ész 2ly1étt 2lyév. 2lyéve. 2lyévei 2lyévek 2lyéven 2lyévet 2lyévév 2lyévi 2lyévr 2lyévv ly1fl lyf1ölt ly1gl ly1gr 1lyi 2lyibo 2lyideá 2lyideg 2lyiden 2lyidi 2ly1ido 2lyidő lyié2h lyi2g 2lyiga 2lyigá 2ly1ige 2ly1igé 2ly1iha 2ly1ill ly1ima 2lyimá 2lyimp 2lyind 2lyinf 2ly1ing 2ly1ini 2ly1int 2lyinv 2ly1i2p ly1i2rat 2lyirá 2lyiri 2ly1iro 2lyirr 2lyirt 2ly1isk 2lyism 2lyisp 2lyist 2ly1ita 2lyivad 2ly1i2z 1lyí 2ly1íg 2ly1ín 2ly1í2r ly1ív ly2kiz ly1kl ly1kró 1lyn. 1lyo 2ly1ob 2lyodú 2ly1of 2lyokal 2ly1okl 2lyokm 2lyokoz 2lyokta lyo2l ly1ola ly1old ly1oll ly1olt ly1olv lyo2m1as 2ly1op 2ly1o2r 2ly1osz 2ly1ott 1lyó ly1ódá lyó2s1á 1lyö 2ly1öb 2ly1ö2l 2ly1ö2r ly1öss 2ly1öv 1lyő ly1ő2r ly1pl ly1pr lyrádi2 lyre1p 1lys. ly1sk ly1sp lys2t lyszá2m1é ly2tac ly1t2r 1lyu 2ly1ud 2lyugr 2ly1uh 2ly1uj lyu2kás 2lyuni 2ly1u2r 2ly1u2t 1lyú 2lyújs 2ly1úr. 2lyúth 2lyútr 2lyútt 2lyútv 1lyü 2ly1üd 2ly1üg 2lyünn 2ly1ür 2ly1ü2v 2ly1üz 1lyű 2ly1űr. 2ly1űrh 2ly1űrl 1lywo lyze2t1el lzás1s lze2ta lze2t1e2l lze2t1ér. lzé2sa lzőa2 lzőe2 lző2s1orr lzus3s lzu2s3z 2m. 1ma maa2d ma1bra 2m1abs ma2cél. ma2célb ma2célt 2madag 2m1adap ma2datb ma2dato ma2datt madás1s ma2d1é2v madókész1 ma2dóz 3m2a3dz mae2r maé2r ma1f2ra ma1fri ma2gac ma2g1a2dato ma2g1a2dá ma2g1a2dó ma2g1a2du maga2l mag1ala ma2ga2n mag1any maga2r mag1ara magas1s ma2g1asza mag1azo ma2gág mag1áll mag1á2ré mag1árn mag1árr mag1árt mag1áta ma2g1áto ma2geb ma2g1el 2m1aggr ma2gid ma2g1i2k ma2g1í magkia3dó ma2g1or ma2g1osz mag1óra ma2g1óv ma2g1u2r ma2g1ü2 2m1agy. 2m1agyb 2m1a2gyu m1ahh ma2il. ma2ilt mai2z 2m1ajta maj2ti ma2kará ma2kác 2m1akc mak2k1e2 2makkr 2m1akku ma1klu 2m1a2kol. ma1k2rém ma1k2ri 2makro m1akti ma2kus malac3há mala2c3s 2malag mala2g1ú ma2laku 2m1alakz 2m1a2lan 2m1a2lapí malasz2t1a 2m1alb 2m1alc 2m1ald 2malg m1algo 2m1alj 2m1alk malo2m1e mal1os m1alr 2m1alt. mal1th 2m1a2lu 2malv 2m1amp 2m1a2nal ma2nat 2maná ma2n1eg 2m1angi 2m1anto 2m1antr 2m1a2nya. ma2nyag 2m1a2nyá 2m1a2nyó mao2k ma2pa. ma2pas 2m1a2pát ma1p2l ma1p2re ma1p2ré ma1p2ri ma1p2ro 2m1aps 2m1a2rány 2m1arb 2m1arc. 2m1arcc 2m1arch mar1cko 2m1arcu 2m1arcú 2m1a2rén ma2r1i2si mar2k1al mar2k1in mar2k1ón mar2k1ó2r 2marm maro2k1 ma2romá maros1s marók2 maró1kh maró1kk maró1kn maró1kr ma1ry 2m1arz ma1s2ká ma1s2pe ma1spr ma1s2rá mast2 ma1s2ta ma1ste ma1str masz1egy masz1e2me ma2sz1ét ma2szév ma2szis maszí2v masz1íve masz1ös mat1ada mat1alap mat1anya ma2taz ma2tág matá2raka ma2t1á2ras mat1á2rár ma2t1árn ma2t1á2rú ma2t1áz ma2t1e2g mat1eli ma2t1ell mat1elő mat1elt ma2t1eme mate2s ma2tél ma2t1érte matfé2 matfél1 matfélé2 ma2tid ma2t1ind ma2t1inf ma2t1ing ma2t1int ma2t1örö ma1t2ran mat2rág mat2tin ma2t1ut 2m1a2tya ma2tyá 2m1a2uk mau2ra ma2uri ma2us mau2ta 2m1a2uto 2m1a2vat ma2z1a2l ma2zál ma2z1átl ma2zel mazókész1 ma2z3sű 1má 2m1á2bé 2m1ábr má2cs1as má2cs1e2 má2csin má2csir má2csis má2csó má2csü má2fá 2m1ág. 2m1á2ga 2m1á2gá 2m1ágb 2m1á2gé 2m1ágg má2gi. 2m1á2gig 2m1ágk m1ágna 2mágo 2mágó 2m1ágr má2guk má2gun 2m1á2gú 2m1á2gy mágya2d mágy1ada má2hí má2jan má2j1árt má2j1e2 májo2 má2j1ol májren2 má2j1ul má2jü máka2 má2k1al má2kar má2k1e2 má2k1ér. má2kil má2k1ó má2kő má2k1ü má2l1a2l 2m1álar má2lál 2m1álc má2l1e2 mál1ért 2m1állam m1állap m1állat 2m1állí m1állom 2m1álma 2m1álmo má2los má2m1as 2m1á2mí mána2 má2n1as má2nav má2nár mánc1c mán2ce mán2c1ég mán2cip mán2csé má2n1e má2n1in má2nis má2n1it má2n1ö2 má2nő máns3s mán2tac mán2tag mán2t1al mán2t1as mántá2 mán2t1ék mán2t1öl má2nú má2nü má2ny1a2d má2ny1a2g má2nyaj má2ny1aka má2ny1a2l mánya2n má2nyany má2nyap má2nyar má2nyau má2nyav má2nyaz má2ny1e2 má2ny1ér. má2nyérd má2nyérz má2ny1í2 má2ny1ó2 má2nyö má2po 2m1á2rad má2r1a2g 2máram má2r1a2n má2ras már1ass 2m1á2rat má2r1au má2r1ál má2re2 már1em má2rés má2r1id má2r1ik má2r1i2p má2r1i2si már1isk már1istá má2rí 2márkok 2márol má2rö má2rő má2rug m1á2ruh má2ruk m1árur má2rü má2s1a2d má2sal má2sap má2s1a2r má2s1av má2saz má2s1á2rá má2s1árn má2sás 2m1ásásá 2m1ásásn 2m1ásásr másbe2j1 másbejá2 má2s1e2 má2sír má2sor 2m1á2só má2sö má2ső mást2 más1tr má2s1ü2 más3zav 2m1á2ta mát1a2k 2m1á2tá 2m1átc 2m1átd máte2 má2ten 2máté 2m1átf 2m1átg 2m1áth 2m1á2tir 2m1á2tí m1átj 2m1átló 2m1átn má2t1ol 2m1á2t1ö 2m1átp 2m1átre 2m1áts 2m1átte 2m1á2tú 2m1á2tü 2m1átv má2zal má2ze mázi2a mázi2é má2z1i2s má2ző má2zsal mázs1e máz3sz mb1akc m2b1akk mba1k2r mb1akv m2b1a2lag m2b1alj m2b1alk m2b1a2na m2b1a2nya mba1p mb1a2var mb1a2zo mb1á2gy m2b1áll m2b1á2ron m2b1árró mbá2száv m2b1ászná m2b1á2szoka m2b1á2szokk m2b1á2szoko m2b1á2szokr m2b1áta m2b1áth mbeá2 mb1e2ce mbe1k2 mbe2led mb1e2leg m2b1ell mb1elr mb1elsz mb1epe mbe2r1a2g mbe2ral mbe2ran mbe2ras mbe2rá mbe2reg mbere2sz mber1eszű mbe2rev mbe2r1él mbe2r1é2s mbe2rimá mbe2ring mbe2risz mbe2rol mbe2ros mbert2 mbe2r1ú m2b1é2g mb1é2ke m2b1ékí m2b1ép mbé2ress m2b1érté m2b1érz mb1gr m2b1ide mbi2k1al mbi2ke m2b1illa m2b1i2na. m2b1i2nai m2binam mb1ind m2b1inf m2b1ing. mb1inv m2b1ipa m2b1izm mb1i2zom m2b1izz m2b1ív mb1íz mb1kl m1b2lú mb1ly m2b1ob mb1olda mbo2lyak mb1ond m2b1op m2b1ormá m2b1ormú m2b1o2roz m2b1oszl mb1öle m2b1öv mb1ő2si m2b1ő2sz mb1pl mb1pr mbrádi2 mb2rev mb2rok mb2ron mb1sp mb1st2 mb1sz mb1tr mbu2sze mbu2szí m2b1u2t mb1új m2b1üg m2b1ül m2b1üs m2b1üt m2b1üz mbvezé2 mc2lu mcsa2p1á2g mda1b2 mda1g2 mda1p2 mdi2ale mdi3ap md2ra md2rá md2ro md2ró 1me mea2l mea2n me2av me2béd mede2r1e2 2medény me1d2rá 2m1e2dz mee2s me2et 2m1eff me2gaba me2g1ala me2g1alu me2g1alv me2g1an me2g1a2r mega1sz2 me2gav me2g1á me3gám megá2s megá2t megá2z me2g1eg me2g1el mege2le mege2lő me2ger me2g1esem meg1eszt me2geta me2g1e2te me2gez me2g1é2l megés3s megész1 meg1f megg2 meg1gr me2gi meg1igá meg1inn meg1ir meg1is meg1itt me2g1í me2g1o me2g1ó2 me2g1ö2 me2gőr me2g1u2 me2gú me2g1ü2g me2g1ü2l 2megyez 2m1egyh 2m1egyl 2m1egys 2megyüt me2hető mei2rá me2k1ad me2k1ag mek1alk me2k1am mek1arc me2k1a2s me2k1att me2k1á2l me2k1á2p me2k1ár. me2k1ára me2kát mek1egy mek1ell me2kep me2k1ers meke2sz me2k1esze me2keszm mek1eszte me2kev me2k1ék me2kél me2k1ér. mek1érde me2k1érk me2k1érte me2k1érté me2k1éss me2k1éte me2kido me2kij mek1imá me2k1ing me2k1int me2k1i2p me2k1ist me2k1ita me2kír me2kít mek1k2 mek3lu me2kob me2k1ok me2k1old me2k1olt me2k1onk me2kop meko2r mek1ora mek1oro mek1ort me2k1os mek1ott me2k1ó2v mek1öltö me2kön mek1öröm me2k1öt me2k1ő mek1s meksz2 mek1t2 me2kuj me2kun me2kur me2k1ú2 me2küd me2k1üg me2k1üld me2k1ü2lé me2k1ü2lő me2küz m1elad mel1ak me2lág me2lál 2melb 2m1e2lef me2lekt mel1e2l 2m1e2leme 2m1e2lemz 2m1e2les 2melet mele2t1ér. 2m1e2lég 2m1e2l1é2l 2m1e2l1ér melés3s 2m1elf 2m1elgo m1elha 2m1elhá 2m1elhel me2lit. 2me2l1í2 2m1eljá 2melk m1elké m1elkí m1elkö mel2lál m1ellene mel2ler mel2l1ér. mel2ling mel2l1iz mel2lo mel2lö mel2l1u2 2m1elmé 2m1elnö me2los m1előde 2m1e2lőí m1e2lőle m1e2lőtt 2melőz me2lőző 2m1elr 2m1elszá 2m1elta 2m1eltá m1elter 2m1eltett. 2m1eltettn 2m1eltér 2m1elti 2melty 2m1elv. 2m1elvá 2m1elves 2m1elvn 2m1elvo me2ly1ék 2m1elz 2m1eml 2m1e2mul me2n1a2d me2nal me2nar me2nau me2nát me2n1e2g me2n1el me2ner mene2t1á2 mene2tö menés3s 2m1enges me2nil me2n1ip me2ní me2nö men2s1é2g men2t1ell men2tip men2t1is me2n1u me2nú me2nya menye2ma me2om me2óe me1p2h me2pik me2pos me1p2r mera1p2 mer1ass 2merdő 2m1e2rec 2meredm mer1egy 2m1e2rej me2r1e2l me2r1eml mere2t1a mere2t1e2l mere2t1ér. 2merezőkh me2r1ép me2r1il me2rim mer1inf mer1ing me2r1ip 2mernyő me2r1ol me2ror me2r1os me2rov 2meről 2merősí mers2 mer1st mer1tró me2r1ü2g me2sas me2s1emb 2m1esemén mese1s 2meseté 2m1e2sett 2mesély 2m1e2sésé 2m1e2sésh 2mesésk 2mesésr 2meséss 2mesést 2m1e2ső me1s2po 2m1estb 2m1este. 2m1estek 2m1esté 2m1estf me1s2tó 2m1estr 2m1estün me2szan 2meszem me1sz2tá met1anya meta1s metasz2 me2t1e2gy met1ell 2m1e2teté met1ing me2tór me2tú me2tűd 2m1e2ug me2uk meus3s meu2t me2vő me2zac me2z1aj meza2k me2zau me2zál me2zedé me2zeg me2z1elj me2z1ell me2zelőh me2zer mez1ere me2z1ék me2z1ér. me2z1érd mez1éret me2z1é2ri me2z1id me2zim me2zin me2zio me2zír me2z1ol me2z1or me2z1ö mezőe2 me2z1ő2rö me2z1őss 2mezrem m1ezrese m1ezresr m1ezrest me2z3sa me2zsá me2zsö me2zu me2zú 1mé mé2ber 2m1ébr mé2cs1a2 mé2cso mé2g1a mé2ge még1eg mé2gé mé2gi még1is mé2g1o2 mé2gő mé2gú mé2h1a2 mé2h1á mé2heg mé2hel mé2hir mé2h1is mé2h1or mé2hö méhren2 2méhsé 2m1éj. 2m1éjb mé2jes 2m1éjs méka2 mé2k1ad mé2k1aj mé2k1ak mé2k1al mé2k1an mé2kar mé2kaz mé2k1á2 mé2k1e2g mék1elh mék1ell mék1e2lő mé2k1ese mé2kev mé2kez mé2k1é2k mé2k1é2l mé2kid mé2kirá mé2kí mé2k1o mé2k1ö mé2kő mé2k1u2 mé2k1ú mé2le. 2m1é2lel mé2les mé2lez 2m1é2lén 2m1élm mé2lya mé2lyá mé2lyeg mé2ly1ú mé2n1a2r mé2n1a2t 2ménekb 2ménekh 2ménekl mé2n1el mé2n1é2k mé2n1és mé2nid mé2nin mé2n1is mé2niv mént2 mé2ny1e2g mé2ny1e2l mé2nyer mé2nyék mé2nyim mé2nyír mé2ny1o mé2nyö mé2nyú ményü2l mé2ny1ülé mé2pí mé2pü 2m1érc. 2m1é2retts 2m1é2rén mé2rér mérés1s 2m1é2rév 2m1é2rie 2m1é2rin 2m1érké 2m1érlel mé2r1ón 2mérteke 2m1értes 2m1értér 2m1értés 2m1é2rül mér2v1a2 2m1érz mé2s1a2 mé2s1á2 mé2s1e2l mé2s1er mé2sez mé2sin mé2sö més3sza mésza2 mész1al mé2sz1ál mé2sz1á2ra mé2szed mé2sz1el 2mészl mé2sz1ő mész3s 2mészté 2mészth 2mészti 2mésztj 2mésztl 2mésztü 2mésztv mé2sz1ü2 mé2t1ad mé2t1ak mé2t1a2n mét1árt mét1elho mét1elta mé2t1e2v mé2tég 2m1étje 2m1étjér 2m1étjév 2m1étjü 2m1étke. mé2t1o mé2tö métő2 mé2tőr mé2t1u mé2t1ű 2m1év. 2m1évb 2m1é2ve. 2mévei 2m1é2vek mé2ven mé2ves 2m1é2vet 2m1é2véb mé2vén 2m1évf 2m1évh 2m1é2vi 2m1évk 2m1évn 2m1évr 2m1évs 2m1évt 2m1évv mé2z1a mé2z1á2 mé2zeg mé2zil mé2zim mé2zin méz1ism mé2zit mé2zí mé2z1o mé2z3s mé2zu mé2zű mfa2l1e2 mfa2lom mfa1s2 mfé2m1a2 mfit2 mfi1tr mf2la m1f2lo mf2ló mf2lu mfog1adat m1f2rak m1f2ran mf2rá m1f2re m1f2ri m1f2rí m1f2ro m1f2rö mgé2p1e2l mgépi2 mgé2p1ip mg2li mg2ló mgör2cso mg2ra mg2rá mha2sábr mhossz1út 1mi mi2aa mi2aá mi2abo mi2ac mi2ae mi2aé mia1f2 mi2afr mi2ag mi2ah mi2aí mi2ale mi2amé mi2ao mi2aó mi2aö mi2aő mi2a1p mi2aré mias2 mi2aszá mi2aszé mi2aszi mi2aszó mi2atá mi2ati mi2ato mi2aü mi2av 2m1i2áz mi1bl micsa2p1 2m1i2deá 2m1i2deg 2m1i2dei 2midej 2miden mi2dent 2m1i2deo mi2dén mi2dio mi2dió mi2dol 2midő m1időz mie2l mi2éf mi1fl mi1fr 2m1i2gaz 2m1i2gén mi1gri 2m1ihl mii2d mi1k2li mi1klu mi2kono mi2kont 2miks mi2lal 2mille 2millu 2millú mi2ma. mi2máh mi2mit mi2mór mi2naj 2m1i2nam mina2n min1any 2m1i2nas mi2n1ára min2c1e2 min2ch min2d1a2 2m1indá min2dek min2d1er min2din 2m1indí 2mindu mi2neg mine2s 2minfl 2m1infú min2g1á 2m1ingé min1g2h min1inj min2k1a2l min2k1an min2k1as min2kec min2kó min2kö 2m1insp 2m1i2nuk mi2nü 2m1inz mio2n1a mio2n1á mio2r mió2r mi1p2l mi1p2r mi2ram 2m1i2rat 2mi2rán 2mirg 2mirh miri2gyel 2m1irk 2m1i2rod 2m1i2rom mi2rón 2m1irr mi2sal mis1elv mis1epe mis1ing 2misit mi2s1í2r mi1s2pi mis3szab mis3szer mi2s1ü2t mi2s1ü2v mi2s1ű mi2szár mis3zár. mi1sz2f mi2tac mita2n mit1any 2m1i2tat 2mitác mit1ár. mit1árá mit1árh mit1ári mit1árk mit1árn mit1árr mit1árt mit1árú 2mitbo mit1ing miti2s 2mitlá mi2tök mi1tri 2mitro 2mitrú mi2tür miumé2 miu2min miu2s 2m1i2vad 2m1i2vó mi2x1i mi2xö mi2xő mi2zé. mi2zét 1mí m1í2gé mí2ja mí2já m1íns 2m1í2rá 2m1í2ró m1ív. mí2vá m1ívb mí2vé m1ívh m1ívr m1ívv mí2zü mí2zű mjé2ná mjobb1o mjo2g1á2s m2j1ol mj1ósá mj1ős mkaró2 mka2r1ór mke1p mkia2 mkiá2 mkie2 mk2la mk2li mk2lí mk2lo mk2lu mkó2rost mk2ra mk2rá mk2re mk2ré mk2ri mk2rí mk2ro mk2ró mk2va mk2vó mla1f mlapá2r mla2p1áro mla2p1e2 mla2pin mla1s2t mlás3s mlá2s3z mle1g2 mleí2 mle1kn mle1pla mlé2k1a2 mlé2k1á mlé2k1el mlé2k1est. mlé2k1ér. mlé2k1ol mlé2kos mlé2kó mlé2k1ú2 mlé2szé mlo2k1ál mlo2ké mlő2s1a2 mlő2s1ű2 mmag1g mma1gl mmai2 mmas2 m2m1atk m2me. mme2g1é mmifé2l1é2v 1mo mo2be 2m1obj moci1 2m1off mo1g2ráf. mo1g2ráff mo1g2ráfk mo1g2ráfn mo2gy1a2 mohu2 mo2is mo2kab mo2k1ad mo2k1a2k mo2k1a2l mo2k1a2n mo2kar mo2kád mo2k1ál mo2k1á2s mo2k1e2 mo2k1il mok1k2 mo2k1ol mo2k1or mo2k1ó2 mo2kö mok1t 2m1oktat moku2 mo2kur mokú2 mo2kús mo2k1úto mo2kü 2m1o2laj 2m1olda m1oldó 2m1o2lim molli2 mol2l1in 2m1olló molói2ko 2m1oltár 2m1oltás 2molvad 2molvas 2m1oml mon1acé mo2n1a2d mo2n1a2l mo2n1an mo2n1a2p mona2r mo2n1as mo2n1áll mo2neg mo2n1er mo2n1is mon2or mo2nö mons2 mon1sp mon1tré mo2nü mo2nű monyá2 mo2nyáz mo2or 2m1opc 2mope mo2per mo1p2l 2m1opt mo2r1ad mora2n mor1any morá2la 2m1ordí mo2r1el mo2ren mo2r1e2r mo2r1est mo2rid 2morie mori2s mo2r1isk mo2r1iszo mor1izg 2morjaia 2morjaié 2m1orjait mo2r1ol mo2r1ont mo2r1ón mo2r1ó2r mo2rós mo2rö 2m1orr. mor1s2 mort2 mor3tá mor1tr mo2rü mo2rű mo2sál mo2s1e 2mosto 2m1ostr 2m1osty mo2sü mo2szal mo2szis 2m1oszlo mo1t2h 2m1ottha mot2to mo2un mo2us2 mo2vi mo2xi mo3zso 1mó móá2g mó1bl mó2ch mócsa2p1 mócsapá2 mó2d1a2l mó2dau mó2dák mó2dár mó2d1e2 mó2dip mó2d1o2r módó2 mó2d1ór módu2 módus1 mó1fl mói2ko mó1k2l mókus1s mó2lar mó1p2r mó2rak mó2rar mó2rág mó2rái mó2ráj mó2rám móri2as móró2 mó2r1ón mó2rö mó1s2k mó1the 1mö mö2bö mö2ko möl2cs1a möl2csá möl2csel möl2cs1es möl2cs1ér. möl2cs1il möl2cs1o möl2cs1ő mö2le mö2nu mö2ro mö2r1ő m1ötl mö2ve mö2vö mö2vü mö2vű 1mő mőa2n mőá2g mőe2l mőe2r mőé2l mőé2te mő1kl mő1ps mő2r1á2r 2m1őrh 2m1ő2ri mő2si mő2sü mős3zár mőü2l mő2zi mpa1dr m2p1akc m2p1aktá m2p1áll m2p1árko m2p1átj m2p1átk mp2ci mp1elt mp1fr mp1ind mpi2re mp2lak mplo2mal m1p2lu mpon1d2 m2p1ord mporta2 mpor2t1al mpor2t1á2r mpor2t1e2 m2p1osztás m2p1ös m1p2ref m1p2rep m1p2rés m1prib m1p2ric mp2rio m1p2rod m1prof m1prog m1proj m1p2ro1p m1p2rot m1p2rób m1p2ru m1p2szi m2p1u2ta m2p1utó m2p1üz mra1p mren2d1ő2 mré2m1 msa2vo ms2ka ms2ká ms2ki ms2ko ms2lá ms2mi ms2ni ms1ond ms2pa ms2pe ms2pi ms2po ms2pó ms2rá ms2ta ms2tá ms2te ms2ti ms2tí ms2to mst2r ms2tú msza2ké msza2k1ü mszáraz1 msz2c mszé2dem m1sz2f mszín3n msz2l msz2m m1sz2p msz2tá m1sz2v mta2n1ó2 mtára2d mtá2r1ada mtés3s mtőkész1 mtran2s mtransz1 mt2rá mt2re mt2ré mt2ri m1t2ró mt2rö mt2rü 1mu 2m1udv 2m1ugr m1ujj 2mulet 2mulz mu2m1ad mu2m1el mu2mél mu2m1és mu2min mu2m1ir mu2mis mu2m1iv mumkész1 mu2m1ó2 mu2mö mu2mő mumus1s mun1g mu2nok 2mur. mu2ral mu2ram mu2rat mu2rál mur1izm mu2r1u2 mu2sal mu2san mu2sar mu2sas mu2sat mu2s1á2g mu2sál mu2s1e mu2s1érté mu2sir mu2sor mu2s1ó2 mu2ső muss2 mus3sze mus2tárá mus2t1erj mu2szal mus3zav mu2szál mu2szás mu2t1a2g mu2tal mut1a2la 2m1utalá 2mutalv muta2n mu2t1any mu2tasí m1u2taz mu2t1á2ra mu2t1árb mu2t1á2ru 2m1u2tás 2mutca mu2t1el mu2til mu2t1in 2m1u2tol 2m1u2tód 2m1u2tóp mu2t1ö mu2tü 1mú mú2jí múl2t1e2 múl2tol 2m1úr. mú2ri 2m1úrn 2m1ú2sz 2m1útb m1úth 2m1ú2ti 2m1útj 2m1útk 2m1útm 2m1útn 2m1ú2to 2m1útr 2m1útt 2m1útv 1mü mü2dí mü2dü mü2gy mü2ná mü2re mü2rí mü2rü mü2te mü2té mü2tő mü1tz mü2ve mü2vö mü2ze 1mű mű1bl mű1br mű1fl mű1fr mű1gr mű1kl mű1pl mű1pn mű1pr 2m1űrl mű1sp műsú2 mű1sz műtőkész1 műves3s mű2zé mű2zi mű2zö mű2ző mű2zü m2v1a2dot mvágya2d mvá2gy1ada mverés3s mw2hi mza2t1e mzás3s mze2r1o mze2t1a2 mze2t1á2 mze2t1e2g mze2t1el mze2ter mze2tesz mze2t1é2k mze2t1érd mze2to mze2t1ö2 mze2t1ő2 mzé2s1a mzé2so mzókész1 mzőe2r mz2rí 2n. 1na naa2d n1abbó 2n1abr 2n1abs na1cl 2n1a2dag 2n1a2dás 2n1add na2dek 2n1adm 2n1a2dó na1d2re 2n1adt na2du. na2dus na2ei naé2r 2n1aff na2ga. na2gár na2git na2gón na1grá nagy1agg na2gy1a2l na2gyapj na2gy1as na2gyav na2gy1é2k nagyú2 nagy1úr nagy1út na2ire na2ji 2n1ajk 2n1a2kad nakaró2 nak1á2sz na2k1át n1akko na1kli na1klu nako2l nak1ola 2n1a2kó. na1k2ré n1akti 2n1a2kus na2k1útn na2l1a2dó 2n1a2la2g1 na2l1aj na2l1a2l na2lana 2n1a2lapa 2n1a2lapd na2lapr na2lapt na2lar na2lav na2l1ábr na2lág na2l1á2l na2l1á2ro nal1á2t1ö na2l1áts na2l1elá na2l1ell nal1eng nal1ent nal1ég. na2l1ék na2l1éri na2lid na2l1ing na2l1i2o na2l1í2r 2nalízisb 2nalízise 2nalízisé 2nalízish 2nalízisi 2nalízisk 2nalízisn 2nalízisr 2nalízist 2nalízisü 2nalj. n1alja. 3naljac n1aljad n1aljai 2naljak n1aljam n1aljat n1alji 2naljon 2nalju 2naljz 2n1alkat na2l1ob na2l1ol na2lop nal1osz na2l1ó2r na2l1ő nalt2 nal1tr na2lulj na2l1ut na2lü na2mer 2namitbo 2n1a2mite 2n1a2mitg 2namitha 2n1a2mitk 2n1amitl 2namitm 2namitö 2n1a2mitp 2namitro 2namitrú 2namits 2namittá 2namittö 2n1amö 2n1amp 2n1a2nal 2n1ang 2n1anh nano1 nanog2 na2nód 2n1a2nyag nao2l naó2r 2napa. nap1adó na2p1a2g na2p1ala na2p1alk nap1a2pa nap1apá nap1ará na2p1as na2pád na2p1á2g na2pák nap1áll na2pám na2p1árb na2p1átm nape2l nap1ell na2pem nap1est na2p1ill na2p1ing na2p1int nap1isk na2pí nap2lat na2p1ola nap1orm napos1s na2p1ostá na2p1ott na2pó. na2p1ó2r napp2 2nappo nap1pr n1aprí 2napróz na2p1u2t na2p1úr 2n1a2rai 2narann 2n1arany. 2n1a2ranya. 2n1a2ranyá 2naranyb 2naranyh 2naranyk 2naranyn 2naranyr 2naranys 2n1aranyt 2n1arc. 2n1arcá narchi2ab 2n1arco 2n1arcu 2n1arcú n1arró 2n1arz na2sév nas1isk 2nask na1s2ka na1s2rá nast2 na1s2ta na1s2tá na1str na2sz1an na2sz1árad naszkész1 nasz1üg na2t1ab na2t1aj na2t1alk na2t1alt nat1ará nat1áll na2t1á2ré na2t1árn na2t1eg nate3le na2t1elé nat1elle na2tél nat1érke na2t1érv na2t1i2m na2t1ing na2t1old nat1ors na2t1osz na2t1u2t na2tül natű2z 2n1a2ty na2uc na2ul nau2ra na2urá nau2s na2uto naü2z na2vart na2vat 2n1avv na1wh 2n1azb na2zé 2n1a2zo 1ná 2n1á2bé 2nábr ná2caj ná2c3h ná2cí ná2csal ná2csap ná2cs1as ná2cse nác3sik ná2csis 2nácsolat nác3sor ná2csö ná2csü nác3sz ná2d1ala ná2dap ná2d1a2r ná2d1asz ná2d1a2v ná2dá nád1d ná2d1e2 ná2d1ö ná2dud ná2d1ü2 ná2d3z ná2ga ná2gá ná2gi ná2gu ná2gú ná2gy 2n1á2hí ná2k1ér. ná2kol ná2kü ná2lab ná2l1a2l ná2lana n1álar nála2te ná2l1az ná2l1át nále2 ná2l1eg ná2l1el ná2lem ná2les n2álé ná2l1ép ná2l1in ná2lir nál2is ná2lí 2n1áll. 2n1álla. 2n1állap 2n1állat 2n1állí 2n1állom nállóköz1 ná2lü ná2mí ná2mu ná2nad ná2n1al ná2nar ná2n1á2r nán2c1e ná2n1e2 náné2 ná2nét ná2nin ná2ní nán2se ná2nü ná2rad 2n1á2raka 2n1á2rakb 2n1á2rakh 2n1á2rakk 2n1á2rakn 2n1á2rako 2n1á2rakr 2n1á2rakt 2n1á2ram ná2r1a2n ná2rap ná2ras nár1ass 2n1á2rat. ná2r1att ná2r1av ná2r1ác ná2r1ál ná2r1e2 ná2r1éve 2n1á2riai 2n1á2riá ná2r1i2p ná2rí náró2 ná2r1ór ná2rő nár1s2 nárt2 nár1tr 2n1árud ná2rug 2nárun. nár1ur 2nárus náru2t nár1utá ná2rút ná2rü ná2s1as nás1áré ná2s1á2ru 2n1á2sás ná2s1e2 ná2s1i2k nást2 nás1tr ná2szan ná2szas ná2szág ná2szál ná2sze ná2szén ná2szil ná2szin ná2szis 2n1ászka. 2n1ászoks ná2sz1ö ná2sz1ú ná2sz1ü ná2tala ná2t1a2n ná2tál nát1ásv ná2t1e2 2n1áthi ná2t1i2o 2n1á2t1ir 2n1á2tí 2n1átlé ná2t1ö 2n1átru 2n1átug 2n1átut 2n1á2tú ná2tü 2n1átvi nba2ká nba2k1e2 n2b1é2kéb n2b1é2kén n2b1é2kér n2b1é2kév nb2la nb2lo nb2lú nbo2n1a2 nb2ra n1b2ri nb2ro nb2ró nburg2hi nc1acé n2c1ajá nc1ajt n2c1akn n2c1akt nc1a2la nc1alj n2c1alk nc1alt nc1alv nc1ana nc1ant nc1a2nya nc1ari nc1att nca2u n2c1ava n2c1ág nc1árb nc1árk n2c1árn nc1árt nc1á2sa nc1ásá nc1bl nc1br nc3csi nc3cso nc3csö nc3csu nc1dr ncea2 nc1egg n2c1eld nc1e2lek nc1e2lem nc1elm n2c1elv nc1e2red nc1eró n2c1eszt nc1etn n2c1ex ncé2g1ér ncé2hes n2c1ép n2c1évi nc1fl nc1fr nc1gr n2c3ha n2c3há n2che. nc3hel nc3het n2c3hé nc3hiá nc3hí nc3hol nc3hon n2c3hoz n2c3hó nc3hö n2c3hu n2c3hú nci2alis nci2aso n2c1ige n2c1i2gé n2c1i2ko nc1i2má n2c1i2na. n2c1ind nc1inf n2c1ing n2c1int n2c1irá nc1iro n2c1ist n2c1i2ta n2c1i2z nc1íj n2c1ír n2c1ív n2c1íz nc1kl nc1kre n2c1ob n2c1okta n2c1o2li nc1orv n2c1ott n2c1ölt. nc1öss ncö2t nc1őr nc1pl nc1pr n2cs1ab n2csac n2csad n2cs1ag n2cs1ajt n2csakt ncs1alap n2cs1alj n2csam n2csan ncsa2p1á2g ncsa2r ncs1ara ncs1arg ncs1aro n2cs1au n2csaz ncs1ágr n2cs1ál n2c3sár. n2cs1á2rá ncs1árb n2cs1árn ncs1árr n2csáru n2csáta n2csátá n2csátv ncs1elf ncs1é2rés n2csérte n2cs1érté n2c3sérü n2c3séta ncs1i2kon ncs1int n2cs1io n2csipa n2csirá ncs1irt n2cs1ism n2csita ncs1izz nc3síki n2cs1í2rá ncs1ízt n2csob n2cs1oks n2csokta n2csosz n2cs1ö2lé n2cs1ös n2cs1öz n2cs1őr. ncs1őrö ncs1s n2csur ncsu2t ncs1uta n2csút n2csüg n2csüt ncs3zár nc3sze nc3szó nc3szö nc1tr n2c1ud n2c1ug nc1uj n2c1ur n2c1új nc1út n2c1üg n2c1üt nc1üv n2c1üz n2c1űr nc1ya n2c3zá nc3ze n2c3zó nc3zö nc3zs nc3zü nczy1i nd1abl nda1br nd1a2dat nda2dás nd1add n2d1ajá n2d1akc n2d1akk nd1akt n2d1alj n2d1alr nd1ann nd1apó nd1a2rán nd1arr ndat1any nda2tap nda2t1eg nda2tin nda2tir nd1azo nd1azt nd1azz nd1á2rak ndás1s nd1bl nd1cl nd1dr nd1ebb n2d1e2kéb n2d1e2kéin nde2köz n2d1elf n2d1ellen n2d1elm nd1elö nde2mer nde2mu nde2m1ü nde2ná n2dennek nde1p2 nde2r1a nde2rál nde2ráz nde2rel nde2ro n2d1erő n2d1e2sett n2d1e2sés n2d1e2ső nde2sza n2d1e2szü nd1eza ndé2go ndé2kel nd1ékez ndé2kö n2d1éle nd1élm n2d1ép ndé2raj n2d1éssz n2d1észh n2d1észl n2d1észr n2d1é2te n2d1étt nd1fr nd1gr n2d1iga n2d1ige n2d1ill n2d1i2na. n2d1ing n2d1ins n2d1i2onj ndi2óé2 ndi2óf ndi2óm n2d1isza ndí2j1a2da nd1kl n2d1oá ndo2k1út ndo2rál n2d1orni ndo2r1ú n2d1ou n2d1ov ndóé2r nd1ó2ni n2d1ó2rá ndö2b nd1öss n2d1ö2z n2d1őr. n2d1ő2r1a2 n2d1őrb n2d1őrc n2d1őrd nd1ő2reg nd1ő2rei nd1ő2rek nd1ő2rel nd1ő2rék nd1ő2rén nd1ő2rér nd1ő2rét nd1ő2rév n2d1őrf n2d1őrg nd1ő2rig nd1őris nd1ő2rit n2d1őrj n2d1őrk n2d1őrl n2d1őrm n2d1őrn nd1őrok nd1őros n2d1ő2rö nd1őrős n2d1őrp n2d1őrr n2d1őrs n2d1őrt n2d1őrú n2d1őrv nd1pr nd2raz n1d2ruk nd1sl nd1sp nd1st ndszá2m1út ndsze2r1e2l ndtár2s1a2d nd1u2szo ndu2t n2d1uta nd1új ndú2rá nd1úsz n2d1üg nd1ünn n2d1üz n2d1űr. n2d1űrr n2d1űrt n2d1űz ndy2b ndy2h ndy2n ndy2r ndy2t ndy2v nd3zav nd3zár n2d3ze n2d3zó n2d3zu 1ne nea2j nea2k nea2la ne2alo nea2n nea2r ne2bé ne1bl ne1dra ne1d2rá ned2v1el ne1dy 2n1e2dzé 2neff 2n1e2ger 2n1egér. ne2g1ö n1egy. n1egyb ne2gyek ne2gyen ne2gyes ne2gyet ne2gyez 2n1e2gyé n1egyf n1egyh ne2gyig n1egyk n1egym n1egyn n1egyr 2n1egys n1egyt ne2gyün nehéz1 2n1ehh nei2g neí2r ne2k1aj ne2k1a2n ne2kát ne2k1e2g nek1erő nek1é2jé ne2kék nek1ékn nekie2 2nekj nek1k2 2nekka 2nekki ne1klu ne2k1ok nekö2r ne1kreá nek1t2 ne2k1üg nek1üldö ne2lag ne2laj ne2l1an ne2lál nelá2r ne2lef ne2leg n1elegy. nel1e2le nele2ma nelem1el nel1e2més nel1eng ne2ler ne2l1ép nelfé2 nel1g2 2n1elha ne2l1id ne2lim ne2l1in n1elló 2n1elnev ne2l1ot ne2l1ó2 ne2l1ö2 2n1e2lőa 2n1e2lőá ne2lőd ne2lőf ne2lőhí 2n1e2lőí 2n1e2lőké ne2lől 2n1előny 2nelőrej 2n1e2lőté 2n1eltér ne2l1ül 2n1elz ne2mak 2nemba 2n1ember neme2g nem1egy 2nemele 2n1emelk ne2m1esz ne2m1ér. ne2m1id nem1isz 2nems 2nemul 2n1eng 2n1enn nen2sa nense2s nen2s1ese nens3s nen2s3z 2n1enyv 2n1enz ne2ob ne2od ne2of ne2og ne2oh ne2oko ne2ola ne2oli ne2oro ne2pad ne2pelm ne2p1est ne2pid ne2p1ó2r ne2p1ut ne2r1a2d ne2r1a2k ne2r1a2n ne2r1a2r ne2r1as ne2raz ne2ráb ner2co ne2r1e2g n1e2rej ne2r1e2ke. ne2r1e2l ner1emel ne2r1er ne2rez ne2rég ne2r1él ne2r1ép ne2r1étt ne2r1id ne2r1iga ne2r1il ne2r1i2m ne2r1inf ne2r1ing ne2r1int ne2ris ner1k2 ne2r1ol ne2ror ne2r1os ne2ró ne2r1ön 2n1e2rő 3n2e3rőkü ner1s ner1tr ne2r1u2 ne2r1üg ne2s1aljá ne2sas ne2s1ál ne2sár 2n1e2setb 2n1e2setr 2n1e2sés 2n1e2ső nes3sza nes3szá 2n1esté 2n1esti ne2s1ü2v nesz1ál ne2s3zár ne2sz1él ne2sz1ű2 ne2t1ab net1a2la ne2t1a2ny ne2tál ne2t1át1 ne2t1e2g net1elá net1elm ne2t1előa ne2t1eml net1este ne2t1esz ne2t1etet ne2t1eti ne2t1é2k ne2t1é2l ne2t1ér. ne2t1érd ne2t1éré ne2t1é2rő. ne2t1é2rők ne2t1érr ne2térte ne2t1értő ne2t1é2rü ne2t1ész ne2t1é2ve. ne2tid ne2t1i2ko ne2t1int ne2tip netké2sz1ü ne2t1o2k ne2tol net1old ne2t1ő2 net2tév ne2tun ne2t1ut netü2l net1ülé ne2t1ü2z 2n1e2vő 2n1evv nexpor2t1ő2 ne1yé 2n1e2zer 2n1ezred 2nezüs 1né 2n1ébr 2nédl né1f2r 2n1ég. 2n1é2gek 2n1é2geté 2n1é2gető. 2négetőh 2n1é2getők 2négetőn 2négetőt 2n1é2gé 2n1égj 2n1égn 2n1é2gő 2n1égs 2n1égt 2n1é2gü né2gyer né2gyén né2gy1o né2gyök 2n1é2hes 2n1éhs né2kaj né2kak né2k1a2n né2kar né2k1á néke2l nék1ele né2ker né2kév né2kid nék1isz 2n1é2kí né2kó nékü2 né2kül n1é2les 2n1é2let 2n1élm né2lői né2lőn 2néneke 2n1é2neké népa2 né2pad né2p1ak né2p1al né2p1an né2pap né2p1as né2pau népá2 né2p1ál né2p1ár né2pát né2p1áz né2peg né2p1e2l népe2r nép1etet né2p1etn né2pev né2p1és nép1f2 2né2pí né2p1o né2p1ö né2pő nép1s né2p1us né2pú 2népül néra2 né2raj né2r1an n1érd 2nérde 2n1é2rem né2ré. né2rés né2ri. né2rin né2rip né2rö 2n1é2rő. 2n1érté né2rü 2n1érz né2s1e2l né2s1ég nés3szer nész1ak nész1al né2sz1á né2szeg né2sz1e2l né2sz1emb né2sz1e2sz né2sz1ék né2szik né2sz1í nészkész1 né2szó né2sz1ö2 né2szu né2sz1ú né2szül né2t1eg 2n1é2tel né2t1es 2n1é2tet néti2 né2tir né2tö né1t2r néva2 név1ada név1adá né2vaj né2var né2vav né2v1ág 2n1évbú 2n1é2ve. 2névei 2n1é2vek néve2l né2v1ele név1elő 2né2vem 2névenk 2névent né2v1e2r né2ves név1esz 2né2vet 2névéb né2v1é2l né2v1éri né2vérő né2v1érz né2vis 2névny né2v1o né2vö né2vő né2v1u2 né2vú né2vün né2za néziu2m1i2 nfe2lemé n1f2la n1f2lo nfluor1e nfol2ta n1f2rak n1f2rá n1f2rek n1f2ri n1f2rí n1f2rö n1f2ru nfüs2t1ölé n2g1abl n2g1a2dat n2g1a2dá ng1a2dó n2gadó. n2gadóa n2gadób n2gadói n2gadój n2gadók n2gadór n2gadós n2gadót n2gadóv ng1akn n2g1akr n2g1akt nga2lag nga2lak nga2lap ng1alát ng1alel n2g1alg n2g1alj n2g1a2ny nga1p2 n2g1a2rán n2g1arc n2g1art n2g1arz n2g1asp ng1assz n2g1aszt nga1tr n2g1a2u n2g1ava nga2zon ngá2c n2g1á2g ng1állá ng1állo ng1álló n2g1áp ng1á2rak ng1áras ng1árat ngá2rát ngá2ráv ngá2ré n2g1árnya n2g1árta ngá2ruk n2g1á2rú n2g1á2szaib n2g1á2szair n2g1á2szait n2g1á2száv n2g1á2szé n2g1á2szi. n2g1á2szig n2g1á2szoké n2g1á2szos n2g1átá ng1átc n2g1á2t1e2 n2g1á2ti n2g1átk n2g1átl n2g1átm n2g1áts n2g1átv n2g1á2zój n2g1á2zós n2g1áztato ng1bl ng1br ng1d2r ng1edz ngegész1 n2g1ela nge2lis nge2r1a nge2rál nger1e2sz nger2im nge2ro n2g1esem n2g1eszk nge2tika n2g1ex n2g1é2g ngé2les n2g1épí n2g1érc ng1érl ng1é2rő. ng1érté ngé2sa n2g1éte ng1fr ng1g2r ng3gyi ng3gyo n2g1i2d ngi2g n2g1iga n2g1ige n2g1igé ng1i2ko n2g1ikr n2gill ngi2m ng1imi ng1inf n2g1ing ng1ins ng1iro n2g1izg ng1íg ng1ír ng1ív ng1íz ng1kl ng1kr ng1kv n1glec ngmeg1 n1g2nó n2g1of n2g1op ngora1 n2g1ord n2g1org n2g1ork ng1osto ng1oszt n2g1otth ngó2riá n2g1öb ng1önt ngö2r ng1örö ng1örv n2g1öv n2g1ö2z ng1őrö ngő2z1ős ng1pr ng1ps n1g2ram ng2rádih ng2rádj n1g2ráf ng2run ng1sh ng1sk ng1sp ng1tr n2g1ud n2g1ug n2g1uj n2g1und ng1u2ra n2g1uta n2g1új ng1útt n2g1üd n2g1ü2g ng1ür ng1üt n2g1üz ng1űr ngy1a2gya ngya2l1ó2 ngy1ass n2gy1á2l n2gy1em n2gy1es n2gyez n2gy1é2d ngy1éks ngy1ékt ngy1ér. n2gyid n2gyim n2gy1ut n2gy1ü2lő nha2b1i nhal1k2 nha2sábr nhá2z1alt nhá2zip nhá2zol nhá2zó nhá2z3s nhe2d3z nhe2i nhú2sá nhús3s 1ni ni2aa ni2aá ni2abo ni2ac ni2ad ni2ae ni2aé ni2afo nia1g2 ni2agy ni2ah ni2aí ni2aj ni2ala ni2alá ni2am ni2ao ni2aó ni2aö ni2aő ni2a1p ni2ar ni2asza ni2aszá nia1t2 ni2ato ni2atr nia3u ni2aü ni2av ni2az niát1a2 2n1i2bo ni1br ni2c1e2l ni2cha ni2c3he ni2c3hé ni2c3ho ni2de. 2n1i2deg 2n1i2dő ni2dü ni2et 2n1ifj 2n1i2gal 2nigaz. 2n1i2gá ni2ge. ni2géj 2n1i2gén ni2géz 2nigm 2n1ihl ni2keb ni2k1el ni2k1em ni2k1érté nikk2 ni1klu ni2konr 2n1ikrit. ni2kud n1ille 2nillu 2n1i2ly 2nimád n1i2máé 2n1imp 2n1i2na. ni2nas ni2n1áll 2nind 2n1info 2n1infú nin2gas nin2gá 2n1inge. 2ningei nin2g1e2l nin2g1ó2 nin1g2rá nin2gu 2n1ingük ni2n1i2p ni2nol 2n1inté 2n1i2onb ni2onc ni2onh ni2onj ni2onk 2n1i2onn 2n1i2ono 2n1i2onr 2n1i2ont ni2óa ni2ód ni2óe ni2óp ni2óta ni2ótá ni2óü nióvá2 nip2p1i ni1pr ni2rat 2nirá nirész1 2n1irg 2n1irh 2n1irk 2n1i2rod ni2rón ni2si. ni2s1in nisü2v nisz1ak ni2szeg ni2szeml ni2szese ni2sz1é2l ni2szip ni2szis nisz1okt nisz1ol 2n1iszon ni2szö ni2sz1ő ni2szu ni2t1a2d ni2t1ag ni2t1aj ni2tal nit1a2la ni2t1as 2n1i2tat nit1ell ni2t1ép ni2t1ér ni2tim ni2t1in ni2tir ni2tob nit1old nit1olt ni2t1osz ni2tür niu2m1i2o 2n1i2vad 2n1i2var 2n1i2vó ni2xa ni2xő ni2zén 2n1izg 2n1izmá n1izom ni2zsol 1ní ní2gé ní2ja ní2ju níli2a ní2ra2 2n1í2rá ní2r1é2 ní2r1ot 2n1í2ró ní2r1ú 2nítél nítőa2 ní2ve 2n1í2vi ní2ze ní2zű nk1a2dós nkai2k nk1ajt n2k1akk n2k1alv n2k1anó nka2nyá nkaó2 nka1p2l nk1app nka2ris nka1s2k nka1sp nka2tom nka1t2r nk1azo n2k1ág nk1árad nká2rál nká2rol nká2ruk nká2sad nká2sal nká2sav nkás3s nká2s3z nkáta2 n2k1átj n2k1átm n2k1áts n2k1átu nk1br nkci2ósű nk1dr nk1e2cse nk1e2dz nk1ela n2kellá n2k1eltá nke2r1a nk1ered n2k1e2rő n2k1e2ti n2k1e2vé n2k1é2l nké2p1el nké2p1és n2k1épí n2k1érc nk1é2szé nk1g2r nkia2 nkiá2 nk1i2ga n2k1igé n2k1imi nk1ind n2k1ing n2k1int n2kinz nk1i2on nki2s1i2 nk1ism nkká2 nk1k2r nk2lar n1k2ló n2k1ob nk1oke nkos3s n2k1oszl n2k1ox n2k1óné n2k1óni nkó1p2 n2k1ó2ri n2k1ö2lé n2k1ö2lő nk1öss nk1ötl nk1őrs nk1pl nk1pr nk2rac n1k2ris n1k2rí nk2roma nkron1n nk1sp nk1st nk1sz2 n2k1ud n2k1u2ra n2k1u2s nk1utal n2k1utá n2k1uz n2k1új n2k1ús n2k1üg nlac1 nla2pa nlap1e nla2p1osz nla2tal nla2t1a2n nla2t1e2 nla2t1é2te nlás3s nle2g1á nleí2 nle2t1o nletü2 nle2tüz nlé2tés nlé2t1é2ve. nme2g1a2 nme2g1é nműé2n nműt2 nna2ié nnak2 nna1kr nn1alv nna1p2ré nna1s2 nn1áll n2n1eml nne2p1a2 nne2se nn1ess nn1esz n2n1e2tet n2n1ett nn1evez nné2get nn1éri n2n1id nn1irt nn1ors nnőé2h nnőé2n nn1sy n2n1ug nn1ú2s n2n1ü2c nnü2l nn1ülő nn1ült nn1ülv n2ny n3nyak n3nyalá nny1a2n n3nyar nnyá2r nny1áz n3nydr nny1ell n3nyelő nny1elt nny1elvá nny1elvez nny1e2sett nny1e2sés nny1e2ső nny1ég nny1é2ké nny1é2ki nnyié2h nnyié2ne nnyi2g nny1igé n3nyjé nny1old nny1on nny1öz n3nyst 1no no1d2rá 2n1o2dú 2nog. 2nogh 2nogj 2nogn 2nogo 2nogs 2nogt 2nogv no2ir 2nokal nok1ala no2k1a2r no2kau no2k1ál no2k1é2l no2kép no2k1ing nok1ist nok1k2 2n1okke 2n1o2koz no2kö no2kő no1k2ro nok1s noksz2 no2kur no2kúr no2kü 2n1o2la nol1f2 2n1o2lim 2n1olló 2n1o2ly no2m1a2c nom1p nona2 no2n1al nonc3c non2ch nonc3sz no2n1e non1k2 no2nö no2nő non1s2 no1ny no2ok 2n1o2pe no1p2la no2r1al no2r1a2t no2raz no2r1el no2r1iv no2rí 2n1ormo 2n1orré nor1s2 no2rü 2n1orvo no2sál no2se nossz2 nos3sze nos3szf nos3szi no1s2tab nosza2u no1sz2f 2noszl no1t2r 2n1otth no1ty no2ui 2n1o2vi. no2xi 1nó nóa2k nóá2r nó2ce nó2ch nó2da. nó2d1a2n nó2dák nó2d1e2s nó2d1is nó1fl nó1fr nó1k2l nó2mac nó2m1em nó2mik nó2m1u2t nó2mü nó2nib nó2non nó1p2r n1ó2rac nó2r1ad n1ó2raf 2n1ó2rai nó2r1a2l n1ó2rar n1ó2ras n1ó2rat nórádi2 nó2rás nó2riá nó2rü nós1akk nó2seg nó1sl nó1s2p nó1s2rá nós3s nó1s2ta nó1sz2 nós3zene nós3zené nót1ala nó2til nó1trá nó2vó 1nö nö2ka nö2ká nö2k1el nöke2t nök1eti nö2k1é2j nö2k1ék nö2k1é2l nö2k1ér. nö2k1éri nö2k1érté nö2ko nö2kó nö2ku nö2kú n1ö2le n1ö2lé nö2lő n1öml 2n1ö2nö 2n1önz nö2rö 2n1össz 2n1ö2sz nö2te nö2té nö2ti n1ötl nöt1t2 nö2tü 2n1öv. n1övb n1ö2ve. nö2vön 2n1övr 2n1ö2zön 1nő nőa2l nőa2n nőá2g nő1br nő2ca nő2ch nő2csár nő2csős nő2csü nőe2r nőé2l nőfé2l1é2 nő1kl nő1pl nő1pr 2n1őr. 2n1ő2r1an 2n1őras 2n1őrb 2n1őrc 2n1ő2rei 2n1ő2réh 2n1ő2rén nő2rét. nő2rétő 2n1ő2rév 2n1őrg 2n1őrh 2n1ő2ri 2n1őrk 2n1őrl 2n1őrn 2n1ő2rö 2n1őrr n1őrs 2n1őrt 2n1őrü nő2rül nő2rün 2n1őrv 2n1őrz nő2s1a2l nő2s1e2l nő2ses nő2s1í2r nő2sok nő1spe nős3s nő1sz2t nő1t2r nőt2tin nőu2t nőü2l npa2dal npe2s npesz1 np2la np2lá np2le np2lé np2lo np2lü npon2t1a2 npo2r1a np2ra np2re np2ré np2ri np2ro np2ró np2sz npu2t1a npu2t1á2 npu2t1e2 npu2t1i nrefle2x1í2 nren2da n2s1a2d n2s1akc ns1alk ns1a2rá ns1ass n2s1au nsa2vár nsa2v1e2 nsa2vil nsa2vol n2s1a2z nság1g ns1áll n2s1á2rak ns1áta ns1átv ns2ch nsc3he. nsc3hei nsc3hé ns1dr ns1e2lé ns1elm ns1eln ns1elo ns1els ns1elv n2s1ene n2s1esz nsé2gel nsé2g1éj nségü2két n2s1ék n2s1é2l n2s1ép ns1é2ve. ns1fr n2s1i2d ns1imp ns1inf n2s1ing n2s1iró ns1isk nsi2z ns1izo n2s1í2r n2s1í2v n1s2kál ns1kl n2s1ob n2s1ol n2s1op ns1osz n2s1ott n2s1ó2r n2s1ös ns2pec ns1p2l ns2por n1s2rá ns1st ns1sy ns3szer ns3szi ns3szo ns3szö n1s2tab n1s2tác nste2i n1s2tim ns2top nsu2r ns1ura n2s1u2t ns1úr n2sz1a2d nsza2k1ü nsz1alk n2sz1a2n ns3zará n2sz1á2ba. ns3zárá nsz1á2ru n2sz1it n2sziz n2sz1omm nsz1p2 n2szut n2sz1ü2z nsz1z nt1abla n2t1abr nta2cél ntad2 nt1a2dó nt1a2ga. n2t1agg nta2gyu nta2gyú ntai2k n2t1ajk n2t1ajt n2t1akc n2t1aktá nt1alát nt1alel n2t1alf nt1anta nt1a2ra. nta2ran n2t1a2rá n2t1arc n2t1ark nta1s2p nt1assz n2t1aty nt1a2ura ntaü2 n2t1azo nt1ábr ntá2cs nt1ácsi nt1ácso ntá2r1a2d n2táram ntá2ráv nt1árny ntá2ruk n2t1ásó n2t1ásvá n2t1áti n2t1átl n2t1átr n2t1áts n2t1átv ntá2zsi nt1bl nt1br nt1dr nt1ebe n2tedén nt1edi nte3gá n2t1ela n2t1elb ntele2mé nt1elf n2t1eljá n2t1elk n2t1ellen n2telmél n2telnö n2t1e2lo nte2lőá n2t1elr n2t1elto n2t1elvá n2t1elz n2t1ember n2t1e2mel n2t1eml n2t1emu n2t1endr n2t1ent nte2rál nte2rele nte2r1in nter2v1e2l n2t1erz n2t1esth n2t1eszk n2t1eva nt1e2vet nt1e2vez nt1ég. nt1é2gé n2t1é2kek nté2kes nté2ké n2t1éks n2t1é2le n2t1é2lés n2t1élm n2t1élt nt1élű n2t1é2neke n2t1épü n2t1érin n2t1érmé n2t1érté n2t1érz ntés3s nté2ter n2t1é2ven n2t1é2vet n2t1é2véb n2t1é2vén n2t1é2vér n2t1é2vét nt1évh nt1évk nt1évt nt1fl nt1fr nt1gr nt2hon ntia2n ntia2t nt1ido n2t1ige nti1k2l ntil2lát. n2t1ille n2t1imp n2t1info n2t1ing. n2t1inga nti1nk. n2t1inté ntió1 nti2par n2t1irá n2t1iro n2t1isk n2t1ism n2t1iste nti2vás nt1izo n2t1íg n2t1íj nt1írá n2t1ívb n2t1í2z nt1kl nt1kr n2t1of ntoka2 n2t1o2k1al n2t1okl n2t1olda n2t1oldó n2t1o2ly nto2m1e2 nt1opc nto2ras nto2rék nto2rin nt1ormá nt1orro n2t1oszl n2t1oszt n2t1otth ntó1p n2t1ó2rá n2t1ó2ri ntót2 ntó1tr nt1ökl nt1ö2kö nt1ö2lő nt1önt n2t1örd ntőa2 ntőé2n nt1őrb nt1őrl nt1őrn n2t1őz nt1pl nt1pr nt2rans ntransz1 ntranszk2 n1t2réf n1t2róf nt1ry nt1sh nt1sk nt1sp nt1st ntsz2 ntszá2m1é nt1szv nt1t2r n2t1udv n2t1ug n2t1uj ntu2mor ntu2n n2t1una nt1und ntun1i nt1u2rá ntu2sza nt1utá n2t1úg n2t1új ntú2ral ntú2ran nt1ú2sz n2t1üg n2t1ü2lő nt1ült n2t1üt n2t1ü2v n2ty1a2l n2ty1a2n n2tyál n2ty1e2l n2ty1él n2ty1ik n2ty1int n2ty1iv n2tyí n2ty1ő2r n2tyut 1nu n1ucc nu2ga nu2go 2n1ujj nu1k2la nu1klu nu2mü 2n1und 2n1u2ni 2n1u2no 2n1unt nu2ram nu2rá nu2sal nu2sas nu2s1av nu2s1e nu2s1érté nu2sik nu2sol nu1s2po nuss2 nus3szi nu2szab nu2s3zav nu2szir nu2szí nu2sz1ol nu2tal nu2tat nu2taz nu2tál nu2te 1nú n1újd nú2jí 2n1újs núkész1 nú1pr 2n1úr. 2n1úrb 2n1úrh 2n1úrn 2n1úrr 2n1úrt 2n1ú2szá 2nútb 2núth 2nútj 2n1útk 2n1útn 2nútr 2n1úts 2nútt 2n1útv 1nü nü1bl 2n1ü2dí 2n1üdv nü1fr 2n1ügg nü1gr 2n1ügy. 2n1ügyb 2n1ügyc 2n1ü2gye. 2n1ü2gyei 2n1ü2gyek 2n1ü2gyes 2n1ü2gyet 2n1ü2gyé nügy1és 2n1ügyh 2n1ü2gyi 2n1ügyk 2n1ügyl 2n1ügyn 2n1ügyr 2n1üld nü1pr nü2rí nüst2 nü1str 2n1ü2tem nü2tés nü2ti nü2tő. nü2tők nü2tős nü2tü nü2vö nü2zé 2n1üzl 1nű nű2zé nű2ző nva2su nvágya2d nvá2gy1ada nvá2gy1ón nvá2r1al n2v1át nven2ta nvé2d1a nvé2d1ő2r nv1ind nvona2l1út n2v1os nv1sk nx1ar n2y 1nya 2ny1abl 2ny1abr nya2cél 2ny1adag 2nyadás 2nyadó nya2dóz 2nyaff nya2gar 2nyagáh 2nyagár 2nyagáv 2nyagc nya2gen 2nyagi 2nyagj 2nyagm 2nyagos 2nyagta 2nyaguk 2nyagú 2nyaján 2nyajk 2nyajt 3nyak. nya2k1ala nya2kara 2nyakc nya2kel nya2k1é2k nya2kiz 2nyakt. 2nyaktá 2nyaktb 2nyakti 2nyaktj 2nyakto 2nyaktu 2ny1a2lag 2ny1a2lak. 2nyalakj 2nyalakk 2ny1a2lakr 2nyalany nya2lapb nya2laph nya2lapo nya2lapp nya2laps 2ny1alász 2ny1alb ny1alép 2ny1alm ny1alte 2nyaltú 2nyamal 2nyanal 2nyang 2ny1ant 2nyaot ny1a2pad nya2pát 2nyapp nya2rén 2ny1arma 2ny1arz nya1sp 2nyassz 2nyaszt 2nyatká nya1trá 2nyaty 2nyauk 2nyavat 1nyá 2nyábr 2nyádná 2nyádt 2nyáék 2ny1ág 2nyáld 2nyállí nyá2lom 2nyámék 2nyámná 2nyáp 2ny1á2rad 2ny1á2rai 2ny1á2rak 2ny1á2ram 2nyáras 2ny1á2rat nyá2ráb nyá2rán nyá2rát nyá2ráv 2nyárc 2nyáre 2nyárh 2ny1árj 2nyárk 2nyárp 3nyárt. 2nyá2ru 2nyárú 2nyárv 2nyásó nyá2szak nyá2szár 2nyáta 2nyátá 2nyáté 2nyátf 2nyáth 2nyátk 2nyátm 2nyátn 2nyátö 2nyátr 2nyáts 2nyátt 2nyátü 2nyátv ny1bl ny1br ny1cv 1nydre. 1nye 2nyedén 2nyedzé 2nyeff 2nyegyl 2nyegys 2nyeke. 2nyekei 2nyekéé 2ny1elb 2nyelc 2nyelef 2nyelemz 2ny1elf ny1elha 2nyeljá ny1elk 2ny1ellá ny1elma 2nyelnö 2nyelőí 2ny1e2lőő 2nyelőz 2ny1elr 2nyelső 2ny1eltá 2nyeltér 2nyelto 2ny1elül nyel2vesz 2nyelvev 2nyember 2nyembl 2nyembr 2nyemel 2ny1emit 2ny1eml 2nyenc 2nyene 2ny1eng nye1p 2nyerdő 2nyerej nye2rekl 2ny1erk 2nyerny 2nyerőm 2ny1esemé ny1eser 2nyeseté 2nyesél 2nyestj 2nyeszk 2nyetik 2nyeve nye2vez 2nyevé 2nyevo 2nyevő 2ny1ex 2nyezr 2nyezüs 1nyé 2ny1ébr 2nyéhen 2nyéhes 2nyéhs ny1é2jek 2nyélet 2nyélm 2nyéneke 2ny1é2neké 2ny1é2nekn 2ny1ép 2nyérc. 2nyérem. nyé2r1e2s 2nyérin 2nyérő. 2nyérői 2nyérőt 2nyérték nyérü2 2nyérv. 2nyérzé 2nyétel 2nyétke 2nyétl 2nyév. 2nyévb 2nyéve. 2nyévei 2nyévek 2nyévem 2nyéven 2nyéves 2nyévet 2nyévez 2nyévéb 2nyévér 2nyévét 2nyévév 2nyévf 2nyévi 2nyévk 2nyévm 2nyévn 2nyévr 2nyévs 2nyévt 2nyévü 2nyévű 2nyévv ny1fl ny1f2r ny1gl ny1gr 1nyi 2nyibo 2nyideg 2nyidej 2nyidő nyié2b 2nyifjú. 2nyifjúb 2nyifjúé 2nyifjúi 2nyifjúké 2nyifjún 2nyifjúr 2nyifjús 2nyifjút 2nyifjúv 2nyiga 2nyiha 2nyihl 2ny1ill 2ny1ima 2nyimá 2ny1imb 2nyimp 2nyinas 2nyinc 2nyind 2nyinf ny1ing. 2nyinj 2nyins 2ny1int 2nyinv 2ny1i2p 2nyirá 2nyiri 2nyirod 2nyirt 2nyisko 2nyism 2nyisp 2nyist 2nyivad 2nyivás 2nyivó 2ny1izn 2ny1izt 1nyí 2ny1íg 2ny1íj 3nyíl 2ny1ín 2ny1ív 2ny1íz 1nyjéb 3nyk. nykar1óra 1nyket. 1nykk ny1kl 1nykn ny1k2r ny1k2v 1nym. 1nymet. 1nymt 1nyn. 1nyo 2ny1ob 2nyodú 2ny1of 2ny1okke 2ny1okl 2nyokos 2nyokoz 2nyokta 2ny1o2laj nyolc1c 2ny1olda 2nyoldá 2nyoldó ny1olló 2ny1oltár 2nyoltás 2nyolvas 3nyom. 3nyomat. 3nyomatk 3nyomatom 3nyomo 3nyomt 2ny1op ny1orc ny1orm ny1ors ny1orv 2ny1osko 2nyosto 2nyoszl 2nyoszt 2ny1ott 2ny1ov 2ny1ox 1nyó ny1ó2ni nyó2rác nyó2rán 2nyóri nyó2s1ü 1nyö 2ny1öb 2ny1öc 2ny1ö2l ny1önt 2ny1öv 1nyő 2nyőrs ny1pl ny1pr ny1ps 3nys. ny1sc 3nysek ny1sh ny1sk ny1sl ny1sp nys2t 1nyst. ny1sta ny1stá 1nyu 2nyud 2nyuj 2nyuká 2ny1ukrá 3nyul 2nyuni 2nyuno ny1urá 2nyut ny1u2ta ny1u2tá 1nyú 2nyújd 2nyújé 2nyújí 2nyújs 3nyúl nyú2lő 2ny1úr. 2nyúrb 2ny1úrh 2nyúri 2nyúrk 2ny1úrn 2ny1ú2ro 2nyúrr 2ny1ú2sz 2nyútb 2ny1úté 2nyúth 2ny1úti 2nyútj 2nyútk ny1útl 2nyútm 2nyútn 2nyútp 2nyútr 2nyútt 2nyútv 1nyü 2ny1üd 2ny1ü2g 2ny1üld ny1üle 2nyünn 2ny1ür 2ny1üt 2nyüze 1nyű 2ny1űr. 2nyűrb 2ny1űré 2ny1űrh 2ny1ű2ri 2ny1űrj 2ny1űrl 2ny1űrn 2ny1ű2rö 2nyűrr 2ny1űrt 2ny1ű2zé 2ny1ű2ző. 2nyűzőb 2nyűzően 2nyűzőé 2nyűzőh 2nyűzők 2nyűzőn 2nyűzőr 2nyűzőt 2nyűzőv ny2vék ny2v1isk ny2vó ny2vös ny2vő ny2vú nyzé2ke nza2c n2z1acé nz1adá nz1ado nz1adó nz1a2ga nz1agg nz1ajta nz1akc nz1akk nzak2o n2z1akt nz1ald n2z1alk nz1ang n2z1a2ny nz1app nz1ara nz1ará nz1arc nz1ari nz1aut nz1á2gy nz1áll n2z1á2rad nz1árny nzá2r1ó2ra n2z1á2ru nzá2s1e2 nz1ásó nzás3s nz1át1a2 nz1d2r n2z1e2g n2z1elb n2ze2leme n2z1e2lér n2z1elf n2z1elha n2z1elis n2z1elk n2z1ellá nz1ellen n2z1elm n2z1elny n2z1elo n2z1e2lőá n2z1e2lől n2z1e2lőt n2zelőz n2z1els n2z1elta n2z1eltü n2z1elver n2z1elvé n2z1elvo nz1ember n2z1e2mel nz1e2més n2z1emi nz1eml n2zener nz1erő nzer2t1a2 nzer2v1a2d nzervé2t nzer2v1éte nzer2vi nze2su nz1eszk n2z1ez n2z1ég nzé2k1el n2z1é2l n2z1ér. n2z1érd n2z1é2rem n2z1érk n2z1érm n2z1érté n2z1érv n2z1érz nz1étv nz1gr nzi2a n2z1i2ga n2z1igé n2z1ill nzi2m1a2 nzi2má nzi2mi nzi2n1á2 nzi2n1o nzi2n1ó2 n2z1i2p nz1irá nz1ism n2z1ist nzi2tár nzite2 nzi2t1el nzi2ten nzi2t1í2ve. n2z1íb nz1íg nz1ín nz1kl nz1kr n2z1okl nzo2lin nzo2ló nzo2n1a nzo2né nzo2rin n2z1osz nzókész1 n2z1ön nzö2r nz1örö n2z1ös n2z1ö2v n2z1öz nz1pl nz1pr nz3saj n2z3sár n2z3sát n2zsáv nz3seg n2z3ser nz3sik n2z3sis n2z3sod nz3sor n2z3só nz3s2p nz3s2t nz3sz nztá2r1a2d nz1t2r n2z1uj nzu2l1a nzu2mé nz1u2ra nzu2san nzus3s n2z1u2t nz1új nz1ú2t n2z1üd n2z1ü2g nz1üs nz1üv n2z1ü2z nz3zs 2o. o1a oa2cé oa1fr o2aki o2a1k2v o2ami oa2nali o2asi o2aszó o1á oá2ga oá2r1a2n oá2ril oá2rí oá2r1ol oá2zs oba1b2 oba1d2 o2b1alj obal2t1a2 oba1p ob1a2ra obau2 obás3s ob1átm ob2b1eg ob2bö o2b1eg ob1ele o2b1e2m o2b1erő o2b1ez o2b1é2g o2b1érz obi2ki obi2k1ó2 obi2lin obi2lip obina2 ob1ina. obi2n1al o2b1ing o2b1i2s ob1ív 1objek ob1kl 1o2boa o2b1oll obo2r1a obo2rin obo2r1os obo2t1á2 obo2tin obókész1 o2b1ó2né ob1ó2rá ob1öt ob1pr 1obst o2b1ut o2b1ú2s ob1üg ob1ür ob1üt ob1űr oca2ké o2c1ág o2c1ál oc1er oc1é2k o2c3hi. oc3hok oc3hot oci3a ocie2 oci1k2r oció2 oci1p oci1sz2 o1c2kef oc2k1é2l ocké2n ock1éne o1c2kér o1c2két o1c2ki. oc2kia o1c2kig o1c2kin o1c2kit o1c2kiv oc2kop o1c2kosn o1c2koso o1c2kosr o1c2koss oc1pr o2c3sap o2cs1ál ocsá2s o2cs1ász o2cs1á2z o2cs1e2 oc3sér ocsié2ra o2cs1ing ocs1izm o2csí2 oc3sín o2csop ocs1s ocs1t o2csuj o2cs1ü2 oc3sza ocs3zá oc3sze oc3zs o2daad oda1b2 o2d1adj oda1dr o2d1akk o2d1alj oda1p2 odas2 o2d1ass od1aszt odat2 oda1tr od1autó odáb2 od1állá o2dáru odáskész1 odás3s odá2s3z 1o2dáz od1ed ode2l odel2l1a ode2min od1e2v o2d1é2g od1é2ne o2d1ép o2d1érd o2d1é2te o2d1é2ve od1é2vé 2odéz od1ide odi2g o2d1iga o2d1ikre odi2l1e odi2lid odi2lik odi2l1is o2d1int o2d1iro od1isp od1í2z od1kl od1obo o2d1okt o2d1op odo2rak odo2rosz od1ö2l od1ö2r od1ő2r od1pr o1d2ram o1d2ráma od1st odu2l1a2l o2d1u2r 1odún od1üg od1ün od1üz 1odváb od3ze od3zo o1e oe2ir oe2le oe2mu oe2ne oe1t2he oe2ur oe2uv o1é o2éfa o2éfá o2éfo o2éke o2éki oéna2 oé2n1al oé2n1an oé2n1ar oéná2 oé2n1ár oé2nis o2ész o2évi ofi2lad ofi2lak ofi2l1á ofi2lel ofi2lér ofili2 ofi2l1iga ofi2l1igá ofi2lis ofi2l1osz ofi2tal ofi2t1e2 of2la of2ló ofona2 ofo2n1al ofo2nan ofo2n1á ofo2n1ér. ofon3n ofo2n1ó2 ofor2m1á2 ofő2r1e ofőrü2 of2rí og1abr o2g1a2g oga2kar o2g1aká o2g1a2la o2g1a2lá o2g1alj og1all og1alt og1alu o2g1a2ny o2g1ap o2g1a2ran og1arc o2g1a2sz oga2t1a2g oga2t1e2 oga2t1i2n og1a2ty 2ogaz o2g1á2g og1áll og1álm o2g1áp o2g1á2rak o2g1áre o2g1árja o2g1árját o2g1á2rok ogá2ros o2g1á2ru ogáskész1 o2gásó o2g1áta o2g1áte o2g1átj o2g1átk o2g1átl o2g1átn o2g1á2to o2g1átr o2g1áts o2g1átt og1átü o2g1átv og1bl ogdí2j1a2d og1dr o2g1e2d o2g1e2g ogegész1 o2g1e2l o2g1em o2g1e2p oge2r og1ere og1ern og1erő oge2s o2g1ese o2g1e2v o2g1ez o2g1é2g o2g1é2l ogén1n o2g1é2p o2g1ér. og1érte og1érté o2g1értő o2g1érv o2g1és og1fl og1fr og1g2l o2g1ic o2g1i2d o2g1if ogi2g o2g1iga o2g1igé o2gill og1inf o2g1ing og1ins o2g1int o2g1ip og1i2ro og1ita o2g1íj og1ín og1ír og1ív og1kl og1kr o1g2lic o1g2nai o2g1odv og1org og1orr og1orz o2g1oszl o2g1oszt o2g1o2v og1ö2b og1ö2l og1ö2r og1ös og1ő2r og1pl og1pr 2ografi 2ograp 2ográf. 2ográff o1g2ráffa o1g2ráfh o1g2ráfj o1g2ráfr o1g2rál og1sk og1sp og1s2t og1tr og1u2ra og1u2ru o2g1u2s o2g1u2t o2g1új og1ü2g og1ül og1ür og1üt og1üz og1űz ogy1a2c ogy1a2p ogy1is. ogy1os ogyóé2 oha2mal oha2mel oha2mes oha2mis ohas2 oha1sp o2h1ág o2h1ál ohá2nyad ohá2nyan ohá2r1e ohá2szi ohá2sz1odv o2h1á2z oh1e2c oh1ing oh2ni o2h1orr ohó2csi oh1órá oh1ö2v oh1urá o1i oi2ae oi2af oi2an oi2av oi2ába oida1 oi2d1ad oi2dan oi2dál oi2d1e2 oi2dol oi2d3z oilet2 oina2 oi2n1ad oi2ne oi2re oisel2 oi2zo o1í ojá2r1as ojás3s ojás3z ojek2t1á2 ojek2t1í2 ojek2t1o2 oj1in oj2t1ára oj2t1orják ojtóá2 ok1abl ok1a2cé o2k1a2dat o2k1a2dá o2k1a2dó o2k1a2kar ok1akv o2k1alj o2k1alk ok1alm ok1alt ok1ang ok1ani ok1ant oka1p2l ok1app ok1a2ra ok1arc oka2ris o2k1asp o2k1ass ok1aszf ok1aszt o2k1att o2k1aty oka2u ok1aut o2k1ava o2k1ág ok1ájt ok1árad o2k1á2rak oká2rul o2k1árv oká2sal ok1ásó okás3s ok1ász o2k1áte ok1bl ok1br ok1dr o2ke. ok1e2b o2k1e2c oke2d ok1edé o2k1e2g o2k1e2l o2k1e2m ok1eré ok1erk ok1ernel. ok1e2rő o2ke2s ok1esé o2k1e2v ok1e2z o2k1ég ok1é2ke ok1é2ké o2k1él. ok1é2les ok1é2let ok1é2lé ok1éln ok1élt o2k1é2ne oké2p oké3pá ok1épí o2k1épü o2k1ér. o2k1érb o2k1érc o2k1érd o2k1érg o2k1érh o2k1é2ri o2k1érm o2k1érr ok1értá o2k1érte o2k1érté ok1értö o2k1érz oké1s2 okész2 o2k1étk o2k1étt o2k1é2ve ok1fl ok1fr ok1gr o2k1i2de o2k1i2do ok1i2ga okigaz1 ok1igá o2k1igé ok1ind o2k1int o2k1i2rá o2k1i2ro o2k1isk ok1ism o2k1isp ok1iste o2k1i2ta o2k1izm ok1íj ok1ír ok1ív ok1íz ok2kab ok2k1a2d ok2k1aj ok2k1ale okk1alk ok2k1as ok2kaz okk1elh okk1elö okk1elő okk1elr 1okkeré ok2k1es ok2képü ok2kid ok1kló ok2kob okk1öss okk1ö2vű ok1kri ok2kud ok2k1ur o1k2lí ok2lor o2k1ob okola2 oko2lár o2k1oltás okon1n oko2n1oks oko2ra oko2r1á oko2ril oko2ris o2k1ormú ok1o2ro o2k1osz ok1o2varia o2k1o2vi o2k1öb o2k1ö2d ok1ö2k o2k1öl o2k1ön okö2r o2k1ös o2k1ö2v ok1ö2z ok1ő2r ok1pl ok1pr o1k2ris o1k2róm ok2sel ok1sp oksz1alm ok2szan ok2sz1es ok2sz1is 1oktán o2k1ud o2k1ug o2k1uj ok1u2ra o2k1u2t ok1úr. ok1úrb ok1úrh ok1úrr ok1úsz o2k1útb o2k1úth o2k1ú2ti o2k1útj o2k1útk o2k1útn o2k1útr o2k1útt ok1útu o2kútv ok1üg ok1ü2l ok1ün ok1ür ok1ü2t ok1ü2v ok1üz ok1űz o3la. ol1abl ola1d2 ola1f2 1o2laj. 1o2lajb 1o2lajf 1o2lajg 1o2lajh 1o2laji 1o2lajj 1o2lajk 1o2lajm 1o2lajn 1o2lajp 1o2lajr 1o2lajs o2lajt o2laju 1o2lajú o2lajv ola1k2r o2l1alg ol1alk ol1amn ol1anya ola1p2 ola1s2p ola1s2t ola2t1ala olat1any ola2tál ola2táp ola2ték ola2t1inf ola2t1í2v ola2t1ol ola2t1orn ola2t1öl ola2tüz olau2r ol1ábrá o2l1á2g olá2ha ol1áll o2l1árb o2l1árh o2l1á2ria olá2riá o2l1árk o2l1árn olá2rok olá2ron o2l1árr o2l1árt o2l1á2ru olá2sza o2l1á2ti o2l1átv ol2caj ol2cal olca2n olc1any ol2c1e2k ol2cel ol2ces ol2c1év ol2c3h olc1iko ol2cí ol2có ol2cö ol2c3sor ol2csű olc3sz ol2cü ol2cz ol2dab 1oldal. 1oldalá 1oldalb olda2le 1oldalh 1oldalk 1oldall 1oldaln 1oldalo 1oldalr 1oldalt 1oldalu 1oldalú ol2d1any ol2dap olda2tel ol2d1au ol2dál ol2deg ol2d1elé ol2d1ell ol2d1elv old1emb ol2d1e2r ol2d1e2s ol2dev ol2dez ol2dés ol2d1éve ol2dip ol2d1is ol2dor 1oldós ol2d1ö2 ol2dud ol2d1u2g ol2d1ü ol2dű ol1e2g o2l1e2l o2l1é2d o2l1é2g o2l1él ol1ér. ol1érd ol1é2re ol1éré ol1érh ol1é2ri ol1érj ol1érl ol1érn ol1érő ol1érs o2l1érté ol1é2rü ol1érv o2l1érz olfa2k ol2fau ol2f1ár ol2fes ol2fet olf1ing ol2fir ol2fis olfu2 ol2f1ut ol2fúj ol1gl ol1g2r 2olib o2l1i2du 1o2liga oli2gáz o2l1igé ol1ill ol1i2ma. o2l1i2má 1olimp oli2nu o2l1i2pa olipe2 oli2p1et o2l1isk oli2szál ol1ív. oll1a2gy ol2l1aj olla2l ol2l1ala ol2l1alj ollan2d1ó2 oll1any ol2l1atk oll1att ol2l1á2g ol2l1e2c oll1ege oll1egé ol2l1e2gy ol2l1e2h olle2l oll1ele ol2l1emb oll1ese ol2l1é2k ol2l1éri ol2l1inf oll1inge oll1ingé oll1ingi oll1ingj oll1ingn oll1ingr oll1inj ol2lins ol2l1int oll1isk ol2lob ol2lor ol2l1osz ol2l1ö ol2l1ő2 oll1s ol2lub ol2lul ol2l1u2s ol2lü ol3lyu oln1ike o2l1o2l o2l1op olo2r1e ol1ott o2l1ox olóe3dénn oló1f2 o2l1ó2né ol1ónn ol1ó2no ol1ónr ol1ónt oló2rái oló2ráj oló2rák oló2rán oló2rár oló2rát ol1ó2ri olót2 oló1tr ol1ö2l ol1ör ol1ös ol1p2l ol1p2r ol1sk ol2t1aj 1oltalm 1oltalo ol2t1ari ol2t1ág ol2t1áta ol2t1eg ol2t1em olte2r ol2t1ere olte2s ol2t1e2v ol2t1ép ol2t1ér. ol2t1érr ol2t1és ol2tid ol2tim ol2tis ol2tiz ol2t1old 1oltóé 1oltóh 1oltóké 1oltólo 1oltóm 1oltón oltö2r ol2t1őr ol2tür o2l1ug o2l1ur o2l1u2tá ol1ús ol1üg ol1ül ol1üv ol1üz 1olvad 1olvas o2lyabr oly1ada oly1aggy olyame2 olya2mes oly1aszt o2lyál o2ly1e2 1o2lyéb 1o2lyéh 1o2lyéi o2lyél 1o2lyén. 1o2lyiér o2lyim 2olyó o2ly1ö o2lyő o2lyug o2ly1ü2 o2ly1ű2 o2m1abl om1a2dat o2m1adm o2m1a2dó o2m1adt oma1f omaga2 oma2ga. oma2g1ad oma2gal oma2g1á2 oma2ge omagi2 oma2g1in o2m1a2gya om1agyú o2m1ajá o2m1ajk oma1kré o2m1akt om1a2lag oma2lapo oma2lapr o2m1alm om1alt om1alv o2m1amb om1ang o2m1ann om1apad o2m1app oma1pr o2m1a2ra o2m1arc o2m1arg oma2t1árak o2m1atká o2m1aty o2m1au om1a2zo omá2cs omá2g om1ági om1ágo omá2nyan ományká2 o2m1áp o2m1á2rai om1á2rak om1á2ram om1áras o2m1á2rá o2m1árd o2m1áre omá2ré. omá2rét o2m1árg omá2ria omá2riá o2m1árm o2m1á2ru omá2sí omás3s omá2sz omás3zó o2m1á2t1e om1á2t1é o2m1átk o2m1átm om1átol o2m1átr om2b1a2lo om2bág om2b1eg omb1elh om2b1elt omb1éne om2b1éri omb1ón. ombó2r omb1óra om1bro om2buj omdio2 om1dr o2m1e2b o2m1e2ce o2m1e2dé om1ef ome2g ome3gá om1ege om1egé o2m1egy ome2l o2m1ela om1elá om1elb o2m1ele o2m1elé om1elk om1ellá o2m1elm o2m1eln o2m1elo o2m1elő o2m1els om1elte o2m1elu o2m1elv o2m1e2m om1ene om1eng om1eny om1enz ome2o o2mep om1erd o2m1e2red o2m1e2rei o2m1erny om1e2ro ome2rő o2m1erő. o2m1erőb o2m1erőh o2m1erőn o2m1erőr om1erősí omer1őss o2m1erőt o2m1erőv om1e2rű ome2s om1ese om1esé om1ess om1est o2m1e2ti o2m1etn o2m1etű o2m1e2v o2m1ex ome2z o2m1eze o2m1ezred o2m1ébe om1é2de o2m1ég o2m1é2he o2méhs om1éje o2m1é2ke o2m1é2le om1élé om1é2lő o2m1ép o2m1ér. o2m1érb o2m1érc o2m1é2re o2m1é2ré omé2ri. o2m1érm o2m1é2rő o2m1érr o2m1érte o2m1érté o2m1értő o2m1érv o2m1é2s omé2tel o2m1étt o2m1éve om1évé om1f2l om1gl om1gr om1ide omid1i2 om1i2dő omi2g o2m1iga o2m1igé om1iks o2m1ill om1imá omime2 omi2mel omi2m1é om1i2na. omi2náb omi2náv o2m1ind om1inf o2m1ing om1inv o2m1i2ono o2m1i2p o2m1irá o2m1i2ri o2m1iro o2m1irt o2m1isk o2m1ism o2m1iste omi2sz1á om1i2tal omi2tan omi2t1ás omi2t1e omi2tis om1izé om1izo om1izz om1íj o2m1ír om1í2v om1í2z omjó2 om2jő omká2rok. om1kl om1kr omlá2b1út omo2dor omo2kas 2omoly o2m1ont om1ope omo2ras omo2re omo2riz o2m1orjá om1osto omosz2f o2m1oszt o2m1ox om1ök om1ö2l om1ön om1ö2r om1ös om1ö2t om1öv om1ö2z om1ő2r om1ő2s om2pel om1pla om2p1ors om2pő om2p1u2tá om1sk om1sl om1sp om1st om2te. omtes2s om1t2r o2m1ud o2m1ug o2m1uj omu2n o2m1uno o2m1ur o2m1u2t o2m1u2z o2m1új om1üd om1üg om1ü2l om1ür om1üs om1üt om1üv om1üz om1űr om1űz om1ya o2n1abl ona2cél ona2dat ona1dr on1ads onae2 on1agg on1agi on1agó on1agyh on1ajn o2n1ajt 2onak on1akc o2n1akk on1akn o2n1akt ona2len ona2l1e2s ona2lint on1alj. on1alju ona2lok ona2los 1onani o2n1a2no o2n1ant on1app ona1pr ona1ps ona2rác onarádi2 ona1s2p ona2tál onatü2 ona2tüz on1ábr 2onác o2n1ág o2n1állo o2n1állv o2n1á2p on1árad o2n1á2rak on1á2rat on1árb o2n1árk o2n1árn o2n1á2ro o2n1árt o2n1á2ru o2n1á2rú on1árv o2n1á2sza o2n1á2szokr o2n1átál oná2tás o2n1átc o2n1áte oná2t1ér o2n1átf o2n1áthe o2n1átm o2n1átre on1bl on1br on2cal on2c1ál on2c1e2g once2s on2c1ez on2c1ék on2c1ér. on2c1éré on2che on2cid on2c1ikr onc1ill on2cös onc3ság on2cseg oncs1emb oncs1ég on2cs1ér. onc3sikk on2cs1im on2cú on2cü on2de. ond1iko on2d1o2kos ond1oksá on2d1osz 2ondoz on2d1öl on1e2b o2n1e2d on1e2ge on1egg o2n1e2gy on1e2h one2l o2n1ela o2n1ele on1el1é o2n1elh on1elj o2n1elm o2n1eln o2n1elo on1elő o2n1elr on1els on1elt o2n1elv o2n1e2m one2n on1ene on1erj on1erk on1ers one2s o2n1ese ones2s on1est o2n1e2v o2n1ex 2onéb oné2d on1éde o2n1é2g o2n1é2he on1é2ke on1éks o2n1é2l on1é2ne o2n1é2p o2n1érbe o2n1érc o2nérd o2n1éri o2n1érl o2n1érm o2n1érp o2n1érs o2n1érte o2n1érv o2n1év. o2névad o2n1évb o2n1é2ve on1é2vi o2n1évk o2n1évn on1évr on2g1áll ongás1s on2g1e2c on2ged on2g1eg on2g1e2l on2gik on1g2ló on2gü on2gyad on2győ onháro2 onhárom1 o2n1i2d oni2g o2n1iga o2n1ige o2n1igé o2n1ij on1i2ke o2n1ill o2n1inb on1ind o2n1inf o2n1ing o2n1inj o2n1inn o2n1inr o2n1ins o2n1int o2n1i2p on1i2rá o2n1iro o2n1irt o2n1isk o2n1ism on1iste onita2 o2n1i2zé on1izo o2n1izz on1íg o2n1ín o2n1ív on1íz onk1áll onká2rok. onké2t1 on2ne. on3nyár on3nye on3nyo on3nyú on3nyü o2n1ob ono1g2ráf. ono1g2ráfn onoka2 on1o2kal on1o2kos o2n1okta o2n1old on1oll on1opt on1oszl ono1sztr o2n1o2v o2n1ox o2n1óri onó2sak onó2si onó2szen on1öb on1öl on1ön on1ör on1ös on1ö2t on1ö2v on1ö2z on1ő2s on1pl on1pr on1ps 2ons. onsa2v1a2m on1s2k on1sl on1s2m on1spe on1spo on1spr on1sr on1sto onsz2 on1szf on1szt ont1agy on2t1aj on2t1alk on2t1ara on2t1atr on2taz on2t1áll ont1árv on2teb on2t1ed on2t1e2g ont1elá ont1eld ont1elh ont1ell ont1elm on2teln on2t1elő ont1elt ont1elv ont1emb onte2s on2t1ese ont1éké on2tél on2tigé on2t1i2ko ont1ikr on2t1i2m on2t1inf on2t1int onti2sz ont1iszo on2t1iz on2t1í2v on2t1oml on2t1ors ont1óni 1ontóst on2t1ös on2t1öz on2tül on2tür on2t1üz on2tye o2n1ud o2n1ug o2n1uj onu2n o2n1una o2n1u2r o2n1u2t o2n1új o2n1ú2s onú2t on1útb on1úté on1úth on1úti on1útj on1úto on1útr on1útt on1ü2c o2n1ü2g on1ü2l o2n1ün o2n1ür o2n1ü2t on1ü2v o2n1ü2z on1űr on1űz o2ny1acé ony1a2dó ony1akc ony1alj o2ny1alk ony1alt ony1anya onya1p2 o2ny1apó o2ny1ál ony1árk o2ny1árn ony1ázó ony1e2c ony1e2g o2ny1e2l o2ny1e2m o2nyen o2ny1e2r ony1e2s o2ny1ég o2ny1é2j o2ny1é2k o2ny1él o2ny1é2ne o2ny1ér. o2nyéré onygóc1 o2nyigé ony1iko ony1ing o2nyita o2nyitók o2ny1í2r ony1old ony1oml o2ny1o2r o2nyosz ony1ó2r o2ny1ö o2ny1ő2 o2nyug o2ny1ur o2ny1ü2 onz1abl on2zag onz1ajtó on2zar on2zág on2z1á2l on2z1ed on2z1e2l on2z1e2m on2z1es on2z1ék on2z1ére on2z1im onz1ing onz3sel on2zü o1o oo2ib oo2in oo2pe oo2re oo2xi o1ó o1ö o1ő o2p1a2b o2p1a2d o2pal op1a2la o2p1any op1a2po op1a2r opa2u o2p1a2z o2pál o2p1ám o2p1á2rat opáskész1 o2p1áth o2p1átl o2p1átm op1bl op1e2dé op1e2g op1ejt op1elő op1em opera1s operasz2 op1erd op1erk op1erő op1es op1e2t o2p1é2l o2p1é2n op1gr op1i2ko op1ikr o2p1im op1ind o2p1ing o2p1i2p o2piram o2p1i2rá op1isi op1ist o2p1i2ta opi2z op1izo op1izz op1ív op1kl op1kr o2p1ob 2opol o2p1orj o2p1orr opor2t1a2 opor2t1á2 opor2t1e2 opor2t1érd opor2tö o2p1orzó oposz2f o2p1ov op1ös op2pé op2p1is op1py 2opro op2roc op2rod op1sl op1sp op1sr op1s2t o2p1ud o2p1u2r o2p1u2t op1új o2p1ús op1üd op1üg op1üt op1üz o2r1abl o2r1abr ora2dat o2r1a2dá or1adm o2r1a2dó or1aff or1agg or1a2gó ora2kad ora2kas o2r1akc ora1kl ora2kol o2r1akt or1alg o2r1alj or1alk o2r1alm o2r1alt o2r1alv or1amp o2r1ana o2r1ane o2r1ank o2r1a2no o2r1ant or1a2nya oraó2 or1app o2r1a2rá o2r1arc or1a2ri or1aszk o2r1atk o2r1atl or1att or1aty o2r1a2zo o2r1ábr orá2cs or1ács. or1ácsa or1ácso o2r1á2g orá2le or1álló o2r1állv orá2lö o2r1á2p o2r1ár. o2r1á2rak o2r1árá o2r1árb o2r1árk o2r1á2ro o2r1árp o2r1árr o2r1árt or1á2ru or1árú o2r1árv o2r1ásv orá2sze o2r1áta o2r1á2t1e2 o2r1átf o2r1áth o2r1átj o2r1átk o2r1átm o2r1átr o2r1áts o2r1átt o2r1átv or1bl or1br or2c1a2l or2car 1orcád or2chá or2c3hé or2c3ho orc3ság or2c3seb or2c3sé or2cú or2cz or2d1au ord1eme ord1e2ső or2dex or2d1ing 2orea o3reá o2r1e2b or1ecs o2r1e2d o2r1ef or1e2ge or1e2gé o2r1e2gy 2ore2k or1eke or1eké ore2l or1ela or1ele or1elh or1elj or1elm or1eln or1elo or1elő or1elr or1els or1elt or1elv o2r1e2m ore2n or1ene o2r1eng or1eny o2r1ep or1eró ore2s or1ese or1esé or1eső o2r1ess o2r1esze o2r1e2v or1ez o2r1é2d o2r1é2g o2r1é2j oré2kás oré2k1e2 or1ékné o2r1é2l o2r1é2m o2r1é2ne o2r1ép o2r1éré o2r1é2te o2r1étk o2r1év. o2r1é2ve o2r1é2vé o2r1é2vi o2r1évn o2r1évr orfé2l1é2v orfi2úér 2orgiai or1gl o2r1ibo o2r1i2de o2r1i2dé oridi2 ori2d1io 1o2rie o2r1ifj o2r1i2ga o2r1i2gá o2r1i2gy or1iha o2r1i2ma. o2r1i2má o2r1i2na. o2rinas o2r1i2nán o2r1i2nát or1i2náv o2r1ind o2r1inf o2r1ing. o2r1ingc o2r1ingé o2r1ingi o2r1ingn o2r1ingr o2r1ings or1inh o2r1inj o2r1ins orin2t1a2 orin2tel orin2t1ő ori2og o2r1i2p o2r1i2si o2r1ism or1isp o2r1iste o2r1i2szá ori2tan o2r1i2zé o2r1íg o2r1í2j o2r1í2n o2r1ír o2r1í2v o2r1í2z 1orjaia 1orjaié or3já or1k2l orkö2z1e2p or1k2v or2m1app orma1t2re or2m1att or2m1azo or2m1eb orme2g or2m1egy orm1eli orm1elv orm1erők orm1esz ormé2t or2m1éte or2m1osz or2móv or2m1ö or2m1ő or2mü or2ne. ornis1s o2r1o2á orogkész1 oro2k1á2 oro2kor o2r1olda o2r1o2li o2roltól o2r1ontó. o2r1ontób or1ontóé or1ontóig o2r1ontój o2r1ontón o2r1ontór o2r1ontót o2r1ontóv oro2nya oro2nyo or1ope or1opt o2r1o2r o2r1osko o2r1osto 1o2roszi 1o2roszr o2rosztá o2r1o2x or1ó2ia or1ó2ni or1ó2rá or1óri or1ó2sá oróso2r oró2soro or1ö2b or1ö2c or1ö2l or1ön or1ör or1ös or1öt or1öv or1ö2z or1ő2r or1ő2s or1ph or1pl or1p2n or1p2r orr1abl or2r1a2r or2r1áta 1orrb 1orri. or2rin or2riz 1orrk 1orruk 1orrú. 1orrúc or2s1a2d or2s1ajtók ors1alk ors1ass or2s1ál or2sed or2s1e2s or2s1é2ne or2sérte ors1é2tát or2s1í2r or2sön or2ső or1srá or1s2tab ors1ült ors1ü2tő 1ország orszi2l1 ors3zóná or1sz2t or2t1agg or2t1alm or2tana orta2n1á2c or2t1aré or2tág ort1árad ort1á2ram ort1á2rán ort1á2rár ort1árbe ort1árná ort1á2ruk or2t1á2rú or2t1e2g ort1ejt or2t1ela ort1e2lem or2t1elé or2t1ell or2t1elm or2t1eln or2t1elo or2t1elő or2t1elt ort1elv ort1emb or2tene orte2r1a or2t1ess ort1eti ort1éle ort1élé ort1élt ort1élv or2t1érm or2tid ort1i2ku or2t1int or2t1ist or2t1ita or2tít or2t1okm or2t1o2kol or2t1okta or2t1old or2t1orm or2t1ott or2t1ó2r or2t1ön or2t1ös or2t1ö2v ort1ura or2t1u2t ort1úr. or2t1ü2zér o2r1ud o2r1u2g o2r1u2r o2r1u2t o2r1útb o2r1úth o2r1ú2ti o2r1útj o2r1útn o2r1ú2ton o2r1útr or1úts o2r1útt or1üd or1ü2g or1ü2l or1ün or1ür or1ü2s or1üt or1ü2v or1üz or1űr 1orv. or2v1a2n 2orvá orv1isi 1orvos or2vő 1orvv or2z1a2var. or2z1e2c or2zes or2zsan orz1z o2s1abl o2s1a2da o2s1a2dó o2s1akc o2s1a2l osa2n o2s1ang o2s1ant o2s1any o2s1a2p os1arc os1assz os1a2ty o2s1au o2s1ábr o2s1á2g os1áld o2s1áll os1á2lom osára2 osá2rak osári2 osá2rik osá2rok o2s1áru osás1s os1á2t1a os1áté os1átj os1átk o2s1átr os1e2d o2s1e2g o2s1e2l os1emb os1e2n o2s1er o2s1es os1e2t os1ex os1ez o2s1é2g o2s1é2l o2s1ép o2s1érd o2s1érte o2s1érté osgé2 o2s1ide o2s1if osi2g os1iga os1ikr os1inf o2s1int o2s1i2p o2s1i2rá os1iro os1irt o2s1ism os1isp os1iste o2s1i2sz o2s1íj o2s1í2r o2s1í2z os1kl os1kró 2osok o2sonh o2sonn o2sono 1o2sont o2sonu 1osonv o2s1o2r os1osz osó1p os1ök os1ö2l os1ön os1ö2v os1ő2r os1p2l os1p2r os1ps os1sta ossu2 os2s1ur ossz1áll ossz1á2ro ossz1es ossz1íj osszó2 os3sző ost1e2te os2tip os2tir os2tiz 1ostob ost1old os2t1ös 2ostu os2t1ü2 1ostya o2s1ud o2s1uj o2s1u2r o2s1u2t os1úr. o2s1ú2s o2s1üg o2s1ün o2s1ü2v o2s1üz os3zabá o2szaj osz1alá osz1alk osz1alt osza2n osz1any o2szar osz1aré osza2t1e2 o2sz1ál o2sz1ed o2sz1e2g o2sz1e2l o2s3zen osz1ep osz1es o2szég o2széj o2sz1é2l o2sz1é2p o2sz1és o2szige osz1ing osz1ism osz1ist oszí2 osz1ív o1szkl o2sz1o2ro osz1ors o2sz1orz os3zón osz1ó2r o2szö os3zöl osz2t1alm oszt1any osz2t1apo osz2tár. osz2t1árn osz2ted osz2tell osz2t1em oszté2r osz2t1éré osz2t1ív osz2t1osz o2szur osz1úr o2szü osz1üg os3zül ot1abl ot1a2da otag2 ota1gr ota1k ot1ana o2t1ant ot1a2ny ota1p2 ot1arc ot1arz ot1ass o2t1a2z ot1ábr o2t1á2g ot1á2rak o2t1á2rá o2t1árb o2t1á2ré ot1árn ot1bl o2teb o2t1e2g otel1a ote2l1á ote2lel ote2lő ote2m1á ote2m1o ot1e2v o2t1é2l o2t1ép o2t1ér. o2t1érté o2t1érz ot1fr ot1gr oth2r o2t1id o2t1im otina2 ot1i2na. oti2nar oti2nár o2t1ind otinká2 2otipa 2otipi 2otipn 2otipt o2t1irá o2t1is o2t1izé ot1íj ot1ín ot1kl ot1k2r o2t1ob oto1gram ot1ola otona2 oto2n1á oto2n1in. oto2nis oton3n oto2rak oto2rál oto2rár oto2re oto2rim oto2rin oto2rol otosz2f otó1f2 2otóp otó2pan otó2pas otó2pin otó2p1osz otó2sétá otós3s otó1sta otó1sz otó2s3zár otót2 otó1tr ot1ö2l ot1ös ot1pl ot1pr ot1ps o1t2rag ot1sp ot1sr ot1st otta1g2 ot2t1é2g 1ottl ot1ura ot1u2sz o2t1új ot1úri ot1ü2l ot1üt ot1ü2z ot1űr otva1k2 otya1 o1u ou2ag ou2il ou2le o1ú o1ü o1ű ova2ga ova2g1i2n ova2r1an ova2rát ova2r1el ova2rék ova2rés ova2ris ovas3s ovau2 ováb2b1o ová2s1á2rá ová2sik ovio2 ow1el 1oxidb 1oxidr o2xigé 1oxilc oy2ce oza2g ozag1a oz1agi o2z1a2l oza2mal oza2m1e2 oza2m1érté oza2min oza2n o2z1any oza2r oz1ara oza2tat oza2tál oza2t1e2 oza2tés oza2t1é2te ozat1ill oza2t1í2 oza2t1ol o2z1au o2z1á2g ozá2ke oz1áll o2z1á2ro o2z1áru ozá2s1e ozás3s ozá2s3z o2z1átl oz1e2g oz1e2m oz1en ozé2k1e2 o2z1é2l o2z1é2p o2z1é2ré oz1i2do o2z1i2par oz1iro ozi2s1aj ozi1sl ozi1st ozi1sz2 ozi2t1a2 oz1í2n o2zor oz1ors o2z1osz ozóegyez1 2ozófia 2ozófiáb 2ozófiáh 2ozófiája 2ozófián. 2ozófiána 2ozófiár 2ozófiát. 2ozófiátó 2ozófiáva ozó2tan oz1p2r o2zs1a2l ozsa2n ozs1any o2zs1ő ozs1s o2zsü oz1ün oz1ü2z oz1űr ozzá1s2 2ó. ó1a óa2cé óa2dag óa2dá óa2do óa2dó óa2ga óa2gi óa2gy óa2já óajtói2 óa2kad óa2kar óa2ká óa2ku óa2la óala2g1 óa2lá óa2l1e óalmana2 óalmanac3 óa2lo óal1os óa2lu óa2ma óa2na óa2nó óa2ny óa2pá óa2po óa2pó óa2pu óa2ra óa2rá óa2ré óa2ri óa2ro óa2to2 óatom1 óa2ty óa2uk óa2ur óa2ut óa2va óa2xi óa2zo ó1á óá2bé óá2cs óá2ga óá2gi óá2go óá2gyú óá2hí óá2la óá2lo óá2po óá2rá óá2ru óá2rú óá2sa óá2só óá2sz óá2ta óát1a2dó. óá2tá óá2t1e2 óá2té óá2t1i2 óá2tí óá2to óá2t1ö óá2tu óá2tú óá2tü 2óbab 2óbaj 2óbak 2óbal 2óband 2óbank óba1p2 2óbará 2óbark 2óbarna óbas2 óba1t2r óbau2 2óbec 2óbef 2óbeg 2óbeh 2óbej 2óbek 2óbele 2óbelé 2óbels 2óbem 2óbeo 2óber 2óbet 2óbev 2óbez ó2bég 2óbil 2óbio 2óbir 2óbit 2óbiz ó1b2le ó1b2lo 2óbój 2óbólé ób2rá ó1b2ro ób2rók ó1b2ru óbuda2ik óbuszt2 óbu2sz1ú ó2c1aj ó2c1akr óc1a2la óc1alk ó2c1ar ó2c1ass óc1att ó2c1ál 1ó2ceá ó2c1e2g óce2l óc1ele óc1elm óc1elő óc1emb ó2c1e2v ó2c1ép ó2c1ét óc3há óc3he óc3ho óci2m óc1imi óc1ing ó2c1i2pa ó2c1is óc2lu ó2c1or ó2c1osz óc1ó2r óc1pr 2ócsa óc3ság ó2cs1áru 2ócse 2ócsé 2ócsi ó2csit 2ócsí 2ócso 2ócsö 2ócső ócs1p óc3s2pá óc3sz óc1tr ó2c1ud óc1ün óc1üz óc3za óc3ze óc3zu ód1ada ód1a2dá óda2j ód1ajá ód1akt 2ódal. 2ódala ód1alg ó2d1am ód1ana 2ódarabk 2ódará ód1aut ód1azo ó2d1áf ó2d1ág ó2d1ál ó2d1áp ó2d1árn ód1á2ru ódás3s ód1bl ód1br ó2d1e2d ó2d1e2g ód1e2lem ó2d1elh ód1elj ó2d1ell ó2d1elm ó2d1elo ód1elő ód1elr ó2d1elv ód1emb ód1eme ód1ep óde2ra ód1erő óde2sés ó2d1e2v ó2d1ez ó2d1é2g ó2d1ép ó2d1érte ó2d1érz ód1fr ód1gl ó2d1i2d ó2d1igé ó2d1int ódi2p ó2d1ipa ó2d1iro ódi2sz ód1izo ó2d1ír ód1kl ód1kr ód1kv 2ódob ódo2ga 2ódok 2ódol 2ódom ó2d1op ó2d1osz ó2d1o2x ódókész1 ód1órá ó2d1ö2l ód1ös ó2d1öt ó2d1öv ód1őr ód1pr 2ó1d2ram 2ódrá ód2rám ó1d2rog ó1d2rót ód2ruk ód1sp ód1st 2ódug ódu2r ó2d1ura ódus3s ódu2s3z ó2d1u2t ó2d1új ód1úr. ód1üg ó2d1ür ód1üv ód1üz ód3zár ó2d3ze ód3zso ó1e óe2bé óe2ch óe2cs óe2dé óe2dz óe2ge óe2gé óegész1 óe2gy óe2ke óe2ké óe2l1a2 óe2l1á2 óe2le óel1en óe2lé óel1ér óe2l2i óe2l1í2 óe2lo óe2lő óe2lü óembe2r1ék óe2me óe2mé óe2mu óe2ne óe2pé óe2pi óe2po óe2re óe2ré óe2ró óe2rő óe2se óe2sé óe2ső óe2sz óe2te óe2ti óe2tű óe2ve óe2vé óe2vő óe2zü ó1é óé2be óé2ge óé2gé óé2gő 2óé2he 2óéhs óé2ke óé2ké óé2kí óé2le óé2lé óé2lő 2óé2ne óé2pí óé2pü 2óér. 2óérd 2óé2re 2óé2ré óé2ri óé2rő 2óérte 2óérté 2óérz óé2te 2óétk óé2ve óé2vé óé2vi óé2vü 2ófa. 2ófaa 2ófaá 2ófab 2ófac 2ófad 2ófae 2ófaf 2ófag 2ófah 2ófak 2ófal 2ófao 2ófap 2ófar 2ófas ófa1st 2ófa1t2 2ófaü 2ófav 2ófaz ófe2l1em ófe2len ó2f1ev 2ófék 2ófélő 2ófélt 2ófén ó2f1ér. ófi2ab ófi2ad ófi2ag ó1f2la ó1f2lo óf2ló óf2lö óf2lu 2ófoc 2ófog 2ófok 2ófol 2óford 2óforg 2óformác 2óformáj 2óformál 2óforr 2ófos 2ófot ó2f1ov ó1f2rak ó1f2ri ó1f2rí ó1f2ro ó1f2rö ó2f1ud ófu2r óf1ura óf1úr. óf1úrn óga1p óg1dr óge2o ógé2p1i2p óg3gy ógi2al óg1ír óg2la óg2le ógo2ras ó1g2raf óg2rán ógu2sab ógu2s3z ó2gy1el ó2gy1es ó3gyi. ógy1int ógyö2k1érb ógyta2n1á2 ógyte2a ógy1ús óha2de 2óhal 2óhan 2óhas 2óhat óháza2d óhá2z1ada 2óhon 2óhor 2óhos óhús1s ó1i 2ói2de 2óidé ói2dén ói2di 2ói2dom 2ói2dő 2ói2ga 2ói2ge 2óigé ói2géb ói2géi ói2géj ói2gék ói2gén ói2gér ói2gét ói2gév ói2konb 2ói2konj 2ói2konn 2ói2kono ói2konr ói2kont óile2 2óill ói2ma. 2ói2má ói2mi 2óimp 2ói2na. ói2nai ói2naka ói2nas ói2nat ói2nán ói2nár ói2nát 2óind 2óinf 2óing 2ói2ni 2óinj 2óinp 2óint 2óinv ói2pa 2ói2rat 2ói2rá 2ói2ro ói2sz 2ói2ta ói2tók ói2vad ói2zé ói2zo ó1í óí2rá óí2ri óí2ro óí2ró óí2té óí2vé óí2vü óí2vű óí2ze óí2zé óí2zi óí2zü óí2zű ója1g2 2ójakén. ójak2r 2ójam ója1p2 2ójav 2ójárá 2ójárm 2ójáró. 2ójáru 2ójárv 2ójáté 2ójáts óje2gy1á2 2ójut 2ókab ók1a2da ók1ajt ó2k1akó ó2k1alj ók1alko 2ókaló 2ókamp 2ókamr 2ókapa 2ókapc 2ókaps 2ókar. 2ókara 2ókarr 2ókart 2ókata 2ókate óka1t2r ók1aut 2ókav 2ókaz ó2k1áll ók1árad ó2k1á2ri ó2k1árn ó2k1áru 2óke2d ó2k1edz ók1egé 2ókem ó2k1emb 2óker óker1este óke2r1ékné óke2rig ó2k1e2rő óke2r1üg óke2sz ók1esze óke2t ók1ete 2ókev 2ókez ó2k1é2l 2ókém 2ókény 2ókép. 2óképb 2óképe óké2p1e2l 2óképé 2óképl 2óképn 2óképpel 2óképr 2óképt 2óképz ó2k1ér. 2ókérd 2ókére 2ókéré 2ókérő 2ókés ó2k1étt ók1étv ók1gr ók2hiá 2ókia 2ókiá 2ókic 2ókie2 2ókié 2ókif óki2g ók1iga ó2k1igé 2ókií 2ókij ók1ill 2ókim ók1imi 2ókinc 2ókine ó2k1int 2ókiny 2ókio ó2k1isk ó2k1ist 2ókisz 2ókit 2ókiv ók1i2va ók1k2r ók2lim ó1k2lí 2ó1k2ló 2ó1k2lu 2ókock 2ókoco 2ókoe 2ókoh 2ókoll 2ókomé 2ókomf 2ókomp 2ókonc 2ókonf 2ókonj 2ókons 2ókont 2ókony 2ókonz 2ókoo 2ókop 2ókorá óko2r1á2s 2ókorb 2ókore ó2k1org 2ókori 2ókorl 2ókorm 2ókorn 2ókoro 2ókorr 2ókors 2ókoru ó2k1oszl 2ókód ók1ó2l 2ókór ó2k1óv 2óköl ók1ö2lé ók1ö2lő ók1örd ók1ötl ók1pl ók1pr ó1k2rá ók2reá 2ó1k2rém ók2rét 2ó1k2ri ó1k2rí ók2ron ók2ros 2ó1k2rón ók1sk ók1st ó2k1ug ó2kum 2ókup 2ókur óku2sz1ál óku2sze 2ókut 2ókúr ó2k1üg 2ókül 2óküs ók1üzl 2ó1k2vó ól1ajt óla2man óla2pa ó2l1a2pál óla2pol óla2p1osz ól1a2rá ól1azo ólá2b1út 1ó2lál ólás3s ólá2sü ól1átl óleí2 ól1e2se ól1e2sé ól1esh ól1esn ól1ess ól1est óle2ta ólete2 óle2t1ev ó2l1érz ólé2tel ólé2tés óli2ako óli2am óli2s ól1iszo ól1ín óloma2 ólo2m1al ólo2m1á ólo2m1e ólo2mis 1ó2lomr ó2l1osz ólóá2 óló1sl óló1sp ólót2 ó2l1öl ó2l1ör ó2l1ös ó2l1ö2z ól1p2r ólu2m1e ólus3s ólu2szá ól1üt ól1üv ólya2ga ólyag1g óly2á óm1abl ó2m1a2cé 2ómagn óm1akn óm1all 2óman 2ómara 2ómarc ómaren2 2ómarh 2ómark ómas2 óma1sp 2ómass 2ómate óm1a2to ó2m1au 2ómax 2ómág óm1áll 2ómárk 2ómárt 2ómáz óm1b2r óm1e2gy ó2men. 2óméd 2ómél óm1éle ó2m1ép 2ómére 2óméré 2ómérg 2ómérk 2ómérn 2ómérő 2ómérs 2ómérté ómiac1 ómi2as ó2m1i2b ómi2g ó2m1igé 2ómi2k óm1iko 2ómin ó2m1i2ono ó2m1i2ont ó2m1i2p 2ómis ó2m1isk ó2m1ist ómi2sz ó2m1i2z 2ómod 2ómog 2ómoh ó2m1ola ó2m1old 2ómond 2ómoni 2ómono 2ómont 2ómor 2ómos ó2m1osz 2ómot ó2m1ox 2ómoz óm1öt óm1őr óm1pr óm1üt óm1üz óműt2 2ónad 2ónag óna2kás óna2k1e2 óna2kol ón1alj. ón1aljak ón1aljá ón1aljo ón1alju 2ónap óna2pa. óna2pá ó2n1apába óna2pe ón1arc ó2n1asp ón1aszt óna1t2 2ónav óná2l ó2n1áll ó2n1álo ónás1s ón1br óne2d ón1ez 1ó2néé 2óném ón1épí 1ó2néra ón1érc ó2nérd 1ó2néró óné2v1á 2ónéz óni2g ó2n1igé ó2n1ist ón1odv 1ó2nokul 2ónor ón1ox ón1ön ó2n1ör ón1öt ónőé2h ón1pr ó2n1u2t ón1ür 2ónya 2ónye 2ónyil 2ónyitá 2ónyitó. 2ónyí 2ónyo 2ónyu 2ónyú ó1o óo2dú óo2ka óo2ká óo2k1i2 óo2ku óo2la óo2li óo2pe óo2ra óo2ri óo2ro óo2vi óo2xi ó1ó óó2la óó2lá óó2li óó2lo óó2ra óó2ri óó2sá óó2vá óó2vo óó2vó ó1ö óö2bö óö2ko óö2kö óö2lé óö2lő óö2rö óö2ve óö2zö ó1ő óő2re óő2ré óő2ri óő2rö óő2rü óő2sé óő2sö ó2p1a2da ó2p1alk óp1anal ó2p1a2no óp1ant ó2p1any óp1a2rán óp1áll ópcsa2p1 ó2p1ef ó2p1e2g óp1elo ó2p1id óp1ind ó2p1i2o óp1i2rá ó1p2lak ó1p2las ó1p2lu ó2p1ob ó2p1o2la ópo2rad óp1óra ó1p2ri óp2rod óp2rop ó1prób óp1t2r ópus3s ó2p1új óp1üv ó2rabé ór1ace 2órada óra2dat ó2raib ó2raié óra2iér ó2raih ó2raii ó2raij ó2raik óra2iké óra2iko ó2raim ó2rain ó2raip ó2rais ó2rait ó2raiv 1ó2raje 2órajo 2órajz óra1kv ó2rala ór1alk ó2ramo ó2r1ani ór1ant óra1p2l ór1arc 1órare óra1s2p ó2r1a2tom 1ó2raü 1óráén ór1ágg ór1á2gy 1órákh 1ó2ráki ó2r1ál 1ó2rámé 1ó2rámo 1órámr ó2r1á2p órá2se 2óráta ór1átv ór1br ór1ege ó2r1e2gy ó2r1e2le ór1ell ór1elm ó2r1elo ó2r1e2lő ór1elv ór1emb ór1eml ó2r1e2r ó2r1e2set ó2r1e2tá ó2r1e2té ó2rezü ór1é2je ó2r1é2l ór1é2ri óré2vek ór1fl órhá2zot óri2aka óri2al ó2riási óriás3s óri2ch ó2r1id ó2r1int ór1i2onn ór1i2ono 2órip ó2r1i2pa ó2r1i2si ó2r1isme 2órit óri2z ór1izo ór1í2j ó2r1ír ór1í2z ór1kl órmé2s ór1o2ká ó3roké ór1o2ki óro2kok óro2koz ór1o2ku ór1okú ó2r1osz ó2r1o2x ó2r1óda óró2dáj órói2ko óró1p ór1ósá 2óróz ó2r1ö2l ó2r1öml ó2r1ös ó2r1öt ór1őr ór1p2r ór1trá óru2mag óru2me ó2r1u2r óru2sab óru2san óru2se órus3s óru2sü óru2s3z ó2r1uta ó2r1ú2s ó2r1út ór1ün ór1ü2v ór1üz 2ósabl ó2s1a2d ó2s1a2g ó2s1alj ós1alt ós1amn ó2s1apr 2ósar ó2s1arcot ó2s1asp ós1ass ó2s1atl ó2s1au ósa2vo ó2s1ábr ó2s1áf óság1g ó2s1áll ós1á2lo ó2s1á2ro ós1áti 2ósáto ós1bl ós1br óscsap1á2 2óseb ós1e2gy 2ósej ós1elj ós1elm ós1e2lő ós1els ós1elv óse2m ós1emb ós1emi ó2s1en óse2p ós1epo ós1erő ó2s1es ó2s1e2t ó2s1ez ó2s1é2l 2ósém ós1é2ne ó2s1ép ó2s1ér. ó2s1érte 2ósét ósé2táka ó2s1é2te ós1étk ós1étt ós1fr ó2s1i2d ósi2g ós1ige ósi2kerb 2ósikl ós1ind ós1inf ósi2p ós1ipa ós1iro ó2s1isk ós1ist 2ósík ó2s1ính ós1í2rá ós1í2ró ó1s2kat ós2kic óski2s ós1kl ós1kv ós2lag 2óslá ó1s2ni 2ósokas 2ósokko 2ósoks ós1oli 2ósor ó2s1org ó2s1orj ó2s1orm ó2s1ott ó2s1ov ó2s1ó2r ó2s1ö2l ó2s1ös ó2s1öt ós1őr ó1s2pec 2ó1s2pek 2ó1s2pir ós1pl ó1s2pu ós1s2k ós1s2p ós3sze ós3szö 2ó1s2tab ó1s2tad ó1s2taf 2ó1stand 2ó1s2tat 2óstá ós2tább ó1s2tád ó1s2tát ó1s2tég 2óstí ós2topo 2óst2r ós1tré ós1tri ó1stru 2óstú 2ósug ó2s1u2r ó2s1u2t ós1úr. ós1ú2ri ós1úrn 2ósül 2ósür ó2s1üs ó2s1üz 2ósűrí 2ósza ó2s3zac ósza2k1ü ó2sz1a2lap 2ószá ószá2gol 2ószed 2ószeg ó2sz1e2gű 2ószek 2ószel 2ószem 2ószen 2ószer. 2ószere ósze2r1e2pé 2ószerk 2ószerv 2ószerz 2ószez 2ószé ószé2n1é2 2ószi ó2szima 2ószí 2ószk ósz2l 2ószob 2ószoc 2ószof 2ószol 2ószon 2ószó 2ószö ó2sz1ös 2ósző 2ószp ós3zs 2ószt ó1sz2tá ószt2rá 2ószú 2ószü ó2sz1üg 2ószűk 2ószűré 2ószűrő ó2s3zűrt ósz2v ót1adó 2ótag. 2ótaga óta2gal 2ótagb 2ótag1g 2ótagi 2ótagj 2ótagk 2ótagn 2ótago 2ótags 2ótagu ót1ajk 2ótalap 2ótalá ót1alk ó2t1alm 2ótan ót1anti 2ótap 2ótar ótas2 ó2t1ass 2ótat ót1a2ur 2ótax 2ótág ót1á2ga ót1ágg 2ótáp ótára2d ótá2r1ada 2ótáro 2ótárs 2ótávc 2ótávi2 ótá2v1ir 2ótáví 2ótávk ó2t1e2g ó2t1elh ó2t1e2lő ó2t1emb ó2terd ót1égé ó2t1é2ké óté2t1ö2 ót1fr ó2t1i2d óti2g ó2t1igé ót1ill ó2t1im ó2t1ing ót1i2pa óti2sz ó2t1í2r ó2t1í2v ó2t1íz ót1kr ótlé2ke 2ótoj 2ótol ótol2l1a2d ót1oml 2óton 2ótor ó2t1ors 2ótov 2ótó. 2ótón ót1öko ótőe2 ót2rad ót2raf ót2rak ót2ran ót2rén ót2rik ót2ril ót2rió ót2rom ót1sl ót1sp ótsze2r1ep ótu2sze ót1ülé ót1ü2lő ót1üst ó2t1ü2v ótű2z3s ó1u óu2bo óu2ga óugrás1s óuj2j1a2da óu2ni óu2no óu2ra óu2sz óu2ta óu2tá óu2to óu2tó óu2tu ó1ú óú2jí óú2ré óú2sz óú2ti óú2to ó1ü óü2gy óü2le óü2lé óü2lő óü2nő óü2re óü2rí óü2rü óü2sz óü2te óü2té óü2tő óü2ve óü2ze ó1ű óű2ző 2óvad 2óvag 2óvaj 2óvak. 2óvaks 2óvaku 2óvaló 2óvar 2óvas ó2vat 2óvág 2óvák 2óvál 2óván óvá2r1al óvárosi2h ó2vása 1ó2vási ó2váso 1ó2vásr 1ó2váss 1ó2vást 2óváz óve2r1a óveri2 óve2rip óv1in 1ó2vod ó2vom 2óvon óza1d2 óz1a2dá óz1a2dó 2ózaj óz1akc óza1kr óz1akt óz1a2la óz1arc óza1s óza2t1a2l óza2tan óza2tál óza2tés óza2told óza2t1ü2 2ózav ó2z1á2g óz1áll ó2z1á2ru ó2z1á2rú óz1bl 1ózdi ó2z1e2g ó2z1el óz1em óz1erő ó2z1ex óz1ez ó2z1é2l ó2z1é2te óz1fl óz1fr ózhajói2 óz1imp óz1ing ó2z1i2p ózi2s1e2 ózi2sir ózis3s ózi2s3z ó2z1old ózo2n1a2 ózo2n1á ózo2ni ózós2 ózó1sp óz1őr óz1pr ózsa1k2 ó2z3ser óz3sor óz3sz óz1t2r 2ózuh ó2z1u2r ó2z1u2t óz1ú2s ó2z1út óz1ü2g óz1ül óz1ü2z 2ö. ö1a ö1á öb1a2n öb1ál öb1á2r öb1át öb2b1a2 öb2b1á2 öb2b1eg öbbe2l öb2b1ele öbbe2m öbb1eme öb2b1e2r öb2b1esz öbb1eve öb2bél öb2bid öb2b1is öb2bí öb2b1ol öb2b1os öb2bot öb2bó öb2bö öbbü2 öb2b1ül ö2b1ef ö2b1eg ö2b1e2l ö2b1e2m ö2b1e2n ö2b1er ö2b1él ö2b1ér. ö2b1érté ö2b1érz öb1fr ö2b1i2d ö2b1ing ö2b1int 1öbli 1öblö öb1or öb1ón ö2böll 1öböltő öc1aj öccs1a2 öccs1i ö2c1ép ö2c1éve öc3he öc3hö öció2 öc1őr ö2cs1a öcs1éj öcs1ék ö2cs1é2te ö2csiz öcs1izz öcs1ó ö2cs1ö2l öcs1ű2r öc3sz öd1a2l öd1a2n öd1ar öd1á2l öd1ár ö2d1ef öd1ell ö2d1em öd1e2vé ödé2m1o ödé2sa ödés3s ödé2s3z ö2d1é2ves öd1é2vén öd1é2vér öd1gr öd1íz öd1os öd1óc öd1ó2r öd1sp öd1u2s öd1új öd1ú2s ö2d1üv ö2d1űz öd3zá ödzáró2 öd3zu ö1e ö1é öfés3s ög1ab ög1a2c ög1a2d ög1ag ög1a2k ög1a2l ög1a2n ög1ap ög1ar ög1as ög1a2t ög1áb ög1ág ög1á2l ög1á2r ög1át ög1dr ö2g1e2g ö2g1e2kéi ög1elb ö2ge2leme ö2g1elf ö2g1elha ö2g1elm ö2g1elo ö2gemel ö2g1er ö2g1esz ög1e2vé ö2g1é2g ög1ékt ö2g1é2p ö2g1ér. ö2g1érs ög1érté ögés3s ög1fr ö2g1id ö2g1i2m ög1inf ö2g1ist ö2g1iva ö2g1i2z ög1ín ög1ír ög1ív ög1kr ög1o2l ög1op ög1o2r ög1os ög1ó2r ög1öli ög1ölö ö2g1öv ög1pr ögre1p2 ög1sk ög1sp ög1tr ög1ud ög1u2n ög1u2t ö2g1üg ö2g1üs ö2g1üt ö2g1üv ö2g1üz ö2g1űz ög3ya ö1i ö1í öj2tél öj2t1o ök1ab ök1a2g ök1a2k ök1a2l ök1a2n ök1a2p ök1ar ök1as ök1a2t ök1au ök1a2v ök1ág ök1ál ök1á2p ök1á2r ök1át ök1áz ök1dr ö2k1e2d ö2k1e2g ö2k1eke öke2l ök1ela ök1ele ök1elh ök1elm ök1eln ök1elő ök1elv ö2k1e2m öke2né öken1s ök1erd ö2k1e2resz ö2k1e2rő ö2k1es öke2vés ö2k1ez ö2k1ég ö2k1ékn ök1éks ök1é2les ö2k1ép öké2r1e2l öké2r1em ö2k1é2rez ö2k1é2rés ökés3s ö2k1é2te ö2k1é2ve. ö2k1é2vek ök1é2vet ök1fr ök1gl öki2d ök1ide ök1ido öki2g ök1iga ö2k1igé ö2k1ikt ö2k1i2na ök1ind ö2k1ing ö2k1int ö2k1i2o ö2k1i2p ö2k1iro ö2k1is ö2k1iz ök1íj ö2k1ír ök1ív ök1íz ök1kl ök1k2r 1öklű ök1ok ök1old 1ökoló 1ökon ök1o2p ök1o2ro ök1orr ök1ors ök1o2v ök1ó2r ök1óv 1ökör. ökö2rö ökőár1a2d ökőé2 ök1pr 1ökrös 1ökrü 1ökrű ök1sp ök1sr ökszi2l1 ök1t2r ök1u2n ök1u2r ök1us ök1u2t ök1új ök1úr ök1út ö2k1üg ökü2l ö2k1ülé ö2k1ült ö2k1ü2t ö2k1ü2v ö2k1üz öl1a2d öl1ag öl1a2j öl1a2k öl1al öl1ap öl1a2r öl1au öl1a2v öl1á2g öl1ál öl1á2m öl1á2p öl1á2r öl1á2s öl1át öl1á2z öl1br ölcsa2l ölcs1á2p ölcs1á2r ölcs1ell öl2csev öl2csid öl2csiz öl2cs1ok ölcs1ol öl2csos öl2csüg öl2csül öl2dab öl2d1a2d öl2d1a2k öl2d1a2la öl2d1alj öl2d1alk öl2d1a2n öl2dap öl2d1as öl2d1á2 öl2deg öl2dep öl2dev öl2d1éd öl2dél öl2d1ing öl2dip öl2d1o2r öl2dos öl2d1ó2 öldő2 öl2dőr öl2dős öl1dró öl2dur öl2d3z 1ö2l1e2b öle2gel öleg1g ö2lel ö2l1e2r ö3l2e3sü öle2t1á2 öle2t1el öle2to öle2t1u ö2l1e2v ölé2d ö2l1éde 1ö2léé ö2l1é2g ö2l1é2kes ö2l1ékí ö2l1él. ö2l1é2le ö2l1é2lé ö2l1élh ö2l1é2li ö2l1élj ö2l1éln ö2l1éls ö2l1élt ö2l1élv ö2l1éme ö2l1é2neke ö2l1é2p ö2l1ér. ö2l1é2red ö2l1é2rek ö2l1é2rezn ö2l1éré ö2l1érh ö2l1é2ri ö2l1érj ö2l1érk ö2l1érl ö2l1érn ö2l1érs ö2l1érte ö2l1érté ö2l1értü ö2l1é2rü ö2l1érv ö2l1érz ölés3s ö2l1é2tet öl1fr ölgyá2 öl2gyer ö2l1i2d öli2g ö2l1iga ö2l1igé ö2l1igy ö2l1ij ö2l1il ö2l1im ö2l1i2n ö2l1i2p ö2l1i2r ö2l1i2s ö2l1i2ta ö2l1itt ö2l1iz öl1í2r öl1í2v öl1o2c öl1o2k öl1ol öl1or öl1o2s öl1ó2v ölö2ki ö2l1ökl ö2l1öl öl1önt ö2l1ör ö2l1ö2v öl1őrl öl1őrö ölpárba2 öl1p2r öl1sk öl1sr öl1st öl2t1ad öl2taj ölt1ala ölt1alj ölta2n öl2tid öl2til öl2tí öl1tro öl2tur öl1u2g öl1uj öl1u2s öl1u2t öl1új öl1ús ö2l1üd ö2l1üg ölü2le öl1ülté ö2l1ültö ö2l1ülve ö2l1üs ö2l1üt ö2l1üv ö2l1üz ö2l1űz ö2ly1a2 ö2ly1á öly1e2g ö2lyel öly2föl öm1a2d öm1a2g öm1al öm1a2n öm1a2p öm1ar öm1au öm1áb öm1ág öm1áh öm1ál öm1áp öm1á2r öm1á2t öm1áz öm2b1a2c öm2b1ak ömba2l öm2b1a2n öm2baz öm2b1á öm2bec ömb1ele öm2b1e2m öm2b1es öm2bék öm2b1i2d öm2bin öm2bí öm2b1os öm2b1ó2 öm2bú öm2bür ö2m1e2b öme2g1a2 ömeg1e2r öme2gesz öme2g1ék öme2gép ömeg3g öm1egy ö2m1e2l ö2m1ember ö2m1emel ö2m1e2r öme2s ö2m1ese ö2m1este ö2m1ég ö2méhs ö2m1é2l öm1é2nekb ö2m1é2neke ö2m1é2neké öm1é2nekh ö2m1é2nekk ö2m1é2nekr ömé2ny1ü ö2m1ép ö2m1ér. ö2m1érte ö2m1érté ömés3s öm1gr ömi2g ö2m1igé ö2m1in ö2m1i2p ö2m1i2ta ö2m1itt ö2m1izm ö2m1i2zo öm1í2z ömkész1 öm1kl öm1kr ömlés3s 1ömlöt öm1o2k öm1o2l öm1or öm1os öm1ó2d öm1ó2r ö2m1önt öm1p2r öm1sp öm1st öm1tr öm1u2g öm1uj öm1u2t ö2m1üg ö2m1ünn ö2m1üv ö2m1üz ö2m1űz ön1ab ön1a2d ön1a2g ön1a2j ön1a2k ön1a2l ön1am ön1a2n ön1a2p ön1ar ön1as ön1at ön1au ön1a2v ön1az ön1áb ön1ág ön1ál ön1ám ön1á2p ön1á2r ön1á2t önát1a2dó. önát1é ön1áz önbé2két. ön1bl ön2c1ál ön2ch ön2cő önc3ség önc3sz ön2cz ön2dab ön2dap önde2m ön2d1ér. ön2d1érn ön2d1érr ön2d1értő ön2d1or ön2d1ő ön2dz ö2n1eb ö2n1e2d ö2n1ef ö2n1e2g ö2n1e2l ö2n1e2m öne2n ön1ene ö2n1e2r ö2n1es ön1e2v ön1ex ön1é2g ö2n1éj ö2n1é2k ö2n1é2l ö2n1é2p ö2nérd ön1éri ön1érl ön1érte ön1érv önés3s ön1ész ö2n1éte ö2n1étt ö2n1év. ö2n1éves ön1évet ö2n1é2vér ö2n1é2vét ö2n1évv önfe2lem ön1f2r ön1g2l ön1g2r öngy1as ön2gyék öngy1ó2r 2öngyö ön2győ ö2n1i2d ön1if öni2g ö2n1iga ön1ige ö2n1igé ön1ill ö2n1im ö2n1in ö2n1i2p ö2n1i2r ö2n1is ön1ita ö2n1i2z ön1íj ö2n1ír ö2n1íz ön2k1ag ön2k1any önk1áru ön2kát önk1olt ön2k1ú önkü2 önmeg1g önna2k ön2n1á önny1a2d önny1á önny1e2dz ön3nyú ön1o2d ön1o2k ön1op ön1or ön1os ön1ox ön1ó2c ön1ó2r ön1óv ön1öb ö2n1ör ö2n1ö2v ön1őr önő2re ön1őz ön1pl ön1pr ön1ps önségü2ké ön1s2p ön1s2t2 önsz2 ön2t1ell öntgen1n öntös3s 1öntöz ön1t2ra ön1t2rá ön1t2ré ön1ud ön1un ön1u2r ön1u2s ön1u2t ön1új ön1ú2s ön1út ön1üd ö2n1ü2g ö2n1ür ö2n1ü2t ö2n1üz ö2ny1a2 ö2ny1á öny1d ö2ny1el ö2ny1id ö2ny1in ö2nyí ö2ny1o ö2nyüz öny2vaj öny2v1a2l öny2van öny2v1á2r öny2v1e2g öny2v1er öny2v1esz öny2vev öny2v1ég öny2vél öny2v1ér. öny2v1ill öny2v1í öny2v1o ö1o ö1ó ö1ö ö1ő öp1aj öp1a2l öp1ál öp1e2l öpe2nyá öp1e2r ö2p1ép öp1ö2lő ör1ab ör1a2c ör1a2d ör1a2g ör1aj ör1a2k ör1a2l ör1a2n ör1a2r ör1as ör1a2t ör1a2u ör1a2x ör1a2z ör1áb ör1á2c ör1á2g ör1á2l ör1á2r ör1á2s ör1á2t ör1br örcs1ál örcs1ell örcskész1 ör2csos 2ördí ör1d2r 2ördü ö2r1e2c ör1e2dz ö2r1ef öre2ga öre2g1ék ör1e2gy öre2j1á öre2k1e2sz öreké2 ö2r1e2l ö2r1em ör1enc ö2r1e2p ö2r1e2r ör1e2se ö2r1e2tető ö2r1e2v ö2r1ex ö2r1ez ö2r1é2de ö2r1é2g ö2r1éj. ör1éks ö2r1é2l ö2r1éneke ö2r1ép ö2r1éré ö2r1é2ri öré2sel öré2t1e2g ö2r1étv ör1é2ve. ö2r1évk ör2fá ör2f1év ör2f1i2p ör2fis ör2f1os ör2főr ör1g2r ö2r1i2d öri2g ö2r1iga ö2r1igá öri2k ör1iko ö2r1ill ö2r1im ö2r1ind ö2r1ing ö2r1inj ö2r1ink ö2r1int ö2r1inv ö2r1i2p ö2r1ira ö2r1i2s ö2r1i2ta ör1itt ö2r1ivá ör1i2zo ö2r1ír ö2r1í2v ö2r1í2z ör1k2l ör2k1öltő ör1k2r örle2ta ör2l1in örny1a2l örny1a2n örny1as örnye2l örny1ele ör2ny1er ör2nyéj ör2nyés örny1í2r ör2nyó ör1ob ör1o2k ör1o2l ör1op ör1o2r ör1os ör1ó2r 2örög örö3g2e 1örömü ö2r1önt ö2r1ör ö2rössze ö2r1ösz örpe1t2 ör1s2p ör1s2v örta2r örtá2v1 ör2t1éks örté2l ör2t1élé ör2t1élő ört1érne örté2sz ör2tív ör2t1ok ör2top ör1ud ör1uj ör1u2n ör1u2r ör1u2s ör1u2t ör1új ör1úr ör1ú2t ö2r1üd ö2r1ü2g örü2l1ék ö2r1ür ö2r1üs ö2r1üt ö2r1ü2v ö2r1üz 1örv. örva2s 1örvb 1örvek 1örvem 1örvet 1örvéb 1örvéh 1örvév 1örvh 1örvn 1örvr 1örvt 1örvü 1örvű 1örvv örz4s ör2zs1á2 ör2zs1e2l ör2zsid ör2zsin ör2zsir ör2zs1í2 ör2zs1o ör2zsó ör2zsu ör2zsú ös1a2g ös1al ös1ár ö2s1el öses3s ö2s1ez ösié2 ö2s1i2p ös1k2r ös1o2l ös1o2r összá2r 1összeg össz1emb 1összes ös3szí öst1arc ö2s1ü2v ö2sz1a2 ösz1e2r öszi2s ösz1isz ö2sz1o2 ö2sz1ő ösz2t1ell öt1ab öt1aj öt1a2k öt1a2l öt1am öt1as öt1a2t öt1áb öt1ág öt1ál öt1ár öt1á2s öt1eké öt1e2m öt1ep öt1es öte2t1a2 öte2tel öte2u öt1e2v öt1e2z ötélé2 öté2lék öté2l1o öt1érté öt1érz ötés3s öt1é2ves öt1fl öt1fr öt1gr öt1i2r öt1í2v öt1kr 1ötlet ötle2t1á 1ötlé öt1ok öt1ol öt1or öt1os öt1ó2r ö2tödb 1ö2tödd 1ö2tödne 1ötödöt 1ö2tödr 1ötödü ö2tös ötőa2 ötőe2 ötőé2 öt1pr öt1sc öt1st öt2t1a2c öt2tar öt2t1as öt2t1ál öttá2r ött1erk ött1érte öt2t1ut öt1uj öt1un öt1u2t öt1ü2l ötve2n1ez ö1u ö1ú ö1ü ö1ű öv1ab öv1ak öv1á2r öv1e2dz öve2g1a2 öveg1és öveg1g öve2go öv1e2r öve2t1a2 öve2teg öve2t1é2l öve2to öve2t1ú övetü2l öve2t1ülé ö2vé. öv1ég öv1é2j övé2nyel övé2nyer övé2nyö övé2sza övé2szá övé2szer övé2szo övé2szö övé2szül övi2dá ö2vih övis3s ö2viv öv1or öv1ó2d öv1ölt övőrés3s öv1ut öz1ab öz1a2c öz1a2d öz1a2j öz1a2k öz1a2l öz1a2m öz1a2n öz1a2p öz1a2r öz1at öz1au öz1az öz1á2g öz1ál öz1á2m öz1á2p öz1á2r öz1á2t özát1é öz1d2r ö2z1e2b ö2z1e2d öze2gel ö2z1egés özegész1 ö2z1e2gy ö2z1ela öze2leme ö2z1e2m öz1eng öz1ent öz1epr ö2z1er ö2z1es öze2t1é2k özető2 öze2t1őr ö2z1e2v ö2z1ég ö2z1é2je özé2k1e2l öz1élel öz1é2let. öz1é2lé öz1élm öz1élt özé2m öz1éme özé2p1a özé2p1el özé2p1em özé2pí öz1épít özé2p1o ö2z1ér. ö2z1érb ö2z1érd ö2z1érh ö2z1é2ri özér2t1e2h ö2z1értele ö2z1érté ö2z1értő ö2z1érv ö2z1érz öz1étk öz1fr özi2g ö2z1iga özigaz1 ö2z1igá ö2z1igé ö2z1igy ö2z1i2ko ö2z1ikt ö2z1ill ö2z1i2m ö2z1inf ö2z1ing ö2z1inp ö2z1int ö2z1inú ö2z1inv ö2z1ira öz1irá ö2z1i2ri öz1iro ö2z1iró öz1isko ö2z1ism ö2z1isp ö2z1i2sz ö2z1iz öz1ír öz1íz özmeg1g öz1ob öz1o2k öz1ol öz1op öz1os öz1ov öz1ó2h öz1ón 1özönt ö2z1ö2r öz1össz ö2z1öv özőa2 özőe2r öz1őr. öz1őrk öz1ő2rö öz1pl öz1p2r öz3sa öz3sá öz3se öz3sé öz3s2k öz3so öz3s2p öz3sú öz3sz öz1t2r öz1ug öz1u2n öz1ur öz1ut öz1ú2r öz1út ö2z1üd ö2z1ü2g öz1ünn ö2z1üt ö2z1üv ö2z1ü2z öz3zs 2ő. ő1a őa2da őa2dá őadás1s őadá2sz őa2do őa2dó őa2du őa2ga őa2gá őa2gi őa2gy őagyag1 őa2ja őa2já őa2ka őa2ká őa2kó őa2la őala2g1 őa2l1e őa2lo őa2mő őa2na őa2no őa2nó őa2nyá őa2pa ő2apar őa2pá őa2po őa2pó őa2pu őa2ra őa2rá őa2ri őa2ro őa2sz őa2to őa2ty őa2ul őa2ur őa2ut őautói2k őa2va őa2xi őa2zo ő1á őá2cs őá2gai őá2gak őá2gas őá2gat őá2gá őá2gé őá2gi őá2go őá2gú őá2gy őá2hí őá2la őá2lo őá2mí őá2po őá2ra őá2rá őá2re2 őár1em őá2ri őá2ro őá2ru őá2rú őá2sa őá2sá őá2so őá2só őá2su őá2sz őá2ta őá2t1á2 őá2t1e2 őá2té őá2tí őá2tü őá2vó őba1p őb2le őb2lo őb2ri őb2ro őb2ró őb2ru őc1ap őc3cso őc1gr őc3há őc3hé őc3hö őc2lu ő2cs1ala őcsa2p1á2g ő2cs1é2j ő2cs1é2rü őcs1őst őcs1s őc3sz őd1a2da őd1a2dá ő2d1a2lap ő2d1au őd1ál őd1á2z ődea2 ő2d1e2g őd1eld őd1elj őd1elk őd1e2lő őd1els ő2d1ép ő2d1érte ő2d1érz ődé2sa ődé2so ődés3s ődé2s3z ő2d1id ődi2g ő2d1iga őd1ind őd1int ő2d1isk ő2d1op őd1ost ő2d1ö2l ő2d1öv őd1őr. őd1ő2ré őd1őrn őd1őrr őd1őrt ő2d1őst őd1pr őd2ram őd2rap ő1d2rá ő1d2res ő1d2rog ő1d2ró ő1d2ru őd1st őd1t2r ő2d1üg ő2d1üz ő2d3zá ő1e őe2ce őe2cs őe2dé őe2dz őe2ge őe2gé őe2gy őe2ke. őe2kék őe2la őe2l1á2 őe2lek őe2lemé őe2lemg őe2lemh őe2lemm őe2lemn őe2lemr őe2lemü őe2li őe2lo őe2lö őe2lőd őe2lü őe2ma őe2me őe2mé őe2mu őe2ne őe2pi őe2po őe2re őe2ré őe2rőd őe2rőé őe2rőh őe2rői. őe2rők őe2rőm őe2rőrő őe2rü őe2sé őe2si őe2ső őe2ta őe2te őe2ti őe2un őe2vé őe2vi őe2vo őe2vő őe2ze ő1é őé2de őé2et őé2ge őé2gé őé2gi őé2gő őé2hem őé2hes őé2ji őé2ke őé2ké őé2kí őé2lé őé2lő őé2lű őé2nekb őé2neke őéne2kest őé2neké őé2nekk őé2nekr őé2pí őé2pü őé2rem őé2ren őé2rez őé2ré őé2ri őé2tek őé2va őé2ve. őé2vek őé2ves őé2vet őé2véb őé2vén őé2vér őé2vét őé2vi őfa2l1a2d őf2la őf2le őf2lo őf2ló őf2lö őf2lu őfo2kál őfo2kér őfo2kin őf2ra őf2rá őf2ri ő1f2ro őf2rö őgé2p1e2l őgépü2l őgép1ülé őgés3s őg2le őg2ló őg2nó ő2g1ö2l őg2ra őg2rá őg2ri őg2ró őguba2 őgy1a2la őgy1art ő2gyeg ő2gyel őgy1e2lő őgy1elv őgy1elz ő2gyin ő2gy1ör őhangá2 őhan2g1ára ő1i ői2dea ői2deá ői2deg ői2deo ői2dén ői2do ői2dő ői2ga ői2ge ői2gé ői2gy ői2ko ői2ma ői2má ői2mi őim1p2l ői2nas ői2on ői2pa ői2ra ői2rá ői2ri ői2ro ő2iru ői2si ői2sz ői2tala ői2talá ői2talé ői2tali ői2tall ői2va ői2vá ői2vó ői2zé ői2zo ő1í őí2gé őí2ja őí2ra őí2rá őí2ro őí2ró őí2ru őí2vá őí2ve őí2vé őí2vi őí2vükb őí2vüke őí2vün őí2vű őí2ze őí2zü őí2zű ője2gy1á2 őjob2b1ol őjob2b1ó őjogá2szi őke1k2 őke1p2 őkes2 őke1sp őke1st őké2p1el őké2s1el őkiá2 őkie2 ők2la ők2le ők2li ők2lí ők2ló ők2lu őkóro2 ő1k2ra ő1k2rá ő1k2reá ők2red ő1k2ré ő1k2ri ő1k2rí ő1k2ro ő1k2ró ők2va őleí2 őlés3s őlőé2r őlőt2 őlő1tr őma2gár őmag1g őma2g1ó2 őműé2h őműé2n őműt2 ő2n1e2ke őn1ems őnéve2 őnév1es ő2ny1a2d őnya2g ő2ny1aga őny1a2la őny1ára őny1á2ro ő2nyát ő2nyef őnye2lem ő2ny1elh ő2ny1ell ő2ny1elo ő2ny1em ő2ny1élv ő2ny1ő ő2nyüz ő1o őo2áz őo2be őo2dú őo2ká őo2k1i2 őo2kí őo2ko őo2la őola2j1á2r őola2je őo2pe őo2rá őo2ri őo2ro őo2so őo2ve őo2xi ő1ó őó2ce őó2ha őó2no őó2nu őó2ra őó2rá őó2ri őó2va őó2vó ő1ö őö2bö őö2dé őö2ko őö2kö őö2lé őö2lő őö2na őö2re őö2rö őö2ve őö2vé őö2vi őö2vö őö2zö ő1ő őő2re őő2ré őő2ri őő2rö őőr2s1égb őőr2s1égn őő2se őő2si őpárba2jo őp2la őp2le őp2lé őp2ne őponc1 őpo2ral őp2re őp2ré őprés1s őp2ri őp2ro őp2ró őp2sz őr1a2dó őr1a2gá őr1agg őr1ajk őraj2t1ól őr1akc ő2r1a2l őral1e őra2n őr1any őr1ap ő2r1a2r ő2r1a2s ő2r1at ő2r1au ő2r1a2z 1ő2r1áb őrádi2ók őr1ágy őrá2k1e ő2r1á2l ő2r1á2p őr1á2ru 1őrbí 1őr1bl 1őr1br 2őrea őreá2li őree2 őre2get őr1e2gye őrei2g ő2r1ekc ő2r1ekh őre2lem őr1elh ő2r1ell őr1e2lőa őr1els őr1elt ő2r1elv ő2r1emb őr1eml őren2d1ő2 őr1enz őreo2 őre1prog ő2r1e2ső őreu2 őreü2 ő2r1ex 1őrezr 1ő2r1ég. 1őrégn 1őr1égt 1ő2r1ékh őr1ékné őr1éks ő2r1é2l őr1épü ő2r1é2ri őré2sa őré2sza 1ő2réü őr1é2ve. őr1é2vek őr1fl 1őrfő őr1fr őr1g2r ő2r1i2d ő2r1if ő2r1i2ga ő2r1i2gá őr1iha őr1ill ő2rim őr1imi őr1i2na őr1ind ő2r1inf ő2r1int őr1i2pa őri2s1á őr1ivá őr1i2zé. ő2rizg őr1izm őr1i2zo őr1ír 1őrjö őr1k2l őr1k2r 1őrlö ő2r1okt őr1old 1ő2r1o2li őr1oll ő2r1or ő2r1osz ő2r1ó2r ő3rög 1ő2rökü ő2röl 1őrömü őr1öng ő2r1ör ő2r1össze 1ő2r1őr ő2r1ő2s 1őrősr ő2r1ő2z őr1pl őr1p2r 1őr1p2s 1őrs. őr2s1ál 1őrsí 1őrsö őr1s2pe őr1spi őr1srá őrs3s őr1sz2 1őrszen őr2s3zöm 1őr1t2r 1ő2r1un 1ő2r1u2r őr1utá ő2r1új őr1úr ő2r1út ő2r1üd őr1üld 1ő2rüle ő2r1üs ő2r1üt ő2r1üz 2őrzősö ő2s1ad ő2s1a2g ős1ajtób ő2s1ajtók ősa2n ős1ana ősa2p ős1arc ős1ass ős1au ő2s1áb ő2s1á2g ősá2l ős1áll ős1ára ős1árv ős1dr ős1e2d ő2s1e2ge ő2s1e2gy ős1elm ős1e2lő ős1elv ő2s1e2m őse2n ős1ene őse2p ős1epi ős1epo ős1e2rej ős1erő ős1ess ős1esz ős1etn ő2s1e2v ő2s1ez ősé2g1e2l ő2s1éger ősé2gés ő2s1ék ő2s1é2l ős1ép ős1fl ős1fr ős1gn ős1gr ő2s1i2d ő2s1if ősi2g ős1iga ős1i2ma ős1i2má ős1imi ős1inf ős1ing ős1int ő2s1i2pa ős1i2ra ős1ist ős1i2sz ő2s1i2z ősí2ka ős1í2ró ős1í2z ős2kál ős1kl ős1k2r ős1kv ős2lat ős2nit ős1ob őso2k ős1oko ő2s1o2l ő2s1op ő2s1org ő2s1os ős1óc ős1óri ő2s1ö2l ős1önz ősö2r ős1örd ős1öre ős1örö ős1örv ő2s1ö2z ős1őr ős1ő2s ős2pec ős2pek ős1p2l ős2pór ősp2r ős2rác ős1sk ős1s2p ős1s2t őssz2 ős3sza ős3szá ős3szeg ős3szek ős3szell ős3szem ős3szen ős3szer ős3szes ős3szék ős3szén ős3szf ős3szi ős3szí ős3szl ős3szo ős3szó ős3szö ős3sző ős3szu ős3szü ős2tad ős2tat ő1s2tát ő1s2teri ős2tég ős2til őst2r ős1tre ős1un ősu2t ős1uta ős1úr. ős1ú2s ősza2k1e ősza2k1ü ősz1e2lő 2őszerk ő2szerő ősz1est őszi2l1i2 ősz1ill ősz1ist őszö2l ősz1ölé ősz1ölő ősz1ölt ős3zse ősz3sir őszt2 ő2s3zűrű őtermo1 őtermosz2 őtes2t1ő őtol2l1a2d ő1t2ra ő1t2ré ő1t2ri őt2ro ő1t2ró őttes3s őt2tés őtt1int őt2t1o2 őt2t1u2 őtűfé2 őtűfél1 ő1u őu2go őu2ni őu2ra őu2rá őu2ru őu2ta őu2tó őu2tu ő1ú őú2jo őú2ré őú2ri őú2ro őú2sz őú2té őú2ti őú2to ő1ü őü2dü őü2ge őü2gy őü2le őü2re őü2rí őü2sz őü2te őü2té őü2ti őü2tö őü2tő őü2ve őü2vö őü2ze őü2zé ő1ű őű2ré őű2ri őű2rö őű2zé őű2ző ővasfé2 ővasfél1 ővár1al őve2r1a 2ővet ővé2res ővé2ret őz1abs ő2z1a2d őz1a2g ő2z1ak ő2z1a2l ő2z1a2t ő2z1au ő2z1ál őz1á2t1e2 őz1bl őzeg1g őze2g1i őz1e2gy 1ő2zekn őz1elo őz1els őz1elv ő2zem őz1emb őz1e2mel ő2z1e2r őze2t1a2 őze2t1eg őze2t1el őze2ter őze2t1o ő2z1ér. őzé2rem ő2z1é2ri ő2z1érl őz1érté 1ő2zié ő2zi2g őz1igé ő2z1in ő2z1iz őz1k2r őz1o2k őz1ol őz1os őz1össz őzőa2 őzőe2l őzőe2r őz1p2r őz3saj őz3sap őz3sát őz3sik őz3sis őz3s2t ő2z3sü őz3sz őz1t2r őz1út őz1üg ő2z1üs ő2z1ü2z őz1ű2z 2p. 1pa 2p1abl pa2cem pa2ch pa1cl pa2csú p1a2dag pad1ala pa2d1as pa2d1á2l pade2 pa2d1el pa2d1em pa2d1id pa2d1iga p1a2dott pa2du. pa2dut pa2dül pae2r paé2r pa1fl pa1f2r pa2ga. pai2dé 2p1ajtó pa2kad paka2r1ó pa2k1e2m pa2k1ér. 2pakku pa1klu pa2k1ó2 pa1k2ré 2p1akta. pak2tal pak2t1e2l pak2t1es pak2t1e2v 2p1akti pak2t1or. pak2t1orr pak2tos 2palag pala2g1ú pa2lapí paláza2d palá2z1adá pa2l1é2l 2p1alf 2p1alg 2p1alle 2p1almá pal1ud pam1ass pa2m1ur pamu2ta pana2d pa2n1ag pa2nal pan1ala pa2n1á2r panás1s pan1d2 pang1g pa2n1il pan1kro p1anny pa2nol pans2 pansz2 pan1szt pa2nü 2p1a2nya p1a2nyu pa2p1ad pa2p1a2pa papa2r pap1ara pa2p1aszt pap1áll pa2p1il pa2p1i2na. pa2p1i2p pa2p1o2ku pa2pö pap1p2 pa2p1ur pa2p1u2t pa2pú 2para. para2je par1a2la 2parann 2p1a2rany 2pa2r1a2r pa2r1ágá pa2r1ágn pa2r1ágo pa2r1ágv 2paráh 2p1a2ráj par1áll 2parár 2paráv 2parb 2p1arc. 2p1arca 2p1arcc 2p1arch 2parci 2p1arco 2p1arct 2p1arcu 2p1arcú pa2r1el pa2r1é2l 2parig 2paril pa2r1ill par1isk par2k1a2l par2k1á par2kel par2k1ing par2kov par2kó par2kön par2k1ö2v par2k1ő2 par2k1ü 2paros. 2parosi 2paroso pa2rö pa2rő 2parr pars2 par2tem par2t1ol par2t1ő2 pa2r1ü2 pa2rű past2 pasz1alj pasz1alt pa2szas pat1ada patakö2 pa2t1alk pat1anya pa2t1ara pat1álc pa2t1árk pa2t1e2g pa2t1ell pate2s pa2tél pa2t1ér. pa2t1érd pa2t1ére pa2t1érte pa2tid pa2t1int pa2tir 2p1atka. 2p1atkánk pa2t1old pa2t1olt 2patombe pa2t1osz pa2t1otth pa2t1ut pa2tús patü2 pa2t1üz 2p1a2tya 2p1a2tyá 2paur pau2ra p1a2vat pa1wh 2p1a2xi 1pá 2p1á2bé 2p1ábr 2páca 2pácá pá2c1e pácé2 pá2c3h pá2c3só pá2csö pá2csü 2p1ág. 2p1á2ga 2p1ágg 2p1ágy. 2p1á2gya. 2p1á2gyac 2p1á2gyad pá2gyaib pá2gyaid pá2gyaih pá2gyaik pá2gyaim 2p1á2gyain pá2gyair p1á2gyakb pá2gyaké pá2gyaki p1á2gyako 2p1á2gyakr pá2gyakt 2p1á2gyal 2p1á2gyam 2p1á2gyan pá2gyast 2p1ágyaz 2p1á2gyáb 2p1ágyál 2p1á2gyán pá2gyátó 2p1á2gyáv 2p1ágyb 2p1ágyc 2p1ágye 2p1á2gyé 2p1ágyf 2p1ágyga 2p1ágygo 2p1ágyh 2p1á2gyi 2p1ágyj 2p1ágyk 2p1ágyl 2p1ágym 2p1ágyná 2p1á2gyos 2p1á2gyö 2p1ágyp 2p1ágyr 2p1ágys 2p1ágyt 2p1á2gyu pá2gyú 2p1ágyü 2p1ágyv 2p1ágyz 2p1ájt pála2 pá2lab pá2lac 2p1álar 2p1áldo pá2le p1álla. 2pállap 2p1állí 2p1állom 2p1állv 2pálmo pá2lü p2ály pálya1s 2pámi 2p1á2mí pá2mu pána2 pá2naf pá2n1am pá2n1an pá2nar pá2n1as pá2nár pá2n1e2 pá2nék pá2nil pá2nir pá2nis pá2ní pán1kré 2pánkt pá2n1ó2 pá2nö pá2nő pán1sz pánte2 pán2tek pán2t1el pá2nü pá2ny1ad pá2ny1a2l pá2ny1a2n pá2nyar pá2nyat pá2nyau pá2nyaz pá2ny1e2 pá2nyérd pá2nyim pá2nyö 2p1á2po pár1adó 2páras 2páráé pár2d1a2 pár2del pá2r1e2 pá2r1i2p pá2rő pár1s2 pár2t1ag 2pártal párt1any pár2tari pár2tál párte2 pár2t1el pár2tem pár2tes pár2tet pár2tél pár2t1ér. pár2t1é2te pár2tiz pár2tott pártö2 pár2tök pár2t1ő pár2tus pártü2 pár2t1üz pá2ruh pá2ruk páru2t pár1utu pá2rún pá2rü 2p1á2sás pá2s1e pá2sir pá2ső pás3s pá2s1ü2 2p1ásván pá2t1a2 pá2tá pá2tel pá2t1e2m pá2tis 2p1átka. 2p1átkát 2p1átkáv p1átlag 2p1átló pá2t1or 2p1átrak 2p1átté pá2t1uk pát1úrt pá2tü 2p1átvét pba2l1 pbé2r1e2l pb2lo pb2ra pb2ri pb2ro pci2ófo pcsa2p1á2g pcső2s1orr pda2l1ad pdal1an pda2leg pda2lel pda2l1es pda2lén pda2l1í2 pd2ra pd2rá pd2ro pd2ró 1pe pea2p pea2r peca1 pec3c pe2cz pe2ed 2p1eff pe1fl 2p1e2gese pegész1 pe1g2r 2p1egz 2p1e2ke. 2p1e2kei pe1k2ré 2pektr pe2lál pe2lár pe2lekt 2pelemb 2pe2lemek pe2lemet 2p1e2lemé 2p1e2lemg 2p1e2lemh 2p1e2lemi 2p1e2lemk 2p1e2lemm 2p1e2lemn 2pelemr 2p1e2lemz pel1eró pele2t pel1ete 2p1elgo 2p1elha 2p1elhel 2peljá 2p1elleb 2p1elnev 2p1elny pe2los 2p1e2lö 2p1e2lőa 2p1e2lőá 2p1e2lőe pe2lőg 2p1e2lőh pe2lőí 2p1e2lőjá 2p1e2lőjeg 2p1e2lől 2p1e2lőz 2p1elren 2p1elsö 2p1eltá 2p1elto 2pelu 2p1elv. 2p1elvá pel2v1el 2p1elven 2p1elvh 2p1elvi 2p1elvo 2p1elvű 3pely 2p1elz 2p1ember 2p1e2mel 2p1e2més 2p1eml 2p1ems 2p1e2mu 2p1e2ner 2penged pen3ny. pen3nyb penny1ér pen3nyh 2p1ennyi. pen3nyj pen3nyk pen3nym pen3nyn pen3nyr pen3nyt pen3nyv pe2nya penyá2 pe2ny1e2l pe2ny1e2r peo2l peo2p peó2r pe2pe. 2p1e2pé pe1p2r pe2r1akt per1all pera1p2 perc1c per2c1el per2c1in 2perdő perec1c peregyez1 p1e2rej pe2r1elk pe2r1e2lőf pe2r1e2lőké pere2mért per1evé 2perfa pe2rid pe2r1il pe2r1i2na pe2r1i2ná pe2r1ind pe2r1ing pe2rí per1k2 p2erl per1okt pe2r1os pe2r1o2x pe2r1ó2r pe2rőd pe2rőf pe2rői pe2rőm pe2rőn pe2rőr 2p1e2rős pe2rőt pe2rőv per1st persz2 pe2rú pe2r1ü2g perü2l per1ülő per1ült p2erz pe2s1ebbel pe2s1ebbő pe2sésig 2p1e2sésű pe2sői pe1s2p 2p1esszév pes2t1a2 pes2t1er pe2szak pe2sz1ál pesz1ell pe2sz1elv pesze2m pe2szeme pe2szu pe2sz1ü2l pe2tal pe2t1a2n pet2á petet2 2petete 2peteté 2p1e2tető 2p1e2tika 2petim 2p1e2to pet2t1i pe2tűd pe2ug pe2vő 2p1ezr 1pé pé2csu pédü2 pé2d1ülé 2pééb 2pééi 2péén 2p1é2ge 2p1é2gé pégés3s 2p1é2hen 2p1é2hes 2p1é2het 2p1éhs 2p1éj. péje2 pé2j1eg 2p1é2ji 2p1éjj pé2k1as pé2k1au pé2k1á2 pé2k1er pé2k1ék pé2k1é2l péké2t pé2k1éte pé2k1i2n pé2kis 2p1él. 2p1élb pé2le. pé2lei pé2lek péle2l pél1ele pél1elmei pé2len pé2let 2p1é2lé 2pélm 2p1éln 2p1é2lő 2p1élt 2p1é2lű 2p1élv 2péneka 2p1é2nekb 2pénekd 2p1é2neké 2pénekf 2pénekg 2p1é2neki 2pénekí 2pénekj 2p1é2nekk 2p1é2nekn 2p1é2nekr 2p1é2nekt 2p1é2nekü pé2ny1el pén2z1a pén2z1á2 pén2zs pé2p1i2p 2p1é2pí 2pépü 2p1érc 2p1érd 2p1é2ré 2p1érh pé2rig 2p1é2rin 2p1érm 2p1érn 2p1é2rő. 2p1érr 2p1érte 2p1érté 2p1értő 2p1érv 2p1érz pé2s1aj pé2sal pé2s1e2l pé2sés péskész1 pé2so pés3sza pé2s1ü2t pé2sza pés3zaj pész1ak pés3zav pé2sz1á2 pé2sz1emb 2p1é2széné pé2szin pé2sz1o pé2sz1ö pész3s pé2szu pé2szú pé2sz1ű péta1 pé2tel 2p1étk 2pétl p1étla 2p1étr 2p1étv 2p1év. 2p1évb 2p1é2ve. 2pévei 2p1é2vek pé2ven pé2ves 2p1é2vet 2p1évf 2p1évh p1évk 2p1évn 2p1évr 2p1évs 2p1évt 2p1évv pé2zak pé2z1ár pé2zel pé2z1e2m pézi2 pé2zid pé2zin pé2ziz pé2zol pé2zsa pé2zu p2f1ép pfi2úé pfi2úkér pf2lo pf2ló pf2lu pf2rá p1f2re p1f2ri p1f2rí p1f2ro pf2ru pf1st pg2ra pg2ru pg2rü pha2de p2ha2i 1phanész 1p2hed phelyü2kü 1p2hia2 p2hic 1phila 1p2hoi phó2i 1pi pi2aa pi2aá pi2aba pia2cel pia2cél pia2cik pia2c3se pi2ad pi2ae pi2aé pi2ag pi2ah pi2aj pi2akén. pi2al pi2am pi2ao pi2aö pi2ap pi2aré pi2asza pi2at pi2aú pi2aü pi2ave pi2az 2picc pi2ce. 2picl pida2 pi2dan pi2dea pi2deá pi2dei pi2den pi2deo 2p1i2dom 2p1i2dő 2p1i2du pi2eg pi2er pi2ég pi1fr 2p1i2ga 2p1i2ge 2p1i2gé 2pigo 2p1ihl pi2k1ö pil2i pilis3s 2pilles 2p1illet 2pillés 2pillu 2p1i2ly 2p1i2má 2p1i2mi 2p1imm pinak2 pina1p 2pind 2p1inf pin2gas pin2g1á2r pin2gelj pin2gép pin2gos 2p1ingó 2pinj 2p1inp pin2tác pin2t1or pin2tőr pintu2 pin2tur pi2nü 2p1inv 2p1inz pion1n pi2óa pi2óá pi2óe pi2óf pi2óg pi2óki pi2ól pi2óma pi2ómé pi2óo pi2óp 2pipai 2pipar. 2p1i2pará 2piparb 2piparh 2piparn 2piparr 2p1irh 2p1i2rod pisau2 2pisko pi2s1op 2p1iste 2p1isza piszkos1s pi2t1aj pi2tala pi2tall pi2t1a2n pi2t1á2p pi1tä pi1the pitos1s pi2t1ü2 pi2vás 2p1i2zé 1pí pí2gé pí2já pí2né pí2r1a2 pí2rá pír1ál pír1á2r 2p1írás pí2r1e2 pí2r1in pír1i2s pí2rí pí2rol 2p1í2ró pí2r1ö2 pír1s pírt2 pír1tr pí2rü pí2rű 2pítél 2pítm pítőa2 pítőe2l pí2ve pí2ze pí2zé pí2zü pí2zű pke1p2 pke1s2 pkés1s pkia2 pkiá2 pkie2 pk2la pk2li pk2lí pk2lu pk2rá pk2re pk2ré pk2ri pk2ro pk2ró pk2va pk2vó p2lacc pla1k2l pla2pal plap1áll pla2p1osz p2latf 1plazmá pleí2 ple2t1a2n ple2t1e2l pléé2 plé2has pli2s3zá plo2m1e plo2mén plom1ol plót2 pló1tr plő2sa plő1stá plő2szár plu2m1e p2lur pmás1s pmeg1g 1po po2be pocsi2 po2cs1iz po2da. po2dz pogás1s po2in poki2 2p1o2k1ir po2kí 2p1okle po1k2ló 2p1okm poko2la pokol1l 2p1okta 2p1oktá polás1s pol2can polc3c pol2c3s 2p1olda polóá2 2poltár 2p1oltás 2p1olti 2p1oltó 2polvas po2n1a pon2c3so po2nel pon2g1e poni2 po2niz pon3n po2n1osz pon2t1a2d pon2tag pon2t1a2l pont1any pon2tál pon2tár ponte2 pon2t1el pon2tem pon2ten pon2tes pon2ték pon2t1ér. pon2t1éte pon2tisz pon2tí pon2t1ő2 2ponz po2ol po2p1a2 po2p1á2 2popc 2po2pe pop1el popi2 po2pik po2p1in po2p1ir po2pis po2p1o2l pop1p2 pop1s popsz2 2pop1t2 po2pú po2pü po2r1a2c po2r1ag po2rakk por1ala por1all po2ram pora2n por1any po2r1a2r po2rat por1ács por1áll por2can por2c3h por2c3sí pore2 po2rec po2res por1f2 por1g2 po2rid 2porie po2rih po2r1il po2r1i2m po2r1in por1k2 po2rö po2rő por2tamb por2t1au por2t1á2rá por2tárb por2tárn por2tej por2t1em por2tet por2tél por2t1ér. por2t1érk por2t1i2k por2tiz por2t1ív por2tur por2t1usz por2túr por2tű po2rü 2p1orvo pos3szo pos3szö 2postol 2p1osty po2sü po2sze po2szí 2p1oszl posz2tü po2tab po2tad po2t1a2l po2tan po2t1a2u po2t1e2l po2t1inf po2t1ip po2t1í2 po2tol po2tö po2tus po2tü po2vi 1pó pó2ce pó1fr pói2g pó2k1ass pó2kau pó2k1e2l pó2kem pó2ket pó2k1id pó2kim póki2s pók1isz pó2kiv pó2k1ös pó2k1ú pó2l1an pó2l1á pó2lom 2p1ó2né. pó1p2r p1ó2rad pór1á2sz póre2 pó2reg pó2rem p1ó2riá pó2rö pó2s1or pós3s pó2s1ü2v póta2 pó2t1ad pó2tal pó2t1an póté2r pó2til pótü2 pó2tül 2póün 2p1ó2vó pó2ze pó2z3sá 1pö pö2ka pö2ká pö2kel pö2ker pö2kid p1ö2ko pö2ku pö2kú pö2lye 2pönt pö2ra p1ördö pö2res 3pörg pö2ro pö2r1ő pö2rú 2p1öss p1ötl pötty1in 2p1ötv pö2ve 1pő pőa2n pőá2g pő1bl pő1dro pőe2r pőé2h pőé2l pő1kl pő1pl pő1pr 2p1őr. pő2ri. p1őrj p1őrl 2p1őrn p1őrs 2p1őrt p1ő2rü 2p1őrz pő1sz pp1ada ppai2 ppa2j pp1ajá pp1akk ppa2nad ppa2n1ell ppan1k2 pp1any pp1arc ppa1s pp1áll p2p1árj p2p1á2rok pp1átm p2p1á2to pp1átv p2p1e2gy p2p1e2kéh p2p1elo p2p1elr ppe2r1a ppe2ró p2p1ég p2p1éks pp2hó ppin2g1e2 pp1íg pp1kl pp2las pp2lat pp1o2ly p2p1o2rom ppor2t1á2r ppor2t1e2 ppor2t1ő2 p2p1ó2l pp1órá pp1ön pp1öv pp1ö2z p1p2ref p1p2rem p1p2rez p1p2rém pp2rin pp2rio p1p2roc p1p2rod p1prof p1prog p1proj p1p2ros p1p2rot pp2rób pp1sp p2p1úg p2p1úr. ppví2 ppvíz1 1p2rax p2remi 1p2repa pressz2b 2pret pret2á 1p2rédi p2rép pré2sa pré2s3zá p2riccs p2rius p2rizm prí2m1e2l prí2mem 1probl 1p2roce p2rof 1profe p2rog p2roj 1proje pro2mo p2ropa 1p2rote 1proté 1p2roto 1p2rovo 1próbá pró2d1e pró2dz 1p2róza pru2s1ág pru2se 1p2rüs p2s1a2d psé2gel ps1i2ha ps1í2ze p1s2ká p1s2mi p2s1ón p2s1ö2z p1s2pe ps2pi p1s2po ps1pr ps2rá ps3szó p1s2tá ps2ti p1s2tí ps2to p1st2r ps2tu p1s2tú psza2k1ü psz1any p2sz1as psz1atl p2sz1ág ps3záp p2szég psz2fé 1p2szic p2sz1ill pszis3s psz1k2 psz1old psz1orn p2sz1ön p2sz1ös psz3s pta2d pt1ada pta2n1á2s pta2ne ptá2raj ptáró2 ptá2rór p2t1eg p2t1e2ke. p2t1e2lő p2t1els pte2rál pté2ká pté2k1el p2t1érd pt1i2ma. p2t1i2n p2t1i2o p2t1i2r p2t1í2r pt1kl p2t1öt p1t2rag p1t2ran p1t2rá pt2ré ptu2sze ptu2szi p2t1úrr p2t1üt 1pu pua2d pu2csor pue2l 2p1ugr 2puká pul2tas 2p1u2ni 2puno 2p1u2nó puo2r pu1pr pu2rak pu2ral pu2sad pu2sal pusa2n pus1any pu2sap pu2sál pu2s1átl pu2s1e2 pu2s1érté pu2sik pu2sis pu2sí pu2sol pu2sö pu2ső puss2 pussz2 pust2 pu2sü pu2szag pu2szal pu2s3zár. pusz1é2p pu2szö pu2tab pu2t1a2d pu2tak puta2n 2p1u2taz put1ing pu2tol pu2tód 2p1u2tóp pu1trá 1pú 2p1úrf pú2sz 2p1útb pú2té 2p1ú2ti 2p1útj 2p1útk 2p1útn 2p1ú2to 2p1útp 2p1útr 2p1útt 2p1útv 1pü pü2ge pü2gy pü2kü 2püle püle2t1o 2p1ünn pü2re 2p1ü2rí 2p1üst 2p1ü2te pü2té 2p1ütk 2p1ü2tö pü2ve pü2ze 1pű pű2ző pvá2r1al pw2hi pwhisky2 py2ba py2bó py2do py2ho py2ja py2já py2ka py2ké py2ki py2ko py2ma py2na py2ná py2ra py2ró py1t2h py2tó py2va py2vá pze2t1a2 pze2t1á2 pze2t1e2r pzőa2 pzőe2 pzőé2 2q. 1qa 1qá 1qe 1qé 1qi 1qí 1qo 1qó 1qö 1qő 1qu qu2ae qu2at qu2er qu2ez que2zi qu2éb qu2ie qu2ij qu2il qu2in qu2is qu2od 1qú 1qü 1qű 2r. 1ra raa2d raáta2d ra2bad rab1asz rab1á2ra rab1árb rab1árr ra2b1át ra2b1ele ra2b1ell ra2bid rabi2g ra2b1iga ra2b1igá ra2b1im ra2b1i2na. ra2b1i2ná ra2bind ra2b1int 2rabla ra1bri ra2buj ra2c1aj rac3csa ra2cet ra2cha rac3hig ra2c3hok ra2c3hos ra2c3hot 2r1a2cid rac2kar rac2kit rac2k1ö2 rac2kü ra2dag ra2dalé rada2rad 2radaté radás1s ra2de. r2a3dí 2radíc 2radm 3radósi. 2r1a2dóz ra1drá ra1dru 2r1a2du. ra2dus rae2r raé2derb raé2dere raé2derh raé2dern raé2derr raé2dert raé2r rafikus1s ra1fl 2r1a2ga. ra2gak rag1alo ra2g1ác ra2gáé 2r1a2gán rag2de ragdi2 rag2din ra2gel ra2g1i2na. 2r1agy. ra2gyat 2r1agyn ra2gyon 2r1agyr rai2o 2raizá 2raizi 2raizn 2raizó 2raizu ra2j1a2d ra2j1au ra2j1á2ru ra2j1es ra2jin 2rajkáró 2r1ajkú rajob2 raj2t1e2l raj2t1en raj2zat raj2z1e raj2z1ón raj2z3s 2r1a2kara rak2kép rak2kis ra1k2li ra1klo ra1kló ra1klu 2raknáb 2raknái r1a2kóz rak2re ra1k2ré ra1k2ri rak2rom raktus1s 2r1a2kus r2alab 2r1a2la2g1 2ra2laku ra2lapa r1a2lapú ra2lázá ra2lázó 2r1alb 2r1aljai. 2r1alji 2ralk ralla2k ral2l1akó ral2l1at rallá2 ral2lág ral2lál ral2lev ralo2m1e ra2mab ram1ada 2ramai ram1akk rama2l ram1ala ra2m1any ram1áll ra2m1árá ra2m1árb ra2m1áre ra2m1árh ra2m1árn ra2m1árr ram1b ra2m1éhe ram1ide ram1i2ko ram1ill ra2m1im ram1ina ram1inf ram1ing ram1inj ra2m1i2p 2rammb 2rammet 2rammi 2rammj 2rammn 2rammr 2rammt ra2m1osz ra2m1ó2r ra2mö ra2mő ra2mü 2r1a2nal 2r1a2nat ranás1s ran2csal rancs1ág ran2cse ran2csik ran2cső rancs3z 2rand. ran2dat ran2d1au 2randj ran2dz ra2nek ran2g1a2 ran2g1á ran2ge rang1e2l ran2g1ó2 ran2gye ra2nil ra2nim 2ranka ran2szál ran2sze ransz1omb 2rany. ra2nyag rany1a2la ra2ny1a2n ra2nyap ra2ny1ar r1a2nyáit r1a2nyáka r1a2nyákh r1a2nyákk ra2ny1ál ra2nyás r1anyás. 2ranyb ra2ny1e2s 2ranyé ra2nyél 2ranyh ra2nyid ra2nyin ra2nyir rany1í2r 2ranyk 2ranyn ra2ny1ol 2ra2nyó rany1ó2r ra2nyö 2ranyr 2ranys 2ranyt ra2ny1ü 2ranza ra2óa ra2óá ra2óf ra2ólá ra2óm ra2óp ra2ósz 2rapa. ra2pák 2rapp rap2pin ra1p2re ra1pré ra1p2ri ra1p2ro 2rarann 2r1arany. 2r1a2ranya. 2r1a2ranyá 2raranyb 2raranyn 2raranyr 2r1aranyt ra2rat 2r1arco ra2rén 2r1art 2r1arz ra1s2ká ra1s2l ra1s2pe ra1s2po rassz1e 2rasszoc rast2 ra1s2ta ra1stá ra1str ra2sz1abl ra2sz1aj ra2szas ra2szat ra2szág ra2sz1árr rasz1emb ra2sz1étt ra2szób ra2szói ra2szón ra2szös rasz2t1a2ny rasz2t1el rasz2t1é2te rasz2tö rasz2tü ra2t1a2d rat1ajt rat1a2la rat1alt rat1ará 2r1a2tád rat1áll ra2t1árad ra2t1á2rai ra2t1á2rak ra2t1árb ra2t1árv ratát1a2 ratá2vi ra2t1e2g ra2t1elk ra2t1ell 2ratég rat1ége ra2t1érd rat1érke ra2térte ra2t1érv rat1ing ra2t1ír ra2t1íve 2r1atká 2ratlé 2ratoz. ra1t2ran 2r1attr ra2tür 2raty ra2tya ra2tyá ra2tyu ra2udi 2r1a2uk ra2ulá 2raum rau2n rau2ta rau2tá ra2uto 2r1autó rautóé2 raü2t raü2z 2ravató 2ravú ra2xü ra1ye ra1yé raz1ajt raza2n ra2z1any ra2zel ra2z1olt ra2zono 1rá rá1bre rá2cal rá2c1e rá2c3h rá2c1i2n ráci2óf rá2cö rá2csala rác3ság rá2csét rá2csir rá2cs1is rá2cú rá2cü rá2d1any 2rádáh 2ráddá 2rádju 2ráfha 2ráfhe 2ráfhi 2ráfid 2ráfre rág1ad 2rágam 2r1á2gaz rág1á2zá rá2gia rá2gil rá2gim rá2gis 2rágí rá2g1osz rágus4 rá2gü 2rágya 2rágyáb 2rágyáé 2rágyáh 2rágyái 2rágyáj 2rágyák 2rágyán 2rágyár 2rágyás 2rágyát 2rágyáv rá2gyu ráí2r ráj2k1a2 ráj2kel ráj2k1ó2 rá2jü rá2kát rá2k1ered rá2k1e2s rá1kla 2rákog rá2k1osz rá2k1ón rá2k1ó2r rá1krá rá1krét rá2l1ak rá2l1a2l rá2lana 2r1álar rála2t1e rá2lál rál1átl r1álcá 2r1áldá rá2lid rá2lim rá2lí 2r1állam 2r1állap 2r1állat 2r1állí 2r1állom 2r1álma rá2lü rá2lyal rá2ly1a2n rá2lyap rá2ly1as rá2lyav rá2lyús rá2lyút rá2mö rá2nal rá2n1a2n rá2n1a2t rá2n1ár rá2nás ránc1c rá2nék rán2gál rá2niz rá2ní rán1kl rá2nol rá2not rá2n1ó2 rán2sav ráns3s rán2t1ak rá2nü rá2ny1a2d rá2nyag rá2nyako rány1alt rá2ny1a2n rá2ny1ap rá2nyar rá2nyaz rá2ny1ár. rá2nyérm rá2nyérz rá2ny1í2r rá2nyol rá2nyó rá1p2l 2rápo rá2pol rá1p2r 2r1á2rad rár1a2dá 2r1á2rai 2r1á2ram 2r1á2ras 2r1á2rat rá2raz rá2ráb rá2ráh rá2r1ál rá2rár rá2rát rá2ráv rá2r1em rá2rér 2r1árh rá2riai 2r1á2riá rá2rin 2r1árj 2r1árl 2r1árn rá2r1ol r1ártó 2ráru rá2rul rá2run 2rárú rá2rú. rá2rút rá2rúv rá2s1a2d rá2s1akn rá2sal rása2r rás1ará rá2s1as 2rásatá rás1a2to rá2saz rás1á2ga rá2s1árad rá2s1árak rá2s1á2rá rá2s1á2ré rá2sás rá2ser rá2sis rá2s1ol 2r1á2só. 2rásób 2rásóé 2rásóg 2r1á2sóh 2rásói 2rásój 2rásók 2rásón rás1ó2ra 2rásóró 2r1ásós 2rásót 2r1ásóv rá2ső rást2 rás1tr rá2sut rá2szan rá2szas rá2sz1á2ru rá2sziv rás3zón rá2tad rát1a2da rát1ala r1á2tál rá2tég rá2tél 2rátép rá2t1i2o rá2tí 2r1átlé rá1tri rá1tro rátus1s rátú2 rá2túr 2r1á2tül rá2zal 2rázisb 2rázisé 2rázish 2rázisk 2rázisn 2rázisr 2ráziss 2rázist rázi2sz rá2zsal ráz4sá rázs1e2 rázsé2 rá2zsén rázsi2a rá2zsis rá2zsó rázs1ü2 rba2j1e rba2jokt rba2n1á rbátyá2t rbá2ty1áto r2b1ell r1b2la r1b2lo rb2lú rboc1c r2b1olda rbo2n1a2 r1b2ra r1b2rá rb2ri rb2ro r1b2ró rb2ru rbu2t1e rc1adá rc1ajt rca2lak r2c1alk r2c1ana rc1anya rca1p rc1ara rc1ará rc1ass rc1a2to r2c1ág r2c1á2l rc1ár. r2c1ári r2c1árn r2c1á2ro r2c1árr r2c1árt r2c1á2ru rc3csi rc3csí rc3cso rc3csó rc3csö rce2g1a2 rceg1g rc1egy rc1e2leg rc1elk rc1e2lőd r2c1els r2c1ember r2c1epe rc1e2ve r2c1ex r2c1ez rc1é2két r2c1éle r2c1é2lé r2c1é2li r2c1élm r2c1élü r2c1ép r2c1ér. r2c1érb r2c1é2ri r2c1érr rc1ész rc1fr rc1gr r2c3has rc3hel r2chen r2chig r2chom rc3hu r2c3hú r2c3hű rci2d r2c1ide r2c1i2ko r2c1ikr rc1ill r2cimá r2c1imi rc1i2na. rci2náb rci2náé rc1i2nár r2c1i2nát r2c1ind rc1i2oni r2c1i2pa r2c1isi r2c1isk r2c1ist rc1izm rc1i2zo r2c1íj r2c1ív r1c2ké. r1c2kéh r1c2kéi r1c2két r1c2ki. r1c2kia r1c2kig r1c2kok rc1k2ré rc1kv r1c2lu r2c1op r2c1o2r r2c1osz rc1ón rc1ó2r rc1óv r2c1öb r2c1ön r2c1ör r2c1ös rc1őr rc1pl rc1pr rcs1abl rcs1alak rcsa2p1á2g r2c3sara r2csarl r2c3sáp r2c3sár. rcs1áru r2c3sej r2cseleme r2cs1elr r2cs1érb r2csikr rcs1írás rc3s2ká r2c3sora r2c3soro rcsóna2k1á2 rcs1ős. rcs1p rc3s2pi rcs1s rc3sto rc3sz rc1tr r2c1ud r2c1ur r2c1ut r2c1új rc1üg r2c1ür r2c1üs r2c1üt rc1üv rc1üz rc1űz r2c3zá rc3zó rc3zs rc3zu rc3zú rda2cél rd1a2dat r2d1akc rda2l1í2 rd1alka rd1alko r2d1a2nya rda1p rd1a2rán r2d1arc rd1aszt r2d1azo rd1ács. rd1á2rak rd1árat rd1á2ron r2d1árv rdás1s rd1bl rd3dz r2d1e2g rde2k1a2 rde2ker rde2kék rde2kol rde2k1ö2 r2d1ela rde2sőt rd1exp rdező2p3 r2d1é2g rd1é2lé rd1élr rd1élt rd1é2lü r2d1ép r2d1ér. r2d1érd r2d1é2ri rdé2sa rdé2sza r2d1é2vé rd1fr r2d1i2d r2d1i2ga r2d1igé r2d1ima r2d1i2na. r2d1i2nai r2d1i2nát. rdio2x rd1izo r2d1íg r2d1íz rd1kl r2d1okta r2d1old rd1orr r2d1osz r2d1ou rdóa2 rd1ó2rá rdö2g1öl r2d1öl r2d1ös rd1öv rdő2s1orr rd1pr r1d2ram rd2rap r1d2raz rd2rog r1d2rót rd1sk rd1sp rd1st rdsza2k1 rd1t2r rd1udv r2d1urá rd1üg r2d1üt r2d3za r2d3zá rd3zo rd3zó r2d3zö rd3zsí r2d3zú 1re rea2d rea2j rea2ka rea2la rea2r 2reálá 2reáló 2r1eb. 2r1ebbő reb1egy 2r1e2béd 2r1ebh 2r1ebk 2r1ebm 2r1ebn 2r1ebs 2r1ebv re2caj re2cal re2cá 2recets re2ch rec3sar 2r1e2cset rec3sor re2cz re2dan red1elv 2redend re2d1e2r 2redeti 2redetű 2redény re2d1é2ves re2dir re2dor 2r1edzőb 2redzőj 2r1e2dzők 2redzőr 2r1e2dzőt 2redzőv re2et re2ew 2reff re2gap re2gas reg1áll re2gár reg1e2le reg1elh reg1ell re2g1elr reg1elv reg1eng reg1e2tető reg1e2vé regész1 re2gid reg1inj re2giz re2góc reg2óv re2gú regü2l re2g1ülé 2r1egy. 2r1egyb re2gye. re2gyed re2gyen 2r1e2gyes re2gyet 2r1e2gyez 2r1e2gyé 2r1egyh 2r1egyk 2r1egyl 2r1egyn 2r1egyr 2r1egys 2r1egyt re2gyün r1egyv rei2rá re2ja 2rejéé 2rejűe 2rejűn 2rejűr 2rejűt re2k1ag re2k1ará re2k1asz re2k1á2l re2k1á2p re2k1ár. re2kás rek1elh rek1elt rek1elü rek1erd re2k1e2rő reke2sz1á 2rekééh re2kéj re2kék 2r1ekék. rek1ékh re2kél 2r1e2kénk re2k1ér. re2k1érd re2k1érte 2r1e2kés. re2k1éss re2k1id re2kij re2kil re2k1ing re2k1int re2k1ip re2kír rek1k2 re1klu re2k1ok re2k1old rek1opt re2k1os rek1ott re2kór re2kök re2kötl re2kő rek1s reksz2 re2k1u2s re2küd re2k1üg rekü2l re2k1ülé re2k1ülő re2küt 2r1elad 2r1e2lág 2r1elbí 2r1elbo 2r1elc 2r1eldo 2r1e2lef 2relektr rele2ma 2re2leme. 2r1e2lemed rele2meg 2relemei 2re2lemek 2relemem. 2r1e2lememe 2relememm 2r1e2lemen rele2m1er 2relemes. 2r1e2lemese 2relemesn 2r1e2lemet re2lemezé rele2m1ér. 2r1e2lemtel 2relemük 2relemünk 2relemzé 2relemző 2r1e2l1eng 2relér 2r1elf 2r1elha 2r1elhá 2r1elhel 2r1elhú 2r1eljá 2r1elké rella2 rel2l1an 2r1ellá 2r1ellő 2r1elma 2r1elmééé 2relmééh 2r1elméi. 2relmél 2relméte 2r1elnev 2r1elnö 2r1elny 2r1e2los 2r1e2lőad 2relődei 2r1e2lődök 2relőnn 2r1előnye 2relőzm 2r1elso 2r1elszá 2r1elta rel2tár 2r1eltáv 2r1eltett. 2reltettk 2r1eltéré 2r1eltév 2relú 2r1e2l1ül 2relű 2r1elv. 2r1elvá 2r1elvb 2relved 2r1elvei 2r1elvek 2r1elvem 2r1elven 2r1elves 2r1elvé. 2r1elvéne 2r1elvér 2r1elvéü 2r1elvév 2r1elvh 2r1elvi 2r1elvk 2r1elvn 2r1elvo 2r1elvr 2r1elvs 2r1elvt 2r1elvü 2r1elvű 2r1elvv 2r1elz re2m1a2d re2m1asz re2maz re2m1ál re2mát 2rembar 2r1ember. 2r1emberb 2r1embere. 2rembered 2r1emberei 2r1emberek 2r1emberes 2r1emberé 2r1emberh 2r1emberi 2r1emberk 2r1embern 2r1emberr 2rembers 2r1embert 2r1emberü rem1ble r1embó 2rembr re2mel rem1e2lem 2r1emelé 2r1emelg r1emelk rem1előd rem1els re2m1eng re2m1esz re2m1ér. re2m1érm re2m1é2te re2migr re2m1ór re2mö re2m1ő2r rem1p2 2remuk 2r1e2mul rem1ur 2r1e2mus 2r1encik ren2d1e2r ren2d1ég ren2déj ren2dék ren2d1o ren2d1ö ren2d1ő2s 2r1e2ner renés3s 2r1enged 2rení ren2s1ég rens3s re2of re2óa re2óc re2óe re2óé re2óf re2óka re2ól re2óo re2óp re2ósá re2ósz re2p1aj rep1ana rep1asz re2pau re2paz rep1áll rep1álm re2pás re2pát re2p1e2g re2p1elf re2p1elk re2p1ell re2pelm re2p1eng re2p1ep 2r1e2per. re2p1erk 2repéd rep1é2j 2repénk 2r1e2pés re2p1i2d rep1ille rep1int re2pok 2reposz. 2reposzt. rep1osztó repö2 re2p1örö rep1pl rep1pr re2pú 2r1erd re2rei re2rej re2res re2rez 2r1erg re2róz 2r1e2rő 2r1ers re2sas re1s2c 2r1esemé res1epr rese2t1e2l 2r1esél 2reskü r1essi re2szaj 2r1e2szet resz1ív 2reszkö 2reszm reszta2 resz2t1an resz2tál resz2t1ár resz2t1í2v resz2t1o2r resz2t1os 2reszű. 2r1e2szűe re2t1ab re2t1akt re2tal ret1a2la re2tant re2t1a2ny re2tág re2t1ára re2t1áro ret1átf re2t1elb re2t1ell re2telm ret1emel re2t1erk rete2sz1á 2r1e2tetés. 2r1e2tetésé 2retetésn re2t1é2k re2t1él re2t1érb re2t1érd re2tid 2r1e2tika re2tiká ret1ill r1e2tilt re2t1ing re2t1int re2tis r1etnik re2t1ok re2t1old re2t1os re2tór re2t1örö re2t1ö2v ret2t1est ret2téne ret2t1in re2t1ut re2t1ült re2tűd re2ud re2ute re2vező 2r1e2vő 2r1exp 2rezetn 2rezetü 2rezor 2rezőkh 2r1ezr 2rezüs 1ré ré2bá ré2bis ré2biv ré2bí 2rébres ré2bü 2r1é2des 2réfá 2r1égb ré2gét 2r1égn ré2g1ó2 ré2gő 2régt 2r1éh. 2r1é2hen 2r1é2hes 2r1é2het 2r1éhs 2r1éht ré2jen 2r1é2jet 2r1é2jün ré2k1ab ré2kac ré2k1a2g ré2k1a2n ré2k1au rék1á2sá ré2k1e2b ré2k1eg ré2kel rék1ele rék1elő rék1elr rék1els ré2k1esz ré2k1éte ré2kik ré2kin ré2kit rék1ola rék1old ré2kör ré2k1ö2v ré2köz ré2kő réku2 ré2k1ut ré2k1ú ré2let. ré2letb 2r1é2lete ré2leté ré2leth ré2letn ré2letr ré2lett ré2letü 2r1élf 2r1élm 2rély ré2mad ré2m1a2l ré2m1an ré2mar ré2mau ré2m1ál ré2már ré2mel rém1e2le ré2mer ré2m1é2ré ré2mil ré2m1ist ré2mos ré2mó ré2mö 2rémtu réna1p2 2r1é2nekh 2r1é2neki 2rénekl 2r1é2nekü ré2nel 2réner ré2n1é2j ré2nö ré2ny1e2l ré2p1ed ré2peg ré2pes répi2 ré2p1ip 2r1é2pí ré2pol ré2pö ré2pü 2r1épül 2r1ér. 2r1érb 2r1érc 2r1érd 2r1é2ret 2r1é2rez ré2ré. ré2réb ré2rén ré2rér ré2rés. ré2rése ré2résé ré2résh ré2rési ré2résk ré2résn ré2résr ré2réss ré2rést ré2résü ré2rét 2r1érf 2r1érh ré2rie ré2rig 2r1érk 2r1érl 2r1érm 2r1érn 2r1é2rő. ré2rők 2r1érr 2r1értá 2r1érte 2r1érté 2r1értí 2r1értő 2r1é2rü 2r1érv 2r1érz résa2 ré2sal ré2sar ré2s1ár ré2sát ré2seg rés1ell ré2s1er ré2sés ré2s1ő2 rés3sza ré2sú ré2s1ü2t ré2s1ü2v rész1a2l ré2szan rés3zav rész1ál ré2sz1eml ré2sz1e2sz ré2sz1é2k ré2szinte rész1í2v ré2szok ré2szol ré2szó rész1ó2r ré2szőr rész3s rész1t2r ré2szu ré2szú részü2l ré2sz1ülő 2rétáz ré2t1egy 2ré2tel rét1elm 2réter ré2t1e2sz 2r1é2tető ré2t1é2k ré2tiz ré2tol ré2t1os ré1tré ré2tud révá2 ré2vát 2réve. 2révei rév1eké ré2v1é2l ré2v1éri 2révé2t ré2v1éte 2r1é2vév 2révf 2révh 2révt ré2vú 2révv ré2z1a2 rézá2 ré2z1ár ré2z1e2g réze2l réz1elő ré2zer ré2zes réze2t réz1ete ré2zid ré2zin ré2zio ré2zip réz1isz ré2zos rézó2 ré2z1ór ré2zö ré2zsa ré2z3sá ré2z3se ré2z3si ré2zsí ré2zso ré2zsu rf1ál r2f1ép rfé2sza rfé2szá rf1fl rfia2n rfi1b2 rfid2 rfii2 rfik2 rfi1kr rf1ind rf1isk rfi1sz2 rfit2 rfi1tr rf1kl rf1kr rf2la rf2lo rf2ló rf2lu rf1okt rf1őrü rf1pr r1f2rá rf2rí r1f2rö rf1sp rf1st r2f1út rga1k2 rgá2csal rgá2csan rgá2csav rgá2z1é rge2o rge2r1a rgés3s rg2ha. rgi2aia rgi2ako rgi2al rgi2aso rg2il rg2la rg2le rg2lo rg2ló r1g2nó rg2öl rgö3le rgőcsa2 rgő2z1ölt rgő2z1ős r1g2rá r1g2ru r2gyado r2gy1aj r2gyalak r2gy1alap r2gy1algá r2gy1alk r2gy1any r2gyap r2gyarc r2gy1asz r2gyau r2gy1az r2gyál r2gy1á2z r2gy1eg r2gy1e2l r2gy1enc r2gy1e2s r2gy1és r2gyévé r2gyim r2gy1int r2gyip rgy1ira r2gy1ok r2gy1öz r2győr rhajóé2r rhatá2s1út rháza2d rhá2z1ada rhá2zal rhá2zip rhá2z3s rhitköz1 1rhoeá 1ri ri2aa ri2aá ria1b ri2aba ri2abá ri2abo ri2ac ri2ae ri2aé ria1f ri2afag ri2afr ri2a1g2 ri2ah ri2ai2k ri2aí ri2aj ri2akén. ri2akó ri2ala ri2alá ri2alu ri2am ri2ana ri2ao ri2aó ri2aö ri2aő ri2a1p2 ri2ará ri2aré ri2asza ri2aszá ri2aszi ri2aszo ri2até ri2ato ri2a1t2r ri2au ri2aú ri2aü ri2av ri2az 2riásá 2riász r1i2ázós 2ribé ri2bol 2r1ibr 2ribü ri2c1e2l rics1il ri2d1a2l ri2dál rid1d ri2de. 2r1i2deá ri2dei 2ridej ri2del ri2deo rid1ere ri2d1esz 2ridil 2r1i2dom 2r1i2dő ri2du ri2ed 3rie2l 3rier ri1fl ri1f2rá 2r1i2ge. 2r1i2gé 2rigi ri1gla 2r1igr ri2har 2r1ihl rihó2 rihón1 2rijes ri1klo ri1k2ló ri1k2ri ri2lal ril2l1e2h ril2lét ril2l1in ril2l1ő 2rillu 2rillú 2riló 2rimáda 2rimádá 2r1imp ri2n1a2d 2r1i2nai ri2naj ri2n1a2l ri2n1a2n ri2n1a2r 2rinas. 2r1i2nasá 2rinasn 2r1i2naso ri2nass 2r1i2nast rina1sz2 ri2nat. rin2c1a rin2cá rinc3c rin2c1eg rin2cel rin2cer rin2co rin2csér rin2csi 2r1inde 2r1indu ri2neg 2rinfl rin2gál rin2gel 2r1ingét rin2gül 2r1inha 2r1i2nic ri2nil ri2n1ip 2r1injek rin1kré rin3n 2r1insp 2r1inst rin2t1ad rintá2r rin2tára rin2táro rin2társ 2rinten 2rinterf rinté2r rin2t1ér. rin2t1éré rin2t1éri 2rintő. 2rintők ri2nül ri2o1k2 rio2lok ri2om 2rionn 2riono 2riox ri2óa ri2óá ri2óc ri2ódar ri2óe ri2óg ri2óke ri2ól ri2ómá ri2ómé ri2óo ri2ó1p ri2óü 2r1i2pai 2ripar. 2r1ipara 2r1i2pará 2riparb 2riparé 2riparh 2riparil 2riparin 2riparn 2riparr 2ripars 2riparte 2ripartó 2riparu 2ripl ripor2ta 2r1i2ram 2r1i2rat 2r1i2rá 2r1irh 2r1i2ri 2r1i2ro 2r1i2rón 2r1irr 2r1irt ri2s1ar ri2s1as ri2s1ál ri2sáp ri2s1e2l ri2s1emb ri2s1e2r ri2sid ri2sii ri2sil ri2s1is 2rismérv ri2s1or. ri2s1ort 2r1ispá 2ristál ri2sut ris1üté ri2s1ü2tő. ri2s1ü2v 2r1i2szák ri2t1a2d ri2tal 2rital. 2r1italb rit1alk 2r1itall 2ritaln 2r1italo 2ritalr 2r1italt rit1a2ny ri2tág rit1ell ri2t1i2o ri2t1í riu2méne riumhid2 riumhidr1 riu2m1i2o 2r1i2vad ri2var 2r1i2vás 2rivo 2r1i2vó rixe2 ri2x1el ri2xí ri2xö 2riza r1i2zét 2r1izmi 2r1izmo 2rizmuk 2rizmú ri2zsar ri2zseb ri2zsel 2r1izza 2r1izzó 1rí rí2gé 2ríj. rí2jai rí2jak rí2jam rí2jas 2ríjá rí2ján rí2ját rí2jáv 2r1íjh 2r1íjj 2r1íjl 2r1íjr 2r1íjv rí2m1a2l 2rímá rím1emb rí2mo rí2mö rí2né 2r1íns rí2ra r1í2rá r1í2ró 2rítél rítés3s rítőa2 rítőe2 rítőkész1 2r1ív. ríva2 2r1ívb 2r1í2ve 2r1í2vé 2r1ívh rí2vi r1í2vü rí2vű 2r1ívv rí2za rí2z1el rízis3s rí2zo r2j1ado rj1any r2j1ág r2j1áp rjet2 r2j1id r2j1ös r2j1u2r rka1b rk1ang rka1pr rkaros3 rka2ró2r rka2s1ü2v rka1t2r r2k1ács. rká2csá rká2ne r2k1á2ri rkár1om r2k1á2ru r2k1e2dz rk1e2lem rk2elm r2k1eltá rke1p r2k1erd rk1eredő r2k1e2rei r2k1e2rez r2k1e2rő rke2szö r2k1ex rké2p1e2l rké2p1éss r2k1ér. r2k1érté r2k1étt r1k2hé rk2hón rkia2 rkie2 rki2g rk1iga rkigaz1 rkilenc1 r2k1imi rk1inga rki2ont. rki2sem rki2z1a rk1izo rk1kl r1klie r1k2lí r1k2lo r1k2ló rk1o2laj rko2nya rko2vi. rko2vit r2k1óné rk1ó2rá rk1ó2ri r2k1öltési r2k1ötl rkö2ző rk1őr. rk1ő2ré rk1őrk rk1őrn rk1ő2rö rk1őrr rk1őrs rk1őrt rk2rém r1k2ri r1k2rí r1k2rom rk1sh rktus1s rk1udv r2k1ug rku2sze r2k1ú2sz r2k1üd r2k1üg rk2vó rlag1g rla2g1ol rla2p1a rla2pál rlap1e rla2pol rla2p1osz rla1pro rla1s2t rla2t1a2n rla2t1ó2 rlá2pe rlás3s rlá2s1út rlá2t1e2 rlá2t1é rlá2tor rle2g1a2 rle2g1á rle2ger rleg1g rlegigaz1 rleí2 rle2t1á2 rle2t1eg rle2tell rle2t1elő rle2t1ék rle2tél rle2t1ér. rle2t1érv rleü2 rlésát1 rlésáta2 rlés3s rl1gr rló1g2 rlóó2 rlót2 rlőe2 rlő1sta r2m1akad rmaké2sz1ü r2m1a2kó rma1kré r2m1alt r2m1a2nya rmaó2 rma2t1á2ru rma2t1ur rma2zon rmá2lér rmá2nyan rm1á2ram r2m1á2ro r2máru rm1cl rmege2 rmeg1er rme2g1es rme2g1é rme3g2ö rme2k1an rme2kar rmeká2 rme2k1eg rme2k1e2l rme2kérd rme2kor rme2kot rme2k1ó2 rmekö2r rme2körö rm1elk r2m1elm rme2ran rme2ras rme2rin r2m1e2rői rme2rők. rme2rőke rme2rőkn r2m1e2rőm rmert2 rmer1tr rm1esem rme2t1él rme2tin rmé2k1e2l rmé2ker r2m1é2le r2m1ép r2m1ér. r2m1érte r2m1étk r2m1étr r2m1étt rmi2g r2m1iga r2m1igé rm1illa rminc3s rm1inte r2m1irá rmi2si r2m1isko r2m1ism rmite2 rmi2t1el r2m1íg rmjob2 rm1kl rmo2n1a rmo2nár rmo2n1e rmon1n rm1ope r2m1ors rmo1sz2fér rmő2szá rm1p2l rm1p2r rm1sk rm1st rm1sz2 rm1tr rm1üg rm1üz rmű1s rm1ya rna1b rna1f2 rna2gyú rnai2k rna1k2r rna2pes rna1pro rnas2 rna1sp rna1sz2 rna1t2 rná2cs r2n1el. r2n1elb r2n1elf r2n1elh r2n1elj r2n1ell r2n1eln r2n1elr r2n1elt rne2m1is r2n1est rne2t1a2 rne2t1e2l1 rnet1o rnés2 rné1st r2n1i2d rni2g r2n1iga rno2kis rnó1d2 rnö2ket rnus3sze rny1a2dó r2nyakad r2nyalako r2ny1alk r2nyarc rny1álm r2ny1ell r2nyelm r2ny1eln r2ny1elo rny1elvo rny1emb r2nyerd r2ny1e2rez rny1e2ső rny1ékné rny1ész r2ny1id r2nyiz rnyolc1 rny1old r2ny1or rny1ök r2nyöt rny1s r2ny1ur 1ro ro2ad roa2n 2r1obj 2robl r1obs roc2ke ro1cker roc2kén ro1c2kok ro1c2kon roc2kos. 2r1o2dú rofi2tár ro1fl ro1fr ro2g1ad ro2g1ak ro2gal ro2g1am ro2gar ro2g1á2r ro2g1áz rog1enc ro2ger ro1g2ló ro2g1o2l ro2gor ro2g1osz ro2gö 3rográ ro1g2ráf. ro1g2ráff rogu2 ro2gur ro2gü 3rogy ro2he ro2hö ro2is 3rojt ro2ka. ro2kab ro2kac ro2k1a2d ro2kait ro2k1aj ro2kak ro2k1al ro2k1a2n ro2k1a2s ro2káb r1o2kád ro2k1ál ro2kán ro2k1á2s roke2 ro2ked ro2k1en 2rokett. r2oké ro2kék ro2k1é2l ro2kép ro2kid ro2k1ing ro2k1í 2rokod rok1old ro2kő 2r1okság rok1t2 2r1oktat 2roktán ro2k1u2s rokú2 ro2kú. ro2kús ro2kü 2r1o2laj rola2n rolás1s 2r1oldá 2r1oldó ro2l1i2d roligar2 roligarc3 rol2l1a2d rol2lag rol2l1akn rol2lan rol2lat rol2leg rol2lel rol2lis 2r1olló 2r1oltás 2r1oltó. 2r1oltób 2roltóé 2roltóh 2r1oltói 2roltóké 2roltóm 2roltón 2r1oltót 2r1oltóv 2r1oltv ro2lü 2rolvad 2rolvas 2r1o2lyai 2r1o2lyáh 2r1o2lyán 2r1o2lyár 2rolyéb 2rolyéh 2rolyéi 2rolyén. 2rolyiér 2r1o2lyuk rom1ajt rom1akk rom1akó ro2m1a2ro ro2m1ál 2romám ro2m1á2ri ro2m1árk ro2m1árn ro2m1á2ro rombé2 rom2bén ro2meg ro2m1el ro2m1e2r ro2m1es ro2méj ro2m1é2ne rom2f1os ro2mim rom1iná rom1ist ro2mita ro2miz ro2mí romköz1 2r1omni ro2m1o2r ro2m1ó2r ro2mö ro2mő rom1pr ro2mü ron1alj ron1alt ron1alu ron1any rona1t2 rona2ut ro2n1áta ro2n1átr ron2csel ron2csem ro2nen ron1esz ro2n1ér. ron2gal ro2n1i2ko ro2n1i2m ro2ní ro2nop ro2nóc ro2n1ó2r ro2nö ro2nő ron1s2 ron2tab ron2tem ron2tev ron2t1én ron2tin ron2tí 2rontóé 2r1ontóh 2rontóig 2rontós ro2nü ro2nyac rony1a2l ro2nyid ro2nyik ro2nyir ro2nyó ron2zab ron2z1al ron2zer ron2zin ron2z1ol ron2z1or ron2z1ó2 ronz1z ro2om ro2os 2r1opc 2rope ro2per ro1p2l ropo1s rop2s ro2rak ro2r1a2l ro2rat ror1áll rore2 ro2reg ro2r1el ro2r1es ro2r1in ro2rosz rort2 ror1tr ro2rü ro2sar ros1ass ro2s1atl ro2s1av ro2s1árk ro2s1áro ro2sem ro2s1ist ro2s1ol ro2s1ó2 ro2sö ro2ső ros3sze ros3szék ros2tet 2rostob ros2tol 2rostya ro2s1út ro2szal ro2szan ro2szás 2r1oszlo ro2szó r1osztá 2roté ro1t2he roto2na ro1t2ró 2rotth ro2un ro2us rova2re rovás1s 2r1o2vi. 2r1o2vib 2r1o2vik ro2vis 2ro2xidb 2ro2xidr 2roxilc ro1xy ro1ya roza2tal ro2zsan 1ró róa2d rób1ajt 2róbá róc3c ró2c3h ró2cin ró2c1ö ró2c3sá ró2cz ró2dai ró2dep ródi2ad ró2dő ró2dü 2r1óév. 2róéve 2r1óévé ró2f1ag 2rófea 2rófeá ró2f1iv 2rófs ró2fur ró1g2r rói2g róke2rest róke2r1in ró1k2l ró1kré 2r1ólm r1ó2lom ró2m1a2l róma2r róm1ara ró2mál róme2l ró2mél róm1isz ró2mí 2rómk ró2mö ró2mü róne2m 2r1ó2néb 2rónéé 2r1ó2néh 2r1ó2nén 2rónér 2rónét 2rónév 2rónj 2rónn 2rónr rónus3s 2rónú ró2nü róo2k róó2r ró1p2l ró1pro 2r1ó2raa 2r1ó2rac 2r1ó2rad 2r1ó2rae 2r1ó2raf 2r1ó2rag 2róraje 2r1ó2ram 2r1ó2ran 2r1ó2rap 2r1ó2rar 2r1ó2ras 2r1ó2rat 2róraü 2r1ó2rav 2r1ó2ráb 2r1ó2rád 2r1ó2ráé. 2ró2ráén 2r1ó2ráév 2r1ó2ráh 2r1ó2rái ró2rája 2r1ó2ráka 2r1ó2rákb 2r1ó2ráké 2ró2rákh 2róráki 2r1ó2rákk 2r1ó2rákn 2r1ó2ráko 2r1ó2rákr 2r1ó2rákt 2r1ó2rán. 2r1ó2rána 2r1ó2ráná 2r1ó2ránk 2r1ó2rány 2r1ó2rár 2r1ó2rás 2r1ó2rát 2r1ó2ráv 2r1ó2riá rós1orom ró1spi 2rótb 2róth ró2tip rót1ist 2rótj 2rótk 2rótm 2rótn ró2t1ö2v ró1tri ró2tül 2r1ó2vó róza1t2 ró2z1e ró2z1in ró2zú ró2zü 1rö 2r1öbl 2r1ö2böl. 2r1öbölb 2r1öbölh 2r1öböli 2r1öböll 2r1ö2böln 2r1öbölr 2röböltő rö2ga rö2go rö2gó rö2k1é2l rö2k1érv 2rökí 2röklé rö2ko 2r1ö2kör 2rökösé 2rökösö 2r1ökrö rö2lős rö2lyü rö2ma rö2má 2röme. 2römed rö2meg 2römei 2römén 2römét 2römév rö2mí 2römmű rö2mo rö2mó 2römöd 2römök 2römöt rö2mu 2römü 2römű rön2d1e rön2k1a2 rön2k1e2 rön2kép rön2kol rön2kos rön2k1öl rön2k1ü rö2p1i2 rö2re rö2rö rö2sa rö2sá rö2so rös3sza 2r1öv. 2r1övb 2r1ö2ve r1ö2vé 2r1övh 2r1övn 2r1ö2vö 2r1övr r1ö2vü 2r1övv 1rő rőa2n rőát1 rőáta2 rő1bl rő1br rő2dá rő2d1e2l rő2dos rő2d1ő2r rőe2l rőe2r rőe2s rőé2h rőé2l rőé2r rőé2te rő2f1as rő1fl rő2f1ő rőgé2p1és rői2ta rő1kl rő1kv 2rőlt rő1pl rő1pr 2r1őr. rőr1ak rőr1eg r1ő2rei r1őrh rőr1in rő2riz rőrköz1 2r1őrl 2r1őrm 2r1őrn rő2rö 2r1őrp 2r1őrr 2r1őrs 2r1őrt 2r1ő2rü 2r1őrz rősá2 rő2sár rő2sír rő1ská rő2ső rő1spe rő1s2pi rő1sta rő1str rősü2l rő2s1ülő rő2s1ült rő2s1ü2t rő2s1ű2 rősza2kál rőu2t rőü2l rőva2s1 rő2zi. rő2zön rpei2 rpe2szel rp2he r2p1ig rpis1á2 rpi2t1a rpi2t1e2 r2p1ivá r1p2la rp2le rp2lé rp2lu rp2lü rprecíz1 r1p2ré r1p2ri r1p2rí r1p2ro r1p2ró rpu2szé r2p1üz r2r1a2lap rra2sza rra2szi rrata2n rrat1any rra2t1á2r rra2t1e r2r1ábr rrádiók2 rrádió1kb r2r1á2ga r2r1á2gy r2r1árb rrá2saj rrá2sar rrá2ság rrá2se rrás3s rrá2sü rrá2s3z rrá2tal r2r1áts rre2l1i rr1emb rren2d1ő2 r2r1ék rré2r r2r1éri rré2sem rr1fl rr1fr r2r1i2de rr1in. rr1ing r2r1ir rri2ta rr1i2zé rr1izg rr1izm rr1k2r rr1ope rro2rál rror1osz rró1dr rró1p r2r1öb r2r1ös rr1pl rr1pr rr1sp rr1t2r r2r1u2r r2r1ür r2r1üt rry2n r2s1a2dó r2s1a2g rsa2il2 rs1akku rs1alan rsa2lap r2s1ale rs1alm r2s1a2lomb r2s1ana rs1a2ny r2s1a2pá r2s1a2po rs1a2ra. r2s1arc rs1arom rs1arz rs1att rsa2v1ar rsa2v1é2 rsa2v1i r2s1ax r2s1a2z r2s1ábr rság1g rs1áld r2s1á2ré r2s1árn r2s1árr r2s1á2ru rs1áté rs1áti rs1bl rs1br rs2ch2 r1sche rsc3hé rs1d2r rs1edz r2s1ef rs1e2gét r2s1e2gy rse2il rse2k1a2 rse2keg r2s1e2leme rs1elf r2s1elk r2s1e2lőa r2s1e2lől rs1e2mi r2s1e2mu rse2ny1a2 rse2nyeg rse2ny1e2l rse2nyer rse2nyí rse2nyő r2s1erd r2s1erk rs1erő r2s1ess r2s1esz rsé2g1el r2s1él r2s1ép r2s1ér. r2s1érd r2s1érl r2s1érték r2s1és rs1é2te rs1étk rs1étt rs1fr rs1gl rs1gr rsi2d rs1ide rs1ido rsi2g rs1iga r2s1ikr r2s1ill r2simm rs1ind r2s1ing r2s1int r2s1i2o rs1i2pa rs1iro r2s1i2si r2s1isk r2s1ism r2s1ist rs1írn r2s1í2ró r2s1írt r1s2kál r1skj rs1kl rs1k2r r1s2lu rs2mink rs2ni rs1ond rsonya2 rso2nyal rso2nyan rso2nyat rso2nyé r2s1op r2s1ord r2s1org rs1osz rsócsa2 rsócsap1 r2s1ódá r2s1óné rsó2s3zárr r2s1öb rs1önt rs1örv r2s1ös r2s1ö2z rs1őr rs1pl rsp2r r1s2rác rs1s2t rs3szag rs3szak rs3szá rs3szem. rs3szemet rs3szer. rs3szerű. rs3szerűb rs3szerűe rs3szerűn rs3szerűs rs3szerűt rs3szerűv rs3szi rs3szí rs3szó rs3szö r1stand r1s2tat r1s2tác r1s2tát rs2top rst2r r1strat rs1tre rs1tré r1stró r1stru r1s2tú rsu2r rs1ura rsu2t r2s1uta rs1utá rs1úr. rs1ú2ri r2s1ú2s rs1úto r2s1üd rs1üld r2s1üz rsza2k1a2l rsza2k1e rsza2kö rsza2k1ü r2szaló r2s3zam rszág1g rszáraz1 rs3zárl r2s3zené r1sz2f rsz2lo rsz2m rszom2j1a2d rs3zse rs3zsi rsz2ta rszt1al rszt1árv rszt2rá r2s3zűr. r1sz2v r2t1abla r2t1abr r2t1a2dat rt1a2dó r2t1a2ga. rt1agit r2t1ajá rt1ajtó r2t1a2kara r2t1akc rta1kre rta1k2ré rt1alapj rt1a2láb r2t1alár r2t1alb r2t1alel r2t1alg r2t1alj r2t1alk r2t1alt r2t1alv rta2m1ér rt1anim rta2n1ó2r r2t1anto r2t1antr rt1a2nyag rt1app rt1arán r2t1arc rta2rén rt1a2ty rt1a2uto r2t1azo rt1ábr r2t1áf rt1ág. rt1á2ga rt1ágb rt1ágg rt1ágj rt1ágn rt1ágr rt1ágs rtá2lad rtá2lala rtá2rada rtá2raj rtá2ramr rt1ária rt1áriá r2t1árin rt1árszi rt1árszí r2t1árta rtá2ruké rtá2rukk rtá2rukn rtá2rukr rtá2rukt r2t1árur r2t1árut rtá2s1ág r2t1ásás rtá2s3z r2t1á2t1a r2t1átl r2t1áts r2t1átv rtá2v1é rtávi2 rt1bl rt1br rt1cl rt1cr rt1dr rtea2 rt1e2gé rt1e2gye rtei2 r2t1eks r2t1elad r2t1elb r2t1elf rt1eljá rt1elker rt1elkö rt1elkü rtel2la rtel2l1á2 rt1elma rt1e2lőa rte2lől r2t1elr r2t1ember r2t1eml r2t1enc r2t1ent rte1p rte2rac rte2rál rte2r1in rtermo1 rtermosz2 rte2r1os r2t1e2ró r2t1erő rte1sp rt1esték rt1estné r2t1estün rte2sze. rte2szei rte2szek rte2szem rte2szet r2t1eszk r2t1eszm r2t1e2szü r2t1é2d rt1é2gi rté2kaj rté2k1a2l rtékát1a2 rték1í rté2kos rté2ku r2t1é2let rté2lén rt1é2li r2t1élm r2t1é2neke r2t1é2nekk r2t1é2nekr r2t1épü r2t1érdem r2t1érem r2t1é2ré r2t1érin r2t1é2rit r2t1értek r2t1érté r2t1érv r2t1érz rté2s1ég rtéskész1 rtés3sza rté2sül rté2szá rté2szo rté2szö rtés3zsí r2t1étk r2t1étl r2t1étt r2t1étv r2t1é2ve. r2t1é2vet rté2véné r2t1é2vér rt1évk rt1fl rt1fr rt1gr r1t2ha. r1t2hág r2t1i2de rt1idé rt1idi rt1ifj r2t1i2gé r2t1ill r2timá r2t1i2mi r2t1imp r2t1i2náb r2t1i2náé r2t1i2náh r2t1i2nán r2t1ind r2t1inf r2t1ing rti2nik r2t1i2pa r2t1irá r2t1iro r2t1isi r2t1isk r2t1ism r2t1isza rt1i2tal r2t1izé rt1izm r2t1izz r2t1íg r2t1íj r2t1ín rtí2ra rtí2rá rt1í2ve rt1í2vű rtí2z rt1ízl rt1kl rt1kr rt1kv rtmű1 rtműt2 r2t1of rto2kad rto2k1a2l rto2k1ar r2t1o2li r2t1oml rto2n1a2 rtoná2 rto2nár rt1opá rt1ope rt1opt r2t1org r2t1o2rom r2t1orr r2t1ors r2t1orv r2t1osz rtóe3rejü rtó1p rtó2rák rtó2s1ín. rtó1sp rtó2s3zár r2t1ökl rt1ököl r2t1ö2lőse rtön3n rt1ö2rök rt1öröm r2t1össz rt1ö2vez rtőé2h rtőkész1 r2t1őrköd rt1őrl r2tőrül rt1pl rt1pr rt1ps rt2rad r1t2raf r1t2ranz r1t2rág r1t2riá r1t2rik r1t2ril r1t2rió r1t2rón r1t2rü rt1sk rt1sl rt1sp rt1st rtsz2 rt1t2r r2t1udv rtu2k rt1uká r2tunik rtu2rai rtu2ral rt1u2rá rtu2sze rt1utá r2t1új r2t1ú2s r2t1üg r2t1üld r2t1ü2lé rt1ülő r2t1üt r2t1ü2v rt1ű2ző r2tying rty2j rty2s r1t2zé r1t2zi rt2ző 1ru ru2ac ru2b1i2k ru2c3h ru2cz 2r1udv rue2l rue2r ru1fr 2rugar 2r1u2gat rug3gy 2r1ugr ruhás1s 2r1ujj ru1k2l 2ruktu 2ruktú rum1agr ru2maj ru2mal ru2maz ru2m1eng ru2mer ru2mes ru2mél ru2m1i2k rum1ill ru2m1i2p ru2mis ru2m1iv ru2miz ru2mí ru2mol ru2m1o2r ru2mö ru2mő ru2mü 2r1unc run2da ru2nit r1u2nok ru2pad ru2pe ru2p1il ru2pü ru2rad ru2rai r1u2ral ru2ras ru2rat r1u2raz ru2rán ru2rát 2r1urb ru2ruk rus1abl ru2sad ru2sal rusa2n rus1any rusa2r rus1aro ru2sas ru2sál ru2s1iz ru2sír ru2s1ol ru2s1ó2 ru2ső russ2 russz2 rust2 rus1tra ru2s1ű2 ru2sz1é2p ru2szip r1u2tac r1u2tak r1u2tat r1u2taz 2r1utc r1u2tó. r1u2tób r1u2tód r1u2tói r1u2tój r1u2tók r1u2tón ru2tóp r1u2tór r1u2tós r1u2tót r1u2tóv 1rú rúda2 rú2dad rú2d1al rú2d1ar rú2d1á rú2del rú2din rú2du rú2dü rú1dy rú2d3z rú1gr 2r1újd rú2jí 2r1újk 2r1újs 2r1úr. 2r1úrb 2r1úrh 2r1ú2ri 2r1úrk 2r1úrn rú2ro 2r1úrr 2r1úrt rú2szó rú2t1a2l 2r1ú2t1e2 2r1ú2té. rú2tér rú2tit 2r1útk 2r1útle 2r1útm rúto2 2rúts 2r1ú2tü 2r1útv rú2zsad rú2zse 1rü rü2dí rü2dü rü2gyel 2rügyn rü2ha rü2la rü2lá rü2led rü2les rü2lép rü2lér rü2lí rü2l1o rü2ló rülö2 rü2l1ön rü2l1öz rü2l1őg rü2lu rü2lú rü2l1ül 2r1ünn 2r1ü2nő rü2rí rü2rü rü2te rü2té rü2tö rü2tő rü2vö rü2ze rü2zé 1rű rű1gr rű1kl rű1pr 2r1űr. 2r1űrh 2r1űrm rű2rö 2r1űrt rű2s1orr rűs1ors rű1sp rű1str r2v1agá r2v1akc rva2lap r2v1alj r2v1alk r2v1a2rán rva2sáb rva2sék rvasu2 r2v1a2szó rva1t2r rvavá2 r2v1ága rvá2gyi r2vállam r2v1állo rv1állv rvá2nyad rvá2nyan rvá2nyú r2v1áp rvá2r1al r2v1á2ram rváro2s1os rv1á2rú r2v1á2sás r2v1áta rvá2tors r2v1e2b r2v1e2dz r2v1e2gye rv1ela rv1e2led rve2lemb r2ve2leme rv1e2les r2v1elk r2v1ell r2v1elo r2v1e2lőa rv1e2lőá r2v1e2lőkép r2v1előr r2velőz r2v1eng r2v1ep rve2r1a rve2r1á2 r2v1e2retn rverés3s rve2rip rve2r1o r2v1e2rői r2v1e2sete r2v1e2sés r2v1ex rv1éke rv1ékk rv1ékn rv1ékü rv1é2lel r2v1é2lé rvé2ny1el r2v1ép r2v1é2rem r2v1é2ré. r2v1érés r2v1érp r2v1érté r2v1érv r2v1é2vet r2v1évi rv1fr r2v1ido r2v1iga rvigaz1 r2v1igé r2v1ik r2v1inf rv1inte rv1inté r2v1i2p r2virán r2v1isme rvis3sze rv1ital rvi2z1a2 rvi2z1á2 rvi2z1elv rviz1o rvi2zó rvíze2 rvíz1es rv1kl rv1kr r2v1ob r2v1olv r2v1op r2v1or rv1osz r2v1ov r2v1ó2h r2v1órá rv1öss rv1ős rv1pr rv1sk rv1sp rv1st rv1tr r2v1ub r2v1u2t r2v1üg rvü2l r2v1ülé r2v1ülő r2v1ült r2v1üt r2v1ü2v r2v1ü2z ry2be ry2bó ry2bő ry1é2n ry2ho ry2na ry2ne ry2ra ry2re rys2n ry2tó ry2tő ry2va ry2ve r2z1a2dot r2z1a2la r2z1alj r2z1alk rz1almás rza2sz r2z1aszó rza2tal rza2t1e2 rza2tol r2z1áll rzá2r1ó2r rzá2se rzás1s rz1e2be rze1p2 rz1est rze2tal rze2t1eg rze2t1e2l rzetes3s rze2t1o rzetü2két rzéna2 rzé2n1al rzé2nat rzé2ná r2z1érm rzé2so rzi2ab rzis3s r2z1ín rzo2r1ál rzó2s3zár rzőa2 rzőe2 rz1p2r rzs1ala rzs1any rzs1apa r2zsaz r2z3sár. rz3seben r2zs1e2g r2zs1e2r r2zség r2zs1ék r2zs1ér. r2zséva r2zs1iga rzs1inj rzs1int r2zsip r2zsita rzs1or r2zs1ö2r r2zs1ő2 rzs1s rzs1u2t rzs1úr rzs1ült rzu2sak rzu2san rzus3s rzu2s3z r2z1ut 2s. 1sa 2sabo 2sabr 2s1abs 2s1a2cé sa2dalé 2s1adap 2s1a2data 2s1a2dato 2s1adató sadás1s 2s1adm sa2dog sa2dóc sa2dód sa2dóé sa2dóh sa2dói sa2dój sa2dóm sa2dón sa2dór sa2dóu sa2dóz sae2r sa1f2r 2saga sa2gan sa2g1ál 2sagg sa1gne 2s1a2gó sa2gő sa1grá s1agy. s1agyb s1a2gyo sa2gyú 3sah. saha2r sa2hov sa2ig 2saja sa2jak sa2jág 2saján sa2j1ö saj2tal saj2t1a2n saj2tar sajté2r saj2t1éré saj2tor saj2t1ö saj2t1ü2 sa2k1ab 2s1a2kad sa2k1an sa2kas 2s1akci sak2k1a2r sak2k1as sakke2 sak2k1eg sak2ker sak2kes sak2kis sak2kol sak2k1orr sak2k1ó2 2sakku sa1klu 2s1akna. 2saknáb 2saknái 2s1aknák sak1ola sa2k1orm sa2k1ös sa1k2ru 2s1akt. 2s1akti 2s1aktu sa2k1ug 2s1a2kus sa1k2va 2salab sala2g1 sala2ka sa2laku 2s1a2lapa sa2lapí sa2lapl sa2lapoz s1a2lapr sa2lapt salá2da 2saláí salán1n salás1s 2s1aláté 2s1alb s1a2lel s1alépí salé2t sa2l1éte 2salf 2s1algáh 2s1algái 2s1algán 2salgásat 2s1aljai 2s1aljáh 2s1aljár 2s1alját. 2s1alka 2s1alkot s1alku 2salm 2s1a2lomn 2s1a2lomr sal2tag 2s1alte 2s1alth 2s1altit sa2l1ú sa2m1any sa2mec sa2m1il sa2m1í sa2mol sa2m1osz 2s1a2mő sa2nal sa2nat s2and 2sane sa2nek 2s1angy sa2nód sa3nö s1ante sa2nya. s1a2nyag sa3nyar 2sanyá saó2r sa2p1a2dó sa2p1a2g sapa2te sa2pác sap1á2cs sap1áll sa2p1átm sa2páto sa2p1el sa2p1ék 3sapka 3sapkáb 3sapkán 3sapkás 3sapkát 3sapkáv sa2p1osz s1a2pókr s1a2pósab 2sapp s1aprí sa1pro 2sapu sa2ratá sa2rató sa2rány sar2c3ho sar2cin sa2rén sa2rit sar2j1e sar2k1e2 3sarki sar2kin sar2kir sar2k1ö2 3sarkú 3sarló 2sarm 2sarom 2sarz sase2 sa2s1eb sa1s2m sa1s2po sas3sza sas3szá sas3sze 2s1asszo 3sast sa2s1u2t sa2sú s1aszf 2saszt sata2kés sa2t1alj sa2t1alt sa2t1a2nyá sat1apu sa2t1á2rak. sa2t1árka sa2t1érk sa2t1érr sa2t1i2k sa2t1ing s1atlé satmo1 satmosz2 2s1a2tombó 2s1a2tomo sa2t1orm sa2t1ó2d sa2t1ó2né sa1t2rá 2saty sa2tyá sa2ul sa2urá 2saut sa2uto s1autó. sautóé2r sautói2ko sa2uv 3sav. 3sava. sa2v1a2da sa2v1a2l 3saván sav1ára sav1ária sa2v1árt sa2v1el sa2v1ér sav1ill sa2v1i2n sa2vő sa2vü sa2xi sa2zon 1sá sá2b1ak sá2b1e2l sá2b1e2r sá2big sá2b1il sá2bö sá2buj sá2b1ut sá2bü sá2csá sá2gab sága2d ság1ada 2ságadd sá2gal sá2gan sá2gas 2s1ágas. ság1ass sá2gat 2s1á2gaz sá2g1ál sá2g1á2rak sá2g1árn sá2g1á2ru sá2g1e2 sá2gép sá2g1i2ko sá2gí sá2g1osz sá2g1ó2 sá2g1ö sá2gő ság1s sá2gü sá2gű 4s1á2gy ságy1a2d sáka2 sá2kal sá2k1an sá2kar sá2kát sá2k1e2 sákköz1 sá2k1ö sá2kü s1álc sá2l1in 2s1álm s1á2lomb 3sámá sán2c1é sán2c3so sán1k2r sánt2 sán1th sá2nü sá2p1ost sá2rad sár1adá sár1a2dó sá2r1ag sá2raj 2s1á2rak. sá2raka 2s1á2rakb 2s1á2rakh 2s1á2rakk 2s1á2rakn 2s1á2rako 2s1á2rakr sá2rakt sá2r1a2l 2s1á2ram sá2r1a2n 2sá2ras sár1ass sár1asz 2s1á2rat sá2rág sá2r1ál sár1d2 sá2r1e2 2sárét sá2r1év sá2ria. 2s1á2riá sár1iko sá2r1i2p sá2r1i2s sá2rí sár1k2 sá2r1osz sár1ott sár1óni sá2rö sá2rő 2sárro sár1s2 sárt2 sár1tr sá2rug 2s1á2ruh 2s1á2rul 2sárus sárú2 2s1á2rú. sá2rü sá2s1ad sá2sar sá2sás sá2s1e2 sá2sis sáskész1 sá2só 2s1ásó. sás1ó2r 2s1ásóv sá2sö sá2ső sás3sz sá2s3za sászá2r1a2d 2s1á2szo 2sáta s1átad sá2t1alj s1á2tál s1á2t1á2z 2s1átb 2s1átc 2s1átd 2s1á2t1e2 2sáté sá2tél 2s1átf 2sáth 2sáti sá2t1ir 2s1á2tí 2sátj 2sátk 2s1átm s1á2tokt 3sátor sátókész1 2s1á2t1ö 3sátra 3sátrá s1átre 2sáts 2sátt s1áttö 2sátu 2s1á2tü 2sátv s1átve s1átvé s1átvi 3sáv. sá2v1a2d sáva2l sá2v1a2r sá2v1ál sá2v1á2r 3sávb sá2v1e2 sá2v1érz sá2vis sá2viz 3sávj sá2v1or sá2vö 3sávr 3sávú 3sávv sba2l1 sbeá2 sbér2cs sb2lo sb2lú sb2ra sb2ri sb2ro sb2ró scar2 1scheie sc3hek sc3hen sc3het sc3hé. 1schébe. sc3héd 1schéére 1schére sc3hés sc3hi. sc3hig 1schil sc2ri sda2dal sdai2 sdeá2 sde1b2 sde2del sde1kr sdes2 sde1sp sde1st sdesz2t sdi2ale sd2ra sd2rá sd2ro sd2ru 1se sea2d sea2l sea2n seá2l seá2r se2bag se2b1ak seb1alt sebá2 se2b1ág se2bár se2b1e2g seb1ell seb1elz se2b1esh seb1esze s1e2béd 3sebés se2b1ó2 se2bö se2b1ő2 seb1p seb1s se2b1u se2bú se2bül 3sebzé secs1a2p se2csev se2cs1ék 2sedez sedél1 2sedény se1dra se1d2rá se2dzé se2dző see2l see2n 2seff se1f2ra 2s1e2ger 3segéd 2segér segés3s s1egész1 2segét 3segg seg2ga seg2go 3segí se2gyed segy1e2l s1e2gyé 2s1egyh 2s1együ sehü2 se2h1üv seí2r sej2t1a2 sej2t1e2ny sej2ter sej2tér sej2t1o sej2tö seka2r se2k1ál 2s1e2kés. sek2k1á sek2kos sek2k1ö se1klu se1k2ra se1k2ré se2kur se2kúr sel1ak se2lál 2selb s1eldö 2s1e2lef s1e2legy se2l1e2h se2l1eké se2lemek 2s1e2lemé se2lemk se2lemm 2s1e2lemz se2l1ere s1e2lesé sele2sz se2l1eszü sele2t1a2 sele2t1e2l se2l1e2vé se2l1e2vő selés3s 2self 2s1elha 2s1elhel s1elho sel1id se2lis 2s1eljá s1ellá 2selmél selnö2k1öl 2s1elny s1e2los 2s1e2lö se2lőad s1e2lőí 2s1e2lőz 2selr s1elta s1eltá 2s1eltö 2s1elv. 2s1elvek s1elvű 2s1elvv 2selz 2sember s1ember. s1emberb s1embern 2s1embr 2semén 2semlé se2nat se2n1ál sen2d1a sen2d1á s1e2ner senés3s 2s1enged sen1ist se2n1or s1enta seny1ag seny1ak se2ny1á2 seny1ell seny1ere se2ny1él se2ny1ér. se2nyérd se2nyérte 2senyhi. se2nyigé se2nyös se2nyu se2nyú se2ny1ü2l 2senyve. s1enz seó2r se2pid s1epiz sep2pa sep2p1á2 sep2per 2sepri se1p2ro se1p2ró se2r1agy se2ral se2ram se2r1a2n se2r1a2r se2r1as se2rau se2r1á2g ser1áll se2rár s1erde 2serdő sereg1g 3seregs 2serej se2r1e2lem. se2r1e2lő se2r1elt se2r1elv sere1p sere2pedő ser1e2sze. ser1eszk sere1t se2r1észb se2r1iga se2r1il seri2n se2r1ina ser1inf ser1ing ser1int se2ris se2riz ser1k se2r1ol se2ró s1eróz 2se2rő s1erő. s1erőb s1erőd s1erőé s1erőf s1erők s1erőm s1erőn ser1ős. s1erőt s1erőv ser1s sert2 ser1tr se2r1ü2g serví2 2s1esemé 2s1e2seté 2s1esél 2s1e2sés 2seskü 2s1e2ső se1s2p sessz1a2 sesszé2l sessz1o 2s1este se1sti s1eszen 2seszk s1eszkö 2s1eszm se2szű se2t1a2la se2tana se2t1a2ny se2tát se2t1e2g set1eleg se2t1elk se2t1elm 2setenk 2setes. 2setese 2s1e2teté 2s1e2tető seté2k se2t1ékb se2t1éké se2t1é2l se2t1énk se2t1ér. se2t1é2ri se2t1érté se2tika se2tiká se2tike se2t1ing se2tol set1old se1tran se1tri se1t2ro 2settk seü2t 2s1e2vés 2s1e2vő se1ye se1yé se1yi s1ezr 1sé 2s1ébr sé2f1a sé2f1á sé2g1a2 sé2g1á2 3sége. sé2g1eg 3ségei 3ségek ség1ele sége2lem sé2g1ell 3ségem sé2g1ent sé2ger ség1erk sé2g1esz sé2geté sé2g1e2ti sé2gev ség1é2je sé2g1é2k sé2gép sé2g1ér. sé2g1é2ré sé2g1érn sé2g1érr sé2g1értő sé2g1é2rü sé2g1érv ség1ész ség3g ség1iga sé2g1igé ség1ist sé2gí 3ségk ségo2 sé2g1ok sé2gol sé2g1ó2 sé2gör sé2gő2 ség1őr ség1ős ség1s sé2gu sé2gú 3ségü sé2g1ü2lő ség1ült 2s1éh. 2s1é2he. 2s1é2hek 2s1é2hes 2s1é2het 2s1é2hé 2s1éhh 2s1éhr 2s1éhs sé2jem s1é2ji s1éjs sé2kek s1ékho 2s1ékm 2s1éks sé2k1ú sé2lel s1é2let 2séll 2s1élm sélőkész1 sé2lű 2sély sé2lya sé2lyeg 3sémá sé2mu s1é2nekb 2s1é2neke s1é2neké 2s1é2nekh 2s1é2neki s1é2nekk 2sénekl 2s1é2nekn s1é2nekr s1é2nekt s1é2nekü 2s1é2pí 2s1é2pü sé2ral sé2ran sé2rát 2sérb 2sérc s1érde sé2réé sé2rie sé2rig s1érlel 2sérm sé3ró 2sérr s1értéke 3sérvb s1érvei 3sérvem 3sérves 3sérvh 3sérvr 3sérvv 4sé1ry 2s1érz 2sésdi 2séseki sé2s1el 2séssz 2séstú sész1ak sé2sz1á sé2sz1emb sé2szir sé2sz1o sész3s sét1abl sé2t1a2d 2sétk sé2t1o sétő2 sé2t1őr 2sétr 2sétt 2sétv 2s1év. 2s1évad 2s1évb 2séve. 2s1é2ved 2sévei 2s1é2vek 2s1é2ven 2sévet 2sévéb 2s1é2véi 2sévén 2sévét 2sévév 2s1évf 2sévh 2sévi. 2s1évk 2s1évn 2s1évr 2s1évt 2s1é2vü 2s1évv sfaá3gac sfa2gy1al sfenyőé2 sfé2má sfé2m1e2kéh sfé2m1é sfé2mi sfiúé2 sfi2úéra sfi2úét sf2le sf2lo sf2ló sf2lu sfo2k1út sf2ra sf2rá sf2re sf2ri sf2rí sf2ro sf2rö sga1b sga1d2 sga1p sga1tr sge2o sg2le sg2ló sg2nó s1g2ra sg2rá sg2ri sg2ró shelyü2kü 1s2hi. 1s2hih 1s2hij 1s2hik shitköz1 s2hop s2horr 3s2how shú2sár shús1s 1si si2ac sia2d si2aé si3ak sia2l sia2ny siá2ro si2b1á2 sibilis1 sidás1s si2dea si2deá si2deg si2dei si2den si2deo s2idet 2sidé s1i2dén si2dom 2s1i2dő si2du si2eg sie2l si2en si2eu 2s1ifj 2siga s1i2gazo 2sigá 2sige s1i2ge. s1i2gek s1i2ges 2s1i2gé sig2n1e sig2n1ó2 2siha 3sihed 2s1ihl si2k1a2n sike2r1esz sike2s si2k1in si2k1ir si2k1old s1i2konh s1i2konj 2s1i2konk s1i2konn 2s1i2kono s1i2konr 2s1i2kont s1i2konu sik1orr si1kré sikus1s 2simád si2m1el s1i2mit 3simí 3simog 2simp s1impor si2m1u2t 2s1i2nas 2sind s1indu si2ner 2sinf 2singa s1ingá s1inget s1ingé s1ingók si2nic 2sinj 2s1inku 2s1ins s1inte 2sinv s1invá 2s1inz si2onn s1i2ono si2óa si2óá si2óc si2óda si2óe si2óg si2ói2k si2óo si2óp si2óú 2sipar. 2sipara 2sipará 2siparb 2s1iparc 2siparh 2siparm 2siparn 2s1i2paro 2siparr 2sipartá 2sipartó 2siparu 3sipí 3sipka 3sipká 3sipol 2s1i2ram s1irg 2s1irh 2siro s1i2rod 2s1i2rón 2sirt s1irtó si2sad si2sél si2s1is si2s1í2 sis3s sist2 si2s1ü2 si2s3zab s1i2tal sita2li si2te. si2t1i si2t1ö sit2tin 3sity siú2t 2s1i2vad 2s1i2var 2sivás 3siví 2s1i2vó 2sizé si2zé. si2zéb s1izmo 1sí sí2gé sí2ja sí2ju sí2kas síke2 sí2k1er sí2kí sí2kü sína2 sí2nac sí2nal sí2nan sí2n1á2 sí2nel sí2nö 2síns sí2n1ú sí2r1ad sí2r1ál sírá2s3z sír1á2to sí2red sí2r1e2m sí2ren sí2res sí2r1e2t sí2r1én sí2rir sí2rí s1í2róa sí2róf sí2ról sí2róp sí2rö sír2t1e2v sí2r1ü sí1sp sí1st síté2kol 2sítél sítés3s sítőa2 sítőe2 sí1tr 2s1ív. sí2vá 2s1ívb s1í2vek s1í2ven s1í2vet sí2vé sí2vű sí2za sí2ze. 2s1ízl s1ízr 2sízü sí2zül sje2gy1á2 skao2 skapocs1 ska2r1i2m skaros3 ska2ró2r ska1sm skat2 ska1tr skau2 1skálák 1skálár ske1p2 ske1s2p ské2p1el skiá2 1s2kicc skie2 sk2jö sk2la sk2li sk2lí sk2lo sk2ló sk2lu skolás1s s2korpi sko2s1a2rai skó1p s1k2rá s1k2ré s1k2rit sk2rí sk2rón sk2ru sk2va sk2vi sk2vó sky1ér sky1i sla1d2 sla2g1e2 sla1s2p sla2t1a2l sla2t1a2n sla2tel sla2tev sla2tés sla2t1é2t s2lág 1slágerei slá2nyal slás3s slega2 sleg1g sleí2 sle2tal sle2t1el sle2t1em sle2tél sleves1s sléi2 sléke2 slé2kev slé2k1ol slés3s slic2c1elv sli2d sli2ká 1s2liss slős2 s2lus smaó2 smarc2 smas2 sma1sp 3s2már. 3s2máru sme2g1a2 sme2g1é smen2tel 1smirg sna2pal sna2p1e sna2p1or snap2sz1e2 sne1yi snit2t1elv snőé2h 1so s1obj so1c2k sodaéne2 soda1g2 so2d1e so2dén so2dév so2did so2dis so2dí so2dob so2d1org so2d1os so2dö so2dő sodrás1s so2dú sod1út so2dü so2d3z so2kab so2kai so2k1aj so2k1a2la so2k1ap so2kar soka2t so2k1ato so2k1ál so2k1árn so2k1e2 sok1ill so2kí 3sokk. sokka2l sok2k1ala sok2k1a2p 2sokke sok2k1el sok2kir sok2k1ö2v sok2k1ü 2sokl 2sokm so2kok sok1old 2so2kos 2s1o2koz so2k1ó2 2sokta s1oktat so2k1ú2 so2kü 2s1o2laj sola2j1á2r sola2je sola2tel solás1s 2s1olda 2s1oldá 2soldó s1oldó. s1oldók s1oldóm s1oldón s1oldór s1oldót s1oldóv so2lim 2s1olló solóó2 s1oltás 2solvas so2lyan so2lyó so2m1ad somag1g so2m1a2l soma2t som1ato so2m1e2 so2mél so2m1éte so2mil so2m1ita so2mí so2m1odo som1ort so2m1osz som1p so2mú so2mü son2ch 2sond so2n1e son2kál son2k1e2 2sonó son2tab son2t1a2l son2t1a2n son2tar son2t1á2r son2t1e2 sonté2r son2t1éré son2tik son2tip son2tö son2tő 2sonv so2nye so2nyis so2ór so2ós s1opc s1o2pe sor1ada sor1ala sor1áll so2r1átl 3so2r1e2 sor1f2 s1orgi so2rid 2sorie so2rif so2rim so2r1ing so2ris 3sorké sormű1 sorműt2 sor1oszt 3soroza so2r1ó2 so2rö so2rő 2s1orr. s1orrát 2sorrb 2s1orrn 2s1orro 2s1orrú 3sors. sor2sal sor2sar sor2sas sor2s1e2 sor2sir 2sorsó sor2sü sor1sz sor2szón sor1tre sorú2t so2r1úto so2rü so2rű 2s1osto 2s1ostr s1osty 2sosz s1oszl s1oszt so2ul so2ur so2ve so2vis so2xi 1só sóá2g sóá2r sócsapá2 só2dái só2dák só2dáv sógé2p1e2ké só1g2r sói2g sóí2v só2k1a2d só2kil só2kim só2kó só1kré sómű1 só2né. só2ni sóó2r só2rai só2ráb só2rái só2ráj só2rám só2rán só2rár só2rát só2riá só2s1ü2 só1sz sótá2ny1ér só1t2r 2s1ótv 2s1ó2vó 1sö sö2bű sö2ga sö2gá sö2g1e2l sö2g1em sö2g1ék sög3g sö2go sö2g1ö2lé sö2g1ölt sö2gű sö2ka sö2k1el sö2kid 2s1ö2ko s1ö2kör sö2kú sö2lőj s1ö2lőz s1öly sö2na sö2ná sön2d1a2 sö2no sö2n1öl sö2n1ő s1öntv sö2nú 3sör. sö2ra sö2rá 3sörb 2sörd sö2r1ed sö2reg sö2ren sör1f2 sö2r1iz 3sörk sö2ro sö2ró sö2r1ö2l sö2r1ő sör1s sö2ru 2sörv s1össz s1ösv s1ösz 2s1ötl 2s1ötv 2s1öv. 2söve s1övv s1ö2zön 1ső sőa2c sőa2l sőa2n 2sőá2g ső1bl 2sőbok ső2dad ső2dalk ső2dá ső2del ső2din ső2d1ő2r ső1dro sőe2l sőe2r sőe2s ső1gr ső1kl ső1pl ső1pn ső1pr ső2r1aj ső2r1á2csot ső2riz ső2rol sőr1ö2l s1őrti s1őrz ső2s1av ső2sim sős1orra. ső2s1orrá ső2s1orró ső1s2p ső1sta ső1str sősü2 ső2s1ül ső2s1üt ső2szap ső2sz1áll sőszé2k sősz1éké ső2sz1í spa2d1a2 s2patu s2páj spá2n1a 1s2párg 3s2peci 1spektr 1s2peku 1s2pék s2p1ér 1spirálú spis3s sp2le2 s1p2lé sp2lu sp2ne 1s2pong sporta2 spor2t1al 1s2portág spor2tár 3s2portb spor2t1e2 1s2porté spor2t1érd 1s2porth spor2t1i2n 1s2portj 1s2portn 1s2portoka 1s2portol 1s2porton 1s2portos 3s2portot spor2t1ö spor2tő 1s2portra 1s2portró 1s2porttó 1s2portu spor2t1ü2 1spórák. 1spórol sp2ra s1prak 3spray s1p2re s1p2ré 1spric s1p2ro s1p2ró sp2sz 1s2raf srau2 1s2ráco sren2d1ő2 3s2róf srú2de ssab2b1i ssa2vo sság3g ssé2g1e2l ssé2g1é2j ssé2gid s2s1ékt s2s1i2z ss2kál ss2ko ss1k2r ss2lá sso2m1o ss2pó s1s2rá ss3sz ss2tad ss2tar ss2tat s1s2tí ss2to s1st2r ss2tú ss1ura ssy1ér ssy1ét s2sz sszae2 ssza1p2r sszat2 ssza1tr ssz1á2g ssz1á2ram ssz1á2ruk ssz1á2sz s3száza s3szedé sszeg1ér. sszegü2l ssze2g1ülő ssz1egye s3szekv ssz1e2lőa s3szeml s3szemm ssze1p2 ssze2reib ssze2reid ssze2rein ssze2reké ssze2rekt ssze2rem. ssze2remm ssze2rese sszer2t1á2r ssze1t2r s3széki ssz1é2lő sszér1in s3széto s3szige ssz1ing sszis1s sszí2vel ssz1k2 sszkész1 s3szob ssz1osz ssz1ósá s3szöc s3ször ssz1ös s3szöv ssz1p2 ss3zsi sszt2 ssz1tro s3szur sszus1s ssz1úr. 1stabil 1stadio st1a2dó 1stafí s2t1alj s2t1alk s2tand 1standa sta2n1ó2r stan2s1é st1a2nyag s2tarc 1s2tart. star2tas 1startos 1s2tartot 1startt sta1sl sta1s2t sta1t2r sta3u stau2t s2t1a2x st1azo 3stáb. 1stábj 1stábk 1stábn 1stábot st1ág. st1áld stán2c1ol stán2s1á2 stá2riá s2t1árka s2t1árká st1á2t1a2 st1áts 1s2tátu st1átv st1br st1dr ste2a 1s2teak s2t1ebé s2tedén s2t1e2gy s2t1e2ke. s2t1elf s2t1elh s2t1ellen s2t1elm s2t1e2lo s2t1elö s2t1e2lő s2t1elr s2t1elt s2t1elv s2t1ember s2t1e2mel s2t1eml ste2n1a ste2n1á ste2neg ste2n1és sten3n ste2nos ste2n1ő2 1stepp ste2rad ste2raj ste2ral ste2rav ste2rác ste2rál ste2r1e2le 1sterili ste2r1int ste2ris ste2r1o s2t1erő ste2sz s2t1eszm ste2u 1stégek 1stéget 1stégg 1stégr sté2k1a2 sté2ká stékát1 stékáta2 sté2k1el st1é2kesí st1ékí sté2k1o sté2ku s2t1é2le st1é2lé s2t1élm s2t1élt st1élv s2t1érc s2t1érem s2t1é2ré s2t1é2rőt s2t1érté s2t1érz stés3s s2t1észl s2t1étk s2t1é2ve. st1fl st1fr st1gr s2t1i2d sti2g s2t1ige s2t1igé s2t1i2ma s2t1i2má 1s2timm s2t1imp sti2na. s2t1ind s2tinf s2t1ing s2t1inv s2t1i2o st1i2pa st1irá st1iró stis3s sti2sz s2t1isza s2t1i2vá st1i2zo s2t1íj 3s2tíl s2tír st1írá st1í2v st1í2z stká2ro st1kr st1kv stola2t sto2lato sto2p1a 1s2topb 1s2toph 1s2topr 1s2topt sto2rál sto2rás sto2re sto2ris st1o2x 3s2tóla 3s2tólá st1ó2rá 1s2tós stö2k1ölt s2t1önt s2t1örö s2t1össz stőa2 stőe2 stőkész1 s2t1őra s2t1őrb s2t1őrc s2t1őreg s2t1őrei s2t1őré. s2t1őrén s2t1őrér s2t1őrév s2t1őrf s2t1őrg s2t1őrh s2t1ő2ri st1őrl s2t1őrm s2t1őrn st1őrp s2t1őrs s2t1ő2rü s2t1őrv st1pf st1pl st1pr 1strando 1st2rap 1straté s1trág 1st2réb s1t2rén st2riá st2róf 1strófá 1st2ruc 1struktú st1sc st1st st1sz st1t2r s2t1udv 1stukk st1uni st1u2ral 3s2túd st1úr. st1út s2t1üg s2t1ü2lő st1üst s2t1üt s2t1ü2v s2t1űr. s2t1ű2ri s2t1űrn s2t1űrt 1su suá2r subi1 s1udm 2s1udv 3sugár. 3sugárr 2s1ugr 3suhi 2sujj suj2j1a2da su2k1ará su2ke su2k1ö su2k1ü 3summ su2nal 2s1und 2s1u2ni su2no supe2 2sura s1u2rad su2rai su2rak su2ral su2rat su2rát 2surn 2s1u2ru su2szo 2s1u2tac 2s1u2tad 2sutak s1u2tal 2s1u2tam 2s1u2tan sutas1s 2s1u2tat 2su2tazi s1u2tazó 2s1utc 2sutó su2tód 2sutu 1sú sú2csal sú2csat sú2csem sú2cser sú2csip súcská2 sú2cs1ö sú2cs1ü2 súcs3z súdi2 súi2m s1újh 2s1ú2jí 2s1újs 3súly 2súr. 2súrb 2súré 2súrh 2súri 2súrk 3súrl 2súrn 2súrp 2súrr 2súrt sú2sén sú2só 2súsz súszó2s3z 2s1útb sút1en 2súté s1úth 2súti sú2tig 2s1útj 2s1útk s1útn 2súto s1ú2ton sú2t1ő 2s1útr 2s1útt sútü2 sút1üz 2s1útv 1sü sü2d1e sü2dí sü2dü 3sü3gé s1üggy 2s1ü2gy 3sü2k1a sü2kü 2süldö sü2led 3sültr sülye2 sü2lyes sü2ná süne2 sü2nev sü2n1é 2s1ü2nő sü2rí 2s1ü2rü 2süst 2s1ü2sz 2sütk 3sütőb sü2ze sü2zé 1sű sű1pr sű2r1a 3sűrí s1ű2ru sű2ző sva2s1u2 svá2gy1ón. svá2nyan svá2r1al svárosi2 sven1 svezetőé2 své2nyel své2tes svíze2 svíz1es s2vun sw2hi swhisky2 sy2bő sy1ig s2z 1sza szaa2 3szabáz 3szabd sz1a2dás 2sz1a2dó szaé2 3szaft 3szag. 3szagb 3szagú 2szagy. 2szagya 2szaj. 2szajá 2szajj 2szajú 2szakci 3szakm sza2k1ó2r sza2köz 2szalás 2sz1alb 2sz1alf 2szalg 2szalj sz1alj. sz1aljak sz1aljo 2szall 2szaln 2sz1alp 2sz1als 2szalt. 2sz1alte 2szalto 2szaltu 2szane sz1antr 2szanya 2szanyó 2szap. 2szapá 2szapb sza2pel 2szapé 2szaph 2szapi 2szapj 2szapn 2szapr 2szapt 2szarán 3szarb 2szarc 2szaré 3szart 3szarv 2szasp sz1assz sz1aszt sza2tala 3szaty 2szaut szau2ta 3szax 2szazo 1szá 2szábr 2szágó 2szágy szá2gyá szá2gyo szá2j1e szá2ke 2száldo szá2lin 3szálú szá2man szá2mar 3számá szá2mál 3számc szá2m1e2 3számé szá2m1érté 3számí 3számk 3száml 3számm 3számn szá2mor 3számt 3számú 3szánd 3szánt 2száp 2száradd 2szárás szá2r1e 2száriá 3szárí 3szárm szá2r1ó2ra szárt2 2száru. 2száruh 2szárus 2szásó. 2szátd 2sz1á2t1é 2száti 2szátl 2szátm 2szá2t1ö 2száts 2sz1átu 2sz1á2tü 2szátv sz1bl sz1br 1szcéna sz1cl sz1d2r 1sze 2szeb. 2szebé 2szech 2szecse 2szedz 2szeger 3szegfű 2szegz 2szeh 3szekcső. sze2keg 2szekéit 2szekés sze2kés. 3szekrén 3szekto 3szele. 2szelef 2szelemb 2szelemek 2szelemé 2sz1e2lemk 2szelemm 2sz1e2lemr 2szelemü 2szelemz 2szelere 3szelet 3szelén 2sz1elf 2sz1elgo 2sz1elha 2szelhá 2sz1eljá 2szelkü 2sz1ellá 3szellő 2sz1elm 2szelnev 2szelnö 2szelo 2szelö 2sz1e2lőá sze2lődö 2sz1e2lőf sze2lőré 2szelső 2sz1elszá 2sz1elta 2szeltá 2szeltű 2szelu 2sz1elül 2szelv. 2sz1elvá 2szelvek 2szelves 2szelvez sz1elvi 2szelvn 2szelvt 2sz1elz 2szember 3szemek 3személ 3szem1p2 3szemű. 2szenc 2szener 3szenny 3szentm 3szenz szeo2 2szepi sze2r1á2l 2szeredm szer1e2ge sze2rej 3szerel szer1eszt 3szerke 3szers 3szerta szer2tálo 3szerv szervíz1 3szerz 2sz1esd 2sz1esemé 2szesetb 2szesete 2szeseté 2szeseti 2szesetr 2sz1e2sés 2szeskü 2szeső sze1sp 2szeste 2szesté 2szesti 2szestj 2szestr sze2t1e2lő sze2t1é2k 2szetika sze2ton sze2tőr 2szeve 2szevő 2szexp 3szezo 2szezr 1szé 2széber 2szébr 2szég. 2szége 2szégő 2szégr 2széhe. 2széhen 2széhet 2széhs 2széji 3széke. 3széked 3székei 3székek 3székem 3székes 2székez 3székéb 3székév szé2k1ol szé2kos 3széks 3székü 3szélek 2széneke 2szénekn szé1pró 3széps 2sz1ér. 2sz1érb 2sz1érc 2sz1érd sz1é2rel 2szérem szé2rem. szé2remm 2sz1é2ren 2széré szé2ré. szé2rén szé2rér szé2rét szé2rév sz1érf sz1érg sz1érh 2sz1érin sz1érj 2sz1érk 2sz1érl 2sz1érm sz1érn 2szérő. 2szérői 2szérők 2szérőt sz1érp 2sz1érr sz1érs sz1értá 2sz1érte 2sz1érté sz1értí 2sz1értő 3széru 2sz1é2rü 2sz1érv 2sz1érz szé2tel széte2s 2szév. 2szévad 2szévb 2széve. 2szévei 2szévek 2sz1é2vet 2szévén 2szévét 2szévév 2szévf 2szévi 2szévk 2szévn 2szévr 2szévs 2szévt 2szévü 1szférai 1szféráé 1szféráso sz1fl sz1fr sz1gl 1szi szi2ab 2szide 2sz1idé 2szidő 2szifj 2sz1i2ga 2sz1igé 3szign szi2k1a2s szi2k1e2r szi2k1ó2 sz1imak 2sz1i2má 3szimb sz1impr 2szimpu 2szinas 2szinde 2szindí 2szindu sz1info 2szing sz1inko 2szinteg 2szio 2szirat 2szirá 2sz1i2ri 2szirod szi2sí 2sz1i2sza szi2szá 3szitu 2szivad 2szivás 2szivó sz1izg 2sz1izz 1szí 2sz1íg 3színe 2színna szí2vár 2szívi 3szívű 2sz1íz szka1pr 1szkarab szk1arch 1szkenn 1szlávh 1szlávok 1szleng. 1szlengn 1szlengr szle2t1e2l szle2t1o 1szloge 1sz2mok 1sznob 1szo 2szobj 2szoda. 2szodai 2szodak 2szodú 3szof 3szoká 2szokke 2szokoz 2szoksö 2szolaj szo2l1ál 2szolda sz1oldá 2szoldó 2szo2lim 2szolló 2sz1oltár 2szoltás 2szolvad 2szolvas 2szombor. 3szoms szo2nas szo2nár 3szond 2szora szo2r1ál 2szorm 2szorn 2szors 2szorv 2szostá 2szosto 2sz1otth 3szov 2sz1ox 1szó 2szólm 3szóló 2szónád 2szónái 2szóni 2szónod 2sz1ó2rán 2szórát 2szóri szó2sík 3szósz. szósza2k szó2száll szó2szón szó2szülő szó1tr 1szö 2szöbli 3szöge 2szöldes 2sz1öle 2szöre 2szöv. 2szövei 2sz1öz 1sző szőa2 szőe2r szőé2 3szőlő sző2ra sz1ősi 2szőz sz1őze 1sz2pí sz1pl 1szponz szrádi2 sz3saj sz3sap sz3sas sz3sav s3zsák sz3sán sz3sár sz3sás sz3sát sz3sáv sz3seg s3zsem s3zsen sz3sep sz3ser sz3sé sz3sh sz3sik s3zsin sz3sis sz3siv sz3sín sz3s2k sz3sl sz3sod sz3sok s3zsol sz3sor sz3só sz3sör sz3söv sz3s2p sz3s2r sz3s2t s3zsúll sz3sü sz3sz sz2t1álla sztá2r1a2d szt1á2ram sz2tá2ras sztá2rat sz2táre sz2tárf sz2tárh 1sz2tárj sz2tárny sztáró2 sz2táru szt1á2ruk sz2tárv szte2r1el 1sztereo szté2g szt1ége sz2térte sz2t1érv sz2t1été szt1örök sz2t1őrn 1sztrádá 1sztrájk sz2tür 1sztye 1szu szu2b szub1o szuc1 2szud sz1udv 2szugo 2sz1ugr 2szuh 2sz1uj 3szuká sz1u2ra 2sz1u2rá 2szuta sz1utó 2szutu 2s3zuz 1szú 2szúg 2szúj sz1úron 2sz1úrr sz1úrtó 2szús 2szúté 2szúth 2szúti 2szútj 2szútn 2szúto 2szútr 2szútt 2szútv 2szúz 1szü 2sz1üd 2szügg 3szüks 2szüld 2sz1ü2led 2szülőse 3szüne 3szürke 3szürkés 2sz1üs 2sz1üv 1szű 3szűk 2szűrödn 1szvit. 1szvitet 1szvitj 1szvitn 1szvitt sz3zs 2t. 1ta taa2d taa2l taát1 taáta2 taboz1 ta1bra 2t1abro ta1bró 2t1abs ta1cl ta2dalé 2t1adap ta2das t1a2data 2t1a2datb 2t1a2dato ta2datu 2t1a2dá 2tadio t1adj t1adl 2t1adm ta2dod 2t1a2dog 2t1a2dot 2tadó t1a2dóa ta2dóá ta2dób ta2dód ta2dóf ta2dóg t1a2dóh t1a2dóig t1a2dóik t1a2dóin t1a2dóit ta2dóí t1a2dój t1a2dóka t1a2dóké t1a2dóko t1a2dókra ta2dól t1a2dóna t1a2dóná ta2dóp t1a2dór t1a2dótó ta2dóü t1a2dóv ta1drá ta1d2re ta1dro t1ads ta2dun t1adv tae2l tae2r ta2ero taé2r 2tafí ta1f2r taf2ta ta2g1aj ta2gav taga2z tag1azo ta2gág ta2g1ál ta2gec ta2g1el ta2g1e2r ta2g1é2g 2taggo 2t1aggr ta2gid ta2giz ta2g1osz ta2g1ott ta2góc 2t1a2gón ta2g1ó2r ta2góv ta1g2raf ta1g2ram tagrádi2 ta2g1u2s ta2gut ta2g1ü2 2t1agy. ta2gya. ta2gyáb ta2gyáh 2t1agyb 2t1agyn 2t1agyr 2t1agyv ta2ire tai2rón tai2z ta2jé ta2j1u2s ta2jús 2t1a2kad ta2k1ál taká2r tak1áro ta2kás ta2kátk 2t1akce 2t1akci take2l tak1ele ta2k1ér. tak1é2sze 2t1akkora 2takkord 2t1akku ta1k2la ta1klu t1akna. ta2kó. ta2k1öb ta2k1öröm ta2k1ös ta1krá tak2reá ta1krí 2t1akro ta1k2rón 2t1akta. tak2tem 2takti. 2t1aktiv 2t1aktí 2t1aktj taktus1s ta2kus ta1k2va ta2l1a2da ta2l1a2dá ta2l1adh ta2l1adj ta2l1adn ta2l1a2do ta2l1a2dó ta2l1adt ta2l1a2du ta2l1adv 2tala2g1 t1a2lagu ta2lagú 2t1a2lakb tal1akc 2talakí 2t1a2lakj 2ta2laku 2t1alakz ta2l1a2l 2t1alany 2t1a2lapa 2t1a2lapí ta2lapk t1a2lapl 2t1a2lapsz ta2l1a2r ta2l1as tala2te 2talatti ta2l1au 2taláá ta2l1á2g 2taláí ta2l1állo tal1á2rak talás1s ta2l1áta tal1átr tal1ell ta2l1elő ta2l1eng tal1esi talé2g talé2k1e2 ta2l1ér. 2t1alge ta2l1i2ko tal1ikr tal1imp tal1ina. ta2lip ta2l1isk ta2l1í2r 2taljas 2t1alji 2taljz 2t1alkal 2talkím 2talkoh 2talkot 2taller tal3ly ta2l1ol talo2m1e ta2l1osz ta2l1őr tal2p1á2ro tal2pel tal2p1il tal2pus tal1t2re ta2lud 2t1a2lulj ta2l1u2r ta2l1u2t ta2lúr ta2l1út. ta2lü ta2lű 2talveo ta2mal tam1alm ta2maz ta2m1i2d 2t1a2mő t1ampa 2t1ampu 2t1amur ta2mü ta2n1aj ta2nal ta2nan 2t1a2nat tan1áll tan1álo tanás1s tan2del 2tandr ta2n1el ta2ner 2ta2n1es ta2n1ez ta2n1éj ta2n1ér. ta2n1érk tan1évb tan1é2vé tan1é2vi tan1évm ta2nid 2ta2nim tan1ist tanké2r tan2kére tan2kés tankó2 tan2k1óra 2tanny ta2n1osz ta2nód tan2te. tan2t1el tan2tors tan1trá ta2nü ta2nű 2tanyag 2tanyád 2t1a2nyó tao2l taó2r 2t1a2pa. 2t1a2pai ta2paké ta2pasá 2t1a2páb 2t1a2pád 2t1a2páé 2t1a2páh 2t1a2pái 2t1a2páj 2t1a2pák 2t1a2pám ta2pára ta2páró 2tapáu 2t1a2páv ta1p2la ta1plé t1a2pó. 2tapp ta1p2ré 2t1aprí ta1p2ro tap2sor taps3s tap2s1ü2 2tapun ta2rabe ta2rai 2t1a2ras 2t1a2rat 2t1a2ráb tarádi2 2t1a2ráh 2ta2rán 2t1a2rát 2t1a2ráv 2t1arbi 2t1arc. 2t1arch 2t1arco t1arcu 2t1arcú ta2r1i2k ta2romá tar1s2 tar2tab tar2t1e2l tar2t1em tar2t1en tar2t1ér. tar2tit tar2told 2tartos 2tartr 2tartt 2tasc ta2sem 2tasf ta1s2ká ta1slu ta1s2m 2tasnő ta2s1ol 2t1aspi ta1spr 2tasru 2tassz tas3szá tas3szt tast2 ta1s2ta 2taste ta1str 2tasv ta1sy 2t1aszk ta1szl ta2t1alj ta2t1alm ta2t1aszt tatá2rai. 2t1a2tei tate2s 2tatika 2tatiká ta2t1i2na. ta2t1i2ná ta2t1ing t1atlas t1a2tomo tat1orj ta2t1őr ta1t2ri 2t1atti tat1u2ra ta2tya ta2tyá 2t1a2uk tau2ta tau2tá 2tauto taü2z 2tavan 2tavatá 2tavató ta1wh ta2zon 1tá 2táb. tá2b1á tábe2sz1é2l 2tábé tá2big tá2bin 2tábj 2tábk 2tábn 2tábok 2tábon 2tábot tá2bö 2tábr t1ábrá tá2bü 2táciu tá2fa tá2fá 2tág. tá2ga. tága2d tág1ada 2t1á2gai tá2gaz 2t1á2gá 2tágb 2t1ágc 2t1á2ge 2t1á2gé 2t1ágf 2tágg 2t1ágh 2t1á2gi 2tágj 2t1ágk 2t1ágm 2tágn 2t1á2go 2tágr 2t1ágt 2t1á2guk 2t1á2gun 2t1á2gú 2t1ágv 2t1á2gy tá2hí tá2jal tá2jaz tá2j1e2g tá2j1e2l tá2jí tá2j1ok tá2j1ö2 tá2jő t1á2jul tá2lab tála2d tál1ada tá2laj tál1a2lap tá2lap 2t1álar tá2l1ál tá2l1áth 2t1áldá 2t1áldo tále2 tá2l1eg tá2l1el tá2lél 2t1áll. 2t1állam 2t1állan 2t1állat 2t1állás 2t1állh 2t1állí 2t1állj 2t1álln 2t1állo 2t1álls 2t1állt 2t1állu t1állú 2t1állv 2t1álma 2t1álmi 2t1álmok 2t1á2lomr tá2lomt tá2lö 2t1álru tá2lü tá2lyab tá2ly1a2c tá2lyad tá2ly1a2g tá2ly1a2l tá2ly1a2n tá2lyap tá2ly1at tá2lyau tá2lyátl tá2ly1á2z tá2lyid tá2lyir tá2lyis táma2sze tá2mí tá2mos 2t1á2mu tán1alm tá2nár tánc3c tán2c1e tán2céh tán2cél tán2cén tánckész1 táncs2 tán2csá tán2csor tán1d2 tá2n1e2 tá2ní tá2n1ó2 tá2nö 2tánpó tán2s1e tá2nü tá2nű tá2nyal tá2ny1as tá2nye 2tánz tá2p1a2 tápá2 tá2pál tá2p1ár tá2pát tá2p1e2 tá2p1il tá2p1in táp1oll tá2p1osz tá2pő tá2pü 2t1á2radá tár1a2dot tá2radó tá2r1a2g tár1ajt tá2r1a2l 2tárama. 2táramá 2tárami 2t1á2raml 2táramok 2táramol 2táramot 2t1á2ramt 2táramu 2táramú tára2n tá2r1any tá2rap tá2r1asz tá2r1att tá2r1au tá2r1av tá2rág tá2r1ál tá2r1á2sz tá2r1átl 2tárboc tá2r1e2 tá2réd tá2rés tár2gyö tá2r1i2k tá2r1i2p tár1isk tá2r1ism tá2rí tár1k2 2t1árkád 2t1árkána 2tárkár 2t1árnyé tár1okm tá2r1osz tá2róc tár1órá tá2rö tá2rő tár2s1alt 2tártás tárt1öltő tár1tro 2táru. 2tárua 2tárub 2táruc 2t1á2rug 2t1á2ruh 2tárui 2t1áruj 2táruna 2tárus 2tárut. tár1uta 2táruü 2táruv 2tárúé tá2rúj 2tárúk tá2rús tá2rü tá2rű tá2s1a2d tá2s1aj tá2sal tá2s1a2r tá2saz tás1á2ga tá2s1á2rai tá2s1á2rá tá2s1á2ré tá2s1árh tá2s1árn tá2s1á2ro tá2s1árr tá2s1árt tá2sás 2t1ásáso tá2s1á2to tá2s1e2 tá2sis tá2sodv tá2s1ol tá2sor tá2só 2tásók tás1ó2r tá2sö tá2ső tás3s tást2 tás1tr tá2sut tá2s1ü2 tá2sű t1ásván tá2sz1ak tá2szal tás3zav tá2s3zá tá2sze tás3zen 2tászi 2tászo tá2szos tá2s3zó 2tászt 2t1átad 2t1á2tál 2t1átc 2t1átd 2t1á2t1e2 2t1á2t1é 2t1átfo 2t1átg 2t1áthe 2t1áthi tá2t1ir 2t1á2tí 2t1átje 2t1átkö 2t1átlag 2t1átm 2t1á2t1ol 2t1á2t1ö 2t1á2tő 2t1átp 2t1átre 2t1átru 2t1átsz 2t1átte 2t1átté 2t1áttö 2t1áttű 2t1átut 2t1á2tü 2t1átvi 2t1átvo tá2v1a2d tá2vak táva2l tá2v1a2n tá2vas tá2vaz tá2v1ál tá2v1e2 tá2véd tá2v1érz tá2v1és tá2vin tá2vis tá2ví tá2v1or 2t1á2vó tá2vö tá2vő tá2vü tá2zsal tá2zsál tá2zsó tázs1p tbal2le tbeá2 tb2la tb2le tb2li tb2lo tb2lú tb2ra tb2re t1b2ri tb2ro tb2ró tb2ru tca1k tca1s tca1t2 tc2lu tc2re tcsap1á2g tdíja2d tdí2j1ada td2ra td2rá td2re td2ro td2ró td2ru 1te te2aa te2aá te2ab te2ac te2a3d te2ae te2aé te2ag te2ah teai2 te2aiv te2aí te2aj te2aku te2alap te2aláz te2ali te2ana te2ao te2aö te2aő te2apa te2apá teas2 te2a1sp te2asza te2aszá te2aszo tea1tró te2aú te2aü te2av te2az te2ber te2béd 2techó te2csá te2dit te2dí 2t1e2dz 2t1eff te1f2r te2gan te2g1a2r tega2z teg1azo te2gá teg1ál teg1ár te2g1eg teg1e2lem te2g1ell te2g1elr te2gene 2tegere. teg1ered te2g1él te2g1é2p tegész1 teg3g te2gid te2gis te2giz te2g1on te2g1ö te2gú te2g1ü2g tegü2l te2g1ülé te2g1ülő 2t1egy. 2t1e2gyes t1e2gyez t1egyén 2t1egyh 2t1egyl 2t1egys 2tegyüt tei2g tein1s te2j1a teje2g te2j1ell te2j1elv te2j1er te2jin te2jí te2jo te2j1ó te2j1ös te2jő te2j1u2 te2jú te2k1ag te2k1ál te2k1el tek1éret te2k1i2p te2kí te1klu te2k1ok te2k1ös te2k1und te2k1út te2lab te2lag te2laj te2l1an te2lap te2lar te2las te2lav te2l1á2g te2lál telá2r te2l1át 2telbü teleí3rá 2telej tel1ejt 2telektr tel1e2len te2l1elk te2l1ell te2lemba te2leme. 2telemei 2te2lemek te2lemes te2lemén 2t1e2lemű tel1esés te2l1e2ső te2l1este tel1esti tele2t1ér. t1e2lég tel1érét te2l1éte t1elfoga telié2h te2l1imi te2lind te2l1inf te2l1ing 2t1elix te2lír tel2l1eg 2tellenf 2tellenő 2tellenz 2t1ellniv 2telméle te2l1ó2 te2l1öl 2telőadá 2t1e2lőí 2telőnn 2t1e2lőny te2lőtt 2t1e2lőtu te2lővét tel1őzi. tel1p2 2t1elsa 2t1első 2t1eltelé 2t1eltett. 2t1eltéré te2lú telü2ké. 2t1elv. 2t1elvb 2t1elvei 2t1elvek 2t1elvet 2t1elvév 2t1elvh 2t1elvi. 2t1elvil 2t1elvk 2t1elvn 2t1elvr 2t1elvt 2t1elvü 2t1elvű 2t1elvv te2map te2m1as 2t1embl 2t1embr te2m1e2g tem1e2leg 2t1emelé 2t1emelk 2te2melő te2melv te2m1él te2m1ér. te2m1é2rő. tem1érté 2t1e2més te2m1éte te2m1étk te2mid te2migr tem1ill te2mim tem1ing te2m1int te2móc te2m1ó2r te2m1ő2 2tempá 2templi 2t1e2mul te2mus te2mut temü2l te2m1ülé te2nad te2n1a2g te2nal te2n1a2r te2n1as te2nat te2nau te2n1á2t ten1d2h tene2g ten1egy te2n1el te2ner 2tenerg te2n1esz te2n1ékt te2n1év. te2n1évi 2t1enged te2n1i2p te2n1ol te2n1ó2 te2nö ten2tin ten2t1í2v ten1tri te2n1u2 te2nú te2n1üg te2nünn 2t1enyh t1enyv te2oc te2of teo2s 2t1epiz 2t1e2pos 2tepp tep2p1é2k ter1abl ter1a2cé te2r1ada ter1aka te2r1a2n te2r1a2r te2rau ter1á2cs te2ráf te2r1áll ter1álm te2r1á2ri ter1áta ter2ch ter1d2 2terdő 2teredm te2r1e2dz ter1egé ter1egy 2t1e2rej te2r1e2ke. 2t1e2rekl te2r1elm tereme2 te2r1ent 2tereo tere2pa tere2p1e2l tere2p1ü2lé te2r1er te2r1e2ső te2r1este te2r1esté te2reta te2r1eti te2retn te2rég te2r1é2j ter1éka te2ré2l ter1éle ter1élv ter1g2 ter1iko 2terili ter1illa teri2na te2r1i2p te2rism ter1ist ter1izm ter1k2 t1erkölc termés1s te2r1old te2ror te2r1ox te2r1ó2r te2rök te2r1ön te2rő 2t1erő. 2t1erőb 2t1erőf 2t1erős t1erőt t1erőv ter1s2 tersz2 tert2 ter1tr te2rur te2r1ut te2r1út te2r1üg te2r1üld ter2vaj ter2van te2sar te2sár te2sel tes1ell 2t1esemé 2t1e2setb 2t1e2sete. 2t1e2setei 2t1e2seten 2t1e2setet 2t1e2seté 2t1e2seth 2t1e2seti 2t1e2setn 2t1e2setr 2t1e2sett te2sél 2teséll 2tesély 2t1e2sés te2s1int tesí2r te2sírn te2s1író te2síz 2teskü t1esni te2sot 2t1e2ső tesp2 2t1esszen tes2tak tes2t1áll testá2r tes2tára tes2t1elk tes2t1ell tes2t1er 2testéj 2testék tes2t1ékn tes2t1éks 2testém tes2tism tes2t1o testő2 tes2t1őre tes2t1őré tes2tur te2s1ú te2s1ü2v 2teszet 2t1eszmé tesz2t1a2 teszte2r tesz2t1ere tesz2t1é2te tesz2tor te2t1a2k te2t1a2l te2tana te2t1a2p te2tág te2t1ál tetá2r te2t1ára te2tát te2t1e2g te2t1ell tet1e2lő tet1elr te2t1elv te2tene tete2r te2t1eré te2t1esz te2t1éj tet1ékk te2t1é2l te2t1éri te2t1érv te2tid 2t1e2tika 2t1e2tiká te2tim te2t1int tetkész1 te2t1olt te2t1ot te2tór te2tur te2t1üz 2t1e2tűd te2t1ű2z tevés3s te2vol te2w1a 2t1exp 2t1e2zer tezőa2 t1ezred 1té 2t1ébr té2cő té2des 2tég. 2tégb 2téget 2tégé té2gép té2gés 2tégg 2tégj 2t1égk tégla1 2tégn 2t1é2gö 2t1é2gő 2tégr 2tégt tégü2 té2g1ül 2t1éh. 2t1é2hek 2t1é2hen 2t1é2hes 2t1é2het 2t1é2hé 2t1éhs 2t1é2jen té2jes 2t1éjr 2t1éjs 2t1éjt té2kab té2kad ték1ada té2k1aka ték1alk té2kam té2k1a2n té2k1ar téka2t té2k1att té2kaz té2k1ág té2k1e2c té2kedé té2k1e2g té2k1e2kéh té2k1e2lőá té2k1elr té2k1er té2k1esz té2k1eti té2k1é2k té2k1é2l té2kép té2k1ér. té2k1és tékfélé2 tékfé2l1év té2kid té2kik té2kim té2kirá té2k1i2s té2kí2 té2k1o2r té2k1osz tékó2 té2kór té2k1ö2 té2kő té2k1u2t tékü2l téla2 té2lak té2l1an té2lap té2las t2élá té2láb té2lál té2lár té2l1á2t té2lei té2le2l tél1ele tél1ell tél1elő tél1elv té2l1e2r té2les tél1est té2lez tél1ékb tél1éké té2lí té2ló té2l1ö2 télőkész1 télu2 té2lut 2té2lű té2lyeg télyigaz1 téma1p té2mé té2mil téna2 té2n1an 2t1é2nekb 2t1éneke. 2ténekek 2t1é2neké 2ténekl té2n1in té2n1ö2 té2ny1e2g té2ny1e2l té2nyék tényigaz1 té2nyim té2nyo té2nyö tépés3s 2t1é2pí té1p2la 2t1é2pül té2rab té2raj tér1akt té2r1a2n té2rar té2ras té2rav té2r1á2r 2térdekb 2térdekl 2térdekn 2térdekü 2térdekű tér2d1e2mel tér2d1í2j té2reg té2r1e2l té2rem tér1eml té2r1eng té2r1eső té2r1essz té2r1esz 2t1é2rett térés1s té2r1ész tér1éte téri2d té2r1ide té2ril té2rip té2ris 2térkez 2t1érmü té2r1os té2rö 2t1értes 2t1érték 2tértő. 2t1értők tér1t2r 2t1értv té2r1u2 2t1érv. 2t1érvei 2térvek 2t1érvény tésa2 té2sab té2sag té2s1aj té2sak té2s1al té2san té2sap té2s1as té2s1az té2s1á2 tésát1a2 té2s1eg té2s1e2l té2s1e2r té2sés tés1iko té2s1or té2só té2s1ő2 té2su tésü2l té2s1ülé tés1ülő té2s1üt tés3zav tész1ál tés3zár té2szeg té2sz1emb tés3zene té2szesz té2sz1ék tés3zsi té2t1a2l tétcsa2 té2t1e2g tét1e2lemt tét1elkés té2t1elve 2t1éteri té2t1ers té2t1e2v té2t1é2te té2tok té2tol té2t1os tétó2 té2tón té2t1ór 2t1év. 2t1évad 2t1évb 2t1évc 2t1é2vedb 2tévei 2t1é2vek 2t1é2vem 2téves. tévé1sz2 2t1évf 2tévh 2t1é2vi 2tévk 2t1évn 2t1évr 2t1évs 2tévt té2vú 2t1évü té2vükö té2vün 2t1é2vű 2t1évv té2zs tfa2l1aj tfa2lan tfa2le tfa2lom tf2jo tf2la tf2le tf2li tf2lo tf2ló tf2ra tf2rá tf2re tf2ri tf2rí tf2ro tf2rö tf2ru tgá2zak tgá2zár tgá2zé tge2n1el tge2né tgen1s tg2lo tg2ló tg2ne tg2ra tg2rá tg2ri tg2ró tg2ru tg2rü tha2de 1thagore t2har. 1t2hau 1t2he. the2i2d1 1theidp 1theusz t2holi thon1n tho1ny 1thosz th1sc 1thy 1ti ti2aa ti2ae ti2aé ti2af ti2ah ti2aj tiakész1 ti2ala ti2am ti2a1p ti2ata ti2atl ti2aü ti2av ti2chi ti2dea 2t1i2deá 2t1i2deg ti2dei 2tidej 2t1i2deo ti2dén 2tidéz ti2dio 2t1i2dom 2t1i2dő tie2le tie2n tié2b ti1fl 2t1i2ga 2t1i2gá 2t1i2ge. 2t1i2gék ti1g2lo ti1g2ra 2t1ihl ti3ki ti1kle ti1klu ti2konb ti2kono ti2konr tiko1sz2 ti1k2ri ti2lac ti2lad ti2lan ti2l1ág tile2g til1egy ti2lex ti2lim til1ing ti2l1i2p ti2lir til1isk 2t1illato 2tillú ti2l1ö2 2t1i2ly ti2mak ti2máb 2timádó ti2máj ti2már ti2máz ti2mes 2timmu 2timrei 2tinakat. 2t1inakk tin1akt ti2n1a2n tin1ará tina1t2 ti2n1au ti2n1áll tin1árt 2t1indá 2t1inde 2t1indí 2t1indu ti2ne. ti2neg ti2n1eké ti2nem 2t1infar 2tinfl 2t1infr tin2gal tin2gas tin2g1ár tin2g1e2l 2t1ingeni tin2g1eti tin2gos tin2g1ó2 2t1i2nic tini2g tin1iga ti2n1i2m tini1sz2 2t1inku 2t1inkv tin3n tin1órá ti2nö 2t1insp 2t1integ 2t1intéz ti2n1ut ti2nű ti2ol ti2onb ti2onh ti2oni ti2onj 2t1i2onn 2t1i2ono 2t1i2onr 2t1i2ont tio2x ti2pad ti1p2la tip2pin tip2po 2t1i2rat 2t1i2rán 2t1irg ti2rig 2t1irk 2t1i2rod 2tirol ti2rom ti2rón 2t1irr 2t1irt tis2as ti2s1a2u ti2s1el 2t1i2si. ti2sim ti2sin ti2s1i2r 2t1i2sis 2t1isko ti2sor 2tistv tisz2tina ti2t1i2o ti1t2ri ti1t2ro tiu2mé tiu2m1i2 2tivad 2t1i2var 2t1i2ván 2t1i2vó ti2xa tize2n1 ti2zé. 2tizéj 2tizék ti2zér ti2zét ti2zév tizo2m 1tí tí2gé tí2ja tí2já tí2jú tí2la tí2l1ó2 2tínio 2t1í2no 2t1ínr 2t1íns 2t1í2ny tí2ra2n tí2rar tí2r1ál 2t1í2rás tí2r1e 2t1í2ró tí2rő tí2rü títés3s títőa2 títőe2 tí2v1ec 2t1í2vei tí2vel tí2ver 2t1í2véi tívi2 tí2vik tí2vir tí2viv tí2v1ó2 tí2vö tí2vő tív1s tí2za tí2zá tí2zel tíz1ele tí2z1emb tízi2 tí2zik tí2z1is tí2zí 2tízl tí2z1o tí2zö tí2zsá tí2zu tí2zül tíz1ülé 2t1í2zű tje2gy1á2 tjó2t1 tka1pr tka2ró2r tkende2 tké2p1e2kéh tkia2l tkiá2 tkie2 tkié2 tk2la tk2li tk2lí tk2ló tk2lu tkö2z1él tkőé2h tk2ra tk2rá t1k2reác t1k2ré t1k2ri tk2rí t1k2ro t1k2ró tk2ru tk2va tk2vi tk2vó tla2c3 tla2g1a2d tla2g1ar tla2gas tla2gál tla2g1e tlag3g tla2g1ó tla2n1e2 tlanká2 tla2nó tla2pár tleí2 tlen3n tle2t1a2n tle2tas tle2tele tle2t1elv tle2t1ér. tle2tos tle2tő tleü2 tlé2kal tlé2kem tlé3pe tlés3s tlé1trá tló1dr tma2gál tma1k tmá2nyir tme2g1e2 tme2g1é tme3gif tmu2sí tmus3s tmu2sz tna2gya tná2d1 tne2k1el tne2küld tne2m1e2r tne2r1a tne2r1á tne2sz1a tne2szi tne2sz1ó2 tnév1a tnómen1 tnómenk2 tnö2k1öl tnőé2n 1to 2t1obj 2t1obl 2t1obs to1cki to2daa to2das to2dí 2t1o2dú 2t1odv 2t1off togás1s to1g2ráf. to1g2ráff to2il to2k1aka to2k1a2n to2k1ap tok1ari to2k1ál tok1á2rok to2k1átl to2k1átm to2k1átr to2k1áts to2k1átt to2k1átv to2ker to2k1é2l to2kép to2kid to2k1im to2k1in to2k1ip to2k1iv to2kí t1o2kozá to2k1ö to2kő to1k2ro tok1s toksz2 to2k1ur to2kúr to2kü to2kű to2l1a2d 2t1o2laj to2l1akt tola2n to2l1any to2l1a2r tol1atom tol1ábr 2toldalo 2toldalt 2t1o2lim tol1k2 tol2l1árb tol2l1á2ré tol2l1árh tol2l1árr tol2leg tol2l1in tol2l1í2 to2l1o2r 2t1oltás to2l1ut 2tolvas to2m1ag to2m1ak to2m1a2l to2m1a2n to2m1ap to2m1ál to2m1á2r tom1b 2tombe to2m1el to2men tom1erő to2m1es to2mí to2m1osz to2m1ó2 to2mö tom1p2 tom1s 2tomtö 2tomú to2mü to2mű to2nalm tona1t2 tonau2 ton1áll ton1álm to2n1á2z to2n1el to2n1en to2ner ton1gr to2nil ton1k2 to2nol to2n1or to2n1osz to2nóc to2nór to2nö to2nő ton1s2 tont2 ton1tr to2n1út to2nü to2nű to2nyal to2nye to2p1at 2topc 2to2pe to2pik to2piz 2topp. 2toppo 2toppr top1t2 to2pü to2r1a2d to2r1ag to2r1aj to2r1aka to2r1akn to2r1ako to2r1a2l tora2n to2r1any to2r1a2p to2r1ar tor1ass to2rat to2r1au to2r1av tor1ács to2r1áll to2r1álm tor1áté to2r1átl to2r1á2z 2t1orcá tord2 tor1dr tore2 to2rec to2rek to2r1el to2ren to2r1er tor1f2 tor1g2 2t1organ 2torie to2r1ill to2r1int to2r1isk tor1k2 2tornó to2rop to2rosz tor1oszt to2r1ov toró2 to2rón to2r1ór to2rö to2rő 2t1orr. 2t1orráv 2t1orri tors2 tor1sc tor1sk 2t1orsó tor1sp tor1st tort2 tor1tr to2rü 3torvá 2torvos 2torvv to1ry to2s1as to2s1e to2sik to2s1in to2sis tos3sze t1osto 2t1osty to2sü to2szal to2szan to2sz1e tosz1k 2t1oszlop. tosz1tr 3t2ot. 2t1otthon to2ut tova1 2t1o2ve 2t1o2vi 2t1o2vu 2t1oxid 2t1o2xig to1yo toza2t1al 1tó tóá2gy tóá2r tóát1 tóáta2 tó1bl tó1bra tó1bró tó1cl tócsa2p1á2g tó2daj tó2d1a2n tó2d1esé tó1dro tó2dúr tó1fl tó1gl tó1g2r tói2g tóí2v tóká2rok tó1k2l tó1kre tó1kré tó1kro tónus3s tóo2k tóó2r tóp1ass tó2p1e2l tóp1int tó1pro tó2ras tó2ráb tó2ráh 2t1ó2rái tó2rár 2t1ó2rás tó2rát t1ó2ráv tó2sep tós1éták tós1é2tát tó2sír tó1s2kan tó1skál tó2s1ol tó1s2porto tó1s2portt tó1s2rác tó2s1ü2l tó2s3zene tó1sz2f tó1szk tó2taj tó2tág tó2tom tó1t2rá tó1t2re tó1tro 2tóvod 2t1ó2vó 1tö töb2bev töb2b1o 2t1öbl 2tödéé tö2dém tö2dí 2tödné tö2do 2tödöt 2tödü tö2ka tö2ká tö2k1e2v tö2k1ér. tö2k1érd tö2kid tö2kí 2tö2ko 2t1ö2kör tökös3s tö2k1ő 2tökrös tö2ku 2t1ölb 2t1ölci töl2gya töl2t1á2 t1öltön 2t1öltöz töm2b1a tömbe2 töm2bel töm2b1o t1ömle 2t1ömlé t1ömli tö2möl tö2na tö2ná tön1d2 tö2nen tö2n1í tön2kár tönkész1 tö2no tö2n1ő tön1s tö2nu tö2nú 2t1ö2reg törés3s 2töröks tör2t1a2 tör2teg tör2t1e2lem tör2ter tör2térn tör2t1és tör2t1o2 tör2t1öl tör2tös tör2zsa tör2zs1ö2l 2t1ösv 2t1ösz 2t1ötl töt2t1á 2t1ötv 2t1öv. 2t1övb 2t1övh 2t1ö2vie 2tövig 2t1övj 2t1övk 2t1övn 2t1övr 2t1övv 2t1ö2zön tözőe2 1tő tőa2c tőa2l tőá2g tő1bl tő1br tőe2ké tőe2r tőé2l tő1fl tő1gr tőí2t tőí2v tő1kl tő1kv tő1pl tő1pr tő1ps tő2rag t1őral 2t1ő2r1an tőr1egy 2t1őrez 2t1ő2rék 2tőréü tő2rin tő2r1is 2t1ő2rí 2t1őrjá 2t1őrjel 2tőrjö 2tőrka 2tőrl 2tőr1öl 2tőrp 2t1őrti 2tőrtr 2t1őrz tő2s1a2l 2t1ősny tő1spe tő1s2pi tő1spr tő1srá tő1sta tő1s2tá tő1sté tő1str 2tősű tő2sű. tősz2 tő1szt tő1tr tőü2l tőzá2 tőzár1 tpen3n tp2fe tp2la tp2lá tp2lé tp2lu tp2ra tp2re tp2ré tp2ri tp2ro tp2ró tp2ru tp2sz tpu2tin t2rafó 1t2ragé 1tragi tra1k2l tra1kro tran2d1a2 tran2dá trans1s tran2sz1ai tran2sz1o2m tra1s2p trat2 t2rati tra1tr 1trágya 1trágyáb 1trágyáé 1trágyáh 1trágyái 1trágyáj 1trágyák 1trágyán 1trágyár 1trágyás 1trágyát 1trágyáv t2rájk trán2sz trá2nyal trá2t1ér tre2csa tre2cso t2rego tren2da tren2d1ő2 1trení tréé2 1t2réni tré1p2 tré2sz1á2 tri1g2 trii2 t2rikó t2rill 1t2rió. t2riój t2riók trol2l1in tro2mad tro2maj trona2 tro2n1ag tro2nal tro2nan tro2nes tron3n tron1tr tr2os tro1sz2f tro1sz2ta t2r1o2x tró2de tró2nas tró2n1e 1trónj 1t2róno t2rónt tró1sz tró2zsi t3röm 1t2rös 1t2rub tru2mad 1t2rup tsa2vo ts2ch 1tsche tsé2g1éj ts2ká ts2ko ts2la ts2lá ts2le ts2li ts2má ts2mi ts2ni tsói2 ts2pa ts2pe ts2pi ts2po ts2pó tsp2r ts2rá t1s2ta t1s2tá ts2te ts2té ts2ti ts2tí ts2to tst2r ts2tu ts2tú 1t2sub tsza2ké tsza2k1ü tsza2t1e2 tsza2tö tszé2t t1sz2f t1sz2k t1sz2l tszö2g1e2le t1sz2p t1sz2t2 ttad2 tta2dó. ttag1g tta2g1o2ku tta2n1ér t2t1ará t2t1aszt tta1t2r ttaü2 t2t1a2z ttán2s1á2g ttá2v1i2 tte2leme t2t1e2lőa tte2r1in t2t1erő tte2s1a2 tt1ég. t2t1é2le tté2rak ttér1em tté2r1es tté2r1é2ne tté2rid ttér1in tt1éss tt1é2vér t2t1i2o t2t1iro t2t1isk t2tizz ttír1a tt1írá tt1kr ttornác1 t2t1ors ttó1dr ttó1p2 t2t1ó2rá ttó1s2r ttö2l tt1ölő tt1pr t1t2raf t1t2rag t1t2ran ttransz1 ttranszk2 t1t2rav t1t2róf tt2rón ttsé2gel tt2si t2t1ug t2t1üd t2t1üt t2t1ü2v ttwe2 t2ty tty1or tty1ö2l ttyü2 tty1ül ttyülés1 1tu tuá2r tubus1s tu1ck tuda2te tuda2t1ö 2tudí tu2ga tu2go 2t1ugr tu2hu tu2in 2t1ujj 2tuká tulo2 2t1ulti 2t1ultr tu2lü tu2mab tu2m1a2d tu2maj tu2mal tu2man tu2mar tu2maz tu2mál tu2meg tu2m1el tu2mer tu2mes tu2m1i2k tu2mim tu2m1inf tu2m1int tu2m1ir tu2mis tu2miz tu2mí tu2mol tu2mö tu2mő tum1p2 tu2mü tu2nal 2t1unc 2tunió tu2nit 2t1u2no 2t1u2nó 2t1unt tu1p2r tu2rac 2turai 2t1u2rak tu2ralo tu2ram 2t1u2ras tu2ráh 2turán tu2rár tur2g1a tu2run tus1abl tu2sar tu2ság tu2se tu2s1érté tu2sis tu2s1í tu2sor tu2s1ó2 tu2s1ö tu2ső tuss2 tus3sze tus3szi tus3szo tu2sü tu2szab tu2sz1a2d tu2szag tu2szal tu2szap tu2szar tus3zav tu2szál tusz1em tu2sz1é2l tu2sz1é2p tuszi2 tu2sz1il tu2szin tu2sz1ip tu2szir tu2szis tu2sz1it tu2szí tusz1k2 tu2szol tu2s3zó tu2szö tu2sző tusz3sa tus3zse tuszt2 tusz1tr tu2szü 2t1u2tad 2t1u2tak 2t1u2tal 2t1u2tam 2t1u2tas 2t1u2taz 2tutá tu2tán 2t1utc 2t1u2to tu2tód tu2tóp tu2tót tu2tun tu2um 2t1uzso 1tú tú2ja tú2jí tú2jo tú2ju tú2l1a2 tú2l1á2 tú2l1e2 tú2l1é2 tú2list tú2lí tú2lok tú2lop tú2l1ó2 tú2lö tú2l1ő túl1s túlt2 tú2lú tú2lü tú2lű túra1sz tú2rál tú2r1e2 tú2r1ér tú2r1és tú2r1ol tú2rot tú2rö tú2rü tú2sze tú2szö tú2szü tú2tá 2t1útb tú2t1e2 2t1ú2té 2t1úth 2t1ú2ti 2t1útj 2t1útl 2t1útn 2t1ú2to 2t1útr 2t1útt 2t1útv 1tü 2t1ü2dí 2t1ü2dü 2t1üdv tü2ge tü2gy tü2l1a tü2lá 2t1ü2led tü2l1e2m tü2len tü2lep tü2l1e2s tü2l1e2v tü2l1ér tü2lir tü2lí tü2l1o2 tü2l1ökl tü2löm tü2l1ön tü2l1öz tü2lők tü2lőr tü2lu tü2lú tü2ma tü2mék tü2m1ő tüne2tel 2t1ünn 2türeg 2türes 2t1ü2rí 2t1ü2rü 2tüst 2t1ü2te 2t1ü2té tü2ti 2t1ütk tü2tö 2t1ü2tő tü2vö 2t1ü2zen 2t1üzl 1tű tűcsa2p1 tű2d1al tű2dá tűe2két tűé2h tűfélé2 tű1gr tű1kv tűleü2 tű1pl tű1pr tűrés1s tű1sp tű2z1a2 tűzá2r tű2z1ára tű2zát tű2zene tű2zis tű2zí tű2zo tű2z1ös tűz3seb tű2zú tva2n1e tva2név tva2raj tvá2nyad tvá2nyí tvá2z1al tvá2zip tve2n1e2v tven3n tven3t tvenü2 tve2nül tve2n3y tve2raj tve2ral tve2r1á2 tve2reg tve2r1é2sz tve2rint tve2rip tve2r1o tvers2 tver1st tve3se tvé2nyel tvér1int tvé2r1o tviselőé2 tvis3szá t2víve t2y 1tya tyai2ko tya1kl tya1p2 tya1sz2 tyat2 tya1tr tyau2 1tyá 2ty1ág ty1áld ty1áll tyá2ran tyár1s tyás3s 1tye ty1e2gy ty1ela ty1ell ty1emb ty1e2rő 2ty1ex 1tyé 2ty1éte 1tyi 1tyí ty1í2r ty1ív tynk2 1tyo tyo2lan tyo2r1os 1tyó 1työ 1tyő ty1ős ty2pe ty1pr ty2sa ty1sp 1tyu 2ty1ug ty1u2tá 1tyú tyú2kü 1tyü 1tyű 1t2zekn 1tzekrő 1t2zen. t2zenj 1t2zer 1t2zes tz1ő2r tz3sc 2u. u1a ua2ch ua2da ua2dá u2ador. u2adorb u2adoré u2adorn u2adoro u2adorr u2adort ua2dó ua2es ua2gá ua2ja ua2já ua2la ua2lá ua2ny ua2sz ua2ty ua2ut ua1yá ua1yé ua1yi ua1yo ua2zo u1á uá2ga uá2gy uá2po uá2r1á uá2r1e uá2réj uá2r1is uá2sz uá2t1a2 uá2t1e ub1a2la ub1alk u2b1ang ub1arc ub1a2ri ub1ár. ub1á2ro ub1dr u2b1e2b u2b1ed ube2lá ube2lel ub1elö ub1e2se ub1est u2b1éj ub1éle u2b1é2n u2b1ép u2b1érd u2b1é2re u2b1érm u2b1érte u2b1éve ubi2g u2b1iga u2b1ige ubi2ke u2b1ina. ub1ism ub1kr ub1olda u2bork u2b1orv u2b1osz ub1óri ub1öl ub1ös ub1öv ub1pl ub1pr ub1sl ub1sp u2b1ud ubu2sz u2b1új ub1üd ub1üg ub1ü2l ub1üz uca2t1á2 uc2c1e uc2c3h uc2c1ina uc2cip uc2cö ucc3sz uc2cú uc2cü uc2cz uc1emb uc3há u2c3hé u2c3ho uciá2r uci1p u1c2kig u1c2kon u1c2kot uc2ky uc1ö2l uc1pr ucsa2p1á2 uc3ság u2cs1ál u2csáru u2cs1e2l u2cs1id ucs1s u2c3sü uc3sz u2c1ug uc1üg uc3zá uc3ze uda2tal uda2tál uda2t1á2ram uda2t1eg uda2ter udáskész1 udás3s udi2o u2d1isk udo1kr udó2se udó2sor u1d2rá u1d2ro u1e ue2bé ue2dz ue2gé uegész1 ue2gy uel1ér ue2lő ue2me ue2rő uervíz1 u2es. u2esb ue2s1e u2esh u2esi u2esk u2esn ue2ső u2esr u2est u2esu ue2s3zen ue2te ue2ve u1é ué2ge ué2gé ué2ké ué2le ué2pí ué2pü ué2te ufé2nye u1f2le uf2ri uf2ru uf2tü ug1agy ug1alj uga1p ug1apa 1u2garo uga2t1el uga2tés uga2tol uga2t1ó2r ug1ág ugára2 ugár1ad ugá2rá ugá2ros ugá2ru ugár1ú ugás3s ug1á2sz ug1el ug1e2v ug1é2l ugg2l ugi2e ug1ing ug1int ug1iro ugi2t ug1ita ug1ivá ug1ír ug1kl ugo2r1á2 ugó1sv ugó2s3zá ug1ös ug1pr ug1sk 2ugui u2g1ut u2g1új ug1üg ug1üz ug1űr ugya2n uh1a2dó uh1alk uha2r1as uha1t2r uh1att u2h1á2g uh1áll u2h1ár. u2h1árb u2h1árf u2h1árh u2h1árn u2h1árr u2h1árv uhá2szak uh1em uh1ex uh1ind uh1ing uh1orz uh1őr uh1pr uh1tr u2hu. u2huj uh1ujj uh1üz u1i ui2de ui2dő ui2eu ui2ga ui2gé u2i1gn ui2pa ui2rá ui2zé u1í uí2ja uí2ju uí2ve uí2vű u2j1an 1ujja. 1ujjad 1ujjai 1ujjak 1ujjam 1ujjas 1ujjat uj2j1á2ru 1ujjb 1ujjc 1ujjd 1uj2j1e2 1ujjé 1ujjf 1ujjg 1ujjh 1ujji uj2jí 1ujjk 1ujjl 1ujjm 1ujjn 1ujjp 1ujjr 1ujjs 1ujjt 1ujju 1ujjú uj2jü 1ujjv u2j1op uk1abl uka2c3se u2k1a2lap uka1pl uka2rán u2k1arc uka2szás uka1t2r uk1áll uká2sar u2k1ásó ukás3s u2k1átm uk1bl uke2l uk1e2m uk1ex u2k1ég u2k1érz u2k1i2p uk2k1alt uk2k1eg uk2k1em uk2k1ola uk2köl uklás1s ukló2s3zá u2k1old ukora2 uko2ras uko2r1á2 uko2ril uko2rin uko2r1o ukós2 uk1öb uk1pr u1k2rón uk1ü2t uk1űr ula2cs1ö2 ula1g2 ula2jas ul1aleg u2l1alj ula1s2p ulata2l ula2t1ala ula2t1a2n ula2tál ula2tem ula2tik ula2tol u2l1ábr ulá2k1e ulá2k1ü u2l1á2ria ulá2s1i2k uláskész1 ulás3s ulá2sza ulá2sze ul1bl ulcs1e2l ulcs1es ul2cs1ér. ul2csérv ul2cs1é2vé ul2csiga ul2csip ul2cs1í2 ul2csor ul2cs1ö2 ul2cs1ő ul2csut ul2csü ulcs3z ule2i uleí2 ule2l ul1elő ulet2ta u2l1ex ulé2kal ulé2k1e2 ulé2k1ol ulé2kut ul1épü u2l1érté uli2nar uli2nin ul1í2r ul1k2r ul2lef ul2l1e2l ul2l1em ul2l1en ul2l1ér ulot2 uló1f2 ulói2kon ulókész1 ulóó2 ulót2 uló2zan uló2z1á2ra uló2z3s ul1öt ul1pr ul1st ul2t1aj ulta2r ult1asz ul2taz ul2tül ul1úr ul1üt ul1űr u2lyi u2m1abl um1abr um1a2cé um1ach um1a2dat u2m1adm um1a2do um1a2dó 2umaé um1ajá u2m1a2ka umakész1 u2m1akk u2m1akt u2m1a2la um1alg um1all um1alt u2m1ana u2m1ank u2m1a2no u2m1a2ny 2umao 2uma1p2 u2m1a2rá um1arc um1arg u2m1a2ri um1a2ro um1asp u2m1atl u2m1au um1a2zo u2m1ág u2m1áll um1álm u2m1á2rak um1á2ram u2m1áras u2m1á2rá u2m1árf u2m1árk u2m1árn u2m1á2ro u2m1árr u2m1árt u2m1á2ru u2m1árv umát1a u2m1á2t1e u2m1átm u2m1átu um1bl um1b2r um1dr u2m1e2d u2m1ef ume2g um1egy um1ela um1elb u2m1e2le um1elé um1elh um1elí um1elj um1elm u2m1eln um1elo um1e2lő u2m1elt um1elv u2m1e2m ume2n1á ume2n1ó2 um1e2re um1erk um1e2rő um1e2se um1ess um1e2sz u2m1e2t u2m1e2v u2m1ex um1ezr u2m1ég u2méhs um1é2le um1élv u2m1ép u2m1ér. u2m1érc u2m1érm u2m1érte u2m1érté u2m1érv u2m1é2te um1fl um1f2r um1gl um1gr umia2 um1i2dő umig2 umi1gr um1imp umi2na. u2m1ind u2m1ing u2m1inv um1i2onb um1i2oné um1i2onh u2m1i2onj um1i2onk u2m1i2onn u2m1i2ono um1i2onr um1i2ont u2m1irt um1isk umi1sl um1ism umi1sp umi2szü umit2 umi1tr um1izé um1ív um1íz umkész1e um1kl um1kr um1kv umna2 u2m1o2koz um1ola um1old um1oll um1olt um1olv u2m1o2p umo2ran um1o2rat umo2rál umo2rin um1osto u2m1osz u2m1ox um1ó2rá um1ö2l um1öm um1ön um1ö2r um1ös um1öt um1öv um1ö2z um1ő2r um1ős umpe2l ump1ele um2p1ing um1p2r um1sk um1sp um1st um1sz um1t2r u2m1ud u2m1ug u2muni umu2r um1ura u2m1u2t um1üg um1ü2l um1ür um1üs um1üt um1üv um1üz umva2s una1b un1adu un1akt u2n1arc u2n1á2g un2cs1e un2csiv un2dz un1e2r un1e2t un1ég un2g1a2g un2g1eg un2g1er ung3g un2g1ol u2n1i2d 1u2nif 1u2niku u2n1il u2n1ingo 1u2nió 1u2niv unka1p2 unka1s un2k1eg u2nod u2n1orr un1ors u2not un1pr un1s2t2 unta2i u2nun un1útj un1ü2l u1o uo2la uo2li uo2r1a2 uore2 uo2r1et uo2r1i2o uo2xi u1ó u2óbu u2óne uó1p2r u2óré uó2ri u2óso u2ósz u2óve u1ö uö2ko uö2kö uö2rö uö2zö u1ő uő2re uő2ré uő2ri uő2rö uő2rü upa1b2 up1ada upa1pr upas2 upa1sp upa1t2r upda2 upe2r1a upe2rel upe2r1in uper1s up1e2s upé1p2 up2hi upli2n up1üz 1u2raim 1u2rak. 1u2rakh 1u2rakk 1u2rakn 1u2rakr u2ralh 1uralk 1u2ralm 1u2ram. ura2m1is 1u2rasa ura1s2p ur1áll urát1a ur2dar ur2d1e u2r1ef ur2fí ur2f1ú 1urná ur2ne urn2é uro1b2 uro2k1á uro2ke uro2ne uro1p uro1t2 ur1öl urpi2 ur2t1ag ur2t1e2t ur2t1e2v urti2t urt1ita ur2t1okta uru2c1e 2urul uru1p2 uru2szál u2rú. us1abla us1a2da us1a2dá u2s1a2dó u2s1a2g u2s1a2j usa2kar u2s1akc u2s1a2la us1alg us1alj us1alk u2s1alt us1alv u2s1ana us1ane us1ant us1apá u2s1a2ra u2s1a2rá u2s1arc us1arz u2s1ass u2s1att us1a2ty u2s1au u2s1a2z u2s1ábr u2s1á2gá us1ágb u2s1ágg us1ágh u2s1ágr us1áld us1áll u2s1á2p u2s1árad u2s1á2rai u2s1á2rak u2s1á2rá u2s1árb u2s1árh u2s1á2ri u2s1árk u2s1árn u2s1á2ro u2s1árr u2s1árt u2s1á2ru us1áta us1áth us1áti us1átk us1átt us1átu us1átv us1bl us1br us1dr us1e2c us1e2d u2s1ef us1e2gy u2s1e2l u2s1e2m u2s1e2n us1erd u2s1e2s use1t u2s1e2v u2s1ex us1ez u2s1ég u2s1éhe u2s1é2k u2s1é2l u2s1é2ne u2s1ép u2s1érd u2s1érte u2s1érv u2s1és u2s1é2te us1étk us1étt u2s1éve us1fr us1gr u2s1i2d usi2g us1iga u2s1i2ko u2s1ill u2s1i2ma u2s1i2má us1imi u2simm us1imp u2s1inc us1ind us1inf u2s1ing u2s1ink u2s1int us1inv u2s1i2p u2s1i2rat u2s1i2rá us1iro us1irt u2s1isk u2s1ism us1ita us1izé us1íg u2s1íj usí2r us1írá us1író u2s1í2v u1s2kál us1kl uskói2k us1k2r us1kv u2sodú u2s1of us1okl us1okm us1okta us1ola u2s1old us1oli u2s1oml us1ond u2s1op u2s1org u2sori u2s1orr u2s1ors us1osz u2s1ott us1óc us1ó2s u2s1ö2l u2s1ön us1örd us1ö2rö u2s1ös u2s1öt us1ö2v u2s1ö2z us1ő2r u1s2pec us1pl us1pn us1pr us1ps 2uss. us2se. us1ská us1spe us1spi us1sta us1sy us3szab us3szag us3szak us3szál us3szám us3szen us3szé us3szig us3szí us3szó us3szö us3sző usszü2 ussz1ül us3szű ust1á2rár us2teg us2t1il us1trad us1tre us1tré us1tro u1stru us2t1ül u2s1uj usu2s us1usz u2s1u2t u2s1új us1úté us1üd u2s1üg usü2l us1ülé u2s1ün u2s1ür us1üz usz1abl u2szaj usz1a2la usz1alk usz1alv u2sz1a2n usz1app usza2r usz1ará usz1aré usz1aro usz1asz u2sz1au u2sz1á2g usz1állá usz1á2p u2sz1á2rad u2s3zárako u2sz1á2ram usz1árje usz1ásv u2száth usz1átö u2sz1e2c u2szef usz1e2ge usz1e2gy usze2k usz1eke u2sz1e2l usz1emb usz1eml us3zene usz1eng u2sz1erd usz1e2ré usze2s u2sz1e2v u2sz1ex u2széne usz1éte usz1éto usz1imp usz1ind usz1inj usz1isk usz1ism u2sz1isz uszí2j1a2d u2sz1ír 1u2szodá u2szola u2sz1old u2szony u2szop u2szosz u2sz1ö2b usz1öl usz1ön u2sz1ös usz1p2 uszte2r1a usz1t2ran u2sz1u2s u2szut usz1útr uszü2 usz1üg u2sz1ül u2sz1üz usz1z ut1abl uta2csel ut1a2dó 2utakép 1u2taló 1u2talv utame2 uta2mel uta2mer uta1p ut1ará 1utasc uta2se 1utasf 1u2tasl 1utasv utaü2 2utav 1utazi 2utáb 2utáé 2utáib 2utáin 2utáju 2utákb 2utákt 2utám 2utáná után1n 1utánz 2utáró utá2rú ut1bl 1utca 1utcá u2t1e2g ute2r1a ute2rá ute2reg ute2rim ute2ru utén3n ut1fr uti2k1á2r uti2ke ut1ill uti2m uti2n1e2 uti2nér utini2 uti2nig uti2n1ik uti2n1ó utin1s u2t1i2pa u2t1isk ut1kl ut1okke u2t1old uto2l1é u2tols 2utomata uto2rim 2utos 2utot utó2dal u2tódá utó2del utó1p2 utó2s1aj utós3s utó1s2to utó1sz utó1tr utótűz1 ut1pr ut2rak ut2ran ut2rák ut1sp ut1st ut1t2r ut1üg ut1ü2z utya1s2 u1u uu2m1ag uu2mal uu2m1as uu2mál uu2m1e2 uu2m1é2r uu2mim uu2min uu2mö uum1p2 uu2mü uu2ta uu2tá uu2zs u1ú u1ü uü2gy uü2rí uü2té uü2ve uü2ze u1ű uva2r1a uva2r1á2 uva2r1e uva2rin uva2szál uvata2 uva2t1ag uvi1g2 uv2re uxi2t1a uxi2t1á uxi2t1e uzala2 uza2lac uza2lad uza2lan uza2lág uza2l1át uza2lel uza2l1ék uza1p2 uza1s2 2uzál. 2uzálb 2uzáll 2uzálr u2z1id uz1i2gye uz1ír uzki2 uzói2 uz3sap uz3sz uz1t2r uz1ü2g uzü2l 2ú. ú1a úa2da úa2dá úa2dó úa2gy úa2já úa2kar úa2kas úa2la úa2lá úa2ny úa2sz úa2ud úa2va ú1á úá2ga úá2gá úá2gi úá2go úá2gy úá2hí úá2lo úá2po úá2ra úá2ri úá2ru 2úbab 2úband 2úbar úb2lo 2úbód úb2ri úb2ro ú2c1aj ú2c1a2l ú2c1a2n ú2c1a2v úc1e2t úc3he úc3ho ú2c1i2d úci2ókép úc1pr 2úcsa ú2csab ú2csad ú2cs1ag ú2cs1aj ú2csakt úcs1ala ú2cs1a2n úcsa2p1á2 ú2cs1a2s ú2cs1au ú2csaz úcs1á2g ú2cs1ál ú2cs1árá ú2cs1árf ú2cs1ári ú2cs1árv ú2csátv 2úcse ú2cs1eb ú2cs1e2g úc3sej ú2cs1e2l úcs1emb ú2cs1en úcs1erő ú2cs1e2s ú2cs1él ú2cs1ér. ú2csérd ú2cs1érte ú2cs1érté ú2cs1é2v ú2cs1id ú2csigaz ú2cs1il ú2csim ú2cs1inf ú2cs1int úcs1i2pa ú2csirá ú2cs1is ú2cs1iz 2úcso ú2csokta ú2csosz 2úcsó ú2cs1ó2r úcs1öl úcs1ös úcs1p úcs1s úcs1t úcsús1s úcs1ü2t úcs3za ú2d1a2c úda2d úd1ada ú2d1a2k ú2d1a2n úd1ág úd1ál úd1á2r ú2d1e2g ú2d1ej úde2l úd1ele úd1elh úd1elő ú2d1e2m úde2ra úde2r1ec úd1erő úd1e2v ú2d1ék ú2d1ér. ú2d1érc údé2t úd1éte ú2d1i2d údi2g ú2d1igé úd1ing údi2ódar údi2óz ú2d1os úd1pr úd2rá úd2ro úd1üv údy1éh údy1ét údy1i údy2s úd3zá ú1e úe2bé úe2gé úegész1 úe2gy úe2la úe2le úe2lo úe2lö úe2lő úe2me úe2pi úe2re úe2ré úe2rő úe2rű úe2sz úe2ta úe2te úe2ve úe2vő ú1é úé2he úé2le úé2lő 2úé2ne úé2pí 2úér. úé2r1á úé2re úé2ri 2úérz úé2te úé2ve úfélé2 úfé2l1év úf2lö úf2rá úf2ri úf2rí úf2ro úg1a2d úgás1s úg1el úg1i2v úg1old úgós2 úg2rá úgy1ag úgy1el úgy1ér. úgyi2 úgy1is úgy1iv ú2gy1u2 úgy1út ú1i 2úi2de úi2dő úi2ga úi2gé 2úi2ke 2úikre 2úill 2úi2má úi2mi 2úing 2úint úi2pa úi2rat úi2rá 2úisk 2úism 2úist úi2ta 2úi2vad úi2vás ú1í úí2rá úí2ve úí2vi úí2vü 2újáté új1es új1ez új1éve új1évé új1k2r 1ú2jon új1or új1pl újra1 1újsá új1ud ú2jul 2úkab ú2k1a2g ú2k1a2j úk1a2lak 2úkalan ú2k1alk ú2k1any 2úkap ú2k1a2pó 2úkar 2úkate ú2k1atk ú2k1ál ú2káru úke2l úk1ele úk1ell ú2k1em úke2s úke2t úk1ete úk1e2vé 2úkérd 2úkéré 2úkés ú2k1éss ú2k1észr ú2k1é2te 2úkéz úkia2 ú2k1i2d 2úkin ú2k1is ú2k1i2t ú1k2li úk2lu 2úkol ú2k1olt 2úkom 2úkonf 2úkong 2úkorá 2úkoro 2úkos úk1ó2l úkö2l úk1ölő úk1pr ú1k2re úk1t2r ú2k1ud ú2k1úr úkü2l úk1ülő úk1ült ú2k1ür ú2k1ü2t ú2k1üz úl1a2d úl1a2ja úl1a2l úl1a2m úla2n ú2l1any úl1a2ro ú2l1á2g ú2l1ál úl1árn ú2l1á2sz úl1átv úl1br úl1d2r úl1e2d úle2l úl1ele úl1ell ú2l1emb úl1en ú2l1e2re úl1e2s ú2l1e2vő úl1ex ú3lé. úl1é2d úlé2g ú3l2é3va úl1fr úl1gl ú2l1i2d ú2l1igé ú2l1ij ú2l1il ú2limá ú2l1ind ú2l1inf ú2l1ing ú2l1inj ú2l1int ú2l1inv ú2l1i2p ú2l1irá ú2l1isk ú2l1i2sz ú2l1i2ta ú2l1itt ú2livás ú2livo ú2lizgato ú2l1izz úl1íg úl1í2v úl1k2l úl1kv úlo2k úl1oko ú2l1ol úl1ope ú2l1or ú2l1os ú2l1ox úl1öb úl1öl úl1ö2m úl1ö2n úl1ör ú2l1ös úlövés1s úl1őrü úl1p2l úl1p2r úl1p2s úl1sk úl1sm úl1sp úl1s2t úlsz2 úlsztá2 últ1agg últ1agy úl2t1aj úl2t1al úl2t1árn úl2tél úl2térte úl2t1és últ1éves últi2 úl2tid úl2t1im úl2t1in úl2t1ip úl2tis úl2tí últ1old úl2tös úl2t1ő2r úl1trá ú2l1ud ú2l1u2g ú2l1ur ú2l1u2t ú2l1úr úl1ús úl1üg úl1ül úl1ün úl1ür úl1üt úl1üv úl1üz úl1űz ú2ly1a2d ú2ly1a2l ú2ly1an ú2ly1a2r ú2ly1au ú2lyál ú2ly1átl ú2ly1e2 ú2lyél ú2lyés ú2lyol ú2ly1ö ú2lyő úly1s ú2lyug 2úmac 2úmad 2úmag 2úmaj 2úmar 2úmatr úmi2al 2úmoz 2únac 2únap únau2 ú2ny1a2n ú2ny1i2r úny1tr ú1o úo2ko úo2ve ú1ó úó2ra úó2rá úó2sá úó2vo ú1ö úö2le úö2lé úö2lő úö2rö úö2ve ú1ő úő2rö úp1eg úpe2l úp1es ú2p1in úp2la úp2lé ú2p1or úp1p2l úp2rí úp2ro úraát1 2úrab 2úraj úr1akk úr1alu ú2r1ant úr1a2nya úra1p2 úra1szp ú2rattas úrau2r ú2r1ábr úr1áll ú2r1á2ri úrás1s ú2r1átm úr1br úr1d2r úr1e2c úr1e2l úr1ez ú2rék úr1ékk ú2r1é2l úr1é2ne 2úrés úrfé2l1é2v úri2al ú2r1i2d ú2rie úr1ifj úri2g ú2r1iga úri3gényé úr1i2m ú2r1inf úr1ing ú2r1int ú2ris úr1ist úr1k2r 1úrnőr úr1ott úró1p2 úró1sp úr1ö2c úr1ö2l úr1ön úr1öt úr1ős úr1pr úr1s2k úr1sn úr1s2r úr1s2t úr1szn úr1u2t úr1ü2l úr1ü2v 2úsabl ús1abr ú2s1a2d ú2s1a2j ús1a2la úsa2n ús1any ús1apr úsa2r ús1ará ú2s1arc 2úsarj úsá2gol ús1áld ú2s1á2p ú2s1á2rai ú2s1á2rak ú2s1árb ú2s1áre ú2s1á2ro ú2s1á2ru ú2s1á2rú ú2s1árv 2úsát ús1átl ú2s1á2z ús1dr ús1e2c ús1e2l ús1e2v ús1ex ú2s1é2g ú2s1é2l ús1é2ne ú2s1é2ré ús1érm ú2s1érté ú2s1é2tá ú2s1é2te ús1étr ús1fr úsi2g ús1iga ú2s1il ús1imp ú2s1in ú2s1i2p ú2s1i2r ú2s1is ús1í2z ús1kl ús1kv ú2s1ola ú2s1old ús1org ú2s1orr ús1osz ús1ó2h ús1ös ús1őr ús2pe ús1pr ús1s2p ús3szag ússza2k1 ús3szav ús3sze ús3szi ús3szí ús3szó ús3szö ús3szú ús3szü ús2tat ús1t2r ú2s1u2ga ú2s1u2t ús1üg ús1ün ús1ü2t ús1üz úsvé2t1e ú2sz1a2d ú2sz1akc ú2sz1á2g úszás1s 2úsze úsz1ej úsz1e2s úsz1e2v 2úszé ú2sz1év ú2szigá 2úszí úsz1k2 úsz1old úsz1osz ú2szóe 2úszö úsz1ös úsz1p ús3zse ú2s3zú 2úszü úsz1ü2g úsz2ve út1a2d út1a2i ú2t1a2j út1a2v ú2t1ál út1á2ro út1á2s ú2t1á2t1 útá2v1i2 út1bl út1ef ú2t1e2g út1elá út1ell út1elz ú2téh út1é2l ú2tén ú2t1ép út1érd ú2t1é2ri út1érz útfélé2 út1gr ú2tiakh ú2tiakn út1id útie2 ú2tié úti2g út1igé 1ú2tij 1ú2t1i2ko út1ill 1ú2tiná út1ind út1inf út1ing út1int út1i2pa 1ú2tir út1irá út1ism út1ist 1ú2t1i2z út1íg út1íj út1ív út1okm ú2t1ola út1old út1oml úto2n1 út1ont út1op 2útor úto2ran úto2r1as úto2rál úto2re út1ost út1osz út1ös útő2r út1pl út1pr ú1t2rag 2ú1t2ri útsá2gi út1st útu2m1é útu2r út1urá ú2t1út ú2t1üg 1útvo ú1u úu2no úu2ra ú1ú ú1ü úü2gy úü2lé úü2re úü2te úü2ve úü2vö úü2ze ú1ű úű2ző 2úvál úv2ár úvá2rad úvá2ral úvá2ris úvá2rosz úvá2r1ó2 úváru2 úzae2 úzaé2 úzak2 úza1p2 úz1arc úza1t2r ú2z1ál ú2záru úzás1s úz1i2d úzido2 úzót2 úzó1tr úz1p2r ú2zs1a2l ú2zsál 2úzse úzs1e2c 2úzsi úz3sz úz1t2r 2ü. ü1a üa2já üa2la ü1á üá2ga üá2go üá2gu üá2ra üá2sz üb2lo ücsö2k1 ü2des 1ü2dít üd1íz ü2d1ör üdös3s üdőé2 1ü2dül üd2v1a2 üd2v1el üd2v1e2s üd2vél üd2vid üd2v1í üd2vo 1üdvö üd2völ üd2vő üd2vu üd2vú ü1e üe2bé üe2ge üe2gé üe2le üe2l1é2 üe2me ü1é üé2ke üé2pí üf2f1ö2 üfö3le üf2ro üge1k2 üge3l üg2ra ü2gy1a2 ü2gy1á ü2gyef ügy1e2lemb ügy1e2lemm ügy1elf ü2gy1ell ügy1elm ügy1elo ügy1éjé ügy1ékb ügy1éré ügy1érr ü2gyés ü2gyil 1ü2gyin ügy1int ügy1ira ü3gyí 1ügynö ügy1os ü2gy1ő2 üh1af üh1at üh1ás ü2h1e2le üh1elf üh1ellen ü2h1e2lő üh1elv ü2h1éh ü2h1ér. ü2h1in ü2h1it üh1or üh1ős ü1i üi2gé üi2ko ü1í üí2rá ük1a2n üka2p ük2kal ük2ká ükke2 ükkel1 ük2ker ükko2 ük2kop ük1u2n ül1ab ül1a2d ül1ag ül1aj ül1a2k ü2l1a2l ül1a2r ül1at ül1au ül1á2c ül1á2g ül1ál ül1á2p ül1á2r ül1á2s ül1br ül1d2r ü2l1ecse ül1e2dz ü2l1e2g 2ülek ül1ell ü2l1e2lőte ül1eng ül1enn ü2l1e2r ül1e2ső ületa2 üle2tal üle2t1an üle2t1as üle2tav üle2t1á2 üle2t1eg üle2t1e2l üle2t1ék üle2t1ér. üle2t1érn üle2t1é2rő. üle2térü üle2t1é2ve. ületo2 üle2t1or üle2tos üle2t1ó2 üle2t1ö2 ület1t2 ül1ette. ül1etted üle2t1u üle2tüz ü2l1ex ü2l1é2g ülé2k1a2 ülé2k1á2 ülé2k1e2l ülé2kev ülé2kir ülé2k1o ülé2ku ü2l1él ül1é2pü ü2l1ér. ü2l1é2ré ül1éri ül1érj ül1érn ül1érs ü2l1é2rü ül1érv ü2l1érz ülé2sa ülé2so ülés3s ülé2s3zá ül1fr ü2l1i2d üli2g ü2l1iga ül1ill ü2l1im ü2l1int ül1ira ü2l1itt ü2l1iz ül1íg ül1í2r ül1í2v ül2l1a2n ül2l1in ül2l1ö2vü ül2l1u2 ül3lyu ülnö2k1öl ül1o2d ül1o2l ül1om ül1op ül1or ül1ó2v ü2l1öb ü2l1ö2l ü2l1ömö ü2l1ör ü2l1ö2v ülőe2 ülőé2l ülő1sl ülő1s2p ülő1sta ülőt2 ül1p2l ül1p2r ül1sl ül1sp ül1st ül2t1ad ültá2r 1ültetl 1ültets ül2t1e2v ül1tra ül1ud ül1u2g ül1u2t ül1ús ü2l1üg ülü2l ül1ülé ül1ülh ül1üli ül1ülj ül1üln ül1ült ül1ülv ü2l1ür ü2l1üt ü2l1üv ü2lyel üly1ess üly1esz üm1a2l üm1a2n üm1a2r üm1á2r üme3gi üm1éks ü2m1ép ü2m1érd üm1fl üm1fr ümi2g ü2m1iga ü2m1il ü2m1im ü2m1i2p ü2m1is ü2m1iz üm1kl üm1kr üm1o2l üm1or üm1os ü2m1öss üm1őr üm1p2r üm1tr üm1új ü2m1ü2l ü2m1üv ü2m1üz ün1ál ün1á2r ün1e2l üne2t1elet üne2tés ün1evé ü2n1é2p ün1id ü2n1ing ü2n1irt 1ünnep ü1o üo2k1i2 ü1ó üó2rá ü1ö ü1ő üő2re üp2ri üp2ro ürdés1s 1ü2reg üre2g1a üre2gá üreg1g 1ü2res üre2tö ü2röm ür2t1a ür2t1á ür2t1e2 ür2tis ür2t1o2 ürtok1 ürtü2 ür2tül 1ü2rül üs2s1a2 üs2s1á üs2s1eg üs2s1o2 üss1s üssü2 üs2s1ül üs2t1a2 üs2tá2 üst1ág üst1ál üst1ár üs2t1e2 üst1ég üs2t1ék üs2tél üs2t1ér. üs2t1ére üs2t1érm üs2t1il üs2tim üs2tir üs2t1is üs2tí üs2t1o2 üs2t1ó2 üs2t1ör üs2t1ö2v üs2t1őr üs2t1ős üs2t1u2 üs2tú üstű2 üs2t1űz üsz1ál üszi2 ü2sz1iv üsz1í2v ü2sz1önt ü2szür üt1ab üt1aj 1ü2teg 1ü2tem. üte2m1a2 ü2temb 1ü2teme üte2m1el ü2teméb üte2mért üte2min ütési2 üté2sik ütés3s üté2s3z 1ütkö ütő1s2p üt2t1á üt2t1é2 ütty1e2g üt2zi ü1u üu2ta ü1ú ü1ü ü1ű üve2g1a2 üveg3g üvezé2r 1üze2m1a2 üze2m1á üze2meg üze2m1érté üze2m1étk 1ü2zemi üze2m1o ü2zemt üze2m1u2 ü2zemű üze2t1a üze2t1o üzé2ra üzé2r1e2l 1üzlet. 1üzletn 2ű. ű1a űa2da űa2dó űa2gy űa2ka űa2la űala2g1 űa2lo űa2na űa2ny űa3nyagoc űa2or űa2pa űa2pá űa2ra űa2rá űa2to űa2ut űa2va űa2xi űa2zo ű1á űá2bé űá2ga űá2gá űá2gy űá2hí űá2je űá2lo űá2po űá2ra űá2ri űá2ro űá2ru űá2sí űá2té űá2tí űba2l1 űbé2rel űb2lo űb2ró űcsapá2 űcsa2p1ág űcs1as ű2cs1ék űcs1i2pa űd1ál ű2d1e2l ű1d2rá űd2ro ű1d2ró űd1sk ű1e űe2cs űe2ge űe2gé űe2gy űe2kére űe2la űe2le űe2lé űe2l1í2 űe2lő űe2lü űe2me űe2pi űe2po űe2re űe2rő űe2se űe2sé űe2ső űe2te űe2ti űe2vé űe2vő ű1é űé2le űé2lé űé2nekb űé2neke űéne2kest űé2neké űé2nekr űé2pí űé2te űfa2j1e2 űf2lo űfo2g1a2l űf2ra űf2ri űf2ro ű2g1ö2lé ű2g1ö2lő. űg1ős űgő2z űg2ra űg2rá űholda2d űhol2d1ada ű1i űi2do űi2ga űi2gé űi2má űi2mi űi2pa űi2rá űi2ro űi2sz űi2ta űi2zé űi2zo ű1í űí2rá űí2ri űí2ró űí2té űí2ve űí2zü űí2zű űkia2 űk2la űk2li űk2lí űk2lo űk2rep ű1k2ré ű1k2ri ű1k2ro ű1k2ró űk2va űme2g1 űn1al űn1ar űn1ál űn1á2r űn1e2le űn1elh űn1e2li űn1elk űn1e2lő űn1elr űn1elt űn1eml űn1e2se űn1est űne1t2 ű2n1ér. ű2n1érte űni2g ű2n1iga ű2n1in ű2n1i2p ű2n1i2r ű2n1is űnme2 űn3ny űn1o2k űn1ol űn1os űn1ó2r űn1pr űn1s2k űn1s2t űn1u2n űn1u2t ű2n1üs ű2n1üz űn1űz ű1o űo2dú űo2ká űo2ko űo2la űo2rá űo2ro ű1ó űó2ce űó2ra űó2rá űó2ri ű1ö űö2lő űö2rö űö2ve űö2zö ű1ő űő2rö űp2la űp2lü űp2ne űp2ré űp2ri űp2rí űp2ro űp2ró űr1ad űr1a2l űr1a2m űr1a2n űr1au űr1a2v űr1áb űr1ál űr1ás űr1áz űr1egy űr1e2l űre2n ű2r1e2r űr1ex ű2r1é2j űr1é2l űr1ép űrés3szer űré2sza űré2szá űré2szí űré2szo űr1fl űr1id űri2g űr1iga ű2r1i2m űr1int űr1i2p űr1ist ű2r1ír űr1o2d ű2r1ol űr1o2p űr1or űros2t1a2 űr1ot űr1ón ű2r1ö2l űr1ör űrő1f2 űr1pl űr1pr űr1p2s űr1s2p űr1s2t űrszt2 űr1tra űr1uj űr1un űr1u2t űr1út űr1üg űr1üz ű2s1ajtó űs1ál űsé2g1el ű2s1ín. ű2s1í2r ű1s2ka ű1s2ká űso2rad űso2raj űso2ral űso2ran űso2rál űso2rosz űsor1s űsort2 űs2pe űs2pi űs2po űsp2r űs2rá űs3sz ű1s2ta ű1s2tí ű1s2to űst2r űs1tro ű2s1uj ű2s1ü2t űsze2r1á űsze2r1e2le űszere2p űsze2r1epé űsze2r1ült űsz2k űsz2t űtés3s űtőa2 űtőe2 ű1t2ra ű1t2rágá ű1t2re űt2ri ű1t2ro ű1u űu2ga űu2ra űu2sz űu2ta űu2tá űu2tu ű1ú űú2ri űú2sz űú2ti űú2to ű1ü űü2gy űü2lé űü2rí űü2te űü2té űü2tö űü2ve űü2vö űü2ze ű1ű űű2ző űvé2sz1a űvé2sz1á űvé2sz1e2l űvé2szer űvé2szint űvé2szo űvé2sz1ó2 űvé2szö űvé2szú űví2z1 űvíze2 ű2z1a2b űz1a2d űz1a2g űz1ak űz1a2l űzal1e űz1a2p űz1a2r űz1a2s űz1a2t űz1a2u űz1á2g ű2z1ál ű2z1árb ű2z1árj űz1átl űz1átu ű2z1ed ű2z1ef ű2z1e2l ű2z1em ű2z1e2r űze2s ű2z1ese ű2z1esé ű2z1est ű2z1esz űze2teg űze2tel ű2z1e2v ű2z1ég ű2z1é2l ű2z1érm ű2z1érté ű2z1érz ű2z1ész űz1fr űz1gl űz1g2r űzi2g ű2z1iga űzigaz1 ű2z1igé ű2z1i2m ű2z1i2r űz1isk űz1ism űz1ist űz1i2sz ű2z1iz űz1ín űz1ír űz1í2v űz1kl űz1kr űz1o2k űz1o2l ű3zom űz1on űz1op űz1or űz1os ű2z1óc ű2z1ó2r ű2z1ö2kö űzöl2d1el ű2z1ö2v ű2z1öz űzőa2 űzőe2 ű2z1őr. űz1ő2rei ű2z1ő2ri űz1őrk űz1őrm ű2z1őrn ű2z1ő2rö ű2z1őrr ű2z1őrs ű2z1őrt űz1őrz űz1p2r űz3sa ű2zsám ű2z3sár ű2z3sáv ű2z3ser ű2z3sé ű2z3só ű2z3sö űz3s2p ű2z3suga űz3sü ű2z3sű űz3sz űz1t2r ű2z1ug űz1úr űz1út ű2z1ü2g ű2z1ül űz1ünn ű2z1üt űz3zs 2v. 1va vaa2d vaát1 vaáta2 2v1abl va1bra v1abs vacs1ala va2cs1an va2csap va2csál va2cs1ü2 vacs3z 2v1a2dag va2d1aj va2dalé 2v1adap va2d1asz v1a2data v1a2datb v1a2datk v1a2dato v1a2datr va2daz va2d1ál va2deg va2d1e2l va2den va2dep va2d1e2r va2d1e2t va2dél vad1éte va2dib va2d1id va2d1ir va2d1i2t va2d1ír va2d1ol 2vadom va2dóh va2dói v1a2dój va2dór v1a2dóu va2d1ör va2d1ő2 va2d1ú va2dű va2dza va2dzá va2dze vaé2r va2g1as va2gav va2gás va2g1e2 va2g1é2n vag1g va2gid va1gle va2g1o2ku va2goli vag1ost va2g1osz va2g1ura va2gú 2v1a2gyú va2j1ar va2j1ác va2j1á2ro va2j1e2g va2jí va2j1ol va2j1ó2s va2jö va2jü 2va2kad vak1a2dá va2k1aj vak1akn vak1apá vak1árn va2k1ás va2k1át va2keg va2kem va2k1érté va2kis va2k1ír va2k1ó2s va1krí vak1t2 2vakti 2v1aktu 2vakup va2k1út va2lac va2laku va2lap. va2lapí va2lapú vallás1s 2v1amp 2v1a2nal va2n1e2g vane2m van1eme va2n1es vané2v van1éve van1évi 2vang van3n va2nol va2nó 2v1a2nyá 2v1a2nyó va1p2l va2pos va1p2r 2v1a2pu va2r1ab vara2c var1acé va2r1a2d var1ajt var1akt va2r1al va2rany var1a2nya va2r1a2p va2r1a2r va2r1assz va2r1at va2r1av va2rág va2r1ál 2v1a2rány va2r1ászn var1áta va2r1átf va2r1átm va2r1á2to va2r1á2zá varca2 var2cag var2cal var2can varc1c var2c3ho va2r1es va2r1e2t va2rev va2rég var1ék. var1éks va2r1é2l va2rép va2r1éré va2rid va2r1i2ko va2r1ikr va2r1ill va2rim var1inf var1ink va2r1inv va2r1i2p var1isk var1ism va2rí var2k1an var1k2b var1k2j var1k2ká var1kl va2r1okm var1old va2rop va2ror va2rön va2rő vars2 varsz2 var2t1i2n var2tor vartó2 var2t1ór va2r1ut va2r1út va2r1ü2 va2rű vas1abl va2sag va2s1aj vas1arc vas1asz va2s1ábr va2s1ál va2s1árl va2sek va2s1e2l va2sem va2s1e2r va2set va2s1ék. vas1ékk va2s1ékn vas1ékt vasé2r va2s1ére va2s1érté va2s1érv vasfélé2v va2sid va2s1i2na. va2s1ing va2s1i2s va2s1iz va2s1ön va2ső vas3sze vas3szi vas3sző vast2 vas1tró va2sus va2s1ü2t va2sű vasz1e2l va2szis va2t1a2d va2t1aj va2tau va2t1ál va2t1á2ru va2t1e2v va2t1ék va2tél va2t1érte va2t1é2te va2t1id va2tim vat1inf vat1ing va2t1is va2t1ír vatmo1 vatmosz2 va2t1okm va2t1old va2t1ö2v vatő2 va2t1őr vatt2 2vattako va2t1ur 2v1a2uk vau2n vaza2t1e 2v1a2zon 1vá váb2baj váb2b1as váb2b1e2 váb2b1é váb2bil váb2bol váb2bos váb2bő váb2bu 2vábr vá2c3h vá2cs1a2p vá2cse vá2cs1ék vá2csip vá2cs1is vá2cső vá2csú vá2csü vács3z vá2d1al vá2d1a2n váde2 vá2des vádé2 vá2dén vá2dik vá2d1ir vá2d1or vá2dö vá2dü 2v1á2gaz 2v1ágr vá2gú vá2gyal vá2gyan vá2gyö vá2győ vá2k1e vá2k1ü vá2laj vá2l1a2l vála2n vá2l1any vá2l1ap vá2lar vála2szin vá2l1á2r vá2l1át vá2l1e2 vá2lél vá2lid vá2lin vá2lir vá2lism 2v1állás vál2l1e2 2v1állom 2v1álló vál2l1ö2 vá2lú vá2lü váma2 vá2m1ad vá2m1aj vá2m1ak vá2m1al vá2m1as vá2mau vá2m1á2 vám1b2 vá2m1e2 vá2m1ér. vá2m1érté vá2mil vá2m1in vá2m1ir vá2mis vá2mí vá2m1or vá2mö vá2mő vámu2 vá2m1ut vá2mü vá2naj vána2n ván1any vá2n1e vá2nis váns3s vá2n1ú vá2nü ványa2d vá2nyaj vá2ny1a2l ványa2n vá2nyany vá2ny1ap vá2nyar vá2ny1as vá2nyau vá2nyaz vá2ny1e2 vá2ny1ér. vá2nyérd vá2nyérr vá2nyérv vá2nyérz vá2ny1ing vá2nyis vány1í2r vá2ny1ó2 vá2nyö vá2po vár1a2dato vá2radá vá2r1a2dó vá2r1a2du vára2l vá2r1ala vár1ale vá2raml vára2n vá2r1any vá2r1ar vá2r1assz vá2r1a2sz vá2rág vá2r1ál várd2 vá2r1e2 vár1isk vár1ism vár1ist vá2rí vár1old vá2r1oml vá2r1ont váro2sz vár1oszt vá2r1ó2né vá2rö vá2rő várs2 vár1sp vár1sr vár2t1es vár2t1ér. 2váru. vá2ruh vár1u2r vár1usz vár1ut várú2 vá2rús vá2rü vá2s1a2d vá2sam vá2saz vásár1a2d vá2s1e vási2k vás1iko vá2sis vá2sír váskész1 vásó2 vást2 vás1tr vá2s1ü vá2sű vá2szan vá2s3zav vá2sz1e vá2szin váta2 vá2t1al 2v1átd 2v1á2t1e2r 2v1átfe vá2t1ir 2v1á2tí v1átlé 2v1átm 2v1á2t1ö 2v1átp 2v1á2tü 2v1átv vá2z1alj vá2z1alt vá2z1a2tom vá2z1a2v vá2z1e2 vázi1s2 vá2ziz vá2zí vá2zos vá2zö vá2ző vá2z3sa vá2z3sá váz3se vá2z3sé váz3sö vá2z3su váz3sz vá2zü vb2lo vb2ra vcsőé2ne vd2rá 1ve vea2g vea2l vea2n vea2r veá2l 2vece ve2cet ve1cl ve2cseg 2vedény ve2gab ve2gac ve2gar ve2g1as vega2z ve2g1á2 ve2g1eg ve2g1e2kéh ve2g1ell vege2lőké ve2g1elr ve2g1e2r ve2g1esem ve2g1esz ve2g1e2tet ve2g1ék ve2g1él ve2g1ép veg1éré veg1érte veg1érv vegés3s vegé2sz vegg2 veg1gr ve2gid ve2gik ve2gim ve2gí ve2gol ve2gor ve2g1ó2 ve2g1ö2 ve2g1u ve2gú ve2gyelem ve2gyemb ve2gyez 2v1egyl 2vegyv ve2k1ak 2v1e2ke. 2v1e2kei 2vekéb ve2kébő 2v1e2kék 2v1e2kés ve1klu 2vela 2v1e2lef 2v1e2lemz vele2t1e2l 2v1e2lég velés3s 2v1elf v1elgy 2v1elha 2v1elhel ve2lis 2v1e2l1í2 v1eljá 2v1elm ve2los 2v1e2lőirá 2v1e2lőí 2velőkés 2v1előleg 2v1elr 2v1elsa 2v1elszá 2v1elszo 2v1eltá 2v1elter 2v1eltér 2v1elto 2v1elv. 2v1elvá 2v1elvek ve2lyö ve2lyu 2v1elz 2v1embó 2v1e2mel 2v1eml 2v1e2mu ve2n1ad ve2nau ve2n1á ve2n1e2g ve2n1e2l ve2n1esz ve2n1é2vi ven1f2 ven1g2 ven3k2 ve2n1o ve2n1ó2 ve2nö ventü2 ven2t1ül ven1ülé ve2nyö 2v1enz veó2r ve2ör ve2pe ve1p2r ve2rab ve2r1a2c ve2r1a2d ve2r1a2g ve2rajá vera2l vera2n ve2r1a2r ve2r1au ve2raz ve2r1ág ve2r1ál 2verdő ver1egy ve2r1e2h ve2r1e2ke. ve2rekl ve2r1e2l ve2r1eng ve2r1er ve2r1e2ső ve2r1esz ve2r1é2l ver1g2 ve2r1iga ve2r1ill ve2rim ve2r1inc ve2rind ve2r1inf ve2r1ing ver1inte ver1ipa ve2ris ve2r1ol ve2ror ve2ró ver1ó2r ve2rö ver1p2 ver2s1al ver2sár versé2g ver2s1égé ver2s1égg ver2s1égn ver2s1égt ver2sir ver2s1í2 ver2só vers3s ver2s1üt vers3zár vers3zen ver1tra ve2rur ve2r1ut ve2rút ve2r1ü2g ve2san ve2sas ve2s1ál ve2s1e2kétő veset2 2v1e2sett ve2sip ve2sis ve2s1íz ve1ská 2v1e2ső ve1s2pe ves3sza ves3szer vest2 ve2s1u2 2v1e2sze. 2v1e2szekn 2v1eszm 2v1e2szű veta2l ve2tas ve2tál ve2t1á2r vet1egy ve2t1e2lől ve2tég ve2t1é2k ve2tid 2v1e2tika v1e2tim ve2t1ing ve2t1ol ve2t1öl ve2töv vetőé2 ve2tur ve2t1ut ve2t1ű2z ve2vet 2v1e2vo vezőe2r vezőkész1 vező2sorr vezős1s 2v1ezr 1vé véá2g 2v1ébr vé2dak véda2l vé2d1as vé2dá vé2d1emb vé2dos vé2dóv vé2dö vé2dú vé2dz vé1f2r véga2 vé2gab vé2gak vé2gal vé2g1á2 vé2g1eg vé2g1e2le vé2g1elg vé2g1elh vé2g1eli vé2g1ell vé2g1els vé2g1elv vég2em vége2n vé2g1eny vé2g1ep vé2g1er vé2g1esem vé2g1e2sete vé2geté vé2gető vé2g1ér. vé2g1é2ren vé2g1é2ré vé2g1érr vég1érv vég3g 2véghü vé2g1id végigaz1 vé2gim vé2giz vé2g1í végkötés1 vé2gol vé2g1ó2 vé2gö vé2gú 2v1éh. 2v1é2he. 2v1é2hen 2v1é2hes 2v1éhs vé2kei vé2kít vé1k2l vé1k2ré vé1k2ri 2v1éks vé2kük vé2l1a2 vé2láb vé2lál vé2l1ár vé2leg vél1ell vél1els vél1elt vél1emb vé2l1eme vé2l1e2r vé2les vél1ess vél1est vé2lev vé2lez vé2l1é2k vé2lin vé2lir vé2lí vé2los vé2lői vé2lős véltá2v vé2l1u vé2lú vé2lű véna1p 2vénekl vé2n1emb vé2ny1eg vénye2l vény1ele vény1els vé2nyid vé2nyis vé2ny1í vé2nyú vényü2l vé2ny1ülé vé2ny1ült 2v1é2pí vé1p2l vé1p2r 2v1é2pü vé2ral vé2r1a2n vé2rap vé2rar vé2raz vé2r1ár vé2rát vér1d2 vé2r1e2l vér1eml véres3s vér1eti vé2rés vér1ész vér1éte vér1ikr vé2rir vé2r1o2k vé2rot vé2róv vér1s vértes1s vér2t1ón. vér2töv véru2 vé2rug vé2rut vé2r1ú vérü2kü 2v1érzet. vé2sak vé2sal vé2seg vése2l vés1ele vés1elt vé2s1er vé2só vé1s2pe vés3szer vés2táb vé2s1ü2v vés3zav vész1á2r vé2szeg vész1ell vé2sz1ékn vé2sz1ő2 vész3s vé2szu vészú2 vész1úr vészü2l vész1ülé vét1est 2v1év. vé3va 2v1évb 2vévei 2v1é2vek 2v1é2ven 2v1é2véé 2v1é2vér vé2vi. 2v1évr 2v1évt 2v1é2vü vfe2l1em vf2ra vf2re vf2ri vf2ro vge2o vg2ra vg2rá vhang2a3 vhez1 1vi vi2aa vi2ab vi2ac vi2aé vi2ag via2p via2szal via2sz1ál via2sz1árn via2sz1em viaszé2 via2szél via2szö viára2 viár1ad vic2c1a 2vické vi2csag vi2csal vi2cs1an vi2cs1as vi2csál vi2cs1e2l vi2cs1ér. vi2csérté vicsi2 vi2csim vi2csip vi2cs1ö2 vi2csú vics3z vi2deg vi2d1esz 2vidéz 2v1i2dő vi2dz vi2ew 2v1i2gaz 2v1i2gén vika2 vi2k1ag vi2k1el vi2kon vi2l1ék villa1s villasz2 2villu vi2má 2v1imm vina1t2 2vind vi2n1emb vi2n1ó vin2tess vin2tesz 2vinté vin2tos 2v1i2on 2vipa vi1p2s 2v1i2rat. 2v1i2ratot 2viratoz. 2v1i2rod visa2 vi2sal vi2s1au vi2s1á2g vi2ser vi2s1ék vi2sim vi2s1is vi2siz vi2sö vi2szár vi2szok vit2a vi3tad vitakész1 2vital vitelő2 2vitn vi2t1ú vi2zeg vi2z1ell viz1é2l vi2zin vi2zok vi2zol vi2zom viz1os vi2zsá viz3sz vi2zud vi2zú 1ví vídi2 ví2ge ví2ny vínyenc1 2v1í2ra 2v1í2rá 2v1í2ró 2vítélet. v2í3téletb 2vítélete 2v1ívb vívókész1 ví2z1a2 ví2zá ví2zel víz1e2le víz1elf víz1elh víz1ell víz1eln víz1elő víz1elp víz1els víz1elt víz1elv víze2m víz1emb víz1eme víz1emé ví2zék ví2zés ví2z1ing vízi1sk ví2z1ist ví2z1isz ví2zí ví2z1o ví2z1ó2 ví2zö ví2z1ő2 ví2z3s2 ví2zú vízü2 2v1í2zű víz3z vjára2t1út vje2gya vje2tel vje2tu vkia2l vkiá2 vk2li vk2ló vk2lu vk2ri vk2rí vk2ró vla2te vleí2 vleü2 vme2g1 vna2p1in 1vo vo2il vo2ji vo2kí 2v1okm voks3s 2v1okta vola1t 2v1oldá 2v1oldó. vol2t1a2d vome2 vomec3 vona2l1e2 vona2t1e vonás1s voná2s3z vo2od vo2pe vo2r1a2 vo2r1in 2v1orm vo2s1as vo2s1av vo2s1e vos3s2 vo2s1ú vo2sü vo2uc vo2vá vo2xi 1vó vóa2k vóá2g vóá2r vócsa2p1á2 vó1d2re vó1f2r vó1k2l 2v1ónn vóó2r vó1p2l vó1p2r vó2ran vó2rák vó2rán vó2rát vó2s1akk vó2s1a2l vó2seg vó2s1iv vó2sol vó2s1orr vó2só vó2sö vó2ső vó1spi vós3s vós1tr vó1sz2 vósza2k1 vó2s3zár vó2s3zen vóta1t2 vó1t2r vóváros1u 1vö vö2bö vö2dém 2v1ö2ko völ2gya 2v1ö2rök 2v1ötl vö2ve vö2vé 2v1özön vözőe3 vö2zs 1vő vőa2n vőá2g vőe2l vőe2r vőé2j vőé2n vő1fl vő1f2r vői3dejű vő1kl vőo2l vő1pl vő1pr v1őrm v1ő2rü vő1s2p vő1sta vő1str vő1t2r vőü2l vő2zi vp2la vp2ra vp2re vp2ré vp2ri vp2ro vp2ró vp2sz vs2ká vs2ki vs2ko vs2lá vs2pe vs2ta vs2ti vs2tí vs2to vst2r vs2tú vsz2p v1sz2t vta2n1á2s vta2n1á2to vta2n1ó2 vtá2raj vtá2r1ass vtá2ris vtáró2 vtá2r1ór vtelés1s vt2ra vt2ré vt2ri vt2ro 1vu vu2bo vu2mal vu2man vu2m1e2 vu2mis vu2mö 2v1u2ni vu2ra vu2ru 2v1u2tak 2v1u2tas 2v1u2tat vu2tá v1utc v1u2tó 1vú vú1fr v1újd v1ú2jí v1újs vú2r1ad vú2re vúré2 vú2rén vú2rö vú2szó v1útn 1vü vü2gy vü2kü vü2lá 2v1üld 2v1ünn vü1pr vü2rí vü1st vü1sz2 vü2te vü2té vü2zé 1vű 2v1űrl vű2ző vvágy1ób vverés3s vzá2r1ó2ra 2w. 1wa wa2ii wa2le war2d1i wa2re wa1s2h wa1ye wa1yé 1wá 1we we2b1a2 we2b1á2 we2b1ele we2b1é we2bir we2b1o we2b1ú we2bü we2ed we2ek we2ig we2is we2le we2ör 1wé whi2t 1wi wi2ch wi2cz 1wí 1wo wo2od 1wó 1wö 1wő wri2t wsto2 1wu 1wú 1wü 1wű wyo2m1 2x. 1xa x1a2da xa2dá xaé2d xa1fl xa1k2l 2x1akt 2x1a2la 2x1alg 2x1alj 2x1alk xa2na x1a2ny x1a2rá xa2ri xa2vi 1xá 2x1ábr xá2gy 2x1áll xá2rak 2x1á2ram xá2ras 2x1á2ro 2x1árr 2x1á2ru 2x1átj 2x1átr 2x1átv xba2l1 xb2la xb2lo xb2ra xd2ró 1xe x1e2gy 2x1e2ke. xe2l1a xe2l1á 2x1e2lekt xe2lel xe2l1emb 2x1e2lemr xe2l1esz xe2l1in xe2l1o 2x1emel 2x1eml 2x1e2rő 2x1e2sé 2x1e2zü 1xé 2x1éhs xé2pí 2x1ér. 2x1érte 2x1érté 2x1értő 2x1érz 2xévei xf2re xha2u 1xi xia2n xi2av xi2d1a2l 2xidá xi2dás 2xi2de 2xidé 2xidgá xi2d1i2 2xidjá 2xidjé 2xidl 2xidm xi2dol xi2dö 2xi2dő xid1őz xi1d2ro 2xidró 2xids 2xidu 2xidv 2xi2dz xi2el 2x1i2ga xigén1n 2xilc 2x1ill xina2 xi2n1an 2x1ind xine2 xi2n1et xi2n1i2 xi2nö xi2on xi2óc xi2óe xi2óg xi2ómé xi2óo xi2óö xi2óp xió2rá 2x1i2rá 2x1i2ro xi2sad xi2sal xise2 xi2s1el xi2s1es xi1s2ká xis1p xis3s xi2s1ü xi2t1e2g xi2t1e2r xi2t1é xi2t1i2 xi2t1ü2 1xí xí2ja xí2já xí2jo xí2ju x1í2rá xí2ró 2x1ívn 2x1í2vü 2x1ívv 1xo 2x1old xo2n1ai xo2n1al xo2n1e xo2pe xo1p2l 2x1osz 1xó 1xö xö2dé xö2rö xö2zö 1xő xő2sé xp2la xpor2t1a2 xpor2t1á2r xpor2t1e2 xpor2t1érd xpor2t1ü2 xp2ri x1p2ro x1p2ró xs2ká xs2pe xs2ta xst2r x2t1e2d xti2la xti2lá xti2leg xti2lin xti2lis xti2l1o xt1ört 1xu xu2sad xu2sal xu2s1a2n xu2s1e xu2s1érté xusi2 xu2sil xu2sim xu2sin xu2sit xu2s1ol xu2s1ó2 xu2s1ö2 xus3s xust2 xus1tr xu2sus xusú2 xu2s1út xu2sü xu2s1ű xu2s3z xu2ta 1xú 1xü xü2lé xü2ve xü2ze 1xű 2y. yaa2d y1abla y1a2bon y1abra ya1bri y1abs ya2cél. ya2dako ya2dalé y1adap y1a2data y1a2datb ya2dati y1a2dato ya2datu yadé2ki ya2d1és ya2dév y1admi ya2dóan ya2dóbó ya2dóé y1a2dói y1a2dój ya2dóké ya2dókt y1a2dóm ya2dóná y1a2dór y1a2dós y1a2dóu yae2r ya2ero yae2t yaé2r y1aff ya1f2r ya2g1a2d ya2g1ag ya2g1am ya2gan y1aganc ya2g1a2s ya2g1atl ya2g1ato ya2gau yaga2z yag1azo ya2g1áll yag1árá yag1árb yag1á2ré yag1árh yag1ári yag1árj yag1árk yag1á2ro yag1árra. yag1árs yag1árt ya2gás yag1át1a2 ya2g1átf ya2g1átl ya2g1átr yag1d2 ya2gec ya2g1el ya2g1es ya2g1é2g ya2gék y1aggr yag3gyú ya2gid ya2gim ya2g1io yag1isz ya2giz ya2gí ya2g1osz ya2g1ó2r ya2gő yag1s ya2gur ya2g1ut y1agy. y1a2gyat y1agyb y1agyf y1agyk y1a2gyon y1agyr y1a2jak y1a2ján y1ajk y1ajt y1akadá ya2k1áll ya2k1átk ya2k1átm yak1elm yak1elt yak1ékn ya2k1ér. ya2k1éri yak1i2zo ya1klu y1akna. y1aknák ya1kné y1a2kol. ya2k1ola ya2k1old ya2k1ón y1a2kós ya2k1örv ya1k2rém ya1kri ya1krí y1akt. y1akták y1aktb y1aktiv y1aktj y1aktot y1aktu yala2g1ú ya2l1agy yal1ajk ya2lakb y1a2lakj y1a2lakk y1a2lakok y1a2lakom y1a2lakot ya2lakt ya2laku y1alakz ya2l1a2l y1alany ya2lapa y1a2lapí ya2lapjá y1a2lapú yala2te yal1ága ya2l1ál yalás1s y1aláté ya2l1é2ne ya2lif yal1i2ko ya2l1inv y1aljai y1alji ya2lor yalókész1 ya2l1órá ya2l1ő2 y2alta yal1t2r y1altú ya2lü ya2lű y1amalg ya2m1any yam1a2rár yama2tal ya2m1árb ya2m1árn yamászás1 ya2m1á2to yam1b2 yam1emb yam1esés yami2k ya2m1iko ya2mind ya2m1i2o ya2m1is ya2m1osz ya2m1ó2r ya2mö ya2mő ya2mü y1a2nal ya2nan ya2nar yan1arr ya2nat yan1att ya2n3e. ya2n1e2g ya2nek ya2ner ya2n1et ya2nez y1a2ném y1ang ya2nid ya2n1in ya2n1is ya2nit y1a2niz y1anny yano2d yan1oda yan1onn ya2nő. ya2nyas y1anyj y1a2nyó y1a2nyuk yaó2r y1a2pa. y1a2pai y1a2pas y1a2páb y1a2pád y1a2páé y1a2pái y1a2pák y1a2pám y1a2pára y1a2páró y1a2pát. y1a2páto y1a2pátó y1a2páv y1a2pi. y1apjáh y1apjái y1apju ya1p2l ya2post yapo2tá y1a2pó. y1a2póé y1a2póh y1a2pói y1a2pój ya2póké ya2póna y1a2pós ya2pót. ya2pótó y1a2póv y1app ya1pre ya1p2ri y1aprí ya1pro ya2r1a2dá ya2r1a2dó ya2r1a2du ya2rasz ya2ránn y1a2rány ya2r1átv y1arc. y1arca y1arcá y1arcb y1arcc y1arch y1arck y1arcn y1arco y1arcr y1arcu y1arcú 1yard. 1yardn 3yardom 1yardos yar1drá yar1ell ya2roma ya2ror yar1ó2rá yar1óvá ya2róz yar1s2 yas1alj ya2sap ya2s1as yaság1g ya1sl ya1sne ya1s2pi ya1s2po ya1s2rá yast2 ya1s2ta ya1sto ya1str ya1svi yasz2tár y1a2tád yatékát1a2 y1atka. y1atká ya2tomh y1a2tomm y1a2tomo yat2rág ya1tré ya1tróf y1attr y1a2ty y1a2uk y1a2ulá yau2tá y1a2uto y1autó yautói2ko yaü2t yaü2z y1a2vat y1a2zon y1a2zúr y1á2bé y1ábr yá2ga yá2gá yá2gé yá2gi yá2go yá2gu yá2gú yá2gy yá2jal yá2j1e yá2j1ö yá2jő yáka2 yá2k1an yá2k1á yá2k1e yá2kü yálas3s yá2lál y1áldo yá2l1e y1állam y1állat y1állás y1állí y1állo y1álló y1állv yá2lü yáma2 yá2m1al yá2m1an yá2m1ap yá2m1as yámi2 yá2m1in yá2mü yá2n1e yá2nék yán3n yá2nö yánt2 yán1tr yá2nü yá1ny2 y1á2po yá2r1a2l y1á2raml y1á2ramo yára2n yár1any yá2rap yá2rar yá2r1ass yá2r1av yá2raz y1árazá yár1azo yá2r1ál y1árbev yár1d2 yá2r1e2 y1árem yá2réj y1á2riá yá2rim yá2r1is y1árnya yáró2 yá2rór yá2rö yá2rő y1árpá yár2sé y2árt. y1ártám yár1tr y1á2ruh y1árur yá2rú2 y1árú. yá2rü y1árva y1árver yá2sal yá2sas yá2s1á2g yá2s1á2rá yá2s1árt y1á2sás yá2se yáská2 y1á2só yá2sö yá2szab yá2szag yá2szal yá2szas yá2sz1ál yá2sze yász1el yász1em yás3zen yá2szét yá2szév yá2szim yá2szin yá2szis yá2szit yász1ó2d yász1ó2r yá2sz1ö2 yá2sző yá2sz1ü2 y1á2ta yát1a2l y1á2tá y1átb y1á2t1e2 y1á2té y1átf y1áth y1á2t1i2 y1átk y1átlag y1átlá y1átlé y1átm y1átn y1á2t1ö y1átp y1átr y1áts y1átt y1á2tü y1átv ybeá2 yb2la yb2le yb2lé yb2li yb2lo yb2lú yb2ra yb2ri yb2ro yb2ró ycsa2p1á2g ycsőé2 yc2vi yd2be y2desd yd2ni y1d2ra y1d2rá yd2ro yd2ró y1d2ru yea2v yeá2r ye1bl y1ecset ye2d1á ye2deg ye2d1esz ye2dol ye2d1ó2 ye2d1u2 ye2d1ú ye2d1ü2lő yed2vér yee2s y1eff yega2 ye2g1ala ye2gan ye2g1az ye2g1á2 ye2g1el yeg1e2red ye2g1él yeg1érbe y1egérr yegész1 yeg1észn yeg3g2 ye2gid ye2gí ye2gú ye2g1üg ye2gyed y1e2gyen y1e2gyes ye2gyet ye2gyez y1e2gyé y1egyh y1egyl y1egys y1együ y1egyv yei2g y1ejt y1e2ke. y1e2kei y1e2kek y1e2kéé ye2kéj y1e2kés. y1e2kése ye1k2ré y1elad y1e2lág ye2lál y1elc y1e2lef ye2lege ye2l1e2h ye2lemek y1e2lemez y1e2lemű y1e2l1e2re ye2légt ye2l1é2ké ye2l1ér. yelés3s yelé2s3z y1elhal y1elhel y1elhú y1e2l1in ye2liv y1e2l1í2 y1eljá y1elka y1elnev y1elnö y1elny ye2los y1e2lö y1e2lőad y1e2lőí ye2lőtt y1e2lőz y1elsa y1első y1eltér y1elto y1eltö yel2vad yel2v1áll yel2vás yel2v1eg yel2v1e2r yel2vessz yelve2sz yelv1esze y1elvevé yel2véd yel2v1ég yel2vél yel2v1érz yel2v1í yel2vol ye2mak ye2m1a2l ye2map yema2r ye2m1at ye2mál y1ember y1e2melé y1emelk ye2m1er y1e2més yemi2 yem1ing ye2m1is ye2mit yem1ita ye2miz y1emlék y1emlí y1emlő yem1ost ye2m1ö yem1p2 yemu2s yem1usz ye2n1á2 yen2csa yen2c3ser ye2n1elj ye2n1eln ye2n1elv y1e2ner yenes3s ye2n1é2l yenfé2l1é2v ye2nid ye2n1i2p yen1k2 ye2n1o ye2n1üg yenyá2 y1enz ye2pag yep1alo ye2p1ará ye2p1áll ye2pát ye2p1e2l ye2p1é2k y1e2pik y1epiz ye2pos yep2p1e2r ye1pro yep1t2 y1erde yere2ga yere2gete yereg1g y1e2rej yere2k1a yere2ká yere2k1e2sz yere2ko yere2k1ö2 y1e2rény y1erké y1erkö y1erny y1e2ro ye2rőér ye2rőig ye2rőné ye2rőrő ye2rősí ye2rőss ye2rővá yer2s1a y1erszé ye2sá yes1egé yes1egy ye2s1ej yes1e2kétő y1esemén ye2s1er y1e2setb y1e2seté y1e2seti y1e2setk y1e2setr y1e2setű y1esél ye2sip ye2s1í2r y1esőá ye2sőbe y1e2sőh ye2sője ye2sők. ye2sőkh ye2sőkr y1e2sőn y1e2sőr y1e2sős ye2sővé ye1s2pe yes2t1a2 y1estés y1estév y1estjü yes2tőr y1estű y1eszk y1eszm y1esztét y1e2szű y1e2tal yeteg1ér. y1e2tet ye2t1ért y1e2tik y1etn y1e2tűd ye2vet ye2vező y1e2vé y1e2vol y1e2vő y1e2zer yeze2t1ék yezőa2 yé2b1á yé2b1ér. yé2b1i2 yé2bü yé2des y1égb y1é2ge y1é2gé y1é2gi y1é2gő y1égt y1é2he. y1é2hen y1é2hes y1é2het y1éhs y1éj. y1éjb yé2jei yé2jen yé2jért y1é2ji y1éjj y1éjs y1éjt yé2kab yé2kad yé2k1aka yé2k1a2l y1é2kat yé2k1el yé2ker yé2k1é2k yé2k1é2l yé2k1ér. yé2kik yé2k1ó2 yé2k1ö yé2kő yé2kúr yé2l1á yé2le. yé2les y1é2let y1é2lén yé2lét yé2lim yél3l yé2lős y1élsp y1é2lű yéná2 yé2n1ár yén1e2ke. yé2nel yé2n1ikr yé2no yé2pí yé2pü yéra2 yé2r1aj yé2r1ak yé2ral yé2r1an yé2rar yé2r1á2 y1érch yér1d2 y1érdek yé2reg yé2r1e2l yé2rem y1érem. yér1eme yé2r1enc yér1eső y1é2ret yé2rev y1é2rez y1é2rés yé2ril y1é2rin y1érmü yé2r1osz yéró2 yé2r1ór y1é2rő. y1é2rői y1é2rők y1é2rőt y1érpa y1érték yéru2 yé2rut y1érv. y1érvén y1érvv y1érzet y1érzé y1érző yé2sz1á yé2sz1emb yé2sz1o yé2sz1ú yé2t1a y1é2tel y1é2ter yé2tén y1étke y1étl y1év. y1évad y1évb y1é2ve. y1é2vek y1é2vem y1é2ven y1é2ves y1é2vet y1évez y1é2véb y1é2vén y1é2vér y1é2vét y1é2vév y1évf y1évh y1é2vi y1évk y1évm y1évn y1évr y1évs y1évt y1é2vü y1é2vű y1évv yfas2 yfé2lá yf1gl yf2la yf2le yf2li yf2lo yf2ló y2föl. yf1ő2sö y1f2ra yf2ri yf2rí y1f2ro yf2rö yg2le yg2ló ygó1g2 ygót2 yg2ra yg2rá yg2ri yg2ró yg2ru yg2rü y2h1a2dó yha1p2 yha1t2r yhá2zal y2h1elv y1i2bo y1i2deá y1i2deg y1i2den y1i2deo y1i2dé y1i2dom y1i2dő y1i2ga y1i2gá y1i2géz y1igm y1i2har yi2hat y1ihl y1i2ker yi2k1érn yi2kont yi1k2ri y1i2ma. y1i2má y1i2mit y1imp y1i2nas y1inc y1ind y1inf y1inga yi2nic y1inj y1ins y1inv yi2ono yi2par y1i2ram y1i2rat. y1i2rata yira2t1é y1i2ratn y1i2rato yi2ratt y1i2rá y1i2ri y1i2rod y1irr y1irt y1ish y1isko y1ism y1isp y1ist y1i2sza yi2szel yi2szon y1i2tal y1i2tat y1i2var y1i2vás y1i2vó y1i2zé y1izg y1izm yi2zom yí2gé yí2ja yí2já yí2ju yí2ka yí2ká yí2ke yí2kí yí2kol yí2k1ö yí2la yí2l1e2 yí2lí yí2lö yí2ral yí2ráb yír1á2sz yí2rog yí2rő yítőa2 yí2vá yí2ve yí2vé yí2vó yí2vü yí2vű yí2zü yí2zű yje2gy1á2 y2jév yjob2b1o ykai2 yka1k2 yka2ró2ra yk2bó y2k1e2lem yk1é2jév yké2p1el yk2ho ykiá2 ykie2 yk1izm yk2ka yk2la yk2le yk2li yk2lí yk2ló yk2lu yk2ná ykóro2 yk2ra y1k2rá y1k2ri yk2rí yk2ro yk2ró yk2vó ylal2ta yla2t1a2n yla2t1é2t ylei2 yleí2 yle2tal yle2tá ylóá2 ylót2 yma1d2 y2mat. ymá2s1ik yme2g1é ym2ma yné2vér yn2ka ynk2r ynőé2n ynő2ié yo2be y1obj y1o2dú yo2gal yo2gál yo2g1ár yo2ge yog3g yogi2 yo2git yo2g1iv yo2gí yo2g1osz yo2gö yo2gü yo2gű yoka2 y1o2k1al y1o2ká y1o2k1ir y1okm y1o2kol y1o2kos y1o2koz y1okta yo2l1a2l yola2n yol1any yo2l1ári yol2cem yolci2 yol2cik y1oldá y1oldó y1o2lim y1oltás yol2ter yo2lú yo2lü yolví2 yo2m1a2l yoma2n yo2m1any yoma2s yo2m1aszó yo2maz yo2m1ál yo2m1árk yo2m1á2to yo2m1á2z yo2m1e yo2m1ik yo2mil yo2m1is yo2mí yo2m1ol yo2mö yo2mő yom1p2 yo2n1a2d yo2nag yo2naj yon1a2ka yo2n1a2l yo2n1am yo2n1a2n yo2nap yo2n1a2r yo2n1a2s yo2n1a2t yo2n1au yo2n1ál yo2n1át1a2 yo2n1áté yo2n1átj yon1átk yo2n1átr yo2n1áts yo2n1átv yo2n1á2z yon1d2 yo2n1e2 yo2néd yo2néh yo2nék yo2nén yon1f2 yo2nim yo2n1is yon1itt yo2niz yo2ní yon1k2 yon3n yo2n1ol yo2nop yo2n1osz yo2nö yo2n1ő2 yon1s2 yont2 yon1tr yo2n1ü y1o2pe y1opt yo2rad yo2r1a2k yo2r1a2p y1ord y1orgi y1orrú yor2sol y1orsó yors3s yo2se yos3s y1osto y1oszl yos3zs y1oszt yo2ut yo2ve yo2xi yóá2g yóá2r yócsa2p1á2 yó2dák y1ó2dár y1ó2dásak yó1f2l yó1g2r yó2gyár yó2gyi yó2gyú yóí2v yóo2k yóó2r yó1p2r y1ó2rac y1ó2rad yó2rag yó2rai y1ó2ras y1ó2ráb y1ó2rád y1ó2ráé y1ó2ráh y1ó2rái y1ó2ráj y1ó2rák y1ó2rám y1ó2rár y1ó2rás y1ó2rát y1ó2ráv y1ó2ri yó2s1aj yóscsa2 yó2sír yó2s1ol yó2s1orr yós1ors yós3s yósü2l yó2s1ű2 yö2bö yö2bű yö2cs yö2dém yö2ka yö2ká yö2kel yö2k1ék yö2kid yö2kí yö2ko yök1os yö2kó yö2kör yö2k1öss yö2ku yö2lők y1öltés y1öml y1ö2ná yön2gya yön2gyá yön2gyó yön2gy1öl y1önk y1önté y1önz yö2ra y1örd yö2rit yö2ro yö2ru yö2so y1össz y1ösv y1öszt y1ötl y1ö2töd. y1ö2töde y1ö2tödé y1ötp y1ött y1ötv yö2ve yö2vé yö2vi y1ö2vö y1ö2zön yőa2n yő1bl yőe2l yőe2r yő1fr yő1pr yő2ra y1ő2rei y1őrg y1őrl y1őrp y1őrszi y1ő2rül y1őrz yő2seg yő1str yősz2 yő2s3zár. yős3zs yő1szt yőzőkész1 ypen1n ype2te yp2la yp2le yp2lé yp2lu yponté2 yp2ra yp2re yp2ré yp2ri yp2rí yp2ro yp2ró y2prő yp2ru yp2sz yrádi2ón yrágás1 yrea2 yren2d1ő2 yreu2 ysa2van yság1g ys2ch ysé2g1e2l ysé2gés ys2ho ys2ka ys2ká ys2ki ys2la ys2lá ys2le ys2lu ys2mi ys2na ys2ni ys2pe ys2pi ys2po ys2pó ysp2r ys2ra ys2rá ys2rő ys2sa ys2sá ys2se y1s2tí y1s2to y1s2tó y1st2r y1s2tu y1s2tú ys2tü ysza2k1ü y2szaló y2száld yszáraz1 ysze2ra yszer2v1ó2 y1sz2f y1sz2k y1sz2l y1sz2m yszö2g1el y1sz2p y1sz2t y1sz2v yta2c yt1acé yta2n1é yta2n1ó2 ytá2l1é2 y2t1állá y2t1álló yt2raf yt2ran yt2rap y1t2rá y1t2re y1t2ré y1t2ri y1t2ro yt2rón yt2rö y1udv yu2g1á yu2ge y1ugr yu2gy yu2hu y1ujj yuj2j1a2da yu2kab yu2kar yu2k1aszá yu2k1ác yu2kál yuká2s yuk1ásá yu2k1e yu2k1ö yu2kő yuk1t2 yu2kű y1und y1u2ni y1u2no yu2rad yu2rai yu2rak yu2ral yu2ram yu2ras yu2rat y1u2rán y1u2ráv y1urn y1u2ru yu2sál yus3s yu2szá y1u2szo yu2tak yu2tal yu2tam yu2tat yu2taz yu2tál y1utc yu2tód y1u2tu y1u2tú yú1bl yú1br yú1gr y1újd y1ú2jé y1ú2jí y1újr y1újs yú2kel yú2k1es yú2ket yú2kev yú2kó yú2köl yú2l1ag yú2laj yú2lar yú2l1á2r yú2lát yú2l1eg yú2l1el yú2l1e2t yú2lin yú2l1is yúl2tag yú2lü yú2lű yú1pl yú1p2r y1úrb y1ú2ré. y1úrél y1ú2rév y1úrho y1ú2ri y1úrk y1úrnő y1úrr y1úrtó yú1sta yú2sü y1úszt y1útb yú2té. y1úth yúti2 yú2ti. yú2tig y1útj y1útk y1útm y1útn y1ú2ton y1útp y1útr y1úts y1útt y1útv yü2dü y1ü2gy yü2két yü2lá yü2led y1ülteté y1ünn yü2rí y1ü2rü y1ü2te y1ü2té y1ütk y1ü2tő y1ü2veg yü2völ y1ü2ze y1ü2zé y1üzl yű1bl yűé2n yű2g1ő yű1kl yű1pl y1űrb y1ű2ré. yű2réb yű2rén yű2rön y1űrr yű2sá yű2s1orra. yűs1s y1ű2zőb y1ű2zően y1ű2zőé y1ű2zőh y1ű2zők y1ű2zőn y1ű2zőr y1ű2zőt y1ű2zőv y2v1abr y2v1a2dó yva2d3z yvai2 y2v1akc y2v1alb y2v1alk y2v1ank y2v1ant yv1a2nya y2v1apo y2v1arz yva2s1u2 y2v1atk y2v1au y2v1azo yv1ábr yv1állo yv1állv yv1á2rai yv1á2rán y2v1áre y2v1árj y2v1árl yvárosi2b yv1árre y2v1á2ru y2v1árv y2v1áta y2v1áti y2v1átt yv1br yv1dr yv1e2gye yv1egys yv1e2kéb yv1ela y2v1e2lá y2v1ell y2v1elo y2v1elti y2v1ember yven3n y2v1e2p yve2r1a yve2r1á2 yve2reg yve2r1ész yve2rip yve2r1o yvert2 y2v1esszé y2v1eva y2v1e2vé yv1e2vő. y2v1ex yvezé2rel yvé2du yv1ékí yv1é2let y2v1élm y2v1élt y2v1ép y2v1érd y2v1é2ri y2v1érrő y2v1érté y2v1é2rü y2v1érze y2v1é2ve. yv1fr yv1gr yvigaz1 y2v1igé y2v1i2k y2v1ille y2v1im yv1ind y2vint y2v1i2p y2v1ism y2v1ist y2v1íg y2v1ín yví2zis yví2zü yv1kl yv1kr y2v1old y2v1olv y2v1or y2v1os yv1ó2r yv1öss y2v1ö2z yv1őr yv1pr yv1sk yv1sl yv1st yv1sz2 yv1tr y2v1ub y2v1ud y2v1ur y2v1u2t yv1új yv1út y2v1üg y2v1ü2z yza2t1a2l yza2t1e yza2t1érd yzá2r1ó2ra yzás3s yze2t1a2 yze2t1á yze2t1ér. yze2t1é2rő. yze2tés yze2téte yze2t1o yze2t1öl yzé2k1e2l yzőa2 yz2rí 2z. 1za 3zaba. zab2b1i2ko za2b1i2ga za1bre za1bri z1abro 2zabs za2ce za2c1ég za2cho zac1ikr za2c1im za2cipa za2c1iv za2cí zac1k2 zac3st za2dad 2zadag zad1alj za2dan za2data 2z1a2dato z1a2datr zadás1s zadi2a za2d1ír za2dóme za2dóz za1d2rá za2d1ut za2dzá za1fl za1f2r za2g1a2d za2gak za2ga2n zag1any za2gara za2g1a2t za2gau za2gág za2g1ál zag1árn zag1árt za2g1áz za2gel za2gés z1aggy 2zagi za2gin z1a2git za2g1osz zagren2 za2g1ü z1agy. z1a2gyak z1a2gyar z1agyb za2ijá zai2z 3zaj. 3zaja. za2j1a2d za2jan za2j1átv 3zajáv za2jes 3zajf za2jin 3zajj zajká2rok 3zajol za2j1or 2zajta 2zajtó. z1ajtók 2zajtót zaj1tr 3zajú za2j1ü2 2zakad za2k1a2dat. zakai2ko za2k1aka zak1alk za2k1alv za2kana za2k1ant za2kara z1akarat z1a2karás z1a2karó z1akarv za2k1atl za2k1á2p za2k1áta za2k1átl 2zakc z1akció za2k1e2g za2k1ele za2kelm za2k1eln za2k1elő za2ket za2k1é2l za2k1int za2k1i2p zak1iro za2k1ír zak1k2 za1klu 2z1aknák zak1oszt za2k1o2v za2kős za1krí 2zaktá 2zakti z1aktív 2zaktú zaku1p2 zaku2r zak1ura za2k1urá zakü2 za1kvó zal1acé zala2gá zalag1g 2zalakí za2lakj za2laku zala2n zal1any z1a2lapb za2lapj zal1átk zale2l zal1ele zal1ell zal1elő za2l1e2m z1algá z1alge za2lid z1alkal z1alkat z1alkot 2zalmás za2lól zalta2n zal2tel zal2tem z1alti za2m1a2d za2m1aj zam1ala za2m1a2p zama2t1ő2 za2maz 2z1ambu za2mem zam1ing za2m1is za2mí za2m1osz za2mü z1a2nal z1a2nek 2zang z1angy 2z1ankét zan2tes z1antil za2nya. z1a2nyag z1a2nyó zao2k zao2s zaó2h zaó2v z1a2pa. za2pad za2p1a2g z1a2pai za2p1ág z1a2pán za2p1ára z1a2pát z1a2páv zape2l zap1ele za2pem za2pes za2pí za1p2lán z1a2pó. z1a2póé z1a2pók 2zap1p2 zappa2ne zap3rof zap1s2 za2r1a2dá za2ran zar1a2nya zar1apa za2rar z1a2rái za2r1ál z1a2rány z1a2rár 2zarc z1arc. z1arca z1arcá z1arch z1arci z1arck z1arco z1arcú zare2t za2r1ete za2rev za2réna za2réná 2zarm za2r1ön za2r1ü zar2vág 2zarz za2sem za1s2ká za1s2ko za1s2li za1s2pó za1spr za2t1ab za2t1a2d za2t1aj zat1alap zat1alj zat1ana za2t1a2ny zat1ará zat1att za2tau za2taz za2t1áll zat1álo zatá2p zat1ápo za2t1árad za2t1áré za2t1á2ru za2t1elé zat1elk za2t1e2ré za2t1erk za2t1é2g za2tél zat1i2ko za2tim za2t1ind za2t1ing za2tins za2t1int za2t1ist za2tiz zat1k2 2z1atka. z1atlas zatmo1s zatmosz2 za2t1okos zat1olda 2zatomj zat1oml za2t1osz za2tök za2t1ön zat2rok za1trom zatt2 zat1tr za2tura za2tül za2tür 2zaty za2tya za2tyá za2ula za2ulá za2urá zau2tak z1a2uto z1autó zaü2t zaü2z za3vará 3zavarb 2zavat z1az. z1azh z1a2zo 1zá 2z1ábr zá2de zág1a2d zá2gak. zá2gako zá2g1al z1á2gas z1á2gat zá2gaz zág1azo zá2g1ál zá2g1á2rak zá2g1áru zá2g1e zá2gép zá2golta z1á2gói zá2g1út. zá2gü z1ágy. z1á2gya zágy1a2da z1ágyb z1ágyh z1ágyn z1ágyr z1á2gyu záí2r zá2j1ék zá2jí zá2j1ol zá2j1ös zá2jő zá2jü zá2jű zá2kin zá2k1ö2v zála2n zá2l1any zál1apr z1álar zál1assz z1álca z1álcá z1áldá zá2l1e2g zá2l1e2l zá2l1em zá2lib zá2lid zál1ing zá2lir z1állam z1állap z1álma z1álmá z1álmo zá2lob zálo2d zá2l1oda zá2los zá2lü zá2ly1a2l zá2mac zá2m1a2d zá2m1aj zá2m1a2l zám1any zá2m1a2p záma2r zám1ará zá2maz zá2m1átl zá2m1á2to zá2mél zá2m1é2rő zá2m1ik zá2mip zá2mir zám1orm zám1ors zá2mó zá2mö zá2mő zá2m1ut zá2mü zá2mű zá2naj zá2n1as zá2n1at zá2n1át zá2nem zá2nis zá2n1it zán3n zá2n1osz zán1sp zá2nü zány2 zá2p1ad zá2p1ag zá2p1orzó zá1p2r z1á2radd zá2r1a2dot zá2r1a2l z1á2ramk z1á2raml zára2n zá2r1any zá2r1ap zá2rar zá2r1ati zá2r1a2to zá2r1att zá2r1av zá2r1ál 3zárás. 3zárása 3zárásb 3zárási zárás1s zá2r1á2sz z1árbev 3zárdá zár2dem zár2d3z 2zá2r1em zá2réb 2zárf 2z1á2riá zá2rid zá2r1i2k zá2rim zá2r1is zá2r1iz zár1k2 3zárkák 2zárkö 3zárlat 2zárnö 2zárny zár2nyál zá2r1osz 3záró. 3záróa zá2r1óbo 3záród zár1óév zá2r1ó2rá zá2rő 2zárré zárs2 zár1sk zárt1anyá zár2t1es zárté2r zár1tro zá2rug z1á2ruh z1áruj 2zárunkn 2zárunkr zá2rü z1árvah zá2s1a2d zá2saj zá2sal zá2s1a2r zá2s1at zá2saz zá2s1á2g zá2s1árad zá2s1á2rá zá2s1á2ré zá2s1árh zá2s1árn zá2s1árt z1á2sás zá2sep zás1ikon zá2sis zá2s1í zá2s1ol z1á2só. zás1ó2r z1ásóv zá2sut zá2sü zá2s3zav 3zászl zász3se z1átad zát1a2dó. zát1a2dók zátá2r 2zátb 2z1átc z1átd zát1e2m zá2tél 2z1átf 2záth z1átha z1áthe zá1t2hi z1á2t1i2 2z1átj 2z1átm zá1tra zá1tro 2záts 2z1átv zá2z1ala záza2t zá2z1ato zá2z1e2 zá2zév zá2z1ol zá2zos zázó2 zá2zór zá2zö zá2zsaj zá2zsas záz4sá zá2zsál zá2zsol zba2ki zbeá2 zb2le zb2lo zb2lú zb2ri zb2ró zb2rú zc2lu zcsa2p1á2g zda1p2 zdas2 z2d1ass zd1áll zdés1s zdő1s2p zd2ri zd1u2r 1ze zea2d zea2g zea2k zea2l zea2s zeán2sze zeá2r zeá2z 2z1eb. 2zebe ze2be. ze2bei ze2bek z1e2béd z1ebf z1ebh z1ebk 2z1ebn ze1bru 2zece z1e2cet z1e2ch z1e2cset ze2d1ál. ze2d1álj ze2d1áln ze2d1ált ze2d1álv zede2r1e ze2dil ze2d1ó2 2z1e2dz zee2s z1eff ze1fr ze2g1a2l ze2gap ze2gar ze2g1ál ze2g1ár ze2g1eg zeg1ell ze2gep zeget2t1eb zeg1érr zegé2sz zeg1észb zeg1észé ze2gid ze2gil ze2gol ze2gú ze2gyed ze2gy1e2l ze2gyene ze2gyez z1egyl z1egys ze2het ze2ia zei2g zei2s zeí2r zekci2ósz zek1e2gy ze2k1ell z1e2kéit 2zekék ze2kil ze1k2lap ze2k1ott zek1övek ze2kő ze1k2reá zek1t2 ze2k1ü2lő z1ekviv ze2lag ze2lar ze2lál z1elbo 2zeledel z1e2lefá ze2leji 2zelekt ze2leme. ze2lemek zelem1el zele2m1ér. ze2lemű zele2pá zele2p1el zele2po zele2p1ü2l z1e2l1e2re ze2l1esz zele2tá zele2ter 2z1e2lég 2z1eléré zel1érh zelés1s z1elhá 2z1elhel 2z1elher ze2litet z1elkü 2z1elláto 2zellen z1ellene 2z1elnev z1elnö ze2lof z1e2los z1e2lö2l z1elön 2z1e2lőha zelő2saj z1e2lőző z1első z1eltá 2z1eltér 2z1elto 2z1eltű z1e2lu 2z1e2lú z1elv. z1elvek z1elves 2z1elvev z1elvez z1elvn z1elvt 2z1elvű z1elzá 2zema ze2mak ze2m1ág ze2m1ár ze2mát 2zember z1ember. z1emberb z1emberé z1emberh z1emberk z1embern z1emberr z1embert z1embl 2zeme. ze2m1egé 2zemei 2zemek ze2m1ell ze2m1eng 2zeméb 2zeméh ze2m1ék ze2m1éle ze2m1é2lé ze2m1é2lő ze2m1élt ze2m1élv ze2m1é2rét 2zemés zemé2te ze2m1éten ze2m1étet ze2m1étjé 2zemév ze2migr ze2m1ing ze2m1int ze2mis ze2m1iz ze2m1í 2zemk 2zeml 2zemmó ze2mol ze2m1osz ze2m1ó2 ze2m1ő 2zems z1emul zem1ur ze2mú 2zemü 2zemv zemvíz1 3zeneir 3zeneka zenesz2 3zenéé 3zenéi 3zenéj ze2nép zenké2 zenkét1 ze2n1o zen2tag zen2tal zen2t1an zen2t1as zente2g zen2t1egy zen2telm zen2t1ere zen2tev zen2t1é2j zen2t1imr zen2tip zen2tis zen2tí zen2tol zen2t1ó2 zen2t1ö zentő2s zen2t1őse 2zenz zeo2k zeo2m zeö2r 2zepééb 2zepééi 2zepéén 2zepéit 2z1epéj 2z1e2pém 2z1e2pés z1epiz ze1pla ze1ple 2zepr ze1p2ri ze1pró ze2r1a2d ze2rajá ze2r1ajt ze2rakr ze2r1al ze2ram ze2r1a2n ze2r1a2r ze2r1as ze2r1a2t ze2r1au ze2raz ze2r1ága ze2r1á2r ze2rás ze2r1á2t zer2bin zer1d2 z1erdé ze2r1eb ze2r1e2ce ze2redé ze2rege zer1e2ge. ze2r1e2gé ze2r1egg ze2r1egy z1e2reje zer1ejt z1e2rejü z1e2rejű ze2r1e2ke. z1e2rekl ze2relődj ze2r1ember ze2r1emi ze2r1eng zere2p1a ze2r1e2r ze2r1e2sés ze2r1essz ze2r1este zer1e2sze. zer1eszk ze2reszt ze2r1eu ze2r1e2v ze2rég ze2r1é2j ze2r1ék ze2r1é2l ze2r1ép zer1g2 ze2r1i2d ze2r1iga ze2r1iko ze2r1ill ze2r1i2m ze2r1ina ze2rind ze2r1inf ze2r1ing ze2r1inj ze2r1ink ze2r1intel ze2r1inté zer1intő ze2rio ze2rism ze2riz ze2r1í2j zer1k2 zer2nal ze2r1okt ze2r1old ze2rolv ze2ror ze2r1ost ze2r1osz ze2roti ze2r1ó2r ze2rök 2ze2rő z1erő. z1erőf z1erői z1erők z1eről z1erőn z1erős z1erőt z1erőv zer1őz zer1p2 zer1s zers2k zers2p zers2t zert1á2lom zer2tit zer2tór zer1tra zer1tren ze2r1un ze2rur ze2rus ze2r1u2t ze2r1út ze2r1ü2g 2zerű zer2v1a2dó zer2van zer2vel zer2vél 2z1e2sedék ze2s1e2kéh z1e2setb z1e2sete. z1esetes z1e2setet z1e2seté z1e2seti z1e2setr 2z1e2sés. 2z1e2sésb 2z1esésd 2z1e2sése. 2z1e2sései 2z1e2sések 2z1e2sésem 2z1e2sésen 2z1e2séses 2z1e2sésé 2z1e2sésh 2z1e2sési 2z1e2sésk 2z1e2sésn 2z1e2sésr 2z1e2séss 2z1e2sést ze2s1it ze1s2mi 2z1e2ső zesp2 ze1s2pe ze1spr 2zeste z1estek z1estem 2z1esté z1esti. ze1s2til 2z1estj ze1sto z1estre z1estt ze2s1ü2v ze2szág zesz1e2get ze2szelle ze2szeng ze2széh ze2sz1é2le ze2sz1im ze2szip 2zeszk z1eszkö ze2szol zeszt2 zesz1tr ze2t1ab ze2tac ze2t1ala ze2t1a2ny ze2táj ze2t1á2l ze2t1á2p ze2t1át zet1egé zet1elá ze2t1ell ze2telm ze2t1e2lőá ze2t1e2lőd ze2t1elr zet1emel ze2t1eml ze2tene zet1erk zet1e2ró zete2s1ég zetest2 zetes1tr z1e2teté ze2t1eti ze2tetn ze2t1éd ze2t1é2j ze2t1é2l ze2térte ze2t1érté zet1értő ze2t1é2rü zeté2sz zet1észe zet1éter ze2tid z1e2tika ze2t1i2ko zet1ill ze2t1ing ze2tít zetkész1e ze2tom zet1ont ze2top ze2t1ó2r ze2t1ö2v zet1őri zet1őrö zet1őrt ze2tut ze2tür ze2t1ü2z ze2ty zeu2g z1e2ur zeü2t z1e2vő ze2x1id ze2xim ze2x1i2p z1expe zex2t1ö ze2xú z1e2zer z1ezr 1zé z1é2ber 2z1ébr zé2dak zé2d1a2l zé2d1a2r zé2d1as zé2dat zé2d1á2 zé2d1ekét zé2d1e2lem zé2delm zéde2r1 zéd1esem zé2d1esz zé2d1eti zé2d1és zé2dik zé2dó zé2d1ő zédren2 zédu2 zé2dur zé2dú zé2d3z zé2fá z1ég. z1égb z1é2ge zé2gé z1é2gi z1égn z1é2gő z1égr z1égt z1é2he. z1é2hen 2z1é2hes z1é2het 2z1éhs 2zéid z1éj. zé2jen z1é2ji zéjje2l1e2 z1éjs 2z1éjül 2z1é2jün zé2k1a2d zé2k1a2l zé2k1a2n zé2k1ap zé2k1as zé2kás zé2k1eg zé2k1e2két zé2k1elr zé2ker z1é2kez zé2k1ék zé2k1é2l zé2k1és zék1old zék1osz zé2k1ó2 zé2kör zé2kúr zékü2l zé2k1ülé zé2k1ülő zéla2 zé2lab zé2lad zé2lak zé2l1an zé2las zé2l1á2 2zé2le2l zél1ele zél1ell zél1elő zél1elt zé2l1e2r 2zélet. 2z1é2letb 2z1é2lete. 2z1é2leten 2z1é2leté zé2letf 2z1é2leth 2z1é2leti 2z1é2letn 2z1é2letp 2z1é2letr 2z1é2lets 2z1é2lettő 2z1é2letü 2z1é2letű 2zélé zé2l1ékh zé2lim zé2l1ist zé2lí 2zélm zé2l1o zé2l1ö2 2zélős 2zélt zé2l1u2 zé2lú zé2lya zé2lyá zé2ly1esh zé2lyo 2zéme zé2n1árn zéndio2 zé2neg 2z1é2nekb 2z1é2neke z1é2neké zé2nekk 2zénekl z1é2nekn zé2nekr zé2nekü zé2n1e2l zé2n1e2r zéni2 zé2nik zé2nil zé2nim zé2n1io zé2n1is zé2ní zé2nom zé2nö zé2nő zént2 zé2n1ü2lő zé2p1a2g zé2p1a2l zé2p1any zé2p1a2p zé2p1a2r zé2pas zé2pat zé2pau zé2pav zé2p1á2r zé2pát zé2peg zép1ell zé2pez zép1f2 zé2pin zé2p1i2p zé2pir zé2p1i2s 2zépít zépo2 zé2pol zé2pos zé2pó zé2pö zép1s zé2pud zé2p1us zé2pú 2zépül zé2rab zé2rag zé2r1a2l z1é2ram zé2r1a2n zé2rap zé2rar zé2r1as zé2rat zé2rav zé2r1á2 zér1d2 zé2r1e2lemé zé2r1e2lemk zé2r1e2lemn zé2remb zér1eml zé2r1esz 2zérett zé2rev zé2rés. zé2résb zé2rése zé2rési zé2résk zé2résn zé2r1id zé2rim zé2ris zé2r1o2k zé2r1os 3zérós zé2rö 2z1é2rő. z1é2rői z1é2rők zé2rős z1é2rőt zér1s zér2taj 2zértekez 2zértelm 2z1értetl 2z1értető 2z1érték 2z1érthet z1érto zé2rú zé2sab zé2san zé2sar zé2s1az zé2s1á2 zé2seg zé2s1e2l zé2s1e2r zé2s1eti zé2s1ég zé2sés zé2s1i2k zé2sok zé2só zés3s zé2s1ü2t zé2s3za z1észb z1é2szé z1észl zé2szó zés3zs zé2t1a2b zé2t1ad zé2tag zé2t1aj zé2t1a2k zé2t1a2l zé2t1ap zé2t1a2s zé2t1au zé2t1á2 zéte2n zéte2se zéte2sü zé2tég zé2t1é2n zé2t1i2 2zétk zé2tol zé2t1o2m zé2tor zé2t1o2s zé2tun zé2tú zé2t1ü2 zé2t1ű 2zétv 2z1év. 2z1évad z1évb 2z1é2ve. 2z1é2vek 2z1é2ven 2z1é2ves z1é2vén z1é2vét z1é2vév z1évf 2zévi z1é2vi. z1évk 2z1évn z1évr z1évs z1évt z1é2vü 2z1évv zfa2l1a2da zfa2l1aj zfa2l1e2l zfa2les zfe2l1em zfe2len zfe2reg zf2la zf2le zf2li zf2lo zf2ló zfora2 zfo2rat zfo2riz zföldié2 zf2ra zf2rá zf2re zf2ri zf2rí zf2ro zf2rö zgás3s zgá2s3z zgá2zó zgé2p1e2két zgé2sa zgé2sá zgé2sem zgés3s zg2la zg2ló zgó1g2 zgő2nyá zgő2z1á2 zgő2zér zgő2z1ő z1g2ra z1g2ráf. z1g2ráff z1g2ráfh z1g2ráfj z1g2ráfk z1g2ráfn z1g2ráfr zg2ró z1g2ru zhán2 zhá2t1a2d zházköz1 1zi zi2aa zi2aá zi2abo zi2ac zi2ad zi2ae zi2aé zi2ag zi2ah zi2aí zi2aj zi2akép zi2akó zi2al zi2am zi2ao zi2aö zi2a1p2 zi2ar zi2asza zi2aszo zi2aszó zi2at zi2au2 zi2aú zi2aü zi2av 2z1ibr 2zicc zi1ch z1i2deá z1i2deg z1i2deo zi2dén 2z1i2dő zie2l zie2m zi2éa zi2éá zi2éke zi2ép zi2éta zi2étá zi2éü z1ifj z2ig. zi2ga. 2z1igazg 2z1i2gazo z1i2gás zi2géj 2z1i2gén zi1g2r 2zigye zi2k1a2n zik1ékek zi2kik zi2kim zi2k1ing zi1klu zi2k1u2r zikus1s zi2ler zi2l1é2j zi2l1ék zi2l1ing zi2l1ü z1i2ma. zi2mak zi2máb zi2máj zi2mák zim1áll zi2már zi2mát zi2máz zim1b zi2m1e2g zi2m1e2l zi2m1é2ré zi2m1érté zim1ind zi2m1ip z1i2mit zi2mö zi2n1a2d zi2n1a2l zi2n1a2n zi2n1a2r 2z1i2nas zi2n1au zi2nái zi2n1áll z1indu zin1emb zi2nég zin2gas zin2gál zi2n1i2m zi2n1in zi2ní zin3n zi2nol zin1s2 zin2t1a2d zin2t1a2l zin2t1a2s zin2tát zin2t1á2z zinte2l zin2t1ele zin2telő zin2telt z1interj z1interp z1interv zin2tom zin2t1ón zi2n1u2t zi2nú zi2ol 2z1i2ono 2z1i2ons zi2ot zi2óa zi2óá zi2óc zi2óe zi2óg zi2óí zi2ókam zi2ókap zi2óká zi2óke zi2ó1kl zi2ól zi2ómá zi2ómé zi2óné zi2óny zi2óo zi2ó1p2 zi2órá zi2ósá zi2ósé zi2ó1s2ká zi2ó1sp zi2ószű zi2óta zi2ótá zi2óú zi2óü zi2óű zi2pai zi2pari zi2páj zi1p2l zi1p2r z1i2rat 2zirá z1i2rán z2i3re 2ziro z1i2rod zi2rón z2i3rő 2zirt zir2t1a2 z1irtá zir2to z1irtó zi2sad zi2sal zi2sam zi2sar zi2s1a2s zi2sál zi2s1áro zi2s1e2g zi2s1e2l zi2s1er zise2s zi2s1ese zi2s1esz zi2s1ék zi2sérte zis1évi zi2s1il zi2sin zi2s1is zi2sit zi2s1o2v zi2s1ó2 zi2sö zi2ső ziss2 zis3sza zis3szá zis3szo zist2 zis1tra zis1tre zi2sut zi2s1ü2v zi2s3zaj zis3zav zis3zón zi2t1áll zit1áru zi2t1e2g zi2t1elr zit1eng zi2tét zi2til zi2tin zi2tip zi2tir zi2t1or zitó2 zi2tór zi2t1út ziú2r z1i2vad 2z1i2vó 2z1i2zé 2zizm z1izmo z1i2zom 1zí zí2gé zí2jan zí2je zí2jö zí2jü zí2nac zí2nad zí2naku zí2nal zí2nan zí2nas zí2nat zí2n1áll zí2n1ár zí2nát zí2n1e2r zí2nél zí2ní z1ínna zín3nye zíno2 zí2n1od zí2n1ok zí2nos zí2n1ó2 zí2nö zí2nu zí2nú z1í2ny zínyenc1 zí2r1a 2z1í2rá zí2rog 2z1í2ró zítőa2 zítőe2 zítőkész1 zí2vaj zív1akt zí2val zí2var zí2ver zí2v1ő zí2vul zí2vú zí2ze zí2zü zí2zű zje2gy1á2 z2k1abl z2k1alak z2k1alj z2k1alt zka1p2l z2k1a2rád z2k1a2ráj z2k1a2rén zkaró2 zka2rór zka1s2k z2k1állv zk1bl zk1dr zk1egys z2kenn zk1eszk z2k1etű z2k1ér. z2k1érté z1k2hü zkia2 zkiá2 zkie2 zki2g z2k1igé zki2sé zk2la z1k2lá zk2ler z1k2lí zk2ló z1k2lu z2k1olda zkon2t1ár z2k1ontó zko2r1os z2k1oszl z3koszt z2kókor zk1ókort zkó2pá zkó2z3s zkö2zele zköz1ell zkö2z1é2l zkőé2h zk1pr z1k2rak zk2rá z1k2reá z1k2rém z1k2réta z1k2rétá zk2rí z1k2ro z1k2rón zkultú3 zkultúr2 z2k1u2rán z2k1u2rát. z2k1utá z1k2val zk2vó zky2b zky2h zky2j zky2k zky2n zky2r zky2t zky2v zla2tal zlata2n zlat1any zlá2m1e zlá2mis zlás3s z2láv. z2láve z2lávé z2lávk z2lávn z2lávo z2lávv zleg1g zlei2 zleí2 z2leng. zle2tak zle2tal zle2t1a2n zle2tál zle2t1á2r zle2t1eg zle2t1ell zle2tesz zle2tél zle2t1ér. zlet1érv zle2tés zle2t1é2té zle2t1é2ve. zletigaz1 zle2t1u zle2tüz zlé2sí zlé2so zlés3s zlina2 zli2nan zli2nin z2loge zlo2p1as zlo2pó zlóó2 zló2s1orr zma1pr zmas2 zma1sp zmeá2 zme2ge zme3gom zmi2n1a2 zmi2n1e zmuskész1 zmu2sö zmu2s3z zmu2tok zna2pes znie2 zni2ó z2nob znó1str znót2 znó1tr 1zo z1obj z1o2dú zo2es z1o2ka. z1o2k1a2d z1o2kai zo2k1ál zoki2 zo2k1ip z1o2k1ir z1okke z1okle 2z1o2koz 2zokta zo2lab 2z1o2laj zolajá2 zola2j1ár zola2je zo2l1a2l zo2l1as zol1ábr zo2l1áro z1oldal 2z1oldh 2z1oldó zo2l1e zol1f2 zol1inf zo2l1is zo2l1í z1olló zo2lö z1oltás z1oltó. zol1t2re zo2lü 2zolvad zo2m1a2g zo2mak zo2m1a2l zo2m1a2n zo2map zo2m1a2s zom1áll zo2m1á2r zom1b2 3zombor. 2zome zo2meg zo2m1el zo2men 2zomé zo2mél zomé2t zo2m1éte 2zomf 2zomg zomi2 zo2min zo2miz zom2jó 2zoml zo2m1ors zo2m1os 2zo2mö 2zom1p2 2zom1s 2zomz zo2n1aj zo2n1ak zo2n1a2la zo2n1alá zo2n1alk zona2n zo2n1any zo2n1a2r zon1asz zo2n1au zo2náld zo2n1áll zo2n1átl zone2 zo2neg zo2nel zo2n1er zo2nes zo2név zo2nin zo2n1i2o zo2n1or zono2sé zo2n1ó2 zo2nö zon1s2 zon2t1es zon2tin zon1tre zo2nü zo2ny1ad zo2ny1a2l zo2ny1a2n zo2nyar zo2nyav zo2nye zo2nyid zo2nyij zo2nyó zo2ol zo2om z1opál z1o2pe zo1pho zo2r1a2d zo2raf zo2r1ag zo2r1aj zo2r1a2l zo2ran zo2r1as z1o2rat zo2r1au zo2r1e2 zor1f2 zo2rid zo2r1il zor1ing z1ormá zo2r1ol zo2rop zo2rosz zo2r1ó2 zo2rö z1orr. z1orrú z1orsó zor1t2re zo2rü 2z1osko z1ostá z1osto zo1sz2f z1oszl zosz2tat 2zote 2zotó zotó2pa zo2vi zo2xi 1zó zóa2d zóá2g zóá2r zó1bl zó1b2r zó1cl zó2d1e2l zó1fl zó1f2r zó1gl zógyö2k1ér zói2g zóí2v zója1 zó1k2l zó1kré zókupac1 2zól. z1ólm zó2lomb 3zónád 3zónái z1ó2ni 2z1ónj 2z1ónn z1ó2nod 2z1ónt zóó2r zó1p2l zó1p2r z1ó2rad z1ó2rar zó2rasz zó2rái z1ó2ráj z1ó2rák z1ó2rár zórás1s z1ó2rát z1ó2ráv z1ó2riá zós1ík. zó2s1ín. zó1s2ká zó1sl zó1s2ta zó1sté zósz1akad zósz1állí zó2szene zó2sz1é2le zó2sz1íj zósz1ü2lő. zóta2g1a2 zóté2g zót1ége zó1tré z1ó2vó 1zö zö2bá zö2bo zö2bó z1öcc zö2dé zö2dú zö2ga zö2gá zög3g zö2gil zö2gí zö2go zögö2 zö2g1öl zö2gu zö2gy 2z1ökl 2z1ö2ko 2zökrü 3zöldes 3zölds 2zöleb zö2les 2z1ölniv z1ölyv 2z1öml z1ö2na z1ö2ná 2zönb 2zöne 2zöné 2zöni 2zönl 2zönne 2zönö 2zönr 2zönt 3zörej zör2f1e zör2f1o zör2nya zör2nyá zör2nyel zör2nyesz zör2nyék zör2nyí zö2rök zör2p1a2 zör2pá 2z1örv 2zössz z1ösv z1ösztö zö2te 2z1ötl 2z1ötv z1öv. z1ö2vei z1ö2vek zöve2t1e2l z1ö2vez zö2zö 1ző zőa2c zőa2l zőá2g ző1bl ző1br zőé2l ző1fl ző1f2r zőgépi2 zőgé2p1ip ző1gr ző1kl zőmű1 zőnyá2 ző2ny1er ző2ny1é2k ző2nyért ző1pl ző1pr ző2ran ző2r1e2c ző2r1ege ző2rel ző2r1er 2zőrk 2zőrl z1őrlő 2zőrm ző2rol 2zőrü ző2r1ü2g 2zőrz z1őrzé z1őrző ző2sis ző1ská ző1spe ző1s2pi ző1sta ző1sti ző1str zősz2 ző1szf ző1szt ző1tr zőü2l zpen1n zp2fe zp2la zp2lé zp2lo zpor2t1e2 zpor2t1ő2 zpor2t1ú z1p2ra z1p2ri z1p2ro z1p2ru zrae3le zrádiói2t zre2d1á2 zre2del zre2d1é2k zre2d3z zren2d1ő2 3z2rí. z2s 1zsa zs1abla 2zs1a2dat 2zs1a2dó zsag2 2zsah. 2zsajt 2zs1akc 2zs1alj 2zs1alm 2zs1alt zsa2nyá zsa2pa. 2z3sapk zsa2rán z3sarj 2z3sark 2z3sarl 2zs1arz 2zs1aszt zs1atl zsa1tr 2zs1a2ty 2zsautó. 2zsautón zs1azo 1zsá 2zs1ábr 2z3sáf 2z3ság zs1ággy zsá2kó 2zs1ála 2zsálc 2zsálm 2zs1á2p 2zs1á2rak 2zsárat 2z3sári 2zsáru 2zsáte 2zs1átk 2zsáto 2zsátö 2zs1áts 2zs1á2zós zs1bl zs1br z3s2ch zscsapá2 zsde1s zs1dr 1zse zse2ba zse2biro zse2b1o2 2zsebz zs1e2ce zs1e2dé z3sej 2zsell zs1elm 2zselö zs1e2lőf zs1e2lőr 2zsember 2zs1e2mel zs1enc zs1ene zse2raj zse2r1á2 zse2rel zsere2s zse2r1esz zse2r1ék zse2rin zse2r1o 2zsese zse2szü zs1evé 2zs1ex 2zsez 1zsé z3ség zsé2ge2l 2zséhs 2zsél zs1éle 2zsép 2zs1érd 2zs1érte 2zs1érté 3zséry 2zsérz 2zséte 2zs1étk 2zs1étr 2zs1étt 2zs1é2ve. zs1fl zs1fr zs1gr 1zsi 2zsidő 2zsigá 2zsigé zsi2kor 2zs1ill 2zs1i2má zsi2min zsi2m1u 2zsinas zs1i2pa z3sipk 2zsirat zs1irato 2zs1iro 2zs1irt 2zs1ism 2zsist zsi2tat 2zsivó zs1izé 2zs1izm 2zs1i2zo zs1izz 1zsí 2z3síb zs1íj 2z3sík 2z3síp zsí2r1a2 zsí2rá2 3zsírbó 3zsíré 3zsíros 3zsírr 3zsírt2 2zs1í2v 2zs1í2z zs1kl zs1k2r 1zso 2z3sof 2zs1okm 2zs1okta 2zsolaj zs1oli 3zsom 2zs1op 2zsor z3soro 2zsosty 2zs1osz 1zsó zs1óné zs1órá 1zsö 2zsökör 2zsölőz 2zs1ös zs1ö2ve 1zső zs2pir zs1p2l zsp2r zs1s2k zs1s2p zs1st zs3sz zssze2r1e2l z3s2tad z3s2tat z3s2top zst2r zs1tro z3s2tú 1zsu 2zs1ud 2zsugár. 2zsugárr 2zsugr 3zsul 2zsum zsu1s zsusz2 1zsú 2zs1új 2zsúl zsú2r1a 1zsü 2zsüg 2zsült 2zsünn zs1üs 2zsüt 2zs1üz 1zsű zs1wh zs3zac z3szag zsza2ké zsza2k1ü z3szav zs3záp zs3zás z3szem zs3zené z3szer z3szé zsz2f z3szi zszind2 z3szí z3sz2k zsz2l z3szo z3szó z3szö zsz2p zs3zs zsz2t2 z3szü z3szű zt1abla z2t1a2bor z2t1a2cé z2ta2dal zt1a2dat zt1a2dó z2t1agre z2t1a2ká z2t1akc z2t1akk zt1akn ztaköz1 z2t1akv zt1a2lapú ztale2l zta2lele z2t1anal ztan2e zt1anes zt1anké zta2n1ó2 zt1a2nyag zt1anyak zt1anyas zt1anyád zt1anyám zt1anyáu z2t1anyu zt1a2pán zt1a2pás zt1a2pát z2t1apó zt1app z2t1aps zt1a2puk z2t1a2ra. zt1arán z2t1arc ztaso2 zta1sp zt1assz z2taszt zt1aszta z2tatig z2t1atk z2t1aty z2t1a2ut zt1ábr ztá2cs zt1ácso zt1ág. z2t1á2ga z2táli z2t1álm ztá2raj ztá2r1ass zt1árem ztá2ris z2t1árnö zt1árnya z2tároc z2tárokk ztá2r1olt ztá2r1óra ztár1sm ztár1s2p ztárt2 zt1árví ztá2sz zt1ászo zt1ászt z2t1átha z2t1áts z2t1átv ztávi2 ztá2v1ir zt1bl zt1dr z2t1e2b z2t1ef z2t1e2gé z2t1egy z2t1e2ke. z2t1e2kés z2t1ela z2t1elá z2t1elb z2t1e2legy z2t1e2leme z2t1e2lemm z2telemz z2t1elf z2t1eljá z2t1ellát z2t1elm z2telnö z2t1e2lo zt1e2lőadá z2t1e2lőc z2t1elr z2t1eltá z2t1elto z2t1ember z2t1e2mel z2t1eml z2tent zt1ente zte2raj zte2rak zte2rál zte2rár z2terde ztere2ot zte2repo zte2rill zte2ris zte2riz zte2rosz z2t1e2rot z2t1e2ró z2t1erő zte2r1ü2lé zte2sz z2t1esze z2t1eszé z2t1eszk z2t1ezr zt1ég. zt1égb zt1é2gé zt1égr z2t1é2j zté2k1e2l z2t1ékné z2t1é2le z2télé zt1é2lés z2t1élm z2t1é2lő z2t1élt zt1élű z2t1épü zté2rá z2t1érd z2t1érl z2t1érté z2t1érz zté2sz z2t1észh z2t1észn zté2tét z2t1étk zt1é2ves. zt1évt zt1fl zt1fr zt1gr z1t2hen ztia2g zt1i2den z2t1idé z2tidi z2t1ifj z2t1i2gé z2t1i2kon z2t1ille z2timá z2t1imp z2t1ind z2tinfe z2t1info z2t1ing. z2t1ingá z2t1ingb z2t1inge z2t1ingé z2t1ingg z2tingu z2t1inte z2t1inté z2t1invá zti2p z2t1ipa z2t1irá z2t1isk z2t1ism z2t1istá z2t1iste z2tital z2t1i2tat z2t1íj z2t1í2r zt1í2veke zt1kl zt1kr zt1kv z2toi z2t1o2koz z2t1oltó zto2lyag zt1ope zto2ras zto2r1e z2t1orgi ztorkész1 zt1ornam z2torrú z2torvo z2t1oszl zt1osztá ztóá2 ztóigaz1 z2t1ó2ni ztó1p2 ztó1sp ztó1tr zt1öko ztö2l z2t1öle ztön3n ztö2röks z2t1öss zt1ö2vez zt1övig z2t1öz ztőa2 ztőe2l ztőé2b z2t1őrh zt1őrl z2t1őrs zt1ő2sei z2t1ő2sö zt1ősű zt1pl zt1pr zt1ps z1tranz zt2rádá z1t2rág z1tréf z1t2rén z1trikó z1tril z1t2rió z1t2rü zt1sl zt1sn zt1sp zt1st zt1sz zt1t2r z2t1udv z2t1ug z2t1ura z2t1uru ztus3s zt1u2tat z2t1utu z2t1új z2t1úr. z2t1úrb z2t1ú2ré z2t1úrh z2t1ú2ri z2t1úrk z2t1úrn z2t1ú2ro z2t1úrr z2t1úrt z2t1üg ztü2lé z2t1ülés ztül1l z2t1üt z2t1ü2v zt1ü2zem z2t1űr. z2t1ű2ri z2tye 1zu zu2b1a 3zubb zu2b1i zu2bu zu2c3s 3zug. zu2gag zu2gap zu2gáru zu2g1ás 3zugb zu2g1e2 zu2gé zu2gin zu2git zu2giv zu2gí 3zugo zu2g1or zu2gö zu2gü zu2gű 3zuha zule2 zu2lel zu2l1enc zu2l1es zuli2ná zu2lú zulya2 zu2ly1ag zu2mab zu2m1a2d zu2maj zu2mal zu2mar zu2m1as zume2 zumegyez1 zu2mel zu2m1en zu2mél zu2m1é2n zu2m1id zu2m1in zu2m1i2p zu2mí zumkész1 zu2mol zu2mő zu2mur zu2mü 2zund z1undo zu2ne zu2n1é 2zuni zu2n1ö2 zu2ral zu2ram zurat2 2z1urn zu2rú zu2sad zus1aka zu2sal zusa2n zus1any zu2sas zu2s1ág zu2s1e2 zu2s1érté zu2sis zu2s1í zuskész1 zu2s1ol zu2s1ó2 zu2ső zuss2 zussz2 zus3sze zus3szi zust2 zus1tr zu2s1ü2 zu2sz1i2k zu2szon zu2s3zó 2z1u2ta z1u2tá 2z1utc zu2tol zu2tó. zu2tób zu2tói zu2tój zu2tón z1u2tu 1zú zú1dr zú1fl 3zúgá z1újd z1ú2jé z1ú2jí z1újs zú2r1e2 zúré2t z1ú2szás zú2té. z1ú2tér z1úth z1úti zú2ti. zú2tiak. 3z2útiaka zú2tiakr zú2tib zú2tig zú2tih zú2tin zú2tiv z1ú2tí z1útj z1útn z1ú2ton z1útró z1útt zú2tü z1útv 3zúzá 3zúzd 3zúzó 1zü zü2dü zügy1és z1ügyk z1üldö z1ü2lep z1ü2lőseb z1ü2lőset zü2ni 2zünn zü2rí z1ü2rü z1ü2te z1ü2té z1ütk z1ü2tő zü2ve zü2vö zü2zen z1üzl 1zű zű2csa zű2csá zű2csip zű2cs1o zű2ra zű2rá zűrés3s zű2r1i2z z1űrla zű2ró zű2ru zű2z1a2 zű2z1á zű2ze zűzé2r zű2z1ére zű2zo z1ű2ző zű2zs zű2zú zva2su zvárosé2 zváro2s1om zve2gya zvé2nyel z2vit. zvi2tác z2vitj zy1ak z1yar zy2be zy2je zy2ne zy2né zy2re zy2rő zy2sa zy2so zy2tő zy2ve z2z1áll zzá2r1ó2r zzát2 zzá1tr zzi2n1é2 zz2le zz1ly z2zs z3zsák z3zsám z3zsi z3zsí z3zso",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=62812,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-hu.rme b/Master/texmf-dist/tex/context/patterns/lang-hu.rme
index 049dfe06a44..29530abc642 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-hu.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-hu.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Hungarian Hyphenation Patterns (v20031107)
+
+(more info about the licence to be added later)
+
% Huhyphn - hungarian hyphenation patterns v20081106
%
% Copyright (C) 2003-2008, Bence Nagy <nagybence@tipogral.hu>
@@ -8,4 +12,4 @@
%
% Encoding: UTF8
%
-\message{Huhyphn - hungarian hyphenation patterns v20081106} \ No newline at end of file
+\message{Huhyphn - hungarian hyphenation patterns v20081106}
diff --git a/Master/texmf-dist/tex/context/patterns/lang-is.lua b/Master/texmf-dist/tex/context/patterns/lang-is.lua
new file mode 100644
index 00000000000..44a293b140a
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-is.lua
@@ -0,0 +1,100 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="is",
+ ["source"]="hyph-is",
+ ["texcomment"]="% Icelandic Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: icehyph.tex (2004-03-08)\
+% Author: Jorgen Pind <jorgen at lexis.hi.is>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% The Icelandic Plain TeX hyphenation tables\
+% as of Nov 2 1988.\
+% Jorgen Pind, Institute of Lexicography, Univ. of Iceland\
+% jorgen@lexis.hi.is (Internet)\
+%\
+% Mar 2 2004: Uploaded a new version to CTAN, with a clarified license \
+% statement, at the request of the author, Jorgen Pind.\
+% Kristinn Gylfason (kristgy@ieee.org)\
+% \
+% This file may be distributed and/or modified under the \
+% conditions of the LaTeX Project Public License, either version 1.2 \
+% of this license or (at your option) any later version. \
+% The latest version of this license is in \
+% http://www.latex-project.org/lppl.txt \
+% and version 1.2 or later is part of all distributions of LaTeX \
+% version 1999/12/01 or later.\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyzáæéíðóöúýþ",
+ ["data"]=".að3 .aða4 .aðk2 .aðl4a .af3n .af3re .afr3í .af1s4 .agn5ú .al3e .al4l .am4s .an3k .ann4e .ar2 .ar3a4b5 .arth5 .asp3 .aum5a .ám4 .án4a .ba4 .da4 .dam5a .dav3 .dr4 .ds4 .du4 .dust5 .ed5ik .eftir5 .eigin5g .eink4 .ekt4 .er4m .eyf2 .fa4 .fi4 .fjár3 .fl4 .fla4 .fr4 .frá1 .ga2 .gar4 .gas5l .gd4 .gem5 .gja2 .gl2 .gr4 .gu4 .her5sk .il4 .ingj5 .is4m .ís1l .ja2 .jar4 .ka4 .kal5e .kam5e .kapí3 .kart5 .kast3 .kn4 .kr4 .kur4 .la4 .lag5e .leik5sv .líb5 .lu4 .ma2 .maj5 .mak5r .mi4 .mj4 .mu4 .mynst4 .na2 .ní5f .ný5f .ol4íu. .óa4 .óð5al .óf4 .óg2 .ók4 .óm4i .ós2 .pa4 .pl4 .ra2 .ram4 .rí4 .róð4 .rúm3 .saman5 .sk4 .ski4 .skj4 .skr4 .sl2 .sm4 .smá3l .sn4 .snar5a .sp4 .spr4 .st4 .sta2 .ta4 .ti2 .til3 .tí5f .tr4 .tu2 .tví1 .ung3l .unn5usta .úr1 .út1 .út5s .vegg5s .vist3 .yfir3 .ævi3s .öfl3 .ögr5 .ör3s .öt3u 2a3a4 a4ab a4ad 2a1á2 2a1b ab4a 3abís a5by abæk4l 4ac 2a1d4 a5dó a4du 1að 4aðað að3al að3ar 2aðfa 4aðfö að3g að3i 2aðl að4li 4að2m 2aðsh 3aðu. 2aðv 2a1e a5ei a4es 2af af3ald af3arn a3fá af4fr af3g a1fj a3fló a1flu af5ork a1fr af3ré afr4u a5fræ 4afsd af1sk 4afsso af2u a1ful a1fun 3afurð 2ag a3gau ag5ál ag5is a5gj agn4ara ag2ne ag5ot a1gr ag4ra ags4ið ag4sp ag4stj ag4ul ag3æð 4a1h 4ai a3ið a4in aí4h 2aj a3jö 2ak akaup4s a5ká a1ke a5kinnin a5kistu a1kj ak5rei aks4l 4akss ak3u a3kv a5ky a5ký a3kö 2al a1lag 4aland a5landið a5landinu alas4 alá4 a4lem al3er al1f al1g 5alge 3alh alis4 al4ín al3kj alk5s al3k2u al4lí all2s allst4 al4lý 4almað al5mann al5m2i a3log a5lok al5op a5lóð al4sæt al5up al5ú al3v4 a3ly a1læ a1lö 2am am3ang a3mann am3ari am3ars am3a4s am3dr a3mí am3k am2m amm4is a1mó am3se ams2i am1t 1an 3an. 3ana. an3ada 4anag 2anal 4anau 2aná 4and. and1e 4an4dí andr4 4andö 4ane an5ei 2ang an4ga ang1d an4gj ang5spi an2g3ö 4anib 4anið an5ín 2ank ank5l ank3v 3anm ann5d 4annf 4annh ann1k 4annl 4anns annsk4 4an4o anst4 an3sti an3tí 3anu 4anú 4aný 4anæ 4anö 2a3o 2a3ó 2ap ap3al a3per a3pil a3po a5pre ap3te a5p4un a5pör 1ar 3ar. ar3afu ara5kr ar3ang 4arani ar4arp ar2as ar5ast. ar3au 2ará4 4aráð 5ar3ák 3ar3ár 3ar1ás ar1át 3ard2 4ardí 4arð. arðar5á 4arði 4arðs 3arðu. 2are 3ar1ef 4aref. 5areig 5arein a3rek ar3el ar3en ar5er a3ret 4a1ré 2arf 3arfe 3arfé arfs3k ar1fu ar3gj ar4græ args4 arg3sl 4ar5ið 4arif ar3in ar4ind ar5ist. 4a5rit 4a1rí ar3j4 4ark. ark4is ar5kj ar3kr4 4arms ar3mú 4arna. 4aroð 4arol 4arot 2aró 2arp 4arra arr2i arr4u ar4sá 3arse ar1sk ar4spi arst4 5arstí ar3su ar5til artr2 ar5trað ar3u ar4uð 4ar4ug 5arum 2ar1ú a5rús ar3v4 ar3yf 4arý 2aræ a3ræð ar5æv 4arö as2 4a1sa as3an 2a3sá 4ase 4asé 2asi a5sinna 2asj 4a1sk 2asl a3slag 2a1sm 4asn 4aso 4asó 2asp aspít4 4ass ass4v 1ast 4astað ast4and 4astau 4aste 4asté 4astig 4astin ast4ing 4astirð 4a1stí 4astj ast3l 4asto 2astó 4astrá ast5ráð 4astrí 4a3stræ 4aströ 4astul 4a3st4un 4astú 4a3sty 4astæ 4astö 2a1su 2a1sv 4as4y 2asý 4asæ 2asö 2at at3að a3tak a3tal at4anv ata4r a1te at3ey 3ath a1til a3tj 3atk atns3 a4tó atr4a at1re 3at1ri at2sp a5t2un a1tú at4ve 3atvi a1tö 2a4u2 4auð. auð5li 5auðn aug4as au4m aum5ba aum5un aun5dr aup5e aup3l a5upp au4s ausa5m au4t 2a1ú 2a1v av4ar. a3vir 2ay a5yf 4az 2a1þ a2þó 2a3æ 4a5ö á1a áak4 áa5lo á1b á4bu á1d4 4áð áð2s áð3sn áð3sta áð2u áð3us á1e áf2 á5fá á5fí á3fl áflæð4 áf5un ág2i ágl4 ágr2 ág1s ág3v á1h á1i ák2a ákam4 ákap4 ákó4 ála3m ál3arf ál2as á5lau á3let álf3d4 álf5sk ál4m álm5an álm5u álp3 ál4se ál5sva ál5ug á5lú ál3æð 2ám ámál5a ámsl4 á2n án4aro án2as án4o á3ný 5ánæ á3o 4áp ára5g ár3an árar4 á5ré ár3f4 ár5g ár5k4 ár1m árns4 árn5sl ár2st ár5t ár1u ár3v á5ræ ás5en á1sk á2ska á4ske á3s4l ás2m ást2 ást5i ást5ráð ást5rík ást5v 4ásu4 ás5va át3að á1te átr4as áttar3 5áttin. átt3un á1tæ á1u áuk4 á3ve á3ví á1væ á1þ á5æð b2a 4ba. baðk4 ba4h bak5sl ba2n 4bana 4baní bank5an 4bans b5ant bar2b barð4as bar2n bá4s 2b4b bb3að bb3an bb5arn bb3i bb3uð 1be bess4 b2i2 bið5i bið5lis bið5r4 bif1 bilj5 bill5 4binn bisk3 b4it bit2a 4bía 2b3ís 2b3íu 3bj bjar2 b4l2 bl4íunn 4bn 5bo 3bó4 bók3s b4r2 br5að bra4s 3bro br4u 3brú 4bum4 bur2 3burð burst5að bu4s 1bú búf4 bú3sta 1by 1bý bæk2i bæn4a 1bær b5ættism 1bö 4böki c4a ci4 ck4 4da. daf4 dak2 3dal. 5dals da1m4 d5ang d4aní d4arad d4ar4að dar4ár d3arf d5arp dask4 da3sl 4dav d1b 2dd 4dea d5ef 3deg 1deil d1en d5eó 5dep d1f4 d1g2 d4gi d1h d1i di5fu d3ill dim4 di3ma di3nav d2ine dir3s dí3d d5íð d5ínu 3dís dív3 3dj4 djarf5a d1k2 d1l2 d2la dl3að d3lag d3lau d4lið dl3u d1m d5olf d5óð d3óf dó5lí 1dó2m dóm5an dó5ne 3dór dó2s dós5e 4dq d5raðf dr4aðs5 d5raðst drafn4 dr4ara 3dreg d5reip d5rey d5riða d3rík d5roð dru4 d4ræt 2ds d5sal d4sjö dsk2 ds4ko ds5kun ds1l d5snö ds1s4 d1st4 d4sti ds4uð d4söf d1t2 d1u duf4 5duft duk4 d4umb du5ræ d4usta d3ún dún4a dút4 d1v4 4dw 1dy 1dý d3þ 1dæ 4dæf 4dær 3dö ð1a ðaf4 ða3g ðak4 ð4albo ð3ald ðal4is ð4a1m4 ð3a4n ðanmeg4 ðar1a ð3ar3f ðar3l ðar4lis ðar3t4 ð3arú ðat4a ð3au ð3á2 ð1b ð1d2 ð1e ð3f4 ð1g ð2ga ð2gi ðg4l ð4gn ðgu4 ð3g4ul ð1h ð1i ði3g ðik4 ð3in ðis5l ðist4 ð4ista ðis4ve ðj3as ð3jó ð4ju ð3ke ð1kr ðk2un ð3kunn ð1kv ð1lá ðl2in ðl4ist ð3lí ðl4ur ð1læ ð1m2 ðnum4 ð3o ð3ó ð1p2 ðr5át ð1re ð1ré ð3rik ð3rík ð5ró ðr1u ð3rú ð1ræ ðræðis5 ðs5afl ðs5á ð4seg ðs4inn ð1sk ðskr4 ð4skú ðs5kv ð4skö ðs4lu ð2so ðs3or ðss4 ð1st2 ð2stí ð3stö ðs4u ð4svi ð2sæ ð1t4 ð1u ð3uð ð3ug ð3ull ð5uls ð5unn ð3unu ð3ur ður5á ður3f ður5g4 ður5st ð1v ðv5að ðv3ann ðv3arn ð1y ð5ý ð1þ eat4 ebr5e ed4e e1dik ed3it eð3a2 eðal1 eð3il eð4is e2f e3fal ef3i efj5an ef4n 4eft. 2efts5 eg4ge eg3i egr5u eg3u4l egur4s e4i eið5ar eið4st eif4as ei4ka eik3li eik3u eil3ag eil5ö ei2m eim5u eing4 1eink 4eino eist5að e4k ek2is ekj5a ekn3 ek3u ek5ú e2l el5ás el4d el3eg elf3in el4gr el1i 4elí el3ín el4ke el2l ell5an ell3e elleg4 el3ó el3r el1sí 5elsk el4te elu5s e2m em4ba 1embe em5ens em3i4 emj3 em4l eml2i empl5 em5u e2n 4enc en4g eng3a enik4 2enn enn4t en4t ep4h ep3i epl5i e4pr ep4t e4r er3al er5au er5á 4erð 5ere er5et erf5ar er2fr erf3u erg5l er4gr er3i er2k er4la erl3i er4lí er4mi erm5in er5ól er5skj er1un er2v er3ö eröf4 e2s es3a es4ban es4bu 4esj e5ske 4eso esp3a es2s est3að est5ö e3sæ etik4 et5ils etna4 et5o etr5an etr3u etul4 et2us ext4u 5eyrar é3b é1d éð2s é3fe é1g4 é5ky é1l éla4g él4ara é2li é4lj él3r ér1 ér4á ér4r érs4 ér4un ér3v é3sm étt4ug ét4un étur4 f3að fa2g fa5k 1fall fal4u fa4ná fa5p4 f2ar f3arð f4are f4arg farka5l f3arl fast3e fá3f f5áns fá3rá fá3ta fá3v f1b4 fd2an f1dr f5dú fða4l 1fe f3ef f3ein 3fel f3end ferl5i fer3t f1ey 1fé f4fa f2fo f1fr ff4st ffær4a f1g2 f2ga f2gi fg4n f1h f3ið fik4 f5il. f5ili f3ill f5ils f5ilv fim3a f4ine f3inu 3firði f3irðu firg2 f3irn 1firs 3f4isk fi5so f3ist. f3istu fis5v fí4 f5íkv f3ís fj4a fj5aðu fj5ann fj4e f1k2 fl3and fl4at 3flata f5lát f4len fl5g 1flo 5flut flv4 4flý 1flö f1m 4fn fn1g f5n4í fn3k fn5ok 1fo 4fop forf4 fork4 1fó fr2 4fra. fr3að fra4m fram3l fr5and 4frar 2fri. fr5in frí5m4 f3róf fru4 fr3uð 1fræ 2f3ræk 4fræn fs3á f4sel f4skaf fsl4 fs3li fs5na f2so fs5or fsr4 fss4 f4sti f5s4tæ fs1v f4sæ ft3að fta4sk ft5á f3te ft2s fts5l ft3u ft4ul f1u 4fu. f3uð 3fugl fund4as 2f3ur 5furðul fur5e furs4 fur3t 4f2us f5ust. f3ustu f1v4 1fy f3yrt f1þ 1fæ 1fö för4l g1a 4ga. 4g3að gaf4ar gagl4 3gagn gak4 ga4lag gal4is 5gals 5galt gam3al gam4i g5and 1gang gap4a g4ard. g2arð 3garð. 3garða 3garði 3garð4s 5garður g3ar3f gar4kl gar3l gar3t 4gas g4as. g4así g3ast. ga5stað 1gata gat4r gá2 3gáf gá5le g1b gd4ans g3de g4du gd4v gð4aro 1ge 3gei 2g1el gen4 g5end 3geng g3ent 5gerð ger5í germ4 gerv5a get3r g1f2 ggis5 ggjaf3 ggj5ar gg5rá gg3ræ ggs4v gg3ug gg2v g4gö g1h g1i 4gi. 4gik gi5kv 3gild g5ill 5gilt gim4a 4g3i4n gis4a g4isp g5istæ gír5a gís4 gjaf5ar gjaf5o gjak4 gjal4 gj4asta 1gjö g1k4 gkal4 g1lá g4leð g3leg gl5é gl3f2 g3lit g5lín gl3ót glsk4 3glugg glu3s gl4y g3lær g1m4 gnap4 gnart4 g4ná gn3g g3nó gn4se gn5ug g4ný. 3gol g3or 3góð gór5 gó4ur g1p g3rak4 gr4an gra2s gras5sv g2rá 1grei g3reis g5reyð gr2i 2gri. grið4 g3rík 3gró 3grund 3grunn g3ræði g2ræn 4gs gs1á g4sei gsk4 gs4len gsl2u gs4lö gs3m gs5or gs3s4 gs4si gs1v gt3að g3te gt4s 2g1u g4uði guðl4 5g2uðs guð4só g3uðu 5gufu gu4lagi g5ulin g3ull g3uls gu5mið g3un gurf4 gur3g g4usta g3ú gúst5a g1v g2va g3val 5gyð g1þ 1gæ gæð4as gæl4 gær3 1gö4 h2a4 4ha. hað4 haf4sp hand5r hat3r há3g hál4 há3re há4ski há5sta hás4u hát4 há5ti hátr4 há1v he4 hei2 hellis5 hen2r herk4 her3l4 hersk4 4hersla hey5st 4hg h4i hig4 him5b hin4 hit4as hit4n 2hí2 h5ía hí5b hj4 h2l2 4hl. 4hls hlu4 h4n2 hnja4 hnjá3l holl3u horm5 hó2 hóm5e hót3 hr4 4hs hu4 hug1r hug3u hul5i hundr4 hú2 húm3 4húr hús5k hv4 hvar4 hvik3 5hy hæf5a hætt4us höst3 2ia i5as 4i5á 4i1b ibb3 ibl3í 4ic 2id4 i3da i1de i3dr 1ið. 4iðf 2ið3g ið5jarð 4iðr 4iðs ið5sal 2iðu 4ie i3ef 4if if5arn ifat4 i2fen if4g if3is if4t i4fy 4i2g iga3m igð5u ig1en ig5rí 2i1h 2ii i5ið 4ij 4ik ik5á ik3i ik4is ikt5o i4kvö 2il ila2g il4ara i1lá 4ile ilf4a il1fi il1g4 i5liðu il5in il3ip il5ís ilí4um il4kv il3lag ill5an il3lá i1lo il4sa il1sk il3sn ilst4 ilæk4 i5lön 4im im4b imb3u im3i im4ið im4la im4m i5mó im4sv 1i2n 4inaf in3an 4inar inat5r 2i3nau 2ina2v inav3í 4iná 4ind. in4ga ingj6arni 4ingr ingv4 2inns 2innu in1o 4inó in1s4k in2sp in3sta in5ul 4iný 2i3o 4ió 2ip i5pil 3ir. 4ira 2i1rá 2irði 4irðn 4ire 4iré irf2i 4irfs 4irig 2irit 4i1rí 2irk irk3u ir3l ir1m4 4irnd 4irni. 4irnin 4irnis 4iró irs4á irst4 ir3tal irt5i 4irtl irt4ö ir3ug 4irú 4irö i2s 1is. 2isa 4isag i5saga i3sam is2as 3isd 2ise 4ishv 3isins 4isí4 4isj i3sjó 2isk is4ka isk5el iski3m isk5inn. 3isko isk2u isk1v 5iskö 2islé is3læ 5isma is5me 4isni isp3að isp3u iss2i is5sú ist3al 2iste 4isté 4istig i5stik ist4is ist5ín 4isto 4istó 4isty 4istæ 2istö is5tök is1v 4isvi is4við 5isvin i3svæ 2isö 2it it3að it5ann i5tei 4ith it4ha it5ill itis4m it2ka itn5es it3rí it4stö it3un it4urn it4ve 4iu 4iú 4i1v i2v5ís 4ixs 2i3þ 4iæ 4iö í1a 4í5ak íal3 í5ald í3ali í2as í5at í5au í5á íb4a í5bar í4be 5íbú í5dag íð2s3 íðsk4 í3el í3en íet3n í5ett í2f íf3eð í4f3i íf5rí ífs3k íf4sp í2g íg3e í3gil í1h í1i ík3a4 4ík4anar 4ík4ani ík5is íkk2i 5íkm ík2n íkn5e ík4s ík3us 2íl ílak4 íl2as íl5ár íl5f4 í3lí 5ílmá íl3sk 4ím ím3að íma3l4 ím3an ím4g ím5o ím5t ím3un í2n í5ná ín5e ín3ge ín5t ínu3g4 ín3ú í3óp íóp5íu 4íp ír5ak íra4s í4r5i ír4sv ír3t í1ræ ír5ö í2se í4s5j ísl2 3íslen ísl5i ís2m í2st ís5ter ít5að ít5als ít3i ítj5 ít3re ítr5ó 4íub í5uð 4íul íu1ma í3un íu5p í3ur í4ura 4íusa íu3t 4íuv ívo4 í5þ j2a j3að j5aði 3jaf4n ja5kl jal2 jal5ið ja5ló j4am j3an j4aram j3ari jark4i jarn4ið j4aræ jas4 jask4u j3ast jál5as jál4f jálf3a 3járn jár4u jáv3 jávar5 j1e jend4a j4ep j4er j4et j1i jó5b jó5fr jó2s jó5ug jó3ve j1u juf4 jug2 jug5as ju4gó j4u1l2 jur4e 5j2urt jurt4i j2us4 j3ust. 3jöfn 3jök jöl3k jöl1m kað4s kaf4an ka4fr kag4as ka4j kaj5a kak4l kal2 3kald 4kalf k4all 3kam4b kam2s5 k3ana k4anaf k3ann. k4anó k4ant 5kanta 4kapa kark4 1k2ar2l k4arm k3arn kar2r k4art kar4v kask4 3kass 5kastal k5astu. 1kau 5kaup kák5 kám3 k1b k1d4 2k1end 3kenn 3kerf 5kerl ker4m k1f4 kfalls5 k3g kgl4 k1h k3ið kið5l kig4 k5ill k5ilsi kim2 k5ing k4ip k1ir k3irð 5kirk k5irn k4irt k1is k5ise kisk4 k3ist. k4it ki3te 3kíl kís3 kít3u kja4l kjar4a kjar5f kju3g 1kjö 3kjör kka5l kk5e kkj1ó k2kl kk1lá kk4li kk3rí kk4se kkul4 kkv5ið kl2 kl3að kl3ann klá4 5klef kleif5a k4lem k1lin 3klj 3kluk 3klú 1klæ k1m2 k4mið. kn3ar k2ney kni5svi 3knú 1ko 2kob koff5 kol5d kol4l kol5sv 3kon 4kons 3kos kot4as kó3d kó3m4 kór5a k1ótt kra5l kr2as k2rá k5ré kr2i krif3a 1krö 3kröf 4ks ks4lí ks4lö ks4má ks4n ksp4 k4ste k4stó k4str ksyf4 kt3að kt5er k4tí k3tora k5ty 2k1u k3uð k4uði kuf4 kuk4 kulegr4 kum4 kumb5 k5un. k5una. k3unar k5uni 5kunnátta k3unu k3ups k2urð kur5k k2us ku5sl k3ust. k5ustum ku3sty kú2 3kúlu k3ún kú3re kút4us 3kven 4kvé 4kvu kv4un. 1k4væ 3kvö 4kvör k5þ 3kök 5köld 5könn 5kös 2la. 4lac la4dan 2lað lað4al 4laf laf4as laf4r l3afs 3lagð 4lage 2lak la5kó la1l2 l3ald lam4b 2lana l2and 3land. 3lands 1lang lank5as 4lann l5anna. l4anó lan4t la3pl4 2lar l4aram l4are larg4 l4aris l3arn la3ró lart4 l4ary 2las las3i las3le la5sli last5að lat3ín lat4u 1lau 2laum laut5as lá2g lám5a lán5e 4lár lá4t 5látum lá3v 2l1b 2ld ld3ar ld3d ldem4 ld3ey ldig4 ldr4as ld5rau l4dri ld5ro ldr3ó 1le 4le. 2lef l1efn 4legn leif5as leik3v 4lein 4lek 4lel 4lenn 4lep 2ler le5rí les5e 2let l3ex 2ley. 4leyj 2leym lf4as lf5át lf4dr lf3f lf2i lf5inn. l3fj lf2l lfla4 l4fó lf4sp lftr4 lft4un 4lg lg2a lgar4s lg5ast l1gá l4ges lgil4 lg4isi lg3í lgl4 lgni5s l1gr lg4ú l1h 4li. lik4a li5kv lil2 li5la li3li l2ind 4lingsá l3inn l5inn. 2l3inu 4l3ir l1is l5is. l4isá l3isi lisk4 l5isr l4isti l5istu. lit4ar 3litl l3ía. lí4b 1líf líf5a lík3k lím5ug 4líp 1lít l1íu l4íuf l4íuh l4íutr lj3ar lj5arð 1ljós ljós5k ljós3l lj3ug ljur4 lj4uru 2lk lkap4 lk4as l1ke l3kr l3kúr l1kv l3ky 2ll ll3et l4ley ll3f ll1g2 ll3iða lli3g lliss4 l1lit llít4 ll3k4 ll3m ll1ót lls5tæ ll5te ll5ug ll3v 2lm lm5ari lm3ars lmb4 l3me l1mó lnar4 ln4ið l5no lo4 5loð 5loki 4lon 4l1or 5los lóð3r ló5gr ló4ma lp5t 2l1r l2ri l3rit 2ls lsí4 l2sj4 l5skin ls4kon ls4nesi l3stað lst4in ls1ve 4lt lt3að l5til lt4s lt4ú l1tæ 2lu 4lu. l3uð lugl4 luk4i l4u1l4 l1um lu1ma l1un 3lund l3unu lu5pe l1ur 2l1v l2va lv3að l3val l4víu ly4 3lyf 1lyn l1yr 1lý 2lýf lýt4a 4lýti 2l1þ 1læg lækj3 lækjar5 5lækk 1læti 1lög l5öl 4löt m2a 2ma. m4ab m4ad m3að. m3aða m3aði m3aðr m5aðs 1maðu maf4 m4ag 3mag4n m4ak mal4as mal3dr m3alf m3all m4alp mal4t ma1m4 4man. 4mana. m4aná m3anb 2m3and2 m3ank m3anl mann4as 3manni 3manns mann5t 2m3ans man5sa m3ant 4manu ma2r m3ara m3arb m3arð 1m4ark marks5 m3arn mar3o mar4s mars5m m4arú m1as mask4 ma4sp m3ast. 1má 4má. 3má2l mál3f4 2mám má5mu má5p 4már 4mb mb5aði m1ban mb3i mb4ir mb3un md2as md5asta md4v 1me 4me. með3 m5ef megin3 5m2eis meltr4 m1end 3menn m5erh m3er3í mest5a m1f4 m4fí mför4u m1g2 mgl4 m1h mið3i miðr4 mi3ge 3mik milj3 mil4l millj3 m3ing 5minj m3inn. min4s m3inu m3ir m1is mis3k mis3lu mism4 2mí mjó3sl m1k m2ka mk4arg mk4as mk2i mk4l m1l m2la m3lag m3lau m2lá ml3ár m2li m5luk 4mm m2m3a mm5b m4mó mm4sv mm3u m4nesku 2mog 4mok 3mol mong5 mód3 móð4s mó5g4 m5óní mó3rau mó4s 3mót mp3á m5pe mp3i m3rau m5rá m3re m3rý m1ræ 4ms ms5ál m2se ms5ei m5skau ms5kj ms5lá msn4 mssetr4 m1sv m4sví mt3að m4ti mt2is m3tug mt5un mt4us mt2v m1tö m1u 4mu. mug4u 4mul 4mum m2un 1mund m3ung 4mur m4uru mu5sta m3úð múg4u m1ún mús4a m1v4 1my 3mý mý5m m1þ 1mæ 1mö mör4 n1a 4na. na2da na4dí naðar3 naf4 nafl4 nafl5an 3nafn nak4a na4kr nal2 na3la n3ald na3li na1ma n4anaf n5ang n5ann n4arak n3ar3f n4arfi n4arfö narg4 n4aris nar5m nar5rin n4aru n4arú nat4 n5aug n3auk naum5a 1ná ná1g ná1k 3ná4m nán5ast n1b nbæj4 nd3er nd4isv n4dj nd3ót nd3rek ndr1u nd1ræ nd4sen nd3ug nd5ul ndur5g nd3ú 1ne neð2s 3n2ef 4nefl n4em nem5a 2n1en 4n4er nestr4 netl4 n5eyi n3eyj né5sk n1f2 nfr4 nga1m ng5are ng2as n2ge ng5ek n3ger n3get ng1ey ngi5k ngil4i ngi5lið ng5lag ngl2i ngl5ið ng5ólfs ng4ra ngr5an n3grí ngr3u ng3ræ ng4sj ng4sp ng4ste ngurs3 ngu3t n1h 4n1i n4iði ni5fr ni3gr ni3lu ni5m n4iru n3isa n4isá nisk4 ni3skó nis2m nis5s ni3ste ni5stæ n3ía n3ísk n1íu ní4um njál4 nk2 nk3að nk5and nk3ans n5ká n1ke nk3i n5kó n3kunn n5ky n5kö n1l2 nli4 n4list. n1m4 n2n nn1á nn1e nn3g2 nnk4i nn4sj nn5ske nn4sto nn5stun nn5tó nn3ug nn2us nn3úð n1or 1not n5ólf 5nóttin n3p4 n1r n3ram n5rau n2r4i n3rit n3sak n5sát n4seg ns5es ns5is ns1í n3skil nskír4 ns5kja n5skö nsn4a ns5r nst4e nt3að n5tak. n5taki n3tal n1te ntgen5 n3til n2tí nt2s nt5sk nt5sm nt3ug nt4v n1tý n1tö n1u nuf4 n4ugr nuk2 nu1l nu1ma 5numd nungs3 nur5f nur4l n3ust. nu5stað nu4sv nu5ta 3núm3 nú4s n1v n5yf n3yrk 1ný n3ýg ný3l ný5sk n1þ 1næ næl4a 3nöf n3öld n5ön 5obs oða3l oðr4 oðs5l oð4ug o2f of3ang off4u of3o of5r of4sj of5su oga3l4 ogast4 ogs4u ok4as olak4 old3u ol2g oll5eg ol5lit oll4st ol3m ol3ó oltal4 o2m om3a om4m3 om2u om3un on3sv on4t on5tó on4us opa5p op2h3 op5u4 ora4 or4di or1e or2fe or2gr 3orí orlag4 or2ma or4mi 4orn or4ne or4sta ortr4 ort3ug or1u or3ug or3v4 or4við or3y o4s osk3i os3m os2s ost5i ost5un 4o4t ot3að ota5l4 otam4 ot3ro ots4á ot5un o4u o3ve ox4 ó1a óaflat4 ó5an óar4s ób3ak ód4a óði4 óðl4 óðm4 óðv4 ó5e óf3ar óf4as óflu5s ófr4 óf5us ó2fy ó4fö ó2g ó1h ó1i ók5lo ó3kr ók2u óla3m ól2as ól5ik ól4is ól4kv ól5om 3ólsk ó4m3að óm3ar óm4bæ óm2g óm4is óml4 óm3p óm3stu óm3u ó2mö ó4n ón3í ón5kv óp4e óp2h5 ór4as órá4 ór2d ór4dö ór5es órf4 órg4 ó4ri ór4is órík4 órj4 órk4 órm4 órn4o ór3ón órr4 órs4a ór1u ósa5f ósak4 ó3sem ós3end ó5skaf ósk4as ósk5in ós2l óslav3 ó2só ósp4 ós4se ó4ta ót3að ótap4 ót5ef ótil4t ó5tí ót4ó ót2v ó1u óum5b óv4a ó5vat óy4 ó5þ p1a pag4 pa4le pa3m pa4n pan3gó pa2r p4arat pari3f par5í p2art par5te p4aru p2ák p4ál pá5m p4ár pá2s p4át p1b p5d p1el 1peni 3pers p1f2 p1g2 p1h p1i pil5ar 5pilt p4ink pist5i pit4 3píp pí2t pl2 pl3að pla4s p4læ 3plö p1m4 1pok 3pós p2p pp5aks pp5e pp3í ppk4 pp1l pp3ó pp1r ppsk4 4pra pr2i p4ris prí4 3prj 1pró pró5fas pró5m p1sa pss4 p1st pt2ú p1u puk4i pu1l pur4a 3pú púf4 p1v qu4 2ra 4ra. 5raðsh raf4f r3ald ral4i r4all r3als 3ranal r4ani. 3ranns r4anó 4r3ar r4arað r4arú r4ary r4aræ ras3i ra3tu r4aum 1ráð ráf4i rá5kvæ rárs4 r4ása r1b4 rba4 r1d r2dí r4ð rð4ar4á rð5is rð1l2 rð4mu rð5rá rð5su rð3sv rðv4 r4ef. r4efs 5reftsk 1regl r3eig 3reik r5enu r5eu r4eyn r4é r1fal2 rfa5li rf4ar r3fá r5feð rf1is r1fj rfjár4 rf4lö rfóg5 r1fr rfr4u rf4st r3fund rf4urð rgj4að rgj4ar rg2l4 r5gly r1gr r2gra r4grey r5h 4ri. 4r3ið. rig2 riga5s r3ild 4rin rin5e ringj5ar r3inu rip4s 4r3ir ri3sk ris5l2 3risn rist5að ris4un 1ri4t rit3li 4rí. 4ríf ríkis3 4ríl ríst4 4ríu 4ríþ rj3ar rjá4l rjó3sa rjósk5a rka1m rkaup4s r3ká r1ke rk1ef r4kell r4kelss rkju3s rk4se rk1sm rk4sp rk4ú rk5vei r3kö r1l2 rl3að rl5ann r2li4 rl4ið rlis5s r3lit rl3m rlof4 rmak4 r1man rmáls5 rmb4 rm2i r1mið rmil4 r5mj rmk4 rml4 r3móð rmr4 rn3ar rnar5l rn1g rn5ór rn5sí rn5sm rn4so r4nu r5numi ro4 rog4as ron4 r1or ró5gr ró4m ró4sa rós3ó 5róti r5pal r3pó r1pr r4pri rp2s rp3sk r5py rr5ar r1rá r1re r1ré r1rí rr2k r3ró rr1u r5rú r1ræ r1sa r4saf rs4ár rsegl4 r3ser rs4inn r3ske r5skil rs4lan rs2má r1st r2sti rst4v r3stö rs2u r5sund r4sú r1sv rt3að rta5g r3tak rta4sk r5tá rt5er rt3ey rt2hu r4tík r3tó r3trö rt4se rt5sl rtt4 rt4uru rt4ú r4tv rt4ve r1tæ rt1öf r1uð r4uðun ruk4i ru5li ru2m r1ur r4uss r3ust. rut4v r4úð 3rúm rúst5 r1v rv3að r3ve r2vi rvi3g rv3ing rv4un r3væ r3yr 1rým r1þ 1rækt ræmd5a 1ræn ræt3i röf4ug rök1r röl4 2sa. 4sab 2s3að s4aðf 1sag 4sagr 4sagt sal5at 4s3ald 1sa2m sam5b 4sam1e sam3m sam1s sam5y 2san s4ands 2s3ar s4are sarg4 s4aro s4arp 2s1as 2sat sat4a 2sau s3auk 4sav sá4 s3áb s5áf sálar5 s1ár s3ás s1b s3d4 1se 2s1ef 4seld. 5semi 5sens 2ser 2ses 3set sex3 2s1ey s4eyð 1sé s5f4 sfl4 sfr4 s1g4 sgl2 s1h shá4s s1i s3ið. 5s4iða s4iði sif2 si5fi 1sig sind4ar sind4as 5sinnu 2s5ins s3ir s3ist s4isv si3ta sí3br 1síð síðk4 sígl4 s3ík sí4m sínk5a s3ír s1ís s5íu. sí3v sí4ve 1sj s3jaf sjar4 s4já sjó5l sjó3m4 sjó3s 4sju 3sjú s2k 2sk. 4ska. 4skað skaf4a 4skal 2skan 1ska4p 4skas 1ská 1skei 3skemm 4sken 3skey s4k2i 2ski. 4skið sk3inu 3skip 2skir 4skis 3skír 5skjá 4sk4n 3skoð 4skon 4skos 1s4kot 1skó 5skóg 1skrá 4skró 3skrú 4sks sk3uri sk3ust 2skv 1sky 3ský 1skæ sla2 sla3f s4lam slands5 3s4lé sl2is s1lí s4líð s3lof s3lok 1sló slu3s 1slys s3læk s1m2 4sma smá1s smá5v 4sme s4mek s2mi 1smí smj4 4smö s2ne 3sneið 5sner s3nes 3sneyd sn4ið sn2o 1snú 4snúm s4ný snæð5 1so 4sod 3son 2sor s5orði 1só4 s4ól sól3e sól3s 2sóm s5ómag 4sós 1sp2 spít3 spj4 4spl 4spra 2spró s5pund sr2an s5rau s1rá s1re s1ré s1rí s5ro s5ræ s3rö s3s4á ss3er ss5í s1s4k4 ssl2 ssm4 ss5or s1st s4stir s1sv s2t 2st. s4ta 2sta. 4stal 4stap 5starfi 5starfs 4staæ 1ste 3stef 3stein 5stekk 4stet 1sté st4he 4sti. 1stig st4isl 3stíg 2stím 4stíu 1stj4 4stjón 5stjór 5stjör 4stl st3le 1sto 3stof 1stó 4stón 3stór st2r str5al 5stranda 5strang 5straum 5strá. 1stre 3strí 4strú s3try 5strön st5t 2s4tu 3stund 1st2ú 4stv 3stý 1stæ 2stæk 1s4tö 3stöð 4stöl 5stöng s1u su3f4 5sum3a s2ung s5upp s5ura sust4i sú4 súln4 s5ún s5úrs sút5 sv4 4svag 4sval s3vat s5veð s4vef s2vei s3veik 3svein 5svep 4svex s4viði 5sviði. s4vik svik3u s5vin s1vo s2væ 1svæð 1sy 2s3yfi 3syn 4s3yr 3s4ý s1þ 1sæ 4sæð sæf4 sæ5fa 3sæj 3sæl 4sæs 1sö 3sög sögu5s 2s3öld 3söm 2s3ör t2að ta2fr 1taka 5takend t4al. tala4m 4tam ta1ma t5amt ta4ná 3tang 4tar t4ar4að tar5is5 tark4 tarp4 tar5sá taræv4 t1as t4as. ta5sl tat4 ta4ví t4á4 5tákn 4tánd t1b t1d 4tegí 5tegu tei4 tein5g t1eis 1tek 3tekj tekkj5 t1end ten5ó 4tepl t3ett 2tey té4l t3f2 tfirr4 t1g t1h th5ers t1i ti4an ti5kis tild4 4tin tirk4 t4iræ tist4 t5ist. ti3sta tistil4 t2isv 1tit 1tí 4tí. 4tía 3tíð tí4l 3tím 4tín 4tít tív3 t4jö t1k tk4a t4k2i tlaf4 t3lag t4lag. tl2an tl5ann t1lá tl2i tlur4 t1læ 2t3m4 tn2s tnsk4 tnskr4 to4 1tog t3on 3torg 5toru 1tóm tóm3a tóm5as 5tónl tór1 tór5au tóri3s t1ót t3p tra2b 5traðari tr3alí tr2an tr3ann tr5ar 3traus t4rey 1tré tr4is t5risi t5ríka 3trj t5róf tr3ótt tr3ug tr3una tr5uni 1t4rú 1try t5ryð t3ræn 3tröð 4ts t1sa ts4inn t5sí tsj4 t1sk4 ts1s t1st4 ts4u t2sy tt3að ttak4i ttar5f tt5á tte5rí tt5ern t4tí tt5j tt1l tt1or tt3ræ tt3ug tt4ugl ttv4 t1tæ t1u 4tu. t4uði tugl4 tuk4 tu3l4ið tum2 tu5min t2ung 3t4ungl tup4 t3ur3e tur3k t5urs t4usa t4usu tutr4 túd3 t3úð tú4l 1tún tún4a t1úr tú3sk t1v 5tveggj t5ver 5týs t1þ 3tæk 1tök 1töl t5öls 2u1a u3af u5au 2u1á4 uáætl4 4u1b4 4uc 4ud4 u1da u5dá u3de u3dó u3dr 2uða uð4are uð3k4 2uðl uðm4 2uð4n 2uðr uð5ris uð4se uð3sv uð5sæ 4uðul 2u5e 4ué 4uf uf5á ufd4 u5fit u3fj u1fr u3ful u5fú 2ug 4ugal 4ugat 4uge 4ugil 4u1gj 4ugla ug1lj 4uglu ug4n 4ugó u5gran 4ugre 4ugrj 4ugró ug3ræ ug3ta 4ugö 4u1h 4ui u5ið 4uí4 2uj 2uk ukak4 uk4as u1ke u5kinnin ukku3s u5kó u3kv 2ul 3ul. 4u1lag ul3ar 3ulb 4ule u5lind ul4is u1lí ul3k2 ul4la 4ulln ullt4 4u3lo u3ló ul5sv ult4i ul3us ul5v4 u3læ 4u1lö 3um. 2uma umak4 u1man um4aran 2umá umál4ar um4ba um5bæ um4bö 2umd 2ume um3ein 4umi umj4 um4ki 4uml umm4a 4u5mo 2umó 4ump 2umr ums4 um3sl 3umst. um1t4 4umu um5unn 4umú 2umy 2umý 2umæ 2umö un3ar1 unar5a un2as 4unat 2u1nau 2uná 2und 4une 4unk 2unná 4unns 2unnu unn5ug 4uno 4unó uns4an 4unt 1unu 4unur 4unæ 4unö 2u3o uol4 4uó 2up upp1 upp5a uppal5 upp4i 3ur. 2ura ura4f ur5a4m ur2an ur5anna 2urá urða5rá 2ure u1rek ur3ey 4u1ré urf4a ur3fl urg4e ur3gj ur5in 4urit 4urí u3rík ur3j4 urk4a ur1m ur3ní 4uro 4uró ur1sk4 ur3sna ur4sta ur4svö ur5til urt4ir ur1u ur4unn 4urus ur3v4 ur4vis 4uryk 4urý 2uræ 4urö 2usa u3sal 4us4á 2use 4usí 2usj 4u1sk 4usl 2u3s4m 2usn 4uso 4usó 4usp u5starf 4ustá 4uste 2usté 2usti 2ustí 4usto 4ustó 4ustr 3ustu. 2ustú 4usty 4ustý 4ustæ 4ustö u5sund 4u3sv 4usy 2usý 2usö 2ut ut3að ut2as u3te u5til u3tó ut4stó ut2ú u1tæ 2u3u 4u5ú 4u3v 2uy u3yf 2u1þ 4uæ 2u5ö ú1a úal4 ú3arf úb3an úbli3 úð3ar úð5g ú3e úf5ar úfl2 úf5li úf5ly úfs4á ú5gala úgó3 ú4gæ 4ú1i úk1l úkr1u úk4s úl5er 5úl4f úlf5al úl4í3 úlíp4 ú3lo 4ú2m úm4r úm4si ú4n únd4ug ún4gö úpl5i úr5ef úrít4 úr5sl úr1t úr3un úr5v ú3ræ 2ús ú4sa ús3ei ús3í ús4sti ús4sv ús1v út3e út2he úti5f út2is útj4 út1l2 út1r 4ú1u ú1v ú4va ú5þ v2a2 vaðr5 va5fo va5h 5vallag va4n var4ma varps3 var5ú var4v v3ast va4t 3vax veð5l ve3fe 1veg v2ei 3veið vein4as 5veis 4velg 2vep v4er 1verð ver3gj 3verk ver2s vé2 v5és v3ét5 2v3h v2i 2vi. v4ið 5viðar við3l vil4i vi3lið 3viln vi4lo vin3gj 4vip 3virk visk5un 3viss vis4v 5vita vitk5 vit2n 4viv 4víb 2víð 5vík 3vísi vísl3a ví1v 2vn vo3k vol4 vork4 vor4r 4vr1 4vs 2vu v1uð v1un 5væg wa4 win4s4 x5ar x2as x3e x3f x5i xis4 xí3 xík4 x5íu xt5að x1u4 y5ba yð2s yf5a yf1i yfj5að yft4is y1i yj3ar yj5ó yk5e yk3i yk3su yk3u yk3v ylf5i ylgn4 yll5a yl4v ym3a ymp5í y4n ynj5ar ynj3ó yn4k yn4t yn5u yp2us yr5e yr1i yr3il yrir3 yrj3 yrkv3a yr2l yr2s yr1u y2s ysj3 ys2s yst3ug yt4h ytil4 yt4k y3v ý5a ýaf5 ý5á ýð2s ýfl4 ý3flu ýg4r ýg4uð ý1i ýja5f4 ým4a ým4k ýpru4 ýp2s ýrf4 ýri3m ýri5p4 ýr3l ý4si ýsig4 ýs4l ýs4m ý3stá ý5u ý5ú ý3v ý5y zó4 þ2a þam4 þarf5a þar4m 4þb þ2i þist3i þjó4 þol5a þor3f4 þor3g þorm4 þ1ól 3þór þór5i þ2r2 þra4 þrás4 þris4 þríl4 þrí3t þru4 þum5a þumb3 þur2 þús3 þ2v þver5sk æ1b æðn5 æðnis5 æð2s æð4ug 4æf æf1a æ4fi æf3ust æg5ist æ1i æj3 æj4al æjark4 æk1a æk1li æk3u æ2l æl3an æl3e æl3us æm3a æm4al æ4mundu ænak4 æn4k ær1a ær3e ærgöng5 ærif4 ær3ist æri3sv ær3l ær4n ær2s ær5un ær1us æ5rú æs4is æt5ise ætl5i æ5u æva5g æ5val æv3ar æv4ara æ3ve æv3in öð2 öðl3 öðm5 öð3un öðv5an öðv3ar ö1fa öfl3ó öfn5 öfr3u öf3u ö4g ög3gj öggv3 ög1re ög2us ök5e ök5rá ök3st ök3ul ökv3a ö4l öl1f4 ölk2 ölu5mi öl5un öl2v ölv5an öm4b öm3u önd4l öng5sv öng4us öng4v öngv3a önk3 önn4l ön3ug ön5un ör1e ör4ge ör4lan örm5un ör3ó ör3ug ör1un ör3und örus4 ör2v 4örva örv5al örv5an örv5ar örv4i ör1y ör5æ ö4s ösk3ul ös3u öt4s ö3tug öt2v ötv3a ö5u þ6ó",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=4188,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-is.rme b/Master/texmf-dist/tex/context/patterns/lang-is.rme
index ad574059bd4..e7c64cf77e3 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-is.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-is.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Icelandic Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -76,4 +80,4 @@
% http://www.latex-project.org/lppl.txt
% and version 1.2 or later is part of all distributions of LaTeX
% version 1999/12/01 or later.
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-it.lua b/Master/texmf-dist/tex/context/patterns/lang-it.lua
new file mode 100644
index 00000000000..efa5ed5ead5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-it.lua
@@ -0,0 +1,75 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="it",
+ ["source"]="hyph-it",
+ ["texcomment"]="% Italian Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: ithyph.tex (2008-03-08)\
+% Author: Claudio Beccari <claudio.beccari at polito.it>\
+%\
+% It was further edited by Claudio Beccari(2010/05/24)\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+%%%%%%%%%%%%%%%%%%%%%%%%%%% file ithyph.tex %%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+%\
+% Prepared by Claudio Beccari e-mail claudio dot beccari at gmail dot it\
+%\
+% 10090 Villarbasse (TO)\
+% Italy\
+%\
+% Copyright 1998, 2010 Claudio Beccari\
+%\
+% This program is free software; it can be redistributed and/or modified \
+% under the terms of the GNU Lesser General Public Licence,\
+% as published by the Free Software Foundation, either version 2.1 of the\
+% Licence or (at your option) any later version.\
+%\
+% \\versionnumber{4.8h} \\versiondate{2010/05/24}\
+%\
+% These hyphenation patterns for the Italian language are supposed to comply\
+% with the Recommendation UNI 6461 on hyphenation issued by the Italian\
+% Standards Institution (Ente Nazionale di Unificazione UNI). No guarantee\
+% or declaration of fitness to any particular purpose is given and any\
+% liability is disclaimed.\
+%\
+% See comments at the end of the file after the \\endinput line\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyz’",
+ ["data"]=".a3p2n .anti1 .anti3m2n .bio1 .ca4p3s .circu2m1 .contro1 .di2s3cine .e2x1eu .fran2k3 .free3 .li3p2sa .narco1 .opto1 .orto3p2 .para1 .poli3p2 .pre1 .p2s .re1i2scr .sha2re3 .tran2s3c .tran2s3d .tran2s3l .tran2s3n .tran2s3p .tran2s3r .tran2s3t .su2b3lu .su2b3r .wa2g3n .wel2t1 2’2 a1ia a1ie a1io a1iu a1uo a1ya 2at. e1iu e2w o1ia o1ie o1io o1iu 1b 2bb 2bc 2bd 2bf 2bm 2bn 2bp 2bs 2bt 2bv b2l b2r 2b. 2b’ 1c 2cb 2cc 2cd 2cf 2ck 2cm 2cn 2cq 2cs 2ct 2cz 2chh c2h 2ch. 2ch’. 2ch’’. 2chb ch2r 2chn c2l c2r 2c. 2c’ .c2 1d 2db 2dd 2dg 2dl 2dm 2dn 2dp d2r 2ds 2dt 2dv 2dw 2d. 2d’ .d2 1f 2fb 2fg 2ff 2fn f2l f2r 2fs 2ft 2f. 2f’ 1g 2gb 2gd 2gf 2gg g2h g2l 2gm g2n 2gp g2r 2gs 2gt 2gv 2gw 2gz 2gh2t 2g. 2g’ 1h 2hb 2hd 2hh hi3p2n h2l 2hm 2hn 2hr 2hv 2h. 2h’ 1j 2j. 2j’ 1k 2kg 2kf k2h 2kk k2l 2km k2r 2ks 2kt 2k. 2k’ 1l 2lb 2lc 2ld 2l3f2 2lg l2h l2j 2lk 2ll 2lm 2ln 2lp 2lq 2lr 2ls 2lt 2lv 2lw 2lz 2l. 2l’. 2l’’ 1m 2mb 2mc 2mf 2ml 2mm 2mn 2mp 2mq 2mr 2ms 2mt 2mv 2mw 2m. 2m’ 1n 2nb 2nc 2nd 2nf 2ng 2nk 2nl 2nm 2nn 2np 2nq 2nr 2ns n2s3fer 2nt 2nv 2nz n2g3n 2nheit 2n. 2n’ 1p 2pd p2h p2l 2pn 3p2ne 2pp p2r 2ps 3p2sic 2pt 2pz 2p. 2p’ 1q 2qq 2q. 2q’ 1r 2rb 2rc 2rd 2rf r2h 2rg 2rk 2rl 2rm 2rn 2rp 2rq 2rr 2rs 2rt r2t2s3 2rv 2rx 2rw 2rz 2r. 2r’ 1s2 2shm 2sh. 2sh’ 2s3s s4s3m 2s3p2n 2stb 2stc 2std 2stf 2stg 2stm 2stn 2stp 2sts 2stt 2stv 2sz 4s. 4s’. 4s’’ 1t 2tb 2tc 2td 2tf 2tg t2h t2l 2tm 2tn 2tp t2r t2s 3t2sch 2tt t2t3s 2tv 2tw t2z 2tzk tz2s 2t. 2t’. 2t’’ 1v 2vc v2l v2r 2vv 2v. 2v’. 2v’’ 1w w2h wa2r 2w1y 2w. 2w’ 1x 2xb 2xc 2xf 2xh 2xm 2xp 2xt 2xw 2x. 2x’ y1ou y1i 1z 2zb 2zd 2zl 2zn 2zp 2zt 2zs 2zv 2zz 2z. 2z’. 2z’’ .z2",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=348,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-it.pat b/Master/texmf-dist/tex/context/patterns/lang-it.pat
index 9c0bffc6e98..c037a563a3b 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-it.pat
+++ b/Master/texmf-dist/tex/context/patterns/lang-it.pat
@@ -2,7 +2,7 @@
% for comment and copyright, see e:/tmp/patterns/lang-it.rme
-% used: 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
+% used: 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 ’
\patterns{
.a3p2n
@@ -37,6 +37,7 @@
.su2b3r
.wa2g3n
.wel2t1
+2'2
a1ia
a1ie
a1io
@@ -64,6 +65,7 @@ o1iu
b2l
b2r
2b.
+2b'
1c
2cb
2cc
@@ -79,12 +81,15 @@ b2r
2chh
c2h
2ch.
+2ch'.
+2ch''.
2chb
ch2r
2chn
c2l
c2r
2c.
+2c'
.c2
1d
2db
@@ -100,6 +105,7 @@ d2r
2dv
2dw
2d.
+2d'
.d2
1f
2fb
@@ -111,6 +117,7 @@ f2r
2fs
2ft
2f.
+2f'
1g
2gb
2gd
@@ -129,6 +136,7 @@ g2r
2gz
2gh2t
2g.
+2g'
1h
2hb
2hd
@@ -140,8 +148,10 @@ h2l
2hr
2hv
2h.
+2h'
1j
2j.
+2j'
1k
2kg
2kf
@@ -153,6 +163,7 @@ k2r
2ks
2kt
2k.
+2k'
1l
2lb
2lc
@@ -174,6 +185,8 @@ l2j
2lw
2lz
2l.
+2l'.
+2l''
1m
2mb
2mc
@@ -189,6 +202,7 @@ l2j
2mv
2mw
2m.
+2m'
1n
2nb
2nc
@@ -210,6 +224,7 @@ n2s3fer
n2g3n
2nheit
2n.
+2n'
1p
2pd
p2h
@@ -223,9 +238,11 @@ p2r
2pt
2pz
2p.
+2p'
1q
2qq
2q.
+2q'
1r
2rb
2rc
@@ -248,9 +265,11 @@ r2t2s3
2rw
2rz
2r.
+2r'
1s2
2shm
2sh.
+2sh'
2s3s
s4s3m
2s3p2n
@@ -267,6 +286,8 @@ s4s3m
2stv
2sz
4s.
+4s'.
+4s''
1t
2tb
2tc
@@ -289,17 +310,22 @@ t2z
2tzk
tz2s
2t.
+2t'.
+2t''
1v
2vc
v2l
v2r
2vv
2v.
+2v'.
+2v''
1w
w2h
wa2r
2w1y
2w.
+2w'
1x
2xb
2xc
@@ -310,6 +336,7 @@ wa2r
2xt
2xw
2x.
+2x'
y1ou
y1i
1z
@@ -323,4 +350,6 @@ y1i
2zv
2zz
2z.
+2z'.
+2z''
.z2} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-it.rme b/Master/texmf-dist/tex/context/patterns/lang-it.rme
index 2078e7259d1..d60ade30e4e 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-it.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-it.rme
@@ -1,18 +1,16 @@
% generated by mtxrun --script pattern --convert
+Italian Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
% Source: ithyph.tex (2008-03-08)
% Author: Claudio Beccari <claudio.beccari at polito.it>
%
-% The above mentioned file should become obsolete,
-% and the author of the original file should preferaby modify this file instead.
-%
-% Modificatios were needed in order to support native UTF-8 engines,
-% but functionality (hopefully) didn't change in any way, at least not intentionally.
-% This file is no longer stand-alone; at least for 8-bit engines
-% you probably want to use loadhyph-foo.tex (which will load this file) instead.
+% It was further edited by Claudio Beccari(2010/05/24)
%
% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
% with help & support from:
@@ -24,32 +22,6 @@
%
% However, the "copyright/copyleft" owner of patterns remains the original author.
%
-% The copyright statement of this file is thus:
-%
-% Do with this file whatever needs to be done in future for the sake of
-% "a better world" as long as you respect the copyright of original file.
-% If you're the original author of patterns or taking over a new revolution,
-% plese remove all of the TUG comments & credits that we added here -
-% you are the Queen / the King, we are only the servants.
-%
-% If you want to change this file, rather than uploading directly to CTAN,
-% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
-% or ask for credentials for SVN repository and commit it yourself;
-% we will then upload the whole "package" to CTAN.
-%
-% Before a new "pattern-revolution" starts,
-% please try to follow some guidelines if possible:
-%
-% - \lccode is *forbidden*, and I really mean it
-% - all the patterns should be in UTF-8
-% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
-% and if you really cannot do without, also \input and \message
-% - in particular, please no \catcode or \lccode changes,
-% they belong to loadhyph-foo.tex,
-% and no \lefthyphenmin and \righthyphenmin,
-% they have no influence here and belong elsewhere
-% - \begingroup and/or \endinput is not needed
-% - feel free to do whatever you want inside comments
%
% We know that TeX is extremely powerful, but give a stupid parser
% at least a chance to read your patterns.
@@ -62,21 +34,19 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%% file ithyph.tex %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% Prepared by Claudio Beccari e-mail claudio.beccari@polito.it
+% Prepared by Claudio Beccari e-mail claudio dot beccari at gmail dot it
%
-% Dipartimento di Elettronica
-% Politecnico di Torino
-% Corso Duca degli Abruzzi, 24
-% 10129 TORINO
+% 10090 Villarbasse (TO)
+% Italy
%
-% Copyright 1998, 2008 Claudio Beccari
+% Copyright 1998, 2010 Claudio Beccari
%
% This program is free software; it can be redistributed and/or modified
% under the terms of the GNU Lesser General Public Licence,
% as published by the Free Software Foundation, either version 2.1 of the
% Licence or (at your option) any later version.
%
-% \versionnumber{4.8g} \versiondate{2008/03/08}
+% \versionnumber{4.8h} \versiondate{2010/05/24}
%
% These hyphenation patterns for the Italian language are supposed to comply
% with the Recommendation UNI 6461 on hyphenation issued by the Italian
@@ -85,4 +55,4 @@
% liability is disclaimed.
%
% See comments at the end of the file after the \endinput line
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-la.lua b/Master/texmf-dist/tex/context/patterns/lang-la.lua
new file mode 100644
index 00000000000..90f40293bd9
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-la.lua
@@ -0,0 +1,127 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="la",
+ ["source"]="hyph-la",
+ ["texcomment"]="% Latin Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: lahyph.tex (2007-09-03)\
+% Author: Claudio Beccari <claudio.beccari at polito.it>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% ********** lahyph.tex *************\
+%\
+% Copyright 1999- 2001 Claudio Beccari\
+% [latin hyphenation patterns]\
+%\
+% -----------------------------------------------------------------\
+% IMPORTANT NOTICE:\
+%\
+% This program can be redistributed and/or modified under the terms\
+% of the LaTeX Project Public License Distributed from CTAN\
+% archives in directory macros/latex/base/lppl.txt; either\
+% version 1 of the License, or any later version.\
+% -----------------------------------------------------------------\
+%\
+% Patterns for the latin language mainly in modern spelling\
+% (u when u is needed and v when v is needed); medieval spelling\
+% with the ligatures \\ae and \\oe and the (uncial) lowercase `v'\
+% written as a `u' is also supported; apparently there is no conflict\
+% between the patterns of modern Latin and those of medieval Latin.\
+%\
+% Support for font encoding OT1 with 128-character set and\
+% for font encoding T1 with a 256-character set.\
+%\
+% Prepared by Claudio Beccari\
+% Politecnico di Torino\
+% Torino, Italy\
+% e-mail beccari@polito.it\
+%\
+% 1999/03/10 Integration of `lahyph7.tex' and `lahyph8.tex' into\
+% one file `lahyph.tex' supporting fonts in OT1 and T1 encoding by\
+% Bernd Raichle using the macro code from `dehypht.tex' (this code\
+% is Copyright 1993,1994,1998,1999 Bernd Raichle/DANTE e.V.).\
+%\
+% 2010/06/01 Removal of pattern 2'2 (probably a leftover from Italian)\
+%\
+% \\versionnumber{3.2} \\versiondate{2010/06/01}\
+%\
+% Information after \\endinput.\
+%\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+%\
+% \\message{Latin Hyphenation Patterns `lahyph' Version 3.2 <2010/06/01>}\
+%\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvxzæœ",
+ ["data"]=".a2b3l .anti1 .anti3m2n .circu2m1 .co2n1iun .di2s3cine .e2x1 .o2b3 .para1i .para1u .su2b3lu .su2b3r 2s3que. 2s3dem. 3p2sic 3p2neu æ1 œ1 a1ia a1ie a1io a1iu ae1a ae1o ae1u e1iu io1i o1ia o1ie o1io o1iu uo3u 1b 2bb 2bd b2l 2bm 2bn b2r 2bt 2bs 2b. 1c 2cc c2h2 c2l 2cm 2cn 2cq c2r 2cs 2ct 2cz 2c. 1d 2dd 2dg 2dm d2r 2ds 2dv 2d. 1f 2ff f2l 2fn f2r 2ft 2f. 1g 2gg 2gd 2gf g2l 2gm g2n g2r 2gs 2gv 2g. 1h 2hp 2ht 2h. 1j 1k 2kk k2h2 1l 2lb 2lc 2ld 2lf l3f2t 2lg 2lk 2ll 2lm 2ln 2lp 2lq 2lr 2ls 2lt 2lv 2l. 1m 2mm 2mb 2mp 2ml 2mn 2mq 2mr 2mv 2m. 1n 2nb 2nc 2nd 2nf 2ng 2nl 2nm 2nn 2np 2nq 2nr 2ns n2s3m n2s3f 2nt 2nv 2nx 2n. 1p p2h p2l 2pn 2pp p2r 2ps 2pt 2pz 2php 2pht 2p. 1qu2 1r 2rb 2rc 2rd 2rf 2rg r2h 2rl 2rm 2rn 2rp 2rq 2rr 2rs 2rt 2rv 2rz 2r. 1s2 2s3ph 2s3s 2stb 2stc 2std 2stf 2stg 2st3l 2stm 2stn 2stp 2stq 2sts 2stt 2stv 2s. 2st. 1t 2tb 2tc 2td 2tf 2tg t2h t2l t2r 2tm 2tn 2tp 2tq 2tt 2tv 2t. 1v v2l v2r 2vv 1x 2xt 2xx 2x. 1z 2z. a1ua a1ue a1ui a1uo a1uu e1ua e1ue e1ui e1uo e1uu i1ua i1ue i1ui i1uo i1uu o1ua o1ue o1ui o1uo o1uu u1ua u1ue u1ui u1uo u1uu a2l1ua a2l1ue a2l1ui a2l1uo a2l1uu e2l1ua e2l1ue e2l1ui e2l1uo e2l1uu i2l1ua i2l1ue i2l1ui i2l1uo i2l1uu o2l1ua o2l1ue o2l1ui o2l1uo o2l1uu u2l1ua u2l1ue u2l1ui u2l1uo u2l1uu a2m1ua a2m1ue a2m1ui a2m1uo a2m1uu e2m1ua e2m1ue e2m1ui e2m1uo e2m1uu i2m1ua i2m1ue i2m1ui i2m1uo i2m1uu o2m1ua o2m1ue o2m1ui o2m1uo o2m1uu u2m1ua u2m1ue u2m1ui u2m1uo u2m1uu a2n1ua a2n1ue a2n1ui a2n1uo a2n1uu e2n1ua e2n1ue e2n1ui e2n1uo e2n1uu i2n1ua i2n1ue i2n1ui i2n1uo i2n1uu o2n1ua o2n1ue o2n1ui o2n1uo o2n1uu u2n1ua u2n1ue u2n1ui u2n1uo u2n1uu a2r1ua a2r1ue a2r1ui a2r1uo a2r1uu e2r1ua e2r1ue e2r1ui e2r1uo e2r1uu i2r1ua i2r1ue i2r1ui i2r1uo i2r1uu o2r1ua o2r1ue o2r1ui o2r1uo o2r1uu u2r1ua u2r1ue u2r1ui u2r1uo u2r1uu",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=335,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-la.rme b/Master/texmf-dist/tex/context/patterns/lang-la.rme
index 3f238d03729..22feaf3ceaf 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-la.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-la.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Latin Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -93,13 +97,14 @@
% Bernd Raichle using the macro code from `dehypht.tex' (this code
% is Copyright 1993,1994,1998,1999 Bernd Raichle/DANTE e.V.).
%
+% 2010/06/01 Removal of pattern 2'2 (probably a leftover from Italian)
%
-% \versionnumber{3.1} \versiondate{2007/04/16}
+% \versionnumber{3.2} \versiondate{2010/06/01}
%
% Information after \endinput.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% \message{Latin Hyphenation Patterns `lahyph' Version 3.1 <2007/04/16>}
+% \message{Latin Hyphenation Patterns `lahyph' Version 3.2 <2010/06/01>}
+%
%
-% \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-lt.lua b/Master/texmf-dist/tex/context/patterns/lang-lt.lua
new file mode 100644
index 00000000000..d0b1656b005
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-lt.lua
@@ -0,0 +1,68 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="lt",
+ ["source"]="hyph-lt",
+ ["texcomment"]="% Lithuanian Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8\
+% in October 2008 by Mojca & Arthur.\
+%\
+% Source available on:\
+% - http://www.vtex.lt/tex/littex/index.html\
+%\
+% Authors:\
+%\
+% First version in LT encoding (modified T1):\
+% - Vytas Statulevičius <vytas at vtex.lt>\
+% - Yannis Haralambous\
+% (Vilnius, March 4, 1992)\
+% Conversion into Latin 7 and aditional support files (babel, fonts):\
+% - Sigitas Tolusis <sigitas at vtex.lt>\
+% (2002-11-20)\
+% Adaptation for hyph-utf8:\
+% - Mojca & Arthur (see below), October 2008\
+%\
+% The copyright statement of this file is:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% A note about lefthyphenmin/righthyphenmin (by Sigitas, February 2009):\
+%\
+% At the moment the lefthyphenmin & righthyphenmin are both set to 2.\
+% The Lithuanian patterns were build earlier then the latest grammatical rules\
+% took place in 1997. At that time it was forbidden to leave one character at boundary.\
+% One may change it to one now, but from typographical point of view there is no need to do\
+% any changes. Even more, changing lefthyphen and righthyphen to 1 requires\
+% to review and maybe rebuild the patterns file.\
+%\
+%------------------------------------------------------------------------------\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnoprstuvwyząčėęįšūųž",
+ ["data"]=".ap1 .api1 .ap3r .arbi1 .arti1 .as3p .at1 .ata1 .at3r .aš3v .dina1 .ek3r .i2š3 .iši2 .kirti1 .nu1 .nusi1 .pie2č .sam1 .sida1 .sk4 .st4 .su5kr .te3s2 .uk3 .u2š3 .už1 .įs4 .šven1 a1a2 a1b a1c a2ch a1d a4dra a1e ae2l a1f 2a1g a4gr ag3ra a5grio a5gro a1h a5inf ai4sk ai4tr a1j a1k ak2l ak2vi a2kėt a1l a3li a5lo1 a3ly a3lė a3lū a1m a1n an3k2l an4sk an4tr a2o a1p ap1a4k ap3ei ap3i2m ap3l a3pr ap3s2 a1r ar1eit a4rg ari4s a1s asi1 asi5s a4sk as3kl a3sl as2mi as2mu a5s4n a4stu a1t at3aug ate5ist at3i2m ato1 atp4 a4tru at1ė2 atū2ž a4u au4kl au4sk au4sl au4t3r a1v a1w a1y a1z a1ą 2a1č a1ę a1ė2 a1į a1š a3šn aš4tr aš2v a1ų a1ū2 a1ž až2l ba3c balta1 ba4sl 2b1b 2b1c 4b3d bep4 be3s2 besi1 be3t2 2b1f 2b1g 2b1h b1j 2b1k 2b1l b2la b2liz 3b2lo b2lu 2b1m 2b1n 2b1p 2b2r b3ri 2b1s 2b3t bu4k 2b1v 2b1w 2b1z 2b1č 2b1š 2b1ž car4 2c1b 2c1c 2c1d 2c1f 2c1g 3chi 2c1k 2c1l 2c1m 2c1n 2c1p 2c1r 2c1s 2c1t cu4 cuk5 2c1v 2c1w 2c1z 2c1č 2c1š 2c1ž da3b4 2d1b 2d1c 2d1d de4k dema1 de4pr de4sp 2d1f 2d1g 2d1h di4p di4s dis5k 2d1j 2d3k 4d3l 2d1m 2d1n do3ri 2d1p 2d1r dro1 dro2b d2rė 4drų 2d1s 2d1t du2a du4k du5ka du4sl 2d1v d3va dvi3a 2d1w d4z 2d1č 2d1š d4ž džio1 e1a2 e2a3l eapi1 eat1 e1b2 ebe1 e3bl eb3r e1c e2ch e3d2 ed3ri e4dro ed3rė e1e e1f e1g eg3ra e1h e1ie ei4k3l 1ein ei4sk ei4sl 2eis3t eist2ra ei2š1 e1j e1k e3kr e1l e1m ema5s4 2e1n en3k2l enk4la eno1 ens4 4enta enu1 e2o e3or e3o2š e3p ep4li ep4r epra1 epri1 e1r ere3a4 eri4s ero1 erė2 e1s esi5s es4k eska1 e5sko e3s2v e1t e1u4 euž3 e1v e3vi e1w e1y e1z e1ą e1č e1ę e1ė e1į4 eįp3 eįs3k eįt3r e1š e3šn eš2v ešė3 e1ų e1ū e1ž 2f1b 2f1c 2f1d 2f1f 2f1g 2f1h fi4s5 2f1k 2f1l 2f1m 2f1n 2f1p 2f1r fri1 2f1s 2f1t 2f1v 2f1w 2f1z 2f1č 2f1š 2f1ž gaš3 2g1b 2g1c 2g1d ge4o1 2g1f 2g1g 2g1h 2g1k 2g1l g2le g2lo 2g1m 2g1n 3g2nų 2g1p2 3g2r grai2 g3ran 5g3re g4rei g3ri 4g4rio g3ro. g4rą 5grį 4grų 2g1s 4g1t 3gu 2g1v 2g1w gyva1 2g1z 2g1č 2g1š 2g1ž 2h1b 2h1c 2h1d 2h1f 2h1g 2h1h hi4b 2h1k 2h2l 2h1m h2me 2h1n 2h1p 2h1r 2h1s 2h1t 2h1v 2h1w 2h1z 2h1č 2h1š 2h1ž i2a ia5g4 i3aiš ia3k i3antę i3antė iap4 i3ar i3b2 i1c ice1 i1d id2r id3rė i2dėm i2e ie4d3r ie3g i3ei ie3kl i3ent ie4p5r ie4sk i1f 2i1g i3g2l ig3ru 2i1h i1i2 i1j i1k i3k2n ik3r i1l ilo1 i1m 1imd 4i1n in4kl 5inv i2o io4g3r iok2 io4pl i3or i1p i2p1j ip3ru i1r ira3s2 i3ri 4i1s i5sa i5si is4k i3sl is4li i5s4n i4ste isto1 2i3t2 i2u i1v i1w i1y i1z i2ą i1č i1ę i1ė2 i1į i1š i3šn iš5t i4šv išė2 1išš i2ų i2ū i3ž 3ja. jauna1 2j1b 2j1c 2j1d 2j1f 2j1g 2j1h 2j1j 2j1k 2j1l 2j1m 2j1n jot3 jo4tv 2j1p 2j1r 2j1s 2j1t 1ju 2j1v 2j1w 2j1z 2j1č 2j1š 1jū 2j1ž 3ka. 5ka3d kak3 ka4kl ka4pr 3kar 3kas 3kati 5kav kavar1 ka3z2 2k1b 2k1c 2k1d 3ke ke4b3 keren1 2k1f 2k1g 2k1h k4i 5ki. 5kia 3kib 3kil 5kit 2k1k 2k1l 3k2la k4lan 4kle. k2lel 4klo. 4klu. k2ly 4klą 4klų 2k1m 2k1n 3ko 2k1p 2k2r k4rau kris2 kri5st k3ro k4rov 4k3ru 5krun k4ry k5rą 2k1s k4sk ks3l k4s3p 4k1t k3ta 3ku 4kub ku4k ku4pr 2k1v k2va k3vo k2vė 2k1w 3kyt 2k1z 5ką 2k1č 2k1š kš2ly kšė3 2k1ž 3la. lap4s3to 2l1b lb3r 2l1c 2l1d 3le. le3c le4gr 4leč 2l1f 2l1g lg3s2t 2l1h 3li. li4a 5li4o 3lių 2l1j 2l1k lko1 2l1l 2l1m 2l1n 3lo. log4 4lop 4l1p lpna1 2l1r 4l1s l4sk l4s3p 4l3t 3lu. 2lup 4l1v 2l1w 3lyč 2l1z 3lą 2l1č 3lęs 3lėm 3lės 2lėč 3lį4 4l1š 3lų 2l1ž m2a 2m3aid 3mas mas3ki 2m1b mb3r 2m1c 2m1d me3c meis1 2m1f 2m1g 2m1h mi4gl mi4gr min4s mi4tr 2m1k 2m1l 2m1m 2m1n m2o 2mod 2m1p m4pl m3pr 2m1r 4m1s 2m1t m3ta 3muo 2m1v 2m1w 2m1z 2m1č 2m1š 2m1ž na3s2 na3t2 2n1b 2n1c ncen1 2n1d n3drė ne1 neg4 nei2m ne4o3 neor2 nerė3 nesi1 ne3sl ne3s2t ne3t2 neįs3t 2n1f 4n1g ng3l ng4r 2n1h ni4s 2n1j 2n1k nk3la nk3r n3kry 2n1l 2n1m 2n1n 5no 2n1p 2n1r 4n1s ns4ku ns3l n4s3p nst3r 4n1t n3ta nt4pl n3tru nt2ruo nua4 nu3b2 nu3g nu1i nuk2 nu4o3 nuos2 nu5s4 2n1v 2n1w 2n1z 4n1č 2n1š 2n1ž o1a o1b o1c o1d o3dr o1e o2et o1f o1g o1h o1i o1j o1k o3kr o1l olen1 o1m om4pr o1n ono1 o1o2 o1p o1r o2rie ori4s or4tr o2rę o1s o3sl os3le os4lo o3s2v o3t2 oto1 o1v o1w o1y o1z o1ą o1č o1ę o1ė o1į o1š oš2v o1ų o1ū o1ž pa3 pad2 pai2l pai2m pai2r 3pan pap4 p2ar parsi1 pa4r1ė2 pas2 pa5sr p2at2 2p1b 4p1c 4p3d2 p2e per1 pe2re pe2r3im per3s pe2rė 2p1f 2p1g 2p1h p2i p3ieš 2p3k2 3p2l p3le p3li 4plio p4liu p3lo p4loj p4lu p4ly 2p1m 4p1n 3po po4g poli1 2p1p 2p2r p3rai prau2si p3raš p3ri pris2 p5ro. p3rom p3ry 4prą p3rė p3rū 4p1s psi1 p5s4k p4s3ty p3s2v 4p3t2 3p4u pusiau1 pu4sk pu4sl pu4tr 2p1v 2p1w p2y 2p1z 2p1č p2ė 4p3š2 4p3ž r2a 3ra. ra3b 3rac ra1im rai4tį ra3kr 3ral 3ram ras4l ra3sm rau4ka. 3rav 2r1b rbo1 r3b4r 2r1c 4r1d 2reb 4rein 4reit 3rel re4p5 5res res3l 3ret 2r1f 2r1g 2r1h r2i 3ri. ri3d 3rij ri3kr 2ril ri2ma. 2r3imt 3rio ri3p risi1 ri3st rivin1 3rią 3rių 2riū 4r1k rk3ly r3k4r 4r1l 2r1m 4r1n r2o 3rod2 ro4gr 3roj 3rok 3ron 3rop 2r3org 5ros 2r1p r3p4r 2r1r 4r1s rs4ko. rs4p 4r1t rti5k4 rti3s2 r3t2r r3t2v r2u 2ruk 3rul 4run 3ruos 2rup 3rus ru4sk 4ruto 4r1v 2r1w 2r1z 3rą 4rąs 4r1č 4r1š r3š2l r3š2m 5rų 2r1ž sala1 2s1amž san5t sarka1 2s3b 2s1c 2s3d s2e se4kr senat4 2s1f 2s1g 2s1h si3auk si3a2v si3a2š si3d si3k4 si3p4 si3s2 si5š2v 3s2k2 4sk. s5ka. 4ske 5s4ken 5ski 5s4kle 5sk4r 5skub sk3va sk3vi 5sky 4ską 5skę 2s2l 3sle s3li s3lo 4s3lu 4s3lū 2s1m 4sme. 4smę 4s3n so4dr 3s2p s3pe 4spn 4spu 4s1r s3ri 2s1s 2s1t s2tal s2ten 4stin s2tod s2toj 3s2tov st2rai st2v 4stę 4s3tė 4stų s2tū su1 su3bl su3d2 su3g2 suk2l su3s2 susi1 suž4 2s1v s2ve 3s2vy 2s1w 2s1z są3 4s3č 5sė 2s1š 2s1ž t2a 2tab ta3kr ta5s 2tat taura1 2tač 2t1b 2t1c 2t1d 2teb 3tem te4o te3t2 2t1f 4t3g 2t1h t2i ti4gr ti4k3l 3tin 2tip 4t3j 4t3k t4kl 4t3l 4t3m 2t1n t2o 3toje 2tolį to3s2 2tow 2t3p t4pj tp3lū tp4r 2t1r 4trio t2riš 4tro 4trą 4trų 4t3s4 tsi1 tskri1 4t1t tua4 3tur 2t1v t2vo 4tvėj 2t1w 3tyd 2t1z 2t1č 3tę t2ėm t3ėmu t3ėmę t3ėmė 2t3š2 2t3ž u1a2 u3ai u1b u2bj u1c u1d u1e2 u1f u1g ug4r ug5rio u1h u1i2m u5in ui2r u1j u1k u3kl uk2le u3kr u3kv u5kų u1l u1m u1n u2o u3or uo4sl u3p up4l up3ro u1r urk2 ur3kl u5ro1 ur3s2 u1s u2s1al u3sl us3la us3le usva1 us3ve u3t2 uto1 2utr u1u u1v u1w u1y u1z u1ą u1č u1ę u1ė2 u1į u1š u3š2l u3š2n uš2v u1ų u1ū2 u1ž uži2m u3žl už3v už1ė2 3va. vap4 va3t 2v1b 2v1c 2v1d v2e 2vep 3ves 2v1f 2v1g 2v1h viesia1 vi4s5k vi4t3r 2v1j 2v1k 2v1l 2v1m 2v1n 2v1p 2v1r 2v4s 2v1t 2v1v 2v1w 2vydau 2v1z 3vą 2v1č 3vė 4vėp 2v1š 2v1ž 2w1b 2w1c 2w1d 2w1f 2w1g 2w1h 2w1k 2w1l 2w1m 2w1n 2w1p 2w1r 2w1s 2w1t 2w1v 2w1w 2w1z 2w1č 2w1š 2w1ž y1a y1b y1c y1d y1e y1f y1g ygia1 y1h y1i y1j y1k y4k3l y1l y1m y1n y1o y1p y3r y1s y4sk y1t y1u y1v y1w y1y y1z y1ą y1č y1ę y1ė y1į y1š y1ų y1ū y1ž 2z1b 2z1c 2z1d 2z1f 2z1g 2z1h 2z1k 2z1l 2z1m 2z1n 2z1p 2z1r 2z1s 2z1t 2z1v 2z1w 2z1z 2z1č 2z1š 2z1ž ą1a ą1b ą1c ą1d ą1e ą1f ą1g ą1h ą1i ą1j ą1k ą1l ą1m ą1n ą1o ą1p ą1r ą1s ą1t ą1u ą1v ą1w ą1y ą1z ą1ą ą1č ą1ę ą1ė ą1į ą1š ą1ų ą1ū ą1ž 2č1b 2č1c 2č1d čeko1 2č1f 2č1g 2č1h čin1 2č1k 2č1l 2č1m 2č1n 2č1p 2č1r 2č1s 2č1t 2č1v 2č1w 2č1z 2č1č 2č1š 2č1ž ę1a ę1b ę1c ę1d ę1e ę1f ę1g ę1h ę1i ę1j ę1k ę1l ę1m ę1n ę1o ę1p ę1r ę1s ę1t ę1u ę1v ę1w ę1y ę1z ę1ą ę1č ę1ę ę1ė ę1į ę1š ę1ų ę1ū ę1ž ė1a ė1b ė1c ė1d ė1e ė1f ė1g ė1h ė1i ė1j ė1k ė4k3l 2ė3l ė1m ė3me ė1n ė1o ė1p ė1r 2ė1s ės3l 2ė3t ė4tr ė1u ė1v ė1w ė1y ė1z ė1ą ė1č ė1ę ė1ė ė1į ė1š ė1ų ė1ū ė1ž į1a į1b į1c į1d2 į2e į1f į4g į1h į1i į1j į2k4 į2l į2m į1n į1o į4p į2r į1s įsi1 įs3l įs2m įs2r įst2 į2t2 į1u į2v į1w į1y į1z į1ą į1č į1ę į1ė2 į1į į1š į1ų į1ū į1ž 2š1b2 2š1c 2š3d2 š1ei še2v 2š1f 2š1g4 2š1h 2š5ist šiuk1 2š1k2 2š1l š2lij š2lu 3šly 2š1m 2š1n š2ne šno1 šo2r 2š1p4 2š1r 2š3s4 šsi1 šsikap1 4š3t2 šu4š 3š1v š2vi š4vyd 2š1w 2š1z 4š3č šė2j 2š1š 2š1ž ų1a ų1b ų1c ų1d ų1e ų1f ų1g ų1h ų1i ų1j ų1k ų1l ų1m ų1n ų1o ų1p ų1r ų1s ų1t ų1u ų1v ų1w ų1y ų1z ų1ą ų1č ų1ę ų1ė ų1į ų1š ų1ų ų1ū ų1ž ū1a ū1b ū1c ū1d ū1e ū1f ū1g ū1h ū1i ū1j ū1k ū4k3l ū1l ū1m ū1n ū1o ū1p ū1r ū1s ū4s3k ūs3l ūs3t ū1t ū1u ū1v ū1w ū1y ū1z ū1ą ū1č ū1ę ū1ė ū1į ū1š ū1ų ū1ū ū1ž žant4 žants5 2ž3b2 2ž1c 2ž3d2 žen1 2ž3f4 2ž3g 2ž1h ži3mu žio3 ž1j 2ž3k2 2ž1l ž2lu 4ž1m 2ž1n 2ž3p 2ž1r 2ž1s žsi1 ž4sk ž4s5l žs3t 4ž3t2 ž2u žu3s2 3ž2v ž4vi ž3vo 2ž1w 2ž1z 2ž1č žįs3 2ž1š 2ž1ž",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=1546,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-lt.rme b/Master/texmf-dist/tex/context/patterns/lang-lt.rme
index 7def4fe7242..e345e46cf9c 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-lt.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-lt.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Lithuanian Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8
% in October 2008 by Mojca & Arthur.
@@ -44,4 +48,4 @@
% any changes. Even more, changing lefthyphen and righthyphen to 1 requires
% to review and maybe rebuild the patterns file.
%
-%------------------------------------------------------------------------------ \ No newline at end of file
+%------------------------------------------------------------------------------
diff --git a/Master/texmf-dist/tex/context/patterns/lang-lv.hyp b/Master/texmf-dist/tex/context/patterns/lang-lv.hyp
new file mode 100644
index 00000000000..e1eb79d37ef
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-lv.hyp
@@ -0,0 +1,8 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-lv.rme
+
+% used:
+
+\hyphenation{
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-lv.lua b/Master/texmf-dist/tex/context/patterns/lang-lv.lua
new file mode 100644
index 00000000000..d63ee573eb7
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-lv.lua
@@ -0,0 +1,36 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="lv",
+ ["source"]="hyph-lv",
+ ["texcomment"]="% Latvian Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part if hyph-utf8 package and resulted from semi-manual\
+% conversions of hyphenation patterns into UTF-8 in November 2008 by Mojca &\
+% Arthur.\
+%\
+% This file is available under the term of the GNU GPL, version 2.\
+%\
+% Source: Latvian Lingucomponents for OpenOffice\
+% Homepage: http://sourceforge.net/projects/openoffice-lv\
+% File: hyph_lv_lv.dic (version 0.3, 2005-09-14)\
+% Author: Copyright (C) 2004-2005 Janis Vilims, jvilims@apollo.lv\
+% License: Lesser General Public Licence (LGPL) 2.1 \
+%\
+% \
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnoprstuvzāčēģīķļņšūž",
+ ["data"]="d4z d4ž a2i a2u i2e e2i u2i i2u o2i o2u e2u .vi1s2a. .vi1s2ā. .vi1s2i. .vi1s2os. .vi1s2u. .vi1s2iem. o1pī ū1rē i1ta ū1ga ē1žu ū1to ā1ni i1rē i1čo ā1bu o1mī o1kā o1či ā1lo e1čū o1ļā e1la i1šo o1bi ē1cē ā1ru o1si u1no e1hā ā1nē e1bū i1ru o1sū a1ča ā1ča o1rē i1ke o1ra u1te i1zo i1gi ē1ma ū1ķe ū1ca o1dē a1nā ā1ge e1či ū1bē ē1tā ā1fi i1zi o1lī e1še e1gā i1fo a1ņo u1to ī1zē ū1gu ā1ša i1ķi ū1nē ī1ma ā1te ē1kē ū1mā u1zu o1sā ē1bu ī1ga e1di ī1te a1ļī e1tē i1že o1fo ā1pu o1hu ē1do o1du ā1ma ū1mi e1re i1ha i1be e1lu ā1ja ū1ta a1šū a1da ē1cī i1bu a1pī u1ņā e1zu ū1no e1nī i1no e1mā ē1ļa ū1pā ā1be ā1mo ī1ja e1ji ī1re e1ce ī1ri ī1tī ū1ni ī1žī i1ži a1fī a1be e1šā e1ķo e1pū e1ļī u1ģi ē1tī a1ci e1jē a1zī o1lē u1ga ī1ci a1ke e1ho i1nū ū1šī e1si e1bo o1ģē u1ņi u1sē ē1bā o1ša ū1ro ē1ce i1zī i1ve o1ļu i1dī o1ku e1vē a1ri u1sā i1pā i1dē o1pū ī1vī a1me ē1ze ī1bē u1ķe a1bē a1ja ā1ļo a1jē e1fe o1pu o1to ē1vē a1ki o1mā o1lo a1lo ē1ķi e1šē ū1dī ū1cā o1zo o1gū o1gā ī1tē e1zē ī1le e1gī ī1na o1me e1po e1fu a1ģe u1rū u1ri ū1jo e1dē a1ļa a1žā ī1ļa ē1ne a1zū ā1vē e1so o1mi o1šo ē1sī ē1ļu e1ga i1pē e1vu o1ru ē1ju u1či ā1va a1hu ī1sē e1ķa i1rā a1čā ī1ki i1ti u1cu i1žu ā1jo u1ki u1mu o1ķī e1ma ī1ļo ē1de o1čo ā1ču i1ņa u1ļa u1mā o1he i1lī a1de o1fa ē1ro o1sī ā1ri ū1ti o1bē a1jā ū1zu ā1vī e1ļe o1ņa ī1de ī1še a1kū ū1ja o1dī e1ži e1ri ī1gā e1ki u1ze u1ma i1vī ē1pī u1lu e1ti o1čā a1ķi ū1zē a1ļo i1či o1ke a1ģu i1vē u1ču u1ca u1vu o1ļa i1ri o1ņo u1co a1rā o1jā ī1bi e1čī ē1rē e1kā i1pi a1ka ā1vu ū1ža e1mī e1vī o1gi a1pē ū1zā i1cē e1va o1nī ī1ru e1pā a1ce ē1kā o1ja a1hē a1bo ū1mu ī1ve i1nā i1fi o1va u1žu e1ģi ē1nī i1li i1ņo u1la ī1ģe e1ca a1tā ū1zi a1bū ē1pē ī1su ī1pā ī1zu ū1di e1lo ā1mā e1ci a1ža ē1to e1rū ā1la u1ķu o1ģī ā1pa e1lū e1sī e1bē i1co i1ķē a1šo ū1ku u1šā o1di a1ņa ī1pa o1pi a1žē a1si a1ha u1šo ē1mā ī1mo ā1žo ū1lu e1žū o1ķi ā1vā a1žo i1zā a1ku o1zi o1dā e1cu ī1no e1zi e1jū ā1ņo i1ce ū1lē a1žī o1mē i1bī o1re e1zū ū1ra a1gi i1lē ī1bā ū1šu e1bi i1gū ū1ķi ē1va ā1to u1ce a1pū ā1gi i1ķe ā1kā e1ķī ē1ža u1ve u1vo ē1no o1bu a1tī e1fi e1ļo ū1ži a1tū ī1ti ī1la i1ho ē1gi i1fū a1tē ā1ķi a1mi e1ra u1ja e1me ī1bu i1pu o1la a1ķī u1šu o1ža a1rū ū1ļa e1ču ī1lo o1nu ā1jē a1dā u1rē u1rī ē1žo i1mā a1zo o1žu ē1da ī1co ū1zī ā1sa ē1šu ū1po i1si u1zē ū1ri u1zī ū1gā e1pu ā1du e1cē ē1ji i1bi ē1rā i1ļi u1nu i1ki a1mū ī1ni ā1fe ē1ca ā1ņi u1go a1nu e1nē u1ku ā1ži ē1go e1če ē1za ā1čā i1ģe ī1go a1go e1bī i1ze e1šū o1kē o1pē i1na ā1ra ā1jī o1za e1zā a1lā e1ņē a1je ē1si ā1bo u1gā i1sē u1ši u1bī a1vā e1ko ā1šu ā1ģē i1mo e1ļā i1tē u1ļā a1ņē u1na ī1vo ū1me a1hī ū1ka ā1mī ā1lī ū1tu e1je ī1vā a1ba ī1dā ū1ko ū1cē ā1nī a1ļē u1ju ā1žā ū1mo i1ge ā1pā e1lā i1ķī a1sē e1ni a1ma a1tu i1kū a1bi i1jī ī1ķu e1fā u1ta ē1dē a1gā i1lā i1ņi e1ļa ē1ti ā1bi a1ši a1lī i1ja e1mu o1hē u1jā ū1ša i1sā u1po ā1cā a1se o1ņe u1fo ā1sū ā1bū o1co o1ķē ā1ļa e1že u1tī ī1ku u1ķa u1zi e1do i1so o1fi ē1sā i1pī ī1ši a1dī ā1ti u1ņo u1pa o1ka o1cī i1pe ī1mā ā1pē ā1pī ū1pē o1bū e1ķē a1mē ā1rū o1de i1ķa o1šī ī1gu u1bi ā1ka ā1nu u1ži u1so ē1ka ā1le ē1pe u1ļī ī1me u1dī i1žā i1du ē1ra o1vo o1fā o1so ā1ļā e1dā ā1gu o1bo e1hī ā1ģi ā1čo a1dē u1di ī1se ē1sē ā1nā a1nī ū1rā o1hi o1šā i1lū ē1lē i1te u1še ī1tu u1ģo e1ši ū1ba e1ņa u1si ē1zo ū1kā i1gu ū1da i1sū o1bī a1mo ē1gā ā1ve u1bē e1ņo ē1vo ī1mī u1ļu ā1tu i1cī u1fa ā1tā ē1gu o1ga i1mi i1fē i1ļe ā1co u1žī i1zē i1vu a1ju i1ca ī1ču ū1re ē1bi e1ro i1fā a1he u1mo i1jo e1bu ī1ro a1te ī1ģi ā1di i1bū u1ļi u1le a1na e1tā e1bā o1tū ū1ze ā1fu ī1be a1pā u1de i1dū e1ve ī1di a1vo u1lā e1pi u1dē ē1dā o1jo i1žo ī1ķe o1nā e1mū ā1zā a1ro ī1rā a1že u1je a1ti ū1cī i1tī ī1vi ī1jo e1co i1tū i1bo ū1pe e1tū o1pā ē1se a1ļā ā1ji a1čo e1za ā1mē a1žū e1šo ī1ļu ū1jā o1su e1ja o1ta e1lī o1ze ī1vē o1vā a1vī i1kī ā1zī u1ha ī1pē i1de o1nē ū1bī ē1tu a1ži ā1žu o1ņā o1ļo i1ņē u1ci ī1ca ū1sa e1rī i1bē e1ne a1šī u1gi ī1mu a1zā i1lo ī1cē u1lī e1čo a1bu i1nī ā1dā ā1tē ā1ko ī1šu o1ģi a1ta i1la a1va a1še a1hi a1ca e1be e1žē a1su ī1dī o1da e1ģo e1ņu e1pa ī1jā e1sā a1ņi ū1so ī1nu i1vo ū1lo ī1nē ē1mī ū1cu o1žē ē1jā ī1cā a1ču o1zū a1lu ā1lu o1ņu a1vu i1tu i1ķu i1ķo i1ko a1fa ī1pi i1go i1me a1fi e1sū ī1ju o1pe a1sī a1nē ū1že ē1ve i1po o1zē a1ne e1sa a1lē ē1ša ū1gi ē1lā i1mū u1vā ū1mī ū1mē u1ro ā1po o1ju i1fu i1jē i1ga ū1tā ē1lu ū1sā a1gū ā1bā a1la o1ri ē1šo ū1ņa o1fē e1li ē1ko u1va ī1šo a1zi e1dī i1da i1šī i1hī i1ne i1šu ē1ku e1ņā o1na ī1ža o1ča ā1fa o1tē ī1dē o1tā i1hi ē1mu ī1so e1cā ā1zi ī1cī u1šē o1no ā1ņe u1bu ū1gē o1ve a1ģī i1lu i1pa e1ka ā1ci u1ķī o1sa o1go i1nu ī1žo i1sī o1fī a1pu a1du ī1ļi o1ba i1fa e1mi o1cu u1ža ā1mi a1ķā i1ču o1žū ī1kā ā1ķe u1ģē e1da ē1dī ī1čo ū1pa ā1de o1ma i1dā ē1ņo ū1žu o1ko a1vē ā1zē ā1sā ī1do u1cā ī1ļā u1du e1ju ā1si o1vē i1ša u1fe o1ji ē1re ū1ļī u1ņa ā1ca a1šu ū1nu ū1le e1ķi ā1tī o1ge i1vā ū1za ē1nā ū1ma ā1ķu e1lē ā1sē ā1li ī1ne i1mī ā1pi a1mā a1žu i1ju ē1vu u1nā ū1ru e1vi a1pa i1bā o1cē ā1lē e1ku u1lē i1se e1vā ē1jē e1pī ē1ci o1ši a1hā a1kā u1ji ū1rī ī1sā i1ro o1rā ū1ki o1ro e1ru o1kū ē1su a1ņā ū1tī ā1ba e1ņe e1nu ē1te ā1vo a1sa e1nū ū1žī o1že ū1do ē1jī ī1vu o1vi u1ba ā1na ī1mē a1ji u1ti e1mo a1ra e1hi o1te u1bo e1su i1fī ē1pi i1ģi ī1ņu ū1lī ā1ro o1zā a1vi o1ni ī1za o1do ī1zā o1gē u1zū u1li u1da a1či e1ta i1ra ā1ķa a1jū ī1ba a1cē u1ra i1kā i1zu ē1nu a1šā e1to u1gē ū1pī a1ho ā1je ī1ķa a1ve o1šu u1čo ī1mi u1sī a1dū e1cū ī1rī u1ko ā1ķī ā1zu ā1mu ī1sa ā1ņu u1ka i1ba ū1vi ē1ga ē1ģe a1rī u1ša u1cī a1co ī1cu o1vu i1je u1do o1cā ā1vi i1jā a1ze a1mu o1ņi e1ža o1čī i1ča i1mē ā1cī ē1la e1dū ū1nī ī1po ē1ļi ī1nā ū1be u1se ū1ci ī1ņā ī1ke ā1cē ē1sa ē1li a1ģā u1pe ā1ku a1bī u1pu o1ca u1ne ī1ļī u1mi e1du i1ļu u1pā ī1ņa ī1pu u1be o1ču o1šē ū1šo ē1me a1ķa u1zo ē1zā ū1ce e1tī o1ķu ē1jo u1tū ā1cu i1vi e1žā a1jo e1jo ū1bi u1nī ā1ļu e1zo i1ma u1vē o1jū o1ha ū1pu e1ša a1ru a1li u1mī ū1ve ā1pe i1cu ū1nā ī1sī e1pe ī1zī i1rī ī1pe o1po ā1rē a1ņe ī1gi e1žī ī1lu i1su ī1tā a1no ī1ži a1sū a1ko i1žē u1jo i1va ī1ji a1fe o1pa e1rē e1šī ē1cu i1šā ū1žā e1ģe ē1cā a1po i1tā ā1ne ī1va e1se ī1ra o1gu ū1de u1dā i1di u1rā ē1nē a1to e1fī a1so e1ze ē1le o1mu ī1ta e1ļu a1zē ē1ķē o1ģe e1na ū1vē ē1du u1žo i1nē ī1si i1ka ī1fe e1no i1le e1pē e1ģē ā1go i1ni e1ča a1čī ē1be a1ša e1gi i1mu ē1bē a1čū ī1šā a1bā ī1du o1ci ē1bo ā1ki o1mo ē1lo o1lā o1le a1gī u1kā ē1vi ī1lē u1čē ē1mo a1cī u1ča ī1to a1fē u1ķi e1fa ī1ša o1bā a1ļi ī1da a1mī i1gā a1ģē e1cī ā1ta i1re ā1me ū1dē a1re ī1li a1ga o1tu u1pī e1ha ā1ķē e1tu i1ģē e1kē ā1bē o1čū a1zu ū1sē ū1ne ā1ga ū1vo o1ho ē1ļā o1rī ū1ju o1fu ū1ji o1lū ā1do i1to u1bā u1ge u1cē a1le u1ķē ī1ce a1ķu ā1ze e1šu ē1ja a1vū i1ņā ē1na o1ne ā1dē ā1ģa u1su u1sa ē1di ū1su e1fo ē1ni ī1pī i1ku ē1pa ē1po ī1zi i1ļa i1ši ē1lī ā1no a1jī ā1gā o1zī ā1dī o1ļi ā1rā ē1zi ū1pi ē1ge o1mū i1kē e1gū u1gu i1zū a1gu a1lū i1cā ū1lā o1ķe o1se ē1vā ē1ru a1fo e1sē ā1re ā1lā e1ļi a1ņu e1jā ā1ža ē1zu e1ņi u1pi ē1mē o1ņē o1ti u1pē e1zī u1fi e1ķe ā1jā u1vī ī1ņi u1žā ū1li e1de o1be ē1zī e1hu e1he ī1lā u1tē e1nā a1sā ā1se ē1ļo a1ģi ī1ze o1je ū1te e1kū o1li ā1ce o1vī i1ci ā1so e1ge i1še a1ni i1do ā1lū o1žā o1še o1zu a1cu e1mē e1gu ē1ta a1do e1ba ē1ģi e1žo ā1gū a1za ū1la ū1ķī a1pi ī1nī ū1šā i1šē o1ļe ē1mi u1zā i1ķā ī1ko o1dū ī1ķi a1ķē ā1su ī1lī e1čā ē1ļe u1za o1ži o1fe ū1tē o1ki ā1za e1le ē1bī a1di o1sē ī1žu ī1bo u1me a1rē i1ļo ū1si ā1sī u1ni ī1ka ā1ļi o1tī ā1šo u1tu e1žu i1ža o1lu ē1rī ā1ju u1šī a1ķe ē1so ā1da ē1ba ē1ri o1ce ē1ki i1ļā a1pe o1šū u1ļo ī1zo ē1rū e1go e1te i1za e1vo u1vi i1fe i1ņu ā1zo ē1zē o1jē u1re ā1ņa ē1pā o1žo u1nē u1ņu ū1du a1ļu u1mē ē1pu u1lo i1ji ā1rī ī1rē e1rā u1ru a1cā o1rū ū1na u1ģe ū1dā u1tā i1sa at1tu eg1rū ak1so it1de eb1lā et1vī or1bi al1ša ap1dū ak1na um1ci aš1le ēr1ķe en1ku il1ki ēr1ku at1nā at1ģē us1pē os1vī os1ci an1ra en1pa ej1dē až1vī as1bu īs1ga iņ1di en1to uj1me or1ki el1zo ot1nē es1ko uz1gu ak1ti īr1ni iz1hi il1pu es1ma āt1vi ag1rē on1zē īb1tu ap1do īt1vī ul1sā īk1lī ur1so ok1tē ēb1tu īs1la et1ve al1mo op1ša en1ce im1nī uš1ķa ek1ti iz1cī er1di ur1fa an1tā er1ba as1pe al1su ip1so al1cī at1de aņ1ra ēk1šu īg1li om1ni oņ1ka as1le at1ņi id1rī un1ve al1kū in1da ār1ba īs1žu al1ka up1jī ur1gu at1sī īg1mā āl1ti al1va uļ1ku ok1rē er1gi uz1ļo ak1šē īm1re iz1te āt1vē ēg1ni īg1ru il1cē ir1mu ar1ku ot1zi ub1na an1če om1bī ēg1si el1le av1ru il1nu ēs1te ur1kā ik1ro ep1nu ur1vē oņ1lu it1ma il1ja ēj1tē an1ga eš1pa āl1ce ob1rī ur1vi up1ri ēz1tā iz1čo ap1ša uz1ru ut1rē ar1to ež1nī aš1ļu aļ1ce al1ne is1sī ib1šo uz1nu ut1ņu ul1de ār1ho am1pū ēl1gu um1vi ik1to ēr1ze ož1va ez1nī am1lī ak1se el1ko ep1si āj1tu um1zā at1ja al1ķī az1dā or1to ec1he at1cī en1ko ūs1ki īg1sa ef1ri ār1sa im1po īt1rī ed1vi id1sē ā1džā up1la ēc1te es1pu uk1šo āp1ni ā1dži ak1la en1na as1ka ām1di ag1li og1rā ag1dā oz1vi an1ku īk1nē us1mū er1ma āb1ša in1tu ob1ti ap1cu es1vā ac1ti ur1pu ar1kī el1la it1ta am1le ik1se ēk1ti ar1sa is1mu ut1ķe ār1vī u1dži et1nā id1ka āl1se ur1na ār1zo uz1li ān1ka as1ve ab1la aņ1ķe ēb1tā el1vā al1žu at1pū at1go ēr1la e1dzi iz1dē ab1se at1žē ir1ca ēr1su uļ1ma el1pe ej1ve ap1ve īg1rā el1po ed1lo it1mo ep1nā uk1tu at1šo ap1šā ār1čo ak1sē ek1tē om1pe ul1go um1dī ec1si ēd1vi um1mā iz1mo ok1zā āp1ro āl1ko āl1vē ed1po īl1zi of1rē ēj1lo ap1sū ip1šo is1pu in1fe ep1ra at1ša or1ga on1gā ak1šu at1jo es1pa uz1ša ār1su uz1be ik1sī en1ša ok1te ok1bu ur1ša or1ģe īn1ta ap1ģi iz1zu im1tī ap1te on1nā us1jū ur1no ab1ti en1jū op1so eņ1no ur1ka an1šo ol1le ūs1mo ās1tā ek1tī uz1sī iš1ķā um1pā is1po ob1lē ap1za ek1do ez1mē ēd1la uš1ka of1ri en1hī āf1ri uk1nu iz1do ej1ga ul1ri iz1fi ir1na is1ka ār1do en1šo ož1ma ēs1tī at1sā um1la oš1pa eb1to ez1ņi ej1ka iv1žu uņ1ģu ik1na il1ko ol1mu im1si ap1ta os1tu us1tī at1ko ar1ci iļ1do un1či oš1si en1zā ir1zo i1džā uz1ba er1vē ip1ni il1zu in1pū or1hi iv1de os1mē uz1pū ām1pi os1tū az1bē al1de on1de uz1ce em1ba ēr1ļu at1nē ār1tū ur1cu ir1ku āv1da īp1ri op1rā ej1ni am1dī ak1va ek1pi up1ve ūt1ma un1tā aš1ma āv1ja um1ti ūz1mā im1te ev1rē on1ti ig1za iz1gū up1rā id1pū ār1cī ār1lī el1lē us1ga ez1da ap1cē ej1la ag1da uz1va op1sē āģ1ve el1to ēz1kū eš1vi uz1vī ī1dze is1mē ef1rī ab1ša up1ma ār1nī aš1va ab1ri ob1tā ik1sā is1mī ag1ša ūr1ka āņ1mu ev1ni or1da em1ze āj1lo at1rū al1re il1cī ār1mi et1ma um1da ob1le āp1tu el1pā iz1ķe ez1tu al1tī ap1rū iz1ta em1ža ar1gi ēv1re as1kā až1kā eg1ta al1gā ap1le ap1ro īv1ni op1ka ik1vi il1tī ur1pī ir1kī iņ1ne iz1da op1re ēl1ni is1nu ar1cē ed1sē ul1ka ās1ma op1ba os1fē ak1le eļ1mū ēb1šu aš1ra uļ1pu oķ1vā ār1šo am1di ār1žu ed1pu ed1ve en1re ūk1li uš1pi ep1ta al1ve ad1ma ez1ce ēg1tā ud1rī im1bi ek1ra iv1jū ez1bi iz1me uļ1tī if1rē ap1ku id1ni og1rē ēj1de op1ko iz1tī un1ci īt1ka ēj1nī ēr1pē oš1ļa at1zu īv1ga os1na og1ga es1lu āt1ko az1va em1zi as1ke an1si iz1mi er1vā ep1sē al1sā us1cū ul1sa en1ta or1vē ek1tā uz1žo an1ma i1dzī ij1ku id1la ēp1ta ēļ1ko ur1ti ap1nī ot1re eš1ņu un1de ār1vē uz1ģī er1mū o1džu oš1ni ij1kā al1lo ig1lo er1rī em1pu ug1ļo ūš1do ip1ša ūs1tā oš1ba al1lē eš1da uļ1ļā ār1sū in1de em1to ās1tu ol1fi or1mā iv1pu aš1la ec1ho ār1za ar1ka ub1sī ap1zi ēp1to āk1tu er1te ur1zu īm1ka on1ju ap1go us1lo or1na og1no am1dā ār1ta ēl1ne er1cā im1na uz1zā ār1no aj1ci ip1tā it1ļu ag1ri ār1bū os1po ēņ1da an1kū om1bē ār1ve aļ1ģe im1ti al1ti īņ1ni in1na ep1la uz1di iž1me al1tē in1si ed1ma or1tu em1ta ug1si er1be us1ra il1mu ār1ga eb1lo īr1rū īt1re al1la et1vi el1di ār1ži iz1ca ad1da ēn1mī ut1sa ol1po ez1ra ir1šā eg1šo ud1pu ud1lē uk1sē on1vu em1pā ēk1bē ār1dē en1zū āj1re at1lo ez1ni et1ka iv1ji in1ku or1bī ok1ti al1si ur1zī ūn1ga ēr1pa am1bi at1ro ēr1bu iz1ķē ip1sē uz1či ir1du uh1tā er1bā ik1ga īš1ķi iz1rū it1da ok1ņu ēg1ta ir1lo an1ka in1dī es1vī op1ma um1sī on1pa em1pī ūk1ko el1tī uz1me er1vī ūz1na eg1ru it1ga us1du īt1ņu ep1lā ur1va um1zī īd1lī o1dži ār1bu ak1tā er1ta ēr1no ēr1pā um1bi en1ca oņ1cū ēj1mu at1pī ēr1gā ip1re ār1vi aļ1ķo et1ni ir1gū āp1ne ir1su āt1me eb1tu in1cē aš1ķe ip1ro om1da ep1tī ef1ra ū1dza ēt1ku ub1li az1be ūs1ka us1pa ar1su uf1li ūr1vī īs1za af1rē uz1ņa e1dža iz1bē ūt1di en1nī eļ1ķē es1ku az1da īg1ra iz1gā ar1ķī er1šu ud1ka ed1ri op1ra ap1li ap1dī ed1la an1rī en1tī āb1šo an1cū ēj1da es1tī er1ko ūg1ta el1zu in1ne er1bi ig1me ež1ni ad1mi aj1ni el1li ik1šu āl1pu ar1ga et1ta īc1še uz1zu om1bū un1ku īb1ni ar1ža ēt1ni is1tu un1ze aš1di it1ni en1zē en1ģe er1pe uz1zū ul1si ur1ca ap1fa is1no iz1ķī us1vi in1ho og1ļu ūs1nu er1ga ir1ze ēl1re ēs1li em1ma if1ra at1mē ur1rā at1ho ob1ju op1ro ip1li ec1mā er1mī ak1mu es1sa īk1lo u1džē ur1fi id1ko ār1ņu uņ1ģa īk1li iņ1ķe as1kē il1de ār1kū ul1bo ez1no en1mē ab1ro uz1gū ek1ņu ož1ņā at1ku uk1sa uk1lo ar1do ak1tu ār1du ik1ci al1du en1pe al1vī un1ti ul1le os1cē ec1sa īk1ti ār1dā ēb1ju ap1ču ub1rā iv1pa os1ma oš1ķe aš1pu um1pē ēp1tā ek1si īk1ļu uļ1ķī ūš1ka al1pe īg1nā uz1pā āt1rā īg1nu ik1lu āb1tā um1ji ab1so og1le ir1te īb1tā il1do em1zē ar1ģe ot1ve ap1gū id1vā ār1de āt1ne ēt1sa ad1do en1ja er1na ēk1li iļ1ņa uš1ki iz1nē oz1va ez1go us1bā ut1ri ur1lu ib1re ej1te ok1ho en1zu eb1rā em1tā ed1mā ah1ti em1ti um1sā az1tu ur1sī in1go ār1di ap1ņo īs1cī al1bi as1ni ek1se al1li uk1na al1nē iz1mē er1ce ūs1mu al1tā ul1fā ēk1lo az1ga er1zā ir1gu ig1rī en1dē eč1tu ep1ļa ēk1ta uz1dē ur1su īc1ku it1bi āk1kā āp1tā eļ1ce ed1rā ib1rā er1mi āb1rī iļ1ķi or1mē em1pi os1vā as1zo af1rā ež1pā ūs1nē ān1ve eļ1ķi oš1ga il1žu en1va īt1ra ak1ri up1tu ad1ka eļ1zī ir1nē ec1ve or1mu iz1mī īš1ļa ab1ve er1ri ū1dze ūz1ni in1ka īķ1sa ud1pe us1mē iz1rī on1rā aņ1kā at1ze āl1re em1ja im1sē īk1lu ek1va at1bī is1lā os1pī ār1jā as1mā ol1nī īg1ti em1po īg1tā ed1va ar1da or1po us1ni al1lā os1ti eg1da uz1bā ūt1rī ag1ni iņ1dē iz1zo is1me at1bi az1ti og1ra en1la at1do ap1zī am1ga us1ti oš1ķi is1tā at1la ēj1ti e1džā ec1ka or1ķo iz1pū uļ1zi er1de uk1ļu eh1ni ēg1to ēl1si ēc1nā ap1pā āl1no ar1hā at1gu ob1ļa ap1bo uļ1ķi uk1lē es1bi ar1žo iv1co el1mi ēr1ci ik1mē ap1da uz1ķī im1pu īk1la ag1ru iz1dī er1ņa at1ņu or1pi ēp1ni ūt1ņu eš1ta ar1ta un1ga oš1ļi eņ1ģi an1tē at1si or1te iz1rā ol1vi iv1cī aš1ko ām1ri āz1tu ek1sī ūk1tu ēk1ļu ir1sā el1ku ek1su aš1ļi iļ1ņu iz1si ir1gi at1ha ar1tu em1bu āt1sa ek1ļū en1tā iz1šu as1po ir1ta ab1re it1le ūk1pi uņ1ne aš1vi ām1pa ār1sē ok1si og1pa ut1rī in1ji ig1no iž1ļa ēb1ni uk1ma ēp1šu ol1vē ēz1ta am1kā ed1fo āp1ra ir1ce ul1li as1no ēt1ra on1ta ur1ņi ur1bi iz1cē us1ki eb1ša ož1me an1gī āv1ji ip1si ur1nē ak1ša eņ1ku ab1li il1vī is1kē om1pā ir1mī ip1lī ēn1mā ēr1šā āk1da el1nā ul1pe iš1ļo ēj1pu āl1lī ud1ko er1vi ak1tē īs1ka ag1tā ī1dzī at1vu ar1mē ar1sē eb1lē od1kā ūr1vi ot1ņu en1da az1du āt1nā oņ1me āl1ba eb1šo uz1mā an1zī ag1lī ot1bu il1po ēr1ķa ur1cā ej1bo az1ze iz1žo op1ļā īg1šu ēs1lu at1mā eg1lo īt1ri ir1tu ek1sā ik1ta eg1lu ur1vā un1bē uz1mū ež1zi eg1tā or1ma ob1ga av1ko el1ba ā1dzi at1ģi āg1ne ēr1za ed1rū iz1hu aš1ņa āb1si uz1ni et1pi āz1vā u1dzi en1tē āt1re ūv1no um1su iz1ci at1ra uz1ri or1ta āk1lu ik1po āš1ķi ār1pe ap1ķī uz1bū uz1pē uz1si ir1ža an1gā ap1šū i1dze at1ju at1fo is1ne ez1rē as1gā al1gu as1ti ūš1ko es1tā al1jē in1ša ab1le i1dža ēp1ja eb1ļa ub1le ab1tu ād1mi iņ1ķo ā1dža ek1li un1li ek1mē ok1lī ēr1pi ēr1pu iļ1la ep1ka em1li ez1na id1ma až1ne ir1re ēt1di am1zo ūr1fo ež1ga im1to ūp1nī at1du im1tā ūg1šo en1si al1ge al1dē eļ1ļa ap1vī ār1cu ež1ģa iš1re ār1ne ul1je ar1mī oš1ka īn1va ēr1ma ok1nu om1ra ap1jā us1ce un1mā ek1ši ob1lā ēr1sā et1ne uz1de il1bo it1pā ar1tē ed1ko ol1vī ot1rī us1se ēt1ti iž1ļu īz1de en1sā is1la ik1te ob1to ag1lā it1ko ep1ci āg1ti ūs1le ek1lu us1mā ār1ze īs1tu ar1kū ir1de ed1jū or1fī ēt1li ūs1mā el1no id1ru ij1ko er1ve ec1la aš1mo em1zo uz1bē er1fo eš1ķū ak1lī el1lu ib1li ek1nu ir1ņu aš1nā ēl1ga em1nī iz1vi us1te is1ha on1jo az1ka ās1ta aš1ta iz1vē er1nē uļ1va ab1lē an1žu oņ1ve il1bu em1pa ob1se em1jo īv1su er1co ur1to ēg1vā in1ci ak1ļū uz1šu eņ1la ūg1šu āg1tu ūg1ti īt1va er1ka ol1šū iz1ču us1ke ur1bē āp1ri ak1ļa ūs1kā os1va er1ze ēt1nī āj1ku en1žo uļ1ve is1ķe īg1si ur1me ur1bī on1hī an1di āj1mā ep1ļē aš1ņu or1vi ad1vo az1gu uz1lū it1pi ak1šo ap1si ās1to in1te am1sa ap1šo iz1vo uz1ve uļ1ņe uz1fo uv1sa uņ1ķa uz1ta ug1ļu ek1lī ok1se ok1vi až1ņa oņ1sa ab1hā iņ1ci ug1šā ek1rū ij1pa ok1ve ap1he ut1bo el1zā or1di an1go iņ1zi ek1mī ap1bē on1gi aļ1me ab1ru ig1ti ur1be u1dže ek1vi ur1ze ūm1va um1mu aļ1bu āt1ņu om1re ug1le ez1ta am1bu at1cē ēp1ju ez1sa at1ni an1me uz1no ār1lē ul1kā ar1pu iz1ru an1ži eņ1ķē od1ni is1na em1zā ār1se at1ri it1ru uš1čo il1ve al1ta oš1vī ēr1po il1pi ap1pē is1ķē ēr1sa ār1ku oļ1še uz1pi av1ro og1rū īg1ņa ī1dzā il1ze ez1ve ūr1te on1dā up1da iz1nā im1di ul1gi az1mē ā1dze as1lē ok1ļa ak1ce ūn1ve ek1lo ok1tā ap1jo ēr1gu il1nā iz1he uļ1ņē īt1ru īd1se ak1rē āt1ro at1da iz1žā ol1tē ūt1sa as1ku īn1bū īv1si or1no ot1ce ol1de ab1pa ēr1pe oņ1ko ok1na ev1ze us1ri ip1ti eķ1tu op1ta īs1ra er1zē of1rā ur1dē ot1ka is1zi ēk1mī iz1ne ag1rī on1si ir1pē er1ni ās1vi an1za ēl1gā ap1du ek1lā ār1ņa um1pa an1fa ār1pa uļ1so ar1pe eš1ļa ēr1vi ef1rā og1la it1pē in1je ut1ma ig1nu ēr1te az1gā āl1de ār1zi on1fe on1ma ib1ta at1žu it1lī it1ra ok1be is1žē ēz1ma ār1ti er1ru az1ja ēg1le an1ni az1lē uk1ni at1lī eņ1ma ik1vī ap1be ar1ne ip1ta ap1žu az1pu ak1ra ul1ve is1pē ež1sa iv1ma ār1šu ek1na os1la ik1tē ēs1la es1la at1ki iz1lu ur1le īd1ni it1se ej1ma iņ1si ār1lā us1va us1ci if1te el1ta uz1ga ak1tū or1ve iz1ce oš1kā ēt1ru ad1rē et1ņu ik1šo oz1ma ir1ti uz1da ūm1de el1tē ēz1ti it1rē aņ1ve ap1zā at1ga up1de ās1na ap1tu āp1ņu in1tē ās1ne ap1re ir1ka uz1tī uz1go at1ļā ad1rū ir1zi īv1mā er1sa in1ti āb1ju iv1si ep1jo e1dzē el1si ij1žu an1du iz1tā il1lā ul1bā is1cī ag1vi āj1rū os1lo īk1lā āb1to al1nu āt1ki eņ1ķī ol1kū un1pi ec1re uz1ču ul1dā en1ro ir1di en1ču ul1jo ul1ce az1vē ap1jē āl1zī ūš1ļo og1ve ag1si on1su og1ca ol1gu ār1zā ig1li iš1sa ot1ru al1vā am1tī ās1te ud1rā ēt1ko uz1jē āl1gu et1me ed1ra at1cū ol1zā uz1žā ul1gā ok1ļu īv1ze at1ve en1gu um1du o1dzī up1jo ap1di ur1rū īv1mū ūk1to iz1ņu uz1šā uļ1bū ez1pi in1vā al1ja in1ve iz1bu ap1šu us1ze ob1rā ēk1me il1le ēz1to īk1de ēj1lu ar1zo ec1me ar1za ol1bu ēj1pe ul1te īd1pa al1ki en1zo iv1ka āl1te ok1no a1dze it1va ār1jū un1go iz1ko u1džo up1ti on1li iz1čā il1gā er1gu iz1za in1gi ū1dzo ur1ni um1bē ed1mu ēk1tu ār1so id1lu ar1me ir1ši ik1ša ej1za ap1ha īv1lī as1ga eg1šu iz1bā ev1ju ap1ce ar1di em1ju am1bo iņ1ma et1si āk1tī is1da id1pu iz1le et1no ul1da ur1tā em1ga ēr1ša or1mi ak1kā iz1mā ab1vē ok1pi ir1bē īg1tu ir1sī eņ1ci iz1sā uz1he eļ1ķe eb1kā in1če ar1mo ēp1šo eb1rū on1cū er1pa īg1na us1ta ār1rū is1lī ēg1li eš1re uz1hu ak1re īn1da el1de um1ja ak1nē ob1tu ek1to ēr1bē ir1ci ih1ti ov1nu al1be aļ1da ot1rā ēr1ķē ud1ma āv1ju ik1li ar1du uk1su ak1sī us1le āt1bū ug1ša ag1mā ēr1tā uz1nā uz1čī ēs1tu iv1tū un1ko er1mē or1ci un1ka īt1ci ūk1ni ār1gā oz1ta is1pi ef1ko āš1ņa ig1ni ur1cī aņ1ķī ec1ti il1tu ul1su an1jo ek1vā al1po uk1tī āj1ni ām1ja ēr1li ah1tu at1vē il1nē an1ke as1ci er1je es1nī id1gu ān1va us1fi ār1si ēd1va ul1vā el1ni eš1ma un1la al1ma un1du an1ho ul1šu el1mu al1žī el1rū ul1ci ar1ģi at1vo ēr1bi il1vē us1me at1li uz1mu av1da ēg1tu uz1ļu eg1vī ēb1to ad1ju ir1mo or1fē el1nī iž1ļi em1de ap1pa ūg1ša ul1bu ēr1mu as1vi eb1ļā as1pi ir1sū uz1vē ās1nī ur1zā ir1bo īk1da it1nī ar1pa el1do ēr1le or1fi ēt1la aļ1ļi am1bā āš1ņā us1jo eļ1ni eļ1nī us1ja in1gu ig1nī ed1ru uj1bi os1te em1va ar1lo ig1lu ak1lā un1ba iz1bū am1ze is1ti it1ne uz1sā ep1lē iz1bī ār1nē eg1la iz1du ēg1dē ān1za es1lo im1de at1hi ar1ķi iņ1ve ēr1zē uz1lā ir1vi ār1ru oš1ļu at1te at1žā un1su on1tā od1la ār1ģe ēs1lo al1kā aš1pa ūz1ne ār1čā ur1je uļ1ķa ak1ņā īr1fa es1kū ār1ši ar1ba ār1ša ir1dī id1nī uk1da uz1žu ār1va ot1ra am1do iz1ģi ep1lī em1si āl1ta in1su ol1ni ub1ļu iz1ņe ap1ča el1za ob1jā uk1tē ap1mā al1ri ot1za ir1dā av1ni ūr1mu it1mi og1ļū er1za ek1lē ūg1te it1mē oš1ņa āk1le aļ1čū ān1lī e1dzā um1be et1rī ek1sa al1le uļ1ka iv1ni ēd1mē il1dī ul1ti ot1le at1gā iņ1sē at1ca aļ1rā ab1su īn1bu ip1rī uz1ra uļ1de em1ko at1čo op1vē a1džu uz1ķi ir1ma ur1bo iz1pe em1tu āč1sū um1šo ap1ķē āl1sa as1fa ož1ņa em1dī ūz1da el1pi ir1sa āz1mo ed1ro il1si īk1na uz1cu os1pu ag1šo iv1va īd1vi iņ1ro ār1ču id1ne eg1pu um1ko uš1ķo ār1ka īļ1bā ak1ve ez1gi or1la aš1pā īg1va ir1šī iļ1li ēr1sī um1ši īm1ju ub1je ep1li at1po āl1ma am1bī iņ1ķi āj1ra as1tū eš1tū en1te īv1ma et1nī āb1pu os1ku is1tē ok1ļi iz1rē iz1ži el1nu iz1pā ul1tā oļ1ko ēv1vā os1lā or1tī āb1tī af1ro ēl1zī āl1ru an1šu us1tā or1do er1ci īs1ri ēd1ra im1da ar1be il1ku iz1mū it1rā up1ša uz1sū us1ru ir1do ur1ga ek1re al1nā ok1ni ek1šu ob1rē ir1žo ār1dī eļ1ma aš1ci il1pa ū1dzu ek1ša ār1mo il1gi uš1ņa el1mū ās1ka ēk1ša or1ķi ār1nu az1ru ās1tī im1šo um1ze īv1so ūt1nī ap1fo ag1šu il1ma īc1ga ēr1tu es1mi ūs1mī īs1ti ej1vi uz1na on1na id1ro el1mē os1pe op1lu ēc1ka ar1pā up1ci ūs1ma ag1re ūž1ņa ol1ga an1ta un1di al1ko ul1lā ir1ko ī1dzo os1vi es1lē us1ma ec1mo iz1ve az1ra āl1cu id1rā an1ža oņ1zī um1tā af1ra um1vā ār1rā ab1vī ū1dzī i1dži ēg1šu in1ža ed1ņe ec1tū or1ne eg1ma āp1ja ār1šī ep1re is1ve ol1fe op1ci as1te ār1šū ež1ku iņ1tū es1te ek1ta ēl1cu ār1na us1jē il1te āv1ra āv1ce aļ1va um1ni ak1ni ār1rē et1ri u1dzī on1tu up1le am1bē in1to ād1nī in1ta ol1ma īk1bu an1žā āb1ma ur1ķī ak1vi at1nu is1bi ol1ve og1ne īv1bi ok1lu ār1čī ug1ti īn1ra ig1to uļ1ģi ār1ma um1jī ē1dze ap1rē is1nā ūp1ko un1si il1tā ap1ņu ol1be os1mi ig1la īl1ni or1bū ip1ru ak1cī eņ1ķa ez1gī oņ1sā āz1ni ān1pā us1pu ād1ne us1po īn1de āk1ba ā1džu ur1sē at1ba āp1ti ūv1vi ah1tā ut1nē em1be ap1na ul1pa ob1je āk1ļa ib1ti os1ve ud1vi en1pā āv1ni iz1vā eg1ro op1si ap1pu am1ni at1ta ak1li es1ne uv1ju ar1rī i1dzu es1rē ob1lo es1li og1ma uš1ko an1zā ig1tu an1be im1pē ic1sa eb1ka uz1zī oš1ma at1nī am1dē uļ1ba ār1mu up1jā ār1he es1mē er1ha ēl1di ih1re op1ja il1go uv1ve ul1pu il1du aš1mi āl1ve ār1lu ez1pu at1so īs1ca ek1ni ēg1nā ūt1ro ap1ķe ab1pu iz1nu iz1ņē ēk1ne ež1jo es1po ās1no ūv1ni aļ1sa aļ1ķī ē1dzo ip1no ap1vā īk1tā ār1čū uz1ze uz1nī on1du ap1hu ez1nā uk1ļi ul1bi ad1pē at1pē ēr1zu uz1čā ēs1to aš1gā āt1no en1vē is1be et1rū āk1ta uk1tū ij1ni ug1šu us1ķi ij1ve el1šu ul1vē ēt1rī ag1ļē es1pe ēr1šo ak1rā eļ1pa ec1rī ez1lo ēk1lu el1va ār1ķi eļ1po am1pa ūt1ni iš1zi id1mē uz1dū ēk1la iņ1ta ol1tā īk1ša īt1nē iļ1jū it1tū is1pa ap1sā iz1so ež1ģī ud1ri oņ1nā am1lū iz1pē ak1vā al1te ad1ri ak1ga ār1bā ap1rī or1bē af1ti uz1du at1ši ug1tu iv1zi an1se eg1to ūd1rā os1lē ār1ri el1ga ēr1de ir1tē em1ļa us1na im1do āt1ve ur1ma ur1ģi īg1ni īd1ko ūd1ra iz1vī ed1rī at1jā il1mo e1dza ēk1to ār1ģē iļ1ņi iz1bo as1ro um1zo or1pu ar1kā ik1ko ap1ca īs1ba as1vā at1mo uz1pu ēn1ga am1ba uk1ši ag1to iz1zi uz1tu ul1ni er1lī eš1ķē en1zi at1zo ir1ša ez1si us1so am1fī ig1tā e1dzu ap1kā ār1ro es1vi ag1la ir1mē ad1ve it1di um1no ap1lā in1ga op1šo a1džā er1po uz1bī un1ra uk1ta ar1ve īn1sa ap1vi ēr1ce og1lū aš1li aš1po e1džu ap1mu ag1lu or1be am1ne ol1di iņ1ģe it1na eļ1ņu uz1lu ās1me ār1sī ur1ku ur1pe ep1na ut1na ac1da uz1le ik1ka ar1fi ab1si er1zī ār1ļu ap1ja ul1tu is1di an1ge ar1lī ug1tā on1so ud1kā eļ1ko iš1ķī um1po ik1ļa ūg1tu ār1gi ēr1ni et1va ap1lo ēr1ķī iz1tu īv1la is1ju od1ba az1ro ūs1di up1tū ūs1nī eļ1lo ap1bī um1ta īs1tī eb1rī uš1ķē ep1tū eb1lī or1že up1ra ēt1ma ak1ro ir1la at1či og1lu ūs1ku ut1rā il1no ec1de an1bā az1vi ān1ga ēj1ce eļ1ve er1zi el1sa īk1ta īt1rā ār1fe um1ka ir1si ag1ļi ip1ka ak1šā ar1ki ek1ļā ar1bā ed1da os1le iv1ja iv1kā ūk1šo uļ1vē ēk1tā oš1ņu og1de ok1ļo ul1dē ik1sa am1pē ūs1no um1to us1ču od1ka as1lo op1mī up1to oļ1ti ū1dzi īr1ma os1kā al1dī ok1va el1tu ap1pi is1ca os1ce āl1vi ir1mi uš1ķi oz1tā is1te ig1ša at1rā ar1žu os1kū im1ša ār1to um1bo an1sa aļ1ļa ēk1di āj1ka ak1tī ar1tī os1tā eg1re im1sa ul1sī ag1me il1lē on1ce iz1jā iž1ci or1ku az1no im1pā of1se op1ļē āl1ka ēs1ti oņ1de er1la ār1ņē uz1ku ab1pi ar1na em1ša er1ku im1pe in1tī es1mī īv1do uz1mo uš1mi ak1lē aļ1la up1lā ok1ta ūv1me em1žē āl1rū is1pā ar1le eš1va eņ1rā ad1ne on1ku īs1si ab1da il1lu ar1va an1ko ez1bē ež1li il1ga at1tā iz1kū ar1nu ir1mā ad1je ik1ra an1bu op1ri ik1vā ek1šē ap1ru uz1ņi iz1be at1vi it1ro ur1tē en1po ap1jū iz1ģī ol1rā ar1go ah1lo im1pa ī1dzi us1lu ir1žu at1cu am1vi ag1ti im1ju ep1ļā ec1ga on1di ān1kā is1fu at1ņē āņ1ti at1čū az1pa ik1pa ov1bo ad1si er1lū ir1bā um1tu uj1ko ež1vī ab1lo ūk1la os1pa ul1to ap1žē āv1ma ez1zo eg1mā ap1to iz1ku os1lu or1vā ok1rī os1to al1di is1lu ē1dzi āt1li aļ1li an1ču eb1la eņ1ķo ak1rū en1ri ez1be ēr1nē eļ1ņā ab1rū un1sa iz1zī až1da ūv1so aš1ķī it1kā ap1bu ē1dzē a1džo īb1šu us1lā ad1re ej1le ek1ro at1su ap1ļu ež1ci er1ra ez1vē aļ1ko og1re ur1ja er1zu ār1me av1tī on1tē at1fi ir1bi ob1li uz1jū aš1ļa āb1ra ur1bā ap1nu al1ģi an1vī on1dē ep1tē ez1de um1de up1ju īg1te od1de ok1sā at1jē ār1zu um1di eš1di eļ1mo iz1de in1gā ač1gā ip1se iš1ķē ūn1ze āk1to eš1vī ēņ1ve ap1la oņ1ni im1ni ut1ro et1de ep1pa aš1re up1ja us1pi uj1la āt1ti op1le an1nu ēj1mā as1lā am1mi az1dē am1po īk1pi ūk1tā ār1go ap1ma uf1ra īg1ta ad1ca ār1ķē ek1vo am1te iz1zā ar1ke ēr1mā en1dā eg1lī at1ci ur1ci āg1la af1ri īk1ze er1cu ad1va el1ci ep1no ag1ne ār1zī eg1rā eš1ķī an1ti iļ1dā ud1mu āl1li ub1ve uz1pe uš1ķu eļ1tē or1čē og1pu eg1nē op1la al1dū ef1rē īt1ni ek1nā āz1be er1ti er1no os1fo ēr1ga at1ka er1go or1ķe er1mo un1da an1žo ez1mi ef1pa ek1rī ūp1li eļ1te ār1tā ot1ri ud1li us1zā as1tē iv1da is1ko il1za īg1to uz1bu er1tē ap1su es1zi u1džu uk1li iz1lū it1ti īk1kā es1pī uz1vu ūž1di ūs1li āl1po ok1re āk1ļi īž1me eš1ķa at1ķe āt1rī iņ1ši ap1ga um1jā īm1ja ez1ro iz1jē es1sū eš1vā og1ri ār1lo al1so iz1lī is1kā ep1ti eg1bi ār1la ar1vo ēp1si ār1gū eļ1ga uz1kū iļ1le o1dze an1sē at1no ok1ma al1sa ek1ri ep1le en1rī eš1de ez1jū ik1sē al1gi ep1ro īv1ci id1po oņ1pi od1ra ej1pu ir1go el1ma in1se et1sa īb1ša aļ1ķa ol1la at1rī at1dē īļ1si ār1ņo ur1mi ep1lo āg1šo ec1to ob1ve up1tā āt1ra os1ko al1zi el1du iz1vu ār1pi at1šā ul1tū il1dē ap1mī ar1lē er1tā us1mu is1hu oņ1si āz1ve īp1ne āz1to iš1ma ol1vā em1zī āl1be al1šo us1ko es1ga in1fa āj1vi at1di at1ži ap1bā ah1ta ēr1nā el1me īs1le iz1ja ēb1ti es1ka ul1be ep1ri ež1zī ot1vē as1la at1ru er1mā ed1re ēj1ma av1ci ak1do us1nē eš1ga ap1cī āt1zī as1pa āk1ša es1ta ib1lo er1ģi ēr1mī eļ1di at1lā ak1te aš1vī og1li al1ga aš1kī ār1fi es1to ūt1pa on1ko ār1ci ām1ju el1ce īs1tā ec1ni al1ku at1hu er1fe ār1mē ēr1mū ul1di on1ga ār1pē ar1pē ās1nā am1fi āt1pe an1co oš1ņo eļ1ņi aš1no īr1na āk1šo et1ko ig1ma an1te an1ba e1dzī ek1šo um1bu ir1gā om1le ūm1ve al1na iz1va og1lā ūk1ta il1so uz1ma il1ša oš1ķū at1zī ās1mo ēr1na ūž1ņo um1nī eg1vi al1tū on1se iz1ža ek1te ep1lū ep1se os1tī as1ta ār1be iz1ša oš1ķo āg1ri īv1ku āt1na aš1ķi ēr1dē ir1tā ak1sa as1to az1jū un1me ap1pū ep1to ur1ve en1ma ēc1na eņ1ķu ār1le um1zi uz1cē ez1pa os1ka ab1rī er1ģē et1ra īt1na ap1čī ok1ri eš1pe iž1ma is1ša āz1ģe on1dī ep1tā am1zi īg1lo iv1re at1lu āl1ci ez1vā iz1ti al1mā ug1li il1bi iļ1ķu aš1ņā iv1ba ik1ši īk1me ap1kū un1gi uk1nā al1vo up1lo oz1vē ēj1ka ap1rā ad1li uz1ju el1pa en1li at1ču īk1bū at1dā up1ta iļ1ņo ar1pī ak1vē ēc1ga eb1ne af1li ol1ka ez1fo in1ki an1gi ak1lo up1si ej1va ag1tu ek1ļo iž1vī as1zi ir1lī en1du uz1tā if1lo eļ1ļo ob1lī um1sū on1ci an1de es1lī ēb1si ib1tā il1da uķ1ko uk1ša āj1pe ej1bu ūv1ka ar1fa oz1ve īk1rā up1mā ūs1to ir1nī ag1lo oņ1ra iz1sū īg1ce an1dū iņ1vī e1džo ār1da īn1mā ār1ju er1vo ar1se i1dzē iļ1pi it1pu ur1sa id1da iš1ko eš1ķo ār1po ev1kā īk1rū os1ri ik1no ār1tu ur1ko oz1tu om1pi ar1šē on1nu uņ1ģi ur1šu ab1rē īr1kū en1cē em1je ap1va av1ļa aļ1bi uz1hi in1ča on1fu ār1sā oš1mī uz1rī il1ka un1tē as1mi iz1ga ār1mā āk1tā ik1lo im1pi or1pa aš1ro um1mē īn1te ež1rū ab1sa uz1mē a1dza as1sa un1gā ag1mī eš1mī eg1ša ak1ru ēt1ri or1se us1no it1mā uz1po in1čo iz1su is1to uk1vi ir1to um1ju uļ1sū in1dā um1tē ar1šo īk1ko er1me uk1si īv1pi ēr1mē as1tī in1kā en1za al1bu or1ģi a1dzī en1sa īs1ta eļ1de ū1dzē uk1tā ec1vi ūk1le ap1čo ēd1ni ān1ce if1tu īk1di āl1va ap1gu en1de ar1de ap1mū on1te es1da ud1ci at1se ūp1ni in1ha ap1de al1ci ir1pu um1va ok1tu ug1lī aņ1da ep1ša el1su īk1si eņ1ģe aļ1fi er1si op1ju od1le īt1pa ak1nā ap1nē ar1dī ek1zē at1zi āt1ka āl1mē em1za um1pu ap1žo ēj1sū en1le iz1lē er1zo um1dā ur1žu eh1no ab1ka īs1vē īb1šo as1se ul1lē ir1ki at1ča uļ1ķe āz1ma ip1nu ar1nī īg1lī ad1ra ez1ti īk1ra ūr1zi ap1vu ib1la īt1kā iļ1da ēl1ko ob1la o1dza ep1nī es1ri up1ji eļ1ku ik1ve es1vē er1lo um1do ik1lā em1žo is1so om1ju ij1ka en1ni āz1ne īv1di if1to un1je er1da en1kā ūt1ra en1ge āp1ji oņ1kā al1vi ēr1zā en1ga īr1ku ar1te up1rī or1ti ar1ķē el1lī iš1la an1no ec1pi ēk1šo an1da āp1šu iļ1ru ež1lī ed1rē ed1ka at1kū īb1si ež1ņa am1va un1dī ār1nā al1me uļ1ze es1tē āj1ba āp1šo ap1po en1zī er1sī ig1ro at1bu um1sē el1cē ās1ni ar1pū od1ve oz1ga in1do uz1mi un1mē uz1ka ig1ne et1pa ol1si ab1ra on1to os1kī aš1ķa iz1se īn1pi eb1ru es1nu ūt1ru ik1ri as1lu iz1la uz1ci at1tē on1da āp1ša ēp1ne or1ce ep1rā ūr1mā ež1vā up1jē eh1lo īg1ņā us1li ec1tē āt1mā ak1nu u1dzē ez1ne ar1dē ēk1da et1nē ež1ro ir1kū ap1lū īs1tē us1ba ēj1zo ī1dzu at1le ēg1na ep1tu i1dza af1ta ep1de īļ1ve od1ro um1šā en1se eņ1ra as1tu at1pu eļ1da āb1ba iš1ķa āg1ša il1bā ūš1tu ud1sa at1ģe um1šu aš1mā en1so eg1ba am1re ud1ro ov1na ik1re ār1rī ār1ni ež1ra i1dzo īs1to an1še ar1ju iz1ģē az1dū ēr1me oņ1ga ēr1tē id1mo īs1fi at1mī al1se il1ha ep1ja il1ce of1ra um1pi uz1rē aš1ņo el1ža ap1ņē ar1bu iņ1re ij1pu er1žo ol1ta ez1va aļ1ķi il1nī ag1no ul1lī ib1ri āt1ri um1pī ūg1tā is1fē ak1su al1to el1žu ap1ģē iv1ga al1za aļ1dē ēr1si ār1ņi et1rā aļ1ņi um1zu ūg1si az1mā in1ko īg1ri il1šu er1va uz1tū ec1cī īs1li a1dži u1dzā am1žu uz1fi iz1nī ir1dē ev1ga iz1ča iz1pu up1šu iz1gu in1ce uz1dī āb1šu or1ba i1dzā a1dzo es1tu āz1ti el1mā ap1vo ub1lē aš1ķē īs1vi en1jo as1ki ik1tī ok1le ur1ķu in1gī ek1ļu uz1to uk1le ir1bu āg1to uz1ne as1ko ek1rē ur1do ob1ta ār1jo uk1no ot1lī ur1te uz1re at1ma at1žo ēd1ne at1na us1ka al1vu ib1šu iz1dū ug1ko uz1vo at1zā eg1zī ūš1ga il1ni uz1ro el1pu ūg1to os1mā ul1ma as1ma al1ni ut1ra ug1šē at1sē in1fo eļ1bū uz1jā ēt1va ēk1ba ik1di īg1le op1ne ur1vī ār1dū ir1cē ēr1sē as1ja es1mo il1ci az1li em1šu ap1lu er1nā ot1rū uz1čo as1dē os1mo aļ1ga un1te at1ne om1ba ok1ra en1vā ap1sē an1dē ol1dē ap1ļa ek1sē ad1so iz1po uz1lī īk1ne ud1ra uz1ko ur1ta ep1šo ud1mi ār1ki eļ1vi ūk1ti īg1ro iņ1ti ur1du eg1tu ār1bo es1mu ar1ce os1ki iz1tē ev1mā ān1ko er1ge ē1dzī en1ba īv1ba ot1mu ēb1ta īn1rū ūk1ņa op1jo is1lo ob1ru ur1li ēs1le ur1lā ēj1rā ul1ko āg1tā iv1ku ām1ga o1dzē ī1dzē ir1za ip1rā at1tū iv1vi op1lū āp1si em1me ap1žā ār1mū ik1šā il1ba an1ze on1do il1he ek1ļa el1nē āk1re uk1se ēr1so ef1re ūt1rā ip1tu am1pā ak1ņu at1me ūr1ma ik1tā am1pu az1de en1ki iv1mo ar1ge īb1ti uj1ma os1ta as1na ēs1ma om1bo eb1rē er1ža āt1nu ež1ko uz1tē up1ni ig1nā an1na az1ku on1tī ar1sī ek1tū eņ1me os1vē ak1šī at1rē er1bu eļ1ņa og1ro īt1lī ij1ro ūk1si ār1žā ap1dā uz1pa ek1ļi iz1tū aš1ķo im1ta ik1nā at1jū ēg1no ā1dzē em1te er1ģe āš1ņi eļ1ta ap1lī ul1la uz1bi īt1di ud1bā en1tu un1ne uk1so īv1ti ol1je ed1li iz1ni ēr1šu eb1si ēv1ze uz1za er1ne om1pa ec1kā in1sa uz1ža ūs1ta ap1ļā ūv1ga iv1ri aļ1ba ob1ša ir1zī aš1mē āt1ru az1sa iš1ķi ok1nā or1mo iļ1ļa iņ1ru uz1gā uz1vā it1ri om1de is1cē is1mi op1ga at1čī ar1nē uz1ho at1bā ir1ži el1fi ir1ne ar1dā uz1fa ap1ki ur1dā āl1ze ār1li or1bu ap1ti um1ga ek1ņa al1pi us1fa ār1vo uz1ģi e1dži ig1nē uz1te ot1va ag1ļu os1pā īk1ņā īk1šu e1dze iš1jā ek1ve at1ļa āl1si or1zā ul1lo ab1va aņ1ķi ār1ķe ur1vo ap1ze em1ni oš1ņā ūž1za ēr1cē ap1hi ek1nī uz1ņe in1tā un1cē ib1lā īr1ga is1ku uz1zo ug1ši am1zā as1me un1dā ak1sā it1ļa ur1nī uz1ņē ēz1tu ab1tā ār1šā us1sa īg1šo eņ1ca op1lo āp1to el1mī eč1zi eg1ku al1pē ik1rī al1vē it1ļo em1mē iz1ba is1dā īd1mē en1ve ap1ju ol1ko ag1le ap1tē āt1nī āv1va et1so an1hi eš1kā ir1šu es1lā os1me is1tī ur1ne et1nu ap1mi ūz1ma or1mī as1za an1cē es1ni al1fa ēr1bo ur1ģe āg1si is1de īs1sa at1mi ēš1ļa ūg1da ūs1nā ār1ra un1kā ok1li ē1dzū ēg1nu al1bo op1da et1ķī ur1pi ār1pu ok1sī it1ļi ap1sa ip1ci ar1ša av1ma ec1vā iv1do ūs1ti at1dī ār1žē am1na ak1ļā iņ1me uz1ha ar1mi eļ1ļi ēp1tu of1to ag1rā il1zī ēg1šo il1sē is1ba ap1ko ug1šo ot1mā iž1ni ār1tē at1šu ep1šu uz1ģē ag1lū up1lu ām1gā ar1šī it1ve ak1ma už1pu uk1te uz1lo ik1ce eļ1rī et1na āl1ra oz1ti iz1ze ap1zo ir1nā ad1le ēt1ho ad1mo un1ta a1dzi az1ko āl1pa uz1nē ug1ma en1di iz1šū ag1rū īr1ra as1pē ok1ce en1cī il1mā op1su al1šu of1li ev1ma ab1ļā a1dzē ud1ru ir1zā od1bi ol1dā ap1ci il1dā ok1pe an1ki as1vī od1ru ur1pā āj1ga ēr1da ep1ju iz1re iņ1ka ār1mī at1lē ir1sē iš1ļa ēg1ša āš1ņu ar1gā av1la aļ1ni iz1fo il1la er1mu up1šo is1ma āl1sā ap1ļē ur1dī as1tā ul1tē es1cē ud1lī on1ve uz1ģe ek1me āš1ņo ek1la āl1ga iz1di on1vo er1tī on1ja uļ1žo ār1fo ak1rī ev1bi ij1ci eš1ra um1jo az1me im1šu aš1da or1tē uz1rā ār1vu al1ba in1ge ab1na an1ci īs1lā il1šā am1za al1jo ek1le im1dā iņ1de oļ1va iž1ra am1mē ok1rā er1le ok1vē ok1rū uz1ķē eb1ti āv1la a1dža iz1ļu on1ka uz1do ār1ķī ē1dzā an1nā āģ1zo uz1ča īt1bi am1da at1kā ēj1ko ul1du op1lā uk1šā ik1nu oh1ro at1ti eļ1dā it1li uļ1ļa ūs1mi at1he at1to ec1pa aņ1pa om1bu ig1tī ap1me er1so an1tu on1fi aš1ni īv1ja oņ1ma il1rū ap1pe em1di ār1pī er1žu it1rī al1tu iz1kā an1gu im1tu an1va īn1dā el1ti ap1sī ēr1be ez1ga ēt1ki us1tē īn1ko el1ze ab1lī ar1tā aš1ķū en1vi il1fa ik1ti eg1ri et1vā us1mi um1te eb1jo eļ1ģi ar1ha al1mi ig1lā ek1vē is1le eg1rē el1tā ap1ģe iz1ri er1to ug1to el1lo ār1lū el1sī el1fī oņ1da in1du eg1si ub1ļo un1zē ar1bī iz1ju ap1nā at1ce ej1da am1vī eņ1ķi oš1ļā ij1me ob1ra e1dže ap1pī am1pi īķ1ma op1te uz1cī oņ1te at1vā ap1ņi uk1lā ir1so ak1me ip1lo ik1ca ap1fi oj1ne iz1pa ok1to ok1ci en1mu ip1nī ol1za ār1ģi āk1ļu ēr1to āl1šā ef1le as1li ar1so as1mī at1re īs1co ar1nā ug1ta is1ta eg1ļu ām1ni ēg1ti eļ1ri o1dzi op1lē ip1nā oš1ķē ap1bū im1nā ir1gē īg1vā ēr1nu āk1si el1mo iz1ņi ap1mē al1pa ol1ti un1vē os1mī āk1li as1pā ēr1ķu ul1tī ij1ti im1fa ūs1ni um1ba um1me al1dā us1to iž1ce it1cī or1ņa ad1rī ur1ba us1vā u1dze oš1da ok1mī ež1ģi ef1li ir1kā uk1ti uz1dā ēr1ģe īg1tē ūs1te is1vi il1ti eš1ļā ik1me or1de od1va ur1zi iz1či uk1nī az1ma uz1ja āb1jo at1fa ev1ri iz1jo īs1pa u1dža od1ko eb1ro is1li at1mu at1sa ub1ri ab1me ēļ1ni ār1hu ik1tu ok1sa em1dē ab1lā um1sa og1lē āg1ta ez1li ob1ļā ad1pa ig1na or1sā ir1da an1sī am1mu ul1do ār1či uz1vi ol1ho em1zu ut1ni el1šo uļ1vi īk1šo is1lē uz1sa ir1gī ež1va īb1ne īd1la it1vi ēk1ve is1sa em1pe ēj1sa id1ra ol1da il1ca uv1re ār1tī ar1bū ap1mo il1ža a1dzu ap1se ub1lā as1pī er1tu īc1ni ip1ra og1lo ib1lu el1na uļ1ni ak1si an1ši ēr1zi er1ke am1ka on1za ār1bē ud1ni ak1ha us1mo ār1ņe at1dū iz1žu ām1ma aj1mu uz1čū aņ1ģi iz1ho ēj1ni ir1ni ek1tu ās1ku el1žo iz1ģe ēr1ķi ēr1se īr1sē iz1na ob1ro al1go um1si op1ļa ur1tu or1tā ul1cē iš1ķo ad1ro it1če il1vi uz1se oh1lo od1ne iļ1ra īg1no ap1ni oz1ni il1me ur1da āt1do ar1he in1tū ul1fī us1gu ul1cī al1bā ib1ra ir1ga ul1gu ān1ri il1gu ab1pe op1to il1zi is1ķi uv1cī ap1tā až1re iz1pī ud1be ek1ne ab1ļa iz1ki ar1mā iļ1ķe ok1ro ig1šu at1bo ār1pū īb1ta uz1kā iz1bi um1ma or1ko an1vā es1le is1ci op1mē ām1pu ir1ba os1tē ig1rē ok1da īk1le el1te ek1ru ok1mā ob1ja ar1gu iz1ķi or1gā ij1jū is1mā ūk1nē al1ce ēs1tā ur1la īv1bē ar1bo až1vi iz1li om1fi ar1ni ār1cē uņ1ni ir1pā uk1šu in1fu op1ļo on1mē ēš1la ūm1ju on1me is1ja āl1da āj1pu el1zi ēr1ko īs1tū āb1ta it1re ēr1ta ik1ne aņ1ģē es1na uš1ķī ēk1sū āp1jo ār1ja op1li ib1rē oš1ķa ag1ta ob1jo ok1lē ul1ku ip1te ar1cī ār1te īg1ša uz1ki ās1la et1ro ās1ti ar1ti iz1sa āk1zi uz1sē em1šo ok1so et1ze ar1žī oš1vi ap1ri ad1ru u1dzo āp1nē at1za ūr1li iv1la or1va ūv1be ep1ni eņ1sā ūr1vē āz1tā ēb1šo ev1lū ib1kā īt1da um1ša ug1sa ik1da ak1lu ēr1ļa os1mu īņ1la if1rā oņ1tū eg1ne is1mo uz1šū on1tū ob1šo in1va eg1lū ir1pi u1dza us1la ūs1pu ib1to iz1sē ap1čū ok1lā uv1mu īk1sa āķ1ve iz1mu uz1mī uļ1ķo ar1hī ēl1me īg1me ag1ve ur1vu ār1ha ed1ni āt1se at1ņa at1sū ūk1šu ol1me ūz1mē ip1to at1tī ēs1ta us1ve iņ1pu ol1va in1ši āp1ta ar1ko ēk1si el1zī er1nu az1pi ār1bī uk1la ek1ņi er1ro ēt1bi al1da is1pe īk1mu ēc1pu in1dē ūr1ve es1tū ēr1mi ez1ko ār1ko āl1lē ep1te ār1re an1ce od1ku ig1ru īk1tu ēž1ve ap1no ul1ga el1ve at1ņe ār1pā op1bu iv1ti iz1dā ig1ra ij1va ēr1di iz1lo uz1bo ās1nu el1ņa us1ne ev1ge ab1di uz1jo ār1kā eb1re ir1nu op1tā il1li uz1pī āj1do ēg1tī ul1re eļ1ķī ej1nī av1ļu aļ1ņu ūs1ga im1fo ab1ta ut1ne iš1ķu ez1nu or1sē ep1ļu ūt1si ik1le is1ga oz1to op1ti ur1šo il1kā im1du ēr1ba iz1no ar1je am1du ul1lu ot1ni eš1si at1pa ab1to ip1zā ūs1tī at1mū ī1dza im1bo op1tu ak1ta es1ve īk1ma ūk1ša in1di uz1ži iz1čī ad1vi am1šā iņ1ņa ār1ce ēd1ma ik1ni ap1tī ap1zu ep1sī am1pe uz1lē iņ1ģi uņ1ķi ur1pa eb1ra eš1me āt1ni or1me uč1ka ar1vi en1gā ar1ši uz1la es1kā uk1ņī ap1gā er1vu es1nā ir1šo iz1sī at1gū ar1ma ef1ro eš1ķi on1nī ap1ho ez1zi oņ1re ur1nu am1be ek1no is1jē āž1ni ag1lē ek1ci el1da es1pi ož1vī oņ1mā il1pā ok1la as1lī en1ze ām1vi ir1be ik1lī e1dzo uz1ti ul1ta ār1gu an1so ik1si eņ1ze iv1ju ag1nā ār1bi ib1ša or1fo ūr1zā ap1ņa ap1ji ēr1lī u1dzu en1rā iņ1pa at1ķī ār1vā ap1ļo ār1ca ek1šā ēr1ka īz1da us1di īk1to op1sa iv1ko āb1ti il1jo iz1ra ir1se uļ1pa iz1ņa ār1fa os1li ez1ma ar1si oš1ta eh1ro až1di er1sā ep1sa el1je āt1ce ek1lū an1dā ig1rā is1za ok1ru eš1ļi āj1mu ot1rē el1ka ur1čū eb1šu uz1žū eg1ve uz1ņu ob1ri ap1bi iž1ga av1va ūs1na ēj1ra iņ1ni eg1tī uš1pa ag1ma ur1ķē on1go ēr1ne īž1ni ir1ģe as1kū ēr1cī el1ša ēr1nī āk1ti es1mā ap1dē īn1me ig1šo es1ki ot1ne ab1rā ab1te ib1rī ir1po az1do en1sī az1nī er1bo al1bī ib1lē aš1ha es1va et1ru ez1jē id1ga il1tē on1ki il1na ur1go oņ1pa ur1lī od1pi īb1to iņ1va ad1ni ev1ka ar1la āb1tu at1vī er1su us1ku iv1vē iņ1za or1nī an1do ūt1ne om1bi an1to el1dē uļ1sē el1jē il1ča ās1lē as1pu uz1su uš1ku om1po ul1bē ēc1mē eņ1ko īv1zā eg1le is1ce is1ni od1rā om1na ul1mi āk1ļo ig1mu ir1me eg1ra eb1ta al1mu is1ki in1jo īn1vi ef1lā ēj1ca ar1hi ul1ba om1ja an1kā am1bū op1tē ol1lo am1mā at1ķi ad1hē ot1ma em1lī āl1le as1mē ūr1ga ik1la um1so an1dī us1lī ūr1ta in1že ip1ri ej1se ul1ki eg1bu il1šo at1pe at1čā ap1lē eg1lā īs1re ēr1ve ek1ca ap1so ēr1mo āz1ta or1tū āk1šu em1ci ok1ne ēd1nī es1ti il1pe ip1na ik1va os1lī iz1šā od1ri ob1rū un1va eb1ku il1to ir1tī uk1ro iz1cu āž1ra ur1di eb1ju ul1so īs1lo ēj1čū in1fi ur1za il1va iz1fa al1do ib1si ēr1bā os1ni oš1re im1ba ig1si ūr1fi ec1pu ak1to el1so ek1rā īs1va aš1mī en1ti en1pu eb1ri am1ma es1me ūn1vi ak1ci ēp1ša eš1ni el1vi ov1ka ēz1do iz1lā en1tū en1su ur1nā ot1ro ob1re ep1žo at1ķē ēp1ti en1ci at1bē uk1to āg1šu il1mē ār1žo is1va ēt1ce un1ro eg1me on1bū ah1ro ād1re or1ni uģ1ni uz1so uz1rū īs1kā īs1pu ar1šu ar1sā el1bu il1ta ur1ķi ak1ne ap1vē ār1ča av1ve os1pē aļ1ra eš1ķe ur1zo as1va uk1či ar1pi uk1ra ur1mē ez1se al1pī um1za īs1de aļ1ru uk1ko eb1le ul1ju āt1ze at1bū ez1vi at1šū ag1ra āt1kā īs1te iz1jū eš1ņo ur1co ar1bi ūs1tu it1ka en1sē eš1ņa ag1ro aļ1si id1ri it1no ež1ma os1pi ev1ti ēk1pi ap1tū us1mī el1hi iz1ha eš1ļu ām1vā un1gu ā1dzī āl1nī eb1li od1re āk1la ab1zi af1ni ād1ni ig1ri ek1ga uļ1mu on1va īv1ko um1ra at1pā ub1ļa er1nī ug1ļi aš1ke ēr1tī ap1ba od1jo ok1ļū us1tu uz1ķe ih1ta iņ1ga ēp1jo un1ce il1ši īt1ne oš1ķī ig1ta ol1lī ūk1ga es1pē et1bo ez1di ap1ķi uz1ca ig1mā or1ķa ez1to āp1ju ēk1nī at1ļu es1sē ir1pa ap1ra up1li ul1dī ē1dza ek1so ol1zī ēr1co or1ka ad1ja en1ra ez1ba iz1go en1hā ez1ka et1re ah1ve il1pī ep1lu eg1ti im1fā ih1nī ēr1dī ap1čā ēj1vi an1tī eņ1tu ut1ru ēj1tā ur1bu ur1de es1no am1pī un1vā iž1ku uk1lu un1bū un1tu is1nī ub1ļi ap1či ūd1ri en1lī es1pā iz1čū ob1ji ez1tā em1žu op1lī ab1lu od1rī āj1sa uk1ci an1žē ūt1ri un1dē eg1gā ur1pū il1di iķ1ve eņ1ka an1tū āv1vi īt1ro iz1ro āl1di i1dzi ad1rā ap1ne at1va iz1ma ūv1ko ūt1nē až1va ān1sa uz1zi as1vē et1vē iļ1bu aš1vā ap1ka iz1pi er1ša ed1na im1dē ag1nē āj1bu ād1ve eb1tā us1pū īt1sa ap1ži ūr1ni og1ļa āt1nē el1vē et1la og1ru iz1ka al1sī ir1zu om1fo eļ1jū il1bī il1sa uņ1ģī ej1sa or1nē am1ta ul1šo or1pē em1du ur1lo at1be ur1si ēr1ti er1šo at1pi or1lo ev1na ec1ri ol1ba iņ1kā ār1hi os1fā at1lū og1ni aš1sa eg1li ij1de eļ1mā il1nsa ir1pti iz1šķo ēl1mju uz1glā ap1slā op1ska ek1špē al1tru iz1smē ēr1kta us1kri il1bsi ul1gri ap1sku at1frē is1pru at1fri um1pja ār1brā os1tga as1pre ār1sve ūm1tve ār1brī uz1fra iz1dru ēr1ptu un1dzā ut1ska īk1šķo āb1sti iz1hlo ēr1šļo ap1gro at1šmī un1spu es1tro ap1blē et1rka us1gri at1plā on1ste ap1šķī el1dze ab1sce at1kļa iz1prā ug1šde on1fli at1stu im1šte ir1kta ar1bnī er1dzī en1dro ok1snī uk1šķa eš1bļo īt1ņmē et1rde ir1mbā az1gru in1grā uk1ska ap1spo āg1sti ug1špa al1kva ez1tne an1gli udz1ba ūk1sli at1sma ap1fra iķ1skā uz1sma īp1sla il1stu iz1gra os1krē am1sti uz1pre ez1gla īdz1jū us1trā iz1pla iļ1krā ēr1zka ap1pro ir1sno ir1smo ir1mme er1dze ān1prā ap1bru ēg1sto as1bra ek1šne ēr1bšo edž1li as1tru un1dra āl1pro ār1grē ēr1stā ar1pta īk1stu ez1spē am1skā ir1kļo on1gru iz1šta āļ1dzi āl1štā īs1pro ur1dzu ir1stī ār1šļa uz1gru el1pšu al1frī ek1šga ir1mdī ek1sku iz1spu uz1plū āk1sla iz1dre in1ssū uz1gle om1pre ār1gti udz1cī iš1brū uz1kru uz1sli uz1klā at1ble īdz1ni iz1smī ār1sni īs1spa iz1pre īg1sko iz1žva ir1gti ēr1bta īt1pra at1gla as1dzi ap1skū uk1šķe at1dzī uz1šta uk1lva at1dzē ār1šma es1prā iz1blo al1sti at1zvi in1dzo uz1krē at1kvē an1brū ur1ksi uz1stī op1sta in1sti on1sti uz1pli at1kve as1krē in1sda an1smi ap1stu us1tpu uz1kņu ār1blo on1gli ar1pli ap1šļa us1kre āk1šķu al1vja iz1sni ap1pla uz1brā iz1brē eš1stū iz1svā ēr1kša ug1sta at1blo ap1švi il1dno iz1glū ir1sdi im1pro ār1tre iz1bri āl1bra at1bri uk1stē iz1brū at1plē il1bšo ur1dza ik1lpa āt1rra uk1sti ur1kša en1džo ār1svā ap1krā īk1šķi at1rre iņ1zva at1žvī ār1blī ēr1sta ār1smi iz1šmī ug1šna iz1skā uz1trī ap1svī is1prā ek1sta at1sla at1trū āk1slī uz1kna il1dvi ār1dzi uz1šņu is1tre iz1svi ap1dri el1dmē ul1gto an1tzi is1kvī uz1kļū ār1šņo uz1frē ib1sto ig1sta in1ktī ir1sni en1sne em1pjo ēr1btu īn1skā ēk1šņo ik1smē es1trī at1šķū at1pla in1gto ot1rdi al1cvi um1bri uz1švi is1glī an1džū ap1sle uz1pļē ap1šķe iz1ble ap1šņa ir1mre en1tra ār1tra ul1snē iz1spa ep1sti ūt1sga āg1sto īb1sta ap1pļā at1kle il1gtu iz1spi am1tra an1fra uz1frā ēr1nva uz1stū ūk1sto at1šma um1šzi ug1stā at1špa il1kti īp1sle iz1tri os1tro el1pšo av1sta ak1tda ik1snu iz1stū ok1tri ap1gve op1spē iz1pra el1ptā es1tra iz1kni ān1spē os1kva ol1ste ul1dzo ek1šzo uz1ste uz1brī in1skā ār1švī il1nvē ūv1pro iz1šļu ev1ski en1zda āt1rda ēk1šķu ig1sto ēr1kšu ēr1ktā iz1skū an1kre iz1pro il1spi al1kto ok1zvē ap1zva ār1zvē un1tni ak1sti as1tri īb1spē os1mve en1sžu el1nru er1csa uz1zvi al1vtu at1dzi um1krū ot1frī ap1klī an1sko el1dko an1tkā ap1gla īk1šņa ār1gve il1dba es1tma uz1sti at1drū ul1pto uk1smi as1trē er1tro īb1sti id1spa at1trā ar1pna at1sta ek1trī at1šņo at1zve ig1zda ir1mpa ak1tni ir1kšo ār1plo ār1prā il1nti om1sva ēr1bja il1trā al1kta iz1dza iz1šma at1dza iz1kri ol1skā en1tni et1sti at1tru iz1špa ur1kne īg1zna ul1sva an1tza ār1tņu īn1krū uz1šņo ek1tkā at1plū il1kni uz1žņa ur1sli iz1tre ap1stī or1dda ur1gra at1glā ās1tni uz1žmi at1dze āl1sti ēr1slī el1nze āk1ste op1pla at1prā up1sto em1plā ib1stī up1sti ār1špa ēj1pla ār1hlo ap1frē il1kto al1dzi on1tri ar1gsē iz1frē ap1bro ul1tne im1stī ug1špē em1pta at1grū as1tma īk1ste iņ1krū il1kšu ek1ska is1tvi ār1dro iz1tro us1smē el1zta ēr1psi āk1sme ēs1tne ār1grū ok1gri up1stē ok1sko et1rro un1dze ap1trī uk1šķu in1sri en1tri āj1dzī ap1fri et1rpa uz1klu ik1sme ār1dra iz1kvi ēr1pto at1plī od1pra at1glu ap1fli uz1gri at1krī īk1stē oš1prā an1frē ap1sva il1bta ek1smē ār1šru us1tmā īk1smī al1dķi os1trī in1ssē al1tga ir1mkā ap1zvi ūg1sto em1pli uz1ble on1spe at1spā ār1sko ap1trā ek1šli āl1skā iv1pro ar1krē iz1tra uz1tri uk1ste ir1klī ap1kna er1spē ik1šķa ak1šķo ur1gšo al1dga ap1kla ap1svē in1tri im1tga in1šķi ēr1bka ēr1sti at1ska āb1sle ap1slī iz1slā an1gļu ir1msā ēr1pša or1tlī iz1dri un1kta el1dzī em1ztu en1ksi ār1kna un1kto ap1klu at1tra at1brā at1žva an1kro ap1sme ūg1sti ar1tmā in1gti ār1sti ik1stē om1bve ap1sko ār1ple īk1smi ug1sne ap1krē en1skā en1szī āk1sne es1pre ēr1ķti āl1sma īr1ska at1slī us1krē us1ska el1pta en1kto ar1bga ār1tru eņ1krū en1trē ār1spu en1spu al1ktā ik1sti em1zti āt1stā al1kci ap1kļū el1nsi ēr1nru ir1dza ār1klī at1tre il1dma īk1pla ap1sni el1kme el1nbā ak1smē āb1sto un1drā uz1glu uz1ska en1slī an1sli ēr1sba un1dro el1zto uz1trā uz1spā ap1dzē ap1dru in1dze ed1gri eļ1blā an1kci os1krū iz1spā an1krū ir1sra it1sko ir1mso un1ktī iz1slī er1zto et1pra ur1tra al1tme iz1slu il1gti iz1gre ek1šķī op1sva uz1tru ar1ppa in1dzē ab1dzi ur1tni uz1bri ab1stu in1gra uz1sva iz1krē ap1dzi ug1šte um1bru at1dro ir1sti ur1sti āl1sko at1klu en1kšo ut1skā il1pšu ur1gšu ar1knā ap1knu im1bra ēk1stu iz1knā il1bto āp1sli us1tru ak1šņo ap1prā ir1dzo en1krā ār1spē ar1kro iz1dro ār1bra il1dnī el1dba al1bri uz1brē ot1gri at1tvē ur1sme uz1šļa ek1šte at1šņa en1sro āk1slo an1žsa uz1plī an1tra il1bša il1tni us1glā ur1gti īg1stu ar1zva ol1lmē iz1kve ar1glī in1kru ap1kņu ir1pšu ec1skā ar1dzi od1ršu al1tma uz1sle eg1spa ap1šļi ek1šķo uz1spo ar1kto iz1zvi uz1šķo il1trē or1tre im1šļa iz1blē el1gti uz1slē ār1spo al1dka uz1bre is1tzo im1fva az1pra ap1plī aš1kri ir1pji uz1šļu iz1sla em1zto ur1kri al1tna er1dzi en1kti at1pļē ēr1slo ar1gto ūk1šķi in1dzu es1pļa oņ1pri uz1bļā us1tro ij1skā ār1fra iz1tru og1dzi ij1spe ij1stū uk1šķi ār1trā uz1kla ek1sče ik1stu ar1ppi iz1šņu oņ1sli il1psi iz1gro ēg1stu uz1sku ol1stī ur1vci uz1smī ur1zma en1sve er1spe uš1plē ur1bšu at1stū iz1sme el1gšu ec1sta ap1kra ek1šda il1dde el1kņa il1dle el1psi ap1stū ap1ple uz1ple ur1kšo ār1dnī ēr1pju ēk1šķa ir1mte ug1ļķe an1kvē il1gta īr1šķi ap1svā ul1lpu es1nvē uz1gve at1pri ug1šda at1šķo iz1plī ār1bri al1dkā udz1ma un1ssa os1prū iļ1ņve er1che ān1skā ab1ska ēr1sli ār1krī al1kšu ur1sto ūg1sna uk1sto ir1mcē id1sta id1slā ut1sko ir1stā ār1pro ir1kti ār1kre ap1glu as1tne iz1švī uz1spu al1nrū ār1spa un1ktā āb1slī ār1pļē ir1bju ur1bto el1svi un1ktū ug1šga ir1sli uz1fri ur1bta āb1stu em1brā om1pro ez1glā ep1sto al1kme iz1blī ar1ksi īk1smo ār1spe ap1krī iz1šķē ur1tkā ēk1lko ār1tna il1dsa al1dni el1dce on1tru iz1sto ūp1sto ap1žvī ap1tri od1gru ār1gtā iz1gve el1gsi er1nha at1švī ār1hro il1tvā uz1sme at1sve im1tni uz1pri ēr1sra as1krā en1ska iz1glī us1tdē ol1tme ūr1stu um1švi at1šļa ār1knā uz1tre ok1šņo at1bli at1sni el1gto ek1šķe ab1sti un1fte ap1gri ir1ste ul1sni en1tvi am1plu am1zda ik1stī at1knā at1skū is1tro is1trē īg1sta ir1spu am1svē ār1bru ec1stū ul1dza il1kšo ār1plā os1tni īk1sna uz1sta ār1zda ār1šķi uz1bli ek1tro ap1grē ur1bšo ir1slē iz1kla uz1trū uz1tra ak1sto os1tre uz1dri ir1sma ak1šķē ak1tli ek1švē ās1nku el1zti er1cba ēr1kto in1dsē al1kša um1tra ip1sna eļ1ska ār1šķī ap1kri ār1šķē el1drē im1pli uļ1dzi ir1pta ēr1pta il1pra up1stī iz1fra us1tre ub1krē ār1pļā in1fra il1kta ir1mpi ap1šņo at1sku un1dzi es1trē an1drī il1pto adz1ni ar1pju in1gtā iz1gru ap1šķo ēr1skā ot1rpi or1tfe ir1mti ik1šķi an1tmē am1bri un1dža il1pšo as1brā el1gšo ap1kvi ug1sme il1pne ēt1svi ir1kša as1sko ek1spe en1kša iz1bre em1pti ār1gre iz1frā iv1stā ul1šņa ār1kro as1pra il1ktā at1sle iz1glu ik1snā ok1šņa um1šma ār1gru ār1sme at1sna ur1kto ik1sna uz1svī us1slo am1pda em1ztā uz1žva is1smi ēr1tnī ār1gtu ār1drū īg1sti ap1tro at1sme iz1plē ir1tni ak1šžo il1sku ul1bša um1spo āk1sli ap1blo ār1dze ār1kva uk1sne āt1rvi ap1žva am1stu an1dra ār1gšo ek1stē ār1slo ār1gto ek1ļve ek1spo ār1tsa iz1dži ar1blā ēg1sti ar1bdi uk1šķī il1bšu or1pro ap1hlo iz1trī as1trī uz1smē ār1spā is1tri ab1klā uz1hlo uļ1sti at1fli ut1nko iv1krā ur1tdi ap1glū ār1glū om1skā at1sto um1sta ap1gle al1sma el1tra er1sto el1dvi iz1fri et1sko at1tva ār1kle āš1kru er1tce ap1kru us1tri uz1gla ap1ble il1sta ap1sve iz1dzī as1tpa em1psi iz1tvē ac1grī ēr1dzī ul1lci iz1šļi at1žņa ov1smē as1ska en1tge at1plu īs1šķi ār1dzī ēk1šņā el1nko ār1sku āv1sti āl1dzi ēp1stu īv1kla im1tmu os1pro ap1spē um1brā ul1dzi ār1stā ur1knē er1trū el1nba ār1bro ar1sme ok1sne il1ška at1svē ar1vde at1slu iz1bro ēr1ste āb1sli us1skā at1grā āp1stu ār1brū am1stī as1tmē iz1kņu en1kla iļ1sli um1sto ap1bļā uz1sna ol1klo er1tme iz1fli al1stu ap1špa ar1sti āk1šķi ār1dži um1bra ir1dzu al1kjū ap1smī āb1sta iz1kļa ul1ptū ap1smē ār1tnī ar1gva udz1so us1stu ap1ste ul1zna ār1glā ār1blā ur1ska il1stā el1nra ak1tri at1kņu eg1sme ap1grū ēk1šķo in1spi ik1sta am1bli ir1dzē ēr1ktu ur1kni el1tni iņ1krā iņ1kre iz1kle an1spa un1ska am1stā ēr1pšo ār1fli ir1mri ēr1btā at1svi ir1spa ār1tnā ap1šķū en1drā ek1šni at1trī ar1kti iz1pri ig1znē on1spi ul1kve ek1šķu āt1sko ek1sne īs1krā iz1klā ēj1tve ur1kti og1ļhi or1tme aš1plū ēj1slē am1pla ēs1tni ur1bsi is1tka is1dzi iz1spe ab1sta āp1sti as1tme os1tri udz1da ur1dzē at1šļu at1bra un1kla er1zti uz1pļā ār1dre il1gša iz1ple iz1žņa er1ztā el1dše ir1knē eņ1krā ēr1ssi al1sno ūp1stī ir1gsi iz1sta ir1sse uz1spe ek1sni īg1snē in1dzi at1kli ar1bve on1glo iv1ska il1dni ār1kra ār1blē ar1stā ār1sli eņ1ķmē ēr1bsi ik1smī āl1sci at1dre až1brī iz1plā ir1mve uz1gro up1jma uz1dza em1pto an1kto ež1sta ēr1šļu ap1brī uz1kro uz1skū uz1krī ap1šmī uz1kvi il1btā or1tje es1krā at1tve ul1stu ūk1stu en1kta ēr1stu ar1bma uk1stu ēr1nzi uz1slī ūk1sti at1sva ap1pļē il1nmi ir1snī in1dni āj1prā ar1sbu at1spa el1nma ek1stu is1grū is1nle āk1stī uz1stu if1šte ār1spi īk1stā ar1ktu ur1ktā āj1dzi ēr1bto iz1zva at1knu at1fra en1sra al1ctī ār1bre ar1bni ār1tni ez1pro an1tnī ēp1sti as1trā āp1sto īr1sva iz1šķa ig1stu er1tra es1tru as1grā al1sna ur1pre ur1mjā ēn1prā at1pro ek1ļpa ik1lve ēr1kšo iz1gla ap1sna in1dza ār1gra ir1gto iz1sna an1čki ap1tva ār1sna um1špe at1zva ig1zdo en1sva et1rga il1gga īk1sme al1stā et1rri iz1dzi ār1pra iz1trū ār1pli ēk1šķē āj1sta iz1kro ur1kšu iž1knā or1bci em1ptā an1scē ir1kšu al1tdi ēk1šņu īdz1ši ot1rre āt1spē ēk1mju āt1krū il1dda at1svī udz1kā ār1trī ar1ktā āl1ska en1sli es1pri ur1btu ug1stī uz1plā em1zta iz1bļā īk1sti uz1spa ār1tve an1dce el1dse uz1kra ap1sli ir1gta uz1slā ir1kli oņ1plū ur1gto an1grē ūk1sna āv1zva an1slā ek1švā ār1žva ār1šļu ap1frā až1skā at1pre as1tti iv1plā uz1grē ek1šno iz1grā uz1bra es1tpa ur1bra iz1kļu im1sto ur1gtu om1dzi ir1gka iz1šķe ek1sti uk1šga ār1sma el1tka ar1gma al1nra uļ1krē ar1gka iz1svē ēr1sto il1špa im1tci uk1plē el1pti is1dra er1sme ul1snī ār1krā āt1sma ir1stu at1pļā uk1smu an1dtā en1kšu ar1sko ēr1pti ēk1lva or1skā uk1sta ep1sta ār1tri ir1kņi ul1stā et1rvi il1btu ār1sla at1pli el1nsa ur1kmē uz1bro al1dne ār1frē un1spū ek1šķē en1pro an1dro at1bru ak1snī uz1tvē ik1spā uz1blī ap1šķi el1dra un1svi at1spu ār1fri ep1stu ēr1szā īb1sto ār1dza ār1gli el1kne ār1tne un1prā ap1kve uz1kni ap1dra ār1gša ār1kvi ir1zga ek1šgā ek1sve at1gle ār1stī es1pro al1kma iz1klī ug1sto az1pro āj1sla en1tne ul1sti at1kre ār1sva ār1šķe iz1kļū ap1slu il1zka ek1šme am1pšo ūr1sko uz1grā es1grā ap1šņu ir1kļa ur1lmē el1dfē az1dru at1rpu um1stu es1grī iz1kna as1smē ur1spī eņ1skā ār1slē udz1vī un1dru ar1ska eņ1tra am1pli uz1kli ul1gtu ēk1brū us1dzī ap1stā ar1kšu es1kra iz1brā ir1sta ar1gce em1ptu ur1ste ār1dru uz1pļa at1glū ad1skā ov1skā ak1stā ēr1zga ir1mga in1gtu īdz1te ār1drī am1bra īk1šķu ur1gsi ab1sci on1dri il1pju āp1jve ar1gbū ul1gšu ār1dva ār1tno ap1plo as1tka il1gšo iz1ska ār1dni ap1dva īk1snā ap1blā as1pļa ap1kre al1pre em1pšo ap1tru ak1stī el1sku ak1ņve ak1špa aļ1ska ūr1sta at1bļā in1gve at1hlo ig1frī ok1snē ār1gri ak1šķi āt1sna ul1tsi as1tni ir1sto an1sfo ek1šla ul1tzo ob1spi os1pri el1bri ār1žvī at1blī ot1rti il1gsi uz1zvē in1spe ir1ptu ag1sva iz1kli ok1sni el1gra um1spē ūp1sti ak1stē ur1kta an1dri ir1pto iz1pli īv1drē ar1pzo ur1bti ul1šņi at1blē og1ļra iz1sle il1pro il1gto eļ1tra iz1slē ār1kve ur1btā ār1frā al1tla ur1pmā ēr1ksi al1ksi ir1kņo in1sra em1blē ib1sta in1sci ur1ktu iz1šķū an1tni ām1glā ur1zva īk1šķē up1rla il1nga il1gla ēk1šņa en1prā uk1špa at1pļa iz1šķī ār1gšu ir1gša ul1dzē an1kku ul1tni un1dzē ap1sma er1sti el1ztu ir1gko im1tre us1sna ūk1šķu ik1tni at1brē as1kra an1dža am1plī ar1kša ap1spe an1ska ih1svē od1sli ēr1pšu ar1gre am1sto ān1ska or1tvī at1svā uz1šķū ūr1sto in1sce ud1spi udz1ga al1snā āg1stu al1tro at1šta at1kļū udz1vi ap1slo ap1gre iz1šņo ug1stu im1sti up1stu ur1stī os1kra ir1ska og1ļde um1dzi in1kvi ed1kļū ul1tra iz1sko el1gtā ur1gtā iz1pļē ap1smu er1stī āt1ršu ok1šņu ap1šķa āt1dzī at1tro at1brī al1sta udz1ru ar1gtē in1sta iņ1ķve at1kri al1snu iz1zvē iz1klu in1hro ir1ptā as1kvi ur1spi iz1kvē ār1skā ir1gtu āp1sta uz1bru ed1krā et1sta al1vga am1pša ar1pga uz1sla at1šķī at1dži ār1kļū ār1šro eņ1bra īk1gru ār1klā ak1ņko od1prā at1klī iz1stē ār1žņa at1tri ik1stū ek1šzī ār1kni ār1pre ap1klā ul1gta ēr1pjo ār1gsi iz1šņa iz1gle ēr1bjo is1stū eļ1drā ik1ste ēr1nga ap1tve uz1skā ap1knā ik1snī am1ble ek1stā ol1fga em1bri uz1spī el1dma iz1slo ar1gkā iz1svī ūg1kri un1kti er1pre uz1švī ap1dzī iz1spī ek1tda ēr1dze il1ska ār1tnu ur1bša ap1tra ap1dze an1ste in1ktū er1ztu as1pru en1sca uz1svā il1dmē ik1sni ār1brē āk1sto āk1slu ap1bri ap1stē iz1sti ap1pļa ār1šta īk1sne un1tra ok1šķi ūs1tni ok1trī iz1glā om1ple ār1kri uv1bra īv1stu āt1rgā ār1pļa uz1klī uz1slo at1gre eļ1bri as1prā ig1žņa ēr1glē ūr1sti īv1sva ah1tve ūk1sne et1rsi uz1špa an1dze um1pra er1plē iņ1sti at1drī at1dva in1tnī in1gvi al1šķī ap1slē id1plē il1nva uz1glū iz1švi udz1pu or1tli in1kri ap1pri em1dvi ār1drā as1tro ar1dze āk1sni uz1ski as1tva um1sve ār1gdi ik1sto os1pre at1frā el1dre il1dva ug1prā ul1stī uz1svi ur1tda ār1slu ūp1stā ez1glu īļ1knā an1cle ūp1stu ec1svi ak1šķe ir1dzī uz1dze āl1spē ij1dro ār1kla im1sli ap1bli il1sru on1skā uz1spi ul1dze ik1šķo us1krū ek1stī ek1šro it1bri as1pri ik1šķu or1tku at1kni is1mju im1stu ez1prā at1sli ur1vma om1sta er1sta ot1rpu es1pra uz1gre at1šķē ur1dzi ūk1ste ap1smi ār1stu an1skā ūr1stē ur1zmi ār1krē er1sma at1šņu od1sko im1pre al1snē ap1dza iz1pļa il1krū at1spe uz1krā in1tra at1šķi at1bro el1tga in1tro on1tda ak1šķa as1tna ir1ski aļ1stu os1kni ēr1tni ār1trū er1zta ir1zma iz1knu ar1gku eļ1gle iz1dzē ap1sti os1trā uz1šķi os1tru ir1kļu es1brā ar1sto ap1grā us1tme iz1ski in1sva um1sko un1kni at1kvi uk1stī ap1pli ot1plā et1rmo el1djo ub1sta uz1sni iz1dze ul1gšo am1pjo uz1dre ar1pni is1mmī al1dzī iz1žvī ar1bmū at1spo al1šķi uz1kvē al1kti udz1re ār1spī iz1kra et1rre ab1sto uz1slu ār1plē us1ttē ur1sta iz1gri ot1rto en1sti āv1grū ār1tva un1slī on1gre ēk1sne ir1kni el1dpū av1grī or1tjē īk1smā īdz1ju es1smē iz1spo iz1brī um1bve is1kva īg1ļla īs1stū im1tkā ār1gme ār1ble āč1plē ēr1zci ēp1sta el1drā ak1šķu al1nga uk1šķē ir1ktā od1ska īk1sto ir1spe ir1pšo ēj1spē at1hro id1smi on1tra at1gve il1dķe in1sku el1dtī ek1šķi uz1kre ap1zvē ār1ska ān1sve udz1vā iz1ste uz1pla an1cka ež1frē in1gša ap1hro in1gtī ir1mdi ir1mva ap1svi uz1dzī uz1pro ēr1sna ap1dro uz1blo al1tva ek1šsē udz1ve ih1stā uz1gra ēd1dzi ar1psi ār1dri at1klā iz1tve ār1sle ul1gša al1tvī ēr1ļve ir1mzi at1dra os1pļa ir1kto el1nga ēl1spi ap1gru ēr1bti us1pli ik1sma ār1slī ol1ska īt1ska ap1dži ur1tnī uz1dzi ār1šmī odz1ni ar1gda at1ski uz1dzē el1tli ov1ski el1ztā at1blā ar1dzī is1trā as1tra en1svī on1krē ur1gta en1tmē ār1kru un1dri ār1gla el1pva as1pro is1pri iz1plū il1dko ār1šļi ar1tne us1tne at1kna at1kra at1spi ēr1ptā īk1sta in1grī ed1spi op1stu um1šsa ap1pre ap1trū ār1šķa at1brū um1šķi el1stu al1sto uz1kļa al1nze at1gru on1fro at1kla ap1brū ir1mtē īdz1nā uz1šmī ap1gra ak1šze ap1blī an1kno il1skā ir1ktu ēt1spē al1vni ar1gri uz1kle ul1sto es1krū iz1pļā uz1plo at1šļi ug1šma ec1sla īg1sto uz1blē ib1sti en1sto in1kli ir1dzi ug1zna in1gro as1prū ež1gra iz1kre eg1slā ām1grā ig1znā am1fle ir1pša eg1smi uz1šķa ap1šķē ug1sti al1ste al1nci em1mvi īdz1ti ik1sno ār1svē et1rkā ul1gtā at1spē ār1sto il1šmā et1rti ar1dzē er1cko ar1sta ēr1bša āj1gle am1pja uz1dva ot1rkā ak1šma uz1plē ak1špu ār1bļā ir1gtā ik1šķē uz1zva al1stī os1kle ār1ste ug1šžo ēr1tne iz1dva is1tru ek1šku ap1skā ar1gti ar1gvi uz1smi im1pto ār1ski ār1plū uļ1ska ib1snī iz1šķi ap1ski un1sbī ep1stē us1sko at1zvē at1sti el1dzo īk1smē an1sku um1sla uz1šma ap1žņa ek1šze uz1kri ir1mmā an1čka ēg1sta at1kro et1rrā uz1knā uz1stā ap1drī ez1glo at1ple ar1šļa ug1šņu ār1kli ot1rzi al1kvī is1tra ib1stā or1dni el1dpa in1gpo ul1sla uz1tve el1tta ap1plē uz1šņa ār1sta os1tbi ār1gle og1ļrū er1stu iz1plo ūv1bri ēl1spu iz1sli ap1plu um1sti uk1švā us1tra uz1dži ēr1npa el1pjo et1kre āb1slē ik1lķe an1spo im1tku ok1gre iļ1ska an1tku an1sjē il1pša ūk1snā āl1szā ol1sto us1trē ij1krē an1flo ap1glā āl1svi at1slo ur1bjo el1sme at1smē op1dzī ūg1stu al1tra er1tne at1švi os1trē ez1drā ur1gša en1spo ov1ska il1ktu es1tre iz1dve ār1smē at1gra āg1sta ūv1gri as1tmā in1flā oņ1stū ār1klu el1tne ak1sta ār1dko ār1kvē an1tro at1kru ap1sto il1pta edz1ni is1pro īr1gro udz1si em1bra ār1zko ul1šņā us1sti ēk1šķi udz1vē um1tni ar1stu ap1kle īk1smu up1sta īk1sma ār1zva ab1rka ēdz1ni āb1stā ēr1kli en1tro ār1plī il1gšu ap1kvē as1tre ak1ste ek1šķa āt1rmo an1sce in1sde iz1kru ap1šļā at1bre on1sta ēr1zla el1gša ām1bra el1dzi uz1dru udz1di ap1brā ar1kta eņ1sla ar1švi iz1smi ir1vja en1gri ar1kšo uz1drī ul1sta ek1sme ār1šņa ār1zni ār1tro ap1kli ār1svi ēr1stē īk1stī et1rtū īdz1ci ur1tli ek1sto im1tsa us1brā uk1šķo ir1zta ār1stū un1ktu ēr1mju īk1šķa ur1kli uz1fli ap1plū il1dzi ap1dre az1sva ug1ļla at1stī iz1plu uz1tro is1sli iž1skā ir1gšo en1ktā ār1gta iz1bli ār1smī im1brī ār1dzē ār1svī ek1spa īdz1ko uz1svē at1plo or1tla ab1prā ir1tne ūk1slā iz1sve et1plā ir1sva il1bti uz1brū īt1spē uz1šķē udz1no at1slā iz1blā es1tdi us1zvi is1kri ēl1slē ob1sku ēk1šņi ul1šņu on1tro il1stī iz1bra ur1pni al1dsē im1ttū is1spē es1tme in1gvī ug1špu ir1dne iļ1ņla ap1sta ik1smi ad1grā iz1spē il1gtā iz1sva il1nbā im1stā ak1šve uz1pra uz1grū ār1skū iz1bru us1tsē ug1snē ār1dzo in1tni ig1sti er1gtu en1tru as1krū ār1slā ap1tvē el1sti il1sto il1dra ot1rga ur1kņu ap1bra er1tzā at1stā er1cli ēr1bšu uz1stē ap1plā an1gvi uz1šļi uz1blā ed1rvi as1tla iz1stu ot1spē us1pro im1tda am1krē op1pro ig1žņo at1bļa ap1kni iz1sma iz1grū an1dpu īv1prā ur1stu ar1stī ig1zne ūk1sta āj1sko ek1ška ub1sti ur1dze iz1hro ap1šma ap1spa ār1stē ib1stu at1smī im1sta il1ksi ar1ndo on1kre es1krē āl1plā uk1sma in1gri um1pro uz1dra ār1pla ār1plu at1ste el1gta en1gru il1tze ār1pri iz1krī at1krē es1prū is1svē ār1švi ār1knu en1ktu ap1tre iz1kņū ul1gsi in1dri iz1drī ek1ste aļ1ķne uz1spē os1tma ug1sni at1grē al1sni ur1nga ip1frū ēr1sko at1stē ēr1gli ol1fra at1gro un1kci ār1kņu iz1sku ek1sce ap1sla at1slē ap1šta ap1šļu es1tri uz1plu ār1bli ār1grā uz1sto il1tra in1gru ūk1sni en1szā os1prā āp1jvī ār1tnē il1ptu um1šza is1kre is1krē ul1gti um1dzī ek1špu ur1zni uz1dro us1tve ās1trā ūg1sta ap1brē er1vje iz1grē ar1gmu at1dru ap1kļa ap1spi ap1bre el1pto ār1tvē al1kšo uk1sme el1dzē il1kme ēn1skā ir1gšu il1sti ir1dsa ir1slī at1smi ār1šķo ar1spa al1dse uz1knu ar1gpo iz1šļa at1šķa ār1šņu uz1sve an1stē ek1trā ār1glu ur1vju oņ1sti at1drā iļ1pro iz1tva iz1trā ap1spā om1pli ak1stu ap1spu ek1tdi ok1ste er1gra am1bre uz1bļa us1gra el1gru am1sta at1sko īb1stu ek1tri el1mla an1sve at1skā un1dzī īk1gra ap1ska in1dko al1ktu ul1dzu es1trā at1spī ol1dla at1šķe eņ1ple os1tla ik1stā ap1švī uz1prā ap1kro ūt1smē is1gri em1pšu iz1bļa ir1mno ap1spī ēr1kti al1gme ed1svi is1bri un1sne en1svi uz1kve ār1gro er1stā uz1šķe eļ1krū od1rpa īv1grā et1rba un1sku ār1tmē āb1stī il1pjo iz1stā uz1žvī uz1šķī is1tko os1pra el1gtu ad1smi om1kra ut1sva il1pti ug1pre un1kte il1gru ār1šķū ez1gli iv1spē er1dlo āt1ršā ēj1grā ur1dzo en1trā ap1bļa ēr1tņu em1dni in1ksa āl1šķē uz1hro iv1sto et1rjū uļ1glu ir1psi el1zce um1slē at1gri el1ptu uk1stā at1pra ar1gjo uz1tva uz1sko iz1stī el1sto ap1pra ov1sku ar1šru ēp1sto at1krā ir1ksi ok1šķe iz1šļā iz1dra il1ptā il1dsē in1gta ūp1sta ug1ļko ar1džu iz1krā ul1dzī ur1stā ārg1sti ilg1sto akt1spo alt1gva ark1sta ugs1tlē uzs1pļa ald1skā ins1grē izs1prū ilk1tni urb1sti ezg1lve arp1pro irk1sni eld1plē ird1spu ilp1stu īns1trā ārs1kra ird1smi eln1svā irp1sti ārg1stu ens1sta ugš1sti irk1sti ilg1sta als1tpu ārd1dzi irm1dzi abs1tra umš1brū arb1spē ils1blī urs1krū izs1pra urb1stu udz1šķa uzs1kra aps1pre ins1gru ens1bla ārs1pra arg1krā ilk1tne ens1tru ulk1ste upj1gra unk1šķi urk1sta aps1krē irs1drē ērt1sli obs1tru ērt1ssū ast1sko ird1ska irg1sto ord1zni aks1tve ikt1stē uzs1pre izs1pro ilt1stē uzs1prā eks1tko alk1stī īdz1pro ens1dro irg1stu ing1sto izs1kra ink1stē alk1šķi ātr1sli ild1spa āls1tre alk1sto ubs1trā aps1tru ērk1šķa izs1trī ats1krē ārs1trī alk1stu uss1kri izs1pre ent1lme irg1zda ilb1sti eks1tre aps1pra ilk1sti unt1szi uzs1pro eks1klu iss1pri aps1trī ulb1sto urk1sti aps1pro aht1klu āls1sta ens1krā ilt1smā eks1pre uzs1tru aps1prā etr1kla uzs1pri īks1tmē eld1spē apj1dra ist1hre ids1krē irs1plā irs1stu unk1stē ilk1sni ink1šķi ird1smī irs1kre īdz1ska alk1snā īks1tsi izs1tru ars1tda unt1sno ēst1gri uzs1tre urk1sto uns1dro ulg1sto ātr1spi ilg1spē erc1sko ilb1sto āls1skā ens1krū aps1tri ilk1tnē udr1skā urb1jma ats1pra ird1sli izs1trā ekš1ņnī ind1sta aps1kra ērk1stu iln1bri uzs1pra udz1pla ilb1stu izs1kri ilk1stu irp1sta eks1trē ugs1tka ult1zva ātr1gri ink1šķo urk1šķa ulb1sti uzs1trā aps1trā irk1stī ulb1stu unk1tsi ons1trē īgt1spē ark1stu ilk1sto ark1šķo alt1kvē uns1dzē irk1stē ild1krē ink1sli urs1trā unk1sto ilk1stē ārg1sto akt1sgu ert1bri ilg1sti ērt1svē ērs1gri aps1trē eņs1krā amp1stu ats1trā ilp1sti ežs1trā erk1šķi eln1pla urk1sni akt1svi ens1dzi irg1sti ark1šķu ess1krā irk1sto unt1sma isn1gri alk1sne ild1pla udz1ska ārs1tru uzs1krū ink1šķē ērs1svī ērk1šķo īks1tpi ilt1rpa ātr1bra urk1stu ārs1pro als1sti eks1plo amp1sto izs1tre ang1ste irg1sta izs1krē ātr1spē ust1knā ark1šķē ark1šķi ārs1prā aps1prū ilp1sto īgs1trā ont1rre akt1sde ats1tre uzs1trī aps1pļa urk1šķi urk1ste ink1stu ājs1trā ats1pļa ērk1šķi etr1stū ink1sta ans1kri eks1pro ald1drā ārp1sta urb1sta unk1šķē akt1sda akt1spu alk1sni ārg1sta āls1tra āls1ste irg1zde āgs1tvi ird1zni irt1sku ons1trā ērk1sta ilp1sta isn1stū elk1sni ilt1sko ats1prū urk1šķu ars1tga ugs1tro ens1šķi ing1sti ads1krū els1tra ark1šķa ark1sto ant1sbe ink1šķa unk1sti ird1sde ink1sti ans1pla ugs1tra ats1pre irk1šķi irp1stu ils1dru als1tni ats1tru ins1tru anž1dze īks1pro amp1sti ars1tvī ugš1stā anc1spē ark1sti unk1sta irm1ska akt1smī ulg1stu amp1sta eks1trī unk1šķo urk1stē elz1szā ārs1tre ens1kri ink1šķe uks1trā ink1sto ult1spū elt1spē ats1pri ild1spē uzs1prū eks1tro egl1prā irp1sto alt1kri akņ1gra ārs1lve ārs1pļa udz1stū urb1sto aps1tre ugs1tvē ekļ1skā unk1šķa isn1prā ats1tri ākļ1stā udz1krā imt1pro ing1sta eks1plu akt1spa ilk1sta alk1šņa ats1prā īks1tča ent1rti ērk1sti irg1spē ikt1spē izs1prā akt1smi izs1krū unk1stu ats1krū ārs1pri unk1šķu ult1spē unt1sga ugs1tsi izs1pri ārs1krū aps1krū ārk1sti izs1pļa ars1tpu ērk1ste uzs1tri ulb1sta izs1tri ons1tru irs1svā ats1trī ārs1krē akt1ssa eks1tra akt1slo urk1šķo ing1stu ult1kva ust1spo ītņ1gri ežs1krū irm1sle irk1sta urk1šķē ort1pre ekš1ņla iņs1trā alk1sta irk1stu emm1dzi irg1zdā irm1kla aks1tni ons1tra ink1šķu ats1kra ind1rve akt1sja ens1blu aļķ1špa ult1sva ogļ1skā ārk1sta ulg1sti ērk1sto ird1sdā ugs1tce uns1grē ult1pla irš1krā egt1spē ārs1tni ats1pro akt1sla ārs1tri ilg1stu īdz1sva uzs1krē oks1krū ārt1sta ilb1sta alk1sti oks1tro ekš1dzi ent1rbē iln1ska irm1šķi ārs1trā aps1pri ons1krē ārs1pre irk1ste ird1slē ulg1sta akš1svā alt1bri ārs1prū .jā1s2p .ne1s2p .ie1s2p .no1s2p .pa1s2p .pie1s2p .sa1s2p .uz1s2p .aiz1s2p .ap1s2p .at1s2p .bez1s2p .pār1s2p .iz1s2p .eks1s2p .vis1s2p .jā1t2r .ne1t2r .ie1t2r .no1t2r .pa1t2r .pie1t2r .sa1t2r .uz1t2r .aiz1t2r .ap1t2r .at1t2r .bez1t2r .pār1t2r .iz1t2r .eks1t2r .vis1t2r .jā1s2c .ne1s2c .ie1s2c .no1s2c .pa1s2c .pie1s2c .sa1s2c .uz1s2c .aiz1s2c .ap1s2c .at1s2c .bez1s2c .pār1s2c .iz1s2c .eks1s2c .vis1s2c .jā1s2tj .ne1s2tj .ie1s2tj .no1s2tj .pa1s2tj .pie1s2tj .sa1s2tj .uz1s2tj .aiz1s2tj .ap1s2tj .at1s2tj .bez1s2tj .pār1s2tj .iz1s2tj .eks1s2tj .vis1s2tj .jā1g2l .ne1g2l .ie1g2l .no1g2l .pa1g2l .pie1g2l .sa1g2l .uz1g2l .aiz1g2l .ap1g2l .at1g2l .bez1g2l .pār1g2l .iz1g2l .eks1g2l .vis1g2l .jā1ž2v .ne1ž2v .ie1ž2v .no1ž2v .pa1ž2v .pie1ž2v .sa1ž2v .uz1ž2v .aiz1ž2v .ap1ž2v .at1ž2v .bez1ž2v .pār1ž2v .iz1ž2v .eks1ž2v .vis1ž2v .jā1š2ļ .ne1š2ļ .ie1š2ļ .no1š2ļ .pa1š2ļ .pie1š2ļ .sa1š2ļ .uz1š2ļ .aiz1š2ļ .ap1š2ļ .at1š2ļ .bez1š2ļ .pār1š2ļ .iz1š2ļ .eks1š2ļ .vis1š2ļ .jā1s2f .ne1s2f .ie1s2f .no1s2f .pa1s2f .pie1s2f .sa1s2f .uz1s2f .aiz1s2f .ap1s2f .at1s2f .bez1s2f .pār1s2f .iz1s2f .eks1s2f .vis1s2f .jā1š2t .ne1š2t .ie1š2t .no1š2t .pa1š2t .pie1š2t .sa1š2t .uz1š2t .aiz1š2t .ap1š2t .at1š2t .bez1š2t .pār1š2t .iz1š2t .eks1š2t .vis1š2t .jā1s2tr .ne1s2tr .ie1s2tr .no1s2tr .pa1s2tr .pie1s2tr .sa1s2tr .uz1s2tr .aiz1s2tr .ap1s2tr .at1s2tr .bez1s2tr .pār1s2tr .iz1s2tr .eks1s2tr .vis1s2tr .jā1b2r .ne1b2r .ie1b2r .no1b2r .pa1b2r .pie1b2r .sa1b2r .uz1b2r .aiz1b2r .ap1b2r .at1b2r .bez1b2r .pār1b2r .iz1b2r .eks1b2r .vis1b2r .jā1š2r .ne1š2r .ie1š2r .no1š2r .pa1š2r .pie1š2r .sa1š2r .uz1š2r .aiz1š2r .ap1š2r .at1š2r .bez1š2r .pār1š2r .iz1š2r .eks1š2r .vis1š2r .jā1š2v .ne1š2v .ie1š2v .no1š2v .pa1š2v .pie1š2v .sa1š2v .uz1š2v .aiz1š2v .ap1š2v .at1š2v .bez1š2v .pār1š2v .iz1š2v .eks1š2v .vis1š2v .jā1s2t .ne1s2t .ie1s2t .no1s2t .pa1s2t .pie1s2t .sa1s2t .uz1s2t .aiz1s2t .ap1s2t .at1s2t .bez1s2t .pār1s2t .iz1s2t .eks1s2t .vis1s2t .jā1p2r .ne1p2r .ie1p2r .no1p2r .pa1p2r .pie1p2r .sa1p2r .uz1p2r .aiz1p2r .ap1p2r .at1p2r .bez1p2r .pār1p2r .iz1p2r .eks1p2r .vis1p2r .jā1g2ļ .ne1g2ļ .ie1g2ļ .no1g2ļ .pa1g2ļ .pie1g2ļ .sa1g2ļ .uz1g2ļ .aiz1g2ļ .ap1g2ļ .at1g2ļ .bez1g2ļ .pār1g2ļ .iz1g2ļ .eks1g2ļ .vis1g2ļ .jā1š2k .ne1š2k .ie1š2k .no1š2k .pa1š2k .pie1š2k .sa1š2k .uz1š2k .aiz1š2k .ap1š2k .at1š2k .bez1š2k .pār1š2k .iz1š2k .eks1š2k .vis1š2k .jā1p2s .ne1p2s .ie1p2s .no1p2s .pa1p2s .pie1p2s .sa1p2s .uz1p2s .aiz1p2s .ap1p2s .at1p2s .bez1p2s .pār1p2s .iz1p2s .eks1p2s .vis1p2s .jā1k2l .ne1k2l .ie1k2l .no1k2l .pa1k2l .pie1k2l .sa1k2l .uz1k2l .aiz1k2l .ap1k2l .at1k2l .bez1k2l .pār1k2l .iz1k2l .eks1k2l .vis1k2l .jā1g2r .ne1g2r .ie1g2r .no1g2r .pa1g2r .pie1g2r .sa1g2r .uz1g2r .aiz1g2r .ap1g2r .at1g2r .bez1g2r .pār1g2r .iz1g2r .eks1g2r .vis1g2r .jā1š2ķ .ne1š2ķ .ie1š2ķ .no1š2ķ .pa1š2ķ .pie1š2ķ .sa1š2ķ .uz1š2ķ .aiz1š2ķ .ap1š2ķ .at1š2ķ .bez1š2ķ .pār1š2ķ .iz1š2ķ .eks1š2ķ .vis1š2ķ .jā1p2n .ne1p2n .ie1p2n .no1p2n .pa1p2n .pie1p2n .sa1p2n .uz1p2n .aiz1p2n .ap1p2n .at1p2n .bez1p2n .pār1p2n .iz1p2n .eks1p2n .vis1p2n .jā1s2v .ne1s2v .ie1s2v .no1s2v .pa1s2v .pie1s2v .sa1s2v .uz1s2v .aiz1s2v .ap1s2v .at1s2v .bez1s2v .pār1s2v .iz1s2v .eks1s2v .vis1s2v .jā1s2pr .ne1s2pr .ie1s2pr .no1s2pr .pa1s2pr .pie1s2pr .sa1s2pr .uz1s2pr .aiz1s2pr .ap1s2pr .at1s2pr .bez1s2pr .pār1s2pr .iz1s2pr .eks1s2pr .vis1s2pr .jā1d2r .ne1d2r .ie1d2r .no1d2r .pa1d2r .pie1d2r .sa1d2r .uz1d2r .aiz1d2r .ap1d2r .at1d2r .bez1d2r .pār1d2r .iz1d2r .eks1d2r .vis1d2r .jā1p2l .ne1p2l .ie1p2l .no1p2l .pa1p2l .pie1p2l .sa1p2l .uz1p2l .aiz1p2l .ap1p2l .at1p2l .bez1p2l .pār1p2l .iz1p2l .eks1p2l .vis1p2l .jā1d2v .ne1d2v .ie1d2v .no1d2v .pa1d2v .pie1d2v .sa1d2v .uz1d2v .aiz1d2v .ap1d2v .at1d2v .bez1d2v .pār1d2v .iz1d2v .eks1d2v .vis1d2v .jā1š2l .ne1š2l .ie1š2l .no1š2l .pa1š2l .pie1š2l .sa1š2l .uz1š2l .aiz1š2l .ap1š2l .at1š2l .bez1š2l .pār1š2l .iz1š2l .eks1š2l .vis1š2l .jā1s2k .ne1s2k .ie1s2k .no1s2k .pa1s2k .pie1s2k .sa1s2k .uz1s2k .aiz1s2k .ap1s2k .at1s2k .bez1s2k .pār1s2k .iz1s2k .eks1s2k .vis1s2k .jā1s2kv .ne1s2kv .ie1s2kv .no1s2kv .pa1s2kv .pie1s2kv .sa1s2kv .uz1s2kv .aiz1s2kv .ap1s2kv .at1s2kv .bez1s2kv .pār1s2kv .iz1s2kv .eks1s2kv .vis1s2kv .jā1k2v .ne1k2v .ie1k2v .no1k2v .pa1k2v .pie1k2v .sa1k2v .uz1k2v .aiz1k2v .ap1k2v .at1k2v .bez1k2v .pār1k2v .iz1k2v .eks1k2v .vis1k2v .jā1z2v .ne1z2v .ie1z2v .no1z2v .pa1z2v .pie1z2v .sa1z2v .uz1z2v .aiz1z2v .ap1z2v .at1z2v .bez1z2v .pār1z2v .iz1z2v .eks1z2v .vis1z2v .jā1k2s .ne1k2s .ie1k2s .no1k2s .pa1k2s .pie1k2s .sa1k2s .uz1k2s .aiz1k2s .ap1k2s .at1k2s .bez1k2s .pār1k2s .iz1k2s .eks1k2s .vis1k2s .jā1p2t .ne1p2t .ie1p2t .no1p2t .pa1p2t .pie1p2t .sa1p2t .uz1p2t .aiz1p2t .ap1p2t .at1p2t .bez1p2t .pār1p2t .iz1p2t .eks1p2t .vis1p2t .jā1z2n .ne1z2n .ie1z2n .no1z2n .pa1z2n .pie1z2n .sa1z2n .uz1z2n .aiz1z2n .ap1z2n .at1z2n .bez1z2n .pār1z2n .iz1z2n .eks1z2n .vis1z2n .jā1k2r .ne1k2r .ie1k2r .no1k2r .pa1k2r .pie1k2r .sa1k2r .uz1k2r .aiz1k2r .ap1k2r .at1k2r .bez1k2r .pār1k2r .iz1k2r .eks1k2r .vis1k2r .jā1s2kr .ne1s2kr .ie1s2kr .no1s2kr .pa1s2kr .pie1s2kr .sa1s2kr .uz1s2kr .aiz1s2kr .ap1s2kr .at1s2kr .bez1s2kr .pār1s2kr .iz1s2kr .eks1s2kr .vis1s2kr .jā1f2r .ne1f2r .ie1f2r .no1f2r .pa1f2r .pie1f2r .sa1f2r .uz1f2r .aiz1f2r .ap1f2r .at1f2r .bez1f2r .pār1f2r .iz1f2r .eks1f2r .vis1f2r .jā1s2h .ne1s2h .ie1s2h .no1s2h .pa1s2h .pie1s2h .sa1s2h .uz1s2h .aiz1s2h .ap1s2h .at1s2h .bez1s2h .pār1s2h .iz1s2h .eks1s2h .vis1s2h .jā1ž2ņ .ne1ž2ņ .ie1ž2ņ .no1ž2ņ .pa1ž2ņ .pie1ž2ņ .sa1ž2ņ .uz1ž2ņ .aiz1ž2ņ .ap1ž2ņ .at1ž2ņ .bez1ž2ņ .pār1ž2ņ .iz1ž2ņ .eks1ž2ņ .vis1ž2ņ .jā1d2d .ne1d2d .ie1d2d .no1d2d .pa1d2d .pie1d2d .sa1d2d .uz1d2d .aiz1d2d .ap1d2d .at1d2d .bez1d2d .pār1d2d .iz1d2d .eks1d2d .vis1d2d .jā1š2pr .ne1š2pr .ie1š2pr .no1š2pr .pa1š2pr .pie1š2pr .sa1š2pr .uz1š2pr .aiz1š2pr .ap1š2pr .at1š2pr .bez1š2pr .pār1š2pr .iz1š2pr .eks1š2pr .vis1š2pr .jā1v2j .ne1v2j .ie1v2j .no1v2j .pa1v2j .pie1v2j .sa1v2j .uz1v2j .aiz1v2j .ap1v2j .at1v2j .bez1v2j .pār1v2j .iz1v2j .eks1v2j .vis1v2j .jā1f2j .ne1f2j .ie1f2j .no1f2j .pa1f2j .pie1f2j .sa1f2j .uz1f2j .aiz1f2j .ap1f2j .at1f2j .bez1f2j .pār1f2j .iz1f2j .eks1f2j .vis1f2j .jā1p2j .ne1p2j .ie1p2j .no1p2j .pa1p2j .pie1p2j .sa1p2j .uz1p2j .aiz1p2j .ap1p2j .at1p2j .bez1p2j .pār1p2j .iz1p2j .eks1p2j .vis1p2j .jā1b2ļ .ne1b2ļ .ie1b2ļ .no1b2ļ .pa1b2ļ .pie1b2ļ .sa1b2ļ .uz1b2ļ .aiz1b2ļ .ap1b2ļ .at1b2ļ .bez1b2ļ .pār1b2ļ .iz1b2ļ .eks1b2ļ .vis1b2ļ .jā1g2n .ne1g2n .ie1g2n .no1g2n .pa1g2n .pie1g2n .sa1g2n .uz1g2n .aiz1g2n .ap1g2n .at1g2n .bez1g2n .pār1g2n .iz1g2n .eks1g2n .vis1g2n .jā1h2r .ne1h2r .ie1h2r .no1h2r .pa1h2r .pie1h2r .sa1h2r .uz1h2r .aiz1h2r .ap1h2r .at1h2r .bez1h2r .pār1h2r .iz1h2r .eks1h2r .vis1h2r .jā1s2n .ne1s2n .ie1s2n .no1s2n .pa1s2n .pie1s2n .sa1s2n .uz1s2n .aiz1s2n .ap1s2n .at1s2n .bez1s2n .pār1s2n .iz1s2n .eks1s2n .vis1s2n .jā1ž2m .ne1ž2m .ie1ž2m .no1ž2m .pa1ž2m .pie1ž2m .sa1ž2m .uz1ž2m .aiz1ž2m .ap1ž2m .at1ž2m .bez1ž2m .pār1ž2m .iz1ž2m .eks1ž2m .vis1ž2m .jā1d2ž .ne1d2ž .ie1d2ž .no1d2ž .pa1d2ž .pie1d2ž .sa1d2ž .uz1d2ž .aiz1d2ž .ap1d2ž .at1d2ž .bez1d2ž .pār1d2ž .iz1d2ž .eks1d2ž .vis1d2ž .jā1k2c .ne1k2c .ie1k2c .no1k2c .pa1k2c .pie1k2c .sa1k2c .uz1k2c .aiz1k2c .ap1k2c .at1k2c .bez1k2c .pār1k2c .iz1k2c .eks1k2c .vis1k2c .jā1k2ņ .ne1k2ņ .ie1k2ņ .no1k2ņ .pa1k2ņ .pie1k2ņ .sa1k2ņ .uz1k2ņ .aiz1k2ņ .ap1k2ņ .at1k2ņ .bez1k2ņ .pār1k2ņ .iz1k2ņ .eks1k2ņ .vis1k2ņ .jā1š2m .ne1š2m .ie1š2m .no1š2m .pa1š2m .pie1š2m .sa1š2m .uz1š2m .aiz1š2m .ap1š2m .at1š2m .bez1š2m .pār1š2m .iz1š2m .eks1š2m .vis1š2m .jā1g2v .ne1g2v .ie1g2v .no1g2v .pa1g2v .pie1g2v .sa1g2v .uz1g2v .aiz1g2v .ap1g2v .at1g2v .bez1g2v .pār1g2v .iz1g2v .eks1g2v .vis1g2v .jā1h2l .ne1h2l .ie1h2l .no1h2l .pa1h2l .pie1h2l .sa1h2l .uz1h2l .aiz1h2l .ap1h2l .at1h2l .bez1h2l .pār1h2l .iz1h2l .eks1h2l .vis1h2l .jā1k2ļ .ne1k2ļ .ie1k2ļ .no1k2ļ .pa1k2ļ .pie1k2ļ .sa1k2ļ .uz1k2ļ .aiz1k2ļ .ap1k2ļ .at1k2ļ .bez1k2ļ .pār1k2ļ .iz1k2ļ .eks1k2ļ .vis1k2ļ .jā1s2l .ne1s2l .ie1s2l .no1s2l .pa1s2l .pie1s2l .sa1s2l .uz1s2l .aiz1s2l .ap1s2l .at1s2l .bez1s2l .pār1s2l .iz1s2l .eks1s2l .vis1s2l .jā1t2v .ne1t2v .ie1t2v .no1t2v .pa1t2v .pie1t2v .sa1t2v .uz1t2v .aiz1t2v .ap1t2v .at1t2v .bez1t2v .pār1t2v .iz1t2v .eks1t2v .vis1t2v .jā1š2ņ .ne1š2ņ .ie1š2ņ .no1š2ņ .pa1š2ņ .pie1š2ņ .sa1š2ņ .uz1š2ņ .aiz1š2ņ .ap1š2ņ .at1š2ņ .bez1š2ņ .pār1š2ņ .iz1š2ņ .eks1š2ņ .vis1š2ņ .jā1š2p .ne1š2p .ie1š2p .no1š2p .pa1š2p .pie1š2p .sa1š2p .uz1š2p .aiz1š2p .ap1š2p .at1š2p .bez1š2p .pār1š2p .iz1š2p .eks1š2p .vis1š2p .jā1d2z .ne1d2z .ie1d2z .no1d2z .pa1d2z .pie1d2z .sa1d2z .uz1d2z .aiz1d2z .ap1d2z .at1d2z .bez1d2z .pār1d2z .iz1d2z .eks1d2z .vis1d2z .jā1f2l .ne1f2l .ie1f2l .no1f2l .pa1f2l .pie1f2l .sa1f2l .uz1f2l .aiz1f2l .ap1f2l .at1f2l .bez1f2l .pār1f2l .iz1f2l .eks1f2l .vis1f2l .jā1k2n .ne1k2n .ie1k2n .no1k2n .pa1k2n .pie1k2n .sa1k2n .uz1k2n .aiz1k2n .ap1k2n .at1k2n .bez1k2n .pār1k2n .iz1k2n .eks1k2n .vis1k2n .jā1p2ļ .ne1p2ļ .ie1p2ļ .no1p2ļ .pa1p2ļ .pie1p2ļ .sa1p2ļ .uz1p2ļ .aiz1p2ļ .ap1p2ļ .at1p2ļ .bez1p2ļ .pār1p2ļ .iz1p2ļ .eks1p2ļ .vis1p2ļ .jā1s2pļ .ne1s2pļ .ie1s2pļ .no1s2pļ .pa1s2pļ .pie1s2pļ .sa1s2pļ .uz1s2pļ .aiz1s2pļ .ap1s2pļ .at1s2pļ .bez1s2pļ .pār1s2pļ .iz1s2pļ .eks1s2pļ .vis1s2pļ .jā1s2kl .ne1s2kl .ie1s2kl .no1s2kl .pa1s2kl .pie1s2kl .sa1s2kl .uz1s2kl .aiz1s2kl .ap1s2kl .at1s2kl .bez1s2kl .pār1s2kl .iz1s2kl .eks1s2kl .vis1s2kl .jā1k2b .ne1k2b .ie1k2b .no1k2b .pa1k2b .pie1k2b .sa1k2b .uz1k2b .aiz1k2b .ap1k2b .at1k2b .bez1k2b .pār1k2b .iz1k2b .eks1k2b .vis1k2b .jā1s2m .ne1s2m .ie1s2m .no1s2m .pa1s2m .pie1s2m .sa1s2m .uz1s2m .aiz1s2m .ap1s2m .at1s2m .bez1s2m .pār1s2m .iz1s2m .eks1s2m .vis1s2m .jā1m2n .ne1m2n .ie1m2n .no1m2n .pa1m2n .pie1m2n .sa1m2n .uz1m2n .aiz1m2n .ap1m2n .at1m2n .bez1m2n .pār1m2n .iz1m2n .eks1m2n .vis1m2n .jā1š2n .ne1š2n .ie1š2n .no1š2n .pa1š2n .pie1š2n .sa1š2n .uz1š2n .aiz1š2n .ap1š2n .at1š2n .bez1š2n .pār1š2n .iz1š2n .eks1š2n .vis1š2n .jā1v2r .ne1v2r .ie1v2r .no1v2r .pa1v2r .pie1v2r .sa1v2r .uz1v2r .aiz1v2r .ap1v2r .at1v2r .bez1v2r .pār1v2r .iz1v2r .eks1v2r .vis1v2r .jā1b2l .ne1b2l .ie1b2l .no1b2l .pa1b2l .pie1b2l .sa1b2l .uz1b2l .aiz1b2l .ap1b2l .at1b2l .bez1b2l .pār1b2l .iz1b2l .eks1b2l .vis1b2l 2b3dams. 2c3dams. 2č3dams. 2d3dams. 2f3dams. 2g3dams. 2ģ3dams. 2h3dams. 2j3dams. 2k3dams. 2ķ3dams. 2l3dams. 2ļ3dams. 2m3dams. 2n3dams. 2ņ3dams. 2p3dams. 2r3dams. 2s3dams. 2š3dams. 2t3dams. 2v3dams. 2z3dams. 2ž3dams. 2b3da3ma. 2c3da3ma. 2č3da3ma. 2d3da3ma. 2f3da3ma. 2g3da3ma. 2ģ3da3ma. 2h3da3ma. 2j3da3ma. 2k3da3ma. 2ķ3da3ma. 2l3da3ma. 2ļ3da3ma. 2m3da3ma. 2n3da3ma. 2ņ3da3ma. 2p3da3ma. 2r3da3ma. 2s3da3ma. 2š3da3ma. 2t3da3ma. 2v3da3ma. 2z3da3ma. 2ž3da3ma. 2b3da3mies. 2c3da3mies. 2č3da3mies. 2d3da3mies. 2f3da3mies. 2g3da3mies. 2ģ3da3mies. 2h3da3mies. 2j3da3mies. 2k3da3mies. 2ķ3da3mies. 2l3da3mies. 2ļ3da3mies. 2m3da3mies. 2n3da3mies. 2ņ3da3mies. 2p3da3mies. 2r3da3mies. 2s3da3mies. 2š3da3mies. 2t3da3mies. 2v3da3mies. 2z3da3mies. 2ž3da3mies. 2b3da3mās. 2c3da3mās. 2č3da3mās. 2d3da3mās. 2f3da3mās. 2g3da3mās. 2ģ3da3mās. 2h3da3mās. 2j3da3mās. 2k3da3mās. 2ķ3da3mās. 2l3da3mās. 2ļ3da3mās. 2m3da3mās. 2n3da3mās. 2ņ3da3mās. 2p3da3mās. 2r3da3mās. 2s3da3mās. 2š3da3mās. 2t3da3mās. 2v3da3mās. 2z3da3mās. 2ž3da3mās. 2b3gans. 2c3gans. 2č3gans. 2d3gans. 2f3gans. 2g3gans. 2ģ3gans. 2h3gans. 2j3gans. 2k3gans. 2ķ3gans. 2l3gans. 2ļ3gans. 2m3gans. 2n3gans. 2ņ3gans. 2p3gans. 2r3gans. 2s3gans. 2š3gans. 2t3gans. 2v3gans. 2z3gans. 2ž3gans. 2b3ga3na. 2c3ga3na. 2č3ga3na. 2d3ga3na. 2f3ga3na. 2g3ga3na. 2ģ3ga3na. 2h3ga3na. 2j3ga3na. 2k3ga3na. 2ķ3ga3na. 2l3ga3na. 2ļ3ga3na. 2m3ga3na. 2n3ga3na. 2ņ3ga3na. 2p3ga3na. 2r3ga3na. 2s3ga3na. 2š3ga3na. 2t3ga3na. 2v3ga3na. 2z3ga3na. 2ž3ga3na. 2b3nieks. 2c3nieks. 2č3nieks. 2d3nieks. 2f3nieks. 2g3nieks. 2ģ3nieks. 2h3nieks. 2j3nieks. 2k3nieks. 2ķ3nieks. 2l3nieks. 2ļ3nieks. 2m3nieks. 2n3nieks. 2ņ3nieks. 2p3nieks. 2r3nieks. 2s3nieks. 2š3nieks. 2t3nieks. 2v3nieks. 2z3nieks. 2ž3nieks. 2b3nie3ce. 2c3nie3ce. 2č3nie3ce. 2d3nie3ce. 2f3nie3ce. 2g3nie3ce. 2ģ3nie3ce. 2h3nie3ce. 2j3nie3ce. 2k3nie3ce. 2ķ3nie3ce. 2l3nie3ce. 2ļ3nie3ce. 2m3nie3ce. 2n3nie3ce. 2ņ3nie3ce. 2p3nie3ce. 2r3nie3ce. 2s3nie3ce. 2š3nie3ce. 2t3nie3ce. 2v3nie3ce. 2z3nie3ce. 2ž3nie3ce. 2b3nī3ca. 2c3nī3ca. 2č3nī3ca. 2d3nī3ca. 2f3nī3ca. 2g3nī3ca. 2ģ3nī3ca. 2h3nī3ca. 2j3nī3ca. 2k3nī3ca. 2ķ3nī3ca. 2l3nī3ca. 2ļ3nī3ca. 2m3nī3ca. 2n3nī3ca. 2ņ3nī3ca. 2p3nī3ca. 2r3nī3ca. 2s3nī3ca. 2š3nī3ca. 2t3nī3ca. 2v3nī3ca. 2z3nī3ca. 2ž3nī3ca. 2b3ša3na. 2c3ša3na. 2č3ša3na. 2d3ša3na. 2f3ša3na. 2g3ša3na. 2ģ3ša3na. 2h3ša3na. 2j3ša3na. 2k3ša3na. 2ķ3ša3na. 2l3ša3na. 2ļ3ša3na. 2m3ša3na. 2n3ša3na. 2ņ3ša3na. 2p3ša3na. 2r3ša3na. 2s3ša3na. 2š3ša3na. 2t3ša3na. 2v3ša3na. 2z3ša3na. 2ž3ša3na. 2b3ša3nās. 2c3ša3nās. 2č3ša3nās. 2d3ša3nās. 2f3ša3nās. 2g3ša3nās. 2ģ3ša3nās. 2h3ša3nās. 2j3ša3nās. 2k3ša3nās. 2ķ3ša3nās. 2l3ša3nās. 2ļ3ša3nās. 2m3ša3nās. 2n3ša3nās. 2ņ3ša3nās. 2p3ša3nās. 2r3ša3nās. 2s3ša3nās. 2š3ša3nās. 2t3ša3nās. 2v3ša3nās. 2z3ša3nās. 2ž3ša3nās. 2b3ta3la. 2c3ta3la. 2č3ta3la. 2d3ta3la. 2f3ta3la. 2g3ta3la. 2ģ3ta3la. 2h3ta3la. 2j3ta3la. 2k3ta3la. 2ķ3ta3la. 2l3ta3la. 2ļ3ta3la. 2m3ta3la. 2n3ta3la. 2ņ3ta3la. 2p3ta3la. 2r3ta3la. 2s3ta3la. 2š3ta3la. 2t3ta3la. 2v3ta3la. 2z3ta3la. 2ž3ta3la. 2b3tu3ve. 2c3tu3ve. 2č3tu3ve. 2d3tu3ve. 2f3tu3ve. 2g3tu3ve. 2ģ3tu3ve. 2h3tu3ve. 2j3tu3ve. 2k3tu3ve. 2ķ3tu3ve. 2l3tu3ve. 2ļ3tu3ve. 2m3tu3ve. 2n3tu3ve. 2ņ3tu3ve. 2p3tu3ve. 2r3tu3ve. 2s3tu3ve. 2š3tu3ve. 2t3tu3ve. 2v3tu3ve. 2z3tu3ve. 2ž3tu3ve. .jā3a2 .ne3a2 .ie3a2 .no3a2 .pa3a2 .pie3a2 .sa3a2 .uz3a2 .aiz3a2 .ap3a2 .at3a2 .bez3a2 .pār3a2 .iz3a2 .eks3a2 .vis3a2 .jā3ā2 .ne3ā2 .ie3ā2 .no3ā2 .pa3ā2 .pie3ā2 .sa3ā2 .uz3ā2 .aiz3ā2 .ap3ā2 .at3ā2 .bez3ā2 .pār3ā2 .iz3ā2 .eks3ā2 .vis3ā2 .jā3e2 .ne3e2 .ie3e2 .no3e2 .pa3e2 .pie3e2 .sa3e2 .uz3e2 .aiz3e2 .ap3e2 .at3e2 .bez3e2 .pār3e2 .iz3e2 .eks3e2 .vis3e2 .jā3ē2 .ne3ē2 .ie3ē2 .no3ē2 .pa3ē2 .pie3ē2 .sa3ē2 .uz3ē2 .aiz3ē2 .ap3ē2 .at3ē2 .bez3ē2 .pār3ē2 .iz3ē2 .eks3ē2 .vis3ē2 .jā3i2 .ne3i2 .ie3i2 .no3i2 .pa3i2 .pie3i2 .sa3i2 .uz3i2 .aiz3i2 .ap3i2 .at3i2 .bez3i2 .pār3i2 .iz3i2 .eks3i2 .vis3i2 .jā3ī2 .ne3ī2 .ie3ī2 .no3ī2 .pa3ī2 .pie3ī2 .sa3ī2 .uz3ī2 .aiz3ī2 .ap3ī2 .at3ī2 .bez3ī2 .pār3ī2 .iz3ī2 .eks3ī2 .vis3ī2 .jā3o2 .ne3o2 .ie3o2 .no3o2 .pa3o2 .pie3o2 .sa3o2 .uz3o2 .aiz3o2 .ap3o2 .at3o2 .bez3o2 .pār3o2 .iz3o2 .eks3o2 .vis3o2 .jā3u2 .ne3u2 .ie3u2 .no3u2 .pa3u2 .pie3u2 .sa3u2 .uz3u2 .aiz3u2 .ap3u2 .at3u2 .bez3u2 .pār3u2 .iz3u2 .eks3u2 .vis3u2 .jā3ū2 .ne3ū2 .ie3ū2 .no3ū2 .pa3ū2 .pie3ū2 .sa3ū2 .uz3ū2 .aiz3ū2 .ap3ū2 .at3ū2 .bez3ū2 .pār3ū2 .iz3ū2 .eks3ū2 .vis3ū2 .jā3ie1 .jā3iz1 .jā3no1 .ne3aiz1 .ne3ap1 .ne3ie1 .ne3at1 .ne3in1 .ne3iz1 .ne3sa .ne3uz1 .priek2š1 4d5ze1me .tur2p1m il2k1tie .spil2g1t mē1ne2š1 1pa1d2smit g2š1gal k2š1gal tran2s 1port vēs2t1n vēs2t1k pa2t3stā pa2s2t3k pa2s2t3m pa2s2t2s. pa2r2k2s. pa2r3ket sa2ls. sa2lds. sa2l2d1 pir2m1r pir2m1k pir2m2s1 ot2r1r2 ot2r1k2 ir2k3l ir2k3ļ .adā2m3 .ai4z5 ak3me4ņ3 apak2š3 ap1au kār2t3n aug2s2t3 .at3e2j bal2t3ma .vie2n1",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=11583,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-lv.pat b/Master/texmf-dist/tex/context/patterns/lang-lv.pat
new file mode 100644
index 00000000000..ea7e7fbc257
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-lv.pat
@@ -0,0 +1,11590 @@
+% generated by mtxrun --script pattern --convert
+
+% for comment and copyright, see e:/tmp/patterns/lang-lv.rme
+
+% used: a b c d e f g h i j k l m n o p r s t u v z ā č ē ģ ī ķ ļ ņ š ū ž
+
+\patterns{
+d4z
+d4ž
+a2i
+a2u
+i2e
+e2i
+u2i
+i2u
+o2i
+o2u
+e2u
+.vi1s2a.
+.vi1s2ā.
+.vi1s2i.
+.vi1s2os.
+.vi1s2u.
+.vi1s2iem.
+o1pī
+ū1rē
+i1ta
+ū1ga
+ē1žu
+ū1to
+ā1ni
+i1rē
+i1čo
+ā1bu
+o1mī
+o1kā
+o1či
+ā1lo
+e1čū
+o1ļā
+e1la
+i1šo
+o1bi
+ē1cē
+ā1ru
+o1si
+u1no
+e1hā
+ā1nē
+e1bū
+i1ru
+o1sū
+a1ča
+ā1ča
+o1rē
+i1ke
+o1ra
+u1te
+i1zo
+i1gi
+ē1ma
+ū1ķe
+ū1ca
+o1dē
+a1nā
+ā1ge
+e1či
+ū1bē
+ē1tā
+ā1fi
+i1zi
+o1lī
+e1še
+e1gā
+i1fo
+a1ņo
+u1to
+ī1zē
+ū1gu
+ā1ša
+i1ķi
+ū1nē
+ī1ma
+ā1te
+ē1kē
+ū1mā
+u1zu
+o1sā
+ē1bu
+ī1ga
+e1di
+ī1te
+a1ļī
+e1tē
+i1že
+o1fo
+ā1pu
+o1hu
+ē1do
+o1du
+ā1ma
+ū1mi
+e1re
+i1ha
+i1be
+e1lu
+ā1ja
+ū1ta
+a1šū
+a1da
+ē1cī
+i1bu
+a1pī
+u1ņā
+e1zu
+ū1no
+e1nī
+i1no
+e1mā
+ē1ļa
+ū1pā
+ā1be
+ā1mo
+ī1ja
+e1ji
+ī1re
+e1ce
+ī1ri
+ī1tī
+ū1ni
+ī1žī
+i1ži
+a1fī
+a1be
+e1šā
+e1ķo
+e1pū
+e1ļī
+u1ģi
+ē1tī
+a1ci
+e1jē
+a1zī
+o1lē
+u1ga
+ī1ci
+a1ke
+e1ho
+i1nū
+ū1šī
+e1si
+e1bo
+o1ģē
+u1ņi
+u1sē
+ē1bā
+o1ša
+ū1ro
+ē1ce
+i1zī
+i1ve
+o1ļu
+i1dī
+o1ku
+e1vē
+a1ri
+u1sā
+i1pā
+i1dē
+o1pū
+ī1vī
+a1me
+ē1ze
+ī1bē
+u1ķe
+a1bē
+a1ja
+ā1ļo
+a1jē
+e1fe
+o1pu
+o1to
+ē1vē
+a1ki
+o1mā
+o1lo
+a1lo
+ē1ķi
+e1šē
+ū1dī
+ū1cā
+o1zo
+o1gū
+o1gā
+ī1tē
+e1zē
+ī1le
+e1gī
+ī1na
+o1me
+e1po
+e1fu
+a1ģe
+u1rū
+u1ri
+ū1jo
+e1dē
+a1ļa
+a1žā
+ī1ļa
+ē1ne
+a1zū
+ā1vē
+e1so
+o1mi
+o1šo
+ē1sī
+ē1ļu
+e1ga
+i1pē
+e1vu
+o1ru
+ē1ju
+u1či
+ā1va
+a1hu
+ī1sē
+e1ķa
+i1rā
+a1čā
+ī1ki
+i1ti
+u1cu
+i1žu
+ā1jo
+u1ki
+u1mu
+o1ķī
+e1ma
+ī1ļo
+ē1de
+o1čo
+ā1ču
+i1ņa
+u1ļa
+u1mā
+o1he
+i1lī
+a1de
+o1fa
+ē1ro
+o1sī
+ā1ri
+ū1ti
+o1bē
+a1jā
+ū1zu
+ā1vī
+e1ļe
+o1ņa
+ī1de
+ī1še
+a1kū
+ū1ja
+o1dī
+e1ži
+e1ri
+ī1gā
+e1ki
+u1ze
+u1ma
+i1vī
+ē1pī
+u1lu
+e1ti
+o1čā
+a1ķi
+ū1zē
+a1ļo
+i1či
+o1ke
+a1ģu
+i1vē
+u1ču
+u1ca
+u1vu
+o1ļa
+i1ri
+o1ņo
+u1co
+a1rā
+o1jā
+ī1bi
+e1čī
+ē1rē
+e1kā
+i1pi
+a1ka
+ā1vu
+ū1ža
+e1mī
+e1vī
+o1gi
+a1pē
+ū1zā
+i1cē
+e1va
+o1nī
+ī1ru
+e1pā
+a1ce
+ē1kā
+o1ja
+a1hē
+a1bo
+ū1mu
+ī1ve
+i1nā
+i1fi
+o1va
+u1žu
+e1ģi
+ē1nī
+i1li
+i1ņo
+u1la
+ī1ģe
+e1ca
+a1tā
+ū1zi
+a1bū
+ē1pē
+ī1su
+ī1pā
+ī1zu
+ū1di
+e1lo
+ā1mā
+e1ci
+a1ža
+ē1to
+e1rū
+ā1la
+u1ķu
+o1ģī
+ā1pa
+e1lū
+e1sī
+e1bē
+i1co
+i1ķē
+a1šo
+ū1ku
+u1šā
+o1di
+a1ņa
+ī1pa
+o1pi
+a1žē
+a1si
+a1ha
+u1šo
+ē1mā
+ī1mo
+ā1žo
+ū1lu
+e1žū
+o1ķi
+ā1vā
+a1žo
+i1zā
+a1ku
+o1zi
+o1dā
+e1cu
+ī1no
+e1zi
+e1jū
+ā1ņo
+i1ce
+ū1lē
+a1žī
+o1mē
+i1bī
+o1re
+e1zū
+ū1ra
+a1gi
+i1lē
+ī1bā
+ū1šu
+e1bi
+i1gū
+ū1ķi
+ē1va
+ā1to
+u1ce
+a1pū
+ā1gi
+i1ķe
+ā1kā
+e1ķī
+ē1ža
+u1ve
+u1vo
+ē1no
+o1bu
+a1tī
+e1fi
+e1ļo
+ū1ži
+a1tū
+ī1ti
+ī1la
+i1ho
+ē1gi
+i1fū
+a1tē
+ā1ķi
+a1mi
+e1ra
+u1ja
+e1me
+ī1bu
+i1pu
+o1la
+a1ķī
+u1šu
+o1ža
+a1rū
+ū1ļa
+e1ču
+ī1lo
+o1nu
+ā1jē
+a1dā
+u1rē
+u1rī
+ē1žo
+i1mā
+a1zo
+o1žu
+ē1da
+ī1co
+ū1zī
+ā1sa
+ē1šu
+ū1po
+i1si
+u1zē
+ū1ri
+u1zī
+ū1gā
+e1pu
+ā1du
+e1cē
+ē1ji
+i1bi
+ē1rā
+i1ļi
+u1nu
+i1ki
+a1mū
+ī1ni
+ā1fe
+ē1ca
+ā1ņi
+u1go
+a1nu
+e1nē
+u1ku
+ā1ži
+ē1go
+e1če
+ē1za
+ā1čā
+i1ģe
+ī1go
+a1go
+e1bī
+i1ze
+e1šū
+o1kē
+o1pē
+i1na
+ā1ra
+ā1jī
+o1za
+e1zā
+a1lā
+e1ņē
+a1je
+ē1si
+ā1bo
+u1gā
+i1sē
+u1ši
+u1bī
+a1vā
+e1ko
+ā1šu
+ā1ģē
+i1mo
+e1ļā
+i1tē
+u1ļā
+a1ņē
+u1na
+ī1vo
+ū1me
+a1hī
+ū1ka
+ā1mī
+ā1lī
+ū1tu
+e1je
+ī1vā
+a1ba
+ī1dā
+ū1ko
+ū1cē
+ā1nī
+a1ļē
+u1ju
+ā1žā
+ū1mo
+i1ge
+ā1pā
+e1lā
+i1ķī
+a1sē
+e1ni
+a1ma
+a1tu
+i1kū
+a1bi
+i1jī
+ī1ķu
+e1fā
+u1ta
+ē1dē
+a1gā
+i1lā
+i1ņi
+e1ļa
+ē1ti
+ā1bi
+a1ši
+a1lī
+i1ja
+e1mu
+o1hē
+u1jā
+ū1ša
+i1sā
+u1po
+ā1cā
+a1se
+o1ņe
+u1fo
+ā1sū
+ā1bū
+o1co
+o1ķē
+ā1ļa
+e1že
+u1tī
+ī1ku
+u1ķa
+u1zi
+e1do
+i1so
+o1fi
+ē1sā
+i1pī
+ī1ši
+a1dī
+ā1ti
+u1ņo
+u1pa
+o1ka
+o1cī
+i1pe
+ī1mā
+ā1pē
+ā1pī
+ū1pē
+o1bū
+e1ķē
+a1mē
+ā1rū
+o1de
+i1ķa
+o1šī
+ī1gu
+u1bi
+ā1ka
+ā1nu
+u1ži
+u1so
+ē1ka
+ā1le
+ē1pe
+u1ļī
+ī1me
+u1dī
+i1žā
+i1du
+ē1ra
+o1vo
+o1fā
+o1so
+ā1ļā
+e1dā
+ā1gu
+o1bo
+e1hī
+ā1ģi
+ā1čo
+a1dē
+u1di
+ī1se
+ē1sē
+ā1nā
+a1nī
+ū1rā
+o1hi
+o1šā
+i1lū
+ē1lē
+i1te
+u1še
+ī1tu
+u1ģo
+e1ši
+ū1ba
+e1ņa
+u1si
+ē1zo
+ū1kā
+i1gu
+ū1da
+i1sū
+o1bī
+a1mo
+ē1gā
+ā1ve
+u1bē
+e1ņo
+ē1vo
+ī1mī
+u1ļu
+ā1tu
+i1cī
+u1fa
+ā1tā
+ē1gu
+o1ga
+i1mi
+i1fē
+i1ļe
+ā1co
+u1žī
+i1zē
+i1vu
+a1ju
+i1ca
+ī1ču
+ū1re
+ē1bi
+e1ro
+i1fā
+a1he
+u1mo
+i1jo
+e1bu
+ī1ro
+a1te
+ī1ģi
+ā1di
+i1bū
+u1ļi
+u1le
+a1na
+e1tā
+e1bā
+o1tū
+ū1ze
+ā1fu
+ī1be
+a1pā
+u1de
+i1dū
+e1ve
+ī1di
+a1vo
+u1lā
+e1pi
+u1dē
+ē1dā
+o1jo
+i1žo
+ī1ķe
+o1nā
+e1mū
+ā1zā
+a1ro
+ī1rā
+a1že
+u1je
+a1ti
+ū1cī
+i1tī
+ī1vi
+ī1jo
+e1co
+i1tū
+i1bo
+ū1pe
+e1tū
+o1pā
+ē1se
+a1ļā
+ā1ji
+a1čo
+e1za
+ā1mē
+a1žū
+e1šo
+ī1ļu
+ū1jā
+o1su
+e1ja
+o1ta
+e1lī
+o1ze
+ī1vē
+o1vā
+a1vī
+i1kī
+ā1zī
+u1ha
+ī1pē
+i1de
+o1nē
+ū1bī
+ē1tu
+a1ži
+ā1žu
+o1ņā
+o1ļo
+i1ņē
+u1ci
+ī1ca
+ū1sa
+e1rī
+i1bē
+e1ne
+a1šī
+u1gi
+ī1mu
+a1zā
+i1lo
+ī1cē
+u1lī
+e1čo
+a1bu
+i1nī
+ā1dā
+ā1tē
+ā1ko
+ī1šu
+o1ģi
+a1ta
+i1la
+a1va
+a1še
+a1hi
+a1ca
+e1be
+e1žē
+a1su
+ī1dī
+o1da
+e1ģo
+e1ņu
+e1pa
+ī1jā
+e1sā
+a1ņi
+ū1so
+ī1nu
+i1vo
+ū1lo
+ī1nē
+ē1mī
+ū1cu
+o1žē
+ē1jā
+ī1cā
+a1ču
+o1zū
+a1lu
+ā1lu
+o1ņu
+a1vu
+i1tu
+i1ķu
+i1ķo
+i1ko
+a1fa
+ī1pi
+i1go
+i1me
+a1fi
+e1sū
+ī1ju
+o1pe
+a1sī
+a1nē
+ū1že
+ē1ve
+i1po
+o1zē
+a1ne
+e1sa
+a1lē
+ē1ša
+ū1gi
+ē1lā
+i1mū
+u1vā
+ū1mī
+ū1mē
+u1ro
+ā1po
+o1ju
+i1fu
+i1jē
+i1ga
+ū1tā
+ē1lu
+ū1sā
+a1gū
+ā1bā
+a1la
+o1ri
+ē1šo
+ū1ņa
+o1fē
+e1li
+ē1ko
+u1va
+ī1šo
+a1zi
+e1dī
+i1da
+i1šī
+i1hī
+i1ne
+i1šu
+ē1ku
+e1ņā
+o1na
+ī1ža
+o1ča
+ā1fa
+o1tē
+ī1dē
+o1tā
+i1hi
+ē1mu
+ī1so
+e1cā
+ā1zi
+ī1cī
+u1šē
+o1no
+ā1ņe
+u1bu
+ū1gē
+o1ve
+a1ģī
+i1lu
+i1pa
+e1ka
+ā1ci
+u1ķī
+o1sa
+o1go
+i1nu
+ī1žo
+i1sī
+o1fī
+a1pu
+a1du
+ī1ļi
+o1ba
+i1fa
+e1mi
+o1cu
+u1ža
+ā1mi
+a1ķā
+i1ču
+o1žū
+ī1kā
+ā1ķe
+u1ģē
+e1da
+ē1dī
+ī1čo
+ū1pa
+ā1de
+o1ma
+i1dā
+ē1ņo
+ū1žu
+o1ko
+a1vē
+ā1zē
+ā1sā
+ī1do
+u1cā
+ī1ļā
+u1du
+e1ju
+ā1si
+o1vē
+i1ša
+u1fe
+o1ji
+ē1re
+ū1ļī
+u1ņa
+ā1ca
+a1šu
+ū1nu
+ū1le
+e1ķi
+ā1tī
+o1ge
+i1vā
+ū1za
+ē1nā
+ū1ma
+ā1ķu
+e1lē
+ā1sē
+ā1li
+ī1ne
+i1mī
+ā1pi
+a1mā
+a1žu
+i1ju
+ē1vu
+u1nā
+ū1ru
+e1vi
+a1pa
+i1bā
+o1cē
+ā1lē
+e1ku
+u1lē
+i1se
+e1vā
+ē1jē
+e1pī
+ē1ci
+o1ši
+a1hā
+a1kā
+u1ji
+ū1rī
+ī1sā
+i1ro
+o1rā
+ū1ki
+o1ro
+e1ru
+o1kū
+ē1su
+a1ņā
+ū1tī
+ā1ba
+e1ņe
+e1nu
+ē1te
+ā1vo
+a1sa
+e1nū
+ū1žī
+o1že
+ū1do
+ē1jī
+ī1vu
+o1vi
+u1ba
+ā1na
+ī1mē
+a1ji
+u1ti
+e1mo
+a1ra
+e1hi
+o1te
+u1bo
+e1su
+i1fī
+ē1pi
+i1ģi
+ī1ņu
+ū1lī
+ā1ro
+o1zā
+a1vi
+o1ni
+ī1za
+o1do
+ī1zā
+o1gē
+u1zū
+u1li
+u1da
+a1či
+e1ta
+i1ra
+ā1ķa
+a1jū
+ī1ba
+a1cē
+u1ra
+i1kā
+i1zu
+ē1nu
+a1šā
+e1to
+u1gē
+ū1pī
+a1ho
+ā1je
+ī1ķa
+a1ve
+o1šu
+u1čo
+ī1mi
+u1sī
+a1dū
+e1cū
+ī1rī
+u1ko
+ā1ķī
+ā1zu
+ā1mu
+ī1sa
+ā1ņu
+u1ka
+i1ba
+ū1vi
+ē1ga
+ē1ģe
+a1rī
+u1ša
+u1cī
+a1co
+ī1cu
+o1vu
+i1je
+u1do
+o1cā
+ā1vi
+i1jā
+a1ze
+a1mu
+o1ņi
+e1ža
+o1čī
+i1ča
+i1mē
+ā1cī
+ē1la
+e1dū
+ū1nī
+ī1po
+ē1ļi
+ī1nā
+ū1be
+u1se
+ū1ci
+ī1ņā
+ī1ke
+ā1cē
+ē1sa
+ē1li
+a1ģā
+u1pe
+ā1ku
+a1bī
+u1pu
+o1ca
+u1ne
+ī1ļī
+u1mi
+e1du
+i1ļu
+u1pā
+ī1ņa
+ī1pu
+u1be
+o1ču
+o1šē
+ū1šo
+ē1me
+a1ķa
+u1zo
+ē1zā
+ū1ce
+e1tī
+o1ķu
+ē1jo
+u1tū
+ā1cu
+i1vi
+e1žā
+a1jo
+e1jo
+ū1bi
+u1nī
+ā1ļu
+e1zo
+i1ma
+u1vē
+o1jū
+o1ha
+ū1pu
+e1ša
+a1ru
+a1li
+u1mī
+ū1ve
+ā1pe
+i1cu
+ū1nā
+ī1sī
+e1pe
+ī1zī
+i1rī
+ī1pe
+o1po
+ā1rē
+a1ņe
+ī1gi
+e1žī
+ī1lu
+i1su
+ī1tā
+a1no
+ī1ži
+a1sū
+a1ko
+i1žē
+u1jo
+i1va
+ī1ji
+a1fe
+o1pa
+e1rē
+e1šī
+ē1cu
+i1šā
+ū1žā
+e1ģe
+ē1cā
+a1po
+i1tā
+ā1ne
+ī1va
+e1se
+ī1ra
+o1gu
+ū1de
+u1dā
+i1di
+u1rā
+ē1nē
+a1to
+e1fī
+a1so
+e1ze
+ē1le
+o1mu
+ī1ta
+e1ļu
+a1zē
+ē1ķē
+o1ģe
+e1na
+ū1vē
+ē1du
+u1žo
+i1nē
+ī1si
+i1ka
+ī1fe
+e1no
+i1le
+e1pē
+e1ģē
+ā1go
+i1ni
+e1ča
+a1čī
+ē1be
+a1ša
+e1gi
+i1mu
+ē1bē
+a1čū
+ī1šā
+a1bā
+ī1du
+o1ci
+ē1bo
+ā1ki
+o1mo
+ē1lo
+o1lā
+o1le
+a1gī
+u1kā
+ē1vi
+ī1lē
+u1čē
+ē1mo
+a1cī
+u1ča
+ī1to
+a1fē
+u1ķi
+e1fa
+ī1ša
+o1bā
+a1ļi
+ī1da
+a1mī
+i1gā
+a1ģē
+e1cī
+ā1ta
+i1re
+ā1me
+ū1dē
+a1re
+ī1li
+a1ga
+o1tu
+u1pī
+e1ha
+ā1ķē
+e1tu
+i1ģē
+e1kē
+ā1bē
+o1čū
+a1zu
+ū1sē
+ū1ne
+ā1ga
+ū1vo
+o1ho
+ē1ļā
+o1rī
+ū1ju
+o1fu
+ū1ji
+o1lū
+ā1do
+i1to
+u1bā
+u1ge
+u1cē
+a1le
+u1ķē
+ī1ce
+a1ķu
+ā1ze
+e1šu
+ē1ja
+a1vū
+i1ņā
+ē1na
+o1ne
+ā1dē
+ā1ģa
+u1su
+u1sa
+ē1di
+ū1su
+e1fo
+ē1ni
+ī1pī
+i1ku
+ē1pa
+ē1po
+ī1zi
+i1ļa
+i1ši
+ē1lī
+ā1no
+a1jī
+ā1gā
+o1zī
+ā1dī
+o1ļi
+ā1rā
+ē1zi
+ū1pi
+ē1ge
+o1mū
+i1kē
+e1gū
+u1gu
+i1zū
+a1gu
+a1lū
+i1cā
+ū1lā
+o1ķe
+o1se
+ē1vā
+ē1ru
+a1fo
+e1sē
+ā1re
+ā1lā
+e1ļi
+a1ņu
+e1jā
+ā1ža
+ē1zu
+e1ņi
+u1pi
+ē1mē
+o1ņē
+o1ti
+u1pē
+e1zī
+u1fi
+e1ķe
+ā1jā
+u1vī
+ī1ņi
+u1žā
+ū1li
+e1de
+o1be
+ē1zī
+e1hu
+e1he
+ī1lā
+u1tē
+e1nā
+a1sā
+ā1se
+ē1ļo
+a1ģi
+ī1ze
+o1je
+ū1te
+e1kū
+o1li
+ā1ce
+o1vī
+i1ci
+ā1so
+e1ge
+i1še
+a1ni
+i1do
+ā1lū
+o1žā
+o1še
+o1zu
+a1cu
+e1mē
+e1gu
+ē1ta
+a1do
+e1ba
+ē1ģi
+e1žo
+ā1gū
+a1za
+ū1la
+ū1ķī
+a1pi
+ī1nī
+ū1šā
+i1šē
+o1ļe
+ē1mi
+u1zā
+i1ķā
+ī1ko
+o1dū
+ī1ķi
+a1ķē
+ā1su
+ī1lī
+e1čā
+ē1ļe
+u1za
+o1ži
+o1fe
+ū1tē
+o1ki
+ā1za
+e1le
+ē1bī
+a1di
+o1sē
+ī1žu
+ī1bo
+u1me
+a1rē
+i1ļo
+ū1si
+ā1sī
+u1ni
+ī1ka
+ā1ļi
+o1tī
+ā1šo
+u1tu
+e1žu
+i1ža
+o1lu
+ē1rī
+ā1ju
+u1šī
+a1ķe
+ē1so
+ā1da
+ē1ba
+ē1ri
+o1ce
+ē1ki
+i1ļā
+a1pe
+o1šū
+u1ļo
+ī1zo
+ē1rū
+e1go
+e1te
+i1za
+e1vo
+u1vi
+i1fe
+i1ņu
+ā1zo
+ē1zē
+o1jē
+u1re
+ā1ņa
+ē1pā
+o1žo
+u1nē
+u1ņu
+ū1du
+a1ļu
+u1mē
+ē1pu
+u1lo
+i1ji
+ā1rī
+ī1rē
+e1rā
+u1ru
+a1cā
+o1rū
+ū1na
+u1ģe
+ū1dā
+u1tā
+i1sa
+at1tu
+eg1rū
+ak1so
+it1de
+eb1lā
+et1vī
+or1bi
+al1ša
+ap1dū
+ak1na
+um1ci
+aš1le
+ēr1ķe
+en1ku
+il1ki
+ēr1ku
+at1nā
+at1ģē
+us1pē
+os1vī
+os1ci
+an1ra
+en1pa
+ej1dē
+až1vī
+as1bu
+īs1ga
+iņ1di
+en1to
+uj1me
+or1ki
+el1zo
+ot1nē
+es1ko
+uz1gu
+ak1ti
+īr1ni
+iz1hi
+il1pu
+es1ma
+āt1vi
+ag1rē
+on1zē
+īb1tu
+ap1do
+īt1vī
+ul1sā
+īk1lī
+ur1so
+ok1tē
+ēb1tu
+īs1la
+et1ve
+al1mo
+op1ša
+en1ce
+im1nī
+uš1ķa
+ek1ti
+iz1cī
+er1di
+ur1fa
+an1tā
+er1ba
+as1pe
+al1su
+ip1so
+al1cī
+at1de
+aņ1ra
+ēk1šu
+īg1li
+om1ni
+oņ1ka
+as1le
+at1ņi
+id1rī
+un1ve
+al1kū
+in1da
+ār1ba
+īs1žu
+al1ka
+up1jī
+ur1gu
+at1sī
+īg1mā
+āl1ti
+al1va
+uļ1ku
+ok1rē
+er1gi
+uz1ļo
+ak1šē
+īm1re
+iz1te
+āt1vē
+ēg1ni
+īg1ru
+il1cē
+ir1mu
+ar1ku
+ot1zi
+ub1na
+an1če
+om1bī
+ēg1si
+el1le
+av1ru
+il1nu
+ēs1te
+ur1kā
+ik1ro
+ep1nu
+ur1vē
+oņ1lu
+it1ma
+il1ja
+ēj1tē
+an1ga
+eš1pa
+āl1ce
+ob1rī
+ur1vi
+up1ri
+ēz1tā
+iz1čo
+ap1ša
+uz1ru
+ut1rē
+ar1to
+ež1nī
+aš1ļu
+aļ1ce
+al1ne
+is1sī
+ib1šo
+uz1nu
+ut1ņu
+ul1de
+ār1ho
+am1pū
+ēl1gu
+um1vi
+ik1to
+ēr1ze
+ož1va
+ez1nī
+am1lī
+ak1se
+el1ko
+ep1si
+āj1tu
+um1zā
+at1ja
+al1ķī
+az1dā
+or1to
+ec1he
+at1cī
+en1ko
+ūs1ki
+īg1sa
+ef1ri
+ār1sa
+im1po
+īt1rī
+ed1vi
+id1sē
+ā1džā
+up1la
+ēc1te
+es1pu
+uk1šo
+āp1ni
+ā1dži
+ak1la
+en1na
+as1ka
+ām1di
+ag1li
+og1rā
+ag1dā
+oz1vi
+an1ku
+īk1nē
+us1mū
+er1ma
+āb1ša
+in1tu
+ob1ti
+ap1cu
+es1vā
+ac1ti
+ur1pu
+ar1kī
+el1la
+it1ta
+am1le
+ik1se
+ēk1ti
+ar1sa
+is1mu
+ut1ķe
+ār1vī
+u1dži
+et1nā
+id1ka
+āl1se
+ur1na
+ār1zo
+uz1li
+ān1ka
+as1ve
+ab1la
+aņ1ķe
+ēb1tā
+el1vā
+al1žu
+at1pū
+at1go
+ēr1la
+e1dzi
+iz1dē
+ab1se
+at1žē
+ir1ca
+ēr1su
+uļ1ma
+el1pe
+ej1ve
+ap1ve
+īg1rā
+el1po
+ed1lo
+it1mo
+ep1nā
+uk1tu
+at1šo
+ap1šā
+ār1čo
+ak1sē
+ek1tē
+om1pe
+ul1go
+um1dī
+ec1si
+ēd1vi
+um1mā
+iz1mo
+ok1zā
+āp1ro
+āl1ko
+āl1vē
+ed1po
+īl1zi
+of1rē
+ēj1lo
+ap1sū
+ip1šo
+is1pu
+in1fe
+ep1ra
+at1ša
+or1ga
+on1gā
+ak1šu
+at1jo
+es1pa
+uz1ša
+ār1su
+uz1be
+ik1sī
+en1ša
+ok1te
+ok1bu
+ur1ša
+or1ģe
+īn1ta
+ap1ģi
+iz1zu
+im1tī
+ap1te
+on1nā
+us1jū
+ur1no
+ab1ti
+en1jū
+op1so
+eņ1no
+ur1ka
+an1šo
+ol1le
+ūs1mo
+ās1tā
+ek1tī
+uz1sī
+iš1ķā
+um1pā
+is1po
+ob1lē
+ap1za
+ek1do
+ez1mē
+ēd1la
+uš1ka
+of1ri
+en1hī
+āf1ri
+uk1nu
+iz1do
+ej1ga
+ul1ri
+iz1fi
+ir1na
+is1ka
+ār1do
+en1šo
+ož1ma
+ēs1tī
+at1sā
+um1la
+oš1pa
+eb1to
+ez1ņi
+ej1ka
+iv1žu
+uņ1ģu
+ik1na
+il1ko
+ol1mu
+im1si
+ap1ta
+os1tu
+us1tī
+at1ko
+ar1ci
+iļ1do
+un1či
+oš1si
+en1zā
+ir1zo
+i1džā
+uz1ba
+er1vē
+ip1ni
+il1zu
+in1pū
+or1hi
+iv1de
+os1mē
+uz1pū
+ām1pi
+os1tū
+az1bē
+al1de
+on1de
+uz1ce
+em1ba
+ēr1ļu
+at1nē
+ār1tū
+ur1cu
+ir1ku
+āv1da
+īp1ri
+op1rā
+ej1ni
+am1dī
+ak1va
+ek1pi
+up1ve
+ūt1ma
+un1tā
+aš1ma
+āv1ja
+um1ti
+ūz1mā
+im1te
+ev1rē
+on1ti
+ig1za
+iz1gū
+up1rā
+id1pū
+ār1cī
+ār1lī
+el1lē
+us1ga
+ez1da
+ap1cē
+ej1la
+ag1da
+uz1va
+op1sē
+āģ1ve
+el1to
+ēz1kū
+eš1vi
+uz1vī
+ī1dze
+is1mē
+ef1rī
+ab1ša
+up1ma
+ār1nī
+aš1va
+ab1ri
+ob1tā
+ik1sā
+is1mī
+ag1ša
+ūr1ka
+āņ1mu
+ev1ni
+or1da
+em1ze
+āj1lo
+at1rū
+al1re
+il1cī
+ār1mi
+et1ma
+um1da
+ob1le
+āp1tu
+el1pā
+iz1ķe
+ez1tu
+al1tī
+ap1rū
+iz1ta
+em1ža
+ar1gi
+ēv1re
+as1kā
+až1kā
+eg1ta
+al1gā
+ap1le
+ap1ro
+īv1ni
+op1ka
+ik1vi
+il1tī
+ur1pī
+ir1kī
+iņ1ne
+iz1da
+op1re
+ēl1ni
+is1nu
+ar1cē
+ed1sē
+ul1ka
+ās1ma
+op1ba
+os1fē
+ak1le
+eļ1mū
+ēb1šu
+aš1ra
+uļ1pu
+oķ1vā
+ār1šo
+am1di
+ār1žu
+ed1pu
+ed1ve
+en1re
+ūk1li
+uš1pi
+ep1ta
+al1ve
+ad1ma
+ez1ce
+ēg1tā
+ud1rī
+im1bi
+ek1ra
+iv1jū
+ez1bi
+iz1me
+uļ1tī
+if1rē
+ap1ku
+id1ni
+og1rē
+ēj1de
+op1ko
+iz1tī
+un1ci
+īt1ka
+ēj1nī
+ēr1pē
+oš1ļa
+at1zu
+īv1ga
+os1na
+og1ga
+es1lu
+āt1ko
+az1va
+em1zi
+as1ke
+an1si
+iz1mi
+er1vā
+ep1sē
+al1sā
+us1cū
+ul1sa
+en1ta
+or1vē
+ek1tā
+uz1žo
+an1ma
+i1dzī
+ij1ku
+id1la
+ēp1ta
+ēļ1ko
+ur1ti
+ap1nī
+ot1re
+eš1ņu
+un1de
+ār1vē
+uz1ģī
+er1mū
+o1džu
+oš1ni
+ij1kā
+al1lo
+ig1lo
+er1rī
+em1pu
+ug1ļo
+ūš1do
+ip1ša
+ūs1tā
+oš1ba
+al1lē
+eš1da
+uļ1ļā
+ār1sū
+in1de
+em1to
+ās1tu
+ol1fi
+or1mā
+iv1pu
+aš1la
+ec1ho
+ār1za
+ar1ka
+ub1sī
+ap1zi
+ēp1to
+āk1tu
+er1te
+ur1zu
+īm1ka
+on1ju
+ap1go
+us1lo
+or1na
+og1no
+am1dā
+ār1ta
+ēl1ne
+er1cā
+im1na
+uz1zā
+ār1no
+aj1ci
+ip1tā
+it1ļu
+ag1ri
+ār1bū
+os1po
+ēņ1da
+an1kū
+om1bē
+ār1ve
+aļ1ģe
+im1ti
+al1ti
+īņ1ni
+in1na
+ep1la
+uz1di
+iž1me
+al1tē
+in1si
+ed1ma
+or1tu
+em1ta
+ug1si
+er1be
+us1ra
+il1mu
+ār1ga
+eb1lo
+īr1rū
+īt1re
+al1la
+et1vi
+el1di
+ār1ži
+iz1ca
+ad1da
+ēn1mī
+ut1sa
+ol1po
+ez1ra
+ir1šā
+eg1šo
+ud1pu
+ud1lē
+uk1sē
+on1vu
+em1pā
+ēk1bē
+ār1dē
+en1zū
+āj1re
+at1lo
+ez1ni
+et1ka
+iv1ji
+in1ku
+or1bī
+ok1ti
+al1si
+ur1zī
+ūn1ga
+ēr1pa
+am1bi
+at1ro
+ēr1bu
+iz1ķē
+ip1sē
+uz1či
+ir1du
+uh1tā
+er1bā
+ik1ga
+īš1ķi
+iz1rū
+it1da
+ok1ņu
+ēg1ta
+ir1lo
+an1ka
+in1dī
+es1vī
+op1ma
+um1sī
+on1pa
+em1pī
+ūk1ko
+el1tī
+uz1me
+er1vī
+ūz1na
+eg1ru
+it1ga
+us1du
+īt1ņu
+ep1lā
+ur1va
+um1zī
+īd1lī
+o1dži
+ār1bu
+ak1tā
+er1ta
+ēr1no
+ēr1pā
+um1bi
+en1ca
+oņ1cū
+ēj1mu
+at1pī
+ēr1gā
+ip1re
+ār1vi
+aļ1ķo
+et1ni
+ir1gū
+āp1ne
+ir1su
+āt1me
+eb1tu
+in1cē
+aš1ķe
+ip1ro
+om1da
+ep1tī
+ef1ra
+ū1dza
+ēt1ku
+ub1li
+az1be
+ūs1ka
+us1pa
+ar1su
+uf1li
+ūr1vī
+īs1za
+af1rē
+uz1ņa
+e1dža
+iz1bē
+ūt1di
+en1nī
+eļ1ķē
+es1ku
+az1da
+īg1ra
+iz1gā
+ar1ķī
+er1šu
+ud1ka
+ed1ri
+op1ra
+ap1li
+ap1dī
+ed1la
+an1rī
+en1tī
+āb1šo
+an1cū
+ēj1da
+es1tī
+er1ko
+ūg1ta
+el1zu
+in1ne
+er1bi
+ig1me
+ež1ni
+ad1mi
+aj1ni
+el1li
+ik1šu
+āl1pu
+ar1ga
+et1ta
+īc1še
+uz1zu
+om1bū
+un1ku
+īb1ni
+ar1ža
+ēt1ni
+is1tu
+un1ze
+aš1di
+it1ni
+en1zē
+en1ģe
+er1pe
+uz1zū
+ul1si
+ur1ca
+ap1fa
+is1no
+iz1ķī
+us1vi
+in1ho
+og1ļu
+ūs1nu
+er1ga
+ir1ze
+ēl1re
+ēs1li
+em1ma
+if1ra
+at1mē
+ur1rā
+at1ho
+ob1ju
+op1ro
+ip1li
+ec1mā
+er1mī
+ak1mu
+es1sa
+īk1lo
+u1džē
+ur1fi
+id1ko
+ār1ņu
+uņ1ģa
+īk1li
+iņ1ķe
+as1kē
+il1de
+ār1kū
+ul1bo
+ez1no
+en1mē
+ab1ro
+uz1gū
+ek1ņu
+ož1ņā
+at1ku
+uk1sa
+uk1lo
+ar1do
+ak1tu
+ār1du
+ik1ci
+al1du
+en1pe
+al1vī
+un1ti
+ul1le
+os1cē
+ec1sa
+īk1ti
+ār1dā
+ēb1ju
+ap1ču
+ub1rā
+iv1pa
+os1ma
+oš1ķe
+aš1pu
+um1pē
+ēp1tā
+ek1si
+īk1ļu
+uļ1ķī
+ūš1ka
+al1pe
+īg1nā
+uz1pā
+āt1rā
+īg1nu
+ik1lu
+āb1tā
+um1ji
+ab1so
+og1le
+ir1te
+īb1tā
+il1do
+em1zē
+ar1ģe
+ot1ve
+ap1gū
+id1vā
+ār1de
+āt1ne
+ēt1sa
+ad1do
+en1ja
+er1na
+ēk1li
+iļ1ņa
+uš1ki
+iz1nē
+oz1va
+ez1go
+us1bā
+ut1ri
+ur1lu
+ib1re
+ej1te
+ok1ho
+en1zu
+eb1rā
+em1tā
+ed1mā
+ah1ti
+em1ti
+um1sā
+az1tu
+ur1sī
+in1go
+ār1di
+ap1ņo
+īs1cī
+al1bi
+as1ni
+ek1se
+al1li
+uk1na
+al1nē
+iz1mē
+er1ce
+ūs1mu
+al1tā
+ul1fā
+ēk1lo
+az1ga
+er1zā
+ir1gu
+ig1rī
+en1dē
+eč1tu
+ep1ļa
+ēk1ta
+uz1dē
+ur1su
+īc1ku
+it1bi
+āk1kā
+āp1tā
+eļ1ce
+ed1rā
+ib1rā
+er1mi
+āb1rī
+iļ1ķi
+or1mē
+em1pi
+os1vā
+as1zo
+af1rā
+ež1pā
+ūs1nē
+ān1ve
+eļ1ķi
+oš1ga
+il1žu
+en1va
+īt1ra
+ak1ri
+up1tu
+ad1ka
+eļ1zī
+ir1nē
+ec1ve
+or1mu
+iz1mī
+īš1ļa
+ab1ve
+er1ri
+ū1dze
+ūz1ni
+in1ka
+īķ1sa
+ud1pe
+us1mē
+iz1rī
+on1rā
+aņ1kā
+at1ze
+āl1re
+em1ja
+im1sē
+īk1lu
+ek1va
+at1bī
+is1lā
+os1pī
+ār1jā
+as1mā
+ol1nī
+īg1ti
+em1po
+īg1tā
+ed1va
+ar1da
+or1po
+us1ni
+al1lā
+os1ti
+eg1da
+uz1bā
+ūt1rī
+ag1ni
+iņ1dē
+iz1zo
+is1me
+at1bi
+az1ti
+og1ra
+en1la
+at1do
+ap1zī
+am1ga
+us1ti
+oš1ķi
+is1tā
+at1la
+ēj1ti
+e1džā
+ec1ka
+or1ķo
+iz1pū
+uļ1zi
+er1de
+uk1ļu
+eh1ni
+ēg1to
+ēl1si
+ēc1nā
+ap1pā
+āl1no
+ar1hā
+at1gu
+ob1ļa
+ap1bo
+uļ1ķi
+uk1lē
+es1bi
+ar1žo
+iv1co
+el1mi
+ēr1ci
+ik1mē
+ap1da
+uz1ķī
+im1pu
+īk1la
+ag1ru
+iz1dī
+er1ņa
+at1ņu
+or1pi
+ēp1ni
+ūt1ņu
+eš1ta
+ar1ta
+un1ga
+oš1ļi
+eņ1ģi
+an1tē
+at1si
+or1te
+iz1rā
+ol1vi
+iv1cī
+aš1ko
+ām1ri
+āz1tu
+ek1sī
+ūk1tu
+ēk1ļu
+ir1sā
+el1ku
+ek1su
+aš1ļi
+iļ1ņu
+iz1si
+ir1gi
+at1ha
+ar1tu
+em1bu
+āt1sa
+ek1ļū
+en1tā
+iz1šu
+as1po
+ir1ta
+ab1re
+it1le
+ūk1pi
+uņ1ne
+aš1vi
+ām1pa
+ār1sē
+ok1si
+og1pa
+ut1rī
+in1ji
+ig1no
+iž1ļa
+ēb1ni
+uk1ma
+ēp1šu
+ol1vē
+ēz1ta
+am1kā
+ed1fo
+āp1ra
+ir1ce
+ul1li
+as1no
+ēt1ra
+on1ta
+ur1ņi
+ur1bi
+iz1cē
+us1ki
+eb1ša
+ož1me
+an1gī
+āv1ji
+ip1si
+ur1nē
+ak1ša
+eņ1ku
+ab1li
+il1vī
+is1kē
+om1pā
+ir1mī
+ip1lī
+ēn1mā
+ēr1šā
+āk1da
+el1nā
+ul1pe
+iš1ļo
+ēj1pu
+āl1lī
+ud1ko
+er1vi
+ak1tē
+īs1ka
+ag1tā
+ī1dzī
+at1vu
+ar1mē
+ar1sē
+eb1lē
+od1kā
+ūr1vi
+ot1ņu
+en1da
+az1du
+āt1nā
+oņ1me
+āl1ba
+eb1šo
+uz1mā
+an1zī
+ag1lī
+ot1bu
+il1po
+ēr1ķa
+ur1cā
+ej1bo
+az1ze
+iz1žo
+op1ļā
+īg1šu
+ēs1lu
+at1mā
+eg1lo
+īt1ri
+ir1tu
+ek1sā
+ik1ta
+eg1lu
+ur1vā
+un1bē
+uz1mū
+ež1zi
+eg1tā
+or1ma
+ob1ga
+av1ko
+el1ba
+ā1dzi
+at1ģi
+āg1ne
+ēr1za
+ed1rū
+iz1hu
+aš1ņa
+āb1si
+uz1ni
+et1pi
+āz1vā
+u1dzi
+en1tē
+āt1re
+ūv1no
+um1su
+iz1ci
+at1ra
+uz1ri
+or1ta
+āk1lu
+ik1po
+āš1ķi
+ār1pe
+ap1ķī
+uz1bū
+uz1pē
+uz1si
+ir1ža
+an1gā
+ap1šū
+i1dze
+at1ju
+at1fo
+is1ne
+ez1rē
+as1gā
+al1gu
+as1ti
+ūš1ko
+es1tā
+al1jē
+in1ša
+ab1le
+i1dža
+ēp1ja
+eb1ļa
+ub1le
+ab1tu
+ād1mi
+iņ1ķo
+ā1dža
+ek1li
+un1li
+ek1mē
+ok1lī
+ēr1pi
+ēr1pu
+iļ1la
+ep1ka
+em1li
+ez1na
+id1ma
+až1ne
+ir1re
+ēt1di
+am1zo
+ūr1fo
+ež1ga
+im1to
+ūp1nī
+at1du
+im1tā
+ūg1šo
+en1si
+al1ge
+al1dē
+eļ1ļa
+ap1vī
+ār1cu
+ež1ģa
+iš1re
+ār1ne
+ul1je
+ar1mī
+oš1ka
+īn1va
+ēr1ma
+ok1nu
+om1ra
+ap1jā
+us1ce
+un1mā
+ek1ši
+ob1lā
+ēr1sā
+et1ne
+uz1de
+il1bo
+it1pā
+ar1tē
+ed1ko
+ol1vī
+ot1rī
+us1se
+ēt1ti
+iž1ļu
+īz1de
+en1sā
+is1la
+ik1te
+ob1to
+ag1lā
+it1ko
+ep1ci
+āg1ti
+ūs1le
+ek1lu
+us1mā
+ār1ze
+īs1tu
+ar1kū
+ir1de
+ed1jū
+or1fī
+ēt1li
+ūs1mā
+el1no
+id1ru
+ij1ko
+er1ve
+ec1la
+aš1mo
+em1zo
+uz1bē
+er1fo
+eš1ķū
+ak1lī
+el1lu
+ib1li
+ek1nu
+ir1ņu
+aš1nā
+ēl1ga
+em1nī
+iz1vi
+us1te
+is1ha
+on1jo
+az1ka
+ās1ta
+aš1ta
+iz1vē
+er1nē
+uļ1va
+ab1lē
+an1žu
+oņ1ve
+il1bu
+em1pa
+ob1se
+em1jo
+īv1su
+er1co
+ur1to
+ēg1vā
+in1ci
+ak1ļū
+uz1šu
+eņ1la
+ūg1šu
+āg1tu
+ūg1ti
+īt1va
+er1ka
+ol1šū
+iz1ču
+us1ke
+ur1bē
+āp1ri
+ak1ļa
+ūs1kā
+os1va
+er1ze
+ēt1nī
+āj1ku
+en1žo
+uļ1ve
+is1ķe
+īg1si
+ur1me
+ur1bī
+on1hī
+an1di
+āj1mā
+ep1ļē
+aš1ņu
+or1vi
+ad1vo
+az1gu
+uz1lū
+it1pi
+ak1šo
+ap1si
+ās1to
+in1te
+am1sa
+ap1šo
+iz1vo
+uz1ve
+uļ1ņe
+uz1fo
+uv1sa
+uņ1ķa
+uz1ta
+ug1ļu
+ek1lī
+ok1se
+ok1vi
+až1ņa
+oņ1sa
+ab1hā
+iņ1ci
+ug1šā
+ek1rū
+ij1pa
+ok1ve
+ap1he
+ut1bo
+el1zā
+or1di
+an1go
+iņ1zi
+ek1mī
+ap1bē
+on1gi
+aļ1me
+ab1ru
+ig1ti
+ur1be
+u1dže
+ek1vi
+ur1ze
+ūm1va
+um1mu
+aļ1bu
+āt1ņu
+om1re
+ug1le
+ez1ta
+am1bu
+at1cē
+ēp1ju
+ez1sa
+at1ni
+an1me
+uz1no
+ār1lē
+ul1kā
+ar1pu
+iz1ru
+an1ži
+eņ1ķē
+od1ni
+is1na
+em1zā
+ār1se
+at1ri
+it1ru
+uš1čo
+il1ve
+al1ta
+oš1vī
+ēr1po
+il1pi
+ap1pē
+is1ķē
+ēr1sa
+ār1ku
+oļ1še
+uz1pi
+av1ro
+og1rū
+īg1ņa
+ī1dzā
+il1ze
+ez1ve
+ūr1te
+on1dā
+up1da
+iz1nā
+im1di
+ul1gi
+az1mē
+ā1dze
+as1lē
+ok1ļa
+ak1ce
+ūn1ve
+ek1lo
+ok1tā
+ap1jo
+ēr1gu
+il1nā
+iz1he
+uļ1ņē
+īt1ru
+īd1se
+ak1rē
+āt1ro
+at1da
+iz1žā
+ol1tē
+ūt1sa
+as1ku
+īn1bū
+īv1si
+or1no
+ot1ce
+ol1de
+ab1pa
+ēr1pe
+oņ1ko
+ok1na
+ev1ze
+us1ri
+ip1ti
+eķ1tu
+op1ta
+īs1ra
+er1zē
+of1rā
+ur1dē
+ot1ka
+is1zi
+ēk1mī
+iz1ne
+ag1rī
+on1si
+ir1pē
+er1ni
+ās1vi
+an1za
+ēl1gā
+ap1du
+ek1lā
+ār1ņa
+um1pa
+an1fa
+ār1pa
+uļ1so
+ar1pe
+eš1ļa
+ēr1vi
+ef1rā
+og1la
+it1pē
+in1je
+ut1ma
+ig1nu
+ēr1te
+az1gā
+āl1de
+ār1zi
+on1fe
+on1ma
+ib1ta
+at1žu
+it1lī
+it1ra
+ok1be
+is1žē
+ēz1ma
+ār1ti
+er1ru
+az1ja
+ēg1le
+an1ni
+az1lē
+uk1ni
+at1lī
+eņ1ma
+ik1vī
+ap1be
+ar1ne
+ip1ta
+ap1žu
+az1pu
+ak1ra
+ul1ve
+is1pē
+ež1sa
+iv1ma
+ār1šu
+ek1na
+os1la
+ik1tē
+ēs1la
+es1la
+at1ki
+iz1lu
+ur1le
+īd1ni
+it1se
+ej1ma
+iņ1si
+ār1lā
+us1va
+us1ci
+if1te
+el1ta
+uz1ga
+ak1tū
+or1ve
+iz1ce
+oš1kā
+ēt1ru
+ad1rē
+et1ņu
+ik1šo
+oz1ma
+ir1ti
+uz1da
+ūm1de
+el1tē
+ēz1ti
+it1rē
+aņ1ve
+ap1zā
+at1ga
+up1de
+ās1na
+ap1tu
+āp1ņu
+in1tē
+ās1ne
+ap1re
+ir1ka
+uz1tī
+uz1go
+at1ļā
+ad1rū
+ir1zi
+īv1mā
+er1sa
+in1ti
+āb1ju
+iv1si
+ep1jo
+e1dzē
+el1si
+ij1žu
+an1du
+iz1tā
+il1lā
+ul1bā
+is1cī
+ag1vi
+āj1rū
+os1lo
+īk1lā
+āb1to
+al1nu
+āt1ki
+eņ1ķī
+ol1kū
+un1pi
+ec1re
+uz1ču
+ul1dā
+en1ro
+ir1di
+en1ču
+ul1jo
+ul1ce
+az1vē
+ap1jē
+āl1zī
+ūš1ļo
+og1ve
+ag1si
+on1su
+og1ca
+ol1gu
+ār1zā
+ig1li
+iš1sa
+ot1ru
+al1vā
+am1tī
+ās1te
+ud1rā
+ēt1ko
+uz1jē
+āl1gu
+et1me
+ed1ra
+at1cū
+ol1zā
+uz1žā
+ul1gā
+ok1ļu
+īv1ze
+at1ve
+en1gu
+um1du
+o1dzī
+up1jo
+ap1di
+ur1rū
+īv1mū
+ūk1to
+iz1ņu
+uz1šā
+uļ1bū
+ez1pi
+in1vā
+al1ja
+in1ve
+iz1bu
+ap1šu
+us1ze
+ob1rā
+ēk1me
+il1le
+ēz1to
+īk1de
+ēj1lu
+ar1zo
+ec1me
+ar1za
+ol1bu
+ēj1pe
+ul1te
+īd1pa
+al1ki
+en1zo
+iv1ka
+āl1te
+ok1no
+a1dze
+it1va
+ār1jū
+un1go
+iz1ko
+u1džo
+up1ti
+on1li
+iz1čā
+il1gā
+er1gu
+iz1za
+in1gi
+ū1dzo
+ur1ni
+um1bē
+ed1mu
+ēk1tu
+ār1so
+id1lu
+ar1me
+ir1ši
+ik1ša
+ej1za
+ap1ha
+īv1lī
+as1ga
+eg1šu
+iz1bā
+ev1ju
+ap1ce
+ar1di
+em1ju
+am1bo
+iņ1ma
+et1si
+āk1tī
+is1da
+id1pu
+iz1le
+et1no
+ul1da
+ur1tā
+em1ga
+ēr1ša
+or1mi
+ak1kā
+iz1mā
+ab1vē
+ok1pi
+ir1bē
+īg1tu
+ir1sī
+eņ1ci
+iz1sā
+uz1he
+eļ1ķe
+eb1kā
+in1če
+ar1mo
+ēp1šo
+eb1rū
+on1cū
+er1pa
+īg1na
+us1ta
+ār1rū
+is1lī
+ēg1li
+eš1re
+uz1hu
+ak1re
+īn1da
+el1de
+um1ja
+ak1nē
+ob1tu
+ek1to
+ēr1bē
+ir1ci
+ih1ti
+ov1nu
+al1be
+aļ1da
+ot1rā
+ēr1ķē
+ud1ma
+āv1ju
+ik1li
+ar1du
+uk1su
+ak1sī
+us1le
+āt1bū
+ug1ša
+ag1mā
+ēr1tā
+uz1nā
+uz1čī
+ēs1tu
+iv1tū
+un1ko
+er1mē
+or1ci
+un1ka
+īt1ci
+ūk1ni
+ār1gā
+oz1ta
+is1pi
+ef1ko
+āš1ņa
+ig1ni
+ur1cī
+aņ1ķī
+ec1ti
+il1tu
+ul1su
+an1jo
+ek1vā
+al1po
+uk1tī
+āj1ni
+ām1ja
+ēr1li
+ah1tu
+at1vē
+il1nē
+an1ke
+as1ci
+er1je
+es1nī
+id1gu
+ān1va
+us1fi
+ār1si
+ēd1va
+ul1vā
+el1ni
+eš1ma
+un1la
+al1ma
+un1du
+an1ho
+ul1šu
+el1mu
+al1žī
+el1rū
+ul1ci
+ar1ģi
+at1vo
+ēr1bi
+il1vē
+us1me
+at1li
+uz1mu
+av1da
+ēg1tu
+uz1ļu
+eg1vī
+ēb1to
+ad1ju
+ir1mo
+or1fē
+el1nī
+iž1ļi
+em1de
+ap1pa
+ūg1ša
+ul1bu
+ēr1mu
+as1vi
+eb1ļā
+as1pi
+ir1sū
+uz1vē
+ās1nī
+ur1zā
+ir1bo
+īk1da
+it1nī
+ar1pa
+el1do
+ēr1le
+or1fi
+ēt1la
+aļ1ļi
+am1bā
+āš1ņā
+us1jo
+eļ1ni
+eļ1nī
+us1ja
+in1gu
+ig1nī
+ed1ru
+uj1bi
+os1te
+em1va
+ar1lo
+ig1lu
+ak1lā
+un1ba
+iz1bū
+am1ze
+is1ti
+it1ne
+uz1sā
+ep1lē
+iz1bī
+ār1nē
+eg1la
+iz1du
+ēg1dē
+ān1za
+es1lo
+im1de
+at1hi
+ar1ķi
+iņ1ve
+ēr1zē
+uz1lā
+ir1vi
+ār1ru
+oš1ļu
+at1te
+at1žā
+un1su
+on1tā
+od1la
+ār1ģe
+ēs1lo
+al1kā
+aš1pa
+ūz1ne
+ār1čā
+ur1je
+uļ1ķa
+ak1ņā
+īr1fa
+es1kū
+ār1ši
+ar1ba
+ār1ša
+ir1dī
+id1nī
+uk1da
+uz1žu
+ār1va
+ot1ra
+am1do
+iz1ģi
+ep1lī
+em1si
+āl1ta
+in1su
+ol1ni
+ub1ļu
+iz1ņe
+ap1ča
+el1za
+ob1jā
+uk1tē
+ap1mā
+al1ri
+ot1za
+ir1dā
+av1ni
+ūr1mu
+it1mi
+og1ļū
+er1za
+ek1lē
+ūg1te
+it1mē
+oš1ņa
+āk1le
+aļ1čū
+ān1lī
+e1dzā
+um1be
+et1rī
+ek1sa
+al1le
+uļ1ka
+iv1ni
+ēd1mē
+il1dī
+ul1ti
+ot1le
+at1gā
+iņ1sē
+at1ca
+aļ1rā
+ab1su
+īn1bu
+ip1rī
+uz1ra
+uļ1de
+em1ko
+at1čo
+op1vē
+a1džu
+uz1ķi
+ir1ma
+ur1bo
+iz1pe
+em1tu
+āč1sū
+um1šo
+ap1ķē
+āl1sa
+as1fa
+ož1ņa
+em1dī
+ūz1da
+el1pi
+ir1sa
+āz1mo
+ed1ro
+il1si
+īk1na
+uz1cu
+os1pu
+ag1šo
+iv1va
+īd1vi
+iņ1ro
+ār1ču
+id1ne
+eg1pu
+um1ko
+uš1ķo
+ār1ka
+īļ1bā
+ak1ve
+ez1gi
+or1la
+aš1pā
+īg1va
+ir1šī
+iļ1li
+ēr1sī
+um1ši
+īm1ju
+ub1je
+ep1li
+at1po
+āl1ma
+am1bī
+iņ1ķi
+āj1ra
+as1tū
+eš1tū
+en1te
+īv1ma
+et1nī
+āb1pu
+os1ku
+is1tē
+ok1ļi
+iz1rē
+iz1ži
+el1nu
+iz1pā
+ul1tā
+oļ1ko
+ēv1vā
+os1lā
+or1tī
+āb1tī
+af1ro
+ēl1zī
+āl1ru
+an1šu
+us1tā
+or1do
+er1ci
+īs1ri
+ēd1ra
+im1da
+ar1be
+il1ku
+iz1mū
+it1rā
+up1ša
+uz1sū
+us1ru
+ir1do
+ur1ga
+ek1re
+al1nā
+ok1ni
+ek1šu
+ob1rē
+ir1žo
+ār1dī
+eļ1ma
+aš1ci
+il1pa
+ū1dzu
+ek1ša
+ār1mo
+il1gi
+uš1ņa
+el1mū
+ās1ka
+ēk1ša
+or1ķi
+ār1nu
+az1ru
+ās1tī
+im1šo
+um1ze
+īv1so
+ūt1nī
+ap1fo
+ag1šu
+il1ma
+īc1ga
+ēr1tu
+es1mi
+ūs1mī
+īs1ti
+ej1vi
+uz1na
+on1na
+id1ro
+el1mē
+os1pe
+op1lu
+ēc1ka
+ar1pā
+up1ci
+ūs1ma
+ag1re
+ūž1ņa
+ol1ga
+an1ta
+un1di
+al1ko
+ul1lā
+ir1ko
+ī1dzo
+os1vi
+es1lē
+us1ma
+ec1mo
+iz1ve
+az1ra
+āl1cu
+id1rā
+an1ža
+oņ1zī
+um1tā
+af1ra
+um1vā
+ār1rā
+ab1vī
+ū1dzī
+i1dži
+ēg1šu
+in1ža
+ed1ņe
+ec1tū
+or1ne
+eg1ma
+āp1ja
+ār1šī
+ep1re
+is1ve
+ol1fe
+op1ci
+as1te
+ār1šū
+ež1ku
+iņ1tū
+es1te
+ek1ta
+ēl1cu
+ār1na
+us1jē
+il1te
+āv1ra
+āv1ce
+aļ1va
+um1ni
+ak1ni
+ār1rē
+et1ri
+u1dzī
+on1tu
+up1le
+am1bē
+in1to
+ād1nī
+in1ta
+ol1ma
+īk1bu
+an1žā
+āb1ma
+ur1ķī
+ak1vi
+at1nu
+is1bi
+ol1ve
+og1ne
+īv1bi
+ok1lu
+ār1čī
+ug1ti
+īn1ra
+ig1to
+uļ1ģi
+ār1ma
+um1jī
+ē1dze
+ap1rē
+is1nā
+ūp1ko
+un1si
+il1tā
+ap1ņu
+ol1be
+os1mi
+ig1la
+īl1ni
+or1bū
+ip1ru
+ak1cī
+eņ1ķa
+ez1gī
+oņ1sā
+āz1ni
+ān1pā
+us1pu
+ād1ne
+us1po
+īn1de
+āk1ba
+ā1džu
+ur1sē
+at1ba
+āp1ti
+ūv1vi
+ah1tā
+ut1nē
+em1be
+ap1na
+ul1pa
+ob1je
+āk1ļa
+ib1ti
+os1ve
+ud1vi
+en1pā
+āv1ni
+iz1vā
+eg1ro
+op1si
+ap1pu
+am1ni
+at1ta
+ak1li
+es1ne
+uv1ju
+ar1rī
+i1dzu
+es1rē
+ob1lo
+es1li
+og1ma
+uš1ko
+an1zā
+ig1tu
+an1be
+im1pē
+ic1sa
+eb1ka
+uz1zī
+oš1ma
+at1nī
+am1dē
+uļ1ba
+ār1mu
+up1jā
+ār1he
+es1mē
+er1ha
+ēl1di
+ih1re
+op1ja
+il1go
+uv1ve
+ul1pu
+il1du
+aš1mi
+āl1ve
+ār1lu
+ez1pu
+at1so
+īs1ca
+ek1ni
+ēg1nā
+ūt1ro
+ap1ķe
+ab1pu
+iz1nu
+iz1ņē
+ēk1ne
+ež1jo
+es1po
+ās1no
+ūv1ni
+aļ1sa
+aļ1ķī
+ē1dzo
+ip1no
+ap1vā
+īk1tā
+ār1čū
+uz1ze
+uz1nī
+on1du
+ap1hu
+ez1nā
+uk1ļi
+ul1bi
+ad1pē
+at1pē
+ēr1zu
+uz1čā
+ēs1to
+aš1gā
+āt1no
+en1vē
+is1be
+et1rū
+āk1ta
+uk1tū
+ij1ni
+ug1šu
+us1ķi
+ij1ve
+el1šu
+ul1vē
+ēt1rī
+ag1ļē
+es1pe
+ēr1šo
+ak1rā
+eļ1pa
+ec1rī
+ez1lo
+ēk1lu
+el1va
+ār1ķi
+eļ1po
+am1pa
+ūt1ni
+iš1zi
+id1mē
+uz1dū
+ēk1la
+iņ1ta
+ol1tā
+īk1ša
+īt1nē
+iļ1jū
+it1tū
+is1pa
+ap1sā
+iz1so
+ež1ģī
+ud1ri
+oņ1nā
+am1lū
+iz1pē
+ak1vā
+al1te
+ad1ri
+ak1ga
+ār1bā
+ap1rī
+or1bē
+af1ti
+uz1du
+at1ši
+ug1tu
+iv1zi
+an1se
+eg1to
+ūd1rā
+os1lē
+ār1ri
+el1ga
+ēr1de
+ir1tē
+em1ļa
+us1na
+im1do
+āt1ve
+ur1ma
+ur1ģi
+īg1ni
+īd1ko
+ūd1ra
+iz1vī
+ed1rī
+at1jā
+il1mo
+e1dza
+ēk1to
+ār1ģē
+iļ1ņi
+iz1bo
+as1ro
+um1zo
+or1pu
+ar1kā
+ik1ko
+ap1ca
+īs1ba
+as1vā
+at1mo
+uz1pu
+ēn1ga
+am1ba
+uk1ši
+ag1to
+iz1zi
+uz1tu
+ul1ni
+er1lī
+eš1ķē
+en1zi
+at1zo
+ir1ša
+ez1si
+us1so
+am1fī
+ig1tā
+e1dzu
+ap1kā
+ār1ro
+es1vi
+ag1la
+ir1mē
+ad1ve
+it1di
+um1no
+ap1lā
+in1ga
+op1šo
+a1džā
+er1po
+uz1bī
+un1ra
+uk1ta
+ar1ve
+īn1sa
+ap1vi
+ēr1ce
+og1lū
+aš1li
+aš1po
+e1džu
+ap1mu
+ag1lu
+or1be
+am1ne
+ol1di
+iņ1ģe
+it1na
+eļ1ņu
+uz1lu
+ās1me
+ār1sī
+ur1ku
+ur1pe
+ep1na
+ut1na
+ac1da
+uz1le
+ik1ka
+ar1fi
+ab1si
+er1zī
+ār1ļu
+ap1ja
+ul1tu
+is1di
+an1ge
+ar1lī
+ug1tā
+on1so
+ud1kā
+eļ1ko
+iš1ķī
+um1po
+ik1ļa
+ūg1tu
+ār1gi
+ēr1ni
+et1va
+ap1lo
+ēr1ķī
+iz1tu
+īv1la
+is1ju
+od1ba
+az1ro
+ūs1di
+up1tū
+ūs1nī
+eļ1lo
+ap1bī
+um1ta
+īs1tī
+eb1rī
+uš1ķē
+ep1tū
+eb1lī
+or1že
+up1ra
+ēt1ma
+ak1ro
+ir1la
+at1či
+og1lu
+ūs1ku
+ut1rā
+il1no
+ec1de
+an1bā
+az1vi
+ān1ga
+ēj1ce
+eļ1ve
+er1zi
+el1sa
+īk1ta
+īt1rā
+ār1fe
+um1ka
+ir1si
+ag1ļi
+ip1ka
+ak1šā
+ar1ki
+ek1ļā
+ar1bā
+ed1da
+os1le
+iv1ja
+iv1kā
+ūk1šo
+uļ1vē
+ēk1tā
+oš1ņu
+og1de
+ok1ļo
+ul1dē
+ik1sa
+am1pē
+ūs1no
+um1to
+us1ču
+od1ka
+as1lo
+op1mī
+up1to
+oļ1ti
+ū1dzi
+īr1ma
+os1kā
+al1dī
+ok1va
+el1tu
+ap1pi
+is1ca
+os1ce
+āl1vi
+ir1mi
+uš1ķi
+oz1tā
+is1te
+ig1ša
+at1rā
+ar1žu
+os1kū
+im1ša
+ār1to
+um1bo
+an1sa
+aļ1ļa
+ēk1di
+āj1ka
+ak1tī
+ar1tī
+os1tā
+eg1re
+im1sa
+ul1sī
+ag1me
+il1lē
+on1ce
+iz1jā
+iž1ci
+or1ku
+az1no
+im1pā
+of1se
+op1ļē
+āl1ka
+ēs1ti
+oņ1de
+er1la
+ār1ņē
+uz1ku
+ab1pi
+ar1na
+em1ša
+er1ku
+im1pe
+in1tī
+es1mī
+īv1do
+uz1mo
+uš1mi
+ak1lē
+aļ1la
+up1lā
+ok1ta
+ūv1me
+em1žē
+āl1rū
+is1pā
+ar1le
+eš1va
+eņ1rā
+ad1ne
+on1ku
+īs1si
+ab1da
+il1lu
+ar1va
+an1ko
+ez1bē
+ež1li
+il1ga
+at1tā
+iz1kū
+ar1nu
+ir1mā
+ad1je
+ik1ra
+an1bu
+op1ri
+ik1vā
+ek1šē
+ap1ru
+uz1ņi
+iz1be
+at1vi
+it1ro
+ur1tē
+en1po
+ap1jū
+iz1ģī
+ol1rā
+ar1go
+ah1lo
+im1pa
+ī1dzi
+us1lu
+ir1žu
+at1cu
+am1vi
+ag1ti
+im1ju
+ep1ļā
+ec1ga
+on1di
+ān1kā
+is1fu
+at1ņē
+āņ1ti
+at1čū
+az1pa
+ik1pa
+ov1bo
+ad1si
+er1lū
+ir1bā
+um1tu
+uj1ko
+ež1vī
+ab1lo
+ūk1la
+os1pa
+ul1to
+ap1žē
+āv1ma
+ez1zo
+eg1mā
+ap1to
+iz1ku
+os1lu
+or1vā
+ok1rī
+os1to
+al1di
+is1lu
+ē1dzi
+āt1li
+aļ1li
+an1ču
+eb1la
+eņ1ķo
+ak1rū
+en1ri
+ez1be
+ēr1nē
+eļ1ņā
+ab1rū
+un1sa
+iz1zī
+až1da
+ūv1so
+aš1ķī
+it1kā
+ap1bu
+ē1dzē
+a1džo
+īb1šu
+us1lā
+ad1re
+ej1le
+ek1ro
+at1su
+ap1ļu
+ež1ci
+er1ra
+ez1vē
+aļ1ko
+og1re
+ur1ja
+er1zu
+ār1me
+av1tī
+on1tē
+at1fi
+ir1bi
+ob1li
+uz1jū
+aš1ļa
+āb1ra
+ur1bā
+ap1nu
+al1ģi
+an1vī
+on1dē
+ep1tē
+ez1de
+um1de
+up1ju
+īg1te
+od1de
+ok1sā
+at1jē
+ār1zu
+um1di
+eš1di
+eļ1mo
+iz1de
+in1gā
+ač1gā
+ip1se
+iš1ķē
+ūn1ze
+āk1to
+eš1vī
+ēņ1ve
+ap1la
+oņ1ni
+im1ni
+ut1ro
+et1de
+ep1pa
+aš1re
+up1ja
+us1pi
+uj1la
+āt1ti
+op1le
+an1nu
+ēj1mā
+as1lā
+am1mi
+az1dē
+am1po
+īk1pi
+ūk1tā
+ār1go
+ap1ma
+uf1ra
+īg1ta
+ad1ca
+ār1ķē
+ek1vo
+am1te
+iz1zā
+ar1ke
+ēr1mā
+en1dā
+eg1lī
+at1ci
+ur1ci
+āg1la
+af1ri
+īk1ze
+er1cu
+ad1va
+el1ci
+ep1no
+ag1ne
+ār1zī
+eg1rā
+eš1ķī
+an1ti
+iļ1dā
+ud1mu
+āl1li
+ub1ve
+uz1pe
+uš1ķu
+eļ1tē
+or1čē
+og1pu
+eg1nē
+op1la
+al1dū
+ef1rē
+īt1ni
+ek1nā
+āz1be
+er1ti
+er1no
+os1fo
+ēr1ga
+at1ka
+er1go
+or1ķe
+er1mo
+un1da
+an1žo
+ez1mi
+ef1pa
+ek1rī
+ūp1li
+eļ1te
+ār1tā
+ot1ri
+ud1li
+us1zā
+as1tē
+iv1da
+is1ko
+il1za
+īg1to
+uz1bu
+er1tē
+ap1su
+es1zi
+u1džu
+uk1li
+iz1lū
+it1ti
+īk1kā
+es1pī
+uz1vu
+ūž1di
+ūs1li
+āl1po
+ok1re
+āk1ļi
+īž1me
+eš1ķa
+at1ķe
+āt1rī
+iņ1ši
+ap1ga
+um1jā
+īm1ja
+ez1ro
+iz1jē
+es1sū
+eš1vā
+og1ri
+ār1lo
+al1so
+iz1lī
+is1kā
+ep1ti
+eg1bi
+ār1la
+ar1vo
+ēp1si
+ār1gū
+eļ1ga
+uz1kū
+iļ1le
+o1dze
+an1sē
+at1no
+ok1ma
+al1sa
+ek1ri
+ep1le
+en1rī
+eš1de
+ez1jū
+ik1sē
+al1gi
+ep1ro
+īv1ci
+id1po
+oņ1pi
+od1ra
+ej1pu
+ir1go
+el1ma
+in1se
+et1sa
+īb1ša
+aļ1ķa
+ol1la
+at1rī
+at1dē
+īļ1si
+ār1ņo
+ur1mi
+ep1lo
+āg1šo
+ec1to
+ob1ve
+up1tā
+āt1ra
+os1ko
+al1zi
+el1du
+iz1vu
+ār1pi
+at1šā
+ul1tū
+il1dē
+ap1mī
+ar1lē
+er1tā
+us1mu
+is1hu
+oņ1si
+āz1ve
+īp1ne
+āz1to
+iš1ma
+ol1vā
+em1zī
+āl1be
+al1šo
+us1ko
+es1ga
+in1fa
+āj1vi
+at1di
+at1ži
+ap1bā
+ah1ta
+ēr1nā
+el1me
+īs1le
+iz1ja
+ēb1ti
+es1ka
+ul1be
+ep1ri
+ež1zī
+ot1vē
+as1la
+at1ru
+er1mā
+ed1re
+ēj1ma
+av1ci
+ak1do
+us1nē
+eš1ga
+ap1cī
+āt1zī
+as1pa
+āk1ša
+es1ta
+ib1lo
+er1ģi
+ēr1mī
+eļ1di
+at1lā
+ak1te
+aš1vī
+og1li
+al1ga
+aš1kī
+ār1fi
+es1to
+ūt1pa
+on1ko
+ār1ci
+ām1ju
+el1ce
+īs1tā
+ec1ni
+al1ku
+at1hu
+er1fe
+ār1mē
+ēr1mū
+ul1di
+on1ga
+ār1pē
+ar1pē
+ās1nā
+am1fi
+āt1pe
+an1co
+oš1ņo
+eļ1ņi
+aš1no
+īr1na
+āk1šo
+et1ko
+ig1ma
+an1te
+an1ba
+e1dzī
+ek1šo
+um1bu
+ir1gā
+om1le
+ūm1ve
+al1na
+iz1va
+og1lā
+ūk1ta
+il1so
+uz1ma
+il1ša
+oš1ķū
+at1zī
+ās1mo
+ēr1na
+ūž1ņo
+um1nī
+eg1vi
+al1tū
+on1se
+iz1ža
+ek1te
+ep1lū
+ep1se
+os1tī
+as1ta
+ār1be
+iz1ša
+oš1ķo
+āg1ri
+īv1ku
+āt1na
+aš1ķi
+ēr1dē
+ir1tā
+ak1sa
+as1to
+az1jū
+un1me
+ap1pū
+ep1to
+ur1ve
+en1ma
+ēc1na
+eņ1ķu
+ār1le
+um1zi
+uz1cē
+ez1pa
+os1ka
+ab1rī
+er1ģē
+et1ra
+īt1na
+ap1čī
+ok1ri
+eš1pe
+iž1ma
+is1ša
+āz1ģe
+on1dī
+ep1tā
+am1zi
+īg1lo
+iv1re
+at1lu
+āl1ci
+ez1vā
+iz1ti
+al1mā
+ug1li
+il1bi
+iļ1ķu
+aš1ņā
+iv1ba
+ik1ši
+īk1me
+ap1kū
+un1gi
+uk1nā
+al1vo
+up1lo
+oz1vē
+ēj1ka
+ap1rā
+ad1li
+uz1ju
+el1pa
+en1li
+at1ču
+īk1bū
+at1dā
+up1ta
+iļ1ņo
+ar1pī
+ak1vē
+ēc1ga
+eb1ne
+af1li
+ol1ka
+ez1fo
+in1ki
+an1gi
+ak1lo
+up1si
+ej1va
+ag1tu
+ek1ļo
+iž1vī
+as1zi
+ir1lī
+en1du
+uz1tā
+if1lo
+eļ1ļo
+ob1lī
+um1sū
+on1ci
+an1de
+es1lī
+ēb1si
+ib1tā
+il1da
+uķ1ko
+uk1ša
+āj1pe
+ej1bu
+ūv1ka
+ar1fa
+oz1ve
+īk1rā
+up1mā
+ūs1to
+ir1nī
+ag1lo
+oņ1ra
+iz1sū
+īg1ce
+an1dū
+iņ1vī
+e1džo
+ār1da
+īn1mā
+ār1ju
+er1vo
+ar1se
+i1dzē
+iļ1pi
+it1pu
+ur1sa
+id1da
+iš1ko
+eš1ķo
+ār1po
+ev1kā
+īk1rū
+os1ri
+ik1no
+ār1tu
+ur1ko
+oz1tu
+om1pi
+ar1šē
+on1nu
+uņ1ģi
+ur1šu
+ab1rē
+īr1kū
+en1cē
+em1je
+ap1va
+av1ļa
+aļ1bi
+uz1hi
+in1ča
+on1fu
+ār1sā
+oš1mī
+uz1rī
+il1ka
+un1tē
+as1mi
+iz1ga
+ār1mā
+āk1tā
+ik1lo
+im1pi
+or1pa
+aš1ro
+um1mē
+īn1te
+ež1rū
+ab1sa
+uz1mē
+a1dza
+as1sa
+un1gā
+ag1mī
+eš1mī
+eg1ša
+ak1ru
+ēt1ri
+or1se
+us1no
+it1mā
+uz1po
+in1čo
+iz1su
+is1to
+uk1vi
+ir1to
+um1ju
+uļ1sū
+in1dā
+um1tē
+ar1šo
+īk1ko
+er1me
+uk1si
+īv1pi
+ēr1mē
+as1tī
+in1kā
+en1za
+al1bu
+or1ģi
+a1dzī
+en1sa
+īs1ta
+eļ1de
+ū1dzē
+uk1tā
+ec1vi
+ūk1le
+ap1čo
+ēd1ni
+ān1ce
+if1tu
+īk1di
+āl1va
+ap1gu
+en1de
+ar1de
+ap1mū
+on1te
+es1da
+ud1ci
+at1se
+ūp1ni
+in1ha
+ap1de
+al1ci
+ir1pu
+um1va
+ok1tu
+ug1lī
+aņ1da
+ep1ša
+el1su
+īk1si
+eņ1ģe
+aļ1fi
+er1si
+op1ju
+od1le
+īt1pa
+ak1nā
+ap1nē
+ar1dī
+ek1zē
+at1zi
+āt1ka
+āl1mē
+em1za
+um1pu
+ap1žo
+ēj1sū
+en1le
+iz1lē
+er1zo
+um1dā
+ur1žu
+eh1no
+ab1ka
+īs1vē
+īb1šo
+as1se
+ul1lē
+ir1ki
+at1ča
+uļ1ķe
+āz1ma
+ip1nu
+ar1nī
+īg1lī
+ad1ra
+ez1ti
+īk1ra
+ūr1zi
+ap1vu
+ib1la
+īt1kā
+iļ1da
+ēl1ko
+ob1la
+o1dza
+ep1nī
+es1ri
+up1ji
+eļ1ku
+ik1ve
+es1vē
+er1lo
+um1do
+ik1lā
+em1žo
+is1so
+om1ju
+ij1ka
+en1ni
+āz1ne
+īv1di
+if1to
+un1je
+er1da
+en1kā
+ūt1ra
+en1ge
+āp1ji
+oņ1kā
+al1vi
+ēr1zā
+en1ga
+īr1ku
+ar1te
+up1rī
+or1ti
+ar1ķē
+el1lī
+iš1la
+an1no
+ec1pi
+ēk1šo
+an1da
+āp1šu
+iļ1ru
+ež1lī
+ed1rē
+ed1ka
+at1kū
+īb1si
+ež1ņa
+am1va
+un1dī
+ār1nā
+al1me
+uļ1ze
+es1tē
+āj1ba
+āp1šo
+ap1po
+en1zī
+er1sī
+ig1ro
+at1bu
+um1sē
+el1cē
+ās1ni
+ar1pū
+od1ve
+oz1ga
+in1do
+uz1mi
+un1mē
+uz1ka
+ig1ne
+et1pa
+ol1si
+ab1ra
+on1to
+os1kī
+aš1ķa
+iz1se
+īn1pi
+eb1ru
+es1nu
+ūt1ru
+ik1ri
+as1lu
+iz1la
+uz1ci
+at1tē
+on1da
+āp1ša
+ēp1ne
+or1ce
+ep1rā
+ūr1mā
+ež1vā
+up1jē
+eh1lo
+īg1ņā
+us1li
+ec1tē
+āt1mā
+ak1nu
+u1dzē
+ez1ne
+ar1dē
+ēk1da
+et1nē
+ež1ro
+ir1kū
+ap1lū
+īs1tē
+us1ba
+ēj1zo
+ī1dzu
+at1le
+ēg1na
+ep1tu
+i1dza
+af1ta
+ep1de
+īļ1ve
+od1ro
+um1šā
+en1se
+eņ1ra
+as1tu
+at1pu
+eļ1da
+āb1ba
+iš1ķa
+āg1ša
+il1bā
+ūš1tu
+ud1sa
+at1ģe
+um1šu
+aš1mā
+en1so
+eg1ba
+am1re
+ud1ro
+ov1na
+ik1re
+ār1rī
+ār1ni
+ež1ra
+i1dzo
+īs1to
+an1še
+ar1ju
+iz1ģē
+az1dū
+ēr1me
+oņ1ga
+ēr1tē
+id1mo
+īs1fi
+at1mī
+al1se
+il1ha
+ep1ja
+il1ce
+of1ra
+um1pi
+uz1rē
+aš1ņo
+el1ža
+ap1ņē
+ar1bu
+iņ1re
+ij1pu
+er1žo
+ol1ta
+ez1va
+aļ1ķi
+il1nī
+ag1no
+ul1lī
+ib1ri
+āt1ri
+um1pī
+ūg1tā
+is1fē
+ak1su
+al1to
+el1žu
+ap1ģē
+iv1ga
+al1za
+aļ1dē
+ēr1si
+ār1ņi
+et1rā
+aļ1ņi
+um1zu
+ūg1si
+az1mā
+in1ko
+īg1ri
+il1šu
+er1va
+uz1tū
+ec1cī
+īs1li
+a1dži
+u1dzā
+am1žu
+uz1fi
+iz1nī
+ir1dē
+ev1ga
+iz1ča
+iz1pu
+up1šu
+iz1gu
+in1ce
+uz1dī
+āb1šu
+or1ba
+i1dzā
+a1dzo
+es1tu
+āz1ti
+el1mā
+ap1vo
+ub1lē
+aš1ķē
+īs1vi
+en1jo
+as1ki
+ik1tī
+ok1le
+ur1ķu
+in1gī
+ek1ļu
+uz1to
+uk1le
+ir1bu
+āg1to
+uz1ne
+as1ko
+ek1rē
+ur1do
+ob1ta
+ār1jo
+uk1no
+ot1lī
+ur1te
+uz1re
+at1ma
+at1žo
+ēd1ne
+at1na
+us1ka
+al1vu
+ib1šu
+iz1dū
+ug1ko
+uz1vo
+at1zā
+eg1zī
+ūš1ga
+il1ni
+uz1ro
+el1pu
+ūg1to
+os1mā
+ul1ma
+as1ma
+al1ni
+ut1ra
+ug1šē
+at1sē
+in1fo
+eļ1bū
+uz1jā
+ēt1va
+ēk1ba
+ik1di
+īg1le
+op1ne
+ur1vī
+ār1dū
+ir1cē
+ēr1sē
+as1ja
+es1mo
+il1ci
+az1li
+em1šu
+ap1lu
+er1nā
+ot1rū
+uz1čo
+as1dē
+os1mo
+aļ1ga
+un1te
+at1ne
+om1ba
+ok1ra
+en1vā
+ap1sē
+an1dē
+ol1dē
+ap1ļa
+ek1sē
+ad1so
+iz1po
+uz1lī
+īk1ne
+ud1ra
+uz1ko
+ur1ta
+ep1šo
+ud1mi
+ār1ki
+eļ1vi
+ūk1ti
+īg1ro
+iņ1ti
+ur1du
+eg1tu
+ār1bo
+es1mu
+ar1ce
+os1ki
+iz1tē
+ev1mā
+ān1ko
+er1ge
+ē1dzī
+en1ba
+īv1ba
+ot1mu
+ēb1ta
+īn1rū
+ūk1ņa
+op1jo
+is1lo
+ob1ru
+ur1li
+ēs1le
+ur1lā
+ēj1rā
+ul1ko
+āg1tā
+iv1ku
+ām1ga
+o1dzē
+ī1dzē
+ir1za
+ip1rā
+at1tū
+iv1vi
+op1lū
+āp1si
+em1me
+ap1žā
+ār1mū
+ik1šā
+il1ba
+an1ze
+on1do
+il1he
+ek1ļa
+el1nē
+āk1re
+uk1se
+ēr1so
+ef1re
+ūt1rā
+ip1tu
+am1pā
+ak1ņu
+at1me
+ūr1ma
+ik1tā
+am1pu
+az1de
+en1ki
+iv1mo
+ar1ge
+īb1ti
+uj1ma
+os1ta
+as1na
+ēs1ma
+om1bo
+eb1rē
+er1ža
+āt1nu
+ež1ko
+uz1tē
+up1ni
+ig1nā
+an1na
+az1ku
+on1tī
+ar1sī
+ek1tū
+eņ1me
+os1vē
+ak1šī
+at1rē
+er1bu
+eļ1ņa
+og1ro
+īt1lī
+ij1ro
+ūk1si
+ār1žā
+ap1dā
+uz1pa
+ek1ļi
+iz1tū
+aš1ķo
+im1ta
+ik1nā
+at1jū
+ēg1no
+ā1dzē
+em1te
+er1ģe
+āš1ņi
+eļ1ta
+ap1lī
+ul1la
+uz1bi
+īt1di
+ud1bā
+en1tu
+un1ne
+uk1so
+īv1ti
+ol1je
+ed1li
+iz1ni
+ēr1šu
+eb1si
+ēv1ze
+uz1za
+er1ne
+om1pa
+ec1kā
+in1sa
+uz1ža
+ūs1ta
+ap1ļā
+ūv1ga
+iv1ri
+aļ1ba
+ob1ša
+ir1zī
+aš1mē
+āt1ru
+az1sa
+iš1ķi
+ok1nā
+or1mo
+iļ1ļa
+iņ1ru
+uz1gā
+uz1vā
+it1ri
+om1de
+is1cē
+is1mi
+op1ga
+at1čī
+ar1nē
+uz1ho
+at1bā
+ir1ži
+el1fi
+ir1ne
+ar1dā
+uz1fa
+ap1ki
+ur1dā
+āl1ze
+ār1li
+or1bu
+ap1ti
+um1ga
+ek1ņa
+al1pi
+us1fa
+ār1vo
+uz1ģi
+e1dži
+ig1nē
+uz1te
+ot1va
+ag1ļu
+os1pā
+īk1ņā
+īk1šu
+e1dze
+iš1jā
+ek1ve
+at1ļa
+āl1si
+or1zā
+ul1lo
+ab1va
+aņ1ķi
+ār1ķe
+ur1vo
+ap1ze
+em1ni
+oš1ņā
+ūž1za
+ēr1cē
+ap1hi
+ek1nī
+uz1ņe
+in1tā
+un1cē
+ib1lā
+īr1ga
+is1ku
+uz1zo
+ug1ši
+am1zā
+as1me
+un1dā
+ak1sā
+it1ļa
+ur1nī
+uz1ņē
+ēz1tu
+ab1tā
+ār1šā
+us1sa
+īg1šo
+eņ1ca
+op1lo
+āp1to
+el1mī
+eč1zi
+eg1ku
+al1pē
+ik1rī
+al1vē
+it1ļo
+em1mē
+iz1ba
+is1dā
+īd1mē
+en1ve
+ap1ju
+ol1ko
+ag1le
+ap1tē
+āt1nī
+āv1va
+et1so
+an1hi
+eš1kā
+ir1šu
+es1lā
+os1me
+is1tī
+ur1ne
+et1nu
+ap1mi
+ūz1ma
+or1mī
+as1za
+an1cē
+es1ni
+al1fa
+ēr1bo
+ur1ģe
+āg1si
+is1de
+īs1sa
+at1mi
+ēš1ļa
+ūg1da
+ūs1nā
+ār1ra
+un1kā
+ok1li
+ē1dzū
+ēg1nu
+al1bo
+op1da
+et1ķī
+ur1pi
+ār1pu
+ok1sī
+it1ļi
+ap1sa
+ip1ci
+ar1ša
+av1ma
+ec1vā
+iv1do
+ūs1ti
+at1dī
+ār1žē
+am1na
+ak1ļā
+iņ1me
+uz1ha
+ar1mi
+eļ1ļi
+ēp1tu
+of1to
+ag1rā
+il1zī
+ēg1šo
+il1sē
+is1ba
+ap1ko
+ug1šo
+ot1mā
+iž1ni
+ār1tē
+at1šu
+ep1šu
+uz1ģē
+ag1lū
+up1lu
+ām1gā
+ar1šī
+it1ve
+ak1ma
+už1pu
+uk1te
+uz1lo
+ik1ce
+eļ1rī
+et1na
+āl1ra
+oz1ti
+iz1ze
+ap1zo
+ir1nā
+ad1le
+ēt1ho
+ad1mo
+un1ta
+a1dzi
+az1ko
+āl1pa
+uz1nē
+ug1ma
+en1di
+iz1šū
+ag1rū
+īr1ra
+as1pē
+ok1ce
+en1cī
+il1mā
+op1su
+al1šu
+of1li
+ev1ma
+ab1ļā
+a1dzē
+ud1ru
+ir1zā
+od1bi
+ol1dā
+ap1ci
+il1dā
+ok1pe
+an1ki
+as1vī
+od1ru
+ur1pā
+āj1ga
+ēr1da
+ep1ju
+iz1re
+iņ1ka
+ār1mī
+at1lē
+ir1sē
+iš1ļa
+ēg1ša
+āš1ņu
+ar1gā
+av1la
+aļ1ni
+iz1fo
+il1la
+er1mu
+up1šo
+is1ma
+āl1sā
+ap1ļē
+ur1dī
+as1tā
+ul1tē
+es1cē
+ud1lī
+on1ve
+uz1ģe
+ek1me
+āš1ņo
+ek1la
+āl1ga
+iz1di
+on1vo
+er1tī
+on1ja
+uļ1žo
+ār1fo
+ak1rī
+ev1bi
+ij1ci
+eš1ra
+um1jo
+az1me
+im1šu
+aš1da
+or1tē
+uz1rā
+ār1vu
+al1ba
+in1ge
+ab1na
+an1ci
+īs1lā
+il1šā
+am1za
+al1jo
+ek1le
+im1dā
+iņ1de
+oļ1va
+iž1ra
+am1mē
+ok1rā
+er1le
+ok1vē
+ok1rū
+uz1ķē
+eb1ti
+āv1la
+a1dža
+iz1ļu
+on1ka
+uz1do
+ār1ķī
+ē1dzā
+an1nā
+āģ1zo
+uz1ča
+īt1bi
+am1da
+at1kā
+ēj1ko
+ul1du
+op1lā
+uk1šā
+ik1nu
+oh1ro
+at1ti
+eļ1dā
+it1li
+uļ1ļa
+ūs1mi
+at1he
+at1to
+ec1pa
+aņ1pa
+om1bu
+ig1tī
+ap1me
+er1so
+an1tu
+on1fi
+aš1ni
+īv1ja
+oņ1ma
+il1rū
+ap1pe
+em1di
+ār1pī
+er1žu
+it1rī
+al1tu
+iz1kā
+an1gu
+im1tu
+an1va
+īn1dā
+el1ti
+ap1sī
+ēr1be
+ez1ga
+ēt1ki
+us1tē
+īn1ko
+el1ze
+ab1lī
+ar1tā
+aš1ķū
+en1vi
+il1fa
+ik1ti
+eg1ri
+et1vā
+us1mi
+um1te
+eb1jo
+eļ1ģi
+ar1ha
+al1mi
+ig1lā
+ek1vē
+is1le
+eg1rē
+el1tā
+ap1ģe
+iz1ri
+er1to
+ug1to
+el1lo
+ār1lū
+el1sī
+el1fī
+oņ1da
+in1du
+eg1si
+ub1ļo
+un1zē
+ar1bī
+iz1ju
+ap1nā
+at1ce
+ej1da
+am1vī
+eņ1ķi
+oš1ļā
+ij1me
+ob1ra
+e1dže
+ap1pī
+am1pi
+īķ1ma
+op1te
+uz1cī
+oņ1te
+at1vā
+ap1ņi
+uk1lā
+ir1so
+ak1me
+ip1lo
+ik1ca
+ap1fi
+oj1ne
+iz1pa
+ok1to
+ok1ci
+en1mu
+ip1nī
+ol1za
+ār1ģi
+āk1ļu
+ēr1to
+āl1šā
+ef1le
+as1li
+ar1so
+as1mī
+at1re
+īs1co
+ar1nā
+ug1ta
+is1ta
+eg1ļu
+ām1ni
+ēg1ti
+eļ1ri
+o1dzi
+op1lē
+ip1nā
+oš1ķē
+ap1bū
+im1nā
+ir1gē
+īg1vā
+ēr1nu
+āk1si
+el1mo
+iz1ņi
+ap1mē
+al1pa
+ol1ti
+un1vē
+os1mī
+āk1li
+as1pā
+ēr1ķu
+ul1tī
+ij1ti
+im1fa
+ūs1ni
+um1ba
+um1me
+al1dā
+us1to
+iž1ce
+it1cī
+or1ņa
+ad1rī
+ur1ba
+us1vā
+u1dze
+oš1da
+ok1mī
+ež1ģi
+ef1li
+ir1kā
+uk1ti
+uz1dā
+ēr1ģe
+īg1tē
+ūs1te
+is1vi
+il1ti
+eš1ļā
+ik1me
+or1de
+od1va
+ur1zi
+iz1či
+uk1nī
+az1ma
+uz1ja
+āb1jo
+at1fa
+ev1ri
+iz1jo
+īs1pa
+u1dža
+od1ko
+eb1ro
+is1li
+at1mu
+at1sa
+ub1ri
+ab1me
+ēļ1ni
+ār1hu
+ik1tu
+ok1sa
+em1dē
+ab1lā
+um1sa
+og1lē
+āg1ta
+ez1li
+ob1ļā
+ad1pa
+ig1na
+or1sā
+ir1da
+an1sī
+am1mu
+ul1do
+ār1či
+uz1vi
+ol1ho
+em1zu
+ut1ni
+el1šo
+uļ1vi
+īk1šo
+is1lē
+uz1sa
+ir1gī
+ež1va
+īb1ne
+īd1la
+it1vi
+ēk1ve
+is1sa
+em1pe
+ēj1sa
+id1ra
+ol1da
+il1ca
+uv1re
+ār1tī
+ar1bū
+ap1mo
+il1ža
+a1dzu
+ap1se
+ub1lā
+as1pī
+er1tu
+īc1ni
+ip1ra
+og1lo
+ib1lu
+el1na
+uļ1ni
+ak1si
+an1ši
+ēr1zi
+er1ke
+am1ka
+on1za
+ār1bē
+ud1ni
+ak1ha
+us1mo
+ār1ņe
+at1dū
+iz1žu
+ām1ma
+aj1mu
+uz1čū
+aņ1ģi
+iz1ho
+ēj1ni
+ir1ni
+ek1tu
+ās1ku
+el1žo
+iz1ģe
+ēr1ķi
+ēr1se
+īr1sē
+iz1na
+ob1ro
+al1go
+um1si
+op1ļa
+ur1tu
+or1tā
+ul1cē
+iš1ķo
+ad1ro
+it1če
+il1vi
+uz1se
+oh1lo
+od1ne
+iļ1ra
+īg1no
+ap1ni
+oz1ni
+il1me
+ur1da
+āt1do
+ar1he
+in1tū
+ul1fī
+us1gu
+ul1cī
+al1bā
+ib1ra
+ir1ga
+ul1gu
+ān1ri
+il1gu
+ab1pe
+op1to
+il1zi
+is1ķi
+uv1cī
+ap1tā
+až1re
+iz1pī
+ud1be
+ek1ne
+ab1ļa
+iz1ki
+ar1mā
+iļ1ķe
+ok1ro
+ig1šu
+at1bo
+ār1pū
+īb1ta
+uz1kā
+iz1bi
+um1ma
+or1ko
+an1vā
+es1le
+is1ci
+op1mē
+ām1pu
+ir1ba
+os1tē
+ig1rē
+ok1da
+īk1le
+el1te
+ek1ru
+ok1mā
+ob1ja
+ar1gu
+iz1ķi
+or1gā
+ij1jū
+is1mā
+ūk1nē
+al1ce
+ēs1tā
+ur1la
+īv1bē
+ar1bo
+až1vi
+iz1li
+om1fi
+ar1ni
+ār1cē
+uņ1ni
+ir1pā
+uk1šu
+in1fu
+op1ļo
+on1mē
+ēš1la
+ūm1ju
+on1me
+is1ja
+āl1da
+āj1pu
+el1zi
+ēr1ko
+īs1tū
+āb1ta
+it1re
+ēr1ta
+ik1ne
+aņ1ģē
+es1na
+uš1ķī
+ēk1sū
+āp1jo
+ār1ja
+op1li
+ib1rē
+oš1ķa
+ag1ta
+ob1jo
+ok1lē
+ul1ku
+ip1te
+ar1cī
+ār1te
+īg1ša
+uz1ki
+ās1la
+et1ro
+ās1ti
+ar1ti
+iz1sa
+āk1zi
+uz1sē
+em1šo
+ok1so
+et1ze
+ar1žī
+oš1vi
+ap1ri
+ad1ru
+u1dzo
+āp1nē
+at1za
+ūr1li
+iv1la
+or1va
+ūv1be
+ep1ni
+eņ1sā
+ūr1vē
+āz1tā
+ēb1šo
+ev1lū
+ib1kā
+īt1da
+um1ša
+ug1sa
+ik1da
+ak1lu
+ēr1ļa
+os1mu
+īņ1la
+if1rā
+oņ1tū
+eg1ne
+is1mo
+uz1šū
+on1tū
+ob1šo
+in1va
+eg1lū
+ir1pi
+u1dza
+us1la
+ūs1pu
+ib1to
+iz1sē
+ap1čū
+ok1lā
+uv1mu
+īk1sa
+āķ1ve
+iz1mu
+uz1mī
+uļ1ķo
+ar1hī
+ēl1me
+īg1me
+ag1ve
+ur1vu
+ār1ha
+ed1ni
+āt1se
+at1ņa
+at1sū
+ūk1šu
+ol1me
+ūz1mē
+ip1to
+at1tī
+ēs1ta
+us1ve
+iņ1pu
+ol1va
+in1ši
+āp1ta
+ar1ko
+ēk1si
+el1zī
+er1nu
+az1pi
+ār1bī
+uk1la
+ek1ņi
+er1ro
+ēt1bi
+al1da
+is1pe
+īk1mu
+ēc1pu
+in1dē
+ūr1ve
+es1tū
+ēr1mi
+ez1ko
+ār1ko
+āl1lē
+ep1te
+ār1re
+an1ce
+od1ku
+ig1ru
+īk1tu
+ēž1ve
+ap1no
+ul1ga
+el1ve
+at1ņe
+ār1pā
+op1bu
+iv1ti
+iz1dā
+ig1ra
+ij1va
+ēr1di
+iz1lo
+uz1bo
+ās1nu
+el1ņa
+us1ne
+ev1ge
+ab1di
+uz1jo
+ār1kā
+eb1re
+ir1nu
+op1tā
+il1li
+uz1pī
+āj1do
+ēg1tī
+ul1re
+eļ1ķī
+ej1nī
+av1ļu
+aļ1ņu
+ūs1ga
+im1fo
+ab1ta
+ut1ne
+iš1ķu
+ez1nu
+or1sē
+ep1ļu
+ūt1si
+ik1le
+is1ga
+oz1to
+op1ti
+ur1šo
+il1kā
+im1du
+ēr1ba
+iz1no
+ar1je
+am1du
+ul1lu
+ot1ni
+eš1si
+at1pa
+ab1to
+ip1zā
+ūs1tī
+at1mū
+ī1dza
+im1bo
+op1tu
+ak1ta
+es1ve
+īk1ma
+ūk1ša
+in1di
+uz1ži
+iz1čī
+ad1vi
+am1šā
+iņ1ņa
+ār1ce
+ēd1ma
+ik1ni
+ap1tī
+ap1zu
+ep1sī
+am1pe
+uz1lē
+iņ1ģi
+uņ1ķi
+ur1pa
+eb1ra
+eš1me
+āt1ni
+or1me
+uč1ka
+ar1vi
+en1gā
+ar1ši
+uz1la
+es1kā
+uk1ņī
+ap1gā
+er1vu
+es1nā
+ir1šo
+iz1sī
+at1gū
+ar1ma
+ef1ro
+eš1ķi
+on1nī
+ap1ho
+ez1zi
+oņ1re
+ur1nu
+am1be
+ek1no
+is1jē
+āž1ni
+ag1lē
+ek1ci
+el1da
+es1pi
+ož1vī
+oņ1mā
+il1pā
+ok1la
+as1lī
+en1ze
+ām1vi
+ir1be
+ik1lī
+e1dzo
+uz1ti
+ul1ta
+ār1gu
+an1so
+ik1si
+eņ1ze
+iv1ju
+ag1nā
+ār1bi
+ib1ša
+or1fo
+ūr1zā
+ap1ņa
+ap1ji
+ēr1lī
+u1dzu
+en1rā
+iņ1pa
+at1ķī
+ār1vā
+ap1ļo
+ār1ca
+ek1šā
+ēr1ka
+īz1da
+us1di
+īk1to
+op1sa
+iv1ko
+āb1ti
+il1jo
+iz1ra
+ir1se
+uļ1pa
+iz1ņa
+ār1fa
+os1li
+ez1ma
+ar1si
+oš1ta
+eh1ro
+až1di
+er1sā
+ep1sa
+el1je
+āt1ce
+ek1lū
+an1dā
+ig1rā
+is1za
+ok1ru
+eš1ļi
+āj1mu
+ot1rē
+el1ka
+ur1čū
+eb1šu
+uz1žū
+eg1ve
+uz1ņu
+ob1ri
+ap1bi
+iž1ga
+av1va
+ūs1na
+ēj1ra
+iņ1ni
+eg1tī
+uš1pa
+ag1ma
+ur1ķē
+on1go
+ēr1ne
+īž1ni
+ir1ģe
+as1kū
+ēr1cī
+el1ša
+ēr1nī
+āk1ti
+es1mā
+ap1dē
+īn1me
+ig1šo
+es1ki
+ot1ne
+ab1rā
+ab1te
+ib1rī
+ir1po
+az1do
+en1sī
+az1nī
+er1bo
+al1bī
+ib1lē
+aš1ha
+es1va
+et1ru
+ez1jē
+id1ga
+il1tē
+on1ki
+il1na
+ur1go
+oņ1pa
+ur1lī
+od1pi
+īb1to
+iņ1va
+ad1ni
+ev1ka
+ar1la
+āb1tu
+at1vī
+er1su
+us1ku
+iv1vē
+iņ1za
+or1nī
+an1do
+ūt1ne
+om1bi
+an1to
+el1dē
+uļ1sē
+el1jē
+il1ča
+ās1lē
+as1pu
+uz1su
+uš1ku
+om1po
+ul1bē
+ēc1mē
+eņ1ko
+īv1zā
+eg1le
+is1ce
+is1ni
+od1rā
+om1na
+ul1mi
+āk1ļo
+ig1mu
+ir1me
+eg1ra
+eb1ta
+al1mu
+is1ki
+in1jo
+īn1vi
+ef1lā
+ēj1ca
+ar1hi
+ul1ba
+om1ja
+an1kā
+am1bū
+op1tē
+ol1lo
+am1mā
+at1ķi
+ad1hē
+ot1ma
+em1lī
+āl1le
+as1mē
+ūr1ga
+ik1la
+um1so
+an1dī
+us1lī
+ūr1ta
+in1že
+ip1ri
+ej1se
+ul1ki
+eg1bu
+il1šo
+at1pe
+at1čā
+ap1lē
+eg1lā
+īs1re
+ēr1ve
+ek1ca
+ap1so
+ēr1mo
+āz1ta
+or1tū
+āk1šu
+em1ci
+ok1ne
+ēd1nī
+es1ti
+il1pe
+ip1na
+ik1va
+os1lī
+iz1šā
+od1ri
+ob1rū
+un1va
+eb1ku
+il1to
+ir1tī
+uk1ro
+iz1cu
+āž1ra
+ur1di
+eb1ju
+ul1so
+īs1lo
+ēj1čū
+in1fi
+ur1za
+il1va
+iz1fa
+al1do
+ib1si
+ēr1bā
+os1ni
+oš1re
+im1ba
+ig1si
+ūr1fi
+ec1pu
+ak1to
+el1so
+ek1rā
+īs1va
+aš1mī
+en1ti
+en1pu
+eb1ri
+am1ma
+es1me
+ūn1vi
+ak1ci
+ēp1ša
+eš1ni
+el1vi
+ov1ka
+ēz1do
+iz1lā
+en1tū
+en1su
+ur1nā
+ot1ro
+ob1re
+ep1žo
+at1ķē
+ēp1ti
+en1ci
+at1bē
+uk1to
+āg1šu
+il1mē
+ār1žo
+is1va
+ēt1ce
+un1ro
+eg1me
+on1bū
+ah1ro
+ād1re
+or1ni
+uģ1ni
+uz1so
+uz1rū
+īs1kā
+īs1pu
+ar1šu
+ar1sā
+el1bu
+il1ta
+ur1ķi
+ak1ne
+ap1vē
+ār1ča
+av1ve
+os1pē
+aļ1ra
+eš1ķe
+ur1zo
+as1va
+uk1či
+ar1pi
+uk1ra
+ur1mē
+ez1se
+al1pī
+um1za
+īs1de
+aļ1ru
+uk1ko
+eb1le
+ul1ju
+āt1ze
+at1bū
+ez1vi
+at1šū
+ag1ra
+āt1kā
+īs1te
+iz1jū
+eš1ņo
+ur1co
+ar1bi
+ūs1tu
+it1ka
+en1sē
+eš1ņa
+ag1ro
+aļ1si
+id1ri
+it1no
+ež1ma
+os1pi
+ev1ti
+ēk1pi
+ap1tū
+us1mī
+el1hi
+iz1ha
+eš1ļu
+ām1vā
+un1gu
+ā1dzī
+āl1nī
+eb1li
+od1re
+āk1la
+ab1zi
+af1ni
+ād1ni
+ig1ri
+ek1ga
+uļ1mu
+on1va
+īv1ko
+um1ra
+at1pā
+ub1ļa
+er1nī
+ug1ļi
+aš1ke
+ēr1tī
+ap1ba
+od1jo
+ok1ļū
+us1tu
+uz1ķe
+ih1ta
+iņ1ga
+ēp1jo
+un1ce
+il1ši
+īt1ne
+oš1ķī
+ig1ta
+ol1lī
+ūk1ga
+es1pē
+et1bo
+ez1di
+ap1ķi
+uz1ca
+ig1mā
+or1ķa
+ez1to
+āp1ju
+ēk1nī
+at1ļu
+es1sē
+ir1pa
+ap1ra
+up1li
+ul1dī
+ē1dza
+ek1so
+ol1zī
+ēr1co
+or1ka
+ad1ja
+en1ra
+ez1ba
+iz1go
+en1hā
+ez1ka
+et1re
+ah1ve
+il1pī
+ep1lu
+eg1ti
+im1fā
+ih1nī
+ēr1dī
+ap1čā
+ēj1vi
+an1tī
+eņ1tu
+ut1ru
+ēj1tā
+ur1bu
+ur1de
+es1no
+am1pī
+un1vā
+iž1ku
+uk1lu
+un1bū
+un1tu
+is1nī
+ub1ļi
+ap1či
+ūd1ri
+en1lī
+es1pā
+iz1čū
+ob1ji
+ez1tā
+em1žu
+op1lī
+ab1lu
+od1rī
+āj1sa
+uk1ci
+an1žē
+ūt1ri
+un1dē
+eg1gā
+ur1pū
+il1di
+iķ1ve
+eņ1ka
+an1tū
+āv1vi
+īt1ro
+iz1ro
+āl1di
+i1dzi
+ad1rā
+ap1ne
+at1va
+iz1ma
+ūv1ko
+ūt1nē
+až1va
+ān1sa
+uz1zi
+as1vē
+et1vē
+iļ1bu
+aš1vā
+ap1ka
+iz1pi
+er1ša
+ed1na
+im1dē
+ag1nē
+āj1bu
+ād1ve
+eb1tā
+us1pū
+īt1sa
+ap1ži
+ūr1ni
+og1ļa
+āt1nē
+el1vē
+et1la
+og1ru
+iz1ka
+al1sī
+ir1zu
+om1fo
+eļ1jū
+il1bī
+il1sa
+uņ1ģī
+ej1sa
+or1nē
+am1ta
+ul1šo
+or1pē
+em1du
+ur1lo
+at1be
+ur1si
+ēr1ti
+er1šo
+at1pi
+or1lo
+ev1na
+ec1ri
+ol1ba
+iņ1kā
+ār1hi
+os1fā
+at1lū
+og1ni
+aš1sa
+eg1li
+ij1de
+eļ1mā
+il1nsa
+ir1pti
+iz1šķo
+ēl1mju
+uz1glā
+ap1slā
+op1ska
+ek1špē
+al1tru
+iz1smē
+ēr1kta
+us1kri
+il1bsi
+ul1gri
+ap1sku
+at1frē
+is1pru
+at1fri
+um1pja
+ār1brā
+os1tga
+as1pre
+ār1sve
+ūm1tve
+ār1brī
+uz1fra
+iz1dru
+ēr1ptu
+un1dzā
+ut1ska
+īk1šķo
+āb1sti
+iz1hlo
+ēr1šļo
+ap1gro
+at1šmī
+un1spu
+es1tro
+ap1blē
+et1rka
+us1gri
+at1plā
+on1ste
+ap1šķī
+el1dze
+ab1sce
+at1kļa
+iz1prā
+ug1šde
+on1fli
+at1stu
+im1šte
+ir1kta
+ar1bnī
+er1dzī
+en1dro
+ok1snī
+uk1šķa
+eš1bļo
+īt1ņmē
+et1rde
+ir1mbā
+az1gru
+in1grā
+uk1ska
+ap1spo
+āg1sti
+ug1špa
+al1kva
+ez1tne
+an1gli
+udz1ba
+ūk1sli
+at1sma
+ap1fra
+iķ1skā
+uz1sma
+īp1sla
+il1stu
+iz1gra
+os1krē
+am1sti
+uz1pre
+ez1gla
+īdz1jū
+us1trā
+iz1pla
+iļ1krā
+ēr1zka
+ap1pro
+ir1sno
+ir1smo
+ir1mme
+er1dze
+ān1prā
+ap1bru
+ēg1sto
+as1bra
+ek1šne
+ēr1bšo
+edž1li
+as1tru
+un1dra
+āl1pro
+ār1grē
+ēr1stā
+ar1pta
+īk1stu
+ez1spē
+am1skā
+ir1kļo
+on1gru
+iz1šta
+āļ1dzi
+āl1štā
+īs1pro
+ur1dzu
+ir1stī
+ār1šļa
+uz1gru
+el1pšu
+al1frī
+ek1šga
+ir1mdī
+ek1sku
+iz1spu
+uz1plū
+āk1sla
+iz1dre
+in1ssū
+uz1gle
+om1pre
+ār1gti
+udz1cī
+iš1brū
+uz1kru
+uz1sli
+uz1klā
+at1ble
+īdz1ni
+iz1smī
+ār1sni
+īs1spa
+iz1pre
+īg1sko
+iz1žva
+ir1gti
+ēr1bta
+īt1pra
+at1gla
+as1dzi
+ap1skū
+uk1šķe
+at1dzī
+uz1šta
+uk1lva
+at1dzē
+ār1šma
+es1prā
+iz1blo
+al1sti
+at1zvi
+in1dzo
+uz1krē
+at1kvē
+an1brū
+ur1ksi
+uz1stī
+op1sta
+in1sti
+on1sti
+uz1pli
+at1kve
+as1krē
+in1sda
+an1smi
+ap1stu
+us1tpu
+uz1kņu
+ār1blo
+on1gli
+ar1pli
+ap1šļa
+us1kre
+āk1šķu
+al1vja
+iz1sni
+ap1pla
+uz1brā
+iz1brē
+eš1stū
+iz1svā
+ēr1kša
+ug1sta
+at1blo
+ap1švi
+il1dno
+iz1glū
+ir1sdi
+im1pro
+ār1tre
+iz1bri
+āl1bra
+at1bri
+uk1stē
+iz1brū
+at1plē
+il1bšo
+ur1dza
+ik1lpa
+āt1rra
+uk1sti
+ur1kša
+en1džo
+ār1svā
+ap1krā
+īk1šķi
+at1rre
+iņ1zva
+at1žvī
+ār1blī
+ēr1sta
+ār1smi
+iz1šmī
+ug1šna
+iz1skā
+uz1trī
+ap1svī
+is1prā
+ek1sta
+at1sla
+at1trū
+āk1slī
+uz1kna
+il1dvi
+ār1dzi
+uz1šņu
+is1tre
+iz1svi
+ap1dri
+el1dmē
+ul1gto
+an1tzi
+is1kvī
+uz1kļū
+ār1šņo
+uz1frē
+ib1sto
+ig1sta
+in1ktī
+ir1sni
+en1sne
+em1pjo
+ēr1btu
+īn1skā
+ēk1šņo
+ik1smē
+es1trī
+at1šķū
+at1pla
+in1gto
+ot1rdi
+al1cvi
+um1bri
+uz1švi
+is1glī
+an1džū
+ap1sle
+uz1pļē
+ap1šķe
+iz1ble
+ap1šņa
+ir1mre
+en1tra
+ār1tra
+ul1snē
+iz1spa
+ep1sti
+ūt1sga
+āg1sto
+īb1sta
+ap1pļā
+at1kle
+il1gtu
+iz1spi
+am1tra
+an1fra
+uz1frā
+ēr1nva
+uz1stū
+ūk1sto
+at1šma
+um1šzi
+ug1stā
+at1špa
+il1kti
+īp1sle
+iz1tri
+os1tro
+el1pšo
+av1sta
+ak1tda
+ik1snu
+iz1stū
+ok1tri
+ap1gve
+op1spē
+iz1pra
+el1ptā
+es1tra
+iz1kni
+ān1spē
+os1kva
+ol1ste
+ul1dzo
+ek1šzo
+uz1ste
+uz1brī
+in1skā
+ār1švī
+il1nvē
+ūv1pro
+iz1šļu
+ev1ski
+en1zda
+āt1rda
+ēk1šķu
+ig1sto
+ēr1kšu
+ēr1ktā
+iz1skū
+an1kre
+iz1pro
+il1spi
+al1kto
+ok1zvē
+ap1zva
+ār1zvē
+un1tni
+ak1sti
+as1tri
+īb1spē
+os1mve
+en1sžu
+el1nru
+er1csa
+uz1zvi
+al1vtu
+at1dzi
+um1krū
+ot1frī
+ap1klī
+an1sko
+el1dko
+an1tkā
+ap1gla
+īk1šņa
+ār1gve
+il1dba
+es1tma
+uz1sti
+at1drū
+ul1pto
+uk1smi
+as1trē
+er1tro
+īb1sti
+id1spa
+at1trā
+ar1pna
+at1sta
+ek1trī
+at1šņo
+at1zve
+ig1zda
+ir1mpa
+ak1tni
+ir1kšo
+ār1plo
+ār1prā
+il1nti
+om1sva
+ēr1bja
+il1trā
+al1kta
+iz1dza
+iz1šma
+at1dza
+iz1kri
+ol1skā
+en1tni
+et1sti
+at1tru
+iz1špa
+ur1kne
+īg1zna
+ul1sva
+an1tza
+ār1tņu
+īn1krū
+uz1šņo
+ek1tkā
+at1plū
+il1kni
+uz1žņa
+ur1sli
+iz1tre
+ap1stī
+or1dda
+ur1gra
+at1glā
+ās1tni
+uz1žmi
+at1dze
+āl1sti
+ēr1slī
+el1nze
+āk1ste
+op1pla
+at1prā
+up1sto
+em1plā
+ib1stī
+up1sti
+ār1špa
+ēj1pla
+ār1hlo
+ap1frē
+il1kto
+al1dzi
+on1tri
+ar1gsē
+iz1frē
+ap1bro
+ul1tne
+im1stī
+ug1špē
+em1pta
+at1grū
+as1tma
+īk1ste
+iņ1krū
+il1kšu
+ek1ska
+is1tvi
+ār1dro
+iz1tro
+us1smē
+el1zta
+ēr1psi
+āk1sme
+ēs1tne
+ār1grū
+ok1gri
+up1stē
+ok1sko
+et1rro
+un1dze
+ap1trī
+uk1šķu
+in1sri
+en1tri
+āj1dzī
+ap1fri
+et1rpa
+uz1klu
+ik1sme
+ār1dra
+iz1kvi
+ēr1pto
+at1plī
+od1pra
+at1glu
+ap1fli
+uz1gri
+at1krī
+īk1stē
+oš1prā
+an1frē
+ap1sva
+il1bta
+ek1smē
+ār1šru
+us1tmā
+īk1smī
+al1dķi
+os1trī
+in1ssē
+al1tga
+ir1mkā
+ap1zvi
+ūg1sto
+em1pli
+uz1ble
+on1spe
+at1spā
+ār1sko
+ap1trā
+ek1šli
+āl1skā
+iv1pro
+ar1krē
+iz1tra
+uz1tri
+uk1ste
+ir1klī
+ap1kna
+er1spē
+ik1šķa
+ak1šķo
+ur1gšo
+al1dga
+ap1kla
+ap1svē
+in1tri
+im1tga
+in1šķi
+ēr1bka
+ēr1sti
+at1ska
+āb1sle
+ap1slī
+iz1slā
+an1gļu
+ir1msā
+ēr1pša
+or1tlī
+iz1dri
+un1kta
+el1dzī
+em1ztu
+en1ksi
+ār1kna
+un1kto
+ap1klu
+at1tra
+at1brā
+at1žva
+an1kro
+ap1sme
+ūg1sti
+ar1tmā
+in1gti
+ār1sti
+ik1stē
+om1bve
+ap1sko
+ār1ple
+īk1smi
+ug1sne
+ap1krē
+en1skā
+en1szī
+āk1sne
+es1pre
+ēr1ķti
+āl1sma
+īr1ska
+at1slī
+us1krē
+us1ska
+el1pta
+en1kto
+ar1bga
+ār1tru
+eņ1krū
+en1trē
+ār1spu
+en1spu
+al1ktā
+ik1sti
+em1zti
+āt1stā
+al1kci
+ap1kļū
+el1nsi
+ēr1nru
+ir1dza
+ār1klī
+at1tre
+il1dma
+īk1pla
+ap1sni
+el1kme
+el1nbā
+ak1smē
+āb1sto
+un1drā
+uz1glu
+uz1ska
+en1slī
+an1sli
+ēr1sba
+un1dro
+el1zto
+uz1trā
+uz1spā
+ap1dzē
+ap1dru
+in1dze
+ed1gri
+eļ1blā
+an1kci
+os1krū
+iz1spā
+an1krū
+ir1sra
+it1sko
+ir1mso
+un1ktī
+iz1slī
+er1zto
+et1pra
+ur1tra
+al1tme
+iz1slu
+il1gti
+iz1gre
+ek1šķī
+op1sva
+uz1tru
+ar1ppa
+in1dzē
+ab1dzi
+ur1tni
+uz1bri
+ab1stu
+in1gra
+uz1sva
+iz1krē
+ap1dzi
+ug1šte
+um1bru
+at1dro
+ir1sti
+ur1sti
+āl1sko
+at1klu
+en1kšo
+ut1skā
+il1pšu
+ur1gšu
+ar1knā
+ap1knu
+im1bra
+ēk1stu
+iz1knā
+il1bto
+āp1sli
+us1tru
+ak1šņo
+ap1prā
+ir1dzo
+en1krā
+ār1spē
+ar1kro
+iz1dro
+ār1bra
+il1dnī
+el1dba
+al1bri
+uz1brē
+ot1gri
+at1tvē
+ur1sme
+uz1šļa
+ek1šte
+at1šņa
+en1sro
+āk1slo
+an1žsa
+uz1plī
+an1tra
+il1bša
+il1tni
+us1glā
+ur1gti
+īg1stu
+ar1zva
+ol1lmē
+iz1kve
+ar1glī
+in1kru
+ap1kņu
+ir1pšu
+ec1skā
+ar1dzi
+od1ršu
+al1tma
+uz1sle
+eg1spa
+ap1šļi
+ek1šķo
+uz1spo
+ar1kto
+iz1zvi
+uz1šķo
+il1trē
+or1tre
+im1šļa
+iz1blē
+el1gti
+uz1slē
+ār1spo
+al1dka
+uz1bre
+is1tzo
+im1fva
+az1pra
+ap1plī
+aš1kri
+ir1pji
+uz1šļu
+iz1sla
+em1zto
+ur1kri
+al1tna
+er1dzi
+en1kti
+at1pļē
+ēr1slo
+ar1gto
+ūk1šķi
+in1dzu
+es1pļa
+oņ1pri
+uz1bļā
+us1tro
+ij1skā
+ār1fra
+iz1tru
+og1dzi
+ij1spe
+ij1stū
+uk1šķi
+ār1trā
+uz1kla
+ek1sče
+ik1stu
+ar1ppi
+iz1šņu
+oņ1sli
+il1psi
+iz1gro
+ēg1stu
+uz1sku
+ol1stī
+ur1vci
+uz1smī
+ur1zma
+en1sve
+er1spe
+uš1plē
+ur1bšu
+at1stū
+iz1sme
+el1gšu
+ec1sta
+ap1kra
+ek1šda
+il1dde
+el1kņa
+il1dle
+el1psi
+ap1stū
+ap1ple
+uz1ple
+ur1kšo
+ār1dnī
+ēr1pju
+ēk1šķa
+ir1mte
+ug1ļķe
+an1kvē
+il1gta
+īr1šķi
+ap1svā
+ul1lpu
+es1nvē
+uz1gve
+at1pri
+ug1šda
+at1šķo
+iz1plī
+ār1bri
+al1dkā
+udz1ma
+un1ssa
+os1prū
+iļ1ņve
+er1che
+ān1skā
+ab1ska
+ēr1sli
+ār1krī
+al1kšu
+ur1sto
+ūg1sna
+uk1sto
+ir1mcē
+id1sta
+id1slā
+ut1sko
+ir1stā
+ār1pro
+ir1kti
+ār1kre
+ap1glu
+as1tne
+iz1švī
+uz1spu
+al1nrū
+ār1spa
+un1ktā
+āb1slī
+ār1pļē
+ir1bju
+ur1bto
+el1svi
+un1ktū
+ug1šga
+ir1sli
+uz1fri
+ur1bta
+āb1stu
+em1brā
+om1pro
+ez1glā
+ep1sto
+al1kme
+iz1blī
+ar1ksi
+īk1smo
+ār1spe
+ap1krī
+iz1šķē
+ur1tkā
+ēk1lko
+ār1tna
+il1dsa
+al1dni
+el1dce
+on1tru
+iz1sto
+ūp1sto
+ap1žvī
+ap1tri
+od1gru
+ār1gtā
+iz1gve
+el1gsi
+er1nha
+at1švī
+ār1hro
+il1tvā
+uz1sme
+at1sve
+im1tni
+uz1pri
+ēr1sra
+as1krā
+en1ska
+iz1glī
+us1tdē
+ol1tme
+ūr1stu
+um1švi
+at1šļa
+ār1knā
+uz1tre
+ok1šņo
+at1bli
+at1sni
+el1gto
+ek1šķe
+ab1sti
+un1fte
+ap1gri
+ir1ste
+ul1sni
+en1tvi
+am1plu
+am1zda
+ik1stī
+at1knā
+at1skū
+is1tro
+is1trē
+īg1sta
+ir1spu
+am1svē
+ār1bru
+ec1stū
+ul1dza
+il1kšo
+ār1plā
+os1tni
+īk1sna
+uz1sta
+ār1zda
+ār1šķi
+uz1bli
+ek1tro
+ap1grē
+ur1bšo
+ir1slē
+iz1kla
+uz1trū
+uz1tra
+ak1sto
+os1tre
+uz1dri
+ir1sma
+ak1šķē
+ak1tli
+ek1švē
+ās1nku
+el1zti
+er1cba
+ēr1kto
+in1dsē
+al1kša
+um1tra
+ip1sna
+eļ1ska
+ār1šķī
+ap1kri
+ār1šķē
+el1drē
+im1pli
+uļ1dzi
+ir1pta
+ēr1pta
+il1pra
+up1stī
+iz1fra
+us1tre
+ub1krē
+ār1pļā
+in1fra
+il1kta
+ir1mpi
+ap1šņo
+at1sku
+un1dzi
+es1trē
+an1drī
+il1pto
+adz1ni
+ar1pju
+in1gtā
+iz1gru
+ap1šķo
+ēr1skā
+ot1rpi
+or1tfe
+ir1mti
+ik1šķi
+an1tmē
+am1bri
+un1dža
+il1pšo
+as1brā
+el1gšo
+ap1kvi
+ug1sme
+il1pne
+ēt1svi
+ir1kša
+as1sko
+ek1spe
+en1kša
+iz1bre
+em1pti
+ār1gre
+iz1frā
+iv1stā
+ul1šņa
+ār1kro
+as1pra
+il1ktā
+at1sle
+iz1glu
+ik1snā
+ok1šņa
+um1šma
+ār1gru
+ār1sme
+at1sna
+ur1kto
+ik1sna
+uz1svī
+us1slo
+am1pda
+em1ztā
+uz1žva
+is1smi
+ēr1tnī
+ār1gtu
+ār1drū
+īg1sti
+ap1tro
+at1sme
+iz1plē
+ir1tni
+ak1šžo
+il1sku
+ul1bša
+um1spo
+āk1sli
+ap1blo
+ār1dze
+ār1kva
+uk1sne
+āt1rvi
+ap1žva
+am1stu
+an1dra
+ār1gšo
+ek1stē
+ār1slo
+ār1gto
+ek1ļve
+ek1spo
+ār1tsa
+iz1dži
+ar1blā
+ēg1sti
+ar1bdi
+uk1šķī
+il1bšu
+or1pro
+ap1hlo
+iz1trī
+as1trī
+uz1smē
+ār1spā
+is1tri
+ab1klā
+uz1hlo
+uļ1sti
+at1fli
+ut1nko
+iv1krā
+ur1tdi
+ap1glū
+ār1glū
+om1skā
+at1sto
+um1sta
+ap1gle
+al1sma
+el1tra
+er1sto
+el1dvi
+iz1fri
+et1sko
+at1tva
+ār1kle
+āš1kru
+er1tce
+ap1kru
+us1tri
+uz1gla
+ap1ble
+il1sta
+ap1sve
+iz1dzī
+as1tpa
+em1psi
+iz1tvē
+ac1grī
+ēr1dzī
+ul1lci
+iz1šļi
+at1žņa
+ov1smē
+as1ska
+en1tge
+at1plu
+īs1šķi
+ār1dzī
+ēk1šņā
+el1nko
+ār1sku
+āv1sti
+āl1dzi
+ēp1stu
+īv1kla
+im1tmu
+os1pro
+ap1spē
+um1brā
+ul1dzi
+ār1stā
+ur1knē
+er1trū
+el1nba
+ār1bro
+ar1sme
+ok1sne
+il1ška
+at1svē
+ar1vde
+at1slu
+iz1bro
+ēr1ste
+āb1sli
+us1skā
+at1grā
+āp1stu
+ār1brū
+am1stī
+as1tmē
+iz1kņu
+en1kla
+iļ1sli
+um1sto
+ap1bļā
+uz1sna
+ol1klo
+er1tme
+iz1fli
+al1stu
+ap1špa
+ar1sti
+āk1šķi
+ār1dži
+um1bra
+ir1dzu
+al1kjū
+ap1smī
+āb1sta
+iz1kļa
+ul1ptū
+ap1smē
+ār1tnī
+ar1gva
+udz1so
+us1stu
+ap1ste
+ul1zna
+ār1glā
+ār1blā
+ur1ska
+il1stā
+el1nra
+ak1tri
+at1kņu
+eg1sme
+ap1grū
+ēk1šķo
+in1spi
+ik1sta
+am1bli
+ir1dzē
+ēr1ktu
+ur1kni
+el1tni
+iņ1krā
+iņ1kre
+iz1kle
+an1spa
+un1ska
+am1stā
+ēr1pšo
+ār1fli
+ir1mri
+ēr1btā
+at1svi
+ir1spa
+ār1tnā
+ap1šķū
+en1drā
+ek1šni
+at1trī
+ar1kti
+iz1pri
+ig1znē
+on1spi
+ul1kve
+ek1šķu
+āt1sko
+ek1sne
+īs1krā
+iz1klā
+ēj1tve
+ur1kti
+og1ļhi
+or1tme
+aš1plū
+ēj1slē
+am1pla
+ēs1tni
+ur1bsi
+is1tka
+is1dzi
+iz1spe
+ab1sta
+āp1sti
+as1tme
+os1tri
+udz1da
+ur1dzē
+at1šļu
+at1bra
+un1kla
+er1zti
+uz1pļā
+ār1dre
+il1gša
+iz1ple
+iz1žņa
+er1ztā
+el1dše
+ir1knē
+eņ1krā
+ēr1ssi
+al1sno
+ūp1stī
+ir1gsi
+iz1sta
+ir1sse
+uz1spe
+ek1sni
+īg1snē
+in1dzi
+at1kli
+ar1bve
+on1glo
+iv1ska
+il1dni
+ār1kra
+ār1blē
+ar1stā
+ār1sli
+eņ1ķmē
+ēr1bsi
+ik1smī
+āl1sci
+at1dre
+až1brī
+iz1plā
+ir1mve
+uz1gro
+up1jma
+uz1dza
+em1pto
+an1kto
+ež1sta
+ēr1šļu
+ap1brī
+uz1kro
+uz1skū
+uz1krī
+ap1šmī
+uz1kvi
+il1btā
+or1tje
+es1krā
+at1tve
+ul1stu
+ūk1stu
+en1kta
+ēr1stu
+ar1bma
+uk1stu
+ēr1nzi
+uz1slī
+ūk1sti
+at1sva
+ap1pļē
+il1nmi
+ir1snī
+in1dni
+āj1prā
+ar1sbu
+at1spa
+el1nma
+ek1stu
+is1grū
+is1nle
+āk1stī
+uz1stu
+if1šte
+ār1spi
+īk1stā
+ar1ktu
+ur1ktā
+āj1dzi
+ēr1bto
+iz1zva
+at1knu
+at1fra
+en1sra
+al1ctī
+ār1bre
+ar1bni
+ār1tni
+ez1pro
+an1tnī
+ēp1sti
+as1trā
+āp1sto
+īr1sva
+iz1šķa
+ig1stu
+er1tra
+es1tru
+as1grā
+al1sna
+ur1pre
+ur1mjā
+ēn1prā
+at1pro
+ek1ļpa
+ik1lve
+ēr1kšo
+iz1gla
+ap1sna
+in1dza
+ār1gra
+ir1gto
+iz1sna
+an1čki
+ap1tva
+ār1sna
+um1špe
+at1zva
+ig1zdo
+en1sva
+et1rga
+il1gga
+īk1sme
+al1stā
+et1rri
+iz1dzi
+ār1pra
+iz1trū
+ār1pli
+ēk1šķē
+āj1sta
+iz1kro
+ur1kšu
+iž1knā
+or1bci
+em1ptā
+an1scē
+ir1kšu
+al1tdi
+ēk1šņu
+īdz1ši
+ot1rre
+āt1spē
+ēk1mju
+āt1krū
+il1dda
+at1svī
+udz1kā
+ār1trī
+ar1ktā
+āl1ska
+en1sli
+es1pri
+ur1btu
+ug1stī
+uz1plā
+em1zta
+iz1bļā
+īk1sti
+uz1spa
+ār1tve
+an1dce
+el1dse
+uz1kra
+ap1sli
+ir1gta
+uz1slā
+ir1kli
+oņ1plū
+ur1gto
+an1grē
+ūk1sna
+āv1zva
+an1slā
+ek1švā
+ār1žva
+ār1šļu
+ap1frā
+až1skā
+at1pre
+as1tti
+iv1plā
+uz1grē
+ek1šno
+iz1grā
+uz1bra
+es1tpa
+ur1bra
+iz1kļu
+im1sto
+ur1gtu
+om1dzi
+ir1gka
+iz1šķe
+ek1sti
+uk1šga
+ār1sma
+el1tka
+ar1gma
+al1nra
+uļ1krē
+ar1gka
+iz1svē
+ēr1sto
+il1špa
+im1tci
+uk1plē
+el1pti
+is1dra
+er1sme
+ul1snī
+ār1krā
+āt1sma
+ir1stu
+at1pļā
+uk1smu
+an1dtā
+en1kšu
+ar1sko
+ēr1pti
+ēk1lva
+or1skā
+uk1sta
+ep1sta
+ār1tri
+ir1kņi
+ul1stā
+et1rvi
+il1btu
+ār1sla
+at1pli
+el1nsa
+ur1kmē
+uz1bro
+al1dne
+ār1frē
+un1spū
+ek1šķē
+en1pro
+an1dro
+at1bru
+ak1snī
+uz1tvē
+ik1spā
+uz1blī
+ap1šķi
+el1dra
+un1svi
+at1spu
+ār1fri
+ep1stu
+ēr1szā
+īb1sto
+ār1dza
+ār1gli
+el1kne
+ār1tne
+un1prā
+ap1kve
+uz1kni
+ap1dra
+ār1gša
+ār1kvi
+ir1zga
+ek1šgā
+ek1sve
+at1gle
+ār1stī
+es1pro
+al1kma
+iz1klī
+ug1sto
+az1pro
+āj1sla
+en1tne
+ul1sti
+at1kre
+ār1sva
+ār1šķe
+iz1kļū
+ap1slu
+il1zka
+ek1šme
+am1pšo
+ūr1sko
+uz1grā
+es1grā
+ap1šņu
+ir1kļa
+ur1lmē
+el1dfē
+az1dru
+at1rpu
+um1stu
+es1grī
+iz1kna
+as1smē
+ur1spī
+eņ1skā
+ār1slē
+udz1vī
+un1dru
+ar1ska
+eņ1tra
+am1pli
+uz1kli
+ul1gtu
+ēk1brū
+us1dzī
+ap1stā
+ar1kšu
+es1kra
+iz1brā
+ir1sta
+ar1gce
+em1ptu
+ur1ste
+ār1dru
+uz1pļa
+at1glū
+ad1skā
+ov1skā
+ak1stā
+ēr1zga
+ir1mga
+in1gtu
+īdz1te
+ār1drī
+am1bra
+īk1šķu
+ur1gsi
+ab1sci
+on1dri
+il1pju
+āp1jve
+ar1gbū
+ul1gšu
+ār1dva
+ār1tno
+ap1plo
+as1tka
+il1gšo
+iz1ska
+ār1dni
+ap1dva
+īk1snā
+ap1blā
+as1pļa
+ap1kre
+al1pre
+em1pšo
+ap1tru
+ak1stī
+el1sku
+ak1ņve
+ak1špa
+aļ1ska
+ūr1sta
+at1bļā
+in1gve
+at1hlo
+ig1frī
+ok1snē
+ār1gri
+ak1šķi
+āt1sna
+ul1tsi
+as1tni
+ir1sto
+an1sfo
+ek1šla
+ul1tzo
+ob1spi
+os1pri
+el1bri
+ār1žvī
+at1blī
+ot1rti
+il1gsi
+uz1zvē
+in1spe
+ir1ptu
+ag1sva
+iz1kli
+ok1sni
+el1gra
+um1spē
+ūp1sti
+ak1stē
+ur1kta
+an1dri
+ir1pto
+iz1pli
+īv1drē
+ar1pzo
+ur1bti
+ul1šņi
+at1blē
+og1ļra
+iz1sle
+il1pro
+il1gto
+eļ1tra
+iz1slē
+ār1kve
+ur1btā
+ār1frā
+al1tla
+ur1pmā
+ēr1ksi
+al1ksi
+ir1kņo
+in1sra
+em1blē
+ib1sta
+in1sci
+ur1ktu
+iz1šķū
+an1tni
+ām1glā
+ur1zva
+īk1šķē
+up1rla
+il1nga
+il1gla
+ēk1šņa
+en1prā
+uk1špa
+at1pļa
+iz1šķī
+ār1gšu
+ir1gša
+ul1dzē
+an1kku
+ul1tni
+un1dzē
+ap1sma
+er1sti
+el1ztu
+ir1gko
+im1tre
+us1sna
+ūk1šķu
+ik1tni
+at1brē
+as1kra
+an1dža
+am1plī
+ar1kša
+ap1spe
+an1ska
+ih1svē
+od1sli
+ēr1pšu
+ar1gre
+am1sto
+ān1ska
+or1tvī
+at1svā
+uz1šķū
+ūr1sto
+in1sce
+ud1spi
+udz1ga
+al1snā
+āg1stu
+al1tro
+at1šta
+at1kļū
+udz1vi
+ap1slo
+ap1gre
+iz1šņo
+ug1stu
+im1sti
+up1stu
+ur1stī
+os1kra
+ir1ska
+og1ļde
+um1dzi
+in1kvi
+ed1kļū
+ul1tra
+iz1sko
+el1gtā
+ur1gtā
+iz1pļē
+ap1smu
+er1stī
+āt1ršu
+ok1šņu
+ap1šķa
+āt1dzī
+at1tro
+at1brī
+al1sta
+udz1ru
+ar1gtē
+in1sta
+iņ1ķve
+at1kri
+al1snu
+iz1zvē
+iz1klu
+in1hro
+ir1ptā
+as1kvi
+ur1spi
+iz1kvē
+ār1skā
+ir1gtu
+āp1sta
+uz1bru
+ed1krā
+et1sta
+al1vga
+am1pša
+ar1pga
+uz1sla
+at1šķī
+at1dži
+ār1kļū
+ār1šro
+eņ1bra
+īk1gru
+ār1klā
+ak1ņko
+od1prā
+at1klī
+iz1stē
+ār1žņa
+at1tri
+ik1stū
+ek1šzī
+ār1kni
+ār1pre
+ap1klā
+ul1gta
+ēr1pjo
+ār1gsi
+iz1šņa
+iz1gle
+ēr1bjo
+is1stū
+eļ1drā
+ik1ste
+ēr1nga
+ap1tve
+uz1skā
+ap1knā
+ik1snī
+am1ble
+ek1stā
+ol1fga
+em1bri
+uz1spī
+el1dma
+iz1slo
+ar1gkā
+iz1svī
+ūg1kri
+un1kti
+er1pre
+uz1švī
+ap1dzī
+iz1spī
+ek1tda
+ēr1dze
+il1ska
+ār1tnu
+ur1bša
+ap1tra
+ap1dze
+an1ste
+in1ktū
+er1ztu
+as1pru
+en1sca
+uz1svā
+il1dmē
+ik1sni
+ār1brē
+āk1sto
+āk1slu
+ap1bri
+ap1stē
+iz1sti
+ap1pļa
+ār1šta
+īk1sne
+un1tra
+ok1šķi
+ūs1tni
+ok1trī
+iz1glā
+om1ple
+ār1kri
+uv1bra
+īv1stu
+āt1rgā
+ār1pļa
+uz1klī
+uz1slo
+at1gre
+eļ1bri
+as1prā
+ig1žņa
+ēr1glē
+ūr1sti
+īv1sva
+ah1tve
+ūk1sne
+et1rsi
+uz1špa
+an1dze
+um1pra
+er1plē
+iņ1sti
+at1drī
+at1dva
+in1tnī
+in1gvi
+al1šķī
+ap1slē
+id1plē
+il1nva
+uz1glū
+iz1švi
+udz1pu
+or1tli
+in1kri
+ap1pri
+em1dvi
+ār1drā
+as1tro
+ar1dze
+āk1sni
+uz1ski
+as1tva
+um1sve
+ār1gdi
+ik1sto
+os1pre
+at1frā
+el1dre
+il1dva
+ug1prā
+ul1stī
+uz1svi
+ur1tda
+ār1slu
+ūp1stā
+ez1glu
+īļ1knā
+an1cle
+ūp1stu
+ec1svi
+ak1šķe
+ir1dzī
+uz1dze
+āl1spē
+ij1dro
+ār1kla
+im1sli
+ap1bli
+il1sru
+on1skā
+uz1spi
+ul1dze
+ik1šķo
+us1krū
+ek1stī
+ek1šro
+it1bri
+as1pri
+ik1šķu
+or1tku
+at1kni
+is1mju
+im1stu
+ez1prā
+at1sli
+ur1vma
+om1sta
+er1sta
+ot1rpu
+es1pra
+uz1gre
+at1šķē
+ur1dzi
+ūk1ste
+ap1smi
+ār1stu
+an1skā
+ūr1stē
+ur1zmi
+ār1krē
+er1sma
+at1šņu
+od1sko
+im1pre
+al1snē
+ap1dza
+iz1pļa
+il1krū
+at1spe
+uz1krā
+in1tra
+at1šķi
+at1bro
+el1tga
+in1tro
+on1tda
+ak1šķa
+as1tna
+ir1ski
+aļ1stu
+os1kni
+ēr1tni
+ār1trū
+er1zta
+ir1zma
+iz1knu
+ar1gku
+eļ1gle
+iz1dzē
+ap1sti
+os1trā
+uz1šķi
+os1tru
+ir1kļu
+es1brā
+ar1sto
+ap1grā
+us1tme
+iz1ski
+in1sva
+um1sko
+un1kni
+at1kvi
+uk1stī
+ap1pli
+ot1plā
+et1rmo
+el1djo
+ub1sta
+uz1sni
+iz1dze
+ul1gšo
+am1pjo
+uz1dre
+ar1pni
+is1mmī
+al1dzī
+iz1žvī
+ar1bmū
+at1spo
+al1šķi
+uz1kvē
+al1kti
+udz1re
+ār1spī
+iz1kra
+et1rre
+ab1sto
+uz1slu
+ār1plē
+us1ttē
+ur1sta
+iz1gri
+ot1rto
+en1sti
+āv1grū
+ār1tva
+un1slī
+on1gre
+ēk1sne
+ir1kni
+el1dpū
+av1grī
+or1tjē
+īk1smā
+īdz1ju
+es1smē
+iz1spo
+iz1brī
+um1bve
+is1kva
+īg1ļla
+īs1stū
+im1tkā
+ār1gme
+ār1ble
+āč1plē
+ēr1zci
+ēp1sta
+el1drā
+ak1šķu
+al1nga
+uk1šķē
+ir1ktā
+od1ska
+īk1sto
+ir1spe
+ir1pšo
+ēj1spē
+at1hro
+id1smi
+on1tra
+at1gve
+il1dķe
+in1sku
+el1dtī
+ek1šķi
+uz1kre
+ap1zvē
+ār1ska
+ān1sve
+udz1vā
+iz1ste
+uz1pla
+an1cka
+ež1frē
+in1gša
+ap1hro
+in1gtī
+ir1mdi
+ir1mva
+ap1svi
+uz1dzī
+uz1pro
+ēr1sna
+ap1dro
+uz1blo
+al1tva
+ek1šsē
+udz1ve
+ih1stā
+uz1gra
+ēd1dzi
+ar1psi
+ār1dri
+at1klā
+iz1tve
+ār1sle
+ul1gša
+al1tvī
+ēr1ļve
+ir1mzi
+at1dra
+os1pļa
+ir1kto
+el1nga
+ēl1spi
+ap1gru
+ēr1bti
+us1pli
+ik1sma
+ār1slī
+ol1ska
+īt1ska
+ap1dži
+ur1tnī
+uz1dzi
+ār1šmī
+odz1ni
+ar1gda
+at1ski
+uz1dzē
+el1tli
+ov1ski
+el1ztā
+at1blā
+ar1dzī
+is1trā
+as1tra
+en1svī
+on1krē
+ur1gta
+en1tmē
+ār1kru
+un1dri
+ār1gla
+el1pva
+as1pro
+is1pri
+iz1plū
+il1dko
+ār1šļi
+ar1tne
+us1tne
+at1kna
+at1kra
+at1spi
+ēr1ptā
+īk1sta
+in1grī
+ed1spi
+op1stu
+um1šsa
+ap1pre
+ap1trū
+ār1šķa
+at1brū
+um1šķi
+el1stu
+al1sto
+uz1kļa
+al1nze
+at1gru
+on1fro
+at1kla
+ap1brū
+ir1mtē
+īdz1nā
+uz1šmī
+ap1gra
+ak1šze
+ap1blī
+an1kno
+il1skā
+ir1ktu
+ēt1spē
+al1vni
+ar1gri
+uz1kle
+ul1sto
+es1krū
+iz1pļā
+uz1plo
+at1šļi
+ug1šma
+ec1sla
+īg1sto
+uz1blē
+ib1sti
+en1sto
+in1kli
+ir1dzi
+ug1zna
+in1gro
+as1prū
+ež1gra
+iz1kre
+eg1slā
+ām1grā
+ig1znā
+am1fle
+ir1pša
+eg1smi
+uz1šķa
+ap1šķē
+ug1sti
+al1ste
+al1nci
+em1mvi
+īdz1ti
+ik1sno
+ār1svē
+et1rkā
+ul1gtā
+at1spē
+ār1sto
+il1šmā
+et1rti
+ar1dzē
+er1cko
+ar1sta
+ēr1bša
+āj1gle
+am1pja
+uz1dva
+ot1rkā
+ak1šma
+uz1plē
+ak1špu
+ār1bļā
+ir1gtā
+ik1šķē
+uz1zva
+al1stī
+os1kle
+ār1ste
+ug1šžo
+ēr1tne
+iz1dva
+is1tru
+ek1šku
+ap1skā
+ar1gti
+ar1gvi
+uz1smi
+im1pto
+ār1ski
+ār1plū
+uļ1ska
+ib1snī
+iz1šķi
+ap1ski
+un1sbī
+ep1stē
+us1sko
+at1zvē
+at1sti
+el1dzo
+īk1smē
+an1sku
+um1sla
+uz1šma
+ap1žņa
+ek1šze
+uz1kri
+ir1mmā
+an1čka
+ēg1sta
+at1kro
+et1rrā
+uz1knā
+uz1stā
+ap1drī
+ez1glo
+at1ple
+ar1šļa
+ug1šņu
+ār1kli
+ot1rzi
+al1kvī
+is1tra
+ib1stā
+or1dni
+el1dpa
+in1gpo
+ul1sla
+uz1tve
+el1tta
+ap1plē
+uz1šņa
+ār1sta
+os1tbi
+ār1gle
+og1ļrū
+er1stu
+iz1plo
+ūv1bri
+ēl1spu
+iz1sli
+ap1plu
+um1sti
+uk1švā
+us1tra
+uz1dži
+ēr1npa
+el1pjo
+et1kre
+āb1slē
+ik1lķe
+an1spo
+im1tku
+ok1gre
+iļ1ska
+an1tku
+an1sjē
+il1pša
+ūk1snā
+āl1szā
+ol1sto
+us1trē
+ij1krē
+an1flo
+ap1glā
+āl1svi
+at1slo
+ur1bjo
+el1sme
+at1smē
+op1dzī
+ūg1stu
+al1tra
+er1tne
+at1švi
+os1trē
+ez1drā
+ur1gša
+en1spo
+ov1ska
+il1ktu
+es1tre
+iz1dve
+ār1smē
+at1gra
+āg1sta
+ūv1gri
+as1tmā
+in1flā
+oņ1stū
+ār1klu
+el1tne
+ak1sta
+ār1dko
+ār1kvē
+an1tro
+at1kru
+ap1sto
+il1pta
+edz1ni
+is1pro
+īr1gro
+udz1si
+em1bra
+ār1zko
+ul1šņā
+us1sti
+ēk1šķi
+udz1vē
+um1tni
+ar1stu
+ap1kle
+īk1smu
+up1sta
+īk1sma
+ār1zva
+ab1rka
+ēdz1ni
+āb1stā
+ēr1kli
+en1tro
+ār1plī
+il1gšu
+ap1kvē
+as1tre
+ak1ste
+ek1šķa
+āt1rmo
+an1sce
+in1sde
+iz1kru
+ap1šļā
+at1bre
+on1sta
+ēr1zla
+el1gša
+ām1bra
+el1dzi
+uz1dru
+udz1di
+ap1brā
+ar1kta
+eņ1sla
+ar1švi
+iz1smi
+ir1vja
+en1gri
+ar1kšo
+uz1drī
+ul1sta
+ek1sme
+ār1šņa
+ār1zni
+ār1tro
+ap1kli
+ār1svi
+ēr1stē
+īk1stī
+et1rtū
+īdz1ci
+ur1tli
+ek1sto
+im1tsa
+us1brā
+uk1šķo
+ir1zta
+ār1stū
+un1ktu
+ēr1mju
+īk1šķa
+ur1kli
+uz1fli
+ap1plū
+il1dzi
+ap1dre
+az1sva
+ug1ļla
+at1stī
+iz1plu
+uz1tro
+is1sli
+iž1skā
+ir1gšo
+en1ktā
+ār1gta
+iz1bli
+ār1smī
+im1brī
+ār1dzē
+ār1svī
+ek1spa
+īdz1ko
+uz1svē
+at1plo
+or1tla
+ab1prā
+ir1tne
+ūk1slā
+iz1sve
+et1plā
+ir1sva
+il1bti
+uz1brū
+īt1spē
+uz1šķē
+udz1no
+at1slā
+iz1blā
+es1tdi
+us1zvi
+is1kri
+ēl1slē
+ob1sku
+ēk1šņi
+ul1šņu
+on1tro
+il1stī
+iz1bra
+ur1pni
+al1dsē
+im1ttū
+is1spē
+es1tme
+in1gvī
+ug1špu
+ir1dne
+iļ1ņla
+ap1sta
+ik1smi
+ad1grā
+iz1spē
+il1gtā
+iz1sva
+il1nbā
+im1stā
+ak1šve
+uz1pra
+uz1grū
+ār1skū
+iz1bru
+us1tsē
+ug1snē
+ār1dzo
+in1tni
+ig1sti
+er1gtu
+en1tru
+as1krū
+ār1slā
+ap1tvē
+el1sti
+il1sto
+il1dra
+ot1rga
+ur1kņu
+ap1bra
+er1tzā
+at1stā
+er1cli
+ēr1bšu
+uz1stē
+ap1plā
+an1gvi
+uz1šļi
+uz1blā
+ed1rvi
+as1tla
+iz1stu
+ot1spē
+us1pro
+im1tda
+am1krē
+op1pro
+ig1žņo
+at1bļa
+ap1kni
+iz1sma
+iz1grū
+an1dpu
+īv1prā
+ur1stu
+ar1stī
+ig1zne
+ūk1sta
+āj1sko
+ek1ška
+ub1sti
+ur1dze
+iz1hro
+ap1šma
+ap1spa
+ār1stē
+ib1stu
+at1smī
+im1sta
+il1ksi
+ar1ndo
+on1kre
+es1krē
+āl1plā
+uk1sma
+in1gri
+um1pro
+uz1dra
+ār1pla
+ār1plu
+at1ste
+el1gta
+en1gru
+il1tze
+ār1pri
+iz1krī
+at1krē
+es1prū
+is1svē
+ār1švi
+ār1knu
+en1ktu
+ap1tre
+iz1kņū
+ul1gsi
+in1dri
+iz1drī
+ek1ste
+aļ1ķne
+uz1spē
+os1tma
+ug1sni
+at1grē
+al1sni
+ur1nga
+ip1frū
+ēr1sko
+at1stē
+ēr1gli
+ol1fra
+at1gro
+un1kci
+ār1kņu
+iz1sku
+ek1sce
+ap1sla
+at1slē
+ap1šta
+ap1šļu
+es1tri
+uz1plu
+ār1bli
+ār1grā
+uz1sto
+il1tra
+in1gru
+ūk1sni
+en1szā
+os1prā
+āp1jvī
+ār1tnē
+il1ptu
+um1šza
+is1kre
+is1krē
+ul1gti
+um1dzī
+ek1špu
+ur1zni
+uz1dro
+us1tve
+ās1trā
+ūg1sta
+ap1brē
+er1vje
+iz1grē
+ar1gmu
+at1dru
+ap1kļa
+ap1spi
+ap1bre
+el1pto
+ār1tvē
+al1kšo
+uk1sme
+el1dzē
+il1kme
+ēn1skā
+ir1gšu
+il1sti
+ir1dsa
+ir1slī
+at1smi
+ār1šķo
+ar1spa
+al1dse
+uz1knu
+ar1gpo
+iz1šļa
+at1šķa
+ār1šņu
+uz1sve
+an1stē
+ek1trā
+ār1glu
+ur1vju
+oņ1sti
+at1drā
+iļ1pro
+iz1tva
+iz1trā
+ap1spā
+om1pli
+ak1stu
+ap1spu
+ek1tdi
+ok1ste
+er1gra
+am1bre
+uz1bļa
+us1gra
+el1gru
+am1sta
+at1sko
+īb1stu
+ek1tri
+el1mla
+an1sve
+at1skā
+un1dzī
+īk1gra
+ap1ska
+in1dko
+al1ktu
+ul1dzu
+es1trā
+at1spī
+ol1dla
+at1šķe
+eņ1ple
+os1tla
+ik1stā
+ap1švī
+uz1prā
+ap1kro
+ūt1smē
+is1gri
+em1pšu
+iz1bļa
+ir1mno
+ap1spī
+ēr1kti
+al1gme
+ed1svi
+is1bri
+un1sne
+en1svi
+uz1kve
+ār1gro
+er1stā
+uz1šķe
+eļ1krū
+od1rpa
+īv1grā
+et1rba
+un1sku
+ār1tmē
+āb1stī
+il1pjo
+iz1stā
+uz1žvī
+uz1šķī
+is1tko
+os1pra
+el1gtu
+ad1smi
+om1kra
+ut1sva
+il1pti
+ug1pre
+un1kte
+il1gru
+ār1šķū
+ez1gli
+iv1spē
+er1dlo
+āt1ršā
+ēj1grā
+ur1dzo
+en1trā
+ap1bļa
+ēr1tņu
+em1dni
+in1ksa
+āl1šķē
+uz1hro
+iv1sto
+et1rjū
+uļ1glu
+ir1psi
+el1zce
+um1slē
+at1gri
+el1ptu
+uk1stā
+at1pra
+ar1gjo
+uz1tva
+uz1sko
+iz1stī
+el1sto
+ap1pra
+ov1sku
+ar1šru
+ēp1sto
+at1krā
+ir1ksi
+ok1šķe
+iz1šļā
+iz1dra
+il1ptā
+il1dsē
+in1gta
+ūp1sta
+ug1ļko
+ar1džu
+iz1krā
+ul1dzī
+ur1stā
+ārg1sti
+ilg1sto
+akt1spo
+alt1gva
+ark1sta
+ugs1tlē
+uzs1pļa
+ald1skā
+ins1grē
+izs1prū
+ilk1tni
+urb1sti
+ezg1lve
+arp1pro
+irk1sni
+eld1plē
+ird1spu
+ilp1stu
+īns1trā
+ārs1kra
+ird1smi
+eln1svā
+irp1sti
+ārg1stu
+ens1sta
+ugš1sti
+irk1sti
+ilg1sta
+als1tpu
+ārd1dzi
+irm1dzi
+abs1tra
+umš1brū
+arb1spē
+ils1blī
+urs1krū
+izs1pra
+urb1stu
+udz1šķa
+uzs1kra
+aps1pre
+ins1gru
+ens1bla
+ārs1pra
+arg1krā
+ilk1tne
+ens1tru
+ulk1ste
+upj1gra
+unk1šķi
+urk1sta
+aps1krē
+irs1drē
+ērt1sli
+obs1tru
+ērt1ssū
+ast1sko
+ird1ska
+irg1sto
+ord1zni
+aks1tve
+ikt1stē
+uzs1pre
+izs1pro
+ilt1stē
+uzs1prā
+eks1tko
+alk1stī
+īdz1pro
+ens1dro
+irg1stu
+ing1sto
+izs1kra
+ink1stē
+alk1šķi
+ātr1sli
+ild1spa
+āls1tre
+alk1sto
+ubs1trā
+aps1tru
+ērk1šķa
+izs1trī
+ats1krē
+ārs1trī
+alk1stu
+uss1kri
+izs1pre
+ent1lme
+irg1zda
+ilb1sti
+eks1tre
+aps1pra
+ilk1sti
+unt1szi
+uzs1pro
+eks1klu
+iss1pri
+aps1trī
+ulb1sto
+urk1sti
+aps1pro
+aht1klu
+āls1sta
+ens1krā
+ilt1smā
+eks1pre
+uzs1tru
+aps1prā
+etr1kla
+uzs1pri
+īks1tmē
+eld1spē
+apj1dra
+ist1hre
+ids1krē
+irs1plā
+irs1stu
+unk1stē
+ilk1sni
+ink1šķi
+ird1smī
+irs1kre
+īdz1ska
+alk1snā
+īks1tsi
+izs1tru
+ars1tda
+unt1sno
+ēst1gri
+uzs1tre
+urk1sto
+uns1dro
+ulg1sto
+ātr1spi
+ilg1spē
+erc1sko
+ilb1sto
+āls1skā
+ens1krū
+aps1tri
+ilk1tnē
+udr1skā
+urb1jma
+ats1pra
+ird1sli
+izs1trā
+ekš1ņnī
+ind1sta
+aps1kra
+ērk1stu
+iln1bri
+uzs1pra
+udz1pla
+ilb1stu
+izs1kri
+ilk1stu
+irp1sta
+eks1trē
+ugs1tka
+ult1zva
+ātr1gri
+ink1šķo
+urk1šķa
+ulb1sti
+uzs1trā
+aps1trā
+irk1stī
+ulb1stu
+unk1tsi
+ons1trē
+īgt1spē
+ark1stu
+ilk1sto
+ark1šķo
+alt1kvē
+uns1dzē
+irk1stē
+ild1krē
+ink1sli
+urs1trā
+unk1sto
+ilk1stē
+ārg1sto
+akt1sgu
+ert1bri
+ilg1sti
+ērt1svē
+ērs1gri
+aps1trē
+eņs1krā
+amp1stu
+ats1trā
+ilp1sti
+ežs1trā
+erk1šķi
+eln1pla
+urk1sni
+akt1svi
+ens1dzi
+irg1sti
+ark1šķu
+ess1krā
+irk1sto
+unt1sma
+isn1gri
+alk1sne
+ild1pla
+udz1ska
+ārs1tru
+uzs1krū
+ink1šķē
+ērs1svī
+ērk1šķo
+īks1tpi
+ilt1rpa
+ātr1bra
+urk1stu
+ārs1pro
+als1sti
+eks1plo
+amp1sto
+izs1tre
+ang1ste
+irg1sta
+izs1krē
+ātr1spē
+ust1knā
+ark1šķē
+ark1šķi
+ārs1prā
+aps1prū
+ilp1sto
+īgs1trā
+ont1rre
+akt1sde
+ats1tre
+uzs1trī
+aps1pļa
+urk1šķi
+urk1ste
+ink1stu
+ājs1trā
+ats1pļa
+ērk1šķi
+etr1stū
+ink1sta
+ans1kri
+eks1pro
+ald1drā
+ārp1sta
+urb1sta
+unk1šķē
+akt1sda
+akt1spu
+alk1sni
+ārg1sta
+āls1tra
+āls1ste
+irg1zde
+āgs1tvi
+ird1zni
+irt1sku
+ons1trā
+ērk1sta
+ilp1sta
+isn1stū
+elk1sni
+ilt1sko
+ats1prū
+urk1šķu
+ars1tga
+ugs1tro
+ens1šķi
+ing1sti
+ads1krū
+els1tra
+ark1šķa
+ark1sto
+ant1sbe
+ink1šķa
+unk1sti
+ird1sde
+ink1sti
+ans1pla
+ugs1tra
+ats1pre
+irk1šķi
+irp1stu
+ils1dru
+als1tni
+ats1tru
+ins1tru
+anž1dze
+īks1pro
+amp1sti
+ars1tvī
+ugš1stā
+anc1spē
+ark1sti
+unk1sta
+irm1ska
+akt1smī
+ulg1stu
+amp1sta
+eks1trī
+unk1šķo
+urk1stē
+elz1szā
+ārs1tre
+ens1kri
+ink1šķe
+uks1trā
+ink1sto
+ult1spū
+elt1spē
+ats1pri
+ild1spē
+uzs1prū
+eks1tro
+egl1prā
+irp1sto
+alt1kri
+akņ1gra
+ārs1lve
+ārs1pļa
+udz1stū
+urb1sto
+aps1tre
+ugs1tvē
+ekļ1skā
+unk1šķa
+isn1prā
+ats1tri
+ākļ1stā
+udz1krā
+imt1pro
+ing1sta
+eks1plu
+akt1spa
+ilk1sta
+alk1šņa
+ats1prā
+īks1tča
+ent1rti
+ērk1sti
+irg1spē
+ikt1spē
+izs1prā
+akt1smi
+izs1krū
+unk1stu
+ats1krū
+ārs1pri
+unk1šķu
+ult1spē
+unt1sga
+ugs1tsi
+izs1pri
+ārs1krū
+aps1krū
+ārk1sti
+izs1pļa
+ars1tpu
+ērk1ste
+uzs1tri
+ulb1sta
+izs1tri
+ons1tru
+irs1svā
+ats1trī
+ārs1krē
+akt1ssa
+eks1tra
+akt1slo
+urk1šķo
+ing1stu
+ult1kva
+ust1spo
+ītņ1gri
+ežs1krū
+irm1sle
+irk1sta
+urk1šķē
+ort1pre
+ekš1ņla
+iņs1trā
+alk1sta
+irk1stu
+emm1dzi
+irg1zdā
+irm1kla
+aks1tni
+ons1tra
+ink1šķu
+ats1kra
+ind1rve
+akt1sja
+ens1blu
+aļķ1špa
+ult1sva
+ogļ1skā
+ārk1sta
+ulg1sti
+ērk1sto
+ird1sdā
+ugs1tce
+uns1grē
+ult1pla
+irš1krā
+egt1spē
+ārs1tni
+ats1pro
+akt1sla
+ārs1tri
+ilg1stu
+īdz1sva
+uzs1krē
+oks1krū
+ārt1sta
+ilb1sta
+alk1sti
+oks1tro
+ekš1dzi
+ent1rbē
+iln1ska
+irm1šķi
+ārs1trā
+aps1pri
+ons1krē
+ārs1pre
+irk1ste
+ird1slē
+ulg1sta
+akš1svā
+alt1bri
+ārs1prū
+.jā1s2p
+.ne1s2p
+.ie1s2p
+.no1s2p
+.pa1s2p
+.pie1s2p
+.sa1s2p
+.uz1s2p
+.aiz1s2p
+.ap1s2p
+.at1s2p
+.bez1s2p
+.pār1s2p
+.iz1s2p
+.eks1s2p
+.vis1s2p
+.jā1t2r
+.ne1t2r
+.ie1t2r
+.no1t2r
+.pa1t2r
+.pie1t2r
+.sa1t2r
+.uz1t2r
+.aiz1t2r
+.ap1t2r
+.at1t2r
+.bez1t2r
+.pār1t2r
+.iz1t2r
+.eks1t2r
+.vis1t2r
+.jā1s2c
+.ne1s2c
+.ie1s2c
+.no1s2c
+.pa1s2c
+.pie1s2c
+.sa1s2c
+.uz1s2c
+.aiz1s2c
+.ap1s2c
+.at1s2c
+.bez1s2c
+.pār1s2c
+.iz1s2c
+.eks1s2c
+.vis1s2c
+.jā1s2tj
+.ne1s2tj
+.ie1s2tj
+.no1s2tj
+.pa1s2tj
+.pie1s2tj
+.sa1s2tj
+.uz1s2tj
+.aiz1s2tj
+.ap1s2tj
+.at1s2tj
+.bez1s2tj
+.pār1s2tj
+.iz1s2tj
+.eks1s2tj
+.vis1s2tj
+.jā1g2l
+.ne1g2l
+.ie1g2l
+.no1g2l
+.pa1g2l
+.pie1g2l
+.sa1g2l
+.uz1g2l
+.aiz1g2l
+.ap1g2l
+.at1g2l
+.bez1g2l
+.pār1g2l
+.iz1g2l
+.eks1g2l
+.vis1g2l
+.jā1ž2v
+.ne1ž2v
+.ie1ž2v
+.no1ž2v
+.pa1ž2v
+.pie1ž2v
+.sa1ž2v
+.uz1ž2v
+.aiz1ž2v
+.ap1ž2v
+.at1ž2v
+.bez1ž2v
+.pār1ž2v
+.iz1ž2v
+.eks1ž2v
+.vis1ž2v
+.jā1š2ļ
+.ne1š2ļ
+.ie1š2ļ
+.no1š2ļ
+.pa1š2ļ
+.pie1š2ļ
+.sa1š2ļ
+.uz1š2ļ
+.aiz1š2ļ
+.ap1š2ļ
+.at1š2ļ
+.bez1š2ļ
+.pār1š2ļ
+.iz1š2ļ
+.eks1š2ļ
+.vis1š2ļ
+.jā1s2f
+.ne1s2f
+.ie1s2f
+.no1s2f
+.pa1s2f
+.pie1s2f
+.sa1s2f
+.uz1s2f
+.aiz1s2f
+.ap1s2f
+.at1s2f
+.bez1s2f
+.pār1s2f
+.iz1s2f
+.eks1s2f
+.vis1s2f
+.jā1š2t
+.ne1š2t
+.ie1š2t
+.no1š2t
+.pa1š2t
+.pie1š2t
+.sa1š2t
+.uz1š2t
+.aiz1š2t
+.ap1š2t
+.at1š2t
+.bez1š2t
+.pār1š2t
+.iz1š2t
+.eks1š2t
+.vis1š2t
+.jā1s2tr
+.ne1s2tr
+.ie1s2tr
+.no1s2tr
+.pa1s2tr
+.pie1s2tr
+.sa1s2tr
+.uz1s2tr
+.aiz1s2tr
+.ap1s2tr
+.at1s2tr
+.bez1s2tr
+.pār1s2tr
+.iz1s2tr
+.eks1s2tr
+.vis1s2tr
+.jā1b2r
+.ne1b2r
+.ie1b2r
+.no1b2r
+.pa1b2r
+.pie1b2r
+.sa1b2r
+.uz1b2r
+.aiz1b2r
+.ap1b2r
+.at1b2r
+.bez1b2r
+.pār1b2r
+.iz1b2r
+.eks1b2r
+.vis1b2r
+.jā1š2r
+.ne1š2r
+.ie1š2r
+.no1š2r
+.pa1š2r
+.pie1š2r
+.sa1š2r
+.uz1š2r
+.aiz1š2r
+.ap1š2r
+.at1š2r
+.bez1š2r
+.pār1š2r
+.iz1š2r
+.eks1š2r
+.vis1š2r
+.jā1š2v
+.ne1š2v
+.ie1š2v
+.no1š2v
+.pa1š2v
+.pie1š2v
+.sa1š2v
+.uz1š2v
+.aiz1š2v
+.ap1š2v
+.at1š2v
+.bez1š2v
+.pār1š2v
+.iz1š2v
+.eks1š2v
+.vis1š2v
+.jā1s2t
+.ne1s2t
+.ie1s2t
+.no1s2t
+.pa1s2t
+.pie1s2t
+.sa1s2t
+.uz1s2t
+.aiz1s2t
+.ap1s2t
+.at1s2t
+.bez1s2t
+.pār1s2t
+.iz1s2t
+.eks1s2t
+.vis1s2t
+.jā1p2r
+.ne1p2r
+.ie1p2r
+.no1p2r
+.pa1p2r
+.pie1p2r
+.sa1p2r
+.uz1p2r
+.aiz1p2r
+.ap1p2r
+.at1p2r
+.bez1p2r
+.pār1p2r
+.iz1p2r
+.eks1p2r
+.vis1p2r
+.jā1g2ļ
+.ne1g2ļ
+.ie1g2ļ
+.no1g2ļ
+.pa1g2ļ
+.pie1g2ļ
+.sa1g2ļ
+.uz1g2ļ
+.aiz1g2ļ
+.ap1g2ļ
+.at1g2ļ
+.bez1g2ļ
+.pār1g2ļ
+.iz1g2ļ
+.eks1g2ļ
+.vis1g2ļ
+.jā1š2k
+.ne1š2k
+.ie1š2k
+.no1š2k
+.pa1š2k
+.pie1š2k
+.sa1š2k
+.uz1š2k
+.aiz1š2k
+.ap1š2k
+.at1š2k
+.bez1š2k
+.pār1š2k
+.iz1š2k
+.eks1š2k
+.vis1š2k
+.jā1p2s
+.ne1p2s
+.ie1p2s
+.no1p2s
+.pa1p2s
+.pie1p2s
+.sa1p2s
+.uz1p2s
+.aiz1p2s
+.ap1p2s
+.at1p2s
+.bez1p2s
+.pār1p2s
+.iz1p2s
+.eks1p2s
+.vis1p2s
+.jā1k2l
+.ne1k2l
+.ie1k2l
+.no1k2l
+.pa1k2l
+.pie1k2l
+.sa1k2l
+.uz1k2l
+.aiz1k2l
+.ap1k2l
+.at1k2l
+.bez1k2l
+.pār1k2l
+.iz1k2l
+.eks1k2l
+.vis1k2l
+.jā1g2r
+.ne1g2r
+.ie1g2r
+.no1g2r
+.pa1g2r
+.pie1g2r
+.sa1g2r
+.uz1g2r
+.aiz1g2r
+.ap1g2r
+.at1g2r
+.bez1g2r
+.pār1g2r
+.iz1g2r
+.eks1g2r
+.vis1g2r
+.jā1š2ķ
+.ne1š2ķ
+.ie1š2ķ
+.no1š2ķ
+.pa1š2ķ
+.pie1š2ķ
+.sa1š2ķ
+.uz1š2ķ
+.aiz1š2ķ
+.ap1š2ķ
+.at1š2ķ
+.bez1š2ķ
+.pār1š2ķ
+.iz1š2ķ
+.eks1š2ķ
+.vis1š2ķ
+.jā1p2n
+.ne1p2n
+.ie1p2n
+.no1p2n
+.pa1p2n
+.pie1p2n
+.sa1p2n
+.uz1p2n
+.aiz1p2n
+.ap1p2n
+.at1p2n
+.bez1p2n
+.pār1p2n
+.iz1p2n
+.eks1p2n
+.vis1p2n
+.jā1s2v
+.ne1s2v
+.ie1s2v
+.no1s2v
+.pa1s2v
+.pie1s2v
+.sa1s2v
+.uz1s2v
+.aiz1s2v
+.ap1s2v
+.at1s2v
+.bez1s2v
+.pār1s2v
+.iz1s2v
+.eks1s2v
+.vis1s2v
+.jā1s2pr
+.ne1s2pr
+.ie1s2pr
+.no1s2pr
+.pa1s2pr
+.pie1s2pr
+.sa1s2pr
+.uz1s2pr
+.aiz1s2pr
+.ap1s2pr
+.at1s2pr
+.bez1s2pr
+.pār1s2pr
+.iz1s2pr
+.eks1s2pr
+.vis1s2pr
+.jā1d2r
+.ne1d2r
+.ie1d2r
+.no1d2r
+.pa1d2r
+.pie1d2r
+.sa1d2r
+.uz1d2r
+.aiz1d2r
+.ap1d2r
+.at1d2r
+.bez1d2r
+.pār1d2r
+.iz1d2r
+.eks1d2r
+.vis1d2r
+.jā1p2l
+.ne1p2l
+.ie1p2l
+.no1p2l
+.pa1p2l
+.pie1p2l
+.sa1p2l
+.uz1p2l
+.aiz1p2l
+.ap1p2l
+.at1p2l
+.bez1p2l
+.pār1p2l
+.iz1p2l
+.eks1p2l
+.vis1p2l
+.jā1d2v
+.ne1d2v
+.ie1d2v
+.no1d2v
+.pa1d2v
+.pie1d2v
+.sa1d2v
+.uz1d2v
+.aiz1d2v
+.ap1d2v
+.at1d2v
+.bez1d2v
+.pār1d2v
+.iz1d2v
+.eks1d2v
+.vis1d2v
+.jā1š2l
+.ne1š2l
+.ie1š2l
+.no1š2l
+.pa1š2l
+.pie1š2l
+.sa1š2l
+.uz1š2l
+.aiz1š2l
+.ap1š2l
+.at1š2l
+.bez1š2l
+.pār1š2l
+.iz1š2l
+.eks1š2l
+.vis1š2l
+.jā1s2k
+.ne1s2k
+.ie1s2k
+.no1s2k
+.pa1s2k
+.pie1s2k
+.sa1s2k
+.uz1s2k
+.aiz1s2k
+.ap1s2k
+.at1s2k
+.bez1s2k
+.pār1s2k
+.iz1s2k
+.eks1s2k
+.vis1s2k
+.jā1s2kv
+.ne1s2kv
+.ie1s2kv
+.no1s2kv
+.pa1s2kv
+.pie1s2kv
+.sa1s2kv
+.uz1s2kv
+.aiz1s2kv
+.ap1s2kv
+.at1s2kv
+.bez1s2kv
+.pār1s2kv
+.iz1s2kv
+.eks1s2kv
+.vis1s2kv
+.jā1k2v
+.ne1k2v
+.ie1k2v
+.no1k2v
+.pa1k2v
+.pie1k2v
+.sa1k2v
+.uz1k2v
+.aiz1k2v
+.ap1k2v
+.at1k2v
+.bez1k2v
+.pār1k2v
+.iz1k2v
+.eks1k2v
+.vis1k2v
+.jā1z2v
+.ne1z2v
+.ie1z2v
+.no1z2v
+.pa1z2v
+.pie1z2v
+.sa1z2v
+.uz1z2v
+.aiz1z2v
+.ap1z2v
+.at1z2v
+.bez1z2v
+.pār1z2v
+.iz1z2v
+.eks1z2v
+.vis1z2v
+.jā1k2s
+.ne1k2s
+.ie1k2s
+.no1k2s
+.pa1k2s
+.pie1k2s
+.sa1k2s
+.uz1k2s
+.aiz1k2s
+.ap1k2s
+.at1k2s
+.bez1k2s
+.pār1k2s
+.iz1k2s
+.eks1k2s
+.vis1k2s
+.jā1p2t
+.ne1p2t
+.ie1p2t
+.no1p2t
+.pa1p2t
+.pie1p2t
+.sa1p2t
+.uz1p2t
+.aiz1p2t
+.ap1p2t
+.at1p2t
+.bez1p2t
+.pār1p2t
+.iz1p2t
+.eks1p2t
+.vis1p2t
+.jā1z2n
+.ne1z2n
+.ie1z2n
+.no1z2n
+.pa1z2n
+.pie1z2n
+.sa1z2n
+.uz1z2n
+.aiz1z2n
+.ap1z2n
+.at1z2n
+.bez1z2n
+.pār1z2n
+.iz1z2n
+.eks1z2n
+.vis1z2n
+.jā1k2r
+.ne1k2r
+.ie1k2r
+.no1k2r
+.pa1k2r
+.pie1k2r
+.sa1k2r
+.uz1k2r
+.aiz1k2r
+.ap1k2r
+.at1k2r
+.bez1k2r
+.pār1k2r
+.iz1k2r
+.eks1k2r
+.vis1k2r
+.jā1s2kr
+.ne1s2kr
+.ie1s2kr
+.no1s2kr
+.pa1s2kr
+.pie1s2kr
+.sa1s2kr
+.uz1s2kr
+.aiz1s2kr
+.ap1s2kr
+.at1s2kr
+.bez1s2kr
+.pār1s2kr
+.iz1s2kr
+.eks1s2kr
+.vis1s2kr
+.jā1f2r
+.ne1f2r
+.ie1f2r
+.no1f2r
+.pa1f2r
+.pie1f2r
+.sa1f2r
+.uz1f2r
+.aiz1f2r
+.ap1f2r
+.at1f2r
+.bez1f2r
+.pār1f2r
+.iz1f2r
+.eks1f2r
+.vis1f2r
+.jā1s2h
+.ne1s2h
+.ie1s2h
+.no1s2h
+.pa1s2h
+.pie1s2h
+.sa1s2h
+.uz1s2h
+.aiz1s2h
+.ap1s2h
+.at1s2h
+.bez1s2h
+.pār1s2h
+.iz1s2h
+.eks1s2h
+.vis1s2h
+.jā1ž2ņ
+.ne1ž2ņ
+.ie1ž2ņ
+.no1ž2ņ
+.pa1ž2ņ
+.pie1ž2ņ
+.sa1ž2ņ
+.uz1ž2ņ
+.aiz1ž2ņ
+.ap1ž2ņ
+.at1ž2ņ
+.bez1ž2ņ
+.pār1ž2ņ
+.iz1ž2ņ
+.eks1ž2ņ
+.vis1ž2ņ
+.jā1d2d
+.ne1d2d
+.ie1d2d
+.no1d2d
+.pa1d2d
+.pie1d2d
+.sa1d2d
+.uz1d2d
+.aiz1d2d
+.ap1d2d
+.at1d2d
+.bez1d2d
+.pār1d2d
+.iz1d2d
+.eks1d2d
+.vis1d2d
+.jā1š2pr
+.ne1š2pr
+.ie1š2pr
+.no1š2pr
+.pa1š2pr
+.pie1š2pr
+.sa1š2pr
+.uz1š2pr
+.aiz1š2pr
+.ap1š2pr
+.at1š2pr
+.bez1š2pr
+.pār1š2pr
+.iz1š2pr
+.eks1š2pr
+.vis1š2pr
+.jā1v2j
+.ne1v2j
+.ie1v2j
+.no1v2j
+.pa1v2j
+.pie1v2j
+.sa1v2j
+.uz1v2j
+.aiz1v2j
+.ap1v2j
+.at1v2j
+.bez1v2j
+.pār1v2j
+.iz1v2j
+.eks1v2j
+.vis1v2j
+.jā1f2j
+.ne1f2j
+.ie1f2j
+.no1f2j
+.pa1f2j
+.pie1f2j
+.sa1f2j
+.uz1f2j
+.aiz1f2j
+.ap1f2j
+.at1f2j
+.bez1f2j
+.pār1f2j
+.iz1f2j
+.eks1f2j
+.vis1f2j
+.jā1p2j
+.ne1p2j
+.ie1p2j
+.no1p2j
+.pa1p2j
+.pie1p2j
+.sa1p2j
+.uz1p2j
+.aiz1p2j
+.ap1p2j
+.at1p2j
+.bez1p2j
+.pār1p2j
+.iz1p2j
+.eks1p2j
+.vis1p2j
+.jā1b2ļ
+.ne1b2ļ
+.ie1b2ļ
+.no1b2ļ
+.pa1b2ļ
+.pie1b2ļ
+.sa1b2ļ
+.uz1b2ļ
+.aiz1b2ļ
+.ap1b2ļ
+.at1b2ļ
+.bez1b2ļ
+.pār1b2ļ
+.iz1b2ļ
+.eks1b2ļ
+.vis1b2ļ
+.jā1g2n
+.ne1g2n
+.ie1g2n
+.no1g2n
+.pa1g2n
+.pie1g2n
+.sa1g2n
+.uz1g2n
+.aiz1g2n
+.ap1g2n
+.at1g2n
+.bez1g2n
+.pār1g2n
+.iz1g2n
+.eks1g2n
+.vis1g2n
+.jā1h2r
+.ne1h2r
+.ie1h2r
+.no1h2r
+.pa1h2r
+.pie1h2r
+.sa1h2r
+.uz1h2r
+.aiz1h2r
+.ap1h2r
+.at1h2r
+.bez1h2r
+.pār1h2r
+.iz1h2r
+.eks1h2r
+.vis1h2r
+.jā1s2n
+.ne1s2n
+.ie1s2n
+.no1s2n
+.pa1s2n
+.pie1s2n
+.sa1s2n
+.uz1s2n
+.aiz1s2n
+.ap1s2n
+.at1s2n
+.bez1s2n
+.pār1s2n
+.iz1s2n
+.eks1s2n
+.vis1s2n
+.jā1ž2m
+.ne1ž2m
+.ie1ž2m
+.no1ž2m
+.pa1ž2m
+.pie1ž2m
+.sa1ž2m
+.uz1ž2m
+.aiz1ž2m
+.ap1ž2m
+.at1ž2m
+.bez1ž2m
+.pār1ž2m
+.iz1ž2m
+.eks1ž2m
+.vis1ž2m
+.jā1d2ž
+.ne1d2ž
+.ie1d2ž
+.no1d2ž
+.pa1d2ž
+.pie1d2ž
+.sa1d2ž
+.uz1d2ž
+.aiz1d2ž
+.ap1d2ž
+.at1d2ž
+.bez1d2ž
+.pār1d2ž
+.iz1d2ž
+.eks1d2ž
+.vis1d2ž
+.jā1k2c
+.ne1k2c
+.ie1k2c
+.no1k2c
+.pa1k2c
+.pie1k2c
+.sa1k2c
+.uz1k2c
+.aiz1k2c
+.ap1k2c
+.at1k2c
+.bez1k2c
+.pār1k2c
+.iz1k2c
+.eks1k2c
+.vis1k2c
+.jā1k2ņ
+.ne1k2ņ
+.ie1k2ņ
+.no1k2ņ
+.pa1k2ņ
+.pie1k2ņ
+.sa1k2ņ
+.uz1k2ņ
+.aiz1k2ņ
+.ap1k2ņ
+.at1k2ņ
+.bez1k2ņ
+.pār1k2ņ
+.iz1k2ņ
+.eks1k2ņ
+.vis1k2ņ
+.jā1š2m
+.ne1š2m
+.ie1š2m
+.no1š2m
+.pa1š2m
+.pie1š2m
+.sa1š2m
+.uz1š2m
+.aiz1š2m
+.ap1š2m
+.at1š2m
+.bez1š2m
+.pār1š2m
+.iz1š2m
+.eks1š2m
+.vis1š2m
+.jā1g2v
+.ne1g2v
+.ie1g2v
+.no1g2v
+.pa1g2v
+.pie1g2v
+.sa1g2v
+.uz1g2v
+.aiz1g2v
+.ap1g2v
+.at1g2v
+.bez1g2v
+.pār1g2v
+.iz1g2v
+.eks1g2v
+.vis1g2v
+.jā1h2l
+.ne1h2l
+.ie1h2l
+.no1h2l
+.pa1h2l
+.pie1h2l
+.sa1h2l
+.uz1h2l
+.aiz1h2l
+.ap1h2l
+.at1h2l
+.bez1h2l
+.pār1h2l
+.iz1h2l
+.eks1h2l
+.vis1h2l
+.jā1k2ļ
+.ne1k2ļ
+.ie1k2ļ
+.no1k2ļ
+.pa1k2ļ
+.pie1k2ļ
+.sa1k2ļ
+.uz1k2ļ
+.aiz1k2ļ
+.ap1k2ļ
+.at1k2ļ
+.bez1k2ļ
+.pār1k2ļ
+.iz1k2ļ
+.eks1k2ļ
+.vis1k2ļ
+.jā1s2l
+.ne1s2l
+.ie1s2l
+.no1s2l
+.pa1s2l
+.pie1s2l
+.sa1s2l
+.uz1s2l
+.aiz1s2l
+.ap1s2l
+.at1s2l
+.bez1s2l
+.pār1s2l
+.iz1s2l
+.eks1s2l
+.vis1s2l
+.jā1t2v
+.ne1t2v
+.ie1t2v
+.no1t2v
+.pa1t2v
+.pie1t2v
+.sa1t2v
+.uz1t2v
+.aiz1t2v
+.ap1t2v
+.at1t2v
+.bez1t2v
+.pār1t2v
+.iz1t2v
+.eks1t2v
+.vis1t2v
+.jā1š2ņ
+.ne1š2ņ
+.ie1š2ņ
+.no1š2ņ
+.pa1š2ņ
+.pie1š2ņ
+.sa1š2ņ
+.uz1š2ņ
+.aiz1š2ņ
+.ap1š2ņ
+.at1š2ņ
+.bez1š2ņ
+.pār1š2ņ
+.iz1š2ņ
+.eks1š2ņ
+.vis1š2ņ
+.jā1š2p
+.ne1š2p
+.ie1š2p
+.no1š2p
+.pa1š2p
+.pie1š2p
+.sa1š2p
+.uz1š2p
+.aiz1š2p
+.ap1š2p
+.at1š2p
+.bez1š2p
+.pār1š2p
+.iz1š2p
+.eks1š2p
+.vis1š2p
+.jā1d2z
+.ne1d2z
+.ie1d2z
+.no1d2z
+.pa1d2z
+.pie1d2z
+.sa1d2z
+.uz1d2z
+.aiz1d2z
+.ap1d2z
+.at1d2z
+.bez1d2z
+.pār1d2z
+.iz1d2z
+.eks1d2z
+.vis1d2z
+.jā1f2l
+.ne1f2l
+.ie1f2l
+.no1f2l
+.pa1f2l
+.pie1f2l
+.sa1f2l
+.uz1f2l
+.aiz1f2l
+.ap1f2l
+.at1f2l
+.bez1f2l
+.pār1f2l
+.iz1f2l
+.eks1f2l
+.vis1f2l
+.jā1k2n
+.ne1k2n
+.ie1k2n
+.no1k2n
+.pa1k2n
+.pie1k2n
+.sa1k2n
+.uz1k2n
+.aiz1k2n
+.ap1k2n
+.at1k2n
+.bez1k2n
+.pār1k2n
+.iz1k2n
+.eks1k2n
+.vis1k2n
+.jā1p2ļ
+.ne1p2ļ
+.ie1p2ļ
+.no1p2ļ
+.pa1p2ļ
+.pie1p2ļ
+.sa1p2ļ
+.uz1p2ļ
+.aiz1p2ļ
+.ap1p2ļ
+.at1p2ļ
+.bez1p2ļ
+.pār1p2ļ
+.iz1p2ļ
+.eks1p2ļ
+.vis1p2ļ
+.jā1s2pļ
+.ne1s2pļ
+.ie1s2pļ
+.no1s2pļ
+.pa1s2pļ
+.pie1s2pļ
+.sa1s2pļ
+.uz1s2pļ
+.aiz1s2pļ
+.ap1s2pļ
+.at1s2pļ
+.bez1s2pļ
+.pār1s2pļ
+.iz1s2pļ
+.eks1s2pļ
+.vis1s2pļ
+.jā1s2kl
+.ne1s2kl
+.ie1s2kl
+.no1s2kl
+.pa1s2kl
+.pie1s2kl
+.sa1s2kl
+.uz1s2kl
+.aiz1s2kl
+.ap1s2kl
+.at1s2kl
+.bez1s2kl
+.pār1s2kl
+.iz1s2kl
+.eks1s2kl
+.vis1s2kl
+.jā1k2b
+.ne1k2b
+.ie1k2b
+.no1k2b
+.pa1k2b
+.pie1k2b
+.sa1k2b
+.uz1k2b
+.aiz1k2b
+.ap1k2b
+.at1k2b
+.bez1k2b
+.pār1k2b
+.iz1k2b
+.eks1k2b
+.vis1k2b
+.jā1s2m
+.ne1s2m
+.ie1s2m
+.no1s2m
+.pa1s2m
+.pie1s2m
+.sa1s2m
+.uz1s2m
+.aiz1s2m
+.ap1s2m
+.at1s2m
+.bez1s2m
+.pār1s2m
+.iz1s2m
+.eks1s2m
+.vis1s2m
+.jā1m2n
+.ne1m2n
+.ie1m2n
+.no1m2n
+.pa1m2n
+.pie1m2n
+.sa1m2n
+.uz1m2n
+.aiz1m2n
+.ap1m2n
+.at1m2n
+.bez1m2n
+.pār1m2n
+.iz1m2n
+.eks1m2n
+.vis1m2n
+.jā1š2n
+.ne1š2n
+.ie1š2n
+.no1š2n
+.pa1š2n
+.pie1š2n
+.sa1š2n
+.uz1š2n
+.aiz1š2n
+.ap1š2n
+.at1š2n
+.bez1š2n
+.pār1š2n
+.iz1š2n
+.eks1š2n
+.vis1š2n
+.jā1v2r
+.ne1v2r
+.ie1v2r
+.no1v2r
+.pa1v2r
+.pie1v2r
+.sa1v2r
+.uz1v2r
+.aiz1v2r
+.ap1v2r
+.at1v2r
+.bez1v2r
+.pār1v2r
+.iz1v2r
+.eks1v2r
+.vis1v2r
+.jā1b2l
+.ne1b2l
+.ie1b2l
+.no1b2l
+.pa1b2l
+.pie1b2l
+.sa1b2l
+.uz1b2l
+.aiz1b2l
+.ap1b2l
+.at1b2l
+.bez1b2l
+.pār1b2l
+.iz1b2l
+.eks1b2l
+.vis1b2l
+2b3dams.
+2c3dams.
+2č3dams.
+2d3dams.
+2f3dams.
+2g3dams.
+2ģ3dams.
+2h3dams.
+2j3dams.
+2k3dams.
+2ķ3dams.
+2l3dams.
+2ļ3dams.
+2m3dams.
+2n3dams.
+2ņ3dams.
+2p3dams.
+2r3dams.
+2s3dams.
+2š3dams.
+2t3dams.
+2v3dams.
+2z3dams.
+2ž3dams.
+2b3da3ma.
+2c3da3ma.
+2č3da3ma.
+2d3da3ma.
+2f3da3ma.
+2g3da3ma.
+2ģ3da3ma.
+2h3da3ma.
+2j3da3ma.
+2k3da3ma.
+2ķ3da3ma.
+2l3da3ma.
+2ļ3da3ma.
+2m3da3ma.
+2n3da3ma.
+2ņ3da3ma.
+2p3da3ma.
+2r3da3ma.
+2s3da3ma.
+2š3da3ma.
+2t3da3ma.
+2v3da3ma.
+2z3da3ma.
+2ž3da3ma.
+2b3da3mies.
+2c3da3mies.
+2č3da3mies.
+2d3da3mies.
+2f3da3mies.
+2g3da3mies.
+2ģ3da3mies.
+2h3da3mies.
+2j3da3mies.
+2k3da3mies.
+2ķ3da3mies.
+2l3da3mies.
+2ļ3da3mies.
+2m3da3mies.
+2n3da3mies.
+2ņ3da3mies.
+2p3da3mies.
+2r3da3mies.
+2s3da3mies.
+2š3da3mies.
+2t3da3mies.
+2v3da3mies.
+2z3da3mies.
+2ž3da3mies.
+2b3da3mās.
+2c3da3mās.
+2č3da3mās.
+2d3da3mās.
+2f3da3mās.
+2g3da3mās.
+2ģ3da3mās.
+2h3da3mās.
+2j3da3mās.
+2k3da3mās.
+2ķ3da3mās.
+2l3da3mās.
+2ļ3da3mās.
+2m3da3mās.
+2n3da3mās.
+2ņ3da3mās.
+2p3da3mās.
+2r3da3mās.
+2s3da3mās.
+2š3da3mās.
+2t3da3mās.
+2v3da3mās.
+2z3da3mās.
+2ž3da3mās.
+2b3gans.
+2c3gans.
+2č3gans.
+2d3gans.
+2f3gans.
+2g3gans.
+2ģ3gans.
+2h3gans.
+2j3gans.
+2k3gans.
+2ķ3gans.
+2l3gans.
+2ļ3gans.
+2m3gans.
+2n3gans.
+2ņ3gans.
+2p3gans.
+2r3gans.
+2s3gans.
+2š3gans.
+2t3gans.
+2v3gans.
+2z3gans.
+2ž3gans.
+2b3ga3na.
+2c3ga3na.
+2č3ga3na.
+2d3ga3na.
+2f3ga3na.
+2g3ga3na.
+2ģ3ga3na.
+2h3ga3na.
+2j3ga3na.
+2k3ga3na.
+2ķ3ga3na.
+2l3ga3na.
+2ļ3ga3na.
+2m3ga3na.
+2n3ga3na.
+2ņ3ga3na.
+2p3ga3na.
+2r3ga3na.
+2s3ga3na.
+2š3ga3na.
+2t3ga3na.
+2v3ga3na.
+2z3ga3na.
+2ž3ga3na.
+2b3nieks.
+2c3nieks.
+2č3nieks.
+2d3nieks.
+2f3nieks.
+2g3nieks.
+2ģ3nieks.
+2h3nieks.
+2j3nieks.
+2k3nieks.
+2ķ3nieks.
+2l3nieks.
+2ļ3nieks.
+2m3nieks.
+2n3nieks.
+2ņ3nieks.
+2p3nieks.
+2r3nieks.
+2s3nieks.
+2š3nieks.
+2t3nieks.
+2v3nieks.
+2z3nieks.
+2ž3nieks.
+2b3nie3ce.
+2c3nie3ce.
+2č3nie3ce.
+2d3nie3ce.
+2f3nie3ce.
+2g3nie3ce.
+2ģ3nie3ce.
+2h3nie3ce.
+2j3nie3ce.
+2k3nie3ce.
+2ķ3nie3ce.
+2l3nie3ce.
+2ļ3nie3ce.
+2m3nie3ce.
+2n3nie3ce.
+2ņ3nie3ce.
+2p3nie3ce.
+2r3nie3ce.
+2s3nie3ce.
+2š3nie3ce.
+2t3nie3ce.
+2v3nie3ce.
+2z3nie3ce.
+2ž3nie3ce.
+2b3nī3ca.
+2c3nī3ca.
+2č3nī3ca.
+2d3nī3ca.
+2f3nī3ca.
+2g3nī3ca.
+2ģ3nī3ca.
+2h3nī3ca.
+2j3nī3ca.
+2k3nī3ca.
+2ķ3nī3ca.
+2l3nī3ca.
+2ļ3nī3ca.
+2m3nī3ca.
+2n3nī3ca.
+2ņ3nī3ca.
+2p3nī3ca.
+2r3nī3ca.
+2s3nī3ca.
+2š3nī3ca.
+2t3nī3ca.
+2v3nī3ca.
+2z3nī3ca.
+2ž3nī3ca.
+2b3ša3na.
+2c3ša3na.
+2č3ša3na.
+2d3ša3na.
+2f3ša3na.
+2g3ša3na.
+2ģ3ša3na.
+2h3ša3na.
+2j3ša3na.
+2k3ša3na.
+2ķ3ša3na.
+2l3ša3na.
+2ļ3ša3na.
+2m3ša3na.
+2n3ša3na.
+2ņ3ša3na.
+2p3ša3na.
+2r3ša3na.
+2s3ša3na.
+2š3ša3na.
+2t3ša3na.
+2v3ša3na.
+2z3ša3na.
+2ž3ša3na.
+2b3ša3nās.
+2c3ša3nās.
+2č3ša3nās.
+2d3ša3nās.
+2f3ša3nās.
+2g3ša3nās.
+2ģ3ša3nās.
+2h3ša3nās.
+2j3ša3nās.
+2k3ša3nās.
+2ķ3ša3nās.
+2l3ša3nās.
+2ļ3ša3nās.
+2m3ša3nās.
+2n3ša3nās.
+2ņ3ša3nās.
+2p3ša3nās.
+2r3ša3nās.
+2s3ša3nās.
+2š3ša3nās.
+2t3ša3nās.
+2v3ša3nās.
+2z3ša3nās.
+2ž3ša3nās.
+2b3ta3la.
+2c3ta3la.
+2č3ta3la.
+2d3ta3la.
+2f3ta3la.
+2g3ta3la.
+2ģ3ta3la.
+2h3ta3la.
+2j3ta3la.
+2k3ta3la.
+2ķ3ta3la.
+2l3ta3la.
+2ļ3ta3la.
+2m3ta3la.
+2n3ta3la.
+2ņ3ta3la.
+2p3ta3la.
+2r3ta3la.
+2s3ta3la.
+2š3ta3la.
+2t3ta3la.
+2v3ta3la.
+2z3ta3la.
+2ž3ta3la.
+2b3tu3ve.
+2c3tu3ve.
+2č3tu3ve.
+2d3tu3ve.
+2f3tu3ve.
+2g3tu3ve.
+2ģ3tu3ve.
+2h3tu3ve.
+2j3tu3ve.
+2k3tu3ve.
+2ķ3tu3ve.
+2l3tu3ve.
+2ļ3tu3ve.
+2m3tu3ve.
+2n3tu3ve.
+2ņ3tu3ve.
+2p3tu3ve.
+2r3tu3ve.
+2s3tu3ve.
+2š3tu3ve.
+2t3tu3ve.
+2v3tu3ve.
+2z3tu3ve.
+2ž3tu3ve.
+.jā3a2
+.ne3a2
+.ie3a2
+.no3a2
+.pa3a2
+.pie3a2
+.sa3a2
+.uz3a2
+.aiz3a2
+.ap3a2
+.at3a2
+.bez3a2
+.pār3a2
+.iz3a2
+.eks3a2
+.vis3a2
+.jā3ā2
+.ne3ā2
+.ie3ā2
+.no3ā2
+.pa3ā2
+.pie3ā2
+.sa3ā2
+.uz3ā2
+.aiz3ā2
+.ap3ā2
+.at3ā2
+.bez3ā2
+.pār3ā2
+.iz3ā2
+.eks3ā2
+.vis3ā2
+.jā3e2
+.ne3e2
+.ie3e2
+.no3e2
+.pa3e2
+.pie3e2
+.sa3e2
+.uz3e2
+.aiz3e2
+.ap3e2
+.at3e2
+.bez3e2
+.pār3e2
+.iz3e2
+.eks3e2
+.vis3e2
+.jā3ē2
+.ne3ē2
+.ie3ē2
+.no3ē2
+.pa3ē2
+.pie3ē2
+.sa3ē2
+.uz3ē2
+.aiz3ē2
+.ap3ē2
+.at3ē2
+.bez3ē2
+.pār3ē2
+.iz3ē2
+.eks3ē2
+.vis3ē2
+.jā3i2
+.ne3i2
+.ie3i2
+.no3i2
+.pa3i2
+.pie3i2
+.sa3i2
+.uz3i2
+.aiz3i2
+.ap3i2
+.at3i2
+.bez3i2
+.pār3i2
+.iz3i2
+.eks3i2
+.vis3i2
+.jā3ī2
+.ne3ī2
+.ie3ī2
+.no3ī2
+.pa3ī2
+.pie3ī2
+.sa3ī2
+.uz3ī2
+.aiz3ī2
+.ap3ī2
+.at3ī2
+.bez3ī2
+.pār3ī2
+.iz3ī2
+.eks3ī2
+.vis3ī2
+.jā3o2
+.ne3o2
+.ie3o2
+.no3o2
+.pa3o2
+.pie3o2
+.sa3o2
+.uz3o2
+.aiz3o2
+.ap3o2
+.at3o2
+.bez3o2
+.pār3o2
+.iz3o2
+.eks3o2
+.vis3o2
+.jā3u2
+.ne3u2
+.ie3u2
+.no3u2
+.pa3u2
+.pie3u2
+.sa3u2
+.uz3u2
+.aiz3u2
+.ap3u2
+.at3u2
+.bez3u2
+.pār3u2
+.iz3u2
+.eks3u2
+.vis3u2
+.jā3ū2
+.ne3ū2
+.ie3ū2
+.no3ū2
+.pa3ū2
+.pie3ū2
+.sa3ū2
+.uz3ū2
+.aiz3ū2
+.ap3ū2
+.at3ū2
+.bez3ū2
+.pār3ū2
+.iz3ū2
+.eks3ū2
+.vis3ū2
+.jā3ie1
+.jā3iz1
+.jā3no1
+.ne3aiz1
+.ne3ap1
+.ne3ie1
+.ne3at1
+.ne3in1
+.ne3iz1
+.ne3sa
+.ne3uz1
+.priek2š1
+4d5ze1me
+.tur2p1m
+il2k1tie
+.spil2g1t
+mē1ne2š1
+1pa1d2smit
+g2š1gal
+k2š1gal
+tran2s
+1port
+vēs2t1n
+vēs2t1k
+pa2t3stā
+pa2s2t3k
+pa2s2t3m
+pa2s2t2s.
+pa2r2k2s.
+pa2r3ket
+sa2ls.
+sa2lds.
+sa2l2d1
+pir2m1r
+pir2m1k
+pir2m2s1
+ot2r1r2
+ot2r1k2
+ir2k3l
+ir2k3ļ
+.adā2m3
+.ai4z5
+ak3me4ņ3
+apak2š3
+ap1au
+kār2t3n
+aug2s2t3
+.at3e2j
+bal2t3ma
+.vie2n1} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-lv.rme b/Master/texmf-dist/tex/context/patterns/lang-lv.rme
new file mode 100644
index 00000000000..3f5b4e02100
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-lv.rme
@@ -0,0 +1,19 @@
+% generated by mtxrun --script pattern --convert
+
+Latvian Hyphenation Patterns
+
+(more info about the licence to be added later)
+
+% This file is part if hyph-utf8 package and resulted from semi-manual
+% conversions of hyphenation patterns into UTF-8 in November 2008 by Mojca &
+% Arthur.
+%
+% This file is available under the term of the GNU GPL, version 2.
+%
+% Source: Latvian Lingucomponents for OpenOffice
+% Homepage: http://sourceforge.net/projects/openoffice-lv
+% File: hyph_lv_lv.dic (version 0.3, 2005-09-14)
+% Author: Copyright (C) 2004-2005 Janis Vilims, jvilims@apollo.lv
+% License: Lesser General Public Licence (LGPL) 2.1
+%
+
diff --git a/Master/texmf-dist/tex/context/patterns/lang-mn.lua b/Master/texmf-dist/tex/context/patterns/lang-mn.lua
new file mode 100644
index 00000000000..363637cbb76
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-mn.lua
@@ -0,0 +1,107 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="mn",
+ ["source"]="hyph-mn-cyrl",
+ ["texcomment"]="% (New) Mongolian Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: mnhyphn.tex (2008-03-30)\
+% Author: Dorjgotov Batmunkh <bataak at gmail.com>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+%% mnhyphn.tex v1.2 2008/03/23 (2010/04/03)\
+%% Copyright 2007-2010 by Dorjgotov Batmunkh, National University of Mongolia\
+%% email bataak@gmail.com\
+%\
+% This work may be distributed and/or modified under the\
+% conditions of the LaTeX Project Public License, either version 1.3\
+% of this license or (at your option) any later version.\
+% The latest version of this license is in\
+% http://www.latex-project.org/lppl.txt\
+% and version 1.3 or later is part of all distributions of LaTeX\
+% version 2005/12/01 or later.\
+%\
+% Special thanks to: Jim Hefferon and Robin Fairbairns\
+%\
+% There are few basic rules in mongolian\
+%\
+% 1. If there is a consonant then it can use hyphen before it.\
+% And if there're two consonants then it can use hyphen before second consonant.\
+% Are there three consonants then it can put hyphen before third consonant,\
+% also are there four consonants then it can use hyphen before fourth consonant.\
+% 2. In the case of hardsign or softsign, it's possible to hyphen after these signs.\
+% For instance, байгуулъ-я, үзүүль-е\
+% 3. However one vowel can be belong to a syllable, it's not possible to use hyphen.\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="абвгдежзийклмнопрстуфхцчшщъыьэюяёүө",
+ ["data"]="1ба 1бе 1бё 1би 1бо 1бө 1бу 1бү 1бы 1бь2ю 1бэ 1бю 1бя 1ва 1ве 1вё 1ви 1во 1вө 1ву 1вү 1вы 1вь2ю 1вэ 1вю 1вя 1га 1ге 1гё 1ги 1го 1гө 1гу 1гү 1гы 1гь2ю 1гэ 1гю 1гя 1да 1де 1дё 1ди 1до 1дө 1ду 1дү 1ды 1дь2ю 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ю 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мё 1ми 1мо 1мө 1му 1мү 1мы 1мэ 1мю 1мя 1на 1не 1нё 1ни 1но 1нө 1ну 1нү 1ны 1нь2ю 1нэ 1ню 1ня 1па 1пе 1пё 1пи 1по 1пө 1пу 1пү 1пы 1пь2ю 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та 1те 1тё 1ти 1то 1тө 1ту 1тү 1ты 1ть2ю 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цё 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шү 1шэ 1шю 1шя 1ща 1ще 1щи 1щу 2а1я 2аа 2б3ю4у 2б3ю4ү 2в3ю4у 2в3ю4ү 2г3ю4у 2г3ю4ү 2д3ю4у 2д3ю4ү 2ж3ю4у 2ж3ю4ү 2з3ю4у 2з3ю4ү 2и1е 2й1е 2й1ё 2й1ю 2й1я 2л3ю4у 2л3ю4ү 2м3ю4у 2м3ю4ү 2н3ю4у 2н3ю4ү 2о1е 2о1ё 2о1я 2оо 2ө1е 2өө 2п3ю4у 2п3ю4ү 2р3ю4у 2р3ю4ү 2с3ю4у 2с3ю4ү 2т3ю4у 2т3ю4ү 2у1я 2у3ю 2уу 2үү 2х3ю4у 2х3ю4ү 2ц3ю4у 2ц3ю4ү 2ч3ю4у 2ч3ю4ү 2ш3ю4у 2ш3ю4ү 2ъ3е 2ъ3ё 2ъ3ю 2ъ3я 2ь3е 2ь3ё 2ь3я 2э3е 2ээ 2ю3а 2ю3и 2ю3о .авто3а4г .авто3а4д .авто3а4к .авто3а4л .авто3а4н .авто3а4с .авто3б4л .авто3б4р .авто3в4в .авто3в4л .авто3г4р .авто3д4р .авто3и4м .авто3и4н .авто3и4о .авто3к4л .авто3к4р .авто3о4б .авто3о4к .авто3о4п .авто3о4т .авто3п4р .авто3с4к .авто3с4л .авто3с4м .авто3с4п .авто3с4т .авто3с4ц .авто3т4р .авто3ф4л .авто3ф4р .авто3х4р .авто3х4т .авто3ц4в .авто3э4к .авто3э4л .авто3э4м .авто3э4п .анти3а4в .анти3а4д .анти3а4л .анти3а4н .анти3а4п .анти3а4р .анти3а4с .анти3а4т .анти3а4у .анти3б4л .анти3г4л .анти3г4р .анти3д4р .анти3и4д .анти3и4з .анти3и4м .анти3и4н .анти3к4в .анти3к4л .анти3о4б .анти3о4з .анти3о4к .анти3п4л .анти3п4н .анти3п4р .анти3п4с .анти3с4в .анти3с4к .анти3с4т .анти3с4ц .анти3т4р .анти3у4з .анти3у4р .анти3у4т .анти3ф4л .анти3ф4р .анти3х4л .анти3х4р .анти3э4м .анти3э4н .анти3э4р .астро3б4л .астро3г4л .астро3г4р .астро3и4н .астро3о4р .астро3с4п .астро3ш4т .аэро3д4р .аэро3к4л .аэро3п4л .аэро3с4т .аэро3ф4л .би3а4к .би3а4л .би3а4ф .би3к4в .би3к4р .би3о4р .би3п4р .би3э4к .био3а4к .био3а4н .био3а4п .био3а4с .био3б4л .био3г4р .био3и4н .био3к4л .био3к4р .био3о4р .био3п4л .био3п4р .био3с4к .био3с4п .био3с4т .био3с4ф .био3х4р .био3э4к .био3э4л .био3э4н .био3э4т .бь4 .въ4 .вь4 .газо3а4б .газо3а4д .газо3а4н .газо3а4п .гео3а4к .гео3б4л .гео3г4р .гео3и4з .гео3и4н .гео3к4р .гео3с4к .гео3с4т .гео3с4ф .гео3т4р .гео3ф4л .гео3х4р .гео3э4к .гео3э4л .гидро3а4б .гидро3а4в .гидро3а4г .гидро3а4д .гидро3а4к .гидро3а4л .гидро3а4м .гидро3а4р .гидро3а4э .гидро3г4р .гидро3и4з .гидро3и4н .гидро3и4о .гидро3к4л .гидро3к4р .гидро3о4к .гидро3п4л .гидро3п4н .гидро3с4т .гидро3с4ф .гидро3т4р .гидро3у4д .гидро3у4з .гидро3у4р .гидро3х4л .гидро3э4к .гидро3э4л .гидро3э4н .гипе2р3а4д .гипе2р3а4з .гипе2р3а4к .гипе2р3а4л .гипе2р3а4м .гипе2р3а4р .гипе2р3а4ц .гипе2р3а4э .гипе2р3е4а .гипе2р3е4м .гипе2р3е4р .гипе2р3е4с .гипе2р3и4з .гипе2р3и4м .гипе2р3и4н .гипе2р3о4в .гипе2р3о4к .гипе2р3о4с .гипер3б4р .гипер3г4л .гипер3г4р .гипер3к4в .гипер3к4р .гипер3м4н .гипер3п4л .гипер3п4н .гипер3п4р .гипер3с4п .гипер3с4р .гипер3с4с .гипер3с4т .гипер3т4р .гипер3у4р .гипер3ф4р .гипер3х4л .гипер3х4р .гипер3э4к .гипер3э4л .гипер3э4н .гипер3э4о .гипер3э4с .голо3б4л .голо3э4д .гомо3а4з .гомо3а4к .гомо3а4т .гомо3к4л .гомо3п4л .гомо3с4п .гомо3т4р .гомо3ф4т .гомо3э4н .гомо3э4п .гь4 .ди1а3г4н .ди4ст5ри .ди4ст5ро .диа3д4р .диа3к4л .диа3к4р .диа3с4к .диа3с4п .диа3с4т .диа3т4р .диа3ф4р .диазо3т4р .диазо3э4т .диазо3э4ф .дина3т4р .дь4 .евро3а4з .евро3а4т .евро3и4е .евро3к4р .евро3о4б .евро3с4п .евро3с4т .изо3а4в .изо3а4г .изо3а4д .изо3а4з .изо3а4к .изо3а4л .изо3а4м .изо3а4н .изо3б4р .изо3в4р .изо3г4л .изо3г4р .изо3д4р .изо3и4о .изо3й4о .изо3к4л .изо3к4р .изо3л4г .изо3л4ж .изо3о4к .изо3п4л .изо3п4р .изо3с4т .изо3т4к .изо3т4р .изо3х4р .изо3ш4л .изо3э4в .изо3э4д .изо3э4й .изо3э4л .изо3э4н .ин3а4кт .ин3а4п .ин3а4у .ин3б4р .ин3г4р .ин3к4л .ин3к4р .ин3с4тр .инте2р3а4к .интер3г4р .интер3к4в .интер3к4р .интер3п4р .интер3ф4л .кило3а4м .кило3г4р .кило3э4л .кино3а4к .кино3а4н .кино3а4п .кино3а4ф .кино3б4л .кино3д4р .кино3и4с .кино3к4л .кино3к4р .кино3о4п .кино3п4л .кино3п4р .кино3с4к .кино3с4ъ .кино3ф4л .кино3ф4р .кино3х4р .кино3э4к .ко3а4г .ко3а4д .ко3а4к .ко3и4н .ко3о4п .ко3о4р .ко3п4л .ко3э4ф .кь4 .ль4 .макро3а4н .макро3а4с .макро3б4л .макро3б4р .макро3г4л .макро3г4н .макро3г4р .макро3и4н .макро3и4с .макро3к4л .макро3к4р .макро3о4в .макро3о4п .макро3о4р .макро3п4л .макро3п4р .макро3с4к .макро3с4п .макро3с4т .макро3с4х .макро3т4р .макро3ф4л .макро3ф4т .макро3э4в .макро3э4к .макро3э4л .макро3э4н .макро3э4р .макро3э4с .мега3о4м .мега3п4р .мега3с4к .мега3с4п .мега3э4л .микро3а4в .микро3а4г .микро3а4д .микро3а4м .микро3а4н .микро3а4р .микро3а4с .микро3а4у .микро3а4э .микро3б4л .микро3б4р .микро3г4р .микро3д4в .микро3и4з .микро3и4н .микро3и4с .микро3й4о .микро3к4л .микро3к4н .микро3к4р .микро3о4б .микро3о4п .микро3о4р .микро3о4с .микро3п4л .микро3п4р .микро3с4к .микро3с4п .микро3с4т .микро3с4ф .микро3с4х .микро3т4р .микро3ф4л .микро3х4р .микро3э4в .микро3э4л .микро3э4м .микро3э4н .микро3э4р .милли3а4м .милли3г4р .милли3о4м .милли3э4к .моно3а4в .моно3а4з .моно3а4л .моно3а4м .моно3а4н .моно3а4р .моно3а4т .моно3а4ц .моно3б4л .моно3б4р .моно3г4л .моно3г4р .моно3и4з .моно3и4м .моно3и4н .моно3к4л .моно3к4р .моно3о4к .моно3о4л .моно3п4л .моно3п4р .моно3п4с .моно3с4п .моно3с4т .моно3т4р .моно3ф4т .моно3х4л .моно3х4р .моно3э4д .моно3э4н .моно3э4п .моно3э4т .моно3э4ф .мото3д4р .мото3к4р .мото3п4л .мото3п4р .мото3с4п .мото3ш4л .мь4 .на3у .нано3а4д .нано3п4р .нео3а4д .нео3а4н .нео3а4р .нео3б4л .нео3г4л .нео3г4н .нео3г4р .нео3и4з .нео3и4м .нео3и4н .нео3к4л .нео3к4р .нео3п4л .нео3п4р .нео3х4р .нео3э4з .нео3э4н .нео3э4п .нео3э4с .нь4 .орто3а4л .орто3а4м .орто3а4н .орто3а4р .орто3д4р .орто3и4з .орто3к4р .орто3п4л .орто3п4р .орто3п4с .орто3с4в .орто3с4к .орто3с4т .орто3т4р .орто3х4л .орто3х4р .орто3э4т .орто3э4ф .пара3а4к .пара3а4л .пара3а4м .пара3а4н .пара3а4п .пара3а4ц .пара3б4л .пара3г4н .пара3г4р .пара3к4л .пара3к4р .пара3о4к .пара3п4л .пара3п4с .пара3с4п .пара3с4ф .пара3с4ц .пара3т4р .пара3х4л .пара3х4р .пара3э4л .пара3э4т .паро3п4р .поли3а4в .поли3а4д .поли3а4з .поли3а4к .поли3а4л .поли3а4м .поли3а4н .поли3а4р .поли3а4ц .поли3б4р .поли3г4л .поли3г4р .поли3и4з .поли3и4м .поли3к4л .поли3к4р .поли3о4к .поли3о4л .поли3п4л .поли3п4н .поли3п4р .поли3с4п .поли3с4т .поли3у4р .поли3х4л .поли3х4р .поли3э4д .поли3э4к .поли3э4л .поли3э4н .поли3э4т .поли3э4ф .пре3э4к .пре3ю4д .про3а4г .про3а4к .про3а4м .про3а4н .про3а4у .про3г4р .про3и4г .про3и4з .про3и4л .про3и4н .про3к4л .про3с4п .про3х4р .про3э4к .про3э4м .про3э4н .про3э4р .про3э4с .прото3х4л .прото3х4р .прото3э4р .проф3г4р .пъ4 .пь4 .ре3а4б .ре3а4г .ре3а4д .ре3а4к .ре3а4с .ре3а4ф .ре3а4э .ре3г4р .ре3и4м .ре3и4н .ре3и4ф .ре3к4р .ре3п4р .ре3т4ра .ретро3а4к .ретро3а4у .ретро3г4р .ретро3о4т .ретро3ф4л .санти3г4р .стерео3а4д .стерео3а4к .стерео3б4л .стерео3г4р .стерео3и4з .стерео3с4к .стерео3с4п .стерео3т4р .стерео3э4л .стерео3э4н .стерео3э4ф .супер3а4г .супер3а4д .супер3а4к .супер3а4н .супер3а4р .супер3а4э .супер3г4р .супер3е4с .супер3и4з .супер3и4к .супер3и4м .супер3и4н .супер3к4л .супер3п4р .супер3с4к .супер3с4п .супер3с4т .супер3х4р .супер3э4в .супер3э4к .супер3э4ф .съ4 .сь4 .ть4 .фь4 .хризо3и4д .хризо3п4р .хризо3с4т .хь4 .элек3тро .элек3тро3а4в .элек3тро3а4г .элек3тро3а4к .элек3тро3а4н .элек3тро3а4э .элек3тро3б4л .элек3тро3и4з .элек3тро3и4с .элек3тро3о4б .элек3тро3о4в .элек3тро3о4г .элек3тро3о4д .элек3тро3о4к .элек3тро3о4п .элек3тро3о4с .элек3тро3о4т .элек3тро3о4ф .элек3тро3о4ч .элек3тро3с4т .элек3тро3т4р .элек3тро3э4к .элек3тро3э4н .элек3тро3э4р 3авто 3актив 3аппа 3г4рад 3г4рам 3г4раф 3им4пул 3ин3ст4ру 3ин3те4р 3к4ва 3к4лас 3к4ри 3оп3тик 3п3роек 3п4ро 3с4коп 3с4фе 3с4хе 3ск4ла 3ск4ле 3ск4ло 3ск4ля 3ск4ра 3ск4ре 3ск4ри 3ск4ро 3ск4ру 3ск4ры 3сп4ла 3ст4ра 3ст4ре 3ст4ри 3ст4ро 3ст4рук 3ф4рагм 3х4лор 3х4ром 3ш2таб 3ш2тат 3э4к5ви 3э4ко 3э4лек4т 3э4леме 3э4нерг 3э4нтро 3эффе",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=988,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-mn.rme b/Master/texmf-dist/tex/context/patterns/lang-mn.rme
index 338ec58fc81..c00688f3a23 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-mn.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-mn.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+(New) Mongolian Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -83,4 +87,4 @@
% 2. In the case of hardsign or softsign, it's possible to hyphen after these signs.
% For instance, байгуулъ-я, үзүүль-е
% 3. However one vowel can be belong to a syllable, it's not possible to use hyphen.
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-nb.hyp b/Master/texmf-dist/tex/context/patterns/lang-nb.hyp
index cc740c93010..fabde8319b3 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-nb.hyp
+++ b/Master/texmf-dist/tex/context/patterns/lang-nb.hyp
@@ -2,51 +2,8 @@
% for comment and copyright, see e:/tmp/patterns/lang-nb.rme
-% used: D N S a b c d e f g h i j k l m n o p r s t u v w y z å æ ø ü
+% used: a b d e n r t
\hyphenation{
-atten-de
-aust-røn
-aviser
-betre
-bortan-for
-bortre
-Dansk-øya
-der-etter
-dess-uak-tet
-dit-over
-finger-spitzen-ge-fühl
-finger-spitz-ge-fühl
-fram-ifrå
-før-enn
-her-etter
-her-etter-dags
-hvor-etter
-hvor-over
-høyt-ærede
-gi-vet-vis
-lands-øl
-lands-ølet
-lands-ølets
-langt-ifra
-ned-imot
-noens
-Not-odden
-Not-oddens
-nøye-reg-nen-de
-opp-imot
-oven-ikjøpet
-promp-te
-spleen
-sel-ves-te
-smal-enden
-sørpe-is
-sørpe-isen
-skrov-is
-skrov-isen
-Steins-land
-syd-enden
-tvert-om
-velan
-velet
-welt-schmerz} \ No newline at end of file
+at-ten-de
+be-tre} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-nb.lua b/Master/texmf-dist/tex/context/patterns/lang-nb.lua
new file mode 100644
index 00000000000..60b342ac961
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-nb.lua
@@ -0,0 +1,58 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["characters"]="abdenrt",
+ ["data"]="at-ten-de be-tre",
+ ["n"]=2,
+ },
+ ["metadata"]={
+ ["mnemonic"]="nb",
+ ["source"]="hyph-nb",
+ ["texcomment"]="% Norwegian Bokmal Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% Adapted to the new pattern-loading scheme.\
+% Original file name was nbhyph.tex\
+% \
+% TeX hyphenation patterns for Norwegian Bokmal\
+%\
+% Version 2007-02-10\
+%\
+% Copyright (C) 2007 Karl Ove Hufthammer.\
+% Copying and distribution of this file, with or without modification,\
+% are permitted in any medium without royalty, provided the copyright\
+% notice and this notice are preserved.\
+%\
+% This file contains hyphenation patterns for Norwegian Bokmal.\
+% It uses the Norwegian hyphenation patterns from nohyphbx.tex,\
+% created by Rune Kleveland and Ole Michael Selberg. Please see\
+% that file for copyright information on those patterns.\
+%\
+% The patterns in nohyphbx are based on both Norwegian Bokmal\
+% and Norwegian Nynorsk, and works about equally well for both\
+% languages. This file, nbhyph.tex, contains only a few hyphenation\
+% exceptions, for words that needs to be hyphenated differently for\
+% the two languages.\
+%\
+% Please send bugs or suggestions to karl@huftis.org.\
+%\
+% \
+% \\input hyph-no.tex\
+% \
+% \\hyphenation{\
+% at-ten-de\
+% be-tre\
+% }\
+% \
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyzåæèéêòóôø",
+ ["data"]=".a4 .aa4 .ab4ba .ab7be .ab6s5t .ac6tin .adel4s .ad8la. .ad6le. .ad2r .ad1s2 .af7f .af5t4 .af5f6u .ag6na. .ag6ne. .ag4r .ai2 .a6k .ak6ka. .ak6ke. .ak3kl .ak3kr .ak6ne. .ak6r .ak8sa. .ak4se. .ak6ta .ak4te. .akte4r .akter5e .ak5tr .akva7 .a6l .albu5en .alfa3 .al4ge. .al5gi .al6ka. .al4ke. .al4kom .al4la. .al4le. .al5leg .al5lo .all5s6 .al4ma. .al8me. .al5m6in .al4na .al6s7k .als5o .alt4a .al4ta. .al5tar .al4te. .alt3o .al6ve. .am7b .a6me .am6ma. .am4me. .am4s4 .am6ta .a6n .ana3b .an4da. .an4de. .an5d4ra .an4d5ø .an3er .anes5 .an4ga. .an3ge .an4ge. .ange4s .an4ja. .an4ka. .an4ke. .an4la. .an3n .an4na. .an7nal .ann4e .an4ne. .an5s8 .an4sa. .an4se. .ant2 .an4ta. .an4te. .an5tem .an5tep .an4ti. .an6tin .an4tis .an4tiv .ap8lan .ap1p6 .ap8t .arbi5 .ar6de. .are4o7 .ar4ge. .ar5ges .ari6a .ari8e .arie5ne .ar5ka .ar8ka. .arlan9 .ar4me. .ar7mea .ar4na. .ar3ne .ar4ne. .ar5nes .ar6ra. .ar6r7u .ar6ta. .ar4te. .ar9ti .ar6va. .ar4ve. .ar4ved .ar4ver .arvi6 .a6s .as8ka .as4ke. .as5kese .as4le. .as6pa. .as5s .ast5ru .at4h .at4ki .at4le. .at4na. .at2o4 .at3s .atte4 .att6r .a5ty .au8de .au6e .au8ga .au4ge .au4ka. .au8le. .au4r .au6sa. .au6se. .aus9k .au4sp .avi2 .av7i6d .av7inde .av4la. .av4le. .av7s6 .b6 .ba6by .ba6la. .ba4le. .ba4ne. .ban4k3l .ba4re. .ba4ri. .ba8te. .be4de. .bede4n .be6d5ene .be4d5et .be8di. .be3e4d .be6ke. .be4la. .be9nar .be4ne. .be6ra. .be6re. .be4res .ber6ett .be8ri. .be7ska .be6sten .be4ta. .be6te. .be5t4v .bi6de. .bi6en .bi4le. .bilet5 .bi6t3r .bl4 .bla4d .ble4k3 .ble5k4e .blek4k3f .blekk3s4t6 .blekk9s8v4 .bling5 .bo8da .bo8de. .bogs8 .bok5 .bo4k4en. .bo8la .bon2 .bo4na. .bor6t5 .bort6e .bor8ti8 .bort9r .brudd7s6 .bruddså7 .bu6da. .bu3d6r .bu4et .bus6sy .by6de. .by8ta. .bæ2 .bø6k5a .bø8nen .bø8ner .c4 .ca4en. .car4s5 .ca6se .ce6b .cos1 .co4st .d6 .da4ge. .da4le. .dags6e .da2m .da4ne. .da4ta .dau3s .deka9r .deko7d .de4le. .de4l5ei .del5s6 .de4mi. .demo7e .den5sl .de4re. .de4r5et .de4ri. .de6r3i4 .de7r4i5v .de4r5om .de6s5m .de4so .de4sto .de4u .devi5s .di2a .di5e4l .di6er .di4et. .di9f6t .di4ne. .dings7a .di4sk .di8s3t .do4en .do4er .do8et .dome5 .do4ra .do6re. .drau4m .ds4 .du4a .du4en. .du4er .duft3 .du4ge. .duk3n .du4se. .du4st .dy4re. .dø6la. .dø6r3 .dø7r4a .dø7r4e .dø4ve. .då5ren .då7ret .e6 .eb4ba .ecu6 .ed4da .ed4le. .efo7 .ef4ta .efta5s .ef6ter .eg8de. .ege2 .ege5l .eg6ga. .eg4ge. .eg4gel .eg8la. .eg4le. .eg6na. .eg4ne. .ego7t8 .egs4 .eg8se. .eg5si .ei2 .eid5a .ei5den .ei4ga. .ei7ger .eik5a .ei4ke. .ei3l .ei3m .ei8ma. .ei8me. .ein7as .ei3ni .ein5og5 .ein5s6ta .ein8s7to .ei9rar .ei5res .eir9u .ei5te .eit9r .ekk4o .ek4le. .ek3li .ek6ne. .ek4r .ek8sa. .ek3se .ek8se. .ek4sp .eks6pi .eks3t4 .ek5s4ta .ek8ta .ek4te. .ek7to .el8da. .el4de. .el4g5r .eli5ne .el3k .el5l .el6s .els6a .els4kl .els6t .el6ta. .el6te. .el6veg .em3b2 .emfa9 .em4ma. .em8me. .em6na. .em5p .en5a .en4da. .en4de. .end5r .en4ga. .en6gav .en3ge .en4ge. .en6g5r .engs6 .en6ka .en4ke. .en5og5 .en6sa .en4se. .en5so .en3sp .en5t .en6te. .ent4r .en6t5ra .ent8re .en3ø4 .ep6t .er8a .er4e .er4g5r .er4ke .er4la. .er4le. .er6ma. .er4me. .er4mek .er4na. .er6ta. .er4te. .es9ast .es1k .es3ka .es8ka. .es4ke. .es5l .es8la. .es8le. .es3p .es6pa. .es6r .es8sa. .es4se. .es4so .es5ta .es3te .es6te. .es7tet .es5ti .est3r .es7tu .et8la. .et8le. .et4na .et4ne. .et4s .et8sa. .et5s4e .et6se. .ets4i .et1te4 .et6ter .et6ti .ev8ja .ev4je. .ev4ne. .ex4 .f4 .fa2e .fag3s4 .fa4ne. .fan3t4o .fe4e .feil5i .fe2l .fela9 .fel5l .fel4ta .fe4ma .fe8me .fem5o6g5 .fem5t .fer8ro .fer6s .fe8sl .fe8st5 .fes3t6e .fi4b5 .fi6a .fi4le. .fire5o6g5 .fis6k .fjel4 .fla4t5o .fo4bi. .fol2 .fo2r .for3d6ri .for7d6ra .for5en. .form5s .for7s6o .fre6e .fri5e6re .fug2 .fu6ge. .ful2 .fu8se. .fy8se .fø8rel .g6 .gaf7 .ga4le. .ga8li. .ga4me .ga4ne. .gang5s4 .gas4 .gas5ta .ga2t .ga4ve. .ga9vee .ge2a .gel4e .ge3ne .ge6ni5 .gen5s .ge4o .ge4st .ge5s6tap .ge9sv .gha5 .gift5s .gi4n .gi4s .gis7p .gi8v3a .gl6 .glo6i .glo9v .gly5s .glø9se .gnå7la .go5des .gos7 .gra4v3end .grei4e .grunn5s .grus5s .gu4de. .gud3v4 .gu4lat .gus1 .gu4tu. .gø2 .gås4e5 .gå4v .h4 .hai5s6 .ha6ka. .ha8ma. .hand5s6l .handsla9 .ha6v5ak .ha6vi .he4er. .hei5e .he2n .hen3i2 .he6r5i6 .he6r5o6 .he9r6oe .he7r6oi .he7r6ol .he9r8os .hes4s5 .het6s5 .het7s6e .he4t5 .he5t6e .hil4l .hi4n .hi6re. .ho2d .ho2e .ho4re. .ho5ren .ho7ret .ho8ta. .ho8va. .hu4di .hus6val .hvit3 .hvi3t4e .hy6ra. .hy4re. .høi5 .hø4re .hø4va .hø4ve. .høy6st5æ .hå8en. .hå8er .hånd5s6l .i2 .i3a4 .i3bl .i4da .ifø5re .ig8la. .ig4le. .i4her .ik2 .ik6k .ikke5 .i3k6l .ik5t .ik8te. .i5kv .i3la .i4la. .i8lande .ilbo8da .il6d3r .il6de. .i3leg .i6les .il4ja .il6je. .il6ke. .il4le. .il6sk .il4te. .i6me .imø5te. .in5ad .in5de .in8ga. .in4ge. .in3gr .in6gri .in5k6 .in6ka. .in4n3 .in4ne. .in5n6e .in6n7eks .in6n7ets .in6n7ett .in4n3i .in5s .in7tes .io4na .io4nom .i4rer .ir7k8 .ir8ra. .ir6re. .i6sa .i3sc .i6se .is7k6 .isla8ga .is6lam .is4le. .is4let .is4me. .is8na. .is8ne. .is5pa .i5spe .is3s4 .is6sa. .is4se. .is5sk .ist6 .is8te. .i5sted .i5stem .is7ti .i6s7tj .i6s7tr .is8ut. .i6s5ø .i5ti .i3va .i4van .i4var. .i3ve .i4vel .i6ven .i4ver. .i4vere .iv8ra. .iv6re. .i3ø .j4 .ja4de. .ja6e .ja4ne .ja8se. .ja4va. .je2a .je2l .je2m .je5re .jern5s4 .je4ta .ji4 .jo8en. .jo4se. .ju6a .ju6la .jule3 .ju4li3 .jø4dep .k6 .kaf2 .ka6la. .ka6li. .kalve5l8 .ka5me .ka3na .ka4ne. .ka4p3r .ka4ra. .ka5r6a5v .ka6re. .ka5rin .ka4te. .ka5t6h .kau9k .ka6va. .ka4ve. .ke6e .kel3 .kier3 .ki4na .ki7ni .kino3 .kir2 .ki4se. .ki8va. .ki6ve. .kje3de5 .kje4k .kjek7l .kjønn4 .kle4s .kli5ne .klo9va .kly7sa .kna7se .kne4p3r .ko6da. .ko7gr .ko4la .ko3le .ko8le. .kol5j .ko3pe .ko6pe. .kor6s5ed .ko4se. .ko6ta. .ko4te. .ko6ve. .kring5s .ks6 .ku5f4l .ku4le .ku8ra. .ku4re. .ku8ta. .ku8te. .kva4r1a .kve9ka .kve5ke .ky8la. .ky4le. .ky6te. .kø3s .kå6pa .l6 .la4da. .la4de. .la4ga .la4ge. .la5ger .la4ma. .la6ta. .la4te. .la3tr .la4va .la3ve .la4ve. .le8ar .le4da. .le4de. .le4er .le6et .le2f .lef3l .lega5ta .le4ge. .le4gel .le8gi. .lei5er. .lei4ve .le4ke. .le4k5r .lemu9 .le4ne. .le6o7 .le7s6a .le4se. .le4sek .le4ses .le4s5p .le2t .le7ta .let6tan .le2u3 .le3va .le4va. .le4ve. .le4ves .li8a .li4de. .li4e4 .li5ene .li2g .liga3 .li2k .lik5k6 .lik3o .lik3s .li4ma .link6 .li6ra .li4re. .li4sa .li4se. .li4ta. .li4te. .li5ti .li4ve. .li4v5en .liv8s7u6 .liv4s5v .lo4e .lo6ge. .lo8gi. .lo6g5r .lo4i .lo6na .lo8o .lo6ri .lo8sa. .lo4se. .lo6te .lo4va .lo3ve .lo4ve. .lu4d .lu2e .lu4na .lu6pa .lu4pe. .lu6ra. .lu4re. .lu6se. .lu4ta. .lu9tas .ly4de. .lyd3s .ly8e .ly8ge .ly4se. .ly4sk .ly5s6e .lys5s6 .ly8str .ly4te. .ly4ve. .lø8de. .lø6en. .lø8ne. .lø6pa. .lø4pe. .løv5i .løye5ne .lå8ma .lå5re .lå6re. .lå4te. .m8 .ma4ge. .mag9r .ma3ka .ma4ke. .mak6t5at .makt5s .ma4le. .ma4li. .ma4na. .ma4ne. .ma4ni. .ma4ra. .ma4re. .ma4ri. .ma4sa. .ma4si .ma6st .ma8ta .ma6t8h .mat5t8o .ma4v .me4d3 .me6d5ei .me6d4i .me6d7in .me6d5r .mei5er. .mei5et .mek5l .me6la. .mel3l6o .me4l5ø .me4ne. .me3ri .me4sk .me2t6a3 .me3ta4ll .mes5ti .me4tri .mi6kj .mi4le. .mi4me. .mi4ni. .mi4nik .min4k3 .min5k4e .mi6s3t4 .mne6 .mo5de .mo6er .mo4na. .mo8ne. .mon4st .mons6t5r .mor5d6e .mo4re. .mor3t6a5 .mo4se. .mo4ta .mo4tek .mo4ter .mo4tr .mo5v .mu8ga .mu8ge. .mu6le. .mul5es .mur7 .mu5r8e .my8ka .my4ke. .mø4re. .mø5res .mø2t .må6la. .mål3o .n8 .nabo3 .na6ge. .nak2 .na8ke. .nan5s .na4r .na4sa. .nat2 .na3tr .nat6tr .ne4de. .ne4den .ne4d5i .ne4d3r .ned3s4 .nei5e .ne8pa. .ne6pe. .ne2s .ne4t .ni8ar .ni6er .nig4l .ni4na. .ni5o6g5 .ni4pa. .ni6pe. .ni8sa .ni6se. .nita9 .ni4to .ni4va .no6de. .no6e .no8ka .no4me. .no8mi. .no4r .no8se .no8si. .no4va. .nu4e .ny5a .ny8sa. .ny6se. .ny4te. .nær9ast. .næ4re. .nød4d .nø4re. .nå4de. .nå6le. .o6 .obo5e .od4da. .od4de. .od8la. .od8le. .offsi6 .of4te. .of5teb .og4 .ok1k .ok8ka. .ok8ke .ok4se. .old3s .ol4ga. .oli5 .ol8la .ol8le. .ol6m .om1 .om4ar. .om6bo. .om4e6n .om4gå. .om4me .om5s2 .on4de. .on5des .ond3s .on6kl .on6na .on8ne. .op5ar .op4pa .op4pe .opp7el .op4pi .opp3l .oppla8te. .opp5s6 .op7r .opt6 .or4da .or4de. .or4del .or4dr .ord5s4 .or5ga .or6ka. .or4ke. .or6me. .or4re. .ort6 .or6va .osa5 .os4k .os4s .os4te. .ot5r .ot7t8a .ot4ta. .ot4te. .ot4tes .ot3to .ot4to. .ove6 .over3 .overen6d .over3i4 .over5k8 .ov8re .ov5u .p6 .pa8la. .pa4le. .pa5n6e .pa6n7eu .pa5n6i .pa6re. .pe3do .pe4ke. .pek5t .pel4sj .pe4ne. .pe2p .pep3r .pe8sa. .pese5t .pe4st .ph2 .pi6le. .pi6p .pi9ra .pi2s .plen5g6 .plus6s5 .plus7s6e .plø7se .po4et .po3la .po8la. .po4le. .po4log .po2p1 .po2p2e .pop3p .po3p2u .po8ra .po6re. .po4res .po6st .po8ta. .po6tek .ps2 .pøn3 .pøn9s6 .på5d6 .r6 .ra6da. .ra6et .ra4ga. .ra4ge. .ra4ja. .ra4ka .raks7 .ra2m .ra4na .ra4ne. .ran7s6a .ra6pa. .ra6pe. .rap4s .rap5s4e .rap5s4o4 .ra4re. .ra6sa. .ra7ti .ra6va. .ra4ve. .re4al .re6da. .re4de. .ree6l .rege4l .re4gi. .rei2 .rei7de .rei5er. .re4ins .re6ka. .re4ke. .re8klar .re8kle .re4kli .re6kn .re8le. .re4ma. .re4na. .re4ne. .ren6sk .ren4t .rep5s .res9s .re5s6tan .rett7s8kri .re4ve. .re4ves .rev9n .ri2d .ri8e .rie5ne .ri6ka. .ri6ma .ri4me. .ri4pa. .ri4pe. .ri4p5o .ri4sa. .ri4se. .ris5ko .ri4s3ø .ri4ta. .ri6te. .ri6va. .ri4ve. .ro4an .ro4de. .ro8di .ro4e .ro8ke. .ro4ma. .ro4mi .ro6pa .ro9par .ro3pe .ro4pe. .ro4sa .ro9sar .ro4se. .ro4sed .ro4ta. .ro4te. .ro4tek4 .ro8va .ro3ve .ro8ve. .ru8ga. .ru4ge. .rug9le .ru8ka .ru4na. .ru4ne. .runes6 .run7g .ru4se. .ru4sk .ru8va. .ru4ve. .ry2e .rye7ne .ry6ke. .rød2 .rød7s4 .rø8le. .rø4re. .rø1v .rø8va. .rø4ve. .røy7e .rå8da. .rå4de. .rå4en .rå8er. .råg8 .rå6ka. .rå4ke. .rå3k4l .rå6na. .rå8sa. .s6 .sa4ge. .sag6n .sa4la. .sa4le. .sa4me. .sa4mer .san6d7 .san7d8e .san7d8i .san8s7ku .sau6e .sch6 .se2b .se2e .se4i .se4k5l .sek4s5o6g5 .sel4v5 .sel4v5i6 .se6na. .se4ne. .sen7s .se4ra. .ser7vel .se4te. .sha9ke. .si2d .si6er .si6ga. .si4ge. .sik5k6e .si8la. .si4le. .si4ne. .sinn6s5 .si4ra. .si5str .si4va .si4ve. .sje4i .sju5o6g5 .sk4 .ska7ka .ska5ke .skat4 .skei5d .ski6n .skinns6 .sko7de. .skog5u .skritt9s8 .skudd5s6 .skuddså7 .sku6m5 .sky6f7la .skå5ra .slim5 .slotts5 .slu9ka .slu5ke. .slø5se .sma4s .smas5k .smo9g .små3 .små7k6 .små9l .små5t4 .småt5t .sn4 .sne3 .snitt5s6 .snø3k .soa8 .so8de .somma4 .son6a .sop4pa .sor4t5 .so4ta. .s8p6 .spa5ra .spe6e .spi9la .spri5s6 .st6 .sta9ka .sta5li .stat4s .sted4s .ste4i .stein7a8 .stein7s8 .stem4m .stev9na .sti7me .sto5ne .sto6ra .strek5s6 .stu8a .stu9va .stål5l6 .sund5s6 .su4ri .su5te .sv8 .sva5la .sva5ra. .sva5re .svar5s .sver8n .syd5 .sy5d6e .sy6na. .sy4ne. .sy5ter .sy3ti .sy6v5 .sy6v5o6g5 .sz6 .sæ2 .sær1 .sær3e4g .sø8ka .sø4ke. .søl6v5 .sør3a .søye5 .søy6en .så5pen .så3re .t8 .ta8ke. .tak9r .tak5sk .tak9s8p .ta4la. .ta4le. .ta4les .tal4li .tam5m .tan5de .ta4p5r .ta4ra. .ta4re. .ta2s .te4e .te6i .tei9er .te8ke. .te4ma. .te6o .te8ne. .te4se. .te7si .te4sta .te4str .th2 .ti8a .tid5r .tid6s3 .ti4de. .ti4e .ti4g3r .ti4ki .ti4l5 .tili6 .ti4med .ti4na. .ti4ne. .ti4p5l .ti4s .to5arm .to6en. .to4er. .to6et. .tokk8 .to6le. .to6na. .to5o6g5 .to4ra. .to4re. .to6reb .to3ro .torsk6e5 .tor4s5v .to5rye .to4str .tota9la. .to5t8 .to8te. .to6va .to4ve. .tr6 .tra7c .tre3b .tre7p .tre5o6g5 .tre6skja .tre3s8ko .tre3sp .tre5s6t .ts2 .tsj2 .tu4en. .tu6na .tu4ne. .tu6ra. .tu4re. .tu8ve. .tve6n .tver6r5a6 .två7g .ty6da. .ty4de. .ty8et .ty8re. .tyr8s9 .ty5ter .ty5ti .tæ4re. .tøv9d .tø6ve. .tø9ver .tø5vet .tå5ker .tå4le. .tåp9n .tå5ren .tå7ret .u5a6 .u1b2 .u6berg .u3d2 .u7de .u3e6 .u4er. .u6era .u4ere .uf4f .uf8sa .u4ga .u5gi .ug6la. .ug8n .u1i .ui6m .u1k6 .u4ka. .u6ke .u7kn .u3le .u4le. .ule8k .ulen4d .u6lende .u8lene .u6let .u4lin .ul6ka .ul4ke. .ul4la. .ul8le. .ul8ma. .ul4me. .ul4ne. .ul5t .ul6te .u1lu .ul4v5i .u1ly .u3lå .u5ma .umu7 .u2n .unde6ri .und5r .une8 .u5nek .u9net .un4ge. .un2n .unn3s .u3no .un4se. .un4t .u5nu .u1o .u1p .u4pi .up2l .u2ra .u5raf .ur6an .u6rane .ur4d .ure4n .u4ret. .u6rets .u2r2i .ur4ke .ur6na .ur4ne. .u1ro .ur1s .ur8ta .ur4te. .urte5m8 .ur6tet .u5rut .u3ry .u5rå .u1s2 .u4sa. .u4sas .u5se .u3ska .u5sn .u7sp .us3se .us6t4 .u7stek .u5stel .usy5r .u2t .uta4g .ut5age .u3tak .u4ten. .ut5esk .ut6e7sko .u4ti. .ut3kan6t5 .ut4ne. .u5tol .ut3o6v .ut6rer .ut6rov .u3trø .ut6se. .ut4si. .ut3t4 .u3tu .v6 .va4da. .va4de. .vai4 .va4ke. .va6les .valg5s .va4ne. .van4n5 .vann5s4 .va6reta .vari4e .var5sk .ve8en. .ve4ga. .ve6ge. .ve4g3i .veg3s4 .vei3g4 .vei3s .vei4ta .ve4l3 .ve5l4ar .ve6l5art .vel5d .ve4l3e .vel5l .ve5l4os .ve4l5ov .ve4ly .ve8læ .ve4ne. .ve4net .ve4ra. .ve4ras .ve6re. .vermo9 .vers4t .ver5ste .ve4sl .ve4st .vete5 .ve8te. .ve4ve. .vi4da. .vide4 .vi6de. .vi4d5å4 .vi2e .vi4ka. .vil5l6a5l .vil5l6a5t .vi6ma. .vi8me. .ving7s .vin5n .vi4sa. .vi4se. .vi6seri .vi4ta. .vi4te. .vi5tr .vok4s3 .vok5s6e .vo6r .vo6ta. .vy4 .vye5ne .væ4ra .væ4re. .vå4d .vå4r3 .vårs6 .wa4r .wi6e .xe2 .y6 .ye4 .yn8da. .yn4de. .yn6ge. .yn8ka. .yn6ke. .yn4kv .yns2 .yp8pa. .yp4pe. .yr8ja. .yr8je. .yr8ka .yr4ke. .yrkes5 .yr6t .ys4 .ysterie8 .yt9ren .yt5t .yt6te. .yv6 .z4 .zj8 .æ8 .ære4s5a .ære4st .æt4te. .ø6 .øg8la .øg4le. .øi5 .øi6e .øko5 .øk6ta .øk4te. .øl3ed .øl3s6 .øl3v6 .øm4me. .øres8t .ør4je .ør5k .ør8na. .ør4ne. .ør6ski .ør9sm .ør3st .ør8ta .ørt9an .ør8te. .øs2 .øs4t .øv4d .øve4r5 .øve4r6s .øv4re. .øy6de. .øy2e .øyele8ge. .øy5ene .øy4n .øy6na .øy6ra .øy4re .øy8rer .øy4str .å2 .å6e .å6f .å6g .å6k4 .å8l .ål6t .ål8ut. .å8m .ån8da. .ån4de. .ånd6s5 .åp6na .års3k .å6se .ås3k .ås7l .ås3m .å3ste .ås5v .å4t .åt4te. .åtte5o6g5 .å6v a1ad 4aaf a3aft aa4g a1aks aak5v aa3la aa2m a1a2n a6an. aans9t a7antr a1ap aa4ri6 aarie9ne aar5n aa2s 3aase aa5t6h a1av a6bab ab7av ab9b8l ab4but abe4lei abel5t4 abe9na. abes9ka 4abev a5bh abie6 abi9er abi9la a4bist ab1l ab9lara ab4lok abl7u a5bo9a abo3b abo3e a3boer abo3kl a3bord 5aborte ab1r ab8re ab2sl abu5e a4buel a4buf a6busk a4bute a4by. a4byb a4byk aby3r 8ac aca5 a6ca. ache3a ack3 a1co 6ada a5dal ad5ant a4dart ad9da a2deb ade5i6s a2dek a4del a4d5elv a5dend a3dene a2deo a2dep a5der. aderle7 a2des a5de4ser a3desl a3det. a3dets 3adfer 1adg ad8ge adi4ene ad1j 1adju 2adl 1adm ad5n ado7a a4dob ad7opp 4ador a7dora ad5raf ad7ran a2dre ad7rel ad5rep ad3ret ad3rid ad1ro a7drø ad4s5amt ad4si adsle6ge. ad5s4let ads5te ad5s6tek ad3str ad5un 1adv adva5re 2adve a4dy. a4d5øy 2a1e2 4aea a4ed ae3de aed7r aek5t a4el. ae5la ae3li ael5o aen5t a3ep aes8ke. aes4t 6afa 6afc a4fe. afei5 af4fan af4fei affe3s af7fi. affi3d af5f4u af4i afia1 afi5an a2fib a6f5inn afi7re a4fiti a5fjo af9la. af9lar af3le af5li a4frik 6afo afo7ra. afo7r8e afore5ne afra5s 1afri afs1l aft5ei af4t5e4l af6t5o aft1s4 af5yr afø4r afø5ri 4aga a2gaa a5gae a4ganf agang7s8 a4gart a5gas. aga6ve. ag5de a7gelen a2gem 3a4gent age4r3a age6rek age5risk a7gers a5geru age5s2 a4geta a4gé ag5gar ag4gas ag5ge agg1s2 agg7u ag6gut a4gi. ag5id agi6s ag1la ag4lem ag6lesa ag5lå agmo8e agn5om 4ago ago5d8 ag1or a5gos a3got ag5ov ag7ras ag1re ag1ri 4a3gru ag1rå ag4samb ags4ang ag3s4ei ag4sel ag3sem ag5s6ing ag6sju ag4ska ags4kul ag2sl agsmå6la ags3tr ags3t2v ag2sy a6gu. agu3ay agå8va agå8ve. a1h a5hi ah4n5 ah4v ai1a4 ai3e2 ai3er. ai4is ai5ke. ai5ko ai9kv ai5ne a3ing a1inn ai4n5o4 ai1ro ais4e ai4s3k aisk2h ai8sm ais6om ais5s ai5s4v ai5ve ai5ø a1j aja9d a7je a8je. ajes7 a4jé a4ji a6jl 6ak. a1ka 4aka. 1a2kad 6akaf ak3aks 6akan aka4o5 4akar ak6arb aka4t5r ak4au 2akd 2ake a9kec a2keh a3kei5 a6kek akel8e akelei9er ake5l4i ake4rek a4kerø ake5sm akes6p a8kete akhe6n 4a1ki a6kid a6kik ak7ind akis1 2a1kj akk6and ak5ke. ak3ken akk5erst ak4kes akki4 ak5kim ak4k5is ak6kj ak1ko akk3ol ak6k5ri ak1ku ak4kul ak4k5v 2ak1l ak3lev ak6lik ak6lus 6akn ak5ne a5kno 2a1ko ak5om. a5kon a7kos ak1o2v ak4pe6 akra8sa ak5reg akregi4 ak3res ak3ro. ak3roe ak1ru ak4s5and ak4sek akse3l4o ak4s5elv ak4ses ak7s6id 3aksje ak2s1k ak7sku ak6sl 4akso 4aksr aks5ti ak5stol aks4tr akst7ren 4aksu ak4tab ak4tai ak4tak akta6le. akt5all ak6tam ak6tans ak4tap ak4tas ak4tav ak4teg ak4tek ak5teme 4akth 7aktig ak5tit aktle6ge. ak2tr ak6tre akt3rå akt5s4la 5aktue akut2 2akv ak3val ak5øl a5kå 8ala. al7adr ala4g ala9ga a5lagm alag8ra a5lah a1lai al3all al3a4me al3ana a3land a5lande. a5lane alan5gr al3anl al3anv ala4o ala5pr a5lar. a3lara a5laren al3ark a7larl 3a4larm al5arr a5lars al3art a7larv al3a4si 2alat ala7tr 4alau al5auk al1av ala4va al4ba. albo4g albu7er. 5album al3de al7der 4aldo ald3re 2ale a2lef a2leg a9leg. aleie6n a9l8eik a5leke a4leks a4leli a2lem al5e4mu al8en. a4l3enh a4l5en5tr ale4pos a7lept a4lered alere6de. a4le5ro a4leru ale1s2 ale7se a4lesk ale6s5kr a4lesl a6lesu a4leta a4le3te a2leu ale5v a4leva a4levi 3alfab 2alg. al3geb al2gu al4går al3ill a2lim a9lin. ali5na. a4l3ind a4l3ins al3int al9ja. al3je. alj5end al3jer al1jo al4jor al2j1u al1jø alj5ø6v al9kera alk7s6 alla4ga alla6ge. al4lap all5art al5lea alle6ge. al4lek al5len. all5erst alle3s4 al4lest al5let 3allia al4lid 5alli5e alli9ne al6list. al4lo3m all4sen all4sti al6lul al6løs. al4løse al8løst al6lå al6mek al4met 4aln a5lo. al1o4b a5loi al1om a1lon al3ope al7ord alori5 alo6rit al3ove alow7 alp2 al3ps 2als al7sed al9skap al7skare als1l als5lø al2sn al6spu als4te als6ter 6alsu alt6ak alta8le. al3ted al7tema 5alterna alte4t al4t5eta al4t5ete al4t3op a4l5u4k alul8la al5und alu8re. al5va. alv5aks alvak8se. al4ved al5v6er al8v9er8m alve5s al9ves. alvi8se al1vo alv3s 6a1ly a2l5y4te alø5se al3øv a1lå al7å6t a4mah ama5is a2mak a5maki am3aks a2mal am5ald a3man a3mar. a5mara a7mas. amaso7 3a4matø am4bar 3ambas am4bat am5be a2mei am3eie a3meis a2mek am3eks amen8de. amen4s3 amen6t7arv ame4ram a4meret 3a4meri 4amerin ame5u amhu7 2ami ami7na ami7ne amisk3 amis4ku am4lese am6lest am4mad 6amn. am4ned a2mo amo5e am1op am1or amo6ve am4pap am4pare amp5ei am8peria am6perie ampes6 amp7inn am2p3l am5p4let am4p4re am4pun am2på amru4 am5rå am1s am7s6ku ams4l amst6 am4s3tr ams9ut ams2v am4s5ve am2sø am3ti amti5da 5amtm am7tv am6ul am5yr am5øy 6ana. anak8te. ana3la anal4f 3analy 8anan a3nane a5nang anant8 4anar a6narb an5art ana3to 6an7au anaus7 an9av. 3anbef 4and. an4da5m6 anda5ta an4dek an5den anderle7 an9det 6ando an4dos 4ands and4sel and8send and7slet and5s6tre a2ned an5egg a4n5elv a2nem 2anen 2aner ane3ru a5nes. a4nest ane5sv an5e6tika a5netike an5e6tikk an5e4tis a2nev 3anfal anfø5re. ang4e an4ged an4g5enh ang5erme an8geste an4gi. 5angiv ang5of an5gos an4g9ra an4gre. an6gres an4gret an4g3ry ang4sm angs6tro angs8t9rå angst5y ang5sva ang6søy ang4t5re ang5t6ve an4gun an4gå. ania7 a6nib a4nisj 4aniv an4kana 4anki 4ankj an4kob an4kop an4kos an2k1r ankra8na. ank3re ank3ut 8an2kv an4kø an6k5å6 2anla anland6 anlø9pa ann5ans an6neme an5nen an5ner an5nid an4ninn an4nom 5annon an4nov ann4sei ann4sid ann6s7kå ann6sl ann3st ann5sta ann4s3u an4ny an2nø a3no. a9noa. ano6deb 2anog a7norm a6not a2no4v ano5va an3ove anri7ke ans5aft ansa7ka 4ansan 3ansat an4sek an4sent anseri8e9ne an4ses 3ansik ans5ind ans5ins an4ski an3skj ans4k3l ans6kun an5skø an6slø an4sn ans5or an4s3pi ansport7s6 an1st6 6anstar ans4te4 6ans6ti 2ansu an9s6und 5ansunda 1an1sv 4ansve 6ansy an4så anta8la an5t6and an4tans an3ted ant5emi 5antenn an4tesl anti7kl an4tim an5toi ant5ord ant5rab ant7rom ant5ryg ant5s6 an4tul antus4t 2anu anus7a an5ut 3anven 6anvin 6any a4nya a2n1æ2 anær8 2anø a2nøk an7å a1o ao9a aog9 a2oi ao6k6 aon8de. ao2p ao4r a5pea a7pé a1pi a2pia ap1id a6pik a6pins a2pio api6r5 api7r6e api7se ap1j a1pla a5p6las ap3li ap9lo ap2ly 4apol a4pon a4poo apo3p apo5s4ti a2pot 3ap3par 4appar. 6appare app7esk ap5plas ap4ple ap5pli ap6pri ap3ra ap5ren ap5ret ap3rin ap2s1 apsa4 ap3sel apse4s ap8s9l a3psy ap4s5ø 8apu a6p5ut a1py ap7ø a3p8øls a5på. a1ra ara9bi ar5aks arak5t ar3alt a4rami 2aran a4ranor a4rans a4ranv 2arar a4r5ass ara5te. ar5aug ar7auk arau9ken ar7avh 1arb 2arba arba8ne. 6arbeh 4arben 6arbet 2arbi 4arbj 6arbl 2arbo arbo8da 2arbr 2arbu 2arby 2arbø 4arbå ar7deb ar6deli ardfø5re ard3re ard5sta a1re 1a2rea 4arear a4reb areba4r a2red a2ref a2rei are3in a2rek a6r5ekt a4rela ar7elek a4r6eli ar7emn a5remo. 3arena a6r5eng a4reni aren5tes a2reo a2rep a6rerel a4r5erfa a6rerk a4rero a6rerø a5res. ares8ka ar4et a7reta. a4rev ar7e6va ar3evn arev6ne. 8a1ré 6arf ar7g6h ar5g6i 6argj arg4l ar7go arg5stj 2a1ri aria7ne a3rib ariba9 ar5idr a4rim ar3inn ar3ins arins9k ar3int ari3se arise4a a4risto a2riv ar4kau ar3ke ar4ke5s ar5kha 3arkit 3arkiv ar4kle ar4k5løf ar6kod ark6ste ark4str ark7veg ar4køy arla4ga ar4map 5armbå ar4medi arme7t ar6metr ar4minf armle6ne. armå6la 2ar2n ar4nad ar4nal arneva7la ar3ni ar3no ar3nu ar3nå a1ro. aro8de. a5rok a1ron ar1op aro6pa a4r1o4r a1ros ar7ost a1rot ar3ove ar6ped ar9po arp5ret 1arra ar5ree ar7resk arri8e7 arrå6da 2ars arsa6ka ars5ans ar3sel ar6s5ers ar4sin ars5kam ar5skar ars5kes ars7kre ar4spr ars6tr ars4vei ars7æ arta4la arta6le. ar3te ar7tele 8artets art4ha. art4has ar4tika 6ar4tim 4artn 4arto ar4top 6artr art9ra ar6trin art6s5t arts5ø 6artu 8arty ar4tyv ar1ul ar1un ar5u6r a1rus ar5utb ar5utn arve3s ar6vete arvi8sa arvi8se. a1ry ar7æ6 arø8ve. ar1øy a1rå arå8de. ar7åp a6r5åt 6as. 4a1sa asab4 asak4 a4salo as6an as7aug asbe2 a1sc a2se. asea4 a2sed a2seg a2sek as4el ase5le a2sem a6senet a4senk a7seol a2se5s a6sest a4sete a2se3u as2h as5hu a4sib a2sip a2sir a7sis. asis5t a2siv as4ja a6sjett as5jor as3kar ask6et as5keti ask2i as5kis a5skj as5ko. as5koe a4s5kopi as3kor as3kot a1skr as7kra as3kul a5s6kula as6kule ask9u8t as4kv ask5øy as1l a5s4lag asla8ga as4lev as4lit a1so a4so. a2s5om as5ov as4pan as3pe as7pis as5pl as9sa. as4sab as4sal ass5ald ass5alt as4sam as5se. as4sed as4sek asseri7e6 as4serv as4ses as6sifr as5sing assi3s as4sit as2sj as6s1k assku6le. as2s3n as5so. asso9a as7sos. as6s1p as2s3t as4stan as4str ass5tru as2s1v as4sys as4søk as2s5å as1ta as6tab a6stande a4statu as5te. as3ted as4teg as4tek as4t5enh a1stj a9stof a5stok ast5ov ast5ren as4tro as9tua astu8ve. ast5ø4v a1su asu3n asu9sa as1va a6sym asyn7d as7øye as5å 4at. 4ata1 a5taene at6af ata8ka. ata8la. a4tang ata9rar a6t7arv atas4 a5tas. atat8 a2tau at5avh atch5 a2tea a2tec at7edd a2tee a4tei at5eid at3eig ate3in a4teka ate5k8e ateke7ta a6t5ekte ate7le at3emb 4aten a5tene. a4teni a4tenu a2teo 4ater a5ter. a6terat a8terek a4teril a2tes a4t3ett at6e5u a4té 3atfer at4ha. at8has 4ati atik6ka atili5 ati5nea ati4rep ati8sta at3jo 5atlant atl9øy 3atmos at4nel ato5a ato5gr at1oi a2tom a6t5oppr a1tor a5tose a3to1v a1tra at5reg at3ren at3rer a4trif at3rin at5rot a9tru at5røs at5røy 2ats at3ser at7sje at7s6kat at7skj ats6kul at2s3ø 4att. at6tat 4at5te. at5tens attfø7re at4tid atti4s att5ise at3tit att1o att7o6p atto6v at1tr at4traf at4t3re at6trin att3s6k att5s8l att3sp att3sv at6tys at2t3ø2 a1tu atu5e4 a2tut at5v atvi5er. a3t3w a1ty atyr8ke. a5t6yv a1tø atør3s atø9se a4t5øy a3tå. a7tåa a1tåe at5år at5å4se at7åt8 4au. 8a8ua au9ar. 4au5b auba6ne. au3c au5da. au9det au4di. 4a6ue au7en au7er aue5re au3est au6e5ta au5e6te. au4gal au4gas au4gel augele8ge. 5aug2n 3augu au5i au5keli au5ket auk5la 1auk7s6 au5kve au6las au4lat aul5l aul8la au5lu au9men au6mo aum5s6k aum7s4t a5und au5rae aure5s au5ret au5ri aur5s6 au1ru auru4e au1sa aus9kj au6skr au1so aus5s au6s8tas aus8tett austi6s aus6t7ise aus6ton au5str au6stri au1su au4sun au2s5ø4 aut6a au3ta. au7tar au5te 1auto auto5v au3t4re au4ty 2aux a1va av5ab a5vae ava7g 6aval av3alv a4v3and av3ang a4v5anl 3a4van5s a9var. av3art avar6ta. 4avas 5avbi 1avd 3avdel 2a1ve a2ve3d2 a5vede. a7veil ave3in a2vek a4vela a4vele a5veleg avens4 a5ver. ave7ras aver5d a6verei a2ves a2vev 1avfa 1avg avi4ar 4a5vig a1vik avi9ke a1vin a4v5int 2avir 5avisa avi5sa. 3a6vise av5ising avis3t a5vit avlu9t avlø5se 6avn av7na av4nes a1vo a4vok avo3r avo4v av1r av4res av5ri av1sa av5seg avs2i avsko7g 3avsni av1s2p avspe9g4 avs4te av5su av1s2v 1avt avta9ka 2avu 1avvi av3øl 4a1vå a6v7å6l a1wa awat4 a5we awe9ne a1wi ay2a ay7ane. ay5ar ay9s8t a5y4t a5zu azz3o a1ø a7å6 1b4a ba3a baby5 ba4bys ba5cl ba2d ba4da. ba7dan b5add ba8de. ba4deb ba5den. ba7dens ba3di bad1s 4baf ba2k ba5kan7 ba3kar bakars9 ba3ken ba4k5end baken6de. ba3ker bake3s ba9ket. bak9ett ba3ki ba8ki. bak6kers bak6ko bak5kr 4bakr bak4re ba5kri bak3ro bak3sm bak5sp bak5s6ti bak5str bak7t6 bak1v ba3la bal7ak ba4les ba4li. bal3j bal4lag bal4lan bal4led bal4leg bal4lei bal4lev bal4lig bal6lov ball5s6 bal6læ ba1lo bal5t ba1lu ban4a ba4na. ba5nan ba5nar ban9da ba4nel ba4nes ban6kap ban4kor ban2k3u bantu5 ba3re baret5t ba3ri bari6e7n bark5s bar5skr bar5tr ba5ru ba5sen ba4seru ba4set ba3si ba2s1k bas6sak bas4san bassi4 bassis5 bas4so bas4st bass6tr ba2st ba7s8u ba1ta 2ba1tr bat6ti bau9la 6bav ba5z 2b1b b3ba b6bak b4b5arb b6base b3be. b4beb b4beda b2bef b4beg b6beh b2bei bb3eie bb5eig b2bek b6belo bbel6t3 bbelte4 b4bem b9bene. b2beo b3ber b4b5erf b4bes6 b7beska b6beta b6beten b4beti b6beto b6betr b2bev b8b1h b3bi bbi9e8 b4b5inn b2b1l bb7len bb5op bb5rek bbu9ra bb5ut. bb5ute b2by5 bby3e bby1k b4bø b6bå 2bc 2b1d b2dek b7den b4dep 1be be2au be4bo. bebo5er. bebo9k be4da. be9dar be3der bedi9e8 be4dre bed5red bed2s1 bedy9ra be1då3 2bee be5ed be6ef b4ef befa5re be3g bega9 be4ga. be4gi. be4gn be5go be4g5re. be4g5rene. be4gå. be6ha. beha7g behers7 4behu behå4r be6i be5ke be2k3i bek6kel bekke5r bek4kes bek6l 4beks be4l3ab bela9ga bel5eie bel5eig bel5ein be4lek beli9na beli9v belle5sa bel5let bel5læ be2l1o bel5s4p bel7s4t bel4tag bel4te5s bel4t3ø bel3u bel5v belæ5re belå7ne be4na be5nat be3ne 4bened be4nest ben5gu be5ni ben5s4i ben5skj ben5sp ben5te 2bep b4er 4berai be7ras ber5d be4rep 8berest bere5te ber4ga ber4g5ende ber5ges berg3j berg3l berg3o ber4g3å be5rib beri5ke be7ris ber6kl ber5na ber5ne be1ro be4ro. bero9a berri6 ber5te ber5ti be1ru beru9sa berø5v b4e1s2 5bes. be4se. be5s4i 4besik 6besj bes5ke bes6k5n be3sn bes7ne 4be3so beso9v be5sp bes3s bes6s7a6 bes6sel bes7si bes7tens bes6tes be5stes. be6så 3b4et 5bet. be4tab be3te 4betei be7tes beto5ne be6trar be6tre. be4t3ri 4betu be4ty. beva5re be6ve. bevi5se. be9vo bev9r 6beå beån9 7bé 2b5f 6bg 2bh bhu1 1b4i bi5ak bi6bla bi5ce bi1d bi5dee bi8dé bid6r bidu8 bi5el bi6ele bi5erv 4bifa bi5g bi3ka bik1k bik6ki bi5k4l 4bi7kr bi6la. bi4las bi4lau bi3let bilet5r bi4lin bil3j bil5la billa8ga bil5leg bil5m6 bil1o 6bi5m bi4nans bingo5 bin4gol bi7no 4b5int bio7 bi3o8m3s4 4bip bi4ri5 bi7ris. bir4ken bi1ro bis2a bi3se b5ish bis6hi bis7ke bi5s4la 8bisn bi4sp bis4p5i bis5se bi1st bi5s6ta bis4til bis5tru bi3s4v bi6ta. bi4te. bi5tes bi8ti. bi4tre bi6tri bjar3 bjek4t5o bjø6r 2b1k4 b5kh bl2 1b2lad blad3a bla6f3 bla8ga blak5r bla5me blan9da b4lank blan5ke b4lant b1lar b8larar b3lat bla4u b4lef bleie5 blei5er b4lek ble4k3a ble5kes ble4mo b3ler ble7r6a b6lesa blesse9ne b4lest 2blet bli9ke bli5ma bli5me blings6i blis3s b5lj blja4 blo6dr 1blok blom5m b6lu blues3 blu9sa bly7gl blæ5re. blå5n blå3r blå7sa blå5se. 2b1m 6bn b3ne. b3ner b7nes. b7ni b2o boa5s4 bobba6ne. bob5by. bob9bye bo2bl bob7la bobs4 bo3de bo6din bo6d7r bo2dø 4boef 1boen bo2er bo4et. 2bo3f6 bo4gel bogn7 bog1s 2boh 2boj 3bok. bo2ka bo6kel bo4k3et bok1i bok1k bo6kop bo6k5ri 5bok1s boksi8da boks4p bo2ku bok3ve b4ol bol5eie bo7li boli7n bo7lo. bo5loi bo4l5o4r bol5s4p bolst6 1bomb bom4bel bom5m bo6mo bom1s4 bo5nap bon5ato 4bonn bon5ne bons4 bo5nus boo6 boom1 bo1p4 bo1ra bo4ra. bo6re. bo7rel bo3ren bo3ret bo4rete bo6ri. bo3ro bor6t7ef bor6tei bor4tes bor6t7et bor4ti bort5s6 b4o1s bose8te. 3boska bo2sl bos5se bo4sto 1bot bo4ta. bo4tak bo4tal bo6te. 2bo7to 4bot6r 4bot4v bou3c 4bo1v bow4e bo6y 4bp b7pl br8 1b4ra bra5ka brak5s bra5se bred5sp brei5e brei3s bret7te b6rev brevi9er. bre4vin bri5a b4rio b2ro bro9ar bro1s4 3b4ru bru5ke bruk4s3 bru4na bru7na. bru5nes bru5pl bru7ren bru5sa brus4l 1bry bryn4s b4rø brø5de bråe6 brå9ne brå5te. 6b1s bs4e b5s6e6a5m4 b4s5el b5s6i bsk4 b4sli b2sm b2s1of bs2t6 b6st7f b7s6v bså5 6b5t b7t6s 1b2u bu4ar 4bub bu3da bud5d6h bu3de 4bu3em bu4en. bu9ene bu4er. bue5s bu1i bu6is 6buki buk3l bu5la bu4le. bul3le bun7de bund4s3 bun8ge. bunk3r bunnla8ga bunn3s 2bu3o bu1p bu6ra. bu4re. 4bu3ro bu3ru bus6e bu4se. bus4h5e busk7ø bus6sek bus4sel bus6sent bus6set busse6te. bus6sj bus4sn bus4sp bus4st buss3v bu1st 4bustr 4busy bu1ta bu4tal bu7tem b5utg 4butst bu2tu bu1tø 4buv 6buø 2b1v 4b5w 1by bya2 by5al by9are by7dep by4en. by7ene by5ens by2er by3ers by4ge. byg3l 3byi by1lo 4bylø by5n by1re by6re. by1s 5bys. 4byse 6bysi 6bysp byst4 by4ste 4bysv by5tar by4te. by1tr 2byv bæ5rar bæ6rar. bæ4re. bæ5ren bæ5rer. bæ5rere bæ5res. bæ5ret. bæ3ri bæ4r5is bæ3ru 1b4ø bø4e bø7ens bøf3 bø4kes bø6la. bø6le. bø2n bøne5 bøn6nes bøn7o bø6re. bør4s5k bør4sp børs3t børs8ta. børs3v bø5ta bø1v bøy7ar bøye5 bøy4ene bøy4es bøy4et 1b4å bå4de bå9des bå6e bå7ene bå4la bå1re bå6reg bå4rep bå4s3te bå6s7ti bå6t5j bå6to båt5r 1c4a cab4 ca4e ca5le ca5me ca5mo ca4pe. cap1r ca6pris ca3ra car5n ca5ro car4te. ca2sa3 ca6set cash5 ca5s4til cas5to ca1t cath5 ca4to. 6cb 4cc c1ci c2d cde6 cebo9 ce3d ce1i 1cel ce5le cel4les cel4lev 3cen. ce4ned ce4nee ce4nem ce4ne5s4 ce5nes. ce4net ce4nev 5cens cen4ti9m cen6to ce5o4 1cer cerba6ne. ce3re ce1ro5 cer3t 6ceru cest3o 2ch. cha5le 3cham4 cha7ne cha5t 2chb 4chei chel5s che7te chi4li 4ch3h 2chm 4chn ch5ne chom4 cho5s6 2chp 8chs 6cht ch1v ci1c 3cid ci2e cie8n cie2s5 cil5l ci3ne ci5ta 2c6k ck5ar. ck5art ck1en ck3er. ck4ere ck5e4t3 ck5et. cke8y5 ck1i ck1k ck1o2 ck7r ck5s2 cku6 ckup3 ck9ut c2l clai4r5 cly4 c1m cmini4 coa6 coat5 co6bid 1co4c 2cod 6cof 6cog co4la. co4lab co4lak co4la5r co2m co5ma com5t co6n5os con5s con7t co2o co7pa 2cor co3r6a co1re co4so 4cost co4ver c1pr cr8 cras4h crack4 cre2e creen7 cros2 5cru 4c4s 4c1t c6ta cty5 1cu 4cu. cu5la cu5le cu5lu cup1l cu6po cup1r cup7s cu4på 2cur cures4 cu6t cy2a cy6p7 cys3 c6z cæ5 1da 4daa 4daber 8dabo d5abs 6d5adel d4adg dadø4 dadør5 4daef 2daf 5dagb da4gev 4dagj dag7l da6go. da4g1r da6gun 4dagå 4dahe 5dahl da1i 2daka 4dako 4dakr dak4se. 4daktig da5kv 7d6al5j da1la da8la. da4las 6dalau dalbu8er 4d5ald da4les dal6so da1lu da4ma. da4man da3mas da4me. da3men 6d5ameri dame3s dame5t6 da3mo dam7pe 5dan. 6danal d8ane 9dani 2d1anl 3dann dan5neb 4danno 7dano d4ans. dan3sa dan4sel dan9s8kan 4dansv 9dant. 9danti 8dany 2da3o 2dap da3pe d3app 3dar. 5dara 2darb dard3s4 4darea da4res d5arn da2ro dar5os. dar5s6 dar4ta. dar6va. dar8ve. 4dasei 2dash 6dasi 4dasjef da4sk da9sko 6dastr 6dasu data5 4da4tal data6le. datali8na da4tek 7d6ato da3toa 4da5tr dats6j d6aud daud7s8 dau5go 2daut 2dav d5avb d1avl d3av5s 4daø 2d1b2 dba8le. dba4ne. dbe8ta. dbe6te. dbling7 dbo6en. d6byf 4d1c 6d1d d2dad ddag4 d4dak d4d5arm dd3eie d2dek dde4lap dde4l5o ddel5sv d4demi dder5s d4desu ddie8 d7dom d4d1re dd5run ddsa4 dd4sala dd4skap dds5tab dd3s4te dds5tr d2dyb ddø2 ddør3 d4d5øy dd1år 1de 2dea deak3 de2al de7b 6debar 4debas 3debat 2debe 4debl 2debo 5debon. 2debr 3debut 2deby 4debø de1c 5ded. 2deda 6d7edd 7dede. 4dedek 4dedel 4dedia 2ded4r 2dedy 2dee 5dee. de7er 2def d5eff d5eft 2deg 6d6e5ge 5degg de3gl 2deh 5dehavs 2dei dei4d dei4ene 3deig. dei8ge. 5deigen dei4g5r 5deik d2e1in 3deir de5is. de3ist 7de7it 2dej 8deka 2deke 2deki 2dekj 5dekk dekk3a dek4kan dek4kel de6k6kv dek2l 6dekly 5dekni de5ko 4dekod 4dekon 4dekos 2de5k6r dek6st deks7ti deks6tr 5dekt 2deku 4dekv 4dekø 4dekå d4el. 6delad 6delage de6lans 4delau 4deled de4lef 4delei del5ei4d del5eie 4de4lek de5lele 4d5elem de4lest 6d3e4lev 4delid 6delinj del5int 4delis 4deliv del4lap del6lei del4lek del6lerf del6lig d4els del4s5at del3se delses7 del4si del4spo d4elt del6tala del3te del7tr 6deluk del5ve 4dely 4delæ 2delø delø6pa. 6deløy 2delå 2de5ma d3emb 2deme demie4 4demj dem8na. de4mo. de4mog 5demok 4demol demo5no 5demos dem5pe 3demr 5dems 4demu 2demø 2demå d2en. 4dena de7nak 6d5en6den. de5neb 4dened 6denel 4denem 4denet 4denev 6d5engen. 4deni 4deno de4nom d2ens den4sin den4s3t8 den6t5ant 4dentif 4dentit dent3o den4tr dent5s8 den6t5u6 den6tå 4denu 2denæ 2denø de2ob de4og 2deol 4deopp 4de3or de4ove 4depak 4depap 2depe 4depi 4depl 6depu d2er der8am de6rant de4rare de4rark 5de7rast dera5te der3av der5d 4derea 4dered de4r5edd de4ref 4dereg 4derep 6deresi der5est 8derest. 6dereste 4derett de4rif de4ril 5derin de4rinæ der5k der5ne de5rob 4derog 4deros de5rose dero8se. 6de7rot dero4v der5s6n der4sp der3t der5un de5rup 6derus der3v 4derør 2derå de1s 3d6es. 2desa 4desc 2dese de5seg des5ers 4desho de8s9hop desi4s5t 2desj 2desk 9desk. 5deske 4des4le 2deso 2desp 7despl 6de5s6pr d4es2t 5dest. 5deste. des6tem de5sti 4destj 4desto 4destrå 4destu 6desty de4s3tå 6desup des6v 2desy deså7 d2et. 2deta deta8ka. de3te 4detea 6deteg 6detekk 4detel 4deten 4detep detes7 2deti 2detj 4deto 4det6r 2detu 4dety 4detø 6detå 2deu d1eur 5deus 2dev deva8ne. devi9er. 3devik d7ev8n de5vu 2dey 4deø 2deå 2d1f dfø6rarar 2d1g4 d4gel d5gi dgi6n dgjø6re7n6h d3go 2d1h dhav4s dheim2s5 dhu9ga dhø4r 1di di6ak di5alg dia5li di1ar dia3re dia1s dia7sp dias6t diats4 2diav 2dib did5ri di7ell di5en. 4di5end di1er dies4 3diff diffe5 3diful 4difø di8g9and di4gat di3ge4s5 dig7g 2digj dig8la. dig6le. 4digren dig5ret 4digru di2gu 4dih 4dii 2dij di5ka di8ka. di5kem 2dikj 6dikn 2diko 2di1kr dik7v 2dili dil4les di5ma 6dimed 6d5i6mel 4dimes 4dimet 2dimo 4d5imp 4dimå di5na 2d1ind di7nen 4d5ingk din3gr ding8s5en ding6s5er din8g9å dini4 di4ni. 4d1inn 2dino 2dinv 4dinø 3diog 7diol dio3na dio4no di3ori dio5tr 2dip 3dipl 4dired 4direg 4d5irs 5dis. di6sc di6sed dis4i disie5ne d6isk dis6kam di4skj dis6k7l di4sk6o dis5ko. dis7koe dis7ku dis5s dis1t dis7tik di5sv dis4vi 2disy di4tal di7te 4ditek dit4tet ditt3r di9us. di4va. 4dival di7van 4divek div6i 2divu 2diøk d1ja d1je. d1jen djer5ve d7jes. dje9ve d6jingan d6jingar d1jo dju8la. 5djup 6djupar d4jø. 2d5k2 dka8ra. dki6 d5kj dko2r dku4le. 4d1l4 d3la dla4ga dland7as dla6te. dla4v d4ledi d2lef d4lega d7legar dle3ge dlei7er. d5leka d2lel dlem4st d4lenet d4leru dleva8ne. d5li dli4f dli5ke d5lo dly8se. dlø8pa. d5lå dlå9re 2d1m dme6la. dmo4e dmors6 dmo8s dmø4re. dmå6la. 8d1n dn6a dno8de. 1do 2doav do2b3 4doba do3be 8do9b8lan 2dobå do4da dodø4 dodør5 4doeu 2dof d3off d5ofr dog6med dog4me5s 2dogr 6do5i do3ki 4dokine dok6kan 4dokn do5le 4doled doli8ne. 4dolinj 6dolis 4dolj dol5l4 4domes do5mis 4doml do4mo dom7p 2domr dom8sa dom8s5e6 dom6s5i dom4s3k doms3l domsla6ga dom4so do4mu do4na. don5g 4donke 6d7on6kl don5st don5t4 2dop do4pa. do4pe. 3dopi d6o1ra do5ran 2d1ord dor4da do1re dor6gest d5orie dorm8 do3ro 5dorp 3dorr dors6 dors7ke do1ru do7rye 5dos. do4se. do4set do1sk 6do7s6l 2doso 4dosp 2dost do3str 4dotr 2dov do5va do5ven do4ver dov9n 4doø 2d7p8 5dq dr4 d1ra. d5raa d9rad. d5rade 1d6rag dra5gen dra6kes 3drakt 1dram 5d6rang 3drap. 5drapa 3drape d3rapp d1rar d6rarar d3rarb dra6ret d5rarm d5rarr d9ra8sa 9dratt drau7ma 2dre. 5dreass 2dred d5rede. d5reder dre7d6r d5reds 9dreg. 9drege. d3regj 3dreie drei5en drei5er. drei7ern d5rej d6reka d7rekk 3drekt 4drel d7relig 4drem d1ren 4drer d3ret. d3retn d6retr d3rets drett4 dretts5 5drevet 3drevn 4dria 3d2rif 2d1rig d2rik d3rik. dri8ka. d3rike 3drikk drik7s6 d9rikt 5d4ril 2d1rin dring6 drit7tr drit5u dritun8ge. 1d2riv 3dronn dro6pa. drop5s 2d1ror 3d4ros dro8ta. 2d1rov dro5va dro3ve 2dru 3druk d1rul d1rum d3rup 6d5rut 2dryk drykk4 d2rys d4røm drø6re. d7røt drø3ve d1råd drå4de. 3dråp 8ds d5sa. d3sabl ds1ad ds3a6del d1sag dsa9ga dsak6se. d1sal dsa8la. d4s3alf d6sall d9same ds1a6n ds5ane ds1a2r d2sas d4satf dsbø6n d5se. dse4d ds1ef d2s1ei ds7eks ds3ela dsel4s5a dse2m ds3emi d6s7enda dsen8de. d4s3eng d5sens ds3e2p d7ser. d6serf ds5erk d4s5e4sk ds5e4st ds3eta dse4te. d5setj ds1ev d2s1i d3s2id d7sida ds5ident ds3idr d7sil ds5ind d3sir ds3i4s dsi4ve d4s3jen d2sjo ds7jor ds6ju ds5kab d4s3kan ds3kar d4skat d1skj ds5kjen d6s5kjøt ds1ko d5skot ds3kro ds1kv ds1l ds5la. ds5lan ds6lem dsli6k ds6lo. d9slott. ds4luk ds3ma d6smo dsmå6la ds3ne ds5no ds1o2 d7somst d4s5os d7sot ds1p d3spek d3spel ds2pi d9s8py ds5s4 dst4 ds3tak d4s3tal d3s8tar d5s4tat ds6tau dss8t d8s9te. ds9teik dste6ma. d6s5temp ds5teo d3s4tig d3s4tik d5stilli ds1tj d3stor d3stri dstu8na d5stund ds3tv dsty8e ds3tyv ds1u2 dsure6 d5s6us d6s7usk ds1v dsva8ne. d3s4vet dsvi6ka. d5syk d3syn dsy6na ds1yt d2s1ø d6sør ds1å6 4d1t d3t4a dta6la. dta4le. dta4s d3tem dte4ma. dt4eng dterle7 dte4se. d5t4et d3ti dt6j d7to d5t4rag d6troc d5t4rø d6t1s2 d3t2va dtø8 dt6øk dtørs3 dtå4 1du dub5b dub5l du1c du9ene du9ens due5s 4dufo 3dug 4dugu duit6 du6ka. dul5l 4duly dums2 du4na. dun7de 4d5uni dun5s6 dun7sta 7duo d3upk 3dur du6ra. du6re. du6rei dur8ta du1s du5s4a du9sem du5s2i du2sk du2sl du2sp duss4 dust4 du2sv 2d1ut du6va. du4ve. 2d1v dva6la. dva6lel dva4ne. dve6s dve6va dve8ve. d7vo dvo8r 2d1w 1dy dy9a 2dyba 2dyf dy5ke. 4dykl 4dykø 2dyl dy4na. dy4ne. 4dynk dynk6s5 dy3pes dy2p3r dy4ra. dy5reba dyrle8ge. dyr5s4 dy2r5u dyr5ø 7dys. dy8sa 4dyse dy6se. dys7s dyst7r dy2t d5z 8dz. 1dæ dærs4 1dø 4dø. død2s1 dø3gr 2døk d5økn dø4ma dø4pe. dø4pen d2ør dør3i 2døs d6øs. dø2st3 døt3 dø9va dø3vel dø1vi 6døvl døv8le. 2døy. døya8 døy8g 4d9øys 1dåd dåd6s5 då8na. 1dåp då8ra. då5ri d3ås. då8sa. då7sem d7åt. 2ea e1a2b e1ad ea2d1i eadli5 e1af ea2gu e1a2k e4akr 6eakt eak6se. e1al. e5alle eal8le. ea4lov e3alte ea2lø ea4m1 e3aman e5amn e1an e2an. ea4ne. e6a5net e4ani ean7n ea4nor e6ans. ean3sl e1ap ea4pe e1ar ea2re ea5rer ea5ret ea5r4i ear6ka. ear8ma. ear4ta. ea2s1i e3asp e1ass ea7ta e5a4tel eate6ren ea4t3et eat8h eat6le e8ato ea5tri e1att e1au eau6ga eau6ge. eau8ra. eau6re eau5s eau8sa eau8se. e1av eav8la eav8le. 2e1b2 eba3d eba4ne. eb3be eb4be. ebe4d3e6 ebei7er. eben6s5k ebers6 ebesku5 ebet5s eb3h e5b6lo eblæ5 ebob3 ebo4da ebo5ers. ebo6kr ebo6la eb5s ebu4e5re ebu5ern ebu6et eby4ta ebø6n 2ec e4ca ec4c e1ce e5cha e3com e2dad ed5ad. e5d4ag edag4s5 e2dar ed3ark ed3arv ed7dela ed4dyr e3de. ed5e6ge ed5eg4n ed3eie e4deks ede8le. e4denf e8d5eng eden5t e6depr ede4ra e4derø e4desk ede4sl ede4sm e4desn ede4s5p ede4ta e6d5ett e8dé e5d6ia edi6a5ne edi4ene edi6gj ed4is edi3si edi4s5k e7div edle6ge. ed8ob edok8se. e4dol ed1op ed1ov e1dr ed2ra ed3reg e5drev. ed3rom e6d5ryg ed7ski ed3skr ed3s4la ed2sm ed5ta ed3te edt6r edu8a ed7va edvi6s e3dyk ed5ynk edyr6ke. edæ4 e3d6ø1r e3e2 eea7 ee3b e2ed ee3di eeg4ga eeg6n ee5gå eei4d eei7ni eek1e eek4te ee3la e5e4li eem6na ee4n e5enb een3in een6k een5t e3epl ee8ra eer3en ee3ri e4er3l eer4me. e6e5sh ees8ka ees6ke. e3e6t eev4ne. e1f 4efa efal6s7 e4fana ef3ank e4fark efar6s5 ef7ea ef5ef ef3fe 3effek ef3fo 4efi e4f3id e5fig e5f4ilm efi7ren efisken8 4e3fj 2efl efle6ge. eflå3 e2fn efo8bi. efo4no 8efr ef2sj ef2sk ef2sp ef6str e8ft ef2ta efta5r eft5ei ef5ter eftle8ge. eft1s4 6efu efyrs5 e3fæ 4efø efø5le eføy9 2ega e3gaf e6gala e7gam ega4ve. egde8l eg7des e5gedo egei9e ege4let e2gem e3geme egen5s 3e4gensk e7geom e2ges2 ege5sp eg9gen egg3l eg8g9ut egi3an egie2 e4giko egis4p e3g6lad e3g4led eg7lesa e5g4lit eg7ly e5g6lø 6egm e9g8nag eg4nem eg6no e7gnå 4ego e4go. 7egoi eg2r egrans5 e7g8rø egs4am egs4ki egs4ta e1gø egøy6e5ne 4egå egå4va egå4ve. e1h ehea4 ehei9e eh5er. e4h5ere eh7ern eher4s ehog5 ehov2 ehy6re. ehø8va e6hå. 2e8ia e9iakt ei9a4n ei7ar. ei4c e8id. ei3d8ar e3idea e3ideo ei9der ei5det 5eidf 5eidg e6i2do e1idr ei3d4u ei7e eie5d ei8eg eie2n ei9en. eier3a ei4ert ei6es ei1fl 8eig. ei3ga eig6e ei6gev ei5gi ei6gra ei6gu 4eii ei5kaa ei3ke. ei6kee ei6keh ei4kel ei6keri ei4ket ei1kr eiks3a eik6se eik4so 4eil ei9led eil5egg e3illu ei3lo. ei9loa eil5op ei5los eil5s6 4eim ei7ma. e5imag ei4m5a6l ei4med ei6mei ei7men ei4me5s ei4met eim9ett ei6mo 8e1imp ei4n3al ei4nans ein5ant ei7nare ein1d 4e3indu ei5ned ei7nel ein9f einga6 ein3gr e4ini 6ei6nit ein3k4 e5inkar 4e1inn ei4nom ei4nov einsi9d ein4s3l eins6o e4inspi ein7sto ei2n1u4 ei3num 6einv ei2n3ø ei5or e4ip ei9pa ei3pe eip5s 2eir eir9ak ei7ren ei3ri eir5s 2eis ei5sar e4ise ei3se. eise5i ei3sen eiseri9e8 ei3s4ha ei4sil e3isk. e3iske ei6s3kj eis3ko ei3s4pe ei4spi ei4tek ei4tera ei4tere ei2to eit7ta ei6t7ut ei3tve ei6t7ø ei4vak eiva9r ei9ven ei3vi eiv5s4 e1j ejo8en. eju6la 4e1ka ekali7 ekalie6 ekam6s5 eka6ra. e5kavr ek3eie e4kero e4kes ek5e4ta e6key e5k6hov e1ki e4ki. 4e1kj 2ekk ekke7le ekk9ist ek1kj ek4kjø ekk3l ek5kok ekko5v ek6ku ek4ky e1kl e8klane ek6leg e6klen ek5let e3klu e5klæ ek2lø 4ekn ek9na. e3knek ekne7s ekni7p ek3no e3k4nok e1knu e5knø e1k2o e4ko. eko7le ekords8 eko6te. e4kov 2e1kr e3k2ra e3k4red e7kref e3kren e4k5ret. e5krets e5k4rev e3k2ri e3kro ek4ry e3k4rå ek5råd ek3s4ak ek4sal 3eksam ek3sel 3eksem ek4sig eks1k ek4ska 1eksp eks5pe ek4sta ek7s6tel ek3sti ek4stil ekst5o ekst3å ek4sæ ek6t7arm ekt3av ek3tef 5ek3tep ek5tes ek6test ek4tid ekti5m ek5tiv 4ekto ektori6a ek4t3ra e1ku eku4le. e1k2v ek4val ek6var. 6ekve e4k5ve4d e4k5vik ek4vin ek6vis 3ekviv 6e5kw e5ky eky6te. e3kæ e1kø e1kå ekå6pa 2e1la ela4ga el3agg e2l1ak e5lake elak8se. el7akt el1al e8lame el3anl e6l5arg e4larr el7arti e5las. e5lase ela4te. el5ato el5avl el3avs elbo8da el4ch el5do eld4rer eld5sle 4eled e4ledi e4ledr e3lee eleg5d ele7ger eleg8na e7leir e7leis e5leke e2lel e2lem e5lem. e5lemat 5elemen e5lemet e3lemm e3lemp 4elen ele9na e4l5enh elens3 e4lentu e5lepa 2e3ler ele8ra. e7leret e6l7erg ele3sk e6lesku e4leta e4lete 5e8lev. ele4vak 6e5levn el5fi el9ga. el5gele el5gi elg3s8 2eli e9lie eli5e6rer e4lif e4li5g4r e4l3ind elin5es e4linsp eli6o5s eli8ta. eli4tet 6e5litt eli6v7en el1j elk2 el6k5al el4ke5s el4kete el3kn el5la. el5l6ar el4led el4leg ell5eie el5ler el3le4s el6lete elli7ga. el4lisj ell7sa ell5sk ell5s4l ell5sp ell5sv el5l4ur el4læ el5m4o el5mu el5n 2e1lo elo6ka. e2lom e3lomm el3omn el3oms el1op e2l1or e3lort el3ost el4ot elo7vers. e4l5ovn el4pet el5ph elro4s el4sei els5eie el3sen el3se6s3 el3si el4sje el4skal 7elskand els5kare els1l el6sno el4spe el3spr els4ten el4sti el4stj el2sø els5øk el5s6åpe elta8le. el5te. el6teg el4tero el4t5ett el4t3op el4tro elt5rop el2tu e3lua e1lu2e e4lu4he e3luk e7lum el3ung elun6ge. e7lup elu8pe. e1lur e7lus el3utr elv3an el4ve3d el4vei el6vere elv1r 5elvs. elvæ6re. 4e1ly ely8et. el5ynd 2elæ elæ5res el9ærv e6l5æt 2elø e4l3ø4r el3øy. el5øya el5øyd e6l3øyn 2e1lå el1år e5låt 4em. e2mad emafo5 ema4ge. e4magr e2mah ema4ke. e4mako em5akti e4maku ema6le. 5e4malj e4mam e4mana ema4ni. e6manu e4mare em7ar8m e4masi e6masku e4mata ema3uk ema5ve 5emball 3embed embe6r5 3embet 6emd 8eme emei9e eme4li e4mend eme5tri eme6trisk em5e4v e4mib emi5ert e4mig 4emin emi5ni emini6st e4minor e6mir emi9sa em7je e5mju em5le emle6s em5me. em5men em8mi. 8emnd em4ne. em4ned em4nem 6emni emo5nol em1op e2m3o4v em4ped em6peri em2p3l emp9lane. em6pli empo3 em4pol em4pos em4ses emse8te. em4s5ju em4s1l em2sn em4sor em1st8 ems4te ems3u emta8la em4til e3mug e2muk e5my emy4k 6emø emø8r e5møy emå4la emå9lan emål4s em1å8r 2ena en1ak en3ald ena5li en3all en5and e5nane e6n7ang e4n3ant e5nar. en8are e4narr en3ass enat6s5p ena2v en3avi 4enb enbe9na en4d5and en4dek en3del endelø7se en5demi en3der en4desl end5l 1endr en4d3ro end3st en7dø endø4r endør5e en5egg eneg8ga en3eie en5eks e3nekt 4enem 2enen en5eng 3energ e4nesk 4enev ene7ven eng6a en7gar en4gem en4geri enge6r5u en4gle eng4les eng4r eng3s4e eng5so eng5sp engs4ti en4gut en4g5å 4enhj e4ni. e4nierk e2nif e5nir en4kera en4keri 2enna en9nal 2enne en4nem ennes6t enne4s5v enn2i enn2o enn4sj enn5sta enn7ø 2eno en3ok en3og en3om. en1op e6n5ord 2enp en4pås en4rem en5sab ens5af en6s7a6ker en4sek en4seli 5ensemb en4ses4 ense3u en3si ensi8de. ensi5ert en4sim ensle7g ens6lev en7s6opt en1st en6s7tal ens4ter ens4ti ens7und ens4ve ensvi6 en2sø ens3øk ens7å en5ta. en4tap en5te. en4tec en4teg en4tel en3ti en5tie en5tig en5tik en9tima en7timen en4to4r ent5ori ent5rab en4tre ent5ren en4t5rol entropi5 en4t3rå en6tul entun6ge. 3entus 2enu e2n7ul e4n5ur 2en3v 4enw e4ny. e2nyb e6nyr e2nys e4nyta 4e7næ enæ8m enø4k e2n3øv en5øyd 4enå en1ås en6ås. e3o6 eo3a e6obe eo2bl eo5d eod8de. e1og1 eo7gr e2o1i e2ok e3oks e2ol e4o7lo eom1s4 eon8de. eo5ne e7onk eon4kl e3ont eo2p eo3pa eo5pl eopo3 eopp5r eo3pr eor4da eo9re e2ori eo4rid eori5e6 eo4rik eo4ris eo1ro eo1s eos6l e2o1u 2e1p epa3t e6peno epe6p eper5r e3pes epe4st e4peta e6peu 3epid epi6ka. epi7kr 3episo ep2l e8plen ep5lene ep5ler eple9s6 3eplet epo6et 3epoke epp2s ep6sem ep4ses4 ep6s5lu eps1t ep2su e3p2sy ep6tin ept6r 2e1ra e4r3abb era8da. e4rael e2raf er3aft e4ra4g e2r1ak e3rake era5kl eral3u e4rama era6na. e5rande. e5ra7ne er7anli era4no er5ape. er5aper er5a4pin er3apo er5appe e5rar. e4rarg e5rasane e5rasar e4rasje e4rask e6raso e4r3ass er6ast e4ratek era7tor e4ratr er5att e2rau er5auk erau9ken erau8s er3av. er3avh er5avl e3ravn er3avr er3avs 4erb erbi9ti erbo8da erbo8de. er8byl erd2e er4ded erden8s er4dis er1dr erd4ra erd8re erd4skj erds3t erd4sto erdsto8ga er3d4v e1re er3eff er3eft er5e4gen er3eid er3eie ere6ka ere6ke. e4r3eks e6r5ekte e4r3e4le ere4lit e6relli e4r3els e9rem. e5remm er3emn er5enden e4r3eng e4r5enh e3re4o7 er8er. e4r3erf e5reri er3ess ere4t e5ret. e4r3eta eret6h ere5to e7rets 6erett eretts5 e4r3e4va e4r5e4ve e4r3evn erev6ne. e8ré 5erfari 6erfi 4erfr 2erg erg5elv ergi3f er6gli er4go. erg5ret erg5sko erg5sp 2erh erhø6re. e1ri e4riad e4riak erib3b eri3bl e4rice e2rid e5rid. e5ridn eri4kat e6rikn 4eril e7ri6ma. er3ind e3ring 6eringar ering6si er3inn er3ins er3int e5riori e5ris. e4risa eri3se e4riso e6risp e5rist. e7rista e5riste eri5stil e4ri5s6to eri5sø e4rite e4rito er7ivo er7jes. 4erka 8erke erkeri6e er4kesa er4kese er4kete er6k5ett 3erklæ 6erkn 4er5k4o 4erkr erland7as erle6ge. erle7s8t er3me ermo8de. erm1s ermå6la. 2ern er4nad er4ned er5nede er6nee er4nero er4nest er2no er3nob 2ero e3roa er3obl 5ero4b7r e1roe er3off e1rog er5oks e1rol er3oly e1rom er5omk ero5mo e1ron er5ond erono5 er1op e5rop. e7ro6pa e5ropen er1o2r e5ror. e3rore e7ro4sa 3erosj er3osl ero4ta er1ov 2erp 2err er3ra er4rae er4rel errie9n 6ersa ersa8ka ers6al er3sep 6ersj er1sk er3ska ers4ka. er8skaran er9s6karar ers5kor er1sl ers4la ers6led ers4mi er5sne 6ersp ers5tens ers5ter er7stev er1su 4ersv er4sva ers4ve er1så er4s5år 2erta er4tare er4te3s4 er5tia er3tib erti4e er5til erti4mo er4top ert5rol 4erts ert3sa erty6e ertå7ren 2eru e1rua e5rud3 e1rui er1u2k e3rum e4r3ung er3uni e3rup. er1u8r erure8 e1rus er5ut. e5ruta e3rute er5utn er9uto e4ruts er7u6v ervele8 6ervi ervs3 ervæ6re. e1ry4 e2r3ya erye7ne er1yr erys3 e1ræ e9r4ære 2e1rø er5økn e4røko er1ø4l e4r5øn e5r6ønn erø8ra e6r5ør6s er3øya e4r5øy7e erøy4n e4r5øys. er7øysk 2e1rå e9rå. erå4da erå8de. erå6e erå4k er5åke er3å4l e2r1ån er3å4p er3å4se erå6t er7åta9 e6råv 2es. e1sa es5aa e2sad esag6 es4al esa6la. esa9met e4s3ant es5arab es5arv esbi9e 2ese es5ege es3ei4d es5eie. es3eig esei8ge. e3sek e4seku esel5s4 e3s2en e5ser. e5sere e5seri e4s3erk ese5s2 e3sest e4sesv ese5tas ese4te. e5setj e9sets e4seu e4sha es6har esh9ar. es4h5er e4shi e1sho e7s8hop esi6ar esi5ert e4sil e5sili es3ill e4s3ins esi6v esi3st es3jor e5skab es6ked es4kee es4ker 8eskil e4sking eskinns5 e1skj e8s9kjer. es4kjæ e6skjøn es5k4n e5sko. es7koa e3skot e1skr e1sku esku5et es3kvi e5sky e6skyr e1skø e7skå eskå7r e1sla es4lek es4let es7let. es7lets es4lit e4s5lok es4løk es4løv es4make e7s4mett es9na. es4ner es2no es4nu es2ny esnæ5re 4e1so eso4b e2s3od e2s1of es3oks e2som e3somm e4s3ori e1s2p espa9ra es3pas es5pe. e4s4ped es5perm es3pl es4p5le es3pol e3spor es3pun es4sed es4see es4seg esse7i es6sendi es4s5enk es4ses es4sete ess5e4va es4s3ja es4sje es4skr ess4let ess3om es4sos es4spa ess5tilt es4stol ess5tor ess9tua ess5tue esstu8en. 4essu es2s1v es7så e7stad es5tae es7takt es9tala e8stane e5stans es5tant es3tap e5start e3stat es5tato e4s3tau e7stav. est5avs e6s5te. es4teg est5eie est5eig es4tek es4tel e5stell es5tels e4stema e6steme e4stemo es5temp 6esten e7steng es5tenk e8s7ter. e5s6terk esterne8 este3s4 es4test es4tien e3stif es4tig e3stik es4tikk 5e6s5tima es4tis e4stiv e1stj es3t6on e4stog e3stok e3s4tol es6tone est5ord est5ori es5trak est5rene est5rer est9ré es5trib e5stryk e3strå e1stu e5stud es5tus 8estå estå5ren estå6s est7åse e1su es5ut esva5re e5s4vek es5vig e5svikt es3vis 2e3sy esy4na e4s5yt es5øvi es7øye e1ta 4eta. e4tae e2taf etafo7 e3tak e6tako e3tal eta3la eta4la. et5ald eta5le 4e5tall etal6list etall5s6 etal4s7 et3amb e6tand eta4nen et4ap e9tapa e5tape 3etappe et8ar. et8are et5art 5e6tasjes 1e2tat 4e5tati e5tato e3tatt et5aun e8tax et1c 2ete e4teie e4teka ete4ma. e5teran ete5ru etes5i e4tesl et8et e5tet. e7tets 4eté 4eth 2eti e3tit 2e1tj e7tjer et3jø 6etl et5m 2etn et6nev etning4 etnings7 2e1to eto4er et5oppd et3ord e4tot 2e1tr e5t4rad e7t6rak 8etre e5tree e5tref e4t3ris e9tru. et5rum ets1 et9sar. et4sku etsku8le. ets7l etsla8ga etsnæ4 et2sø et4tak et4tal etta6le. ett5alt et4tank et8tap et5te. et6tei et6telt et4tenk et4tenn ettera4 etter5at et5t6erf 5etterk 5etterr ett5esk 2etti et6tia ettian8 et4til et2tj etto5a et4tr ett3re ett4ski ett4sti et3tug et4tur ettvi5se et2ty 2e1tu 5e6tui etu6na et3uni 2e3t2v e4t3va e5t6vang 2e1ty 4etz 4etæ etæ3ra e1tø e1tå etå5re e1u eu4a e8uf eug8la eu4h eu4ka. eu2ke eu5kem eu7kr eu2l eum2 e3u2n eun4ge. eu5nu e4up5a e6upk e2ur eu6rat eure4 2euri e3urn eur8na eur6ne. euro1 3europ e3urt e2us eu4si eu1ta e3uts eut7t e4u3z e1v evad6r ev5akti eva4la evann4s e4v5anta e4varar e4varb e4v5ark e6vatf 6eved eve5d6a eve5del 6eveg e5vegg evei6s5 6evenn even5s 5eventy e4veny e9ver. e5ves. e5veta e5vev. evi4e evi5ere evi5ert evin4s evi4se. evis3t e2vj ev2na evn5a4k ev7nu ev7oms e4vre e7vri. ev9rå ev1s evs8v evta8la evti4 e2v3un e5vyrk e2vø ew3a ey1 eybal4 e1y2d ey5k e1yng e1yr eyr6ka eyr4ke. e1y2t e7yti ey3tr e3zi e1zu e1æ2 eær3 e1ø4 eør6na. eøy4 eøy9an eøy7en e1å6 eåk4 eån8da eåt8t é1a é1b é1d édø4r5 é5e8 é1f é1g é1h é1i é1k é1l é1m é4n5e é5n6et é5o é1p é1r é2rj é1s ése2 é1t é1v éva8la évo8re. é5å è1r è2red è2ref è2rek4 è4rener è2rep ère3s2 è4rest è2rev è6ves ê8lan ê6ra ê1re êr7o êr9sl 1fa 4fabo fac8 fa1ci fa3de fa6de. 6fadm fa4f fa2g1a fa5ger fage4t fag5eti fa2gi fa2go fa2gr 6f5agro fag3sk fa2g1u fai5 2fakr fakse9t fakta3 fa1ku 5fal fa1la fal6kes fal4k3l fal6lers fal5m fa4lo fal4sk 4fa5mo fa4na. 7fan5d 5fane fanfa5 fang4s fangst7ev 4fank 2f3anl fan5s6 fan7tesk fan5ti fan3to fan4try 6fanu 2fap 3far 9f8ar. fa3ra fa4ra. fa4re. fa4res far4gel far4ges fa4rit far5n far6skj fart2 far4vel 4fary fa7sa fa4sel fa4seru 2fasl fast3r fa3tal fa4te. fa6t7ers fa1to fat2r fa3t6re fav5ne fa1vø 2f1b fba4ne. 2f1d 1fe 3fe. 2fe1a4 5fea. fe5a6l 2fec fe4da 3fede fe2dr fe3dra fe3d4ri fe7ene 2fef 2fe3g 2fehj fei5en fei5er. feig4de fei5ge feil5es fei4li 9fein. 7feine fei7ter 8fej 2fek4a 4fekl 2feko 4fekr fek6tes fekt5ev fe5lag fe5len fe5li feli7e6 6felik felles5 fel7læ 2felo fel5ok fel9ta. fel4tek fel4ti fel4tra fem5ak fem9b fem9ne fe4mo fem5s fem4tid fe2m1ø 5fen. 4fena fend9r 4feni 5fens fentleg5 2feo 2fe3p2 5fer. fe6ral 4feram fe5ras fer6at fer4dam fer5de 4ferea 4fereg fe4rek fer6en fe7rer. fer5ers feri6e feri8e5ne 7fern fer2r fers9kar fers7ke 2fe1ru 3fes. 2fesi 2fe1sk fe2st fes9t6i fes8t3r fes9tum fe6st9ø 4fesy fe6ta. 4fetap fe4te. 4fetea fe5ti 4fetil 2fet6r fett5j fett7s6 4fe4ty 2feu 2fev fe4ven 2feø fe6øy. 2feå 1fér 2ff f7fa. f4fab f2f3a2g f4f3ak ffa7l f6fann f4farb ffar6d ffa7re f9fas f6fat f8f9au f2f3av f2feb f2fe3d f2fee f6feh f2fem f6ferdi ffe4rer f2fes f4feti f4feto ff5eve f2fib f4fice f2fid f9fien f4finn ff5int f2fip ffi5s4 f2fj ff3la ffla8ga ff9leg ff3li f2fo ff4ol f2f3re ff1ro ff5sl ff5t4 ffu6r ff5ut f3fæ f4fø 2f3g2 2f1h 1fi fia7l fia4n 4fiap fi4as1 fibi6en fi9cen fici7 fi7di fie2 fi1er fi7e6re fi4f fi5fi fi5fo fi7fl f6ig figh9t fi7g6r 4fih fi9ka fikali7 fikalie6 fi7ken fik6ka fik6k5n fi5ko fik7sa 4fiku fi4la. fi3li fil6lel fil6leri fil4les fil7leti fil8m7at fi1lo filt6re fil7tres fil4tri 4filæ fin5art fin5d fi4ne. fi5ner fing3r 6finj finn5ei 6finnsa fi4n3o fi9nor 2fins fin6sleg fin6te5s fi2nu 7fio5 fi2r fi3ra fi6ra. fi9rene fi5res. fi3ri fi5s4a 4fisc fi6se. fiser6s fi8si. fi2sk fi6ska fisk5a6d fis7kal fisk5and fis6kart fis6k5end fis4k3l 6fiskol 6fisku fis5ti 6fistu fiti6me. 4fitr fitt5s fi7ty fi4ve. 1fj f1jeg fjel6lend f5jen fjer5ne fje4sk fje2t3 f5ju fjære5 fjæ4res8 2f5k6 f2l2 f5lag. f6lagg fla7ke f4las 2fleg fle6i f4lek f6lel fle4sl f4lett f3lev fli7ne flis7t flit9t8 1flo flo9ga flok9s flo2m3 flo6r5o flos6kl f6lu flue3s flus8 fl5ut 3fly fly3s4 f3løn flø5s 1flå flå9sa flå7se 2f1m fn6 1fo 2fo. fo9ar 6fobs 2foe 4fof foi7la fo8ke. fo6la. fol4dr fo4le. fo5led fol6k5v fol9ler fol5lese folke5s6 fol5li fo4lu 3fon fo4na fond2 fo5ne fo3n4id fo4nin fon1s2 f1op for1a for9drev for7dro for5d6u fo6re. for9ei for7e6n for5ent for5ess for4et for9e8te. for9e8ten for9g6 forh6 fo4r9in fork8 forlo7v forlø9pa forlø9se formo9r for3n foro6 for5p for3se forsi9da forsi7de. for3s4m fors8t for9ste fors4v forta8le. for5t6e fortei9e for7t6i forti5da for3t4v for3u4l for7v6 forva9re for5æ4 for5ø4 for9å fo9se fosfo5re 4fosj fo4ta fo6te. foto5 fo4tok fo4tom fo6top fo4tor fot3s fots6v fot3t 4f1ov 3fô 2f3p2 fpo6e fr2 1fra fra5l fra4m5e fra6mi framma8ne. franko5 fran7se fra7r8 fra1s fra5se. fra7sep frasi8e fra7sk fras6p fra7v fra7v6r f2re. fred8sel freds5t fre4e3 8freg f4rek fre4m5 fremma8ne. frems4 fre7ne fre6sk fres7ko. fres5koe fre8s9v fri5a6re 6f5ridi fri4erf f1rin fris6ka fri5s4p fri5s6til frite8re. friti8me. 6froc fro7f fronta9le fro8st frus1 fruta6le. f1ryt frø5b frø7ko frå9r fråve4 2f1s fs2h fsho6 fsi2 f5sjuk f2sl fsle6ge. f4sm f2sn fs7ne8 fs5ov fs2t f2s3tab f6s5tan f4s9v 2ft f1ta f3ta. fta7f ft1ak fta8la. ft3alg f2t1am f4tana f7tane ft3anl f5tar. ft8as4 f6t1av f2tea f3ted f4tee f2teg f2tei f2tek f6tem fte4na ften3d f4t3enh ften5s6v f2teo fte4r5a4 f4terin fter5s f4test f4teta f4t5ett ft3ind f2t5i4s ft5l ft7n f2t1o2 f5tog 3fton ft3r fts5alt fts3ei fts5ers fts5erv ft2s1i fts1k ft2skaf ftsla6ga ft5s4lan ftsle6ge. ft3sto ft6s5top ft5s6tri ft5stø fts1u ft2s1ø4 ft5t4 ftta8ka ft1u 1fu fu8ga. fug9le. fug6l7eg fu6le full3 ful9lar fulle6 ful9le. ful4len fullen8de. ful4ler ful7les fullfø7re funn2 funns3 funnsla8ga fu6ra. fu6re. fu9ret fu7ro furu1 fu7sel fu6sk fus6o7 fu4s5t fut4h futu1 4f1v fva8la 1fy fy5la fyr2 fy8ra. fy4r5a4b fy1re fy4re. fyr7k fyr8ke. fyr5t fy3s fysa7 fy8sa. 2fæ1 1fø fø4da. fø4dek fø5den fø4des fø5des. fø1f 2føk fø4le. f8ør før6a fø5rar fø4re. fø4res fø7resv fø8rete før6tin 4få få7ren få7ret få5ri får7u få7va 1ga 4gaba ga1bo 6gabø ga3da ga4ded 4gadg 2gadm 4g5adr ga4e5k 6gaflo g3aft 6gah 6gak g1aks gak8ta. gak8te ga3kv ga1la ga4la. galei5 ga7len gal4les 4galli 5ga7lo ga4ma. 4gamb ga5mer gamme6l5 6gand. 6ganden 9gane gan5g6en gan4g5j 4gan5k 2g1anl 4gann 4gansa 4gansv 4g5antre ga6pa. ga4pe. ga4p5l gap3s2 ga6p7u 9gar. ga6raf ga6r5ak 2garb 5garbr 5garby gar4dek 7gare. 4garea gar5es gares6ke. gar2i 4garki gar3ne gar6ta. g5arte gar8te. g3arti gart5s6la gar4un ga4ryl ga4sc ga5s2i gas8ka. gas8ke. ga6ski 4gasp gas6sel gas5sen gas7ser gass5ett gass3l 5gast gas5te ga5sto gas7t6ra gas9tri g2at ga4te. ga5tens gate5s ga3ti ga1to ga3tr gat6tap gau5la. 9gav. 2gavd 6ga4vei ga4veri 4gavg g5avk 2g1avs 2gavt 4gavv 2gaw 4gaø 2g1b gba4ne. g6byk 2g1c 8g1d gd5alt g6d5au gde3a g2deb g3deba g4dedi gde5lo g2dem g4dend g2de5o g4dera g4de5re g6dero g2des g2det g3det. gdevi8sa gd5op gd1or gdy4d g6d1øy 1ge 2ge1a geak8ta geak6te. gea7ren ge4ark 2geb 6geba 4ge5be 3gebri 4gebrå 3gebyr ged4 4gedan 6gedel gedia5 9gedom. 7gedoma 9gedome 7gedomme 6gedoms 4gedos 2gedr 2gedy 2gedø 2gee geen8de. 2gef g5eft 3gefæ 2ge1g2 g5egg g3e2gn 2geh gehø8ve. 2gei g1eie g4e1in gei4r3 gei9re gei8s7p gei6st5 3geit geit3a geit3o gei4t3r 2gej 2gek2 ge9kl ge3kn g1eks 6gekt 5gel. ge4lar 4gelau ge6le. ge7lea 4geled 4gelei gelei5er 4gelek 4g3elem ge5len. ge5lens 5gelet gel5ett 3geli 4gelid 6geligg 4gelit 6geliv 2gelo ge5lov 7gels4 gel3se gel5si gelsk7l gel5t4 4gelu ge5lun gel7ve 4gely 2gelæ 2gelø 2gelå 5gem. 2gema 9gema. 2gemi 3geml 4g5emn gem6na 2gemo 9gemr 3gems 3gem4s5t ge3mu 2gemy 2gemø 2gemå g2en 3gen. ge2n1a ge7n6am gends6t ge3nea 4genem gen5erf ge5nes gene4t gen5eti 4genev gene5ve. gen8ga. gen5gr ge4ni6n 6geniv gen5k genle6ge. gen3n gens5l gen6sun gen5tr 4genum 4geny 4genæ 4genø 2geo 5geog 3geol geome5 geomet4 ge5on 6geop ge9ope 2gep g2er 3ger. ge5ra. ge6ral ge4r5ant ge9ras ger5di 4gered 4geref 4gereg 4gerek ge6rene 4gerep 6gerese 4gerett ger4i5d 4gerik geri8ka 6gerike ge4rim ge4ris ge4rit ge4riv gerle9g g9er8ma. ger3n gerne6 4geroa 4gerom. 4geromm 6gerop. 4gerope ger5p ger4s5af 5gerud ge5rup ger5v gerø6re. ge4r3ø4v 4gerå g6es 5ges. 2gesa 2gese 5gesen. 5gesens 4gesi 4ge5sja 4gesje 2ge1sk ge1sl geslu7 ges4lø 4geso 4gespe ge4spr ge5spra 2ge1st 3gest. gesta7b6l 5geste. ges6tekk ges8ti. gest5rid gestri8de. 6gestå 2gesu ges5vik. 2gesy 6gesæ 2gesø 2ge1så geså5re 5get. ge5tak geta6le. 6getat. 6getate 4ge3te 5gete. 2geti 2getj 2geto 2getr 5get5s 2getu 2gety gety8e 2getø 2geu g2ev 2ge7v8a 2geve 4gevir gevi6sa 4g5evn gev6ne. 4ge5vo 5gevå 2gey 4geæ 2geø 2geå 1gé 2g1f gfe2l 4g1g g6g5al gg5ask g2g1av g4gedi gg1ei g4gela g4gele g2gem g4genu g6gerei gge4rin g4gerø gges6b gges5l g4gesm g6geso g4gesp g6ges6tio g6ge5sv g2gev ggie6 g4gif g4g5i4m gg4je ggje5s g2gl g7glu g4gn g2g1o2 g3go. g5gos gg3rad ggra6da gg5rat gg8re. gg3red gg7rek gg5s4par gg3sto gg4sy gg3sø g7g8ud g4g5u4r 2g1h ghe8n ght5ene gh4to ghæ8 1gi 3gi. 4giak gi1ar 4giarb 6giav 2gib gi8c 2gid gi3de gi1e 4giek 3gien gi9end 5gier 4gifa 2gifo 4gifr 4gifu gi6ga. 2gigr 2gih 2gii 5gika 3gike 4giki 3gikk gi5k4r 4giku gi5le 4gimess gi4metr 4gimi 4gimø 2g1ind 6gingeni gi4nin 2g1inn gin5nu 4gino 4g1ins 4g1int 2ginv 4gi5om 2gi1op gio4r 2gip gip5si 6gira gi3re gi4re. giro3 gi6rob 5gis. 2gisa gi3se 4gisel 4gisen 5gisk 6giska gis8lu gis4lø 4giso 4gisp gi3s4pa gi5s4pr giste6ru gis5ti gist5ra gi5stré gi6st5rer 4gistu 6gisty gi5ta 4gi5te gite4s gi2t9r git5te 2giu gi7va 4gival 4givo 4givu 1gj 2g1jak g5jarn 2gjaz gje5f 4g3jeg gjels4 gje2n gjen1opp3s4 gjen5s8 6gjent 3gjer gje7sk gje4s3p gje8v9ak 2gjob 2g1ju 7g6jut gjø9de 2g3k2 gkly9 gl2a 6gla. gla3de 4glag gla4ga gla8ge. g3land g1lar gl5art glar7v 1g2las 7glase g6lass 6glast g5last. 3glat g5lau gl6e gle6dero g2lef gle3ge gleg8ga 6glei glei7er. g2lek g7lek. g5leke g2lel 3glemt 4glen g9len. g9lene. g9lenes g9lens gle9pl 4gler gle4ra glere8de. g9les. gle6se. g4le5sk g6le7sm 4glet g2lev 1g2lid gli4del gli7e6n gli8er glig1 3g2lim gli9me 4glio glitt4 6g7liv 4glj gl7ja gl5l g4lo. g2loa 5glob 5g6lome 1g4lor gloria7 glori6an glorie7ne g4los glo5ste 6glov gls4 5glug g5luk 6glun gl5ung glun8ge. gl5ut g5lyd 3glyf gly4se. g2løg glø8pa 2gløs gl7øy. 5gløym 2g1m g4mete g4metr g5mé gmini6 gmo4e g3mu gmu8le. gmå6la g1n gn1ak gna5lem gna4lo g2nav gn1d gndø6 gndør5 gn4e g2nee g4nelo g6nero g6nerø gne1s4 gne8se. g4nesk g4nest g5net g6netr g2nev g4nib g4nid g6nik gning4 gnings5 gni4s g6ni5sk gni6st gnist9r gn5k4 g2nom gn5o6p gn7o6v gn5r gn1s gn4skr gn6sm gn4som gns4pr gn4sti gn2s1v gn5t4 gnu5re gnæ6re g2nå 1go 7goan go1ar 7goar. 2gob gobe5 go4da go5dal god5ar 2godd go4de. gods9t 2gof go9ga go5ge. go9g8r 6goi 2gok gok4se. go3le gol6fa go5lo gol4va gol6var go4lå 2gom g7o6ma 6gometris 7gomm go4n5and go9ne. go7ni go5nok gon9s 2g1op 3g6or4a5 go5ra. go7rae go7ras 2gord gor6da go1re gore8a7 2gorg g4ori gori5e6 g5orv gor8va go5rø gos3p 4gost 6goto got6r 4gov go8ve. go8vi. 2g3p6 1gr4 8gr. 4grab 6grac gra5ce 9grads graf5f graf5t6 gra4m5 grand3s4 gran5to grant4r gra9se. gra9set gra6sk gras3t gra5t gra8te. grati4s gra4u gra4v3ak gra7vis gravta8 2grea 4g5reds gre4en 2gref g7refe g4rega greie5n grei6ene 6g3reis 4grek 2g5rel g5rent 4grepi grep4s3 g7rese gres6sak gres6sent 6g5rest 4grett 4g5ri. grib3 4grid 4grif 4g1rig gri5sete 4grit gro9ar g4ro7i grom5m g4ron gro5sk gro3ve 4g5rui 4g3rul grun7g 5g4rup gru7sa grus5t 2g1rut 2gryd 4g5ryg 6g5rytm grø5de. 6g5rør 4g5røv grø5ve 4grøy gr7øy. 6gråd grå6da gråk4 grå7n grå5te. 8gs1 gsa2 gs5akers g7sal. g7sale g5salg. g5salge gsam3 gs3amb gs7amn g3s6ank g5sard g2sas g7sast gsbø6n gs2ce gs5ef g2seg g2sei g2sek g5sekr g7sekv gse9la. gsel4s5a gsel4st g2sem gs6ende. gsen6ke. g5sens g3sent g2ser g5ser. g3seri gse4st gse4t g3sete gs3eti g9sets gs4ett gse2v gsfø2 g2si g5sider gs5is gsi2v gs4jar g3sjef g5sji g2sjo g5sjå gs4ka. g5skad gs4kal g5skall g6skam g4skan g4skapa g5skape g4skapi gs7kav g5skilt g7s4kj g7s6kjæ g3skot g5skren g7skug g6skv gsla6ga gsle6ge. gs6leri g4sluk gs4lun gsl9ut. g5slyn gs5med g9s6mert g7snel g5sog gs9ope g5spal g3spel gs2pi gs5pik g3spil gs5pile g6s5pors g3spur gs3s4 gsse4e gs5tak g9s8tand g5stang gs4tasj g7s4tat gstatsrå7 gst6e gs5te. g5ste4e gs4tell gs5tema gste6ma. g7stemt gs4tere g5s4terf g5s4terk g5s4tern g5s4ters g5s4terv gst7evnen g5s4ti. g3s4tie g3stif g3s4tig gs5tiå g5sto. gs4tol g5stol. g7stola g5stole gs5toll gs4trap g5strau gst5rea g5strede gst5rei g5streke gs6tret gstri8de. g5s4trof g3strø g5s6trå g5stue gst5ut gstyr8ka gs4tør g5s4tå gsu2 gsu5g gs4vane gs5vik gs7væ gsy2d g7sym gsy6na gsy6t g2sø gsø6ki gs6øt gså4 2g1t g3ta gta8ka. gta8ke. gta6la. gta4le. g9t6e gte6ke. gte6ma. g3ti gti8de. g4t5if gt6re. gtråd5s6 gt7sv gt5t gtu8en. gtvek8 gty8e gt9yt 1gu 4g5u4bå gu2di guds3t gu4el 6gug g5ug6l gui4d guid5ar gu4le. 4g5ulk gul8ke. gul4la gul5o gul7ø 7gum gun4g gur2g gu4ri gur8na gur6ne. gu5rua gu3rue gu4st gu1ta 2gutb 4gutd g5ute. 6gutg g7utl 4gutn 2guts gut4tak gut4tes 4guttr 2g1v gva4ke. gva8la gvedli6 gvi8ta 6g1w 1gy g9y8a gy4da. 7gym gy3ne gyr6 gy8sa. gy6se. gy4te. gy4ve. g5æt 4g5øk gør3s 2g3øv gøy9a gøye6r gøy5n 1gå gå6as gå6en. gå4er. 4g5å4k 4gåm 4g3ån gån8da 2g1å4p 2g3åre gå2s gå3st gå9ven gå4vet h2a ha4a haba9 4hae ha2el 4hafi ha2g ha3ga ha4ga. ha3gen hai1 ha7ism ha5ka ha4ke. ha5ken ha7kera ha4ke5s ha1la ha6la. hald4s7 ha4le. ha4lev hal6lei hal6lø hal4s3k hal4so hal4s3t ha5lu hal4v5 ha5ma ha8me. ham6nest ha5mo ham4st hams4t7r ha5na han6d5r hand7skr hand5ø ha4ne. hani1 hanis4 han2n3 han4ne han6nel han5nen han5n4o5 han3se han4sk ha4pe ha4re. ha5rei ha4rel ha3rem ha4res har5k ha5rov har7se har5tre har4tri ha4sj hasj5e ha2sl has6p7l has5v ha3tar ha4te. hat6le h4au hau5ke. hau6st hau4t5r hav4a ha4va. ha5van5 ha4ve. ha4veg ha4vei have3s ha1vi ha4vo hav4sl ha6vu6 hav1ø 4havå 2h1b hba4ne. 4hc 2he. he2a he7ans heat4r heb5n he4de. heder6s5 he2d9r hef9ta hef7tes he3ge he4ge. he2g3r he2i heia3 hei5en 3heim he3ins hei4sk heit4s he2k hek4sek hek6serin hel1a he4la. he4le. he4l5ei4 hel6lesu hel3o hel2s2 hel3sa hel4se7 helses4 hel3sk hel5sp hel5ste hel3sv hel4tes hel9ve he4mak hem5ne hem3s8k henfø5re hen5o6 hen1s2 hen5se hera9da he5ret he4ri. her5j herle9ge herli9ga 4her5n he1ro he4ro. hero9a her7p her6rei her6resi her6ret her6ska. her8s7kare her6sv her5un4 he2r3ø he4se. he2sp hes7pa hes5pel hes5pen hes9per heste5ri hes4tes he6stø het2 he4te. he5t6i het4s3a4 het4s5p het3t he6va. he6v7arm he4ve. hev9na. 2hf 2hh h5hu hi5ao hi4bak hie4n hi2et hi4f1 hiff2 hif9r hi6ge. hik7e himme6l5o hi6n7an hin4nes hins4 hins9ke hi4pl hip3p hi1ro hi2s1 hi9se. hi3sen hi5s4i 4hisk hit7o hi4t5r hit5ti hi8va. hi4ve. hiv1s hjar4 hje4 hjem7e hjorte5 hju6l7 hju7l8e 2hl h5lan 2h1m hma8n 2hn h2na hne6n hn1s h4o ho5ar. hob6 ho6da ho4de. ho5den hode3r ho5der. ho5dy hof4f3 hof4f3a4 hof4f3e4 hof5f6er hof4fi hogs6 hog6str hog7stra hoi5 ho2la ho5lag ho5lan ho4le. ho4lin hol5l ho4lom hols4 ho4lu hol7ut ho4me. ho4mo. ho4mod ho4mos ho5n6o ho4o ho8pa. ho4pe. ho8pi. ho5ra ho6ra. hor2e1 ho1ro 2hort ho4s hos5a ho5sen ho5ser ho5si5 hou2 ho1v hove5re ho4vé 2how h1p 2hr h1ra h1re hri5ne hri2s3 6h1s h5s4e 4ht h5ter htere4 h1tr ht5t hu4da hu4d3 hud5s6 hudså9re hu4er hu6et. hu4ga hu4ge. hu8ja. hu6ka. huk8ra hu4la hu4le. hu4leg hu5les hu4lev hu5ma hun6des hun2n3 hu1ru4 hus1a hu8sa. hu5s6a6r hu6s7arr husa7r8e hu4se. hu4s3ed hu2s1i hu2s5j hu2s1k hus7m hus5s4 hus1t hu8str hust9ran hus4tre hu6sty hu6s5u6 hu2sø hu4va hu4ve. hu4ves hv4 hva5le hvas5 hve2r hver3a hvi5l6i h4v4ir hvits4 hvo2 hvor5 hvor5i6 h6y hya3 hy2bl hyd4 hy2e hye5ne. hye9nes hyg5gel hy6la. hyldes7 hy4le. hyr4des hys3 hy8sa hy4se. hy2s1j hys5t hæ5g hærfø9 hær3s6 hø4e høf5 hø2g høg3ri høg7rø høk6 hø6le. hø4na hø4ne. hø5rar hø5ren hø5rer hø4res hør6sp hø2s høst7a høst5ø hø1va hø1ve hø1vi høy5a6 høy5k høy7n høy7rar høys4 høyse6te. h6å hå7a hå8le hå6na. hånd5skr hå5nel hå6pa. hå4pe. hå4p5l hå1re hå1ri hår3s hår7u hå8va. hå4ve. ia9al i1abl ia1bo i2a3de i1adj ia5d8r ia1g2 ia2ge ia1in ia1kr i1aks iak8se. ia5ku i1al. ial1a ial5ein iale4t ial5eti ia4l5ett i2alf ial3g ia4lin i4alk ial3op ia6lov i5als. ials4t i3alt. ial1u ia2lø i1an. i2ana ia4nal ian5ald ia5nar i7andr i5a4ne. ia8nes ia7net i5ank i1anm ia2no1 i1ans ian3sa ian3sl i1ant ia7nø ia2pa i3app i1ar. iar4do iard5s4 iar4du i2are i5area ia5r6e8l i5arn. i9arns i7arska i6asi i1asm ia4sp ias3s6 i3assi i1ast i7ast. ia1t ia5te iat6r iaty6ra i1att i7auk i1av i1b2 iba4ne. ib5bo ib3bu i3bere ibe4ro ibi5er. ib7lar i2b3le ib4leg ib4le5s i5bo ibo4e ibo7n ib4r ib3st ib8t ibya7 iby9ar. 8icanarar ice5ne i1ci ick1 ick7ete i1co i5cy 2ida i5dal i3das id1av id3del iddel5u id6dep 2ide. 3ideal i2deb i6def id5e4ge i7deki i9del. id3elv 2iden i5dend iden5sv 5identif 5identit ideo3v i6derap i9de5re. i7deren i9deres iderla8ga iderle7g i7dern i5ders i6desm id6gem id4ges idi4en 1i2dio i8dj id7jer id9na 1i4dol id9ran id5reg 4i3drev 2idri id2s1 id5sam idse4 id6sel id5sim ids5l idsla6ga ids3t id4s5tu id2t1 i2d1un i2dy 3idyl i3dyr i3dø i6d7øy id7å 2ie ie1a2 i2ed i1eff ie4ge iego4 ie1i iei6d i1eie i3eig i5eini iek8l i1eks ie5l6a i2ele i5elem ie4lev i7e6lim i1els i9elt ielø8pa i8e9ma iem7b8 ie3me i1en ie7na i2end ien6dela ie8né i2e5ni ien7n ie5no i5ens ien4sk ien4s5v ien4t3r ie5nu i6eny ie4ran i4erd ie6re. ie5reg ie4r5eng i6eret i2eri ie4ril ie4ris ie4riv i2erl i6ero ie7ro. ier4ra ier4sp iers3v ier5t ie3run ier5v i2e1s i6es. ies4c ie3se ies5s ies4ti i8es6v i1et i2eta i5e4tabl i3etat ie9te ie5té iet4re ieu2 ie7ved 2if ife4s1 if2fa ifi6e ifjø8 if3le if4les iform4 if1re i8ft if4tal if4tere ifte5s ift2s i3fø 2ig i2gae ig3ann i7gark ig4art iga3ru iga7te ig3att i2gav ig3d i6geb i6gedi i6gedomm igedoms5 i2gem i3gen ige6no i5gers i4gerø i4gesp ig3e4ta ig5ett ig4ged igges4 ig4gra igg9s2 i6gh i2g1ia i5gib i4gim igion4 igje9va ig1l igl6d igli6se. ig5loa ig5neu ig5no igof6 igo5fr ig1om igo4no ig2ra ig2re i2g1rø ig3råd igrå5t igs4al ig5sel igs2j ig5s4ka ig3s4kr igs4mu ig3s4pa igst4 igs4ta ig4ste ig5stek ig7stel ig5stem igs4tra ig5s4va ig1un ig9ut i3h ihen3 iho7le. i4huk ihu9la ihu5le. i1i i5in i7is. i6ita i1j 2ik i1k2a i2kab i5kabel i2kaf i2kak ikan9d i2kao i4kapo i5kar. i5kara ika5re i4karei i6kasa ika3sp i2ke. i2ked ik9ei i9keleg i5keli ike5lu i5ken. i4kena i5kene i9kens i3ker. i4kera i5kere. ike5ri ike4r5o i2ke1s2 ike3si i6kesk i5keso ike5su i5ket. i5kets i1ki iki9ne ik5inn iki5st i1kj ik4kaf ik6kana ik4kap ikk5arv ik4kas ik4kat ikk5att ik6k7ent ik4keru ik8kesk ik4kest ik3kjø ik4kjøp ik4kl ikk5lag ik2ko ikk5ord ik4kr ikk3re ikk5sv 4ik2ku2 ikk5und ik2kv ik6ky ik1l i5klæ i1ko i2koa i9koar i2kob i4kod iko5de i2ko3f i4kog i4koh i2kok iko5na. i2koo i5k6ord i4kore i2kov ik1r ik4rak ik5rem ik5robe ik3ros ik2ry ik2sa ik4sek iksmå8la ik7sot ik5spel iks5ti iks5to ik8stu ik4tav ik4teg ik2t1r iktsla8ga i1ku iku6le. i6k7u6t ik1v ik4vin i1ky i3kø i3kå ikå8pa i1la il5adr il7af i2l3ak il3al i4lana il6and i4lark il3art il5ass ilas5t6 ila5t il5av il4dak il4deko il4dete il7dj ild3re ildsfa9re ild3s4t ilea9r ile8are i3le7e i2lef ile4ge. i4l3egn i2l1ei i6leig i2lek i2lel i4leno i4lero ile1s i4lese i4le5sk i4lest ile6tri ilet5te ile4tu i1lé ilfø5re il5ge il1gl i4lid ili5ers ili9ga i5lik i2l1im i4l3ind i7line i4lins i4l3i4r ili5s6tik il3ja. il1je il5jese il1jo il1ju ilke3 il5ker il4kes ilk4o6s il5ku il4lab il6lam illan8da il6lap il9lau il4lee illei9e il6l7ender il6lesk il4lev illi9ga il4lo5m ill3s2 ills5kå illæ4 illæ9re. il4m5est ilm5e4v il4mi ilm5s i1loe i9lolo i4lom il5omv i5lon il3opp i4l1o4r i5loso ilot3u i4love ilo1w ilret4 ilset8je il3sl ilsla7 ilsle7ge ils4mu ils2p ils2t il5str il7su il3s2v ilsva9ra ilsva5re ilta9la ilt5rett il6t7å ilu4h i5luk il7ul8 il3un i5lur i9lus il1ut il5v6 ilve8d ilve4r i1ly il1å8 ilår6 8im. 4ima i2mad i4maen i2mag i6m5akk i4mako imal8n i2mam i9man i2map i5mar. ima5s i4matr i8mb2 i4mee i2me1g i2mek i6melu im5enh im8et i9met. i4meta i4meti i6mey i8mé imi9la imini6 i7mj im4lev im8l9u im5m i6mog imo9l im5ord imor8da im7o6v imp2 5imperi imp4l 1impo imp9s impse8 1impu im4ref im4rek im4res im9se ims4k5l ims3kr im5s4me im1s4t im6sti imta8la 4imu i3mø2 2in. 6ina i4nag in5agg i5nakk ina4let i4na2m in3ame in2an i9nane in5ann i2nap in5app i5nar. i5nars i4nask i4nasp i4n5ass ina4t5ak i6nau in7auk in5avl in5avr ince2 in7der 6indig in4dog ind9ra in3dru indr5ø ind5sk ind3sp ind5s4t 5industr ind7å 4ine ine8are i2ned inedy6 in5egg in5eid in3eie i6nele ine4li in7eng ine8pa ine8pe. i7nere. i5neren i9neres ine4rik i7nern i5nert i5nes. i4nesk ines8ka ines8ke. ines4st ine5s4ti i4nesø i2nev 8iné 3infek in4fos in4fot infu9 4infy in4g5ald in4gav in5gebj in6gem 5ingeni in5geri in4geru in3gev ing5jen in4goa in4gos in2gr ing5rep ing7ris ing2s ings5om ingst8 ings5v 6ingu in2g5ø i7nia ini9ar. i2nib i5nie i4nif i2nig i4nil ini7m i4ninn i2nip i4nisa ini3se i4nises 5initia i4nito 5injek 2ink in5kel in4kero in4k3la in4kok in5l inla8ga 2inn. in4nal in4nem in4nerø in4nesi innes6t 4innet in6n7ette innfa9s 1inng 5innhal 3innho 2inni4 in4ni. in4n5om in5n6ova inn1s4 6inns. 3innsa inn5se inn9sen inn9ste inn7sve 1innt in4n5u4 4innæ in2nø4 2ino ino5a i5noar i4nod inok6 in7oks in1s 4ins. 8insa in9sa. in7sal in5sar in5se. in4sek in3sen inseri8e9ne in3si insis5 6insj in4sja in3sje 4insk in9s8kas in5skat inske4t ins4ki in3skj ins5kjøt ins6kor ins4k3v ins6kø insle7g ins8lega in3slo in3s2lø in5s4ma in3sop 1insp in4spa in5s4pl ins4po 5instal in8s5te. ins5ten. ins9tens 3in3s4ti in4stin 4in3s6to in5stra inst5rel 5instru in6stå in7sul in2sv 6in3sy 8int. 2in3ta inta8la 4inte. 5in7teg in8t7ege in5ter int5ess in5te4t5 4in5ti inti5me int2r intran4 int4rer in5tres 6inu inu6i i8n9ul8 in7ut. in9u8te 1inv 6invev iny4i iny4t 6inø in7øk i7nøt in3øv 4io io1a4 i2ob io4dere i1off io5gn io1i i1oks iol4 io3le iol7jen io3mu io4nans io4narr io6n5erst ion3g4 io4nin io4nu io1pl i1opp io5ra. ior8da io1re io4rie io4r5in iorla8ga iosk3v io1st iota6le. io3t4e io4tra i5pap ipa4ti. i4pee ipela9 i7pe6p i1pi ipi1e ipi9ne i4p5ings i1pl i2ple ip4peli ippel7s6 ipp6lan ipplæ8re. ip2pr ipp4s3t ippsy8na ipp4sø ip7pun i1pr i6pra ip5ru ipru8te. ips1a ipse4l ipsfø5 ip2si ip2s1k ipsle6ge. ips1t ip6tar i5py7 i3pø 2ir i1ra i9r6and ir5ark i9rast ira6tr ir5de ird5s i1re ir3eie ir6ek i3repo i3rer ire6r5a ire7st i3ret i8reto ir7g i1ri iri4a iri8ka. ir3ind ir3inn ir5inst iri9t ir5ka. ir4kat ir5ker. irke3s6 ir4kest ir4kle ir5kv irk5ø ir4mag ir4mal ir4mast ir9mé i5roa i1roe i4roi i1rol ir5opp iro1s ir3re ir7sko irs2p ir3s4t irt6 ir3ta irti6g5r i1ru ir5u4k iru8m iru7sa. i1rø i1rå ir7å6l i1sa i4saks i4sanb i4s3ang is3ann i4s3ans is3ant i7sas is5aud 3isbry is6cen isch5 is3co i5scr i2sed i4seel i4seen ise5ern i2s2e3g4 i2sei is3eie is5eig ise5is i2sek i3sekt i4sekte i6s7eld is4e5li i2sem ise5ne i4seno isensi6 i5ser. i5sers i2ses is5ess i4sete iset8je i2seu 8isé isha7ne 3ishav is4h5in ishø9ve isi6ene is5ild i4s3ind isis5t is7jun is9ka. is3kal is3kar isk9art. isk5arte i8ske is5ke. is8kee is4kel isk5els iske5s4 is3kje i3skjo iskla8ga is6k5le isk3lo isko5g is7kogr is3kop is3kot is1kr is6k5rin is1ku is4kul i5skula is1kv is4kvi is1l i6slu isl7ut isl9øy. i5smak is4med ismo5e i6smus is5ne is5nu 1isol 6isold 5isomo is5omr iso3pa iso5pe iso7pr 3isot is1ov is1p is4pan is5pane. is6pis is7pru is4ses is5si issis5 is6s7kj is4sko is7skr is5sky is4skå is5sok is7sto is6sve is5svo is9s4ær is4søk i5stab ista9le is5tane is5tap i4s5tar ist5avb ist7avi i2ste is5te. is4tek ist5ekt istel5l iste6ma. ist6en is5ten. is5tene is5ter. is5tern is6terø is6té is4tik is5tilb is5tis is3tok is3tol i2str i8s8tre. i4st5ren i5strer i6strer. i4stres i6stret is3try is3tus 6isu is5uf is5ul is1un is1v is4vak is7w isy8na isy5r is5yt i2s1øk i4søy is7åk is3år i1ta ita4l3a ita6l5ers ita4lo ita4ly i6tang itan7s6v itau4 i4tav i4tec i2teg ite8ke. i7teky i6t7elg i4teni i2teo ite3re i4tero iter6s5 i4te5ru i2te1s ite6se. itet6s5 i1té it2i iti6er. i4ties i2tif i4tikam i4ti3kv iti5me i2tio i2tip iti3r i4tisa i4tisen i4tisi i4tisj i4tisko i4ti3sp i4tist iti5str i2tiu itiv4 itivs5 it7jaran it7jer it7ji itma6le. itnes4s i1to ito9a i4tom it5ord ito4s itostra6 ito8v i1tr i4tra. i6trae it3rel it3ren it5rim itri8ma it3rin i5tris it7ro6s it1sa it4s3ei it3ser it6ses it5sku itsla8ga it1sn it6sti it3sun it4tag it6tak it4tal itta9la it6tann it6tap it4t5at it5ted itte4l5o it4tenk itte5s4 itt5ett it4tid it4til it4tj itt1o it6tof it7ton it4tr itt5skr itt4sø it4ty it7tys i1tu itu5e itær1 i1tø i5tå9 i1u iu6a iu2b i5u6l i5um. ium4f5ar iu2m1i ium5m iu4mo i6umse i4um5s4t i4umsu iu2n iu8p i2ur iu5se 4i1va i4vad i6vaj i4v3aks i5val iva6la. i4vana i4v5ank i4varb ivar5s6 i4v5ass ivat3t i1ve i2veg ive6ge iv5eg6n i4vei iv7eig i2vek ive4ra ive5ras iver5d i6veret i4vesk i4vesti i6vesv i6vetø i2vev i1vé i1vi iv5ins iv5is. iv5isb ivle6ge. iv3n i1vo iv7om iv3r iv4sal iv2si iv2sk iv2sl iv2sn iv4so ivs5v i2v3un iv7y ivyr8ke. i9væ iv7åpn i1wa iwi5 i5wie6 i5y iyr8ke. i5za. i7zas i4ze i1zo i1ø i1ø4k i1ør. iør5i iør5s i4øs iø3se i1øy i1å4 iårs7l iåt4te. ja1ak ja9ar ja4da 1jae ja7en 5jag. ja4ga. ja7gar ja4ge. jag6r ja4ha ja4hv ja4j jak4kel jak7kele jak4ko jakk5s4 ja1k8r ja8kre jaktel ja7ku ja3lo ja1lu jam7b 6jambi jamhø8ve. 5jamm jams2 jan4gr j5anl ja6ra. ja6r5ap ja9rek jarn3s4 jar5ta jar5te. jar5tet. jar7ti 6jarø ja6rå ja7se ja8ski ja5sti ja5ta jau4ere ja9vi 1jaz j1b 2jd j2e 2je1a2 je5ak 2jeb jeb9b je4deb 6je4dek 4jedr jeep1 6jeev 2jef je4f3et je2fj jef5lag je4f3re jef4sa jef6s5i jef3t4r je5ge jeg5ge 6jegl jeg6les 4jego 4jegr 4jegy 2jeh je1i je5i8s 4jej 2jeka jek6keru 4jekl je4kli 2jeko jekt3a jek4tan jek6tes jekt5ev jek4t5in jek4t3r jekts4t 4jekø 2jel je6legr jelei7er je7lele je4les jel7ge jel6lag jell5ang jel5len jel4lo jelt3 jel4tr jel9ut jel7va. 2jem je4mia je4mit jemp6 jem5pl jem5se jem4sti 2je7na jen1d 4jendr je3ne. je7ne8s 4jenet jen5ged jeng5s4 2jeni jen3k 4jenl 4jeno 4jenu je2n1y4 4jenæ 2je5o4 2jep je3raf je4r5ant jer4dep jerd6s je3r6e 4jered 6jereg 6jerei 6jerenn je5rik je6rim je6rinæ jer4kes jer6k5l jer4kv jerle7 jer6mu jer6n5as jern5sl je6ron jer4sp jert5s 4je1ru 6jerå 5jesf 5jesh jes4kil 2je3sp jes4tea je6stim je3str 5jesut je5sve je4t3ag jeta6ka je9tar. je7tara je9tare je4t3ru jets2 jet4t5an jet6term jett3o jett5s6 je4t3v jety8e 2jeu6 4jev6a je7vark je6vas 4jeve jevi4s jev7na. jev7ne 6jeø j1f 4jg j1h 4ji. jib5b ji7e6 6jik 2j3inf ji7ro ji6sj 4jiø 2j1k j4kap 6j1l 6j1m 6j1n 6jn. j5ni j2o 1job 5joc jo4da. jo6dat jo6dis jo4fl jok9ker jokk9o8 jol5t6 j3omr jon2 jo5ne jon7n jons1 jons5a jonse4 jons3p jons5t jon6sti jon4str jonsu4 4jop jo5ra jor6dek jor6d7erv jor6d7is. jor4d3o jord3r jord5s jords4l jor6du jo1re jo4rie jort6a jor5tet jo3r4u 2jos jo3se jo4ses jo5stei 1jou jour5 j1p 4j1r 2j3s2 j1t ju8are 1jub jubi3 ju9bo ju3de ju2do ju7doe jue7ni ju4e5re jue9s jug9le 5jugo 4ju2k ju3ka ju3ke. ju3ken juk9sar ju2l ju3la. ju5lar ju5las ju8l9ei ju4li. ju6lid ju4lik jul7inn jull6 1jung jun7ge j6u6ni 8jup jup7s ju6p5å6 ju4ra ju7ras 3juris ju9ro ju3ru 5jury 1jus ju5so5 ju1ta jut5o ju6va. ju6vak ju1å j5v jy1 jy8de. jy2p3 jæ5le. jæ3ra. jæ9ran jæ9res. jæ7te. j2ø 1jø. 1jøa. jø5b4 1jøe 2jøef 4jøeg 6jøei 2jøek 4jøend 4jøeng 4jøeta jø1f jø3gr jø9kj 4jøl jø4les jøl6ver jø5me jøn5ne jø5pa jør4kel jør4sp jørs5v jør4tel jø3ru jør7ut jø1rø jø4ses jøst2 jø5ta jø6t7av jø3te. jøte4t jøt5eta jø1tr jøtte4 4jø1v jø4vel 2jå jå5ar. jå9ge. jå6la. jå4le. jå7les jå5let 1ka. 2kaa 5kaa. 5ka4an4 k3aas ka3at 6kabes ka7bo 4ka1br 4kaby ka3da 6kadale ka5del ka6del. ka4deri 4kadg kadi7e 2kadr 5kadu 4kady 3kaen ka3fe kaf5fere 2kafo ka9fr 2kaft kaf5ta 6kafø 2kag k5a4gi kag2r 2kah ka5isk ka5ism 6kajo ka4ka. ka4ke. ka4ked ka4kel ka4kes ka4ki. ka4kis 6k5aksj 4kakt ka3ku ka3lam ka3lan ka6lant ka3las kald5s 5kaldt kal2e 3kalen ka5lev 5kalis k6alk 5kalky kal7la kal6lero kall4s ka1lo kal3p kal7s6v kal4ves 1kam ka6ma. ka8me. 4kameri 4kammel kam4p3i kam4pr 7kamu 1kana ka8na. 4kanda kan6da. 5k6ande. 1kane ka5ner kan4i ka5nin 2k1anl 4k1anm k3anno 5kano ka4no. ka8nom 4kansa 6kansi 3kansl 1kant kan6t7end kan6t9r 2kap. 5kapad ka4pak 3kapas ka5pe 5kapell 4kapen 3kapit 1kapp kap3re kap4s3t 1kar. 1kara 4karab 4karam karan5 ka3rav 1karb 4karbei 4karea ka6rek ka5rel 1karf 5karg ka4ri. ka6rid 6k3arki 6k5arkt 1karm kar3n ka3rol kar3om kar5pes karp3s 3karri 7karsj kars4t 1kart kar5ti 5karu 4karå 1kas 7kas. ka5se4i ka3sek kas5ev kas2ju 6kasjø ka4sk kas3ka kasko5 6kasp ka4spi kass6 kas6sad kas4sak 4k3assi kas4so ka4st 8kas5to kas2t3r 1ka7t6a ka3ted 3kateg ka3tet ka1to ka4t5op 4ka1t4r kat7s kat5ta kat4tel kat6term katte5s kat4til kat4tri ka4t5y k7au4r 2kav ka7ves k9avis kav8l9u 9kay 6k1b4 2kc k5ce kcen4 2k1d k5d6v 1ke 2ke1a8 ke9al 2keb 4kebr 4kebuk 4kec ked4 ke5da 4kedag 4kedal 5kedan. 9kedant ke5de 6kedei 4kedem 4kedes 7kedes. 2kedi 2ke5dr ked8sk kedu6 4kedy 2kedø 2keeg 2keek 2keel ke4ep ke7ern 2keev 4kef k3eff k5eft 2ke1g k3egg keg8ga 5kegladh ke5h 3kehet 4kehj 2kei k3ei2d k1eig ke5il ke1im k6e1in keis2 2kej 2kek kek2l ke3kn k1eks k5ek4t k6el. 2kela ke3l4ak 5kelal ke6lans ke6lat kel5eier kel5eig kel7eik kelei8ke. 6keleis kel3e4l 4k5elem 4keleng 4ke5lep 4keles 7k6elet 4kelev keli8e8 keli9en 3kelig 4kelign 4kelinj kel5int 4kelis ke4lise 5kelit 4keliv kel5l 4kelof 6kelov. 4kelove kels4 kels7kar kel5sl kel5sp kel5st kel3sv kelsva9 kel2t kelt3e 6kelua 4kelue kel9uka kel5uke ke4l3ur 6keluv kel5v 2kely 2kelæ 2kelø kelø8pa. 6ke5l4å kelå7re 2kem ke4mit 5kena. 6kenam ken6ap ke4nas 5kenatts ken5de 6k5en6den 6k5en4der 4kend5r ke3ne 4keneb 4kenek 4kenel 4kenem 6kenett 4kenev 3kenf ke4ni 5k6enh 4ke5niv ken3k ken7n kenne4l3 ke4nom ken1s2 4k5ense kens6t ken7te ken5t6r 4k3entu 6ke3ny 6kenø 2keo ke3on 4kep 5kepi. 9kepia 7kepie 6kepl kera7l 4keram ke4ran ker5ant 6kerau 4kered 4kereg kerei4d 4kereir 6kereis 4kerek 4ke5rem kere6n 6kerene ke6r5eng 4kerenn 4kerep ke4r5ert ke3res 4keress 4kerest 4keresu 4keret 5keret. 5kereta 7kerets 3keri ke4rif 6kerik. 4kerike 6kerikt ke4rim ke4rine 6keringi 6keringj ke4rinæ ke4ris 8kerist. 8kerista 6keriste 3kerm 7kerop 5keror 4ke3ros kero6se. ke3rot k4ert ker5to ker3t4v ker3un 4kerus keru6se. kerø6re. 8ker8øya 6ker6øye 2kerå 5kes. 4kesam 9kesam. 7kesdale 5kese. k5esel ke5sil 4kesit 2kesj k9es8ka. 4k5eske kes8ke. 4keski 4keskj 6keskå kesle6ge. kes5ped 5kespot 5ke4spu 5kest. 4ke3sta 5keste. 4ke5sted 4ke5stei kes6tem 4ke5s4ten ke3sto 4kestri 4ke5stru 4kestu 4kestø ke4s5un kes1v 2kesy kes1å 2keta keta6ka keta6le. 5ketals k6etar ke3te 5kete. 4ketek 7keth 2keti 2ketj 2keto 2ket2r kets2 ket6t7enh ket8tes 2ketu 2kety kety6e 4ketæ ketøy6s5 2ketå 2keu2 ke5ur 2kev kev2a keva8ne. 5kevas 3kevel kevi6sa. k1evj kev6ja kev4je. k3evn kev6ne. ke3vr kevæ8ra ke2yt 6keæ 2keø 2keå 1ké4 két5 2k1f k5fi 4k5g2 k3ge k5gh kgu4 4k1h kh5ak k4har khe4o khjul8s kh6m ki3a2r k3ideo 4kidol ki3dr k4ie2 kie5re ki6el ki3er. 2kif ki5g4 ki6ka. kikk8s9 ki1k8l ki3k2r kik4s ki8la. 3kilde ki4le. ki5li 4kilj kil9ja kil6le5st ki7loa ki4log ki3los ki4lov 2kilt ki7lå ki8ma. ki4me. 5kimo5 ki4mol 2k1imp kin9and ki4nark ki5nas. 6kind ki5ne ki6ne. 2kinf 1king king5and kin3ge kin5ing 2kinn kinnsi8da kinnsi8de. kinn4sp ki2no 2kins kinsi6de. 2kint kinti8me. ki6nu 2kinv kio4 4kiol 7kios 2kip ki5pe ki4p5l kip5pe kip2s3 1kir ki5re ki5ri 4kirs ki3se ki5sko ki3smu ki1s2p ki5stav ki5str ki6ten ki7ti 5kito ki4ton 4kiu k6iv ki4vek ki4v5enh ki6vi. kiv3s kj2 3k8jan kjap5pe 6k7jarn kje7fj kje7f6r 4kjegg 3kjeld kjel7leg 5kjemas 3kjemp 6kjenk kje9ny kje1s kje6t5r kjet5t 6kjor kju5le. kju5len kju9r 3kjærl k5jødi 1kjøp 3kjøri kjø4tr 2kk k1ka k2kab kk3aft k2k1ak k2k3al k2kam k4kanb kk5and k8kand. k6kanden k4k5ang k4kann k4kao k4karb k6karg k4k7art kkar6ta. k5kast k6kasu k6katt k2k1au kk1av k6kedo k4kedu k2kee k2keh kk1ei k5kel. kke6lei kk5e4lev kkel3t4 kkelu4 kke4luk kkel5un kke6nan k5ker. k4kerei k4kerel k6kerent k4kerig k4kerit kke5r6und k4kesa k5kesau k4kese k4kesi kke3s4l k4kesp k6kestad k4kete k5ketet k4ketø k4k9g2 k1ki kk3ind kk3inf kk9inn kk3ins kk3int k2kir k1kja kkjek8 kk5jent k4k5jern kkje7t kk5ju kk5k kkla4g kk3lan kk8lar kk7lau kk1lo kk1ly kk3læ k4kn kk5ne kk5ny kk6s5v k1kod k1koe k4k1of kko6lig kk5oml kk7oms kk9omt k6koo kk1op kko7s k4kosi k6kosk k4kost kk3ove k4kra kk5ram kk3rap kk3rea kk5rei kk3ren kk3res kkri6k kk3ro kkro8e kkro4s kk3ru kk4rus kk7rø kk7rå kk7s kks6al kk4sar kk5sed kk3s4ei kk4sin kk1sk kks4kj kks4l kk3sla kk7sle kk5sli kk3spe kk1s2t kks5tak kks7tep kkst4r kk8s7va kk5s4å7 kk3t2 kk5uk k4kuni k2k1u6t kk1v k2kvo k1ky6 kkyl4 kk5yr kk7yt k2k1ø k8køl kkø6r kkøy6 kk1å2 kl4 6kl. 4kla. 4k5lagt 2klak kla9ke. kla4mel 3k2las k7lati kla4tr kleby7t 3k4ledd kle4deb kle4des 2kleg klei9e k7leik k4leiv k2lem 5k6lem. 7k4leno k6lerik kles7j kle5sno kle4sp kle5sti kles7s8 2klet 8klia 4klie. 4klig 1k2lim2 3k4lini k5linj 1klip 4klit klon7a8l 1klos 2klov k3lukt 4klun klun5t k5lyd 6k7lyf 3k4lyng klyse7te k2læ klæ5res klø7na k6lør 6kløs klø9va klø5ve 6k1lån klå5re 2k3m kmann6 kmål2 2k1n2 3k2nap kna5t4re kne4b3l k4nedi 5k2nee kne8se. k4nest kn5f 3k4nip knippe6 kni2t3 3k2niv kno7g kno6kl 5knop kno9ta kno5te 3k2nu 4k3num 3k2ny kny4s k2nø knø9le kn3øy 9koa. 4ko1ak 9koane ko7ar ko2b3 ko3bo 4ko3br ko5da 4kodd ko4de. 3kodek 5koden 2kodø ko3e 3koef 4koek 4koel 4koes 4koev ko4g5eng kog9ger kog3l ko4gre kogst6 ko4gu ko6gå 2koi koi4e5ne ko7i6k ko1in 2koj ko8ja. ko4ka. ko4kab ko4ke. ko6kel ko1ki kokk6o k3okku 4kok4l 4koko 2koku kolba5 2kole ko4leg ko4lei ko6lel ko4let ko4leu 3kolle ko5lo. kol5p 4koly 2kolå 1kom ko4ma. 4komaf ko4me. 6komg ko4mi. 4komil 4komisb ko4mise 2komr 4komse kom3sl kom5so kom4st 4kom5t 4komu 4komå k6on ko4na. kon3d kon6dr kone5l6å 4koniv kon3s2 kon6s7v kon6ton ko4nu 1ko1o 4koom ko5pa ko5pers 4kopet ko4pi. ko4pip ko4p9l 4kopo kop5per 2kopr ko1ra ko4ra. kor6da. kor4d3o kord5s4ø kor4du ko1r6e 6koref 4ko7rei9 ko5rem ko7ret ko3ri ko6rik 4korm ko5rol 6korpa 6korpe 1kor3r kor4sal kor6s5inn kor4s5l kor6str kor4sv kor5tes kor6top kor4t5r kort5s4 ko5ru ko6rume 1kos 2kosa ko6sa. ko4sed ko4sek 5kosele ko5sen ko4ses ko9si kosi9d ko2sk ko1sl 4kosmu 2koso 2ko1s2p ko6sta kost7as kos6t5ers kost5j 4kosø kotes7 ko5t4i 4kotil 4kotr ko6tre kot2s kots5tr kot4ti kott4s kotts5t 4koty 2kou4 kout3 kou7ta ko1va kover7e 4kovr 1kov4s3 4koø 4koå 6k1p kr6 k3rad 1k4raf 5krag 3krakk krani6e7n 6krank 3krans 4krap kra9se 7k8ra4sj kras5s kra4to kra4u 1krav 4kred. 3kredi 4k1reg kregi3 4krei krei9e krei5s 6krek kre4kli 2krel k5rela 4k3renn 4krent 6kreo k5repr 5kreps 5kresj 4k3ress kreta9 6k7retn k4rets k3rett 2krib 4krif 7k6rig krig6s5 kri9ga 4krik kri5ke kri4kj krik6ka 1krim kri4me 3k6rins krin6s7t kri2p 1k2ris 7krisene k2rit 3krite 6kriv k2ro kro5b4 kro5de k3rofo k4rofor krok7k k6roni k5ronl kro4nom k4rop krop9n kropp4 k4rost kro9t8e kroten9 kro3v kru3i4 krum3 kru5sa krutt5i kru3tr 2k5ryg kry7pa kry5pe kry4pi 3krys krø5ke 6k5rør krø3v 4kråd krå8da kråe6 5kråk krå5le krå9m krå7ne k1sa k3sa. k2s3ad ks3alt ksa5me k3sane k4sans k4s3ant k3sar. k7sara k6s3ark k7sas k1sc k2sed k2see kse6ge k2s1ei k5sekt k5sela kse5lev ksen5to k4serf ks3erk k5serol k4sesa k4ses6k k4se3sm k5seso kses4p k5sess kses6sel kses8serie kses4sp kses4st kse6te. ksfø4 k5sia k2sif ksi5ko ks3ind k3sing ksi7ni ks3inn k4s3ins k7sio ksi3st k4siti ks9kab k6s3kal k6skio ks1kj ks5kl ksko7na ksko5ne ks1kr ksk8u ks9ku. ks7kua ks8kut ks1k6v ks1l ksla8ga. ks5lo k7s6lu k8s7lug ks5løs kslø8va kslø8ve. k5s4mak ks4mel ksmå k5s4no k7s8nø k1so k6s7oa k6sod k4sog k4somb k2s1or k2sot ks1ov k3spal ks3pek ks5pio ks3pir kspor6t5r 6k6s5pors ks1pr k8sr k3spy kss6 ks3sm k5stad k4stak ks3tal ks5tant k7s8vak ks6tav kste4da ks4teg k3stei k4stek kst3ev kstev6ne. ks4til k4stin ks1tj ks1tr kst6ran ks4t5rek k6stren k6strer ks4tri ks4tro ks9tum k5stus ks3tyv k2stå k1su k6sun ks1v k9s8vake ksva8ne. ks5veg k7s6vert k5s4vin ks5w ksy8na ksy8s7m ks5ær ksø4ke. k6s3øl ks1å k3så. k4såp ksår4 ksåt4 6k1t k5ta. kta7f6 k4tag kta6ka k4t3aks k4takt kta6la. k4t3ana kta9na. kt3anl k4t3ann k4tanv kt3app k9tar. k4t3arr k4t3art k6tass k5tast k6t7atl kt5avh kt5avk k6t3avl k3ted k4teda k6tee k4tefø kt5e4ge k2te5i k6teka kte5le k6t5elsk kt5e4lit ktem8 kt7emn k4t3enh k9ter. kterie5n kterie7ns kter5s6 k7tes. k6tesa k6tese kt5eske ktes6ke. kt5esti k4t5e4ta k4tete kt5evn ktev6ne. k5tib k3til k4t3ins k5tir ktis5t kt7i6te kti6v7end k2tja kt7ju kto9a kt5off k6togram k4toli k2tom kt5omf k2t1op k9tor. k7tora kt5ord. k5tore ktori9e8 ktor7s kt1ov kt3ral k2t1re kt2ro ktro5s k2t1ru kt4s5amb kts5ar kt5sek kt7sem kt4s5er kt6sin kts5kra kt5sku kts4kv ktsle6ge. kt6sok kt4spa kt5spre kt4sta kts6ton kts5top kt4stå kt3t8 ktu9er. k4tuk kt7und k2t1ut kt7yrk ktyr8ke. ktør7 ktør8e k6t5øs kt1øv k2t3år ku2a ku9an ku4be. ku3bj 2kud ku4dal ku4er. kue4r5a ku4et 6kuf ku4f3l 6kug k5u4gr ku7is kuit6 6kuldi kuld3r ku4led ku4leg ku6lei ku4lem ku5len ku4let ku4lev ku5li ku6li. 3kull 1kult ku4man kumen6tal ku6mi kum2s 3kumu 1kun kund5s6l 2k1ung kun4ge. k6unn ku4o 1kup ku4pe. kup4pl ku7ra ku4rek ku8r7o ku7r6op kuro8pa 1kurs kur6sk kur4sp kur4s3t kurs3v kur3t ku5ru6 kuru9ken kuru7ker 1kurv kur4v3i 1kus 5kus. ku7sa. kus5a6k kus5ar 5kuse ku4s5el ku4ska ku7s6pe kus3t 6k1ut. ku1ta 4ku5te. ku5to ku6t7r 2kuts 1kuu8 kuøy6 kv2 kva8ke k4vali k6vard kvari6e5n 5k6vart kva9se kve3d2 kve7e k6veil kvei9se 1k4vel kve5la 4k3verd 5kvern kverns8 2kves kves5t 7k6via 4kvid 3k4vie kvi4ene kvi5er kvi7la 3kvinn kvi5se 7kvist 2kviv 1kvo k1vog 6kvok k4vot k2vu 4k3væ k1vå k7we k5wu ky5a ky6el 4kyf kyf5le 2kyg ky4leg 2k3yns kyn6skjer ky2p1 ky4p5r 1kyr kyrie5ne kyr8ke. ky8sa 4kyse ky6se. kyse8te. ky3skr kys6sk 1ky4st kyst3a kys4tel 2kyt ky6ta. kyte3s k1æt3 1kø. kø2ar 1køe kø4en. kø2er 6k1øk kø4le k1øn køn6skjer k3ørr køs4 kø5se køy7ar. k7øyd køy4e5ne 1k6øyr 4kåke kå3le kån8da kå5ne kå4pe. kå7pen kå9ras kå1re kå1ri kå2t5 k5åt6t 1la. 2laa la1b 4laba la6bl 1labo 2l3abon 4laby 4lad. l6ade la4dem 4ladg ladi9e8 2ladm 2ladr lad3s4 1lae 2laei 4laent 4laep 2laf la3fl 4lagg lagi4 6lagne la2go8 lag5om la2g1r lag5san lag4sj 2laha 2la1in la5ka la4ke. 4lakj l2akk la2kr l7aksj l5aksl 4lakt lakterie6 la5kø 2lal l1alk la5mab 4lamb la4mes la4met la3mo l8a8mu 4l3anal lan2c lan6das lan6deb land3r l6a3ne 3lane. 4lanet lan6gel lan4gem lan6germ lan4gr lang3s4 lang4s5e lan6g5ø6 4lanl 4lann l3anno la4nor 6l5ansi lan5ti 4lanv l3anvi 2lao la6pal la7pi la8pl lap5sa lap5sen lap5s4i 1l8ar. 6l7arab 2larb l8are. 4l7area la9red la5rem l6aren. 4larena lare6t la6r7eta 5larf la7ria lariar lari6e7n 4l3arki l2arm lar3n 6l7arr 4lart lar6ta. lar7vet la6sc la5se lasi9e la2sk 7laskj 4lasm la5smi 4la4sp las6sak las6sam las6sat las6sel l6ast 4lastr las3v la1ta lat5ang 6latau la4teg lat6ek la4teno late5s4 la5ti la6ti. 4latm la1to lat7ra. lat9ran lat5rar lat4t5is lat4tra latt6u lau7a 2laud laue6 4laun 4laur lau7se lau6st 2laut 2lav la4v5al la4vel l5avh lav5inn 6lavs 7lavå 1law la6y5 2l1b2 lba3de lba4k lba5ke. lba4ne. l5be lbe9na lbe8re. l4boa l6buh lby4e l5bå 2l1c l4ce. 6ld l7da. ld5aks ld5akt l9dand lda6t5o lda6t5y l2deb l5den l2de5o l2dep l3der l7der. lder7a l4derek l6derik l6derklæ lderle9g lder5s6te lder6s5ti l4desh l6destr l9dé ldis7k ldo9a l8d5oks l2dol l4dore ld5ovn l3drak ld3ran ld5ras l6dre. ld7regn ld5rer. l8dres. ld1ri l7dry ld1rø ldse8 ld4sek ld4sel ld4ses lds1k ld4ska lds4kj ldsla8ga lds6leg lds4let ld4s9m ld5s4om lds3tr ld6tus ldø2 ldø5d ldø5l ld7øy 1le 2lea le7ag le3ak le1al lea5la 3leas le5at 2leb le4bem le6bosta 5lebæk lec4 2leda 5ledar led4dø 4ledeb le4dem 6ledep le5der le3des 2ledo 3ledop 5ledov le4dro le5dry led1s2 6ledu 4ledy 2ledø 4le3då 2lee 6leei 6lefa lefa6ne. 4l1eff 2lefi 4lefl 4lefor 4lefot 2lefr l1eft 6lefy 4lefø 6legap 5legas 3lege le4ged le9gen le4gera le9geran le9geras le4gero le4geta le4gev 7leggi le3gi 6legif 4legj 2le1g2l le4gol 4legre leg3s4 2legu 2legå 2leh 6lehal 6lehamr 6lehan 6lehau 6lehave le3ido l6eie. lei5ende lei4e5ne l6ei8et leig6d lei4ger lei7ger. lei4get leig4h5 leig6na leig8ne 2lein le3int lei6r7u leis7t l6eit 2lej 2leka le4ka. 6lekan lek6e le3ki 2lekj lekk7s 2lek2l 2lekn lek4na 2leko 2lekr 4l3ekso 4leksp lekt5ord lekt4s5t 2leku 2lekv 4lekø 4lekå 2le3la 8l9eld 2lele l3elem 4l5elg 5lelig 2lelo 3lels 4l3elsk le1lu 4leluk l5elv 2lely 4lelæ 2lelø lelø6pa 4lema le3me le8me. 4lemet 8lemetrisk 8l9emn lem8na 2lemo lem9ped lem5pes 3lemr lem4si lem4s5ø 2lemt lem5ti 2lemu 6lemy 4lemø 2lemå le4na. le4nal 4lenav lend8a len9dan 6lenden l6endre 4lendri 4lened 4lenem 4lenev l4engd len4g5r leng9u le5ni 4leniv lensa4 len4s5ak 4lensem len5ses len4sta len4tam len4tr len8t9ra 2lenø 4lenå 2leo 5leol 2lep le5pa le4pel le8p9enden le2p3j le8pla. le4ple 4lepo 4leraba 4leram le2r3amb ler5d l8ere le9re. 6lerea 4leref 4lereg 4le9r8ei 4lerek le5res 4lereso 4leresu 4leret 4lerev 9leri. 7lerie le6riei le7rina le4riv 4l5ernæ le5ro. 4lerom 6lerope le3ros 4le3rot 7lers. lers4p ler7te le1ru 4lerus leru8se. 2lery 5leryr 2lerø 2lerå 5l6es. le4sab 4lesam 7lesar 4lesau 2lesc le5sed le4seg 4lesek le5sen le3ser 4leset 4lesho le6si. 4lesig le7sing les5inn 4lesit 4lesju le7skap le4s3kj 6leskol le6sk9u8t 4lesla 2lesp 6lespal les3s6 lesse6ne. 4lesta 9lesta. 7lestal le5sted le5steg le5stel le4stim le3sto 4lestrø 4lestyr 4lestø 4lestå 4lesug les1v le5s6vi 4le5sy 4lesø 5lesøy 3let. le4tab 6letak leta8ka leta8le. l5e4tas 5lete. 6letea 4leteg 4letek le5ten 6letenk 6le7tep le5ter. 4letes 2le3ti l5e4tik 2letj 2leto 2let2r le7tre le5t4ri 3lets let6sj lets8k let6tea let6tr lett3s4 2letu le4tv 2lety lety8e 4letø 8letå 4leul 2leun l1eur 2leut le4ute 2lev. le6vad le6valu le4ved 4leveg 4levei 4levek 6levern 4le4vev levi6d lev5n 2levo lev1r 4levs 4levæ lex1 4leø 2leå 5lée 1lér 7lét. 7lè 5lê 4l1f l4fa. lf5ant l5far l5fe lf3f l5fig l5f6in lf5ja l7fje l6f3nul l4fom l4fut 2lg l6gaf lga8le. l4g5alt l4g3ana lga5t lga4ve. l2ged l4gela l4gele l2gem lge3na lge4r5an lge4rap lge5ri lger5un l4gery l4gesl l6ge7sp lg5g lgie8n lg1lo lg5ly lg5n lg3ob lgo2d lg1ok lg1om lg5ov lg3ref lgr9øy lg3s2e lg2sk lg5s4kre lgsle9g lg5s4tr lgu4l lg3un lg3ur l1gæ lg5ø l6gå. lg5år. lgå8va lgå8ve. 8l1h lha8ka. lhav6s5 l5hj 1li li1a li4ala li2am li5ans li4as liba5 libe5ro libi5 libie6 liby5e li4dak li4ded li4do. 2l1idr lid3t li4ene li3er. li5ers. lie5s 3lif 4lifat lif5f 3lig li4ga. li4g3an li4gar lig9art li8gas. li4g5enh li4get 5lign li4g3re lig3se lig3s4i lig3sl lig3s4p lig5s4ti lig5str li2gu 4lih li5kan li9kar li7kas li5kee li3ken li5keså li9ki likk3o li1k2l 9likn liks4t li5ku 6lila 8l5ild li3le lil5lebe lil5let li4mar li4mas li6mate l6ime li4me. 4limh limp3r lim7r lim9u li4na. 4lina6l lin6c linch5 5l4indr 4lindu lind3s4 l5indus li4ne. li3ne6a li6nem 2l1inf lin4g3j ling5l ling7sen. 5lingv 4l5inju lin5kes lin5kle lin4kv 2l1inn lin5net 3linni 6linns 6l5inntr li4nor l4inse 5linsk 4l3inst 4lint 2linv li6n5ø6 lio4no lion5sp lion5sv li5o6s 2lip lipes4 lipp4s3 li9rar li4rek 4lisak li5set lis4kl 2liso 4lisp lis6sp lis7tan lis6terk lis5ti 4lis6til list3o li6s8tr list7rø lis4t3u4 li4st5y listyr8ke. li4tee li4tek li4ti3a li4tid li4tig li4til li4tim liti5st li4tiv lit5j 6litn li5to li2t1r lit5rer lit6tele lit6terk lit6term litt5s6 li5ty 7liu li6va. li4v3ak liv5eg livi5e liv2s3 2lj l1jan l1jar l4jarb ljar5s6 ljas4 l4jed l6jee l2jei l2jek lje3l lj9elv l1jen l3jer. l4je1s l5jes. ljes4t l5jet. l4jete l5jete. l6je5t6r l2jev l5jé l1ji 3l2jod ljo8e l4jom lj5ori 3ljos lj5un l7jur lj7ut ljø3 l5jøs. 6l1k l3ka l5ka6l lkali9e8 lk4an l6k5b lk4e l3ke. l2ked l5kedal l3kede lkeei4 l6keh l5keleg l3ken l7ker. l4kera l4keri l4k5ers l4ke3ru l5kestad l5ket. l5kets lk2l lk4li l5k4lu l6k5nin l6ko. lko9ma lko9sa l2kot lkras5 lk5ri6k lk4ser l4k3s2h lk1s4t lku4le. lku8t lk9ute l6kveg lkå1 2l1l l5la6a ll6a5f l2lak ll1al l4lami l5lane ll3anl l4l5ano llans4 ll5ansk ll7apa llap3s ll4as ll5asp ll5aur llau6re ll7avl ll5avr ll3d2 lle5a l5leak lle8da. lle4d3r l3lee l2lef lle5gev lle5gr l5leha l5leho l5lehå l4l5eig l4leki l6l5ekst l4leli l2lem llen6da. ll5enden l4lendr l6lendt l4lenk l5l8ens l4lentu l4lenu ll5eple l6l5e6rik l4lerob ll6es lle4so lles5pr lle5stø l5let. l4leta l5lets llet6tele l8letæ l2leu ll5even lle7vev l5levå lle6y l2lé. ll7g2 lli1e lli5e4n l9lig l2lim l4l3ind l4lins ll3int l9lint. l3lip l4lir lli6sen l4liv ll1j ll7k2 ll5m llmue9ne llmu7ens llmu9er l5lo. llob5 l2lod l4l3off llo5id ll5oks llo2m1 llom5s6 ll3op ll5opp l2l1or l4loso l6lote ll5p llra7n ll4sak llsa6me. ll4sem lls5end llsk4 lls6kar lls5kv ll5skå lls5lag ll3smy lls4no lls4te lls6tig lls7øk ll3t4 llto4e l8lua l4lu4e l4luf ll7ug llu4k l8l7uka l4l3uke l6luks l5lum l4l1un llun6ge. llu4pi l2l1ur l3lus l2l1ut ll1v4 llva8n lly4se. l4løk ll5øks llø6pa. l4løve ll7øy. ll5øya ll3øye lløy6er ll5øy6n ll1å8r ll3å2s 2l1m l5ma. lm3anm l4map l4marki lm3av lm7b l4m3els l4melu lm5e4po l4m5erf lme7ri lme7sti lme5t4r l5mil lmi8le. lm3ind l5ming lmini6 lmin7ne lm3ins lm5int l7mis lm5l lm5m lm1op lm1s lms6j lm5s2p lm3t lmu4le. lm3ut lmyr8ke. l4mø. l6m5øs lm5øy6 lmøya9 lmå6la. lm5å4r l4m5ås 2l1n l2nab l3ne lni4u l7ny lo1al 7loane lo1a4r 5loar. 2lob lob5by. lob9byan lob9byar. lob5bye lo2bl lo2d3a lo3de lo4d3ri lod3s4m lod7ste lod7s6v lo6d5u 6loeng 6lofj 3loft 1log lo5ge lo6g5e8v lo4gir log2o lo3gop log8res lo6g5ro log5sa 4loh lo5id. lo3ide lo1in 3loja lo1ki lok4ko lok6kul 2lo1k4l 4lokon 2lok7s4 lok8se. lo1k4v lole6ge. 2lolj lolo9 l5omdr lo4m5in lom4mel lomst9r lo4nal 6lond lo5ne lon4g3r lo4nit lon7skj 2lop lo3pa lo4pea lop5pa 5l4opt lo1ra 2lord lor6da. lo1re 4l1org lor4g5l lorie6 lo1ro lo7rød lo7sa lo6sek lo4ses lo5sev los4kle lo1sl lo7sp 2lost lo9tes lo8ti. lo3to 4lottet lo1un 1lov lov7ald lo3van lo9vand lo7vane lo3var lo3ve7d6 l6over. love5re l5overn 6l5overs 6l5overt 7lovo lov3sa 2l1p l7pa lpa5re lpas5 l4pedo l4pee l2pei l2pel l5peleg l3peli l4pelin l3pesm l4peti l2peu lp2h lp2i lpin3e lpi5ne. lp2l lpo6et l4put l5q 2l5r4 lra8da lradi4u lra6ne. lre4de lre4i lre8ka lre8ke. lre8va lri8ma lri4ve. lro8de. lro6pa. lro8sa. lro4se. lrot5s lrø6re. lrø5v lrå8da. lrå4de. 8l1s l2sad lsag6 ls5ald ls4am l7sana lsan6ke. l4s5ano l4s3ans ls5ark l4sat. l4scu l3se. l2sed l2see ls3eid ls5eig l4s3ele l4s3elv l2sem ls5emb l4seno l7ser. lse2s lses5ku lses3l lses5pa lses5s lse8s5tr lse4te. l2seu l6sev l4sf l2sh l5sig l5sik l6s5ill l4sim l5simu l4s3inn ls5jakk l5sjef ls3jeg ls3jen 8lsk. ls5kabi l4s5kan ls5kari lsk5art l6s5ke lskif5 l2s3kild lskinn6 lskinns5 ls1kjed ls3kjo l6skl lsk3læ ls3koa ls5kor ls3kov l4skra ls8ks lsk5un ls7kva ls3kvi l4skå ls3kåp lskå6pa l2sl lsla4ga l7slagn lsle6ge. ls5lo l5s4luk l6s5løs l2sm l5smør lsmå6la l2snu lsok3 ls5ond lson6de. l2s1or ls7o6se l5sot ls1ov l2spa l9speg l5spei l9spel l5spi l4spr l5spred ls3pri l8s7s l4s3tak l4s3tal l6stank l6ste. ls4ted l4steg l3ste4i ls4tel ls5terr ls6ti. ls4tie ls6ton ls5tren l9stri l2su l5sub l3suk ls1un l2s1v ls7vea ls5vee lsve8en. l6s5vek lsve7re l4svik ls6vind l4sør l2s1øy l2s1å 2l1t l4taa l4taf lt3akt l3tal lta4la. l4t3alb lta6lev lt3anl lta6no lt3art lta4st lta8tes lta4t3o ltat3r lt3avk l5tavæ lt9b l3tede l4teka lte6ma. lt4en. l4t5enh lt3epi l4teras l4t5erst ltesa8me. ltid6s l4tiet l2tif lti6g5 l2tik l4tina lt3ind lt9inn lt3ins l4tivi l2t1ja ltle8ge. lt9n lto9ar l3tog lto4s lt3ost lt2r l3tra lt3reg lt3rei l6treko l6t5rel l6t7rem l4trens lt3res l5t4rest l5trev l4t5rit lt3rol lt3rom ltro8pa l5tros l4t5rød l5trå lt1s2 ltsa8me. lt5s4i lt7s6t lt2s3v lts4vi lt7t8 lt3und ltu4ra ltur5e6 ltu5r6en ltu5r6er ltur5s6 ltur5å6 l2tut l5tv. ltva8la l3tvs l4t5w l3ty lty8d lt7øl lt3øv lua8r 2lub lub6band lu6bri lu5c lu7ere 1luf 3lugar lu7go lui6 luid6er 1luj 4luk. lu4ka. 4luket luk6keri lu3kr 5l6ukt 4luly l4um lu6mel lu2mo lum6sk lu4mø lun5d4r lu4ne. lun4gel l7u2ni lun5ne 3lunsj 4lunt lu6o lup4s lu2p3u lur2e 6lurei lu5ren lu5ri 6l5urn lur8na lur8ne. lur8ta 1lus. lusa5 lu7sak lu6sel lush7e lu2s5k lus4o5 lus4sid lus4s3t lus1t lus2t3r luta3 lu3ta. lu7tet 6lutf 4lutg luth 3lu5t6he lutla9 lut6m lu1to lu4t5r 2luts lut4tal lut4tap lut4t5at 6lutv 1luv lu4va lu4ve. lu9ven lu9ver 8lv l1va l4va. lva6k l4vakti lva6la l4va4m l4vana lv8and l7var. lv7asa l4v5ass lve3d4a lve5i6s l4vela l4vele lv4en lve9ne l9ver. lve9rau l4veru l4vesk lve5sl l7v6et. lve5str l9vé l1vi lvi8ene lvi9er lvi6ka. lv9im lvin5g6r lv3iro lv1j lvly8se. l6v3n lv1of lv9op lvo8re. lvor4s lv5o4v l6v5p lvra8r lv9ri lv1s2 lv5se lv7s6k lvs6l lv9ta l5vøe lv1å l3våg lvå4p4 lvå6r l5w ly1a 2lyb ly4d7r ly5e lyes3 ly4gel ly5g6l ly8is 2lykj lyk6keri ly5ku ly7kv 6lykø ly5l ly5me 2lymp ly2n3a ly4ne. ly4n5il lyn3s2 2lyo ly5ok ly3pe ly1r8 ly8ra. ly6re. 6l7yrk ly4sa. ly4s5a4k lyse6te. lysk4 lys3kj lys9kl ly2s1l 4lysp lyst9ra 6lysy ly8ta. 4lytek ly4teri lyte5s l5y4tin ly1tr ly3ve l3z l6z5b 1læ1 6læd læ6ra. læ5rar lær4arm læ4re. lære3i læ3rer læ4re3s læ5res. lær6sv læ6ta 1lø lø3de. lø4del lø5dem lø4er løk5kj 4l1økn 2løko lø4k5r l5ø6l lø9me lø2na løns5t løp6s5 5l4ørd lør5k6 lør5n 4l5ørr 5løs. lø2sa lø5san lø5ser løs3k løs3s 2løt lø9ta. lø3te. lø4teg løva9r 6l7øv8d lø4ve. lø3ver lø5ves 6løy. 4løya 2løyd 4løye løy8ed løy5el 2løyf løy4g løyg5e 4løym 6l5øys. løy5ter lå6gal lå6gre lågs4 lå4gå 2låi lå1k4 lå6ke. lå9me lå2m5o lå2n 6l5ånd lån2s1 2låp l1åp9n 2lår lå8ra. lå9rar lå5ras lå3rin lå1ru lå6sa. lå1sk lå6sko lå4s5l lå4ste lås7ten lås5ter lå5su lå3te. lå4teg lå4tek lå8ti. 4lått lå4ve. 1ma 2maa 3maa. ma3ar 2mab ma5br ma3che mada5me ma4del ma3dra m6ad9s 4maef 4maek 7maene 2ma1f 3mafia 3mafr 6mafrå ma8ga. ma4ged ma4gel ma4ges 3magn ma2gr 2mahe ma4is ma4ja 2mak. ma5kab 4makad ma4kes mak7ke 4makl mak6le ma4kot mak2r ma3kre mak5ron mak4tal 4m3akti mak4to makts4t ma1ku 2ma1kv ma1la ma7leb ma6leng ma4let mali9e8n mal5l ma4lov mals4 mal4t5ek mal3u mal3å 4mamer ma3mo m4an. ma3nak m3anal 6manam 4manav man8ce man4dom man4don ma3ne m4anf man5g4a m6ange 4mangr mania8 2manl m3anle 4manm 5m4ann man4nem manns5l ma4no 2mao 4mapa 2mapr 4marb mar5d6 7mare. 6mareg ma3rei ma7rel 5ma9ren ma5res 3mar4i mari8e9ne ma3rin m4arka 4markit mar4kv mar5m marmo9ra. mar7n ma1ro ma4ro6p mar3s4h mar7sl mar5te ma4ry. ma6rå 4masel ma5set mash3 ma4sia ma4sik ma4sis 6masju mas4ki 4masko 4masp mas4see mas6set massø9 7mast. ma5stem 4masto 4ma5str 2masy m6at ma1ta ma5tad ma3te ma4te. ma6ted ma4tel 7maten 7mater. 6matera 7matet 6m7atfe 4matil 7matil. ma1to ma1tr 4matra ma4t5ras ma4t3re ma6t7rom mat3s2 mats8l mat5ta m8at7t8r 2mau mau4k mau7l ma1un 5maur mau7su 2mav ma6ve. ma5ven m7avh m5avk ma4ze ma3zo 2m1b m4bao mbar3d m2bea m4beb mbe9da m4bedø m2bef m2bek m4beli m2bem m4bena m4beo m4bereg m4bero mbet2 mbi6ar m2bib m3b4l mboe2 mbo4end mbo5er. mbo5ere mbo5id mbo5n m4bop mbo5re mbo9t mbu7ar. mbu4e mbue7re mbus5 m1c m6co 2m1d2 m3de md7om 1me 2mea2 me5al mea5m 2meb 2mec meck4 4medat 2medb 5mede. me4ded med5ei me7den me7det 4medf me3di 4medik 4medir 2medm me6dok 4medom 2medr me6dret med1s4 4medu me6dun me5d4us med5v 7medve 2medy 4medå me7e 2meef 6meek 2meel 4mees 4meev 2mef m3eff 6me2ga me7gal 2megr 2megu 4meh mei2e meie5n m1eig me3ild me3ind mei5ni me7isk 4meiso 2mej 4meki 4mekj 2mekk me2k1l me3kn 4meko 2me5k8r 4meks mek5t 6mekte m2el 4mela me5l4aks 5melane 5melar me3le me4le. 4meled 4melei 4melek 6m5e6lem me4l5eng 4melik 4melis 4melit 4meliv mel5le mello6m3 4melok 4melov mel4si mel2s3j melsk4 mel5s4t mel7tr me1lu mel5v melvi6 2mely 2melæ 4melø 4me5l4å5 2mem me6mo. 4m5enga men5k menle6ge. m6enn men4ny me4nom me4nor men4si men3sm men5spl men5te men6tek men4tom men5tr me4nyt 2me3o me6os 2mep 5mer. me6rab 4merad me4ra5l me4r5ant mer5di 4mered 4mereg 4merei 4merek 4merel me6rense me3res 4meress mere6t m4eri 4me5rib meri5ke 5merin merle7g mer9n mer5os 5mers mer5sk me3run mer5und 4merus 2mery me2r3ø 2merå me4råk 5mes. 2me5sa 4me5s4h 2mesj 2me1sk mes5ke 2me1sl mes6le 4me3so 2mesp 5mess 7mest. 4mesta 5meste. mes4ti 6me7sto mest3r me5stro 6mestrø 4mestrå 4mestu 4mesu 2mesy 2mesø 4metab 4me9tap me4tar me3te 4meteg 4metei 4metek 4metel 4metep 4metil 2metj 4meton me4t3ra me4tre met5ren met7rer met5res met5rik me4tru 4metræ 2metu 4metv 2mety 2metø 4metå 2meu4 7m4eu3s 2mev meva8n 2meø 2meå 2mé 2m1f mfa9ra mfar8ta mfav5 m2fek m6f3ess m4fi. m4fibr m2fit m5fru5s6 m5funn8s5 mfu6se. 2m5g6 m4ga. m4gi. mgå8va mgå8ve. 2m1h mhea4 m4hu. 1mi mi1a 5mi6al mia2n 9miane 7miar. 2miav mi6c miche6l 8m9idé 2midi mid5j mid3s4 mid4t 4mi3ele mi3er. mie9s8 2mi5f 5migraf 2mih 2mii 4mij mik6h 4mikj 2miko mik5ro. mik5ron mik5sa 6miku mi4la. mile6t mil7eti mi4lev mi7li 4milin mil6s5v 4milæ 2mim mi8ma. 5mimo m7imp mi4na. mi5nar mi4ne. mi4n5ers 4m3innh 4m3inns 6minnt min2s min3sp mins4t mi3nu m4inv mi4n5y mi7ov 2mip 4misa mi4san mi3se 4misek 4misel 9misé misha9ge 4mi7si mi2sk mis4ko mi3s4la mis9le 7mism mis4s5k mis4s7p mista9k 5mis7te mis4tra 4mistu 2misy 4miså 6mita mi3te 4mitj 4mito 2mit6r mitt3s mi5ur 2miv mi5vå m6ja. m6jan m5jar. m7jarn 2mje m7je. m1ji m8jingan m8jingar 8mjo mju7ke 1mjø mjøs5t 2m3k2 m4ko. mkro5 mku6le. mkå8pa 4m3l m7la mla6ga m2lef mlei5er. m2lek m2lel m2lem m4lera mle6se. m4lesk m6le5s8v m4leta mle4ve. ml6i ml5ja mly6se. mlø6pe. mløy3 2m1m4 m6mai mma5kl mmal5 mma8le. m4mam mmando5 mman6dol m5mar mmar7in mmar7o mmatik7ka m4medø m2meg m2mei m2me3k2 m4melu m6meni m4menu mmer5t mme4run m2me1s mmest6 m5met. m4meta m4meti m4metra mme5t6re mme3u m3mé m4mia m7mian m2mib m4mid mmie6n m2mik mmi5sk mmi5so mmi3st mm5n m3mu mmø2 mmå8la. 2m1n m2nee mn7eid m2ne9l mne4ra m5nese m4nesk m4nesta mnes9tie m9net. m4nete m2nev m6nip mn7sk 1mo 3moa mo2ar 4moba 5mode mo3dem mo5di mo6di. 2mody 3moe mo4en. m1off mofo6bi. mo6gi 5mogl mo5go m5ogs 4moh 2moka mo8ka. mo8ke mo1ki mo6la. mo3le mo4le. mo7le6s 4molt mo3ly m5om. 4momf 2momr mom4s5ø mo5ne mo4nisa mo2no mon1s mon4ste mon5t6 2mop 5mo1ra mo4ra. mo4rar mo7rar. mor5d6e 4mordl mor6d5r mo3re mores7 m2ori mo4ri. mo6rid 4m3o4rie mor4kl morla8ga mo5rok mo4rom mor4si mor4skj mor7sky mor4sp mo1rø mo9sen mo2s7k mos4o 6mostab 4motap mo4te. mo6te6g6e mo4tei mote7kl mo5ter. mo4tes mo5to 4motr mot7re mot1s2 6motsagd motsva5 mot7t mour5 3mo3va mo5w 8m1p m4pana m4p5anta m4pee m4pelot m6pena m6pep mpera8te. mpe5res m6peress m4p5erfa mperi6e7n mpes2 mpes6te mpe4sti m5pett m2pe5u mp3id m4pinje m8pla. m3p4lan mp5le. m6p5lin m6p5n m6p5ob mpoe4 m4poeta m4pog m6pok m2pop mp3opp mp1p8 mp3rad mp5ret mp3rop mpro8pa mp1s mp3sek mps4p mp5s6t mpun6ge. m9pur mp5ut. mp5ys mpø5 m9på. m3q 2m1r6 mro8sa. mro6se. mru7te. mrø9de m9rår 6ms m5sa. ms1ak ms5ant m1sc mse5lu m9s6ei m4sem m4s3eng ms5e4pl m4serv mse5s m5s6etn mse6t7jare mse8t9jas msi6e ms4ing ms3inn m4s5ja ms5kab mska9k ms6kin msk5ing ms3kor msk8u ms3lan ms6lega ms9lua ms3lue ms4ly m2sm m1s2n ms9ne ms5no ms3næ m1so m4soms ms3ori ms1ov ms3s2 m4s3tal m8s7te. ms7tea ms2ti ms5tilb ms3tim m1sto m4s5top m5s6topp mst5ord m8strand m5strane mst5red ms5tref mst5ren ms5trik ms4tru ms3unn msu9ta msu7ten ms1v msva9ra msva5re m3s4vet ms3ynd msø4ke. m4s5ør ms1øy ms1å 2m1t m3ta mt4b mtbe6 m2tee m2teg mteks7 m6te7kv m4tel m6testu mti9a m9tida mti5e m6tien. m6tif m2tik m6tini m4tiø mtiør6 m5to mt4r mt6ve mt4vin mtå5 1mu mu6a m1u2b mu2e mu3el mue7r mues1 2mug mug5l mu4he mu2k 8m9uka 4m1uke mu5la mu4leg mule6s mull2 mull6s7 mul6tiv 4muly 7mum mu3mi mum2s mun2c munes6 4mung mun6ge. 6m5univ mun3k munn5s6 mun4t3r mu6ra. mu4re. 2murn murs4 6murt m2us mu4se. mu4ses4 mu4sé mu2s3k muske6l5a must4 mus5tan 2mut 3mu1ta mu8ta. mutsa8la mut7t6r 2m1v mvak5t mva6la mvari6 mveg5s4 mvi7e6 mvi6se. 2mw 1my my5a myg4ga my3ke myk4kes myk3l my8kr my2ra my9ran my9rar my1re my4re. 4myrk m5yrke my4r5u mys3 my6sa my4se. my4so my4te. mytt6s5 5mæ mæ6la. 1mø møb3l mø7des mø6e mø9ens møkk6a m3økn 2møko mø6na mø4ne. møne9s mø8nest 6m5ønsk mø2o 3mørke mør4k5r mør5sm mør3ø mø5se 7møt mø9tas mø4tere møt9t 2møy møy9ar m5øys. 1må 2må. må5a 6måenh må7g2 må1k må4ka. må4ke. må4kes m6ål må5lar må4le. må6led måle3i målø6pe. må4ne5s6 må9nese må8pa. må4pe. må7pl 2mår måra6r må1re må1ro må1ru må1s4 må6tak 6måtf må5tr må3tø 1na na6ans 2nabo 7na7bortr na6bot 4naby na4ded na8dem nadi4 n3adop nad2s1 4nadv 8naf n1aff nafo7r na3fr naf7t na8ga. na3ge 4nagen nag3s4 nagså5 na7gø 6nah 4nair 2nak n6akk nak7ka nak6ko 5nakl na1kr n1aks nak8sa nak8se. 8n1akt nak6ta. na7kv na9lag na6lare 6nalarv na7leg na4l3ei na4lek nal5epo na4les na4l5ett na4lev nal5g nal6ge. na4lil nal6lag nal4løp nal3op nal5s2 nal3t na3lur 2naly na2l5ø 4nalå na3lå5r 5nam. na7mere na5mes na5mo9 5nams 2namø 9nan. 4nana n3anal n6ane nanfø8 4n5angr nan5k nan6ke. 4n3anl 6n5anle nan4ne na4n5o n4n5ans nan4sin nan4skj nan4s5t 4nany na7o na5pe nape4s nap3s4 n4ar. na4rap 2narb nar5dr 4narea nar7ei 4na5rek nari4e5n 7nariksk 4narkiv 6n5armé 6n5arme nar8ma. nar5s nar8ste 2nart nar6ta. nar5ti nar7v nar5ø nasa3r na4sas nas7h 8nasik na4ski na2s5t4 nasta5 8nasu na1ta nate8k na7tem 4natl 4natom natori5e6 nat8ra nat3sp nat6tak nat6tea naty5 2nauk naus6p na6va. 4navd 6navf 2navg 2n3avh na1vi 4n5avk 4navl nav4les 3navn 6navo 4navr n1avs 4navt 4n1b2 n5ba2 nba3d nba9ser nben4s nbo5et n6buf n6butr nbyr5 nbø9le nbø6n n1c n5ca ncel5 n3che nch3ei n6cot n2cy1 6nd n7daa. n6dabi n4dad nda5f n7dag4 ndags5 n4daks n3dal n4dalf n4d5all ndals3 n4dark n6d3art n8dask nda5tal nd5d4 n3de. nde5a n2deb n2ded n5defi nd1ei nd4ein nd6ek n4dekl n4deko n5d4e5l nde4le. n4delik ndel4sk ndel4st n2dem n5dem. nde5mo n5den. n6dener n5dens n2de5o2 n2dep n4derab n4deras n4derei n4derim nd6erk nderla6ga n4desi n4dest n4desu n1dé ndi4en n4d3int ndi6sk nditori5 nditorie6 ndit4t5a nd3jer nd1ju nd5k nd4lem nd4lese nd4lest nd4lev ndo9a n6dob n6d5okk nd4om4s3 n2doo nd1op n2dor nd3org nd5orm n6dote nd5rae n4d3ram nd3ran nd6rek ndre4ra nd5resen nd5rett nd1ri n1dro nd4sag nds3ak nd4s5amb nds5elv nds5ende nd4ser nd4sje nd4skj nds7kul ndsla6ga nds6lett nd7spu nd3s4te nds9teg nds5trek nd5stry ndta6ka. n6duf ndu3is n4dun nd3ung ndun6ge. n2dup ndu6si ndus7k nd7v n2dyg ndy1k n2dys ndy5sp ndø5l n2d1øy 1ne 2nea 5neae nea4g ne7a6le ne5alp ne5als nea9m ne9a8r9an nea9ren ne1as 6ne7av 2neb 3nebb 4nebe ne4ble neck5 2neda 3nedal ned3d 6n5eddik 4nedeb 4nedeg 4nedel 5nedg ne4di. nedi4s 2nedo ned5over7 ned1r ne6dre 5neds ned3st 6nedu 4nedø ne5dår 4neeg 4neei 2neek 5ne4e4r5 2nef n1eff n5eft 2neg 5negati ne3gla neg5lesp neg8r 6negru 6neh 2nei n2eid nei8dan n5eig n2e1in n3eini 5neir 2nej 2nek ne4ka. 6nek2l ne3kn nek2r nek5rin n7ekser nek5t 4nela nel3de 4neled 6nelegg 7neleggj 4nelei nelei5er 4n3elem 6nelê 4nelid 4neliga 4nelis 4nelit 4neliv nel4lov nel7s 2ne1lu 4nely 2nelæ 2nelø nelø8pa 4nelås 2nema 4n3emb 4nemel 4nemer 6nemes 2nemi nemie8 6nemj nem6k 5nemn nem5ne. nem7nel 2nemo 2nemu 2nemy 2nemø 2nemå 3nen 4nena nen5at. 6n5en6den 6nendr nene4 4nened 4nenem ne3nes 4nenesl 4nenet nen5eta 4nenev nen4ga. 4n3enhe 6nenhet 4neni nen5se nent5ei 6n3en5tr 4nenu 4neny 4nenæ 2neo 5neo. ne5o4r 7neos 2nep ne5pe 3n4er. 4nerad 6nerap 3nerb 4nerea 4nered nere6de. 4neref 4nereg 4nerek 4nerent 4nerep ne5res 4neress 4neresu 4neret 4nerev 4nerfar 4ner2g ner3ga ner3ge 4ne3rib 4nerik 4nerit ne4ri9v 5nerl nerla8ga n3erob 6neroc ne7rof ne5rok 4nerom ne5rot ne1r4ov n6ers. ner7se ner5s4i ners4p ners8ten 4ne3rul ner5un 2nery 3neryr 4nerør 2nerå 2nesa ne4sa. 5nesar 4nesc 4nese 6nesek nes6er 5nesets nes5eva ne3si nes5ind 4nesit 2ne5sj ne5skam 4ne5skar nesk4e 4neski 5neskins 4neskj 4ne5sko 4neskr 6nesku 2nesl ne3sli ne7slø nes6mi 6nesn ne7snø 2neso 3nesot 2nesp nes6sam nes4stu 5nest. 4nestas nes9tas. nes9te. 4nesto nes5tor 4ne3str 4nestu 4nestø 2nesu 2ne1sv nes8va 6nesy 4nesæ 5nesøy 4ne5så neså5re 3net. 2neta 4netaks neta6le. ne3te 5nete. 4ne3ti 6netid 2netj 2ne5to 6netom 2net4r 3nets net5s4p nett3a4 net6tel 2netu ne4tv 4nety 4netå netå5ker 2neu neu1r ne5us ne6va. ne4ve. 6ne8vent 5nevik nevi8sa 3nevn nev1r ne4y5t 2neø 4neå 1né 4néb 4néd 2néf 6néh 2nél 4ném 6néo 2nép 5nér 4név 4néå 4n1f nfall4 nfalls5 nfan5t n6foa n4fob n4fole n4fom n4fora nfor9en. nfos4 nfø5des nføy8ed 6ng n8g8ad n4gaf n6gag ng1ak ng5and. n8gan8da ng3ank n4g5arm n4gart ng5art. n5garta ngar5u n2gat ng5ato nga4ve. ng7avi ngd4 ng4ded ng4del ng4dep ng3dr n4geda n4gela n3gen n4gena n7gene n4g3eng n6geno n4genu n3ger n4geret nge5run n2ges nge3sl n4geta n2ge7v ngfø4 ng5g2 ng5id ngjen5g ng1l n5glem ng4lu ng7n ngo4d ng5odd n7goe n3g4ok n8g7o8m ng9ome ng5ond ng7o6pe n2gor ng5ord ng3ork ngos6p n2got ng3ra. n5grad. ng5rand ng7rea ng3reg ng3ren n4grend n4grer ng5rest ng3ret ng3rev ng3rid ng3rin ng7ro. ng9roa ng7roe n5g6ros5 ng3råd ng8sa. ngs5elv ng4sem ng4ses ng2sj ng2sk ng6skj ngs7leg ng5sløy ngsmå6la. ngs3ne ngs7tep ngst5rid ngstyr8ke. ngs9tør ng3und ngu5ru. ngvi4s ng5ye n1gø n2g1øy ngå8va ngå8ve. 4n1h2 nhat5 nhet4s 1ni ni1ak ni1a2n nian5dep ni2bl 4niby 4nibå 4nicr n8ida ni4del ni7dele n5idé ni6do nid7r nids4 nid5st 4nieg ni1el 7ni3e2n ni3er. nie5ri ni7ers ni5ert 4n3i4fr ni5gla ni9glo 2nih 8nij ni3ke 2nikj 4ni5ko 2nikr 4nikv ni5l4i 5nilu 4nimar 4nimas 4nimo 2nimp ni6n7al 2n1ind 4ninf ning3o nin5gr ning6s5 ningse4 nings5te 2n1inj n1inn 4ninnb 4ninnh 4ninns 4ninnt 2n1ins 2n1int 2ninv 5nio. nion2 nions3 4niop 7nios 4ni5ov ni4pet ni9pet. ni9pets ni2pl nip3li nip5si 4nir nir7kel 4nisem ni5set nis5im 4ni3skj nis4k3o ni9sol niso5ne niss4 4nistas 6nistat nis5tik 4nistil ni3str 4nisty 4nistø 6nisu 6nisy n4it ni3ted 6nitj ni4tog ni4tos nitt4r nitt4s3 nitt6sk 4nitu ni3ty nit5z nitær6e 2niub ni4umf 2niut 4niva 2nive niv5ei8 4n5ivo niv3s2 6niå 4n1j n6jah njav9 n2jed n5jede. n4jee n6jei n2je1s n3jes. n2jet n3jet. njet6r n5jett 2nk n1ka n2kak nk3aks nkal5l n2kau n4kedo n4keer n4keh nk5eie nkel5s nkelt3 n4k5enh n8keno n4k5erfa nker4st n4ke1s4 n6ketø n1ki n4kid n4kie nk3ier nk5ind nk7inf nk3inn nk7int n5kj nk1k4 n1kla n5k6lang n7k4lis nk3lok n1klu nk3ly n3klæ nk1lå n1knu n1kny n3ko n4kof nkofi8 nk5oks nko5le nkol4la n6kot n6kov n1kr n3krav nk1s2 nk4tak nk6tal nk4tin nkt3sk n1ku nku4le. nkuri9 nkurie8 n4ku6t nk9ute n1kv nk3ve n7kvit n6kvo n9ky n1kø n1kå nkå6pa 4n1l nland9a nland6se n5le nlei7er. nle8ma. nli4en. n3lj nlu4e nly6de. nly6di nly4se. nlø6pa. n7lå 4n3m nma4le. nmik3 nmi8l nmini6 nmo6se. nmusik7k nmå6la. 4nn n2nad nn5ad. nn9aft nn5air n6n1ak n4nala nn5alg n4name nn4an nn5ana n9nane nna8ni n4n5ank n5nanl n6n7anta n9nar. n4nari n6nasi n4nask n2nat n2nav nn3avl nnbo9e nnbu9e nn5d2 nndø4 nndør3 n5nea. n5neap n5nebar nnebe8r n5nebu n4nedi n2nee n6nef nn1ei n3neke n4nelo n3n4en nne6nat nne4n3o n9ner. n4nerel n4nero n7nes. n6nesj n5nes4la n4ne3st n5n6et. n4nesø n4nete n2nev n2ney nn3g2 nnhø8re. n4nid nn3ide nni3e n2nim nn7inf n5nis nni4sj nni4s3t6 nn7k2 nnle6ge. nnlø6pe. n4no. nn5of nno2m1 nn6oms nnomsy8na nn1op n2n1o4r nn7ord n4n3o4ve nn9r nnsa9ka nn4s5amb nns5and nns3ar nn5seg nnsei8g nn4s3em nn6s5enk nn4s3es nnse6te. nnsi7da nn4s3in nn4s5i6s nn6s5jak nns5kan nn5s4kli nns5op nns3or nnst6 nn6s5tab nns5tal nns5telt nns4ten nns5tep nns7tin nns5top nn6s5tre nns5tro nns3tv nn4s5ul nns3va nn6s5vo nnsy8na nn2sø nns3øk nn3så5r nn7t4 nnte6se. nnto9ga nnu1i nn6ung nn1ut nnvi4s nn1yn nny4t nn7øk nn1øv nn1å 1no noa4g no1ak 5noane no7ar. 2nob nobe4l no4bl nob5le no3b4r no5co nodi4e5n 3noe 4noef 4noei 4noek 4noent 2nof n1off 3no3ft n6ogra no5id no3in 2nok no1ki nok8r nok6se. n3oksi no9le 2nolj no6mid no6mik no4mil 4nomj nom9m nom7s2 5nomy non1s4 non5t 2noo 2nop n1opp no1r4a no5ran no5rar no5ras nor4da nor6d5end 4nordn nor4d5r nord3s4 nor4dø no9ree no3rek no3ren no7ret nor5g 3norge norges5 n3o4rie 7norit 4nork nor6kla nor6kle n4orm normlø7se nor2s nors6ka. no3ræ no4sel no4ses nose8te. 4nosp no3stj nostra4 2nosy no4ta. no4te. note5i 5notek no4tel no4tes not3s 4noty 4nou no1v no3ve 4no5vi 4n5ovn 7nó 6n3p2 n5pe npo8ta n4påk n3q 2n1r2 n9ra nra8na nra8sa n3re n4reb nrei7e n6renem n6reo n6ri. nro6de. nro6t nry6 nrå8da 6ns n1sa. ns1a4d n5sag n5sakk n5sa4kr ns3aks nsak6se. 6n5akti ns5akv n3sala ns3ald n6s5alp n5sane n4sanf n5s6ann n5sanse ns5ansi ns5ant n5saren. ns6arm n6sart n4sati n1sch n3sco nse9a8l n2sed ns5edd ns8ede n2see nse5ei nse6er n6sef n2seg ns5ege nsei6d ns5eie. ns9eig n4seks n4s3elv n2sem n5sen. n5sene. n4sener n9senes n4senet n4seni n7sens n3ser. n4sera nseri7e6 n4sesa n4sesi n4se3sk nse3sl n4ses4p n4sest n6sesu n4se3s4v n4sete n9sets n2seu ns5fr n2sh ns3ha ns7he ns5hi nsi5de. nsi4ent nsi6er. nsin5d n3s4ing ns3inn n4sinte nsi8ra nsis7k ns3jak n4sjav n5sjef n6s5jord n4skan n6s5kauk ns7kele ns4kete n9skim ns5kir n5skis n6skja n6skjele ns5kjen n3skjæ nskog6s ns5kor ns3kro nsku9et n4skug ns5kuli n5skum ns1kv n5s6ky. n5s4kye n5skyss n5slang n7slarar ns5las nsle6ge. n3s4lekt ns6leri ns5lid n5slyn n1slå ns3mi n4smal n4s5mo n4smur n4smus nsmå6la. n5s4nar ns5nes nso4d ns1of n3s2ok n1sol n4sond nson6de. nso5ris ns1ov n3sovn nspa9ra ns5pels n5spet ns1pr n6spros n7spur ns7s6 nsse4e nsså5 ns4ta. n4stak n4stag ns5take n3stam n4stank nst5art nstar8ta. ns4tau n3s6ted n3s4tei ns4tel nste6ma. ns5tenk n6step n5s4tik ns5tild ns7tilf n4s5tils ns4tin ns4t3i4s ns1tj n5sto. n3stru ns7trøy n3stue n6stuk ns5tur nst3ut n1su ns1uk n4sung ns5vang nsva9ra n2s3ve ns9veg ns5verd ns5vern ns1vi n5s4vill ns4vind ns9vis n4svu n3s4væ nsy4d ns1yt n5søn n4s1øv ns5øya n5såpe nså7pen ns7ås. 6n1t n5tab n4tagr nta4lan ntall4 nta5na. n4t5and nt3anl nt4anv nt3app n7tart n6t5arvi nt6as nta5sia nt4at nt3avi nt5avr nt7avs n2tea n5teat n2tee n4tef n4tege n4tegi n7tegn n2tei nt5eini nte5ins n5teis n4teka n7tekn n4tekse n9teleg n5telig n5tell n4tels n9telt nte4ma. nt3emb nte4mis n5ten. n4te7na n5tene. n4t3enh n5tens n2teo n5teori n5tepp nt4er n5ter. n7terek n6terest nte6risk nteriø7ra. n5ters n7tes. n4tesel n4teta n4tete nt4e3u nt5e4va nt9g nti1a n4tiat n4tid n5tiem n4tig n4tikap n5tiki n4tikl nti5kli n5tile nti3lo n9time. n7times n4t3ind nti6net n6tini n2tio n2tip n4tisa n4ti5sti nt5l nt5n nto3a n2tob nt5omf nt5omn nt3oms n2t1op n5tor. n5to5re n6torg n2tou nt1ov nt6ran n4trep n5trer nt5resi ntres9kjare n4t3rin ntrol6li n6trom n6trul ntrøy4 nt5skj nt5s6la nts2t nt3t4 n6t7ub ntu9e ntu4l n2t1u2n n4t5uro n2t1ut ntva8la nty6e ntyr3s nt7år. 1nu 4nu. nu3an nu4av nuft4 nufts5 2nug nug6la 4nu4h nuit8e nuk5 nul9t8 4nulu 6nuly nu9me 2n1un nun4ge. nuo2 6nup nu3pl nu4re nu5sa. nu5sen nu7ser nus4k5l nus7l nuss4 nu6st nus3ta 2nut nu7ta nu3te. nute6r nut5eri n7utl nu6ume 6n1v nva6la nvand5 nverle9 nves1 n5vi nvi4et nvi4ka. nvi5ke n3vu nvæ8ra n3w 1ny ny5ar. ny9ast 2nyd ny4de. 4nyef 4nyg ny5ge 5n6yhe ny3ke ny3k4le 4nyko ny1lo 2nyn nyn8da. nyn4de. 4nyo 4nyp ny8pa ny6ra. ny4re. ny7rev ny4ru ny1s ny5se ny9s6k nyst4 nystu4 ny3te ny3tr 2nyv ny8va. ny5vak ny8ve. 4nyø n1z 1næ1 næ8ra. nær9and næ8rast. 1nø nø2da 4nødd nødde5 nød3sk nød5sto nø9dun 2nøe 4nøf nø1fl nø1fr nø7gr 4nøko 4nøks nø4le. nø9mo nø5mu nø3p4 nø7ra nø6red nø1ry nø3se nø1sk nøs4l nø7te nø7tr n6øtt nøtt6r nøv4d nø3ver nøy1 2n1øy. nøy8a9n n7øyh 4nøys n3øys. nå6as 1nåd nå5ded nå8en nå6et nå8j n1å2k4 1nål nå2la nå5lev nå8ma nån6de. n1å4p nåp8na n1å6r nå2s nå5sa nåse4 2oa oa5c o1af oa4k oak6kana oak4ku o1all o3alt o1a2m o3a6n o9and o1a6p oar6d7e oar4d5in oa4r5e4g oa4r5enh oa6ré oa4r5i oar5m oa9té o1au o1a4v 2o3ba obakk8s obb4l ob4bo ob4b5r ob4b3u ob4e o4bea ober5et ober4s obers5ta obers5te o3bes 2o3bi obi5e6 1ob1j o1b2l ob5la. ob3le. ob3len o2b5li 3oblig ob4lo o1b4o obo9a 2obr ob5rar ob1re ob1ri 3obser ob5st 2obu 2oby obyl5 o5bø o3bå 4oc ock5ers o5cy 2o1d o6dab oda4f od7att odd5ei od4del od4dest od9do od4e o2deb o6d5ei o4deko o5deku o2dep oderle7 o2des o5det. o5dets odie4n o4d3igl o4dj odko5 od3oml od3ov o2d5re o4d3rø od3sk ods4ka od3s4po od5s4tol ods8t odu7s o4dy. o4dyb od5øk o5døs od5øy o2d1å6 6o1e oe6f o4ein oek6s oe2l oe4mu oe2n oen5a o7ene oeng5d oen2g7r oeng3s oeng3u o5ens4 o7ens. oen5t o3e4re o6erer oer8ma o3ersk o2es oe6sip oe6sit oes8ka oes8ke. o4etan oet2h oe5ti oev6ne. 2ofa o2fa. ofag6a o4fara ofa4se o2fav o2feb o4fei o4fera o4fe3st o1fé off9and of4fek of5fes of6fia off5id of6fr of2fu of6fy 2ofi o4fip o1fl of5le 2ofo o6fra. of9ras of1re 6o5fri of8sa of8se. 6oft of4tel oft2s3 2ofy 2og o2ga. og7ank o4gare o2g7av o2ge. o4ged og1ei oge7na. o3get og4gera og4g5j ogg3s4 og6g7u ogi3a4 ogie2 o4giev o2gif o6gig o4giko o2gil o2gim o2gin o3ging o2gi1o o6gista o6gi7str o2giv og5jer og7la ogly7 og4ned 5o4g5ni og6nel o5g6nos o2go. og6ra og4re. o4g3reg o4g3rei og4rer og7rett o4g3ri og3ryd o4g5rø og5rå ogs4a ogs6an og3s2e og1sk ogs4kj og5sl ogs4le og1s4p ogs5pa og5ste og3sti og4s5tj ogs4to ogs4tr ogs5t6ra og5stre og5sy 5og5s6y4v3 ogt6r 5o4g5åt og1un og5ø og7ås 2o1h6 ohe5te ohm9a o4ho. ohø4 oia4 o1i2d9i o1idr oid5t oie4n oi5er oi6es oi5k oi4la o1im o3in. o1ing oi2n1o4 o4insp oi6r o1is o2is. o6isa o2ise o4isi 4o1j o8je. o4jo. o1ka ok7aft ok1ak oka4n5i6 ok2ar ok5ark o3kas ok1ef ok5els5 ok5elv o5k6en o4kesk o6kev o1kj ok4kand 4okke ok6kera ok4ke5s ok3kje ok3ko. ok5kol ok4kun 4okl ok8la. okla5m ok8le. o1klu ok7lut oklå5 2okn okna8sa o3ko o8ko. ok8ol o4k3oms ok3omt oko5pe ok5opp ok3orm oko4s oko9se o6kov o1kr ok5reo o6kret o4k5ru oks4al oks4e ok4sek okse5kr ok4sem ok7sen ok6serin ok4ses okse9te ok5s4i oksi7da okst2 oks6ti ok6s5vi oks6tr ok5ta 3oktan ok3ti ok5to okto4r5i okt6r o1ku ok5u4k oku8le. oku6t ok7ute o5kva o3kvi ok5øy o3kå 8ol. 4o1la ola6ded ola8ga ol5anl ol3ant o9lar. o6larbe ola5t olber4 olbo7e olbo7ge. ol4bol olbu7 2old ol9dan ol5de. ol4dem ol4dest ol5det ol3do oldo7ve7 ol5drev ol3dri old3s4kr 2ole o5leaks o6leb o2led o2lef ol5eig ole5in o2lek o7leki o2lel olele6ge. o2lem o5lem. o5lems o7lene. o9lenes o4lenet o4leni o4leno o6lered o4leru o2les ole5sta ole5str o9let. o2lev o1lé ol4f5i ol4fj ol3g4e ol1g4l 2oli o4liba oli9e6n oli7ert oli5ne 3o6lj olke3s4 ol4kese ol4kesk ol4kest ol2k3l ol9ko ol6ku ol5kv ol5la. oll3ak ol4lam ol7le. ol4led ol4lel ol7len ol4les ol6linj ol4log ol4lom ol5los ol4lov oll5over olls4t oll5sv ol2lu ol4løp ol6løs ol6løy ol2lå olme5s ol4mest ol4må ol9n 2o1lo o4lo. o5loan o3loe o4lof olo3i ol5oks ol3oms ol3op o6l7os. o6l7o6se o6l5osf olo5ve ol4ped ol7so ols8t ol5sva ols5vik ol3ted ol5tep ol2tr ol6t7ra olt5re. olt5rer olt5ret o1lu olu5l o4l3ung olun8ge. o4l5ur ol5va ol1vo o1ly oly7d ol5ør o1lå 2om. 2oma om3ald o2ma2m om5ang oma4nif omann4 oman5t om3ars omar7ø8 om4as om1av omb6 om4bet om4bis om3bl 5ombod 1ombu 2ome o2m1ek o5meka o7menes omer6s o6mese o5met ome4tak ome7tar om1eu 3omfan 3omgre 8omh o2mia o2mib omi3e4 o4miek o2mig o7mikk o7mine om7inn om3in5s o4mio o2mir o4misj o4mist o2miu om1j 2omm om6mat om4med om4metr 3ommø 2omo o4mofo om1op omo1v omp2 ompa3t 1omr 2omre 2omro 2omru 6oms. oms3al om4sek 3omset omsko9d omsku9la om4som oms3un oms4ø omt2 3omtal om4tes om3ti om3tv o2m1u o3mus omvæ8re. 6omy omyr8ke. o2møk omø4r om5øy6 o5må 2on on3abo o4nac o6nak o4n3ang o4nap on3app o6narb o4n3arg o4n3arv onat5r o2n1a4v on5b on4dar onder6e ond3re on4d5ri onds4i o4ne. on5eie o4nele o7nell o2nem o3ner o4neru onesi6 o4nesk o4ne3s8t o4nete o2nev on7f on7ga. ong3d on5ge. on6ged onges4 on5gi on5go. ong2r on8gro ong9ros ongs4j on2gu on4gy on4g5ø o9ni. o2n3i2d oni1e o2nil on5ild o2nim oni6mi on3inf o6n7inn o2ni1o o4ni5p o6niso on3j on1k on5k6a 3onkel on5k6i on4kle on5ku onle6g on5nad on3ni on5ny o4no. o5nor. o4no4v on3ove on4sh ons1i onsi3s onsi4v ons1k4 ons7ke ons1l onsla6ga onstitue9ra onstitue9re onst5rum ons5und ons1v on4sve ons1å ont6a on3te on4ted on5ten on5ti on4tok on5tor ont2r on7ul8 on5ur onu4sk o4n5ø4 on6øy. on7å6 2oo ood1s o1off oo2k1 oo5k8a ook5es ool7a oo4m5i oo6mo o1o2p oopa8 oop9an oo4pe oop5en oop5et o6opi o1o4r oor6da oo5s oo6sp o1o4v 2op. 2opa o4pab o2pak opan9d o4pa3re o7paren o4pasj o4pau o3pea ope1i opel6lø 2open o4pena o9pend o4penet o7pent o2per 6o3per. 3opera ope6rar o7pero o5pert 2opet o4peta 4oph o1pi o4piek oping9s o4pir 2opl o1pla o4p5land op3li op9lu op4na. op4ne 2o3po 2opp. 4oppa op4p5art op4pas 4oppe 1oppg op4pi. op6pia op4pis opp3li 3opply op6poe op6pr opp5rop opp5und opp1å2 2o1pr op6re op7ru op7rå op6sa. o8p8si op2t1r o4q 4or. o6r7add or3adr o2rag or1ak 2oral or5ald o4r5alg oral4st or6alt. o3r4am o4rana o3rane o4rang o4rans or6ap or3att o4rau ora3uk or1a4v 4orb orbit5 or7by 4orc orda9ta or3dea 6ordel ord7e6pl or7dik ordi4s or4d5ise ord3it 1ordn ordre8gi. ordsa6me. ords6e ord3st ordy9ra 8ore orear8a orear8e o5rebra o8redi or1ei or1el o4rela o6reld ore6na. ore4ned ore4net or3enk oren3s ore6o5g6 o6rerf o4rero ore1s2 o5resc ores6te o4reta or9et8n o6retv o2rev 2orf orfa6re. orfi7ne orfø9re. 1or3g4a 4orga. or3ge or5ger orge4s orgi6e5ne org4sk orha9g orha9le o1ri o3ria ori5b4 ori4e5ne 5orient o7riet o2rig ori7ka o6rim or3ind or3ink or3inn or3ins oriro8 6oris oris4a 6orit o4riti oriti6me. or5ka 3orkes or5ko orko6se. ork7s2 6orl orla7te or5le orm5ang or6map or5mel or4m3un ormæ9 or4nar orned5 orne6dr or5net or4nol orn3t 4oro o3roa o3roe or3off o5rog oro5i o1ron or1op o4r1or oror9da o5rosa o5rot or3ove or5ovn orpe6s 4orr 2ors ors5alt or5sen or4serk orse9ta orse7te. or3si ors5kar orsk5ei4 ors8k9l ors4ku or1s4l orsmå8la or1sn or3s2o orso9na orso9ne orso9v ors4pa ors4ten or1su orsva9re or3sy or9sø 2ort or4t3ak orta8la. or4t5and orta9pe or4t5av orte5i6g or4tek or3tem or6t5erf or4t5erm or5tii or7til or5tis 3ortod or6tok orto9ne orto4r ort5ori or4tou ort5res ort5råd ortå4 or4t3år or1u oru8d or9ude oru4h o5rum oru4t5 oruta4 or4utf orva9ra or5veg orv3s 4ory o7rya or1yn o9r4ære 2orø or9ø8k orøk8t or5ør or3ø4v orøv8d or1øy or5ås 2os o1sa o4sa5b o6sad o2saf o4saku 6o5sau osbi7 osefi5 o2seg o5selei o2sem os2en o6sena ose5sl ose5sm oses4sk oses6sp oses4st o4seu osfa9ta os2hi os7his osi6e7ne osi5ere osi5ert o2s1ing osk3ei oskei6e o4skil osk9lar osk5len o1sko osko5p o3skri os8k3v os2l os3le oslo1 os3lod os5lu os5lø os9ma os5me os3mo o2sn o3so os7ove os6pa. os6pe. os4pil os4por os4sek os3sem os5sens osseri7e6 osse5v ossis5te os6ski oss3kj os4s5ko oss9l os6spa oss7tro os7sty os8sv ost5adr os5tal osta5le o8ste. os4teg ost5egg os4tek ost6el os5teo o4sti. o8stia o4stie o4stin os5tis ost1o os6tons ost5ran ost3re o3stro ost5rup ost7rå o5stø os1v os5øy os7år 2ot o1ta o5tad ota4l5a ot5ald otal7ev ota4lov o9tane o9tar. ot3arg o8t9arm o5tas ote7d ot6ei ote5int otek5i ote6k7la otekla8ga ote4kle ot5elem ote5lev otel6lan otel6lek otel4li otel8lø o4tena o4t5ende oten8de. o2teo o4teram o4teret o6terev o4tero oter5s ote5r8u o4terå otes6ter ote5sté otet5a otet5o otet3s6 otfø4 oti7ert oti2k otika3 ot7i6ko o1tj o6tja ot5jer ot6nero otno7te. ot6nå o1to o2to. o4to3a o5toa. o2tob oto6en. o6tof ot3off o6toga o6togram o4toi o2tol oto5ne oto4ral otor5d o2tot o2tou o1tr ot7red ot5rer ot5rev o6t7ri o6t5rom o6t5rø ots5el ot6sh otshusvæ8 ot4s3ki ots6op otsopp6 ots5pr ots5tab ot7ste ots6å ot6tank ot5tas ot5tegn ot6tenk ot5tese ot5tin ot5toa ott4s3k otts5po otts4ti ot7tug ot4typ o1tu o6t5ut o1ty oty8e ot1yt o1tø ot7å oub8 oul5l oun6ge. ou4r ou7ri ou5ro ou9sa out8a ouve4 o5vae o1vak ovanfø8 ovan9o ov3anv o7var. o6varb ova9re ov5art ov7arv oved3 o1vei o1vel ove4la 4oven o4vend o5vende ove6nya ove2r over3a ove7ra. ove9ras o6verdr overe6 ove8r5es 3o6verf 3overg o5verks 5overr 5oversik overs4p over9v o1vet 6ovh 2o1vi oviso3 2ovj 6ovna ov4nes 2ovni 4ovo o5vo. o7vom ov1or o5vot ov1o2v ov5sal ov4sek ov4sen ov9ske ov4sle ovs1p ovs5te ov4sti ov7sun ovsy5k ovta6le. ovveg7i ow1 owa8 o7was owat2 ow5h ox3 oy9ar oys5l o1y2t o1za o3zy o1ø o1å ô6ra ô2re ôr5ei ô1ri ô4t ó9sa ó7t ó8v ò9re 1pa 4paa 2pac pa8cen p5ad. pa3deb p4adg pads4 2paj 6pak. 6paka 4pake pak4kas pakke4s pakk7esl 4pakti 3pa1la pa3le pa7lim pal5in pal1j pal5lø 5palm 4palø 2pam pa5me p3anal pa4nap pan9de pa5ne pang5s6 pan3ka 9panne. pan5se pan5sl pant8r 4panv pa4ny 2papa pa8pa. pa3pe 4papo pap4pr 4papr pap3ri pa4ra. 5parad 2parb 4parek 4parena par5ess par5g 2pari pa4ri. pa3ris 4parki par6k7l par4kv par3m8 pa1ro 4parr par8ra. par9s4 par6tid par4tig par4tin par5u par7v parvi6 6parø 4parå p6as pasa5 pa9se pase6r5 4pasp 3pass pas5sab pa4s3t pas4tar pas5ti pas9v pa1t pa3te pa4tist pa6tre p8atta pat6tak 2patu p8at6v pau7k 2pav pa4ve. 3pa1vi 2p1b6 pba4ne. pbo6da pce6 2p1d4 pde4le. pdø2 pdø9d 1pe 2pea peak3 pe4a3re 4peb pec3 pe7d6a 5pedas 4pedd pe3de pedfø9 pedi9e8 pe6doa pe6don 4pedr pe4dro 4pedu 4pedy6 2pedø pe7då pee6 pe3er 2pef p5eft 2peg p5egg peg8ge. pego4 2peh pe4il pei4leg 2pe1in pe6ism 2pej 2pek pe8ka. pek4l pek4tro pekt7ros 8peku p6el 4pela pe5l4aks 5pelal pe5lar pel9d 4peled pe4lef 4pelei pe6lep 4peler pe6lev 6peliv 6pelj pel4lo 4pelov pel5s6e pel5s4i pel7st 4pelu pe5lun 2pely 2pelø 6pelå 2pem p1emb pe4nan pe4n3ar pen3de 6p5enden. 4pener pe3net 5peng8 pen4gel pen7gl peni4n 4peniv penly4 pen7s8a pensa7k pensa8la pen5sk pen4s5l pen3s6m pen5s6o pens4t pen9sta pen7ste pen7tag pen5tr 6peny 2penå 2peo pe7o6s 2pep pep5ar. pep7p pera3a 4pe4rab 4perad pe4rai pe4ral 4perap pera5t 4perate 4pered 4perei 4perek 4peresp 4perest 4peresu 4peret pe4rev 3peri perie8ns 4pe5rik peri3s4 4perit per5k per6les per5mu per5n 4pero pe3ros pero6se. per6regj per6rei 5perro pers6m per4tro per4t5rå pervi6k 2pery 6perø 4pe7rå 2pe1s 3pes. pe3se pe6se. pe7si pes8ka. p3eske pes4ke. 6pesl pes4n 5pess 3pest. 5peste. pes5til 4petab peta6ka 4petal 4petas 4petau pe3te 5pete. 4peted 6petei 6petek 4petel 4petem pe3ti 4petid 4petil pe4tim 2petj 2peto 2pet4r pe4t5ru pet1s6 4pett 2petu 4petø 4petå pe2u 2pev peva8ne. pe5vi p5evn pev6ne. 4peø 4peå 3pér 2p1f 3p6fenn p3fo p5fr pfri4 pfø5re 2p1g2 pgjer4 2p1h phav2 pha9va phavs5 phe9te phe7va phe5ve phi5li 7pi3ane 7piar pi4as 7piase 4piav 4pib pi6ca. 2pid pid3s2 pie2n 6piend pi3er. pi9ers 2pif pi9fr pig5ge pig6g9u p7i6gj 2pih 6pii pi4keh pi6kel pike5r6o pi4ké 8pikk pik3ko 4pikl piku5 pi5la pi6la. pi3lep pil4lag pillba6 pil6led pil4leg pillega6 pille6ra pil4le5s6 pi1lo 2pim pi4na. pi4ne. pi9ned pi4nel pine4v 3ping pin6go ping3r ping5sk 6pinns pin4sl pi2nø pio6n5an pion5s 3pi2p pi4pi pip9la pi4rar pi4res pi4rut pisi9e pi4ski 2piso piss4l pis4sp pis4st pis1t pis4t5r pis9t8ra. 1pit pi9ta pita7la. pi5té 2piti 4pitj 4pitr pit5t 2piu 2pi5v 4piø 4p5k4 pka5v pka8va pl6 8pl. 2plad pla8de. p4lak p4lan. plan7de 4plane. plan5g plan5s plap3 4p1lar p2las pla4st p2lat platina5 2ple. 2pled 4pleis p2lek p6le5n4u ple5n4a ple6r5u ple8se. 4plev p2li 4plit p3liv pli7va plo4gj p4lo8i p1lok 4p5lov plu4e p4luk plun3 plun6d7ri p1ly ply5d8 plæ5re plø6pa p1lå 2p3m 2p1n4 p7ner pne6se. 1po po9a pod8 po6da. po4de. po6em 2pof po6f7r pog6 4poh po5id 2poke po6lan po3le po4lek 6polj pol5li po6lom pol6s4ka po2lu 2pom pom6p9u pom5s 4pon. pon5d pon4gr pongs6 2pon1s pon5sa pon4sv po2p1a po6pe. p5opn pop1s 2por. po1ra 2p5ord po1r4e po4ref po6reg po8ré 2p1org 2pori 2pork por6s7v por4tor por4t5ro por4trå 2porv po1ræ po1rø po4se. po4ses 4posj po2st po4sta pos5tas po5stat pos3te 4pos4v 5pot. 7pota potak9 po3te po4te. potek5l po5t6ha 3poti 4potr 4pou 2po4v pove6 pover6n pow4 2pp p2pad p2pak pp3akt p2p3a4l p9pane pp5angr pp5ank p4p3anl p2pap p9par. pp5arr p7past p4p7at p4pee p2pe5i4 ppel5s6 p4pena p8p9ender p4pendr ppe9nes ppe5p8 p4penø ppe5ra p7pere. p4perkl pp7e6sen pp9esn ppes8ti p4peta pp5e4tas p4pete pp5ett p2peu p1pi pp1id p2p1il pp5im pp3inf p4p5inn pp7ir ppir8re. p4pist pp1j pp3k pp1l pp5last pp3led pp5lei pp9lev pp5n pp1of p2pol4 pp3old pp5om p2p1op pp3ork pp1ov pp5p pp1r pp5rei pp5rin pp4ris pp7riss pp9riv pp9ro. ppropri6 pp7rot pp1s ppse6te. pp3ska ppska9k pps2p pp9spe pp3spl pps2t pp7sto pp7t2 p2pu pp1uk pp5ut pp3ø4 ppøs8 p6på pr6 4pr. 4prad 3praks pra7li 2pran pran3s 5prat. 5prate pra5te. 4pray 5pref prei7er. 4preii pr5elem 1prem pren4s 1pres 6pres. pres6sak p6restas 4prett p3rif pri5ke pri4l3e 4pring 5prino 3pr6in6s5 3pr6in7s6e 3pr6in7s6i 1pris pri6s5k pris3t 2prit pri9ve 1p2ro 8pro. 6p7roc 3prof 4prog. 4proge 4progl 4p3roi p5rop. 3pros 7prose 6pru prun7ge pru5ta pru5te 6prør prørs5t prø5s4 5prøv prø5vels 2prøy 4prå prå8da pråk3i prå4ko pråk5k6 2ps p1sa. ps5a6n p1sc p3se. psei8ge p2sek p2s1el ps5e4ly p3sen. p5sens p7ser. p5sete p5sets p2sh p6sib ps5ins p7sis p3s4jo p4s3kil ps7kjen p2s1ko p7s6ko. p3skod p5s4koe p2sle p9s8lo. pslø8va pslø6ve. p3s4lå p2sm psmå8la. p2sn ps4no ps1o p3sod pspi9la ps5ple p3s4pre p4s5pro ps5pu ps3s2 pst2 ps7tal p4s5tem ps3tv p5s6tå psu4r p3s4us ps1v p2sva p2sve ps4ving p4svæ ps5w psy3ke 3psyko 4psys p2s1ø p3s2øk psø4ke. psøy8 psøy9ene ps1å 2p1t pta8la. pta4le. pt7ark p3te pte6k pte4ma. pte7re p5ti pto7g p4tou ptus5t p4tut 1pu pu4br 5puc 6pu6dy pu2k pu7la pu8le. pull6 5pum pu4ma. punk4t5 punk5t6e 2punn 2pur pu4re. pu8rea 3puri 3purk pur5u pur3v pu7sa pus4h pusl7u pu1ta pu4ta. pu5tas pu5ter pu5tev 4putg 2puts put6tr put4tu 2putv 6putø 2p1v pver7 pvi4se. py4dr py8o 3pyra py1re py1ro 6pys py6sa. py4se. pys6t 4p5z 1pæ pæ4re. pø1kj pør4ret pø8sa. pø9ta pø9te p1ø2v8 5påb på4by. på1k2 1pål på4la. på4le. p5ån på3pe på1pl p1åpn på1r 1pås på7sko på5sm på3t2 6påtå7 1påv qa5 qu2 qu9ar. 1que que7r 4raam 4raar 4rabis ra1bo4 4rabr 2raby ra3cet ra3ch 5raci ra3d2a 4radf 3radio3 4radir 4radj 2radm 2ra1dr r3adre rad2s3 radvi4 ra5ede rael4 4raerk raf4fer ra4fiu ra2fj 2rafo ra5fo. ra4fos 2rafr ra5fre 6raft ra4fu ra6fy ra7gea ra5gee 2ragl 2rah6 7raid ra5int ra3isk 6r5akad ra9kar ra7kel ra5k6ha r2akk rak4kel r6akr ra5kro 2raks rak6sa rak3s4e rak6se. rakst6 4rakti rakt3r r4a5ku 4rakv ral5ans 6ralbum 5ralds 4raled ra5leo ral3g 4r5alge 4r5algo rali5e6n ra4lin ral1j ral5le ral7m ralo6i ral3op ra5ly 4ralø 4ra5l8å ra4mag ra4mas ram3b 6r9ambi rambu9ens 6ramed 4ra4mer ram8et. 4ramil ram1o ramperi8 ram6p3u ramse8te. ramta8la. ramta6le. 4ramu 6ramy r4an. ra4naa 6r3anal ra5nar ran9cs r4an9de. r5andel rand3r rand5s6a r4ane 4ranfa ran5ge 6rangi rang5st rania8 ra6nin ran3kv 2r5anl r6anli 2r1anm r4ann ran6n5ett ran4n5in rann3s4 rans7kar 4ransv ran4tik ra5nu ran6ut 4ranø 2rao 4rapa ra4pel 4rapin ra4pir ra4pis ra6pit ra1pl 4rapo ra4pos 4rappa 4r5appl 3rappo 2ra1pr 4raps 4rapu 1r4ar. 2rarb 7rarbeh 4rarea 4rareg rar5e6l 4ra3rep rar7eta r1arg 6rargu 8rarinna 6rarinne rar8ka. 4r1arm rar8ma. 6rarn 4rarr rar3re rar5s 2r1ar5t rar6ta. ra3rø 4rasa 2rasc ra3sea 4rasel ras3h raska8ra ras3ke ra4ski ra7s6ko ra6sl rass4l ras7st 4rasti ra5s4til 4rastj rast5re 6rasty ras7v ra1ta ratak9 r6ate ra4te. 6ra5teg 8r7a6teli 4ratfe ra1to ra1t4r ra4t5ro ra4trø ra5t6røy rat5tel ratte4s 4ratub rat5ut 6raty 7raud raud3s 6raug rau6ga rau6ge. 4rau4k raus6s 2rav 6ravd rave5s4 4ravg ra1vi r3a4vis 4ravl rav8l9ut ravlø8pa ravlø8s rav6r 4ravt ra5vy ra3vør 4raw raz5z6 2raø raøy4 2r1b8 rba3d rbe2d rbede4 rbed5en rbed5et rbed9ra rbie8 rbi9er r2big r2bik rbist6 rbis5tr rbo8di. rbo4ni rbon7s rbo5re rbra5s rbrei6 rbu5en r5bø r1c 4rd r4dab r5dag rdag4s5 r5dah r4d5ak rdal4 r4dala rda4le. rdals5 rda4mes rda8n9o r4dant rd5anta r4d3arm r4d3art rd5atl r4datm r4d3au rd3d2 r6dedi rde4en r3defi rd5e4ge rd1ei r9deka r4dekl r4deks r6delo r6demi r7dena r6d7eng r6d7enh rden4s3 rdense4 rdenta8le. r4deo r6depo r4derik r4d5erst rde6sm rd3e4ta r6d7ett r8dé rdfes5 rdi3an r4diana r4dians r6diau r4did rdi3e2 r2dif rdi6gres rdig3s4 r4dika r4dikl r4diku r2dil r6dimi r2dio rdi3ov r4dish r2dit r2diu rd5je r1dju rd7m rd3n rdnæ4 r9dob r4d5o4d r4dol rdon8na. rd1op r6dor rd3ost rd1o4v rdover5 r9drad r3drak rd5ran rd7rara rd3ras r3drei rd3ret r5drev. rd1ri rd3rot rd3sei rd8ske rds4kv rds5tan rd3sto rdsto5g rds7tre rds7tu rdsva9r rd5t rdta8ka rd5tr rd7tø rd3und rd5ve rdvi8ka. r4dyg rdy5pe rdy3re r6d7yt r6d5æ r7d6ær r7d6æ5r6e rd1øs6 rdø4ve. rd3år rd7å6s 1re. 2rean re7a6r7an rear5e 4reav 2reb 3redak 6redam re3def re5den re3des re3di 3redig r1edl 2redo 2redr re4d5ri red5sku red4sl reds5la red7s6led 3reduk 6redy 2redø 2ree re4el. re3er 8refa 4reff 4refi 2refj 6refos 6refr 4reft 2refø 4regar rega7ta re3ge 4regeb re5gel 4regen 4reger 4regg 1regi re4gia re4gil reg1l 2regr 4regub 4regud 2regå 2reh 2reid 2reie 2r1eig rei8ga. rei8ge. 4reik rei9l rei5na. rei7nas re5inde rei5ne. rei7nes rein6skj re4inva rei9ra rei5sa rei3si rei7ska reis6led re7ism rei7va rei5ve 2rej 6rek. re5ka. re5kav re7ken 4rekj rekk6an rek4k5v 5reklam rek4led re5k6lir re7ko 4rekob 4rekom 4rekon 6rekos 4rekra 3rekru r3eksa 6reksp rek4ter 4reku r8el. re9la 4relag 9relandsk. 9relandske 2r2ele rele8ge. r4e5lei 6relek re7len 7relene 6relg r3elit 4re3lj r2ell rel4lag rel6land rel5led rel4lev 5r4elm rel5ses rel4sk 4re1lu 4relv 2re5ly 2relæ 2relø 4re7l6å relå7r 2rem remann6 r1emb remi6ene remi6l re7mis rem9ji remmed5 6remn rem8na rem5p4 rem1s remti9da 4remu 8remy 4remå 2re3na ren4del 4rendr 8rened re5neg re7nei 4renek r3e4nel 4renest 6renet 6rengd reng5l 4rengn reng5st re5ni 2renk ren6kl r3enl ren8ne8sl rennes9la re5no ren5sa r3enss 6r7entit 4r3en5tr 6rentu 4renu 5renz 6renæ 4renø re5og 2reop re3o2r 5reou 8repen 6r5e6pi 1repu 6repus 1rer 6rerad 6re9rang 4rer6at re5re. 4rered 4reref 4rereg 4rerei re4rek 4rerent 4rerep 4rerese 4reresu 4reret 6rerfa 4rerig 4rerik 4r3ernæ 4rerol 4rerom re3ros rero6se. re5rot 3rers rers4p 4rerute re6r7øy 2rerå 1res. 2resa re2s3c re3se 4resel re4sem 4reset resi7ere 4resin 2resj 2resk res5ke re6s7kje. res6kl res7kod re6sky 6re1sl re4slu 1resm re5smo re3sov re9spe 4respi 4respr 2ress res4sal res4sek res4sit res4sj res6sk res6sort res4sp res4st res4sy res9tane 5restau res6t5erv res4tes res3té 4re3sti res4til re3str 4restre 7restv 4re5sty 4restå 1resu 6resuk 4resun re3svi 2resy 2resø 4retaki 4retal re4tap 4retea 8retek. 6reteke 4retekn 6retel 6re5tem re5ten 4re5ti 4retj 4retoa 2re5t2r rets4i ret4st ret7ted ret5ter rett8o rett6set 4re5tu 2rety 2retø 5retøya. 7retøyets 4re7tå 2reu reu6r 4revak re5van reva5re. 6reveg 4revei 4revel re6v7enh re5ver reve5s r3e4vig re4v5inn re7vom 1revy re4v5åp 3rew 2reå 2r1f rfa5re rfat5 rfe8en. rfe8er rfe4et. rfei5li r4fik rflå3 rfe5m6ø rft2 rfu8se rfyr4 r9fæ rfø8rarar 2r1g r5ga. rga8le. rga8li rg5and r7gann r4g5anv rga3ri rg3art rga4ve. r6gedi r4gef r2gem rgent4 r3geo r4gerei r4geret r4ge3ru r4gesj r4gesl r4gesta rgi1a rgie4n r2gik r2gil r2gim r2gio r2gir rg3i4ri rgi7sl r2giø rg2le rg5le. rglem5 rg3len rg3ler r2gn r4gog r3gom r2got rg5rab rg3rea rg3rel rg5reps rg5rin r3gru rg5sc rgs6kor rg5s4le rg1sn rg5s6till rg5sto rg9stu rg2sy rgu7d rg6ut rgå9as rgå6va rgå6ve. 2r1h rhav2 rhavs3 rhjul8s rho3d r7hu rhø5re rhånd6s9 rhå9ne ri1an 4rianf 4rianl 6riansv ri1ar 4riarb 4riarr 6riau 2riav ri4ava 3ri6avo 2rib ri2b3l ri8ca. ri4co. ri5da 4ridale ri5der ri5di 2r1idr rid3t 4rieie 4rieig 4rieks ri1el 6rield 4rielem 6rielim riel4la rie4n ri3end 4rienh 4rient rien5t4r ri1er rie5ra rie5ri 4rietat ri5even 2rifa riferi9e8 rif4fi rifiserba8 6rifj 1rifl rif5la 2rifo 2rifu 4rifø4 ri4ga. rig4gr ri3gi 4rigj 4rigre rig2s rig6s7t 2rih 2rii 2rij 5rij. ri4kali ri5kan 5rikd ri3kes ri7ki rik7ken rikk5j 4rikl ri8k9la 2ri7ko 6rikon 2ri1k2r rik4sk rik4s5u rikt6 rikts3 riku6m ri3k4v 4rikå 2rila 6r5ilde 6riled ri5lei ril6lest 2ri5lo ril4sn 2rilø 4rima ri9mab ri9mar 6rimes ri5met 2rimi ri4mi. 7rimis rim7l 4rimm 4rimo ri4mor 4r1imp 4rimu rim9ut 4rimy rina5l ri5n6am 4rinas 4r5inc 4rind r3indu ri4nee ri4nes 2r1inf rin7gom ring3r ring4sa4 rings5ak ring8spa 2r3inj 2rink 4rinn rin9nes 4rinor 2rins rins6k rin6sm 2rint rin4t5j rin4tr 2rinv ri6nø 2ri1of 6ri3om 2ri1op 2rior rio5s4 riot3r 2rip 4ripe ripo4s3 4ri1r 4risau 4rised rise5i 6risek 4risel ri4seli 4rish 5risiko 2risj ri6sju 4riska ri4ski 6risku 4risky 6ristad 4ri5sted ris5tik 4ristil ri4sto ris5tof ri5stun 6ristø ri6stå 4risv 4risy 4risø ri3te 6riteo ri7ti riti9da 4ritil 4ritj ri5t6o ri5tr rit1s6 ritt8s7t ri6tun 4rity 2riun riu4r 2riut 4rivar ri6ved rive9ge ri5vei 4riverk 2rivi ri4vi4s riv5ise 6rivo 4riøk riø4r3a 8riøya 4riå r1j rj7ambi r4jere r2jes r4jeti r4jetr r4jetu rju6la 2r1k rk3akt r6kanf r4kao r4kapr r6katr r3ke. r2keh rk5eik rkei8ka r6kek r4kelo r4ke3lu r3ken. r4kenav r3kene r4keni r5kens rke5ri r4keris r4kero r5kers r4ke3ru r4kerø rke4se rkeslø7se r9ket. rk4han r3ki rki3d rki3e rki4vi rkjek8 rk5jor rk1k2 r5k8led rk2li rk5lun rk9lut rklæ5re rk2lø rklå9ra r3knek r5knep rk7nes r3kno r2kob rko6b5r r6kofo r2koh r4kola r4koli r4kope r4kora r4koru r4kosel rko6sele r4kosj r6k7ras rk5rei r5k6rem r8ks rk4sar r6k6seg rk2s1i rk4ska rk1st rk6stal rk4sten rk4s5ti rk4stj rk4sto rk6s5vi rk5ti rkti4s rk5to rku4le. r6k7u6t r4k5ve6d rk9vei r5kvel r4kver rk3ves rk5vik r4k5øl r2k3øy rk9øys rkå4k rk5åke rkå6pa rk5å4s 2r1l rla4te. rle4a r2lef r3lep r4l5e4ri r6le7sl rle4st r4lesu r4leu r3l4i rli9ke rling3s4 rli8ta rli4te. r3lj rl6o rlog2 rlo5ve rl4sk rlu4e r3ly rlys7k r6l5z rlø8pa. r5løy9 2r1m rma6ge. rma5k4l r4m5alte rm3anl rm4ans r6manv r4mare r4marr rm5av rm3b r2me7g r2mek rme6lap rme5ne r4menet r6merev r4mese rme9tar r4mey r4m5ide rmi6ene rmini6 rmin5ski r6m5inst rm5i4v rm1je rmlø8pa rmo4e r2mof rm1op rmo7st rm7p rm5s6ko rm1sl rms6n rm1st rms5til rm1su rmta8la rm3te rmu7an rmue4 rmue5ne rmu8la. rmu6le. rm5øy. r9må. rmål4 r6m5åp r9mår r6m7åta 2rn r3na r4n1ak r4n3ald r6n5appar r4narb r4n3art rnat7r r4natv r6n9a6vis rn3avl rn3d rndø4 rndør5 r3ne. rne5a2 r5neboe r2nec r4nef r2nel rnele6ge. r3nell r3nels r4n3eng r4nenh r4nerei r6neris rne3ro rne1s2 r5nes. rne6se. r8nesi r4ne3sk r4nesm rne3so rn5e4tab r4nete r2nev rne5vr r2nés rn5g6 r4ninn rn5k4 rn3n r5no. r4noa rno5b r4nod r4noi r6nok r2nom rn5omn rn3oms r4n1op rn3ork r2nos r4n1o4v rn7se rn4s3in rn5ske rn3skr rn5sla rnsle7ge rn7s6mi rn6s3ovn rn5spon rn3s4pr rn1st rn4sti rn3te rn5ti rn7tr rntre4 rnt4v rnu4 rn5ug r6n3ut r7nøt r4n5øv rnå8le. rn3ås ro1ak roa4s ro5asi 9roban 9robar 1robe ro4bed ro4bef 5roben ro4bes 5robølgj 1roc r3odds 7rodo ro5end ro7ens ro7fa ro4fel ro4fem roff5ri ro7ga. roga9ta ro7ge. rog5ret ro6gry rog1s4 ro2gu 1roi ro4kel ro5ki rok6kat rok6keri rok5kl rok4kom ro7k6l rok5n rok7s rok8se. rok5v roli7ga 4rolj rol4lab rol4lap rol4leg rolle8ge. rolle8se. rol4lis rol6ly rolo9v 2roly ro6mak ro4mal 3ro5m8an ro4mate 2rom7b 4ro3me rome5d 4romk 4r3omn ro4mor 2romr rom5sla r7omsy romsø3 rom3t ro5ne. ro7nim 6ronism 6ronista 8roniste 6ronisti 4ronn ron4na rono5s ron1s4 ronta6le. ro4pad 5ropet ro4pia ro8pla. 2ropp ro9py ror3a ror6da. ro3re ro1ru ro4sat ro5sel ro3sen 4rosl ros3la ro4sm ro6sov ro1s1p ros4st ros4sy ros7tas ro3sti ro3str rost7rø rot5ekte ro5tes rote7ster roti7ka rot5ord ro5tu 6roty roun2 round3 ro5ut ro5va. ro9vare ro7vas ro5vek ro7ven rove5re rov5sm rovve6 rò6te. 2r1p r5pa r6parb r5pefo r4peno r6penø r5pesk r5pet rp6j rp2l rp3lad rprø5ve r3pu rpun7g r6p5ut. r6p5øy r2påk 2r1r r8raa r2rag rra3r r4raro rr3d rr6e r4reb r7rebart. r2ref rre7int r4rekl r5relat r4reo r4repl r4re3ru rre5sk r4resm r4reso r4respe r3ress rre4st rres5ta rre7sti rre5str rret6s5 rre5u r3ri rri6ka. r6rip rri5v rr3m4 rrmå8la rro6e r5rom rro8sa rro8se. rro8ta rr5s2 r2r3un rr5v rrå5de 4rs 6rs. r1sa rs3ab r2s7ad r3sak rsa5ka r6sakt rsa6la. r8s9ald rs3all r5sam r4sarr rs3arv r1sc 5s6ch6l r8sedi rse6g7 r4seku rs4ela rs7eld r4seli r4s3elv rs5e4rik r3ses r4sesi r6sesu rse4te. rs6ett rsett8o r7sim6 rsimp7 rs1in r5s4ing r4sins rsis5t r7sja r4sjh rsj3or r3skad r6s7kaf rs4kam r3skap r4skar. r4skas r4ski r5skil rsk7inns r1skj rs5kjens r6skl rskla8g rsk5lar rs4k5le rs4k3læ r5sko. r5skoe rsk3op r4skor r3skot r1skr r4s3kra r5skriv r4s3kro r1sku r5sku. r5skue rsku7et rsk5und rsk5var rs5kys rsk5ø rs4lef r4slei rs4lek rs4les r5s6lit rs3lok r4slun rs4make rs4mo. rsmål4 rs6nev r1so rso9a rs5oml rso6n5 rso7n6al rso5n8e rso5n6i rsons4 r2s1or rs5ord rso7ris rs1ov r1sp rs4pan rs6pat r5spel r4sper r7spes r5spi rs4por r5spred r4spå rs3s6 r1s2t r4s5tabb rs5tank rs3tap r6st7b rs4ted rs4tem rs5tend rsten6s rs5ter. rstev9na r3stil r4s5tilf r4s5tilh r4s5tils r4s5tilv r5stis r4stit r6st5k rst4r rs9tre. rs7tree r4strin r4s5tro r5strø rst7ut rstu9va rstyg7 r3st6ø r7stå rs5ukl rsu9r rsu7sa rs5usi r1sv rs8vak rsva9ra rsvar4s5 rs1ve r3s4vek rs5vit rsy4na rsy3t r1sz rsøks3 rs9øye 6r1t rt5ad r4t5af rta4ka. r4tana rt3anl rta9pa r4tarr rt3art rt3avs r4tec r4teda r3tede r2tee r4tego r4tegr r4teie r4te3in r4teka rte6ke. r4teki r4teku rt5e4lit rte6ma. r3temp rten4s5k rtentle8 r2teo r7t6er r5terd r5teres r4teris r5terk r4terå r4tese r6tesk r6testi r4teta r4tete r4tev r4th rtian8d r4tians r4tiar rti8ar. rti5en rti6gra r4ti3kv r4tila r4tili r4tilo r4ti7na r2tio r2tip rti7sa r6tiska r4tiski rt6i9so r4tisp rtis3s r4ti5str r3titu r2tiv rtma6le. r5to. rt3off r9tofo r9tok. rt3omk r4t3opp rt6opp. rt3ord r6t7o6s rt1o4v rt2r rt8ra r9tre. rt6red rt3reg rt3rei r4t5reko rt5rel rt5rep r7trib r4t3ris r4t5ros rt3rut r5t6rål rts3ar rt4seg rts5eng rt2si rt4s5ja rt5ske rt3skj rt5s4no rt3s4pe rt4sti rt7s6trek rt4s5tøy rts5unde rt3t4 rtu6en. r7tug rt3und r2t1ut rtu8ve. rty8da. rty8de. rtyr5s rty6ra rt5yt rtæ9ra rt5øl r6t5ås3 ru3and 6ruav ru6avh ru8bl ru5bo ru4di. rud4r ruds4l ru4ele rue4r rue3s4 ruga8l ruga5t rui3d6 4ruk ruk4su rukt3s ru9la 4ruli 6r7ulk rul8ke. r2ull r7ulv r4um rum3al rum4p9l 5r2unde run5del 6r3under 7r4under. r5unders rund3r rund3s4 run6ge. 4ru2ni run5kr r7uly ru4nøy ru2r ru5ra ru8ran ru8rar ru9rer rur8ta r4us rus2h3 6r7u6sik rus5j rus7lu ru1s4o rus5sel rus4st ru4s4t3r r4uta ru3tal ruta8la. r7utan. r4utbe 4rutd rut8e rute3i ru4tel ru9tene. ru9ter 2rutg r1utk rut9o 6rutr rut4re ru6trø rutto5 2rutv ru5va ru4ved ru4veg ru4vei ru4vel ru4vere ru4ves ruvi8 ru6v7is 2r1v rv4a rva7ka rva6la rve3de rve4den r4ve5dr r4vega r4vegi r4vegr r4veim rveis7e6 rve5kl r4vela rvel9le r4v5eng r5ver. rve5re r2ves r2vev rvil9l rville9d rv2j r4vos r4vov r3vr rv2s1 rv5ung rvå7r 4r1w rx1 ry1a4 ry2dr ry7fe ry5fl ry5ke. 2ry1kl ry7le ryl4l5i8s 4r5yndl ry4nes ry5nes. ry4pa. 2ryr ry8re r1yrk ryr4ke. ry9ro ry5rø rys6sal ry5ta ry4tek 1rytm r3ytr r4z ræ7le 8r3æ4re 8r3æ4ren rær5in rær8t ræ8v 2rø. rø8ar 6røb rø4be. rø4dek rød1s 4røep røf5l rø4ke. rø4kero røk3l 4røkn røk5s4 røk7t røk1v 2røl rø6m røm1a røn5nes rønn5s4a rønn5sk røn5sko 5r6øntg rø4pe. røp9l 1rør rør5d6 r6ørende. rø7ret 5rørl rø2r3o rør4sp r8øs. rø3se rø5sla røs5v rø8ta røt9as rø1va rø5vede rø9vers rø1vi r4ø5væ 2r1øy. 4røya røy9ar røy6ed røy6ene røy5es røy4et 5r6øyk 3røyr røy5re røy8senes 6røy4s3k røy4st 2rå. rå7a 4råag 4råb 3rådet rådy9ra rå9ene 2råf 4rå5g4 2råkj råk3re rå2k3u råk1v 4rål råle7s8 rå4let rå5let. rå5lu r5ånd rån6da 2råp 2r1år rårs5k rå5ru rå1s 4råsb 2råse rå5si 2råsj rås4t 6råta råta8ka. rå5tr rå5tu 2saa 5saa. sa4ba. s6abe s8abl sa5bok s3abon sa5by sa3ce sa4dag 4sadam sa4dere 4sadm sa4do 2sadv sae5d 3saen 7saer 1safe 5saga sa4ga. sa4gas sa4gat 6sagent 6s5agg 6s5a6gi sag8na sa6go. sa4gog 2s1a2gr sag3s4 sa3ik sa5ir sa1is 5sak. sa2ka 3saka. 4sakad sa5kai 3sakb 3sakd 3s4a3ke 5sakf 1sakh sakh5e 1saki sa4kj sak5kr s4akky 5sakl 5sakm 4sako 3sakp sa1k2r 5s4aks. sak4s3i 4s3aksj sak4sp 5saksr 5saksu 2s1akt sak6ta. 5s4akto s4aku 4sa7kø 1s4al. sa1la 4s5alarm 7sala. 5sa5lat 4salb 1sa3le sa9let 1salg s4alge 4s5algo salg6s5 s6ali sal4mes sa5lo 5sal2s3 sals4a 4salter sa1lu 3salv sal5ved 2saly 1s2am 5sam. sa2ma sa5ma. sam4an7 sa5mas sam5ei sa4mel sa4met 5saml sam4lev 5samm sammen5 sa4my 4s1a2na sa9na. sa7nar sa3nat san6da. san7d8al 5s6ande. sand5r sand5s6lo sand5st san4d5ø 1s2a5ne 4s3a6nek 5sang. 3sange 4s3angr s7anken 2s1anl s5anm san5ne 6sanno sa2no s5anor san5os san1s 5s4ans. 4sansa 5s4ansen san7s6k 4s5ans8l 6sansv s8ant. san9te 6santr 4santy 4s1anv 2s1ap sa2po 1s2ar. 1sara 6sarab 2sarb s4ard 9s8are. 4sareal 4sareg sa5rev 3sari sa4ri. sar6ka. 4s3arki 2s1arm sar5me sar8me. s1arr 2s1art sar4ta. sa4ru 4sarv s4ary 1sas 8sasju 2s1a4sp 4s1ass s6ast 4sasty 2sasu 4sasy 1sat sa1ta sa5ten sa3ti 2s1atl 4s3atmos sa1to 4sa5t6r s5atsk 5satt. 4s3atta 6s5atten satte4s 5sau. sau4d sau5di. 5saue 4saug sau6ga s3auge sau6ge. 2s1auk 5saum 3saus 4saut 2s1av s2ava sa4ve. 5s6a5v6in sav5n 3savu 8s9b4 sba4ne. sbi6e sbo4da sbu6et s6bug sbul3 sby8ta 4sca 1sce 2scel s4cene s3cer 6sch. 8schl. 6s7cl 4sco. 6scoc 4scos s4cus 8s9d6 sdag4s5 sdam9p sde6le. sdu8en. sdu8er sdø8v 1se 2se1a 3sea. sea4g se3an5d se7ansa sea9re 5se4au3sk 2seb 4sec 4sedag sed5d se3de 5sede. 5sedl 4sedo 2sedr 2sedu 6sedvanle 2sedø 5see. see3d 2seef 2seeg se6e3i se3e4l se5en seer1 5sees 2seev 2sef s1eff 4s1eft 6sega sega6l se2ge se6ges se3gev seg8ga. 9segl. 7seglet 3segm 4s2e7g8r 2seh 2seid sei8dan sei9den sei8e9nes s5ei4et 2seig sei6ga. sei5ge sei5k 3se8il 6seim 2sein se3ind s3eini se6ink se3ins se3int sei5r 3seis 2sej 5sej. 2se5ka 3seke 4seki 2sekj 5sekk sek4kes 2sek4l 4se3kn 2seko se2k1r 4sekra 4sekri 4sekro 3s4eksj 4seksp sek4st sek2t3an sek6te. sekte9ra 3sek5to 4seky 4sekå s2el 2sela se6la. 3selak 5selane 5selar sel5art s3e4las se6l5at sel1d se4le. 4se5led 6selega 4selei 4s3elem 4seleng 4seles 4s3e4lev 5s6elg 4selik 4selil 4selis 4s3e4lit sel6løp 2selo 7selol se3lom 3sels sel4sin 8s5elske sel9s8lag sel4spo sel5t6 2selu se6l7u6r sel4v5ak sel4van selv3e4 sel4ve. selvei4 sel4ver sel8vin 2sely 2selæ 2selø selø8pa. 6selå 2se3ma 3semb 7semd se5me se4mi. semini6 2s1emn sem4na 9semnd 2semo sem5pe 2semå s2en. 6senau sen9d8a sen6dela 6senden 4sendr s2ene 4sened se3neg 4senem 8senesa 6senese sene8se. s5engas 2s1enh se6nin s3enkj 5sen3n s2ens 4s5ensem sen6s5end sen4sj sen3so 7s6ent sen5ter 8s7en5trep 4senum 4seny 2senæ 6senø 2seo2 7seod se3or 2sep se3pe seperso5 3sept s2er. se3ra 4seram 5seran 4serap 5seras 6serau ser5d s2e5r4e 5sere. 4serea 4sered 4seref 4sereg 4serei 4serek 4serel 4serenn 4serent 4serep 4sereso 4seress 4serest 4seresu 4seret 4serev s1erf s2eri seri6e5ne 4serik 4serkje 5serkr 5sern ser7nev 2se1ro se4rop se4ror se4ros 9s6ert ser4tak ser6tat ser4tr se1ru 4serul se4r3un ser4ved ser4vel 2sery 2se5r6ø 2serå 5ses. ses5ald 5sesals ses5alt 4sesc 2sese se4sene ses5in se3sj 4sesje 4sesjuk ses5kal ses5kar ses5kv ses5lit se3sna 5seso ses3pr ses4s5in se1st 5sest. 5seste. 4sesto ses5un ses1v 2sesy 4sesø ses3å 3s2et. 2se2t6a 3seta. se5tae seta8ka se5tar 6setea 4seteg 4setei 4setek se7tel se4tera se5tero 4setes 2se3ti se8ti. s3e4tik s3e4tis 4setje 5setje. 7setl 5setn 2seto 2set6r s4ets s5etters 2setu 2setv 2sety 6setø 3seum 4seun seure9ne seu2t 2sev seva6ne. s8e5var sev4d sevi4sa s1evn sev4ne. se3vr 3sevåg 2seyn 2seø 2seå 1sé 2séa 6séb 4sée 4séf 4séj 4sék 2sél 4séo 6sép 9sér 4sés 2sév 2s1f sfa4ne. 6sfe sfe6et. sfes5 sfisken8 sflå3 s5fo sfo8ra sforlø9 sfra5s sfri5e6re sfyrs5 3sfæ sfø9ren sfø5rer sfø5ri 6s9g6 sga4l sga8va sga4ve. sgen9s sge4st sgå4va sgå4ve. s1h 4sh. sha2k s7hat s3hau 6she shea4 s5hei5 7sh6e4rif s4hi. s6hip sh5isk 4shj 6s7hopp 3short 3show 6shs 2shu 4s5hy s5hø shø8l shø6va shø6ve. s7hå 1si sial5v6 4sia5m si7ans 4siap 4siav si2bl 3si2da 3si4de. 3si3den si4deo s4ider si5der. si4dete 2si2do 4s1idr sid8ra 4sidy 4sieg si1el sie4n si5er. si6eren sie4s si3est 6sife si3fl 2sifo si4f3r 2sifu 4sifø 3sig siger4s 4sigi 4s3iglo si5gr 4sih 3sik si3ka si5ke. sik2h7 sik4ka sikk8artet sik4k5el sik4ko siko3 si4kom si4kop si4kos si4kot sikt4s3 s2il 5sil. 3sild sil4del sil4der sil4des sil5j sil2k sil4les 2silø si6mel 4simet 2simp si3mu 4sinde 4s3indu si3nek 2s1inf sing4s5a4 7singu si4ni 4sinj 2sinn 3s4inn. 7s4inna s6inne. 5sinnet s3innh s5innk s3innl 4sinnt si5nob sinsk5e 2s1int 4sinv si6nø 4si5ov si4pa. si8pe. si6re. si7ren si4ri. sir8kl s2is si5sel si4serf sis5e4v si6sin 6sisju si4sk sis5ke si4sn si4s5te si4sti sis3to 4sisy 3s2it si5ta sit8ji si6t7ra si4t5re si4tri sit3s4 sitsva9 sit6term sit4tes si4umf 4siut 5siva si9van si6vek si8vi. si9våt 1sj 2sj. s2ja. 8s5ja9g 4sjam s4jan 4sjanl s7jarn 2sj3av 6s7jaz 2sjb 6sjd 5s4je. sje4f3i sje4fla sjef5t sje3g sjek4t5o 3sjel sje4lev 3s2jen. 5s2jene 4s3jent 5s4jer. s2je5s4 5s4jet. sjet4ti 2sjf 2sjg s6jim 2sjk 2sjl 2sjm 2sjn 2sjob 5sjok 4sjom 9sjon sjons7 2sjor 2sjou 2sjp 2sjr 2sjs 2s6jt s6j3t6sj sju1a 6sjub 6s7jug sju8la 4sjun 4sjur 2s7jus 5s2jø sjø3k6 sjø1p sjø9rø sjø1s2 sjø3t8 6sk. 1ska 2ska. 4skab skabe3 s2kad 8skae 4s6kag 2skak 5s4kal8a ska5lar 2skam s4kaml 4s5kana 4skande 4skane 4skano 6skant 5s6kap. 9s8kapa. 4skapas 5skapen. 6skapit 4skapp 2sk2ar sk5arab sk7arbe 5skard 4s5kark 6skars 4skart 3s8karv 2skas 4skate 8skay 4skb 6skd 2ske s4keda s6kedo s2keh s6kei skei5er. s8k5e4lev s6kelik skel3t s4kelu s3ken. s4kena s6kenav s4keno s5kens 5skept s5ker. s4kero s5kers s2ke1s ske3si skes4m ske5sn s4ketet s3ke4t3j s6kev s2key 2skf 2skh 1ski 5s6ki. 7skia 4skid 5skie 5skif 5s4kik s6kill 5s4kilt ski6net ski4nin 5sk8inns5 skino6 5skiol 5skip 2skir s4kire 6s5kirk sk5irs s6kis. 7skiss 4s5kist 5s2kiv s6kje. 5skjema 6skjemas 5s6kjer4m3 3skjer5m4e 7skjers 3skjor 4s5kjærl 5skjøn 6skjøp skjø5res 2sk1k4 2s1k2l 6skla sk5lak s6k5lan s5klas sk9leg s6klei sk3lek sk5ling sk5lit s4k5luf s2klyd 2skm 2skn s1knu 4skoa 7skodd 4skof 3s2kog 2s3koi 1skol 7s4kola 3skole 4s3koll 4skom s6koma s5k6ome 6s1kon 4skoo sk5ord s6korpi s7kors 4skort 2skos s2kot 3skott sk8ra s4k9ra. 5s4kral s4krat s2k7re. 4s3kref 6skreg 5s8krek 4s3kret 5skrevn 3skrib 3skrif 4skrig 3skrik 3skrip 4skrite 3skriv 5s4krog s3kron 4s3krop sk6rud skru3s6 6skryss 1s2krå 2sk1s2 2sk3t4 5skud 1s4kue sku4end sku4er skue5re 1skuf 5skulan 5skular 3skule 6s5kulis 4skull s4kulp 4skult skum3s 2skun s6k5underv 4skup 8s5kurs 8skurv 2skv sk5va. 3skvad sk3vas s6kven sk3ver sk5vit 3skvu 1sky s6kya s6kye 4skyr sky3re 4skys 6s6kyss 5s6kysk 3skyt 6skæ 6skø. 6s5køa 4skøe 1skå skå5re 6skåt sl4 sla8da s3lade sla5ge sla8ge. sla5ke s5laks 3slakt 3slal 4s3land slap5pe s5laran s5lare 4s5last s1lat sla4te. 4s1lau s5laus sla1v 3slave sla4vin 2sle. s8leda 7slegare 5s6legas s4legi s4legn s6legr 6slei slei5er. s4leiv 8s5leke s5lekk s2lel s4leme 4sle7ne s6lener s6len6t3 2sler 8s5les s6lesj s4leso s6lest s4leta s5lev s4leva 4sley s5lia 2slid sli4en. 6slig sli5ke s4likk 2slin 8s3linj slin6t5 3slip 5s4lit. 3s4lite 4s5liv slob5b slott4 s6lott. 7slottet 1slu 8slu7a 2slu2e slu5es 6sluf 4slug sluk3s6 slum4p5 slum5p6e s3lund s5luns s6lup slu7sa s4lut s1ly sly8et. 1s4lyn 4s5lys sly8t slæ6rari 2sløn 8s5løp slø4pa. s6lør 2sløs slø8s5a 3s4løsi slø5va slø5ve slø5vi 5sløyd sløye7 9s4lå. s4låe s1lån slå5ner 1slåt s1m sma6d 3smak. 5s4maken sma9let 4sman s4med. s4mede 6s5medi s4medk smeg5 4smei smek7l s4mekt 8s5meld 3s4mell 5s4melt 2s5men 3s4mert 6smes s6mesi s6mia s4mie smi4ene s4mig s6mil. smi7la s6mile smini6 s2mit smo7a smo8de. s2mok 6smot 3smug 6s5mugg smul2 s6mula s4muld s6mule 5smurt 1s2my4k 6smøn 1s2mør smør3s 4smøt 5små. små5r s8mått s1n 8sna. s4nab 7snak 4s3nas 6s3nat 4snav 4sne. 4sneb 4sned s6nee s4neg 3snei snei5er sne4kri s7nekt s4nel 2snem 4sner 6snes sne9sa snes9v 4snet s6nif sni6gl s2nik snik5ko 3s2nil 6s3nin 3s2nip snir4 5s2nit 2s3niv s8no. s6noe s5nord 6s7not 5s6nud s3num s4nur 7snut 8snyh 2snæ snæ4re. 5s6nø. snø5d4r 5snøe 1s2nør snø1s snø5vi so3al so8ar 4soav 2s1ob so2bl 1sod so4da. 5soe sofa1 so4fag so4fas 6s5off 6s5ofre soft1 so2ga so8gi so7gl sog6nem 6soh 5s4oi4 so5id 5sokn 4soks sok4se. 7sol. so4la. sol5av 1sold so4le. solei5er so4lene sol5f6 1so7li 2solj so2lo so8lo. sol3s2 sol5t4 so4lum so4lø 3som. so6mend 4s3omfa 4s1omg 5somh 2s1omk 4soml 1som5m sommar5a 3s6omme somme6r5e6 2somr 7somren 5somrer 6s3områ s1oms som5sl s4omst som5sti 4somsy 1s2omt 5somt. 6somta 3son so4na. son7da 7s6one so8nea song3s4 so4n3o sons4k son5st so2nu so4ny. 2s1o2p so7pak so9par so7pet 3sopp. 5soppa 3soppe sop4pi 8sopple so3pr 1sor. 7sora so3ran 5sorb 4s1ord sor4da 1so1re so4rek 7sorga. sor4gl so2ri 4s3orie 7soris so5riu 4sorke sor5n 3sor5s 7s8ort 1sos 4s5osc so8se. 6sosf 4sosj so4sl so5te so8te. so4tra sots4 sot5te sot4ti 4sou 2sov so3va so4ve. so5ven sover5e sove3s4 5sovet 3sovj sp2 4sp. spa5g6h 7spak. 7spaka 5spake 8spakk s2pal s3pall 5spalt 3s4pann 3spari 4spas 5s6paser 4spe. spe4a 8speda spe9dé s4pee 1s2pei s2pel spe4leg spe4les 5spelet 3s4penn s4pent s5pep spe4r5and 6speri 4sperl s4perr s3pers 3spesi s4pest s9pet. 1spi 6s5pilo 4sping s2pio 2spip spi7res spi7ri spi7ro 5s6piss 2s3piz 2s1pl 8s9plant sp9lar 4sple s4plin 3split sp6o 2spoe spo6et 2spol 5s6pole 6s7poli s4pora s4pore 5s4pors sport6s5 3sporv 2s5pos 4spot s3pote spo5v 9sprag 5spran 6s3preg 5sprei s4prek spre5ke s3prem 5s4pren 6s5pres 5s4pret s6print s5prio 8sprinsi 8s3pris 8s7pro 6s5prob s3prod 4sprof 5sprog. 5sproge 5s6pross 1spru s4pry 3sprøy 5språ 2s3ps 8spub 2spul 3s2pyd 5s2pø 6s3pøl sp5øy 9spå. 5spåd 8s9r sre8ka sre8ke. sri8e9 sri8ka sri8ma sri4ve. s5ro sro4e sro6pa sro6sa sro6se. sro2t sro9te srot5o srø1v srå4da. sråde9r srå6ders srå8ma 4s1s s7sabel s7sabl s6sae s4saj ssa8ke. ssa6la. ss5all ssa4me. ss5amp s5sane s7s8ar. ssari8e9n s7s6arm s4sarr ssar8ve. ss6as ssau8sa ssau6se. s6seet s2seg sse5ge ss5egg ss4el sse5li ssel5s ss9elv. ssel5v6å s2sem s5sen. sse8na. ss5enden s5sene s4seni ssen6ke. s4senu s6senå s5ser. s6serab s6serat sse7sk s4seski s4sest s7set. s9sets s2seu s4sey s2sh ssi4a ssi7e6rer s4siff s6silo s8s9ime s6s3ind ss5init ss3inj ss3inn s4s3ins s5sis4 ssis5m ssi6v7end s5s6jarg ss4kape ss3kar sska8ra ss3kof s7skog s4skor ss6ky. ss4kye ss4kå ss5kål s7skåp s2sl ss1lo ss5ly s2sm ss6nar ss2no ss4nø s4s5nød ss5nøk s2sof s4sok6 sso5lo s2som ss4oma sso3ra s4sorga ss3ove ss6pil ss4por ss9ri ss2t s5stad ss4ted ss3tek sstel6li ss5tep ss7tilp s7stip sst6r ss5tren ss4trå ss3tus ss3t4v s2sul s3sur ssva7ra ss1ve ssy6na ssy5r ss7øye s6så 6st. 2s1ta. stabs3 3s6t2ad stad3a sta6d3o s5tafa 3stafe sta5fl st3aft sta7ge 4stah sta6ka. 5stakk 4stakl 6stal. 6sta4la sta5lak st5ald 4stale sta4le. 5s6tali 5stalt s3tame 3stamm sta5na. 3s4tand 6stande. st8ane s4tanf s4tang stang5s6 st3anl sta8n9o s6t5antr st3anv 4stao 2stap s7tapa s4tapp s8tapå s3tari 1stas 3s8tasj 4s5tast 1stat 4stato sta5top sta3tu 3stave 2s4t5b st7c 2std 2s3te. 2stea 2steb 3sted. s4teda 5stedt s2tee 2s4tef 3s6teg. stega6l s4tege 3stegh 4s5tegn s4tegr 4stegsp 5stegspl ste4her s2t4ei stei5er 4steikn ste6in6s5 3s4tek. 4s4teka s6teke ste4ket s4teki 4s5tekn 4steko v4s5tekst s4tekt s8te5kv 4stela ste5le. s5teleg ste5lev s5telig 5stemd 3s4temm 5stemn 4stemø sten5a ste4nar 5s4tenen s4tener 4ste5nes 3s6teng s4teni 6stenk 4steno stens5l 4steo s5teol 2step step7per st8er. 8s5tera s4teram s6terest s4terev s7t6erf s4terid ste7ris s6teri6v 4s3term 6sterr ste5run 2stes s4tese ste7sle 4stet s4teta ste7t6r s6tetø 4steve 4stevi 6stevl 5stevn 6steå 2s4t5f 2stg stga6ve. stgå8va stgå8ve. 2s6t5h st5he 2s3tia 4stib s5tibe s9tibl 3stic 6s5tid s6tidel sti5en s2tif 3stift s4tigen 7s6tigi st9i8gj 3stign s5tij 6s5tika 4s5tike s4tikl 3s6til. 5s4tila sti4lag 4stild 3stile stile9ge s6tilk 6stiln s4tilo 6s5tils 5s4tilt. 6s5tilta 5stilte 4stime sti7mer 6stimé 3s6timu s6t3ind s6tini 4s6tinn s6tinst s6tint 1s2tip 4s3tipp 6stips 5stir 2stis 6s7tisk 4stitt 4stiå s4tja 5stjel 4s3tjen s6t5jent 3stjer 4stju 2stk 2stl 2stm 2st5n2 s2to. 1stof 2s3tog 4stoks 6stokt 3stoli 4stolj s5toll 4stom s9tomm st3oms 6s5tomt 4stoni st3ope st5oppl 6s8t5ord sto4ret s6torm stor3o 4stors st5o4s s1tot sto4t5r 5s6tore. st5ou 5stova 2stp 8str. st3ra. 4s5trad s8traff 6strafi 6strail st3ral st4ran stra8na. 5strand 4strane 6strans 4strap 4strar st7ras. st7rast. 5s4traum s4tre3a s4tred 7s6treik st5reis 7strek. st5rekl 6streni st5rer. 6strers 6strh 9stria 9s8trid 5strie st5rige st3rin 3s4t6rip 5stri3s 6stroe s5t4rog 5s4trok st3rol 6s4t5rom st3ron st7rop. st7ro6pa s6trope s6t7rug 9s6truk st5rum. 2stry 6stryg s7trykt 4s3træ 1s2trø 6s5trøb st6røm 4strør 4strøs st5røse s5trøst 4strøy 6stråd 2st5s6 stsa6me. stsy8na 4st7t6 stta6le. st3t4r s4tua 1s2tub 3s4tud s2tue stu4el stu4er stue5re 3s4tum 6s3tung 6stunn 3s8tunt 6stur 2s4tut 2stv s3t4ved 1sty 2stya 2styd 3s4tyk sty6l 2s5tyn 2s7typ 3s4tyr styrs3 6stysk 4styv sty5ve 1stø 2støk 5støl 6støm 5støp 6størk 5støt stø7va. stø5var stø3ve stø5vi st8øy 1stå 5s4tåe stå5k 4su. 1su4a su7a8l 1su2b sub7l sub3o 5subs s3ubå 1sue su8er su2f 5s2ug su6ga. su4ge. sug3g su2h 3sui6 su3is5 suit5a su2k 4s1uke 3suk5k suk3r 1suk5s su4le. 3s4ulf su4lik sul4t5r s1ulu 2suly sulæ5 3s2um 4s3umid su2mo sums6 5sund. 8s5under 5sundet 5s4undi sun6d7r 9sunds sun4ge. 6s7u2ni su4o 3s2up su4pe. super3 supi9 sup4r su8pre sur5d su4re. 4s3u4rei 1surf su4rie su4riu surs5k sur4sp sur4sti 1sus su3san su4se. su6s5es 4susi su4sik sus3p sus3s su2sy 2s1u4t1 sut6ra. sut8reg 7suv 8s5u6vi sv2 6sv. sva5a svai5 5svak. 3svake 6svaks sva4la sva4les 6svalet 5s6vali 7s6vam s4var. s4varet s3varm 3s4vart 6s1vas 6s1veg sve6g7i s5veie 3s4veis s5veka 6s5veks 5s4vens sverd5s4 sve4re sve8res 3s4verg 5s4verj s5verk sver4ki s4verm 6s7verv 7s4vev s4vie svi6e3l 4svig svi5ke. 6svikg 4sviks. 3svikt 4s5vikti 4svil s6vindel svi4nes sving5s4 ll6svint 4svir 2svis svi4sa. svi4se svi5sen svi5ser s8viv svi9ve 4svol 5s2vor svor7t s3vr 3svul 5s6vulm s3vy4 svye7ne 1s2vø 4svæs 2s7vå 1sy sy4c sy4de. sy5den 5sye sy2er sy8ka sy4ker sy5kere 2syko sy6kog s4ym sy7me s2yn 4s5yndl synk4 syn6sk syn3te sy4ra sy5rar s6yre sy4re. 2s1yrk syr4ka syr4ke. 3sy1s sy4se sy2sl sy2s3t sys4tr 2sy2t sy5ten sy5t6h 9sytt sy2vå s4z sz3c4z 6szt. 1sæ sæ2l 8s3æ4re 8s3æ4ren sæ4r1i særle9 sær5s8 7s6æ5te4 4sætt 1sø 4sø. sø2d s1øde 4søf søg4 4søj 9søk. 3s6øke 5søkj 5søkk søk7kj 3s6økna 2søko søk4sk søk6s3e6 5s6øksm søk4ta 3s4øl sø4la. sø4le. sø5let 3s2øm sø6må 3sønn s1øns s4øp sø4ras sø4re. sø4r5end søren6de. sø8ret sør9ett 7sørl sør3s sør5ø 3s2øs 4søs. sø8sa 7søt sø7tast sø7tel sø5tes 2søv s1øve 3søvn 2s5øy. 4s3øya søy8de. 6s5øyd 8søye 3søyl 6s5øy4n søy2r 2s7øys 5såg s3å2ke 5s4ål så4le. 6s1ån sån4da sån6de. så2p 9såpa så5pet 6s1åpn såp9u så2r så6ra sår9ast. så4re. sår3sk sår7ø så2s s7åsa s4åsb s5åse sås5k sås5t 9såv såva7 ta1a 4tabo tab2r tab2s ta4bu. 4tabø ta1c 4tad ta2da ta8d3ei ta6d3e4t tad5spa tad7s6v ta6du t8ae 6taei 4taek 4tael 1taen 4taend 4taenh ta6es 2ta5fe taf7f6 5tafis 4tafl 1tage 4tagj 8tah ta7is 1tak. ta4ka. 4takau ta7ken ta5ker tak7kel tak5k4l ta8k9la 2takr tak4sal tak6se. tak4si 4t3aksj 5takst tak4tal 4taktig tak4to t5aktø ta1ku tak3v 1tal. ta9lam ta3lan tal5ang ta7las 3tale ta4lei tal5eie ta4lek ta5ler. tale7s6 1talg tal6ge. 7talj talj5es tal4led tal4leg 8t7allerg tall7es tal8lign tall6s9a tal4ly tal3op 6talter t5altern ta6l9u ta6lå 2tamb tamba6ne. t3ambi t4ame 4tamet tam4i 2ta3m4o t6an. ta2na 4t3anal ta3nar ta5nas ta5nat t5andak 5t6ande. t7andel. t5andele tand5r tandø4 tandør5e 1tane ta4nel ta5nem 4tanett t3anfa tanfø6 6tangf 6t3angr 1tank 2tanl t3anle 2t1anm 3tannl t5anno tanns4 tan6sk tans5ka t5an5sl 4t5anstr 4tansv 8tantil tan4tra 6t7antre t3anve 2ta3o4 5tap. ta4pa. 1tape ta4pe. 3tapi 4tapl 4tappa 5tappi 1t4ar. t6ara ta4r3ak 4taram ta6rare 2tarb 3tarbo 5tarbø 4t9arena 6t7ark. tar8ka. 4t5arke 4t3arki 4tarra tar9si tar7sp tars6v 4tart tart7est t5artik tar7tit tar4t3r ta6r5å8k 4tasa ta3se 6t9asf t3a4sia tasi3e ta4sif ta4sil ta4si5s4 tas4p tas5s4 6ta7sto ta7str 4tasu ta1ta ta7tes tate8se. tat5e4v tati1 tat3op tat2s1 tat3te t3attr 1tau 9tau. 7taue 4t5aug 2t1a4uk 4taun tau4ne. tau4sk 2taut 2tav 6tavin 3tavl 4tavli ta9xy 6t1b2 tba3d tba2n t6be. tbe6te. tbe6t7r tbe6t8ra tbo6da tbu8da tby3k tby4s tby7te 2tc t1ce tcen4 tch5e t5co 2t3d tdy5pe 1te 4tead 4te3ag 2teak 2te9a8l tea6m 2tea2n 2teap 2tear te5arb tea4s 3teatr 4teatt 2teau 2teav 4teb t5ebb tebu8da 4tecel te1co 2ted 6t5eddi 3tede. 4tedeb te7def 4tedek 4tedel 4tedem te5den 4tedi 5tedil 4tedo tedo6en. tedo4er tedo8et. te4dor ted4sk ted4sl 6tedu 4tedy tedyr9k 4tedø te3e4 2tef 8tefa 4tefi 4tefl 4tefo tefo8r t3efte 3tefø 2tega 5tegat 4t3egd te7gea te9gee 4tegg teg8ga. 2tegh te4gim 2tegj 2tegl te3gla te9g8li 8tegs. 6tegspl 6tegsv 2tegu tegvi8 2tegå 5tegås 4teh 5tei. 2tei4d t3eie t3eiga tei6ga. t7ei6ge. 6teigr 3teikn tei5le te1im 6teinf te4inne te5inte te5i4s 6teiso 2tej te7ken te5ker 4tekil 2tekj 5tek1k 2tekl te5k4la tek6lede. tek4li 4teknu 2teko 2tekr te7kra te6k5ru 9teks. 4t3eksa t3ekse 4teksp t4ek8st tek8t9r tekt4s tek6ty 2teku te2k3v 4teky 2tekø 4tekå 2te3la tel6ak 5te4l5ar 3telav 8te4le. 4teled 4telei 4telek 4teleme te4lene 6teler te4les te5lesk 4te4lev te6leva 4telid 4telik 4telil 4telin te4lir 4telis 4telit 4teliv tel5lef tel4lei tel4lev tel8lign tel4lo 2telo tel3se telses5 t3elsk tel7s6v 5teltet 2te1lu 7telut 2tely 6telæ 2telø telø8pa. 2telå 2tem 3temae 6teman te4mans t5emba 6temenn 5temik tem9ma 6temn tem5ne. tem5ord tem5pe tempe8l7 3tempo tem3s 4temø 3ten. te5nab te4n5al ten8am te4nan te4nat ten5at. 6t7enc 6t5en6den 4tendr 4tened te5neg 6tenem 6tenerg 5tenes 4tenet 2teng 7tengon t5e4nig 7tenik 5tenis 4teniv ten9no te4nom te5nor 6tenorm 4tenot te6nov 6tenó ten3sa ten5sko ten6slu ten3so tens5v ten4t5in tentle8ge. 4tenum 4teny 4tenæ 2tenø ten5øks 2teom 5teon 4teop te6ora 4teord 2teov 2tep te3pa 4tepak tepa9ra 4tepas 4te5pe 7tepee 9tepé tep6pere t5e6ple 4tepr 4terac te7rakk 6teramm ter7apa 4terapp te4rare 6terasa 4terase 7terast terba6ne. t6er5d 4tered 4teref 4tereg 4tereis te4rel 8terem. 6teremm te4r5eng teren6ga 6terenn 4terep te4rerk ter5esti 4terett 6terevo 3ter5g 3terh te4rig 4terik 4terisi te4riv ter5j 4terk. 4terke 4terkh 7terkr 6terks4 4terkt terla6ga terle7ge terle6ve. ter8ma. ter3no tern5s te5ro. tero6e te3rof 4teroll 4terom 5teromr 4te3ros 4te3rot tero6v ter5r 5ters. 5tersjøo ters4kl ter7s6ko ters4l ters4h ter3s4m ters6ne ter5sv tersø6ke. 3ter3t ter9to ter9ul 8terum ter7v tervi6se 2tery ter5ør 4terøt te4r3øv 4teråd te4r3ås t4es 5tes. 2tesa 5tesar te7sen 2te1sh 4tesid 4tesik 6te3sin 4tesit 4tesj 6tesjef 4te1sk t9es6ka. 6teski te5sko 2te1s2m 7tesmåe 2te1sn 2te3so 6tesp 5tesr 3tess 5test. 4testaf tes5tas 4testat 5tes7te. 4te5stei te5s6tiv 5testid tes4tik 4te5s4til 4te3sto 4te3str 4testy 4testø 2tesu 4te1sv tes8væ 2tesy 2te3sø te7så te8sår teså9re 3tet. teta6ka teta6le. te4tap te3te 5tete. tete4e 4teteg 4tetei 4tetek 4tetem 2teti 3tetik 3tetis 2tetj 2teto 2t8et2r 3tet2s tet5ti tett3s 2tetu 5tetu. 2tetv 2tety te2t3å 2teu teu8k t1eur 3teus 2tev t6eva te4valu 3tevl tevo6r te3vr 2tey6 2teø 2teå 4téa 2téb 2téf 2téh 2téi 4téle 2tém 2tése 4tést 6t1f tfe6e tfe4l tflå3 t7fo 2t3g2 t4ga. tge4a tgei5 t4gi. tgi5ros tgrei9e t4gå. 2t1h t4hap t4hea3 thei5m tho7li tho3re 3thr thu5le thu6s thy5r 1ti 2tiad ti3ag 2ti1ak 4ti3all ti5als 2tia2m 2ti1ap ti3asp 4tiau 2tiav 2tib 2tick 3tid ti2da 4tidan tid7d 6t3idee 4ti5dem 4t7idé 4tidis 4tido 4tidr 2tidu tidvi4 6tidy 4tidø ti1e2 2tief 2tiei 2tiem 4tienh tie5ra 4tierf 4tierk ti4ert ties3 ti3esk ti3et 4tieta 4tiett 2tifa tifa8ne. 2tife 4tifl 2tifo 2ti5f6r t8ifrå 4tift tif5te 2tifu 4tifø ti9ge. 4tigj 2tign 3tigno ti6gun 2tih 2tii 2tij ti3ka. 6tikarr ti5ke 4tiket 4ti5ki 6tikj tik4kj 2ti3ko 2ti1k2r ti3ku 6tikular 6tikult 6tiky 4tikø t4il tila6ga til1d4 3tilde 2tile ti3lei 3tilfe 3tilg til3id 4tilke 3tilkn 4tille. 4tillh 4tillin tillø7 4tilm 7tilnæ 3tilst til3t4 4tilte 2tilu 2tilø ti7mab 5timat ti4me. 5timedie ti4mera 5timeri 2timl 4timo7 4tim6o8r 2t1imp tim7s 2timu 2timy 2timø ti6nab tin5art 4tinaz 2tind t3indu ti4nem 4t1inf tin5ge4s 6ti4nit 6t5inj 2tink 7tinks 4t1inn 6t5inne ti5no tinsk5 4tinsp 4t3inst 4t1int 2tinv 4tinva 4tiny 9tiol 6ti7om tion9s6 4tiop ti1or ti1ov ti3pa ti6pla 4tipr 3tips 2tir tira4t ti4ref ti1ro 6tisak 4tisam ti5s6an ti3se 4tis4ei 4tisek 4tisel 4tisem 4tisep tise8ra. 4tisers 6tisig 4tisio 4tisje 4tisju tis4ka 4tiskan 4tiskil tis5kok 6tisku tis5l 4tisn 4tiso 6tisprå 4tistat tis4ti. tis4til ti5stre 4tisty 4tistø ti8støy 2tisy 2tit ti7ta ti3te ti1tj 3titl tit4r tit3s 3titt 4tiub 2tiut ti4v5and tiva9re ti4v5art tiv6is 2tivo tiv5si tiv5sk 4tiy ti5ær. ti7ære ti9ært. ti1ø8 2tiå 6t3jag 2t1jak t5jarn 2t1je. 2t1jeg 2tjel 1tjen tjen6st 6tjep 2tjer t5jev 2t1ji 5t6jingan 5t6jingar 2tjo t5jord 2tjub tju4e 2tjun 6tjur 3t8juv tjæ4res 2tjø 4tjå 4t3k2 t6kag tka8ra. tkly9 tku6le. tkå8pa 6t3l6 tla4ga tla8te. tle6da. t4ledr t6lef tlei5er. tle8se. tle5ti tligh6 tlight5 tli6nes tli4te. tlu4e t6l7ut tlø4pa. tl7øy. tlå3ne tlå7r 2t1m tma3d tma8ge. t6maku t2mam t2meg4 tme3in t2mek tmini6 tmin5s6 t2mos tmå4la. 8t1n t3na t6nee t4neli t7nelig tne4rek tne4r5ø tne8se. t4nesk t4nest t5ni t8no. tn5sk tnæ6re 7toan 7toar. toa6t 6toau 2toav tobe6r t3o2bl 6tobs 4toc to5da to9de. to4dera 3todo 1toe 2toek 6toel toe4t 2tof 6toff. t3ofre to5fri to2g3at to7gen 4togg to6gl 6tograv to4gre tog3st to2gu 2toh toil3 2to1in 4toj t6ok 1to3ke to3ki 2tokj 2tokk tokk5end to3kl 5toksi 5tokt 2toku to4l5arm 5tolat to5lel tolele7 5tolera toli8ne. 2tolj 1to4l3k 7tolki tol4lab tol4lag tol6leg tol6lett 3tolo tol5tr 4tolå to9ma. 2tomb to5mene. 2tomf 4tomg to3mi to5mise to7mist 4tomk tomlø8pa t8omm 2tomr 4tom1s 5toms. 1ton to5na to4ned to4nel tong5s4 to8nib 2tono ton3sa ton5s4l ton5sp 2tonu to4ny. 2to3o 4to1pl 4toppd 6toppg 6t5opple 4t5opplæ top4po 4toppt 4topr to1ra to4rak tor5alt tor5ang to4r5ant to4r3as 4tord tor8da. to1re 6toreg to4rek tor7eks to7rem 6torent 5torer tore4t tor5ete 4torga tor5int tor7me torm5s tor5na tors4i tor5t8 torvei5 to4rø 4torå to1s 4tosa 4to3se to2sh 6tosj tos5ke to8sku 4tos2p 2tosy 4tota to5te to8ti. to5to. to4tor 6toty 2tov to1va to7veg to5verd tove7re t5overs 5tow 4toø 6t3p2 t7pa tpi7ne tpi7pi tpo4et t4påk tr4 8tr. 6t9rabat 3trafi tra8ka. trak7to t5rane 3t6rans tran7ske 5trap tra3pe tra5po tra5r4 5trase tra5se. tra5ses 5trasé t2rat t5rate. 3trav tre4al. tre1c 4t3reds t3refu 6t1reg t5regi 4trei tre5int 6trek. 4treke 4trekl 4t3rekor 4trela 3t6re7na tre5ne t6reng 3t6reni 4t3renn tren6sk t7repe t5repres t2rer t4rero t4re3ru 2tres 6tresi tre5sko tres4l 3tresn t5resu t1ret t4reta t6reto t5retted 5t6rettel 4trev tre9va t6rib 4t1ric 4t4rid tri7ei t5rig. t4rikk t8rina t4ri5ne 4t5ring 3trinn 7t6rio t4rist tri5to t4riu t2riv tri7vi 5trix 3t4ro. 5troa tro9ar 3troe t4rof tro5g 3t2roi tro3in t4rok t2rol 4t3rom. t6rond 5t4rong tro5per t2ros 5t6rosk tros3l tro1v t8ru. t8rua 7trua. 5trued 5truet 3trug tru1i 5trukn t3rull 2t1run9 t3rund 4trupe tru5sa. 7t6rusk 2trut t5ruta t3rute t3ruti tru5v try3dr 3t2ryg tryg5ge 7trykk. 5trykke try7pe. t6ræ trø8a t5rød. t5rødt 4trøk 4trøm 2trør 5trøt 5trøya 5trøye5 trøy9et 4trøyr 6trøys 5trøyt trå8da. 4trådet trå4dr t6råkl t3råst 4ts 6ts. t5sa. t5sab tsa2g tsak6se. ts1an ts4ang tsau6r t1sc t6scha t6sch5k t5se. tse6d tse4er ts5ege tsei4d ts3eig ts2em t3sen. ts4ende t5sendi tsen8ka tsen6ke. t5sens t4sentu t5ser. t3seri t4s3erk tser3o t5s6ers. ts4es t4sesk ts5e6st ts3eta tse4te. ts1e4v ts3f ts4fæ t7s8hop ts7ill ts3inn t4s3ins t5sir ts5jeg tsje5t6sj ts5jor 5t6sjov. t7sjuk t4sjur t5skad t4skan ts6kis t4s5kjed ts6kjø t5skol t6skoll t7skot ts5kren tsk5ru ts5krø ts1k6v ts9kvi ts6ky. t6s7kyn ts1l t7s6lo. t3s4lot ts2lu ts5lø t5smit tsmå6la. ts1o t4s5o4d t5sok t5somst t5spek t3spel ts2pi t2s3pike t3s4por ts5s4 t1st4 t2s3tabb t5stad ts3tak t4s3tal t5stand t5stang t5star t5stat ts6tau t3sted t4steg t4stek ts6tig ts4tik t4stilk t4stin t4stit t2s1tj ts5ton ts5tors ts5tree t4s5tren t4s5tro ts3try ts6trål t5stu ts3tv t4sua tsu7ge tsu4l ts3uli ts3u4r ts5usi ts1v t3svik ts1w t5syk ts5yt tsø8ka ts5økni ts5øv tsøy8er ts1å tsåt8 6tt t1ta t3ta. t2tab ttaba6ne. tt9abo tt5adr t2taf tta9fr tt3aft tta4la. t6t3ald tta7lel ttall4 t4t3ana t5t6ane t4t3ang t4tans t4tanv tt5appe t7t8ar. ttare6 t4tarr tt5ar5t tt6arta t4tase t4tasj t4tav tt3avi tt5avk tt5avr t3te. t2tea t3ted t4teda t5tede. t8tedr t2tee t4tef tt3eff t2teg t2tei tt7eid tte3in t2tek tte7kv tt7elev tteli6te. t4tem tte4ma. tt5emn ttem8na ttem6ne. t3ten t5ten. t4tena t5tene. t4teni tten5s t9tens. t4t5ense t2teo t5ter. t4terei tter5un tte4r5ø t4terå t4tese t4tesi ttes6ke. t4tesl t5tet. t4teta t4tete t1té t4th tt5he tti5a t4tidel tti3e t2tif t5tig tti4g5j tt3ind t5tine t7tiné t5ting t4tini t4t3ins t4tisj t6tisti t7tite ttle6de. ttlin5 t1to. t5tofr tt5om. t7tomr t2ton tton6na tt3opp t5tora tt3ord tto5re tt5o4ri tt3orm tto5u ttpar4 tt6pås tt9raka tt5rake tt3ram tt3rap tt7rat t4t3rep tt3res tt3rev tt5rom t5trop t5try t2t1rø t6ts tt7saf tts3ar tts5kan tts5kj ttsla6ga tt3sok tt5still tts5top tts5tra tts5tøy tt3ugl t1tum tt1un ttun6ge. tt1ut tt8ute ttva8la tt5ve tt6vun t5tw t5ty. tty8e tt1y6t ttæ6 tt3ø4l t1tør tt3øv tt7øy6r tt1å4 5tual 4tu4av tuba3 tu4be. tu6bå tu6dem 5tuel tu4er. tug8la tu1in tu2k t5uka t1uke 7tukt 3tula 1tule tul5les tum5m tum4s 3tun. 4tund 3tune tun5gesv 6tungd tung9s 6t5uni tu4nio 5t4un5n 9tuns 3t2ur tur7ant tu4ras 4tu4rei tu4rek turi4 tu4rin tur1o tur3p tur5s4 tur3uk tu5rus tur1ø 1tus. tu1sa 3tusb 3tusf tu4sin tu4sm tus5o tus7s6t tust6r tus5u 2tutg t5utj t5utk t1utr tut6tenk tut5tor tutt5ov tu8va. 2t1v tv4a tva8k tva6ne. 3tvang t4v5anl 8t9var tve5del 3tveit 4t7ver tvert5 t2vet 3tvet. 7tvets t5vik tvi8ka. t8viklas 5t4vil. tvi5la 5t4vile t4vi5l4i t6ving tvi4sa. tvi4se. 6t7vo 3tvung 6twa2 1tyd tyg9gel tyg5ges 6tyh tykk5s6 ty4med 1tyn ty4ne. 6t5yo 1typ 5t6ype ty4pere ty4pet ty4rak 5tyrann 6tyreg ty4rep tyre5st ty4ri. tyri9e ty4ri5s ty2s 3tysk tys3t 2ty2t ty8ta t3ytel ty5ten ty4ve. 2tz t5za 5t6zel 6t6z5l 1tæ tæ5l tær6ene tæ4renh tær4er tær4et tær5s4 tøf3l 2t1øk tø9ket tøk8ta 4tøl t7ø4let 5t4øm5 tøn5nes 4tøp tøp5se t2ør tø4r3as tør3in tørk4 7tørk. 9tørka 5tørke tør5ne tørs7ta. tørs7ter tørs5tin tør3t tøs4 tø8sa 4tøt tøt5a tø5ta. tø3te tøtt6 2tøv tøv6d tø7vele t4øy tøy5a t9øyem tøy5r tøy5te tå4en. tå2k tå5ket. tå5ki tåk6r tå2l3a tå9la. tå4leg tå7lel tål5s4 tån8da tån6de. tå3ne 4tåp tå6pe. t1åpn tå6re. tå4rep t3året 4t5åri 3t8årn 2t1års1 tå3s tå2t t3åtak tå7ten ua7g u1ak uak3s u1al. ua7la ual5l ual3o ual3u u3a4ne. u5anl u3ans u1ar. uar5d u4arr u5ars. uash3 ua3t u5au8 u1av 1uavh u4ba. ub7alt ub7ant ub5ark ub4bo ub2br ub4bu ubel5s ub5h ubi6s ubis7t ub1j ub7lande. uble3s4 u1b4r ub5rin 2ubs ubu8e u4bå uch5en uch5er u1ci uck1 ucu5 2ud u3da. u7das. ud4dag ud2dr udd4s5e ud2då udea9 ude8are u2deb udeie5 udei5er u2dek ude3lu u2dep u6dero u2des u3d2et u6d5ett u5devo udia2 udi3an udi4en udio5 ud7ir ud7ji ud5leg udle6ge. u7dob u6doe u2dot udover7 ud1r udse4 ud3t ud5v 3u4dy udy9ra ud5å4s ue5a8 u5ei u1el uem8na u1e2n uend5r u7ene uensar4 ue7o u1er u5e6rast ue4re. ue5ren ue4rer ue4res ue5ri uerle7 u2erm ue4se ue2si ue4skj ues6n u1et uet8r ueul8 u4fe. u6feb ufe6e uf1f4 uf4f5erm ufi9l ufi5ne u1fl u6foa ufor3s u1fr uft3a uf4tan uft5s4la uft3sp ufø6 u5gag u5gar u6g5av ugby7 u2gem u5gen u3ger u4gerø u2ge5s4 u9get. u8geta u2gev ugg3s4 u5gis u4gl ug1la u5g4lad ug9lar. ug4le. ug9ler. ugle7s ug5ly ug7na ug7ne. ugo1 u4go. ug4re ugrei9er u4grø ug5s4i ugs4k ug7so ug3s4pr ug5s4va7 uguay7ans ug5øyn u1h 3uhel ui8a u4i6c ui2d uid5el uid5en. uid5ens uid5er uid5in ui3e6 u4il uil5l u1im ui3ne u1ing uinnsmi8 uinnsmig9 u1ism uista7 uit3en uit5er u1itt u1j u4jas u8je. u7jå 4uk. u1k2a u7kar ukare6 ukar5t4 u5kat u2ke. u4ked uke5l4 4ukem uker5an uke4rek uker5i ukho7 u7ki u1kj 4ukk ukk6a uk7kestal uk8k9l ukk7n ukks6 u5klem uk8lu ukl7ut u5k4no u1ko u4k5og u2kra uk3rus 2uks uk2sa uk4sek uk4sel ukse7te uk2si uk2s1k uk7ski uk2so uks5t uk4s3un uk2sø ukt5e4sk ukteslø9se uk4t3id uk6tj uk4t5ori uk2t7r ukts6l ukt3sp ukt9s6v ukt4sti uktu8e9ra uktue5re u1ku uku6e uku5le uk5vik ukys8 uk3ø4 uk5å4 6ul. u1la u4la. ula7d u6l1af ul3aks ul5art ul4det u4lef u2lek u2lel ulele8ge. ule5ma u3len. u6leni u3lens u5ler. u5lere. ule3ri u2l3erl u4lero u2les ule3st u5lest. u5leste. u2leu u1lé ul4f5l ul4fo ul4fr u3l4i ulie8 uli9en uli5ke. 3ulikh uli9na. uli5ne u7linj ul1j ul5ka ul4k3v ul4lag ul4lam ull7arm ul4leg ull5egg ulleg8ga ul6leng ul9lere ul4le3s4 ul8li. ul8lig ulling7s ull5i4v ul4l3o6s ul8lot ullo3v ull5sle ull3s6m ulls4t ull3sv ul2lu4 ul6ly ul2lø ulm4u u1lo ulo6i ul5op ulo7va ul4sk uls4po ul8sn ulss8 ul2st ul8s3t6r 4ult ul4teg ul4tek ul4tes ul4til ul4tim ul4to ul7tor ul4t3re ult3ri u7lua u3lue 1uluk u5lup u5lus ul9ut. u7luta u9lute ul7va. ul5van ul4var ul4ve. ul4veg ul4vei ul4ves ulv3t ul4v3u 1uly ulyk5kes ulæ6ra ulæ5re ulø3se uløy6e ul5å6l 2uma uma8ge. u6mare um5au umau7ken um3av 2umb um5be 4umc 4umd 2ume u4mend u4m3enh umen4t5i ume5ra 2umfo 2umh 2umi u6midd umie6n umi9na u4mint um9ja 2umk 4uml 4umm um3me um4mil um4mis um3n umna8 4umo umo6g um5ok 2ump um7pan um4ple um4p7ut 4umr ums1 um7se. um4sku umsku8le. um2sn um4sor ums3t 6um7t umta8l um5ut 4umve umør3s um7øy umå7 2un. una6da un5alg u4n3ap u9nar u7nas u3nat 2und. 6unda 6unde. un4dek un4del 6unden 5undersk 5underv 4undet un6d7im 4unds und5s4i u2ned u4nee u9nei. u2nel unele6ge. u4n5eng u4neno u2ne1s2 u3nes. u2nev unev5n 1ungd ungele8ge. un4gem un2g1j un4g5l un4go un2g1r un9g8ru ung3s4i un6i u4ni. u2nid 1u2nif u4nim u3nin 3union uni4st 4unk un4k5l un7ko un4kr un7nak unn5erf un4n5ers un4n5erv un5nes un4niv un2no unn5ste unnta8la un4n3y u4no. u2n3os uno7t 4uns un6sj5i un3skr un5s4p un3stek unst5e6l un7s6tenk unst3o un1s2v un4tal un4tam un4tas un3t2r unt5rep un4tri untun8ge. unu6 un5ut u3ny u3nø un5øy6d u7nøyg u3nå uo9a u1ob u1om uom7s u1op uor8da uo1re uo5ro u1ov up3av u3pea4 u5per uper3a upe6ren u4peta 6upf u3pi u8pi. up3ins up3li up6nev upo9pe up1p2 up4ped up4pla up6pre upp5s 4upr u3pra 6ups up6sen up2s3k ups4ke ups5pr 6upt 6upu u1på upåvi6 u1ra u2rad u2raf ur3aft u2r1ak ura6ly u4ram u5rane u3rans uran6t5re u5rar. u6r7arl ur3arv u9ras. ur5asp ur3att ur7au urau9ken ur1av ur4bod ur4c urd4 ur3di ur4d5o u1re ure8al ureer6e ur5egg uregi6 uregist5 3urein ure4l ur3ele u4reli u7r8ell u7r8elt u4r3els u4r5eng u7reom ure7o6s u4resu u4reta u4rete ur4e5v 2urf ur4feb ur6fed ur3ge u1ri u4ri. uri6a7ne uri9en. uri4e5ne uri9er. u3rik u3rim uri5ne ur3inn ur3ins ur3int uri6sp ur4ke5s ur7k6j ur6k7ja ur8kla ur4kle ur6k5n urk5s urla8ga urle6ge. urle8se. urma7g ur3nea urn1s2 urnæ6re u4ro. u6roc 5uroe urom5s u2rop uro7pi ur3opp ur1or uro3s4 uro4sta uro8ta ur4pel ur6p9ut ur3re ursa8ka ur4sal ur4s3el ur4sin ur4skr ur4spe ur5ste urs5til ur4stj ur2sv urs3va ur2s1ø ur3teo ur5ti ur4to ur6t5ri urts4t urue7re u6rug8 ur7ugl uruk6 uru4ke uru7kn ur6ul urumo7 urun4g u7runk uru7v ur4vel urv3s u6rys urø2 ur1ød ur1øy 4usa u9sane us3ang u9sar. u7saren u6s7ark us7au us1c 2use u5seal use4al. us7edvanle u2s1ei u2sek u4sele u2sem u6s5endi us7erk u4s5erm u6sesi uset8je us3eva 4usg u2sh u2s3h4a u2s3h4o us4id us3ind us5inn us7jag u4sji us5kaf u4s3kan uska8ra us7kat us5ken u6s5kis usk4l us6k5le us5klo us1ko u1skr us7kru usk7u6t us4ky us1l usle6ge. us5lin u4slu us7mø u4sn us1ok uso5l uso6l5d us1or u3sori usove7r6e us1p u1s2pin us5sar us6sat us4sjå us4skj uss5kor us4skur uss1l us7smi uss7mø us4s5ti us4str us2sv u6stande u4stat us3tav u2ste us3ted u5stei us7ten ust9ette us5ti u5s6tig us1tj ust5of uston8 ust7onn us5tor ust5o6v us8tra. us8tran us8trar u6stre ust5ren us4tri us3tro ust5rød u6st5rå ust7ut u4stå us3ung u2sur us1v u5svale u7s6valt usva8n usvi8ka. 6usæ usæ9le usø6m us1øy u1tae u2tag u7tagg u9tal. ut3alb ut5ald u3tall u5tande uta7no ut6anv ut3arm ut3art uta1s4 u5tas. u6t5a6sa u6t5a6se u2ta1u4 1utb ut4ba. utbe8d 4utbi ut6by. utch5 1utd 4utdat utda7ta. u2te. u2tea u4tee u4tei u2tek ut3eks u5tekst ute6ma. u5temm u9temt ut2en u6tena u3tenk u4tenu u2teo 2uter u6terø u2te1s6 u4teta u3tett ut6eu uteva9 1utf utfa7s utfø5re 1utg 8utgåe 6u3ti u4t5if utikk6u utiku9 u4tili u6tiven ut1j u5tjen ut6ju 3utlei utlø5se utlå7na utmå5le u8tni 1utny 2uto ut7oms uto5s uto4v 3utpr ut4på ut1r u5t4radi ut3re u5treng u3triv u3trol u3tros 5utru u5t6rul ut4rø ut9rød 1ut1s4 4uts. 4utsei utse8t9ja 2utsj ut3sk 5utst 7uttak. 5uttake ut4terk utt5eva ut4tid ut4til ut5torea ut1tr ut4tra 3uttry utt1s2 u1tu utu5e u6t5un utun8ge. u2t5ut 1utv u3t4vil utvi5se 2u3ty 3u4t6yd u8ty. 8utz ut1ø u5tør ut4ø8s utøs7t 1utø4v ut5øya ut7åk u3tål ut1ån ut7år u1u u7uma u5ume u7ut u1v uve5di uve3in uve6ris uve3s u7ves. uvet5ø u6vev u5vi uvi6k uv5ra uv9sa u5vu uvø9re u1w 4ux1 ux4a4 uy6a u7yn u1æ uærle9ge u1ø6 uøv5 u9åra u7åre va3am va8an 4vab 6vadj vad1r vaf3 vaf6r vai5r vai5s va6ka. va7kan va5ker 6vakh va8ki. 4vako vak3r 7v6aksi 4v3aksj vak5s6t 1vakt vakt5r va1ku vak3v va3lan va4led val9eks 4valel val4g3r vali9e8 val3la val6mes va6l1o va1lu va4lun 4valv va4løy val7å vam8pu 4v3anal vand5s v4ane vane5s va4net 2vang van4gr vang4s7 va8ni. 1v4ann van4nan van4niv vann6sti va4nom v4ans van5sem 5vansk van5s6ki van3sm van3ti van9tr va4ny 2vap va5po va4ra. va6rak va4ral va4ram va4rap va4re. va4reg va6rem va4res var8ka var5ma var4mee var4sa var4sk var4s5ti var4sv varta9la var6tem var4t5i4s 4vasa va4sa. va9set 6vasid va6sie va4sif va4sik va4sil va6sis va2sk vass5a vas4sau vas4sel vas6s7ø 4vasta vat5a va3ta. va6t7e8l va2terf vatle6ge. 5vatn va1to va6tr vat7ra vat1s 4vau 2v1av va4z 2v1b2 vba4ne. vber5g vbo6da 6v1d v7dev vding5s4 v7doi v7don vd6r vdu6en. vdu6er v7dø 1ve. 2ve1a2 ve6ag ve6ar. 2veb 2vec ve2d1 ve9dob vedom5 veds2 ved5s4k 3ve8d5t vedø4 vedå6 2vee ve4er 2vef ve6g5av ve5ge 3vegg veggs4 2vegj 4vegl ve3gle ve5g6lød veg5n 2vego 6vegre veg5rett 4vegru ve4gut ve4g5å 2veh 1vei1e vei3en 4veill 6veit 2vej 4veka 5ve4ka. ve4ke. ve4ked 4vekee 2veki 4vekj 2vekl vek8la vek8le ve4kli 2veko 2vekr 3veks vek4st veks4t5r 1vekt vek4t5an vek5to vek4t5r 2vekå 5vel. ve4l5as 5velat. 5velatp 6veld. vel4del 8velds 4veled 6velei 7velet 4velis 4velit 6veliv 2velo 5veloc vels2 vel3se velses5 vel3sm vel5sp vel5st 4velug vel5un vel5v 2vely 2velæ 2velø velø8pa 2vem ve5ma 1ven ve8na. 4venem ve5net ve6nete 4venev ve4nin ven6n5i vennle7 ve2no ven6sti ven6str vent6a ven5t6r vent4s 4venty 2venu ve4nus ve5ny. 4venya ve4nym 2ve3o4 2vep 1v8er. ver5ak ver3al 8verau ver6des ver6din ver6dir verd7v ve3re. 4vered 4vereg 5vereig 4verek ve4rel ve6r7eng 4verenn 4verep ve5rer ve5res. 4verett 4veretu verfø5re ve9ri. veri3a ve4rial ve7rie 4verik ver3il 5verkn ver5m6 ver6nal vern6s5 ve9ro. ve3rom ver8ska. ver5ski ver7spo verta8la. verta6le. ve1ru 5verum. 6very verø6 ver3øs4 4verå v4es 3ves. 2ves4a ve5san 4veset 4vesh 4vesi 4vesj 4veski 2vesl ve9sli ve1s2m 6ve3so 4vesp ve6s3per ve5sted ves6t5end vest5o4v 4vestr 4vestu 4vestø vesva7 5vesynds 2vesø ve1så veså5re v4et 1vet. 2veta 8vetaka 4veteg 4vetek ve5te6s7 6vetev 2ve7ti 4vetj 2veto ve4to. veto7e 9vetoke 9vetoks. ve4tor 2vetr 1vets vett5sk 6vetv 4vety vety8e 2veu ve8um 2veva ve6vak ve5van ve9var 2vevi vevi8sa vev4sm vev4sp 2veø 2veå 1vê 2v1f vfall4 vfø7re. 2v1g2 v4ga. vga4le. vga6li vga8ve. v9ge v4gi. vgjer6s7 vgo4 v4gå. 2v1h vhø4re. 1via vi1an vi6bl vice5s 1vid vi5de vide4o7 vi4d5o4 vid3r vid3s4 vi1el vi5end vig4m vi4gu vi5gø vi4kat 5vikb vi5ked 7vikg vik5ke vik5n vi2k3o6 3viks. vik5sa vik5s6l 4vikt 5vikti vi4k5ø4 vi2l1a vi5la. vi4les4 vi4l3in 1vilj vil4l5an vil4led ville6de. vil4lei vill9ep 6v5illu vil5m vil1o vil4sti vilt7o vil6tret vil4tri vi2lø 4vim vim7p vim7u 4vindl 5vindu vine5st v6ing 4vingn vin5gom. ving3r vin8g9u vin3na vin4ned 6vinnh 4v5innl 4v5inns 4vinnt vi6n5o6ver v2in2s vin7sja vin4tes vin5tre vi8pa. vi6pe. vip5s 1vir 4viro 7viru vis3ab vis3ak vis5and vi4see vi3sen vi6seng vi2s1k visk6re vis5m vi1so vis3om vi4sp vis9pa viss4p vis5ti vi4tak vi5tese 5vi6t5j vi4t3o vi4tr vit7ra vit5re vit5skr vit6te6s7 vi4t5un vitun6ge. vi4t5øy4 vi4va. vi6ves vivi3 v1ja v1je vje4t5a vje5t6e vje4t5r vjet3t vje4tu v1ji 4v5jo vju3t 6v3k6 vk4le vk4ler vku4le. 6v1l2 v6lab vla6ga v9led v9leg vlei9e vl6el vle4se. v5lesn vle5str v6lesv vli7v vls9 vlu9sa 2v1m vma8le. vmo8de. vmord4 vmå8la 2v1n v3nad vna8ke. vn5al v9nar vn5dy vne7b v2ned vne7de v4nele v4neli v4nelo v2nem vne5r6e v4nero vne1s v4nesta v6neste v2nev vnor9s8kas vn4s5pa vn1s4t vn5t4 vnæ4re. vn5ør vo1al vo2ar 6vob 2vof vof8fan vo4gu voi1 1vok 4voko voks3k vok6s5 1vol voli7 vo4litu vol4tes 2vom vo4na vo9nal vo9nar von5de vons6 von5sh 2v1o6p 2vord vor8da. vo1re vo9ren 2v1org 4voro vors7k 1vos 4vosj vos4se vo4teg vo4tel 6votr vo1v vo4ve. vo6vi. 2v1p4 2vr8 3v6rak v7rar v1re vregi3 6vrenge 4vrengi v6rengj v6rengt vrett4s v6ri. 3vrid 7vrie v6rigas vri6ma. vri8me. v3ring vrin5s vri6ve. v1ro v4rob v4rof v4rok v4rop vro8te. v1ru v7ry vrø3ve v1rå vrå8da. 8vs v6sa. v7sali v6se. v4seg vs3egg v3s4el v4s5e4li vse4n v5sen. v4s5eng v5s4ens v2ser v6si. vs1in v1sk vs8ke v6s5kum vs1kv v1sl vs3lan vs6let v6slik vsmå8la v1s2n v6s7na vs3ne vs3ny vs3næ v4s3nø vs5od vsom5 vs5oms4 v7son vs1or vs2pe vsre6de. vs7s6t vs4s5å v1s2t2 vste6ma. vs3til vs1v vsø6ke. vsøl5 v2s5øy vsøy4er v8så. vså7re 2v1t vta1 v4ta. vta8ka. vta6led vta9len vta4lev vta6s v5tepp v5t4i vti8na vti8ne. v5t4r v3t2v vty8e 1vu vu2d1 vud5d vuden5t vuds4 8vué vu8k 2vul 2vung vun4ge. 6vu6o 2v1ut 2v1v vva8la vve8g9ing. vve6g7inga vven7n6i vvi5ke vvi6k7l vvi8s9an vvi4se. 2vy1 vya4 vy7ens 1væ væ1ra væ9ret væ8ta. v3ø4d vø4l vø7li vøm4met 3vøre vø6re. v3ørke vør8na. vø3se. v5øv 4v1øy vøy6e vøy7ene. vøy9enes 1våa 1våe 4våend v4åk vå8ka. vå4ke. vå4kene vå9kene. vå4le. 1vån vå5ne 4vånu vå3ren vå8sa. vå5tes 6våtf våt7å w2a wa6l 5wald wal4k walk5o4 wal4l 2wap war6d7er wash3 1wat wa3z w1b wboy5 we2 weate7 we7b we3g we5re wes2 wes3s wester6 western7 wet5 wett4 w4i2 wi9ar. wich3 3wicz wi3d 5wi6en wi9er. wi5f wi3ni wi5ra wi3ren wi5ta wk3r w1l w1m wn5s wob5 wou6 wout7 ws5 ws6k wurs6 wy2 w1yo wyor2 wyork3 w1z xan5t x7b x3f xga6 x7h x1ic 5x6id xi5e4 x5k x1l x1p6 x3r x1s2 x7t x6u xy2 ya7b 1yac ya5f ya4h y1ak yak6te. ya2l y7am y1an y6an. y2ana ya4ne. yan7k yan7sl y1ark y7arr yas4 ya5si ya5t y1av y1b yba4ne. yb4bed ybde3 ybo2 ybu6er ybue7re ybu7ern ybyg5 y1c y8ce. y8cé y2co3 y6dab yd5av 4ydd yd6dela yd4dep y6d7enh y4deo y2dep y4dero y2d1is yd6je yd1ji ydo4 yd3op yd5ov y1dr y4d4r5au yd1re yd5rem y4dro y4d4r5oks yd3si yds4v y2du yd1un ydø4 y4døm ydør5 yd1øs 4y1e yed8l ye6dre y2ek y5eks ye4len ye6let yel4s5j yel4sk yels3m yel6s5t y2em ye2n y7e6ne y8ener y2enh ye5ni y2enk y2enl yenle6ge. yens4 y4ense y3e6re ye4rel y3ern yer8sk y4erst yes2 ye5sm ye2t ye9te ye5ty y2ev y1f yfan9 yfjell4 y4fle yf5le. y8ga. yga8ve. yg4dal yg4dek yg4del yg4dep yg2do yg2d1r yg2d1y yg2dø yge5i ygen5s y6geret y2ges y4gev yg6gam ygg7art ygges4 yg5gj ygg5l yg6gr ygg3s2 yg6gu yg6g5å ygi2 y5glo yg7m yg6r y1h yhes5 y1i y9in. yis7t y1j 6yk y1ka ykap3 y6kara y2ke y7kel. y5kelen y3keli y7kels y3ken y3ker y4kerel y4kero y5ket. y9kets y1ki y1kj y4kjar y5kjare ykjeva8ne. yk4kana yk4k5enh yk5kesj ykke6s5ta yk1kj ykk5ni ykk4s5k yk8k5vi6 yk4ky yk1la yk6lest y1klo y3klub yk3lus y5klæ y1ko y2koa y6koli y4komo y5kosa y2kot y5koti y1kr yk1s yku6le. yk3var y1la yla8ga yl4dan yl4derk ylde4s yld1r yld5s6k yle6ge. y7les y4lev yligh9 yl5k8 ylke2 ylke4s3 ylkesla8ga yl4lev yll5is. yl3s6 ylst7re yl5tet y8luse 3ylven y1ly ylæ7re y6mei y4mete ym4fe5d6 ym5jara y4mo. ymo5e ym3p2 ym1s ym8sa. ym4se ym8sl ym6ta. ym6te. ymå6la y9n8and yndes8 yn5det y2nel yn7eld yner3g yne5s4 ynesi8 y6nev yn5gel yn4gem yn2gr yn4g5ø ynko3 yn6k5v yn5na yn5ne ynn3s4 ynn4ø y3no y4no. yns1 yns6are yn4sem yn9set yn2si yn2sk yns9ket. yns7ki yn5skj yns7kjele yn8s9kjer. yn4st yn2su yn4s5ver yn4tap yn8teg ynt5ei yn4tek yn6tete yo4gat yo6gi. y1om yon4 yon5nen yo6nu y1o2p y1o2r yor6da yo5re you4 yout5 yp8e y2pe. y4pee y4pena y4penet ype4rel y6peta y1pi y4pi. y7ping yp5inn ypin8na y1p2l y5po yp7p6a yp3pe y1pr yp5s8 yp4tok y3pu y1ra yra8ka y4r3a6l y7rarb y4r5au yr5av yr7da yr5dø y7real yre3in y5reis yrek4 y7rek7k y3rels y5rems y1ren yre9ne y4reo y6rerel y4rero yre5sc y5rest. yre5ste y5reste. yres6ten y1ret y4reta y4rete y4reto y7retø yr7ga y1ri yrin5g6 yri6ene. y4rif yri8ka. yr3inn yris6p yr4kee yrke4s yr5kj yr3m y7roe y3romm yr1op y5rosk yr5r8 yr4san yr7set yr5sk yr6skj yr6skr yr2sp yrs7tan yrs5tar yrs7tene yrs5tens yr3sti yr4sv yr3te yr6tek yr2t3r yr3tra yrty8 y1ru yrul8la. yr5ut5r yr3v y1ry yr3øk yrøy4 y1rå1 yråd2 yrå8da yråde7r yrå6ders y4rådi y2råm y6råst y4råt y4råv 2ys y1sa ys6a7kers ys4e yse4bu y4sed y4see yse5ei y2seg y2sek ys7ekte y2sem y4sera yse7rid yseri7e6 y4sesj y4sesk y4se5s6l y4sest y5seste y6sesu y9set. y4seu ys6i ysi8e y5sjk y7skag ys6kara ys7kare ysk9au ys2k3l ysk5øs ys4mi ys4nø y1so y4s5or ys2pe ys5pis y5s4po ys6sak ys6sam ys4s3ei ys4s3ek ys4s5il ys2sj ys4sku ys2so ys2sp yss5pe ys4sta yss5tab ys4s5ti ys4su ys2s5v ys2t ys3ta y8star. ys4tat ys3tel ys3ten y4s3ter ysterie7n ys7tesl y2s3ti yst3op yst3r ys5t6ry ys6ty y1su ys1ve ys5år y1ta y4t3ana y2tee y4tef y2teg yt5e4ge yte3in y4teka y4teki y4tena y4teno y2teo y4teret yte6ro yters6 yter5ske yte5r6ø y2tes2 y2tet y3t2hi 6y5til y6tj yt9ja yt5jen yt9jer yt4mei yt4mes y3to yt8ra yt4re. yt5rer yt1ri yt4rik y5trå yt4s3en yt3sk yt5sv 4ytt yt5t6a ytt4e ytte8r9end yttes6 yt4test yt8tien. yttsa6me. 2y3tu y1ty yt4ys y7tå8 y1u y6ua y8ue yu8g yu4l y1v y4vak yva8la y2ved yve4ria yve4ris y4vese y6vesy y6vev yvi8sa yvi6se. yv1år yvå5te y1w y5æ y5ø y1å2 za5b 3zae 4zaes za4g5 za5k6h zani4 zania5 5za5v z1b4 zbu4 z1c z1d 1ze zea1 zebu9 zeli5 zen3s 4z3ense 4z3ent z1f z1g 5zha z3hi z5hu 5zie 1zifi 5zing z5int 1zis 6zisty 4zi5s4v 2zisy z1k 4z1l z1m 5zo. 5zoe zo1f2 zo4no zo5re 6zos z1p z5r z1s 4z1t zu3e z1un z1v z1za. z2z3el æ5by æ2bø æ5de æ7di æ1f æg6 æ2k æ3ke æ5ki æ8kj æk1ja æk7je. æk9jer. ække7 ækkel6 æk6l æ1la æ4le. æ2le3d æ4lena æ4lev æl5j ælsle9 æ4r1ak æ3rane æ4rans æ4rarb æ6rarbe ær4arte æ4r1at ærbu5e ær1d4 æ1re æ2rea æ4red æ2ref æ2reg æ8r7ei ærei6e æ2rek æ6r7eld ære5ne. ære7nes æ2rep æ5rern æresa4m ære6skr ære4sl ære4sp æ4reta æ4retek æ9rets æ2rev 4ærf ærgen5 ærhø8 æ1ri æri6e7ne æ4r3il ær3ins æri6s ær5is. 4ærk2 ærle6ge. 4ærm ærmå8la ær3n ær5ne4 ær4nå æ2r7o6 ærom5 æroms4 ær5r ær6sel ær4s5il ær1sk ær7s6no ær2sp æ2r1u ærut5 ær3v æ2r1ø4 ærøy7e ær3å4 æ8se. æ2sj æ2s1k æ5ta 4æte æ4te. æt4r æt4ta æ5va ævar5 æve4s æ5vi 6ø1a2 øa7re øau4 ø1b øbe6lev øbe4li ø2bl øbl9u øb4r ød3ag ø4dak ød3d ød9de. ø2de. ø4dede ø6def ø4dela ø4dem ø4deo ø4deri ø4dero ø5dj ød1r ød4red ød4rek ød4rep ød2sc ød6s5ek øds7ke øds4ko ød6sku6 øds4mu ød8t5om ødt6r ø2du ød3und ø4d5ur ø6d5ø 4ø1e2 ø4ed ø5ene ø5ep ø3e6re øfe8 øf3fe øf6j øf8la. øf8le. øffe8l7a ø5fn øfte5s øg1 øg2a øg5ak øg5al ø7gar ø5gas ø3ger øg5gl øg8gå ø7g4j øglo8ve øgn6s7p ø2g2r øg5re. øg5res. øgs2 øg4ste øg4str øgta5 4øg4u ø1h ø4i øi4e ø5ing ø5isk ø4it ø1j 6øk. 6ø1ka ø5kav øka8ve. ø6keh ø4kelo ø6kerada ø6kerel ø4ke5ru øke1s ø6kese ø8kesl ø4kest ø4kete ø1ki 4økj ø5kjare ø5kjas ø1kje 2økk øk5kel øk5ket øk4k5l økk5r øk3lag øk3lan 2økna 1øko øk5opp ø1kr ø8krar øk8sa. øk6se. øk4ses øk4si øk2so øks1t6 øks5ti øku4r øk5ur. øk5ure øk7ve ø7ky ø1la ø2lah ø6lam øl3d øled ø4ledi ø6lelu ø4lero ø6leta ø4le5te ø2lev øl4gera ølge5s6v øl1j øl2ke ølke7s øl4lese øl9leti øl6lev ø1lo øl7op ølrå4 øl6sel øl4sere øl4se3s øls6t4 øl5s4v ø5luk øl7ut ølva6 øl4var øl4v3ei øl6vek øl8vel ølv7erk øl4v3in ølv5o ølv7r ø1ly ø4me. ø9met 1ømfi ø5mi ømini6 øm4med øm4mero ømmet6 øm4metr øm3op øm4pel øm7s6p øm1st øm5svi ø2m1u ømå8la øn2ad ø6n5al ø5nas ø2nem ø3nes. ø9nese ønhø8re. 4ønn øn4nal ønni4 øn4n5it ønns5al ønn4s3e ønn4s5i4d ønns5kje ønns5kre ønns5ku ønns3l ønns3t øn2nø ø6nom øn2s øn9sa. øn5sak øn5sam øn5se. øn3ser øn3skj øn8skjer. ønst3r ønst9ra ønt1 øn2ta øn2to øn7u8 ø1o ø4peda ø6pe5i ø4penu ø5pero ø4peru øpes4 ø4pete ø4peti ø1pi øp3li øp5p øp6pl ø1pr øp6s1 øpsa4 øpsla8ga øps8leg øp5ste øp4s5ø ø1ra ø2ra. ø2r1af ø2r1ak ø2r1a2m ø4rans ø4r3ant øra8sa øra6si ø4r7au ørd4e ø1re ø2rea ør7edd ø6redu ø2ref ø2reg ø6rein ø2rek ørek6l ør3eks ør5ekt ørele8se ø9relet ø4r5eng ø2re5o4 ø2rep ø6reret ø4reru øre1s2 ø5res. ø4rese ø6resi ø7reskrivi ø8reso ø4rest øre6s7v ør6et ø4reta ør1eu ø2rev ør5fe ørge5s ø1ri øri8m ør4jet ør4keri ør4kes ør8k9lag ør6k5n ør4kve ør4kå ørla8ga ørm9ut ørn4e ør4nere ør4nes4 ør4n3u ør4n5ø ør1o ø5r6ok ø1ros ø4r3ost øro4v ør4rek ør4rep ørri4 ør4r5is ør4råt ør4sak ørsa8ka ørsa6me. ør4sc ør6ses ør2si ør5ski ør4skr ørs6lev ør4som ør4spe ør2st ørs9tar ørste5i ørs5tens ørs5tig ør3sto ørs9u ør2sv ørs1å ør9tar ør4tek ør6ti9a ør4tide ør8tien. ør6tif ør3to ørum5 ø6rut ør5v ør1ø2s ørø1v ør1åp ø1sa øsa6me. ø8sarar ø1sc ø2se. ø2sem øse4n5o øseri7 øserie6 øs5jo øs7kar øs1l øs4lag ø4slu øs2me ø1s2p øs8tas øst9ast øs6teg øs5terse øst9ett østo2 øst5of øst5ov øst1r øst3re østø4 ø2s1ø2 4øt øt3ak ø9tar øta4s øt5asa ø2te. ø2tea ø6tef ø6tege ø2tei ø2t5eks ø2tel ø5tela. ø3ten ø4teni ø3ter. øte3ru ø2te1s øte7sn ø4teta øt7ri øt1sa øt3s4p øt7s6å øtså9re øt4tero øt6test øtt5av øtt5eks øtt5eta øtt5ete øtt5ra øtt7ri øtt1s2 øttså7re øt4tur øt4ty ø1tu ø5ty ø1u2 øug8la øv5aa øv5ans øve5in ø4vek øve5no øveren8 øve1s øves4t øve3te ø5vik øv6l7ut øv7ne øv6nø øv9o8 øv1r øv5reb øv1s øv9sa ø5vå øy3al øya2n 7øyan. 9øy8ans øy4dek øy4dere øyd8i 5øyeb øy7e4de øy2ee øy4ele øye4n øy4ep øy4erf øy1gl øy3ke. øyks4 øyk5t 2øyl øy4led øy4leg øy5na øy5ni øy3o 6øyp øy3pe. øy4pel øy4ra. øy5rer. øyri6v øy3rø øy1s øy5s4ar øy5si øys2l øy4sm øy4spi 5øysund øy4tei øy4tel øy4tere øyte5s6 øyti7da øy1tr øy2t3y6 øy5tø øy4vei 5øyvå ø1ø2 ø5å6 å1a åak6ta åa4n5 åan8ka. åan6ke. å2ar å5aran åau4re å1b4 åba8ne. åber2 åbo9ta 6å1d å7dan å9dar å4ded å4dek å4dem å4deo å4dep å4dere å4deri å6dero å2des å7di åd4ra åd8re åds1 åd2sk åd3s4la åd7slo åd3slå åd1s2n åd3s4pe åd7spu åd5st åd6s7te 4å1e å2ele åem8na åe2n å7ens å3er å3e6re. å1f åfe6 åfø5re 2åg å4ga. åg7ald å4ge. åg7ei å2ges ågna5 åg5ne åg4r åg5rin ågs6k åg5sl åg7sp ågs4t ågu4l åg5ø å4gå. å1h å1i å1j å1ka å3kan å3kar å4karb åk7av å4keh å3ken å4kena å4k3enh å4kere åke5s å4kesl å5kevi å1ki å6kid å1kj åk1k åk5ka åkk6l åk7kr åk7lau åklist7 åk3læ å1ko åk3opp åko4s åk6ra åk5røk åk3rå åk1s2 åks7l åk3t4 åku8 å5k8ul åkva8la. åkøy8rar. å2k3å å1la å5l6amp å6larb å9las ål5au8 ål9av ål3d å2lef ål5eini å2lek å2lem å4l5enh å4leni åle6ris å2le1s2 åle9s6und å4lete å2lev ålgå6 å6lio ål5j ålla6ga ål3or ål4san ål4sek ål4ser åls7i ål2sp ål4sti ålsy8na ål5ti ålti5d ål1u ålul8la å1ly å2l1øy åløy4e ål5å6k ålå8te. 6åm å6me. åm4li. åm1om åm5øy å3nar å9nas ånd3r ånd4sa ånd4se ånd4so å4ne. åned4 åneds5 åne5i6 å2nel ånely6 å5nes. å3net å4netr å3ni ån5o å9ny å3o åp2e åpe4n3a åpe4n5i åpen3s å5per å6pero å1pi åp6j å1pla åp4ne. åp7p å1pr åpra5 åp2s1 åp6ta å4på år3ak å9ran å7rara ård5str å2re. å5rei å6rel åre7s å4rest årfi4 å7riv år3k2 år4le. 2årn årn5s år3on år3op årpo8 år2s års5af års3el år3sem års3ko år8sku årsla8ga år3sol års3ta år7ste års3ti år7sto år5stu års1u års1v år5sy år5u4k år3un år5y4 å1rø å5r8å ås2 å1sa ås7au å4se. å4see ås5eid å4sek å4sem åseri7e6 åse3s2 å4sesm å4seso åse5ta ås3h å8si. ås5ka. ås9kene ås8ki å1skj ås7kop å1skr å5sku å1sl ås5ne ås3ni å5so å1sp ås7pl ås5sa ås5se ås3si åss3k 4å1st å7stei åsu4 ås3un ås7ut ås7væ ås5øy åså9 å1ta å4ta. åtaks5 åta2l åta9la åtale3 åta5le. åta5len å4tang å4tark å4t5arm å2te. å2tea å4tee å2t1ei åte6ke. å4teo å9ter å2tes 5åtferd å5ti åti7da 2åtn å1to åt7ov 6åtp åt1re åtri6pa. åtri8pe. åt1ru åt5sk åt1t åt4ted åt4ti ått3o åt4tri åtts4 åt6t5æ åt1u åt4un åtva5ra åtva7re åt5ve å5ty åt1øv å3u åun8ge. å1v åv4a å2ve7d å4veg åve5l å4veni å9ver. å2vev åv7s6 å7vy åvæ4re. å1ø8 åøy4",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=27148,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-nb.pat b/Master/texmf-dist/tex/context/patterns/lang-nb.pat
index 1102ee60ca5..306c2ad1635 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-nb.pat
+++ b/Master/texmf-dist/tex/context/patterns/lang-nb.pat
@@ -2542,6 +2542,7 @@ ansport7s6
an1st6
6anstar
ans4te4
+6ans6ti
2ansu
an9s6und
5ansunda
diff --git a/Master/texmf-dist/tex/context/patterns/lang-nb.rme b/Master/texmf-dist/tex/context/patterns/lang-nb.rme
index 48bfa041a4f..0f15b913401 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-nb.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-nb.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Norwegian Bokmal Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% Adapted to the new pattern-loading scheme.
% Original file name was nbhyph.tex
@@ -26,109 +30,10 @@
% Please send bugs or suggestions to karl@huftis.org.
%
-% This file is part of hyph-utf8 package and resulted from
-% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
-%
-% Source: nohyphbx.tex (2007-02-07)
-% Author:
-%
-% The above mentioned file should become obsolete,
-% and the author of the original file should preferaby modify this file instead.
-%
-% Modificatios were needed in order to support native UTF-8 engines,
-% but functionality (hopefully) didn't change in any way, at least not intentionally.
-% This file is no longer stand-alone; at least for 8-bit engines
-% you probably want to use loadhyph-foo.tex (which will load this file) instead.
-%
-% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
-% with help & support from:
-% - Karl Berry, who gave us free hands and all resources
-% - Taco Hoekwater, with useful macros
-% - Hans Hagen, who did the unicodifisation of patterns already long before
-% and helped with testing, suggestions and bug reports
-% - Norbert Preining, who tested & integrated patterns into TeX Live
-%
-% However, the "copyright/copyleft" owner of patterns remains the original author.
-%
-% The copyright statement of this file is thus:
-%
-% Do with this file whatever needs to be done in future for the sake of
-% "a better world" as long as you respect the copyright of original file.
-% If you're the original author of patterns or taking over a new revolution,
-% plese remove all of the TUG comments & credits that we added here -
-% you are the Queen / the King, we are only the servants.
-%
-% If you want to change this file, rather than uploading directly to CTAN,
-% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
-% or ask for credentials for SVN repository and commit it yourself;
-% we will then upload the whole "package" to CTAN.
-%
-% Before a new "pattern-revolution" starts,
-% please try to follow some guidelines if possible:
-%
-% - \lccode is *forbidden*, and I really mean it
-% - all the patterns should be in UTF-8
-% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
-% and if you really cannot do without, also \input and \message
-% - in particular, please no \catcode or \lccode changes,
-% they belong to loadhyph-foo.tex,
-% and no \lefthyphenmin and \righthyphenmin,
-% they have no influence here and belong elsewhere
-% - \begingroup and/or \endinput is not needed
-% - feel free to do whatever you want inside comments
-%
-% We know that TeX is extremely powerful, but give a stupid parser
-% at least a chance to read your patterns.
-%
-% For more unformation see
-%
-% http://tug.org/tex-hyphen
-%
-%------------------------------------------------------------------------------
-%
-% TeX hyphenation patterns for Norwegian
-%
-% version of 2007-02-07.
-% Patterns of January 25, 2005, with later additions and changes
-%
-% Copyright (C) 2004, 2005 Rune Kleveland, Ole Michael Selberg.
-% Copying and distribution of this file, with or without modification,
-% are permitted in any medium without royalty provided the copyright
-% notice and this notice are preserved.
-%
-% Please send bugs or suggestions to tex-live (at) tug.org.
-%
-% Originally generated by a script written by Rune Kleveland
-% from dictionaries available from
-% http://folk.uio.no/runekl/dictionary.html.
-%
-% Adjusted manually by Ole Michael Selberg to prevent
-% numerous wrong hyphenations, especially in compounds.
-%
-% Changes from the former version of 2005-06-29:
-% 388 new patterns. Some old patterns have been deleted or changed.
-%
-% In Kleveland's nohyphb.tex there are 26017 patterns.
-% This version of the revised nohyphbx.tex contains 27149 patterns
-% --- plus 45 exceptions in the \hyphenation-list
-% (which you may change to suit your personal needs).
-%
-% To load these hyphenation patterns the parameters
-% of TeX must have the following minimum values:
-% trie_size = 33385
-% trie_op_size = 815
-% (The corresponding values for nohyphb.tex are
-% trie_size = 31900 trie_op_size = 636)
-% If you want to load more than one set of hyphenation
-% patterns the parameters have to be set to a value
-% larger than or equal to the sum of all required values
-% for each set.
-%
-% Notes on other Norwegian hyphenation pattern files, from Dag Langmyhr,
-% tex-live mail of 29 Jun 2005 11:26:21 +0200.
-% nohyph.tex -- manually created by Ivar Aavatsmark and others;
-% hyphenate according to pre-1973 rules; no longer recommended for use.
-% (Sometimes also known as nohyph1.tex.)
-% nohyph2.tex -- created by Dag and a student; the present file,
-% nohyphbx.tex, is more extensive and is recommended.
-% \ No newline at end of file
+\input hyph-no.tex
+
+\hyphenation{
+at-ten-de
+be-tre
+}
+
diff --git a/Master/texmf-dist/tex/context/patterns/lang-nl.lua b/Master/texmf-dist/tex/context/patterns/lang-nl.lua
new file mode 100644
index 00000000000..76399368c19
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-nl.lua
@@ -0,0 +1,121 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["characters"]="abcdefghijklmnoprstuvw",
+ ["data"]="aan-dachts-trek-ker aan-dachts-trek-kers acht-en-der acht-en-ders acht-en-der-tig acht-en-der-tig-ste be-heers-ta-ken be-scherm-en-gel be-scherm-en-ge-len be-stuurs-la-gen be-stuurs-ta-ken bij-stands-trek-ker bij-stands-trek-kers bui-ten-an-ten-ne bui-ten-an-ten-nes don-der-aal han-dels-taal her-e-nen ket-ting-ste-ken lands-taal meest-al mi-nis-ters-por-te-feuil-le mi-nis-ters-por-te-feuil-les ont-hoof-din-gen pa-ling-ste-ken rechts-taal schil-ders-ta-lent sou-ve-niertje sou-ve-niertjes spie-gel-ei ver-en-gels-te ver-hol-lands-te ver-in-lands-te ver-kinds-te ver-ne-der-lands-te ver-rechts-te ver-steeds-te wals-te wa-ter-staats-in-ge-ni-eur wa-ter-staats-in-ge-ni-eurs",
+ ["n"]=40,
+ },
+ ["metadata"]={
+ ["mnemonic"]="nl",
+ ["source"]="hyph-nl",
+ ["texcomment"]="% Dutch Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: nehyph96.tex (yyyy-mm-dd)\
+% Author: Piet Tutelaers\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% PURPOSE: 8-bit hyphenation patterns for TeX based upon the new Dutch\
+% spelling, officially since 1 August 1996. These patterns follow\
+% the new hyphenation rules in the `Woordenlijst Nederlandse\
+% Taal, SDU Uitgevers, Den Haag 1995' (the so called `Groene\
+% Boekje') described in section 5.2 (Het afbreekteken).\
+%\
+% The main differences with our earlier patterns based upon the\
+% CELEX dictionary are:\
+% (1) provide 8-bit patterns based upon the T1 character encoding\
+% (the encoding for DC/EC compatible TeX fonts)\
+% (2) don't hyphenate if this results in a syllable of one letter\
+% before or after the hyphen (hence hyphens in a-drenaline,\
+% studi-o, mensa-pen and vide-oachtig are invalid)\
+% (3) handle words derived from other languages (`bastaard\
+% woorden') according to the new rules\
+%\
+% Like the CELEX patterns these patterns don't hyphenate:\
+% (4) in a changing syllable (menuutje can not be hyphenated as\
+% menu-tje)\
+% (5) in words that have different hyphenations according to\
+% there meaning (buur-tje/buurt-je)\
+%\
+% COPYRIGHT (C) 1996: Piet Tutelaers \
+%\
+% -----------------------------------------------------------------\
+% IMPORTANT NOTICE:\
+%\
+% This program can be redistributed and/or modified under the terms\
+% of the LaTeX Project Public License Distributed from CTAN\
+% archives in directory macros/latex/base/lppl.txt; either\
+% version 1 of the License, or any later version.\
+% -----------------------------------------------------------------\
+% VERSION: 1.1 (November 1996) Copyright changed March 2000\
+%\
+% AUTHOR: Piet Tutelaers P.T.H.Tutelaers@tue.nl\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyzäçèéêëîïñöûü",
+ ["data"]=".a4 .aan5 .aarts5 .aat5 .ab5l .acht5end .ac5re .adi5 .af3 .af5l .af5s .aftu5re .al3ee .al3f .alk4 .al5ko .alko5v .al5ma .al3om .al4st .ana3s .an3d2 .an3en .an3gl .an5th .ar5d .ar5tr .as5h .as5l .as3t .as5tra .as3u .at4a .ave5n .b4 .be3la .be5ra .be5ri .bos1 .c4 .coo5 .co3ro .cus5 .d4 .daar5 .da4gi .dag5r .da2k .dan2 .debe4 .de2k .dek5l .dek5s .den4k5r .de5od .de3ro .de5sta .di4a .die4p .di3o .doet3 .do3v .du4w .e4 .ede2 .edel5a .ed3w .ee4n .eer5ste .eest3 .eesto4 .eet3 .ei3l .ei5sc .ei3sp .ei5t .el4s5 .en5s .en5th .ep4a .ere5s .er2f .erf3l .er3in .ert4 .erts3 .es3 .es5c .es5pe .es5tr .eten4 .et4h .ets5te. .eu3 .eus5 .é2 .f4 .fel4s .g4 .gaat5 .gang5s .gea5v .ge3l4a .ge5le .gelo5v .ge3n4a .gena5z .ge5ne .ge5no .ge3ra .ge5r4e .ge5r4o .gerst5a .ge3s .ge5sk .ge5ta .ge5tj .ge5to .gid4 .go4m .goot3 .h2 .handels5 .her5in .hits5t .ho4lo .houd5s .i4 .ide5o .ij4s .ijs5l .ijs3p .ijs3t .ik3 .in1 .in5d4 .in3g4 .in5gr .ink2 .in5kr .in5kw .in3s4 .in5sl .in5st .in5ta .is5c .j4 .jor5 .k4 .ka3d .ka5g .ka4taa .kerk5l .kerk5r .kerk5u .ker5sten .ke4s .koot5 .ko5pe .kop5l .ko3v .kun2 .l4 .laat5ste .le4b5 .leg3o .le4g3r .leid5st .len4s3 .le5r4 .le4s3 .le5th .lin5d .lof5 .loot3 .lo4s1 .lu3e .lui5t4j .lu4s .m4 .ma5d .ma5ï .meel5d .me5la .me5ni .merk5l .me2s .me4st .met5ee .mij4n5i .moot3 .mor5sten .mo4s .n4 .naat5 .na3d .na3n .na3s4 .nee5s .ne2p .nep3a .ne4s .ne5te .ne4t3j .neu4t5j .nie4t5j .noot5 .nos5t .no5v .o4 .oe4r5 .oe4s5 .oeve4 .ol3f .om1 .omme3 .on3a .on3d .onde4r .on1e .on5g .on3i .on5k .on1o .ono5v .on2t3 .on4tee .on4ter .ont5s .ooi5tj .oot5jes .op5ee .opi5 .op5l .op3r .op5s .org4 .os5 .ove4 .p4 .pee5tj .peri5 .pers5te. .piet5j .pits5te. .poort5j .po4st .puit4 .pui5tj .pu2t .r4 .raads5le .ran4d .rand5a .re4men .ren4o .reno5v .re5o .rie4t3 .rij5sp .ring5s4 .roe5tj .ro4l .ro4st .ro4t3h .ro5v .s4 .sap3 .sa5v .sci3 .see3 .seks5te .se5re .set3 .se5v .side3 .ski3s4 .sneu3 .sno2 .so2k3 .song5 .spoor5tj .st4 .ste4m .t4 .taart5j .tan4da .te4a .te4f .tek2 .te3le .ten5ac .te3no .ten4t5j .te3ra .ter4p5a .ter5s .te4s .ti2n .tin3a .tin3e .toe5pr .to4lo .to4p .to5v .tri3s4 .ts4 .tsa3 .tuit5j .ty2r .u4 .ui2 .ui5s .uit1 .uit4je .uke5 .ur4a .vaat5j .ven4t5j .ve4r3 .ves5p .vet3j .vie4r .vol5s .w4 .wals5te. .wee4ko .wee4t3 .we4l3 .wen4s5t .west5r .win4s .xe3 .y2 .z4 .zes5 .zit5 .zooi5 4a. a4a4 4aad aad1a aad1o aad1r aad5sap aaf5a 4aag aag1a aag3e aag3o aag5r aags4 aag3sa aag5so aag3sp aai3l aak1a aak3e2 aak1o aak5r aak3sp aal5a2 aal1e aal5f4o aalfo5l aal1i aal5k aal5m aal1o2 aal3sl aal5so aal5spe aal5ste aal1u aam1a aam3o aam4sta aam4ste aan1a 5aandee aand4r aan1e2 aan5g aan5i 3aanj aan5k4 3aann aan3o aan3sp aans4po aant4 3aanta 3aanv aap1a aap3i aap3o2 aap3r aar3a aar4d5as aar3e4 aar1i 4aarn aar1o2 aar5spel aar4t5on aarts5l aar3u aas3e aas3i 4aast aas5tr aat3a aat5e aat3h aat3i aat1o aat5r abak4s5 aba4l abat4s ab5eun ab3ijz a2bon aboot4j abot4j 2abr ab3ru 4ac. a3cal a3car 4ace ace3st 4ach. a3cha 2a1che 4a1chi ach3l a1cho a3chr 4achs ach5tec a1chu achuut5 4ack ac3kl 2acl 2a3co 2acr ac5res 4acta 4acu 4ad. a5da. ad3ac ada2d ada4l ada2r3 adas5 2add a5de. ad3ei ade5re a5des a3det a5deta ad3e4te 2adh 4ad4i adi3al adi4oc adi4od 4adk 2adl 4ado. a3doo 2adp ad3rei a3d4ri ad3rol 2ads ad5se ad3so ad1s4t ad5sta ad3ui ad3w 2ady 4ae aege4 ae5k4 a3e2p ae3r ae2s3 ae4s5t a3eu a2ë a4ër 4afa af3aa a2f3ac af4as af4at afd4i afd2r af5d4w 4afe afee4 4afi af3l 4afo a5fo. a2foe afon4d af3op af5org af1r af3s4 afs2c af5se 3afsl 3afsp aft4a af5tr af3ui 2afy 4ag. ag1a2d ag3af ag3a2m ag3ar ag3di a5ge. agee5t 4a5gen. ager4s ag3ex a4gil ag3ind a4g3ins agi5ot 4ag1l ag3of a4g3or ag4o3v a2gr ag4ra ag5rap ag3ru ag3sl ag4sle ag5slu ags2p ag3spe ag3spi ag1st ag3sta ag5str 2agt agu5a a2g3ui ag3u4r a2g3uu 2ah 4a1ha 4a5he ahe5ri a1hi ah3l a3ho ah5r ah5t2 a3hu a3hy ai5a2 ai4dr ai1e a1ij ai5k ail3m ai2lo a2in aio4 ai3ov ai3s4 ai5sc ai4s5l ai5sn ai1so ai1st ai5tj ai3tr aiu4 aïn4 aïns5 aïs3o4 2a1j ajaars5 aka2 ak3af ak3ag a4k3ar a4k3ed ak3emi ake2t ak3id ak3ink ak5is 1akko 4a2k3l a2k3n ak5ne ak4ni a3kof ak3on ak3o2p a2kr ak5ru 2aks ak4so ak5spe ak1st ak5to ak5t4w a2k3u4 ak1w ak3wi a1la a4l3ach al3adr a3l4ag a3lal a5lapr al3art 4ald a1le a5le. al3eff 2aleg a2l3el ale5ro ale5ste ale4tj a3lè al4fen alf3l al5fon alfu4 al2gl a3lie al3int alk5ei al5kle alk3s al4kui al5le al4mac al5me a1lo a4l3ol alo2n al3ou a4l3o4v 2alp al3s4ag al3san al3scr als5j al2sl als5li als5m al4sn al4s3oo al4stem al5sten als5tou altaar5 al3tha al4t3ro alt4st a1lu a2lui al3uit al3u4r alu2s5 4am. a4m3ac am3adr ama4f 4amag am3art 5ambt ament4j ame4ran ame5tj a2meu am4i 4amm am3oli a2m3o4v 3ampè am2pl am4ple am4sm am4s3o am4spr ams5te. a2m3ui a3nad an3alg an4a3n an3arc 2anc 4anda anda4d and5ank an4d3e4d an4dex 2andj an4dom an5d4ri and5roo ands5lo an4d3ul a4nem a3nen anen3i 4aner an3est ane3us 4ang. an4gan anga5p ange5st ang5le an2gr ang5sna angs4te aniet3 anij4 3anima an5ion a4n5isl ani5t 4aniv 4ank. an4kaa anka4n an4k3as an2k3j an4klu ank3of an2k3r a1no an3och a4n3oor an3ork ano3s ano3t4 a4n3ou ano5v 4ans an3san ans3cr an4seg an4serv an4sid an2so4 ans5or ans3pi ans5pir an1st an4s5te. an5stru an4tac ante4n an3th 2anti ant5sl ant3w 4a1nu a5nuf an3ui an3ur an3uu anze5s 2a1o ao4g ao2l a4om a2op2 aor5t a3os aos3p aos5t 4ap. a1pa a4pak a4pas ap3as. ap3ass a1pe ap5eten 4a1pi apij4t5j ap3ijz ap1j 2apl ap3le ap3li ap3lo a1plu apon5 ap3oo apo3p apo5sta ap3o4v 1appa 4appen 4apr ap3ra a3pre a4prem a5p4ris ap3ru ap2sa ap4si ap2s3l ap3sn ap4ste. 2apt ap3tj 2apu a2q 4ar. a1ra araat5j a4r3app ara3s4 ar2da ard3ac ard3ak ardo4 ar4d3om ar4d3op ar4d3ov ar2d1r ar4dra ard3re ar4du ard3w a1re 5a2rea a3reg a3rem ar4en are4no are3sp a3rev ar3gh ar2gl a1ri arie4tj arij3s ar3ins ark2 ark3ac ar3k4l ar4map arm3u a1ro a2r3ob ar3oge a3rok aro4ko ar3oog a2r1o2p a3rot arpi4 ar2s ar5sch ar3scr ars2e ar5see ar3si ars3l ar4sla ars5m ar3sni ar4so ar4sp ar5spo ars3ta ars5tal ar4s5tek ar4str ar4su art4aa ar4t3ak ar4tan art5ank ar4tap ar3tar 4arte ar4tei ar2th ar5tij 4ar4tj art5jesv 4arto ar5tof art5o4ge art5oog ar4t3o4v ar2t3r ar4tro art5ru art4sl art5ste a3ru ar3ui 4arw arwe3s a1ry 4asa as3ad as4ag as3ak as1ap a2sc as5ce 2ase a4sec a4s3eg aser5a ase5tj aseve4 as5ha asis1 a4sj as5ja as3ji as3k as5ka as5ki as3l as4lu as3m as5mi as3n as4ne as4ni 4aso as3ob aso2l aso4r as1p as3pl a4s5q as5sa 4assm 3assu a2st 4as3ta a4sta. as5tag as4tas as4tat as3te a3stek a3stem as5ten as3tè asting5sp as1to as3tob ast3op 4astr ast5rem as5tro. as4tu a1t ataart5j at1ac at3ade at3af. at3ank ata3s 2atek a5tell ate2n ate3no aten4t5r ater5ad ater5sl at4eu 2atg at3hu ati5ni a2t3j at4je atjes5 at5jesb at5jesh at5jesm at5jesp 2atm 2atn a2too at3oog atos5f ato3st at3rac at3rei at3rib at4roe at5ru at4s3a2 at4s3ec atsi4 at4s3id at2s3l at4slo ats5m ats3n at4sne ats3pr at2st at4staa at4s5tak at4ste. at5sten at5stij ats5tol ats5top. ats5trek at4t3u4 a2t3ui at3w aua4 au3ch au3co au5de aud4j 1aug au3na aun3t aup2 aur4 au5re aure3u 4aus au3so au4s5p au3sto au3t4 4aut. 1auto auto3p 2auts3 auw3a 4auz a4ü avast4 ave3c avee4 ave4n3i aven5sp aver3a ave3re ave3r4u 4avi a2vo 1a4von a5voo a5vor 4avy 2a1w axis4 ay2a 4azif ä3h ämme3 ä3r 1b 4b. 3ba baar5ste baar5tj ba4da bad3ar ba4d3r bad3s ba3g4h ba3gl 5b2ak ba4k3o4 bak4sp ba3lan ba4lar bal3dw bale4 bal3ev ba3lië bal4kl ba3lo bals4 bal3sf ba4me ba5n2a ban4k3a ban4kl ban4k3o ban4kr bank3w ba3sa ba4st ba2tr ba3tro 4bb bbe4l5ag bbe4l5ee bbe2n bben3a 4b1c 4b1d4 b5de bdi5a 3b4e be1a be3as be2au be3ch be5dwe be5dwi be5dwo bee4 beet1 be5g beie4 bei3s bei5tj be5ki be3k4l be1kw be3lar be5l4as bel5dr be3le be4l3ec be4lex bel5f be3li be4l5int bel3k bel4o be3lo5v bel3sc bel3sp belt4 bemen4s be3nep be5n4o be5ot be1ra bere5s4 ber4g5af ber4g5et ber4gl ber4gr ber4i be1r4o bero5v be3ru be3ry be1s4 bes5ac be4sh be4sje be3so be5sp bes5s bes5te. bes5ten. be5stie bet2 be3t4h be5ton bet5ren be3tw be5twi be3und beur4s 4b3f 2b1g 4b3h 3b2i bid3s bi2du bie4li bi4en bie4t3j bij5d bij3f bij3g4 bij5k4 bij1p bij1s2 bik4a 5bil bi3lo bil3s2 bin4dr bin4st bin4t3j bi5ob bi3ok bi5om bi3oso bi5ow bir3 bi4st bis5troo bi1tr bit4se bit4s3p 4b1j 4b1k 3b4l blad5ij 2b5lap b5led bles3 ble5spe ble2t3 b5lid blijs4 blij5ste bli2k 4b5loi blok5l bloot5j blu2s 2b1m 4b1n b4o bo4d3ec body3 boe4g3a boe4kn boe4ko boes4 boe3st boet5st bo3f4l bo2k bok3an bokje5 bok4st bolk4 bo2m3a4 bo2m3o bo5na bond2 bond4s5 3bone bo3no bon4t3j bon4t5o4 boot3j boots5te. bo3p2 bor4sta borst5o bor4st5r bo4s bos3a bo5sco bo5si bo5so bos5p bos5to bot3j bo4to bot3r bot4sp bot4st bo2tu bou5ta bouw5s bo3v bove4 4b1p 3br4 braad5s bran4da bra5str brei5s4 brie4t brie5tje. bri4l bro2n bron3o4 bru2l 4b1s4 b2s5a b5sc b3si bsi3d bs5je b2s5la b2s5m bs5s b4stij 4bt4 b3ta b1tr bts5 3b4u buit4j bul4k bu4lu bune5t b5urb bu5ri bus5c bus3o but4a but3j bu2to but4s buts5te buur4tj 4bv 2b3w by3 4bz 4c. 1ca 3ca. ca3b ca1ch 5cada ca3do ca3dr cae3 ca3g2 cal4l3 ca3lo came5r ca3na cant4 ca2of ca1pr ca4pra ca5pri ca3ra car4u ca5se ca3s2p cas3t cas5tr ca3ta cate4n ca3t4h cau3 cau4st ca3v 2cb 4c1c cca3 cces5 c4d c5do 1ce 3ced cee4 3ceel 3cel cel3d celes5 ce5li cel5k ce4l3o 2ce3n4a 2cene ce3no 5cent cen4t3j ceo4 ce3ra cer2n ce5ro cer4t3r ce2s ce3s2a ce5sc ce3s2h ce3sta ce3s4ti cesu5r ce3ta ce4t3j ceto4 cet3og cet3oo 1cé c3g 4ch. 3chaï 5chao 3chas 1chau 5chauf 2chc 1chef 5chef. 5chefs 5chemi 5cheq che5ri che3ru 5ches che3us 1ché 5chir 4chn 2chp 5chromo 4cht 4chw 1chy 3ci ci5ab ci3am cie3k cier4s5 ci1eu 5cij 5cil ci5le cil3m 4cind ci3o ci5om 5cir ci3t2 ci5ta c3j c2k3a c4k3ed ck3ef cke5re c5k4et ck3id c2k3l ck4le c2k3n c2k3o4 c4k3r ck5se ck3so ck5st c3ky 1c4l cla2n cle3u 5clu 2c1n 1co co3ad co3d co4i coin5 co3k4 co3la 5com 5cond con1g 2co1no 5cons 3con5t4 2coo 2co1p2 3copa 4copi cor4dr co4rel co5ri cor2o 5corr cors4 co3ru co5sc co5se co5sp co3th co3tr 5coun 2cout co5v c3p4 1c4r2 3cras cre5d 2crip 3cris cro5f cro5k croo3 cro5v crus5 c3so c3sp c3ste 2c1t ct3act ct3ad ct5c ctee5t cte2n3 c2t1h c2t3j c4t3of c3tol c2t1on ct4or ct3rap c4t3re ct3sl ct3sp 1c2u cu5d4 cu3en cu3és cui5s cui2t cuit5e cu3k4 cula5p cu3ra 5cur3s cus3o c3w 1cy 1ç ça4o 4d. 1da 3da. 3daag d4aal d3aap daar5e 5daat 4dabo 2d3acc da4ce da5den 4dadr 3dae 2d1af 3dag da2g3a4 da3ge da4g3ed da4g3e4t da4g3on da4g3r dag4s3t da2gu 3dai da3ï da3ke da4ker 2dakk da4k1r 4dala d3alar d3alc da3le 4dalf da3li 2dalm da2l3u d4am dam4a da5mac d3a4mat d2a5me4 dames3 dam4pl 2da2na dan3as dank3l danoot5 dan4si dan4sm dan4s3p dan4st dans5ta 4d3antw 2d1ap 4d3a2pe 5dapu da2r3a d3arb 3dare 3dari dar4mo darm5on 3daro dar3s dar5st 3das3 5dasa da3stu 3d4at da3ta dat5j 4d5atl 4d5atm da2t3r 5daue 4d1aut 3dauw 2db dbei5 dbou4w5i 2d5c 4d3d4 ddags4 ddag5sp ddel5ev dde2n dden5a ddera4 dder5al ddere4 dder5ee dder5ep dder3o ddi3a d5dles d5do ddo3p 1de 3de. de2al de1ch d4e5den 5dedir de4dit dee4g3 dee4l deel3i 4d3een dee4r 4d3eff de3g 4d5eg. 4d5egg 2d5egy 2dei d3eie d3eig d3eil d1eis d3eiw 5dek de3ke dek3lu dek3w del4aa del5da del5dr del5eek 4d3e4lek 4delem de4lev 4d3e4lit del3k del2s del4s3e dels3i del4so 4d3e4mai 2demh 5demi dem5ond d2en. den4ac den5ate den3ei den3e4p den3ev 4d3engt den4k5of de4noc den3o4r den3sh den5str de3nu 5denvl de4o de5ofo de5ol deo4li deo3v de3rab de4r3ad der3a4g de3rak de3ram de3ran de3rap de3ras de4r5as. de4r5ass der2e der5ede der5egd de4r3ei de4r3em de5re4n de4rep de4ret de5rij de4r3im der3k4 der3on dero4r 4d3eros der4s3a der4s5om der5ste der5sto der5stra der5th 4d3erts der5tw de2r3u de3rup de2s de3sav des3m des3n des3p de3spe de5spel de4spl des5sm de3st des5tak de5stal de4s3te de4sti de5stic des5top de3t4 4d3e4tap de5tw deu4r3o4 de3us. deu4tj deve4 2dex 4d1exa 4dexp 3dè 2d1f 2d3g d4gaf dge3la dge2t dgeto4 dget5on dget5ov dge4tr dg4l 2d1h d5he dheer4 3d4hi. 1di di2a di5ae di4ak di4ano dia3s4 di4atr 5dich di4do die2f die4r3o di3esr die3st die2t diet3r di1eu 3dig di2ga dig5aa diges5 dijk3r di3jo 2d3ijz di2k3o4 5dil 2d3imp di5n2a 2d3ind 2dinf 3d4ing. 4d5ingel 4d3inj 4d3inko 2d5inr 2d3ins 4d3int dintel5 2d3inv 2d3inw 2d3inz di2o di5ofon di4ol di4one di4oni dio1s dio5sc 2d3i2ro 2d3irr 3di4s dis5ag di5se di5si dis4kr dis5p dis1t dis5tr di3th dit3j dit3r 5div 2d1j 2d3k2 4d3l d5le. dli4n dlot4s 2d1m 2d3n2 d5ne dni3s 1do 3do. do3a 2dobj 4d3obs 3d4oe 5doe. doe5d 4doef d5oefe 5doek 5doen 5doet 4d5oev 3doi d4ole 2do2li d4olin dolk5s 5dol5s 3d4om. 5domi do4m3o4 d3omr dom4sn 5domu d3omv 4domz 5don. d4ona 5done do5ni 5d4onn 5do3n4o do3nu do5ny 5donz 2dop do3pa d3opb d3opd do3pee 5dopj 4d1opl 3dopo d3ops d3opz 4d5org do4rië d3ork dors5m do3sp do3sta dot3j 5dou 2dov dover5s 3dovl 3dovo 2d3p dpren4 1dr4 3dra 5dra. d3raam d3raap d4rac d5race 5drach d3rad. d3rada 5draf 5d4rag d4rama d3rame 4d3rand 4drap 4dras 4d3raz 2dre 4d1rec d5reco d1red d2ree 4d3reek 4drend d4ress 4dret 3d2rev 5dreve d3ric dries4 5d2rif dri5ga d3rijd d3rijk d3rijm d3rijs 5d4rin 3dris 4d3rit 4d3roei d3roer 5d2rog 4d3rok d3roma d3rond 3droog 4droos 5drop 2drou 2d3ro5v 2droz drug4s d3ruim d3ruit 5d4ru4k 4d3rus 2ds d2s1a2 d4saa dsa4b d3sal ds4ate ds2ch d5schi dse2 ds3eco d4s3ed d4s5ee d4sef d4sei ds3eis ds3elf dse4li d5sen d4s3es d4set d2sh ds3ho d2s1i2 d4s5id dsig5a ds2im ds4ing ds5is d4s3j ds4jo ds5jon ds4l d1sla ds5las ds5lic d4s5lie ds5lim d3slin d2sm ds4mak d3smij ds5mo ds3n ds4ne ds5neu d3snu ds1o4 ds3ob ds3om d4son ds2oo ds3op d4spa d5span ds5pati d5spec d5s4pel d4s3pet d1spi d4s3pl d5spoe d5spok d5spor ds5s dst4 d1sta d5staat d4stab ds3tak d4s3tal ds4tan d3s4tat d5stav d3ste ds4te. d5stee d4stek ds4ter d4sterr d4stev ds3th d3s4ti d4stit d1sto ds5tram ds5trekk ds5ty d2su4 ds3ure ds3uu d1sy 2dt d1ta dtaart5j d1th d2tj d1to d1tr d1tu 1du 2duca 5due du3en du3et 5duid 5duif 5duik d3uil 2duit 4duit. d3uitd 5duite 4duitg d3uitv 5duiv du4n dun5i du2o du4ol 3durf 3durv 5du1s dut3j du5wen 2dv dvaat5 dvee3 dve5na dvies5 2dw d3wac d3was d3wat d1we 3d2wei d3wek d3wet d3wez d1wi 4d1wo d3wor d3wr 1dy 4d3yo dy4sp dy2s4t 2dz 4e. 4ea e3aa e1ab ea3bo e3ac ea4ca eac5t e1ad ea3da e5adem ea3do ead3s2 ead5sh e1af e1ag e3ai ea4k3o4 e1al ea3la e3ali e4als ea5mi e3an e4an. eang3 ean4s e5ap ea3pr e3aq e1ar ear2c e1as e2asc ea5s4e ease5t ea3so e1at e4at. eat3s eau3s4t e1av e3bo ebots5te. e5br 3ecd e3ce e1che e1chi echt5ec echts5o e3chu 4eck ec5le 4ecor 4ect ec3ta ec4taa 3ecz e1d ed4ag e3dam e3d4an e4d4as ede3a ed3ei. ede5le edem4 ede5nac ede5o ed4er e4d5erns ede5rog edi3al edi3am e5die 4edir edoe5tj e3d4oo ed3opv edors5te ed3ov e3d2r ed3rod ed3rol ed1s ed5se ed2sl ed4so ed5sp ed3su ed3uit e4d2w e5dwan e4e eea4 ee5b ee5ca ee5che ee2d3a eed4ac eed5as ee5de ee5do eed3ru eed3si eed3w ee2f ee3fa eef3ac ee3fi eef3l eef3r ee4gap eeg3l ee3i ee2k ee3ka ee5kaa eek3ak eek5all eek1e ee5ket ee3ki ee3kl ee4k3lo eek3n eek3re ee3kri eek3ro eek5st eek3w ee2l eel3a ee3lad eel4as. eel5d4u ee3le eel4ee ee3li ee5lij eel5k4 ee3lob eel3og eelo4ge ee3lu4 eel3ur eel3uu 4eem eema4 ee2n een3a eena4r een3e2 een5g ee3ni een5ie een5k ee5o2 ee2pa eep3an ee3pl eepo4 ee4p3re eep3ru ee2r eer1a eer3aa ee4rad eera4l ee3ram ee3ran ee3re ee4ree ee5rei ee4r3i ee5ric eer5k eer3og eer5oom ee3rot eer5ston eer5str ee2s3 ee5sch ee4s5em ees5et ee3sj ees5lo ee3sn ee3s4p ees5pl ees5pot ees5ten ee3stu ee2t eet5aa ee3tal ee3tan ee5te eet5h ee3tj eetna4 ee3to eet3og eeto4ge eet3oo eeto4r ee3tr ee4tro eet5rok eet3sp eet5ste ee5v ee5z eën3 e5ër ef3ad efa4z efde5l ef3do ef3ei e5fer 4efi efie4t efiet5j ef3ins e3fis5 e1fl ef3li ef3loo e3flu ef3om e3foo ef3op e1fr ef3rij e5fron ef3sf 4e1g egas4 eg3as. ega5sk eg3ebb e4ge4c eg3eig egel5ei. ege4l5ov ege4net egen5of ege4ra eger5eng ege4ro eger5on e3g4i eg3ijz egip4 egiste4 e2gl e4go. eg3org e2gos eg3oud e5graf eg3s4 eg5sle eg5so e2g3u4r egut4 e4g3uu e1h4 e5ha eheis5 ehit4 e2i ei5a 4eid ei3do eid4sc ei1e 4eien eien5s eie5re ei3f4 ei3gl 4eign e3ij eik4l ei3kn ei5kr eiks4 4eil. eil5ant 4eild4 eil5dr 4eile ei4lev eil5m ei2l3o ei4n3ab ei3n4ac ein4do eind5oo ein4d3r ein5gr ein5k ei2no ein5sl ei3o ei2sa ei5sha ei3s4la ei3slo eis4p ei3s4ta 4eit2 ei4too eit4s3 eits5c eits5n eits5te. eit5sten eits5tr eive4 4eiz e1j2 e3je ek3aan ekaart5j ekaat4 ek3af. e4k3a4g ek3al. ek3alt e5kam ek3ang ek4ee ek1ei e3kem e5ker. e5kers ekes3 ekes4t ekes5tr e3ket ek5eter e5kic e4kil e5kis ekla4m eklam5a ek3lev e5klim ek5loos ek4ni e3ko e4k3ob e5kof ek3oli ek3opz e5kor ek5os. ek5oss e5kran ek3roz eks4e eks5erv ek5set ek4str eks5tra ek5t4e ek3to eku4 ek3uit ek3ur ek1uu ekwet5ste ek3win e1la el3aan el5aand el1ac el4ade el3adj el3adm el3adr el3adv el1a4f el1al e3lan el5ana e3lap e5lap. e4lapp el3arb el3arc el3arm el3art e4l3as. el3asi e4l3asp e4l3ass el1au e4laut e3laz el5azi el4dec el4dr el4du e1le e3le. el3eeu el5eff e5leid el5eier el3eig el3ei5s e4lel 3e2lem el3emp e5l4en e3ler ele5r4a eler4s el3erv e3les eles4t e4l3eta ele4tr e4l3etu el3exc e3lé elfi4d el1fl elf3s4 el3gu 2eli e5lie e5lig eli5kw el3imp e4l3ind e3ling e4l5inkt el5inz 3elix el4kee elk3s el4k3u4r el4kw 4e1lo e5loep el3oes e3lok el3ol el3oms el5ond el5ont e3loo e5lood e5loos el3ops el5opt el5opv el3o2r el5org elot4j e5lou el3o4ve e5loz elp4o el4ps el4s5em el4s3k el5smed el5twe 4e1lu el3uit eluks5 2ema e4mana ema3sc ema5to emees5 emens5te emer4s emes3 emie4tj e5mok em3oli em3op em3org emor5sten e4mo4v em3sa em5sc em4sli em4sm em1st em3su em3uit emut4 en3aap e3naar e4n3aas en1ac e5n4acc en5af e2n1ak e2nal en3al. en3als en3amb en4ame e2nan e4n3ang en1a2p e5nari en3ars e2n3a2s enas3p e3nat ena4tel e4n3att en1av e2n3a2z enci4 3ency. en3da en5daa end5ama 5enderti en3d4o en3dr en5drek e2n3e2c enede4 e3nee en3eed enee5t en5eg. en5egg en3ela en3elf en3ema e4n3en5t e2ne2p en3epo e5nere 5energ e4nerv en3eta en3ete ene4ten e3neu 4enf en5ga en3gl en4g5le eng4r en5gri engs4 eng5se eng3sm e3nie e5nijd e2n3im e4ninga e4n3ink e3niv e4n3i4vo en3k2a e4n3och en3off e4n3oli e2n1on e4n3oor enoot5 e2n1o2p e3nor. en3ord eno3s en3ou e2n1ov 3enq en5sce en4sei ens5ein ensek5 3ensem ens4fe en4sin en5slak en4s3on en1s2p ens5pot en5stan en5sten enst5ijv en4stin en4stu4r en3su en4tac en5tee en5tei ente5re en4terv 3entè en1t2h en5tom ent4r en3tre ent5rol ent4sl ents3m ent4s3p en3tw e1nu e4n1ui e2nun en3ur en3uu 5envelo eny4 e3o eo3d eodo3 e5oe eoes3 e5off eo3fr e4o3k4 e5on eo5ni e5oo eo3pa eo3pe eo3pl eop4la eo3p2r e5ops eor5d e5org e5ori eo3ro eo3s4 eo5st e4ot eo5te e5o3t4h e1pa e3paa ep3aak ep3ac e4paf epa4k ep5ake e3pal e3pap e4p3app e3par ep3asp e1pe e5pe. ep5een e5per epers5te. e1pi 3epid ep3ijs ep3ijz ep5ingr ep3ins epit4s epits5te ep1j e1pl ep3led e4p3lod e5ploe ep3lus e1po e4p5o4ge epoort5j epoot4j 3e4pos. e3pot epou4 e1pr ep4ra e3pri ep5rode eprot4 ep2s ep4s5ee ep4ser eps3l eps5n eps3p eps3ta eps5taa eps5tal eps5to eps3tr eps5tro ep4tak ep2tj ep4tr ept3ra ep5tro ep3uit 4equa e3ra. e1raa e5raad e4raak. er3aan er5aanp e4raap. e5raat e4r1ac e5rac. e5race e5raco e3rad e5rad. er3ado er3af e3raff era4gen e1rai e4r3all er3ama er3ana e5randa e5rane e5ra3pl er3arc e3rare e3rari e1rat4 er3a4tr er3azi er3d2a er3d4i erd4o er3d2r erd5uit. er3d4w e1re er5eat 4erec er5editi er3een e5reep er5eers er3eet er3ef er5eff er5eg. er3egd er5egg er5egt er3eie er3eig er3eil er5eind ere3kl er3elk e4r3emm er3emp e3rend e5rendel ere4ne eren5eg er5enen. e3renm e3rent er5enth e5rento eren5tw ere2o ere4og er3epi er3e2q er3eri e3res. er3esk e3ress ere4st ere4t3j er3etn e4r3ets e4r5ex erg2l e3ri eri5ab e5rif e5rig erig5a er3ijl er3ijs e4rijs. er3ijv e4r3ijz e5rik er5ind e4r3ini er5inkt er3ins er3int e5rio e5ris erkeers5 er2kn er3m4i er5mo er5nu e1ro. e3rob er3oc e4r3oed er3oef e5roep eroe5tj er3oev er3of ero2g e3rok e1ro2l e5rol. er3oli e5roll er3om er1on e3ron. e3rone er3onv er3oog er3oor e5roos e4r3op erop3a ero5pen e2r3or er1ov er3oxi e3roz e3rö er4plu errie5tj er3scr er3sj er5slag er5span ers4pot er5stem er5te er3t2h er5t4i er5t4o er3tr ert5se erts5l er3t4u er3t4w e1ru e3rub e3rug5 e2rui er3uit erui5t4j e2run e3runs e4r3ur e3rus er5uu 3ervar 3erwt e4saf e4s3a2g e3sam e5san es3ap es3arr e3sa3s e3scop e3s2cr es4e e5sec es5een e5sel es5ene e4s5eng es5ex es2fe es5he e4shi e3sid e3sie es1in e4sir es5je. es5jes e3s4jo es5jon e4s3ka es5kr e3sl es4la e5sla. e5slag es3lak es5lat es4le es5leg es2m es4mui e5smuil. e1sn e3s4ne e1so e3sol es4oo es5oor. eso4p es3ore e1sp es5pas es4pel espit5ste e3spl e4sprie esp5riem es4sm e3stak e3s4tal e3stap es4tar es5tatie e4s3te. es4tea es4teel est5ei. e4steka es5tekam e3s4tem es5temo es3ten e4sten. es5tenb es3ter estere5o es5tes es4tet e3steu es4tic e4stie e3stot es5tra. es5trac es5trak e5stral est5rap es5trei est4sc es4tur e3sty e3su esu4r e3sy e1ta e3ta. et3aan et3ac et3ad et3afz 3e2tag e3tak e5tak. et4ana e5tand e2tap e4tapp e5tat e4tau e2tav e3te e5tea et3edi e5tek 4etel e5tel. e4t5elf e5tels et5emb et5emm etens5u eten5tj ete5r4a ete3ro eters5la eter5sm e5tes e1th et3ha et3hor et5hu e4t5i4d e5tie e4t3inc e4tiq e5tis e4tja e1to e5toc e3toe e5toev e3tol eto4p et3ope et3opl e4t3ork eto3sf e1tr et3rec e4t5res e3troe e5tron e5troo etros4 e4t3ru et4sl ets5lap et5slu ets3n et4s3oo et3spe ets3pr et3spu et4ste ets5tek et5sten et5sti ets4u et5su5r et5suu e1tu etui5tj etu4r et3we et2wi 1eua4 1euc eudi5o eu5dr eu3e eugd3r eu3g2r eu4ler eu4li e1um e3um. e2umd eu2na eun3t 1eu1o eu2po eu4rad eu4rec eu3ren eu4res eu4rij eur5k euro5v eur4sta eurs5taa eurs5te. eur4s5tr eur4su eu5sch eus4p eu3spa eu4st eu5str eu3tj eu1tr e3uu 2euw eu4wa eu5win euw4str evaar5tj eval4s evari5 eve4lo evel5op eve5n4aa 4ever eve3ra 4e1w e5wa e5we ewen4s ewens5te. ewest5r ew2h e5wi ewo3v 4ex. 2ex3aa ex3af 4exco 3exeg 3exem 4exi ex3in ex5op 1exp e3y4o eys4 ey3st e5za e3zee 4e3zen ezers5 e3zo ezz4 é3a é1d édee4 édi3 é1g égee5 é3h é3j é3n é3p é3r é1t è1 4èc è2l è2s è5t èta5 ê1 ê2p ê3per ê5t 3ë 4ë. ë2b ë3c ë3d ëe2 ëen3 ë3j ë1l 5ën ënce3 ën4e ëns2 ën5sc ënt2 ën5th ën5tw ë3p ë1ra ë1re ë1ri ë1ro ëro1g2 ëro3s ë2s ë3si ës3t ë1t ët4s ëts3te ëve5 ëven4 4ëzu 4f. 1fa f3aanb f4aat 3fab fa2bo f3acc face4 f1ach 2fad 2f1af fa3g fal3s fa3m f3ang fant2 fan4t3j fant4s5 2f3a2p f4arm 3fa5se fa2to fa3v 4fb fbe5dw f1c 4fd f3da fda4g f5dan fd1ar fde4k fdek3l fde4s3 fdes5e fdes5l fde5sm fdes5t f2d3in fd3of fdors5te fd4ra f3d4ru fd5se fd3si fd3so fd3sp f4d2w fd3wo 1fe fe2a fec4tr fede3 fe4del f3een 5fees feest5r fel5dr fe4l3ee 3feli fe4lom fe4l3op fel3sp fe3no f4er fe3rab fe3ran fe4r3et fe3rom fe3ron 3fes3 fe4t3j fetu5r 2f3ex 1fé 3fè 3fê 4f1f f5fe f5fi ffs2 ff3sh ff3si f3fu f3g2 fge3 fge5r4 fge5t 4f5h 1fi fi5ac fi4al fi3am fi3apa fi3apo fia4s 3fib fi1ch 5fie 5fig f3ijs 2f1ijz fik4st 3f2il fil4m3a film5on fi3lo 4find 3fini f3inj 4fink 2finr fi3o fi4r fi4s fi5se f5iso f1j fjes5 4f1k4 f3ke f2l2 4f3laa f1laf f4lam f3lei flen4st flens5te. f4les fle2t flet3j 4flev f4lex f3lez 2flie 2flij f4lik f4lip f4lit f3lok 3f4lor flu4t3 4f1m f1n 1fo 3fob 5foc foe5d foe5ta 2f3of 5fok 2foms fo5na fond5en fonds5l fon5eng fo1no 4font fon5te foo4 fooi5 f3oom 5foon 2fo4p fop5s4 f4or 3fo5re fo5ri 5form for4t3j fo1ru fo3t 2f3oud 4f1ov 3fö 4f5p4 fpers5te. fpits5te. fr4 f4raak. fraam5 5frac f3rad f2ras 5frau f1rec f3rek 5freq frie4s frie4t friet5j f4rik f4rod 4f3rol f4rolo f3roma frus3 4f1s f2sa4 fs3ad fs3an fs3ar f3sc f5sch f4scr fse2 f4s3ec f4s5ee f4sei f4s3eth fs4fe f2sh fs5he f2si f3sie fs3im fs1in f5slaa f5slac f5slag fs3lap fs2m fs3ma fs4mi fs3mo fs3mu f2s1o4 fs3ob fs3om fs4oo fs2p fs4pre fs4t fst3as f3ste fs5tec f5stell fste4m3 f4sterr f3sti f5stif f3sto f4st3oc f4ston f3str f3stu f3sy 4ft f1ta ft1ac fta4kl fta4p ft3art fter5sh ft3h f1to f5tond f4tont f1tr ft2s3l ft4sm fts3n ft4so fts3p f1tu ftu4r 1fu 2fuit fu4ma fum3ac 3f2un fur4o 3fus 2fuu 4fv fva2 fval3 4f1w4 3fy1 2fz fzet5 4g. 1ga 3ga. gaar5tj g4aat 2g1ac 4g3adm g4af. g3afd ga3fr 4g3afs 4g3afw 2g3a4h 4gal. ga3la ga4l3ap ga5ler gal3s 4gamb g4a3mi 3gan gan5d 5gane gan4s5t ga3pl 3gar. 4g3arb ga3re g1arm 3gars 2g3art gar5tj ga4s gas5c gas3i ga5sla. ga3sli ga5slo gas3o gas3p gas3tr gas5tra gast5rol 3gat gat5j gat3s 4gaut ga5ve g1avo 2g5b 2g1c 4gd g5dac g5dag gd3art gd3at gd5ate g3de g4d3elf g5der. gd3erv g4d3id gd3im g2din g3dr g5dru gd3sa gd5sp g3du 1ge 3ge. ge3a gea3dr gea5na gea3q ge4ari ge5au 4g3eb. 2gebb ge3c ge3d4 gedi3a ge4dit ge5dr ge5dw 3gee4 geest5r geet3a ge3f4 2g3eff ge5g4 gege4s 4geig 2g3eik gei4l5a 5geit geit3j ge3k4a ge3ke ge5ki ge5k4l ge3kr gek4st gek4u ge3k4w ge3lau gel4d3a4 ge3l4e 4ge4lem gel5f gel5k 5ge3l4o gel5si gel3sl gel3sp gel5ste ge5ma 4gemb 4g3emf ge5mo 2g3emp gems3 ge3m4u g4en. ge3nak gen4az 3ge3ne ge4n3ed ge4nend 4g3engt 3geni gen5k ge1no ge4n4of ge4nog gen5sfe gen5ston gen5stu genstu5r 5genw ge5om geo5pe georke5 ge5os ge5ot ge5p4 ge1ra ger5aal ger5aap. ge4r3a4l gera4p ger5ape ger5as. ge5reg ge3rem ge5ren. ger4i ger5ini ge1r2o ger4of ge5rol ger5slan ger4sli gers5lij ger4sp 4g3erts ge3r4u 3ge1s4 ge3sa ge3sc ge5se ge3si 4ge3sk ge5sl ge3sn ge3so ge5spend ge5sper ge5spo ge5stan ges5te. ges5ten. ge3str ge5sw ge3ta get4aa ge5tam ge2th ge5t4i ge3t4j get4o ge3tr ge5tra ge5tro ge5tru ge5tsj ge5tu ge5t4w ge3ui 5g4ev 4gex 5g4ez 1gé gédi4 3gè 4g1f gfijn5ste 4g3g4 g5ge gge3la gge4r5on gges5ti g4g5h g5gi ggings5 g5gl 2g1h g2het ght4 gh5te g2hum 1gi gids5te gie5ra gier4s gi1eu gi2f gif5r gi3ga 5gigere 5gigste 2gij g3ijs 4gijz gi2m gi3na 4g3inb 4g3inf g5infe g5infr 5ging 2g3inh gin3o 2ginr gi4oc gi2od gi4onet gi2or gip4st 5gir 3gis 4g1j 4g1k gl4 g5lab 3glai 1gla4s glas3e g5lat 3g4laz 3gle. g5leer glee5t g3len 2g5lep 4g5ler g3les 3gle4t glet3j g5lev g5lice g5lich 3glië g2lif g5lijs g2lim 3g4lio g2lob 3glof g5log 3glom 4g3lon g3loon g3lop 3g2los g5loz 3g2ly 4g1m gmaat5j 2g1n g3na gn4e gne5g gne5m gne4t3j gnie4tj 4gnu 1go 3go. 3go2a 3gob 2goc g1och go4d3a god4s3 gods5t 4goef goe1r 2gof go3f2r g4og 4goh go2k 5gom. go2ma g3oml 4gomz go4n3az 2g3ong go5no 2g1ont g2oo 2g3oor 3goot 2g1op go3pa g4opr g4ora 4go4re go5re. 5g4ori gor2s gos1 go3tr gou4d5ee 2g3ov 2g5p gpes3 1gr4 3gra 5gra. graat5j g5rak gra2m g4ram. gram3a g3ramp gra4s3 5grav 2g3rec 2g3red 5gredi g5redu g3reek g3reel g4reep g3reis 4g3rek 2g3rem gren4s gre4s g4reu g3rev 5gria grie4t5j g5rijd g5rijk g5rijm g5ring 5g4ris grit5s 2g3riv groet5j grof5 g3rok g3rook g3room groot5j 2grou gro5v 2g3rug g3ruim g3rup 4gs gs1a2 gsa4g gs5alar gs3alt g2sc gse4 gs3eco g4s3ed gs5een gs3ei gs3en gs5ene gs3erv gs3et gs3ev gs5he g2s1i2 g3sie gs5is gs1j g3s4ke. gs3l gs4la gs5laag gs5lam gs5las gs1le g3slep g4sleu gs5lie gs4lin g5sling gs4lo gs5log gs5lok gs5lon gs4lu g4s5ma gs3n g4sna g3snij g4s1o4 g5sol g5som. gs5ons gs3op gs3p gs5pand g3spec g3s4pel g3s4pet gs4pi g3spie g3spil g5spin. g5spinn gs5pir gs5pol g3s4pon gs5ps gs5q gs5sc gst2a gs5taal gst5aang gs5tac g5stad g5s4tan g4st3ap g5stat g1ste g5s4te. g5sted g5stee g3stei gs3tek g5stel g3sten g3ster g5ster. gs5terr g5sters gs3th g5s4tic g3s4tig gs5tijg g5stof g5stop g5stor gst3o4v g4s3tra gs5trad gs5trak gst5ram gs5trap g5strat gst5res gs5troe gs5tron g4stru g5struc g3stu gs5ty g2s1u4 gsver3 gs5w g5sy 4gt g1ta g2t3ap g3te gte3ro gtes4 gte3st g1to g3tr g1tu 1gu 5gu. 3gue gu4eu 2guit gu4ni gu2s3 gut4st guts5te. 4gv g5vo 4g1w g5wa 1gy 4gyp 2gz 4h. haams5ta haar5sl haar5sp haars5te haar5tj haats5te. h3afd haf4t3u ha3g ha5ge hal2f1 5hals hal4sto 5halz 2hamp 4han. han4dr hand5sl han3ga hang5l hang5s han4s3l han3so han4st hap2s hap4se har4ta harte5l hart3j har4t3o4 har5tre hart5sl hat5j ha2t3r hat3s ha3v 4have. 4hb 2hd h4e 2hea he2ar 3hech he3co 4hee. hee3g4 hee4k heek3a heek5l hee4l3o heep4s heeps5c heers5tak hee5sto hee5tjes he2f he4i heids5p heis4 hei5tj he2k3a he2kl hek4st heks5te. hek5sten hek3w he3le he4l3ee he3li hel4m3a helo4 hel4p3a hel3sm he5mo he5ne hen4kr he3n4o 4he5o he4pij he2p3l he2pr he1ra her4aa he4r3ad he3r4au he4r3i herm5eng he3ros hero5v her4p5aa 3herst hert4 herts5te he2ru he5se he2sp he2s5t hets5te. heu5le 2h3f 4h5g h3h hi5d hie4f3 hielsges5 hie4r3 hie5ren hier5u hie4t5o hie4tr hiet5s hij4sl hik4s5 hi3kw hil3m him4pl him4pr hin5d h3ins hin4t3j hi2p5l 2hir2 his5p hi3tr hit4st hits5te. hit5sten h3j 2hl h3la h4lag h3lep h3loc 2h2m h3ma h3me h4mer h1n h2na hno3 2ho. ho3a hoa3n hoboot4 ho3ch hoe4ker hoe4s hoes5l hoe3t ho2f hof5d hof3e ho3g2 ho2ka ho5mo hon3dr hond4s hon3g honi4 ho1no hool3e 4hoom hoort4 hoor5tr 2hoot ho3pa ho1pe ho2p3o hop3r hop4str hor5de 5horl ho3ro hor4st hors5te. hor5sten hor4t3j ho3ru ho3sa hot3j ho3tr ho4t3re hot4st hots5te. ho3v 2ho4w how3o 2h1p hpi4 2hr hra4b h4re h5rea hri4 hro2k hrok3o hroot3 4hs h3sa h3sp h3st 2ht h4t1a2 ht3ac h3tal ht3ala h5tans h3te. h4t3ec ht4eco h2t3ee h2t3ef h2t3ei ht5em h3ten h4ten5t ht5entw hter3a hte4r5o h4t3esk h4tev ht5eve h5tevo ht3ex h2t5h h4t3int h2t1j ht1o4 ht5oef ht5op h4t1r ht5roo ht4sap htse4 ht4ser ht2si ht4sl ht5sla ht5slot ht3sme ht5smij ht4s3o ht3spe hts3pl ht3spr hts5taal ht4s5tak ht4s5tek ht4sti hts5tore hts5trekk ht1u2 ht3w hu4ba 3huiz hul4der hur4t5 hut3j huts5te. huur5s 4h1w hy4la 3hyp hypo1 4i. i1a i3aa i4ab i5abi i4ac i3ady i3ae i5ae. i2a3f4 i2a3g2 i3agr i3ai i5ak. i3ake4 ia4kem ia3kl ia3kr i3al. i4a3la i3ali i2am i5am. i3ami i3an ian4o ia3o i2a1p4 ia5pa i5api ia3sc ia5se ia3so ia4s5po ia3sta i3at ia3t2h i5atri iave4 i5ble iboot4 4ic i3ce 5i4cepa i1cha i1che ichee4t i1chi i1cho i3chr ick5l icos4 ic4t3op ict4s5c i3dam idde4r5a ide3a i4dee. ider4sp ider4st ides4 idi3a idi5ab i2di5o id4mak i3dok i2dr id3ran id3ru id2s1 id4s3a id4ser ids5i ids5j ids5l id4sm ids5ma id5s4mee id4s3o ids3ta ids5tak ids5tek id4stem id4sti ids5tr id3u4r id3uu idu3w id3w 4ie ie1a2 ie4d3ac ie3de ie4dro ied3w i1ee4 ieë2 ie3fi ie2fl ie3fle ie3fon ie4fr ie4gas ie3ge ie4g5ins i2ek iek3e4v ie4kl iek3li ie5klu ie2kn iek5ond iek4s5n iek4sp ie2ku ie3kwa ie5lan ie5lap iel5do iel5d4r iel4e iel5ei. iel5k iel3sc ie3ma iem3ov ien4dr ien3ij i3enn i5enne. ien3s4m ien5sp ien4sta ien4st5o ien4str ienst5ur ieo4 i4ep ie5pen iepiet5 iep5oog iepou5 iep5rel iepro4s iep3s4 iep5st iep5tr ie4pui ie5r4ad ier3a4l ie3ram ie3rap ier3as ie4rat ier5el. ier5els ie5ren. ie5ring ierk4 ie3r2o ie4rof ier4sl ier5slu ie3ru ier4ui ie3sf ie2si ie4sl ie5sle ies3li ies3m ie2s3n ie2so4 ie4s3pl ie3sta ies5te. ie5stel ies5tere ie3sto ie4taa ie5tal iet5ant ie5ten ie3tj ie3to4 ie4t3og ie4too ie4top ie4tor ieto5re ie4t3ov ie5troe iets5te. iet3ur iet3uu ie3twi i3ety ie2u ieu3k i1eur ieu5r4e i1eus ieu3sp i1euz ie3v ie3z iezel5a i3és i1ét i1è i4ëg i4ëva 4if if3aa if3ad if3l if3r if4ra if4taa if4tar if4tre iftu5r if3ui ig4a ig3aa ig5ac i5gal i4g5av i3ge ige2s ig3esk ig3ij i4gind igi3o ig5no i3g4om ig4op igs4 ig3sk ig3sl ig3sp ig3sto ig3un i1h i3i i5ie ii2n i5is i2j 4ij. ij5a ija4d 4ijd 4ije ij3ef ij3ei ij3el ij5e4n3 ij1er ij3i 4ijn ij3o4 i3jou 4ijso 4ijsp 4ijst ij5te ij4tr ij5u 4ijvo 4ijzo 4ik ik3aar i4kam i3ke ik3ef ike4ra iket3 i2kij i3kl ik3la i4k3lo i4k3lu i2k4n i4k5na ik5o2g i3kom i2koo iko2p ik3ope ik3ord i4kr ik3re ik3ri ik3ro ik5se ik5si ik3s4l iks3n ik3sno ik3sp ik4spa ik1st ik5sta iks5te. ik1w ik5war i1la i3la. il4aa il5aan il3ac il4act il3ad il3af i3lak il3al i5land il2da il4d3r ilds4 4i3le il3een ile3l i4l3erv ile4t ilet5r ile3u il3e4ve ilevin4 i4l3e2z i3lé il5f i3li ilie5g ilie5t il3ink ilk4l ilk3s2 illa3s 1illu il2m ilme2 il4min il4mo i1lo ilo4ge il3ond i3loo i5loon il3oor il1or ilo4re ilo4ve il3s2h ils5j il4sti il2th i1lu 4im. i2mag i4mago im5au imee4 im3een i4m3em im3enc im3ex 4imf i2m3of im3op im3org im5pa im4s3oo im1st i3mu in1ac i2nau ind4aa in4dene ind3sc ind5ste 1indu in3e4de in3edi in3eed inek4 ineo2 inet4s i5neu 1inf in2ga4 ing3aa ing3ag ing3al 3ingan ing5lo in2go in4gr ing4st 4ini. i3nie ini5on ini5sl ini5sta 4inkj in2kn 3inkom in4kri 3inno i1no i3noc i3nod in4o2g in1on ino5pe ino3s4t in3ov 1inri 4ins. in5sch in5se in3sl in3smi in3so in1sp in5spo in5sten in5swi in4t3ap in5te intes5 in3th 1int4r i1nu inuut3 4i1o io5a ioas5 io5b i3o1c i3ode ioes3 io3f io3g2 i3ol i5ol. i5olen i5olus i3on ioneel4 i5ong ion4s3 ions5c i5oo i2op4 io3pa io3pr i3opt io3ra i3ori io3ru io4s i3os. ios3c i3o5se i3o5sf io5sh io5si i5osi. io5so io5sp io5s4t i5o5su i3osy i5othek i3oti iot3j i5otorens io3tr i2o3v i3ox i2oz i1pa i2p1ac ip3af i3pap i1pe i4perw ipe4t3j i1pi ip1j i1pl ip3lu i1po ipo4g i1pr i2pri ip3ru i4ps ipse4 ip4si ip4sle ips5te. ip5sten i3ra ira3k i1r2e ires4 ire3st i3ré i1ri irk4s i1ro iro3p iro5v ir2s ir4sc ir3sp ir5ste irt3r i1ru 4is i1sa i2saa i4s3ad is3a2g is3ap i2s1ar i2s3as i4sc i5scha i5schr is5col i5scoo i5scope ise2d i4s3ei is3ell is5eng i4s3erv ise3st iset3j is4fee is4fer i4sh is5ho isi2d i2sij i2s3im is3ja i4sk is3ka is3ke is3l is5lag is5las is5le i4s5m i4s3n is5ned is5nij is5no 5isol i4soo is4oor iso3s i2sot is3ott is3p is5pas is2pi is5pl is5q is5sa is5so i2s3t is1ta i3stak ist3ap i4s5tas is4tat is5terd is5tere is4th is1to ist5ong i3str is5tri i5stro. i3sty isu2m i5sy 4it i1ta it3ac ita5d it3een i3ten i3ter ite5rei ites4 ite3st ite4t it3hie it1ho it1hu it2i itie5st i4tj i1to it5oef it3oog i3t2ou i4to4v itper5st it3red it1ru it3sje it3sli it3sop it1sp its4te it4ste. it4too i3tu it3w 4i3u2 iu4m ium3a4 ium3e ium3o iu3r i3ve iven5s ive3re i5w iwi2 iwie2 iwit3 4iz i3ze ize3t î3 ît4 1ï 2ï. ï5a ï1c ï1d ïe4n3 ïe5nen. ï2n3a ïns5m ïn3sp ïn3u ï3n4ur ï3o ï3ri ï3ro 4ïs. ïs3a ï4sc ï5sche ïs3l ï3so ïs3t ï1t ï5z 4j. 1jaar jaar5tj ja3b 2jaf 1jag jagers5 ja3kn ja3mi jan4s3l jan4st ja3pl ja1po 1jar jare4 1jas3 jas5p 3jaw jaz4 j3b jba4l jbe4l3i j1c jda2 j2d3aa jd3an j4d3ar j2d3ee jde4n3e jden4s jdens5p j4d3erv jdes4 jde3sp jde5st jdi3a j2do4 j3dom jd5on jd3op j3dr j4d3re j4d1ri j4d3ro j4d3ru jd5sei jd3spo jd1st j2d3u jd3w j3d4wan jea4 3jeba je3ch jec4ta 2j1ee jel4 je3la j1en je2na2 je3n4o 5jep jepiet5 je3ro jers4 jer3sp je4s3 3jesa 5jesal je5sch 3jeskn jes5l jes5m jeso2 jes5pa jes4pr 3jesr jes5tr 5jesvo 3jeswa 3jeswi je2t jet3er jeto4v jet5st 5jeu 3jevr 2jew j3ex j2f1a j2f3ei j2f1en5 j4f3ij jf3ink jf3l j3f4lat jf5le j2f3o4 jf3r j3f4ra j3f4ro jf2s jfs3a jf4sc jf4s3er jfs5f jfs3l jfs5m jfs3n jfs3p jfs5pa jf3st jf4sta jfs5tak jf5stan jf4stel jf4sti jf4s5to jft2 jf5ti jf5tw j1g j3ge jger5sl j2g3l jg4s5e jg3sn jg2st jg3s4te j3h jif3 j3ig jin3g ji5t2j j3j 2jk j3ka j4kaa jk5aard j4kar jk3arb j4kau j4kav j2kij j2k4l j3klaa jk5lak jk5lap jk5las j4kle j5kled jk5les jk5li j3klon jk5lop jk5luc j2kna j2k3of j4k3o4l j2k3on j2ko4p jk3opb jk3ope jk3opl j3kops j2kr j4kra jk3raa j5kran jk3re jk3ro j4k5ru jk3slo jks3pl jk4sta jks5taak jks5taal jks5tak jk5stan j2k3ui jk3w j3k4was j1la j3laa jl5ana j1le j2l3ef j2l3el jl5f jl3ink j1lo j2loe j3lu j2m3af j5m4ar j3mi jm3op jm3s j2n1a4 j4naa jn5ac j3na5g jn3ak jn2am jna5me j3n4an jn5d2r j2nef jne4n j4n3erk j4n3erv jn3gl j4n3im j4n3ink jn3k4 j2n1o4 jn4si jn2s3l jns5lac jn3slu jns5or jn2sp jns3pl jn1st jn4ste. jnt4 jn3tr joet3 4joi jol4e jo5lij j3om 1j4on jone2 j3op jo3pe jo3ra jo3ru j4ou 1jour jou5re joy3 j3pa j4p3ac jp3arm j1pe j2p3em jp3ij j1pin j3pio jp1j j1pla jp3li j1po j2p3or j4pre jp3ri jp3rok jps4 j3r jraads5 2js js1a j4sef j4s3ela j5seli j4s5em j4s3e4r j2s1i js5in js4ir js4le js3lee js3li js5lie js4me js5mel js5met js3n j4s1o4 j5soe js3ol js3pac js3par j3spe js3pl j4spo js3poo jspoort5j j5spor j1sta j4star j2s3te j3stee j3s4tek j3s4tel j5s4teng js3th js4tij j5stond j4stoo js3tou jst5ran j5strok j2su j3sy j3taal jt3aar jt1ac j1tag j3tak j3tan j3te. jt1h j3toe jt3opt j3tr jt3ra j5tred j5tree jt3rei j5trek jt3ri j5trok jt3rot jt1s j1tu 1j4u ju3d 4jum jus3 juve5 j3v jve2n jver4s jvers5p jve3t jvie5s j1w jze4r5o 4k. 1ka k3aanb k3aanl 5kaart kaart5jes kaats5te. kabe2 ka3bo 2k1ac kade4t5 4k3adm ka3do k3adv 2kaf k3afd k4aff ka3fl 3k4aft ka4ga k3a4gen k3ah ka3i 2k3alb ka3le 5kalf kalf4s5 ka3l4i kal2k kalk3a 4kalt 5kalv 3kam 4kamb kamen4 kame4re kam4pa kam4pl kam4pr ka5naa kan5d 4kang kan4sl kan4st kan4t3j kao3 5kap. ka3pe kap3l ka1po 4kappa ka3pr kap3s k3arc k4a3ro kart4 4k3arti kar3tr ka4s kas5c 4k3asi kast3o4 ka3str kast5ra ka5stro kas3u4r kat5aal ka4t5a4le ka4tan kati4 ka4t5io kat5j k3atl kato4 ka4t3og ka5tr kat3s 2k1aut 2kavo 2k3b 2k1c k3ca 2k5d kdi3a 1ke k4eb 2k3ec ke4di 2k3een kee4p5l kee4r keer4s keers5to 2kef 4keff k4ei. k4eie k2eil kei3s4 kei5t ke4lap kel5da kel5dr ke5lel 4kelem kel5f ke4l5int ke4lom ke4l3op kel3sp 5k4ema 2kemm 2kemp ke4n3an ke4nau ken4ei. ke5nen ken5k ke2n1o kens5po kepie5t 4k3e4q ke3ram ke4r5enk ker3kl ker4kle ker4kn ker4k3r ker4ku ker4kw ker4n3a ker4no ker3o4 ke3ros ker4sm ker5spe ker4spr ker4sta ker5ste. ker4sti 4k3erts 4kerva 4kerwt ke2s ke3s4p ke3sta kes5ten ke3sto ke5straa k2et 5ketel ke2t3j ke3to ke2t3r kets5te. ketting5s 4k3e2tu ket3w 3k2eu keviet5 ke4vl 4k1ex 2k3e2z 2k1f 2k3g 2k1h4 k3ho khoud5s 1ki 2ki2d 4kied kie4sp kie4s4t kie5ste kie4tj kieze4 2kië kijk5l k3ijs 4kijv 4k1ijz ki3lo kilo5v ki3na 4kinb 4k5indel kinds5te. 4kindu kin3en 5king kings5l 2k3inh kinie4 k3inko 4k1inr 2k1ins 2k3int 4k3inv ki3o ki2p3l ki5se ki3s4p kit4s kits5te k1j 2k3ja k3jew k3jo 2k3ju 4k5k4 kke5nei kker4s kkers5ten kke3st 1k2l4 5klac k3ladi kla2p1 k4las 5klas. 5klass k3last k3lat. k3latt 3k4lav 3k4led 5kledi 5kleed k5leer. 4k5leg 5klem 4k5len k3ler. 4klera k3lers k3les 5k4le4u k5lic 4klid k3lig 2k3lij 4klijs k4lim kli4me 3k4lin k5lob 4klod 3klok 5klok. k5loka k3loke k3lood 5kloof k3lope 5klos klots5te. 2k5loz 4kluc 4kluih 2k1m k3ma 1k2n4 4knam k4nap 3k4nar 5knec k5nem kni2 5knie. knip1 4k5niv 3knol k3note 2knum 1ko ko4bl k4oc 2k5oct 4k1oef 5koek koe4ket koers5p koes3 koe3tj koets5te. koge4 5ko5gr 3k4ok ko5ko kol2e2 kolen3 2kolm 5kolo ko4ly ko2m3a 4komg kom5p k3omsl kom4str 4komz konge4 k4oni k3ontb kon4t3j kon4t3r koo4 2k1oog kooi5tj koot3 koot4j ko3pa 4kopb 4k3opd ko1pe ko5pen. 4kopg 3ko5pi 5kopj ko2pl 2kops 4kopz 2kord kor5do 2k1org 2k3ork kors5te. kor4ta kor4t3o4 kor4tr ko3ru 3k4o4s3 4k3os. kos4j ko5sjere koso4 4koss kot4st kots5te. 4k1ov 4k3ox 2k3p kpi3s k4plam kpren4 1kr4 3kra k5raad kraads5 kra4b 4k5rad k5rand 2k1rea 2k3rec 4k3rede k4ree4 k5reep kreet3 k3ref k2reg 2k3rel 2k1ric k3rijk k3rijp krij4t krijt5j k4rit k5ritm kroet5j 2krol k4ron kron3t 5kroon krop3a kro4to 2krou k3ro5v 3k4ru k5rub 5kruis kru4l krul5a 2ks k3sal ks3alm ks3an ks3ap ks1ar ks3as ks2e2 k5sec ks3ed ks5ei. ks3ep k4serv ks3et kse3v ksges5t k4si k5sil ks1in k5sis k5sit ks1j k1sla ks3lab k4slan ks3le ks3li k4smo ks3na ks3no ks3nu kso4 ks3om k5song k2s3pa ks5pand k4spar k1spe k3spi ks3poo k5spor ks3pot ks3pru k3spu ks5s ks4t k1sta k5staan k5staat k1ste ks5tec k4st3ed k3sten ks5tent kste4r kster5a k4sterr ks3th k3sti k3sto ks5ton k5stoo k4stop k5stot ks5trek ks3tri k3stue kst5uit k1sy 4kt k1ta kt3aan k3taar ktaat5 kt3ac kt3art k3te kte2c kt3eco k4tex kt1h k5tij kt3im kt3in k5tit kt3j k1to kt3om kto4p kt4or kt5ord kt5org kt5ori kt3o4v k1tr kt3res k5troll ktro3s k3tu 1ku ku5be kui2f 2kuit ku5k ku5me 3k4u2n 4k5uni 5kuns ku2r ku3ra ku3re kur3s 3ku2s kut3 2kû 2kv k3ve kven4t3 5k4waal 2k3wac k2wad k1wag 5k2wal 5k2wam 3k4war k5ware 4kwat k3weer 2kweg k1wei 5kwel kwen4st kwens5te. 4k1wer 5k2wes1 kwes5tr 5kwets k2wie k3wijz k4wik 2kwil 2kwin k3wind 4k1wo ky3 2kz 4l. 2laan 4laand l3aanh laa5re laar5tj laat5sta l3abon 2lac la4ca 5lach. la4cha 5lache lach5te lacht4s l4aci la2d5a la4det 2ladj 4ladm la2d3o 4la2dr lad5s la2du 4ladv 3lae3 2laf la2fa la3fl lafo2 4l3afs la2g3a la4gent la2go lag3r lags4 lag5sa la2k3a la4ki la3kr 2lal 3lald lal4o lam4p3j lam4p5l lam4po4 lam4s3p l4an 4la2na lan3ac 3land lan4da land5aa lan4d5oo lan4d3r lands5te. la4n3ec lanel5 5lange. lang5l lang5sp lang5sta lan4k3a lan4k3l lank3w 4lann la4nor lan2s lans3l lan4st lan4t3j lap3ac la3pi lap3l lap3o4 la5pre la2p3u la3q lar3da 2larm 4larm. lar5st las3a4 lase4 la2si las3to 5lastt la3te la4t3he lat5j la4t3ro 4lats4 lat3sl 2lau 5lauf lau4st l2auw la3v lava3 la4vo 5law l4az 4lazi la4zij 2lb4 lber4t lbert5j lboot4 2l1c lce4l5 4ld ldaat5 l2d3ac ldak4 ld3alf l4da4r ld3arc ld3ari ld3art l2dau ld3eco ldeks5 l4d3e4z ldi3a ld5oef ld3oli l2d3om l2d3on ld3oog l4do4p ld3opi ld3ord ld1ov l3dr l5drade ld3ram ld5rang ld3rat ld1re l5dree ld3rij ld3roe ld3rol ld3rom ld3rui ld3sa ld3sl ld3sma ld5sp ld5ste l3du ld3uit ld3uu ld1w le2a le4ane le3at leba4l lecht5st lee4 leeg3 leege4 leeg5i 4leekh lee5l leem3 3leen 4leep leep3o lees5e lees5l lees5po 2leeu 2leff lega5s leg3ec leg3l le4go le5go. leg5s 3leidi 4leier 4leig lei5tj leit5s le4ko4 4leks lek5str 5leld le2le 5leli l3elp le4n3a4d len3a4k 3lene le4n3e4m len5kw le2no len3op len3sf len3sm 4l3en5th le5o 4lep. 3le1ra le4r3a4k le5rei le4r3e4v ler5g4 le3r4o le4ron ler4sl ler5spo 4l3erts le2s le4sa le3sc les5et le3s4h les3m le4sp le3spe 4l3essa les3t les4ta les5taa le5s4tel le3str le4s3u le4t4h le3tha let4i le5tin le4top le2t3r le3t4re let4st lets5te. le2t3u leu3ko leum3a leur4o leus4 leu5ste 5leuz leven4s levink5j 4lexc 4lexp l2fac l3f4ag lfa3s l2fau lfe4n l4f3end lf3ene l2fe2z lf3li l3f4lo lf3lu l4fo l5foe lf3o4l lf1op lf5ord lf5org l5fou l1fra l3fru lfs5ei lf4sl lfs3le lf2s3m lf4so lft4 lf5ta lf5tw lf3uu 2l1g l5gaar l4gap lge4n5a l3gla l3g4oe l3gog l3goo lg3s4 lgse5 4l1h 1li li3ag li3am licht5st 3lid 5lid. 5lidm lid3s4 lie4g3a lie4gr lie3ka lie4sp lie3s4t lie4to li3eu 3liè 3lift l4ig li3go lijk3a lij4m3a 4lijmv 5lijn 4lijp 3lij2s lijst5a 4lijt 4l3ijz li5kr lik5sp li4kw li3kwi lim4a li3mi 2limp lim4p3j lin4da 4linf 4l3inh li5ni lin4k3a 3linn l3inna 2linr 2l3ins lin4t3j l3inv 4linz li3ob li5om li5o5s4 li3ot li2pa li3pi li2p3l li5see 2liso l5isw li1t2h lit3r lit4sa lit4sl lit4st lits5te. lit5sten 2lix 4l1j2 lk3af l4k3ank lk3arm lk3art l3ke l4k3ei l4k3em lken5e lken4s l4k3ep l3ki lking4 lk3laa lk3lag l5klas l4k3lev l5klim l3ko l5koe lk3ont lkooi5 lk3opb l5kor l5kou l5kra l2kre lk3rep lk3res lk3rij l2k3ro lk2s lk4se lk4so lk3son lks3oo lks5taa lk3ste lks5tel lks5tr l4k3uu l3kw lk3wi l3ky 2l1l l5la lla3d lla3g4 lla5tr ll3eig lle3k ll4el lleo4 ller5on lle3s4m lle5th llevie5 l3l4i l3lo llo5f l5lon ll3sh 2lm l3maa lmaat5 lm3a4ca lm3af lma5ï l3mak lm3arc lm3art lma3s2 lm3au l3me l4med lm3edi l4m3ep lme2s lme5te l3mi l3mo l5mog lm3oli lm3or lmro4z lm5sc lm3sh lm3su 2l3n lni4s lo3a 2lobj lo4boo loe4d5a loed3r 4loeg loe4gr loen4st loens5te. 4loes l3oeu 5loev lo4faa lof5d2 lof4s4 log4 log5l lo3go 5logr log2s3 lo4k3ar lo2k3o2 lo4kr lo2ku 2lo2l lo3la l3oml lom4p3j lom4p3l l3omt l3omv 4lomz 3lon. 4lond 5long lon4gaa lon4g3o lon4gr lon3o 2lont lon4t3j 3look loo5pi 3loosh loot3e lo3pa 4lopb l3opd lo1pe 2l3oph 2l3opl lop4la 2lopn lo3p2r 4lopt 4l3opv 4l3opw 2lor 3l4or. lo3re 4l1org lo3ri l4o1r2o3 3l4ors lo3ru lo3spe lost4 los5to lo4s5tr lo5s2u lo2ta lot3a4l lo4tet lo2t3h lot3j lo4tof lot3r lou3s lo3v 2love 3lo5z 4lp l1pa l3paa lp3aan lp3a4g lp3am l3par l3pas l1pe lpe2n l2pex l3pi l5ping lp3ins lp3j l1pl l3p4la l4plam l1po lp3of l3pom lp3on lp3ope l3pos l3pot l1pr lp3ram 4l3r lraads5 lrus5 4ls l4saa ls1a2d ls3a2g l1sam ls3an l3sap ls3as l2sat ls4cor ls4cu ls3eco l4s3e2d l4sef l5sen l4s3e2p lsge4st l3s2hi l3si l4s3im l4sin ls3inj ls3ink ls3int ls4j ls5ja l3s4kel l3s2ki l1sl l3sla l2s4le ls5led ls5lee ls5leg ls5len l2s3li ls4lin l3slo ls4maak ls4med ls4mee l3smid ls3na l3sne l3sno ls3nor l3soc ls3of l3sol ls3op ls3o4r ls1ov l1sp l2spa ls3pac l3span ls3par ls4pe l3spi ls3pli l3spoo l4s5poot l3spor l2spr ls3pra l1st l3sta l4staf l4stak ls5tak. l3ste l4stek l4stev ls4ti l3sto l5straa ls5trak l5strat l3stu ls5ty l2su l3sur ls3us l3sy 4l1t lt4aa lt1ac l4tam l5tame l5t4an lt4han l4t3hi l2t3ho l3thu lto4l lt3oli l2t3o4v l3tr ltra3s lt3rug lt3sl lt3sp lts5te. l3tu lu4b1 lub5e lub5l lu1en 3lui. 5luia 5luid luids3 5luie. 2luit luk2s luks3t lu3na 3lunc 2l3u2ni lu3sta lu3ta lut3j lut4st luts5te. lu3wi lven5s lvera4 l1w 1ly ly5i ly3st 4lz lzooi5 4m. 1ma maas3 maat5st m3act 2m3adv ma5esto m3afl ma3fr 2m3afs 4m3afw m4ag ma3gl ma5go ma3gr maï4 ma5ka ma5ke 5ma3k4r ma3kw ma3l4a ma5lac ma4l5ent mal5st 5m4an. man3ac m3anal man5da man5do mand4s 5m4ann ma5no 5man2s man4se mans5ee man4so mans3p man4s3t mans5ta man4th mant4r ma5pa ma3pr ma3q m4a5ri mariet5 5m4ark mar3sh mar4s5t mar5ti ma1so ma3s4po 5mass ma4ste ma3str ma5ta 5mater mat5j ma4tom ma3tr mat4st mats5te. ma3v 4mb m5bl mboot4j mbo5st mb4r 2m1c 2m1d m5da mdi3a mdis5 m3do mdo3p m3dr m3dw 1me me1c me5de 5media 5mediu mee5g mee3k4r mee5las mee3lo mee5re mee5ri 5mees meest5al mee5stov mee5str m5eg. me3g2a mega5s m5egd m5egg m5egt me4i mei2n mei5tj m2el me4l4as mel5as. mel5dr mel4ko mel4kr 5melo mel3s4m me4mi 3men m4en. me3na men4as meng5ra men5k me5nor 4menq men4s5uu men4t3j ment3w me5nu me3p2j 2m3e2q me1ra me4r5aak me4r3a4k me4r4am mer5ante me4rap me3rau me4rav mer3ei 5merk mer4kl mer4kn mer4kw mer5oc me5rong me3roo 4m3eros me3rot mer4si mer4sl mers5m mers5ta me2ru4 m4es me3s4h me4s4l mes5li me5slo mes3m me3so me4sp mes3pa me5spe me5spot me5stel mesto4 mest5ov me3stu me5ta5n me3t4h 3meti me5tr mets5te. meve4 m3e4ven 2mex 3mé 3mè 3mê 2m1f mfa3t mf4l mf3li mf5lie m5fo 2m5g mger4 2m1h 1mi 3mid 4mid. 5midd mie5kl mie3st 4m3ijs 4m3ijz mi3kn 5mili mi3lo mimie4 m3imp mi5nar 2minf 5ming 4minh 2m5inr 2m3ins mi5nu 4m3inw m2is mis5f mi2s3i mi3s4la mi4st mi5stra mis5tro mi3t4a mi1tr mit4st mits5te. mit5sten 2m1j 2m3k2 mkaart5j 2m3l 2m1m 2m1n m5na 1mo 5mo. mo3a 5moda 5mode moed4s 2moef 5moei moers5t moe2s moes3p moes4te mog2 5moge mogen4s mo3gl 4mok 5mole 2moli mo4lie mol4m3a 4molt 3mom 4m3omv mond3r mo5no 5mons mon4so mon5ta 3mooi 2mop mo3pa m1ope m4opp mop4s mo3ra mo3r4e mo3ro mor4sp mor4st mors5te. 5mos mo5sc mo4s5l mo3sta mo3t2h mot3j mot3ol mot4st mots5te. 2m3oud 5mouw mou4wi mo3v m3ox 2m1p mp3ach m4p3af m5pan mp3arm mp5arts m4p3ec m5pen m4p3erv mp3ins m3pl mp3lam m5plan mp3leg mp3lei mp3lev mp3lie m4plu mp5olie m5pon mpon4g mp3ope mp2r mp3rec mp3red m5pres m4ps2 mp5sc m5p4se mp3sh mp5su 2m1r 2ms m3sam ms3ana ms3ap ms2c ms3co ms3cu ms2j m3sje m1sl m2sle ms3len ms3lie m3s2m ms3ma m1sn ms3nee mso4 m3sol ms3or m3s2p ms4t m3sta m1ste ms5tec m5stel m5sten m1sti m1sto ms5toc m4s5ton mst5s m3sy 2mt m1ta mte5re mtes4 mte5sta m1th m1to m3tr m1tu 1mu mu5da mue4 5muilde. 2muit 2muk mul3p mu2m3 mu3no munt3j mu3sa mus5ta 5mut mut3j muts2 muts5te 3muu 5muz 2mv mvari5 mve4 mvee3 mver3e 2m1w 1my my3e 2mz mze4 mzet5 4n. 1na 3na. 3naal 5n4aam 4n1aan 2naap n4aar. 4n3aard 5naars naars5tr naar5tj 5naast 5naat n3abd 5nabe 2nac na2ca nacee5t n2aci 3naco 4n3act na5d4a nad4e 3nade. 5n4a5den 3nades 3nadi 4n3adm na5dra 2n1adv 5nae n3aë 4n1af na3f4lu n2a3g4 na1h 3nai 3naï n2ake na3k4l na3kr n3alb 3n4ale 5nalen 4n3alf n3alm 2naly 4nalys 3nam 4namb name5st n4ami n3amp n3a2na n3ank 3nant 5nant. 5nante n5antenn nan4t3j 2nap nap3ac 3na3p4l na3p4r nap3s nap5st 2n1arb 5nares 2n3arg narie5t 2n1arm 3naro 4nars nar4st nars5te. nar5sten 4n1art nas2 3na3sa na1s4l na1sp na3sta na3stu n4at. 3n4ati nat5j 4n3atl na3to nats4 nat3sp 5nau. 5naus 2na3v 5naven 3navi 3nazif na4zij 2nb nbe5st nbe5t nbots5te. 2n1c n3ce nces4t n3che ncht2 nch5tr nch3u n5co 4nd n5da. nd3aan nd5aas nd3abo nd3act nd5adel nd3adr ndags5p nd3alf nd3alm n4d3ana n4dap n2dar nd3art n4das nd3ass nda3st n4dav n4d3a4z n3de n4d3edi n4d1ei nde5laa n4d3emm n5den. ndera4 nder5aal nder5al nde4r5an n4d5e4rec nder5in. nder5og nde4ten ndi3a ndie4tj n4dijs nd5ijs. n4d3ink ndi3o n3d2ji n5do. n5doc n4d5of nd3oli nd3omd n4don n5dona nd5ond n5dons nd3ont nd3oog nd3ope nd3opp nd3ov nd5rap nd3rat nd1re nd4rek n4dres nd3rot nd3rug nd3s4cu nd4sec nd5set nd3s4i nd3sjo nd4sm nd3sp nd4spo nd4spra nds5taal nd3su nd3uit n2d3u4r nd5ure n4d3uu nd1w n3dy 1ne 3ne. ne5ac ne3am nebe4s 3neck ne2cl ne4dit ne3do n3edu ne5dw nee4 4need nee5k neel5d neel3o 3neem 4n1een nee5ri nee5se neet3a neet5o neet3r neet5s 4n1eff ne3g2 ne4gel negen5en nege4re 4n1ei 5neien n5eier n2eig 5neigd 5nei5t ne4k3r ne2la 4nelem 4nelf 3nem 4n3emb 5n4eme 4n3e4mig 4n3emm 4n3emp ne2n 3n4en. 5nenb 5n4end. nen5do ne4n5enk ne4ni ne5nig nen5k4 nen1o4 5nenp nen5t4a ne5oc ne5ok ne5om neo5p ne5os ne5ot nep3ag ne3pe nepi3s ne1ra nera4d 3n2e5re n3erfe 2nerg ne4r3id ne3ros ner4sl ner4sp ner4st ners5te ner3u ne3ry 3nes ness5a ness5t ne3sta nes3te nes4tei ne5s4tek ne4ter net3on net4si ne2u 4neum ne3ums neu5ste 2nex 3né 2n3f 2ng ngaat5j n2g1a2d ng3af ng3ana n4ga4p n2gar nga5sl n3gav nge4ad n4g3een ngels5te. ng3emb n5gen nge4rap nge4ras n4giger n4gigs ng3ij n4gind ng3ink n4g3ins ng4l ng5lad ng5lam ng5lan ng5led ng5leu ng2li ng5lin ng5lop n3goe ng3of n3goï n2g1on ng5oor ng5op ng3ore ng3org n3got n3gr ng3rac ng3rad ng3rai n4gras ng5rass ng4red n4g4ri ng5rie ng3rij n5gron ng3rui ng2s ng4se ngs5lop ngs5lu ng4s5ne ngs5tak. ngs5take ngs5trek ng5stri ng3uit 4n3h nhek5 1ni n4i2d nie5kle ni3eri nie4s3p nie4tr 3nieu ni4g3ee nig3ra nij3f nij3k 2n3ijz ni5kr nik4s niks3p 3nil 3nim. 5nimf n3imp 2n3in. n3inb 2n1ind 2ninf ning3r 2n3inh n3inj 2ninr 2n1ins 2n1int 2n3inv ni3o ni4on. ni4one ni5or ni5o5s4 nip3l 3nis ni4sau ni4sel ni4s3ev ni3sfe ni2s3i ni4sl nis5n ni3sot ni5stel nis5to ni3t2h ni1tr nits4 n1j4 n3je njes4 nje5sp nje5st nje3t 4n1k nk3aan nk5aard nkaart5j nk3af n5k4am n4k3arb nkar5s n4k3asp n3kef nk3eff nk3emp n3ken nken4e nker5ku nk3id nk2j nk3lad nk3lod nk3luc nk3lus n2k3na n3kne n4ko4g nk3oge nkoot5 nk4ra n4krim nk3rol nk5se nk5si nk3sl nk3s4m nk3sn nk4s5o nk1sp nk1st n4kw nk3waa nk3wez nk3wi 2n3l 2n3m4 n3n n5n2e nnee5t nne3ne nnepo4 nne4p5ol nne5te nnet4j nn4i nning5r nnoot5 nno5v 3no. 1noc 1no3d 2noef noen5s noes3 noet5s n5offi n3o2ge n5ogi 1nogr 3noï no3kl no3k2w no2li 1nolo 1nom 4n3om. n2oma n3oml n1oms n3omv 2n3omw 2nomz 3n2on. 3n4onb 3nonc 4n5ond n4o5ni 4nont 3nood 4n5oof 4n1oog nooi5tj 3noot3 noot4j 3no3pa no4p3as 4n3opb no1pe n1opg n5opleidi no4poo no4por 2nops 2n3opz 2nord no3re 2n1org 1norm 4norr 3nors 3norz 1nos no3sf no3sn no3sp 1not 3nota not5a4p 5noti not3j not3r 3nou. no3v 3nova no4ve 3nox 3noz 2n1p npers5te. npi4s5 npoor4 npoort5j n3ps 2n3r nraads5l n5re n5ri 2ns ns3a4d n3sag n1sal ns3alp n1sam ns3an n3sanc n1sap n3s4cal n5scho ns4ci n4sco nsee5t n4sef nse4g ns5ege ns3eis ns5emp n3si ns3idi n2sin n5sing ns3inj ns3ink ns3int n1sjo n1sl n5sla. n3s4laa ns5laag n5slag ns5lap. ns5lapp n4sle n5slep ns4let n5sleu n5slib ns3lie n5s4liep n5slim n5slip ns5lot. ns3m ns5mac n3s4me n3smij n3smol n4smu n1sn n2sna n5sne ns3nod n4snoo n4snot n1so n2s3ob n2sof n3sol n2son ns3ong ns3onz ns4opp ns4or n2s3ou ns1ov n4s3paa ns3pad n1spe n5spee n5spel ns3per n4spet ns4pi ns1po ns3pol n4spot n1spr ns5q ns5s ns4t n1sta nst5aang nst5aans nst3a4g n3stal n3ste ns5tec n4st3ei n4s5teko ns5teks n5sten. ns5tent n5ster. ns5tes ns3the n1sti n3stig n4stijv n1sto nst5oef n4ston n3stor nst5rade n5stree ns5trekk ns5troe ns5trog nst5roos ns5ty ns3uil n3sy 2nt n3ta n5taal n4t5aard ntaar5tj n5tab nt3ach nt4act nt1ad nt3aga n4t3art nt4as n5t4at n3te n5tec n4t3ei nte4lo n5tem n5te2n nte5nach ntene5ten nte5rad nte4rof n3tè nt3ha n4tho n5thol n5tig nt3inw nt4jo n3to nt4og nt4ol n4t5oli n5ton nt4oo nt5oog n4top nt3opl nt3opm nt3opt n1tr nt3rec nt3rei nt3rel ntre4s nt5ribb nt5rij n5troos nt4rou nt3rus n5try nts3a nt5slu nt1sn nt4sno nt1sp nt4spr nts5pre nt1st nt5ste n3tu n4t3uit ntu4n n5twijf n5t4wis 3nu. 3nuc 3nue nu3en nu3et 4nuf 2nui 4n3uil nu2lo 3num nu2m3a 5numm nu2n 3nunc n3uni 2nu4r 3n4u5ri nu5ro 1nus nu4s3o nu3tr nut4st 4nuu 5nuut nuw5a nu2w3i 2nv nve5na 2n1w nx3 n3xe nxo4 1ny 4n3yi 4n3yo 2nz nzet5s 3ñ 4o. 4oa o3aa o2ad o3af o1ag o3ah o3ai o1al oa2m o1a2n oa4tiev o3au o3av o3ax 2o3b 4ob. obal4 obalt3 3obj 1o4bli ob5oor o4b5o4r 4obr 4oca ocaat5 5o2cea o3cha o1che o3chi o3cho o3chr ocke4 4o3co oco3a oco3s4 oc3t4 od5ac oda3g ode4m5ar ode4mo ode5re odes4 odi3a o5dru od5sc od5sei od3s4i od2sl ods5lam od5slan od3sli od5smak od4s3o od3spo od4spr ods4t od5sta od4ste ods5te. od5stek od5sten od3w o4e oe5an oe3as oe2d3a oeda4d oede4n oe2d3o2 oe4dr oed3re oed3ri oed3ro oe2d3u oed3w oe3e oe5er oe4f1a 1oefe oe2fi oe2fl oef3la oef5le oef3lo oe4f5o4 oe2f3r oege3l oeg5ij oeg1l oe4gou oeii4 oei3n oei5s4 oei5tj oei3tr oe4kaa oek5erk oeke4t oe2k3l oe4k3op oe4k3r oe2ku oek1w oe4lap oe4lar oel5dr oe4l3ei oe3lem oel5f oelo4 oe5loe oelo5p oel3sp oe4m3ac oem3o4 oen3al oe5n4e oen5gr oen3o oen4sn 2oep oep5ind oe4pl oe5plo oe4p3r oe3pra oe4ps oeps3e oe2p3u 4oer oe1ra oe4raa oer5aal oe4r3a4l oer4e oer5ei. oer5eie oero2 oe3roe oer3og oer5om oer4sl oer4sp oer4sta oers5tak oers5te. 4oes. oe3sfe oe3si oe4sli oe4s3o4 oes4ta oes4th oe3sto oe4taa oe2t3h oe5t4i oe2tj oe4t3o4 oe5toe oe4t3ra oet4s3p oet3w 2oë of3ar of3at o4fav of4d1a4 ofd3ei of2d3o of2d3r ofd3w of3l o4fli o4flo 4ofo of3om o3foo of3op o3for of3ox of1r o3f2ra of5se of4sl of5sla ofs3le of2sp of3spe ofs3pl of3spo ofs3pr ofs3tr ofs5tra 4oft of4tu oft3ur oft3uu of3ui og5ac oga4l og3al. og5de og3di oge4d oge5laa ogel5ei 2ogem o3ger oge4ro oger5on oge4s3t 2og5h 1ogig og1l og5ne og3op og3sp og3sta og4st5ei og3sto og4ston og4str ogs5tro og3ui o3gy 2o1h 3ohm 4oi oi3do oi1e oi3j oi5k o3ing oi3o4 oi3s4 oi5sc ois2p oist2 ois5tj o3ï 2o1j 2ok o3ka. o3kaa o4k3aas ok3ab ok3ag o3kal ok3ank o4k3a4z ok3ef o2k4l ok5let o4kli ok5lu o2k3n ok3o2l ok3op. ok3o4pe okos5 o2k3ou o2k3r ok4ra ok1sa ok3s4l ok3sn ok5spri ok1st4 oks5te. ok5sten ok4s5tr ok5te okter4s oku4 ok3ur ok3uu ok1w ok2wi o1la o3l4ab ol3ac o3lal ol3a2p ol3arm ola3s4m 4old ol3d4o ol3d2w o1le o3le. ole5g ol1ei ol3eks ol3emm o3len o5ler oleu2 ole3um ol3exa ol2fa olf3l ol3fr olf5sl ol2gl ol2g1o olg5rap ol4gre ol4g3ri ol2g3u o3lia o3lic o5lid o3lik o3lin o5ling ol3int o3lit ol3kaf ol5ke ol2kr olk4s olk2v ollie4 o3lo o5loc olo3k ol4om o4lop ol3op. ol3opp olo3s4t olo4ve ol4pra 4ols ol5se ol4s5h ol5si ol1sj ol3s4l ol3s4n ol3so ol3sp ol5ster 4o1lu ol3uit olu4r 4oma om2aa om1ac om1af o3man 4ome o4m3ef om3ela omen4s omen5ste. ome5ren omer5kl ome5sp ome5t om2i o4m3int 4omm 4omo omo5l omo3s om4p5ei 5omro om3sl om4ste. om3ui 3omz on1ac on4ag o4n3am on4an on3ap ona3th 2onc on4d3ac on5d4as on5der ond5ete on4d3id ond5ijs ond5om. on2dr ond3re ond3ro ond5sj ond5slo on3d4u on4dur o5ne. o3neb o2n1e2c on3ei on3erf on3erv one3st 4onet. on1e3v ong5aan ong5aap ong3ap 4ongen ong5le ong2r ongs4 ong5se ong3sp ong3st on5id o5nig on4k3ap onke5lap on3k2i on4k3lo on3kn on5kw onnes4 onne5st o4n3of ono3l on1on o2n1ov on3sc ons4e on5sei ons2f on3s4m on2s3n ons5op on3sor on1s2p ons4pe on3spl on1st on5sten on5str 4ont. on4taa 3ont1h on4tid 3ont1s4 ont5sp 3ontv 1ont3w on1ui on3ur o4o2 4oo. oo3c 4oo4d ood1a ood1e4 oo5de. ood1o ood1r ood3sl ood3sp 4oof oo3fi oo4g oog1a oog3e oo5gi oog1r oogs4 oog3sh oog3sl ook3a oo3ke ook5l ook3s4 ook5st oo4k5w oo4l ool5a2 oole2 ool3ed ool5f ool5g oo5lig ool3ij ool3k ool1o4 ool1u oom5a4 oo3me oom3i oom1o4 ooms5te. 4oon oon5a oon5du oon3in5 oon5k4 oon1o oon5ta oo4p1 oopa2 oop5ee oop3o4 oop3r oop4sp oor3a oord5aa oor5dop oor1e4 oor3g4 oor5i oor5k oor5m oor1o oor3sm oor5ste oor5sto 4oort oor4th oo4s oos3a oo5se oos5n oo4t oot1a oot3es oot3h oot5o oot3r oot4sl o1ö 2opa o4p3ac op3ad o4p3af o4p3ak op3am o3pan op3and op3at. op3att 3opbre 3opdr o3pe. op3ee op5eet op3ei o1pel o3pen. 3o4peni o5per. o4pera op3e4te op3e4v 4opf o1pi o5pic op3i2d opie5t op3ijz op3in. o5pina o5pis 4op1j op3l op5los 1opn o1po opoe3 op1of o5pog o5poi o5pol op3ond o5poni op3ont op3ord op3o4re op3o4v op1r op3ric o4pru o4ps op5s2c op5se op5si 3ops4l ops4m op3sma op3sn op3so op3sp op3sta op3su 2opt 4opt. op5tr op3ui o2p3u2n o1ra or3ach or3act or3adm or1af ora4g o4r3alg or3ana o5rate or4daa or4d3as or4denv or4do ord5ond ord3or ord3o4v or3dr or4drad ord3w o1re ore5ad 4orec oree4 ore4no or2gl o1ri o5ria 3orië o5rig. o5rigere o4r3ink or3ins ork2a or5k4e or3kl or5kn or3kw or4m3ac or4mas or4m3ei or4n3ac or3ni orno3s4 or3oe o3rol or1on or3ont or1oo or1o2p or3or o3ros or5ov 4orp or4p3ac orp4s5c or3sag or5sc or5se or3sli or3smi or3so or4son or3sp or5s4pa or5spu or4t3ak ort5een or4t5ijl or2to or4tof or4t3oo or4tred ort5sp ort5ste or1u o3ry orzet5 2os o4sac o5sas o3sau 4o3s2c osca4 o4sci o5s4cl os3cu o5sed os4el o5ser os3f os4fe o4sha o3shi os2ho o3si o4sj os5jer. o4sk os5ko os3l os5li4 o4s3m os4n os5no o3s2o os3pa os3per os1pi os4pir o4spr os4s5m o2s3t os4ta os5taal os5taar osta3c ost3a4g os5tan os5tar o3stas o3stat os5te. os4tem o5steroï os4th os4to os5toli os5tou ost3o4v os5tra. os5traa ost3re ost3ri o3stro os5trum os1tu o3sty o3su o5sy 4o1ta ot3aar ot1ac ot3af o3tag ot3akt ot3app ot3art otas4 o5tat o3te ot3e2d o5tee. o5tees o5teg ot3ei ote4lan o5ten o5ter oter5sp ote4st ote4t ot3eta o1th o2t1ho ot3hu o4tj otje5sp otli2 o1to ot3off ot3olv o5tom ot3ont ot3opm oto5po ot3opr o5t4or oto3s 2otr o1t4ro ot3ru ot5s4i ot2sl ot3sla ots3li ot3smo ot3sn ot3sp ot4s3pa ot4ste. ots5tek ot5sten ot4stu o1tu ot3ui o3tul ot5w 4ou. ou5a ou1c ou4d1a ou4des ou2do ou1e oue2t3 ou3k4 ou4ren ou5ren. ou5renn ou2r3o2 4ous ou3sa ous5c oust4 ou2ta out3h out1j ou2t3o out1r out5sp out5ste ouw3a ouw5do ouw5ins o2v 2o3va o5ve. 2o5vee 3o4verg over5sp over5ste o5ves 2ovi ovi5so 4ovl 4o3vo 4ovr ovu3 4ow o1wa o1we o5wen ow3h o1wi ow2n o3wo ow3r o4x oys4 ozet5 ö3l ö1p öpe1 ö4r ös4 ös5t ö5su 4p. 4paan paar5du paar5tj 5paas 3pab p3acc 2pach pacht5s p4aci 5pacu 3pad. pa4da 4padv pa3e 4p3afd 1pag pag2a pa4gen pa3gh p4a5gi 3pak pa2k3a 4p4ake pa4ki pa4k5l 2p3alb 3pale pal3f pa3li paling5s palle4 palm5ac pal4mo pa4m pa3na pa4n3a4d 5panee 5panel 4pank pan5sp pan4tr 1pap pa4pe4t 5papi pap3l pa3po pa3pr 4par. 3pa3ra p3arb pard4 par3da 3park par4ka par4k5l 3parl 4parm pa5ro 4parr par5ta 3parti part3j 3partn pa5ru paru5r 1pa4s3 pa5sa pas5c pa5se pa5so pas4th pas5to pas5tr pa5te 1path p3atl 3pa3tr pats5te. 2paut 5pauz pa4vl 5paz 2pb4 2p1c 2p3d2 pe4al 4peci p3e2co 3pectu 1ped pe3de pe3do p4ee4 3pee. 3peeë pee5li 4peen 5pees 3peg 1p4eil pei4l3a 4peis pek5ee pe2k3l pe2k3n pek5s p4el pe3l4aa pe4l3ak pel5dr pe3le pe4l3ee pe4l3e4t pe3l4i pe3l4or pel5si pel3so pel3sp 2p3emm pe3na pe4nak pe4nap pe4nau pe4naz p3ency pen5d4r penge5 pen5k 5penn pen3sa pen5sl pen3sm pen5sp pent4 pen5to 2p3epi pep3o pep5s p4er. pe1ra pera3s4 per4at 3perc pe4r5eg pe5req 1peri peri3s per1o pe3ron pe5ros 3pers per4sm per5sti per4str p2ert 3pes pe3sa 3pet. pe5ta 5pe5ter 3peti pe4t3ra pets5te petu5 3peuk 5peut 1pé 3pê 2p1f 2p1g pge5s 2p1h4 4p3ha 3p4hec p4his 4pho pi3am pi5an pi4at 2pid piek5la 5piep pie4r3o pie4s3p pie4tj pi2g5a pi3gl 3pij. pij3k pij5ke pij4li 3pijn 5pijp pij4p3a 2pijz pi4k3l pilo5g pi5nam 2pind 3pinda 3p4ing 5ping. pin4ga pin5gri 4p3inj pink3r pink5s 4pinr 2pins pin4ta pi5o pis5n pis5ta pi3th pit3j pit3r pit4sp 2p1ja pjes5 p3ji p1jo 2p1k pkaart5j p2l2 p3la. plaat5j 2p3lad pla3di 4p3lamp 4p3lang p4lant p3lap 1p4las 3p4lat pla4t3r 5p4lay p4lec plee5tj p3leid 3p4len p3lep pleu5ro p4lex 2p3lig 4plij p4lom p3lone p5lood plooi5tj p3loon p3luie 2p1m pmans5t 2p1n p3na 3pneum 3po. poda5 3poei poe2s3 poes5t poets5te. 3poez 3poë p2ofa 3pogi po5gr po2k3i2 po4kol 1pol po5l4o polo3p pol4s pols5te. 1pom 2p3oml 3ponds pon4sm pon4st pons5te. pon5ta 5pony poo3d poo5de 4poog. 3pool poo5len 4poor. poor4tj poot3 po4p3a 4popd 2pope pop5h 2p3org 2p3ork po3ro p4ort 5portef por4to por4t5ra po3ru 1pos po1sa po3sf po4taa po4t3as po5te potes5t pot1j pot3r 3poul po3v 4p3p p5pa p5pe ppe4l3o ppe5ni pper5ste ppie5k ppij5p p4ps pr4 p2ra 3pra. p5raad praat5j p5rad 3prakt 4pram p5rand 3prao 4p3rap p4rat p4rax 4preeku 1prem p3remm 3prent pren4t5j 3pres p3reso 3pret pre4t3j pret3r 4pric 4p3riek 4priet prie4t5j 1prij 3prik 3princ pring5s4 5prins 3p4rio 3p4riu 5priv 5p4rob 3p2roc 1p2rod p3roed 3proef proet5j 3proev 5p4rof 5p2rog 1proj pro3la 3prom p3rood prooi5 pro5pa p4roq 3pros pro5sc pro4s5t pro3t4a 3proto 3pro5v 4proy pru2t prut3o4 2ps p3sab ps3a2g p3sak ps3ar ps3ass 4pse ps3erk p4s3et p3si p4s3i2d p4sin p5sis p1sl ps3le ps2me ps5mi p4s3na ps3neu p4sof p3sol ps3opt pso4r p1sp ps2pl ps3ple p1s4t p3stat p3ste ps5tent ps5tes ps5th ps3tor ps5tron p3stu ps5ty 3psy 5psyc p3sys 4p1t pt3ad pt3alb p3te p2t1h p5ti pt3j p4t3o4v p3tr pt3ric 1p2u 3pub pu3ch pu3e puil3o pul4st 3pun 4pun. punt3j 3put. puter5in put1j pu2t3o put3r put4st puts5te. 2pv pvan4 pvari5 2p1w 1py1 2p5z 1q 5qe qu4 que4s 5quo 4r. r2aa 2raan 4raand 3raar 5raar. 4r3aard 5raars raar5tj 2rac ra4ca ra3ce 5racl rad4a 3radb ra5den ra3di 5radia 3radio 4radm 4r3adr 3rad3s 4radv 2rafd r4aff raf5ond ra3fra 3ragez ra5gi ra3g2n ra5go rag4s 3rais raket3 ra3k4l rak5r 4r3a2la ra4l3ee 4r3alf r3a4lim r3alt ra4man r5ameu ra3mi r2amp 4rana ran4dr ran4g3o ran4gr r5angst. ra4nim 4ranj ran4kl rank3w ran4sa ran4st ran4t3j r3antw ra3o 4rap. ra3po 4rappa rap5roe ra3q 2r3arb r4a5re 4rarit 2r1arm 4r3arr 2r1art ra5sei ra4sk ra4sl ra1so ra2sp ras3po rast5ri r4ati rat5j ra4tom ra4tra ra5tri rat3sp rat4st rats5te. ra3t4u 2rau 3raus r1aut 5ravr ra4zij rbe4ti r1c r3ce rces3 r3chi r3co 2r1d r4d3act rd3alk rda2m rd5ama r3dan r2d3ar rd3ei r4d5e4las rden5dr rde5o4 r4derva rde5s4t rdi3a rdi5o rd5l r3do r5doc r4d3ol rd5olie rd3ont rd3oos rdo3pe rdo3v rd3ras rd3res rd5roos rd2ru rd3sa rd3s4c rd3so rd1sp rds4t rd5sta rd5ste rd3su r3du rd2wi rd5wo 3re. 1reac re4ade 4reak re3amb 4re5at re3co 3recr rec5ta 3reda 3redd rede4s3 4re4diti 3redu re5dw ree4k 2r1een ree3n4e r5eenh ree2p reeps5 ree5r4ad 4reers reer5ste r3eerw ree4s ree5sh r4ef 4refb 2reff 3refl re3fu 1reg 4reg. 4regd rege5ne rege4s 4regg 3regi re3gl 4regt 4reie 4reil 4reind rei5tj 5reiz re4kap 5rekeni re2k3l re2k5n re4ko re4k3re rek3sp re4ku re1kw rel4di rel4d3o reld3r re4l3ei rel5k re4lu4r 3rem. re4mai remie5tj re5mo5v 2remp 3r4en. re2na re4naa ren5aar re5nade re3nal re4n3an ren3a4r r4end 5rendee r5endert re5ne. re4nel re5nen. ren5enk ren3e4p re5ner. ren5erf ren5erv 5renf 2r1eni 5r4enkl r4enn re4noc ren4og ren4opl re3nov 5r4enp 4renq ren4sl r4ento r3entw r5enveer re4of re4op4 re5pa 3repet re4pie 4req re3qua 4r1erf 2r1erg re3r2o rer4s 2r3ert 4r5erv 2rerw re3sa re5se re4sl res5le res3m re2s1p res3t re4tem re3t4h ret4i re4tik re5tin 2retn re4t3o4g re4t3oo rets5te. re2u reur5es reus4t reu5ste 3revis 3revo 2r3ex r4f3aa rf3act r2f3a4g rf3al r3fas r3fe r4f3eng r1fl r4f3lag rf3lev r2f3li rf3lus r4f3op r1fr r4f3re r5frea rf2s2 rf3sm rf3sp r4f3u4r rf3uu r1g r4g3ab rg3amb r4g3een rg3ei rg4eis rgel5dr r5gen. rge4ra rge5rap r4g3ins r5glas r3glo r4g3lu rg4o3v r5grij rg3rit r3g4ro rg1s4 rg2sm rg5so rg4s5pr r3h ri5abel ri4ag ri2ak ri5an rias4 ri4av ri4bl 4rice ri3co ridde4 ri3di ri4dol ri4doo rie5dr rie4k5ap rie5kl rie3kw rie4la riel5aa rie4lei rie4ro rie4ta riet3o ri1eu ri3fl ri3fr r4ig ri4gaa ri3gl 5rigste r4ijl 4r5ijl. r5ijld r5ijlt rij5o rij3pl rij3pr rij3sp rij5ster rij4str 4rijv ri4k5l rik5n ri3k4o ril5m ri3ma rim4pr 4r3inb 4rind ri5ne 4r5inf r4ing 4r5ingan r5ingeni ring5l 4r3inh ri4nit rin4k3l r3inko 4rinkt r3inl 4r3inna 4r1inr 4rins r3inst 4rint 4r1inv ri5on ri3o5s ri4sam ri3sc ri3sot ris5to rit3j rit3ov rit4st rits5te. rit5sten 3ritt r5j4 rjaars5 r5ka. rkaart5j rk3adr rk3af r2kah rk3ang r4k3art r2k3ei rke4n rken4s rker4sl r4k3erv rke4s rke5stree rke5strer rk5iep rk3ijv rk3inb r4k3ink rkjes5 rk3lag r4k3lat rk5leid r2klo rk3loo rk3lus r3kn r4kne r2kob rk3olm rk3omg rkoot5 rk3opg rk3ord rk5os. rk5oss rk2r r5k4ran rk4ri r5kris r5kron rk1s rk3s4f rk5si rks4p rk4t5e4v rkt3h rk4ti rkt3o rkt1r rk3uit r1kwa rk3waa rk5wat rk3wee r1kwi rk3win r3l rlaat5ste rle4g3r rlink4s rlinks5te rlofs5 rlui5t4 r1m rmaf4r r4m3art r2m3eb r2m5eg rme4r3a4 rmes3 rme4t3j rmet5st rm3inh rmi2s r3mo r5moe r4mop rm3opm rmors5te rmos5f rm3s4a rm1st rm3uit rmun4 2r1n r3na r5n4am r4n3ap rn3ars rnee5t r4n3ene rnes3 rne5te rne4t3j r2n5id r2nin r2n1on rn3oor r5noot rn3ops r5not rn3ove rns4 rn3sm rn3sp rn1st rn3sta rn3th rn5tj rn5to r3nu rnu5r ro1a ro5ac r4oc ro1ch ro3d4o 3roe. 4roef 4roeg roe4g3r 3roem roens4 roen5sm roep3l roe4rei roet4j 4roev 3roë r5offi r4ofi ro3fl roges5 1roï ro3kl 3rokm rok3sp r4ol. ro2l3a role5st rol3g2 2roli rol3ov ro5ma ro3mo 4romz r2on. ron3a4d 5r4onal ron4da ron4d3o ron4d3r ron4d5u r2one r2oni r2onk ron4ka r2onn r2o1no r2ons ron4ste rons5te. 4ron2t ront3j ront3r ro3nu 4ronv 3roof 2roog 4roon 2r1oor root5ste ro3pa ro4paa ro4pan 4ropb ro1pe ro5pee ro4pin ro3p4la 4ropn r4opo rop5rak rop3sh r4opte ro4pu ror5d ro3ro ro3sa ro5se ro3sf ro3sh r4o5si ro3sp ros4s5t ro5stel ros5tra ro5te ro3t2h rot3j ro5ton ro3tr rot4ste rots5te. r1oud 3rou5t4 ro3v ro4ve ro5veri 4roxi 3roy r1p r3pa rp3aan rp3adv rp3ank r5pee rp3eis rpi3s r2p3j rp4lo rp5lod rpoort5j r4p3o4v r4p3rec rp3ric rp4ro r3psa rp4si rp2sl rp3sli rp5spe rp4s5to 2r5r rre4l3u rren5s4 rre5o rreu2 rri5er. rrie4t rron5k rrot4j 4rs rs3a2d rs3a2g r3sal rs3alm rs3amb r3san rs3ana rs3ap rs3ar rs3as rs4asse rsa4te r5schi rs2cr r4s3eis rsek5ste rs4et rseve3 r2s3ez rs4fer rs4hal r3s2hi r3s4hoc rs3hot rs3ini rs3int r4sj4 r5sjac r5sjou r5sjt r3s4kat r1sl r4slan r5slec r5slep r5sleu r5slib rs4lie r5sling rs3lob rs5loep r4s3loo r5sluis rs4m r5smaak rs5maal rs5mak r3sme r3smij rs5mis r5smit rs5mu r1sn r2s3na rs3neu r2s3no r1so r5sol rs3ong r2sor rsorkes5 rs1ov r1sp r3spaa rs3pad r4s3par rs4pare r3spe r5spec r5spee r5spek rs4pene r4s3pet r5spit r5spoe r5spog r5spon r5spoo rs3pot r5spraa r4spu r5spul rs3put r1s4t r4s5taak rst5aang rs5tas r5stat r3ste r4s3te. r5ster. r5sterk rs5term r5sters r5stes rste5st r4steva r3sti r4stit r3sto rs5toma r4ston rst5ora r3str rs5trap r4st5red rs5trei r5stren rs5trog rst5roz r3sty r3su rs3usa r3sy 4rt r1ta r5ta. r4t3aan rt5aand rt5aanv r4t1ac rt1ad rt3af. rt3aff rt3am r5tans r2tar rt3art r4tau r2tav rt5c r5teco rt3eig rt3eil rte4lei rt5emb r5ten. rte5nach rte3no rte3ro rtes4 rte5sta r2t5e2v r4tha rt1he r3ther rt3hi r1tho rt3hol rt3hu rt3hy rt4ij rtij3k r4t3ini r4t3ink rt5jesc r3to rt3off r5tofo r5tok rt3om. rt3ond r4t3op r5tori r1tr r3tra rt4rap r4t3ras rt3rec r5treden. r3t4rek r4t3res rt3ri r4t3rol r2t4ru rt5ruk rt5rus rt4s5eco rt5sei rt2s3l rt3sle rts5li rt4slu rts5m rts5no rt4soo rt1sp rt4s3pr rts5ten r1tu rt3ui4t rt3w rt2wi 5rubr rude3r ru1e 4ruf ru2g ru4gr r5uitr ru2k 4ru3ke ruk3i rul3aa rul3ap ru2li ru4l3ij ru3lin rul5s r2um ru2mi 3run. r2und runet3 4r5u2ni ru3niv ru4r ru5ra ru5re. ru5res r2u4s rus3e rus5tr 4rut rut3j rut4st ruts5te. 4ruu ru3wa rvaat5 rval4st rvals5te. rvers5te. rves4 rve3sp rvloot5 r1w rwen4st rwens5te. r4wh rw2t3j r3x r3yu 4rz rzet5st 4s. 5sa. s1aa 1saag 5s2aai saai4s 3s2aal 3s4aat 1sab sa3bo 2s1ac sa2ca 3sacr s1adv 2s1af 3safe 3safo sa3fr s5agg s4a3gi 3sagn sa3go 3sah 3sai 3saj 2sak 3saks s1akt s2al 5sal. 3sa3la 3sald 5salh s3all 4salm sal5ma s3aln 3s4a3lo 3s2ame 5samm sam5p 4sa2na sa3nat s4anc s2a3ne s4ant san4t3j sa2p 3sap. sa3pa 2s3ape sa4pr sa5pro sa3ra s1arb 3sard sa2re s1arm saro4 sar3ol s4ars 4s1art sart5se 4sas. 3sasa sa3sc 3s4ast 1sat 3sa3te 5sati 2s3atl 2s1att s3aud 1saur 3s2aus s1aut 3sauz 1sax 4s3b s5ba s5be s5bo 1sc 2sca 4sce 5scena 5scè 3s4ch2 4sch. sch4a 5schak 5schap 4schau 5sche. s5chec 4schef 5schen 4scheq 5scher 5schev 5schew s2chi 4schir 5schol 5schoo 5schot sch5ta 2sci 4scl 2sco 3s4cola 3scoo 3scope 5scopi 3s4co5re 3scout 2scr 4scris 2scu 2scy 4s1d s5de s4dh sdi5a sdis5 s3do s5dr s3dw 3se 5se. se2a se3ak se3al sear4 se3au s4eb 4s3ech se3cr 5sect 4secz s4ee 4s5eed 5seei 4s1een s5eenh see4t see5ts 4seev s1eff se3ge 2s5e2go seg2r 4s3ei. 4s3eig s4ein 5sein. 5seine 2seis seis4t sei5tj 5seiz sek4st seks5ten se1kw s2el 5s4el. sel3ad se4l3a4g se4lak se4las se3le 4s3e4lek sel3el 4se4lem 4self se5ling 4s3elit sel5k 5selm selo4 5selp 5s4els sel3sp 5selt se2l3u s4em se4m3ac s5emm sem3oo s4en 5sen. se4n3a4g se5nan se4net 5sengr 5senh sen5k se4n3o 4s5enq sen5tw 5s4er. se1r4a ser5au 5se3r4e se4ree se5ren s4erg 5sergl s5ergo 5sergr ser4i se5rij 4s3ern se3ro se5rop ser2s sers3p ser3st sert5w se3ru s4es se5sc se3sf 2s5esk 5sess se4t se5ta 4s3ete se5ti se3tj set3r se5t4ra set5st 4s5etu set3w se3um se4ven 4s1ex 4sez se2ze 3sé 3sè 2s1f 4sfed s5fei 4sfi 4s5fr 4sfu sfu5m 4s5g sgue4 s1h s4ha. sha4g s5hal. 3shamp 4she sheid4 sheids5 s5hie 5s4hir sh3l 4shm s3hoe s3hoo 3s4hop s2hot s3hote 3show s5hul 1si 5si. 5s4ia si5ac si3am si5an 5sic sici4 si3co 3sie. 3sieë sie5fr sie5kl siep4 sies4 sie5sl sie3so sie3st sie5ta sie5to si5è si1f4 5s2ig si5go5 s3ijv 4s1ijz 5sile 4s5imper 3simu 5sina s3inb 4s3inc 4s1ind 2sinf sing4 3sing. s3inga s5ingeni sin3gl s3in5gr s3inh 4si2ni 4s3inko sin5kr 4s3inm s4inn 4sinr 2s1ins 2sint 4s5inv 4s3inz 3sir 5siro s3irr si4s sis3e4 sis5ee sis3i sis5tr 3sit si5to sito5v si3tr si4tru si5tu 3siu 3siz sj2 4sj. 3s4ja. 5sjab 4sj3d s1je 2s3je. s5jeb 3sjee 3s2jei 1sjer sje4ri s3jes 3sjew 3s4jez 4sj5k4 5sjof 4s3jon sj3s2 sjt4 s5ju 2s1k2 skaart5j s5kad s4kele s5ken 3s2kes sk4i 3s2ki. 3skied skie3s 3skië ski5sc s2k3j s3ko s5kre sk5ruim sk3ste 4sku s3k4w s2l4 3s4la. 5s4laan 5slaap 4s5laar 4slab s4lac 4s3lad 3s4lag 5slagm sla4me s5lamp. s5lampe 4s5land 3slang 3slap 5slape sla3pl 4s3las 2s3lat 3s4la5v 4slaw 3s4laz s3led 3s4lee. 5sleep 4s5leer s4leet slee5tj 4s3leg 2s5lei s5leng s3leni slen4st slens5te. 3slent s4lep 4s5ler s5les sle4t3j 3s4leu s5leug s5leus 5sleut 2s5lev s3li. 4s3lic 4slid 2slie s5lied s3lief 3s4lier s3lif s5lig 4s3lijf 5slijp 4s5lijs s4li4k sli2m slim5a s5lini 4slinn s4lip 4s3lit slo4b5 2s3loc 3s4loe 3slof 4s3log s3lol s3lood s5loon s5loos 5s4loot3 s3los 3slot slo4tr 4s3lou 4s5loz 4s5luc 1s4lui 4s5lui. 4sluid 5sluis. sluis4t slui5ste 5sluit 5sluiz 4slun 2s5lus 4s3ly s1m 4s5maat 3smad 3smak. 3smal 2s5man s5map s4mart 4s5mat 4s5mec 5smeden 3smeed 5s4meet 4s5mei 4smelo 4s5men 4s5mes3 5smid. smie2 smies5 s4mij s5min 5smok s3mon 5smuilden s5muile 5smuilt s2n4 s5nam 5s4nap s4nar 3snau 3s4nav 3s4ned 3snee snee5t s5neg 5s4nel 2s5nes 4s5net sneus4 sneu5st s5neuz s3nie 1s4nij s5nim 3s4nip 4s5niv 4snod 3s4noe s3nog 2snoo s4nor. s3norm sno5v 3snuf s4nui 2snum 3so. so4bl so1c s3oce 3s4o3d 1soe 2soef 3soep soes3 2s1off 3soft 2so2g 3so3ga s1oge so3gl 3sogy 5soi 3soï 3sok s2ol 5sol. so3la so3le so3lis 3so5l4o3 solo5v 5sols s2om 3s4om. 5somm 2s3oms s3omv 2somz 5s4on. 3sona so5nar s3onb 2s1ond 2song 3sonn 3so3no s4ons 2s1on4t3 4s3onv s3onw 3soo 4s5oog 4s3ook 4s3oor. s3oord 4s3oorl 5soort 2s1op 3s4op. 4s5ope so3phi s2o5po so3pr 3s4opra sop4re s2orb s3ord 2s1or3g 4s5ork sor4o so3ror sor4st 3s2ort sos4 so3sf s4ot s3oud sou2l sou3t 2sov s1ove 3so5z 4sp. sp4a 5spaak s3paal 5spaan 5spaat 2spad 2spak 5spake s4pan 3spann 4s5pap 5spar. s4pari 5sparr 2spas5 5spatt s3pau 5s4pea 4spectu 3s4pee speet3 4s3pei s4pek 5spell 4s3pen s5pen. spe4na s5pep 4sper s4per. s5peri s4perm 5s4perr 4spes s3pez s3pid 1s4pie spie5tj 4spijn 4spijp s5ping 5s2pio s3pis spi5sto 2s1p4l 4s5pla s4plet s2pli4 5splin 3split s3plo s3plu sp4o s2poe s3poes 4spoë 4spog 4spol 2s3pom s4pon. s4ponn s2poo s3pop 5s4pore s4pori 4s3pos 5spots 4spou 4sprakt 5spray s5pred 5sprei s4prek 4sprem 4spres 5spreu 5spriet 4s5prij 4sprik 4sprob 4sproc 4s5prod 4sprof 4sprog 5s4pron s4proo 4spros 4s3ps 4spt s2p4u 4spub 5s4pui 4spun s4pur 5spuw s4q 4s5r sraads5l sro5v 4s3s4 ssa1s2 s4sco s4s5cu s5se ssei3s sseo4 s5si s5sl s4spa s5spaa ss5pas s5su s5sy s2t 4st. 5staaf 5staan. 4staang 4staanw staart5j s4taat staat5j st3abo 2s4t1ac 3stad 5stads 2staf 5staf. sta4fo s4tag s4tak 5staki 4stakk st3akt 4s3tali 5stam. 5stamm 3stamp 3s4tand stan4s s4tap 4stapo s4t3arc 4stari 2stas stasie4 5statio 4stau st3aut s4tav 4stavo 4s5tax 4staz 2stb 2st5c 2std 4stea 5steak 4stec s5tech 5steco 3s4ted 4stedu 3steek 3steen 4steenh s5teer stee5t 5stein 5stekar 5stekk 5steldh ste4lee st5elem 3stell 5stem. 5stemd 5stemm 4stemo 4stent 4stenu ste5ran 4sterm ster5og st5e4ros 5sterren s5teru 4ste4s 4s4t3ex s4t3e2z 2stf 4stg 4sth s4tha st3hed st5heer st3hek s5them s3ther st1hi s4t1ho s4t1hu s4t3hy 2stia 2stib 4sticu s4t3id 5stiefe s5tiev 4stijd 3s4tijg 5s4tijl st3ijs 3stils s4tim st3imp sti5ni 4stins 4s5tint 4stite 2stiv st3ivo 4s4t1j 2stk 4stl 2stm 2stn 2stob 2stoc 4stoef 3stoel 5stoel. 5stoele 4stoen 4stoer 4stoes 4stoez 3s4tof st3o4ge 5s4tok s4tol sto5li 4stoma 4stomz s4tong 3s4too 4st3oog stoot5j s4top st3o5pe st5opto 4stora sto4rat 4stord sto5ri 4s5tos s4tov 2stp 1s4tr 4stra. straat5j 4st4rad 3stra4f 5straf. s5trag 4strai 4st3rec s5tref 4streg 4s3trei 5strel 3strep st3rif st5rijp s5tris 4s3troe s5troep st4rom 5strook 5stroom 4stroos st5roos. 4s5trou 4stroz 3stru 4strui. 5struik 4st1s4 st3sc st5se st3sf st3sk st3sl st3so st5sp st5st 2st5t2 1stu 4stub 4stuc 5s4tud 4stuin stui5tj st5uitk 5stuk 2s4tun st3uni stu4nie 4stus 2stv 2st3w 2s4ty 1styl s5typ 2stz 1su 5su. 5sua 5su4b1 suba4 sub5e su5bl 5suc 5sud 3sug 2sui 5suik 4s1uit 5suit. s5uitl 5suits. 5suk 3sul 5sum 4s1u2n 5sup 5surv su4s sus3e suur5 4s5v svaat5 svari5 sve4r sve5ri 4s1w s5wo s4y 3sy. 4syc 3syn sy4n3e 1sys5 4s5z 4t. 3taak. t4aal t5aando t3aank taan4st t3aanw t3aap taar5sp 4t3aas taat4st taats5ta 3tabe 3tabl 2tac ta2ca 3t4aci 4tad ta4de t3ader 5tado t3adr tad4s3 t3adve 2taf. 2t3afd 5ta3fe 4taff t3afha t4afr ta3fro 4t1afs 2t3afw 4tafz ta4gaa 5tagee 5ta5g4l tag3r 5taka 5takg 5takken ta3kl 5takn 5takp 5tak3r 5taks t2al ta3laa ta5lact 4talb 5tale. 5talent ta3li 5talig t5allia talm3a 4talt ta4mak 4tamb t3amba 5tamen tament5j 4tamp t3ampu 5tan. 4t3a2na ta3nag ta3nat tan4d3r tan4k5r ta3o t4ape 5tapi ta3pl 5tapo ta3q ta3ra 4t3arb 5tari 4t1arm ta2ro4 tar5sp tar5taa t3arti 3tarw 3tas 5tasa 5tasj 5taso ta3s2p ta3sta ta3str ta3sy 4tata 4tatio tat5j 4t3atl 3tatr 3tau 4taut 2t1avo 3tax t3a2z 4t3b tba2l 4t3c t4ch t5cha t5che t5chi t5chu 4t3d2 tdor5st tdo3v 1te 3tea te3akt 5tea4m 3tec 4t3echt 4teco te4dit t3edu tee2 teeds5te. tee4g 4teek tee4k3l teem1 4tee4n t5eenhe 3teer tee5rin tee4t 4t3eeu t4ef t5eff 3tefl 3teh 4t3eier 4teig tei4lo t4ein t5eind 5teit tei5tj 2t3eiw 5tekene 5tekens 4teker 4tekk 3teko te4k3om 3teks te3kw te4k3wi t4el tel5ant te4lap tel5da 4telec 5teleco t5elect tel5een 5telef 5teleg tel5ei. tel5eie tel5eit te5lel 5telev 5te5lex tel3f tel5k te4loe te4l3o4g tel5oog te4l3op telo4r tels4 4telse tel3so tel5su te4l3uu t4em 2temb 4temm te4mor tem3ov 5temper 5tempo t4en ten4ach ten3a4g te3nak te5nare te4nau tene2 ten3ed ten3el tene4t 3tenh ten5k4 te5nore 4t5enq ten5scr ten3sn ten3sp tensu4 tens5uu 3tent 5tenta 5tenten. ten5to t3entw 5tenu t2er teraads5 te4r5aak ter3a4b tera5ca te4rad tera4de te4r5af ter3ag te3ral te4ran ter3ap ter3as 5terec te4rei ter5eik te4rel te4rem te5ren. te4r5enk te4r5env 4t4erf. 4terfd ter3fr 4t4erft te4r5in. 3terj 4terk. 4terkt ter3k4w 3term 5term. 5termi ter5oc te3rod te3rof te3rog 5teron te5rons tero5pe tero4r te3ros 5terrei 5terreu 5terror ter4spr ter5ste. ter5ston 3tes te3s4ap tes3m te3so tes3ta te5stel tes5ten test5op test5ri test3u te3ta te5tr 4t3euv t4ev t5e4van teve4r 5tevl 3tevr 2tex 3tex. 4t3exe 4texp 1té tè3 4t3f 4t3g2 tgaat5 t5ge tge3la tger4 4th. 2t1ha t3haa t4haan t4had t3hak t5ham t4hans t3har t3hav 5thea t3heb 5thee. 4t3hei 4t3hel 3t2hen 5theo 1t2her 5the3ra 4t3here 3thes 3thet t4hin 4thm t1hoe t2hog t3hok t1hoo thoof5di 4t1hou t3houd 5thous 4t3hov 3thr 2thu t1hul 4thum t4hur 3ti 5ti. 5tia ti5ab ti5ae ti3ap 5tib 5tica 5tice 5tici 5ticu ti3d4 5tie. tie5d4 5tiefs tie3kn tie4kon ti3enc tien5st 5tiep 5ties tie5s4l tie5ta tie5to tie5tw ti1eu 5tieven ti3fe ti3fr ti2ga tig5aa 4tigm ti4gu4 tig3ur 5tijd tije4 tij5ka tij4kl 5tijn tij5p t3ijs. tij3st tij3t2 tij5tr tij5tw 4t1ijz ti3ko ti5kr t4il 4tils 5timm 5timo tina4d tin3as 4t3incu 4t1ind 4tinf tin4g3i ting4sa t3inh ti4nit 4t3inj t3inko 4t3inl t3inq 4tinr 4t3ins ti3nu 4t3inv 4tinw ti5om ti3o4p5 t2is ti5sa ti3s4j ti3sl ti3so ti4son ti3s4p ti3sta 5tite ti3th ti1t2r 5tivi ti4vo 1tj2 2t1ja t5jaa t5jee t5jek t3jen t5jet 4tjeu 2tjo t1jou 2tju 4t3k2 tkars3 4t3l t5le. 5tleb t5les tli4n 4t3m tmen4st tmens5te tmos5 4t3n tna4m3o tne4r tnes4 5to. toa2 to3ac to3ar to5bl 3toc 1toch 3tod to3da t4oe toe5d4 3toej toe5k 5toe3l4a toe5le 5toelic toemaat5 5toen to5ende toe5pl 3toer 5toeri 5toern 5toe1s4 toe5st toe3tj 3toets 5toets. 5toetse toets5te. 3toev 5toez to2f tof5ar tof5d to4fr tof3th 3togn 5togr 3toi to4kan tok3s t2ol to3la 5tolaa to5le 5tolet t3olf 2toli 5tolic to4lie tolk5s 5tolo tolp3r t3oly 4tom. 5tomaa tomaat5 t3oml to3mo tom4p3j 4t3om5s 5ton. 4tond 3t2one 5tonee 5to5nen to5ner 3t4ong 5tong. 3t4oni 5t4onn to3no 5tons ton3sk too4m toom3e 5toon t4op. top5art top3as to3pen to3pet to3pi 2topm to4po to5pos t4opp to4pu to5pus t3opva 5tor. to3ra to4r3ag t3ord to5rec 5torens 4t1org t5orga t4ori 3toria to4rië tor3k tor4m3a toro4 to4r5oli to3rom 5torr 3tors tors5te. to3r2u 3tos4 to3sa to1sl to1s2p tos5te 5tota to3tr 2t3oud 3tour tou4r3e to3v tove5na to4vens 4toverg to3w4 4t3p4 tpe4t3 tpi3s tr4 3tra. 4t3raad 5tracé 5trafo. 3trag 4tragez 3t4rai 5train 5traka t3rake 3trakt 3trans 5transa 5trap. 5trau 4t3raz 3t4re. 4trea 2trec 5tred. 4treda t5redes 4tredu 3tref 4t5reg 4t3reis 4treiz 4trel t3rese t3resu tre2t3 t4reu t3rib. 5tribu 5trico trie5ta trig2 2trij 5t4ril tri5ni 5t4rio4 t3risi t3rit. 5t4riti 5trody t3roed t3roes 5trofy 3trog t4roï 5troj 4trol. 5trola 5trolo 5tromm 5tron. 5trona t5rond 3trone 5tronn 5trono 5trons tront5j t3rood 5troon t4roos tro5pi t4ros 5trotu 3trou 4t5rout tro5v 5truc. 5truf 4trug 5trui. 5truie t3ruim trui5t4 t3ruk t4rum 4ts ts3a2d tsa4g ts1am t3sap ts3as tse4d ts5een t4s3ei ts5eind t4s5ene t4s3eng t4s3erg ts5erge t4s3e2v t2sij t4s3ink ts3int ts2j ts3ja t3sjen 3tsji t1sl ts4laa t3slac t5slag. ts3lam t2s3le t5slib t5sloe t3s4lu ts2me ts4moe ts3neu ts4no ts5nor ts5not ts3nu ts3ob tso2l ts3oli ts3om ts1on ts4opp ts1o4r ts1ov ts3pad t3span t5spec t4s3pet t3spi t4s3pil t3spoe t3spoo t5s4por ts3pot t4spro ts4pru ts5q ts5s t3sta t4staak t4s5tank ts5tant t4star t4stas t3ste t5sted t5stee ts5teko t5stell t5stels t5stem t5ster. t4sterr t5sters t5s4tes. t5steu ts3th t1s4ti t3stij t5stijg t5stil ts5tin ts5t4j t1sto ts5toep ts5tong t4store ts5trad ts5trei t3stri ts5troe ts5ty t4su4 ts3ur ts3us ts3uu t1sy 4t3t t5t4a t5te tte5loe tte5l4op tte2n tten4t5j tte5ri t5tlet tt3oog ttop2 t5t4r t5tum tt3uu 3tua 3tub 3tuch 3tu3e 5tueu tu3és 3tuig 5tuin 4tuip 2tuit tuit4j 4tuk tu4k3i tul5pi t4um 5tune 5tunn tu1o 5turb tu3ri 3tu4s3 tut3j tuurs5la tu3wa 4tv tvaat5 t3ve 4t1w 3t4wijf t2win 1ty1 3typ tys4 4tz t3za t3zi t5zw u1a u3ac u3an ua5ne ua3p u5ar. uar5t ua3sa uat4 2u2b ub3ac ube4li ub5em u5bi u3bo ub5or 4uc u1che ucht5sl uc4ki ucle3 uc4t3a uc4tin u1d uda2 u5da. ud5am ud3ei ud3ess u4de4z ud3eze udi4o udi5ologe udi3om udoe2 ud3ond ud3oo ud3ov u4d1r uds5lo uds4m uds5ma ud3sme ud3smi ud1st ud4sta uds5tak ud4sti ud1w u3ec ue2co u1ee4 u3ef u3ei u1el u4ene u1er uer3il ue3st u1eu u5eul u3ez u3è u4f3an u1fl u1f4r uf2s u5ga ug4da2 ug4der ug2do ug4dr uge4l5o ug3ij ug1l u2go ug3or u2g1r ug5sce ug4sec ugs4p ugs5pa ug1s4t ugs5tra u1h u2i ui5ac ui2d3a ui2d1o uid4s uid3sp uid5spre uid5ste. uid3u ui3e uien4t ui2fa uif1l uif5r ui2fu 4uig ui4g5aa uig1l ui2g3o ui4g3r ui4gu 4uik ui2k3a ui4k3l ui2ko ui2ku ui2la uil5aa ui4l3em uil5m ui4l3og ui4loo uil3ov 4uim ui2m3a ui3mag ui4n1a uin5g ui2no uin5og uin3or uin4s5lo uin5to ui2p3l ui4p3o4 ui2p3r 4uis ui2s3a uis5c ui4sl ui5slu uis5p ui4st ui4t3a4 uit5aa uit5al ui5tar 1uitg uit1j 3uitl ui2t1o 1uit5r uit3sl uit3sn uit5sp uits5te. 3uitw 3uitz ui3v 4u3j 2uk u2k3al uk3as ukkers5 u2k3l u3klas u2k3n u2k3o u3koc uko2p uk4o3pl u4k3r uk3s2m uk3spa uk3spl uk4sti uk1w u1la ul3ac ulam4 ula4p ul4d3a uld5erk ul5dop ul4d3u u1le ule5sp ul3fl ul5fo ul3fr ul3in. u5ling ul3inn ul3k2a ul5ke ul2k3l u1lo ul3o2p u3los ul2pa ulp3ac ul4pi ul2p3l ul2po ul4p3r ul3sa ul3so ul2s3p uls5te. uls5tel u3lu um3af um3ar 3umda 2ume umee4 umes4 ume3st um3om um3op um3so um3st u2m3ui un3ac un2c unch3r un4dra und4s unds5ta und5ste une4t un3g 1univ un4k3r un4o uno3g un5o2p unst3a un4ste. unst3o un4st5r unst5ui un4tag unt5een un2tj un4t5o4 unt3s4m un4t3u u3ol u3on u3oo u1or uo3ru u3os uota3 4up u1pa u1pe upe3k upe4ro uper5st u3ph u3pi u1pl u4p3lei u1po u3pol up3om up3op u1pr up4tr u1ra ur3aan ur1ac ur3ada ur3adv u2r3a4r uras3 u4r3a2z urd4o u1r2e ur3ech ur3een uree5s ure5lu urelu5r u4rem ur3emb ure4n u3res ur3ess ure3st ur3eta 4urf ur2fa ur3gi u1ri uri4gl ur3ijz ur3ind ur3int 4urk urken5s ur4kie ur3k4l urk4s5t u1ro ur5opb ur3or uro5s ur5pr ur4serv ur4s3ev ur3s4fe ur2sl urs5laa urs5li ur4s5m ur2sn ur4sp urs5pa ur5spel ur5spor urs5take urs5th ur4sti urs5tik ur3ta ur4tro ur5troe u3ru ur3ui 4urv u1r4y 4usaa us3ad us3a2m us1ap u4sc u5s2cr use5tj u5sie u4sj u4s5l u4sm u2s5n uso2 us3oï us3os u2s3p us5pi us5pu us4ta us5tag ust3al u2s3te us4t3ei u4sti ust3oo us5tra. us5tre. us5tro us5tru ustu4 ust3ur ust3uu u1ta ut3aan utaar5 ut1ac ut3af u3tan uta3s4 ut5c u4t3ees u4tek ut3eks ut3em ut5emm uter5an ut3ex ut2h ut3ho u2tj u1to uto5f ut3oog uto3pe utop4l uto5po utop4r uto5s ut3saa ut3s2c uts5eng uts2m ut1sn ut3sp ut4spa ut4spo ut2st uts5tak ut4ste. ut5sten ut3str ut5su utt4 u1tu ut5w u4u4 uur3a4 uur3e4 uur5i uur3k uur1o2 uur5ste uur5sti 4uut uut3a uut3r uvel4s uve5na uw1a u3wag uw3ar uw5art u1we uw3ec uwe5d uw3een u2w3ei uwe4nen uwes4 u1wi u2w3ij uw5ijz u4wind u3wing u4wins uw3inz uw1o u3woe uwo4ge uw1r uw3u uxa3 u3ya 4uz uze3t4 uzie2 ût3s4 1ü ü4b ü1n ü3ri üs3l 1v2 2v. vaar4ta vaart5r va3de va3g4 va2ki va4kl va2ko va2l3a val5m va3lo va4loe val5si val4s5p vals5tek valu5 va2n van3ac vand4 vang3a van4gr va3no va4noc va1p va3re va5se va3s4o vast3r va3su va3te va2t3h vat5j va3z v4b 4v3c v4e 3ve. 5veb vee4l veel5e vee3p4 vees4 ve3g4h vei3s4 vei5tj 3vek 5vel ve4l3a4g vel4d3o ve3le vel3k 5vem vem4a ve4na ve5nare 5vend ven5k ve2n3o 2venr ven4s3e ven4sl vens5lan vens5lo ven4sp vens5taak vens5take vens5tek ven4s3u4 ve2r ver1a ver5aas ve4rad vera4g ve4rand ver5do ve3rec ver3ed ve3reg ve3rei ver5eis ve5ren. ve5rend ver3e4t ver5ijd ver5ijl ver5ijs ve5ring ver5k4 ver3o ve3rom vero5v ver5p ver5spe ver5sta ver5sto ver5tw ver1u ve3ry ve2s3 ves5ti ve2tj ve2to4 vet3og vet3oo ve3tor ve2t3r vet4roe vet5ste 5ve5z 3vi 4vicepa vid5st vie4r3a vie4s3 vies5n vie4tj vi3eu vijf5 vik4s vil4t3j ving4 vings3 vi3o vi5om vi4s3an vi1so vis5ot vis5p vi4st vis5tr vi1tr v3j vje4 vjet1 3vl v3lar vlei3s4 vlie4s5 vlot5s v3lov 5vo. 3voe voe4t3a voe4t3r voet5sp 3vog voge4 3voi vo2le vol4g3a vol4gra vo2li vol3ij vol5p von4det vond5u 3voo voo5d vooi5t voorn4 voor5na vo3ra vorm3a vors5te. vor5sten vos3 3vot vot3j 3vou vous5 3v4r2 vrei5 vrie4s vrij5k4 vrijs4 vrij5ste v3t vues4 vu2l vul5p vuur5s vy3 2w. waad3 w2aar waar5e waar5ste wa4b3 wa2ba wa5bl w2ad wa3dr w4ag wa2la wa3lan 4wam wan4d5r wan4gr wang5sl wa2n1o wan3s4 3wap w4ar w5arc 5ward war4st wars5te wart3j war4to wa2si wa4s5l wa4s5p was5tr 1wate wat5j wa3tr 3way 2wb w1c 2w1d w4doo wd3oom we2a 2we2c 3wed wede4 we2d3i we4d3r wee4ki wee4k3r wee3lo wee3s4t wee5ste 3weg we4g1a we4gerv weg3l we2g3o we4g5r wei3s wei5tj we4k3r we4le2 4welem we3li we2lo wel3s we2m wem3a we3me we2n wena4 wen3ad we3ne4 we4nem we5nen. wen5enk we3ni wen4k3a wen3o wen5to wer2f 4werg wer4ka wer4k5l wer4kn wer4k3o wer4k3r werk5ru wer4k3u4 wer4k3w wer4p3a wer4p3l wer4pr wer4s wer5ste we2s3 we3spo wes4t5o 3wet. we2th we2t3j wet4st we2t3u 2wex wezen4s5 2w1f w1g w1h wie4la wie4t w4ij 3wijd wij4ka wij4s wijs3l wijs3p wijs5ta wi4k 3wil wind3a win4d3r w4ing 2winr win2s winst5aa winst5r wi4t3h wit3j wi2t3o4 wit3r w1j 2w1k 2w1l 4w1m 2wn wn3ac w3ne w3ni w3no w3ob w2oe woes3 woest5a wo4l wol3a wolf4s5 woon5sf woor4d5r wor4g3e w1p wren4st wrens5te. 2ws ws3a2 w3sc w1sl w2s3le w3som w3sp ws2pl w4spr w5spra w1s4t w4stij 2wt wtes3 wtje5sp w1to w1tr wu2 wva2 w1w xaf4 xa3g xamen5t xan3 xan5t x1c x4e xen4d xe3ro x1f x1h xie4t xi3g xi5o xi3sta xi3sto xi4t3i x3l x1m xo3no x4op xo3s4 x1p xpre2 xpres5 x3r x3so x3sp x1t x2tak xtie2 x3w xy3 y1a ya3s4 ya4s5p y3at yba2l3 yber4t3 y1c ycho3 y3co y1d4 ydi3a y5dr ydro3 y1e yes3 y3és y3è y1f y1g ygu2 y1h y1i y4in y5is yksge4 y3la yl3al y3le y4l3et y3lo ylo3l ym2f5l ym5pa y3na yn3er y3no yn1t y1o y3on y3os yo3t y1p y3p4h ypo3 ypot4 yp3s yp5si y1r y3r4e y5ri ys3 y1s4a y3s4c y5s4e yse5t y3s4f y3s4h ys4i y3s4o y3s4p ys5pl ys4ta ys5tr y3sy y1t yt3hu yto3 y2tof ytop4 yu5a y3ui y3u2r yvari5 y1w4 1z 4z. zaar5t za3f2 zags4t za2k3a zak3r zan2d zand5a4 zan3di zan4dr zang3s za3po za3s4 4zb 4zc 4zd z4e zee3k zeel5d zee3r4o zeero5v zeer5s zee3s4 ze5ge zeg4sl zei3sp ze5k zel5dr ze3lem zel2f1 zel4so zen4d3a ze4nin zen5k zen3o4 zen4og ze3non ze4r3a ze3ro zer2s zer4s5e ze4s3 ze5sch zes5e zes5l ze5ste ze2t3a ze2t3h ze4ti ze2t3j ze2t3r zeve2 zeven3 4zf 4zg 2z3h z2i ziek3l zie4k3o ziek3w ziel4s zie5sl 3zif zi2g5a zij5kl zij3po zij5s4 zik2w zi4n3a4 zings3 zin4k3l zin4s zins3t zins5ta zin5str zi3o5 zipi3 zi4t zit3e zit3j zit3u4 4z3k 4z3l 4zm zodi5 zoet3j zoet5ste zo3f2 zoi4 zo5ie zo3la zome4 zo2na zon3sf zon5ta zooi5tj zo1p zor4g3a zor4gl zor4gr zo2t zot3h zo3tr zo3v 4z3p 4z3r 2zs 4z5t zui4d3i zui4dr zus3 2zv z4w zwets5te. 5zy 2z3z zz3in zz3or z4z5w",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=12724,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-nl.rhl b/Master/texmf-dist/tex/context/patterns/lang-nl.rhl
deleted file mode 100644
index 9e176ee8925..00000000000
--- a/Master/texmf-dist/tex/context/patterns/lang-nl.rhl
+++ /dev/null
@@ -1,2907 +0,0 @@
-ma{-}{i}{ï}s
-ka{-}{i}{ï}n
-ba{-}{a}{ä}l
-Jo{-}{e}{ë}l
-Ba{-}{a}{ä}l
-ta{-}{e}{ë}l
-ia{-}{e}{ë}n
-Ka{-}{i}{ï}n
-tea{-}{e}{ë}n
-r{a-}{}{aa}tje
-p{a-}{}{aa}tje
-ge{-}{e}{ë}bd
-ge{-}{e}{ë}nt
-zee{-}{e}{ë}n
-wee{-}{e}{ë}n
-ski{-}{e}{ë}r
-ski{-}{e}{ë}n
-ru{-}{i}{ï}-ne
-ree{-}{e}{ë}n
-po{-}{e}{ë}et
-pee{-}{e}{ë}n
-oli{-}{e}{ë}n
-ka{-}{i}{ï}ns
-fee{-}{e}{ë}n
-ari{-}{e}{ë}r
-Ha{-}{i}{ï}-ti
-po{-}{e}{ë}ma
-pi{-}{e}{ë}-ta
-po{-}{e}{ë}em
-jeu{-}{i}{ï}g
-na{-}{i}{ï}ef
-moe{-}{e}{ë}r
-de{-}{i}{ï}st
-Za{-}{i}{ï}-re
-ge{-}{i}{ï}nd
-Ka{-}{i}{ï}-ro
-re{-}{e}{ë}el
-re{-}{e}{ë}-le
-ge{-}{e}{ë}gd
-Ca{-}{i}{ï}-ro
-be{-}{e}{ë}rf
-the{-}{i}{ï}st
-stee{-}{e}{ë}n
-ge{-}{e}{ë}rfd
-ge{-}{e}{ë}ist
-di{-}{e}{ë}-ten
-ka-no{-}{e}{ë}n
-va-cu{-}{u}{ü}m
-twee{-}{e}{ë}n
-tree{-}{e}{ë}n
-smeu{-}{i}{ï}g
-slee{-}{e}{ë}n
-ski{-}{e}{ë}rs
-re{-}{u}{ü}-nie
-re-li{-}{e}{ë}f
-po{-}{e}{ë}-zie
-po{-}{e}{ë}-ten
-ma-li{-}{e}{ë}n
-le-li{-}{e}{ë}n
-knie{-}{e}{ë}n
-idee{-}{e}{ë}n
-ge{-}{e}{ë}erd
-dru{-}{i}{ï}-de
-drie{-}{e}{ë}n
-cli{-}{e}{ë}nt
-ca-ri{-}{e}{ë}s
-ari{-}{e}{ë}rs
-ac-ti{-}{e}{ë}n
-Is-ra{-}{e}{ë}l
-ori{-}{e}{ë}nt
-ME{-}{}{–}er
-ole{-}{i}{ï}-ne
-be{-}{e}{ë}rfd
-Ha-ri{-}{e}{ë}t
-Fij-i{-}{e}{ë}r
-Tri{-}{e}{ë}st
-BN{-}{}{–}er
-Is-ma{-}{e}{ë}l
-Li-bi{-}{e}{ë}r
-Ori{-}{e}{ë}nt
-wee{-}{i}{ï}ge
-ra-bi{-}{e}{ë}s
-taxi{-}{e}{ë}n
-thee{-}{e}{ë}n
-ta-li{-}{e}{ë}n
-ru{-}{i}{ï}-nen
-se-ri{-}{e}{ë}n
-si{-}{e}{ë}r-ra
-si{-}{e}{ë}s-ta
-snee{-}{e}{ë}n
-spie{-}{e}{ë}n
-ha-vo{-}{e}{ë}r
-po{-}{e}{ë}-men
-po{-}{e}{ë}-sis
-po-go{-}{e}{ë}n
-po-lo{-}{e}{ë}n
-po-ri{-}{e}{ë}n
-fa-ci{-}{e}{ë}s
-fa{-}{e}{ë}-ton
-na{-}{i}{ï}e-ve
-na-ti{-}{e}{ë}n
-or-gi{-}{e}{ë}n
-owee{-}{e}{ë}r
-jeu{-}{i}{ï}ge
-jo-jo{-}{e}{ë}n
-ju-do{-}{e}{ë}n
-ka-no{-}{e}{ë}r
-kwee{-}{e}{ë}n
-ma-gi{-}{e}{ë}r
-ma-o{-}{i}{ï}st
-me-ni{-}{e}{ë}n
-echo{-}{e}{ë}n
-ego{-}{i}{ï}st
-flu{-}{i}{ï}-de
-fu-ri{-}{e}{ë}n
-ge-ni{-}{e}{ë}n
-glee{-}{e}{ë}n
-he-ro{-}{e}{ë}n
-ide{-}{e}{ë}el
-ide{-}{e}{ë}-le
-In-di{-}{e}{ë}r
-de{-}{i}{ï}s-me
-co{-}{i}{ï}-tus
-li{-}{e}{ë}-ren
-om{a-}{}{aa}tje
-ge{-}{e}{ë}ind
-SP{-}{}{–}er
-ge{-}{e}{ë}tst
-SS{-}{}{–}er
-ru-zi{-}{e}{ë}n
-To-go{-}{e}{ë}r
-ge{-}{i}{ï}nkt
-Sy-ri{-}{e}{ë}r
-Os-lo{-}{e}{ë}r
-uf{o-}{}{oo}tje
-go{-}{e}{ë}-tie
-veto{-}{e}{ë}n
-id{-}{}{–}er
-Li-ma{-}{e}{ë}r
-ge{-}{e}{ë}cht
-ge{-}{e}{ë}est
-the{-}{i}{ï}-ne
-IT{-}{}{–}er
-At-ti{-}{e}{ë}r
-fi{-}{e}{ë}s-ta
-Da-ni{-}{e}{ë}l
-Ra-fa{-}{e}{ë}l
-be-zi{-}{e}{ë}n
-vl{a-}{}{aa}tje
-sk{i-}{}{ie}tje
-op{a-}{}{aa}tje
-ge{-}{u}{ü}rmd
-ge{-}{e}{ë}g-de
-be{-}{i}{ï}nkt
-be{-}{e}{ë}rft
-be{-}{e}{ë}dig
-ge{-}{i}{ï}n-de
-cre{-}{e}{ë}er
-ge{-}{e}{ë}n-te
-ru{-}{i}{ï}-nes
-vree{-}{e}{ë}n
-re{-}{e}{ë}-ler
-ca-f{é-}{}{ee}tje
-fo-t{o-}{}{oo}tje
-ge{-}{e}{ë}is-te
-be-h{a-}{}{aa}tje
-pri{-}{e}{ë}-len
-the{-}{i}{ï}s-me
-ter-ri{-}{e}{ë}r
-su{-}{i}{ï}-ci-de
-stu-di{-}{e}{ë}n
-spe-ci{-}{e}{ë}n
-sau-ri{-}{e}{ë}r
-re{-}{u}{ü}-nies
-re-li{-}{e}{ë}fs
-pin-gu{-}{i}{ï}n
-pi{-}{e}{ë}-teit
-pa-ti{-}{e}{ë}nt
-or-gie{-}{e}{ë}n
-mo-za{-}{i}{ï}ek
-ma-nie{-}{e}{ë}n
-ko-pie{-}{e}{ë}n
-hy-gi{-}{e}{ë}-ne
-he-ro{-}{i}{ï}-ne
-ge{-}{e}{ë}rf-de
-ge{-}{e}{ë}er-de
-co-ca{-}{i}{ï}-ne
-cli{-}{e}{ë}n-te
-ca-fe{-}{i}{ï}-ne
-be{-}{e}{ë}digd
-si-l{o-}{}{oo}tje
-au-t{o-}{}{oo}tje
-Is-ra{-}{e}{ë}-li
-kmo{-}{}{–}er
-hbo{-}{}{–}er
-ftp{-}{}{–}de
-ta-c{o-}{}{oo}tje
-pc{-}{}{–}tje
-ftp{-}{}{–}en
-Sy-ri{-}{e}{ë}rs
-Ibe-ri{-}{e}{ë}r
-sms{-}{}{–}te
-owee{-}{e}{ë}rs
-na{-}{i}{ï}efst
-ma-m{a-}{}{aa}tje
-ki-w{i-}{}{ie}tje
-ka-n{o-}{}{oo}tje
-jo-j{o-}{}{oo}tje
-ide{-}{e}{ë}-ler
-hts{-}{}{–}er
-fu-g{a-}{}{aa}tje
-ech{o-}{}{oo}tje
-ca-su{-}{i}{ï}st
-Tri{-}{e}{ë}sts
-Swa-zi{-}{e}{ë}r
-SGP{-}{}{–}er
-Hen-ri{-}{e}{ë}t
-Ca{-}{i}{ï}-root
-Ca-ra{-}{i}{ï}eb
-Bak-oe{-}{e}{ë}r
-gi-r{o-}{}{oo}tje
-IT{-}{}{–}ers
-A4{-}{}{–}tje
-Ga-bri{-}{e}{ë}l
-me-n{u-}{}{uu}tje
-PSV{-}{}{–}er
-NSB{-}{}{–}er
-in-ge{-}{e}{ë}nt
-VVD{-}{}{–}er
-tbs{-}{}{–}er
-sms{-}{}{–}je
-di{-}{e}{ë}-tiek
-Bos-ni{-}{e}{ë}r
-ju-da{-}{i}{ï}-ca
-fo-bie{-}{e}{ë}n
-ma{-}{i}{ï}s-pap
-tra-li{-}{e}{ë}n
-tri-du{-}{u}{ü}m
-tri{-}{e}{ë}-ren
-uni{-}{e}{ë}-ren
-ta-o{-}{i}{ï}s-me
-ir-re{-}{e}{ë}-le
-sta-ti{-}{e}{ë}n
-sto{-}{i}{ï}sch
-sec-ti{-}{e}{ë}n
-se-ri{-}{e}{ë}-le
-Ser-vi{-}{e}{ë}r
-smeu{-}{i}{ï}ge
-spa-ni{-}{e}{ë}l
-schee{-}{e}{ë}n
-sms{-}{}{–}en
-ru{-}{i}{ï}-neus
-sca-bi{-}{e}{ë}s
-re{-}{u}{ü}-nist
-pi{-}{e}{ë}-tist
-po{-}{e}{ë}-ti-ca
-po{-}{e}{ë}-tiek
-Gal-li{-}{e}{ë}r
-na{-}{i}{ï}e-ver
-na-wee{-}{e}{ë}n
-neu-ri{-}{e}{ë}n
-oblie{-}{e}{ë}n
-In-di{-}{e}{ë}rs
-Ira-ni{-}{e}{ë}r
-ir-re{-}{e}{ë}el
-je-zu{-}{i}{ï}et
-ka-dee{-}{e}{ë}n
-ka-no{-}{e}{ë}rs
-ma-gi{-}{e}{ë}rs
-ma{-}{i}{ï}-ze-na
-man-di{-}{e}{ë}n
-ma-o{-}{i}{ï}s-me
-mis-si{-}{e}{ë}n
-di{-}{e}{ë}-tist
-dru{-}{i}{ï}-den
-ego{-}{i}{ï}s-me
-ego{-}{i}{ï}s-te
-fac-ti{-}{e}{ë}n
-fee{-}{e}{ë}-rie
-flu{-}{i}{ï}-dum
-ge{-}{e}{ë}m-mer
-ge{-}{e}{ë}t-ter
-ge-nie{-}{e}{ë}n
-gla-ri{-}{e}{ë}n
-glo-ri{-}{e}{ë}n
-gra-ti{-}{e}{ë}n
-he-ro{-}{i}{ï}ek
-ho-bo{-}{i}{ï}st
-hos-ti{-}{e}{ë}n
-de{-}{i}{ï}s-ten
-cre{-}{e}{ë}-ren
-da-da{-}{i}{ï}st
-da-na{-}{i}{ï}-de
-ca-mee{-}{e}{ë}n
-ca-se{-}{i}{ï}-ne
-co-de{-}{i}{ï}-ne
-co{-}{i}{ï}-taal
-athe{-}{i}{ï}st
-At-jee{-}{e}{ë}r
-be{-}{e}{ë}rf-de
-be{-}{e}{ë}r-ven
-be-oli{-}{e}{ë}n
-Be-o-ti{-}{e}{ë}r
-tu-t{u-}{}{uu}tje
-ma{-}{i}{ï}s-kip
-To-ki-o{-}{e}{ë}r
-sta-di{-}{e}{ë}n
-Li-bi{-}{e}{ë}rs
-Sa-u-di{-}{e}{ë}r
-AOW{-}{}{–}er
-Mat-te{-}{u}{ü}s
-Apu-li{-}{e}{ë}r
-co-l{a-}{}{aa}tje
-ac-c{u-}{}{uu}tje
-tru{-}{i}{ï}s-me
-la-m{a-}{}{aa}tje
-Mi-cha{-}{e}{ë}l
-Ka{-}{i}{ï}-root
-BN{-}{}{–}ers
-queue{-}{e}{ë}n
-ee-g{a-}{}{aa}tje
-CDA{-}{}{–}er
-echo{-}{e}{ë}nd
-vwo{-}{}{–}er
-lo-g{o-}{}{oo}tje
-WAO{-}{}{–}er
-ME{-}{}{–}ers
-ha-vo{-}{e}{ë}rs
-de-m{o-}{}{oo}tje
-Quito{-}{e}{ë}r
-no-t{a-}{}{aa}tje
-SS{-}{}{–}ers
-Bel-gi{-}{e}{ë}s
-ij{-}{}{–}tje
-bin-go{-}{e}{ë}n
-lo-g{é-}{}{ee}tje
-Za{-}{i}{ï}-rees
-ho-b{o-}{}{oo}tje
-Ven-lo{-}{e}{ë}r
-Um-bri{-}{e}{ë}r
-D66{-}{}{–}er
-fa{-}{e}{ë}-tons
-ba-b{a-}{}{aa}tje
-vl{a-}{}{aa}tjes
-to-k{o-}{}{oo}tje
-to-g{a-}{}{aa}tje
-tax{i-}{}{ie}tje
-sp{a-}{}{aa}tjes
-so-l{o-}{}{oo}tje
-so-f{a-}{}{aa}tje
-sk{i-}{}{ie}tjes
-sa-t{é-}{}{ee}tje
-ru{-}{i}{ï}-neer
-re{-}{e}{ë}elst
-po{-}{e}{ë}ma-ta
-op{a-}{}{aa}tjes
-mum-mi{-}{e}{ë}n
-me-m{o-}{}{oo}tje
-li{-}{e}{ë}er-de
-ge{-}{i}{ï}nk-te
-ge{-}{e}{ë}zeld
-du-{o-}{}{oo}tjes
-be{-}{i}{ï}nk-te
-be{-}{e}{ë}digt
-ge{-}{e}{ë}ts-te
-re{-}{e}{ë}-le-re
-SP{-}{}{–}ers
-ru-zi{-}{e}{ë}nd
-cd{-}{}{–}tje
-tri-{o-}{}{oo}tje
-tv{-}{}{–}tje
-cre{-}{e}{ë}ert
-om{a-}{}{aa}tjes
-pa-p{a-}{}{aa}tje
-ade-no{-}{i}{ï}-de
-ab-lu-ti{-}{e}{ë}n
-the{-}{i}{ï}s-ten
-sal-v{o-}{}{oo}tje
-pyg-mee{-}{e}{ë}n
-ra-di-{o-}{}{oo}tje
-ge{-}{e}{ë}r-gerd
-tro-fee{-}{e}{ë}n
-ter-ri{-}{e}{ë}rs
-sau-ri{-}{e}{ë}rs
-quo-ti{-}{e}{ë}nt
-pin-gu{-}{i}{ï}ns
-pa-ti{-}{e}{ë}n-te
-li-ni{-}{e}{ë}-ren
-lin-gu{-}{i}{ï}st
-ko-pi{-}{e}{ë}-ren
-ko-lo-ni{-}{e}{ë}n
-ju-da{-}{i}{ï}s-me
-gra-fie{-}{e}{ë}n
-ge-vree{-}{e}{ë}n
-ge{-}{e}{ë}i-gend
-cli{-}{e}{ë}n-ten
-bi{-}{e}{ë}n-na-le
-be{-}{e}{ë}dig-de
-be-doe{-}{i}{ï}en
-mas-s{a-}{}{aa}tje
-re-gi-{o-}{}{oo}tje
-agra-ri{-}{e}{ë}r
-al-tru{-}{i}{ï}st
-am-bi{-}{e}{ë}-ren
-Tu-ne-si{-}{e}{ë}r
-ima-g{o-}{}{oo}tje
-fa-ra-{o-}{}{oo}tje
-cor-s{o-}{}{oo}tje
-air-c{o-}{}{oo}tje
-tra-c{é-}{}{ee}tje
-iro-nie{-}{e}{ë}n
-ge{-}{e}{ë}m-merd
-PvdA{-}{}{–}er
-tv{-}{}{–}loos
-scho-li{-}{e}{ë}n
-nu-tri{-}{e}{ë}nt
-ma{-}{i}{ï}s-koek
-las-s{o-}{}{oo}tje
-kom-m{a-}{}{aa}tje
-jum-b{o-}{}{oo}tje
-exe-qui{-}{e}{ë}n
-cou-p{é-}{}{ee}tje
-cor-vee{-}{e}{ë}r
-be{-}{i}{ï}nk-ten
-be{-}{e}{ë}r-ving
-an-dro{-}{i}{ï}-de
-Vo-gezi{-}{e}{ë}r
-Tsja-di{-}{e}{ë}r
-Tri{-}{e}{ë}s-ter
-Sil-ezi{-}{e}{ë}r
-Si-be-ri{-}{e}{ë}r
-PvdV{-}{}{–}er
-Ot-ta-wa{-}{e}{ë}r
-Oce-a-ni{-}{e}{ë}r
-Na-mi-bi{-}{e}{ë}r
-Mo-ra-vi{-}{e}{ë}r
-Ma-la-wi{-}{e}{ë}r
-Li-gu-ri{-}{e}{ë}r
-Hei-loo{-}{e}{ë}r
-Gui-nee{-}{e}{ë}r
-Goe-ree{-}{e}{ë}r
-Ge-nepi{-}{e}{ë}n
-Er-me-lo{-}{e}{ë}r
-Ca-na-ri{-}{e}{ë}r
-Al-me-lo{-}{e}{ë}r
-neu-ri{-}{e}{ë}nd
-NSB{-}{}{–}ers
-Ko-lo-ni{-}{e}{ë}n
-abc{-}{}{–}tje
-ge{-}{e}{ë}n-terd
-fir-m{a-}{}{aa}tje
-A4{-}{}{–}tjes
-hbo{-}{}{–}ers
-Ge-or-gi{-}{e}{ë}r
-Ma-ri{-}{e}{ë}l-le
-WAO{-}{}{–}ers
-CDA{-}{}{–}ers
-AOW{-}{}{–}ers
-EHBO{-}{}{–}er
-VVD{-}{}{–}ers
-sms{-}{}{–}jes
-sur-re{-}{e}{ë}-le
-tbs{-}{}{–}ers
-Ibe-ri{-}{e}{ë}rs
-jet-ski{-}{e}{ë}n
-ma{-}{i}{ï}s-olie
-Sa-oe-di{-}{e}{ë}r
-So-ma-li{-}{e}{ë}r
-Bos-ni{-}{e}{ë}rs
-kaf-ka{-}{e}{ë}sk
-olym-pi{-}{e}{ë}r
-vi-gi-li{-}{e}{ë}n
-snij-ma{-}{i}{ï}s
-tri-du{-}{u}{ü}ms
-uto-pie{-}{e}{ë}n
-va-ca-ti{-}{e}{ë}n
-va-ri{-}{e}{ë}-ren
-sur-re{-}{e}{ë}el
-taxa-ti{-}{e}{ë}n
-ma-o{-}{i}{ï}s-ten
-ste-ro{-}{i}{ï}-de
-sto{-}{i}{ï}-cijn
-sto{-}{i}{ï}-sche
-Ser-vi{-}{e}{ë}rs
-sfe-ro{-}{i}{ï}-de
-spa-ni{-}{e}{ë}ls
-scha-li{-}{e}{ë}n
-ru{-}{i}{ï}-ne-ren
-ru{-}{i}{ï}-neust
-ru{-}{i}{ï}-neu-ze
-re-ga-li{-}{e}{ë}n
-re-li-gi{-}{e}{ë}n
-roe-koe{-}{e}{ë}n
-rom-bo{-}{i}{ï}-de
-di-plo{-}{i}{ï}-de
-pe-ti-ti{-}{e}{ë}n
-pi{-}{e}{ë}-tis-me
-po{-}{e}{ë}-tisch
-prai-ri{-}{e}{ë}n
-pro-te{-}{i}{ï}-ne
-pro-za{-}{i}{ï}st
-al-ka-li{-}{e}{ë}n
-Ar-me-ni{-}{e}{ë}r
-do-mi-no{-}{e}{ë}n
-Gal-li{-}{e}{ë}rs
-mos-kee{-}{e}{ë}n
-mo-za{-}{i}{ï}sch
-ne-gro{-}{i}{ï}-de
-oc-ta{-}{e}{ë}-der
-Oe-kra{-}{i}{ï}-ne
-op-tree{-}{e}{ë}n
-ini-ti{-}{e}{ë}-le
-in-tu{-}{i}{ï}-tie
-Ira-ni{-}{e}{ë}rs
-la{-}{i}{ï}-cis-me
-ma{-}{i}{ï}s-kolf
-ma{-}{i}{ï}s-meel
-ma-te-ri{-}{e}{ë}n
-de-vi{-}{e}{ë}-ren
-di{-}{e}{ë}-tis-te
-ego{-}{i}{ï}s-ten
-ele-gie{-}{e}{ë}n
-epo-pee{-}{e}{ë}n
-fe-ca-li{-}{e}{ë}n
-fee{-}{e}{ë}-riek
-fee{-}{e}{ë}-ries
-fo-li{-}{e}{ë}-ren
-gan-gli{-}{e}{ë}n
-ge-drie{-}{e}{ë}n
-ge-dwee{-}{e}{ë}r
-ge{-}{e}{ë}rf-den
-ge-twee{-}{e}{ë}n
-gra-di{-}{e}{ë}nt
-ha-ci{-}{e}{ë}n-da
-He-bree{-}{e}{ë}n
-He-bree{-}{e}{ë}r
-he-ro{-}{i}{ï}e-ke
-he-ro{-}{i}{ï}sch
-he-ro{-}{i}{ï}s-me
-hexa{-}{e}{ë}-der
-ijs-zee{-}{e}{ë}n
-in-di-ci{-}{e}{ë}n
-cre{-}{e}{ë}er-de
-da-da{-}{i}{ï}s-me
-ci-bo-ri{-}{e}{ë}n
-cof-fe{-}{i}{ï}-ne
-co{-}{i}{ï}-te-ren
-col-lo{-}{i}{ï}-de
-ar-te-ri{-}{e}{ë}n
-athe{-}{i}{ï}s-me
-At-jee{-}{e}{ë}rs
-be{-}{e}{ë}di-gen
-Be-o-ti{-}{e}{ë}rs
-ha-de{-}{i}{ï}-cum
-Ara-mee{-}{e}{ë}r
-col-l{i-}{}{ie}tje
-Sa-u-di{-}{e}{ë}rs
-ge{-}{e}{ë}t-terd
-ge{-}{e}{ë}f-fend
-Mat-the{-}{u}{ü}s
-tro-pee{-}{e}{ë}n
-Ma-ri{-}{e}{ë}t-te
-usan-ti{-}{e}{ë}n
-par-ti{-}{e}{ë}-le
-al-li{-}{e}{ë}-ren
-qui{-}{e}{ë}-tist
-ca-vi-{a-}{}{aa}tje
-ba-ha{-}{i}{ï}s-me
-Ar-te-si{-}{e}{ë}r
-mi-cr{o-}{}{oo}tje
-he-bra{-}{i}{ï}-ca
-Ca-ra{-}{i}{ï}-ben
-PvdD{-}{}{–}er
-gla-c{é-}{}{ee}tje
-cell{o-}{}{oo}tje
-cy-clo{-}{i}{ï}-de
-dra-m{a-}{}{aa}tje
-cor-vee{-}{e}{ë}n
-Ha-ri{-}{e}{ë}t-te
-pa-ri-{a-}{}{aa}tje
-ge{-}{e}{ë}chood
-ma{-}{i}{ï}s-land
-Ha{-}{i}{ï}-ti-aan
-Da-ni{-}{e}{ë}l-le
-pap-p{a-}{}{aa}tje
-jet-ski{-}{e}{ë}r
-ma{-}{i}{ï}s-veld
-tra-vee{-}{e}{ë}n
-he-bra{-}{i}{ï}st
-ze-br{a-}{}{aa}tje
-vil-l{a-}{}{aa}tje
-vi-de-{o-}{}{oo}tje
-tre-m{a-}{}{aa}tje
-to-k{o-}{}{oo}tjes
-to-g{a-}{}{aa}tjes
-the-m{a-}{}{aa}tje
-ta-toe{-}{e}{ë}er
-so-l{o-}{}{oo}tjes
-so-f{a-}{}{aa}tjes
-smeu{-}{i}{ï}gst
-ru{-}{i}{ï}-neert
-re-ç{u-}{}{uu}tje
-pol-k{a-}{}{aa}tje
-poe-m{a-}{}{aa}tje
-pin-d{a-}{}{aa}tje
-pi-a-n{o-}{}{oo}tje
-pa-p{a-}{}{aa}tjes
-ope-r{a-}{}{aa}tje
-no-t{a-}{}{aa}tjes
-me-m{o-}{}{oo}tjes
-ka-n{o-}{}{oo}tjes
-jo-j{o-}{}{oo}tjes
-in-ge{-}{e}{ë}rfd
-fu-g{a-}{}{aa}tjes
-ech{o-}{}{oo}tjes
-ca-f{é-}{}{ee}tjes
-cac-tee{-}{e}{ë}n
-be{-}{e}{ë}rf-den
-alo{-}{e}{ë}–s
-af-ge{-}{e}{ë}ist
-ac-c{u-}{}{uu}tjes
-be{-}{e}{ë}in-dig
-PSV{-}{}{–}ers
-lo-g{é-}{}{ee}tjes
-ki-l{o-}{}{oo}tjes
-SGP{-}{}{–}ers
-bv{-}{}{–}tjes
-mbo{-}{}{–}ers
-me-n{u-}{}{uu}tjes
-tri-{o-}{}{oo}tjes
-D66{-}{}{–}ers
-op-ge{-}{e}{ë}ist
-weg-ge{-}{e}{ë}bd
-ge{-}{u}{ü}p-load
-smeu{-}{i}{ï}ger
-aard-oli{-}{e}{ë}n
-atro-fie{-}{e}{ë}n
-in-sig-ni{-}{e}{ë}n
-hy-gi{-}{e}{ë}-nist
-ca-me-r{a-}{}{aa}tje
-be{-}{i}{ï}n-vloed
-va-ri{-}{e}{ë}-teit
-the-o-rie{-}{e}{ë}n
-spa-ti{-}{e}{ë}-ren
-so-ci{-}{e}{ë}-teit
-pa-ti{-}{e}{ë}n-tie
-pa-ti{-}{e}{ë}n-ten
-pa-ro-chi{-}{e}{ë}n
-of-fi-ci{-}{e}{ë}-le
-me-lo-die{-}{e}{ë}n
-ma-te-ri{-}{e}{ë}-le
-ju-di-ci{-}{e}{ë}-le
-je-zu{-}{i}{ï}e-ten
-in-tu{-}{i}{ï}-tief
-ge{-}{e}{ë}i-gen-de
-ga-le-rie{-}{e}{ë}n
-fi-nan-ci{-}{e}{ë}n
-ef-fi-ci{-}{e}{ë}nt
-con-ci{-}{e}{ë}r-ge
-com-mu-ni{-}{e}{ë}n
-ca-lo-rie{-}{e}{ë}n
-bac-te-ri{-}{e}{ë}n
-au-di{-}{e}{ë}n-tie
-aca-de-mi{-}{e}{ë}n
-pa-ti{-}{e}{ë}n-tje
-agra-ri{-}{e}{ë}rs
-ali{-}{e}{ë}-na-tie
-al-ka-lo{-}{i}{ï}-de
-al-tru{-}{i}{ï}s-me
-am-fi-bie{-}{e}{ë}n
-an-nu{-}{i}{ï}-teit
-em-bo-lie{-}{e}{ë}n
-co{-}{i}{ï}-teer-de
-pon-ch{o-}{}{oo}tje
-plis-s{é-}{}{ee}tje
-sal-vi-{a-}{}{aa}tje
-pa-pa-j{a-}{}{aa}tje
-ma-ri-n{a-}{}{aa}tje
-yaht-zee{-}{e}{ë}n
-So-ma-li{-}{e}{ë}rs
-Ka-na{-}{a}{ä}-niet
-zalf-oli{-}{e}{ë}n
-tro-chee{-}{e}{ë}n
-tran-si{-}{e}{ë}nt
-si-nus-o{-}{i}{ï}-de
-prul-po{-}{e}{ë}et
-po-ny{-}{}{–}tje
-ki-mo-n{o-}{}{oo}tje
-ex-po-s{é-}{}{ee}tje
-eva-cu{é-}{}{ee}tje
-cli-ch{é-}{}{ee}tje
-bi-ki-n{i-}{}{ie}tje
-ali{-}{e}{ë}-neert
-agen-d{a-}{}{aa}tje
-aan-ge{-}{e}{ë}rfd
-Mal-di-vi{-}{e}{ë}r
-Hen-ge-lo{-}{e}{ë}r
-Ha{-}{i}{ï}-ti-aans
-Ca-la-bri{-}{e}{ë}r
-Bree{-}{e}{ë}-naar
-vuur-zee{-}{e}{ë}n
-pa-ti{-}{e}{ë}n-tes
-Eritree{-}{e}{ë}r
-mys-te-ri{-}{e}{ë}n
-Py-re-nee{-}{e}{ë}n
-Hen-ri{-}{e}{ë}t-te
-Oek-ra{-}{i}{ï}-ner
-Ethio-pi{-}{e}{ë}r
-be{-}{e}{ë}in-digd
-idee{-}{e}{ë}n-man
-Sa-oe-di{-}{e}{ë}rs
-ha-wa{-}{i}{ï}hemd
-Jor-da-ni{-}{e}{ë}r
-Eu-ro-pee{-}{e}{ë}r
-fa-ri-zee{-}{e}{ë}n
-ar-te-ri{-}{e}{ë}-le
-kaf-ka{-}{e}{ë}s-ke
-verf-oli{-}{e}{ë}n
-jet-ski{-}{e}{ë}rs
-idee{-}{e}{ë}-loos
-wee{-}{i}{ï}g-heid
-ma{-}{i}{ï}s-plant
-te-tra{-}{e}{ë}-der
-ti{-}{e}{ë}r-ce-ren
-tra-chee{-}{e}{ë}n
-tra-ge-di{-}{e}{ë}n
-tri{-}{e}{ë}n-na-le
-twee{-}{e}{ë}r-lei
-uni-ta-ri{-}{e}{ë}r
-su{-}{i}{ï}-ci-daal
-su{-}{i}{ï}-ci-da-le
-ta-toe{-}{e}{ë}-ren
-ste-ro{-}{i}{ï}-den
-sto{-}{i}{ï}-cijns
-sto{-}{i}{ï}-cis-me
-idee{-}{e}{ë}-lo-ze
-schi-zo{-}{i}{ï}-de
-sek-ta-ri{-}{e}{ë}r
-sfe-ro{-}{i}{ï}-den
-sham-poo{-}{e}{ë}n
-si-tu-a-ti{-}{e}{ë}n
-slag-zee{-}{e}{ë}n
-so-le-no{-}{i}{ï}-de
-spo-li{-}{e}{ë}-ren
-spon-dee{-}{e}{ë}n
-ru{-}{i}{ï}-neer-de
-re{-}{u}{ü}-nis-ten
-re{-}{u}{ü}s-se-ren
-rom-bo{-}{i}{ï}-den
-pa-tri-ci{-}{e}{ë}r
-pen-ta{-}{e}{ë}-der
-pers-wee{-}{e}{ë}n
-pi{-}{e}{ë}-de-stal
-pla-gi{-}{e}{ë}-ren
-po{-}{e}{ë}tas-ter
-po{-}{e}{ë}ti-caal
-po{-}{e}{ë}-ti-sche
-po-li-ti{-}{e}{ë}-le
-pool-zee{-}{e}{ë}n
-pre-fa-ti{-}{e}{ë}n
-pro-te{-}{i}{ï}-nen
-pro-to-zo{-}{e}{ë}n
-pro-to-zo{-}{o}{ö}n
-pro-za{-}{i}{ï}sch
-qui{-}{e}{ë}-tis-me
-rand-zee{-}{e}{ë}n
-re-cep-ti{-}{e}{ë}n
-re-ci-pi{-}{e}{ë}nt
-re-cre{-}{e}{ë}-ren
-Ar-me-ni{-}{e}{ë}rs
-pa-ra-no{-}{i}{ï}de
-pa-ro-die{-}{e}{ë}n
-mo-za{-}{i}{ï}e-ken
-mo-za{-}{i}{ï}-sche
-na{-}{i}{ï}-ve-teit
-na{-}{i}{ï}-vi-teit
-na-zi-ree{-}{e}{ë}r
-ni{-}{e}{ë}l-le-ren
-no-ta-ri{-}{e}{ë}-le
-oc-ta{-}{e}{ë}-ders
-odys-see{-}{e}{ë}n
-Oe-kra{-}{i}{ï}ens
-on-be{-}{e}{ë}digd
-opi-ni{-}{e}{ë}-ren
-ori{-}{e}{ë}n-taal
-ou-bli{-}{e}{ë}t-te
-pa-leo-zo{-}{e}{ë}n
-pa-na-cee{-}{e}{ë}n
-pan-the{-}{i}{ï}st
-ini-ti{-}{e}{ë}-ren
-in-tro{-}{i}{ï}-tus
-in-tu{-}{i}{ï}-ties
-Is-ra{-}{e}{ë}-liet
-jin-go{-}{i}{ï}s-me
-li-ta-nie{-}{e}{ë}n
-ma{-}{i}{ï}s-oogst
-Ma-lei-si{-}{e}{ë}r
-ma-ni{-}{e}{ë}-rist
-me-di{-}{e}{ë}-vist
-di{-}{e}{ë}-tis-ten
-di{-}{e}{ë}-tis-tes
-dou-a-rie{-}{e}{ë}n
-drie{-}{e}{ë}r-lei
-ele-va-ti{-}{e}{ë}n
-en-de-mie{-}{e}{ë}n
-ener-gie{-}{e}{ë}n
-ex-pe-di{-}{e}{ë}nt
-fa-ri-zee{-}{e}{ë}r
-fee{-}{e}{ë}-rie-ke
-fun-da-ti{-}{e}{ë}n
-ge{-}{u}{ü}ni-eerd
-glo-ri{-}{e}{ë}-ren
-gra-ti{-}{e}{ë}-ren
-haar-oli{-}{e}{ë}n
-he-bra{-}{i}{ï}s-me
-He-bree{-}{e}{ë}rs
-Hel-ve-ti{-}{e}{ë}r
-he-re-sie{-}{e}{ë}n
-he-ro{-}{i}{ï}-sche
-hexa{-}{e}{ë}-ders
-his-to-ri{-}{e}{ë}n
-ho-bo{-}{i}{ï}s-ten
-ho-mi-lie{-}{e}{ë}n
-idee{-}{e}{ë}n-bus
-con-ti-nu{-}{u}{ü}m
-co{-}{o}{ö}p-ta-tie
-co{-}{o}{ö}p-te-ren
-co-ry-fee{-}{e}{ë}n
-co-te-rie{-}{e}{ë}n
-da-da{-}{i}{ï}s-ten
-dag-le-li{-}{e}{ë}n
-dal-ma-ti{-}{e}{ë}r
-de-fi-ci{-}{e}{ë}nt
-bron-chi{-}{e}{ë}n
-Chal-dee{-}{e}{ë}n
-Chal-dee{-}{e}{ë}r
-cli{-}{e}{ë}n-teel
-col-lo{-}{i}{ï}-den
-con-ci-li{-}{e}{ë}n
-con-di-ti{-}{e}{ë}n
-ar-cha{-}{i}{ï}sch
-ar-cha{-}{i}{ï}s-me
-as-te-ro{-}{i}{ï}-de
-athe{-}{i}{ï}s-ten
-aus-pi-ci{-}{e}{ë}n
-ba-ro-nie{-}{e}{ë}n
-be{-}{e}{ë}di-ging
-bob-slee{-}{e}{ë}n
-ma{-}{i}{ï}s-brood
-EHBO{-}{}{–}ers
-mo-no-die{-}{e}{ë}n
-tai-chi{-}{e}{ë}n
-Pa-poe-{a-}{}{aa}tje
-high-tea{-}{e}{ë}n
-Ma-ri{-}{e}{ë}n-bad
-vm-bo{-}{}{–}ers
-va-cu{-}{u}{ü}m-pan
-Jak-ar-ta{-}{e}{ë}r
-fee{-}{e}{ë}n-land
-ali{-}{e}{ë}-ne-ren
-co{-}{o}{ö}-pe-rant
-diep-zee{-}{e}{ë}n
-Kauk-asi{-}{e}{ë}r
-ge{-}{e}{ë}in-digd
-fre-si-{a-}{}{aa}tje
-ar-cha{-}{i}{ï}-cum
-Sar-di-ni{-}{e}{ë}r
-bis-tr{o-}{}{oo}tje
-bob-slee{-}{e}{ë}r
-bo-le-r{o-}{}{oo}tje
-Pi-car-di{-}{e}{ë}r
-co-mi-t{é-}{}{ee}tje
-PvdA{-}{}{–}ers
-Mon-go-li{-}{e}{ë}r
-cor-vee{-}{e}{ë}rs
-Py-re-nee{-}{e}{ë}r
-ca-na-p{é-}{}{ee}tje
-ca-su{-}{i}{ï}s-ten
-ce-ta-cee{-}{e}{ë}n
-cu-pi-d{o-}{}{oo}tje
-cy-clo{-}{i}{ï}-den
-am-fo-r{a-}{}{aa}tje
-dy-na-m{o-}{}{oo}tje
-de-cen-ni{-}{e}{ë}n
-shin-to{-}{i}{ï}st
-ru{-}{i}{ï}-ne-stad
-fris-bee{-}{e}{ë}n
-ma-de-r{a-}{}{aa}tje
-ko-pi{-}{e}{ë}-ring
-di{-}{e}{ë}-te-tiek
-aca-ci-{a-}{}{aa}tje
-ma{-}{i}{ï}s-teelt
-Ana-to-li{-}{e}{ë}r
-be{-}{e}{ë}l-ze-bub
-li-do-ca{-}{i}{ï}-ne
-Mol-da-vi{-}{e}{ë}r
-ge-cre{-}{e}{ë}erd
-ma{-}{i}{ï}s-ak-ker
-ka{-}{i}{ï}ns-merk
-Ara-mee{-}{e}{ë}rs
-olym-pi{-}{e}{ë}rs
-zee-le-li{-}{e}{ë}n
-ze-br{a-}{}{aa}tjes
-zand-zee{-}{e}{ë}n
-vil-l{a-}{}{aa}tjes
-tre-m{a-}{}{aa}tjes
-the-m{a-}{}{aa}tjes
-ta-toe{-}{e}{ë}ert
-smeu{-}{i}{ï}g-ste
-smeu{-}{i}{ï}ge-re
-re-ç{u-}{}{uu}tjes
-re-su-m{é-}{}{ee}tje
-py-ja-m{a-}{}{aa}tje
-pol-k{a-}{}{aa}tjes
-poe-m{a-}{}{aa}tjes
-pin-d{a-}{}{aa}tjes
-pi-a-n{o-}{}{oo}tjes
-par-ti{-}{e}{ë}-ler
-pa-gi-n{a-}{}{aa}tje
-ori{-}{e}{ë}n-teer
-ope-r{a-}{}{aa}tjes
-ko-pi{-}{e}{ë}er-de
-kom-m{a-}{}{aa}tjes
-jum-b{o-}{}{oo}tjes
-gs-m{-}{}{–}etje
-ge{-}{u}{ü}p-loade
-ge{-}{e}{ë}n-ter-de
-ge{-}{e}{ë}f-fen-de
-fir-m{a-}{}{aa}tjes
-dra-m{a-}{}{aa}tjes
-cou-p{é-}{}{ee}tjes
-be{-}{e}{ë}dig-den
-bed-stee{-}{e}{ë}n
-aza-le-{a-}{}{aa}tje
-PvdV{-}{}{–}ers
-PvdD{-}{}{–}ers
-sche-m{a-}{}{aa}tje
-weg-ge{-}{e}{ë}b-de
-ra-di-{o-}{}{oo}tjes
-co{-}{o}{ö}p-teert
-cre{-}{e}{ë}er-den
-pro-te{-}{i}{ï}-nes
-op-ge{-}{e}{ë}is-te
-stu-di-{o-}{}{oo}tje
-ge{-}{e}{ë}r-ger-de
-ri-si-c{o-}{}{oo}tje
-ba-by{-}{}{–}tje
-ex-tr{a-}{}{aa}tjes
-be{-}{e}{ë}in-digt
-va-ri{-}{e}{ë}-rend
-ru{-}{i}{ï}-neu-zer
-ge{-}{u}{ü}p-da-tet
-ac-tu-a-ri{-}{e}{ë}-le
-abi-tu-ri{-}{e}{ë}nt
-an-tro-po{-}{i}{ï}-de
-souf-fl{é-}{}{ee}tje
-im-mo-bi-li{-}{e}{ë}n
-hy-gi{-}{e}{ë}-nis-te
-hy-gi{-}{e}{ë}-nisch
-ge-cre{-}{e}{ë}er-de
-ge{-}{e}{ë}-ve-naard
-de-fi-ni{-}{e}{ë}-ren
-Po-ly-ne-si{-}{e}{ë}r
-em-ploy{é-}{}{ee}tje
-the-ra-pie{-}{e}{ë}n
-the{-}{i}{ï}s-tisch
-suf-fi-ci{-}{e}{ë}nt
-spa-ti{-}{e}{ë}-ring
-re-li-kwie{-}{e}{ë}n
-quo-ti{-}{e}{ë}n-ten
-pro-vin-ci{-}{e}{ë}n
-pa-tri-ci{-}{e}{ë}rs
-ori{-}{e}{ë}n-te-ren
-ori{-}{e}{ë}n-ta-tie
-on-der-zee{-}{e}{ë}r
-mo-no-po-li{-}{e}{ë}n
-in-tu{-}{i}{ï}-tie-ve
-in-gre-di{-}{e}{ë}nt
-ge{-}{i}{ï}so-leerd
-fi-nan-ci{-}{e}{ë}-le
-fan-ta-sie{-}{e}{ë}n
-es-sen-ti{-}{e}{ë}-le
-epi-de-mie{-}{e}{ë}n
-ef-fi-ci{-}{e}{ë}n-te
-eco-no-mie{-}{e}{ë}n
-co{-}{o}{ö}r-di-naat
-co{-}{o}{ö}-pe-ra-tie
-con-ve-ni{-}{e}{ë}nt
-ce-re-mo-ni{-}{e}{ë}n
-ca-su{-}{i}{ï}s-tiek
-be-doe{-}{i}{ï}e-nen
-bac-te-ri{-}{e}{ë}-le
-as-te-ro{-}{i}{ï}-den
-al-ler-gie{-}{e}{ë}n
-af-fi-li{-}{e}{ë}-ren
-ali{-}{e}{ë}-na-ties
-al-ka-lo{-}{i}{ï}-den
-al-tru{-}{i}{ï}s-ten
-am-nes-tie{-}{e}{ë}n
-ana-lo-gie{-}{e}{ë}n
-ano-ma-lie{-}{e}{ë}n
-Is-ra{-}{e}{ë}-lisch
-to-ver-fee{-}{e}{ë}n
-dwars-zee{-}{e}{ë}n
-trap-tree{-}{e}{ë}n
-op-ge-vree{-}{e}{ë}n
-hand-knie{-}{e}{ë}n
-si{-}{e}{ë}r-ra–s
-ha-bi-tu-{é-}{}{ee}tje
-ME-pa-ti{-}{e}{ë}nt
-tran-si{-}{e}{ë}n-te
-tand-ca-ri{-}{e}{ë}s
-spo-ran-gi{-}{e}{ë}n
-rê-ve-rie{-}{e}{ë}n
-prik-slee{-}{e}{ë}n
-po-ly-the{-}{i}{ï}st
-mo-no-the{-}{i}{ï}st
-ma-don-n{a-}{}{aa}tje
-kern-idee{-}{e}{ë}n
-gsm{-}{}{–}etjes
-gra-mi-nee{-}{e}{ë}n
-ex-pa-ti{-}{e}{ë}nt
-di-a-bo-l{o-}{}{oo}tje
-cor-ti-co{-}{i}{ï}-de
-con-chy-li{-}{e}{ë}n
-capsa{-}{i}{ï}-ci-ne
-al-ge-bra{-}{i}{ï}st
-Me-la-ne-si{-}{e}{ë}r
-Ma-tâ{-}{}{–}u-tu
-Lom-bar-di{-}{e}{ë}r
-Ka{-}{i}{ï}-ro-tisch
-Karin-thi{-}{e}{ë}r
-En-sche-de{-}{e}{ë}r
-Cu-ra-çao{-}{e}{ë}r
-Ca{-}{i}{ï}-ro-tisch
-Bel-gra-do{-}{e}{ë}r
-ge{-}{e}{ë}ro-deerd
-Ethio-pi{-}{e}{ë}rs
-dy-nas-tie{-}{e}{ë}n
-of-fi-ci{-}{e}{ë}-ren
-Hi{-}{e}{ë}-ro-ny-mus
-nu-tri{-}{e}{ë}n-ten
-ge{-}{e}{ë}ta-leerd
-ma{-}{i}{ï}s-kor-rel
-smeu{-}{i}{ï}g-heid
-re-cre{-}{e}{ë}er-de
-idee{-}{e}{ë}n-leer
-pi{-}{e}{ë}-zo-me-ter
-ma{-}{i}{ï}s-kip-pen
-va-cu{-}{u}{ü}m-glas
-va-cu{-}{u}{ü}m-buis
-Ma-lei-si{-}{e}{ë}rs
-Jor-da-ni{-}{e}{ë}rs
-sad-du-cee{-}{e}{ë}r
-apo-lo-gie{-}{e}{ë}n
-dal-ma-ti{-}{e}{ë}rs
-wa-ter-ski{-}{e}{ë}n
-wa-ter-ski{-}{e}{ë}r
-weeg-bree{-}{e}{ë}n
-ve-ge-ta-ri{-}{e}{ë}r
-ve-ri-fi{-}{e}{ë}-ren
-vic-tu-a-li{-}{e}{ë}n
-temp-ta-ti{-}{e}{ë}n
-te-tra{-}{e}{ë}-ders
-ti{-}{e}{ë}r-ceer-de
-ti{-}{e}{ë}r-ce-ring
-ti-ran-nie{-}{e}{ë}n
-tra-pe-zo{-}{i}{ï}-de
-tri-lo-gie{-}{e}{ë}n
-tro-che{-}{i}{ï}sch
-twee{-}{e}{ë}n-half
-uni-ta-ri{-}{e}{ë}rs
-va-cu{-}{u}{ü}m-lamp
-va-cu{-}{u}{ü}m-pomp
-vak-stu-di{-}{e}{ë}n
-sub-si-di{-}{e}{ë}nt
-sup-pli{-}{e}{ë}-ren
-ta-o{-}{i}{ï}s-tisch
-ta-toe{-}{e}{ë}er-de
-ta-toe{-}{e}{ë}-ring
-sto{-}{i}{ï}-cij-nen
-sto{-}{i}{ï}-cijn-se
-stook-oli{-}{e}{ë}n
-stort-zee{-}{e}{ë}n
-sci{-}{e}{ë}n-tis-me
-sek-ta-ri{-}{e}{ë}rs
-sen-ten-ti{-}{e}{ë}n
-ses-ter-ti{-}{e}{ë}n
-sfe-ro{-}{i}{ï}-daal
-sfe-ro{-}{i}{ï}-da-le
-shin-to{-}{i}{ï}s-me
-so-le-no{-}{i}{ï}-des
-spon-de{-}{i}{ï}sch
-fa-ri-zee{-}{e}{ë}rs
-sca-ra-bee{-}{e}{ë}n
-bob-slee{-}{e}{ë}rs
-sa-la-ri{-}{e}{ë}ren
-sa-tra-pie{-}{e}{ë}n
-re-li{-}{e}{ë}f-druk
-re-me-di{-}{e}{ë}-ren
-reu-ma-to{-}{i}{ï}-de
-re{-}{u}{ü}s-seer-de
-bar-be-cue{-}{e}{ë}n
-ce-no-zo{-}{i}{ï}-cum
-pen-ta{-}{e}{ë}-ders
-per-cep-ti{-}{e}{ë}n
-pla-ne-to{-}{i}{ï}-de
-po{-}{e}{ë}-tas-ters
-po{-}{e}{ë}-ti-se-ren
-pol-le-vie{-}{e}{ë}n
-pro-fe-tie{-}{e}{ë}n
-pro-py-lee{-}{e}{ë}n
-pro-za{-}{i}{ï}-sche
-pro-za{-}{i}{ï}s-ten
-pru-de-rie{-}{e}{ë}n
-rap-so-die{-}{e}{ë}n
-re-bel-lie{-}{e}{ë}n
-re-ci-pi{-}{e}{ë}-ren
-pas-to-rie{-}{e}{ë}n
-pa-ra-no{-}{i}{ï}-cus
-pa-ro-chi{-}{e}{ë}-le
-pa-ro-di{-}{e}{ë}-ren
-mon-go-lo{-}{i}{ï}-de
-na{-}{i}{ï}e-ve-ling
-na-zi-ree{-}{e}{ë}rs
-ne-go-ti{-}{e}{ë}-ren
-ni{-}{e}{ë}l-leer-de
-obe-di{-}{e}{ë}n-tie
-on-be{-}{e}{ë}dig-de
-opi-ni{-}{e}{ë}-rend
-or-chi-dee{-}{e}{ë}n
-ori{-}{e}{ë}n-taals
-ou-bli{-}{e}{ë}t-ten
-pan-de-mie{-}{e}{ë}n
-pan-the{-}{i}{ï}s-me
-In-do-ne-si{-}{e}{ë}r
-in-spec-ti{-}{e}{ë}n
-in-spi-ci{-}{e}{ë}nt
-ja-loe-zie{-}{e}{ë}n
-je-re-mi{-}{e}{ë}-ren
-je-zu{-}{i}{ï}-tisch
-je-zu{-}{i}{ï}-tis-me
-kor-rel-ma{-}{i}{ï}s
-la{-}{i}{ï}-ci-se-ren
-lin-ge-rie{-}{e}{ë}n
-lin-gu{-}{i}{ï}s-ten
-li-tur-gie{-}{e}{ë}n
-ma{-}{i}{ï}s-kol-ven
-ma{-}{i}{ï}s-vel-den
-ma-ni-chee{-}{e}{ë}r
-ma-ni{-}{e}{ë}-ris-me
-ma-o{-}{i}{ï}s-tisch
-ma-te-ri{-}{e}{ë}-ler
-me-di-ta-ti{-}{e}{ë}n
-me-tal-lo{-}{i}{ï}-de
-dia-co-nie{-}{e}{ë}n
-dia-to-mee{-}{e}{ë}n
-di-op-trie{-}{e}{ë}n
-do-de-ca{-}{e}{ë}-der
-do-mi-ci-li{-}{e}{ë}n
-dra-pe-rie{-}{e}{ë}n
-du{-}{u}{ü}m-vi-raat
-ego{-}{i}{ï}s-tisch
-el-lip-so{-}{i}{ï}-de
-evan-ge-li{-}{e}{ë}n
-even-knie{-}{e}{ë}n
-exer-ci-ti{-}{e}{ë}n
-ex-pe-di{-}{e}{ë}-ren
-fa-ri-ze{-}{i}{ï}sch
-fa-ri-ze{-}{i}{ï}s-me
-fox-ter-ri{-}{e}{ë}r
-ge-ni-ta-li{-}{e}{ë}n
-ge-ru{-}{i}{ï}-neerd
-ge{-}{u}{ü}ni-eer-de
-gra-di{-}{e}{ë}n-ten
-grond-zee{-}{e}{ë}n
-har-mo-nie{-}{e}{ë}n
-he-bra{-}{i}{ï}s-men
-Hel-ve-ti{-}{e}{ë}rs
-hi{-}{e}{ë}-rar-chie
-hi{-}{e}{ë}-ra-tisch
-hi{-}{e}{ë}-ro-glief
-hi{-}{e}{ë}-ro-gly-fe
-hin-doe{-}{i}{ï}s-me
-hoog-ge{-}{e}{ë}erd
-co{-}{o}{ö}-pe-ra-tor
-co{-}{o}{ö}-pe-re-ren
-co{-}{o}{ö}p-teer-de
-de-fi-ci{-}{e}{ë}n-te
-bul-ter-ri{-}{e}{ë}r
-cau-se-rie{-}{e}{ë}n
-Chal-dee{-}{e}{ë}rs
-col-lo{-}{i}{ï}-daal
-col-lo{-}{i}{ï}-da-le
-con-ci{-}{e}{ë}r-ges
-ar-cha{-}{i}{ï}-sche
-ar-cha{-}{i}{ï}s-men
-as-so-ci{-}{e}{ë}-ren
-atro-fi{-}{e}{ë}-ren
-au-di{-}{e}{ë}n-ties
-Au-stra-li{-}{e}{ë}r
-bas-re-li{-}{e}{ë}f
-be{-}{e}{ë}in-dig-de
-be{-}{e}{ë}in-di-gen
-be-ne-fi-ci{-}{e}{ë}n
-qui{-}{e}{ë}-tis-ten
-Ki-ri-ba-ti{-}{e}{ë}r
-loem-pi-{a-}{}{aa}tje
-ne-gli-g{é-}{}{ee}tje
-ge{-}{i}{ï}n-ter-net
-me-so-zo{-}{i}{ï}-cum
-ge{-}{e}{ë}-vo-ceerd
-Ca-ra{-}{i}{ï}-bisch
-jus-ti-ti{-}{e}{ë}-le
-Ven-lo{-}{e}{ë}-naar
-re-fu-gi-{é-}{}{ee}tje
-ge{-}{i}{ï}-mi-teerd
-mi-cro-bi{-}{e}{ë}-le
-Bre-da{-}{e}{ë}-naar
-Bree{-}{e}{ë}r-naar
-sar-co{-}{i}{ï}-do-se
-Can-ta-bri{-}{e}{ë}r
-ge{-}{e}{ë}pi-leerd
-drie{-}{e}{ë}n-half
-wa-ran-d{a-}{}{aa}tje
-droog-ski{-}{e}{ë}n
-Nor-man-di{-}{e}{ë}r
-as-so-ci{é-}{}{ee}tje
-pat-je-pee{-}{e}{ë}r
-San-tia-go{-}{e}{ë}r
-An-dal-us-i{-}{e}{ë}r
-re-pli-c{a-}{}{aa}tje
-Pa-ta-go-ni{-}{e}{ë}r
-klei-no-di{-}{e}{ë}n
-bra-de-rie{-}{e}{ë}n
-ca-me-li-{a-}{}{aa}tje
-Is-ra{-}{e}{ë}-li-er
-idee{-}{e}{ë}n-goed
-co{-}{i}{ï}n-ci-dent
-be-go-ni-{a-}{}{aa}tje
-Oe-kra{-}{i}{ï}en-se
-cel-lu-lo{-}{i}{ï}-de
-eet-ca-f{é-}{}{ee}tje
-Mon-go-li{-}{e}{ë}rs
-sad-du-cee{-}{e}{ë}n
-pin-gu{-}{i}{ï}n-tje
-ko-li-br{i-}{}{ie}tje
-gra-ti{-}{e}{ë}-ring
-Korin-thi{-}{e}{ë}r
-Hels-inki{-}{e}{ë}r
-at-ta-ch{é-}{}{ee}tje
-col-le-g{a-}{}{aa}tje
-par-ve-n{u-}{}{uu}tje
-di-plo-m{a-}{}{aa}tje
-At-lan-tee{-}{e}{ë}r
-pa-pri-k{a-}{}{aa}tje
-aan-ge{-}{e}{ë}rf-de
-An-tarc-ti{-}{e}{ë}r
-waan-idee{-}{e}{ë}n
-sym-fo-nie{-}{e}{ë}n
-ma{-}{i}{ï}s-ak-kers
-Ma-ce-do-ni{-}{e}{ë}r
-ka{-}{i}{ï}ns-te-ken
-ini-ti{-}{e}{ë}-ring
-woon-idee{-}{e}{ë}n
-ve-ran-d{a-}{}{aa}tje
-tre-mo-l{o-}{}{oo}tje
-tom-bo-l{a-}{}{aa}tje
-su{-}{i}{ï}-ci-deert
-stu-di-{o-}{}{oo}tjes
-smeer-oli{-}{e}{ë}n
-si{-}{e}{ë}s-ta–s
-sche-m{a-}{}{aa}tjes
-ru{-}{i}{ï}-neer-den
-py-ja-m{a-}{}{aa}tjes
-prul-po{-}{e}{ë}-ten
-pri-mu-l{a-}{}{aa}tje
-po{-}{e}{ë}-ti-seert
-pic-co-l{o-}{}{oo}tje
-per-go-l{a-}{}{aa}tje
-pa-ra-pl{u-}{}{uu}tje
-pa-gi-n{a-}{}{aa}tjes
-of-fi-ci{-}{e}{ë}-ler
-ma{-}{i}{ï}s-koe-ken
-ki-mo-n{o-}{}{oo}tjes
-ge{-}{u}{ü}ri-neerd
-ge{-}{i}{ï}-te-reerd
-ge{-}{e}{ë}-li-deerd
-fee{-}{e}{ë}-rie-ker
-eva-cu{é-}{}{ee}tjes
-do-mi-n{o-}{}{oo}tjes
-cu-pi-d{o-}{}{oo}tjes
-co{-}{o}{ö}r-di-neer
-co-mit{é-}{}{ee}tjes
-cli-ch{é-}{}{ee}tjes
-ca-na-p{é-}{}{ee}tjes
-bo-le-r{o-}{}{oo}tjes
-agen-d{a-}{}{aa}tjes
-af-ge-vree{-}{e}{ë}n
-over-ge{-}{e}{ë}rfd
-ini-ti{-}{e}{ë}-rend
-ori{-}{e}{ë}n-teert
-sec-tori{-}{e}{ë}-le
-pas-fo-t{o-}{}{oo}tje
-be{-}{i}{ï}n-vloedt
-ca-me-r{a-}{}{aa}tjes
-ge{-}{e}{ë}in-dig-de
-va-ri{-}{e}{ë}-ren-de
-pro-te-g{é-}{}{ee}tje
-pro-ce-d{é-}{}{ee}tje
-po-ten-ti{-}{e}{ë}-le
-po{-}{e}{ë}-ti-scher
-pi{-}{e}{ë}-de-stals
-ge{-}{u}{ü}p-gra-ded
-ab-sen-te{-}{i}{ï}s-me
-acro-ba-tie{-}{e}{ë}n
-ap-pre-ci{-}{e}{ë}-ren
-ge{-}{e}{ë}s-say-eerd
-co{-}{o}{ö}-pe-reer-de
-pro-le-ta-ri{-}{e}{ë}r
-gips-ko-pie{-}{e}{ë}n
-al-ge-bra{-}{i}{ï}sch
-al-le-go-rie{-}{e}{ë}n
-al-pi-ne-ski{-}{e}{ë}n
-am-bi-gu{-}{i}{ï}-teit
-ge{-}{e}{ë}-ve-naar-de
-hy-gi{-}{e}{ë}-nis-ten
-hy-gi{-}{e}{ë}-ni-sche
-sym-pa-thie{-}{e}{ë}n
-pre-di-ca-ti{-}{e}{ë}n
-ve-ge-ta-ri{-}{e}{ë}rs
-va-ri{-}{e}{ë}-tei-ten
-the{-}{i}{ï}s-ti-sche
-stra-te-gie{-}{e}{ë}n
-so-ci{-}{e}{ë}-tei-ten
-ori{-}{e}{ë}n-te-ring
-ori{-}{e}{ë}n-teer-de
-ori{-}{e}{ë}n-ta-ties
-on-der-zee{-}{e}{ë}rs
-lin-gu{-}{i}{ï}s-tiek
-in-dus-tri{-}{e}{ë}-le
-in-dus-trie{-}{e}{ë}n
-har-mo-ni{-}{e}{ë}-ren
-ge{-}{i}{ï}r-ri-teerd
-ge{-}{e}{ë}n-ga-geerd
-fi-lo-so-fie{-}{e}{ë}n
-ef-fi-ci{-}{e}{ë}n-tie
-de-fi-ni{-}{e}{ë}-ring
-de-fi-ci{-}{e}{ë}n-tie
-co{-}{o}{ö}r-di-na-tor
-co{-}{o}{ö}r-di-na-tie
-co{-}{o}{ö}r-di-na-ten
-co{-}{o}{ö}-pe-ra-ties
-co{-}{o}{ö}-pe-ra-tief
-com-pag-nie{-}{e}{ë}n
-com-mer-ci{-}{e}{ë}-le
-che-mi-ca-li{-}{e}{ë}n
-ca-te-go-rie{-}{e}{ë}n
-be{-}{e}{ë}in-di-ging
-an-nu{-}{i}{ï}-tei-ten
-Is-ra{-}{e}{ë}-li-sche
-fla-min-g{o-}{}{oo}tje
-com-pri-m{é-}{}{ee}tje
-baan-ca-f{é-}{}{ee}tje
-mag-no-li-{a-}{}{aa}tje
-maag-pa-ti{-}{e}{ë}nt
-tri-bu-la-ti{-}{e}{ë}n
-tem-po-ra-li{-}{e}{ë}n
-bio-gra-fie{-}{e}{ë}n
-com-man-d{o-}{}{oo}tje
-su{-}{i}{ï}-ci-de-plan
-na{-}{i}{ï}-vi-tei-ten
-ma{-}{i}{ï}s-ver-bouw
-lust-pri{-}{e}{ë}-len
-ka-pe-la-nie{-}{e}{ë}n
-hi{-}{e}{ë}-ro-gly-fen
-he-ro{-}{i}{ï}-ne-ba-by
-ge-ni{-}{e}{ë}l-leerd
-fee{-}{e}{ë}n-han-den
-ex-pa-ti{-}{e}{ë}n-te
-bots-au-t{o-}{}{oo}tje
-ar-ren-slee{-}{e}{ë}n
-al-pi-ne-ski{-}{e}{ë}r
-af-spa-ti{-}{e}{ë}-ren
-Mi-cro-ne-si{-}{e}{ë}r
-Bar-to-lo-me{-}{u}{ü}s
-ge{-}{e}{ë}xer-ceerd
-ge{-}{e}{ë}-mul-geerd
-ge{-}{i}{ï}n-du-ceerd
-hy-gi{-}{e}{ë}-ne-co-de
-ge{-}{i}{ï}n-un-deerd
-ge{-}{e}{ë}-ner-veerd
-ge{-}{e}{ë}-mi-greerd
-ge{-}{e}{ë}x-cu-seerd
-Is-ra{-}{e}{ë}-li-ers
-ge{-}{e}{ë}-va-cu-eerd
-men-sen-zee{-}{e}{ë}n
-pat-je-pee{-}{e}{ë}rs
-va-cu{-}{u}{ü}m-ka-mer
-he-ro{-}{i}{ï}-ne-lijn
-he-ro{-}{i}{ï}-ne-hoer
-ma-ni{-}{e}{ë}-ris-ten
-Ma-ce-do-ni{-}{e}{ë}rs
-pa-leo-zo{-}{i}{ï}-cum
-shin-to{-}{i}{ï}s-ten
-aids-pa-ti{-}{e}{ë}nt
-voor-stu-di{-}{e}{ë}n
-wa-ter-le-li{-}{e}{ë}n
-wee{-}{e}{ë}n-rem-mer
-we-reld-zee{-}{e}{ë}n
-ma{-}{i}{ï}s-plan-ten
-the-sau-rie{-}{e}{ë}n
-trans-ac-ti{-}{e}{ë}n
-tra-pe-zo{-}{i}{ï}-den
-tra-ves-tie{-}{e}{ë}n
-tri-ar-chie{-}{e}{ë}n
-tro-che{-}{i}{ï}-sche
-twee{-}{e}{ë}r-han-de
-va-cu{-}{u}{ü}m-me-ter
-sub-si-di{-}{e}{ë}-ren
-taal-stu-di{-}{e}{ë}n
-tan-gen-ti{-}{e}{ë}-le
-ta-toe{-}{e}{ë}er-der
-ta-o{-}{i}{ï}s-ti-sche
-se-quen-ti{-}{e}{ë}-le
-sol-fe-gi{-}{e}{ë}-ren
-sot-ter-nie{-}{e}{ë}n
-spon-de{-}{i}{ï}sche
-twee{-}{e}{ë}n-hal-ve
-on-of-fi-ci{-}{e}{ë}-le
-taxo-no-mie{-}{e}{ë}n
-sa-cri-fi-ci{-}{e}{ë}n
-sa-cri-fi{-}{e}{ë}-ren
-sa-cris-tie{-}{e}{ë}n
-sa-la-ri{-}{e}{ë}ring
-sa-tur-na-li{-}{e}{ë}n
-re-fe-ren-ti{-}{e}{ë}n
-re-li{-}{e}{ë}f-kaart
-re-pa-tri{-}{e}{ë}-ren
-tbs-pa-ti{-}{e}{ë}nt
-pe-ni-ten-ti{-}{e}{ë}n
-per-ci-pi{-}{e}{ë}-ren
-pe-ri-fe-rie{-}{e}{ë}n
-pe-ri-pe-tie{-}{e}{ë}n
-pi{-}{e}{ë}-tis-tisch
-pla-ne-to{-}{i}{ï}-den
-po{-}{e}{ë}-ti-seer-de
-po{-}{e}{ë}-zie-al-bum
-Po-ly-ne-si{-}{e}{ë}rs
-po-ly-the{-}{i}{ï}s-me
-prin-ci-pi{-}{e}{ë}-le
-pri-vi-le-gi{-}{e}{ë}n
-pro-te{-}{i}{ï}-nu-rie
-pro-to-zo{-}{i}{ï}sch
-psal-mo-die{-}{e}{ë}n
-re-ci-pi{-}{e}{ë}n-ten
-re-cog-ni-ti{-}{e}{ë}n
-po{-}{e}{ë}zie-prijs
-wa-ter-po-lo{-}{e}{ë}r
-pa-ra-ly-sie{-}{e}{ë}n
-mo-no-ma-nie{-}{e}{ë}n
-mo-no-po-lo{-}{i}{ï}-de
-mo-no-the{-}{i}{ï}s-me
-munt-spe-ci{-}{e}{ë}n
-na{-}{i}{ï}-ve-tei-ten
-neu-ral-gie{-}{e}{ë}n
-nier-pa-ti{-}{e}{ë}nt
-obe-di{-}{e}{ë}n-ties
-opi-ni{-}{e}{ë}-ren-de
-oran-je-rie{-}{e}{ë}n
-ori{-}{e}{ë}n-ta-list
-an-ti-no-mie{-}{e}{ë}n
-In-do-ne-si{-}{e}{ë}rs
-in-ef-fi-ci{-}{e}{ë}nt
-in-of-fi-ci{-}{e}{ë}-le
-je-zu{-}{i}{ï}-ti-sche
-ka-ko-fo-nie{-}{e}{ë}n
-la{-}{i}{ï}-ci-seer-de
-ma-ni-chee{-}{e}{ë}rs
-ma-ni-che{-}{i}{ï}s-me
-mar-gi-na-li{-}{e}{ë}n
-me-di{-}{e}{ë}-vis-ten
-me-na-ge-rie{-}{e}{ë}n
-me-tal-lo{-}{i}{ï}-den
-me-to-ny-mie{-}{e}{ë}n
-mo-nar-chie{-}{e}{ë}n
-mond-hy-gi{-}{e}{ë}-ne
-de-pre-ci{-}{e}{ë}-ren
-di-no-sau-ri{-}{e}{ë}r
-dis-so-ci{-}{e}{ë}-ren
-do-de-ca{-}{e}{ë}ders
-doxo-lo-gie{-}{e}{ë}n
-du{-}{u}{ü}m-vi-ra-ten
-ef-fi-ci{-}{e}{ë}n-ter
-ego{-}{i}{ï}s-ti-sche
-el-lip-so{-}{i}{ï}-den
-ex-pa-tri{-}{e}{ë}-ren
-ex-pe-di{-}{e}{ë}n-ten
-fal-si-fi{-}{e}{ë}-ren
-fa-ri-ze{-}{i}{ï}-sche
-fas-cis-to{-}{i}{ï}-de
-fo-to-ko-pie{-}{e}{ë}n
-fox-ter-ri{-}{e}{ë}rs
-ge-co{-}{o}{ö}p-teerd
-ge{-}{e}{ë}xal-teerd
-ge{-}{e}{ë}x-po-neerd
-ge{-}{i}{ï}m-po-neerd
-ge{-}{i}{ï}-so-leer-de
-hart-pa-ti{-}{e}{ë}nt
-haut-re-li{-}{e}{ë}f
-he-mor-ro{-}{i}{ï}-den
-he-ro{-}{i}{ï}ne-hond
-hi{-}{e}{ë}-rar-chiek
-hi{-}{e}{ë}-ra-ti-sche
-hoog-ge{-}{e}{ë}er-de
-ide-o-lo-gie{-}{e}{ë}n
-im-ma-te-ri{-}{e}{ë}-le
-de-nun-ci{-}{e}{ë}-ren
-con-ve-ni{-}{e}{ë}-ren
-co{-}{o}{ö}r-di-ne-ren
-da-da{-}{i}{ï}s-tisch
-bras-se-rie{-}{e}{ë}n
-bul-ter-ri{-}{e}{ë}rs
-ca-fe{-}{i}{ï}-ne-vrij
-ca-ro-te-no{-}{i}{ï}-de
-ce-re-mo-nie{-}{e}{ë}n
-ce-re-mo-ni{-}{e}{ë}-le
-co{-}{i}{ï}n-ci-de-ren
-con-ci-li{-}{e}{ë}-ren
-con-ci-pi{-}{e}{ë}-ren
-con-sci{-}{e}{ë}n-tie
-Bour-gon-di{-}{e}{ë}r
-ar-cha{-}{i}{ï}-se-ren
-ar-ti-fi-ci{-}{e}{ë}-le
-athe{-}{i}{ï}s-tisch
-Au-stra-li{-}{e}{ë}rs
-au-tar-chie{-}{e}{ë}n
-ba-rens-wee{-}{e}{ë}n
-bas-re-li{-}{e}{ë}fs
-be{-}{e}{ë}di-gin-gen
-be{-}{i}{ï}n-vloed-de
-be{-}{i}{ï}n-vloe-den
-be-ne-dic-ti{-}{e}{ë}n
-bin-nen-zee{-}{e}{ë}n
-blas-fe-mie{-}{e}{ë}n
-po{-}{e}{ë}-zie-zo-mer
-ge{-}{i}{ï}n-vi-teerd
-ef-fi-ci{-}{e}{ë}ntst
-Ma-lag-as-si{-}{e}{ë}r
-At-lan-te{-}{i}{ï}sch
-ge{-}{e}{ë}s-ca-leerd
-ge{-}{e}{ë}-vo-lu-eerd
-ge{-}{e}{ë}-qui-peerd
-Mau-ri-ta-ni{-}{e}{ë}r
-pan-the{-}{i}{ï}s-ten
-co{-}{o}{ö}-pe-ran-ten
-Nu-ku{-}{}{–}a-lo-fa
-as-su-ran-ti{-}{e}{ë}n
-ver-si-fi{-}{e}{ë}-ren
-post-au-t{o-}{}{oo}tje
-ge{-}{i}{ï}n-to-neerd
-ge{-}{i}{ï}o-ni-seerd
-jazz-ca-f{é-}{}{ee}tje
-ge{-}{e}{ë}x-po-seerd
-ge{-}{e}{ë}xis-teerd
-ca-ra-pa-ti{-}{e}{ë}nt
-long-pa-ti{-}{e}{ë}nt
-ori{-}{e}{ë}n-taal-se
-co-ma-pa-ti{-}{e}{ë}nt
-ge{-}{i}{ï}n-no-veerd
-clow-ne-rie{-}{e}{ë}n
-slaap-stee{-}{e}{ë}n
-ge{-}{e}{ë}n-ta-meerd
-ge{-}{e}{ë}x-hi-beerd
-Kaap-ver-di{-}{e}{ë}r
-on-in-tu{-}{i}{ï}-tief
-Is-ra{-}{e}{ë}-lie-ten
-dys-pla-sie{-}{e}{ë}n
-Hei-loo{-}{e}{ë}-naar
-in-di-vi-d{u-}{}{uu}tje
-ge{-}{e}{ë}men-deerd
-ge{-}{e}{ë}car-teerd
-ge{-}{i}{ï}g-no-reerd
-bro-me-li-{a-}{}{aa}tje
-ge{-}{i}{ï}r-ri-geerd
-ge{-}{i}{ï}n-ha-leerd
-ca-su{-}{i}{ï}s-tisch
-ge{-}{e}{ë}mit-teerd
-ge{-}{e}{ë}x-pi-reerd
-ma{-}{i}{ï}s-zet-meel
-ge{-}{i}{ï}n-dexeerd
-ge{-}{i}{ï}ni-ti-eerd
-ge{-}{e}{ë}va-lu-eerd
-ge{-}{i}{ï}n-di-ceerd
-Is-ra{-}{e}{ë}-li–s
-bour-gon-di{-}{e}{ë}r
-idee{-}{e}{ë}n-ro-man
-po{-}{e}{ë}-zie-avond
-sad-du-cee{-}{e}{ë}rs
-da-na{-}{i}{ï}-den-vat
-wa-ter-ski{-}{e}{ë}rs
-pi{-}{e}{ë}-teits-vol
-ma-o{-}{i}{ï}s-ti-sche
-ve-ran-d{a-}{}{aa}tjes
-tra-pe-zo{-}{i}{ï}-des
-ta-toe{-}{e}{ë}er-den
-sym-me-trie{-}{e}{ë}n
-sto{-}{i}{ï}-cijn-ser
-seks-or-gie{-}{e}{ë}n
-pri-mu-l{a-}{}{aa}tjes
-pic-co-l{o-}{}{oo}tjes
-per-go-l{a-}{}{aa}tjes
-pa-ra-pl{u-}{}{uu}tjes
-pa-no-ra-m{a-}{}{aa}tje
-os-sen-knie{-}{e}{ë}n
-ne-gli-g{é-}{}{ee}tjes
-ma-don-n{a-}{}{aa}tjes
-je-re-mi{-}{e}{ë}er-de
-in-tu{-}{i}{ï}-tie-ver
-in-tu{-}{i}{ï}-tiefst
-ge{-}{u}{ü}-sur-peerd
-ge{-}{i}{ï}-te-reer-de
-ge{-}{i}{ï}n-tri-geer
-ge{-}{i}{ï}n-ti-meerd
-ge{-}{e}{ë}ro-deer-de
-ge{-}{e}{ë}pi-leer-de
-ge-ti{-}{e}{ë}r-ceerd
-ge-re-cre{-}{e}{ë}erd
-ge-a-li{-}{e}{ë}neerd
-fee{-}{e}{ë}-rie-ke-re
-di-plo-m{a-}{}{aa}tjes
-co{-}{o}{ö}p-teer-den
-cor-ti-co{-}{i}{ï}-den
-pas-fo-t{o-}{}{oo}tjes
-fla-vo-no{-}{i}{ï}-den
-ma{-}{i}{ï}s-kor-rels
-pre{-}{e}{ë}mp-tie-ve
-ty-po-lo-gie{-}{e}{ë}n
-pru-den-ti{-}{e}{ë}-le
-be{-}{e}{ë}in-dig-den
-te-rug-ge{-}{e}{ë}ist
-drie{-}{e}{ë}n-hal-ve
-toe-ge{-}{e}{ë}i-gend
-film-ko-pie{-}{e}{ë}n
-Ca-ra{-}{i}{ï}-bische
-ori{-}{e}{ë}n-te-rend
-co{-}{i}{ï}n-ci-deert
-ge{-}{i}{ï}-mi-teer-de
-ge{-}{e}{ë}ta-leer-de
-ge-ta-toe{-}{e}{ë}erd
-co{-}{o}{ö}r-di-neert
-pro-za{-}{i}{ï}-scher
-po-ten-ti{-}{e}{ë}-len
-ge{-}{e}{ë}m-bar-keerd
-pro-le-ta-ri{-}{e}{ë}rs
-ge{-}{i}{ï}n-ter-neerd
-abi-tu-ri{-}{e}{ë}n-ten
-ge{-}{e}{ë}n-ca-dreerd
-machts-va-cu{-}{u}{ü}m
-an-ti-pa-thie{-}{e}{ë}n
-an-tho-lo-gie{-}{e}{ë}n
-al-ge-bra{-}{i}{ï}sche
-al-tru{-}{i}{ï}s-tisch
-an-ci{-}{e}{ë}n-ni-teit
-he-ro{-}{i}{ï}-ne-spuit
-va-cu{-}{u}{ü}m-ka-mers
-lach-sal-v{o-}{}{oo}tje
-graan-si-l{o-}{}{oo}tje
-de-col-le-t{é-}{}{ee}tje
-buurt-ca-f{é-}{}{ee}tje
-su-per-fi-ci{-}{e}{ë}-le
-be{-}{e}{ë}in-di-gen-de
-con-ve-ni{-}{e}{ë}n-tie
-ge{-}{i}{ï}n-for-meerd
-re-fe-ren-ti{-}{e}{ë}-le
-sub-si-di{-}{e}{ë}-ring
-se-cre-ta-rie{-}{e}{ë}n
-re{-}{i}{ï}n-car-na-tie
-mi-nis-te-ri{-}{e}{ë}-le
-lin-gu{-}{i}{ï}s-tisch
-in-gre-di{-}{e}{ë}n-ten
-in-dus-tri{-}{e}{ë}-len
-ge-o-ri{-}{e}{ë}n-teerd
-ge-ma-ni{-}{e}{ë}-reerd
-ge{-}{i}{ï}n-spi-reerd
-ety-mo-lo-gie{-}{e}{ë}n
-dis-cus-si{-}{e}{ë}-ren
-de-mo-cra-tie{-}{e}{ë}n
-con-ti-nu{-}{i}{ï}-teit
-co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
-be{-}{i}{ï}n-vloe-ding
-pa-ti{-}{e}{ë}n-ten-wet
-oud-ko-lo-ni{-}{e}{ë}n
-on-in-tu{-}{i}{ï}-tie-ve
-mo-za{-}{i}{ï}ek-te-gel
-mo-no-the{-}{i}{ï}s-ten
-arts-pa-ti{-}{e}{ë}nt
-pro-gram-m{a-}{}{aa}tje
-he-ro{-}{i}{ï}-ne-markt
-fy-sio-no-mie{-}{e}{ë}n
-co{-}{i}{ï}n-ci-den-ten
-cli{-}{e}{ë}n-ten-bond
-cli{-}{e}{ë}n-te-lis-me
-an-ti-ju-da{-}{i}{ï}s-me
-twee{-}{e}{ë}n-der-tig
-fonds-pa-ti{-}{e}{ë}nt
-drie{-}{e}{ë}n-der-tig
-ri-bo-nu-cle{-}{i}{ï}-ne
-Bour-gon-di{-}{e}{ë}rs
-ge{-}{i}{ï}n-sti-geerd
-ge{-}{e}{ë}ro-ti-seerd
-ge{-}{i}{ï}n-si-nu-eerd
-in-con-ve-ni{-}{e}{ë}nt
-ge{-}{e}{ë}x-pan-deerd
-ge{-}{e}{ë}x-plo-deerd
-pyg-mee{-}{e}{ë}n-volk
-ge{-}{e}{ë}xa-mi-neerd
-ge{-}{i}{ï}n-stru-eerd
-ge{-}{i}{ï}n-cas-seerd
-ge{-}{e}{ë}li-mi-neerd
-ge{-}{e}{ë}x-por-teerd
-ge{-}{i}{ï}so-leer-der
-ge{-}{i}{ï}n-fec-teerd
-ge{-}{e}{ë}s-cor-teerd
-ge{-}{i}{ï}-ro-ni-seerd
-ge{-}{i}{ï}n-tri-geerd
-ge{-}{i}{ï}m-por-teerd
-bour-gon-di{-}{e}{ë}rs
-le-ver-pa-ti{-}{e}{ë}nt
-tri-mes-tri{-}{e}{ë}-le
-idee{-}{e}{ë}n-we-reld
-ge-co{-}{o}{ö}p-teer-de
-dru{-}{i}{ï}-de-tem-pel
-wa-ter-po-lo{-}{e}{ë}rs
-ori{-}{e}{ë}n-ta-lis-me
-echo-gra-fie{-}{e}{ë}n
-vloer-mo-za{-}{i}{ï}ek
-ze-nuw-pa-ti{-}{e}{ë}nt
-zwaard-le-li{-}{e}{ë}n
-veen-ko-lo-ni{-}{e}{ë}n
-te-tra-lo-gie{-}{e}{ë}n
-ti{-}{e}{ë}r-ce-rin-gen
-va-cu{-}{u}{ü}m-lam-pen
-va-cu{-}{u}{ü}m-me-ters
-sub-si-di{-}{e}{ë}n-ten
-sub-stan-ti{-}{e}{ë}-le
-su-per-sti-ti{-}{e}{ë}n
-ta-boe{-}{i}{ï}-se-ring
-ta-pis-se-rie{-}{e}{ë}n
-ta-toe{-}{e}{ë}er-ders
-ta-to{-}{e}{ë}-rin-gen
-tau-to-lo-gie{-}{e}{ë}n
-athe{-}{i}{ï}s-ti-sche
-va-cu{-}{u}{ü}m-pom-pen
-se-cre-ta-ri{-}{e}{ë}-le
-spa-ti{-}{e}{ë}-rin-gen
-sper-ma-to-zo{-}{o}{ö}n
-spi-ri-tu-a-li{-}{e}{ë}n
-pi{-}{e}{ë}-tis-ti-sche
-re{-}{i}{ï}n-car-ne-ren
-re-pa-tri{-}{e}{ë}-ring
-re-si-den-ti{-}{e}{ë}-le
-res-pon-so-ri{-}{e}{ë}n
-pa-tis-se-rie{-}{e}{ë}n
-pe-dan-te-rie{-}{e}{ë}n
-pes-ti-len-ti{-}{e}{ë}n
-pi{-}{e}{ë}-de-stal-len
-pi-kan-te-rie{-}{e}{ë}n
-po{-}{e}{ë}-zie-al-bums
-po{-}{e}{ë}-zie-bun-del
-pro-to-zo{-}{i}{ï}-sche
-psal-mo-di{-}{e}{ë}-ren
-par-fu-me-rie{-}{e}{ë}n
-mo-no-gra-fie{-}{e}{ë}n
-mo-za{-}{i}{ï}ek-vloer
-na{-}{i}{ï}e-ve-lin-gen
-ne-cro-lo-gie{-}{e}{ë}n
-ob-ser-van-ti{-}{e}{ë}n
-oleo-gra-fie{-}{e}{ë}n
-oli-gar-chie{-}{e}{ë}n
-on-ge{-}{e}{ë}ve-naard
-on-hy-gi{-}{e}{ë}-nisch
-ono-ma-to-pee{-}{e}{ë}n
-or-don-nan-ti{-}{e}{ë}n
-pa-ci-fi-ca-ti{-}{e}{ë}n
-in-dul-gen-ti{-}{e}{ë}n
-in-ef-fi-ci{-}{e}{ë}n-te
-in-fir-me-rie{-}{e}{ë}n
-in-suf-fi-ci{-}{e}{ë}nt
-Is-ra{-}{e}{ë}-li-tisch
-ju-ris-dic-ti{-}{e}{ë}n
-kies-quo-ti{-}{e}{ë}nt
-koe-ken-drie{-}{e}{ë}n
-le-pro-ze-rie{-}{e}{ë}n
-ma-chi-ne-rie{-}{e}{ë}n
-ma-li{-}{e}{ë}n-kol-der
-me-di{-}{e}{ë}-vis-tiek
-di-eet-pa-ti{-}{e}{ë}nt
-di-no-sau-ri{-}{e}{ë}rs
-dis-tan-ti{-}{e}{ë}-ren
-do-mi-ci-li{-}{e}{ë}-ren
-exis-ten-ti{-}{e}{ë}-le
-ex-po-nen-ti{-}{e}{ë}-le
-fal-si-fi{-}{e}{ë}-ring
-fo-to-gra-fie{-}{e}{ë}n
-ga-lan-te-rie{-}{e}{ë}n
-ge{-}{e}{ë}n-dos-seerd
-ge{-}{e}{ë}n-ga-geer-de
-ge{-}{e}{ë}xal-teer-de
-ge{-}{e}{ë}x-pli-ceerd
-ge{-}{e}{ë}x-po-neer-de
-ge{-}{i}{ï}m-pli-ceerd
-ge{-}{i}{ï}m-po-neer-de
-ge{-}{i}{ï}n-dos-seerd
-ge{-}{i}{ï}n-te-greerd
-ge{-}{i}{ï}n-ter-viewd
-ge{-}{i}{ï}n-ti-meer-de
-ge{-}{i}{ï}r-ri-teer-de
-ge-la{-}{i}{ï}-ci-seerd
-ge-nea-lo-gie{-}{e}{ë}n
-griep-pa-ti{-}{e}{ë}nt
-hi{-}{e}{ë}-rar-chie-ke
-hi{-}{e}{ë}-rar-chisch
-hi{-}{e}{ë}-ro-glie-fen
-con-tra-ri{-}{e}{ë}-ren
-co{-}{o}{ö}-pe-ra-tie-ve
-co{-}{o}{ö}r-di-na-ties
-co{-}{o}{ö}r-di-neer-de
-da-da{-}{i}{ï}s-ti-sche
-de-fi-ci{-}{e}{ë}n-ties
-ca-fe{-}{i}{ï}-ne-vrije
-co{-}{i}{ï}n-ci-deer-de
-co{-}{i}{ï}n-ci-den-tie
-con-gre-ga-ti{-}{e}{ë}n
-con-sci{-}{e}{ë}n-ties
-ar-cha{-}{i}{ï}-seer-de
-ar-cha{-}{i}{ï}s-tisch
-ast-ma-pa-ti{-}{e}{ë}nt
-au-to-gra-fie{-}{e}{ë}n
-ban-toe{-}{i}{ï}s-tiek
-be-zits-ac-ti{-}{e}{ë}n
-bi-jou-te-rie{-}{e}{ë}n
-ge-zags-va-cu{-}{u}{ü}m
-fo-to-ko-pi{-}{e}{ë}-ren
-Flak-kee{-}{e}{ë}-naar
-ge{-}{e}{ë}-mail-leerd
-Pa-ra-ma-ri-bo{-}{e}{ë}r
-ge{-}{e}{ë}er-bie-digd
-ge{-}{i}{ï}n-ves-teerd
-po{-}{e}{ë}-zie-de-buut
-ge{-}{i}{ï}n-vol-veerd
-hart-pa-ti{-}{e}{ë}n-te
-po-ly-the{-}{i}{ï}s-ten
-Joego-sla-vi{-}{e}{ë}r
-ge{-}{e}{ë}xe-cu-teerd
-echo-sco-pie{-}{e}{ë}n
-de-pen-den-ti{-}{e}{ë}n
-après-ski{-}{e}{ë}n
-af-spa-ti{-}{e}{ë}-ring
-har-mo-ni-c{a-}{}{aa}tje
-sport-be-h{a-}{}{aa}tje
-ge{-}{e}{ë}x-pe-di-eerd
-ge{-}{e}{ë}x-tra-heerd
-nu-cle{-}{i}{ï}ne-zuur
-ge{-}{e}{ë}-ga-li-seerd
-me-de-pa-ti{-}{e}{ë}n-te
-ge{-}{e}{ë}x-plo-reerd
-hy-gi{-}{e}{ë}-ni-scher
-Scan-di-na-vi{-}{e}{ë}r
-idee{-}{e}{ë}n-ro-mans
-ca-su{-}{i}{ï}s-tische
-dorps-ca-f{é-}{}{ee}tje
-cli{-}{e}{ë}n-ten-stop
-my-tho-lo-gie{-}{e}{ë}n
-stads-au-t{o-}{}{oo}tje
-cli{-}{e}{ë}n-ten-raad
-bloe-men-zee{-}{e}{ë}n
-nier-pa-ti{-}{e}{ë}n-te
-ei-gen-ge{-}{e}{ë}rf-de
-ge{-}{e}{ë}x-cel-leerd
-ge{-}{e}{ë}x-cer-peerd
-ge{-}{e}{ë}-ja-cu-leerd
-cli{-}{e}{ë}n-ten-kant
-cli{-}{e}{ë}n-ten-zorg
-co-ca{-}{i}{ï}-ne-ben-de
-ge{-}{i}{ï}n-jec-teerd
-ge{-}{i}{ï}m-mi-greerd
-drie{-}{e}{ë}n-zes-tig
-ge{-}{i}{ï}n-sis-teerd
-dub-bel-twee{-}{e}{ë}n
-ge{-}{i}{ï}n-cli-neerd
-ge{-}{i}{ï}n-car-neerd
-pro-te{-}{i}{ï}-ne-rijk
-in-spi-ci{-}{e}{ë}n-ten
-ge{-}{e}{ë}-clip-seerd
-dood-ge{-}{e}{ë}r-gerd
-en-do-sco-pie{-}{e}{ë}n
-twee{-}{e}{ë}n-zes-tig
-ME-pa-ti{-}{e}{ë}n-ten
-idee{-}{e}{ë}n-bus-sen
-ge{-}{e}{ë}n-sce-neerd
-ca-ro-te-no{-}{i}{ï}-den
-reu-ma-pa-ti{-}{e}{ë}nt
-pre-ju-di-ci{-}{e}{ë}-le
-va-cu{-}{u}{ü}m-bui-zen
-eu-tro-fi{-}{e}{ë}-ring
-haut-re-li{-}{e}{ë}fs
-tra-ge-di{-}{e}{ë}n-nes
-pa-no-ra-m{a-}{}{aa}tjes
-oor-logs-wee{-}{e}{ë}n
-im-ma-te-ri{-}{e}{ë}-ler
-hiv-pa-ti{-}{e}{ë}n-ten
-har-mo-ni{-}{e}{ë}-rend
-ge{-}{u}{ü}-ti-li-seerd
-ge{-}{o}{ö}ri-en-teerd
-ge{-}{i}{ï}n-ver-teerd
-ge{-}{i}{ï}n-un-deer-de
-ge{-}{i}{ï}n-no-veer-de
-ge{-}{e}{ë}x-cu-seer-de
-ge{-}{e}{ë}-ner-veer-de
-ge{-}{e}{ë}-men-deer-de
-fri-tuur-oli{-}{e}{ë}n
-ego{-}{i}{ï}s-ti-scher
-ef-fi-ci{-}{e}{ë}nt-ste
-bus-pa-ti{-}{e}{ë}n-ten
-bank-cli{-}{e}{ë}n-ten
-asym-me-trie{-}{e}{ë}n
-ar-ti-fi-ci{-}{e}{ë}-ler
-al-pi-ne-ski{-}{e}{ë}rs
-ge-de-fi-ni{-}{e}{ë}erd
-ge{-}{e}{ë}-va-cu-eer-de
-to-po-gra-fie{-}{e}{ë}n
-thuis-ko-pie{-}{e}{ë}n
-ge{-}{i}{ï}o-ni-seer-de
-ge{-}{e}{ë}-qui-peer-de
-ge{-}{e}{ë}-vo-lu-eer-de
-ge{-}{i}{ï}r-ri-geer-de
-ge{-}{e}{ë}x-pi-reer-de
-ge{-}{e}{ë}-mit-teer-de
-com-mer-ci{-}{e}{ë}-len
-pa-tho-lo-gie{-}{e}{ë}n
-ge{-}{e}{ë}-va-lu-eer-de
-ge{-}{i}{ï}n-du-ceer-de
-ge{-}{i}{ï}n-ha-leer-de
-ge{-}{u}{ü}ni-fi-ceerd
-ge{-}{e}{ë}s-ca-leer-de
-be{-}{i}{ï}n-vloed-den
-ge{-}{i}{ï}n-dexeer-de
-ge{-}{e}{ë}x-po-seer-de
-toe-ge{-}{e}{ë}i-gen-de
-ori{-}{e}{ë}n-teer-den
-ge{-}{e}{ë}n-ta-meer-de
-ge{-}{i}{ï}n-di-ceer-de
-ge-ta-toe{-}{e}{ë}er-de
-ori{-}{e}{ë}n-te-ren-de
-co{-}{o}{ö}r-di-ne-rend
-com-mer-ci{-}{e}{ë}-ler
-ex-pa-ti{-}{e}{ë}n-ten
-ef-fi-ci{-}{e}{ë}n-te-re
-ge{-}{i}{ï}-ni-ti-eer-de
-ge{-}{e}{ë}-mi-greer-de
-ge{-}{i}{ï}n-vi-teer-de
-ge-po{-}{e}{ë}-ti-seerd
-ge{-}{i}{ï}-de-a-li-seerd
-Is-ra{-}{e}{ë}-li-tische
-al-tru{-}{i}{ï}s-ti-sche
-re{-}{i}{ï}n-car-neer-de
-he-ro{-}{i}{ï}-ne-hoe-ren
-voet-bal-knie{-}{e}{ë}n
-cel-the-ra-pie{-}{e}{ë}n
-ha-gio-gra-fie{-}{e}{ë}n
-ge{-}{i}{ï}r-ri-teer-der
-in-stan-ta-n{é-}{}{ee}tje
-twee{-}{e}{ë}n-tach-tig
-ti-ra-mi-su{-}{}{–}tje
-ri-si-co-pa-ti{-}{e}{ë}nt
-po{-}{e}{ë}-zie-kri-tiek
-mi-to-chon-dri{-}{e}{ë}n
-je-zu{-}{i}{ï}e-ten-kerk
-in-ter-mezz{o-}{}{oo}tje
-com-mu-ni-qu{é-}{}{ee}tje
-co-ca{-}{i}{ï}-ne-kar-tel
-au-di{-}{e}{ë}n-tie-blad
-twee{-}{e}{ë}n-vijf-tig
-Pe-lo-pon-ne-si{-}{e}{ë}r
-co{-}{o}{ö}r-di-ne-ren-de
-ge{-}{i}{ï}n-fec-teer-de
-ge{-}{i}{ï}n-stal-leerd
-ge-co{-}{o}{ö}r-di-neerd
-ge{-}{i}{ï}n-for-meer-de
-ge-o-ri{-}{e}{ë}n-teer-de
-He-ver-lee{-}{e}{ë}-naar
-tech-no-lo-gie{-}{e}{ë}n
-lin-gu{-}{i}{ï}s-ti-sche
-ge{-}{i}{ï}n-spi-reer-de
-ge{-}{i}{ï}l-lu-streerd
-ge{-}{e}{ë}-mo-ti-o-neerd
-ge{-}{e}{ë}-man-ci-peerd
-co{-}{o}{ö}r-di-na-tri-ce
-co{-}{o}{ö}r-di-na-to-ren
-su{-}{i}{ï}-ci-de-ri-si-co
-thuis-ko-pi{-}{e}{ë}-ren
-su{-}{i}{ï}-ci-de-po-ging
-cli{-}{e}{ë}nt-ge-richt
-twee{-}{e}{ë}n-twin-tig
-kan-ker-pa-ti{-}{e}{ë}nt
-drie{-}{e}{ë}n-twin-tig
-be{-}{i}{ï}n-vloed-baar
-ge{-}{e}{ë}-ti-ket-teerd
-ge{-}{i}{ï}n-fil-treerd
-ge{-}{i}{ï}m-plan-teerd
-ge{-}{e}{ë}f-fec-tu-eerd
-twee{-}{e}{ë}n-veer-tig
-ge{-}{i}{ï}n-spec-teerd
-ge{-}{i}{ï}m-preg-neerd
-ge{-}{i}{ï}n-au-gu-reerd
-Em-ma{-}{u}{ü}s-gan-gers
-sui-ker-pa-ti{-}{e}{ë}nt
-pi{-}{e}{ë}-teits-vol-le
-nier-pa-ti{-}{e}{ë}n-ten
-reu-zen-pin-gu{-}{i}{ï}n
-in-tu{-}{i}{ï}-ti-o-nis-me
-co-ca{-}{i}{ï}-ne-maf-fia
-co{-}{o}{ö}-pe-ra-tie-ven
-hart-pa-ti{-}{e}{ë}n-ten
-co-ca{-}{i}{ï}ne-vangst
-aids-pa-ti{-}{e}{ë}n-ten
-zin-ko-gra-fie{-}{e}{ë}n
-co-ca{-}{i}{ï}ne-han-del
-darm-bac-te-ri{-}{e}{ë}n
-straf-ko-lo-ni{-}{e}{ë}n
-spe-ci-fi-ca-ti{-}{e}{ë}n
-sper-ma-to-zo{-}{i}{ï}-de
-spon-ta-ne{-}{i}{ï}-teit
-ca-ra-pa-ti{-}{e}{ë}n-ten
-re{-}{i}{ï}n-car-na-ties
-re-li{-}{e}{ë}f-druk-ken
-re-li{-}{e}{ë}f-kaar-ten
-pa-ti{-}{e}{ë}n-ten-zorg
-pa-ti{-}{e}{ë}n-tie-werk
-per-so-ni-fi{-}{e}{ë}-ren
-plu-to-cra-tie{-}{e}{ë}n
-po{-}{e}{ë}-zie-bun-dels
-pre-ju-di-ci{-}{e}{ë}-ren
-pre-si-den-ti{-}{e}{ë}-le
-pri-vi-le-gi{-}{e}{ë}-ren
-pro-mis-cu{-}{i}{ï}-teit
-pro-vi-den-ti{-}{e}{ë}-le
-psy-cho-hy-gi{-}{e}{ë}-ne
-ra-dio-gra-fie{-}{e}{ë}n
-ra-dio-sco-pie{-}{e}{ë}n
-ery-tro-po{-}{e}{ë}-ti-ne
-pan-the{-}{i}{ï}s-tisch
-och-lo-cra-tie{-}{e}{ë}n
-on-ge{-}{e}{ë}-ve-naar-de
-on-hy-gi{-}{e}{ë}-ni-sche
-ori{-}{e}{ë}n-ta-lis-ten
-or-tho-gra-fie{-}{e}{ë}n
-paas-com-mu-ni{-}{e}{ë}n
-in-ef-fi-ci{-}{e}{ë}n-tie
-in-suf-fi-ci{-}{e}{ë}n-te
-in-ten-si-fi{-}{e}{ë}-ren
-in-ter-li-ni{-}{e}{ë}-ren
-in-ter-ve-ni{-}{e}{ë}-ren
-je-zu{-}{i}{ï}e-ten-or-de
-kal-li-gra-fie{-}{e}{ë}n
-ki-lo-ca-lo-rie{-}{e}{ë}n
-kroon-ko-lo-ni{-}{e}{ë}n
-li-tho-gra-fie{-}{e}{ë}n
-ma-li{-}{e}{ë}n-kol-ders
-ma-ni{-}{e}{ë}-ris-tisch
-mi-li-eu-hy-gi{-}{e}{ë}-ne
-des-o-ri{-}{e}{ë}n-ta-tie
-des-o-ri{-}{e}{ë}n-te-ren
-dif-fe-ren-ti{-}{e}{ë}-le
-dit-to-gra-fie{-}{e}{ë}n
-di-ver-si-fi{-}{e}{ë}-ren
-fa-mi-lie-re{-}{u}{ü}-nie
-for-ti-fi-ca-ti{-}{e}{ë}n
-fra-se-o-lo-gie{-}{e}{ë}n
-ge-ar-cha{-}{i}{ï}-seerd
-ge{-}{e}{ë}m-ploy-eer-de
-ge{-}{e}{ë}xe-cu-teer-de
-ge{-}{e}{ë}x-pli-queerd
-ge{-}{i}{ï}m-pli-ceer-de
-ge{-}{i}{ï}n-te-greer-de
-ge{-}{i}{ï}n-ter-neer-de
-ge{-}{i}{ï}n-ti-meer-den
-ge{-}{i}{ï}n-ver-teer-de
-ge-ma-ni{-}{e}{ë}-reer-de
-ge{-}{u}{ü}ni-for-meerd
-ge{-}{u}{ü}r-ba-ni-seerd
-gram-ca-lo-rie{-}{e}{ë}n
-gra-ti-fi-ca-ti{-}{e}{ë}n
-her-de-fi-ni{-}{e}{ë}-ren
-he-ro{-}{i}{ï}-ne-han-del
-her-ori{-}{e}{ë}n-ta-tie
-her-ori{-}{e}{ë}n-te-ren
-hi{-}{e}{ë}-rar-chie{-}{e}{ë}n
-hi{-}{e}{ë}-rar-chi-sche
-hi{-}{e}{ë}-ro-gli-fisch
-hi{-}{e}{ë}-ro-gly-fisch
-hin-doe{-}{i}{ï}s-tisch
-Cu-ra-çao{-}{e}{ë}-naar
-car-ros-se-rie{-}{e}{ë}n
-chro-no-lo-gie{-}{e}{ë}n
-coc-ker-spa-ni{-}{e}{ë}l
-co{-}{i}{ï}n-ci-den-ties
-con-cor-dan-ti{-}{e}{ë}n
-con-fi-den-ti{-}{e}{ë}-le
-pa-ti{-}{e}{ë}n-ten-stop
-ar-cha{-}{i}{ï}s-ti-sche
-be{-}{i}{ï}n-vloed-ba-re
-ge{-}{i}{ï}m-mu-ni-seerd
-cli{-}{e}{ë}n-ten-recht
-drie{-}{e}{ë}n-veer-tig
-dis-tan-ti{-}{e}{ë}-ring
-ge{-}{e}{ë}x-ploi-teerd
-de-fi-ni{-}{e}{ë}-rin-gen
-va-cu{-}{u}{ü}m-ver-pakt
-fee{-}{e}{ë}n-ko-nin-gin
-maag-pa-ti{-}{e}{ë}n-ten
-jacht-tro-fee{-}{e}{ë}n
-pro-te-ro-zo{-}{i}{ï}-cum
-ge{-}{i}{ï}l-lu-mi-neerd
-se-mi-of-fi-ci{-}{e}{ë}-le
-ge{-}{i}{ï}n-ti-mi-deerd
-co-li-bac-te-ri{-}{e}{ë}n
-ge{-}{i}{ï}n-sti-tu-eerd
-ze-nuw-pa-ti{-}{e}{ë}n-te
-Over-flak-kee{-}{e}{ë}r
-cli{-}{e}{ë}n-ten-ra-den
-do-mi-ci-li{-}{e}{ë}-ring
-long-pa-ti{-}{e}{ë}n-ten
-cis-ter-ci{-}{e}{ë}n-zer
-ca-deau-idee{-}{e}{ë}n
-be{-}{i}{ï}n-vloe-den-de
-idee{-}{e}{ë}n-vor-ming
-bor-der-ter-ri{-}{e}{ë}r
-drie{-}{e}{ë}n-tach-tig
-drie{-}{e}{ë}n-vijf-tig
-he-ro{-}{i}{ï}-ne-vangst
-idee{-}{e}{ë}n-rijk-dom
-pro-te{-}{i}{ï}-ne-rij-ke
-in-con-ve-ni{-}{e}{ë}n-te
-ge{-}{i}{ï}n-ac-ti-veerd
-be-stel-au-t{o-}{}{oo}tje
-ge{-}{e}{ë}n-quê-teerd
-her-ders-po{-}{e}{ë}-zie
-fil-mo-gra-fie{-}{e}{ë}n
-mond-hy-gi{-}{e}{ë}-nist
-gly-co-pro-te{-}{i}{ï}-ne
-co-ma-pa-ti{-}{e}{ë}n-ten
-pre-fe-ren-ti{-}{e}{ë}-le
-am-bi-gu{-}{i}{ï}-tei-ten
-tbs-pa-ti{-}{e}{ë}n-ten
-lief-des-po{-}{e}{ë}-zie
-con-sci{-}{e}{ë}n-ti-eus
-bon-net-te-rie{-}{e}{ë}n
-zaal-pa-ti{-}{e}{ë}n-ten
-pest-bac-te-ri{-}{e}{ë}n
-mo-za{-}{i}{ï}ek-te-gels
-hi{-}{e}{ë}-rar-chie-ker
-ge{-}{u}{ü}ni-fi-ceer-de
-ge{-}{o}{ö}ri-en-teer-de
-ge{-}{i}{ï}n-si-nu-eer-de
-ge{-}{i}{ï}n-cli-neer-de
-ge{-}{e}{ë}x-tra-heer-de
-ge{-}{e}{ë}x-plo-reer-de
-ge{-}{e}{ë}x-pli-ceer-de
-ge{-}{e}{ë}x-pan-deer-de
-ge{-}{e}{ë}xor-ci-seerd
-ge{-}{e}{ë}x-cer-peer-de
-ge{-}{e}{ë}xal-teer-der
-ge{-}{e}{ë}s-cor-teer-de
-ge{-}{e}{ë}n-cryp-teerd
-ge{-}{e}{ë}n-ca-dreer-de
-ge{-}{e}{ë}er-bie-dig-de
-ge{-}{e}{ë}-clip-seer-de
-da-da{-}{i}{ï}s-ti-scher
-co{-}{o}{ö}-pe-ra-tie-ver
-co{-}{o}{ö}r-di-neer-den
-ge{-}{i}{ï}n-vol-veer-de
-hy-gi{-}{e}{ë}-ne-ei-sen
-hiv-pa-ti{-}{e}{ë}n-ten
-ge{-}{e}{ë}-ga-li-seer-de
-ge{-}{i}{ï}n-jec-teer-de
-ge{-}{e}{ë}x-tru-deer-de
-ge{-}{e}{ë}x-por-teer-de
-ge{-}{e}{ë}m-bar-keer-de
-ge{-}{i}{ï}n-cas-seer-de
-ge{-}{e}{ë}xa-mi-neer-de
-ge{-}{i}{ï}m-mi-greer-de
-ge{-}{e}{ë}-mail-leer-de
-hy-gi{-}{e}{ë}-ne-re-gels
-ge{-}{i}{ï}n-car-neer-de
-ge{-}{e}{ë}-li-mi-neer-de
-ge{-}{i}{ï}n-stru-eer-de
-me-de-pa-ti{-}{e}{ë}n-ten
-ge{-}{i}{ï}m-por-teer-de
-ge{-}{i}{ï}n-ves-teer-de
-ge{-}{i}{ï}n-ter-view-de
-ge{-}{e}{ë}n-sce-neer-de
-ge{-}{e}{ë}x-plo-deer-de
-ge{-}{e}{ë}-lek-tri-seerd
-her-ori{-}{e}{ë}n-teer-de
-des-ori{-}{e}{ë}n-teer-de
-va-cu{-}{u}{ü}m-ver-pak-te
-bor-der-ter-ri{-}{e}{ë}rs
-di-eet-pa-ti{-}{e}{ë}n-ten
-ge{-}{e}{ë}utha-na-seerd
-spier-atro-fie{-}{e}{ë}n
-va-gan-ten-po{-}{e}{ë}-zie
-su{-}{i}{ï}-ci-de-nei-ging
-si-mul-ta-ne{-}{i}{ï}-teit
-rijks-in-sig-ni{-}{e}{ë}n
-ori{-}{e}{ë}n-ta-tie-reis
-mo-no-the{-}{i}{ï}s-tisch
-ma-ro-qui-ne-rie{-}{e}{ë}n
-je-zu{-}{i}{ï}e-ten-stijl
-dis-har-mo-ni{-}{e}{ë}-ren
-Cu-ra-çao{-}{e}{ë}-naars
-twee{-}{e}{ë}n-ne-gen-tig
-kan-ker-pa-ti{-}{e}{ë}n-te
-ori{-}{e}{ë}n-ta-tie-jaar
-drie{-}{e}{ë}n-ne-gen-tig
-ge{-}{i}{ï}n-fec-teer-den
-ge-co{-}{o}{ö}r-di-neer-de
-ge{-}{i}{ï}n-te-res-seerd
-ge{-}{i}{ï}l-lu-streer-de
-ge{-}{e}{ë}-man-ci-peer-de
-co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
-pa-ti{-}{e}{ë}nt-re-la-tie
-ge{-}{i}{ï}n-ten-si-veerd
-ge{-}{e}{ë}x-pli-ci-teerd
-her-ori{-}{e}{ë}n-te-ring
-co-ca{-}{i}{ï}-ne-af-fai-re
-le-ver-pa-ti{-}{e}{ë}n-ten
-he-ro{-}{i}{ï}-ne-hoer-tje
-kunst-ga-le-rie{-}{e}{ë}n
-par-le-men-ta-ri{-}{e}{ë}r
-fonds-pa-ti{-}{e}{ë}n-ten
-ori{-}{e}{ë}n-ta-tie-punt
-cho-re-o-gra-fie{-}{e}{ë}n
-pit-bull-ter-ri{-}{e}{ë}r
-ast-ma-pa-ti{-}{e}{ë}n-ten
-he-ro{-}{i}{ï}-ne-ge-bruik
-free-style-ski{-}{e}{ë}n
-po{-}{e}{ë}-zie-fes-ti-val
-con-cur-ren-ti{-}{e}{ë}-le
-fa-mi-lie-re{-}{u}{ü}-nies
-ge{-}{i}{ï}n-ter-neer-den
-ze-nuw-pa-ti{-}{e}{ë}n-ten
-te-ken-aca-de-mi{-}{e}{ë}n
-ter-mi-no-lo-gie{-}{e}{ë}n
-sub-ca-te-go-rie{-}{e}{ë}n
-bu-reau-cra-tie{-}{e}{ë}n
-se-cu-la-ri-sa-ti{-}{e}{ë}n
-sper-ma-to-zo{-}{i}{ï}-den
-sa-cra-men-ta-li{-}{e}{ë}n
-ko-nings-pin-gu{-}{i}{ï}n
-rijks-aca-de-mi{-}{e}{ë}n
-pa-tri-ci{-}{e}{ë}rs-huis
-pest-epi-de-mie{-}{e}{ë}n
-pi{-}{e}{ë}-de-stal-le-tje
-psy-cho-lin-gu{-}{i}{ï}st
-co-ca{-}{i}{ï}-ne-smok-kel
-pan-the{-}{i}{ï}s-ti-sche
-mo-za{-}{i}{ï}ek-vloe-ren
-ori{-}{e}{ë}n-ta-lis-tiek
-in-suf-fi-ci{-}{e}{ë}n-tie
-je-zu{-}{i}{ï}e-ten-pa-ter
-kerk-pro-vin-ci{-}{e}{ë}n
-kies-quo-ti{-}{e}{ë}n-ten
-mond-hy-gi{-}{e}{ë}-nis-te
-dif-fe-ren-ti{-}{e}{ë}-len
-dif-fe-ren-ti{-}{e}{ë}-ren
-en-cy-clo-pe-die{-}{e}{ë}n
-ge{-}{e}{ë}-mo-ti-o-neer-de
-ge{-}{e}{ë}m-ploy-eer-den
-ge{-}{e}{ë}n-quê-teer-de
-ge{-}{i}{ï}m-pro-vi-seerd
-ge{-}{u}{ü}ni-for-meer-de
-ge{-}{u}{ü}r-ba-ni-seer-de
-griep-pa-ti{-}{e}{ë}n-ten
-her-ori{-}{e}{ë}n-ta-ties
-hi{-}{e}{ë}-rar-chi-scher
-hi{-}{e}{ë}-ro-gli-fi-sche
-hin-doe{-}{i}{ï}s-ti-sche
-im-per-ti-nen-ti{-}{e}{ë}n
-con-tro-ver-si{-}{e}{ë}-le
-co{-}{o}{ö}r-di-na-tri-ces
-cis-ter-ci{-}{e}{ë}n-zers
-co-ca{-}{i}{ï}-ne-ge-bruik
-com-men-ta-ri{-}{e}{ë}-ren
-aris-to-cra-tie{-}{e}{ë}n
-be-dis-cus-si{-}{e}{ë}-ren
-be-doe{-}{i}{ï}en-en-tent
-bi-blio-gra-fie{-}{e}{ë}n
-niet-of-fi-ci{-}{e}{ë}-le
-ori{-}{e}{ë}n-ta-tie-loop
-po-ly-the{-}{i}{ï}s-tisch
-ge{-}{i}{ï}n-ter-fe-reerd
-ge{-}{i}{ï}n-tro-du-ceerd
-lands-fi-nan-ci{-}{e}{ë}n
-on-ge{-}{i}{ï}n-spi-reerd
-ge{-}{i}{ï}n-cri-mi-neerd
-net-co{-}{o}{ö}r-di-na-tor
-ar-beids-hy-gi{-}{e}{ë}-ne
-ge{-}{e}{ë}x-tra-po-leerd
-kleur-va-ri{-}{e}{ë}-teit
-ge{-}{i}{ï}so-leerd-heid
-pro-Is-ra{-}{e}{ë}-lisch
-ge{-}{i}{ï}n-flu-en-ceerd
-pa-ti{-}{e}{ë}n-ten-recht
-su{-}{i}{ï}-ci-de-plan-nen
-her-de-fi-ni{-}{e}{ë}-ring
-bank-em-ploy{é-}{}{ee}tje
-kern-on-der-zee{-}{e}{ë}r
-ori{-}{e}{ë}n-ta-tie-fa-se
-zelf-ge-cre{-}{e}{ë}er-de
-buurt-con-ci{-}{e}{ë}r-ge
-cli{-}{e}{ë}n-ten-fol-der
-ge{-}{i}{ï}n-ter-po-leerd
-hi{-}{e}{ë}-ro-gly-fi-sche
-sub-si-di{-}{e}{ë}-rin-gen
-ori{-}{e}{ë}n-ta-tie-no-ta
-kaas-souf-fl{é-}{}{ee}tje
-ge{-}{e}{ë}-che-lon-neerd
-po-li-tie-au-t{o-}{}{oo}tje
-pa-ti{-}{e}{ë}n-ten-groep
-ge{-}{e}{ë}-co-no-mi-seerd
-pa-ti{-}{e}{ë}n-ten-stops
-in-con-ve-ni{-}{e}{ë}n-tie
-twee{-}{e}{ë}n-ze-ven-tig
-ge{-}{i}{ï}n-cor-po-reerd
-di-ver-si-fi{-}{e}{ë}-ring
-cho-co-la-te-rie{-}{e}{ë}n
-on-ge{-}{i}{ï}n-for-meerd
-be{-}{i}{ï}n-vloe-din-gen
-rijks-fi-nan-ci{-}{e}{ë}n
-reu-ma-pa-ti{-}{e}{ë}n-ten
-ma-ni{-}{e}{ë}-ris-ti-sche
-ge{-}{e}{ë}xe-cu-teer-den
-con-sci{-}{e}{ë}n-ti-eu-ze
-su{-}{i}{ï}-ci-de-ple-gers
-pyg-mee{-}{e}{ë}n-vol-ken
-prijs-the-o-rie{-}{e}{ë}n
-in-ter-ve-ni{-}{e}{ë}er-de
-in-stan-ta-n{é-}{}{ee}tjes
-ge{-}{i}{ï}n-fil-treer-de
-ge{-}{i}{ï}m-mu-ni-seer-de
-ge{-}{i}{ï}l-lu-mi-neer-de
-ge{-}{e}{ë}n-cryp-teer-de
-ge-welds-or-gie{-}{e}{ë}n
-ge-ma-ni{-}{e}{ë}-reer-der
-an-ci{-}{e}{ë}n-ni-tei-ten
-al-tru{-}{i}{ï}s-ti-scher
-re-ser-ve-ko-pie{-}{e}{ë}n
-ge{-}{i}{ï}n-ti-mi-deer-de
-niet-ma-te-ri{-}{e}{ë}-le
-sub-stan-ti{-}{e}{ë}-le-re
-ge{-}{e}{ë}-ti-ket-teer-de
-ge{-}{e}{ë}x-ploi-teer-de
-me-tho-do-lo-gie{-}{e}{ë}n
-ge{-}{e}{ë}f-fec-tu-eer-de
-ge{-}{i}{ï}-de-a-li-seer-de
-cli{-}{e}{ë}nt-ge-rich-te
-ge{-}{i}{ï}n-spec-teer-de
-an-ti-bac-te-ri{-}{e}{ë}-le
-kleu-ren-ko-pie{-}{e}{ë}n
-ge{-}{i}{ï}m-preg-neer-de
-fo-to-vol-ta{-}{i}{ï}-sche
-volks-me-lo-die{-}{e}{ë}n
-ge{-}{i}{ï}n-ter-view-den
-ge{-}{i}{ï}n-stal-leer-de
-ori{-}{e}{ë}n-ta-tie-lo-pen
-in-ter-net-ca-f{é-}{}{ee}tje
-sui-ker-pa-ti{-}{e}{ë}n-ten
-tijds-ori{-}{e}{ë}n-ta-tie
-so-ci{-}{e}{ë}-teits-le-ven
-slot-co{-}{o}{ö}r-di-na-tor
-school-con-ci{-}{e}{ë}r-ge
-po-ly-the{-}{i}{ï}s-ti-sche
-pa-ti{-}{e}{ë}nt-si-tu-a-tie
-pa-ti{-}{e}{ë}n-ten-stroom
-on-ge{-}{i}{ï}l-lu-streerd
-on-ge{-}{e}{ë}-man-ci-peerd
-mi-grai-ne-pa-ti{-}{e}{ë}nt
-je-zu{-}{i}{ï}e-ten-ker-ken
-cli{-}{e}{ë}n-ten-rech-ten
-cli{-}{e}{ë}n-ten-dos-sier
-bouw-co{-}{o}{ö}r-di-na-tor
-be-drijfs-hy-gi{-}{e}{ë}-ne
-dif-fe-ren-ti{-}{e}{ë}-ring
-ge{-}{i}{ï}n-ter-ve-ni-eerd
-po{-}{e}{ë}-zie-wed-strijd
-di-a-be-tes-pa-ti{-}{e}{ë}nt
-ge{-}{i}{ï}m-ple-men-teerd
-co{-}{o}{ö}r-di-na-tie-punt
-ge{-}{i}{ï}n-ter-pel-leerd
-ge{-}{i}{ï}n-ter-pre-teerd
-bulk-che-mi-ca-li{-}{e}{ë}n
-on-ge{-}{i}{ï}n-for-meer-de
-wild-wa-ter-ka-no{-}{e}{ë}n
-ge{-}{e}{ë}x-pe-ri-men-teer
-ge{-}{i}{ï}-den-ti-fi-ceerd
-ge{-}{i}{ï}n-te-res-seer-de
-markt-eco-no-mie{-}{e}{ë}n
-kan-ker-pa-ti{-}{e}{ë}n-ten
-par-le-men-ta-ri{-}{e}{ë}rs
-pa-ti{-}{e}{ë}nt-ge-bon-den
-mond-hy-gi{-}{e}{ë}-nis-ten
-co{-}{o}{ö}r-di-na-tie-team
-on-ge{-}{i}{ï}n-spi-reer-de
-ri-si-co-pa-ti{-}{e}{ë}n-ten
-boet-pre-di-ca-ti{-}{e}{ë}n
-kern-on-der-zee{-}{e}{ë}rs
-staats-fi-nan-ci{-}{e}{ë}n
-ve-ge-ta-ri{-}{e}{ë}rs-bond
-twee{-}{e}{ë}n-der-tig-ste
-ko-nings-pin-gu{-}{i}{ï}ns
-ge{-}{e}{ë}n-quê-teer-den
-pa-ti{-}{e}{ë}n-tie-wer-ken
-pit-bull-ter-ri{-}{e}{ë}rs
-post-in-dus-tri{-}{e}{ë}-le
-ras-sen-the-o-rie{-}{e}{ë}n
-atoom-on-der-zee{-}{e}{ë}r
-im-mo-bi-li{-}{e}{ë}n-markt
-on-ge-co{-}{o}{ö}r-di-neerd
-on-ge{-}{e}{ë}-mo-ti-o-neerd
-ope-ra-tie-pa-ti{-}{e}{ë}nt
-ori{-}{e}{ë}n-ta-lis-tisch
-je-zu{-}{i}{ï}e-ten-pa-ters
-dis-con-ti-nu{-}{i}{ï}-teit
-drie{-}{e}{ë}n-der-tig-ste
-fan-tas-ma-go-rie{-}{e}{ë}n
-ge-des-ori{-}{e}{ë}n-teerd
-ge{-}{e}{ë}n-ga-geerd-heid
-ge{-}{i}{ï}m-pro-vi-seer-de
-griep-epi-de-mie{-}{e}{ë}n
-idi-o-syn-cra-sie{-}{e}{ë}n
-bui-ten-pa-ro-chi{-}{e}{ë}n
-chres-to-ma-thie{-}{e}{ë}n
-cli{-}{e}{ë}n-te-lis-tisch
-cli{-}{e}{ë}n-ten-be-stand
-au-to-bio-gra-fie{-}{e}{ë}n
-leu-ke-mie-pa-ti{-}{e}{ë}nt
-hoofd-in-gre-di{-}{e}{ë}nt
-pin-gu{-}{i}{ï}n-ver-blijf
-ge{-}{e}{ë}-van-ge-li-seerd
-rest-ca-te-go-rie{-}{e}{ë}n
-in-con-ve-ni{-}{e}{ë}n-ties
-pro-Is-ra{-}{e}{ë}-li-sche
-ge{-}{i}{ï}n-cri-mi-neer-de
-ge{-}{i}{ï}-ni-ti-a-li-seerd
-ge{-}{e}{ë}n-ca-nail-leerd
-ge{-}{i}{ï}r-ri-teerd-heid
-ge{-}{i}{ï}n-doc-tri-neerd
-kei-zers-pin-gu{-}{i}{ï}ns
-stem-mings-po{-}{e}{ë}-zie
-zorg-co{-}{o}{ö}r-di-na-tor
-hyp-no-the-ra-pie{-}{e}{ë}n
-ge-zins-fi-nan-ci{-}{e}{ë}n
-je-zu{-}{i}{ï}e-ten-school
-ge{-}{e}{ë}en-en-twin-tigd
-wijk-co{-}{o}{ö}r-di-na-tor
-ba-sis-in-gre-di{-}{e}{ë}nt
-ge{-}{i}{ï}n-ter-rum-peerd
-non-com-mer-ci{-}{e}{ë}-le
-ge-her-ori{-}{e}{ë}n-teerd
-kos-ten-ef-fi-ci{-}{e}{ë}nt
-mee-dis-cus-si{-}{e}{ë}-ren
-po{-}{e}{ë}-zie-fes-ti-vals
-pre-in-dus-tri{-}{e}{ë}-le
-pa-ti{-}{e}{ë}nt-ge-ge-vens
-con-sci{-}{e}{ë}n-ti-eu-zer
-pool-co{-}{o}{ö}r-di-na-ten
-oor-logs-tro-fee{-}{e}{ë}n
-mi-ni-bio-gra-fie{-}{e}{ë}n
-la-tex-al-ler-gie{-}{e}{ë}n
-klas-se-pa-ti{-}{e}{ë}n-ten
-ge{-}{i}{ï}n-ter-po-leer-de
-ge{-}{e}{ë}-lek-tri-seer-de
-ge{-}{e}{ë}-co-no-mi-seer-de
-doods-fan-ta-sie{-}{e}{ë}n
-deel-stra-te-gie{-}{e}{ë}n
-co{-}{o}{ö}r-di-naat-as-sen
-cli{-}{e}{ë}n-ten-krin-gen
-au-di{-}{e}{ë}n-tie-bla-den
-dif-fe-ren-ti{-}{e}{ë}-rend
-mo-no-the{-}{i}{ï}s-ti-sche
-team-co{-}{o}{ö}r-di-na-tor
-ge{-}{i}{ï}n-cor-po-reer-de
-su{-}{i}{ï}-ci-de-po-gin-gen
-leer-stra-te-gie{-}{e}{ë}n
-ge{-}{e}{ë}x-pli-ci-teer-de
-ge{-}{e}{ë}x-tra-po-leer-de
-niet-fi-nan-ci{-}{e}{ë}-le
-niet-es-sen-ti{-}{e}{ë}-le
-ge{-}{i}{ï}n-ten-si-veer-de
-ge{-}{i}{ï}n-tro-du-ceer-de
-top-in-dus-tri{-}{e}{ë}-len
-na-zi-sym-pa-thie{-}{e}{ë}n
-pa-tri-ci{-}{e}{ë}rs-hui-zen
-sys-teem-the-o-rie{-}{e}{ë}n
-ge-zins-the-ra-pie{-}{e}{ë}n
-hiv-ge{-}{i}{ï}n-fec-teer-de
-po{-}{e}{ë}-zie-lief-heb-ber
-me-ta-lin-gu{-}{i}{ï}s-tisch
-goed-ge{-}{i}{ï}n-for-meerd
-epi-lep-sie-pa-ti{-}{e}{ë}nt
-cli{-}{e}{ë}n-ten-ver-ha-len
-Frans-Po-ly-ne-si{-}{e}{ë}r
-he-ro{-}{i}{ï}-ne-han-de-laar
-psy-cho-the-ra-pie{-}{e}{ë}n
-ge{-}{i}{ï}n-for-ma-ti-seerd
-re-gio-co{-}{o}{ö}r-di-na-tor
-ge{-}{i}{ï}n-ven-ta-ri-seerd
-niet-in-dus-tri{-}{e}{ë}-le
-ori{-}{e}{ë}n-ta-tie-cur-sus
-ge{-}{i}{ï}-den-ti-fi-ceer-de
-pa-ti{-}{e}{ë}n-ten-be-stand
-niet-com-mer-ci{-}{e}{ë}-le
-on-ge{-}{i}{ï}n-te-res-seerd
-twee{-}{e}{ë}n-twin-tig-ste
-va-cu{-}{u}{ü}m-ver-pak-king
-so-cio-lin-gu{-}{i}{ï}s-tiek
-staats-mo-no-po-li{-}{e}{ë}n
-ri-bo-nu-cle{-}{i}{ï}-ne-zuur
-pok-ken-epi-de-mie{-}{e}{ë}n
-psy-cho-hy-gi{-}{e}{ë}-nisch
-on-ge-co{-}{o}{ö}r-di-neer-de
-ori{-}{e}{ë}n-ta-tie-be-zoek
-ori{-}{e}{ë}n-ta-tie-pun-ten
-je-zu{-}{i}{ï}e-ten-col-le-ge
-le-pro-zen-ko-lo-ni{-}{e}{ë}n
-drie{-}{e}{ë}n-twin-tig-ste
-ge-des-ori{-}{e}{ë}n-teer-de
-ge-ma-ni{-}{e}{ë}-reerd-heid
-groeps-the-ra-pie{-}{e}{ë}n
-cor-ti-co-ste-ro{-}{i}{ï}-den
-as-te-ro{-}{i}{ï}-den-gor-del
-be-com-men-ta-ri{-}{e}{ë}-ren
-be-doe{-}{i}{ï}en-en-ten-ten
-atoom-on-der-zee{-}{e}{ë}rs
-in-koop-co{-}{o}{ö}-pe-ra-tie
-je-zu{-}{i}{ï}e-ten-scho-len
-ori{-}{e}{ë}n-ta-lis-ti-sche
-kleur-va-ri{-}{e}{ë}-tei-ten
-ex-kan-ker-pa-ti{-}{e}{ë}nt
-agro-in-dus-tri{-}{e}{ë}-le
-jeugd-co{-}{o}{ö}r-di-na-tor
-Nieuw-Ca-le-do-ni{-}{e}{ë}r
-pa-ti{-}{e}{ë}n-ten-dos-sier
-alz-hei-mer-pa-ti{-}{e}{ë}nt
-im-mo-bi-li{-}{e}{ë}n-sec-tor
-ge{-}{e}{ë}-ty-mo-lo-gi-seerd
-ba-sis-che-mi-ca-li{-}{e}{ë}n
-pa-tri-ci{-}{e}{ë}rs-wo-ning
-ge{-}{e}{ë}-lek-tro-cu-teerd
-ge{-}{i}{ï}n-stru-men-teerd
-we-reld-ori{-}{e}{ë}n-ta-tie
-niet-co{-}{o}{ö}-pe-ra-tief
-pa-ti{-}{e}{ë}nt-ma-te-ri-aal
-markt-stra-te-gie{-}{e}{ë}n
-re{-}{i}{ï}n-car-na-tie-leer
-cli{-}{e}{ë}n-ten-re-ke-ning
-he-mo-fi-lie-pa-ti{-}{e}{ë}nt
-cli{-}{e}{ë}n-ten-plat-form
-ge{-}{e}{ë}-lek-tri-fi-ceerd
-ge{-}{e}{ë}x-com-mu-ni-ceerd
-pa-ti{-}{e}{ë}n-ten-stro-men
-he-ro{-}{i}{ï}-ne-ge-brui-ker
-ba-sis-in-dus-trie{-}{e}{ë}n
-cli{-}{e}{ë}n-te-lis-ti-sche
-twee-deurs-au-t{o-}{}{oo}tje
-le-vens-ori{-}{e}{ë}n-ta-tie
-an-nu{-}{i}{ï}-tei-ten-ba-sis
-zui-vel-co{-}{o}{ö}-pe-ra-tie
-ge{-}{e}{ë}u-ro-pe-a-ni-seerd
-speel-goed-au-t{o-}{}{oo}tje
-ano-rexia-pa-ti{-}{e}{ë}n-te
-ge{-}{i}{ï}n-ter-na-li-seerd
-mi-li-eu-hy-gi{-}{e}{ë}-nisch
-ge{-}{e}{ë}x-pe-ri-men-teerd
-on-ge{-}{e}{ë}-man-ci-peer-de
-te-ta-nus-bac-te-ri{-}{e}{ë}n
-se-mi-in-dus-tri{-}{e}{ë}-le
-re-li-kwie{-}{e}{ë}n-kast-je
-pa-ti{-}{e}{ë}nt-si-tu-a-ties
-on-ge{-}{i}{ï}l-lu-streer-de
-net-co{-}{o}{ö}r-di-na-to-ren
-mee-ge{-}{i}{ï}n-stal-leerd
-ma-la-ria-pa-ti{-}{e}{ë}n-ten
-in-cest-the-ra-pie{-}{e}{ë}n
-ge{-}{i}{ï}n-ter-rum-peer-de
-ge{-}{i}{ï}n-ter-pun-geer-de
-ge{-}{e}{ë}x-ter-na-li-seerd
-ge{-}{e}{ë}-van-ge-li-seer-de
-ge{-}{e}{ë}-lek-tro-ly-seerd
-dif-fe-ren-ti{-}{e}{ë}-ren-de
-twee{-}{e}{ë}n-veer-tig-ste
-hoofd-ca-te-go-rie{-}{e}{ë}n
-ge{-}{i}{ï}n-ter-pre-teer-de
-di-a-ly-se-pa-ti{-}{e}{ë}n-ten
-pa-ti{-}{e}{ë}n-ten-rech-ten
-ge{-}{i}{ï}m-ple-men-teer-de
-pa-ti{-}{e}{ë}n-ten-groe-pen
-ge{-}{i}{ï}n-doc-tri-neer-de
-ge{-}{i}{ï}n-te-res-seer-den
-com-plot-the-o-rie{-}{e}{ë}n
-as-te-ro{-}{i}{ï}-den-gor-dels
-ge-drags-the-ra-pie{-}{e}{ë}n
-evo-lu-tie-the-o-rie{-}{e}{ë}n
-bor-der-li-ne-pa-ti{-}{e}{ë}nt
-trein-be{-}{i}{ï}n-vloe-ding
-school-co{-}{o}{ö}r-di-na-tor
-po{-}{e}{ë}-zie-tijd-schrift
-me-ta-lin-gu{-}{i}{ï}s-ti-sche
-je-zu{-}{i}{ï}e-ten-kloos-ter
-hu-we-lijks-quo-ti{-}{e}{ë}nt
-be{-}{i}{ï}n-vloe-dings-waan
-ge{-}{e}{ë}n-thou-si-as-meerd
-kruis-sub-si-di{-}{e}{ë}-ring
-mi-li-eu-co{-}{o}{ö}r-di-na-tor
-links-ge-o-ri{-}{e}{ë}n-teerd
-de-fi-ci{-}{e}{ë}n-tie-ziek-te
-ver-koop-co{-}{o}{ö}-pe-ra-tie
-ope-ra-tie-pa-ti{-}{e}{ë}n-ten
-che-mi-ca-li{-}{e}{ë}n-tan-ker
-zen-der-co{-}{o}{ö}r-di-na-tor
-co{-}{o}{ö}r-di-na-tie-or-gaan
-be{-}{i}{ï}n-vloed-baar-heid
-be-roeps-ori{-}{e}{ë}n-ta-tie
-goed-ge{-}{i}{ï}n-for-meer-de
-pa-ti{-}{e}{ë}n-ten-dos-siers
-he-ro{-}{i}{ï}-ne-ge-brui-kers
-volks-de-mo-cra-tie{-}{e}{ë}n
-volks-ety-mo-lo-gie{-}{e}{ë}n
-zie-ken-huis-pa-ti{-}{e}{ë}nt
-ve-ge-ta-ri{-}{e}{ë}rs-bon-den
-hoofd-in-gre-di{-}{e}{ë}n-ten
-schil-der-aca-de-mi{-}{e}{ë}n
-ge-meen-te-fi-nan-ci{-}{e}{ë}n
-psy-cho-lin-gu{-}{i}{ï}s-tiek
-pa-ti{-}{e}{ë}n-ten-plat-form
-ener-gie-ef-fi-ci{-}{e}{ë}nt
-groot-in-dus-tri{-}{e}{ë}-len
-on-ge{-}{i}{ï}n-te-res-seer-de
-je-zu{-}{i}{ï}e-ten-col-le-ges
-leu-ke-mie-pa-ti{-}{e}{ë}n-ten
-dis-con-ti-nu{-}{i}{ï}-tei-ten
-don-qui-chot-te-rie{-}{e}{ë}n
-he-ro{-}{i}{ï}-ne-ver-sla-ving
-cli{-}{e}{ë}n-ten-be-stan-den
-co{-}{o}{ö}r-di-na-tie-cen-tra
-hiv-ge{-}{i}{ï}n-fec-teer-de
-le-vens-be{-}{e}{ë}in-di-ging
-twee{-}{e}{ë}n-der-tig-ja-rig
-vei-lig-heids-va-cu{-}{u}{ü}m
-mi-grai-ne-pa-ti{-}{e}{ë}n-ten
-be-drijfs-fi-nan-ci{-}{e}{ë}n
-ram-pen-co{-}{o}{ö}r-di-na-tor
-in-gre-di{-}{e}{ë}n-ten-lijst
-cli{-}{e}{ë}nt-volg-sys-teem
-co{-}{o}{ö}r-di-naat-stel-sel
-melk-zuur-bac-te-ri{-}{e}{ë}n
-drie{-}{e}{ë}n-der-tig-ja-rig
-dif-fe-ren-ti{-}{e}{ë}-rin-gen
-team-co{-}{o}{ö}r-di-na-tri-ce
-wo-ning-co{-}{o}{ö}-pe-ra-ties
-kos-ten-ef-fi-ci{-}{e}{ë}n-tie
-ano-rexia-pa-ti{-}{e}{ë}n-ten
-on-ge{-}{i}{ï}-den-ti-fi-ceerd
-im-mo-bi-li{-}{e}{ë}n-kan-toor
-he-ro{-}{i}{ï}-ne-ver-slaaf-de
-in-ter-mi-nis-te-ri{-}{e}{ë}-le
-pa-tri-ci{-}{e}{ë}rs-fa-mi-lie
-re-li-kwie{-}{e}{ë}n-kast-jes
-ma-la-ria-epi-de-mie{-}{e}{ë}n
-ge{-}{e}{ë}x-ter-na-li-seer-de
-ge{-}{e}{ë}x-com-mu-ni-ceer-de
-co{-}{o}{ö}-pe-ra-tie-win-kels
-cli{-}{e}{ë}n-ten-plat-forms
-tu-ber-kel-bac-te-ri{-}{e}{ë}n
-zorg-co{-}{o}{ö}r-di-ne-ren-de
-mi-li-eu-co{-}{o}{ö}-pe-ra-ties
-boe-ren-co{-}{o}{ö}-pe-ra-ties
-ba-sis-in-gre-di{-}{e}{ë}n-ten
-ge{-}{e}{ë}-lek-tro-cu-teer-de
-ge{-}{e}{ë}-lek-tri-fi-ceer-de
-bij-stands-cli{-}{e}{ë}n-ten
-pa-ti{-}{e}{ë}n-ten-ge-ge-vens
-ge{-}{i}{ï}n-ven-ta-ri-seer-de
-kos-ten-ca-te-go-rie{-}{e}{ë}n
-zorg-co{-}{o}{ö}r-di-na-to-ren
-co-ca{-}{i}{ï}-ne-ge-brui-kers
-milt-vuur-bac-te-ri{-}{e}{ë}n
-mi-li-eu-hy-gi{-}{e}{ë}-ni-sche
-po{-}{e}{ë}-zie-lief-heb-bers
-al-ler-gie-pa-ti{-}{e}{ë}n-ten
-di-a-be-tes-pa-ti{-}{e}{ë}n-ten
-pa-tri-ci{-}{e}{ë}rs-fa-mi-lies
-de-fi-ci{-}{e}{ë}n-tie-ziek-tes
-va-cu{-}{u}{ü}m-ver-pak-kin-gen
-tekst-ge-o-ri{-}{e}{ë}n-teer-de
-re{-}{i}{ï}n-car-na-tie-ses-sie
-co{-}{o}{ö}r-di-na-ten-sys-teem
-co{-}{o}{ö}r-di-na-ten-stel-sel
-cli{-}{e}{ë}n-ten-in-for-ma-tie
-cli{-}{e}{ë}n-ten-be-spre-king
-be-leids-co{-}{o}{ö}r-di-na-tor
-an-nu{-}{i}{ï}-tei-ten-sys-teem
-de-fi-ci{-}{e}{ë}n-tie-ziek-ten
-ge{-}{i}{ï}n-di-vi-du-a-li-seerd
-ori{-}{e}{ë}n-ta-tie-be-zoe-ken
-im-mo-bi-li{-}{e}{ë}n-kan-to-ren
-hiv-ge{-}{i}{ï}n-fec-teer-den
-al-machts-fan-ta-sie{-}{e}{ë}n
-ener-gie-ef-fi-ci{-}{e}{ë}n-te
-ma-la-ria-epi-de-mie{-}{e}{ë}n
-drie{-}{e}{ë}n-der-tig-ja-ri-ge
-links-ge-o-ri{-}{e}{ë}n-teer-de
-spits-tech-no-lo-gie{-}{e}{ë}n
-over-heids-fi-nan-ci{-}{e}{ë}n
-zie-ken-fonds-pa-ti{-}{e}{ë}nt
-stu-den-ten-so-ci{-}{e}{ë}-teit
-he-ro{-}{i}{ï}-ne-ver-slaaf-den
-pro-ject-co{-}{o}{ö}r-di-na-tor
-bak-ke-rij-in-gre-di{-}{e}{ë}nt
-co{-}{o}{ö}r-di-na-tie-cen-trum
-land-bouw-co{-}{o}{ö}-pe-ra-tie
-cho-le-ra-epi-de-mie{-}{e}{ë}n
-co-ca{-}{i}{ï}-ne-in-spui-ting
-oud-par-le-men-ta-ri{-}{e}{ë}r
-twee{-}{e}{ë}n-der-tig-ja-ri-ge
-han-dels-com-pag-nie{-}{e}{ë}n
-ge{-}{i}{ï}n-du-stri-a-li-seerd
-co{-}{o}{ö}r-di-na-tie-co-mi-té
-Eu-ro-par-le-men-ta-ri{-}{e}{ë}r
-alz-hei-mer-pa-ti{-}{e}{ë}n-ten
-che-mi-ca-li{-}{e}{ë}n-tan-kers
-idee{-}{e}{ë}n-ge-schie-de-nis
-be{-}{i}{ï}n-vloe-dings-wa-nen
-be-leids-co{-}{o}{ö}r-di-na-tie
-ori{-}{e}{ë}n-ta-tie-ver-mo-gen
-che-mi-ca-li{-}{e}{ë}n-ge-bruik
-pa-ti{-}{e}{ë}n-ten-plat-forms
-tran-sis-tor-ra-di-{o-}{}{oo}tje
-twee{-}{e}{ë}n-twin-tig-ja-rig
-he-ro{-}{i}{ï}-ne-ex-pe-ri-ment
-drie{-}{e}{ë}n-twin-tig-ja-rig
-ver-ma-ge-rings-di{-}{e}{ë}-ten
-ope-nings-ce-re-mo-ni{-}{e}{ë}n
-ge-spreks-the-ra-pie{-}{e}{ë}n
-on-ge{-}{i}{ï}-den-ti-fi-ceer-de
-he-mo-fi-lie-pa-ti{-}{e}{ë}n-ten
-epi-lep-sie-pa-ti{-}{e}{ë}n-ten
-vis-sers-co{-}{o}{ö}-pe-ra-ties
-re-gio-co{-}{o}{ö}r-di-na-to-ren
-pso-ri-a-sis-pa-ti{-}{e}{ë}n-ten
-he-ro{-}{i}{ï}-ne-pros-ti-tu-ees
-ge{-}{e}{ë}n-thou-si-as-meer-de
-co{-}{o}{ö}r-di-naat-stel-sels
-co-ca{-}{i}{ï}-ne-trans-por-ten
-cli{-}{e}{ë}n-ten-re-ke-nin-gen
-be-roeps-ca-te-go-rie{-}{e}{ë}n
-hy-gi{-}{e}{ë}-ne-maat-re-ge-len
-sa-la-ris-ca-te-go-rie{-}{e}{ë}n
-markt-ge-o-ri{-}{e}{ë}n-teer-de
-le-vens-be{-}{e}{ë}in-di-gen-de
-co-ca{-}{i}{ï}-ne-ver-slaaf-den
-pro-duct-ca-te-go-rie{-}{e}{ë}n
-co{-}{o}{ö}r-di-na-tie-co-mi-tés
-su{-}{i}{ï}-ci-de-pro-ble-ma-tiek
-pa-ti{-}{e}{ë}n-ten-bij-slui-ter
-dif-fe-ren-tie-quo-ti{-}{e}{ë}nt
-pro-bleem-de-fi-ni{-}{e}{ë}-ring
-top-sport-co{-}{o}{ö}r-di-na-tor
-he-ro{-}{i}{ï}-ne-ver-strek-king
-land-bouw-che-mi-ca-li{-}{e}{ë}n
-oog-hand-co{-}{o}{ö}r-di-na-tie
-le-gi-o-nel-la-bac-te-ri{-}{e}{ë}n
-po-li-tiek-fi-nan-ci{-}{e}{ë}-le
-zie-ken-huis-pa-ti{-}{e}{ë}n-ten
-ver-bruiks-co{-}{o}{ö}-pe-ra-tie
-pa-ti{-}{e}{ë}n-ten-ver-e-ni-ging
-ori{-}{e}{ë}n-ta-tie-cur-sus-sen
-oud-par-le-men-ta-ri{-}{e}{ë}rs
-pa-ti{-}{e}{ë}n-ten-in-for-ma-tie
-twee{-}{e}{ë}n-twin-tig-ja-ri-ge
-be-drijfs-be{-}{e}{ë}in-di-ging
-arts-pa-ti{-}{e}{ë}nt-re-la-tie
-cam-pag-ne-co{-}{o}{ö}r-di-na-tor
-co{-}{o}{ö}r-di-na-ten-sys-te-men
-re{-}{i}{ï}n-car-na-tie-the-o-rie
-ener-gie-ef-fi-ci{-}{e}{ë}n-tie
-ge-drags-be{-}{i}{ï}n-vloe-ding
-bor-der-li-ne-pa-ti{-}{e}{ë}n-ten
-drie{-}{e}{ë}n-twin-tig-ja-ri-ge
-Eu-ro-par-le-men-ta-ri{-}{e}{ë}rs
-land-bouw-co{-}{o}{ö}-pe-ra-ties
-school-co{-}{o}{ö}r-di-na-to-ren
-re-gres-sie-the-ra-pie{-}{e}{ë}n
-pro-ces-tech-no-lo-gie{-}{e}{ë}n
-ob-ject-ge-o-ri{-}{e}{ë}n-teer-de
-ma-na-ge-ment-the-o-rie{-}{e}{ë}n
-co{-}{o}{ö}r-di-na-ten-stel-sels
-ci-lin-der-co{-}{o}{ö}r-di-na-ten
-be-stu-rings-the-o-rie{-}{e}{ë}n
-be-drijfs-stra-te-gie{-}{e}{ë}n
-pa-ti{-}{e}{ë}n-ten-po-pu-la-ties
-in-ko-mens-ca-te-go-rie{-}{e}{ë}n
-ge{-}{i}{ï}n-di-vi-du-a-li-seer-de
-ge{-}{i}{ï}n-du-stri-a-li-seer-de
-pro-duc-tie-stra-te-gie{-}{e}{ë}n
-re{-}{i}{ï}n-car-na-tie-the-ra-pie
-net-werk-tech-no-lo-gie{-}{e}{ë}n
-con-ti-nu{-}{i}{ï}-teits-stre-ven
-cli{-}{e}{ë}n-ten-voor-lich-ting
-doel-groep-de-fi-ni{-}{e}{ë}-ring
-on-ge{-}{i}{ï}n-te-res-seerd-heid
-an-nu{-}{i}{ï}-tei-ten-hy-po-theek
-pro-gram-ma-co{-}{o}{ö}r-di-na-tor
-kun-ste-naars-so-ci{-}{e}{ë}-teit
-zie-ken-fonds-pa-ti{-}{e}{ë}n-ten
-ver-bruiks-co{-}{o}{ö}-pe-ra-ties
-stu-den-ten-so-ci{-}{e}{ë}-tei-ten
-ori{-}{e}{ë}n-te-rings-ver-mo-gen
-in-flu-en-za-epi-de-mie{-}{e}{ë}n
-leef-tijds-ca-te-go-rie{-}{e}{ë}n
-drie{-}{e}{ë}n-twin-tig-dui-zend
-bak-ke-rij-in-gre-di{-}{e}{ë}n-ten
-co{-}{o}{ö}r-di-na-tie-com-mis-sie
-ar-chi-tec-tuur-bi{-}{e}{ë}n-na-le
-be-las-ting-co{-}{o}{ö}r-di-na-tie
-Equa-to-ri-aal-Gui-nee{-}{e}{ë}r
-co{-}{o}{ö}r-di-na-to-ren-over-leg
-ge-meen-te-se-cre-ta-rie{-}{e}{ë}n
-dif-fu-sie-co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
-be-drijfs-con-ti-nu{-}{i}{ï}-teit
-mi-li-tair-in-dus-tri{-}{e}{ë}-le
-pa-ti{-}{e}{ë}n-ten-or-ga-ni-sa-tie
-vrije-markt-eco-no-mie{-}{e}{ë}n
-voe-dings-in-gre-di{-}{e}{ë}n-ten
-pa-ti{-}{e}{ë}nt-vrien-de-lij-ker
-on-der-houds-the-ra-pie{-}{e}{ë}n
-mar-ke-ting-fi-lo-so-fie{-}{e}{ë}n
-fil-ter-co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
-com-bi-na-tie-the-ra-pie{-}{e}{ë}n
-cli{-}{e}{ë}n-ten-be-spre-kin-gen
-brand-won-den-pa-ti{-}{e}{ë}n-ten
-af-stam-mings-the-o-rie{-}{e}{ë}n
-hy-gi{-}{e}{ë}-ne-voor-schrif-ten
-co{-}{o}{ö}r-di-na-tie-pro-ble-men
-cli{-}{e}{ë}n-ten-or-ga-ni-sa-ties
-tu-ber-cu-lo-se-pa-ti{-}{e}{ë}n-ten
-borst-kan-ker-pa-ti{-}{e}{ë}n-ten
-mar-ke-ting-stra-te-gie{-}{e}{ë}n
-rich-tings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
-eco-no-misch-fi-nan-ci{-}{e}{ë}-le
-op-lei-dings-co{-}{o}{ö}r-di-na-tor
-pa-ti{-}{e}{ë}n-ten-voor-lich-ting
-pa-ti{-}{e}{ë}n-ten-de-mon-stra-tie
-op-los-sings-stra-te-gie{-}{e}{ë}n
-in-tel-li-gen-tie-quo-ti{-}{e}{ë}nt
-ge{-}{i}{ï}n-ter-na-ti-o-na-li-seerd
-re{-}{i}{ï}n-car-na-tie-the-ra-peut
-dif-fe-ren-ti-aal-quo-ti{-}{e}{ë}nt
-wrij-vings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
-on-der-zoeks-co{-}{o}{ö}r-di-na-tor
-ge{-}{i}{ï}n-sti-tu-ti-o-na-li-seerd
-co{-}{o}{ö}r-di-na-tie-com-mis-sies
-pa-ti{-}{e}{ë}n-ten-ver-e-ni-gin-gen
-dif-fe-ren-tie-quo-ti{-}{e}{ë}n-ten
-be-leg-gings-stra-te-gie{-}{e}{ë}n
-ver-pleeg-huis-pa-ti{-}{e}{ë}n-ten
-niet-ge{-}{i}{ï}-den-ti-fi-ceer-de
-ge-lei-dings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
-maat-schap-pij-ori{-}{e}{ë}n-ta-tie
-vei-lig-heids-co{-}{o}{ö}r-di-na-tor
-pa-ti{-}{e}{ë}n-ten-de-mon-stra-ties
-im-mo-bi-li{-}{e}{ë}n-maat-schap-pij
-ef-fi-ci{-}{e}{ë}n-tie-ver-be-te-ring
-cor-re-la-tie-co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
-ont-wik-ke-lings-the-o-rie{-}{e}{ë}n
-dif-fu-sie-co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
-ca-su{-}{i}{ï}s-tiek-be-spre-kin-gen
-ge{-}{i}{ï}n-sti-tu-ti-o-na-li-seer-de
-over-le-vings-stra-te-gie{-}{e}{ë}n
-lan-ge-ter-mijn-stra-te-gie{-}{e}{ë}n
-fi-nan-ci{-}{e}{ë}-le-dien-sten-groep
-uit-zet-tings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}nt
-con-ti-nu{-}{i}{ï}-teits-over-we-ging
-wrij-vings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
-rich-tings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
-col-le-ga-par-le-men-ta-ri{-}{e}{ë}rs
-on-der-ne-mings-stra-te-gie{-}{e}{ë}n
-cor-re-la-tie-co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
-be-sluit-vor-mings-the-o-rie{-}{e}{ë}n
-be{-}{i}{ï}n-vloe-dings-mo-ge-lijk-heid
-uit-zet-tings-co{-}{e}{ë}f-fi-ci{-}{e}{ë}n-ten
-her-ori{-}{e}{ë}n-te-rings-ge-sprek-ken
-con-ti-nu{-}{i}{ï}-teits-over-we-gin-gen
-com-mu-ni-ca-tie-tech-no-lo-gie{-}{e}{ë}n
-be{-}{i}{ï}n-vloe-dings-mo-ge-lijk-he-den
diff --git a/Master/texmf-dist/tex/context/patterns/lang-nl.rme b/Master/texmf-dist/tex/context/patterns/lang-nl.rme
index 9b3a852abc8..daa80ef2f72 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-nl.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-nl.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Dutch Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -95,4 +99,4 @@
% VERSION: 1.1 (November 1996) Copyright changed March 2000
%
% AUTHOR: Piet Tutelaers P.T.H.Tutelaers@tue.nl
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-nl.rpl b/Master/texmf-dist/tex/context/patterns/lang-nl.rpl
deleted file mode 100644
index 7622711ec92..00000000000
--- a/Master/texmf-dist/tex/context/patterns/lang-nl.rpl
+++ /dev/null
@@ -1,12948 +0,0 @@
-.aan1
-.aans4
-.aart4
-.aarts3
-.aat1
-.ab1l
-.acht3s
-.ad1s
-.af1
-.air1
-.al3ee
-.aline3a'
-.al3k2
-.alko3v
-.al3om
-.al4st
-.an1d
-.an3gl
-.an1s
-.an3th
-.ar3tr
-.as1c
-.as1l
-.as3tr
-.aus1
-.a-2
-.baan3
-.ba3lo
-.bli2
-.ca4pe
-.co2k
-.co3ro
-.c-2
-.dag3r
-.dag3s
-.da4te.
-.da4tes
-.de4k3l
-.dek3s
-.den4k3l
-.den4k3r
-.de1o
-.de3ra
-.des3tr
-.di3ac
-.di3ad
-.di4aloo
-.di4at
-.die4pi
-.dier3o
-.die3tj
-.di1o
-.di2s
-.doet3
-.do1v
-.du3ro
-.du4wer
-.d-2
-.ede4la
-.ed1w
-.ee2
-.een3e
-.eet1
-.ei1l
-.ei3sp
-.eks2
-.el1d
-.en3th
-.en3tj
-.er3af
-.er4f3l
-.er3in
-.er3on
-.es1
-.eten4d
-.et3sten
-.etui3
-.eu1
-.eus1
-.e-2
-.fra4me.
-.f-2
-.ga4me.
-.gea3v
-.ge3d
-.ge3l4a
-.gelo3v
-.ge3nac
-.ge3n4as
-.ge3n4o
-.ge3ra
-.ge3r4e
-.ge3ro
-.gerst3a
-.ges4k
-.geto3v
-.get4r
-.ge3v
-.g-2
-.haat3
-.he2a
-.he4r3i
-.hier3
-.ho4les
-.huts3t
-.h-2
-.ij4s3l
-.ijs3p
-.ijs3t
-.in1a2
-.in1d4
-.in1e
-.in5g4
-.in3kl
-.in3kr
-.in1s2
-.is1c
-.iso1
-.i-2
-.ka3dr
-.keet3je.
-.ken3s
-.ke3ra
-.ker4k3l
-.ker4k3u
-.ko3pe
-.ko4p5l
-.kore4
-.ko1v
-.laat4j
-.laat3ste
-.la3tr
-.le2b1
-.leer3
-.leg3o
-.le4g3r
-.lei3s4
-.lens3
-.lente3
-.le5r4
-.le2s1
-.le3th
-.li2f
-.lin4k3j
-.lo1v
-.lu1e
-.luid3s4
-.lui3tj
-.maat3
-.ma4k3as
-.me3la
-.me3ra
-.mer4k3l
-.met3ee
-.miet3j
-.mij4n3i
-.mi4ne.
-.mos1
-.mo4st
-.mo3ven
-.mo3ver
-.naat3
-.na1k
-.na1l
-.na1s
-.ne2k1
-.nes3te
-.ne4t3j
-.ne4tr
-.neu4t3j
-.niet3j
-.no3pe
-.no1v
-.nucle4
-.oce1
-.oe2r1
-.oes1
-.of1
-.oi2
-.ol1f
-.olie3
-.om1
-.on1d
-.on3ee
-.on3et
-.on1i
-.on1k
-.on3oo
-.on1s
-.on4t3ee
-.on4t3e4ren
-.on4t3e4ri
-.on4trad
-.on4tri
-.on4t3rol
-.oor1
-.oot4je.
-.op5l
-.op1r
-.ops2
-.orkes5tree
-.or1t
-.os1
-.ove4re
-.ove4rin
-.pee3tj
-.pe3lo
-.pe3na
-.peri3
-.per4s3te.
-.piet3j
-.pi4naa
-.pla4cem
-.plee3t
-.poort3j
-.po4st
-.po1v
-.pui3tj
-.quo4te.
-.raat4
-.radi3o'
-.rat3j
-.rea4n
-.ree3t
-.regi3o'
-.re3kr
-.re4men
-.re3no
-.reno3v
-.ren3s
-.re4sc
-.ries3
-.rie4t3a
-.riet3j
-.rij3sp
-.ring3s4
-.ri1o
-.roe3tj
-.ro2l1
-.ro4s3t
-.ro1v
-.rug1
-.ruit3j
-.ru2s
-.rus3h
-.sa1v
-.scenari5o'
-.sci1
-.see1
-.se3ra
-.se3r4e
-.ser4ve.
-.ser4ves
-.set1
-.side3
-.si4te
-.sj2
-.sli4c
-.so2k
-.sour4c
-.spoor3
-.st4
-.stel4t3j
-.ste4m
-.sto3v
-.studi3o'
-.taart3j
-.tag1
-.te2a
-.ten3ac
-.te3nan
-.te3no
-.ten3s
-.tent3j
-.ter4p3a
-.ter3s
-.te2s
-.ti4me.
-.ti4med
-.ti2n
-.tin3a4
-.to4lo
-.toot4j
-.to4pl
-.to1v
-.traat4
-.ts2
-.tu4ne.
-.ui1s
-.ur4a
-.vaart5jes
-.va3lo
-.vent3j
-.ver3a
-.ve4rei
-.ve4r3e4r
-.ve4rij
-.ves1
-.vet3j
-.ve4t3r
-.vide3o'
-.vloot4j
-.voy1
-.vul1
-.v-2
-.wal4s3te.
-.wa2v
-.wee4t3
-.we4l3a
-.we4l3in
-.wen4s3t
-.wer4kr
-.wer4pl
-.west3r
-.wi2n
-.win4s
-.wi2r
-.wi2t1
-.xe1
-.x-2
-.zet3j
-.zi2t1
-a2a2
-aad1a
-aad1e
-aad1o2
-aad1r
-aaf1
-aag1
-aags4o
-aai1
-aak1a
-aak1e2
-aak1i
-aak1l
-aak1o
-aak1r
-aak3sp
-aak1u
-aal1a2
-aal1e
-aal1i
-aal1k
-aal1o2
-aal3so
-aal1u
-aam1a
-aam1p
-aan1a
-3aandee
-3aandu
-aan1e2
-aan3g
-3aanges
-aan1i2
-aan1k
-1aann
-aan1o2
-aans4po
-aan1t
-3aanva
-3aanvr
-aap1a
-aap1i
-aap1o2
-aap1r
-aar1a2
-aar4du
-aar1e2
-aar1i
-aar1k
-aar1o2
-aas1e2
-aas1l
-aas1p
-aat1a2
-aat1e
-aat3ha
-aat3ho
-aat1i
-aat1o
-aat1r
-2abaa
-abak4s
-aba2l
-abe4laa
-abe4l3ac
-abe4l3o4
-2abes
-3abolo
-abo1s
-abot4j
-ab1ru
-1abso
-a3cal
-2ace
-a2ce.
-a2cea
-a2cec
-a2cef
-a3cen
-a4cepa
-ace1s
-a4cesp
-a4cest
-a2cew
-a1cha
-a1che
-a4cheg
-a1chi
-ach1l
-a1cho
-a1chr
-4achrone
-4achs
-a1chu
-2acl
-2a1co
-ac4tac
-ac4tav
-actmana4
-ac4ton
-ad1ac
-ad1a2d
-ad1ak
-ada2r1
-adas1
-ad1au
-2add
-ade3roo
-ade3st
-adi1a
-adoe4l3
-1adop
-ad1ov
-a1dri
-ad3rui
-ad3spi
-ad3sta
-ad3ste
-1advi
-ad1w
-aeger3
-ae1k2
-a1el
-ae1n
-a1ep
-ae1r
-aes1t
-ae1t
-af2as
-af2at
-af1d
-afd1s
-2afe
-a2f1ei
-afe4l3a
-1affa
-1afgo
-1afha
-2afi
-afie3tj
-af1l
-af4les
-2afo
-af1oe
-a1fol
-af2or
-af3org
-af1re
-af1ru
-af1s
-4afs.
-af2sh
-afs2m
-afs2o
-afs2t
-af1ta
-af1ui
-1afva
-2afy
-2ag.
-ag1a2d
-a2ga2r1
-ag1dr
-a3ge.
-agea2
-4a3gen.
-age3ra
-ager4s3
-ages2
-a4g3ind
-a4g3ins
-agi3ot
-2agl
-ag1le
-ag1li
-a2gn
-ag1of
-4agonal
-a1goo
-ag3ope
-ag3ord
-ago1v
-ag3rap
-ag3red
-ag3reg
-ag3ren
-2agro
-ag1ru
-ag2sh
-ag3slo
-ag3slu
-agsto4
-agu1a
-a2g1ui
-a2g1u2r
-a2g1uu
-a1ha
-a1he
-a1hi
-ah1l
-a1ho
-a1hu
-a1hy2
-a1h
-ai1a2
-aids1
-ai1e
-aier3s
-ai1k
-ail1s2
-aime2
-ain3st
-ai1o
-ai1p
-a2ir
-ai1so2
-ais2t
-ai1tj
-ait1s
-ai2-c
-a1j
-aje2
-ak1ac
-ak1af
-ak1a2g
-ak1al
-ak1ap
-ak3arb
-ak1av
-a2k1e2d
-a4keen
-a2kef
-a2keg
-a2keh
-ak3emi
-4akene
-ake1s
-ake4ti
-ak3etu
-a2kev
-a2kew
-a2k1e2z
-ak1id
-aki1s2
-ak1j
-ak3laa
-ak3lag
-ak3lee
-ak3ler
-ak3let
-ak1li
-ak1lu
-ak1n
-ak2ni
-a2k1on
-a2k1op
-a2k1or
-ak1ru
-ak1sl
-ak3spe
-ak3sti
-ak3sto
-ak3str
-ak1ta
-akt1h
-ak1to
-aku2
-ak1ui
-ak1ur
-ak1w
-a1la.
-a1lab
-2alad
-al3adr
-a1lag
-a1lal
-a1lam
-al3ana
-a3lant
-a3lari
-al3art
-a1laz
-a1la'
-al1da
-al1do
-aldo3v
-al1dr
-a1le
-ale2c
-4alectst
-a2l1e2l
-ale2n
-a4l3ento
-ale3og
-ale3olo
-ale3ro
-a4lesm
-a4lesp
-ale4tj
-alf1l
-al3fon
-al4fur
-al1go
-a1li
-a2lik
-al3int
-al4k3ei
-al1kl
-al4k3laa
-al1kr
-alk3st
-3allia
-a1lo.
-a1log
-4alogen
-4aloger
-al3omv
-4aloogr
-4aloogt
-4aloogv
-al3oor
-al3opl
-al1ou
-al1ov
-al1ox
-al1p
-al3s4ag
-al3s4cr
-al3ski
-als3li
-als3tou
-al2tw
-al3uit
-alu2r
-a1lus1
-4alysec
-a1l
-2am.
-2amaa
-am1af
-2amag
-am3art
-a2maz
-1ambt
-amen3s
-amfor3
-amfo4re
-am3int
-am3oli
-a2m1op
-amo2t1
-a2m1ov
-am4pac
-1amp
-2ams
-am4sle
-ams3oo
-am3spe
-am4s3te.
-am3sti
-a1naa
-an1ae
-an3alf
-an3alg
-3analy
-ana4mer
-ana1n
-an3arc
-ana3th
-an1av
-an1ch
-4anda
-and3ed.
-and3opp
-an3dor
-and3roo
-and4s3te.
-ane1a
-aneet3
-1anem
-anen3i
-an3est
-ane3us
-an4gal
-an4g3an
-an4gins
-ang3le
-ang3ru
-ang3spi
-ang3ste
-a1ni
-3a4nima
-an3i4on
-ani3sf
-a4n3isl
-ani3t
-anka4n
-an4k3as
-an4k3ins
-ank1j
-ank3ro
-ank1s
-4ank1t
-an4kui
-a1nol
-a1nom
-ano1s2
-ano1t
-ano2
-anper4s3t
-an4sce
-an4scr
-ans3eer
-anso2
-ans3or
-ans3po
-an4s3te.
-an4t3ac
-anten3
-ant5w
-a1nu
-an1ui
-a2n1u2r
-anu2s
-a2n1uu
-a2ny1
-a1oe
-a1of
-a1o2g
-a1oh
-a1ok
-a1ol
-a1on
-a1oo
-a1op
-a1or
-aor1t
-a1os1
-a1ot
-a1ou
-a1ov
-a1o
-2ap.
-ap3act
-a1pad
-a1pal
-a4p3as.
-a1pat
-a1pe
-a2pef
-apes1
-a2pet
-ap3e4te
-a1pi
-apij4t3j
-ap3ijz
-ap1j
-2apl
-ap4lan
-ap1le
-ap1li
-ap3lop
-a1p2lu
-ap1oo
-apos3t
-apo4sta
-1apot
-ap1ov
-1appa
-ap3rac
-ap3reg
-a3pres
-apsce4
-ap3sch
-ap3sho
-aps1l
-ap3ster
-ap3s4ti
-ap3sto
-ap3str
-a1psy
-apt1s
-a1pu
-a1q
-a1ra
-a4r3app
-ara3st
-arat3j
-ara3tr
-ard3ac
-ar4dam
-ard3om
-ar3doo
-ard3op
-ard3ov
-ar4d3ran
-ard3re
-ard3ri
-ard1w
-a1re
-a2rea
-a4redr
-aren3o
-aren3t
-a4reri
-a2rew
-ar1gh
-arg1l
-a1ri
-arij3s
-ar3ins
-ark3aan
-ark3ac
-arken4s
-ar1kl
-ar1kn
-arkte4
-ark4ter
-ark4tev
-arm3ins
-arm3ond
-ar2no
-ar3oge
-a1rok
-ar3oli
-ar3oog
-ar1op
-a1rot
-ar1ov
-arp1s
-ar4s3a4t
-ar4sco
-ar4scr
-ars3ho
-ar2s1l
-ars3pa
-ar3spo
-ars3taa
-ars3tal
-ar4s3tek
-ar3sti
-ar2su
-art3ak
-2arth
-3artik
-ar3tof
-art3o4ge
-ar4t3onb
-art3ond
-art3ong
-art3oog
-art3oor
-art3ov
-ar3tra
-art3ru
-ar1ui
-arwe3s
-a1ry
-ary1o
-a1r
-as1aa
-a1sab
-as1ad
-as1ak
-as1ap
-asa2r
-as3ari
-as1av
-as1ef
-a2seg
-ase1s
-ase1t
-as1ho
-a1si
-a2s1ij
-asi5ologische
-as1je
-as4jen
-a4sjes
-a1sji
-as3laag
-as3lam
-as3lan
-as1le
-as1na
-as1ob
-a1soe
-aso2l
-as1pa
-as4per.
-as1pi
-as4pio
-as1pl
-as3pot
-a1spu
-1assu
-as3ta.
-ast3ac
-as3tag
-as3tan
-a3stat
-as1te
-a3s4tem
-as4terr
-as3toe
-3as3tol
-ast3om
-ast3op
-ast3red
-ast3rem
-ast3ren
-a3stru
-as3tui
-a1sy
-ataart3j
-a1tab
-at3ach
-at3ade
-at3af.
-a1tal
-at3ank
-a1tat
-2atb
-a1te
-2atec
-a2tef
-2atek
-a2tem
-ate4nee
-ate4ner.
-ate3no
-ate3ral
-ater3o
-ater3st
-a2tew
-2atg
-at3haa
-4athee
-a1thi
-at3hou
-a1thy
-atie3l
-atie3s4
-2atij
-2a2tj
-a2tl
-2atn
-a1to
-2aton
-at3oog
-ato1s2
-at1ov
-at3rac
-at1re
-at3rib
-at1ru
-ats1a
-at1sc
-atsi2
-ats3id
-ats3le
-ats3lo
-at3soo
-at3span
-ats3par
-at4spe
-ats3pr
-ats3tal
-at3sten
-ats3top
-ats3tre
-3attes3
-at2t3l
-at2t1u2
-a1tu
-at3uil
-a2tw
-a1ty
-2au.
-au1a2
-au1ch
-aud2j
-au2d1r
-au1e
-1aug
-au1n
-aun1t
-aup2
-au1ph
-au1r4
-aure3u
-au1sa
-au1so
-2aut.
-au1ta
-au1th
-au1tj
-1auto
-auts1
-2auwt
-2auz
-ava1s
-a1ve
-ave4n3i
-aven3t
-aver3a
-ave3r4u
-1avon
-2a1vy
-a1wa
-a1we
-a1wi
-a1wo
-a1wu
-axi1s2
-a1yeu
-a1yo
-ay1s2
-a1
-a1
-a1
-a4neh
-a4neva
-as1o2
-a1
-a1-
-a-2c
-1ba
-baad1
-baar3t
-ba2be
-bad1a
-b1adr
-bad1s
-2b1af
-ba1g2h
-ba2k1l
-ba2k1o2
-bak4s3te.
-ba1la
-ba4lar
-bale2
-ba4l3ev
-ba4lin
-bal1s
-ba2me
-ba1n2a
-ban4k3a
-ban4k3o
-bank3w
-ba1o
-ba1ro
-ba1ru
-ba1s2a
-ba4sar
-ba4sed
-ba4sel
-ba4sin
-bas1l
-bas1t
-ba3taa
-ba1th
-2b1b2
-bbe4l3ac
-bbe4l3ag
-bbe4l3ee
-bbe4l3o
-bbe2n
-bbs1
-b2byt
-2bc
-b1co
-2b1d2
-1be
-be1a2d
-be1am
-be1an
-be1ar
-be1a2s
-be4at.
-be1ch
-be4dov
-be3dwe
-be3dwi
-be3dwo
-been1
-beet1
-be1fa
-be1g
-bei1s2
-be1ka
-be4kaf
-be1kl
-be1k2n
-be1kr
-be1kw
-be1la
-bel3aan
-bel1d
-be4l3ec
-be4l3int
-bel1k
-be1lo
-belo3v
-bel3sl
-bel3sp
-belt2
-be1na
-be1ne
-ben3e4t
-be1ni
-be1n4o
-be1nu
-be1o
-beo2l
-be1ra
-be4rac
-be4rav
-bere3s4
-ber4g3af
-ber4get
-berg3l
-be1r4o
-bero3v
-ber3sh
-ber3sp
-ber4sto
-be1ru
-be1ry
-be1s
-be2sh
-be4sje
-be2sk
-bes2m
-bes4n
-bes4ter
-bes4tie
-bes4tij
-be1t
-bet1s
-bet4wi
-beur4s3t
-2b1f
-2b1g
-2b1h
-1bi
-bi1a
-bi1do
-bid1s
-bi2du
-bie4dr
-bie4li
-bi1en
-biet3j
-bi1eu
-bigu1
-bij1d2
-bij1f
-bij1k
-bij1p
-bij1s2
-bij4s3ter
-bij3tr
-bi4ke.
-bi4kes
-bi1la
-bi1lo
-bil1s
-bin1g
-bi1no
-bin3so
-bint3j
-bi2od
-bi4otie
-bi1ov
-bi1o'
-bi1sa
-bit3je.
-bi1to
-bi1tr
-bits3p
-2b1j
-2b1k
-1bl2
-bla4det
-b1lap
-b1led
-blee4m
-b1lei
-ble3sp
-ble2t1
-b1lid
-blijs4
-blij3ste
-blik3o
-blo2k
-blu2s
-b2ly
-2b1m
-2b1n
-1bo
-bo4d3ec
-bod1o
-boe4g3a
-boe4ko
-boek3s
-boe1s2
-bo1ka
-bokje3
-bol1a
-bol1o
-bo4lop
-bo2m1a2
-bo2m1o
-bo3na
-bonda4
-bon3do
-bonds3
-5bone
-bont3j
-boo2n
-boor3t
-boots3t
-bo1pr
-bo1ra
-bor4sto
-bor4st3r
-bos1a2
-bo2s1p
-bo1ta
-bo4tac
-bo4t3on
-bot1r
-bot4spr
-bots3te.
-bouw3s
-bo1v
-bove2
-2b1p
-1br2
-braad3
-bra1d
-bra1f
-bra3str
-b1rec
-b1reg
-bregi3
-brei3s4
-bri2l1
-bri1o
-bro2n
-bron3o
-bru2l1
-2b1s
-bs2c
-bse2n
-bsi2t
-b2sk
-b2s1la
-bs2t
-b4stij
-2bt
-b1ta
-b1te1
-b1th
-b1to
-b1tr
-bt2s1
-b1ty
-1bu
-bu1e
-buk3s4k
-bu1na
-bu1ra
-b1urb
-bu3ri
-bur1s
-bus1a2
-bus1c
-bu2su
-bu1ta
-bu2to
-buts3t
-buur3s
-buur4tj
-2b1v2
-b1w
-1by
-by1e
-by2in
-by1l
-2b1z
-1b
-b2s
-2b'
-2b1-
-b-2k
-1ca
-caat3j
-ca4che.
-ca1do
-ca1dr
-cae1
-ca1f
-ca1g
-ca1k
-ca4ke.
-ca4keb
-ca4kem
-ca4kes
-ca1la
-cal2l1
-ca1lo
-came3ra
-ca3nad
-ca3nat
-ca1ne
-ca1no
-can3th
-ca1pa
-ca4pe.
-ca1po
-cap2r
-ca3pri
-ca1ro
-car1t
-ca1sa
-ca1sp
-cas3tr
-ca1su
-ca1t
-ca2
-c1b
-2c1c
-cca1
-c1do1
-1ce
-ce1a
-4ceact
-2ceba
-4cebel
-ce1c
-cee2r
-ce1f
-2cefe
-2cefi
-ce1g
-2ceha
-2cej
-ce1k
-cela2
-cel1d
-celes3
-cel1k
-2cema
-ce1n2a
-2ce1ne
-ce4nes
-2ce1ni
-3cenia
-ce1no
-cen1s
-cent3j
-ce1o
-ce1ra
-cer2n
-ce1ro
-cer4t3r
-3ces.
-ce3s4aa
-ce3sar
-ce1s2h
-4cesinn
-ces3pa
-ce3s4ti
-ce1ta
-cet1j
-ceto2
-cet3og
-cet3oo
-ce1ty
-ce1um
-2ce-e
-c1f
-c1g
-c2h
-2ch.
-2chaf
-cha1g
-1chao
-3chart
-1chau
-2chc
-che1a
-1chef
-3chemi
-1cheq
-che3ru
-che3us
-4che-p
-2chg
-ch3ins
-2chla
-2chn
-2chp
-2chre
-3chromo
-2chs
-2cht
-2chw
-ch2wa
-1chy
-1ch
-2ch-
-1ci
-ci1am
-ci1c
-ci1d
-cie1g
-cie1k
-cie3ra
-cier4s
-cie3tj
-ci1eu
-2c1ind
-cine3a
-ci1no
-ci1p
-ci1t
-ci2tj
-2c1j
-ck1ac
-c2k1e2d
-c2k1ef
-cket3u
-c2k1id
-ck1j
-c1k2le
-ck1li
-ck1n
-c2k1o
-ck1r
-ck1s
-cks2c
-cksce4
-cks2l
-ck1t
-ck1u
-c1ky
-1cl
-cle1r
-cle1u
-cli2p
-clo4se.
-c2ly
-c1m
-c1n
-3co.
-1coa
-co1ad
-co1al
-1cob
-co1ch
-coco3a
-1co1d
-co1fa
-co1fo
-1cog
-1co1k
-1col
-co1la
-1com
-co4mac
-comana4g
-co4min
-com1s
-1con
-co1na
-con1d
-con1g
-con1s
-3coopde
-3coopga
-3coopro
-co1p4
-1copa
-co1ra
-cor4dr
-1corp
-1corr
-cor3tj
-co1ru
-1cos
-co1sp
-co1s2t
-1co1th
-cot2j
-co1tr
-1cott
-1cou
-2cout
-1co1v
-1co
-1co
-1co'
-1co-
-c1p
-c1q
-1c2r
-cre1o
-cro1p
-crus1
-c1s
-2c1t
-ctaan3
-ct3act
-c2t1ad
-ct3afd
-c2t1am
-c4t3atl
-cte2n1
-ctene4
-c2t1h
-ctie3k
-ctie3s4
-c2t1j
-c2tl
-c4t3ond
-c4tont
-ct3rap
-c2t1re
-ct1s2f
-ct1sl
-ct1sp
-ct3ste
-ct3sto
-ctu4re.
-c2tv
-c2tw
-cty1
-1cu
-cu1d
-cu1ee
-cu1er
-cui2
-cuit1
-cuite4
-cu1k
-cu1lo
-cu1lu
-cu2mo
-cu1na
-cu1o
-cu1ra
-cu1ro
-cur1s
-cus1t
-cu1ta
-cu1
-c1w
-1cy
-cy1a
-cy1o
-c1z
-1c
-2c'
-2c1-
-c-2s
-3da.
-daal1
-daan1
-d3aank
-4d3aanw
-d1aap
-d4aat
-1dabe
-1dabi
-d1a2bo
-d1acc
-1daco
-1dad.
-d3adel
-d1adm
-d1adr
-2d1adv
-d1af
-1dag
-da2g1a2
-da4g3ed
-dag3env
-dag1l
-dag3on
-1dai
-2dais
-1dak.
-d1akk
-dak1l
-dak1r
-dak1s
-1dal
-4d3alar
-2d1alc
-2d1alk
-da1lo
-2d1alt
-dal1u
-1dam
-2d1amb
-d2ame
-1dan
-dan3as
-da1no
-dan4si
-dans3p
-dan4s3t
-4d3antw
-1dao
-da2pe
-da1po
-d1app
-1da1pr
-1dapu
-da2r1a
-1dari
-dar2k1
-dar4mon
-da1ro
-dar1s
-dar4tj
-da1sa
-daso2
-da3stu
-1da1t
-data1
-da4tel
-dat1j
-2d1atl
-2d1atm
-da2tr
-dat1s
-2d1att
-1daue
-2d1aut
-1dauw
-da1v
-3davol
-1da
-1da'
-1da-
-2d1b2
-dbi2k
-dbi2t
-dbou4w3i
-d1c
-dco2r
-2d1d2
-ddag3s4
-ddele4
-dde4lee
-dde4l3ev
-ddel3s
-dde2n
-dden3s
-ddera4
-dder3al
-dde4ree
-dder3s
-ddis2
-1de
-de1an
-de1ar
-de1ch
-de4dit
-dee2g1
-2d1eek
-dee2l
-deel3i
-d1een
-dee2p1
-dee2r
-deer3i
-deers4
-dee1t
-de1fa
-2d1eff
-de1fl
-de1g
-2d1eg.
-deges4
-2d1ei.
-2d1eig
-2d1eis
-de1ka
-2deki
-de1kr
-de1la
-de4l3ac
-del3da
-del3do
-del3dr
-del3eek
-del3eeu
-4d3e4lek
-4d3e4lem
-dele4n
-del1k
-de3lop
-del3or
-de3lot
-del3ov
-del4s3e
-del4s3i
-5delt
-4d3e4mai
-2demh
-4demig.
-4demigh
-dem3ond
-dem1s
-de3naa
-den3e4p
-den3e4v
-den4gra
-4d3engt
-de1ni
-denmana4
-den3ov
-den3sh
-den3sl
-den3sm
-den3sn
-den3so
-den4su
-den3tj
-deo4li
-de1pi
-de3rab
-der3af
-der3a4g
-de3rak
-de3ram
-de3ras
-der3eed
-der3ei.
-der3ein
-de4r3eis
-de4r3em
-de3ren
-de4ret
-4d3erfg
-der3fl
-de4r3id
-de4r3im
-der1k
-der3of
-de3rog
-de3rol
-der3on
-der4s3at
-4d3erts
-dert4w
-der1u
-derve4
-des3ak
-de4scr
-de3sla
-de3slo
-de3sol
-des3pa
-des3po
-de3sta
-de4s3tak
-des3tek
-de3s4tic
-des3top
-de1t
-4d3e4tap
-de4ter.
-de4ters
-det2w
-deu2c
-deur3o
-de3us.
-dever3
-4dexam
-dex1i2
-de2s
-2de-o
-d1f
-dfiet3
-2d1g
-dgas1
-d2ge.
-dge3la
-d3ge1n
-dgeper4
-dgepers3
-d3ger4
-dges2
-dge4t3o
-d1h
-dhe4r3i
-1d2hi.
-1di
-dia1k
-dia1p
-dia3sc
-di4atr
-die1l
-die3sp
-di3esr
-die3st
-die4t3r
-di1eu
-di4gam
-dige4s
-dig1l
-dij3ka
-di2k1o
-dik1w
-2d1in1d
-2d1inf
-4d3ingel
-4d3ingeni
-2d1inj
-4d3inko
-2d1inr
-4d3inst
-2d1int
-2d1inv
-2d1inw
-2d1inz
-di4odi
-di4one
-di4oni
-dio1v
-di1po
-dip1s
-2d1irr
-dis3ag
-dis4k3r
-dis1p
-di1th
-dit1j
-di1to
-d1j
-1d2jah
-1d2ji
-d1k2
-d1l
-dli2n
-2d1m
-d1n
-dni1s
-1do.
-1do1a
-d1obs
-1doc
-1dod
-do1da
-1doe
-2d1oef
-doe4l3a
-doe4lu
-d1oev
-1dog
-1doi
-1dok
-do1la
-do5lin
-do4li
-dolk3s
-1d2om.
-do2m1o
-domo4r
-d1omr
-1don.
-do1na
-1done
-1doni
-1donn
-don4t3e4
-doog1
-door3d
-3doori
-door4n3ac
-door3t
-do1pa
-d1opb
-d1opd
-do4pes
-2d1opg
-1dopj
-d1o2pl
-2d1opn
-1dopo
-d1op1r
-d1ops
-2d1opv
-d1opz
-do3rad
-do3rat
-1dore
-2d1org
-do4ri
-d1ork
-1dorp
-dor4s3te.
-1dos
-do1sp
-dost2
-dos3tj
-do3str
-1dot
-do1ta
-do1th
-do1tr
-1dou
-1dovi
-1dovl
-1dovo
-1dow
-1dox
-1doz
-1do'
-1do-
-d1p
-d1q
-1dra
-d3raam
-d3raap
-d3race
-d3rad.
-d3rada
-4d3rand
-2d1rec
-d1red
-4d3reek
-d1rek
-d1rel
-d3rem.
-4d3rend
-2d1rep
-1drer
-4drese
-d3resu
-1dria
-1drie
-drie3t
-1d4rif
-1drig
-d3rijd
-d3rijk
-1dril
-1drin
-1dris
-2d1rit
-1driv
-1dri
-d3roer
-1drog
-2d1rok
-d3roma
-d3rond
-d3rood
-3droog
-d3rook
-dro3pn
-d1ro1v
-d2ro
-d1rub
-d1ruc
-d3ruim
-1dru2k
-2d1rus
-2ds
-ds1aa
-ds1a2b
-ds1ad
-ds1a2g
-ds1ak
-ds3ang
-ds1ap
-ds1ar
-ds1as1
-ds1au
-dscenari3
-d1sch
-d2scl
-d2sco
-d4scre
-d4s3e4co
-d2s1ee
-d2s1ef
-ds3eis
-dse4l3a
-d2s1ep
-ds3eth
-ds1h
-ds1id
-dsie1
-dsi4g3a
-ds1in
-ds1is
-ds1je
-d3slaa
-d3slac
-d3slak
-ds3lie
-d3slin
-d3sloo
-ds3lop
-ds1na
-dsnes3
-ds3neu
-d1snu
-dso2
-ds1ob
-d1soe
-ds1of
-ds1og
-ds1on
-ds3ord
-ds3ori
-ds1ou
-ds3pac
-d3span
-ds3par
-d3spec
-d3spel
-ds1pl
-d3spoe
-ds3pook.
-ds3pot
-dsregi3o
-dss2
-ds3taak
-d4s3tab
-ds3tak
-d3stam
-d3stap
-d3stat
-d3stav
-d4stec
-d3stee
-ds3tek
-d3stel
-d3sten
-d3ster.
-d3sters
-ds3tes
-ds1th
-d3s4tic
-d3s4til
-d3stoel
-dsto4f
-d3ston
-d3stoo
-d3stop
-d3stot
-ds3tram
-d3stree
-d3stroo
-d3stru
-d1stu
-d4stui
-d1sur
-ds1uu
-d2sw
-d1sy
-2d1t2
-dtaart3
-dtes3t
-dtu2
-1du
-du1a
-2duca
-du4ce.
-du1ee
-du1en
-du1er
-du1et
-2d1uil
-d3uitd
-d3uitg
-4d3uitk
-d3uitr
-d3uitv
-du1ka
-du1lu
-dum4p3a
-du2mu
-dun1i
-du1ra
-dur2f
-2d1uro
-dus1
-dut1j
-2duud
-du4wee
-d1v
-dvee3s
-dvies3
-dwaal3
-d3waar
-d1wac
-d1wap
-d1was
-dwee4p3
-d1weg
-1d2wei
-d1wek
-d1wer
-d1wes
-d1wet
-d1wez
-d1wil
-d1wor
-d1wr
-1dy
-dy1n
-dy3sto
-2d1z
-1d
-1d
-1d
-2d1-
-2ea
-e3aa
-eaan1
-e1ab
-e1ac
-ea2ca
-ea2ch
-eac3t
-ea1da
-ea4dem
-e4ades
-e1adm
-e1a1do
-ead1s2
-e1adv
-e1af
-e1ag
-ea2ga
-ea1g2l
-ea2gu
-e1ai
-e1akk
-ea2k1o2
-ea1la
-e1alf
-e1ali
-eali4
-ea1lo
-eal1s2
-ea4men
-e4amer
-eam1s
-ea2mu
-ea3nat
-e1anc
-e1and
-ea1no
-e1ant
-e3ants.
-e1ap
-ea1pr
-ea1ro
-e1as.
-ea1sc
-ea4sed
-ea4set
-e1ask
-e1ass
-ea2st
-e3ast.
-e3asti
-ea3str
-e1at
-e2atm
-ea1tr
-e2at1s
-eau3s4t
-e1av
-e1b
-eba4le
-eb1ap
-1ebd
-ebe4t3j
-ebit4s
-ebots3
-eca2k
-ecas1
-e2ce.
-e1cha
-e1che
-e1chi
-e1cho
-echore3
-e1chu
-ec1le
-e1co
-eco4m3a
-e4cono
-eco1t
-1ecz
-e1da
-e2daf
-e2d1as
-ede3au
-ede3nac
-eden3in
-ede1o
-eder3sl
-eder3sp
-edeso4
-ed4gef
-edia3g4
-edia3s4
-e4d3ijz
-ed3ins
-edi1o
-e1do
-edoe3t
-ed3ope
-edor4s3
-ed3ove
-e1dr
-ed3rod
-ed3rol
-ed1s2c
-ed1sp
-ed1st
-ed3uit
-e3dwan
-e2e
-ee1a2
-eef3ac
-eef1l
-eef1r
-ee4gap
-eeg3lo
-ee1i
-eek3af
-eek3ak
-ee3kap
-ee4k3en
-eek3lo
-eek1n
-eek3ren
-ee3kri
-eek3ro
-ee4k3ru
-eek3sp
-eek3st
-eek3we
-eel3aa
-eel3ac
-ee3lad
-ee4l3a4m
-eel3ap
-ee3laz
-eel3do
-eel1k
-ee3lob
-eel3o4g
-ee3lot
-eel3scr
-eelu2
-ee4l3ur
-ee4l3uu
-ee4mop
-een3ac
-een3ad
-een3a4g
-een3a4r
-een5d4u
-eene4d
-een3ez
-een3ie
-1eenj
-een1k
-1eenn
-een1o2
-een3sh
-een3sla
-een3sn
-een3so
-een3sp
-een1t
-ee1o2
-ee4p3an
-ee4pas
-eepo2
-ee4pog
-ee4p3oo
-ee4pre
-ee4p3ru
-eera2
-eer3aa
-eer3ak
-eer3al
-ee3ram
-ee4r3eer
-eer3em
-eer1f
-eer1g
-eer1k
-eer3of
-eer3on
-eer3oom
-ee3rot
-eer4so
-eer3str
-eer4su
-ees1a
-eese4t
-ee1sj
-ee3sle
-ees3li
-ee3sni
-ee3soo
-ees3te
-ee2s1u2
-eet1h
-eet3o4g
-ee3ton
-eet3oo
-eeto4r
-ee4t3ree
-eet3sn
-eet3sp
-eet3st
-ef3aan
-ef1ad
-e1far
-e1fau
-ef1a2z
-ef1da
-ef1do
-ef1dr
-efiet3j
-e2f1ij
-ef3ins
-efis3
-ef3loo
-e1fo
-e2f1og
-e4font
-efron4
-efrons3
-ef3s4fe
-ef1sl
-ef1s2m
-ef1sp
-efs2t
-ef3sta
-ef3ste
-ef3sti
-ef3sto
-ef1th
-ef1tu
-2ega
-ega2m
-eg1da
-eg1dr
-e2g1e2c
-eg3eig
-ege4l3ei.
-ege4l3ov
-egen3ac
-ege4net
-egen3s
-eger3of
-eger3on
-eg3ijz
-eg1li
-e1goo
-egoog3
-eg1op
-eg3oud
-eg1ov
-1ego'
-e1gr
-eg3red
-e4grou
-eg1s
-egs2a
-egs2o
-egs2p
-egs2t
-e2g1u2r
-eguts3
-e2g1uu
-e1h
-ehe4r3i
-ehoorder5ess
-e3hu
-ehuts3
-ei1a
-ei3de
-ei1do
-eid4sc
-eid3ste.
-ei1e
-eier3s
-ei1fa
-ei1gl
-e1ij
-ei1kl
-ei1kr
-eik1s
-eik1w
-ei1la
-ei4l3ant
-4eil1d
-eil1o2
-e2in
-ei4n3aar
-ei4n3ab
-ein4ac
-eind3oo
-ein4d3r
-eind3s
-ei4n3e4d
-ein1g
-ein1k
-ein1t
-ei1o
-ei1p
-eis1a2
-3eisar
-ei3sch
-eishe4
-ei3soo
-ei3s4tel
-ei3s4tr
-eis1u2
-ei1tj
-eits3p
-eit3sten
-2eiz
-e1j2
-2ek
-ek3aan
-e3kaar
-ekaats3
-ek3af.
-ek1a2g
-ek3al.
-ek3alt
-ek3arb
-ek2ee
-e2k1ei
-ekes3tr
-eke3ta
-e4k3e4ter
-ekets3
-e2k1e2z
-e4k3ins
-ek1j
-e3klee
-e1kni
-e2k1ob
-ek3oli
-ek3opl
-ek3opz
-ekor4s3
-ek3os.
-ekots3
-e3kran
-e3kred
-ek3rok
-e1kru
-eks3li
-ek3som
-eks3pa
-eks3pl
-eks3poo
-eks3tak
-ek4sted
-ek4sterr
-eks3tra
-ek1t
-ekt1s
-eku2
-ek3uit
-ek3ure
-ek1uu
-e1la.
-e1laa
-e1lab
-e4l3act
-e3lade
-el3adj
-el3adm
-el3adv
-e2l1af
-e1lag
-e1lai
-el1al
-e1lam
-e1lan
-e4l3ank
-e3lapt
-el3arb
-el3arc
-e3lare
-e3lari
-e4l3arm
-e4l3arr
-el3art
-ela2s
-el3asi
-el3asp
-e1lat
-ela3tr
-el3aut
-e1lax
-el3azi
-e1la'
-eld3ov
-e1le
-el3eff
-el3eier
-el3eig
-el3eis
-el3elp
-el3emp
-e3len
-ele5r4a
-e4l3e4ta
-ele3t4h
-e4l3etu
-el1fl
-elf3on
-elf1s
-el1gl
-el1go
-e1li
-elijs3
-eli3kw
-el3imp
-e4l3ind
-eli4nes.
-e4l3ins
-1elix
-el4kee
-elk1s
-e1lo.
-e1loc
-e1lod
-e3loep
-el3oes
-e1lok
-el1ol
-el3oms
-el3omv
-el3ond
-e3lone
-e3lonk
-el3ont
-e1loo
-el3opg
-el3oph
-el3opl
-el3ops
-el3opt
-el3opv
-el3ora
-elo3th
-e1lou
-e1lo1y
-el1pa
-el1pi
-el1po
-el4s3em
-el3slu
-el3sno
-el3s4ti
-elt1s
-e1lu
-el3uit
-e1l
-emaat3
-em3act
-em3afl
-emana4gem
-e4m3as.
-emats3
-2eme
-emen3sl
-emie3s
-em3ins
-e4m3oli
-em3opl
-em3org
-em1pj
-em1sa
-em1so
-em1sp
-e3naai
-e3naak
-e4naan
-en3aap
-en1ab
-ena2c
-e3nacc
-e2naf
-en3akk
-en3akt
-en3al.
-en3alb
-en3als
-en3amb
-en3ana
-en1ap
-ena4pe
-e3nari
-en3arr
-en3ars
-en1a2s
-enas3p
-ena4tel
-en3att
-en3aut
-e2n1av
-en4cep
-end3ach
-enda4m
-en1do
-en1dr
-end3sp
-en4dur
-en4d3uu
-e1neb
-enebe4
-ene2c
-en3ech
-en3eco
-e4neen
-enee3t
-en3ei.
-en3eis
-en3ela
-en3elf
-en3ema
-ene2n
-enen3t
-en3e4po
-3e4nerg
-enes3te
-en3e4ter
-e1neu
-en3eva
-enge3ra
-en1gl
-en1go
-en1gr
-engs2
-eng3sn
-eng3ste
-3enhalf
-3enhalv
-e3nijd
-2enin
-e4n3in.
-e1nit
-e1niv
-en1kj
-en1kl
-en1kn
-en1kr
-en3och
-e1noe
-en3off
-e1nok
-en3oli
-en3oor
-en1op
-en3ord
-en3ork
-en1ou
-3ensem
-ens4fer
-en3sjo
-ens3on
-en3spi
-en3spor
-ens3pot
-enst3ijv
-en4stin
-ens3u4ren
-en4t3erv
-ent3ha
-ent3ond
-en4t3ov
-ent3rol
-ent4se
-1ent
-en1ui
-en3ure
-e1nut
-en1uu
-3envelo
-eo1a
-e1oct
-e1ocu
-eo1d
-eodo1
-e1oe
-eo1fa
-e1off
-eo1fo
-eo1g
-eoga2
-eo4gen.
-eois3
-eo1k
-eo1l
-e3olette
-eo4lied.
-eo4liede.
-e3ologie
-e5ologiseert
-eo2ly
-e1omb
-e1on
-eo1na
-e2ono
-eon3sp
-e1oo
-eo1pa
-eo3penb
-eop4la
-e1opn
-e2o1po
-eo3pre
-e1ops
-e1or
-eo1ra
-eo1ro
-eo1s
-eos2t
-eo3te
-eo1th
-e1ou
-e1ov
-e1ox
-e1pa
-ep3asp
-e1pe
-epe3lot
-eper4s3te.
-epes1
-1epid
-e1pie
-e1pij
-ep3ijs
-e1pik
-e1pil
-ep3ingr
-ep3ins
-e1pit
-ep1j
-e1pl
-ep3led
-e4p3lod
-e1po
-e4p3o4ge
-epon4s3
-epoort3j
-ep3ork
-e1pr
-ep3reg
-ep4s3ee
-ep4set
-eps1l
-eps1n
-epso2
-eps3or
-eps1p
-eps3tal
-eps3to
-ep4tak
-ep2tj
-ep4t3ra
-e1pu
-ep3uit
-e1q
-e4quip
-e1ra.
-e3raad
-e3raam
-er3aan
-e3raat
-er1ac
-e3rac.
-e4rach
-e4ract
-e3rad.
-er3a4der
-e3radi
-er3afb
-er3afd
-e3rafe
-er3afg
-er3afk
-er3afp
-er3afs
-er3aft
-er3afv
-er3afw
-er3afz
-era4gen
-e1rai
-er3al.
-er3ala
-er3alg
-e3rali
-er3all
-er3als
-er3alt
-er3amb
-er3ana
-e3ranc
-e3rane
-e3rang
-er3ank
-e3rans
-e3ranti
-e1rao
-e3rapl
-er3arc
-e3rare
-e1rat
-era3tj
-e4r3att
-er1au
-e1raw
-er3azi
-e1ra'
-e1ra-
-er1d2a
-er1d4o
-erdo3v
-er1dr
-erd3uit.
-er1dw
-e1re
-ere1a
-er3een
-er3eet
-er3eeu
-er3eff
-er3eg.
-eregi3o
-er3eie
-e4r3eig
-er3eil
-er3eind
-er3elk
-e4r3emm
-e3ren.
-ere4nen
-e4r3enen.
-eren3sp
-er3enth
-e4r3envi
-e4r3enze
-ere4ri
-e5r4es.
-eres4t3af
-erest3r
-ere4t3j
-er3etn
-e4r3ets
-er3eu3r
-e2r1ex
-erfo4l
-3ergiemo
-er3gle
-er3gli
-e1ri
-3eridons
-erie3s
-erie3t
-e5rig
-e4r3ijs.
-e5rik
-eri4ma
-e4r3ind
-er3ins
-e4r3int
-er1ir
-eri3sta
-erkeer4s3
-er4k3erv
-er4k3ins
-erk3ta
-erk3to
-erlaat3
-ermana4
-er4m3erg
-er4non
-e1ro.
-e1rob
-e1rod
-er3oed
-er3oef
-e3roep
-e3roer
-e3roes
-eroe3t
-e1rok
-e3rol.
-ero4lem
-er3o4li
-e3roll
-er3om.
-e3roma
-er3omb
-er3omg
-er3omh
-er3oms
-er3omv
-er3omz
-e3ron.
-e3ronal
-er3onc
-e3roni
-e3roof
-er3oog
-e3rook
-er3oor
-e3roos
-er1op
-erop3a
-ero4pen.
-ero4pi
-erop3r
-er1o2r
-er3ove
-er3oxi
-e1roz
-ers3om.
-er3sta
-er3sti
-er1t
-er4t3a4g
-er3te
-ert4s3l
-ert4s3te
-er5t4u
-e1rub
-e1rug1
-er3uit
-erui3tj
-e1rup
-er1u2r
-e1rus
-er1uu
-1erwt
-e1ry'
-e1r
-e1sab
-es1a2g
-e1sam
-e1san
-e1sas
-e1sc
-es4can
-e2sce
-e2sci
-e2scl
-es4crib
-e3se.
-e2seb
-e2s1ee
-ese2n
-es1hi
-e1sid
-es1in
-esi1t
-esi4te
-es1je
-e1sji
-e1sjo
-eska4tes
-es4kel
-e3slep
-e3s4opb
-es3ore
-es3ori
-e1sos
-e1sot
-esp3riem
-es4sce
-es2sm
-es4spr
-es4t3ac
-e3stand
-es3tant
-es3tas
-e4s3te.
-est3ei.
-es3teli
-e3stem
-e4s3ten.
-es3ter
-estere3o
-e4s3tes
-e3steu
-es4tich
-es2tj
-e3stot
-e4s3tra.
-es3trak
-e1stu
-e1s2ty
-e1su
-e1sy
-e1ta.
-et3aan
-et3aca
-et3act
-et1ad
-et3afd
-1etag
-e1tak
-e1tal
-e4talb
-e3tand
-eta2p
-e4tapp
-e1tas
-e2t1av
-e1te
-e3te.
-et3e4co
-et3edi
-et3emb
-et3emm
-eten3tj
-ete3r4aa
-eter4s3l
-etes3p
-e4tete
-et3hal
-et3hor
-et3hou
-e1thr
-e4t3inc
-et3i4ni
-1e2tiq
-e1toe
-e1tom
-et3ope
-et3opl
-et3ops
-etor4s3t
-e1tou
-eto3ver.
-e1tr
-et3rec
-et3res
-etros4
-2ets
-et3sap
-et3slu
-ets1o
-ets3paa
-ets3pr
-ets3te.
-ets3tek
-et3ster
-ets4ti
-et3str
-et1su
-ette3s
-e1tu
-etu4ne.
-et4wij
-1eu1a
-1eu1c
-eu1d
-eu1ed
-eu1en
-eu1er
-eug4d3r
-eu1gr
-1euh
-1euj
-eu4ler
-e1umb
-e1umc
-e1umf
-e1umg
-e1umj
-e1umk
-e1uml
-e1umm
-e1umn
-e1umr
-e1ums
-e1u2mu
-e1umv
-e1umw
-eun1s
-eun1t
-1euo
-e2ur
-eu3ren
-eu4r3es
-eu4rij
-eur1k
-eu3rol
-eu3roo
-eu1sc
-eu3s4te
-eu1t
-eu4wij
-1eu-
-e1v
-evaar3tj
-eva3lo
-evel3op
-eve3naa
-even3t
-2e3ver
-ever4ee
-evol4ga
-e1w
-e3w2e
-ewen4s
-ewens3te
-ew2h
-ewieks5te.
-e2wn
-ew1s
-2ex.
-ex1aa
-1exam
-ex1op
-1exp
-ey2n
-e1yo
-ey1s2
-e1z
-eze3na
-ezin4s3
-e1
-e1
-e1
-e1
-e1
-e1
-e1-
-1fa.
-1faal
-f1aap
-f1aar
-f1aas
-1faat
-1fab
-f1a2bo
-f1acc
-f1ach
-1faci
-fa4de.
-2f1af
-1f2a1g
-1fah
-1fai
-fa4ke.
-1fal
-fa1la
-fa1lo
-fal1s
-f1amb
-1fami
-fa1na
-fa1ne
-f1ang
-fansi4
-fant3j
-fants3
-f1a2p
-1fari
-fa1ro
-f1art
-f1as.
-1fase
-1fasi
-f1ask
-f1ass
-fa1ta
-fa1v
-1faw
-1fax
-1fa'
-2f1b
-f1c
-fcour4
-2fd
-fd1ac
-fda4de
-fd1ar
-fd1as
-f2d1e2c
-fde2k1
-fde2s1
-f2dh
-fdier3o
-f4d3inga
-f4d3ingr
-f4d3ink
-f4d3ins
-fd1of
-fd1or
-fd3ric
-fd3rol
-fd1sc
-fd1so
-fd1sp
-fd3sta
-fd3ste
-fd3str
-1fe
-fe2a
-featu4
-fec4tr
-fe4del
-fede3r
-2f1een
-fee2r1
-fee3sh
-feest3r
-fee1t
-fe1k
-fel3ac
-fe4l3ee
-f3e4lem
-fel1f
-fel1k
-fel3sp
-fe1na
-fe1ne
-fe1ni
-fe1no
-fen1s
-fen1t2
-fe1o
-fe3raa
-fe3rab
-fe3ran
-fe4r3et
-fe3rom
-fer3sl
-fes1
-fe1ta
-fet1j
-fette3
-2f1ex
-2f1f
-ff1d
-ffi4ce
-ff1s
-f1g2
-fge1
-fge4k3lov
-fge4k3nep
-fges2
-fguts3
-2f1h
-1fi
-fi2al
-fi1as
-fi4cep
-fi1ch
-fie1s
-2f1ijz
-fik4s3t
-fi1la
-fi4len
-fil4ma
-fil4m3on
-fi1lo
-2f1ind
-fi4nel
-2f1inr
-f1inv
-fi1o
-fi2r
-fi2st
-fi4tin
-fit1o
-f1j
-2f1k2
-fkaats3t
-fl2
-f1laa
-flaat3
-f1laf
-f3land
-3flat.
-f3late
-flat3j
-3flats
-1flau
-fla1v
-f1leg
-f1lei
-flen4s3t
-fles1
-fle2t
-flet3j
-f1lev
-f1lez
-2f1lie
-f1lig
-f1lij
-flijs3
-f1lin
-f2lip
-1f2lit
-1floe
-f1lok
-flo1r
-f2lot
-fluit3j
-flu2t1
-1f2ly
-f1m
-fma2d
-f1n
-fnes1
-f2nui
-1fo.
-1fob
-1foc
-foe1r
-2f1of
-fo2gi
-fok1
-4f3oli
-2f1omg
-2f1oms
-f1omv
-fo1na
-f3onde
-1foni
-f1ont
-1foo2
-2f1oog
-foon1
-f1o2p
-2fope
-fops2
-f2opt
-1for
-fo1ra
-f1ord
-fo1ru
-1fos
-fo1sa
-fo1st
-1fo1t
-1fou
-2f1oud
-fout3s
-2f1ov
-foy1
-2f1p
-fper4s3te.
-fr2
-1fra
-f1rea
-f1rec
-f1red
-f1ref
-f1reg
-fregi3o
-f1rek
-f1rel
-1f2req
-f1res
-friet3j
-f1rij
-f2rik
-1fris
-f2ro.
-1f2rod
-f1roe
-f4roka
-f1rol
-f4rolo
-1fros
-frus1
-2fs
-fs1aa
-fs1ad
-fs1ar
-f1sc
-f2sca
-f2sce
-f2sci
-f2s1co
-f2scr
-f2scu
-f2s1ee
-fs3erv
-fs3eth
-f2s1e2v
-fsho2
-fsi2d
-fsie1
-fs1i2m
-fs1in
-fs3led
-fs2me
-fs1o2
-fs2ol
-fss2
-fst3ac
-f3stan
-fst3as
-f3stat
-f3stell
-fste4m3
-f3ster.
-f3sters
-f3stert
-f3stif
-fst3oc
-fsto3v
-f1str
-f1stu
-fs1ui
-f1sy
-2ft
-ft3aan
-f1tab
-ft1ac
-f1taf
-f1tal
-f1tan
-ft3art
-f1te
-fter3s
-fte1t
-f2tex
-ft3hed
-ft1ho
-ft3ijs
-fti2m
-f4t3ins
-f1t2j
-f1to
-f1tr
-ft1sc
-fts1l
-fts1p
-ft1st
-f1t2w
-f1ty
-1fu
-fu1lo
-fu4m3ac
-fu2m1i
-fun1s
-fu4ren
-fu1ro
-fus1t
-fu1ta
-2f1v
-fva2l1
-2f1w2
-1fy1
-2f1z
-1f1
-1f
-1f
-1f
-1f
-f1-
-1ga
-3ga.
-gaar3t
-g4aat
-gaat3j
-ga2bo
-g1ac
-g2ada
-2g1adm
-ga1do
-g2af.
-g1afd
-ga1fo
-2g1afs
-2g1afw
-g1afz
-ga2ho
-ga1kr
-ga3lac
-ga4l3ach
-ga3lad
-gal3app
-ga3lav
-ga1lo
-ga4med
-ga4mep
-ga4mes
-gan1d
-ga1ne
-gan3gr
-ga1no
-ga1pr
-2g1arb
-ga3r2e
-2g1arm
-ga1ro
-g1arr
-gar1s
-2g1art
-g4ar3tj
-gas1c
-ga2s1i
-gas1o
-gas1p
-ga1ta
-gat1j
-gat1s
-gaus2
-2g1aut
-g1avo
-3ga'
-g1b
-gby1
-g1c
-2gd
-gd1ar
-gd3ate
-g4d3elf
-gde3sp
-g2dh
-g2d1id
-g2d1im
-gd3ins
-g1do
-gdoe4l3
-gd1op
-g1dri
-gd1sa
-gd1so
-gd1sp
-gd3ste
-gd1w
-1ge
-ge1a
-ge4ade.
-gea4der
-gea3na
-gea4ni
-ge4ari
-2g1eb.
-2g1ebb
-2gebd
-2g1ebt
-ge1c
-ge1d
-2ged.
-ged2e
-4gede.
-ge4dit
-4gediven
-4g3eend
-gee2r
-geest3r
-gee2t1
-gee3t4j
-ge1f
-2g1eff
-ge3fi
-gef2r
-ge1g2
-gei4l3a
-gei4t3j
-ge1k
-ge3k2e
-gek4le
-gek4li
-gek2n
-gek2r
-gek2u
-gek2w
-gel3acht
-ge3lak
-ge3lar
-gel3as.
-ge3lav
-ge3laz
-gel4da4
-3gelde
-3gele
-gel3ein
-4g3e4lem
-ge4l3ink
-gel1k
-ge1lo
-gel1s
-3gelt
-4gementbu
-4gementc
-4gementer
-4gementf
-4gementk
-4gementli
-4gemento
-4gementp
-4gementsa
-4gementsc
-4gementsy
-4gementtr
-4gementv
-gemes3
-2g1emf
-2g1emp
-gem2s
-ge3m2u
-ge3nad
-ge3nak
-gen3an
-ge3naz
-gen1c
-ge1ne
-ge4n3ed
-ge4nei.
-ge5nen.
-4genenvi
-4g3enenz
-4g3engt
-ge1ni
-gen1k
-gen3o4g
-gen3ov
-gen3sfe
-gen3th
-gen3tj
-ge1ob
-ge3oli
-ge1op
-geo3per
-georke3
-ge1oz
-ge1p2
-ge3raak
-ger3aal
-ger3aap.
-ge3raas
-ge3rab
-ge3rad
-ge3rak
-ge3ram
-ge3ran
-ge3rap
-ge3ras
-ger3as.
-ge3rav
-4g3e4r3enz
-geri4n
-ger3ini
-ge3roc
-ge3rol
-ge3rom
-ge3ros
-ge3rot
-ge3rou
-gers3lij
-ge1ru
-ger4ui
-ge1s
-ges2c
-ges2h
-ge4shop
-ges2i
-2g1esk
-ges2l
-ges2m
-ges2n
-ges2o
-ges4pend
-ges4po
-ges4ter
-ges4til
-ges2w
-3get.
-ge1ta
-get4aa
-getes3
-get3ha
-get2i
-ge1t2j
-ge1to
-ge3tsj
-ge1t2w
-ge1ui
-ge1um
-2g1ex
-g1f
-2g1g
-gge3raa
-gge4sti
-g2gh
-ggi1o
-g1h
-g2het
-ghte2
-gh2tr
-ght1s
-g2hum
-1gi
-gi1a
-gids3t
-3gie
-gie1f
-gie1k
-gie1l
-gie1s
-giet3s
-gi1eu
-gi2f
-gif1a
-gif1r
-2g1ijs
-gi1la
-2g1inb
-4ginfe
-4g3infr
-2g1inh
-gi2ni
-gin1o
-g4ins.
-gi2od
-gi1os
-gio1v
-gips3t
-g1irr
-2g1iso
-gis4t3a
-g1j
-2g1k
-g1lab
-g1lam
-gla2s1
-g3last
-g1lat
-g1lau
-1glaz
-1g2le.
-glee3t
-g1leg
-g1lei
-g1lek
-g1len
-g1ler
-1gle2t1
-g1lev
-g3lice
-g3lich
-1glim
-gli4ne
-1glio
-1gli
-1glob
-g1lod
-1glof
-g1log
-g1lok
-1glom
-g1lon
-g1lop
-g1lui
-gluid3
-1g2ly
-2g1m
-g1n
-g2naf
-gnee2
-gne1s
-gne3th
-gne4t3j
-gn1k
-g2nob
-gn2on
-gno1r
-1go.
-1goa
-go1ar
-1gob
-gobe5
-g1och
-1god
-go2d1a
-god3on
-god4s3e
-gods3t
-1goe
-goe4d3a
-goe4dr
-2g1oef
-goe1r
-goes1
-go1fr
-1gog
-g1oh
-go2k1i
-gok1s
-1gol
-go1la
-g1oml
-gom1p
-g1omz
-go1na
-gon1d
-g1ong
-2g1ont
-g1oor
-goot1
-go1pa
-g1opb
-g1opg
-g1opl
-go1pr
-g1ops
-g1opv
-1go1ra
-g1ore
-go4ren
-2g1org
-1gori
-gor2s1
-gos1p
-1g4ot
-go3the
-go1tr
-gou4dee
-1gous
-goven3
-1go
-1go
-1go-
-g1p
-gpes1
-g1q
-gr2
-1gra.
-gra4des
-g1rak
-gra4m3a4
-4g3ramp
-gra2s1
-grase4
-g1rea
-2g1rec
-gree2
-4g3reek
-gre1g
-4greis
-g1rek
-2g1rem
-g3rena
-gren4s
-1greu
-1gria
-griet3j
-g3rijd
-g3rijk
-3grijp
-1gris
-g3rit.
-2g1riv
-g1rod
-groet3j
-g1rok
-g3rook
-g3room
-gro1v
-g2ro
-2g1rug
-4g3ruim
-g1ruk
-4gs
-gs1a
-gsa2d
-gsa2g
-gsa2r
-gsas3p
-gsce4n
-g1sch
-gs1co
-g2s1e2d
-g2s1ee
-g2s1ef
-g2s1ei
-gse2n
-gs3ene
-g2s1e2t
-g2s1e2v
-gs1h
-gs4ham
-gshe4r3
-gs1i
-gsi2d
-g2sin1
-g2sis
-gsi4te
-gsi2z
-gs1j
-gs3laag
-gs3lam
-gs3lan
-gs4lang
-g3slap
-gs3lec
-gs3led
-g3slep
-gs3let
-g3sleut
-gs3lie
-g3sling
-gs3lis
-g3sloe
-gs3lon
-g3slot
-g2sma
-gs1na
-g3snijd
-g3snoe
-gs1o
-g3s4omb
-gs3pand
-g3spann
-gs3par
-g3spel
-gs3pill
-g3spinn
-gs1pl
-gs1pr
-gs4prie
-gs1pu
-gsquo4
-gss2
-gssce4
-gs3taak
-gs3tab
-gs3tac
-gs3tal
-g3stam
-gst3ant
-g3stat
-g3s4te.
-g3stee
-gs3teh
-gs3teks
-g3stel
-g3sten
-g4s3tend
-g3ster.
-gs3terr
-g3sters
-gs3tes
-gs3the
-g3s4tich
-g3s4tig
-gs4tin
-g3stop
-g3stor
-g3stot
-g3strat
-gs3trek
-gs3troe
-g3struc
-gsu2
-gs1ui
-gs1ur
-gs1uu
-g2sw
-g1sy
-gs2-
-g1t
-g2t1ap
-gte3ro
-gte1s
-gti2m
-gto1v
-1gu
-gu1aa
-gu2ac
-gu1av
-2g1uit
-gu1r
-g1u2ri
-gus1
-guts3te.
-gut3sten
-g1v
-gve2r
-gver3a
-gvero5verd
-2g1w
-1gy
-gy1n
-g1z
-1g
-1g
-2g1-
-g2-r
-haak1
-haam4s3ta
-haam4ste
-haar3s
-haar4s3te
-haar3t
-haats3te.
-hade1
-ha1do
-had1s
-h1afs
-haft3u4
-ha4gin
-ha4ke.
-ha4ket
-ha1kr
-hak1s
-ha1la
-half1
-hal4fe
-hal4ka
-ha1lo
-1hals
-hal4sto
-1halv
-1halz
-ham1s
-ha1na
-hand3r
-han3ga
-hang3l
-hang3s
-ha1no
-han3so
-hap1l
-hap1r
-har4e
-ha5ren3
-ha1ro
-har4taa
-hart3j
-harto4
-hart3or
-ha4se.
-has1p
-hat3ee
-hat1j
-hat1r
-hat1s
-ha1v
-4have.
-1haz
-2h1b
-h1c
-h1d
-h2d'
-2he.
-he5co
-hee1g
-hee4k3l
-hee4l3o
-heer4s3ta
-heer4s3te.
-hee3ta
-heet3j
-he2f1e
-he1go
-heids3p
-hei1k
-hei1t
-hei4t3j
-he2k1a
-hek4s3te.
-hek1w
-hel3ac
-he3lar
-he3li
-hel4m3a
-hel2o
-he3lon
-he3lor
-he3lot
-hel3ov
-hel3s4m
-he1na
-he1ne1
-he1ni
-hen4ka
-hen4kr
-he1no
-he3ose
-he1pi
-he4pij
-he2pr
-hep1s
-he1ra
-he4rac
-he4r3a4d
-her4au
-he4r3e4d
-he4r3e4v
-her3inn
-her1k
-her4m3eng
-her3on
-he3ros
-her1s2
-3herst
-he1sa
-hes1t
-he1ta
-he1to
-het3sten
-2hew
-2h1f
-2h1g
-h1h
-hi1a
-hide1
-hie4dr
-hie4fo
-hie3rad
-hie4r3i
-hier3o
-hie4ru
-hie1s
-hie3tj
-hie4to
-hie4tr
-hiet3s
-hi2i
-hik2s1
-hi1kw
-hi1la
-him4pl
-him4pr
-hi1no
-hint3j
-hi2p1i
-hip1l
-hi1po
-hi1sa
-hi1tr
-hits3t
-hi1
-h1j
-h1k
-h1lab
-h1loc
-hlo1r2
-2hm
-h2mi
-2h1n
-h2na
-h2nit
-hno1
-ho1a
-ho1ch
-ho1d
-hoef1
-hoek3st
-hoe2s
-hoes3l
-hoes3te
-hoe1t
-ho2f1e
-hof1s
-ho1g2
-hoi2
-ho2ka
-ho4ke.
-ho1la
-ho4le.
-ho4lek
-honi2
-hono1
-ho2nu
-hoo2
-hooi1
-2hoom
-hoon1
-hoor4n3ac
-hoor3t
-2hoot
-ho1pe
-ho2pl
-hop1o
-hop1r
-hop4s3te.
-hop4str
-ho1ra
-1horl
-1horm
-ho1ro
-hor4s3te.
-hort3j
-ho1ru
-ho1sa
-hos1p
-ho1th
-hot3re
-hots3te.
-3hou4se
-ho1v
-2how
-how1o
-h1p
-hpi2
-h1rea
-hree3t
-hri2
-hrik1
-hro2k1
-2h1s2
-2ht
-ht1a2
-h3tans
-h1te
-h2t1ee
-hten3t
-hter3f
-hter3o
-hter3st
-h4t3esk
-hte3sp
-hte3st
-h4t3e4ve
-h2t1ex
-ht1h
-h4t3ins
-h4t3int
-ht1j
-ht1oe
-ht1of
-ht1om
-ht3ond
-ht3ong
-ht3oor
-ht1op
-ht1or
-ht1ov
-ht1r
-h2tre
-hts1a
-ht4see
-ht4s3erv
-ht3sla
-hts3le
-ht3slot
-ht3slu
-ht2s1o
-ht3span
-hts3par
-hts3pl
-ht3spoo
-ht3spre
-hts3taal
-hts3tak
-ht3stand
-ht3ste.
-hts3tek
-ht3stel
-ht3stes
-ht3stoet
-ht3stop
-hts3tore
-hts3trekk
-hts1u
-ht1u2
-htve2
-htver3
-hu2ba
-huit3j
-hul4der
-2hus
-hut1j
-hut3sta
-huur1
-huw4do
-h1v
-2h1w
-h2wu
-hy1le
-hy1o
-1hyp
-hype2
-hy4pe.
-hy4pes
-h1z
-2h1-
-i1aa
-i3abet
-i1abi
-i3abolisc
-ia4bor
-i1ac.
-i1ae.
-i1a1fa
-i1afr
-i1agn
-i1a1go
-i1a1gr
-i1ai
-i1ak.
-ia1ka
-i1ake
-ia4kem
-i1al
-i2a1la
-ia1lo
-i1ama
-i3amie
-i1an
-i3apas
-i1api
-i1app
-ia1pr
-ia4ren
-i1arr
-ia1sh
-i3aspo
-ia2st
-ia3str
-i1at
-ia1th
-ia1tr
-i5atri
-i1au
-i1a'
-ibie1
-i2ceo
-ice1s
-i1cha
-ic3hal
-i1che
-i1chi
-i1cho
-i1chr
-ic1kl
-ic3ko
-i1co
-ic4t3op
-ict4sc
-i1da
-id3aan
-id3ach
-i2daf
-id3arm
-id3art
-idas1
-id3as.
-idder3a
-id2dl
-i2de1a
-iden3a
-ide3ne
-ide4o3v
-ide1s
-i2dh
-idi1a
-idie3r
-idie3t
-idi3ot
-i1don
-i1dor
-id1ov
-id3ran
-id1re
-id1ro
-id2s1a
-id4sei
-id4s3erv
-id4set
-id2s1i
-ids1j
-ids1l
-idsmana4
-id3s4mee
-ids1o
-ids3pa
-ids3pi
-ids3taal
-ids3tal
-ids3tr
-id1u2r
-id1uu
-idu1w
-id1w
-ie1a2
-iecht3s
-ie4d3ac
-i1ee2
-ie3fle
-ief3ro
-ief3ru
-ie4g3as
-ie4gei
-ie4g3erv
-ie4g3ins
-ieg1l
-ie4k3e4v
-ie3klu
-iek3ond
-ie3kra
-ie3kri
-ie3kro
-ieks3n
-ie3kwa
-iel3aar
-ie3lak
-ie3lap
-iel3do
-iel3ei.
-iel1f
-iel1k
-ie3log
-iel3sc
-iel3sp
-ie4m3ov
-ie1na
-i1enc
-ie3ned
-ie3nev
-ie1ni
-ie4n3ij
-i1enn
-ien3o4g
-ien3ov
-iens4m
-ien3sp
-iens4t
-ien4stij
-ienst3o
-ien1t
-ie1o2
-iep3ach
-ie1pi
-iepiet3
-iep3oog
-iep3sc
-iep3ste
-iep3str
-ie4pui
-ier3aal
-ie3rade
-ier3a4l
-ie3ram
-ie3rap
-ier3as
-ie4r3at
-ier1f
-ier1g
-ier1k
-ier3oe
-ier3of
-ie3rol
-ier3ont
-ie3roo
-ie1ru
-ie3sal
-ie4sco
-ie3s4fe
-ie3sle
-ieso2
-ies3pl
-ie3sto
-ie3str
-iestudi3
-iet3ac
-iet3ant
-ie3the
-iet3ov
-ie4t3rot
-ie4t3ru
-iet3sten
-i1ety
-ieu1k
-i1eur
-i1eus
-ieuw4a
-i1euz
-ie2w1r
-ie-uit3
-if1d
-i2fec
-if1lu
-i1fo
-if1re
-if1s
-if4tre
-ift3ui
-if3tuu
-ig1da
-i2g1ij
-i4gind
-i4g3ins
-ig1le
-ig3lij
-i1gom
-ig3ond
-i1gr
-ig1sc
-ig1s2k
-ig1sl
-ig1s2p
-ig3ste
-ig3sto
-i1ha
-i1he
-i1hi
-i1ho
-ih1r
-i1hu
-i1hy
-i1i
-ii2g
-i2j1a
-ija2d
-ij1ei
-ij1el
-ije2n1
-ij1er
-2ijf
-ij1i
-3ijlin
-2ijn
-ij1ni
-ijo2
-ij1on
-ij1oo
-ij1or
-i1jou
-ij1ov
-ij1ui
-i1ka
-i2k1ac
-ik1ef
-iker3a4
-iker3k
-iker3st
-i4k3erva
-ik1j
-ik1lo
-i2k1lu
-ik1na
-i1kno
-i2k1o2g
-ik3ord
-ik1re
-ik1ro
-ik1sl
-ik3spo
-ik3spr
-ik3sto
-ik1ta
-ik1to
-ik3war
-ik1we
-i1la.
-il3aan
-il1ac
-il1ad
-il1af
-i1lak
-il1al
-il3ami
-i1lat
-il1au
-ild3ri
-ild1s2
-i1le
-i4l3erv
-ile1s
-i4lesp
-ilet3a
-ile4tj
-ile4t3r
-ilet3s
-ile1u2
-ilevin4
-i2l1e2z
-il1f
-il1g
-i1li
-ilie3r
-ilie3s4
-ilie3t4
-il1k
-ilk1s2
-il4lam
-illa3s
-1illu
-illus3t
-il4map
-il4m3ar
-il4mav
-i1lof
-il3ond
-il3oor
-iloot4j
-il3oph
-ilo2r
-il3ore
-i4lots.
-ilo1v
-il1pa
-il1po
-il1sa
-il1sc
-il3spo
-il2t1a
-il2th
-ilt1s
-i1lu
-i1l
-i3ma.
-i2meb
-i2mej
-i2mem
-im3emi
-im3enc
-imes3t
-i4meti
-i2me-
-imma4ge.
-imo1n
-i2m1op
-im3org
-im1pj
-1impu
-im2s1l
-ims3oo
-im1sp
-imte3s
-2i1na
-in1ac
-in3a4ker
-i2n1au
-in4dene
-inde3s
-in4d3e4va
-ind3s4c
-1indu
-in4d3uit
-i1ne
-in3e4di
-i4n3eed
-i2n1ei
-ine1o2
-i4nesm
-ine3ta
-inet4s
-in1ex
-1infe
-in4g3aa
-in4g3a4g
-in4gam
-in4gei
-3ingete
-ing3lo
-ing3ru
-in4g3uu
-i1ni
-ini3sta
-in1kj
-in1kn
-in4kna
-in3kro
-inli2
-innes3t
-1inno
-i1noc
-in1oe
-in1of
-in3ong
-ino3s4t
-in1ov
-inper4s3t
-in1sl
-in3smi
-in1sn
-in1sp
-in5sten
-in4sui
-inta4ge.
-in4t3ap
-intes3
-int1s
-i1nu
-in1un
-io1a
-ioas1
-i2ob
-io1c
-i3oces
-i1o1d
-i2odo
-i1oe
-ioe4ni
-io1fa
-i3ofiele
-io1fo
-io1fr
-io1g2
-io1l
-i1ol.
-i3olen
-i5ologeerde
-i3omen
-i3omer
-i1on
-io1na
-io4nof
-io4nop
-ion4st
-ion1t
-i1oo2
-iop2l
-io1pr
-i1opt
-iop4te
-io1ra
-io1ru
-i1os.
-i1osa
-io1sf
-io1sh
-i3osi.
-io1sp
-io1s2t
-i1o1su
-io1ta
-io1th
-i3othecai
-i3otheekj
-i3otheekl
-i1oti
-io1tr
-io1u
-io1w
-i1ox
-i1pa
-i2p1ac
-i2p1au
-i1pe
-ipe1k
-ipe4t3j
-i1pi
-ipi2r
-ip1j
-i1pl
-ipo4ge
-i1pot
-ip1ru
-ip1sc
-ip1sl
-ips2t
-ip3sti
-i1pu
-iput1
-i1q
-i1ra
-i1r2e
-iree3t
-ire1n
-i1ri
-irie3t
-irmi2
-i1r2o
-iro1p
-ir2sc
-ir1sp
-ir1ta
-ir1th
-ir1tj
-irt1r
-irt1s
-i1ru
-iru2s
-i1r
-is1aa
-is1ad
-is1ak
-i1sal
-is1ap
-is1a2r
-is1as1
-is1av
-i3scha
-ise2d
-is3eil
-is3eis
-is3elf
-ise3ra
-i4s3erv
-ise1s
-ise2t
-is3ete
-iset3j
-is4fee
-is4hen
-is1ho
-i1si
-is1i2d
-isie1
-i2s1ij
-i2s1im
-is3int
-is1j
-i1sji
-is1l
-is4lui
-is1na
-is3ned
-is3nij
-is1no
-i1soe
-1isol
-is3o4li
-is3ord
-iso1s
-is1pa
-is1pl
-is1po
-is1pr
-iss2c
-is1t
-is4t3ap
-is4tat
-i3s4termu
-is2tj
-is3t4le
-isty1
-i4style.
-isu2m1
-i1sy
-i1ta
-it1ap
-it1au
-i1te
-i2teb
-it3een
-iten3aa
-iten3t
-ite3rar
-2ite1s2
-i3tesk
-it3e4te
-it1ha
-itie3r
-itie3s
-it3ins
-it3jesg
-it3jesp
-i1tof
-it1oo
-i1top
-i1t2ou
-it3red
-it3rui
-it4sei
-it2sj
-it3sje
-its4mi
-its3te.
-it3stel
-its4ti
-it3stop
-itsu2
-its3ur
-its3uu
-itte3s
-2i1tu
-i1ty
-i1u2
-ium1
-iuma2
-i1v
-i2vec
-iven1
-ive1s
-i2ve-
-i1w
-iwes1
-iwi2
-2i1z
-i2zed
-i1
-i1
-i1
-i1ta
-i1-
-i-2ch
-i-2g
-jaar3t
-jacht3s
-1jag
-ja1kn
-ja1la
-ja1lo
-1jam
-ja1ne
-jan1o
-jans3l
-jan4s3t
-jan3tj
-jao2
-ja1pa
-ja1po
-ja1ro
-1jas1
-ja1sa
-ja1ta
-2jav
-j1b
-jbal1
-jbe4lu
-j1c
-jd1aa
-jd1ar
-j1das
-j2d1ee
-jde4n3e
-jdens3p
-j4d3erv
-jde1s
-jdo2
-j1dom
-jd1on
-jd1op
-jd1or
-jd1re
-jd1ri
-jd1ro
-jd3rui
-jd3sal
-jd3slo
-jd3slu
-jd3spo
-jds3pr
-jd1st
-j2d1u
-jd1w
-jea2
-1jeb
-1jec
-je1ch
-jec4t3a
-j1ee
-jeen1
-jee1t
-j1ef
-2jei
-je1kl
-je1la
-j1en
-je1na
-je1ne
-jene4t
-je3n4of
-1jep
-je1pi
-je1ro
-1jesa
-3jesbi
-3jeskn
-jes1l
-3jeslu
-3jesme
-jes1o2
-jes3pa
-jes3pu
-1jesr
-jes1t
-je3s4ti
-jet1s2
-1jeu
-1jeva
-1jevr
-j1ex
-1je-p
-jf1a
-jf1da
-j2f1ei
-j2f1en
-j2f1ij
-jf3lap
-j3flat
-jf1le
-jf1lo
-jf1o2
-jf1r
-jf4s3ec
-jf4ser
-jf4set
-jfs1j
-jfs1l
-jfs1n
-jfs3pa
-jfs3tak
-jfs3to
-jf1t
-jg1d
-jge3la
-jg1l
-j1go
-j1gra
-jg1re
-j1gro
-jg1sc
-jg2se
-jg1sn
-jg3ste
-jgs3tr
-j1h
-j1i2d
-j1ig
-ji4ge.
-jin1
-ji1t2j
-ji2ve
-j1j
-2jk
-jk3aan
-jk3aard
-j3kaart
-j1kap
-jk1au
-j2k1ij
-j4k3ins
-jk1j
-j4k3lap
-j3kled
-jk1li
-j3klon
-jk3lop
-jk1lu
-jk1na
-j1kne
-j1kni
-j1kno
-j2k1o2l
-j2k1on
-j4k3opl
-jk3raa
-j3kran
-jk3red
-jk3rin
-jk1ro
-jk1ru
-jks1a
-jks3le
-jks1n
-jk3span
-jks3pl
-jks2t
-jk3sta
-jk3sti
-jk3sto
-jk3stra
-jk1ta
-jk1to
-jk1ui
-jk3waa
-j3kwas
-jk1we
-jk1wi
-j1la
-jl3ana
-jl1d
-j1le
-j2l1ef
-j2l1e2l
-jl1f
-jl1g
-j1li
-jl3ink
-jl1k
-jl1oe
-j1log
-j1loo
-j1lop
-j1lot
-jl1p
-jl1sn
-jl1st
-j1lu
-j2m1af
-j2m1op
-jm1p
-jm1s
-jn3aak
-jn3aal
-jn3aar
-jn1ac
-jn1ad
-jn1a2k
-j1nam
-jn1a2p
-jn1ar
-jn1c
-jn1do
-jn1dr
-jnd1s
-j1ne
-j4neen
-j2n1ef
-j4n3erv
-j2n1ex
-jn1g
-j2n1im
-jn1k
-jn1o2
-jn1sa
-jn4sei
-jn2si2
-jns3la
-jn3slu
-jn3soo
-jns3pl
-jn4ste.
-jn1t
-j1nu
-jo2b1
-jo1d
-joet1
-jo1fa
-jo1go
-2joi
-jo3l2e
-j1om1
-jo1na
-joor1
-j1op
-jo1pe
-jo1ra
-jor1d
-jo1ru
-jo1ta
-1jour
-joy1
-j1pa
-j1pe
-j2p1em
-j1pi
-j2p1ij
-jp1j
-j4p3lam
-jp1li
-j1poo
-jpor1
-j1pot
-j1pr
-jp3rem
-jp3rok
-jp1s
-j1pu
-j1r
-2js
-js1a
-j1sch
-j2s1ef
-j4s3ela
-j2s1em
-j2s1er
-j2s1e2v
-js1h
-js1i
-js1j
-js3lan
-js3lie
-j1slu
-js1no
-js1o2
-j1soe
-j3spel
-j1spi
-js1pl
-jspoort3j
-j3spor
-jss2
-j3sta.
-j3stal
-j3stat
-js3teb
-j3stel
-js3tem
-js3ten
-js3tep
-js3terb
-j4s3terd
-j4s3tere
-j4s3teri
-js1th
-j3stoel
-j3ston
-js3tou
-j1str
-j4stran
-jst3rand
-j1stu
-j1ta
-j2t1ac
-j1te
-jt1h
-j4t3inc
-j4tind
-j1tj
-j1toe
-j1ton
-j1too
-jt3opt
-jt3raa
-jt3rei
-jt3rot
-jt1s
-j1tu
-1ju
-ju1d
-ju2k
-ju1ni
-ju1ra
-jus1
-j1v
-jver4sp
-jvie1
-j1w
-j1z
-jze4r3o
-j1-
-1ka.
-1kaal
-k3aanb
-kaap1
-kaart3j
-1kaas1
-kaats3te.
-1kab
-k1abs
-k1a2ca
-2k1acc
-3kache
-4k3acht
-2k1act
-ka1da
-1kade
-kade4t3
-k1adm
-ka1do
-k1adv
-2k1afd
-1kafe
-k1afh
-ka1f2l
-2k1afs
-k3aftr
-2k1afv
-2k1afz
-3kage.
-k3agen
-3kages
-1kah
-ka1i2
-ka1ka
-kak1s
-ka3lan
-ka3las
-k2ale
-1kalf
-kalf4s3
-k1alg
-k2alk
-kal4k3a
-kal4k3l
-kal4kr
-ka1lo
-1kam
-k1a2ma
-2k1amb
-kamen4
-kame4re
-2k1ami
-kam4pl
-kam4pr
-1kan
-ka1na
-ka1ne
-2k1ang
-ka1no
-kano3v
-kan4s3t
-kant3j
-kan4t3r
-1kap.
-1kape
-1kapi
-ka2p1l
-ka1po
-4kappa
-ka1pr
-kap1s
-1kara
-k1arc
-1kard
-2k1arm
-ka1ro
-kar1t
-4k3arti
-1ka2s
-kas1c
-kas1l
-kas1p
-ka4st
-kast3o4
-kast3r
-kas3u4r
-1kat
-kat3aal
-ka1th
-kati2
-ka4t3io
-kat1j
-k1atl
-kato2
-ka4t3og
-ka4too
-ka1tr
-kat1s
-ka4tui
-2k1aut
-k1avo
-1kay1
-1kaz
-1ka'
-k1b
-kbe2a
-2k1c
-2k1d
-kdan4c
-kdo1v
-kdri2
-1ke
-2k1e2c
-k1een
-kee4p3l
-keep3s
-kee2r
-keer4s3to
-kees1
-kee3tjes
-ke1fa
-2k1eik
-2k1eil
-kei1s2
-2k1eiw
-4kejes
-kel3aan
-kel3ac
-kel3da
-kel3do
-kel3dr
-4k3e4lem
-4kelj.
-ke3loe
-kel3o4p
-kel3ov
-kel3so
-kel3sp
-3keme
-ke4mis
-ken3ac
-ken3an
-ke3nar
-ke3nat
-ken3a4z
-ke3n4ei
-ken1o
-kens3le
-ken3sto
-ken1t
-ke1pi
-kepie3
-ke3rad
-ker1g
-ker4k3ra
-ker4n3a
-ker3oe
-ker3o4g
-ker3on
-ker3oo
-ke3ros
-ker4sti
-ker4stof
-4k3erts
-4kerwt
-ke3stel
-kes3ten
-kes3tra
-4kete.
-ke4ted
-ket1j
-ke2t1r
-ket3sp
-ket3sten
-ketting3s4
-ke2tu
-ke2vl
-2k1ex
-key1
-4k3e4zel
-2ke-
-2k1f
-k1g
-kgang3
-kge3la
-kge1n
-2k1h
-1ki
-ki2de
-ki2di
-2kied
-kies3l
-kiet3j
-kig1l
-kijf1
-kij4k3o
-2k1ijs
-2k1ijz
-ki1kl
-ki1la
-ki1lo
-4k3indel
-4kindu
-kine3a
-kin3en
-2k1inf
-kings3l
-2kinh
-2k1inr
-kin1s
-2k1int
-2k1inv
-ki1o
-2kipa
-ki2p1l
-kip1s
-ki1s2p
-ki3sta
-ki2te
-ki1th
-ki1tr
-kit4sc
-kits3t
-2ki
-2ki'
-k1ja
-k1jew
-k1jo
-2k1k
-kkaart4
-kka1t
-kken3sp
-kker4s3ten
-kke1s
-kl4
-1kla
-k3ladi
-k3land
-klap1
-k3last
-k3lat.
-3kledi
-klee2
-3kleed
-k3leer.
-2k1leg
-k3leid
-k1lek
-1klem
-2k1len
-1klep
-k1les
-1kle2u
-k1lez
-2k1lic
-k1lid
-k3lied
-3klima
-1klin
-k3lite
-k1loc
-k1lod
-k3loke
-1klom
-k3lone
-k3lood
-3kloof
-k3loop
-k3lope
-1klos
-klots3te.
-klo1v
-2kloz
-kluit3j
-2k1m
-kmee2
-4knaal
-kna2l1
-k1nam
-1knec
-knee2
-k2ner
-knie3t
-knik1
-knip1
-2k1niv
-1knob
-1knol
-1knop
-kno3pe
-1ko
-ko1a1
-ko2bl
-2k1oct
-ko1da
-2k1oef
-koes1
-koe3sta
-koets3p
-ko1fo
-koi1
-ko1ka
-ko1la
-ko3le
-kole4n3
-k1o2ly
-ko2m1a
-k3omsl
-kom4str
-2k1omz
-2k1onb
-kon3do
-2k1ong
-k2oni
-kont3j
-kon4t3r
-2k1onw
-koo2
-2k1oog
-koor3tj
-ko1pa
-2k1opb
-2k1opd
-ko3pe.
-2k1opg
-k1oph
-k3opsl
-ko1ra
-kor1d
-2k1org
-2k1ork
-kort3a
-kort3o4
-kort3s
-ko1ru
-ko2s1
-kos3o2
-2k1oss
-kot2j
-kots3te.
-kou3t4j
-2k1ov
-2k1ox
-k1p
-k1q
-k3raad
-1krac
-k1rad
-kradi3
-k1rai
-k3rand
-1kras
-krat3j
-k1rea
-2k1rec
-k3rede
-1kree
-kreet3
-k1ref
-k1rek
-k1res
-2k1ric
-kri2e
-k3rijk
-krijs3t
-krij4t3j
-1krim
-kri1o
-1krit
-4kritm
-k1rob
-k1roc
-2k1rol
-kron3t4
-4k3roof
-1krop
-krop3a
-kro4to
-k1rou
-k1ro1v
-kru2l1
-2ks
-ks1aa
-ks1ad
-ks1ak
-ks3alm
-ks1an
-ks1ar
-ks1as
-ks1av
-k2sca
-k1sch
-k2s1ee
-k4s3ei.
-kse4ma
-kse4mi
-k2s1e2p
-k4s3erv
-k2s1et
-k2she
-ksie1
-k1sil
-k2s1in
-ksi4te
-ks1j
-k2sk
-k3s4kes
-k3slac
-ks3lan
-ks3len
-k3sleu
-k3slot
-k1slu
-ks4mee
-ks1na
-ks1nu
-kso2
-ks1of
-ks1og
-k3song
-k1soo
-ksop1
-ks1or
-ks3par
-k3spel
-k3spor
-ks3pot
-ks3pra
-ks3pru
-kss2
-ks3taak
-k3stag
-k3stat
-k3stav
-k1ste
-k4stec
-k4stele
-k3s4tie
-ks4til
-ks4tin
-kst3op
-k3stot
-ks3trek
-k3stroo
-kst3uit
-ks1ui
-k1sy
-2kt
-kt3aan
-k3taar
-kt1ac
-k1tal
-kt3ana
-kt3art
-k3te
-k4t3e4co
-kter3st
-kte3sp
-kt3even
-kt1ha
-kt3hed
-k1thr
-k2t1in
-kt1j
-k1toe
-kt1om
-kt3ond
-kt3ope
-kt3ord
-kt3org
-kt1ov
-k1tr
-kt3rec
-kt3ren
-kt3res
-kt3reu
-kt3rij
-kt1sc
-kt1sh
-kt1sl
-kt3ste
-kt3str
-k1tu
-k1ty
-1ku.
-1kub
-ku3be
-kui2f
-ku3k
-1kun
-2k1uni
-kun4stu
-k1up
-ku1ra
-kur4ki
-kur1s
-1kus
-kut1
-2k1v
-kve2
-kvee1
-kvent3
-kver1
-kvide3
-k3waar
-k1wac
-2k1wag
-1kwal
-1k2wam
-k1wap
-1kwar
-2kwat
-k3weer
-kwee3t
-k1weg
-k1wei
-kwen4s3t
-k1wer
-1k2wes1
-3kwets
-kwets3te
-k1wez
-1kwir
-k1wo
-1ky.
-ky1l
-k1yo
-k1z
-1k
-2k'
-2k1-
-laad1
-laan1
-4laanb
-4laand
-l3aang
-4l3aant
-4l3aanv
-laap1
-l3aardi
-laar3t
-laas1
-laat3j
-laat3sta
-1lab.
-1labo
-4l3a4bon
-2l1a2ca
-l1acc
-la3ce.
-3lache
-lacht4s
-l2aci
-lad1a
-lad3ete
-la1do
-lad1s2
-la2d1u
-1lae
-2l1afd
-1lafe
-la3fle
-la1fo
-l1afs
-la2g1a
-la4gent
-lag1l
-lag1o
-la3gra
-lag1s2
-1lah
-lak1a
-4l3akko
-la4kla
-1lako
-la1kr
-lakte3
-la1la
-1l2ald
-la1l2o
-la4mid
-lamp3j
-lam4p3l
-lam4p3o4
-lam4s3p
-2lana
-la3nad
-landa4
-lan4d3aa
-lan4ded
-lan4d3ra
-land3re
-la1ne
-la4ne.
-la4n3ec
-la4nes
-lang3l
-lang3sp
-lang3sta
-lan4kan
-lan4k3l
-lank3w
-la3noo
-lans3l
-lan4s3t
-lan5s4ten
-lan3th
-lant3j
-lao2
-1la1pa
-1lapj
-lap1l
-lap1o2
-1lapr
-la3pre
-lap1s2
-lap4ste
-la2p1u
-1lapz
-1larg
-lar4ge.
-lari4
-4larm.
-lar4min
-1la1ro
-lar1s
-lasa2
-la3sch
-las1l
-las1p
-3lastl
-la1ta
-la4tes
-lat3he
-lats2
-lat3sl
-la4t3ui
-2lavo
-1law
-lay1
-la4zij
-1la
-1la-
-2l1b
-lba1t
-lber4t3
-lbet2
-2l1c
-lce2l
-l2cop
-2ld
-l1daa
-ldaat3
-ld1ac
-l1dad
-l1dak
-ldak4s3
-l2da2r
-ld3arb
-ld3ari
-ld3art
-ld3econ
-l4deen
-l2d1ei
-l4d3elf
-lden3k
-ldera4
-lde4r3at
-l2dex
-l2dh
-l4d3ins
-ld1o2l
-ld1om1
-ld3ond
-ld3ont
-ldo2p
-ld3opi
-ld3ori
-ld3ram
-l4d3rat
-l3dree
-ld3reg
-ld3ren
-ld3res
-ldri2
-ld3rol
-ld3rom
-ld3roo
-l1dru
-ld1sa
-ld1sc
-ld4scr
-ld1sl
-ld1sn
-ld3som
-ld1sp
-ld1st
-l4d3uit
-ld3uurr
-ld1w
-le2af
-le2ag
-le1a'
-le4del
-leden3
-4l3e4dit
-lee2g1
-leega4
-leege4
-4leekh
-leen1
-lee4pl
-lee2r
-lee4s3
-le1fa
-2leff
-le1fl
-legel3a
-l2ei.
-4leier
-2leig
-leii3ger
-4leind
-4leisar
-leit3s
-le1ka
-le1kl
-leko2
-le4kol
-le3kra
-lek3ri
-lek3str
-1lel
-le1la
-le4lek
-4l3e4lem
-le4lim
-2lemp
-l2en
-le3naa
-len3a4d
-len3a4k
-le3nar
-1lene2
-len3ei
-le4n3em
-1leng
-le1ni
-len1k
-len3o4g
-len3ov
-len3sn
-4l3en3th
-len3tj
-le1oa
-le1pi
-1le1ra
-le4rac
-le4r3a4k
-le4rau
-le4r3e4v
-le3roe
-ler3sk
-ler3sp
-4l3erts
-le1ru
-4l3erva
-le4s3et
-le3sho
-le3slu
-le3str
-lesu2
-le3taa
-le3tab
-le3te
-le4tem
-le1tj
-le1to
-le4top
-le4t3ri
-le4t3ro
-lets3t
-le2tu
-le3um3a
-le3umi
-leu3ro
-1leuz
-levink3j
-2lexp
-lf3aan
-l1fad
-l1fan
-l1fa2r
-l1fa1s
-l1fat
-lf1au
-l1fav
-lf1d
-l4f3ende
-l2f1e2v
-l2f1e2z
-l4f3ing
-l2f1ir
-lf1lu
-l1foe
-lf1o2l
-lf1om
-lf3org
-lf3rei
-lf1ro
-l1fru
-lfs1a
-lf4s3ei
-lfs3le
-lf1sp
-lf1st
-lf1t
-l2f1uu
-2lg
-l2gac
-l2g1af
-l2g1ap
-lg1d
-lge3la
-lgi1s
-l1gla
-lg1li
-lg1on
-l1g4oo
-lg1op
-lg1ov
-l1gr
-l4g3rom
-lg1s
-lg1ui
-l1h
-li1a
-1libe
-lid1s
-lie4g3a
-lier3st
-lie3st
-lie3ta
-lie3tj
-liet3s
-lie4tu
-li1eu1
-li1fa
-l2ig
-li1go
-lije2
-lijk3a
-lij4k3o
-lij4m3ac
-1lijn
-1lijs
-l3ijs.
-lij3sp
-lijs3te
-2l1ijz
-li4ke.
-li4kes
-li1kr
-lik1s
-li2kw
-li1la
-1limi
-lim4p3j
-l1inb
-lin3dr
-li4nec
-li4nev
-2l1inf
-l2ing
-lin4gi
-ling3l
-ling3r
-2l1inh
-l1inj
-4l3inko
-1linn
-li1no
-2l1inr
-lin1s
-l4ins.
-lint3j
-2l1inv
-2l1inz
-lio1
-li3ose
-li1o'
-lip3ar
-li2p1l
-li1po
-li1sa
-li3shi
-lis3pe
-2l1isw
-li1th
-li1to
-lit1r
-lits3t
-lit3s4ten
-2lix
-2l1j2
-2lk
-l1ka
-l4k3ank
-lk3art
-l2k1au
-l2k1em
-l2k1ep
-lking4
-lk1j
-l4k3lag
-lk3lev
-l1kli
-l1klo
-l1k2n
-lk3ont
-l1kra
-lk3rij
-lk3rot
-l1kru
-lkse2
-lk4s3ed
-lks1p
-lks3taa
-lk4s3tel
-lks3tr
-lk1t
-l1ku
-l2k1uu
-l1kwa
-l1ky
-2l1l
-lla1g
-ll3amb
-lla3tr
-ll1d
-ll3eig
-lle1k
-llen3s
-ller3o
-lle3s4m
-lle3st
-lli2f
-llo1f
-llo3tr
-l2l1ov
-ll1p
-ll1s
-llti4me.
-2lm
-lm3a4ca
-lm3act
-lm3arc
-l2m1au
-l2m1e2p
-l4m3erv
-lme3te
-l2m1e2v
-l4mind
-l4m3ins
-lm3oli
-lm1p
-lm1s2h
-lm1st
-2l1n
-lni2s
-lo1ac
-lo1al
-lo4boo
-lo4bor
-lo1dr
-loe4d3a
-loe4dr
-3loef.
-l3oefe
-2loeg
-loe1l
-1loen
-loen4s3t
-lof5d
-lo1fo
-4lo4gig
-log1l
-lo1go
-logs1
-log4sec
-log4sel
-1loj
-1lo1ka
-lo4k3ar
-lo4kee
-lok1l
-lo4k3op
-lo1la
-lo2li
-l1omg
-lomp3j
-lom4p3l
-l1omt
-l1omz
-lona2
-lo4nam
-2lond
-lon4gaa
-lon4gr
-1loni
-1lonn
-lont3j
-l3ontv
-1look
-loo2n
-3loopr
-loor1
-3loosh
-loo2t
-loot3e
-lo1pa
-l1opd
-lo1pe
-lo4pera
-lop4la
-l1opn
-lo1pr
-2lopv
-l1opw
-1loq
-1lor.
-lo3rad
-lo3rat
-1lorf
-l1org
-l1ork
-l1orn
-1lors
-1lor-
-lo4sce
-lo3spe
-lo4s3tr
-lot3ac
-lot3a4l
-lo4tet
-1loth
-1lotj
-lo4tof
-lou1s2
-2lox
-lo3yaa
-lo4y3aler
-1loz
-1lo-
-2lp
-lp3aan
-lp3age
-lp1am
-l1par
-l1pe
-lpe2n
-l2pex
-lp3ins
-lp1j
-l1pl
-l3p2la
-lp1of
-lp3ond
-lpoort3j
-lp3ope
-l1pr
-lp4ser
-lp1si
-lp1st
-l2pt
-l1pu
-l1q
-2l1r
-lrus1
-2ls
-ls1aa
-l1sab
-ls1a2d
-ls1a2g
-ls1ak
-l1sal
-l1sam
-ls1an
-l1sap
-ls1ar
-ls1as1
-l1sau
-ls1av
-l1sch
-ls4crip
-lse2c
-ls3eco
-l2s1e2d
-l2s1ef
-ls1im
-ls3ink
-ls3int
-lsi4te
-ls1ja
-l3slac
-l3slak
-l3slan
-ls3led
-ls3lee
-l3sleu
-ls3lie
-l1slo
-l3slui
-ls4maak
-l3s4mee
-l3smid
-ls3ned
-ls1of
-l1sol
-l3som.
-ls1o2r
-ls3pac
-l3span
-ls3par
-l1spe
-l1spi
-ls3pli
-l3spor
-ls3pra
-l1spu
-lssie3
-l1sta
-l1ste
-l4s3teko
-l4s3term
-l4stev
-l1sto
-l1str
-l4s3trak
-l4strans
-l1stu
-lsu2r
-ls3ure
-ls1us
-l1sy
-2l1t
-ltaar3
-l4tamp
-lte3na
-l2t1ho
-l2tl
-l2t1ov
-lt1sc
-lt1sl
-lt1sp
-lts3te.
-ltuur3
-l2tv
-l2twi
-1lua
-lu2b1e
-lu2b1l
-lu2br
-lu1ee
-lu1en
-lu1er
-1lui.
-1luia
-1luid
-3luie.
-luk4s3t
-lu1lo
-1lum
-lu1na
-1lunc
-2l1uni
-lu1ra
-lu2sp
-lu3sta
-lus3tra
-lu1ta
-lu1th
-lut1j
-luts3t
-l1v
-lven3s
-lver3a
-2l1w
-lwea1
-1ly
-ly1a
-ly1e
-l1z
-l1
-2l1-
-1ma
-2maad
-maal3sp
-m3aanb
-2m1aap
-m1adm
-ma1do
-2m1adr
-2m1adv
-2m1afd
-ma1fo
-2m1afs
-2m1afw
-ma1gl
-ma1go
-ma1gr
-ma1ka
-ma4ke.
-ma4kes
-ma3ki
-4m3akko
-ma1kr
-ma1la
-ma4l3ent
-mal3sp
-ma1lu
-man3ac
-ma3nak
-4m3anal
-man3do
-ma1ne
-man1g
-ma1no
-man4see
-mans3p
-man4s3ta
-man4ste
-ma1pa
-ma1pr
-2m1arb
-mariet3
-ma1ro
-mars4h
-mar3sha
-mar4s3t
-ma1sa
-ma3sch
-mas2h
-ma3she
-ma1so
-ma1sp
-ma3str
-ma1ta
-ma4tes
-ma1th
-mat1j
-ma1tr
-mats3te.
-m2a'
-mbo1s
-m1c
-mcel1
-m1d
-m2dh
-m2dj
-mdo1p
-md1so
-md3ste
-1me
-me1ad
-me1an
-me1ar
-me2at
-me1c
-mede3s4
-medie3
-4medro
-mee3kr
-mee3las
-meel3d
-mee3lo
-meer3a
-mee3sp
-meest3a
-mee3sto
-mee3str
-mee3tj
-mee4tu
-meg2a
-mega3s4
-m1eig
-me1ka
-me1kn
-me1kr
-me1kw
-m2el
-mel3ac
-me3lad
-me3lak
-me3lar
-mel3as.
-mel3dr
-me4lel
-3melk
-mel4ko
-me3lom
-me3lot
-mel3s4m
-mel3sp
-memana4
-m2en.
-me3nad
-me3nar
-me3n4as
-me1ne
-men4g3ra
-meng3s
-me1ni
-me4n3ij
-men1k
-me3nor
-men3ov
-men4s3te.
-men4sure
-men4s3uu
-ment3ac
-ment3j
-men4ton
-me1nu
-me1of
-me1om
-me1p2j
-2m1e2q
-mer3aak
-me3rab
-me3rad
-me3rag
-me3ral
-me3rama
-mer3ante
-me3ras
-me4r3ei
-mer1f
-merk3lo
-mer3of
-me3rot
-merrie3
-mer4sta
-me3rui
-m2es
-me4sca
-me4sco
-mes1h
-me1sl
-me3sol
-mes3pa
-me3spe
-me3spo
-me3stel
-mes3ten
-mest3ov
-me1t2a
-me4tera
-me1th
-meti4m
-me1tj
-me1to
-met3sten
-me1ui
-m3e4ven
-mever3
-2m1ex
-m1f
-mfi1t
-mf2o
-m1g
-mge3la
-mge1r
-m1h
-mhoog3
-1mi
-mi1a
-mi1ch
-2mid.
-2mids
-mie1l
-mie3s4t
-mijn3s
-2m1ijs
-2m1ijz
-mi1kn
-mi1la
-mi4laa
-mi1lo
-mime1
-m1imp
-mi4nac
-m2ine
-2m1inf
-ming4s3
-4m3inko
-mi1no
-2m1inr
-m1inv
-mi1oc
-mi1of
-mi1op
-mi1ot
-mi1ov
-mi1p
-m2is
-mi3sce
-mi3sfe
-mi4sin
-mismana4
-mis1p
-mis4tac
-m2it
-mi1to
-mi1tr
-mits3t
-m1j
-m1k
-2m1l
-m1m
-mma1f
-mmana4gem
-mmi3s4l
-m1n
-1mo
-mo1a
-mo1da
-mo1do
-moed4s
-2m1oef
-moe3fl
-moer4s3t
-moe2s
-moes3p
-moes4te
-moet3j
-mo1g
-mo2g1a
-mo1ka
-mo1la
-mo4lie
-2molt
-2m1omv
-mo3nad
-mo3nar
-mon1g
-mono5l
-mons3h
-mons4t
-moo2
-mooie4
-moor3t
-mo1pa
-2m1ope
-2m1opn
-mop4sn
-m1opw
-m1opz
-mo1ra
-mo3re
-mo1ro
-mor4sp
-mor4s3t
-mos2c
-mosce4
-mo1sj
-mo2sl
-mo3sta
-mo1ta
-mo1th
-moto4l
-mots3t
-2m1oud
-mo1w
-m1ox
-mo3yant.
-m1pa
-mp3ach
-m2p1af
-m4papp
-mp3arts
-m1pe
-m2p1ec
-m1pi
-mp3inr
-mp3ins
-m1pl
-mp3lei
-mp3lev
-mp3lie
-m2p1lu
-m1po
-mp3oef
-m4p3ope
-mpo1v
-m1pr
-mp3rec
-mp3red
-mp3ring
-mp1s2
-m1pu
-m1q
-m1r
-ms1aa
-m1sal
-m1sam
-ms3ana
-ms1ap
-ms1ar
-m1sau
-m1sc
-ms2ce
-mscenari3
-m2scu
-ms1h
-m1si
-m1sje
-m1sl
-ms2me
-ms2mi
-ms2mo
-m1s4n
-m1sol
-m1son
-ms1o2r
-m3spande
-m1spl
-m1spo
-m1sta
-m1ste
-m4stec
-ms2ti
-m3stig
-m4s3ton
-m3stor
-m1str
-mst3rom
-m1stu
-mstudi3
-ms1ui
-m1sy
-m1t
-mtes2
-mto1v
-1mu
-4muilt
-2m1uit
-2muk
-mu1lo
-mul1p
-mu1lu
-mu2m1
-mu1na
-mu1ni
-munie3
-mu1no
-munt3j
-mu1ra
-mu1sa
-mu1sh
-mus3ta
-mu1ta
-muts3t
-m1v
-mve2
-mvee1
-mver1
-m1w
-1m2y
-my1a
-my1e
-m1z
-mze2t1
-1m
-1m
-1m
-m1-
-1na.
-1naad
-1naal
-1naam
-n1aan1
-3naar.
-n3aardi
-n3aards
-3naars
-4n3aarsa
-4n3aarsv
-naar3t
-3naar-
-n3aas.
-3naast
-1naat
-naat3s
-na4bon
-n1aca
-1nace
-2n1act
-1na1d2a
-3nade.
-3nadem
-3nades
-1nadi
-n1adm
-na1do
-na1dr
-4n1adv
-1nae
-n1af
-2nafb
-na1f2l
-2nafs
-1na1g
-1nai
-1nak.
-na1ka
-na1k2l
-na1kr
-n1ala
-1nale
-nal1k
-n1alm
-na3loo
-1nalt
-2naly
-1nam.
-1nama
-1name
-name3s
-1nami
-n1amn
-n1amp
-na3nac
-na1ne
-n1anj
-na1no
-3nant.
-nan4ta
-n3antenn
-3nants
-3nant-
-nap3ac
-na1p2l
-na4pos
-na1pr
-nap3ste
-1nap
-na2r1a
-n1arb
-3narco
-1nard
-1nare
-na4rend
-n1arg
-narie3
-n1ark
-2n1arm
-na1ro
-nar4s3te.
-n1art
-na1s2a
-na1sc
-na1s2l
-nas4ma
-na1sn
-1nast
-na4ste
-na3stu
-1nat.
-1na1ta
-n3atel
-1nati
-nat1j
-n1atl
-na1t2r
-nat3sp
-nat3ste
-1natu
-1nau.
-1naus
-3nazif
-n3a4zij
-1na
-1na'
-1na-
-n1b
-nbet2
-nbots3t
-2nc
-nca2k
-n4cepa
-nce3sp
-nces4t
-ncest3e
-n4cete
-n1che
-n1chi
-n1chl
-n1chr
-nch1t
-nch1u
-n1co
-2nd
-n1daa
-nd3act
-n4d3ana
-nd3arb
-n3darm
-nd3art
-nd3as.
-nd3ass
-nd3e4del
-n4d3edi
-n2d1ei
-nde4r3an
-n4d3e4rec
-nde4rei
-nde4r3in.
-nde3sl
-nde4ten
-ndiet3j
-n4d3ijs.
-n4d3ijz
-n4dink
-n4d3ins
-ndi1o
-n1dob
-n2d1of
-nd3o4lie
-n1dom
-n3dona
-n4d3ond
-nd3ont
-nd3oog
-nd3ope
-nd3ove
-n4d3rap
-n4d3rat
-nd3reg
-nd3rei
-nd3rese
-n4dret
-nd3ric
-nd3rot
-nd3rug
-nd3sal
-nd3san
-nd1sc
-nd4sce
-nds4cu
-nd4sei
-nd1s2i
-nd3slu
-nd3s4mee
-nds3pat
-nd3spi
-nd3spri
-nds3taal
-nds3tal
-nd3stan
-nd3ste
-nds3trek
-nd3stri
-ndu2r
-n4d3ure
-nd3uri
-nd1w
-1ne.
-1nea
-ne1ad
-ne1am
-ne2ap
-ne1ar
-nebe4st
-1neck
-ne1d
-nede4n
-ne4dit
-n1e2du
-1nee2l
-neel4ste
-1neem
-n1een
-neen3s
-1neer
-neer3s
-1nees
-1neet
-neet3a
-neet3o
-neet3r
-ne1fa
-2n1eff
-ne1fl
-ne1fr
-n1eg.
-1nega
-nege4n3
-n1egg
-ne1g2l
-ne1go
-1negr
-1neh
-n3eier
-n3eige
-n1eii
-n1eik
-n1eil
-n1ei2n
-2neis
-1nek
-ne1ka
-ne1kl
-nek1s2
-ne1ku
-ne2la
-nel3aa
-nel1d
-n3e4leg
-ne4lek
-ne4l3el
-4n3e4lem
-ne1lo
-1nem
-2n1emb
-4n3e4mig
-2n1emp
-1nen
-n4en.
-nen1a
-nen3ei
-ne2ni
-n3enig.
-n3enige
-n3enighe
-nen1k
-nen1o2
-n1enq
-nensi4
-nen3slo
-nen3slu
-nen3sp
-nen3st
-1neo
-ne4ona
-neo1p2
-ne4ore
-ne4p3ag
-nep1s
-1ner
-ne1ra
-ne4rac
-n3erfe
-4nergiem
-ne4r3id
-ne3rol
-ne3ros
-n3erts
-ne1ry
-1nes
-ne1sa
-ne3s4ka
-ne1sl
-ne1so
-ne1sp
-nes4sa
-nes4st
-ne3sta
-nes4tei
-nes3ten
-ne3str
-nestudi3
-1net.
-net3ac
-net3am
-ne4tec
-4n3e4tenl
-netes3
-ne4tet
-net3ha
-1neti
-ne4tin
-ne1tj
-net3on
-ne3top
-net3ov
-1netr
-net3spa
-1nett
-2netu
-1netw
-ne3um.
-neu3ra
-neu3ro
-neu4t3jes
-ne4val
-ne4zel
-1ne
-1ne-
-n1f
-nfra4m
-n2gac
-n2g1a2d
-n2g1af
-n2g1ak
-ng3ala
-nga3sl
-ng1d
-nge4ant
-ng3eig
-nge3las
-nge4n3ar
-ngen3st
-ngeper4s3
-nge4ras
-n2g1ij
-n4gind
-n4g3inf
-ng3ink
-n4g3inr
-ng3ins
-n4g3inz
-ng3lad
-ng3lan
-ng3lee
-n3gleu
-n1glu
-n1g2oc
-n2g1of
-ng1om
-ng1on
-ng1op
-ng1ov
-n1go'
-ng3rac
-ng3rad
-ng3rai
-n3gred
-ng3rie
-ng3rin
-ng4s3eco
-ng4sen
-ngs3lop
-ngs3lu
-ngs3ne
-ngs3po
-ngs3tak
-ngs3tek
-ngs3tem
-2n1h
-nhaat3
-nhap1
-1ni.
-1nia
-ni1ak
-1nic
-1nid
-1niek
-nie3kw
-nie1n
-1nier
-nier3o
-niet3st
-ni2ga
-ni4g3ee
-3niger
-3night
-1nigt
-1nij.
-1nije
-nij1f
-nij4pr
-4nijs.
-3nijve
-2n1ijz
-ni1kl
-ni3ko
-1niks
-nik4s3te
-1nil
-1nimf
-n1imp
-1nin
-n1inb
-2n1ind
-2n1inf
-4n3ingan
-ning3r
-2n1inh
-n1inj
-4n3inko
-n1inl
-2n1inr
-2n1ins
-2n1int
-2n1inv
-1nio
-ni1ok
-ni1ol
-ni4one
-ni1or
-ni2p1l
-nip1s
-1niq
-1nir
-nir1s
-3nis
-ni4s3ec
-ni4sei
-ni4s3el
-ni3she
-ni2s1i
-ni2sl
-nis1n
-nis1p
-nis4taa
-1nite
-ni1th
-5nitieerde
-nit1j
-ni1to
-ni1tr
-nits2
-1niu
-1niz
-ni2
-1ni
-n1j2
-nje3tj
-2nk
-n1ka
-n4k3aan
-n4keen
-n2k1em
-nking4
-nk3inh
-n1kle
-nk3lij
-nk1lu
-nk3nab
-n1kni
-n1kno
-nk2nu
-nk3o4ge
-nk3rel
-nk3ren
-n1kru
-nk1s2c
-nksce4
-nk1sl
-nk1sn
-nks3om
-nk1sp
-nk1s2t
-nk3tan
-nk1to
-nk4tre
-nk4t3ro
-nkt1s
-n1ku
-nk3uit
-n1l
-nlaat4j
-2n1m
-nmes1
-n1n
-nna1s
-nn2e
-nnee3t
-nnepo4
-nne4p3ol
-nno1v
-1no.
-no1a
-1noci
-1no1d
-2noef
-noek3s
-noen3s
-noep3s
-noes3t
-noet3j
-no1fo
-no4gal
-n1o2gi
-1nogr
-1noi
-no1ka
-no1kr
-no1kw
-no1la
-no4lie
-1n2olo
-n1om.
-1noma
-1nome
-n1omg
-1nomi
-n1omk
-n1oml
-n1omr
-n1om1s
-n1omv
-n1omw
-n1omz
-1non.
-1nonb
-1nonc
-2n1ond
-n1ont
-1nood1
-n1oog
-1noot
-1n2o1pa
-n1opg
-n1oph
-n1opm
-n1opn
-n1op1r
-n4opte
-n1opv
-2n1opz
-1nora
-n1org
-1norm
-4norre
-1nors
-nor1t
-1nos
-no1sa
-no1sf
-no1sh
-nosi2
-no1sn
-no1sp
-1not
-no1ta
-no4teb
-no1th
-1nou.
-n1oud
-1nova
-3novee
-n3overs
-1nox
-1n2oz
-1no
-1no
-1no'
-1no-
-2n1p2
-npoort3j
-n4puts
-n1q
-2n1r
-nrif1
-nri1o
-nroes3
-2ns
-ns1aa
-n1sab
-ns1ad
-n1sag
-ns1ak
-n1sal
-n1sam
-ns3ang
-n1sap
-ns1av
-nsbes4
-n1sc
-ns4cal
-nscenari3
-n2s1co
-n2scu
-n2s1ef
-ns2ei
-n4s3eil
-n4s3eis
-ns3emp
-nse4ne
-ns4ham
-ns3he
-ns1hi
-n1si
-ns3ink
-nsi4tes
-ns1ja
-ns4kri
-n3slaa
-ns3laag
-ns3lap.
-ns3lapp
-n3slee
-n3slep
-ns3let
-n3slim
-n3slip
-n3sloe
-n3slop
-ns3lot.
-ns4mak
-n3s4med
-n3s4mel
-ns1na
-n1sne
-n3snoe
-n1soe
-ns1of
-n1sol
-n3som.
-ns3ong
-ns3onw
-ns3onz
-ns4opp
-ns3ork
-n1sou
-nsour4
-n3span
-n3spec
-n3spel
-ns3ple
-n3s4poe
-n3sprak
-nsregi3o
-nss2
-n1sta
-nst3aang
-nst3aans
-nst3ac
-nst3afd
-n1ste
-n4stec
-n4s3teel
-n4st3ei
-n4s3teko
-n4s3teks
-n4s3tes
-n4st3e4v
-n1s2ti
-nst3ing
-n3stom
-nst3opl
-n3stor
-n3sto3v
-n1str
-ns3troe
-nst3roos
-n1stu
-nstudi3o
-nst3uit
-n2sty
-n1su
-ns3uil
-n4suit
-n1sy
-2nt
-n1ta
-n4taanv
-n4t3aard
-ntaar3t
-n2t1a2d
-nta4ke.
-n4tamb
-nt3ana
-n1te
-nt3een
-nt3eig
-nte3la
-nte4nen
-nten3s4
-nte3rad
-nter3ap
-nt3erf.
-nt3erfd
-nt3erft
-nte3so
-nte3sp
-ntes3tat
-nte3sti
-nte3str
-nt3han
-n3t4her
-n3thol
-ntie3s
-n4tind
-n4t3ins
-n1to
-n4t3o4li
-ntoor3
-n4t3opl
-n1tr
-nt3raf
-n4t3rij
-n4t3rol.
-nt3room
-nt3rui
-nts1a
-nt1sl
-nt4sle
-nt3soo
-nts3pre
-nt3ste
-nt3s4ti
-n1tu
-n4t3uit
-ntu2n
-ntune4
-nt4win
-n3t4wis
-n1ty
-1nu.
-1nu1a
-1nub
-1nuc
-1nue
-nu1ee
-nu1en
-nu1er
-nu3et.
-nu3ett
-nu1fa
-1nug
-2n1uil
-1nuk
-nu1ka
-1nul
-1num
-1nunc
-n1uni
-1nuri
-nu1ro
-nur4se.
-1nus1
-nu4ter
-nu1tr
-nuts3t
-1nuw
-nuw1a
-nu2w1i
-1nu'
-n1v
-nve3lo
-nve2r1
-2n1w
-nwa2v
-nwer4kr
-nwes1
-nx1a
-n1xe
-nx1o
-1ny
-2n1ya
-2n1y2i
-2n1yo
-n1z
-nzet3j
-nzet3s
-1n
-1n
-n1
-n1-
-o1aa
-oad1s
-o1af
-o1ag
-o1a2k
-o1a2m
-o1an
-oap1
-o1app
-oa2r
-o1ass
-o1au
-o1av
-o1ax
-o1a2z
-obal4t
-1obj
-ob3oor
-obo2r
-ob3ore
-1occ
-1o2cea
-o1cha
-o1che
-o1chi
-o1chl
-o1cho
-o1chr
-o1chu
-oci1a
-3ocides
-o1co
-oct2
-od1ac
-od1ad
-od1ar
-o3de.
-odel3s
-ode4m3ar
-ode4mat
-ode4mon
-ode1o
-ode3ra
-ode1s2
-2odi1a
-odie3t
-2odir
-od3ong
-od3ons
-od3op.
-od3ord
-2odr
-od1re
-od1ri
-od1s2c
-od1s2i
-ods3lam
-od3sli
-od3slo
-od3spo
-ods2t
-od3s4ta
-ods3te.
-od3sti
-od3str
-od1ui
-od1w
-2ody
-o2e
-oe1a
-oe4d3aa
-oe4d3a4d
-oe4d3ar
-oede3s
-oedo2
-oe4d3og
-oe4d3on
-oe4dop
-oe4dov
-oe2d1u
-oe2d3w
-oe2fa
-oe4fin
-oef3la
-oef3le
-oe3flu
-oe2f1o
-oef1r
-oe2f1u
-oege3l
-oe4gij
-oeg1l
-oei1s2
-oek3ac
-oek3ar
-oe4k3erk
-oe4kil
-oe2k1l
-oe4k3op
-oek3ra
-oek3re
-oek3ri
-oek3we
-oe3lak
-oe3las
-oel1d
-oel3ein
-oe3lon
-oe3lop
-oel3ov
-oel3sp
-oe4m3ac
-oe2m1o2
-oem1s
-oen3ac
-oe3nee
-oen3el
-oe1ni
-oe4nink
-oen3sl
-oen3spar
-oen3sto
-oen1t
-2oep
-oe4p3ac
-oep3ind
-oe2pl
-oep3lu
-oe2p1r
-oep4s3e
-oe2p1u
-oer3aa
-oe3rak
-oer3a4l
-oe3ras
-oer3ei.
-oe4r3el
-oe3re4n
-oer1k
-oero2
-oer3og
-oer3om
-oer4so
-oer4spi
-oer4s3te.
-oer3str
-oer4su
-oer4th
-oe1ru
-oes1a
-oe1sl
-oe4s3li
-oe1sn
-oe1sp
-oes4tal
-oe3taa
-oet3ac
-oete3s
-oet1h
-oe4tij
-oet1o2
-oets3l
-oet3sta
-oet3sten
-oe4t3ui
-2oez
-2ofa
-of1am
-o1fan
-o1fas
-of1a2t
-of1au
-of1a2v
-ofd1a
-of4da4g
-of4dan
-ofde2
-of4d3ei
-of4d3el
-ofd3on
-ofd3oo
-ofd3re
-ofd3ri
-ofd3ro
-of2d1u
-ofd1w
-3offens
-of1l
-o1foe
-of1om
-of1ox
-of1ri
-of1ro
-ofs1i
-of1s2m
-of1sn
-ofs3pl
-of3ste
-of3sto
-ofs3tra
-of4tij
-of1tu
-of1ui
-og1af
-og3al.
-og1ap
-og1au
-og1dr
-og3ede
-oge4l3ei
-oger3o
-oge4s3t
-ogie1
-1ogig
-og1la
-og1le
-og1lu
-og1ov
-o1gr
-o4g3red
-og3se
-og4ser
-og3stan
-ogst3ap
-og1ui
-o1h
-oi1a
-oi1e
-oien1
-oi1k
-oi1l
-oi1o
-oi1p
-oi1sc
-oi1sp
-ois2t2
-oi3ste
-oi1su
-oi1t
-o1j
-oj1k
-okaal3
-o4k3aas
-o2k1ac
-ok3ank
-ok1au
-o2k1a2z
-o2k1ef
-ok1ei
-o2kes
-o3kie
-ok1j
-ok1lo
-ok1lu
-ok1n
-ok1on
-ok3op.
-o2k1ou
-ok1ri
-ok1ro
-ok1s2a
-ok1sc
-oksi2
-ok1sl
-ok1sn
-ok1so
-ok3spe
-ok3spi
-oks3po
-oks2t
-ok4s3te.
-ok3sti
-ok3sto
-ok1ta
-okter4s
-ok1to
-oku2
-ok1ur
-ok1uu
-ok1we
-ok1wi
-o1la.
-olaat4
-ol1ac
-ola2g
-ol1a2p
-ol3arm
-ola3s4m
-ola3tr
-ol1au
-2ol1d
-old2w
-o1le
-o2l1ei
-ol3eks
-olen3s
-ol2er
-ole3ro
-oleu2
-ole3um
-olf1l
-ol4g3ri
-ol2gu
-o1li
-olie3s
-o3lig
-oli1k
-o3lit
-ol4k3ac
-ol1kl
-ol1kw
-olmana4
-o1lo
-olo1f2
-5ologiseerden
-olok2
-ol3op.
-olo3s4t
-ol1pa
-ol1pi
-ol1po
-ol1sc
-ols1h
-ol1sj
-ol1sl
-ols4n
-ol1sp
-ols2t
-o1lu
-ol3uit
-1olus
-o1l
-omaat3
-om3act
-om1af
-oma2g
-om1au
-om1av
-2ome
-o2m1ef
-omen4s3
-omer3sp
-om3eti
-omie1
-o4m3ins
-ommana4
-omme3s
-omo1s2
-omo1v
-om4p3ei
-om3soe
-om3soo
-om3sto
-om1ui
-1omze
-2ona.
-on3aar
-on1a2b
-on1ac
-o2naf
-o1nal
-on3all
-on3ame
-on1ap
-o1nas
-o1nat
-ona3th
-on3att
-2o1naz
-on1c
-ond3ac
-3onderz
-ond3ete
-on4dex
-on4d3ij
-ond3om.
-ond3op
-ond3re
-ond3ro
-ond3sj
-o1ne
-o2n1e2c
-one2d
-on3ede
-on3eet
-on1ef
-o2n1ei
-one3la
-on3erv
-on3est
-on1e2v
-o2nex
-4ong.
-ong3aan
-on3gla
-ong3li
-on4g3oe
-on1gr
-ong3sp
-ong3st
-o1ni
-on1i2d
-onie3t
-onig1
-on4k3ac
-on4k3ap
-on1kn
-on1kr
-on1kw
-onne3s
-o1no
-on1oe
-on3off
-2onom
-on3opl
-on3opt
-on2or
-on3ord
-on3ort
-on1ou
-o2n1ov
-on3se
-on4sem
-on2sj
-on3sla
-ons3le
-on3sor
-on3spo
-on3spr
-on1st
-on4t3aar
-1ontd
-on4t3erv
-1ont1h
-on4t3id
-onto3v
-ont3rade
-on4t3rem
-ont3rie
-on4t3rom
-on4t3ru
-ont1s2
-1ontw
-o1nu
-on1ui
-on1u2r
-1onvr
-o2o
-oo3c
-oo2d
-ood1a
-ood1e2
-ood1i
-ood3ox
-ood1r
-ood3sl
-2oof
-oo3fi
-oof4str
-oo2g
-oog1a
-ooge2
-oog3ee
-oog3en
-oog1l
-oog1o
-oog1r
-oog3s4p
-oog3ste
-4ooi
-ook1a
-oo2ki
-oo2k1o2
-ook1r
-ook1s2
-ook1w
-ool1
-oola2
-oo4lij
-oolo2
-oo2m1a
-oome2
-oo2m1i
-oo2m1o
-oom1p
-2oon
-oon1a2
-oon1d
-oon1g
-oon1k
-oo2n1o
-oon3sp
-oon1t
-oop1
-oopa2
-oo4pee
-oo2pl
-oopo2
-oo2r
-oor1a2
-oor4don
-oor1e2
-oor1i
-oor1o
-oor3sma
-oor3st
-oor3to
-oor3tr
-oo2se
-oo2si
-oos1p
-oost3o
-oot1a
-oot3es
-oot1h
-oo2t1i
-oo2t1o
-oot1r
-oo2tu
-op3ach
-op3act
-op1ad
-op1af
-op3akk
-op1a2m
-op1an
-op3arc
-op3at.
-op3atl
-op3att
-o1pea
-o1pee
-op3een
-op3eet
-o1pek
-o1pel
-o4p3elp
-3o4peni
-3opera
-o3perd
-o3pere
-o1pe2t
-op3ete
-o1peu
-op1e2v
-o1pi
-o2p1id
-opie3t
-op3in.
-o4pind
-op3ins
-op1j
-op1l
-op4las
-opoe1
-op1of
-o1pog
-o1poi
-op3ond
-op3ont
-op3oor
-op3opl
-op3ord
-op3o4re
-op3ork
-op1ov
-op3reg
-op3rie
-o3prij
-op3roe
-op3rol
-op3roo
-op1ru
-op1s
-ops2c
-opsce4
-ops2t
-2opt.
-o1pu
-op1ui
-o2p1un
-o1q
-o1ra.
-or3aalo
-o1rab
-or3act
-oradi3o
-or1af
-o1rai
-o1rak
-o4r3alg
-o1ram
-or3ana
-o3rand
-or1ap
-or1as
-or1au
-or1av
-o1rax
-o1ra'
-or4ce.
-ord3aa
-or4denve
-ord3ond
-ord3oo
-ord3or
-or1dr
-ord1w
-o1re
-2ore1a
-2orec
-2oreg
-o2reh
-ore1k
-oren3o
-oren3t
-2orep
-ore3s4p
-o2re-
-orfiet3
-or1fl
-or1fr
-org1l
-or2gu
-o1ri
-o3ri.
-orie3t
-o4r3ind
-o4r3ink
-or3ins
-o4ril
-or1ka
-or1kl
-or1kn
-or1kw
-or4m3ei
-orno3s4
-or1oe
-o1rof
-or3o4li
-o3roll
-2orom
-or1on
-or4ona
-or1oo
-or1op
-or1or
-o1ros
-or1ou
-or1ov
-orp4sc
-orradi3o
-or3saa
-or3s2c
-or1si
-or1sl
-ors4maa
-or1sn
-or4son
-or1sp
-or3str
-ort3aan
-ort3ak
-ort3ass
-ort3een
-orte3na
-ort3ha
-ort3ond
-ort3oo
-ort3sp
-or1ui
-oru2m
-2o1ry
-os1aa
-os2af
-o1sau
-o1sc
-1o2sci
-os2cl
-o4scoopd
-os2cr
-o2scu
-o2s1ei
-ose2t1
-o2se-
-o1s2fe
-o1shi
-o1si
-osi1t
-os1j
-os1l
-osli2
-osmo1
-os1na
-o1s2o
-oso1p
-os1pa
-os3per
-o1spo
-os3pri
-ost3ac
-ost3age
-o3stat
-os1te
-os4tem
-o3s4tim
-os2tj
-ost3ri
-o3stru
-os3tur
-os3tuu
-o1sty
-os1ui
-o1sy
-5osyncrasie
-o1ta.
-ot3aar
-ot3ach
-ot1af
-o1tag
-ot3akk
-ot3akt
-o1tam
-o1tan
-otan3s
-o2t1a2p
-ota1s2
-ot3as.
-o1tat
-ot1av
-ot1ay
-o1te
-3otech.
-3otechb
-o2t1ei
-o2tej
-ote4lan
-ote4lu
-oten3s
-o3ter
-oter3s
-ot3eta
-ot1ha
-3otheco
-o1thi
-ot3hou
-ot1j
-otje3sp
-o1to
-ot3off
-ot2on
-otoot4
-ot3opm
-oto3po
-oto1s
-ot1ou
-oto3ve
-ot3rec
-ot3red
-ot3res
-ot3rij
-ot3rit
-ot3ron
-ot1ru
-ot1sc
-ot4sei
-ot1si
-ot3s4mo
-ot1sn
-ot1so
-ots3pa
-ot3spl
-ot3spo
-ot3spr
-ot3sta
-ots3tek
-ot3stel
-ot3s4ten
-ot2tw
-o1tu
-ot1ui
-o1ty
-2ou.
-ou1a1
-ou1c
-ou4dez
-ou1e
-ou1k
-ou1lo
-ou1po
-ou1ra
-ou4r3env
-our1k
-our1o
-our1t
-ourw2
-ou1sa
-ou2s1c
-ou4set
-ou2sp
-ous1t2
-out1h
-out1j
-ou2t1o
-out1r
-out3sp
-out3sta
-out3ste
-o2veg
-oven3t
-ove4rat
-3overg
-ovide3o
-o1vo
-2ovs
-o1wa
-o1we
-owes1
-o1wi
-ow1r
-ow1s
-ow4set
-oy1eu
-o1yo
-oys2t
-o1z
-o1
-o2ma
-o1
-o1
-o1
-o2'
-o1-
-1pa.
-1paal
-4p3aanv
-paar5du
-3paarf
-paar3t
-1paas
-1pab
-pa2ce
-pacht3s4
-2p1adv
-2p1afd
-2p1afs
-1pag
-pa4gen
-pa4gers
-2p1agg
-pa1gh
-pa1go
-pa1gr
-1pai
-1paj
-pak1a
-p3akko
-pa2kl
-1pal.
-pa1la
-2p1alb
-1pale
-pal1f
-palle4
-1palm
-pal4m3ac
-pal4mo
-pal4t3r
-pa1lu
-pa3nac
-pan3a4d
-pa4n3ame
-3pand.
-pan4ded
-pa1ne
-3panee
-3panel
-2pan1k
-pa1no
-pan3sp
-pant3j
-pa1pa
-1papi
-pa2p1l
-p1apn
-p1app
-pa1pr
-4par.
-1para
-par1d2
-1park
-par4kl
-1parl
-2p1arm
-pa1ro
-par3ta
-part3j
-3partn
-4parts
-pa3ru
-1pas1
-pa1sa
-pa1s2o
-pas4th
-pata2
-1pa3te
-pa4t3enta
-1pa1t2h
-1pa1tr
-pats3te.
-1paud
-2p1aut
-1pauz
-1pav
-pa2vl
-1pax
-1paz
-1pa'
-p1b
-pbe2a
-p1c
-p1d
-pdan4c
-pda4te.
-pda4tes
-pe1an
-1pech1
-peci3es
-p1e2co
-3pect.
-3pecten
-1ped
-peer1
-1pees1
-pe1f
-1peg
-pe1go
-1pei
-2p1eis
-pek3ac
-pe1kl
-pe4k3la
-pek1n
-pek1s
-pel3ac
-pel3ak
-pe3lar
-pel3do
-pe4l3el
-pe4l3e4t
-pe5l4i
-pel1k
-pel3sl
-pel3sn
-pel3so
-pel3sp
-2p1emm
-1pen.
-1pena
-pe3nad
-pe3nal
-pen3ang
-pe3nat
-pen3a4z
-5penbaard.
-3penbaart
-p3ency
-3pend.
-3penden
-pen3ei
-1penf
-1peng
-1penh
-pe1ni
-1pen1k
-pen1o
-1penp
-1penr
-pen4se.
-pen3sl
-pen3sm
-pen3sn
-pen3so
-pen3sp
-pen3st
-pen1t
-pen4tho
-1penv
-1penz
-1pep
-peper3s
-2p1epi
-pep1s
-1p2er.
-pe1ra
-pera3s4t
-pe4rau
-1perb
-1perc
-pe4r3eg
-1perg
-1perh
-1peri
-1perk
-per3of
-pe3ron
-1perp
-1p2ers
-1pert
-1perz
-1pes
-pes2c
-pes3ten
-pes4th
-pe1ta
-3peter
-pe1tj
-pe1to
-pe4t3ra
-pets3t
-1peuk
-pe1um
-1pez
-p1f
-p1g
-pge3la
-pge1n
-pge1r
-p1h
-1p2his
-1pia1
-pi1ad
-pi1as
-1pice
-2pidp
-3piek.
-3pieke
-pie4kla
-pier3s
-pies3p
-pies3t
-pi1eu
-1pig
-pi1go
-1pije
-pij1k
-pij4li
-1pijn
-1pijp
-pij4p3a
-pijp3l
-2pijz
-1pike
-pi4ke.
-pi4kes
-pi4kor
-pik1s
-pi1la
-pi4l3in
-1pi1lo
-pin3aar
-pi4nap
-pin1d
-3pinda
-1p2ing
-2p1inj
-1pink
-pin3kl
-pin4ko
-pink3r
-pi1no
-2pinr
-2pins
-pi1o
-1pip
-3piram
-1pis
-pi1sa
-pis1n
-pi1th
-pit1j
-pi1to
-pit1r
-pit3sten
-1piz
-p1ja
-pje2s1
-p1ji
-p1jo
-p1k
-pl2
-1pla
-p1la.
-plaats5te.
-2p1lad
-4p3lang
-2p1lap
-plas3t
-p2lat
-pla4te.
-plat3j
-plat3r
-1p2lec
-2p1lep
-1p2lex
-1plez
-p1lid
-pli3er
-2p1lig
-2plij
-pli1o
-1ploe
-p3lone
-4p3lood
-p3loon
-plo1r
-4p3luie
-p1m
-pmana4gem
-p1n
-3p4neum
-1po.
-1poc
-1po1d
-2poef
-1poes
-poes3t
-1poet
-1poez
-po1g
-1pogi
-po2k1i2
-pok1s
-1pol
-po1la
-po4lep
-polo3v
-pol4s3t
-1pom
-pome1
-2p1oml
-pom3pj
-2p1oms
-3ponds
-1pone
-1poni
-pon4se.
-pon4s3te.
-1pony
-4poog.
-1pool
-4poor.
-4poord
-pop3ar
-po3pe.
-pop1i
-po4pin
-po1po
-po2p1r
-1po1ra
-2p1org
-2pork
-po1ro
-3portef
-por3tje
-port3ov
-3portr
-port3ra
-port3s
-po1ru
-1pos
-po1sa
-po1sf
-2poss
-pos3taa
-post3re
-po1su
-potes3
-pot4ha
-po3the
-1poti
-1potl
-po2t1o
-pot1r
-pot1s
-1pou
-1pow
-1po
-1po'
-p1p
-ppe1k
-ppe4l3o
-ppel3sm
-ppie1
-p1q
-1pra.
-p3raad
-praat3
-p1rad
-3prakt
-2p1ram
-2p1rap
-pra1s2
-1pred
-4preeku
-1pref
-preid3s
-p3rem.
-p3remm
-3prent
-prent3j
-p3reso
-1pret
-pre4t3j
-1prev
-2p1ric
-4p3riek
-3pries
-priet3j
-prij4st
-1prik
-3princ
-4pring
-3prins
-1pri1o
-1pris
-1priu
-1prob
-1proc
-1prod
-4p3rode
-p3roed
-3proef
-proet3j
-3proev
-1prof
-1prog
-1proj
-2prok
-1prom
-4p3rood
-1prop
-pro3pa
-pro3pe
-1pros
-pro4sce
-pros3p
-pro4s3t
-3proto
-p1rou
-1pro1v
-pruit3j
-pru2t
-prut3o4
-pr2z
-1pr
-ps1aa
-p2sac
-ps1a2g
-ps3akk
-p2s1am
-ps1ar
-ps1as
-p3schr
-2pse
-ps3ern
-pses1
-ps3eth
-p2she
-ps1hi
-ps1i2d
-pside3
-p1sil
-ps3ink
-ps1j
-p2sk
-ps4lag
-ps4mee
-p2smi
-ps3neu
-p2s1of
-p1sol
-p1so
-p1spi
-ps3ple
-p4spog
-p3stat
-p3stee
-p3stem
-p3ster.
-ps3tes
-ps1th
-p3s4tic
-psto3v
-ps3trot
-p1sus
-p2sw
-1psyc
-p1t
-p2t1ad
-pt3akk
-p4t3alb
-ptea4se.
-pten1
-pte1p
-pter3o
-pte1s
-p2t1h
-pt1j
-p2tl
-p2t1ov
-pt1sc
-pt3ste
-p2tv
-1pub
-pu1ch
-pu1e
-pu1lo
-pul4st
-1pun
-punt3j
-pu1ra
-pur4t3j
-pus2h
-pu3she
-1put.
-put1h
-1put1j
-pu2t1o
-put1r
-puts3t
-p1v
-p1w
-1py
-py1l
-p1z
-pzet1
-1p
-1p
-1p
-p1-3
-qu2
-4quits
-2quiv
-4raalo
-raam1
-raan1
-4raanb
-4raang
-4raanl
-4raant
-raap1
-1raar
-4r3aard
-raat3j
-1rabi
-ra2b1l
-1raby
-r2ac.
-ra2ca
-ra4ceb
-ra4cek
-ra4cet
-1racl
-ra1da
-ra4dap
-1radb
-ra4dede
-3radend
-r1adm
-r1adr
-1rads
-rad3sp
-r1adv
-raf1a
-ra2fu
-1ragd
-rag1l
-ra1go
-ra1gr
-1rais
-ra1ka
-raket3
-ral3ee
-r1alf
-4r3a4lim
-r1alm
-ra1lo
-1ra1lu
-ra4mes
-r3a4meu
-3ramin
-ram4pa
-ramp3j
-ra3nat
-3rand3a
-ran4daa
-ran4dr
-rand3s
-ra1ne
-ran4ge.
-rang3o
-rang3r
-r3a4nij
-ra1no
-rans3p
-ran4s3t
-ran4su
-rant3j
-r3antw
-ra1o
-ra4pas
-rapo1
-3rappo
-rap3roe
-rap3sc
-rap3ste
-2r1arb
-r2are
-r3arit
-2r1arm
-ra1ro
-r1arr
-r1art
-1rasa
-1rasg
-1rask
-1ras1l
-ra1sn
-ra1so
-rast3ri
-ra1su
-ra1ta
-ra1th
-r1atl
-ra3tri
-rats3t
-1ratt
-3ravoe
-1ravr
-ra4zij
-ra2s
-1ra
-r1b2
-rbe2a
-rber3a
-rbe4raa
-r1c
-rce2a
-r4celi
-rces1
-rch3af
-rcu2s
-2rd
-rd3act
-rdags3
-rda2k
-rd3ake
-rda2m
-rd3ama
-rd1ap
-rd1ar
-rd3as.
-rd3ass
-r4deen
-r2d1ei
-rde3kl
-r4d3e4las
-rden3s
-rder3st
-r4d3erva
-rde3s4t
-rdi2e
-r4d3ijz
-rd3o4li
-r1don
-r4d3ont
-rd3opt
-rd3rea
-rd3res
-rd3rod
-rd3rol
-rd1sc
-rd1sj
-rd1sl
-rd1sn
-rd1so
-rd1sp
-rd3ste
-rd3sto
-rd3str
-rd1su
-r4duit.
-r2d1wo
-re1al
-re4all
-re3amb
-re1an
-reau1
-1recl
-1reda
-1redu
-reed3a
-ree4du
-reek3r
-2reen
-4r3eers
-ree3sh
-2reeu
-reewa4
-re1fa
-2reff
-1re1fl
-re1fr
-2reg.
-3regel
-rege4s3
-1regi
-1re1gl
-re4go.
-2reie
-2reil
-4reind
-1reis
-4reise
-1reiz
-3rekeni
-re4k3la
-rek3lu
-rek1n
-re3kra
-rek3re
-rek3spr
-rek4th
-re3kwi
-re1la
-re4l3ac
-rel4dec
-rel4di
-reld3o
-rel4d3r
-rel4duu
-re4l3ei
-4r3e4lem
-rel1k
-4r3ellenw
-re3log
-re3lon
-rel1s
-re4mai
-remie3tj
-remo3v
-1r2en.
-ren3aar
-re4n3a4g
-re3nal
-ren3an
-re4n3a4r
-4r3endert
-ren3ei
-ren3el
-ren3enk
-ren3erf
-4reng.
-4rengd
-4rengt
-2r1eni
-re3nie
-re4n3in
-1renn
-re3nomm
-2r1enq
-4r3entac
-ren3th
-4r3en3tw
-4r3envee
-re5ografie
-re1ol
-3repert
-re1ps
-re4rens
-2r1erf
-2r1erg
-re5rij
-re1ro
-2r1ert
-2r1erv
-2r1erw
-re4scrip
-re5script.
-re1si
-res3le
-re1so
-res1p
-res3ta
-res3te
-res3th
-re3stra
-re4sui
-re1ta
-re4tag
-re4tap
-re4tem
-re3tha
-re4tik
-re1tj
-2retn
-1re1to
-re4t3o4g
-rets2
-ret3sk
-reu4ko
-reuk3s
-re3um.
-reu4t3je.
-3revis
-1revo
-rewa2
-1rexa
-re1n
-r1fa
-rf1aa
-rf1al
-rf1do
-r4f3eng
-rf3lag
-r3flap
-rf3lee
-r3flen4
-r3fles
-r2f1li
-r1flo
-r1flu
-r1fo
-r2f1oo
-r2fop
-rf3ren
-r1fri
-r3from
-r3fron
-rfs2
-rf1sm
-rf1so
-rf1sp
-rfst3aa
-rf3ste
-rf3sti
-r2f1uu
-r2g1ab
-r2gac
-r2g1ah
-rga4me.
-rg1dr
-rge2a
-r2g1ei
-rgel3ac
-rges2
-rg3etap
-rgeto3
-r4g3ins
-r4g3inv
-rg3loo
-rg1lu
-r1go
-r2g1op
-rgo1v
-r1gr
-r4g3rit
-rg1sc
-rg1s2o
-rg3spo
-rg1st
-r1h
-rhoud4s
-ri1ab
-ri1ad
-ri1ak
-ria1p
-ri1ar
-ri1as
-ri2bl
-1ridd
-rid2g
-3ried.
-3riede
-riek3ap
-rie3kw
-rie4laa
-rie4lei
-rie4pac
-rie3so
-rie3spa
-rie3sta
-riet3s
-ri1eu
-ri1fl
-r4ig
-ri4g3aa
-ri1go
-ri2j
-rijk4s3ta
-4r3ijl.
-4r3ijld
-4r3ijlt
-1rijm
-rij3pl
-4rijsd
-rijs3l
-r4ik
-ri4ke.
-ri4kes
-rik1l
-rik1r
-ri1lo
-2r1inb
-2r1inf
-r4ing.
-4r3ingan
-ring3l
-2r1inh
-4rinit
-4r3inko
-4rinni
-ri1no
-2r1inr
-2rins
-r3inst
-rin3tj
-2r1inv
-ri1oc
-ri1oj
-ri1om
-ri1or
-ri1ot
-2rir
-ri3sco
-ri4sei
-ris1h
-ri3sot
-ris3pe
-ri1su
-rit1j
-1ritm
-ri1to
-ri4t3ov
-rit3sp
-rit3sten
-1ritt
-ri4ve.
-ri4ves
-r1j2
-2rk
-rkaat3
-rk3adr
-r1kal
-r1kap
-rk3art
-r1kav
-r4keen
-rker4sl
-rker3st
-r4k3eth
-r2k1id
-rk3iep
-rkind4s3t
-rk3inh
-r4k3ink
-rk1j
-r1kle
-r3klok
-rk3lus
-r1kni
-r1k2no
-r1knu
-r2kob
-rk3omg
-rko3pe
-rk3ops
-r4k3ord
-rk3os.
-r1kr
-rk3rame
-r4k3rel
-r4kres
-rk3roos
-rk1s
-rks2f
-rk4s3li
-rk2sm
-rks2t
-rkt3erk
-rkt3evo
-rkt1h
-rk4tre
-rk4tri
-r1ku
-r3kwas
-rk3wil
-r1l
-rlate4
-rle4g3r
-rlies3
-rlink4s3
-rlof1
-rlos1
-rlo1v
-rl1p
-rlui3t
-rmana4gem
-r4m3art
-rmer3s
-rmes1
-rmet3s
-r4m3ont
-r2m1ov
-rm1p
-rm1sa
-rm1sp
-rm3sto
-rmte1
-r1na
-r2naf
-rna1l
-rn3ars
-rn1do
-r1ne
-rne2n
-r4n3ene
-rnes1
-rne4t3j
-rne4t3r
-r2nex
-rn1g
-r1ni
-r2n1i2d
-rn1k
-r1no
-rn3oef
-rn3ong
-r4n3oor
-rn1op
-rn1s2
-rn1t
-r1nu
-ro1ac
-ro1ar
-1rock
-ro1da
-ro1d2o
-ro1dr
-1roe.
-2roeg
-roe4g3r
-1roem
-roens4
-roen3sm
-roep3l
-roe4rei
-roer3s
-roes3te
-ro3faa
-r3offi
-ro1fo
-rof1s
-rog1s
-ro2gu
-1roi
-ro1ka
-ro1kl
-1rokm
-ro1kr
-1rola
-1rolb
-1rold
-role3s
-1rol1g
-1rolh
-4roli
-1rolv
-1rolw
-r2oma
-r1omk
-2romm
-rom3sp
-r4on.
-ron3a4d
-r4onal
-ro3nau
-ron4da
-ron4dom
-rond3oo
-ron4d3r
-rond3st
-ron4d3u
-r2one
-3rongeh
-r1onp
-r2ons
-3ronsp
-ron4s3te.
-ront3j
-ron4t3r
-roo2
-rood1
-roog1
-2roor
-root3ste
-rop4e
-ro3pe.
-r3opna
-r2o1po
-rops2
-r4opte
-ro2pu
-r1opz
-r1org
-ro1ro
-ro3san
-ros2c
-ro1sf
-ro3sho
-1rosk
-ro1sn
-ro3spi
-ro3stel
-ro1ta
-ro3te
-ro1th
-ro1tr
-rots3te.
-rot3str
-1rotz
-r1oud
-1roul
-1r2out
-1roy
-roy3aals
-ro3y4eert
-ro3yer
-1ro
-1ro
-r1pa
-rp3aan
-rp3ank
-rpats3t
-r1pe
-rpe3lo
-rpe4ra
-r1pi
-rp1j
-r1pl
-rp3lans
-r1po
-rpoort3j
-r2p1ov
-r1pr
-r4p3rec
-rp3reg
-r1psa
-rp3sli
-rp3slo
-rp3sni
-rp3spe
-rp1s2t
-r1psy
-r1pu
-r1q
-r1r
-rregi3o'
-rre4l3u
-rre2n1
-rre1o
-rri3er
-rrie3s
-rro1v
-r1sab
-rs1a2d
-rsa2f
-rs1a2g
-rs1ak
-r1sal
-rs3amb
-rs3ana
-rs1ap
-rs1ar
-rsas1
-rs3asp
-r3sast
-rs1av
-r1sc
-rs4can
-r2sce
-r2sci
-r2scl
-rs4cre
-r2scu
-r4s3e4co
-r2s1e2d
-r2s1ef
-r4s3eis
-rsek2
-r4s3ell
-r4s3erva
-rseve5
-r4s3e4vo
-rs4fer
-rs3hin
-rshy2
-r1sim
-rs3int
-r1sir
-r3sjac
-r2s1je
-rs4kat
-r3s4kie
-r1sla
-r4slas
-r3slec
-rs3led
-r3sleu
-rs4liep
-r3slim
-r3sling
-rs3lob
-rs3loep
-rs3log
-r4s3loo
-r3slot
-rsmana4
-r3s4mee
-r3s4mel
-r3s4met
-r3s4mij
-r3s4moo
-r3sned
-r3snee
-rsnes3
-r3snij
-r3snoe
-r1sob
-r1soe
-rs1of
-rs1og
-r1sol
-r3somb
-r1son
-r4sond
-rs3ong
-r1soo
-rs3ord
-r1sou
-rs3paar
-r3span
-rs3part
-r3spat
-r1spe
-rs4pene
-rs4per.
-rs4pert
-r4s3pet
-r1spi
-r3spoe
-r3spon
-r3spoo
-r3spor
-rs3pot
-r3spraa
-rsregi3o
-r3sta.
-rs3taak
-rst3aang
-rst3ac
-r4s3tale
-r4stali
-r3stan
-r4s3tas
-r3stat
-r4stav
-r1ste
-r4sterm
-rste3s
-r4steva
-rs2ti
-r3stig
-r3stin
-r1sto
-rs4t3oc
-rst3ora
-rsto3v
-r3straa
-r3stral
-rst3red
-r3stree
-r3strek
-r3strep
-r3strij
-r3strom
-r1stu
-r4stun
-r1su
-r1sy
-2rt
-r1ta.
-r3taal3
-rt3aand
-r3taar
-r1tab
-r4t1a2c
-rt1ad
-rt3af.
-rt3afd
-r1tag
-r1tal
-r1tan
-rt3a4pe
-rt3a4re
-rt3art
-r3tast
-r3tati
-rt3att
-rt1au
-r2t1av
-r1te
-rteer3
-rt3eig
-rte4lei
-rte3no
-rte3ro
-rte3str
-r2t1e2v
-rt3han
-rt3har
-r3ther
-rt3hie
-rt3his
-rt3hou
-rties3
-r4tink
-r2tja
-rt3jesc
-rt3jesv
-r2tl
-r1toe
-rt3off
-r3tofo
-r1tol
-rt3om.
-rt3opb
-rt3ope
-rt3opl
-rt3ord
-r4t3org
-r3tori
-r1tot
-r1tou
-r3trac
-rt3ras
-rt3rec
-r3trek
-rt3res
-rt3rie
-rt3rij
-rt3rog
-rt3rus
-rt3sal
-rt1sc
-rts3li
-rts3oo
-rt3ste
-rts3th
-rt3sti
-rt3stoet
-rt3str
-r1tu
-r4t3ui4t
-r2tv
-r1ty
-ru1a
-1rubr
-rude3r
-ru1e
-2ruf
-rug1d
-ru2ge
-rug1r
-ruik4sp
-3ruimt
-ru2ka
-ru2k1i
-ru2k1l
-ruk1s
-ru4l3ij
-rum1a
-5rummanagem
-rune2
-runet3
-1rung
-2r1uni
-r2up
-ru2p1l
-1rups
-ru1ra
-ru2s1e
-ru1ta
-rut1j
-ruts3te.
-rut3sten
-2ruu
-ruw1a
-ru4wij
-1ruz
-r1v
-rval4s3t
-rver3a
-rver4s3te.
-rve3sp
-rvi2c
-rvide3
-r1w
-rwee2
-rwen4s3t
-rwer4k3r
-rw2t1j
-r1x
-ry1le
-ry1s
-r1z
-rzet3j
-rzit1
-rzoet3s
-r1
-r1
-r1-
-1sa.
-1saag
-1s2aai
-saaie4
-s1aan1
-s1aap
-s2aat
-s1ac
-sa2ca
-2sach
-1s2acr
-sa1do
-1sae
-s1af
-sa1fa
-1safe
-sa4fe.
-sa4fel
-sa4fes
-1safo
-s1agg
-1sagi
-sa4gio
-1sagn
-sa1go
-1sah
-1sai
-1sake
-sa1kr
-sa1la
-3salad
-s1alb
-1s2ald
-s1all
-s1aln
-sa1lo
-1salp
-1sa1lu
-1s2ame
-1samm
-sa3nat
-1sand
-sa1ne
-sa1no
-san3sk
-1sant
-sant3j
-1sap.
-2s1a2pe
-s1a2po
-sap3rij
-sa3pro
-1s2ar.
-s1arb
-s1arc
-1sard
-1s2ari
-sari3o
-s1arm
-saro2
-sa3ron
-s1arr
-s2ars
-s1art
-sar3th
-s1as.
-sa1s2c
-sa1sl
-s1ass
-1sat
-sa1ta
-sa4teli
-2s1atl
-sa1tr
-2s1att
-s1aud
-1s2aus
-s1aut
-1sauz
-3savou
-1sax
-sa3y4eerde
-sa3yer
-2s1b
-2scab
-2scad
-2scaf
-2scam
-2scap
-sca4pe
-2scar
-2scat
-2sced
-2scel
-3s4cena
-2scer
-4schao
-1sche
-4schef
-4schemi
-4scheq
-1schi
-3schol
-3schoo
-3schot
-1schu
-2scij
-2scir
-s2ci
-4sco.
-2scod
-s4cola
-4scoll
-2scom
-2sco2n
-1scoo
-4scoopga
-4scoopro
-3scope
-sco4pe.
-sco4pes
-3scopi
-3score
-4scorp
-4scorr
-2scos
-2sco
-4scrim
-4scris
-2scy
-1sc
-2s1d
-s3de
-s2dh
-sdi1a
-sdi1o
-1se
-se1an
-sear2
-se2at
-4seball.
-4seballd
-2s1ech
-2secz
-2s1edu
-4s3eenh
-see2r
-seer3i
-see3t
-2seev
-se1fa
-2s1eig
-seis4t
-se1kl
-se1kr
-sek4s3t
-se1kw
-sel3ac
-se4l3a4g
-sel3ak
-sel1d
-4s3e4lek
-se4l3el
-4s3e4lem
-se4lim
-4selix
-sel1k
-sel1o2
-sel1s
-se2l1u
-se4m3aa
-se4m3ac
-s1emm
-se4m3on
-se4m3oo
-se4n3a4g
-se3nan
-se3nat
-se3nel
-sen3e4t
-se1ni
-se4nin
-sen1k
-se2n1o2
-2s1enq
-sen1s
-sen3tj
-sen3tw
-senu2
-se1o
-se3rab
-ser2e
-se3ren
-4s3ergo
-2sern
-serna4
-se1ro
-ser4sp
-ser3st
-ser4tw
-se1ru
-se1sa2
-2s1e2sc
-se1s2f
-2se1sh
-2s1esk
-se1sl
-se1sp
-se3tan
-se4ter
-2s1e2ti
-setmana4
-set1s
-se1u2m1
-4s3even
-2s1ex
-2s1e2z
-2se-d
-s1f
-2sfa
-3s4feer
-2sfr
-2s1g
-sgeper4
-sgepers3
-sge1r
-sges2
-s1ha
-1s2ha.
-3s4hamp
-sha4ve.
-s1he
-sheids3
-1s2hes
-1shew
-s1hie
-s1him
-s1his
-sh1l
-2s1hoe
-s1hof
-s1hog
-s1hok
-s1hol
-2s1hon
-s1hoo
-sho4re.
-s1hos
-2s1hou
-s1hov
-1show
-s1hu
-s1hy
-1si.
-1si1a
-1sib
-1sic
-si2ch
-si4dec
-1s2ie
-sie3fa
-sie3kl
-sie1s4
-sie3ta
-sie3tj
-si1eu
-1si1f
-1s2ig
-sig1s
-s1ijv
-s1ijz
-1sile
-si1lo
-si4mag
-s1imm
-sim1p2
-1simu
-1sina
-s1inb
-2s1inc
-2s1ind
-2s1inf
-1sing
-4s3inga
-4s3ingeni
-sin3gl
-sin3gr
-sing4s3
-s1inh
-s1i2ni
-s1inj
-s3inko
-s1inm
-s2in2n
-sinno4
-sinnova4
-si1no
-2s1inr
-s1ins
-sin3tj
-2s1inv
-s1inz
-1sio
-si1og
-4s3i4ont
-si1or
-1siro
-s1irr
-1sis
-sis3an
-sise2
-si4s3ee
-si4sei
-si4s3el
-si2s1i
-sis1p
-3sit
-si4tem
-si1to
-sito3v
-situ1
-1siu
-1siv
-1siz
-1si
-1s2ja.
-s1jaa
-1sjab
-1s2jah
-s2jal
-s1jar
-sj2e
-s1je.
-s2jee
-1sjei
-3s2jer1
-s1jes
-1sjew
-1sjez
-s2ji
-2sj1k
-sj1n
-1sjof
-1s2jok
-s1jon
-1s2jor
-3sjouw
-sj1s2
-sj1t
-sj2w
-s1k
-2sk.
-2ska1d
-sk2c
-skee3t
-s4kele
-1s2ki.
-skie1
-skies4
-ski3sc
-1ski
-1ski'
-s2k1j
-2sko
-sk1t
-sl4a
-1sla.
-3slaan
-3slaap
-s3laar
-s3labe
-s1lad
-1slag
-slag3r
-1slal
-sla4me
-s3lamp.
-s3lampe
-4s3land
-3slang
-3slape
-s1las
-2s1lat
-sla3tj
-1slav
-2slaw
-s3leden
-3slee.
-s3leef
-3sleep
-4s3leer
-slee3tj
-s1leg
-2s1lei
-s1lek
-slen4s3
-3slent
-s1ler
-s1les
-sle4t3j
-s3leug
-3sleur
-s3leus
-4s1lev
-sleve3
-s1lez
-s1li.
-1slib
-4slibe
-s1lic
-4s1lid
-s3lied
-s3lief
-s3liev
-s1lif
-s1lig
-s3lijd
-3slijp
-4slijs
-1sli2k1
-slim3a
-s3lini
-slip1
-s1lit
-slo2b1
-s1loc
-1slof
-s1lol
-s3lood
-s3loon
-s3loos
-3sloot
-1s2lor
-s1los
-slo4t3o
-s1lou
-slo1v
-s1luc
-4slui.
-3sluip
-3sluis
-3sluit
-3sluiz
-s1lus
-s1luw
-3smaad
-1s2mad
-3s4mak.
-3s4mal.
-3s4mald
-3s4mall
-3s4malt
-s4meed
-3s4meri
-s2meu
-3smid.
-smies3
-1s2mok
-3smolt
-3s4more
-3smuilt
-s2mul
-sn2
-s1nac
-s1nam
-1snap
-snap3s
-1s2nar
-s1nec
-snee3t
-s1neg
-1snel
-s2ner
-s1net
-s3neus
-s1nie
-s1nim
-1snip
-1snit
-2s1niv
-s1nog
-s1nom
-sno1v
-s1nut
-1so.
-1s2oa
-so1a'
-so2bl
-1so1c
-2s1o2ce
-1so1d
-s1oef
-1soep
-soep3s
-soes1
-1soez
-s1off
-1sofo
-1soga
-s1o2ge
-so1gl
-1sogy
-1soi
-1sok
-so1la
-1sold
-5soleerde.
-sol1s
-s1omg
-s1omk
-s1oml
-1s2omm
-s1omr
-s1oms
-s1omv
-s1omw
-s1omz
-1s2on.
-so1na
-s3onaf
-s1onb
-s1ond
-1sonn
-1sono
-2s1on2t1
-2s1onv
-soo2
-s1oog
-s1ook
-s3oor.
-s3oord
-s3oorl
-3soort
-s3oorz
-1soos
-s1op
-1s2op.
-2sope
-so1po
-3s4o3pra
-1sor.
-1sora
-so3raa
-so3ral
-so3rat
-1sorb
-1sorc
-s1or1g
-1sorm
-1sorn
-1soro
-1sorp
-1sors
-1sort
-1sorw
-so1sf
-s2ot
-1so1tr
-s1oud
-sou1t4
-s1ov
-1so'
-2sp.
-3spaak
-s1pad
-s1pak
-s1pam
-2s1pap
-3spar.
-4spara
-s3parc
-2spas
-s1pau
-1spe.
-1spea
-3s4peci
-1spee
-4spees
-speet3
-2spei
-1spek
-spe3lot
-s1pen
-4spen.
-4spenn
-4spens
-s3pera
-4speri
-4spers
-1spie
-spie3tj
-3spijk
-4spijn
-spi4nac
-spi4nak
-1spio
-3spiri
-2spis
-2spla
-spleet3
-s3plei
-spli2
-3s4plit
-s1plo
-s1plu
-1spoi
-1spok
-s4pon.
-3s4ponse
-spon4s3t
-s1pop
-3s4pore
-s4pori
-3spraak
-3sprak.
-3sprake
-3spray
-3spreeku
-3sprei
-4s3prem
-s3pres
-3spreu
-4spriem
-4s3prij
-3spring
-4sprod
-3sproei
-4sprog
-3sprok
-3s4pron
-3sproo
-s1ps
-2spt
-1s2pui
-spuit3j
-1spul
-1spur
-1spuw
-s1q
-s2qua
-2s1r
-2s1s
-ss2ac
-ss2af
-ssa1g
-ssa1s
-ss2ca
-sscenari3
-s2scl
-s2s2co
-ssei1
-sse3naa
-ss2i
-ssi4te
-ss2j
-s2sk
-sso1t
-ss2t
-s2sw
-4st.
-3staaf
-4staang
-4st3aanv
-4st3aanw
-staart3j
-st3abo
-2stac
-st3acht
-1s2tad
-4stafe
-sta4fo
-4stakk
-st3akt
-sta4lo
-s4talt
-s4tamp
-st3ana
-3standi
-s3tank
-3stape
-3star.
-4stari
-3statieri
-2s1tau
-s2tav
-1stay
-2stb
-2stc
-2std
-4stea
-4stech
-s4teco
-1sted
-steda4
-4stedu
-4steenh
-2stef
-1stej
-4stekam
-3stekk
-4steladm
-ste4lee
-st3e4lem
-s4tem.
-s4temm
-4stemo
-4stempo
-4stenu
-ster3ap
-4stermi
-s4terple
-3sterren
-ster4spo
-1stew
-2s2t1ex
-s2t1e2z
-2sth
-s2t1ha
-st3hec
-st3hed
-st3hek
-s3them
-st1hi
-s2t1ho
-s2thu
-st1hy
-2stia
-2stib
-4sticu
-s2t1i2d
-4stie.
-s4tiefe
-4stiep
-4sties
-4stiev
-4stijd
-s4tijf
-3s4tijl
-4st3ijs
-s4tikt
-s4tild
-s4timu
-s4t3ind
-4st3ins
-4s3tint
-s2tip
-4stite
-st1j
-s2tl
-2stoc
-4stoej
-3stoel.
-3stoele
-4stoen
-4stoes
-3stoet.
-4stoez
-1s2tof
-st3o4ge
-1s2tok
-s3toli
-4stomz
-3stonet
-s3tong
-4st3ont
-3stoof
-st3oog
-4stoon
-3stoot
-4stope
-sto4pl
-4stor.
-4stora
-sto4rat
-4st3ord
-3storm
-4storr
-2stos
-sto3ven
-2stp
-3straf.
-s3trai
-st3rec
-4stref
-4streg
-4s3trei
-3strel
-st3riek
-st3rif
-3strik
-3strip
-s3troep
-s3trof
-3strofs
-4s3trog
-3strok
-st3rol.
-st3roll
-3strome
-4stroos
-st3roos.
-s3trou
-4strui.
-4struim
-2st1s2
-2stt2
-1stua
-1stud
-1stue
-stuit3j
-1stuk
-stu2n
-st3uni
-3stunt
-2s2tv
-2s2tw
-s4tylen
-1su.
-3su1a
-1sub
-su2b1a2
-su2b1e
-su2bo
-su2br
-su2bu
-1suc
-1sud
-1sue
-su1ee
-1sug
-1suik
-s1uit
-s4uit.
-suit3j
-4suitl
-1suk
-su1ka
-1sul
-1sum
-2s1un
-3sun.
-su1na
-1suo
-1sup
-2s1upd
-supda4
-su1ra
-s1urn
-1surp
-1surv
-su2s1e
-su1sh
-suur1
-1su
-susti4
-4s1v
-sve2r1
-sve3ri
-svete3
-svide3
-svoge4
-s1w
-1sy.
-2syc
-1syn
-sy1ne
-1sys
-2s1z
-1s
-1s
-2s1-
-taaie4
-1taam
-t3aando
-t3aanj
-t3aank
-4t3aanz
-2t1aap
-t1aas
-taat3j
-taats3t
-1taba
-t3a4bon
-ta4cad
-tac4to
-tac4t3u4
-ta4der
-2tadi
-2tadm
-ta1do
-t1adr
-tads3p
-1tae
-2taf.
-1tafa
-2tafd
-t3afde
-1tafe
-2t1afs
-4tafv
-t1afw
-t1afz
-ta4gent
-1ta1gl
-ta1go
-ta3gra
-1tah
-1tai
-ta1ka
-ta4kes.
-1takg
-3takken
-1tako
-1takp
-1tak1r
-1taks
-1tak-
-tal3ach
-ta3lact
-ta3lan
-ta3lat
-3tale.
-1talg
-3talig
-ta1lo
-ta1lu
-t3amba
-3tamen
-1tami
-t3ampu
-1tan.
-ta3nat
-tando4
-tan4dr
-tan4du
-ta1ne
-tan3gr
-1tani
-1tanj
-tan4ka
-tan4k3i
-tan4kn
-tan4ko
-tank3r
-t2ans
-tan4ste
-3tants
-1tanu
-1tao
-ta4pav
-ta4per
-1tapi
-tap3st
-1tapu
-2t1arb
-1tari
-2t1arm
-taro2
-tar3taa
-tart3o
-ta1sa
-ta1sc
-3tasj
-ta1sp
-ta3sta
-ta1ta
-3tate.
-3tateu
-ta1th
-4tatieri
-tat1j
-1ta1tr
-tat1s
-2t1aut
-t1avo
-1taw
-1tax
-tax3eer.
-tax3eert
-ta1
-1ta'
-1ta-
-2t1b
-tbaat3
-2t1c
-t2chy
-2t1d
-tdoe4l3
-tdo1v
-1tea
-te3akt
-tea2m
-te1an
-te3arc
-te3ari
-teau1
-1tec
-4t3echt
-t3e4dit
-t1e2du
-tee2k1
-tee2l
-teel3d
-tee2m1
-2tee2n
-t3eenhe
-1teer
-tee1t
-2t1eeu
-te1fa
-2t1eff
-tef3lo
-te1g
-2teig
-4t3eind
-2t1eiw
-te1ka
-3tekam
-3tekene
-3tekens
-2tekk
-te1kl
-te4k3om
-te1kr
-te3kwe
-tel3ac
-3teladm
-tel3ant
-tel3da
-3telec
-4t3e4lect
-tel3een
-3telef
-tel3ei.
-tel3eit
-3teler
-tele3s
-3telev
-tel1f
-tel1k
-tel3o4g
-te4l3oog
-tel3o4r
-te3lot
-tel3ov
-tel1s
-te4l3uu
-1temo
-te4mor
-3temper
-3tempo
-t2en
-te3nak
-3tenbu
-4t3endert
-ten3ed
-te3nee
-ten3ei
-ten3el
-4tenerg
-ten3e4v
-3tenfo
-te1ni
-4tenig
-3tenij
-ten3ijs
-ten1k
-1tenn
-te3nore
-ten3ov
-ten3sm
-ten3sp
-ten3sto
-tensu4
-ten4s3ur
-ten4s3uu
-4t3entac
-3tenten.
-3tento
-4t3entw
-1tenu
-1tenw
-1teo
-te1op
-ter3aak
-te3raal
-ter3af
-ter3ag
-ter3as
-te4r3e4d
-te4r3eik
-te4rel
-te4rem
-te4r3enk
-te4r3env
-4tereo
-te4r3eq
-4terf.
-4terfd
-4terft
-ter3gl
-te4r3ijz
-4teril
-te4r3in.
-1terj
-4terk.
-ter3ka
-ter3kl
-4terkt
-ter3kwe
-3term.
-3termi
-1tero
-ter3oc
-ter3of
-te3rog
-te3rol
-ter3ond
-te3ros
-3terrei
-4terren
-3terst
-ter3stru
-t3erts
-1ter-
-1tesa
-te3sap
-1tesg
-1tesh
-te1si
-1te2sk
-1tesl
-te3sli
-1teso
-te3son
-1tesp
-te3spi
-te3spo
-1tesr
-3test.
-te3stel
-tes3ten
-tes4tij
-test3on
-test3op
-tes4tr
-test3ri
-test3u
-1tesv
-1tesw
-1tesz
-te3tab
-4tete.
-te1th
-te1tj
-te1to
-teur3a
-2t1euv
-t3e4van
-4teven
-tever3
-1tevl
-1tevr
-2t1exe
-2texp
-2t1f
-2t1g
-tgea2
-tgeper4
-tgepers3
-tge1r
-2th.
-t1hak
-t1ham
-t1has
-3t2hea
-t1heb
-t3heer
-thee3s
-t1hef
-2t1hei
-1thek
-4t1hel
-t3hemd
-1then
-1theo
-3ther4a
-t3here
-3therm
-1thes
-1thet
-t1heu
-1the
-t1hl
-2thm
-t1hoe
-t1hok
-t1hoo
-t3houd
-t3hout
-t1hov
-t1hoz
-th1re
-2ths
-t1hu
-1t2hur
-1thus
-thuts3t
-1ti
-ti1a
-tia2m
-tia4re
-ti1d
-ti4deo
-tie1d
-tie3fa
-tie1g
-tie3ka
-tie3kn
-tie4kon
-tie3k4uu
-tie3lop
-tie1p
-4tierf
-tie3ro
-tier3st
-tier4u
-4tierv
-tie3sl
-tie3sp
-tie1t
-ti1eu
-ti1fa
-ti3fe
-2tift
-ti4g3aa
-2tigm
-ti2g1u2
-3tijd
-tij4k3er
-tijk3l
-4t3ijs.
-tij3st
-tij1t2
-t1ijz
-4tijze
-ti1kl
-ti1kr
-tik1s
-ti1la
-ti4laa
-ti1lo
-2tils
-ti4med.
-t1imp
-tin3as
-4t3incu
-4tindu
-2t1inf
-tin4g3i
-ting3r
-t3inko
-2t1inl
-ti1no
-t1inq
-2t1inr
-4t3insl
-4t3insp
-4t3inst
-tint3j
-2t1inv
-2t1inw
-ti1pr
-ti1sa
-tis2j
-ti3sje
-ti1s2l
-ti3spe
-ti3sta
-ti3s4to
-ti3s4tr
-3tite
-ti1th
-ti1to
-ti1tr
-2tiv.
-t1ja
-tje2s
-t1jet
-1tji
-t1jo
-t2jok
-2tjon
-2tjou
-2tju
-2t1k2
-tkots3t
-t1l
-3t4lema
-tli2n
-tlo1v
-2t1m
-tmana4gem
-tmen4s3t
-tme3sto
-2t1n
-tne2r1
-tnes1
-1to.
-1toa2
-to1ac
-to1al
-to1ap
-to1ar
-1tobb
-1toc
-2tock
-1tod
-to1da
-to1do
-t3oefe
-1toej
-toe1k
-3toe3la
-1toen
-toe3nad
-toe3pl
-1toer
-1toe1s2
-toe3tj
-3toets
-1toez
-tof3ar
-tof3on
-tof1s
-tof1t
-to2fu
-to1go
-1togr
-1toh
-1toi
-to1ka
-to4kan
-tok1r
-tok1s
-to1la
-2t1olf
-1tolk
-tol4p3r
-2t1olv
-t1o2ly
-1toma
-t1oml
-tomp3j
-t1omr
-t1omz
-1ton.
-to1na
-t3onder
-1tone
-to4ned
-4to4net
-3tong.
-ton4gr
-1tonh
-1toni
-1tonn
-1tons
-tons3h
-ton3sk
-ton3th
-t3ontv
-4tontw
-4tonvr
-1tooi
-took1
-too2m1
-1toon
-to4p3as
-t3opbr
-2t1opd
-top4let
-2topm
-2t1opn
-top3re
-to3pri
-t3opru
-t3opto
-t3opva
-1topw
-1tor.
-to3raa
-to3rac
-to3rad
-tor3a4g
-to3ral
-to3rat
-3toree
-3torens
-4t3orga
-3toria
-tor4maa
-tor4m3ac
-3torno
-to3rom
-1torr
-1tors
-tor4s3te.
-tor3th
-tor3tj
-to1r2u
-1tos
-to1sa
-to1sf
-to1sh
-to1s2l
-to1sn
-to1sp
-1to1ta
-to1th
-to1tr
-tot1s
-2t1oud
-1tour
-tove3na
-to3verd
-to3veren
-4toverg
-to3veri
-1to1w2
-1tox
-toy1
-1to
-1to'
-2t1p2
-tpla4c
-t1q
-4t3raad
-3trac
-2traf
-3trafi
-3trafo
-1trag
-1trai
-1traj
-t3rake
-3trams
-3trans
-1trap
-trap3l
-4t3rat.
-3trato
-3tratr
-4tratt
-1trau
-t1raz
-1tre.
-t3reac
-4t3redd
-t3redes
-tree3tj
-1tref
-2t1reg
-tre4ko
-trek3st
-t3rese
-4t3resu
-1tre2t1
-1treu
-2trev
-t2re-
-t3rich
-3trico
-3trict
-trie3t
-tri3gl
-t3rijp
-trijs3p
-trijs3t
-1tril
-1tri1o
-trio4de.
-1tris
-t3risi
-t3rit.
-3triti
-1tri
-4t3roed
-4t3roer
-4t3roes
-4trofs
-4trold
-4t3rolt.
-4tromi
-t3rond
-3trone
-3trono
-4t3roof
-4troom
-3troon
-1tros
-tro3sp
-tro3t4j
-4trout
-tro1v
-4t3roven
-t2ro
-3truc.
-2t1rug
-3trui.
-3truie
-t3ruim
-trui3t
-2t1ruk
-2ts
-ts1aa
-ts1a2d
-ts1a2g
-ts1a2m
-ts1an
-ts1as1
-t2sca
-tscenari3
-t1sch
-t4sch.
-t2sci
-t2scl
-t3scou
-t4s3e4co
-tse2d
-ts3een
-t2s1ef
-t4s3ei.
-ts3eie
-ts3eil
-t4s3eind
-t4s3eis
-tse3la
-t4s3e4ne
-t2s1e2v
-t3shop
-ts1ij
-ts3ima
-ts3int
-tsi4te
-t3sjen
-ts4kel
-ts3lab
-t3slac
-ts3lam
-ts3led
-ts3len
-t3slep
-t3sloe
-ts4mel
-tsnes3
-ts3neu
-t3snij
-t3snoe
-ts1ob
-t1soe
-ts1of
-tso2l
-ts3oli
-ts1on
-ts4opp
-tso2r
-ts3ord
-ts3pac
-t3spec
-t3spel
-ts3pet
-t3spin
-ts3ple
-t3spor
-tss2
-t3staan
-t3staat
-t3staf
-t3stam
-t3stap
-ts3tas
-t3stat
-t3stav
-t3stee
-ts3teko
-t3stell
-t3stels
-t3stem
-t3stene
-t3ster.
-t3sterk
-ts3term
-t3sters
-t3steu
-ts4tie
-t3s4tijg
-ts4tik
-ts4tim
-tsto4f
-t3ston
-t3stoo
-ts3trad
-t3stral
-t3stree
-t3streke
-t3strep
-t3stri
-ts3troe
-t3stroo
-t3stru
-t1stu
-t4stui
-t4stun
-t4sw
-t1sy
-2t1t
-ttent3j
-tte1t
-tti4me.
-tt2l
-tto1v
-tt1uu
-tu1a
-1tub
-tu4bel
-tu1d
-tu1e
-tuf1
-1tuin
-tuin3s
-2tuip
-t3uitk
-t3uitr
-t3uitv
-t3uitz
-tu1ka
-tu2k1i
-tu2k1l
-tu2ko
-1tula
-1tule
-1tum
-1tune
-tu4nes
-tu4net
-1tunn
-tunt3j
-tu1o
-tu1ra
-1turb
-1tus
-tu2s1e2
-tu2si
-tut1j
-1tuum
-tuur4sla
-tuurs5taal
-tu1wa
-tu1
-t1v
-tver3a
-tvero3v
-tvoi2
-t1w
-2twa
-twee3s
-twee3t
-twe4gi
-2twet
-twi2
-3t4wijf
-4twil
-t5wind
-2two
-1ty.
-1ty1n
-1typ
-ty1s2
-4t1z
-1t1
-1t
-2t1-
-u1a2b
-u1ac
-ua1dr
-uae2
-u1af
-u1al
-u1an
-ua1na
-u1ar.
-ua4re.
-ua4res
-u1ars
-uar1t
-ua1sa
-uas2h
-ua3she
-uas1p
-u1at
-ua1tr
-uat2s
-u2b1ac
-ub1am
-u2b1ar
-ube4li
-ube4lo
-ub2lo
-ub1or
-ub1ro
-uca1
-u2cet
-u1che
-ucht3st
-ucle1
-u1co
-uc2t1a
-uc4tin
-uc4ton
-ud1ac
-ud1a2d
-u2d1a2m
-ud1ap
-ud1a2r
-udas1
-ud3eerl
-ud3e4ze
-ud3ond
-ud3oom
-udor1
-ud3ove
-ud1re
-ud1ro
-uds1a
-ud3s4me
-ud3smi
-uds1n
-uds1p
-ud3stan
-ud3ste
-ud3str
-ud1w
-ue1a
-u1e2c
-ue2du
-uees1
-u1ef
-u1ei
-u1el
-ue1ru
-ue1sa
-ue1tj
-u1ez
-u1fac
-uf1an
-u1fl
-u1fo
-u1fr
-uf1sk
-uft1h
-ug4dat
-ug4d3er
-ug4din
-ug2do
-ugd1s
-ug1ei
-uge4la
-uge4l3o
-ugen3ac
-ugen3s
-ugie1
-ug1l
-ug1o
-ug1ra
-ug1ri
-ug1ru
-ug3sce
-ugs3pa
-u1h
-u2i
-ui1a
-ui4daa
-ui4dac
-ui4dar
-ui4das
-uider3s
-ui2d1o
-uids3t
-ui1e
-uien1
-uie4re.
-uier3o
-uie4ru
-uif1l
-ui2f1r
-ui4g3aa
-uig1l
-ui2g1r
-ui2k1a
-uik1l
-ui4k3op
-uik1r
-uik1u
-uik1w
-uil3aa
-ui4l3em
-uilo2
-uil3og
-uil3oo
-2uim
-ui4m3ac
-ui2n1a2
-uin1d
-uin1g
-uino2
-uin3og
-uin1t
-ui2pl
-ui2p1o2
-uip1r
-uip1s
-uis1c
-ui2sl
-ui3slu
-uis1o
-uis1p
-uis4tac
-uis4th
-ui2t1a2
-ui4tet
-1uit1h
-3uitle
-1uitn
-uit1o
-ui2t1r
-uit1s
-4uits.
-uits4m
-u3j
-ujo1
-uk1ac
-uk1al
-uk1ap
-uk1as
-uk1au
-uken3s
-uk1j
-ukkers3
-uk1li
-uk1lo
-uk1n
-u2k1of
-u2k1on
-ukop2
-uk3ope
-u2k1or
-uk1r
-uk1sc
-uk1sl
-uk3sme
-uk3sne
-uk3spa
-uk3spl
-uk1t
-u1ku
-uk1we
-uk1wi
-u1la
-u2l1a2p
-uld3erk
-uld3ov
-ul2d1u
-u1le
-u2led
-ul1fa
-ul1fl
-ul1fo
-ul1fr
-ul1g
-u1li
-ul4kar
-ulk1l
-ul1oe
-ul1o2p
-u1los
-ulp3ac
-ul4pag
-ul2p1l
-ulp3on
-ul2p1r
-ul1sc
-ul1sl
-ul1so
-uls3te.
-ul2th
-ult1s
-ul1ui
-umana4
-um3e4di
-ume1s2
-1umh
-um1op
-umpi2
-um1pj
-um1s2
-um1ui
-1umz
-2un.
-2una
-un1ac
-un2ce
-un4ch3r
-un1do
-un1dr
-un4dra
-und1s
-u1ne
-u2ned
-unes1
-un4ge.
-un4geg
-un4gem
-un1gl
-un1gr
-uni4th
-1univ
-un1kl
-unk1s
-un1op
-u1nor
-uns2
-un4st3a
-unst3on
-un4st3r
-un4t3aa
-un2t1o2
-un4tri
-unt3sp
-unt3st
-un2t1u
-u1nu
-u3oden
-u1om1
-u1on
-u1oo
-uoot2
-uo1pa
-uo2pl
-uo1pr
-u1or
-uo1ru
-u1os
-uo1t
-u1ov
-u1pa
-u1pe
-upe1n
-uper3s
-u1pi
-up1j
-u1pl
-up1op
-u1pr
-up1st
-up4tro
-u1pu
-u1q
-ur3aan
-ur1ac
-ur3ada
-ur1af
-u1ral
-ur1ar
-uras1
-ura1t
-ur1au
-ur4cep
-ur1da
-ur1do
-ur1dr
-u1re
-u2rec
-ur3ech
-ur3een
-uree3s
-ur3eff
-ure1k
-u4r3elf
-u2rem
-ur3emb
-ur2en
-uren3o
-ure3st
-u4r3eta
-ur2fa
-ur1fl
-urf1s
-ur1gl
-u1ri
-ur3ijz
-u4r3ind
-u4r3int
-uri1o
-urk3ac
-ur1kl
-ur1kn
-urmana4
-u1rob
-u1roc
-u1ro1f2
-uro1l
-ur1on
-ur4ona
-u1ro1s
-u1rot
-ur3ove
-ur1ps
-ur4sco
-ur4scr
-ur4s3eli
-ur4sev
-ur3s4fe
-ur4s3laa
-urs3lage
-urs3li
-urs3take
-ur4ston
-ur4sui
-ur4t3a4g
-ur1tj
-urt3ond
-ur3to3v
-urt1r
-urt1s
-ur1ui
-u1ry
-us1ad
-us1ak
-us1a2m
-us1ap
-us1ar
-use1a
-use2c
-u2sed
-u5sen
-u2sep
-u2sew
-us1ho
-u1si
-usie1
-us2it
-us1j
-u2s1l
-us1n
-us1on
-us1or
-us1os
-us1p
-us4par
-ussie3ro
-ussi5te.
-u2sta
-ust3al
-us1te
-us4t3ei
-ust3oo
-us3tor
-us3tro
-us3tru
-ust3u4r
-ust3uu
-u1su
-us1ui
-u1taa
-ut3ach
-u1tad
-ut1af
-u1tan
-uta1p
-u1tat
-u1te
-u4t3ees
-u2t1em
-uter3k
-uter3o
-ute1s
-utfi4l
-ut1ho
-u4tind
-u1to
-ut3oog
-utoot4
-uto3ple
-uto3po
-uto1s
-uto1v
-ut3s4aa
-ut1s2c
-ut4s3eng
-ut1si
-ut3ske
-ut1sl
-ut1sn
-ut3spe
-ut3spl
-uts3po
-ut3stel
-ut3str
-ut1su
-u1tu1
-u4t5w
-u1ty
-uu2
-uum1
-uun1
-uur1a2
-uur1e2
-uur1i
-uur1k
-uur1o2
-uur3sti
-uus1
-uut1j
-u1v
-uve1n
-uver1
-uw3aan
-uw1ac
-uw1af
-u1wag
-uw1ak
-uw1al
-uw1am
-uw1ap
-uw1ar
-u2w1at
-uw1au
-u1we
-uw3een
-uwe4nen
-uwen3k
-u1wi
-uw3ijz
-u4wind
-u4w3ins
-uw1n
-uw1o2
-uw1r
-uw1u
-uy1
-u1z
-uze1t
-uzie4k
-uzig1
-u1
-u1
-u1
-u2'
-u1-
-1va
-vaar4ta
-vaat1
-va3ce
-va1g
-va2k1i
-vak1l
-vak1s
-va3laa
-val3ap
-val4s3p
-val4s3tek
-va1lu
-van3ac
-van1d
-vang3o
-vang3r
-va3nop
-va2nu
-va1p
-var1s2
-va1s2o1
-vast3re
-vast3ri
-va1su
-va1ta
-vat1h
-vat1j
-va1tr
-2vb
-v1ch
-v1co
-veau1
-1veb
-1vee
-vee2g
-vee2l
-veel3e
-vee2r
-veer3i
-vee3sta
-vee1t
-vei1s2
-ve1k
-1vel
-vel3aan
-vel3ac
-ve3las
-veld3o
-vel4du
-ve4lim
-ve4lis
-vels3n
-ve4lui
-1vem
-3venaarde
-ve3nan
-1vend
-5vend.
-4venem
-ve5nen.
-ve3net
-ve1ni
-ven1k
-4venot
-ven3ov
-4venrui
-ven4sen
-ven4s3er
-ven4si
-vens3lo
-venso4
-vens3or
-ven4s3taak
-ven4stek
-vensu4
-ven4s3ur
-5vent
-1venz
-ve1o
-3veraarst
-ver3aas
-ver3a4d
-ver3af
-ver3a4g
-ver3am
-ver3and
-ver3as
-ver3at.
-ve4r3e4d
-ve4r3ee
-ver3eis
-3verend
-ve4r3ene
-ve4r3eng
-vere3nig.
-ve4r3enk
-ver3eri
-ve4r3es
-ve4r3e4t
-ve4reu
-ve4r3e4v
-ver3gl
-3verij
-ver3ijd
-ve4r3ijl
-ver3ijs
-ve4r3ijv
-ver3ijz
-ve4r3inn
-ver5k4
-ver1o
-ve3rom
-ver3sag
-ver3s4ass
-ver3si
-ver3sl
-ver3s4mac
-ver3s4me
-ver3sp
-ver3st
-ver5s4ta
-vert2
-3vert.
-ver1u
-ve1ry
-ve1sl
-ves1t
-vet3ac
-ve3tan
-vet3o4g
-vet3oo
-ve3tor
-ve4t3ra
-ve4t3ri
-vet1s4
-1vi
-vi1a
-vi1ch
-vid2
-vid3st
-vie4renh
-vie4renn
-vier3s
-vies3p
-viet2
-viet3j
-vi1eu
-vi1f
-vijf1
-viks1
-vil4t3j
-ving2
-vings3
-vi1no
-vi1o
-vis3an
-vi4set
-vi3sor
-vis3ot
-vis1p
-vi1to
-vi1tr
-v1j
-1vl
-vla1f
-v1lar
-vlei1
-vleis4
-vle4t3je.
-vlie4s
-vlot3ste
-v1lov
-vm2
-1vo.
-1voe
-voel4s3t
-voet3a
-voet3jes
-voe4t3r
-voet3sp
-1voi
-1vol
-vo3lan
-vo3lat
-volg3o
-vol4gra
-vo4l3ij
-vo4lop
-vo4lui
-von4det
-vond3sp
-von4d3u
-1voo
-voo3d
-voor3d
-vo1p
-1vor
-vo1ra
-vor4s3te.
-vo2s1
-1vot
-vo1ta
-1vou
-1vo'
-1vo-
-2v1p
-1vr
-vrij3k
-vrij3s
-2v1t
-1vu
-vue1
-vues4
-vu2l1i
-vuur1
-2v1v
-vy1
-vyme2
-2v'
-2v1-
-1wa.
-waad1
-wa2b1a
-1wade
-w1adm
-wa1do
-wa1dr
-w1adv
-wa1go
-wa1lu
-wan3da
-wang3s4
-wan1o
-wans2
-wan3sm
-wan3sp
-war2e
-wa3ren
-wa1ro
-war4s3t
-war3ta
-wart3j
-wart3r
-wa3shi
-wa2si
-wa2s1l
-wa2s1p
-1wass
-was3tr
-1wat
-wat1j
-wa1tr
-1way
-2waz
-2w1b
-wba2l1
-w1c
-2w1d
-w2dh
-wd3oom
-we2a
-we2ba
-we2b1l
-2w1e2c
-1wed
-we2d1i
-we4dre
-wee4gr
-week3r
-wee3lo
-weep3s
-weer3sp
-wee3sl
-wee3sp
-wees4t
-wee3to
-we2g1a
-weg1l
-weg1o
-we2g1r
-wegs2
-wei1s
-weka2
-wek1r
-wel3do
-we4l3ed
-we4l3ee
-4w3e4lem
-wel3ov
-wel1s
-we2m1a2
-we2m1i
-we2m1o
-wen3ac
-wene2
-wen3ei
-we4nem
-wen3enk
-wen4k3as
-wen1o2
-2w1enq
-wen5se
-wens3ten
-wen3tj
-we1o2
-wer2f1
-wer4k3a
-wer4k3l
-wer4k3o
-wer4kru
-wer4k3u4
-werk3w
-wer4p3a
-wer4pr
-wer2s
-wes3te
-west3o
-1wet.
-1wetg
-wet1h
-wet1j
-wet3sp
-wets3ta
-we2t1u
-2w1ex
-wezen4s3
-2w1f
-w1g
-w1h
-2whei
-whi2
-w3ho
-1wiel
-wie4l3a
-wig1s
-1wijd
-2wijg
-wijka4
-1wijs1
-1wijz
-wi2k1
-wind3r
-wings3
-1wink
-2w1inr
-1wins
-winst3aa
-win4st3r
-wip1
-wis1p
-1wiss
-1wit.
-wi2t1h
-wit1j
-wit1r
-wit1s
-1witt
-w1j
-w1k
-2w1l
-wl1g
-wl1s
-2w1m
-wn1ac
-w1ne
-wnes1
-wn1g
-w1ni
-w1no
-wn1sl
-wn1st
-w1ob
-woest3a
-woes3te
-wo2l
-wol1a
-wolf4s3
-wol1i
-woo2
-woon1
-woor4d3r
-w1op
-wor2c
-wor4g3eng
-wor4m3a
-wo1s2
-w1ov
-2w1p
-wree2
-w1ru
-2ws
-ws1a2
-w1sc
-ws1j
-w1sla
-ws1le
-w1slo
-w1slu
-ws1o
-w1s2om
-w3spec
-w3spel
-w1spi
-w1spl
-ws1pr
-wssi2
-w1sta
-w1ste
-w3s4tic
-w1sto
-w1str
-w1stu
-ws1ui
-w1sy
-2w1t
-wtes1
-wti2
-wtje3sp
-w1v
-wve2r
-w1w
-w1z
-wzee2
-2w1-
-xa1f2
-xa1g
-x1all
-xan1
-x1ap
-x1b
-x1c
-xcu1s
-xe1a
-xe1g
-xe1la
-xeno1
-xe1ro
-xer1s
-x1f
-x1g
-x1h
-xi1c
-xie2t
-xi1g
-xi1om
-xi1p
-xi2t1i
-xit1s
-x1k
-x1l
-x1m
-x1n
-xo1f
-xop2l
-xo1s2
-xo1t
-x1p
-x1q
-x1r
-x1s2
-x1t
-x2t1ak
-xtraat4
-xtu4re.
-xtu4res
-x2tv
-xu1e
-xus3
-x1v
-x1w
-xy1
-x1z
-x1-
-1ya.
-3yaal.
-y1ab
-y1ac
-y1ad
-y1af
-y1ag
-1yal
-yale1
-y1a2m
-yan1d
-y3ante
-y1ar
-yas1p
-y1au
-y1b
-yba2l1
-yber4t3
-ybi2
-y1c
-ycho1
-yco4pe
-ycot1
-y1d
-y1ed
-y1ee
-1yem
-y1en
-ye1o
-y1er.
-1yeri
-y1ers
-y1es1
-y1et
-y1f
-y1g
-yg2d
-y1h
-y1i
-y1j
-y1k
-yl1al
-y1lee
-y1len
-yle1s
-y1li
-y1lo
-ylo3l
-yl1s
-y1lu
-yma4des
-ymbi1
-ymi1s
-ymp1j
-y1na
-yn1d
-yn1g
-y1ni
-y1no
-yn1t
-y1nu
-yo1g2
-y1oo
-y1op
-y1or
-y1os
-yo1t
-y1ov
-y1o'
-y1pa
-y1pe
-y4pete
-y1pi
-y1pl
-y1po1
-y1pr
-yp1s
-y1ra
-y3re
-y1ri
-y1ro
-y1ru
-y1sa
-ysan1
-y1s2c
-ysce2
-yse3ra
-y1s2f
-y1s2h
-ysha2
-y1si
-ys1l
-y1s2o
-ys1t
-y1s2u
-y1sy
-y1t
-y2te.
-yten1
-y2tes
-y2to1f
-yto1p2
-y1u
-yu2r
-yure1
-y1v
-yve2
-y1w
-ywa2r
-y1z
-y1
-y1
-y1-
-y-2a
-1za
-zaad1
-zaal1
-zaar1
-zaat1
-zag3st
-za2ka
-za4ket
-za2k1l
-zak1s
-zak1u
-zan4d3a4
-zan4dr
-zand3s
-zang3s
-za1po
-za1ru
-za1s2
-2zb
-2z1c
-2z1d
-1ze
-ze1a
-zee1k
-zee4p3ac
-zee3r4o
-zeero3v
-zee1s4
-zee1t
-zeg4sl
-zei4la
-zei1s2
-ze1k
-zel3ac
-ze3lar
-zel3dr
-zel4fo
-ze1lo
-zem1s
-zena2
-zen3az
-zen4d3a
-zen3ei
-ze1ni
-ze4n3in
-zen1k
-zen1o2
-zen3sl
-zen3sn
-zen3sp
-zen1t
-ze1pi
-zer1g
-zer1k
-ze1ro
-zer2s
-zers3e
-zer3sn
-zer4st
-zes1
-zes2c
-ze2se
-ze2su
-zet1a
-zet1h
-ze2t1i
-ze4t3ra
-zet3st
-zeve4n3
-ze1
-z1f
-z1g
-2z1h
-1zi
-zie4ki
-ziek3l
-zie4k3o
-ziek3s
-ziek3w
-ziel4s
-2ziep
-zie1t
-zi2g1a
-zi2j
-zij1k
-zij4na
-zij1p
-zij1s
-zik1w
-zine1
-zing4s3
-zin4k3l
-zin4si
-zin4sl
-zins3t
-zi1o
-zipi1
-zi1pr
-zi1s2k
-zi1s2l
-zite2
-zit1h
-zit1j
-zit3st
-zi2t1u2
-2z1k
-2z1l
-2z1m
-zme1
-1zo
-zo1al
-zoet3j
-zoets4
-zoet3ste
-zo1f
-zo1i
-zo1la
-zon3da
-zon3do
-zo2no
-zon3sf
-zo2nu
-zoog1
-zo1p
-zor4g3a
-zor4gr
-zot1h
-zo1tr
-zo1v
-2z1p
-zpa1
-z1r
-2z1s2
-zsce2
-z1t
-1zu
-zue1
-zui4dr
-zus1
-2z1v
-1z2w
-zwets3t
-1zy
-2zz
-z2z1or
-2z1-
-2d
-1m
-1r
-1-
-1h
-1s
-1a
-1b
-1c
-1d
-doe2
-doel3
-1g
-1h
-1j
-1k
-ki1
-1l
-1m
-1o
-om1
-1p
-1re
-r1s
-1r
-1s
-1t
-1u
-1v
-1w
-1z
-1-
-1c
-1d
-1g
-1h
-1l
-1m
-me1
-1n
-ne1
-1r
-re1
-res4
-1t
-ta1
-1v
-1c
-1l
-1m
-1n
-1p
-1t
-te1r
-1v
-2ca
-1che
-1co
-de1s
-2di
-e2
-en1
-f1
-1j
-1l
-1na
-n1d
-1ne
-1ni
-ns2
-ntenvere5
-n1th
-n1tj
-n2t1r
-n1t2w
-1q
-1ra
-1re
-1ri
-ro1
-s1c
-1si
-s1t
-1te
-4ticaa
-1to
-ts1
-1ty
-u1r
-ve1
-1vo
-1z
-2ze
-1c
-1d
-e2n1
-2g
-llu1
-m1
-n1a
-n1d
-ndu1
-ndus4
-1ne
-4nehon
-ne1s
-3nitia
-n1s2
-n1un
-1nur
-o1
-1ro
-s1oo
-s1p
-s1t
-1t
-ti1s
-1v
-1z
-21-
-1t
-1b
-21g
-21l
-21m
-1pe1
-21pl
-ri1
-1g
-1m
-r1
-1t
-1v
-m1
-1su
-t1s2
-o1
-3'n-roll.
--1a2
--aan1
--1b
--1c
--1d
--de2s
--1e2
--en1t
--es1
--eu1
--1f2
--1g2
--1h
--1i2
-2-i.
--in1g
--1j
--1k
--kana4
--ko1p
--1l
--laat3ste
--m2
--mana4gem
--3me
--1n
-2-n.
--ne2k1
--niet3j
--1o2
--oe1
--or1
--1p
--1q
--1r
--1s4
-2-s.
--se1n
--2sn
--studi3o
--3t2
--1u2
--ui3tjes
--1v
-2-v.
--ver1
--1w
--1z
--zout3
--1
diff --git a/Master/texmf-dist/tex/context/patterns/lang-nn.hyp b/Master/texmf-dist/tex/context/patterns/lang-nn.hyp
index 0b30104cdab..eff3ce1ccf2 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-nn.hyp
+++ b/Master/texmf-dist/tex/context/patterns/lang-nn.hyp
@@ -2,51 +2,8 @@
% for comment and copyright, see e:/tmp/patterns/lang-nn.rme
-% used: D N S a b c d e f g h i j k l m n o p r s t u v w y z å æ ø ü
+% used: a b d e n r t
\hyphenation{
-atten-de
-aust-røn
-aviser
-betre
-bortan-for
-bortre
-Dansk-øya
-der-etter
-dess-uak-tet
-dit-over
-finger-spitzen-ge-fühl
-finger-spitz-ge-fühl
-fram-ifrå
-før-enn
-her-etter
-her-etter-dags
-hvor-etter
-hvor-over
-høyt-ærede
-gi-vet-vis
-lands-øl
-lands-ølet
-lands-ølets
-langt-ifra
-ned-imot
-noens
-Not-odden
-Not-oddens
-nøye-reg-nen-de
-opp-imot
-oven-ikjøpet
-promp-te
-spleen
-sel-ves-te
-smal-enden
-sørpe-is
-sørpe-isen
-skrov-is
-skrov-isen
-Steins-land
-syd-enden
-tvert-om
-velan
-velet
-welt-schmerz} \ No newline at end of file
+att-en-de
+bet-re} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-nn.lua b/Master/texmf-dist/tex/context/patterns/lang-nn.lua
new file mode 100644
index 00000000000..71c21131ac6
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-nn.lua
@@ -0,0 +1,58 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["characters"]="abdenrt",
+ ["data"]="att-en-de bet-re",
+ ["n"]=2,
+ },
+ ["metadata"]={
+ ["mnemonic"]="nn",
+ ["source"]="hyph-nn",
+ ["texcomment"]="% Norwegian Nynorsk Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% Adapted to the new pattern-loading scheme.\
+% Original file name was nnhyph.tex\
+% \
+% TeX hyphenation patterns for Norwegian Nynorsk\
+%\
+% Version 2007-02-10\
+%\
+% Copyright (C) 2007 Karl Ove Hufthammer.\
+% Copying and distribution of this file, with or without modification,\
+% are permitted in any medium without royalty, provided the copyright\
+% notice and this notice are preserved.\
+%\
+% This file contains hyphenation patterns for Norwegian Nynorsk.\
+% It uses the Norwegian hyphenation patterns from nohyphbx.tex,\
+% created by Rune Kleveland and Ole Michael Selberg. Please see\
+% that file for copyright information on those patterns.\
+%\
+% The patterns in nohyphbx are based on both Norwegian Bokmal\
+% and Norwegian Nynorsk, and works about equally well for both\
+% languages. This file, nnhyph.tex, contains only a few hyphenation\
+% exceptions, for words that needs to be hyphenated differently for\
+% the two languages.\
+%\
+% Please send bugs or suggestions to karl@huftis.org.\
+%\
+% \
+% \\input hyph-no.tex\
+% \
+% \\hyphenation{\
+% att-en-de\
+% bet-re\
+% }\
+% \
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyzåæèéêòóôø",
+ ["data"]=".a4 .aa4 .ab4ba .ab7be .ab6s5t .ac6tin .adel4s .ad8la. .ad6le. .ad2r .ad1s2 .af7f .af5t4 .af5f6u .ag6na. .ag6ne. .ag4r .ai2 .a6k .ak6ka. .ak6ke. .ak3kl .ak3kr .ak6ne. .ak6r .ak8sa. .ak4se. .ak6ta .ak4te. .akte4r .akter5e .ak5tr .akva7 .a6l .albu5en .alfa3 .al4ge. .al5gi .al6ka. .al4ke. .al4kom .al4la. .al4le. .al5leg .al5lo .all5s6 .al4ma. .al8me. .al5m6in .al4na .al6s7k .als5o .alt4a .al4ta. .al5tar .al4te. .alt3o .al6ve. .am7b .a6me .am6ma. .am4me. .am4s4 .am6ta .a6n .ana3b .an4da. .an4de. .an5d4ra .an4d5ø .an3er .anes5 .an4ga. .an3ge .an4ge. .ange4s .an4ja. .an4ka. .an4ke. .an4la. .an3n .an4na. .an7nal .ann4e .an4ne. .an5s8 .an4sa. .an4se. .ant2 .an4ta. .an4te. .an5tem .an5tep .an4ti. .an6tin .an4tis .an4tiv .ap8lan .ap1p6 .ap8t .arbi5 .ar6de. .are4o7 .ar4ge. .ar5ges .ari6a .ari8e .arie5ne .ar5ka .ar8ka. .arlan9 .ar4me. .ar7mea .ar4na. .ar3ne .ar4ne. .ar5nes .ar6ra. .ar6r7u .ar6ta. .ar4te. .ar9ti .ar6va. .ar4ve. .ar4ved .ar4ver .arvi6 .a6s .as8ka .as4ke. .as5kese .as4le. .as6pa. .as5s .ast5ru .at4h .at4ki .at4le. .at4na. .at2o4 .at3s .atte4 .att6r .a5ty .au8de .au6e .au8ga .au4ge .au4ka. .au8le. .au4r .au6sa. .au6se. .aus9k .au4sp .avi2 .av7i6d .av7inde .av4la. .av4le. .av7s6 .b6 .ba6by .ba6la. .ba4le. .ba4ne. .ban4k3l .ba4re. .ba4ri. .ba8te. .be4de. .bede4n .be6d5ene .be4d5et .be8di. .be3e4d .be6ke. .be4la. .be9nar .be4ne. .be6ra. .be6re. .be4res .ber6ett .be8ri. .be7ska .be6sten .be4ta. .be6te. .be5t4v .bi6de. .bi6en .bi4le. .bilet5 .bi6t3r .bl4 .bla4d .ble4k3 .ble5k4e .blek4k3f .blekk3s4t6 .blekk9s8v4 .bling5 .bo8da .bo8de. .bogs8 .bok5 .bo4k4en. .bo8la .bon2 .bo4na. .bor6t5 .bort6e .bor8ti8 .bort9r .brudd7s6 .bruddså7 .bu6da. .bu3d6r .bu4et .bus6sy .by6de. .by8ta. .bæ2 .bø6k5a .bø8nen .bø8ner .c4 .ca4en. .car4s5 .ca6se .ce6b .cos1 .co4st .d6 .da4ge. .da4le. .dags6e .da2m .da4ne. .da4ta .dau3s .deka9r .deko7d .de4le. .de4l5ei .del5s6 .de4mi. .demo7e .den5sl .de4re. .de4r5et .de4ri. .de6r3i4 .de7r4i5v .de4r5om .de6s5m .de4so .de4sto .de4u .devi5s .di2a .di5e4l .di6er .di4et. .di9f6t .di4ne. .dings7a .di4sk .di8s3t .do4en .do4er .do8et .dome5 .do4ra .do6re. .drau4m .ds4 .du4a .du4en. .du4er .duft3 .du4ge. .duk3n .du4se. .du4st .dy4re. .dø6la. .dø6r3 .dø7r4a .dø7r4e .dø4ve. .då5ren .då7ret .e6 .eb4ba .ecu6 .ed4da .ed4le. .efo7 .ef4ta .efta5s .ef6ter .eg8de. .ege2 .ege5l .eg6ga. .eg4ge. .eg4gel .eg8la. .eg4le. .eg6na. .eg4ne. .ego7t8 .egs4 .eg8se. .eg5si .ei2 .eid5a .ei5den .ei4ga. .ei7ger .eik5a .ei4ke. .ei3l .ei3m .ei8ma. .ei8me. .ein7as .ei3ni .ein5og5 .ein5s6ta .ein8s7to .ei9rar .ei5res .eir9u .ei5te .eit9r .ekk4o .ek4le. .ek3li .ek6ne. .ek4r .ek8sa. .ek3se .ek8se. .ek4sp .eks6pi .eks3t4 .ek5s4ta .ek8ta .ek4te. .ek7to .el8da. .el4de. .el4g5r .eli5ne .el3k .el5l .el6s .els6a .els4kl .els6t .el6ta. .el6te. .el6veg .em3b2 .emfa9 .em4ma. .em8me. .em6na. .em5p .en5a .en4da. .en4de. .end5r .en4ga. .en6gav .en3ge .en4ge. .en6g5r .engs6 .en6ka .en4ke. .en5og5 .en6sa .en4se. .en5so .en3sp .en5t .en6te. .ent4r .en6t5ra .ent8re .en3ø4 .ep6t .er8a .er4e .er4g5r .er4ke .er4la. .er4le. .er6ma. .er4me. .er4mek .er4na. .er6ta. .er4te. .es9ast .es1k .es3ka .es8ka. .es4ke. .es5l .es8la. .es8le. .es3p .es6pa. .es6r .es8sa. .es4se. .es4so .es5ta .es3te .es6te. .es7tet .es5ti .est3r .es7tu .et8la. .et8le. .et4na .et4ne. .et4s .et8sa. .et5s4e .et6se. .ets4i .et1te4 .et6ter .et6ti .ev8ja .ev4je. .ev4ne. .ex4 .f4 .fa2e .fag3s4 .fa4ne. .fan3t4o .fe4e .feil5i .fe2l .fela9 .fel5l .fel4ta .fe4ma .fe8me .fem5o6g5 .fem5t .fer8ro .fer6s .fe8sl .fe8st5 .fes3t6e .fi4b5 .fi6a .fi4le. .fire5o6g5 .fis6k .fjel4 .fla4t5o .fo4bi. .fol2 .fo2r .for3d6ri .for7d6ra .for5en. .form5s .for7s6o .fre6e .fri5e6re .fug2 .fu6ge. .ful2 .fu8se. .fy8se .fø8rel .g6 .gaf7 .ga4le. .ga8li. .ga4me .ga4ne. .gang5s4 .gas4 .gas5ta .ga2t .ga4ve. .ga9vee .ge2a .gel4e .ge3ne .ge6ni5 .gen5s .ge4o .ge4st .ge5s6tap .ge9sv .gha5 .gift5s .gi4n .gi4s .gis7p .gi8v3a .gl6 .glo6i .glo9v .gly5s .glø9se .gnå7la .go5des .gos7 .gra4v3end .grei4e .grunn5s .grus5s .gu4de. .gud3v4 .gu4lat .gus1 .gu4tu. .gø2 .gås4e5 .gå4v .h4 .hai5s6 .ha6ka. .ha8ma. .hand5s6l .handsla9 .ha6v5ak .ha6vi .he4er. .hei5e .he2n .hen3i2 .he6r5i6 .he6r5o6 .he9r6oe .he7r6oi .he7r6ol .he9r8os .hes4s5 .het6s5 .het7s6e .he4t5 .he5t6e .hil4l .hi4n .hi6re. .ho2d .ho2e .ho4re. .ho5ren .ho7ret .ho8ta. .ho8va. .hu4di .hus6val .hvit3 .hvi3t4e .hy6ra. .hy4re. .høi5 .hø4re .hø4va .hø4ve. .høy6st5æ .hå8en. .hå8er .hånd5s6l .i2 .i3a4 .i3bl .i4da .ifø5re .ig8la. .ig4le. .i4her .ik2 .ik6k .ikke5 .i3k6l .ik5t .ik8te. .i5kv .i3la .i4la. .i8lande .ilbo8da .il6d3r .il6de. .i3leg .i6les .il4ja .il6je. .il6ke. .il4le. .il6sk .il4te. .i6me .imø5te. .in5ad .in5de .in8ga. .in4ge. .in3gr .in6gri .in5k6 .in6ka. .in4n3 .in4ne. .in5n6e .in6n7eks .in6n7ets .in6n7ett .in4n3i .in5s .in7tes .io4na .io4nom .i4rer .ir7k8 .ir8ra. .ir6re. .i6sa .i3sc .i6se .is7k6 .isla8ga .is6lam .is4le. .is4let .is4me. .is8na. .is8ne. .is5pa .i5spe .is3s4 .is6sa. .is4se. .is5sk .ist6 .is8te. .i5sted .i5stem .is7ti .i6s7tj .i6s7tr .is8ut. .i6s5ø .i5ti .i3va .i4van .i4var. .i3ve .i4vel .i6ven .i4ver. .i4vere .iv8ra. .iv6re. .i3ø .j4 .ja4de. .ja6e .ja4ne .ja8se. .ja4va. .je2a .je2l .je2m .je5re .jern5s4 .je4ta .ji4 .jo8en. .jo4se. .ju6a .ju6la .jule3 .ju4li3 .jø4dep .k6 .kaf2 .ka6la. .ka6li. .kalve5l8 .ka5me .ka3na .ka4ne. .ka4p3r .ka4ra. .ka5r6a5v .ka6re. .ka5rin .ka4te. .ka5t6h .kau9k .ka6va. .ka4ve. .ke6e .kel3 .kier3 .ki4na .ki7ni .kino3 .kir2 .ki4se. .ki8va. .ki6ve. .kje3de5 .kje4k .kjek7l .kjønn4 .kle4s .kli5ne .klo9va .kly7sa .kna7se .kne4p3r .ko6da. .ko7gr .ko4la .ko3le .ko8le. .kol5j .ko3pe .ko6pe. .kor6s5ed .ko4se. .ko6ta. .ko4te. .ko6ve. .kring5s .ks6 .ku5f4l .ku4le .ku8ra. .ku4re. .ku8ta. .ku8te. .kva4r1a .kve9ka .kve5ke .ky8la. .ky4le. .ky6te. .kø3s .kå6pa .l6 .la4da. .la4de. .la4ga .la4ge. .la5ger .la4ma. .la6ta. .la4te. .la3tr .la4va .la3ve .la4ve. .le8ar .le4da. .le4de. .le4er .le6et .le2f .lef3l .lega5ta .le4ge. .le4gel .le8gi. .lei5er. .lei4ve .le4ke. .le4k5r .lemu9 .le4ne. .le6o7 .le7s6a .le4se. .le4sek .le4ses .le4s5p .le2t .le7ta .let6tan .le2u3 .le3va .le4va. .le4ve. .le4ves .li8a .li4de. .li4e4 .li5ene .li2g .liga3 .li2k .lik5k6 .lik3o .lik3s .li4ma .link6 .li6ra .li4re. .li4sa .li4se. .li4ta. .li4te. .li5ti .li4ve. .li4v5en .liv8s7u6 .liv4s5v .lo4e .lo6ge. .lo8gi. .lo6g5r .lo4i .lo6na .lo8o .lo6ri .lo8sa. .lo4se. .lo6te .lo4va .lo3ve .lo4ve. .lu4d .lu2e .lu4na .lu6pa .lu4pe. .lu6ra. .lu4re. .lu6se. .lu4ta. .lu9tas .ly4de. .lyd3s .ly8e .ly8ge .ly4se. .ly4sk .ly5s6e .lys5s6 .ly8str .ly4te. .ly4ve. .lø8de. .lø6en. .lø8ne. .lø6pa. .lø4pe. .løv5i .løye5ne .lå8ma .lå5re .lå6re. .lå4te. .m8 .ma4ge. .mag9r .ma3ka .ma4ke. .mak6t5at .makt5s .ma4le. .ma4li. .ma4na. .ma4ne. .ma4ni. .ma4ra. .ma4re. .ma4ri. .ma4sa. .ma4si .ma6st .ma8ta .ma6t8h .mat5t8o .ma4v .me4d3 .me6d5ei .me6d4i .me6d7in .me6d5r .mei5er. .mei5et .mek5l .me6la. .mel3l6o .me4l5ø .me4ne. .me3ri .me4sk .me2t6a3 .me3ta4ll .mes5ti .me4tri .mi6kj .mi4le. .mi4me. .mi4ni. .mi4nik .min4k3 .min5k4e .mi6s3t4 .mne6 .mo5de .mo6er .mo4na. .mo8ne. .mon4st .mons6t5r .mor5d6e .mo4re. .mor3t6a5 .mo4se. .mo4ta .mo4tek .mo4ter .mo4tr .mo5v .mu8ga .mu8ge. .mu6le. .mul5es .mur7 .mu5r8e .my8ka .my4ke. .mø4re. .mø5res .mø2t .må6la. .mål3o .n8 .nabo3 .na6ge. .nak2 .na8ke. .nan5s .na4r .na4sa. .nat2 .na3tr .nat6tr .ne4de. .ne4den .ne4d5i .ne4d3r .ned3s4 .nei5e .ne8pa. .ne6pe. .ne2s .ne4t .ni8ar .ni6er .nig4l .ni4na. .ni5o6g5 .ni4pa. .ni6pe. .ni8sa .ni6se. .nita9 .ni4to .ni4va .no6de. .no6e .no8ka .no4me. .no8mi. .no4r .no8se .no8si. .no4va. .nu4e .ny5a .ny8sa. .ny6se. .ny4te. .nær9ast. .næ4re. .nød4d .nø4re. .nå4de. .nå6le. .o6 .obo5e .od4da. .od4de. .od8la. .od8le. .offsi6 .of4te. .of5teb .og4 .ok1k .ok8ka. .ok8ke .ok4se. .old3s .ol4ga. .oli5 .ol8la .ol8le. .ol6m .om1 .om4ar. .om6bo. .om4e6n .om4gå. .om4me .om5s2 .on4de. .on5des .ond3s .on6kl .on6na .on8ne. .op5ar .op4pa .op4pe .opp7el .op4pi .opp3l .oppla8te. .opp5s6 .op7r .opt6 .or4da .or4de. .or4del .or4dr .ord5s4 .or5ga .or6ka. .or4ke. .or6me. .or4re. .ort6 .or6va .osa5 .os4k .os4s .os4te. .ot5r .ot7t8a .ot4ta. .ot4te. .ot4tes .ot3to .ot4to. .ove6 .over3 .overen6d .over3i4 .over5k8 .ov8re .ov5u .p6 .pa8la. .pa4le. .pa5n6e .pa6n7eu .pa5n6i .pa6re. .pe3do .pe4ke. .pek5t .pel4sj .pe4ne. .pe2p .pep3r .pe8sa. .pese5t .pe4st .ph2 .pi6le. .pi6p .pi9ra .pi2s .plen5g6 .plus6s5 .plus7s6e .plø7se .po4et .po3la .po8la. .po4le. .po4log .po2p1 .po2p2e .pop3p .po3p2u .po8ra .po6re. .po4res .po6st .po8ta. .po6tek .ps2 .pøn3 .pøn9s6 .på5d6 .r6 .ra6da. .ra6et .ra4ga. .ra4ge. .ra4ja. .ra4ka .raks7 .ra2m .ra4na .ra4ne. .ran7s6a .ra6pa. .ra6pe. .rap4s .rap5s4e .rap5s4o4 .ra4re. .ra6sa. .ra7ti .ra6va. .ra4ve. .re4al .re6da. .re4de. .ree6l .rege4l .re4gi. .rei2 .rei7de .rei5er. .re4ins .re6ka. .re4ke. .re8klar .re8kle .re4kli .re6kn .re8le. .re4ma. .re4na. .re4ne. .ren6sk .ren4t .rep5s .res9s .re5s6tan .rett7s8kri .re4ve. .re4ves .rev9n .ri2d .ri8e .rie5ne .ri6ka. .ri6ma .ri4me. .ri4pa. .ri4pe. .ri4p5o .ri4sa. .ri4se. .ris5ko .ri4s3ø .ri4ta. .ri6te. .ri6va. .ri4ve. .ro4an .ro4de. .ro8di .ro4e .ro8ke. .ro4ma. .ro4mi .ro6pa .ro9par .ro3pe .ro4pe. .ro4sa .ro9sar .ro4se. .ro4sed .ro4ta. .ro4te. .ro4tek4 .ro8va .ro3ve .ro8ve. .ru8ga. .ru4ge. .rug9le .ru8ka .ru4na. .ru4ne. .runes6 .run7g .ru4se. .ru4sk .ru8va. .ru4ve. .ry2e .rye7ne .ry6ke. .rød2 .rød7s4 .rø8le. .rø4re. .rø1v .rø8va. .rø4ve. .røy7e .rå8da. .rå4de. .rå4en .rå8er. .råg8 .rå6ka. .rå4ke. .rå3k4l .rå6na. .rå8sa. .s6 .sa4ge. .sag6n .sa4la. .sa4le. .sa4me. .sa4mer .san6d7 .san7d8e .san7d8i .san8s7ku .sau6e .sch6 .se2b .se2e .se4i .se4k5l .sek4s5o6g5 .sel4v5 .sel4v5i6 .se6na. .se4ne. .sen7s .se4ra. .ser7vel .se4te. .sha9ke. .si2d .si6er .si6ga. .si4ge. .sik5k6e .si8la. .si4le. .si4ne. .sinn6s5 .si4ra. .si5str .si4va .si4ve. .sje4i .sju5o6g5 .sk4 .ska7ka .ska5ke .skat4 .skei5d .ski6n .skinns6 .sko7de. .skog5u .skritt9s8 .skudd5s6 .skuddså7 .sku6m5 .sky6f7la .skå5ra .slim5 .slotts5 .slu9ka .slu5ke. .slø5se .sma4s .smas5k .smo9g .små3 .små7k6 .små9l .små5t4 .småt5t .sn4 .sne3 .snitt5s6 .snø3k .soa8 .so8de .somma4 .son6a .sop4pa .sor4t5 .so4ta. .s8p6 .spa5ra .spe6e .spi9la .spri5s6 .st6 .sta9ka .sta5li .stat4s .sted4s .ste4i .stein7a8 .stein7s8 .stem4m .stev9na .sti7me .sto5ne .sto6ra .strek5s6 .stu8a .stu9va .stål5l6 .sund5s6 .su4ri .su5te .sv8 .sva5la .sva5ra. .sva5re .svar5s .sver8n .syd5 .sy5d6e .sy6na. .sy4ne. .sy5ter .sy3ti .sy6v5 .sy6v5o6g5 .sz6 .sæ2 .sær1 .sær3e4g .sø8ka .sø4ke. .søl6v5 .sør3a .søye5 .søy6en .så5pen .så3re .t8 .ta8ke. .tak9r .tak5sk .tak9s8p .ta4la. .ta4le. .ta4les .tal4li .tam5m .tan5de .ta4p5r .ta4ra. .ta4re. .ta2s .te4e .te6i .tei9er .te8ke. .te4ma. .te6o .te8ne. .te4se. .te7si .te4sta .te4str .th2 .ti8a .tid5r .tid6s3 .ti4de. .ti4e .ti4g3r .ti4ki .ti4l5 .tili6 .ti4med .ti4na. .ti4ne. .ti4p5l .ti4s .to5arm .to6en. .to4er. .to6et. .tokk8 .to6le. .to6na. .to5o6g5 .to4ra. .to4re. .to6reb .to3ro .torsk6e5 .tor4s5v .to5rye .to4str .tota9la. .to5t8 .to8te. .to6va .to4ve. .tr6 .tra7c .tre3b .tre7p .tre5o6g5 .tre6skja .tre3s8ko .tre3sp .tre5s6t .ts2 .tsj2 .tu4en. .tu6na .tu4ne. .tu6ra. .tu4re. .tu8ve. .tve6n .tver6r5a6 .två7g .ty6da. .ty4de. .ty8et .ty8re. .tyr8s9 .ty5ter .ty5ti .tæ4re. .tøv9d .tø6ve. .tø9ver .tø5vet .tå5ker .tå4le. .tåp9n .tå5ren .tå7ret .u5a6 .u1b2 .u6berg .u3d2 .u7de .u3e6 .u4er. .u6era .u4ere .uf4f .uf8sa .u4ga .u5gi .ug6la. .ug8n .u1i .ui6m .u1k6 .u4ka. .u6ke .u7kn .u3le .u4le. .ule8k .ulen4d .u6lende .u8lene .u6let .u4lin .ul6ka .ul4ke. .ul4la. .ul8le. .ul8ma. .ul4me. .ul4ne. .ul5t .ul6te .u1lu .ul4v5i .u1ly .u3lå .u5ma .umu7 .u2n .unde6ri .und5r .une8 .u5nek .u9net .un4ge. .un2n .unn3s .u3no .un4se. .un4t .u5nu .u1o .u1p .u4pi .up2l .u2ra .u5raf .ur6an .u6rane .ur4d .ure4n .u4ret. .u6rets .u2r2i .ur4ke .ur6na .ur4ne. .u1ro .ur1s .ur8ta .ur4te. .urte5m8 .ur6tet .u5rut .u3ry .u5rå .u1s2 .u4sa. .u4sas .u5se .u3ska .u5sn .u7sp .us3se .us6t4 .u7stek .u5stel .usy5r .u2t .uta4g .ut5age .u3tak .u4ten. .ut5esk .ut6e7sko .u4ti. .ut3kan6t5 .ut4ne. .u5tol .ut3o6v .ut6rer .ut6rov .u3trø .ut6se. .ut4si. .ut3t4 .u3tu .v6 .va4da. .va4de. .vai4 .va4ke. .va6les .valg5s .va4ne. .van4n5 .vann5s4 .va6reta .vari4e .var5sk .ve8en. .ve4ga. .ve6ge. .ve4g3i .veg3s4 .vei3g4 .vei3s .vei4ta .ve4l3 .ve5l4ar .ve6l5art .vel5d .ve4l3e .vel5l .ve5l4os .ve4l5ov .ve4ly .ve8læ .ve4ne. .ve4net .ve4ra. .ve4ras .ve6re. .vermo9 .vers4t .ver5ste .ve4sl .ve4st .vete5 .ve8te. .ve4ve. .vi4da. .vide4 .vi6de. .vi4d5å4 .vi2e .vi4ka. .vil5l6a5l .vil5l6a5t .vi6ma. .vi8me. .ving7s .vin5n .vi4sa. .vi4se. .vi6seri .vi4ta. .vi4te. .vi5tr .vok4s3 .vok5s6e .vo6r .vo6ta. .vy4 .vye5ne .væ4ra .væ4re. .vå4d .vå4r3 .vårs6 .wa4r .wi6e .xe2 .y6 .ye4 .yn8da. .yn4de. .yn6ge. .yn8ka. .yn6ke. .yn4kv .yns2 .yp8pa. .yp4pe. .yr8ja. .yr8je. .yr8ka .yr4ke. .yrkes5 .yr6t .ys4 .ysterie8 .yt9ren .yt5t .yt6te. .yv6 .z4 .zj8 .æ8 .ære4s5a .ære4st .æt4te. .ø6 .øg8la .øg4le. .øi5 .øi6e .øko5 .øk6ta .øk4te. .øl3ed .øl3s6 .øl3v6 .øm4me. .øres8t .ør4je .ør5k .ør8na. .ør4ne. .ør6ski .ør9sm .ør3st .ør8ta .ørt9an .ør8te. .øs2 .øs4t .øv4d .øve4r5 .øve4r6s .øv4re. .øy6de. .øy2e .øyele8ge. .øy5ene .øy4n .øy6na .øy6ra .øy4re .øy8rer .øy4str .å2 .å6e .å6f .å6g .å6k4 .å8l .ål6t .ål8ut. .å8m .ån8da. .ån4de. .ånd6s5 .åp6na .års3k .å6se .ås3k .ås7l .ås3m .å3ste .ås5v .å4t .åt4te. .åtte5o6g5 .å6v a1ad 4aaf a3aft aa4g a1aks aak5v aa3la aa2m a1a2n a6an. aans9t a7antr a1ap aa4ri6 aarie9ne aar5n aa2s 3aase aa5t6h a1av a6bab ab7av ab9b8l ab4but abe4lei abel5t4 abe9na. abes9ka 4abev a5bh abie6 abi9er abi9la a4bist ab1l ab9lara ab4lok abl7u a5bo9a abo3b abo3e a3boer abo3kl a3bord 5aborte ab1r ab8re ab2sl abu5e a4buel a4buf a6busk a4bute a4by. a4byb a4byk aby3r 8ac aca5 a6ca. ache3a ack3 a1co 6ada a5dal ad5ant a4dart ad9da a2deb ade5i6s a2dek a4del a4d5elv a5dend a3dene a2deo a2dep a5der. aderle7 a2des a5de4ser a3desl a3det. a3dets 3adfer 1adg ad8ge adi4ene ad1j 1adju 2adl 1adm ad5n ado7a a4dob ad7opp 4ador a7dora ad5raf ad7ran a2dre ad7rel ad5rep ad3ret ad3rid ad1ro a7drø ad4s5amt ad4si adsle6ge. ad5s4let ads5te ad5s6tek ad3str ad5un 1adv adva5re 2adve a4dy. a4d5øy 2a1e2 4aea a4ed ae3de aed7r aek5t a4el. ae5la ae3li ael5o aen5t a3ep aes8ke. aes4t 6afa 6afc a4fe. afei5 af4fan af4fei affe3s af7fi. affi3d af5f4u af4i afia1 afi5an a2fib a6f5inn afi7re a4fiti a5fjo af9la. af9lar af3le af5li a4frik 6afo afo7ra. afo7r8e afore5ne afra5s 1afri afs1l aft5ei af4t5e4l af6t5o aft1s4 af5yr afø4r afø5ri 4aga a2gaa a5gae a4ganf agang7s8 a4gart a5gas. aga6ve. ag5de a7gelen a2gem 3a4gent age4r3a age6rek age5risk a7gers a5geru age5s2 a4geta a4gé ag5gar ag4gas ag5ge agg1s2 agg7u ag6gut a4gi. ag5id agi6s ag1la ag4lem ag6lesa ag5lå agmo8e agn5om 4ago ago5d8 ag1or a5gos a3got ag5ov ag7ras ag1re ag1ri 4a3gru ag1rå ag4samb ags4ang ag3s4ei ag4sel ag3sem ag5s6ing ag6sju ag4ska ags4kul ag2sl agsmå6la ags3tr ags3t2v ag2sy a6gu. agu3ay agå8va agå8ve. a1h a5hi ah4n5 ah4v ai1a4 ai3e2 ai3er. ai4is ai5ke. ai5ko ai9kv ai5ne a3ing a1inn ai4n5o4 ai1ro ais4e ai4s3k aisk2h ai8sm ais6om ais5s ai5s4v ai5ve ai5ø a1j aja9d a7je a8je. ajes7 a4jé a4ji a6jl 6ak. a1ka 4aka. 1a2kad 6akaf ak3aks 6akan aka4o5 4akar ak6arb aka4t5r ak4au 2akd 2ake a9kec a2keh a3kei5 a6kek akel8e akelei9er ake5l4i ake4rek a4kerø ake5sm akes6p a8kete akhe6n 4a1ki a6kid a6kik ak7ind akis1 2a1kj akk6and ak5ke. ak3ken akk5erst ak4kes akki4 ak5kim ak4k5is ak6kj ak1ko akk3ol ak6k5ri ak1ku ak4kul ak4k5v 2ak1l ak3lev ak6lik ak6lus 6akn ak5ne a5kno 2a1ko ak5om. a5kon a7kos ak1o2v ak4pe6 akra8sa ak5reg akregi4 ak3res ak3ro. ak3roe ak1ru ak4s5and ak4sek akse3l4o ak4s5elv ak4ses ak7s6id 3aksje ak2s1k ak7sku ak6sl 4akso 4aksr aks5ti ak5stol aks4tr akst7ren 4aksu ak4tab ak4tai ak4tak akta6le. akt5all ak6tam ak6tans ak4tap ak4tas ak4tav ak4teg ak4tek ak5teme 4akth 7aktig ak5tit aktle6ge. ak2tr ak6tre akt3rå akt5s4la 5aktue akut2 2akv ak3val ak5øl a5kå 8ala. al7adr ala4g ala9ga a5lagm alag8ra a5lah a1lai al3all al3a4me al3ana a3land a5lande. a5lane alan5gr al3anl al3anv ala4o ala5pr a5lar. a3lara a5laren al3ark a7larl 3a4larm al5arr a5lars al3art a7larv al3a4si 2alat ala7tr 4alau al5auk al1av ala4va al4ba. albo4g albu7er. 5album al3de al7der 4aldo ald3re 2ale a2lef a2leg a9leg. aleie6n a9l8eik a5leke a4leks a4leli a2lem al5e4mu al8en. a4l3enh a4l5en5tr ale4pos a7lept a4lered alere6de. a4le5ro a4leru ale1s2 ale7se a4lesk ale6s5kr a4lesl a6lesu a4leta a4le3te a2leu ale5v a4leva a4levi 3alfab 2alg. al3geb al2gu al4går al3ill a2lim a9lin. ali5na. a4l3ind a4l3ins al3int al9ja. al3je. alj5end al3jer al1jo al4jor al2j1u al1jø alj5ø6v al9kera alk7s6 alla4ga alla6ge. al4lap all5art al5lea alle6ge. al4lek al5len. all5erst alle3s4 al4lest al5let 3allia al4lid 5alli5e alli9ne al6list. al4lo3m all4sen all4sti al6lul al6løs. al4løse al8løst al6lå al6mek al4met 4aln a5lo. al1o4b a5loi al1om a1lon al3ope al7ord alori5 alo6rit al3ove alow7 alp2 al3ps 2als al7sed al9skap al7skare als1l als5lø al2sn al6spu als4te als6ter 6alsu alt6ak alta8le. al3ted al7tema 5alterna alte4t al4t5eta al4t5ete al4t3op a4l5u4k alul8la al5und alu8re. al5va. alv5aks alvak8se. al4ved al5v6er al8v9er8m alve5s al9ves. alvi8se al1vo alv3s 6a1ly a2l5y4te alø5se al3øv a1lå al7å6t a4mah ama5is a2mak a5maki am3aks a2mal am5ald a3man a3mar. a5mara a7mas. amaso7 3a4matø am4bar 3ambas am4bat am5be a2mei am3eie a3meis a2mek am3eks amen8de. amen4s3 amen6t7arv ame4ram a4meret 3a4meri 4amerin ame5u amhu7 2ami ami7na ami7ne amisk3 amis4ku am4lese am6lest am4mad 6amn. am4ned a2mo amo5e am1op am1or amo6ve am4pap am4pare amp5ei am8peria am6perie ampes6 amp7inn am2p3l am5p4let am4p4re am4pun am2på amru4 am5rå am1s am7s6ku ams4l amst6 am4s3tr ams9ut ams2v am4s5ve am2sø am3ti amti5da 5amtm am7tv am6ul am5yr am5øy 6ana. anak8te. ana3la anal4f 3analy 8anan a3nane a5nang anant8 4anar a6narb an5art ana3to 6an7au anaus7 an9av. 3anbef 4and. an4da5m6 anda5ta an4dek an5den anderle7 an9det 6ando an4dos 4ands and4sel and8send and7slet and5s6tre a2ned an5egg a4n5elv a2nem 2anen 2aner ane3ru a5nes. a4nest ane5sv an5e6tika a5netike an5e6tikk an5e4tis a2nev 3anfal anfø5re. ang4e an4ged an4g5enh ang5erme an8geste an4gi. 5angiv ang5of an5gos an4g9ra an4gre. an6gres an4gret an4g3ry ang4sm angs6tro angs8t9rå angst5y ang5sva ang6søy ang4t5re ang5t6ve an4gun an4gå. ania7 a6nib a4nisj 4aniv an4kana 4anki 4ankj an4kob an4kop an4kos an2k1r ankra8na. ank3re ank3ut 8an2kv an4kø an6k5å6 2anla anland6 anlø9pa ann5ans an6neme an5nen an5ner an5nid an4ninn an4nom 5annon an4nov ann4sei ann4sid ann6s7kå ann6sl ann3st ann5sta ann4s3u an4ny an2nø a3no. a9noa. ano6deb 2anog a7norm a6not a2no4v ano5va an3ove anri7ke ans5aft ansa7ka 4ansan 3ansat an4sek an4sent anseri8e9ne an4ses 3ansik ans5ind ans5ins an4ski an3skj ans4k3l ans6kun an5skø an6slø an4sn ans5or an4s3pi ansport7s6 an1st6 6anstar ans4te4 6ans6ti 2ansu an9s6und 5ansunda 1an1sv 4ansve 6ansy an4så anta8la an5t6and an4tans an3ted ant5emi 5antenn an4tesl anti7kl an4tim an5toi ant5ord ant5rab ant7rom ant5ryg ant5s6 an4tul antus4t 2anu anus7a an5ut 3anven 6anvin 6any a4nya a2n1æ2 anær8 2anø a2nøk an7å a1o ao9a aog9 a2oi ao6k6 aon8de. ao2p ao4r a5pea a7pé a1pi a2pia ap1id a6pik a6pins a2pio api6r5 api7r6e api7se ap1j a1pla a5p6las ap3li ap9lo ap2ly 4apol a4pon a4poo apo3p apo5s4ti a2pot 3ap3par 4appar. 6appare app7esk ap5plas ap4ple ap5pli ap6pri ap3ra ap5ren ap5ret ap3rin ap2s1 apsa4 ap3sel apse4s ap8s9l a3psy ap4s5ø 8apu a6p5ut a1py ap7ø a3p8øls a5på. a1ra ara9bi ar5aks arak5t ar3alt a4rami 2aran a4ranor a4rans a4ranv 2arar a4r5ass ara5te. ar5aug ar7auk arau9ken ar7avh 1arb 2arba arba8ne. 6arbeh 4arben 6arbet 2arbi 4arbj 6arbl 2arbo arbo8da 2arbr 2arbu 2arby 2arbø 4arbå ar7deb ar6deli ardfø5re ard3re ard5sta a1re 1a2rea 4arear a4reb areba4r a2red a2ref a2rei are3in a2rek a6r5ekt a4rela ar7elek a4r6eli ar7emn a5remo. 3arena a6r5eng a4reni aren5tes a2reo a2rep a6rerel a4r5erfa a6rerk a4rero a6rerø a5res. ares8ka ar4et a7reta. a4rev ar7e6va ar3evn arev6ne. 8a1ré 6arf ar7g6h ar5g6i 6argj arg4l ar7go arg5stj 2a1ri aria7ne a3rib ariba9 ar5idr a4rim ar3inn ar3ins arins9k ar3int ari3se arise4a a4risto a2riv ar4kau ar3ke ar4ke5s ar5kha 3arkit 3arkiv ar4kle ar4k5løf ar6kod ark6ste ark4str ark7veg ar4køy arla4ga ar4map 5armbå ar4medi arme7t ar6metr ar4minf armle6ne. armå6la 2ar2n ar4nad ar4nal arneva7la ar3ni ar3no ar3nu ar3nå a1ro. aro8de. a5rok a1ron ar1op aro6pa a4r1o4r a1ros ar7ost a1rot ar3ove ar6ped ar9po arp5ret 1arra ar5ree ar7resk arri8e7 arrå6da 2ars arsa6ka ars5ans ar3sel ar6s5ers ar4sin ars5kam ar5skar ars5kes ars7kre ar4spr ars6tr ars4vei ars7æ arta4la arta6le. ar3te ar7tele 8artets art4ha. art4has ar4tika 6ar4tim 4artn 4arto ar4top 6artr art9ra ar6trin art6s5t arts5ø 6artu 8arty ar4tyv ar1ul ar1un ar5u6r a1rus ar5utb ar5utn arve3s ar6vete arvi8sa arvi8se. a1ry ar7æ6 arø8ve. ar1øy a1rå arå8de. ar7åp a6r5åt 6as. 4a1sa asab4 asak4 a4salo as6an as7aug asbe2 a1sc a2se. asea4 a2sed a2seg a2sek as4el ase5le a2sem a6senet a4senk a7seol a2se5s a6sest a4sete a2se3u as2h as5hu a4sib a2sip a2sir a7sis. asis5t a2siv as4ja a6sjett as5jor as3kar ask6et as5keti ask2i as5kis a5skj as5ko. as5koe a4s5kopi as3kor as3kot a1skr as7kra as3kul a5s6kula as6kule ask9u8t as4kv ask5øy as1l a5s4lag asla8ga as4lev as4lit a1so a4so. a2s5om as5ov as4pan as3pe as7pis as5pl as9sa. as4sab as4sal ass5ald ass5alt as4sam as5se. as4sed as4sek asseri7e6 as4serv as4ses as6sifr as5sing assi3s as4sit as2sj as6s1k assku6le. as2s3n as5so. asso9a as7sos. as6s1p as2s3t as4stan as4str ass5tru as2s1v as4sys as4søk as2s5å as1ta as6tab a6stande a4statu as5te. as3ted as4teg as4tek as4t5enh a1stj a9stof a5stok ast5ov ast5ren as4tro as9tua astu8ve. ast5ø4v a1su asu3n asu9sa as1va a6sym asyn7d as7øye as5å 4at. 4ata1 a5taene at6af ata8ka. ata8la. a4tang ata9rar a6t7arv atas4 a5tas. atat8 a2tau at5avh atch5 a2tea a2tec at7edd a2tee a4tei at5eid at3eig ate3in a4teka ate5k8e ateke7ta a6t5ekte ate7le at3emb 4aten a5tene. a4teni a4tenu a2teo 4ater a5ter. a6terat a8terek a4teril a2tes a4t3ett at6e5u a4té 3atfer at4ha. at8has 4ati atik6ka atili5 ati5nea ati4rep ati8sta at3jo 5atlant atl9øy 3atmos at4nel ato5a ato5gr at1oi a2tom a6t5oppr a1tor a5tose a3to1v a1tra at5reg at3ren at3rer a4trif at3rin at5rot a9tru at5røs at5røy 2ats at3ser at7sje at7s6kat at7skj ats6kul at2s3ø 4att. at6tat 4at5te. at5tens attfø7re at4tid atti4s att5ise at3tit att1o att7o6p atto6v at1tr at4traf at4t3re at6trin att3s6k att5s8l att3sp att3sv at6tys at2t3ø2 a1tu atu5e4 a2tut at5v atvi5er. a3t3w a1ty atyr8ke. a5t6yv a1tø atør3s atø9se a4t5øy a3tå. a7tåa a1tåe at5år at5å4se at7åt8 4au. 8a8ua au9ar. 4au5b auba6ne. au3c au5da. au9det au4di. 4a6ue au7en au7er aue5re au3est au6e5ta au5e6te. au4gal au4gas au4gel augele8ge. 5aug2n 3augu au5i au5keli au5ket auk5la 1auk7s6 au5kve au6las au4lat aul5l aul8la au5lu au9men au6mo aum5s6k aum7s4t a5und au5rae aure5s au5ret au5ri aur5s6 au1ru auru4e au1sa aus9kj au6skr au1so aus5s au6s8tas aus8tett austi6s aus6t7ise aus6ton au5str au6stri au1su au4sun au2s5ø4 aut6a au3ta. au7tar au5te 1auto auto5v au3t4re au4ty 2aux a1va av5ab a5vae ava7g 6aval av3alv a4v3and av3ang a4v5anl 3a4van5s a9var. av3art avar6ta. 4avas 5avbi 1avd 3avdel 2a1ve a2ve3d2 a5vede. a7veil ave3in a2vek a4vela a4vele a5veleg avens4 a5ver. ave7ras aver5d a6verei a2ves a2vev 1avfa 1avg avi4ar 4a5vig a1vik avi9ke a1vin a4v5int 2avir 5avisa avi5sa. 3a6vise av5ising avis3t a5vit avlu9t avlø5se 6avn av7na av4nes a1vo a4vok avo3r avo4v av1r av4res av5ri av1sa av5seg avs2i avsko7g 3avsni av1s2p avspe9g4 avs4te av5su av1s2v 1avt avta9ka 2avu 1avvi av3øl 4a1vå a6v7å6l a1wa awat4 a5we awe9ne a1wi ay2a ay7ane. ay5ar ay9s8t a5y4t a5zu azz3o a1ø a7å6 1b4a ba3a baby5 ba4bys ba5cl ba2d ba4da. ba7dan b5add ba8de. ba4deb ba5den. ba7dens ba3di bad1s 4baf ba2k ba5kan7 ba3kar bakars9 ba3ken ba4k5end baken6de. ba3ker bake3s ba9ket. bak9ett ba3ki ba8ki. bak6kers bak6ko bak5kr 4bakr bak4re ba5kri bak3ro bak3sm bak5sp bak5s6ti bak5str bak7t6 bak1v ba3la bal7ak ba4les ba4li. bal3j bal4lag bal4lan bal4led bal4leg bal4lei bal4lev bal4lig bal6lov ball5s6 bal6læ ba1lo bal5t ba1lu ban4a ba4na. ba5nan ba5nar ban9da ba4nel ba4nes ban6kap ban4kor ban2k3u bantu5 ba3re baret5t ba3ri bari6e7n bark5s bar5skr bar5tr ba5ru ba5sen ba4seru ba4set ba3si ba2s1k bas6sak bas4san bassi4 bassis5 bas4so bas4st bass6tr ba2st ba7s8u ba1ta 2ba1tr bat6ti bau9la 6bav ba5z 2b1b b3ba b6bak b4b5arb b6base b3be. b4beb b4beda b2bef b4beg b6beh b2bei bb3eie bb5eig b2bek b6belo bbel6t3 bbelte4 b4bem b9bene. b2beo b3ber b4b5erf b4bes6 b7beska b6beta b6beten b4beti b6beto b6betr b2bev b8b1h b3bi bbi9e8 b4b5inn b2b1l bb7len bb5op bb5rek bbu9ra bb5ut. bb5ute b2by5 bby3e bby1k b4bø b6bå 2bc 2b1d b2dek b7den b4dep 1be be2au be4bo. bebo5er. bebo9k be4da. be9dar be3der bedi9e8 be4dre bed5red bed2s1 bedy9ra be1då3 2bee be5ed be6ef b4ef befa5re be3g bega9 be4ga. be4gi. be4gn be5go be4g5re. be4g5rene. be4gå. be6ha. beha7g behers7 4behu behå4r be6i be5ke be2k3i bek6kel bekke5r bek4kes bek6l 4beks be4l3ab bela9ga bel5eie bel5eig bel5ein be4lek beli9na beli9v belle5sa bel5let bel5læ be2l1o bel5s4p bel7s4t bel4tag bel4te5s bel4t3ø bel3u bel5v belæ5re belå7ne be4na be5nat be3ne 4bened be4nest ben5gu be5ni ben5s4i ben5skj ben5sp ben5te 2bep b4er 4berai be7ras ber5d be4rep 8berest bere5te ber4ga ber4g5ende ber5ges berg3j berg3l berg3o ber4g3å be5rib beri5ke be7ris ber6kl ber5na ber5ne be1ro be4ro. bero9a berri6 ber5te ber5ti be1ru beru9sa berø5v b4e1s2 5bes. be4se. be5s4i 4besik 6besj bes5ke bes6k5n be3sn bes7ne 4be3so beso9v be5sp bes3s bes6s7a6 bes6sel bes7si bes7tens bes6tes be5stes. be6så 3b4et 5bet. be4tab be3te 4betei be7tes beto5ne be6trar be6tre. be4t3ri 4betu be4ty. beva5re be6ve. bevi5se. be9vo bev9r 6beå beån9 7bé 2b5f 6bg 2bh bhu1 1b4i bi5ak bi6bla bi5ce bi1d bi5dee bi8dé bid6r bidu8 bi5el bi6ele bi5erv 4bifa bi5g bi3ka bik1k bik6ki bi5k4l 4bi7kr bi6la. bi4las bi4lau bi3let bilet5r bi4lin bil3j bil5la billa8ga bil5leg bil5m6 bil1o 6bi5m bi4nans bingo5 bin4gol bi7no 4b5int bio7 bi3o8m3s4 4bip bi4ri5 bi7ris. bir4ken bi1ro bis2a bi3se b5ish bis6hi bis7ke bi5s4la 8bisn bi4sp bis4p5i bis5se bi1st bi5s6ta bis4til bis5tru bi3s4v bi6ta. bi4te. bi5tes bi8ti. bi4tre bi6tri bjar3 bjek4t5o bjø6r 2b1k4 b5kh bl2 1b2lad blad3a bla6f3 bla8ga blak5r bla5me blan9da b4lank blan5ke b4lant b1lar b8larar b3lat bla4u b4lef bleie5 blei5er b4lek ble4k3a ble5kes ble4mo b3ler ble7r6a b6lesa blesse9ne b4lest 2blet bli9ke bli5ma bli5me blings6i blis3s b5lj blja4 blo6dr 1blok blom5m b6lu blues3 blu9sa bly7gl blæ5re. blå5n blå3r blå7sa blå5se. 2b1m 6bn b3ne. b3ner b7nes. b7ni b2o boa5s4 bobba6ne. bob5by. bob9bye bo2bl bob7la bobs4 bo3de bo6din bo6d7r bo2dø 4boef 1boen bo2er bo4et. 2bo3f6 bo4gel bogn7 bog1s 2boh 2boj 3bok. bo2ka bo6kel bo4k3et bok1i bok1k bo6kop bo6k5ri 5bok1s boksi8da boks4p bo2ku bok3ve b4ol bol5eie bo7li boli7n bo7lo. bo5loi bo4l5o4r bol5s4p bolst6 1bomb bom4bel bom5m bo6mo bom1s4 bo5nap bon5ato 4bonn bon5ne bons4 bo5nus boo6 boom1 bo1p4 bo1ra bo4ra. bo6re. bo7rel bo3ren bo3ret bo4rete bo6ri. bo3ro bor6t7ef bor6tei bor4tes bor6t7et bor4ti bort5s6 b4o1s bose8te. 3boska bo2sl bos5se bo4sto 1bot bo4ta. bo4tak bo4tal bo6te. 2bo7to 4bot6r 4bot4v bou3c 4bo1v bow4e bo6y 4bp b7pl br8 1b4ra bra5ka brak5s bra5se bred5sp brei5e brei3s bret7te b6rev brevi9er. bre4vin bri5a b4rio b2ro bro9ar bro1s4 3b4ru bru5ke bruk4s3 bru4na bru7na. bru5nes bru5pl bru7ren bru5sa brus4l 1bry bryn4s b4rø brø5de bråe6 brå9ne brå5te. 6b1s bs4e b5s6e6a5m4 b4s5el b5s6i bsk4 b4sli b2sm b2s1of bs2t6 b6st7f b7s6v bså5 6b5t b7t6s 1b2u bu4ar 4bub bu3da bud5d6h bu3de 4bu3em bu4en. bu9ene bu4er. bue5s bu1i bu6is 6buki buk3l bu5la bu4le. bul3le bun7de bund4s3 bun8ge. bunk3r bunnla8ga bunn3s 2bu3o bu1p bu6ra. bu4re. 4bu3ro bu3ru bus6e bu4se. bus4h5e busk7ø bus6sek bus4sel bus6sent bus6set busse6te. bus6sj bus4sn bus4sp bus4st buss3v bu1st 4bustr 4busy bu1ta bu4tal bu7tem b5utg 4butst bu2tu bu1tø 4buv 6buø 2b1v 4b5w 1by bya2 by5al by9are by7dep by4en. by7ene by5ens by2er by3ers by4ge. byg3l 3byi by1lo 4bylø by5n by1re by6re. by1s 5bys. 4byse 6bysi 6bysp byst4 by4ste 4bysv by5tar by4te. by1tr 2byv bæ5rar bæ6rar. bæ4re. bæ5ren bæ5rer. bæ5rere bæ5res. bæ5ret. bæ3ri bæ4r5is bæ3ru 1b4ø bø4e bø7ens bøf3 bø4kes bø6la. bø6le. bø2n bøne5 bøn6nes bøn7o bø6re. bør4s5k bør4sp børs3t børs8ta. børs3v bø5ta bø1v bøy7ar bøye5 bøy4ene bøy4es bøy4et 1b4å bå4de bå9des bå6e bå7ene bå4la bå1re bå6reg bå4rep bå4s3te bå6s7ti bå6t5j bå6to båt5r 1c4a cab4 ca4e ca5le ca5me ca5mo ca4pe. cap1r ca6pris ca3ra car5n ca5ro car4te. ca2sa3 ca6set cash5 ca5s4til cas5to ca1t cath5 ca4to. 6cb 4cc c1ci c2d cde6 cebo9 ce3d ce1i 1cel ce5le cel4les cel4lev 3cen. ce4ned ce4nee ce4nem ce4ne5s4 ce5nes. ce4net ce4nev 5cens cen4ti9m cen6to ce5o4 1cer cerba6ne. ce3re ce1ro5 cer3t 6ceru cest3o 2ch. cha5le 3cham4 cha7ne cha5t 2chb 4chei chel5s che7te chi4li 4ch3h 2chm 4chn ch5ne chom4 cho5s6 2chp 8chs 6cht ch1v ci1c 3cid ci2e cie8n cie2s5 cil5l ci3ne ci5ta 2c6k ck5ar. ck5art ck1en ck3er. ck4ere ck5e4t3 ck5et. cke8y5 ck1i ck1k ck1o2 ck7r ck5s2 cku6 ckup3 ck9ut c2l clai4r5 cly4 c1m cmini4 coa6 coat5 co6bid 1co4c 2cod 6cof 6cog co4la. co4lab co4lak co4la5r co2m co5ma com5t co6n5os con5s con7t co2o co7pa 2cor co3r6a co1re co4so 4cost co4ver c1pr cr8 cras4h crack4 cre2e creen7 cros2 5cru 4c4s 4c1t c6ta cty5 1cu 4cu. cu5la cu5le cu5lu cup1l cu6po cup1r cup7s cu4på 2cur cures4 cu6t cy2a cy6p7 cys3 c6z cæ5 1da 4daa 4daber 8dabo d5abs 6d5adel d4adg dadø4 dadør5 4daef 2daf 5dagb da4gev 4dagj dag7l da6go. da4g1r da6gun 4dagå 4dahe 5dahl da1i 2daka 4dako 4dakr dak4se. 4daktig da5kv 7d6al5j da1la da8la. da4las 6dalau dalbu8er 4d5ald da4les dal6so da1lu da4ma. da4man da3mas da4me. da3men 6d5ameri dame3s dame5t6 da3mo dam7pe 5dan. 6danal d8ane 9dani 2d1anl 3dann dan5neb 4danno 7dano d4ans. dan3sa dan4sel dan9s8kan 4dansv 9dant. 9danti 8dany 2da3o 2dap da3pe d3app 3dar. 5dara 2darb dard3s4 4darea da4res d5arn da2ro dar5os. dar5s6 dar4ta. dar6va. dar8ve. 4dasei 2dash 6dasi 4dasjef da4sk da9sko 6dastr 6dasu data5 4da4tal data6le. datali8na da4tek 7d6ato da3toa 4da5tr dats6j d6aud daud7s8 dau5go 2daut 2dav d5avb d1avl d3av5s 4daø 2d1b2 dba8le. dba4ne. dbe8ta. dbe6te. dbling7 dbo6en. d6byf 4d1c 6d1d d2dad ddag4 d4dak d4d5arm dd3eie d2dek dde4lap dde4l5o ddel5sv d4demi dder5s d4desu ddie8 d7dom d4d1re dd5run ddsa4 dd4sala dd4skap dds5tab dd3s4te dds5tr d2dyb ddø2 ddør3 d4d5øy dd1år 1de 2dea deak3 de2al de7b 6debar 4debas 3debat 2debe 4debl 2debo 5debon. 2debr 3debut 2deby 4debø de1c 5ded. 2deda 6d7edd 7dede. 4dedek 4dedel 4dedia 2ded4r 2dedy 2dee 5dee. de7er 2def d5eff d5eft 2deg 6d6e5ge 5degg de3gl 2deh 5dehavs 2dei dei4d dei4ene 3deig. dei8ge. 5deigen dei4g5r 5deik d2e1in 3deir de5is. de3ist 7de7it 2dej 8deka 2deke 2deki 2dekj 5dekk dekk3a dek4kan dek4kel de6k6kv dek2l 6dekly 5dekni de5ko 4dekod 4dekon 4dekos 2de5k6r dek6st deks7ti deks6tr 5dekt 2deku 4dekv 4dekø 4dekå d4el. 6delad 6delage de6lans 4delau 4deled de4lef 4delei del5ei4d del5eie 4de4lek de5lele 4d5elem de4lest 6d3e4lev 4delid 6delinj del5int 4delis 4deliv del4lap del6lei del4lek del6lerf del6lig d4els del4s5at del3se delses7 del4si del4spo d4elt del6tala del3te del7tr 6deluk del5ve 4dely 4delæ 2delø delø6pa. 6deløy 2delå 2de5ma d3emb 2deme demie4 4demj dem8na. de4mo. de4mog 5demok 4demol demo5no 5demos dem5pe 3demr 5dems 4demu 2demø 2demå d2en. 4dena de7nak 6d5en6den. de5neb 4dened 6denel 4denem 4denet 4denev 6d5engen. 4deni 4deno de4nom d2ens den4sin den4s3t8 den6t5ant 4dentif 4dentit dent3o den4tr dent5s8 den6t5u6 den6tå 4denu 2denæ 2denø de2ob de4og 2deol 4deopp 4de3or de4ove 4depak 4depap 2depe 4depi 4depl 6depu d2er der8am de6rant de4rare de4rark 5de7rast dera5te der3av der5d 4derea 4dered de4r5edd de4ref 4dereg 4derep 6deresi der5est 8derest. 6dereste 4derett de4rif de4ril 5derin de4rinæ der5k der5ne de5rob 4derog 4deros de5rose dero8se. 6de7rot dero4v der5s6n der4sp der3t der5un de5rup 6derus der3v 4derør 2derå de1s 3d6es. 2desa 4desc 2dese de5seg des5ers 4desho de8s9hop desi4s5t 2desj 2desk 9desk. 5deske 4des4le 2deso 2desp 7despl 6de5s6pr d4es2t 5dest. 5deste. des6tem de5sti 4destj 4desto 4destrå 4destu 6desty de4s3tå 6desup des6v 2desy deså7 d2et. 2deta deta8ka. de3te 4detea 6deteg 6detekk 4detel 4deten 4detep detes7 2deti 2detj 4deto 4det6r 2detu 4dety 4detø 6detå 2deu d1eur 5deus 2dev deva8ne. devi9er. 3devik d7ev8n de5vu 2dey 4deø 2deå 2d1f dfø6rarar 2d1g4 d4gel d5gi dgi6n dgjø6re7n6h d3go 2d1h dhav4s dheim2s5 dhu9ga dhø4r 1di di6ak di5alg dia5li di1ar dia3re dia1s dia7sp dias6t diats4 2diav 2dib did5ri di7ell di5en. 4di5end di1er dies4 3diff diffe5 3diful 4difø di8g9and di4gat di3ge4s5 dig7g 2digj dig8la. dig6le. 4digren dig5ret 4digru di2gu 4dih 4dii 2dij di5ka di8ka. di5kem 2dikj 6dikn 2diko 2di1kr dik7v 2dili dil4les di5ma 6dimed 6d5i6mel 4dimes 4dimet 2dimo 4d5imp 4dimå di5na 2d1ind di7nen 4d5ingk din3gr ding8s5en ding6s5er din8g9å dini4 di4ni. 4d1inn 2dino 2dinv 4dinø 3diog 7diol dio3na dio4no di3ori dio5tr 2dip 3dipl 4dired 4direg 4d5irs 5dis. di6sc di6sed dis4i disie5ne d6isk dis6kam di4skj dis6k7l di4sk6o dis5ko. dis7koe dis7ku dis5s dis1t dis7tik di5sv dis4vi 2disy di4tal di7te 4ditek dit4tet ditt3r di9us. di4va. 4dival di7van 4divek div6i 2divu 2diøk d1ja d1je. d1jen djer5ve d7jes. dje9ve d6jingan d6jingar d1jo dju8la. 5djup 6djupar d4jø. 2d5k2 dka8ra. dki6 d5kj dko2r dku4le. 4d1l4 d3la dla4ga dland7as dla6te. dla4v d4ledi d2lef d4lega d7legar dle3ge dlei7er. d5leka d2lel dlem4st d4lenet d4leru dleva8ne. d5li dli4f dli5ke d5lo dly8se. dlø8pa. d5lå dlå9re 2d1m dme6la. dmo4e dmors6 dmo8s dmø4re. dmå6la. 8d1n dn6a dno8de. 1do 2doav do2b3 4doba do3be 8do9b8lan 2dobå do4da dodø4 dodør5 4doeu 2dof d3off d5ofr dog6med dog4me5s 2dogr 6do5i do3ki 4dokine dok6kan 4dokn do5le 4doled doli8ne. 4dolinj 6dolis 4dolj dol5l4 4domes do5mis 4doml do4mo dom7p 2domr dom8sa dom8s5e6 dom6s5i dom4s3k doms3l domsla6ga dom4so do4mu do4na. don5g 4donke 6d7on6kl don5st don5t4 2dop do4pa. do4pe. 3dopi d6o1ra do5ran 2d1ord dor4da do1re dor6gest d5orie dorm8 do3ro 5dorp 3dorr dors6 dors7ke do1ru do7rye 5dos. do4se. do4set do1sk 6do7s6l 2doso 4dosp 2dost do3str 4dotr 2dov do5va do5ven do4ver dov9n 4doø 2d7p8 5dq dr4 d1ra. d5raa d9rad. d5rade 1d6rag dra5gen dra6kes 3drakt 1dram 5d6rang 3drap. 5drapa 3drape d3rapp d1rar d6rarar d3rarb dra6ret d5rarm d5rarr d9ra8sa 9dratt drau7ma 2dre. 5dreass 2dred d5rede. d5reder dre7d6r d5reds 9dreg. 9drege. d3regj 3dreie drei5en drei5er. drei7ern d5rej d6reka d7rekk 3drekt 4drel d7relig 4drem d1ren 4drer d3ret. d3retn d6retr d3rets drett4 dretts5 5drevet 3drevn 4dria 3d2rif 2d1rig d2rik d3rik. dri8ka. d3rike 3drikk drik7s6 d9rikt 5d4ril 2d1rin dring6 drit7tr drit5u dritun8ge. 1d2riv 3dronn dro6pa. drop5s 2d1ror 3d4ros dro8ta. 2d1rov dro5va dro3ve 2dru 3druk d1rul d1rum d3rup 6d5rut 2dryk drykk4 d2rys d4røm drø6re. d7røt drø3ve d1råd drå4de. 3dråp 8ds d5sa. d3sabl ds1ad ds3a6del d1sag dsa9ga dsak6se. d1sal dsa8la. d4s3alf d6sall d9same ds1a6n ds5ane ds1a2r d2sas d4satf dsbø6n d5se. dse4d ds1ef d2s1ei ds7eks ds3ela dsel4s5a dse2m ds3emi d6s7enda dsen8de. d4s3eng d5sens ds3e2p d7ser. d6serf ds5erk d4s5e4sk ds5e4st ds3eta dse4te. d5setj ds1ev d2s1i d3s2id d7sida ds5ident ds3idr d7sil ds5ind d3sir ds3i4s dsi4ve d4s3jen d2sjo ds7jor ds6ju ds5kab d4s3kan ds3kar d4skat d1skj ds5kjen d6s5kjøt ds1ko d5skot ds3kro ds1kv ds1l ds5la. ds5lan ds6lem dsli6k ds6lo. d9slott. ds4luk ds3ma d6smo dsmå6la ds3ne ds5no ds1o2 d7somst d4s5os d7sot ds1p d3spek d3spel ds2pi d9s8py ds5s4 dst4 ds3tak d4s3tal d3s8tar d5s4tat ds6tau dss8t d8s9te. ds9teik dste6ma. d6s5temp ds5teo d3s4tig d3s4tik d5stilli ds1tj d3stor d3stri dstu8na d5stund ds3tv dsty8e ds3tyv ds1u2 dsure6 d5s6us d6s7usk ds1v dsva8ne. d3s4vet dsvi6ka. d5syk d3syn dsy6na ds1yt d2s1ø d6sør ds1å6 4d1t d3t4a dta6la. dta4le. dta4s d3tem dte4ma. dt4eng dterle7 dte4se. d5t4et d3ti dt6j d7to d5t4rag d6troc d5t4rø d6t1s2 d3t2va dtø8 dt6øk dtørs3 dtå4 1du dub5b dub5l du1c du9ene du9ens due5s 4dufo 3dug 4dugu duit6 du6ka. dul5l 4duly dums2 du4na. dun7de 4d5uni dun5s6 dun7sta 7duo d3upk 3dur du6ra. du6re. du6rei dur8ta du1s du5s4a du9sem du5s2i du2sk du2sl du2sp duss4 dust4 du2sv 2d1ut du6va. du4ve. 2d1v dva6la. dva6lel dva4ne. dve6s dve6va dve8ve. d7vo dvo8r 2d1w 1dy dy9a 2dyba 2dyf dy5ke. 4dykl 4dykø 2dyl dy4na. dy4ne. 4dynk dynk6s5 dy3pes dy2p3r dy4ra. dy5reba dyrle8ge. dyr5s4 dy2r5u dyr5ø 7dys. dy8sa 4dyse dy6se. dys7s dyst7r dy2t d5z 8dz. 1dæ dærs4 1dø 4dø. død2s1 dø3gr 2døk d5økn dø4ma dø4pe. dø4pen d2ør dør3i 2døs d6øs. dø2st3 døt3 dø9va dø3vel dø1vi 6døvl døv8le. 2døy. døya8 døy8g 4d9øys 1dåd dåd6s5 då8na. 1dåp då8ra. då5ri d3ås. då8sa. då7sem d7åt. 2ea e1a2b e1ad ea2d1i eadli5 e1af ea2gu e1a2k e4akr 6eakt eak6se. e1al. e5alle eal8le. ea4lov e3alte ea2lø ea4m1 e3aman e5amn e1an e2an. ea4ne. e6a5net e4ani ean7n ea4nor e6ans. ean3sl e1ap ea4pe e1ar ea2re ea5rer ea5ret ea5r4i ear6ka. ear8ma. ear4ta. ea2s1i e3asp e1ass ea7ta e5a4tel eate6ren ea4t3et eat8h eat6le e8ato ea5tri e1att e1au eau6ga eau6ge. eau8ra. eau6re eau5s eau8sa eau8se. e1av eav8la eav8le. 2e1b2 eba3d eba4ne. eb3be eb4be. ebe4d3e6 ebei7er. eben6s5k ebers6 ebesku5 ebet5s eb3h e5b6lo eblæ5 ebob3 ebo4da ebo5ers. ebo6kr ebo6la eb5s ebu4e5re ebu5ern ebu6et eby4ta ebø6n 2ec e4ca ec4c e1ce e5cha e3com e2dad ed5ad. e5d4ag edag4s5 e2dar ed3ark ed3arv ed7dela ed4dyr e3de. ed5e6ge ed5eg4n ed3eie e4deks ede8le. e4denf e8d5eng eden5t e6depr ede4ra e4derø e4desk ede4sl ede4sm e4desn ede4s5p ede4ta e6d5ett e8dé e5d6ia edi6a5ne edi4ene edi6gj ed4is edi3si edi4s5k e7div edle6ge. ed8ob edok8se. e4dol ed1op ed1ov e1dr ed2ra ed3reg e5drev. ed3rom e6d5ryg ed7ski ed3skr ed3s4la ed2sm ed5ta ed3te edt6r edu8a ed7va edvi6s e3dyk ed5ynk edyr6ke. edæ4 e3d6ø1r e3e2 eea7 ee3b e2ed ee3di eeg4ga eeg6n ee5gå eei4d eei7ni eek1e eek4te ee3la e5e4li eem6na ee4n e5enb een3in een6k een5t e3epl ee8ra eer3en ee3ri e4er3l eer4me. e6e5sh ees8ka ees6ke. e3e6t eev4ne. e1f 4efa efal6s7 e4fana ef3ank e4fark efar6s5 ef7ea ef5ef ef3fe 3effek ef3fo 4efi e4f3id e5fig e5f4ilm efi7ren efisken8 4e3fj 2efl efle6ge. eflå3 e2fn efo8bi. efo4no 8efr ef2sj ef2sk ef2sp ef6str e8ft ef2ta efta5r eft5ei ef5ter eftle8ge. eft1s4 6efu efyrs5 e3fæ 4efø efø5le eføy9 2ega e3gaf e6gala e7gam ega4ve. egde8l eg7des e5gedo egei9e ege4let e2gem e3geme egen5s 3e4gensk e7geom e2ges2 ege5sp eg9gen egg3l eg8g9ut egi3an egie2 e4giko egis4p e3g6lad e3g4led eg7lesa e5g4lit eg7ly e5g6lø 6egm e9g8nag eg4nem eg6no e7gnå 4ego e4go. 7egoi eg2r egrans5 e7g8rø egs4am egs4ki egs4ta e1gø egøy6e5ne 4egå egå4va egå4ve. e1h ehea4 ehei9e eh5er. e4h5ere eh7ern eher4s ehog5 ehov2 ehy6re. ehø8va e6hå. 2e8ia e9iakt ei9a4n ei7ar. ei4c e8id. ei3d8ar e3idea e3ideo ei9der ei5det 5eidf 5eidg e6i2do e1idr ei3d4u ei7e eie5d ei8eg eie2n ei9en. eier3a ei4ert ei6es ei1fl 8eig. ei3ga eig6e ei6gev ei5gi ei6gra ei6gu 4eii ei5kaa ei3ke. ei6kee ei6keh ei4kel ei6keri ei4ket ei1kr eiks3a eik6se eik4so 4eil ei9led eil5egg e3illu ei3lo. ei9loa eil5op ei5los eil5s6 4eim ei7ma. e5imag ei4m5a6l ei4med ei6mei ei7men ei4me5s ei4met eim9ett ei6mo 8e1imp ei4n3al ei4nans ein5ant ei7nare ein1d 4e3indu ei5ned ei7nel ein9f einga6 ein3gr e4ini 6ei6nit ein3k4 e5inkar 4e1inn ei4nom ei4nov einsi9d ein4s3l eins6o e4inspi ein7sto ei2n1u4 ei3num 6einv ei2n3ø ei5or e4ip ei9pa ei3pe eip5s 2eir eir9ak ei7ren ei3ri eir5s 2eis ei5sar e4ise ei3se. eise5i ei3sen eiseri9e8 ei3s4ha ei4sil e3isk. e3iske ei6s3kj eis3ko ei3s4pe ei4spi ei4tek ei4tera ei4tere ei2to eit7ta ei6t7ut ei3tve ei6t7ø ei4vak eiva9r ei9ven ei3vi eiv5s4 e1j ejo8en. eju6la 4e1ka ekali7 ekalie6 ekam6s5 eka6ra. e5kavr ek3eie e4kero e4kes ek5e4ta e6key e5k6hov e1ki e4ki. 4e1kj 2ekk ekke7le ekk9ist ek1kj ek4kjø ekk3l ek5kok ekko5v ek6ku ek4ky e1kl e8klane ek6leg e6klen ek5let e3klu e5klæ ek2lø 4ekn ek9na. e3knek ekne7s ekni7p ek3no e3k4nok e1knu e5knø e1k2o e4ko. eko7le ekords8 eko6te. e4kov 2e1kr e3k2ra e3k4red e7kref e3kren e4k5ret. e5krets e5k4rev e3k2ri e3kro ek4ry e3k4rå ek5råd ek3s4ak ek4sal 3eksam ek3sel 3eksem ek4sig eks1k ek4ska 1eksp eks5pe ek4sta ek7s6tel ek3sti ek4stil ekst5o ekst3å ek4sæ ek6t7arm ekt3av ek3tef 5ek3tep ek5tes ek6test ek4tid ekti5m ek5tiv 4ekto ektori6a ek4t3ra e1ku eku4le. e1k2v ek4val ek6var. 6ekve e4k5ve4d e4k5vik ek4vin ek6vis 3ekviv 6e5kw e5ky eky6te. e3kæ e1kø e1kå ekå6pa 2e1la ela4ga el3agg e2l1ak e5lake elak8se. el7akt el1al e8lame el3anl e6l5arg e4larr el7arti e5las. e5lase ela4te. el5ato el5avl el3avs elbo8da el4ch el5do eld4rer eld5sle 4eled e4ledi e4ledr e3lee eleg5d ele7ger eleg8na e7leir e7leis e5leke e2lel e2lem e5lem. e5lemat 5elemen e5lemet e3lemm e3lemp 4elen ele9na e4l5enh elens3 e4lentu e5lepa 2e3ler ele8ra. e7leret e6l7erg ele3sk e6lesku e4leta e4lete 5e8lev. ele4vak 6e5levn el5fi el9ga. el5gele el5gi elg3s8 2eli e9lie eli5e6rer e4lif e4li5g4r e4l3ind elin5es e4linsp eli6o5s eli8ta. eli4tet 6e5litt eli6v7en el1j elk2 el6k5al el4ke5s el4kete el3kn el5la. el5l6ar el4led el4leg ell5eie el5ler el3le4s el6lete elli7ga. el4lisj ell7sa ell5sk ell5s4l ell5sp ell5sv el5l4ur el4læ el5m4o el5mu el5n 2e1lo elo6ka. e2lom e3lomm el3omn el3oms el1op e2l1or e3lort el3ost el4ot elo7vers. e4l5ovn el4pet el5ph elro4s el4sei els5eie el3sen el3se6s3 el3si el4sje el4skal 7elskand els5kare els1l el6sno el4spe el3spr els4ten el4sti el4stj el2sø els5øk el5s6åpe elta8le. el5te. el6teg el4tero el4t5ett el4t3op el4tro elt5rop el2tu e3lua e1lu2e e4lu4he e3luk e7lum el3ung elun6ge. e7lup elu8pe. e1lur e7lus el3utr elv3an el4ve3d el4vei el6vere elv1r 5elvs. elvæ6re. 4e1ly ely8et. el5ynd 2elæ elæ5res el9ærv e6l5æt 2elø e4l3ø4r el3øy. el5øya el5øyd e6l3øyn 2e1lå el1år e5låt 4em. e2mad emafo5 ema4ge. e4magr e2mah ema4ke. e4mako em5akti e4maku ema6le. 5e4malj e4mam e4mana ema4ni. e6manu e4mare em7ar8m e4masi e6masku e4mata ema3uk ema5ve 5emball 3embed embe6r5 3embet 6emd 8eme emei9e eme4li e4mend eme5tri eme6trisk em5e4v e4mib emi5ert e4mig 4emin emi5ni emini6st e4minor e6mir emi9sa em7je e5mju em5le emle6s em5me. em5men em8mi. 8emnd em4ne. em4ned em4nem 6emni emo5nol em1op e2m3o4v em4ped em6peri em2p3l emp9lane. em6pli empo3 em4pol em4pos em4ses emse8te. em4s5ju em4s1l em2sn em4sor em1st8 ems4te ems3u emta8la em4til e3mug e2muk e5my emy4k 6emø emø8r e5møy emå4la emå9lan emål4s em1å8r 2ena en1ak en3ald ena5li en3all en5and e5nane e6n7ang e4n3ant e5nar. en8are e4narr en3ass enat6s5p ena2v en3avi 4enb enbe9na en4d5and en4dek en3del endelø7se en5demi en3der en4desl end5l 1endr en4d3ro end3st en7dø endø4r endør5e en5egg eneg8ga en3eie en5eks e3nekt 4enem 2enen en5eng 3energ e4nesk 4enev ene7ven eng6a en7gar en4gem en4geri enge6r5u en4gle eng4les eng4r eng3s4e eng5so eng5sp engs4ti en4gut en4g5å 4enhj e4ni. e4nierk e2nif e5nir en4kera en4keri 2enna en9nal 2enne en4nem ennes6t enne4s5v enn2i enn2o enn4sj enn5sta enn7ø 2eno en3ok en3og en3om. en1op e6n5ord 2enp en4pås en4rem en5sab ens5af en6s7a6ker en4sek en4seli 5ensemb en4ses4 ense3u en3si ensi8de. ensi5ert en4sim ensle7g ens6lev en7s6opt en1st en6s7tal ens4ter ens4ti ens7und ens4ve ensvi6 en2sø ens3øk ens7å en5ta. en4tap en5te. en4tec en4teg en4tel en3ti en5tie en5tig en5tik en9tima en7timen en4to4r ent5ori ent5rab en4tre ent5ren en4t5rol entropi5 en4t3rå en6tul entun6ge. 3entus 2enu e2n7ul e4n5ur 2en3v 4enw e4ny. e2nyb e6nyr e2nys e4nyta 4e7næ enæ8m enø4k e2n3øv en5øyd 4enå en1ås en6ås. e3o6 eo3a e6obe eo2bl eo5d eod8de. e1og1 eo7gr e2o1i e2ok e3oks e2ol e4o7lo eom1s4 eon8de. eo5ne e7onk eon4kl e3ont eo2p eo3pa eo5pl eopo3 eopp5r eo3pr eor4da eo9re e2ori eo4rid eori5e6 eo4rik eo4ris eo1ro eo1s eos6l e2o1u 2e1p epa3t e6peno epe6p eper5r e3pes epe4st e4peta e6peu 3epid epi6ka. epi7kr 3episo ep2l e8plen ep5lene ep5ler eple9s6 3eplet epo6et 3epoke epp2s ep6sem ep4ses4 ep6s5lu eps1t ep2su e3p2sy ep6tin ept6r 2e1ra e4r3abb era8da. e4rael e2raf er3aft e4ra4g e2r1ak e3rake era5kl eral3u e4rama era6na. e5rande. e5ra7ne er7anli era4no er5ape. er5aper er5a4pin er3apo er5appe e5rar. e4rarg e5rasane e5rasar e4rasje e4rask e6raso e4r3ass er6ast e4ratek era7tor e4ratr er5att e2rau er5auk erau9ken erau8s er3av. er3avh er5avl e3ravn er3avr er3avs 4erb erbi9ti erbo8da erbo8de. er8byl erd2e er4ded erden8s er4dis er1dr erd4ra erd8re erd4skj erds3t erd4sto erdsto8ga er3d4v e1re er3eff er3eft er5e4gen er3eid er3eie ere6ka ere6ke. e4r3eks e6r5ekte e4r3e4le ere4lit e6relli e4r3els e9rem. e5remm er3emn er5enden e4r3eng e4r5enh e3re4o7 er8er. e4r3erf e5reri er3ess ere4t e5ret. e4r3eta eret6h ere5to e7rets 6erett eretts5 e4r3e4va e4r5e4ve e4r3evn erev6ne. e8ré 5erfari 6erfi 4erfr 2erg erg5elv ergi3f er6gli er4go. erg5ret erg5sko erg5sp 2erh erhø6re. e1ri e4riad e4riak erib3b eri3bl e4rice e2rid e5rid. e5ridn eri4kat e6rikn 4eril e7ri6ma. er3ind e3ring 6eringar ering6si er3inn er3ins er3int e5riori e5ris. e4risa eri3se e4riso e6risp e5rist. e7rista e5riste eri5stil e4ri5s6to eri5sø e4rite e4rito er7ivo er7jes. 4erka 8erke erkeri6e er4kesa er4kese er4kete er6k5ett 3erklæ 6erkn 4er5k4o 4erkr erland7as erle6ge. erle7s8t er3me ermo8de. erm1s ermå6la. 2ern er4nad er4ned er5nede er6nee er4nero er4nest er2no er3nob 2ero e3roa er3obl 5ero4b7r e1roe er3off e1rog er5oks e1rol er3oly e1rom er5omk ero5mo e1ron er5ond erono5 er1op e5rop. e7ro6pa e5ropen er1o2r e5ror. e3rore e7ro4sa 3erosj er3osl ero4ta er1ov 2erp 2err er3ra er4rae er4rel errie9n 6ersa ersa8ka ers6al er3sep 6ersj er1sk er3ska ers4ka. er8skaran er9s6karar ers5kor er1sl ers4la ers6led ers4mi er5sne 6ersp ers5tens ers5ter er7stev er1su 4ersv er4sva ers4ve er1så er4s5år 2erta er4tare er4te3s4 er5tia er3tib erti4e er5til erti4mo er4top ert5rol 4erts ert3sa erty6e ertå7ren 2eru e1rua e5rud3 e1rui er1u2k e3rum e4r3ung er3uni e3rup. er1u8r erure8 e1rus er5ut. e5ruta e3rute er5utn er9uto e4ruts er7u6v ervele8 6ervi ervs3 ervæ6re. e1ry4 e2r3ya erye7ne er1yr erys3 e1ræ e9r4ære 2e1rø er5økn e4røko er1ø4l e4r5øn e5r6ønn erø8ra e6r5ør6s er3øya e4r5øy7e erøy4n e4r5øys. er7øysk 2e1rå e9rå. erå4da erå8de. erå6e erå4k er5åke er3å4l e2r1ån er3å4p er3å4se erå6t er7åta9 e6råv 2es. e1sa es5aa e2sad esag6 es4al esa6la. esa9met e4s3ant es5arab es5arv esbi9e 2ese es5ege es3ei4d es5eie. es3eig esei8ge. e3sek e4seku esel5s4 e3s2en e5ser. e5sere e5seri e4s3erk ese5s2 e3sest e4sesv ese5tas ese4te. e5setj e9sets e4seu e4sha es6har esh9ar. es4h5er e4shi e1sho e7s8hop esi6ar esi5ert e4sil e5sili es3ill e4s3ins esi6v esi3st es3jor e5skab es6ked es4kee es4ker 8eskil e4sking eskinns5 e1skj e8s9kjer. es4kjæ e6skjøn es5k4n e5sko. es7koa e3skot e1skr e1sku esku5et es3kvi e5sky e6skyr e1skø e7skå eskå7r e1sla es4lek es4let es7let. es7lets es4lit e4s5lok es4løk es4løv es4make e7s4mett es9na. es4ner es2no es4nu es2ny esnæ5re 4e1so eso4b e2s3od e2s1of es3oks e2som e3somm e4s3ori e1s2p espa9ra es3pas es5pe. e4s4ped es5perm es3pl es4p5le es3pol e3spor es3pun es4sed es4see es4seg esse7i es6sendi es4s5enk es4ses es4sete ess5e4va es4s3ja es4sje es4skr ess4let ess3om es4sos es4spa ess5tilt es4stol ess5tor ess9tua ess5tue esstu8en. 4essu es2s1v es7så e7stad es5tae es7takt es9tala e8stane e5stans es5tant es3tap e5start e3stat es5tato e4s3tau e7stav. est5avs e6s5te. es4teg est5eie est5eig es4tek es4tel e5stell es5tels e4stema e6steme e4stemo es5temp 6esten e7steng es5tenk e8s7ter. e5s6terk esterne8 este3s4 es4test es4tien e3stif es4tig e3stik es4tikk 5e6s5tima es4tis e4stiv e1stj es3t6on e4stog e3stok e3s4tol es6tone est5ord est5ori es5trak est5rene est5rer est9ré es5trib e5stryk e3strå e1stu e5stud es5tus 8estå estå5ren estå6s est7åse e1su es5ut esva5re e5s4vek es5vig e5svikt es3vis 2e3sy esy4na e4s5yt es5øvi es7øye e1ta 4eta. e4tae e2taf etafo7 e3tak e6tako e3tal eta3la eta4la. et5ald eta5le 4e5tall etal6list etall5s6 etal4s7 et3amb e6tand eta4nen et4ap e9tapa e5tape 3etappe et8ar. et8are et5art 5e6tasjes 1e2tat 4e5tati e5tato e3tatt et5aun e8tax et1c 2ete e4teie e4teka ete4ma. e5teran ete5ru etes5i e4tesl et8et e5tet. e7tets 4eté 4eth 2eti e3tit 2e1tj e7tjer et3jø 6etl et5m 2etn et6nev etning4 etnings7 2e1to eto4er et5oppd et3ord e4tot 2e1tr e5t4rad e7t6rak 8etre e5tree e5tref e4t3ris e9tru. et5rum ets1 et9sar. et4sku etsku8le. ets7l etsla8ga etsnæ4 et2sø et4tak et4tal etta6le. ett5alt et4tank et8tap et5te. et6tei et6telt et4tenk et4tenn ettera4 etter5at et5t6erf 5etterk 5etterr ett5esk 2etti et6tia ettian8 et4til et2tj etto5a et4tr ett3re ett4ski ett4sti et3tug et4tur ettvi5se et2ty 2e1tu 5e6tui etu6na et3uni 2e3t2v e4t3va e5t6vang 2e1ty 4etz 4etæ etæ3ra e1tø e1tå etå5re e1u eu4a e8uf eug8la eu4h eu4ka. eu2ke eu5kem eu7kr eu2l eum2 e3u2n eun4ge. eu5nu e4up5a e6upk e2ur eu6rat eure4 2euri e3urn eur8na eur6ne. euro1 3europ e3urt e2us eu4si eu1ta e3uts eut7t e4u3z e1v evad6r ev5akti eva4la evann4s e4v5anta e4varar e4varb e4v5ark e6vatf 6eved eve5d6a eve5del 6eveg e5vegg evei6s5 6evenn even5s 5eventy e4veny e9ver. e5ves. e5veta e5vev. evi4e evi5ere evi5ert evin4s evi4se. evis3t e2vj ev2na evn5a4k ev7nu ev7oms e4vre e7vri. ev9rå ev1s evs8v evta8la evti4 e2v3un e5vyrk e2vø ew3a ey1 eybal4 e1y2d ey5k e1yng e1yr eyr6ka eyr4ke. e1y2t e7yti ey3tr e3zi e1zu e1æ2 eær3 e1ø4 eør6na. eøy4 eøy9an eøy7en e1å6 eåk4 eån8da eåt8t é1a é1b é1d édø4r5 é5e8 é1f é1g é1h é1i é1k é1l é1m é4n5e é5n6et é5o é1p é1r é2rj é1s ése2 é1t é1v éva8la évo8re. é5å è1r è2red è2ref è2rek4 è4rener è2rep ère3s2 è4rest è2rev è6ves ê8lan ê6ra ê1re êr7o êr9sl 1fa 4fabo fac8 fa1ci fa3de fa6de. 6fadm fa4f fa2g1a fa5ger fage4t fag5eti fa2gi fa2go fa2gr 6f5agro fag3sk fa2g1u fai5 2fakr fakse9t fakta3 fa1ku 5fal fa1la fal6kes fal4k3l fal6lers fal5m fa4lo fal4sk 4fa5mo fa4na. 7fan5d 5fane fanfa5 fang4s fangst7ev 4fank 2f3anl fan5s6 fan7tesk fan5ti fan3to fan4try 6fanu 2fap 3far 9f8ar. fa3ra fa4ra. fa4re. fa4res far4gel far4ges fa4rit far5n far6skj fart2 far4vel 4fary fa7sa fa4sel fa4seru 2fasl fast3r fa3tal fa4te. fa6t7ers fa1to fat2r fa3t6re fav5ne fa1vø 2f1b fba4ne. 2f1d 1fe 3fe. 2fe1a4 5fea. fe5a6l 2fec fe4da 3fede fe2dr fe3dra fe3d4ri fe7ene 2fef 2fe3g 2fehj fei5en fei5er. feig4de fei5ge feil5es fei4li 9fein. 7feine fei7ter 8fej 2fek4a 4fekl 2feko 4fekr fek6tes fekt5ev fe5lag fe5len fe5li feli7e6 6felik felles5 fel7læ 2felo fel5ok fel9ta. fel4tek fel4ti fel4tra fem5ak fem9b fem9ne fe4mo fem5s fem4tid fe2m1ø 5fen. 4fena fend9r 4feni 5fens fentleg5 2feo 2fe3p2 5fer. fe6ral 4feram fe5ras fer6at fer4dam fer5de 4ferea 4fereg fe4rek fer6en fe7rer. fer5ers feri6e feri8e5ne 7fern fer2r fers9kar fers7ke 2fe1ru 3fes. 2fesi 2fe1sk fe2st fes9t6i fes8t3r fes9tum fe6st9ø 4fesy fe6ta. 4fetap fe4te. 4fetea fe5ti 4fetil 2fet6r fett5j fett7s6 4fe4ty 2feu 2fev fe4ven 2feø fe6øy. 2feå 1fér 2ff f7fa. f4fab f2f3a2g f4f3ak ffa7l f6fann f4farb ffar6d ffa7re f9fas f6fat f8f9au f2f3av f2feb f2fe3d f2fee f6feh f2fem f6ferdi ffe4rer f2fes f4feti f4feto ff5eve f2fib f4fice f2fid f9fien f4finn ff5int f2fip ffi5s4 f2fj ff3la ffla8ga ff9leg ff3li f2fo ff4ol f2f3re ff1ro ff5sl ff5t4 ffu6r ff5ut f3fæ f4fø 2f3g2 2f1h 1fi fia7l fia4n 4fiap fi4as1 fibi6en fi9cen fici7 fi7di fie2 fi1er fi7e6re fi4f fi5fi fi5fo fi7fl f6ig figh9t fi7g6r 4fih fi9ka fikali7 fikalie6 fi7ken fik6ka fik6k5n fi5ko fik7sa 4fiku fi4la. fi3li fil6lel fil6leri fil4les fil7leti fil8m7at fi1lo filt6re fil7tres fil4tri 4filæ fin5art fin5d fi4ne. fi5ner fing3r 6finj finn5ei 6finnsa fi4n3o fi9nor 2fins fin6sleg fin6te5s fi2nu 7fio5 fi2r fi3ra fi6ra. fi9rene fi5res. fi3ri fi5s4a 4fisc fi6se. fiser6s fi8si. fi2sk fi6ska fisk5a6d fis7kal fisk5and fis6kart fis6k5end fis4k3l 6fiskol 6fisku fis5ti 6fistu fiti6me. 4fitr fitt5s fi7ty fi4ve. 1fj f1jeg fjel6lend f5jen fjer5ne fje4sk fje2t3 f5ju fjære5 fjæ4res8 2f5k6 f2l2 f5lag. f6lagg fla7ke f4las 2fleg fle6i f4lek f6lel fle4sl f4lett f3lev fli7ne flis7t flit9t8 1flo flo9ga flok9s flo2m3 flo6r5o flos6kl f6lu flue3s flus8 fl5ut 3fly fly3s4 f3løn flø5s 1flå flå9sa flå7se 2f1m fn6 1fo 2fo. fo9ar 6fobs 2foe 4fof foi7la fo8ke. fo6la. fol4dr fo4le. fo5led fol6k5v fol9ler fol5lese folke5s6 fol5li fo4lu 3fon fo4na fond2 fo5ne fo3n4id fo4nin fon1s2 f1op for1a for9drev for7dro for5d6u fo6re. for9ei for7e6n for5ent for5ess for4et for9e8te. for9e8ten for9g6 forh6 fo4r9in fork8 forlo7v forlø9pa forlø9se formo9r for3n foro6 for5p for3se forsi9da forsi7de. for3s4m fors8t for9ste fors4v forta8le. for5t6e fortei9e for7t6i forti5da for3t4v for3u4l for7v6 forva9re for5æ4 for5ø4 for9å fo9se fosfo5re 4fosj fo4ta fo6te. foto5 fo4tok fo4tom fo6top fo4tor fot3s fots6v fot3t 4f1ov 3fô 2f3p2 fpo6e fr2 1fra fra5l fra4m5e fra6mi framma8ne. franko5 fran7se fra7r8 fra1s fra5se. fra7sep frasi8e fra7sk fras6p fra7v fra7v6r f2re. fred8sel freds5t fre4e3 8freg f4rek fre4m5 fremma8ne. frems4 fre7ne fre6sk fres7ko. fres5koe fre8s9v fri5a6re 6f5ridi fri4erf f1rin fris6ka fri5s4p fri5s6til frite8re. friti8me. 6froc fro7f fronta9le fro8st frus1 fruta6le. f1ryt frø5b frø7ko frå9r fråve4 2f1s fs2h fsho6 fsi2 f5sjuk f2sl fsle6ge. f4sm f2sn fs7ne8 fs5ov fs2t f2s3tab f6s5tan f4s9v 2ft f1ta f3ta. fta7f ft1ak fta8la. ft3alg f2t1am f4tana f7tane ft3anl f5tar. ft8as4 f6t1av f2tea f3ted f4tee f2teg f2tei f2tek f6tem fte4na ften3d f4t3enh ften5s6v f2teo fte4r5a4 f4terin fter5s f4test f4teta f4t5ett ft3ind f2t5i4s ft5l ft7n f2t1o2 f5tog 3fton ft3r fts5alt fts3ei fts5ers fts5erv ft2s1i fts1k ft2skaf ftsla6ga ft5s4lan ftsle6ge. ft3sto ft6s5top ft5s6tri ft5stø fts1u ft2s1ø4 ft5t4 ftta8ka ft1u 1fu fu8ga. fug9le. fug6l7eg fu6le full3 ful9lar fulle6 ful9le. ful4len fullen8de. ful4ler ful7les fullfø7re funn2 funns3 funnsla8ga fu6ra. fu6re. fu9ret fu7ro furu1 fu7sel fu6sk fus6o7 fu4s5t fut4h futu1 4f1v fva8la 1fy fy5la fyr2 fy8ra. fy4r5a4b fy1re fy4re. fyr7k fyr8ke. fyr5t fy3s fysa7 fy8sa. 2fæ1 1fø fø4da. fø4dek fø5den fø4des fø5des. fø1f 2føk fø4le. f8ør før6a fø5rar fø4re. fø4res fø7resv fø8rete før6tin 4få få7ren få7ret få5ri får7u få7va 1ga 4gaba ga1bo 6gabø ga3da ga4ded 4gadg 2gadm 4g5adr ga4e5k 6gaflo g3aft 6gah 6gak g1aks gak8ta. gak8te ga3kv ga1la ga4la. galei5 ga7len gal4les 4galli 5ga7lo ga4ma. 4gamb ga5mer gamme6l5 6gand. 6ganden 9gane gan5g6en gan4g5j 4gan5k 2g1anl 4gann 4gansa 4gansv 4g5antre ga6pa. ga4pe. ga4p5l gap3s2 ga6p7u 9gar. ga6raf ga6r5ak 2garb 5garbr 5garby gar4dek 7gare. 4garea gar5es gares6ke. gar2i 4garki gar3ne gar6ta. g5arte gar8te. g3arti gart5s6la gar4un ga4ryl ga4sc ga5s2i gas8ka. gas8ke. ga6ski 4gasp gas6sel gas5sen gas7ser gass5ett gass3l 5gast gas5te ga5sto gas7t6ra gas9tri g2at ga4te. ga5tens gate5s ga3ti ga1to ga3tr gat6tap gau5la. 9gav. 2gavd 6ga4vei ga4veri 4gavg g5avk 2g1avs 2gavt 4gavv 2gaw 4gaø 2g1b gba4ne. g6byk 2g1c 8g1d gd5alt g6d5au gde3a g2deb g3deba g4dedi gde5lo g2dem g4dend g2de5o g4dera g4de5re g6dero g2des g2det g3det. gdevi8sa gd5op gd1or gdy4d g6d1øy 1ge 2ge1a geak8ta geak6te. gea7ren ge4ark 2geb 6geba 4ge5be 3gebri 4gebrå 3gebyr ged4 4gedan 6gedel gedia5 9gedom. 7gedoma 9gedome 7gedomme 6gedoms 4gedos 2gedr 2gedy 2gedø 2gee geen8de. 2gef g5eft 3gefæ 2ge1g2 g5egg g3e2gn 2geh gehø8ve. 2gei g1eie g4e1in gei4r3 gei9re gei8s7p gei6st5 3geit geit3a geit3o gei4t3r 2gej 2gek2 ge9kl ge3kn g1eks 6gekt 5gel. ge4lar 4gelau ge6le. ge7lea 4geled 4gelei gelei5er 4gelek 4g3elem ge5len. ge5lens 5gelet gel5ett 3geli 4gelid 6geligg 4gelit 6geliv 2gelo ge5lov 7gels4 gel3se gel5si gelsk7l gel5t4 4gelu ge5lun gel7ve 4gely 2gelæ 2gelø 2gelå 5gem. 2gema 9gema. 2gemi 3geml 4g5emn gem6na 2gemo 9gemr 3gems 3gem4s5t ge3mu 2gemy 2gemø 2gemå g2en 3gen. ge2n1a ge7n6am gends6t ge3nea 4genem gen5erf ge5nes gene4t gen5eti 4genev gene5ve. gen8ga. gen5gr ge4ni6n 6geniv gen5k genle6ge. gen3n gens5l gen6sun gen5tr 4genum 4geny 4genæ 4genø 2geo 5geog 3geol geome5 geomet4 ge5on 6geop ge9ope 2gep g2er 3ger. ge5ra. ge6ral ge4r5ant ge9ras ger5di 4gered 4geref 4gereg 4gerek ge6rene 4gerep 6gerese 4gerett ger4i5d 4gerik geri8ka 6gerike ge4rim ge4ris ge4rit ge4riv gerle9g g9er8ma. ger3n gerne6 4geroa 4gerom. 4geromm 6gerop. 4gerope ger5p ger4s5af 5gerud ge5rup ger5v gerø6re. ge4r3ø4v 4gerå g6es 5ges. 2gesa 2gese 5gesen. 5gesens 4gesi 4ge5sja 4gesje 2ge1sk ge1sl geslu7 ges4lø 4geso 4gespe ge4spr ge5spra 2ge1st 3gest. gesta7b6l 5geste. ges6tekk ges8ti. gest5rid gestri8de. 6gestå 2gesu ges5vik. 2gesy 6gesæ 2gesø 2ge1så geså5re 5get. ge5tak geta6le. 6getat. 6getate 4ge3te 5gete. 2geti 2getj 2geto 2getr 5get5s 2getu 2gety gety8e 2getø 2geu g2ev 2ge7v8a 2geve 4gevir gevi6sa 4g5evn gev6ne. 4ge5vo 5gevå 2gey 4geæ 2geø 2geå 1gé 2g1f gfe2l 4g1g g6g5al gg5ask g2g1av g4gedi gg1ei g4gela g4gele g2gem g4genu g6gerei gge4rin g4gerø gges6b gges5l g4gesm g6geso g4gesp g6ges6tio g6ge5sv g2gev ggie6 g4gif g4g5i4m gg4je ggje5s g2gl g7glu g4gn g2g1o2 g3go. g5gos gg3rad ggra6da gg5rat gg8re. gg3red gg7rek gg5s4par gg3sto gg4sy gg3sø g7g8ud g4g5u4r 2g1h ghe8n ght5ene gh4to ghæ8 1gi 3gi. 4giak gi1ar 4giarb 6giav 2gib gi8c 2gid gi3de gi1e 4giek 3gien gi9end 5gier 4gifa 2gifo 4gifr 4gifu gi6ga. 2gigr 2gih 2gii 5gika 3gike 4giki 3gikk gi5k4r 4giku gi5le 4gimess gi4metr 4gimi 4gimø 2g1ind 6gingeni gi4nin 2g1inn gin5nu 4gino 4g1ins 4g1int 2ginv 4gi5om 2gi1op gio4r 2gip gip5si 6gira gi3re gi4re. giro3 gi6rob 5gis. 2gisa gi3se 4gisel 4gisen 5gisk 6giska gis8lu gis4lø 4giso 4gisp gi3s4pa gi5s4pr giste6ru gis5ti gist5ra gi5stré gi6st5rer 4gistu 6gisty gi5ta 4gi5te gite4s gi2t9r git5te 2giu gi7va 4gival 4givo 4givu 1gj 2g1jak g5jarn 2gjaz gje5f 4g3jeg gjels4 gje2n gjen1opp3s4 gjen5s8 6gjent 3gjer gje7sk gje4s3p gje8v9ak 2gjob 2g1ju 7g6jut gjø9de 2g3k2 gkly9 gl2a 6gla. gla3de 4glag gla4ga gla8ge. g3land g1lar gl5art glar7v 1g2las 7glase g6lass 6glast g5last. 3glat g5lau gl6e gle6dero g2lef gle3ge gleg8ga 6glei glei7er. g2lek g7lek. g5leke g2lel 3glemt 4glen g9len. g9lene. g9lenes g9lens gle9pl 4gler gle4ra glere8de. g9les. gle6se. g4le5sk g6le7sm 4glet g2lev 1g2lid gli4del gli7e6n gli8er glig1 3g2lim gli9me 4glio glitt4 6g7liv 4glj gl7ja gl5l g4lo. g2loa 5glob 5g6lome 1g4lor gloria7 glori6an glorie7ne g4los glo5ste 6glov gls4 5glug g5luk 6glun gl5ung glun8ge. gl5ut g5lyd 3glyf gly4se. g2løg glø8pa 2gløs gl7øy. 5gløym 2g1m g4mete g4metr g5mé gmini6 gmo4e g3mu gmu8le. gmå6la g1n gn1ak gna5lem gna4lo g2nav gn1d gndø6 gndør5 gn4e g2nee g4nelo g6nero g6nerø gne1s4 gne8se. g4nesk g4nest g5net g6netr g2nev g4nib g4nid g6nik gning4 gnings5 gni4s g6ni5sk gni6st gnist9r gn5k4 g2nom gn5o6p gn7o6v gn5r gn1s gn4skr gn6sm gn4som gns4pr gn4sti gn2s1v gn5t4 gnu5re gnæ6re g2nå 1go 7goan go1ar 7goar. 2gob gobe5 go4da go5dal god5ar 2godd go4de. gods9t 2gof go9ga go5ge. go9g8r 6goi 2gok gok4se. go3le gol6fa go5lo gol4va gol6var go4lå 2gom g7o6ma 6gometris 7gomm go4n5and go9ne. go7ni go5nok gon9s 2g1op 3g6or4a5 go5ra. go7rae go7ras 2gord gor6da go1re gore8a7 2gorg g4ori gori5e6 g5orv gor8va go5rø gos3p 4gost 6goto got6r 4gov go8ve. go8vi. 2g3p6 1gr4 8gr. 4grab 6grac gra5ce 9grads graf5f graf5t6 gra4m5 grand3s4 gran5to grant4r gra9se. gra9set gra6sk gras3t gra5t gra8te. grati4s gra4u gra4v3ak gra7vis gravta8 2grea 4g5reds gre4en 2gref g7refe g4rega greie5n grei6ene 6g3reis 4grek 2g5rel g5rent 4grepi grep4s3 g7rese gres6sak gres6sent 6g5rest 4grett 4g5ri. grib3 4grid 4grif 4g1rig gri5sete 4grit gro9ar g4ro7i grom5m g4ron gro5sk gro3ve 4g5rui 4g3rul grun7g 5g4rup gru7sa grus5t 2g1rut 2gryd 4g5ryg 6g5rytm grø5de. 6g5rør 4g5røv grø5ve 4grøy gr7øy. 6gråd grå6da gråk4 grå7n grå5te. 8gs1 gsa2 gs5akers g7sal. g7sale g5salg. g5salge gsam3 gs3amb gs7amn g3s6ank g5sard g2sas g7sast gsbø6n gs2ce gs5ef g2seg g2sei g2sek g5sekr g7sekv gse9la. gsel4s5a gsel4st g2sem gs6ende. gsen6ke. g5sens g3sent g2ser g5ser. g3seri gse4st gse4t g3sete gs3eti g9sets gs4ett gse2v gsfø2 g2si g5sider gs5is gsi2v gs4jar g3sjef g5sji g2sjo g5sjå gs4ka. g5skad gs4kal g5skall g6skam g4skan g4skapa g5skape g4skapi gs7kav g5skilt g7s4kj g7s6kjæ g3skot g5skren g7skug g6skv gsla6ga gsle6ge. gs6leri g4sluk gs4lun gsl9ut. g5slyn gs5med g9s6mert g7snel g5sog gs9ope g5spal g3spel gs2pi gs5pik g3spil gs5pile g6s5pors g3spur gs3s4 gsse4e gs5tak g9s8tand g5stang gs4tasj g7s4tat gstatsrå7 gst6e gs5te. g5ste4e gs4tell gs5tema gste6ma. g7stemt gs4tere g5s4terf g5s4terk g5s4tern g5s4ters g5s4terv gst7evnen g5s4ti. g3s4tie g3stif g3s4tig gs5tiå g5sto. gs4tol g5stol. g7stola g5stole gs5toll gs4trap g5strau gst5rea g5strede gst5rei g5streke gs6tret gstri8de. g5s4trof g3strø g5s6trå g5stue gst5ut gstyr8ka gs4tør g5s4tå gsu2 gsu5g gs4vane gs5vik gs7væ gsy2d g7sym gsy6na gsy6t g2sø gsø6ki gs6øt gså4 2g1t g3ta gta8ka. gta8ke. gta6la. gta4le. g9t6e gte6ke. gte6ma. g3ti gti8de. g4t5if gt6re. gtråd5s6 gt7sv gt5t gtu8en. gtvek8 gty8e gt9yt 1gu 4g5u4bå gu2di guds3t gu4el 6gug g5ug6l gui4d guid5ar gu4le. 4g5ulk gul8ke. gul4la gul5o gul7ø 7gum gun4g gur2g gu4ri gur8na gur6ne. gu5rua gu3rue gu4st gu1ta 2gutb 4gutd g5ute. 6gutg g7utl 4gutn 2guts gut4tak gut4tes 4guttr 2g1v gva4ke. gva8la gvedli6 gvi8ta 6g1w 1gy g9y8a gy4da. 7gym gy3ne gyr6 gy8sa. gy6se. gy4te. gy4ve. g5æt 4g5øk gør3s 2g3øv gøy9a gøye6r gøy5n 1gå gå6as gå6en. gå4er. 4g5å4k 4gåm 4g3ån gån8da 2g1å4p 2g3åre gå2s gå3st gå9ven gå4vet h2a ha4a haba9 4hae ha2el 4hafi ha2g ha3ga ha4ga. ha3gen hai1 ha7ism ha5ka ha4ke. ha5ken ha7kera ha4ke5s ha1la ha6la. hald4s7 ha4le. ha4lev hal6lei hal6lø hal4s3k hal4so hal4s3t ha5lu hal4v5 ha5ma ha8me. ham6nest ha5mo ham4st hams4t7r ha5na han6d5r hand7skr hand5ø ha4ne. hani1 hanis4 han2n3 han4ne han6nel han5nen han5n4o5 han3se han4sk ha4pe ha4re. ha5rei ha4rel ha3rem ha4res har5k ha5rov har7se har5tre har4tri ha4sj hasj5e ha2sl has6p7l has5v ha3tar ha4te. hat6le h4au hau5ke. hau6st hau4t5r hav4a ha4va. ha5van5 ha4ve. ha4veg ha4vei have3s ha1vi ha4vo hav4sl ha6vu6 hav1ø 4havå 2h1b hba4ne. 4hc 2he. he2a he7ans heat4r heb5n he4de. heder6s5 he2d9r hef9ta hef7tes he3ge he4ge. he2g3r he2i heia3 hei5en 3heim he3ins hei4sk heit4s he2k hek4sek hek6serin hel1a he4la. he4le. he4l5ei4 hel6lesu hel3o hel2s2 hel3sa hel4se7 helses4 hel3sk hel5sp hel5ste hel3sv hel4tes hel9ve he4mak hem5ne hem3s8k henfø5re hen5o6 hen1s2 hen5se hera9da he5ret he4ri. her5j herle9ge herli9ga 4her5n he1ro he4ro. hero9a her7p her6rei her6resi her6ret her6ska. her8s7kare her6sv her5un4 he2r3ø he4se. he2sp hes7pa hes5pel hes5pen hes9per heste5ri hes4tes he6stø het2 he4te. he5t6i het4s3a4 het4s5p het3t he6va. he6v7arm he4ve. hev9na. 2hf 2hh h5hu hi5ao hi4bak hie4n hi2et hi4f1 hiff2 hif9r hi6ge. hik7e himme6l5o hi6n7an hin4nes hins4 hins9ke hi4pl hip3p hi1ro hi2s1 hi9se. hi3sen hi5s4i 4hisk hit7o hi4t5r hit5ti hi8va. hi4ve. hiv1s hjar4 hje4 hjem7e hjorte5 hju6l7 hju7l8e 2hl h5lan 2h1m hma8n 2hn h2na hne6n hn1s h4o ho5ar. hob6 ho6da ho4de. ho5den hode3r ho5der. ho5dy hof4f3 hof4f3a4 hof4f3e4 hof5f6er hof4fi hogs6 hog6str hog7stra hoi5 ho2la ho5lag ho5lan ho4le. ho4lin hol5l ho4lom hols4 ho4lu hol7ut ho4me. ho4mo. ho4mod ho4mos ho5n6o ho4o ho8pa. ho4pe. ho8pi. ho5ra ho6ra. hor2e1 ho1ro 2hort ho4s hos5a ho5sen ho5ser ho5si5 hou2 ho1v hove5re ho4vé 2how h1p 2hr h1ra h1re hri5ne hri2s3 6h1s h5s4e 4ht h5ter htere4 h1tr ht5t hu4da hu4d3 hud5s6 hudså9re hu4er hu6et. hu4ga hu4ge. hu8ja. hu6ka. huk8ra hu4la hu4le. hu4leg hu5les hu4lev hu5ma hun6des hun2n3 hu1ru4 hus1a hu8sa. hu5s6a6r hu6s7arr husa7r8e hu4se. hu4s3ed hu2s1i hu2s5j hu2s1k hus7m hus5s4 hus1t hu8str hust9ran hus4tre hu6sty hu6s5u6 hu2sø hu4va hu4ve. hu4ves hv4 hva5le hvas5 hve2r hver3a hvi5l6i h4v4ir hvits4 hvo2 hvor5 hvor5i6 h6y hya3 hy2bl hyd4 hy2e hye5ne. hye9nes hyg5gel hy6la. hyldes7 hy4le. hyr4des hys3 hy8sa hy4se. hy2s1j hys5t hæ5g hærfø9 hær3s6 hø4e høf5 hø2g høg3ri høg7rø høk6 hø6le. hø4na hø4ne. hø5rar hø5ren hø5rer hø4res hør6sp hø2s høst7a høst5ø hø1va hø1ve hø1vi høy5a6 høy5k høy7n høy7rar høys4 høyse6te. h6å hå7a hå8le hå6na. hånd5skr hå5nel hå6pa. hå4pe. hå4p5l hå1re hå1ri hår3s hår7u hå8va. hå4ve. ia9al i1abl ia1bo i2a3de i1adj ia5d8r ia1g2 ia2ge ia1in ia1kr i1aks iak8se. ia5ku i1al. ial1a ial5ein iale4t ial5eti ia4l5ett i2alf ial3g ia4lin i4alk ial3op ia6lov i5als. ials4t i3alt. ial1u ia2lø i1an. i2ana ia4nal ian5ald ia5nar i7andr i5a4ne. ia8nes ia7net i5ank i1anm ia2no1 i1ans ian3sa ian3sl i1ant ia7nø ia2pa i3app i1ar. iar4do iard5s4 iar4du i2are i5area ia5r6e8l i5arn. i9arns i7arska i6asi i1asm ia4sp ias3s6 i3assi i1ast i7ast. ia1t ia5te iat6r iaty6ra i1att i7auk i1av i1b2 iba4ne. ib5bo ib3bu i3bere ibe4ro ibi5er. ib7lar i2b3le ib4leg ib4le5s i5bo ibo4e ibo7n ib4r ib3st ib8t ibya7 iby9ar. 8icanarar ice5ne i1ci ick1 ick7ete i1co i5cy 2ida i5dal i3das id1av id3del iddel5u id6dep 2ide. 3ideal i2deb i6def id5e4ge i7deki i9del. id3elv 2iden i5dend iden5sv 5identif 5identit ideo3v i6derap i9de5re. i7deren i9deres iderla8ga iderle7g i7dern i5ders i6desm id6gem id4ges idi4en 1i2dio i8dj id7jer id9na 1i4dol id9ran id5reg 4i3drev 2idri id2s1 id5sam idse4 id6sel id5sim ids5l idsla6ga ids3t id4s5tu id2t1 i2d1un i2dy 3idyl i3dyr i3dø i6d7øy id7å 2ie ie1a2 i2ed i1eff ie4ge iego4 ie1i iei6d i1eie i3eig i5eini iek8l i1eks ie5l6a i2ele i5elem ie4lev i7e6lim i1els i9elt ielø8pa i8e9ma iem7b8 ie3me i1en ie7na i2end ien6dela ie8né i2e5ni ien7n ie5no i5ens ien4sk ien4s5v ien4t3r ie5nu i6eny ie4ran i4erd ie6re. ie5reg ie4r5eng i6eret i2eri ie4ril ie4ris ie4riv i2erl i6ero ie7ro. ier4ra ier4sp iers3v ier5t ie3run ier5v i2e1s i6es. ies4c ie3se ies5s ies4ti i8es6v i1et i2eta i5e4tabl i3etat ie9te ie5té iet4re ieu2 ie7ved 2if ife4s1 if2fa ifi6e ifjø8 if3le if4les iform4 if1re i8ft if4tal if4tere ifte5s ift2s i3fø 2ig i2gae ig3ann i7gark ig4art iga3ru iga7te ig3att i2gav ig3d i6geb i6gedi i6gedomm igedoms5 i2gem i3gen ige6no i5gers i4gerø i4gesp ig3e4ta ig5ett ig4ged igges4 ig4gra igg9s2 i6gh i2g1ia i5gib i4gim igion4 igje9va ig1l igl6d igli6se. ig5loa ig5neu ig5no igof6 igo5fr ig1om igo4no ig2ra ig2re i2g1rø ig3råd igrå5t igs4al ig5sel igs2j ig5s4ka ig3s4kr igs4mu ig3s4pa igst4 igs4ta ig4ste ig5stek ig7stel ig5stem igs4tra ig5s4va ig1un ig9ut i3h ihen3 iho7le. i4huk ihu9la ihu5le. i1i i5in i7is. i6ita i1j 2ik i1k2a i2kab i5kabel i2kaf i2kak ikan9d i2kao i4kapo i5kar. i5kara ika5re i4karei i6kasa ika3sp i2ke. i2ked ik9ei i9keleg i5keli ike5lu i5ken. i4kena i5kene i9kens i3ker. i4kera i5kere. ike5ri ike4r5o i2ke1s2 ike3si i6kesk i5keso ike5su i5ket. i5kets i1ki iki9ne ik5inn iki5st i1kj ik4kaf ik6kana ik4kap ikk5arv ik4kas ik4kat ikk5att ik6k7ent ik4keru ik8kesk ik4kest ik3kjø ik4kjøp ik4kl ikk5lag ik2ko ikk5ord ik4kr ikk3re ikk5sv 4ik2ku2 ikk5und ik2kv ik6ky ik1l i5klæ i1ko i2koa i9koar i2kob i4kod iko5de i2ko3f i4kog i4koh i2kok iko5na. i2koo i5k6ord i4kore i2kov ik1r ik4rak ik5rem ik5robe ik3ros ik2ry ik2sa ik4sek iksmå8la ik7sot ik5spel iks5ti iks5to ik8stu ik4tav ik4teg ik2t1r iktsla8ga i1ku iku6le. i6k7u6t ik1v ik4vin i1ky i3kø i3kå ikå8pa i1la il5adr il7af i2l3ak il3al i4lana il6and i4lark il3art il5ass ilas5t6 ila5t il5av il4dak il4deko il4dete il7dj ild3re ildsfa9re ild3s4t ilea9r ile8are i3le7e i2lef ile4ge. i4l3egn i2l1ei i6leig i2lek i2lel i4leno i4lero ile1s i4lese i4le5sk i4lest ile6tri ilet5te ile4tu i1lé ilfø5re il5ge il1gl i4lid ili5ers ili9ga i5lik i2l1im i4l3ind i7line i4lins i4l3i4r ili5s6tik il3ja. il1je il5jese il1jo il1ju ilke3 il5ker il4kes ilk4o6s il5ku il4lab il6lam illan8da il6lap il9lau il4lee illei9e il6l7ender il6lesk il4lev illi9ga il4lo5m ill3s2 ills5kå illæ4 illæ9re. il4m5est ilm5e4v il4mi ilm5s i1loe i9lolo i4lom il5omv i5lon il3opp i4l1o4r i5loso ilot3u i4love ilo1w ilret4 ilset8je il3sl ilsla7 ilsle7ge ils4mu ils2p ils2t il5str il7su il3s2v ilsva9ra ilsva5re ilta9la ilt5rett il6t7å ilu4h i5luk il7ul8 il3un i5lur i9lus il1ut il5v6 ilve8d ilve4r i1ly il1å8 ilår6 8im. 4ima i2mad i4maen i2mag i6m5akk i4mako imal8n i2mam i9man i2map i5mar. ima5s i4matr i8mb2 i4mee i2me1g i2mek i6melu im5enh im8et i9met. i4meta i4meti i6mey i8mé imi9la imini6 i7mj im4lev im8l9u im5m i6mog imo9l im5ord imor8da im7o6v imp2 5imperi imp4l 1impo imp9s impse8 1impu im4ref im4rek im4res im9se ims4k5l ims3kr im5s4me im1s4t im6sti imta8la 4imu i3mø2 2in. 6ina i4nag in5agg i5nakk ina4let i4na2m in3ame in2an i9nane in5ann i2nap in5app i5nar. i5nars i4nask i4nasp i4n5ass ina4t5ak i6nau in7auk in5avl in5avr ince2 in7der 6indig in4dog ind9ra in3dru indr5ø ind5sk ind3sp ind5s4t 5industr ind7å 4ine ine8are i2ned inedy6 in5egg in5eid in3eie i6nele ine4li in7eng ine8pa ine8pe. i7nere. i5neren i9neres ine4rik i7nern i5nert i5nes. i4nesk ines8ka ines8ke. ines4st ine5s4ti i4nesø i2nev 8iné 3infek in4fos in4fot infu9 4infy in4g5ald in4gav in5gebj in6gem 5ingeni in5geri in4geru in3gev ing5jen in4goa in4gos in2gr ing5rep ing7ris ing2s ings5om ingst8 ings5v 6ingu in2g5ø i7nia ini9ar. i2nib i5nie i4nif i2nig i4nil ini7m i4ninn i2nip i4nisa ini3se i4nises 5initia i4nito 5injek 2ink in5kel in4kero in4k3la in4kok in5l inla8ga 2inn. in4nal in4nem in4nerø in4nesi innes6t 4innet in6n7ette innfa9s 1inng 5innhal 3innho 2inni4 in4ni. in4n5om in5n6ova inn1s4 6inns. 3innsa inn5se inn9sen inn9ste inn7sve 1innt in4n5u4 4innæ in2nø4 2ino ino5a i5noar i4nod inok6 in7oks in1s 4ins. 8insa in9sa. in7sal in5sar in5se. in4sek in3sen inseri8e9ne in3si insis5 6insj in4sja in3sje 4insk in9s8kas in5skat inske4t ins4ki in3skj ins5kjøt ins6kor ins4k3v ins6kø insle7g ins8lega in3slo in3s2lø in5s4ma in3sop 1insp in4spa in5s4pl ins4po 5instal in8s5te. ins5ten. ins9tens 3in3s4ti in4stin 4in3s6to in5stra inst5rel 5instru in6stå in7sul in2sv 6in3sy 8int. 2in3ta inta8la 4inte. 5in7teg in8t7ege in5ter int5ess in5te4t5 4in5ti inti5me int2r intran4 int4rer in5tres 6inu inu6i i8n9ul8 in7ut. in9u8te 1inv 6invev iny4i iny4t 6inø in7øk i7nøt in3øv 4io io1a4 i2ob io4dere i1off io5gn io1i i1oks iol4 io3le iol7jen io3mu io4nans io4narr io6n5erst ion3g4 io4nin io4nu io1pl i1opp io5ra. ior8da io1re io4rie io4r5in iorla8ga iosk3v io1st iota6le. io3t4e io4tra i5pap ipa4ti. i4pee ipela9 i7pe6p i1pi ipi1e ipi9ne i4p5ings i1pl i2ple ip4peli ippel7s6 ipp6lan ipplæ8re. ip2pr ipp4s3t ippsy8na ipp4sø ip7pun i1pr i6pra ip5ru ipru8te. ips1a ipse4l ipsfø5 ip2si ip2s1k ipsle6ge. ips1t ip6tar i5py7 i3pø 2ir i1ra i9r6and ir5ark i9rast ira6tr ir5de ird5s i1re ir3eie ir6ek i3repo i3rer ire6r5a ire7st i3ret i8reto ir7g i1ri iri4a iri8ka. ir3ind ir3inn ir5inst iri9t ir5ka. ir4kat ir5ker. irke3s6 ir4kest ir4kle ir5kv irk5ø ir4mag ir4mal ir4mast ir9mé i5roa i1roe i4roi i1rol ir5opp iro1s ir3re ir7sko irs2p ir3s4t irt6 ir3ta irti6g5r i1ru ir5u4k iru8m iru7sa. i1rø i1rå ir7å6l i1sa i4saks i4sanb i4s3ang is3ann i4s3ans is3ant i7sas is5aud 3isbry is6cen isch5 is3co i5scr i2sed i4seel i4seen ise5ern i2s2e3g4 i2sei is3eie is5eig ise5is i2sek i3sekt i4sekte i6s7eld is4e5li i2sem ise5ne i4seno isensi6 i5ser. i5sers i2ses is5ess i4sete iset8je i2seu 8isé isha7ne 3ishav is4h5in ishø9ve isi6ene is5ild i4s3ind isis5t is7jun is9ka. is3kal is3kar isk9art. isk5arte i8ske is5ke. is8kee is4kel isk5els iske5s4 is3kje i3skjo iskla8ga is6k5le isk3lo isko5g is7kogr is3kop is3kot is1kr is6k5rin is1ku is4kul i5skula is1kv is4kvi is1l i6slu isl7ut isl9øy. i5smak is4med ismo5e i6smus is5ne is5nu 1isol 6isold 5isomo is5omr iso3pa iso5pe iso7pr 3isot is1ov is1p is4pan is5pane. is6pis is7pru is4ses is5si issis5 is6s7kj is4sko is7skr is5sky is4skå is5sok is7sto is6sve is5svo is9s4ær is4søk i5stab ista9le is5tane is5tap i4s5tar ist5avb ist7avi i2ste is5te. is4tek ist5ekt istel5l iste6ma. ist6en is5ten. is5tene is5ter. is5tern is6terø is6té is4tik is5tilb is5tis is3tok is3tol i2str i8s8tre. i4st5ren i5strer i6strer. i4stres i6stret is3try is3tus 6isu is5uf is5ul is1un is1v is4vak is7w isy8na isy5r is5yt i2s1øk i4søy is7åk is3år i1ta ita4l3a ita6l5ers ita4lo ita4ly i6tang itan7s6v itau4 i4tav i4tec i2teg ite8ke. i7teky i6t7elg i4teni i2teo ite3re i4tero iter6s5 i4te5ru i2te1s ite6se. itet6s5 i1té it2i iti6er. i4ties i2tif i4tikam i4ti3kv iti5me i2tio i2tip iti3r i4tisa i4tisen i4tisi i4tisj i4tisko i4ti3sp i4tist iti5str i2tiu itiv4 itivs5 it7jaran it7jer it7ji itma6le. itnes4s i1to ito9a i4tom it5ord ito4s itostra6 ito8v i1tr i4tra. i6trae it3rel it3ren it5rim itri8ma it3rin i5tris it7ro6s it1sa it4s3ei it3ser it6ses it5sku itsla8ga it1sn it6sti it3sun it4tag it6tak it4tal itta9la it6tann it6tap it4t5at it5ted itte4l5o it4tenk itte5s4 itt5ett it4tid it4til it4tj itt1o it6tof it7ton it4tr itt5skr itt4sø it4ty it7tys i1tu itu5e itær1 i1tø i5tå9 i1u iu6a iu2b i5u6l i5um. ium4f5ar iu2m1i ium5m iu4mo i6umse i4um5s4t i4umsu iu2n iu8p i2ur iu5se 4i1va i4vad i6vaj i4v3aks i5val iva6la. i4vana i4v5ank i4varb ivar5s6 i4v5ass ivat3t i1ve i2veg ive6ge iv5eg6n i4vei iv7eig i2vek ive4ra ive5ras iver5d i6veret i4vesk i4vesti i6vesv i6vetø i2vev i1vé i1vi iv5ins iv5is. iv5isb ivle6ge. iv3n i1vo iv7om iv3r iv4sal iv2si iv2sk iv2sl iv2sn iv4so ivs5v i2v3un iv7y ivyr8ke. i9væ iv7åpn i1wa iwi5 i5wie6 i5y iyr8ke. i5za. i7zas i4ze i1zo i1ø i1ø4k i1ør. iør5i iør5s i4øs iø3se i1øy i1å4 iårs7l iåt4te. ja1ak ja9ar ja4da 1jae ja7en 5jag. ja4ga. ja7gar ja4ge. jag6r ja4ha ja4hv ja4j jak4kel jak7kele jak4ko jakk5s4 ja1k8r ja8kre jaktel ja7ku ja3lo ja1lu jam7b 6jambi jamhø8ve. 5jamm jams2 jan4gr j5anl ja6ra. ja6r5ap ja9rek jarn3s4 jar5ta jar5te. jar5tet. jar7ti 6jarø ja6rå ja7se ja8ski ja5sti ja5ta jau4ere ja9vi 1jaz j1b 2jd j2e 2je1a2 je5ak 2jeb jeb9b je4deb 6je4dek 4jedr jeep1 6jeev 2jef je4f3et je2fj jef5lag je4f3re jef4sa jef6s5i jef3t4r je5ge jeg5ge 6jegl jeg6les 4jego 4jegr 4jegy 2jeh je1i je5i8s 4jej 2jeka jek6keru 4jekl je4kli 2jeko jekt3a jek4tan jek6tes jekt5ev jek4t5in jek4t3r jekts4t 4jekø 2jel je6legr jelei7er je7lele je4les jel7ge jel6lag jell5ang jel5len jel4lo jelt3 jel4tr jel9ut jel7va. 2jem je4mia je4mit jemp6 jem5pl jem5se jem4sti 2je7na jen1d 4jendr je3ne. je7ne8s 4jenet jen5ged jeng5s4 2jeni jen3k 4jenl 4jeno 4jenu je2n1y4 4jenæ 2je5o4 2jep je3raf je4r5ant jer4dep jerd6s je3r6e 4jered 6jereg 6jerei 6jerenn je5rik je6rim je6rinæ jer4kes jer6k5l jer4kv jerle7 jer6mu jer6n5as jern5sl je6ron jer4sp jert5s 4je1ru 6jerå 5jesf 5jesh jes4kil 2je3sp jes4tea je6stim je3str 5jesut je5sve je4t3ag jeta6ka je9tar. je7tara je9tare je4t3ru jets2 jet4t5an jet6term jett3o jett5s6 je4t3v jety8e 2jeu6 4jev6a je7vark je6vas 4jeve jevi4s jev7na. jev7ne 6jeø j1f 4jg j1h 4ji. jib5b ji7e6 6jik 2j3inf ji7ro ji6sj 4jiø 2j1k j4kap 6j1l 6j1m 6j1n 6jn. j5ni j2o 1job 5joc jo4da. jo6dat jo6dis jo4fl jok9ker jokk9o8 jol5t6 j3omr jon2 jo5ne jon7n jons1 jons5a jonse4 jons3p jons5t jon6sti jon4str jonsu4 4jop jo5ra jor6dek jor6d7erv jor6d7is. jor4d3o jord3r jord5s jords4l jor6du jo1re jo4rie jort6a jor5tet jo3r4u 2jos jo3se jo4ses jo5stei 1jou jour5 j1p 4j1r 2j3s2 j1t ju8are 1jub jubi3 ju9bo ju3de ju2do ju7doe jue7ni ju4e5re jue9s jug9le 5jugo 4ju2k ju3ka ju3ke. ju3ken juk9sar ju2l ju3la. ju5lar ju5las ju8l9ei ju4li. ju6lid ju4lik jul7inn jull6 1jung jun7ge j6u6ni 8jup jup7s ju6p5å6 ju4ra ju7ras 3juris ju9ro ju3ru 5jury 1jus ju5so5 ju1ta jut5o ju6va. ju6vak ju1å j5v jy1 jy8de. jy2p3 jæ5le. jæ3ra. jæ9ran jæ9res. jæ7te. j2ø 1jø. 1jøa. jø5b4 1jøe 2jøef 4jøeg 6jøei 2jøek 4jøend 4jøeng 4jøeta jø1f jø3gr jø9kj 4jøl jø4les jøl6ver jø5me jøn5ne jø5pa jør4kel jør4sp jørs5v jør4tel jø3ru jør7ut jø1rø jø4ses jøst2 jø5ta jø6t7av jø3te. jøte4t jøt5eta jø1tr jøtte4 4jø1v jø4vel 2jå jå5ar. jå9ge. jå6la. jå4le. jå7les jå5let 1ka. 2kaa 5kaa. 5ka4an4 k3aas ka3at 6kabes ka7bo 4ka1br 4kaby ka3da 6kadale ka5del ka6del. ka4deri 4kadg kadi7e 2kadr 5kadu 4kady 3kaen ka3fe kaf5fere 2kafo ka9fr 2kaft kaf5ta 6kafø 2kag k5a4gi kag2r 2kah ka5isk ka5ism 6kajo ka4ka. ka4ke. ka4ked ka4kel ka4kes ka4ki. ka4kis 6k5aksj 4kakt ka3ku ka3lam ka3lan ka6lant ka3las kald5s 5kaldt kal2e 3kalen ka5lev 5kalis k6alk 5kalky kal7la kal6lero kall4s ka1lo kal3p kal7s6v kal4ves 1kam ka6ma. ka8me. 4kameri 4kammel kam4p3i kam4pr 7kamu 1kana ka8na. 4kanda kan6da. 5k6ande. 1kane ka5ner kan4i ka5nin 2k1anl 4k1anm k3anno 5kano ka4no. ka8nom 4kansa 6kansi 3kansl 1kant kan6t7end kan6t9r 2kap. 5kapad ka4pak 3kapas ka5pe 5kapell 4kapen 3kapit 1kapp kap3re kap4s3t 1kar. 1kara 4karab 4karam karan5 ka3rav 1karb 4karbei 4karea ka6rek ka5rel 1karf 5karg ka4ri. ka6rid 6k3arki 6k5arkt 1karm kar3n ka3rol kar3om kar5pes karp3s 3karri 7karsj kars4t 1kart kar5ti 5karu 4karå 1kas 7kas. ka5se4i ka3sek kas5ev kas2ju 6kasjø ka4sk kas3ka kasko5 6kasp ka4spi kass6 kas6sad kas4sak 4k3assi kas4so ka4st 8kas5to kas2t3r 1ka7t6a ka3ted 3kateg ka3tet ka1to ka4t5op 4ka1t4r kat7s kat5ta kat4tel kat6term katte5s kat4til kat4tri ka4t5y k7au4r 2kav ka7ves k9avis kav8l9u 9kay 6k1b4 2kc k5ce kcen4 2k1d k5d6v 1ke 2ke1a8 ke9al 2keb 4kebr 4kebuk 4kec ked4 ke5da 4kedag 4kedal 5kedan. 9kedant ke5de 6kedei 4kedem 4kedes 7kedes. 2kedi 2ke5dr ked8sk kedu6 4kedy 2kedø 2keeg 2keek 2keel ke4ep ke7ern 2keev 4kef k3eff k5eft 2ke1g k3egg keg8ga 5kegladh ke5h 3kehet 4kehj 2kei k3ei2d k1eig ke5il ke1im k6e1in keis2 2kej 2kek kek2l ke3kn k1eks k5ek4t k6el. 2kela ke3l4ak 5kelal ke6lans ke6lat kel5eier kel5eig kel7eik kelei8ke. 6keleis kel3e4l 4k5elem 4keleng 4ke5lep 4keles 7k6elet 4kelev keli8e8 keli9en 3kelig 4kelign 4kelinj kel5int 4kelis ke4lise 5kelit 4keliv kel5l 4kelof 6kelov. 4kelove kels4 kels7kar kel5sl kel5sp kel5st kel3sv kelsva9 kel2t kelt3e 6kelua 4kelue kel9uka kel5uke ke4l3ur 6keluv kel5v 2kely 2kelæ 2kelø kelø8pa. 6ke5l4å kelå7re 2kem ke4mit 5kena. 6kenam ken6ap ke4nas 5kenatts ken5de 6k5en6den 6k5en4der 4kend5r ke3ne 4keneb 4kenek 4kenel 4kenem 6kenett 4kenev 3kenf ke4ni 5k6enh 4ke5niv ken3k ken7n kenne4l3 ke4nom ken1s2 4k5ense kens6t ken7te ken5t6r 4k3entu 6ke3ny 6kenø 2keo ke3on 4kep 5kepi. 9kepia 7kepie 6kepl kera7l 4keram ke4ran ker5ant 6kerau 4kered 4kereg kerei4d 4kereir 6kereis 4kerek 4ke5rem kere6n 6kerene ke6r5eng 4kerenn 4kerep ke4r5ert ke3res 4keress 4kerest 4keresu 4keret 5keret. 5kereta 7kerets 3keri ke4rif 6kerik. 4kerike 6kerikt ke4rim ke4rine 6keringi 6keringj ke4rinæ ke4ris 8kerist. 8kerista 6keriste 3kerm 7kerop 5keror 4ke3ros kero6se. ke3rot k4ert ker5to ker3t4v ker3un 4kerus keru6se. kerø6re. 8ker8øya 6ker6øye 2kerå 5kes. 4kesam 9kesam. 7kesdale 5kese. k5esel ke5sil 4kesit 2kesj k9es8ka. 4k5eske kes8ke. 4keski 4keskj 6keskå kesle6ge. kes5ped 5kespot 5ke4spu 5kest. 4ke3sta 5keste. 4ke5sted 4ke5stei kes6tem 4ke5s4ten ke3sto 4kestri 4ke5stru 4kestu 4kestø ke4s5un kes1v 2kesy kes1å 2keta keta6ka keta6le. 5ketals k6etar ke3te 5kete. 4ketek 7keth 2keti 2ketj 2keto 2ket2r kets2 ket6t7enh ket8tes 2ketu 2kety kety6e 4ketæ ketøy6s5 2ketå 2keu2 ke5ur 2kev kev2a keva8ne. 5kevas 3kevel kevi6sa. k1evj kev6ja kev4je. k3evn kev6ne. ke3vr kevæ8ra ke2yt 6keæ 2keø 2keå 1ké4 két5 2k1f k5fi 4k5g2 k3ge k5gh kgu4 4k1h kh5ak k4har khe4o khjul8s kh6m ki3a2r k3ideo 4kidol ki3dr k4ie2 kie5re ki6el ki3er. 2kif ki5g4 ki6ka. kikk8s9 ki1k8l ki3k2r kik4s ki8la. 3kilde ki4le. ki5li 4kilj kil9ja kil6le5st ki7loa ki4log ki3los ki4lov 2kilt ki7lå ki8ma. ki4me. 5kimo5 ki4mol 2k1imp kin9and ki4nark ki5nas. 6kind ki5ne ki6ne. 2kinf 1king king5and kin3ge kin5ing 2kinn kinnsi8da kinnsi8de. kinn4sp ki2no 2kins kinsi6de. 2kint kinti8me. ki6nu 2kinv kio4 4kiol 7kios 2kip ki5pe ki4p5l kip5pe kip2s3 1kir ki5re ki5ri 4kirs ki3se ki5sko ki3smu ki1s2p ki5stav ki5str ki6ten ki7ti 5kito ki4ton 4kiu k6iv ki4vek ki4v5enh ki6vi. kiv3s kj2 3k8jan kjap5pe 6k7jarn kje7fj kje7f6r 4kjegg 3kjeld kjel7leg 5kjemas 3kjemp 6kjenk kje9ny kje1s kje6t5r kjet5t 6kjor kju5le. kju5len kju9r 3kjærl k5jødi 1kjøp 3kjøri kjø4tr 2kk k1ka k2kab kk3aft k2k1ak k2k3al k2kam k4kanb kk5and k8kand. k6kanden k4k5ang k4kann k4kao k4karb k6karg k4k7art kkar6ta. k5kast k6kasu k6katt k2k1au kk1av k6kedo k4kedu k2kee k2keh kk1ei k5kel. kke6lei kk5e4lev kkel3t4 kkelu4 kke4luk kkel5un kke6nan k5ker. k4kerei k4kerel k6kerent k4kerig k4kerit kke5r6und k4kesa k5kesau k4kese k4kesi kke3s4l k4kesp k6kestad k4kete k5ketet k4ketø k4k9g2 k1ki kk3ind kk3inf kk9inn kk3ins kk3int k2kir k1kja kkjek8 kk5jent k4k5jern kkje7t kk5ju kk5k kkla4g kk3lan kk8lar kk7lau kk1lo kk1ly kk3læ k4kn kk5ne kk5ny kk6s5v k1kod k1koe k4k1of kko6lig kk5oml kk7oms kk9omt k6koo kk1op kko7s k4kosi k6kosk k4kost kk3ove k4kra kk5ram kk3rap kk3rea kk5rei kk3ren kk3res kkri6k kk3ro kkro8e kkro4s kk3ru kk4rus kk7rø kk7rå kk7s kks6al kk4sar kk5sed kk3s4ei kk4sin kk1sk kks4kj kks4l kk3sla kk7sle kk5sli kk3spe kk1s2t kks5tak kks7tep kkst4r kk8s7va kk5s4å7 kk3t2 kk5uk k4kuni k2k1u6t kk1v k2kvo k1ky6 kkyl4 kk5yr kk7yt k2k1ø k8køl kkø6r kkøy6 kk1å2 kl4 6kl. 4kla. 4k5lagt 2klak kla9ke. kla4mel 3k2las k7lati kla4tr kleby7t 3k4ledd kle4deb kle4des 2kleg klei9e k7leik k4leiv k2lem 5k6lem. 7k4leno k6lerik kles7j kle5sno kle4sp kle5sti kles7s8 2klet 8klia 4klie. 4klig 1k2lim2 3k4lini k5linj 1klip 4klit klon7a8l 1klos 2klov k3lukt 4klun klun5t k5lyd 6k7lyf 3k4lyng klyse7te k2læ klæ5res klø7na k6lør 6kløs klø9va klø5ve 6k1lån klå5re 2k3m kmann6 kmål2 2k1n2 3k2nap kna5t4re kne4b3l k4nedi 5k2nee kne8se. k4nest kn5f 3k4nip knippe6 kni2t3 3k2niv kno7g kno6kl 5knop kno9ta kno5te 3k2nu 4k3num 3k2ny kny4s k2nø knø9le kn3øy 9koa. 4ko1ak 9koane ko7ar ko2b3 ko3bo 4ko3br ko5da 4kodd ko4de. 3kodek 5koden 2kodø ko3e 3koef 4koek 4koel 4koes 4koev ko4g5eng kog9ger kog3l ko4gre kogst6 ko4gu ko6gå 2koi koi4e5ne ko7i6k ko1in 2koj ko8ja. ko4ka. ko4kab ko4ke. ko6kel ko1ki kokk6o k3okku 4kok4l 4koko 2koku kolba5 2kole ko4leg ko4lei ko6lel ko4let ko4leu 3kolle ko5lo. kol5p 4koly 2kolå 1kom ko4ma. 4komaf ko4me. 6komg ko4mi. 4komil 4komisb ko4mise 2komr 4komse kom3sl kom5so kom4st 4kom5t 4komu 4komå k6on ko4na. kon3d kon6dr kone5l6å 4koniv kon3s2 kon6s7v kon6ton ko4nu 1ko1o 4koom ko5pa ko5pers 4kopet ko4pi. ko4pip ko4p9l 4kopo kop5per 2kopr ko1ra ko4ra. kor6da. kor4d3o kord5s4ø kor4du ko1r6e 6koref 4ko7rei9 ko5rem ko7ret ko3ri ko6rik 4korm ko5rol 6korpa 6korpe 1kor3r kor4sal kor6s5inn kor4s5l kor6str kor4sv kor5tes kor6top kor4t5r kort5s4 ko5ru ko6rume 1kos 2kosa ko6sa. ko4sed ko4sek 5kosele ko5sen ko4ses ko9si kosi9d ko2sk ko1sl 4kosmu 2koso 2ko1s2p ko6sta kost7as kos6t5ers kost5j 4kosø kotes7 ko5t4i 4kotil 4kotr ko6tre kot2s kots5tr kot4ti kott4s kotts5t 4koty 2kou4 kout3 kou7ta ko1va kover7e 4kovr 1kov4s3 4koø 4koå 6k1p kr6 k3rad 1k4raf 5krag 3krakk krani6e7n 6krank 3krans 4krap kra9se 7k8ra4sj kras5s kra4to kra4u 1krav 4kred. 3kredi 4k1reg kregi3 4krei krei9e krei5s 6krek kre4kli 2krel k5rela 4k3renn 4krent 6kreo k5repr 5kreps 5kresj 4k3ress kreta9 6k7retn k4rets k3rett 2krib 4krif 7k6rig krig6s5 kri9ga 4krik kri5ke kri4kj krik6ka 1krim kri4me 3k6rins krin6s7t kri2p 1k2ris 7krisene k2rit 3krite 6kriv k2ro kro5b4 kro5de k3rofo k4rofor krok7k k6roni k5ronl kro4nom k4rop krop9n kropp4 k4rost kro9t8e kroten9 kro3v kru3i4 krum3 kru5sa krutt5i kru3tr 2k5ryg kry7pa kry5pe kry4pi 3krys krø5ke 6k5rør krø3v 4kråd krå8da kråe6 5kråk krå5le krå9m krå7ne k1sa k3sa. k2s3ad ks3alt ksa5me k3sane k4sans k4s3ant k3sar. k7sara k6s3ark k7sas k1sc k2sed k2see kse6ge k2s1ei k5sekt k5sela kse5lev ksen5to k4serf ks3erk k5serol k4sesa k4ses6k k4se3sm k5seso kses4p k5sess kses6sel kses8serie kses4sp kses4st kse6te. ksfø4 k5sia k2sif ksi5ko ks3ind k3sing ksi7ni ks3inn k4s3ins k7sio ksi3st k4siti ks9kab k6s3kal k6skio ks1kj ks5kl ksko7na ksko5ne ks1kr ksk8u ks9ku. ks7kua ks8kut ks1k6v ks1l ksla8ga. ks5lo k7s6lu k8s7lug ks5løs kslø8va kslø8ve. k5s4mak ks4mel ksmå k5s4no k7s8nø k1so k6s7oa k6sod k4sog k4somb k2s1or k2sot ks1ov k3spal ks3pek ks5pio ks3pir kspor6t5r 6k6s5pors ks1pr k8sr k3spy kss6 ks3sm k5stad k4stak ks3tal ks5tant k7s8vak ks6tav kste4da ks4teg k3stei k4stek kst3ev kstev6ne. ks4til k4stin ks1tj ks1tr kst6ran ks4t5rek k6stren k6strer ks4tri ks4tro ks9tum k5stus ks3tyv k2stå k1su k6sun ks1v k9s8vake ksva8ne. ks5veg k7s6vert k5s4vin ks5w ksy8na ksy8s7m ks5ær ksø4ke. k6s3øl ks1å k3så. k4såp ksår4 ksåt4 6k1t k5ta. kta7f6 k4tag kta6ka k4t3aks k4takt kta6la. k4t3ana kta9na. kt3anl k4t3ann k4tanv kt3app k9tar. k4t3arr k4t3art k6tass k5tast k6t7atl kt5avh kt5avk k6t3avl k3ted k4teda k6tee k4tefø kt5e4ge k2te5i k6teka kte5le k6t5elsk kt5e4lit ktem8 kt7emn k4t3enh k9ter. kterie5n kterie7ns kter5s6 k7tes. k6tesa k6tese kt5eske ktes6ke. kt5esti k4t5e4ta k4tete kt5evn ktev6ne. k5tib k3til k4t3ins k5tir ktis5t kt7i6te kti6v7end k2tja kt7ju kto9a kt5off k6togram k4toli k2tom kt5omf k2t1op k9tor. k7tora kt5ord. k5tore ktori9e8 ktor7s kt1ov kt3ral k2t1re kt2ro ktro5s k2t1ru kt4s5amb kts5ar kt5sek kt7sem kt4s5er kt6sin kts5kra kt5sku kts4kv ktsle6ge. kt6sok kt4spa kt5spre kt4sta kts6ton kts5top kt4stå kt3t8 ktu9er. k4tuk kt7und k2t1ut kt7yrk ktyr8ke. ktør7 ktør8e k6t5øs kt1øv k2t3år ku2a ku9an ku4be. ku3bj 2kud ku4dal ku4er. kue4r5a ku4et 6kuf ku4f3l 6kug k5u4gr ku7is kuit6 6kuldi kuld3r ku4led ku4leg ku6lei ku4lem ku5len ku4let ku4lev ku5li ku6li. 3kull 1kult ku4man kumen6tal ku6mi kum2s 3kumu 1kun kund5s6l 2k1ung kun4ge. k6unn ku4o 1kup ku4pe. kup4pl ku7ra ku4rek ku8r7o ku7r6op kuro8pa 1kurs kur6sk kur4sp kur4s3t kurs3v kur3t ku5ru6 kuru9ken kuru7ker 1kurv kur4v3i 1kus 5kus. ku7sa. kus5a6k kus5ar 5kuse ku4s5el ku4ska ku7s6pe kus3t 6k1ut. ku1ta 4ku5te. ku5to ku6t7r 2kuts 1kuu8 kuøy6 kv2 kva8ke k4vali k6vard kvari6e5n 5k6vart kva9se kve3d2 kve7e k6veil kvei9se 1k4vel kve5la 4k3verd 5kvern kverns8 2kves kves5t 7k6via 4kvid 3k4vie kvi4ene kvi5er kvi7la 3kvinn kvi5se 7kvist 2kviv 1kvo k1vog 6kvok k4vot k2vu 4k3væ k1vå k7we k5wu ky5a ky6el 4kyf kyf5le 2kyg ky4leg 2k3yns kyn6skjer ky2p1 ky4p5r 1kyr kyrie5ne kyr8ke. ky8sa 4kyse ky6se. kyse8te. ky3skr kys6sk 1ky4st kyst3a kys4tel 2kyt ky6ta. kyte3s k1æt3 1kø. kø2ar 1køe kø4en. kø2er 6k1øk kø4le k1øn køn6skjer k3ørr køs4 kø5se køy7ar. k7øyd køy4e5ne 1k6øyr 4kåke kå3le kån8da kå5ne kå4pe. kå7pen kå9ras kå1re kå1ri kå2t5 k5åt6t 1la. 2laa la1b 4laba la6bl 1labo 2l3abon 4laby 4lad. l6ade la4dem 4ladg ladi9e8 2ladm 2ladr lad3s4 1lae 2laei 4laent 4laep 2laf la3fl 4lagg lagi4 6lagne la2go8 lag5om la2g1r lag5san lag4sj 2laha 2la1in la5ka la4ke. 4lakj l2akk la2kr l7aksj l5aksl 4lakt lakterie6 la5kø 2lal l1alk la5mab 4lamb la4mes la4met la3mo l8a8mu 4l3anal lan2c lan6das lan6deb land3r l6a3ne 3lane. 4lanet lan6gel lan4gem lan6germ lan4gr lang3s4 lang4s5e lan6g5ø6 4lanl 4lann l3anno la4nor 6l5ansi lan5ti 4lanv l3anvi 2lao la6pal la7pi la8pl lap5sa lap5sen lap5s4i 1l8ar. 6l7arab 2larb l8are. 4l7area la9red la5rem l6aren. 4larena lare6t la6r7eta 5larf la7ria lariar lari6e7n 4l3arki l2arm lar3n 6l7arr 4lart lar6ta. lar7vet la6sc la5se lasi9e la2sk 7laskj 4lasm la5smi 4la4sp las6sak las6sam las6sat las6sel l6ast 4lastr las3v la1ta lat5ang 6latau la4teg lat6ek la4teno late5s4 la5ti la6ti. 4latm la1to lat7ra. lat9ran lat5rar lat4t5is lat4tra latt6u lau7a 2laud laue6 4laun 4laur lau7se lau6st 2laut 2lav la4v5al la4vel l5avh lav5inn 6lavs 7lavå 1law la6y5 2l1b2 lba3de lba4k lba5ke. lba4ne. l5be lbe9na lbe8re. l4boa l6buh lby4e l5bå 2l1c l4ce. 6ld l7da. ld5aks ld5akt l9dand lda6t5o lda6t5y l2deb l5den l2de5o l2dep l3der l7der. lder7a l4derek l6derik l6derklæ lderle9g lder5s6te lder6s5ti l4desh l6destr l9dé ldis7k ldo9a l8d5oks l2dol l4dore ld5ovn l3drak ld3ran ld5ras l6dre. ld7regn ld5rer. l8dres. ld1ri l7dry ld1rø ldse8 ld4sek ld4sel ld4ses lds1k ld4ska lds4kj ldsla8ga lds6leg lds4let ld4s9m ld5s4om lds3tr ld6tus ldø2 ldø5d ldø5l ld7øy 1le 2lea le7ag le3ak le1al lea5la 3leas le5at 2leb le4bem le6bosta 5lebæk lec4 2leda 5ledar led4dø 4ledeb le4dem 6ledep le5der le3des 2ledo 3ledop 5ledov le4dro le5dry led1s2 6ledu 4ledy 2ledø 4le3då 2lee 6leei 6lefa lefa6ne. 4l1eff 2lefi 4lefl 4lefor 4lefot 2lefr l1eft 6lefy 4lefø 6legap 5legas 3lege le4ged le9gen le4gera le9geran le9geras le4gero le4geta le4gev 7leggi le3gi 6legif 4legj 2le1g2l le4gol 4legre leg3s4 2legu 2legå 2leh 6lehal 6lehamr 6lehan 6lehau 6lehave le3ido l6eie. lei5ende lei4e5ne l6ei8et leig6d lei4ger lei7ger. lei4get leig4h5 leig6na leig8ne 2lein le3int lei6r7u leis7t l6eit 2lej 2leka le4ka. 6lekan lek6e le3ki 2lekj lekk7s 2lek2l 2lekn lek4na 2leko 2lekr 4l3ekso 4leksp lekt5ord lekt4s5t 2leku 2lekv 4lekø 4lekå 2le3la 8l9eld 2lele l3elem 4l5elg 5lelig 2lelo 3lels 4l3elsk le1lu 4leluk l5elv 2lely 4lelæ 2lelø lelø6pa 4lema le3me le8me. 4lemet 8lemetrisk 8l9emn lem8na 2lemo lem9ped lem5pes 3lemr lem4si lem4s5ø 2lemt lem5ti 2lemu 6lemy 4lemø 2lemå le4na. le4nal 4lenav lend8a len9dan 6lenden l6endre 4lendri 4lened 4lenem 4lenev l4engd len4g5r leng9u le5ni 4leniv lensa4 len4s5ak 4lensem len5ses len4sta len4tam len4tr len8t9ra 2lenø 4lenå 2leo 5leol 2lep le5pa le4pel le8p9enden le2p3j le8pla. le4ple 4lepo 4leraba 4leram le2r3amb ler5d l8ere le9re. 6lerea 4leref 4lereg 4le9r8ei 4lerek le5res 4lereso 4leresu 4leret 4lerev 9leri. 7lerie le6riei le7rina le4riv 4l5ernæ le5ro. 4lerom 6lerope le3ros 4le3rot 7lers. lers4p ler7te le1ru 4lerus leru8se. 2lery 5leryr 2lerø 2lerå 5l6es. le4sab 4lesam 7lesar 4lesau 2lesc le5sed le4seg 4lesek le5sen le3ser 4leset 4lesho le6si. 4lesig le7sing les5inn 4lesit 4lesju le7skap le4s3kj 6leskol le6sk9u8t 4lesla 2lesp 6lespal les3s6 lesse6ne. 4lesta 9lesta. 7lestal le5sted le5steg le5stel le4stim le3sto 4lestrø 4lestyr 4lestø 4lestå 4lesug les1v le5s6vi 4le5sy 4lesø 5lesøy 3let. le4tab 6letak leta8ka leta8le. l5e4tas 5lete. 6letea 4leteg 4letek le5ten 6letenk 6le7tep le5ter. 4letes 2le3ti l5e4tik 2letj 2leto 2let2r le7tre le5t4ri 3lets let6sj lets8k let6tea let6tr lett3s4 2letu le4tv 2lety lety8e 4letø 8letå 4leul 2leun l1eur 2leut le4ute 2lev. le6vad le6valu le4ved 4leveg 4levei 4levek 6levern 4le4vev levi6d lev5n 2levo lev1r 4levs 4levæ lex1 4leø 2leå 5lée 1lér 7lét. 7lè 5lê 4l1f l4fa. lf5ant l5far l5fe lf3f l5fig l5f6in lf5ja l7fje l6f3nul l4fom l4fut 2lg l6gaf lga8le. l4g5alt l4g3ana lga5t lga4ve. l2ged l4gela l4gele l2gem lge3na lge4r5an lge4rap lge5ri lger5un l4gery l4gesl l6ge7sp lg5g lgie8n lg1lo lg5ly lg5n lg3ob lgo2d lg1ok lg1om lg5ov lg3ref lgr9øy lg3s2e lg2sk lg5s4kre lgsle9g lg5s4tr lgu4l lg3un lg3ur l1gæ lg5ø l6gå. lg5år. lgå8va lgå8ve. 8l1h lha8ka. lhav6s5 l5hj 1li li1a li4ala li2am li5ans li4as liba5 libe5ro libi5 libie6 liby5e li4dak li4ded li4do. 2l1idr lid3t li4ene li3er. li5ers. lie5s 3lif 4lifat lif5f 3lig li4ga. li4g3an li4gar lig9art li8gas. li4g5enh li4get 5lign li4g3re lig3se lig3s4i lig3sl lig3s4p lig5s4ti lig5str li2gu 4lih li5kan li9kar li7kas li5kee li3ken li5keså li9ki likk3o li1k2l 9likn liks4t li5ku 6lila 8l5ild li3le lil5lebe lil5let li4mar li4mas li6mate l6ime li4me. 4limh limp3r lim7r lim9u li4na. 4lina6l lin6c linch5 5l4indr 4lindu lind3s4 l5indus li4ne. li3ne6a li6nem 2l1inf lin4g3j ling5l ling7sen. 5lingv 4l5inju lin5kes lin5kle lin4kv 2l1inn lin5net 3linni 6linns 6l5inntr li4nor l4inse 5linsk 4l3inst 4lint 2linv li6n5ø6 lio4no lion5sp lion5sv li5o6s 2lip lipes4 lipp4s3 li9rar li4rek 4lisak li5set lis4kl 2liso 4lisp lis6sp lis7tan lis6terk lis5ti 4lis6til list3o li6s8tr list7rø lis4t3u4 li4st5y listyr8ke. li4tee li4tek li4ti3a li4tid li4tig li4til li4tim liti5st li4tiv lit5j 6litn li5to li2t1r lit5rer lit6tele lit6terk lit6term litt5s6 li5ty 7liu li6va. li4v3ak liv5eg livi5e liv2s3 2lj l1jan l1jar l4jarb ljar5s6 ljas4 l4jed l6jee l2jei l2jek lje3l lj9elv l1jen l3jer. l4je1s l5jes. ljes4t l5jet. l4jete l5jete. l6je5t6r l2jev l5jé l1ji 3l2jod ljo8e l4jom lj5ori 3ljos lj5un l7jur lj7ut ljø3 l5jøs. 6l1k l3ka l5ka6l lkali9e8 lk4an l6k5b lk4e l3ke. l2ked l5kedal l3kede lkeei4 l6keh l5keleg l3ken l7ker. l4kera l4keri l4k5ers l4ke3ru l5kestad l5ket. l5kets lk2l lk4li l5k4lu l6k5nin l6ko. lko9ma lko9sa l2kot lkras5 lk5ri6k lk4ser l4k3s2h lk1s4t lku4le. lku8t lk9ute l6kveg lkå1 2l1l l5la6a ll6a5f l2lak ll1al l4lami l5lane ll3anl l4l5ano llans4 ll5ansk ll7apa llap3s ll4as ll5asp ll5aur llau6re ll7avl ll5avr ll3d2 lle5a l5leak lle8da. lle4d3r l3lee l2lef lle5gev lle5gr l5leha l5leho l5lehå l4l5eig l4leki l6l5ekst l4leli l2lem llen6da. ll5enden l4lendr l6lendt l4lenk l5l8ens l4lentu l4lenu ll5eple l6l5e6rik l4lerob ll6es lle4so lles5pr lle5stø l5let. l4leta l5lets llet6tele l8letæ l2leu ll5even lle7vev l5levå lle6y l2lé. ll7g2 lli1e lli5e4n l9lig l2lim l4l3ind l4lins ll3int l9lint. l3lip l4lir lli6sen l4liv ll1j ll7k2 ll5m llmue9ne llmu7ens llmu9er l5lo. llob5 l2lod l4l3off llo5id ll5oks llo2m1 llom5s6 ll3op ll5opp l2l1or l4loso l6lote ll5p llra7n ll4sak llsa6me. ll4sem lls5end llsk4 lls6kar lls5kv ll5skå lls5lag ll3smy lls4no lls4te lls6tig lls7øk ll3t4 llto4e l8lua l4lu4e l4luf ll7ug llu4k l8l7uka l4l3uke l6luks l5lum l4l1un llun6ge. llu4pi l2l1ur l3lus l2l1ut ll1v4 llva8n lly4se. l4løk ll5øks llø6pa. l4løve ll7øy. ll5øya ll3øye lløy6er ll5øy6n ll1å8r ll3å2s 2l1m l5ma. lm3anm l4map l4marki lm3av lm7b l4m3els l4melu lm5e4po l4m5erf lme7ri lme7sti lme5t4r l5mil lmi8le. lm3ind l5ming lmini6 lmin7ne lm3ins lm5int l7mis lm5l lm5m lm1op lm1s lms6j lm5s2p lm3t lmu4le. lm3ut lmyr8ke. l4mø. l6m5øs lm5øy6 lmøya9 lmå6la. lm5å4r l4m5ås 2l1n l2nab l3ne lni4u l7ny lo1al 7loane lo1a4r 5loar. 2lob lob5by. lob9byan lob9byar. lob5bye lo2bl lo2d3a lo3de lo4d3ri lod3s4m lod7ste lod7s6v lo6d5u 6loeng 6lofj 3loft 1log lo5ge lo6g5e8v lo4gir log2o lo3gop log8res lo6g5ro log5sa 4loh lo5id. lo3ide lo1in 3loja lo1ki lok4ko lok6kul 2lo1k4l 4lokon 2lok7s4 lok8se. lo1k4v lole6ge. 2lolj lolo9 l5omdr lo4m5in lom4mel lomst9r lo4nal 6lond lo5ne lon4g3r lo4nit lon7skj 2lop lo3pa lo4pea lop5pa 5l4opt lo1ra 2lord lor6da. lo1re 4l1org lor4g5l lorie6 lo1ro lo7rød lo7sa lo6sek lo4ses lo5sev los4kle lo1sl lo7sp 2lost lo9tes lo8ti. lo3to 4lottet lo1un 1lov lov7ald lo3van lo9vand lo7vane lo3var lo3ve7d6 l6over. love5re l5overn 6l5overs 6l5overt 7lovo lov3sa 2l1p l7pa lpa5re lpas5 l4pedo l4pee l2pei l2pel l5peleg l3peli l4pelin l3pesm l4peti l2peu lp2h lp2i lpin3e lpi5ne. lp2l lpo6et l4put l5q 2l5r4 lra8da lradi4u lra6ne. lre4de lre4i lre8ka lre8ke. lre8va lri8ma lri4ve. lro8de. lro6pa. lro8sa. lro4se. lrot5s lrø6re. lrø5v lrå8da. lrå4de. 8l1s l2sad lsag6 ls5ald ls4am l7sana lsan6ke. l4s5ano l4s3ans ls5ark l4sat. l4scu l3se. l2sed l2see ls3eid ls5eig l4s3ele l4s3elv l2sem ls5emb l4seno l7ser. lse2s lses5ku lses3l lses5pa lses5s lse8s5tr lse4te. l2seu l6sev l4sf l2sh l5sig l5sik l6s5ill l4sim l5simu l4s3inn ls5jakk l5sjef ls3jeg ls3jen 8lsk. ls5kabi l4s5kan ls5kari lsk5art l6s5ke lskif5 l2s3kild lskinn6 lskinns5 ls1kjed ls3kjo l6skl lsk3læ ls3koa ls5kor ls3kov l4skra ls8ks lsk5un ls7kva ls3kvi l4skå ls3kåp lskå6pa l2sl lsla4ga l7slagn lsle6ge. ls5lo l5s4luk l6s5løs l2sm l5smør lsmå6la l2snu lsok3 ls5ond lson6de. l2s1or ls7o6se l5sot ls1ov l2spa l9speg l5spei l9spel l5spi l4spr l5spred ls3pri l8s7s l4s3tak l4s3tal l6stank l6ste. ls4ted l4steg l3ste4i ls4tel ls5terr ls6ti. ls4tie ls6ton ls5tren l9stri l2su l5sub l3suk ls1un l2s1v ls7vea ls5vee lsve8en. l6s5vek lsve7re l4svik ls6vind l4sør l2s1øy l2s1å 2l1t l4taa l4taf lt3akt l3tal lta4la. l4t3alb lta6lev lt3anl lta6no lt3art lta4st lta8tes lta4t3o ltat3r lt3avk l5tavæ lt9b l3tede l4teka lte6ma. lt4en. l4t5enh lt3epi l4teras l4t5erst ltesa8me. ltid6s l4tiet l2tif lti6g5 l2tik l4tina lt3ind lt9inn lt3ins l4tivi l2t1ja ltle8ge. lt9n lto9ar l3tog lto4s lt3ost lt2r l3tra lt3reg lt3rei l6treko l6t5rel l6t7rem l4trens lt3res l5t4rest l5trev l4t5rit lt3rol lt3rom ltro8pa l5tros l4t5rød l5trå lt1s2 ltsa8me. lt5s4i lt7s6t lt2s3v lts4vi lt7t8 lt3und ltu4ra ltur5e6 ltu5r6en ltu5r6er ltur5s6 ltur5å6 l2tut l5tv. ltva8la l3tvs l4t5w l3ty lty8d lt7øl lt3øv lua8r 2lub lub6band lu6bri lu5c lu7ere 1luf 3lugar lu7go lui6 luid6er 1luj 4luk. lu4ka. 4luket luk6keri lu3kr 5l6ukt 4luly l4um lu6mel lu2mo lum6sk lu4mø lun5d4r lu4ne. lun4gel l7u2ni lun5ne 3lunsj 4lunt lu6o lup4s lu2p3u lur2e 6lurei lu5ren lu5ri 6l5urn lur8na lur8ne. lur8ta 1lus. lusa5 lu7sak lu6sel lush7e lu2s5k lus4o5 lus4sid lus4s3t lus1t lus2t3r luta3 lu3ta. lu7tet 6lutf 4lutg luth 3lu5t6he lutla9 lut6m lu1to lu4t5r 2luts lut4tal lut4tap lut4t5at 6lutv 1luv lu4va lu4ve. lu9ven lu9ver 8lv l1va l4va. lva6k l4vakti lva6la l4va4m l4vana lv8and l7var. lv7asa l4v5ass lve3d4a lve5i6s l4vela l4vele lv4en lve9ne l9ver. lve9rau l4veru l4vesk lve5sl l7v6et. lve5str l9vé l1vi lvi8ene lvi9er lvi6ka. lv9im lvin5g6r lv3iro lv1j lvly8se. l6v3n lv1of lv9op lvo8re. lvor4s lv5o4v l6v5p lvra8r lv9ri lv1s2 lv5se lv7s6k lvs6l lv9ta l5vøe lv1å l3våg lvå4p4 lvå6r l5w ly1a 2lyb ly4d7r ly5e lyes3 ly4gel ly5g6l ly8is 2lykj lyk6keri ly5ku ly7kv 6lykø ly5l ly5me 2lymp ly2n3a ly4ne. ly4n5il lyn3s2 2lyo ly5ok ly3pe ly1r8 ly8ra. ly6re. 6l7yrk ly4sa. ly4s5a4k lyse6te. lysk4 lys3kj lys9kl ly2s1l 4lysp lyst9ra 6lysy ly8ta. 4lytek ly4teri lyte5s l5y4tin ly1tr ly3ve l3z l6z5b 1læ1 6læd læ6ra. læ5rar lær4arm læ4re. lære3i læ3rer læ4re3s læ5res. lær6sv læ6ta 1lø lø3de. lø4del lø5dem lø4er løk5kj 4l1økn 2løko lø4k5r l5ø6l lø9me lø2na løns5t løp6s5 5l4ørd lør5k6 lør5n 4l5ørr 5løs. lø2sa lø5san lø5ser løs3k løs3s 2løt lø9ta. lø3te. lø4teg løva9r 6l7øv8d lø4ve. lø3ver lø5ves 6løy. 4løya 2løyd 4løye løy8ed løy5el 2løyf løy4g løyg5e 4løym 6l5øys. løy5ter lå6gal lå6gre lågs4 lå4gå 2låi lå1k4 lå6ke. lå9me lå2m5o lå2n 6l5ånd lån2s1 2låp l1åp9n 2lår lå8ra. lå9rar lå5ras lå3rin lå1ru lå6sa. lå1sk lå6sko lå4s5l lå4ste lås7ten lås5ter lå5su lå3te. lå4teg lå4tek lå8ti. 4lått lå4ve. 1ma 2maa 3maa. ma3ar 2mab ma5br ma3che mada5me ma4del ma3dra m6ad9s 4maef 4maek 7maene 2ma1f 3mafia 3mafr 6mafrå ma8ga. ma4ged ma4gel ma4ges 3magn ma2gr 2mahe ma4is ma4ja 2mak. ma5kab 4makad ma4kes mak7ke 4makl mak6le ma4kot mak2r ma3kre mak5ron mak4tal 4m3akti mak4to makts4t ma1ku 2ma1kv ma1la ma7leb ma6leng ma4let mali9e8n mal5l ma4lov mals4 mal4t5ek mal3u mal3å 4mamer ma3mo m4an. ma3nak m3anal 6manam 4manav man8ce man4dom man4don ma3ne m4anf man5g4a m6ange 4mangr mania8 2manl m3anle 4manm 5m4ann man4nem manns5l ma4no 2mao 4mapa 2mapr 4marb mar5d6 7mare. 6mareg ma3rei ma7rel 5ma9ren ma5res 3mar4i mari8e9ne ma3rin m4arka 4markit mar4kv mar5m marmo9ra. mar7n ma1ro ma4ro6p mar3s4h mar7sl mar5te ma4ry. ma6rå 4masel ma5set mash3 ma4sia ma4sik ma4sis 6masju mas4ki 4masko 4masp mas4see mas6set massø9 7mast. ma5stem 4masto 4ma5str 2masy m6at ma1ta ma5tad ma3te ma4te. ma6ted ma4tel 7maten 7mater. 6matera 7matet 6m7atfe 4matil 7matil. ma1to ma1tr 4matra ma4t5ras ma4t3re ma6t7rom mat3s2 mats8l mat5ta m8at7t8r 2mau mau4k mau7l ma1un 5maur mau7su 2mav ma6ve. ma5ven m7avh m5avk ma4ze ma3zo 2m1b m4bao mbar3d m2bea m4beb mbe9da m4bedø m2bef m2bek m4beli m2bem m4bena m4beo m4bereg m4bero mbet2 mbi6ar m2bib m3b4l mboe2 mbo4end mbo5er. mbo5ere mbo5id mbo5n m4bop mbo5re mbo9t mbu7ar. mbu4e mbue7re mbus5 m1c m6co 2m1d2 m3de md7om 1me 2mea2 me5al mea5m 2meb 2mec meck4 4medat 2medb 5mede. me4ded med5ei me7den me7det 4medf me3di 4medik 4medir 2medm me6dok 4medom 2medr me6dret med1s4 4medu me6dun me5d4us med5v 7medve 2medy 4medå me7e 2meef 6meek 2meel 4mees 4meev 2mef m3eff 6me2ga me7gal 2megr 2megu 4meh mei2e meie5n m1eig me3ild me3ind mei5ni me7isk 4meiso 2mej 4meki 4mekj 2mekk me2k1l me3kn 4meko 2me5k8r 4meks mek5t 6mekte m2el 4mela me5l4aks 5melane 5melar me3le me4le. 4meled 4melei 4melek 6m5e6lem me4l5eng 4melik 4melis 4melit 4meliv mel5le mello6m3 4melok 4melov mel4si mel2s3j melsk4 mel5s4t mel7tr me1lu mel5v melvi6 2mely 2melæ 4melø 4me5l4å5 2mem me6mo. 4m5enga men5k menle6ge. m6enn men4ny me4nom me4nor men4si men3sm men5spl men5te men6tek men4tom men5tr me4nyt 2me3o me6os 2mep 5mer. me6rab 4merad me4ra5l me4r5ant mer5di 4mered 4mereg 4merei 4merek 4merel me6rense me3res 4meress mere6t m4eri 4me5rib meri5ke 5merin merle7g mer9n mer5os 5mers mer5sk me3run mer5und 4merus 2mery me2r3ø 2merå me4råk 5mes. 2me5sa 4me5s4h 2mesj 2me1sk mes5ke 2me1sl mes6le 4me3so 2mesp 5mess 7mest. 4mesta 5meste. mes4ti 6me7sto mest3r me5stro 6mestrø 4mestrå 4mestu 4mesu 2mesy 2mesø 4metab 4me9tap me4tar me3te 4meteg 4metei 4metek 4metel 4metep 4metil 2metj 4meton me4t3ra me4tre met5ren met7rer met5res met5rik me4tru 4metræ 2metu 4metv 2mety 2metø 4metå 2meu4 7m4eu3s 2mev meva8n 2meø 2meå 2mé 2m1f mfa9ra mfar8ta mfav5 m2fek m6f3ess m4fi. m4fibr m2fit m5fru5s6 m5funn8s5 mfu6se. 2m5g6 m4ga. m4gi. mgå8va mgå8ve. 2m1h mhea4 m4hu. 1mi mi1a 5mi6al mia2n 9miane 7miar. 2miav mi6c miche6l 8m9idé 2midi mid5j mid3s4 mid4t 4mi3ele mi3er. mie9s8 2mi5f 5migraf 2mih 2mii 4mij mik6h 4mikj 2miko mik5ro. mik5ron mik5sa 6miku mi4la. mile6t mil7eti mi4lev mi7li 4milin mil6s5v 4milæ 2mim mi8ma. 5mimo m7imp mi4na. mi5nar mi4ne. mi4n5ers 4m3innh 4m3inns 6minnt min2s min3sp mins4t mi3nu m4inv mi4n5y mi7ov 2mip 4misa mi4san mi3se 4misek 4misel 9misé misha9ge 4mi7si mi2sk mis4ko mi3s4la mis9le 7mism mis4s5k mis4s7p mista9k 5mis7te mis4tra 4mistu 2misy 4miså 6mita mi3te 4mitj 4mito 2mit6r mitt3s mi5ur 2miv mi5vå m6ja. m6jan m5jar. m7jarn 2mje m7je. m1ji m8jingan m8jingar 8mjo mju7ke 1mjø mjøs5t 2m3k2 m4ko. mkro5 mku6le. mkå8pa 4m3l m7la mla6ga m2lef mlei5er. m2lek m2lel m2lem m4lera mle6se. m4lesk m6le5s8v m4leta mle4ve. ml6i ml5ja mly6se. mlø6pe. mløy3 2m1m4 m6mai mma5kl mmal5 mma8le. m4mam mmando5 mman6dol m5mar mmar7in mmar7o mmatik7ka m4medø m2meg m2mei m2me3k2 m4melu m6meni m4menu mmer5t mme4run m2me1s mmest6 m5met. m4meta m4meti m4metra mme5t6re mme3u m3mé m4mia m7mian m2mib m4mid mmie6n m2mik mmi5sk mmi5so mmi3st mm5n m3mu mmø2 mmå8la. 2m1n m2nee mn7eid m2ne9l mne4ra m5nese m4nesk m4nesta mnes9tie m9net. m4nete m2nev m6nip mn7sk 1mo 3moa mo2ar 4moba 5mode mo3dem mo5di mo6di. 2mody 3moe mo4en. m1off mofo6bi. mo6gi 5mogl mo5go m5ogs 4moh 2moka mo8ka. mo8ke mo1ki mo6la. mo3le mo4le. mo7le6s 4molt mo3ly m5om. 4momf 2momr mom4s5ø mo5ne mo4nisa mo2no mon1s mon4ste mon5t6 2mop 5mo1ra mo4ra. mo4rar mo7rar. mor5d6e 4mordl mor6d5r mo3re mores7 m2ori mo4ri. mo6rid 4m3o4rie mor4kl morla8ga mo5rok mo4rom mor4si mor4skj mor7sky mor4sp mo1rø mo9sen mo2s7k mos4o 6mostab 4motap mo4te. mo6te6g6e mo4tei mote7kl mo5ter. mo4tes mo5to 4motr mot7re mot1s2 6motsagd motsva5 mot7t mour5 3mo3va mo5w 8m1p m4pana m4p5anta m4pee m4pelot m6pena m6pep mpera8te. mpe5res m6peress m4p5erfa mperi6e7n mpes2 mpes6te mpe4sti m5pett m2pe5u mp3id m4pinje m8pla. m3p4lan mp5le. m6p5lin m6p5n m6p5ob mpoe4 m4poeta m4pog m6pok m2pop mp3opp mp1p8 mp3rad mp5ret mp3rop mpro8pa mp1s mp3sek mps4p mp5s6t mpun6ge. m9pur mp5ut. mp5ys mpø5 m9på. m3q 2m1r6 mro8sa. mro6se. mru7te. mrø9de m9rår 6ms m5sa. ms1ak ms5ant m1sc mse5lu m9s6ei m4sem m4s3eng ms5e4pl m4serv mse5s m5s6etn mse6t7jare mse8t9jas msi6e ms4ing ms3inn m4s5ja ms5kab mska9k ms6kin msk5ing ms3kor msk8u ms3lan ms6lega ms9lua ms3lue ms4ly m2sm m1s2n ms9ne ms5no ms3næ m1so m4soms ms3ori ms1ov ms3s2 m4s3tal m8s7te. ms7tea ms2ti ms5tilb ms3tim m1sto m4s5top m5s6topp mst5ord m8strand m5strane mst5red ms5tref mst5ren ms5trik ms4tru ms3unn msu9ta msu7ten ms1v msva9ra msva5re m3s4vet ms3ynd msø4ke. m4s5ør ms1øy ms1å 2m1t m3ta mt4b mtbe6 m2tee m2teg mteks7 m6te7kv m4tel m6testu mti9a m9tida mti5e m6tien. m6tif m2tik m6tini m4tiø mtiør6 m5to mt4r mt6ve mt4vin mtå5 1mu mu6a m1u2b mu2e mu3el mue7r mues1 2mug mug5l mu4he mu2k 8m9uka 4m1uke mu5la mu4leg mule6s mull2 mull6s7 mul6tiv 4muly 7mum mu3mi mum2s mun2c munes6 4mung mun6ge. 6m5univ mun3k munn5s6 mun4t3r mu6ra. mu4re. 2murn murs4 6murt m2us mu4se. mu4ses4 mu4sé mu2s3k muske6l5a must4 mus5tan 2mut 3mu1ta mu8ta. mutsa8la mut7t6r 2m1v mvak5t mva6la mvari6 mveg5s4 mvi7e6 mvi6se. 2mw 1my my5a myg4ga my3ke myk4kes myk3l my8kr my2ra my9ran my9rar my1re my4re. 4myrk m5yrke my4r5u mys3 my6sa my4se. my4so my4te. mytt6s5 5mæ mæ6la. 1mø møb3l mø7des mø6e mø9ens møkk6a m3økn 2møko mø6na mø4ne. møne9s mø8nest 6m5ønsk mø2o 3mørke mør4k5r mør5sm mør3ø mø5se 7møt mø9tas mø4tere møt9t 2møy møy9ar m5øys. 1må 2må. må5a 6måenh må7g2 må1k må4ka. må4ke. må4kes m6ål må5lar må4le. må6led måle3i målø6pe. må4ne5s6 må9nese må8pa. må4pe. må7pl 2mår måra6r må1re må1ro må1ru må1s4 må6tak 6måtf må5tr må3tø 1na na6ans 2nabo 7na7bortr na6bot 4naby na4ded na8dem nadi4 n3adop nad2s1 4nadv 8naf n1aff nafo7r na3fr naf7t na8ga. na3ge 4nagen nag3s4 nagså5 na7gø 6nah 4nair 2nak n6akk nak7ka nak6ko 5nakl na1kr n1aks nak8sa nak8se. 8n1akt nak6ta. na7kv na9lag na6lare 6nalarv na7leg na4l3ei na4lek nal5epo na4les na4l5ett na4lev nal5g nal6ge. na4lil nal6lag nal4løp nal3op nal5s2 nal3t na3lur 2naly na2l5ø 4nalå na3lå5r 5nam. na7mere na5mes na5mo9 5nams 2namø 9nan. 4nana n3anal n6ane nanfø8 4n5angr nan5k nan6ke. 4n3anl 6n5anle nan4ne na4n5o n4n5ans nan4sin nan4skj nan4s5t 4nany na7o na5pe nape4s nap3s4 n4ar. na4rap 2narb nar5dr 4narea nar7ei 4na5rek nari4e5n 7nariksk 4narkiv 6n5armé 6n5arme nar8ma. nar5s nar8ste 2nart nar6ta. nar5ti nar7v nar5ø nasa3r na4sas nas7h 8nasik na4ski na2s5t4 nasta5 8nasu na1ta nate8k na7tem 4natl 4natom natori5e6 nat8ra nat3sp nat6tak nat6tea naty5 2nauk naus6p na6va. 4navd 6navf 2navg 2n3avh na1vi 4n5avk 4navl nav4les 3navn 6navo 4navr n1avs 4navt 4n1b2 n5ba2 nba3d nba9ser nben4s nbo5et n6buf n6butr nbyr5 nbø9le nbø6n n1c n5ca ncel5 n3che nch3ei n6cot n2cy1 6nd n7daa. n6dabi n4dad nda5f n7dag4 ndags5 n4daks n3dal n4dalf n4d5all ndals3 n4dark n6d3art n8dask nda5tal nd5d4 n3de. nde5a n2deb n2ded n5defi nd1ei nd4ein nd6ek n4dekl n4deko n5d4e5l nde4le. n4delik ndel4sk ndel4st n2dem n5dem. nde5mo n5den. n6dener n5dens n2de5o2 n2dep n4derab n4deras n4derei n4derim nd6erk nderla6ga n4desi n4dest n4desu n1dé ndi4en n4d3int ndi6sk nditori5 nditorie6 ndit4t5a nd3jer nd1ju nd5k nd4lem nd4lese nd4lest nd4lev ndo9a n6dob n6d5okk nd4om4s3 n2doo nd1op n2dor nd3org nd5orm n6dote nd5rae n4d3ram nd3ran nd6rek ndre4ra nd5resen nd5rett nd1ri n1dro nd4sag nds3ak nd4s5amb nds5elv nds5ende nd4ser nd4sje nd4skj nds7kul ndsla6ga nds6lett nd7spu nd3s4te nds9teg nds5trek nd5stry ndta6ka. n6duf ndu3is n4dun nd3ung ndun6ge. n2dup ndu6si ndus7k nd7v n2dyg ndy1k n2dys ndy5sp ndø5l n2d1øy 1ne 2nea 5neae nea4g ne7a6le ne5alp ne5als nea9m ne9a8r9an nea9ren ne1as 6ne7av 2neb 3nebb 4nebe ne4ble neck5 2neda 3nedal ned3d 6n5eddik 4nedeb 4nedeg 4nedel 5nedg ne4di. nedi4s 2nedo ned5over7 ned1r ne6dre 5neds ned3st 6nedu 4nedø ne5dår 4neeg 4neei 2neek 5ne4e4r5 2nef n1eff n5eft 2neg 5negati ne3gla neg5lesp neg8r 6negru 6neh 2nei n2eid nei8dan n5eig n2e1in n3eini 5neir 2nej 2nek ne4ka. 6nek2l ne3kn nek2r nek5rin n7ekser nek5t 4nela nel3de 4neled 6nelegg 7neleggj 4nelei nelei5er 4n3elem 6nelê 4nelid 4neliga 4nelis 4nelit 4neliv nel4lov nel7s 2ne1lu 4nely 2nelæ 2nelø nelø8pa 4nelås 2nema 4n3emb 4nemel 4nemer 6nemes 2nemi nemie8 6nemj nem6k 5nemn nem5ne. nem7nel 2nemo 2nemu 2nemy 2nemø 2nemå 3nen 4nena nen5at. 6n5en6den 6nendr nene4 4nened 4nenem ne3nes 4nenesl 4nenet nen5eta 4nenev nen4ga. 4n3enhe 6nenhet 4neni nen5se nent5ei 6n3en5tr 4nenu 4neny 4nenæ 2neo 5neo. ne5o4r 7neos 2nep ne5pe 3n4er. 4nerad 6nerap 3nerb 4nerea 4nered nere6de. 4neref 4nereg 4nerek 4nerent 4nerep ne5res 4neress 4neresu 4neret 4nerev 4nerfar 4ner2g ner3ga ner3ge 4ne3rib 4nerik 4nerit ne4ri9v 5nerl nerla8ga n3erob 6neroc ne7rof ne5rok 4nerom ne5rot ne1r4ov n6ers. ner7se ner5s4i ners4p ners8ten 4ne3rul ner5un 2nery 3neryr 4nerør 2nerå 2nesa ne4sa. 5nesar 4nesc 4nese 6nesek nes6er 5nesets nes5eva ne3si nes5ind 4nesit 2ne5sj ne5skam 4ne5skar nesk4e 4neski 5neskins 4neskj 4ne5sko 4neskr 6nesku 2nesl ne3sli ne7slø nes6mi 6nesn ne7snø 2neso 3nesot 2nesp nes6sam nes4stu 5nest. 4nestas nes9tas. nes9te. 4nesto nes5tor 4ne3str 4nestu 4nestø 2nesu 2ne1sv nes8va 6nesy 4nesæ 5nesøy 4ne5så neså5re 3net. 2neta 4netaks neta6le. ne3te 5nete. 4ne3ti 6netid 2netj 2ne5to 6netom 2net4r 3nets net5s4p nett3a4 net6tel 2netu ne4tv 4nety 4netå netå5ker 2neu neu1r ne5us ne6va. ne4ve. 6ne8vent 5nevik nevi8sa 3nevn nev1r ne4y5t 2neø 4neå 1né 4néb 4néd 2néf 6néh 2nél 4ném 6néo 2nép 5nér 4név 4néå 4n1f nfall4 nfalls5 nfan5t n6foa n4fob n4fole n4fom n4fora nfor9en. nfos4 nfø5des nføy8ed 6ng n8g8ad n4gaf n6gag ng1ak ng5and. n8gan8da ng3ank n4g5arm n4gart ng5art. n5garta ngar5u n2gat ng5ato nga4ve. ng7avi ngd4 ng4ded ng4del ng4dep ng3dr n4geda n4gela n3gen n4gena n7gene n4g3eng n6geno n4genu n3ger n4geret nge5run n2ges nge3sl n4geta n2ge7v ngfø4 ng5g2 ng5id ngjen5g ng1l n5glem ng4lu ng7n ngo4d ng5odd n7goe n3g4ok n8g7o8m ng9ome ng5ond ng7o6pe n2gor ng5ord ng3ork ngos6p n2got ng3ra. n5grad. ng5rand ng7rea ng3reg ng3ren n4grend n4grer ng5rest ng3ret ng3rev ng3rid ng3rin ng7ro. ng9roa ng7roe n5g6ros5 ng3råd ng8sa. ngs5elv ng4sem ng4ses ng2sj ng2sk ng6skj ngs7leg ng5sløy ngsmå6la. ngs3ne ngs7tep ngst5rid ngstyr8ke. ngs9tør ng3und ngu5ru. ngvi4s ng5ye n1gø n2g1øy ngå8va ngå8ve. 4n1h2 nhat5 nhet4s 1ni ni1ak ni1a2n nian5dep ni2bl 4niby 4nibå 4nicr n8ida ni4del ni7dele n5idé ni6do nid7r nids4 nid5st 4nieg ni1el 7ni3e2n ni3er. nie5ri ni7ers ni5ert 4n3i4fr ni5gla ni9glo 2nih 8nij ni3ke 2nikj 4ni5ko 2nikr 4nikv ni5l4i 5nilu 4nimar 4nimas 4nimo 2nimp ni6n7al 2n1ind 4ninf ning3o nin5gr ning6s5 ningse4 nings5te 2n1inj n1inn 4ninnb 4ninnh 4ninns 4ninnt 2n1ins 2n1int 2ninv 5nio. nion2 nions3 4niop 7nios 4ni5ov ni4pet ni9pet. ni9pets ni2pl nip3li nip5si 4nir nir7kel 4nisem ni5set nis5im 4ni3skj nis4k3o ni9sol niso5ne niss4 4nistas 6nistat nis5tik 4nistil ni3str 4nisty 4nistø 6nisu 6nisy n4it ni3ted 6nitj ni4tog ni4tos nitt4r nitt4s3 nitt6sk 4nitu ni3ty nit5z nitær6e 2niub ni4umf 2niut 4niva 2nive niv5ei8 4n5ivo niv3s2 6niå 4n1j n6jah njav9 n2jed n5jede. n4jee n6jei n2je1s n3jes. n2jet n3jet. njet6r n5jett 2nk n1ka n2kak nk3aks nkal5l n2kau n4kedo n4keer n4keh nk5eie nkel5s nkelt3 n4k5enh n8keno n4k5erfa nker4st n4ke1s4 n6ketø n1ki n4kid n4kie nk3ier nk5ind nk7inf nk3inn nk7int n5kj nk1k4 n1kla n5k6lang n7k4lis nk3lok n1klu nk3ly n3klæ nk1lå n1knu n1kny n3ko n4kof nkofi8 nk5oks nko5le nkol4la n6kot n6kov n1kr n3krav nk1s2 nk4tak nk6tal nk4tin nkt3sk n1ku nku4le. nkuri9 nkurie8 n4ku6t nk9ute n1kv nk3ve n7kvit n6kvo n9ky n1kø n1kå nkå6pa 4n1l nland9a nland6se n5le nlei7er. nle8ma. nli4en. n3lj nlu4e nly6de. nly6di nly4se. nlø6pa. n7lå 4n3m nma4le. nmik3 nmi8l nmini6 nmo6se. nmusik7k nmå6la. 4nn n2nad nn5ad. nn9aft nn5air n6n1ak n4nala nn5alg n4name nn4an nn5ana n9nane nna8ni n4n5ank n5nanl n6n7anta n9nar. n4nari n6nasi n4nask n2nat n2nav nn3avl nnbo9e nnbu9e nn5d2 nndø4 nndør3 n5nea. n5neap n5nebar nnebe8r n5nebu n4nedi n2nee n6nef nn1ei n3neke n4nelo n3n4en nne6nat nne4n3o n9ner. n4nerel n4nero n7nes. n6nesj n5nes4la n4ne3st n5n6et. n4nesø n4nete n2nev n2ney nn3g2 nnhø8re. n4nid nn3ide nni3e n2nim nn7inf n5nis nni4sj nni4s3t6 nn7k2 nnle6ge. nnlø6pe. n4no. nn5of nno2m1 nn6oms nnomsy8na nn1op n2n1o4r nn7ord n4n3o4ve nn9r nnsa9ka nn4s5amb nns5and nns3ar nn5seg nnsei8g nn4s3em nn6s5enk nn4s3es nnse6te. nnsi7da nn4s3in nn4s5i6s nn6s5jak nns5kan nn5s4kli nns5op nns3or nnst6 nn6s5tab nns5tal nns5telt nns4ten nns5tep nns7tin nns5top nn6s5tre nns5tro nns3tv nn4s5ul nns3va nn6s5vo nnsy8na nn2sø nns3øk nn3så5r nn7t4 nnte6se. nnto9ga nnu1i nn6ung nn1ut nnvi4s nn1yn nny4t nn7øk nn1øv nn1å 1no noa4g no1ak 5noane no7ar. 2nob nobe4l no4bl nob5le no3b4r no5co nodi4e5n 3noe 4noef 4noei 4noek 4noent 2nof n1off 3no3ft n6ogra no5id no3in 2nok no1ki nok8r nok6se. n3oksi no9le 2nolj no6mid no6mik no4mil 4nomj nom9m nom7s2 5nomy non1s4 non5t 2noo 2nop n1opp no1r4a no5ran no5rar no5ras nor4da nor6d5end 4nordn nor4d5r nord3s4 nor4dø no9ree no3rek no3ren no7ret nor5g 3norge norges5 n3o4rie 7norit 4nork nor6kla nor6kle n4orm normlø7se nor2s nors6ka. no3ræ no4sel no4ses nose8te. 4nosp no3stj nostra4 2nosy no4ta. no4te. note5i 5notek no4tel no4tes not3s 4noty 4nou no1v no3ve 4no5vi 4n5ovn 7nó 6n3p2 n5pe npo8ta n4påk n3q 2n1r2 n9ra nra8na nra8sa n3re n4reb nrei7e n6renem n6reo n6ri. nro6de. nro6t nry6 nrå8da 6ns n1sa. ns1a4d n5sag n5sakk n5sa4kr ns3aks nsak6se. 6n5akti ns5akv n3sala ns3ald n6s5alp n5sane n4sanf n5s6ann n5sanse ns5ansi ns5ant n5saren. ns6arm n6sart n4sati n1sch n3sco nse9a8l n2sed ns5edd ns8ede n2see nse5ei nse6er n6sef n2seg ns5ege nsei6d ns5eie. ns9eig n4seks n4s3elv n2sem n5sen. n5sene. n4sener n9senes n4senet n4seni n7sens n3ser. n4sera nseri7e6 n4sesa n4sesi n4se3sk nse3sl n4ses4p n4sest n6sesu n4se3s4v n4sete n9sets n2seu ns5fr n2sh ns3ha ns7he ns5hi nsi5de. nsi4ent nsi6er. nsin5d n3s4ing ns3inn n4sinte nsi8ra nsis7k ns3jak n4sjav n5sjef n6s5jord n4skan n6s5kauk ns7kele ns4kete n9skim ns5kir n5skis n6skja n6skjele ns5kjen n3skjæ nskog6s ns5kor ns3kro nsku9et n4skug ns5kuli n5skum ns1kv n5s6ky. n5s4kye n5skyss n5slang n7slarar ns5las nsle6ge. n3s4lekt ns6leri ns5lid n5slyn n1slå ns3mi n4smal n4s5mo n4smur n4smus nsmå6la. n5s4nar ns5nes nso4d ns1of n3s2ok n1sol n4sond nson6de. nso5ris ns1ov n3sovn nspa9ra ns5pels n5spet ns1pr n6spros n7spur ns7s6 nsse4e nsså5 ns4ta. n4stak n4stag ns5take n3stam n4stank nst5art nstar8ta. ns4tau n3s6ted n3s4tei ns4tel nste6ma. ns5tenk n6step n5s4tik ns5tild ns7tilf n4s5tils ns4tin ns4t3i4s ns1tj n5sto. n3stru ns7trøy n3stue n6stuk ns5tur nst3ut n1su ns1uk n4sung ns5vang nsva9ra n2s3ve ns9veg ns5verd ns5vern ns1vi n5s4vill ns4vind ns9vis n4svu n3s4væ nsy4d ns1yt n5søn n4s1øv ns5øya n5såpe nså7pen ns7ås. 6n1t n5tab n4tagr nta4lan ntall4 nta5na. n4t5and nt3anl nt4anv nt3app n7tart n6t5arvi nt6as nta5sia nt4at nt3avi nt5avr nt7avs n2tea n5teat n2tee n4tef n4tege n4tegi n7tegn n2tei nt5eini nte5ins n5teis n4teka n7tekn n4tekse n9teleg n5telig n5tell n4tels n9telt nte4ma. nt3emb nte4mis n5ten. n4te7na n5tene. n4t3enh n5tens n2teo n5teori n5tepp nt4er n5ter. n7terek n6terest nte6risk nteriø7ra. n5ters n7tes. n4tesel n4teta n4tete nt4e3u nt5e4va nt9g nti1a n4tiat n4tid n5tiem n4tig n4tikap n5tiki n4tikl nti5kli n5tile nti3lo n9time. n7times n4t3ind nti6net n6tini n2tio n2tip n4tisa n4ti5sti nt5l nt5n nto3a n2tob nt5omf nt5omn nt3oms n2t1op n5tor. n5to5re n6torg n2tou nt1ov nt6ran n4trep n5trer nt5resi ntres9kjare n4t3rin ntrol6li n6trom n6trul ntrøy4 nt5skj nt5s6la nts2t nt3t4 n6t7ub ntu9e ntu4l n2t1u2n n4t5uro n2t1ut ntva8la nty6e ntyr3s nt7år. 1nu 4nu. nu3an nu4av nuft4 nufts5 2nug nug6la 4nu4h nuit8e nuk5 nul9t8 4nulu 6nuly nu9me 2n1un nun4ge. nuo2 6nup nu3pl nu4re nu5sa. nu5sen nu7ser nus4k5l nus7l nuss4 nu6st nus3ta 2nut nu7ta nu3te. nute6r nut5eri n7utl nu6ume 6n1v nva6la nvand5 nverle9 nves1 n5vi nvi4et nvi4ka. nvi5ke n3vu nvæ8ra n3w 1ny ny5ar. ny9ast 2nyd ny4de. 4nyef 4nyg ny5ge 5n6yhe ny3ke ny3k4le 4nyko ny1lo 2nyn nyn8da. nyn4de. 4nyo 4nyp ny8pa ny6ra. ny4re. ny7rev ny4ru ny1s ny5se ny9s6k nyst4 nystu4 ny3te ny3tr 2nyv ny8va. ny5vak ny8ve. 4nyø n1z 1næ1 næ8ra. nær9and næ8rast. 1nø nø2da 4nødd nødde5 nød3sk nød5sto nø9dun 2nøe 4nøf nø1fl nø1fr nø7gr 4nøko 4nøks nø4le. nø9mo nø5mu nø3p4 nø7ra nø6red nø1ry nø3se nø1sk nøs4l nø7te nø7tr n6øtt nøtt6r nøv4d nø3ver nøy1 2n1øy. nøy8a9n n7øyh 4nøys n3øys. nå6as 1nåd nå5ded nå8en nå6et nå8j n1å2k4 1nål nå2la nå5lev nå8ma nån6de. n1å4p nåp8na n1å6r nå2s nå5sa nåse4 2oa oa5c o1af oa4k oak6kana oak4ku o1all o3alt o1a2m o3a6n o9and o1a6p oar6d7e oar4d5in oa4r5e4g oa4r5enh oa6ré oa4r5i oar5m oa9té o1au o1a4v 2o3ba obakk8s obb4l ob4bo ob4b5r ob4b3u ob4e o4bea ober5et ober4s obers5ta obers5te o3bes 2o3bi obi5e6 1ob1j o1b2l ob5la. ob3le. ob3len o2b5li 3oblig ob4lo o1b4o obo9a 2obr ob5rar ob1re ob1ri 3obser ob5st 2obu 2oby obyl5 o5bø o3bå 4oc ock5ers o5cy 2o1d o6dab oda4f od7att odd5ei od4del od4dest od9do od4e o2deb o6d5ei o4deko o5deku o2dep oderle7 o2des o5det. o5dets odie4n o4d3igl o4dj odko5 od3oml od3ov o2d5re o4d3rø od3sk ods4ka od3s4po od5s4tol ods8t odu7s o4dy. o4dyb od5øk o5døs od5øy o2d1å6 6o1e oe6f o4ein oek6s oe2l oe4mu oe2n oen5a o7ene oeng5d oen2g7r oeng3s oeng3u o5ens4 o7ens. oen5t o3e4re o6erer oer8ma o3ersk o2es oe6sip oe6sit oes8ka oes8ke. o4etan oet2h oe5ti oev6ne. 2ofa o2fa. ofag6a o4fara ofa4se o2fav o2feb o4fei o4fera o4fe3st o1fé off9and of4fek of5fes of6fia off5id of6fr of2fu of6fy 2ofi o4fip o1fl of5le 2ofo o6fra. of9ras of1re 6o5fri of8sa of8se. 6oft of4tel oft2s3 2ofy 2og o2ga. og7ank o4gare o2g7av o2ge. o4ged og1ei oge7na. o3get og4gera og4g5j ogg3s4 og6g7u ogi3a4 ogie2 o4giev o2gif o6gig o4giko o2gil o2gim o2gin o3ging o2gi1o o6gista o6gi7str o2giv og5jer og7la ogly7 og4ned 5o4g5ni og6nel o5g6nos o2go. og6ra og4re. o4g3reg o4g3rei og4rer og7rett o4g3ri og3ryd o4g5rø og5rå ogs4a ogs6an og3s2e og1sk ogs4kj og5sl ogs4le og1s4p ogs5pa og5ste og3sti og4s5tj ogs4to ogs4tr ogs5t6ra og5stre og5sy 5og5s6y4v3 ogt6r 5o4g5åt og1un og5ø og7ås 2o1h6 ohe5te ohm9a o4ho. ohø4 oia4 o1i2d9i o1idr oid5t oie4n oi5er oi6es oi5k oi4la o1im o3in. o1ing oi2n1o4 o4insp oi6r o1is o2is. o6isa o2ise o4isi 4o1j o8je. o4jo. o1ka ok7aft ok1ak oka4n5i6 ok2ar ok5ark o3kas ok1ef ok5els5 ok5elv o5k6en o4kesk o6kev o1kj ok4kand 4okke ok6kera ok4ke5s ok3kje ok3ko. ok5kol ok4kun 4okl ok8la. okla5m ok8le. o1klu ok7lut oklå5 2okn okna8sa o3ko o8ko. ok8ol o4k3oms ok3omt oko5pe ok5opp ok3orm oko4s oko9se o6kov o1kr ok5reo o6kret o4k5ru oks4al oks4e ok4sek okse5kr ok4sem ok7sen ok6serin ok4ses okse9te ok5s4i oksi7da okst2 oks6ti ok6s5vi oks6tr ok5ta 3oktan ok3ti ok5to okto4r5i okt6r o1ku ok5u4k oku8le. oku6t ok7ute o5kva o3kvi ok5øy o3kå 8ol. 4o1la ola6ded ola8ga ol5anl ol3ant o9lar. o6larbe ola5t olber4 olbo7e olbo7ge. ol4bol olbu7 2old ol9dan ol5de. ol4dem ol4dest ol5det ol3do oldo7ve7 ol5drev ol3dri old3s4kr 2ole o5leaks o6leb o2led o2lef ol5eig ole5in o2lek o7leki o2lel olele6ge. o2lem o5lem. o5lems o7lene. o9lenes o4lenet o4leni o4leno o6lered o4leru o2les ole5sta ole5str o9let. o2lev o1lé ol4f5i ol4fj ol3g4e ol1g4l 2oli o4liba oli9e6n oli7ert oli5ne 3o6lj olke3s4 ol4kese ol4kesk ol4kest ol2k3l ol9ko ol6ku ol5kv ol5la. oll3ak ol4lam ol7le. ol4led ol4lel ol7len ol4les ol6linj ol4log ol4lom ol5los ol4lov oll5over olls4t oll5sv ol2lu ol4løp ol6løs ol6løy ol2lå olme5s ol4mest ol4må ol9n 2o1lo o4lo. o5loan o3loe o4lof olo3i ol5oks ol3oms ol3op o6l7os. o6l7o6se o6l5osf olo5ve ol4ped ol7so ols8t ol5sva ols5vik ol3ted ol5tep ol2tr ol6t7ra olt5re. olt5rer olt5ret o1lu olu5l o4l3ung olun8ge. o4l5ur ol5va ol1vo o1ly oly7d ol5ør o1lå 2om. 2oma om3ald o2ma2m om5ang oma4nif omann4 oman5t om3ars omar7ø8 om4as om1av omb6 om4bet om4bis om3bl 5ombod 1ombu 2ome o2m1ek o5meka o7menes omer6s o6mese o5met ome4tak ome7tar om1eu 3omfan 3omgre 8omh o2mia o2mib omi3e4 o4miek o2mig o7mikk o7mine om7inn om3in5s o4mio o2mir o4misj o4mist o2miu om1j 2omm om6mat om4med om4metr 3ommø 2omo o4mofo om1op omo1v omp2 ompa3t 1omr 2omre 2omro 2omru 6oms. oms3al om4sek 3omset omsko9d omsku9la om4som oms3un oms4ø omt2 3omtal om4tes om3ti om3tv o2m1u o3mus omvæ8re. 6omy omyr8ke. o2møk omø4r om5øy6 o5må 2on on3abo o4nac o6nak o4n3ang o4nap on3app o6narb o4n3arg o4n3arv onat5r o2n1a4v on5b on4dar onder6e ond3re on4d5ri onds4i o4ne. on5eie o4nele o7nell o2nem o3ner o4neru onesi6 o4nesk o4ne3s8t o4nete o2nev on7f on7ga. ong3d on5ge. on6ged onges4 on5gi on5go. ong2r on8gro ong9ros ongs4j on2gu on4gy on4g5ø o9ni. o2n3i2d oni1e o2nil on5ild o2nim oni6mi on3inf o6n7inn o2ni1o o4ni5p o6niso on3j on1k on5k6a 3onkel on5k6i on4kle on5ku onle6g on5nad on3ni on5ny o4no. o5nor. o4no4v on3ove on4sh ons1i onsi3s onsi4v ons1k4 ons7ke ons1l onsla6ga onstitue9ra onstitue9re onst5rum ons5und ons1v on4sve ons1å ont6a on3te on4ted on5ten on5ti on4tok on5tor ont2r on7ul8 on5ur onu4sk o4n5ø4 on6øy. on7å6 2oo ood1s o1off oo2k1 oo5k8a ook5es ool7a oo4m5i oo6mo o1o2p oopa8 oop9an oo4pe oop5en oop5et o6opi o1o4r oor6da oo5s oo6sp o1o4v 2op. 2opa o4pab o2pak opan9d o4pa3re o7paren o4pasj o4pau o3pea ope1i opel6lø 2open o4pena o9pend o4penet o7pent o2per 6o3per. 3opera ope6rar o7pero o5pert 2opet o4peta 4oph o1pi o4piek oping9s o4pir 2opl o1pla o4p5land op3li op9lu op4na. op4ne 2o3po 2opp. 4oppa op4p5art op4pas 4oppe 1oppg op4pi. op6pia op4pis opp3li 3opply op6poe op6pr opp5rop opp5und opp1å2 2o1pr op6re op7ru op7rå op6sa. o8p8si op2t1r o4q 4or. o6r7add or3adr o2rag or1ak 2oral or5ald o4r5alg oral4st or6alt. o3r4am o4rana o3rane o4rang o4rans or6ap or3att o4rau ora3uk or1a4v 4orb orbit5 or7by 4orc orda9ta or3dea 6ordel ord7e6pl or7dik ordi4s or4d5ise ord3it 1ordn ordre8gi. ordsa6me. ords6e ord3st ordy9ra 8ore orear8a orear8e o5rebra o8redi or1ei or1el o4rela o6reld ore6na. ore4ned ore4net or3enk oren3s ore6o5g6 o6rerf o4rero ore1s2 o5resc ores6te o4reta or9et8n o6retv o2rev 2orf orfa6re. orfi7ne orfø9re. 1or3g4a 4orga. or3ge or5ger orge4s orgi6e5ne org4sk orha9g orha9le o1ri o3ria ori5b4 ori4e5ne 5orient o7riet o2rig ori7ka o6rim or3ind or3ink or3inn or3ins oriro8 6oris oris4a 6orit o4riti oriti6me. or5ka 3orkes or5ko orko6se. ork7s2 6orl orla7te or5le orm5ang or6map or5mel or4m3un ormæ9 or4nar orned5 orne6dr or5net or4nol orn3t 4oro o3roa o3roe or3off o5rog oro5i o1ron or1op o4r1or oror9da o5rosa o5rot or3ove or5ovn orpe6s 4orr 2ors ors5alt or5sen or4serk orse9ta orse7te. or3si ors5kar orsk5ei4 ors8k9l ors4ku or1s4l orsmå8la or1sn or3s2o orso9na orso9ne orso9v ors4pa ors4ten or1su orsva9re or3sy or9sø 2ort or4t3ak orta8la. or4t5and orta9pe or4t5av orte5i6g or4tek or3tem or6t5erf or4t5erm or5tii or7til or5tis 3ortod or6tok orto9ne orto4r ort5ori or4tou ort5res ort5råd ortå4 or4t3år or1u oru8d or9ude oru4h o5rum oru4t5 oruta4 or4utf orva9ra or5veg orv3s 4ory o7rya or1yn o9r4ære 2orø or9ø8k orøk8t or5ør or3ø4v orøv8d or1øy or5ås 2os o1sa o4sa5b o6sad o2saf o4saku 6o5sau osbi7 osefi5 o2seg o5selei o2sem os2en o6sena ose5sl ose5sm oses4sk oses6sp oses4st o4seu osfa9ta os2hi os7his osi6e7ne osi5ere osi5ert o2s1ing osk3ei oskei6e o4skil osk9lar osk5len o1sko osko5p o3skri os8k3v os2l os3le oslo1 os3lod os5lu os5lø os9ma os5me os3mo o2sn o3so os7ove os6pa. os6pe. os4pil os4por os4sek os3sem os5sens osseri7e6 osse5v ossis5te os6ski oss3kj os4s5ko oss9l os6spa oss7tro os7sty os8sv ost5adr os5tal osta5le o8ste. os4teg ost5egg os4tek ost6el os5teo o4sti. o8stia o4stie o4stin os5tis ost1o os6tons ost5ran ost3re o3stro ost5rup ost7rå o5stø os1v os5øy os7år 2ot o1ta o5tad ota4l5a ot5ald otal7ev ota4lov o9tane o9tar. ot3arg o8t9arm o5tas ote7d ot6ei ote5int otek5i ote6k7la otekla8ga ote4kle ot5elem ote5lev otel6lan otel6lek otel4li otel8lø o4tena o4t5ende oten8de. o2teo o4teram o4teret o6terev o4tero oter5s ote5r8u o4terå otes6ter ote5sté otet5a otet5o otet3s6 otfø4 oti7ert oti2k otika3 ot7i6ko o1tj o6tja ot5jer ot6nero otno7te. ot6nå o1to o2to. o4to3a o5toa. o2tob oto6en. o6tof ot3off o6toga o6togram o4toi o2tol oto5ne oto4ral otor5d o2tot o2tou o1tr ot7red ot5rer ot5rev o6t7ri o6t5rom o6t5rø ots5el ot6sh otshusvæ8 ot4s3ki ots6op otsopp6 ots5pr ots5tab ot7ste ots6å ot6tank ot5tas ot5tegn ot6tenk ot5tese ot5tin ot5toa ott4s3k otts5po otts4ti ot7tug ot4typ o1tu o6t5ut o1ty oty8e ot1yt o1tø ot7å oub8 oul5l oun6ge. ou4r ou7ri ou5ro ou9sa out8a ouve4 o5vae o1vak ovanfø8 ovan9o ov3anv o7var. o6varb ova9re ov5art ov7arv oved3 o1vei o1vel ove4la 4oven o4vend o5vende ove6nya ove2r over3a ove7ra. ove9ras o6verdr overe6 ove8r5es 3o6verf 3overg o5verks 5overr 5oversik overs4p over9v o1vet 6ovh 2o1vi oviso3 2ovj 6ovna ov4nes 2ovni 4ovo o5vo. o7vom ov1or o5vot ov1o2v ov5sal ov4sek ov4sen ov9ske ov4sle ovs1p ovs5te ov4sti ov7sun ovsy5k ovta6le. ovveg7i ow1 owa8 o7was owat2 ow5h ox3 oy9ar oys5l o1y2t o1za o3zy o1ø o1å ô6ra ô2re ôr5ei ô1ri ô4t ó9sa ó7t ó8v ò9re 1pa 4paa 2pac pa8cen p5ad. pa3deb p4adg pads4 2paj 6pak. 6paka 4pake pak4kas pakke4s pakk7esl 4pakti 3pa1la pa3le pa7lim pal5in pal1j pal5lø 5palm 4palø 2pam pa5me p3anal pa4nap pan9de pa5ne pang5s6 pan3ka 9panne. pan5se pan5sl pant8r 4panv pa4ny 2papa pa8pa. pa3pe 4papo pap4pr 4papr pap3ri pa4ra. 5parad 2parb 4parek 4parena par5ess par5g 2pari pa4ri. pa3ris 4parki par6k7l par4kv par3m8 pa1ro 4parr par8ra. par9s4 par6tid par4tig par4tin par5u par7v parvi6 6parø 4parå p6as pasa5 pa9se pase6r5 4pasp 3pass pas5sab pa4s3t pas4tar pas5ti pas9v pa1t pa3te pa4tist pa6tre p8atta pat6tak 2patu p8at6v pau7k 2pav pa4ve. 3pa1vi 2p1b6 pba4ne. pbo6da pce6 2p1d4 pde4le. pdø2 pdø9d 1pe 2pea peak3 pe4a3re 4peb pec3 pe7d6a 5pedas 4pedd pe3de pedfø9 pedi9e8 pe6doa pe6don 4pedr pe4dro 4pedu 4pedy6 2pedø pe7då pee6 pe3er 2pef p5eft 2peg p5egg peg8ge. pego4 2peh pe4il pei4leg 2pe1in pe6ism 2pej 2pek pe8ka. pek4l pek4tro pekt7ros 8peku p6el 4pela pe5l4aks 5pelal pe5lar pel9d 4peled pe4lef 4pelei pe6lep 4peler pe6lev 6peliv 6pelj pel4lo 4pelov pel5s6e pel5s4i pel7st 4pelu pe5lun 2pely 2pelø 6pelå 2pem p1emb pe4nan pe4n3ar pen3de 6p5enden. 4pener pe3net 5peng8 pen4gel pen7gl peni4n 4peniv penly4 pen7s8a pensa7k pensa8la pen5sk pen4s5l pen3s6m pen5s6o pens4t pen9sta pen7ste pen7tag pen5tr 6peny 2penå 2peo pe7o6s 2pep pep5ar. pep7p pera3a 4pe4rab 4perad pe4rai pe4ral 4perap pera5t 4perate 4pered 4perei 4perek 4peresp 4perest 4peresu 4peret pe4rev 3peri perie8ns 4pe5rik peri3s4 4perit per5k per6les per5mu per5n 4pero pe3ros pero6se. per6regj per6rei 5perro pers6m per4tro per4t5rå pervi6k 2pery 6perø 4pe7rå 2pe1s 3pes. pe3se pe6se. pe7si pes8ka. p3eske pes4ke. 6pesl pes4n 5pess 3pest. 5peste. pes5til 4petab peta6ka 4petal 4petas 4petau pe3te 5pete. 4peted 6petei 6petek 4petel 4petem pe3ti 4petid 4petil pe4tim 2petj 2peto 2pet4r pe4t5ru pet1s6 4pett 2petu 4petø 4petå pe2u 2pev peva8ne. pe5vi p5evn pev6ne. 4peø 4peå 3pér 2p1f 3p6fenn p3fo p5fr pfri4 pfø5re 2p1g2 pgjer4 2p1h phav2 pha9va phavs5 phe9te phe7va phe5ve phi5li 7pi3ane 7piar pi4as 7piase 4piav 4pib pi6ca. 2pid pid3s2 pie2n 6piend pi3er. pi9ers 2pif pi9fr pig5ge pig6g9u p7i6gj 2pih 6pii pi4keh pi6kel pike5r6o pi4ké 8pikk pik3ko 4pikl piku5 pi5la pi6la. pi3lep pil4lag pillba6 pil6led pil4leg pillega6 pille6ra pil4le5s6 pi1lo 2pim pi4na. pi4ne. pi9ned pi4nel pine4v 3ping pin6go ping3r ping5sk 6pinns pin4sl pi2nø pio6n5an pion5s 3pi2p pi4pi pip9la pi4rar pi4res pi4rut pisi9e pi4ski 2piso piss4l pis4sp pis4st pis1t pis4t5r pis9t8ra. 1pit pi9ta pita7la. pi5té 2piti 4pitj 4pitr pit5t 2piu 2pi5v 4piø 4p5k4 pka5v pka8va pl6 8pl. 2plad pla8de. p4lak p4lan. plan7de 4plane. plan5g plan5s plap3 4p1lar p2las pla4st p2lat platina5 2ple. 2pled 4pleis p2lek p6le5n4u ple5n4a ple6r5u ple8se. 4plev p2li 4plit p3liv pli7va plo4gj p4lo8i p1lok 4p5lov plu4e p4luk plun3 plun6d7ri p1ly ply5d8 plæ5re plø6pa p1lå 2p3m 2p1n4 p7ner pne6se. 1po po9a pod8 po6da. po4de. po6em 2pof po6f7r pog6 4poh po5id 2poke po6lan po3le po4lek 6polj pol5li po6lom pol6s4ka po2lu 2pom pom6p9u pom5s 4pon. pon5d pon4gr pongs6 2pon1s pon5sa pon4sv po2p1a po6pe. p5opn pop1s 2por. po1ra 2p5ord po1r4e po4ref po6reg po8ré 2p1org 2pori 2pork por6s7v por4tor por4t5ro por4trå 2porv po1ræ po1rø po4se. po4ses 4posj po2st po4sta pos5tas po5stat pos3te 4pos4v 5pot. 7pota potak9 po3te po4te. potek5l po5t6ha 3poti 4potr 4pou 2po4v pove6 pover6n pow4 2pp p2pad p2pak pp3akt p2p3a4l p9pane pp5angr pp5ank p4p3anl p2pap p9par. pp5arr p7past p4p7at p4pee p2pe5i4 ppel5s6 p4pena p8p9ender p4pendr ppe9nes ppe5p8 p4penø ppe5ra p7pere. p4perkl pp7e6sen pp9esn ppes8ti p4peta pp5e4tas p4pete pp5ett p2peu p1pi pp1id p2p1il pp5im pp3inf p4p5inn pp7ir ppir8re. p4pist pp1j pp3k pp1l pp5last pp3led pp5lei pp9lev pp5n pp1of p2pol4 pp3old pp5om p2p1op pp3ork pp1ov pp5p pp1r pp5rei pp5rin pp4ris pp7riss pp9riv pp9ro. ppropri6 pp7rot pp1s ppse6te. pp3ska ppska9k pps2p pp9spe pp3spl pps2t pp7sto pp7t2 p2pu pp1uk pp5ut pp3ø4 ppøs8 p6på pr6 4pr. 4prad 3praks pra7li 2pran pran3s 5prat. 5prate pra5te. 4pray 5pref prei7er. 4preii pr5elem 1prem pren4s 1pres 6pres. pres6sak p6restas 4prett p3rif pri5ke pri4l3e 4pring 5prino 3pr6in6s5 3pr6in7s6e 3pr6in7s6i 1pris pri6s5k pris3t 2prit pri9ve 1p2ro 8pro. 6p7roc 3prof 4prog. 4proge 4progl 4p3roi p5rop. 3pros 7prose 6pru prun7ge pru5ta pru5te 6prør prørs5t prø5s4 5prøv prø5vels 2prøy 4prå prå8da pråk3i prå4ko pråk5k6 2ps p1sa. ps5a6n p1sc p3se. psei8ge p2sek p2s1el ps5e4ly p3sen. p5sens p7ser. p5sete p5sets p2sh p6sib ps5ins p7sis p3s4jo p4s3kil ps7kjen p2s1ko p7s6ko. p3skod p5s4koe p2sle p9s8lo. pslø8va pslø6ve. p3s4lå p2sm psmå8la. p2sn ps4no ps1o p3sod pspi9la ps5ple p3s4pre p4s5pro ps5pu ps3s2 pst2 ps7tal p4s5tem ps3tv p5s6tå psu4r p3s4us ps1v p2sva p2sve ps4ving p4svæ ps5w psy3ke 3psyko 4psys p2s1ø p3s2øk psø4ke. psøy8 psøy9ene ps1å 2p1t pta8la. pta4le. pt7ark p3te pte6k pte4ma. pte7re p5ti pto7g p4tou ptus5t p4tut 1pu pu4br 5puc 6pu6dy pu2k pu7la pu8le. pull6 5pum pu4ma. punk4t5 punk5t6e 2punn 2pur pu4re. pu8rea 3puri 3purk pur5u pur3v pu7sa pus4h pusl7u pu1ta pu4ta. pu5tas pu5ter pu5tev 4putg 2puts put6tr put4tu 2putv 6putø 2p1v pver7 pvi4se. py4dr py8o 3pyra py1re py1ro 6pys py6sa. py4se. pys6t 4p5z 1pæ pæ4re. pø1kj pør4ret pø8sa. pø9ta pø9te p1ø2v8 5påb på4by. på1k2 1pål på4la. på4le. p5ån på3pe på1pl p1åpn på1r 1pås på7sko på5sm på3t2 6påtå7 1påv qa5 qu2 qu9ar. 1que que7r 4raam 4raar 4rabis ra1bo4 4rabr 2raby ra3cet ra3ch 5raci ra3d2a 4radf 3radio3 4radir 4radj 2radm 2ra1dr r3adre rad2s3 radvi4 ra5ede rael4 4raerk raf4fer ra4fiu ra2fj 2rafo ra5fo. ra4fos 2rafr ra5fre 6raft ra4fu ra6fy ra7gea ra5gee 2ragl 2rah6 7raid ra5int ra3isk 6r5akad ra9kar ra7kel ra5k6ha r2akk rak4kel r6akr ra5kro 2raks rak6sa rak3s4e rak6se. rakst6 4rakti rakt3r r4a5ku 4rakv ral5ans 6ralbum 5ralds 4raled ra5leo ral3g 4r5alge 4r5algo rali5e6n ra4lin ral1j ral5le ral7m ralo6i ral3op ra5ly 4ralø 4ra5l8å ra4mag ra4mas ram3b 6r9ambi rambu9ens 6ramed 4ra4mer ram8et. 4ramil ram1o ramperi8 ram6p3u ramse8te. ramta8la. ramta6le. 4ramu 6ramy r4an. ra4naa 6r3anal ra5nar ran9cs r4an9de. r5andel rand3r rand5s6a r4ane 4ranfa ran5ge 6rangi rang5st rania8 ra6nin ran3kv 2r5anl r6anli 2r1anm r4ann ran6n5ett ran4n5in rann3s4 rans7kar 4ransv ran4tik ra5nu ran6ut 4ranø 2rao 4rapa ra4pel 4rapin ra4pir ra4pis ra6pit ra1pl 4rapo ra4pos 4rappa 4r5appl 3rappo 2ra1pr 4raps 4rapu 1r4ar. 2rarb 7rarbeh 4rarea 4rareg rar5e6l 4ra3rep rar7eta r1arg 6rargu 8rarinna 6rarinne rar8ka. 4r1arm rar8ma. 6rarn 4rarr rar3re rar5s 2r1ar5t rar6ta. ra3rø 4rasa 2rasc ra3sea 4rasel ras3h raska8ra ras3ke ra4ski ra7s6ko ra6sl rass4l ras7st 4rasti ra5s4til 4rastj rast5re 6rasty ras7v ra1ta ratak9 r6ate ra4te. 6ra5teg 8r7a6teli 4ratfe ra1to ra1t4r ra4t5ro ra4trø ra5t6røy rat5tel ratte4s 4ratub rat5ut 6raty 7raud raud3s 6raug rau6ga rau6ge. 4rau4k raus6s 2rav 6ravd rave5s4 4ravg ra1vi r3a4vis 4ravl rav8l9ut ravlø8pa ravlø8s rav6r 4ravt ra5vy ra3vør 4raw raz5z6 2raø raøy4 2r1b8 rba3d rbe2d rbede4 rbed5en rbed5et rbed9ra rbie8 rbi9er r2big r2bik rbist6 rbis5tr rbo8di. rbo4ni rbon7s rbo5re rbra5s rbrei6 rbu5en r5bø r1c 4rd r4dab r5dag rdag4s5 r5dah r4d5ak rdal4 r4dala rda4le. rdals5 rda4mes rda8n9o r4dant rd5anta r4d3arm r4d3art rd5atl r4datm r4d3au rd3d2 r6dedi rde4en r3defi rd5e4ge rd1ei r9deka r4dekl r4deks r6delo r6demi r7dena r6d7eng r6d7enh rden4s3 rdense4 rdenta8le. r4deo r6depo r4derik r4d5erst rde6sm rd3e4ta r6d7ett r8dé rdfes5 rdi3an r4diana r4dians r6diau r4did rdi3e2 r2dif rdi6gres rdig3s4 r4dika r4dikl r4diku r2dil r6dimi r2dio rdi3ov r4dish r2dit r2diu rd5je r1dju rd7m rd3n rdnæ4 r9dob r4d5o4d r4dol rdon8na. rd1op r6dor rd3ost rd1o4v rdover5 r9drad r3drak rd5ran rd7rara rd3ras r3drei rd3ret r5drev. rd1ri rd3rot rd3sei rd8ske rds4kv rds5tan rd3sto rdsto5g rds7tre rds7tu rdsva9r rd5t rdta8ka rd5tr rd7tø rd3und rd5ve rdvi8ka. r4dyg rdy5pe rdy3re r6d7yt r6d5æ r7d6ær r7d6æ5r6e rd1øs6 rdø4ve. rd3år rd7å6s 1re. 2rean re7a6r7an rear5e 4reav 2reb 3redak 6redam re3def re5den re3des re3di 3redig r1edl 2redo 2redr re4d5ri red5sku red4sl reds5la red7s6led 3reduk 6redy 2redø 2ree re4el. re3er 8refa 4reff 4refi 2refj 6refos 6refr 4reft 2refø 4regar rega7ta re3ge 4regeb re5gel 4regen 4reger 4regg 1regi re4gia re4gil reg1l 2regr 4regub 4regud 2regå 2reh 2reid 2reie 2r1eig rei8ga. rei8ge. 4reik rei9l rei5na. rei7nas re5inde rei5ne. rei7nes rein6skj re4inva rei9ra rei5sa rei3si rei7ska reis6led re7ism rei7va rei5ve 2rej 6rek. re5ka. re5kav re7ken 4rekj rekk6an rek4k5v 5reklam rek4led re5k6lir re7ko 4rekob 4rekom 4rekon 6rekos 4rekra 3rekru r3eksa 6reksp rek4ter 4reku r8el. re9la 4relag 9relandsk. 9relandske 2r2ele rele8ge. r4e5lei 6relek re7len 7relene 6relg r3elit 4re3lj r2ell rel4lag rel6land rel5led rel4lev 5r4elm rel5ses rel4sk 4re1lu 4relv 2re5ly 2relæ 2relø 4re7l6å relå7r 2rem remann6 r1emb remi6ene remi6l re7mis rem9ji remmed5 6remn rem8na rem5p4 rem1s remti9da 4remu 8remy 4remå 2re3na ren4del 4rendr 8rened re5neg re7nei 4renek r3e4nel 4renest 6renet 6rengd reng5l 4rengn reng5st re5ni 2renk ren6kl r3enl ren8ne8sl rennes9la re5no ren5sa r3enss 6r7entit 4r3en5tr 6rentu 4renu 5renz 6renæ 4renø re5og 2reop re3o2r 5reou 8repen 6r5e6pi 1repu 6repus 1rer 6rerad 6re9rang 4rer6at re5re. 4rered 4reref 4rereg 4rerei re4rek 4rerent 4rerep 4rerese 4reresu 4reret 6rerfa 4rerig 4rerik 4r3ernæ 4rerol 4rerom re3ros rero6se. re5rot 3rers rers4p 4rerute re6r7øy 2rerå 1res. 2resa re2s3c re3se 4resel re4sem 4reset resi7ere 4resin 2resj 2resk res5ke re6s7kje. res6kl res7kod re6sky 6re1sl re4slu 1resm re5smo re3sov re9spe 4respi 4respr 2ress res4sal res4sek res4sit res4sj res6sk res6sort res4sp res4st res4sy res9tane 5restau res6t5erv res4tes res3té 4re3sti res4til re3str 4restre 7restv 4re5sty 4restå 1resu 6resuk 4resun re3svi 2resy 2resø 4retaki 4retal re4tap 4retea 8retek. 6reteke 4retekn 6retel 6re5tem re5ten 4re5ti 4retj 4retoa 2re5t2r rets4i ret4st ret7ted ret5ter rett8o rett6set 4re5tu 2rety 2retø 5retøya. 7retøyets 4re7tå 2reu reu6r 4revak re5van reva5re. 6reveg 4revei 4revel re6v7enh re5ver reve5s r3e4vig re4v5inn re7vom 1revy re4v5åp 3rew 2reå 2r1f rfa5re rfat5 rfe8en. rfe8er rfe4et. rfei5li r4fik rflå3 rfe5m6ø rft2 rfu8se rfyr4 r9fæ rfø8rarar 2r1g r5ga. rga8le. rga8li rg5and r7gann r4g5anv rga3ri rg3art rga4ve. r6gedi r4gef r2gem rgent4 r3geo r4gerei r4geret r4ge3ru r4gesj r4gesl r4gesta rgi1a rgie4n r2gik r2gil r2gim r2gio r2gir rg3i4ri rgi7sl r2giø rg2le rg5le. rglem5 rg3len rg3ler r2gn r4gog r3gom r2got rg5rab rg3rea rg3rel rg5reps rg5rin r3gru rg5sc rgs6kor rg5s4le rg1sn rg5s6till rg5sto rg9stu rg2sy rgu7d rg6ut rgå9as rgå6va rgå6ve. 2r1h rhav2 rhavs3 rhjul8s rho3d r7hu rhø5re rhånd6s9 rhå9ne ri1an 4rianf 4rianl 6riansv ri1ar 4riarb 4riarr 6riau 2riav ri4ava 3ri6avo 2rib ri2b3l ri8ca. ri4co. ri5da 4ridale ri5der ri5di 2r1idr rid3t 4rieie 4rieig 4rieks ri1el 6rield 4rielem 6rielim riel4la rie4n ri3end 4rienh 4rient rien5t4r ri1er rie5ra rie5ri 4rietat ri5even 2rifa riferi9e8 rif4fi rifiserba8 6rifj 1rifl rif5la 2rifo 2rifu 4rifø4 ri4ga. rig4gr ri3gi 4rigj 4rigre rig2s rig6s7t 2rih 2rii 2rij 5rij. ri4kali ri5kan 5rikd ri3kes ri7ki rik7ken rikk5j 4rikl ri8k9la 2ri7ko 6rikon 2ri1k2r rik4sk rik4s5u rikt6 rikts3 riku6m ri3k4v 4rikå 2rila 6r5ilde 6riled ri5lei ril6lest 2ri5lo ril4sn 2rilø 4rima ri9mab ri9mar 6rimes ri5met 2rimi ri4mi. 7rimis rim7l 4rimm 4rimo ri4mor 4r1imp 4rimu rim9ut 4rimy rina5l ri5n6am 4rinas 4r5inc 4rind r3indu ri4nee ri4nes 2r1inf rin7gom ring3r ring4sa4 rings5ak ring8spa 2r3inj 2rink 4rinn rin9nes 4rinor 2rins rins6k rin6sm 2rint rin4t5j rin4tr 2rinv ri6nø 2ri1of 6ri3om 2ri1op 2rior rio5s4 riot3r 2rip 4ripe ripo4s3 4ri1r 4risau 4rised rise5i 6risek 4risel ri4seli 4rish 5risiko 2risj ri6sju 4riska ri4ski 6risku 4risky 6ristad 4ri5sted ris5tik 4ristil ri4sto ris5tof ri5stun 6ristø ri6stå 4risv 4risy 4risø ri3te 6riteo ri7ti riti9da 4ritil 4ritj ri5t6o ri5tr rit1s6 ritt8s7t ri6tun 4rity 2riun riu4r 2riut 4rivar ri6ved rive9ge ri5vei 4riverk 2rivi ri4vi4s riv5ise 6rivo 4riøk riø4r3a 8riøya 4riå r1j rj7ambi r4jere r2jes r4jeti r4jetr r4jetu rju6la 2r1k rk3akt r6kanf r4kao r4kapr r6katr r3ke. r2keh rk5eik rkei8ka r6kek r4kelo r4ke3lu r3ken. r4kenav r3kene r4keni r5kens rke5ri r4keris r4kero r5kers r4ke3ru r4kerø rke4se rkeslø7se r9ket. rk4han r3ki rki3d rki3e rki4vi rkjek8 rk5jor rk1k2 r5k8led rk2li rk5lun rk9lut rklæ5re rk2lø rklå9ra r3knek r5knep rk7nes r3kno r2kob rko6b5r r6kofo r2koh r4kola r4koli r4kope r4kora r4koru r4kosel rko6sele r4kosj r6k7ras rk5rei r5k6rem r8ks rk4sar r6k6seg rk2s1i rk4ska rk1st rk6stal rk4sten rk4s5ti rk4stj rk4sto rk6s5vi rk5ti rkti4s rk5to rku4le. r6k7u6t r4k5ve6d rk9vei r5kvel r4kver rk3ves rk5vik r4k5øl r2k3øy rk9øys rkå4k rk5åke rkå6pa rk5å4s 2r1l rla4te. rle4a r2lef r3lep r4l5e4ri r6le7sl rle4st r4lesu r4leu r3l4i rli9ke rling3s4 rli8ta rli4te. r3lj rl6o rlog2 rlo5ve rl4sk rlu4e r3ly rlys7k r6l5z rlø8pa. r5løy9 2r1m rma6ge. rma5k4l r4m5alte rm3anl rm4ans r6manv r4mare r4marr rm5av rm3b r2me7g r2mek rme6lap rme5ne r4menet r6merev r4mese rme9tar r4mey r4m5ide rmi6ene rmini6 rmin5ski r6m5inst rm5i4v rm1je rmlø8pa rmo4e r2mof rm1op rmo7st rm7p rm5s6ko rm1sl rms6n rm1st rms5til rm1su rmta8la rm3te rmu7an rmue4 rmue5ne rmu8la. rmu6le. rm5øy. r9må. rmål4 r6m5åp r9mår r6m7åta 2rn r3na r4n1ak r4n3ald r6n5appar r4narb r4n3art rnat7r r4natv r6n9a6vis rn3avl rn3d rndø4 rndør5 r3ne. rne5a2 r5neboe r2nec r4nef r2nel rnele6ge. r3nell r3nels r4n3eng r4nenh r4nerei r6neris rne3ro rne1s2 r5nes. rne6se. r8nesi r4ne3sk r4nesm rne3so rn5e4tab r4nete r2nev rne5vr r2nés rn5g6 r4ninn rn5k4 rn3n r5no. r4noa rno5b r4nod r4noi r6nok r2nom rn5omn rn3oms r4n1op rn3ork r2nos r4n1o4v rn7se rn4s3in rn5ske rn3skr rn5sla rnsle7ge rn7s6mi rn6s3ovn rn5spon rn3s4pr rn1st rn4sti rn3te rn5ti rn7tr rntre4 rnt4v rnu4 rn5ug r6n3ut r7nøt r4n5øv rnå8le. rn3ås ro1ak roa4s ro5asi 9roban 9robar 1robe ro4bed ro4bef 5roben ro4bes 5robølgj 1roc r3odds 7rodo ro5end ro7ens ro7fa ro4fel ro4fem roff5ri ro7ga. roga9ta ro7ge. rog5ret ro6gry rog1s4 ro2gu 1roi ro4kel ro5ki rok6kat rok6keri rok5kl rok4kom ro7k6l rok5n rok7s rok8se. rok5v roli7ga 4rolj rol4lab rol4lap rol4leg rolle8ge. rolle8se. rol4lis rol6ly rolo9v 2roly ro6mak ro4mal 3ro5m8an ro4mate 2rom7b 4ro3me rome5d 4romk 4r3omn ro4mor 2romr rom5sla r7omsy romsø3 rom3t ro5ne. ro7nim 6ronism 6ronista 8roniste 6ronisti 4ronn ron4na rono5s ron1s4 ronta6le. ro4pad 5ropet ro4pia ro8pla. 2ropp ro9py ror3a ror6da. ro3re ro1ru ro4sat ro5sel ro3sen 4rosl ros3la ro4sm ro6sov ro1s1p ros4st ros4sy ros7tas ro3sti ro3str rost7rø rot5ekte ro5tes rote7ster roti7ka rot5ord ro5tu 6roty roun2 round3 ro5ut ro5va. ro9vare ro7vas ro5vek ro7ven rove5re rov5sm rovve6 rò6te. 2r1p r5pa r6parb r5pefo r4peno r6penø r5pesk r5pet rp6j rp2l rp3lad rprø5ve r3pu rpun7g r6p5ut. r6p5øy r2påk 2r1r r8raa r2rag rra3r r4raro rr3d rr6e r4reb r7rebart. r2ref rre7int r4rekl r5relat r4reo r4repl r4re3ru rre5sk r4resm r4reso r4respe r3ress rre4st rres5ta rre7sti rre5str rret6s5 rre5u r3ri rri6ka. r6rip rri5v rr3m4 rrmå8la rro6e r5rom rro8sa rro8se. rro8ta rr5s2 r2r3un rr5v rrå5de 4rs 6rs. r1sa rs3ab r2s7ad r3sak rsa5ka r6sakt rsa6la. r8s9ald rs3all r5sam r4sarr rs3arv r1sc 5s6ch6l r8sedi rse6g7 r4seku rs4ela rs7eld r4seli r4s3elv rs5e4rik r3ses r4sesi r6sesu rse4te. rs6ett rsett8o r7sim6 rsimp7 rs1in r5s4ing r4sins rsis5t r7sja r4sjh rsj3or r3skad r6s7kaf rs4kam r3skap r4skar. r4skas r4ski r5skil rsk7inns r1skj rs5kjens r6skl rskla8g rsk5lar rs4k5le rs4k3læ r5sko. r5skoe rsk3op r4skor r3skot r1skr r4s3kra r5skriv r4s3kro r1sku r5sku. r5skue rsku7et rsk5und rsk5var rs5kys rsk5ø rs4lef r4slei rs4lek rs4les r5s6lit rs3lok r4slun rs4make rs4mo. rsmål4 rs6nev r1so rso9a rs5oml rso6n5 rso7n6al rso5n8e rso5n6i rsons4 r2s1or rs5ord rso7ris rs1ov r1sp rs4pan rs6pat r5spel r4sper r7spes r5spi rs4por r5spred r4spå rs3s6 r1s2t r4s5tabb rs5tank rs3tap r6st7b rs4ted rs4tem rs5tend rsten6s rs5ter. rstev9na r3stil r4s5tilf r4s5tilh r4s5tils r4s5tilv r5stis r4stit r6st5k rst4r rs9tre. rs7tree r4strin r4s5tro r5strø rst7ut rstu9va rstyg7 r3st6ø r7stå rs5ukl rsu9r rsu7sa rs5usi r1sv rs8vak rsva9ra rsvar4s5 rs1ve r3s4vek rs5vit rsy4na rsy3t r1sz rsøks3 rs9øye 6r1t rt5ad r4t5af rta4ka. r4tana rt3anl rta9pa r4tarr rt3art rt3avs r4tec r4teda r3tede r2tee r4tego r4tegr r4teie r4te3in r4teka rte6ke. r4teki r4teku rt5e4lit rte6ma. r3temp rten4s5k rtentle8 r2teo r7t6er r5terd r5teres r4teris r5terk r4terå r4tese r6tesk r6testi r4teta r4tete r4tev r4th rtian8d r4tians r4tiar rti8ar. rti5en rti6gra r4ti3kv r4tila r4tili r4tilo r4ti7na r2tio r2tip rti7sa r6tiska r4tiski rt6i9so r4tisp rtis3s r4ti5str r3titu r2tiv rtma6le. r5to. rt3off r9tofo r9tok. rt3omk r4t3opp rt6opp. rt3ord r6t7o6s rt1o4v rt2r rt8ra r9tre. rt6red rt3reg rt3rei r4t5reko rt5rel rt5rep r7trib r4t3ris r4t5ros rt3rut r5t6rål rts3ar rt4seg rts5eng rt2si rt4s5ja rt5ske rt3skj rt5s4no rt3s4pe rt4sti rt7s6trek rt4s5tøy rts5unde rt3t4 rtu6en. r7tug rt3und r2t1ut rtu8ve. rty8da. rty8de. rtyr5s rty6ra rt5yt rtæ9ra rt5øl r6t5ås3 ru3and 6ruav ru6avh ru8bl ru5bo ru4di. rud4r ruds4l ru4ele rue4r rue3s4 ruga8l ruga5t rui3d6 4ruk ruk4su rukt3s ru9la 4ruli 6r7ulk rul8ke. r2ull r7ulv r4um rum3al rum4p9l 5r2unde run5del 6r3under 7r4under. r5unders rund3r rund3s4 run6ge. 4ru2ni run5kr r7uly ru4nøy ru2r ru5ra ru8ran ru8rar ru9rer rur8ta r4us rus2h3 6r7u6sik rus5j rus7lu ru1s4o rus5sel rus4st ru4s4t3r r4uta ru3tal ruta8la. r7utan. r4utbe 4rutd rut8e rute3i ru4tel ru9tene. ru9ter 2rutg r1utk rut9o 6rutr rut4re ru6trø rutto5 2rutv ru5va ru4ved ru4veg ru4vei ru4vel ru4vere ru4ves ruvi8 ru6v7is 2r1v rv4a rva7ka rva6la rve3de rve4den r4ve5dr r4vega r4vegi r4vegr r4veim rveis7e6 rve5kl r4vela rvel9le r4v5eng r5ver. rve5re r2ves r2vev rvil9l rville9d rv2j r4vos r4vov r3vr rv2s1 rv5ung rvå7r 4r1w rx1 ry1a4 ry2dr ry7fe ry5fl ry5ke. 2ry1kl ry7le ryl4l5i8s 4r5yndl ry4nes ry5nes. ry4pa. 2ryr ry8re r1yrk ryr4ke. ry9ro ry5rø rys6sal ry5ta ry4tek 1rytm r3ytr r4z ræ7le 8r3æ4re 8r3æ4ren rær5in rær8t ræ8v 2rø. rø8ar 6røb rø4be. rø4dek rød1s 4røep røf5l rø4ke. rø4kero røk3l 4røkn røk5s4 røk7t røk1v 2røl rø6m røm1a røn5nes rønn5s4a rønn5sk røn5sko 5r6øntg rø4pe. røp9l 1rør rør5d6 r6ørende. rø7ret 5rørl rø2r3o rør4sp r8øs. rø3se rø5sla røs5v rø8ta røt9as rø1va rø5vede rø9vers rø1vi r4ø5væ 2r1øy. 4røya røy9ar røy6ed røy6ene røy5es røy4et 5r6øyk 3røyr røy5re røy8senes 6røy4s3k røy4st 2rå. rå7a 4råag 4råb 3rådet rådy9ra rå9ene 2råf 4rå5g4 2råkj råk3re rå2k3u råk1v 4rål råle7s8 rå4let rå5let. rå5lu r5ånd rån6da 2råp 2r1år rårs5k rå5ru rå1s 4råsb 2råse rå5si 2råsj rås4t 6råta råta8ka. rå5tr rå5tu 2saa 5saa. sa4ba. s6abe s8abl sa5bok s3abon sa5by sa3ce sa4dag 4sadam sa4dere 4sadm sa4do 2sadv sae5d 3saen 7saer 1safe 5saga sa4ga. sa4gas sa4gat 6sagent 6s5agg 6s5a6gi sag8na sa6go. sa4gog 2s1a2gr sag3s4 sa3ik sa5ir sa1is 5sak. sa2ka 3saka. 4sakad sa5kai 3sakb 3sakd 3s4a3ke 5sakf 1sakh sakh5e 1saki sa4kj sak5kr s4akky 5sakl 5sakm 4sako 3sakp sa1k2r 5s4aks. sak4s3i 4s3aksj sak4sp 5saksr 5saksu 2s1akt sak6ta. 5s4akto s4aku 4sa7kø 1s4al. sa1la 4s5alarm 7sala. 5sa5lat 4salb 1sa3le sa9let 1salg s4alge 4s5algo salg6s5 s6ali sal4mes sa5lo 5sal2s3 sals4a 4salter sa1lu 3salv sal5ved 2saly 1s2am 5sam. sa2ma sa5ma. sam4an7 sa5mas sam5ei sa4mel sa4met 5saml sam4lev 5samm sammen5 sa4my 4s1a2na sa9na. sa7nar sa3nat san6da. san7d8al 5s6ande. sand5r sand5s6lo sand5st san4d5ø 1s2a5ne 4s3a6nek 5sang. 3sange 4s3angr s7anken 2s1anl s5anm san5ne 6sanno sa2no s5anor san5os san1s 5s4ans. 4sansa 5s4ansen san7s6k 4s5ans8l 6sansv s8ant. san9te 6santr 4santy 4s1anv 2s1ap sa2po 1s2ar. 1sara 6sarab 2sarb s4ard 9s8are. 4sareal 4sareg sa5rev 3sari sa4ri. sar6ka. 4s3arki 2s1arm sar5me sar8me. s1arr 2s1art sar4ta. sa4ru 4sarv s4ary 1sas 8sasju 2s1a4sp 4s1ass s6ast 4sasty 2sasu 4sasy 1sat sa1ta sa5ten sa3ti 2s1atl 4s3atmos sa1to 4sa5t6r s5atsk 5satt. 4s3atta 6s5atten satte4s 5sau. sau4d sau5di. 5saue 4saug sau6ga s3auge sau6ge. 2s1auk 5saum 3saus 4saut 2s1av s2ava sa4ve. 5s6a5v6in sav5n 3savu 8s9b4 sba4ne. sbi6e sbo4da sbu6et s6bug sbul3 sby8ta 4sca 1sce 2scel s4cene s3cer 6sch. 8schl. 6s7cl 4sco. 6scoc 4scos s4cus 8s9d6 sdag4s5 sdam9p sde6le. sdu8en. sdu8er sdø8v 1se 2se1a 3sea. sea4g se3an5d se7ansa sea9re 5se4au3sk 2seb 4sec 4sedag sed5d se3de 5sede. 5sedl 4sedo 2sedr 2sedu 6sedvanle 2sedø 5see. see3d 2seef 2seeg se6e3i se3e4l se5en seer1 5sees 2seev 2sef s1eff 4s1eft 6sega sega6l se2ge se6ges se3gev seg8ga. 9segl. 7seglet 3segm 4s2e7g8r 2seh 2seid sei8dan sei9den sei8e9nes s5ei4et 2seig sei6ga. sei5ge sei5k 3se8il 6seim 2sein se3ind s3eini se6ink se3ins se3int sei5r 3seis 2sej 5sej. 2se5ka 3seke 4seki 2sekj 5sekk sek4kes 2sek4l 4se3kn 2seko se2k1r 4sekra 4sekri 4sekro 3s4eksj 4seksp sek4st sek2t3an sek6te. sekte9ra 3sek5to 4seky 4sekå s2el 2sela se6la. 3selak 5selane 5selar sel5art s3e4las se6l5at sel1d se4le. 4se5led 6selega 4selei 4s3elem 4seleng 4seles 4s3e4lev 5s6elg 4selik 4selil 4selis 4s3e4lit sel6løp 2selo 7selol se3lom 3sels sel4sin 8s5elske sel9s8lag sel4spo sel5t6 2selu se6l7u6r sel4v5ak sel4van selv3e4 sel4ve. selvei4 sel4ver sel8vin 2sely 2selæ 2selø selø8pa. 6selå 2se3ma 3semb 7semd se5me se4mi. semini6 2s1emn sem4na 9semnd 2semo sem5pe 2semå s2en. 6senau sen9d8a sen6dela 6senden 4sendr s2ene 4sened se3neg 4senem 8senesa 6senese sene8se. s5engas 2s1enh se6nin s3enkj 5sen3n s2ens 4s5ensem sen6s5end sen4sj sen3so 7s6ent sen5ter 8s7en5trep 4senum 4seny 2senæ 6senø 2seo2 7seod se3or 2sep se3pe seperso5 3sept s2er. se3ra 4seram 5seran 4serap 5seras 6serau ser5d s2e5r4e 5sere. 4serea 4sered 4seref 4sereg 4serei 4serek 4serel 4serenn 4serent 4serep 4sereso 4seress 4serest 4seresu 4seret 4serev s1erf s2eri seri6e5ne 4serik 4serkje 5serkr 5sern ser7nev 2se1ro se4rop se4ror se4ros 9s6ert ser4tak ser6tat ser4tr se1ru 4serul se4r3un ser4ved ser4vel 2sery 2se5r6ø 2serå 5ses. ses5ald 5sesals ses5alt 4sesc 2sese se4sene ses5in se3sj 4sesje 4sesjuk ses5kal ses5kar ses5kv ses5lit se3sna 5seso ses3pr ses4s5in se1st 5sest. 5seste. 4sesto ses5un ses1v 2sesy 4sesø ses3å 3s2et. 2se2t6a 3seta. se5tae seta8ka se5tar 6setea 4seteg 4setei 4setek se7tel se4tera se5tero 4setes 2se3ti se8ti. s3e4tik s3e4tis 4setje 5setje. 7setl 5setn 2seto 2set6r s4ets s5etters 2setu 2setv 2sety 6setø 3seum 4seun seure9ne seu2t 2sev seva6ne. s8e5var sev4d sevi4sa s1evn sev4ne. se3vr 3sevåg 2seyn 2seø 2seå 1sé 2séa 6séb 4sée 4séf 4séj 4sék 2sél 4séo 6sép 9sér 4sés 2sév 2s1f sfa4ne. 6sfe sfe6et. sfes5 sfisken8 sflå3 s5fo sfo8ra sforlø9 sfra5s sfri5e6re sfyrs5 3sfæ sfø9ren sfø5rer sfø5ri 6s9g6 sga4l sga8va sga4ve. sgen9s sge4st sgå4va sgå4ve. s1h 4sh. sha2k s7hat s3hau 6she shea4 s5hei5 7sh6e4rif s4hi. s6hip sh5isk 4shj 6s7hopp 3short 3show 6shs 2shu 4s5hy s5hø shø8l shø6va shø6ve. s7hå 1si sial5v6 4sia5m si7ans 4siap 4siav si2bl 3si2da 3si4de. 3si3den si4deo s4ider si5der. si4dete 2si2do 4s1idr sid8ra 4sidy 4sieg si1el sie4n si5er. si6eren sie4s si3est 6sife si3fl 2sifo si4f3r 2sifu 4sifø 3sig siger4s 4sigi 4s3iglo si5gr 4sih 3sik si3ka si5ke. sik2h7 sik4ka sikk8artet sik4k5el sik4ko siko3 si4kom si4kop si4kos si4kot sikt4s3 s2il 5sil. 3sild sil4del sil4der sil4des sil5j sil2k sil4les 2silø si6mel 4simet 2simp si3mu 4sinde 4s3indu si3nek 2s1inf sing4s5a4 7singu si4ni 4sinj 2sinn 3s4inn. 7s4inna s6inne. 5sinnet s3innh s5innk s3innl 4sinnt si5nob sinsk5e 2s1int 4sinv si6nø 4si5ov si4pa. si8pe. si6re. si7ren si4ri. sir8kl s2is si5sel si4serf sis5e4v si6sin 6sisju si4sk sis5ke si4sn si4s5te si4sti sis3to 4sisy 3s2it si5ta sit8ji si6t7ra si4t5re si4tri sit3s4 sitsva9 sit6term sit4tes si4umf 4siut 5siva si9van si6vek si8vi. si9våt 1sj 2sj. s2ja. 8s5ja9g 4sjam s4jan 4sjanl s7jarn 2sj3av 6s7jaz 2sjb 6sjd 5s4je. sje4f3i sje4fla sjef5t sje3g sjek4t5o 3sjel sje4lev 3s2jen. 5s2jene 4s3jent 5s4jer. s2je5s4 5s4jet. sjet4ti 2sjf 2sjg s6jim 2sjk 2sjl 2sjm 2sjn 2sjob 5sjok 4sjom 9sjon sjons7 2sjor 2sjou 2sjp 2sjr 2sjs 2s6jt s6j3t6sj sju1a 6sjub 6s7jug sju8la 4sjun 4sjur 2s7jus 5s2jø sjø3k6 sjø1p sjø9rø sjø1s2 sjø3t8 6sk. 1ska 2ska. 4skab skabe3 s2kad 8skae 4s6kag 2skak 5s4kal8a ska5lar 2skam s4kaml 4s5kana 4skande 4skane 4skano 6skant 5s6kap. 9s8kapa. 4skapas 5skapen. 6skapit 4skapp 2sk2ar sk5arab sk7arbe 5skard 4s5kark 6skars 4skart 3s8karv 2skas 4skate 8skay 4skb 6skd 2ske s4keda s6kedo s2keh s6kei skei5er. s8k5e4lev s6kelik skel3t s4kelu s3ken. s4kena s6kenav s4keno s5kens 5skept s5ker. s4kero s5kers s2ke1s ske3si skes4m ske5sn s4ketet s3ke4t3j s6kev s2key 2skf 2skh 1ski 5s6ki. 7skia 4skid 5skie 5skif 5s4kik s6kill 5s4kilt ski6net ski4nin 5sk8inns5 skino6 5skiol 5skip 2skir s4kire 6s5kirk sk5irs s6kis. 7skiss 4s5kist 5s2kiv s6kje. 5skjema 6skjemas 5s6kjer4m3 3skjer5m4e 7skjers 3skjor 4s5kjærl 5skjøn 6skjøp skjø5res 2sk1k4 2s1k2l 6skla sk5lak s6k5lan s5klas sk9leg s6klei sk3lek sk5ling sk5lit s4k5luf s2klyd 2skm 2skn s1knu 4skoa 7skodd 4skof 3s2kog 2s3koi 1skol 7s4kola 3skole 4s3koll 4skom s6koma s5k6ome 6s1kon 4skoo sk5ord s6korpi s7kors 4skort 2skos s2kot 3skott sk8ra s4k9ra. 5s4kral s4krat s2k7re. 4s3kref 6skreg 5s8krek 4s3kret 5skrevn 3skrib 3skrif 4skrig 3skrik 3skrip 4skrite 3skriv 5s4krog s3kron 4s3krop sk6rud skru3s6 6skryss 1s2krå 2sk1s2 2sk3t4 5skud 1s4kue sku4end sku4er skue5re 1skuf 5skulan 5skular 3skule 6s5kulis 4skull s4kulp 4skult skum3s 2skun s6k5underv 4skup 8s5kurs 8skurv 2skv sk5va. 3skvad sk3vas s6kven sk3ver sk5vit 3skvu 1sky s6kya s6kye 4skyr sky3re 4skys 6s6kyss 5s6kysk 3skyt 6skæ 6skø. 6s5køa 4skøe 1skå skå5re 6skåt sl4 sla8da s3lade sla5ge sla8ge. sla5ke s5laks 3slakt 3slal 4s3land slap5pe s5laran s5lare 4s5last s1lat sla4te. 4s1lau s5laus sla1v 3slave sla4vin 2sle. s8leda 7slegare 5s6legas s4legi s4legn s6legr 6slei slei5er. s4leiv 8s5leke s5lekk s2lel s4leme 4sle7ne s6lener s6len6t3 2sler 8s5les s6lesj s4leso s6lest s4leta s5lev s4leva 4sley s5lia 2slid sli4en. 6slig sli5ke s4likk 2slin 8s3linj slin6t5 3slip 5s4lit. 3s4lite 4s5liv slob5b slott4 s6lott. 7slottet 1slu 8slu7a 2slu2e slu5es 6sluf 4slug sluk3s6 slum4p5 slum5p6e s3lund s5luns s6lup slu7sa s4lut s1ly sly8et. 1s4lyn 4s5lys sly8t slæ6rari 2sløn 8s5løp slø4pa. s6lør 2sløs slø8s5a 3s4løsi slø5va slø5ve slø5vi 5sløyd sløye7 9s4lå. s4låe s1lån slå5ner 1slåt s1m sma6d 3smak. 5s4maken sma9let 4sman s4med. s4mede 6s5medi s4medk smeg5 4smei smek7l s4mekt 8s5meld 3s4mell 5s4melt 2s5men 3s4mert 6smes s6mesi s6mia s4mie smi4ene s4mig s6mil. smi7la s6mile smini6 s2mit smo7a smo8de. s2mok 6smot 3smug 6s5mugg smul2 s6mula s4muld s6mule 5smurt 1s2my4k 6smøn 1s2mør smør3s 4smøt 5små. små5r s8mått s1n 8sna. s4nab 7snak 4s3nas 6s3nat 4snav 4sne. 4sneb 4sned s6nee s4neg 3snei snei5er sne4kri s7nekt s4nel 2snem 4sner 6snes sne9sa snes9v 4snet s6nif sni6gl s2nik snik5ko 3s2nil 6s3nin 3s2nip snir4 5s2nit 2s3niv s8no. s6noe s5nord 6s7not 5s6nud s3num s4nur 7snut 8snyh 2snæ snæ4re. 5s6nø. snø5d4r 5snøe 1s2nør snø1s snø5vi so3al so8ar 4soav 2s1ob so2bl 1sod so4da. 5soe sofa1 so4fag so4fas 6s5off 6s5ofre soft1 so2ga so8gi so7gl sog6nem 6soh 5s4oi4 so5id 5sokn 4soks sok4se. 7sol. so4la. sol5av 1sold so4le. solei5er so4lene sol5f6 1so7li 2solj so2lo so8lo. sol3s2 sol5t4 so4lum so4lø 3som. so6mend 4s3omfa 4s1omg 5somh 2s1omk 4soml 1som5m sommar5a 3s6omme somme6r5e6 2somr 7somren 5somrer 6s3områ s1oms som5sl s4omst som5sti 4somsy 1s2omt 5somt. 6somta 3son so4na. son7da 7s6one so8nea song3s4 so4n3o sons4k son5st so2nu so4ny. 2s1o2p so7pak so9par so7pet 3sopp. 5soppa 3soppe sop4pi 8sopple so3pr 1sor. 7sora so3ran 5sorb 4s1ord sor4da 1so1re so4rek 7sorga. sor4gl so2ri 4s3orie 7soris so5riu 4sorke sor5n 3sor5s 7s8ort 1sos 4s5osc so8se. 6sosf 4sosj so4sl so5te so8te. so4tra sots4 sot5te sot4ti 4sou 2sov so3va so4ve. so5ven sover5e sove3s4 5sovet 3sovj sp2 4sp. spa5g6h 7spak. 7spaka 5spake 8spakk s2pal s3pall 5spalt 3s4pann 3spari 4spas 5s6paser 4spe. spe4a 8speda spe9dé s4pee 1s2pei s2pel spe4leg spe4les 5spelet 3s4penn s4pent s5pep spe4r5and 6speri 4sperl s4perr s3pers 3spesi s4pest s9pet. 1spi 6s5pilo 4sping s2pio 2spip spi7res spi7ri spi7ro 5s6piss 2s3piz 2s1pl 8s9plant sp9lar 4sple s4plin 3split sp6o 2spoe spo6et 2spol 5s6pole 6s7poli s4pora s4pore 5s4pors sport6s5 3sporv 2s5pos 4spot s3pote spo5v 9sprag 5spran 6s3preg 5sprei s4prek spre5ke s3prem 5s4pren 6s5pres 5s4pret s6print s5prio 8sprinsi 8s3pris 8s7pro 6s5prob s3prod 4sprof 5sprog. 5sproge 5s6pross 1spru s4pry 3sprøy 5språ 2s3ps 8spub 2spul 3s2pyd 5s2pø 6s3pøl sp5øy 9spå. 5spåd 8s9r sre8ka sre8ke. sri8e9 sri8ka sri8ma sri4ve. s5ro sro4e sro6pa sro6sa sro6se. sro2t sro9te srot5o srø1v srå4da. sråde9r srå6ders srå8ma 4s1s s7sabel s7sabl s6sae s4saj ssa8ke. ssa6la. ss5all ssa4me. ss5amp s5sane s7s8ar. ssari8e9n s7s6arm s4sarr ssar8ve. ss6as ssau8sa ssau6se. s6seet s2seg sse5ge ss5egg ss4el sse5li ssel5s ss9elv. ssel5v6å s2sem s5sen. sse8na. ss5enden s5sene s4seni ssen6ke. s4senu s6senå s5ser. s6serab s6serat sse7sk s4seski s4sest s7set. s9sets s2seu s4sey s2sh ssi4a ssi7e6rer s4siff s6silo s8s9ime s6s3ind ss5init ss3inj ss3inn s4s3ins s5sis4 ssis5m ssi6v7end s5s6jarg ss4kape ss3kar sska8ra ss3kof s7skog s4skor ss6ky. ss4kye ss4kå ss5kål s7skåp s2sl ss1lo ss5ly s2sm ss6nar ss2no ss4nø s4s5nød ss5nøk s2sof s4sok6 sso5lo s2som ss4oma sso3ra s4sorga ss3ove ss6pil ss4por ss9ri ss2t s5stad ss4ted ss3tek sstel6li ss5tep ss7tilp s7stip sst6r ss5tren ss4trå ss3tus ss3t4v s2sul s3sur ssva7ra ss1ve ssy6na ssy5r ss7øye s6så 6st. 2s1ta. stabs3 3s6t2ad stad3a sta6d3o s5tafa 3stafe sta5fl st3aft sta7ge 4stah sta6ka. 5stakk 4stakl 6stal. 6sta4la sta5lak st5ald 4stale sta4le. 5s6tali 5stalt s3tame 3stamm sta5na. 3s4tand 6stande. st8ane s4tanf s4tang stang5s6 st3anl sta8n9o s6t5antr st3anv 4stao 2stap s7tapa s4tapp s8tapå s3tari 1stas 3s8tasj 4s5tast 1stat 4stato sta5top sta3tu 3stave 2s4t5b st7c 2std 2s3te. 2stea 2steb 3sted. s4teda 5stedt s2tee 2s4tef 3s6teg. stega6l s4tege 3stegh 4s5tegn s4tegr 4stegsp 5stegspl ste4her s2t4ei stei5er 4steikn ste6in6s5 3s4tek. 4s4teka s6teke ste4ket s4teki 4s5tekn 4steko v4s5tekst s4tekt s8te5kv 4stela ste5le. s5teleg ste5lev s5telig 5stemd 3s4temm 5stemn 4stemø sten5a ste4nar 5s4tenen s4tener 4ste5nes 3s6teng s4teni 6stenk 4steno stens5l 4steo s5teol 2step step7per st8er. 8s5tera s4teram s6terest s4terev s7t6erf s4terid ste7ris s6teri6v 4s3term 6sterr ste5run 2stes s4tese ste7sle 4stet s4teta ste7t6r s6tetø 4steve 4stevi 6stevl 5stevn 6steå 2s4t5f 2stg stga6ve. stgå8va stgå8ve. 2s6t5h st5he 2s3tia 4stib s5tibe s9tibl 3stic 6s5tid s6tidel sti5en s2tif 3stift s4tigen 7s6tigi st9i8gj 3stign s5tij 6s5tika 4s5tike s4tikl 3s6til. 5s4tila sti4lag 4stild 3stile stile9ge s6tilk 6stiln s4tilo 6s5tils 5s4tilt. 6s5tilta 5stilte 4stime sti7mer 6stimé 3s6timu s6t3ind s6tini 4s6tinn s6tinst s6tint 1s2tip 4s3tipp 6stips 5stir 2stis 6s7tisk 4stitt 4stiå s4tja 5stjel 4s3tjen s6t5jent 3stjer 4stju 2stk 2stl 2stm 2st5n2 s2to. 1stof 2s3tog 4stoks 6stokt 3stoli 4stolj s5toll 4stom s9tomm st3oms 6s5tomt 4stoni st3ope st5oppl 6s8t5ord sto4ret s6torm stor3o 4stors st5o4s s1tot sto4t5r 5s6tore. st5ou 5stova 2stp 8str. st3ra. 4s5trad s8traff 6strafi 6strail st3ral st4ran stra8na. 5strand 4strane 6strans 4strap 4strar st7ras. st7rast. 5s4traum s4tre3a s4tred 7s6treik st5reis 7strek. st5rekl 6streni st5rer. 6strers 6strh 9stria 9s8trid 5strie st5rige st3rin 3s4t6rip 5stri3s 6stroe s5t4rog 5s4trok st3rol 6s4t5rom st3ron st7rop. st7ro6pa s6trope s6t7rug 9s6truk st5rum. 2stry 6stryg s7trykt 4s3træ 1s2trø 6s5trøb st6røm 4strør 4strøs st5røse s5trøst 4strøy 6stråd 2st5s6 stsa6me. stsy8na 4st7t6 stta6le. st3t4r s4tua 1s2tub 3s4tud s2tue stu4el stu4er stue5re 3s4tum 6s3tung 6stunn 3s8tunt 6stur 2s4tut 2stv s3t4ved 1sty 2stya 2styd 3s4tyk sty6l 2s5tyn 2s7typ 3s4tyr styrs3 6stysk 4styv sty5ve 1stø 2støk 5støl 6støm 5støp 6størk 5støt stø7va. stø5var stø3ve stø5vi st8øy 1stå 5s4tåe stå5k 4su. 1su4a su7a8l 1su2b sub7l sub3o 5subs s3ubå 1sue su8er su2f 5s2ug su6ga. su4ge. sug3g su2h 3sui6 su3is5 suit5a su2k 4s1uke 3suk5k suk3r 1suk5s su4le. 3s4ulf su4lik sul4t5r s1ulu 2suly sulæ5 3s2um 4s3umid su2mo sums6 5sund. 8s5under 5sundet 5s4undi sun6d7r 9sunds sun4ge. 6s7u2ni su4o 3s2up su4pe. super3 supi9 sup4r su8pre sur5d su4re. 4s3u4rei 1surf su4rie su4riu surs5k sur4sp sur4sti 1sus su3san su4se. su6s5es 4susi su4sik sus3p sus3s su2sy 2s1u4t1 sut6ra. sut8reg 7suv 8s5u6vi sv2 6sv. sva5a svai5 5svak. 3svake 6svaks sva4la sva4les 6svalet 5s6vali 7s6vam s4var. s4varet s3varm 3s4vart 6s1vas 6s1veg sve6g7i s5veie 3s4veis s5veka 6s5veks 5s4vens sverd5s4 sve4re sve8res 3s4verg 5s4verj s5verk sver4ki s4verm 6s7verv 7s4vev s4vie svi6e3l 4svig svi5ke. 6svikg 4sviks. 3svikt 4s5vikti 4svil s6vindel svi4nes sving5s4 ll6svint 4svir 2svis svi4sa. svi4se svi5sen svi5ser s8viv svi9ve 4svol 5s2vor svor7t s3vr 3svul 5s6vulm s3vy4 svye7ne 1s2vø 4svæs 2s7vå 1sy sy4c sy4de. sy5den 5sye sy2er sy8ka sy4ker sy5kere 2syko sy6kog s4ym sy7me s2yn 4s5yndl synk4 syn6sk syn3te sy4ra sy5rar s6yre sy4re. 2s1yrk syr4ka syr4ke. 3sy1s sy4se sy2sl sy2s3t sys4tr 2sy2t sy5ten sy5t6h 9sytt sy2vå s4z sz3c4z 6szt. 1sæ sæ2l 8s3æ4re 8s3æ4ren sæ4r1i særle9 sær5s8 7s6æ5te4 4sætt 1sø 4sø. sø2d s1øde 4søf søg4 4søj 9søk. 3s6øke 5søkj 5søkk søk7kj 3s6økna 2søko søk4sk søk6s3e6 5s6øksm søk4ta 3s4øl sø4la. sø4le. sø5let 3s2øm sø6må 3sønn s1øns s4øp sø4ras sø4re. sø4r5end søren6de. sø8ret sør9ett 7sørl sør3s sør5ø 3s2øs 4søs. sø8sa 7søt sø7tast sø7tel sø5tes 2søv s1øve 3søvn 2s5øy. 4s3øya søy8de. 6s5øyd 8søye 3søyl 6s5øy4n søy2r 2s7øys 5såg s3å2ke 5s4ål så4le. 6s1ån sån4da sån6de. så2p 9såpa så5pet 6s1åpn såp9u så2r så6ra sår9ast. så4re. sår3sk sår7ø så2s s7åsa s4åsb s5åse sås5k sås5t 9såv såva7 ta1a 4tabo tab2r tab2s ta4bu. 4tabø ta1c 4tad ta2da ta8d3ei ta6d3e4t tad5spa tad7s6v ta6du t8ae 6taei 4taek 4tael 1taen 4taend 4taenh ta6es 2ta5fe taf7f6 5tafis 4tafl 1tage 4tagj 8tah ta7is 1tak. ta4ka. 4takau ta7ken ta5ker tak7kel tak5k4l ta8k9la 2takr tak4sal tak6se. tak4si 4t3aksj 5takst tak4tal 4taktig tak4to t5aktø ta1ku tak3v 1tal. ta9lam ta3lan tal5ang ta7las 3tale ta4lei tal5eie ta4lek ta5ler. tale7s6 1talg tal6ge. 7talj talj5es tal4led tal4leg 8t7allerg tall7es tal8lign tall6s9a tal4ly tal3op 6talter t5altern ta6l9u ta6lå 2tamb tamba6ne. t3ambi t4ame 4tamet tam4i 2ta3m4o t6an. ta2na 4t3anal ta3nar ta5nas ta5nat t5andak 5t6ande. t7andel. t5andele tand5r tandø4 tandør5e 1tane ta4nel ta5nem 4tanett t3anfa tanfø6 6tangf 6t3angr 1tank 2tanl t3anle 2t1anm 3tannl t5anno tanns4 tan6sk tans5ka t5an5sl 4t5anstr 4tansv 8tantil tan4tra 6t7antre t3anve 2ta3o4 5tap. ta4pa. 1tape ta4pe. 3tapi 4tapl 4tappa 5tappi 1t4ar. t6ara ta4r3ak 4taram ta6rare 2tarb 3tarbo 5tarbø 4t9arena 6t7ark. tar8ka. 4t5arke 4t3arki 4tarra tar9si tar7sp tars6v 4tart tart7est t5artik tar7tit tar4t3r ta6r5å8k 4tasa ta3se 6t9asf t3a4sia tasi3e ta4sif ta4sil ta4si5s4 tas4p tas5s4 6ta7sto ta7str 4tasu ta1ta ta7tes tate8se. tat5e4v tati1 tat3op tat2s1 tat3te t3attr 1tau 9tau. 7taue 4t5aug 2t1a4uk 4taun tau4ne. tau4sk 2taut 2tav 6tavin 3tavl 4tavli ta9xy 6t1b2 tba3d tba2n t6be. tbe6te. tbe6t7r tbe6t8ra tbo6da tbu8da tby3k tby4s tby7te 2tc t1ce tcen4 tch5e t5co 2t3d tdy5pe 1te 4tead 4te3ag 2teak 2te9a8l tea6m 2tea2n 2teap 2tear te5arb tea4s 3teatr 4teatt 2teau 2teav 4teb t5ebb tebu8da 4tecel te1co 2ted 6t5eddi 3tede. 4tedeb te7def 4tedek 4tedel 4tedem te5den 4tedi 5tedil 4tedo tedo6en. tedo4er tedo8et. te4dor ted4sk ted4sl 6tedu 4tedy tedyr9k 4tedø te3e4 2tef 8tefa 4tefi 4tefl 4tefo tefo8r t3efte 3tefø 2tega 5tegat 4t3egd te7gea te9gee 4tegg teg8ga. 2tegh te4gim 2tegj 2tegl te3gla te9g8li 8tegs. 6tegspl 6tegsv 2tegu tegvi8 2tegå 5tegås 4teh 5tei. 2tei4d t3eie t3eiga tei6ga. t7ei6ge. 6teigr 3teikn tei5le te1im 6teinf te4inne te5inte te5i4s 6teiso 2tej te7ken te5ker 4tekil 2tekj 5tek1k 2tekl te5k4la tek6lede. tek4li 4teknu 2teko 2tekr te7kra te6k5ru 9teks. 4t3eksa t3ekse 4teksp t4ek8st tek8t9r tekt4s tek6ty 2teku te2k3v 4teky 2tekø 4tekå 2te3la tel6ak 5te4l5ar 3telav 8te4le. 4teled 4telei 4telek 4teleme te4lene 6teler te4les te5lesk 4te4lev te6leva 4telid 4telik 4telil 4telin te4lir 4telis 4telit 4teliv tel5lef tel4lei tel4lev tel8lign tel4lo 2telo tel3se telses5 t3elsk tel7s6v 5teltet 2te1lu 7telut 2tely 6telæ 2telø telø8pa. 2telå 2tem 3temae 6teman te4mans t5emba 6temenn 5temik tem9ma 6temn tem5ne. tem5ord tem5pe tempe8l7 3tempo tem3s 4temø 3ten. te5nab te4n5al ten8am te4nan te4nat ten5at. 6t7enc 6t5en6den 4tendr 4tened te5neg 6tenem 6tenerg 5tenes 4tenet 2teng 7tengon t5e4nig 7tenik 5tenis 4teniv ten9no te4nom te5nor 6tenorm 4tenot te6nov 6tenó ten3sa ten5sko ten6slu ten3so tens5v ten4t5in tentle8ge. 4tenum 4teny 4tenæ 2tenø ten5øks 2teom 5teon 4teop te6ora 4teord 2teov 2tep te3pa 4tepak tepa9ra 4tepas 4te5pe 7tepee 9tepé tep6pere t5e6ple 4tepr 4terac te7rakk 6teramm ter7apa 4terapp te4rare 6terasa 4terase 7terast terba6ne. t6er5d 4tered 4teref 4tereg 4tereis te4rel 8terem. 6teremm te4r5eng teren6ga 6terenn 4terep te4rerk ter5esti 4terett 6terevo 3ter5g 3terh te4rig 4terik 4terisi te4riv ter5j 4terk. 4terke 4terkh 7terkr 6terks4 4terkt terla6ga terle7ge terle6ve. ter8ma. ter3no tern5s te5ro. tero6e te3rof 4teroll 4terom 5teromr 4te3ros 4te3rot tero6v ter5r 5ters. 5tersjøo ters4kl ter7s6ko ters4l ters4h ter3s4m ters6ne ter5sv tersø6ke. 3ter3t ter9to ter9ul 8terum ter7v tervi6se 2tery ter5ør 4terøt te4r3øv 4teråd te4r3ås t4es 5tes. 2tesa 5tesar te7sen 2te1sh 4tesid 4tesik 6te3sin 4tesit 4tesj 6tesjef 4te1sk t9es6ka. 6teski te5sko 2te1s2m 7tesmåe 2te1sn 2te3so 6tesp 5tesr 3tess 5test. 4testaf tes5tas 4testat 5tes7te. 4te5stei te5s6tiv 5testid tes4tik 4te5s4til 4te3sto 4te3str 4testy 4testø 2tesu 4te1sv tes8væ 2tesy 2te3sø te7så te8sår teså9re 3tet. teta6ka teta6le. te4tap te3te 5tete. tete4e 4teteg 4tetei 4tetek 4tetem 2teti 3tetik 3tetis 2tetj 2teto 2t8et2r 3tet2s tet5ti tett3s 2tetu 5tetu. 2tetv 2tety te2t3å 2teu teu8k t1eur 3teus 2tev t6eva te4valu 3tevl tevo6r te3vr 2tey6 2teø 2teå 4téa 2téb 2téf 2téh 2téi 4téle 2tém 2tése 4tést 6t1f tfe6e tfe4l tflå3 t7fo 2t3g2 t4ga. tge4a tgei5 t4gi. tgi5ros tgrei9e t4gå. 2t1h t4hap t4hea3 thei5m tho7li tho3re 3thr thu5le thu6s thy5r 1ti 2tiad ti3ag 2ti1ak 4ti3all ti5als 2tia2m 2ti1ap ti3asp 4tiau 2tiav 2tib 2tick 3tid ti2da 4tidan tid7d 6t3idee 4ti5dem 4t7idé 4tidis 4tido 4tidr 2tidu tidvi4 6tidy 4tidø ti1e2 2tief 2tiei 2tiem 4tienh tie5ra 4tierf 4tierk ti4ert ties3 ti3esk ti3et 4tieta 4tiett 2tifa tifa8ne. 2tife 4tifl 2tifo 2ti5f6r t8ifrå 4tift tif5te 2tifu 4tifø ti9ge. 4tigj 2tign 3tigno ti6gun 2tih 2tii 2tij ti3ka. 6tikarr ti5ke 4tiket 4ti5ki 6tikj tik4kj 2ti3ko 2ti1k2r ti3ku 6tikular 6tikult 6tiky 4tikø t4il tila6ga til1d4 3tilde 2tile ti3lei 3tilfe 3tilg til3id 4tilke 3tilkn 4tille. 4tillh 4tillin tillø7 4tilm 7tilnæ 3tilst til3t4 4tilte 2tilu 2tilø ti7mab 5timat ti4me. 5timedie ti4mera 5timeri 2timl 4timo7 4tim6o8r 2t1imp tim7s 2timu 2timy 2timø ti6nab tin5art 4tinaz 2tind t3indu ti4nem 4t1inf tin5ge4s 6ti4nit 6t5inj 2tink 7tinks 4t1inn 6t5inne ti5no tinsk5 4tinsp 4t3inst 4t1int 2tinv 4tinva 4tiny 9tiol 6ti7om tion9s6 4tiop ti1or ti1ov ti3pa ti6pla 4tipr 3tips 2tir tira4t ti4ref ti1ro 6tisak 4tisam ti5s6an ti3se 4tis4ei 4tisek 4tisel 4tisem 4tisep tise8ra. 4tisers 6tisig 4tisio 4tisje 4tisju tis4ka 4tiskan 4tiskil tis5kok 6tisku tis5l 4tisn 4tiso 6tisprå 4tistat tis4ti. tis4til ti5stre 4tisty 4tistø ti8støy 2tisy 2tit ti7ta ti3te ti1tj 3titl tit4r tit3s 3titt 4tiub 2tiut ti4v5and tiva9re ti4v5art tiv6is 2tivo tiv5si tiv5sk 4tiy ti5ær. ti7ære ti9ært. ti1ø8 2tiå 6t3jag 2t1jak t5jarn 2t1je. 2t1jeg 2tjel 1tjen tjen6st 6tjep 2tjer t5jev 2t1ji 5t6jingan 5t6jingar 2tjo t5jord 2tjub tju4e 2tjun 6tjur 3t8juv tjæ4res 2tjø 4tjå 4t3k2 t6kag tka8ra. tkly9 tku6le. tkå8pa 6t3l6 tla4ga tla8te. tle6da. t4ledr t6lef tlei5er. tle8se. tle5ti tligh6 tlight5 tli6nes tli4te. tlu4e t6l7ut tlø4pa. tl7øy. tlå3ne tlå7r 2t1m tma3d tma8ge. t6maku t2mam t2meg4 tme3in t2mek tmini6 tmin5s6 t2mos tmå4la. 8t1n t3na t6nee t4neli t7nelig tne4rek tne4r5ø tne8se. t4nesk t4nest t5ni t8no. tn5sk tnæ6re 7toan 7toar. toa6t 6toau 2toav tobe6r t3o2bl 6tobs 4toc to5da to9de. to4dera 3todo 1toe 2toek 6toel toe4t 2tof 6toff. t3ofre to5fri to2g3at to7gen 4togg to6gl 6tograv to4gre tog3st to2gu 2toh toil3 2to1in 4toj t6ok 1to3ke to3ki 2tokj 2tokk tokk5end to3kl 5toksi 5tokt 2toku to4l5arm 5tolat to5lel tolele7 5tolera toli8ne. 2tolj 1to4l3k 7tolki tol4lab tol4lag tol6leg tol6lett 3tolo tol5tr 4tolå to9ma. 2tomb to5mene. 2tomf 4tomg to3mi to5mise to7mist 4tomk tomlø8pa t8omm 2tomr 4tom1s 5toms. 1ton to5na to4ned to4nel tong5s4 to8nib 2tono ton3sa ton5s4l ton5sp 2tonu to4ny. 2to3o 4to1pl 4toppd 6toppg 6t5opple 4t5opplæ top4po 4toppt 4topr to1ra to4rak tor5alt tor5ang to4r5ant to4r3as 4tord tor8da. to1re 6toreg to4rek tor7eks to7rem 6torent 5torer tore4t tor5ete 4torga tor5int tor7me torm5s tor5na tors4i tor5t8 torvei5 to4rø 4torå to1s 4tosa 4to3se to2sh 6tosj tos5ke to8sku 4tos2p 2tosy 4tota to5te to8ti. to5to. to4tor 6toty 2tov to1va to7veg to5verd tove7re t5overs 5tow 4toø 6t3p2 t7pa tpi7ne tpi7pi tpo4et t4påk tr4 8tr. 6t9rabat 3trafi tra8ka. trak7to t5rane 3t6rans tran7ske 5trap tra3pe tra5po tra5r4 5trase tra5se. tra5ses 5trasé t2rat t5rate. 3trav tre4al. tre1c 4t3reds t3refu 6t1reg t5regi 4trei tre5int 6trek. 4treke 4trekl 4t3rekor 4trela 3t6re7na tre5ne t6reng 3t6reni 4t3renn tren6sk t7repe t5repres t2rer t4rero t4re3ru 2tres 6tresi tre5sko tres4l 3tresn t5resu t1ret t4reta t6reto t5retted 5t6rettel 4trev tre9va t6rib 4t1ric 4t4rid tri7ei t5rig. t4rikk t8rina t4ri5ne 4t5ring 3trinn 7t6rio t4rist tri5to t4riu t2riv tri7vi 5trix 3t4ro. 5troa tro9ar 3troe t4rof tro5g 3t2roi tro3in t4rok t2rol 4t3rom. t6rond 5t4rong tro5per t2ros 5t6rosk tros3l tro1v t8ru. t8rua 7trua. 5trued 5truet 3trug tru1i 5trukn t3rull 2t1run9 t3rund 4trupe tru5sa. 7t6rusk 2trut t5ruta t3rute t3ruti tru5v try3dr 3t2ryg tryg5ge 7trykk. 5trykke try7pe. t6ræ trø8a t5rød. t5rødt 4trøk 4trøm 2trør 5trøt 5trøya 5trøye5 trøy9et 4trøyr 6trøys 5trøyt trå8da. 4trådet trå4dr t6råkl t3råst 4ts 6ts. t5sa. t5sab tsa2g tsak6se. ts1an ts4ang tsau6r t1sc t6scha t6sch5k t5se. tse6d tse4er ts5ege tsei4d ts3eig ts2em t3sen. ts4ende t5sendi tsen8ka tsen6ke. t5sens t4sentu t5ser. t3seri t4s3erk tser3o t5s6ers. ts4es t4sesk ts5e6st ts3eta tse4te. ts1e4v ts3f ts4fæ t7s8hop ts7ill ts3inn t4s3ins t5sir ts5jeg tsje5t6sj ts5jor 5t6sjov. t7sjuk t4sjur t5skad t4skan ts6kis t4s5kjed ts6kjø t5skol t6skoll t7skot ts5kren tsk5ru ts5krø ts1k6v ts9kvi ts6ky. t6s7kyn ts1l t7s6lo. t3s4lot ts2lu ts5lø t5smit tsmå6la. ts1o t4s5o4d t5sok t5somst t5spek t3spel ts2pi t2s3pike t3s4por ts5s4 t1st4 t2s3tabb t5stad ts3tak t4s3tal t5stand t5stang t5star t5stat ts6tau t3sted t4steg t4stek ts6tig ts4tik t4stilk t4stin t4stit t2s1tj ts5ton ts5tors ts5tree t4s5tren t4s5tro ts3try ts6trål t5stu ts3tv t4sua tsu7ge tsu4l ts3uli ts3u4r ts5usi ts1v t3svik ts1w t5syk ts5yt tsø8ka ts5økni ts5øv tsøy8er ts1å tsåt8 6tt t1ta t3ta. t2tab ttaba6ne. tt9abo tt5adr t2taf tta9fr tt3aft tta4la. t6t3ald tta7lel ttall4 t4t3ana t5t6ane t4t3ang t4tans t4tanv tt5appe t7t8ar. ttare6 t4tarr tt5ar5t tt6arta t4tase t4tasj t4tav tt3avi tt5avk tt5avr t3te. t2tea t3ted t4teda t5tede. t8tedr t2tee t4tef tt3eff t2teg t2tei tt7eid tte3in t2tek tte7kv tt7elev tteli6te. t4tem tte4ma. tt5emn ttem8na ttem6ne. t3ten t5ten. t4tena t5tene. t4teni tten5s t9tens. t4t5ense t2teo t5ter. t4terei tter5un tte4r5ø t4terå t4tese t4tesi ttes6ke. t4tesl t5tet. t4teta t4tete t1té t4th tt5he tti5a t4tidel tti3e t2tif t5tig tti4g5j tt3ind t5tine t7tiné t5ting t4tini t4t3ins t4tisj t6tisti t7tite ttle6de. ttlin5 t1to. t5tofr tt5om. t7tomr t2ton tton6na tt3opp t5tora tt3ord tto5re tt5o4ri tt3orm tto5u ttpar4 tt6pås tt9raka tt5rake tt3ram tt3rap tt7rat t4t3rep tt3res tt3rev tt5rom t5trop t5try t2t1rø t6ts tt7saf tts3ar tts5kan tts5kj ttsla6ga tt3sok tt5still tts5top tts5tra tts5tøy tt3ugl t1tum tt1un ttun6ge. tt1ut tt8ute ttva8la tt5ve tt6vun t5tw t5ty. tty8e tt1y6t ttæ6 tt3ø4l t1tør tt3øv tt7øy6r tt1å4 5tual 4tu4av tuba3 tu4be. tu6bå tu6dem 5tuel tu4er. tug8la tu1in tu2k t5uka t1uke 7tukt 3tula 1tule tul5les tum5m tum4s 3tun. 4tund 3tune tun5gesv 6tungd tung9s 6t5uni tu4nio 5t4un5n 9tuns 3t2ur tur7ant tu4ras 4tu4rei tu4rek turi4 tu4rin tur1o tur3p tur5s4 tur3uk tu5rus tur1ø 1tus. tu1sa 3tusb 3tusf tu4sin tu4sm tus5o tus7s6t tust6r tus5u 2tutg t5utj t5utk t1utr tut6tenk tut5tor tutt5ov tu8va. 2t1v tv4a tva8k tva6ne. 3tvang t4v5anl 8t9var tve5del 3tveit 4t7ver tvert5 t2vet 3tvet. 7tvets t5vik tvi8ka. t8viklas 5t4vil. tvi5la 5t4vile t4vi5l4i t6ving tvi4sa. tvi4se. 6t7vo 3tvung 6twa2 1tyd tyg9gel tyg5ges 6tyh tykk5s6 ty4med 1tyn ty4ne. 6t5yo 1typ 5t6ype ty4pere ty4pet ty4rak 5tyrann 6tyreg ty4rep tyre5st ty4ri. tyri9e ty4ri5s ty2s 3tysk tys3t 2ty2t ty8ta t3ytel ty5ten ty4ve. 2tz t5za 5t6zel 6t6z5l 1tæ tæ5l tær6ene tæ4renh tær4er tær4et tær5s4 tøf3l 2t1øk tø9ket tøk8ta 4tøl t7ø4let 5t4øm5 tøn5nes 4tøp tøp5se t2ør tø4r3as tør3in tørk4 7tørk. 9tørka 5tørke tør5ne tørs7ta. tørs7ter tørs5tin tør3t tøs4 tø8sa 4tøt tøt5a tø5ta. tø3te tøtt6 2tøv tøv6d tø7vele t4øy tøy5a t9øyem tøy5r tøy5te tå4en. tå2k tå5ket. tå5ki tåk6r tå2l3a tå9la. tå4leg tå7lel tål5s4 tån8da tån6de. tå3ne 4tåp tå6pe. t1åpn tå6re. tå4rep t3året 4t5åri 3t8årn 2t1års1 tå3s tå2t t3åtak tå7ten ua7g u1ak uak3s u1al. ua7la ual5l ual3o ual3u u3a4ne. u5anl u3ans u1ar. uar5d u4arr u5ars. uash3 ua3t u5au8 u1av 1uavh u4ba. ub7alt ub7ant ub5ark ub4bo ub2br ub4bu ubel5s ub5h ubi6s ubis7t ub1j ub7lande. uble3s4 u1b4r ub5rin 2ubs ubu8e u4bå uch5en uch5er u1ci uck1 ucu5 2ud u3da. u7das. ud4dag ud2dr udd4s5e ud2då udea9 ude8are u2deb udeie5 udei5er u2dek ude3lu u2dep u6dero u2des u3d2et u6d5ett u5devo udia2 udi3an udi4en udio5 ud7ir ud7ji ud5leg udle6ge. u7dob u6doe u2dot udover7 ud1r udse4 ud3t ud5v 3u4dy udy9ra ud5å4s ue5a8 u5ei u1el uem8na u1e2n uend5r u7ene uensar4 ue7o u1er u5e6rast ue4re. ue5ren ue4rer ue4res ue5ri uerle7 u2erm ue4se ue2si ue4skj ues6n u1et uet8r ueul8 u4fe. u6feb ufe6e uf1f4 uf4f5erm ufi9l ufi5ne u1fl u6foa ufor3s u1fr uft3a uf4tan uft5s4la uft3sp ufø6 u5gag u5gar u6g5av ugby7 u2gem u5gen u3ger u4gerø u2ge5s4 u9get. u8geta u2gev ugg3s4 u5gis u4gl ug1la u5g4lad ug9lar. ug4le. ug9ler. ugle7s ug5ly ug7na ug7ne. ugo1 u4go. ug4re ugrei9er u4grø ug5s4i ugs4k ug7so ug3s4pr ug5s4va7 uguay7ans ug5øyn u1h 3uhel ui8a u4i6c ui2d uid5el uid5en. uid5ens uid5er uid5in ui3e6 u4il uil5l u1im ui3ne u1ing uinnsmi8 uinnsmig9 u1ism uista7 uit3en uit5er u1itt u1j u4jas u8je. u7jå 4uk. u1k2a u7kar ukare6 ukar5t4 u5kat u2ke. u4ked uke5l4 4ukem uker5an uke4rek uker5i ukho7 u7ki u1kj 4ukk ukk6a uk7kestal uk8k9l ukk7n ukks6 u5klem uk8lu ukl7ut u5k4no u1ko u4k5og u2kra uk3rus 2uks uk2sa uk4sek uk4sel ukse7te uk2si uk2s1k uk7ski uk2so uks5t uk4s3un uk2sø ukt5e4sk ukteslø9se uk4t3id uk6tj uk4t5ori uk2t7r ukts6l ukt3sp ukt9s6v ukt4sti uktu8e9ra uktue5re u1ku uku6e uku5le uk5vik ukys8 uk3ø4 uk5å4 6ul. u1la u4la. ula7d u6l1af ul3aks ul5art ul4det u4lef u2lek u2lel ulele8ge. ule5ma u3len. u6leni u3lens u5ler. u5lere. ule3ri u2l3erl u4lero u2les ule3st u5lest. u5leste. u2leu u1lé ul4f5l ul4fo ul4fr u3l4i ulie8 uli9en uli5ke. 3ulikh uli9na. uli5ne u7linj ul1j ul5ka ul4k3v ul4lag ul4lam ull7arm ul4leg ull5egg ulleg8ga ul6leng ul9lere ul4le3s4 ul8li. ul8lig ulling7s ull5i4v ul4l3o6s ul8lot ullo3v ull5sle ull3s6m ulls4t ull3sv ul2lu4 ul6ly ul2lø ulm4u u1lo ulo6i ul5op ulo7va ul4sk uls4po ul8sn ulss8 ul2st ul8s3t6r 4ult ul4teg ul4tek ul4tes ul4til ul4tim ul4to ul7tor ul4t3re ult3ri u7lua u3lue 1uluk u5lup u5lus ul9ut. u7luta u9lute ul7va. ul5van ul4var ul4ve. ul4veg ul4vei ul4ves ulv3t ul4v3u 1uly ulyk5kes ulæ6ra ulæ5re ulø3se uløy6e ul5å6l 2uma uma8ge. u6mare um5au umau7ken um3av 2umb um5be 4umc 4umd 2ume u4mend u4m3enh umen4t5i ume5ra 2umfo 2umh 2umi u6midd umie6n umi9na u4mint um9ja 2umk 4uml 4umm um3me um4mil um4mis um3n umna8 4umo umo6g um5ok 2ump um7pan um4ple um4p7ut 4umr ums1 um7se. um4sku umsku8le. um2sn um4sor ums3t 6um7t umta8l um5ut 4umve umør3s um7øy umå7 2un. una6da un5alg u4n3ap u9nar u7nas u3nat 2und. 6unda 6unde. un4dek un4del 6unden 5undersk 5underv 4undet un6d7im 4unds und5s4i u2ned u4nee u9nei. u2nel unele6ge. u4n5eng u4neno u2ne1s2 u3nes. u2nev unev5n 1ungd ungele8ge. un4gem un2g1j un4g5l un4go un2g1r un9g8ru ung3s4i un6i u4ni. u2nid 1u2nif u4nim u3nin 3union uni4st 4unk un4k5l un7ko un4kr un7nak unn5erf un4n5ers un4n5erv un5nes un4niv un2no unn5ste unnta8la un4n3y u4no. u2n3os uno7t 4uns un6sj5i un3skr un5s4p un3stek unst5e6l un7s6tenk unst3o un1s2v un4tal un4tam un4tas un3t2r unt5rep un4tri untun8ge. unu6 un5ut u3ny u3nø un5øy6d u7nøyg u3nå uo9a u1ob u1om uom7s u1op uor8da uo1re uo5ro u1ov up3av u3pea4 u5per uper3a upe6ren u4peta 6upf u3pi u8pi. up3ins up3li up6nev upo9pe up1p2 up4ped up4pla up6pre upp5s 4upr u3pra 6ups up6sen up2s3k ups4ke ups5pr 6upt 6upu u1på upåvi6 u1ra u2rad u2raf ur3aft u2r1ak ura6ly u4ram u5rane u3rans uran6t5re u5rar. u6r7arl ur3arv u9ras. ur5asp ur3att ur7au urau9ken ur1av ur4bod ur4c urd4 ur3di ur4d5o u1re ure8al ureer6e ur5egg uregi6 uregist5 3urein ure4l ur3ele u4reli u7r8ell u7r8elt u4r3els u4r5eng u7reom ure7o6s u4resu u4reta u4rete ur4e5v 2urf ur4feb ur6fed ur3ge u1ri u4ri. uri6a7ne uri9en. uri4e5ne uri9er. u3rik u3rim uri5ne ur3inn ur3ins ur3int uri6sp ur4ke5s ur7k6j ur6k7ja ur8kla ur4kle ur6k5n urk5s urla8ga urle6ge. urle8se. urma7g ur3nea urn1s2 urnæ6re u4ro. u6roc 5uroe urom5s u2rop uro7pi ur3opp ur1or uro3s4 uro4sta uro8ta ur4pel ur6p9ut ur3re ursa8ka ur4sal ur4s3el ur4sin ur4skr ur4spe ur5ste urs5til ur4stj ur2sv urs3va ur2s1ø ur3teo ur5ti ur4to ur6t5ri urts4t urue7re u6rug8 ur7ugl uruk6 uru4ke uru7kn ur6ul urumo7 urun4g u7runk uru7v ur4vel urv3s u6rys urø2 ur1ød ur1øy 4usa u9sane us3ang u9sar. u7saren u6s7ark us7au us1c 2use u5seal use4al. us7edvanle u2s1ei u2sek u4sele u2sem u6s5endi us7erk u4s5erm u6sesi uset8je us3eva 4usg u2sh u2s3h4a u2s3h4o us4id us3ind us5inn us7jag u4sji us5kaf u4s3kan uska8ra us7kat us5ken u6s5kis usk4l us6k5le us5klo us1ko u1skr us7kru usk7u6t us4ky us1l usle6ge. us5lin u4slu us7mø u4sn us1ok uso5l uso6l5d us1or u3sori usove7r6e us1p u1s2pin us5sar us6sat us4sjå us4skj uss5kor us4skur uss1l us7smi uss7mø us4s5ti us4str us2sv u6stande u4stat us3tav u2ste us3ted u5stei us7ten ust9ette us5ti u5s6tig us1tj ust5of uston8 ust7onn us5tor ust5o6v us8tra. us8tran us8trar u6stre ust5ren us4tri us3tro ust5rød u6st5rå ust7ut u4stå us3ung u2sur us1v u5svale u7s6valt usva8n usvi8ka. 6usæ usæ9le usø6m us1øy u1tae u2tag u7tagg u9tal. ut3alb ut5ald u3tall u5tande uta7no ut6anv ut3arm ut3art uta1s4 u5tas. u6t5a6sa u6t5a6se u2ta1u4 1utb ut4ba. utbe8d 4utbi ut6by. utch5 1utd 4utdat utda7ta. u2te. u2tea u4tee u4tei u2tek ut3eks u5tekst ute6ma. u5temm u9temt ut2en u6tena u3tenk u4tenu u2teo 2uter u6terø u2te1s6 u4teta u3tett ut6eu uteva9 1utf utfa7s utfø5re 1utg 8utgåe 6u3ti u4t5if utikk6u utiku9 u4tili u6tiven ut1j u5tjen ut6ju 3utlei utlø5se utlå7na utmå5le u8tni 1utny 2uto ut7oms uto5s uto4v 3utpr ut4på ut1r u5t4radi ut3re u5treng u3triv u3trol u3tros 5utru u5t6rul ut4rø ut9rød 1ut1s4 4uts. 4utsei utse8t9ja 2utsj ut3sk 5utst 7uttak. 5uttake ut4terk utt5eva ut4tid ut4til ut5torea ut1tr ut4tra 3uttry utt1s2 u1tu utu5e u6t5un utun8ge. u2t5ut 1utv u3t4vil utvi5se 2u3ty 3u4t6yd u8ty. 8utz ut1ø u5tør ut4ø8s utøs7t 1utø4v ut5øya ut7åk u3tål ut1ån ut7år u1u u7uma u5ume u7ut u1v uve5di uve3in uve6ris uve3s u7ves. uvet5ø u6vev u5vi uvi6k uv5ra uv9sa u5vu uvø9re u1w 4ux1 ux4a4 uy6a u7yn u1æ uærle9ge u1ø6 uøv5 u9åra u7åre va3am va8an 4vab 6vadj vad1r vaf3 vaf6r vai5r vai5s va6ka. va7kan va5ker 6vakh va8ki. 4vako vak3r 7v6aksi 4v3aksj vak5s6t 1vakt vakt5r va1ku vak3v va3lan va4led val9eks 4valel val4g3r vali9e8 val3la val6mes va6l1o va1lu va4lun 4valv va4løy val7å vam8pu 4v3anal vand5s v4ane vane5s va4net 2vang van4gr vang4s7 va8ni. 1v4ann van4nan van4niv vann6sti va4nom v4ans van5sem 5vansk van5s6ki van3sm van3ti van9tr va4ny 2vap va5po va4ra. va6rak va4ral va4ram va4rap va4re. va4reg va6rem va4res var8ka var5ma var4mee var4sa var4sk var4s5ti var4sv varta9la var6tem var4t5i4s 4vasa va4sa. va9set 6vasid va6sie va4sif va4sik va4sil va6sis va2sk vass5a vas4sau vas4sel vas6s7ø 4vasta vat5a va3ta. va6t7e8l va2terf vatle6ge. 5vatn va1to va6tr vat7ra vat1s 4vau 2v1av va4z 2v1b2 vba4ne. vber5g vbo6da 6v1d v7dev vding5s4 v7doi v7don vd6r vdu6en. vdu6er v7dø 1ve. 2ve1a2 ve6ag ve6ar. 2veb 2vec ve2d1 ve9dob vedom5 veds2 ved5s4k 3ve8d5t vedø4 vedå6 2vee ve4er 2vef ve6g5av ve5ge 3vegg veggs4 2vegj 4vegl ve3gle ve5g6lød veg5n 2vego 6vegre veg5rett 4vegru ve4gut ve4g5å 2veh 1vei1e vei3en 4veill 6veit 2vej 4veka 5ve4ka. ve4ke. ve4ked 4vekee 2veki 4vekj 2vekl vek8la vek8le ve4kli 2veko 2vekr 3veks vek4st veks4t5r 1vekt vek4t5an vek5to vek4t5r 2vekå 5vel. ve4l5as 5velat. 5velatp 6veld. vel4del 8velds 4veled 6velei 7velet 4velis 4velit 6veliv 2velo 5veloc vels2 vel3se velses5 vel3sm vel5sp vel5st 4velug vel5un vel5v 2vely 2velæ 2velø velø8pa 2vem ve5ma 1ven ve8na. 4venem ve5net ve6nete 4venev ve4nin ven6n5i vennle7 ve2no ven6sti ven6str vent6a ven5t6r vent4s 4venty 2venu ve4nus ve5ny. 4venya ve4nym 2ve3o4 2vep 1v8er. ver5ak ver3al 8verau ver6des ver6din ver6dir verd7v ve3re. 4vered 4vereg 5vereig 4verek ve4rel ve6r7eng 4verenn 4verep ve5rer ve5res. 4verett 4veretu verfø5re ve9ri. veri3a ve4rial ve7rie 4verik ver3il 5verkn ver5m6 ver6nal vern6s5 ve9ro. ve3rom ver8ska. ver5ski ver7spo verta8la. verta6le. ve1ru 5verum. 6very verø6 ver3øs4 4verå v4es 3ves. 2ves4a ve5san 4veset 4vesh 4vesi 4vesj 4veski 2vesl ve9sli ve1s2m 6ve3so 4vesp ve6s3per ve5sted ves6t5end vest5o4v 4vestr 4vestu 4vestø vesva7 5vesynds 2vesø ve1så veså5re v4et 1vet. 2veta 8vetaka 4veteg 4vetek ve5te6s7 6vetev 2ve7ti 4vetj 2veto ve4to. veto7e 9vetoke 9vetoks. ve4tor 2vetr 1vets vett5sk 6vetv 4vety vety8e 2veu ve8um 2veva ve6vak ve5van ve9var 2vevi vevi8sa vev4sm vev4sp 2veø 2veå 1vê 2v1f vfall4 vfø7re. 2v1g2 v4ga. vga4le. vga6li vga8ve. v9ge v4gi. vgjer6s7 vgo4 v4gå. 2v1h vhø4re. 1via vi1an vi6bl vice5s 1vid vi5de vide4o7 vi4d5o4 vid3r vid3s4 vi1el vi5end vig4m vi4gu vi5gø vi4kat 5vikb vi5ked 7vikg vik5ke vik5n vi2k3o6 3viks. vik5sa vik5s6l 4vikt 5vikti vi4k5ø4 vi2l1a vi5la. vi4les4 vi4l3in 1vilj vil4l5an vil4led ville6de. vil4lei vill9ep 6v5illu vil5m vil1o vil4sti vilt7o vil6tret vil4tri vi2lø 4vim vim7p vim7u 4vindl 5vindu vine5st v6ing 4vingn vin5gom. ving3r vin8g9u vin3na vin4ned 6vinnh 4v5innl 4v5inns 4vinnt vi6n5o6ver v2in2s vin7sja vin4tes vin5tre vi8pa. vi6pe. vip5s 1vir 4viro 7viru vis3ab vis3ak vis5and vi4see vi3sen vi6seng vi2s1k visk6re vis5m vi1so vis3om vi4sp vis9pa viss4p vis5ti vi4tak vi5tese 5vi6t5j vi4t3o vi4tr vit7ra vit5re vit5skr vit6te6s7 vi4t5un vitun6ge. vi4t5øy4 vi4va. vi6ves vivi3 v1ja v1je vje4t5a vje5t6e vje4t5r vjet3t vje4tu v1ji 4v5jo vju3t 6v3k6 vk4le vk4ler vku4le. 6v1l2 v6lab vla6ga v9led v9leg vlei9e vl6el vle4se. v5lesn vle5str v6lesv vli7v vls9 vlu9sa 2v1m vma8le. vmo8de. vmord4 vmå8la 2v1n v3nad vna8ke. vn5al v9nar vn5dy vne7b v2ned vne7de v4nele v4neli v4nelo v2nem vne5r6e v4nero vne1s v4nesta v6neste v2nev vnor9s8kas vn4s5pa vn1s4t vn5t4 vnæ4re. vn5ør vo1al vo2ar 6vob 2vof vof8fan vo4gu voi1 1vok 4voko voks3k vok6s5 1vol voli7 vo4litu vol4tes 2vom vo4na vo9nal vo9nar von5de vons6 von5sh 2v1o6p 2vord vor8da. vo1re vo9ren 2v1org 4voro vors7k 1vos 4vosj vos4se vo4teg vo4tel 6votr vo1v vo4ve. vo6vi. 2v1p4 2vr8 3v6rak v7rar v1re vregi3 6vrenge 4vrengi v6rengj v6rengt vrett4s v6ri. 3vrid 7vrie v6rigas vri6ma. vri8me. v3ring vrin5s vri6ve. v1ro v4rob v4rof v4rok v4rop vro8te. v1ru v7ry vrø3ve v1rå vrå8da. 8vs v6sa. v7sali v6se. v4seg vs3egg v3s4el v4s5e4li vse4n v5sen. v4s5eng v5s4ens v2ser v6si. vs1in v1sk vs8ke v6s5kum vs1kv v1sl vs3lan vs6let v6slik vsmå8la v1s2n v6s7na vs3ne vs3ny vs3næ v4s3nø vs5od vsom5 vs5oms4 v7son vs1or vs2pe vsre6de. vs7s6t vs4s5å v1s2t2 vste6ma. vs3til vs1v vsø6ke. vsøl5 v2s5øy vsøy4er v8så. vså7re 2v1t vta1 v4ta. vta8ka. vta6led vta9len vta4lev vta6s v5tepp v5t4i vti8na vti8ne. v5t4r v3t2v vty8e 1vu vu2d1 vud5d vuden5t vuds4 8vué vu8k 2vul 2vung vun4ge. 6vu6o 2v1ut 2v1v vva8la vve8g9ing. vve6g7inga vven7n6i vvi5ke vvi6k7l vvi8s9an vvi4se. 2vy1 vya4 vy7ens 1væ væ1ra væ9ret væ8ta. v3ø4d vø4l vø7li vøm4met 3vøre vø6re. v3ørke vør8na. vø3se. v5øv 4v1øy vøy6e vøy7ene. vøy9enes 1våa 1våe 4våend v4åk vå8ka. vå4ke. vå4kene vå9kene. vå4le. 1vån vå5ne 4vånu vå3ren vå8sa. vå5tes 6våtf våt7å w2a wa6l 5wald wal4k walk5o4 wal4l 2wap war6d7er wash3 1wat wa3z w1b wboy5 we2 weate7 we7b we3g we5re wes2 wes3s wester6 western7 wet5 wett4 w4i2 wi9ar. wich3 3wicz wi3d 5wi6en wi9er. wi5f wi3ni wi5ra wi3ren wi5ta wk3r w1l w1m wn5s wob5 wou6 wout7 ws5 ws6k wurs6 wy2 w1yo wyor2 wyork3 w1z xan5t x7b x3f xga6 x7h x1ic 5x6id xi5e4 x5k x1l x1p6 x3r x1s2 x7t x6u xy2 ya7b 1yac ya5f ya4h y1ak yak6te. ya2l y7am y1an y6an. y2ana ya4ne. yan7k yan7sl y1ark y7arr yas4 ya5si ya5t y1av y1b yba4ne. yb4bed ybde3 ybo2 ybu6er ybue7re ybu7ern ybyg5 y1c y8ce. y8cé y2co3 y6dab yd5av 4ydd yd6dela yd4dep y6d7enh y4deo y2dep y4dero y2d1is yd6je yd1ji ydo4 yd3op yd5ov y1dr y4d4r5au yd1re yd5rem y4dro y4d4r5oks yd3si yds4v y2du yd1un ydø4 y4døm ydør5 yd1øs 4y1e yed8l ye6dre y2ek y5eks ye4len ye6let yel4s5j yel4sk yels3m yel6s5t y2em ye2n y7e6ne y8ener y2enh ye5ni y2enk y2enl yenle6ge. yens4 y4ense y3e6re ye4rel y3ern yer8sk y4erst yes2 ye5sm ye2t ye9te ye5ty y2ev y1f yfan9 yfjell4 y4fle yf5le. y8ga. yga8ve. yg4dal yg4dek yg4del yg4dep yg2do yg2d1r yg2d1y yg2dø yge5i ygen5s y6geret y2ges y4gev yg6gam ygg7art ygges4 yg5gj ygg5l yg6gr ygg3s2 yg6gu yg6g5å ygi2 y5glo yg7m yg6r y1h yhes5 y1i y9in. yis7t y1j 6yk y1ka ykap3 y6kara y2ke y7kel. y5kelen y3keli y7kels y3ken y3ker y4kerel y4kero y5ket. y9kets y1ki y1kj y4kjar y5kjare ykjeva8ne. yk4kana yk4k5enh yk5kesj ykke6s5ta yk1kj ykk5ni ykk4s5k yk8k5vi6 yk4ky yk1la yk6lest y1klo y3klub yk3lus y5klæ y1ko y2koa y6koli y4komo y5kosa y2kot y5koti y1kr yk1s yku6le. yk3var y1la yla8ga yl4dan yl4derk ylde4s yld1r yld5s6k yle6ge. y7les y4lev yligh9 yl5k8 ylke2 ylke4s3 ylkesla8ga yl4lev yll5is. yl3s6 ylst7re yl5tet y8luse 3ylven y1ly ylæ7re y6mei y4mete ym4fe5d6 ym5jara y4mo. ymo5e ym3p2 ym1s ym8sa. ym4se ym8sl ym6ta. ym6te. ymå6la y9n8and yndes8 yn5det y2nel yn7eld yner3g yne5s4 ynesi8 y6nev yn5gel yn4gem yn2gr yn4g5ø ynko3 yn6k5v yn5na yn5ne ynn3s4 ynn4ø y3no y4no. yns1 yns6are yn4sem yn9set yn2si yn2sk yns9ket. yns7ki yn5skj yns7kjele yn8s9kjer. yn4st yn2su yn4s5ver yn4tap yn8teg ynt5ei yn4tek yn6tete yo4gat yo6gi. y1om yon4 yon5nen yo6nu y1o2p y1o2r yor6da yo5re you4 yout5 yp8e y2pe. y4pee y4pena y4penet ype4rel y6peta y1pi y4pi. y7ping yp5inn ypin8na y1p2l y5po yp7p6a yp3pe y1pr yp5s8 yp4tok y3pu y1ra yra8ka y4r3a6l y7rarb y4r5au yr5av yr7da yr5dø y7real yre3in y5reis yrek4 y7rek7k y3rels y5rems y1ren yre9ne y4reo y6rerel y4rero yre5sc y5rest. yre5ste y5reste. yres6ten y1ret y4reta y4rete y4reto y7retø yr7ga y1ri yrin5g6 yri6ene. y4rif yri8ka. yr3inn yris6p yr4kee yrke4s yr5kj yr3m y7roe y3romm yr1op y5rosk yr5r8 yr4san yr7set yr5sk yr6skj yr6skr yr2sp yrs7tan yrs5tar yrs7tene yrs5tens yr3sti yr4sv yr3te yr6tek yr2t3r yr3tra yrty8 y1ru yrul8la. yr5ut5r yr3v y1ry yr3øk yrøy4 y1rå1 yråd2 yrå8da yråde7r yrå6ders y4rådi y2råm y6råst y4råt y4råv 2ys y1sa ys6a7kers ys4e yse4bu y4sed y4see yse5ei y2seg y2sek ys7ekte y2sem y4sera yse7rid yseri7e6 y4sesj y4sesk y4se5s6l y4sest y5seste y6sesu y9set. y4seu ys6i ysi8e y5sjk y7skag ys6kara ys7kare ysk9au ys2k3l ysk5øs ys4mi ys4nø y1so y4s5or ys2pe ys5pis y5s4po ys6sak ys6sam ys4s3ei ys4s3ek ys4s5il ys2sj ys4sku ys2so ys2sp yss5pe ys4sta yss5tab ys4s5ti ys4su ys2s5v ys2t ys3ta y8star. ys4tat ys3tel ys3ten y4s3ter ysterie7n ys7tesl y2s3ti yst3op yst3r ys5t6ry ys6ty y1su ys1ve ys5år y1ta y4t3ana y2tee y4tef y2teg yt5e4ge yte3in y4teka y4teki y4tena y4teno y2teo y4teret yte6ro yters6 yter5ske yte5r6ø y2tes2 y2tet y3t2hi 6y5til y6tj yt9ja yt5jen yt9jer yt4mei yt4mes y3to yt8ra yt4re. yt5rer yt1ri yt4rik y5trå yt4s3en yt3sk yt5sv 4ytt yt5t6a ytt4e ytte8r9end yttes6 yt4test yt8tien. yttsa6me. 2y3tu y1ty yt4ys y7tå8 y1u y6ua y8ue yu8g yu4l y1v y4vak yva8la y2ved yve4ria yve4ris y4vese y6vesy y6vev yvi8sa yvi6se. yv1år yvå5te y1w y5æ y5ø y1å2 za5b 3zae 4zaes za4g5 za5k6h zani4 zania5 5za5v z1b4 zbu4 z1c z1d 1ze zea1 zebu9 zeli5 zen3s 4z3ense 4z3ent z1f z1g 5zha z3hi z5hu 5zie 1zifi 5zing z5int 1zis 6zisty 4zi5s4v 2zisy z1k 4z1l z1m 5zo. 5zoe zo1f2 zo4no zo5re 6zos z1p z5r z1s 4z1t zu3e z1un z1v z1za. z2z3el æ5by æ2bø æ5de æ7di æ1f æg6 æ2k æ3ke æ5ki æ8kj æk1ja æk7je. æk9jer. ække7 ækkel6 æk6l æ1la æ4le. æ2le3d æ4lena æ4lev æl5j ælsle9 æ4r1ak æ3rane æ4rans æ4rarb æ6rarbe ær4arte æ4r1at ærbu5e ær1d4 æ1re æ2rea æ4red æ2ref æ2reg æ8r7ei ærei6e æ2rek æ6r7eld ære5ne. ære7nes æ2rep æ5rern æresa4m ære6skr ære4sl ære4sp æ4reta æ4retek æ9rets æ2rev 4ærf ærgen5 ærhø8 æ1ri æri6e7ne æ4r3il ær3ins æri6s ær5is. 4ærk2 ærle6ge. 4ærm ærmå8la ær3n ær5ne4 ær4nå æ2r7o6 ærom5 æroms4 ær5r ær6sel ær4s5il ær1sk ær7s6no ær2sp æ2r1u ærut5 ær3v æ2r1ø4 ærøy7e ær3å4 æ8se. æ2sj æ2s1k æ5ta 4æte æ4te. æt4r æt4ta æ5va ævar5 æve4s æ5vi 6ø1a2 øa7re øau4 ø1b øbe6lev øbe4li ø2bl øbl9u øb4r ød3ag ø4dak ød3d ød9de. ø2de. ø4dede ø6def ø4dela ø4dem ø4deo ø4deri ø4dero ø5dj ød1r ød4red ød4rek ød4rep ød2sc ød6s5ek øds7ke øds4ko ød6sku6 øds4mu ød8t5om ødt6r ø2du ød3und ø4d5ur ø6d5ø 4ø1e2 ø4ed ø5ene ø5ep ø3e6re øfe8 øf3fe øf6j øf8la. øf8le. øffe8l7a ø5fn øfte5s øg1 øg2a øg5ak øg5al ø7gar ø5gas ø3ger øg5gl øg8gå ø7g4j øglo8ve øgn6s7p ø2g2r øg5re. øg5res. øgs2 øg4ste øg4str øgta5 4øg4u ø1h ø4i øi4e ø5ing ø5isk ø4it ø1j 6øk. 6ø1ka ø5kav øka8ve. ø6keh ø4kelo ø6kerada ø6kerel ø4ke5ru øke1s ø6kese ø8kesl ø4kest ø4kete ø1ki 4økj ø5kjare ø5kjas ø1kje 2økk øk5kel øk5ket øk4k5l økk5r øk3lag øk3lan 2økna 1øko øk5opp ø1kr ø8krar øk8sa. øk6se. øk4ses øk4si øk2so øks1t6 øks5ti øku4r øk5ur. øk5ure øk7ve ø7ky ø1la ø2lah ø6lam øl3d øled ø4ledi ø6lelu ø4lero ø6leta ø4le5te ø2lev øl4gera ølge5s6v øl1j øl2ke ølke7s øl4lese øl9leti øl6lev ø1lo øl7op ølrå4 øl6sel øl4sere øl4se3s øls6t4 øl5s4v ø5luk øl7ut ølva6 øl4var øl4v3ei øl6vek øl8vel ølv7erk øl4v3in ølv5o ølv7r ø1ly ø4me. ø9met 1ømfi ø5mi ømini6 øm4med øm4mero ømmet6 øm4metr øm3op øm4pel øm7s6p øm1st øm5svi ø2m1u ømå8la øn2ad ø6n5al ø5nas ø2nem ø3nes. ø9nese ønhø8re. 4ønn øn4nal ønni4 øn4n5it ønns5al ønn4s3e ønn4s5i4d ønns5kje ønns5kre ønns5ku ønns3l ønns3t øn2nø ø6nom øn2s øn9sa. øn5sak øn5sam øn5se. øn3ser øn3skj øn8skjer. ønst3r ønst9ra ønt1 øn2ta øn2to øn7u8 ø1o ø4peda ø6pe5i ø4penu ø5pero ø4peru øpes4 ø4pete ø4peti ø1pi øp3li øp5p øp6pl ø1pr øp6s1 øpsa4 øpsla8ga øps8leg øp5ste øp4s5ø ø1ra ø2ra. ø2r1af ø2r1ak ø2r1a2m ø4rans ø4r3ant øra8sa øra6si ø4r7au ørd4e ø1re ø2rea ør7edd ø6redu ø2ref ø2reg ø6rein ø2rek ørek6l ør3eks ør5ekt ørele8se ø9relet ø4r5eng ø2re5o4 ø2rep ø6reret ø4reru øre1s2 ø5res. ø4rese ø6resi ø7reskrivi ø8reso ø4rest øre6s7v ør6et ø4reta ør1eu ø2rev ør5fe ørge5s ø1ri øri8m ør4jet ør4keri ør4kes ør8k9lag ør6k5n ør4kve ør4kå ørla8ga ørm9ut ørn4e ør4nere ør4nes4 ør4n3u ør4n5ø ør1o ø5r6ok ø1ros ø4r3ost øro4v ør4rek ør4rep ørri4 ør4r5is ør4råt ør4sak ørsa8ka ørsa6me. ør4sc ør6ses ør2si ør5ski ør4skr ørs6lev ør4som ør4spe ør2st ørs9tar ørste5i ørs5tens ørs5tig ør3sto ørs9u ør2sv ørs1å ør9tar ør4tek ør6ti9a ør4tide ør8tien. ør6tif ør3to ørum5 ø6rut ør5v ør1ø2s ørø1v ør1åp ø1sa øsa6me. ø8sarar ø1sc ø2se. ø2sem øse4n5o øseri7 øserie6 øs5jo øs7kar øs1l øs4lag ø4slu øs2me ø1s2p øs8tas øst9ast øs6teg øs5terse øst9ett østo2 øst5of øst5ov øst1r øst3re østø4 ø2s1ø2 4øt øt3ak ø9tar øta4s øt5asa ø2te. ø2tea ø6tef ø6tege ø2tei ø2t5eks ø2tel ø5tela. ø3ten ø4teni ø3ter. øte3ru ø2te1s øte7sn ø4teta øt7ri øt1sa øt3s4p øt7s6å øtså9re øt4tero øt6test øtt5av øtt5eks øtt5eta øtt5ete øtt5ra øtt7ri øtt1s2 øttså7re øt4tur øt4ty ø1tu ø5ty ø1u2 øug8la øv5aa øv5ans øve5in ø4vek øve5no øveren8 øve1s øves4t øve3te ø5vik øv6l7ut øv7ne øv6nø øv9o8 øv1r øv5reb øv1s øv9sa ø5vå øy3al øya2n 7øyan. 9øy8ans øy4dek øy4dere øyd8i 5øyeb øy7e4de øy2ee øy4ele øye4n øy4ep øy4erf øy1gl øy3ke. øyks4 øyk5t 2øyl øy4led øy4leg øy5na øy5ni øy3o 6øyp øy3pe. øy4pel øy4ra. øy5rer. øyri6v øy3rø øy1s øy5s4ar øy5si øys2l øy4sm øy4spi 5øysund øy4tei øy4tel øy4tere øyte5s6 øyti7da øy1tr øy2t3y6 øy5tø øy4vei 5øyvå ø1ø2 ø5å6 å1a åak6ta åa4n5 åan8ka. åan6ke. å2ar å5aran åau4re å1b4 åba8ne. åber2 åbo9ta 6å1d å7dan å9dar å4ded å4dek å4dem å4deo å4dep å4dere å4deri å6dero å2des å7di åd4ra åd8re åds1 åd2sk åd3s4la åd7slo åd3slå åd1s2n åd3s4pe åd7spu åd5st åd6s7te 4å1e å2ele åem8na åe2n å7ens å3er å3e6re. å1f åfe6 åfø5re 2åg å4ga. åg7ald å4ge. åg7ei å2ges ågna5 åg5ne åg4r åg5rin ågs6k åg5sl åg7sp ågs4t ågu4l åg5ø å4gå. å1h å1i å1j å1ka å3kan å3kar å4karb åk7av å4keh å3ken å4kena å4k3enh å4kere åke5s å4kesl å5kevi å1ki å6kid å1kj åk1k åk5ka åkk6l åk7kr åk7lau åklist7 åk3læ å1ko åk3opp åko4s åk6ra åk5røk åk3rå åk1s2 åks7l åk3t4 åku8 å5k8ul åkva8la. åkøy8rar. å2k3å å1la å5l6amp å6larb å9las ål5au8 ål9av ål3d å2lef ål5eini å2lek å2lem å4l5enh å4leni åle6ris å2le1s2 åle9s6und å4lete å2lev ålgå6 å6lio ål5j ålla6ga ål3or ål4san ål4sek ål4ser åls7i ål2sp ål4sti ålsy8na ål5ti ålti5d ål1u ålul8la å1ly å2l1øy åløy4e ål5å6k ålå8te. 6åm å6me. åm4li. åm1om åm5øy å3nar å9nas ånd3r ånd4sa ånd4se ånd4so å4ne. åned4 åneds5 åne5i6 å2nel ånely6 å5nes. å3net å4netr å3ni ån5o å9ny å3o åp2e åpe4n3a åpe4n5i åpen3s å5per å6pero å1pi åp6j å1pla åp4ne. åp7p å1pr åpra5 åp2s1 åp6ta å4på år3ak å9ran å7rara ård5str å2re. å5rei å6rel åre7s å4rest årfi4 å7riv år3k2 år4le. 2årn årn5s år3on år3op årpo8 år2s års5af års3el år3sem års3ko år8sku årsla8ga år3sol års3ta år7ste års3ti år7sto år5stu års1u års1v år5sy år5u4k år3un år5y4 å1rø å5r8å ås2 å1sa ås7au å4se. å4see ås5eid å4sek å4sem åseri7e6 åse3s2 å4sesm å4seso åse5ta ås3h å8si. ås5ka. ås9kene ås8ki å1skj ås7kop å1skr å5sku å1sl ås5ne ås3ni å5so å1sp ås7pl ås5sa ås5se ås3si åss3k 4å1st å7stei åsu4 ås3un ås7ut ås7væ ås5øy åså9 å1ta å4ta. åtaks5 åta2l åta9la åtale3 åta5le. åta5len å4tang å4tark å4t5arm å2te. å2tea å4tee å2t1ei åte6ke. å4teo å9ter å2tes 5åtferd å5ti åti7da 2åtn å1to åt7ov 6åtp åt1re åtri6pa. åtri8pe. åt1ru åt5sk åt1t åt4ted åt4ti ått3o åt4tri åtts4 åt6t5æ åt1u åt4un åtva5ra åtva7re åt5ve å5ty åt1øv å3u åun8ge. å1v åv4a å2ve7d å4veg åve5l å4veni å9ver. å2vev åv7s6 å7vy åvæ4re. å1ø8 åøy4",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=27148,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-nn.pat b/Master/texmf-dist/tex/context/patterns/lang-nn.pat
index ff12a14a73a..f3fa23ed4b3 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-nn.pat
+++ b/Master/texmf-dist/tex/context/patterns/lang-nn.pat
@@ -2542,6 +2542,7 @@ ansport7s6
an1st6
6anstar
ans4te4
+6ans6ti
2ansu
an9s6und
5ansunda
diff --git a/Master/texmf-dist/tex/context/patterns/lang-nn.rme b/Master/texmf-dist/tex/context/patterns/lang-nn.rme
index 0c2df2eba43..e6dd84c970e 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-nn.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-nn.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Norwegian Nynorsk Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% Adapted to the new pattern-loading scheme.
% Original file name was nnhyph.tex
@@ -26,109 +30,10 @@
% Please send bugs or suggestions to karl@huftis.org.
%
-% This file is part of hyph-utf8 package and resulted from
-% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
-%
-% Source: nohyphbx.tex (2007-02-07)
-% Author:
-%
-% The above mentioned file should become obsolete,
-% and the author of the original file should preferaby modify this file instead.
-%
-% Modificatios were needed in order to support native UTF-8 engines,
-% but functionality (hopefully) didn't change in any way, at least not intentionally.
-% This file is no longer stand-alone; at least for 8-bit engines
-% you probably want to use loadhyph-foo.tex (which will load this file) instead.
-%
-% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer
-% with help & support from:
-% - Karl Berry, who gave us free hands and all resources
-% - Taco Hoekwater, with useful macros
-% - Hans Hagen, who did the unicodifisation of patterns already long before
-% and helped with testing, suggestions and bug reports
-% - Norbert Preining, who tested & integrated patterns into TeX Live
-%
-% However, the "copyright/copyleft" owner of patterns remains the original author.
-%
-% The copyright statement of this file is thus:
-%
-% Do with this file whatever needs to be done in future for the sake of
-% "a better world" as long as you respect the copyright of original file.
-% If you're the original author of patterns or taking over a new revolution,
-% plese remove all of the TUG comments & credits that we added here -
-% you are the Queen / the King, we are only the servants.
-%
-% If you want to change this file, rather than uploading directly to CTAN,
-% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)
-% or ask for credentials for SVN repository and commit it yourself;
-% we will then upload the whole "package" to CTAN.
-%
-% Before a new "pattern-revolution" starts,
-% please try to follow some guidelines if possible:
-%
-% - \lccode is *forbidden*, and I really mean it
-% - all the patterns should be in UTF-8
-% - the only "allowed" TeX commands in this file are: \patterns, \hyphenation,
-% and if you really cannot do without, also \input and \message
-% - in particular, please no \catcode or \lccode changes,
-% they belong to loadhyph-foo.tex,
-% and no \lefthyphenmin and \righthyphenmin,
-% they have no influence here and belong elsewhere
-% - \begingroup and/or \endinput is not needed
-% - feel free to do whatever you want inside comments
-%
-% We know that TeX is extremely powerful, but give a stupid parser
-% at least a chance to read your patterns.
-%
-% For more unformation see
-%
-% http://tug.org/tex-hyphen
-%
-%------------------------------------------------------------------------------
-%
-% TeX hyphenation patterns for Norwegian
-%
-% version of 2007-02-07.
-% Patterns of January 25, 2005, with later additions and changes
-%
-% Copyright (C) 2004, 2005 Rune Kleveland, Ole Michael Selberg.
-% Copying and distribution of this file, with or without modification,
-% are permitted in any medium without royalty provided the copyright
-% notice and this notice are preserved.
-%
-% Please send bugs or suggestions to tex-live (at) tug.org.
-%
-% Originally generated by a script written by Rune Kleveland
-% from dictionaries available from
-% http://folk.uio.no/runekl/dictionary.html.
-%
-% Adjusted manually by Ole Michael Selberg to prevent
-% numerous wrong hyphenations, especially in compounds.
-%
-% Changes from the former version of 2005-06-29:
-% 388 new patterns. Some old patterns have been deleted or changed.
-%
-% In Kleveland's nohyphb.tex there are 26017 patterns.
-% This version of the revised nohyphbx.tex contains 27149 patterns
-% --- plus 45 exceptions in the \hyphenation-list
-% (which you may change to suit your personal needs).
-%
-% To load these hyphenation patterns the parameters
-% of TeX must have the following minimum values:
-% trie_size = 33385
-% trie_op_size = 815
-% (The corresponding values for nohyphb.tex are
-% trie_size = 31900 trie_op_size = 636)
-% If you want to load more than one set of hyphenation
-% patterns the parameters have to be set to a value
-% larger than or equal to the sum of all required values
-% for each set.
-%
-% Notes on other Norwegian hyphenation pattern files, from Dag Langmyhr,
-% tex-live mail of 29 Jun 2005 11:26:21 +0200.
-% nohyph.tex -- manually created by Ivar Aavatsmark and others;
-% hyphenate according to pre-1973 rules; no longer recommended for use.
-% (Sometimes also known as nohyph1.tex.)
-% nohyph2.tex -- created by Dag and a student; the present file,
-% nohyphbx.tex, is more extensive and is recommended.
-% \ No newline at end of file
+\input hyph-no.tex
+
+\hyphenation{
+att-en-de
+bet-re
+}
+
diff --git a/Master/texmf-dist/tex/context/patterns/lang-pl.lua b/Master/texmf-dist/tex/context/patterns/lang-pl.lua
new file mode 100644
index 00000000000..016a2f3acbb
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-pl.lua
@@ -0,0 +1,112 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["characters"]="abcdeghijklmnoprstwyzóąłż",
+ ["data"]="be-zach be-zami by-naj-mniej gdzie-nie-gdzie ina-czej na-dal ni-gdy ni-gdzie niech-że niech-by ow-szem pó-łach pó-łami pó-łek pod-ów-czas przy-naj-mniej skąd-inąd tró-jach tró-jami tró-jek",
+ ["n"]=20,
+ },
+ ["metadata"]={
+ ["mnemonic"]="pl",
+ ["source"]="hyph-pl",
+ ["texcomment"]="% Polish Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: plhyph.tex (1995-06-26)\
+% Author: Hanna Kołodziejska, Bogusław Jackowski, Marek Ryćko\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% This is PLHYPH.TeX - the Polish hyphenation patterns\
+% version 3.0a, Wednesday, May 17th, 1995\
+% to be used for the inclusion of Polish hyphenation patterns in any format,\
+% not necessarily in the MeX or LaMeX ones. The patterns are exactly\
+% the same as in the version 3.0 being the part of the MeX package,\
+% only the surrounding of the \\pattern command is changed. The authors\
+% claim the upward compatibility, i.e., the version 3.0a can also be used\
+% with the MeX or LaMeX formats.\
+% \
+% The history of development of the Polish hyphenation patterns:\
+%\
+% The first version of the patterns was developed\
+% by Hanna Kołodziejska (1987).\
+%\
+% The adaptation to the LeX format (see below) and extensive modification\
+% were done by Bogusław Jackowski & Marek Ryćko (1987--1989).\
+%\
+% The hyphenation rules were further improved and adapted to the\
+% TeX 3.x requirements by Hanna Kołodziejska (1991).\
+%\
+% Lone-standing version (3.0a) of patterns was prepared (under pressure\
+% from LaTeX users) by Bogusław Jackowski and Marek Ryćko, following\
+% Mariusz Olko's suggestions, 1995.\
+% \
+% The LeX format mentioned above was the first version of the adaptation\
+% of TeX to the Polish language. The next version is called MeX.\
+% \
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnoprstuvwxyzóąćęłńśźż",
+ ["data"]=".ćć8 .ćł8 .ćń8 .ćś8 .ćź8 .ćż8 .ć8 .ćb8 .ćc8 .ćd8 .ćf8 .ćg8 .ćh8 .ćj8 .ćk8 .ćl8 .ćm8 .ćn8 .ćp8 .ćr8 .ćs8 .ćt8 .ćv8 .ćw8 .ćwier2ć3 .ćx8 .ćz8 .łć8 .łł8 .łń8 .łś8 .łź8 .łż8 .ł8 .łb8 .łc8 .łd8 .łf8 .łg8 .łh8 .łj8 .łk8 .łl8 .łm8 .łn8 .łp8 .łr8 .łs8 .łt8 .łv8 .łw8 .łx8 .łz8 .ńć8 .ńł8 .ńń8 .ńś8 .ńź8 .ńż8 .ń8 .ńb8 .ńc8 .ńd8 .ńf8 .ńg8 .ńh8 .ńj8 .ńk8 .ńl8 .ńm8 .ńn8 .ńp8 .ńr8 .ńs8 .ńt8 .ńv8 .ńw8 .ńx8 .ńz8 .ść8 .śł8 .śń8 .śś8 .śź8 .śż8 .ś8 .śb8 .śc8 .śd8 .śf8 .śg8 .śh8 .śj8 .śk8 .śl8 .śm8 .śn8 .śp8 .śró2d5 .śródr2 .śr8 .śs8 .śt8 .śv8 .św8 .światło3w2 .śx8 .śz8 .źć8 .źł8 .źń8 .źś8 .źź8 .źż8 .ź8 .źb8 .źc8 .źdź8 .źd8 .źf8 .źg8 .źh8 .źj8 .źk8 .źl8 .źm8 .źn8 .źp8 .źr8 .źs8 .źt8 .źv8 .źw8 .źx8 .źz8 .żć8 .żł8 .żń8 .żś8 .żź8 .żż8 .ż8 .żb8 .żc8 .żd8 .żf8 .żg8 .żh8 .żj8 .żk8 .żl8 .żm8 .żn8 .żp8 .żr8 .żs8 .żt8 .żv8 .żw8 .żx8 .żz8 .a2b2s3t .a2d3 .ad4a .ad4e .ad4i .ad4o .ad4u .ad4y .ad5apt .ad5iu .ad5op .ad5or .ae3ro .aeroa2 .aeroe2 .aeroi2 .aeroo2 .aerou2 .antya2 .antye2 .antyi2 .antyo2 .antyu2 .arcy3ł2 .arcy3b2 .arcy3bz2 .arcy3k2 .arcy3m2 .arcya2 .arcye2 .arcyi2 .arcyo2 .arcyu2 .au3g2 .au3k2 .au3t2 .auto3ch2 .autoa2 .autoe2 .autoi2 .autoo2 .autotran2s3 .autou2 .bć8 .bł8 .bń8 .bś8 .bź8 .bż8 .b8 .bb8 .bc8 .bd8 .be2z3 .be3z4an .be3z4ec .be3z4ik .bezch2 .bezm2 .bezo2 .bezo2b1j .bezw2 .bezzw2 .bf8 .bg8 .bh8 .bj8 .bk8 .bl8 .bm8 .bn8 .bp8 .br8 .brz8 .bs8 .bt8 .bv8 .bw8 .bx8 .bz8 .cć8 .cł8 .cń8 .cś8 .cź8 .cż8 .c8 .cało3ś2 .cało3k2 .cb8 .cc8 .cd8 .cf8 .cg8 .ch8 .chrz8 .cienko3w2 .ciepło3kr2 .cj8 .ck8 .cl8 .cm8 .cn8 .cp8 .cr8 .cs8 .ct8 .cv8 .cw8 .cx8 .cz8 .czarno3k2 .czk8 .cztere2ch3 .czterechse2t3 .cztero3ś2 .czwó2r3 .czwó3r4ą .czwó3r4ę .czwó3r4a .czwó3r4e .czwó3r4o .dć8 .dł8 .długo3tr2 .długo3w2 .dń8 .dś8 .dź8 .dż8 .d8 .daleko3w2 .db8 .dc8 .dd8 .de2z3 .de3z4a3bil .de3z4a3wu .de3z4el .de3z4er .de3z4y .deza2 .dezo2 .df8 .dg8 .dh8 .dj8 .dk8 .dl8 .dm8 .dn8 .do3ć2 .do3ł2 .do3ś2 .do3ź2 .do3ż2 .do3b2 .do3c2 .do3d2 .do3f2 .do3g2 .do3h2 .do3k2 .do3l2 .do3m2 .do3p2 .do3r2 .do3s2 .do3t2 .do3w2 .do3z2 .do4ł3k .do4k3t .do4l3n .do4m3k .do4r3s .do4w3c .do5m4k2n .dobr2 .dobrz2 .doch2 .docz2 .dodź2 .dodż2 .dodz2 .dogrz2 .dopch2 .doprz2 .dorż2 .dorz2 .dosch2 .dosm2 .dosz2 .dotk2 .dotr2 .dp8 .dr8 .drogo3w2 .drz8 .ds8 .dt8 .dv8 .dwó2j3 .dwó3j4ą .dwó3j4ę .dwó3j4a .dwó3j4e .dwó3j4o .dw8 .dx8 .dy2s3 .dy2z3 .dy3s4e .dy3s4o .dy3s4ta .dy3s4y .dy3sz .dy3z4e .dyzu2 .dz8 .dziesięcio3ś2 .dziewięćse2t3 .dziewię2ć3 .dziewięcio3ś2 .e2k2s3 .e2m3e2s5ze2t .e2s1e2s1ma .e2s1ha .e2s1t .egoa2 .egoe2 .egoi2 .egoo2 .egou2 .eks4y .elektroa2 .elektroe2 .elektroi2 .elektroo2 .elektrou2 .fć8 .fł8 .fń8 .fś8 .fź8 .fż8 .f8 .fb8 .fc8 .fd8 .ff8 .fg8 .fh8 .fj8 .fk8 .fl8 .fm8 .fn8 .fp8 .fr8 .fs8 .ft8 .fv8 .fw8 .fx8 .fz8 .gć8 .gł8 .gń8 .gś8 .gź8 .gż8 .g8 .gb8 .gc8 .gd8 .ge2o3 .gf8 .gg8 .gh8 .gj8 .gk8 .gl8 .gm8 .gn8 .go2u3 .gp8 .gr8 .grubo3w2 .grz8 .gs8 .gt8 .gv8 .gw8 .gx8 .gz8 .hć8 .hł8 .hń8 .hś8 .hź8 .hż8 .h8 .hb8 .hc8 .hd8 .hf8 .hg8 .hh8 .hipe2r3 .hipe3r4o .hipera2 .hipere2 .hj8 .hk8 .hl8 .hm8 .hn8 .hp8 .hr8 .hs8 .ht8 .hv8 .hw8 .hx8 .hz8 .i2n3 .i2s3l .i3n4ic .i3n4o .i3n4u .i4n5o2k .in4f3lan .ino3w2 .izoa2 .izoe2 .izoi2 .izoo2 .izou2 .jć8 .jł8 .jń8 .jś8 .jź8 .jż8 .j8 .jadło3w2 .jb8 .jc8 .jd8 .jf8 .jg8 .jh8 .jj8 .jk8 .jl8 .jm8 .jn8 .jp8 .jr8 .js8 .jt8 .jv8 .jw8 .jx8 .jz8 .kć8 .kł8 .kń8 .kś8 .kź8 .kż8 .k8 .kb8 .kc8 .kd8 .kf8 .kg8 .kh8 .kilkuse2t3 .kilkuseto2 .kj8 .kk8 .kl8 .km8 .kn8 .koło3w2 .kon2t2r3 .kon3tr4a .kon3tr4e .kon3tr4o3l .kon3tr4o3w .kon3tr4y .kon4tr5a2gi .kon4tr5a2se .kon4tr5a2sy .kon4tr5a2ta .kon4tr5adm .kon4tr5akc .kon4tr5alt .kon4tr5arg .kontro2 .kontru2 .kp8 .krótko3tr2 .krótko3w2 .kr8 .kro2ć3 .krz8 .ks8 .kt8 .kv8 .kw8 .kx8 .kz8 .lć8 .lł8 .lń8 .lś8 .lź8 .lż8 .l8 .lb8 .lc8 .ld8 .lf8 .lg8 .lh8 .lj8 .lk8 .ll8 .lm8 .ln8 .lp8 .lr8 .ls8 .lt8 .ludo3w2 .lv8 .lw8 .lx8 .lz8 .mć8 .mł8 .mń8 .mś8 .mź8 .mż8 .m8 .mb8 .mc8 .md8 .mf8 .mg8 .mh8 .mili3amp .mj8 .mk8 .ml8 .mm8 .mn8 .możno3w2 .mp8 .mr8 .ms8 .mt8 .mv8 .mw8 .mx8 .mz8 .nć8 .nł8 .nń8 .nś8 .nź8 .nż8 .n8 .na2d2 .na2j .na3ć2 .na3ł2 .na3ś2 .na3ź2 .na3ż2 .na3b2 .na3c2 .na3dą .na3dę .na3dź2 .na3d4łub .na3d4ir .na3d4much .na3d4ręcz .na3d4r2w .na3d4repcz .na3d4rept .na3d4ruk .na3d4rz .na3d4worn .na3daj .na3de .na3do .na3dy .na3dzi .na3f2 .na3g2 .na3h2 .na3ją .na3ję .na3jazd .na3je .na3k2 .na3l2 .na3m2 .na3p2 .na3r2 .na3s2 .na3t2 .na3u2 .na3w2 .na3z2 .na4d3o2b2ł .na4d3o2bojcz .na4d3o2bowi .na4d3o2brot .na4d3o2drz .na4d3o2kien .na4d3olbrz .na4d5rzą .na4d5rzę .na4d5rzecz .na4d5rzy .na4d5ziem .na4f3c .na4f3t .na4j3e2f .na4j3e2g .na4j3e2k2s .na4j3e2ko .na4j3e2n .na4j3e2r .na4j3e2s .na4j3e2w .na4j3emf .na4j3eu .na4r3c .na4r3d .na4r3k .na4r3r .na4r3t .nabrz2 .nach2 .nacz2 .nadśrod5ziem .nad3ć2 .nad3ł2 .nad3ś2 .nad3b2 .nad3c2 .nad3d2 .nad3e2tat .nad3f2 .nad3g2 .nad3h2 .nad3i2 .nad3j2 .nad3k2 .nad3l2 .nad3m2 .nad3n2 .nad3p2 .nad3r2 .nad3s2 .nad3t2 .nad3u2 .nad3w2 .nad5ż2 .nad5zó .nad5z2mys .nad5zo .nad5zwycz .nadch2 .nadcz2 .naddź2 .nade3ć2 .nade3ł2 .nade3ś2 .nade3ź2 .nade3ż2 .nade3b2 .nade3c2 .nade3d2 .nade3f2 .nade3g2 .nade3h2 .nade3k2 .nade3l2 .nade3m2 .nade3p2 .nade3r2 .nade3s2 .nade3t2 .nade3w2 .nade3z2 .nade4p3c .nade4p3n .nade4p3t .nadech2 .nadecz2 .nadedź2 .nadedż2 .nadedz2 .naderż2 .naderz2 .nadesz2 .nadsz2 .nadtr2 .nadz2 .nagrz2 .naj3ć2 .naj3ł2 .naj3ś2 .naj3ź2 .naj3ż2 .naj3akt .naj3au .naj3b2 .naj3c2 .naj3d2 .naj3f2 .naj3g2 .naj3h2 .naj3i2 .naj3k2 .naj3l2 .naj3m2 .naj3o2 .naj3o2ć2 .naj3o2ł2 .naj3o2ś2 .naj3o2ź2 .naj3o2ż2 .naj3o2b2 .naj3o2c2 .naj3o2d2 .naj3o2f2 .naj3o2g2 .naj3o2h2 .naj3o2k2 .naj3o2l2 .naj3o2m2 .naj3o2p2 .naj3o2r2 .naj3o2s2 .naj3o2t2 .naj3o2w2 .naj3o2z2 .naj3p2 .naj3r2 .naj3ro2z3 .naj3s2 .naj3t2 .naj3u2 .naj3w2 .naj3z2 .najbe2z3 .najbezw2 .najch2 .najcz2 .najdź2 .najdż2 .najdo3ć2 .najdo3ł2 .najdo3ś2 .najdo3ź2 .najdo3ż2 .najdo3b2 .najdo3c2 .najdo3d2 .najdo3f2 .najdo3g2 .najdo3h2 .najdo3k2 .najdo3l2 .najdo3m2 .najdo3p2 .najdo3r2 .najdo3s2 .najdo3t2 .najdo3w2 .najdo3z2 .najdoch2 .najdocz2 .najdodź2 .najdodż2 .najdodz2 .najdorz2 .najdosz2 .najdotk2 .najdz2 .najkr2 .najob3ć2 .najob3ł2 .najob3ś2 .najob3ź2 .najob3ż2 .najob3c2 .najob3d2 .najob3f2 .najob3g2 .najob3h2 .najob3j2 .najob3k2 .najob3l2 .najob3m2 .najob3n2 .najob3p2 .najob3s2 .najob3t2 .najob3w2 .najobch2 .najobcz2 .najobdź2 .najobdż2 .najobdz2 .najobrz2 .najobsz2 .najoch2 .najocz2 .najodź2 .najod3ć2 .najod3ś2 .najod3c2 .najod3d2 .najod3f2 .najod3g2 .najod3h2 .najod3j2 .najod3k2 .najod3l2 .najod3m2 .najod3n2 .najod3p2 .najod3s2 .najod3t2 .najod3w2 .najod5ż2 .najodch2 .najodcz2 .najoddź2 .najoddż2 .najoddz2 .najodsz2 .najodz2 .najorz2 .najosz2 .najro3z4u .najrz2 .najsm2 .najsz2 .najtk2 .najtr2 .najucz2 .najzw2 .nakr2 .napo2d2 .napo3ć2 .napo3ł2 .napo3ś2 .napo3ź2 .napo3ż2 .napo3b2 .napo3c2 .napo3f2 .napo3g2 .napo3h2 .napo3k2 .napo3l2 .napo3m2 .napo3p2 .napo3r2 .napo3s2 .napo3t2 .napo3w2 .napo3z2 .napo4m3p .napoch2 .napocz2 .napodź2 .napodż2 .napod3d .napomk2 .naporz2 .naposz2 .naprz2 .narż2 .naro2z3 .narz2 .nasm2 .nasz2 .natch2 .natk2 .naz3m2 .nazw2 .nb8 .nc8 .nd8 .ne2o3 .nf8 .ng8 .nh8 .nie3ć2 .nie3ł2 .nie3ś2 .nie3ź2 .nie3ż2 .nie3b2 .nie3c2 .nie3d2 .nie3f2 .nie3g2 .nie3h2 .nie3k2 .nie3l2 .nie3m2 .nie3p2 .nie3r2 .nie3s2 .nie3t2 .nie3u2 .nie3w2 .nie3z2 .nie4c3c .nie4c3k .nie4dź3 .nie4m3c .nie4m3k .niech2 .niecz2 .niedż2 .niedo3ć2 .niedo3ł2 .niedo3ś2 .niedo3ź2 .niedo3ż2 .niedo3b2 .niedo3c2 .niedo3d2 .niedo3f2 .niedo3g2 .niedo3h2 .niedo3k2 .niedo3l2 .niedo3m2 .niedo3p2 .niedo3r2 .niedo3s2 .niedo3t2 .niedo3w2 .niedo3z2 .niedobrz2 .niedoch2 .niedocz2 .niedodź2 .niedodż2 .niedodz2 .niedokr2 .niedomk2 .niedopch2 .niedorz2 .niedosz2 .niedotk2 .niedz2 .nieoć2 .nieoł2 .nieoś2 .nieoź2 .nieoż2 .nieo2 .nieob2 .nieob3ć2 .nieob3ś2 .nieob3ź2 .nieob3ż2 .nieob3c2 .nieob3d2 .nieob3f2 .nieob3g2 .nieob3h2 .nieob3j2 .nieob3k2 .nieob3m2 .nieob3p2 .nieob3s2 .nieob3w2 .nieobch2 .nieobcz2 .nieobdź2 .nieobdż2 .nieobdz2 .nieobsz2 .nieoc2 .nieoch2 .nieocz2 .nieodź2 .nieod2 .nieod3ć2 .nieod3ł2 .nieod3ś2 .nieod3c2 .nieod3d2 .nieod3f2 .nieod3g2 .nieod3h2 .nieod3j2 .nieod3k2 .nieod3l2 .nieod3n2 .nieod3p2 .nieod3s2 .nieod3t2 .nieod3wr .nieod5ż2 .nieodch2 .nieodcz2 .nieoddź2 .nieoddż2 .nieoddz2 .nieodsz2 .nieodw2 .nieodz2 .nieof2 .nieog2 .nieoh2 .nieok2 .nieol2 .nieom2 .nieop2 .nieor2 .nieorz2 .nieos2 .nieosz2 .nieot2 .nieow2 .nieoz2 .niepo2d2 .niepo3ć2 .niepo3ł2 .niepo3ś2 .niepo3ź2 .niepo3ż2 .niepo3b2 .niepo3c2 .niepo3dź2 .niepo3d4łu .niepo3d4much .niepo3d4ręcz .niepo3d4raż .niepo3d4rap .niepo3d4repcz .niepo3d4rept .niepo3d4waj .niepo3d4woj .niepo3do .niepo3du .niepo3dz2 .niepo3f2 .niepo3g2 .niepo3h2 .niepo3k2 .niepo3l2 .niepo3m2 .niepo3p2 .niepo3r2 .niepo3s2 .niepo3t2 .niepo3w2 .niepo3z2 .niepo4d3o2choc .niepo4d3o2strz .niepoch2 .niepocz2 .niepod3ć2 .niepod3ł2 .niepod3ś2 .niepod3b2 .niepod3c2 .niepod3d2 .niepod3f2 .niepod3g2 .niepod3h2 .niepod3j2 .niepod3k2 .niepod3l2 .niepod3m2 .niepod3n2 .niepod3p2 .niepod3r2 .niepod3s2 .niepod3t2 .niepod3w2 .niepod5ż .niepodch2 .niepodcz2 .niepoddź2 .niepoddż2 .niepodsm2 .niepodsz2 .nieporz2 .nieposm2 .nieposz2 .nieprzełk2 .nieprze2d2 .nieprze3ć2 .nieprze3ł2 .nieprze3ś2 .nieprze3ź2 .nieprze3ż2 .nieprze3b2 .nieprze3brz2 .nieprze3c2 .nieprze3dź2 .nieprze3d4łuż .nieprze3d4much .nieprze3d4ramat .nieprze3d4ruk .nieprze3d4ryl .nieprze3d4rz2 .nieprze3d4um .nieprze3dy .nieprze3dz2 .nieprze3e2k2s3 .nieprze3f2 .nieprze3g2 .nieprze3h2 .nieprze3k2 .nieprze3l2 .nieprze3m2 .nieprze3n2 .nieprze3p2 .nieprze3r2 .nieprze3s2 .nieprze3t2 .nieprze3w2 .nieprze3z2 .nieprze4d5łużyc .nieprze4d5ż2 .nieprze4d5z2a .nieprze4d5zg2 .nieprze4d5zim .nieprze4d5zj .nieprze4d5zl .nieprze4d5zw2r .nieprze4d5zwoj .nieprzech2 .nieprzecz2 .nieprzed3ć2 .nieprzed3ł2 .nieprzed3ś2 .nieprzed3c2 .nieprzed3d2 .nieprzed3f2 .nieprzed3g2 .nieprzed3h2 .nieprzed3i2 .nieprzed3j2 .nieprzed3k2 .nieprzed3l2 .nieprzed3m2 .nieprzed3n2 .nieprzed3p2 .nieprzed3r2 .nieprzed3s2 .nieprzed3sz2 .nieprzed3t2 .nieprzed3u2 .nieprzed3w2 .nieprzedch2 .nieprzedcz2 .nieprzeddź2 .nieprzeddż2 .nieprzeddz2 .nieprzegrz2 .nieprzekl2 .nieprzekr2 .nieprzepch2 .nieprzerż2 .nieprzerz2 .nieprzesch2 .nieprzesm2 .nieprzesz2 .nieprzetk2 .nieprzetr2 .niero2z3 .niero3z4e .niero3z4u .nierozś2 .nierozbrz2 .nieroze3r2 .nierozm2 .nieroztr2 .nierz2 .niesu2b3 .niesu3b4ie .niesz2 .nietk2 .nietr2 .nieucz2 .nieuw2 .niewy3ć2 .niewy3ł2 .niewy3ś2 .niewy3ź2 .niewy3ż2 .niewy3b2 .niewy3c2 .niewy3d2 .niewy3f2 .niewy3g2 .niewy3h2 .niewy3k2 .niewy3l2 .niewy3m2 .niewy3p2 .niewy3r2 .niewy3s2 .niewy3t2 .niewy3w2 .niewy3z2 .niewybrz2 .niewych2 .niewycz2 .niewydź2 .niewydż2 .niewydz2 .niewyrz2 .niewysz2 .niewytk2 .niewytr2 .niezw2 .nj8 .nk8 .nl8 .nm8 .nn8 .np8 .nr8 .ns8 .nt8 .nv8 .nw8 .nx8 .nz8 .oć2 .oś2 .ośmio3ś2 .oź2 .oż2 .o2b2 .o2d2 .o2t3chł .o3b4łą .o3b4łę .o3b4łoc .o3b4luzg .o3b4rać .o3b4raso .o3b4roń .o3b4ron .o3b4ryź .o3b4ryz .o3b4rz2 .o3be .o3bi .o3d4iu .o3d4ręt .o3d4rap .o3d4robin .o3d4rut .o3d4rwi .o3d4rzeć .o3d4rzw .o3d6zia .o3d6zie .o3de .o3l2śn .o4b5łocz .o4b5rzą .o4b5rzęd .o4b5rzez .o4b5rzuc .o4b5rzut .o4b5rzyn .o4d7ziar .o4d7ziem .oa3z .ob3ć2 .ob3ł2 .ob3ś2 .ob3ź2 .ob3ż2 .ob3c2 .ob3d2 .ob3f2 .ob3g2 .ob3h2 .ob3j2 .ob3k2 .ob3l2 .ob3m2 .ob3n2 .ob3o2strz .ob3p2 .ob3r .ob3s2 .ob3t2 .ob3u2m2 .ob3w2 .obch2 .obcz2 .obdź2 .obdż2 .obdz2 .obe3ć2 .obe3ł2 .obe3ś2 .obe3ź2 .obe3ż2 .obe3b2 .obe3c2 .obe3d2 .obe3f2 .obe3g2 .obe3h2 .obe3k2 .obe3l2 .obe3m2 .obe3p2 .obe3r2 .obe3r3t .obe3s2 .obe3t2 .obe3w2 .obe3z2 .obe4c3n .obe4z3w .obech2 .obecz2 .obedź2 .obedż2 .obedz2 .oberż2 .ober3m .oberz2 .obesch2 .obesz2 .obetk2 .obi3b2 .obsz2 .oc2 .och2 .ochrz2 .ocz2 .odź2 .od3ć2 .od3ś2 .od3au .od3b2 .od3c2 .od3d2 .od3f2 .od3g2 .od3h2 .od3i2 .od3i2zo .od3j2 .od3k2 .od3l2 .od3m2 .od3n2 .od3o2s .od3p2 .od3r2 .od3s2 .od3t2 .od3u2cz .od3u2m2 .od3w2 .od5ż2 .od5z2 .odbe2z3 .odch2 .odcz2 .oddź2 .oddż2 .oddz2 .ode3ć2 .ode3ł2 .ode3ś2 .ode3ź2 .ode3ż2 .ode3b2 .ode3c2 .ode3d2 .ode3f2 .ode3g2 .ode3h2 .ode3k2 .ode3l2 .ode3m2 .ode3mk2 .ode3p2 .ode3r2 .ode3s2 .ode3t2 .ode3w2 .ode3z2 .odech2 .odecz2 .odedź2 .odedż2 .odedz2 .odepch2 .oderż2 .oderz2 .odesz2 .odetch2 .odetk2 .odkrz2 .odrz2 .odsz2 .of2 .ogólno3k2 .og2 .ognio3tr2 .oh2 .ok2 .oka3m2 .okr2 .ole2o3 .om2 .op2 .opch2 .or2ż2 .or2tę .or2z2 .os2 .osie2m3 .osiemse2t3 .osz2 .ot2 .ow2 .oz2 .pć8 .pł8 .płasko3w2 .pń8 .półk2 .półkr2 .półm2 .póło2 .półob3r .półom2d .półprzy3m2k .pó2ł3 .pó3ł4ą .pó3ł4ę .pó3ł4ecz .pó3ł4y .pś8 .pź8 .pż8 .p8 .pb8 .pc8 .pch8 .pd8 .pełno3kr2 .pe2r3 .pe3c2k .pe3r4e .pe3r4i .pe3r4o .pe3r4u .pe3r4y .pe4r5i2n .pee2se2l .pepee2r .pepee2s .peze2t1pee2r .pf8 .pg8 .ph8 .pięćse2t3 .pię2ć3 .pięcio3ś2 .pierwo3w2 .piono3w2 .pj8 .pk8 .pl8 .pm8 .pn8 .połk2 .po2d2 .po3ć2 .po3ł2 .po3ś2 .po3ź2 .po3ż2 .po3b2 .po3c2 .po3dą .po3dę .po3dź2 .po3d4łu .po3d4much .po3d4naw .po3d4ręcz .po3d4rętw .po3d4róż .po3d4r2wi .po3d4raż .po3d4rap .po3d4repcz .po3d4rept .po3d4roż .po3d4robó .po3d4roba .po3d4robo .po3d4roby .po3d4rocz .po3d4ruzg .po3d4ryg .po3d4rze .po3d4wójn .po3d4wór .po3d4waj .po3d4woi .po3d4woj .po3d4worz .po3da .po3de .po3dej .po3diu .po3do .po3du .po3dy .po3dz2 .po3e2k2s3 .po3f2 .po3g2 .po3h2 .po3k2 .po3l2 .po3m2 .po3p2 .po3rż .po3r2 .po3s2 .po3t2 .po3w2 .po3z2 .po4ń3c .po4cz3d .po4cz3t .po4d3ów .po4d3e4k2s3 .po4d3o2bóz .po4d3o2biad .po4d3o2bojcz .po4d3o2braz .po4d3o2choc .po4d3o2dm .po4d3o2f .po4d3o2g .po4d3o2kien .po4d3o2kn .po4d3o2kręg .po4d3o2kres .po4d3o2piecz .po4d3o2ryw .po4d3o2siniak .po4d3o2strz .po4d3obsz .po4d3odd .po4d3olbrz .po4d3u2cz .po4d3u2dz .po4d3u2pa .po4d3u2ral .po4d3u2sta .po4d3u2szcz .po4d5ręczn .po4d5zakr .po4d5zam .po4d5zast .po4d5zbi .po4d5ze .po4d5zielenią .po4d5zielenić .po4d5zielenię .po4d5zielenił .po4d5zielenic .po4d5zielenien .po4d5zielenil .po4d5zielenim .po4d5zielenio .po4d5zielenis .po4d5ziem .po4d5ziom .po4d5zw2r .po4l3s .po4m3p .po4r3c .po4r3f .po4r3n .po4r3t .po4st3d .po4st3f .po4st3g .po4st3h .po4st3i2 .po4st3k .po4st3l .po4st3m .po4st3p .po4st3rom .po4st3s .po5d4uszczyn .po5r4tę .pobr2 .pobrz2 .poch2 .pochrz2 .pocz2 .pod3ć2 .pod3ł2 .pod3ś2 .pod3śró2d5 .pod3alp .pod3b2 .pod3c2 .pod3d2 .pod3f2 .pod3g2 .pod3h2 .pod3i2n .pod3j2 .pod3k2 .pod3l2 .pod3m2 .pod3n2 .pod3p2 .pod3r2 .pod3s2 .pod3t2 .pod3w2 .pod5ż2 .podch2 .podcz2 .poddź2 .poddż2 .pode3ć2 .pode3ł2 .pode3ś2 .pode3ź2 .pode3ż2 .pode3b2 .pode3c2 .pode3d2 .pode3f2 .pode3g2 .pode3h2 .pode3k2 .pode3l2 .pode3m2 .pode3p2 .pode3r2 .pode3s2 .pode3t2 .pode3tk2 .pode3w2 .pode3z2 .podech2 .podecz2 .podedź2 .podedż2 .podedz2 .podepch2 .poderż2 .poderz2 .podesch2 .podesz2 .podro2z3 .podsm2 .podsz2 .pogrz2 .pokl2 .pokr2 .pom4pk .pomk2 .pona2d2 .pona3ć2 .pona3ł2 .pona3ś2 .pona3ź2 .pona3ż2 .pona3b2 .pona3c2 .pona3cz2 .pona3dź2 .pona3do .pona3f2 .pona3g2 .pona3h2 .pona3k2 .pona3l2 .pona3m2 .pona3p2 .pona3r2 .pona3s2 .pona3t2 .pona3w2 .pona3z2 .pona4f3t .ponabrz2 .ponach2 .ponad3ć2 .ponad3ś2 .ponad3c2 .ponad3ch2 .ponad3cz2 .ponad3dź2 .ponad3f2 .ponad3g2 .ponad3h2 .ponad3j2 .ponad3k2 .ponad3l2 .ponad3p2 .ponad3s2 .ponad3t2 .ponadz2 .ponarz2 .ponasm2 .ponasz2 .ponaz3m2 .ponazw2 .ponie3k2 .ponie3w2 .popch2 .popo3w2 .poprz2 .por4t1w .por4tf .por4tm .poro2z3 .poro3z4u .porz2 .posch2 .posm2 .posz2 .potk2 .potr2 .poz4m2 .poza3u2 .pozw2 .pp8 .pr8 .pra3s2 .pra3w2nu .pra3w2z .prapra3w2nu .predy2s3po .prz8 .przełk2 .prze2d2 .prze3ć2 .prze3ł2 .prze3ś2 .prze3ź2 .prze3ż2 .prze3b2 .prze3c2 .prze3dą .prze3dę .prze3dź2 .prze3d4łuż .prze3d4much .prze3d4o3br .prze3d4o3st .prze3d4o3zo .prze3d4ramat .prze3d4ruk .prze3d4ryl .prze3d4rz2 .prze3d4um .prze3dy .prze3dz2 .prze3e2k2s3 .prze3f2 .prze3g2 .prze3h2 .prze3k2 .prze3l2 .prze3m2 .prze3n2 .prze3p2 .prze3r2 .prze3s2 .prze3t2 .prze3u2 .prze3w2 .prze3z2 .prze4d5łużyc .prze4d5ż2 .prze4d5o4stat .prze4d5za .prze4d5zg2 .prze4d5zim .prze4d5zj .prze4d5zl .prze4d5zw2r .prze4d5zwoj .przebr2 .przebrz2 .przech2 .przechrz2 .przeci2w3 .przeci3w4ie .przeciwa2 .przeciww2 .przecz2 .przed3ć2 .przed3ł2 .przed3ś2 .przed3a2gon .przed3a2kc .przed3alp .przed3b2 .przed3c2 .przed3d2 .przed3e2gz .przed3e2mer .przed3f2 .przed3g2 .przed3h2 .przed3i2 .przed3j2 .przed3k2 .przed3l2 .przed3m2 .przed3n2 .przed3o2 .przed3p2 .przed3r2 .przed3s2 .przed3się3w2 .przed3sz2 .przed3t2 .przed3u2 .przed3w2 .przedch2 .przedcz2 .przeddź2 .przeddż2 .przeddz2 .przedgrz2 .przedy2s3ku .przegrz2 .przekl2 .przekr2 .przemk2 .przepch2 .przerż2 .przerz2 .przesch2 .przesm2 .przesz2 .przetk2 .przetr2 .przetran2s3 .przy3ć2 .przy3ł2 .przy3ś2 .przy3ź2 .przy3ż2 .przy3b2 .przy3c2 .przy3d2 .przy3f2 .przy3g2 .przy3h2 .przy3k2 .przy3l2 .przy3m2 .przy3p2 .przy3r2 .przy3s2 .przy3t2 .przy3w2 .przy3z2 .przybr2 .przych2 .przycz2 .przydź2 .przydż2 .przydz2 .przygrz2 .przymk2 .przyoz2 .przypch2 .przyrż2 .przyrz2 .przysch2 .przysz2 .przytk2 .ps8 .pt8 .pv8 .pw8 .px8 .pz8 .rć8 .rł8 .rń8 .rś8 .rź8 .rż8 .r8 .rb8 .rc8 .rd8 .retran2s3 .rf8 .rg8 .rh8 .rj8 .rk8 .rl8 .rm8 .rn8 .ro2z3 .ro3z4a .ro3z4e .ro3z4e3ć2 .ro3z4e3ł2 .ro3z4e3ś2 .ro3z4e3ź2 .ro3z4e3ż2 .ro3z4e3b2 .ro3z4e3c2 .ro3z4e3d2 .ro3z4e3f2 .ro3z4e3g2 .ro3z4e3h2 .ro3z4e3k2 .ro3z4e3l2 .ro3z4e3m2 .ro3z4e3p2 .ro3z4e3r2 .ro3z4e3s2 .ro3z4e3t2 .ro3z4e3w2 .ro3z4e3z2 .ro3z4ej .ro3z4u .ro4z5a2gi .ro4z5a2nie .ro4z5e2mo .ro4z5e4g3z .ro4z5e4n3t .rozś2 .rozbrz2 .rozd2 .rozech2 .rozecz2 .rozedź2 .rozedż2 .rozedz2 .rozepch2 .rozerż2 .rozerz2 .rozesch2 .rozesz2 .rozi2 .rozm2 .rozo2 .rozpo3w2 .rozt2 .roztr2 .rozw2 .rp8 .rr8 .rs8 .rt8 .rv8 .rw8 .rx8 .rz8 .sć8 .sł8 .sń8 .sś8 .sź8 .sż8 .s8 .samo3ch2 .samo3k2 .samo3p2 .samo3w2 .samoro2z3 .sb8 .sc8 .sch8 .sd8 .sf8 .sg8 .sh8 .siede2m3 .siedemse2t3 .siedmio3ś2 .sj8 .ską2d5że .sk8 .skl8 .skr8 .sl8 .sm8 .sn8 .sobo3w2 .spó2ł3 .sp8 .spo2d2 .spo3ć2 .spo3ł2 .spo3ś2 .spo3ź2 .spo3ż2 .spo3b2 .spo3c2 .spo3dz2 .spo3f2 .spo3g2 .spo3h2 .spo3k2 .spo3l2 .spo3m2 .spo3p2 .spo3r2 .spo3s2 .spo3t2 .spo3w2 .spo3z2 .spo4r3n .spo4r3t .spoch2 .spocz2 .spodź2 .spodż2 .spod3d .sporz2 .sposz2 .sr8 .ss8 .st8 .stere2o3 .stereoa2 .stereoe2 .stereoi2 .stereoo2 .stereou2 .su2b3 .su3b4ie .su3b4otn .supe2r3 .supe3r4at .supe3r4io .supe4r5a2tr .super5z2b .supere2 .supero2d1rzut .sv8 .sw8 .sx8 .sz8 .sześćse2t3 .sześcio3ś2 .sze2ś2ć3 .sze2s3 .tć8 .tł8 .tń8 .tś8 .tź8 .tż8 .t8 .ta2o3 .ta2r7zan .tb8 .tc8 .tch8 .td8 .te2o3 .tf8 .tg8 .th8 .tj8 .tk8 .tl8 .tm8 .tn8 .toa3 .tp8 .tró2j3 .tró3j4ą .tró3j4ę .tró3j4ecz .tr8 .tran2s3 .tran3s4e .tran3s4ie .tran3s4y .tran3sz .tran4s5eu .transa2 .transo2 .trz8 .trze2ch3 .trzechse2t3 .ts8 .tt8 .tv8 .tw8 .tx8 .tysią2c3 .tysią3c4a .tysią3c4e .tysią3cz .tysią4c5zł .tz8 .uć2 .uś2 .u3ł2 .u3ź2 .u3ż2 .u3b2 .u3c2 .u3d2 .u3f2 .u3g2 .u3h2 .u3k2 .u3l2 .u3m2 .u3n2 .u3p2 .u3r2 .u3s2 .u3t2 .u3w2 .u3z2 .u4d3k .u4f3n .u4k3lej .u4l3s .u4l3t .u4m3br .u4n3c .u4n3d .u4p3p2s .u4r3s .u4st3n .u4stc .u4stk .u4z3be .ube2z3 .ubezw2 .ubr2 .uch2 .ucz2 .udź2 .udż2 .udz2 .ukr2 .umk2 .upch2 .upo2d2 .upo3ć2 .upo3ł2 .upo3ś2 .upo3ź2 .upo3ż2 .upo3b2 .upo3c2 .upo3da .upo3f2 .upo3g2 .upo3h2 .upo3k2 .upo3l2 .upo3m2 .upo3p2 .upo3r2 .upo3s2 .upo3t2 .upo3w2 .upo3z2 .upoch2 .upocz2 .upodź2 .upodż2 .upod3d .uporz2 .uposz2 .urż2 .uro2z3 .urz2 .usch2 .usz2 .utk2 .utr2 .uze3w2 .vć8 .vł8 .vń8 .vś8 .vź8 .vż8 .v8 .vb8 .vc8 .vd8 .vf8 .vg8 .vh8 .vj8 .vk8 .vl8 .vm8 .vn8 .vp8 .vr8 .vs8 .vt8 .vv8 .vw8 .vx8 .vz8 .wć8 .wł8 .wń8 .wś8 .wź8 .wż8 .w8 .wb8 .wc8 .wd8 .we3ć2 .we3ł2 .we3ś2 .we3ż2 .we3b2 .we3c2 .we3d2 .we3f2 .we3g2 .we3h2 .we3k2 .we3l2 .we3m2 .we3n2 .we3p2 .we3r2 .we3s2 .we3t2 .we3w2 .we3z2 .we4ł3n .we4k3t .we4l3w .we4n3d .we4n3t .we4r3b .we4r3d .we4r3n .we4r3s .we4r3t .we4s3prz .we4s3tch2 .we4z3br .we4z3gł .wech2 .wecz2 .wedź2 .wedż2 .wedz2 .wemk2 .wepch2 .werz2 .wesz2 .wetk2 .wewną2trz3 .wf8 .wg8 .wh8 .wielo3ś2 .wielo3d2 .wielo3k2 .wieluse2t3 .wilczo3m2 .wj8 .wk8 .wl8 .wm8 .wn8 .wniebo3w2 .wodo3w2 .wp8 .wr8 .ws8 .współi2 .współo2b3w .współu2 .współw2 .wspó2ł3 .wsze2ch3 .wszecho2 .wszechw2 .wt8 .wv8 .ww8 .wx8 .wy3ć2 .wy3ł2 .wy3ś2 .wy3ź2 .wy3ż2 .wy3b2 .wy3c2 .wy3d2 .wy3f2 .wy3g2 .wy3h2 .wy3k2 .wy3l2 .wy3m2 .wy3o2d3r .wy3p2 .wy3r2 .wy3s2 .wy3t2 .wy3w2 .wy3z2 .wy4ż3sz .wy4cz3ha .wybr2 .wybrz2 .wych2 .wycz2 .wydź2 .wydż2 .wydr2 .wydz2 .wye2k2s3 .wygrz2 .wyi2zo .wykl2 .wykr2 .wykrz2 .wymk2 .wypch2 .wyprz2 .wyrż2 .wyrz2 .wysch2 .wysm2 .wysz2 .wytch2 .wytk2 .wytr2 .wz8 .xć8 .xł8 .xń8 .xś8 .xź8 .xż8 .x8 .xb8 .xc8 .xd8 .xf8 .xg8 .xh8 .xj8 .xk8 .xl8 .xm8 .xn8 .xp8 .xr8 .xs8 .xt8 .xv8 .xw8 .xx8 .xz8 .zć8 .zł8 .zło3w2 .zń8 .zś8 .zź8 .zż8 .z8 .za3ć2 .za3ł2 .za3ś2 .za3ź2 .za3ż2 .za3b2 .za3c2 .za3d2 .za3f2 .za3g2 .za3h2 .za3k2 .za3l2 .za3m2 .za3o2b3r .za3o2b3s .za3p2 .za3r2 .za3s2 .za3t2 .za3u2 .za3w2 .za3z2 .za4k3t .za4l3g .za4l3k .za4l3t .za4m3k .za4r3ch .za4uto .za5m4k2n .zabr2 .zabrz2 .zach2 .zacz2 .zadź2 .zadż2 .zadośću4 .zado2ść3 .zadr2 .zady2s3po .zadz2 .zagrz2 .zai2n3 .zai2zo .zain4ic .zakl2 .zakr2 .zakrz2 .zanie3d2 .zarż2 .zarz2 .zasch2 .zasm2 .zasz2 .zatk2 .zatr2 .zb8 .zc8 .zd8 .zde2z3 .zde3z4awu .zde3z4el .zde3z4er .zde3z4y .zdy2s3kont .zdy2s3kred .zdy2s3kwal .ze3ć2 .ze3ł2 .ze3ś2 .ze3ź2 .ze3ż2 .ze3b2 .ze3c2 .ze3d2 .ze3f2 .ze3g2 .ze3h2 .ze3k2 .ze3l2 .ze3m2 .ze3p2 .ze3r2 .ze3s2 .ze3t2 .ze3tk2 .ze3w2 .ze3z2 .ze4r3k .ze4t3e2m1e2s .ze4t3e2s1e2l .ze4t3emp .ze4t3hap .zech2 .zecz2 .zedź2 .zedż2 .zedz2 .zekl2 .zepch2 .zerż2 .zerz2 .zesch2 .zesm4 .zesz2 .zf8 .zg8 .zh8 .zimno3kr2 .zj8 .zk8 .zl8 .zm8 .zmartwy2ch3 .zmartwychw2 .zn8 .znie3ć2 .znie3ł2 .znie3ń2 .znie3ś2 .znie3ź2 .znie3ż2 .znie3b2 .znie3c2 .znie3d2 .znie3f2 .znie3g2 .znie3h2 .znie3k2 .znie3l2 .znie3m2 .znie3n2 .znie3p2 .znie3r2 .znie3s2 .znie3t2 .znie3w2 .znie3z2 .znie4dź3 .znie4m3c .zniech2 .zniecz2 .zniedż2 .zniedz2 .znierz2 .zniesz2 .zo2o3 .zp8 .zr8 .zro2z3 .zro3z4u .zs8 .zt8 .zv8 .zw8 .zx8 .zz8 ą1 ę1 ó1 ó4w3cz ś1c ź2dź 1ś2ci 2ć1ń 2ć1ś 2ć1ź 2ć1ż 2ć1b 2ć1c 2ć1d 2ć1f 2ć1g 2ć1k 2ć1m 2ć1n 2ć1p 2ć1s 2ć1t 2ć1z 2ł1ć 2ł1ń 2ł1ś 2ł1ź 2ł1ż 2ł1b 2ł1c 2ł1d 2ł1f 2ł1g 2ł1h 2ł1j 2ł1k 2ł1l 2ł1m 2ł1n 2ł1p 2ł1r 2ł1s 2ł1t 2ł1w 2ł1z 2ń1ć 2ń1ł 2ń1ń 2ń1ś 2ń1ź 2ń1ż 2ń1b 2ń1c 2ń1d 2ń1f 2ń1g 2ń1h 2ń1j 2ń1k 2ń1l 2ń1m 2ń1n 2ń1p 2ń1r 2ń1s 2ń1t 2ń1w 2ń1z 2śćc 2ś1ś 2ś1ź 2ś1ż 2ś1b 2ś1d 2ś1f 2ś1g 2ś1k 2ś1p 2ś1s 2ś1t 2ś1z 2ślm 2śln 2ź1ć 2ź1ś 2ź1ż 2ź1b 2ź1c 2ź1d 2ź1f 2ź1g 2ź1k 2ź1l 2ź1m 2ź1n 2ź1p 2ź1s 2ź1t 2ź1w 2ź1z 2ż1ć 2ż1ł 2ż1ń 2ż1ś 2ż1ź 2ż1b 2ż1c 2ż1d 2ż1f 2ż1g 2ż1j 2ż1k 2ż1l 2ż1m 2ż1n 2ż1p 2ż1r 2ż1s 2ż1t 2ż1w 2ż1z 2błk 2b1ć 2b1ń 2b1ś 2b1ź 2b1ż 2b1c 2b1d 2b1f 2b1g 2b1k 2b1m 2b1n 2b1p 2b1s 2b1t 2b1z 2brn 2c1ć 2c1ń 2c1ś 2c1ź 2c1ż 2c1b 2c1d 2c1f 2c1g 2c1k 2c1l 2c1m 2c1n 2c1p 2c1s 2c1t 2ch1ć 2ch1ń 2ch1ś 2ch1ź 2ch1ż 2ch1b 2ch1c 2ch1d 2ch1f 2ch1g 2ch1k 2ch1m 2ch1n 2ch1p 2ch1s 2ch1t 2ch1z 2cz1ć 2cz1ń 2cz1ś 2cz1ź 2cz1ż 2cz1b 2cz1c 2cz1d 2cz1f 2cz1g 2cz1k 2cz1l 2cz1m 2cz1n 2cz1p 2cz1s 2cz1t 2cz1z 2dłb 2dłsz 2dź1ć 2dź1ń 2dź1ś 2dź1ź 2dź1ż 2dź1b 2dź1c 2dź1d 2dź1f 2dź1g 2dź1k 2dź1m 2dź1n 2dź1p 2dź1s 2dź1t 2dź1z 2dż1ć 2dż1ń 2dż1ś 2dż1ź 2dż1ż 2dż1b 2dż1c 2dż1d 2dż1f 2dż1g 2dż1k 2dż1m 2dż1n 2dż1p 2dż1s 2dż1t 2dż1z 2d1ć 2d1ń 2d1ś 2d1b 2d1c 2d1f 2d1g 2d1k 2d1m 2d1n 2d1p 2d1s 2d1t 2drn 2dz1ć 2dz1ń 2dz1ś 2dz1ź 2dz1ż 2dz1b 2dz1c 2dz1d 2dz1f 2dz1g 2dz1k 2dz1l 2dz1m 2dz1n 2dz1p 2dz1s 2dz1t 2dz1z 2f1c 2f1k 2f1m 2f1n 2głb 2g1ć 2g1ń 2g1ś 2g1ź 2g1ż 2g1b 2g1c 2g1d 2g1f 2g1k 2g1m 2g1p 2g1s 2g1t 2g1z 2h1ć 2h1ł 2h1ń 2h1ś 2h1ź 2h1ż 2h1b 2h1c 2h1d 2h1f 2h1g 2h1j 2h1k 2h1l 2h1m 2h1n 2h1p 2h1r 2h1s 2h1t 2h1w 2h1z 2j1ć 2j1ł 2j1ń 2j1ś 2j1ź 2j1ż 2j1b 2j1c 2j1d 2j1f 2j1g 2j1h 2j1k 2j1l 2j1m 2j1n 2j1p 2j1r 2j1s 2j1t 2j1w 2j1z 2kłb 2k1ć 2k1ń 2k1ś 2k1ź 2k1ż 2k1b 2k1c 2k1d 2k1f 2k1g 2k1m 2k1n 2k1p 2k1s 2k1sz 2k1t 2k1z 2l1ć 2l1ł 2l1ń 2l1ś 2l1ź 2l1ż 2l1b 2l1c 2l1d 2l1f 2l1g 2l1h 2l1j 2l1k 2l1m 2l1n 2l1p 2l1r 2l1s 2l1t 2l1w 2l1z 2m1ć 2m1ł 2m1ń 2m1ś 2m1ź 2m1ż 2m1b 2m1c 2m1d 2m1f 2m1g 2m1h 2m1j 2m1k 2m1l 2m1n 2m1p 2m1r 2m1s 2m1t 2m1w 2m1z 2n1ć 2n1ł 2n1ń 2n1ś 2n1ź 2n1ż 2n1b 2n1c 2n1d 2n1f 2n1g 2n1h 2n1j 2n1k 2n1l 2n1m 2n1p 2n1r 2n1s 2n1t 2n1w 2n1z 2ntn 2p1ć 2p1ń 2p1ś 2p1ź 2p1ż 2p1b 2p1c 2p1d 2p1f 2p1g 2p1k 2p1m 2p1n 2p1s 2p1sz 2p1t 2p1z 2pln 2r1ć 2r1ł 2r1ń 2r1ś 2r1ź 2r1ż 2r1b 2r1c 2r1d 2r1f 2r1g 2r1h 2r1j 2r1k 2r1l 2r1m 2r1n 2r1p 2r1s 2r1t 2r1w 2rz1ć 2rz1ł 2rz1ń 2rz1ś 2rz1ź 2rz1ż 2rz1b 2rz1c 2rz1d 2rz1f 2rz1g 2rz1h 2rz1j 2rz1k 2rz1l 2rz1m 2rz1n 2rz1p 2rz1r 2rz1s 2rz1t 2rz1w 2słb 2s1ź 2s1ż 2s1b 2s1d 2s1f 2s1g 2s1s 2snk 2stk 2stn 2stsz 2sz1ć 2sz1ś 2sz1c 2sz1f 2sz1k 2sz1l 2sz1m 2sz1n 2sz1p 2sz1s 2sz1t 2sz1w 2sz1z 2szln 2t1ć 2t1ń 2t1ś 2t1ź 2t1ż 2t1b 2t1c 2t1d 2t1f 2t1g 2t1k 2t1m 2t1n 2t1p 2t1s 2t1z 2tln 2trk 2trzn 2w1ć 2w1ł 2w1ń 2w1ś 2w1ź 2w1ż 2w1b 2w1c 2w1d 2w1f 2w1g 2w1j 2w1k 2w1l 2w1m 2w1n 2w1p 2w1r 2w1s 2w1t 2w1z 2z1ć 2z1ś 2z1c 2z1d 2z1f 2z1k 2z1p 2z1s 2z1t 2zdk 2zdn 3d2niow 3k2sz2t 3m2k2n 3m2nest 3m2nezj 3m2sk2n 3p2neu 3w2ład 3w2łos 3w2czas 4ć3ć 4ł3ł 4ź3ź 4ż3ż 4b3b 4c3c 4d3d 4f3f 4g3g 4h3h 4j3j 4k3k 4l3l 4m3m 4n3n 4p3p 4r3r 4t3t 4w3w 4z3z 8ć. 8ćć. 8ćł. 8ćń. 8ćś. 8ćź. 8ćż. 8ćb. 8ćc. 8ćd. 8ćf. 8ćg. 8ćh. 8ćj. 8ćk. 8ćl. 8ćm. 8ćn. 8ćp. 8ćr. 8ćs. 8ćt. 8ćv. 8ćw. 8ćx. 8ćz. 8ł. 8łć. 8łł. 8łń. 8łś. 8łź. 8łż. 8łb. 8łc. 8łd. 8łf. 8łg. 8łh. 8łj. 8łk. 8łl. 8łm. 8łn. 8łp. 8łr. 8łs. 8łt. 8łv. 8łw. 8łx. 8łz. 8ń. 8ńć. 8ńł. 8ńń. 8ńś. 8ńź. 8ńż. 8ńb. 8ńc. 8ńd. 8ńf. 8ńg. 8ńh. 8ńj. 8ńk. 8ńl. 8ńm. 8ńn. 8ńp. 8ńr. 8ńs. 8ńt. 8ńv. 8ńw. 8ńx. 8ńz. 8ś. 8ść. 8śł. 8śń. 8śś. 8śź. 8śż. 8śb. 8śc. 8śd. 8śf. 8śg. 8śh. 8śj. 8śk. 8śl. 8śm. 8śn. 8śp. 8śr. 8śs. 8śt. 8śv. 8św. 8śx. 8śz. 8ź. 8źć. 8źł. 8źń. 8źś. 8źź. 8źż. 8źb. 8źc. 8źd. 8źf. 8źg. 8źh. 8źj. 8źk. 8źl. 8źm. 8źn. 8źp. 8źr. 8źs. 8źt. 8źv. 8źw. 8źx. 8źz. 8ż. 8żć. 8żł. 8żń. 8żś. 8żź. 8żż. 8żb. 8żc. 8żd. 8żf. 8żg. 8żh. 8żj. 8żk. 8żl. 8żm. 8żn. 8żp. 8żr. 8żs. 8żt. 8żv. 8żw. 8żx. 8żz. 8b. 8bć. 8bł. 8bń. 8bś. 8bź. 8bż. 8bb. 8bc. 8bd. 8bf. 8bg. 8bh. 8bj. 8bk. 8bl. 8bm. 8bn. 8bp. 8br. 8brz. 8bs. 8bt. 8bv. 8bw. 8bx. 8bz. 8c. 8cć. 8cł. 8cń. 8cś. 8cź. 8cż. 8cb. 8cc. 8cd. 8cf. 8cg. 8ch. 8chł. 8chrz. 8chw. 8cj. 8ck. 8cl. 8cm. 8cn. 8cp. 8cr. 8cs. 8ct. 8cv. 8cw. 8cx. 8cz. 8czt. 8d. 8dć. 8dł. 8dń. 8dś. 8dź. 8dż. 8db. 8dc. 8dd. 8df. 8dg. 8dh. 8dj. 8dk. 8dl. 8dm. 8dn. 8dp. 8dr. 8drz. 8ds. 8dt. 8dv. 8dw. 8dx. 8dz. 8f. 8fć. 8fł. 8fń. 8fś. 8fź. 8fż. 8fb. 8fc. 8fd. 8ff. 8fg. 8fh. 8fj. 8fk. 8fl. 8fm. 8fn. 8fp. 8fr. 8fs. 8ft. 8fv. 8fw. 8fx. 8fz. 8g. 8gć. 8gł. 8gń. 8gś. 8gź. 8gż. 8gb. 8gc. 8gd. 8gf. 8gg. 8gh. 8gj. 8gk. 8gl. 8gm. 8gn. 8gp. 8gr. 8gs. 8gt. 8gv. 8gw. 8gx. 8gz. 8h. 8hć. 8hł. 8hń. 8hś. 8hź. 8hż. 8hb. 8hc. 8hd. 8hf. 8hg. 8hh. 8hj. 8hk. 8hl. 8hm. 8hn. 8hp. 8hr. 8hs. 8ht. 8hv. 8hw. 8hx. 8hz. 8j. 8jć. 8jł. 8jń. 8jś. 8jź. 8jż. 8jb. 8jc. 8jd. 8jf. 8jg. 8jh. 8jj. 8jk. 8jl. 8jm. 8jn. 8jp. 8jr. 8js. 8jt. 8jv. 8jw. 8jx. 8jz. 8k. 8kć. 8kł. 8kń. 8kś. 8kź. 8kż. 8kb. 8kc. 8kd. 8kf. 8kg. 8kh. 8kj. 8kk. 8kl. 8km. 8kn. 8kp. 8kr. 8ks. 8kst. 8kt. 8kv. 8kw. 8kx. 8kz. 8l. 8lć. 8lł. 8lń. 8lś. 8lź. 8lż. 8lb. 8lc. 8ld. 8lf. 8lg. 8lh. 8lj. 8lk. 8ll. 8lm. 8ln. 8lp. 8lr. 8ls. 8lt. 8lv. 8lw. 8lx. 8lz. 8m. 8mć. 8mł. 8mń. 8mś. 8mź. 8mż. 8mb. 8mc. 8md. 8mf. 8mg. 8mh. 8mj. 8mk. 8ml. 8mm. 8mn. 8mp. 8mr. 8ms. 8mst. 8mt. 8mv. 8mw. 8mx. 8mz. 8n. 8nć. 8nł. 8nń. 8nś. 8nź. 8nż. 8nb. 8nc. 8nd. 8nf. 8ng. 8nh. 8nj. 8nk. 8nl. 8nm. 8nn. 8np. 8nr. 8ns. 8nt. 8nv. 8nw. 8nx. 8nz. 8p. 8pć. 8pł. 8pń. 8pś. 8pź. 8pż. 8pb. 8pc. 8pd. 8pf. 8pg. 8ph. 8pj. 8pk. 8pl. 8pm. 8pn. 8pp. 8pr. 8prz. 8ps. 8pt. 8pv. 8pw. 8px. 8pz. 8r. 8rć. 8rł. 8rń. 8rś. 8rź. 8rż. 8rb. 8rc. 8rd. 8rf. 8rg. 8rh. 8rj. 8rk. 8rl. 8rm. 8rn. 8rp. 8rr. 8rs. 8rsz. 8rt. 8rv. 8rw. 8rx. 8rz. 8rzł. 8s. 8sć. 8sł. 8sń. 8sś. 8sź. 8sż. 8sb. 8sc. 8sch. 8sd. 8sf. 8sg. 8sh. 8sj. 8sk. 8skrz. 8sl. 8sm. 8sn. 8sp. 8sr. 8ss. 8st. 8str. 8strz. 8stw. 8sv. 8sw. 8sx. 8sz. 8szcz. 8szczb. 8szk. 8szn. 8szt. 8sztr. 8t. 8tć. 8tł. 8tń. 8tś. 8tź. 8tż. 8tb. 8tc. 8td. 8tf. 8tg. 8th. 8tj. 8tk. 8tl. 8tm. 8tn. 8tp. 8tr. 8trz. 8ts. 8tt. 8tv. 8tw. 8tx. 8tz. 8v. 8vć. 8vł. 8vń. 8vś. 8vź. 8vż. 8vb. 8vc. 8vd. 8vf. 8vg. 8vh. 8vj. 8vk. 8vl. 8vm. 8vn. 8vp. 8vr. 8vs. 8vt. 8vv. 8vw. 8vx. 8vz. 8w. 8wć. 8wł. 8wń. 8wś. 8wź. 8wż. 8wb. 8wc. 8wd. 8wf. 8wg. 8wh. 8wj. 8wk. 8wl. 8wm. 8wn. 8wp. 8wr. 8ws. 8wt. 8wv. 8ww. 8wx. 8wz. 8x. 8xć. 8xł. 8xń. 8xś. 8xź. 8xż. 8xb. 8xc. 8xd. 8xf. 8xg. 8xh. 8xj. 8xk. 8xl. 8xm. 8xn. 8xp. 8xr. 8xs. 8xt. 8xv. 8xw. 8xx. 8xz. 8z. 8zć. 8zł. 8zń. 8zś. 8zź. 8zż. 8zb. 8zc. 8zd. 8zdr. 8zdrz. 8zf. 8zg. 8zh. 8zj. 8zk. 8zl. 8zm. 8zn. 8zp. 8zr. 8zs. 8zt. 8zv. 8zw. 8zx. 8zz. a1 a2u a2y aa2 ae2 ai2 ao2 be2eth be2f3sz2 be2k1hend bi2n3o2ku bi2sz3kop bi2z3ne2s3m bi2z3nes birmin2g1ham blo2k1hauz bo2s3ma br2d bro2a2d3way bu2sz3me buk2sz3pan busine2ss3m busines2s c4h c4z cal2d1well ch2ł ch2j ch2l ch2r ch2w chus1t cu2r7zon dż2ł dż2j dż2l dż2r dż2w dże4z3b dże4z3m d4ź d4ż d4z deut4sch3land drz2w du2sz3past e1 e2r5zac e2u e2y e3u2sz ea2 ee2 ei2 eo2 fi2s3harm fi2sz3bin fo2k2s3t fo2r5zac fol2k1lor fos2f1a2zot ga3d2get gado3p2ta gol2f3s golfsz2 gran2d1ilo gro4t3r hi2sz3p hu2cz1w hu2x3ley i1 i2ą i2ę i2ó i2a i2e i2i i2o i2u i2y in4nsbruck in4sbruc j2t1ł j2t1r ja4z4z3b ja4z4z3m karl2s1kron karl2s1ruhe kir2chhoff kongre2s3m led1w lu2ft3waffe lu2ks1fer ly2o ma2r5zł ma2r5zl ma2r5zn mi2sz1masz mie2r5zł mie2r5zi mon2t3real moza2i3k mu2r7zasich3l na4ł3kows na4r3v o1 o2y oa2 och3mistrz oe2 of2f3set oi2 oo2 ou2 pa2n3a2mer pa2s3cal pa2s3ch połu3d2ni po3d4nieprz po3m2ną po3m2nę po3m2ni po4rt2s3mo2uth po4rt3land poli3e2t poli3u2re powsze3d2ni pr2chal pre2sz3pa r4z ro2e3nt2gen ro2k3rocz ro2s3to3c2k s4z se2t3le sko2r5zoner sm2r sowi3z2 sy2n3opt sy2s1tem sza2sz1ły sze2z1long sze4ść szto2k1holm szyn2k1was to3y2o3t turboo2d3rzut tygo3d2ni u1 u2y ua2 ue2 ui2 uo2 uu2 vo2lk2s3 we2e2k1end we4st3f we4st3m y1 ya2 ye2 yi2 yo2 yu2 ze4p3p",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=4053,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-pl.rme b/Master/texmf-dist/tex/context/patterns/lang-pl.rme
index 35641d3a4c0..ec2a97b5520 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-pl.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-pl.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Polish Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -86,3 +90,4 @@
% The LeX format mentioned above was the first version of the adaptation
% of TeX to the Polish language. The next version is called MeX.
+
diff --git a/Master/texmf-dist/tex/context/patterns/lang-pt.lua b/Master/texmf-dist/tex/context/patterns/lang-pt.lua
new file mode 100644
index 00000000000..76a06563885
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-pt.lua
@@ -0,0 +1,109 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["characters"]="adefhorstw",
+ ["data"]="hard-ware soft-ware",
+ ["n"]=2,
+ },
+ ["metadata"]={
+ ["mnemonic"]="pt",
+ ["source"]="hyph-pt",
+ ["texcomment"]="% Portuguese Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: pthyph.tex (1994-10-13 - date on CTAN) or (1996-07-21 - date in file) - no idea\
+% Author: Pedro J. de Rezende <rezende at dcc.unicamp.br>, J.Joao Dias Almeida <jj at di.uminho.pt>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+% The Portuguese TeX hyphenation table.\
+% (C) 1996 by Pedro J. de Rezende (rezende@dcc.unicamp.br)\
+% and J.Joao Dias Almeida (jj@di.uminho.pt)\
+% Version: 1.2 Release date: 21/07/96\
+%\
+% (C) 1994 by Pedro J. de Rezende (rezende@dcc.unicamp.br)\
+% Version: 1.1 Release date: 04/12/94\
+%\
+% (C) 1987 by Pedro J. de Rezende\
+% Version: 1.0 Release date: 02/13/87\
+%\
+% -----------------------------------------------------------------\
+% IMPORTANT NOTICE:\
+%\
+% This program can be redistributed and/or modified under the terms\
+% of the LaTeX Project Public License Distributed from CTAN\
+% archives in directory macros/latex/base/lppl.txt; either\
+% version 1 of the License, or any later version.\
+% -----------------------------------------------------------------\
+% Remember! If you *must* change it, then call the resulting file \
+% something else and attach your name to your *documented* changes.\
+% ======================================================================\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="-abcdefghijklmnopqrstuvwxzáâãçéêíóôõú",
+ ["data"]="1b2l 1b2r 1ba 1be 1bi 1bo 1bu 1bá 1bâ 1bã 1bé 1bí 1bó 1bú 1bê 1bõ 1c2h 1c2l 1c2r 1ca 1ce 1ci 1co 1cu 1cá 1câ 1cã 1cé 1cí 1có 1cú 1cê 1cõ 1ça 1çe 1çi 1ço 1çu 1çá 1çâ 1çã 1çé 1çí 1çó 1çú 1çê 1çõ 1d2l 1d2r 1da 1de 1di 1do 1du 1dá 1dâ 1dã 1dé 1dí 1dó 1dú 1dê 1dõ 1f2l 1f2r 1fa 1fe 1fi 1fo 1fu 1fá 1fâ 1fã 1fé 1fí 1fó 1fú 1fê 1fõ 1g2l 1g2r 1ga 1ge 1gi 1go 1gu 1gu4a 1gu4e 1gu4i 1gu4o 1gá 1gâ 1gã 1gé 1gí 1gó 1gú 1gê 1gõ 1ja 1je 1ji 1jo 1ju 1já 1jâ 1jã 1jé 1jí 1jó 1jú 1jê 1jõ 1k2l 1k2r 1ka 1ke 1ki 1ko 1ku 1ká 1kâ 1kã 1ké 1kí 1kó 1kú 1kê 1kõ 1l2h 1la 1le 1li 1lo 1lu 1lá 1lâ 1lã 1lé 1lí 1ló 1lú 1lê 1lõ 1ma 1me 1mi 1mo 1mu 1má 1mâ 1mã 1mé 1mí 1mó 1mú 1mê 1mõ 1n2h 1na 1ne 1ni 1no 1nu 1ná 1nâ 1nã 1né 1ní 1nó 1nú 1nê 1nõ 1p2l 1p2r 1pa 1pe 1pi 1po 1pu 1pá 1pâ 1pã 1pé 1pí 1pó 1pú 1pê 1põ 1qu4a 1qu4e 1qu4i 1qu4o 1ra 1re 1ri 1ro 1ru 1rá 1râ 1rã 1ré 1rí 1ró 1rú 1rê 1rõ 1sa 1se 1si 1so 1su 1sá 1sâ 1sã 1sé 1sí 1só 1sú 1sê 1sõ 1t2l 1t2r 1ta 1te 1ti 1to 1tu 1tá 1tâ 1tã 1té 1tí 1tó 1tú 1tê 1tõ 1v2l 1v2r 1va 1ve 1vi 1vo 1vu 1vá 1vâ 1vã 1vé 1ví 1vó 1vú 1vê 1võ 1w2l 1w2r 1xa 1xe 1xi 1xo 1xu 1xá 1xâ 1xã 1xé 1xí 1xó 1xú 1xê 1xõ 1za 1ze 1zi 1zo 1zu 1zá 1zâ 1zã 1zé 1zí 1zó 1zú 1zê 1zõ a3a a3e a3o c3c e3a e3e e3o i3a i3e i3i i3o i3â i3ê i3ô o3a o3e o3o r3r s3s u3a u3e u3o u3u 1-",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=307,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-pt.pat b/Master/texmf-dist/tex/context/patterns/lang-pt.pat
index dbf61783003..83cef8055ec 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-pt.pat
+++ b/Master/texmf-dist/tex/context/patterns/lang-pt.pat
@@ -2,7 +2,7 @@
% for comment and copyright, see e:/tmp/patterns/lang-pt.rme
-% used: a b c d e f g h i j k l m n o p q r s t u v w x z á â ã ç é ê í ó ô õ ú
+% used: - a b c d e f g h i j k l m n o p q r s t u v w x z á â ã ç é ê í ó ô õ ú
\patterns{
1b2l
@@ -310,4 +310,5 @@ s3s
u3a
u3e
u3o
-u3u} \ No newline at end of file
+u3u
+1-} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-pt.rme b/Master/texmf-dist/tex/context/patterns/lang-pt.rme
index ed3602f0429..c7c00321130 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-pt.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-pt.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Portuguese Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -83,4 +87,4 @@
% Remember! If you *must* change it, then call the resulting file
% something else and attach your name to your *documented* changes.
% ======================================================================
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-ro.lua b/Master/texmf-dist/tex/context/patterns/lang-ro.lua
new file mode 100644
index 00000000000..73310b84b47
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-ro.lua
@@ -0,0 +1,131 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="ro",
+ ["source"]="hyph-ro",
+ ["texcomment"]="% Romanian Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: rohyphen.tex (1996-11-11)\
+% Author: drian Rezus <adriaan at {sci,cs}.kun.nl>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+%% ROHYPHEN.TEX, version 1.1 <29.10.1996> R [7.11.1996] %%\
+%% (C) 1995-1996 Adrian Rezus [adriaan@{sci,cs}.kun.nl] %%\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+%%\
+%% Romanian TeX hyphenation table: NFSS 2 encoding, medium.\
+%% Contents: 647 Romanian hyphen patterns, with diacritics.\
+%%\
+%% This file is part of the Romanian TeX system.\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+%% Romanian TeX, version 1.3R <29.10.1996> %%\
+%% (C) 1994-1996 Adrian Rezus %%\
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\
+%% History:\
+%% ROHYPHEN.TEX 1.0 <10.02.1995>: Plain TeX and LaTeX 2.09.\
+%% ROHYPHEN.TEX 1.1 <29.10.1996>: Plain TeX and LaTeX2e.\
+%\
+% -------------------------------------------------------------------\
+% \
+% TODO: fix the notice below - it only holds for the old patterns\
+% \
+% \9NB This file must be used in conjunction with either one of\
+%\
+%\9(1)\9ROMANIAN.TEX v1.2(R) [1994-1995] [(La)TeX] or\
+%\9(2)\9ROMANIAN.STY v1.3R [1996] [(La)TeX(2e)]\
+%\
+%\9NB Romanian has LR-HYPHEN-MINs [2 2] (like German)!\
+%\9NB Romanian has STRUCTURAL HYPHEN-AMBIGUA:\
+%\9 i.e., words that canNOT be hyphenated correctly without \
+%\9 additional (e.g., semantic, stress-mark) information.\
+%\9--------------------------------------------------------\
+%\9The Romanian TeX encoding of the Romanian diacritics:\
+%\9--------------------------------------------------------\
+%\9Romanian TeX \9DQ-macro encodings\9= (La)TeX macros\
+%\9--------------------------------------------------------\
+%\9ă = \\u{a}\9\9\9[-] \\u{A} [not encoded]\
+%\9â = \\^{a}\9\9\9[-] \\^{A} [not encoded]\
+%\9î = \\^{\\i}\9\9\9\"I = \\^{I}\
+%\9ș = \\c{s}\9\9\9\"S = \\c{S}\
+%\9ț = \\c{t}\9\9\9\"T = \\c{T}\
+%\9-------------------------------------------------------------\
+%\9NB Romanian \\^{a} behaves like \\^{\\i} as regards hyphenation.\
+%\9NB The capital \\u{A} and \\^{A} are rare in script; as such,\
+%\9 they occur only in records of the Romanian substandard. \
+% -------------------------------------------------------------------\
+%\
+% original patterns generated by PatGen2-output hyphen-level 9: do NOT modify the list by hand!\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnoprstuvxzîășț",
+ ["data"]=".a3ic .a4n3is .a2z .cre1 .de2aj .de2z1 .g4 .i2a .i2e .i3ț .i4u3 .i3v .î4m .n2 .ni2 .p4 .pre3ș .s4 .ș4 .u4i .u5ni .z2 a1 2acă achi5 a3e afo3 a3i2a a3i2e a3il ai3s2 a3iu alie6 2alt a2m a2n 2an. a5n2e ani2e ani3ș4 an4s 2anu an2z ao2g ati4a 2atr a5t4u 2ața 2ață 2au a3ua a3ud a3ug a3ul a3un a3ur a3us a3ute a3u2ț a3uz 2ă1 ă3i ăi2e ă2m2 ănu3 ărgi5 ă3ș ă4ș3t ă2ti. ăti4e ă3u ă3v ă2zi 1b 2b. ba2ț bănu5 2bc 2bd bi2a. bi2at bi2e 3bii b2l 3b4lim b4lu bo1 bo3ric 2bs 2bt 2bț bți4ne. bu3 1c 4c. ca3ut că2c cătu5 2cc ce2a ce2ț 2chi. 2ci. ci3ale ci2o cis2 ci3sp ciza2 c4l 2cm 2c5n copia2tă co2ț 2cs 2ct 2cț cu3im 3cul cu2ț 2cv 1d 4d. da4m da2ț 2dc de4sc dez3in di2an dia2tă 2dj 2dm 2d1n do4il 3du e1ac e1aj e1al e1aș e1at ea2ț e1av ebu5i 2ec eci2a ecla2re edi4ulu e3e ee2a 1efa e1h e3i2a e3i2e e3ii e3il e3im e3in e3i2o e3i3s2 e3it e3i4u e1î 2el e2m emon5 2en e5ne e1o1 e3on e1r 2era 2eră 2erc 2e2s es3co es5ti 2eș e3și etan4ț 2eț e3u eu5ș 1evit e2x 2ez eză5 ezi3a e2z1o 1f4 2f. 3fa 3făș 2fi. fi3e 3fo 2ft f5tu 1g2 2g. gă3ț 2ghi. 2gi. g4l 2g3m 2g3n go5n 3gu3 2g3v 2h. 2hi. hi2a hi3c hi4u 2h1n 2i1 4i. 3i2ac ia3g4 i2ai i2aș ia2ț i3că i2ed i3ia i3ie i3ii i3il i3in i3ir i3it iitu2ră i2î 4ila i3le i3lo imateri6 i2n i4n1ed in2gă inți4i 3inv i3od i3oni io2ț ipă5 i2s is3f 4isp iș3t i5ti iți2a i3ți2o i3ua i3ul i3um i3und i3unu i3us i3ut iz3v î2 î3d î3e î3lo îna3 în5ș î3ri î3rî îr5ș îș3t î3t î4ti î3ț î4ți î5ții î3z 1j 2j. 2jd 2ji. ji2ț 2jl j4u ju3t 1k 1l 4l. larați2 lă2ti lătu5 2lb 2lc 2ld le2a 2lf 2lg 4li. li3a li3e li3o 2lm 2l5n 2lp 2ls 2l3ș 2lt 2lț 3lu 2lv 1m 2m. 3ma 3mă 2mb mblîn3 3me me2z 2mf 3mi 4mi. mi2ț 3mî 2m1n 3mo mon4 2mp 2m3s2 2mt 2mț 3mu mu2ț 2mv 4n. 3na 4n1ad na3in 3nă 2nc n2cis n2ciz 2nd 3ne ne1ab ne1an ne1ap 4nef 4n1eg ne3s2 4nevi 4n1ex 2ng ng3ăt 3ni 4ni. ni3ez 3nî n3j n1n 3no no4ș n1r 2n3s2 ns3f n4sî ns3po n3ș2 n4și 2nt n5ti n5t4u 2nț 5nu nu3a nu3ă nu5m nu3s2 2nz o1ag o2al o2bi. 2oca ocu5i 2od odi2a o3e o3i2 oiecti2 oi3s2p omedi2e. om4n 2on o1o opi3e opla2 oplagi2 o1ra o1ră or2c o1re o1ri o2ric o1rî o1ro or2te. o1ru os5ti o3și otați4 o5ti ot3od o3u 1p2 2p. 3pa păr3ț 2p3c pecți2 pe2ț 2pi. pi2e pi3e. pi3ez pi3o pi2ț pi2z p4l po4ș po2ț 2p3s 2p3ș 2p3t 2p3ț p4ți. pu3b4 puri2e pu4ș 4r. 2rb 2rc 2rd r2e re2bi recizi2 re3s2cr re4și 2rf 2rg 2r1h 4ri. ri3a ri4ali ri3eț ri3ez ri5mi 2ri3un ri3v 2rk 2rl 2rm 2r1n rna2ț rografi6 2rp 2r1r 2rs2 r3sp r3st 2r3ș 2rt rtua2le 2rț ru3il ru3sp 2rv 2rz 1s 4s. 5sa 5să să4m să4ș 2sc 4sc. 3s2co 3se se2a se4e. ses2 se3sp se4ș 4s2f 5sfî 3si si3p 3sî 3s4l 4sm s1n 3so so3ric 2sp 2st sto3 5su su2ț 2ș 4ș. 3șa șa2ț 3șă2 3șe 1și 4și. 5șii 5șil 3șin 3șî 4ș5n șnu5 3șo ș2p ș2ti 4ști. 4ș3tr 3șu 1t2 4t. ta3ut 2t3c 2t3d te2a te5ni teri6ală te3s2p 2t3f 4ti. ti3a ti3e 3tii. 3til 3tin ti2ț 2tî. t4l 2t3m 3tol 3tor to2to 3tru. 3trul 3truo 4t3s2 2t3t tu3a tu3im 4t3un tu4ș 4t3z 1ț 2ț. 3ța 3ță țe2ț 2ți. 3ția ți3a. 3ție 3ții 3țil ți2ț 3țiu țu3 țu5i 2u1 6u. u2a. u2ad u3au uă3 uăs2 u2bia u2b3l u2b1o ub3s2 u3e 4ugu u3i2a u3i2e u3in u3ir u3is u3it u3i2ț u3iz u2l u3la u3lă u3le u3lii u3lî u3lo umi5r ur2z u2s us2pr u4st u3ș u4șt u2to 3utor u3ui u3um 1v 2v. ve5ni ve2ț ve2z 2vi. vi2ț 2v1n vorbito2 3vr 1x 2x. 3xa 3xă 3xe xe2z 3xi 3xo 3xu 1z 2z. za2ț 2zb 2z2g 2zi. zi2an zi2ar 3zii 3zil z4m 2z1n 3z2ol 3zon zu2ț 2z2v z3vă",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=647,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-ro.rme b/Master/texmf-dist/tex/context/patterns/lang-ro.rme
index 57723923623..65db0888ac2 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-ro.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-ro.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Romanian Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -107,4 +111,4 @@
% -------------------------------------------------------------------
%
% original patterns generated by PatGen2-output hyphen-level 9: do NOT modify the list by hand!
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-ru.lua b/Master/texmf-dist/tex/context/patterns/lang-ru.lua
new file mode 100644
index 00000000000..6f2e84f52e3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-ru.lua
@@ -0,0 +1,100 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["characters"]="абвгдежзийклмнопрстуфхцчшщыьэюя",
+ ["data"]="ас-бест бездн биз-нес-мен буй-нак-ске вбли-зи взба-ла-муть-ся вздрем-нешь во-до-сли-вом волж-ске воп-лем вопль вост-ра во-ткать во-ткем во-ткешь во-тку во-ткут впол-обо-ро-та впол-уха все-во-лож-ске вцспс га-рем-но-го го-ло-дра-нец грэс дву-зу-бец днепр добре-ем до-бре-ем-ся добре-ет добре-е-те до-бре-е-тесь до-бре-ет-ся добре-ешь до-бре-ешь-ся добрею до-бре-юсь добре-ют до-бре-ют-ся до-бре-сти до-бро-дят до-брось до-брось-те до-бро-сят до-бро-шу домну доп-пель драх-му дрейф-лю дрейфь-те еди-но-жды зав-сек-то-ром за-мру за-члись из-древ-ле изо-тру ин-ког-ни-то искр ка-за-шек казнь кольд-кре-мом корн-па-пир ксендз лик-бе-зом ло-шадь-ми людь-ми лю-э-сом ма-зу-те ме-ти-лам ме-ти-ла-ми мно-га-жды морщь-те на-бе-крень навз-ничь на-вскид-ку на-встре-чу нагл на-изусть на-ис-ко-сок наи-ме-нее на-ис-кось на-обо-рот на-от-рез на-супь-ся на-угад на-уголь-ник не-ост-ра нес-лась нес-лись нет-то не-уду обидь-ся обо-шлось об-ра-сти од-на-жды ослаб-ла ото-мстят ото-мщу ото-тру отру отрусь паб-ли-си-ти па-на-ме па-на-мец па-ра-так-сис пе-ре-вру пе-ре-ме-жать пе-ре-ме-жать-ся пе-ре-шла пис-чая по-все-дне-вен по-гре-мок по-до-тру по-ис-ти-не по-лу-то-ра-ста по-лу-явью по-млад-ше помни по-мнись помни-те по-мни-тесь по-мно-гу по-мру пол-вто-ро-го пол-шка-фа по-на-доб-люсь по-трафь-те преж-де прид-ти при-шла при-шлось про-тру про-хлад-ца пско-ва пыл-че раз-орем-ся раз-оре-тесь раз-орет-ся раз-орешь-ся разо-тру ра-зу-мом резв-люсь рсфср сан-узел сдрейф-лю се-го-дня сме-жат со-блю-сти со-лжешь сост-рим сост-ришь сост-рю сост-рят со-ткать со-ткем со-ткешь сотку со-ткут срос-лась срос-лись стрем-глав так-же тве-ре-зо-го те-ле-ате-лье тер-но-сли-вом троп-лю тьфу узу-фрукт умнем умнет умнете умну умру услышь-те ушла фо-то-пле-нок ца-ре-дво-рец че-рес-чур чер-но-сли-вом чресл чуж-дость шесть-де-сят юсом ядо-зу-бе ярем-но-го",
+ ["n"]=184,
+ },
+ ["metadata"]={
+ ["mnemonic"]="ru",
+ ["source"]="hyph-ru",
+ ["texcomment"]="% Russian Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: TODO:WRITEME (2003-03-10)\
+% Author: Alexander I. Lebedev <swan at scon155.phys.msu.su>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% Russian hyphenation patterns, version 2003/03/10\
+% Copyright 1999-2003 Alexander I. Lebedev <swan@scon155.phys.msu.su>\
+%\
+% This program may be distributed and/or modified under the conditions\
+% of the LaTeX Project Public License, either version 1.2 or any later\
+% version.\
+%\
+% Patterns were generated with patgen from a 990,000-word list and then\
+% manually corrected.\
+%\
+% The program consists of the files ruhyphal.tex, cyryoal.tex and two\
+% document files README.ruhyphal and hyphen.rules. The file cyryoal.tex\
+% can be regenerated using mkcyryo script (a part of ruhyphen package)\
+% and the latest release of rus-ispell dictionaries\
+% <ftp://scon155.phys.msu.su/pub/russian/ispell/>.\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="-абвгдежзийклмнопрстуфхцчшщъыьэюяё",
+ ["data"]=".аб1р .аг1ро .ади2 .аи2 .ак1р .аль3я .ар2т1о2 .ас1то .аст1р .ау2 .би2о .во2б3л .во3ж2д .го2ф .дек2 .де1кв .ди2ак .ди1о .до3п .до3т2 .епи3 .зав2р .за3м2н .за3п .иг1р .изг2 .из3н .ии2 .ик1р .ио2 .ио4на .ис3 .ле2о .ле2п3р .лес1к .ль2 .люст1 .ме2ж1у2 .ми1ом .мо2к1 .му2шт1 .на1в .на3т .на3ш2 .не3вн .не1др .не1з2 .не1сл .не1с2ц .не3т .нос1к .нук1л .обо3ж2 .ово1 .ог3н .оз4 .ос2ка .ос2п .ос3пи .от1в .от1ро .от1ру .от1уж .по3в2 .по3ж2 .поз2н .прос2 .ра2с3т .ре2бр .ре2з3в .ри2ск .ри2ч .ро2з3в .ро2с3л .ро2х .септ2 .ск2 .ст2 .су2ж .те2о3 .тиа3 .ти2г .тиг1р .ти2о .уб2 .уд2 .уе2 .уз2на .ук2 .ум2ч .уо3 .уп2 .ур2в .ус2 .ут2р .ую2 .хо2р3в .че2с1к .юс1 4а3а аа2п аа2р аа2ц а1б абе3ст а3бла аб2лю аб1ри а3бу ав1в а1ве ав3зо а1ви ави2а а1во аво1с а2вот ав1ра ав2се а2вт а1ву а2вх а3в2че 2ага ага1с2 а2гд а2гити а2гле аг2ли а2глос аг2лот 2аго а3гу а1д 2адв а2две ад2жи ади2од а2дл а2д1обл ад1ро а2д1ру аду3ч ад2ц а2дын а1е ае2го ае2ди ае2л а2еп ае2ре ае2с аза4ш3 азв2 аз3вез аз1вл азг2 аз1др аз1об аз2о1бр а2зовь а2золь а1зори аз2о1с аз1р а1и аи2г1 аи3гл а2их а1к ак1в 1акк ак2л ак3лем ако1б2 2аконс ако3т 2акри ак1с а1ла а3лаг а1ле 2алек а3ли ало1з а1лу алу2ш алуш1т а1лы а2льщ а1лю 2ама амб4 2амет а2минт ам2нет 2амо амо1з2 амои2 а2мч ана2дц а2н1а2ме а2наф ан2дра а2н1о2б ан1о2хр ан1р ан2сп анс1у ан2сур а2н1уз а1нь 2а1о ао2д ао2к ао2р ао2с аост1 а3пла ап2лом 2апо апо4вс апо3ч2т ап2ра ап1рел а1ра ара2ст ар2бок ар2вал 1аргу а1ре аре1дв аре1ол ар2жа а1ри а1ро ар2тор ар2т1р а1ру ар1х а1ры а1рю а1ря 2ас1к ас3ми ас3но 1ассиг аст1ву ас3тем ас2тин ас2тия ас1тоо ас1тух а1стье ас2шед ас2шес а1сьи а1та 1атак ат3ва ат1ви ат1ву 2атез а1ти а1то ат1обе а2томн ато2ш ат1рах ат1ри а1ту ат2х а1ты а1тье а3тью а3тья а1тю а1тя а1у а2уб ау2д ау3до а2уле аут1р ау2х ау2ч ау3чь ауэ1 а2ф1л ах2а ахми2 ах3с а1ч 2ача а2чл ач1т а2шл аэ2ли а2эр аю1та а1я ая2б ая2в ая2з 1ба ба2бв ба2г1р ба2др ба1з ба3зу балю1 ба2о бас3м ба1ст ба1тр 2б1б б1в бвы2 бг2 2б1д 1бе 3бев бе2гл бе2гн бе2д1р 3бее 3бе2з без1а2 без5д4 бе3зи без3н без1о2 без1р бе2с1к бес3п бе2с1т бес3те бес3ти 3бец 2бещ 2бж б1з2 1б2и 3биа би2б 2биж 3бик били3т2 3био би2об би2од би2он би2ор би2тв би1х 2б3к б1л 1благ 1б2лаз б3лази б2лан 1б2лее б3лен б2лес1к 1б2лея б2луд 1б2луж 2блы 2б2ль 2б3лю. б2люд б2люе б2люл 2б3люсь 2бля 2б3н 1бо бо1бра бо3вш бо2гд бо1дра бо1з2 бо1л2ж бо1льс бо3м2л бо2мч бо3мш бону1 бо1ру бо2са бо1ск бо3ско бо3сти 3бот бо2тв бот2р боя2р 2бр. б3раб б2рав бра1зо 1б2рал 2б1рам б2ран 1брас б2рать б1рах 1б2рач 2б3рая 1б2ред б1рей б1рек б2рем б2рех б2рид б2рито б2риты 1б2роди б1рол б1ром. 1б2роси бро2с1к 2брс б1ру 3брукс 2брь 1б2рю 2б3рю. б1ря 2б1с2 б3ск бс4л б1т 1б2у бу2г1р бук1л бу1с 2бф 2б1х 2бц 2б1ч 2бш 2бщ 1бы бы2г1 бы2с быс1к быст1 1бь 2бь. 2бьс 2бьт бэ1р 3б2ю бю1та 1бя 1ва ва2бр 3ваг ва2д1р вадь2 ва3ж2д ва1з ванс2 ва1ст ва2стр ва1тр вах1 3вац 3вая 2в1б в1ви в1вр 2вг2 в1д в2дох 1вев 3вег вед1р ве3ду 1вее 1вез 3везе 3везл вез2у 1вей. ве2п1 2верд 1вес ве2с1к ве2ст1в вет3р 1вец 1вею 1вея 1в2з2 взг2 взд2 взо1б взъ2 взъе3д ви2аз ви2ак ви2ар ви2а1с2 виа1т ви3аф ви2гв ви2гл 1виз 1винт 1винч ви1о ви1с2ни виу3 ви2ф 2в1к вк2л 3в2кус в1л в2ла 2в3лаб в2лев в2лек в2лет в2леч 2вли в2лия 2влю в2люб 2вля 2вм 1вме 2в1н 4в3на в2нес вно1 в3ну. 3в2нук 3в2нуч в3ны во1б2 во2б3ла вов2 во3вк 1вод во1дв во1др во2ер во2жж вои2с1 1вок во3м2 воп2 во1ру 2ворц 2ворь вос1к во1см во1сн вос3пе во2стр вот2р 1вох во1хл во3х2т 1вою 2вп2 2вр. 2вра. в2рав 2в1рам в1рас 2в1рах 2врац 2вре. 2в1рен 1врид 1в2риз в1рии в1рик в1рил в1рис в1рит 2в1ро вро3т2 2в1ры 1врю в1ря 2в1с2 3все3 в3ская 4в3ски 4в3ску 3в2сп 3в2сю в1т2 вто1б2 вто3ш 1вуа ву3г 1ву1з 2вуи 2ву1к ву3п ву1с2 ву2х1а вух3в ву1чл вф2 1вхо 2вц 2в1ч 2вш 3в2шив 2вщ въ2 1вы вы3г2 вы3зн вып2 вы3т2 вых2 вы3ш2л 2вь. 1вье 1вьин 2вьс 2вьт 1вью 1вья 1в2э1 1в2ю 1вя 1г г2а га1з га1ст2 га2у 2г3б гба2 г1ви 2гг г3дан 2г3ди 3ге. ге2б1 гено1 ге2об ге2од ге1ор 2г3ж 2г1з г2и ги2бл ги3бр ги2гр ги1сл гист2 2г1к 2гла. г2лав г1лай г1лами 2глась 2глая г1ле г2лет 2гли. г2лин 3г2лиф 2гло. г3лобл 2глов 2глог 2глое 2глой 2глою 2глую 2г1лы г2ляж 2гляк 2г3м г2нав г2нан г3не. г2нев г3нен г3неп г3нес г2нир гнит2р г2ное г2нои г2нос г3ня го1б2 го2вл го3ж2д го1з го2зл гоз2н гоиг2 3гой г2ол гоми2 го2с1а го2сд го1скл го1сн го1спа 2готд гоу3т го1чл 3гою 2гп 2гр. г1рае г1рай г1рар г1рег г1рек г1рец гри4в3н г1рик г1рил г1рин г1рис г1рич г1ров г2роз г1рок г1рон г1роп г1рот г1роф гру2п г1рыв 2грю г1ряе г1рял г1рят 2г3с2 г4са г4сб 2г3т гу1в гу1с гу2с1к 2гф 2г1ч 2г3ш 2г3э 1да да2б1 да2ген да2гр да1з да2о даст1р дат1р 2д1б дв2 д1ве 1дви 2д1вид 2двиз 2двинт 2двинч 2д1вис 2д1вит д3вк д1вл 2двод д1воз 1дворь 2двя 2дг2 2д1д2 1де де1б2л де1б2р 3девр 3дез де2з1а2 де2зи дез1о2 де2зу деио2 де1кл 3деме де2од део3п де3пл дерас2 де2с3в дес2к де2ср де1хл 2дж. д2жам д2ж3м 2джс 2д1з2 1ди ди2ад диа2з ди2али ди2ало ди2ар ди2ас ди2об дио3де ди2ор дио1с ди1оти дип2 ди2пи ди3пт ди2с1тр диу3 ди3фр ди3фто ди1х 2д1к д1л д2лев 2д3м2 2д1н д3на днеа2 3дневн 4д3но1 дно3д2 днос2 4д3ны 3д2няш 1до 2д1о2бед до2бл 2д1обла до1б2ра дов2л до3в2м до1д2 до3дн до3ж2д до1з доз2н дои2р 2докт 2долим до2м1р доп2 до3пл 2допле до2пре до2руб до1с д1о2сен д1о2син 2д1осно дос2п 2дотд 2дотл дот2ри 2д1отря 2дотъ до3ть 3дохл до2ш3в до3ш2к до2шлы до2щу 2дп 2др. д1раб 1дравш 2дразв 1д2разн д1ране д1рар д1ра2с3 д1рах д1рач д2раю д1ре д2реб 2д3реж 2дрез д2рел д2рем 1дрема 1дремл дрем3н 1дремы 2д3рен дре2ск д2ресс д1ри д2рий 2дрин д2рип д2рих дро2г3н д1род д1рое 1д2рож 2д3роз д1рой д1рол д1рон д1рос д1рот д1рою д1руб 1друг 1друж д1рум д1рую д1ры 2дрыв 1д2рыг д1ря д2ряб 1д2ряг д2рях 2д1с2 дск2 дс3кн 2д1т 1ду дуб3р ду3г 2д1уд ду2да ду2о дуп1л дус1к д1усл ду1ст ду2ста 2дут1р ду1х ду2чи дуэ1т 2дф д1х 2д3це 2дцу 2дцы 2д1ч 2д3ш2 2дщ 2дъ дъе2м 1ды 2дыг ды2г1р 2дыд 2дыме 2ды2с1 2дыт 2дыщ 2дь. 1дье 2дьк 2дьт 1дью 1дья дь3яр 1д2ю 1дя е1а еа2д еади3 еа3до еа2з еан2д1р еат1р 2еб еба2с е1бра еб1рен еб1ри е1бро еб1ров еб1ры е2б3рю е1ве 2евер е1ви е3в2ме ев2ним ев2нят е1во 2евол евра1с 2е1вре ев1рее ев1рей ев1рея ев1ри е2вт е1ву е1вх ев2хо е1вь ега1с2 ег2д е2глан е2гле е2гли е2гло ег2на ег2но 2ег2р ед1во ед2ж е1дже е1д2лин едноу3 ед1опр е2дотв е2дох е2д1ощ е1дру е2дру. е2ду2б ед1убо е2дуве е2дуг е2дус ед1уст 2е3душ е2дын е1е е2евид ее2в1р ее2ги ее1с2 ее2ст еест1р ее2х е2жг е4ждев еж3ди 2еже е2ж1р еза2вр езау3 е1з2ва езд1р е3зе еззу3 е3зит ез1об ез1о2г е1зом ез1оп ез1о2р ез1от ез1ош ез2ря ез1у2д ез1у2к ез1уп ез1ус езу2со езу2сы ез1у2х ез1уча е3зя е1и еи2г1 еи2д еи2м еи2о еис1л еис1тр е1ка ека2б ек2з е1ки 2е1ко 2е1кр ек2ро ек1ск ек1сте е1ку е1ла е1ле еле3ск еле1сц е1лу е1лы е1лю е3ля еми3д2 еми3к емо1с 2емуж е2мч 2емыс е3на ен2д1р 2е1нр енс2 ен3ш2 е1нэ 2ео е1о2б еоб2ро е2о3гл ео2гро е1од ео3да ео2де еоде3з ео2до е1о2ж е2ои ео3кл е1ол. е1ола ео3ли е1олк е1олы е1оль е2ом е1он. е2она е2они ео3но е1онс еоп2 е1опе ео2пр ео4пу е2о3ро еос2 е1о2сви ео1ск е1осм е1осн еост1р ео3сх е1отл еот2ру е1о2ч е1о2щ епат2 епа1тр 2епе епис2к е2пл е3пла еп1леш е3п2лод еп1лу е3плы еп1лющ е4пн 2епо е4п3с е4пт е1ра ер1акт е2рв ер1ве е1ре е3ре. ере3до ере1др ере1к2 ере3м2н ере3п ере1х4 е1ри ерио3з е1ро еро2б ер1обл 2ерови 2ерокр 2ерол еро3ф2 ер3ск е1ру е2р1у2п е1ры е1рю е1ря е3с2а ес2ба е1сг е1ск е2с1ка. ес1кал е2ске е2сков е4с1ку. 2есл ес1лас ес2лин ес2лов ес2лом е1слу е1слы е1с4м е3со 2есп ес2пек ес3пол е2спу е1ст ес2тан е2стл е3сту ес2чет е1та ет1ве ет1ви е1тво 2етеч е1ти е1то ето1с ет1р ет2ря е1ту е1ты е1тье е3тью е3тья е1тю е1тя е1у2 2еуб еуб3р еуз2 еук2ло ефи3б2 еф2л еф1ре еха2т ех1ато ех3вал ех3лоп ех1об ех1опо ех1ре ех1ру ех1у2ч 2ецв е1чл е2шл еэ2 ею2г е1я ея2з 1ж жа2бл жа2бр жа1з жат1в 2ж1б2 2ж1в жг2 2жга ж2ги 3ж2гл ж2гу 2ж1д ж2дак ж2дач 3ж2дел 4ждеме ж2деп ж2ди 4ж2дл ждо3 жду1 4ждь 3ж2дя 3жев же3д2 же1к2в же1кл же1о2 же3п2 же1с2 же3ск 2жжа ж2же 2жжев 2ж1з2 жи1о 2жирр 2ж1к 2ж1л ж2м ж3ма 2ж3мо 2ж1н жно1 2ж1об 2ж1о2т1 жоу3 жоу1с 2жп2 жпо1 ж2ру 2ж1с 2жф 2жц 2ж1ч 2жъ 2жь. 2жьс 2жьт 1за1 заа2 заб2 за2в1ри за2вру з1аву заг4 з1адр зае2д зае2х за3ж2д за3з2 з1акт за3мне 3з2ан за3на занс2 зап2 зар2в за3р2д зар2ж зас2 заст2 зат2 за3тк зау2 зах2 зач2т за3ш2 зая2 з1б2 2з3ва. з2вав з3валь з2ван 2звая з1ве з2вез з1ви з3в2к з1вла з1во 2звол 1з2вон з1вр 1зву 2з1вую з1вь 2зг з3га з2гли зг2на з2гну з1д2в з2деш здож3 1зе зе2б1 зе2ев зе2од 2зж2 з3з2 1зи 3зи. 3зий. з1инт зи2оз зи2оно зи1оп 3зис зи3т2р зиу3м 3зич 2з1к зко1 зко3п2 з1л з2лащ з2лоб з2лоп з2лор з2лющ 2зм2 з3мн з1н 2зна. з2нав з2нае з2най з2нак з2нан з2нат з2наю 2зная 2зне 2з3ни 2зно 2зну 2з3ны з2обе зо2би 1зов зо3в2м зо2гл зо1др 1зое зо1з2 1зои 1зой. 1зок. з1окс 1зол2 зо1лг зо1лж зо3м2 1зом. 2зомн 1зон 2зонр 1зоо зо2о3п зо2ос зо2па з2опл з2опр з1орг 1з2о3ре зос2 з1осн зо1сп зо2тв з2оте з1отк з2ото зот2ре зот2ри 1зох зош2 зо2ши 1зоэ 1зою з1ра з2рак зра2с з2рач з2рен з1рес з2риш з1ро зро2с3 з1ру з2рю з1ря 2з1с 2зт з1ти 1зу 3зу. 2з1у2бе зу2б3р зу1в 2зуве 2зу2г 3зуе 2з1уз3 2зу1к 3зуме з1у2мо 2зуп зу2пр з1урб з1у2те зу2час 2зц з1ч 2зш зъе2м 1зы 2зы2г1 зы2з 2зыме 2зымч 2зы2с1 2зыщ 1зье 1зьи 1зью 3зья 1з2ю 1зя и1а и2аб и2ав иаг2 и2агр и2аде и2ади иа2зов иа2му и3ана иа2нал ианд2 иао2 и2ап иа1с2к иа1ста иа1сто иат1ро и3ату и2аф и2а1х иа2це 2и1б и2б1р 2иваж 2и1ве и2в3з и1ви 2и1во и1в2р и3в2с и1ву ив2хо 2ивы иг2д и3ге 2игл и2гле и2гли и2гн игни3 иг1рен иг1ро иг1ру иг1ры и2г1ря и1дв и2дей и1д2ж иди1ом иди1от ид1р и1дь и1е и2евод ие2г ие2д ие3де ие2зу и3ени ие1о2 иепи1 ие2р и3ж2д из1в2 из2гне 1из1д из2нал и1зо изо2о из1р и1и ийс2 и1к и3к2а ика1с2 ик2ва и2кви и2кля и3ко ик1ро ик1ск ик2с1т и3ку и1л и2л1а2ц ило1ск илп2 и2л1у2п и2ль ильт2 2има и2мено и2мену 2имень и3ми имои2 им3пл и2м1р и2мч им2ча инд2 1инж ино2к3л ино3п2л ино1с инс2 1инсп 1инсти 1инсу 1инф 1инъ и1об ио2бо ио2вр и2ог и1од ио2де и1оз ио3зо и1окс и1оле и1он и3онов и1опт и1ор и3ора ио1ру ио2са ио3скл ио1с2п и1ота ио2т1в и1отк и1отс иоуг2 ио2хо и1ош 2ип ипат2 ипа1тр ип2ля ип3н ипо3к2 и1р ира2ст и2р1ау и2рв и2рж ири2ск ириу3 иро1з2 1ирр исан2д1 и2сб и2сд ис1к ис3ка. ис3кам ис3ках ис3ке ис3ки ис3ков ис3ку. и2слам ис1лы ис3ме ис3му ис3но исо2ск и2с3пр и4сс и1ст и2ст1в и2стл ис1тяз и1сьи и1т ита2в ит3ва и2т1ве ит1ви ит1ву и2тм и2т1р ит2рес ит3ром и2т1уч и3тью и3тья и1у2 иу3п иф1л иф2лю и2фр иха3д и2х1ас их2ло2 ихлор1 и3х2о ихо3к их1ре их1ри и1ху и1ч иш2ли и2шлы и2шт ию4л ию2н ию2т ию3та и1я ия2д 2й1 йд2 й2д3в йно1 й2о1с йо2тр йп2л й2сб й3ска йс2ке йс4мо й2с3му й2сн й2с3ф й2сш й2тм й2хм йх2с3 йя1 ка2бл ка2бри 1кав к2ад ка3дне ка2д1р 1кае каз3н ка1зо 1кай 1кал. 1кало 1калс 1кам 1кан ка2п1л ка2пре кар3тр 3к2ас ка1ст 1кат ка1т2р 1ках ка2ш1т 1каю 2к1б к2вак к2вас к2ваш к1ви к2воз к1ву 2кг 2к1д кда2 1ке 2кеа ке2гл кед1р ке2с1к ке2ст1 2к1з 1кив ки1о киос1 ки2пл ки1с2ни 1кит 2к1к2 кк3с 2к3ла. 2к3лась 2к3ле. 2клем к3лем. к3лен к1лео 2к3ли. 2к3лив к2лик к2лин 2к3лис к3лия 2к3ло. к2лоз к3лом 2к3лос кло3т 1клук к3лы 2кль 1клю 2к3лю. 2кля. 2клям 2клях 2км 2к1н 3к2ниж к2ноп 3к2няж к2о ко1б2ри 1ков 3кова 1код ко1др 1коз 1кольс 2комин 3конс коп2р ко2р3в ко1ру 1кос ко1ск кос3м ко1сп 1котн ко2фр кохо2р3 1кош 2кп 2кр. к1рел кре1о кре2сл к1реч 1криб к1рид к2риз кри2о3 к2рит к1рих к1роа к1роб к2рое к1рок к1роо к1рор к1рос к1роф к1рох к1роэ кру1с к1ряд 2кс ксанд2 к2с3в кс3г к2с3д к2сиб к1ски кс1кл к1ско кс3м к3со к1стам к1стан кс3те к1сто кс1тр к1сту к3су 2к1т кта2к 3к2то. кто1с кт2р к2у ку1ве 3куе 1куй 1куля 3кум куп1л ку2п1р 1кур ку3ро кус1к ку1ст 1кут ку3ть 1куче 1куют 3кующ 2кф 2к1х2 2кц 2к1ч 2кш 1кь к2ю 1ла. 2лабе ла2бл 2лаго ла2гр ла2д1аг 1лае ла3ж2д ла1зо л2ак лак2р 1лам. 1лами. лан2д1р ла1ста ласт1в ла1сте ла1сто ла2ст1р ла1сту ла1стя ла1т2р лау1 ла2ус ла2фр 1ла1х 1лая 2лб л1бр л1ве л1ви л1во л1ву 1л2гал л2гл лго1 2л3д2 1ле. ле1вл лев1ра ле2г1л ле1дж ле3до ле1з2о3 ле1зр лек1л 2лемн 1лен ле1онт ле1о2с ле2сб ле2ск ле4ска ле1с2л ле1спе ле1тв ле1т2р 1лех ле1хр л1зо 1ли лиа2м 3ливо 3ливы лиг2л ли2гро лие3р ли2кв 2лимп лио1с ли2пл лис3м 2л1исп ли2тв лиу3м ли2х3в ли1хл ли1хр 2л1к лк2в л2к1л 2л1л л2ль ллю1 2лм 2л1н лни2е 1ло ло2бл ло1б2р 2ловия ло2вл 3ловод ло2г3д лого1с ло1др 2лоен ло1зв ло2к1а2у ло2кл лок3ла 3лопас ло2рв 2л1орг ло1ру лос1к ло1с2п 2лотд лот2р ло2шл 2лп 2л1с2 лс3б л1т 1лу. лу1бр лу1в лу3г лу1д4р 1луе лу1зн лу1кр 1лун луо2д лу3п2ло лу1с лу3ть 1лую 2л3ф2 2л1х2 л2х3в 2лц л1ч 1лы. 1лые 1лыж 1лый 1лым 1лых. 4ль. 2льд 3лье 3льи 2льк 2льм 2льн 3льо 2льск 1льсти 1льстя 2льт 2льц 2льч 1льща 1льще 1льщу 3лью 3лья л2ю 1лю. 1люж 1люсь лю1та 1ля 3ля. ля1ви 3ляво 3лявы 2ляд 3лям ля1ре ля1ру 3лях 1м ма2вз 3маг ма2гн ма2др ма2дь ма1зо ма2к1р 2м1алл ман2д1р мас3л ма1с4т ма2тоб ма2т1р ма2у маф2 3мач ма2чт 4м1б м3би мб2л м3бля 2м3в2 2мг2 3м2гл 2м1д меан2 ме2ег ме2ел ме2ж1ат ме1зо ме2с1к ме2ст1р меч1т 2мж 2м1з2 ми2гре ми1зв 2мизд ми1зн ми2кр мик1ри ми2оз ми1опи ми2ор ми1с2л 2м1к2 3мкн 2м1л м2лее м2лел 2мм 2м1н 4м3на мне1д 3м2неш 4мное м2нож 4мной 4мном м2нор 4мною м2нут 4м3ны мо1б2 мо3вл 3мод мо1др мо2жж мо1зв мо1зр моис1т мо2к3в мо3м2 3мон 3моп мо1ру мос1ка мо1см мо1сн мо1с2п 3моти мо2т1р 3моф 2мп мп2л м1раб 2мри 2м1ро м1ры 2м1с мс2к мс2н м2с1ор 3м2сти 2м1т му1с2к му1с4л му1ст мут1р му3ть 2мф мфи3 2м1х 2мц м2чав м2чал м2чит м2чиш 2мш2 2мщ 3м2ще мым1 мы2мр мы2с 2мь. 2мьс мью1 2мэ мэ1р м2ю мя1р мя1ст 1на наби1о наб2р на1в2р наг2н на3жд на1з2 на2ил на2ин на2и1с2 4накк на3м2н нап2л на1рва на1р2ви на1с2 на1тв на1т2р н1а2фр на1х2 2нач на3ш2л 2нащ наэ1р 3ная 2н1б2 2н1в 2нг н2г1в нги2о нг4л нго1с нг2р 2н1д н2дак н2д1в нде3з нде2с нд2ж н3д2з н2дл нд1раг нд1раж нд2ре нд2риа н2дря нд2сп н2дц 1не не1б2 не1в2д 2невн не3вня нег2 3нед не1д2л нед2о не2дра не1дро не3ду не3е нее2д не3ж2д не1зв не1з2л не1зн не1зо не1зр неи2 не1к2в не1кл не3м2н 3не1о2 не2ода не2ол не3п2 не1р2ж не2р1от нес2к не3с2н не1с2п нест2 не1с2х не1с2ч не1т2в не3т2л не1т2р 3неу не2фр не1хр не3шк нея2 2н1з2 нзо1с 1ни ни3б2 ни2ен 3ний ни2кл нила2 ни2л1ал ни2л1ам 2нинсп 2н1инст ни1сл нис3п нист2р ниу3 ни1х 3ниц 3нищ 2н1к нк2в нк2л нкоб2 нко3п2 н2к1ро нк1с н1л 2н1н нно3п2 1но ноб2 но1бр но2вл но1дв но1др но2ер но1зв но2зд но3з2о но1зр но3кн 3номе ном3ш но2рв но1ру но1скл но2сли но1с2п но2сч 2нотд но3ф2 ноэ2 н3п2 2н1ре 2н1ри н1ро 2н1с н2с3в н2сг нс2ке н2скон н2сл н3сла н2с3м н2сн н2с1ок н3с2пе нст2р нсу2р н2с3ф н2съ3 2н1т н2т1в нти1о2к н2тм нт2ра н2тр1а2г нтр1аж н2трар нтрас2 нт2ре н2трив н2трок нт2ру нтр1уд нт2ры н2т1ря 1ну нут1р ну1х 3ную 2нф2 н1х нхо1 2нц 2н1ч н2чл 2нш нш2т 2нщ 1ны 3ны. 2нь. 1нье 1ньи 2ньк 1ньо 2ньс 2ньт 2ньч 1нью 1нья н2э 1н2ю 2н3ю2р 1ня ня1ви 2о1а2 о3ав оап1 2оба 2обио об2лев об2лем о1блю 1обм обо1л2г обо3м2 обо2с 2обот об1р о2бра. о1брав о1бран 1объ 2обь о1в о3вла о3в2ло ов3но о3в2нуш о2в1ри ов2се ов3ско ов2т о2вх ог2 2о3ге ог3ла. ог3ли. ог3ло. о3гря 2одан од1вое о3де. 1о2деял 2оди3а 2о3дим од2лит о2д1о2пе одо3пр о2д1о2пы о2доси о2д1отч о1драг од1раж од1раз од1рак о1драл од3реб о1дроб од1ров о2д1у2ч о2дыма о2дыму о2дын о1дь о2дьб о1е ое1б о2е1вл ое2д о3ежек ое2жи ое1о ое1с2 ое2ст о2ето ое2ц о3жди о3ж2ду оза2б3в 2озав о1з2ва оз2вен оз2ви о1з2вя оз2гло оз2дор о1здр озе1о оз3но о1зо о2з1об 2озон о2зоп озо1ру оз1уг о2зым о3зыс о3и ои2г1 оиг2н оие3 ои2з ои2м ои3мо ои2о 2ой ойс2 о1к 2о3кан ок2в 2ок2л о3клю око1б 2о3кол око3п2л ок1ск 1окт 2окти 2окум о3ла ол2ган о1ле 1олимп о3ло о1лу олу3д2 о1лы о1лю о3ля о3ма ом2бл 2оме о3м2нем о3м2нет о3множ ом1ри ом2ч ом2ше о2мь о3мья о3на онд2 оне3ф2 оно1б о1нр онс2 он2тру о1о2 о2ол оо3пс оос3м оост1р о2оти о2оф о3пак о3пар о2пле. о2п1лей о2пли оп2лит оп2ло оп3лю. о2пля о3пляс опо4вс опоз2н опо2ш3л оп2ри о3п2те оп2то о1ра ора2с3 ор2б3л о1р2в о1ре 2о3рег оре2ск о1ри ор1исп о1ро оро2с3л ор2тр о1руе о1рук ор1укс о1рус 2орц о1ры о1рю о1ря о3сад оса3ж2 ос2б о2с3ба о2с1ка. ос3кар оск1во о2ске ос1ки о2ски. о2сков ос1кой ос1ком о1с2коп ос1кою о2с1ку. ос1кую о1с2л ос3лей ос3лог ос3лых ос3ми ос3мос о1с2ним ос2нял ос2пас о1с2пу ос2пя ос2св ос2с3м о1ст ос2та о3стра о2суч 2осх ос2цен о1с2ч о1с2шив о1т отв2 от3ва от1ве от1ви от1вл 1отг 1отд 2о3тек о3тер 2о3тех о3ти о3ткал о2тм от1раб от1рад от1раз отра2с от1реж от1рек от1реч от1реш от1ри от1род от1рое от1рок от1рос от1роч от1руг от3см оту2а от1у2ч 1отх о3тью о3тья о1у2 оуп2 оус2к оу3та оу3то 2офаш о3фе 2офит 2офон о2фори 2офот о2фри 2охи ох1лы о2хля ох2ме 2охор о1хр о1ху о2цо оча1с оч2л оч1ле о3чли о1чт о2ч1то ош3ва ош2ла ошпа2к3 ош2т оэ1ти 2ою о1я оя2в оя2д оя2з оя2ри 1п пави3 пав3л па2вь па2др па2ен па1зо пас1л пас1та па1сте пас1то пас1ту па2с1ты па1тро па2ун па3ф па1ху па2шт 2п1в2 2п1д пе1 пе2дв пе2д1ин пе2з пе3за пе3зо пе2к1ла пе2ль пе4пл пери1о пе2с1к пе2сн пе2ст1р пе2сц пе2сч пе2тр пе2шт пиаст1 пи2ж3м пи2к1р 3пинк 3пися 4п3к 2пл. 4пла. пла1с п1лем. п1лемс 2плен п2ленк п1ле2о плес1к п1лею 2плив 3п2лик 2пло. 2плов 2плог 2плый 2плым п1лын п1лых 2плю. п1лют п2ляс п2ляш 2п1н п3на п3но1 п3ны по1б2 по3вл по3в2с под1во по2д1о2к подо3м2 пое2л пое2х по1зве по1здо по1з2л по1зн пои2щ 3пой 3полк по3мно по3мну 3по3п2 п1орг пор2ж по1ру по1с4 3посл по3сс пот2в пот2р по1х2 по2шло по2шлы по2шля поэ3м 2пп2 ппо1д 2пр. 3прев пре1з прей2 пре1л пре1ог 3прет при1 при3в приг2 при3д2 при3к при3л приль2 прип2 п2риц про1бл прод2л про3ж2 про1з2 п1розо 3прои про3п профо2 2прс п2ру 2п1с2 3п2сал п3син 3п2сих п3со 2п1т п2т3в 3п2тих п3ту 3пуб пуг3н пус1ку пу1ст пу3ть 2пф2 пх2 2пц 4п3ч 2пш 2пщ 2пь. 2пьт пэ1ра п2ю1 1ра. раа2 ра2бл 1рабо ра2б1р 1равня ра2гв ра2гл рад2ж радо1б2 ра2дц ра2жур ра2зий ра2зуб рак2в 1ракиз ра2к3л 1ралг 1рамк 1рамн ра2нох ран2сц ра2п1л рас3к2 1расл рас3п рас1т 1раста рас3т2л ра2так рат1в ра1т2р 2рахи 1ращи 1раю 1рая 2раят 2р1б рб2ла р2бле рб2ло рб2лю рбо3с 1р2вав р3вак р3вар р3вата р3веж р2вео 1рвет р1ви р3вин р2вит р1во рво1з2д р1вь 2рг р2гв р2г1л р2гн рг2р 2р1д рда1с р2д1в рд2ж рди2а р2дл рдос2 р2дц 1ре. ре1вр рег2ля рег2н ре2д1о2п ре2дос рее2в рее2д рее2л ре3ж2д 1резк ре1з2л ре1зна 1ре1зо ре1зр рез2у 1рейш ре1к2л 1рекш ре3мно 3ремо ремо2г3 1ренк 1рень ре1он ре1оп ре1о2р ре1о2ф ре1ох ре1о2ц 1репь ре3р2 рес1ки ре1сл ре1с2п рес2с3м ре3ста ре3сто ре1сч ре1тв ре1т2р реуч3т ре1чт ре3шл р3жа. р3жам р3жан р3ж2д 2рз р1з2в р1зо ри3а риб2 ри3бр ри3в2н 2риги ри2гло ри3г2н 2ридж ри1д2р рие2л рие3р риз2в рик2р ри3м2н ри3м2ч р2ин 1ринс рио2з рио2с ри1от ри3р2 ри1с2 ри3сб 2рисп ри3ств ри3т2р 1риу ри2фл ри3фр ри1хл 1риц 1риш риэти2 2р1к р2кв р2к1л рк1с 2р1л2 р2ль рлю1 р3ля 2рм р2мч 2р1н рнас4 рне3о рне1с2 рно3сл 1ро. ро2блю ро1б2р ро2вл 1рогол 1рогру ро1дв ро3д2з ро1дл род2ле ро2д1от ро1др 1родь рое2л рое2м рое2х 1розар ро1з2в ро1зр 3розыс рои2с3 1рокон 1рокр 1ролис 1ролиц 1ромор 1ронаж 1ронап 1ронос рооп1р ро2плю ро3пс 2р1орг ро1р2ж ро1ру ро1ск ро2ски ро2ску 1росл ро1см ро1с2п рос2ф 1росш 1росю 1рот2в 1ротк рот2ри 1роу роуг2 ро2ф1ак ро2фр ро1хл рош2л ро3шн 1рояз 2рп рп2ло р2плю 2р1р 4р1с рс2к р2сн рс2п рств2 р3ствл 2р1т р2такк р2т1акт р2т1в рт3ва рт2вл р2тм р2т1об рт1орг рт1ра рт2ран рт1ре рт1ри ртус1 р2т1у2чи р3тью рт1яч 1ру. 1руба руг3н ру2дар 1ружей 2рукс 1рул рус1к рус3л ру1ста руст1р ру3ть 1руха 1рухо 1ручн 2рф рф2л 2рх р2хв р2х1ин рх1л р1х2ло р2х1оп рх1р 2рц р2цв 2р1ч р2чл р2чм 2рш р3ш2м рш2т 2рщ 2ръ 1ры. 1рыб ры2дв 2рыз ры2кл 1рым ры2с1к ры2х1 2рь. 1рье 1рьи 2рьк 2рьс 2рьт 1рью 1рья рэ1л р2ю 1рю. 1рюс ря1ви 1ряю 1са са2бл са2дь са2кв са2кл 2с1альп с1апп 2с1арк 2с1атл са1тр са2ун са2ф1р са1х2 1сб2 2сбе3з2 сбезо3 сбе3с2 2с3бу с2бы 2сбю 1с2в 2с3вен сг2 с2ги с2гн с2го 1сд2 с2да с2де с3ди с2до 1с2е сег2н се1з2 се1кв сек1л се2к1р секс4 семи1 сере2б се2ск се2ст се3ста се3сте сест1р 1с2ж с1з 1с2и 3сиз си1ом си1оп си2пл си1х 4ск. 2скам с2канд 1с2каф 2сках ск2ва с2кви 3скино ск2л с2кля ск3ляв 2скн с1кон 2скона с2копс 2скош ск2р с1кра 2скриб ск1с 2скуе 2с3ла. 1слав 1слад с1лам 2с3лая с3лев с3лее с1лей слео2 с1лет с3лею 2с3ли. 2слиц 2с3ло. с2лож с3лому 2с3лос 2с3лую 2с3лые 2с3лый 2с3лым 2сль с1люс 2с3ля с2м 1смес с4мея с3мур с1н 1с2наб с2нас 2сная 1с2неж 2с3ник 2сно сно1з2 2сную 2с3ны 1со со1б2р с2ов сов2р со1д со1з2 со1л2г со3м2 со2рие со1ру со1ск со1с2п со2сь сот2р со1чл сош2л сп2 с2пав с2пее с2пел с2пен с2пех 1с2пец с2пеш с2пею с2пим 2спися с3пн спо1з2 2спол с2пос 2спь 1ср 2ср. с2раб сра2с с1рат сре2б1 сре3до 2с1с ссанд2 с2сб сс3во 4с5си с3с2к сс2л с2сн с3с2не с2сори сс2п сст2 сс2ч 2ст. 1ста. 2стб 4ств. ст1вер 2ствл ст2вол ст2вя с2те 1с4те. 1стей 1стел 1стен. с3тет. с3тете сте3х с3теш 1сти с2тие с2тии 2стимп 2стинд 2стинф 2стинъ с2тич с2тишк с2тию 2стк ст2ла с3т2ле 2стли ст2лил ст2лит 2стля 2стм 2стн 1сто. с2то1б 1стов 1стог сто2г3н 1стод 1стое 3с2тои 1сток 1стом 1стон 2сторг 2сторж 2сторс 1стос 1стот с2тоц 1стою 2стп 2стр. страс2 4страя 2стред ст1рей 2стрив ст1риз 2стрил 2стрищ ст1роа с4т1ров ст1род ст1рох ст2руб ст1руш 2стс с1тут 1стую 2стф 2стц 1сты с2тыв с4ть 2сть. 2стьс 3стью 1стья 1стям 1стях 1су су2б суб1а2 суб1о су1в су3гл су2ев су2з су1кр сума1 супе2 сус3л сус3п су1ст сут1р су2ф3 су1х 1с2фе с1х2 1с2хе 2сца с2цена 2с3ци 2сцо сч2 1сча с2час сче2с1к с3чив 2счик с2чит с1чл 2счо сш2 с3шн 1съ2 съе3д съе3л 1сы сы2г1 сы2з сы2п1л сы2с сыс1ка 2сь. 1сье 2ськ 2сьт 1сью 1сья сэ1р с2эс 1с2ю сю1с 1ся 2сяз ся3ть та2бл таб2р та1ври 1таг та2гн та1з2 так3ле т2ан та2пл 1тас та1ст та1тр 1тащ 2т1б2 2тв. 2т2ва т1вей т1вел т1вет 2тви т1вое т1во1з 2т1вой т1вос 2твою 2т1вр 2тву 2твы 2твя 2тг 2т1д 1т2е те2гн те1д те1зо 3тека тек1л 3текш теле1о тем2б1 те2о3д те1ох те4п1л те2рак тере2о 3терз тер3к 3теря те2ска те2с1ки те2с1ко те2ску тест2 те2хо 2тж 2т1з тиа2м ти2бл ти3д2 ти1зна тии2 тиис1 тик2 тила2м т1имп 2т1инв т1инд 2тинж 2тинф ти1с2л ти3ств ти3ф2р ти1хр 2т1к2 3т2кав 3т2кан 3т2кет 3ткн 2т1л тло2б т2ль тм2 тми2с тмист1 т3мщ 2т1н то2бес то1б2л 2тобъ то2вл то1д то3д2р то1з2 ток2р 2т1омм 2томс 2тонг 1торг 1торж 1торс то1ру 1торш то1с2н то1с2п то1с2ц 2тотд то3тк 1тощ 2тп2 тпа1т т1рага 2т1раж 2трб 2трв 2трг 2трд трдо2 т1реа 1требо 1требу т1ребь т1реве т1ревш т1рег т1ред т1рее т1реза т1резн треп1л 3тре2с трес1к т1рест т1рету 3т2ре2х т1рец т2решь т1рею 1триб т1рив три2г1л т1рил т1рим 4тринс три1о т1рит три3ф т1рищ 2трм 2трн т1рогл т1роид 2трой тро3пл т1рор т1росо тро3т 4т3роц 2трою 2трп 2трр 1труб т2руд 2трук т2рум т2рут 2трф 2трщ 2тръ т1ры т1ря. т1ряв 2т1ряд т1ряе т1ряж т1ряй т3ряк т1рят т1рящ т1ряя 4т1с2 т2сб т2с3д тсеп2 т2с3м т2с3п 2т1т т2тм ту2гр ту2жин 2т1у2пр ту1сл ту1ст ту2фл 1туша 1тушо 1тушь 1тущ 2тф 2т1х 4тц 2т1ч 2тш2 2тщ 2тъ ты2г1 ты2с1к 2ть 4ть. 3тье 3тьи ть2м 4тьт тью1 2тэ т2ю тю1т 1тяг 1тяж 1тяп 2тя2ч у1а у2але у2ас у3бел убо1д убос2 уб1р 1убра уб3рю 1у2быт у1ве. у1ви ув2л у1во у1ву у2гв у2гл у2гн уг2на уг2не уг1ре уг1ря уда1с уд2в уд1рам уд1ро у3ду у1е уе2д уе2л уе1с уе2с1к уес2л уе2х у2жж у1з2в у1зо узо3п у1и у1ка ук1в у1ки у1ко уко1б у1ку1 у1ла у1ле у1лу у1лых у1лю у2мч у3на ун2д1р у1нь у1о уо2б уо2в у2оза уо2к уо2п уо2с уост1 уо2т1 уо2ф у2пл уп1лю у3про у1ра у1ре уре2т3р у1ри урке3 у1ро у2род уро2дл урт2р у3ру у1ры у1рю у1ря у2сад у1сг ус1ка ус1ки уск3л ус1ком у1скр ус1ку. ус2л усла4ж3 ус3ли у1см у2сн ус2п ус3с у1сте у1стя у1сф 2усц у2сч у2сь у3сья у1та у3тер у1ти ут2ля у1то уто3п2с ут1ри у1ту у1ты у1тье у3тью 1утю у1тя у1у ууг2 уу2с у3фи уф1л уф2ля у2фр ух1ад уха2т у2хв у3х4во ух1л ух3ля ух1р у2чеб 1учр у1чь у3ше у3ши у2шл уш1ла у2шп 2уэ у1я уя2з 1ф фа2б1 фа2гн фа1зо фан2д фанд1р фа1тр фа2х 3фаш фаэ1 2ф1б 2ф1в 2фг 2ф1д фев1р фед1р фе1о3 фе2с1к ф4и фиа2к1 фи2гл фи2ж фи2зо фи2нин фи1о 3фит 2ф1к ф2ла ф2ли ф2ло 2фм 2ф1н 2фобъ 3фон фо2рв 2ф1орг фор3тр фо1ру фос1к 3фот фото3п ф1раб фра1з фра1с ф1рат ф2рен фре2с ф1ри ф2риж ф2риз ф1ро ф2рон ф1ру 2ф3с 2ф1т ф2тм ф2тор 2ф1у2п фу3тл 2фуф 2фф 2ф1ч 2фш2 2фь. ф2ю1 1ха ха2бл ха2д 2х1ак хан2д хао3 х1арш 2х1б 1х2в 2х3ве 2х3ви х3вы 2хг х3д2 1хе хео3 х1з2 1хи хиат1 хие2 2х1изы хи1с2 х1к2 х1лав х1лас х1лат х1лац 1хлеб х2лес х1лет х3ло. х2лоп 1х2лор х1лу 1х2му 2х1н 3х2ны 1хо 2х1о2к хоп2 хо2пе хо2пор хо1ру х1осм 2х1осн хоф2 хох1л хоя2 хп2 х1раз 1хран х1ра1с2 х1рей хри2пл х2рис х1ров 1хром хро2мч х1ры х1ря 2х1с2 2х1т 1ху. х1у2г 2хуе 2хуй 1хун х1у2р ху3ра 1хус 1хуш 2хую х1х2 2х1ч2 2хш хью1 1ц ца1 3ца. 3цам ца2пл 3цах 2ц1б ц2ве 2цвы 2цг 2ц1д це1з це1к це1от цеп1л цес2л це1т 2цетат 2ц1з ци1 ци2к1 цик3л ци2ол цип2 ци2ск циу3 циф1р 2ц1к2 2ц1л 2цм 2ц1н ц1о2б 2ц1о2д 2ц1от 2цп2 2ц1р 2ц1с 2ц1т 3цу 2цц 2ц3ш2 3цы цы2п цып3л цю1 1ча ча2др ча2дц ча2ево ча2евы ча2ер част1в ча1сте ча1сту ча1стя 3чато 3чаты 2ч1б ч1в 2ч1д 1че че1вл че2гл че1о чер2с черст1 че1сл ч2ж чжо2 1чи 3чик 3чиц 2ч1к 1ч2ла ч2ле ч3лег ч3леж 2чли ч2ли. 1ч2ло 1чм 2чма 2чме ч2мо 2ч1н 3чо 2ч1с 2ч1та ч2те 2чтм 1чу 3чук ч2х 2ч1ч 2чь. 1чье 1чьи 2чьс 2чьт 1чью 1чья 1ш ша2бл ша2гн ша2г1р ша2др шан2кр шар3т2 ша1ст ша1тро 2ш1б ш2в ш3вен ше2гл ше1к ше1о2 ше3пл ше1с2 ши2бл ши2пл шиф1р 2ш1к2 3ш2кол 2ш1лей 2шлен ш2ли. 2шлив 2шлил ш2лин ш2лис ш2лите ш2лиф ш2ло. 2шлов ш2лог ш1лы ш2лю 2шляе 2шляк ш2ляп 2шлят 2шляч 2шляю 2шм 3ш2мы 4ш3мы. 2ш1н 4шни ш2нур ш2п2 ш3пр 2ш1р 2ш1с ш1ти 2штс шу2ев шуст1 2шф ш1х 2шц 2ш1ч 2шь 4шь. 3шье 3шьи 3шью 3шья ш2ю1 1щ 2щ3в2 ще1б2л ще2гл щед1р щеи2 щеис1 ще1с ще1х щеш2 ще3шк щи2п1л 2щм 2щ1н 2щ1р 2щь. ъ1 ъе2г ъе2д ъе3до ъе2л ъ2е2р ъе2с ъе2хи ъю2 ъя2 ъя3н ы1 ы2бл ы3га ы3ги ыг2л ы2гн ы2дл ыд2ре ы2д1ро ы2дря ые2 ы3ж2д ыз2ва ыз2д ы2зл ы2зн ыз2на ыи2 ыиг1 ы2к1в ык2л ы2к3ло ыко1з ык1с ы2ль ы2мч ынос3л ы3по ыра2с3 ыр2в ыре2х ы3са ы3се ыс1ки ыс1ку ы2сн ы3со ыс2п ы2сх ыс2ч ы2сш ыт1ви ыт2р ы3тью ы3тья ыу2 ы2ш1л ы3шь ь1 ьб2 ь2вя ь2дц ь2е ье1зо ье1к ье2с1к ь2зн ь2и1 ь2кл ьми3д ьми3к ьмо1 ьне2о ь2о ь2п1л ь3п2то ьс2к ь2сн ь2сти ь2стя ь2т1амп ьти3м ь2тм ь2тот ь2траб ьт2ре ьт2ру ьт2ры ьхо2 ьхоз1 ь2ща ь2ще ь2щу ь2ю ь2я ья1в ь3ягс 1э э1в эв1р 2эг эд1р эк1л экс1 эк2ст эле1о э2м э3ма э2н э3нь эо2з э2п эпи3к э1ре э1ри эри4тр эро1с2 э1ру э1ры эс1 эск2 эс3м э2со эс3те эс2т1р э2те этил1а эт1ра э2ф эх2 эхо3 э2ц эя2 1ю ю1а ю1б ю2бв ю2бл ю2б1ре ю1в ю1дь ю1е юз2г юзи2к ю1зо ю1и ю2идал ю1к ю2к1в ю1ла ю1ле ю2ли ю1лю 2юм ю2мч ю2нь ю1о1 ю1ра ю1ре юре4м ю1ри юри2ск ю1ро ю1ру ю1ры ю2с1к ю1ста ю1сте ю1сто ю1стя ю1ти ю1то ю1ту ю1ты ю1х юха1с ю1ч ю2щь ю1я я2бр яб1ра яб3ре яб1ри яб3рю 3явикс я1во я1ву я1в2х я2г1л я2гн яд1в яд1р я1е яз2гн я1зо я1и я1к я2к1в я2к1л як1с я1л я2ль ям2б3л я2мь я3на янс2 я1ра я1ри я1ро я1рь яс1к яс1л яс2т яст3в я1сто яст1р я1та ят3в я3ти яти1з я1то я1ту я1ты я3тью я3тья я1тя я1у ях1л я1ху яце1 я2шл 2яю. 2я1я .бо2дра .вст2р .доб2рел .до1б2ри .об2люю .об2рее .об2рей .об2рею .об2рив .об2рил .об2рит .па2н1ис .пом2ну .реа2н .ро2с3пи .со2пла а2ньш атро2ск безу2с бино2ск виз2гн выб2ре гст4р ди1с2лов дос2ня дро2ж3ж 2дружей е2мьд е2о3плато е2о3пози ере3с2со 4ж3дик 4ж3дич заи2л зао2з 2з1а2хав заю2л з2рят зу2мь 6зь. и2л1а2мин илло3к2 й2кь ла2б1р лу3с4н ме2динс ме2д1о2см мети2л1ам мис4с3н нар2ват не2о3ре ни1с2кол ни4сь. но4л1а2мин н2трасс о2д1о2бол о4ж3дев о1и2с1тр ойс4ков о2м3че. они3л2ам он2трат о2плюс осо4м3н оти4дн пере1с2н по2доде по2д1у2ро пое2ж по2стин прем2но приче2с1к пти4дн редо4пл реж4ди рни3л2а3м роб2лею 2сбрук1 со2стрит со3т2кал 2стче. 2стьт сы2мит 2сься. 6тр. тро2етес 6хуя. ы2рьм ыя2вя ьбат2 а1вё а2двё а1ё аз3вёз а1лё 2алёк 2амёт ам2нёт а1рё ас3тём а1тьё 1бё бё2д1р б3лён б2лёс1к б2люё б1рёк б2рём б2рёх 1веё 3везё вёд1р 1вёз 2вёрд 1вёс в2лёк в2лёт 1вмё в2нёс 2в1рён 3всё3 1вьё г1лё г2лёт г2нёв г3нён г2ноё д1вё 1дё .доб2рёл 2доплё до2прё д1рё д2рёб 2д3рёж д2рём 1дрёма 1дрёмы 2д3рён дъё2м 1дьё еб1рён е1вё 2евёр 2е1врё е2глё е1ё 2ежё е3зё е1лё 2епё ер1вё е1рё ерё3до ерё1к2 ес2чёт ет1вё е1тьё 2ёб ё1бра ёб1ры ё1ве ё1во 2ё1вре ё1ву ё1дру 2ё3душ 2ёже ё3зе ёз1о2г ё1зом ё1ка ё1ки 2ё1ко 2ё1кр ёк2ро ё1ку ё1ла ё1ле ё1лу ё1лы 2ёмуж ё2мч ё3на ён2д1р ёнс2 ёпат2 2ёпе ё2пл ё3пла ёп1лу ё3плы ё4пн 2ёпо ё4пт ё1ра ё1ре ё3ре. ё1ри ё1ро ёр3ск ё1ру ё1ры ё3с2а ё1ск ё2с1ка. ё2ске ё4с1ку. 2ёсл ё3со ё1ст ёс2тан ё3сту ё1та 2ётеч ё1ти ё1то ёто1с ёт1р ё1ту ё1ты ё1тю ё1тя ёха2т ёх1ато ёх3вал ёх3лоп ёх1опо ёх1ру 3жёв жё1с2 ж2жё за3мнё з1вё з2вёз 1зё з2наё 2знё 1з2о3рё з2отё зот2рё 3зуё зъё2м 2зымё 2и1вё иг1рён и1ё их1рё 1каё 1кё к3лён к2роё 3куё ла1стё лё3до лё1з2о3 лёк1л 1лён лё2ск лё4ска 1лёх 2лоён 1луё 3льё 1льщё 3м2нёш 3м2щё нд2рё не3ё 1нё нё1б2 3номё 1ньё од3рёб о1ё оё2жи о1лё 2омё о3м2нём о3м2нёт о2п1лёй о1рё о2скё от1вё 2о3тёк о3тёр от1рёк от1рёш о3фё пё1 пё2ст1р пё2тр 2плён п2лёнк плёс1к п1лёю поё2ж 3прёт причё2с1к р2блё 1рвёт .рё2бр 1рёзк рё1зна 1рё1зо рёз2у 1рёкш 3рёмо 1рёнк рё3ста рё3сто род2лё роё2м 1рьё с2дё се3стё 1с2ё сёкс4 сё2ст сёст1р 2скуё с1лёт с2тё 1стёл 1стён. с3тёт. с3тёте стё3х с3тёш с3т2лё счё2с1к 1сьё т1вёл т1воё 1т2ё тё2гн тё1зо 3тёка тёк1л 3тёкш тё4п1л тёр3к тё2ска тё2с1ки тё2с1ко тё2ску тё2хо 3т2кёт т1ревё 3т2рё2х т2рёшь тро2етёс 3тьё уг2нё уг1рё .уё2 у1ё у1лё у1рё у1стё у3тёр у1тьё у2чёб у3шё 2х3вё 1хлёб х2лёс ц2вё 1чё чёр2с чёрст1 .чё2с1к ч2тё 1чьё 2шлён 3шьё ъ2ё2р ыд2рё ырё2х ы3сё ь2ё ьё1зо ь2щё ю1ё яб3рё .не8 8не. 8бъ. 8въ. 8гъ. 8дъ. 8жъ. 8зъ. 8къ. 8лъ. 8мъ. 8нъ. 8пъ. 8ръ. 8съ. 8тъ. 8фъ. 8хъ. 8цъ. 8чъ. 8шъ. 8щъ. 8-7 --8 .а-8 .б-8 .в-8 .г-8 .д-8 .е-8 .ё-8 .ж-8 .з-8 .и-8 .й-8 .к-8 .л-8 .м-8 .н-8 .о-8 .п-8 .р-8 .с-8 .т-8 .у-8 .ф-8 .х-8 .ц-8 .ч-8 .ш-8 .щ-8 .ъ-8 .ы-8 .ь-8 .э-8 .ю-8 .я-8 -а8а8 8а8а- -а8б8 8а8б- -а8в8 8а8в- -а8г8 8а8г- -а8д8 8а8д- -а8е8 8а8е- -а8ё8 8а8ё- -а8ж8 8а8ж- -а8з8 8а8з- -а8и8 8а8и- -а8й8 8а8й- -а8к8 8а8к- -а8л8 8а8л- -а8м8 8а8м- -а8н8 8а8н- -а8о8 8а8о- -а8п8 8а8п- -а8р8 8а8р- -а8с8 8а8с- -а8т8 8а8т- -а8у8 8а8у- -а8ф8 8а8ф- -а8х8 8а8х- -а8ц8 8а8ц- -а8ч8 8а8ч- -а8ш8 8а8ш- -а8щ8 8а8щ- -а8ъ8 8а8ъ- -а8ы8 8а8ы- -а8ь8 8а8ь- -а8э8 8а8э- -а8ю8 8а8ю- -а8я8 8а8я- -б8а8 8б8а- -б8б8 8б8б- -б8в8 8б8в- -б8г8 8б8г- -б8д8 8б8д- -б8е8 8б8е- -б8ё8 8б8ё- -б8ж8 8б8ж- -б8з8 8б8з- -б8и8 8б8и- -б8й8 8б8й- -б8к8 8б8к- -б8л8 8б8л- -б8м8 8б8м- -б8н8 8б8н- -б8о8 8б8о- -б8п8 8б8п- -б8р8 8б8р- -б8с8 8б8с- -б8т8 8б8т- -б8у8 8б8у- -б8ф8 8б8ф- -б8х8 8б8х- -б8ц8 8б8ц- -б8ч8 8б8ч- -б8ш8 8б8ш- -б8щ8 8б8щ- -б8ъ8 8б8ъ- -б8ы8 8б8ы- -б8ь8 8б8ь- -б8э8 8б8э- -б8ю8 8б8ю- -б8я8 8б8я- -в8а8 8в8а- -в8б8 8в8б- -в8в8 8в8в- -в8г8 8в8г- -в8д8 8в8д- -в8е8 8в8е- -в8ё8 8в8ё- -в8ж8 8в8ж- -в8з8 8в8з- -в8и8 8в8и- -в8й8 8в8й- -в8к8 8в8к- -в8л8 8в8л- -в8м8 8в8м- -в8н8 8в8н- -в8о8 8в8о- -в8п8 8в8п- -в8р8 8в8р- -в8с8 8в8с- -в8т8 8в8т- -в8у8 8в8у- -в8ф8 8в8ф- -в8х8 8в8х- -в8ц8 8в8ц- -в8ч8 8в8ч- -в8ш8 8в8ш- -в8щ8 8в8щ- -в8ъ8 8в8ъ- -в8ы8 8в8ы- -в8ь8 8в8ь- -в8э8 8в8э- -в8ю8 8в8ю- -в8я8 8в8я- -г8а8 8г8а- -г8б8 8г8б- -г8в8 8г8в- -г8г8 8г8г- -г8д8 8г8д- -г8е8 8г8е- -г8ё8 8г8ё- -г8ж8 8г8ж- -г8з8 8г8з- -г8и8 8г8и- -г8й8 8г8й- -г8к8 8г8к- -г8л8 8г8л- -г8м8 8г8м- -г8н8 8г8н- -г8о8 8г8о- -г8п8 8г8п- -г8р8 8г8р- -г8с8 8г8с- -г8т8 8г8т- -г8у8 8г8у- -г8ф8 8г8ф- -г8х8 8г8х- -г8ц8 8г8ц- -г8ч8 8г8ч- -г8ш8 8г8ш- -г8щ8 8г8щ- -г8ъ8 8г8ъ- -г8ы8 8г8ы- -г8ь8 8г8ь- -г8э8 8г8э- -г8ю8 8г8ю- -г8я8 8г8я- -д8а8 8д8а- -д8б8 8д8б- -д8в8 8д8в- -д8г8 8д8г- -д8д8 8д8д- -д8е8 8д8е- -д8ё8 8д8ё- -д8ж8 8д8ж- -д8з8 8д8з- -д8и8 8д8и- -д8й8 8д8й- -д8к8 8д8к- -д8л8 8д8л- -д8м8 8д8м- -д8н8 8д8н- -д8о8 8д8о- -д8п8 8д8п- -д8р8 8д8р- -д8с8 8д8с- -д8т8 8д8т- -д8у8 8д8у- -д8ф8 8д8ф- -д8х8 8д8х- -д8ц8 8д8ц- -д8ч8 8д8ч- -д8ш8 8д8ш- -д8щ8 8д8щ- -д8ъ8 8д8ъ- -д8ы8 8д8ы- -д8ь8 8д8ь- -д8э8 8д8э- -д8ю8 8д8ю- -д8я8 8д8я- -е8а8 8е8а- -е8б8 8е8б- -е8в8 8е8в- -е8г8 8е8г- -е8д8 8е8д- -е8е8 8е8е- -е8ё8 8е8ё- -е8ж8 8е8ж- -е8з8 8е8з- -е8и8 8е8и- -е8й8 8е8й- -е8к8 8е8к- -е8л8 8е8л- -е8м8 8е8м- -е8н8 8е8н- -е8о8 8е8о- -е8п8 8е8п- -е8р8 8е8р- -е8с8 8е8с- -е8т8 8е8т- -е8у8 8е8у- -е8ф8 8е8ф- -е8х8 8е8х- -е8ц8 8е8ц- -е8ч8 8е8ч- -е8ш8 8е8ш- -е8щ8 8е8щ- -е8ъ8 8е8ъ- -е8ы8 8е8ы- -е8ь8 8е8ь- -е8э8 8е8э- -е8ю8 8е8ю- -е8я8 8е8я- -ё8а8 8ё8а- -ё8б8 8ё8б- -ё8в8 8ё8в- -ё8г8 8ё8г- -ё8д8 8ё8д- -ё8е8 8ё8е- -ё8ё8 8ё8ё- -ё8ж8 8ё8ж- -ё8з8 8ё8з- -ё8и8 8ё8и- -ё8й8 8ё8й- -ё8к8 8ё8к- -ё8л8 8ё8л- -ё8м8 8ё8м- -ё8н8 8ё8н- -ё8о8 8ё8о- -ё8п8 8ё8п- -ё8р8 8ё8р- -ё8с8 8ё8с- -ё8т8 8ё8т- -ё8у8 8ё8у- -ё8ф8 8ё8ф- -ё8х8 8ё8х- -ё8ц8 8ё8ц- -ё8ч8 8ё8ч- -ё8ш8 8ё8ш- -ё8щ8 8ё8щ- -ё8ъ8 8ё8ъ- -ё8ы8 8ё8ы- -ё8ь8 8ё8ь- -ё8э8 8ё8э- -ё8ю8 8ё8ю- -ё8я8 8ё8я- -ж8а8 8ж8а- -ж8б8 8ж8б- -ж8в8 8ж8в- -ж8г8 8ж8г- -ж8д8 8ж8д- -ж8е8 8ж8е- -ж8ё8 8ж8ё- -ж8ж8 8ж8ж- -ж8з8 8ж8з- -ж8и8 8ж8и- -ж8й8 8ж8й- -ж8к8 8ж8к- -ж8л8 8ж8л- -ж8м8 8ж8м- -ж8н8 8ж8н- -ж8о8 8ж8о- -ж8п8 8ж8п- -ж8р8 8ж8р- -ж8с8 8ж8с- -ж8т8 8ж8т- -ж8у8 8ж8у- -ж8ф8 8ж8ф- -ж8х8 8ж8х- -ж8ц8 8ж8ц- -ж8ч8 8ж8ч- -ж8ш8 8ж8ш- -ж8щ8 8ж8щ- -ж8ъ8 8ж8ъ- -ж8ы8 8ж8ы- -ж8ь8 8ж8ь- -ж8э8 8ж8э- -ж8ю8 8ж8ю- -ж8я8 8ж8я- -з8а8 8з8а- -з8б8 8з8б- -з8в8 8з8в- -з8г8 8з8г- -з8д8 8з8д- -з8е8 8з8е- -з8ё8 8з8ё- -з8ж8 8з8ж- -з8з8 8з8з- -з8и8 8з8и- -з8й8 8з8й- -з8к8 8з8к- -з8л8 8з8л- -з8м8 8з8м- -з8н8 8з8н- -з8о8 8з8о- -з8п8 8з8п- -з8р8 8з8р- -з8с8 8з8с- -з8т8 8з8т- -з8у8 8з8у- -з8ф8 8з8ф- -з8х8 8з8х- -з8ц8 8з8ц- -з8ч8 8з8ч- -з8ш8 8з8ш- -з8щ8 8з8щ- -з8ъ8 8з8ъ- -з8ы8 8з8ы- -з8ь8 8з8ь- -з8э8 8з8э- -з8ю8 8з8ю- -з8я8 8з8я- -и8а8 8и8а- -и8б8 8и8б- -и8в8 8и8в- -и8г8 8и8г- -и8д8 8и8д- -и8е8 8и8е- -и8ё8 8и8ё- -и8ж8 8и8ж- -и8з8 8и8з- -и8и8 8и8и- -и8й8 8и8й- -и8к8 8и8к- -и8л8 8и8л- -и8м8 8и8м- -и8н8 8и8н- -и8о8 8и8о- -и8п8 8и8п- -и8р8 8и8р- -и8с8 8и8с- -и8т8 8и8т- -и8у8 8и8у- -и8ф8 8и8ф- -и8х8 8и8х- -и8ц8 8и8ц- -и8ч8 8и8ч- -и8ш8 8и8ш- -и8щ8 8и8щ- -и8ъ8 8и8ъ- -и8ы8 8и8ы- -и8ь8 8и8ь- -и8э8 8и8э- -и8ю8 8и8ю- -и8я8 8и8я- -й8а8 8й8а- -й8б8 8й8б- -й8в8 8й8в- -й8г8 8й8г- -й8д8 8й8д- -й8е8 8й8е- -й8ё8 8й8ё- -й8ж8 8й8ж- -й8з8 8й8з- -й8и8 8й8и- -й8й8 8й8й- -й8к8 8й8к- -й8л8 8й8л- -й8м8 8й8м- -й8н8 8й8н- -й8о8 8й8о- -й8п8 8й8п- -й8р8 8й8р- -й8с8 8й8с- -й8т8 8й8т- -й8у8 8й8у- -й8ф8 8й8ф- -й8х8 8й8х- -й8ц8 8й8ц- -й8ч8 8й8ч- -й8ш8 8й8ш- -й8щ8 8й8щ- -й8ъ8 8й8ъ- -й8ы8 8й8ы- -й8ь8 8й8ь- -й8э8 8й8э- -й8ю8 8й8ю- -й8я8 8й8я- -к8а8 8к8а- -к8б8 8к8б- -к8в8 8к8в- -к8г8 8к8г- -к8д8 8к8д- -к8е8 8к8е- -к8ё8 8к8ё- -к8ж8 8к8ж- -к8з8 8к8з- -к8и8 8к8и- -к8й8 8к8й- -к8к8 8к8к- -к8л8 8к8л- -к8м8 8к8м- -к8н8 8к8н- -к8о8 8к8о- -к8п8 8к8п- -к8р8 8к8р- -к8с8 8к8с- -к8т8 8к8т- -к8у8 8к8у- -к8ф8 8к8ф- -к8х8 8к8х- -к8ц8 8к8ц- -к8ч8 8к8ч- -к8ш8 8к8ш- -к8щ8 8к8щ- -к8ъ8 8к8ъ- -к8ы8 8к8ы- -к8ь8 8к8ь- -к8э8 8к8э- -к8ю8 8к8ю- -к8я8 8к8я- -л8а8 8л8а- -л8б8 8л8б- -л8в8 8л8в- -л8г8 8л8г- -л8д8 8л8д- -л8е8 8л8е- -л8ё8 8л8ё- -л8ж8 8л8ж- -л8з8 8л8з- -л8и8 8л8и- -л8й8 8л8й- -л8к8 8л8к- -л8л8 8л8л- -л8м8 8л8м- -л8н8 8л8н- -л8о8 8л8о- -л8п8 8л8п- -л8р8 8л8р- -л8с8 8л8с- -л8т8 8л8т- -л8у8 8л8у- -л8ф8 8л8ф- -л8х8 8л8х- -л8ц8 8л8ц- -л8ч8 8л8ч- -л8ш8 8л8ш- -л8щ8 8л8щ- -л8ъ8 8л8ъ- -л8ы8 8л8ы- -л8ь8 8л8ь- -л8э8 8л8э- -л8ю8 8л8ю- -л8я8 8л8я- -м8а8 8м8а- -м8б8 8м8б- -м8в8 8м8в- -м8г8 8м8г- -м8д8 8м8д- -м8е8 8м8е- -м8ё8 8м8ё- -м8ж8 8м8ж- -м8з8 8м8з- -м8и8 8м8и- -м8й8 8м8й- -м8к8 8м8к- -м8л8 8м8л- -м8м8 8м8м- -м8н8 8м8н- -м8о8 8м8о- -м8п8 8м8п- -м8р8 8м8р- -м8с8 8м8с- -м8т8 8м8т- -м8у8 8м8у- -м8ф8 8м8ф- -м8х8 8м8х- -м8ц8 8м8ц- -м8ч8 8м8ч- -м8ш8 8м8ш- -м8щ8 8м8щ- -м8ъ8 8м8ъ- -м8ы8 8м8ы- -м8ь8 8м8ь- -м8э8 8м8э- -м8ю8 8м8ю- -м8я8 8м8я- -н8а8 8н8а- -н8б8 8н8б- -н8в8 8н8в- -н8г8 8н8г- -н8д8 8н8д- -н8е8 8н8е- -н8ё8 8н8ё- -н8ж8 8н8ж- -н8з8 8н8з- -н8и8 8н8и- -н8й8 8н8й- -н8к8 8н8к- -н8л8 8н8л- -н8м8 8н8м- -н8н8 8н8н- -н8о8 8н8о- -н8п8 8н8п- -н8р8 8н8р- -н8с8 8н8с- -н8т8 8н8т- -н8у8 8н8у- -н8ф8 8н8ф- -н8х8 8н8х- -н8ц8 8н8ц- -н8ч8 8н8ч- -н8ш8 8н8ш- -н8щ8 8н8щ- -н8ъ8 8н8ъ- -н8ы8 8н8ы- -н8ь8 8н8ь- -н8э8 8н8э- -н8ю8 8н8ю- -н8я8 8н8я- -о8а8 8о8а- -о8б8 8о8б- -о8в8 8о8в- -о8г8 8о8г- -о8д8 8о8д- -о8е8 8о8е- -о8ё8 8о8ё- -о8ж8 8о8ж- -о8з8 8о8з- -о8и8 8о8и- -о8й8 8о8й- -о8к8 8о8к- -о8л8 8о8л- -о8м8 8о8м- -о8н8 8о8н- -о8о8 8о8о- -о8п8 8о8п- -о8р8 8о8р- -о8с8 8о8с- -о8т8 8о8т- -о8у8 8о8у- -о8ф8 8о8ф- -о8х8 8о8х- -о8ц8 8о8ц- -о8ч8 8о8ч- -о8ш8 8о8ш- -о8щ8 8о8щ- -о8ъ8 8о8ъ- -о8ы8 8о8ы- -о8ь8 8о8ь- -о8э8 8о8э- -о8ю8 8о8ю- -о8я8 8о8я- -п8а8 8п8а- -п8б8 8п8б- -п8в8 8п8в- -п8г8 8п8г- -п8д8 8п8д- -п8е8 8п8е- -п8ё8 8п8ё- -п8ж8 8п8ж- -п8з8 8п8з- -п8и8 8п8и- -п8й8 8п8й- -п8к8 8п8к- -п8л8 8п8л- -п8м8 8п8м- -п8н8 8п8н- -п8о8 8п8о- -п8п8 8п8п- -п8р8 8п8р- -п8с8 8п8с- -п8т8 8п8т- -п8у8 8п8у- -п8ф8 8п8ф- -п8х8 8п8х- -п8ц8 8п8ц- -п8ч8 8п8ч- -п8ш8 8п8ш- -п8щ8 8п8щ- -п8ъ8 8п8ъ- -п8ы8 8п8ы- -п8ь8 8п8ь- -п8э8 8п8э- -п8ю8 8п8ю- -п8я8 8п8я- -р8а8 8р8а- -р8б8 8р8б- -р8в8 8р8в- -р8г8 8р8г- -р8д8 8р8д- -р8е8 8р8е- -р8ё8 8р8ё- -р8ж8 8р8ж- -р8з8 8р8з- -р8и8 8р8и- -р8й8 8р8й- -р8к8 8р8к- -р8л8 8р8л- -р8м8 8р8м- -р8н8 8р8н- -р8о8 8р8о- -р8п8 8р8п- -р8р8 8р8р- -р8с8 8р8с- -р8т8 8р8т- -р8у8 8р8у- -р8ф8 8р8ф- -р8х8 8р8х- -р8ц8 8р8ц- -р8ч8 8р8ч- -р8ш8 8р8ш- -р8щ8 8р8щ- -р8ъ8 8р8ъ- -р8ы8 8р8ы- -р8ь8 8р8ь- -р8э8 8р8э- -р8ю8 8р8ю- -р8я8 8р8я- -с8а8 8с8а- -с8б8 8с8б- -с8в8 8с8в- -с8г8 8с8г- -с8д8 8с8д- -с8е8 8с8е- -с8ё8 8с8ё- -с8ж8 8с8ж- -с8з8 8с8з- -с8и8 8с8и- -с8й8 8с8й- -с8к8 8с8к- -с8л8 8с8л- -с8м8 8с8м- -с8н8 8с8н- -с8о8 8с8о- -с8п8 8с8п- -с8р8 8с8р- -с8с8 8с8с- -с8т8 8с8т- -с8у8 8с8у- -с8ф8 8с8ф- -с8х8 8с8х- -с8ц8 8с8ц- -с8ч8 8с8ч- -с8ш8 8с8ш- -с8щ8 8с8щ- -с8ъ8 8с8ъ- -с8ы8 8с8ы- -с8ь8 8с8ь- -с8э8 8с8э- -с8ю8 8с8ю- -с8я8 8с8я- -т8а8 8т8а- -т8б8 8т8б- -т8в8 8т8в- -т8г8 8т8г- -т8д8 8т8д- -т8е8 8т8е- -т8ё8 8т8ё- -т8ж8 8т8ж- -т8з8 8т8з- -т8и8 8т8и- -т8й8 8т8й- -т8к8 8т8к- -т8л8 8т8л- -т8м8 8т8м- -т8н8 8т8н- -т8о8 8т8о- -т8п8 8т8п- -т8р8 8т8р- -т8с8 8т8с- -т8т8 8т8т- -т8у8 8т8у- -т8ф8 8т8ф- -т8х8 8т8х- -т8ц8 8т8ц- -т8ч8 8т8ч- -т8ш8 8т8ш- -т8щ8 8т8щ- -т8ъ8 8т8ъ- -т8ы8 8т8ы- -т8ь8 8т8ь- -т8э8 8т8э- -т8ю8 8т8ю- -т8я8 8т8я- -у8а8 8у8а- -у8б8 8у8б- -у8в8 8у8в- -у8г8 8у8г- -у8д8 8у8д- -у8е8 8у8е- -у8ё8 8у8ё- -у8ж8 8у8ж- -у8з8 8у8з- -у8и8 8у8и- -у8й8 8у8й- -у8к8 8у8к- -у8л8 8у8л- -у8м8 8у8м- -у8н8 8у8н- -у8о8 8у8о- -у8п8 8у8п- -у8р8 8у8р- -у8с8 8у8с- -у8т8 8у8т- -у8у8 8у8у- -у8ф8 8у8ф- -у8х8 8у8х- -у8ц8 8у8ц- -у8ч8 8у8ч- -у8ш8 8у8ш- -у8щ8 8у8щ- -у8ъ8 8у8ъ- -у8ы8 8у8ы- -у8ь8 8у8ь- -у8э8 8у8э- -у8ю8 8у8ю- -у8я8 8у8я- -ф8а8 8ф8а- -ф8б8 8ф8б- -ф8в8 8ф8в- -ф8г8 8ф8г- -ф8д8 8ф8д- -ф8е8 8ф8е- -ф8ё8 8ф8ё- -ф8ж8 8ф8ж- -ф8з8 8ф8з- -ф8и8 8ф8и- -ф8й8 8ф8й- -ф8к8 8ф8к- -ф8л8 8ф8л- -ф8м8 8ф8м- -ф8н8 8ф8н- -ф8о8 8ф8о- -ф8п8 8ф8п- -ф8р8 8ф8р- -ф8с8 8ф8с- -ф8т8 8ф8т- -ф8у8 8ф8у- -ф8ф8 8ф8ф- -ф8х8 8ф8х- -ф8ц8 8ф8ц- -ф8ч8 8ф8ч- -ф8ш8 8ф8ш- -ф8щ8 8ф8щ- -ф8ъ8 8ф8ъ- -ф8ы8 8ф8ы- -ф8ь8 8ф8ь- -ф8э8 8ф8э- -ф8ю8 8ф8ю- -ф8я8 8ф8я- -х8а8 8х8а- -х8б8 8х8б- -х8в8 8х8в- -х8г8 8х8г- -х8д8 8х8д- -х8е8 8х8е- -х8ё8 8х8ё- -х8ж8 8х8ж- -х8з8 8х8з- -х8и8 8х8и- -х8й8 8х8й- -х8к8 8х8к- -х8л8 8х8л- -х8м8 8х8м- -х8н8 8х8н- -х8о8 8х8о- -х8п8 8х8п- -х8р8 8х8р- -х8с8 8х8с- -х8т8 8х8т- -х8у8 8х8у- -х8ф8 8х8ф- -х8х8 8х8х- -х8ц8 8х8ц- -х8ч8 8х8ч- -х8ш8 8х8ш- -х8щ8 8х8щ- -х8ъ8 8х8ъ- -х8ы8 8х8ы- -х8ь8 8х8ь- -х8э8 8х8э- -х8ю8 8х8ю- -х8я8 8х8я- -ц8а8 8ц8а- -ц8б8 8ц8б- -ц8в8 8ц8в- -ц8г8 8ц8г- -ц8д8 8ц8д- -ц8е8 8ц8е- -ц8ё8 8ц8ё- -ц8ж8 8ц8ж- -ц8з8 8ц8з- -ц8и8 8ц8и- -ц8й8 8ц8й- -ц8к8 8ц8к- -ц8л8 8ц8л- -ц8м8 8ц8м- -ц8н8 8ц8н- -ц8о8 8ц8о- -ц8п8 8ц8п- -ц8р8 8ц8р- -ц8с8 8ц8с- -ц8т8 8ц8т- -ц8у8 8ц8у- -ц8ф8 8ц8ф- -ц8х8 8ц8х- -ц8ц8 8ц8ц- -ц8ч8 8ц8ч- -ц8ш8 8ц8ш- -ц8щ8 8ц8щ- -ц8ъ8 8ц8ъ- -ц8ы8 8ц8ы- -ц8ь8 8ц8ь- -ц8э8 8ц8э- -ц8ю8 8ц8ю- -ц8я8 8ц8я- -ч8а8 8ч8а- -ч8б8 8ч8б- -ч8в8 8ч8в- -ч8г8 8ч8г- -ч8д8 8ч8д- -ч8е8 8ч8е- -ч8ё8 8ч8ё- -ч8ж8 8ч8ж- -ч8з8 8ч8з- -ч8и8 8ч8и- -ч8й8 8ч8й- -ч8к8 8ч8к- -ч8л8 8ч8л- -ч8м8 8ч8м- -ч8н8 8ч8н- -ч8о8 8ч8о- -ч8п8 8ч8п- -ч8р8 8ч8р- -ч8с8 8ч8с- -ч8т8 8ч8т- -ч8у8 8ч8у- -ч8ф8 8ч8ф- -ч8х8 8ч8х- -ч8ц8 8ч8ц- -ч8ч8 8ч8ч- -ч8ш8 8ч8ш- -ч8щ8 8ч8щ- -ч8ъ8 8ч8ъ- -ч8ы8 8ч8ы- -ч8ь8 8ч8ь- -ч8э8 8ч8э- -ч8ю8 8ч8ю- -ч8я8 8ч8я- -ш8а8 8ш8а- -ш8б8 8ш8б- -ш8в8 8ш8в- -ш8г8 8ш8г- -ш8д8 8ш8д- -ш8е8 8ш8е- -ш8ё8 8ш8ё- -ш8ж8 8ш8ж- -ш8з8 8ш8з- -ш8и8 8ш8и- -ш8й8 8ш8й- -ш8к8 8ш8к- -ш8л8 8ш8л- -ш8м8 8ш8м- -ш8н8 8ш8н- -ш8о8 8ш8о- -ш8п8 8ш8п- -ш8р8 8ш8р- -ш8с8 8ш8с- -ш8т8 8ш8т- -ш8у8 8ш8у- -ш8ф8 8ш8ф- -ш8х8 8ш8х- -ш8ц8 8ш8ц- -ш8ч8 8ш8ч- -ш8ш8 8ш8ш- -ш8щ8 8ш8щ- -ш8ъ8 8ш8ъ- -ш8ы8 8ш8ы- -ш8ь8 8ш8ь- -ш8э8 8ш8э- -ш8ю8 8ш8ю- -ш8я8 8ш8я- -щ8а8 8щ8а- -щ8б8 8щ8б- -щ8в8 8щ8в- -щ8г8 8щ8г- -щ8д8 8щ8д- -щ8е8 8щ8е- -щ8ё8 8щ8ё- -щ8ж8 8щ8ж- -щ8з8 8щ8з- -щ8и8 8щ8и- -щ8й8 8щ8й- -щ8к8 8щ8к- -щ8л8 8щ8л- -щ8м8 8щ8м- -щ8н8 8щ8н- -щ8о8 8щ8о- -щ8п8 8щ8п- -щ8р8 8щ8р- -щ8с8 8щ8с- -щ8т8 8щ8т- -щ8у8 8щ8у- -щ8ф8 8щ8ф- -щ8х8 8щ8х- -щ8ц8 8щ8ц- -щ8ч8 8щ8ч- -щ8ш8 8щ8ш- -щ8щ8 8щ8щ- -щ8ъ8 8щ8ъ- -щ8ы8 8щ8ы- -щ8ь8 8щ8ь- -щ8э8 8щ8э- -щ8ю8 8щ8ю- -щ8я8 8щ8я- -ъ8а8 8ъ8а- -ъ8б8 8ъ8б- -ъ8в8 8ъ8в- -ъ8г8 8ъ8г- -ъ8д8 8ъ8д- -ъ8е8 8ъ8е- -ъ8ё8 8ъ8ё- -ъ8ж8 8ъ8ж- -ъ8з8 8ъ8з- -ъ8и8 8ъ8и- -ъ8й8 8ъ8й- -ъ8к8 8ъ8к- -ъ8л8 8ъ8л- -ъ8м8 8ъ8м- -ъ8н8 8ъ8н- -ъ8о8 8ъ8о- -ъ8п8 8ъ8п- -ъ8р8 8ъ8р- -ъ8с8 8ъ8с- -ъ8т8 8ъ8т- -ъ8у8 8ъ8у- -ъ8ф8 8ъ8ф- -ъ8х8 8ъ8х- -ъ8ц8 8ъ8ц- -ъ8ч8 8ъ8ч- -ъ8ш8 8ъ8ш- -ъ8щ8 8ъ8щ- -ъ8ъ8 8ъ8ъ- -ъ8ы8 8ъ8ы- -ъ8ь8 8ъ8ь- -ъ8э8 8ъ8э- -ъ8ю8 8ъ8ю- -ъ8я8 8ъ8я- -ы8а8 8ы8а- -ы8б8 8ы8б- -ы8в8 8ы8в- -ы8г8 8ы8г- -ы8д8 8ы8д- -ы8е8 8ы8е- -ы8ё8 8ы8ё- -ы8ж8 8ы8ж- -ы8з8 8ы8з- -ы8и8 8ы8и- -ы8й8 8ы8й- -ы8к8 8ы8к- -ы8л8 8ы8л- -ы8м8 8ы8м- -ы8н8 8ы8н- -ы8о8 8ы8о- -ы8п8 8ы8п- -ы8р8 8ы8р- -ы8с8 8ы8с- -ы8т8 8ы8т- -ы8у8 8ы8у- -ы8ф8 8ы8ф- -ы8х8 8ы8х- -ы8ц8 8ы8ц- -ы8ч8 8ы8ч- -ы8ш8 8ы8ш- -ы8щ8 8ы8щ- -ы8ъ8 8ы8ъ- -ы8ы8 8ы8ы- -ы8ь8 8ы8ь- -ы8э8 8ы8э- -ы8ю8 8ы8ю- -ы8я8 8ы8я- -ь8а8 8ь8а- -ь8б8 8ь8б- -ь8в8 8ь8в- -ь8г8 8ь8г- -ь8д8 8ь8д- -ь8е8 8ь8е- -ь8ё8 8ь8ё- -ь8ж8 8ь8ж- -ь8з8 8ь8з- -ь8и8 8ь8и- -ь8й8 8ь8й- -ь8к8 8ь8к- -ь8л8 8ь8л- -ь8м8 8ь8м- -ь8н8 8ь8н- -ь8о8 8ь8о- -ь8п8 8ь8п- -ь8р8 8ь8р- -ь8с8 8ь8с- -ь8т8 8ь8т- -ь8у8 8ь8у- -ь8ф8 8ь8ф- -ь8х8 8ь8х- -ь8ц8 8ь8ц- -ь8ч8 8ь8ч- -ь8ш8 8ь8ш- -ь8щ8 8ь8щ- -ь8ъ8 8ь8ъ- -ь8ы8 8ь8ы- -ь8ь8 8ь8ь- -ь8э8 8ь8э- -ь8ю8 8ь8ю- -ь8я8 8ь8я- -э8а8 8э8а- -э8б8 8э8б- -э8в8 8э8в- -э8г8 8э8г- -э8д8 8э8д- -э8е8 8э8е- -э8ё8 8э8ё- -э8ж8 8э8ж- -э8з8 8э8з- -э8и8 8э8и- -э8й8 8э8й- -э8к8 8э8к- -э8л8 8э8л- -э8м8 8э8м- -э8н8 8э8н- -э8о8 8э8о- -э8п8 8э8п- -э8р8 8э8р- -э8с8 8э8с- -э8т8 8э8т- -э8у8 8э8у- -э8ф8 8э8ф- -э8х8 8э8х- -э8ц8 8э8ц- -э8ч8 8э8ч- -э8ш8 8э8ш- -э8щ8 8э8щ- -э8ъ8 8э8ъ- -э8ы8 8э8ы- -э8ь8 8э8ь- -э8э8 8э8э- -э8ю8 8э8ю- -э8я8 8э8я- -ю8а8 8ю8а- -ю8б8 8ю8б- -ю8в8 8ю8в- -ю8г8 8ю8г- -ю8д8 8ю8д- -ю8е8 8ю8е- -ю8ё8 8ю8ё- -ю8ж8 8ю8ж- -ю8з8 8ю8з- -ю8и8 8ю8и- -ю8й8 8ю8й- -ю8к8 8ю8к- -ю8л8 8ю8л- -ю8м8 8ю8м- -ю8н8 8ю8н- -ю8о8 8ю8о- -ю8п8 8ю8п- -ю8р8 8ю8р- -ю8с8 8ю8с- -ю8т8 8ю8т- -ю8у8 8ю8у- -ю8ф8 8ю8ф- -ю8х8 8ю8х- -ю8ц8 8ю8ц- -ю8ч8 8ю8ч- -ю8ш8 8ю8ш- -ю8щ8 8ю8щ- -ю8ъ8 8ю8ъ- -ю8ы8 8ю8ы- -ю8ь8 8ю8ь- -ю8э8 8ю8э- -ю8ю8 8ю8ю- -ю8я8 8ю8я- -я8а8 8я8а- -я8б8 8я8б- -я8в8 8я8в- -я8г8 8я8г- -я8д8 8я8д- -я8е8 8я8е- -я8ё8 8я8ё- -я8ж8 8я8ж- -я8з8 8я8з- -я8и8 8я8и- -я8й8 8я8й- -я8к8 8я8к- -я8л8 8я8л- -я8м8 8я8м- -я8н8 8я8н- -я8о8 8я8о- -я8п8 8я8п- -я8р8 8я8р- -я8с8 8я8с- -я8т8 8я8т- -я8у8 8я8у- -я8ф8 8я8ф- -я8х8 8я8х- -я8ц8 8я8ц- -я8ч8 8я8ч- -я8ш8 8я8ш- -я8щ8 8я8щ- -я8ъ8 8я8ъ- -я8ы8 8я8ы- -я8ь8 8я8ь- -я8э8 8я8э- -я8ю8 8я8ю- -я8я8 8я8я-",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=7021,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-ru.pat b/Master/texmf-dist/tex/context/patterns/lang-ru.pat
index 7f5a4502b89..0050b6e5cc1 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-ru.pat
+++ b/Master/texmf-dist/tex/context/patterns/lang-ru.pat
@@ -2,7 +2,7 @@
% for comment and copyright, see e:/tmp/patterns/lang-ru.rme
-% used: а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ё
+% used: - а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ё
\patterns{
.аб1р
@@ -4812,4 +4812,2217 @@
8цъ.
8чъ.
8шъ.
-8щъ.} \ No newline at end of file
+8щъ.
+8-7
+--8
+.а-8
+.б-8
+.в-8
+.г-8
+.д-8
+.е-8
+.ё-8
+.ж-8
+.з-8
+.и-8
+.й-8
+.к-8
+.л-8
+.м-8
+.н-8
+.о-8
+.п-8
+.р-8
+.с-8
+.т-8
+.у-8
+.ф-8
+.х-8
+.ц-8
+.ч-8
+.ш-8
+.щ-8
+.ъ-8
+.ы-8
+.ь-8
+.э-8
+.ю-8
+.я-8
+-а8а8
+8а8а-
+-а8б8
+8а8б-
+-а8в8
+8а8в-
+-а8г8
+8а8г-
+-а8д8
+8а8д-
+-а8е8
+8а8е-
+-а8ё8
+8а8ё-
+-а8ж8
+8а8ж-
+-а8з8
+8а8з-
+-а8и8
+8а8и-
+-а8й8
+8а8й-
+-а8к8
+8а8к-
+-а8л8
+8а8л-
+-а8м8
+8а8м-
+-а8н8
+8а8н-
+-а8о8
+8а8о-
+-а8п8
+8а8п-
+-а8р8
+8а8р-
+-а8с8
+8а8с-
+-а8т8
+8а8т-
+-а8у8
+8а8у-
+-а8ф8
+8а8ф-
+-а8х8
+8а8х-
+-а8ц8
+8а8ц-
+-а8ч8
+8а8ч-
+-а8ш8
+8а8ш-
+-а8щ8
+8а8щ-
+-а8ъ8
+8а8ъ-
+-а8ы8
+8а8ы-
+-а8ь8
+8а8ь-
+-а8э8
+8а8э-
+-а8ю8
+8а8ю-
+-а8я8
+8а8я-
+-б8а8
+8б8а-
+-б8б8
+8б8б-
+-б8в8
+8б8в-
+-б8г8
+8б8г-
+-б8д8
+8б8д-
+-б8е8
+8б8е-
+-б8ё8
+8б8ё-
+-б8ж8
+8б8ж-
+-б8з8
+8б8з-
+-б8и8
+8б8и-
+-б8й8
+8б8й-
+-б8к8
+8б8к-
+-б8л8
+8б8л-
+-б8м8
+8б8м-
+-б8н8
+8б8н-
+-б8о8
+8б8о-
+-б8п8
+8б8п-
+-б8р8
+8б8р-
+-б8с8
+8б8с-
+-б8т8
+8б8т-
+-б8у8
+8б8у-
+-б8ф8
+8б8ф-
+-б8х8
+8б8х-
+-б8ц8
+8б8ц-
+-б8ч8
+8б8ч-
+-б8ш8
+8б8ш-
+-б8щ8
+8б8щ-
+-б8ъ8
+8б8ъ-
+-б8ы8
+8б8ы-
+-б8ь8
+8б8ь-
+-б8э8
+8б8э-
+-б8ю8
+8б8ю-
+-б8я8
+8б8я-
+-в8а8
+8в8а-
+-в8б8
+8в8б-
+-в8в8
+8в8в-
+-в8г8
+8в8г-
+-в8д8
+8в8д-
+-в8е8
+8в8е-
+-в8ё8
+8в8ё-
+-в8ж8
+8в8ж-
+-в8з8
+8в8з-
+-в8и8
+8в8и-
+-в8й8
+8в8й-
+-в8к8
+8в8к-
+-в8л8
+8в8л-
+-в8м8
+8в8м-
+-в8н8
+8в8н-
+-в8о8
+8в8о-
+-в8п8
+8в8п-
+-в8р8
+8в8р-
+-в8с8
+8в8с-
+-в8т8
+8в8т-
+-в8у8
+8в8у-
+-в8ф8
+8в8ф-
+-в8х8
+8в8х-
+-в8ц8
+8в8ц-
+-в8ч8
+8в8ч-
+-в8ш8
+8в8ш-
+-в8щ8
+8в8щ-
+-в8ъ8
+8в8ъ-
+-в8ы8
+8в8ы-
+-в8ь8
+8в8ь-
+-в8э8
+8в8э-
+-в8ю8
+8в8ю-
+-в8я8
+8в8я-
+-г8а8
+8г8а-
+-г8б8
+8г8б-
+-г8в8
+8г8в-
+-г8г8
+8г8г-
+-г8д8
+8г8д-
+-г8е8
+8г8е-
+-г8ё8
+8г8ё-
+-г8ж8
+8г8ж-
+-г8з8
+8г8з-
+-г8и8
+8г8и-
+-г8й8
+8г8й-
+-г8к8
+8г8к-
+-г8л8
+8г8л-
+-г8м8
+8г8м-
+-г8н8
+8г8н-
+-г8о8
+8г8о-
+-г8п8
+8г8п-
+-г8р8
+8г8р-
+-г8с8
+8г8с-
+-г8т8
+8г8т-
+-г8у8
+8г8у-
+-г8ф8
+8г8ф-
+-г8х8
+8г8х-
+-г8ц8
+8г8ц-
+-г8ч8
+8г8ч-
+-г8ш8
+8г8ш-
+-г8щ8
+8г8щ-
+-г8ъ8
+8г8ъ-
+-г8ы8
+8г8ы-
+-г8ь8
+8г8ь-
+-г8э8
+8г8э-
+-г8ю8
+8г8ю-
+-г8я8
+8г8я-
+-д8а8
+8д8а-
+-д8б8
+8д8б-
+-д8в8
+8д8в-
+-д8г8
+8д8г-
+-д8д8
+8д8д-
+-д8е8
+8д8е-
+-д8ё8
+8д8ё-
+-д8ж8
+8д8ж-
+-д8з8
+8д8з-
+-д8и8
+8д8и-
+-д8й8
+8д8й-
+-д8к8
+8д8к-
+-д8л8
+8д8л-
+-д8м8
+8д8м-
+-д8н8
+8д8н-
+-д8о8
+8д8о-
+-д8п8
+8д8п-
+-д8р8
+8д8р-
+-д8с8
+8д8с-
+-д8т8
+8д8т-
+-д8у8
+8д8у-
+-д8ф8
+8д8ф-
+-д8х8
+8д8х-
+-д8ц8
+8д8ц-
+-д8ч8
+8д8ч-
+-д8ш8
+8д8ш-
+-д8щ8
+8д8щ-
+-д8ъ8
+8д8ъ-
+-д8ы8
+8д8ы-
+-д8ь8
+8д8ь-
+-д8э8
+8д8э-
+-д8ю8
+8д8ю-
+-д8я8
+8д8я-
+-е8а8
+8е8а-
+-е8б8
+8е8б-
+-е8в8
+8е8в-
+-е8г8
+8е8г-
+-е8д8
+8е8д-
+-е8е8
+8е8е-
+-е8ё8
+8е8ё-
+-е8ж8
+8е8ж-
+-е8з8
+8е8з-
+-е8и8
+8е8и-
+-е8й8
+8е8й-
+-е8к8
+8е8к-
+-е8л8
+8е8л-
+-е8м8
+8е8м-
+-е8н8
+8е8н-
+-е8о8
+8е8о-
+-е8п8
+8е8п-
+-е8р8
+8е8р-
+-е8с8
+8е8с-
+-е8т8
+8е8т-
+-е8у8
+8е8у-
+-е8ф8
+8е8ф-
+-е8х8
+8е8х-
+-е8ц8
+8е8ц-
+-е8ч8
+8е8ч-
+-е8ш8
+8е8ш-
+-е8щ8
+8е8щ-
+-е8ъ8
+8е8ъ-
+-е8ы8
+8е8ы-
+-е8ь8
+8е8ь-
+-е8э8
+8е8э-
+-е8ю8
+8е8ю-
+-е8я8
+8е8я-
+-ё8а8
+8ё8а-
+-ё8б8
+8ё8б-
+-ё8в8
+8ё8в-
+-ё8г8
+8ё8г-
+-ё8д8
+8ё8д-
+-ё8е8
+8ё8е-
+-ё8ё8
+8ё8ё-
+-ё8ж8
+8ё8ж-
+-ё8з8
+8ё8з-
+-ё8и8
+8ё8и-
+-ё8й8
+8ё8й-
+-ё8к8
+8ё8к-
+-ё8л8
+8ё8л-
+-ё8м8
+8ё8м-
+-ё8н8
+8ё8н-
+-ё8о8
+8ё8о-
+-ё8п8
+8ё8п-
+-ё8р8
+8ё8р-
+-ё8с8
+8ё8с-
+-ё8т8
+8ё8т-
+-ё8у8
+8ё8у-
+-ё8ф8
+8ё8ф-
+-ё8х8
+8ё8х-
+-ё8ц8
+8ё8ц-
+-ё8ч8
+8ё8ч-
+-ё8ш8
+8ё8ш-
+-ё8щ8
+8ё8щ-
+-ё8ъ8
+8ё8ъ-
+-ё8ы8
+8ё8ы-
+-ё8ь8
+8ё8ь-
+-ё8э8
+8ё8э-
+-ё8ю8
+8ё8ю-
+-ё8я8
+8ё8я-
+-ж8а8
+8ж8а-
+-ж8б8
+8ж8б-
+-ж8в8
+8ж8в-
+-ж8г8
+8ж8г-
+-ж8д8
+8ж8д-
+-ж8е8
+8ж8е-
+-ж8ё8
+8ж8ё-
+-ж8ж8
+8ж8ж-
+-ж8з8
+8ж8з-
+-ж8и8
+8ж8и-
+-ж8й8
+8ж8й-
+-ж8к8
+8ж8к-
+-ж8л8
+8ж8л-
+-ж8м8
+8ж8м-
+-ж8н8
+8ж8н-
+-ж8о8
+8ж8о-
+-ж8п8
+8ж8п-
+-ж8р8
+8ж8р-
+-ж8с8
+8ж8с-
+-ж8т8
+8ж8т-
+-ж8у8
+8ж8у-
+-ж8ф8
+8ж8ф-
+-ж8х8
+8ж8х-
+-ж8ц8
+8ж8ц-
+-ж8ч8
+8ж8ч-
+-ж8ш8
+8ж8ш-
+-ж8щ8
+8ж8щ-
+-ж8ъ8
+8ж8ъ-
+-ж8ы8
+8ж8ы-
+-ж8ь8
+8ж8ь-
+-ж8э8
+8ж8э-
+-ж8ю8
+8ж8ю-
+-ж8я8
+8ж8я-
+-з8а8
+8з8а-
+-з8б8
+8з8б-
+-з8в8
+8з8в-
+-з8г8
+8з8г-
+-з8д8
+8з8д-
+-з8е8
+8з8е-
+-з8ё8
+8з8ё-
+-з8ж8
+8з8ж-
+-з8з8
+8з8з-
+-з8и8
+8з8и-
+-з8й8
+8з8й-
+-з8к8
+8з8к-
+-з8л8
+8з8л-
+-з8м8
+8з8м-
+-з8н8
+8з8н-
+-з8о8
+8з8о-
+-з8п8
+8з8п-
+-з8р8
+8з8р-
+-з8с8
+8з8с-
+-з8т8
+8з8т-
+-з8у8
+8з8у-
+-з8ф8
+8з8ф-
+-з8х8
+8з8х-
+-з8ц8
+8з8ц-
+-з8ч8
+8з8ч-
+-з8ш8
+8з8ш-
+-з8щ8
+8з8щ-
+-з8ъ8
+8з8ъ-
+-з8ы8
+8з8ы-
+-з8ь8
+8з8ь-
+-з8э8
+8з8э-
+-з8ю8
+8з8ю-
+-з8я8
+8з8я-
+-и8а8
+8и8а-
+-и8б8
+8и8б-
+-и8в8
+8и8в-
+-и8г8
+8и8г-
+-и8д8
+8и8д-
+-и8е8
+8и8е-
+-и8ё8
+8и8ё-
+-и8ж8
+8и8ж-
+-и8з8
+8и8з-
+-и8и8
+8и8и-
+-и8й8
+8и8й-
+-и8к8
+8и8к-
+-и8л8
+8и8л-
+-и8м8
+8и8м-
+-и8н8
+8и8н-
+-и8о8
+8и8о-
+-и8п8
+8и8п-
+-и8р8
+8и8р-
+-и8с8
+8и8с-
+-и8т8
+8и8т-
+-и8у8
+8и8у-
+-и8ф8
+8и8ф-
+-и8х8
+8и8х-
+-и8ц8
+8и8ц-
+-и8ч8
+8и8ч-
+-и8ш8
+8и8ш-
+-и8щ8
+8и8щ-
+-и8ъ8
+8и8ъ-
+-и8ы8
+8и8ы-
+-и8ь8
+8и8ь-
+-и8э8
+8и8э-
+-и8ю8
+8и8ю-
+-и8я8
+8и8я-
+-й8а8
+8й8а-
+-й8б8
+8й8б-
+-й8в8
+8й8в-
+-й8г8
+8й8г-
+-й8д8
+8й8д-
+-й8е8
+8й8е-
+-й8ё8
+8й8ё-
+-й8ж8
+8й8ж-
+-й8з8
+8й8з-
+-й8и8
+8й8и-
+-й8й8
+8й8й-
+-й8к8
+8й8к-
+-й8л8
+8й8л-
+-й8м8
+8й8м-
+-й8н8
+8й8н-
+-й8о8
+8й8о-
+-й8п8
+8й8п-
+-й8р8
+8й8р-
+-й8с8
+8й8с-
+-й8т8
+8й8т-
+-й8у8
+8й8у-
+-й8ф8
+8й8ф-
+-й8х8
+8й8х-
+-й8ц8
+8й8ц-
+-й8ч8
+8й8ч-
+-й8ш8
+8й8ш-
+-й8щ8
+8й8щ-
+-й8ъ8
+8й8ъ-
+-й8ы8
+8й8ы-
+-й8ь8
+8й8ь-
+-й8э8
+8й8э-
+-й8ю8
+8й8ю-
+-й8я8
+8й8я-
+-к8а8
+8к8а-
+-к8б8
+8к8б-
+-к8в8
+8к8в-
+-к8г8
+8к8г-
+-к8д8
+8к8д-
+-к8е8
+8к8е-
+-к8ё8
+8к8ё-
+-к8ж8
+8к8ж-
+-к8з8
+8к8з-
+-к8и8
+8к8и-
+-к8й8
+8к8й-
+-к8к8
+8к8к-
+-к8л8
+8к8л-
+-к8м8
+8к8м-
+-к8н8
+8к8н-
+-к8о8
+8к8о-
+-к8п8
+8к8п-
+-к8р8
+8к8р-
+-к8с8
+8к8с-
+-к8т8
+8к8т-
+-к8у8
+8к8у-
+-к8ф8
+8к8ф-
+-к8х8
+8к8х-
+-к8ц8
+8к8ц-
+-к8ч8
+8к8ч-
+-к8ш8
+8к8ш-
+-к8щ8
+8к8щ-
+-к8ъ8
+8к8ъ-
+-к8ы8
+8к8ы-
+-к8ь8
+8к8ь-
+-к8э8
+8к8э-
+-к8ю8
+8к8ю-
+-к8я8
+8к8я-
+-л8а8
+8л8а-
+-л8б8
+8л8б-
+-л8в8
+8л8в-
+-л8г8
+8л8г-
+-л8д8
+8л8д-
+-л8е8
+8л8е-
+-л8ё8
+8л8ё-
+-л8ж8
+8л8ж-
+-л8з8
+8л8з-
+-л8и8
+8л8и-
+-л8й8
+8л8й-
+-л8к8
+8л8к-
+-л8л8
+8л8л-
+-л8м8
+8л8м-
+-л8н8
+8л8н-
+-л8о8
+8л8о-
+-л8п8
+8л8п-
+-л8р8
+8л8р-
+-л8с8
+8л8с-
+-л8т8
+8л8т-
+-л8у8
+8л8у-
+-л8ф8
+8л8ф-
+-л8х8
+8л8х-
+-л8ц8
+8л8ц-
+-л8ч8
+8л8ч-
+-л8ш8
+8л8ш-
+-л8щ8
+8л8щ-
+-л8ъ8
+8л8ъ-
+-л8ы8
+8л8ы-
+-л8ь8
+8л8ь-
+-л8э8
+8л8э-
+-л8ю8
+8л8ю-
+-л8я8
+8л8я-
+-м8а8
+8м8а-
+-м8б8
+8м8б-
+-м8в8
+8м8в-
+-м8г8
+8м8г-
+-м8д8
+8м8д-
+-м8е8
+8м8е-
+-м8ё8
+8м8ё-
+-м8ж8
+8м8ж-
+-м8з8
+8м8з-
+-м8и8
+8м8и-
+-м8й8
+8м8й-
+-м8к8
+8м8к-
+-м8л8
+8м8л-
+-м8м8
+8м8м-
+-м8н8
+8м8н-
+-м8о8
+8м8о-
+-м8п8
+8м8п-
+-м8р8
+8м8р-
+-м8с8
+8м8с-
+-м8т8
+8м8т-
+-м8у8
+8м8у-
+-м8ф8
+8м8ф-
+-м8х8
+8м8х-
+-м8ц8
+8м8ц-
+-м8ч8
+8м8ч-
+-м8ш8
+8м8ш-
+-м8щ8
+8м8щ-
+-м8ъ8
+8м8ъ-
+-м8ы8
+8м8ы-
+-м8ь8
+8м8ь-
+-м8э8
+8м8э-
+-м8ю8
+8м8ю-
+-м8я8
+8м8я-
+-н8а8
+8н8а-
+-н8б8
+8н8б-
+-н8в8
+8н8в-
+-н8г8
+8н8г-
+-н8д8
+8н8д-
+-н8е8
+8н8е-
+-н8ё8
+8н8ё-
+-н8ж8
+8н8ж-
+-н8з8
+8н8з-
+-н8и8
+8н8и-
+-н8й8
+8н8й-
+-н8к8
+8н8к-
+-н8л8
+8н8л-
+-н8м8
+8н8м-
+-н8н8
+8н8н-
+-н8о8
+8н8о-
+-н8п8
+8н8п-
+-н8р8
+8н8р-
+-н8с8
+8н8с-
+-н8т8
+8н8т-
+-н8у8
+8н8у-
+-н8ф8
+8н8ф-
+-н8х8
+8н8х-
+-н8ц8
+8н8ц-
+-н8ч8
+8н8ч-
+-н8ш8
+8н8ш-
+-н8щ8
+8н8щ-
+-н8ъ8
+8н8ъ-
+-н8ы8
+8н8ы-
+-н8ь8
+8н8ь-
+-н8э8
+8н8э-
+-н8ю8
+8н8ю-
+-н8я8
+8н8я-
+-о8а8
+8о8а-
+-о8б8
+8о8б-
+-о8в8
+8о8в-
+-о8г8
+8о8г-
+-о8д8
+8о8д-
+-о8е8
+8о8е-
+-о8ё8
+8о8ё-
+-о8ж8
+8о8ж-
+-о8з8
+8о8з-
+-о8и8
+8о8и-
+-о8й8
+8о8й-
+-о8к8
+8о8к-
+-о8л8
+8о8л-
+-о8м8
+8о8м-
+-о8н8
+8о8н-
+-о8о8
+8о8о-
+-о8п8
+8о8п-
+-о8р8
+8о8р-
+-о8с8
+8о8с-
+-о8т8
+8о8т-
+-о8у8
+8о8у-
+-о8ф8
+8о8ф-
+-о8х8
+8о8х-
+-о8ц8
+8о8ц-
+-о8ч8
+8о8ч-
+-о8ш8
+8о8ш-
+-о8щ8
+8о8щ-
+-о8ъ8
+8о8ъ-
+-о8ы8
+8о8ы-
+-о8ь8
+8о8ь-
+-о8э8
+8о8э-
+-о8ю8
+8о8ю-
+-о8я8
+8о8я-
+-п8а8
+8п8а-
+-п8б8
+8п8б-
+-п8в8
+8п8в-
+-п8г8
+8п8г-
+-п8д8
+8п8д-
+-п8е8
+8п8е-
+-п8ё8
+8п8ё-
+-п8ж8
+8п8ж-
+-п8з8
+8п8з-
+-п8и8
+8п8и-
+-п8й8
+8п8й-
+-п8к8
+8п8к-
+-п8л8
+8п8л-
+-п8м8
+8п8м-
+-п8н8
+8п8н-
+-п8о8
+8п8о-
+-п8п8
+8п8п-
+-п8р8
+8п8р-
+-п8с8
+8п8с-
+-п8т8
+8п8т-
+-п8у8
+8п8у-
+-п8ф8
+8п8ф-
+-п8х8
+8п8х-
+-п8ц8
+8п8ц-
+-п8ч8
+8п8ч-
+-п8ш8
+8п8ш-
+-п8щ8
+8п8щ-
+-п8ъ8
+8п8ъ-
+-п8ы8
+8п8ы-
+-п8ь8
+8п8ь-
+-п8э8
+8п8э-
+-п8ю8
+8п8ю-
+-п8я8
+8п8я-
+-р8а8
+8р8а-
+-р8б8
+8р8б-
+-р8в8
+8р8в-
+-р8г8
+8р8г-
+-р8д8
+8р8д-
+-р8е8
+8р8е-
+-р8ё8
+8р8ё-
+-р8ж8
+8р8ж-
+-р8з8
+8р8з-
+-р8и8
+8р8и-
+-р8й8
+8р8й-
+-р8к8
+8р8к-
+-р8л8
+8р8л-
+-р8м8
+8р8м-
+-р8н8
+8р8н-
+-р8о8
+8р8о-
+-р8п8
+8р8п-
+-р8р8
+8р8р-
+-р8с8
+8р8с-
+-р8т8
+8р8т-
+-р8у8
+8р8у-
+-р8ф8
+8р8ф-
+-р8х8
+8р8х-
+-р8ц8
+8р8ц-
+-р8ч8
+8р8ч-
+-р8ш8
+8р8ш-
+-р8щ8
+8р8щ-
+-р8ъ8
+8р8ъ-
+-р8ы8
+8р8ы-
+-р8ь8
+8р8ь-
+-р8э8
+8р8э-
+-р8ю8
+8р8ю-
+-р8я8
+8р8я-
+-с8а8
+8с8а-
+-с8б8
+8с8б-
+-с8в8
+8с8в-
+-с8г8
+8с8г-
+-с8д8
+8с8д-
+-с8е8
+8с8е-
+-с8ё8
+8с8ё-
+-с8ж8
+8с8ж-
+-с8з8
+8с8з-
+-с8и8
+8с8и-
+-с8й8
+8с8й-
+-с8к8
+8с8к-
+-с8л8
+8с8л-
+-с8м8
+8с8м-
+-с8н8
+8с8н-
+-с8о8
+8с8о-
+-с8п8
+8с8п-
+-с8р8
+8с8р-
+-с8с8
+8с8с-
+-с8т8
+8с8т-
+-с8у8
+8с8у-
+-с8ф8
+8с8ф-
+-с8х8
+8с8х-
+-с8ц8
+8с8ц-
+-с8ч8
+8с8ч-
+-с8ш8
+8с8ш-
+-с8щ8
+8с8щ-
+-с8ъ8
+8с8ъ-
+-с8ы8
+8с8ы-
+-с8ь8
+8с8ь-
+-с8э8
+8с8э-
+-с8ю8
+8с8ю-
+-с8я8
+8с8я-
+-т8а8
+8т8а-
+-т8б8
+8т8б-
+-т8в8
+8т8в-
+-т8г8
+8т8г-
+-т8д8
+8т8д-
+-т8е8
+8т8е-
+-т8ё8
+8т8ё-
+-т8ж8
+8т8ж-
+-т8з8
+8т8з-
+-т8и8
+8т8и-
+-т8й8
+8т8й-
+-т8к8
+8т8к-
+-т8л8
+8т8л-
+-т8м8
+8т8м-
+-т8н8
+8т8н-
+-т8о8
+8т8о-
+-т8п8
+8т8п-
+-т8р8
+8т8р-
+-т8с8
+8т8с-
+-т8т8
+8т8т-
+-т8у8
+8т8у-
+-т8ф8
+8т8ф-
+-т8х8
+8т8х-
+-т8ц8
+8т8ц-
+-т8ч8
+8т8ч-
+-т8ш8
+8т8ш-
+-т8щ8
+8т8щ-
+-т8ъ8
+8т8ъ-
+-т8ы8
+8т8ы-
+-т8ь8
+8т8ь-
+-т8э8
+8т8э-
+-т8ю8
+8т8ю-
+-т8я8
+8т8я-
+-у8а8
+8у8а-
+-у8б8
+8у8б-
+-у8в8
+8у8в-
+-у8г8
+8у8г-
+-у8д8
+8у8д-
+-у8е8
+8у8е-
+-у8ё8
+8у8ё-
+-у8ж8
+8у8ж-
+-у8з8
+8у8з-
+-у8и8
+8у8и-
+-у8й8
+8у8й-
+-у8к8
+8у8к-
+-у8л8
+8у8л-
+-у8м8
+8у8м-
+-у8н8
+8у8н-
+-у8о8
+8у8о-
+-у8п8
+8у8п-
+-у8р8
+8у8р-
+-у8с8
+8у8с-
+-у8т8
+8у8т-
+-у8у8
+8у8у-
+-у8ф8
+8у8ф-
+-у8х8
+8у8х-
+-у8ц8
+8у8ц-
+-у8ч8
+8у8ч-
+-у8ш8
+8у8ш-
+-у8щ8
+8у8щ-
+-у8ъ8
+8у8ъ-
+-у8ы8
+8у8ы-
+-у8ь8
+8у8ь-
+-у8э8
+8у8э-
+-у8ю8
+8у8ю-
+-у8я8
+8у8я-
+-ф8а8
+8ф8а-
+-ф8б8
+8ф8б-
+-ф8в8
+8ф8в-
+-ф8г8
+8ф8г-
+-ф8д8
+8ф8д-
+-ф8е8
+8ф8е-
+-ф8ё8
+8ф8ё-
+-ф8ж8
+8ф8ж-
+-ф8з8
+8ф8з-
+-ф8и8
+8ф8и-
+-ф8й8
+8ф8й-
+-ф8к8
+8ф8к-
+-ф8л8
+8ф8л-
+-ф8м8
+8ф8м-
+-ф8н8
+8ф8н-
+-ф8о8
+8ф8о-
+-ф8п8
+8ф8п-
+-ф8р8
+8ф8р-
+-ф8с8
+8ф8с-
+-ф8т8
+8ф8т-
+-ф8у8
+8ф8у-
+-ф8ф8
+8ф8ф-
+-ф8х8
+8ф8х-
+-ф8ц8
+8ф8ц-
+-ф8ч8
+8ф8ч-
+-ф8ш8
+8ф8ш-
+-ф8щ8
+8ф8щ-
+-ф8ъ8
+8ф8ъ-
+-ф8ы8
+8ф8ы-
+-ф8ь8
+8ф8ь-
+-ф8э8
+8ф8э-
+-ф8ю8
+8ф8ю-
+-ф8я8
+8ф8я-
+-х8а8
+8х8а-
+-х8б8
+8х8б-
+-х8в8
+8х8в-
+-х8г8
+8х8г-
+-х8д8
+8х8д-
+-х8е8
+8х8е-
+-х8ё8
+8х8ё-
+-х8ж8
+8х8ж-
+-х8з8
+8х8з-
+-х8и8
+8х8и-
+-х8й8
+8х8й-
+-х8к8
+8х8к-
+-х8л8
+8х8л-
+-х8м8
+8х8м-
+-х8н8
+8х8н-
+-х8о8
+8х8о-
+-х8п8
+8х8п-
+-х8р8
+8х8р-
+-х8с8
+8х8с-
+-х8т8
+8х8т-
+-х8у8
+8х8у-
+-х8ф8
+8х8ф-
+-х8х8
+8х8х-
+-х8ц8
+8х8ц-
+-х8ч8
+8х8ч-
+-х8ш8
+8х8ш-
+-х8щ8
+8х8щ-
+-х8ъ8
+8х8ъ-
+-х8ы8
+8х8ы-
+-х8ь8
+8х8ь-
+-х8э8
+8х8э-
+-х8ю8
+8х8ю-
+-х8я8
+8х8я-
+-ц8а8
+8ц8а-
+-ц8б8
+8ц8б-
+-ц8в8
+8ц8в-
+-ц8г8
+8ц8г-
+-ц8д8
+8ц8д-
+-ц8е8
+8ц8е-
+-ц8ё8
+8ц8ё-
+-ц8ж8
+8ц8ж-
+-ц8з8
+8ц8з-
+-ц8и8
+8ц8и-
+-ц8й8
+8ц8й-
+-ц8к8
+8ц8к-
+-ц8л8
+8ц8л-
+-ц8м8
+8ц8м-
+-ц8н8
+8ц8н-
+-ц8о8
+8ц8о-
+-ц8п8
+8ц8п-
+-ц8р8
+8ц8р-
+-ц8с8
+8ц8с-
+-ц8т8
+8ц8т-
+-ц8у8
+8ц8у-
+-ц8ф8
+8ц8ф-
+-ц8х8
+8ц8х-
+-ц8ц8
+8ц8ц-
+-ц8ч8
+8ц8ч-
+-ц8ш8
+8ц8ш-
+-ц8щ8
+8ц8щ-
+-ц8ъ8
+8ц8ъ-
+-ц8ы8
+8ц8ы-
+-ц8ь8
+8ц8ь-
+-ц8э8
+8ц8э-
+-ц8ю8
+8ц8ю-
+-ц8я8
+8ц8я-
+-ч8а8
+8ч8а-
+-ч8б8
+8ч8б-
+-ч8в8
+8ч8в-
+-ч8г8
+8ч8г-
+-ч8д8
+8ч8д-
+-ч8е8
+8ч8е-
+-ч8ё8
+8ч8ё-
+-ч8ж8
+8ч8ж-
+-ч8з8
+8ч8з-
+-ч8и8
+8ч8и-
+-ч8й8
+8ч8й-
+-ч8к8
+8ч8к-
+-ч8л8
+8ч8л-
+-ч8м8
+8ч8м-
+-ч8н8
+8ч8н-
+-ч8о8
+8ч8о-
+-ч8п8
+8ч8п-
+-ч8р8
+8ч8р-
+-ч8с8
+8ч8с-
+-ч8т8
+8ч8т-
+-ч8у8
+8ч8у-
+-ч8ф8
+8ч8ф-
+-ч8х8
+8ч8х-
+-ч8ц8
+8ч8ц-
+-ч8ч8
+8ч8ч-
+-ч8ш8
+8ч8ш-
+-ч8щ8
+8ч8щ-
+-ч8ъ8
+8ч8ъ-
+-ч8ы8
+8ч8ы-
+-ч8ь8
+8ч8ь-
+-ч8э8
+8ч8э-
+-ч8ю8
+8ч8ю-
+-ч8я8
+8ч8я-
+-ш8а8
+8ш8а-
+-ш8б8
+8ш8б-
+-ш8в8
+8ш8в-
+-ш8г8
+8ш8г-
+-ш8д8
+8ш8д-
+-ш8е8
+8ш8е-
+-ш8ё8
+8ш8ё-
+-ш8ж8
+8ш8ж-
+-ш8з8
+8ш8з-
+-ш8и8
+8ш8и-
+-ш8й8
+8ш8й-
+-ш8к8
+8ш8к-
+-ш8л8
+8ш8л-
+-ш8м8
+8ш8м-
+-ш8н8
+8ш8н-
+-ш8о8
+8ш8о-
+-ш8п8
+8ш8п-
+-ш8р8
+8ш8р-
+-ш8с8
+8ш8с-
+-ш8т8
+8ш8т-
+-ш8у8
+8ш8у-
+-ш8ф8
+8ш8ф-
+-ш8х8
+8ш8х-
+-ш8ц8
+8ш8ц-
+-ш8ч8
+8ш8ч-
+-ш8ш8
+8ш8ш-
+-ш8щ8
+8ш8щ-
+-ш8ъ8
+8ш8ъ-
+-ш8ы8
+8ш8ы-
+-ш8ь8
+8ш8ь-
+-ш8э8
+8ш8э-
+-ш8ю8
+8ш8ю-
+-ш8я8
+8ш8я-
+-щ8а8
+8щ8а-
+-щ8б8
+8щ8б-
+-щ8в8
+8щ8в-
+-щ8г8
+8щ8г-
+-щ8д8
+8щ8д-
+-щ8е8
+8щ8е-
+-щ8ё8
+8щ8ё-
+-щ8ж8
+8щ8ж-
+-щ8з8
+8щ8з-
+-щ8и8
+8щ8и-
+-щ8й8
+8щ8й-
+-щ8к8
+8щ8к-
+-щ8л8
+8щ8л-
+-щ8м8
+8щ8м-
+-щ8н8
+8щ8н-
+-щ8о8
+8щ8о-
+-щ8п8
+8щ8п-
+-щ8р8
+8щ8р-
+-щ8с8
+8щ8с-
+-щ8т8
+8щ8т-
+-щ8у8
+8щ8у-
+-щ8ф8
+8щ8ф-
+-щ8х8
+8щ8х-
+-щ8ц8
+8щ8ц-
+-щ8ч8
+8щ8ч-
+-щ8ш8
+8щ8ш-
+-щ8щ8
+8щ8щ-
+-щ8ъ8
+8щ8ъ-
+-щ8ы8
+8щ8ы-
+-щ8ь8
+8щ8ь-
+-щ8э8
+8щ8э-
+-щ8ю8
+8щ8ю-
+-щ8я8
+8щ8я-
+-ъ8а8
+8ъ8а-
+-ъ8б8
+8ъ8б-
+-ъ8в8
+8ъ8в-
+-ъ8г8
+8ъ8г-
+-ъ8д8
+8ъ8д-
+-ъ8е8
+8ъ8е-
+-ъ8ё8
+8ъ8ё-
+-ъ8ж8
+8ъ8ж-
+-ъ8з8
+8ъ8з-
+-ъ8и8
+8ъ8и-
+-ъ8й8
+8ъ8й-
+-ъ8к8
+8ъ8к-
+-ъ8л8
+8ъ8л-
+-ъ8м8
+8ъ8м-
+-ъ8н8
+8ъ8н-
+-ъ8о8
+8ъ8о-
+-ъ8п8
+8ъ8п-
+-ъ8р8
+8ъ8р-
+-ъ8с8
+8ъ8с-
+-ъ8т8
+8ъ8т-
+-ъ8у8
+8ъ8у-
+-ъ8ф8
+8ъ8ф-
+-ъ8х8
+8ъ8х-
+-ъ8ц8
+8ъ8ц-
+-ъ8ч8
+8ъ8ч-
+-ъ8ш8
+8ъ8ш-
+-ъ8щ8
+8ъ8щ-
+-ъ8ъ8
+8ъ8ъ-
+-ъ8ы8
+8ъ8ы-
+-ъ8ь8
+8ъ8ь-
+-ъ8э8
+8ъ8э-
+-ъ8ю8
+8ъ8ю-
+-ъ8я8
+8ъ8я-
+-ы8а8
+8ы8а-
+-ы8б8
+8ы8б-
+-ы8в8
+8ы8в-
+-ы8г8
+8ы8г-
+-ы8д8
+8ы8д-
+-ы8е8
+8ы8е-
+-ы8ё8
+8ы8ё-
+-ы8ж8
+8ы8ж-
+-ы8з8
+8ы8з-
+-ы8и8
+8ы8и-
+-ы8й8
+8ы8й-
+-ы8к8
+8ы8к-
+-ы8л8
+8ы8л-
+-ы8м8
+8ы8м-
+-ы8н8
+8ы8н-
+-ы8о8
+8ы8о-
+-ы8п8
+8ы8п-
+-ы8р8
+8ы8р-
+-ы8с8
+8ы8с-
+-ы8т8
+8ы8т-
+-ы8у8
+8ы8у-
+-ы8ф8
+8ы8ф-
+-ы8х8
+8ы8х-
+-ы8ц8
+8ы8ц-
+-ы8ч8
+8ы8ч-
+-ы8ш8
+8ы8ш-
+-ы8щ8
+8ы8щ-
+-ы8ъ8
+8ы8ъ-
+-ы8ы8
+8ы8ы-
+-ы8ь8
+8ы8ь-
+-ы8э8
+8ы8э-
+-ы8ю8
+8ы8ю-
+-ы8я8
+8ы8я-
+-ь8а8
+8ь8а-
+-ь8б8
+8ь8б-
+-ь8в8
+8ь8в-
+-ь8г8
+8ь8г-
+-ь8д8
+8ь8д-
+-ь8е8
+8ь8е-
+-ь8ё8
+8ь8ё-
+-ь8ж8
+8ь8ж-
+-ь8з8
+8ь8з-
+-ь8и8
+8ь8и-
+-ь8й8
+8ь8й-
+-ь8к8
+8ь8к-
+-ь8л8
+8ь8л-
+-ь8м8
+8ь8м-
+-ь8н8
+8ь8н-
+-ь8о8
+8ь8о-
+-ь8п8
+8ь8п-
+-ь8р8
+8ь8р-
+-ь8с8
+8ь8с-
+-ь8т8
+8ь8т-
+-ь8у8
+8ь8у-
+-ь8ф8
+8ь8ф-
+-ь8х8
+8ь8х-
+-ь8ц8
+8ь8ц-
+-ь8ч8
+8ь8ч-
+-ь8ш8
+8ь8ш-
+-ь8щ8
+8ь8щ-
+-ь8ъ8
+8ь8ъ-
+-ь8ы8
+8ь8ы-
+-ь8ь8
+8ь8ь-
+-ь8э8
+8ь8э-
+-ь8ю8
+8ь8ю-
+-ь8я8
+8ь8я-
+-э8а8
+8э8а-
+-э8б8
+8э8б-
+-э8в8
+8э8в-
+-э8г8
+8э8г-
+-э8д8
+8э8д-
+-э8е8
+8э8е-
+-э8ё8
+8э8ё-
+-э8ж8
+8э8ж-
+-э8з8
+8э8з-
+-э8и8
+8э8и-
+-э8й8
+8э8й-
+-э8к8
+8э8к-
+-э8л8
+8э8л-
+-э8м8
+8э8м-
+-э8н8
+8э8н-
+-э8о8
+8э8о-
+-э8п8
+8э8п-
+-э8р8
+8э8р-
+-э8с8
+8э8с-
+-э8т8
+8э8т-
+-э8у8
+8э8у-
+-э8ф8
+8э8ф-
+-э8х8
+8э8х-
+-э8ц8
+8э8ц-
+-э8ч8
+8э8ч-
+-э8ш8
+8э8ш-
+-э8щ8
+8э8щ-
+-э8ъ8
+8э8ъ-
+-э8ы8
+8э8ы-
+-э8ь8
+8э8ь-
+-э8э8
+8э8э-
+-э8ю8
+8э8ю-
+-э8я8
+8э8я-
+-ю8а8
+8ю8а-
+-ю8б8
+8ю8б-
+-ю8в8
+8ю8в-
+-ю8г8
+8ю8г-
+-ю8д8
+8ю8д-
+-ю8е8
+8ю8е-
+-ю8ё8
+8ю8ё-
+-ю8ж8
+8ю8ж-
+-ю8з8
+8ю8з-
+-ю8и8
+8ю8и-
+-ю8й8
+8ю8й-
+-ю8к8
+8ю8к-
+-ю8л8
+8ю8л-
+-ю8м8
+8ю8м-
+-ю8н8
+8ю8н-
+-ю8о8
+8ю8о-
+-ю8п8
+8ю8п-
+-ю8р8
+8ю8р-
+-ю8с8
+8ю8с-
+-ю8т8
+8ю8т-
+-ю8у8
+8ю8у-
+-ю8ф8
+8ю8ф-
+-ю8х8
+8ю8х-
+-ю8ц8
+8ю8ц-
+-ю8ч8
+8ю8ч-
+-ю8ш8
+8ю8ш-
+-ю8щ8
+8ю8щ-
+-ю8ъ8
+8ю8ъ-
+-ю8ы8
+8ю8ы-
+-ю8ь8
+8ю8ь-
+-ю8э8
+8ю8э-
+-ю8ю8
+8ю8ю-
+-ю8я8
+8ю8я-
+-я8а8
+8я8а-
+-я8б8
+8я8б-
+-я8в8
+8я8в-
+-я8г8
+8я8г-
+-я8д8
+8я8д-
+-я8е8
+8я8е-
+-я8ё8
+8я8ё-
+-я8ж8
+8я8ж-
+-я8з8
+8я8з-
+-я8и8
+8я8и-
+-я8й8
+8я8й-
+-я8к8
+8я8к-
+-я8л8
+8я8л-
+-я8м8
+8я8м-
+-я8н8
+8я8н-
+-я8о8
+8я8о-
+-я8п8
+8я8п-
+-я8р8
+8я8р-
+-я8с8
+8я8с-
+-я8т8
+8я8т-
+-я8у8
+8я8у-
+-я8ф8
+8я8ф-
+-я8х8
+8я8х-
+-я8ц8
+8я8ц-
+-я8ч8
+8я8ч-
+-я8ш8
+8я8ш-
+-я8щ8
+8я8щ-
+-я8ъ8
+8я8ъ-
+-я8ы8
+8я8ы-
+-я8ь8
+8я8ь-
+-я8э8
+8я8э-
+-я8ю8
+8я8ю-
+-я8я8
+8я8я-} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-ru.rme b/Master/texmf-dist/tex/context/patterns/lang-ru.rme
index bcb3ef76828..4b35f5865b9 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-ru.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-ru.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Russian Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -74,4 +78,4 @@
% document files README.ruhyphal and hyphen.rules. The file cyryoal.tex
% can be regenerated using mkcyryo script (a part of ruhyphen package)
% and the latest release of rus-ispell dictionaries
-% <ftp://scon155.phys.msu.su/pub/russian/ispell/>. \ No newline at end of file
+% <ftp://scon155.phys.msu.su/pub/russian/ispell/>.
diff --git a/Master/texmf-dist/tex/context/patterns/lang-sk.lua b/Master/texmf-dist/tex/context/patterns/lang-sk.lua
new file mode 100644
index 00000000000..b9738a9a5f5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-sk.lua
@@ -0,0 +1,106 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["characters"]="abdeikmnoprstyóť",
+ ["data"]="dosť me-tó-da me-tó-dy ne-do-stat-ka-mi sep-tem-bra",
+ ["n"]=5,
+ },
+ ["metadata"]={
+ ["mnemonic"]="sk",
+ ["source"]="hyph-sk",
+ ["texcomment"]="% Slovak Hyphenation Patterns (Jana Chlebikova, 1992)\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: skhyphen.tex (yyyy-mm-dd), skhyphen.ex (yy-mm-dd)\
+% Author: Jana Chlebikova <chlebikj at dcs.fmph.uniba.sk>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% Slovak hyphenation (version 2.0) 24.4.1992\
+% Autor: Jana Chlebikova, department of Informatics Education,\
+% Comenius University, 842 15 Bratislava, Slovakia\
+% <chlebikj@dcs.fmph.uniba.sk>\
+%\
+% This is free software; you can redistribute it and/or modify\
+% it under the terms of the GNU General Public License as published by\
+% the Free Software Foundation; either version 2 of the License, or\
+% (at your option) any later version.\
+%\
+% This file is distributed in the hope that it will be useful,\
+% but WITHOUT ANY WARRANTY; without even the implied warranty of\
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\
+% GNU General Public License for more details.\
+%\
+% You should have received a copy of the GNU General Public License\
+% along with this program; if not, write to the Free Software\
+% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\
+%%% --------------------------------------------------------------------\
+% \\message {Loading SK hyphenation patterns: Jana Chlebikova, 1992}\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnoprstuvwxyzáäéíóôúýčďľňŕšťž",
+ ["data"]="a1 á1 ä1 e1 é1 i1 í1 o1 ó1 ô1 u1 ú1 y1 ý1 i2a i2á i2e i2u o2u c2h d2z d2ž 2b1b 2b1c 2b1č 2b1d 2b1ď 2b1f 2b1g 2b1h 2b1c2h 2b1j 2b1k 2b1l 2b1ľ 2b1m 2b1n 2b1ň 2b1p 2b1r 2b1s 2b1š 2b1t 2b1ť 2b1v 2b1w 2b1x 2b1z 2b1ž 2b1d2z 2b1d2ž 2c1b 2c1c 2c1č 2c1d 2c1ď 2c1f 2c1g 2c1c2h 2c1j 2c1k 2c1l 2c1ľ 2c1m 2c1n 2c1ň 2c1p 2c1r 2c1s 2c1š 2c1t 2c1ť 2c1v 2c1w 2c1x 2c1z 2c1ž 2c1d2z 2c1d2ž 2č1b 2č1c 2č1č 2č1d 2č1ď 2č1f 2č1g 2č1h 2č1c2h 2č1j 2č1k 2č1l 2č1ľ 2č1m 2č1n 2č1ň 2č1p 2č1r 2č1s 2č1š 2č1t 2č1ť 2č1v 2č1w 2č1x 2č1z 2č1ž 2č1d2z 2č1d2ž 2d1b 2d1c 2d1č 2d1d 2d1ď 2d1f 2d1g 2d1h 2d1c2h 2d1j 2d1k 2d1l 2d1ľ 2d1m 2d1n 2d1ň 2d1p 2d1r 2d1s 2d1š 2d1t 2d1ť 2d1v 2d1d2z 2d1d2ž 2ď1b 2ď1c 2ď1č 2ď1d 2ď1ď 2ď1f 2ď1g 2ď1h 2ď1c2h 2ď1j 2ď1k 2ď1l 2ď1ľ .as4t4ro3 .atmo3 .a2u1to3 2ď1m 2ď1n 2ď1ň 2ď1p 2ď1r 2ď1s 2ď1š 2ď1t 2ď1ť 2ď1v 2ď1z 2ď1ž 2ď1d2z 2ď1d2ž 2f1b 2f1c 2f1č 2f1d 2f1ď 2f1f 2f1g 2f1h 2f1c2h 2f1j 2f1k 2f1l 2f1ľ 2f1m 2f1n 2f1ň 2f1p 2f1r 2f1s 2f1š 2f1t 2f1ť 2f1v 2f1z 2f1ž 2f1d2z 2f1d2ž 2g1b 2g1c 2g1č 2g1d 2g1ď 2g1f 2g1g 2g1h 2g1c2h 2g1j 2g1k 2g1l 2g1ľ 2g1m 2g1n 2g1ň 2g1p 2g1r 2g1s 2g1š 2g1t 2g1ť 2g1v 2g1z 2g1ž 2g1d2z 2g1d2ž 2h1b 2h1c 2h1č 2h1d 2h1ď 2h1f 2h1g 2h1h 2h1c2h 2h1j 2h1k 2h1l 2h1ľ 2h1m 2h1n 2h1ň 2h1p 2h1r 2h1s 2h1š 2h1t 2h1ť 2h1v 2h1z 2h1ž 2h1d2z 2h1d2ž 2c2h1b 2c2h1c 2c2h1č 2c2h1d 2c2h1ď 2c2h1f 2c2h1g 2c2h1h 2c2h1c2h 2c2h1j 2c2h1k 2c2h1l 2c2h1ľ 2c2h1m 2c2h1n 2c2h1ň 2c2h1p 2c2h1r 2c2h1s 2c2h1š 2c2h1t 2c2h1ť 2c2h1v 2c2h1w 2c2h1ž 2c2h1d2z 2c2h1d2ž 2j1b 2j1c 2j1č 2j1d 2j1ď 2j1f 2j1g 2j1h 2j1c2h 2j1j 2j1k 2j1l 2j1ľ 2j1m 2j1n 2j1ň 2j1p 2j1r 2j1s 2j1š 2j1t 2j1ť 2j1v 2j1w 2j1x 2j1z 2j1ž 2j1d2z 2j1d2ž 2k1b 2k1c 2k1č 2k1d 2k1ď 2k1f 2k1g 2k1h 2k1c2h 2k1j 2k1k 2k1l 2k1ľ 2k1m 2k1n 2k1ň 2k1p 2k1r 2k1s 2k1š 2k1t 2k1ť 2k1v 2k1w 2k1x 2k1z 2k1ž 2k1d2z 2k1d2ž 2l1b 2l1c 2l1č 2l1d 2l1ď 2l1f 2l1g 2l1h 2l1c2h 2l1j 2l1k 2l1l 2l1ľ 2l1m 2l1n 2l1ň 2l1p 2l1r 2l1s 2l1š 2l1t 2l1ť 2l1v 2l1z 2l1ž 2l1d2z 2l1d2ž 2ľ1b 2ľ1c 2ľ1č 2ľ1d 2ľ1ď 2ľ1f 2ľ1g 2ľ1h 2ľ1c2h 2ľ1j 2ľ1k 2ľ1l 2ľ1ľ 2ľ1m 2ľ1n 2ľ1ň 2ľ1p 2ľ1r 2ľ1s 2ľ1š 2ľ1t 2ľ1ť 2ľ1v 2ľ1z 2ľ1ž 2ľ1d2z 2ľ1d2ž 2m1b 2m1c 2m1č 2m1d 2m1ď 2m1f 2m1g 2m1h 2m1c2h 2m1j 2m1k 2m1l 2m1ľ 2m1m 2m1n 2m1ň 2m1p 2m1r 2m1s 2m1š 2m1t 2m1ť 2m1v 2m1z 2m1ž 2m1d2z 2m1d2ž 2n1b 2n1c 2n1č 2n1d 2n1ď 2n1f 2n1g 2n1h 2n1c2h 2n1j 2n1k 2n1l 2n1ľ 2n1m 2n1n 2n1ň 2n1p 2n1r 2n1s 2n1š 2n1t 2n1ť 2n1v 2n1w 2n1x 2n1z 2n1ž 2n1d2z 2n1d2ž 2ň1b 2ň1c 2ň1č 2ň1d 2ň1ď 2ň1f 2ň1g 2ň1h 2ň1c2h 2ň1j 2ň1k 2ň1l 2ň1ľ 2ň1m 2ň1n 2ň1ň 2ň1p 2ň1r 2ň1s 2ň1š 2ň1t 2ň1ť 2ň1v 2ň1z 2ň1ž 2ň1d2z 2ň1d2ž 2p1b 2p1c 2p1č 2p1d 2p1ď 2p1f 2p1g 2p1h 2p1c2h 2p1j 2p1k 2p1l 2p1ľ 2p1m 2p1n 2p1ň 2p1p 2p1r 2p1s 2p1š 2p1t 2p1ť 2p1v 2p1w 2p1x 2p1z 2p1ž 2p1d2z 2p1d2ž 2r1b 2r1c 2r1č 2r1d 2r1ď 2r1f 2r1g 2r1h 2r1c2h 2r1j 2r1k 2r1l 2r1ľ 2r1m 2r1n 2r1ň 2r1p 2r1r 2r1s 2r1š 2r1t 2r1ť 2r1v 2r1w 2r1x 2r1z 2r1ž 2r1d2z 2r1d2ž 2s1b 2s1c 2s1č 2s1d 2s1ď 2s1f 2s1g 2s1h 2s1c2h 2s1j 2s1k 2s1l 2s1ľ 2s1m 2s1n 2s1ň 2s1p 2s1r 2s1s 2s1š 2s1t 2s1ť 2s1v 2s1z 2s1ž 2s1d2z 2s1d2ž 2š1b 2š1c 2š1č 2š1d 2š1ď 2š1f 2š1g 2š1h 2š1c2h 2š1j 2š1k 2š1l 2š1ľ 2š1m 2š1n 2š1ň 2š1p 2š1r 2š1s 2š1š 2š1t 2š1ť 2š1v 2š1w 2š1x 2š1z 2š1ž 2š1d2z 2š1d2ž 2t1b 2t1c 2t1č 2t1d 2t1ď 2t1f 2t1g 2t1h 2t1c2h 2t1j 2t1k 2t1l 2t1ľ 2t1m 2t1n 2t1ň 2t1p 2t1r 2t1s 2t1š 2t1t 2t1ť 2t1v 2t1w 2t1x 2t1z 2t1ž 2t1d2z 2t1d2ž 2ť1b 2ť1c 2ť1č 2ť1d 2ť1ď 2ť1f 2ť1g 2ť1h 2ť1c2h 2ť1j 2ť1k 2ť1l 2ť1ľ 2ť1m 2ť1n 2ť1ň 2ť1p 2ť1r 2ť1s 2ť1š 2ť1t 2ť1ť 2ť1v 2ť1w 2ť1x 2ť1z 2ť1ž 2ť1d2z 2ť1d2ž 2v1b 2v1c 2v1č 2v1d 2v1ď 2v1f 2v1g 2v1h 2v1c2h 2v1j 2v1k 2v1l 2v1ľ 2v1m 2v1n 2v1ň 2v1p 2v1r 2v1s 2v1š 2v1t 2v1ť 2v1v 2v1w 2v1x 2v1z 2v1ž 2v1d2z 2v1d2ž 2z1b 2z1c 2z1č 2z1d 2z1ď 2z1f 2z1g 2z1h 2z1c2h 2z1j 2z1k 2z1l 2z1ľ 2z1m 2z1n 2z1ň 2z1p 2z1r 2z1s 2z1š 2z1t 2z1ť 2z1v 2z1z 2z1ž 2z1d2z 2z1d2ž 2ž1b 2ž1c 2ž1č 2ž1d 2ž1ď 2ž1f 2ž1g 2ž1h 2ž1c2h 2ž1j 2ž1k 2ž1l 2ž1ľ 2ž1m 2ž1n 2ž1ň 2ž1p 2ž1r 2ž1s 2ž1š 2ž1t 2ž1ť 2ž1v 2ž1z 2ž1ž 2ž1d2z 2ž1d2ž 2d2z1k 2d2z1n 2d2z1r 2d2z1s 2d2ž1š 2x1t 2x1n 2b1ŕ 2ŕ1b 2d2z1ŕ 2ŕ1d2z 2d2z1ľ 2ŕ1d2ž 2d2ž1ľ a1í2 a1o2 e1á2 e1í2 e1o2 e1ó2 e1u2 i1o2 o1a2 o1e2 o1i2 o1o2 u1a2 u1á2 u1i2 u1í2 u1o2 u1u2 y1a2 y1e2 y1ó2 y1u2 a2u1 a2i1 b2l3b 3b2l3č b2l3c2h 3b2l3k 3b2ľ3k 3b2l3ň b2l3š b2ľ3š 3b2r3b b2r3d 3b2r3k 3b2ŕ3k 3b2r3l 3b2ŕ3ľ 3b2r3n 3b2r3ň 3b2r3v b2r3z b3s2c b3s2t c3k2t 3c2r3č 3c2ŕ3č 3c2r3k 3c2ŕ3k c3t2v 3č2l3n 3č2r3č č2r3p 3č2r3t 3č2r3v d3c4h4n 3d2l3b 3d2l3h d2l3n 3d2l3ž 3d2ľ3ž 3d2r3d 3d2r3g d2r3l 3d2r3k 3d2r3m d2r3n 3d2r3v 3d2r3z 3d2r3ž 3d2ŕ3ž d3s2v d3s2t d3v2r 3f2r3č 3f2r3f 3f2r3k 3f2ŕ3k 3f2r3m 3f2r3n 3g2l3g 3g2r3c 3g2r3g 3h2l3b 3h2ľ3b 3h2l3t 3h2m2l 3h2r3b 3h2ŕ3b 3h2r3č 3h2r3d 3h2r3d2z 3h2r3k 3h2r3m 3h2r3n 3h2r3ň 3h2r3t 3h2r3v 3c2h2l3p 3c2h2r3b 3c2h2r3č c2h2r3c4h 3c2h2r3l 3c2h2r3t j2c2h3n j3s2t j3š2le j3t2m j3t2r 3k2l3b 3k2ľ3b 3k2l3č 3k2l3z 3k2ľ3z k2r3b 3k2r3č 3k2ŕ3č 3k2ŕ3d 3k2r3k 3k2ŕ3k 3k2ŕ3m 3k2r3p 3k2r3s 3k2r3t 3k2r3v k3s2ľ k2s3n k3t2r l3d2r ľ3k2n l3t2r m3b2l m3b2ľ m3b2r m3f2l m3f2r m3k2n 3m2l3č 3m2l3k m3p2l m3p2ľ m3p2r m3p2s 3m2r3h m2r3c4h 3m2r3k m2r3l m2r3š m2r3t 3m2r3v 3m2r3z 3m2ŕ3z m3s2t m3š2t n3dľa n3d2r n3f2l n3f2r n3g2h n3g2l n3g2ľ n2g3n n3g2r n3g2v n3k2c n3k2h n3k2n n3k2r n3k2v n3s2c n3š2p n3š2t n3t2g n3t2l n3t2n n3t2r n2ž3m 3p2l3n 3p2l3ň 3p2ľ3ň 3p2l3z 3p2ľ3z 3p2ľ3ž 3p2ŕ3c 3p2r3č 3p2r3d 3p2r3s 3p2r3š p3š2ť p3t2r r2b3n r3g2ľ r3g2r r3g2s r3k2d r2k3n r3k2t r3k2v r3p2c r3p2č r3p2r r3s2p r3š2č r3š2l r3š2r r2t3m r3t2n r2t3ň r3t2r r3t2v 3s4c4h4n s2k3l s2k3m s2k3n s3k2r s3k2v 3s2l3n 3s2l3ň 3s2l3z s3p2r 3s2r3d 3s4ŕ3k 3s4r3š s3t2k ôs4t3k2ár3s4t4v s2t3l s3t2m s2t3n s3t2r s3t2v s2ť3h s2ť3m s2ť3p š3k2l š3k2r š3t2r 3š4t4v t3k2l t3k2n 3t2l3č 3t2l3k t3h2l 3t4r3č 3t4r3h 3t2r3l 3t2r3k 3t2r3m a4t2r3n 3t2r3n 3t2ŕ3n 3t2ŕ3ň 3t4r3p 3t2r3v 3t2ŕ3ž 3v2l3č 3v2ľ3č 3v2l3h 3v2l3k 3v2l3n 3v2r3h 3v2r3c2h 3v2r3l 3v2ŕ3š 3v2ŕ3t 3v2r3z 3v2ŕ3z 3v4z4d 3v4z4h 3v4z4n 3v3z2ť z3d2n noz5d4r 3z4d4r 3z4d4v z3g2n 3z4h4r 3z2r3k 3z2r3n 3z4v4l ž2d3n 3ž2l3č 3ž2l3t 3ž2ľt 3ž2r3ď ž3s2t x3p2l x3p2r x3t2r 3b2l4č3n 3b2ľ4č3k 3b2l4n3k 3b2ľ3k2n 3b2r4b3l 3b2r4b3t 3b2r4č3k 3b2r4d3c 3b2ŕ4d3n 3b2r3h2l 3b4ŕ4k3n 3b4r4m3b 3b4r4n3č 3b4r4n3k 3b4r4š3l 3b4r4t3l 3b4r4t3n 3b4r4v3n 3b4r4z3d 3b4r4z3l 3b4r4z3n b3s2t2r 3c4ŕ4č3k 3c4r4k3n 3c4v4r3č 3c4v4r3k 3c4v4ŕ3k 3c4v4r3l 3č4l4n3k 3č4r3č4r 3č4r4c4h3n 3č4r4p3k 3č4r4p3n 3č4r4t3n 3č4v4r3k 3č4v4r3l 3d4l4b3n d4ľ4ž3k d4l4ž3n d4ľ4ž3n 3d4r4c3n 3d4r4g3ľ 3d4r4g3n 3d4r4h3n 3d4r4n3č 3d4r4n3k 3d4r4s3n 3d4r4ž3b 3d4r4ž3k 3f4r4c3k 3f4r4c3n 3f4r4č3k 3f4r4f3l 3f4r4k3n 3f4r4n3d 3f4r4n3d4ž 3f4r4n3g 3f4r4n3k 3g4l4g3n 3g2r4c3k 3h2ľ4b3k 3h2l3t4n 3h2r4b3č 3h2r4č3k h2r4d3l 3h2r4g3ľ 3h2r4k3ľ 3h2r4k3n 3h2ŕ4k3n 3h2r4n3č 3h2r4s3t 3h2r4s3ť 3ch4ľ4p3k 3c2h2r4b3t 3c2h2r4c4h3l 3c2h2r4c4h3ľ 3c4h4r4s3t j3s4t4r j3s4t4v 3k4l4b3č 3k4l4b3k 3k4l4z3k 3k4l4z3n 3k4r4č3m 3k4r4č3n 3k4r4k3v 3k4r4m3n 3k4ŕ4m3n 3k4r4p3č 3k4r4s3t 3k4r4š3t 3k4r4t3k 3k4r4v3n 3m2l4č3k 3m2ľ4k3n 3m2ľ4k3v 3m2l4s3n m3p4r3p m3p4r3v 3m4r4k3n 3m4r4k3v 3m4r4m3l 3m4r4n3č 3m4r4n3k 3m4ŕ4š3t 3m4ŕ4t3v 3m4r4z3l 3m4r4z3k 3m4r4z3n n4g3s4t n3š4t4r n3t4l3m 3p2l4z3l 3p2ľ4z3n p2ŕ4c3n 3p2r4č3k 3p4r4d3n 3p4ŕ4c2h3n 3p4r4s3k 3p4r4t3k r2s3k4d r2s3k4t čer4s3t4v 3s4l4n3k 3s4k4r3z 3s4m4r3c 3s4m4r3č 3s4m4r3d 3s4m4r3k 3s4m4r3t 3s4p4r3c4h 3s4r4d3c 3s4r4k3n 3s4r4s3t 3s4t4ľ3k s3t4r3b ko4s3t4r3č 3s4t4r3č 3s4t4ŕ3h 3s4t4r3k s4t4r3v 4s4ť5k4rát 3š4k4l3b 3š4k4r3k 3š4k4ŕ3k maš3k4r3t 3š4k4r3t 3š4p4l3h 3š4t4r3b š4t4r3n 3š4t4v4r3t 3š4t4v4r3ť 3t2ľ4c3ť 3t2r4b3l t2r4č3k 3t2r4d3l 3t2r4h3l 3t2r4h3n 3t2r4k3n 3t2r4k3v 3t2r4m3n 3t4ŕ4p3n 3t2r4ž3k 3t2r4ž3n 3t2v4r3d 3t2v4r3d4z 3t2v4ŕ3d4z 3v2l4h3č 3v2l4h3k 3v2l4h3n 3v2l4n3k 3v2l4n3n 3v4r4h3n 3v4r4k3n 3v4ŕ4z3g 3v4r4z3g 3v4r4z3n 3v4r4ž3l 3z4h4ŕ3ň 3z4r4n3n 3ž4l4č3n 3ž4l4t3n 3ž4r4d3k 3b4r4n3k4n b3d4ľ4ž3n 3c4v4r4č3k 3c4v4r4n3k 3č4ŕ4s3t4v 3č4r4t4t3n 3č4v4r4k3n 3d4r4ž3g4r 3f4r4n4g3n h2ŕ4s3t4k 3c4h4r4s4t3n 3k4r4s4t3n 3k4r4s4t3ň 3s4m4r4š3ť 3s4m4r4t3k s3t4r4n3k 3š4k4l4b3n maš3k4r4t3n 3š4k4r4t3n 3š4k4v4r3č 3š4k4v4r3k 3š4k4v4ŕ3k 3š4k4v4r3n 3š4m4r4d3k 3š4m4r4n3c 3š4p4l4h3n 3š4t4r4k3n 3š3t4r4n3g 3t4v4r4d3n 3v4r4s3t4v 3v4r4z3g4n 3c4v4r4n3g4n 3š4k4v4r4k3n 3š4k4v4ŕ4k3n k4č3ný. k4č3ného. k4č3nému. k4č3nom. k4č3ným. k4č3né. k4č3ná. k4č3nej. k4č3nú. k4č3nou. k4č3ní. k4č3ných. k4č3nými. k4t3ný. k4t3ného. k4t3nému. k4t3nom. k4t3ným. k4t3né. k4t3ná. k4t3nej. k4t3nú. k4t3nou. k4t3ní. k4t3ných. k4t3nými. n4č3ný. n4č3ného. n4č3nému. n4č3nom. n4č3ným. n4č3né. n4č3ná. n4č3nej. n4č3nú. n4č3nou. n4č3ní. n4č3ných. n4č3nými. n4k4č3n n4t3ný. n4t3ného. n4t3nému. n4t3nom. n4t3ným. n4t3né. n4t3ná. n4t3nej. n4t3nú. n4t3nou. n4t3ní. n4t3ných. n4t3nými. r4d3ný. r4d3ného. r4d3nému. r4d3nom. r4d3ným. r4d3né. r4d3ná. r4d3nej. r4d3nú. r4d3nou. r4d3ní. r4d3ných. r4d3nými. r4m3ný. r4m3ného. r4m3nému. r4m3nom. r4m3ným. r4m3né. r4m3ná. r4m3nej. r4m3nú. r4m3nou. r4m3ní. r4m3ných. r4m3nými. r4p4č3n r4t3ný. r4t3ného. r4t3nému. r4t3nom. r4t3ným. r4t3né. r4t3ná. r4t3nej. r4t3nú. r4t3nou. r4t3ní. r4t3ných. r4t3nými. s4t3ný. s4t3ného. s4t3nému. s4t3nom. s4t3ným. s4t3né. s4t3ná. s4t3nej. s4t3nú. s4t3nou. s4t3ní. s4t3ných. s4t3nými. z4d3ny. z4d3neho. z4d3nemu. z4d3nom. z4d3nym. z4d3ne. z4d3na. z4d3nej. z4d3nu. z4d3nou. z4d3ni. z4d3nych. z4d3nymi. z4d3ný. z4d3ného. z4d3nému. z4d3ným. z4d3né. z4d3ná. z4d3nú. z4d3ní. z4d3ných. z4d3nými. b2l4š3k l2t3k2a. l2t3k2y. l2t3k2e. l2t3k2u. l2t3k2ou. l2t3k2ám. l2t3k2ách. l2t3k2a1mi. n2t3k2a. n2t3k2y. n2t3k2e. n2t3k2u. n2t3k2ou. n2t3k2ám. n2t3k2ách. n2t3k2a1mi. n2k2t3k p2t3k2a. p2t3k2y. p2t3k2e. p2t3k2u. p2t3k2ou. p2t3k2ám. p2t3k2ách. p2t3k2a1mi. s2t3k2a. s2t3k2y. s2t3k2e. s2t3k2u. s2t3k2ou. s2t3k2ám. s2t3k2ách. s2t3k2a1mi. 5p4r4s3t b3s4k d3s4k j3s4k l4p3s4k l3s4k ľ3s4k l4t3s4k 4m3s4k 4m4p3s4k n4d3s4k n4k4t3s4k n3s4k n4t3s4k p3s4k p4t3s4k r3s4k r4t3s4k r4z5s4k 5s4r4b3s4k š3s4k t3s4k v3s4k z3s4k ž3s4k n2d3č z3š2t2 r4z3š2t2 b3s4t4v č3s4t4v d3s4t4v ď3s4t4v ľ3s4t4v m3s4t4v n3s4t4v n4t3s4t4v p3s4t4v r3s4t4v r4v5s4t4v š3s4t4v t3s4t4v v3s4t4v ž3s4t4v .a2e2ro .a2e2ro3d2r .aero3g2r .a2e2ro3k2l .aero3p2l .aero3s2k .aero3s2t .aero3t2r .akcie3s2c2h .ane3s2teti .ane3s2téz .anti5k4l .anti5k4r .apo5p4le .ap4rio .ap4rió .arci5k4 .aristo5k4 .as3k2lep .austro5s4 .bac2k3hand .balne2o3 .belo5 .belo5h4 .bez5 .bez5b4 .bez5d4 .bez5h4 .bez5k4 .bez5m4 .bez5p4 .bez5s4 .bez5t4 .bez5v4 .bez5z4 .bielo5 .bielob4 .bieloh4 .bielov4 .bi2o5 .biok4 .biop4 .bios4 .blaho5 .blahop4 .blahos4 .bledo5 .boha5p4 .boho5s4 .bože5 .bože5d4 .božec2h4 .brato5v4r .b2z2d .cáro5v4ra .celo5d4 .celo5k4 .celo5p4 .celo5s4 .celo5u4 .ceno5t4 .ces2t5maj .cirkevno5 .cirkevno5p4 .c4t4n .cudzo5k4 .cudzo5o4 .cudzo5s4 .cudzo5t4 .cudzo5v4 .cyto5p4 .čaro5k4 .čaro5s4 .čaro5v4 .čaro5z4 .černo5b4 .černo5h4 .černo5k4 .černo5o4 .červeno5a4 .červeno5b4 .červeno5h4 .červeno5k4 .červeno5o4 .červeno5p4 .čierno5b4 .čierno5h4 .čierno5o4 .čo5ch4 .čo5s4 .čudo5t4 .da3k2d .ďatelino5t4 .de5f4 .de5g4 .dek4l .desať5 .de5š4t2 .dez5i2 .dez5o2 .dis2k3d4 .divo5t4 .dlho5h4 .dlho5p4 .dobro5d4 .dobro5p4 .dobro5s4 .do5č2m .do5d4 .do5f4 .do5h4 .do5c4h4 .do5i4 .do5k4 .do5o .do5p4 .do5s4 .do5š4p .do5š4tie .do5š4tí .do5t4l .do5t4m .do5t4r .do5t4v .do5u .do5v4 .do5z4 .do5ž4 .drevo5p4 .drevo5o .drevo5v4 .drobno5z4 .druho5s4 .dvoj5al .dvoj5č4 .dvoj5d4 .dvoj5h4 .dvoj5i4 .dvoj5k4 .dvoj5p4 .dvoj5s4 .dvoj5t4 .dvoj5u .dvoj5v4 .dvoj5z4 .elektro5 .ex5k4 .fol2k5 .foto5 .gala5p4 .gama5g4 .ge4o .hnedo5o .hnedo5u .holo5b4 .holo5h4 .holo5k4 .hore5z4 .horno5u4 .hrôzo5s4t4 .hrôzo5v4 .hrôzy5p4 .hrubo5s4 .hydro5 .chorobo5p4 .jasno5o .jasno5z4 .jedno5h4 .jedno5i4 .jedno5p4 .jedno5s4 .jedno5u4 .jedno5z4 .juho5a .juho5s4 .južno5s4 .kata5k4 .kata5s4t4 .kmeňo5t4 .koso5d4 .koso5š4 .koso5u .krivo5p4 .kruto5v4 .krvi5p4 .krvi5s4 .krvi5t4 .ktovie5a2 .lásky5p4 .lesos4 .ľ4s4t .ľudovo5u .makro5k4 .makro5o4 .makro5s4 .málo5k4 .malo5o .málo5v4 .márno5t4 .medzi5h4 .medzi5i4 .medzi5p4 .medzi5š4 .medzi5t4 .melo5d4 .meru5ô2 .miesto5d4 .miesto5p4 .mikro5e4 .mikro5k4 .mikro5o .mikro5p4 .mimo5š4 .mimo5ú .mimo5v4 .mnoho5s4 .mnoho5t4 .mnoho5u .mnoho5v .mnoho5z .modro5o .mrako5d4 .mravo5u .mucho5t4 .m4z4d .na5a4 .na5b4 .na5c4 .nad5h4 .na5d4nes. .nad5p4 .na5d4p4. .na5d4ŕ4. .na5d4robno. .na5h4 .na5i4 .na5k4 .na5m4 .na5o4 .na5p4 .ná5p4 .národno5o .na5s4 .na5st4 .ná5s4 .ná5st4 .na5š4 .na5šk4 .na6š5sk .na5t4 .na5u4 .na5ú4 .ná5u4 .ná5ú4 .na5v4l .na5v4na .na5v4r4 .ná5v4r4 .na5v4z4 .na5z4r .na5z4v .na6z5vyš .náz5v4 .na5ž4 .ne5a4 .ne5do3u2k .ne5e4 .ne5i4 .ne5m4 .ne5na5h4 .ne5na5i4 .ne5na5k4 .ne5na5m4 .ne5na5p4 .ne5na5s4 .ne5na5t4 .ne5p4 .ne5s4 .ne6s5tor .ne5š4 .ne5t4 .ne6t5t .ne5u2 .ne5ú2 .ne5v4 .ne5z4d4r .ne5z4d4v .ne5z4l .ne5z4m .ne5z4n .ne5z4r .ne5z4v .nie5k4 .ni5k4 .ni6k5toš .nízko5k4 .novo5u2 .novo5z2 .obi5d4 .ob5k4 .obo5s4 .obo5z4 .ob5s4 .ob5t4 .ob5z4 .od5b4 .od5c4 .od5d4 .od5f4 .od5h4 .od5c4h4 .od5i4 .od6i5ó .od5í4 .od5k4 .odo5b4 .odo5h4 .odo5k4 .odo5m4k4 .odo5p4 .odo5s4 .od5p4 .od5s4 .od5š4 .od5t4 .od5v4 .od5z4 .t4v4r .o5h4l .o5h4ľ .o5h4na .o5h4nú .o5h4r .o5c4h4 .o5k4l .o5k4ľ .okolo5i .okolo5s4 .o5k4ra .o5k4rá .o5k4resať .o5k4resávať .o5k4ri .o5k4rí .o5k4ru .o5k4rú .o5m4l .o5m4n .o5m4r .o5p4 .o6p5lan .o6p5rat .o5s4lab .o5s4lad .o5s4lav .o5s4láv .o5s4lep .o5s4lo .o5s4p4 .o5s4tar .o5s4tať .o5s4tan .o5s4taň .o6s5tatn .o5s4tatok .o5s4tatk .o5s4táv .o5s6to5 .o5s6t4rap .ostro5u .o5s4ved .o5s4vetl .o5s4viet .o5s4viež .o5s4vit .o5s4voj .o5š4k4 .o5š4ľ4 .o5š4m4 .o5š4p4 .o5š4v4 .o5t4ras .o5t4rav .o5t4ráv .o5t4rep .o5t4ria .o5v4dov .o5v4lád .o5v4laž .o5v4p4 .o5v4r .o5z4l4 .o5z4n .o5z4re .o5z4v4l .päť5izbo .plno5a .plno5p4 .plno5š4 .plno5kr4 .plocho5d4 .po5b4 .po5č4 .poda5k4 .pod5b4r .pod5h4 .pod5c4h .pod5k4 .pod5p4 .po5d4ráž .po5d4rep .pod5re .po5d4rh .po5d4rie .po5d4rm .po5d4rv .po5d4r4ž .pod5s4koč .pod5v4 .pod3zem .pod3zol .pod3ža .pod3žu .po5h4 .po6h5reb .po5c4h4 .po5i4 .po5k4 .pol5d4 .pol5i4z .polo5a .polo5b4 .pol5o4blú .polo5d4 .polo5h4l .polo5i .polo5k4 .polo5m4 .polo5o4 .polo5p4 .polo5s4 .polo5t4 .polo5u4 .polo5ú4 .polo5v4 .polo5z4 .pol5s4t .po5m4 .po6m5ník .po5o4 .po5ob4h .po5ob4l .po5s4 .po6s4t5s4k4rip .po6s5tul .po5š4 .po6š5ta .po6š5tov .po6š5v .po5t4k4n .po5t4ľ .po5t4r .poroz5p4 .poroz5s4 .poroz5v4 .po6st5g4r .po6s5ti .po5t4 .po5u .po5v4 .po4v5ra .povy5h4 .povy5k4 .povy5p4 .povy5s4 .povy5v4 .povy5z4 .po5v4z4b .po5z4 .pra5o4 .pra5p4 .pravicovo5o .pra5v4l .pra5v4nu .pra5v4nú .prá5vo5p4 .pra5vo5s4 .pre5b4 .pre5c4 .pred5c4 .pred5h4 .pred5ch4 .pred5i .pred5k4 .pred5m4 .predo5h4 .pred5op .pred5ostatn .pred5p4 .pre5d4rah .pre5d4rap .pre5d4rať .pre5d4raž .pre5d4ri .pre5d4rž .pred5s4 .pred5v4 .pred5z4 .pre5č4 .pre5e2 .pre5f2 .pre5h4 .pre5c4h4 .pre5i4 .pre5k4 .pre6k5vap .pre5m4 .pre5o4 .pre5p4 .pre5s4 .pre6s5n .pre5š4 .pre5t4 .pre5v4 .pre5z4 .pre5ž4 .pri5b4 .pri5č4 .pri5d4 .pri5h4 .pri5c4h4 .pri5k4 .prí5k4 .pri5m4 .pri5p4 .pri5s4 .prí5s4 .prí6s5p .pri6s5p .pri5s4pô .pri5š4 .pri6š5la. .pri6š5li. .pri6š5lo. .pri5t4 .pri5v4 .pri5z4 .pri5ž4 .re5g4 .re5k4 .re6k5v .re5p4 .re6p5n .re5š4 .re5t4 .ro4z5i4 .ro6z5í4 .rozo5b4 .rozo5d4 .rozo5c4h4 .rozo5m4 .rozo5p4 .rozo5r4 .rozo5s4 .rozo5š4 .rozo5z4 .rozo5ž4 .ro6z5u4 .ro6z5v4 3s4polu5 3s4polu5h4 3s4polu5p4 3s4polu5v4 .šikmo5o .široko5 .široko5p4 .štáto5 .št4vor5 .su4b5s4 .sú5h4 .sú5k4r .sú5m4r .sú5s4 .sú5v4 .sú5z4 .troj5 .t4v4r4do5 .viac5k4 .viac5v4 .vide2o5 .vnútro5s4 .vnútro5š4 .vo5p4ch .vo5p4r .vo5s4p .vo5t4 .vo5v4 .vy5 .vý5 .vy5b4 .vy5c4 .vý5c4 .vy5č4 .vý5č4 .vy5d4 .vý5d4 .vy5h4 .vy6h5ň .vy6h5ne .vý5h4 .vy5c4h4 .vy5k4 .vý5k4 .vy5m4 .vy5p4 .vý5p4 .vy5s4 .vý5s4 .vy5š4 .vy6š5š .vý6š5k .vy5t4 .vý5t4 .vy5v4 .vy5z4 .vý5z4 .za5b4 .zá5b4 .za5c4 .za5č4 .za5d4 .za5h4 .za5c4h4 .za5k4 .za5m4 .za5p4 .za5r4 .za5s4 .za5š4 .za5t4 .za5v4 .za5z4 .za5ž4 .zá5k4 .zá5z4 .zo5b4 .zo6d5p .zo5d4r .zo5d4v .zo5h4 .zo5m4l .zo5m4r .zo5s4 .zo5š4 .zo5t4 .zo5v4 .zo5z4 .zo5ž4 5alkohol auto4rk auto4rs 5b4lah 5b4ledn 5b4lesk 5b4lok 5b4lúd 5b4lysk 5b4lysn 5boh3vi4e3a2k 5boh3vi4e3o2d3k 5boh3z4 5boles4t5n 5b4rať 5b4rázd 5b4rec2h 5b4ronz 5b4ruč 5b4rús 5b4rýzg 5c4muk 5c4nie 5c4vak 5c4vič 5c4vik čí6s5lov 5č4len 5č4lánk 5č4lánok 5č4lov 5d4ňov 5d4ramat 5d4rať 5d4vanás4ť5 5d4vih 5d4viž 5d4voj 5d4vor 5e2u2róp 5f4ľak 5f4lias 5f4rancú 5f4rekven 5f4ráz 5g4raf 5g4ram pro6g5ram 5g4réč 5g4rob 5g4vardej 5h4lad 5h4las 5h4lav 5h4ľad 5h4liad 5h4luch 5h4mat 5h4mot 5h4nať 5h4ned 5h4nev 5h4niezd 5h4noj 5h4nut 5h4núť 5h4nút 5h4rab 5h4r3mot 5h4ran 5h4rať 5h4rob 5h4rom 5h4roz 5h4rub 5h4ryz 5h4viezd 5c6h4lap 5c6h4leb 5c6hran 5c6h4rán 5c6h4ráň 5c6h4vál 5c6h4vát 5c6h4vat 5c6h4vost 5jedenás4t5k 5jedenás4ť5 5k4lad 5k4laď 5k4ľak 5k4lam 5k4lásť 5k4liat 5k4liať 5k4lep 5k4les 5k4ľúč 5k4resb 5k4resť 5k4ritic 5k4rídl 5k4rôch 5k4ruh 5k4rúž 5k4ryt 5k4valif 5k4valit 5k4vet 5k4vadr 5m4ladis4t3v 5m4nož 5m4rav 5m4ráz na5d4ž4ga na5d4ž4gá nav3š4tev náv3š4tev nav3š4tív 5p4lán 5p4lastik 5p4lat 5p4lav 5p4leta 5p4letie 5p4letú 5p4liesť 5p4ne2umat 5p4ráv s6práv 5p4riam 5p4rirod 5p2risám 5p4roduk 5s4fér 5s4c2hopn 5s4k4lad 5s4k4lon 5s4koč 5s4kok 5s4kop 5s4kor 5s4kôr 5s4k4romne 5s4k4rot 5s4k4rúc 5s4k4rutk 5s4k4rýv 5s4kúsen 5s4kutoč 5s4k4vúc 5s4ladk 5s4lav 5s4láv 5s4led 5s4lep 5s4lovn 5s4love 5s4lova 5s4lovk 5s4luh 5s4lúž 5s4ľub 5s4maž 5s4mel 5s4mer 5s4piev 5s4pev 5s4por 5s4potreb 5s4p4ravod 5s4p4raved 5s4p4rávn 5s4p4ravo 5s4tarost 5s4tatic 5s4tav 5s4t4rach 5s4t4ran 5s4t4rán 5s4t4ráda 5s4t4raš 5s4t2rat 5s4t2red 5s4t2rek 5s4t4rel 5s4t4reľ 5s4t4riel 5s4t4rieľ 5s4t4rih 5s4t4riž 5s4t4rom 5s4t4rúh 5s4t4run 5s4t4ruž 5s4tati 5d2ve5s4to 5t2ri5s4to 5š4tyri5s4to 5päť5s4to 5šes4ť5s4to 5sedem5s4to 5osem5s4to 5deväť5s4to 5päť5 5šes4ť5 5s4t4la 5s4tup 5s4ved 5š4ľah 5š4liap 5š4kola 5š4k4rab 5š4k4rie 5š4pin 5š4p4liech 5š4print 5š4tart 5š4tát 5š4tep 5š4tít 5š4t4ruktúr 5š4tude 5š4tudo 5š4t4vera 5š4t4vorec 5š4tyli 5š4ťast 5štiep4 5š4t4v4r4ť5k4 5š4t4v4r4ť5l4 5š4t4v4r4ť5r4 5š4t4v4r4ť5s4 5t4lač 5t4lak 5t4ran4s5 5t4ras 5t4resk 5t4retin 5t4ried 5t4rub 5t4r4vaj 5t4r4val 5t4r4van 5uholník 5uhoľn 5viac5h4 5v4čera 5v4lád 5v4las 5v4rás 5v4rav 5v4rat 5v4rát 5v4šimn 5v4ták 5v4tip 5vy5s4t4rája 5v4z4du 5v4z4ťah 5v4z4ťaž 5z4lom 5z4luč 5z4mysel 5z4mysl 5z4nak 5z4nám 5z4náša 5z4rak 5z4väz 5z4vest 5zv4esť 5z4vod 5z4vuk 5z4vuč 5ž4ráč 5ž4rane 5ž4reb 5ž4rút .cv6 .ch6 .sp6 .st6 .šk6 .šp6 .št6 .tk6 .uh6 .uc6h6 .uk6 .um6 .up6 .us6 .ús6 .usc6h6 .úsc6h .usk6 .úsl6 .usm6 .úsm6 .ús7ta. .ús7tami. .ús7toč .ús7ti .ust6l .úst7ny .ust6r .ús7tret .us7t4ric .ús6t6r .úš6 .ut6 .uv6 .uz6 .vd6 .vh6 .vk6 .vp6 .vs6 .vš6 .vt6 .vz6 .vzh6 .vzk6 .vzl6 .vzp6 .vž6 .zb6 .zd6n .zd6r .zd6v .zg6 .zh6 .zm6 .zr6 .zv6 4b4s4ť. 8c4h. 8d4z. 8d4ž. 4c4ht4. 4j4s4ť. 4lt. 4m4p4r. 4m4p4s. 4m4š4t. 4n4k4t. 4p4r4v. 4rd. r4p4t. r4š4č. r4t4z. 4st. 4sť. 5k4rát. 5s4to5k4rát. 5t4ľ4c4ť. akci3a2 akvári3u2m gymnázi3um le2u3kémia t2ri3u2mf kli3e2nt",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=2467,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-sk.rme b/Master/texmf-dist/tex/context/patterns/lang-sk.rme
index 23e94d65df0..de6c31ba3ab 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-sk.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-sk.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Slovak Hyphenation Patterns (Jana Chlebikova, 1992)
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -80,4 +84,4 @@
% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
%%% --------------------------------------------------------------------
% \message {Loading SK hyphenation patterns: Jana Chlebikova, 1992}
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-sl.lua b/Master/texmf-dist/tex/context/patterns/lang-sl.lua
new file mode 100644
index 00000000000..91d7f807744
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-sl.lua
@@ -0,0 +1,115 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="sl",
+ ["source"]="hyph-sl",
+ ["texcomment"]="% Slovenian Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: slhyph.tex (2007-01-29)\
+% Author: Matjaž Vrečko <matjaz at mg-soft.si>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% This is `slhyph.tex' as of 15. 4. 97.\
+%\
+% Copyright (C) 1990 Matjaž Vrečko, TeXCeX (SLO)\
+% [slovenian hyphenation patterns]\
+%\
+% This program can be redistributed and/or modified under the terms\
+% of the LaTeX Project Public License Distributed from CTAN\
+% archives in directory macros/latex/base/lppl.txt; either\
+% version 1 of the License, or any later version.\
+%\
+% This file contains slovene hyphen patterns with čšž\
+%\
+% Generation of hyphen patterns for TeX\
+%\
+% Matjaž Vrečko, TeXCeH (SLO), 1990\
+% Email: matjaz@mg-soft.si\
+%\
+% Changes:\
+% 1990 First version of `hyphen.si' (Matjaž Vrečko, TeXCeX)\
+%\
+% Some cosmetic changes done later on, but none of these apply any more;\
+% the patterns are still the same as they were originally:\
+%\
+% 1994-05-17 Use of code page 852 in patterns (Leon Žlajpah)\
+% 1995-04-06 Release of `sihyph21.tex'\
+% 1995-06-20 Added \\slovenehyphenmins\
+% Release of `sihyph22.tex'\
+% 1997-15-04 Some changes concerning \"c, \"s, \"z and ...\
+% Release of `sihyph23.tex'\
+% 2007-01-20 `sihyph23.tex' renamed to `slhyph.tex'\
+% (sl is the proper language code for Slovenian)\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyzčšž",
+ ["data"]=".av5r .di6spo .ek3s .ek5v .is1 .iz1 .obi4d .ob5it .od1 .po4d5n .po4v5s .pre6d7n .se4k5s .si4s .st4 .voz5l .voz5n .zliz6 a1a a1b ab5ba ab6rod a1c ac5ci a1č a1d ad2l a6dobl ad6rl. ad6rla ad6rob ad5ur a1e1 a1f af5ga af1t a1g a1h a4hm ah5mi ah5mo a1i ai2n1 a1j a4j5ek a4jf aj5fi aj5fo aj5ha aj5he aj5im aj6imo aj3os aj6stb a5ju. aj3uč aj3ug aj5žn a1k ak4s a4kst a1l a1m a4mz a1n an6dga an6dhi a4nm an5mi an5zi a1o ao2b1 a1p a4ph a1ra ar6dwa a1re a1ri a1ro a1ru ar5xa ar5xo ar5xu a1s a4sš as5šč a1š a1t a4tf at4i a1u1 a4uf a2uk a4ul a1v av5ši a4vž av5ža ay5to a1ze az5fo a4zig az3la az3le az4lil az4lit az4liv a4zob a4z3oč az5ora az5oro a4zra az4red az5vp a1ž až5mi ba6bba ban3č4 ba4u 2b1c 2b1č 2b1d be1 be4v b1h bi1 b1ja b4ja. b5jel b3jem b5jet 2b1k b3lep b5leta b5lil b5lit b5liv b1m 4bmi 2b1n bo1 bo6chm b5ord bo5vp b3rab b5ras b3raš b3rez bre4zg bre4zi bre4zr b5reže b3rob br6žda 2b1s 2b1š 2b1t bu5ki bu5ku bu5kv bu5ry 2b1v b1z b1ž 2cc 2ch. ch5ma 2ck c1ka ck1o2 c5ko. ckov3 ck1s ck5we 2c1n 2c1t 2č1b 2č1g či1 1čj 2č1k 1čl 4č3let č5mes 2č1n 4čop 2č1p 2č1s 4čup 2d1b 2d1c 2d1č 2d1d dd6voj d2e 6d5elem de4min de4mn de4z3i 2d1g 2d1h di5ck 4dind d4i5no dis1 di4skr di6spr 2d1j 2d1k 5dlet d2li d5lit d5liv d1lo 2d3m 4d3nac 4d5nač 4d5nap 4d3nar 4dnas 4d5neb d5niv 4d5niz 4d5njač 4d3nož d2o 4dobč 4d5obd 2d3o2f do5rd do5vč do5v4z 2d1p d5raz d3rep dre6pn d4rev 2d1s 2d1š 2d1t dteks6 d4ur du5ro du5um 2d1v 4d3vi 2d1z2 e1a e1b eb4j eb6liz e1c e1č e4čd eč5de eč5di eč5do eč3le eč5op e4čt eč5ti eč5to eč5tr eč5up e2č1v eč6vrs e1d e4df ed5ig ed2l ed5ob ed6obe ed6obr e4dobs e4d3oč ed5vč ed5zb e1e e4ep e1f e4ff ef5fe ef5ta e1g e1h e1i ei6pzi ei2z eiz5e e1j e1k ek6mal ek6tre e1l e1m e1n e1o1 eob4j eob4r eo4dl eo4z5n e1p ep5nik e1ra era6z5l era5z4r era5z4v e1re e4rf e1ri e1ro e4rr e1ru e1s es5da e5sta e5sti. e5stih e5stil e1š e4šp eš5po e1t 4eth e4tinš e1u1 e1v eve6t5l ev5ha ev6pre ev6ste ev5stv 2ew ew6ind ew5le e4wt ew5to e4yw e1z ez5dj e3z4dr ez2g ez5gl e5zij ez6ijo ez5imn e5zis ez6ist ez5iz ez4l ez6lom ez6man ez4mo e4zob e4z5or ez4re e4zt e4z5u4m5 e4zž e1ž 1fa fe1 fe6ljt ff5ma fi6zlj 2f1n fo6uri fre4u 2f1s 2ft ft5ve fu1 2g1d ge6ige gel5č4 ge6njč gi6tpr go1 go5vz 2g1t gu1 ha4u 2h1č he4i 2h1k 4hl. h4lo 2h1n h5ren 2h1š 2h1t 1hu hu6ffm i1a i1b i1c i4cs i1ča i1če i1či ič5ra i1ču ič5vr i1d 4idor i1e1 i1f i1g 4igh i1h i1i ii2n1 i1j i1k i4kč ik5ča i1l il5č4k 4ile 4ilo i1m i4mh im5hi i1n 1ind 2ine 3i4n3os 1inp 3inse 1inš 4inšk 3intr i1o1 i1p i1r 4ire i1s is4a is6ert isis4 i4skv 2iss i1š i1t it5pr i1u i1v iv5jo i1x i1z iz1l iz4la izli4z iz5me iz5mo iz6ode iz5po i2zr iz1u iz6ure i1ž j5akt 2j1b 2j1c 2j1č 2j1d je4ks4 2j1g 2jh j1hi 4jime 4j5int 2j1k 2j1l 2j1m 2j1n 4job 2j1od jod4l 2jos 4jož 2j1p 2j1r jra1 jraz4 2j1s jsis6t 2j1š 2j1t ju1 2juč ju5dm 2jus ju2ž1 2j1v 2j1z jz6ves 2k1c 2k1d ke5ti ki1 2k1m 1kn ko1 kok4 ko5kd ko6vše koz6lo 1kre 2ks. k5sat ks1c ks1p ks4po ks1t 4kst. ks6taz ks5te 2k1t 3ktr 4ktra ku5ro k5vip la4ir la6vz. 2l1b 2l1c 2l1č 2l1d le1 le4e le6ipz le5me 2l1f 2l1g lg5ča 2l1h l2i1 li6dž. 1liz 4l5izd 2lj. 4ljc 2ljč 2ljk 2ljn 2ljs 2ljš lju5d6j 2l1k 2l1l 2l1m 2l1n lo1 1loč 2l1p 2l1s 2l1š 2l1t lu5ki lu5ku 2l1v 2l1z 2l1ž 2m1b 2m1c 2m1č 2m1d me4d5n me6dos me4dr 2m1f 4mind 4minp 4minš mi6th. 2m1k 2m1m m5niv mo6št. mo6vš. 2m1p 2m1s 2m1š 2m1t m5urn 2m1v my5hi 2m1ž na1 5načel na4d5nj nad5r na6dra na4dre na6dur 1naj na6jak na4j5en naj3o na6joč na4j3u 1nas na4v3z navze6 1naz naz6or 2n1b 2n1c 2nč n1ča n1če n1či n1ču 2n3d2 nd5ga nd5hi n4dm ne1 ne3d2 1neh ne3zm nez4v 2n1f 2n1g n4gh ng5ha n4gv ng5vi 2n1h 2nj. 2njc nje4v5s 2njk 2njs 2njš 4njv 2n1k 2n1l 2n1n no5rd n4ost 2n1p 2n1s nsis4 2n1š 2n1t nteks4 n4tg nt5ga nt5ge n4tv nt5vi nu1 2n1v ny5qu 2n1z nz4i 2n1ž o1a o4as o1b ob5gl ob5ide ob5jo 5obla 5obro o4bz o1c oc5ke oc5ki o4cr o1č o1d od5dv od5nal o6drep od5zd o2d1ž o1e oele4 o1f o1g 4ogl o1h o1i oiz2 o1j o1k o4kb ok5ba ok5be o4kt o1l o6l5avt ol6gča o4lr ol5re o1m o1n o1o ood4l o2ol o4om o1p o4pm op5me 4opy o1ra or4deč o1re o1ri o1ro o1ru o1s 5oseb ose4m5 o1š o1t o1u ou5ki ou5ku o1v ov5sem ov5šk o2v1z o5vza ov3zd o1y o1z oz4b ozd5j oz4g oz5lo oz6lož oz2n oz5nic oz5niš oz2o oz2r oz2v o1ž ož5mi 2p1c 2p3č2 pč5ka pe1 1peč pe4kt pet3l pe4tle pe4v5s pev5t4 4phs ph5so pi5zo 2p1k 4ploz po1 po6dfa po4d3l po4dna po4d5oč po6lob po6std prez4 2p1s 2p1š 2p1t pz6ig. qu2 3raču 2rae ra6jžn rav5z ra6vza ra4z5id 3razl ra4z5or 2r1b 2r1c 2r1č 2r1d re1 3real re6cht re5čv 5redč re6dig re6dnju re6iba re5jo re5km re6sda rev6sk re6znač re6zus re6zve r1f 2r1g 2r1h ri1 r4in ri5n4o riz4g riz4l riz4n 2r1j 2r1k 2r1l 2r1m 2r1n ro1 rob6id 3rodi ro5zo 2r1p r1r 2r1s 2r1š 2r1t r4th rt5ha ru5kl 2r1v r3v2j rv5jo ry5an 2r1z rz2l r1ž rž5da 2s1b 1sc 4sc. s2ci se4k5sa sek5si se5ma se5vp 2s1f si1 s4id si6gn. sis1 2s1j 2sk. s2kn 4skre s4lav s4on soni5 sonič4 1sp s4plod spod4l 2s1s 2st. 3ste s4ten 4stf s4tič 5stim s4tir 2stk 2stm 1str s4tra. su1 su4bo sve5t š2č 2šč. 2ščk 2ščn še2s 2š1j ta5wi taz4 2t1b 2t1c tch5o 2t1d tek6st 5tema te5xa t1f 4tind 4tinos 4tinp 4tinse 4t3int 2t1k 6tletno 2t1m 4tnaj to6vž. trt5u tr6tur 2t1s 2t1t tu1 4tz. 2u1a u1b ub4j u4bp ub5po u1c u1č u1d ud6mi. u1e u1f u1g u1h u1i u1j u1ka u1ke u1ko u1l u1m u1n u1p up6čka u1ra u1re 4urg u1ri u1s 1usp u1š uše3s u1t u4th uth5o u1v ux5em u1z u1ž 2v1b 2v1c 2vč v1ča v1če v4čer v1či 2v1d ve4čl ve4čm ve4i ve4tin vetle6t v1f v1g vi5dv vid6va 1viv vi6žg. 2v1j 4vjo 2v1k 2v1m 2v1n vo5rd voz5le 2v1p 3v2pa v4pij v4pil v5skn v5šek 4všk 2v1t vt4k vz2 v2za 3v2zg 2v3zk 2vzo v3zp v2zu 1wa wo2 x1f 1ye 2y1f y1j y1l y1w 1z2a z6ane. za5uk za3vp za1z2 za5zd 2z1b 3zbir z1c 2z1č 2z1d2 zd5ju z3dv z1g z4gni z5got 2z1h 1zi z1ig 2z1is 4z5išč 2z1j 2z1k z3ku z5las z1li 3zlil 5zlit 5zliv zliz5 1zlj 3zlog z5lom 3zlož z1lu 2z1m 1zn 1zo z1ob 2z1od z1og z2ol z4om 2z1p 1z1r 4zredč 4zreš 4zrez 4zrež 4zri 4zru 2z1s z1š z1t 1zu z4uj 2z1up 2z1uz z1v2 z4ven z3vn 3z4voj z4vok 2z1z2 z1ž 2ž1b 2ž1c 2ž1č 2ž1j 2ž1k 4žmi .č8 .š8 .ž8 8ž. 8š. 8č.",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=1068,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-sl.rme b/Master/texmf-dist/tex/context/patterns/lang-sl.rme
index 2cd1751323a..a26fbbe6872 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-sl.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-sl.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Slovenian Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -91,4 +95,4 @@
% Release of `sihyph23.tex'
% 2007-01-20 `sihyph23.tex' renamed to `slhyph.tex'
% (sl is the proper language code for Slovenian)
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-sr.lua b/Master/texmf-dist/tex/context/patterns/lang-sr.lua
new file mode 100644
index 00000000000..f4292306692
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-sr.lua
@@ -0,0 +1,103 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["characters"]="абвгдезиклмнопрстуцшјњћ",
+ ["data"]="на-дно на-тка на-тка-ти на-тка-ше о-дно о-тка о-тка-ти о-тка-ше по-дно по-дне по-тку по-тки по-тке по-тка у-дно и-где и-гдје сву-где све-где сву-гдје све-гдје по-не-где по-не-гдје и-зби и-збе и-зба и-зби-ци и-зби-це и-зби-ца и-звит и-зим изо-ба-ру изо-ба-ри изо-ба-ре изо-ба-ра и-скок и-ско-ку и-ско-ка и-скон и-ско-ну и-ско-ни и-ско-на и-скру и-скре и-скри и-скра и-скрав и-спод и-спо-да и-стру и-стри и-стро и-стре и-стра на-ју на-ји на-јо на-је на-ја на-јам на-јест о-браз о-брет о-дви-ка о-дран о-дра-ти пре-двој ра-зму ра-зми ра-змо ра-зме ра-зма ра-зну ра-зни ра-зно ра-зне ра-зна ра-склоп ра-спе-лу ра-спе-ло ра-спе-ла ра-спе-ћа ра-спе-ћу ра-спе-ће ра-сту ра-сти ра-сте ра-ста ра-стом ра-стер ра-шћу ра-шћи ра-шћо ра-шће ра-шћа у-зно у-зна у-зни у-зник у-зрок у-ску у-ски у-ско у-ске у-ска ус-кос у-спио у-спео у-спор у-шћу у-шће у-шћа ин-те-рес тран-су тран-са тран-сом те-ле-ви-зор те-ле-ви-зо-ру те-ле-ви-зо-ром те-ле-ви-зо-ра те-ле-ви-зо-ри при-ти-сак при-ти-с-ком при-ти-с-ку при-ти-с-ка по-ја-ви-ће на-пу-шта про-гра-ми-ра-ње сни-ма-ња сни-ма-ње",
+ ["n"]=130,
+ },
+ ["metadata"]={
+ ["mnemonic"]="sr",
+ ["source"]="hyph-sr-cyrl",
+ ["texcomment"]="% Serbian hyphenation patterns in Cyrillic script\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: srhyphc.tex (2003-06-09)\
+% Author: Aleksandar Jelenak <ajelenak AT yahoo.com>, Dejan Muhamedagić\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% This is `srhyphc.tex' file. It contains hyphenation patterns for Serbian\
+% language in the Cyrillic alphabet. TeX font encoding is T2A.\
+%\
+% This file is distributed under the terms of the GNU General Public License.\
+% Latest version of the license is at <http://www.gnu.org/copyleft/gpl.html>.\
+%\
+% Version: 1.0a\
+% Last change: 2003-06-09\
+%\
+% Credits:\
+% - Initial hyphenation patterns for T1 font encoding by Dejan Muhamedagić\
+% - Improvements and adaptation to T2A font encoding by Strahinja Radić\
+% - Further improvements and integration into one file by Aleksandar Jelenak\
+%\
+% Current maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com>\
+%\
+% \\message{Serbian Cyrillic Hyphenation Patterns `srhyphc.tex' v1.0a <2003-06-09>}\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="абвгдежзиклмнопрстуфхцчшђјљњћџ",
+ ["data"]=".ђ2 .ћ2 .ч2 .ш2 .ж2 .а2б3алиј .а2б3анац .а2б3ерац .а2б3ерир .а2б3евак .а2б3ирит .а2б3ју .а2б3ла .а2б3лег .а2б3леп .а2б3лок .а2б3лу .а2б3ориг .а2б3реак .а2б3рог .а2б3узус .а2д3ерац .а2д3ј .а2д3лат .а2д3рен .а2д3рог .а2д3верб .а2н3а4е2ро .а2н3афиј .а2н3афрод .а2н3аго .а2н3акуз .а2н3алд .а2н3алфа .а2н3алг .а2н3амерт .а2н3андр .а2н3ант .а2н3апто .а2н3арх .а2н3егер .а2н3екл .а2н3екум .а2н3елек .а2н3енер .а2н3епи .а2н3ерг .а2н3ерит .а2н3есте .а2н3идр .а2н3ирид .а2н3изог .а2н3изом .а2н3изур .а2н3јон .а2н3офт .а2н3окс .а2н3опис .а2н3орг .а2н3орх .а2н3овар .а2набап .а2набат .а2набаз .а2набио .а2набол .а2надем .а2надипл .а2надоз .а2нафаз .а2нафила .а2нафон .а2нафор .а2наген .а2нагно .а2награ .а2нахор .а2нахро .а2накал .а2накам .а2накат .а2накеф .а2накла .а2накли .а2накој .а2накол .а2накрон .а2накру .а2налеп .а2налис .а2налит .а2нализ .а2намне .а2нанео .а2напла .а2напле .а2напне .а2напно .а2напро .а2напти .а2нарт .а2насар .а2насеи .а2наспаз .а2наста .а2настиг .а2настом .а2натим .а2натоц .а2натом .а2натре .а2натри .а2натро .а2неор .а3г2нос .а3г2ноз .а4е2ро .б2 .бе2ш3ћ .бе2ш3ч .бе2с3ц .бе2с3к .бе2с3п .бе2с3т .бе2з3алкохол .бе2з3атомск .бе2з3б .бе2з3д .бе2з3г .бе2з3и .бе2з3л .бе2з3љ .бе2з3м .бе2з3н .бе2з3њ .бе2з3о .бе2з3р .бе2з3у .бе2з3в .бе3с4крупул .бе3с4покоја .бе3с4покојн .бе3с4пора .бе3с4порн .бе3с4тид .бе3с4тија .бе3с4тиљ .бе3с4тилу .бе3с4трана .бе3с4трас .бе3с4твар .бе3з4беда .бе3з4бедн .бе3з4бели .бе3з4бједа .бе3з4бједн .бе3з4бол .бе3з4истан .бе3з4истен .бе3з4јач .бе3з4јак .бе3з4лоба .бе3з4лобн .бе3з4начај .бе3з4рача .бе3з4рачн .бе3з4уб .бе3з4уп .бе3з4вуча .бе3з4вучн .бе4о .бес4тселер .би4о .ц2 .д2 .џ2 .ди2с3акор .ди2с3јунк .ди2с3конт .ди2с3корд .ди2с3кре .ди2с3кри .ди2с3кур .ди2с3квал .ди2с3ло .ди2с3ориј .ди2с3парит .ди2с3пон .ди2с3поз .ди2с3проп .ди2с3тон .ди2с3трак .ф2 .г2 .ге4о .х2 .и2ш3ћ .и2ш3ч .и2ж3ђ .и2н3абруп .и2н3адек .и2н3афек .и2н3акце .и2н3акур .и2н3амор .и2н3аниц .и2н3аплик .и2н3апст .и2н3арт .и2н3аугур .и2н3аура .и2н3ед .и2н3ефек .и2н3ег .и2н3екс .и2н3екв .и2н3елиг .и2н3епц .и2н3евид .и2н3јек .и2н3јур .и2н3јуст .и2н3обл .и2н3офиц .и2н3окуп .и2н3опер .и2н3опор .и2н3опсе .и2н3умбр .и2н3унда .и2н3унк .и2н3утил .и2ноген .и2нокор .и2с3ц .и2с3к .и2с3п .и2с3т .и2з3аба .и2з3ака .и2з3анал .и2з3б .и2з3бија .и2з3бива .и2з3д .и2з3дај .и2з3г .и2з3и .и2з3л .и2з3љ .и2з3м .и2з3н .и2з3њ .и2з3о .и2з3р .и2з3у .и2з3в .и2з3ведб .и2з3веде .и2з3веди .и2з3ведн .и3с4как .и3с4кариот .и3с4кат .и3с4кин .и3с4кита .и3с4коч .и3с4конск .и3с4крам .и3с4крат .и3с4крен .и3с4крењ .и3с4крич .и3с4криш .и3с4криц .и3с4крит .и3с4крој .и3с4крса .и3с4крсн .и3с4купља .и3с4квас .и3с4кврч .и3с4лаб .и3с4лам .и3с4леђ .и3с4лед .и3с4лијеђ .и3с4лијед .и3с4лик .и3с4лин .и3с4љеђ .и3с4љед .и3с4лов .и3с4луш .и3с4луж .и3с4ме .и3с4мије .и3с4мје .и3с4паљив .и3с4пав .и3с4пира .и3с4плић .и3с4плит .и3с4покој .и3с4полин .и3с4пон .и3с4порав .и3с4права .и3с4прави .и3с4правк .и3с4прављ .и3с4правн .и3с4пупч .и3с4пур .и3с4ред .и3с4рк .и3с4таћ .и3с4такн .и3с4там .и3с4тар .и3с4тас .и3с4тави .и3с4тављ .и3с4тиц .и3с4тифан .и3с4тин .и3с4тир .и3с4точа .и3с4точн .и3с4точњ .и3с4ток .и3с4тори .и3с4трад .и3с4тран .и3с4трав .и3с4трић .и3с4триж .и3с4триц .и3с4труг .и3с4туп .и3с4уш .и3с4ук .и3с4ус .и3с4ут .и3з4бав .и3з4бичкава .и3з4блеушан .и3з4бојак .и3з4бојк .и3з4драв .и3з4гомет .и3з4гред .и3з4грн .и3з4грт .и3з4иђ .и3з4ид .и3з4ими .и3з4јежљ .и3з4лож .и3з4лог .и3з4лопаћ .и3з4лоз .и3з4ним .и3з4ној .и3з4олац .и3з4олат .и3з4олир .и3з4олов .и3з4рачи .и3з4раел .и3з4раиљ .и3з4ун .и3з4упч .и3з4вала .и3з4вале .и3з4вали .и3з4ваљи .и3з4валу .и3з4вижд .и3з4виискр .и3з4вија .и3з4вијен .и3з4вин .и3з4вињ .и3з4вир .и3з4витоп .и3з4вјед .и3з4војац .и3з4војц .и3з4вор .инте2р3а .инте2р3е .инте2р3и .инте2р3је .инте2р3о .инте2р3у .инте3р4ежџ .инте3р4егн .инте3р4еса .инте3р4есе .инте3р4еси .инте3р4есн .инте3р4есо .инте3р4есу .инте3р4ије .инте3р4огат .ист2к .из3бе2з3обр .из3бе2з3ум .из3г2н .из3ва2н3евр .из4оанем .из4оаном .из4обат .из4оброн .из4одим .из4один .из4одоз .из4офон .из4офот .из4огам .из4огео .из4оглос .из4огон .из4ограф .из4охал .из4охаз .из4охел .из4охиј .из4охим .из4охипс .из4охит .из4охор .из4охро .из4оклин .из4околон .из4олекс .из4олукс .из4омер .из4ометр .из4оморф .из4онеф .из4оном .из4опат .из4опер .из4опле .из4опол .из4опсеф .из4орах .из4осеи .из4осинт .из4осист .из4оскел .из4оскоп .из4остаз .из4осте .из4отах .из4отал .из4отер .из4отон .из4отоп .из4отро .иза3г2н .иза3т2к .изд2на .изд2но .изд2ну .изр2к .јури2с3к .јури2с3п .к2 .љ2 .м2 .н2 .на2д3жањ .на2д3ждр .на2д3же .на2д3жир .на2д3жив .на2д3жњ .на2д3жуп .на2д3игр .на2д3инж .на2д3ина .на2д3иск .на2д3јач .на2д3јах .на2д3јеч .на2д3јек .на2д3јез .на2д3јун .на2д3л .на2д3љ .на2д3оч .на2д3офи .на2д3ора .на2д3осе .на2д3осје .на2д3осо .на2д3рач .на2д3рашћ .на2д3ран .на2д3раст .на2д3реал .на2д3реп .на2д3руч .на2д3руг .на2д3рук .на2д3уч .на2д3удар .на2д3ум .на2д3в .на2ј3а .на2ј3е .на2ј3и .на2ј3о .на2ј3у .на3д2нев .на3д2нич .на3д2ниц .на3д4лан .на3д4леш .на3д4леж .на3д4вал .на3д4веси .на3д4вест .на3д4виј .на3д4вит .на3д4вла .на3д4воје .на3д4вор .на3ј4аш .на3ј4ажи .на3ј4ада .на3ј4аде .на3ј4ади .на3ј4ах .на3ј4ака .на3ј4ако .на3ј4ало .на3ј4ами .на3ј4амл .на3ј4амн .на3ј4арц .на3ј4ари .на3ј4арм .на3ј4ати .на3ј4аук .на3ј4ава .на3ј4аве .на3ј4ави .на3ј4ављ .на3ј4ази .на3ј4еже .на3ј4ежи .на3ј4ежу .на3ј4ец .на3ј4еда .на3ј4еди .на3ј4едн .на3ј4едр .на3ј4ести .на3ј4етк .на3ј4езд .на3ј4езн .на3ј4урен .на3ј4ури .на3т2ках .на3т2кам .на3т2касм .на3т2каст .наг2н .наг2њ .ну2с3пос .ну2с3про .ну2з3бел .ну2з3биљ .ну2з3љуб .ну2з3ре .ну2з3рје .ну2з3уж .о2б3игр .о2б3истин .о2б3истињ .о2б3ј .о2б3лај .о2б3лакш .о2б3лам .о2б3ласк .о2б3лећ .о2б3леж .о2б3леден .о2б3лег .о2б3леп .о2б3лет .о2б3лијеж .о2б3лијег .о2б3лијеп .о2б3лијет .о2б3лист .о2б3лив .о2б3лизат .о2б3лизав .о2б3лизи .о2б3љ .о2б3лока .о2б3луч .о2б3лук .о2б3ору .о2б3р .о2б3уж .о2б3убож .о2б3уд .о2б3уме .о2б3уми .о2б3умр .о2б3уз .о2д3жал .о2д3жаљ .о2д3же .о2д3жи .о2д3жв .о2д3арг .о2д3и2з3д .о2д3и2з3в .о2д3игр .о2д3иск .о2д3исти .о2д3ј .о2д3л .о2д3љ .о2д3ок .о2д3онд .о2д3онл .о2д3оно .о2д3ону .о2д3озд .о2д3озг .о2д3р .о2д3уч .о2д3ук .о2д3ул .о2д3ум .о2д3уве .о2д3уви .о2д3узд .о2д3узе .о2д3узи .о2д3узл .о2д3в .о3б4јеш .о3б4јек .о3б4јер .о3б4јеси .о3б4јет .о3б4љан .о3б4љут .о3б4љуз .о3б4рђ .о3б4рч .о3б4рш .о3б4раћ .о3б4рашч .о3б4рашн .о3б4раже .о3б4рамб .о3б4ран .о3б4рањ .о3б4рат .о3б4раза .о3б4разд .о3б4рази .о3б4разн .о3б4разо .о3б4разу .о3б4ређ .о3б4реч .о3б4реж .о3б4рец .о3б4ред .о3б4рем .о3б4рес .о3б4рети .о3б4ретн .о3б4рич .о3б4риц .о3б4риј .о3б4рис .о3б4рит .о3б4рив .о3б4рк .о3б4рл .о3б4рљ .о3б4рн .о3б4роћ .о3б4роч .о3б4рок .о3б4рон .о3б4рова .о3б4ровц .о3б4рс .о3б4руч .о3б4руш .о3б4рук .о3б4рун .о3б4рус .о3д4јећ .о3д4јен .о3д4јев .о3д4лаж .о3д4лаг .о3д4лака .о3д4лаз .о3д4луч .о3д4лук .о3д4рж .о3д4раћ .о3д4рачи .о3д4раж .о3д4рана .о3д4ране .о3д4рани .о3д4рано .о3д4рану .о3д4рапа .о3д4рапи .о3д4рапљ .о3д4раз .о3д4ређ .о3д4ред .о3д4рем .о3д4рен .о3д4рич .о3д4риш .о3д4риб .о3д4риц .о3д4рин .о3д4рињ .о3д4рл .о3д4рљ .о3д4рн .о3д4рон .о3д4роњ .о3д4рп .о3д4рт .о3д4руж .о3д4руг .о3д4рвеч .о3д4рвен .о3д4рвењ .о3д4важ .о3д4вај .о3д4веса .о3д4весн .о3д4вест .о3д4вић .о3д4викав .о3д4викн .о3д4вис .о3д4вој .о3т2ках .о3т2кам .о3т2касм .о3т2каст .обе2ш3ћ .обе2ш3ч .обе2с3ц .обе2с3к .обе2с3п .обе2с3т .обе2з3б .обе2з3д .обе2з3г .обе2з3ј .обе2з3л .обе2з3љ .обе2з3м .обе2з3н .обе2з3о .обе2з3р .обе2з3у .обе2з3в .обе3с4тан .обе3с4тиј .обе3с4тран .обе3з4нач .обе3з4нан .обе3з4нањ .обе3з4уб .обе3з4виј .од3г2н .од3м2н .ода3д2н .ода3г2н .по2д3адм .по2д3игр .по2д3изв .по2д3ј .по2д3лакат .по2д3лакт .по2д3лећ .по2д3леж .по2д3лег .по2д3леп .по2д3лет .по2д3лијећ .по2д3лијеж .по2д3лијег .по2д3лијеп .по2д3лијет .по2д3лист .по2д3лиз .по2д3љут .по2д3лок .по2д3лом .по2д3луч .по2д3луж .по2д3луп .по2д3оч .по2д3ош .по2д3оф .по2д3окн .по2д3ра2з3д .по2д3рад .по2д3рам .по2д3ран .по2д3рањ .по2д3рас .по2д3равн .по2д3равњ .по2д3разр .по2д3разу .по2д3реп .по2д3рес .по2д3рез .по2д3рик .по2д3рит .по2д3рож .по2д3рон .по2д3ров .по2д3руча .по2д3ручи .по2д3ручн .по2д3руб .по2д3рук .по2д3упла .по2д3усм .по2д3усн .по2д3вариј .по2д3веч .по2д3веж .по2д3вез .по2д3вик .по2д3вил .по2д3вир .по2д3влаш .по2д3влас .по2д3вођ .по2д3вож .по2д3вод .по2д3воз .по2д3врћ .по2д3врж .по2д3враћ .по2д3врат .по2д3врг .по2д3врис .по2д3врс .по2д3вућ .по2ст3егз .по2ст3инду .по2ст3лим .по2ст3онк .по2ст3опер .по3д2нев .по3д4јеч .по3д4јен .по3г2н .по3м2н .по3м2њ .по3р2ђ .по3т2ках .по3т2кам .по3т2кат .по3т2кав .пре2д3же .пре2д3жи .пре2д3ид .пре2д3игр .пре2д3испи .пре2д3исто .пре2д3истр .пре2д3изб .пре2д3ј .пре2д3обј .пре2д3одре .пре2д3окус .пре2д3осе .пре2д3осје .пре2д3осв .пре2д3рач .пре2д3рад .пре2д3рат .пре2д3руч .пре2д3убеђ .пре2д3убијеђ .пре2д3убјеђ .пре2д3удар .пре2д3угов .пре2д3упис .пре2д3усло .пре2д3увер .пре2д3увјер .пре2д3увјет .пре2д3в .пре3д4јен .пре3д4вај .пре3д4вар .пре3д4вест .пре3д4воја .пре3д4воје .пре3д4воји .пре3д4вор .пре3д4вос .пре3т2ках .пре3т2кам .пре3т2кат .пред3м2н .пред3м2њ .про3г2н .про3т2ка .про3т2ки .проти2в3акц .проти2в3оф .проти2в3отр .проти2в3р .проти2в3уд .проти2в3ус .р2 .ра2ш3ћ .ра2ш3ч .ра2ж3ђ .ра2с3ц .ра2с3к .ра2с3п .ра2с3т .ра2з3анал .ра2з3б .ра2з3д .ра2з3е .ра2з3г .ра2з3и .ра2з3л .ра2з3љ .ра2з3м .ра2з3н .ра2з3њ .ра2з3оба .ра2з3обл .ра2з3обр .ра2з3од .ра2з3орат .ра2з3орав .ра2з3орт .ра2з3ору .ра2з3от .ра2з3р .ра2з3уда .ра2з3удб .ра2з3уди .ра2з3улар .ра2з3умр .ра2з3уве .ра2з3узд .ра2з3узе .ра2з3узи .ра2з3в .ра3ш4ћењ .ра3ш4чић .ра3с4как .ра3с4канд .ра3с4кин .ра3с4клад .ра3с4клањ .ра3с4клап .ра3с4клон .ра3с4клопа .ра3с4клопи .ра3с4клопљ .ра3с4кош .ра3с4кроп .ра3с4пај .ра3с4пав .ра3с4пета .ра3с4пете .ра3с4пети .ра3с4пето .ра3с4пику .ра3с4пињ .ра3с4плин .ра3с4плињ .ра3с4пн .ра3с4полож .ра3с4пон .ра3с4пор .ра3с4прав .ра3с4прем .ра3с4рђ .ра3с4рд .ра3с4ре .ра3с4тај .ра3с4тан .ра3с4тат .ра3с4тав .ра3с4тењ .ра3с4тил .ра3с4тињ .ра3с4тир .ра3с4тис .ра3с4тит .ра3с4тој .ра3с4трел .ра3с4трет .ра3с4трој .ра3с4трт .ра3с4тућ .ра3с4туп .ра3с4тур .ра3з4башур .ра3з4бад .ра3з4бан .ра3з4бар .ра3з4бау .ра3з4бој .ра3з4бор .ра3з4ев .ра3з4гађ .ра3з4грт .ра3з4иђ .ра3з4ић .ра3з4ид .ра3з4иј .ра3з4ин .ра3з4ир .ра3з4из .ра3з4лаг .ра3з4лаз .ра3з4лич .ра3з4лик .ра3з4лож .ра3з4лог .ра3з4лоз .ра3з4мећ .ра3з4мет .ра3з4мрск .ра3з4нат .ра3з4ред .ра3з4роч .ра3з4рок .ра3з4вал .ра3з4веде .ра3з4вест .ра3з4вић .ра3з4виго .ра3з4вија .ра3з4вије .ра3з4вију .ра3з4вит .ра3з4вој .ра3з4вон .ра3з4врћ .ра3з4враћ .ра3з4врат .ра3з4врт .ра4с5турч .раз3д2ни .раз3г2н .раза3г2н .раза3т2ка .с2 .су2б3а .су2б3инв .су2б3јунк .су2б3л .су2б3окс .су2б3орд .су2б3реп .су2б3рог .су3б4аш .супе2р3а .супе2р3е .супе2р3и .супе2р3о .супе2р3у .супе3р4иор .тран2с3а .тран2с3ц .тран2с3е .тран2с3к .тран2с3л .тран2с3м .тран2с3н .тран2с3о .тран2с3п .тран2с3т .тран2с3у .тран2с3в .тран3с4еп .тран3с4кри .тран3с4уд .тран3с4ум .у2ш3ћ .у2ш3ч .у2с3ц .у2с3к .у2с3п .у2с3талас .у2с3тара .у2с3тећ .у2с3тег .у2с3тер .у2с3тов .у2с3трћ .у2с3трч .у2с3трај .у2с3трал .у2с3треб .у2с3треп .у2с3трес .у2с3трг .у2с3трк .у2с3трн .у2с3трп .у2с3тућ .у2с3тум .у2с3тур .у2с3тврђ .у2с3тврд .у2з3б .у2з3д .у2з3г .у2з3и .у2з3игр .у2з3инат .у2з3искр .у2з3л .у2з3љ .у2з3м .у2з3н .у2з3њ .у2з3обест .у2з3обијест .у2з3охо .у2з3орат .у2з3орав .у2з3р .у2з3угар .у2з3в .у3г2ми .у3г2н .у3с4как .у3с4клађ .у3с4клад .у3с4ко .у3с4куп .у3с4пало .у3с4пав .у3с4пеш .у3с4пех .у3с4пел .у3с4пем .у3с4пент .у3с4пет .у3с4пев .у3с4пија .у3с4пије .у3с4пијуш .у3с4пикуш .у3с4пјеш .у3с4пјех .у3с4пјел .у3с4пјем .у3с4пјет .у3с4пјев .у3с4пон .у3с4пора .у3с4пореч .у3с4порен .у3с4порењ .у3с4пори .у3с4пособ .у3с4према .у3с4преми .у3с4рђ .у3с4рж .у3с4ра .у3с4рд .у3с4ре .у3с4ријед .у3с4рк .у3с4рљ .у3с4рн .у3с4рп .у3з4бор .у3з4диц .у3з4лан .у3з4лат .у3з4лић .у3з4лиц .у3з4лим .у3з4лит .у3з4лов .у3з4лудоб .у3з4нач .у3з4нак .у3з4неве .у3з4невје .у3з4нич .у3з4ниц .у3з4ној .у3з4рет .у3з4рев .у3з4ријет .у3з4ријев .у3з4рн .у3з4рњ .у3з4роч .у3з4рока .у3з4роко .у3з4року .у3з4руј .у3з4ван .у3з4ват .у3з4виж .у3з4вија .у3з4вије .у3з4вијо .у3з4вију .у3з4вој .у4с5кош .у4с5коко .у4с5коле .у4с5колу .у4с5ком .у4с5копа .у4с5кора .у4с5коси .у4с5котр .у4с5ков .уза3т2ка .ва2н3евр .ва2н3устав .з2 .за3г2н .за3т2ка 2ђ1ђ 2ђ1ћ 2ђ1ч 2ђ1ш 2ђ1ж 2ђ1б 2ђ1ц 2ђ1д 2ђ1џ 2ђ1ф 2ђ1г 2ђ1х 2ђ1к 2ђ1љ 2ђ1м 2ђ1н 2ђ1р 2ђ1с 2ђ1з 2ћ1ђ 2ћ1ћ 2ћ1ч 2ћ1ш 2ћ1ж 2ћ1б 2ћ1ц 2ћ1д 2ћ1џ 2ћ1ф 2ћ1г 2ћ1х 2ћ1к 2ћ1љ 2ћ1м 2ћ1н 2ћ1р 2ћ1с 2ћ1з 2ч1ђ 2ч1ћ 2ч1ч 2ч1ш 2ч1ж 2ч1б 2ч1ц 2ч1д 2ч1џ 2ч1ф 2ч1г 2ч1х 2ч1ј 2ч1к 2ч1љ 2ч1м 2ч1н 2ч1р 2ч1с 2ч1т 2ч1з 2ч3вј 2ч3вл 2ч3вљ 2чв. 2ш1ђ 2ш1ш 2ш1ж 2ш1б 2ш1д 2ш1џ 2ш1ф 2ш1г 2ш1х 2ш1ј 2ш1р 2ш1с 2ш1з 2ш3чв 2ш3цј 2ш3цв 2ш3мј 2ш3мл 2ш3мљ 2ш3пј 2ш3пл 2ш3пљ 2ш3тј 2ш3тл 2ш3тљ 2ш3вл 2ш3вљ 2шћ. 2шч. 2шчћ 2шчч 2шчш 2шчж 2шчб 2шчц 2шчд 2шчџ 2шчф 2шчг 2шчх 2шчј 2шчк 2шчљ 2шчм 2шчн 2шчр 2шчс 2шчт 2шчз 2шц. 2шцћ 2шцч 2шцш 2шцж 2шцб 2шцц 2шцд 2шцџ 2шцф 2шцг 2шцх 2шцк 2шцљ 2шцм 2шцн 2шцр 2шцс 2шцт 2шцз 2шк. 2шкђ 2шкћ 2шкч 2шкш 2шкж 2шкб 2шкц 2шкд 2шкџ 2шкф 2шкг 2шкх 2шкк 2шкм 2шкн 2шкс 2шкт 2шкз 2шљ. 2шм. 2шмђ 2шмч 2шмш 2шмж 2шмб 2шмц 2шмд 2шмџ 2шмф 2шмг 2шмх 2шмк 2шмм 2шмн 2шмс 2шмт 2шмз 2шн. 2шп. 2шпђ 2шпч 2шпш 2шпж 2шпб 2шпц 2шпд 2шпџ 2шпф 2шпг 2шпх 2шпк 2шпм 2шпн 2шпс 2шпт 2шпз 2шт. 2штђ 2штч 2штш 2штж 2штб 2штц 2штд 2штџ 2штф 2штг 2штх 2штк 2штм 2штн 2штс 2штт 2штз 2шв. 2швђ 2швч 2швш 2швж 2швб 2швц 2швд 2швџ 2швф 2швг 2швх 2швк 2швм 2швн 2швс 2швт 2швз 2ж1ћ 2ж1ч 2ж1ш 2ж1ж 2ж1ц 2ж1џ 2ж1ф 2ж1х 2ж1ј 2ж1к 2ж1р 2ж1с 2ж1т 2ж1з 2ж3бј 2ж3бл 2ж3бљ 2ж3бр 2ж3дј 2ж3дл 2ж3дљ 2ж3дв 2ж3гј 2ж3гл 2ж3гљ 2ж3гр 2ж3гв 2ж3мј 2ж3мл 2ж3мљ 2ж3мр 2ж3вл 2ж3вљ 2жђ. 2жб. 2жбђ 2жбч 2жбш 2жбж 2жбб 2жбц 2жбд 2жбџ 2жбф 2жбг 2жбх 2жбк 2жбм 2жбн 2жбс 2жбт 2жбз 2жд. 2ждч 2ждш 2ждб 2ждц 2ждд 2ждџ 2ждф 2ждг 2ждх 2ждк 2ждм 2ждн 2ждс 2ждт 2ждз 2жг. 2жгч 2жгш 2жгж 2жгб 2жгц 2жгд 2жгџ 2жгф 2жгг 2жгх 2жгк 2жгм 2жгн 2жгс 2жгт 2жгз 2жл. 2жљ. 2жм. 2жмђ 2жмч 2жмш 2жмж 2жмб 2жмц 2жмд 2жмџ 2жмф 2жмг 2жмх 2жмк 2жмм 2жмн 2жмс 2жмт 2жмз 2жн. 2жњ. 2жвђ 2жвч 2жвш 2жвж 2жвб 2жвц 2жвд 2жвџ 2жвф 2жвг 2жвх 2жвк 2жвм 2жвн 2жвс 2жвт 2жвз 2а1 2б1ђ 2б1ћ 2б1ч 2б1ш 2б1ж 2б1б 2б1ц 2б1д 2б1џ 2б1ф 2б1г 2б1х 2б1к 2б1м 2б1н 2б1с 2б1т 2б1з 2бј. 2бл. 2бљ. 2бр. 2ц1ђ 2ц1ћ 2ц1ч 2ц1ш 2ц1ж 2ц1б 2ц1ц 2ц1д 2ц1џ 2ц1ф 2ц1г 2ц1х 2ц1к 2ц1љ 2ц1м 2ц1н 2ц1с 2ц1т 2ц1з 2ц3вл 2ц3вљ 2цј. 2цр. 2цв. 2д1ђ 2д1ћ 2д1ч 2д1ш 2д1б 2д1ц 2д1д 2д1џ 2д1ф 2д1г 2д1х 2д1к 2д1м 2д1н 2д1с 2д1т 2д1з 2д3вл 2д3вљ 2д3вр 2џ1ђ 2џ1ћ 2џ1ч 2џ1ш 2џ1ж 2џ1б 2џ1ц 2џ1д 2џ1џ 2џ1ф 2џ1г 2џ1х 2џ1ј 2џ1к 2џ1љ 2џ1м 2џ1н 2џ1р 2џ1с 2џ1т 2џ1з 2џ. 2дј. 2дл. 2дљ. 2др. 2дв. 2е1 2ф1ђ 2ф1ћ 2ф1ч 2ф1ш 2ф1ж 2ф1б 2ф1ц 2ф1д 2ф1џ 2ф1ф 2ф1г 2ф1х 2ф1к 2ф1м 2ф1н 2ф1с 2ф1т 2ф1з 2фј. 2фл. 2фљ. 2фр. 2г1ђ 2г1ћ 2г1ч 2г1ш 2г1ж 2г1б 2г1ц 2г1д 2г1џ 2г1ф 2г1г 2г1х 2г1к 2г1м 2г1н 2г1с 2г1т 2г1з 2г3вј 2г3вл 2г3вљ 2г3вр 2гј. 2гл. 2гљ. 2гр. 2гв. 2х1ђ 2х1ћ 2х1ч 2х1ш 2х1ж 2х1б 2х1ц 2х1д 2х1џ 2х1ф 2х1г 2х1х 2х1к 2х1м 2х1н 2х1с 2х1т 2х1з 2х3вј 2х3вл 2х3вљ 2х3вр 2хј. 2хл. 2хљ. 2хр. 2хв. 2хвђ 2хвч 2хвш 2хвж 2хвб 2хвц 2хвд 2хвџ 2хвф 2хвг 2хвх 2хвк 2хвм 2хвн 2хвс 2хвт 2хвз 2и1 2ј1ђ 2ј1ћ 2ј1ч 2ј1ш 2ј1ж 2ј1б 2ј1ц 2ј1д 2ј1џ 2ј1ф 2ј1г 2ј1х 2ј1ј 2ј1к 2ј1љ 2ј1м 2ј1н 2ј1р 2ј1с 2ј1т 2ј1з 2к1ђ 2к1ћ 2к1ч 2к1ш 2к1ж 2к1б 2к1ц 2к1д 2к1џ 2к1ф 2к1г 2к1х 2к1к 2к1м 2к1н 2к1с 2к1т 2к1з 2к3вј 2к3вл 2к3вљ 2кј. 2кл. 2кљ. 2кр. 2кв. 2љ1ђ 2љ1ћ 2љ1ч 2љ1ш 2љ1ж 2љ1б 2љ1ц 2љ1д 2љ1џ 2љ1ф 2љ1г 2љ1х 2љ1ј 2љ1к 2љ1љ 2љ1м 2љ1н 2љ1р 2љ1с 2љ1т 2љ1з 2м1ђ 2м1ћ 2м1ч 2м1ш 2м1ж 2м1б 2м1ц 2м1д 2м1џ 2м1ф 2м1г 2м1х 2м1к 2м1м 2м1н 2м1с 2м1т 2м1з 2мј. 2мл. 2мљ. 2мр. 2н1ђ 2н1ћ 2н1ч 2н1ш 2н1ж 2н1б 2н1ц 2н1д 2н1џ 2н1ф 2н1г 2н1х 2н1к 2н1љ 2н1м 2н1н 2н1р 2н1с 2н1т 2н1з 2о1 2пј. 2пл. 2пљ. 2пр. 2р1ђ 2р1ћ 2р1ч 2р1ш 2р1ж 2р1б 2р1ц 2р1д 2р1џ 2р1ф 2р1г 2р1х 2р1ј 2р1к 2р1љ 2р1м 2р1н 2р1р 2р1с 2р1т 2р1з 2с1ђ 2с1ћ 2с1ч 2с1ш 2с1ж 2с1б 2с1д 2с1џ 2с1ф 2с1г 2с1х 2с1с 2с1з 2с3кј 2с3кљ 2с3тл 2с3вљ 2сц. 2сцђ 2сцћ 2сцч 2сцш 2сцж 2сцб 2сцц 2сцд 2сцџ 2сцф 2сцг 2сцх 2сцк 2сцљ 2сцм 2сцн 2сцр 2сцс 2сцт 2сцз 2сј. 2ск. 2скђ 2скћ 2скч 2скш 2скж 2скб 2скц 2скд 2скџ 2скф 2скг 2скх 2скк 2скм 2скн 2скс 2скт 2скз 2сл. 2сљ. 2см. 2смђ 2смћ 2смч 2смш 2смж 2смб 2смц 2смд 2смџ 2смф 2смг 2смх 2смк 2смм 2смн 2смс 2смт 2смз 2сн. 2сњ. 2сп. 2спђ 2спћ 2спч 2спш 2спж 2спб 2спц 2спд 2спџ 2спф 2спг 2спх 2спк 2спм 2спн 2спп 2спс 2спт 2спв 2спз 2ср. 2ст. 2стђ 2стћ 2стч 2стш 2стж 2стб 2стц 2стд 2стџ 2стф 2стг 2стх 2стк 2стм 2стн 2стп 2стс 2стт 2стз 2св. 2свђ 2свћ 2свч 2свш 2свж 2свб 2свц 2свд 2свџ 2свф 2свг 2свх 2свк 2свм 2свн 2свп 2свс 2свт 2свв 2свз 2т1ђ 2т1ћ 2т1ч 2т1ш 2т1ж 2т1б 2т1ц 2т1д 2т1џ 2т1ф 2т1г 2т1х 2т1к 2т1м 2т1н 2т1п 2т1с 2т1т 2т1з 2т3вј 2т3вл 2т3вљ 2тј. 2тл. 2тљ. 2тр. 2тв. 2у1 2в1ђ 2в1ћ 2в1ч 2в1ш 2в1ж 2в1б 2в1ц 2в1д 2в1џ 2в1ф 2в1г 2в1х 2в1к 2в1м 2в1н 2в1п 2в1с 2в1т 2в1в 2в1з 2вј. 2вл. 2вљ. 2вр. 2з1ђ 2з1ћ 2з1ч 2з1ш 2з1ж 2з1ц 2з1џ 2з1ф 2з1х 2з1к 2з1п 2з1с 2з1з 2з3бљ 2з3дл 2з3дљ 2з3дв 2з3гј 2з3гљ 2з3мл 2з3мр 2з3вл 2з3вљ 2зб. 2збђ 2збћ 2збч 2збш 2збж 2збб 2збц 2збд 2збџ 2збф 2збг 2збх 2збк 2збм 2збн 2збп 2збс 2збв 2збз 2зд. 2здђ 2здћ 2здч 2здш 2здб 2здц 2здд 2здџ 2здф 2здг 2здх 2здк 2здм 2здн 2здп 2здс 2здз 2зг. 2згђ 2згћ 2згч 2згж 2згб 2згц 2згд 2згџ 2згф 2згг 2згх 2згк 2згм 2згн 2згп 2згс 2згз 2зј. 2зл. 2зљ. 2зм. 2змђ 2змћ 2змч 2змш 2змж 2змб 2змц 2змд 2змџ 2змф 2змг 2змх 2змк 2змм 2змн 2змп 2змс 2змв 2змз 2зн. 2зњ. 2зр. 2зв. 2звђ 2звћ 2звч 2звш 2звж 2звб 2звц 2звд 2звџ 2звф 2звг 2звх 2звк 2звм 2звн 2звп 2звс 2звв 2звз 3ч2лан 3ч2лањ 3б2дењ 3б2дет 3б2дјењ 3б2дјет 3ц2мач 3ц2мак 3ц2миз 3ц2мок 3г2дегод. 3г2декад 3г2декак 3г2дјегод. 3г2дјекад 3г2дјекак 3г2мил 3г2миљ 3г2миз 3г2нај 3г2нежђ 3г2нев 3г2незд 3г2нијежђ 3г2нијезд 3г2њав 3г2њеч 3г2њес 3г2њет 3г2њев 3г2њил 3г2њиљ 3г2њио 3г2њит 3г2њур 3г2ној 3г2нос 3г2ноз 3х2тел 3х2тењ 3х2тети 3х2тев 3х2тјел 3х2тјењ 3х2тјети 3х2тјев 3к2неж 3к2нез 3к2њиж 3к2њиг 3м2наж 3м2нож 3м2ног 3п2сич 3п2сик 3п2сов 3п2суј 3р2ђа 3с2фер 3т2маст 3т2мул 3т2муљ 3т2муо 3т2мур 4р3је. 4р3јем ч2в ш2ч ш2л ш2љ ш2м ш2н ш2п ш2т ш2в ж2ђ ж2б ж2д ж2г ж2л ж2љ ж2м ж2н ж2в а3а а3е а3и а3о а3у б2ј б2л б2љ б2р ц2ј ц2р ц2в д2ж д2ј д2л д2љ д2р д2в е3а е3е е3и е3о е3у ф2ј ф2л ф2љ ф2р г2л г2љ г2р г2в х2л х2љ х2р х2в и3а и3е и3и и3о и3у к2л к2љ к2р к2в л2ј м2л м2љ м2р не3г2де. не3г2дје. ни3г2де. ни3г2дје. о3а о3е о3и о3о о3у п2ј п2л п2љ п2р с2ц с2к с2л с2љ с2м с2н с2п с2р с2в т2ј т2л т2в у3а у3е у3и у3о у3у в2л в2љ в2р з2б з2д з2г з2ј з2л з2љ з2м з2н з2р з2в",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=2425,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-sr.rme b/Master/texmf-dist/tex/context/patterns/lang-sr.rme
index 7a4df255af8..f163cc8a9a3 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-sr.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-sr.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Serbian hyphenation patterns in Cyrillic script
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -77,4 +81,4 @@
% Current maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com>
%
% \message{Serbian Cyrillic Hyphenation Patterns `srhyphc.tex' v1.0a <2003-06-09>}
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-sv.lua b/Master/texmf-dist/tex/context/patterns/lang-sv.lua
new file mode 100644
index 00000000000..1c3f452ef3e
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-sv.lua
@@ -0,0 +1,133 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="sv",
+ ["source"]="hyph-sv",
+ ["texcomment"]="% Swedish hyphenation patterns (Jan Michael Rynning, 1994-03-03)\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: sehyph.tex (2003-09-08)\
+% Author: Jan Michael Rynning\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% Swedish hyphenation patterns. \
+%\
+% Copyright 1994 by Jan Michael Rynning. All rights reserved.\
+% This program may be distributed and/or modified under the conditions of\
+% the LaTeX Project Public License, either version 1.2 of this license or\
+% (at your option) any later version. The latest version of this license\
+% is in http://www.latex-project.org/lppl.txt and version 1.2 or later is\
+% part of all distributions of LaTeX version 1999/12/01 or later.\
+%\
+% Last update: 1994-03-03 (March 3, 1994).\
+% Revision history:\
+% 1991-01-08: First version available for anonymous FTP.\
+% 1991-08-08: Changed \\aa to \\aa0 at end of line, to stop TeX from\
+% concatenating the patterns.\
+% 1991-09-03: Cleaned up lots of inconsistencies in the dictionary.\
+% As a consequence, the patterns shrunk a lot. Also\
+% added some 4000 one-syllable words, some of which were\
+% hyphenated by the old patterns, and some 1500 compound\
+% words, about half of which were incorrectly hyphenated\
+% by the old patterns.\
+% 1991-11-01: Added another some 6200 compound words, all of which were\
+% incorrectly hyphenated by the old patterns.\
+% 1991-11-13: Added another some 6500 compound words, all of which were\
+% incorrectly hyphenated by the old patterns.\
+% 1992-01-30: Changed macros to ^^, for use with LaTeX and dc fonts.\
+% 1994-03-03: The hyphenated dictionary now contains about 118,000 words.\
+% The hyphenation now works much better for compound words.\
+% Patgen parameters: 1 2 20, 2 1 8, 1 4 7, 3 2 1, 1 10000 4.\
+% \
+% This file contains Swedish hyphenation patterns for TeX. It assumes\
+% that you have fonts with the Swedish letters in the positions where\
+% they occur in ISO Latin 1 (ISO 8859/1):\
+% Letter: \\AA \\\"A \\\"O \\'E \\aa \\\"a \\\"o \\'e\
+% Position: \"C5 \"C4 \"D6 \"C9 \"E5 \"E4 \"F6 \"E9\
+%\
+% Load this file into initex after plain.tex (or lplain.tex, splain.tex,\
+% or whatever).\
+%\
+% The patterns were generated in such a way that they will hyphenate\
+% correctly if \\lefthyphenmin>=1 and \\righthyphenmin>=2.\
+%\
+% These hyphenation patterns work quite well for simple words, but not\
+% quite as well for compound words. I'm working on improving the quality,\
+% by adding more words. If you know any Swedish words which are not\
+% correctly hypheneted using these patterns, or if you have questions or\
+% comments, please contact me:\
+%\
+% Jan Michael Rynning <jmr@incolumitas.se>\
+% --------------------------------------------------------------------------\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyzäåéö",
+ ["data"]=".a4b .ab5i .ab5ol .ab3r .ac3 .a4d .a3dr .ad3s .a5g4ra .a5gre .a5kl .a5le .al4pr .a3lu .am4br .amp3l .a5mu .and4rar .a2n5es .ang4er .an5go .an5s .ap1p .as2k .a3sket .as4t .a5sten .a3sti .a5ta .at3t .au3st .a4val .av3s4 .b4 .bak5s .ben5s .bild3s .bo2k .bort1 .cis4 .cy5klop .d4 .där3 .ek1v .e3l4a .e2l5in .en5st .e4nä .e2r3i .e2s .e5skad .es3kal .es5kap .es4t .e5strad .e3tr .evan5 .ex3 .f4 .feb3r .fram3 .fres5 .fågel3 .för1a .för1en .g2 .gu4lä .gus3 .he2m .hu5sa .ib4 .ik4 .im3p .i2n1 .i4na .in3d .in4ger .ink2 .in3s2 .in3t .is5ka .i3so .k4 .kans4k .ko5li .kort5s .kring3 .krings2 .köp5s .l2 .lak5r .lek5tr .lu2st .m2 .mas2ke .ma5skeri .me4re .minis4 .mjölk5s .mon2s .mån3s .må4st .män5sko .mörk5r .n4 .ner1 .no4n .nöd5r .oc1ku .ok3t .o3kv .o2ma .o2mo .om3s4 .o3mu .on4k .o3o .ord3s .o5sc .o1s4k .o3sl .o3stra .o3sv .o3tr .o1u .p4 .papp5s .pa3ste .pa5sti .pi5sti .pres2s .pub3lika .r2 .re4gr .re2ste .runs4 .rym2d .röve5 .s4 .sa2k .seg3r .si5o .sjö1 .sk4 .skott3s .slut3s .st4 .sta2m .sten3s .string4 .sup3p .t4 .ta3bl .ta4k .tak5l .tes3ta .tig3r .til4l .ti3o .topp5s .tred2s .tre3s .trä5k .u3k .ult5r .ung2e .up2 .u4ra .ur3s .u2t1 .u4ta .u5trer .ut5s .v2 .var4t .vatten3 .ved5s .vä2g .väg3s .x2 .y2a .y4e .ång3 .år4s5 .å3st .åter1 .ä3ro .ö3ro a2b ab4bu a5be abel4s abe2s ab1l ab3la ab3ort ab5ric ab3rio ab4sc ab4sk a5bu ac4kes ac4kis ack3sk ack3u4p a5dag a5dek a5del ad5ep ad3j ad3op a5dran a3dre 1adres ad3ril ad3ru ad2s a5ed af4fo 3affä 1af3ri af4tor a1ga aga4ra a1ge a2ge. ag1gr ag1l ag5ord ag3ro a4gur a4hj aib4 a3iv a1j a3ka a4kart a5ke a1ki ak3n a1ko ak5ram akri5s ak3rob ak4sta 1aktig ak3tri a1ku a5kvari ak3ve a5kår ak5åt 4akö a1la al5adm ali2br a2lin a5lin. a3line al3ins ali5stik a4lj alk3ak al2kv al4kä all3st al3lå alms4k a1lo al5ort als5pa al3tr al4tu al4tä a1lu alu5s alv3s a1ly a4maf am4i am4pr am1s am3åt a3mö ana4bo an3alf an3ark an3c anci5 an5dak andel2s an4dun an4dän a4nef ang4es an3gi an1gr aniu4 ank3r ano2i a4nok a4nop an5sce ansis3t an4sj ans5ku ans3li ans3par an1st an4sto an4sty 1ansvar an4tj an4tre a1nu a5ny a3nö a1o a1pe a2pe. ape4n3 a1pi ap4lan apo3str 1appara apps4k ap3ric ap3rif a5pris ap2s ap3se aps5l aps3p apu5s a5py a5pä 2ara a4rann a4rarv 1arb 4arbi 2arbo 4arbr ar3dr ard5st a4rend arg5si 2arh a1ri a4rigen ar3ka ark3lan ar5kr 4arl 4arn. ar4nal a1ro a2rob 4arp ar2sa ar5skal arsk5l ar2sv ar4tro arts5p ar4tur 4aru a4rur a5rus ar4väg a3ry a3rä 2asa asbe4 a1sc as2h asis5t as3kis a2sko a4skr as3ku as5l as3pa as3pig as2sk as2s5op as2sp as2st ass5up as3ta a5stard as5ter as5tiker asti5o as3to as4tr ast5rak a5stral ast3rol as5tör a3su a4sul a4sund as2ut as3v a1sy a2s5å a2sö a1t ata5ra a5te ati5ö a4tj a2tr a3tral 4atrar a4t3re at3ria a3tric at3rie a5trik a3tris a3t4ro a4tro. at4ska 1attac at2tak at4tj at4tos att3s a4tung 2au au5b au2t5a 3autom aut5s 2a1va a4vart 1avg 2a1vi av3r 4a3vä a5å 1b2 3ba ba4di ba4do bad3s4 bak5l ba4ko ba4ku bank5l bas4ta ba5stu 4bb b4bak b4batt bbb4 bb3l bb4ler b4b3r bb4so 4b3d 3be be3d4r be5e be1k 4beld be5lu be3ly be3lå be5lö beng4 be3nå be1rö be1s be3sl bes5s be4sta be4ste be5su be3tr be3tv be3u 4bex 2b3f 2b5h 3bi bi3d4 4binv bis3ko bi5skv b3je b3k b5lar b5lat ble4mo b5len 5blera 3bles 5blid 3blikr 3bliks 4b3m 2b3n 3bo bo4gr bo2kl bo1mu 5bon bors5te bor4ti bort3r borts2 bort3sl bo1s bo4sc boy5 4b3p 2b5raf 4brar 2b5rati 3brik. b3rika 3brike 3briks b5rikö bru4st 3bry 3brö 4b3s b5sce bs3ch b4slan b4sof b4sp bst4 b4stj 4b3t 3bu bund4s bus2st b3v 3by by5r 3bå bång3 båt2s 3bä 3bö bör2s c2 5cap c3c 1c4e cens3t 3centr ceu4s 4ch. 3chau 3chef 5choc 4cht chäs3 chör4 1ci ci4lu cim2 cipp4 4ck c3ka c3ke c3ki ck5j ck1l ck5lis ck3n c3ko c4kordn ck3org c4kort ck3r ck4re ck3sla ckus2 ck3va ck3ve ck3vä ck5ä ck3ö cle2a co2a co4m 4cr cros2 4cs 1cy 1d 3da 5da. 4dadr dags3 2dak 5dako da3li 5dam da3må 4dand. 4d1ap 4darb 4dart da4tr dat5t 4dax 2db 4dc dcen3 2dd ddd4 ddi4s d3dj d4dos dd3ra dd3re dd3ri d3drä dd2s dds3v 3d2e de1k4 4deko 4deld del2sa dels5ti de5lut d4en denti5ö den2to de3pr 5der der1k de2ro de5rol der5sti de4ru de2s de3se de3sp des3ti d4et de3tr 4dex 2d1f dfö3ra 2d1g d3gl 2d5h 3di dias4 di5el di2gr di3ka di5ku 4dinf din3g4o 4dinr 4dins 2dinsp 4dint di1o di4od di3sc di4sj dis3ko dis1kr dis1p dis5to dis3tra di4tre 2dj d3jor djup5p 3djur 2d3k2 4d5l 2d1m 2d1n 3do d2ol do5lo 4domr dom2sk 5don do4pak 4d5ord 4dori 4dort d5ost do3y 2d1p 2d2r2 d3rad 3d4rag d3rand d5rarb d5rassera d5ratu 3drej d3ren 5dres d3ret d4ric 3drif d3rig 4d5rik d3rin 3d4riv d5roc 3dropp d3ror 4drot drotts3 d3räkn 3dräkt 5drän d3rät d5röd 4ds d2s1an d2se ds5enh d4sf d2si ds3ins d2sj dsk2 d3skef ds4ken d3ski ds3kl ds5kn ds1l ds4lot ds4mo d4små ds5nå d2so ds3pl ds3s4 ds3tal d5stat ds4te dste4a d5stig ds3tin ds5tro d2su ds1v d2sö 2d3t 3du dub3ble 4dup du1s du2sc du4ste du5sö 4dut du4vu 2d1v d3vr 2d3w 3dy dy4kan dy4ro 4dz 5dåg 2dås 4dåt 4däg dä2r 3dö döds1 4dög 4döp d5öst dé4 e1a e2ake e4am 4eb e2br eb3ril 4ec e3ch echiff5 ecis4 e3co e2d e4dans edd4r edi4u ed3j e5dral ed1sk ed2sko ed3s2l edso4 e3då e1e e2ed e4ei ee2k5 e4en. e4ene e1f ef4s 3efte e1g e3ga e3ge ege2l eg1l eg2ler e3glera e5gleri e4gran eg5rat eg3rin e5gru egs3 e5gå eig2 ei5gn e3ik e1in ei5sh e1isk e1jo e3ju e3jä e5jö e3ka e1ki e1kl ek3lat ek4le ek3n e1ko ekord5s ek3orr ek4ret. ek5ro e1ku e1kve ek5vis e1ky e1kä e1la el1akt el4arb 3eld. eleb3r elekt3ri el4fra eli5ku el3k4 el3li ell3s el3lä e1lo e4lob el3p el2si el5ug e5luv 2e1lä e1m e5mat e5mis emon1s em5ort emp5le en5art e2nav en4ce e4ned e4nek ene3rö 2enj en5klo en3kn en5kr en5kä enning5 ennings2 eno2m en3si ens5ke ens2m en2sp ens4te ens4vin en4så ent4ha en2t1r ent4rat. ent3rati ent3ri ent5ru e5nus 2eny 2e1nä e1o e2og eo4i e5or 2ep e1pe e1pi e3pla ep5le epp2s3 epps5t e1pr ep3s ep4tr epu3b e3på er1ak 4eras er3d4 erg4l er4gu er4gås e1ri e5rib e4rinf erings3 eri5stik erk4lin erlä4 er5na e1ro e3rob e2rom erp4 er3ra er5sc ers4ken er3sl ers4le er4sta er2ste er3str er3sv e1ru e5rum e3ry e5råd e1rä e2sal es5all es3arm e1sc 2ese es4hi esi4u es2k e4skan es5kar e4s3ken es3ker es5kul e1sl e5slag es2mi e1sp es3pl es2sk ess5lä es2st e3stal es5ten. esti2ge es3tin es5tor. es4tr est5rer e3stru est4rö e3stå es2u e1sy eta3b e5ti eti3ö e1to e5tri. et3ris e5trä et2s ets2ad ets3kr ets1l ets3m ets5pa et4sv ett3r e1tu etu4ri et4va et5vu e1ty 2etz e1tä etäc4 euk4 e5um. e5up4 4eur eu4se. eu5tro e1v e4varm e4vj ev3r 3exp ext4r 4eä f2 3fa fac4 fac5ke 4fans 4farb fa3sh fa4st fa4tö 4fav 4f3b f3d 3fe 4fef fe2l fes5ta fe3sto 4fex 2f1f fff4 ff3l ff3n f3fo ff3r ffs4 f3fä ffö5re f3g2 f5h 3fi fi2br fib5rig fi3li fin5sm fi3skal fisk3r fi2ti 2f3k 1fl flo4da 4f3m fma4 1fo 4fof fol2 folk1 2f5om fo2na for4mo fost3r 4f3p fra2m fram5p f4rer 5freri fre4s f4ri. fri5sp 5frit fros5ta fru5str från5 2f3s fs2k f4sl f4sm f4sn f4sp f4st f4sv 2ft f3ta f4taf f4tak f4tap f4tarm fte4r f4tex f3ti f4tin f3to f4t3r ft2sa ft4set ft2s5i ft4sj fts4t fts5vä ft5t ft1v 3fu furs5te fu5ru fu3tu 4fv 5fy fy4ma få3tö 1fä fäs5ti 3fö fö2ra fö2ren fö2ri för3k för3sm för3su fört4 för1ö ga5br 3g2ag 4gakt 3g2al gall3s ga5lä ga4no 2garb 4garm ga2ro 4gart ga4st ga4su 5g2ati gaus4 g4av g5avsn 4gax 2gb 2gd g3d4r ge2a ge5b4 2gef 2ge4j g2eli 3gelis gel5st gel5y 3gelä gel5än g4em ge4nap gen5g 3g2eni 3genj 4genm genom5 gen4sa g4ense 1g2ent 4genv ge5ny 3genä ge2o 1g2era 4gerarb 3g2eri gers5n 5gese ge4to get5s 5g2ett 2g1f 2gg g1ga g4gap g1ge gg5g gg1l g4gos ggs4la ggs4m gg3s4t gg3s4v g4gu 2gh gh4te 1g2i gi1o gi5sn gi4ste gis4tr gi5stral gi5st4rat 3giv gi2ö g2jo 3gjor g3jä 2g3k2 2gl g4lans g1lar g2las 5glase glas5k 5glasö g4lid 4glj g4lög 5glöm 2g1m 2g1n g4nag g2no 1g2o 3go. 3gol gon3s4 4gont 2gord 4gorm 4gort go3sl 2g1p g2r4 3graf 5gral gra2m5 5grans 4gras 5grec 5grett g3rig 4g5rik 5grip 3gris g5roi gro2v 4grum grus5t g4rå 5grå. grä4n 5gräns 2g2s gs1an g5satt g3sel g4sf gsi4d g3sju g5skaf gs4ki gs3kn gs4kot g3sky gs1l gs1m g4sme gs3n gs4ni gs4nö gs1or gs3pl gs3po gs4por gs5pre gs3pu gs3s gs3tak gs3tal g3stark gs4ten g3stif gs3till gs3tj g3stol gs3tra gst4re g3stäm g4sug gs1v g4s3ve gs3vi gs3vå gs3yt gs1ä 2g1t g3tr 1g2u 4gug guld3 gul4da 4gulä gu2ma 4gup gu5ru gus4k 2gut g3utb 2g1v 4gw 3gy gytt3j 1g2å gårds5 2g5åri g4äl g2är gä4s 1g2ö 4gög gö5ro 2g5ört 1h ha3bl ha5ge ha4li hal4so halv3å ham4st handels3 hands4l han5g2a ha5ra ha4sc ha4sp hasp5l has3t hav2 havs3 h5c 4hd he4at he4fr he4lä hets1 hets3t hets3v h3g h2i 4hir his2sk hi4t hjäl3s h1k 2hl h4le 2hm 4hn h2na h2nit ho5nu hop5plo hop3s hos3p hos5ti 4how h3p h5ru h1s 2ht hu2s hust5r hyg5r hys4t hys5ta hy3ster hård5s4 häll2 hälls1 hälso3 hä4ri hä4s hä4var h2ö hö2g hö5gen hög5r hörn5s hö4s höst5r i1a ia3fr ia3g ia4lu ia4sk ia3tr i2b3l i5bril i3ca i4ce. i5cha ic4kord ick3u4 i5co i2d iden3s id4ge i4dom id1r id3ro id2s ids3v i4dun i3då i4dö 2i1e ifes4 i5fn i1fr 3ifrån i1g 4igan i2geb ig5ej ig1l ig3no i3i i4kart i1ki i3klo ik5län ik3n i1ko ik3re i5krob ik5rof ik5ros ik5s2h ik5skor i3kul i3kum ik5u4t ik1v i3ky i3kå i3kö i1la il4dan i2lin il1jö il5k il5lak il4lik ill3s2 3illu il5lär il2min i1lo il2tj i3lu ilufts5 i4lup i5lä im2b3r im5sm im4so i1mu i5må i3mä i5mö i4nau ind5skä ind5sti 1indu in4ga in4ge. ing4es. ing5is in5glas ings5te i3ni i4nif in5j in5kve 1inneh 5inre 1inri 3inrä in4sem in3skrä in3sl ins4m in3sn 1inspe 5inspeln in5spr 3instink 3instru in4stå in5te 1intr in4tra int3s i1nu i4nun in3ym i1nä i5oc i1og i3ok io4kr i1ol io5li i5om ion2 i3ono ions3 i1op i1or i1os i1ot i1pe i1pi ipos4 ip5pi i3ra i4res i1ri irk5l i1ro iro3p i1ru i5sce isel4 is2h i2sk is5kep isk5na is3kopa is3ku is4kun is3ky i5slam is3län is3m is3n i2s3p is4pri is3sa is3se iss5n is4s3tr iss3tä i1stal i1stans ist5att is5ten. i1stent is4tes is3tig is5ting is5tor. is5tore ist5ro istå4 is5v i3sy i4så i1t it5c i4tei i4tex i4tj it5ran i5trin i3tris it2t5op it4t3r it4tu i2t5å 4i1u i1va i2vak i1vi i4vin iv3r iv2s i1vå ix2t ix5tu i1ö 1ja 3jakt. 4jarb jas5p 2jb 2jd jd3r jd4sty j4du 1je je2a 5jef je5sta 2j1f 4j3g 4jh 1ji 4jin 4jk j4kl j3ko jk3v 2j1l 2jm 2j1n j2o 3job jo4kr 4jolj jo5lö jor4din jord3s4 3jou 4jp j5pl 2j3r 2j1s j5sa j4sk js4me js4te 2jt jts4 2j2u ju4kos juk3s jul3k 4jur jus5kr juss4 jus4t jus5ta jut4sta jä5lo jäl4p5r jäl4sa järn3sk jär5s jör2s jös4t 5jé 1k2a 3ka. 3kad. 3kade. ka4dr 2kaf 5kafä ka3i ka5ju 2kak k3akti 4kalf 4kalg kal4lo kall3s 3kamp 3kamr 3kan. 4kand. 5kano 2kap 3kapi ka5pla kap4pr kaps5t 5kapten 3kar. ka3ra 4karb k5arbet ka5ri 4kark 3karna 4karp karp5s 4kart. 4karte 4karv 3kas ka4sk kas3ti 3kat. 3kats. 4kau 2kb 4kc 2k3d4 kdom4 1k2e 3ke. 2ked. 2keda ke3dr ked4s ke4er 2kefu 4keld kels4 4kense ke5nå 2kep 3kern ke2s kes3s 4kex 2k1f kfö2 kfö3ri 2k5g4 2kh4 kid3s 4kif 1kig kik4s kilt4 5kimå king3r 4kinne 4kins 2kint ki4nu ki4tr kiv3s 4kj 5kjol k3jä 2k3k kl2 1klag k2lama kla4mi 3klang. 3klass 2klat 5klav 2kle k2lej 2klig k2lim 3klip k2lis 5klist3r k5lock. 5klocka 3klos 1klub 4kluk 1kläd 2k3läg 2k1m 2k2n k4nal 3k4nap 5knip 3k4niv 3k4nu k4ny k5nyk k2o 4koc ko5de k5odl kog3n ko4gr kog4s3 4kola ko2lin 4kolj kol5tr 5kolv. 1kom 3komm 5komp 2k3omr kom4s 1kon 3konf 3konst 3kont ko3nu 1kor 3korg ko3ri 2korr 3korres 5kortera ko5s4k ko3sl 3kost ko4str 4k3ou 2k1p k2r4 3kraf 5kra3ge 4krang 5krera k4reten krid5s2 1krig krigs3 krings2k 4kriv 3kropp kropps5 kru5stad k3ryg kråk5s krå4pa k5rädd. kräk5l 4kräl k3rät 2ks ksaks5 k2s5as ks3ch k4ser ks2k4 ks3kl ks5kra ks5kv k3skä k3skö k5slag. ks2li k5sly k2so ks3pl k1s4t kstavs3 ks5tid k2su 4k1t k4tex kti5ge k4tinn k2tins k2tod k2tom k2tr kt3re kt3rin k5trod kt5rog kt3rol kt5rät kt2st kt5t4 k4tug k2tut k4täl 4kug k5ugn ku5la 4kuld 3kulö kum5pl kungs5 5kunn ku4pen ku4ro 3kurs 3kus kust3a kv4 3kvali k5vare 3kvarn kvar3s 3kvart k4vato k2ve 2kvente 1kvinn 5kvire k4vo k1vå 3kväll k1vär kydds3 ky4lin 3kyrk käl4m 5kämp 5känn 3käns 3kärl 4kög köks5t 5köp. kör4l kör4sl 3la. 1lade. 2ladm 4ladr 2laf 3lagd. la4gin 5lagm lag3r 2lak 5lakan. 5laki 3laktis la5lo 3lande. lan4di 2lappara 2larb 1larn lar5s 4lart las3h 4lask la4st 5laste. 1lat. la5tr lat4tis 2lau 2lav la5vu 2lb4 4l1c 2l2d lder4s l3dj ld3ra l5dry lds4an 1le 3le. le4ge. le5ig le2kl le4kv lem4sö 2l5enl 3ler. ler5k 3lern ler3ste le5s2l le5tå le3um le4vu 2lex 2l1f 2l1g l2gj l3g2l lgs4 lg5st 2lh 1li li5ch 3lif 3lig li4go lig3s lik2l li5kli lik3s 5limer 2lind 2linga. ling5o 4lingr lings5t 2lini 5linj 2lint li1o 2lip lis3c li4sta li3strö li4vo livs1 l2jak 4l1jo 1lju l5jå l1jä l3jör 2l1k l3ke l5kju l2kl lk5lag l5klä l2kr l3k4ra lk3t l1la lld4 ll3dr lle5b ll3k ll1l l1lo llok5v ll3p ll4san ll2se ll3ska ll2so ll4sva ll4tig ll3tr l1lu ll5un llust3ra ll5v l5ly lläggs5 l5löd llör4 ll5ört 4l1m l4mol lm3st l1n lo2af loc4ku 4lodl lo4do lod3st lo2ge. 2lolj 2lom 4lord 2lorg lor4s lo4vo l4pak l1pe l1pi l5pla lp5lö lp4st 4l3r 2l1s l2sc l4sjo l4sjä l2sk l4skensv l3ski lsk3n l5skot l3skrä l3sky l3skå lskå4p l3skä l3slu l4sm ls4mo ls5nyt l2sp l3spe ls3pl ls3pol ls5s l2st l3sta l4stak ls4te ls5ter l3sto l3sty l4styg l3stå l3stä l5stö l2su l5sur l2sv l4svi ls5vid l4så 4l1t lta2tu l4tef l4tif l4tih l4tos lt5rati l4tret l4trö lt5sk ltu4 lu5i luk4to 4lull. 2lun lung3 2lupp lu4pu lus2s5p 5lust. 4lutb 4luts 2lv l1va l4varm lvers4 l1vi l4vos lv3ri lv3sp l1vä lväv4 lycks5t ly4gat lyg3r lyg3s2 3lyste 5lystn ly4str 2lå. låg3s 1lång lång3s lå4sk lås5te lå4stå 4läc läg5r 1länds 5längder lä4san lä4sp lätt3s 4löl 4löm 3lön 3lörer 1lös lö4vä 3lé 1ma ma5fr mag5n mag5s ma5ju mak3r ma3li mand4 mang2a man5g4o ma5ni mani1k 5ma3ri mash5 mas3ko mask3ro ma5skö mas3ti mas4v 2mb mb4sk 2mc 2md m4dat m4di m4do m3d4r 1me 2meds me4du me4kl me4ko 4meld melo5 me5lu men5k me5nu me5ny mer2sko me4so mes4t me3sti 2meta me5trin met3ro meu4 2mex 2m1f m4fes m4fn 2m1g4 2mh 1mi mid3s mi4lu 2mind ming4o 4mink min4kr 4minv mi3nö mis2 mi5sf mi4sp miss3t mi4te. mi4tr mitt3s 2m1k 2m3l 2m1m2 mme5d mm3s4 m4mul 2m1n m2nam mnas3t m4nav mn5dr mn3g4 mn5st mn5tu m2n3å 1mo m4od mo4i 2momr mo3na mos3k mo2ta mo4tin mo4tu mot3v 2m1p m2pak m4part m2pl mp3lad m5plane mp3lat mp3lin mpos4 mp5p4 mps4k mp5sp m4på 2m1r 4ms m4sal m4ske m3slag ms3lä ms2m mste2 m1sto m2str mst3rin ms5äp 2m1t 4mud mulls3 mult5r 5mum 4mun3g4 mun4ko 3mur 3musi mu3sta mut4sl 2m3v 1myn mys4te måg4 1mål. 5målet. 5mån. 4mår må1s 4mäg mäk3 1män mäns4 3märk 1mäs mäs5ta 1mät mö4bl mö4gen. 3möj mör4kl 3mös 4möv 1na 3na. 3nad nads3 2naf na5gr 2nak 3nako 3nakr na3kro n1akt 2nalf 5nalfl 4nalg nal3s na2lu n5amb 5namn 4nand. 4nanv na4rap 2narb 2nark 4narm 2nart nast3r 2nb4 2n1c n2ch n3cha n3che n3chi ncis4 ncyk3l 2nd n4dak n4dav nd3d4 n5de nde3s n4dil nd5rak nd5ras nd3rat nd3ri n5dril n3drop nd5ros nd5skal nd3sn nds3or nds5vä nd5ås 1ne 3ne. ne4di 5nedl ne4d3r ned3s ne4dö ne2gr ne5gres 4nek. ne5ly 4nenl ner5sm nes3s4 ne4sta ne5s4ti ne3tre ne1ut 2nex 2n1f4 nfalls5 nfis3 2ng1 n4gar n4gen. n4gend n4gens n4genti n4germ n4get n2gi ng3ig ngi4s ng4ly n2go ng5om ng3or ng3rad n4grö ng4ser ngs1k ngs3pa ngs5tim ngs3val n4göd 2nh 1n2i 4nid ni5ec ni4ki ni5li 3nin nings1 nings3k nings5v ni1o 4nip nip4pr ni5steri nist3ra ni3t4r niv5sk niv5st 2n1j n4jar n3jun nju4s n3jä 2nk n4kart n1ki n4kis. n3kny n1ko nkrafts5 nk3ri n1kro nkrus4 nk5sl nk3sp nk4tin n1ku n1kö 2n1l 2n1m 2n1n nn3d n3ne nnis4 nn3k nn3s4t 1no 2nodl no4kl 2nolj 2nomr nom3s4 2nord 2norg no5sa no5sc no4tu 2n1p 2n1r 4ns ns2i n4sint n4sis. n4sise ns2k ns3kan n1ski ns3kor nslags5 ns5las ns5mit n4soc n1spi ns3pl ns3po ns3s4 n3stans n3stap ns4tel n3stif ns3tig ns4tra n2strik nst5up nst5vil n3s4ty n1sva ns3vi ns3vär 2n1t n4tark nter5s4 n4tinf n2t5omb nt3rad n3trah n3trak n5trala nt3rali n5tram nt3rep n3trer nt3ria nt3rin nt3ris n4tropin n4tror n4trö nts3c nt4se nts5kor nt4str n4tut n3två nufts4 4nug n5ugn 3nui 3num nums5 2nup n3upp 2nutb 2n1v ny5gr n5z 4når 4nä. 4näc 3näm 3nät 4nög4 3nöj nö2ja nö5kr 4nöl nös4 nös5ke o1a o2ard o2b 5o4bj o4bli oby4 oc4k5r ock3sk oc3ku o2d ode4k odi4a 1odli o5dral o3dro ods4k od2st ods4ti od5stu o3dä o1e offs5t o4fl o3fr oförmå4 o1g o4gav og3gr o4gj o5glo o5gly ognos4 ogno5st o4gri o4grö og3se og4s3t o4gä o1i o4il o1j o1k o4kli ok3n ok3sl ok4su o2kv o1la o5lak ol5au olfö4 1olj ol3ka olk3r ol4ku ol4kä oll4si oll5slä ol3lä olm4s oln3s o1lo olo5kv ol4sa ol4tå o1lu o4lug o4lur o1ly ol5år o1lä om4brä o3men o4mord om5pa om3pl 1omr 4omra om1sk om4ste 3omsät om4tr om3tv on3c on5gi on1gr ongs4l o4nins on3j on1k4 ons3c onsi3s ons3m on5stel ons4ter on3tras on4tre ont4s o1ny on5å o1nä o3nö oo4d oom5s o3or o1pe o1pi o5pline op4pl opp3le op4pr op4pu o3pri op4st o3på o5q 4ora o3rak oran3g4 o2rap 1ordn or4d5ä o4reh 1orga 5organi or4gr or4gå o1ri 3orient 4ork or4mö or4nu or4nä o1ro or4pl or5pr or4spa ors5tig or5te or2tr ort3re ort3ro o1ru o3ry o1rä o1rö o3s2fä osk4l o1skop o3som os5pig os4sk os4s4t os3tig os5tiker o5still os4tr ost5ron ost5rö os3tul ota2lan 4oti. 4otie 4otin o1to o5tro ot5run ot3sv ot5ti ot4trä ott2s o1tu o5tun otvin4 o1ty o5tå o3tä oun4 oup4 4our ou3rö ou4s o3ut3t o1va ova4n o1vi ov3r ov4si ov3sl ovs4me o1vä o3we ox5 oy2 o3å o3än o3ö 1pa 4paf pag4 paki3 pakis4 pa5la pals5 pa5lä 4pand. pan4tr 3pap 2parb 4parm par3s 2pask pa5ski pa2st 3patr pa3u 2pb4 2pc 2p3d4 pek5tri pekt3ro 4peld pel3s4i 4pem 5peng 3penn pent5r per4bl 3perio 3pers per4sl pe5tro 4pex 2p1f 4p3g 2ph pi4el 1pig pi1o 3pip pi5so pi5sta pi5sto p2j 3pjäs 4p3k2 p2l p4lac 5plan. p4lane p3larn p3lev 3plex 3plic 1plik 4plit p3lj 1plom p3lop 2p1m 4p1n p3ni 1po 5poa 2poc 2pof po2i 3polit 4polj poly3 2porg 3pos pos4ter 4pov po4vä 2pp p4part pp5ask p4pax p3pe p1pi p4pins pp3j pp1l pp3la pp3lin pp5lis pp5lu pp3ly pp3lån pp3låt pp3lä pp3lö pp5oc pp3of pp3p4 pp1r pp3ra pp3ri pp3ru pp3ry pp3rä pp3tr p2pu p5py pp3å p2r2 2pra 5prax 1pres pres4t pre3sta pres5to p3rig p3rik 5pril 3princ pring3 p5riol 3pro pro3g p3ror 4prå 3präs 3pröv 2ps p2sal 3psalm p5s2ho ps4ken ps2li p3sna 4pso p3sod p1s4t p4stak p4stäv p2sö 2p1t p3tri 1pu 4pug pul2l5ov pul5tr 5pung 3punk pus3t 2p1v på3dr 3päl pä5ro 4pör 3pé qu4 3que 1ra 3ra. raci4t 3rade. 4radr ra4du 5ra1e 2raffä ra3fr ra5is 2rak ra2lo r4ande 3rande. 4ran4d3r rand3s 2ransv ra3pl 3rar r4ar. 4rarb r4are 4rarg r4ark 4rarm r4arn r4ars 4rart r3arta ra5rö r4as ras3h ra2st 3raste. 3rativ ra3tri 2rav ra5yo 2rb 2r1c 2r2d r4daf rda5gr r3dj r4dos rd3ran rd3rat r4dul r3då r3dä r4dös 1re 3re. 4reaus re3b 4rec 5reco re3d4r re5du 4reft 4regg 3regn. re1kr rek5tri 4reld re3lu rem5p 3rems r4en. 2reni 2renk 2renl re3nö re3o 3rer. 3rern 3reso ress5k re1sti 3ret. 4retet ret3ro 4rety re5tå 2revig 4rex 2r1f rfö3ri 2r1g rg3g2 rgs5top 2rh rhands5 3rial 4rib 3rifi 2rifr r3ifrå 3rifu 3rigt rik2s 3riktn ri4mo 2rind rind3s 5ringen. ring3r 2rinr 2rins 2rint ri1o 3riot ri5ple ri2stä ri4tut ri4vis riv3s 4rj r4jis r3jo r5ju r5jö 2rk rk3akt r4kek rkes3 r1ki r3klas rk2le r4klö rk3n rk4ne r1ko r4kod rk3tr r1ku r4kup r1kä r5kör 2r1l r5laka r5lav rld2 rlds3 rl5sp 2r1m r4marb r4mil rm2s5j rm5tr 2r1n rnal4 rn3g4 rn1k r2nom rns4k rns4t rn3t ro3b ro4gro ro2kr 2rolj rol4li rom4a 5roman 5ronau 5rond. ron4v ro3pl ropp2s ro4ra 2rord 2rorg 2rorie 3rorn ro4sin ro4sn ros3v ro5te 2r1p r4plö r4pö 4r1r rra4n rrd4 rreligi5 rres4 r5rib rr5k4 r4rob r4rom rr1s rrs2k r4rur 2rs r4seld r4sex r2sin r1ski r4skid rsk3na rs5koll rs4kos rskotts3 r2sku r3skö rslags4v r4sle r4slo r4s5lö rs4mo rs5nat rs5nä r1sp r2spl r2spo rs3s4 rs5tak rs4te r5stek rs5tend r5steni rs5till r1sto r4ston rst4r r3strö r3stu r1sv rs4vag r2svä r1sy 2r1t r2taf r2takti rt4an r4tins r4tom r5trit r3trä rt3t r4tut rubb5l ru3br ru4dan ruks1 ruks3v 5rullera 3rum. runn2 runns5 4rupp rus2h ru5sha 2rut 5rutig rut4ra ru4vi 5ruö 2r1v rv4sj rv2s5kä r3w rydd5s ry5o råge5l 4rål rång3s rå5ra rå3st räck5s 4räkt 4räm räng3s räns5t 4räs rä4san räs3s rä5sti räv5s röd5el röd5r röd3s 2rög r3öi rök3s röns4t 4röp 3rör rör4s rö4st röst3r r1övr 1sa 3sa. 3sad. 3sade 4sadj 2sa3dr sad5s 2saf sa3i sak5ri 2s1akt sa5lo 3s2am sa2ma samman3 sa2mor sand3s 4sang 2sanl s3anlä san3sla 2sap 3s4ar. 2sarb 2sarm s5arm. 3sarn 2sart 4sarv 4sass 5sat. sa4tu 2sau s3auk 2s1av 4sb s2c 2sch. 1scha 2schau 4schb 1schen 1scher 1schet 1schi 4schk 4schm 4schp 3schy 3schö sci3p 4s3d 1se se4at. se2g 2s3egg 3segl seg3ra sek5le sek3r sek5tr 3sel. se5ly sem2 3sen. s5ersä 3set. 2sexp 2s1f s4fär. sfö2 4s3g2 2sh 5s2haw shi1s s5hö 1si sid5s 5sie si4eri si4esk si2ett 3s2ig 3sik sikts3 5sill. silver3 silv3r 2s1ind 2s1inf sinne2s3 3sinni 4sinr 2sin1s s1inst 5sint. 2sintr 3sio sis4t siu4 1s2j 2sjak s3jakt 4sjn 4sjt s4ju 5sjuk 4sjur själs3 3sjö 4sk. 2ska. 3s2kada s2kado 3skaffn 1skaft s4kag s2kal 3skal. 1skap 5skap. 5skapet 4skapi skaps1 4skar s4kara 5skarv 4skas s2kat s4kav 4ske. 3sked. s4kene 3skepp 4skh sk4i 3skif 5skin 4skis. 5skiv 5skjor 3skju 4skl sk5lap s3klas 4skn 3s4ko. 1s4kog 4skogsg 1skol 3skola s4kolo s4korp skor1st 1skot s5kran. 3skrat sk4ret 3skrev 1skri 3skrif s3krig 5skrin 3skrip s5kris 3skriv s5kron s4kru 5skrub 3skruv 5skräc sk3s 2skt 3skulp s3kup 2skv s4kve 1s2ky s4kyn 2skyrk 1skå s4kål 5skåp. 4skår 5skänk 3skärv 2sl2 4sla. s5lad. s3land 3s2lang s4lant s3lar. 4slas s1lat s2lev 3slev. s4lic slins3 4slis s2lit s5lor slotts3 s2lu s3luc s3luf 4slus s3lust 3slut slu4to 3slå. 5s4lår s4läk s5läm s5länn 3s4läp 4s3lär s2lät 3s2löj 2sm s2mak 3smak. s3makt s2mal s2met. s2mid s2mit 3smitta s3mj 5smug 5smyg små5g små3k små3s 3smäd 3smäl 4smäs 3smör 2s2n4 3snab 3s4nac s3nam s5nare s3nast s5ner 3snib 3snil 3snit 1snitt s3niv 3snut s4nå 5snår 5snäc s4när 3snö. snö5g 3snör snö3s 1so 3soc 5sock 2sod 5soi 2solj sol3s2 2som 5somm 3son son4st so5pra so4pu 3sor. 2sord s5ord. 2sorg 3sorn 3sot 4sott s2p2 5spann. s4park 5sparv 4spas s3pass spa5tr 1spe 4sped 3s4pek 3s4pel 4spelsl 2spen 2sper 5spets 3spill 3spir 4spl s1pla s3plan s3plats spli4 s4plin 5split s5plä 4spre s3pres 4s3pris 3sprit 2spro s3pry 3språ 5sprän s3ps 1s4på 3spån 3spår 5spän 3spö 4s1r 4s1s s5sad sse4lin s5sil ss2k ss5kl ss3kun ss1l ss2lag. ss2lä ss2lö ss3na sss4 ss3unn s2sv ss3vi s2t 2st. 4sta. 5stac 3stadi s4taf 5stalgis 3stalla 2stalli 5stam. 5stamm 1stant 5stark. 5startad 1state 3statl 1stau st3c 2s5te. 4stea 5steg. s4tek. 2stekn 5stekt s4tell 3stem. 3steme 5stenar 3s4tene 3stense 5stensm 1stera 1stering s4teriu 3sterne 5stetis 2stia 2stib 3stick 2stid s4tiken 2stil 3stil. 3stink 3stisc 1stit 2stj s5tju 3stjäl 3stjär 2stm 5stoc 1stol 4stolk 4stom stori4eu 5storis stor3s 3straff 4strativ 3strato 3strec 3strej st3ren 1strer 2stria 1strid 5stride 2striel st4rif 1strikt st5risk 1stru 3struk 2strumm s3tryc 5stryk 5stråk 3strål 3sträc 4sträd 3sträng 5sträv 3ström 2st3s4 st3t 4stv s3tvis 1sty 2styp 1stå 4ståg 5stål 1stä 3stäl 1stö 1su su4b 3sug su3i 3sum 2sun 5sun. s1under 5sune s5ung 2sup 5supa su2pu 5sus 2s1ut su4to su4tr s2v2 5svag. s3vagn 4s3vak 5svam 4svap svars3 3svart 4svas s3vat 4svec 3sven 5svep 4s3ver s5ves 4s3vil s4vine 4svis s5vitt s5våd 3svåri 3sväng 5svärm. s3väs s3vät 4syk 5syl 3syn syn3k s3yrk 3sys sys4t sys5ter syt2 sy5th 1så 5såg 4såk 2sålde sång3 1sä s4äd 2s5ägg s4äl 2säp 5säs 3sät 4säta 1sö 4söd 2sög s5öga sö4ko 4söl 4söp sör2s 2s3ört 1ta 3ta. ta1ch 3tade. 4tadi 4tads5 2taff 3taga 5tak. ta5kre 2taktig tak4to 4talf 5tallise tall5s 4talv 3tame 3tami 3tan. ta4nab 3tande. 2t3anfa 4tanl t4ap3l 2tappar 3tar. 4tarb tar4mi 3tarn tars4 4tart 5tartavl 4tarv 4task 3tast ta1str tat2 ta4tan tats3 2tatt 2tav 4tave 5tavla. 3tavlan 3tavlo tav2s 3tax 2tb4 2tc t3cha t3che 2t3d4 3t2e te4as te3b4 5tec 4teg te2g1r te3gre te3i te4int 4tej tej2s te4kl 5teknik 5teknis 4teld 5te5lö 5tema 4temo te4mu ten3g4 5tensi ten3tr te4nä te5nör 5ter. 5teriö ter3k4 5term 5terna 5ters ter3t te4ru 5tes. 5test tes4te te5stik te5stu 5tetik tets3 4texa 2texp 2t1f4 2t3g4 2th t4hen 1ti 3tial 5tib 5tici 3tid 5tide ti4du 4tidö ti4ed tifts5 ti2gel 3tigh ti4go ti2gr 3tigt tik3l 3tiks 5tikul t2il 5tilj 3tillst 3tillv 3tillä 5time 2tind 2tinr 2tint ti4od 3tion ti2os 3tis 4tisc 5tisk 3tiva ti4van 5tivite ti2ö t2j 4tje 4tjob 2tjou 4tjäl 4tjäm 3tjän 2t3k2 2t3l 2t1m 2t5n4 tne4r 4todl 3tok 4tol. 4tolj 2tomr 4toms t2op 5torap t5ord. 5toriett 4torm torm3s 3torn tor1st 4tort. tos4k t5ost. t4ov 2t1p t2r4 2tra t4raf 3trafi 3t4ral. t4rala 3t4rale 5tralo 3trals t4ralt 3trans tran2s5a 4trar t3ras. t3rat. t4rato 4treg 4tren 4trer. 4trern t3rets. 2tri 3tribu 5trick trids3 t5riel t1ring t3ring. 2troc t3rock t4rog t5ronik t3rono 4tropi. 5tross 5trotn t4rump t4rup 3trupp trus5ta 1tryc 5tryck. 5tryggh 4tråk 5trä. 3träd träds4 3träf 3träg 4träk t3räkn t4rän 5träni 5tröja t4röt 5tré 2ts t5s4and ts5art t3s4at t3se t4seg ts4en t4sex ts2k t5skall t3skatt t1ski ts3kl tskotts5 t5slot ts5läk ts3nä t3snö t2so ts3ord ts3pl tss4 t1st ts4te ts5ter ts5tillf ts3tj t3stol t4ston t2stra t4stry t4stur t5styr t2su t3sud t5sy 2tt t3tac t4tau t4ted tte5g4 t4tem tte2n ttes4 t4tex t4tins t4tip tt3ja t1to tt3rad tt3rand tt3rat tt3re tt3ri tt4ry tt4se tt2si tt4sta t3tu t4tug tt1v tt4vå t3ty t3tä t3tör 4t5ugn 2tund 3tunga tung3s 5tunn 2tupp tu5re 2tutb t3utv t3utö tu4vu 5tuö 2tv t1va 4tve t3vig 3tving t3vit 3tviv t3våg 3tvån t3vän tvär3s 3tvätt ty5da 5tyg. 3tyngd 3typ ty3pi 5tys 2tz 3tåg tås4 4tåt täc4ko 4t5äg 4täm 4tärm 3tävl 4tö4d tö5de 4tög 4töp tö4pi 3törer törs3t tö4vas 5té u1a u2b ub5al ubb4le ub3lic u4bo u3cha u5cl u2d u4dak u5de ud3r ud4ret uds4a u4du u4dy u1e u2es uf4fä uf4tan uf4to 4u1ga u1ge ugg3s ugn4 ugns5 ug3s4 u5ie u1in u3is u3itet u3j u2keb u5ki u4kl uk5la uk3n u1ko ukos4 uk2s uks5ko uk3tris ukt5s uk4tä u3ku uk3v u1la ul4di ulds2m ul4du ul4dö ull3ste ull3än u1lo uls5ti ul2tr u3lu u1lä u1lö um4fä um4so ums4t u1mu u3mör 5underl 1undersö 1underv un4dom und3r un4då un5g2ef un3gersk ung5it ung3r ungs4p 3unif unk3l unk3n un4kr un1sk un4tr un5trati u5nu u1o u1pe u4pern u1pi u2pl u3plet up3lik 3uppfa 1uppg up4pin 1uppla 5upplä up4p3r upp3s upp5sp up5ut ur5ak ur5arv u3re u1ri u1ro u4rob u4rom urs5tin ur4stä u5ry u2sak us5anl u3scha u3se usen3 u2s1k us3ka us4kla us4kr u5sky us4kå us5lä us3n u2sp us3pen us5tat us3tig u3stik us5tin ust5ro u4stå u4stä us3v u4så u4sä u2sö u4tak 1utb u4tef ute3s utik2 u5til uti3ö ut3j 3utjäm utlands3 u1to u3top uto5s ut3r ut4rer ut4ro ut5rop 1utru 2utsid ut3sl 3utslä 2utt utt4j ut1v 3utvec u5ty ut3öv u5u 2u1v u2vak u4vj u4vä u5å u3ö va5dro 1vagn 2v1akti val3k val4li val4st 5valv 5vama 4vand. 4vanp van4st van5tr 5vap 2varb va4res va4ri. 4vark var2s vart5r va1ru vas5ti 5vattn 4vau 4vav 5vavi 2vb4 2v1c 2v3d4 1ve 5vec ve2k ve3ke 4veld vensk3ä 5ventera ve3ny ve5nö 4vep ver5g 3verk ves4 ve2s5p ve1st 3veta 3vete vet5sa vett5s 2v1f 2v1g 2vh v4i vi4c vid3s vild3s vil4t 3vind. ving3s4 3vinkl vi2no 5vinst. 5vinste vi5ny 3vis. vi5sa vis5h vis5ko vi4st vis3ta vi2tr vi4var 4vjo 2v3k2 2v1l 2v1m vmörk4 2v1n4 1vo 4vok. 2vom 4vord 2vorg vos4 2v1p 2v2r 5vrak 3vrera v3ru 2vs v4sc v1s2k v2skri vs4mi v3sni v2so v1st vs4te vs5trå v5styc vs3vå v2sö 2v1t vu4d1 v1und 4v5up 4vut 2v1v 3vy 5våld vångs3 3vård 4våri vå3ru 3väg vägg5s vä4l väll4s3 3vänl 3värde vä4ril 4värj 5värk 3värld 2vät 3väx 4vög 4vöp 3vör 1wa we2 w2h whi2 wi2e w4na x1 xan5d4 xem3pla xis4 xk2 xli4 xs4 xti2 x4tå 2y y1a y4bris yb4s y2d y4da y5dan y4do yd3r yds4 y4du y4dö y1e y1ga y1ge ygg3r yg4gå ygs4p y1i y1ki y5klist yk5lon yk3n y1ko y1la yl4gj y3li yl5k yl5lä y1lo yl4tr ym2fl ym4for y3må yng3r ynk5l yn4sa yns4t y3or y5ou y1pe y5po yp3ri yre4s y1ri yr4ku yrk5v y1ro yrs4k yr5st yr5tu y1rå3 y5scho ys2st ys3ta ys3ti ys4tik. yst3ra y2tak y4te. y4tea y1to ytt3r yt5v y3va y3vi y3vä y5w y5å 1za 1ze ze4ro 1zi 1zo zo4nal 4zp z5s 3zu z4zin å1a å3dj åds4l å1e å1f å1ga å1ge åge2l åg3l åg3s4k åg3st ågå4 å3i å1ki 5åklag åk4strä å1la 1ålder å2lin ål3k åll4sp ål2s5e ål3st å1lä å1m åman4s ånd4r ån4du åns4t åns4v å3o å1p å2pl å5pla å4pö år4do ård4ra ård2s ård4s3t å4rel å1ri å5ror 5årsav år5s2li år2sv år5ö ås4ke ås3n åss4 ås4skr ås4t åte2 åt3ri å3trå åt2sj ått5s å1v ä1a ä2b 2äc äck5v ä2d ädd3s äd4du äde4s äd3r äd5se äd3st ä3e ä1ga ä1ge äg4go äg1l äg3r äg4re äg3se ä3i ä5jo 4äk ä1ki äk3n äk3r ä1la äl4pap äl4seg äls5kog äl4slu äl2t3r äl2tu äl4vin ämp3l 4ändligh änd3r änd1st äng5r änni3s änn3s ä4no äns1l än4st äns5te än4sv än2t3r ä3pe äpp3l ä4pr äp4st ä4rap är2bre ärg5l är4gr ä1ri ärib4 är4kä är4nis ärn3st är2nå är4nö är5ob ä5rol ä3rop ä5ror ä5ros är2si är4sko är2so är4sp är2sv är4tand är2tr ärt3s 4äs äs3pa äs5pi äs4sk äs4sp äs3ta äst3r ä4stä ä4så 2ät ä3to ä5tre ät4s3k ät5te ät4top ätt3r ät4tu ät4tv ä1va ä2vak ä3vi ä5vu ö1a ö2d ö4dak ö4dal ö4darv öde4s5 ö4dis öd3ra öd2s öd3se ö4du ö4dö ö1e ö1ga ög5ak ö5gar 1ögd ö1ge ö5ger ögg4 ög1l ög2n ögn3e 1ögo ög3si ög3sk ö1i ö3jo öj4sv ö4karm ö1ki ök3n ök2s ök3sl ö1la öl4kv öl4kö öl2p ö5lä öman4 öm2kl ö4nal ö2nom öns3ke ön4so önst3r ö3pe ö4pel ö3pi öp5li ö5plo 1öppn ö4pr ö3rande ö3ras ö4rask örb4 ör3d4r ör1eni ö3res ö4restr ö3ret ör5evig ör3g ö1ri ö5rig ö3ring ör3int ör5ir ör5iv ör4kal ör1k2l ör5kli ör4nis ör3ol ör1or ör2p5la ör1s2k ör3sl ör4slä ör5te ört5s ör1u ör3vr ör3y ör1ä örö4d ö2sak ös3n ös4sj ös2sk ös4sp ös3ta öst3v ö2tak öts5ko öt4st ö1v öve4 över1 5övere ö2vj öv3ra öv3ri öv4sk é3e",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=4693,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-sv.rme b/Master/texmf-dist/tex/context/patterns/lang-sv.rme
index e0cb2722514..5e1cb666618 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-sv.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-sv.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Swedish hyphenation patterns (Jan Michael Rynning, 1994-03-03)
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -109,4 +113,4 @@
%
% Jan Michael Rynning <jmr@incolumitas.se>
% --------------------------------------------------------------------------
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-tk.lua b/Master/texmf-dist/tex/context/patterns/lang-tk.lua
new file mode 100644
index 00000000000..4b44e237c63
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-tk.lua
@@ -0,0 +1,39 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="tk",
+ ["source"]="hyph-tk",
+ ["texcomment"]="% Turkmen Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% Hyphenation patterns for Turkmen (hyph-tk.tex)\
+%\
+% Author: Nazar Annagurban <nazartm at gmail.com>\
+% License: Public domain\
+% Version: 0.1\
+% Date: 16 March 2010\
+%\
+% ----------------------------------------------------------------------\
+%\
+% The file has been auto-generated from generate_patterns_tk.rb\
+% that is part of hyph-utf8.\
+%\
+% For more information about UTF-8 hyphenation patterns for TeX and\
+% links to this file see\
+% http://www.tug.org/tex-hyphen/\
+% \
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="-abdefghijklmnoprstuwyzäçöüýňşž",
+ ["data"]="1-4 ä1bä ä1be ä1bi ä1bö ä1bü ä1çä ä1çe ä1çi ä1çö ä1çü ä1dä ä1de ä1di ä1dö ä1dü ä1fä ä1fe ä1fi ä1fö ä1fü ä1gä ä1ge ä1gi ä1gö ä1gü ä1hä ä1he ä1hi ä1hö ä1hü ä1jä ä1je ä1ji ä1jö ä1jü ä1kä ä1ke ä1ki ä1kö ä1kü ä1lä ä1le ä1li ä1lö ä1lü ä1mä ä1me ä1mi ä1mö ä1mü ä1nä ä1ne ä1ni ä1nö ä1nü ä1pä ä1pe ä1pi ä1pö ä1pü ä1rä ä1re ä1ri ä1rö ä1rü ä1sä ä1se ä1si ä1sö ä1sü ä1tä ä1te ä1ti ä1tö ä1tü ä1wä ä1we ä1wi ä1wö ä1wü ä1ýä ä1ýe ä1ýi ä1ýö ä1ýü ä1zä ä1ze ä1zi ä1zö ä1zü ä1ňä ä1ňe ä1ňi ä1ňö ä1ňü ä1žä ä1že ä1ži ä1žö ä1žü ä1şä ä1şe ä1şi ä1şö ä1şü e1bä e1be e1bi e1bö e1bü e1çä e1çe e1çi e1çö e1çü e1dä e1de e1di e1dö e1dü e1fä e1fe e1fi e1fö e1fü e1gä e1ge e1gi e1gö e1gü e1hä e1he e1hi e1hö e1hü e1jä e1je e1ji e1jö e1jü e1kä e1ke e1ki e1kö e1kü e1lä e1le e1li e1lö e1lü e1mä e1me e1mi e1mö e1mü e1nä e1ne e1ni e1nö e1nü e1pä e1pe e1pi e1pö e1pü e1rä e1re e1ri e1rö e1rü e1sä e1se e1si e1sö e1sü e1tä e1te e1ti e1tö e1tü e1wä e1we e1wi e1wö e1wü e1ýä e1ýe e1ýi e1ýö e1ýü e1zä e1ze e1zi e1zö e1zü e1ňä e1ňe e1ňi e1ňö e1ňü e1žä e1že e1ži e1žö e1žü e1şä e1şe e1şi e1şö e1şü i1bä i1be i1bi i1bö i1bü i1çä i1çe i1çi i1çö i1çü i1dä i1de i1di i1dö i1dü i1fä i1fe i1fi i1fö i1fü i1gä i1ge i1gi i1gö i1gü i1hä i1he i1hi i1hö i1hü i1jä i1je i1ji i1jö i1jü i1kä i1ke i1ki i1kö i1kü i1lä i1le i1li i1lö i1lü i1mä i1me i1mi i1mö i1mü i1nä i1ne i1ni i1nö i1nü i1pä i1pe i1pi i1pö i1pü i1rä i1re i1ri i1rö i1rü i1sä i1se i1si i1sö i1sü i1tä i1te i1ti i1tö i1tü i1wä i1we i1wi i1wö i1wü i1ýä i1ýe i1ýi i1ýö i1ýü i1zä i1ze i1zi i1zö i1zü i1ňä i1ňe i1ňi i1ňö i1ňü i1žä i1že i1ži i1žö i1žü i1şä i1şe i1şi i1şö i1şü ö1bä ö1be ö1bi ö1bö ö1bü ö1çä ö1çe ö1çi ö1çö ö1çü ö1dä ö1de ö1di ö1dö ö1dü ö1fä ö1fe ö1fi ö1fö ö1fü ö1gä ö1ge ö1gi ö1gö ö1gü ö1hä ö1he ö1hi ö1hö ö1hü ö1jä ö1je ö1ji ö1jö ö1jü ö1kä ö1ke ö1ki ö1kö ö1kü ö1lä ö1le ö1li ö1lö ö1lü ö1mä ö1me ö1mi ö1mö ö1mü ö1nä ö1ne ö1ni ö1nö ö1nü ö1pä ö1pe ö1pi ö1pö ö1pü ö1rä ö1re ö1ri ö1rö ö1rü ö1sä ö1se ö1si ö1sö ö1sü ö1tä ö1te ö1ti ö1tö ö1tü ö1wä ö1we ö1wi ö1wö ö1wü ö1ýä ö1ýe ö1ýi ö1ýö ö1ýü ö1zä ö1ze ö1zi ö1zö ö1zü ö1ňä ö1ňe ö1ňi ö1ňö ö1ňü ö1žä ö1že ö1ži ö1žö ö1žü ö1şä ö1şe ö1şi ö1şö ö1şü ü1bä ü1be ü1bi ü1bö ü1bü ü1çä ü1çe ü1çi ü1çö ü1çü ü1dä ü1de ü1di ü1dö ü1dü ü1fä ü1fe ü1fi ü1fö ü1fü ü1gä ü1ge ü1gi ü1gö ü1gü ü1hä ü1he ü1hi ü1hö ü1hü ü1jä ü1je ü1ji ü1jö ü1jü ü1kä ü1ke ü1ki ü1kö ü1kü ü1lä ü1le ü1li ü1lö ü1lü ü1mä ü1me ü1mi ü1mö ü1mü ü1nä ü1ne ü1ni ü1nö ü1nü ü1pä ü1pe ü1pi ü1pö ü1pü ü1rä ü1re ü1ri ü1rö ü1rü ü1sä ü1se ü1si ü1sö ü1sü ü1tä ü1te ü1ti ü1tö ü1tü ü1wä ü1we ü1wi ü1wö ü1wü ü1ýä ü1ýe ü1ýi ü1ýö ü1ýü ü1zä ü1ze ü1zi ü1zö ü1zü ü1ňä ü1ňe ü1ňi ü1ňö ü1ňü ü1žä ü1že ü1ži ü1žö ü1žü ü1şä ü1şe ü1şi ü1şö ü1şü a1ba a1by a1bo a1bu a1ça a1çy a1ço a1çu a1da a1dy a1do a1du a1fa a1fy a1fo a1fu a1ga a1gy a1go a1gu a1ha a1hy a1ho a1hu a1ja a1jy a1jo a1ju a1ka a1ky a1ko a1ku a1la a1ly a1lo a1lu a1ma a1my a1mo a1mu a1na a1ny a1no a1nu a1pa a1py a1po a1pu a1ra a1ry a1ro a1ru a1sa a1sy a1so a1su a1ta a1ty a1to a1tu a1wa a1wy a1wo a1wu a1ýa a1ýy a1ýo a1ýu a1za a1zy a1zo a1zu a1ňa a1ňy a1ňo a1ňu a1ža a1žy a1žo a1žu a1şa a1şy a1şo a1şu y1ba y1by y1bo y1bu y1ça y1çy y1ço y1çu y1da y1dy y1do y1du y1fa y1fy y1fo y1fu y1ga y1gy y1go y1gu y1ha y1hy y1ho y1hu y1ja y1jy y1jo y1ju y1ka y1ky y1ko y1ku y1la y1ly y1lo y1lu y1ma y1my y1mo y1mu y1na y1ny y1no y1nu y1pa y1py y1po y1pu y1ra y1ry y1ro y1ru y1sa y1sy y1so y1su y1ta y1ty y1to y1tu y1wa y1wy y1wo y1wu y1ýa y1ýy y1ýo y1ýu y1za y1zy y1zo y1zu y1ňa y1ňy y1ňo y1ňu y1ža y1žy y1žo y1žu y1şa y1şy y1şo y1şu o1ba o1by o1bo o1bu o1ça o1çy o1ço o1çu o1da o1dy o1do o1du o1fa o1fy o1fo o1fu o1ga o1gy o1go o1gu o1ha o1hy o1ho o1hu o1ja o1jy o1jo o1ju o1ka o1ky o1ko o1ku o1la o1ly o1lo o1lu o1ma o1my o1mo o1mu o1na o1ny o1no o1nu o1pa o1py o1po o1pu o1ra o1ry o1ro o1ru o1sa o1sy o1so o1su o1ta o1ty o1to o1tu o1wa o1wy o1wo o1wu o1ýa o1ýy o1ýo o1ýu o1za o1zy o1zo o1zu o1ňa o1ňy o1ňo o1ňu o1ža o1žy o1žo o1žu o1şa o1şy o1şo o1şu u1ba u1by u1bo u1bu u1ça u1çy u1ço u1çu u1da u1dy u1do u1du u1fa u1fy u1fo u1fu u1ga u1gy u1go u1gu u1ha u1hy u1ho u1hu u1ja u1jy u1jo u1ju u1ka u1ky u1ko u1ku u1la u1ly u1lo u1lu u1ma u1my u1mo u1mu u1na u1ny u1no u1nu u1pa u1py u1po u1pu u1ra u1ry u1ro u1ru u1sa u1sy u1so u1su u1ta u1ty u1to u1tu u1wa u1wy u1wo u1wu u1ýa u1ýy u1ýo u1ýu u1za u1zy u1zo u1zu u1ňa u1ňy u1ňo u1ňu u1ža u1žy u1žo u1žu u1şa u1şy u1şo u1şu a1bi a1be y1bä y1bi y1be o1bi o1be u1bi u1be i1ba i1bo e1ba e1bo ä1bo ä1ba ö1ba a1çi a1çe y1çä y1çi y1çe o1çi o1çe u1çi u1çe i1ça i1ço e1ça e1ço ä1ço ä1ça ö1ça a1di a1de y1dä y1di y1de o1di o1de u1di u1de i1da i1do e1da e1do ä1do ä1da ö1da a1fi a1fe y1fä y1fi y1fe o1fi o1fe u1fi u1fe i1fa i1fo e1fa e1fo ä1fo ä1fa ö1fa a1gi a1ge y1gä y1gi y1ge o1gi o1ge u1gi u1ge i1ga i1go e1ga e1go ä1go ä1ga ö1ga a1hi a1he y1hä y1hi y1he o1hi o1he u1hi u1he i1ha i1ho e1ha e1ho ä1ho ä1ha ö1ha a1ji a1je y1jä y1ji y1je o1ji o1je u1ji u1je i1ja i1jo e1ja e1jo ä1jo ä1ja ö1ja a1ki a1ke y1kä y1ki y1ke o1ki o1ke u1ki u1ke i1ka i1ko e1ka e1ko ä1ko ä1ka ö1ka a1li a1le y1lä y1li y1le o1li o1le u1li u1le i1la i1lo e1la e1lo ä1lo ä1la ö1la a1mi a1me y1mä y1mi y1me o1mi o1me u1mi u1me i1ma i1mo e1ma e1mo ä1mo ä1ma ö1ma a1ni a1ne y1nä y1ni y1ne o1ni o1ne u1ni u1ne i1na i1no e1na e1no ä1no ä1na ö1na a1pi a1pe y1pä y1pi y1pe o1pi o1pe u1pi u1pe i1pa i1po e1pa e1po ä1po ä1pa ö1pa a1ri a1re y1rä y1ri y1re o1ri o1re u1ri u1re i1ra i1ro e1ra e1ro ä1ro ä1ra ö1ra a1si a1se y1sä y1si y1se o1si o1se u1si u1se i1sa i1so e1sa e1so ä1so ä1sa ö1sa a1ti a1te y1tä y1ti y1te o1ti o1te u1ti u1te i1ta i1to e1ta e1to ä1to ä1ta ö1ta a1wi a1we y1wä y1wi y1we o1wi o1we u1wi u1we i1wa i1wo e1wa e1wo ä1wo ä1wa ö1wa a1ýi a1ýe y1ýä y1ýi y1ýe o1ýi o1ýe u1ýi u1ýe i1ýa i1ýo e1ýa e1ýo ä1ýo ä1ýa ö1ýa a1zi a1ze y1zä y1zi y1ze o1zi o1ze u1zi u1ze i1za i1zo e1za e1zo ä1zo ä1za ö1za a1ňi a1ňe y1ňä y1ňi y1ňe o1ňi o1ňe u1ňi u1ňe i1ňa i1ňo e1ňa e1ňo ä1ňo ä1ňa ö1ňa a1ži a1že y1žä y1ži y1že o1ži o1že u1ži u1že i1ža i1žo e1ža e1žo ä1žo ä1ža ö1ža a1şi a1şe y1şä y1şi y1şe o1şi o1şe u1şi u1şe i1şa i1şo e1şa e1şo ä1şo ä1şa ö1şa b1b .b2b b1ç .b2ç b1d .b2d b1f .b2f b1g .b2g b1h .b2h b1j .b2j b1k .b2k b1l .b2l b1m .b2m b1n .b2n b1p .b2p b1r .b2r b1s .b2s b1t .b2t b1w .b2w b1ý .b2ý b1z .b2z b1ň .b2ň b1ž .b2ž b1ş .b2ş ç1b .ç2b ç1ç .ç2ç ç1d .ç2d ç1f .ç2f ç1g .ç2g ç1h .ç2h ç1j .ç2j ç1k .ç2k ç1l .ç2l ç1m .ç2m ç1n .ç2n ç1p .ç2p ç1r .ç2r ç1s .ç2s ç1t .ç2t ç1w .ç2w ç1ý .ç2ý ç1z .ç2z ç1ň .ç2ň ç1ž .ç2ž ç1ş .ç2ş d1b .d2b d1ç .d2ç d1d .d2d d1f .d2f d1g .d2g d1h .d2h d1j .d2j d1k .d2k d1l .d2l d1m .d2m d1n .d2n d1p .d2p d1r .d2r d1s .d2s d1t .d2t d1w .d2w d1ý .d2ý d1z .d2z d1ň .d2ň d1ž .d2ž d1ş .d2ş f1b .f2b f1ç .f2ç f1d .f2d f1f .f2f f1g .f2g f1h .f2h f1j .f2j f1k .f2k f1l .f2l f1m .f2m f1n .f2n f1p .f2p f1r .f2r f1s .f2s f1t .f2t f1w .f2w f1ý .f2ý f1z .f2z f1ň .f2ň f1ž .f2ž f1ş .f2ş g1b .g2b g1ç .g2ç g1d .g2d g1f .g2f g1g .g2g g1h .g2h g1j .g2j g1k .g2k g1l .g2l g1m .g2m g1n .g2n g1p .g2p g1r .g2r g1s .g2s g1t .g2t g1w .g2w g1ý .g2ý g1z .g2z g1ň .g2ň g1ž .g2ž g1ş .g2ş h1b .h2b h1ç .h2ç h1d .h2d h1f .h2f h1g .h2g h1h .h2h h1j .h2j h1k .h2k h1l .h2l h1m .h2m h1n .h2n h1p .h2p h1r .h2r h1s .h2s h1t .h2t h1w .h2w h1ý .h2ý h1z .h2z h1ň .h2ň h1ž .h2ž h1ş .h2ş j1b .j2b j1ç .j2ç j1d .j2d j1f .j2f j1g .j2g j1h .j2h j1j .j2j j1k .j2k j1l .j2l j1m .j2m j1n .j2n j1p .j2p j1r .j2r j1s .j2s j1t .j2t j1w .j2w j1ý .j2ý j1z .j2z j1ň .j2ň j1ž .j2ž j1ş .j2ş k1b .k2b k1ç .k2ç k1d .k2d k1f .k2f k1g .k2g k1h .k2h k1j .k2j k1k .k2k k1l .k2l k1m .k2m k1n .k2n k1p .k2p k1r .k2r k1s .k2s k1t .k2t k1w .k2w k1ý .k2ý k1z .k2z k1ň .k2ň k1ž .k2ž k1ş .k2ş l1b .l2b l1ç .l2ç l1d .l2d l1f .l2f l1g .l2g l1h .l2h l1j .l2j l1k .l2k l1l .l2l l1m .l2m l1n .l2n l1p .l2p l1r .l2r l1s .l2s l1t .l2t l1w .l2w l1ý .l2ý l1z .l2z l1ň .l2ň l1ž .l2ž l1ş .l2ş m1b .m2b m1ç .m2ç m1d .m2d m1f .m2f m1g .m2g m1h .m2h m1j .m2j m1k .m2k m1l .m2l m1m .m2m m1n .m2n m1p .m2p m1r .m2r m1s .m2s m1t .m2t m1w .m2w m1ý .m2ý m1z .m2z m1ň .m2ň m1ž .m2ž m1ş .m2ş n1b .n2b n1ç .n2ç n1d .n2d n1f .n2f n1g .n2g n1h .n2h n1j .n2j n1k .n2k n1l .n2l n1m .n2m n1n .n2n n1p .n2p n1r .n2r n1s .n2s n1t .n2t n1w .n2w n1ý .n2ý n1z .n2z n1ň .n2ň n1ž .n2ž n1ş .n2ş p1b .p2b p1ç .p2ç p1d .p2d p1f .p2f p1g .p2g p1h .p2h p1j .p2j p1k .p2k p1l .p2l p1m .p2m p1n .p2n p1p .p2p p1r .p2r p1s .p2s p1t .p2t p1w .p2w p1ý .p2ý p1z .p2z p1ň .p2ň p1ž .p2ž p1ş .p2ş r1b .r2b r1ç .r2ç r1d .r2d r1f .r2f r1g .r2g r1h .r2h r1j .r2j r1k .r2k r1l .r2l r1m .r2m r1n .r2n r1p .r2p r1r .r2r r1s .r2s r1t .r2t r1w .r2w r1ý .r2ý r1z .r2z r1ň .r2ň r1ž .r2ž r1ş .r2ş s1b .s2b s1ç .s2ç s1d .s2d s1f .s2f s1g .s2g s1h .s2h s1j .s2j s1k .s2k s1l .s2l s1m .s2m s1n .s2n s1p .s2p s1r .s2r s1s .s2s s1t .s2t s1w .s2w s1ý .s2ý s1z .s2z s1ň .s2ň s1ž .s2ž s1ş .s2ş t1b .t2b t1ç .t2ç t1d .t2d t1f .t2f t1g .t2g t1h .t2h t1j .t2j t1k .t2k t1l .t2l t1m .t2m t1n .t2n t1p .t2p t1r .t2r t1s .t2s t1t .t2t t1w .t2w t1ý .t2ý t1z .t2z t1ň .t2ň t1ž .t2ž t1ş .t2ş w1b .w2b w1ç .w2ç w1d .w2d w1f .w2f w1g .w2g w1h .w2h w1j .w2j w1k .w2k w1l .w2l w1m .w2m w1n .w2n w1p .w2p w1r .w2r w1s .w2s w1t .w2t w1w .w2w w1ý .w2ý w1z .w2z w1ň .w2ň w1ž .w2ž w1ş .w2ş ý1b .ý2b ý1ç .ý2ç ý1d .ý2d ý1f .ý2f ý1g .ý2g ý1h .ý2h ý1j .ý2j ý1k .ý2k ý1l .ý2l ý1m .ý2m ý1n .ý2n ý1p .ý2p ý1r .ý2r ý1s .ý2s ý1t .ý2t ý1w .ý2w ý1ý .ý2ý ý1z .ý2z ý1ň .ý2ň ý1ž .ý2ž ý1ş .ý2ş z1b .z2b z1ç .z2ç z1d .z2d z1f .z2f z1g .z2g z1h .z2h z1j .z2j z1k .z2k z1l .z2l z1m .z2m z1n .z2n z1p .z2p z1r .z2r z1s .z2s z1t .z2t z1w .z2w z1ý .z2ý z1z .z2z z1ň .z2ň z1ž .z2ž z1ş .z2ş ň1b .ň2b ň1ç .ň2ç ň1d .ň2d ň1f .ň2f ň1g .ň2g ň1h .ň2h ň1j .ň2j ň1k .ň2k ň1l .ň2l ň1m .ň2m ň1n .ň2n ň1p .ň2p ň1r .ň2r ň1s .ň2s ň1t .ň2t ň1w .ň2w ň1ý .ň2ý ň1z .ň2z ň1ň .ň2ň ň1ž .ň2ž ň1ş .ň2ş ž1b .ž2b ž1ç .ž2ç ž1d .ž2d ž1f .ž2f ž1g .ž2g ž1h .ž2h ž1j .ž2j ž1k .ž2k ž1l .ž2l ž1m .ž2m ž1n .ž2n ž1p .ž2p ž1r .ž2r ž1s .ž2s ž1t .ž2t ž1w .ž2w ž1ý .ž2ý ž1z .ž2z ž1ň .ž2ň ž1ž .ž2ž ž1ş .ž2ş ş1b .ş2b ş1ç .ş2ç ş1d .ş2d ş1f .ş2f ş1g .ş2g ş1h .ş2h ş1j .ş2j ş1k .ş2k ş1l .ş2l ş1m .ş2m ş1n .ş2n ş1p .ş2p ş1r .ş2r ş1s .ş2s ş1t .ş2t ş1w .ş2w ş1ý .ş2ý ş1z .ş2z ş1ň .ş2ň ş1ž .ş2ž ş1ş .ş2ş ý2t1b ý2n1b ý2d1b r2t1b ý2p1b l2p1b l2t1b g2t1b n2t1b r2k1b r2p1b k2t1b r2h1b s2t1b l2k1b w2p1b n2s1b r2s1b l2m1b ý2t1ç ý2n1ç ý2d1ç r2t1ç ý2p1ç l2p1ç l2t1ç g2t1ç n2t1ç r2k1ç r2p1ç k2t1ç r2h1ç s2t1ç l2k1ç w2p1ç n2s1ç r2s1ç l2m1ç ý2t1d ý2n1d ý2d1d r2t1d ý2p1d l2p1d l2t1d g2t1d n2t1d r2k1d r2p1d k2t1d r2h1d s2t1d l2k1d w2p1d n2s1d r2s1d l2m1d ý2t1g ý2n1g ý2d1g r2t1g ý2p1g l2p1g l2t1g g2t1g n2t1g r2k1g r2p1g k2t1g r2h1g s2t1g l2k1g w2p1g n2s1g r2s1g l2m1g ý2t1j ý2n1j ý2d1j r2t1j ý2p1j l2p1j l2t1j g2t1j n2t1j r2k1j r2p1j k2t1j r2h1j s2t1j l2k1j w2p1j n2s1j r2s1j l2m1j ý2t1k ý2n1k ý2d1k r2t1k ý2p1k l2p1k l2t1k g2t1k n2t1k r2k1k r2p1k k2t1k r2h1k s2t1k l2k1k w2p1k n2s1k r2s1k l2m1k ý2t1l ý2n1l ý2d1l r2t1l ý2p1l l2p1l l2t1l g2t1l n2t1l r2k1l r2p1l k2t1l r2h1l s2t1l l2k1l w2p1l n2s1l r2s1l l2m1l ý2t1m ý2n1m ý2d1m r2t1m ý2p1m l2p1m l2t1m g2t1m n2t1m r2k1m r2p1m k2t1m r2h1m s2t1m l2k1m w2p1m n2s1m r2s1m l2m1m ý2t1n ý2n1n ý2d1n r2t1n ý2p1n l2p1n l2t1n g2t1n n2t1n r2k1n r2p1n k2t1n r2h1n s2t1n l2k1n w2p1n n2s1n r2s1n l2m1n ý2t1p ý2n1p ý2d1p r2t1p ý2p1p l2p1p l2t1p g2t1p n2t1p r2k1p r2p1p k2t1p r2h1p s2t1p l2k1p w2p1p n2s1p r2s1p l2m1p ý2t1s ý2n1s ý2d1s r2t1s ý2p1s l2p1s l2t1s g2t1s n2t1s r2k1s r2p1s k2t1s r2h1s s2t1s l2k1s w2p1s n2s1s r2s1s l2m1s ý2t1t ý2n1t ý2d1t r2t1t ý2p1t l2p1t l2t1t g2t1t n2t1t r2k1t r2p1t k2t1t r2h1t s2t1t l2k1t w2p1t n2s1t r2s1t l2m1t ý2t1ý ý2n1ý ý2d1ý r2t1ý ý2p1ý l2p1ý l2t1ý g2t1ý n2t1ý r2k1ý r2p1ý k2t1ý r2h1ý s2t1ý l2k1ý w2p1ý n2s1ý r2s1ý l2m1ý ý2t1z ý2n1z ý2d1z r2t1z ý2p1z l2p1z l2t1z g2t1z n2t1z r2k1z r2p1z k2t1z r2h1z s2t1z l2k1z w2p1z n2s1z r2s1z l2m1z ý2t1ş ý2n1ş ý2d1ş r2t1ş ý2p1ş l2p1ş l2t1ş g2t1ş n2t1ş r2k1ş r2p1ş k2t1ş r2h1ş s2t1ş l2k1ş w2p1ş n2s1ş r2s1ş l2m1ş s2k1d l1s2k l1s2t s1t2r n2g1l n1g2r s2k1w",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=2372,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-tk.pat b/Master/texmf-dist/tex/context/patterns/lang-tk.pat
index 33290cb1665..29d1b467742 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-tk.pat
+++ b/Master/texmf-dist/tex/context/patterns/lang-tk.pat
@@ -2,9 +2,10 @@
% for comment and copyright, see e:/tmp/patterns/lang-tk.rme
-% used: a b d e f g h i j k l m n o p r s t u w y z ä ç ö ü ý ň ş ž
+% used: - a b d e f g h i j k l m n o p r s t u w y z ä ç ö ü ý ň ş ž
\patterns{
+1-4
ä1bä
ä1be
ä1bi
diff --git a/Master/texmf-dist/tex/context/patterns/lang-tk.rme b/Master/texmf-dist/tex/context/patterns/lang-tk.rme
index d5a71a6368b..88ab6c39c23 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-tk.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-tk.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Turkmen Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% Hyphenation patterns for Turkmen (hyph-tk.tex)
%
% Author: Nazar Annagurban <nazartm at gmail.com>
@@ -15,4 +19,4 @@
% For more information about UTF-8 hyphenation patterns for TeX and
% links to this file see
% http://www.tug.org/tex-hyphen/
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-tr.lua b/Master/texmf-dist/tex/context/patterns/lang-tr.lua
new file mode 100644
index 00000000000..33b8057b811
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-tr.lua
@@ -0,0 +1,47 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="tr",
+ ["source"]="hyph-tr",
+ ["texcomment"]="% Turkish Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% hyph-tr.tex\
+%\
+% File auto-generated from generate_patterns_tr.rb that is part of hyph-utf8\
+%\
+% Licence:\
+% - Free enough for Debian & TeX Live or any other distributor\
+% - If you are reading this and have some suggestion about what to put here, please advise\
+% - I (Mojca) would prefer to say 'public domain', but don't know what it means for the original authors\
+%\
+% Credits:\
+% - algorithm developed by P. A. MacKay for the Ottoman Texts Project in 1987\
+% - rules adapted for modern Turkish by H. Turgut Uyar <uyar at itu.edu.tr>\
+% - initiative to improve Turkish patterns by S. Ekin Kocabas <kocabas at stanford.edu>\
+% - script written by Mojca Miklavec <mojca.miklavec.lists at gmail.com> in June 2008\
+%\
+% Modifications:\
+% - adapted for the use on modern UTF-8 TeX engines\
+% - UTF-8 patterns are used\
+% - only letters for Modern Turkish + âîû (the first one often needed, the other two don't hurt)\
+% - if needed, support for Ottoman Turkish might be provided separately under 'ota' (not 'tr')\
+%\
+% Notes:\
+% - you need to use loadhyph-tr.tex, please do not try to put \\catcode-s & \\lccode-s here\
+% \
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnoprstuvyzâçîöûüğış",
+ ["data"]="2a1 2â1 2e1 2ı1 2i1 2î1 2o1 2ö1 2u1 2ü1 2û1 1b1 1c1 1ç1 1d1 1f1 1g1 1ğ1 1h1 1j1 1k1 1l1 1m1 1n1 1p1 1r1 1s1 1ş1 1t1 1v1 1y1 1z1 2e2cek. 2bb 2bc 2bç 2bd 2bf 2bg 2bğ 2bh 2bj 2bk 2bl 2bm 2bn 2bp 2br 2bs 2bş 2bt 2bv 2by 2bz 2cb 2cc 2cç 2cd 2cf 2cg 2cğ 2ch 2cj 2ck 2cl 2cm 2cn 2cp 2cr 2cs 2cş 2ct 2cv 2cy 2cz 2çb 2çc 2çç 2çd 2çf 2çg 2çğ 2çh 2çj 2çk 2çl 2çm 2çn 2çp 2çr 2çs 2çş 2çt 2çv 2çy 2çz 2db 2dc 2dç 2dd 2df 2dg 2dğ 2dh 2dj 2dk 2dl 2dm 2dn 2dp 2dr 2ds 2dş 2dt 2dv 2dy 2dz 2fb 2fc 2fç 2fd 2ff 2fg 2fğ 2fh 2fj 2fk 2fl 2fm 2fn 2fp 2fr 2fs 2fş 2ft 2fv 2fy 2fz 2gb 2gc 2gç 2gd 2gf 2gg 2gğ 2gh 2gj 2gk 2gl 2gm 2gn 2gp 2gr 2gs 2gş 2gt 2gv 2gy 2gz 2ğb 2ğc 2ğç 2ğd 2ğf 2ğg 2ğğ 2ğh 2ğj 2ğk 2ğl 2ğm 2ğn 2ğp 2ğr 2ğs 2ğş 2ğt 2ğv 2ğy 2ğz 2hb 2hc 2hç 2hd 2hf 2hg 2hğ 2hh 2hj 2hk 2hl 2hm 2hn 2hp 2hr 2hs 2hş 2ht 2hv 2hy 2hz 2jb 2jc 2jç 2jd 2jf 2jg 2jğ 2jh 2jj 2jk 2jl 2jm 2jn 2jp 2jr 2js 2jş 2jt 2jv 2jy 2jz 2kb 2kc 2kç 2kd 2kf 2kg 2kğ 2kh 2kj 2kk 2kl 2km 2kn 2kp 2kr 2ks 2kş 2kt 2kv 2ky 2kz 2lb 2lc 2lç 2ld 2lf 2lg 2lğ 2lh 2lj 2lk 2ll 2lm 2ln 2lp 2lr 2ls 2lş 2lt 2lv 2ly 2lz 2mb 2mc 2mç 2md 2mf 2mg 2mğ 2mh 2mj 2mk 2ml 2mm 2mn 2mp 2mr 2ms 2mş 2mt 2mv 2my 2mz 2nb 2nc 2nç 2nd 2nf 2ng 2nğ 2nh 2nj 2nk 2nl 2nm 2nn 2np 2nr 2ns 2nş 2nt 2nv 2ny 2nz 2pb 2pc 2pç 2pd 2pf 2pg 2pğ 2ph 2pj 2pk 2pl 2pm 2pn 2pp 2pr 2ps 2pş 2pt 2pv 2py 2pz 2rb 2rc 2rç 2rd 2rf 2rg 2rğ 2rh 2rj 2rk 2rl 2rm 2rn 2rp 2rr 2rs 2rş 2rt 2rv 2ry 2rz 2sb 2sc 2sç 2sd 2sf 2sg 2sğ 2sh 2sj 2sk 2sl 2sm 2sn 2sp 2sr 2ss 2sş 2st 2sv 2sy 2sz 2şb 2şc 2şç 2şd 2şf 2şg 2şğ 2şh 2şj 2şk 2şl 2şm 2şn 2şp 2şr 2şs 2şş 2şt 2şv 2şy 2şz 2tb 2tc 2tç 2td 2tf 2tg 2tğ 2th 2tj 2tk 2tl 2tm 2tn 2tp 2tr 2ts 2tş 2tt 2tv 2ty 2tz 2vb 2vc 2vç 2vd 2vf 2vg 2vğ 2vh 2vj 2vk 2vl 2vm 2vn 2vp 2vr 2vs 2vş 2vt 2vv 2vy 2vz 2yb 2yc 2yç 2yd 2yf 2yg 2yğ 2yh 2yj 2yk 2yl 2ym 2yn 2yp 2yr 2ys 2yş 2yt 2yv 2yy 2yz 2zb 2zc 2zç 2zd 2zf 2zg 2zğ 2zh 2zj 2zk 2zl 2zm 2zn 2zp 2zr 2zs 2zş 2zt 2zv 2zy 2zz a3a2 a3â2 a3e2 a3ı2 a3i2 a3î2 a3o2 a3ö2 a3u2 a3ü2 a3û2 â3a2 â3â2 â3e2 â3ı2 â3i2 â3î2 â3o2 â3ö2 â3u2 â3ü2 â3û2 e3a2 e3â2 e3e2 e3ı2 e3i2 e3î2 e3o2 e3ö2 e3u2 e3ü2 e3û2 ı3a2 ı3â2 ı3e2 ı3ı2 ı3i2 ı3î2 ı3o2 ı3ö2 ı3u2 ı3ü2 ı3û2 i3a2 i3â2 i3e2 i3ı2 i3i2 i3î2 i3o2 i3ö2 i3u2 i3ü2 i3û2 î3a2 î3â2 î3e2 î3ı2 î3i2 î3î2 î3o2 î3ö2 î3u2 î3ü2 î3û2 o3a2 o3â2 o3e2 o3ı2 o3i2 o3î2 o3o2 o3ö2 o3u2 o3ü2 o3û2 ö3a2 ö3â2 ö3e2 ö3ı2 ö3i2 ö3î2 ö3o2 ö3ö2 ö3u2 ö3ü2 ö3û2 u3a2 u3â2 u3e2 u3ı2 u3i2 u3î2 u3o2 u3ö2 u3u2 u3ü2 u3û2 ü3a2 ü3â2 ü3e2 ü3ı2 ü3i2 ü3î2 ü3o2 ü3ö2 ü3u2 ü3ü2 ü3û2 û3a2 û3â2 û3e2 û3ı2 û3i2 û3î2 û3o2 û3ö2 û3u2 û3ü2 û3û2 tu4r4k m1t4rak",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=597,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-tr.rme b/Master/texmf-dist/tex/context/patterns/lang-tr.rme
index 143164e257d..fd4315b18b4 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-tr.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-tr.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Turkish Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% hyph-tr.tex
%
% File auto-generated from generate_patterns_tr.rb that is part of hyph-utf8
@@ -23,4 +27,4 @@
%
% Notes:
% - you need to use loadhyph-tr.tex, please do not try to put \catcode-s & \lccode-s here
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/patterns/lang-uk.lua b/Master/texmf-dist/tex/context/patterns/lang-uk.lua
new file mode 100644
index 00000000000..d3e35025a75
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-uk.lua
@@ -0,0 +1,91 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="uk",
+ ["source"]="hyph-uk",
+ ["texcomment"]="% Ukrainian Hyphenation Patterns\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: TODO:WRITEME (yyyy-mm-dd)\
+% Author: Maksym Polyakov <polyama at auburn.edu>, <mpoliak at i.com.ua>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% Ukrainian hyphenation patterns in LCY (cp866nav) encoding. \
+% Copyright 1998-2001 Maksym Polyakov. \
+% Released 2001/05/10.\
+% This file can be redistributed and/or modified \
+% under the terms of the LaTeX Project Public License (lppl). \
+% Please, send bug reports via e-mail: \
+% polyama@auburn.edu \
+% mpoliak@i.com.ua \
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="-абвгдежзийклмнопрстуфхцчшщьюяєіїґ’",
+ ["data"]="2а1 а3а а3е а3і а3о а3у а3ю а3я а3є а3ї 2е1 е3а е3е е3і е3о е3у е3ю е3я е3є е3ї 2и1 и3а и3е и3і и3о и3у и3ю и3я и3є и3ї 2і1 і3а і3е і3и і3о і3у і3ю і3я і3є і3ї 2о1 о3а о3е о3і о3о о3у о3ю о3я о3є о3ї 2у1 у3а у3е у3і у3о у3у у3ю у3я у3є у3ї 2ю1 ю3а ю3е ю3і ю3о ю3у ю3ю ю3я ю3є ю3ї 2я1 я3а я3е я3о я3у я3ю я3я я3є я3ї 2є1 є3у є3ю є3є є3ї 2ї1 ї3е ї3о ї3ю 2б1к 2б1п 2б1с 2б1т 2б1ф 2б1х 2б1ц 2б1ч 2б1ш 2б1щ 2в1б 2в1г 2в1д 2в1ж 2в1з 2в1к 2в1л 2в1м 2в1н 2в1п 2в1р 2в1с 2в1т 2в1ф 2в1х 2в1ц 2в1ч 2в1ш 2в1щ 2в1й 2в’3 2г1к 2г1п 2г1с 2г1т 2г1ф 2г1ц 2г1ч 2г1ш 2д1к 2д1п 2д1с 2д1т 2д1ф 2д1х 2д1ц 2д1ч 2д1ш 2д1щ 2ж1к 2ж1п 2ж1с 2ж1т 2ж1ф 2ж1х 2ж1ц 2ж1ч 2ж1ш 2з1к 2з1п 2з1с 2з1т 2з1ф 2з1х 2з1ц 2з1ч 2з1ш 2з1щ 2к1б 2к1г 2к1д 2к1з 2л1б 2л1в 2л1г 2л1ґ 2л1д 2л1ж 2л1з 2л1к 2л1м 2л1н 2л1п 2л1р 2л1с 2л1т 2л1ф 2л1х 2л1ц 2л1ч 2м1б 2м1в 2м1г 2м1д 2м1ж 2м1з 2м1к 2м1л 2м1н 2м1п 2м1р 2м1с 2м1т 2м1ф 2м1х 2м1ц 2м1ч 2м1ш 2м1щ 2м’3 2н1б 2н1в 2н1г 2н1д 2н1ж 2н1з 2н1к 2н1л 2н1м 2н1п 2н1р 2н1с 2н1т 2н1ф 2н1х 2н1ц 2н1ч 2н1ш 2н1щ 2н’3 2п1б 2п1д 2п1з 2р1б 2р1в 2р1г 2р1ґ 2р1д 2р1ж 2р1з 2р1к 2р1л 2р1м 2р1н 2р1п 2р1с 2р1т 2р1ф 2р1х 2р1ц 2р1ч 2р1ш 2р1щ 2р1й 2р’3 2с1б 2с1г 2с1д 2т1б 2т1г 2т1д 2т1ж 2т1з 2ф1б 2ф1г 2ф1з 2х1г 2х1д 2ц1б 2ц1г 2ц1д 2ц1з 2ч1б 2ч1д 2ч1ж 2ш1б 2ш1г 2й1б 2й1в 2й1г 2й1д 2й1ж 2й1з 2й1к 2й1л 2й1м 2й1н 2й1п 2й1р 2й1с 2й1т 2й1ф 2й1х 2й1ц 2й1ч 2й1ш 2й1щ 2дь1к 2дь1с 2дь1т 2дь1ц 2зь1к 2зь1с 2зь1т 2ль1б 2ль1в 2ль1г 2ль1д 2ль1ж 2ль1з 2ль1к 2ль1м 2ль1н 2ль1п 2ль1р 2ль1с 2ль1т 2ль1ф 2ль1х 2ль1ц 2ль1ч 2ль1ш 2ль1щ 2ль1й 2нь1б 2нь1г 2нь1з 2нь1к 2нь1л 2нь1м 2нь1с 2нь1т 2нь1х 2нь1ц 2нь1ч 2нь1ш 2нь1й 2рь1к 2рь1ц 2сь1б 2сь1д 2ть1б 2к1сп 2к1ст 2к1ськ 2п1сп 2п1ст 2п1ськ 2с1пк 2с1пп 2с1пс 2с1пт 2с1пх 2с1пч 2с1ськ 2с1тк 2с1тп 2с1тс 2с1тсь 2с1тт 2с1тф 2с1тц 2с1шт 2сь1кк 2сь1кс 2сь1кт 2т1ск 2т1сп 2т1ст 2т1ськ 2т1шк 2ф1сп 2ф1ст 2ф1ськ 2ф1шт 2х1ст 2х1ськ 2ц1ст 2ц1шк 2ш1тк 2ш1тсь 2б1б 2в1в 2г1г 2ґ1ґ 2д1д 2ж1ж 2з1з 2к1к 2л1л 2м1м 2н1н 2п1п 2р1р 2с1с 2т1т 2ф1ф 2х1х 2ц1ц 2ч1ч 2ш1ш 2щ1щ 2й1й 3ння 3ття 3ттю 3лля 3ллє 3ллю 3ддя д4ж д4з а2й е2й и2й і2й о2й у2й ю2й я2й є2й ї2й 3й6о ь6о 6’ 6ь .б’8 .в’8 .д’8 .з’8 .м’8 .н’8 .п’8 .р’8 .т’8 .ф’8 .ш’8 .бд6 .бр6 .вб6 .вб6’6 .вв6’6 .вг6 .вд6 .вж6 .вз6 .вз6д6 .вк6 .вл6 .вм6 .вм6’6 .вп6 .вп6’6 .вп6х6 .вс6 .вс6т6 .вт6 .вш6к6 .дж6 .дз6 .дл6 .дс6 .зб6 .зв6’6 .зг6 .зд6 .зд6з6 .зл6 .зм6’6 .зс6 .зс6к6 .зс6т6 .зч6 .зш6 .зш6к6 .зґ6 .йш6 .кл6 .кп6 .кс6 .кх6 .кш6 .лк6с6 .лс6 .ль6 .мс6 .мф6 .нб6 .пр6 .пс6 .пх6 .рт6 .ск6 .ск6л6 .сл6 .сп6 .сп6’6 .сп6л6 .сп6х6 .ст6 .сх6 .сх6л6 .тк6 .тр6 .тх6 .ть6 .фл6 .хл6 .ць6 .чх6 .шк6 .шл6 .шп6 .шт6 6бв. 6бз. 6бй. 6бл. 6б6ль. 6бн. 6бр. 6бс. 6б6ст. 6б6с6тв. 6б6с6тр. 6б6с6ьк. 6б6ць. 6вб. 6вв. 6вд. 6в6др. 6в6дь. 6вж. 6вз. 6в6зь. 6вй. 6вк. 6вл. 6в6ль. 6вм. 6вн. 6вп. 6вр. 6вс. 6в6с6тв. 6в6с6ть. 6в6сь. 6в6с6ьк. 6вт. 6вх. 6в6ць. 6вч. 6вш. 6вщ. 6гв. 6гг. 6гд. 6гл. 6г6ль. 6гм. 6гн. 6гр. 6гс. 6г6с6тв. 6г6сь. 6гт. 6дж. 6дз. 6д6зь. 6дл. 6дм. 6дн. 6др. 6д6с6тв. 6д6с6ьк. 6дт. 6дь. 6д6ь6сь. 6жб. 6жв. 6ж6дь. 6ж6сь. 6зв. 6зг. 6зд. 6з6дв. 6з6дн. 6з6дь. 6зк. 6зл. 6зм. 6зн. 6з6нь. 6зр. 6з6сь. 6зь. 6з6ьб. 6з6ьк. 6йб. 6йв. 6йг. 6йд. 6йз. 6йк. 6й6кл. 6йл. 6й6ль. 6йм. 6й6мс. 6йн. 6й6нс. 6йп. 6йр. 6йс. 6й6ст. 6й6с6тв. 6й6с6тр. 6й6сь. 6й6с6ьк. 6йт. 6й6тс. 6йф. 6йх. 6йц. 6йч. 6йш. 6кв. 6кк. 6кл. 6к6ль. 6кр. 6кс. 6к6ст. 6к6сь. 6кт. 6к6тр. 6кх. 6кш. 6лб. 6лг. 6лд. 6лк. 6лл. 6л6ль. 6лм. 6л6мс. 6лн. 6лп. 6лс. 6лт. 6л6хв. 6ль. 6л6ьб. 6л6ьв. 6л6ьг. 6л6ьд. 6л6ь6дс. 6л6ьз. 6л6ьк. 6л6ьм. 6л6ьн. 6л6ьп. 6л6ьс. 6л6ь6ств. 6л6ь6сь. 6л6ь6ськ. 6л6ьт. 6л6ь6тр. 6л6ьф. 6л6ьх. 6л6ьц. 6л6ьч. 6л6ьш. 6л6ьщ. 6мб. 6м6б6ль. 6м6бр. 6мг. 6мж. 6мк. 6мл. 6м6ль. 6мм. 6мн. 6мп. 6мр. 6мс. 6м6с6тв. 6м6сь. 6м6с6ьк. 6мт. 6мф. 6мх. 6мш. 6нв. 6нг. 6н6гл. 6н6г6ль. 6н6гр. 6н6гс. 6нд. 6н6дж. 6н6дз. 6н6дп. 6н6др. 6нж. 6нз. 6нк. 6н6кс. 6н6кт. 6нм. 6нн. 6нр. 6нс. 6н6ск. 6н6ст. 6н6с6тв. 6н6с6тр. 6н6с6ьк. 6н6с6ькй. 6нт. 6н6тк. 6н6тр. 6н6т6ств. 6н6ть. 6нф. 6нх. 6нц. 6н6ць. 6нч. 6нш. 6нь. 6н6ьб. 6н6ьг. 6н6ьк. 6н6ь6сь. 6пд. 6пл. 6пр. 6пс. 6п6с6тв. 6п6сь. 6пт. 6п6тр. 6пф. 6пц. 6рб. 6рв. 6рг. 6рд. 6р6дв. 6р6дж. 6р6дь. 6рж. 6рз. 6р6зн. 6р6зь. 6рк. 6р6кс. 6р6кт. 6рл. 6р6ль. 6р6л6ьз. 6рм. 6рн. 6р6нс. 6р6н6ст. 6р6нь. 6рп. 6рр. 6рс. 6р6ср. 6р6ст. 6р6с6тв. 6р6с6ть. 6р6сь. 6р6с6ьк. 6рт. 6р6тв. 6р6тр. 6р6ть. 6рф. 6рх. 6рц. 6р6ць. 6рч. 6рш. 6рщ. 6р6щ6сь. 6рь. 6с6дп. 6с6д6рп. 6ск. 6сл. 6с6ль. 6см. 6сн. 6сп. 6сс. 6ст. 6с6тв. 6с6тй. 6с6тм. 6с6тр. 6с6т6рь. 6с6ть. 6с6ць. 6сь. 6с6ьб. 6с6ьк. 6с6ьм. 6тв. 6т6вт. 6т6зт. 6тл. 6т6ль. 6тм. 6т6мр. 6тр. 6тс. 6т6с6тв. 6т6с6ьк. 6тт. 6тц. 6тч. 6ть. 6т6ь6сь. 6фм. 6фр. 6ф6с6тв. 6фт. 6ф6ть. 6фф. 6фь. 6хв. 6хм. 6хн. 6хр. 6хт. 6хш. 6ц6тв. 6ць. 6ц6ьк. 6чб. 6чм. 6чн. 6чт. 6шв. 6ш6ль. 6шм. 6шн. 6ш6нл. 6ш6сь. 6шт. 6ш6тв. 6щ6сь. .бе4з’3 .бе4з3 .безу4 .бе5з4о3д .без5о4соб .безві4д3 .без3ро4з3 виї4 .ві5д4ом .ві5д4озв .ві5д4ун віду4ч .ві5д4а .ві5д4ер .ві5д4і .ві4д3 .від’3 .мі4ж3 безві4д3 ові4д3 ді4єві4д3 за4вві4д3 неві4д’3 неві4д3 про4ф3ві4д3 спе4ц3ві4д3 співві4д3 те4х3ві4д3 .пере4д3бач .пере4д3виб .пере4д3г .пере4д3д .пере4д3м .пере4д3ост .пере4д3пла .пере4д3пок .пере4д3р .пере4д3св .пере4д3умов .пере4д3усі .пере4д3фр .пере4д3ч .пере4д’3 .пере3 .пона4д3 .пона5д4і .пона5д4и .пона5д4я 3п4ре 3п4ри приї4 3п4ро 3п4рі .пі5д4о .пі5д4і .під’3 .пі4д3 .пі5д4е .пі5д4и .пі5д4у .пі4в3 .спі4в3 .напі4в3 .ро5з4і .ро5з4е ро5з4йом .ро5з4а .ро4з’3 .ро4з3 .чере4з’3 .чере4з3 оо4б ооб’3 ооб3м ооб3ро об’3 од’3 на4д’3 за5о4р до5о4р по5о4р пере5о4р пі6д5о4р бе4з5і4дей до3в’4є за3в’4є зі3в’4є обі3в’4є по3в’4є уі3в’4є з3в’4я по3в’4я від3в’4я за3в’4я зі3в’4я за3ю4ш на3в’4я непо3в’4я об3в’4я при3в’4я під3в’4я у3в’4я з3м’4я зі3м’4я у3м’4я в3м’4я но3м’4я за3м’4я на3м’4я об3м’4я пере3м’4я по3м’4я при3м’4я піді3м’4я су3м’4я до3в’4ю за3в’4ю зі3в’4ю на3в’4ю по3в’4ю уі3в’4ю інтер3в’4ю за3я4ло коу4роч зу4роч наду4роч позау4роч поу4роч приу4роч на4й3у4бог нао4р прио4р неу4к 3в4б4лаг 3в4к4лад 3в4п4лив 3в4п4равн 3в4р4одлив 3в4т4рут 3в4т4руч 3з4б4рой 3з4б4рою 3з4б4роє 3з4в4’яз 3й4ш4л 3м4к4не 3м4к4ну 3м4к4ні 3п4с4ков 3с4к4лад 3с4к4ле 3с4к4лит 3с4к4ло 3с4к4рипт 3с4п4лав 3с4п4лат 3с4п4лач 3с4п4рав 3с4п4ритн 3с4п4рият 3с4п4ромо 3с4т4вор 3с4т4ражд 3с4т4рах 3с4т4риб 3с4т4риж 3с4т4рой 3с4т4рок 3с4т4ром 3с4т4роф 3с4т4роч 3с4т4рою 3с4т4роя 3с4т4роє 3с4т4рої 3с4т4рукт 3с4т4рукц 3с4т4рій 3с4т4ріл 3с4т4річ 3т4к4нен 3т4ь4мар 3т4ь4мяні 3у4п4рав 3блаж 3ближ 3близ 3блиск 3блок 3блоці 3бран 3брати 3брест 3бризк 3британ 3бруд 3в4бив 3в4веден 3в4дал 3в4довз 3в4довол 3в4живан 3в4лад 3в4ласн 3в4лашт 3в4лов 3в4певн 3в4поряд 3в4разлив 3в4рожай 3в4сюд 3в4тіл 3глад 3глиб 3глин 3глоб 3глуз 3глуш 3гляд 3глян 3гнан 3гнил 3гноз 3гнучк 3грав 3град 3грай 3грам 3гран 3грати 3граф 3граш 3граю 3грає 3грес 3грець 3гроб 3грож 3гроз 3громад 3груван 3грунт 3груп 3грів 3гріт 3гріш 3г4ідро 3д4ан 3д4бав 3д4бал 3д4бан 3д4бат 3д4бає 3двиг 3двою 3двоє 3двій 3двір 3двічі 3драж 3дром 3друж 3друк 3дряп 3дріб 3дріма 3жвав 3жміть 3жріть 3з4бага 3з4баланс 3з4був 3з4бут 3зваж 3зван 3звед 3звел 3звест 3звись 3звич 3звищ 3зворуш 3звук 3звуч 3звіт 3з4год 3з4дат 3з4довж 3з4доров 3з4дійсн 3змін 3зйом 3зміш 3знав 3знай 3знак 3знал 3знан 3знат 3знаход 3знач 3знаю 3знає 3зниж 3знім 3зрозум 3зрюв 3зрів 3зріл 3зрін 3з4чеп 3й4ма 3й4менн 3й4мищ 3й4мовірн 3й4му. 3й4муть 3й4міть 3й4шов 3м4нож 3м4ріть 3м4щен 3п4сов 3п4сон 3п4сув 3р4вав 3р4вати 3р4віть 3с4кид 3с4кок 3с4коп 3с4кор 3с4короч 3с4коч 3с4кіль 3с4кіпл 3с4пад 3с4пект 3с4перм 3с4пин 3с4повід 3с4пожив 3с4постер 3с4пі 3с4піть 3с4піш 3с4табіл 3с4тав 3с4тад 3с4таз 3с4тайн 3с4тал 3с4тан 3с4тар 3с4тара 3с4тат 3с4тач 3с4тає 3с4теп 3с4тереж 3с4теріг 3с4тиг 3с4тиж 3с4тисл 3с4титу 3с4товб 3с4той 3с4торон 3с4торін 3с4тосо 3с4тосу 3с4тою 3с4тоян 3с4туп 3с4тяг 3с4тіб 3с4тій 3с4тіль 3с4тір 3с4фер 3с4хил 3с4хов 3с4хід 3т4кан 3х4то 3ш4код 3ш4кол 3ш4кідл 3ш4кіл 3ш4кір 3ш4таб 3ш4туч 3ґрунт 3а4вторит 3а4гент 3а4грес 3а4декват 3а4дитив 3а4зарт 3а4ктив 3а4ктуал 3а4курат 3а4куст 3а4кцепт 3а4кциз 3а4лергі 3а4матор 3а4наліз 3а4натом 3а4парат 3а4пеляц 3а4постол 3а4птеч 3а4ргумен 3а4ромат 3а4соці 3а4спект 3а4тлет 3а4халі 3е4колог 3е4коном 3е4легант 3е4лектр 3е4лемент 3е4моці 3е4мігр 3е4нерг 3е4стакад 3е4стет 3е4тап 3о4б’єдн 3о4б’єкт 3о4береж 3о4бира 3о4борон 3о4бід 3о4біц 3о4даль 3о4дяг 3о4збро 3о4крем 3о4перат 3о4плат 3о4птим 3о4пуст 3о4пуше 3о4пуще 3о4рдинац 3о4ренд 3о4соб 3о4сяжн 3о4холо 3о4хорон 3о4хоч 3о4чисн 3о4чищ 3у4ваг 3у4важ 3у4гав 3у4згод 3у4клад 3у4компл 3у4крупн 3у4люблен 3у4мит 3у4міл 3у4перед 3у4разлив 3у4рбан 3у4рочист 3у4ряд 3у4рядов 3у4спіш 3у4станов 3у4стпіш 3у4сувати 3у4твор 3у4тробн 3я4дерн 3я4зик 3я4кіс 3я4рус 3я4скрав 3є4д3н 3є4дин 3є4писк 3є4рей 3і4зотоп 3і4люстр 3і4мовір 3і4нтенс 3і4нформ 3і4ніціат 3і4снув 3ї4ждж 3ї4зд 3ї4ст 3ї4хав 3ї4хат .заї4к .заї4ц .заї4ч .наї4д ’ї4в ’ї4з ’ї4д ’ї4ж ’ї4л ’ї4м ’ї4с ’ї4х аві4а авої4д ае4тил альбі5он ахої4д ауді4о ай4с3берг бактері4о ба4с3енер ба4с3антра .бе5зе. бей4сбол бе5кон б’4єть бйор4нс бі4о3 бо4г3дан бран4д брі4дж3порт без5і4мен бо4є3гол бо4є3гот бо4є3зап бо4є3здат бо4є3комп бо4є3пост бо4є3прип бори4с5п 4в3антрац вер4х3н ви3й4д вина3й4д ви3й4т вина3й4т від7зна ві5д4ен ві5д4е4о ві5д4ом від5о4браж від5о4браз во4с5ко водо5с4ток водо5з4бір воль4т3метр воль4т3ампер 3в’4яз ге2ть3ман ге4о го4с4п5роз гі4д5ро5мет 4д7зем дер4ж5а4том дер4ж5а4дм дер4ж5бюдж дер4ж5вид дер4ж5дум дер4ж5замов дер4ж5ком дер4ж5нафт дер4ж5реєс дер4ж3без дер4ж3резерв дер4ж5стр дер4ж5служ двох4а5том джен4тль дисбаланс ди4с3гарм ди4с3квал ди4с3комф ди4с3конт ди4с3кред ди4с3крет ди4с3крец ди4с3крим ди4с3кусі ди4с3куту ди4с3лок ди4с3парит ди4с3перс ди4с3петч ди4с3пле ди4с3плей ди4с3пози ди4с3проп ди4с3пут ди4с3тил ди4с3триб ди4с3троф ди4с3функц ді3й4т ді3й4д д4ні3п4р .дої4в .дої4л .дої5ль дої4д дої4м дої4х дої4ж дої4ст до3з4вол до3з4віл дорого5в4каз еу4стр ео4сві енерго3з4береж енерго3з4беріг ек2с1к ек2с1п ек2с1т ек2с1ц єв4р3атом єпі4с5коп єпи4с5коп за4п3част заї4д заї4ж заї4з заї4л заї4м заї4х зе4кономити 3з’4ясо зна3й4д зна3й4т зо4ка зо4ке зо4ки зо4ку зо4кі игої4д ий4ти іе4тил і4л3е4тил ій4ти інфор4м3аген йо4сві каза4х3стан квої4д корої4д квар4т3плат киї4венер кон4трре кон4тр3арг жко4м5а4том кому4ненерг мі4н5е4ко мі4н5е4нер мо4к5рий 3м’4якш 3м’4ят на3б4лиз на3в4ряд на3в4ча на3з4в на4д7з4в наї4вс наї4вш наї4ж наї4з наї4л наї4м наї4с наї4х на4й3а на4й3е на4й3обереж на4й7о4бер на4й7о4гид на4й7о4гол на4й7о4гряд на4й7о4пук на4й7о4хай на4й3масл на4й3спри на4й3якіс на3в4чен на3в4чіть не3в4том не3д4бан на3д4бан не3з4вич не3з4важ нео4пал недої4 неї4ст на5п4лив ні4т5рат оної4д оо4пал ео4пал обі3д4ран обі3й4д обі3й4т об5у4мов онаї4д оо4сві оо4к оу4стр оа4том об4лдер4ж об4л3а4дмін переї4д переї4ж переї4з переї4л переї4с переї4х пере5п4лив пере3й4д пре4й4с пере3й4т перег4ній перед5о4бід пере3в4том пере4д5см перед5у4мов під5о4дин пів5о4с4тр пі5в4ень по3б4лизу по3в4тор поч4не поч4ни поч4ну поя4в по3в4чен по3в4чіть по3д4роб по3д4раз по3д4во по5ж4ніть по5з4бав .пої4 пої4д прої4 пої4зд по4с4т5радян по4с4т5кому по4с4т3декр по4с4т3контра по4с4т3менопауз по4с4тприват по4с4т3раді по4с4т5соці пос4т3кап пос4т3ком пос4т3нат пос4т3проц пос4т3соц пос4т3фікс при3й4т про3с4тирад про4ф3с полі4т5екон пор4т3н пор4т3рет пор4т3фел при3й4д при4нцип про4ект3н про3б4лем про4м3май пр4о5плат раді4о рай3в4но ро4з5д4во ро4з5мінний роз5у4чен роз5і4мен роз5вант роз5вин роз5вит ро4з5діл ро4з5гор ро4з5вер ро4з5чеп ро4з’5єдн з’4єдн руко5с4тиск ро5з4ум ро4з3гром ро4з3лив рмої4д сан4к4т3 сеї4д серцеї4д спе4ц3кур спе4ц3мон спе4цпр спе4ц3с спор4т3вир спор4т3зал спор4т3ком спор4т3клуб спор4т3май спор4т4с3ме сор4тн 3с4промож сь4квуг стат5упр тор4г3пред тран4с3 тур4к3мен цук3ро у4к4р укр3а4вт укр3а4гр укр3е4кс укр3і4н4банк убої4д чорно3б4рив цен4т4р3енерг ясої4д ви3у4ч за3у4ч на3у4ч недо3у4ч не3у4ч під3у4ч пед3у4чи пере3у4ч само3у4ч вия4в з’я4в зая4в ная4в уя4в во4євод во4єнач сво4єчас сво4єкорис сво4єрід хво4є3г4риз гелі4о ді4о еті4о мі4о і4он полі4о соці4о фізі4о хімі4о гоме4о ді4алог ді4оген дея4к оо4динок ао4пік ао4ха ео4ха зо6о ка5нал оі4зол міжу4соб мете4о абия4к нія4к вия4сн най3я4сн нея4сн поя4сн проя4сн роз’я4сн ро5з4ора. ро5з4о5рам ро5з4орах ро5з4ори ро5з4оро ро5з4ору ро5з4оря ро5з4орю ро5з4орі ро6з5о4ри. розо4ра розо4ре розо4реш розо4рн напоу4м неа4би ео4цін оо4цін доу4к доу4м ео4бур ео4голош ео4зор бальне4о не4оліт не4омальт не4оклас не4окомун не4оландш не4олог не4олібер не4онац не4офіт нею4н нея4к нея4рок но4к3а4ут пі5в4оні піво4с пале4о па4н3о4тець .пе4ом. д3у4сім п4о5бере ао4хот ое4ко ео4хот ео4щад ао4щад оо4чищ поя4с роз’я4р те4одоліт те4олог те4ософ оо4біг оу4сун оу4ком пів3о4вал а3у4дар о3у4дар з3у4дар в3у4дар контр3у4дар о3о4кисл и3о4кисл ень7о4кисл е3о4кисл х3о4кисл и3і4стор о3і4стор і3і4стор а3і4стор я3і4стор е3і4стор наді4стор най3і4стор пів3і4стор перед3і4стор пост3і4стор ар4т3афіш ар4т3взвод ар4т3десант ар4т3кафе ар4т3майс ар4т3медіа ар4т3мейс ар4т3мін ар4т3о4бстр ар4т3о4дин ар4т3о4збр ар4т3під ар4т3рин ар4т3у4стан ар4т3факт ар4т3хім ар4т3центр наді4стот найі4стот еі4стот оі4стот ау4т3екол оо4чист з3а4кт оа4кт еа4кт гіпер3а4кт найа4кт піва4кт ао4браз ео4браз оо4браз граф3о4браз най3о4браз супер3о4браз ар4т3мейст баге4р3мейст бале4т3мейст бран4д3мейст ва4ль4д3мейст ве4ль4т3мейст го4ф3мейст гро4с3мейст декре4т3мейст до4к3мейст капе4ль3мейст кварти4р3мейст конце4р4т3мейст кра4н3мейст полі4ц3мейст по4ш4т3мейст фо4р4с4т3мейст хо4р3мейст шапі4т3мейст шта4л3мейст єге4р3мейст иа4варі яа4варі оа4варі еа4варі беза4варі між3а4варі над3а4варі пост3а4варі напів3а4варі перед3а4варі супер3а4варі аа4дрес еа4дрес оа4дрес іа4дрес без3а4дрес ае4фект ее4фект ое4фект най3е4фект супер3е4фект ое4місі ие4місі яе4місі ее4місі безе4місі гіпер3е4місі еу4бог й3у4бог ий4ня зай4ня здій4ня най4ня обій4ня перей4ня підій4ня прий4м пій4м дій4ма вий4м най4ма зай4м д4о3й4м обой4м прой4м обій4м перей4м безу4гл безу4пин бло4к3пост .блі4ц3ана .блі4ц3криг .блі4ц3опит .блі4ц3торг .блі4ц3тур .блі4ц3і4спит о3а4наліз бак3а4наліз ц3а4наліз ген3а4наліз з3а4наліз м3а4наліз нт3а4наліз між3а4наліз полі3а4наліз ре3а4наліз оу4год ау4год еу4год пів3у4год роз3у4год гос4п3у4год ео4пис оо4пис ао4пис бо4р4т3мех бо4р4т3о4пер бо4р4т3про бо4р4т3рад бо4р4т3і4нж оа4каці оу4с оо4держ оа4на біблі4о .на3в4ч .ви3в4ч .до3в4ч .за3в4ч .по3в4ч .при3в4ч ана3в4ч ена3в4ч мона3в4ч жона3в4ч іона3в4ч ови3в4ч еви3в4ч едо3в4ч оза3в4ч по3в4ча .ом4рі е3м4рій .ви3м4р .віді3м4р .зав3м4р .за3м4р .зі3м4р .на3м4р .пере3м4р .по3м4р .при3м4р .роз3м4р .ум4ри .ум4рі .ум4ру .ум4ре во4станнє най3о4станн перед3о4станн ие4стет ое4стет ее4стет й3е4стет пан3е4стет пар3е4стет оо4ктан іо4ктан оо4плачув ео4плачув перед3о4пла виу4ди о3в4каз е3в4каз 8-7 --8 .а-8 .б-8 .в-8 .г-8 .ґ-8 .д-8 .е-8 .є-8 .ж-8 .з-8 .и-8 .і-8 .ї-8 .й-8 .к-8 .л-8 .м-8 .н-8 .о-8 .п-8 .р-8 .с-8 .т-8 .у-8 .ф-8 .х-8 .ц-8 .ч-8 .ш-8 .щ-8 .ь-8 .ю-8 .я-8 .’-8 -а8а8 8а8а- -а8б8 8а8б- -а8в8 8а8в- -а8г8 8а8г- -а8ґ8 8а8ґ- -а8д8 8а8д- -а8е8 8а8е- -а8є8 8а8є- -а8ж8 8а8ж- -а8з8 8а8з- -а8и8 8а8и- -а8і8 8а8і- -а8ї8 8а8ї- -а8й8 8а8й- -а8к8 8а8к- -а8л8 8а8л- -а8м8 8а8м- -а8н8 8а8н- -а8о8 8а8о- -а8п8 8а8п- -а8р8 8а8р- -а8с8 8а8с- -а8т8 8а8т- -а8у8 8а8у- -а8ф8 8а8ф- -а8х8 8а8х- -а8ц8 8а8ц- -а8ч8 8а8ч- -а8ш8 8а8ш- -а8щ8 8а8щ- -а8ь8 8а8ь- -а8ю8 8а8ю- -а8я8 8а8я- -а8’8 8а8’- -б8а8 8б8а- -б8б8 8б8б- -б8в8 8б8в- -б8г8 8б8г- -б8ґ8 8б8ґ- -б8д8 8б8д- -б8е8 8б8е- -б8є8 8б8є- -б8ж8 8б8ж- -б8з8 8б8з- -б8и8 8б8и- -б8і8 8б8і- -б8ї8 8б8ї- -б8й8 8б8й- -б8к8 8б8к- -б8л8 8б8л- -б8м8 8б8м- -б8н8 8б8н- -б8о8 8б8о- -б8п8 8б8п- -б8р8 8б8р- -б8с8 8б8с- -б8т8 8б8т- -б8у8 8б8у- -б8ф8 8б8ф- -б8х8 8б8х- -б8ц8 8б8ц- -б8ч8 8б8ч- -б8ш8 8б8ш- -б8щ8 8б8щ- -б8ь8 8б8ь- -б8ю8 8б8ю- -б8я8 8б8я- -б8’8 8б8’- -в8а8 8в8а- -в8б8 8в8б- -в8в8 8в8в- -в8г8 8в8г- -в8ґ8 8в8ґ- -в8д8 8в8д- -в8е8 8в8е- -в8є8 8в8є- -в8ж8 8в8ж- -в8з8 8в8з- -в8и8 8в8и- -в8і8 8в8і- -в8ї8 8в8ї- -в8й8 8в8й- -в8к8 8в8к- -в8л8 8в8л- -в8м8 8в8м- -в8н8 8в8н- -в8о8 8в8о- -в8п8 8в8п- -в8р8 8в8р- -в8с8 8в8с- -в8т8 8в8т- -в8у8 8в8у- -в8ф8 8в8ф- -в8х8 8в8х- -в8ц8 8в8ц- -в8ч8 8в8ч- -в8ш8 8в8ш- -в8щ8 8в8щ- -в8ь8 8в8ь- -в8ю8 8в8ю- -в8я8 8в8я- -в8’8 8в8’- -г8а8 8г8а- -г8б8 8г8б- -г8в8 8г8в- -г8г8 8г8г- -г8ґ8 8г8ґ- -г8д8 8г8д- -г8е8 8г8е- -г8є8 8г8є- -г8ж8 8г8ж- -г8з8 8г8з- -г8и8 8г8и- -г8і8 8г8і- -г8ї8 8г8ї- -г8й8 8г8й- -г8к8 8г8к- -г8л8 8г8л- -г8м8 8г8м- -г8н8 8г8н- -г8о8 8г8о- -г8п8 8г8п- -г8р8 8г8р- -г8с8 8г8с- -г8т8 8г8т- -г8у8 8г8у- -г8ф8 8г8ф- -г8х8 8г8х- -г8ц8 8г8ц- -г8ч8 8г8ч- -г8ш8 8г8ш- -г8щ8 8г8щ- -г8ь8 8г8ь- -г8ю8 8г8ю- -г8я8 8г8я- -г8’8 8г8’- -ґ8а8 8ґ8а- -ґ8б8 8ґ8б- -ґ8в8 8ґ8в- -ґ8г8 8ґ8г- -ґ8ґ8 8ґ8ґ- -ґ8д8 8ґ8д- -ґ8е8 8ґ8е- -ґ8є8 8ґ8є- -ґ8ж8 8ґ8ж- -ґ8з8 8ґ8з- -ґ8и8 8ґ8и- -ґ8і8 8ґ8і- -ґ8ї8 8ґ8ї- -ґ8й8 8ґ8й- -ґ8к8 8ґ8к- -ґ8л8 8ґ8л- -ґ8м8 8ґ8м- -ґ8н8 8ґ8н- -ґ8о8 8ґ8о- -ґ8п8 8ґ8п- -ґ8р8 8ґ8р- -ґ8с8 8ґ8с- -ґ8т8 8ґ8т- -ґ8у8 8ґ8у- -ґ8ф8 8ґ8ф- -ґ8х8 8ґ8х- -ґ8ц8 8ґ8ц- -ґ8ч8 8ґ8ч- -ґ8ш8 8ґ8ш- -ґ8щ8 8ґ8щ- -ґ8ь8 8ґ8ь- -ґ8ю8 8ґ8ю- -ґ8я8 8ґ8я- -ґ8’8 8ґ8’- -д8а8 8д8а- -д8б8 8д8б- -д8в8 8д8в- -д8г8 8д8г- -д8ґ8 8д8ґ- -д8д8 8д8д- -д8е8 8д8е- -д8є8 8д8є- -д8ж8 8д8ж- -д8з8 8д8з- -д8и8 8д8и- -д8і8 8д8і- -д8ї8 8д8ї- -д8й8 8д8й- -д8к8 8д8к- -д8л8 8д8л- -д8м8 8д8м- -д8н8 8д8н- -д8о8 8д8о- -д8п8 8д8п- -д8р8 8д8р- -д8с8 8д8с- -д8т8 8д8т- -д8у8 8д8у- -д8ф8 8д8ф- -д8х8 8д8х- -д8ц8 8д8ц- -д8ч8 8д8ч- -д8ш8 8д8ш- -д8щ8 8д8щ- -д8ь8 8д8ь- -д8ю8 8д8ю- -д8я8 8д8я- -д8’8 8д8’- -е8а8 8е8а- -е8б8 8е8б- -е8в8 8е8в- -е8г8 8е8г- -е8ґ8 8е8ґ- -е8д8 8е8д- -е8е8 8е8е- -е8є8 8е8є- -е8ж8 8е8ж- -е8з8 8е8з- -е8и8 8е8и- -е8і8 8е8і- -е8ї8 8е8ї- -е8й8 8е8й- -е8к8 8е8к- -е8л8 8е8л- -е8м8 8е8м- -е8н8 8е8н- -е8о8 8е8о- -е8п8 8е8п- -е8р8 8е8р- -е8с8 8е8с- -е8т8 8е8т- -е8у8 8е8у- -е8ф8 8е8ф- -е8х8 8е8х- -е8ц8 8е8ц- -е8ч8 8е8ч- -е8ш8 8е8ш- -е8щ8 8е8щ- -е8ь8 8е8ь- -е8ю8 8е8ю- -е8я8 8е8я- -е8’8 8е8’- -є8а8 8є8а- -є8б8 8є8б- -є8в8 8є8в- -є8г8 8є8г- -є8ґ8 8є8ґ- -є8д8 8є8д- -є8е8 8є8е- -є8є8 8є8є- -є8ж8 8є8ж- -є8з8 8є8з- -є8и8 8є8и- -є8і8 8є8і- -є8ї8 8є8ї- -є8й8 8є8й- -є8к8 8є8к- -є8л8 8є8л- -є8м8 8є8м- -є8н8 8є8н- -є8о8 8є8о- -є8п8 8є8п- -є8р8 8є8р- -є8с8 8є8с- -є8т8 8є8т- -є8у8 8є8у- -є8ф8 8є8ф- -є8х8 8є8х- -є8ц8 8є8ц- -є8ч8 8є8ч- -є8ш8 8є8ш- -є8щ8 8є8щ- -є8ь8 8є8ь- -є8ю8 8є8ю- -є8я8 8є8я- -є8’8 8є8’- -ж8а8 8ж8а- -ж8б8 8ж8б- -ж8в8 8ж8в- -ж8г8 8ж8г- -ж8ґ8 8ж8ґ- -ж8д8 8ж8д- -ж8е8 8ж8е- -ж8є8 8ж8є- -ж8ж8 8ж8ж- -ж8з8 8ж8з- -ж8и8 8ж8и- -ж8і8 8ж8і- -ж8ї8 8ж8ї- -ж8й8 8ж8й- -ж8к8 8ж8к- -ж8л8 8ж8л- -ж8м8 8ж8м- -ж8н8 8ж8н- -ж8о8 8ж8о- -ж8п8 8ж8п- -ж8р8 8ж8р- -ж8с8 8ж8с- -ж8т8 8ж8т- -ж8у8 8ж8у- -ж8ф8 8ж8ф- -ж8х8 8ж8х- -ж8ц8 8ж8ц- -ж8ч8 8ж8ч- -ж8ш8 8ж8ш- -ж8щ8 8ж8щ- -ж8ь8 8ж8ь- -ж8ю8 8ж8ю- -ж8я8 8ж8я- -ж8’8 8ж8’- -з8а8 8з8а- -з8б8 8з8б- -з8в8 8з8в- -з8г8 8з8г- -з8ґ8 8з8ґ- -з8д8 8з8д- -з8е8 8з8е- -з8є8 8з8є- -з8ж8 8з8ж- -з8з8 8з8з- -з8и8 8з8и- -з8і8 8з8і- -з8ї8 8з8ї- -з8й8 8з8й- -з8к8 8з8к- -з8л8 8з8л- -з8м8 8з8м- -з8н8 8з8н- -з8о8 8з8о- -з8п8 8з8п- -з8р8 8з8р- -з8с8 8з8с- -з8т8 8з8т- -з8у8 8з8у- -з8ф8 8з8ф- -з8х8 8з8х- -з8ц8 8з8ц- -з8ч8 8з8ч- -з8ш8 8з8ш- -з8щ8 8з8щ- -з8ь8 8з8ь- -з8ю8 8з8ю- -з8я8 8з8я- -з8’8 8з8’- -и8а8 8и8а- -и8б8 8и8б- -и8в8 8и8в- -и8г8 8и8г- -и8ґ8 8и8ґ- -и8д8 8и8д- -и8е8 8и8е- -и8є8 8и8є- -и8ж8 8и8ж- -и8з8 8и8з- -и8и8 8и8и- -и8і8 8и8і- -и8ї8 8и8ї- -и8й8 8и8й- -и8к8 8и8к- -и8л8 8и8л- -и8м8 8и8м- -и8н8 8и8н- -и8о8 8и8о- -и8п8 8и8п- -и8р8 8и8р- -и8с8 8и8с- -и8т8 8и8т- -и8у8 8и8у- -и8ф8 8и8ф- -и8х8 8и8х- -и8ц8 8и8ц- -и8ч8 8и8ч- -и8ш8 8и8ш- -и8щ8 8и8щ- -и8ь8 8и8ь- -и8ю8 8и8ю- -и8я8 8и8я- -и8’8 8и8’- -і8а8 8і8а- -і8б8 8і8б- -і8в8 8і8в- -і8г8 8і8г- -і8ґ8 8і8ґ- -і8д8 8і8д- -і8е8 8і8е- -і8є8 8і8є- -і8ж8 8і8ж- -і8з8 8і8з- -і8и8 8і8и- -і8і8 8і8і- -і8ї8 8і8ї- -і8й8 8і8й- -і8к8 8і8к- -і8л8 8і8л- -і8м8 8і8м- -і8н8 8і8н- -і8о8 8і8о- -і8п8 8і8п- -і8р8 8і8р- -і8с8 8і8с- -і8т8 8і8т- -і8у8 8і8у- -і8ф8 8і8ф- -і8х8 8і8х- -і8ц8 8і8ц- -і8ч8 8і8ч- -і8ш8 8і8ш- -і8щ8 8і8щ- -і8ь8 8і8ь- -і8ю8 8і8ю- -і8я8 8і8я- -і8’8 8і8’- -ї8а8 8ї8а- -ї8б8 8ї8б- -ї8в8 8ї8в- -ї8г8 8ї8г- -ї8ґ8 8ї8ґ- -ї8д8 8ї8д- -ї8е8 8ї8е- -ї8є8 8ї8є- -ї8ж8 8ї8ж- -ї8з8 8ї8з- -ї8и8 8ї8и- -ї8і8 8ї8і- -ї8ї8 8ї8ї- -ї8й8 8ї8й- -ї8к8 8ї8к- -ї8л8 8ї8л- -ї8м8 8ї8м- -ї8н8 8ї8н- -ї8о8 8ї8о- -ї8п8 8ї8п- -ї8р8 8ї8р- -ї8с8 8ї8с- -ї8т8 8ї8т- -ї8у8 8ї8у- -ї8ф8 8ї8ф- -ї8х8 8ї8х- -ї8ц8 8ї8ц- -ї8ч8 8ї8ч- -ї8ш8 8ї8ш- -ї8щ8 8ї8щ- -ї8ь8 8ї8ь- -ї8ю8 8ї8ю- -ї8я8 8ї8я- -ї8’8 8ї8’- -й8а8 8й8а- -й8б8 8й8б- -й8в8 8й8в- -й8г8 8й8г- -й8ґ8 8й8ґ- -й8д8 8й8д- -й8е8 8й8е- -й8є8 8й8є- -й8ж8 8й8ж- -й8з8 8й8з- -й8и8 8й8и- -й8і8 8й8і- -й8ї8 8й8ї- -й8й8 8й8й- -й8к8 8й8к- -й8л8 8й8л- -й8м8 8й8м- -й8н8 8й8н- -й8о8 8й8о- -й8п8 8й8п- -й8р8 8й8р- -й8с8 8й8с- -й8т8 8й8т- -й8у8 8й8у- -й8ф8 8й8ф- -й8х8 8й8х- -й8ц8 8й8ц- -й8ч8 8й8ч- -й8ш8 8й8ш- -й8щ8 8й8щ- -й8ь8 8й8ь- -й8ю8 8й8ю- -й8я8 8й8я- -й8’8 8й8’- -к8а8 8к8а- -к8б8 8к8б- -к8в8 8к8в- -к8г8 8к8г- -к8ґ8 8к8ґ- -к8д8 8к8д- -к8е8 8к8е- -к8є8 8к8є- -к8ж8 8к8ж- -к8з8 8к8з- -к8и8 8к8и- -к8і8 8к8і- -к8ї8 8к8ї- -к8й8 8к8й- -к8к8 8к8к- -к8л8 8к8л- -к8м8 8к8м- -к8н8 8к8н- -к8о8 8к8о- -к8п8 8к8п- -к8р8 8к8р- -к8с8 8к8с- -к8т8 8к8т- -к8у8 8к8у- -к8ф8 8к8ф- -к8х8 8к8х- -к8ц8 8к8ц- -к8ч8 8к8ч- -к8ш8 8к8ш- -к8щ8 8к8щ- -к8ь8 8к8ь- -к8ю8 8к8ю- -к8я8 8к8я- -к8’8 8к8’- -л8а8 8л8а- -л8б8 8л8б- -л8в8 8л8в- -л8г8 8л8г- -л8ґ8 8л8ґ- -л8д8 8л8д- -л8е8 8л8е- -л8є8 8л8є- -л8ж8 8л8ж- -л8з8 8л8з- -л8и8 8л8и- -л8і8 8л8і- -л8ї8 8л8ї- -л8й8 8л8й- -л8к8 8л8к- -л8л8 8л8л- -л8м8 8л8м- -л8н8 8л8н- -л8о8 8л8о- -л8п8 8л8п- -л8р8 8л8р- -л8с8 8л8с- -л8т8 8л8т- -л8у8 8л8у- -л8ф8 8л8ф- -л8х8 8л8х- -л8ц8 8л8ц- -л8ч8 8л8ч- -л8ш8 8л8ш- -л8щ8 8л8щ- -л8ь8 8л8ь- -л8ю8 8л8ю- -л8я8 8л8я- -л8’8 8л8’- -м8а8 8м8а- -м8б8 8м8б- -м8в8 8м8в- -м8г8 8м8г- -м8ґ8 8м8ґ- -м8д8 8м8д- -м8е8 8м8е- -м8є8 8м8є- -м8ж8 8м8ж- -м8з8 8м8з- -м8и8 8м8и- -м8і8 8м8і- -м8ї8 8м8ї- -м8й8 8м8й- -м8к8 8м8к- -м8л8 8м8л- -м8м8 8м8м- -м8н8 8м8н- -м8о8 8м8о- -м8п8 8м8п- -м8р8 8м8р- -м8с8 8м8с- -м8т8 8м8т- -м8у8 8м8у- -м8ф8 8м8ф- -м8х8 8м8х- -м8ц8 8м8ц- -м8ч8 8м8ч- -м8ш8 8м8ш- -м8щ8 8м8щ- -м8ь8 8м8ь- -м8ю8 8м8ю- -м8я8 8м8я- -м8’8 8м8’- -н8а8 8н8а- -н8б8 8н8б- -н8в8 8н8в- -н8г8 8н8г- -н8ґ8 8н8ґ- -н8д8 8н8д- -н8е8 8н8е- -н8є8 8н8є- -н8ж8 8н8ж- -н8з8 8н8з- -н8и8 8н8и- -н8і8 8н8і- -н8ї8 8н8ї- -н8й8 8н8й- -н8к8 8н8к- -н8л8 8н8л- -н8м8 8н8м- -н8н8 8н8н- -н8о8 8н8о- -н8п8 8н8п- -н8р8 8н8р- -н8с8 8н8с- -н8т8 8н8т- -н8у8 8н8у- -н8ф8 8н8ф- -н8х8 8н8х- -н8ц8 8н8ц- -н8ч8 8н8ч- -н8ш8 8н8ш- -н8щ8 8н8щ- -н8ь8 8н8ь- -н8ю8 8н8ю- -н8я8 8н8я- -н8’8 8н8’- -о8а8 8о8а- -о8б8 8о8б- -о8в8 8о8в- -о8г8 8о8г- -о8ґ8 8о8ґ- -о8д8 8о8д- -о8е8 8о8е- -о8є8 8о8є- -о8ж8 8о8ж- -о8з8 8о8з- -о8и8 8о8и- -о8і8 8о8і- -о8ї8 8о8ї- -о8й8 8о8й- -о8к8 8о8к- -о8л8 8о8л- -о8м8 8о8м- -о8н8 8о8н- -о8о8 8о8о- -о8п8 8о8п- -о8р8 8о8р- -о8с8 8о8с- -о8т8 8о8т- -о8у8 8о8у- -о8ф8 8о8ф- -о8х8 8о8х- -о8ц8 8о8ц- -о8ч8 8о8ч- -о8ш8 8о8ш- -о8щ8 8о8щ- -о8ь8 8о8ь- -о8ю8 8о8ю- -о8я8 8о8я- -о8’8 8о8’- -п8а8 8п8а- -п8б8 8п8б- -п8в8 8п8в- -п8г8 8п8г- -п8ґ8 8п8ґ- -п8д8 8п8д- -п8е8 8п8е- -п8є8 8п8є- -п8ж8 8п8ж- -п8з8 8п8з- -п8и8 8п8и- -п8і8 8п8і- -п8ї8 8п8ї- -п8й8 8п8й- -п8к8 8п8к- -п8л8 8п8л- -п8м8 8п8м- -п8н8 8п8н- -п8о8 8п8о- -п8п8 8п8п- -п8р8 8п8р- -п8с8 8п8с- -п8т8 8п8т- -п8у8 8п8у- -п8ф8 8п8ф- -п8х8 8п8х- -п8ц8 8п8ц- -п8ч8 8п8ч- -п8ш8 8п8ш- -п8щ8 8п8щ- -п8ь8 8п8ь- -п8ю8 8п8ю- -п8я8 8п8я- -п8’8 8п8’- -р8а8 8р8а- -р8б8 8р8б- -р8в8 8р8в- -р8г8 8р8г- -р8ґ8 8р8ґ- -р8д8 8р8д- -р8е8 8р8е- -р8є8 8р8є- -р8ж8 8р8ж- -р8з8 8р8з- -р8и8 8р8и- -р8і8 8р8і- -р8ї8 8р8ї- -р8й8 8р8й- -р8к8 8р8к- -р8л8 8р8л- -р8м8 8р8м- -р8н8 8р8н- -р8о8 8р8о- -р8п8 8р8п- -р8р8 8р8р- -р8с8 8р8с- -р8т8 8р8т- -р8у8 8р8у- -р8ф8 8р8ф- -р8х8 8р8х- -р8ц8 8р8ц- -р8ч8 8р8ч- -р8ш8 8р8ш- -р8щ8 8р8щ- -р8ь8 8р8ь- -р8ю8 8р8ю- -р8я8 8р8я- -р8’8 8р8’- -с8а8 8с8а- -с8б8 8с8б- -с8в8 8с8в- -с8г8 8с8г- -с8ґ8 8с8ґ- -с8д8 8с8д- -с8е8 8с8е- -с8є8 8с8є- -с8ж8 8с8ж- -с8з8 8с8з- -с8и8 8с8и- -с8і8 8с8і- -с8ї8 8с8ї- -с8й8 8с8й- -с8к8 8с8к- -с8л8 8с8л- -с8м8 8с8м- -с8н8 8с8н- -с8о8 8с8о- -с8п8 8с8п- -с8р8 8с8р- -с8с8 8с8с- -с8т8 8с8т- -с8у8 8с8у- -с8ф8 8с8ф- -с8х8 8с8х- -с8ц8 8с8ц- -с8ч8 8с8ч- -с8ш8 8с8ш- -с8щ8 8с8щ- -с8ь8 8с8ь- -с8ю8 8с8ю- -с8я8 8с8я- -с8’8 8с8’- -т8а8 8т8а- -т8б8 8т8б- -т8в8 8т8в- -т8г8 8т8г- -т8ґ8 8т8ґ- -т8д8 8т8д- -т8е8 8т8е- -т8є8 8т8є- -т8ж8 8т8ж- -т8з8 8т8з- -т8и8 8т8и- -т8і8 8т8і- -т8ї8 8т8ї- -т8й8 8т8й- -т8к8 8т8к- -т8л8 8т8л- -т8м8 8т8м- -т8н8 8т8н- -т8о8 8т8о- -т8п8 8т8п- -т8р8 8т8р- -т8с8 8т8с- -т8т8 8т8т- -т8у8 8т8у- -т8ф8 8т8ф- -т8х8 8т8х- -т8ц8 8т8ц- -т8ч8 8т8ч- -т8ш8 8т8ш- -т8щ8 8т8щ- -т8ь8 8т8ь- -т8ю8 8т8ю- -т8я8 8т8я- -т8’8 8т8’- -у8а8 8у8а- -у8б8 8у8б- -у8в8 8у8в- -у8г8 8у8г- -у8ґ8 8у8ґ- -у8д8 8у8д- -у8е8 8у8е- -у8є8 8у8є- -у8ж8 8у8ж- -у8з8 8у8з- -у8и8 8у8и- -у8і8 8у8і- -у8ї8 8у8ї- -у8й8 8у8й- -у8к8 8у8к- -у8л8 8у8л- -у8м8 8у8м- -у8н8 8у8н- -у8о8 8у8о- -у8п8 8у8п- -у8р8 8у8р- -у8с8 8у8с- -у8т8 8у8т- -у8у8 8у8у- -у8ф8 8у8ф- -у8х8 8у8х- -у8ц8 8у8ц- -у8ч8 8у8ч- -у8ш8 8у8ш- -у8щ8 8у8щ- -у8ь8 8у8ь- -у8ю8 8у8ю- -у8я8 8у8я- -у8’8 8у8’- -ф8а8 8ф8а- -ф8б8 8ф8б- -ф8в8 8ф8в- -ф8г8 8ф8г- -ф8ґ8 8ф8ґ- -ф8д8 8ф8д- -ф8е8 8ф8е- -ф8є8 8ф8є- -ф8ж8 8ф8ж- -ф8з8 8ф8з- -ф8и8 8ф8и- -ф8і8 8ф8і- -ф8ї8 8ф8ї- -ф8й8 8ф8й- -ф8к8 8ф8к- -ф8л8 8ф8л- -ф8м8 8ф8м- -ф8н8 8ф8н- -ф8о8 8ф8о- -ф8п8 8ф8п- -ф8р8 8ф8р- -ф8с8 8ф8с- -ф8т8 8ф8т- -ф8у8 8ф8у- -ф8ф8 8ф8ф- -ф8х8 8ф8х- -ф8ц8 8ф8ц- -ф8ч8 8ф8ч- -ф8ш8 8ф8ш- -ф8щ8 8ф8щ- -ф8ь8 8ф8ь- -ф8ю8 8ф8ю- -ф8я8 8ф8я- -ф8’8 8ф8’- -х8а8 8х8а- -х8б8 8х8б- -х8в8 8х8в- -х8г8 8х8г- -х8ґ8 8х8ґ- -х8д8 8х8д- -х8е8 8х8е- -х8є8 8х8є- -х8ж8 8х8ж- -х8з8 8х8з- -х8и8 8х8и- -х8і8 8х8і- -х8ї8 8х8ї- -х8й8 8х8й- -х8к8 8х8к- -х8л8 8х8л- -х8м8 8х8м- -х8н8 8х8н- -х8о8 8х8о- -х8п8 8х8п- -х8р8 8х8р- -х8с8 8х8с- -х8т8 8х8т- -х8у8 8х8у- -х8ф8 8х8ф- -х8х8 8х8х- -х8ц8 8х8ц- -х8ч8 8х8ч- -х8ш8 8х8ш- -х8щ8 8х8щ- -х8ь8 8х8ь- -х8ю8 8х8ю- -х8я8 8х8я- -х8’8 8х8’- -ц8а8 8ц8а- -ц8б8 8ц8б- -ц8в8 8ц8в- -ц8г8 8ц8г- -ц8ґ8 8ц8ґ- -ц8д8 8ц8д- -ц8е8 8ц8е- -ц8є8 8ц8є- -ц8ж8 8ц8ж- -ц8з8 8ц8з- -ц8и8 8ц8и- -ц8і8 8ц8і- -ц8ї8 8ц8ї- -ц8й8 8ц8й- -ц8к8 8ц8к- -ц8л8 8ц8л- -ц8м8 8ц8м- -ц8н8 8ц8н- -ц8о8 8ц8о- -ц8п8 8ц8п- -ц8р8 8ц8р- -ц8с8 8ц8с- -ц8т8 8ц8т- -ц8у8 8ц8у- -ц8ф8 8ц8ф- -ц8х8 8ц8х- -ц8ц8 8ц8ц- -ц8ч8 8ц8ч- -ц8ш8 8ц8ш- -ц8щ8 8ц8щ- -ц8ь8 8ц8ь- -ц8ю8 8ц8ю- -ц8я8 8ц8я- -ц8’8 8ц8’- -ч8а8 8ч8а- -ч8б8 8ч8б- -ч8в8 8ч8в- -ч8г8 8ч8г- -ч8ґ8 8ч8ґ- -ч8д8 8ч8д- -ч8е8 8ч8е- -ч8є8 8ч8є- -ч8ж8 8ч8ж- -ч8з8 8ч8з- -ч8и8 8ч8и- -ч8і8 8ч8і- -ч8ї8 8ч8ї- -ч8й8 8ч8й- -ч8к8 8ч8к- -ч8л8 8ч8л- -ч8м8 8ч8м- -ч8н8 8ч8н- -ч8о8 8ч8о- -ч8п8 8ч8п- -ч8р8 8ч8р- -ч8с8 8ч8с- -ч8т8 8ч8т- -ч8у8 8ч8у- -ч8ф8 8ч8ф- -ч8х8 8ч8х- -ч8ц8 8ч8ц- -ч8ч8 8ч8ч- -ч8ш8 8ч8ш- -ч8щ8 8ч8щ- -ч8ь8 8ч8ь- -ч8ю8 8ч8ю- -ч8я8 8ч8я- -ч8’8 8ч8’- -ш8а8 8ш8а- -ш8б8 8ш8б- -ш8в8 8ш8в- -ш8г8 8ш8г- -ш8ґ8 8ш8ґ- -ш8д8 8ш8д- -ш8е8 8ш8е- -ш8є8 8ш8є- -ш8ж8 8ш8ж- -ш8з8 8ш8з- -ш8и8 8ш8и- -ш8і8 8ш8і- -ш8ї8 8ш8ї- -ш8й8 8ш8й- -ш8к8 8ш8к- -ш8л8 8ш8л- -ш8м8 8ш8м- -ш8н8 8ш8н- -ш8о8 8ш8о- -ш8п8 8ш8п- -ш8р8 8ш8р- -ш8с8 8ш8с- -ш8т8 8ш8т- -ш8у8 8ш8у- -ш8ф8 8ш8ф- -ш8х8 8ш8х- -ш8ц8 8ш8ц- -ш8ч8 8ш8ч- -ш8ш8 8ш8ш- -ш8щ8 8ш8щ- -ш8ь8 8ш8ь- -ш8ю8 8ш8ю- -ш8я8 8ш8я- -ш8’8 8ш8’- -щ8а8 8щ8а- -щ8б8 8щ8б- -щ8в8 8щ8в- -щ8г8 8щ8г- -щ8ґ8 8щ8ґ- -щ8д8 8щ8д- -щ8е8 8щ8е- -щ8є8 8щ8є- -щ8ж8 8щ8ж- -щ8з8 8щ8з- -щ8и8 8щ8и- -щ8і8 8щ8і- -щ8ї8 8щ8ї- -щ8й8 8щ8й- -щ8к8 8щ8к- -щ8л8 8щ8л- -щ8м8 8щ8м- -щ8н8 8щ8н- -щ8о8 8щ8о- -щ8п8 8щ8п- -щ8р8 8щ8р- -щ8с8 8щ8с- -щ8т8 8щ8т- -щ8у8 8щ8у- -щ8ф8 8щ8ф- -щ8х8 8щ8х- -щ8ц8 8щ8ц- -щ8ч8 8щ8ч- -щ8ш8 8щ8ш- -щ8щ8 8щ8щ- -щ8ь8 8щ8ь- -щ8ю8 8щ8ю- -щ8я8 8щ8я- -щ8’8 8щ8’- -ь8а8 8ь8а- -ь8б8 8ь8б- -ь8в8 8ь8в- -ь8г8 8ь8г- -ь8ґ8 8ь8ґ- -ь8д8 8ь8д- -ь8е8 8ь8е- -ь8є8 8ь8є- -ь8ж8 8ь8ж- -ь8з8 8ь8з- -ь8и8 8ь8и- -ь8і8 8ь8і- -ь8ї8 8ь8ї- -ь8й8 8ь8й- -ь8к8 8ь8к- -ь8л8 8ь8л- -ь8м8 8ь8м- -ь8н8 8ь8н- -ь8о8 8ь8о- -ь8п8 8ь8п- -ь8р8 8ь8р- -ь8с8 8ь8с- -ь8т8 8ь8т- -ь8у8 8ь8у- -ь8ф8 8ь8ф- -ь8х8 8ь8х- -ь8ц8 8ь8ц- -ь8ч8 8ь8ч- -ь8ш8 8ь8ш- -ь8щ8 8ь8щ- -ь8ь8 8ь8ь- -ь8ю8 8ь8ю- -ь8я8 8ь8я- -ь8’8 8ь8’- -ю8а8 8ю8а- -ю8б8 8ю8б- -ю8в8 8ю8в- -ю8г8 8ю8г- -ю8ґ8 8ю8ґ- -ю8д8 8ю8д- -ю8е8 8ю8е- -ю8є8 8ю8є- -ю8ж8 8ю8ж- -ю8з8 8ю8з- -ю8и8 8ю8и- -ю8і8 8ю8і- -ю8ї8 8ю8ї- -ю8й8 8ю8й- -ю8к8 8ю8к- -ю8л8 8ю8л- -ю8м8 8ю8м- -ю8н8 8ю8н- -ю8о8 8ю8о- -ю8п8 8ю8п- -ю8р8 8ю8р- -ю8с8 8ю8с- -ю8т8 8ю8т- -ю8у8 8ю8у- -ю8ф8 8ю8ф- -ю8х8 8ю8х- -ю8ц8 8ю8ц- -ю8ч8 8ю8ч- -ю8ш8 8ю8ш- -ю8щ8 8ю8щ- -ю8ь8 8ю8ь- -ю8ю8 8ю8ю- -ю8я8 8ю8я- -ю8’8 8ю8’- -я8а8 8я8а- -я8б8 8я8б- -я8в8 8я8в- -я8г8 8я8г- -я8ґ8 8я8ґ- -я8д8 8я8д- -я8е8 8я8е- -я8є8 8я8є- -я8ж8 8я8ж- -я8з8 8я8з- -я8и8 8я8и- -я8і8 8я8і- -я8ї8 8я8ї- -я8й8 8я8й- -я8к8 8я8к- -я8л8 8я8л- -я8м8 8я8м- -я8н8 8я8н- -я8о8 8я8о- -я8п8 8я8п- -я8р8 8я8р- -я8с8 8я8с- -я8т8 8я8т- -я8у8 8я8у- -я8ф8 8я8ф- -я8х8 8я8х- -я8ц8 8я8ц- -я8ч8 8я8ч- -я8ш8 8я8ш- -я8щ8 8я8щ- -я8ь8 8я8ь- -я8ю8 8я8ю- -я8я8 8я8я- -я8’8 8я8’- -’8а8 8’8а- -’8б8 8’8б- -’8в8 8’8в- -’8г8 8’8г- -’8ґ8 8’8ґ- -’8д8 8’8д- -’8е8 8’8е- -’8є8 8’8є- -’8ж8 8’8ж- -’8з8 8’8з- -’8и8 8’8и- -’8і8 8’8і- -’8ї8 8’8ї- -’8й8 8’8й- -’8к8 8’8к- -’8л8 8’8л- -’8м8 8’8м- -’8н8 8’8н- -’8о8 8’8о- -’8п8 8’8п- -’8р8 8’8р- -’8с8 8’8с- -’8т8 8’8т- -’8у8 8’8у- -’8ф8 8’8ф- -’8х8 8’8х- -’8ц8 8’8ц- -’8ч8 8’8ч- -’8ш8 8’8ш- -’8щ8 8’8щ- -’8ь8 8’8ь- -’8ю8 8’8ю- -’8я8 8’8я- -’8’8 8’8’-",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=4338,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-uk.pat b/Master/texmf-dist/tex/context/patterns/lang-uk.pat
index 2a876540e99..eed486f60b6 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-uk.pat
+++ b/Master/texmf-dist/tex/context/patterns/lang-uk.pat
@@ -2,7 +2,7 @@
% for comment and copyright, see e:/tmp/patterns/lang-uk.rme
-% used: а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ь ю я є і ї ґ
+% used: - а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ь ю я є і ї ґ ’
\patterns{
2а1
@@ -123,6 +123,7 @@
2в1ш
2в1щ
2в1й
+2в'3
2г1к
2г1п
2г1с
@@ -201,6 +202,7 @@
2м1ч
2м1ш
2м1щ
+2м'3
2н1б
2н1в
2н1г
@@ -220,6 +222,7 @@
2н1ч
2н1ш
2н1щ
+2н'3
2п1б
2п1д
2п1з
@@ -244,6 +247,7 @@
2р1ш
2р1щ
2р1й
+2р'3
2с1б
2с1г
2с1д
@@ -413,10 +417,24 @@
ї2й
3й6о
ь6о
+6'
+.б'8
+.в'8
+.д'8
+.з'8
+.м'8
+.н'8
+.п'8
+.р'8
+.т'8
+.ф'8
+.ш'8
.бд6
.бр6
.вб6
+.вб6'6
+.вв6'6
.вг6
.вд6
.вж6
@@ -425,7 +443,9 @@
.вк6
.вл6
.вм6
+.вм6'6
.вп6
+.вп6'6
.вп6х6
.вс6
.вс6т6
@@ -436,10 +456,12 @@
.дл6
.дс6
.зб6
+.зв6'6
.зг6
.зд6
.зд6з6
.зл6
+.зм6'6
.зс6
.зс6к6
.зс6т6
@@ -467,6 +489,7 @@
.ск6л6
.сл6
.сп6
+.сп6'6
.сп6л6
.сп6х6
.ст6
@@ -826,6 +849,7 @@
6шт.
6ш6тв.
6щ6сь.
+.бе4з'3
.бе4з3
.безу4
.бе5з4о3д
@@ -841,11 +865,13 @@
.ві5д4ер
.ві5д4і
.ві4д3
+.від'3
.мі4ж3
безві4д3
ові4д3
ді4єві4д3
за4вві4д3
+неві4д'3
неві4д3
про4ф3ві4д3
спе4ц3ві4д3
@@ -865,6 +891,7 @@
.пере4д3усі
.пере4д3фр
.пере4д3ч
+.пере4д'3
.пере3
.пона4д3
.пона5д4і
@@ -877,6 +904,7 @@
3п4рі
.пі5д4о
.пі5д4і
+.під'3
.пі4д3
.пі5д4е
.пі5д4и
@@ -888,18 +916,61 @@
.ро5з4е
ро5з4йом
.ро5з4а
+.ро4з'3
.ро4з3
+.чере4з'3
.чере4з3
оо4б
+ооб'3
ооб3м
ооб3ро
+об'3
+од'3
+на4д'3
за5о4р
до5о4р
по5о4р
пере5о4р
пі6д5о4р
бе4з5і4дей
+до3в'4є
+за3в'4є
+зі3в'4є
+обі3в'4є
+по3в'4є
+уі3в'4є
+з3в'4я
+по3в'4я
+від3в'4я
+за3в'4я
+зі3в'4я
за3ю4ш
+на3в'4я
+непо3в'4я
+об3в'4я
+при3в'4я
+під3в'4я
+у3в'4я
+з3м'4я
+зі3м'4я
+у3м'4я
+в3м'4я
+но3м'4я
+за3м'4я
+на3м'4я
+об3м'4я
+пере3м'4я
+по3м'4я
+при3м'4я
+піді3м'4я
+су3м'4я
+до3в'4ю
+за3в'4ю
+зі3в'4ю
+на3в'4ю
+по3в'4ю
+уі3в'4ю
+інтер3в'4ю
за3я4ло
коу4роч
зу4роч
@@ -921,6 +992,7 @@
3з4б4рой
3з4б4рою
3з4б4роє
+3з4в4'яз
3й4ш4л
3м4к4не
3м4к4ну
@@ -1207,6 +1279,8 @@
3е4стакад
3е4стет
3е4тап
+3о4б'єдн
+3о4б'єкт
3о4береж
3о4бира
3о4борон
@@ -1278,6 +1352,14 @@
.заї4ц
.заї4ч
.наї4д
+'ї4в
+'ї4з
+'ї4д
+'ї4ж
+'ї4л
+'ї4м
+'ї4с
+'ї4х
аві4а
авої4д
ае4тил
@@ -1291,6 +1373,7 @@
.бе5зе.
бей4сбол
бе5кон
+б'4єть
бйор4нс
бі4о3
бо4г3дан
@@ -1322,6 +1405,7 @@
водо5з4бір
воль4т3метр
воль4т3ампер
+3в'4яз
ге2ть3ман
ге4о
го4с4п5роз
@@ -1399,6 +1483,7 @@
заї4м
заї4х
зе4кономити
+3з'4ясо
зна3й4д
зна3й4т
зо4ка
@@ -1425,6 +1510,8 @@
мі4н5е4ко
мі4н5е4нер
мо4к5рий
+3м'4якш
+3м'4ят
на3б4лиз
на3в4ряд
на3в4ча
@@ -1551,6 +1638,8 @@
ро4з5гор
ро4з5вер
ро4з5чеп
+ро4з'5єдн
+з'4єдн
руко5с4тиск
ро5з4ум
ро4з3гром
@@ -1596,6 +1685,7 @@
пере3у4ч
само3у4ч
вия4в
+з'я4в
зая4в
ная4в
уя4в
@@ -1634,6 +1724,7 @@
нея4сн
поя4сн
проя4сн
+роз'я4сн
ро5з4ора.
ро5з4о5рам
ро5з4орах
@@ -1685,6 +1776,7 @@
ао4щад
оо4чищ
поя4с
+роз'я4р
те4одоліт
те4олог
те4ософ
@@ -1902,4 +1994,2352 @@
перед3о4пла
виу4ди
о3в4каз
-е3в4каз} \ No newline at end of file
+е3в4каз
+8-7
+--8
+.а-8
+.б-8
+.в-8
+.г-8
+.ґ-8
+.д-8
+.е-8
+.є-8
+.ж-8
+.з-8
+.и-8
+.і-8
+.ї-8
+.й-8
+.к-8
+.л-8
+.м-8
+.н-8
+.о-8
+.п-8
+.р-8
+.с-8
+.т-8
+.у-8
+.ф-8
+.х-8
+.ц-8
+.ч-8
+.ш-8
+.щ-8
+.ь-8
+.ю-8
+.я-8
+.'-8
+-а8а8
+8а8а-
+-а8б8
+8а8б-
+-а8в8
+8а8в-
+-а8г8
+8а8г-
+-а8ґ8
+8а8ґ-
+-а8д8
+8а8д-
+-а8е8
+8а8е-
+-а8є8
+8а8є-
+-а8ж8
+8а8ж-
+-а8з8
+8а8з-
+-а8и8
+8а8и-
+-а8і8
+8а8і-
+-а8ї8
+8а8ї-
+-а8й8
+8а8й-
+-а8к8
+8а8к-
+-а8л8
+8а8л-
+-а8м8
+8а8м-
+-а8н8
+8а8н-
+-а8о8
+8а8о-
+-а8п8
+8а8п-
+-а8р8
+8а8р-
+-а8с8
+8а8с-
+-а8т8
+8а8т-
+-а8у8
+8а8у-
+-а8ф8
+8а8ф-
+-а8х8
+8а8х-
+-а8ц8
+8а8ц-
+-а8ч8
+8а8ч-
+-а8ш8
+8а8ш-
+-а8щ8
+8а8щ-
+-а8ь8
+8а8ь-
+-а8ю8
+8а8ю-
+-а8я8
+8а8я-
+-а8'8
+8а8'-
+-б8а8
+8б8а-
+-б8б8
+8б8б-
+-б8в8
+8б8в-
+-б8г8
+8б8г-
+-б8ґ8
+8б8ґ-
+-б8д8
+8б8д-
+-б8е8
+8б8е-
+-б8є8
+8б8є-
+-б8ж8
+8б8ж-
+-б8з8
+8б8з-
+-б8и8
+8б8и-
+-б8і8
+8б8і-
+-б8ї8
+8б8ї-
+-б8й8
+8б8й-
+-б8к8
+8б8к-
+-б8л8
+8б8л-
+-б8м8
+8б8м-
+-б8н8
+8б8н-
+-б8о8
+8б8о-
+-б8п8
+8б8п-
+-б8р8
+8б8р-
+-б8с8
+8б8с-
+-б8т8
+8б8т-
+-б8у8
+8б8у-
+-б8ф8
+8б8ф-
+-б8х8
+8б8х-
+-б8ц8
+8б8ц-
+-б8ч8
+8б8ч-
+-б8ш8
+8б8ш-
+-б8щ8
+8б8щ-
+-б8ь8
+8б8ь-
+-б8ю8
+8б8ю-
+-б8я8
+8б8я-
+-б8'8
+8б8'-
+-в8а8
+8в8а-
+-в8б8
+8в8б-
+-в8в8
+8в8в-
+-в8г8
+8в8г-
+-в8ґ8
+8в8ґ-
+-в8д8
+8в8д-
+-в8е8
+8в8е-
+-в8є8
+8в8є-
+-в8ж8
+8в8ж-
+-в8з8
+8в8з-
+-в8и8
+8в8и-
+-в8і8
+8в8і-
+-в8ї8
+8в8ї-
+-в8й8
+8в8й-
+-в8к8
+8в8к-
+-в8л8
+8в8л-
+-в8м8
+8в8м-
+-в8н8
+8в8н-
+-в8о8
+8в8о-
+-в8п8
+8в8п-
+-в8р8
+8в8р-
+-в8с8
+8в8с-
+-в8т8
+8в8т-
+-в8у8
+8в8у-
+-в8ф8
+8в8ф-
+-в8х8
+8в8х-
+-в8ц8
+8в8ц-
+-в8ч8
+8в8ч-
+-в8ш8
+8в8ш-
+-в8щ8
+8в8щ-
+-в8ь8
+8в8ь-
+-в8ю8
+8в8ю-
+-в8я8
+8в8я-
+-в8'8
+8в8'-
+-г8а8
+8г8а-
+-г8б8
+8г8б-
+-г8в8
+8г8в-
+-г8г8
+8г8г-
+-г8ґ8
+8г8ґ-
+-г8д8
+8г8д-
+-г8е8
+8г8е-
+-г8є8
+8г8є-
+-г8ж8
+8г8ж-
+-г8з8
+8г8з-
+-г8и8
+8г8и-
+-г8і8
+8г8і-
+-г8ї8
+8г8ї-
+-г8й8
+8г8й-
+-г8к8
+8г8к-
+-г8л8
+8г8л-
+-г8м8
+8г8м-
+-г8н8
+8г8н-
+-г8о8
+8г8о-
+-г8п8
+8г8п-
+-г8р8
+8г8р-
+-г8с8
+8г8с-
+-г8т8
+8г8т-
+-г8у8
+8г8у-
+-г8ф8
+8г8ф-
+-г8х8
+8г8х-
+-г8ц8
+8г8ц-
+-г8ч8
+8г8ч-
+-г8ш8
+8г8ш-
+-г8щ8
+8г8щ-
+-г8ь8
+8г8ь-
+-г8ю8
+8г8ю-
+-г8я8
+8г8я-
+-г8'8
+8г8'-
+-ґ8а8
+8ґ8а-
+-ґ8б8
+8ґ8б-
+-ґ8в8
+8ґ8в-
+-ґ8г8
+8ґ8г-
+-ґ8ґ8
+8ґ8ґ-
+-ґ8д8
+8ґ8д-
+-ґ8е8
+8ґ8е-
+-ґ8є8
+8ґ8є-
+-ґ8ж8
+8ґ8ж-
+-ґ8з8
+8ґ8з-
+-ґ8и8
+8ґ8и-
+-ґ8і8
+8ґ8і-
+-ґ8ї8
+8ґ8ї-
+-ґ8й8
+8ґ8й-
+-ґ8к8
+8ґ8к-
+-ґ8л8
+8ґ8л-
+-ґ8м8
+8ґ8м-
+-ґ8н8
+8ґ8н-
+-ґ8о8
+8ґ8о-
+-ґ8п8
+8ґ8п-
+-ґ8р8
+8ґ8р-
+-ґ8с8
+8ґ8с-
+-ґ8т8
+8ґ8т-
+-ґ8у8
+8ґ8у-
+-ґ8ф8
+8ґ8ф-
+-ґ8х8
+8ґ8х-
+-ґ8ц8
+8ґ8ц-
+-ґ8ч8
+8ґ8ч-
+-ґ8ш8
+8ґ8ш-
+-ґ8щ8
+8ґ8щ-
+-ґ8ь8
+8ґ8ь-
+-ґ8ю8
+8ґ8ю-
+-ґ8я8
+8ґ8я-
+-ґ8'8
+8ґ8'-
+-д8а8
+8д8а-
+-д8б8
+8д8б-
+-д8в8
+8д8в-
+-д8г8
+8д8г-
+-д8ґ8
+8д8ґ-
+-д8д8
+8д8д-
+-д8е8
+8д8е-
+-д8є8
+8д8є-
+-д8ж8
+8д8ж-
+-д8з8
+8д8з-
+-д8и8
+8д8и-
+-д8і8
+8д8і-
+-д8ї8
+8д8ї-
+-д8й8
+8д8й-
+-д8к8
+8д8к-
+-д8л8
+8д8л-
+-д8м8
+8д8м-
+-д8н8
+8д8н-
+-д8о8
+8д8о-
+-д8п8
+8д8п-
+-д8р8
+8д8р-
+-д8с8
+8д8с-
+-д8т8
+8д8т-
+-д8у8
+8д8у-
+-д8ф8
+8д8ф-
+-д8х8
+8д8х-
+-д8ц8
+8д8ц-
+-д8ч8
+8д8ч-
+-д8ш8
+8д8ш-
+-д8щ8
+8д8щ-
+-д8ь8
+8д8ь-
+-д8ю8
+8д8ю-
+-д8я8
+8д8я-
+-д8'8
+8д8'-
+-е8а8
+8е8а-
+-е8б8
+8е8б-
+-е8в8
+8е8в-
+-е8г8
+8е8г-
+-е8ґ8
+8е8ґ-
+-е8д8
+8е8д-
+-е8е8
+8е8е-
+-е8є8
+8е8є-
+-е8ж8
+8е8ж-
+-е8з8
+8е8з-
+-е8и8
+8е8и-
+-е8і8
+8е8і-
+-е8ї8
+8е8ї-
+-е8й8
+8е8й-
+-е8к8
+8е8к-
+-е8л8
+8е8л-
+-е8м8
+8е8м-
+-е8н8
+8е8н-
+-е8о8
+8е8о-
+-е8п8
+8е8п-
+-е8р8
+8е8р-
+-е8с8
+8е8с-
+-е8т8
+8е8т-
+-е8у8
+8е8у-
+-е8ф8
+8е8ф-
+-е8х8
+8е8х-
+-е8ц8
+8е8ц-
+-е8ч8
+8е8ч-
+-е8ш8
+8е8ш-
+-е8щ8
+8е8щ-
+-е8ь8
+8е8ь-
+-е8ю8
+8е8ю-
+-е8я8
+8е8я-
+-е8'8
+8е8'-
+-є8а8
+8є8а-
+-є8б8
+8є8б-
+-є8в8
+8є8в-
+-є8г8
+8є8г-
+-є8ґ8
+8є8ґ-
+-є8д8
+8є8д-
+-є8е8
+8є8е-
+-є8є8
+8є8є-
+-є8ж8
+8є8ж-
+-є8з8
+8є8з-
+-є8и8
+8є8и-
+-є8і8
+8є8і-
+-є8ї8
+8є8ї-
+-є8й8
+8є8й-
+-є8к8
+8є8к-
+-є8л8
+8є8л-
+-є8м8
+8є8м-
+-є8н8
+8є8н-
+-є8о8
+8є8о-
+-є8п8
+8є8п-
+-є8р8
+8є8р-
+-є8с8
+8є8с-
+-є8т8
+8є8т-
+-є8у8
+8є8у-
+-є8ф8
+8є8ф-
+-є8х8
+8є8х-
+-є8ц8
+8є8ц-
+-є8ч8
+8є8ч-
+-є8ш8
+8є8ш-
+-є8щ8
+8є8щ-
+-є8ь8
+8є8ь-
+-є8ю8
+8є8ю-
+-є8я8
+8є8я-
+-є8'8
+8є8'-
+-ж8а8
+8ж8а-
+-ж8б8
+8ж8б-
+-ж8в8
+8ж8в-
+-ж8г8
+8ж8г-
+-ж8ґ8
+8ж8ґ-
+-ж8д8
+8ж8д-
+-ж8е8
+8ж8е-
+-ж8є8
+8ж8є-
+-ж8ж8
+8ж8ж-
+-ж8з8
+8ж8з-
+-ж8и8
+8ж8и-
+-ж8і8
+8ж8і-
+-ж8ї8
+8ж8ї-
+-ж8й8
+8ж8й-
+-ж8к8
+8ж8к-
+-ж8л8
+8ж8л-
+-ж8м8
+8ж8м-
+-ж8н8
+8ж8н-
+-ж8о8
+8ж8о-
+-ж8п8
+8ж8п-
+-ж8р8
+8ж8р-
+-ж8с8
+8ж8с-
+-ж8т8
+8ж8т-
+-ж8у8
+8ж8у-
+-ж8ф8
+8ж8ф-
+-ж8х8
+8ж8х-
+-ж8ц8
+8ж8ц-
+-ж8ч8
+8ж8ч-
+-ж8ш8
+8ж8ш-
+-ж8щ8
+8ж8щ-
+-ж8ь8
+8ж8ь-
+-ж8ю8
+8ж8ю-
+-ж8я8
+8ж8я-
+-ж8'8
+8ж8'-
+-з8а8
+8з8а-
+-з8б8
+8з8б-
+-з8в8
+8з8в-
+-з8г8
+8з8г-
+-з8ґ8
+8з8ґ-
+-з8д8
+8з8д-
+-з8е8
+8з8е-
+-з8є8
+8з8є-
+-з8ж8
+8з8ж-
+-з8з8
+8з8з-
+-з8и8
+8з8и-
+-з8і8
+8з8і-
+-з8ї8
+8з8ї-
+-з8й8
+8з8й-
+-з8к8
+8з8к-
+-з8л8
+8з8л-
+-з8м8
+8з8м-
+-з8н8
+8з8н-
+-з8о8
+8з8о-
+-з8п8
+8з8п-
+-з8р8
+8з8р-
+-з8с8
+8з8с-
+-з8т8
+8з8т-
+-з8у8
+8з8у-
+-з8ф8
+8з8ф-
+-з8х8
+8з8х-
+-з8ц8
+8з8ц-
+-з8ч8
+8з8ч-
+-з8ш8
+8з8ш-
+-з8щ8
+8з8щ-
+-з8ь8
+8з8ь-
+-з8ю8
+8з8ю-
+-з8я8
+8з8я-
+-з8'8
+8з8'-
+-и8а8
+8и8а-
+-и8б8
+8и8б-
+-и8в8
+8и8в-
+-и8г8
+8и8г-
+-и8ґ8
+8и8ґ-
+-и8д8
+8и8д-
+-и8е8
+8и8е-
+-и8є8
+8и8є-
+-и8ж8
+8и8ж-
+-и8з8
+8и8з-
+-и8и8
+8и8и-
+-и8і8
+8и8і-
+-и8ї8
+8и8ї-
+-и8й8
+8и8й-
+-и8к8
+8и8к-
+-и8л8
+8и8л-
+-и8м8
+8и8м-
+-и8н8
+8и8н-
+-и8о8
+8и8о-
+-и8п8
+8и8п-
+-и8р8
+8и8р-
+-и8с8
+8и8с-
+-и8т8
+8и8т-
+-и8у8
+8и8у-
+-и8ф8
+8и8ф-
+-и8х8
+8и8х-
+-и8ц8
+8и8ц-
+-и8ч8
+8и8ч-
+-и8ш8
+8и8ш-
+-и8щ8
+8и8щ-
+-и8ь8
+8и8ь-
+-и8ю8
+8и8ю-
+-и8я8
+8и8я-
+-и8'8
+8и8'-
+-і8а8
+8і8а-
+-і8б8
+8і8б-
+-і8в8
+8і8в-
+-і8г8
+8і8г-
+-і8ґ8
+8і8ґ-
+-і8д8
+8і8д-
+-і8е8
+8і8е-
+-і8є8
+8і8є-
+-і8ж8
+8і8ж-
+-і8з8
+8і8з-
+-і8и8
+8і8и-
+-і8і8
+8і8і-
+-і8ї8
+8і8ї-
+-і8й8
+8і8й-
+-і8к8
+8і8к-
+-і8л8
+8і8л-
+-і8м8
+8і8м-
+-і8н8
+8і8н-
+-і8о8
+8і8о-
+-і8п8
+8і8п-
+-і8р8
+8і8р-
+-і8с8
+8і8с-
+-і8т8
+8і8т-
+-і8у8
+8і8у-
+-і8ф8
+8і8ф-
+-і8х8
+8і8х-
+-і8ц8
+8і8ц-
+-і8ч8
+8і8ч-
+-і8ш8
+8і8ш-
+-і8щ8
+8і8щ-
+-і8ь8
+8і8ь-
+-і8ю8
+8і8ю-
+-і8я8
+8і8я-
+-і8'8
+8і8'-
+-ї8а8
+8ї8а-
+-ї8б8
+8ї8б-
+-ї8в8
+8ї8в-
+-ї8г8
+8ї8г-
+-ї8ґ8
+8ї8ґ-
+-ї8д8
+8ї8д-
+-ї8е8
+8ї8е-
+-ї8є8
+8ї8є-
+-ї8ж8
+8ї8ж-
+-ї8з8
+8ї8з-
+-ї8и8
+8ї8и-
+-ї8і8
+8ї8і-
+-ї8ї8
+8ї8ї-
+-ї8й8
+8ї8й-
+-ї8к8
+8ї8к-
+-ї8л8
+8ї8л-
+-ї8м8
+8ї8м-
+-ї8н8
+8ї8н-
+-ї8о8
+8ї8о-
+-ї8п8
+8ї8п-
+-ї8р8
+8ї8р-
+-ї8с8
+8ї8с-
+-ї8т8
+8ї8т-
+-ї8у8
+8ї8у-
+-ї8ф8
+8ї8ф-
+-ї8х8
+8ї8х-
+-ї8ц8
+8ї8ц-
+-ї8ч8
+8ї8ч-
+-ї8ш8
+8ї8ш-
+-ї8щ8
+8ї8щ-
+-ї8ь8
+8ї8ь-
+-ї8ю8
+8ї8ю-
+-ї8я8
+8ї8я-
+-ї8'8
+8ї8'-
+-й8а8
+8й8а-
+-й8б8
+8й8б-
+-й8в8
+8й8в-
+-й8г8
+8й8г-
+-й8ґ8
+8й8ґ-
+-й8д8
+8й8д-
+-й8е8
+8й8е-
+-й8є8
+8й8є-
+-й8ж8
+8й8ж-
+-й8з8
+8й8з-
+-й8и8
+8й8и-
+-й8і8
+8й8і-
+-й8ї8
+8й8ї-
+-й8й8
+8й8й-
+-й8к8
+8й8к-
+-й8л8
+8й8л-
+-й8м8
+8й8м-
+-й8н8
+8й8н-
+-й8о8
+8й8о-
+-й8п8
+8й8п-
+-й8р8
+8й8р-
+-й8с8
+8й8с-
+-й8т8
+8й8т-
+-й8у8
+8й8у-
+-й8ф8
+8й8ф-
+-й8х8
+8й8х-
+-й8ц8
+8й8ц-
+-й8ч8
+8й8ч-
+-й8ш8
+8й8ш-
+-й8щ8
+8й8щ-
+-й8ь8
+8й8ь-
+-й8ю8
+8й8ю-
+-й8я8
+8й8я-
+-й8'8
+8й8'-
+-к8а8
+8к8а-
+-к8б8
+8к8б-
+-к8в8
+8к8в-
+-к8г8
+8к8г-
+-к8ґ8
+8к8ґ-
+-к8д8
+8к8д-
+-к8е8
+8к8е-
+-к8є8
+8к8є-
+-к8ж8
+8к8ж-
+-к8з8
+8к8з-
+-к8и8
+8к8и-
+-к8і8
+8к8і-
+-к8ї8
+8к8ї-
+-к8й8
+8к8й-
+-к8к8
+8к8к-
+-к8л8
+8к8л-
+-к8м8
+8к8м-
+-к8н8
+8к8н-
+-к8о8
+8к8о-
+-к8п8
+8к8п-
+-к8р8
+8к8р-
+-к8с8
+8к8с-
+-к8т8
+8к8т-
+-к8у8
+8к8у-
+-к8ф8
+8к8ф-
+-к8х8
+8к8х-
+-к8ц8
+8к8ц-
+-к8ч8
+8к8ч-
+-к8ш8
+8к8ш-
+-к8щ8
+8к8щ-
+-к8ь8
+8к8ь-
+-к8ю8
+8к8ю-
+-к8я8
+8к8я-
+-к8'8
+8к8'-
+-л8а8
+8л8а-
+-л8б8
+8л8б-
+-л8в8
+8л8в-
+-л8г8
+8л8г-
+-л8ґ8
+8л8ґ-
+-л8д8
+8л8д-
+-л8е8
+8л8е-
+-л8є8
+8л8є-
+-л8ж8
+8л8ж-
+-л8з8
+8л8з-
+-л8и8
+8л8и-
+-л8і8
+8л8і-
+-л8ї8
+8л8ї-
+-л8й8
+8л8й-
+-л8к8
+8л8к-
+-л8л8
+8л8л-
+-л8м8
+8л8м-
+-л8н8
+8л8н-
+-л8о8
+8л8о-
+-л8п8
+8л8п-
+-л8р8
+8л8р-
+-л8с8
+8л8с-
+-л8т8
+8л8т-
+-л8у8
+8л8у-
+-л8ф8
+8л8ф-
+-л8х8
+8л8х-
+-л8ц8
+8л8ц-
+-л8ч8
+8л8ч-
+-л8ш8
+8л8ш-
+-л8щ8
+8л8щ-
+-л8ь8
+8л8ь-
+-л8ю8
+8л8ю-
+-л8я8
+8л8я-
+-л8'8
+8л8'-
+-м8а8
+8м8а-
+-м8б8
+8м8б-
+-м8в8
+8м8в-
+-м8г8
+8м8г-
+-м8ґ8
+8м8ґ-
+-м8д8
+8м8д-
+-м8е8
+8м8е-
+-м8є8
+8м8є-
+-м8ж8
+8м8ж-
+-м8з8
+8м8з-
+-м8и8
+8м8и-
+-м8і8
+8м8і-
+-м8ї8
+8м8ї-
+-м8й8
+8м8й-
+-м8к8
+8м8к-
+-м8л8
+8м8л-
+-м8м8
+8м8м-
+-м8н8
+8м8н-
+-м8о8
+8м8о-
+-м8п8
+8м8п-
+-м8р8
+8м8р-
+-м8с8
+8м8с-
+-м8т8
+8м8т-
+-м8у8
+8м8у-
+-м8ф8
+8м8ф-
+-м8х8
+8м8х-
+-м8ц8
+8м8ц-
+-м8ч8
+8м8ч-
+-м8ш8
+8м8ш-
+-м8щ8
+8м8щ-
+-м8ь8
+8м8ь-
+-м8ю8
+8м8ю-
+-м8я8
+8м8я-
+-м8'8
+8м8'-
+-н8а8
+8н8а-
+-н8б8
+8н8б-
+-н8в8
+8н8в-
+-н8г8
+8н8г-
+-н8ґ8
+8н8ґ-
+-н8д8
+8н8д-
+-н8е8
+8н8е-
+-н8є8
+8н8є-
+-н8ж8
+8н8ж-
+-н8з8
+8н8з-
+-н8и8
+8н8и-
+-н8і8
+8н8і-
+-н8ї8
+8н8ї-
+-н8й8
+8н8й-
+-н8к8
+8н8к-
+-н8л8
+8н8л-
+-н8м8
+8н8м-
+-н8н8
+8н8н-
+-н8о8
+8н8о-
+-н8п8
+8н8п-
+-н8р8
+8н8р-
+-н8с8
+8н8с-
+-н8т8
+8н8т-
+-н8у8
+8н8у-
+-н8ф8
+8н8ф-
+-н8х8
+8н8х-
+-н8ц8
+8н8ц-
+-н8ч8
+8н8ч-
+-н8ш8
+8н8ш-
+-н8щ8
+8н8щ-
+-н8ь8
+8н8ь-
+-н8ю8
+8н8ю-
+-н8я8
+8н8я-
+-н8'8
+8н8'-
+-о8а8
+8о8а-
+-о8б8
+8о8б-
+-о8в8
+8о8в-
+-о8г8
+8о8г-
+-о8ґ8
+8о8ґ-
+-о8д8
+8о8д-
+-о8е8
+8о8е-
+-о8є8
+8о8є-
+-о8ж8
+8о8ж-
+-о8з8
+8о8з-
+-о8и8
+8о8и-
+-о8і8
+8о8і-
+-о8ї8
+8о8ї-
+-о8й8
+8о8й-
+-о8к8
+8о8к-
+-о8л8
+8о8л-
+-о8м8
+8о8м-
+-о8н8
+8о8н-
+-о8о8
+8о8о-
+-о8п8
+8о8п-
+-о8р8
+8о8р-
+-о8с8
+8о8с-
+-о8т8
+8о8т-
+-о8у8
+8о8у-
+-о8ф8
+8о8ф-
+-о8х8
+8о8х-
+-о8ц8
+8о8ц-
+-о8ч8
+8о8ч-
+-о8ш8
+8о8ш-
+-о8щ8
+8о8щ-
+-о8ь8
+8о8ь-
+-о8ю8
+8о8ю-
+-о8я8
+8о8я-
+-о8'8
+8о8'-
+-п8а8
+8п8а-
+-п8б8
+8п8б-
+-п8в8
+8п8в-
+-п8г8
+8п8г-
+-п8ґ8
+8п8ґ-
+-п8д8
+8п8д-
+-п8е8
+8п8е-
+-п8є8
+8п8є-
+-п8ж8
+8п8ж-
+-п8з8
+8п8з-
+-п8и8
+8п8и-
+-п8і8
+8п8і-
+-п8ї8
+8п8ї-
+-п8й8
+8п8й-
+-п8к8
+8п8к-
+-п8л8
+8п8л-
+-п8м8
+8п8м-
+-п8н8
+8п8н-
+-п8о8
+8п8о-
+-п8п8
+8п8п-
+-п8р8
+8п8р-
+-п8с8
+8п8с-
+-п8т8
+8п8т-
+-п8у8
+8п8у-
+-п8ф8
+8п8ф-
+-п8х8
+8п8х-
+-п8ц8
+8п8ц-
+-п8ч8
+8п8ч-
+-п8ш8
+8п8ш-
+-п8щ8
+8п8щ-
+-п8ь8
+8п8ь-
+-п8ю8
+8п8ю-
+-п8я8
+8п8я-
+-п8'8
+8п8'-
+-р8а8
+8р8а-
+-р8б8
+8р8б-
+-р8в8
+8р8в-
+-р8г8
+8р8г-
+-р8ґ8
+8р8ґ-
+-р8д8
+8р8д-
+-р8е8
+8р8е-
+-р8є8
+8р8є-
+-р8ж8
+8р8ж-
+-р8з8
+8р8з-
+-р8и8
+8р8и-
+-р8і8
+8р8і-
+-р8ї8
+8р8ї-
+-р8й8
+8р8й-
+-р8к8
+8р8к-
+-р8л8
+8р8л-
+-р8м8
+8р8м-
+-р8н8
+8р8н-
+-р8о8
+8р8о-
+-р8п8
+8р8п-
+-р8р8
+8р8р-
+-р8с8
+8р8с-
+-р8т8
+8р8т-
+-р8у8
+8р8у-
+-р8ф8
+8р8ф-
+-р8х8
+8р8х-
+-р8ц8
+8р8ц-
+-р8ч8
+8р8ч-
+-р8ш8
+8р8ш-
+-р8щ8
+8р8щ-
+-р8ь8
+8р8ь-
+-р8ю8
+8р8ю-
+-р8я8
+8р8я-
+-р8'8
+8р8'-
+-с8а8
+8с8а-
+-с8б8
+8с8б-
+-с8в8
+8с8в-
+-с8г8
+8с8г-
+-с8ґ8
+8с8ґ-
+-с8д8
+8с8д-
+-с8е8
+8с8е-
+-с8є8
+8с8є-
+-с8ж8
+8с8ж-
+-с8з8
+8с8з-
+-с8и8
+8с8и-
+-с8і8
+8с8і-
+-с8ї8
+8с8ї-
+-с8й8
+8с8й-
+-с8к8
+8с8к-
+-с8л8
+8с8л-
+-с8м8
+8с8м-
+-с8н8
+8с8н-
+-с8о8
+8с8о-
+-с8п8
+8с8п-
+-с8р8
+8с8р-
+-с8с8
+8с8с-
+-с8т8
+8с8т-
+-с8у8
+8с8у-
+-с8ф8
+8с8ф-
+-с8х8
+8с8х-
+-с8ц8
+8с8ц-
+-с8ч8
+8с8ч-
+-с8ш8
+8с8ш-
+-с8щ8
+8с8щ-
+-с8ь8
+8с8ь-
+-с8ю8
+8с8ю-
+-с8я8
+8с8я-
+-с8'8
+8с8'-
+-т8а8
+8т8а-
+-т8б8
+8т8б-
+-т8в8
+8т8в-
+-т8г8
+8т8г-
+-т8ґ8
+8т8ґ-
+-т8д8
+8т8д-
+-т8е8
+8т8е-
+-т8є8
+8т8є-
+-т8ж8
+8т8ж-
+-т8з8
+8т8з-
+-т8и8
+8т8и-
+-т8і8
+8т8і-
+-т8ї8
+8т8ї-
+-т8й8
+8т8й-
+-т8к8
+8т8к-
+-т8л8
+8т8л-
+-т8м8
+8т8м-
+-т8н8
+8т8н-
+-т8о8
+8т8о-
+-т8п8
+8т8п-
+-т8р8
+8т8р-
+-т8с8
+8т8с-
+-т8т8
+8т8т-
+-т8у8
+8т8у-
+-т8ф8
+8т8ф-
+-т8х8
+8т8х-
+-т8ц8
+8т8ц-
+-т8ч8
+8т8ч-
+-т8ш8
+8т8ш-
+-т8щ8
+8т8щ-
+-т8ь8
+8т8ь-
+-т8ю8
+8т8ю-
+-т8я8
+8т8я-
+-т8'8
+8т8'-
+-у8а8
+8у8а-
+-у8б8
+8у8б-
+-у8в8
+8у8в-
+-у8г8
+8у8г-
+-у8ґ8
+8у8ґ-
+-у8д8
+8у8д-
+-у8е8
+8у8е-
+-у8є8
+8у8є-
+-у8ж8
+8у8ж-
+-у8з8
+8у8з-
+-у8и8
+8у8и-
+-у8і8
+8у8і-
+-у8ї8
+8у8ї-
+-у8й8
+8у8й-
+-у8к8
+8у8к-
+-у8л8
+8у8л-
+-у8м8
+8у8м-
+-у8н8
+8у8н-
+-у8о8
+8у8о-
+-у8п8
+8у8п-
+-у8р8
+8у8р-
+-у8с8
+8у8с-
+-у8т8
+8у8т-
+-у8у8
+8у8у-
+-у8ф8
+8у8ф-
+-у8х8
+8у8х-
+-у8ц8
+8у8ц-
+-у8ч8
+8у8ч-
+-у8ш8
+8у8ш-
+-у8щ8
+8у8щ-
+-у8ь8
+8у8ь-
+-у8ю8
+8у8ю-
+-у8я8
+8у8я-
+-у8'8
+8у8'-
+-ф8а8
+8ф8а-
+-ф8б8
+8ф8б-
+-ф8в8
+8ф8в-
+-ф8г8
+8ф8г-
+-ф8ґ8
+8ф8ґ-
+-ф8д8
+8ф8д-
+-ф8е8
+8ф8е-
+-ф8є8
+8ф8є-
+-ф8ж8
+8ф8ж-
+-ф8з8
+8ф8з-
+-ф8и8
+8ф8и-
+-ф8і8
+8ф8і-
+-ф8ї8
+8ф8ї-
+-ф8й8
+8ф8й-
+-ф8к8
+8ф8к-
+-ф8л8
+8ф8л-
+-ф8м8
+8ф8м-
+-ф8н8
+8ф8н-
+-ф8о8
+8ф8о-
+-ф8п8
+8ф8п-
+-ф8р8
+8ф8р-
+-ф8с8
+8ф8с-
+-ф8т8
+8ф8т-
+-ф8у8
+8ф8у-
+-ф8ф8
+8ф8ф-
+-ф8х8
+8ф8х-
+-ф8ц8
+8ф8ц-
+-ф8ч8
+8ф8ч-
+-ф8ш8
+8ф8ш-
+-ф8щ8
+8ф8щ-
+-ф8ь8
+8ф8ь-
+-ф8ю8
+8ф8ю-
+-ф8я8
+8ф8я-
+-ф8'8
+8ф8'-
+-х8а8
+8х8а-
+-х8б8
+8х8б-
+-х8в8
+8х8в-
+-х8г8
+8х8г-
+-х8ґ8
+8х8ґ-
+-х8д8
+8х8д-
+-х8е8
+8х8е-
+-х8є8
+8х8є-
+-х8ж8
+8х8ж-
+-х8з8
+8х8з-
+-х8и8
+8х8и-
+-х8і8
+8х8і-
+-х8ї8
+8х8ї-
+-х8й8
+8х8й-
+-х8к8
+8х8к-
+-х8л8
+8х8л-
+-х8м8
+8х8м-
+-х8н8
+8х8н-
+-х8о8
+8х8о-
+-х8п8
+8х8п-
+-х8р8
+8х8р-
+-х8с8
+8х8с-
+-х8т8
+8х8т-
+-х8у8
+8х8у-
+-х8ф8
+8х8ф-
+-х8х8
+8х8х-
+-х8ц8
+8х8ц-
+-х8ч8
+8х8ч-
+-х8ш8
+8х8ш-
+-х8щ8
+8х8щ-
+-х8ь8
+8х8ь-
+-х8ю8
+8х8ю-
+-х8я8
+8х8я-
+-х8'8
+8х8'-
+-ц8а8
+8ц8а-
+-ц8б8
+8ц8б-
+-ц8в8
+8ц8в-
+-ц8г8
+8ц8г-
+-ц8ґ8
+8ц8ґ-
+-ц8д8
+8ц8д-
+-ц8е8
+8ц8е-
+-ц8є8
+8ц8є-
+-ц8ж8
+8ц8ж-
+-ц8з8
+8ц8з-
+-ц8и8
+8ц8и-
+-ц8і8
+8ц8і-
+-ц8ї8
+8ц8ї-
+-ц8й8
+8ц8й-
+-ц8к8
+8ц8к-
+-ц8л8
+8ц8л-
+-ц8м8
+8ц8м-
+-ц8н8
+8ц8н-
+-ц8о8
+8ц8о-
+-ц8п8
+8ц8п-
+-ц8р8
+8ц8р-
+-ц8с8
+8ц8с-
+-ц8т8
+8ц8т-
+-ц8у8
+8ц8у-
+-ц8ф8
+8ц8ф-
+-ц8х8
+8ц8х-
+-ц8ц8
+8ц8ц-
+-ц8ч8
+8ц8ч-
+-ц8ш8
+8ц8ш-
+-ц8щ8
+8ц8щ-
+-ц8ь8
+8ц8ь-
+-ц8ю8
+8ц8ю-
+-ц8я8
+8ц8я-
+-ц8'8
+8ц8'-
+-ч8а8
+8ч8а-
+-ч8б8
+8ч8б-
+-ч8в8
+8ч8в-
+-ч8г8
+8ч8г-
+-ч8ґ8
+8ч8ґ-
+-ч8д8
+8ч8д-
+-ч8е8
+8ч8е-
+-ч8є8
+8ч8є-
+-ч8ж8
+8ч8ж-
+-ч8з8
+8ч8з-
+-ч8и8
+8ч8и-
+-ч8і8
+8ч8і-
+-ч8ї8
+8ч8ї-
+-ч8й8
+8ч8й-
+-ч8к8
+8ч8к-
+-ч8л8
+8ч8л-
+-ч8м8
+8ч8м-
+-ч8н8
+8ч8н-
+-ч8о8
+8ч8о-
+-ч8п8
+8ч8п-
+-ч8р8
+8ч8р-
+-ч8с8
+8ч8с-
+-ч8т8
+8ч8т-
+-ч8у8
+8ч8у-
+-ч8ф8
+8ч8ф-
+-ч8х8
+8ч8х-
+-ч8ц8
+8ч8ц-
+-ч8ч8
+8ч8ч-
+-ч8ш8
+8ч8ш-
+-ч8щ8
+8ч8щ-
+-ч8ь8
+8ч8ь-
+-ч8ю8
+8ч8ю-
+-ч8я8
+8ч8я-
+-ч8'8
+8ч8'-
+-ш8а8
+8ш8а-
+-ш8б8
+8ш8б-
+-ш8в8
+8ш8в-
+-ш8г8
+8ш8г-
+-ш8ґ8
+8ш8ґ-
+-ш8д8
+8ш8д-
+-ш8е8
+8ш8е-
+-ш8є8
+8ш8є-
+-ш8ж8
+8ш8ж-
+-ш8з8
+8ш8з-
+-ш8и8
+8ш8и-
+-ш8і8
+8ш8і-
+-ш8ї8
+8ш8ї-
+-ш8й8
+8ш8й-
+-ш8к8
+8ш8к-
+-ш8л8
+8ш8л-
+-ш8м8
+8ш8м-
+-ш8н8
+8ш8н-
+-ш8о8
+8ш8о-
+-ш8п8
+8ш8п-
+-ш8р8
+8ш8р-
+-ш8с8
+8ш8с-
+-ш8т8
+8ш8т-
+-ш8у8
+8ш8у-
+-ш8ф8
+8ш8ф-
+-ш8х8
+8ш8х-
+-ш8ц8
+8ш8ц-
+-ш8ч8
+8ш8ч-
+-ш8ш8
+8ш8ш-
+-ш8щ8
+8ш8щ-
+-ш8ь8
+8ш8ь-
+-ш8ю8
+8ш8ю-
+-ш8я8
+8ш8я-
+-ш8'8
+8ш8'-
+-щ8а8
+8щ8а-
+-щ8б8
+8щ8б-
+-щ8в8
+8щ8в-
+-щ8г8
+8щ8г-
+-щ8ґ8
+8щ8ґ-
+-щ8д8
+8щ8д-
+-щ8е8
+8щ8е-
+-щ8є8
+8щ8є-
+-щ8ж8
+8щ8ж-
+-щ8з8
+8щ8з-
+-щ8и8
+8щ8и-
+-щ8і8
+8щ8і-
+-щ8ї8
+8щ8ї-
+-щ8й8
+8щ8й-
+-щ8к8
+8щ8к-
+-щ8л8
+8щ8л-
+-щ8м8
+8щ8м-
+-щ8н8
+8щ8н-
+-щ8о8
+8щ8о-
+-щ8п8
+8щ8п-
+-щ8р8
+8щ8р-
+-щ8с8
+8щ8с-
+-щ8т8
+8щ8т-
+-щ8у8
+8щ8у-
+-щ8ф8
+8щ8ф-
+-щ8х8
+8щ8х-
+-щ8ц8
+8щ8ц-
+-щ8ч8
+8щ8ч-
+-щ8ш8
+8щ8ш-
+-щ8щ8
+8щ8щ-
+-щ8ь8
+8щ8ь-
+-щ8ю8
+8щ8ю-
+-щ8я8
+8щ8я-
+-щ8'8
+8щ8'-
+-ь8а8
+8ь8а-
+-ь8б8
+8ь8б-
+-ь8в8
+8ь8в-
+-ь8г8
+8ь8г-
+-ь8ґ8
+8ь8ґ-
+-ь8д8
+8ь8д-
+-ь8е8
+8ь8е-
+-ь8є8
+8ь8є-
+-ь8ж8
+8ь8ж-
+-ь8з8
+8ь8з-
+-ь8и8
+8ь8и-
+-ь8і8
+8ь8і-
+-ь8ї8
+8ь8ї-
+-ь8й8
+8ь8й-
+-ь8к8
+8ь8к-
+-ь8л8
+8ь8л-
+-ь8м8
+8ь8м-
+-ь8н8
+8ь8н-
+-ь8о8
+8ь8о-
+-ь8п8
+8ь8п-
+-ь8р8
+8ь8р-
+-ь8с8
+8ь8с-
+-ь8т8
+8ь8т-
+-ь8у8
+8ь8у-
+-ь8ф8
+8ь8ф-
+-ь8х8
+8ь8х-
+-ь8ц8
+8ь8ц-
+-ь8ч8
+8ь8ч-
+-ь8ш8
+8ь8ш-
+-ь8щ8
+8ь8щ-
+-ь8ь8
+8ь8ь-
+-ь8ю8
+8ь8ю-
+-ь8я8
+8ь8я-
+-ь8'8
+8ь8'-
+-ю8а8
+8ю8а-
+-ю8б8
+8ю8б-
+-ю8в8
+8ю8в-
+-ю8г8
+8ю8г-
+-ю8ґ8
+8ю8ґ-
+-ю8д8
+8ю8д-
+-ю8е8
+8ю8е-
+-ю8є8
+8ю8є-
+-ю8ж8
+8ю8ж-
+-ю8з8
+8ю8з-
+-ю8и8
+8ю8и-
+-ю8і8
+8ю8і-
+-ю8ї8
+8ю8ї-
+-ю8й8
+8ю8й-
+-ю8к8
+8ю8к-
+-ю8л8
+8ю8л-
+-ю8м8
+8ю8м-
+-ю8н8
+8ю8н-
+-ю8о8
+8ю8о-
+-ю8п8
+8ю8п-
+-ю8р8
+8ю8р-
+-ю8с8
+8ю8с-
+-ю8т8
+8ю8т-
+-ю8у8
+8ю8у-
+-ю8ф8
+8ю8ф-
+-ю8х8
+8ю8х-
+-ю8ц8
+8ю8ц-
+-ю8ч8
+8ю8ч-
+-ю8ш8
+8ю8ш-
+-ю8щ8
+8ю8щ-
+-ю8ь8
+8ю8ь-
+-ю8ю8
+8ю8ю-
+-ю8я8
+8ю8я-
+-ю8'8
+8ю8'-
+-я8а8
+8я8а-
+-я8б8
+8я8б-
+-я8в8
+8я8в-
+-я8г8
+8я8г-
+-я8ґ8
+8я8ґ-
+-я8д8
+8я8д-
+-я8е8
+8я8е-
+-я8є8
+8я8є-
+-я8ж8
+8я8ж-
+-я8з8
+8я8з-
+-я8и8
+8я8и-
+-я8і8
+8я8і-
+-я8ї8
+8я8ї-
+-я8й8
+8я8й-
+-я8к8
+8я8к-
+-я8л8
+8я8л-
+-я8м8
+8я8м-
+-я8н8
+8я8н-
+-я8о8
+8я8о-
+-я8п8
+8я8п-
+-я8р8
+8я8р-
+-я8с8
+8я8с-
+-я8т8
+8я8т-
+-я8у8
+8я8у-
+-я8ф8
+8я8ф-
+-я8х8
+8я8х-
+-я8ц8
+8я8ц-
+-я8ч8
+8я8ч-
+-я8ш8
+8я8ш-
+-я8щ8
+8я8щ-
+-я8ь8
+8я8ь-
+-я8ю8
+8я8ю-
+-я8я8
+8я8я-
+-я8'8
+8я8'-
+-'8а8
+8'8а-
+-'8б8
+8'8б-
+-'8в8
+8'8в-
+-'8г8
+8'8г-
+-'8ґ8
+8'8ґ-
+-'8д8
+8'8д-
+-'8е8
+8'8е-
+-'8є8
+8'8є-
+-'8ж8
+8'8ж-
+-'8з8
+8'8з-
+-'8и8
+8'8и-
+-'8і8
+8'8і-
+-'8ї8
+8'8ї-
+-'8й8
+8'8й-
+-'8к8
+8'8к-
+-'8л8
+8'8л-
+-'8м8
+8'8м-
+-'8н8
+8'8н-
+-'8о8
+8'8о-
+-'8п8
+8'8п-
+-'8р8
+8'8р-
+-'8с8
+8'8с-
+-'8т8
+8'8т-
+-'8у8
+8'8у-
+-'8ф8
+8'8ф-
+-'8х8
+8'8х-
+-'8ц8
+8'8ц-
+-'8ч8
+8'8ч-
+-'8ш8
+8'8ш-
+-'8щ8
+8'8щ-
+-'8ь8
+8'8ь-
+-'8ю8
+8'8ю-
+-'8я8
+8'8я-
+-'8'8
+8'8'-} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-uk.rme b/Master/texmf-dist/tex/context/patterns/lang-uk.rme
index 9d6e5ee886f..6905b2ae8da 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-uk.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-uk.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Ukrainian Hyphenation Patterns
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -67,4 +71,4 @@
% under the terms of the LaTeX Project Public License (lppl).
% Please, send bug reports via e-mail:
% polyama@auburn.edu
-% mpoliak@i.com.ua \ No newline at end of file
+% mpoliak@i.com.ua
diff --git a/Master/texmf-dist/tex/context/patterns/lang-us.lua b/Master/texmf-dist/tex/context/patterns/lang-us.lua
new file mode 100644
index 00000000000..a37cbce5eae
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-us.lua
@@ -0,0 +1,63 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["characters"]="abcdefghijlmnoprstuyz",
+ ["data"]="as-so-ciate as-so-ciates dec-li-na-tion oblig-a-tory phil-an-thropic present presents project projects reci-procity re-cog-ni-zance ref-or-ma-tion ret-ri-bu-tion ta-ble",
+ ["n"]=14,
+ },
+ ["metadata"]={
+ ["mnemonic"]="us",
+ ["source"]="hyph-en-us",
+ ["texcomment"]="% Hyphenation Patterns for American English\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file has been renamed from ushyphmax.tex to hyph-en-us.tex in June 2008\
+% for consistency with other files with hyphenation patterns in hyph-utf8 package.\
+% No other changes made. See http://www.tug.org/tex-hyphen for more details.\
+% \
+% ushyphmax.tex -- patterns for more hyphenation pattern memory (12000+).\
+% Also known as ushyphen.max.\
+% \
+% version of 2005-05-30.\
+% Patterns of March 1, 1990.\
+% \
+% Copyright (C) 1990, 2004, 2005 Gerard D.C. Kuiken.\
+% Copying and distribution of this file, with or without modification,\
+% are permitted in any medium without royalty provided the copyright\
+% notice and this notice are preserved.\
+% \
+% Needs extended pattern memory.\
+% Hyphenation trie becomes 7283 with 377 ops.\
+% \
+% These patterns are based on the Hyphenation Exception Log\
+% published in TUGboat, Volume 10 (1989), No. 3, pp. 337-341,\
+% and a large number of incorrectly hyphenated words not yet published.\
+% If added to Liang's before the closing bracket } of \\patterns,\
+% the patterns run errorfree as far as known at this moment.\
+% \
+% These patterns find all admissible hyphens of the words in\
+% the Exception Log. ushyph2.tex is a smaller set.\
+% \
+% Please send bugs or suggestions to tex-live (at) tug.org.\
+% \
+% 2005-05-30 (karl): in the past, ushyphmax.tex was a file containing\
+% only the additional patterns, without the \\patterns command, etc.\
+% This turned out not to be very useful, since in practice the TeX\
+% distributions need one self-contained file for a language. Therefore,\
+% ushyphmax.tex now contains both the additional patterns from\
+% Dr. Kuiken, and the original patterns and hyphenations from Knuth's\
+% hyphen.tex.\
+% \
+% The Plain TeX hyphenation tables.\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuvwxyz",
+ ["data"]=".ach4 .ad4der .af1t .al3t .am5at .an5c .ang4 .ani5m .ant4 .an3te .anti5s .ar5s .ar4tie .ar4ty .as3c .as1p .as1s .aster5 .atom5 .au1d .av4i .awn4 .ba4g .ba5na .bas4e .ber4 .be5ra .be3sm .be5sto .bri2 .but4ti .cam4pe .can5c .capa5b .car5ol .ca4t .ce4la .ch4 .chill5i .ci2 .cit5r .co3e .co4r .cor5ner .de4moi .de3o .de3ra .de3ri .des4c .dictio5 .do4t .du4c .dumb5 .earth5 .eas3i .eb4 .eer4 .eg2 .el5d .el3em .enam3 .en3g .en3s .eq5ui5t .er4ri .es3 .eu3 .eye5 .fes3 .for5mer .ga2 .ge2 .gen3t4 .ge5og .gi5a .gi4b .go4r .hand5i .han5k .he2 .hero5i .hes3 .het3 .hi3b .hi3er .hon5ey .hon3o .hov5 .id4l .idol3 .im3m .im5pin .in1 .in3ci .ine2 .in2k .in3s .ir5r .is4i .ju3r .la4cy .la4m .lat5er .lath5 .le2 .leg5e .len4 .lep5 .lev1 .li4g .lig5a .li2n .li3o .li4t .mag5a5 .mal5o .man5a .mar5ti .me2 .mer3c .me5ter .mis1 .mist5i .mon3e .mo3ro .mu5ta .muta5b .ni4c .od2 .odd5 .of5te .or5ato .or3c .or1d .or3t .os3 .os4tl .oth3 .out3 .ped5al .pe5te .pe5tit .pi4e .pio5n .pi2t .pre3m .ra4c .ran4t .ratio5na .ree2 .re5mit .res2 .re5stat .ri4g .rit5u .ro4q .ros5t .row5d .ru4d .sci3e .self5 .sell5 .se2n .se5rie .sh2 .si2 .sing4 .st4 .sta5bl .sy2 .ta4 .te4 .ten5an .th2 .ti2 .til4 .tim5o5 .ting4 .tin5k .ton4a .to4p .top5i .tou5s .trib5ut .un1a .un3ce .under5 .un1e .un5k .un5o .un3u .up3 .ure3 .us5a .ven4de .ve5ra .wil5i .ye4 4ab. a5bal a5ban abe2 ab5erd abi5a ab5it5ab ab5lat ab5o5liz 4abr ab5rog ab3ul a4car ac5ard ac5aro a5ceou ac1er a5chet 4a2ci a3cie ac1in a3cio ac5rob act5if ac3ul ac4um a2d ad4din ad5er. 2adi a3dia ad3ica adi4er a3dio a3dit a5diu ad4le ad3ow ad5ran ad4su 4adu a3duc ad5um ae4r aeri4e a2f aff4 a4gab aga4n ag5ell age4o 4ageu ag1i 4ag4l ag1n a2go 3agog ag3oni a5guer ag5ul a4gy a3ha a3he ah4l a3ho ai2 a5ia a3ic. ai5ly a4i4n ain5in ain5o ait5en a1j ak1en al5ab al3ad a4lar 4aldi 2ale al3end a4lenti a5le5o al1i al4ia. ali4e al5lev 4allic 4alm a5log. a4ly. 4alys 5a5lyst 5alyt 3alyz 4ama am5ab am3ag ama5ra am5asc a4matis a4m5ato am5era am3ic am5if am5ily am1in ami4no a2mo a5mon amor5i amp5en a2n an3age 3analy a3nar an3arc anar4i a3nati 4and ande4s an3dis an1dl an4dow a5nee a3nen an5est. a3neu 2ang ang5ie an1gl a4n1ic a3nies an3i3f an4ime a5nimi a5nine an3io a3nip an3ish an3it a3niu an4kli 5anniz ano4 an5ot anoth5 an2sa an4sco an4sn an2sp ans3po an4st an4sur antal4 an4tie 4anto an2tr an4tw an3ua an3ul a5nur 4ao apar4 ap5at ap5ero a3pher 4aphi a4pilla ap5illar ap3in ap3ita a3pitu a2pl apoc5 ap5ola apor5i apos3t aps5es a3pu aque5 2a2r ar3act a5rade ar5adis ar3al a5ramete aran4g ara3p ar4at a5ratio ar5ativ a5rau ar5av4 araw4 arbal4 ar4chan ar5dine ar4dr ar5eas a3ree ar3ent a5ress ar4fi ar4fl ar1i ar5ial ar3ian a3riet ar4im ar5inat ar3io ar2iz ar2mi ar5o5d a5roni a3roo ar2p ar3q arre4 ar4sa ar2sh 4as. as4ab as3ant ashi4 a5sia. a3sib a3sic 5a5si4t ask3i as4l a4soc as5ph as4sh as3ten as1tr asur5a a2ta at3abl at5ac at3alo at5ap ate5c at5ech at3ego at3en. at3era ater5n a5terna at3est at5ev 4ath ath5em a5then at4ho ath5om 4ati. a5tia at5i5b at1ic at3if ation5ar at3itu a4tog a2tom at5omiz a4top a4tos a1tr at5rop at4sk at4tag at5te at4th a2tu at5ua at5ue at3ul at3ura a2ty au4b augh3 au3gu au4l2 aun5d au3r au5sib aut5en au1th a2va av3ag a5van ave4no av3era av5ern av5ery av1i avi4er av3ig av5oc a1vor 3away aw3i aw4ly aws4 ax4ic ax4id ay5al aye4 ays4 azi4er azz5i 5ba. bad5ger ba4ge bal1a ban5dag ban4e ban3i barbi5 bari4a bas4si 1bat ba4z 2b1b b2be b3ber bbi4na 4b1d 4be. beak4 beat3 4be2d be3da be3de be3di be3gi be5gu 1bel be1li be3lo 4be5m be5nig be5nu 4bes4 be3sp be5str 3bet bet5iz be5tr be3tw be3w be5yo 2bf 4b3h bi2b bi4d 3bie bi5en bi4er 2b3if 1bil bi3liz bina5r4 bin4d bi5net bi3ogr bi5ou bi2t 3bi3tio bi3tr 3bit5ua b5itz b1j bk4 b2l2 blath5 b4le. blen4 5blesp b3lis b4lo blun4t 4b1m 4b3n bne5g 3bod bod3i bo4e bol3ic bom4bi bon4a bon5at 3boo 5bor. 4b1ora bor5d 5bore 5bori 5bos4 b5ota both5 bo4to bound3 4bp 4brit broth3 2b5s2 bsor4 2bt bt4l b4to b3tr buf4fer bu4ga bu3li bumi4 bu4n bunt4i bu3re bus5ie buss4e 5bust 4buta 3butio b5uto b1v 4b5w 5by. bys4 1ca cab3in ca1bl cach4 ca5den 4cag4 2c5ah ca3lat cal4la call5in 4calo can5d can4e can4ic can5is can3iz can4ty cany4 ca5per car5om cast5er cas5tig 4casy ca4th 4cativ cav5al c3c ccha5 cci4a ccompa5 ccon4 ccou3t 2ce. 4ced. 4ceden 3cei 5cel. 3cell 1cen 3cenc 2cen4e 4ceni 3cent 3cep ce5ram 4cesa 3cessi ces5si5b ces5t cet4 c5e4ta cew4 2ch 4ch. 4ch3ab 5chanic ch5a5nis che2 cheap3 4ched che5lo 3chemi ch5ene ch3er. ch3ers 4ch1in 5chine. ch5iness 5chini 5chio 3chit chi2z 3cho2 ch4ti 1ci 3cia ci2a5b cia5r ci5c 4cier 5cific. 4cii ci4la 3cili 2cim 2cin c4ina 3cinat cin3em c1ing c5ing. 5cino cion4 4cipe ci3ph 4cipic 4cista 4cisti 2c1it cit3iz 5ciz ck1 ck3i 1c4l4 4clar c5laratio 5clare cle4m 4clic clim4 cly4 c5n 1co co5ag coe2 2cog co4gr coi4 co3inc col5i 5colo col3or com5er con4a c4one con3g con5t co3pa cop3ic co4pl 4corb coro3n cos4e cov1 cove4 cow5a coz5e co5zi c1q cras5t 5crat. 5cratic cre3at 5cred 4c3reta cre4v cri2 cri5f c4rin cris4 5criti cro4pl crop5o cros4e cru4d 4c3s2 2c1t cta4b ct5ang c5tant c2te c3ter c4ticu ctim3i ctu4r c4tw cud5 c4uf c4ui cu5ity 5culi cul4tis 3cultu cu2ma c3ume cu4mi 3cun cu3pi cu5py cur5a4b cu5ria 1cus cuss4i 3c4ut cu4tie 4c5utiv 4cutr 1cy cze4 1d2a 5da. 2d3a4b dach4 4daf 2dag da2m2 dan3g dard5 dark5 4dary 3dat 4dativ 4dato 5dav4 dav5e 5day d1b d5c d1d4 2de. deaf5 deb5it de4bon decan4 de4cil de5com 2d1ed 4dee. de5if deli4e del5i5q de5lo d4em 5dem. 3demic dem5ic. de5mil de4mons demor5 1den de4nar de3no denti5f de3nu de1p de3pa depi4 de2pu d3eq d4erh 5derm dern5iz der5s des2 d2es. de1sc de2s5o des3ti de3str de4su de1t de2to de1v dev3il 4dey 4d1f d4ga d3ge4t dg1i d2gy d1h2 5di. 1d4i3a dia5b di4cam d4ice 3dict 3did 5di3en d1if di3ge di4lato d1in 1dina 3dine. 5dini di5niz 1dio dio5g di4pl dir2 di1re dirt5i dis1 5disi d4is3t d2iti 1di1v d1j d5k2 4d5la 3dle. 3dled 3dles. 4dless 2d3lo 4d5lu 2dly d1m 4d1n4 1do 3do. do5de 5doe 2d5of d4og do4la doli4 do5lor dom5iz do3nat doni4 doo3d dop4p d4or 3dos 4d5out do4v 3dox d1p 1dr drag5on 4drai dre4 drea5r 5dren dri4b dril4 dro4p 4drow 5drupli 4dry 2d1s2 ds4p d4sw d4sy d2th 1du d1u1a du2c d1uca duc5er 4duct. 4ducts du5el du4g d3ule dum4be du4n 4dup du4pe d1v d1w d2y 5dyn dy4se dys5p e1a4b e3act ead1 ead5ie ea4ge ea5ger ea4l eal5er eal3ou eam3er e5and ear3a ear4c ear5es ear4ic ear4il ear5k ear2t eart3e ea5sp e3ass east3 ea2t eat5en eath3i e5atif e4a3tu ea2v eav3en eav5i eav5o 2e1b e4bel. e4bels e4ben e4bit e3br e4cad ecan5c ecca5 e1ce ec5essa ec2i e4cib ec5ificat ec5ifie ec5ify ec3im eci4t e5cite e4clam e4clus e2col e4comm e4compe e4conc e2cor ec3ora eco5ro e1cr e4crem ec4tan ec4te e1cu e4cul ec3ula 2e2da 4ed3d e4d1er ede4s 4edi e3dia ed3ib ed3ica ed3im ed1it edi5z 4edo e4dol edon2 e4dri e4dul ed5ulo ee2c eed3i ee2f eel3i ee4ly ee2m ee4na ee4p1 ee2s4 eest4 ee4ty e5ex e1f e4f3ere 1eff e4fic 5efici efil4 e3fine ef5i5nite 3efit efor5es e4fuse. 4egal eger4 eg5ib eg4ic eg5ing e5git5 eg5n e4go. e4gos eg1ul e5gur 5egy e1h4 eher4 ei2 e5ic ei5d eig2 ei5gl e3imb e3inf e1ing e5inst eir4d eit3e ei3th e5ity e1j e4jud ej5udi eki4n ek4la e1la e4la. e4lac elan4d el5ativ e4law elaxa4 e3lea el5ebra 5elec e4led el3ega e5len e4l1er e1les el2f el2i e3libe e4l5ic. el3ica e3lier el5igib e5lim e4l3ing e3lio e2lis el5ish e3liv3 4ella el4lab ello4 e5loc el5og el3op. el2sh el4ta e5lud el5ug e4mac e4mag e5man em5ana em5b e1me e2mel e4met em3ica emi4e em5igra em1in2 em5ine em3i3ni e4mis em5ish e5miss em3iz 5emniz emo4g emoni5o em3pi e4mul em5ula emu3n e3my en5amo e4nant ench4er en3dic e5nea e5nee en3em en5ero en5esi en5est en3etr e3new en5ics e5nie e5nil e3nio en3ish en3it e5niu 5eniz 4enn 4eno eno4g e4nos en3ov en4sw ent5age 4enthes en3ua en5uf e3ny. 4en3z e5of eo2g e4oi4 e3ol eop3ar e1or eo3re eo5rol eos4 e4ot eo4to e5out e5ow e2pa e3pai ep5anc e5pel e3pent ep5etitio ephe4 e4pli e1po e4prec ep5reca e4pred ep3reh e3pro e4prob ep4sh ep5ti5b e4put ep5uta e1q equi3l e4q3ui3s er1a era4b 4erand er3ar 4erati. 2erb er4bl er3ch er4che 2ere. e3real ere5co ere3in er5el. er3emo er5ena er5ence 4erene er3ent ere4q er5ess er3est eret4 er1h er1i e1ria4 5erick e3rien eri4er er3ine e1rio 4erit er4iu eri4v e4riva er3m4 er4nis 4ernit 5erniz er3no 2ero er5ob e5roc ero4r er1ou er1s er3set ert3er 4ertl er3tw 4eru eru4t 5erwau e1s4a e4sage. e4sages es2c e2sca es5can e3scr es5cu e1s2e e2sec es5ecr es5enc e4sert. e4serts e4serva 4esh e3sha esh5en e1si e2sic e2sid es5iden es5igna e2s5im es4i4n esis4te esi4u e5skin es4mi e2sol es3olu e2son es5ona e1sp es3per es5pira es4pre 2ess es4si4b estan4 es3tig es5tim 4es2to e3ston 2estr e5stro estruc5 e2sur es5urr es4w eta4b eten4d e3teo ethod3 et1ic e5tide etin4 eti4no e5tir e5titio et5itiv 4etn et5ona e3tra e3tre et3ric et5rif et3rog et5ros et3ua et5ym et5z 4eu e5un e3up eu3ro eus4 eute4 euti5l eu5tr eva2p5 e2vas ev5ast e5vea ev3ell evel3o e5veng even4i ev1er e5verb e1vi ev3id evi4l e4vin evi4v e5voc e5vu e1wa e4wag e5wee e3wh ewil5 ew3ing e3wit 1exp 5eyc 5eye. eys4 1fa fa3bl fab3r fa4ce 4fag fain4 fall5e 4fa4ma fam5is 5far far5th fa3ta fa3the 4fato fault5 4f5b 4fd 4fe. feas4 feath3 fe4b 4feca 5fect 2fed fe3li fe4mo fen2d fend5e fer1 5ferr fev4 4f1f f4fes f4fie f5fin. f2f5is f4fly f2fy 4fh 1fi fi3a 2f3ic. 4f3ical f3ican 4ficate f3icen fi3cer fic4i 5ficia 5ficie 4fics fi3cu fi5del fight5 fil5i fill5in 4fily 2fin 5fina fin2d5 fi2ne f1in3g fin4n fis4ti f4l2 f5less flin4 flo3re f2ly5 4fm 4fn 1fo 5fon fon4de fon4t fo2r fo5rat for5ay fore5t for4i fort5a fos5 4f5p fra4t f5rea fres5c fri2 fril4 frol5 2f3s 2ft f4to f2ty 3fu fu5el 4fug fu4min fu5ne fu3ri fusi4 fus4s 4futa 1fy 1ga gaf4 5gal. 3gali ga3lo 2gam ga5met g5amo gan5is ga3niz gani5za 4gano gar5n4 gass4 gath3 4gativ 4gaz g3b gd4 2ge. 2ged geez4 gel4in ge5lis ge5liz 4gely 1gen ge4nat ge5niz 4geno 4geny 1geo ge3om g4ery 5gesi geth5 4geto ge4ty ge4v 4g1g2 g2ge g3ger gglu5 ggo4 gh3in gh5out gh4to 5gi. 1gi4a gia5r g1ic 5gicia g4ico gien5 5gies. gil4 g3imen 3g4in. gin5ge 5g4ins 5gio 3gir gir4l g3isl gi4u 5giv 3giz gl2 gla4 glad5i 5glas 1gle gli4b g3lig 3glo glo3r g1m g4my gn4a g4na. gnet4t g1ni g2nin g4nio g1no g4non 1go 3go. gob5 5goe 3g4o4g go3is gon2 4g3o3na gondo5 go3ni 5goo go5riz gor5ou 5gos. gov1 g3p 1gr 4grada g4rai gran2 5graph. g5rapher 5graphic 4graphy 4gray gre4n 4gress. 4grit g4ro gruf4 gs2 g5ste gth3 gu4a 3guard 2gue 5gui5t 3gun 3gus 4gu4t g3w 1gy 2g5y3n gy5ra h3ab4l hach4 hae4m hae4t h5agu ha3la hala3m ha4m han4ci han4cy 5hand. han4g hang5er hang5o h5a5niz han4k han4te hap3l hap5t ha3ran ha5ras har2d hard3e har4le harp5en har5ter has5s haun4 5haz haz3a h1b 1head 3hear he4can h5ecat h4ed he5do5 he3l4i hel4lis hel4ly h5elo hem4p he2n hena4 hen5at heo5r hep5 h4era hera3p her4ba here5a h3ern h5erou h3ery h1es he2s5p he4t het4ed heu4 h1f h1h hi5an hi4co high5 h4il2 himer4 h4ina hion4e hi4p hir4l hi3ro hir4p hir4r his3el his4s hith5er hi2v 4hk 4h1l4 hlan4 h2lo hlo3ri 4h1m hmet4 2h1n h5odiz h5ods ho4g hoge4 hol5ar 3hol4e ho4ma home3 hon4a ho5ny 3hood hoon4 hor5at ho5ris hort3e ho5ru hos4e ho5sen hos1p 1hous house3 hov5el 4h5p 4hr4 hree5 hro5niz hro3po 4h1s2 h4sh h4tar ht1en ht5es h4ty hu4g hu4min hun5ke hun4t hus3t4 hu4t h1w h4wart hy3pe hy3ph hy2s 2i1a i2al iam4 iam5ete i2an 4ianc ian3i 4ian4t ia5pe iass4 i4ativ ia4tric i4atu ibe4 ib3era ib5ert ib5ia ib3in ib5it. ib5ite i1bl ib3li i5bo i1br i2b5ri i5bun 4icam 5icap 4icar i4car. i4cara icas5 i4cay iccu4 4iceo 4ich 2ici i5cid ic5ina i2cip ic3ipa i4cly i2c5oc 4i1cr 5icra i4cry ic4te ictu2 ic4t3ua ic3ula ic4um ic5uo i3cur 2id i4dai id5anc id5d ide3al ide4s i2di id5ian idi4ar i5die id3io idi5ou id1it id5iu i3dle i4dom id3ow i4dr i2du id5uo 2ie4 ied4e 5ie5ga ield3 ien5a4 ien4e i5enn i3enti i1er. i3esc i1est i3et 4if. if5ero iff5en if4fr 4ific. i3fie i3fl 4ift 2ig iga5b ig3era ight3i 4igi i3gib ig3il ig3in ig3it i4g4l i2go ig3or ig5ot i5gre igu5i ig1ur i3h 4i5i4 i3j 4ik i1la il3a4b i4lade i2l5am ila5ra i3leg il1er ilev4 il5f il1i il3ia il2ib il3io il4ist 2ilit il2iz ill5ab 4iln il3oq il4ty il5ur il3v i4mag im3age ima5ry imenta5r 4imet im1i im5ida imi5le i5mini 4imit im4ni i3mon i2mu im3ula 2in. i4n3au 4inav incel4 in3cer 4ind in5dling 2ine i3nee iner4ar i5ness 4inga 4inge in5gen 4ingi in5gling 4ingo 4ingu 2ini i5ni. i4nia in3io in1is i5nite. 5initio in3ity 4ink 4inl 2inn 2i1no i4no4c ino4s i4not 2ins in3se insur5a 2int. 2in4th in1u i5nus 4iny 2io 4io. ioge4 io2gr i1ol io4m ion3at ion4ery ion3i io5ph ior3i i4os io5th i5oti io4to i4our 2ip ipe4 iphras4 ip3i ip4ic ip4re4 ip3ul i3qua iq5uef iq3uid iq3ui3t 4ir i1ra ira4b i4rac ird5e ire4de i4ref i4rel4 i4res ir5gi ir1i iri5de ir4is iri3tu 5i5r2iz ir4min iro4g 5iron. ir5ul 2is. is5ag is3ar isas5 2is1c is3ch 4ise is3er 3isf is5han is3hon ish5op is3ib isi4d i5sis is5itiv 4is4k islan4 4isms i2so iso5mer is1p is2pi is4py 4is1s is4sal issen4 is4ses is4ta. is1te is1ti ist4ly 4istral i2su is5us 4ita. ita4bi i4tag 4ita5m i3tan i3tat 2ite it3era i5teri it4es 2ith i1ti 4itia 4i2tic it3ica 5i5tick it3ig it5ill i2tim 2itio 4itis i4tism i2t5o5m 4iton i4tram it5ry 4itt it3uat i5tud it3ul 4itz. i1u 2iv iv3ell iv3en. i4v3er. i4vers. iv5il. iv5io iv1it i5vore iv3o3ro i4v3ot 4i5w ix4o 4iy 4izar izi4 5izont 5ja jac4q ja4p 1je jer5s 4jestie 4jesty jew3 jo4p 5judg 3ka. k3ab k5ag kais4 kal4 k1b k2ed 1kee ke4g ke5li k3en4d k1er kes4 k3est. ke4ty k3f kh4 k1i 5ki. 5k2ic k4ill kilo5 k4im k4in. kin4de k5iness kin4g ki4p kis4 k5ish kk4 k1l 4kley 4kly k1m k5nes 1k2no ko5r kosh4 k3ou kro5n 4k1s2 k4sc ks4l k4sy k5t k1w lab3ic l4abo laci4 l4ade la3dy lag4n lam3o 3land lan4dl lan5et lan4te lar4g lar3i las4e la5tan 4lateli 4lativ 4lav la4v4a 2l1b lbin4 4l1c2 lce4 l3ci 2ld l2de ld4ere ld4eri ldi4 ld5is l3dr l4dri le2a le4bi left5 5leg. 5legg le4mat lem5atic 4len. 3lenc 5lene. 1lent le3ph le4pr lera5b ler4e 3lerg 3l4eri l4ero les2 le5sco 5lesq 3less 5less. l3eva lev4er. lev4era lev4ers 3ley 4leye 2lf l5fr 4l1g4 l5ga lgar3 l4ges lgo3 2l3h li4ag li2am liar5iz li4as li4ato li5bi 5licio li4cor 4lics 4lict. l4icu l3icy l3ida lid5er 3lidi lif3er l4iff li4fl 5ligate 3ligh li4gra 3lik 4l4i4l lim4bl lim3i li4mo l4im4p l4ina 1l4ine lin3ea lin3i link5er li5og 4l4iq lis4p l1it l2it. 5litica l5i5tics liv3er l1iz 4lj lka3 l3kal lka4t l1l l4law l2le l5lea l3lec l3leg l3lel l3le4n l3le4t ll2i l2lin4 l5lina ll4o lloqui5 ll5out l5low 2lm l5met lm3ing l4mod lmon4 2l1n2 3lo. lob5al lo4ci 4lof 3logic l5ogo 3logu lom3er 5long lon4i l3o3niz lood5 5lope. lop3i l3opm lora4 lo4rato lo5rie lor5ou 5los. los5et 5losophiz 5losophy los4t lo4ta loun5d 2lout 4lov 2lp lpa5b l3pha l5phi lp5ing l3pit l4pl l5pr 4l1r 2l1s2 l4sc l2se l4sie 4lt lt5ag ltane5 l1te lten4 ltera4 lth3i l5ties. ltis4 l1tr ltu2 ltur3a lu5a lu3br luch4 lu3ci lu3en luf4 lu5id lu4ma 5lumi l5umn. 5lumnia lu3o luo3r 4lup luss4 lus3te 1lut l5ven l5vet4 2l1w 1ly 4lya 4lyb ly5me ly3no 2lys4 l5yse 1ma 2mab ma2ca ma5chine ma4cl mag5in 5magn 2mah maid5 4mald ma3lig ma5lin mal4li mal4ty 5mania man5is man3iz 4map ma5rine. ma5riz mar4ly mar3v ma5sce mas4e mas1t 5mate math3 ma3tis 4matiza 4m1b mba4t5 m5bil m4b3ing mbi4v 4m5c 4me. 2med 4med. 5media me3die m5e5dy me2g mel5on mel4t me2m mem1o3 1men men4a men5ac men4de 4mene men4i mens4 mensu5 3ment men4te me5on m5ersa 2mes 3mesti me4ta met3al me1te me5thi m4etr 5metric me5trie me3try me4v 4m1f 2mh 5mi. mi3a mid4a mid4g mig4 3milia m5i5lie m4ill min4a 3mind m5inee m4ingl min5gli m5ingly min4t m4inu miot4 m2is mis4er. mis5l mis4ti m5istry 4mith m2iz 4mk 4m1l m1m mma5ry 4m1n mn4a m4nin mn4o 1mo 4mocr 5mocratiz mo2d1 mo4go mois2 moi5se 4mok mo5lest mo3me mon5et mon5ge moni3a mon4ism mon4ist mo3niz monol4 mo3ny. mo2r 4mora. mos2 mo5sey mo3sp moth3 m5ouf 3mous mo2v 4m1p mpara5 mpa5rab mpar5i m3pet mphas4 m2pi mpi4a mp5ies m4p1in m5pir mp5is mpo3ri mpos5ite m4pous mpov5 mp4tr m2py 4m3r 4m1s2 m4sh m5si 4mt 1mu mula5r4 5mult multi3 3mum mun2 4mup mu4u 4mw 1na 2n1a2b n4abu 4nac. na4ca n5act nag5er. nak4 na4li na5lia 4nalt na5mit n2an nanci4 nan4it nank4 nar3c 4nare nar3i nar4l n5arm n4as nas4c nas5ti n2at na3tal nato5miz n2au nau3se 3naut nav4e 4n1b4 ncar5 n4ces. n3cha n5cheo n5chil n3chis nc1in nc4it ncour5a n1cr n1cu n4dai n5dan n1de nd5est. ndi4b n5d2if n1dit n3diz n5duc ndu4r nd2we 2ne. n3ear ne2b neb3u ne2c 5neck 2ned ne4gat neg5ativ 5nege ne4la nel5iz ne5mi ne4mo 1nen 4nene 3neo ne4po ne2q n1er nera5b n4erar n2ere n4er5i ner4r 1nes 2nes. 4nesp 2nest 4nesw 3netic ne4v n5eve ne4w n3f n4gab n3gel nge4n4e n5gere n3geri ng5ha n3gib ng1in n5git n4gla ngov4 ng5sh n1gu n4gum n2gy 4n1h4 nha4 nhab3 nhe4 3n4ia ni3an ni4ap ni3ba ni4bl ni4d ni5di ni4er ni2fi ni5ficat n5igr nik4 n1im ni3miz n1in 5nine. nin4g ni4o 5nis. nis4ta n2it n4ith 3nitio n3itor ni3tr n1j 4nk2 n5kero n3ket nk3in n1kl 4n1l n5m nme4 nmet4 4n1n2 nne4 nni3al nni4v nob4l no3ble n5ocl 4n3o2d 3noe 4nog noge4 nois5i no5l4i 5nologis 3nomic n5o5miz no4mo no3my no4n non4ag non5i n5oniz 4nop 5nop5o5li nor5ab no4rary 4nosc nos4e nos5t no5ta 1nou 3noun nov3el3 nowl3 n1p4 npi4 npre4c n1q n1r nru4 2n1s2 ns5ab nsati4 ns4c n2se n4s3es nsid1 nsig4 n2sl ns3m n4soc ns4pe n5spi nsta5bl n1t nta4b nter3s nt2i n5tib nti4er nti2f n3tine n4t3ing nti4p ntrol5li nt4s ntu3me nu1a nu4d nu5en nuf4fe n3uin 3nu3it n4um nu1me n5umi 3nu4n n3uo nu3tr n1v2 n1w4 nym4 nyp4 4nz n3za 4oa oad3 o5a5les oard3 oas4e oast5e oat5i ob3a3b o5bar obe4l o1bi o2bin ob5ing o3br ob3ul o1ce och4 o3chet ocif3 o4cil o4clam o4cod oc3rac oc5ratiz ocre3 5ocrit octor5a oc3ula o5cure od5ded od3ic odi3o o2do4 odor3 od5uct. od5ucts o4el o5eng o3er oe4ta o3ev o2fi of5ite ofit4t o2g5a5r og5ativ o4gato o1ge o5gene o5geo o4ger o3gie 1o1gis og3it o4gl o5g2ly 3ogniz o4gro ogu5i 1ogy 2ogyn o1h2 ohab5 oi2 oic3es oi3der oiff4 oig4 oi5let o3ing oint5er o5ism oi5son oist5en oi3ter o5j 2ok o3ken ok5ie o1la o4lan olass4 ol2d old1e ol3er o3lesc o3let ol4fi ol2i o3lia o3lice ol5id. o3li4f o5lil ol3ing o5lio o5lis. ol3ish o5lite o5litio o5liv olli4e ol5ogiz olo4r ol5pl ol2t ol3ub ol3ume ol3un o5lus ol2v o2ly om5ah oma5l om5atiz om2be om4bl o2me om3ena om5erse o4met om5etry o3mia om3ic. om3ica o5mid om1in o5mini 5ommend omo4ge o4mon om3pi ompro5 o2n on1a on4ac o3nan on1c 3oncil 2ond on5do o3nen on5est on4gu on1ic o3nio on1is o5niu on3key on4odi on3omy on3s onspi4 onspir5a onsu4 onten4 on3t4i ontif5 on5um onva5 oo2 ood5e ood5i oo4k oop3i o3ord oost5 o2pa ope5d op1er 3opera 4operag 2oph o5phan o5pher op3ing o3pit o5pon o4posi o1pr op1u opy5 o1q o1ra o5ra. o4r3ag or5aliz or5ange ore5a o5real or3ei ore5sh or5est. orew4 or4gu 4o5ria or3ica o5ril or1in o1rio or3ity o3riu or2mi orn2e o5rof or3oug or5pe 3orrh or4se ors5en orst4 or3thi or3thy or4ty o5rum o1ry os3al os2c os4ce o3scop 4oscopi o5scr os4i4e os5itiv os3ito os3ity osi4u os4l o2so os4pa os4po os2ta o5stati os5til os5tit o4tan otele4g ot3er. ot5ers o4tes 4oth oth5esi oth3i4 ot3ic. ot5ica o3tice o3tif o3tis oto5s ou2 ou3bl ouch5i ou5et ou4l ounc5er oun2d ou5v ov4en over4ne over3s ov4ert o3vis oviti4 o5v4ol ow3der ow3el ow5est ow1i own5i o4wo oy1a 1pa pa4ca pa4ce pac4t p4ad 5pagan p3agat p4ai pain4 p4al pan4a pan3el pan4ty pa3ny pa1p pa4pu para5bl par5age par5di 3pare par5el p4a4ri par4is pa2te pa5ter 5pathic pa5thy pa4tric pav4 3pay 4p1b pd4 4pe. 3pe4a pear4l pe2c 2p2ed 3pede 3pedi pedia4 ped4ic p4ee pee4d pek4 pe4la peli4e pe4nan p4enc pen4th pe5on p4era. pera5bl p4erag p4eri peri5st per4mal perme5 p4ern per3o per3ti pe5ru per1v pe2t pe5ten pe5tiz 4pf 4pg 4ph. phar5i phe3no ph4er ph4es. ph1ic 5phie ph5ing 5phisti 3phiz ph2l 3phob 3phone 5phoni pho4r 4phs ph3t 5phu 1phy pi3a pian4 pi4cie pi4cy p4id p5ida pi3de 5pidi 3piec pi3en pi4grap pi3lo pi2n p4in. pind4 p4ino 3pi1o pion4 p3ith pi5tha pi2tu 2p3k2 1p2l2 3plan plas5t pli3a pli5er 4plig pli4n ploi4 plu4m plum4b 4p1m 2p3n po4c 5pod. po5em po3et5 5po4g poin2 5point poly5t po4ni po4p 1p4or po4ry 1pos pos1s p4ot po4ta 5poun 4p1p ppa5ra p2pe p4ped p5pel p3pen p3per p3pet ppo5site pr2 pray4e 5preci pre5co pre3em pref5ac pre4la pre3r p3rese 3press pre5ten pre3v 5pri4e prin4t3 pri4s pris3o p3roca prof5it pro3l pros3e pro1t 2p1s2 p2se ps4h p4sib 2p1t pt5a4b p2te p2th pti3m ptu4r p4tw pub3 pue4 puf4 pul3c pu4m pu2n pur4r 5pus pu2t 5pute put3er pu3tr put4ted put4tin p3w qu2 qua5v 2que. 3quer 3quet 2rab ra3bi rach4e r5acl raf5fi raf4t r2ai ra4lo ram3et r2ami rane5o ran4ge r4ani ra5no rap3er 3raphy rar5c rare4 rar5ef 4raril r2as ration4 rau4t ra5vai rav3el ra5zie r1b r4bab r4bag rbi2 rbi4f r2bin r5bine rb5ing. rb4o r1c r2ce rcen4 r3cha rch4er r4ci4b rc4it rcum3 r4dal rd2i rdi4a rdi4er rdin4 rd3ing 2re. re1al re3an re5arr 5reav re4aw r5ebrat rec5oll rec5ompe re4cre 2r2ed re1de re3dis red5it re4fac re2fe re5fer. re3fi re4fy reg3is re5it re1li re5lu r4en4ta ren4te re1o re5pin re4posi re1pu r1er4 r4eri rero4 re5ru r4es. re4spi ress5ib res2t re5stal re3str re4ter re4ti4z re3tri reu2 re5uti rev2 re4val rev3el r5ev5er. re5vers re5vert re5vil rev5olu re4wh r1f rfu4 r4fy rg2 rg3er r3get r3gic rgi4n rg3ing r5gis r5git r1gl rgo4n r3gu rh4 4rh. 4rhal ri3a ria4b ri4ag r4ib rib3a ric5as r4ice 4rici 5ricid ri4cie r4ico rid5er ri3enc ri3ent ri1er ri5et rig5an 5rigi ril3iz 5riman rim5i 3rimo rim4pe r2ina 5rina. rin4d rin4e rin4g ri1o 5riph riph5e ri2pl rip5lic r4iq r2is r4is. ris4c r3ish ris4p ri3ta3b r5ited. rit5er. rit5ers rit3ic ri2tu rit5ur riv5el riv3et riv3i r3j r3ket rk4le rk4lin r1l rle4 r2led r4lig r4lis rl5ish r3lo4 r1m rma5c r2me r3men rm5ers rm3ing r4ming. r4mio r3mit r4my r4nar r3nel r4ner r5net r3ney r5nic r1nis4 r3nit r3niv rno4 r4nou r3nu rob3l r2oc ro3cr ro4e ro1fe ro5fil rok2 ro5ker 5role. rom5ete rom4i rom4p ron4al ron4e ro5n4is ron4ta 1room 5root ro3pel rop3ic ror3i ro5ro ros5per ros4s ro4the ro4ty ro4va rov5el rox5 r1p r4pea r5pent rp5er. r3pet rp4h4 rp3ing r3po r1r4 rre4c rre4f r4reo rre4st rri4o rri4v rron4 rros4 rrys4 4rs2 r1sa rsa5ti rs4c r2se r3sec rse4cr rs5er. rs3es rse5v2 r1sh r5sha r1si r4si4b rson3 r1sp r5sw rtach4 r4tag r3teb rten4d rte5o r1ti rt5ib rti4d r4tier r3tig rtil3i rtil4l r4tily r4tist r4tiv r3tri rtroph4 rt4sh ru3a ru3e4l ru3en ru4gl ru3in rum3pl ru2n runk5 run4ty r5usc ruti5n rv4e rvel4i r3ven rv5er. r5vest r3vey r3vic rvi4v r3vo r1w ry4c 5rynge ry3t sa2 2s1ab 5sack sac3ri s3act 5sai salar4 sal4m sa5lo sal4t 3sanc san4de s1ap sa5ta 5sa3tio sat3u sau4 sa5vor 5saw 4s5b scan4t5 sca4p scav5 s4ced 4scei s4ces sch2 s4cho 3s4cie 5scin4d scle5 s4cli scof4 4scopy scour5a s1cu 4s5d 4se. se4a seas4 sea5w se2c3o 3sect 4s4ed se4d4e s5edl se2g seg3r 5sei se1le 5self 5selv 4seme se4mol sen5at 4senc sen4d s5ened sen5g s5enin 4sentd 4sentl sep3a3 4s1er. s4erl ser4o 4servo s1e4s se5sh ses5t 5se5um 5sev sev3en sew4i 5sex 4s3f 2s3g s2h 2sh. sh1er 5shev sh1in sh3io 3ship shiv5 sho4 sh5old shon3 shor4 short5 4shw si1b s5icc 3side. 5sides 5sidi si5diz 4signa sil4e 4sily 2s1in s2ina 5sine. s3ing 1sio 5sion sion5a si2r sir5a 1sis 3sitio 5siu 1siv 5siz sk2 4ske s3ket sk5ine sk5ing s1l2 s3lat s2le slith5 2s1m s3ma small3 sman3 smel4 s5men 5smith smol5d4 s1n4 1so so4ce soft3 so4lab sol3d2 so3lic 5solv 3som 3s4on. sona4 son4g s4op 5sophic s5ophiz s5ophy sor5c sor5d 4sov so5vi 2spa 5spai spa4n spen4d 2s5peo 2sper s2phe 3spher spho5 spil4 sp5ing 4spio s4ply s4pon spor4 4spot squal4l s1r 2ss s1sa ssas3 s2s5c s3sel s5seng s4ses. s5set s1si s4sie ssi4er ss5ily s4sl ss4li s4sn sspend4 ss2t ssur5a ss5w 2st. s2tag s2tal stam4i 5stand s4ta4p 5stat. s4ted stern5i s5tero ste2w stew5a s3the st2i s4ti. s5tia s1tic 5stick s4tie s3tif st3ing 5stir s1tle 5stock stom3a 5stone s4top 3store st4r s4trad 5stratu s4tray s4trid 4stry 4st3w s2ty 1su su1al su4b3 su2g3 su5is suit3 s4ul su2m sum3i su2n su2r 4sv sw2 4swo s4y 4syc 3syl syn5o sy5rin 1ta 3ta. 2tab ta5bles 5taboliz 4taci ta5do 4taf4 tai5lo ta2l ta5la tal5en tal3i 4talk tal4lis ta5log ta5mo tan4de tanta3 ta5per ta5pl tar4a 4tarc 4tare ta3riz tas4e ta5sy 4tatic ta4tur taun4 tav4 2taw tax4is 2t1b 4tc t4ch tch5et 4t1d 4te. tead4i 4teat tece4 5tect 2t1ed te5di 1tee teg4 te5ger te5gi 3tel. teli4 5tels te2ma2 tem3at 3tenan 3tenc 3tend 4tenes 1tent ten4tag 1teo te4p te5pe ter3c 5ter3d 1teri ter5ies ter3is teri5za 5ternit ter5v 4tes. 4tess t3ess. teth5e 3teu 3tex 4tey 2t1f 4t1g 2th. than4 th2e 4thea th3eas the5at the3is 3thet th5ic. th5ica 4thil 5think 4thl th5ode 5thodic 4thoo thor5it tho5riz 2ths 1tia ti4ab ti4ato 2ti2b 4tick t4ico t4ic1u 5tidi 3tien tif2 ti5fy 2tig 5tigu till5in 1tim 4timp tim5ul 2t1in t2ina 3tine. 3tini 1tio ti5oc tion5ee 5tiq ti3sa 3tise tis4m ti5so tis4p 5tistica ti3tl ti4u 1tiv tiv4a 1tiz ti3za ti3zen 2tl t5la tlan4 3tle. 3tled 3tles. t5let. t5lo 4t1m tme4 2t1n2 1to to3b to5crat 4todo 2tof to2gr to5ic to2ma tom4b to3my ton4ali to3nat 4tono 4tony to2ra to3rie tor5iz tos2 5tour 4tout to3war 4t1p 1tra tra3b tra5ch traci4 trac4it trac4te tras4 tra5ven trav5es5 tre5f tre4m trem5i 5tria tri5ces 5tricia 4trics 2trim tri4v tro5mi tron5i 4trony tro5phe tro3sp tro3v tru5i trus4 4t1s2 t4sc tsh4 t4sw 4t3t2 t4tes t5to ttu4 1tu tu1a tu3ar tu4bi tud2 4tue 4tuf4 5tu3i 3tum tu4nis 2t3up. 3ture 5turi tur3is tur5o tu5ry 3tus 4tv tw4 4t1wa twis4 4two 1ty 4tya 2tyl type3 ty5ph 4tz tz4e 4uab uac4 ua5na uan4i uar5ant uar2d uar3i uar3t u1at uav4 ub4e u4bel u3ber u4bero u1b4i u4b5ing u3ble. u3ca uci4b uc4it ucle3 u3cr u3cu u4cy ud5d ud3er ud5est udev4 u1dic ud3ied ud3ies ud5is u5dit u4don ud4si u4du u4ene uens4 uen4te uer4il 3ufa u3fl ugh3en ug5in 2ui2 uil5iz ui4n u1ing uir4m uita4 uiv3 uiv4er. u5j 4uk u1la ula5b u5lati ulch4 5ulche ul3der ul4e u1len ul4gi ul2i u5lia ul3ing ul5ish ul4lar ul4li4b ul4lis 4ul3m u1l4o 4uls uls5es ul1ti ultra3 4ultu u3lu ul5ul ul5v um5ab um4bi um4bly u1mi u4m3ing umor5o um2p unat4 u2ne un4er u1ni un4im u2nin un5ish uni3v un3s4 un4sw unt3ab un4ter. un4tes unu4 un5y un5z u4ors u5os u1ou u1pe uper5s u5pia up3ing u3pl up3p upport5 upt5ib uptu4 u1ra 4ura. u4rag u4ras ur4be urc4 ur1d ure5at ur4fer ur4fr u3rif uri4fic ur1in u3rio u1rit ur3iz ur2l url5ing. ur4no uros4 ur4pe ur4pi urs5er ur5tes ur3the urti4 ur4tie u3ru 2us u5sad u5san us4ap usc2 us3ci use5a u5sia u3sic us4lin us1p us5sl us5tere us1tr u2su usur4 uta4b u3tat 4ute. 4utel 4uten uten4i 4u1t2i uti5liz u3tine ut3ing ution5a u4tis 5u5tiz u4t1l ut5of uto5g uto5matic u5ton u4tou uts4 u3u uu4m u1v2 uxu3 uz4e 1va 5va. 2v1a4b vac5il vac3u vag4 va4ge va5lie val5o val1u va5mo va5niz va5pi var5ied 3vat 4ve. 4ved veg3 v3el. vel3li ve4lo v4ely ven3om v5enue v4erd 5vere. v4erel v3eren ver5enc v4eres ver3ie vermi4n 3verse ver3th v4e2s 4ves. ves4te ve4te vet3er ve4ty vi5ali 5vian 5vide. 5vided 4v3iden 5vides 5vidi v3if vi5gn vik4 2vil 5vilit v3i3liz v1in 4vi4na v2inc vin5d 4ving vio3l v3io4r vi1ou vi4p vi5ro vis3it vi3so vi3su 4viti vit3r 4vity 3viv 5vo. voi4 3vok vo4la v5ole 5volt 3volv vom5i vor5ab vori4 vo4ry vo4ta 4votee 4vv4 v4y w5abl 2wac wa5ger wag5o wait5 w5al. wam4 war4t was4t wa1te wa5ver w1b wea5rie weath3 wed4n weet3 wee5v wel4l w1er west3 w3ev whi4 wi2 wil2 will5in win4de win4g wir4 3wise with3 wiz5 w4k wl4es wl3in w4no 1wo2 wom1 wo5ven w5p wra4 wri4 writa4 w3sh ws4l ws4pe w5s4t 4wt wy4 x1a xac5e x4ago xam3 x4ap xas5 x3c2 x1e xe4cuto x2ed xer4i xe5ro x1h xhi2 xhil5 xhu4 x3i xi5a xi5c xi5di x4ime xi5miz x3o x4ob x3p xpan4d xpecto5 xpe3d x1t2 x3ti x1u xu3a xx4 y5ac 3yar4 y5at y1b y1c y2ce yc5er y3ch ych4e ycom4 ycot4 y1d y5ee y1er y4erf yes4 ye4t y5gi 4y3h y1i y3la ylla5bl y3lo y5lu ymbol5 yme4 ympa3 yn3chr yn5d yn5g yn5ic 5ynx y1o4 yo5d y4o5g yom4 yo5net y4ons y4os y4ped yper5 yp3i y3po y4poc yp2ta y5pu yra5m yr5ia y3ro yr4r ys4c y3s2e ys3ica ys3io 3ysis y4so yss4 ys1t ys3ta ysur4 y3thin yt3ic y1w za1 z5a2b zar2 4zb 2ze ze4n ze4p z1er ze3ro zet4 2z1i z4il z4is 5zl 4zm 1zo zo4m zo5ol zte4 4z1z2 z4zy .con5gr .de5riva .dri5v4 .eth1y6l1 .eu4ler .ev2 .ever5si5b .ga4s1om1 .ge4ome .ge5ot1 .he3mo1 .he3p6a .he3roe .in5u2t .kil2n3i .ko6r1te1 .le6ices .me4ga1l .met4ala .mim5i2c1 .mi1s4ers .ne6o3f .noe1th .non1e2m .poly1s .post1am .pre1am .rav5en1o .semi5 .sem4ic .semid6 .semip4 .semir4 .sem6is4 .semiv4 .sph6in1 .spin1o .ta5pes1tr .te3legr .to6pog .to2q .un3at5t .un5err5 .vi2c3ar .we2b1l .re1e4c a5bolic a2cabl af6fish am1en3ta5b anal6ys ano5a2c ans5gr ans3v anti1d an3ti1n2 anti1re a4pe5able ar3che5t ar2range as5ymptot ath3er1o1s at6tes. augh4tl au5li5f av3iou back2er. ba6r1onie ba1thy bbi4t be2vie bi5d2if bil2lab bio5m bi1orb bio1rh b1i3tive blan2d1 blin2d1 blon2d2 bor1no5 bo2t1u1l brus4q bus6i2er bus6i2es buss4ing but2ed. but4ted cad5e1m cat1a1s2 4chs. chs3hu chie5vo cig3a3r cin2q cle4ar co6ph1o3n cous2ti cri3tie croc1o1d cro5e2co c2tro3me6c 1cu2r1ance 2d3alone data1b dd5a5b d2d5ib de4als. de5clar1 de2c5lina de3fin3iti de2mos des3ic de2tic dic1aid dif5fra 3di1methy di2ren di2rer 2d1lead 2d1li2e 3do5word dren1a5l drif2t1a d1ri3pleg5 drom3e5d d3tab du2al. du1op1o1l ea4n3ies e3chas edg1l ed1uling eli2t1is e1loa en1dix eo3grap 1e6p3i3neph1 e2r3i4an. e3spac6i eth1y6l1ene 5eu2clid1 feb1rua fermi1o 3fich fit5ted. fla1g6el flow2er. 3fluor gen2cy. ge3o1d ght1we g1lead get2ic. 4g1lish 5glo5bin 1g2nac gnet1ism gno5mo g2n1or. g2noresp 2g1o4n3i1za graph5er. griev1 g1utan hair1s ha2p3ar5r hatch1 hex2a3 hite3sid h3i5pel1a4 hnau3z ho6r1ic. h2t1eou hypo1tha id4ios ifac1et ign4it ignit1er i4jk im3ped3a infra1s2 i5nitely. irre6v3oc i1tesima ith5i2l itin5er5ar janu3a japan1e2s je1re1m 1ke6ling 1ki5netic 1kovian k3sha la4c3i5e lai6n3ess lar5ce1n l3chai l3chil6d1 lead6er. lea4s1a 1lec3ta6b le3g6en2dre 1le1noid lith1o5g ll1fl l2l3ish l5mo3nell lo1bot1o1 lo2ges. load4ed. load6er. l3tea lth5i2ly lue1p 1lunk3er 1lum5bia. 3lyg1a1mi ly5styr ma1la1p m2an. man3u1sc mar1gin1 medi2c med3i3cin medio6c1 me3gran3 m2en. 3mi3da5b 3milita mil2l1ag mil5li5li mi6n3is. mi1n2ut1er mi1n2ut1est m3ma1b 5maph1ro1 5moc1ra1t mo5e2las mol1e5c mon4ey1l mono3ch mo4no1en moro6n5is mono1s6 moth4et2 m1ou3sin m5shack2 mu2dro mul2ti5u n3ar4chs. n3ch2es1t ne3back 2ne1ski n1dieck nd3thr nfi6n3ites 4n5i4an. nge5nes ng1ho ng1spr nk3rup n5less 5noc3er1os nom1a6l nom5e1no n1o1mist non1eq non1i4so 5nop1oly. no1vemb ns5ceiv ns4moo ntre1p obli2g1 o3chas odel3li odit1ic oerst2 oke1st o3les3ter oli3gop1o1 o1lo3n4om o3mecha6 onom1ic o3norma o3no2t1o3n o3nou op1ism. or4tho3ni4t orth1ri or5tively o4s3pher o5test1er o5tes3tor oth3e1o1s ou3ba3do o6v3i4an. oxi6d1ic pal6mat parag6ra4 par4a1le param4 para3me pee2v1 phi2l3ant phi5lat1e3l pi2c1a3d pli2c1ab pli5nar poin3ca 1pole. poly1e po3lyph1ono 1prema3c pre1neu pres2pli pro2cess proc3i3ty. pro2g1e 3pseu2d pseu3d6o3d2 pseu3d6o3f2 pto3mat4 p5trol3 pu5bes5c quain2t1e qu6a3si3 quasir6 quasis6 quin5tes5s qui3v4ar r1abolic 3rab1o1loi ra3chu r3a3dig radi1o6g r2amen 3ra4m5e1triz ra3mou ra5n2has ra1or r3bin1ge re2c3i1pr rec5t6ang re4t1ribu r3ial. riv1o1l 6rk. rk1ho r1krau 6rks. r5le5qu ro1bot1 ro5e2las ro5epide1 ro3mesh ro1tron r3pau5li rse1rad1i r1thou r1treu r1veil rz1sc sales3c sales5w 5sa3par5il sca6p1er sca2t1ol s4chitz schro1ding1 1sci2utt scrap4er. scy4th1 sem1a1ph se3mes1t se1mi6t5ic sep3temb shoe1st sid2ed. side5st side5sw si5resid sky1sc 3slova1kia 3s2og1a1my so2lute 3s2pace 1s2pacin spe3cio spher1o spi2c1il spokes5w sports3c sports3w s3qui3to s2s1a3chu1 ss3hat s2s3i4an. s5sign5a3b 1s2tamp s2t1ant5shi star3tli sta1ti st5b 1stor1ab strat1a1g strib5ut st5scr stu1pi4d1 styl1is su2per1e6 1sync 1syth3i2 swimm6 5tab1o1lism ta3gon. talk1a5 t1a1min t6ap6ath 5tar2rh tch1c tch3i1er t1cr teach4er. tele2g tele1r6o 3ter1gei ter2ic. t3ess2es tha4l1am tho3don th1o5gen1i tho1k2er thy4l1an thy3sc 2t3i4an. ti2n3o1m t1li2er tolo2gy tot3ic trai3tor1 tra1vers travers3a3b treach1e tr4ial. 3tro1le1um trof4ic. tro3fit tro1p2is 3trop1o5les 3trop1o5lis t1ro1pol3it tsch3ie ttrib1ut1 turn3ar t1wh ty2p5al ua3drati uad1ratu u5do3ny uea1m u2r1al. uri4al. us2er. v1ativ v1oir5du1 va6guer vaude3v 1verely. v1er1eig ves1tite vi1vip3a3r voice1p waste3w6a2 wave1g4 w3c week1n wide5sp wo4k1en wrap3aro writ6er. x1q xquis3 y5che3d ym5e5try y1stro yes5ter1y z3ian. z3o1phr z2z3w",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=4938,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-us.rme b/Master/texmf-dist/tex/context/patterns/lang-us.rme
index 31b28980562..c9c58196ba3 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-us.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-us.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Hyphenation Patterns for American English
+
+(more info about the licence to be added later)
+
% This file has been renamed from ushyphmax.tex to hyph-en-us.tex in June 2008
% for consistency with other files with hyphenation patterns in hyph-utf8 package.
% No other changes made. See http://www.tug.org/tex-hyphen for more details.
@@ -37,4 +41,4 @@
% Dr. Kuiken, and the original patterns and hyphenations from Knuth's
% hyphen.tex.
%
-% The Plain TeX hyphenation tables. \ No newline at end of file
+% The Plain TeX hyphenation tables.
diff --git a/Master/texmf-dist/tex/context/patterns/lang-zh.lua b/Master/texmf-dist/tex/context/patterns/lang-zh.lua
new file mode 100644
index 00000000000..51e55c32969
--- /dev/null
+++ b/Master/texmf-dist/tex/context/patterns/lang-zh.lua
@@ -0,0 +1,109 @@
+return {
+ ["comment"]="% generated by mtxrun --script pattern --convert",
+ ["exceptions"]={
+ ["n"]=0,
+ },
+ ["metadata"]={
+ ["mnemonic"]="zh",
+ ["source"]="hyph-zh-latn",
+ ["texcomment"]="% Hyphenation patterns for unaccented pinyin syllables (CJK 4.8.0)\
+% \
+% (more info about the licence to be added later)\
+% \
+% This file is part of hyph-utf8 package and resulted from\
+% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.\
+%\
+% Source: pyhyph.tex (yyyy-mm-dd)\
+% Author: Werner Lemberg <wl at gnu.org>\
+%\
+% The above mentioned file should become obsolete,\
+% and the author of the original file should preferaby modify this file instead.\
+%\
+% Modificatios were needed in order to support native UTF-8 engines,\
+% but functionality (hopefully) didn't change in any way, at least not intentionally.\
+% This file is no longer stand-alone; at least for 8-bit engines\
+% you probably want to use loadhyph-foo.tex (which will load this file) instead.\
+%\
+% Modifications were done by Jonathan Kew, Mojca Miklavec & Arthur Reutenauer\
+% with help & support from:\
+% - Karl Berry, who gave us free hands and all resources\
+% - Taco Hoekwater, with useful macros\
+% - Hans Hagen, who did the unicodifisation of patterns already long before\
+% and helped with testing, suggestions and bug reports\
+% - Norbert Preining, who tested & integrated patterns into TeX Live\
+%\
+% However, the \"copyright/copyleft\" owner of patterns remains the original author.\
+%\
+% The copyright statement of this file is thus:\
+%\
+% Do with this file whatever needs to be done in future for the sake of\
+% \"a better world\" as long as you respect the copyright of original file.\
+% If you're the original author of patterns or taking over a new revolution,\
+% plese remove all of the TUG comments & credits that we added here -\
+% you are the Queen / the King, we are only the servants.\
+%\
+% If you want to change this file, rather than uploading directly to CTAN,\
+% we would be grateful if you could send it to us (http://tug.org/tex-hyphen)\
+% or ask for credentials for SVN repository and commit it yourself;\
+% we will then upload the whole \"package\" to CTAN.\
+%\
+% Before a new \"pattern-revolution\" starts,\
+% please try to follow some guidelines if possible:\
+%\
+% - \\lccode is *forbidden*, and I really mean it\
+% - all the patterns should be in UTF-8\
+% - the only \"allowed\" TeX commands in this file are: \\patterns, \\hyphenation,\
+% and if you really cannot do without, also \\input and \\message\
+% - in particular, please no \\catcode or \\lccode changes,\
+% they belong to loadhyph-foo.tex,\
+% and no \\lefthyphenmin and \\righthyphenmin,\
+% they have no influence here and belong elsewhere\
+% - \\begingroup and/or \\endinput is not needed\
+% - feel free to do whatever you want inside comments\
+%\
+% We know that TeX is extremely powerful, but give a stupid parser\
+% at least a chance to read your patterns.\
+%\
+% For more unformation see\
+%\
+% http://tug.org/tex-hyphen\
+%\
+%------------------------------------------------------------------------------\
+%\
+% This is the file pyhyph.tex of the CJK package\
+% for hyphenating Chinese pinyin syllables.\
+% \
+% created by Werner Lemberg <wl@gnu.org>\
+% \
+% Version 4.8.0 (22-May-2008)\
+% \
+% Copyright (C) 1994-2008 Werner Lemberg <wl@gnu.org>\
+% \
+% This program is free software; you can redistribute it and/or modify\
+% it under the terms of the GNU General Public License as published by\
+% the Free Software Foundation; either version 2 of the License, or\
+% (at your option) any later version.\
+% \
+% This program is distributed in the hope that it will be useful,\
+% but WITHOUT ANY WARRANTY; without even the implied warranty of\
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\
+% GNU General Public License for more details.\
+% \
+% You should have received a copy of the GNU General Public License\
+% along with this program in doc/COPYING; if not, write to the Free\
+% Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,\
+% MA 02110-1301 USA\
+% \
+% \\message{Hyphenation patterns for unaccented pinyin syllables (CJK 4.7.0)}\
+%\
+% ",
+ },
+ ["patterns"]={
+ ["characters"]="abcdefghijklmnopqrstuwxyzü’",
+ ["data"]="a1b a1c a1d a1f a1g a1h a1j a1k a1l a1m a1p a1q a1r a1s a1t a1w a1x a1y a1z e1b e1c e1d e1f e1g e1h e1j e1k e1l e1m e1p e1q e1s e1t e1w e1x e1y e1z 1ga g1b g1c g1d 1ge g1f g1g g1h g1j g1k g1l g1m g1n 1go g1p g1q g1r g1s g1t 1gu g1w g1x g1y g1z i1b i1c i1d i1f i1g i1h i1j i1k i1l i1m i1p i1q i1r i1s i1t i1w i1x i1y i1z 1na n1b n1c n1d 1ne n1f n1h 1ni n1j n1k n1l n1m n1n 1no n1p n1q n1r n1s n1t 1nu 1nü n1w n1x n1y n1z o1b o1c o1d o1f o1g o1h o1j o1k o1l o1m o1p o1q o1r o1s o1t o1w o1x o1y o1z 1ra r1b r1c r1d 1re r1f r1g r1h 1ri r1j r1k r1l r1m r1n 1ro r1p r1q r1r r1s r1t 1ru r1w r1x r1y r1z u1b u1c u1d u1f u1g u1h u1j u1k u1l u1m u1p u1q u1r u1s u1t u1w u1x u1y u1z ü1b ü1c ü1d ü1f ü1g ü1h ü1j ü1k ü1l ü1m ü1n ü1p ü1q ü1r ü1s ü1t ü1w ü1x ü1y ü1z ’1a ’1e ’1o",
+ ["minhyphenmax"]=1,
+ ["minhyphenmin"]=1,
+ ["n"]=191,
+ },
+ ["version"]="1.001",
+} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-zh.pat b/Master/texmf-dist/tex/context/patterns/lang-zh.pat
index 264c84b9b21..40d3a542c12 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-zh.pat
+++ b/Master/texmf-dist/tex/context/patterns/lang-zh.pat
@@ -2,7 +2,7 @@
% for comment and copyright, see e:/tmp/patterns/lang-zh.rme
-% used: a b c d e f g h i j k l m n o p q r s t u w x y z ü
+% used: a b c d e f g h i j k l m n o p q r s t u w x y z ü ’
\patterns{
a1b
@@ -192,4 +192,7 @@ u1z
ü1w
ü1x
ü1y
-ü1z} \ No newline at end of file
+ü1z
+'1a
+'1e
+'1o} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/context/patterns/lang-zh.rme b/Master/texmf-dist/tex/context/patterns/lang-zh.rme
index f2dd9def7f1..daa234c75e9 100644
--- a/Master/texmf-dist/tex/context/patterns/lang-zh.rme
+++ b/Master/texmf-dist/tex/context/patterns/lang-zh.rme
@@ -1,5 +1,9 @@
% generated by mtxrun --script pattern --convert
+Hyphenation patterns for unaccented pinyin syllables (CJK 4.8.0)
+
+(more info about the licence to be added later)
+
% This file is part of hyph-utf8 package and resulted from
% semi-manual conversions of hyphenation patterns into UTF-8 in June 2008.
%
@@ -85,4 +89,4 @@
% MA 02110-1301 USA
%
% \message{Hyphenation patterns for unaccented pinyin syllables (CJK 4.7.0)}
-% \ No newline at end of file
+%
diff --git a/Master/texmf-dist/tex/context/sample/cow.pdf b/Master/texmf-dist/tex/context/sample/cow.pdf
new file mode 100644
index 00000000000..2441faf74e7
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/cow.pdf
Binary files differ
diff --git a/Master/texmf-dist/tex/context/sample/douglas.tex b/Master/texmf-dist/tex/context/sample/douglas.tex
index cf5fd50f3e6..7d986d484ab 100644
--- a/Master/texmf-dist/tex/context/sample/douglas.tex
+++ b/Master/texmf-dist/tex/context/sample/douglas.tex
@@ -1,23 +1,23 @@
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
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 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,
+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,
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
-taken wrongly by many readers, and since they are points
-that touch close to my deepest interests in artificial
-intelligence and esthetic theory, I felt compelled to make
-some comments to clarify certain important issues raised by
-\quotation {The Concept of a Meta|-|Font}.
+However, despite my overall enthusiasm for Knuth's idea and
+article, there are some points in it that I feel might be
+taken wrongly by many readers, and since they are points
+that touch close to my deepest interests in artificial
+intelligence and esthetic theory, I felt compelled to make
+some comments to clarify certain important issues raised by
+\quotation {The Concept of a Meta|-|Font}.
diff --git a/Master/texmf-dist/tex/context/sample/hacker.jpg b/Master/texmf-dist/tex/context/sample/hacker.jpg
new file mode 100644
index 00000000000..cbc53a7dee5
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/hacker.jpg
Binary files differ
diff --git a/Master/texmf-dist/tex/context/sample/khatt-ar.tex b/Master/texmf-dist/tex/context/sample/khatt-ar.tex
new file mode 100644
index 00000000000..c9142641109
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/khatt-ar.tex
@@ -0,0 +1,4 @@
+قَالَ عَلِيُّ بْنُ أَبِي طَالِبٍ لِكَاتِبِهِ عُبَيْدِ اللّٰهِ بْنِ
+أَبِي رَافِعٍ: أَلِقْ دَوَاتَكَ، وَ أَطِلْ جِلْفَةَ قَلَمِكَ، وَ فَرِّجْ
+بَيْنَ السُّطُورِ، وَ قَرْمِطْ بَيْنَ الْحُرُوفِ؛ فَإِنَّ ذَلِكَ أَجْدَرُ
+بِصَبَاحَةِ الْخَطِّ.
diff --git a/Master/texmf-dist/tex/context/sample/khatt-en.tex b/Master/texmf-dist/tex/context/sample/khatt-en.tex
new file mode 100644
index 00000000000..f994513e71f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/khatt-en.tex
@@ -0,0 +1,4 @@
+ʿAlī ibn Abī Ṭālib said to his scribe ʿUbaydullāh ibn Abī Rāfiʿ:
+your inkwell before you, sharpen the edge of your pen, make sure
+there is open space between the lines, and set your letter|-|spacing
+closely. Now {\em that} is the way to make the script shine!
diff --git a/Master/texmf-dist/tex/context/sample/mill.png b/Master/texmf-dist/tex/context/sample/mill.png
new file mode 100644
index 00000000000..faff477dec9
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/mill.png
Binary files differ
diff --git a/Master/texmf-dist/tex/context/sample/spider.eps b/Master/texmf-dist/tex/context/sample/spider.eps
new file mode 100644
index 00000000000..ecaafb8474f
--- /dev/null
+++ b/Master/texmf-dist/tex/context/sample/spider.eps
@@ -0,0 +1,2843 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%BoundingBox: 250 352 362 440
+%%Creator: CorelDRAW!
+%%Title: SPIN016.EPS
+%%CreationDate: Thu Feb 16 13:27:54 1995
+
+%%DocumentFonts:
+%%DocumentProcessColors: Magenta Yellow Black
+%%EndComments
+%%BeginProlog
+/AutoFlatness false def
+% -------------- POSTSCRIPT PROLOG FOR CORELDRAW 3.X ------
+% Copyright 1992 Corel Corporation. All rights reserved.
+/wCorelDict 300 dict def wCorelDict begin/bd{bind def}bind def
+/ld{load def}bd/xd{exch def}bd/_ null def
+/$c 0 def/$m 0 def/$y 0 def/$k 0 def/$t 1 def
+/$n _ def/$o 0 def/$fil 0 def/$bkg false def
+/$C 0 def/$M 0 def/$Y 0 def/$K 0 def/$T 1 def
+/$N _ def/$O 0 def/$PF false def/$ctm matrix currentmatrix def
+/$ptm matrix def/$ttm matrix def/$stm matrix def
+/$fst 128 def/$pad 0 def/$rox 0 def/$roy 0 def
+currentscreen/@dsp xd/$dsp/@dsp def/$dsa xd
+/$dsf xd/$sdf false def/$SDF false def/$Scra 0.0 def
+/$sv 0 def/@cp/closepath ld/@gs/gsave ld/@gr/grestore ld
+/@np/newpath ld/@sv{/$sv save def}bd/@rs{$sv restore}bd
+/@ss{exch $Scra add exch load setscreen}bd
+AutoFlatness{/$cpx ([Error: PathTooComplex; OffendingCommand: AnyPaintingOperator]\n) def
+/@err1{$cpx print flush newpath}bd/@ifl{dup currentflat exch sub 10 gt
+{@err1 exit}{currentflat 2 add setflat}ifelse}bd
+/@fill/fill ld/fill{currentflat{{@fill}stopped{@ifl}{exit}ifelse
+}bind loop setflat}bd/@eofill/eofill ld/eofill{currentflat{{@eofill}
+stopped{@ifl}{exit}ifelse}bind loop setflat}bd
+/@clip/clip ld/clip{currentflat{{@clip}stopped{initclip @ifl}{exit
+}ifelse}bind loop setflat}bd/@eoclip/eoclip ld
+/eoclip{currentflat{{@eoclip}stopped{initclip @ifl}{exit}ifelse
+}bind loop setflat}bd/@stroke/stroke ld/stroke{currentflat{{@stroke}
+stopped{@ifl}{exit}ifelse}bind loop setflat}bd}if
+/InRange{3 -1 roll 2 copy le{pop}{exch pop}ifelse
+2 copy ge{pop}{exch pop}ifelse}bd/wDstChck{2 1 roll dup 3 -1 roll
+eq{1 add}if}bd/@dot{dup mul exch dup mul add 1 exch sub 2 div}bd
+/@lin{exch pop abs 1 exch sub}bd/@MN{2 copy le{pop}{exch pop}ifelse}bd
+/setcmykcolor where{pop}{/setcmykcolor{4 1 roll
+3{3 index add 1 @MN 1 exch sub 3 1 roll}repeat
+setrgbcolor pop}bd}ifelse/setoverprint{/$op xd}bd
+/currentoverprint{$op}bd/setsepcolor{1 exch sub setgray}bd
+/checksepcolor{1 exch sub dup setgray 1 eq exch 1 eq and not}bd
+/setprocesscolor{ColorSeparationMode 0 eq{setcmykcolor}{
+0 4 $ink sub index exch pop 5 1 roll 4{pop}repeat
+setsepcolor}ifelse}bd/findcmykcustomcolor{5 array astore}bd
+/setcustomcolor where{pop}{/setcustomcolor{ColorSeparationMode 0 eq{
+exch aload pop pop 4{4 index mul 4 1 roll}repeat
+5 -1 roll pop setcmykcolor}{exch aload pop
+CurrentInkName eq{4 index}{0}ifelse 6 1 roll
+5{pop}repeat setsepcolor}ifelse}bd}ifelse/colorimage where{pop}{
+/colorimage{pop pop pop pop pop{currentfile $dat readhexstring pop pop}
+repeat pop}bd}ifelse/@tc{dup 1 ge{pop}{4{dup
+6 -1 roll mul exch}repeat pop}ifelse}bd/@scc{1 eq setoverprint
+dup _ eq{pop setprocesscolor pop}{findcmykcustomcolor
+exch setcustomcolor}ifelse ColorSeparationMode 0 eq{true}{
+currentgray 1 eq currentoverprint and not}ifelse}bd
+/@sft{/$tx $tllx $pxf add dup $tllx gt{$pwid sub}if def
+/$ty $tury $pyf sub dup $tury lt{$phei add}if def}bd
+/@stb{pathbbox/$ury xd/$urx xd/$lly xd/$llx xd}bd
+/@ep{{cvx exec}forall}bd/@tp{@sv/$in true def
+2 copy dup $lly le{/$in false def}if $phei sub $ury ge{/$in false def}if
+dup $urx ge{/$in false def}if $pwid add $llx le{/$in false def}if
+$in{@np 2 copy m $pwid 0 rl 0 $phei neg rl $pwid neg 0 rl
+0 $phei rl clip @np $pn cvlit load aload pop
+7 -1 roll 5 index sub 7 -1 roll 3 index sub translate
+/$ctm matrix currentmatrix def @ep pop pop pop pop}{pop pop}ifelse
+@rs}bd/@th{@sft 0 1 $tly 1 sub{dup $psx mul $tx add{
+dup $llx gt{$pwid sub}{exit}ifelse}loop exch $phei mul $ty exch sub
+0 1 $tlx 1 sub{$pwid mul 3 copy 3 -1 roll add exch
+@tp pop}for pop pop}for}bd/@tv{@sft 0 1 $tlx 1 sub{dup $pwid mul $tx add
+exch $psy mul $ty exch sub{dup $ury lt{$phei add}{exit}ifelse}loop
+0 1 $tly 1 sub{$phei mul 3 copy sub @tp pop}for
+pop pop}for}bd/@pf{@gs $ctm setmatrix $pm concat
+@stb eoclip Bburx Bbury $pm itransform/$tury xd/$turx xd
+Bbllx Bblly $pm itransform/$tlly xd/$tllx xd
+/$wid $turx $tllx sub def/$hei $tury $tlly sub def
+@gs $vectpat{1 0 0 0 0 _ $o @scc{eofill}if}{$t $c $m $y $k $n $o @scc{
+$tllx $tlly translate $wid $hei scale <00> 8 1 false [ 8 0 0 1 0 0 ]{}imagemask
+/$bkg true def}if}ifelse @gr $wid 0 gt $hei 0 gt and{
+$pn cvlit load aload pop/$pd xd 3 -1 roll sub/$phei xd
+exch sub/$pwid xd/$tlx $wid $pwid div ceiling 1 add def
+/$tly $hei $phei div ceiling 1 add def $psx 0 eq{@tv}{@th}ifelse}if
+@gr @np/$bkg false def}bd/@dlt{ColorSeparationMode 0 eq{
+/$dc $toc $tot mul $frc $frt mul dup/$c xd sub $fst 1 sub div def
+/$dm $tom $tot mul $frm $frt mul dup/$m xd sub $fst 1 sub div def
+/$dy $toy $tot mul $fry $frt mul dup/$y xd sub $fst 1 sub div def
+/$dk $tok $tot mul $frk $frt mul dup/$k xd sub $fst 1 sub div def
+true}{$frt $frc $frm $fry $frk $frn $o @scc
+dup{/$frk 1 currentgray sub def}{/$frk 0 def}ifelse
+$tot $toc $tom $toy $tok $ton $o @scc dup{/$tok 1 currentgray sub def}{
+/$tok 0 def}ifelse or dup{/$c 0 def/$m 0 def/$y 0 def/$k $frk def
+/$dc 0 def/$dm 0 def/$dy 0 def/$dk $tok $frk sub $fst 1 sub div def}if
+}ifelse}bd/@ftl{1 index 4 index sub dup $pad mul dup/$pdw xd
+2 mul sub $fst div/$wid xd 2 index sub/$hei xd
+pop translate $c $m $y $k 4 copy ColorSeparationMode 0 ne
+{1 exch sub setgray pop pop pop}{setcmykcolor}ifelse
+0 0 moveto 0 $hei lineto $pdw $hei lineto $pdw 0 lineto 0 0 lineto fill
+$pdw 0 translate $fst{4 copy ColorSeparationMode 0 ne
+{1 exch sub setgray pop pop pop}{setcmykcolor}ifelse
+0 0 moveto 0 $hei lineto $wid $hei lineto $wid 0 lineto 0 0 lineto fill
+$wid 0 translate $dk add 4 1 roll $dy add 4 1 roll
+$dm add 4 1 roll $dc add 4 1 roll}repeat $dk sub 4 1 roll
+$dy sub 4 1 roll $dm sub 4 1 roll $dc sub 4 1 roll
+ColorSeparationMode 0 ne{1 exch sub setgray pop pop pop}
+{setcmykcolor}ifelse 0 0 moveto 0 $hei lineto $pdw $hei lineto $pdw 0 lineto 0 0 lineto fill
+}bd/@ftr{1 index 4 index sub dup $rox mul/$row xd
+2 div 1 index 4 index sub dup $roy mul/$roh xd
+2 div 2 copy dup mul exch dup mul add sqrt
+$row dup mul $roh dup mul add sqrt add dup/$hei xd $fst div/$wid xd
+4 index add $roh add exch 5 index add $row add
+exch translate pop pop pop pop currentflat dup 5 mul setflat
+$c $m $y $k 4 copy ColorSeparationMode 0 ne
+{1 exch sub setgray pop pop pop}{setcmykcolor}ifelse
+$wid 0 moveto 0 0 $hei 0 360 arc fill 1.0 $pad 2 mul sub dup scale
+$fst{4 copy ColorSeparationMode 0 ne{1 exch sub setgray pop pop pop}
+{setcmykcolor}ifelse $wid 0 moveto 0 0 $hei 0 360 arc fill
+/$hei $hei $wid sub def $dk add 4 1 roll $dy add 4 1 roll
+$dm add 4 1 roll $dc add 4 1 roll}repeat pop pop pop pop
+setflat}bd/@ff{@gs @dlt{$ctm setmatrix eoclip
+newpath Bbllx Bblly moveto Bbllx Bbury lineto
+Bburx Bbury lineto Bburx Bblly lineto $fan rotate
+pathbbox newpath $fty 1 eq{@ftr}{@ftl}ifelse}if
+@gr @np}bd/@Pf{@sv ColorSeparationMode 0 eq $ink 3 eq or{0 J 0 j [] 0 d
+$t $c $m $y $k $n $o @scc pop $ctm setmatrix
+72 1000 div dup matrix scale dup concat dup Bburx exch Bbury exch itransform
+ceiling cvi/Bbury xd ceiling cvi/Bburx xd Bbllx exch Bblly exch itransform
+floor cvi/Bblly xd floor cvi/Bbllx xd $Prm aload pop
+$Psn load exec}{1 setgray eofill}ifelse @rs
+@np}bd/g{1 exch sub/$k xd/$c 0 def/$m 0 def/$y 0 def/$t 1 def/$n _ def/$fil 0 def
+}bd/G{1 exch sub/$K xd/$C 0 def/$M 0 def/$Y 0 def/$T 1 def/$N _ def}bd
+/k{/$k xd/$y xd/$m xd/$c xd/$t 1 def/$n _ def/$fil 0 def}bd
+/K{/$K xd/$Y xd/$M xd/$C xd/$T 1 def/$N _ def}bd
+/x{/$t xd/$n xd/$k xd/$y xd/$m xd/$c xd/$fil 0 def}bd
+/X{/$T xd/$N xd/$K xd/$Y xd/$M xd/$C xd}bd
+/d/setdash ld/i{dup 0 ne{setflat}{pop}ifelse}bd
+/j/setlinejoin ld/J/setlinecap ld/M/setmiterlimit ld
+/w/setlinewidth ld/O{/$o xd}bd/R{/$O xd}bd
+/c/curveto ld/C/c ld/v{4 -2 roll 2 copy 6 -2 roll curveto}bd
+/V/v ld/y{2 copy curveto}bd/Y/y ld/l/lineto ld
+/L/l ld/rl/rlineto ld/m/moveto ld/n/newpath ld
+/N/newpath ld/F{matrix currentmatrix $sdf{$scf $sca $scp @ss}if
+$fil 1 eq{@pf}{$fil 2 eq{@ff}{$fil 3 eq{@Pf}{$t $c $m $y $k $n $o @scc
+{eofill}{@np}ifelse}ifelse}ifelse}ifelse $sdf{$dsf $dsa $dsp @ss}if
+setmatrix}bd/f{@cp F}bd/S{matrix currentmatrix
+$ctm setmatrix $SDF{$SCF $SCA $SCP @ss}if $T $C $M $Y $K $N $O @scc{
+matrix currentmatrix $ptm concat stroke setmatrix}{@np}ifelse
+$SDF{$dsf $dsa $dsp @ss}if setmatrix}bd/s{@cp
+S}bd/B{@gs F @gr S}bd/b{@cp B}bd/W{eoclip}bd
+/p{/$pm xd 7{pop}repeat/$pyf xd/$pxf xd/$pn xd
+/$fil 1 def}bd/P{11{pop}repeat}bd/u{}bd/U{}bd
+/A{pop}bd/q/@gs ld/Q/@gr ld/E{5 array astore
+exch cvlit exch def}bd/`{}bd/~{}bd/@{}bd/&{}bd
+/CorelDrawReencodeVect [ 16#82/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl
+16#88/circumflex/perthousand/Scaron/guilsinglleft/OE
+16#91/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash
+16#98/tilde/trademark/scaron/guilsinglright/oe
+16#9F/Ydieresis 16#A1/exclamdown/cent/sterling/currency/yen/brokenbar/section
+16#a8/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/minus/registered/macron
+16#b0/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered
+16#b8/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown
+16#c0/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
+16#c8/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis
+16#d0/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply
+16#d8/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
+16#e0/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
+16#e8/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
+16#f0/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide
+16#f8/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis
+] def/@cc{currentfile $dat readhexstring pop}bd
+/@sm{/$ctm $ctm currentmatrix def}bd/@E{/Bbury xd/Bburx xd
+/Bblly xd/Bbllx xd}bd/@c{@cp}bd/@p{/$fil 1 def
+1 eq/$vectpat xd/$pm xd/$psy xd/$psx xd/$pyf xd/$pxf xd
+/$pn xd}bd/@P{/$fil 3 def/$Psn xd array astore
+/$Prm xd}bd/@k{/$fil 2 def/$roy xd/$rox xd/$pad xd
+/$fty xd/$fan xd $fty 1 eq{/$fan 0 def}if/$tok xd/$toy xd/$tom xd/$toc xd
+/$frk xd/$fry xd/$frm xd/$frc xd/$frn _ def/$frt 1 def/$ton _ def/$tot 1 def
+}bd/@x{/$fil 2 def/$roy xd/$rox xd/$pad xd
+/$fty xd/$fan xd/$tot xd/$ton xd/$tok xd/$toy xd/$tom xd/$toc xd
+/$frt xd/$frn xd/$frk xd/$fry xd/$frm xd/$frc xd}bd
+/@ii{concat 3 index 3 index m 3 index 1 index l
+2 copy l 1 index 3 index l 3 index 3 index l
+clip pop pop pop pop}bd/@i{@sm @gs @ii 6 index 1 ne{/$frg true def
+pop pop}{1 eq{$T $C $M $Y $K $N $O @scc/$frg xd}{/$frg false def
+}ifelse 1 eq{@gs $ctm setmatrix $t $c $m $y $k $n $o @scc{eofill}if
+@gr}if}ifelse/$frg $frg $bkg or def @np/$ury xd/$urx xd/$lly xd/$llx xd
+/$bts xd/$hei xd/$wid xd/$dat $wid $bts mul 8 div ceiling cvi string def
+$frg{$SDF{$SCF $SCA $SCP @ss}if $llx $lly translate
+$urx $llx sub $ury $lly sub scale $wid $hei abs
+$bts 1 eq{false}{$bts}ifelse [ $wid 0 0 $hei neg 0
+$hei 0 gt{$hei}{0}ifelse]/@cc load $bts 1 eq{imagemask}{image}ifelse
+$SDF{$dsf $dsa $dsp @ss}if}{$hei abs{@cc pop}repeat}ifelse
+@gr $ctm setmatrix}def/@M{@sv}bd/@N{/@cc{}def
+1 eq{12 -1 roll neg 12 1 roll @I}{13 -1 roll neg 13 1 roll
+@i}ifelse @rs}bd/@I{@sm @gs @ii @np/$ury xd/$urx xd/$lly xd/$llx xd
+/$ncl xd/$bts xd/$hei xd/$wid xd/$dat $wid $bts mul $ncl mul 8 div ceiling cvi string def
+$llx $lly translate $urx $llx sub $ury $lly sub scale
+$wid $hei abs $bts [ $wid 0 0 $hei neg 0 $hei 0 gt{$hei}{0}ifelse]
+/@cc load false $ncl colorimage @gr $ctm setmatrix}bd
+/z{exch findfont exch scalefont setfont}bd
+/ZB{9 dict dup begin 4 1 roll/FontType 3 def
+/FontMatrix xd/FontBBox xd/Encoding 256 array def
+0 1 255{Encoding exch/.notdef put}for/CharStrings 256 dict def
+CharStrings/.notdef{}put/Metrics 256 dict def
+Metrics/.notdef 3 -1 roll put/BuildChar{exch
+dup/$char exch/Encoding get 3 index get def
+dup/Metrics get $char get aload pop setcachedevice
+begin Encoding exch get CharStrings exch get
+end exec}def end definefont pop}bd/ZBAddChar{findfont begin
+dup 4 1 roll dup 6 1 roll Encoding 3 1 roll put
+CharStrings 3 1 roll put Metrics 3 1 roll put
+end}bd/Z{findfont dup maxlength 2 add dict exch
+dup{1 index/FID ne{3 index 3 1 roll put}{pop pop}ifelse}forall
+pop dup dup/Encoding get 256 array copy dup/$fe xd
+/Encoding exch put dup/Fontname 3 index put
+3 -1 roll dup length 0 ne{0 exch{dup type 0 type eq{exch pop}{
+$fe exch 2 index exch put 1 add}ifelse}forall
+pop}if dup 256 dict dup/$met xd/Metrics exch put
+dup/FontMatrix get 0 get 1000 mul 1 exch div
+3 index length 256 eq{0 1 255{dup $fe exch get
+dup/.notdef eq{pop pop}{5 index 3 -1 roll get
+2 index mul $met 3 1 roll put}ifelse}for}if
+pop definefont pop pop}bd/@ftx{{currentpoint 3 -1 roll
+(0) dup 3 -1 roll 0 exch put dup @gs true charpath
+$ctm setmatrix @@txt @gr @np stringwidth pop 3 -1 roll add exch moveto
+}forall}bd/@ft{matrix currentmatrix exch $sdf{$scf $sca $scp @ss}if
+$fil 1 eq{/@@txt/@pf ld @ftx}{$fil 2 eq{/@@txt/@ff ld @ftx}{$fil 3 eq
+{/@@txt/@Pf ld @ftx}{$t $c $m $y $k $n $o @scc{show}{pop}ifelse}ifelse
+}ifelse}ifelse $sdf{$dsf $dsa $dsp @ss}if setmatrix}bd
+/@st{matrix currentmatrix exch $SDF{$SCF $SCA $SCP @ss}if
+$T $C $M $Y $K $N $O @scc{{currentpoint 3 -1 roll
+(0) dup 3 -1 roll 0 exch put dup @gs true charpath
+$ctm setmatrix $ptm concat stroke @gr @np stringwidth pop 3 -1 roll add exch moveto
+}forall}{pop}ifelse $SDF{$dsf $dsa $dsp @ss}if
+setmatrix}bd/@te{@ft}bd/@tr{@st}bd/@ta{dup
+@gs @ft @gr @st}bd/@t@a{dup @gs @st @gr @ft}bd
+/@tm{/$textsave save def @sm concat}bd/e{/t{@te}def}bd
+/r{/t{@tr}def}bd/o{/t{pop}def}bd/a{/t{@ta}def}bd
+/@a{/t{@t@a}def}bd/t{@te}def/T{@np $ctm setmatrix
+/$ttm matrix def $textsave restore}bd/@t{/$stm $stm currentmatrix def
+3 1 roll moveto $ttm concat t $stm setmatrix}def
+/@n{/$ttm exch matrix rotate def}bd/@s{}bd
+/@l{}bd/@B{@gs S @gr F}bd/@b{@cp @B}bd/@w{matrix rotate/$ptm xd
+matrix scale $ptm dup concatmatrix/$ptm xd
+1 eq{$ptm exch dup concatmatrix/$ptm xd}if
+1 w}bd/@g{1 eq dup/$sdf xd{/$scp xd/$sca xd
+/$scf xd}if}bd/@G{1 eq dup/$SDF xd{/$SCP xd
+/$SCA xd/$SCF xd}if}bd/@D{3 copy @ss/$dsp xd
+/$dsa xd/$dsf xd}bd/@j{@sv @np}bind def/@J{@rs}bind def
+/@sep{/ColorSeparationMode where{pop}{/ColorSeparationMode 0 def
+/CurrentInkName (Composite) def}ifelse ColorSeparationMode 0 eq{
+/CurrentInkName (Composite) def}if/CurrentInkName where{pop}{
+/CurrentInkName (Composite) def}ifelse CurrentInkName (Composite) eq
+{/$ink -1 def}{CurrentInkName (Cyan) eq{/$ink 0 def}{
+CurrentInkName (Magenta) eq{/$ink 1 def}{CurrentInkName (Yellow) eq
+{/$ink 2 def}{CurrentInkName (Black) eq{/$ink 3 def}{/$ink 4 def
+}ifelse}ifelse}ifelse}ifelse}ifelse}bd @sep
+/@whi{@gs -72000 dup moveto -72000 72000 lineto
+72000 dup lineto 72000 -72000 lineto closepath 1 setgray fill
+@gr}bd/@neg{ [{1 exch sub}/exec cvx currenttransfer/exec cvx] cvx settransfer
+@whi}bd/@reg{[] 0 d 0 setgray .3 setlinewidth
+2 copy 5.4 0 360 arc closepath 2 copy moveto 9 0 rlineto
+2 copy moveto -9 0 rlineto 2 copy moveto 0 9 rlineto
+moveto 0 -9 rlineto stroke}bd/leftbracket{(\050)}def
+/rightbracket{(\051)}def
+
+%%EndProlog
+%%BeginSetup
+11.4737 setmiterlimit
+1.00 setflat
+/$fst 128 def
+
+%%EndSetup
+@sv
+/$ctm matrix currentmatrix def
+@sv
+%%Note: Object
+290.95 378.07 320.40 429.12 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 1.00 1.00 0.00 0.00 0.00 0.00 0.00 0 1 0.00 0.05 0.10 @k
+%%CURV 37
+308.52 422.28 m
+313.63 416.81 315.00 415.58 316.80 409.82 c
+318.60 404.06 320.40 397.80 319.32 392.04 c
+318.24 386.28 316.37 382.18 314.21 380.59 c
+312.05 379.01 309.53 378.07 304.42 378.36 c
+299.30 378.65 295.27 381.60 293.47 385.92 c
+291.67 390.24 290.95 394.20 290.95 398.95 c
+290.95 403.70 291.17 407.74 293.98 411.91 c
+296.78 416.09 299.52 417.38 299.59 417.53 c
+301.18 420.70 L
+302.62 422.93 L
+301.54 425.66 L
+301.32 427.18 303.26 428.98 304.78 429.05 c
+306.29 429.12 308.74 427.10 308.45 425.02 C
+307.66 423.22 308.52 422.28 308.52 422.28 c
+@c
+B
+%%Note: Object
+301.82 419.69 308.09 421.42 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+308.09 421.06 m
+305.57 419.69 301.82 421.42 301.82 421.42 C
+S
+%%Note: Object
+300.24 433.44 302.62 436.46 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.10 k
+%%CURV 7
+300.24 433.44 m
+301.03 433.58 301.25 433.44 301.68 434.09 c
+302.11 434.74 302.47 435.82 302.62 436.46 C
+S
+%%Note: Object
+300.31 435.24 301.32 438.34 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.10 k
+%%CURV 7
+300.31 435.24 m
+300.74 435.89 301.18 436.18 301.25 436.75 c
+301.32 437.33 301.32 437.90 301.32 438.34 C
+S
+%%Note: Object
+299.16 436.97 300.31 439.34 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.10 k
+%%CURV 7
+299.23 436.97 m
+299.59 438.05 299.16 437.69 299.74 438.48 c
+300.31 439.27 300.17 438.84 300.31 439.34 C
+S
+%%Note: Object
+262.73 405.00 267.34 405.29 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.10 k
+%%CURV 4
+267.34 405.14 m
+265.18 405.00 264.38 405.29 262.73 405.14 C
+S
+%%Note: Object
+252.94 396.36 257.33 397.37 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.10 k
+%%CURV 4
+257.33 397.01 m
+254.95 396.50 254.16 397.37 252.94 396.36 C
+S
+%%Note: Object
+261.43 393.48 271.94 407.30 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.10 k
+%%CURV 7
+263.30 400.39 m
+263.09 397.87 263.45 398.52 262.44 396.00 c
+261.43 393.48 271.94 407.30 269.06 404.28 C
+S
+%%Note: Object
+269.93 400.39 272.81 404.64 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.10 k
+%%CURV 4
+272.81 404.64 m
+271.58 403.13 271.01 401.04 269.93 400.39 C
+S
+%%Note: Object
+288.14 403.49 290.59 407.66 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.10 k
+%%CURV 4
+290.59 407.66 m
+289.73 404.28 290.30 405.36 288.14 403.49 C
+S
+%%Note: Object
+290.16 390.96 290.74 395.57 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+290.74 395.57 m
+290.30 394.13 290.16 392.54 290.16 390.96 C
+S
+%%Note: Object
+287.06 387.00 287.71 392.26 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+287.71 392.26 m
+287.71 390.46 287.06 388.73 287.06 387.00 C
+S
+%%Note: Object
+282.74 380.74 283.03 385.85 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 2
+283.03 385.85 m
+282.74 380.74 L
+S
+%%Note: Object
+279.86 374.83 280.15 379.58 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 2
+280.01 379.58 m
+280.01 374.83 L
+S
+%%Note: Object
+277.92 367.20 279.36 372.82 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+277.92 372.82 m
+277.92 370.58 278.57 369.79 279.07 368.06 c
+279.07 367.85 279.22 367.20 279.36 367.20 C
+S
+%%Note: Object
+275.69 360.72 277.27 365.40 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 2
+275.69 365.40 m
+277.27 360.72 L
+S
+%%Note: Object
+275.69 352.58 276.62 357.70 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+275.69 357.70 m
+275.69 356.62 275.98 353.23 276.62 352.58 C
+S
+%%Note: Object
+281.30 392.40 285.12 393.84 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 5
+285.12 393.84 m
+284.47 393.70 283.68 393.19 283.03 393.19 C
+281.30 392.40 L
+S
+%%Note: Object
+277.27 387.00 281.95 389.23 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 5
+281.95 389.23 m
+280.30 388.73 278.71 387.79 277.42 387.14 C
+277.27 387.00 L
+S
+%%Note: Object
+274.90 381.38 278.71 384.26 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+278.71 384.26 m
+278.06 383.90 276.48 382.68 276.19 382.03 C
+275.69 382.03 275.33 381.38 274.90 381.38 C
+S
+%%Note: Object
+273.10 375.62 276.98 378.94 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+276.98 378.94 m
+275.54 378.14 274.25 376.13 273.10 375.62 C
+S
+%%Note: Object
+271.15 369.22 274.39 372.74 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+274.39 372.74 m
+272.81 371.95 272.02 370.80 271.15 369.22 C
+S
+%%Note: Object
+269.42 360.29 272.16 365.54 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 8
+272.16 365.54 m
+271.66 364.75 270.36 362.81 270.36 361.87 C
+270.07 361.87 L
+270.07 361.51 269.42 360.94 269.42 360.29 C
+S
+%%Note: Object
+270.72 353.52 272.30 359.28 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+272.30 359.28 m
+271.80 357.84 270.72 355.18 270.72 353.52 C
+S
+%%Note: Object
+291.46 421.06 294.19 428.11 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 5
+294.19 421.06 m
+293.83 423.58 292.68 425.59 292.68 425.59 c
+291.46 428.11 L
+S
+%%Note: Object
+289.30 422.71 291.31 428.47 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+290.95 422.71 m
+290.95 424.22 291.31 425.81 290.45 426.46 c
+289.58 427.10 289.30 428.47 289.30 428.47 C
+S
+%%Note: Object
+285.70 424.73 289.01 430.85 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+288.22 424.73 m
+287.57 426.46 289.01 428.04 287.42 428.83 c
+285.84 429.62 285.70 430.85 285.70 430.85 C
+S
+%%Note: Object
+280.80 427.46 284.69 432.36 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+284.69 427.46 m
+283.82 428.98 284.54 429.98 283.32 430.49 c
+282.10 430.99 280.80 432.36 280.80 432.36 C
+S
+%%Note: Object
+277.34 428.11 281.30 433.22 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+281.30 428.11 m
+280.44 429.62 281.23 430.70 280.08 431.21 c
+278.93 431.71 277.34 433.22 277.34 433.22 C
+S
+%%Note: Object
+271.08 428.62 278.42 432.86 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+278.42 428.62 m
+277.06 429.84 277.92 430.99 276.19 431.35 c
+274.46 431.71 271.08 432.86 271.08 432.86 C
+S
+%%Note: Object
+266.98 429.48 273.31 430.99 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 5
+273.31 429.48 m
+271.58 429.84 269.21 430.99 269.21 430.99 c
+266.98 430.99 L
+S
+%%Note: Object
+262.22 428.47 267.34 429.12 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+267.34 428.47 m
+264.82 428.47 264.24 429.12 262.22 428.47 C
+S
+%%Note: Object
+255.46 425.23 262.22 426.31 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+262.22 425.23 m
+259.70 425.23 259.70 426.31 258.34 426.31 c
+256.97 426.31 255.46 425.59 255.46 425.59 C
+S
+%%Note: Object
+286.20 419.54 291.96 420.41 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+291.96 419.54 m
+288.72 419.54 287.71 420.41 286.20 419.54 C
+S
+%%Note: Object
+281.09 422.57 286.20 423.29 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+286.20 422.57 m
+283.68 422.57 282.96 423.29 281.09 422.57 C
+S
+%%Note: Object
+274.82 423.43 283.32 424.94 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+283.32 424.73 m
+280.58 424.73 279.58 424.94 278.21 424.44 c
+276.84 423.94 276.55 424.30 274.82 423.43 C
+S
+%%Note: Object
+266.18 422.93 273.96 426.96 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+273.96 426.96 m
+270.58 424.73 270.58 425.74 269.21 424.58 c
+267.84 423.43 267.77 424.66 266.18 422.93 C
+S
+%%Note: Object
+283.25 411.34 288.79 413.71 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+288.79 411.34 m
+286.27 411.84 286.92 412.42 285.41 412.70 c
+283.90 412.99 284.62 413.71 283.25 413.71 C
+S
+%%Note: Object
+278.57 411.05 284.83 412.78 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+284.83 411.05 m
+282.82 411.41 283.82 412.56 281.45 412.56 c
+279.07 412.56 280.08 412.78 278.57 412.78 C
+S
+%%Note: Object
+275.83 410.76 279.07 411.26 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+279.07 410.76 m
+277.20 410.90 277.34 411.26 275.83 411.26 C
+S
+%%Note: Object
+271.94 409.54 276.34 410.40 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+276.34 409.54 m
+274.46 409.54 273.96 410.40 271.94 410.40 C
+S
+%%Note: Object
+268.20 408.38 272.09 409.46 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+272.09 408.38 m
+270.22 408.38 270.72 409.46 268.20 409.18 C
+S
+%%Note: Object
+264.82 406.66 269.21 406.87 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+269.21 406.87 m
+267.70 406.66 266.04 406.87 264.82 406.87 C
+S
+%%Note: Object
+255.60 401.11 261.72 402.34 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+261.72 402.12 m
+258.84 401.98 257.11 402.34 255.60 401.11 C
+S
+%%Note: Object
+254.45 398.88 259.56 400.54 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+259.56 399.74 m
+256.82 399.10 256.18 400.54 254.45 398.88 C
+S
+%%Note: Object
+251.06 391.61 255.31 393.98 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+255.31 393.98 m
+252.72 392.62 251.06 391.61 251.06 391.61 C
+S
+%%Note: Object
+252.72 390.31 255.31 391.97 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+255.31 391.97 m
+253.58 390.82 252.72 390.31 252.72 390.31 C
+S
+%%Note: Object
+254.95 388.44 256.82 391.61 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+256.82 391.61 m
+256.32 390.31 254.95 388.44 254.95 388.44 C
+S
+%%Note: Object
+258.34 391.10 259.49 394.70 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+258.70 394.70 m
+258.70 391.82 259.49 393.12 258.34 391.10 C
+S
+%%Note: Object
+259.34 392.62 260.93 397.51 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+260.93 397.51 m
+260.06 395.35 260.71 394.63 259.34 392.62 C
+S
+%%Note: Object
+266.33 399.24 270.43 403.63 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+270.43 403.63 m
+267.84 399.89 266.33 399.24 266.33 399.24 C
+S
+%%Note: Object
+273.10 402.26 277.70 406.37 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+277.70 406.37 m
+277.70 406.37 274.39 403.42 273.10 402.26 C
+S
+%%Note: Object
+277.56 403.99 280.94 407.38 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+280.94 407.38 m
+279.43 406.15 278.93 405.00 277.56 403.99 C
+S
+%%Note: Object
+278.57 403.13 283.68 408.17 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+283.68 408.17 m
+282.10 406.66 279.43 403.99 278.57 403.13 C
+S
+%%Note: Object
+279.43 402.77 286.20 407.66 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+286.20 407.66 m
+283.82 405.65 279.43 402.77 279.43 402.77 C
+S
+%%Note: Object
+286.70 404.64 289.94 407.88 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+289.94 407.88 m
+288.94 406.66 287.71 407.02 286.70 404.64 C
+S
+%%Note: Object
+284.18 397.87 291.96 407.66 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+291.96 407.66 m
+290.45 403.78 289.94 403.56 288.07 401.98 c
+286.20 400.39 284.54 400.25 284.18 397.87 C
+S
+%%Note: Object
+285.05 396.50 288.43 398.30 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+288.43 397.73 m
+286.34 397.01 287.42 398.30 285.05 396.50 C
+S
+%%Note: Object
+281.38 377.06 281.66 383.04 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+281.52 383.04 m
+281.52 380.66 281.52 378.72 281.52 377.06 C
+S
+%%Note: Object
+284.26 383.18 284.76 388.58 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+284.76 388.58 m
+284.40 385.49 284.26 384.77 284.26 383.18 C
+S
+%%Note: Object
+323.14 397.22 326.52 398.66 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 8
+323.14 398.66 m
+323.64 398.66 324.43 398.30 324.58 398.02 C
+325.22 398.02 L
+325.22 397.66 326.52 397.51 326.52 397.22 C
+S
+%%Note: Object
+285.05 394.13 291.74 399.10 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 19
+289.51 399.10 m
+287.86 397.87 287.35 398.88 287.06 397.01 c
+286.78 395.14 285.05 394.85 285.98 394.49 c
+286.92 394.13 288.86 394.13 288.86 394.13 c
+288.86 394.13 289.58 394.13 290.16 395.28 c
+290.74 396.43 291.74 396.94 291.24 397.87 C
+290.74 398.81 289.51 399.10 289.51 399.10 c
+@c
+B
+%%Note: Object
+277.70 379.80 283.75 389.74 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 25
+279.43 379.80 m
+280.30 380.74 279.65 380.23 280.80 381.67 c
+281.95 383.11 282.46 385.06 282.89 385.85 c
+283.32 386.64 283.75 386.64 283.46 387.72 c
+283.18 388.80 282.89 389.74 282.02 389.23 c
+281.16 388.73 280.66 388.44 280.08 387.07 c
+279.50 385.70 278.50 384.26 278.42 383.54 c
+278.35 382.82 277.70 381.38 278.14 380.81 C
+278.57 380.23 279.43 379.80 279.43 379.80 c
+@c
+B
+%%Note: Object
+272.16 354.31 276.12 369.58 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 31
+275.76 359.42 m
+275.69 361.08 275.69 360.07 275.76 362.30 c
+275.83 364.54 276.12 366.12 275.90 367.56 c
+275.69 369.00 275.76 369.58 274.90 369.58 c
+274.03 369.58 273.46 369.36 273.10 368.06 c
+272.74 366.77 272.38 366.70 272.38 365.11 c
+272.38 363.53 272.30 362.23 272.30 360.79 c
+272.30 359.35 272.16 358.13 272.66 356.54 c
+273.17 354.96 272.95 354.46 273.82 354.38 c
+274.68 354.31 275.04 354.60 275.40 355.46 C
+275.76 356.33 275.76 359.42 275.76 359.42 c
+@c
+B
+%%Note: Object
+274.39 406.80 285.84 411.77 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 22
+284.33 408.38 m
+284.83 409.32 285.84 410.69 284.69 410.98 c
+283.54 411.26 280.87 411.77 279.72 411.26 c
+278.57 410.76 277.42 410.54 275.98 409.54 c
+274.54 408.53 274.39 408.38 275.04 407.59 c
+275.69 406.80 276.26 406.80 277.42 406.80 c
+278.57 406.80 280.37 407.16 281.81 407.30 C
+283.25 407.45 284.33 408.38 284.33 408.38 c
+@c
+B
+%%Note: Object
+254.16 390.74 268.49 405.00 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 28
+268.34 405.00 m
+268.49 402.34 265.68 401.98 263.95 400.39 c
+262.22 398.81 263.02 397.08 261.07 395.93 c
+259.13 394.78 259.27 395.64 258.19 393.62 c
+257.11 391.61 256.03 390.74 255.10 391.90 c
+254.16 393.05 254.66 392.83 255.60 394.78 c
+256.54 396.72 257.40 396.94 257.69 397.87 c
+257.98 398.81 259.42 400.68 260.57 401.40 c
+261.72 402.12 261.72 402.77 263.16 403.27 C
+264.60 403.78 268.34 405.00 268.34 405.00 c
+@c
+B
+%%Note: Object
+273.46 424.37 284.90 430.27 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 22
+284.18 427.10 m
+284.90 428.54 281.30 428.54 279.36 428.69 c
+277.42 428.83 275.98 430.27 275.04 429.48 c
+274.10 428.69 273.46 428.69 274.39 427.25 c
+275.33 425.81 276.41 425.95 277.63 425.95 c
+278.86 425.95 278.93 425.59 280.51 425.38 c
+282.10 425.16 283.61 424.37 283.90 425.16 C
+284.18 425.95 284.04 426.82 284.18 427.10 c
+@c
+B
+%%Note: Object
+296.78 423.58 301.18 430.49 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 22
+300.46 423.79 m
+300.67 425.81 301.18 425.38 300.74 426.89 c
+300.31 428.40 300.46 428.69 299.38 429.05 c
+298.30 429.41 297.43 430.49 297.14 429.55 c
+296.86 428.62 296.78 427.97 296.78 427.18 c
+296.78 426.38 296.93 425.81 297.22 425.16 c
+297.50 424.51 298.15 423.58 299.02 423.58 C
+299.88 423.58 300.46 423.79 300.46 423.79 c
+@c
+B
+%%Note: Object
+328.25 379.80 334.30 389.74 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 25
+332.57 379.80 m
+331.70 380.74 332.35 380.23 331.20 381.67 c
+330.05 383.11 329.54 385.06 329.11 385.85 c
+328.68 386.64 328.25 386.64 328.54 387.72 c
+328.82 388.80 329.11 389.74 329.98 389.23 c
+330.84 388.73 331.34 388.44 331.92 387.07 c
+332.50 385.70 333.50 384.26 333.58 383.54 c
+333.65 382.82 334.30 381.38 333.86 380.81 C
+333.43 380.23 332.57 379.80 332.57 379.80 c
+@c
+B
+%%Note: Object
+335.88 354.31 339.84 369.58 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 31
+336.24 359.42 m
+336.31 361.08 336.31 360.07 336.24 362.30 c
+336.17 364.54 335.88 366.12 336.10 367.56 c
+336.31 369.00 336.24 369.58 337.10 369.58 c
+337.97 369.58 338.54 369.36 338.90 368.06 c
+339.26 366.77 339.62 366.70 339.62 365.11 c
+339.62 363.53 339.70 362.23 339.70 360.79 c
+339.70 359.35 339.84 358.13 339.34 356.54 c
+338.83 354.96 339.05 354.46 338.18 354.38 c
+337.32 354.31 336.96 354.60 336.60 355.46 C
+336.24 356.33 336.24 359.42 336.24 359.42 c
+@c
+B
+%%Note: Object
+326.16 406.80 337.61 411.77 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 22
+327.67 408.38 m
+327.17 409.32 326.16 410.69 327.31 410.98 c
+328.46 411.26 331.13 411.77 332.28 411.26 c
+333.43 410.76 334.58 410.54 336.02 409.54 c
+337.46 408.53 337.61 408.38 336.96 407.59 c
+336.31 406.80 335.74 406.80 334.58 406.80 c
+333.43 406.80 331.63 407.16 330.19 407.30 C
+328.75 407.45 327.67 408.38 327.67 408.38 c
+@c
+B
+%%Note: Object
+343.51 390.74 357.84 405.00 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 28
+343.66 405.00 m
+343.51 402.34 346.32 401.98 348.05 400.39 c
+349.78 398.81 348.98 397.08 350.93 395.93 c
+352.87 394.78 352.73 395.64 353.81 393.62 c
+354.89 391.61 355.97 390.74 356.90 391.90 c
+357.84 393.05 357.34 392.83 356.40 394.78 c
+355.46 396.72 354.60 396.94 354.31 397.87 c
+354.02 398.81 352.58 400.68 351.43 401.40 c
+350.28 402.12 350.28 402.77 348.84 403.27 C
+347.40 403.78 343.66 405.00 343.66 405.00 c
+@c
+B
+%%Note: Object
+316.22 416.88 323.06 423.22 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 17
+316.22 419.40 m
+317.23 420.55 316.58 420.84 318.17 421.49 c
+319.75 422.14 320.47 423.22 321.41 422.93 c
+322.34 422.64 323.06 422.14 322.06 420.70 c
+321.05 419.26 320.90 420.05 319.46 418.46 c
+318.02 416.88 316.58 417.67 316.58 417.67 C
+316.22 419.40 L
+@c
+B
+%%Note: Object
+327.10 424.37 338.54 430.27 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 22
+327.82 427.10 m
+327.10 428.54 330.70 428.54 332.64 428.69 c
+334.58 428.83 336.02 430.27 336.96 429.48 c
+337.90 428.69 338.54 428.69 337.61 427.25 c
+336.67 425.81 335.59 425.95 334.37 425.95 c
+333.14 425.95 333.07 425.59 331.49 425.38 c
+329.90 425.16 328.39 424.37 328.10 425.16 C
+327.82 425.95 327.96 426.82 327.82 427.10 c
+@c
+B
+%%Note: Object
+309.10 423.58 313.49 430.49 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.85 0.00 0.00 k
+%%CURV 22
+309.82 423.79 m
+309.60 425.81 309.10 425.38 309.53 426.89 c
+309.96 428.40 309.82 428.69 310.90 429.05 c
+311.98 429.41 312.84 430.49 313.13 429.55 c
+313.42 428.62 313.49 427.97 313.49 427.18 c
+313.49 426.38 313.34 425.81 313.06 425.16 c
+312.77 424.51 312.12 423.58 311.26 423.58 C
+310.39 423.58 309.82 423.79 309.82 423.79 c
+@c
+B
+%%Note: Object
+295.56 428.26 300.74 434.88 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 22
+299.88 428.47 m
+299.88 429.84 300.74 429.70 299.81 430.92 c
+298.87 432.14 299.59 432.86 298.44 433.44 c
+297.29 434.02 296.71 434.88 296.35 433.80 c
+295.99 432.72 295.85 433.08 295.99 431.28 c
+296.14 429.48 295.56 429.55 296.71 428.90 c
+297.86 428.26 297.79 428.26 298.58 428.26 C
+299.38 428.26 299.88 428.47 299.88 428.47 c
+@c
+B
+%%Note: Object
+294.34 414.79 299.74 419.90 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 19
+298.15 416.52 m
+299.23 417.60 299.74 418.75 298.15 419.26 c
+296.57 419.76 296.35 419.90 295.42 419.90 c
+294.48 419.90 294.34 418.75 294.34 417.82 c
+294.34 416.88 294.98 415.08 295.78 414.94 c
+296.57 414.79 297.36 414.94 297.36 414.94 C
+297.36 414.94 297.79 416.16 298.15 416.52 c
+@c
+B
+%%Note: Object
+320.26 394.13 326.95 399.10 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 19
+322.49 399.10 m
+324.14 397.87 324.65 398.88 324.94 397.01 c
+325.22 395.14 326.95 394.85 326.02 394.49 c
+325.08 394.13 323.14 394.13 323.14 394.13 c
+323.14 394.13 322.42 394.13 321.84 395.28 c
+321.26 396.43 320.26 396.94 320.76 397.87 C
+321.26 398.81 322.49 399.10 322.49 399.10 c
+@c
+B
+%%Note: Object
+281.38 388.15 289.22 394.85 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 25
+284.90 388.37 m
+285.84 389.09 285.77 388.94 286.49 390.10 c
+287.21 391.25 287.57 391.61 288.14 393.05 c
+288.72 394.49 289.22 394.42 288.43 394.56 c
+287.64 394.70 287.35 394.85 286.56 394.85 c
+285.77 394.85 285.62 394.20 284.76 393.48 c
+283.90 392.76 282.60 391.61 282.24 390.74 c
+281.88 389.88 281.38 389.30 282.02 388.73 C
+282.67 388.15 284.90 388.37 284.90 388.37 c
+@c
+B
+%%Note: Object
+273.82 369.00 279.72 381.02 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 28
+274.82 369.00 m
+275.62 369.29 275.40 369.72 276.41 370.87 c
+277.42 372.02 277.56 372.38 278.06 373.54 c
+278.57 374.69 278.93 376.78 279.07 377.78 c
+279.22 378.79 279.72 379.44 279.36 380.23 c
+279.00 381.02 278.86 380.88 278.14 380.59 c
+277.42 380.30 276.26 378.14 275.76 376.85 c
+275.26 375.55 274.46 374.69 274.32 373.25 c
+274.18 371.81 273.82 371.52 273.82 370.30 C
+273.82 369.07 274.82 369.00 274.82 369.00 c
+@c
+B
+%%Note: Object
+284.11 407.09 293.33 412.63 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 19
+292.82 409.54 m
+293.33 411.41 291.74 412.49 289.01 411.62 c
+286.27 410.76 285.48 412.63 284.98 411.41 c
+284.47 410.18 284.11 409.75 285.12 408.74 c
+286.13 407.74 286.42 407.59 287.71 407.59 c
+289.01 407.59 290.16 407.09 291.10 407.59 C
+292.03 408.10 292.75 409.18 292.82 409.54 c
+@c
+B
+%%Note: Object
+266.33 403.42 276.62 409.54 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 25
+272.16 404.06 m
+273.53 404.71 273.24 404.78 274.39 405.86 c
+275.54 406.94 276.62 406.80 275.83 407.45 c
+275.04 408.10 275.04 408.89 273.96 408.89 c
+272.88 408.89 271.66 409.54 270.36 408.24 c
+269.06 406.94 268.06 405.94 267.19 405.50 c
+266.33 405.07 266.69 404.42 267.48 403.92 c
+268.27 403.42 271.01 403.42 271.01 403.42 C
+271.01 403.42 271.87 403.92 272.16 404.06 c
+@c
+B
+%%Note: Object
+288.94 416.88 295.78 423.22 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 17
+295.78 419.40 m
+294.77 420.55 295.42 420.84 293.83 421.49 c
+292.25 422.14 291.53 423.22 290.59 422.93 c
+289.66 422.64 288.94 422.14 289.94 420.70 c
+290.95 419.26 291.10 420.05 292.54 418.46 c
+293.98 416.88 295.42 417.67 295.42 417.67 C
+295.78 419.40 L
+@c
+B
+%%Note: Object
+282.60 420.77 292.75 427.97 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 19
+290.59 422.93 m
+292.75 420.77 289.30 425.38 287.21 426.17 c
+285.12 426.96 284.76 427.97 283.68 426.96 c
+282.60 425.95 283.68 424.08 283.68 424.08 c
+283.68 424.08 285.55 422.78 286.56 421.99 c
+287.57 421.20 289.01 421.27 289.80 421.49 C
+290.59 421.70 290.45 423.07 290.59 422.93 c
+@c
+B
+%%Note: Object
+257.33 420.55 274.97 430.99 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 31
+274.54 429.34 m
+274.54 426.82 272.81 430.99 269.06 429.19 c
+265.32 427.39 265.32 427.46 264.24 426.31 c
+263.16 425.16 260.42 424.73 260.42 424.73 c
+260.42 424.73 257.33 422.86 257.83 421.85 c
+258.34 420.84 257.98 420.55 259.78 420.55 c
+261.58 420.55 262.01 422.06 263.30 422.50 c
+264.60 422.93 265.61 425.02 267.84 425.02 c
+270.07 425.02 270.58 426.31 272.02 426.31 c
+273.46 426.31 274.90 426.46 274.90 427.25 C
+274.97 428.11 274.54 429.34 274.54 429.34 c
+@c
+B
+%%Note: Object
+322.78 388.15 330.62 394.85 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 25
+327.10 388.37 m
+326.16 389.09 326.23 388.94 325.51 390.10 c
+324.79 391.25 324.43 391.61 323.86 393.05 c
+323.28 394.49 322.78 394.42 323.57 394.56 c
+324.36 394.70 324.65 394.85 325.44 394.85 c
+326.23 394.85 326.38 394.20 327.24 393.48 c
+328.10 392.76 329.40 391.61 329.76 390.74 c
+330.12 389.88 330.62 389.30 329.98 388.73 C
+329.33 388.15 327.10 388.37 327.10 388.37 c
+@c
+B
+%%Note: Object
+332.28 369.00 338.18 381.02 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 28
+337.18 369.00 m
+336.38 369.29 336.60 369.72 335.59 370.87 c
+334.58 372.02 334.44 372.38 333.94 373.54 c
+333.43 374.69 333.07 376.78 332.93 377.78 c
+332.78 378.79 332.28 379.44 332.64 380.23 c
+333.00 381.02 333.14 380.88 333.86 380.59 c
+334.58 380.30 335.74 378.14 336.24 376.85 c
+336.74 375.55 337.54 374.69 337.68 373.25 c
+337.82 371.81 338.18 371.52 338.18 370.30 C
+338.18 369.07 337.18 369.00 337.18 369.00 c
+@c
+B
+%%Note: Object
+318.67 407.09 327.89 412.63 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 19
+319.18 409.54 m
+318.67 411.41 320.26 412.49 322.99 411.62 c
+325.73 410.76 326.52 412.63 327.02 411.41 c
+327.53 410.18 327.89 409.75 326.88 408.74 c
+325.87 407.74 325.58 407.59 324.29 407.59 c
+322.99 407.59 321.84 407.09 320.90 407.59 C
+319.97 408.10 319.25 409.18 319.18 409.54 c
+@c
+B
+%%Note: Object
+335.38 403.42 345.67 409.54 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 25
+339.84 404.06 m
+338.47 404.71 338.76 404.78 337.61 405.86 c
+336.46 406.94 335.38 406.80 336.17 407.45 c
+336.96 408.10 336.96 408.89 338.04 408.89 c
+339.12 408.89 340.34 409.54 341.64 408.24 c
+342.94 406.94 343.94 405.94 344.81 405.50 c
+345.67 405.07 345.31 404.42 344.52 403.92 c
+343.73 403.42 340.99 403.42 340.99 403.42 C
+340.99 403.42 340.13 403.92 339.84 404.06 c
+@c
+B
+%%Note: Object
+312.26 414.79 317.66 419.90 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 19
+313.85 416.52 m
+312.77 417.60 312.26 418.75 313.85 419.26 c
+315.43 419.76 315.65 419.90 316.58 419.90 c
+317.52 419.90 317.66 418.75 317.66 417.82 c
+317.66 416.88 317.02 415.08 316.22 414.94 c
+315.43 414.79 314.64 414.94 314.64 414.94 C
+314.64 414.94 314.21 416.16 313.85 416.52 c
+@c
+B
+%%Note: Object
+319.25 420.77 329.40 427.97 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 19
+321.41 422.93 m
+319.25 420.77 322.70 425.38 324.79 426.17 c
+326.88 426.96 327.24 427.97 328.32 426.96 c
+329.40 425.95 328.32 424.08 328.32 424.08 c
+328.32 424.08 326.45 422.78 325.44 421.99 c
+324.43 421.20 322.99 421.27 322.20 421.49 C
+321.41 421.70 321.55 423.07 321.41 422.93 c
+@c
+B
+%%Note: Object
+337.03 420.55 354.67 430.99 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 31
+337.46 429.34 m
+337.46 426.82 339.19 430.99 342.94 429.19 c
+346.68 427.39 346.68 427.46 347.76 426.31 c
+348.84 425.16 351.58 424.73 351.58 424.73 c
+351.58 424.73 354.67 422.86 354.17 421.85 c
+353.66 420.84 354.02 420.55 352.22 420.55 c
+350.42 420.55 349.99 422.06 348.70 422.50 c
+347.40 422.93 346.39 425.02 344.16 425.02 c
+341.93 425.02 341.42 426.31 339.98 426.31 c
+338.54 426.31 337.10 426.46 337.10 427.25 C
+337.03 428.11 337.46 429.34 337.46 429.34 c
+@c
+B
+%%Note: Object
+309.53 428.26 314.71 434.88 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.30 0.30 0.00 k
+%%CURV 22
+310.39 428.47 m
+310.39 429.84 309.53 429.70 310.46 430.92 c
+311.40 432.14 310.68 432.86 311.83 433.44 c
+312.98 434.02 313.56 434.88 313.92 433.80 c
+314.28 432.72 314.42 433.08 314.28 431.28 c
+314.14 429.48 314.71 429.55 313.56 428.90 c
+312.41 428.26 312.48 428.26 311.69 428.26 C
+310.90 428.26 310.39 428.47 310.39 428.47 c
+@c
+B
+%%Note: Object
+309.38 433.44 311.76 436.46 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+1.00 0.45 0.00 0.00 k
+%%CURV 7
+311.76 433.44 m
+310.97 433.58 310.75 433.44 310.32 434.09 c
+309.89 434.74 309.53 435.82 309.38 436.46 C
+S
+%%Note: Object
+310.68 435.24 311.69 438.34 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+1.00 0.45 0.00 0.00 k
+%%CURV 7
+311.69 435.24 m
+311.26 435.89 310.82 436.18 310.75 436.75 c
+310.68 437.33 310.68 437.90 310.68 438.34 C
+S
+%%Note: Object
+311.69 435.96 312.84 439.34 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+312.70 435.96 m
+312.34 437.04 312.84 437.69 312.26 438.48 c
+311.69 439.27 311.83 438.84 311.69 439.34 C
+S
+%%Note: Object
+344.66 405.00 349.27 405.29 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+344.66 405.14 m
+346.82 405.00 347.62 405.29 349.27 405.14 C
+S
+%%Note: Object
+354.67 396.36 359.06 397.37 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+354.67 397.01 m
+357.05 396.50 357.84 397.37 359.06 396.36 C
+S
+%%Note: Object
+340.06 393.48 350.57 407.30 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+348.70 400.39 m
+348.91 397.87 348.55 398.52 349.56 396.00 c
+350.57 393.48 340.06 407.30 342.94 404.28 C
+S
+@rs
+@sv
+%%Note: Object
+339.19 400.39 342.07 404.64 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+339.19 404.64 m
+340.42 403.13 340.99 401.04 342.07 400.39 C
+S
+%%Note: Object
+321.98 403.49 324.43 407.66 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+321.98 407.66 m
+322.85 404.28 322.27 405.36 324.43 403.49 C
+S
+%%Note: Object
+321.26 390.96 321.84 395.57 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+321.26 395.57 m
+321.70 394.13 321.84 392.54 321.84 390.96 C
+S
+%%Note: Object
+324.29 387.00 324.94 392.26 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+324.29 392.26 m
+324.29 390.46 324.94 388.73 324.94 387.00 C
+S
+%%Note: Object
+328.97 380.74 329.26 385.85 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 2
+328.97 385.85 m
+329.26 380.74 L
+S
+%%Note: Object
+331.85 374.83 332.14 379.58 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 2
+331.99 379.58 m
+331.99 374.83 L
+S
+%%Note: Object
+332.64 366.62 334.08 372.24 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+334.08 372.24 m
+334.08 370.01 333.43 369.22 332.93 367.49 c
+332.93 367.27 332.78 366.62 332.64 366.62 C
+S
+%%Note: Object
+334.73 360.72 336.31 365.40 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 2
+336.31 365.40 m
+334.73 360.72 L
+S
+%%Note: Object
+335.38 352.58 336.31 357.70 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+336.31 357.70 m
+336.31 356.62 336.02 353.23 335.38 352.58 C
+S
+%%Note: Object
+326.88 392.40 330.70 393.84 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 5
+326.88 393.84 m
+327.53 393.70 328.32 393.19 328.97 393.19 C
+330.70 392.40 L
+S
+%%Note: Object
+330.05 387.00 334.73 389.23 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 5
+330.05 389.23 m
+331.70 388.73 333.29 387.79 334.58 387.14 C
+334.73 387.00 L
+S
+%%Note: Object
+333.29 381.38 337.10 384.26 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+333.29 384.26 m
+333.94 383.90 335.52 382.68 335.81 382.03 C
+336.31 382.03 336.67 381.38 337.10 381.38 C
+S
+%%Note: Object
+335.02 375.62 338.90 378.94 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+335.02 378.94 m
+336.46 378.14 337.75 376.13 338.90 375.62 C
+S
+%%Note: Object
+337.61 369.22 340.85 372.74 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+337.61 372.74 m
+339.19 371.95 339.98 370.80 340.85 369.22 C
+S
+%%Note: Object
+339.84 360.29 342.58 365.54 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 8
+339.84 365.54 m
+340.34 364.75 341.64 362.81 341.64 361.87 C
+341.93 361.87 L
+341.93 361.51 342.58 360.94 342.58 360.29 C
+S
+%%Note: Object
+339.70 353.52 341.28 359.28 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+339.70 359.28 m
+340.20 357.84 341.28 355.18 341.28 353.52 C
+S
+%%Note: Object
+317.81 421.06 320.54 428.11 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 5
+317.81 421.06 m
+318.17 423.58 319.32 425.59 319.32 425.59 c
+320.54 428.11 L
+S
+%%Note: Object
+320.69 422.71 322.70 428.47 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+321.05 422.71 m
+321.05 424.22 320.69 425.81 321.55 426.46 c
+322.42 427.10 322.70 428.47 322.70 428.47 C
+S
+%%Note: Object
+322.99 424.73 326.30 430.85 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+323.78 424.73 m
+324.43 426.46 322.99 428.04 324.58 428.83 c
+326.16 429.62 326.30 430.85 326.30 430.85 C
+S
+%%Note: Object
+327.31 427.46 331.20 432.36 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+327.31 427.46 m
+328.18 428.98 327.46 429.98 328.68 430.49 c
+329.90 430.99 331.20 432.36 331.20 432.36 C
+S
+%%Note: Object
+330.70 428.11 334.66 433.22 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+330.70 428.11 m
+331.56 429.62 330.77 430.70 331.92 431.21 c
+333.07 431.71 334.66 433.22 334.66 433.22 C
+S
+%%Note: Object
+333.58 428.62 340.92 432.86 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+333.58 428.62 m
+334.94 429.84 334.08 430.99 335.81 431.35 c
+337.54 431.71 340.92 432.86 340.92 432.86 C
+S
+%%Note: Object
+338.69 429.48 345.02 430.99 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 5
+338.69 429.48 m
+340.42 429.84 342.79 430.99 342.79 430.99 c
+345.02 430.99 L
+S
+%%Note: Object
+344.66 428.47 349.78 429.12 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+344.66 428.47 m
+347.18 428.47 347.76 429.12 349.78 428.47 C
+S
+%%Note: Object
+349.78 425.23 356.54 426.31 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+349.78 425.23 m
+352.30 425.23 352.30 426.31 353.66 426.31 c
+355.03 426.31 356.54 425.59 356.54 425.59 C
+S
+%%Note: Object
+320.04 419.54 325.80 420.41 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+320.04 419.54 m
+323.28 419.54 324.29 420.41 325.80 419.54 C
+S
+%%Note: Object
+325.80 422.57 330.91 423.29 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+325.80 422.57 m
+328.32 422.57 329.04 423.29 330.91 422.57 C
+S
+%%Note: Object
+328.68 423.43 337.18 424.94 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+328.68 424.73 m
+331.42 424.73 332.42 424.94 333.79 424.44 c
+335.16 423.94 335.45 424.30 337.18 423.43 C
+S
+%%Note: Object
+338.04 422.93 345.82 426.96 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+338.04 426.96 m
+341.42 424.73 341.42 425.74 342.79 424.58 c
+344.16 423.43 344.23 424.66 345.82 422.93 C
+S
+%%Note: Object
+323.21 411.34 328.75 413.71 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+323.21 411.34 m
+325.73 411.84 325.08 412.42 326.59 412.70 c
+328.10 412.99 327.38 413.71 328.75 413.71 C
+S
+%%Note: Object
+327.17 411.05 333.43 412.78 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+327.17 411.05 m
+329.18 411.41 328.18 412.56 330.55 412.56 c
+332.93 412.56 331.92 412.78 333.43 412.78 C
+S
+%%Note: Object
+332.93 410.76 336.17 411.26 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+332.93 410.76 m
+334.80 410.90 334.66 411.26 336.17 411.26 C
+S
+%%Note: Object
+335.66 409.54 340.06 410.40 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+335.66 409.54 m
+337.54 409.54 338.04 410.40 340.06 410.40 C
+S
+%%Note: Object
+339.91 408.38 343.80 409.46 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+339.91 408.38 m
+341.78 408.38 341.28 409.46 343.80 409.18 C
+S
+%%Note: Object
+342.79 406.66 347.18 406.87 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+342.79 406.87 m
+344.30 406.66 345.96 406.87 347.18 406.87 C
+S
+%%Note: Object
+350.28 401.11 356.40 402.34 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+350.28 402.12 m
+353.16 401.98 354.89 402.34 356.40 401.11 C
+S
+%%Note: Object
+352.44 398.88 357.55 400.54 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+352.44 399.74 m
+355.18 399.10 355.82 400.54 357.55 398.88 C
+S
+%%Note: Object
+356.69 391.61 360.94 393.98 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+356.69 393.98 m
+359.28 392.62 360.94 391.61 360.94 391.61 C
+S
+%%Note: Object
+356.69 390.31 359.28 391.97 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+356.69 391.97 m
+358.42 390.82 359.28 390.31 359.28 390.31 C
+S
+%%Note: Object
+355.18 388.44 357.05 391.61 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+355.18 391.61 m
+355.68 390.31 357.05 388.44 357.05 388.44 C
+S
+%%Note: Object
+352.51 391.10 353.66 394.70 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+353.30 394.70 m
+353.30 391.82 352.51 393.12 353.66 391.10 C
+S
+%%Note: Object
+351.07 392.62 352.66 397.51 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+351.07 397.51 m
+351.94 395.35 351.29 394.63 352.66 392.62 C
+S
+%%Note: Object
+341.57 399.24 345.67 403.63 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+341.57 403.63 m
+344.16 399.89 345.67 399.24 345.67 399.24 C
+S
+%%Note: Object
+334.30 402.84 338.90 406.94 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+334.30 406.94 m
+334.30 406.94 337.61 403.99 338.90 402.84 C
+S
+%%Note: Object
+331.06 403.99 334.44 407.38 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+331.06 407.38 m
+332.57 406.15 333.07 405.00 334.44 403.99 C
+S
+%%Note: Object
+328.32 403.13 333.43 408.17 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+328.32 408.17 m
+329.90 406.66 332.57 403.99 333.43 403.13 C
+S
+%%Note: Object
+325.80 402.77 332.57 407.66 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+325.80 407.66 m
+328.18 405.65 332.57 402.77 332.57 402.77 C
+S
+%%Note: Object
+322.06 404.64 325.30 407.88 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+322.06 407.88 m
+323.06 406.66 324.29 407.02 325.30 404.64 C
+S
+%%Note: Object
+320.04 397.87 327.82 407.66 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+320.04 407.66 m
+321.55 403.78 322.06 403.56 323.93 401.98 c
+325.80 400.39 327.46 400.25 327.82 397.87 C
+S
+%%Note: Object
+323.57 396.50 326.95 398.30 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+323.57 397.73 m
+325.66 397.01 324.58 398.30 326.95 396.50 C
+S
+%%Note: Object
+329.76 377.06 330.05 383.04 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+329.90 383.04 m
+329.90 380.66 329.90 378.72 329.90 377.06 C
+S
+%%Note: Object
+327.24 383.18 327.74 388.58 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+327.24 388.58 m
+327.60 385.49 327.74 384.77 327.74 383.18 C
+S
+%%Note: Object
+312.77 381.89 320.47 393.55 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+312.77 393.55 m
+316.08 390.96 320.11 385.13 320.47 381.89 C
+S
+%%Note: Object
+313.13 371.16 320.11 389.16 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+313.13 389.16 m
+313.49 387.00 320.11 378.43 318.10 371.16 C
+S
+%%Note: Object
+311.18 373.10 313.42 384.70 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+311.26 384.70 m
+313.42 379.22 311.18 375.26 311.54 373.10 C
+S
+%%Note: Object
+298.58 372.02 301.54 383.98 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+301.54 383.98 m
+298.58 379.30 299.95 375.70 299.23 372.02 C
+S
+%%Note: Object
+291.17 378.79 294.55 388.08 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+294.55 388.08 m
+294.55 385.20 291.17 384.98 291.17 378.79 C
+S
+%%Note: Object
+289.44 383.33 293.83 393.12 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+293.83 393.12 m
+293.11 390.60 289.80 389.09 289.44 383.33 C
+S
+%%Note: Object
+293.11 370.30 300.38 389.52 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+300.38 389.52 m
+300.38 389.52 294.91 380.88 294.19 375.77 c
+293.47 370.66 293.11 370.30 293.11 370.30 C
+S
+%%Note: Object
+306.22 368.42 306.94 388.80 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+306.94 388.80 m
+306.94 388.80 306.22 384.48 306.22 379.01 c
+306.22 373.54 306.22 370.94 306.22 368.42 C
+S
+%%Note: Object
+308.81 402.55 313.85 407.30 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+313.85 407.30 m
+313.85 407.30 311.04 404.35 308.81 402.55 C
+S
+%%Note: Object
+307.66 405.86 310.25 410.18 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 2
+310.25 410.18 m
+307.66 405.86 L
+S
+%%Note: Object
+301.82 403.70 306.22 409.46 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+301.82 409.46 m
+302.18 407.66 306.22 403.70 306.22 403.70 C
+S
+%%Note: Object
+297.50 394.63 304.06 405.86 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 6
+298.94 405.86 m
+302.18 402.98 L
+297.50 399.31 l
+297.50 399.31 301.18 396.14 304.06 394.63 C
+S
+%%Note: Object
+304.99 421.34 305.28 428.90 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 2
+305.28 428.90 m
+304.99 421.34 L
+S
+%%Note: Object
+262.51 419.98 267.26 426.53 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+267.26 426.53 m
+263.59 422.21 263.23 422.50 262.51 419.98 C
+S
+%%Note: Object
+254.81 419.62 260.64 422.93 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 2
+260.64 422.93 m
+254.81 419.62 L
+S
+%%Note: Object
+347.40 417.46 351.07 425.09 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+347.40 425.09 m
+348.12 423.29 351.07 417.46 351.07 417.46 C
+S
+%%Note: Object
+352.51 417.82 356.54 422.21 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 2
+352.51 422.21 m
+356.54 417.82 L
+S
+%%Note: Object
+304.06 427.97 306.29 429.12 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.80 0.00 0.20 k
+%%CURV 14
+306.29 428.69 m
+305.86 428.04 306.22 427.97 305.57 427.97 c
+304.92 427.97 304.34 428.11 304.34 428.11 c
+304.06 428.90 l
+304.06 428.90 304.49 429.12 305.14 428.98 C
+305.78 428.83 306.29 428.69 306.29 428.69 c
+@c
+B
+%%Note: Object
+296.06 432.14 300.89 438.19 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.80 0.00 0.20 k
+%%CURV 19
+298.80 432.14 m
+299.74 432.43 300.38 432.58 300.38 433.66 c
+300.38 434.74 300.89 434.45 300.24 435.67 c
+299.59 436.90 300.10 438.19 298.73 437.40 c
+297.36 436.61 296.78 436.32 296.64 435.38 c
+296.50 434.45 296.06 434.30 296.50 433.51 C
+296.93 432.72 298.80 432.14 298.80 432.14 c
+@c
+B
+%%Note: Object
+309.38 432.14 314.21 438.19 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.80 0.00 0.20 k
+%%CURV 19
+311.47 432.14 m
+310.54 432.43 309.89 432.58 309.89 433.66 c
+309.89 434.74 309.38 434.45 310.03 435.67 c
+310.68 436.90 310.18 438.19 311.54 437.40 c
+312.91 436.61 313.49 436.32 313.63 435.38 c
+313.78 434.45 314.21 434.30 313.78 433.51 C
+313.34 432.72 311.47 432.14 311.47 432.14 c
+@c
+B
+%%Note: Object
+288.50 395.35 300.10 402.70 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.80 0.00 0.20 k
+%%CURV 25
+300.10 400.90 m
+300.10 400.90 299.81 402.70 297.86 402.19 c
+295.92 401.69 297.14 401.47 294.91 401.33 c
+292.68 401.18 290.81 402.26 289.66 401.18 c
+288.50 400.10 289.08 401.40 289.51 399.46 c
+289.94 397.51 290.59 395.42 290.59 395.42 c
+290.59 395.42 293.18 395.35 294.48 395.57 c
+295.78 395.78 297.07 397.08 297.86 398.02 C
+298.66 398.95 300.10 400.90 300.10 400.90 c
+@c
+B
+%%Note: Object
+291.38 404.86 300.38 414.00 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.80 0.00 0.20 k
+%%CURV 19
+300.24 405.22 m
+299.09 408.38 300.38 406.80 298.80 409.03 c
+297.22 411.26 297.43 412.06 295.56 412.78 c
+293.69 413.50 291.82 414.00 291.60 411.26 c
+291.38 408.53 292.39 409.03 293.83 407.45 c
+295.27 405.86 296.21 405.58 297.50 405.22 C
+298.80 404.86 300.24 405.22 300.24 405.22 c
+@c
+B
+%%Note: Object
+295.85 406.66 303.77 418.68 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.80 0.00 0.20 k
+%%CURV 22
+302.18 407.30 m
+303.77 407.30 303.26 408.89 302.33 411.12 c
+301.39 413.35 302.18 416.02 300.10 416.52 c
+298.01 417.02 298.15 418.68 297.50 416.88 c
+296.86 415.08 295.85 414.94 296.86 413.50 c
+297.86 412.06 297.86 411.91 298.80 410.33 c
+299.74 408.74 300.10 407.23 300.89 406.94 C
+301.68 406.66 301.90 407.30 302.18 407.30 c
+@c
+B
+%%Note: Object
+297.86 419.83 304.06 424.80 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.80 0.00 0.20 k
+%%CURV 19
+300.74 420.12 m
+301.75 420.19 301.68 419.83 302.33 420.91 c
+302.98 421.99 304.06 423.00 303.05 423.58 c
+302.04 424.15 302.33 424.30 300.82 424.22 c
+299.30 424.15 297.86 424.80 298.22 423.65 c
+298.58 422.50 298.66 422.14 299.38 421.56 C
+300.10 420.98 300.74 420.05 300.74 420.12 c
+@c
+B
+%%Note: Object
+311.62 404.86 320.62 414.00 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.80 0.00 0.20 k
+%%CURV 19
+311.76 405.22 m
+312.91 408.38 311.62 406.80 313.20 409.03 c
+314.78 411.26 314.57 412.06 316.44 412.78 c
+318.31 413.50 320.18 414.00 320.40 411.26 c
+320.62 408.53 319.61 409.03 318.17 407.45 c
+316.73 405.86 315.79 405.58 314.50 405.22 C
+313.20 404.86 311.76 405.22 311.76 405.22 c
+@c
+B
+%%Note: Object
+308.23 406.66 316.15 418.68 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.80 0.00 0.20 k
+%%CURV 22
+309.82 407.30 m
+308.23 407.30 308.74 408.89 309.67 411.12 c
+310.61 413.35 309.82 416.02 311.90 416.52 c
+313.99 417.02 313.85 418.68 314.50 416.88 c
+315.14 415.08 316.15 414.94 315.14 413.50 c
+314.14 412.06 314.14 411.91 313.20 410.33 c
+312.26 408.74 311.90 407.23 311.11 406.94 C
+310.32 406.66 310.10 407.30 309.82 407.30 c
+@c
+B
+%%Note: Object
+306.22 419.83 312.41 424.80 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.80 0.00 0.20 k
+%%CURV 19
+309.53 420.12 m
+308.52 420.19 308.59 419.83 307.94 420.91 c
+307.30 421.99 306.22 423.00 307.22 423.58 c
+308.23 424.15 307.94 424.30 309.46 424.22 c
+310.97 424.15 312.41 424.80 312.05 423.65 c
+311.69 422.50 311.62 422.14 310.90 421.56 C
+310.18 420.98 309.53 420.05 309.53 420.12 c
+@c
+B
+%%Note: Object
+311.90 395.35 323.50 402.70 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.22 0.22 0.00 @w
+ 0 O 0 @g
+0.00 0.80 0.00 0.20 k
+%%CURV 25
+311.90 400.90 m
+311.90 400.90 312.19 402.70 314.14 402.19 c
+316.08 401.69 314.86 401.47 317.09 401.33 c
+319.32 401.18 321.19 402.26 322.34 401.18 c
+323.50 400.10 322.92 401.40 322.49 399.46 c
+322.06 397.51 321.41 395.42 321.41 395.42 c
+321.41 395.42 318.82 395.35 317.52 395.57 c
+316.22 395.78 314.93 397.08 314.14 398.02 C
+313.34 398.95 311.90 400.90 311.90 400.90 c
+@c
+B
+%%Note: Object
+308.45 397.15 315.36 398.23 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+315.36 398.23 m
+313.13 397.15 308.45 397.15 308.45 397.15 C
+S
+%%Note: Object
+300.10 425.74 301.54 429.34 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+300.10 425.74 m
+300.31 427.03 300.89 428.40 301.54 429.34 C
+S
+%%Note: Object
+299.16 429.48 301.32 432.36 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+299.16 429.48 m
+299.16 429.48 300.60 430.49 301.32 432.36 C
+S
+%%Note: Object
+309.02 426.60 310.03 429.48 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+310.03 426.60 m
+309.46 427.90 309.96 428.98 309.02 429.48 C
+S
+%%Note: Object
+309.67 430.27 310.82 432.14 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+310.82 430.27 m
+310.32 431.28 310.46 431.78 309.67 432.14 C
+S
+%%Note: Object
+296.42 422.06 299.23 423.72 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+299.23 422.06 m
+297.43 422.57 297.36 422.50 296.42 423.72 C
+S
+%%Note: Object
+295.49 426.02 297.43 428.40 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+297.43 426.02 m
+296.57 426.82 296.21 427.25 295.49 428.40 C
+S
+%%Note: Object
+295.06 430.92 296.42 433.51 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+296.42 430.92 m
+295.85 431.93 295.13 432.29 295.06 433.51 C
+S
+%%Note: Object
+296.28 434.59 297.07 436.75 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+297.07 434.59 m
+296.78 435.60 296.28 434.74 296.28 436.75 C
+S
+%%Note: Object
+297.65 436.25 297.94 438.77 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+297.94 436.25 m
+297.94 436.97 297.65 437.62 297.94 438.77 C
+S
+%%Note: Object
+310.54 421.70 312.91 422.64 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+1.00 0.30 0.00 0.00 k
+%%CURV 4
+310.54 421.78 m
+311.62 421.78 311.83 421.70 312.91 422.64 C
+S
+%%Note: Object
+311.90 424.44 314.21 425.52 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+311.90 424.44 m
+313.13 424.66 313.56 424.44 314.21 425.52 C
+S
+%%Note: Object
+312.91 425.88 314.57 427.68 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+312.91 425.88 m
+313.70 426.10 314.06 427.10 314.57 427.68 C
+S
+%%Note: Object
+313.13 427.82 314.86 429.84 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+313.13 427.82 m
+313.78 428.69 314.14 428.83 314.86 429.84 C
+S
+%%Note: Object
+313.78 430.49 314.86 433.22 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+313.78 430.49 m
+314.57 431.64 314.50 432.07 314.86 433.22 C
+S
+%%Note: Object
+313.70 432.72 314.42 435.31 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 4
+313.70 432.72 m
+314.28 433.73 314.35 434.02 314.42 435.31 C
+S
+%%Note: Object
+313.27 433.80 313.92 438.55 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+1.00 0.45 0.00 0.00 k
+%%CURV 7
+313.27 434.59 m
+313.27 434.59 313.49 433.80 313.70 436.18 c
+313.92 438.55 313.78 438.55 313.78 438.55 C
+S
+%%Note: Object
+306.86 411.19 309.17 418.10 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+309.17 418.10 m
+308.38 417.02 307.66 416.95 307.30 415.30 c
+306.94 413.64 306.86 412.92 306.94 411.19 C
+S
+%%Note: Object
+302.90 411.12 304.49 418.82 @E
+0 J 0 j [] 0 d 0 R 0 @G
+0.00 0.00 0.00 1.00 K
+0 0.58 0.58 0.00 @w
+ 0 O 0 @g
+0.00 0.00 0.00 0.30 k
+%%CURV 7
+302.90 418.82 m
+303.91 417.74 303.70 418.25 303.98 416.16 c
+304.27 414.07 304.34 412.34 304.49 411.12 C
+S
+@rs
+@rs
+%%Trailer
+ end
diff --git a/Master/texmf-dist/tex/context/test/pdf-a1a-2005.mkiv b/Master/texmf-dist/tex/context/test/pdf-a1a-2005.mkiv
new file mode 100644
index 00000000000..4600e7a096b
--- /dev/null
+++ b/Master/texmf-dist/tex/context/test/pdf-a1a-2005.mkiv
@@ -0,0 +1,43 @@
+% PDF/A-1a:2005
+
+\enabletrackers[structure.tags,backend.tags]
+
+\setupbackend
+ [format=PDF/A-1a:2005,
+ intent=sRGB IEC61966-2.1, % use <info> entry here; otherwise problems with predefined default profile
+ profile=sRGB.icc, % use <filename> here
+ level=0,
+ ]
+
+\setupstructure[state=start]
+
+\setupcolors[cmyk=no]
+\definecolor[rgbblack][b=0.01]
+\definecolor[transtest][r=1,g=1,t=.5]
+
+
+\placebookmarks[chapter][all][force=yes]
+
+
+\starttext
+
+\starttextcolor[rgbblack]
+
+\startchapter[title=aa,bookmark=bb,list=cc,marking=dd]
+
+Test it
+
+\stopchapter
+
+\stoptextcolor
+
+\hbox\bgroup
+ \blackrule[width=1cm,height=1cm,color=red]
+ \blackrule[width=1cm,height=1cm,color=green]
+ \blackrule[width=1cm,height=1cm,color=blue]
+ \blackrule[width=1cm,height=1cm,color=rgbblack]
+ \blackrule[width=1cm,height=1cm,color=transtest]\hskip-.5cm
+ \blackrule[width=1cm,height=1cm,color=transtest]
+\egroup
+
+\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
new file mode 100644
index 00000000000..8a032395cae
--- /dev/null
+++ b/Master/texmf-dist/tex/context/test/pdf-a1b-2005.mkiv
@@ -0,0 +1,42 @@
+% PDF/A-1b:2005
+
+\enabletrackers[structure.tags,backend.tags]
+
+\setupbackend
+ [format=PDF/A-1a:2005,
+ intent=sRGB IEC61966-2.1, % use <info> entry here; otherwise problems with predefined default profile
+ profile=sRGB.icc, % use <filename> here
+ level=0,
+ ]
+
+\setupstructure[state=start] % needed even for 'b'-version
+
+\setupcolors[cmyk=no]
+\definecolor[rgbblack][b=0.01]
+\definecolor[transtest][r=1,g=1,t=.5]
+
+
+
+\starttext
+
+\starttextcolor[rgbblack] % forced /DeviceGray causes problems; we need a trigger
+
+Text is needed, otherwise tagging base entries are not applied.
+
+\stopchapter
+
+\stoptextcolor
+
+%\startTEXpage
+\hbox\bgroup
+ \blackrule[width=1cm,height=1cm,color=red]
+ \blackrule[width=1cm,height=1cm,color=green]
+ \blackrule[width=1cm,height=1cm,color=blue]
+ \blackrule[width=1cm,height=1cm,color=rgbblack]
+ \blackrule[width=1cm,height=1cm,color=transtest]\hskip-.5cm
+ \blackrule[width=1cm,height=1cm,color=transtest]
+\egroup
+%\stopTEXpage
+
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/test/pdf-x-common.mkiv b/Master/texmf-dist/tex/context/test/pdf-x-common.mkiv
new file mode 100644
index 00000000000..463a60e71ff
--- /dev/null
+++ b/Master/texmf-dist/tex/context/test/pdf-x-common.mkiv
@@ -0,0 +1,30 @@
+\showlayoutcomponents % \nopdfcompression
+
+\setupinteraction
+ [title=TITLE,
+ subtitle=SUBTITLE,
+ author=AUTHOR,
+ keyword={{KEYWORD1, KEYWORD2}, KEYWORD3}]
+
+\definecolor[cmykcyan][c=1]
+\definecolor[cmykmagenta][m=1]
+\definecolor[cmykyellow][y=1]
+\definecolor[cmykblack][k=1]
+\definecolor[transtest][y=1,a=1,t=.5]
+
+\starttext
+
+\startTEXpage
+ \blackrule[width=1cm,height=1cm,color=cmykcyan]
+ \blackrule[width=1cm,height=1cm,color=cmykmagenta]
+ \blackrule[width=1cm,height=1cm,color=cmykyellow]
+ \blackrule[width=1cm,height=1cm,color=cmykblack]
+ \blackrule[width=1cm,height=1cm,color=transtest]\hskip-.5cm
+ \blackrule[width=1cm,height=1cm,color=transtest]
+\stopTEXpage
+
+\startTEXpage
+ \tt Some text.
+\stopTEXpage
+
+\stoptext
diff --git a/Master/texmf-dist/tex/context/test/pdf-x1a-2001.mkiv b/Master/texmf-dist/tex/context/test/pdf-x1a-2001.mkiv
new file mode 100644
index 00000000000..a304c8963c3
--- /dev/null
+++ b/Master/texmf-dist/tex/context/test/pdf-x1a-2001.mkiv
@@ -0,0 +1,9 @@
+% PDF/X-1a:2001
+
+\enabletrackers[backend.pdfx]
+
+\setupbackend
+ [format=PDF/X-1a:2001,
+ intent=ISOcoated_v2_eci.icc]
+
+\input pdf-x-common.mkiv
diff --git a/Master/texmf-dist/tex/context/test/pdf-x1a-2003.mkiv b/Master/texmf-dist/tex/context/test/pdf-x1a-2003.mkiv
new file mode 100644
index 00000000000..89a0f6066e8
--- /dev/null
+++ b/Master/texmf-dist/tex/context/test/pdf-x1a-2003.mkiv
@@ -0,0 +1,10 @@
+% PDF/X-1a:2003
+
+\enabletrackers[backend.pdfx]
+
+\setupbackend
+ [format=PDF/X-1a:2003,
+ intent=ISOcoated_v2_eci.icc,
+ option=always]
+
+\input pdf-x-common.mkiv
diff --git a/Master/texmf-dist/tex/context/test/pdf-x3-2002.mkiv b/Master/texmf-dist/tex/context/test/pdf-x3-2002.mkiv
new file mode 100644
index 00000000000..1e2310135ec
--- /dev/null
+++ b/Master/texmf-dist/tex/context/test/pdf-x3-2002.mkiv
@@ -0,0 +1,10 @@
+% PDF/X-3:2002
+
+\enabletrackers[backend.pdfx]
+
+\setupbackend
+ [format=PDF/X-3:2002,
+ level=9, % maybe compresslevel
+ intent=ISOcoated_v2_eci.icc]
+
+\input pdf-x-common.mkiv
diff --git a/Master/texmf-dist/tex/context/test/pdf-x3-2003.mkiv b/Master/texmf-dist/tex/context/test/pdf-x3-2003.mkiv
new file mode 100644
index 00000000000..bedcde527b6
--- /dev/null
+++ b/Master/texmf-dist/tex/context/test/pdf-x3-2003.mkiv
@@ -0,0 +1,9 @@
+% PDF/X-3:2003
+
+\enabletrackers[backend.pdfx]
+
+\setupbackend
+ [format=PDF/X-3:2003,
+ intent=ISOcoated_v2_eci.icc]
+
+\input pdf-x-common.mkiv
diff --git a/Master/texmf-dist/tex/context/test/pdf-x4.mkiv b/Master/texmf-dist/tex/context/test/pdf-x4.mkiv
new file mode 100644
index 00000000000..0566475b5af
--- /dev/null
+++ b/Master/texmf-dist/tex/context/test/pdf-x4.mkiv
@@ -0,0 +1,11 @@
+% PDF/X-4
+
+% \nopdfcompression
+
+\enabletrackers[backend.pdfx]
+
+\setupbackend
+ [format=PDF/X-4,
+ intent=ISOcoated_v2_eci.icc]
+
+\input pdf-x-common.mkiv
diff --git a/Master/texmf-dist/tex/context/test/pdf-x4p.mkiv b/Master/texmf-dist/tex/context/test/pdf-x4p.mkiv
new file mode 100644
index 00000000000..9ec8897f811
--- /dev/null
+++ b/Master/texmf-dist/tex/context/test/pdf-x4p.mkiv
@@ -0,0 +1,10 @@
+% PDF/X-4p
+
+\enabletrackers[backend.pdfx]
+
+\setupbackend
+ [format=PDF/X-4p,
+ intent=ISOcoated_v2_eci.icc,
+ profile=sRGB.icc] % test for default colorspace
+
+\input pdf-x-common.mkiv
diff --git a/Master/texmf-dist/tex/context/user/cont-sys.rme b/Master/texmf-dist/tex/context/user/cont-sys.rme
index 5f637551376..fa438a78d4f 100644
--- a/Master/texmf-dist/tex/context/user/cont-sys.rme
+++ b/Master/texmf-dist/tex/context/user/cont-sys.rme
@@ -11,6 +11,10 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D Beware, this is a MkII specific file. In MkIV we only load
+%D cont-sys.mkiv but in MkII we load the first found of
+%D cont-sys.mkii, cont-sys.tex, cont-sys.rme.
+
\unprotect
% Speed up typescript loading, but at the cost of much memory:
@@ -157,11 +161,8 @@
% Enabling run time \METAPOST\ (also enable \write18 in
% texmf.cnf):
-% Disabled in TeXLive 2010 because \write18 is restricted by
-% default.
-
-%\runMPgraphicstrue
-%\runMPTEXgraphicstrue
+\runMPgraphicstrue
+\runMPTEXgraphicstrue
% This saves some runtime, but needs a format, which you can
% make with 'texexec --make --alone metafun'. Make sure that
diff --git a/Master/texmf-dist/tex/generic/context/luatex-basics-gen.lua b/Master/texmf-dist/tex/generic/context/luatex-basics-gen.lua
new file mode 100644
index 00000000000..602601d5cc7
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex-basics-gen.lua
@@ -0,0 +1,226 @@
+if not modules then modules = { } end modules ['luat-basics-gen'] = {
+ version = 1.100,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+local dummyfunction = function() end
+local dummyreporter = function(c) return function(...) texio.write(c .. " : " .. string.format(...)) end end
+
+statistics = {
+ register = dummyfunction,
+ starttiming = dummyfunction,
+ stoptiming = dummyfunction,
+ elapsedtime = nil,
+}
+
+directives = {
+ register = dummyfunction,
+ enable = dummyfunction,
+ disable = dummyfunction,
+}
+
+trackers = {
+ register = dummyfunction,
+ enable = dummyfunction,
+ disable = dummyfunction,
+}
+
+experiments = {
+ register = dummyfunction,
+ enable = dummyfunction,
+ disable = dummyfunction,
+}
+
+storage = { -- probably no longer needed
+ register = dummyfunction,
+ shared = { },
+}
+
+logs = {
+ new = dummyreporter,
+ reporter = dummyreporter,
+ messenger = dummyreporter,
+ report = dummyfunction,
+}
+
+callbacks = {
+ register = function(n,f) return callback.register(n,f) end,
+
+}
+
+utilities = {
+ storage = {
+ allocate = function(t) return t or { } end,
+ mark = function(t) return t or { } end,
+ },
+}
+
+characters = characters or {
+ data = { }
+}
+
+-- we need to cheat a bit here
+
+texconfig.kpse_init = true
+
+resolvers = resolvers or { } -- no fancy file helpers used
+
+local remapper = {
+ otf = "opentype fonts",
+ ttf = "truetype fonts",
+ ttc = "truetype fonts",
+ dfont = "truetype fonts", -- "truetype dictionary",
+ cid = "cid maps",
+ fea = "font feature files",
+}
+
+function resolvers.findfile(name,fileformat)
+ name = string.gsub(name,"\\","\/")
+ fileformat = fileformat and string.lower(fileformat)
+ local found = kpse.find_file(name,(fileformat and fileformat ~= "" and (remapper[fileformat] or fileformat)) or file.extname(name,"tex"))
+ if not found or found == "" then
+ found = kpse.find_file(name,"other text files")
+ end
+ return found
+end
+
+function resolvers.findbinfile(name,fileformat)
+ if not fileformat or fileformat == "" then
+ fileformat = file.extname(name) -- string.match(name,"%.([^%.]-)$")
+ end
+ return resolvers.findfile(name,(fileformat and remapper[fileformat]) or fileformat)
+end
+
+function resolvers.resolve(s)
+ return s
+end
+
+function resolvers.unresolve(s)
+ return s
+end
+
+-- Caches ... I will make a real stupid version some day when I'm in the
+-- mood. After all, the generic code does not need the more advanced
+-- ConTeXt features. Cached data is not shared between ConTeXt and other
+-- usage as I don't want any dependency at all. Also, ConTeXt might have
+-- different needs and tricks added.
+
+--~ containers.usecache = true
+
+caches = { }
+
+local writable, readables = nil, { }
+
+if not caches.namespace or caches.namespace == "" or caches.namespace == "context" then
+ caches.namespace = 'generic'
+end
+
+do
+
+ local cachepaths = kpse.expand_path('$TEXMFCACHE') or ""
+
+ if cachepaths == "" then
+ cachepaths = kpse.expand_path('$TEXMFVAR')
+ end
+
+ if cachepaths == "" then
+ cachepaths = kpse.expand_path('$VARTEXMF')
+ end
+
+ if cachepaths == "" then
+ cachepaths = "."
+ end
+
+ cachepaths = string.split(cachepaths,os.type == "windows" and ";" or ":")
+
+ for i=1,#cachepaths do
+ if file.is_writable(cachepaths[i]) then
+ writable = file.join(cachepaths[i],"luatex-cache")
+ lfs.mkdir(writable)
+ writable = file.join(writable,caches.namespace)
+ lfs.mkdir(writable)
+ break
+ end
+ end
+
+ for i=1,#cachepaths do
+ if file.is_readable(cachepaths[i]) then
+ readables[#readables+1] = file.join(cachepaths[i],"luatex-cache",caches.namespace)
+ end
+ end
+
+ if not writable then
+ texio.write_nl("quiting: fix your writable cache path")
+ os.exit()
+ elseif #readables == 0 then
+ texio.write_nl("quiting: fix your readable cache path")
+ os.exit()
+ elseif #readables == 1 and readables[1] == writable then
+ texio.write(string.format("(using cache: %s)",writable))
+ else
+ texio.write(string.format("(using write cache: %s)",writable))
+ texio.write(string.format("(using read cache: %s)",table.concat(readables, " ")))
+ end
+
+end
+
+function caches.getwritablepath(category,subcategory)
+ local path = file.join(writable,category)
+ lfs.mkdir(path)
+ path = file.join(path,subcategory)
+ lfs.mkdir(path)
+ return path
+end
+
+function caches.getreadablepaths(category,subcategory)
+ local t = { }
+ for i=1,#readables do
+ t[i] = file.join(readables[i],category,subcategory)
+ end
+ return t
+end
+
+local function makefullname(path,name)
+ if path and path ~= "" then
+ name = "temp-" .. name -- clash prevention
+ return file.addsuffix(file.join(path,name),"lua")
+ end
+end
+
+function caches.is_writable(path,name)
+ local fullname = makefullname(path,name)
+ return fullname and file.is_writable(fullname)
+end
+
+function caches.loaddata(paths,name)
+ for i=1,#paths do
+ local fullname = makefullname(paths[i],name)
+ if fullname then
+ texio.write(string.format("(load: %s)",fullname))
+ local data = loadfile(fullname)
+ return data and data()
+ end
+ end
+end
+
+function caches.savedata(path,name,data)
+ local fullname = makefullname(path,name)
+ if fullname then
+ texio.write(string.format("(save: %s)",fullname))
+ table.tofile(fullname,data,true,{ reduce = true })
+ end
+end
+
+--
+
+local table.setmetatableindex(t,f)
+ setmetatable(t,{ __index = f })
+end
diff --git a/Master/texmf-dist/tex/generic/context/luatex-basics-nod.lua b/Master/texmf-dist/tex/generic/context/luatex-basics-nod.lua
new file mode 100644
index 00000000000..151d98a8f31
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex-basics-nod.lua
@@ -0,0 +1,95 @@
+if not modules then modules = { } end modules ['luatex-fonts-nod'] = {
+ version = 1.001,
+ comment = "companion to luatex-fonts.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+-- Don't depend on code here as it is only needed to complement the
+-- font handler code.
+
+-- Attributes:
+
+if tex.attribute[0] ~= 0 then
+
+ texio.write_nl("log","!")
+ texio.write_nl("log","! Attribute 0 is reserved for ConTeXt's font feature management and has to be")
+ texio.write_nl("log","! set to zero. Also, some attributes in the range 1-255 are used for special")
+ texio.write_nl("log","! purposes so setting them at the TeX end might break the font handler.")
+ texio.write_nl("log","!")
+
+ tex.attribute[0] = 0 -- else no features
+
+end
+
+attributes = { }
+attributes.unsetvalue = -0x7FFFFFFF
+
+local numbers, last = { }, 127
+
+function attributes.private(name)
+ local number = numbers[name]
+ if not number then
+ if last < 255 then
+ last = last + 1
+ end
+ number = last
+ numbers[name] = number
+ end
+ return number
+end
+
+-- Nodes:
+
+nodes = { }
+nodes.pool = { }
+nodes.handlers = { }
+
+local nodecodes = { } for k,v in next, node.types () do nodecodes[string.gsub(v,"_","")] = k end
+local whatcodes = { } for k,v in next, node.whatsits() do whatcodes[string.gsub(v,"_","")] = k end
+local glyphcodes = { [0] = "character", "glyph", "ligature", "ghost", "left", "right" }
+
+nodes.nodecodes = nodecodes
+nodes.whatcodes = whatcodes
+nodes.whatsitcodes = whatcodes
+nodes.glyphcodes = glyphcodes
+
+local free_node = node.free
+local remove_node = node.remove
+local new_node = node.new
+
+nodes.handlers.protectglyphs = node.protect_glyphs
+nodes.handlers.unprotectglyphs = node.unprotect_glyphs
+
+function nodes.remove(head, current, free_too)
+ local t = current
+ head, current = remove_node(head,current)
+ if t then
+ if free_too then
+ free_node(t)
+ t = nil
+ else
+ t.next, t.prev = nil, nil
+ end
+ end
+ return head, current, t
+end
+
+function nodes.delete(head,current)
+ return nodes.remove(head,current,true)
+end
+
+nodes.before = node.insert_before
+nodes.after = node.insert_after
+
+function nodes.pool.kern(k)
+ local n = new_node("kern",1)
+ n.kern = k
+ return n
+end
diff --git a/Master/texmf-dist/tex/generic/context/luatex-fonts-cbk.lua b/Master/texmf-dist/tex/generic/context/luatex-fonts-cbk.lua
new file mode 100644
index 00000000000..9db94f65e48
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex-fonts-cbk.lua
@@ -0,0 +1,68 @@
+if not modules then modules = { } end modules ['luatex-fonts-cbk'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+local fonts = fonts
+local nodes = nodes
+
+-- Fonts: (might move to node-gef.lua)
+
+local traverse_id = node.traverse_id
+local glyph_code = nodes.nodecodes.glyph
+
+function nodes.handlers.characters(head)
+ local fontdata = fonts.hashes.identifiers
+ if fontdata then
+ local usedfonts, done, prevfont = { }, false, nil
+ for n in traverse_id(glyph_code,head) 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
+ done = true
+ end
+ end
+ end
+ end
+ end
+ end
+ if done 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
+ end
+ end
+ end
+ return head, true
+ else
+ return head, false
+ end
+end
+
+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
+end
diff --git a/Master/texmf-dist/tex/generic/context/luatex-fonts-def.lua b/Master/texmf-dist/tex/generic/context/luatex-fonts-def.lua
new file mode 100644
index 00000000000..0c2f0dbd583
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex-fonts-def.lua
@@ -0,0 +1,97 @@
+if not modules then modules = { } end modules ['luatex-font-def'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+local fonts = fonts
+
+-- A bit of tuning for definitions.
+
+fonts.constructors.namemode = "specification" -- somehow latex needs this (changed name!) => will change into an overload
+
+-- tricky: we sort of bypass the parser and directly feed all into
+-- the sub parser
+
+function fonts.definers.getspecification(str)
+ return "", str, "", ":", str
+end
+
+-- the generic name parser (different from context!)
+
+local list = { }
+
+local function issome () list.lookup = 'name' end -- xetex mode prefers name (not in context!)
+local function isfile () list.lookup = 'file' end
+local function isname () list.lookup = 'name' end
+local function thename(s) list.name = s end
+local function issub (v) list.sub = v end
+local function iscrap (s) list.crap = string.lower(s) end
+local function iskey (k,v) list[k] = v end
+local function istrue (s) list[s] = true end
+local function isfalse(s) list[s] = false end
+
+local P, S, R, C = lpeg.P, lpeg.S, lpeg.R, lpeg.C
+
+local spaces = P(" ")^0
+local namespec = (1-S("/:("))^0 -- was: (1-S("/: ("))^0
+local crapspec = spaces * P("/") * (((1-P(":"))^0)/iscrap) * spaces
+local filename_1 = P("file:")/isfile * (namespec/thename)
+local filename_2 = P("[") * P(true)/isname * (((1-P("]"))^0)/thename) * P("]")
+local fontname_1 = P("name:")/isname * (namespec/thename)
+local fontname_2 = P(true)/issome * (namespec/thename)
+local sometext = (R("az","AZ","09") + S("+-."))^1
+local truevalue = P("+") * spaces * (sometext/istrue)
+local falsevalue = P("-") * spaces * (sometext/isfalse)
+local keyvalue = (C(sometext) * spaces * P("=") * spaces * C(sometext))/iskey
+local somevalue = sometext/istrue
+local subvalue = P("(") * (C(P(1-S("()"))^1)/issub) * P(")") -- for Kim
+local option = spaces * (keyvalue + falsevalue + truevalue + somevalue) * spaces
+local options = P(":") * spaces * (P(";")^0 * option)^0
+
+local pattern = (filename_1 + filename_2 + fontname_1 + fontname_2) * subvalue^0 * crapspec^0 * options^0
+
+local function colonized(specification) -- xetex mode
+ list = { }
+ lpeg.match(pattern,specification.specification)
+ list.crap = nil -- style not supported, maybe some day
+ if list.name then
+ specification.name = list.name
+ list.name = nil
+ end
+ if list.lookup then
+ specification.lookup = list.lookup
+ list.lookup = nil
+ end
+ if list.sub then
+ specification.sub = list.sub
+ list.sub = nil
+ end
+ specification.features.normal = fonts.handlers.otf.features.normalize(list)
+ return specification
+end
+
+fonts.definers.registersplit(":",colonized,"cryptic")
+fonts.definers.registersplit("", colonized,"more cryptic") -- catches \font\text=[names]
+
+function fonts.definers.applypostprocessors(tfmdata)
+ local postprocessors = tfmdata.postprocessors
+ if postprocessors then
+ for i=1,#postprocessors do
+ local extrahash = postprocessors[i](tfmdata) -- after scaling etc
+ if type(extrahash) == "string" and extrahash ~= "" then
+ -- e.g. a reencoding needs this
+ extrahash = string.gsub(lower(extrahash),"[^a-z]","-")
+ tfmdata.properties.fullname = format("%s-%s",tfmdata.properties.fullname,extrahash)
+ end
+ end
+ end
+ return tfmdata
+end
diff --git a/Master/texmf-dist/tex/generic/context/luatex-fonts-demo-vf-1.lua b/Master/texmf-dist/tex/generic/context/luatex-fonts-demo-vf-1.lua
new file mode 100644
index 00000000000..3878ae64805
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex-fonts-demo-vf-1.lua
@@ -0,0 +1,38 @@
+local identifiers = fonts.hashes.identifiers
+
+return function(specification)
+ local f1, id1 = fonts.constructors.readanddefine('lmroman10-regular', specification.size)
+ local f2, id2 = fonts.constructors.readanddefine('lmsans10-regular', specification.size)
+ local f3, id3 = fonts.constructors.readanddefine('lmtypewriter10-regular',specification.size)
+ if f1 and f2 and f3 then
+ f1.properties.name = specification.name
+ f1.properties.virtualized = true
+ f1.fonts = {
+ { id = id1 },
+ { id = id2 },
+ { id = id3 },
+ }
+ local color = { [0] =
+ { "special", "pdf:0 g" },
+ { "special", "pdf:1 0 0 rg" },
+ { "special", "pdf:0 1 0 rg" },
+ { "special", "pdf:0 0 1 rg" },
+ }
+ local chars = {
+ identifiers[id1].characters,
+ identifiers[id2].characters,
+ identifiers[id3].characters,
+ }
+ for u, v in next, f1.characters do
+ local n = math.floor(math.random(1,3)+0.5)
+ local c = chars[n][u] or v
+ v.commands = { color[n], { 'slot', n, u }, color[0] }
+ v.kerns = nil
+ v.width = c.width
+ v.height = c.height
+ v.depth = c.depth
+ v.italic = nil
+ end
+ end
+ return f1
+end
diff --git a/Master/texmf-dist/tex/generic/context/luatex-fonts-enc.lua b/Master/texmf-dist/tex/generic/context/luatex-fonts-enc.lua
new file mode 100644
index 00000000000..ac736f2a6e8
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex-fonts-enc.lua
@@ -0,0 +1,28 @@
+if not modules then modules = { } end modules ['luatex-font-enc'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+local fonts = fonts
+fonts.encodings = { }
+fonts.encodings.agl = { }
+
+setmetatable(fonts.encodings.agl, { __index = function(t,k)
+ if k == "unicodes" then
+ texio.write(" <loading (extended) adobe glyph list>")
+ local unicodes = dofile(resolvers.findfile("font-agl.lua"))
+ fonts.encodings.agl = { unicodes = unicodes }
+ return unicodes
+ else
+ return nil
+ end
+end })
+
diff --git a/Master/texmf-dist/tex/generic/context/luatex-fonts-ext.lua b/Master/texmf-dist/tex/generic/context/luatex-fonts-ext.lua
new file mode 100644
index 00000000000..951afcc7e0b
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex-fonts-ext.lua
@@ -0,0 +1,276 @@
+if not modules then modules = { } end modules ['luatex-fonts-ext'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+local fonts = fonts
+local otffeatures = fonts.constructors.newfeatures("otf")
+
+-- A few generic extensions.
+
+local function initializeitlc(tfmdata,value)
+ if value then
+ -- the magic 40 and it formula come from Dohyun Kim
+ local parameters = tfmdata.parameters
+ local italicangle = parameters.italicangle
+ if italicangle and italicangle ~= 0 then
+ local uwidth = (parameters.uwidth or 40)/2
+ for unicode, d in next, tfmdata.descriptions do
+ local it = d.boundingbox[3] - d.width + uwidth
+ if it ~= 0 then
+ d.italic = it
+ end
+ end
+ tfmdata.properties.italic_correction = true
+ end
+ end
+end
+
+otffeatures.register {
+ name = "itlc",
+ description = "italic correction",
+ initializers = {
+ base = initializeitlc,
+ node = initializeitlc,
+ }
+}
+
+-- slant and extend
+
+local function initializeslant(tfmdata,value)
+ value = tonumber(value)
+ if not value then
+ value = 0
+ elseif value > 1 then
+ value = 1
+ elseif value < -1 then
+ value = -1
+ end
+ tfmdata.parameters.slant_factor = value
+end
+
+otffeatures.register {
+ name = "slant",
+ description = "slant glyphs",
+ initializers = {
+ base = initializeslant,
+ node = initializeslant,
+ }
+}
+
+local function initializeextend(tfmdata,value)
+ value = tonumber(value)
+ if not value then
+ value = 0
+ elseif value > 10 then
+ value = 10
+ elseif value < -10 then
+ value = -10
+ end
+ tfmdata.parameters.extend_factor = value
+end
+
+otffeatures.register {
+ name = "extend",
+ description = "scale glyphs horizontally",
+ initializers = {
+ base = initializeextend,
+ node = initializeextend,
+ }
+}
+
+-- expansion and protrusion
+
+fonts.protrusions = fonts.protrusions or { }
+fonts.protrusions.setups = fonts.protrusions.setups or { }
+
+local setups = fonts.protrusions.setups
+
+local function initializeprotrusion(tfmdata,value)
+ if value then
+ local setup = setups[value]
+ if setup then
+ local factor, left, right = setup.factor or 1, setup.left or 1, setup.right or 1
+ local emwidth = tfmdata.parameters.quad
+ tfmdata.parameters.protrusion = {
+ auto = true,
+ }
+ for i, chr in next, tfmdata.characters do
+ local v, pl, pr = setup[i], nil, nil
+ if v then
+ pl, pr = v[1], v[2]
+ end
+ if pl and pl ~= 0 then chr.left_protruding = left *pl*factor end
+ if pr and pr ~= 0 then chr.right_protruding = right*pr*factor end
+ end
+ end
+ end
+end
+
+otffeatures.register {
+ name = "protrusion",
+ description = "shift characters into the left and or right margin",
+ initializers = {
+ base = initializeprotrusion,
+ node = initializeprotrusion,
+ }
+}
+
+fonts.expansions = fonts.expansions or { }
+fonts.expansions.setups = fonts.expansions.setups or { }
+
+local setups = fonts.expansions.setups
+
+local function initializeexpansion(tfmdata,value)
+ if value then
+ local setup = setups[value]
+ if setup then
+ local factor = setup.factor or 1
+ tfmdata.parameters.expansion = {
+ stretch = 10 * (setup.stretch or 0),
+ shrink = 10 * (setup.shrink or 0),
+ step = 10 * (setup.step or 0),
+ auto = true,
+ }
+ for i, chr in next, tfmdata.characters do
+ local v = setup[i]
+ if v and v ~= 0 then
+ chr.expansion_factor = v*factor
+ else -- can be option
+ chr.expansion_factor = factor
+ end
+ end
+ end
+ end
+end
+
+otffeatures.register {
+ name = "expansion",
+ description = "apply hz optimization",
+ initializers = {
+ base = initializeexpansion,
+ node = initializeexpansion,
+ }
+}
+
+-- left over
+
+function fonts.loggers.onetimemessage() end
+
+-- example vectors
+
+local byte = string.byte
+
+fonts.expansions.setups['default'] = {
+
+ stretch = 2, shrink = 2, step = .5, factor = 1,
+
+ [byte('A')] = 0.5, [byte('B')] = 0.7, [byte('C')] = 0.7, [byte('D')] = 0.5, [byte('E')] = 0.7,
+ [byte('F')] = 0.7, [byte('G')] = 0.5, [byte('H')] = 0.7, [byte('K')] = 0.7, [byte('M')] = 0.7,
+ [byte('N')] = 0.7, [byte('O')] = 0.5, [byte('P')] = 0.7, [byte('Q')] = 0.5, [byte('R')] = 0.7,
+ [byte('S')] = 0.7, [byte('U')] = 0.7, [byte('W')] = 0.7, [byte('Z')] = 0.7,
+ [byte('a')] = 0.7, [byte('b')] = 0.7, [byte('c')] = 0.7, [byte('d')] = 0.7, [byte('e')] = 0.7,
+ [byte('g')] = 0.7, [byte('h')] = 0.7, [byte('k')] = 0.7, [byte('m')] = 0.7, [byte('n')] = 0.7,
+ [byte('o')] = 0.7, [byte('p')] = 0.7, [byte('q')] = 0.7, [byte('s')] = 0.7, [byte('u')] = 0.7,
+ [byte('w')] = 0.7, [byte('z')] = 0.7,
+ [byte('2')] = 0.7, [byte('3')] = 0.7, [byte('6')] = 0.7, [byte('8')] = 0.7, [byte('9')] = 0.7,
+}
+
+fonts.protrusions.setups['default'] = {
+
+ factor = 1, left = 1, right = 1,
+
+ [0x002C] = { 0, 1 }, -- comma
+ [0x002E] = { 0, 1 }, -- period
+ [0x003A] = { 0, 1 }, -- colon
+ [0x003B] = { 0, 1 }, -- semicolon
+ [0x002D] = { 0, 1 }, -- hyphen
+ [0x2013] = { 0, 0.50 }, -- endash
+ [0x2014] = { 0, 0.33 }, -- emdash
+ [0x3001] = { 0, 1 }, -- ideographic comma 、
+ [0x3002] = { 0, 1 }, -- ideographic full stop 。
+ [0x060C] = { 0, 1 }, -- arabic comma ،
+ [0x061B] = { 0, 1 }, -- arabic semicolon ؛
+ [0x06D4] = { 0, 1 }, -- arabic full stop ۔
+
+}
+
+-- normalizer
+
+fonts.handlers.otf.features.normalize = function(t)
+ if t.rand then
+ t.rand = "random"
+ end
+ return t
+end
+
+-- bonus
+
+function fonts.helpers.nametoslot(name)
+ local t = type(name)
+ if t == "string" then
+ local tfmdata = fonts.hashes.identifiers[currentfont()]
+ local shared = tfmdata and tfmdata.shared
+ local fntdata = shared and shared.rawdata
+ return fntdata and fntdata.resources.unicodes[name]
+ elseif t == "number" then
+ return n
+ end
+end
+
+-- \font\test=file:somefont:reencode=mymessup
+--
+-- fonts.encodings.reencodings.mymessup = {
+-- [109] = 110, -- m
+-- [110] = 109, -- n
+-- }
+
+fonts.encodings = fonts.encodings or { }
+local reencodings = { }
+fonts.encodings.reencodings = reencodings
+
+local function specialreencode(tfmdata,value)
+ -- we forget about kerns as we assume symbols and we
+ -- could issue a message if ther are kerns but it's
+ -- a hack anyway so we odn't care too much here
+ local encoding = value and reencodings[value]
+ if encoding then
+ local temp = { }
+ local char = tfmdata.characters
+ for k, v in next, encoding do
+ temp[k] = char[v]
+ end
+ for k, v in next, temp do
+ char[k] = temp[k]
+ end
+ -- if we use the font otherwise luatex gets confused so
+ -- we return an additional hash component for fullname
+ return string.format("reencoded:%s",value)
+ end
+end
+
+local function reencode(tfmdata,value)
+ tfmdata.postprocessors = tfmdata.postprocessors or { }
+ table.insert(tfmdata.postprocessors,
+ function(tfmdata)
+ return specialreencode(tfmdata,value)
+ end
+ )
+end
+
+otffeatures.register {
+ name = "reencode",
+ description = "reencode characters",
+ manipulators = {
+ base = reencode,
+ node = reencode,
+ }
+}
diff --git a/Master/texmf-dist/tex/generic/context/luatex-fonts-lua.lua b/Master/texmf-dist/tex/generic/context/luatex-fonts-lua.lua
new file mode 100644
index 00000000000..ec3fe38be3e
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex-fonts-lua.lua
@@ -0,0 +1,33 @@
+if not modules then modules = { } end modules ['luatex-fonts-lua'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+local fonts = fonts
+fonts.formats.lua = "lua"
+
+function fonts.readers.lua(specification)
+ local fullname = specification.filename or ""
+ if fullname == "" then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ fullname = specification.name .. "." .. forced
+ else
+ fullname = specification.name
+ end
+ end
+ local fullname = resolvers.findfile(fullname) or ""
+ if fullname ~= "" then
+ local loader = loadfile(fullname)
+ loader = loader and loader()
+ return loader and loader(specification)
+ end
+end
diff --git a/Master/texmf-dist/tex/generic/context/luatex-fonts-merged.lua b/Master/texmf-dist/tex/generic/context/luatex-fonts-merged.lua
index da81735ff23..7e954182ad7 100644
--- a/Master/texmf-dist/tex/generic/context/luatex-fonts-merged.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
-- merged file : luatex-fonts-merged.lua
-- parent file : luatex-fonts.lua
--- merge date : 05/24/10 13:05:12
+-- merge date : 05/18/11 18:04:18
do -- begin closure to overcome local limits and interference
@@ -12,8 +12,9 @@ if not modules then modules = { } end modules ['l-string'] = {
license = "see context related readme files"
}
+local string = string
local sub, gsub, find, match, gmatch, format, char, byte, rep, lower = string.sub, string.gsub, string.find, string.match, string.gmatch, string.format, string.char, string.byte, string.rep, string.lower
-local lpegmatch = lpeg.match
+local lpegmatch, S, C, Ct = lpeg.match, lpeg.S, lpeg.C, lpeg.Ct
-- some functions may disappear as they are not used anywhere
@@ -21,196 +22,75 @@ if not string.split then
-- this will be overloaded by a faster lpeg variant
- function string:split(pattern)
- if #self > 0 then
- local t = { }
- for s in gmatch(self..pattern,"(.-)"..pattern) do
- t[#t+1] = s
+ function string.split(str,pattern)
+ local t = { }
+ if #str > 0 then
+ local n = 1
+ for s in gmatch(str..pattern,"(.-)"..pattern) do
+ t[n] = s
+ n = n + 1
end
- return t
- else
- return { }
end
+ return t
end
end
-local chr_to_esc = {
- ["%"] = "%%",
- ["."] = "%.",
- ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
- ["^"] = "%^", ["$"] = "%$",
- ["["] = "%[", ["]"] = "%]",
- ["("] = "%(", [")"] = "%)",
- ["{"] = "%{", ["}"] = "%}"
-}
-
-string.chr_to_esc = chr_to_esc
-
-function string:esc() -- variant 2
- return (gsub(self,"(.)",chr_to_esc))
-end
-
-function string:unquote()
- return (gsub(self,"^([\"\'])(.*)%1$","%2"))
+function string.unquoted(str)
+ return (gsub(str,"^([\"\'])(.*)%1$","%2"))
end
---~ function string:unquote()
---~ if find(self,"^[\'\"]") then
---~ return sub(self,2,-2)
+--~ function stringunquoted(str)
+--~ if find(str,"^[\'\"]") then
+--~ return sub(str,2,-2)
--~ else
---~ return self
+--~ return str
--~ end
--~ end
-function string:quote() -- we could use format("%q")
- return format("%q",self)
+function string.quoted(str)
+ return format("%q",str) -- always "
end
-function string:count(pattern) -- variant 3
+function string.count(str,pattern) -- variant 3
local n = 0
- for _ in gmatch(self,pattern) do
+ for _ in gmatch(str,pattern) do -- not for utf
n = n + 1
end
return n
end
-function string:limit(n,sentinel)
- if #self > n then
- sentinel = sentinel or " ..."
- return sub(self,1,(n-#sentinel)) .. sentinel
+function string.limit(str,n,sentinel) -- not utf proof
+ if #str > n then
+ sentinel = sentinel or "..."
+ return sub(str,1,(n-#sentinel)) .. sentinel
else
- return self
- end
-end
-
---~ function string:strip() -- the .- is quite efficient
---~ -- return match(self,"^%s*(.-)%s*$") or ""
---~ -- return match(self,'^%s*(.*%S)') or '' -- posted on lua list
---~ return find(s,'^%s*$') and '' or match(s,'^%s*(.*%S)')
---~ end
-
-do -- roberto's variant:
- local space = lpeg.S(" \t\v\n")
- local nospace = 1 - space
- local stripper = space^0 * lpeg.C((space^0 * nospace^1)^0)
- function string.strip(str)
- return lpegmatch(stripper,str) or ""
- end
-end
-
-function string:is_empty()
- return not find(self,"%S")
-end
-
-function string:enhance(pattern,action)
- local ok, n = true, 0
- while ok do
- ok = false
- self = gsub(self,pattern, function(...)
- ok, n = true, n + 1
- return action(...)
- end)
- end
- return self, n
-end
-
-local chr_to_hex, hex_to_chr = { }, { }
-
-for i=0,255 do
- local c, h = char(i), format("%02X",i)
- chr_to_hex[c], hex_to_chr[h] = h, c
-end
-
-function string:to_hex()
- return (gsub(self or "","(.)",chr_to_hex))
-end
-
-function string:from_hex()
- return (gsub(self or "","(..)",hex_to_chr))
-end
-
-if not string.characters then
-
- local function nextchar(str, index)
- index = index + 1
- return (index <= #str) and index or nil, sub(str,index,index)
- end
- function string:characters()
- return nextchar, self, 0
- end
- local function nextbyte(str, index)
- index = index + 1
- return (index <= #str) and index or nil, byte(sub(str,index,index))
- end
- function string:bytes()
- return nextbyte, self, 0
- end
-
-end
-
--- we can use format for this (neg n)
-
-function string:rpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return self .. rep(chr or " ",m)
- else
- return self
- end
-end
-
-function string:lpadd(n,chr)
- local m = n-#self
- if m > 0 then
- return rep(chr or " ",m) .. self
- else
- return self
+ return str
end
end
-string.padd = string.rpadd
+local space = S(" \t\v\n")
+local nospace = 1 - space
+local stripper = space^0 * C((space^0 * nospace^1)^0) -- roberto's code
-function is_number(str) -- tonumber
- return find(str,"^[%-%+]?[%d]-%.?[%d+]$") == 1
+function string.strip(str)
+ return lpegmatch(stripper,str) or ""
end
---~ print(is_number("1"))
---~ print(is_number("1.1"))
---~ print(is_number(".1"))
---~ print(is_number("-0.1"))
---~ print(is_number("+0.1"))
---~ print(is_number("-.1"))
---~ print(is_number("+.1"))
-
-function string:split_settings() -- no {} handling, see l-aux for lpeg variant
- if find(self,"=") then
- local t = { }
- for k,v in gmatch(self,"(%a+)=([^%,]*)") do
- t[k] = v
- end
- return t
- else
- return nil
- end
+function string.is_empty(str)
+ return not find(str,"%S")
end
local patterns_escapes = {
- ["-"] = "%-",
- ["."] = "%.",
- ["+"] = "%+",
- ["*"] = "%*",
["%"] = "%%",
- ["("] = "%)",
- [")"] = "%)",
- ["["] = "%[",
- ["]"] = "%]",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%(", [")"] = "%)",
+ -- ["{"] = "%{", ["}"] = "%}"
+ -- ["^"] = "%^", ["$"] = "%$",
}
-function string:pattesc()
- return (gsub(self,".",patterns_escapes))
-end
-
local simple_escapes = {
["-"] = "%-",
["."] = "%.",
@@ -218,80 +98,30 @@ local simple_escapes = {
["*"] = ".*",
}
-function string:simpleesc()
- return (gsub(self,".",simple_escapes))
-end
-
-function string:tohash()
- local t = { }
- for s in gmatch(self,"([^, ]+)") do -- lpeg
- t[s] = true
- end
- return t
-end
-
-local pattern = lpeg.Ct(lpeg.C(1)^0)
-
-function string:totable()
- return lpegmatch(pattern,self)
+function string.escapedpattern(str,simple)
+ return (gsub(str,".",simple and simple_escapes or patterns_escapes))
end
---~ local t = {
---~ "1234567123456712345671234567",
---~ "a\tb\tc",
---~ "aa\tbb\tcc",
---~ "aaa\tbbb\tccc",
---~ "aaaa\tbbbb\tcccc",
---~ "aaaaa\tbbbbb\tccccc",
---~ "aaaaaa\tbbbbbb\tcccccc",
---~ }
---~ for k,v do
---~ print(string.tabtospace(t[k]))
---~ end
-
-function string.tabtospace(str,tab)
- -- we don't handle embedded newlines
- while true do
- local s = find(str,"\t")
- if s then
- if not tab then tab = 7 end -- only when found
- local d = tab-(s-1) % tab
- if d > 0 then
- str = gsub(str,"\t",rep(" ",d),1)
- else
- str = gsub(str,"\t","",1)
- end
+function string.topattern(str,lowercase,strict)
+ if str == "" then
+ return ".*"
+ else
+ str = gsub(str,".",simple_escapes)
+ if lowercase then
+ str = lower(str)
+ end
+ if strict then
+ return "^" .. str .. "$"
else
- break
+ return str
end
end
- return str
-end
-
-function string:compactlong() -- strips newlines and leading spaces
- self = gsub(self,"[\n\r]+ *","")
- self = gsub(self,"^ *","")
- return self
end
-function string:striplong() -- strips newlines and leading spaces
- self = gsub(self,"^%s*","")
- self = gsub(self,"[\n\r]+ *","\n")
- return self
-end
+-- obsolete names:
-function string:topattern(lowercase,strict)
- if lowercase then
- self = lower(self)
- end
- self = gsub(self,".",simple_escapes)
- if self == "" then
- self = ".*"
- elseif strict then
- self = "^" .. self .. "$"
- end
- return self
-end
+string.quote = string.quoted
+string.unquote = string.unquoted
end -- closure
@@ -307,28 +137,75 @@ if not modules then modules = { } end modules ['l-lpeg'] = {
local lpeg = require("lpeg")
+local type = type
+
+-- Beware, we predefine a bunch of patterns here and one reason for doing so
+-- is that we get consistent behaviour in some of the visualizers.
+
lpeg.patterns = lpeg.patterns or { } -- so that we can share
local patterns = lpeg.patterns
-local P, R, S, Ct, C, Cs, Cc, V = lpeg.P, lpeg.R, lpeg.S, lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc, lpeg.V
-local match = lpeg.match
+local P, R, S, V, match = lpeg.P, lpeg.R, lpeg.S, lpeg.V, lpeg.match
+local Ct, C, Cs, Cc = lpeg.Ct, lpeg.C, lpeg.Cs, lpeg.Cc
+local lpegtype = lpeg.type
+
+local utfcharacters = string.utfcharacters
+local utfgmatch = unicode and unicode.utf8.gmatch
+
+local anything = P(1)
+local endofstring = P(-1)
+local alwaysmatched = P(true)
+
+patterns.anything = anything
+patterns.endofstring = endofstring
+patterns.beginofstring = alwaysmatched
+patterns.alwaysmatched = alwaysmatched
local digit, sign = R('09'), S('+-')
local cr, lf, crlf = P("\r"), P("\n"), P("\r\n")
-local utf8byte = R("\128\191")
+local newline = crlf + cr + lf
+local escaped = P("\\") * anything
+local squote = P("'")
+local dquote = P('"')
+local space = P(" ")
+
+local utfbom_32_be = P('\000\000\254\255')
+local utfbom_32_le = P('\255\254\000\000')
+local utfbom_16_be = P('\255\254')
+local utfbom_16_le = P('\254\255')
+local utfbom_8 = P('\239\187\191')
+local utfbom = utfbom_32_be + utfbom_32_le
+ + utfbom_16_be + utfbom_16_le
+ + utfbom_8
+local utftype = utfbom_32_be / "utf-32-be" + utfbom_32_le / "utf-32-le"
+ + utfbom_16_be / "utf-16-be" + utfbom_16_le / "utf-16-le"
+ + utfbom_8 / "utf-8" + alwaysmatched / "unknown"
+
+local utf8next = R("\128\191")
-patterns.utf8byte = utf8byte
patterns.utf8one = R("\000\127")
-patterns.utf8two = R("\194\223") * utf8byte
-patterns.utf8three = R("\224\239") * utf8byte * utf8byte
-patterns.utf8four = R("\240\244") * utf8byte * utf8byte * utf8byte
+patterns.utf8two = R("\194\223") * utf8next
+patterns.utf8three = R("\224\239") * utf8next * utf8next
+patterns.utf8four = R("\240\244") * utf8next * utf8next * utf8next
+patterns.utfbom = utfbom
+patterns.utftype = utftype
+
+local utf8char = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
+local validutf8char = utf8char^0 * endofstring * Cc(true) + Cc(false)
+
+patterns.utf8 = utf8char
+patterns.utf8char = utf8char
+patterns.validutf8 = validutf8char
+patterns.validutf8char = validutf8char
patterns.digit = digit
patterns.sign = sign
patterns.cardinal = sign^0 * digit^1
patterns.integer = sign^0 * digit^1
patterns.float = sign^0 * digit^0 * P('.') * digit^1
+patterns.cfloat = sign^0 * digit^0 * P(',') * digit^1
patterns.number = patterns.float + patterns.integer
+patterns.cnumber = patterns.cfloat + patterns.integer
patterns.oct = P("0") * R("07")^1
patterns.octal = patterns.oct
patterns.HEX = P("0x") * R("09","AF")^1
@@ -337,16 +214,46 @@ patterns.hexadecimal = P("0x") * R("09","AF","af")^1
patterns.lowercase = R("az")
patterns.uppercase = R("AZ")
patterns.letter = patterns.lowercase + patterns.uppercase
-patterns.space = S(" ")
+patterns.space = space
+patterns.tab = P("\t")
+patterns.spaceortab = patterns.space + patterns.tab
patterns.eol = S("\n\r")
patterns.spacer = S(" \t\f\v") -- + string.char(0xc2, 0xa0) if we want utf (cf mail roberto)
-patterns.newline = crlf + cr + lf
-patterns.nonspace = 1 - patterns.space
+patterns.newline = newline
+patterns.emptyline = newline^1
patterns.nonspacer = 1 - patterns.spacer
patterns.whitespace = patterns.eol + patterns.spacer
patterns.nonwhitespace = 1 - patterns.whitespace
-patterns.utf8 = patterns.utf8one + patterns.utf8two + patterns.utf8three + patterns.utf8four
-patterns.utfbom = P('\000\000\254\255') + P('\255\254\000\000') + P('\255\254') + P('\254\255') + P('\239\187\191')
+patterns.equal = P("=")
+patterns.comma = P(",")
+patterns.commaspacer = P(",") * patterns.spacer^0
+patterns.period = P(".")
+patterns.colon = P(":")
+patterns.semicolon = P(";")
+patterns.underscore = P("_")
+patterns.escaped = escaped
+patterns.squote = squote
+patterns.dquote = dquote
+patterns.nosquote = (escaped + (1-squote))^0
+patterns.nodquote = (escaped + (1-dquote))^0
+patterns.unsingle = (squote/"") * patterns.nosquote * (squote/"")
+patterns.undouble = (dquote/"") * patterns.nodquote * (dquote/"")
+patterns.unquoted = patterns.undouble + patterns.unsingle -- more often undouble
+patterns.unspacer = ((patterns.spacer^1)/"")^0
+
+patterns.somecontent = (anything - newline - space)^1 -- (utf8char - newline - space)^1
+patterns.beginline = #(1-newline)
+
+local unquoted = Cs(patterns.unquoted * endofstring) -- not C
+
+function string.unquoted(str)
+ return match(unquoted,str) or str
+end
+
+--~ print(string.unquoted("test"))
+--~ print(string.unquoted([["t\"est"]]))
+--~ print(string.unquoted([["t\"est"x]]))
+--~ print(string.unquoted("\'test\'"))
function lpeg.anywhere(pattern) --slightly adapted from website
return P { P(pattern) + 1 * V(1) } -- why so complex?
@@ -356,36 +263,18 @@ function lpeg.splitter(pattern, action)
return (((1-P(pattern))^1)/action+1)^0
end
-local spacing = patterns.spacer^0 * patterns.newline -- sort of strip
-local empty = spacing * Cc("")
-local nonempty = Cs((1-spacing)^1) * spacing^-1
-local content = (empty + nonempty)^1
-
-local capture = Ct(content^0)
-
-function string:splitlines()
- return match(capture,self)
-end
-
-patterns.textline = content
-
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
---~ local p = lpeg.splitat("->",false) print(match(p,"oeps")) -- oeps
---~ local p = lpeg.splitat("->",true) print(match(p,"oeps")) -- oeps
-
local splitters_s, splitters_m = { }, { }
local function splitat(separator,single)
local splitter = (single and splitters_s[separator]) or splitters_m[separator]
if not splitter then
separator = P(separator)
+ local other = C((1 - separator)^0)
if single then
- local other, any = C((1 - separator)^0), P(1)
+ local any = anything
splitter = other * (separator * C(any^0) + "") -- ?
splitters_s[separator] = splitter
else
- local other = C((1 - separator)^0)
splitter = other * (separator * other)^0
splitters_m[separator] = splitter
end
@@ -395,6 +284,11 @@ end
lpeg.splitat = splitat
+--~ local p = splitat("->",false) print(match(p,"oeps->what->more")) -- oeps what more
+--~ local p = splitat("->",true) print(match(p,"oeps->what->more")) -- oeps what->more
+--~ local p = splitat("->",false) print(match(p,"oeps")) -- oeps
+--~ local p = splitat("->",true) print(match(p,"oeps")) -- oeps
+
local cache = { }
function lpeg.split(separator,str)
@@ -406,16 +300,45 @@ function lpeg.split(separator,str)
return match(c,str)
end
-function string:split(separator)
+function string.split(str,separator)
local c = cache[separator]
if not c then
c = Ct(splitat(separator))
cache[separator] = c
end
- return match(c,self)
+ return match(c,str)
+end
+
+local spacing = patterns.spacer^0 * newline -- sort of strip
+local empty = spacing * Cc("")
+local nonempty = Cs((1-spacing)^1) * spacing^-1
+local content = (empty + nonempty)^1
+
+patterns.textline = content
+
+--~ local linesplitter = Ct(content^0)
+--~
+--~ function string.splitlines(str)
+--~ return match(linesplitter,str)
+--~ end
+
+local linesplitter = Ct(splitat(newline))
+
+patterns.linesplitter = linesplitter
+
+function string.splitlines(str)
+ return match(linesplitter,str)
+end
+
+local utflinesplitter = utfbom^-1 * Ct(splitat(newline))
+
+patterns.utflinesplitter = utflinesplitter
+
+function string.utfsplitlines(str)
+ return match(utflinesplitter,str)
end
-lpeg.splitters = cache
+--~ lpeg.splitters = cache -- no longer public
local cache = { }
@@ -423,36 +346,24 @@ function lpeg.checkedsplit(separator,str)
local c = cache[separator]
if not c then
separator = P(separator)
- local other = C((1 - separator)^0)
+ local other = C((1 - separator)^1)
c = Ct(separator^0 * other * (separator^1 * other)^0)
cache[separator] = c
end
return match(c,str)
end
-function string:checkedsplit(separator)
+function string.checkedsplit(str,separator)
local c = cache[separator]
if not c then
separator = P(separator)
- local other = C((1 - separator)^0)
+ local other = C((1 - separator)^1)
c = Ct(separator^0 * other * (separator^1 * other)^0)
cache[separator] = c
end
- return match(c,self)
+ return match(c,str)
end
---~ function lpeg.append(list,pp)
---~ local p = pp
---~ for l=1,#list do
---~ if p then
---~ p = p + P(list[l])
---~ else
---~ p = P(list[l])
---~ end
---~ end
---~ return p
---~ end
-
--~ from roberto's site:
local f1 = string.byte
@@ -461,7 +372,302 @@ local function f2(s) local c1, c2 = f1(s,1,2) return c1 * 64 + c2
local function f3(s) local c1, c2, c3 = f1(s,1,3) return (c1 * 64 + c2) * 64 + c3 - 925824 end
local function f4(s) local c1, c2, c3, c4 = f1(s,1,4) return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168 end
-patterns.utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
+local utf8byte = patterns.utf8one/f1 + patterns.utf8two/f2 + patterns.utf8three/f3 + patterns.utf8four/f4
+
+patterns.utf8byte = utf8byte
+
+--~ local str = " a b c d "
+
+--~ local s = lpeg.stripper(lpeg.R("az")) print("["..lpeg.match(s,str).."]")
+--~ local s = lpeg.keeper(lpeg.R("az")) print("["..lpeg.match(s,str).."]")
+--~ local s = lpeg.stripper("ab") print("["..lpeg.match(s,str).."]")
+--~ local s = lpeg.keeper("ab") print("["..lpeg.match(s,str).."]")
+
+local cache = { }
+
+function lpeg.stripper(str)
+ if type(str) == "string" then
+ local s = cache[str]
+ if not s then
+ s = Cs(((S(str)^1)/"" + 1)^0)
+ cache[str] = s
+ end
+ return s
+ else
+ return Cs(((str^1)/"" + 1)^0)
+ end
+end
+
+local cache = { }
+
+function lpeg.keeper(str)
+ if type(str) == "string" then
+ local s = cache[str]
+ if not s then
+ s = Cs((((1-S(str))^1)/"" + 1)^0)
+ cache[str] = s
+ end
+ return s
+ else
+ return Cs((((1-str)^1)/"" + 1)^0)
+ end
+end
+
+function lpeg.frontstripper(str) -- or pattern (yet undocumented)
+ return (P(str) + P(true)) * Cs(P(1)^0)
+end
+
+function lpeg.endstripper(str) -- or pattern (yet undocumented)
+ return Cs((1 - P(str) * P(-1))^0)
+end
+
+-- Just for fun I looked at the used bytecode and
+-- p = (p and p + pp) or pp gets one more (testset).
+
+function lpeg.replacer(one,two)
+ if type(one) == "table" then
+ local no = #one
+ if no > 0 then
+ local p
+ for i=1,no do
+ local o = one[i]
+ local pp = P(o[1]) / o[2]
+ if p then
+ p = p + pp
+ else
+ p = pp
+ end
+ end
+ return Cs((p + 1)^0)
+ end
+ else
+ two = two or ""
+ return Cs((P(one)/two + 1)^0)
+ end
+end
+
+local splitters_f, splitters_s = { }, { }
+
+function lpeg.firstofsplit(separator) -- always return value
+ local splitter = splitters_f[separator]
+ if not splitter then
+ separator = P(separator)
+ splitter = C((1 - separator)^0)
+ splitters_f[separator] = splitter
+ end
+ return splitter
+end
+
+function lpeg.secondofsplit(separator) -- nil if not split
+ local splitter = splitters_s[separator]
+ if not splitter then
+ separator = P(separator)
+ splitter = (1 - separator)^0 * separator * C(anything^0)
+ splitters_s[separator] = splitter
+ end
+ return splitter
+end
+
+function lpeg.balancer(left,right)
+ left, right = P(left), P(right)
+ return P { left * ((1 - left - right) + V(1))^0 * right }
+end
+
+--~ print(1,match(lpeg.firstofsplit(":"),"bc:de"))
+--~ print(2,match(lpeg.firstofsplit(":"),":de")) -- empty
+--~ print(3,match(lpeg.firstofsplit(":"),"bc"))
+--~ print(4,match(lpeg.secondofsplit(":"),"bc:de"))
+--~ print(5,match(lpeg.secondofsplit(":"),"bc:")) -- empty
+--~ print(6,match(lpeg.secondofsplit(":",""),"bc"))
+--~ print(7,match(lpeg.secondofsplit(":"),"bc"))
+--~ print(9,match(lpeg.secondofsplit(":","123"),"bc"))
+
+--~ -- slower:
+--~
+--~ function lpeg.counter(pattern)
+--~ local n, pattern = 0, (lpeg.P(pattern)/function() n = n + 1 end + lpeg.anything)^0
+--~ return function(str) n = 0 ; lpegmatch(pattern,str) ; return n end
+--~ end
+
+local nany = utf8char/""
+
+function lpeg.counter(pattern)
+ pattern = Cs((P(pattern)/" " + nany)^0)
+ return function(str)
+ return #match(pattern,str)
+ end
+end
+
+if utfgmatch then
+
+ function lpeg.count(str,what) -- replaces string.count
+ if type(what) == "string" then
+ local n = 0
+ for _ in utfgmatch(str,what) do
+ n = n + 1
+ end
+ return n
+ else -- 4 times slower but still faster than / function
+ return #match(Cs((P(what)/" " + nany)^0),str)
+ end
+ end
+
+else
+
+ local cache = { }
+
+ function lpeg.count(str,what) -- replaces string.count
+ if type(what) == "string" then
+ local p = cache[what]
+ if not p then
+ p = Cs((P(what)/" " + nany)^0)
+ cache[p] = p
+ end
+ return #match(p,str)
+ else -- 4 times slower but still faster than / function
+ return #match(Cs((P(what)/" " + nany)^0),str)
+ end
+ end
+
+end
+
+local patterns_escapes = { -- also defines in l-string
+ ["%"] = "%%",
+ ["."] = "%.",
+ ["+"] = "%+", ["-"] = "%-", ["*"] = "%*",
+ ["["] = "%[", ["]"] = "%]",
+ ["("] = "%)", [")"] = "%)",
+ -- ["{"] = "%{", ["}"] = "%}"
+ -- ["^"] = "%^", ["$"] = "%$",
+}
+
+local simple_escapes = { -- also defines in l-string
+ ["-"] = "%-",
+ ["."] = "%.",
+ ["?"] = ".",
+ ["*"] = ".*",
+}
+
+local p = Cs((S("-.+*%()[]") / patterns_escapes + anything)^0)
+local s = Cs((S("-.+*%()[]") / simple_escapes + anything)^0)
+
+function string.escapedpattern(str,simple)
+ return match(simple and s or p,str)
+end
+
+-- utf extensies
+
+lpeg.UP = lpeg.P
+
+if utfcharacters then
+
+ function lpeg.US(str)
+ local p
+ for uc in utfcharacters(str) do
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ return p
+ end
+
+
+elseif utfgmatch then
+
+ function lpeg.US(str)
+ local p
+ for uc in utfgmatch(str,".") do
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ return p
+ end
+
+else
+
+ function lpeg.US(str)
+ local p
+ local f = function(uc)
+ if p then
+ p = p + P(uc)
+ else
+ p = P(uc)
+ end
+ end
+ match((utf8char/f)^0,str)
+ return p
+ end
+
+end
+
+local range = Cs(utf8byte) * (Cs(utf8byte) + Cc(false))
+
+local utfchar = unicode and unicode.utf8 and unicode.utf8.char
+
+function lpeg.UR(str,more)
+ local first, last
+ if type(str) == "number" then
+ first = str
+ last = more or first
+ else
+ first, last = match(range,str)
+ if not last then
+ return P(str)
+ end
+ end
+ if first == last then
+ return P(str)
+ elseif utfchar and last - first < 8 then -- a somewhat arbitrary criterium
+ local p
+ for i=first,last do
+ if p then
+ p = p + P(utfchar(i))
+ else
+ p = P(utfchar(i))
+ end
+ end
+ return p -- nil when invalid range
+ else
+ local f = function(b)
+ return b >= first and b <= last
+ end
+ return utf8byte / f -- nil when invalid range
+ end
+end
+
+--~ lpeg.print(lpeg.R("ab","cd","gh"))
+--~ lpeg.print(lpeg.P("a","b","c"))
+--~ lpeg.print(lpeg.S("a","b","c"))
+
+--~ print(lpeg.count("äáàa",lpeg.P("á") + lpeg.P("à")))
+--~ print(lpeg.count("äáàa",lpeg.UP("áà")))
+--~ print(lpeg.count("äáàa",lpeg.US("àá")))
+--~ print(lpeg.count("äáàa",lpeg.UR("aá")))
+--~ print(lpeg.count("äáàa",lpeg.UR("àá")))
+--~ print(lpeg.count("äáàa",lpeg.UR(0x0000,0xFFFF)))
+
+function lpeg.oneof(list,...) -- lpeg.oneof("elseif","else","if","then")
+ if type(list) ~= "table" then
+ list = { list, ... }
+ end
+ -- sort(list) -- longest match first
+ local p = P(list[1])
+ for l=2,#list do
+ p = p + P(list[l])
+ end
+ return p
+end
+
+function lpeg.is_lpeg(p)
+ return p and lpegtype(p) == "pattern"
+end
+
+--~ Cf(Ct("") * (Cg(C(...) * "=" * Cs(...)))^0, rawset)
end -- closure
@@ -475,12 +681,17 @@ if not modules then modules = { } end modules ['l-boolean'] = {
license = "see context related readme files"
}
+local type, tonumber = type, tonumber
+
boolean = boolean or { }
+local boolean = boolean
-local type, tonumber = type, tonumber
+-- function boolean.tonumber(b)
+-- return b and 1 or 0 -- test and test and return or return
+-- end
function boolean.tonumber(b)
- if b then return 1 else return 0 end
+ if b then return 1 else return 0 end -- test and return or return
end
function toboolean(str,tolerant)
@@ -504,7 +715,9 @@ function toboolean(str,tolerant)
end
end
-function string.is_boolean(str)
+string.toboolean = toboolean
+
+function string.is_boolean(str,default)
if type(str) == "string" then
if str == "true" or str == "yes" or str == "on" or str == "t" then
return true
@@ -512,15 +725,7 @@ function string.is_boolean(str)
return false
end
end
- return nil
-end
-
-function boolean.alwaystrue()
- return true
-end
-
-function boolean.falsetrue()
- return false
+ return default
end
end -- closure
@@ -538,35 +743,28 @@ 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.round then
- function math.round(x)
- return floor(x + 0.5)
- end
+ function math.round(x) return floor(x + 0.5) end
end
if not math.div then
- function math.div(n,m)
- return floor(n/m)
- end
+ function math.div(n,m) return floor(n/m) end
end
if not math.mod then
- function math.mod(n,m)
- return n % m
- end
+ function math.mod(n,m) return n % m end
end
local pipi = 2*math.pi/360
-function math.sind(d)
- return sin(d*pipi)
-end
-
-function math.cosd(d)
- return cos(d*pipi)
+if not math.sind then
+ function math.sind(d) return sin(d*pipi) end
+ function math.cosd(d) return cos(d*pipi) end
+ function math.tand(d) return tan(d*pipi) end
end
-function math.tand(d)
- return tan(d*pipi)
+if not math.odd then
+ function math.odd (n) return n % 2 == 0 end
+ function math.even(n) return n % 2 ~= 0 end
end
end -- closure
@@ -581,12 +779,10 @@ if not modules then modules = { } end modules ['l-table'] = {
license = "see context related readme files"
}
-table.join = table.concat
-
+local type, next, tostring, tonumber, ipairs, table, string = type, next, tostring, tonumber, ipairs, table, string
local concat, sort, insert, remove = table.concat, table.sort, table.insert, table.remove
local format, find, gsub, lower, dump, match = string.format, string.find, string.gsub, string.lower, string.dump, string.match
local getmetatable, setmetatable = getmetatable, setmetatable
-local type, next, tostring, tonumber, ipairs = type, next, tostring, tonumber, ipairs
-- Starting with version 5.2 Lua no longer provide ipairs, which makes
-- sense. As we already used the for loop and # in most places the
@@ -638,50 +834,56 @@ end
-- extra functions, some might go (when not used)
function table.strip(tab)
- local lst = { }
+ local lst, l = { }, 0
for i=1,#tab do
local s = gsub(tab[i],"^%s*(.-)%s*$","%1")
if s == "" then
-- skip this one
else
- lst[#lst+1] = s
+ l = l + 1
+ lst[l] = s
end
end
return lst
end
function table.keys(t)
- local k = { }
+ local keys, k = { }, 0
for key, _ in next, t do
- k[#k+1] = key
+ k = k + 1
+ keys[k] = key
end
- return k
+ return keys
end
local function compare(a,b)
- return (tostring(a) < tostring(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)
+ end
end
local function sortedkeys(tab)
- local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed
+ local srt, category, s = { }, 0, 0 -- 0=unknown 1=string, 2=number 3=mixed
for key,_ in next, tab do
- srt[#srt+1] = key
- if kind == 3 then
+ s = s + 1
+ srt[s] = key
+ if category == 3 then
-- no further check
else
local tkey = type(key)
if tkey == "string" then
- -- if kind == 2 then kind = 3 else kind = 1 end
- kind = (kind == 2 and 3) or 1
+ category = (category == 2 and 3) or 1
elseif tkey == "number" then
- -- if kind == 1 then kind = 3 else kind = 2 end
- kind = (kind == 1 and 3) or 2
+ category = (category == 1 and 3) or 2
else
- kind = 3
+ category = 3
end
end
end
- if kind == 0 or kind == 3 then
+ if category == 0 or category == 3 then
sort(srt,compare)
else
sort(srt)
@@ -690,9 +892,12 @@ local function sortedkeys(tab)
end
local function sortedhashkeys(tab) -- fast one
- local srt = { }
+ local srt, s = { }, 0
for key,_ in next, tab do
- srt[#srt+1] = key
+ if key then
+ s= s + 1
+ srt[s] = key
+ end
end
sort(srt)
return srt
@@ -701,34 +906,50 @@ end
table.sortedkeys = sortedkeys
table.sortedhashkeys = sortedhashkeys
-function table.sortedhash(t)
- local s = sortedhashkeys(t) -- maybe just sortedkeys
- local n = 0
- local function kv(s)
- n = n + 1
- local k = s[n]
- return k, t[k]
+local function nothing() end
+
+local function sortedhash(t)
+ if t then
+ local n, s = 0, sortedkeys(t) -- the robust one
+ local function kv(s)
+ n = n + 1
+ local k = s[n]
+ return k, t[k]
+ end
+ return kv, s
+ else
+ return nothing
end
- return kv, s
end
-table.sortedpairs = table.sortedhash
+table.sortedhash = sortedhash
+table.sortedpairs = sortedhash
function table.append(t, list)
- for _,v in next, list do
- insert(t,v)
+ local n = #t
+ for i=1,#list do
+ n = n + 1
+ t[n] = list[i]
end
+ return t
end
function table.prepend(t, list)
- for k,v in next, list do
- insert(t,k,v)
+ local nl = #list
+ local nt = nl + #t
+ for i=#t,1,-1 do
+ t[nt] = t[i]
+ nt = nt - 1
+ end
+ for i=1,#list do
+ t[i] = list[i]
end
+ return t
end
function table.merge(t, ...) -- first one is target
- t = t or {}
- local lst = {...}
+ t = t or { }
+ local lst = { ... }
for i=1,#lst do
for k, v in next, lst[i] do
t[k] = v
@@ -738,7 +959,7 @@ function table.merge(t, ...) -- first one is target
end
function table.merged(...)
- local tmp, lst = { }, {...}
+ local tmp, lst = { }, { ... }
for i=1,#lst do
for k, v in next, lst[i] do
tmp[k] = v
@@ -748,41 +969,45 @@ function table.merged(...)
end
function table.imerge(t, ...)
- local lst = {...}
+ local lst, nt = { ... }, #t
for i=1,#lst do
local nst = lst[i]
for j=1,#nst do
- t[#t+1] = nst[j]
+ nt = nt + 1
+ t[nt] = nst[j]
end
end
return t
end
function table.imerged(...)
- local tmp, lst = { }, {...}
+ local tmp, ntmp, lst = { }, 0, {...}
for i=1,#lst do
local nst = lst[i]
for j=1,#nst do
- tmp[#tmp+1] = nst[j]
+ ntmp = ntmp + 1
+ tmp[ntmp] = nst[j]
end
end
return tmp
end
-local function fastcopy(old) -- fast one
+local function fastcopy(old,metatabletoo) -- fast one
if old then
local new = { }
for k,v in next, old do
if type(v) == "table" then
- new[k] = fastcopy(v) -- was just table.copy
+ new[k] = fastcopy(v,metatabletoo) -- was just table.copy
else
new[k] = v
end
end
- -- optional second arg
- local mt = getmetatable(old)
- if mt then
- setmetatable(new,mt)
+ if metatabletoo then
+ -- optional second arg
+ local mt = getmetatable(old)
+ if mt then
+ setmetatable(new,mt)
+ end
end
return new
else
@@ -790,6 +1015,8 @@ local function fastcopy(old) -- fast one
end
end
+-- todo : copy without metatable
+
local function copy(t, tables) -- taken from lua wiki, slightly adapted
tables = tables or { }
local tcopy = {}
@@ -822,33 +1049,14 @@ end
table.fastcopy = fastcopy
table.copy = copy
--- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
-
-function table.sub(t,i,j)
- return { unpack(t,i,j) }
-end
-
-function table.replace(a,b)
- for k,v in next, b do
- a[k] = v
+function table.derive(parent)
+ local child = { }
+ if parent then
+ setmetatable(child,{ __index = parent })
end
+ return child
end
--- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice)
-
-function table.is_empty(t) -- obolete, use inline code instead
- return not t or not next(t)
-end
-
-function table.one_entry(t) -- obolete, use inline code instead
- local n = next(t)
- return n and not next(t,n)
-end
-
---~ function table.starts_at(t) -- obsolete, not nice anyway
---~ return ipairs(t,1)(t,0)
---~ end
-
function table.tohash(t,value)
local h = { }
if t then
@@ -861,27 +1069,19 @@ function table.tohash(t,value)
end
function table.fromhash(t)
- local h = { }
+ local hsh, h = { }, 0
for k, v in next, t do -- no ipairs here
- if v then h[#h+1] = k end
+ if v then
+ h = h + 1
+ hsh[h] = k
+ end
end
- return h
+ return hsh
end
---~ print(table.serialize(t), "\n")
---~ print(table.serialize(t,"name"), "\n")
---~ print(table.serialize(t,false), "\n")
---~ print(table.serialize(t,true), "\n")
---~ print(table.serialize(t,"name",true), "\n")
---~ print(table.serialize(t,"name",true,true), "\n")
-
-table.serialize_functions = true
-table.serialize_compact = true
-table.serialize_inline = true
-
local noquotes, hexify, handle, reduce, compact, inline, functions
-local reserved = table.tohash { -- intercept a language flaw, no reserved words as key
+local reserved = table.tohash { -- intercept a language inconvenience: no reserved words as key
'and', 'break', 'do', 'else', 'elseif', 'end', 'false', 'for', 'function', 'if',
'in', 'local', 'nil', 'not', 'or', 'repeat', 'return', 'then', 'true', 'until', 'while',
}
@@ -893,20 +1093,23 @@ local function simple_table(t)
n = n + 1
end
if n == #t then
- local tt = { }
+ local tt, nt = { }, 0
for i=1,#t do
local v = t[i]
local tv = type(v)
if tv == "number" then
+ nt = nt + 1
if hexify then
- tt[#tt+1] = format("0x%04X",v)
+ tt[nt] = format("0x%04X",v)
else
- tt[#tt+1] = tostring(v) -- tostring not needed
+ tt[nt] = tostring(v) -- tostring not needed
end
elseif tv == "boolean" then
- tt[#tt+1] = tostring(v)
+ nt = nt + 1
+ tt[nt] = tostring(v)
elseif tv == "string" then
- tt[#tt+1] = format("%q",v)
+ nt = nt + 1
+ tt[nt] = format("%q",v)
else
tt = nil
break
@@ -932,21 +1135,25 @@ local function do_serialize(root,name,depth,level,indexed)
depth = depth .. " "
if indexed then
handle(format("%s{",depth))
- elseif name then
- --~ handle(format("%s%s={",depth,key(name)))
- if type(name) == "number" then -- or find(k,"^%d+$") then
+ else
+ local tn = type(name)
+ if tn == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s[0x%04X]={",depth,name))
else
handle(format("%s[%s]={",depth,name))
end
- elseif noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
- handle(format("%s%s={",depth,name))
+ elseif tn == "string" then
+ if noquotes and not reserved[name] and find(name,"^%a[%w%_]*$") then
+ handle(format("%s%s={",depth,name))
+ else
+ handle(format("%s[%q]={",depth,name))
+ end
+ elseif tn == "boolean" then
+ handle(format("%s[%s]={",depth,tostring(name)))
else
- handle(format("%s[%q]={",depth,name))
+ handle(format("%s{",depth))
end
- else
- handle(format("%s{",depth))
end
end
-- we could check for k (index) being number (cardinal)
@@ -966,8 +1173,8 @@ local function do_serialize(root,name,depth,level,indexed)
--~ if v == root then
-- circular
--~ else
- local t = type(v)
- if compact and first and type(k) == "number" and k >= first and k <= last then
+ local t, tk = type(v), type(k)
+ if compact and first and tk == "number" and k >= first and k <= last then
if t == "number" then
if hexify then
handle(format("%s 0x%04X,",depth,v))
@@ -1009,17 +1216,18 @@ local function do_serialize(root,name,depth,level,indexed)
handle(format("%s __p__=nil,",depth))
end
elseif t == "number" then
- --~ if hexify then
- --~ handle(format("%s %s=0x%04X,",depth,key(k),v))
- --~ else
- --~ handle(format("%s %s=%s,",depth,key(k),v)) -- %.99g
- --~ end
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=0x%04X,",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,tostring(k),v))
+ else
+ handle(format("%s [%s]=%s,",depth,tostring(k),v)) -- %.99g
+ end
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
if hexify then
handle(format("%s %s=0x%04X,",depth,k,v))
@@ -1035,26 +1243,28 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "string" then
if reduce and tonumber(v) then
- --~ handle(format("%s %s=%s,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%s,",depth,k,v))
else
handle(format("%s [%s]=%s,",depth,k,v))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=%s,",depth,tostring(k),v))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%s,",depth,k,v))
else
handle(format("%s [%q]=%s,",depth,k,v))
end
else
- --~ handle(format("%s %s=%q,",depth,key(k),v))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%q,",depth,k,v))
else
handle(format("%s [%s]=%q,",depth,k,v))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=%q,",depth,tostring(k),v))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%q,",depth,k,v))
else
@@ -1063,13 +1273,14 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "table" then
if not next(v) then
- --~ handle(format("%s %s={},",depth,key(k)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]={},",depth,k))
else
handle(format("%s [%s]={},",depth,k))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]={},",depth,tostring(k)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s={},",depth,k))
else
@@ -1078,13 +1289,14 @@ local function do_serialize(root,name,depth,level,indexed)
elseif inline then
local st = simple_table(v)
if st then
- --~ handle(format("%s %s={ %s },",depth,key(k),concat(st,", ")))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]={ %s },",depth,k,concat(st,", ")))
else
handle(format("%s [%s]={ %s },",depth,k,concat(st,", ")))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]={ %s },",depth,tostring(k),concat(st,", ")))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s={ %s },",depth,k,concat(st,", ")))
else
@@ -1097,13 +1309,14 @@ local function do_serialize(root,name,depth,level,indexed)
do_serialize(v,k,depth,level+1)
end
elseif t == "boolean" then
- --~ handle(format("%s %s=%s,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%s,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%s,",depth,k,tostring(v)))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]=%s,",depth,tostring(k),tostring(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%s,",depth,k,tostring(v)))
else
@@ -1111,13 +1324,14 @@ local function do_serialize(root,name,depth,level,indexed)
end
elseif t == "function" then
if functions then
- --~ handle(format('%s %s=loadstring(%q),',depth,key(k),dump(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=loadstring(%q),",depth,k,dump(v)))
else
handle(format("%s [%s]=loadstring(%q),",depth,k,dump(v)))
end
+ elseif tk == "boolean" then
+ handle(format("%s [%s]=loadstring(%q),",depth,tostring(k),dump(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=loadstring(%q),",depth,k,dump(v)))
else
@@ -1125,13 +1339,14 @@ local function do_serialize(root,name,depth,level,indexed)
end
end
else
- --~ handle(format("%s %s=%q,",depth,key(k),tostring(v)))
- if type(k) == "number" then -- or find(k,"^%d+$") then
+ if tk == "number" then -- or find(k,"^%d+$") then
if hexify then
handle(format("%s [0x%04X]=%q,",depth,k,tostring(v)))
else
handle(format("%s [%s]=%q,",depth,k,tostring(v)))
end
+ elseif tk == "boolean" then -- or find(k,"^%d+$") then
+ handle(format("%s [%s]=%q,",depth,tostring(k),tostring(v)))
elseif noquotes and not reserved[k] and find(k,"^%a[%w%_]*$") then
handle(format("%s %s=%q,",depth,k,tostring(v)))
else
@@ -1149,15 +1364,34 @@ end
-- replacing handle by a direct t[#t+1] = ... (plus test) is not much
-- faster (0.03 on 1.00 for zapfino.tma)
-local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
- noquotes = _noquotes
- hexify = _hexify
- handle = _handle or print
- reduce = _reduce or false
- compact = table.serialize_compact
- inline = compact and table.serialize_inline
- functions = table.serialize_functions
+local function serialize(_handle,root,name,specification) -- handle wins
local tname = type(name)
+ if type(specification) == "table" then
+ noquotes = specification.noquotes
+ hexify = specification.hexify
+ handle = _handle or specification.handle or print
+ reduce = specification.reduce or false
+ functions = specification.functions
+ compact = specification.compact
+ inline = specification.inline and compact
+ if functions == nil then
+ functions = true
+ end
+ if compact == nil then
+ compact = true
+ end
+ if inline == nil then
+ inline = compact
+ end
+ else
+ noquotes = false
+ hexify = false
+ handle = _handle or print
+ reduce = false
+ compact = true
+ inline = true
+ functions = true
+ end
if tname == "string" then
if name == "return" then
handle("return {")
@@ -1179,8 +1413,17 @@ local function serialize(root,name,_handle,_reduce,_noquotes,_hexify)
else
handle("t={")
end
- if root and next(root) then
- do_serialize(root,name,"",0,indexed)
+ if root then
+ -- The dummy access will initialize a table that has a delayed initialization
+ -- using a metatable. (maybe explicitly test for metatable)
+ if getmetatable(root) then -- todo: make this an option, maybe even per subtable
+ local dummy = root._w_h_a_t_e_v_e_r_
+ root._w_h_a_t_e_v_e_r_ = nil
+ end
+ -- Let's forget about empty tables.
+ if next(root) then
+ do_serialize(root,name,"",0)
+ end
end
handle("}")
end
@@ -1194,18 +1437,17 @@ end
--~ 'return' : return { }
--~ number : [number] = { }
-function table.serialize(root,name,reduce,noquotes,hexify)
- local t = { }
+function table.serialize(root,name,specification)
+ local t, n = { }, 0
local function flush(s)
- t[#t+1] = s
+ n = n + 1
+ t[n] = s
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
return concat(t,"\n")
end
-function table.tohandle(handle,root,name,reduce,noquotes,hexify)
- serialize(root,name,handle,reduce,noquotes,hexify)
-end
+table.tohandle = serialize
-- sometimes tables are real use (zapfino extra pro is some 85M) in which
-- case a stepwise serialization is nice; actually, we could consider:
@@ -1216,73 +1458,63 @@ end
--
-- so this is on the todo list
-table.tofile_maxtab = 2*1024
+local maxtab = 2*1024
-function table.tofile(filename,root,name,reduce,noquotes,hexify)
+function table.tofile(filename,root,name,specification)
local f = io.open(filename,'w')
if f then
- local maxtab = table.tofile_maxtab
if maxtab > 1 then
- local t = { }
+ local t, n = { }, 0
local function flush(s)
- t[#t+1] = s
- if #t > maxtab then
+ n = n + 1
+ t[n] = s
+ if n > maxtab then
f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice
- t = { }
+ t, n = { }, 0 -- we could recycle t if needed
end
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
f:write(concat(t,"\n"),"\n")
else
local function flush(s)
f:write(s,"\n")
end
- serialize(root,name,flush,reduce,noquotes,hexify)
+ serialize(flush,root,name,specification)
end
f:close()
+ io.flush()
end
end
-local function flatten(t,f,complete) -- is this used? meybe a variant with next, ...
- for i=1,#t do
- local v = t[i]
- if type(v) == "table" then
- if complete or type(v[1]) == "table" then
- flatten(v,f,complete)
+local function flattened(t,f,depth)
+ if f == nil then
+ f = { }
+ depth = 0xFFFF
+ elseif tonumber(f) then
+ -- assume then only two arguments are given
+ depth = f
+ f = { }
+ elseif not depth then
+ depth = 0xFFFF
+ end
+ for k, v in next, t do
+ if type(k) ~= "number" then
+ if depth > 0 and type(v) == "table" then
+ flattened(v,f,depth-1)
else
- f[#f+1] = v
+ f[k] = v
end
- else
- f[#f+1] = v
end
end
-end
-
-function table.flatten(t)
- local f = { }
- flatten(t,f,true)
- return f
-end
-
-function table.unnest(t) -- bad name
- local f = { }
- flatten(t,f,false)
- return f
-end
-
-table.flatten_one_level = table.unnest
-
--- a better one:
-
-local function flattened(t,f)
- if not f then
- f = { }
- end
- for k, v in next, t do
- if type(v) == "table" then
- flattened(v,f)
+ local n = #f
+ for k=1,#t do
+ local v = t[k]
+ if depth > 0 and type(v) == "table" then
+ flattened(v,f,depth-1)
+ n = #f
else
- f[k] = v
+ n = n + 1
+ f[n] = v
end
end
return f
@@ -1290,49 +1522,27 @@ end
table.flattened = flattened
--- the next three may disappear
-
-function table.remove_value(t,value) -- todo: n
- if value then
- for i=1,#t do
- if t[i] == value then
- remove(t,i)
- -- remove all, so no: return
- end
- end
+local function unnest(t,f) -- only used in mk, for old times sake
+ if not f then -- and only relevant for token lists
+ f = { }
end
-end
-
-function table.insert_before_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i,str)
- return
- end
+ for i=1,#t do
+ local v = t[i]
+ if type(v) == "table" then
+ if type(v[1]) == "table" then
+ unnest(v,f)
+ else
+ f[#f+1] = v
end
+ else
+ f[#f+1] = v
end
- insert(t,1,str)
- elseif value then
- insert(t,1,value)
end
+ return f
end
-function table.insert_after_value(t,value,str)
- if str then
- if value then
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,str)
- return
- end
- end
- end
- t[#t+1] = str
- elseif value then
- t[#t+1] = value
- end
+function table.unnest(t) -- bad name
+ return unnest(t)
end
local function are_equal(a,b,n,m) -- indexed
@@ -1359,7 +1569,7 @@ end
local function identical(a,b) -- assumes same structure
for ka, va in next, a do
- local vb = b[k]
+ local vb = b[ka]
if va == vb then
-- same
elseif type(va) == "table" and type(vb) == "table" then
@@ -1373,8 +1583,8 @@ local function identical(a,b) -- assumes same structure
return true
end
-table.are_equal = are_equal
table.identical = identical
+table.are_equal = are_equal
-- maybe also make a combined one
@@ -1400,89 +1610,93 @@ function table.contains(t, v)
end
function table.count(t)
- local n, e = 0, next(t)
- while e do
- n, e = n + 1, next(t,e)
+ local n = 0
+ for k, v in next, t do
+ n = n + 1
end
return n
end
-function table.swapped(t)
- local s = { }
+function table.swapped(t,s) -- hash
+ local n = { }
+ if s then
+--~ for i=1,#s do
+--~ n[i] = s[i]
+--~ end
+ for k, v in next, s do
+ n[k] = v
+ end
+ end
+--~ for i=1,#t do
+--~ local ti = t[i] -- don't ask but t[i] can be nil
+--~ if ti then
+--~ n[ti] = i
+--~ end
+--~ end
for k, v in next, t do
- s[v] = k
+ n[v] = k
end
- return s
+ return n
end
---~ function table.are_equal(a,b)
---~ return table.serialize(a) == table.serialize(b)
---~ end
-
-function table.clone(t,p) -- t is optional or nil or table
- if not p then
- t, p = { }, t or { }
- elseif not t then
- t = { }
+function table.reversed(t)
+ if t then
+ local tt, tn = { }, #t
+ if tn > 0 then
+ local ttn = 0
+ for i=tn,1,-1 do
+ ttn = ttn + 1
+ tt[ttn] = t[i]
+ end
+ end
+ return tt
end
- setmetatable(t, { __index = function(_,key) return p[key] end }) -- why not __index = p ?
- return t
-end
-
-function table.hexed(t,seperator)
- local tt = { }
- for i=1,#t do tt[i] = format("0x%04X",t[i]) end
- return concat(tt,seperator or " ")
end
-function table.reverse_hash(h)
- local r = { }
- for k,v in next, h do
- r[v] = lower(gsub(k," ",""))
+function table.sequenced(t,sep,simple) -- hash only
+ local s, n = { }, 0
+ for k, v in sortedhash(t) do
+ if simple then
+ if v == true then
+ n = n + 1
+ s[n] = k
+ elseif v and v~= "" then
+ n = n + 1
+ s[n] = k .. "=" .. tostring(v)
+ end
+ else
+ n = n + 1
+ s[n] = k .. "=" .. tostring(v)
+ end
end
- return r
+ return concat(s, sep or " | ")
end
-function table.reverse(t)
- local tt = { }
- if #t > 0 then
- for i=#t,1,-1 do
- tt[#tt+1] = t[i]
- end
+function table.print(t,...)
+ if type(t) ~= "table" then
+ print(tostring(t))
+ else
+ table.tohandle(print,t,...)
end
- return tt
end
-function table.insert_before_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i,extra)
- return
- end
- end
- insert(t,1,extra)
+-- -- -- obsolete but we keep them for a while and might comment them later -- -- --
+
+-- roughly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack)
+
+function table.sub(t,i,j)
+ return { unpack(t,i,j) }
end
-function table.insert_after_value(t,value,extra)
- for i=1,#t do
- if t[i] == extra then
- remove(t,i)
- end
- end
- for i=1,#t do
- if t[i] == value then
- insert(t,i+1,extra)
- return
- end
- end
- insert(t,#t+1,extra)
+-- 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)
end
+function table.has_one_entry(t)
+ return t and not next(t,next(t))
+end
end -- closure
@@ -1498,47 +1712,93 @@ if not modules then modules = { } end modules ['l-file'] = {
-- needs a cleanup
-file = file or { }
+file = file or { }
+local file = file
-local concat = table.concat
-local find, gmatch, match, gsub, sub, char = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char
+local insert, concat = table.insert, table.concat
+local find, gmatch, match, gsub, sub, char, lower = string.find, string.gmatch, string.match, string.gsub, string.sub, string.char, string.lower
local lpegmatch = lpeg.match
+local getcurrentdir, attributes = lfs.currentdir, lfs.attributes
-function file.removesuffix(filename)
- return (gsub(filename,"%.[%a%d]+$",""))
+local P, R, S, C, Cs, Cp, Cc = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc
+
+local function dirname(name,default)
+ return match(name,"^(.+)[/\\].-$") or (default or "")
end
-function file.addsuffix(filename, suffix)
- if not suffix or suffix == "" then
- return filename
- elseif not find(filename,"%.[%a%d]+$") then
- return filename .. "." .. suffix
- else
- return filename
- end
+local function basename(name)
+ return match(name,"^.+[/\\](.-)$") or name
end
-function file.replacesuffix(filename, suffix)
- return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+local function nameonly(name)
+ return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
end
-function file.dirname(name,default)
- return match(name,"^(.+)[/\\].-$") or (default or "")
+local function extname(name,default)
+ return match(name,"^.+%.([^/\\]-)$") or default or ""
end
-function file.basename(name)
- return match(name,"^.+[/\\](.-)$") or name
+local function splitname(name)
+ local n, s = match(name,"^(.+)%.([^/\\]-)$")
+ return n or name, s or ""
end
-function file.nameonly(name)
- return (gsub(match(name,"^.+[/\\](.-)$") or name,"%..*$",""))
+file.basename = basename
+file.dirname = dirname
+file.nameonly = nameonly
+file.extname = extname
+file.suffix = extname
+
+function file.removesuffix(filename)
+ return (gsub(filename,"%.[%a%d]+$",""))
end
-function file.extname(name,default)
- return match(name,"^.+%.([^/\\]-)$") or default or ""
+function file.addsuffix(filename, suffix, criterium)
+ if not suffix or suffix == "" then
+ return filename
+ elseif criterium == true then
+ return filename .. "." .. suffix
+ elseif not criterium then
+ local n, s = splitname(filename)
+ if not s or s == "" then
+ return filename .. "." .. suffix
+ else
+ return filename
+ end
+ else
+ local n, s = splitname(filename)
+ if s and s ~= "" then
+ local t = type(criterium)
+ if t == "table" then
+ -- keep if in criterium
+ for i=1,#criterium do
+ if s == criterium[i] then
+ return filename
+ end
+ end
+ elseif t == "string" then
+ -- keep if criterium
+ if s == criterium then
+ return filename
+ end
+ end
+ end
+ return n .. "." .. suffix
+ end
end
-file.suffix = file.extname
+--~ print("1 " .. file.addsuffix("name","new") .. " -> name.new")
+--~ print("2 " .. file.addsuffix("name.old","new") .. " -> name.old")
+--~ print("3 " .. file.addsuffix("name.old","new",true) .. " -> name.old.new")
+--~ print("4 " .. file.addsuffix("name.old","new","new") .. " -> name.new")
+--~ print("5 " .. file.addsuffix("name.old","new","old") .. " -> name.old")
+--~ print("6 " .. file.addsuffix("name.old","new","foo") .. " -> name.new")
+--~ print("7 " .. file.addsuffix("name.old","new",{"foo","bar"}) .. " -> name.new")
+--~ print("8 " .. file.addsuffix("name.old","new",{"old","bar"}) .. " -> name.old")
+
+function file.replacesuffix(filename, suffix)
+ return (gsub(filename,"%.[%a%d]+$","")) .. "." .. suffix
+end
--~ function file.join(...)
--~ local pth = concat({...},"/")
@@ -1590,74 +1850,130 @@ end
--~ print(file.join("http:///a","/y"))
--~ print(file.join("//nas-1","/y"))
-function file.iswritable(name)
- local a = lfs.attributes(name) or lfs.attributes(file.dirname(name,"."))
+function file.is_writable(name)
+ local a = attributes(name) or attributes(dirname(name,"."))
return a and sub(a.permissions,2,2) == "w"
end
-function file.isreadable(name)
- local a = lfs.attributes(name)
+function file.is_readable(name)
+ local a = attributes(name)
return a and sub(a.permissions,1,1) == "r"
end
-file.is_readable = file.isreadable
-file.is_writable = file.iswritable
-
--- todo: lpeg
+file.isreadable = file.is_readable -- depricated
+file.iswritable = file.is_writable -- depricated
---~ function file.split_path(str)
---~ local t = { }
---~ str = gsub(str,"\\", "/")
---~ str = gsub(str,"(%a):([;/])", "%1\001%2")
---~ for name in gmatch(str,"([^;:]+)") do
---~ if name ~= "" then
---~ t[#t+1] = gsub(name,"\001",":")
---~ end
---~ end
---~ return t
---~ end
+-- todo: lpeg \\ / .. does not save much
local checkedsplit = string.checkedsplit
-function file.split_path(str,separator)
+function file.splitpath(str,separator) -- string
str = gsub(str,"\\","/")
return checkedsplit(str,separator or io.pathseparator)
end
-function file.join_path(tab)
- return concat(tab,io.pathseparator) -- can have trailing //
+function file.joinpath(tab,separator) -- table
+ return concat(tab,separator or io.pathseparator) -- can have trailing //
end
-- we can hash them weakly
-function file.collapse_path(str)
+--~ function file.collapsepath(str) -- fails on b.c/..
+--~ str = gsub(str,"\\","/")
+--~ if find(str,"/") then
+--~ str = gsub(str,"^%./",(gsub(getcurrentdir(),"\\","/")) .. "/") -- ./xx in qualified
+--~ str = gsub(str,"/%./","/")
+--~ local n, m = 1, 1
+--~ while n > 0 or m > 0 do
+--~ str, n = gsub(str,"[^/%.]+/%.%.$","")
+--~ str, m = gsub(str,"[^/%.]+/%.%./","")
+--~ end
+--~ str = gsub(str,"([^/])/$","%1")
+--~ -- str = gsub(str,"^%./","") -- ./xx in qualified
+--~ str = gsub(str,"/%.$","")
+--~ end
+--~ if str == "" then str = "." end
+--~ return str
+--~ end
+--~
+--~ The previous one fails on "a.b/c" so Taco came up with a split based
+--~ variant. After some skyping we got it sort of compatible with the old
+--~ one. After that the anchoring to currentdir was added in a better way.
+--~ Of course there are some optimizations too. Finally we had to deal with
+--~ windows drive prefixes and thinsg like sys://.
+
+function file.collapsepath(str,anchor)
+ if anchor and not find(str,"^/") and not find(str,"^%a:") then
+ str = getcurrentdir() .. "/" .. str
+ end
+ if str == "" or str =="." then
+ return "."
+ elseif find(str,"^%.%.") then
+ str = gsub(str,"\\","/")
+ return str
+ elseif not find(str,"%.") then
+ str = gsub(str,"\\","/")
+ return str
+ end
str = gsub(str,"\\","/")
- if find(str,"/") then
- str = gsub(str,"^%./",(gsub(lfs.currentdir(),"\\","/")) .. "/") -- ./xx in qualified
- str = gsub(str,"/%./","/")
- local n, m = 1, 1
- while n > 0 or m > 0 do
- str, n = gsub(str,"[^/%.]+/%.%.$","")
- str, m = gsub(str,"[^/%.]+/%.%./","")
- end
- str = gsub(str,"([^/])/$","%1")
- -- str = gsub(str,"^%./","") -- ./xx in qualified
- str = gsub(str,"/%.$","")
- end
- if str == "" then str = "." end
- return str
+ local starter, rest = match(str,"^(%a+:/*)(.-)$")
+ if starter then
+ str = rest
+ end
+ local oldelements = checkedsplit(str,"/")
+ local newelements = { }
+ local i = #oldelements
+ while i > 0 do
+ local element = oldelements[i]
+ if element == '.' then
+ -- do nothing
+ elseif element == '..' then
+ local n = i -1
+ while n > 0 do
+ local element = oldelements[n]
+ if element ~= '..' and element ~= '.' then
+ oldelements[n] = '.'
+ break
+ else
+ n = n - 1
+ end
+ end
+ if n < 1 then
+ insert(newelements,1,'..')
+ end
+ elseif element ~= "" then
+ insert(newelements,1,element)
+ end
+ i = i - 1
+ end
+ if #newelements == 0 then
+ return starter or "."
+ elseif starter then
+ return starter .. concat(newelements, '/')
+ elseif find(str,"^/") then
+ return "/" .. concat(newelements,'/')
+ else
+ return concat(newelements, '/')
+ end
end
---~ print(file.collapse_path("/a"))
---~ print(file.collapse_path("a/./b/.."))
---~ print(file.collapse_path("a/aa/../b/bb"))
---~ print(file.collapse_path("a/../.."))
---~ print(file.collapse_path("a/.././././b/.."))
---~ print(file.collapse_path("a/./././b/.."))
---~ print(file.collapse_path("a/b/c/../.."))
-
-function file.robustname(str)
- return (gsub(str,"[^%a%d%/%-%.\\]+","-"))
+--~ local function test(str)
+--~ print(string.format("%-20s %-15s %-15s",str,file.collapsepath(str),file.collapsepath(str,true)))
+--~ end
+--~ test("a/b.c/d") test("b.c/d") test("b.c/..")
+--~ test("/") test("c:/..") test("sys://..")
+--~ test("") test("./") test(".") test("..") test("./..") test("../..")
+--~ test("a") test("./a") test("/a") test("a/../..")
+--~ test("a/./b/..") test("a/aa/../b/bb") test("a/.././././b/..") test("a/./././b/..")
+--~ test("a/b/c/../..") test("./a/b/c/../..") test("a/b/c/../..")
+
+function file.robustname(str,strict)
+ str = gsub(str,"[^%a%d%/%-%.\\]+","-")
+ if strict then
+ return lower(gsub(str,"^%-*(.-)%-*$","%1"))
+ else
+ return str
+ end
end
file.readdata = io.loaddata
@@ -1669,31 +1985,31 @@ end
-- lpeg variants, slightly faster, not always
---~ local period = lpeg.P(".")
---~ local slashes = lpeg.S("\\/")
+--~ local period = P(".")
+--~ local slashes = S("\\/")
--~ local noperiod = 1-period
--~ local noslashes = 1-slashes
--~ local name = noperiod^1
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.C(noperiod^1) * -1
+--~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * C(noperiod^1) * -1
--~ function file.extname(name)
--~ return lpegmatch(pattern,name) or ""
--~ end
---~ local pattern = lpeg.Cs(((period * noperiod^1 * -1)/"" + 1)^1)
+--~ local pattern = Cs(((period * noperiod^1 * -1)/"" + 1)^1)
--~ function file.removesuffix(name)
--~ return lpegmatch(pattern,name)
--~ end
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.C(noslashes^1) * -1
+--~ local pattern = (noslashes^0 * slashes)^1 * C(noslashes^1) * -1
--~ function file.basename(name)
--~ return lpegmatch(pattern,name) or name
--~ end
---~ local pattern = (noslashes^0 * slashes)^1 * lpeg.Cp() * noslashes^1 * -1
+--~ local pattern = (noslashes^0 * slashes)^1 * Cp() * noslashes^1 * -1
--~ function file.dirname(name)
--~ local p = lpegmatch(pattern,name)
@@ -1704,7 +2020,7 @@ end
--~ end
--~ end
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
+--~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * Cp() * noperiod^1 * -1
--~ function file.addsuffix(name, suffix)
--~ local p = lpegmatch(pattern,name)
@@ -1715,7 +2031,7 @@ end
--~ end
--~ end
---~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * lpeg.Cp() * noperiod^1 * -1
+--~ local pattern = (noslashes^0 * slashes)^0 * (noperiod^1 * period)^1 * Cp() * noperiod^1 * -1
--~ function file.replacesuffix(name,suffix)
--~ local p = lpegmatch(pattern,name)
@@ -1726,7 +2042,7 @@ end
--~ end
--~ end
---~ local pattern = (noslashes^0 * slashes)^0 * lpeg.Cp() * ((noperiod^1 * period)^1 * lpeg.Cp() + lpeg.P(true)) * noperiod^1 * -1
+--~ local pattern = (noslashes^0 * slashes)^0 * Cp() * ((noperiod^1 * period)^1 * Cp() + P(true)) * noperiod^1 * -1
--~ function file.nameonly(name)
--~ local a, b = lpegmatch(pattern,name)
@@ -1758,11 +2074,14 @@ end
-- also rewrite previous
-local letter = lpeg.R("az","AZ") + lpeg.S("_-+")
-local separator = lpeg.P("://")
+local letter = R("az","AZ") + S("_-+")
+local separator = P("://")
-local qualified = lpeg.P(".")^0 * lpeg.P("/") + letter*lpeg.P(":") + letter^1*separator + letter^1 * lpeg.P("/")
-local rootbased = lpeg.P("/") + letter*lpeg.P(":")
+local qualified = P(".")^0 * P("/") + letter*P(":") + letter^1*separator + letter^1 * P("/")
+local rootbased = P("/") + letter*P(":")
+
+lpeg.patterns.qualified = qualified
+lpeg.patterns.rootbased = rootbased
-- ./name ../name /name c: :// name/name
@@ -1774,14 +2093,16 @@ function file.is_rootbased_path(filename)
return lpegmatch(rootbased,filename) ~= nil
end
-local slash = lpeg.S("\\/")
-local period = lpeg.P(".")
-local drive = lpeg.C(lpeg.R("az","AZ")) * lpeg.P(":")
-local path = lpeg.C(((1-slash)^0 * slash)^0)
-local suffix = period * lpeg.C(lpeg.P(1-period)^0 * lpeg.P(-1))
-local base = lpeg.C((1-suffix)^0)
+-- actually these are schemes
+
+local slash = S("\\/")
+local period = P(".")
+local drive = C(R("az","AZ")) * P(":")
+local path = C(((1-slash)^0 * slash)^0)
+local suffix = period * C(P(1-period)^0 * P(-1))
+local base = C((1-suffix)^0)
-local pattern = (drive + lpeg.Cc("")) * (path + lpeg.Cc("")) * (base + lpeg.Cc("")) * (suffix + lpeg.Cc(""))
+local pattern = (drive + Cc("")) * (path + Cc("")) * (base + Cc("")) * (suffix + Cc(""))
function file.splitname(str) -- returns drive, path, base, suffix
return lpegmatch(pattern,str)
@@ -1797,12 +2118,19 @@ end
--~ -- todo:
--~
--~ if os.type == "windows" then
---~ local currentdir = lfs.currentdir
---~ function lfs.currentdir()
+--~ local currentdir = getcurrentdir
+--~ function getcurrentdir()
--~ return (gsub(currentdir(),"\\","/"))
--~ end
--~ end
+-- for myself:
+
+function file.strip(name,dir)
+ local b, a = match(name,"^(.-)" .. dir .. "(.*)$")
+ return a ~= "" and a or name
+end
+
end -- closure
do -- begin closure to overcome local limits and interference
@@ -1815,7 +2143,10 @@ if not modules then modules = { } end modules ['l-io'] = {
license = "see context related readme files"
}
-local byte, find, gsub = string.byte, string.find, string.gsub
+local io = io
+local byte, find, gsub, format = string.byte, string.find, string.gsub, string.format
+local concat = table.concat
+local type = type
if string.find(os.getenv("PATH"),";") then
io.fileseparator, io.pathseparator = "\\", ";"
@@ -1826,9 +2157,7 @@ end
function io.loaddata(filename,textmode)
local f = io.open(filename,(textmode and 'r') or 'rb')
if f then
- -- collectgarbage("step") -- sometimes makes a big difference in mem consumption
local data = f:read('*all')
- -- garbagecollector.check(data)
f:close()
return data
else
@@ -1840,13 +2169,14 @@ function io.savedata(filename,data,joiner)
local f = io.open(filename,"wb")
if f then
if type(data) == "table" then
- f:write(table.join(data,joiner or ""))
+ f:write(concat(data,joiner or ""))
elseif type(data) == "function" then
data(f)
else
f:write(data or "")
end
f:close()
+ io.flush()
return true
else
return false
@@ -1875,12 +2205,19 @@ function io.size(filename)
end
function io.noflines(f)
- local n = 0
- for _ in f:lines() do
- n = n + 1
+ if type(f) == "string" then
+ local f = io.open(filename)
+ local n = f and io.noflines(f) or 0
+ assert(f:close())
+ return n
+ else
+ local n = 0
+ for _ in f:lines() do
+ n = n + 1
+ end
+ f:seek('set',0)
+ return n
end
- f:seek('set',0)
- return n
end
local nextchar = {
@@ -1906,8 +2243,6 @@ local nextchar = {
function io.characters(f,n)
if f then
return nextchar[n or 1], f
- else
- return nil, nil
end
end
@@ -1916,40 +2251,42 @@ local nextbyte = {
local a, b, c, d = f:read(1,1,1,1)
if d then
return byte(a), byte(b), byte(c), byte(d)
- else
- return nil, nil, nil, nil
+ end
+ end,
+ [3] = function(f)
+ local a, b, c = f:read(1,1,1)
+ if b then
+ return byte(a), byte(b), byte(c)
end
end,
[2] = function(f)
local a, b = f:read(1,1)
if b then
return byte(a), byte(b)
- else
- return nil, nil
end
end,
[1] = function (f)
local a = f:read(1)
if a then
return byte(a)
- else
- return nil
end
end,
[-2] = function (f)
local a, b = f:read(1,1)
if b then
return byte(b), byte(a)
- else
- return nil, nil
+ end
+ end,
+ [-3] = function(f)
+ local a, b, c = f:read(1,1,1)
+ if b then
+ return byte(c), byte(b), byte(a)
end
end,
[-4] = function(f)
local a, b, c, d = f:read(1,1,1,1)
if d then
return byte(d), byte(c), byte(b), byte(a)
- else
- return nil, nil, nil, nil
end
end
}
@@ -1966,12 +2303,13 @@ function io.ask(question,default,options)
while true do
io.write(question)
if options then
- io.write(string.format(" [%s]",table.concat(options,"|")))
+ io.write(format(" [%s]",concat(options,"|")))
end
if default then
- io.write(string.format(" [%s]",default))
+ io.write(format(" [%s]",default))
end
- io.write(string.format(" "))
+ io.write(format(" "))
+ io.flush()
local answer = io.read()
answer = gsub(answer,"^%s*(.*)%s*$","%1")
if answer == "" and default then
@@ -1995,56 +2333,134 @@ function io.ask(question,default,options)
end
end
+local function readnumber(f,n,m)
+ if m then
+ f:seek("set",n)
+ n = m
+ end
+ if n == 1 then
+ return byte(f:read(1))
+ elseif n == 2 then
+ local a, b = byte(f:read(2),1,2)
+ return 256 * a + b
+ elseif n == 3 then
+ local a, b, c = byte(f:read(3),1,3)
+ return 256*256 * a + 256 * b + c
+ elseif n == 4 then
+ local a, b, c, d = byte(f:read(4),1,4)
+ return 256*256*256 * a + 256*256 * b + 256 * c + d
+ elseif n == 8 then
+ local a, b = readnumber(f,4), readnumber(f,4)
+ return 256 * a + b
+ elseif n == 12 then
+ local a, b, c = readnumber(f,4), readnumber(f,4), readnumber(f,4)
+ return 256*256 * a + 256 * b + c
+ elseif n == -2 then
+ local b, a = byte(f:read(2),1,2)
+ return 256*a + b
+ elseif n == -3 then
+ local c, b, a = byte(f:read(3),1,3)
+ return 256*256 * a + 256 * b + c
+ elseif n == -4 then
+ local d, c, b, a = byte(f:read(4),1,4)
+ return 256*256*256 * a + 256*256 * b + 256*c + d
+ elseif n == -8 then
+ local h, g, f, e, d, c, b, a = byte(f:read(8),1,8)
+ return 256*256*256*256*256*256*256 * a +
+ 256*256*256*256*256*256 * b +
+ 256*256*256*256*256 * c +
+ 256*256*256*256 * d +
+ 256*256*256 * e +
+ 256*256 * f +
+ 256 * g +
+ h
+ else
+ return 0
+ end
+end
+
+io.readnumber = readnumber
+
+function io.readstring(f,n,m)
+ if m then
+ f:seek("set",n)
+ n = m
+ end
+ local str = gsub(f:read(n),"%z","")
+ return str
+end
+
end -- closure
do -- begin closure to overcome local limits and interference
-if not modules then modules = { } end modules ['luat-dum'] = {
- version = 1.001,
+if not modules then modules = { } end modules ['luat-basics-gen'] = {
+ version = 1.100,
comment = "companion to luatex-*.tex",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
local dummyfunction = function() end
+local dummyreporter = function(c) return function(...) texio.write(c .. " : " .. string.format(...)) end end
statistics = {
register = dummyfunction,
starttiming = dummyfunction,
stoptiming = dummyfunction,
+ elapsedtime = nil,
}
+
directives = {
register = dummyfunction,
enable = dummyfunction,
disable = dummyfunction,
}
+
trackers = {
register = dummyfunction,
enable = dummyfunction,
disable = dummyfunction,
}
+
experiments = {
register = dummyfunction,
enable = dummyfunction,
disable = dummyfunction,
}
-storage = {
+
+storage = { -- probably no longer needed
register = dummyfunction,
shared = { },
}
+
logs = {
+ new = dummyreporter,
+ reporter = dummyreporter,
+ messenger = dummyreporter,
report = dummyfunction,
- simple = dummyfunction,
-}
-tasks = {
- new = dummyfunction,
- actions = dummyfunction,
- appendaction = dummyfunction,
- prependaction = dummyfunction,
}
+
callbacks = {
register = function(n,f) return callback.register(n,f) end,
+
+}
+
+utilities = {
+ storage = {
+ allocate = function(t) return t or { } end,
+ mark = function(t) return t or { } end,
+ },
+}
+
+characters = characters or {
+ data = { }
}
-- we need to cheat a bit here
@@ -2057,22 +2473,34 @@ local remapper = {
otf = "opentype fonts",
ttf = "truetype fonts",
ttc = "truetype fonts",
- dfont = "truetype dictionary",
+ dfont = "truetype fonts", -- "truetype dictionary",
cid = "cid maps",
fea = "font feature files",
}
-function resolvers.find_file(name,kind)
+function resolvers.findfile(name,fileformat)
name = string.gsub(name,"\\","\/")
- kind = string.lower(kind)
- return kpse.find_file(name,(kind and kind ~= "" and (remapper[kind] or kind)) or file.extname(name,"tex"))
+ fileformat = fileformat and string.lower(fileformat)
+ local found = kpse.find_file(name,(fileformat and fileformat ~= "" and (remapper[fileformat] or fileformat)) or file.extname(name,"tex"))
+ if not found or found == "" then
+ found = kpse.find_file(name,"other text files")
+ end
+ return found
end
-function resolvers.findbinfile(name,kind)
- if not kind or kind == "" then
- kind = file.extname(name) -- string.match(name,"%.([^%.]-)$")
+function resolvers.findbinfile(name,fileformat)
+ if not fileformat or fileformat == "" then
+ fileformat = file.extname(name) -- string.match(name,"%.([^%.]-)$")
end
- return resolvers.find_file(name,(kind and remapper[kind]) or kind)
+ return resolvers.findfile(name,(fileformat and remapper[fileformat]) or fileformat)
+end
+
+function resolvers.resolve(s)
+ return s
+end
+
+function resolvers.unresolve(s)
+ return s
end
-- Caches ... I will make a real stupid version some day when I'm in the
@@ -2081,57 +2509,124 @@ end
-- usage as I don't want any dependency at all. Also, ConTeXt might have
-- different needs and tricks added.
+--~ containers.usecache = true
+
caches = { }
---~ containers.usecache = true
+local writable, readables = nil, { }
+
+if not caches.namespace or caches.namespace == "" or caches.namespace == "context" then
+ caches.namespace = 'generic'
+end
-function caches.setpath(category,subcategory)
- local root = kpse.var_value("TEXMFCACHE") or ""
- if root == "" then
- root = kpse.var_value("VARTEXMF") or ""
+do
+
+ local cachepaths = kpse.expand_path('$TEXMFCACHE') or ""
+
+ if cachepaths == "" then
+ cachepaths = kpse.expand_path('$TEXMFVAR')
+ end
+
+ if cachepaths == "" then
+ cachepaths = kpse.expand_path('$VARTEXMF')
+ end
+
+ if cachepaths == "" then
+ cachepaths = "."
+ end
+
+ cachepaths = string.split(cachepaths,os.type == "windows" and ";" or ":")
+
+ for i=1,#cachepaths do
+ if file.is_writable(cachepaths[i]) then
+ writable = file.join(cachepaths[i],"luatex-cache")
+ lfs.mkdir(writable)
+ writable = file.join(writable,caches.namespace)
+ lfs.mkdir(writable)
+ break
+ end
+ end
+
+ for i=1,#cachepaths do
+ if file.is_readable(cachepaths[i]) then
+ readables[#readables+1] = file.join(cachepaths[i],"luatex-cache",caches.namespace)
+ end
end
- if root ~= "" then
- root = file.join(root,category)
- lfs.mkdir(root)
- root = file.join(root,subcategory)
- lfs.mkdir(root)
- return lfs.isdir(root) and root
+
+ if not writable then
+ texio.write_nl("quiting: fix your writable cache path")
+ os.exit()
+ elseif #readables == 0 then
+ texio.write_nl("quiting: fix your readable cache path")
+ os.exit()
+ elseif #readables == 1 and readables[1] == writable then
+ texio.write(string.format("(using cache: %s)",writable))
+ else
+ texio.write(string.format("(using write cache: %s)",writable))
+ texio.write(string.format("(using read cache: %s)",table.concat(readables, " ")))
end
+
+end
+
+function caches.getwritablepath(category,subcategory)
+ local path = file.join(writable,category)
+ lfs.mkdir(path)
+ path = file.join(path,subcategory)
+ lfs.mkdir(path)
+ return path
+end
+
+function caches.getreadablepaths(category,subcategory)
+ local t = { }
+ for i=1,#readables do
+ t[i] = file.join(readables[i],category,subcategory)
+ end
+ return t
end
local function makefullname(path,name)
if path and path ~= "" then
- name = "temp-" and name -- clash prevention
+ name = "temp-" .. name -- clash prevention
return file.addsuffix(file.join(path,name),"lua")
end
end
-function caches.iswritable(path,name)
+function caches.is_writable(path,name)
local fullname = makefullname(path,name)
- return fullname and file.iswritable(fullname)
+ return fullname and file.is_writable(fullname)
end
-function caches.loaddata(path,name)
- local fullname = makefullname(path,name)
- if fullname then
- local data = loadfile(fullname)
- return data and data()
+function caches.loaddata(paths,name)
+ for i=1,#paths do
+ local fullname = makefullname(paths[i],name)
+ if fullname then
+ texio.write(string.format("(load: %s)",fullname))
+ local data = loadfile(fullname)
+ return data and data()
+ end
end
end
function caches.savedata(path,name,data)
local fullname = makefullname(path,name)
if fullname then
- table.tofile(fullname,data,'return',false,true,false)
+ texio.write(string.format("(save: %s)",fullname))
+ table.tofile(fullname,data,true,{ reduce = true })
end
end
+--
+
+local table.setmetatableindex(t,f)
+ setmetatable(t,{ __index = f })
+end
+
end -- closure
do -- begin closure to overcome local limits and interference
if not modules then modules = { } end modules ['data-con'] = {
- version = 1.001,
+ version = 1.100,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
@@ -2157,50 +2652,63 @@ table structures without bothering about the disk cache.</p>
<p>Examples of usage can be found in the font related code.</p>
--ldx]]--
-containers = containers or { }
-
+containers = containers or { }
+local containers = containers
containers.usecache = true
+local report_containers = logs.reporter("resolvers","containers")
+
local function report(container,tag,name)
if trace_cache or trace_containers then
- logs.report(format("%s cache",container.subcategory),"%s: %s",tag,name or 'invalid')
+ report_containers("container: %s, tag: %s, name: %s",container.subcategory,tag,name or 'invalid')
end
end
local allocated = { }
--- tracing
+local mt = {
+ __index = function(t,k)
+ if k == "writable" then
+ local writable = caches.getwritablepath(t.category,t.subcategory) or { "." }
+ t.writable = writable
+ return writable
+ elseif k == "readables" then
+ local readables = caches.getreadablepaths(t.category,t.subcategory) or { "." }
+ t.readables = readables
+ return readables
+ end
+ end,
+ __storage__ = true
+}
function containers.define(category, subcategory, version, enabled)
- return function()
- if category and subcategory then
- local c = allocated[category]
- if not c then
- c = { }
- allocated[category] = c
- end
- local s = c[subcategory]
- if not s then
- s = {
- category = category,
- subcategory = subcategory,
- storage = { },
- enabled = enabled,
- version = version or 1.000,
- trace = false,
- path = caches and caches.setpath and caches.setpath(category,subcategory),
- }
- c[subcategory] = s
- end
- return s
- else
- return nil
+ if category and subcategory then
+ local c = allocated[category]
+ if not c then
+ c = { }
+ allocated[category] = c
+ end
+ local s = c[subcategory]
+ if not s then
+ s = {
+ category = category,
+ subcategory = subcategory,
+ storage = { },
+ enabled = enabled,
+ version = version or math.pi, -- after all, this is TeX
+ trace = false,
+ -- writable = caches.getwritablepath and caches.getwritablepath (category,subcategory) or { "." },
+ -- readables = caches.getreadablepaths and caches.getreadablepaths(category,subcategory) or { "." },
+ }
+ setmetatable(s,mt)
+ c[subcategory] = s
end
+ return s
end
end
function containers.is_usable(container, name)
- return container.enabled and caches and caches.iswritable(container.path, name)
+ return container.enabled and caches and caches.is_writable(container.writable, name)
end
function containers.is_valid(container, name)
@@ -2213,18 +2721,20 @@ function containers.is_valid(container, name)
end
function containers.read(container,name)
- if container.enabled and caches and not container.storage[name] and containers.usecache then
- container.storage[name] = caches.loaddata(container.path,name)
- if containers.is_valid(container,name) then
+ local storage = container.storage
+ local stored = storage[name]
+ if not stored and container.enabled and caches and containers.usecache then
+ stored = caches.loaddata(container.readables,name)
+ if stored and stored.cache_version == container.version then
report(container,"loaded",name)
else
- container.storage[name] = nil
+ stored = nil
end
- end
- if container.storage[name] then
+ storage[name] = stored
+ elseif stored then
report(container,"reusing",name)
end
- return container.storage[name]
+ return stored
end
function containers.write(container, name, data)
@@ -2233,7 +2743,7 @@ function containers.write(container, name, data)
if container.enabled and caches then
local unique, shared = data.unique, data.shared
data.unique, data.shared = nil, nil
- caches.savedata(container.path, name, data)
+ caches.savedata(container.writable, name, data)
report(container,"saved",name)
data.unique, data.shared = unique, shared
end
@@ -2255,122 +2765,74 @@ end -- closure
do -- begin closure to overcome local limits and interference
-if not modules then modules = { } end modules ['node-ini'] = {
+if not modules then modules = { } end modules ['luatex-fonts-nod'] = {
version = 1.001,
- comment = "companion to node-ini.mkiv",
+ comment = "companion to luatex-fonts.lua",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
---[[ldx--
-<p>Most of the code that had accumulated here is now separated in
-modules.</p>
---ldx]]--
-
--- this module is being reconstructed
-
-local utf = unicode.utf8
-local next, type = next, type
-local format, concat, match, utfchar = string.format, table.concat, string.match, utf.char
-
-local chardata = characters and characters.data
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
---[[ldx--
-<p>We start with a registration system for atributes so that we can use the
-symbolic names later on.</p>
---ldx]]--
+-- Don't depend on code here as it is only needed to complement the
+-- font handler code.
-attributes = attributes or { }
+-- Attributes:
-attributes.names = attributes.names or { }
-attributes.numbers = attributes.numbers or { }
-attributes.list = attributes.list or { }
-attributes.unsetvalue = -0x7FFFFFFF
+if tex.attribute[0] ~= 0 then
-storage.register("attributes/names", attributes.names, "attributes.names")
-storage.register("attributes/numbers", attributes.numbers, "attributes.numbers")
-storage.register("attributes/list", attributes.list, "attributes.list")
+ texio.write_nl("log","!")
+ texio.write_nl("log","! Attribute 0 is reserved for ConTeXt's font feature management and has to be")
+ texio.write_nl("log","! set to zero. Also, some attributes in the range 1-255 are used for special")
+ texio.write_nl("log","! purposes so setting them at the TeX end might break the font handler.")
+ texio.write_nl("log","!")
-local names, numbers, list = attributes.names, attributes.numbers, attributes.list
+ tex.attribute[0] = 0 -- else no features
-function attributes.define(name,number) -- at the tex end
- if not numbers[name] then
- numbers[name], names[number], list[number] = number, name, { }
- end
end
---[[ldx--
-<p>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 <l n='context'/>.</p>
---ldx]]--
+attributes = { }
+attributes.unsetvalue = -0x7FFFFFFF
-storage.shared.attributes_last_private = storage.shared.attributes_last_private or 127
+local numbers, last = { }, 127
-function attributes.private(name) -- at the lua end (hidden from user)
+function attributes.private(name)
local number = numbers[name]
if not number then
- local last = storage.shared.attributes_last_private or 127
if last < 255 then
last = last + 1
- storage.shared.attributes_last_private = last
end
number = last
- numbers[name], names[number], list[number] = number, name, { }
+ numbers[name] = number
end
return number
end
---[[ldx--
-<p>Access to nodes is what gives <l n='luatex'/> its power. Here we
-implement a few helper functions. These functions are rather optimized.</p>
---ldx]]--
+-- Nodes:
---[[ldx--
-<p>When manipulating node lists in <l n='context'/>, we will remove
-nodes and insert new ones. While node access was implemented, we did
-quite some experiments in order to find out if manipulating nodes
-in <l n='lua'/> was feasible from the perspective of performance.</p>
-
-<p>First of all, we noticed that the bottleneck is more with excessive
-callbacks (some gets called very often) and the conversion from and to
-<l n='tex'/>'s datastructures. However, at the <l n='lua'/> end, we
-found that inserting and deleting nodes in a table could become a
-bottleneck.</p>
-
-<p>This resulted in two special situations in passing nodes back to
-<l n='tex'/>: a table entry with value <type>false</type> is ignored,
-and when instead of a table <type>true</type> is returned, the
-original table is used.</p>
-
-<p>Insertion is handled (at least in <l n='context'/> as follows. When
-we need to insert a node at a certain position, we change the node at
-that position by a dummy node, tagged <type>inline</type> which itself
-has_attribute the original node and one or more new nodes. Before we pass
-back the list we collapse the list. Of course collapsing could be built
-into the <l n='tex'/> engine, but this is a not so natural extension.</p>
-
-<p>When we collapse (something that we only do when really needed), we
-also ignore the empty nodes. [This is obsolete!]</p>
---ldx]]--
+nodes = { }
+nodes.pool = { }
+nodes.handlers = { }
-nodes = nodes or { }
+local nodecodes = { } for k,v in next, node.types () do nodecodes[string.gsub(v,"_","")] = k end
+local whatcodes = { } for k,v in next, node.whatsits() do whatcodes[string.gsub(v,"_","")] = k end
+local glyphcodes = { [0] = "character", "glyph", "ligature", "ghost", "left", "right" }
-local hlist = node.id('hlist')
-local vlist = node.id('vlist')
-local glyph = node.id('glyph')
-local glue = node.id('glue')
-local penalty = node.id('penalty')
-local kern = node.id('kern')
-local whatsit = node.id('whatsit')
+nodes.nodecodes = nodecodes
+nodes.whatcodes = whatcodes
+nodes.whatsitcodes = whatcodes
+nodes.glyphcodes = glyphcodes
-local traverse_id = node.traverse_id
-local traverse = node.traverse
-local free_node = node.free
-local remove_node = node.remove
-local insert_node_before = node.insert_before
-local insert_node_after = node.insert_after
+local free_node = node.free
+local remove_node = node.remove
+local new_node = node.new
+
+nodes.handlers.protectglyphs = node.protect_glyphs
+nodes.handlers.unprotectglyphs = node.unprotect_glyphs
function nodes.remove(head, current, free_too)
local t = current
@@ -2390,1130 +2852,15 @@ function nodes.delete(head,current)
return nodes.remove(head,current,true)
end
-nodes.before = insert_node_before
-nodes.after = insert_node_after
-
--- we need to test this, as it might be fixed now
-
-function nodes.before(h,c,n)
- if c then
- if c == h then
- n.next = h
- n.prev = nil
- h.prev = n
- else
- local cp = c.prev
- n.next = c
- n.prev = cp
- if cp then
- cp.next = n
- end
- c.prev = n
- return h, n
- end
- end
- return n, n
-end
-
-function nodes.after(h,c,n)
- if c then
- local cn = c.next
- if cn then
- n.next = cn
- cn.prev = n
- else
- n.next = nil
- end
- c.next = n
- n.prev = c
- return h, n
- end
- return n, n
-end
-
--- local h, c = nodes.replace(head,current,new)
--- local c = nodes.replace(false,current,new)
--- local c = nodes.replace(current,new)
-
-function nodes.replace(head,current,new) -- no head returned if false
- if not new then
- head, current, new = false, head, current
- end
- local prev, next = current.prev, current.next
- if next then
- new.next, next.prev = next, new
- end
- if prev then
- new.prev, prev.next = prev, new
- end
- if head then
- if head == current then
- head = new
- end
- free_node(current)
- return head, new
- else
- free_node(current)
- return new
- end
-end
-
--- will move
-
-local function count(stack,flat)
- local n = 0
- while stack do
- local id = stack.id
- if not flat and id == hlist or id == vlist then
- local list = stack.list
- if list then
- n = n + 1 + count(list) -- self counts too
- else
- n = n + 1
- end
- else
- n = n + 1
- end
- stack = stack.next
- end
- return n
-end
-
-nodes.count = count
-
--- new, will move
-
-function attributes.ofnode(n)
- local a = n.attr
- if a then
- local names = attributes.names
- a = a.next
- while a do
- local number, value = a.number, a.value
- texio.write_nl(format("%s : attribute %3i, value %4i, name %s",tostring(n),number,value,names[number] or '?'))
- a = a.next
- end
- end
-end
-
-local left, space = lpeg.P("<"), lpeg.P(" ")
-
-nodes.filterkey = left * (1-left)^0 * left * space^0 * lpeg.C((1-space)^0)
-
-end -- closure
-
-do -- begin closure to overcome local limits and interference
-
-if not modules then modules = { } end modules ['node-res'] = {
- version = 1.001,
- comment = "companion to node-ini.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local gmatch, format = string.gmatch, string.format
-local copy_node, free_node, free_list, new_node, node_type, node_id = node.copy, node.free, node.flush_list, node.new, node.type, node.id
-local tonumber, round = tonumber, math.round
-
-local glyph_node = node_id("glyph")
-
---[[ldx--
-<p>The next function is not that much needed but in <l n='context'/> we use
-for debugging <l n='luatex'/> node management.</p>
---ldx]]--
-
-nodes = nodes or { }
-
-nodes.whatsits = { } -- table.swapped(node.whatsits())
-
-local reserved = { }
-local whatsits = nodes.whatsits
-
-for k, v in next, node.whatsits() do
- whatsits[k], whatsits[v] = v, k -- two way
-end
-
-local function register_node(n)
- reserved[#reserved+1] = n
- return n
-end
-
-nodes.register = register_node
+nodes.before = node.insert_before
+nodes.after = node.insert_after
-function nodes.cleanup_reserved(nofboxes) -- todo
- nodes.tracers.steppers.reset() -- todo: make a registration subsystem
- local nr, nl = #reserved, 0
- for i=1,nr do
- local ri = reserved[i]
- -- if not (ri.id == glue_spec and not ri.is_writable) then
- free_node(reserved[i])
- -- end
- end
- if nofboxes then
- local tb = tex.box
- for i=0,nofboxes do
- local l = tb[i]
- if l then
- free_node(tb[i])
- nl = nl + 1
- end
- end
- end
- reserved = { }
- return nr, nl, nofboxes -- can be nil
-end
-
-function nodes.usage()
- local t = { }
- for n, tag in gmatch(status.node_mem_usage,"(%d+) ([a-z_]+)") do
- t[tag] = n
- end
- return t
-end
-
-local disc = register_node(new_node("disc"))
-local kern = register_node(new_node("kern",1))
-local penalty = register_node(new_node("penalty"))
-local glue = register_node(new_node("glue")) -- glue.spec = nil
-local glue_spec = register_node(new_node("glue_spec"))
-local glyph = register_node(new_node("glyph",0))
-local textdir = register_node(new_node("whatsit",whatsits.dir)) -- 7 (6 is local par node)
-local rule = register_node(new_node("rule"))
-local latelua = register_node(new_node("whatsit",whatsits.late_lua)) -- 35
-local user_n = register_node(new_node("whatsit",whatsits.user_defined)) user_n.type = 100 -- 44
-local user_l = register_node(new_node("whatsit",whatsits.user_defined)) user_l.type = 110 -- 44
-local user_s = register_node(new_node("whatsit",whatsits.user_defined)) user_s.type = 115 -- 44
-local user_t = register_node(new_node("whatsit",whatsits.user_defined)) user_t.type = 116 -- 44
-local left_margin_kern = register_node(new_node("margin_kern",0))
-local right_margin_kern = register_node(new_node("margin_kern",1))
-local lineskip = register_node(new_node("glue",1))
-local baselineskip = register_node(new_node("glue",2))
-local leftskip = register_node(new_node("glue",8))
-local rightskip = register_node(new_node("glue",9))
-local temp = register_node(new_node("temp",0))
-
-function nodes.zeroglue(n)
- local s = n.spec
- return not writable or (
- s.width == 0
- and s.stretch == 0
- and s.shrink == 0
- and s.stretch_order == 0
- and s.shrink_order == 0
- )
-end
-
-function nodes.glyph(fnt,chr)
- local n = copy_node(glyph)
- if fnt then n.font = fnt end
- if chr then n.char = chr end
- return n
-end
-
-function nodes.penalty(p)
- local n = copy_node(penalty)
- n.penalty = p
- return n
-end
-
-function nodes.kern(k)
- local n = copy_node(kern)
+function nodes.pool.kern(k)
+ local n = new_node("kern",1)
n.kern = k
return n
end
-function nodes.glue_spec(width,stretch,shrink)
- local s = copy_node(glue_spec)
- s.width, s.stretch, s.shrink = width, stretch, shrink
- return s
-end
-
-local function someskip(skip,width,stretch,shrink)
- local n = copy_node(skip)
- if not width then
- -- no spec
- elseif tonumber(width) then
- local s = copy_node(glue_spec)
- s.width, s.stretch, s.shrink = width, stretch, shrink
- n.spec = s
- else
- -- shared
- n.spec = copy_node(width)
- end
- return n
-end
-
-function nodes.glue(width,stretch,shrink)
- return someskip(glue,width,stretch,shrink)
-end
-function nodes.leftskip(width,stretch,shrink)
- return someskip(leftskip,width,stretch,shrink)
-end
-function nodes.rightskip(width,stretch,shrink)
- return someskip(rightskip,width,stretch,shrink)
-end
-function nodes.lineskip(width,stretch,shrink)
- return someskip(lineskip,width,stretch,shrink)
-end
-function nodes.baselineskip(width,stretch,shrink)
- return someskip(baselineskip,width,stretch,shrink)
-end
-
-function nodes.disc()
- return copy_node(disc)
-end
-
-function nodes.textdir(dir)
- local t = copy_node(textdir)
- t.dir = dir
- return t
-end
-
-function nodes.rule(width,height,depth,dir)
- local n = copy_node(rule)
- if width then n.width = width end
- if height then n.height = height end
- if depth then n.depth = depth end
- if dir then n.dir = dir end
- return n
-end
-
-function nodes.latelua(code)
- local n = copy_node(latelua)
- n.data = code
- return n
-end
-
-function nodes.leftmarginkern(glyph,width)
- local n = copy_node(left_margin_kern)
- if not glyph then
- logs.fatal("nodes","invalid pointer to left margin glyph node")
- elseif glyph.id ~= glyph_node then
- logs.fatal("nodes","invalid node type %s for left margin glyph node",node_type(glyph))
- else
- n.glyph = glyph
- end
- if width then
- n.width = width
- end
- return n
-end
-
-function nodes.rightmarginkern(glyph,width)
- local n = copy_node(right_margin_kern)
- if not glyph then
- logs.fatal("nodes","invalid pointer to right margin glyph node")
- elseif glyph.id ~= glyph_node then
- logs.fatal("nodes","invalid node type %s for right margin glyph node",node_type(p))
- else
- n.glyph = glyph
- end
- if width then
- n.width = width
- end
- return n
-end
-
-function nodes.temp()
- return copy_node(temp)
-end
---[[
-<p>At some point we ran into a problem that the glue specification
-of the zeropoint dimension was overwritten when adapting a glue spec
-node. This is a side effect of glue specs being shared. After a
-couple of hours tracing and debugging Taco and I came to the
-conclusion that it made no sense to complicate the spec allocator
-and settled on a writable flag. This all is a side effect of the
-fact that some glues use reserved memory slots (with the zeropoint
-glue being a noticeable one). So, next we wrap this into a function
-and hide it for the user. And yes, LuaTeX now gives a warning as
-well.</p>
-]]--
-
-if tex.luatexversion > 51 then
-
- function nodes.writable_spec(n)
- local spec = n.spec
- if not spec then
- spec = copy_node(glue_spec)
- n.spec = spec
- elseif not spec.writable then
- spec = copy_node(spec)
- n.spec = spec
- end
- return spec
- end
-
-else
-
- function nodes.writable_spec(n)
- local spec = n.spec
- if not spec then
- spec = copy_node(glue_spec)
- else
- spec = copy_node(spec)
- end
- n.spec = spec
- return spec
- end
-
-end
-
-local cache = { }
-
-function nodes.usernumber(num)
- local n = cache[num]
- if n then
- return copy_node(n)
- else
- local n = copy_node(user_n)
- if num then n.value = num end
- return n
- end
-end
-
-function nodes.userlist(list)
- local n = copy_node(user_l)
- if list then n.value = list end
- return n
-end
-
-local cache = { } -- we could use the same cache
-
-function nodes.userstring(str)
- local n = cache[str]
- if n then
- return copy_node(n)
- else
- local n = copy_node(user_s)
- n.type = 115
- if str then n.value = str end
- return n
- end
-end
-
-function nodes.usertokens(tokens)
- local n = copy_node(user_t)
- if tokens then n.value = tokens end
- return n
-end
-
-statistics.register("cleaned up reserved nodes", function()
- return format("%s nodes, %s lists of %s", nodes.cleanup_reserved(tex.count["lastallocatedbox"]))
-end) -- \topofboxstack
-
-statistics.register("node memory usage", function() -- comes after cleanup !
- return status.node_mem_usage
-end)
-
-end -- closure
-
-do -- begin closure to overcome local limits and interference
-
-if not modules then modules = { } end modules ['node-inj'] = {
- version = 1.001,
- comment = "companion to node-ini.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- tricky ... fonts.ids is not yet defined .. to be solved (maybe general tex ini)
-
--- 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.
-
-local next = next
-
-local trace_injections = false trackers.register("nodes.injections", function(v) trace_injections = v end)
-
-fonts = fonts or { }
-fonts.tfm = fonts.tfm or { }
-fonts.ids = fonts.ids or { }
-
-local fontdata = fonts.ids
-
-local glyph = node.id('glyph')
-local kern = node.id('kern')
-
-local traverse_id = node.traverse_id
-local has_attribute = node.has_attribute
-local set_attribute = node.set_attribute
-local insert_node_before = node.insert_before
-local insert_node_after = node.insert_after
-
-local newkern = nodes.kern
-
-local markbase = attributes.private('markbase')
-local markmark = attributes.private('markmark')
-local markdone = attributes.private('markdone')
-local cursbase = attributes.private('cursbase')
-local curscurs = attributes.private('curscurs')
-local cursdone = attributes.private('cursdone')
-local kernpair = attributes.private('kernpair')
-
-local cursives = { }
-local marks = { }
-local kerns = { }
-
--- 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
-
--- for the moment we pass the r2l key ... volt/arabtype tests
-
-function nodes.set_cursive(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
- set_attribute(start,cursbase,bound)
- set_attribute(nxt,curscurs,bound)
- cursives[bound] = { rlmode, dx, dy, ws, wn }
- return dx, dy, bound
-end
-
-function nodes.set_pair(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 = has_attribute(current,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
- else
- bound = #kerns + 1
- set_attribute(current,kernpair,bound)
- kerns[bound] = { rlmode, x, y, w, h, r2lflag, tfmchr.width }
- end
- return x, y, w, h, bound
- end
- return x, y, w, h -- no bound
-end
-
-function nodes.set_kern(current,factor,rlmode,x,tfmchr)
- local dx = factor*x
- if dx ~= 0 then
- local bound = #kerns + 1
- set_attribute(current,kernpair,bound)
- kerns[bound] = { rlmode, dx }
- end
- return dx, bound
-end
-
-function nodes.set_mark(start,base,factor,rlmode,ba,ma,index) --ba=baseanchor, ma=markanchor
- local dx, dy = factor*(ba[1]-ma[1]), factor*(ba[2]-ma[2])
- local bound = has_attribute(base,markbase)
- if bound then
- local mb = marks[bound]
- if mb then
- if not index then index = #mb + 1 end
- mb[index] = { dx, dy }
- set_attribute(start,markmark,bound)
- set_attribute(start,markdone,index)
- return dx, dy, bound
- else
- logs.report("nodes mark", "possible problem, U+%04X is base without data (id: %s)",base.char,bound)
- end
- end
- index = index or 1
- bound = #marks + 1
- set_attribute(base,markbase,bound)
- set_attribute(start,markmark,bound)
- set_attribute(start,markdone,index)
- marks[bound] = { [index] = { dx, dy } }
- return dx, dy, bound
-end
-
-function nodes.trace_injection(head)
- 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 report(...)
- logs.report("nodes finisher",...)
- end
- report("begin run")
- for n in traverse_id(glyph,head) do
- if n.subtype < 256 then
- local kp = has_attribute(n,kernpair)
- local mb = has_attribute(n,markbase)
- local mm = has_attribute(n,markmark)
- local md = has_attribute(n,markdone)
- local cb = has_attribute(n,cursbase)
- local cc = has_attribute(n,curscurs)
- report("char U+%05X, font=%s",n.char,n.font)
- if kp then
- local k = kerns[kp]
- if k[3] then
- report(" pairkern: dir=%s, x=%s, y=%s, w=%s, h=%s",dir(k[1]),k[2] or "?",k[3] or "?",k[4] or "?",k[5] or "?")
- else
- report(" kern: dir=%s, dx=%s",dir(k[1]),k[2] or "?")
- end
- end
- if mb then
- report(" markbase: bound=%s",mb)
- end
- if mm then
- local m = marks[mm]
- if mb then
- local m = m[mb]
- if m then
- report(" markmark: bound=%s, index=%s, dx=%s, dy=%s",mm,md or "?",m[1] or "?",m[2] or "?")
- else
- report(" markmark: bound=%s, missing index",mm)
- end
- else
- m = m[1]
- report(" markmark: bound=%s, dx=%s, dy=%s",mm,m[1] or "?",m[2] or "?")
- end
- end
- if cb then
- report(" cursbase: bound=%s",cb)
- end
- if cc then
- local c = cursives[cc]
- report(" curscurs: bound=%s, dir=%s, dx=%s, dy=%s",cc,dir(c[1]),c[2] or "?",c[3] or "?")
- end
- end
- end
- report("end run")
-end
-
--- todo: reuse tables (i.e. no collection), but will be extra fields anyway
-
-function nodes.inject_kerns(head,where,keep)
- local has_marks, has_cursives, has_kerns = next(marks), next(cursives), next(kerns)
- if has_marks or has_cursives then
---~ if has_marks or has_cursives or has_kerns then
- if trace_injections then
- nodes.trace_injection(head)
- end
- -- in the future variant we will not copy items but refs to tables
- local done, ky, rl, valid, cx, wx, mk = false, { }, { }, { }, { }, { }, { }
- if has_kerns then -- move outside loop
- local nf, tm = nil, nil
- for n in traverse_id(glyph,head) do
- if n.subtype < 256 then
- valid[#valid+1] = n
- if n.font ~= nf then
- nf = n.font
- tm = fontdata[nf].marks
- end
- mk[n] = tm[n.char]
- local k = has_attribute(n,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
- rl[n] = kk[1] -- could move in test
- end
- end
- end
- end
- else
- local nf, tm = nil, nil
- for n in traverse_id(glyph,head) do
- if n.subtype < 256 then
- valid[#valid+1] = n
- if n.font ~= nf then
- nf = n.font
- tm = fontdata[nf].marks
- end
- mk[n] = tm[n.char]
- end
- end
- end
- if #valid > 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
- -- 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,#valid do -- valid == glyphs
- local n = valid[i]
- if not mk[n] then
- local n_cursbase = has_attribute(n,cursbase)
- if p_cursbase then
- local n_curscurs = has_attribute(n,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
- 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,#valid do
- local p = valid[i]
- local p_markbase = has_attribute(p,markbase)
- if p_markbase then
- local mrks = marks[p_markbase]
- for n in traverse_id(glyph,p.next) do
- local n_markmark = has_attribute(n,markmark)
- if p_markbase == n_markmark then
- local index = has_attribute(n,markdone) or 1
- local d = mrks[index]
- if d then
- -- local rlmode = d[3] -- not used
- -- if rlmode and rlmode > 0 then
- -- todo
- -- else
- local k = wx[p]
- if k then
- n.xoffset = p.xoffset - d[1] - k[2]
- else
- n.xoffset = p.xoffset - d[1]
- end
- -- end
- if mk[p] then
- n.yoffset = p.yoffset + d[2]
- else
- n.yoffset = n.yoffset + p.yoffset + d[2]
- end
- end
- else
- break
- end
- end
- end
- end
- if not keep then
- marks = { }
- end
- end
- -- todo : combine
- if next(wx) then
- for n, k in next, wx do
- -- only w can be nil, can be sped up when w == nil
- local rl, x, w, r2l = k[1], k[2] or 0, k[4] or 0, k[6]
- local wx = w - x
---~ if rl < 0 then
---~ if r2l then
---~ if wx ~= 0 then
---~ insert_node_before(head,n,newkern(wx))
---~ end
---~ if x ~= 0 then
---~ insert_node_after (head,n,newkern(x))
---~ 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))
---~ end
---~ end
---~ else
- if r2l then
- if wx ~= 0 then
- insert_node_before(head,n,newkern(wx))
- end
- if x ~= 0 then
- insert_node_after (head,n,newkern(x))
- 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))
- end
- end
---~ end
- end
- 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))
- end
- end
- 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
- nodes.trace_injection(head)
- end
- for n in traverse_id(glyph,head) do
- local k = has_attribute(n,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
---~ if r2l then
---~ if x ~= 0 then
---~ insert_node_before(head,n,newkern(x))
---~ end
---~ if wx ~= 0 then
---~ insert_node_after(head,n,newkern(wx))
---~ end
---~ else
---~ if wx ~= 0 then
---~ insert_node_before(head,n,newkern(wx))
---~ end
---~ if x ~= 0 then
---~ insert_node_after (head,n,newkern(x))
---~ end
---~ end
---~ else
- if r2l then
- if wx ~= 0 then
- insert_node_before(head,n,newkern(wx))
- end
- if x ~= 0 then
- insert_node_after (head,n,newkern(x))
- 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))
- end
- end
---~ end
- else
- -- simple (e.g. kernclass kerns)
- if x ~= 0 then
- insert_node_before(head,n,newkern(x))
- end
- end
- end
- end
- end
- if not keep then
- kerns = { }
- end
- return head, true
- else
- -- no tracing needed
- end
- return head, false
-end
-
-end -- closure
-
-do -- begin closure to overcome local limits and interference
-
-if not modules then modules = { } end modules ['node-fnt'] = {
- version = 1.001,
- comment = "companion to font-ini.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local next, type = next, type
-
-local trace_characters = false trackers.register("nodes.characters", function(v) trace_characters = v end)
-
-local glyph = node.id('glyph')
-
-local traverse_id = node.traverse_id
-local has_attribute = node.has_attribute
-
-local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming
-
-fonts = fonts or { }
-fonts.tfm = fonts.tfm or { }
-fonts.ids = fonts.ids or { }
-
-local fontdata = fonts.ids
-
--- some tests with using an array of dynamics[id] and processes[id] demonstrated
--- that there was nothing to gain (unless we also optimize other parts)
---
--- maybe getting rid of the intermediate shared can save some time
-
--- potential speedup: check for subtype < 256 so that we can remove that test
--- elsewhere, danger: injected nodes will not be dealt with but that does not
--- happen often; we could consider processing sublists but that might need mor
--- checking later on; the current approach also permits variants
-
-if tex.attribute[0] < 0 then
-
- texio.write_nl("log","!")
- texio.write_nl("log","! Attribute 0 is reserved for ConTeXt's font feature management and has to be")
- texio.write_nl("log","! set to zero. Also, some attributes in the range 1-255 are used for special")
- texio.write_nl("log","! purposed so setting them at the TeX end might break the font handler.")
- texio.write_nl("log","!")
-
- tex.attribute[0] = 0 -- else no features
-
-end
-
--- this will be redone and split in a generic one and a context one
-
-function nodes.process_characters(head)
- -- either next or not, but definitely no already processed list
- starttiming(nodes)
- local usedfonts, attrfonts, done = { }, { }, false
- local a, u, prevfont, prevattr = 0, 0, nil, 0
- for n in traverse_id(glyph,head) do
- local font, attr = n.font, has_attribute(n,0) -- zero attribute is reserved for fonts in context
- if attr and attr > 0 then
- if font ~= prevfont or attr ~= prevattr then
- local used = attrfonts[font]
- if not used then
- used = { }
- attrfonts[font] = used
- end
- if not used[attr] then
- -- we do some testing outside the function
- local tfmdata = fontdata[font]
- local shared = tfmdata.shared
- if shared then
- local dynamics = shared.dynamics
- if dynamics then
- local d = shared.set_dynamics(font,dynamics,attr) -- still valid?
- if d then
- used[attr] = d
- a = a + 1
- end
- end
- end
- end
- prevfont, prevattr = font, attr
- end
- elseif font ~= prevfont then
- prevfont, prevattr = font, 0
- 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
- u = u + 1
- end
- end
- else
- -- probably nullfont
- end
- end
- else
- prevattr = attr
- end
- end
- -- we could combine these and just make the attribute nil
- if u == 1 then
- local font, processors = next(usedfonts)
- local n = #processors
- if n > 0 then
- local h, d = processors[1](head,font,false)
- head, done = h or head, done or d
- if n > 1 then
- for i=2,n do
- local h, d = processors[i](head,font,false)
- head, done = h or head, done or d
- end
- end
- end
- elseif u > 0 then
- for font, processors in next, usedfonts do
- local n = #processors
- local h, d = processors[1](head,font,false)
- head, done = h or head, done or d
- if n > 1 then
- for i=2,n do
- local h, d = processors[i](head,font,false)
- head, done = h or head, done or d
- end
- end
- end
- end
- if a == 1 then
- local font, dynamics = next(attrfonts)
- for attribute, processors in next, dynamics do -- attr can switch in between
- local n = #processors
- local h, d = processors[1](head,font,attribute)
- head, done = h or head, done or d
- if n > 1 then
- for i=2,n do
- local h, d = processors[i](head,font,attribute)
- head, done = h or head, done or d
- end
- end
- end
- elseif a > 0 then
- for font, dynamics in next, attrfonts do
- for attribute, processors in next, dynamics do -- attr can switch in between
- local n = #processors
- local h, d = processors[1](head,font,attribute)
- head, done = h or head, done or d
- if n > 1 then
- for i=2,n do
- local h, d = processors[i](head,font,attribute)
- head, done = h or head, done or d
- end
- end
- end
- end
- end
- stoptiming(nodes)
- if trace_characters then
- nodes.report(head,done)
- end
- return head, true
-end
-
-if node.protect_glyphs then
-
- nodes.protect_glyphs = node.protect_glyphs
- nodes.unprotect_glyphs = node.unprotect_glyphs
-
-else do
-
- -- initial value subtype : X000 0001 = 1 = 0x01 = char
- --
- -- expected before linebreak : X000 0000 = 0 = 0x00 = glyph
- -- X000 0010 = 2 = 0x02 = ligature
- -- X000 0100 = 4 = 0x04 = ghost
- -- X000 1010 = 10 = 0x0A = leftboundary lig
- -- X001 0010 = 18 = 0x12 = rightboundary lig
- -- X001 1010 = 26 = 0x1A = both boundaries lig
- -- X000 1100 = 12 = 0x1C = leftghost
- -- X001 0100 = 20 = 0x14 = rightghost
-
- function nodes.protect_glyphs(head)
- local done = false
- for g in traverse_id(glyph,head) do
- local s = g.subtype
- if s == 1 then
- done, g.subtype = true, 256
- elseif s <= 256 then
- done, g.subtype = true, 256 + s
- end
- end
- return done
- end
-
- function nodes.unprotect_glyphs(head)
- local done = false
- for g in traverse_id(glyph,head) do
- local s = g.subtype
- if s > 256 then
- done, g.subtype = true, s - 256
- end
- end
- return done
- end
-
-end end
-
-end -- closure
-
-do -- begin closure to overcome local limits and interference
-
-if not modules then modules = { } end modules ['node-dum'] = {
- version = 1.001,
- comment = "companion to luatex-*.tex",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-nodes = nodes or { }
-
-function nodes.simple_font_handler(head)
--- lang.hyphenate(head)
- head = nodes.process_characters(head)
- nodes.inject_kerns(head)
- nodes.protect_glyphs(head)
- head = node.ligaturing(head)
- head = node.kerning(head)
- return head
-end
-
end -- closure
do -- begin closure to overcome local limits and interference
@@ -3526,99 +2873,42 @@ if not modules then modules = { } end modules ['font-ini'] = {
license = "see context related readme files"
}
+-- basemethods -> can also be in list
+-- presetcontext -> defaults
+-- hashfeatures -> ctx version
+
--[[ldx--
<p>Not much is happening here.</p>
--ldx]]--
-local utf = unicode.utf8
-local format, serialize = string.format, table.serialize
-local write_nl = texio.write_nl
+local lower = string.lower
+local allocate, mark = utilities.storage.allocate, utilities.storage.mark
-if not fontloader then fontloader = fontforge end
+local report_defining = logs.reporter("fonts","defining")
fontloader.totable = fontloader.to_table
--- vtf comes first
--- fix comes last
-
-fonts = fonts or { }
+fonts = fonts or { } -- already defined in context
+local fonts = fonts
-fonts.ids = fonts.ids or { } fonts.identifiers = fonts.ids -- aka fontdata
-fonts.chr = fonts.chr or { } fonts.characters = fonts.chr -- aka chardata
-fonts.qua = fonts.qua or { } fonts.quads = fonts.qua -- aka quaddata
+-- some of these might move to where they are used first:
-fonts.tfm = fonts.tfm or { }
+fonts.hashes = { identifiers = allocate() }
+fonts.analyzers = { } -- not needed here
+fonts.readers = { }
+fonts.tables = { }
+fonts.definers = { methods = { } }
+fonts.specifiers = fonts.specifiers or { } -- in format !
+fonts.loggers = { register = function() end }
+fonts.helpers = { }
-fonts.mode = 'base'
-fonts.private = 0xF0000 -- 0x10FFFF
-fonts.verbose = false -- more verbose cache tables
-
-fonts.ids[0] = { -- nullfont
- characters = { },
- descriptions = { },
- name = "nullfont",
-}
-
-fonts.chr[0] = { }
-
-fonts.methods = fonts.methods or {
- base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
- node = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
-}
-
-fonts.initializers = fonts.initializers or {
- base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } },
- node = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } }
-}
-
-fonts.triggers = fonts.triggers or {
- 'mode',
- 'language',
- 'script',
- 'strategy',
-}
-
-fonts.processors = fonts.processors or {
-}
-
-fonts.manipulators = fonts.manipulators or {
-}
-
-fonts.define = fonts.define or { }
-fonts.define.specify = fonts.define.specify or { }
-fonts.define.specify.synonyms = fonts.define.specify.synonyms or { }
-
--- tracing
-
-if not fonts.color then
-
- fonts.color = {
- set = function() end,
- reset = function() end,
- }
-
-end
-
--- format identification
-
-fonts.formats = { }
-
-function fonts.fontformat(filename,default)
- local extname = file.extname(filename)
- local format = fonts.formats[extname]
- if format then
- return format
- else
- logs.report("fonts define","unable to detemine font format for '%s'",filename)
- return default
- end
-end
+fonts.tracers = { } -- for the moment till we have move to moduledata
end -- closure
do -- begin closure to overcome local limits and interference
-if not modules then modules = { } end modules ['font-tfm'] = {
+if not modules then modules = { } end modules ['font-con'] = {
version = 1.001,
comment = "companion to font-ini.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -3626,83 +2916,56 @@ if not modules then modules = { } end modules ['font-tfm'] = {
license = "see context related readme files"
}
+
local utf = unicode.utf8
-local next, format, match, lower, gsub = next, string.format, string.match, string.lower, string.gsub
-local concat, sortedkeys, utfbyte, serialize = table.concat, table.sortedkeys, utf.byte, table.serialize
+local next, tostring, rawget = next, tostring, rawget
+local format, match, lower, gsub = string.format, string.match, string.lower, string.gsub
+local utfbyte = utf.byte
+local sort, insert, concat, sortedkeys, serialize, fastcopy = table.sort, table.insert, table.concat, table.sortedkeys, table.serialize, table.fastcopy
local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
local trace_scaling = false trackers.register("fonts.scaling" , function(v) trace_scaling = v end)
--- tfmdata has also fast access to indices and unicodes
--- to be checked: otf -> tfm -> tfmscaled
---
+local report_defining = logs.reporter("fonts","defining")
+
-- watch out: no negative depths and negative eights permitted in regular fonts
--[[ldx--
<p>Here we only implement a few helper functions.</p>
--ldx]]--
-fonts = fonts or { }
-fonts.tfm = fonts.tfm or { }
-fonts.ids = fonts.ids or { }
+local fonts = fonts
+local constructors = { }
+fonts.constructors = constructors
+local handlers = { }
+fonts.handlers = handlers
-local tfm = fonts.tfm
+local specifiers = fonts.specifiers
+local contextsetups = specifiers.contextsetups
+local contextnumbers = specifiers.contextnumbers
-fonts.loaded = fonts.loaded or { }
-fonts.dontembed = fonts.dontembed or { }
-fonts.triggers = fonts.triggers or { } -- brrr
-fonts.initializers = fonts.initializers or { }
-fonts.initializers.common = fonts.initializers.common or { }
+local allocate = utilities.storage.allocate
+local setmetatableindex = table.setmetatableindex
-local fontdata = fonts.ids
-local disc = node.id('disc')
-local glyph = node.id('glyph')
-local set_attribute = node.set_attribute
+-- will be directives
---[[ldx--
-<p>The next function encapsulates the standard <l n='tfm'/> loader as
-supplied by <l n='luatex'/>.</p>
---ldx]]--
+constructors.dontembed = allocate()
+constructors.mathactions = { }
+constructors.autocleanup = true
+constructors.namemode = "fullpath" -- will be a function
-tfm.resolve_vf = true -- false
-tfm.share_base_kerns = false -- true (.5 sec slower on mk but brings down mem from 410M to 310M, beware: then script/lang share too)
-tfm.mathactions = { }
-tfm.fontname_mode = "fullpath"
+constructors.version = 1.01
+constructors.cache = containers.define("fonts", "constructors", constructors.version, false)
-tfm.enhance = tfm.enhance or function() end
+constructors.privateoffset = 0xF0000 -- 0x10FFFF
-function tfm.read_from_tfm(specification)
- local fname, tfmdata = specification.filename or "", nil
- if fname ~= "" then
- if trace_defining then
- logs.report("define font","loading tfm file %s at size %s",fname,specification.size)
- end
- tfmdata = font.read_tfm(fname,specification.size) -- not cached, fast enough
- if tfmdata then
- tfmdata.descriptions = tfmdata.descriptions or { }
- if tfm.resolve_vf then
- fonts.logger.save(tfmdata,file.extname(fname),specification) -- strange, why here
- fname = resolvers.findbinfile(specification.name, 'ovf')
- if fname and fname ~= "" then
- local vfdata = font.read_vf(fname,specification.size) -- not cached, fast enough
- if vfdata then
- local chars = tfmdata.characters
- for k,v in next, vfdata.characters do
- chars[k].commands = v.commands
- end
- tfmdata.type = 'virtual'
- tfmdata.fonts = vfdata.fonts
- end
- end
- end
- tfm.enhance(tfmdata,specification)
- end
- elseif trace_defining then
- logs.report("define font","loading tfm with name %s fails",specification.name)
- end
- return tfmdata
-end
+-- This might become an interface;
+
+local designsizes = allocate()
+constructors.designsizes = designsizes
+local loadedfonts = allocate()
+constructors.loadedfonts = loadedfonts
--[[ldx--
<p>We need to normalize the scale factor (in scaled points). This has to
@@ -3715,22 +2978,23 @@ local factors = {
bp = 65781.8,
}
-function tfm.setfactor(f)
- tfm.factor = factors[f or 'pt'] or factors.pt
+function constructors.setfactor(f)
+ constructors.factor = factors[f or 'pt'] or factors.pt
end
-tfm.setfactor()
+constructors.setfactor()
-function tfm.scaled(scaledpoints, designsize) -- handles designsize in sp as well
+function constructors.scaled(scaledpoints, designsize) -- handles designsize in sp as well
if scaledpoints < 0 then
if designsize then
- if designsize > tfm.factor then -- or just 1000 / when? mp?
+ local factor = constructors.factor
+ if designsize > factor then -- or just 1000 / when? mp?
return (- scaledpoints/1000) * designsize -- sp's
else
- return (- scaledpoints/1000) * designsize * tfm.factor
+ return (- scaledpoints/1000) * designsize * factor
end
else
- return (- scaledpoints/1000) * 10 * tfm.factor
+ return (- scaledpoints/1000) * 10 * factor
end
else
return scaledpoints
@@ -3738,200 +3002,326 @@ function tfm.scaled(scaledpoints, designsize) -- handles designsize in sp as wel
end
--[[ldx--
-<p>Before a font is passed to <l n='tex'/> we scale it. Here we also need
-to scale virtual characters.</p>
---ldx]]--
-
-function tfm.get_virtual_id(tfmdata)
- -- since we don't know the id yet, we use 0 as signal
- if not tfmdata.fonts then
- tfmdata.type = "virtual"
- tfmdata.fonts = { { id = 0 } }
- return 1
- else
- tfmdata.fonts[#tfmdata.fonts+1] = { id = 0 }
- return #tfmdata.fonts
- end
-end
-
-function tfm.check_virtual_id(tfmdata, id)
- if tfmdata and tfmdata.type == "virtual" then
- if not tfmdata.fonts or #tfmdata.fonts == 0 then
- tfmdata.type, tfmdata.fonts = "real", nil
- else
- local vfonts = tfmdata.fonts
- for f=1,#vfonts do
- local fnt = vfonts[f]
- if fnt.id and fnt.id == 0 then
- fnt.id = id
- end
- end
- end
- end
-end
-
---[[ldx--
<p>Beware, the boundingbox is passed as reference so we may not overwrite it
in the process; numbers are of course copies. Here 65536 equals 1pt. (Due to
excessive memory usage in CJK fonts, we no longer pass the boundingbox.)</p>
--ldx]]--
-fonts.trace_scaling = false
+-- The scaler is only used for otf and afm and virtual fonts. If
+-- a virtual font has italic correction make sure to set the
+-- italic_correction flag. Some more flags will be added in
+-- the future.
--- the following hack costs a bit of runtime but safes memory
+--[[ldx--
+<p>The reason why the scaler was originally split, is that for a while we experimented
+with a helper function. However, in practice the <l n='api'/> calls are too slow to
+make this profitable and the <l n='lua'/> based variant was just faster. A days
+wasted day but an experience richer.</p>
+--ldx]]--
+
+-- we can get rid of the tfm instance when we have fast access to the
+-- scaled character dimensions at the tex end, e.g. a fontobject.width
+-- actually we already have soem of that now as virtual keys in glyphs
--
--- basekerns are scaled and will be hashed by table id
--- sharedkerns are unscaled and are be hashed by concatenated indexes
-
---~ function tfm.check_base_kerns(tfmdata)
---~ if tfm.share_base_kerns then
---~ local sharedkerns = tfmdata.sharedkerns
---~ if sharedkerns then
---~ local basekerns = { }
---~ tfmdata.basekerns = basekerns
---~ return sharedkerns, basekerns
---~ end
---~ end
---~ return nil, nil
---~ end
+-- flushing the kern and ligature tables from memory saves a lot (only
+-- base mode) but it complicates vf building where the new characters
+-- demand this data .. solution: functions that access them
---~ function tfm.prepare_base_kerns(tfmdata)
---~ if tfm.share_base_kerns and not tfmdata.sharedkerns then
---~ local sharedkerns = { }
---~ tfmdata.sharedkerns = sharedkerns
---~ for u, chr in next, tfmdata.characters do
---~ local kerns = chr.kerns
---~ if kerns then
---~ local hash = concat(sortedkeys(kerns), " ")
---~ local base = sharedkerns[hash]
---~ if not base then
---~ sharedkerns[hash] = kerns
---~ else
---~ chr.kerns = base
---~ end
---~ end
---~ end
---~ end
---~ end
+function constructors.cleanuptable(tfmdata)
+ if constructors.autocleanup and tfmdata.properties.virtualized then
+ for k, v in next, tfmdata.characters do
+ if v.commands then v.commands = nil end
+ -- if v.kerns then v.kerns = nil end
+ end
+ end
+end
--- we can have cache scaled characters when we are in node mode and don't have
--- protruding and expansion: hash == fullname @ size @ protruding @ expansion
--- but in practice (except from mk) the otf hash will be enough already so it
--- makes no sense to mess up the code now
+-- experimental, sharing kerns (unscaled and scaled) saves memory
+-- local sharedkerns, basekerns = constructors.check_base_kerns(tfmdata)
+-- loop over descriptions (afm and otf have descriptions, tfm not)
+-- there is no need (yet) to assign a value to chr.tonunicode
-local charactercache = { }
+-- constructors.prepare_base_kerns(tfmdata) -- optimalization
--- The scaler is only used for otf and afm and virtual fonts. If
--- a virtual font has italic correction make sure to set the
--- has_italic flag. Some more flags will be added in the future.
+-- we have target.name=metricfile and target.fullname=RealName and target.filename=diskfilename
+-- when collapsing fonts, luatex looks as both target.name and target.fullname as ttc files
+-- can have multiple subfonts
-function tfm.calculate_scale(tfmtable, scaledpoints, relativeid)
+function constructors.calculatescale(tfmdata,scaledpoints)
+ local parameters = tfmdata.parameters
if scaledpoints < 0 then
- scaledpoints = (- scaledpoints/1000) * tfmtable.designsize -- already in sp
+ scaledpoints = (- scaledpoints/1000) * (tfmdata.designsize or parameters.designsize) -- already in sp
+ end
+ return scaledpoints, scaledpoints / (parameters.units or 1000) -- delta
+end
+
+function constructors.assignmathparameters(target,tfmdata)
+ -- when a tfm file is loaded, it has already been scaled
+ -- and it never enters the scaled so this is otf only
+ local mathparameters = original.mathparameters
+ if mathparameters and next(mathparameters) then
+ local targetparameters = target.parameters
+ local targetmathparameters = { }
+ local factor = targetparameters.factor
+ for name, value in next, mathparameters do
+ if name == "RadicalDegreeBottomRaisePercent" then
+ targetmathparameters[name] = value
+ else
+ targetmathparameters[name] = value * factor
+ end
+ end
+ if not targetmathparameters.AccentBaseHeight then
+ targetmathparameters.AccentBaseHeight = nil -- safeguard, still needed?
+ end
+ if not targetmathparameters.FractionDelimiterSize then
+ targetmathparameters.FractionDelimiterSize = 0
+ end
+ if not mathparameters.FractionDelimiterDisplayStyleSize then
+ targetmathparameters.FractionDelimiterDisplayStyleSize = 0
+ end
+ target.mathparameters = targetmathparameters
end
- local units = tfmtable.units or 1000
- local delta = scaledpoints/units -- brr, some open type fonts have 2048
- return scaledpoints, delta, units
end
-function tfm.do_scale(tfmtable, scaledpoints, relativeid)
- -- tfm.prepare_base_kerns(tfmtable) -- optimalization
- local t = { } -- the new table
- local scaledpoints, delta, units = tfm.calculate_scale(tfmtable, scaledpoints, relativeid)
- t.units_per_em = units or 1000
- local hdelta, vdelta = delta, delta
- -- unicoded unique descriptions shared cidinfo characters changed parameters indices
- for k,v in next, tfmtable do
- if type(v) == "table" then
- -- print(k)
- else
- t[k] = v
- end
+function constructors.scale(tfmdata,specification)
+ local target = { } -- the new table
+ --
+ if tonumber(specification) then
+ specification = { size = specification }
+ end
+ --
+ local scaledpoints = specification.size
+ local relativeid = specification.relativeid
+ --
+ local properties = tfmdata.properties or { }
+ local goodies = tfmdata.goodies or { }
+ local resources = tfmdata.resources or { }
+ local descriptions = tfmdata.descriptions or { } -- bad news if empty
+ local characters = tfmdata.characters or { } -- bad news if empty
+ local changed = tfmdata.changed or { } -- for base mode
+ local shared = tfmdata.shared or { }
+ local parameters = tfmdata.parameters or { }
+ local mathparameters = tfmdata.mathparameters or { }
+ --
+ local targetcharacters = { }
+ local targetdescriptions = table.derive(descriptions)
+ local targetparameters = table.derive(parameters)
+ -- local targetmathparameters = table.fastcopy(mathparameters) -- happens elsewhere
+ local targetproperties = table.derive(properties)
+ local targetgoodies = goodies -- we need to loop so no metatable
+ target.characters = targetcharacters
+ target.descriptions = targetdescriptions
+ target.parameters = targetparameters
+ -- target.mathparameters = targetmathparameters -- happens elsewhere
+ target.properties = targetproperties
+ target.goodies = targetgoodies
+ target.shared = shared
+ target.resources = resources
+ target.unscaled = tfmdata -- the original unscaled one
+ --
+ -- specification.mathsize : 1=text 2=script 3=scriptscript
+ -- specification.textsize : natural (text)size
+ -- parameters.mathsize : 1=text 2=script 3=scriptscript >1000 enforced size (feature value other than yes)
+ --
+ local mathsize = tonumber(specification.mathsize) or 0
+ local textsize = tonumber(specification.textsize) or scaledpoints
+ local forcedsize = tonumber(parameters.mathsize ) or 0
+ if (mathsize == 2 or forcedsize == 2) and parameters.scriptpercentage then
+ scaledpoints = parameters.scriptpercentage * textsize / 100
+ elseif (mathsize == 3 or forcedsize == 3) and parameters.scriptscriptpercentage then
+ scaledpoints = parameters.scriptscriptpercentage * textsize / 100
+ elseif forcedsize > 1000 then -- safeguard
+ scaledpoints = forcedsize
+ end
+ --
+ local tounicode = resources.tounicode
+ local defaultwidth = resources.defaultwidth or 0
+ local defaultheight = resources.defaultheight or 0
+ local defaultdepth = resources.defaultdepth or 0
+ local units = parameters.units or 1000
+ --
+ if target.fonts then
+ target.fonts = fastcopy(target.fonts) -- maybe we virtualize more afterwards
+ end
+ --
+ -- boundary keys are no longer needed as we now have a string 'right_boundary'
+ -- that can be used in relevant tables (kerns and ligatures) ... not that I ever
+ -- used them
+ --
+ -- boundarychar_label = 0, -- not needed
+ -- boundarychar = 65536, -- there is now a string 'right_boundary'
+ -- false_boundarychar = 65536, -- produces invalid tfm in luatex
+ --
+ targetproperties.language = properties.language or "dflt" -- inherited
+ targetproperties.script = properties.script or "dflt" -- inherited
+ targetproperties.mode = properties.mode or "base" -- inherited
+ --
+ local askedscaledpoints = scaledpoints
+ local scaledpoints, delta = constructors.calculatescale(tfmdata,scaledpoints) -- no shortcut, dan be redefined
+ --
+ local hdelta = delta
+ local vdelta = delta
+ --
+ target.designsize = parameters.designsize -- not really needed so it muight become obsolete
+ target.units_per_em = units -- just a trigger for the backend (does luatex use this? if not it will go)
+ --
+ local direction = properties.direction or tfmdata.direction or 0 -- pointless, as we don't use omf fonts at all
+ target.direction = direction
+ properties.direction = direction
+ --
+ target.size = scaledpoints
+ --
+ target.encodingbytes = properties.encodingbytes or 1
+ target.embedding = properties.embedding or "subset"
+ target.tounicode = 1
+ target.cidinfo = properties.cidinfo
+ target.format = properties.format
+ --
+ 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
+ local filename = properties.filename or tfmdata.filename -- that is not the right place to
+ local psname = properties.psname or tfmdata.psname -- pass them
+ local name = properties.name or tfmdata.name
+ --
+ if not psname or psname == "" then
+ -- name used in pdf file as well as for selecting subfont in ttc/dfont
+ psname = fontname or (fullname and fonts.names.cleanname(fullname))
end
- local extend_factor = tfmtable.extend_factor or 0
+ target.fontname = fontname
+ target.fullname = fullname
+ target.filename = filename
+ target.psname = psname
+ target.name = name
+ --
+ properties.fontname = fontname
+ properties.fullname = fullname
+ properties.filename = filename
+ properties.psname = psname
+ properties.name = name
+ -- expansion (hz)
+ local expansion = parameters.expansion
+ if expansion then
+ target.stretch = expansion.stretch
+ target.shrink = expansion.shrink
+ target.step = expansion.step
+ target.auto_expand = expansion.auto
+ end
+ -- protrusion
+ local protrusion = parameters.protrusion
+ if protrusion then
+ target.auto_protrude = protrusion.auto
+ end
+ -- widening
+ local extend_factor = parameters.extend_factor or 0
if extend_factor ~= 0 and extend_factor ~= 1 then
hdelta = hdelta * extend_factor
- t.extend = extend_factor * 1000
+ target.extend = extend_factor * 1000 -- extent ?
else
- t.extend = 1000
+ target.extend = 1000 -- extent ?
end
- local slant_factor = tfmtable.slant_factor or 0
+ -- slanting
+ local slant_factor = parameters.slant_factor or 0
if slant_factor ~= 0 then
- t.slant = slant_factor * 1000
+ target.slant = slant_factor * 1000
else
- t.slant = 0
- end
- -- status
- local isvirtual = tfmtable.type == "virtual" or tfmtable.virtualized
- local hasmath = (tfmtable.math_parameters ~= nil and next(tfmtable.math_parameters) ~= nil) or (tfmtable.MathConstants ~= nil and next(tfmtable.MathConstants) ~= nil)
- local nodemode = tfmtable.mode == "node"
- local hasquality = tfmtable.auto_expand or tfmtable.auto_protrude
- local hasitalic = tfmtable.has_italic
+ target.slant = 0
+ end
+ --
+ targetparameters.factor = delta
+ targetparameters.hfactor = hdelta
+ targetparameters.vfactor = vdelta
+ targetparameters.size = scaledpoints
+ targetparameters.units = units
+ targetparameters.scaledpoints = askedscaledpoints
+ --
+ local isvirtual = properties.virtualized or tfmdata.type == "virtual"
+ local hasquality = target.auto_expand or target.auto_protrude
+ local hasitalic = properties.italic_correction
+ local stackmath = not properties.no_stackmath
+ local nonames = properties.noglyphnames
+ local nodemode = properties.mode == "node"
+ --
+ if changed and not next(changed) then
+ changed = false
+ end
+ --
+ target.type = isvirtual and "virtual" or "real"
+ -- this will move to some subtable so that it is copied at once
+ target.postprocessors = tfmdata.postprocessors
+ --
+ local targetslant = (parameters.slant or parameters[1] or 0)
+ local targetspace = (parameters.space or parameters[2] or 0)*hdelta
+ local targetspace_stretch = (parameters.space_stretch or parameters[3] or 0)*hdelta
+ local targetspace_shrink = (parameters.space_shrink or parameters[4] or 0)*hdelta
+ local targetx_height = (parameters.x_height or parameters[5] or 0)*vdelta
+ local targetquad = (parameters.quad or parameters[6] or 0)*hdelta
+ local targetextra_space = (parameters.extra_space or parameters[7] or 0)*hdelta
+ --
+ targetparameters.slant = targetslant
+ targetparameters.space = targetspace
+ targetparameters.space_stretch = targetspace_stretch
+ targetparameters.space_shrink = targetspace_shrink
+ targetparameters.x_height = targetx_height
+ targetparameters.quad = targetquad
+ targetparameters.extra_space = targetextra_space
--
- t.parameters = { }
- t.characters = { }
- t.MathConstants = { }
- -- fast access
- local descriptions = tfmtable.descriptions or { }
- t.unicodes = tfmtable.unicodes
- t.indices = tfmtable.indices
- t.marks = tfmtable.marks
-t.goodies = tfmtable.goodies
-t.colorscheme = tfmtable.colorscheme
---~ t.embedding = tfmtable.embedding
- t.descriptions = descriptions
- if tfmtable.fonts then
- t.fonts = table.fastcopy(tfmtable.fonts) -- hm also at the end
- end
- local tp = t.parameters
- local mp = t.math_parameters
- local tfmp = tfmtable.parameters -- let's check for indexes
+ local ascender = parameters.ascender
+ if ascender then
+ targetparameters.ascender = delta * ascender
+ end
+ local descender = parameters.descender
+ if descender then
+ targetparameters.descender = delta * descender
+ end
+ -- copies, might disappear
+ targetparameters.xheight = targetparameters.xheight or parameters.x_height
+ targetparameters.extraspace = targetparameters.extraspace or parameters.extra_space
+ targetparameters.spacestretch = targetparameters.spacestretch or parameters.space_stretch
+ targetparameters.spaceshrink = targetparameters.spaceshrink or parameters.space_shrink
--
- tp.slant = (tfmp.slant or tfmp[1] or 0)
- tp.space = (tfmp.space or tfmp[2] or 0)*hdelta
- tp.space_stretch = (tfmp.space_stretch or tfmp[3] or 0)*hdelta
- tp.space_shrink = (tfmp.space_shrink or tfmp[4] or 0)*hdelta
- tp.x_height = (tfmp.x_height or tfmp[5] or 0)*vdelta
- tp.quad = (tfmp.quad or tfmp[6] or 0)*hdelta
- tp.extra_space = (tfmp.extra_space or tfmp[7] or 0)*hdelta
- local protrusionfactor = (tp.quad ~= 0 and 1000/tp.quad) or 0
- local tc = t.characters
- local characters = tfmtable.characters
- local nameneeded = not tfmtable.shared.otfdata --hack
- local changed = tfmtable.changed or { } -- for base mode
- local ischanged = changed and next(changed)
- local indices = tfmtable.indices
- local luatex = tfmtable.luatex
- local tounicode = luatex and luatex.tounicode
- local defaultwidth = luatex and luatex.defaultwidth or 0
- local defaultheight = luatex and luatex.defaultheight or 0
- local defaultdepth = luatex and luatex.defaultdepth or 0
- -- experimental, sharing kerns (unscaled and scaled) saves memory
- -- local sharedkerns, basekerns = tfm.check_base_kerns(tfmtable)
- -- loop over descriptions (afm and otf have descriptions, tfm not)
- -- there is no need (yet) to assign a value to chr.tonunicode
- local scaledwidth = defaultwidth * hdelta
- local scaledheight = defaultheight * vdelta
- local scaleddepth = defaultdepth * vdelta
- local stackmath = tfmtable.ignore_stack_math ~= true
- local private = fonts.private
- local sharedkerns = { }
- for k,v in next, characters do
+ local protrusionfactor = (targetquad ~= 0 and 1000/targetquad) or 0
+ local scaledwidth = defaultwidth * hdelta
+ local scaledheight = defaultheight * vdelta
+ local scaleddepth = defaultdepth * vdelta
+ --
+ local hasmath = (properties.has_math or next(mathparameters)) and true
+ if hasmath then
+ if trace_defining then
+ report_defining("math enabled for: name '%s', fullname: '%s', filename: '%s'",
+ name or "noname",fullname or "nofullname",filename or "nofilename")
+ end
+ constructors.assignmathparameters(target,tfmdata) -- does scaling and whatever is needed
+ properties.has_math = true
+ target.nomath = false
+ target.MathConstants = target.mathparameters
+ else
+ if trace_defining then
+ report_defining("math disabled for: name '%s', fullname: '%s', filename: '%s'",
+ name or "noname",fullname or "nofullname",filename or "nofilename")
+ end
+ properties.has_math = false
+ target.nomath = true
+ target.mathparameters = nil -- nop
+ end
+ --
+ local sharedkerns = { }
+ --
+ for unicode, character in next, characters do
local chr, description, index
- if ischanged then
+ if changed then
-- basemode hack
- local c = changed[k]
+ local c = changed[unicode]
if c then
- description = descriptions[c] or v
- v = characters[c] or v
- index = (indices and indices[c]) or c
+ description = descriptions[c] or character
+ character = characters[c] or character
+ index = description.index or c
else
- description = descriptions[k] or v
- index = (indices and indices[k]) or k
+ description = descriptions[unicode] or character
+ index = description.index or unicode
end
else
- description = descriptions[k] or v
- index = (indices and indices[k]) or k
+ description = descriptions[unicode] or character
+ index = description.index or unicode
end
local width = description.width
local height = description.height
@@ -3941,9 +3331,8 @@ t.colorscheme = tfmtable.colorscheme
-- if depth then depth = vdelta*depth else depth = scaleddepth end
if depth and depth ~= 0 then
depth = delta*depth
- if nameneeded then
+ if nonames then
chr = {
- name = description.name,
index = index,
height = height,
depth = depth,
@@ -3951,6 +3340,7 @@ t.colorscheme = tfmtable.colorscheme
}
else
chr = {
+ name = description.name,
index = index,
height = height,
depth = depth,
@@ -3959,15 +3349,15 @@ t.colorscheme = tfmtable.colorscheme
end
else
-- this saves a little bit of memory time and memory, esp for big cjk fonts
- if nameneeded then
+ if nonames then
chr = {
- name = description.name,
index = index,
height = height,
width = width,
}
else
chr = {
+ name = description.name,
index = index,
height = height,
width = width,
@@ -3975,7 +3365,7 @@ t.colorscheme = tfmtable.colorscheme
end
end
-- if trace_scaling then
- -- logs.report("define font","t=%s, u=%s, i=%s, n=%s c=%s",k,chr.tounicode or k,description.index,description.name or '-',description.class or '-')
+ -- report_defining("t=%s, u=%s, i=%s, n=%s c=%s",k,chr.tounicode or "",index or 0,description.name or '-',description.class or '-')
-- end
if tounicode then
local tu = tounicode[index] -- nb: index!
@@ -3985,22 +3375,22 @@ t.colorscheme = tfmtable.colorscheme
end
if hasquality then
-- we could move these calculations elsewhere (saves calculations)
- local ve = v.expansion_factor
+ local ve = character.expansion_factor
if ve then
chr.expansion_factor = ve*1000 -- expansionfactor, hm, can happen elsewhere
end
- local vl = v.left_protruding
+ local vl = character.left_protruding
if vl then
chr.left_protruding = protrusionfactor*width*vl
end
- local vr = v.right_protruding
+ local vr = character.right_protruding
if vr then
chr.right_protruding = protrusionfactor*width*vr
end
end
-- todo: hasitalic
if hasitalic then
- local vi = description.italic or v.italic
+ local vi = description.italic or character.italic
if vi and vi ~= 0 then
chr.italic = vi*hdelta
end
@@ -4008,11 +3398,14 @@ t.colorscheme = tfmtable.colorscheme
-- to be tested
if hasmath then
-- todo, just operate on descriptions.math
- local vn = v.next
+ local vn = character.next
if vn then
chr.next = vn
+ -- if character.vert_variants or character.horiz_variants then
+ -- report_defining("glyph U+%05X has combination of next, vert_variants and horiz_variants",index)
+ -- end
else
- local vv = v.vert_variants
+ local vv = character.vert_variants
if vv then
local t = { }
for i=1,#vv do
@@ -4026,13 +3419,8 @@ t.colorscheme = tfmtable.colorscheme
}
end
chr.vert_variants = t
- --~ local ic = v.vert_italic_correction
- --~ if ic then
- --~ chr.italic = ic * hdelta
- --~ print(format("0x%05X -> %s",k,chr.italic))
- --~ end
else
- local hv = v.horiz_variants
+ local hv = character.horiz_variants
if hv then
local t = { }
for i=1,#hv do
@@ -4049,12 +3437,12 @@ t.colorscheme = tfmtable.colorscheme
end
end
end
- local vt = description.top_accent
- if vt then
- chr.top_accent = vdelta*vt
+ local va = character.top_accent
+ if va then
+ chr.top_accent = vdelta*va
end
if stackmath then
- local mk = v.mathkerns
+ local mk = character.mathkerns -- not in math ?
if mk then
local kerns = { }
local v = mk.top_right if v then local k = { } for i=1,#v do local vi = v[i]
@@ -4069,26 +3457,13 @@ t.colorscheme = tfmtable.colorscheme
local v = mk.bottom_right if v then local k = { } for i=1,#v do local vi = v[i]
k[i] = { height = vdelta*vi.height, kern = vdelta*vi.kern }
end kerns.bottom_right = k end
- chr.mathkern = kerns -- singular
+ chr.mathkern = kerns -- singular -> should be patched in luatex !
end
end
end
if not nodemode then
- local vk = v.kerns
+ local vk = character.kerns
if vk then
- --~ if sharedkerns then
- --~ local base = basekerns[vk] -- hashed by table id, not content
- --~ if not base then
- --~ base = {}
- --~ for k,v in next, vk do base[k] = v*hdelta end
- --~ basekerns[vk] = base
- --~ end
- --~ chr.kerns = base
- --~ else
- --~ local tt = {}
- --~ for k,v in next, vk do tt[k] = v*hdelta end
- --~ chr.kerns = tt
- --~ end
local s = sharedkerns[vk]
if not s then
s = { }
@@ -4097,7 +3472,7 @@ t.colorscheme = tfmtable.colorscheme
end
chr.kerns = s
end
- local vl = v.ligatures
+ local vl = character.ligatures
if vl then
if true then
chr.ligatures = vl -- shared
@@ -4111,7 +3486,7 @@ t.colorscheme = tfmtable.colorscheme
end
end
if isvirtual then
- local vc = v.commands
+ local vc = character.commands
if vc then
-- we assume non scaled commands here
-- tricky .. we need to scale pseudo math glyphs too
@@ -4130,230 +3505,577 @@ t.colorscheme = tfmtable.colorscheme
local ivc = vc[i]
local key = ivc[1]
if key == "right" then
- tt[#tt+1] = { key, ivc[2]*hdelta }
+ tt[i] = { key, ivc[2]*hdelta }
elseif key == "down" then
- tt[#tt+1] = { key, ivc[2]*vdelta }
+ tt[i] = { key, ivc[2]*vdelta }
elseif key == "rule" then
- tt[#tt+1] = { key, ivc[2]*vdelta, ivc[3]*hdelta }
+ tt[i] = { key, ivc[2]*vdelta, ivc[3]*hdelta }
else -- not comment
- tt[#tt+1] = ivc -- shared since in cache and untouched
+ tt[i] = ivc -- shared since in cache and untouched
end
end
chr.commands = tt
else
chr.commands = vc
end
+ chr.index = nil
end
end
- tc[k] = chr
+ targetcharacters[unicode] = chr
end
- -- t.encodingbytes, t.filename, t.fullname, t.name: elsewhere
- t.size = scaledpoints
- t.factor = delta
- t.hfactor = hdelta
- t.vfactor = vdelta
- if t.fonts then
- t.fonts = table.fastcopy(t.fonts) -- maybe we virtualize more afterwards
+ return target
+end
+
+function constructors.finalize(tfmdata)
+ if tfmdata.properties and tfmdata.properties.finalized then
+ return
end
- if hasmath then
- -- mathematics.extras.copy(t) -- can be done elsewhere if needed
- local ma = tfm.mathactions
- for i=1,#ma do
- ma[i](t,tfmtable,delta,hdelta,vdelta) -- what delta?
- end
+ --
+ if not tfmdata.characters then
+ return nil
end
- -- needed for \high cum suis
- local tpx = tp.x_height
- if hasmath then
- if not tp[13] then tp[13] = .86*tpx end -- mathsupdisplay
- if not tp[14] then tp[14] = .86*tpx end -- mathsupnormal
- if not tp[15] then tp[15] = .86*tpx end -- mathsupcramped
- if not tp[16] then tp[16] = .48*tpx end -- mathsubnormal
- if not tp[17] then tp[17] = .48*tpx end -- mathsubcombined
- if not tp[22] then tp[22] = 0 end -- mathaxisheight
- if t.MathConstants then t.MathConstants.AccentBaseHeight = nil end -- safeguard
- end
- t.tounicode = 1
- t.cidinfo = tfmtable.cidinfo
- -- we have t.name=metricfile and t.fullname=RealName and t.filename=diskfilename
- -- when collapsing fonts, luatex looks as both t.name and t.fullname as ttc files
- -- can have multiple subfonts
- if hasmath then
- if trace_defining then
- logs.report("define font","math enabled for: name '%s', fullname: '%s', filename: '%s'",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename")
+ --
+ if not tfmdata.goodies then
+ tfmdata.goodies = { } -- context specific
+ end
+ --
+ local parameters = tfmdata.parameters
+ if not parameters then
+ return nil
+ end
+ --
+ if not parameters.expansion then
+ parameters.expansion = {
+ stretch = tfmdata.stretch or 0,
+ shrink = tfmdata.shrink or 0,
+ step = tfmdata.step or 0,
+ auto = tfmdata.auto_expand or false,
+ }
+ end
+ --
+ if not parameters.protrusion then
+ parameters.protrusion = {
+ auto = auto_protrude
+ }
+ end
+ --
+ if not parameters.size then
+ parameters.size = tfmdata.size
+ end
+ --
+ if not parameters.extend_factor then
+ parameters.extend_factor = tfmdata.extend or 0
+ end
+ --
+ if not parameters.slant_factor then
+ parameters.slant_factor = tfmdata.slant or 0
+ end
+ --
+ if not parameters.designsize then
+ parameters.designsize = tfmdata.designsize or 655360
+ end
+ --
+ if not parameters.units then
+ parameters.units = tfmdata.units_per_em or 1000
+ end
+ --
+ if not tfmdata.descriptions then
+ local descriptions = { } -- yes or no
+ setmetatableindex(descriptions, function(t,k) local v = { } t[k] = v return v end)
+ tfmdata.descriptions = descriptions
+ end
+ --
+ local properties = tfmdata.properties
+ if not properties then
+ properties = { }
+ tfmdata.properties = properties
+ end
+ --
+ if not properties.virtualized then
+ properties.virtualized = tfmdata.type == "virtual"
+ end
+ --
+ if not tfmdata.properties then
+ tfmdata.properties = {
+ fontname = tfmdata.fontname,
+ filename = tfmdata.filename,
+ fullname = tfmdata.fullname,
+ name = tfmdata.name,
+ psname = tfmdata.psname,
+ --
+ encodingbytes = tfmdata.encodingbytes or 1,
+ embedding = tfmdata.embedding or "subset",
+ tounicode = tfmdata.tounicode or 1,
+ cidinfo = tfmdata.cidinfo or nil,
+ format = tfmdata.format or "type1",
+ direction = tfmdata.direction or 0,
+ }
+ end
+ if not tfmdata.resources then
+ tfmdata.resources = { }
+ end
+ if not tfmdata.shared then
+ tfmdata.shared = { }
+ end
+ --
+ -- tfmdata.fonts
+ -- tfmdata.unscaled
+ --
+ if not properties.has_math then
+ properties.has_math = not tfmdata.nomath
+ end
+ --
+ tfmdata.MathConstants = nil
+ tfmdata.postprocessors = nil
+ --
+ tfmdata.fontname = nil
+ tfmdata.filename = nil
+ tfmdata.fullname = nil
+ tfmdata.name = nil -- most tricky part
+ tfmdata.psname = nil
+ --
+ tfmdata.encodingbytes = nil
+ tfmdata.embedding = nil
+ tfmdata.tounicode = nil
+ tfmdata.cidinfo = nil
+ tfmdata.format = nil
+ tfmdata.direction = nil
+ tfmdata.type = nil
+ tfmdata.nomath = nil
+ tfmdata.designsize = nil
+ --
+ tfmdata.size = nil
+ tfmdata.stretch = nil
+ tfmdata.shrink = nil
+ tfmdata.step = nil
+ tfmdata.auto_expand = nil
+ tfmdata.auto_protrude = nil
+ tfmdata.extend = nil
+ tfmdata.slant = nil
+ tfmdata.units_per_em = nil
+ --
+ properties.finalized = true
+ --
+ return tfmdata
+end
+
+--[[ldx--
+<p>A unique hash value is generated by:</p>
+--ldx]]--
+
+local hashmethods = { }
+constructors.hashmethods = hashmethods
+
+function constructors.hashfeatures(specification) -- will be overloaded
+ local features = specification.features
+ if features then
+ local t, tn = { }, 0
+ for category, list in next, features do
+ if next(list) then
+ local hasher = hashmethods[category]
+ if hasher then
+ local hash = hasher(list)
+ if hash then
+ tn = tn + 1
+ t[tn] = category .. ":" .. hash
+ end
+ end
+ end
end
- else
- if trace_defining then
- logs.report("define font","math disabled for: name '%s', fullname: '%s', filename: '%s'",t.name or "noname",t.fullname or "nofullname",t.filename or "nofilename")
+ if tn > 0 then
+ return concat(t," & ")
end
- t.nomath, t.MathConstants = true, nil
end
- if not t.psname then
- -- name used in pdf file as well as for selecting subfont in ttc/dfont
- t.psname = t.fontname or (t.fullname and fonts.names.cleanname(t.fullname))
+ return "unknown"
+end
+
+hashmethods.normal = function(list)
+ local s = { }
+ local n = 0
+ for k, v in next, list do
+ if k ~= "number" and k ~= "features" then -- I need to figure this out, features
+ n = n + 1
+ s[n] = k
+ end
end
- if trace_defining then
- logs.report("define font","used for accesing subfont: '%s'",t.psname or "nopsname")
- logs.report("define font","used for subsetting: '%s'",t.fontname or "nofontname")
+ if n > 0 then
+ sort(s)
+ for i=1,n do
+ local k = s[i]
+ s[i] = k .. '=' .. tostring(list[k])
+ end
+ return concat(s,"+")
end
---~ print(t.fontname,table.serialize(t.MathConstants))
- return t, delta
end
--[[ldx--
-<p>The reason why the scaler is split, is that for a while we experimented
-with a helper function. However, in practice the <l n='api'/> calls are too slow to
-make this profitable and the <l n='lua'/> based variant was just faster. A days
-wasted day but an experience richer.</p>
+<p>In principle we can share tfm tables when we are in node for a font, but then
+we need to define a font switch as an id/attr switch which is no fun, so in that
+case users can best use dynamic features ... so, we will not use that speedup. Okay,
+when we get rid of base mode we can optimize even further by sharing, but then we
+loose our testcases for <l n='luatex'/>.</p>
--ldx]]--
-tfm.auto_cleanup = true
+function constructors.hashinstance(specification,force)
+ local hash, size, fallbacks = specification.hash, specification.size, specification.fallbacks
+ if force or not hash then
+ hash = constructors.hashfeatures(specification)
+ specification.hash = hash
+ end
+ if size < 1000 and designsizes[hash] then
+ size = math.round(constructors.scaled(size,designsizes[hash]))
+ specification.size = size
+ end
+ -- local mathsize = specification.mathsize or 0
+ -- if mathsize > 0 then
+ -- local textsize = specification.textsize
+ -- if fallbacks then
+ -- return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ] @ ' .. fallbacks
+ -- else
+ -- return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ]'
+ -- end
+ -- else
+ if fallbacks then
+ return hash .. ' @ ' .. tostring(size) .. ' @ ' .. fallbacks
+ else
+ return hash .. ' @ ' .. tostring(size)
+ end
+ -- end
+end
-local lastfont = nil
+function constructors.setname(tfmdata,specification) -- todo: get specification from tfmdata
+ if constructors.namemode == "specification" then
+ -- not to be used in context !
+ local specname = specification.specification
+ if specname then
+ tfmdata.properties.name = specname
+ if trace_defining then
+ report_otf("overloaded fontname: '%s'",specname)
+ end
+ end
+ end
+end
--- we can get rid of the tfm instance when we have fast access to the
--- scaled character dimensions at the tex end, e.g. a fontobject.width
---
--- flushing the kern and ligature tables from memory saves a lot (only
--- base mode) but it complicates vf building where the new characters
--- demand this data .. solution: functions that access them
+function constructors.checkedfilename(data)
+ local foundfilename = data.foundfilename
+ if not foundfilename then
+ local askedfilename = data.filename or ""
+ if askedfilename ~= "" then
+ askedfilename = resolvers.resolve(askedfilename) -- no shortcut
+ foundfilename = resolvers.findbinfile(askedfilename,"") or ""
+ if foundfilename == "" then
+ report_defining("source file '%s' is not found",askedfilename)
+ foundfilename = resolvers.findbinfile(file.basename(askedfilename),"") or ""
+ if foundfilename ~= "" then
+ report_defining("using source file '%s' (cache mismatch)",foundfilename)
+ end
+ end
+ end
+ data.foundfilename = foundfilename
+ end
+ return foundfilename
+end
+
+local formats = allocate()
+fonts.formats = formats
+
+setmetatableindex(formats, function(t,k)
+ local l = lower(k)
+ if rawget(t,k) then
+ t[k] = l
+ return l
+ end
+ return rawget(t,file.extname(l))
+end)
+
+local locations = { }
-function tfm.cleanup_table(tfmdata) -- we need a cleanup callback, now we miss the last one
- if tfm.auto_cleanup then -- ok, we can hook this into everyshipout or so ... todo
- if tfmdata.type == 'virtual' or tfmdata.virtualized then
- for k, v in next, tfmdata.characters do
- if v.commands then v.commands = nil end
- -- if v.kerns then v.kerns = nil end
+local function setindeed(mode,target,group,name,action,position)
+ local t = target[mode]
+ if not t then
+ report_defining("fatal error in setting feature '%s', group '%s', mode '%s'",name or "?",group or "?",mode)
+ os.exit()
+ elseif position then
+ -- todo: remove existing
+ insert(t, position, { name = name, action = action })
+ else
+ for i=1,#t do
+ local ti = t[i]
+ if ti.name == name then
+ ti.action = action
+ return
end
- else
- -- for k, v in next, tfmdata.characters do
- -- if v.kerns then v.kerns = nil end
- -- end
end
+ insert(t, { name = name, action = action })
end
end
-function tfm.cleanup(tfmdata) -- we need a cleanup callback, now we miss the last one
+local function set(group,name,target,source)
+ target = target[group]
+ if not target then
+ report_defining("fatal target error in setting feature '%s', group '%s'",name or "?",group or "?")
+ os.exit()
+ end
+ local source = source[group]
+ if not source then
+ report_defining("fatal source error in setting feature '%s', group '%s'",name or "?",group or "?")
+ os.exit()
+ end
+ local node = source.node
+ local base = source.base
+ local position = source.position
+ if node then
+ setindeed("node",target,group,name,node,position)
+ end
+ if base then
+ setindeed("base",target,group,name,base,position)
+ end
end
-function tfm.scale(tfmtable, scaledpoints, relativeid)
- local t, factor = tfm.do_scale(tfmtable, scaledpoints, relativeid)
- t.factor = factor
- t.ascender = factor*(tfmtable.ascender or 0)
- t.descender = factor*(tfmtable.descender or 0)
- t.shared = tfmtable.shared or { }
- t.unique = table.fastcopy(tfmtable.unique or {})
---~ print("scaling", t.name, t.factor) -- , tfm.hash_features(tfmtable.specification))
- tfm.cleanup(t)
- return t
+local function register(where,specification)
+ local name = specification.name
+ if name and name ~= "" then
+ local default = specification.default
+ local description = specification.description
+ local initializers = specification.initializers
+ local processors = specification.processors
+ local manipulators = specification.manipulators
+ local modechecker = specification.modechecker
+ if default then
+ where.defaults[name] = default
+ end
+ if description and description ~= "" then
+ where.descriptions[name] = description
+ end
+ if initializers then
+ set('initializers',name,where,specification)
+ end
+ if processors then
+ set('processors', name,where,specification)
+ end
+ if manipulators then
+ set('manipulators',name,where,specification)
+ end
+ if modechecker then
+ where.modechecker = modechecker
+ end
+ end
end
---[[ldx--
-<p>Analyzers run per script and/or language and are needed in order to
-process features right.</p>
---ldx]]--
+constructors.registerfeature = register
-fonts.analyzers = fonts.analyzers or { }
-fonts.analyzers.aux = fonts.analyzers.aux or { }
-fonts.analyzers.methods = fonts.analyzers.methods or { }
-fonts.analyzers.initializers = fonts.analyzers.initializers or { }
+function constructors.getfeatureaction(what,where,mode,name)
+ what = handlers[what].features
+ if what then
+ where = what[where]
+ if where then
+ mode = where[mode]
+ if mode then
+ for i=1,#mode do
+ local m = mode[i]
+ if m.name == name then
+ return m.action
+ end
+ end
+ end
+ end
+ end
+end
--- todo: analyzers per script/lang, cross font, so we need an font id hash -> script
--- e.g. latin -> hyphenate, arab -> 1/2/3 analyze
+function constructors.newfeatures(what)
+ local features = handlers[what].features
+ if not features then
+ local tables = handlers[what].tables -- can be preloaded
+ features = allocate {
+ defaults = { },
+ descriptions = tables and tables.features or { },
+ initializers = { base = { }, node = { } },
+ processors = { base = { }, node = { } },
+ manipulators = { base = { }, node = { } },
+ }
+ features.register = function(specification) return register(features,specification) end
+ handlers[what].features = features -- will also become hidden
+ end
+ return features
+end
--- an example analyzer (should move to font-ota.lua)
+--[[ldx--
+<p>We need to check for default features. For this we provide
+a helper function.</p>
+--ldx]]--
-local state = attributes.private('state')
+function constructors.checkedfeatures(what,features)
+ local defaults = handlers[what].features.defaults
+ if features and next(features) then
+ features = fastcopy(features) -- can be inherited
+ for key, value in next, defaults do
+ if features[key] == nil then
+ features[key] = value
+ end
+ end
+ return features
+ else
+ return fastcopy(defaults) -- we can change features in place
+ end
+end
-function fonts.analyzers.aux.setstate(head,font)
- local tfmdata = fontdata[font]
- local characters = tfmdata.characters
- local descriptions = tfmdata.descriptions
- local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean
- while current do
- local id = current.id
- if id == glyph and current.font == font then
- local d = descriptions[current.char]
- if d then
- if d.class == "mark" then
- done = true
- set_attribute(current,state,5) -- mark
- elseif n == 0 then
- first, last, n = current, current, 1
- set_attribute(current,state,1) -- init
- else
- last, n = current, n+1
- set_attribute(current,state,2) -- medi
+-- before scaling
+
+function constructors.initializefeatures(what,tfmdata,features,trace,report)
+ if features and next(features) then
+ local properties = tfmdata.properties or { } -- brrr
+ local whathandler = handlers[what]
+ local whatfeatures = whathandler.features
+ local whatinitializers = whatfeatures.initializers
+ local whatmodechecker = whatfeatures.modechecker
+ -- properties.mode can be enforces (for instance in font-otd)
+ local mode = properties.mode or (whatmodechecker and whatmodechecker(tfmdata,features,features.mode)) or features.mode or "base"
+ properties.mode = mode -- also status
+ features.mode = mode -- both properties.mode or features.mode can be changed
+ --
+ local done = { }
+ while true do
+ local redo = false
+ local initializers = whatfeatures.initializers[mode]
+ if initializers then
+ for i=1,#initializers do
+ local step = initializers[i]
+ local feature = step.name
+-- we could intercept mode here .. needs a rewrite of this whole loop then btu it's cleaner that way
+ local value = features[feature]
+ if not value then
+ -- disabled
+ elseif done[feature] then
+ -- already done
+ else
+ local action = step.action
+ if trace then
+ report("initializing feature %s to %s for mode %s for font %s",feature,
+ tostring(value),mode or 'unknown', tfmdata.properties.fullname or 'unknown')
+ end
+ action(tfmdata,value,features) -- can set mode (e.g. goodies) so it can trigger a restart
+ if mode ~= properties.mode or mode ~= features.mode then
+ if whatmodechecker then
+ properties.mode = whatmodechecker(tfmdata,features,properties.mode) -- force checking
+ features.mode = properties.mode
+ end
+ if mode ~= properties.mode then
+ mode = properties.mode
+ redo = true
+ end
+ end
+ done[feature] = true
+ end
+ if redo then
+ break
+ end
end
- else -- finish
- if first and first == last then
- set_attribute(last,state,4) -- isol
- elseif last then
- set_attribute(last,state,3) -- fina
+ if not redo then
+ break
end
- first, last, n = nil, nil, 0
- end
- elseif id == disc then
- -- always in the middle
- set_attribute(current,state,2) -- midi
- last = current
- else -- finish
- if first and first == last then
- set_attribute(last,state,4) -- isol
- elseif last then
- set_attribute(last,state,3) -- fina
+ else
+ break
end
- first, last, n = nil, nil, 0
end
- current = current.next
- end
- if first and first == last then
- set_attribute(last,state,4) -- isol
- elseif last then
- set_attribute(last,state,3) -- fina
+ properties.mode = mode -- to be sure
+ return true
+ else
+ return false
end
- return head, done
end
-function tfm.replacements(tfm,value)
- -- tfm.characters[0x0022] = table.fastcopy(tfm.characters[0x201D])
- -- tfm.characters[0x0027] = table.fastcopy(tfm.characters[0x2019])
- -- tfm.characters[0x0060] = table.fastcopy(tfm.characters[0x2018])
- -- tfm.characters[0x0022] = tfm.characters[0x201D]
- tfm.characters[0x0027] = tfm.characters[0x2019]
- -- tfm.characters[0x0060] = tfm.characters[0x2018]
+-- while typesetting
+
+function constructors.collectprocessors(what,tfmdata,features,trace,report)
+ local processes, nofprocesses = { }, 0
+ if features and next(features) then
+ local properties = tfmdata.properties
+ local whathandler = handlers[what]
+ local whatfeatures = whathandler.features
+ local whatprocessors = whatfeatures.processors
+ local processors = whatprocessors[properties.mode]
+ if processors then
+ for i=1,#processors do
+ local step = processors[i]
+ local feature = step.name
+ if features[feature] then
+ local action = step.action
+ if trace then
+ report("installing feature processor %s for mode %s for font %s",feature,
+ mode or 'unknown', tfmdata.properties.fullname or 'unknown')
+ end
+ if action then
+ nofprocesses = nofprocesses + 1
+ processes[nofprocesses] = action
+ end
+ end
+ end
+ end
+ end
+ return processes
end
--- checking
+-- after scaling
-function tfm.checked_filename(metadata,whatever)
- local foundfilename = metadata.foundfilename
- if not foundfilename then
- local askedfilename = metadata.filename or ""
- if askedfilename ~= "" then
- foundfilename = resolvers.findbinfile(askedfilename,"") or ""
- if foundfilename == "" then
- logs.report("fonts","source file '%s' is not found",askedfilename)
- foundfilename = resolvers.findbinfile(file.basename(askedfilename),"") or ""
- if foundfilename ~= "" then
- logs.report("fonts","using source file '%s' (cache mismatch)",foundfilename)
+function constructors.applymanipulators(what,tfmdata,features,trace,report)
+ if features and next(features) then
+ local properties = tfmdata.properties
+ local whathandler = handlers[what]
+ local whatfeatures = whathandler.features
+ local whatmanipulators = whatfeatures.manipulators
+ local manipulators = whatmanipulators[properties.mode]
+ if manipulators then
+ for i=1,#manipulators do
+ local step = manipulators[i]
+ local feature = step.name
+ local value = features[feature]
+ if value then
+ local action = step.action
+ if trace then
+ report("applying feature manipulator %s for mode %s for font %s",feature,
+ mode or 'unknown', tfmdata.properties.fullname or 'unknown')
+ end
+ if action then
+ action(tfmdata,feature,value)
+ end
end
end
- elseif whatever then
- logs.report("fonts","no source file for '%s'",whatever)
- foundfilename = ""
end
- metadata.foundfilename = foundfilename
- -- logs.report("fonts","using source file '%s'",foundfilename)
end
- return foundfilename
end
--- status info
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['luatex-font-enc'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+local fonts = fonts
+fonts.encodings = { }
+fonts.encodings.agl = { }
+
+setmetatable(fonts.encodings.agl, { __index = function(t,k)
+ if k == "unicodes" then
+ texio.write(" <loading (extended) adobe glyph list>")
+ local unicodes = dofile(resolvers.findfile("font-agl.lua"))
+ fonts.encodings.agl = { unicodes = unicodes }
+ return unicodes
+ else
+ return nil
+ end
+end })
-statistics.register("fonts load time", function()
- return statistics.elapsedseconds(fonts)
-end)
end -- closure
@@ -4369,15 +4091,19 @@ if not modules then modules = { } end modules ['font-cid'] = {
local format, match, lower = string.format, string.match, string.lower
local tonumber = tonumber
-local lpegmatch = lpeg.match
+local P, S, R, C, V, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.V, lpeg.match
-local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
+local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
-fonts = fonts or { }
-fonts.cid = fonts.cid or { }
-fonts.cid.map = fonts.cid.map or { }
-fonts.cid.max = fonts.cid.max or 10
+local report_otf = logs.reporter("fonts","otf loading")
+local fonts = fonts
+
+local cid = { }
+fonts.cid = cid
+
+local cidmap = { }
+local cidmax = 10
-- original string parser: 0.109, lpeg parser: 0.036 seconds for Adobe-CNS1-4.cidmap
--
@@ -4386,14 +4112,14 @@ fonts.cid.max = fonts.cid.max or 10
-- 1..95 0020
-- 99 3000
-local number = lpeg.C(lpeg.R("09","af","AF")^1)
-local space = lpeg.S(" \n\r\t")
+local number = C(R("09","af","AF")^1)
+local space = S(" \n\r\t")
local spaces = space^0
-local period = lpeg.P(".")
+local period = P(".")
local periods = period * period
-local name = lpeg.P("/") * lpeg.C((1-space)^1)
+local name = P("/") * C((1-space)^1)
-local unicodes, names = { }, { }
+local unicodes, names = { }, { } -- we could use Carg now
local function do_one(a,b)
unicodes[tonumber(a)] = tonumber(b,16)
@@ -4411,15 +4137,15 @@ local function do_name(a,b)
names[tonumber(a)] = b
end
-local grammar = lpeg.P { "start",
- start = number * spaces * number * lpeg.V("series"),
- series = (spaces * (lpeg.V("one") + lpeg.V("range") + lpeg.V("named")) )^1,
+local grammar = P { "start",
+ start = number * spaces * number * V("series"),
+ series = (spaces * (V("one") + V("range") + V("named")))^1,
one = (number * spaces * number) / do_one,
range = (number * periods * number * spaces * number) / do_range,
named = (number * spaces * name) / do_name
}
-function fonts.cid.load(filename)
+local function loadcidfile(filename)
local data = io.loaddata(filename)
if data then
unicodes, names = { }, { }
@@ -4433,1045 +4159,98 @@ function fonts.cid.load(filename)
unicodes = unicodes,
names = names
}
- else
- return nil
end
end
-local template = "%s-%s-%s.cidmap"
+cid.loadfile = loadcidfile -- we use the frozen variant
+local template = "%s-%s-%s.cidmap"
local function locate(registry,ordering,supplement)
local filename = format(template,registry,ordering,supplement)
local hashname = lower(filename)
- local cidmap = fonts.cid.map[hashname]
- if not cidmap then
+ local found = cidmap[hashname]
+ if not found then
if trace_loading then
- logs.report("load otf","checking cidmap, registry: %s, ordering: %s, supplement: %s, filename: %s",registry,ordering,supplement,filename)
+ report_otf("checking cidmap, registry: %s, ordering: %s, supplement: %s, filename: %s",registry,ordering,supplement,filename)
end
- local fullname = resolvers.find_file(filename,'cid') or ""
+ local fullname = resolvers.findfile(filename,'cid') or ""
if fullname ~= "" then
- cidmap = fonts.cid.load(fullname)
- if cidmap then
+ found = loadcidfile(fullname)
+ if found then
if trace_loading then
- logs.report("load otf","using cidmap file %s",filename)
+ report_otf("using cidmap file %s",filename)
end
- fonts.cid.map[hashname] = cidmap
- cidmap.usedname = file.basename(filename)
- return cidmap
+ cidmap[hashname] = found
+ found.usedname = file.basename(filename)
end
end
end
- return cidmap
+ return found
end
-function fonts.cid.getmap(registry,ordering,supplement)
- -- cf Arthur R. we can safely scan upwards since cids are downward compatible
- local supplement = tonumber(supplement)
+-- cf Arthur R. we can safely scan upwards since cids are downward compatible
+
+function cid.getmap(specification)
+ if not specification then
+ report_otf("invalid cidinfo specification (table expected)")
+ return
+ end
+ 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)]
+ if found then
+ return found
+ end
if trace_loading then
- logs.report("load otf","needed cidmap, registry: %s, ordering: %s, supplement: %s",registry,ordering,supplement)
+ report_otf("needed cidmap, registry: %s, ordering: %s, supplement: %s",registry,ordering,supplement)
end
- local cidmap = locate(registry,ordering,supplement)
- if not cidmap then
+ found = locate(registry,ordering,supplement)
+ if not found then
+ local supnum = tonumber(supplement)
local cidnum = nil
-- next highest (alternatively we could start high)
- if supplement < fonts.cid.max then
- for supplement=supplement+1,fonts.cid.max do
- local c = locate(registry,ordering,supplement)
+ if supnum < cidmax then
+ for s=supnum+1,cidmax do
+ local c = locate(registry,ordering,s)
if c then
- cidmap, cidnum = c, supplement
+ found, cidnum = c, s
break
end
end
end
-- next lowest (least worse fit)
- if not cidmap and supplement > 0 then
- for supplement=supplement-1,0,-1 do
- local c = locate(registry,ordering,supplement)
+ if not found and supnum > 0 then
+ for s=supnum-1,0,-1 do
+ local c = locate(registry,ordering,s)
if c then
- cidmap, cidnum = c, supplement
+ found, cidnum = c, s
break
end
end
end
- -- prevent further lookups
- if cidmap and cidnum > 0 then
+ -- prevent further lookups -- somewhat tricky
+ registry = lower(registry)
+ ordering = lower(ordering)
+ if found and cidnum > 0 then
for s=0,cidnum-1 do
- filename = format(template,registry,ordering,s)
- if not fonts.cid.map[filename] then
- fonts.cid.map[filename] = cidmap -- copy of ref
+ local filename = format(template,registry,ordering,s)
+ if not cidmap[filename] then
+ cidmap[filename] = found
end
end
end
end
- return cidmap
+ return found
end
end -- closure
do -- begin closure to overcome local limits and interference
-if not modules then modules = { } end modules ['font-otf'] = {
- version = 1.001,
- comment = "companion to font-otf.lua (tables)",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
-local type, next, tonumber, tostring = type, next, tonumber, tostring
-local gsub, lower = string.gsub, string.lower
-
-fonts = fonts or { }
-fonts.otf = fonts.otf or { }
-
-local otf = fonts.otf
-
-otf.tables = otf.tables or { }
-otf.meanings = otf.meanings or { }
-
-otf.tables.scripts = {
- ['dflt'] = 'Default',
-
- ['arab'] = 'Arabic',
- ['armn'] = 'Armenian',
- ['bali'] = 'Balinese',
- ['beng'] = 'Bengali',
- ['bopo'] = 'Bopomofo',
- ['brai'] = 'Braille',
- ['bugi'] = 'Buginese',
- ['buhd'] = 'Buhid',
- ['byzm'] = 'Byzantine Music',
- ['cans'] = 'Canadian Syllabics',
- ['cher'] = 'Cherokee',
- ['copt'] = 'Coptic',
- ['cprt'] = 'Cypriot Syllabary',
- ['cyrl'] = 'Cyrillic',
- ['deva'] = 'Devanagari',
- ['dsrt'] = 'Deseret',
- ['ethi'] = 'Ethiopic',
- ['geor'] = 'Georgian',
- ['glag'] = 'Glagolitic',
- ['goth'] = 'Gothic',
- ['grek'] = 'Greek',
- ['gujr'] = 'Gujarati',
- ['guru'] = 'Gurmukhi',
- ['hang'] = 'Hangul',
- ['hani'] = 'CJK Ideographic',
- ['hano'] = 'Hanunoo',
- ['hebr'] = 'Hebrew',
- ['ital'] = 'Old Italic',
- ['jamo'] = 'Hangul Jamo',
- ['java'] = 'Javanese',
- ['kana'] = 'Hiragana and Katakana',
- ['khar'] = 'Kharosthi',
- ['khmr'] = 'Khmer',
- ['knda'] = 'Kannada',
- ['lao' ] = 'Lao',
- ['latn'] = 'Latin',
- ['limb'] = 'Limbu',
- ['linb'] = 'Linear B',
- ['math'] = 'Mathematical Alphanumeric Symbols',
- ['mlym'] = 'Malayalam',
- ['mong'] = 'Mongolian',
- ['musc'] = 'Musical Symbols',
- ['mymr'] = 'Myanmar',
- ['nko' ] = "N'ko",
- ['ogam'] = 'Ogham',
- ['orya'] = 'Oriya',
- ['osma'] = 'Osmanya',
- ['phag'] = 'Phags-pa',
- ['phnx'] = 'Phoenician',
- ['runr'] = 'Runic',
- ['shaw'] = 'Shavian',
- ['sinh'] = 'Sinhala',
- ['sylo'] = 'Syloti Nagri',
- ['syrc'] = 'Syriac',
- ['tagb'] = 'Tagbanwa',
- ['tale'] = 'Tai Le',
- ['talu'] = 'Tai Lu',
- ['taml'] = 'Tamil',
- ['telu'] = 'Telugu',
- ['tfng'] = 'Tifinagh',
- ['tglg'] = 'Tagalog',
- ['thaa'] = 'Thaana',
- ['thai'] = 'Thai',
- ['tibt'] = 'Tibetan',
- ['ugar'] = 'Ugaritic Cuneiform',
- ['xpeo'] = 'Old Persian Cuneiform',
- ['xsux'] = 'Sumero-Akkadian Cuneiform',
- ['yi' ] = 'Yi',
-}
-
-otf.tables.languages = {
- ['dflt'] = 'Default',
-
- ['aba'] = 'Abaza',
- ['abk'] = 'Abkhazian',
- ['ady'] = 'Adyghe',
- ['afk'] = 'Afrikaans',
- ['afr'] = 'Afar',
- ['agw'] = 'Agaw',
- ['als'] = 'Alsatian',
- ['alt'] = 'Altai',
- ['amh'] = 'Amharic',
- ['ara'] = 'Arabic',
- ['ari'] = 'Aari',
- ['ark'] = 'Arakanese',
- ['asm'] = 'Assamese',
- ['ath'] = 'Athapaskan',
- ['avr'] = 'Avar',
- ['awa'] = 'Awadhi',
- ['aym'] = 'Aymara',
- ['aze'] = 'Azeri',
- ['bad'] = 'Badaga',
- ['bag'] = 'Baghelkhandi',
- ['bal'] = 'Balkar',
- ['bau'] = 'Baule',
- ['bbr'] = 'Berber',
- ['bch'] = 'Bench',
- ['bcr'] = 'Bible Cree',
- ['bel'] = 'Belarussian',
- ['bem'] = 'Bemba',
- ['ben'] = 'Bengali',
- ['bgr'] = 'Bulgarian',
- ['bhi'] = 'Bhili',
- ['bho'] = 'Bhojpuri',
- ['bik'] = 'Bikol',
- ['bil'] = 'Bilen',
- ['bkf'] = 'Blackfoot',
- ['bli'] = 'Balochi',
- ['bln'] = 'Balante',
- ['blt'] = 'Balti',
- ['bmb'] = 'Bambara',
- ['bml'] = 'Bamileke',
- ['bos'] = 'Bosnian',
- ['bre'] = 'Breton',
- ['brh'] = 'Brahui',
- ['bri'] = 'Braj Bhasha',
- ['brm'] = 'Burmese',
- ['bsh'] = 'Bashkir',
- ['bti'] = 'Beti',
- ['cat'] = 'Catalan',
- ['ceb'] = 'Cebuano',
- ['che'] = 'Chechen',
- ['chg'] = 'Chaha Gurage',
- ['chh'] = 'Chattisgarhi',
- ['chi'] = 'Chichewa',
- ['chk'] = 'Chukchi',
- ['chp'] = 'Chipewyan',
- ['chr'] = 'Cherokee',
- ['chu'] = 'Chuvash',
- ['cmr'] = 'Comorian',
- ['cop'] = 'Coptic',
- ['cos'] = 'Corsican',
- ['cre'] = 'Cree',
- ['crr'] = 'Carrier',
- ['crt'] = 'Crimean Tatar',
- ['csl'] = 'Church Slavonic',
- ['csy'] = 'Czech',
- ['dan'] = 'Danish',
- ['dar'] = 'Dargwa',
- ['dcr'] = 'Woods Cree',
- ['deu'] = 'German',
- ['dgr'] = 'Dogri',
- ['div'] = 'Divehi',
- ['djr'] = 'Djerma',
- ['dng'] = 'Dangme',
- ['dnk'] = 'Dinka',
- ['dri'] = 'Dari',
- ['dun'] = 'Dungan',
- ['dzn'] = 'Dzongkha',
- ['ebi'] = 'Ebira',
- ['ecr'] = 'Eastern Cree',
- ['edo'] = 'Edo',
- ['efi'] = 'Efik',
- ['ell'] = 'Greek',
- ['eng'] = 'English',
- ['erz'] = 'Erzya',
- ['esp'] = 'Spanish',
- ['eti'] = 'Estonian',
- ['euq'] = 'Basque',
- ['evk'] = 'Evenki',
- ['evn'] = 'Even',
- ['ewe'] = 'Ewe',
- ['fan'] = 'French Antillean',
- ['far'] = 'Farsi',
- ['fin'] = 'Finnish',
- ['fji'] = 'Fijian',
- ['fle'] = 'Flemish',
- ['fne'] = 'Forest Nenets',
- ['fon'] = 'Fon',
- ['fos'] = 'Faroese',
- ['fra'] = 'French',
- ['fri'] = 'Frisian',
- ['frl'] = 'Friulian',
- ['fta'] = 'Futa',
- ['ful'] = 'Fulani',
- ['gad'] = 'Ga',
- ['gae'] = 'Gaelic',
- ['gag'] = 'Gagauz',
- ['gal'] = 'Galician',
- ['gar'] = 'Garshuni',
- ['gaw'] = 'Garhwali',
- ['gez'] = "Ge'ez",
- ['gil'] = 'Gilyak',
- ['gmz'] = 'Gumuz',
- ['gon'] = 'Gondi',
- ['grn'] = 'Greenlandic',
- ['gro'] = 'Garo',
- ['gua'] = 'Guarani',
- ['guj'] = 'Gujarati',
- ['hai'] = 'Haitian',
- ['hal'] = 'Halam',
- ['har'] = 'Harauti',
- ['hau'] = 'Hausa',
- ['haw'] = 'Hawaiin',
- ['hbn'] = 'Hammer-Banna',
- ['hil'] = 'Hiligaynon',
- ['hin'] = 'Hindi',
- ['hma'] = 'High Mari',
- ['hnd'] = 'Hindko',
- ['ho'] = 'Ho',
- ['hri'] = 'Harari',
- ['hrv'] = 'Croatian',
- ['hun'] = 'Hungarian',
- ['hye'] = 'Armenian',
- ['ibo'] = 'Igbo',
- ['ijo'] = 'Ijo',
- ['ilo'] = 'Ilokano',
- ['ind'] = 'Indonesian',
- ['ing'] = 'Ingush',
- ['inu'] = 'Inuktitut',
- ['iri'] = 'Irish',
- ['irt'] = 'Irish Traditional',
- ['isl'] = 'Icelandic',
- ['ism'] = 'Inari Sami',
- ['ita'] = 'Italian',
- ['iwr'] = 'Hebrew',
- ['jan'] = 'Japanese',
- ['jav'] = 'Javanese',
- ['jii'] = 'Yiddish',
- ['jud'] = 'Judezmo',
- ['jul'] = 'Jula',
- ['kab'] = 'Kabardian',
- ['kac'] = 'Kachchi',
- ['kal'] = 'Kalenjin',
- ['kan'] = 'Kannada',
- ['kar'] = 'Karachay',
- ['kat'] = 'Georgian',
- ['kaz'] = 'Kazakh',
- ['keb'] = 'Kebena',
- ['kge'] = 'Khutsuri Georgian',
- ['kha'] = 'Khakass',
- ['khk'] = 'Khanty-Kazim',
- ['khm'] = 'Khmer',
- ['khs'] = 'Khanty-Shurishkar',
- ['khv'] = 'Khanty-Vakhi',
- ['khw'] = 'Khowar',
- ['kik'] = 'Kikuyu',
- ['kir'] = 'Kirghiz',
- ['kis'] = 'Kisii',
- ['kkn'] = 'Kokni',
- ['klm'] = 'Kalmyk',
- ['kmb'] = 'Kamba',
- ['kmn'] = 'Kumaoni',
- ['kmo'] = 'Komo',
- ['kms'] = 'Komso',
- ['knr'] = 'Kanuri',
- ['kod'] = 'Kodagu',
- ['koh'] = 'Korean Old Hangul',
- ['kok'] = 'Konkani',
- ['kon'] = 'Kikongo',
- ['kop'] = 'Komi-Permyak',
- ['kor'] = 'Korean',
- ['koz'] = 'Komi-Zyrian',
- ['kpl'] = 'Kpelle',
- ['kri'] = 'Krio',
- ['krk'] = 'Karakalpak',
- ['krl'] = 'Karelian',
- ['krm'] = 'Karaim',
- ['krn'] = 'Karen',
- ['krt'] = 'Koorete',
- ['ksh'] = 'Kashmiri',
- ['ksi'] = 'Khasi',
- ['ksm'] = 'Kildin Sami',
- ['kui'] = 'Kui',
- ['kul'] = 'Kulvi',
- ['kum'] = 'Kumyk',
- ['kur'] = 'Kurdish',
- ['kuu'] = 'Kurukh',
- ['kuy'] = 'Kuy',
- ['kyk'] = 'Koryak',
- ['lad'] = 'Ladin',
- ['lah'] = 'Lahuli',
- ['lak'] = 'Lak',
- ['lam'] = 'Lambani',
- ['lao'] = 'Lao',
- ['lat'] = 'Latin',
- ['laz'] = 'Laz',
- ['lcr'] = 'L-Cree',
- ['ldk'] = 'Ladakhi',
- ['lez'] = 'Lezgi',
- ['lin'] = 'Lingala',
- ['lma'] = 'Low Mari',
- ['lmb'] = 'Limbu',
- ['lmw'] = 'Lomwe',
- ['lsb'] = 'Lower Sorbian',
- ['lsm'] = 'Lule Sami',
- ['lth'] = 'Lithuanian',
- ['ltz'] = 'Luxembourgish',
- ['lub'] = 'Luba',
- ['lug'] = 'Luganda',
- ['luh'] = 'Luhya',
- ['luo'] = 'Luo',
- ['lvi'] = 'Latvian',
- ['maj'] = 'Majang',
- ['mak'] = 'Makua',
- ['mal'] = 'Malayalam Traditional',
- ['man'] = 'Mansi',
- ['map'] = 'Mapudungun',
- ['mar'] = 'Marathi',
- ['maw'] = 'Marwari',
- ['mbn'] = 'Mbundu',
- ['mch'] = 'Manchu',
- ['mcr'] = 'Moose Cree',
- ['mde'] = 'Mende',
- ['men'] = "Me'en",
- ['miz'] = 'Mizo',
- ['mkd'] = 'Macedonian',
- ['mle'] = 'Male',
- ['mlg'] = 'Malagasy',
- ['mln'] = 'Malinke',
- ['mlr'] = 'Malayalam Reformed',
- ['mly'] = 'Malay',
- ['mnd'] = 'Mandinka',
- ['mng'] = 'Mongolian',
- ['mni'] = 'Manipuri',
- ['mnk'] = 'Maninka',
- ['mnx'] = 'Manx Gaelic',
- ['moh'] = 'Mohawk',
- ['mok'] = 'Moksha',
- ['mol'] = 'Moldavian',
- ['mon'] = 'Mon',
- ['mor'] = 'Moroccan',
- ['mri'] = 'Maori',
- ['mth'] = 'Maithili',
- ['mts'] = 'Maltese',
- ['mun'] = 'Mundari',
- ['nag'] = 'Naga-Assamese',
- ['nan'] = 'Nanai',
- ['nas'] = 'Naskapi',
- ['ncr'] = 'N-Cree',
- ['ndb'] = 'Ndebele',
- ['ndg'] = 'Ndonga',
- ['nep'] = 'Nepali',
- ['new'] = 'Newari',
- ['ngr'] = 'Nagari',
- ['nhc'] = 'Norway House Cree',
- ['nis'] = 'Nisi',
- ['niu'] = 'Niuean',
- ['nkl'] = 'Nkole',
- ['nko'] = "N'ko",
- ['nld'] = 'Dutch',
- ['nog'] = 'Nogai',
- ['nor'] = 'Norwegian',
- ['nsm'] = 'Northern Sami',
- ['nta'] = 'Northern Tai',
- ['nto'] = 'Esperanto',
- ['nyn'] = 'Nynorsk',
- ['oci'] = 'Occitan',
- ['ocr'] = 'Oji-Cree',
- ['ojb'] = 'Ojibway',
- ['ori'] = 'Oriya',
- ['oro'] = 'Oromo',
- ['oss'] = 'Ossetian',
- ['paa'] = 'Palestinian Aramaic',
- ['pal'] = 'Pali',
- ['pan'] = 'Punjabi',
- ['pap'] = 'Palpa',
- ['pas'] = 'Pashto',
- ['pgr'] = 'Polytonic Greek',
- ['pil'] = 'Pilipino',
- ['plg'] = 'Palaung',
- ['plk'] = 'Polish',
- ['pro'] = 'Provencal',
- ['ptg'] = 'Portuguese',
- ['qin'] = 'Chin',
- ['raj'] = 'Rajasthani',
- ['rbu'] = 'Russian Buriat',
- ['rcr'] = 'R-Cree',
- ['ria'] = 'Riang',
- ['rms'] = 'Rhaeto-Romanic',
- ['rom'] = 'Romanian',
- ['roy'] = 'Romany',
- ['rsy'] = 'Rusyn',
- ['rua'] = 'Ruanda',
- ['rus'] = 'Russian',
- ['sad'] = 'Sadri',
- ['san'] = 'Sanskrit',
- ['sat'] = 'Santali',
- ['say'] = 'Sayisi',
- ['sek'] = 'Sekota',
- ['sel'] = 'Selkup',
- ['sgo'] = 'Sango',
- ['shn'] = 'Shan',
- ['sib'] = 'Sibe',
- ['sid'] = 'Sidamo',
- ['sig'] = 'Silte Gurage',
- ['sks'] = 'Skolt Sami',
- ['sky'] = 'Slovak',
- ['sla'] = 'Slavey',
- ['slv'] = 'Slovenian',
- ['sml'] = 'Somali',
- ['smo'] = 'Samoan',
- ['sna'] = 'Sena',
- ['snd'] = 'Sindhi',
- ['snh'] = 'Sinhalese',
- ['snk'] = 'Soninke',
- ['sog'] = 'Sodo Gurage',
- ['sot'] = 'Sotho',
- ['sqi'] = 'Albanian',
- ['srb'] = 'Serbian',
- ['srk'] = 'Saraiki',
- ['srr'] = 'Serer',
- ['ssl'] = 'South Slavey',
- ['ssm'] = 'Southern Sami',
- ['sur'] = 'Suri',
- ['sva'] = 'Svan',
- ['sve'] = 'Swedish',
- ['swa'] = 'Swadaya Aramaic',
- ['swk'] = 'Swahili',
- ['swz'] = 'Swazi',
- ['sxt'] = 'Sutu',
- ['syr'] = 'Syriac',
- ['tab'] = 'Tabasaran',
- ['taj'] = 'Tajiki',
- ['tam'] = 'Tamil',
- ['tat'] = 'Tatar',
- ['tcr'] = 'TH-Cree',
- ['tel'] = 'Telugu',
- ['tgn'] = 'Tongan',
- ['tgr'] = 'Tigre',
- ['tgy'] = 'Tigrinya',
- ['tha'] = 'Thai',
- ['tht'] = 'Tahitian',
- ['tib'] = 'Tibetan',
- ['tkm'] = 'Turkmen',
- ['tmn'] = 'Temne',
- ['tna'] = 'Tswana',
- ['tne'] = 'Tundra Nenets',
- ['tng'] = 'Tonga',
- ['tod'] = 'Todo',
- ['trk'] = 'Turkish',
- ['tsg'] = 'Tsonga',
- ['tua'] = 'Turoyo Aramaic',
- ['tul'] = 'Tulu',
- ['tuv'] = 'Tuvin',
- ['twi'] = 'Twi',
- ['udm'] = 'Udmurt',
- ['ukr'] = 'Ukrainian',
- ['urd'] = 'Urdu',
- ['usb'] = 'Upper Sorbian',
- ['uyg'] = 'Uyghur',
- ['uzb'] = 'Uzbek',
- ['ven'] = 'Venda',
- ['vit'] = 'Vietnamese',
- ['wa' ] = 'Wa',
- ['wag'] = 'Wagdi',
- ['wcr'] = 'West-Cree',
- ['wel'] = 'Welsh',
- ['wlf'] = 'Wolof',
- ['xbd'] = 'Tai Lue',
- ['xhs'] = 'Xhosa',
- ['yak'] = 'Yakut',
- ['yba'] = 'Yoruba',
- ['ycr'] = 'Y-Cree',
- ['yic'] = 'Yi Classic',
- ['yim'] = 'Yi Modern',
- ['zhh'] = 'Chinese Hong Kong',
- ['zhp'] = 'Chinese Phonetic',
- ['zhs'] = 'Chinese Simplified',
- ['zht'] = 'Chinese Traditional',
- ['znd'] = 'Zande',
- ['zul'] = 'Zulu'
-}
-
-otf.tables.features = {
- ['aalt'] = 'Access All Alternates',
- ['abvf'] = 'Above-Base Forms',
- ['abvm'] = 'Above-Base Mark Positioning',
- ['abvs'] = 'Above-Base Substitutions',
- ['afrc'] = 'Alternative Fractions',
- ['akhn'] = 'Akhands',
- ['blwf'] = 'Below-Base Forms',
- ['blwm'] = 'Below-Base Mark Positioning',
- ['blws'] = 'Below-Base Substitutions',
- ['c2pc'] = 'Petite Capitals From Capitals',
- ['c2sc'] = 'Small Capitals From Capitals',
- ['calt'] = 'Contextual Alternates',
- ['case'] = 'Case-Sensitive Forms',
- ['ccmp'] = 'Glyph Composition/Decomposition',
- ['cjct'] = 'Conjunct Forms',
- ['clig'] = 'Contextual Ligatures',
- ['cpsp'] = 'Capital Spacing',
- ['cswh'] = 'Contextual Swash',
- ['curs'] = 'Cursive Positioning',
- ['dflt'] = 'Default Processing',
- ['dist'] = 'Distances',
- ['dlig'] = 'Discretionary Ligatures',
- ['dnom'] = 'Denominators',
- ['dtls'] = 'Dotless Forms', -- math
- ['expt'] = 'Expert Forms',
- ['falt'] = 'Final glyph Alternates',
- ['fin2'] = 'Terminal Forms #2',
- ['fin3'] = 'Terminal Forms #3',
- ['fina'] = 'Terminal Forms',
- ['flac'] = 'Flattened Accents Over Capitals', -- math
- ['frac'] = 'Fractions',
- ['fwid'] = 'Full Width',
- ['half'] = 'Half Forms',
- ['haln'] = 'Halant Forms',
- ['halt'] = 'Alternate Half Width',
- ['hist'] = 'Historical Forms',
- ['hkna'] = 'Horizontal Kana Alternates',
- ['hlig'] = 'Historical Ligatures',
- ['hngl'] = 'Hangul',
- ['hojo'] = 'Hojo Kanji Forms',
- ['hwid'] = 'Half Width',
- ['init'] = 'Initial Forms',
- ['isol'] = 'Isolated Forms',
- ['ital'] = 'Italics',
- ['jalt'] = 'Justification Alternatives',
- ['jp04'] = 'JIS2004 Forms',
- ['jp78'] = 'JIS78 Forms',
- ['jp83'] = 'JIS83 Forms',
- ['jp90'] = 'JIS90 Forms',
- ['kern'] = 'Kerning',
- ['lfbd'] = 'Left Bounds',
- ['liga'] = 'Standard Ligatures',
- ['ljmo'] = 'Leading Jamo Forms',
- ['lnum'] = 'Lining Figures',
- ['locl'] = 'Localized Forms',
- ['mark'] = 'Mark Positioning',
- ['med2'] = 'Medial Forms #2',
- ['medi'] = 'Medial Forms',
- ['mgrk'] = 'Mathematical Greek',
- ['mkmk'] = 'Mark to Mark Positioning',
- ['mset'] = 'Mark Positioning via Substitution',
- ['nalt'] = 'Alternate Annotation Forms',
- ['nlck'] = 'NLC Kanji Forms',
- ['nukt'] = 'Nukta Forms',
- ['numr'] = 'Numerators',
- ['onum'] = 'Old Style Figures',
- ['opbd'] = 'Optical Bounds',
- ['ordn'] = 'Ordinals',
- ['ornm'] = 'Ornaments',
- ['palt'] = 'Proportional Alternate Width',
- ['pcap'] = 'Petite Capitals',
- ['pnum'] = 'Proportional Figures',
- ['pref'] = 'Pre-base Forms',
- ['pres'] = 'Pre-base Substitutions',
- ['pstf'] = 'Post-base Forms',
- ['psts'] = 'Post-base Substitutions',
- ['pwid'] = 'Proportional Widths',
- ['qwid'] = 'Quarter Widths',
- ['rand'] = 'Randomize',
- ['rkrf'] = 'Rakar Forms',
- ['rlig'] = 'Required Ligatures',
- ['rphf'] = 'Reph Form',
- ['rtbd'] = 'Right Bounds',
- ['rtla'] = 'Right-To-Left Alternates',
- ['rtlm'] = 'Right To Left Math', -- math
- ['ruby'] = 'Ruby Notation Forms',
- ['salt'] = 'Stylistic Alternates',
- ['sinf'] = 'Scientific Inferiors',
- ['size'] = 'Optical Size',
- ['smcp'] = 'Small Capitals',
- ['smpl'] = 'Simplified Forms',
- ['ss01'] = 'Stylistic Set 1',
- ['ss02'] = 'Stylistic Set 2',
- ['ss03'] = 'Stylistic Set 3',
- ['ss04'] = 'Stylistic Set 4',
- ['ss05'] = 'Stylistic Set 5',
- ['ss06'] = 'Stylistic Set 6',
- ['ss07'] = 'Stylistic Set 7',
- ['ss08'] = 'Stylistic Set 8',
- ['ss09'] = 'Stylistic Set 9',
- ['ss10'] = 'Stylistic Set 10',
- ['ss11'] = 'Stylistic Set 11',
- ['ss12'] = 'Stylistic Set 12',
- ['ss13'] = 'Stylistic Set 13',
- ['ss14'] = 'Stylistic Set 14',
- ['ss15'] = 'Stylistic Set 15',
- ['ss16'] = 'Stylistic Set 16',
- ['ss17'] = 'Stylistic Set 17',
- ['ss18'] = 'Stylistic Set 18',
- ['ss19'] = 'Stylistic Set 19',
- ['ss20'] = 'Stylistic Set 20',
- ['ssty'] = 'Script Style', -- math
- ['subs'] = 'Subscript',
- ['sups'] = 'Superscript',
- ['swsh'] = 'Swash',
- ['titl'] = 'Titling',
- ['tjmo'] = 'Trailing Jamo Forms',
- ['tnam'] = 'Traditional Name Forms',
- ['tnum'] = 'Tabular Figures',
- ['trad'] = 'Traditional Forms',
- ['twid'] = 'Third Widths',
- ['unic'] = 'Unicase',
- ['valt'] = 'Alternate Vertical Metrics',
- ['vatu'] = 'Vattu Variants',
- ['vert'] = 'Vertical Writing',
- ['vhal'] = 'Alternate Vertical Half Metrics',
- ['vjmo'] = 'Vowel Jamo Forms',
- ['vkna'] = 'Vertical Kana Alternates',
- ['vkrn'] = 'Vertical Kerning',
- ['vpal'] = 'Proportional Alternate Vertical Metrics',
- ['vrt2'] = 'Vertical Rotation',
- ['zero'] = 'Slashed Zero',
-
- ['trep'] = 'Traditional TeX Replacements',
- ['tlig'] = 'Traditional TeX Ligatures',
-}
-
-otf.tables.baselines = {
- ['hang'] = 'Hanging baseline',
- ['icfb'] = 'Ideographic character face bottom edge baseline',
- ['icft'] = 'Ideographic character face tope edige baseline',
- ['ideo'] = 'Ideographic em-box bottom edge baseline',
- ['idtp'] = 'Ideographic em-box top edge baseline',
- ['math'] = 'Mathmatical centered baseline',
- ['romn'] = 'Roman baseline'
-}
-
--- can be sped up by local tables
-
-function otf.tables.to_tag(id)
- return stringformat("%4s",lower(id))
-end
-
-local function resolve(tab,id)
- if tab and id then
- id = lower(id)
- return tab[id] or tab[gsub(id," ","")] or tab['dflt'] or ''
- else
- return "unknown"
- end
-end
-
-function otf.meanings.script(id)
- return resolve(otf.tables.scripts,id)
-end
-function otf.meanings.language(id)
- return resolve(otf.tables.languages,id)
-end
-function otf.meanings.feature(id)
- return resolve(otf.tables.features,id)
-end
-function otf.meanings.baseline(id)
- return resolve(otf.tables.baselines,id)
-end
-
-otf.tables.to_scripts = table.reverse_hash(otf.tables.scripts )
-otf.tables.to_languages = table.reverse_hash(otf.tables.languages)
-otf.tables.to_features = table.reverse_hash(otf.tables.features )
-
-local scripts = otf.tables.scripts
-local languages = otf.tables.languages
-local features = otf.tables.features
-
-local to_scripts = otf.tables.to_scripts
-local to_languages = otf.tables.to_languages
-local to_features = otf.tables.to_features
-
-for k, v in next, to_features do
- local stripped = gsub(k,"%-"," ")
- to_features[stripped] = v
- local stripped = gsub(k,"[^a-zA-Z0-9]","")
- to_features[stripped] = v
-end
-for k, v in next, to_features do
- to_features[lower(k)] = v
-end
-
-otf.meanings.checkers = {
- rand = function(v)
- return v and "random"
- end
-}
-
-local checkers = otf.meanings.checkers
-
-function otf.meanings.normalize(features)
- local h = { }
- for k,v in next, features do
- k = lower(k)
- if k == "language" or k == "lang" then
- v = gsub(lower(v),"[^a-z0-9%-]","")
- k = language
- if not languages[v] then
- h.language = to_languages[v] or "dflt"
- else
- h.language = v
- end
- elseif k == "script" then
- v = gsub(lower(v),"[^a-z0-9%-]","")
- if not scripts[v] then
- h.script = to_scripts[v] or "dflt"
- else
- h.script = v
- end
- else
- if type(v) == "string" then
- local b = v:is_boolean()
- if type(b) == "nil" then
- v = tonumber(v) or lower(v)
- else
- v = b
- end
- end
- k = to_features[k] or k
- local c = checkers[k]
- h[k] = c and c(v) or v
- end
- end
- return h
-end
-
--- When I feel the need ...
-
---~ otf.tables.aat = {
---~ [ 0] = {
---~ name = "allTypographicFeaturesType",
---~ [ 0] = "allTypeFeaturesOnSelector",
---~ [ 1] = "allTypeFeaturesOffSelector",
---~ },
---~ [ 1] = {
---~ name = "ligaturesType",
---~ [0 ] = "requiredLigaturesOnSelector",
---~ [1 ] = "requiredLigaturesOffSelector",
---~ [2 ] = "commonLigaturesOnSelector",
---~ [3 ] = "commonLigaturesOffSelector",
---~ [4 ] = "rareLigaturesOnSelector",
---~ [5 ] = "rareLigaturesOffSelector",
---~ [6 ] = "logosOnSelector ",
---~ [7 ] = "logosOffSelector ",
---~ [8 ] = "rebusPicturesOnSelector",
---~ [9 ] = "rebusPicturesOffSelector",
---~ [10] = "diphthongLigaturesOnSelector",
---~ [11] = "diphthongLigaturesOffSelector",
---~ [12] = "squaredLigaturesOnSelector",
---~ [13] = "squaredLigaturesOffSelector",
---~ [14] = "abbrevSquaredLigaturesOnSelector",
---~ [15] = "abbrevSquaredLigaturesOffSelector",
---~ },
---~ [ 2] = {
---~ name = "cursiveConnectionType",
---~ [ 0] = "unconnectedSelector",
---~ [ 1] = "partiallyConnectedSelector",
---~ [ 2] = "cursiveSelector ",
---~ },
---~ [ 3] = {
---~ name = "letterCaseType",
---~ [ 0] = "upperAndLowerCaseSelector",
---~ [ 1] = "allCapsSelector ",
---~ [ 2] = "allLowerCaseSelector",
---~ [ 3] = "smallCapsSelector ",
---~ [ 4] = "initialCapsSelector",
---~ [ 5] = "initialCapsAndSmallCapsSelector",
---~ },
---~ [ 4] = {
---~ name = "verticalSubstitutionType",
---~ [ 0] = "substituteVerticalFormsOnSelector",
---~ [ 1] = "substituteVerticalFormsOffSelector",
---~ },
---~ [ 5] = {
---~ name = "linguisticRearrangementType",
---~ [ 0] = "linguisticRearrangementOnSelector",
---~ [ 1] = "linguisticRearrangementOffSelector",
---~ },
---~ [ 6] = {
---~ name = "numberSpacingType",
---~ [ 0] = "monospacedNumbersSelector",
---~ [ 1] = "proportionalNumbersSelector",
---~ },
---~ [ 7] = {
---~ name = "appleReserved1Type",
---~ },
---~ [ 8] = {
---~ name = "smartSwashType",
---~ [ 0] = "wordInitialSwashesOnSelector",
---~ [ 1] = "wordInitialSwashesOffSelector",
---~ [ 2] = "wordFinalSwashesOnSelector",
---~ [ 3] = "wordFinalSwashesOffSelector",
---~ [ 4] = "lineInitialSwashesOnSelector",
---~ [ 5] = "lineInitialSwashesOffSelector",
---~ [ 6] = "lineFinalSwashesOnSelector",
---~ [ 7] = "lineFinalSwashesOffSelector",
---~ [ 8] = "nonFinalSwashesOnSelector",
---~ [ 9] = "nonFinalSwashesOffSelector",
---~ },
---~ [ 9] = {
---~ name = "diacriticsType",
---~ [ 0] = "showDiacriticsSelector",
---~ [ 1] = "hideDiacriticsSelector",
---~ [ 2] = "decomposeDiacriticsSelector",
---~ },
---~ [10] = {
---~ name = "verticalPositionType",
---~ [ 0] = "normalPositionSelector",
---~ [ 1] = "superiorsSelector ",
---~ [ 2] = "inferiorsSelector ",
---~ [ 3] = "ordinalsSelector ",
---~ },
---~ [11] = {
---~ name = "fractionsType",
---~ [ 0] = "noFractionsSelector",
---~ [ 1] = "verticalFractionsSelector",
---~ [ 2] = "diagonalFractionsSelector",
---~ },
---~ [12] = {
---~ name = "appleReserved2Type",
---~ },
---~ [13] = {
---~ name = "overlappingCharactersType",
---~ [ 0] = "preventOverlapOnSelector",
---~ [ 1] = "preventOverlapOffSelector",
---~ },
---~ [14] = {
---~ name = "typographicExtrasType",
---~ [0 ] = "hyphensToEmDashOnSelector",
---~ [1 ] = "hyphensToEmDashOffSelector",
---~ [2 ] = "hyphenToEnDashOnSelector",
---~ [3 ] = "hyphenToEnDashOffSelector",
---~ [4 ] = "unslashedZeroOnSelector",
---~ [5 ] = "unslashedZeroOffSelector",
---~ [6 ] = "formInterrobangOnSelector",
---~ [7 ] = "formInterrobangOffSelector",
---~ [8 ] = "smartQuotesOnSelector",
---~ [9 ] = "smartQuotesOffSelector",
---~ [10] = "periodsToEllipsisOnSelector",
---~ [11] = "periodsToEllipsisOffSelector",
---~ },
---~ [15] = {
---~ name = "mathematicalExtrasType",
---~ [ 0] = "hyphenToMinusOnSelector",
---~ [ 1] = "hyphenToMinusOffSelector",
---~ [ 2] = "asteriskToMultiplyOnSelector",
---~ [ 3] = "asteriskToMultiplyOffSelector",
---~ [ 4] = "slashToDivideOnSelector",
---~ [ 5] = "slashToDivideOffSelector",
---~ [ 6] = "inequalityLigaturesOnSelector",
---~ [ 7] = "inequalityLigaturesOffSelector",
---~ [ 8] = "exponentsOnSelector",
---~ [ 9] = "exponentsOffSelector",
---~ },
---~ [16] = {
---~ name = "ornamentSetsType",
---~ [ 0] = "noOrnamentsSelector",
---~ [ 1] = "dingbatsSelector ",
---~ [ 2] = "piCharactersSelector",
---~ [ 3] = "fleuronsSelector ",
---~ [ 4] = "decorativeBordersSelector",
---~ [ 5] = "internationalSymbolsSelector",
---~ [ 6] = "mathSymbolsSelector",
---~ },
---~ [17] = {
---~ name = "characterAlternativesType",
---~ [ 0] = "noAlternatesSelector",
---~ },
---~ [18] = {
---~ name = "designComplexityType",
---~ [ 0] = "designLevel1Selector",
---~ [ 1] = "designLevel2Selector",
---~ [ 2] = "designLevel3Selector",
---~ [ 3] = "designLevel4Selector",
---~ [ 4] = "designLevel5Selector",
---~ },
---~ [19] = {
---~ name = "styleOptionsType",
---~ [ 0] = "noStyleOptionsSelector",
---~ [ 1] = "displayTextSelector",
---~ [ 2] = "engravedTextSelector",
---~ [ 3] = "illuminatedCapsSelector",
---~ [ 4] = "titlingCapsSelector",
---~ [ 5] = "tallCapsSelector ",
---~ },
---~ [20] = {
---~ name = "characterShapeType",
---~ [0 ] = "traditionalCharactersSelector",
---~ [1 ] = "simplifiedCharactersSelector",
---~ [2 ] = "jis1978CharactersSelector",
---~ [3 ] = "jis1983CharactersSelector",
---~ [4 ] = "jis1990CharactersSelector",
---~ [5 ] = "traditionalAltOneSelector",
---~ [6 ] = "traditionalAltTwoSelector",
---~ [7 ] = "traditionalAltThreeSelector",
---~ [8 ] = "traditionalAltFourSelector",
---~ [9 ] = "traditionalAltFiveSelector",
---~ [10] = "expertCharactersSelector",
---~ },
---~ [21] = {
---~ name = "numberCaseType",
---~ [ 0] = "lowerCaseNumbersSelector",
---~ [ 1] = "upperCaseNumbersSelector",
---~ },
---~ [22] = {
---~ name = "textSpacingType",
---~ [ 0] = "proportionalTextSelector",
---~ [ 1] = "monospacedTextSelector",
---~ [ 2] = "halfWidthTextSelector",
---~ [ 3] = "normallySpacedTextSelector",
---~ },
---~ [23] = {
---~ name = "transliterationType",
---~ [ 0] = "noTransliterationSelector",
---~ [ 1] = "hanjaToHangulSelector",
---~ [ 2] = "hiraganaToKatakanaSelector",
---~ [ 3] = "katakanaToHiraganaSelector",
---~ [ 4] = "kanaToRomanizationSelector",
---~ [ 5] = "romanizationToHiraganaSelector",
---~ [ 6] = "romanizationToKatakanaSelector",
---~ [ 7] = "hanjaToHangulAltOneSelector",
---~ [ 8] = "hanjaToHangulAltTwoSelector",
---~ [ 9] = "hanjaToHangulAltThreeSelector",
---~ },
---~ [24] = {
---~ name = "annotationType",
---~ [ 0] = "noAnnotationSelector",
---~ [ 1] = "boxAnnotationSelector",
---~ [ 2] = "roundedBoxAnnotationSelector",
---~ [ 3] = "circleAnnotationSelector",
---~ [ 4] = "invertedCircleAnnotationSelector",
---~ [ 5] = "parenthesisAnnotationSelector",
---~ [ 6] = "periodAnnotationSelector",
---~ [ 7] = "romanNumeralAnnotationSelector",
---~ [ 8] = "diamondAnnotationSelector",
---~ },
---~ [25] = {
---~ name = "kanaSpacingType",
---~ [ 0] = "fullWidthKanaSelector",
---~ [ 1] = "proportionalKanaSelector",
---~ },
---~ [26] = {
---~ name = "ideographicSpacingType",
---~ [ 0] = "fullWidthIdeographsSelector",
---~ [ 1] = "proportionalIdeographsSelector",
---~ },
---~ [103] = {
---~ name = "cjkRomanSpacingType",
---~ [ 0] = "halfWidthCJKRomanSelector",
---~ [ 1] = "proportionalCJKRomanSelector",
---~ [ 2] = "defaultCJKRomanSelector",
---~ [ 3] = "fullWidthCJKRomanSelector",
---~ },
---~ }
-
-end -- closure
-
-do -- begin closure to overcome local limits and interference
-
if not modules then modules = { } end modules ['font-map'] = {
version = 1.001,
comment = "companion to font-ini.mkiv",
@@ -5480,15 +4259,18 @@ if not modules then modules = { } end modules ['font-map'] = {
license = "see context related readme files"
}
-local utf = unicode.utf8
local match, format, find, concat, gsub, lower = string.match, string.format, string.find, table.concat, string.gsub, string.lower
-local lpegmatch = lpeg.match
+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 trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
-local trace_unimapping = false trackers.register("otf.unimapping", function(v) trace_unimapping = v end)
+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 ctxcatcodes = tex and tex.ctxcatcodes
+local report_fonts = logs.reporter("fonts","loading") -- not otf only
+
+local fonts = fonts
+local mappings = { }
+fonts.mappings = mappings
--[[ldx--
<p>Eventually this code will disappear because map files are kind
@@ -5496,50 +4278,46 @@ of obsolete. Some code may move to runtime or auxiliary modules.</p>
<p>The name to unciode related code will stay of course.</p>
--ldx]]--
-fonts = fonts or { }
-fonts.map = fonts.map or { }
-
-local function load_lum_table(filename) -- will move to font goodies
+local function loadlumtable(filename) -- will move to font goodies
local lumname = file.replacesuffix(file.basename(filename),"lum")
- local lumfile = resolvers.find_file(lumname,"map") or ""
+ local lumfile = resolvers.findfile(lumname,"map") or ""
if lumfile ~= "" and lfs.isfile(lumfile) then
- if trace_loading or trace_unimapping then
- logs.report("load otf","enhance: loading %s ",lumfile)
+ if trace_loading or trace_mapping then
+ report_fonts("enhance: loading %s ",lumfile)
end
lumunic = dofile(lumfile)
return lumunic, lumfile
end
end
-local hex = lpeg.R("AF","09")
+local hex = R("AF","09")
local hexfour = (hex*hex*hex*hex) / function(s) return tonumber(s,16) end
local hexsix = (hex^1) / function(s) return tonumber(s,16) end
-local dec = (lpeg.R("09")^1) / tonumber
-local period = lpeg.P(".")
-
-local unicode = lpeg.P("uni") * (hexfour * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexfour^1) * lpeg.Cc(true))
-local ucode = lpeg.P("u") * (hexsix * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexsix ^1) * lpeg.Cc(true))
-local index = lpeg.P("index") * dec * lpeg.Cc(false)
+local dec = (R("09")^1) / tonumber
+local period = P(".")
+local unicode = P("uni") * (hexfour * (period + P(-1)) * Cc(false) + Ct(hexfour^1) * Cc(true))
+local ucode = P("u") * (hexsix * (period + P(-1)) * Cc(false) + Ct(hexsix ^1) * Cc(true))
+local index = P("index") * dec * Cc(false)
local parser = unicode + ucode + index
local parsers = { }
-local function make_name_parser(str)
+local function makenameparser(str)
if not str or str == "" then
return parser
else
local p = parsers[str]
if not p then
- p = lpeg.P(str) * period * dec * lpeg.Cc(false)
+ p = P(str) * period * dec * Cc(false)
parsers[str] = p
end
return p
end
end
---~ local parser = fonts.map.make_name_parser("Japan1")
---~ local parser = fonts.map.make_name_parser()
+--~ local parser = mappings.makenameparser("Japan1")
+--~ local parser = mappings.makenameparser()
--~ local function test(str)
--~ local b, a = lpegmatch(parser,str)
--~ print((a and table.serialize(b)) or b)
@@ -5580,7 +4358,7 @@ end
--~
--~ local cache = { }
--~
---~ function fonts.map.tounicode16(unicode)
+--~ function mappings.tounicode16(unicode)
--~ local s = cache[unicode]
--~ if not s then
--~ if unicode < 0x10000 then
@@ -5593,14 +4371,14 @@ end
--~ return s
--~ end
-fonts.map.load_lum_table = load_lum_table
-fonts.map.make_name_parser = make_name_parser
-fonts.map.tounicode16 = tounicode16
-fonts.map.tounicode16sequence = tounicode16sequence
+mappings.loadlumtable = loadlumtable
+mappings.makenameparser = makenameparser
+mappings.tounicode16 = tounicode16
+mappings.tounicode16sequence = tounicode16sequence
-local separator = lpeg.S("_.")
-local other = lpeg.C((1 - separator)^1)
-local ligsplitter = lpeg.Ct(other * (separator * other)^0)
+local separator = S("_.")
+local other = C((1 - separator)^1)
+local ligsplitter = Ct(other * (separator * other)^0)
--~ print(table.serialize(lpegmatch(ligsplitter,"this")))
--~ print(table.serialize(lpegmatch(ligsplitter,"this.that")))
@@ -5608,8 +4386,11 @@ local ligsplitter = lpeg.Ct(other * (separator * other)^0)
--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more")))
--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more.that")))
-fonts.map.add_to_unicode = function(data,filename)
- local unicodes = data.luatex and data.luatex.unicodes
+function mappings.addtounicode(data,filename)
+ local resources = data.resources
+ local properties = data.properties
+ local descriptions = data.descriptions
+ local unicodes = resources.unicodes
if not unicodes then
return
end
@@ -5619,28 +4400,35 @@ fonts.map.add_to_unicode = function(data,filename)
unicodes['zwj'] = unicodes['zwj'] or 0x200D
unicodes['zwnj'] = unicodes['zwnj'] or 0x200C
-- the tounicode mapping is sparse and only needed for alternatives
- local tounicode, originals, ns, nl, private, unknown = { }, { }, 0, 0, fonts.private, format("%04X",utfbyte("?"))
- data.luatex.tounicode, data.luatex.originals = tounicode, originals
+ 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
local lumunic, uparser, oparser
+ local cidinfo, cidnames, cidcodes, usedmap
if false then -- will become an option
- lumunic = load_lum_table(filename)
+ lumunic = loadlumtable(filename)
lumunic = lumunic and lumunic.tounicode
end
- local cidinfo, cidnames, cidcodes = data.cidinfo
- local usedmap = cidinfo and cidinfo.usedname
- usedmap = usedmap and lower(usedmap)
- usedmap = usedmap and fonts.cid.map[usedmap]
+ --
+ cidinfo = properties.cidinfo
+ usedmap = cidinfo and fonts.cid.getmap(cidinfo)
+ --
if usedmap then
- oparser = usedmap and make_name_parser(cidinfo.ordering)
+ oparser = usedmap and makenameparser(cidinfo.ordering)
cidnames = usedmap.names
cidcodes = usedmap.unicodes
end
- uparser = make_name_parser()
- local aglmap = fonts.map and fonts.map.agl_to_unicode
- for index, glyph in next, data.glyphs do
- local name, unic = glyph.name, glyph.unicode or -1 -- play safe
+ uparser = makenameparser()
+ local ns, nl = 0, 0
+ 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 unicode = (lumunic and lumunic[name]) or (aglmap and aglmap[name])
+ local unicode = lumunic and lumunic[name] or unicodevector[name]
if unicode then
originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
end
@@ -5684,7 +4472,7 @@ fonts.map.add_to_unicode = function(data,filename)
-- skip
elseif nplit == 1 then
local base = split[1]
- unicode = unicodes[base] or (aglmap and aglmap[base])
+ unicode = unicodes[base] or unicodevector[base]
if unicode then
if type(unicode) == "table" then
unicode = unicode[1]
@@ -5692,19 +4480,25 @@ fonts.map.add_to_unicode = function(data,filename)
originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1
end
else
- local t = { }
+ local t, n = { }, 0
for l=1,nplit do
local base = split[l]
- local u = unicodes[base] or (aglmap and aglmap[base])
+ local u = unicodes[base] or unicodevector[base]
if not u then
break
elseif type(u) == "table" then
- t[#t+1] = u[1]
+ n = n + 1
+ t[n] = u[1]
else
- t[#t+1] = u
+ n = n + 1
+ t[n] = u
end
end
- if #t > 0 then -- done then
+ if n == 0 then -- done then
+ -- nothing
+ elseif n == 1 then
+ originals[index], tounicode[index], nl, unicode = t[1], tounicode16(t[1]), nl + 1, true
+ else
originals[index], tounicode[index], nl, unicode = t, tounicode16sequence(t), nl + 1, true
end
end
@@ -5725,129 +4519,159 @@ fonts.map.add_to_unicode = function(data,filename)
end
end
end
- if trace_unimapping then
- for index, glyph in table.sortedhash(data.glyphs) do
- local toun, name, unic = tounicode[index], glyph.name, glyph.unicode or -1 -- play safe
+ 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
- logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X, tounicode: %s",index,name,unic,toun)
+ report_fonts("internal: 0x%05X, name: %s, unicode: U+%05X, tounicode: %s",index,name,unic,toun)
else
- logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X",index,name,unic)
+ report_fonts("internal: 0x%05X, name: %s, unicode: U+%05X",index,name,unic)
end
end
end
if trace_loading and (ns > 0 or nl > 0) then
- logs.report("load otf","enhance: %s tounicode entries added (%s ligatures)",nl+ns, ns)
+ report_fonts("enhance: %s tounicode entries added (%s ligatures)",nl+ns, ns)
end
end
--- the following is sort of obsolete
---
--- fonts.map.data = fonts.map.data or { }
--- fonts.map.encodings = fonts.map.encodings or { }
--- fonts.map.loaded = fonts.map.loaded or { }
--- fonts.map.line = fonts.map.line or { }
---
--- function fonts.map.line.pdftex(e)
--- if e.name and e.fontfile then
--- local fullname = e.fullname or ""
--- if e.slant and e.slant ~= 0 then
--- if e.encoding then
--- pdf.mapline(format('= %s %s "%g SlantFont" <%s <%s',e.name,fullname,e.slant,e.encoding,e.fontfile)))
--- else
--- pdf.mapline(format('= %s %s "%g SlantFont" <%s',e.name,fullname,e.slant,e.fontfile)))
--- end
--- elseif e.extend and e.extend ~= 1 and e.extend ~= 0 then
--- if e.encoding then
--- pdf.mapline(format('= %s %s "%g ExtendFont" <%s <%s',e.name,fullname,e.extend,e.encoding,e.fontfile)))
--- else
--- pdf.mapline(format('= %s %s "%g ExtendFont" <%s',e.name,fullname,e.extend,e.fontfile)))
--- end
--- else
--- if e.encoding then
--- pdf.mapline(format('= %s %s <%s <%s',e.name,fullname,e.encoding,e.fontfile)))
--- else
--- pdf.mapline(format('= %s %s <%s',e.name,fullname,e.fontfile)))
--- end
--- end
--- else
--- return nil
--- end
--- end
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['luatex-fonts-syn'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+-- Generic font names support.
--
--- function fonts.map.flush(backend) -- will also erase the accumulated data
--- local flushline = fonts.map.line[backend or "pdftex"] or fonts.map.line.pdftex
--- for _, e in next, fonts.map.data do
--- flushline(e)
--- end
--- fonts.map.data = { }
--- end
+-- Watch out, the version number is the same as the one used in
+-- the mtx-fonts.lua function scripts.fonts.names as we use a
+-- simplified font database in the plain solution and by using
+-- a different number we're less dependent on context.
--
--- fonts.map.line.dvips = fonts.map.line.pdftex
--- fonts.map.line.dvipdfmx = function() end
+-- mtxrun --script font --reload --simple
--
--- function fonts.map.convert_entries(filename)
--- if not fonts.map.loaded[filename] then
--- fonts.map.data, fonts.map.encodings = fonts.map.load_file(filename,fonts.map.data, fonts.map.encodings)
--- fonts.map.loaded[filename] = true
--- end
--- end
+-- The format of the file is as follows:
--
--- function fonts.map.load_file(filename, entries, encodings)
--- entries = entries or { }
--- encodings = encodings or { }
--- local f = io.open(filename)
--- if f then
--- local data = f:read("*a")
--- if data then
--- for line in gmatch(data,"(.-)[\n\t]") do
--- if find(line,"^[%#%%%s]") then
--- -- print(line)
--- else
--- local extend, slant, name, fullname, fontfile, encoding
--- line = gsub(line,'"(.+)"', function(s)
--- extend = find(s,'"([^"]+) ExtendFont"')
--- slant = find(s,'"([^"]+) SlantFont"')
--- return ""
--- end)
--- if not name then
--- -- name fullname encoding fontfile
--- name, fullname, encoding, fontfile = match(line,"^(%S+)%s+(%S*)[%s<]+(%S*)[%s<]+(%S*)%s*$")
--- end
--- if not name then
--- -- name fullname (flag) fontfile encoding
--- name, fullname, fontfile, encoding = match(line,"^(%S+)%s+(%S*)[%d%s<]+(%S*)[%s<]+(%S*)%s*$")
--- end
--- if not name then
--- -- name fontfile
--- name, fontfile = match(line,"^(%S+)%s+[%d%s<]+(%S*)%s*$")
--- end
--- if name then
--- if encoding == "" then encoding = nil end
--- entries[name] = {
--- name = name, -- handy
--- fullname = fullname,
--- encoding = encoding,
--- fontfile = fontfile,
--- slant = tonumber(slant),
--- extend = tonumber(extend)
--- }
--- encodings[name] = encoding
--- elseif line ~= "" then
--- -- print(line)
--- end
--- end
--- end
--- end
--- f:close()
--- end
--- return entries, encodings
--- end
+-- return {
+-- ["version"] = 1.001,
+-- ["mappings"] = {
+-- ["somettcfontone"] = { "Some TTC Font One", "SomeFontA.ttc", 1 },
+-- ["somettcfonttwo"] = { "Some TTC Font Two", "SomeFontA.ttc", 2 },
+-- ["somettffont"] = { "Some TTF Font", "SomeFontB.ttf" },
+-- ["someotffont"] = { "Some OTF Font", "SomeFontC.otf" },
+-- },
+-- }
+
+local fonts = fonts
+fonts.names = fonts.names or { }
+
+fonts.names.version = 1.001 -- not the same as in context
+fonts.names.basename = "luatex-fonts-names.lua"
+fonts.names.new_to_old = { }
+fonts.names.old_to_new = { }
+
+local data, loaded = nil, false
+
+local fileformats = { "lua", "tex", "other text files" }
+
+function fonts.names.resolve(name,sub)
+ if not loaded then
+ local basename = fonts.names.basename
+ if basename and basename ~= "" then
+ for i=1,#fileformats do
+ local format = fileformats[i]
+ local foundname = resolvers.findfile(basename,format) or ""
+ if foundname ~= "" then
+ data = dofile(foundname)
+ texio.write("<font database loaded: ",foundname,">")
+ break
+ end
+ end
+ end
+ loaded = true
+ end
+ if type(data) == "table" and data.version == fonts.names.version then
+ local condensed = string.gsub(string.lower(name),"[^%a%d]","")
+ local found = data.mappings and data.mappings[condensed]
+ if found then
+ local fontname, filename, subfont = found[1], found[2], found[3]
+ if subfont then
+ return filename, fontname
+ else
+ return filename, false
+ end
+ else
+ return name, false -- fallback to filename
+ end
+ end
+end
+
+fonts.names.resolvespec = fonts.names.resolve -- only supported in mkiv
+
+function fonts.names.getfilename(askedname,suffix) -- only supported in mkiv
+ return ""
+end
end -- closure
do -- begin closure to overcome local limits and interference
-if not modules then modules = { } end modules ['font-otf'] = {
+if not modules then modules = { } end modules ['luatex-fonts-tfm'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+local fonts = fonts
+local tfm = { }
+fonts.handlers.tfm = tfm
+fonts.formats.tfm = "type1" -- we need to have at least a value here
+
+function fonts.readers.tfm(specification)
+ local fullname = specification.filename or ""
+ if fullname == "" then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ fullname = specification.name .. "." .. forced
+ else
+ fullname = specification.name
+ end
+ end
+ local foundname = resolvers.findbinfile(fullname, 'tfm') or ""
+ if foundname == "" then
+ foundname = resolvers.findbinfile(fullname, 'ofm') or ""
+ end
+ if foundname ~= "" then
+ specification.filename = foundname
+ specification.format = "ofm"
+ return font.read_tfm(specification.filename,specification.size)
+ end
+end
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-oti'] = {
version = 1.001,
comment = "companion to font-ini.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -5855,120 +4679,243 @@ if not modules then modules = { } end modules ['font-otf'] = {
license = "see context related readme files"
}
-local utf = unicode.utf8
+local lower = string.lower
-local concat, getn, utfbyte = table.concat, table.getn, utf.byte
-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 abs = math.abs
-local lpegmatch = lpeg.match
+local allocate = utilities.storage.allocate
-local trace_private = false trackers.register("otf.private", function(v) trace_private = v end)
-local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
-local trace_features = false trackers.register("otf.features", function(v) trace_features = v end)
-local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end)
-local trace_sequences = false trackers.register("otf.sequences", function(v) trace_sequences = v end)
-local trace_math = false trackers.register("otf.math", function(v) trace_math = v end)
-local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+local fonts = fonts
+local otf = { }
+fonts.handlers.otf = otf
---~ trackers.enable("otf.loading")
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
---[[ldx--
-<p>The fontforge table has organized lookups in a certain way. A first implementation
-of this code was organized featurewise: information related to features was
-collected and processing boiled down to a run over the features. The current
-implementation honors the order in the main feature table. Since we can reorder this
-table as we want, we can eventually support several models of processing. We kept
-the static as well as dynamic feature processing, because it had proved to be
-rather useful. The formerly three loop variants have beem discarded but will
-reapear at some time.</p>
-
-<itemize>
-<item>we loop over all lookups</item>
-<item>for each lookup we do a run over the list of glyphs</item>
-<item>but we only process them for features that are enabled</item>
-<item>if we're dealing with a contextual lookup, we loop over all contexts</item>
-<item>in that loop we quit at a match and then process the list of sublookups</item>
-<item>we always continue after the match</item>
-</itemize>
-
-<p>In <l n='context'/> we do this for each font that is used in a list, so in
-practice we have quite some nested loops.</p>
-
-<p>We process the whole list and then consult the glyph nodes. An alternative approach
-is to collect strings of characters using the same font including spaces (because some
-lookups involve spaces). However, we then need to reconstruct the list which is no fun.
-Also, we need to carry quite some information, like attributes, so eventually we don't
-gain much (if we gain something at all).</p>
-
-<p>Another consideration has been to operate on sublists (subhead, subtail) but again
-this would complicate matters as we then neext to keep track of a changing subhead
-and subtail. On the other hand, this might save some runtime. The number of changes
-involved is not that large. This only makes sense when we have many fonts in a list
-and don't change to frequently.</p>
---ldx]]--
+registerotffeature {
+ name = "features",
+ description = "initialization of feature handler",
+ default = true,
+}
+
+-- these are later hooked into node and base initializaters
+
+local otftables = otf.tables -- not always defined
+
+local function setmode(tfmdata,value)
+ if value then
+ tfmdata.properties.mode = lower(value)
+ end
+end
-fonts = fonts or { }
-fonts.otf = fonts.otf or { }
-fonts.tfm = fonts.tfm or { }
+local function setlanguage(tfmdata,value)
+ if value then
+ local cleanvalue = lower(value)
+ local languages = otftables and otftables.languages
+ local properties = tfmdata.properties
+ if not languages then
+ properties.language = cleanvalue
+ elseif languages[value] then
+ properties.language = cleanvalue
+ else
+ properties.language = "dflt"
+ end
+ end
+end
-local otf = fonts.otf
-local tfm = fonts.tfm
+local function setscript(tfmdata,value)
+ if value then
+ local cleanvalue = lower(value)
+ local scripts = otftables and otftables.scripts
+ local properties = tfmdata.properties
+ if not scripts then
+ properties.script = cleanvalue
+ elseif scripts[value] then
+ properties.script = cleanvalue
+ else
+ properties.script = "dflt"
+ end
+ end
+end
-local fontdata = fonts.ids
+registerotffeature {
+ name = "mode",
+ description = "mode",
+ initializers = {
+ base = setmode,
+ node = setmode,
+ }
+}
-otf.tables = otf.tables or { } -- defined in font-ott.lua
-otf.meanings = otf.meanings or { } -- defined in font-ott.lua
-otf.tables.features = otf.tables.features or { } -- defined in font-ott.lua
-otf.tables.languages = otf.tables.languages or { } -- defined in font-ott.lua
-otf.tables.scripts = otf.tables.scripts or { } -- defined in font-ott.lua
+registerotffeature {
+ name = "language",
+ description = "language",
+ initializers = {
+ base = setlanguage,
+ node = setlanguage,
+ }
+}
-otf.features = otf.features or { }
-otf.features.list = otf.features.list or { }
-otf.features.default = otf.features.default or { }
+registerotffeature {
+ name = "script",
+ description = "script",
+ initializers = {
+ base = setscript,
+ node = setscript,
+ }
+}
-otf.enhancers = otf.enhancers or { }
-otf.glists = { "gsub", "gpos" }
-otf.version = 2.650 -- beware: also sync font-mis.lua
-otf.pack = true -- beware: also sync font-mis.lua
-otf.syncspace = true
-otf.notdef = false
-otf.cache = containers.define("fonts", "otf", otf.version, true)
-otf.cleanup_aat = false -- only context
+end -- closure
-local wildcard = "*"
-local default = "dflt"
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['font-otf'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- langs -> languages enz
+-- anchor_classes vs kernclasses
+-- modification/creationtime in subfont is runtime dus zinloos
+-- to_table -> totable
+-- ascent descent
+
+local utf = unicode.utf8
+
+local utfbyte = utf.byte
+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 abs = math.abs
+local getn = table.getn
+local lpegmatch = lpeg.match
+local reversed, concat, remove = table.reversed, table.concat, table.remove
+local ioflush = io.flush
+local fastcopy, tohash = table.fastcopy, table.tohash
+
+local allocate = utilities.storage.allocate
+local registertracker = trackers.register
+local registerdirective = directives.register
+local starttiming = statistics.starttiming
+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 report_otf = logs.reporter("fonts","otf loading")
+
+local fonts = fonts
+local otf = fonts.handlers.otf
+
+otf.glists = { "gsub", "gpos" }
+
+otf.version = 2.730 -- beware: also sync font-mis.lua
+otf.cache = containers.define("fonts", "otf", otf.version, true)
+
+local fontdata = fonts.hashes.identifiers
+local chardata = characters and characters.data -- not used
+
+local otffeatures = fonts.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 -- 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
+
+local wildcard = "*"
+local default = "dflt"
+
+local fontloaderfields = fontloader.fields
+local mainfields = nil
+local glyphfields = nil -- not used yet
+
+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)
+
+local function load_featurefile(raw,featurefile)
+ if featurefile and featurefile ~= "" then
+ if trace_loading then
+ report_otf("featurefile: %s", featurefile)
+ end
+ fontloader.apply_featurefile(raw, featurefile)
+ end
+end
+
+local function showfeatureorder(rawdata,filename)
+ local sequences = rawdata.resources.sequences
+ if sequences and #sequences > 0 then
+ if trace_loading then
+ report_otf("font %s has %s sequences",filename,#sequences)
+ report_otf(" ")
+ end
+ for nos=1,#sequences do
+ local sequence = sequences[nos]
+ local typ = sequence.type or "no-type"
+ local name = sequence.name or "no-name"
+ local subtables = sequence.subtables or { "no-subtables" }
+ local features = sequence.features
+ if trace_loading then
+ report_otf("%3i %-15s %-20s [%s]",nos,name,typ,concat(subtables,","))
+ end
+ if features then
+ for feature, scripts in next, features do
+ local tt = { }
+ for script, languages in next, scripts do
+ local ttt = { }
+ for language, _ in next, languages do
+ ttt[#ttt+1] = language
+ end
+ tt[#tt+1] = format("[%s: %s]",script,concat(ttt," "))
+ end
+ if trace_loading then
+ report_otf(" %s: %s",feature,concat(tt," "))
+ end
+ end
+ end
+ end
+ if trace_loading then
+ report_otf("\n")
+ end
+ elseif trace_loading then
+ report_otf("font %s has no sequences",filename)
+ end
+end
--[[ldx--
<p>We start with a lot of tables and related functions.</p>
--ldx]]--
-otf.tables.global_fields = table.tohash {
- "lookups",
- "glyphs",
- "subfonts",
- "luatex",
- "pfminfo",
- "cidinfo",
- "tables",
- "names",
- "unicodes",
- "names",
---~ "math",
- "anchor_classes",
- "kern_classes",
- "gpos",
- "gsub"
-}
-
-otf.tables.valid_fields = {
- "anchor_classes",
+local valid_fields = table.tohash {
+ -- "anchor_classes",
"ascent",
- "cache_version",
+ -- "cache_version",
"cidinfo",
"copyright",
- "creationtime",
+ -- "creationtime",
"descent",
"design_range_bottom",
"design_range_top",
@@ -5977,32 +4924,32 @@ otf.tables.valid_fields = {
"extrema_bound",
"familyname",
"fontname",
+ "fontname",
"fontstyle_id",
"fontstyle_name",
"fullname",
- "glyphs",
+ -- "glyphs",
"hasvmetrics",
- "head_optimized_for_cleartype",
+ -- "head_optimized_for_cleartype",
"horiz_base",
"issans",
"isserif",
"italicangle",
- "kerns",
- "lookups",
- -- "luatex",
+ -- "kerns",
+ -- "lookups",
"macstyle",
- "modificationtime",
+ -- "modificationtime",
"onlybitmaps",
"origname",
"os2_version",
"pfminfo",
- "private",
+ -- "private",
"serifcheck",
"sfd_version",
-- "size",
"strokedfont",
"strokewidth",
- "subfonts",
+ -- "subfonts",
"table_version",
-- "tables",
-- "ttf_tab_saved",
@@ -6013,282 +4960,704 @@ otf.tables.valid_fields = {
"upos",
"use_typo_metrics",
"uwidth",
- "validation_state",
- "verbose",
+ -- "validation_state",
"version",
"vert_base",
"weight",
"weight_width_slope_only",
- "xuid",
+ -- "xuid",
+}
+
+local ordered_enhancers = {
+ "prepare tables",
+ "prepare glyphs",
+ "prepare lookups",
+
+ "analyze glyphs",
+ "analyze math",
+
+ "prepare tounicode", -- maybe merge with prepare
+
+ "reorganize lookups",
+ "reorganize mark classes",
+ "reorganize anchor classes",
+
+ "reorganize glyph kerns",
+ "reorganize glyph lookups",
+ "reorganize glyph anchors",
+
+ "merge kern classes",
+
+ "reorganize features",
+ "reorganize subtables",
+
+ "check glyphs",
+ "check metadata",
+ "check extra features", -- after metadata
+
+ "add duplicates",
+ "check encoding",
+
+ "cleanup tables",
}
--[[ldx--
<p>Here we go.</p>
--ldx]]--
-local function load_featurefile(ff,featurefile)
- if featurefile then
- featurefile = resolvers.find_file(file.addsuffix(featurefile,'fea'),'fea')
- if featurefile and featurefile ~= "" then
- if trace_loading then
- logs.report("load otf", "featurefile: %s", featurefile)
- end
- fontloader.apply_featurefile(ff, featurefile)
+local actions = allocate()
+local before = allocate()
+local after = allocate()
+
+patches.before = before
+patches.after = after
+
+local function enhance(name,data,filename,raw)
+ local enhancer = actions[name]
+ if enhancer then
+ if trace_loading then
+ report_otf("enhance: %s (%s)",name,filename)
+ ioflush()
end
+ enhancer(data,filename,raw)
+ elseif trace_loading then
+ -- report_otf("enhance: %s is undefined",name)
end
end
-function otf.enhance(name,data,filename,verbose)
- local enhancer = otf.enhancers[name]
- if enhancer then
- if (verbose ~= nil and verbose) or trace_loading then
- logs.report("load otf","enhance: %s (%s)",name,filename)
+function enhancers.apply(data,filename,raw)
+ local basename = file.basename(lower(filename))
+ if trace_loading then
+ report_otf("start enhancing: %s",filename)
+ end
+ ioflush() -- we want instant messages
+ for e=1,#ordered_enhancers do
+ local enhancer = ordered_enhancers[e]
+ local b = before[enhancer]
+ if b then
+ for pattern, action in next, b do
+ if find(basename,pattern) then
+ action(data,filename,raw)
+ end
+ end
end
- enhancer(data,filename)
+ enhance(enhancer,data,filename,raw)
+ local a = after[enhancer]
+ if a then
+ for pattern, action in next, a do
+ if find(basename,pattern) then
+ action(data,filename,raw)
+ end
+ end
+ end
+ ioflush() -- we want instant messages
+ end
+ if trace_loading then
+ report_otf("stop enhancing")
end
+ ioflush() -- we want instant messages
end
-local enhancers = {
- -- pack and unpack are handled separately; they might even be moved
- -- away from the enhancers namespace
- "patch bugs",
- "merge cid fonts", "prepare unicode", "cleanup ttf tables", "compact glyphs", "reverse coverage",
- "cleanup aat", "enrich with features", "add some missing characters",
- "reorganize mark classes",
- "reorganize kerns", -- moved here
- "flatten glyph lookups", "flatten anchor tables", "flatten feature tables",
- "simplify glyph lookups", -- some saving
- "prepare luatex tables",
- "analyse features", "rehash features",
- "analyse anchors", "analyse marks", "analyse unicodes", "analyse subtables",
- "check italic correction","check math",
- "share widths",
- "strip not needed data",
- "migrate metadata",
- "check math parameters",
-}
+-- patches.register("before","migrate metadata","cambria",function() end)
+
+function patches.register(what,where,pattern,action)
+ local ww = what[where]
+ if ww then
+ ww[pattern] = action
+ else
+ ww = { [pattern] = action}
+ end
+end
+
+function patches.report(fmt,...)
+ if trace_loading then
+ report_otf("patching: " ..fmt,...)
+ end
+end
+
+function enhancers.register(what,action) -- only already registered can be overloaded
+ actions[what] = action
+end
function otf.load(filename,format,sub,featurefile)
local name = file.basename(file.removesuffix(filename))
+ local attr = lfs.attributes(filename)
+ local size = attr and attr.size or 0
+ local time = attr and attr.modification or 0
if featurefile then
name = name .. "@" .. file.removesuffix(file.basename(featurefile))
end
- if sub == "" then sub = false end
+ if sub == "" then
+ sub = false
+ end
local hash = name
if sub then
hash = hash .. "-" .. sub
end
hash = containers.cleanname(hash)
- local data = containers.read(otf.cache(), hash)
- local size = lfs.attributes(filename,"size") or 0
- if not data or data.verbose ~= fonts.verbose or data.size ~= size then
- logs.report("load otf","loading: %s (hash: %s)",filename,hash)
- local ff, messages
+ local featurefiles
+ if featurefile then
+ featurefiles = { }
+ for s in gmatch(featurefile,"[^,]+") do
+ local name = resolvers.findfile(file.addsuffix(s,'fea'),'fea') or ""
+ if name == "" then
+ report_otf("loading: no featurefile '%s'",s)
+ else
+ local attr = lfs.attributes(name)
+ featurefiles[#featurefiles+1] = {
+ name = name,
+ size = size,
+ time = time,
+ }
+ end
+ end
+ if #featurefiles == 0 then
+ featurefiles = nil
+ end
+ end
+ local data = containers.read(otf.cache,hash)
+ local reload = not data or data.size ~= size or data.time ~= time
+ if forceload then
+ report_otf("loading: forced reload due to hard coded flag")
+ reload = true
+ end
+ if not reload then
+ local featuredata = data.featuredata
+ if featurefiles then
+ if not featuredata or #featuredata ~= #featurefiles then
+ reload = true
+ else
+ for i=1,#featurefiles do
+ local fi, fd = featurefiles[i], featuredata[i]
+ if fi.name ~= fd.name or fi.size ~= fd.size or fi.time ~= fd.time then
+ reload = true
+ break
+ end
+ end
+ end
+ elseif featuredata then
+ reload = true
+ end
+ if reload then
+ report_otf("loading: forced reload due to changed featurefile specification: %s",featurefile or "--")
+ end
+ end
+ if reload then
+ report_otf("loading: %s (hash: %s)",filename,hash)
+ local fontdata, messages
if sub then
- ff, messages = fontloader.open(filename,sub)
+ fontdata, messages = fontloader.open(filename,sub)
else
- ff, messages = fontloader.open(filename)
+ fontdata, messages = fontloader.open(filename)
+ end
+ if fontdata then
+ mainfields = mainfields or (fontloaderfields and fontloaderfields(fontdata))
end
if trace_loading and messages and #messages > 0 then
if type(messages) == "string" then
- logs.report("load otf","warning: %s",messages)
+ report_otf("warning: %s",messages)
else
for m=1,#messages do
- logs.report("load otf","warning: %s",tostring(messages[m]))
+ report_otf("warning: %s",tostring(messages[m]))
end
end
else
- logs.report("load otf","font loaded okay")
- end
- if ff then
- load_featurefile(ff,featurefile)
- data = fontloader.to_table(ff)
- fontloader.close(ff)
- if data then
- logs.report("load otf","file size: %s", size)
- logs.report("load otf","enhancing ...")
- for e=1,#enhancers do
- otf.enhance(enhancers[e],data,filename)
- io.flush() -- we want instant messages
- end
- if otf.pack and not fonts.verbose then
- otf.enhance("pack",data,filename)
- end
- data.size = size
- data.verbose = fonts.verbose
- logs.report("load otf","saving in cache: %s",filename)
- data = containers.write(otf.cache(), hash, data)
+ report_otf("font loaded okay")
+ end
+ if fontdata then
+ if featurefiles then
+ for i=1,#featurefiles do
+ load_featurefile(fontdata,featurefiles[i].name)
+ end
+ end
+ local unicodes = {
+ -- names to unicodes
+ }
+ local splitter = lpeg.splitter(" ",unicodes)
+ data = {
+ size = size,
+ time = time,
+ format = format,
+ featuredata = featurefiles,
+ resources = {
+ filename = resolvers.unresolve(filename), -- no shortcut
+ version = otf.version,
+ creator = "context mkiv",
+ unicodes = unicodes,
+ indices = {
+ -- index to unicodes
+ },
+ duplicates = {
+ -- alternative unicodes
+ },
+ lookuptypes = {
+ },
+ },
+ metadata = {
+ -- raw metadata, not to be used
+ },
+ properties = {
+ -- normalized metadata
+ },
+ descriptions = {
+ },
+ goodies = {
+ },
+ helpers = {
+ tounicodelist = splitter,
+ tounicodetable = lpeg.Ct(splitter),
+ },
+ }
+ starttiming(data)
+ report_otf("file size: %s", size)
+ enhancers.apply(data,filename,fontdata)
+ if packdata then
+ if cleanup > 0 then
+ collectgarbage("collect")
+ end
+ enhance("pack",data,filename,nil)
+ end
+ report_otf("saving in cache: %s",filename)
+ data = containers.write(otf.cache, hash, data)
+ if cleanup > 1 then
collectgarbage("collect")
- data = containers.read(otf.cache(), hash) -- this frees the old table and load the sparse one
+ end
+ stoptiming(data)
+ if elapsedtime then -- not in generic
+ report_otf("preprocessing and caching took %s seconds",elapsedtime(data))
+ end
+ fontloader.close(fontdata) -- free memory
+ if cleanup > 3 then
+ collectgarbage("collect")
+ end
+ data = containers.read(otf.cache, hash) -- this frees the old table and load the sparse one
+ if cleanup > 2 then
collectgarbage("collect")
- else
- logs.report("load otf","loading failed (table conversion error)")
end
else
- logs.report("load otf","loading failed (file read error)")
+ data = nil
+ report_otf("loading failed (file read error)")
end
end
if data then
if trace_defining then
- logs.report("define font","loading from cache: %s",hash)
+ report_otf("loading from cache: %s",hash)
end
- otf.enhance("unpack",data,filename,false) -- no message here
- otf.add_dimensions(data)
+ enhance("unpack",data,filename,nil,false)
+ enhance("add dimensions",data,filename,nil,false)
if trace_sequences then
- otf.show_feature_order(data,filename)
+ showfeatureorder(data,filename)
end
end
return data
end
-function otf.add_dimensions(data)
+local mt = {
+ __index = function(t,k) -- maybe set it
+ if k == "height" then
+ local ht = t.boundingbox[4]
+ return ht < 0 and 0 or ht
+ elseif k == "depth" then
+ local dp = -t.boundingbox[2]
+ return dp < 0 and 0 or dp
+ elseif k == "width" then
+ return 0
+ elseif k == "name" then -- or maybe uni*
+ return forcenotdef and ".notdef"
+ end
+ end
+}
+
+actions["prepare tables"] = function(data,filename,raw)
+ data.properties.italic_correction = false
+end
+
+actions["add dimensions"] = function(data,filename)
-- todo: forget about the width if it's the defaultwidth (saves mem)
-- we could also build the marks hash here (instead of storing it)
if data then
- local force = otf.notdef
- local luatex = data.luatex
- local defaultwidth = luatex.defaultwidth or 0
- local defaultheight = luatex.defaultheight or 0
- local defaultdepth = luatex.defaultdepth or 0
- for _, d in next, data.glyphs do
- local bb, wd = d.boundingbox, d.width
- if not wd then
- d.width = defaultwidth
- elseif wd ~= 0 and d.class == "mark" then
- d.width = -wd
- end
- if force and not d.name then
- d.name = ".notdef"
- end
- if bb then
- local ht, dp = bb[4], -bb[2]
- if ht == 0 or ht < 0 then
- -- no need to set it and no negative heights, nil == 0
+ local descriptions = data.descriptions
+ local resources = data.resources
+ local defaultwidth = resources.defaultwidth or 0
+ local defaultheight = resources.defaultheight or 0
+ local defaultdepth = resources.defaultdepth or 0
+ 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 with width %s (%s) in %s",wd,d.name or "<noname>",file.basename(filename))
+ -- d.width = -wd
+ end
+ setmetatable(d,mt)
+ 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 with width %s (%s) in %s",wd,d.name or "<noname>",file.basename(filename))
+ -- 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 ht == 0 or ht < 0 then
+ -- not set
+ else
+ d.height = ht
+ end
+ if dp == 0 or dp < 0 then
+ -- not set
+ else
+ d.depth = dp
+ end
+ end
+ end
+ end
+ end
+end
+
+local function somecopy(old) -- fast one
+ if old then
+ local new = { }
+ if type(old) == "table" then
+ for k, v in next, old do
+ if k == "glyphs" then
+ -- skip
+ elseif type(v) == "table" then
+ new[k] = somecopy(v)
else
- d.height = ht
+ new[k] = v
end
- if dp == 0 or dp < 0 then
- -- no negative depths and no negative depths, nil == 0
+ end
+ else
+ for i=1,#mainfields do
+ local k = mainfields[i]
+ local v = old[k]
+ if k == "glyphs" then
+ -- skip
+ elseif type(v) == "table" then
+ new[k] = somecopy(v)
else
- d.depth = dp
+ new[k] = v
end
end
end
+ return new
+ else
+ return { }
end
end
-function otf.show_feature_order(otfdata,filename)
- local sequences = otfdata.luatex.sequences
- if sequences and #sequences > 0 then
- if trace_loading then
- logs.report("otf check","font %s has %s sequences",filename,#sequences)
- logs.report("otf check"," ")
- end
- for nos=1,#sequences do
- local sequence = sequences[nos]
- local typ = sequence.type or "no-type"
- local name = sequence.name or "no-name"
- local subtables = sequence.subtables or { "no-subtables" }
- local features = sequence.features
- if trace_loading then
- logs.report("otf check","%3i %-15s %-20s [%s]",nos,name,typ,concat(subtables,","))
- end
- if features then
- for feature, scripts in next, features do
- local tt = { }
- for script, languages in next, scripts do
- local ttt = { }
- for language, _ in next, languages do
- ttt[#ttt+1] = language
+-- not setting italic_correction and class (when nil) during
+-- table cronstruction can save some mem
+
+actions["prepare glyphs"] = function(data,filename,raw)
+ local rawglyphs = raw.glyphs
+ local rawsubfonts = raw.subfonts
+ local rawcidinfo = raw.cidinfo
+ local criterium = constructors.privateoffset
+ local private = criterium
+ local resources = data.resources
+ local metadata = data.metadata
+ local properties = data.properties
+ local descriptions = data.descriptions
+ local unicodes = resources.unicodes -- name to unicode
+ local indices = resources.indices -- index to unicode
+ local duplicates = resources.duplicates
+
+ if rawsubfonts then
+
+ metadata.subfonts = { }
+ properties.cidinfo = rawcidinfo
+
+ if rawcidinfo.registry then
+ local cidmap = fonts.cid.getmap(rawcidinfo)
+ if cidmap then
+ rawcidinfo.usedname = cidmap.usedname
+ local nofnames, nofunicodes = 0, 0
+ local cidunicodes, cidnames = cidmap.unicodes, cidmap.names
+ for cidindex=1,#rawsubfonts do
+ local subfont = rawsubfonts[cidindex]
+ local cidglyphs = subfont.glyphs
+ metadata.subfonts[cidindex] = somecopy(subfont)
+ 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
+ local name = glyph.name or cidnames[index]
+ if not unicode or unicode == -1 or unicode >= criterium then
+ unicode = cidunicodes[index]
+ end
+ if not unicode or unicode == -1 or unicode >= criterium then
+ if not name then
+ name = format("u%06X",private)
+ end
+ unicode = private
+ unicodes[name] = private
+ if trace_private then
+ report_otf("enhance: glyph %s at index 0x%04X is moved to private unicode slot U+%05X",name,index,private)
+ end
+ private = private + 1
+ nofnames = nofnames + 1
+ else
+ if not name then
+ name = format("u%06X",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,
+ name = glyph.name or name or "unknown", -- uniXXXX
+ cidindex = cidindex,
+ index = index,
+ glyph = glyph,
+ }
+
+ descriptions[unicode] = description
+ else
+ -- report_otf("potential problem: glyph 0x%04X is used but empty",index)
end
- tt[#tt+1] = format("[%s: %s]",script,concat(ttt," "))
- end
- if trace_loading then
- logs.report("otf check"," %s: %s",feature,concat(tt," "))
end
end
+ if trace_loading then
+ report_otf("cid font remapped, %s unicode points, %s symbolic names, %s glyphs",nofunicodes, nofnames, nofunicodes+nofnames)
+ end
+ elseif trace_loading then
+ report_otf("unable to remap cid font, missing cid file for %s",filename)
end
+ elseif trace_loading then
+ report_otf("font %s has no glyphs",filename)
end
- if trace_loading then
- logs.report("otf check","\n")
- end
- elseif trace_loading then
- logs.report("otf check","font %s has no sequences",filename)
- end
-end
--- todo: normalize, design_size => designsize
+ else
-otf.enhancers["reorganize mark classes"] = function(data,filename)
- if data.mark_classes then
- local unicodes = data.luatex.unicodes
- local reverse = { }
- for name, class in next, data.mark_classes do
- local t = { }
- for s in gmatch(class,"[^ ]+") do
- local us = unicodes[s]
- if type(us) == "table" then
- for u=1,#us do
- t[us[u]] = true
+ for index=0,raw.glyphcnt-1 do -- not raw.glyphmax-1 (as that will crash)
+ local glyph = rawglyphs[index]
+ if glyph then
+ local unicode = glyph.unicode
+ local name = glyph.name
+ if not unicode or unicode == -1 or unicode >= criterium then
+ unicode = private
+ unicodes[name] = private
+ if trace_private then
+ report_otf("enhance: glyph %s at index 0x%04X is moved to private unicode slot U+%05X",name,index,private)
end
+ private = private + 1
else
- t[us] = true
+ unicodes[name] = unicode
+ end
+ indices[index] = unicode
+ if not name then
+ name = format("u%06X",unicode)
end
+ descriptions[unicode] = {
+ -- width = glyph.width,
+ boundingbox = glyph.boundingbox,
+ name = name,
+ index = index,
+ glyph = glyph,
+ }
+ local altuni = glyph.altuni
+ if altuni then
+ local d = { }
+ for i=1,#altuni do
+ d[#d+1] = altuni[i].unicode
+ end
+ duplicates[unicode] = d
+ end
+ else
+ report_otf("potential problem: glyph 0x%04X is used but empty",index)
end
- reverse[name] = t
end
- data.luatex.markclasses = reverse
- data.mark_classes = nil
+
end
-end
-otf.enhancers["prepare luatex tables"] = function(data,filename)
- data.luatex = data.luatex or { }
- local luatex = data.luatex
- luatex.filename = filename
- luatex.version = otf.version
- luatex.creator = "context mkiv"
+ resources.private = private
+
end
-otf.enhancers["cleanup aat"] = function(data,filename)
- if otf.cleanup_aat then
+-- the next one is still messy but will get better when we have
+-- flattened map/enc tables in the font loader
+
+actions["check encoding"] = function(data,filename,raw)
+ local descriptions = data.descriptions
+ local resources = data.resources
+ local properties = data.properties
+ local unicodes = resources.unicodes -- name to unicode
+ local indices = resources.indices -- index to unicodes
+ local duplicates = resources.duplicates
+
+ -- begin of messy (not needed whwn cidmap)
+
+ local mapdata = raw.map or { }
+ local unicodetoindex = mapdata and mapdata.map or { }
+ -- local encname = lower(data.enc_name or raw.enc_name or mapdata.enc_name or "")
+ local encname = lower(data.enc_name or mapdata.enc_name or "")
+ local criterium = 0xFFFF -- for instance cambria has a lot of mess up there
+
+ -- end of messy
+
+ if find(encname,"unicode") then -- unicodebmp, unicodefull, ...
+ if trace_loading then
+ report_otf("checking embedded unicode map '%s'",encname)
+ end
+ for unicode, index in next, unicodetoindex do -- altuni already covers this
+ if unicode <= criterium and not descriptions[unicode] then
+ local parent = indices[index] -- why nil?
+ if parent then
+ report_otf("weird, unicode U+%05X points to U+%05X with index 0x%04X",unicode,parent,index)
+ else
+ report_otf("weird, unicode U+%05X points to nowhere with index 0x%04X",unicode,index)
+ end
+ end
+ end
+ elseif properties.cidinfo then
+ report_otf("warning: no unicode map, used cidmap '%s'",properties.cidinfo.usedname or "?")
+ else
+ report_otf("warning: non unicode map '%s', only using glyph unicode data",encname or "whatever")
+ end
+
+ if mapdata then
+ mapdata.map = { } -- clear some memory
end
end
-local function analyze_features(g, features)
- if g then
- local t, done = { }, { }
- for k=1,#g do
- local f = features or g[k].features
- if f then
- for k=1,#f do
- -- scripts and tag
- local tag = f[k].tag
- if not done[tag] then
- t[#t+1] = tag
- done[tag] = true
+-- for the moment we assume that a fotn with lookups will not use
+-- altuni so we stick to kerns only
+
+actions["add duplicates"] = function(data,filename,raw)
+ local descriptions = data.descriptions
+ local resources = data.resources
+ local properties = data.properties
+ local unicodes = resources.unicodes -- name to unicode
+ local indices = resources.indices -- index to unicodes
+ local duplicates = resources.duplicates
+
+ for unicode, d in next, duplicates do
+ for i=1,#d do
+ local u = d[i]
+ if not descriptions[u] then
+ local description = descriptions[unicode]
+ local duplicate = table.copy(description) -- else packing problem
+ duplicate.comment = format("copy of U+%05X", unicode)
+ descriptions[u] = duplicate
+ local n = 0
+ for _, description in next, descriptions do
+ if kerns then
+ local kerns = description.kerns
+ for _, k in next, kerns do
+ local ku = k[unicode]
+ if ku then
+ k[u] = ku
+ n = n + 1
+ end
+ end
end
+ -- todo: lookups etc
+ end
+ if trace_loading then
+ report_otf("duplicating U+%05X to U+%05X with index 0x%04X (%s kerns)",unicode,u,description.index,n)
end
end
end
- if #t > 0 then
- return t
+ end
+
+end
+
+-- class : nil base mark ligature component (maybe we don't need it in description)
+-- boundingbox: split into ht/dp takes more memory (larger tables and less sharing)
+
+actions["analyze glyphs"] = function(data,filename,raw) -- maybe integrate this in the previous
+ local descriptions = data.descriptions
+ local resources = data.resources
+ local metadata = data.metadata
+ local properties = data.properties
+ local italic_correction = false
+ local widths = { }
+ local marks = { }
+ for unicode, description in next, descriptions do
+ local glyph = description.glyph
+ local italic = glyph.italic_correction
+ if not italic then
+ -- skip
+ elseif italic == 0 then
+ -- skip
+ else
+ description.italic = italic
+ italic_correction = true
+ end
+ local width = glyph.width
+ widths[width] = (widths[width] or 0) + 1
+ local class = glyph.class
+ if class then
+ if class == "mark" then
+ marks[unicode] = true
+ end
+ description.class = class
+ end
+ end
+ -- flag italic
+ properties.italic_correction = italic_correction
+ -- flag marks
+ resources.marks = marks
+ -- share most common width for cjk fonts
+ local wd, most = 0, 1
+ for k,v in next, widths do
+ if v > most then
+ wd, most = k, v
+ end
+ end
+ if most > 1000 then -- maybe 500
+ if trace_loading then
+ report_otf("most common width: %s (%s times), sharing (cjk font)",wd,most)
+ end
+ for unicode, description in next, descriptions do
+ if description.width == wd then
+ -- description.width = nil
+ else
+ description.width = description.glyph.width
+ end
+ end
+ resources.defaultwidth = wd
+ else
+ for unicode, description in next, descriptions do
+ description.width = description.glyph.width
end
end
- return nil
end
-otf.enhancers["analyse features"] = function(data,filename)
- -- local luatex = data.luatex
- -- luatex.gposfeatures = analyze_features(data.gpos)
- -- luatex.gsubfeatures = analyze_features(data.gsub)
+actions["reorganize mark classes"] = function(data,filename,raw)
+ local mark_classes = raw.mark_classes
+ if mark_classes then
+ local resources = data.resources
+ local unicodes = resources.unicodes
+ local markclasses = { }
+ resources.markclasses = markclasses -- reversed
+ for name, class in next, mark_classes do
+ local t = { }
+ for s in gmatch(class,"[^ ]+") do
+ t[unicodes[s]] = true
+ end
+ markclasses[name] = t
+ end
+ end
end
-otf.enhancers["rehash features"] = function(data,filename)
+actions["reorganize features"] = function(data,filename,raw) -- combine with other
local features = { }
- data.luatex.features = features
+ data.resources.features = features
for k, what in next, otf.glists do
- local dw = data[what]
+ local dw = raw[what]
if dw then
local f = { }
features[what] = f
@@ -6299,10 +5668,16 @@ otf.enhancers["rehash features"] = function(data,filename)
for i=1,#dfeatures do
local df = dfeatures[i]
local tag = strip(lower(df.tag))
- local ft = f[tag] if not ft then ft = {} f[tag] = ft end
+ local ft = f[tag]
+ if not ft then
+ ft = { }
+ f[tag] = ft
+ end
local dscripts = df.scripts
- for script, languages in next, dscripts do
- script = strip(lower(script))
+ for i=1,#dscripts do
+ local d = dscripts[i]
+ local languages = d.langs
+ local script = strip(lower(d.script))
local fts = ft[script] if not fts then fts = {} ft[script] = fts end
for i=1,#languages do
fts[strip(lower(languages[i]))] = true
@@ -6315,279 +5690,349 @@ otf.enhancers["rehash features"] = function(data,filename)
end
end
-otf.enhancers["analyse anchors"] = function(data,filename)
- local classes = data.anchor_classes
- local luatex = data.luatex
- local anchor_to_lookup, lookup_to_anchor = { }, { }
- luatex.anchor_to_lookup, luatex.lookup_to_anchor = anchor_to_lookup, lookup_to_anchor
+actions["reorganize anchor classes"] = function(data,filename,raw)
+ local resources = data.resources
+ local anchor_to_lookup = { }
+ local lookup_to_anchor = { }
+ resources.anchor_to_lookup = anchor_to_lookup
+ resources.lookup_to_anchor = lookup_to_anchor
+ local classes = raw.anchor_classes -- anchor classes not in final table
if classes then
for c=1,#classes do
- local class = classes[c]
- local anchor = class.name
+ local class = classes[c]
+ local anchor = class.name
local lookups = class.lookup
if type(lookups) ~= "table" then
lookups = { lookups }
end
local a = anchor_to_lookup[anchor]
- if not a then a = { } anchor_to_lookup[anchor] = a end
+ if not a then
+ a = { }
+ anchor_to_lookup[anchor] = a
+ end
for l=1,#lookups do
local lookup = lookups[l]
local l = lookup_to_anchor[lookup]
- if not l then l = { } lookup_to_anchor[lookup] = l end
- l[anchor] = true
+ if l then
+ l[anchor] = true
+ else
+ l = { [anchor] = true }
+ lookup_to_anchor[lookup] = l
+ end
a[lookup] = true
end
end
end
end
-otf.enhancers["analyse marks"] = function(data,filename)
- local glyphs = data.glyphs
- local marks = { }
- data.luatex.marks = marks
- for unicode, index in next, data.luatex.indices do
- local glyph = glyphs[index]
- if glyph.class == "mark" then
- marks[unicode] = true
- end
- end
+actions["prepare tounicode"] = function(data,filename,raw)
+ fonts.mappings.addtounicode(data,filename)
end
-otf.enhancers["analyse unicodes"] = fonts.map.add_to_unicode
-
-otf.enhancers["analyse subtables"] = function(data,filename)
- data.luatex = data.luatex or { }
- local luatex = data.luatex
- local sequences = { }
- local lookups = { }
- luatex.sequences = sequences
- luatex.lookups = lookups
- for _, g in next, { data.gsub, data.gpos } do
- for k=1,#g do
- local gk = g[k]
- local typ = gk.type
- if typ == "gsub_contextchain" or typ == "gpos_contextchain" then
- gk.chain = 1
- elseif typ == "gsub_reversecontextchain" or typ == "gpos_reversecontextchain" then
- gk.chain = -1
- else
- gk.chain = 0
- end
- local features = gk.features
- if features then
- sequences[#sequences+1] = gk
- -- scripts, tag, ismac
- local t = { }
- for f=1,#features do
- local feature = features[f]
- local hash = { }
- -- only script and langs matter
- for s, languages in next, feature.scripts do
- s = lower(s)
- local h = hash[s]
- if not h then h = { } hash[s] = h end
- for l=1,#languages do
- h[strip(lower(languages[l]))] = true
+actions["reorganize subtables"] = function(data,filename,raw)
+ local resources = data.resources
+ local sequences = { }
+ local lookups = { }
+ local chainedfeatures = { }
+ resources.sequences = sequences
+ resources.lookups = lookups
+ for _, what in next, otf.glists do
+ local dw = raw[what]
+ if dw then
+ for k=1,#dw do
+ local gk = dw[k]
+ local typ = gk.type
+ local chain =
+ (typ == "gsub_contextchain" or typ == "gpos_contextchain") and 1 or
+ (typ == "gsub_reversecontextchain" or typ == "gpos_reversecontextchain") and -1 or 0
+ --
+ local subtables = gk.subtables
+ if subtables then
+ local t = { }
+ for s=1,#subtables do
+ t[s] = subtables[s].name
+ end
+ subtables = t
+ end
+ local flags, markclass = gk.flags, nil
+ if flags then
+ local t = { -- forcing false packs nicer
+ (flags.ignorecombiningmarks and "mark") or false,
+ (flags.ignoreligatures and "ligature") or false,
+ (flags.ignorebaseglyphs and "base") or false,
+ flags.r2l or false,
+ }
+ markclass = flags.mark_class
+ if markclass then
+ markclass = resources.markclasses[markclass]
+ end
+ flags = t
+ end
+ --
+ local name = gk.name
+ --
+ local features = gk.features
+ if features then
+ -- scripts, tag, ismac
+ local f = { }
+ for i=1,#features do
+ local df = features[i]
+ local tag = strip(lower(df.tag))
+ local ft = f[tag] if not ft then ft = {} f[tag] = ft end
+ local dscripts = df.scripts
+ for i=1,#dscripts do
+ local d = dscripts[i]
+ local languages = d.langs
+ local script = strip(lower(d.script))
+ local fts = ft[script] if not fts then fts = {} ft[script] = fts end
+ for i=1,#languages do
+ fts[strip(lower(languages[i]))] = true
+ end
end
end
- t[feature.tag] = hash
- end
- gk.features = t
- else
- lookups[gk.name] = gk
- gk.name = nil
- end
- local subtables = gk.subtables
- if subtables then
- local t = { }
- for s=1,#subtables do
- local subtable = subtables[s]
- local name = subtable.name
- t[#t+1] = name
- end
- gk.subtables = t
- end
- local flags = gk.flags
- if flags then
- gk.flags = { -- forcing false packs nicer
- (flags.ignorecombiningmarks and "mark") or false,
- (flags.ignoreligatures and "ligature") or false,
- (flags.ignorebaseglyphs and "base") or false,
- flags.r2l or false,
- }
- if flags.mark_class then
- gk.markclass = luatex.markclasses[flags.mark_class]
+ sequences[#sequences+1] = {
+ type = typ,
+ chain = chain,
+ flags = flags,
+ name = name,
+ subtables = subtables,
+ markclass = markclass,
+ features = f,
+ }
+ else
+ lookups[name] = {
+ type = typ,
+ chain = chain,
+ flags = flags,
+ subtables = subtables,
+ markclass = markclass,
+ }
end
end
end
end
end
-otf.enhancers["merge cid fonts"] = function(data,filename)
- -- we can also move the names to data.luatex.names which might
- -- save us some more memory (at the cost of harder tracing)
- if data.subfonts then
- if data.glyphs and next(data.glyphs) then
- logs.report("load otf","replacing existing glyph table due to subfonts")
- end
- local cidinfo = data.cidinfo
- local verbose = fonts.verbose
- if cidinfo.registry then
- local cidmap, cidname = fonts.cid.getmap(cidinfo.registry,cidinfo.ordering,cidinfo.supplement)
- if cidmap then
- cidinfo.usedname = cidmap.usedname
- local glyphs, uni_to_int, int_to_uni, nofnames, nofunicodes = { }, { }, { }, 0, 0
- local unicodes, names = cidmap.unicodes, cidmap.names
- for n, subfont in next, data.subfonts do
- for index, g in next, subfont.glyphs do
- if not next(g) then
- -- dummy entry
- else
- local unicode, name = unicodes[index], names[index]
- g.cidindex = n
- g.boundingbox = g.boundingbox -- or zerobox
- g.name = g.name or name or "unknown"
- if unicode then
- uni_to_int[unicode] = index
- int_to_uni[index] = unicode
- nofunicodes = nofunicodes + 1
- g.unicode = unicode
- elseif name then
- nofnames = nofnames + 1
- g.unicode = -1
- end
- glyphs[index] = g
- end
- end
- subfont.glyphs = nil
- end
- if trace_loading then
- logs.report("load otf","cid font remapped, %s unicode points, %s symbolic names, %s glyphs",nofunicodes, nofnames, nofunicodes+nofnames)
- end
- data.glyphs = glyphs
- data.map = data.map or { }
- data.map.map = uni_to_int
- data.map.backmap = int_to_uni
- elseif trace_loading then
- logs.report("load otf","unable to remap cid font, missing cid file for %s",filename)
- end
- elseif trace_loading then
- logs.report("load otf","font %s has no glyphs",filename)
- end
+-- test this:
+--
+-- for _, what in next, otf.glists do
+-- raw[what] = nil
+-- end
+
+actions["prepare lookups"] = function(data,filename,raw)
+ local lookups = raw.lookups
+ if lookups then
+ data.lookups = lookups
end
end
-otf.enhancers["prepare unicode"] = function(data,filename)
- local luatex = data.luatex
- if not luatex then luatex = { } data.luatex = luatex end
- local indices, unicodes, multiples, internals = { }, { }, { }, { }
- local glyphs = data.glyphs
- local mapmap = data.map
- if not mapmap then
- logs.report("load otf","no map in %s",filename)
- mapmap = { }
- data.map = { map = mapmap }
- elseif not mapmap.map then
- logs.report("load otf","no unicode map in %s",filename)
- mapmap = { }
- data.map.map = mapmap
- else
- mapmap = mapmap.map
- end
- local criterium = fonts.private
- local private = fonts.private
- for index, glyph in next, glyphs do
- if index > 0 then
- local name = glyph.name
- if name then
- local unicode = glyph.unicode
- if unicode == -1 or unicode >= criterium then
- glyph.unicode = private
- indices[private] = index
- unicodes[name] = private
- internals[index] = true
- if trace_private then
- logs.report("load otf","enhance: glyph %s at index U+%04X is moved to private unicode slot U+%04X",name,index,private)
- end
- private = private + 1
- else
- indices[unicode] = index
- unicodes[name] = unicode
- end
- end
+-- The reverse handler does a bit redundant splitting but it's seldom
+-- seen so we don' tbother too much. We could store the replacement
+-- in the current list (value instead of true) but it makes other code
+-- uglier. Maybe some day.
+
+local function t_uncover(splitter,cache,covers)
+ local result = { }
+ for n=1,#covers do
+ local cover = covers[n]
+ local uncovered = cache[cover]
+ if not uncovered then
+ uncovered = lpegmatch(splitter,cover)
+ cache[cover] = uncovered
end
+ result[n] = uncovered
end
- -- beware: the indices table is used to initialize the tfm table
- for unicode, index in next, mapmap do
- if not internals[index] then
- local name = glyphs[index].name
- if name then
- local un = unicodes[name]
- if not un then
- unicodes[name] = unicode -- or 0
- elseif type(un) == "number" then
- if un ~= unicode then
- multiples[#multiples+1] = name
- unicodes[name] = { un, unicode }
- indices[unicode] = index
- end
- else
- local ok = false
- for u=1,#un do
- if un[u] == unicode then
- ok = true
- break
- end
- end
- if not ok then
- multiples[#multiples+1] = name
- un[#un+1] = unicode
- indices[unicode] = index
- end
+ return result
+end
+
+local function t_hashed(t,cache)
+ if t then
+ local h = { }
+ for i=1,#t do
+ local ti = t[i]
+ local h = cache[ti]
+ if not h then
+ h = { }
+ for i=1,#ti do
+ h[ti] = true
end
end
+ cache[ti] = h
end
+ return h
+ else
+ return nil
end
- if trace_loading then
- if #multiples > 0 then
- logs.report("load otf","%s glyph are reused: %s",#multiples, concat(multiples," "))
- else
- logs.report("load otf","no glyph are reused")
- end
- end
- luatex.indices = indices
- luatex.unicodes = unicodes
- luatex.private = private
end
-otf.enhancers["cleanup ttf tables"] = function(data,filename)
- local ttf_tables = data.ttf_tables
- if ttf_tables then
- for k=1,#ttf_tables do
- if ttf_tables[k].data then ttf_tables[k].data = "deleted" end
+local function s_uncover(splitter,cache,cover)
+ if cover == "" then
+ return nil
+ else
+ local uncovered = cache[cover]
+ if not uncovered then
+ uncovered = lpegmatch(splitter,cover)
+ for i=1,#uncovered do
+ uncovered[i] = { [uncovered[i]] = true }
+ end
+ cache[cover] = uncovered
end
+ return uncovered
end
- data.ttf_tab_saved = nil
end
-otf.enhancers["compact glyphs"] = function(data,filename)
- table.compact(data.glyphs) -- needed?
- if data.subfonts then
- for _, subfont in next, data.subfonts do
- table.compact(subfont.glyphs) -- needed?
+local s_hashed = t_hashed
+
+local function r_uncover(splitter,cache,cover,replacements)
+ if cover == "" then
+ return nil
+ else
+ -- we always have current as { } even in the case of one
+ local uncovered = cover[1]
+ local replaced = cache[replacements]
+ if not replaced then
+ replaced = lpegmatch(splitter,replacements)
+ cache[replacements] = replaced
end
+ local nu, nr = #uncovered, #replaced
+ local r = { }
+ if nu == nr then
+ for i=1,nu do
+ r[uncovered[i]] = replaced[i]
+ end
+ end
+ return r
end
end
-otf.enhancers["reverse coverage"] = function(data,filename)
+actions["reorganize lookups"] = function(data,filename,raw)
-- we prefer the before lookups in a normal order
if data.lookups then
- for _, v in next, data.lookups do
- if v.rules then
- for _, vv in next, v.rules do
- local c = vv.coverage
- if c and c.before then
- c.before = table.reverse(c.before)
+ local splitter = data.helpers.tounicodetable
+ local cache, h_cache = { }, { }
+ for _, lookup in next, data.lookups do
+ local rules = lookup.rules
+ if rules then
+ local format = lookup.format
+ if format == "class" then
+ local before_class = lookup.before_class
+ if before_class then
+ before_class = t_uncover(splitter,cache,reversed(before_class))
+ end
+ local current_class = lookup.current_class
+ if current_class then
+ current_class = t_uncover(splitter,cache,current_class)
+ end
+ local after_class = lookup.after_class
+ if after_class then
+ after_class = t_uncover(splitter,cache,after_class)
+ end
+ for i=1,#rules do
+ local rule = rules[i]
+ local class = rule.class
+ local before = class.before
+ if before then
+ for i=1,#before do
+ before[i] = before_class[before[i]] or { }
+ end
+ rule.before = t_hashed(before,h_cache)
+ end
+ local current = class.current
+ local lookups = rule.lookups
+ if current then
+ for i=1,#current do
+ current[i] = current_class[current[i]] or { }
+ if lookups and not lookups[i] then
+ lookups[i] = false
+ end
+ end
+ rule.current = t_hashed(current,h_cache)
+ end
+ local after = class.after
+ if after then
+ for i=1,#after do
+ after[i] = after_class[after[i]] or { }
+ end
+ rule.after = t_hashed(after,h_cache)
+ end
+ rule.class = nil
+ end
+ lookup.before_class = nil
+ lookup.current_class = nil
+ lookup.after_class = nil
+ lookup.format = "coverage"
+ elseif format == "coverage" then
+ for i=1,#rules do
+ local rule = rules[i]
+ local coverage = rule.coverage
+ if coverage then
+ local before = coverage.before
+ if before then
+ before = t_uncover(splitter,cache,reversed(before))
+ rule.before = t_hashed(before,h_cache)
+ end
+ local current = coverage.current
+ if current then
+ current = t_uncover(splitter,cache,current)
+ rule.current = t_hashed(current,h_cache)
+ end
+ local after = coverage.after
+ if after then
+ after = t_uncover(splitter,cache,after)
+ rule.after = t_hashed(after,h_cache)
+ end
+ rule.coverage = nil
+ end
+ end
+ elseif format == "reversecoverage" then -- special case, single substitution only
+ for i=1,#rules do
+ local rule = rules[i]
+ local reversecoverage = rule.reversecoverage
+ if reversecoverage then
+ local before = reversecoverage.before
+ if before then
+ before = t_uncover(splitter,cache,reversed(before))
+ rule.before = t_hashed(before,h_cache)
+ end
+ local current = reversecoverage.current
+ if current then
+ current = t_uncover(splitter,cache,current)
+ rule.current = t_hashed(current,h_cache)
+ end
+ local after = reversecoverage.after
+ if after then
+ after = t_uncover(splitter,cache,after)
+ rule.after = t_hashed(after,h_cache)
+ end
+ local replacements = reversecoverage.replacements
+ if replacements then
+ rule.replacements = r_uncover(splitter,cache,current,replacements)
+ end
+ rule.reversecoverage = nil
+ end
+ end
+ elseif format == "glyphs" then
+ for i=1,#rules do
+ local rule = rules[i]
+ local glyphs = rule.glyphs
+ if glyphs then
+ local fore = glyphs.fore
+ if fore then
+ fore = s_uncover(splitter,cache,fore)
+ rule.before = s_hashed(fore,h_cache)
+ end
+ local back = glyphs.back
+ if back then
+ back = s_uncover(splitter,cache,back)
+ rule.after = s_hashed(back,h_cache)
+ end
+ local names = glyphs.names
+ if names then
+ names = s_uncover(splitter,cache,names)
+ rule.current = s_hashed(names,h_cache)
+ end
+ rule.glyphs = nil
+ end
end
end
end
@@ -6595,385 +6040,222 @@ otf.enhancers["reverse coverage"] = function(data,filename)
end
end
-otf.enhancers["check italic correction"] = function(data,filename)
- local glyphs = data.glyphs
- local ok = false
- for index, glyph in next, glyphs do
- local ic = glyph.italic_correction
- if ic then
- if ic ~= 0 then
- glyph.italic = ic
+-- to be checked italic_correction
+
+local function check_variants(unicode,the_variants,splitter,unicodes)
+ local variants = the_variants.variants
+ if variants then -- use splitter
+ local glyphs = lpegmatch(splitter,variants)
+ local done = { [unicode] = true }
+ local n = 0
+ for i=1,#glyphs do
+ local g = glyphs[i]
+ if done[g] then
+ report_otf("skipping cyclic reference U+%05X in math variant U+%05X",g,unicode)
+ elseif n == 0 then
+ n = 1
+ variants = { g }
+ else
+ n = n + 1
+ variants[n] = g
+ end
+ end
+ if n == 0 then
+ variants = nil
+ end
+ end
+ local parts = the_variants.parts
+ if parts then
+ local p = #parts
+ if p > 0 then
+ for i=1,p do
+ local pi = parts[i]
+ pi.glyph = unicodes[pi.component] or 0
+ pi.component = nil
end
- glyph.italic_correction = nil
- ok = true
+ else
+ parts = nil
end
end
- -- we can use this to avoid calculations
- otf.tables.valid_fields[#otf.tables.valid_fields+1] = "has_italic"
- data.has_italic = true
+ local italic_correction = the_variants.italic_correction
+ if italic_correction and italic_correction == 0 then
+ italic_correction = nil
+ end
+ return variants, parts, italic_correction
end
-otf.enhancers["check math"] = function(data,filename)
- if data.math then
- -- we move the math stuff into a math subtable because we then can
- -- test faster in the tfm copy
- local glyphs = data.glyphs
- local unicodes = data.luatex.unicodes
- for index, glyph in next, glyphs do
- local mk = glyph.mathkern
- local hv = glyph.horiz_variants
- local vv = glyph.vert_variants
- if mk or hv or vv then
+actions["analyze math"] = function(data,filename,raw)
+ if raw.math then
+ data.metadata.math = raw.math
+ local unicodes = data.resources.unicodes
+ local splitter = data.helpers.tounicodetable
+ for unicode, description in next, data.descriptions do
+ local glyph = description.glyph
+ local mathkerns = glyph.mathkern -- singular
+ local horiz_variants = glyph.horiz_variants
+ local vert_variants = glyph.vert_variants
+ local top_accent = glyph.top_accent
+ if mathkerns or horiz_variants or vert_variants or top_accent then
local math = { }
- glyph.math = math
- if mk then
- for k, v in next, mk do
+ if top_accent then
+ math.top_accent = top_accent
+ end
+ if mathkerns then
+ for k, v in next, mathkerns do
if not next(v) then
- mk[k] = nil
- end
- end
- math.kerns = mk
- glyph.mathkern = nil
- end
- if hv then
- math.horiz_variants = hv.variants
- local p = hv.parts
- if p then
- if #p>0 then
- for i=1,#p do
- local pi = p[i]
- pi.glyph = unicodes[pi.component] or 0
+ mathkerns[k] = nil
+ else
+ for k, v in next, v do
+ if v == 0 then
+ k[v] = nil -- height / kern can be zero
+ end
end
- math.horiz_parts = p
end
end
- local ic = hv.italic_correction
- if ic and ic ~= 0 then
- math.horiz_italic_correction = ic
- end
- glyph.horiz_variants = nil
+ math.kerns = mathkerns
end
- if vv then
- local uc = unicodes[index]
- math.vert_variants = vv.variants
- local p = vv.parts
- if p then
- if #p>0 then
- for i=1,#p do
- local pi = p[i]
- pi.glyph = unicodes[pi.component] or 0
- end
- math.vert_parts = p
- end
- end
- local ic = vv.italic_correction
- if ic and ic ~= 0 then
- math.vert_italic_correction = ic
- end
- glyph.vert_variants = nil
+ if horiz_variants then
+ math.horiz_variants, math.horiz_parts, math.horiz_italic_correction = check_variants(unicode,horiz_variants,splitter,unicodes)
end
- local ic = glyph.italic_correction
- if ic then
- if ic ~= 0 then
- math.italic_correction = ic
- end
- glyph.italic_correction = nil
+ if vert_variants then
+ math.vert_variants, math.vert_parts, math.vert_italic_correction = check_variants(unicode,vert_variants,splitter,unicodes)
end
+ local italic_correction = description.italic
+ if italic_correction and italic_correction ~= 0 then
+ math.italic_correction = italic_correction
+ end
+ description.math = math
end
end
end
end
-otf.enhancers["share widths"] = function(data,filename)
- local glyphs = data.glyphs
- local widths = { }
- for index, glyph in next, glyphs do
- local width = glyph.width
- widths[width] = (widths[width] or 0) + 1
- end
- -- share width for cjk fonts
- local wd, most = 0, 1
- for k,v in next, widths do
- if v > most then
- wd, most = k, v
- end
- end
- if most > 1000 then
- if trace_loading then
- logs.report("load otf", "most common width: %s (%s times), sharing (cjk font)",wd,most)
- end
- for k, v in next, glyphs do
- if v.width == wd then
- v.width = nil
- end
- end
- data.luatex.defaultwidth = wd
- end
-end
-
--- kern: ttf has a table with kerns
-
---~ otf.enhancers["reorganize kerns"] = function(data,filename)
---~ local glyphs, mapmap, unicodes = data.glyphs, data.luatex.indices, data.luatex.unicodes
---~ local mkdone = false
---~ for index, glyph in next, data.glyphs do
---~ if glyph.kerns then
---~ local mykerns = { }
---~ for k,v in next, glyph.kerns do
---~ local vc, vo, vl = v.char, v.off, v.lookup
---~ if vc and vo and vl then -- brrr, wrong! we miss the non unicode ones
---~ local uvc = unicodes[vc]
---~ if not uvc then
---~ if trace_loading then
---~ logs.report("load otf","problems with unicode %s of kern %s at glyph %s",vc,k,index)
---~ end
---~ else
---~ if type(vl) ~= "table" then
---~ vl = { vl }
---~ end
---~ for l=1,#vl do
---~ local vll = vl[l]
---~ local mkl = mykerns[vll]
---~ if not mkl then
---~ mkl = { }
---~ mykerns[vll] = mkl
---~ end
---~ if type(uvc) == "table" then
---~ for u=1,#uvc do
---~ mkl[uvc[u]] = vo
---~ end
---~ else
---~ mkl[uvc] = vo
---~ end
---~ end
---~ end
---~ end
---~ end
---~ glyph.mykerns = mykerns
---~ glyph.kerns = nil -- saves space and time
---~ mkdone = true
---~ end
---~ end
---~ if trace_loading and mkdone then
---~ logs.report("load otf", "replacing 'kerns' tables by 'mykerns' tables")
---~ end
---~ if data.kerns then
---~ if trace_loading then
---~ logs.report("load otf", "removing global 'kern' table")
---~ end
---~ data.kerns = nil
---~ end
---~ local dgpos = data.gpos
---~ if dgpos then
---~ for gp=1,#dgpos do
---~ local gpos = dgpos[gp]
---~ local subtables = gpos.subtables
---~ if subtables then
---~ for s=1,#subtables do
---~ local subtable = subtables[s]
---~ local kernclass = subtable.kernclass -- name is inconsistent with anchor_classes
---~ if kernclass then -- the next one is quite slow
---~ for k=1,#kernclass do
---~ local kcl = kernclass[k]
---~ local firsts, seconds, offsets, lookups = kcl.firsts, kcl.seconds, kcl.offsets, kcl.lookup -- singular
---~ if type(lookups) ~= "table" then
---~ lookups = { lookups }
---~ end
---~ for l=1,#lookups do
---~ local lookup = lookups[l]
---~ -- weird, as maxfirst and maxseconds can have holes
---~ local maxfirsts, maxseconds = getn(firsts), getn(seconds)
---~ if trace_loading then
---~ logs.report("load otf", "adding kernclass %s with %s times %s pairs",lookup, maxfirsts, maxseconds)
---~ end
---~ for fk, fv in next, firsts do
---~ for first in gmatch(fv,"[^ ]+") do
---~ local first_unicode = unicodes[first]
---~ if type(first_unicode) == "number" then
---~ first_unicode = { first_unicode }
---~ end
---~ for f=1,#first_unicode do
---~ local glyph = glyphs[mapmap[first_unicode[f]]]
---~ if glyph then
---~ local mykerns = glyph.mykerns
---~ if not mykerns then
---~ mykerns = { } -- unicode indexed !
---~ glyph.mykerns = mykerns
---~ end
---~ local lookupkerns = mykerns[lookup]
---~ if not lookupkerns then
---~ lookupkerns = { }
---~ mykerns[lookup] = lookupkerns
---~ end
---~ for sk, sv in next, seconds do
---~ local offset = offsets[(fk-1) * maxseconds + sk]
---~ --~ local offset = offsets[sk] -- (fk-1) * maxseconds + sk]
---~ for second in gmatch(sv,"[^ ]+") do
---~ local second_unicode = unicodes[second]
---~ if type(second_unicode) == "number" then
---~ lookupkerns[second_unicode] = offset
---~ else
---~ for s=1,#second_unicode do
---~ lookupkerns[second_unicode[s]] = offset
---~ end
---~ end
---~ end
---~ end
---~ elseif trace_loading then
---~ logs.report("load otf", "no glyph data for U+%04X", first_unicode[f])
---~ end
---~ end
---~ end
---~ end
---~ end
---~ end
---~ subtable.comment = "The kernclass table is merged into mykerns in the indexed glyph tables."
---~ subtable.kernclass = { }
---~ end
---~ end
---~ end
---~ end
---~ end
---~ end
-
-otf.enhancers["reorganize kerns"] = function(data,filename)
- local glyphs, mapmap, unicodes = data.glyphs, data.luatex.indices, data.luatex.unicodes
- local mkdone = false
- for index, glyph in next, data.glyphs do
- if glyph.kerns then
- local mykerns = { }
- for k,v in next, glyph.kerns do
- local vc, vo, vl = v.char, v.off, v.lookup
- if vc and vo and vl then -- brrr, wrong! we miss the non unicode ones
- local uvc = unicodes[vc]
- if not uvc then
- if trace_loading then
- logs.report("load otf","problems with unicode %s of kern %s at glyph %s",vc,k,index)
- end
- else
- if type(vl) ~= "table" then
- vl = { vl }
- end
- for l=1,#vl do
- local vll = vl[l]
- local mkl = mykerns[vll]
- if not mkl then
- mkl = { }
- mykerns[vll] = mkl
- end
- if type(uvc) == "table" then
- for u=1,#uvc do
- mkl[uvc[u]] = vo
+actions["reorganize glyph kerns"] = function(data,filename,raw)
+ local descriptions = data.descriptions
+ local resources = data.resources
+ local unicodes = resources.unicodes
+ for unicode, description in next, descriptions do
+ local kerns = description.glyph.kerns
+ if kerns then
+ local newkerns = { }
+ for k, kern in next, kerns do
+ local name = kern.char
+ local offset = kern.off
+ local lookup = kern.lookup
+ if name and offset and lookup then
+ local unicode = unicodes[name]
+ if unicode then
+ if type(lookup) == "table" then
+ for l=1,#lookup do
+ local lookup = lookup[l]
+ local lookupkerns = newkerns[lookup]
+ if lookupkerns then
+ lookupkerns[unicode] = offset
+ else
+ newkerns[lookup] = { [unicode] = offset }
end
+ end
+ else
+ local lookupkerns = newkerns[lookup]
+ if lookupkerns then
+ lookupkerns[unicode] = offset
else
- mkl[uvc] = vo
+ newkerns[lookup] = { [unicode] = offset }
end
end
+ elseif trace_loading then
+ report_otf("problems with unicode %s of kern %s of glyph U+%05X",name,k,unicode)
end
end
end
- glyph.mykerns = mykerns
- glyph.kerns = nil -- saves space and time
- mkdone = true
+ description.kerns = newkerns
end
end
- if trace_loading and mkdone then
- logs.report("load otf", "replacing 'kerns' tables by 'mykerns' tables")
- end
- if data.kerns then
- if trace_loading then
- logs.report("load otf", "removing global 'kern' table")
- end
- data.kerns = nil
- end
- local dgpos = data.gpos
- if dgpos then
- local separator = lpeg.P(" ")
- local other = ((1 - separator)^0) / unicodes
- local splitter = lpeg.Ct(other * (separator * other)^0)
- for gp=1,#dgpos do
- local gpos = dgpos[gp]
+end
+
+actions["merge kern classes"] = function(data,filename,raw)
+ local gposlist = raw.gpos
+ if gposlist then
+ local descriptions = data.descriptions
+ local resources = data.resources
+ local unicodes = resources.unicodes
+ local splitter = data.helpers.tounicodetable
+ for gp=1,#gposlist do
+ local gpos = gposlist[gp]
local subtables = gpos.subtables
if subtables then
for s=1,#subtables do
local subtable = subtables[s]
local kernclass = subtable.kernclass -- name is inconsistent with anchor_classes
if kernclass then -- the next one is quite slow
+ local split = { } -- saves time
for k=1,#kernclass do
local kcl = kernclass[k]
- local firsts, seconds, offsets, lookups = kcl.firsts, kcl.seconds, kcl.offsets, kcl.lookup -- singular
+ local firsts = kcl.firsts
+ local seconds = kcl.seconds
+ local offsets = kcl.offsets
+ local lookups = kcl.lookup -- singular
if type(lookups) ~= "table" then
lookups = { lookups }
end
- local split = { }
+ -- we can check the max in the loop
+ -- local maxseconds = getn(seconds)
+ for n, s in next, firsts do
+ split[s] = split[s] or lpegmatch(splitter,s)
+ end
+ local maxseconds = 0
+ for n, s in next, seconds do
+ if n > maxseconds then
+ maxseconds = n
+ end
+ split[s] = split[s] or lpegmatch(splitter,s)
+ end
for l=1,#lookups do
local lookup = lookups[l]
- -- weird, as maxfirst and maxseconds can have holes, first seems to be indexed, seconds starts at 2
- local maxfirsts, maxseconds = getn(firsts), getn(seconds)
- for _, s in next, firsts do
- split[s] = split[s] or lpegmatch(splitter,s)
- end
- for _, s in next, seconds do
- split[s] = split[s] or lpegmatch(splitter,s)
- end
- if trace_loading then
- logs.report("load otf", "adding kernclass %s with %s times %s pairs",lookup, maxfirsts, maxseconds)
- end
- local function do_it(fk,first_unicode)
- local glyph = glyphs[mapmap[first_unicode]]
- if glyph then
- local mykerns = glyph.mykerns
- if not mykerns then
- mykerns = { } -- unicode indexed !
- glyph.mykerns = mykerns
- end
- local lookupkerns = mykerns[lookup]
- if not lookupkerns then
- lookupkerns = { }
- mykerns[lookup] = lookupkerns
- end
+ for fk=1,#firsts do -- maxfirsts ?
+ local fv = firsts[fk]
+ local splt = split[fv]
+ if splt then
+ local extrakerns = { }
local baseoffset = (fk-1) * maxseconds
- for sk=2,maxseconds do
- local sv = seconds[sk]
- local offset = offsets[baseoffset + sk]
- --~ local offset = offsets[sk] -- (fk-1) * maxseconds + sk]
+ -- for sk=2,maxseconds do
+ -- local sv = seconds[sk]
+ for sk, sv in next, seconds do
local splt = split[sv]
- if splt then
- for i=1,#splt do
- local second_unicode = splt[i]
- if tonumber(second_unicode) then
- lookupkerns[second_unicode] = offset
- else
- for s=1,#second_unicode do
- lookupkerns[second_unicode[s]] = offset
- end
+ if splt then -- redundant test
+ local offset = offsets[baseoffset + sk]
+ if offset then
+ for i=1,#splt do
+ extrakerns[splt[i]] = offset
end
end
end
end
- elseif trace_loading then
- logs.report("load otf", "no glyph data for U+%04X", first_unicode)
- end
- end
- for fk=1,#firsts do
- local fv = firsts[fk]
- local splt = split[fv]
- if splt then
for i=1,#splt do
local first_unicode = splt[i]
- if tonumber(first_unicode) then
- do_it(fk,first_unicode)
- else
- for f=1,#first_unicode do
- do_it(fk,first_unicode[f])
+ local description = descriptions[first_unicode]
+ if description then
+ local kerns = description.kerns
+ if not kerns then
+ kerns = { } -- unicode indexed !
+ description.kerns = kerns
+ end
+ local lookupkerns = kerns[lookup]
+ if not lookupkerns then
+ lookupkerns = { }
+ kerns[lookup] = lookupkerns
end
+ for second_unicode, kern in next, extrakerns do
+ lookupkerns[second_unicode] = kern
+ end
+ elseif trace_loading then
+ report_otf("no glyph data for U+%05X", first_unicode)
end
end
end
end
end
end
- subtable.comment = "The kernclass table is merged into mykerns in the indexed glyph tables."
subtable.kernclass = { }
end
end
@@ -6982,470 +6264,311 @@ otf.enhancers["reorganize kerns"] = function(data,filename)
end
end
-otf.enhancers["strip not needed data"] = function(data,filename)
- local verbose = fonts.verbose
- local int_to_uni = data.luatex.unicodes
- for k, v in next, data.glyphs do
- local d = v.dependents
- if d then v.dependents = nil end
- local a = v.altuni
- if a then v.altuni = nil end
- if verbose then
- local code = int_to_uni[k]
- -- looks like this is done twice ... bug?
- if code then
- local vu = v.unicode
- if not vu then
- v.unicode = code
- elseif type(vu) == "table" then
- if vu[#vu] == code then
- -- weird
- else
- vu[#vu+1] = code
- end
- elseif vu ~= code then
- v.unicode = { vu, code }
- end
+actions["check glyphs"] = function(data,filename,raw)
+ for unicode, description in next, data.descriptions do
+ description.glyph = nil
+ end
+end
+
+-- future versions will remove _
+
+actions["check metadata"] = function(data,filename,raw)
+ local metadata = data.metadata
+ for _, k in next, mainfields do
+ if valid_fields[k] then
+ local v = raw[k]
+ if not metadata[k] then
+ metadata[k] = v
end
- else
- v.unicode = nil
- v.index = nil
end
end
- data.luatex.comment = "Glyph tables have their original index. When present, mykern tables are indexed by unicode."
- data.map = nil
- data.names = nil -- funny names for editors
- data.glyphcnt = nil
- data.glyphmax = nil
- if true then
- data.gpos = nil
- data.gsub = nil
- data.anchor_classes = nil
+ -- metadata.pfminfo = raw.pfminfo -- not already done?
+ local ttftables = metadata.ttf_tables
+ if ttftables then
+ for i=1,#ttftables do
+ ttftables[i].data = "deleted"
+ end
end
end
-otf.enhancers["migrate metadata"] = function(data,filename)
- local global_fields = otf.tables.global_fields
- local metadata = { }
- for k,v in next, data do
- if not global_fields[k] then
- metadata[k] = v
- data[k] = nil
- end
- end
- data.metadata = metadata
- -- goodies
- local pfminfo = data.pfminfo
- metadata.isfixedpitch = metadata.isfixedpitch or (pfminfo.panose and pfminfo.panose["proportion"] == "Monospaced")
- metadata.charwidth = pfminfo and pfminfo.avgwidth
+actions["cleanup tables"] = function(data,filename,raw)
+ data.resources.indices = nil -- not needed
+ data.helpers = nil
end
-local private_math_parameters = {
- "FractionDelimiterSize",
- "FractionDelimiterDisplayStyleSize",
-}
+-- kern: ttf has a table with kerns
+--
+-- Weird, as maxfirst and maxseconds can have holes, first seems to be indexed, but
+-- seconds can start at 2 .. this need to be fixed as getn as well as # are sort of
+-- unpredictable alternatively we could force an [1] if not set (maybe I will do that
+-- anyway).
-otf.enhancers["check math parameters"] = function(data,filename)
- local mathdata = data.metadata.math
- if mathdata then
- for m=1,#private_math_parameters do
- local pmp = private_math_parameters[m]
- if not mathdata[pmp] then
- if trace_loading then
- logs.report("load otf", "setting math parameter '%s' to 0", pmp)
- end
- mathdata[pmp] = 0
- end
- end
- end
-end
+-- we can share { } as it is never set
+
+--- ligatures have an extra specification.char entry that we don't use
+
+actions["reorganize glyph lookups"] = function(data,filename,raw)
+ local resources = data.resources
+ local unicodes = resources.unicodes
+ local descriptions = data.descriptions
+ local splitter = data.helpers.tounicodelist
+
+ local lookuptypes = resources.lookuptypes
-otf.enhancers["flatten glyph lookups"] = function(data,filename)
- for k, v in next, data.glyphs do
- local lookups = v.lookups
+ for unicode, description in next, descriptions do
+ local lookups = description.glyph.lookups
if lookups then
- for kk, vv in next, lookups do
- for kkk=1,#vv do
- local vvv = vv[kkk]
- local s = vvv.specification
- if s then
- local t = vvv.type
- if t == "ligature" then
- vv[kkk] = { "ligature", s.components, s.char }
- elseif t == "alternate" then
- vv[kkk] = { "alternate", s.components }
- elseif t == "substitution" then
- vv[kkk] = { "substitution", s.variant }
- elseif t == "multiple" then
- vv[kkk] = { "multiple", s.components }
- elseif t == "position" then
- vv[kkk] = { "position", { s.x or 0, s.y or 0, s.h or 0, s.v or 0 } }
- elseif t == "pair" then
- local one, two, paired = s.offsets[1], s.offsets[2], s.paired or ""
- if one then
- if two then
- vv[kkk] = { "pair", paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0 } }
- else
- vv[kkk] = { "pair", paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 } }
- end
+ for tag, lookuplist in next, lookups do
+ for l=1,#lookuplist do
+ local lookup = lookuplist[l]
+ local specification = lookup.specification
+ local lookuptype = lookup.type
+ local lt = lookuptypes[tag]
+ if not lt then
+ lookuptypes[tag] = lookuptype
+ elseif lt ~= lookuptype then
+ report_otf("conflicting lookuptypes: %s => %s and %s",tag,lt,lookuptype)
+ end
+ if lookuptype == "ligature" then
+ lookuplist[l] = { lpegmatch(splitter,specification.components) }
+ elseif lookuptype == "alternate" then
+ lookuplist[l] = { lpegmatch(splitter,specification.components) }
+ elseif lookuptype == "substitution" then
+ lookuplist[l] = unicodes[specification.variant]
+ elseif lookuptype == "multiple" then
+ lookuplist[l] = { lpegmatch(splitter,specification.components) }
+ elseif lookuptype == "position" then
+ lookuplist[l] = {
+ specification.x or 0,
+ specification.y or 0,
+ specification.h or 0,
+ specification.v or 0
+ }
+ elseif lookuptype == "pair" then
+ local one = specification.offsets[1]
+ local two = specification.offsets[2]
+ local paired = unicodes[specification.paired]
+ if one then
+ if two then
+ lookuplist[l] = { paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0 } }
else
- if two then
- vv[kkk] = { "pair", paired, { }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0} } -- maybe nil instead of { }
- else
- vv[kkk] = { "pair", paired }
- end
+ lookuplist[l] = { paired, { one.x or 0, one.y or 0, one.h or 0, one.v or 0 } }
end
else
- if trace_loading then
- logs.report("load otf", "flattening needed, report to context list")
- end
- for a, b in next, s do
- if trace_loading and vvv[a] then
- logs.report("load otf", "flattening conflict, report to context list")
- end
- vvv[a] = b
+ if two then
+ lookuplist[l] = { paired, { }, { two.x or 0, two.y or 0, two.h or 0, two.v or 0} } -- maybe nil instead of { }
+ else
+ lookuplist[l] = { paired }
end
- vvv.specification = nil
end
end
end
end
- end
- end
-end
-
-otf.enhancers["simplify glyph lookups"] = function(data,filename)
- for k, v in next, data.glyphs do
- local lookups = v.lookups
- if lookups then
local slookups, mlookups
- for kk, vv in next, lookups do
- if #vv == 1 then
- if not slookups then
- slookups = { }
- v.slookups = slookups
+ for tag, lookuplist in next, lookups do
+ if #lookuplist == 1 then
+ if slookups then
+ slookups[tag] = lookuplist[1]
+ else
+ slookups = { [tag] = lookuplist[1] }
end
- slookups[kk] = vv[1]
else
- if not mlookups then
- mlookups = { }
- v.mlookups = mlookups
- end
- mlookups[kk] = vv
- end
- end
- v.lookups = nil
- end
- end
-end
-
-otf.enhancers["flatten anchor tables"] = function(data,filename)
- for k, v in next, data.glyphs do
- if v.anchors then
- for kk, vv in next, v.anchors do
- for kkk, vvv in next, vv do
- if vvv.x or vvv.y then
- vv[kkk] = { vvv.x or 0, vvv.y or 0 }
+ if mlookups then
+ mlookups[tag] = lookuplist
else
- for kkkk=1,#vvv do
- local vvvv = vvv[kkkk]
- vvv[kkkk] = { vvvv.x or 0, vvvv.y or 0 }
- end
+ mlookups = { [tag] = lookuplist }
end
end
end
- end
- end
-end
-
-otf.enhancers["flatten feature tables"] = function(data,filename)
- -- is this needed? do we still use them at all?
- for _, tag in next, otf.glists do
- if data[tag] then
- if trace_loading then
- logs.report("load otf", "flattening %s table", tag)
+ if slookups then
+ description.slookups = slookups
end
- for k, v in next, data[tag] do
- local features = v.features
- if features then
- for kk=1,#features do
- local vv = features[kk]
- local t = { }
- local scripts = vv.scripts
- for kkk=1,#scripts do
- local vvv = scripts[kkk]
- t[vvv.script] = vvv.langs
- end
- vv.scripts = t
- end
- end
+ if mlookups then
+ description.mlookups = mlookups
end
end
end
-end
-
-otf.enhancers.patches = otf.enhancers.patches or { }
-otf.enhancers["patch bugs"] = function(data,filename)
- local basename = file.basename(lower(filename))
- for pattern, action in next, otf.enhancers.patches do
- if find(basename,pattern) then
- action(data,filename)
- end
- end
end
--- tex features
-
-fonts.otf.enhancers["enrich with features"] = function(data,filename)
- -- later, ctx only
-end
-
-function otf.features.register(name,default)
- otf.features.list[#otf.features.list+1] = name
- otf.features.default[name] = default
-end
-
--- for context this will become a task handler
-
-function otf.set_features(tfmdata,features)
- local processes = { }
- if features and next(features) then
- local lists = { -- why local
- fonts.triggers,
- fonts.processors,
- fonts.manipulators,
- }
- local mode = tfmdata.mode or fonts.mode -- or features.mode
- local initializers = fonts.initializers
- local fi = initializers[mode]
- if fi then
- local fiotf = fi.otf
- if fiotf then
- local done = { }
- for l=1,4 do
- local list = lists[l]
- if list then
- for i=1,#list do
- local f = list[i]
- local value = features[f]
- if value and fiotf[f] then -- brr
- if not done[f] then -- so, we can move some to triggers
- if trace_features then
- logs.report("define otf","initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown', tfmdata.fullname or 'unknown')
- end
- fiotf[f](tfmdata,value) -- can set mode (no need to pass otf)
- mode = tfmdata.mode or fonts.mode -- keep this, mode can be set local !
- local im = initializers[mode]
- if im then
- fiotf = initializers[mode].otf
- end
- done[f] = true
- end
- end
+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
+ local anchors = description.glyph.anchors
+ if anchors then
+ 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 }
end
end
- end
- end
- end
- local fm = fonts.methods[mode] -- todo: zonder node/mode otf/...
- if fm then
- local fmotf = fm.otf
- if fmotf then
- for l=1,4 do
- local list = lists[l]
- if list then
- for i=1,#list do
- local f = list[i]
- if fmotf[f] then -- brr
- if trace_features then
- logs.report("define otf","installing feature handler %s for mode %s for font %s",f,mode or 'unknown', tfmdata.fullname or 'unknown')
- end
- processes[#processes+1] = fmotf[f]
- end
- end
+ else
+ for tag, specification in next, data do
+ data[tag] = { specification.x or 0, specification.y or 0 }
end
end
end
- else
- -- message
+ description.anchors = anchors
end
end
- return processes, features
end
-function otf.otf_to_tfm(specification)
- local name = specification.name
- local sub = specification.sub
- local filename = specification.filename
- local format = specification.format
- local features = specification.features.normal
- local cache_id = specification.hash
- local tfmdata = containers.read(tfm.cache(),cache_id)
---~ print(cache_id)
- if not tfmdata then
- local otfdata = otf.load(filename,format,sub,features and features.featurefile)
- if otfdata and next(otfdata) then
- otfdata.shared = otfdata.shared or {
- featuredata = { },
- anchorhash = { },
- initialized = false,
- }
- tfmdata = otf.copy_to_tfm(otfdata,cache_id)
- if tfmdata and next(tfmdata) then
- tfmdata.unique = tfmdata.unique or { }
- tfmdata.shared = tfmdata.shared or { } -- combine
- local shared = tfmdata.shared
- shared.otfdata = otfdata
- shared.features = features -- default
- shared.dynamics = { }
- shared.processes = { }
- shared.set_dynamics = otf.set_dynamics -- fast access and makes other modules independent
- -- this will be done later anyway, but it's convenient to have
- -- them already for fast access
- tfmdata.luatex = otfdata.luatex
- tfmdata.indices = otfdata.luatex.indices
- tfmdata.unicodes = otfdata.luatex.unicodes
- tfmdata.marks = otfdata.luatex.marks
- tfmdata.originals = otfdata.luatex.originals
- tfmdata.changed = { }
- tfmdata.has_italic = otfdata.metadata.has_italic
- if not tfmdata.language then tfmdata.language = 'dflt' end
- if not tfmdata.script then tfmdata.script = 'dflt' end
- shared.processes, shared.features = otf.set_features(tfmdata,fonts.define.check(features,otf.features.default))
- end
- end
- containers.write(tfm.cache(),cache_id,tfmdata)
+-- modes: node, base, none
+
+function otf.setfeatures(tfmdata,features)
+ local okay = constructors.initializefeatures("otf",tfmdata,features,trace_features,report_otf)
+ if okay then
+ return constructors.collectprocessors("otf",tfmdata,features,trace_features,report_otf)
+ else
+ return { } -- will become false
end
- return tfmdata
end
---~ {
---~ ['boundingbox']={ 95, -458, 733, 1449 },
---~ ['class']="base",
---~ ['name']="braceleft",
---~ ['unicode']=123,
---~ ['vert_variants']={
---~ ['italic_correction']=0,
---~ ['parts']={
---~ { ['component']="uni23A9", ['endConnectorLength']=1000, ['fullAdvance']=2546, ['is_extender']=0, ['startConnectorLength']=0, }, -- bot
---~ { ['component']="uni23AA", ['endConnectorLength']=2500, ['fullAdvance']=2501, ['is_extender']=1, ['startConnectorLength']=2500, }, -- rep
---~ { ['component']="uni23A8", ['endConnectorLength']=1000, ['fullAdvance']=4688, ['is_extender']=0, ['startConnectorLength']=1000, }, -- mid
---~ { ['component']="uni23AA", ['endConnectorLength']=2500, ['fullAdvance']=2501, ['is_extender']=1, ['startConnectorLength']=2500, }, -- rep
---~ { ['component']="uni23A7", ['endConnectorLength']=0, ['fullAdvance']=2546, ['is_extender']=0, ['startConnectorLength']=1000, }, -- top
---~ },
---~ ['variants']="braceleft braceleft.vsize1 braceleft.vsize2 braceleft.vsize3 braceleft.vsize4 braceleft.vsize5 braceleft.vsize6 braceleft.vsize7",
---~ },
---~ ['width']=793,
---~ },
-
--- the first version made a top/mid/not extensible table, now we just pass on the variants data
--- and deal with it in the tfm scaler (there is no longer an extensible table anyway)
-
--- we cannot share descriptions as virtual fonts might extend them (ok, we could
--- use a cache with a hash
-
-fonts.formats.dfont = "truetype"
-fonts.formats.ttc = "truetype"
-fonts.formats.ttf = "truetype"
-fonts.formats.otf = "opentype"
-
-function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder the tma to unicode (nasty due to one->many)
+-- the first version made a top/mid/not extensible table, now we just
+-- pass on the variants data and deal with it in the tfm scaler (there
+-- is no longer an extensible table anyway)
+--
+-- we cannot share descriptions as virtual fonts might extend them (ok,
+-- we could use a cache with a hash
+--
+-- we already assing an empty tabel to characters as we can add for
+-- instance protruding info and loop over characters; one is not supposed
+-- to change descriptions and if one does so one should make a copy!
+
+local function copytotfm(data,cache_id)
if data then
- local glyphs, pfminfo, metadata = data.glyphs or { }, data.pfminfo or { }, data.metadata or { }
- local luatex = data.luatex
- local unicodes = luatex.unicodes -- names to unicodes
- local indices = luatex.indices
- local characters, parameters, math_parameters, descriptions = { }, { }, { }, { }
- local designsize = metadata.designsize or metadata.design_size or 100
+ local metadata = data.metadata
+ local resources = data.resources
+ local properties = table.derive(data.properties)
+ local descriptions = table.derive(data.descriptions)
+ local goodies = table.derive(data.goodies)
+ local characters = { }
+ local parameters = { }
+ local mathparameters = { }
+ --
+ local pfminfo = metadata.pfminfo or { }
+ local resources = data.resources
+ local unicodes = resources.unicodes
+ -- local mode = data.mode or "base"
+ local spaceunits = 500
+ local spacer = "space"
+ local designsize = metadata.designsize or metadata.design_size or 100
+ local mathspecs = metadata.math
+ --
if designsize == 0 then
designsize = 100
end
- local spaceunits = 500
- -- indices maps from unicodes to indices
- for u, i in next, indices do
- characters[u] = { } -- we need this because for instance we add protruding info and loop over characters
- descriptions[u] = glyphs[i]
- end
- -- math
- if metadata.math then
- -- parameters
- for name, value in next, metadata.math do
- math_parameters[name] = value
- end
- -- we could use a subset
- for u, char in next, characters do
- local d = descriptions[u]
+ if mathspecs then
+ for name, value in next, mathspecs do
+ mathparameters[name] = value
+ end
+ end
+ for unicode, _ in next, data.descriptions do -- use parent table
+ characters[unicode] = { }
+ end
+ if mathspecs then
+ -- we could move this to the scaler but not that much is saved
+ -- and this is cleaner
+ for unicode, character in next, characters do
+ local d = descriptions[unicode]
local m = d.math
- -- we have them shared because that packs nicer
- -- we could prepare the variants and keep 'm in descriptions
if m then
+ -- watch out: luatex uses horiz_variants for the parts
local variants = m.horiz_variants
+ local parts = m.horiz_parts
+ -- local done = { [unicode] = true }
if variants then
- local c = char
- for n in gmatch(variants,"[^ ]+") do
- local un = unicodes[n]
- if un and u ~= un then
+ local c = character
+ for i=1,#variants do
+ local un = variants[i]
+ -- if done[un] then
+ -- -- report_otf("skipping cyclic reference U+%05X in math variant U+%05X",un,unicode)
+ -- else
c.next = un
c = characters[un]
- end
- end
- c.horiz_variants = m.horiz_parts
- else
- local variants = m.vert_variants
- if variants then
- local c = char
- for n in gmatch(variants,"[^ ]+") do
- local un = unicodes[n]
- if un and u ~= un then
- c.next = un
- c = characters[un]
- end
- end
- c.vert_variants = m.vert_parts
- c.vert_italic_correction = m.vert_italic_correction
- end
+ -- done[un] = true
+ -- end
+ end -- c is now last in chain
+ c.horiz_variants = parts
+ elseif parts then
+ character.horiz_variants = parts
+ end
+ local variants = m.vert_variants
+ local parts = m.vert_parts
+ -- local done = { [unicode] = true }
+ if variants then
+ local c = character
+ for i=1,#variants do
+ local un = variants[i]
+ -- if done[un] then
+ -- -- report_otf("skipping cyclic reference U+%05X in math variant U+%05X",un,unicode)
+ -- else
+ c.next = un
+ c = characters[un]
+ -- done[un] = true
+ -- end
+ end -- c is now last in chain
+ c.vert_variants = parts
+ elseif parts then
+ character.vert_variants = parts
+ end
+ local italic_correction = m.vert_italic_correction
+ if italic_correction then
+ character.vert_italic_correction = italic_correction -- was c.
+ end
+ local top_accent = m.top_accent
+ if top_accent then
+ character.top_accent = top_accent
end
local kerns = m.kerns
if kerns then
- char.mathkerns = kerns
+ character.mathkerns = kerns
end
end
end
end
-- end math
- local endash, emdash, space = 0x20, 0x2014, "space" -- unicodes['space'], unicodes['emdash']
- if metadata.isfixedpitch then
- if descriptions[endash] then
- spaceunits, spacer = descriptions[endash].width, "space"
+ local monospaced = metadata.isfixedpitch or (pfminfo.panose and pfminfo.panose.proportion == "Monospaced")
+ local charwidth = pfminfo.avgwidth -- or unset
+ local italicangle = metadata.italicangle
+ local charxheight = pfminfo.os2_xheight and pfminfo.os2_xheight > 0 and pfminfo.os2_xheight
+ properties.monospaced = monospaced
+ parameters.italicangle = italicangle
+ parameters.charwidth = charwidth
+ parameters.charxheight = charxheight
+ --
+ local space = 0x0020 -- unicodes['space'], unicodes['emdash']
+ local emdash = 0x2014 -- unicodes['space'], unicodes['emdash']
+ if monospaced then
+ if descriptions[space] then
+ spaceunits, spacer = descriptions[space].width, "space"
end
if not spaceunits and descriptions[emdash] then
spaceunits, spacer = descriptions[emdash].width, "emdash"
end
- if not spaceunits and metadata.charwidth then
- spaceunits, spacer = metadata.charwidth, "charwidth"
+ if not spaceunits and charwidth then
+ spaceunits, spacer = charwidth, "charwidth"
end
else
- if descriptions[endash] then
- spaceunits, spacer = descriptions[endash].width, "space"
+ if descriptions[space] then
+ spaceunits, spacer = descriptions[space].width, "space"
end
if not spaceunits and descriptions[emdash] then
spaceunits, spacer = descriptions[emdash].width/2, "emdash/2"
end
- if not spaceunits and metadata.charwidth then
- spaceunits, spacer = metadata.charwidth, "charwidth"
+ if not spaceunits and charwidth then
+ spaceunits, spacer = charwidth, "charwidth"
end
end
- spaceunits = tonumber(spaceunits) or tfm.units/2 -- 500 -- brrr
+ spaceunits = tonumber(spaceunits) or 500 -- brrr
-- we need a runtime lookup because of running from cdrom or zip, brrr (shouldn't we use the basename then?)
- local filename = fonts.tfm.checked_filename(luatex)
+ local filename = constructors.checkedfilename(resources)
local fontname = metadata.fontname
local fullname = metadata.fullname or fontname
- local cidinfo = data.cidinfo
local units = metadata.units_per_em or 1000
--
- cidinfo.registry = cidinfo and cidinfo.registry or "" -- weird here, fix upstream
- --
parameters.slant = 0
parameters.space = spaceunits -- 3.333 (cmr10)
parameters.space_stretch = units/2 -- 500 -- 1.666 (cmr10)
@@ -7455,20 +6578,21 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th
if spaceunits < 2*units/5 then
-- todo: warning
end
- local italicangle = metadata.italicangle
- if italicangle then -- maybe also in afm _
- parameters.slant = parameters.slant - math.round(math.tan(italicangle*math.pi/180))
+ if italicangle then
+ parameters.italicangle = italicangle
+ parameters.italicfactor = math.cos(math.rad(90+italicangle))
+ parameters.slant = - math.round(math.tan(italicangle*math.pi/180))
end
- if metadata.isfixedpitch then
+ if monospaced then
parameters.space_stretch = 0
parameters.space_shrink = 0
- elseif otf.syncspace then --
+ elseif syncspace then --
parameters.space_stretch = spaceunits/2
parameters.space_shrink = spaceunits/3
end
parameters.extra_space = parameters.space_shrink -- 1.111 (cmr10)
- if pfminfo.os2_xheight and pfminfo.os2_xheight > 0 then
- parameters.x_height = pfminfo.os2_xheight
+ if charxheight then
+ parameters.x_height = charxheight
else
local x = 0x78 -- unicodes['x']
if x then
@@ -7479,99 +6603,109 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th
end
end
--
+ parameters.designsize = (designsize/10)*65536
+ parameters.ascender = abs(metadata.ascent or 0)
+ parameters.descender = abs(metadata.descent or 0)
+ parameters.units = units
+ --
+ properties.space = spacer
+ properties.encodingbytes = 2
+ properties.format = data.format or fonts.formats[filename] or "opentype"
+ properties.noglyphnames = true
+ properties.filename = filename
+ properties.fontname = fontname
+ properties.fullname = fullname
+ properties.psname = fontname or fullname
+ properties.name = filename or fullname
+ --
+ -- properties.name = specification.name
+ -- properties.sub = specification.sub
return {
- characters = characters,
- parameters = parameters,
- math_parameters = math_parameters,
- descriptions = descriptions,
- indices = indices,
- unicodes = unicodes,
- type = "real",
- direction = 0,
- boundarychar_label = 0,
- boundarychar = 65536,
- designsize = (designsize/10)*65536,
- spacer = "500 units",
- encodingbytes = 2,
- filename = filename,
- fontname = fontname,
- fullname = fullname,
- psname = fontname or fullname,
- name = filename or fullname,
- units = units,
- format = fonts.fontformat(filename,"opentype"),
- cidinfo = cidinfo,
- ascender = abs(metadata.ascent or 0),
- descender = abs(metadata.descent or 0),
- spacer = spacer,
- italicangle = italicangle,
+ characters = characters,
+ descriptions = descriptions,
+ parameters = parameters,
+ mathparameters = mathparameters,
+ resources = resources,
+ properties = properties,
+ goodies = goodies,
}
- else
- return nil
end
end
-otf.features.register('mathsize')
-
-function tfm.read_from_open_type(specification)
- local tfmtable = otf.otf_to_tfm(specification)
- if tfmtable then
- local otfdata = tfmtable.shared.otfdata
- tfmtable.name = specification.name
- tfmtable.sub = specification.sub
- local s = specification.size
- local m = otfdata.metadata.math
- if m then
- -- this will move to a function
- local f = specification.features
- if f then
- local f = f.normal
- if f and f.mathsize then
- local mathsize = specification.mathsize or 0
- if mathsize == 2 then
- local p = m.ScriptPercentScaleDown
- if p then
- local ps = p * specification.textsize / 100
- if trace_math then
- logs.report("define font","asked script size: %s, used: %s (%2.2f %%)",s,ps,(ps/s)*100)
- end
- s = ps
- end
- elseif mathsize == 3 then
- local p = m.ScriptScriptPercentScaleDown
- if p then
- local ps = p * specification.textsize / 100
- if trace_math then
- logs.report("define font","asked scriptscript size: %s, used: %s (%2.2f %%)",s,ps,(ps/s)*100)
- end
- s = ps
- end
- end
- end
- end
- end
- tfmtable = tfm.scale(tfmtable,s,specification.relativeid)
- if tfm.fontname_mode == "specification" then
- -- not to be used in context !
- local specname = specification.specification
- if specname then
- tfmtable.name = specname
- if trace_defining then
- logs.report("define font","overloaded fontname: '%s'",specname)
+local function otftotfm(specification)
+ local cache_id = specification.hash
+ local tfmdata = containers.read(constructors.cache,cache_id)
+ if not tfmdata then
+ local name = specification.name
+ local sub = specification.sub
+ local filename = specification.filename
+ local format = specification.format
+ local features = specification.features.normal
+ local rawdata = otf.load(filename,format,sub,features and features.featurefile)
+ if rawdata and next(rawdata) then
+ rawdata.lookuphash = { }
+ tfmdata = copytotfm(rawdata,cache_id)
+ if tfmdata and next(tfmdata) then
+ -- at this moment no characters are assigned yet, only empty slots
+ local features = constructors.checkedfeatures("otf",features)
+ local shared = tfmdata.shared
+ if not shared then
+ shared = { }
+ tfmdata.shared = shared
end
+ shared.rawdata = rawdata
+ shared.features = features -- default
+ shared.dynamics = { }
+ shared.processes = { }
+ tfmdata.changed = { }
+ shared.features = features
+ shared.processes = otf.setfeatures(tfmdata,features)
end
end
- fonts.logger.save(tfmtable,file.extname(specification.filename),specification)
+ containers.write(constructors.cache,cache_id,tfmdata)
+ end
+ return tfmdata
+end
+
+local function read_from_otf(specification)
+ local tfmdata = otftotfm(specification)
+ if tfmdata then
+ -- this late ? .. needs checking
+ tfmdata.properties.name = specification.name
+ tfmdata.properties.sub = specification.sub
+ --
+ tfmdata = constructors.scale(tfmdata,specification)
+ constructors.applymanipulators("otf",tfmdata,specification.features.normal,trace_features,report_otf)
+ constructors.setname(tfmdata,specification) -- only otf?
+ fonts.loggers.register(tfmdata,file.extname(specification.filename),specification)
+ end
+ return tfmdata
+end
+
+local function checkmathsize(tfmdata,mathsize)
+ local mathdata = tfmdata.shared.rawdata.metadata.math
+ local mathsize = tonumber(mathsize)
+ if mathdata then -- we cannot use mathparameters as luatex will complain
+ local parameters = tfmdata.parameters
+ parameters.scriptpercentage = mathdata.ScriptPercentScaleDown
+ parameters.scriptscriptpercentage = mathdata.ScriptScriptPercentScaleDown
+ parameters.mathsize = mathsize
end
---~ print(tfmtable.fullname)
- return tfmtable
end
+registerotffeature {
+ name = "mathsize",
+ description = "apply mathsize as specified in the font",
+ initializers = {
+ base = checkmathsize,
+ node = checkmathsize,
+ }
+}
+
-- helpers
-function otf.collect_lookups(otfdata,kind,script,language)
- -- maybe store this in the font
- local sequences = otfdata.luatex.sequences
+function otf.collectlookups(rawdata,kind,script,language)
+ local sequences = rawdata.resources.sequences
if sequences then
local featuremap, featurelist = { }, { }
for s=1,#sequences do
@@ -7600,527 +6734,1102 @@ function otf.collect_lookups(otfdata,kind,script,language)
return nil, nil
end
+-- readers
+
+local function check_otf(forced,specification,suffix,what)
+ local name = specification.name
+ if forced then
+ name = file.addsuffix(name,suffix,true)
+ end
+ local fullname, tfmdata = findbinfile(name,suffix) or "", nil -- one shot
+ if fullname == "" then
+ fullname = fonts.names.getfilename(name,suffix)
+ end
+ if fullname ~= "" then
+ specification.filename, specification.format = fullname, what -- hm, so we do set the filename, then
+ tfmdata = read_from_otf(specification) -- we need to do it for all matches / todo
+ end
+ return tfmdata
+end
+
+local function opentypereader(specification,suffix,what)
+ local forced = specification.forced or ""
+ if forced == "otf" then
+ return check_otf(true,specification,forced,"opentype")
+ elseif forced == "ttf" or forced == "ttc" or forced == "dfont" then
+ return check_otf(true,specification,forced,"truetype")
+ else
+ return check_otf(false,specification,suffix,what)
+ end
+end
+
+readers.opentype = opentypereader
+
+local formats = fonts.formats
+
+formats.otf = "opentype"
+formats.ttf = "truetype"
+formats.ttc = "truetype"
+formats.dfont = "truetype"
+
+function readers.otf (specification) return opentypereader(specification,"otf",formats.otf ) end
+function readers.ttf (specification) return opentypereader(specification,"ttf",formats.ttf ) end
+function readers.ttc (specification) return opentypereader(specification,"ttf",formats.ttc ) end
+function readers.dfont(specification) return opentypereader(specification,"ttf",formats.dfont) end
+
+-- this will be overloaded
+
+function otf.scriptandlanguage(tfmdata,attr)
+ local properties = tfmdata.properties
+ return properties.script or "dflt", properties.language or "dflt"
+end
+
end -- closure
do -- begin closure to overcome local limits and interference
-if not modules then modules = { } end modules ['font-otd'] = {
+if not modules then modules = { } end modules ['font-otb'] = {
version = 1.001,
comment = "companion to font-ini.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
+local 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 lpegmatch = lpeg.match
+local utfchar = utf.char
-local trace_dynamics = false trackers.register("otf.dynamics", function(v) trace_dynamics = v end)
-
-fonts = fonts or { }
-fonts.otf = fonts.otf or { }
+local trace_baseinit = false trackers.register("otf.baseinit", function(v) trace_baseinit = v end)
+local trace_singles = false trackers.register("otf.singles", function(v) trace_singles = v end)
+local trace_multiples = false trackers.register("otf.multiples", function(v) trace_multiples = v end)
+local trace_alternatives = false trackers.register("otf.alternatives", function(v) trace_alternatives = v end)
+local trace_ligatures = false trackers.register("otf.ligatures", function(v) trace_ligatures = v end)
+local trace_kerns = false trackers.register("otf.kerns", function(v) trace_kerns = v end)
+local trace_preparing = false trackers.register("otf.preparing", function(v) trace_preparing = v end)
-local otf = fonts.otf
-local fontdata = fonts.ids
+local report_prepare = logs.reporter("fonts","otf prepare")
-otf.features = otf.features or { }
-otf.features.default = otf.features.default or { }
+local fonts = fonts
+local otf = fonts.handlers.otf
-local context_setups = fonts.define.specify.context_setups
-local context_numbers = fonts.define.specify.context_numbers
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
-local a_to_script = { } otf.a_to_script = a_to_script
-local a_to_language = { } otf.a_to_language = a_to_language
+local wildcard = "*"
+local default = "dflt"
-function otf.set_dynamics(font,dynamics,attribute)
- features = context_setups[context_numbers[attribute]] -- can be moved to caller
- if features then
- local script = features.script or 'dflt'
- local language = features.language or 'dflt'
- local ds = dynamics[script]
- if not ds then
- ds = { }
- dynamics[script] = ds
- end
- local dsl = ds[language]
- if not dsl then
- dsl = { }
- ds[language] = dsl
- end
- local dsla = dsl[attribute]
- if dsla then
- -- if trace_dynamics then
- -- logs.report("otf define","using dynamics %s: attribute %s, script %s, language %s",context_numbers[attribute],attribute,script,language)
- -- end
- return dsla
+local function gref(descriptions,n)
+ if type(n) == "number" then
+ local name = descriptions[n].name
+ if name then
+ return format("U+%05X (%s)",n,name)
else
- local tfmdata = fontdata[font]
- a_to_script [attribute] = script
- a_to_language[attribute] = language
- -- we need to save some values
- local saved = {
- script = tfmdata.script,
- language = tfmdata.language,
- mode = tfmdata.mode,
- features = tfmdata.shared.features
- }
- tfmdata.mode = "node"
- tfmdata.language = language
- tfmdata.script = script
- tfmdata.shared.features = { }
- -- end of save
- dsla = otf.set_features(tfmdata,fonts.define.check(features,otf.features.default))
- if trace_dynamics then
- logs.report("otf define","setting dynamics %s: attribute %s, script %s, language %s",context_numbers[attribute],attribute,script,language)
+ return format("U+%05X")
+ end
+ elseif n then
+ local num, nam = { }, { }
+ for i=2,#n do -- first is likely a key
+ local ni = n[i]
+ num[i] = format("U+%05X",ni)
+ nam[i] = descriptions[ni].name or "?"
+ end
+ return format("%s (%s)",concat(num," "), concat(nam," "))
+ else
+ return "?"
+ end
+end
+
+local function cref(feature,lookupname)
+ if lookupname then
+ return format("feature %s, lookup %s",feature,lookupname)
+ else
+ return format("feature %s",feature)
+ end
+end
+
+local basemethods = { }
+local basemethod = "<unset>"
+
+local function applybasemethod(what,...)
+ local m = basemethods[basemethod][what]
+ if m then
+ return m(...)
+ end
+end
+
+-- We need to make sure that luatex sees the difference between
+-- base fonts that have different glyphs in the same slots in fonts
+-- that have the same fullname (or filename). LuaTeX will merge fonts
+-- eventually (and subset later on). If needed we can use a more
+-- verbose name as long as we don't use <()<>[]{}/%> and the length
+-- is < 128.
+
+local basehash, basehashes, applied = { }, 1, { }
+
+local function registerbasehash(tfmdata)
+ local properties = tfmdata.properties
+ local hash = concat(applied," ")
+ local base = basehash[hash]
+ if not base then
+ basehashes = basehashes + 1
+ base = basehashes
+ basehash[hash] = base
+ end
+ properties.basehash = base
+ properties.fullname = properties.fullname .. "-" .. base
+ -- report_prepare("fullname base hash: '%s', featureset '%s'",tfmdata.properties.fullname,hash)
+ applied = { }
+end
+
+local function registerbasefeature(feature,value)
+ applied[#applied+1] = feature .. "=" .. tostring(value)
+end
+
+-- The original basemode ligature builder used the names of components
+-- and did some expression juggling to get the chain right. The current
+-- variant starts with unicodes but still uses names to make the chain.
+-- This is needed because we have to create intermediates when needed
+-- but use predefined snippets when available. To some extend the
+-- current builder is more stupid but I don't worry that much about it
+-- as ligatures are rather predicatable.
+--
+-- Personally I think that an ff + i == ffi rule as used in for instance
+-- latin modern is pretty weird as no sane person will key that in and
+-- expect a glyph for that ligature plus the following character. Anyhow,
+-- as we need to deal with this, we do, but no guarantes are given.
+--
+-- latin modern dejavu
+--
+-- f+f 102 102 102 102
+-- f+i 102 105 102 105
+-- f+l 102 108 102 108
+-- f+f+i 102 102 105
+-- f+f+l 102 102 108 102 102 108
+-- ff+i 64256 105 64256 105
+-- ff+l 64256 108
+--
+-- As you can see here, latin modern is less complete than dejavu but
+-- in practice one will not notice it.
+--
+-- The while loop is needed because we need to resolve for instance
+-- pseudo names like hyphen_hyphen to endash so in practice we end
+-- up with a bit too many definitions but the overhead is neglectable.
+--
+-- Todo: if changed[first] or changed[second] then ... end
+
+local trace = false
+
+local function finalize_ligatures(tfmdata,ligatures)
+ local nofligatures = #ligatures
+ if nofligatures > 0 then
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local resources = tfmdata.resources
+ local unicodes = resources.unicodes
+ local private = resources.private
+ local alldone = false
+ while not alldone do
+ local done = 0
+ for i=1,nofligatures do
+ local ligature = ligatures[i]
+ if ligature then
+ local unicode, lookupdata = ligature[1], ligature[2]
+ if trace then
+ print("BUILDING",concat(lookupdata," "),unicode)
+ end
+ local size = #lookupdata
+ local firstcode = lookupdata[1] -- [2]
+ local firstdata = characters[firstcode]
+ local okay = false
+ if firstdata then
+ local firstname = "ctx_" .. firstcode
+ for i=1,size-1 do -- for i=2,size-1 do
+ local firstdata = characters[firstcode]
+ if not firstdata then
+ firstcode = private
+ if trace then
+ print(" DEFINING",firstname,firstcode)
+ end
+ unicodes[firstname] = firstcode
+ firstdata = { intermediate = true, ligatures = { } }
+ characters[firstcode] = firstdata
+ descriptions[firstcode] = { name = firstname }
+ private = private + 1
+ end
+ local target
+ local secondcode = lookupdata[i+1]
+ local secondname = firstname .. "_" .. secondcode
+ if i == size - 1 then
+ target = unicode
+ if not unicodes[secondname] then
+ unicodes[secondname] = unicode -- map final ligature onto intermediates
+ end
+ okay = true
+ else
+ target = unicodes[secondname]
+ if not target then
+ break
+ end
+ end
+ if trace then
+ print("CODES",firstname,firstcode,secondname,secondcode,target)
+ end
+ local firstligs = firstdata.ligatures
+ if firstligs then
+ firstligs[secondcode] = { char = target }
+ else
+ firstdata.ligatures = { [secondcode] = { char = target } }
+ end
+ firstcode = target
+ firstname = secondname
+ end
+ end
+ if okay then
+ ligatures[i] = false
+ done = done + 1
+ end
+ end
+ end
+ alldone = done == 0
+ end
+ if trace then
+ for k, v in next, characters do
+ if v.ligatures then table.print(v,k) end
end
- -- we need to restore some values
- tfmdata.script = saved.script
- tfmdata.language = saved.language
- tfmdata.mode = saved.mode
- tfmdata.shared.features = saved.features
- -- end of restore
- dynamics[script][language][attribute] = dsla -- cache
- return dsla
end
+ tfmdata.resources.private = private
end
- return nil -- { }
end
-end -- closure
+local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist)
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local resources = tfmdata.resources
+ local changed = tfmdata.changed
+ local unicodes = resources.unicodes
+ local lookuphash = resources.lookuphash
+ local lookuptypes = resources.lookuptypes
-do -- begin closure to overcome local limits and interference
+ local ligatures = { }
-if not modules then modules = { } end modules ['font-oti'] = {
- version = 1.001,
- comment = "companion to font-ini.mkiv",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
+ local actions = {
+ substitution = function(lookupdata,lookupname,description,unicode)
+ if trace_baseinit and trace_singles then
+ report_prepare("%s: base substitution %s => %s",cref(feature,lookupname),
+ gref(descriptions,unicode),gref(descriptions,replacement))
+ end
+ changed[unicode] = lookupdata
+ end,
+ alternate = function(lookupdata,lookupname,description,unicode)
+ local replacement = lookupdata[value] or lookupdata[#lookupdata]
+ if trace_baseinit and trace_alternatives then
+ report_prepare("%s: base alternate %s %s => %s",cref(feature,lookupname),
+ tostring(value),gref(descriptions,unicode),gref(descriptions,replacement))
+ end
+ changed[unicode] = replacement
+ end,
+ ligature = function(lookupdata,lookupname,description,unicode)
+ if trace_baseinit and trace_alternatives then
+ report_prepare("%s: base ligature %s %s => %s",cref(feature,lookupname),
+ tostring(value),gref(descriptions,lookupdata),gref(descriptions,unicode))
+ end
+ ligatures[#ligatures+1] = { unicode, lookupdata }
+ end,
+ }
--- i need to check features=yes|no also in relation to hashing
+ for unicode, character in next, characters do
+ local description = descriptions[unicode]
+ local lookups = description.slookups
+ if lookups then
+ for l=1,#lookuplist do
+ local lookupname = lookuplist[l]
+ local lookupdata = lookups[lookupname]
+ if lookupdata then
+ local lookuptype = lookuptypes[lookupname]
+ local action = actions[lookuptype]
+ if action then
+ action(lookupdata,lookupname,description,unicode)
+ end
+ end
+ end
+ end
+ local lookups = description.mlookups
+ if lookups then
+ for l=1,#lookuplist do
+ local lookupname = lookuplist[l]
+ local lookuplist = lookups[lookupname]
+ if lookuplist then
+ local lookuptype = lookuptypes[lookupname]
+ local action = actions[lookuptype]
+ if action then
+ for i=1,#lookuplist do
+ action(lookuplist[i],lookupname,description,unicode)
+ end
+ end
+ end
+ end
+ end
+ end
-local lower = string.lower
+ finalize_ligatures(tfmdata,ligatures)
+end
-local otf = fonts.otf
+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 sharedkerns = { }
+ local traceindeed = trace_baseinit and trace_kerns
+ for unicode, character in next, characters do
+ local description = descriptions[unicode]
+ local rawkerns = description.kerns -- shared
+ if rawkerns then
+ local s = sharedkerns[rawkerns]
+ if s == false then
+ -- skip
+ elseif s then
+ character.kerns = s
+ else
+ local newkerns = character.kerns
+ local done = false
+ for l=1,#lookuplist do
+ local lookup = lookuplist[l]
+ local kerns = rawkerns[lookup]
+ if kerns then
+ for otherunicode, value in next, kerns do
+ if value == 0 then
+ -- maybe no 0 test here
+ elseif not newkerns then
+ newkerns = { [otherunicode] = value }
+ done = true
+ if traceindeed then
+ report_prepare("%s: base kern %s + %s => %s",cref(feature,lookup),
+ gref(descriptions,unicode),gref(descriptions,otherunicode),value)
+ end
+ elseif not newkerns[otherunicode] then -- first wins
+ newkerns[otherunicode] = value
+ done = true
+ if traceindeed then
+ report_prepare("%s: base kern %s + %s => %s",cref(feature,lookup),
+ gref(descriptions,unicode),gref(descriptions,otherunicode),value)
+ end
+ end
+ end
+ end
+ end
+ if done then
+ sharedkerns[rawkerns] = newkerns
+ character.kerns = newkerns -- no empty assignments
+ else
+ sharedkerns[rawkerns] = false
+ end
+ end
+ end
+ end
+end
-otf.default_language = 'latn'
-otf.default_script = 'dflt'
+basemethods.independent = {
+ preparesubstitutions = preparesubstitutions,
+ preparepositionings = preparepositionings,
+}
-local languages = otf.tables.languages
-local scripts = otf.tables.scripts
+local function makefake(tfmdata,name,present)
+ local resources = tfmdata.resources
+ local private = resources.private
+ local character = { intermediate = true, ligatures = { } }
+ resources.unicodes[name] = private
+ tfmdata.characters[private] = character
+ tfmdata.descriptions[private] = { name = name }
+ resources.private = private + 1
+ present[name] = private
+ return character
+end
+
+local function make_1(present,tree,name)
+ for k, v in next, tree do
+ if k == "ligature" then
+ present[name] = v
+ else
+ make_1(present,v,name .. "_" .. k)
+ end
+ end
+end
-function otf.features.language(tfmdata,value)
- if value then
- value = lower(value)
- if languages[value] then
- tfmdata.language = value
+local function make_2(present,tfmdata,characters,tree,name,preceding,unicode,done,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 %s: U+%05X (%s), preceding U+%05X (%s)",lookupname,v,utfchar(v),preceding,utfchar(preceding))
+ end
+ character = makefake(tfmdata,name,present)
+ end
+ local ligatures = character.ligatures
+ if ligatures then
+ ligatures[unicode] = { char = v }
+ else
+ character.ligatures = { [unicode] = { char = v } }
+ end
+ if done then
+ local d = done[lookupname]
+ if not d then
+ done[lookupname] = { "dummy", v }
+ else
+ d[#d+1] = v
+ end
+ end
+ else
+ local code = present[name] or unicode
+ local name = name .. "_" .. k
+ make_2(present,tfmdata,characters,v,name,code,k,done,lookupname)
end
end
end
-function otf.features.script(tfmdata,value)
- if value then
- value = lower(value)
- if scripts[value] then
- tfmdata.script = value
+local function preparesubstitutions(tfmdata,feature,value,validlookups,lookuplist)
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local resources = tfmdata.resources
+ local changed = tfmdata.changed
+ local lookuphash = resources.lookuphash
+ local lookuptypes = resources.lookuptypes
+
+ local ligatures = { }
+
+ for l=1,#lookuplist do
+ local lookupname = lookuplist[l]
+ local lookupdata = lookuphash[lookupname]
+ local lookuptype = lookuptypes[lookupname]
+ for unicode, data in next, lookupdata do
+ if lookuptype == "substitution" then
+ if trace_baseinit and trace_singles then
+ report_prepare("%s: base substitution %s => %s",cref(feature,lookupname),
+ gref(descriptions,unicode),gref(descriptions,data))
+ end
+ changed[unicode] = data
+ elseif lookuptype == "alternate" then
+ local replacement = data[value] or data[#data]
+ if trace_baseinit and trace_alternatives then
+ report_prepare("%s: base alternate %s %s => %s",cref(feature,lookupname),
+ tostring(value),gref(descriptions,unicode),gref(descriptions,replacement))
+ end
+ changed[unicode] = replacement
+ elseif lookuptype == "ligature" then
+ ligatures[#ligatures+1] = { unicode, data, lookupname }
+ end
+ end
+ end
+
+ local nofligatures = #ligatures
+
+ if nofligatures > 0 then
+
+ local characters = tfmdata.characters
+ local present = { }
+ local done = trace_baseinit and trace_ligatures and { }
+
+ for i=1,nofligatures do
+ local ligature = ligatures[i]
+ local unicode, tree = ligature[1], ligature[2]
+ make_1(present,tree,"ctx_"..unicode)
+ end
+
+ 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)
+ end
+
+ if done then
+ for lookupname, list in next, done do
+ report_prepare("%s: base ligatures %s => %s",cref(feature,lookupname),
+ tostring(value),gref(descriptions,done))
+ end
end
+
end
+
end
-function otf.features.mode(tfmdata,value)
- if value then
- tfmdata.mode = lower(value)
+local function preparepositionings(tfmdata,feature,value,validlookups,lookuplist)
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local resources = tfmdata.resources
+ local lookuphash = resources.lookuphash
+ 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]
+ for unicode, data in next, lookupdata do
+ local character = characters[unicode]
+ local kerns = character.kerns
+ if not kerns then
+ kerns = { }
+ character.kerns = kerns
+ end
+ if traceindeed then
+ for otherunicode, kern in next, data do
+ if not kerns[otherunicode] and kern ~= 0 then
+ kerns[otherunicode] = kern
+ report_prepare("%s: base kern %s + %s => %s",cref(feature,lookup),
+ gref(descriptions,unicode),gref(descriptions,otherunicode),kern)
+ end
+ end
+ else
+ for otherunicode, kern in next, data do
+ if not kerns[otherunicode] and kern ~= 0 then
+ kerns[otherunicode] = kern
+ end
+ end
+ end
+ end
end
+
end
-fonts.initializers.base.otf.language = otf.features.language
-fonts.initializers.base.otf.script = otf.features.script
-fonts.initializers.base.otf.mode = otf.features.mode
-fonts.initializers.base.otf.method = otf.features.mode
+local function initializehashes(tfmdata)
+ nodeinitializers.features(tfmdata)
+end
-fonts.initializers.node.otf.language = otf.features.language
-fonts.initializers.node.otf.script = otf.features.script
-fonts.initializers.node.otf.mode = otf.features.mode
-fonts.initializers.node.otf.method = otf.features.mode
+basemethods.shared = {
+ initializehashes = initializehashes,
+ preparesubstitutions = preparesubstitutions,
+ preparepositionings = preparepositionings,
+}
-otf.features.register("features",true) -- we always do features
-table.insert(fonts.processors,"features") -- we need a proper function for doing this
+basemethod = "independent"
+local function featuresinitializer(tfmdata,value)
+ if true then -- value then
+ local t = trace_preparing and os.clock()
+ local features = tfmdata.shared.features
+ if features then
+ applybasemethod("initializehashes",tfmdata)
+ local collectlookups = otf.collectlookups
+ local rawdata = tfmdata.shared.rawdata
+ local properties = tfmdata.properties
+ local script = properties.script
+ local language = properties.language
+ local basesubstitutions = rawdata.resources.features.gsub
+ local basepositionings = rawdata.resources.features.gpos
+ if basesubstitutions then
+ for feature, data in next, basesubstitutions do
+ local value = features[feature]
+ if value then
+ local validlookups, lookuplist = collectlookups(rawdata,feature,script,language)
+ if validlookups then
+ applybasemethod("preparesubstitutions",tfmdata,feature,value,validlookups,lookuplist)
+ registerbasefeature(feature,value)
+ end
+ end
+ end
+ end
+ if basepositions then
+ for feature, data in next, basepositions do
+ local value = features[feature]
+ if value then
+ local validlookups, lookuplist = collectlookups(rawdata,feature,script,language)
+ if validlookups then
+ applybasemethod("preparepositionings",tfmdata,feature,features[feature],validlookups,lookuplist)
+ registerbasefeature(feature,value)
+ end
+ end
+ end
+ end
+ registerbasehash(tfmdata)
+ end
+ if trace_preparing then
+ report_prepare("preparation time is %0.3f seconds for %s",os.clock()-t,tfmdata.properties.fullname or "?")
+ end
+ end
+end
+
+registerotffeature {
+ name = "features",
+ description = "features",
+ default = true,
+ initializers = {
+--~ position = 1, -- after setscript (temp hack ... we need to force script / language to 1
+ base = featuresinitializer,
+ }
+}
+
+-- independent : collect lookups independently (takes more runtime ... neglectable)
+-- shared : shares lookups with node mode (takes more memory ... noticeable)
+
+directives.register("fonts.otf.loader.basemethod", function(v)
+ if basemethods[v] then
+ basemethod = v
+ end
+end)
end -- closure
do -- begin closure to overcome local limits and interference
-if not modules then modules = { } end modules ['font-otb'] = {
+if not modules then modules = { } end modules ['node-inj'] = {
version = 1.001,
- comment = "companion to font-ini.mkiv",
+ comment = "companion to node-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 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 lpegmatch = lpeg.match
+-- 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.
-local otf = fonts.otf
-local tfm = fonts.tfm
+local next = next
-local trace_baseinit = false trackers.register("otf.baseinit", function(v) trace_baseinit = v end)
-local trace_singles = false trackers.register("otf.singles", function(v) trace_singles = v end)
-local trace_multiples = false trackers.register("otf.multiples", function(v) trace_multiples = v end)
-local trace_alternatives = false trackers.register("otf.alternatives", function(v) trace_alternatives = v end)
-local trace_ligatures = false trackers.register("otf.ligatures", function(v) trace_ligatures = v end)
-local trace_kerns = false trackers.register("otf.kerns", function(v) trace_kerns = v end)
-local trace_preparing = false trackers.register("otf.preparing", function(v) trace_preparing = v end)
+local trace_injections = false trackers.register("nodes.injections", function(v) trace_injections = v end)
-local wildcard = "*"
-local default = "dflt"
+local report_injections = logs.reporter("nodes","injections")
-local split_at_space = lpeg.Ct(lpeg.splitat(" ")) -- no trailing or multiple spaces anyway
+local attributes, nodes, node = attributes, nodes, node
-local pcache, fcache = { }, { } -- could be weak
+fonts = fonts
+local fontdata = fonts.hashes.identifiers
-local function gref(descriptions,n)
- if type(n) == "number" then
- local name = descriptions[n].name
- if name then
- return format("U+%04X (%s)",n,name)
+nodes.injections = nodes.injections or { }
+local injections = nodes.injections
+
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
+local nodepool = nodes.pool
+local newkern = nodepool.kern
+
+local traverse_id = node.traverse_id
+local unset_attribute = node.unset_attribute
+local has_attribute = node.has_attribute
+local set_attribute = node.set_attribute
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+
+local markbase = attributes.private('markbase')
+local markmark = attributes.private('markmark')
+local markdone = attributes.private('markdone')
+local cursbase = attributes.private('cursbase')
+local curscurs = attributes.private('curscurs')
+local cursdone = attributes.private('cursdone')
+local kernpair = attributes.private('kernpair')
+
+local cursives = { }
+local marks = { }
+local kerns = { }
+
+-- 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
+
+-- for the moment we pass the r2l key ... volt/arabtype tests
+
+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
+ set_attribute(start,cursbase,bound)
+ set_attribute(nxt,curscurs,bound)
+ cursives[bound] = { rlmode, dx, dy, ws, wn }
+ return dx, dy, bound
+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 = has_attribute(current,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
else
- return format("U+%04X")
- end
- elseif n then
- local num, nam = { }, { }
- for i=1,#n do
- local ni = n[i]
- num[i] = format("U+%04X",ni)
- nam[i] = descriptions[ni].name or "?"
+ bound = #kerns + 1
+ set_attribute(current,kernpair,bound)
+ kerns[bound] = { rlmode, x, y, w, h, r2lflag, tfmchr.width }
end
- return format("%s (%s)",concat(num," "), concat(nam," "))
- else
- return "?"
+ return x, y, w, h, bound
end
+ return x, y, w, h -- no bound
end
-local function cref(kind,lookupname)
- if lookupname then
- return format("feature %s, lookup %s",kind,lookupname)
+function injections.setkern(current,factor,rlmode,x,tfmchr)
+ local dx = factor*x
+ if dx ~= 0 then
+ local bound = #kerns + 1
+ set_attribute(current,kernpair,bound)
+ kerns[bound] = { rlmode, dx }
+ return dx, bound
else
- return format("feature %s",kind)
+ return 0, 0
end
end
-local function resolve_ligatures(tfmdata,ligatures,kind)
- kind = kind or "unknown"
- local unicodes = tfmdata.unicodes
- local characters = tfmdata.characters
- local descriptions = tfmdata.descriptions
- local changed = tfmdata.changed
- local done = { }
- while true do
- local ok = false
- for k,v in next, ligatures do
- local lig = v[1]
- if not done[lig] then
- local ligs = lpegmatch(split_at_space,lig)
- if #ligs == 2 then
- local uc = v[2]
- local c, f, s = characters[uc], ligs[1], ligs[2]
- local uft, ust = unicodes[f] or 0, unicodes[s] or 0
- if not uft or not ust then
- logs.report("define otf","%s: unicode problem with base ligature %s = %s + %s",cref(kind),gref(descriptions,uc),gref(descriptions,uft),gref(descriptions,ust))
- -- some kind of error
+function injections.setmark(start,base,factor,rlmode,ba,ma,index) --ba=baseanchor, ma=markanchor
+ local dx, dy = factor*(ba[1]-ma[1]), factor*(ba[2]-ma[2])
+ local bound = has_attribute(base,markbase)
+ if bound then
+ local mb = marks[bound]
+ if mb then
+ if not index then index = #mb + 1 end
+ mb[index] = { dx, dy }
+ set_attribute(start,markmark,bound)
+ set_attribute(start,markdone,index)
+ return dx, dy, bound
+ else
+ report_injections("possible problem, U+%05X is base mark without data (id: %s)",base.char,bound)
+ end
+ end
+ index = index or 1
+ bound = #marks + 1
+ set_attribute(base,markbase,bound)
+ set_attribute(start,markmark,bound)
+ set_attribute(start,markdone,index)
+ marks[bound] = { [index] = { dx, dy, rlmode } }
+ return dx, dy, bound
+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 = has_attribute(n,kernpair)
+ local mb = has_attribute(n,markbase)
+ local mm = has_attribute(n,markmark)
+ local md = has_attribute(n,markdone)
+ local cb = has_attribute(n,cursbase)
+ local cc = has_attribute(n,curscurs)
+ report_injections("char U+%05X, font=%s",n.char,n.font)
+ if kp then
+ local k = kerns[kp]
+ if k[3] then
+ report_injections(" pairkern: dir=%s, x=%s, y=%s, w=%s, h=%s",dir(k[1]),k[2] or "?",k[3] or "?",k[4] or "?",k[5] or "?")
+ else
+ report_injections(" kern: dir=%s, dx=%s",dir(k[1]),k[2] or "?")
+ end
+ end
+ if mb then
+ report_injections(" markbase: bound=%s",mb)
+ end
+ if mm then
+ local m = marks[mm]
+ if mb then
+ local m = m[mb]
+ if m then
+ report_injections(" markmark: bound=%s, index=%s, dx=%s, dy=%s",mm,md or "?",m[1] or "?",m[2] or "?")
else
- if type(uft) == "number" then uft = { uft } end
- if type(ust) == "number" then ust = { ust } end
- for ufi=1,#uft do
- local uf = uft[ufi]
- for usi=1,#ust do
- local us = ust[usi]
- if changed[uf] or changed[us] then
- if trace_baseinit and trace_ligatures then
- logs.report("define otf","%s: base ligature %s + %s ignored",cref(kind),gref(descriptions,uf),gref(descriptions,us))
- end
- else
- local first, second = characters[uf], us
- if first and second then
- local t = first.ligatures
- if not t then
- t = { }
- first.ligatures = t
- end
- if type(uc) == "number" then
- t[second] = { type = 0, char = uc }
- else
- t[second] = { type = 0, char = uc[1] } -- can this still happen?
- end
- if trace_baseinit and trace_ligatures then
- logs.report("define otf","%s: base ligature %s + %s => %s",cref(kind),gref(descriptions,uf),gref(descriptions,us),gref(descriptions,uc))
- end
- end
- end
- end
- end
+ report_injections(" markmark: bound=%s, missing index",mm)
end
- ok, done[lig] = true, descriptions[uc].name
+ else
+ m = m[1]
+ report_injections(" markmark: bound=%s, dx=%s, dy=%s",mm,m[1] or "?",m[2] or "?")
end
end
- end
- if ok then
- -- done has "a b c" = "a_b_c" and ligatures the already set ligatures: "a b" = 123
- -- and here we add extras (f i i = fi + i and alike)
- --
- -- we could use a hash for fnc and pattern
- --
- -- this might be interfering !
- for d,n in next, done do
- local pattern = pcache[d] if not pattern then pattern = "^(" .. d .. ") " pcache[d] = pattern end
- local fnc = fcache[n] if not fnc then fnc = function() return n .. " " end fcache[n] = fnc end
- for k,v in next, ligatures do
- v[1] = gsub(v[1],pattern,fnc)
- end
+ if cb then
+ report_injections(" cursbase: bound=%s",cb)
+ end
+ if cc then
+ local c = cursives[cc]
+ report_injections(" curscurs: bound=%s, dir=%s, dx=%s, dy=%s",cc,dir(c[1]),c[2] or "?",c[3] or "?")
end
- else
- break
end
end
+ report_injections("end run")
end
-local splitter = lpeg.splitat(" ")
+-- todo: reuse tables (i.e. no collection), but will be extra fields anyway
+-- todo: check for attribute
-function prepare_base_substitutions(tfmdata,kind,value) -- we can share some code with the node features
- if value then
- local otfdata = tfmdata.shared.otfdata
- local validlookups, lookuplist = otf.collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language)
- if validlookups then
- local ligatures = { }
- local unicodes = tfmdata.unicodes -- names to unicodes
- local indices = tfmdata.indices
- local characters = tfmdata.characters
- local descriptions = tfmdata.descriptions
- local changed = tfmdata.changed
- --
- local actions = {
- substitution = function(p,lookup,k,glyph,unicode)
- local pv = p[2] -- p.variant
- if pv then
- local upv = unicodes[pv]
- if upv then
- if type(upv) == "table" then
- upv = upv[1]
+-- we can have a fast test on a font being processed, so we can check faster for marks etc
+
+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
+ end
+ if tm then
+ mk[n] = tm[n.char]
+ end
+ local k = has_attribute(n,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 characters[upv] then
- if trace_baseinit and trace_singles then
- logs.report("define otf","%s: base substitution %s => %s",cref(kind,lookup),gref(descriptions,k),gref(descriptions,upv))
- end
- changed[k] = upv
+ if w ~= 0 or x ~= 0 then
+ wx[n] = kk
end
+ rl[n] = kk[1] -- could move in test
end
end
- end,
- alternate = function(p,lookup,k,glyph,unicode)
- local pc = p[2] -- p.components
- if pc then
- -- a bit optimized ugliness
- if value == 1 then
- pc = lpegmatch(splitter,pc)
- elseif value == 2 then
- local a, b = lpegmatch(splitter,pc)
- pc = b or a
- else
- pc = { lpegmatch(splitter,pc) }
- pc = pc[value] or pc[#pc]
- end
- if pc then
- local upc = unicodes[pc]
- if upc then
- if type(upc) == "table" then
- upc = upc[1]
- end
- if characters[upc] then
- if trace_baseinit and trace_alternatives then
- logs.report("define otf","%s: base alternate %s %s => %s",cref(kind,lookup),tostring(value),gref(descriptions,k),gref(descriptions,upc))
+ 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
+ if tm then
+ mk[n] = tm[n.char]
+ end
+ end
+ end
+ 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
+ -- 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 = has_attribute(n,cursbase)
+ if p_cursbase then
+ local n_curscurs = has_attribute(n,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
- changed[k] = upc
+ 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
+ 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
- end
- end,
- ligature = function(p,lookup,k,glyph,unicode)
- local pc = p[2]
- if pc then
- if trace_baseinit and trace_ligatures then
- local upc = { lpegmatch(splitter,pc) }
- for i=1,#upc do upc[i] = unicodes[upc[i]] end
- -- we assume that it's no table
- logs.report("define otf","%s: base ligature %s => %s",cref(kind,lookup),gref(descriptions,upc),gref(descriptions,k))
- end
- ligatures[#ligatures+1] = { pc, k }
- end
- end,
- }
- --
- for k,c in next, characters do
- local glyph = descriptions[k]
- local lookups = glyph.slookups
- if lookups then
- for l=1,#lookuplist do
- local lookup = lookuplist[l]
- local p = lookups[lookup]
- if p then
- local a = actions[p[1]]
- if a then
- a(p,lookup,k,glyph,unicode)
+ 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
- local lookups = glyph.mlookups
- if lookups then
- for l=1,#lookuplist do
- local lookup = lookuplist[l]
- local ps = lookups[lookup]
- if ps then
- for i=1,#ps do
- local p = ps[i]
- local a = actions[p[1]]
- if a then
- a(p,lookup,k,glyph,unicode)
- end
- 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
- resolve_ligatures(tfmdata,ligatures,kind)
- end
- else
- tfmdata.ligatures = tfmdata.ligatures or { } -- left over from what ?
- end
-end
-
-local function prepare_base_kerns(tfmdata,kind,value) -- todo what kind of kerns, currently all
- if value then
- local otfdata = tfmdata.shared.otfdata
- local validlookups, lookuplist = otf.collect_lookups(otfdata,kind,tfmdata.script,tfmdata.language)
- if validlookups then
- local unicodes = tfmdata.unicodes -- names to unicodes
- local indices = tfmdata.indices
- local characters = tfmdata.characters
- local descriptions = tfmdata.descriptions
- local sharedkerns = { }
- for u, chr in next, characters do
- local d = descriptions[u]
- if d then
- local dk = d.mykerns -- shared
- if dk then
- local s = sharedkerns[dk]
- if s == false then
- -- skip
- elseif s then
- chr.kerns = s
- else
- local t, done = chr.kerns or { }, false
- for l=1,#lookuplist do
- local lookup = lookuplist[l]
- local kerns = dk[lookup]
- if kerns then
- for k, v in next, kerns do
- if v ~= 0 and not t[k] then -- maybe no 0 test here
- t[k], done = v, true
- if trace_baseinit and trace_kerns then
- logs.report("define otf","%s: base kern %s + %s => %s",cref(kind,lookup),gref(descriptions,u),gref(descriptions,k),v)
- end
+ if has_marks then
+ for i=1,nofvalid do
+ local p = valid[i]
+ local p_markbase = has_attribute(p,markbase)
+ if p_markbase then
+ local mrks = marks[p_markbase]
+ for n in traverse_id(glyph_code,p.next) do
+ local n_markmark = has_attribute(n,markmark)
+ if p_markbase == n_markmark then
+ local index = has_attribute(n,markdone) or 1
+ local d = mrks[index]
+ if d then
+ local rlmode = d[3]
+ if rlmode and rlmode >= 0 then
+ -- new per 2010-10-06, width adapted per 2010-02-03
+ -- we used to negate the width of marks because in tfm
+ -- that makes sense but we no longer do that so as a
+ -- consequence the sign of p.width was changed (we need
+ -- to keep an eye on it as we don't have that many fonts
+ -- that enter this branch .. i'm still not sure if this
+ -- one is right
+ local k = wx[p]
+ if k then
+ n.xoffset = p.xoffset + p.width + d[1] - k[2]
+ else
+ -- n.xoffset = p.xoffset + p.width + d[1]
+ -- lucida U\char"032F (default+mark)
+ n.xoffset = p.xoffset - p.width + d[1] -- 01-05-2011
+ end
+ else
+ local k = wx[p]
+ if k then
+ n.xoffset = p.xoffset - d[1] - k[2]
+ else
+ n.xoffset = p.xoffset - d[1]
end
end
+ if mk[p] then
+ n.yoffset = p.yoffset + d[2]
+ else
+ n.yoffset = n.yoffset + p.yoffset + d[2]
+ end
end
- end
- if done then
- sharedkerns[dk] = t
- chr.kerns = t -- no empty assignments
else
- sharedkerns[dk] = false
+ break
end
end
end
end
+ if not keep then
+ marks = { }
+ end
end
- end
- end
-end
-
--- In principle we could register each feature individually which was
--- what we did in earlier versions. However, after the rewrite it
--- made more sense to collect them in an overall features initializer
--- just as with the node variant. There it was needed because we need
--- to do complete mixed runs and not run featurewise (as we did before).
-
-local supported_gsub = {
- 'liga', 'dlig', 'rlig', 'hlig',
- 'pnum', 'onum', 'tnum', 'lnum',
- 'zero',
- 'smcp', 'cpsp', 'c2sc', 'ornm', 'aalt',
- 'hwid', 'fwid',
- 'ssty', 'rtlm', -- math
--- 'tlig', 'trep',
-}
-
-local supported_gpos = {
- 'kern'
-}
-
-function otf.features.register_base_substitution(tag)
- supported_gsub[#supported_gsub+1] = tag
-end
-function otf.features.register_base_kern(tag)
- supported_gsub[#supported_gpos+1] = tag
-end
-
-local basehash, basehashes = { }, 1
-
-function fonts.initializers.base.otf.features(tfmdata,value)
- if true then -- value then
- -- not shared
- local t = trace_preparing and os.clock()
- local features = tfmdata.shared.features
- if features then
- local h = { }
- for f=1,#supported_gsub do
- local feature = supported_gsub[f]
- local value = features[feature]
- prepare_base_substitutions(tfmdata,feature,value)
- if value then
- h[#h+1] = feature .. "=" .. tostring(value)
+ -- todo : combine
+ if next(wx) then
+ for n, k in next, wx do
+ -- only w can be nil, can be sped up when w == nil
+ local rl, x, w, r2l = k[1], k[2] or 0, k[4] or 0, k[6]
+ local wx = w - x
+ if r2l then
+ if wx ~= 0 then
+ insert_node_before(head,n,newkern(wx))
+ end
+ if x ~= 0 then
+ insert_node_after (head,n,newkern(x))
+ 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))
+ end
+ end
end
end
- for f=1,#supported_gpos do
- local feature = supported_gpos[f]
- local value = features[feature]
- prepare_base_kerns(tfmdata,feature,features[feature])
- if value then
- h[#h+1] = feature .. "=" .. tostring(value)
+ 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))
+ end
+ end
end
end
- local hash = concat(h," ")
- local base = basehash[hash]
- if not base then
- basehashes = basehashes + 1
- base = basehashes
- basehash[hash] = base
+ if not keep then
+ kerns = { }
end
- -- We need to make sure that luatex sees the difference between
- -- base fonts that have different glyphs in the same slots in fonts
- -- that have the same fullname (or filename). LuaTeX will merge fonts
- -- eventually (and subset later on). If needed we can use a more
- -- verbose name as long as we don't use <()<>[]{}/%> and the length
- -- is < 128.
- tfmdata.fullname = tfmdata.fullname .. "-" .. base -- tfmdata.psname is the original
- --~ logs.report("otf define","fullname base hash: '%s', featureset '%s'",tfmdata.fullname,hash)
+ return head, true
+ elseif not keep then
+ kerns, cursives, marks = { }, { }, { }
end
- if trace_preparing then
- logs.report("otf define","preparation time is %0.3f seconds for %s",os.clock()-t,tfmdata.fullname or "?")
+ 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 = has_attribute(n,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 r2l then
+ if wx ~= 0 then
+ insert_node_before(head,n,newkern(wx))
+ end
+ if x ~= 0 then
+ insert_node_after (head,n,newkern(x))
+ 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))
+ end
+ end
+ else
+ -- simple (e.g. kernclass kerns)
+ if x ~= 0 then
+ insert_node_before(head,n,newkern(x))
+ end
+ end
+ end
+ end
+ end
end
+ if not keep then
+ kerns = { }
+ end
+ return head, true
+ else
+ -- no tracing needed
end
+ return head, false
end
end -- closure
@@ -8139,14 +7848,6 @@ if not modules then modules = { } end modules ['font-otn'] = {
-- much functionality could only be implemented thanks to the husayni font
-- of Idris Samawi Hamid to who we dedicate this module.
--- I'm in the process of cleaning up the code (which happens in another
--- file) so don't rely on things staying the same.
-
--- some day when we can jit this, we can use more functions
-
--- we can use more lpegs when lpeg is extended with function args and so
--- resolving to unicode does not gain much
-
-- in retrospect it always looks easy but believe it or not, it took a lot
-- of work to get proper open type support done: buggy fonts, fuzzy specs,
-- special made testfonts, many skype sessions between taco, idris and me,
@@ -8161,10 +7862,7 @@ if not modules then modules = { } end modules ['font-otn'] = {
-- alternative loop quitters
-- check cursive and r2l
-- find out where ignore-mark-classes went
--- remove unused tables
--- slide tail (always glue at the end so only needed once
-- default features (per language, script)
--- cleanup kern(class) code, remove double info
-- handle positions (we need example fonts)
-- handle gpos_single (we might want an extra width field in glyph nodes because adding kerns might interfere)
@@ -8240,6 +7938,8 @@ results in different tables.</p>
-- gpos_context ok --
-- gpos_contextchain ok --
--
+-- todo: contextpos and contextsub and class stuff
+--
-- actions:
--
-- handler : actions triggered by lookup
@@ -8249,13 +7949,20 @@ results in different tables.</p>
-- 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
+-- case I will probably prefix (i.e. rename) the lookups in the cached font file.
+
local concat, insert, remove = table.concat, table.insert, table.remove
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 lpegmatch = lpeg.match
+local random = math.random
-local otf = fonts.otf
-local tfm = fonts.tfm
+local logs, trackers, nodes, attributes = logs, trackers, nodes, attributes
+
+local fonts = fonts
+local otf = fonts.handlers.otf
local trace_lookups = false trackers.register("otf.lookups", function(v) trace_lookups = v end)
local trace_singles = false trackers.register("otf.singles", function(v) trace_singles = v end)
@@ -8274,6 +7981,12 @@ local trace_steps = false trackers.register("otf.steps", function
local trace_skips = false trackers.register("otf.skips", function(v) trace_skips = v end)
local trace_directions = false trackers.register("otf.directions", function(v) trace_directions = v 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")
+
trackers.register("otf.verbose_chain", function(v) otf.setcontextchain(v and "verbose") end)
trackers.register("otf.normal_chain", function(v) otf.setcontextchain(v and "normal") end)
@@ -8284,83 +7997,84 @@ trackers.register("otf.injections","nodes.injections")
trackers.register("*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 set_attribute = node.set_attribute
-local has_attribute = node.has_attribute
+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 set_attribute = node.set_attribute
+local has_attribute = node.has_attribute
-local zwnj = 0x200C
-local zwj = 0x200D
-local wildcard = "*"
-local default = "dflt"
+local setmetatableindex = table.setmetatableindex
-local split_at_space = lpeg.splitters[" "] or lpeg.Ct(lpeg.splitat(" ")) -- no trailing or multiple spaces anyway
+local zwnj = 0x200C
+local zwj = 0x200D
+local wildcard = "*"
+local default = "dflt"
-local glyph = node.id('glyph')
-local glue = node.id('glue')
-local kern = node.id('kern')
-local disc = node.id('disc')
-local whatsit = node.id('whatsit')
+local nodecodes = nodes.nodecodes
+local whatcodes = nodes.whatcodes
+local glyphcodes = nodes.glyphcodes
-local state = attributes.private('state')
-local markbase = attributes.private('markbase')
-local markmark = attributes.private('markmark')
-local markdone = attributes.private('markdone')
-local cursbase = attributes.private('cursbase')
-local curscurs = attributes.private('curscurs')
-local cursdone = attributes.private('cursdone')
-local kernpair = attributes.private('kernpair')
+local glyph_code = nodecodes.glyph
+local glue_code = nodecodes.glue
+local disc_code = nodecodes.disc
+local whatsit_code = nodecodes.whatsit
+
+local dir_code = whatcodes.dir
+local localpar_code = whatcodes.localpar
+
+local ligature_code = glyphcodes.ligature
-local set_mark = nodes.set_mark
-local set_cursive = nodes.set_cursive
-local set_kern = nodes.set_kern
-local set_pair = nodes.set_pair
+local privateattribute = attributes.private
-local markonce = true
-local cursonce = true
-local kernonce = true
+local state = privateattribute('state')
+local markbase = privateattribute('markbase')
+local markmark = privateattribute('markmark')
+local markdone = privateattribute('markdone')
+local cursbase = privateattribute('cursbase')
+local curscurs = privateattribute('curscurs')
+local cursdone = privateattribute('cursdone')
+local kernpair = privateattribute('kernpair')
-local fontdata = fonts.ids
+local injections = nodes.injections
+local setmark = injections.setmark
+local setcursive = injections.setcursive
+local setkern = injections.setkern
+local setpair = injections.setpair
-otf.features.process = { }
+local markonce = true
+local cursonce = true
+local kernonce = true
+
+local fonthashes = fonts.hashes
+local fontdata = fonthashes.identifiers
+
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
+
+local onetimemessage = fonts.loggers.onetimemessage
-- we share some vars here, after all, we have no nested lookups and
-- less code
-local tfmdata = false
-local otfdata = false
-local characters = false
-local descriptions = false
-local marks = false
-local indices = false
-local unicodes = false
-local currentfont = false
-local lookuptable = false
-local anchorlookups = false
-local handlers = { }
-local rlmode = 0
-local featurevalue = false
-
--- we cheat a bit and assume that a font,attr combination are kind of ranged
-
-local context_setups = fonts.define.specify.context_setups
-local context_numbers = fonts.define.specify.context_numbers
-local context_merged = fonts.define.specify.context_merged
-
--- we cannot optimize with "start = first_character(head)" because then we don't
+local tfmdata = false
+local characters = false
+local descriptions = false
+local resources = false
+local marks = false
+local currentfont = false
+local lookuptable = false
+local anchorlookups = false
+local lookuptypes = false
+local handlers = { }
+local rlmode = 0
+local featurevalue = false
+
+-- we cannot optimize with "start = first_glyph(head)" because then we don't
-- know which rlmode we're in which messes up cursive handling later on
--
-- head is always a whatsit so we can safely assume that head is not changed
-local special_attributes = {
- init = 1,
- medi = 2,
- fina = 3,
- isol = 4
-}
-
-- we use this for special testing and documentation
local checkstep = (nodes and nodes.tracers and nodes.tracers.steppers.check) or function() end
@@ -8371,10 +8085,11 @@ local function logprocess(...)
if trace_steps then
registermessage(...)
end
- logs.report("otf direct",...)
+ report_direct(...)
end
+
local function logwarning(...)
- logs.report("otf direct",...)
+ report_direct(...)
end
local function gref(n)
@@ -8382,9 +8097,9 @@ local function gref(n)
local description = descriptions[n]
local name = description and description.name
if name then
- return format("U+%04X (%s)",n,name)
+ return format("U+%05X (%s)",n,name)
else
- return format("U+%04X",n)
+ return format("U+%05X",n)
end
elseif not n then
return "<error in tracing>"
@@ -8392,9 +8107,11 @@ local function gref(n)
local num, nam = { }, { }
for i=1,#n do
local ni = n[i]
- num[#num+1] = format("U+%04X",ni)
- local dni = descriptions[ni]
- nam[#num] = (dni and dni.name) or "?"
+ if tonumber(ni) then -- later we will start at 2
+ local di = descriptions[ni]
+ num[i] = format("U+%05X",ni)
+ nam[i] = di and di.name or "?"
+ end
end
return format("%s (%s)",concat(num," "), concat(nam," "))
end
@@ -8432,89 +8149,77 @@ local function markstoligature(kind,lookupname,start,stop,char)
snext.prev = current
end
start.prev, stop.next = nil, nil
- current.char, current.subtype, current.components = char, 2, start
+ current.char, current.subtype, current.components = char, ligature_code, start
return keep
end
local function toligature(kind,lookupname,start,stop,char,markflag,discfound) -- brr head
- if start ~= stop then
---~ if discfound then
---~ local lignode = copy_node(start)
---~ lignode.font = start.font
---~ lignode.char = char
---~ lignode.subtype = 2
---~ start = node.do_ligature_n(start, stop, lignode)
---~ if start.id == disc then
---~ local prev = start.prev
---~ start = start.next
---~ end
- if discfound then
- -- print("start->stop",nodes.tosequence(start,stop))
- local lignode = copy_node(start)
- lignode.font, lignode.char, lignode.subtype = start.font, char, 2
- local next, prev = stop.next, start.prev
- stop.next = nil
- lignode = node.do_ligature_n(start, stop, lignode)
- prev.next = lignode
- if next then
- next.prev = lignode
- end
- lignode.next, lignode.prev = next, prev
- start = lignode
- -- print("start->end",nodes.tosequence(start))
- else -- start is the ligature
- local deletemarks = markflag ~= "mark"
- local n = copy_node(start)
- local current
- current, start = insert_node_after(start,start,n)
- local snext = stop.next
- current.next = snext
- if snext then
- snext.prev = current
- end
- start.prev, stop.next = nil, nil
- current.char, current.subtype, current.components = char, 2, start
- local head = current
- if deletemarks then
- if trace_marks then
- while start do
- if marks[start.char] then
- logwarning("%s: remove mark %s",pref(kind,lookupname),gref(start.char))
- end
- start = start.next
- end
- end
- else
- local i = 0
+ if start == stop then
+ start.char = char
+ elseif discfound then
+ -- print("start->stop",nodes.tosequence(start,stop))
+ local lignode = copy_node(start)
+ lignode.font, lignode.char, lignode.subtype = start.font, char, ligature_code
+ local next, prev = stop.next, start.prev
+ stop.next = nil
+ lignode = node.do_ligature_n(start, stop, lignode)
+ prev.next = lignode
+ if next then
+ next.prev = lignode
+ end
+ lignode.next, lignode.prev = next, prev
+ start = lignode
+ -- print("start->end",nodes.tosequence(start))
+ else -- start is the ligature
+ local deletemarks = markflag ~= "mark"
+ local n = copy_node(start)
+ local current
+ current, start = insert_node_after(start,start,n)
+ local snext = stop.next
+ current.next = snext
+ if snext then
+ snext.prev = current
+ end
+ start.prev, stop.next = nil, nil
+ current.char, current.subtype, current.components = char, ligature_code, start
+ local head = current
+ if deletemarks then
+ if trace_marks then
while start do
if marks[start.char] then
- set_attribute(start,markdone,i)
- if trace_marks then
- logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(start.char),i)
- end
- head, current = insert_node_after(head,current,copy_node(start))
- else
- i = i + 1
+ logwarning("%s: remove mark %s",pref(kind,lookupname),gref(start.char))
end
start = start.next
end
- start = current.next
- while start and start.id == glyph do
- if marks[start.char] then
- set_attribute(start,markdone,i)
- if trace_marks then
- logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(start.char),i)
- end
- else
- break
+ end
+ else
+ local i = 0
+ while start do
+ if marks[start.char] then
+ set_attribute(start,markdone,i)
+ if trace_marks then
+ logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(start.char),i)
+ end
+ head, current = insert_node_after(head,current,copy_node(start))
+ else
+ i = i + 1
+ end
+ start = start.next
+ end
+ start = current.next
+ while start and start.id == glyph_code do
+ if marks[start.char] then
+ set_attribute(start,markdone,i)
+ if trace_marks then
+ logwarning("%s: keep mark %s, gets index %s",pref(kind,lookupname),gref(start.char),i)
end
- start = start.next
+ else
+ break
end
+ start = start.next
end
- return head
end
- else
- start.char = char
+ return head
end
return start
end
@@ -8530,7 +8235,7 @@ end
local function alternative_glyph(start,alternatives,kind,chainname,chainlookupname,lookupname) -- chainname and chainlookupname optional
local value, choice, n = featurevalue or tfmdata.shared.features[kind], nil, #alternatives -- global value, brrr
if value == "random" then
- local r = math.random(1,n)
+ local r = random(1,n)
value, choice = format("random, choice %s",r), alternatives[r]
elseif value == "first" then
value, choice = format("first, choice %s",1), alternatives[1]
@@ -8557,6 +8262,33 @@ local function alternative_glyph(start,alternatives,kind,chainname,chainlookupna
return choice, value
end
+local function multiple_glyphs(start,multiple)
+ local nofmultiples = #multiple
+ if nofmultiples > 0 then
+ start.char = multiple[1]
+ if nofmultiples > 1 then
+ local sn = start.next
+ for k=2,nofmultiples do -- todo: use insert_node
+ local n = copy_node(start)
+ n.char = multiple[k]
+ n.next = sn
+ n.prev = start
+ if sn then
+ sn.prev = n
+ end
+ start.next = n
+ start = n
+ end
+ end
+ return start, true
+ else
+ if trace_multiples then
+ logprocess("no multiple for %s",gref(start.char))
+ end
+ return start, false
+ end
+end
+
function handlers.gsub_alternate(start,kind,lookupname,alternative,sequence)
local choice, index = alternative_glyph(start,alternative,kind,lookupname)
if trace_alternatives then
@@ -8570,41 +8302,21 @@ function handlers.gsub_multiple(start,kind,lookupname,multiple)
if trace_multiples then
logprocess("%s: replacing %s by multiple %s",pref(kind,lookupname),gref(start.char),gref(multiple))
end
- start.char = multiple[1]
- if #multiple > 1 then
- for k=2,#multiple do
- local n = copy_node(start)
- n.char = multiple[k]
- local sn = start.next
- n.next = sn
- n.prev = start
- if sn then
- sn.prev = n
- end
- start.next = n
- start = n
- end
- end
- return start, true
+ return multiple_glyphs(start,multiple)
end
-function handlers.gsub_ligature(start,kind,lookupname,ligature,sequence) --or maybe pass lookup ref
+function handlers.gsub_ligature(start,kind,lookupname,ligature,sequence)
local s, stop, discfound = start.next, nil, false
local startchar = start.char
if marks[startchar] then
while s do
local id = s.id
- if id == glyph and s.subtype<256 then
- if s.font == currentfont then
- local char = s.char
- local lg = ligature[1][char]
- if not lg then
- break
- else
- stop = s
- ligature = lg
- s = s.next
- end
+ if id == glyph_code and s.subtype<256 and s.font == currentfont then
+ local lg = ligature[s.char]
+ if lg then
+ stop = s
+ ligature = lg
+ s = s.next
else
break
end
@@ -8612,54 +8324,64 @@ function handlers.gsub_ligature(start,kind,lookupname,ligature,sequence) --or ma
break
end
end
- if stop and ligature[2] then
- if trace_ligatures then
- local stopchar = stop.char
- start = markstoligature(kind,lookupname,start,stop,ligature[2])
- logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ if stop then
+ local lig = ligature.ligature
+ if lig then
+ if trace_ligatures then
+ local stopchar = stop.char
+ start = markstoligature(kind,lookupname,start,stop,lig)
+ logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ else
+ start = markstoligature(kind,lookupname,start,stop,lig)
+ end
+ return start, true
else
- start = markstoligature(kind,lookupname,start,stop,ligature[2])
+ -- ok, goto next lookup
end
- return start, true
end
else
local skipmark = sequence.flags[1]
while s do
local id = s.id
- if id == glyph and s.subtype<256 then
+ if id == glyph_code and s.subtype<256 then
if s.font == currentfont then
local char = s.char
if skipmark and marks[char] then
s = s.next
else
- local lg = ligature[1][char]
- if not lg then
- break
- else
+ local lg = ligature[char]
+ if lg then
stop = s
ligature = lg
s = s.next
+ else
+ break
end
end
else
break
end
- elseif id == disc then
+ elseif id == disc_code then
discfound = true
s = s.next
else
break
end
end
- if stop and ligature[2] then
- if trace_ligatures then
- local stopchar = stop.char
- start = toligature(kind,lookupname,start,stop,ligature[2],skipmark,discfound)
- logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ if stop then
+ local lig = ligature.ligature
+ if lig then
+ if trace_ligatures then
+ local stopchar = stop.char
+ start = toligature(kind,lookupname,start,stop,lig,skipmark,discfound)
+ logprocess("%s: replacing %s upto %s by ligature %s",pref(kind,lookupname),gref(startchar),gref(stopchar),gref(start.char))
+ else
+ start = toligature(kind,lookupname,start,stop,lig,skipmark,discfound)
+ end
+ return start, true
else
- start = toligature(kind,lookupname,start,stop,ligature[2],skipmark,discfound)
+ -- ok, goto next lookup
end
- return start, true
end
end
return start, false
@@ -8674,12 +8396,12 @@ function handlers.gpos_mark2base(start,kind,lookupname,markanchors,sequence)
local markchar = start.char
if marks[markchar] then
local base = start.prev -- [glyph] [start=mark]
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
local basechar = base.char
if marks[basechar] then
while true do
base = base.prev
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
basechar = base.char
if not marks[basechar] then
break
@@ -8704,7 +8426,7 @@ function handlers.gpos_mark2base(start,kind,lookupname,markanchors,sequence)
if al[anchor] then
local ma = markanchors[anchor]
if ma then
- local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%s,%s)",
pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -8719,7 +8441,7 @@ function handlers.gpos_mark2base(start,kind,lookupname,markanchors,sequence)
end
else -- if trace_bugs then
-- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar))
- fonts.register_message(currentfont,basechar,"no base anchors")
+ onetimemessage(currentfont,basechar,"no base anchors",report_fonts)
end
elseif trace_bugs then
logwarning("%s: prev node is no char",pref(kind,lookupname))
@@ -8736,13 +8458,13 @@ function handlers.gpos_mark2ligature(start,kind,lookupname,markanchors,sequence)
if marks[markchar] then
local base = start.prev -- [glyph] [optional marks] [start=mark]
local index = 1
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
local basechar = base.char
if marks[basechar] then
index = index + 1
while true do
base = base.prev
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
basechar = base.char
if marks[basechar] then
index = index + 1
@@ -8772,7 +8494,7 @@ function handlers.gpos_mark2ligature(start,kind,lookupname,markanchors,sequence)
if ma then
ba = ba[index]
if ba then
- local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma,index)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,index)
if trace_marks then
logprocess("%s, anchor %s, index %s, bound %s: anchoring mark %s to baselig %s at index %s => (%s,%s)",
pref(kind,lookupname),anchor,index,bound,gref(markchar),gref(basechar),index,dx,dy)
@@ -8789,7 +8511,7 @@ function handlers.gpos_mark2ligature(start,kind,lookupname,markanchors,sequence)
end
else -- if trace_bugs then
-- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar))
- fonts.register_message(currentfont,basechar,"no base anchors")
+ onetimemessage(currentfont,basechar,"no base anchors",report_fonts)
end
elseif trace_bugs then
logwarning("%s: prev node is no char",pref(kind,lookupname))
@@ -8806,7 +8528,7 @@ function handlers.gpos_mark2mark(start,kind,lookupname,markanchors,sequence)
--~ local alreadydone = markonce and has_attribute(start,markmark)
--~ if not alreadydone then
local base = start.prev -- [glyph] [basemark] [start=mark]
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then -- subtype test can go
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then -- subtype test can go
local basechar = base.char
local baseanchors = descriptions[basechar]
if baseanchors then
@@ -8819,7 +8541,7 @@ function handlers.gpos_mark2mark(start,kind,lookupname,markanchors,sequence)
if al[anchor] then
local ma = markanchors[anchor]
if ma then
- local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%s,%s)",
pref(kind,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -8835,7 +8557,7 @@ function handlers.gpos_mark2mark(start,kind,lookupname,markanchors,sequence)
end
else -- if trace_bugs then
-- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(basechar))
- fonts.register_message(currentfont,basechar,"no base anchors")
+ onetimemessage(currentfont,basechar,"no base anchors",report_fonts)
end
elseif trace_bugs then
logwarning("%s: prev node is no mark",pref(kind,lookupname))
@@ -8860,7 +8582,7 @@ function handlers.gpos_cursive(start,kind,lookupname,exitanchors,sequence) -- to
end
else
local nxt = start.next
- while not done and nxt and nxt.id == glyph and nxt.subtype<256 and nxt.font == currentfont do
+ while not done and nxt and nxt.id == glyph_code and nxt.subtype<256 and nxt.font == currentfont do
local nextchar = nxt.char
if marks[nextchar] then
-- should not happen (maybe warning)
@@ -8877,7 +8599,7 @@ function handlers.gpos_cursive(start,kind,lookupname,exitanchors,sequence) -- to
if al[anchor] then
local exit = exitanchors[anchor]
if exit then
- local dx, dy, bound = set_cursive(start,nxt,tfmdata.factor,rlmode,exit,entry,characters[startchar],characters[nextchar])
+ local dx, dy, bound = setcursive(start,nxt,tfmdata.parameters.factor,rlmode,exit,entry,characters[startchar],characters[nextchar])
if trace_cursive then
logprocess("%s: moving %s to %s cursive (%s,%s) using anchor %s and bound %s in rlmode %s",pref(kind,lookupname),gref(startchar),gref(nextchar),dx,dy,anchor,bound,rlmode)
end
@@ -8890,7 +8612,7 @@ function handlers.gpos_cursive(start,kind,lookupname,exitanchors,sequence) -- to
end
else -- if trace_bugs then
-- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(startchar))
- fonts.register_message(currentfont,startchar,"no entry anchors")
+ onetimemessage(currentfont,startchar,"no entry anchors",report_fonts)
end
break
end
@@ -8907,7 +8629,7 @@ end
function handlers.gpos_single(start,kind,lookupname,kerns,sequence)
local startchar = start.char
- local dx, dy, w, h = set_pair(start,tfmdata.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 (%s,%s) and correction (%s,%s)",pref(kind,lookupname),gref(startchar),dx,dy,w,h)
end
@@ -8922,10 +8644,11 @@ function handlers.gpos_pair(start,kind,lookupname,kerns,sequence)
return start, false
else
local prev, done = start, false
- local factor = tfmdata.factor
- while snext and snext.id == glyph and snext.subtype<256 and snext.font == currentfont do
+ local factor = tfmdata.parameters.factor
+ local lookuptype = lookuptypes[lookupname]
+ while snext and snext.id == glyph_code and snext.subtype<256 and snext.font == currentfont do
local nextchar = snext.char
-local krn = kerns[nextchar]
+ local krn = kerns[nextchar]
if not krn and marks[nextchar] then
prev = snext
snext = snext.next
@@ -8934,38 +8657,38 @@ local krn = kerns[nextchar]
if not krn then
-- skip
elseif type(krn) == "table" then
- if krn[1] == "pair" then
- local a, b = krn[3], krn[4]
+ 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 x, y, w, h = set_pair(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 (%s,%s) and correction (%s,%s)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
end
if b and #b > 0 then
local startchar = start.char
- local x, y, w, h = set_pair(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 (%s,%s) and correction (%s,%s)",pref(kind,lookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
end
- else
- logs.report("%s: check this out (old kern stuff)",pref(kind,lookupname))
- local a, b = krn[3], krn[7]
- if a and a ~= 0 then
- local k = set_kern(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))
- end
- end
- if b and b ~= 0 then
- logwarning("%s: ignoring second kern xoff %s",pref(kind,lookupname),b*factor)
- end
+ else -- wrong ... position has different entries
+ report_process("%s: check this out (old kern stuff)",pref(kind,lookupname))
+ -- local a, b = krn[2], krn[6]
+ -- 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))
+ -- end
+ -- end
+ -- if b and b ~= 0 then
+ -- logwarning("%s: ignoring second kern xoff %s",pref(kind,lookupname),b*factor)
+ -- end
end
done = true
elseif krn ~= 0 then
- local k = set_kern(snext,factor,rlmode,krn)
+ 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))
end
@@ -8990,59 +8713,51 @@ local function logprocess(...)
if trace_steps then
registermessage(...)
end
- logs.report("otf subchain",...)
-end
-local function logwarning(...)
- logs.report("otf subchain",...)
+ report_subchain(...)
end
--- ['coverage']={
--- ['after']={ "r" },
--- ['before']={ "q" },
--- ['current']={ "a", "b", "c" },
--- },
--- ['lookups']={ "ls_l_1", "ls_l_1", "ls_l_1" },
+local logwarning = report_subchain
-function chainmores.chainsub(start,stop,kind,chainname,currentcontext,cache,lookuplist,chainlookupname,n)
+function chainmores.chainsub(start,stop,kind,chainname,currentcontext,lookuphash,lookuplist,chainlookupname,n)
logprocess("%s: a direct call to chainsub cannot happen",cref(kind,chainname,chainlookupname))
return start, false
end
-- handled later:
--
--- function chainmores.gsub_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
--- return chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+-- function chainmores.gsub_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n)
+-- return chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n)
-- end
-function chainmores.gsub_multiple(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+function chainmores.gsub_multiple(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n)
logprocess("%s: gsub_multiple not yet supported",cref(kind,chainname,chainlookupname))
return start, false
end
-function chainmores.gsub_alternate(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+
+function chainmores.gsub_alternate(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n)
logprocess("%s: gsub_alternate not yet supported",cref(kind,chainname,chainlookupname))
return start, false
end
-- handled later:
--
--- function chainmores.gsub_ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
--- return chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,n)
+-- function chainmores.gsub_ligature(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n)
+-- return chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,n)
-- end
local function logprocess(...)
if trace_steps then
registermessage(...)
end
- logs.report("otf chain",...)
-end
-local function logwarning(...)
- logs.report("otf chain",...)
+ report_chain(...)
end
+local logwarning = report_chain
+
-- We could share functions but that would lead to extra function calls with many
-- arguments, redundant tests and confusing messages.
-function chainprocs.chainsub(start,stop,kind,chainname,currentcontext,cache,lookuplist,chainlookupname)
+function chainprocs.chainsub(start,stop,kind,chainname,currentcontext,lookuphash,lookuplist,chainlookupname)
logwarning("%s: a direct call to chainsub cannot happen",cref(kind,chainname,chainlookupname))
return start, false
end
@@ -9051,7 +8766,7 @@ end
-- in a bit weird way. There is no lookup and the replacement comes from the lookup
-- itself. It is meant mostly for dealing with Urdu.
-function chainprocs.reversesub(start,stop,kind,chainname,currentcontext,cache,replacements)
+function chainprocs.reversesub(start,stop,kind,chainname,currentcontext,lookuphash,replacements)
local char = start.char
local replacement = replacements[char]
if replacement then
@@ -9084,11 +8799,10 @@ as less as needed but that would also mke the code even more messy.</p>
local function delete_till_stop(start,stop,ignoremarks)
if start ~= stop then
-- todo keep marks
- local done = false
- while not done do
- done = start == stop
- delete_node(start,start.next)
- end
+ repeat
+ local next = start.next
+ delete_node(start,next)
+ until next == stop
end
end
@@ -9097,18 +8811,22 @@ end
match.</p>
--ldx]]--
-function chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex)
+function chainprocs.gsub_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex)
-- todo: marks ?
- if not chainindex then
- delete_till_stop(start,stop) -- ,currentlookup.flags[1])
- end
+--~ if not chainindex then
+--~ delete_till_stop(start,stop) -- ,currentlookup.flags[1]
+--~ stop = start
+--~ end
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," "))
+ end
while current do
- if current.id == glyph then
+ if current.id == glyph_code then
local currentchar = current.char
- local lookupname = subtables[1]
- local replacement = cache.gsub_single[lookupname]
+ local lookupname = subtables[1] -- only 1
+ local replacement = lookuphash[lookupname]
if not replacement then
if trace_bugs then
logwarning("%s: no single hits",cref(kind,chainname,chainlookupname,lookupname,chainindex))
@@ -9143,12 +8861,12 @@ chainmores.gsub_single = chainprocs.gsub_single
the match.</p>
--ldx]]--
-function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
delete_till_stop(start,stop)
local startchar = start.char
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local replacements = cache.gsub_multiple[lookupname]
+ local replacements = lookuphash[lookupname]
if not replacements then
if trace_bugs then
logwarning("%s: no multiple hits",cref(kind,chainname,chainlookupname,lookupname))
@@ -9163,21 +8881,7 @@ function chainprocs.gsub_multiple(start,stop,kind,chainname,currentcontext,cache
if trace_multiples then
logprocess("%s: replacing %s by multiple characters %s",cref(kind,chainname,chainlookupname,lookupname),gref(startchar),gref(replacements))
end
- local sn = start.next
- for k=1,#replacements do
- if k == 1 then
- start.char = replacements[k]
- else
- local n = copy_node(start) -- maybe delete the components and such
- n.char = replacements[k]
- n.next, n.prev = sn, start
- if sn then
- sn.prev = n
- end
- start.next, start = n, n
- end
- end
- return start, true
+ return multiple_glyphs(start,replacements)
end
end
return start, false
@@ -9187,16 +8891,16 @@ end
<p>Here we replace start by new glyph. First we delete the rest of the match.</p>
--ldx]]--
-function chainprocs.gsub_alternate(start,stop,kind,lookupname,currentcontext,cache,currentlookup)
+function chainprocs.gsub_alternate(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
-- todo: marks ?
delete_till_stop(start,stop)
local current = start
local subtables = currentlookup.subtables
while current do
- if current.id == glyph then
+ if current.id == glyph_code then
local currentchar = current.char
local lookupname = subtables[1]
- local alternatives = cache.gsub_alternate[lookupname]
+ local alternatives = lookuphash[lookupname]
if not alternatives then
if trace_bugs then
logwarning("%s: no alternative hits",cref(kind,chainname,chainlookupname,lookupname))
@@ -9231,11 +8935,11 @@ this function (move code inline and handle the marks by a separate function). We
assume rather stupid ligatures (no complex disc nodes).</p>
--ldx]]--
-function chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex)
+function chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex)
local startchar = start.char
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local ligatures = cache.gsub_ligature[lookupname]
+ local ligatures = lookuphash[lookupname]
if not ligatures then
if trace_bugs then
logwarning("%s: no ligature hits",cref(kind,chainname,chainlookupname,lookupname,chainindex))
@@ -9250,7 +8954,7 @@ function chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache
local s, discfound, last, nofreplacements = start.next, false, stop, 0
while s do
local id = s.id
- if id == disc then
+ if id == disc_code then
s = s.next
discfound = true
else
@@ -9258,21 +8962,21 @@ function chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache
if marks[schar] then -- marks
s = s.next
else
- local lg = ligatures[1][schar]
- if not lg then
- break
- else
+ local lg = ligatures[schar]
+ if lg then
ligatures, last, nofreplacements = lg, s, nofreplacements + 1
if s == stop then
break
else
s = s.next
end
+ else
+ break
end
end
end
end
- local l2 = ligatures[2]
+ local l2 = ligatures.ligature
if l2 then
if chainindex then
stop = last
@@ -9284,7 +8988,7 @@ function chainprocs.gsub_ligature(start,stop,kind,chainname,currentcontext,cache
logprocess("%s: replacing character %s upto %s by ligature %s",cref(kind,chainname,chainlookupname,lookupname,chainindex),gref(startchar),gref(stop.char),gref(l2))
end
end
- start = toligature(kind,lookup,start,stop,l2,currentlookup.flags[1],discfound)
+ start = toligature(kind,lookupname,start,stop,l2,currentlookup.flags[1],discfound)
return start, true, nofreplacements
elseif trace_bugs then
if start == stop then
@@ -9300,23 +9004,23 @@ end
chainmores.gsub_ligature = chainprocs.gsub_ligature
-function chainprocs.gpos_mark2base(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+function chainprocs.gpos_mark2base(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
local markchar = start.char
if marks[markchar] then
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local markanchors = cache.gpos_mark2base[lookupname]
+ local markanchors = lookuphash[lookupname]
if markanchors then
markanchors = markanchors[markchar]
end
if markanchors then
local base = start.prev -- [glyph] [start=mark]
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
local basechar = base.char
if marks[basechar] then
while true do
base = base.prev
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
basechar = base.char
if not marks[basechar] then
break
@@ -9338,7 +9042,7 @@ function chainprocs.gpos_mark2base(start,stop,kind,chainname,currentcontext,cach
if al[anchor] then
local ma = markanchors[anchor]
if ma then
- local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basechar %s => (%s,%s)",
cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -9364,25 +9068,25 @@ function chainprocs.gpos_mark2base(start,stop,kind,chainname,currentcontext,cach
return start, false
end
-function chainprocs.gpos_mark2ligature(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+function chainprocs.gpos_mark2ligature(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
local markchar = start.char
if marks[markchar] then
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local markanchors = cache.gpos_mark2ligature[lookupname]
+ local markanchors = lookuphash[lookupname]
if markanchors then
markanchors = markanchors[markchar]
end
if markanchors then
local base = start.prev -- [glyph] [optional marks] [start=mark]
local index = 1
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
local basechar = base.char
if marks[basechar] then
index = index + 1
while true do
base = base.prev
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then
basechar = base.char
if marks[basechar] then
index = index + 1
@@ -9411,7 +9115,7 @@ function chainprocs.gpos_mark2ligature(start,stop,kind,chainname,currentcontext,
if ma then
ba = ba[index]
if ba then
- local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma,index)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma,index)
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to baselig %s at index %s => (%s,%s)",
cref(kind,chainname,chainlookupname,lookupname),anchor,a or bound,gref(markchar),gref(basechar),index,dx,dy)
@@ -9438,7 +9142,7 @@ function chainprocs.gpos_mark2ligature(start,stop,kind,chainname,currentcontext,
return start, false
end
-function chainprocs.gpos_mark2mark(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+function chainprocs.gpos_mark2mark(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
local markchar = start.char
if marks[markchar] then
--~ local alreadydone = markonce and has_attribute(start,markmark)
@@ -9446,13 +9150,13 @@ function chainprocs.gpos_mark2mark(start,stop,kind,chainname,currentcontext,cach
-- local markanchors = descriptions[markchar].anchors markanchors = markanchors and markanchors.mark
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local markanchors = cache.gpos_mark2mark[lookupname]
+ local markanchors = lookuphash[lookupname]
if markanchors then
markanchors = markanchors[markchar]
end
if markanchors then
local base = start.prev -- [glyph] [basemark] [start=mark]
- if base and base.id == glyph and base.subtype<256 and base.font == currentfont then -- subtype test can go
+ if base and base.id == glyph_code and base.subtype<256 and base.font == currentfont then -- subtype test can go
local basechar = base.char
local baseanchors = descriptions[basechar].anchors
if baseanchors then
@@ -9463,7 +9167,7 @@ function chainprocs.gpos_mark2mark(start,stop,kind,chainname,currentcontext,cach
if al[anchor] then
local ma = markanchors[anchor]
if ma then
- local dx, dy, bound = set_mark(start,base,tfmdata.factor,rlmode,ba,ma)
+ local dx, dy, bound = setmark(start,base,tfmdata.parameters.factor,rlmode,ba,ma)
if trace_marks then
logprocess("%s, anchor %s, bound %s: anchoring mark %s to basemark %s => (%s,%s)",
cref(kind,chainname,chainlookupname,lookupname),anchor,bound,gref(markchar),gref(basechar),dx,dy)
@@ -9494,13 +9198,13 @@ end
-- ! ! ! untested ! ! !
-function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname)
+function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname)
local alreadydone = cursonce and has_attribute(start,cursbase)
if not alreadydone then
local startchar = start.char
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local exitanchors = cache.gpos_cursive[lookupname]
+ local exitanchors = lookuphash[lookupname]
if exitanchors then
exitanchors = exitanchors[startchar]
end
@@ -9512,7 +9216,7 @@ function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,cache,
end
else
local nxt = start.next
- while not done and nxt and nxt.id == glyph and nxt.subtype<256 and nxt.font == currentfont do
+ while not done and nxt and nxt.id == glyph_code and nxt.subtype<256 and nxt.font == currentfont do
local nextchar = nxt.char
if marks[nextchar] then
-- should not happen (maybe warning)
@@ -9529,7 +9233,7 @@ function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,cache,
if al[anchor] then
local exit = exitanchors[anchor]
if exit then
- local dx, dy, bound = set_cursive(start,nxt,tfmdata.factor,rlmode,exit,entry,characters[startchar],characters[nextchar])
+ local dx, dy, bound = setcursive(start,nxt,tfmdata.parameters.factor,rlmode,exit,entry,characters[startchar],characters[nextchar])
if trace_cursive then
logprocess("%s: moving %s to %s cursive (%s,%s) using anchor %s and bound %s in rlmode %s",pref(kind,lookupname),gref(startchar),gref(nextchar),dx,dy,anchor,bound,rlmode)
end
@@ -9542,7 +9246,7 @@ function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,cache,
end
else -- if trace_bugs then
-- logwarning("%s: char %s is missing in font",pref(kind,lookupname),gref(startchar))
- fonts.register_message(currentfont,startchar,"no entry anchors")
+ onetimemessage(currentfont,startchar,"no entry anchors",report_fonts)
end
break
end
@@ -9559,16 +9263,16 @@ function chainprocs.gpos_cursive(start,stop,kind,chainname,currentcontext,cache,
return start, false
end
-function chainprocs.gpos_single(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex,sequence)
- -- untested
+function chainprocs.gpos_single(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence)
+ -- untested .. needs checking for the new model
local startchar = start.char
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local kerns = cache.gpos_single[lookupname]
+ local kerns = lookuphash[lookupname]
if kerns then
- kerns = kerns[startchar]
+ kerns = kerns[startchar] -- needed ?
if kerns then
- local dx, dy, w, h = set_pair(start,tfmdata.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 (%s,%s) and correction (%s,%s)",cref(kind,chainname,chainlookupname),gref(startchar),dx,dy,w,h)
end
@@ -9579,20 +9283,21 @@ end
-- when machines become faster i will make a shared function
-function chainprocs.gpos_pair(start,stop,kind,chainname,currentcontext,cache,currentlookup,chainlookupname,chainindex,sequence)
+function chainprocs.gpos_pair(start,stop,kind,chainname,currentcontext,lookuphash,currentlookup,chainlookupname,chainindex,sequence)
-- logwarning("%s: gpos_pair not yet supported",cref(kind,chainname,chainlookupname))
local snext = start.next
if snext then
local startchar = start.char
local subtables = currentlookup.subtables
local lookupname = subtables[1]
- local kerns = cache.gpos_pair[lookupname]
+ local kerns = lookuphash[lookupname]
if kerns then
kerns = kerns[startchar]
if kerns then
+ local lookuptype = lookuptypes[lookupname]
local prev, done = start, false
- local factor = tfmdata.factor
- while snext and snext.id == glyph and snext.subtype<256 and snext.font == currentfont do
+ local factor = tfmdata.parameters.factor
+ while snext and snext.id == glyph_code and snext.subtype<256 and snext.font == currentfont do
local nextchar = snext.char
local krn = kerns[nextchar]
if not krn and marks[nextchar] then
@@ -9602,27 +9307,27 @@ function chainprocs.gpos_pair(start,stop,kind,chainname,currentcontext,cache,cur
if not krn then
-- skip
elseif type(krn) == "table" then
- if krn[1] == "pair" then
- local a, b = krn[3], krn[4]
+ if lookuptype == "pair" then
+ local a, b = krn[2], krn[3]
if a and #a > 0 then
local startchar = start.char
- local x, y, w, h = set_pair(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 (%s,%s) and correction (%s,%s)",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 x, y, w, h = set_pair(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 (%s,%s) and correction (%s,%s)",cref(kind,chainname,chainlookupname),gref(startchar),gref(nextchar),x,y,w,h)
end
end
else
- logs.report("%s: check this out (old kern stuff)",cref(kind,chainname,chainlookupname))
- local a, b = krn[3], krn[7]
+ report_process("%s: check this out (old kern stuff)",cref(kind,chainname,chainlookupname))
+ local a, b = krn[2], krn[6]
if a and a ~= 0 then
- local k = set_kern(snext,factor,rlmode,a)
+ 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))
end
@@ -9633,7 +9338,7 @@ function chainprocs.gpos_pair(start,stop,kind,chainname,currentcontext,cache,cur
end
done = true
elseif krn ~= 0 then
- local k = set_kern(snext,factor,rlmode,krn)
+ 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))
end
@@ -9665,7 +9370,7 @@ local function show_skip(kind,chainname,char,ck,class)
end
end
-local function normal_handle_contextchain(start,kind,chainname,contexts,sequence,cache)
+local function normal_handle_contextchain(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, done = sequence.flags, false
local skipmark, skipligature, skipbase = flags[1], flags[2], flags[3]
@@ -9680,11 +9385,12 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
-- f..l = mid string
if s == 1 then
-- never happens
- match = current.id == glyph and current.subtype<256 and current.font == currentfont and seq[1][current.char]
+ match = current.id == glyph_code and current.subtype<256 and current.font == currentfont and seq[1][current.char]
else
-- todo: better space check (maybe check for glue)
local f, l = ck[4], ck[5]
- if f == l then
+ -- current match
+ if f == 1 and f == l then
-- already a hit
match = true
else
@@ -9694,12 +9400,12 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
-- we cannot optimize for n=2 because there can be disc nodes
-- if not someskip and n == l then
-- -- n=2 and no skips then faster loop
- -- match = last and last.id == glyph and last.subtype<256 and last.font == currentfont and seq[n][last.char]
+ -- match = last and last.id == glyph_code and last.subtype<256 and last.font == currentfont and seq[n][last.char]
-- else
while n <= l do
if last then
local id = last.id
- if id == glyph then
+ if id == glyph_code then
if last.subtype<256 and last.font == currentfont then
local char = last.char
local ccd = descriptions[char]
@@ -9725,7 +9431,7 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
else
match = false break
end
- elseif id == disc then -- what to do with kerns?
+ elseif id == disc_code then -- what to do with kerns?
last = last.next
else
match = false break
@@ -9736,15 +9442,15 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
end
-- end
end
+ -- before
if match and f > 1 then
- -- before
local prev = start.prev
if prev then
local n = f-1
while n >= 1 do
if prev then
local id = prev.id
- if id == glyph then
+ if id == glyph_code then
if prev.subtype<256 and prev.font == currentfont then -- normal char
local char = prev.char
local ccd = descriptions[char]
@@ -9766,7 +9472,7 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
else
match = false break
end
- elseif id == disc then
+ elseif id == disc_code then
-- skip 'm
elseif seq[n][32] then
n = n -1
@@ -9774,7 +9480,7 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
match = false break
end
prev = prev.prev
- elseif seq[n][32] then
+ elseif seq[n][32] then -- somehat special, as zapfino can have many preceding spaces
n = n -1
else
match = false break
@@ -9790,16 +9496,16 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
end
end
end
+ -- after
if match and s > l then
- -- after
- local current = last.next
+ local current = last and last.next
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
- if id == glyph then
+ if id == glyph_code then
if current.subtype<256 and current.font == currentfont then -- normal char
local char = current.char
local ccd = descriptions[char]
@@ -9821,7 +9527,7 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
else
match = false break
end
- elseif id == disc then
+ elseif id == disc_code then
-- skip 'm
elseif seq[n][32] then -- brrr
n = n + 1
@@ -9852,9 +9558,11 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
local rule, lookuptype, f, l = ck[1], ck[2], ck[4], ck[5]
local char = start.char
if ck[9] then
- logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %s (%s=>%s)",cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype,ck[9],ck[10])
+ logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %s (%s=>%s)",
+ cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype,ck[9],ck[10])
else
- logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %s",cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype)
+ logwarning("%s: rule %s matches at char %s for (%s,%s,%s) chars, lookuptype %s",
+ cref(kind,chainname),rule,gref(char),f-1,l-f+1,s-l,lookuptype)
end
end
local chainlookups = ck[6]
@@ -9866,59 +9574,35 @@ local function normal_handle_contextchain(start,kind,chainname,contexts,sequence
local chainlookup = lookuptable[chainlookupname]
local cp = chainprocs[chainlookup.type]
if cp then
- start, done = cp(start,last,kind,chainname,ck,cache,chainlookup,chainlookupname,nil,sequence)
+ start, done = cp(start,last,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,nil,sequence)
else
logprocess("%s: %s is not yet supported",cref(kind,chainname,chainlookupname),chainlookup.type)
end
else
- -- actually this needs a more complex treatment for which we will use chainmores
---~ local i = 1
---~ repeat
---~ local chainlookupname = chainlookups[i]
---~ local chainlookup = lookuptable[chainlookupname]
---~ local cp = chainmores[chainlookup.type]
---~ if cp then
---~ local ok, n
---~ start, ok, n = cp(start,last,kind,chainname,ck,cache,chainlookup,chainlookupname,i,sequence)
---~ -- messy since last can be changed !
---~ if ok then
---~ done = true
---~ start = start.next
---~ if n then
---~ -- skip next one(s) if ligature
---~ i = i + n - 1
---~ end
---~ end
---~ else
---~ logprocess("%s: multiple subchains for %s are not yet supported",cref(kind,chainname,chainlookupname),chainlookup.type)
---~ end
---~ i = i + 1
---~ until i > nofchainlookups
-
local i = 1
repeat
-if skipped then
- while true do
- local char = start.char
- 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
- else
- break
- end
- else
- break
- end
- end
-end
+ if skipped then
+ while true do
+ local char = start.char
+ 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
+ else
+ break
+ end
+ else
+ break
+ end
+ end
+ end
local chainlookupname = chainlookups[i]
local chainlookup = lookuptable[chainlookupname]
local cp = chainmores[chainlookup.type]
if cp then
local ok, n
- start, ok, n = cp(start,last,kind,chainname,ck,cache,chainlookup,chainlookupname,i,sequence)
+ start, ok, n = cp(start,last,kind,chainname,ck,lookuphash,chainlookup,chainlookupname,i,sequence)
-- messy since last can be changed !
if ok then
done = true
@@ -9933,12 +9617,11 @@ end
end
start = start.next
until i > nofchainlookups
-
end
else
local replacements = ck[7]
if replacements then
- start, done = chainprocs.reversesub(start,last,kind,chainname,ck,cache,replacements) -- sequence
+ start, done = chainprocs.reversesub(start,last,kind,chainname,ck,lookuphash,replacements) -- sequence
else
done = true -- can be meant to be skipped
if trace_contexts then
@@ -9993,18 +9676,17 @@ local function logprocess(...)
if trace_steps then
registermessage(...)
end
- logs.report("otf process",...)
-end
-local function logwarning(...)
- logs.report("otf process",...)
+ report_process(...)
end
+local logwarning = report_process
+
local function report_missing_cache(typ,lookup)
local f = missing[currentfont] if not f then f = { } missing[currentfont] = f end
local t = f[typ] if not t then t = { } f[typ] = t end
if not t[lookup] then
t[lookup] = true
- logwarning("missing cache for lookup %s of type %s in font %s (%s)",lookup,typ,currentfont,tfmdata.fullname)
+ logwarning("missing cache for lookup %s of type %s in font %s (%s)",lookup,typ,currentfont,tfmdata.properties.fullname)
end
end
@@ -10012,135 +9694,144 @@ local resolved = { } -- we only resolve a font,script,language pair once
-- todo: pass all these 'locals' in a table
-function fonts.methods.node.otf.features(head,font,attr)
+local lookuphashes = { }
+
+setmetatableindex(lookuphashes, function(t,font)
+ local lookuphash = fontdata[font].resources.lookuphash
+ if not lookuphash or not next(lookuphash) then
+ lookuphash = false
+ end
+ t[font] = lookuphash
+ return lookuphash
+end)
+
+-- fonts.hashes.lookups = lookuphashes
+
+local special_attributes = {
+ init = 1,
+ medi = 2,
+ fina = 3,
+ isol = 4
+}
+
+local function initialize(sequence,script,language,enabled)
+ local features = sequence.features
+ if features then
+ for kind, scripts in next, features do
+ local valid = enabled[kind]
+ if valid then
+ local languages = scripts[script] or scripts[wildcard]
+ if languages and (languages[language] or languages[wildcard]) then
+ return { valid, special_attributes[kind] or false, sequence.chain or 0, kind }
+ end
+ end
+ end
+ end
+ return false
+end
+
+function otf.dataset(ftfmdata,sequences,font) -- generic variant, overloaded in context
+ local shared = tfmdata.shared
+ local properties = tfmdata.properties
+ local language = properties.language or "dflt"
+ local script = properties.script or "dflt"
+ local enabled = shared.features
+ local res = resolved[font]
+ if not res then
+ res = { }
+ resolved[font] = res
+ end
+ local rs = res[script]
+ if not rs then
+ rs = { }
+ res[script] = rs
+ end
+ local rl = rs[language]
+ if not rl then
+ rl = { }
+ rs[language] = rl
+ setmetatableindex(rl, function(t,k)
+ local v = enabled and initialize(sequences[k],script,language,enabled)
+ t[k] = v
+ return v
+ end)
+ end
+ return rl
+end
+
+local function featuresprocessor(head,font,attr)
+
+ local lookuphash = lookuphashes[font] -- we can also check sequences here
+
+ if not lookuphash then
+ return head, false
+ end
+
if trace_steps then
checkstep(head)
end
- tfmdata = fontdata[font]
- local shared = tfmdata.shared
- otfdata = shared.otfdata
- local luatex = otfdata.luatex
- descriptions = tfmdata.descriptions
- characters = tfmdata.characters
- indices = tfmdata.indices
- unicodes = tfmdata.unicodes
- marks = tfmdata.marks
- anchorlookups = luatex.lookup_to_anchor
- currentfont = font
- rlmode = 0
- local featuredata = otfdata.shared.featuredata -- can be made local to closure
- local sequences = luatex.sequences
- lookuptable = luatex.lookups
- local done = false
- local script, language, s_enabled, a_enabled, dyn
- local attribute_driven = attr and attr ~= 0
- if attribute_driven then
- local features = context_setups[context_numbers[attr]] -- could be a direct list
- dyn = context_merged[attr] or 0
- language, script = features.language or "dflt", features.script or "dflt"
- a_enabled = features -- shared.features -- can be made local to the resolver
- if dyn == 2 or dyn == -2 then
- -- font based
- s_enabled = shared.features
- end
- else
- language, script = tfmdata.language or "dflt", tfmdata.script or "dflt"
- s_enabled = shared.features -- can be made local to the resolver
- dyn = 0
- end
- -- we can save some runtime by caching feature tests
- local res = resolved[font] if not res then res = { } resolved[font] = res end
- local rs = res [script] if not rs then rs = { } res [script] = rs end
- local rl = rs [language] if not rl then rl = { } rs [language] = rl end
- local ra = rl [attr] if ra == nil then ra = { } rl [attr] = ra end -- attr can be false
- -- sequences always > 1 so no need for optimization
+
+ tfmdata = fontdata[font]
+ descriptions = tfmdata.descriptions
+ characters = tfmdata.characters
+ resources = tfmdata.resources
+
+ marks = resources.marks
+ anchorlookups = resources.lookup_to_anchor
+ lookuptable = resources.lookups
+ lookuptypes = resources.lookuptypes
+
+ currentfont = font
+ rlmode = 0
+
+ local sequences = resources.sequences
+ local done = false
+ local datasets = otf.dataset(tfmdata,sequences,font,attr)
+
for s=1,#sequences do
- local pardir, txtdir = 0, { }
- local success = false
+ local pardir, txtdir, success = 0, { }, false -- we could reuse txtdir and use a top pointer
local sequence = sequences[s]
- local r = ra[s] -- cache
- if r == nil then
- --
- -- this bit will move to font-ctx and become a function
- ---
- local chain = sequence.chain or 0
- local features = sequence.features
- if not features then
- -- indirect lookup, part of chain (todo: make this a separate table)
- r = false -- { false, false, chain }
- else
- local valid, attribute, kind, what = false, false
- for k,v in next, features do
- -- we can quit earlier but for the moment we want the tracing
- local s_e = s_enabled and s_enabled[k]
- local a_e = a_enabled and a_enabled[k]
- if s_e or a_e then
- local l = v[script] or v[wildcard]
- if l then
- -- not l[language] or l[default] or l[wildcard] because we want tracing
- -- only first attribute match check, so we assume simple fina's
- -- default can become a font feature itself
- if l[language] then
- valid, what = s_e or a_e, language
- -- elseif l[default] then
- -- valid, what = true, default
- elseif l[wildcard] then
- valid, what = s_e or a_e, wildcard
- end
- if valid then
- kind, attribute = k, special_attributes[k] or false
- if a_e and dyn < 0 then
- valid = false
- end
- if trace_applied then
- local typ, action = match(sequence.type,"(.*)_(.*)")
- logs.report("otf node mode",
- "%s font: %03i, dynamic: %03i, kind: %s, lookup: %3i, script: %-4s, language: %-4s (%-4s), type: %s, action: %s, name: %s",
- (valid and "+") or "-",font,attr or 0,kind,s,script,language,what,typ,action,sequence.name)
- end
- break
- end
- end
- end
- end
- if valid then
- r = { valid, attribute, chain, kind }
- else
- r = false -- { valid, attribute, chain, "generic" } -- false anyway, could be flag instead of table
- end
- end
- ra[s] = r
- end
- featurevalue = r and r[1] -- todo: pass to function instead of using a global
+ local dataset = datasets[s] -- cache
+ featurevalue = dataset and dataset[1] -- todo: pass to function instead of using a global
if featurevalue then
- local attribute, chain, typ, subtables = r[2], r[3], sequence.type, sequence.subtables
+ local attribute, chain, typ, subtables = dataset[2], dataset[3], sequence.type, sequence.subtables
+--~ print(typ)
+--~ table.print(table.keys(sequence))
if chain < 0 then
-- this is a limited case, no special treatments like 'init' etc
local handler = handlers[typ]
- local thecache = featuredata[typ] or { }
-- we need to get rid of this slide !
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
- if id == glyph then
- if start.subtype<256 and start.font == font and (not attr or has_attribute(start,0,attr)) then
---~ if start.subtype<256 and start.font == font and has_attribute(start,0,attr) then
- for i=1,#subtables do
- local lookupname = subtables[i]
- local lookupcache = thecache[lookupname]
- if lookupcache then
- local lookupmatch = lookupcache[start.char]
- if lookupmatch then
- start, success = handler(start,r[4],lookupname,lookupmatch,sequence,featuredata,i)
- if success then
- break
+ if id == glyph_code then
+ if start.subtype<256 and start.font == font then
+ local a = has_attribute(start,0)
+ if a then
+ a = a == attr
+ else
+ a = true
+ end
+ if a then
+ for i=1,#subtables do
+ local lookupname = subtables[i]
+ local lookupcache = lookuphash[lookupname]
+ if lookupcache then
+ local lookupmatch = lookupcache[start.char]
+ if lookupmatch then
+ start, success = handler(start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
+ if success then
+ break
+ end
end
+ else
+ report_missing_cache(typ,lookupname)
end
- else
- report_missing_cache(typ,lookupname)
end
+ if start then start = start.prev end
+ else
+ start = start.prev
end
- if start then start = start.prev end
else
start = start.prev
end
@@ -10151,34 +9842,42 @@ function fonts.methods.node.otf.features(head,font,attr)
else
local handler = handlers[typ]
local ns = #subtables
- local thecache = featuredata[typ] or { }
local start = head -- local ?
rlmode = 0 -- to be checked ?
if ns == 1 then
local lookupname = subtables[1]
- local lookupcache = thecache[lookupname]
+ local lookupcache = lookuphash[lookupname]
if not lookupcache then
report_missing_cache(typ,lookupname)
else
while start do
local id = start.id
- if id == glyph then
---~ if start.font == font and start.subtype<256 and has_attribute(start,0,attr) and (not attribute or has_attribute(start,state,attribute)) then
- if start.font == font and start.subtype<256 and (not attr or has_attribute(start,0,attr)) and (not attribute or has_attribute(start,state,attribute)) then
- local lookupmatch = lookupcache[start.char]
- if lookupmatch then
- -- sequence kan weg
- local ok
- start, ok = handler(start,r[4],lookupname,lookupmatch,sequence,featuredata,1)
- if ok then
- success = true
+ if id == glyph_code then
+ if start.subtype<256 and start.font == font then
+ local a = has_attribute(start,0)
+ if a then
+ a = (a == attr) and (not attribute or has_attribute(start,state,attribute))
+ else
+ a = not attribute or has_attribute(start,state,attribute)
+ end
+ if a then
+ local lookupmatch = lookupcache[start.char]
+ if lookupmatch then
+ -- sequence kan weg
+ local ok
+ start, ok = handler(start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,1)
+ if ok then
+ success = true
+ end
end
+ if start then start = start.next end
+ else
+ start = start.next
end
- if start then start = start.next end
else
start = start.next
end
- -- elseif id == glue then
+ -- elseif id == glue_code then
-- if p[5] then -- chain
-- local pc = pp[32]
-- if pc then
@@ -10193,9 +9892,9 @@ function fonts.methods.node.otf.features(head,font,attr)
-- else
-- start = start.next
-- end
- elseif id == whatsit then
+ elseif id == whatsit_code then
local subtype = start.subtype
- if subtype == 7 then
+ if subtype == dir_code then
local dir = start.dir
if dir == "+TRT" or dir == "+TLT" then
insert(txtdir,dir)
@@ -10211,9 +9910,9 @@ function fonts.methods.node.otf.features(head,font,attr)
rlmode = pardir
end
if trace_directions then
- logs.report("fonts","directions after textdir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ report_process("directions after textdir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
end
- elseif subtype == 6 then
+ elseif subtype == localpar_code then
local dir = start.dir
if dir == "TRT" then
pardir = -1
@@ -10225,7 +9924,7 @@ function fonts.methods.node.otf.features(head,font,attr)
rlmode = pardir
--~ txtdir = { }
if trace_directions then
- logs.report("fonts","directions after pardir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ report_process("directions after pardir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
end
end
start = start.next
@@ -10237,32 +9936,41 @@ function fonts.methods.node.otf.features(head,font,attr)
else
while start do
local id = start.id
- if id == glyph then
- if start.subtype<256 and start.font == font and (not attr or has_attribute(start,0,attr)) and (not attribute or has_attribute(start,state,attribute)) then
---~ if start.subtype<256 and start.font == font and has_attribute(start,0,attr) and (not attribute or has_attribute(start,state,attribute)) then
- for i=1,ns do
- local lookupname = subtables[i]
- local lookupcache = thecache[lookupname]
- if lookupcache then
- local lookupmatch = lookupcache[start.char]
- if lookupmatch then
- -- we could move all code inline but that makes things even more unreadable
- local ok
- start, ok = handler(start,r[4],lookupname,lookupmatch,sequence,featuredata,i)
- if ok then
- success = true
- break
+ if id == glyph_code then
+ if start.subtype<256 and start.font == font then
+ local a = has_attribute(start,0)
+ if a then
+ a = (a == attr) and (not attribute or has_attribute(start,state,attribute))
+ else
+ a = not attribute or has_attribute(start,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]
+ if lookupmatch then
+ -- we could move all code inline but that makes things even more unreadable
+ local ok
+ start, ok = handler(start,dataset[4],lookupname,lookupmatch,sequence,lookuphash,i)
+ if ok then
+ success = true
+ break
+ end
end
+ else
+ report_missing_cache(typ,lookupname)
end
- else
- report_missing_cache(typ,lookupname)
end
+ if start then start = start.next end
+ else
+ start = start.next
end
- if start then start = start.next end
else
start = start.next
end
- -- elseif id == glue then
+ -- elseif id == glue_code then
-- if p[5] then -- chain
-- local pc = pp[32]
-- if pc then
@@ -10277,10 +9985,9 @@ function fonts.methods.node.otf.features(head,font,attr)
-- else
-- start = start.next
-- end
- elseif id == whatsit then
- local subtype = start.subtype
+ elseif id == whatsit_code then
local subtype = start.subtype
- if subtype == 7 then
+ if subtype == dir_code then
local dir = start.dir
if dir == "+TRT" or dir == "+TLT" then
insert(txtdir,dir)
@@ -10296,9 +10003,9 @@ function fonts.methods.node.otf.features(head,font,attr)
rlmode = pardir
end
if trace_directions then
- logs.report("fonts","directions after textdir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ report_process("directions after textdir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
end
- elseif subtype == 6 then
+ elseif subtype == localpar_code then
local dir = start.dir
if dir == "TRT" then
pardir = -1
@@ -10310,7 +10017,7 @@ function fonts.methods.node.otf.features(head,font,attr)
rlmode = pardir
--~ txtdir = { }
if trace_directions then
- logs.report("fonts","directions after pardir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
+ report_process("directions after pardir %s: pardir=%s, txtdir=%s:%s, rlmode=%s",dir,pardir,#txtdir,txtdir[#txtdir] or "unset",rlmode)
end
end
start = start.next
@@ -10331,463 +10038,1049 @@ function fonts.methods.node.otf.features(head,font,attr)
return head, done
end
-otf.features.prepare = { }
+local function generic(lookupdata,lookupname,unicode,lookuphash)
+ local target = lookuphash[lookupname]
+ if target then
+ target[unicode] = lookupdata
+ else
+ lookuphash[lookupname] = { [unicode] = lookupdata }
+ end
+end
--- we used to share code in the following functions but that costs a lot of
--- memory due to extensive calls to functions (easily hundreds of thousands per
--- document)
+local action = {
-local function split(replacement,original,cache,unicodes)
- -- we can cache this too, but not the same (although unicode is a unique enough hash)
- local o, t, n = { }, { }, 0
- for s in gmatch(original,"[^ ]+") do
- local us = unicodes[s]
- if type(us) == "number" then -- tonumber(us)
- o[#o+1] = us
- else
- o[#o+1] = us[1]
+ substitution = generic,
+ multiple = generic,
+ alternate = generic,
+ position = generic,
+
+ ligature = function(lookupdata,lookupname,unicode,lookuphash)
+ local target = lookuphash[lookupname]
+ if not target then
+ target = { }
+ lookuphash[lookupname] = target
end
- end
- for s in gmatch(replacement,"[^ ]+") do
- n = n + 1
- local us = unicodes[s]
- if type(us) == "number" then -- tonumber(us)
- t[o[n]] = us
- else
- t[o[n]] = us[1]
+ for i=1,#lookupdata do
+ local li = lookupdata[i]
+ local tu = target[li]
+ if not tu then
+ tu = { }
+ target[li] = tu
+ end
+ target = tu
end
- end
- return t
-end
+ target.ligature = unicode
+ end,
-local function uncover(covers,result,cache,unicodes)
- -- lpeg hardly faster (.005 sec on mk)
- for n=1,#covers do
- local c = covers[n]
- local cc = cache[c]
- if not cc then
- local t = { }
- for s in gmatch(c,"[^ ]+") do
- local us = unicodes[s]
- if type(us) == "number" then
- t[us] = true
- else
- for i=1,#us do
- t[us[i]] = true
- end
- end
- end
- cache[c] = t
- result[#result+1] = t
+ pair = function(lookupdata,lookupname,unicode,lookuphash)
+ local target = lookuphash[lookupname]
+ if not target then
+ target = { }
+ lookuphash[lookupname] = target
+ end
+ local others = target[unicode]
+ local paired = lookupdata[1]
+ if others then
+ others[paired] = lookupdata
else
- result[#result+1] = cc
+ others = { [paired] = lookupdata }
+ target[unicode] = others
end
- end
-end
+ end,
+
+}
local function prepare_lookups(tfmdata)
- local otfdata = tfmdata.shared.otfdata
- local featuredata = otfdata.shared.featuredata
- local anchor_to_lookup = otfdata.luatex.anchor_to_lookup
- local lookup_to_anchor = otfdata.luatex.lookup_to_anchor
- --
- local multiple = featuredata.gsub_multiple
- local alternate = featuredata.gsub_alternate
- local single = featuredata.gsub_single
- local ligature = featuredata.gsub_ligature
- local pair = featuredata.gpos_pair
- local position = featuredata.gpos_single
- local kerns = featuredata.gpos_pair
- local mark = featuredata.gpos_mark2mark
- local cursive = featuredata.gpos_cursive
- --
- local unicodes = tfmdata.unicodes -- names to unicodes
- local indices = tfmdata.indices
- local descriptions = tfmdata.descriptions
- --
- -- we can change the otf table after loading but then we need to adapt base mode
- -- as well (no big deal)
- --
- local action = {
- substitution = function(p,lookup,k,glyph,unicode)
- local old, new = unicode, unicodes[p[2]]
- if type(new) == "table" then
- new = new[1]
- end
- local s = single[lookup]
- if not s then s = { } single[lookup] = s end
- s[old] = new
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: substitution %s => %s",lookup,old,new)
- --~ end
- end,
- multiple = function (p,lookup,k,glyph,unicode)
- local old, new = unicode, { }
- local m = multiple[lookup]
- if not m then m = { } multiple[lookup] = m end
- m[old] = new
- for pc in gmatch(p[2],"[^ ]+") do
- local upc = unicodes[pc]
- if type(upc) == "number" then
- new[#new+1] = upc
- else
- new[#new+1] = upc[1]
- end
- end
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: multiple %s => %s",lookup,old,concat(new," "))
- --~ end
- end,
- alternate = function(p,lookup,k,glyph,unicode)
- local old, new = unicode, { }
- local a = alternate[lookup]
- if not a then a = { } alternate[lookup] = a end
- a[old] = new
- for pc in gmatch(p[2],"[^ ]+") do
- local upc = unicodes[pc]
- if type(upc) == "number" then
- new[#new+1] = upc
- else
- new[#new+1] = upc[1]
- end
- end
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: alternate %s => %s",lookup,old,concat(new,"|"))
- --~ end
- end,
- ligature = function (p,lookup,k,glyph,unicode)
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: ligature %s => %s",lookup,p[2],glyph.name)
- --~ end
- local first = true
- local t = ligature[lookup]
- if not t then t = { } ligature[lookup] = t end
- for s in gmatch(p[2],"[^ ]+") do
- if first then
- local u = unicodes[s]
- if not u then
- logs.report("define otf","lookup %s: ligature %s => %s ignored due to invalid unicode",lookup,p[2],glyph.name)
- break
- elseif type(u) == "number" then
- if not t[u] then
- t[u] = { { } }
- end
- t = t[u]
- else
- local tt = t
- local tu
- for i=1,#u do
- local u = u[i]
- if i==1 then
- if not t[u] then
- t[u] = { { } }
- end
- tu = t[u]
- t = tu
- else
- if not t[u] then
- tt[u] = tu
- end
- end
- end
- end
- first = false
- else
- s = unicodes[s]
- local t1 = t[1]
- if not t1[s] then
- t1[s] = { { } }
- end
- t = t1[s]
- end
- end
- t[2] = unicode
- end,
- position = function(p,lookup,k,glyph,unicode)
- -- not used
- local s = position[lookup]
- if not s then s = { } position[lookup] = s end
- s[unicode] = p[2] -- direct pointer to kern spec
- end,
- pair = function(p,lookup,k,glyph,unicode)
- local s = pair[lookup]
- if not s then s = { } pair[lookup] = s end
- local others = s[unicode]
- if not others then others = { } s[unicode] = others end
- -- todo: fast check for space
- local two = p[2]
- local upc = unicodes[two]
- if not upc then
- for pc in gmatch(two,"[^ ]+") do
- local upc = unicodes[pc]
- if type(upc) == "number" then
- others[upc] = p -- direct pointer to main table
- else
- for i=1,#upc do
- others[upc[i]] = p -- direct pointer to main table
- end
- end
- end
- elseif type(upc) == "number" then
- others[upc] = p -- direct pointer to main table
- else
- for i=1,#upc do
- others[upc[i]] = p -- direct pointer to main table
- end
- end
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: pair for U+%04X",lookup,unicode)
- --~ end
- end,
- }
- --
- for unicode, glyph in next, descriptions do
- local lookups = glyph.slookups
+
+ local rawdata = tfmdata.shared.rawdata
+ local resources = rawdata.resources
+ local lookuphash = resources.lookuphash
+ local anchor_to_lookup = resources.anchor_to_lookup
+ local lookup_to_anchor = resources.lookup_to_anchor
+ local lookuptypes = resources.lookuptypes
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+
+ -- we cannot free the entries in the descriptions as sometimes we access
+ -- then directly (for instance anchors) ... selectively freeing does save
+ -- much memory as it's only a reference to a table and the slot in the
+ -- description hash is not freed anyway
+
+ for unicode, character in next, characters do -- we cannot loop over descriptions !
+
+ local description = descriptions[unicode]
+
+ local lookups = description.slookups
if lookups then
- for lookup, p in next, lookups do
- action[p[1]](p,lookup,k,glyph,unicode)
+ for lookupname, lookupdata in next, lookups do
+ action[lookuptypes[lookupname]](lookupdata,lookupname,unicode,lookuphash)
end
end
- local lookups = glyph.mlookups
+
+ local lookups = description.mlookups
if lookups then
- for lookup, whatever in next, lookups do
- for i=1,#whatever do -- normaly one
- local p = whatever[i]
- action[p[1]](p,lookup,k,glyph,unicode)
+ for lookupname, lookuplist in next, lookups do
+ local lookuptype = lookuptypes[lookupname]
+ for l=1,#lookuplist do
+ local lookupdata = lookuplist[l]
+ action[lookuptype](lookupdata,lookupname,unicode,lookuphash)
end
end
end
- local list = glyph.mykerns
+
+ local list = description.kerns
if list then
- for lookup, krn in next, list do
- local k = kerns[lookup]
- if not k then k = { } kerns[lookup] = k end
- k[unicode] = krn -- ref to glyph, saves lookup
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: kern for U+%04X",lookup,unicode)
- --~ end
+ for lookup, krn in next, list do -- ref to glyph, saves lookup
+ local target = lookuphash[lookup]
+ if target then
+ target[unicode] = krn
+ else
+ lookuphash[lookup] = { [unicode] = krn }
+ end
end
end
- local oanchor = glyph.anchors
- if oanchor then
- for typ, anchors in next, oanchor do -- types
- if typ == "mark" then
- for name, anchor in next, anchors do
- local lookups = anchor_to_lookup[name]
- if lookups then
- for lookup, _ in next, lookups do
- local f = mark[lookup]
- if not f then f = { } mark[lookup] = f end
- f[unicode] = anchors -- ref to glyph, saves lookup
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: mark anchor %s for U+%04X",lookup,name,unicode)
- --~ end
- end
- end
- end
- elseif typ == "cexit" then -- or entry?
+
+ local list = description.anchors
+ if list then
+ for typ, anchors in next, list do -- types
+ if typ == "mark" or typ == "cexit" then -- or entry?
for name, anchor in next, anchors do
local lookups = anchor_to_lookup[name]
if lookups then
for lookup, _ in next, lookups do
- local f = cursive[lookup]
- if not f then f = { } cursive[lookup] = f end
- f[unicode] = anchors -- ref to glyph, saves lookup
- --~ if trace_lookups then
- --~ logs.report("define otf","lookup %s: exit anchor %s for U+%04X",lookup,name,unicode)
- --~ end
+ local target = lookuphash[lookup]
+ if target then
+ target[unicode] = anchors
+ else
+ lookuphash[lookup] = { [unicode] = anchors }
+ end
end
end
end
end
end
end
+
end
+
end
--- local cache = { }
-luatex = luatex or {} -- this has to change ... we need a better one
+local function split(replacement,original)
+ local result = { }
+ for i=1,#replacement do
+ result[original[i]] = replacement[i]
+ end
+ return result
+end
+
+-- not shared as we hook into lookups now
+
+--~ local function uncover_1(covers,result) -- multiple covers
+--~ local nofresults = #result
+--~ for n=1,#covers do
+--~ nofresults = nofresults + 1
+--~ local u = { }
+--~ local c = covers[n]
+--~ for i=1,#c do
+--~ u[c[i]] = true
+--~ end
+--~ result[nofresults] = u
+--~ end
+--~ end
+
+--~ local function uncover_2(covers,result) -- single covers (turned into multiple with n=1)
+--~ local nofresults = #result
+--~ for n=1,#covers do
+--~ nofresults = nofresults + 1
+--~ result[nofresults] = { [covers[n]] = true }
+--~ end
+--~ end
+
+--~ local function uncover_1(covers,result) -- multiple covers
+--~ local nofresults = #result
+--~ for n=1,#covers do
+--~ nofresults = nofresults + 1
+--~ result[nofresults] = covers[n]
+--~ end
+--~ end
+
+--~ local function prepare_contextchains(tfmdata)
+--~ local rawdata = tfmdata.shared.rawdata
+--~ local resources = rawdata.resources
+--~ local lookuphash = resources.lookuphash
+--~ local lookups = rawdata.lookups
+--~ if lookups then
+--~ for lookupname, lookupdata in next, rawdata.lookups do
+--~ local lookuptype = lookupdata.type
+--~ if not lookuptype then
+--~ report_prepare("missing lookuptype for %s",lookupname)
+--~ else -- => lookuphash[lookupname][unicode]
+--~ local rules = lookupdata.rules
+--~ if rules then
+--~ local fmt = lookupdata.format
+--~ -- if fmt == "coverage" then
+--~ if fmt == "coverage" or fmt == "glyphs" then
+--~ if lookuptype ~= "chainsub" and lookuptype ~= "chainpos" then
+--~ -- todo: dejavu-serif has one (but i need to see what use it has)
+--~ report_prepare("unsupported coverage %s for %s",lookuptype,lookupname)
+--~ else
+--~ local contexts = lookuphash[lookupname]
+--~ if not contexts then
+--~ contexts = { }
+--~ lookuphash[lookupname] = contexts
+--~ end
+--~ local t, nt = { }, 0
+--~ for nofrules=1,#rules do -- does #rules>1 happen often?
+--~ local rule = rules[nofrules]
+--~ local current = rule.current
+--~ local before = rule.before
+--~ local after = rule.after
+--~ local sequence = { }
+--~ if before then
+--~ uncover_1(before,sequence)
+--~ end
+--~ local start = #sequence + 1
+--~ uncover_1(current,sequence)
+--~ local stop = #sequence
+--~ if after then
+--~ uncover_1(after,sequence)
+--~ end
+--~ if sequence[1] then
+--~ nt = nt + 1
+--~ t[nt] = { nofrules, lookuptype, sequence, start, stop, rule.lookups }
+--~ for unic, _ in next, sequence[start] do
+--~ local cu = contexts[unic]
+--~ if not cu then
+--~ contexts[unic] = t
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ elseif fmt == "reversecoverage" then -- we could combine both branches (only dufference is replacements)
+--~ if lookuptype ~= "reversesub" then
+--~ report_prepare("unsupported reverse coverage %s for %s",lookuptype,lookupname)
+--~ else
+--~ local contexts = lookuphash[lookupname]
+--~ if not contexts then
+--~ contexts = { }
+--~ lookuphash[lookupname] = contexts
+--~ end
+--~ local t, nt = { }, 0
+--~ for nofrules=1,#rules do
+--~ local rule = rules[nofrules]
+--~ local current = rule.current
+--~ local before = rule.before
+--~ local after = rule.after
+--~ local replacements = rule.replacements
+--~ local sequence = { }
+--~ if before then
+--~ uncover_1(before,sequence)
+--~ end
+--~ local start = #sequence + 1
+--~ uncover_1(current,sequence)
+--~ local stop = #sequence
+--~ if after then
+--~ uncover_1(after,sequence)
+--~ end
+--~ if sequence[1] then
+--~ nt = nt + 1
+--~ t[nt] = { nofrules, lookuptype, sequence, start, stop, rule.lookups, replacements }
+--~ for unic, _ in next, sequence[start] do
+--~ local cu = contexts[unic]
+--~ if not cu then
+--~ contexts[unic] = t
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ -- elseif fmt == "glyphs" then --maybe just make then before = { fore } and share with coverage
+--~ -- if lookuptype ~= "chainsub" and lookuptype ~= "chainpos" then
+--~ -- report_prepare("unsupported coverage %s for %s",lookuptype,lookupname)
+--~ -- else
+--~ -- local contexts = lookuphash[lookupname]
+--~ -- if not contexts then
+--~ -- contexts = { }
+--~ -- lookuphash[lookupname] = contexts
+--~ -- end
+--~ -- local t, nt = { }, 0
+--~ -- for nofrules=1,#rules do -- we can make glyphs a special case (less tables)
+--~ -- local rule = rules[nofrules]
+--~ -- local current = rule.names
+--~ -- local before = rule.fore
+--~ -- local after = rule.back
+--~ -- local sequence = { }
+--~ -- if before then
+--~ -- uncover_1(before,sequence)
+--~ -- end
+--~ -- local start = #sequence + 1
+--~ -- uncover_1(current,sequence)
+--~ -- local stop = #sequence
+--~ -- if after then
+--~ -- uncover_1(after,sequence)
+--~ -- end
+--~ -- if sequence then
+--~ -- nt = nt + 1
+--~ -- t[nt] = { nofrules, lookuptype, sequence, start, stop, rule.lookups }
+--~ -- for unic, _ in next, sequence[start] do
+--~ -- local cu = contexts[unic]
+--~ -- if not cu then
+--~ -- contexts[unic] = t
+--~ -- end
+--~ -- end
+--~ -- end
+--~ -- end
+--~ -- end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+--~ end
+
+local valid = {
+ coverage = { chainsub = true, chainpos = true },
+ reversecoverage = { reversesub = true },
+ glyphs = { chainsub = true, chainpos = true },
+}
-function prepare_contextchains(tfmdata)
- local otfdata = tfmdata.shared.otfdata
- local lookups = otfdata.lookups
+local function prepare_contextchains(tfmdata)
+ local rawdata = tfmdata.shared.rawdata
+ local resources = rawdata.resources
+ local lookuphash = resources.lookuphash
+ local lookups = rawdata.lookups
if lookups then
- local featuredata = otfdata.shared.featuredata
- local contextchain = featuredata.gsub_contextchain -- shared with gpos
- local reversecontextchain = featuredata.gsub_reversecontextchain -- shared with gpos
- local characters = tfmdata.characters
- local unicodes = tfmdata.unicodes
- local indices = tfmdata.indices
- local cache = luatex.covers
- if not cache then
- cache = { }
- luatex.covers = cache
- end
- --
- for lookupname, lookupdata in next, otfdata.lookups do
+ for lookupname, lookupdata in next, rawdata.lookups do
local lookuptype = lookupdata.type
- if not lookuptype then
- logs.report("otf process","missing lookuptype for %s",lookupname)
- else
+ if lookuptype then
local rules = lookupdata.rules
if rules then
- local fmt = lookupdata.format
- -- contextchain[lookupname][unicode]
- if fmt == "coverage" then
- if lookuptype ~= "chainsub" and lookuptype ~= "chainpos" then
- logs.report("otf process","unsupported coverage %s for %s",lookuptype,lookupname)
- else
- local contexts = contextchain[lookupname]
- if not contexts then
- contexts = { }
- contextchain[lookupname] = contexts
- end
- local t = { }
- for nofrules=1,#rules do -- does #rules>1 happen often?
- local rule = rules[nofrules]
- local coverage = rule.coverage
- if coverage and coverage.current then
- local current, before, after, sequence = coverage.current, coverage.before, coverage.after, { }
- if before then
- uncover(before,sequence,cache,unicodes)
- end
- local start = #sequence + 1
- uncover(current,sequence,cache,unicodes)
- local stop = #sequence
- if after then
- uncover(after,sequence,cache,unicodes)
- end
- if sequence[1] then
- t[#t+1] = { nofrules, lookuptype, sequence, start, stop, rule.lookups }
- for unic, _ in next, sequence[start] do
- local cu = contexts[unic]
- if not cu then
- contexts[unic] = t
- end
- end
- end
+ local format = lookupdata.format
+ local validformat = valid[format]
+ if not validformat then
+ report_prepare("unsupported format %s",format)
+ elseif not validformat[lookuptype] then
+ -- todo: dejavu-serif has one (but i need to see what use it has)
+ report_prepare("unsupported %s %s for %s",format,lookuptype,lookupname)
+ else
+ local contexts = lookuphash[lookupname]
+ if not contexts then
+ contexts = { }
+ lookuphash[lookupname] = contexts
+ end
+ local t, nt = { }, 0
+ for nofrules=1,#rules do
+ local rule = rules[nofrules]
+ local current = rule.current
+ local before = rule.before
+ local after = rule.after
+ local replacements = rule.replacements
+ local sequence = { }
+ local nofsequences = 0
+ -- Wventually we can store start, stop and sequence in the cached file
+ -- but then less sharing takes place so best not do that without a lot
+ -- of profiling so let's forget about it.
+ if before then
+ for n=1,#before do
+ nofsequences = nofsequences + 1
+ sequence[nofsequences] = before[n]
end
end
- end
- elseif fmt == "reversecoverage" then
- if lookuptype ~= "reversesub" then
- logs.report("otf process","unsupported reverse coverage %s for %s",lookuptype,lookupname)
- else
- local contexts = reversecontextchain[lookupname]
- if not contexts then
- contexts = { }
- reversecontextchain[lookupname] = contexts
+ local start = nofsequences + 1
+ for n=1,#current do
+ nofsequences = nofsequences + 1
+ sequence[nofsequences] = current[n]
end
- local t = { }
- for nofrules=1,#rules do
- local rule = rules[nofrules]
- local reversecoverage = rule.reversecoverage
- if reversecoverage and reversecoverage.current then
- local current, before, after, replacements, sequence = reversecoverage.current, reversecoverage.before, reversecoverage.after, reversecoverage.replacements, { }
- if before then
- uncover(before,sequence,cache,unicodes)
- end
- local start = #sequence + 1
- uncover(current,sequence,cache,unicodes)
- local stop = #sequence
- if after then
- uncover(after,sequence,cache,unicodes)
- end
- if replacements then
- replacements = split(replacements,current[1],cache,unicodes)
- end
- if sequence[1] then
- -- this is different from normal coverage, we assume only replacements
- t[#t+1] = { nofrules, lookuptype, sequence, start, stop, rule.lookups, replacements }
- for unic, _ in next, sequence[start] do
- local cu = contexts[unic]
- if not cu then
- contexts[unic] = t
- end
- end
- end
+ local stop = nofsequences
+ if after then
+ for n=1,#after do
+ nofsequences = nofsequences + 1
+ sequence[nofsequences] = after[n]
end
end
- end
- elseif fmt == "glyphs" then
- if lookuptype ~= "chainsub" and lookuptype ~= "chainpos" then
- logs.report("otf process","unsupported coverage %s for %s",lookuptype,lookupname)
- else
- local contexts = contextchain[lookupname]
- if not contexts then
- contexts = { }
- contextchain[lookupname] = contexts
- end
- local t = { }
- for nofrules=1,#rules do
- -- nearly the same as coverage so we could as well rename it
- local rule = rules[nofrules]
- local glyphs = rule.glyphs
- if glyphs and glyphs.names then
- local fore, back, names, sequence = glyphs.fore, glyphs.back, glyphs.names, { }
- if fore and fore ~= "" then
- fore = lpegmatch(split_at_space,fore)
- uncover(fore,sequence,cache,unicodes)
- end
- local start = #sequence + 1
- names = lpegmatch(split_at_space,names)
- uncover(names,sequence,cache,unicodes)
- local stop = #sequence
- if back and back ~= "" then
- back = lpegmatch(split_at_space,back)
- uncover(back,sequence,cache,unicodes)
- end
- if sequence[1] then
- t[#t+1] = { nofrules, lookuptype, sequence, start, stop, rule.lookups }
- for unic, _ in next, sequence[start] do
- local cu = contexts[unic]
- if not cu then
- contexts[unic] = t
- end
- end
+ if sequence[1] then
+ -- Replacements only happen with reverse lookups as they are single only. We
+ -- could pack them into current (replacement value instead of true) and then
+ -- use sequence[start] instead but it's somewhat ugly.
+ nt = nt + 1
+ t[nt] = { nofrules, lookuptype, sequence, start, stop, rule.lookups, replacements }
+ for unic, _ in next, sequence[start] do
+ local cu = contexts[unic]
+ if not cu then
+ contexts[unic] = t
end
end
end
end
end
+ else
+ -- no rules
end
+ else
+ report_prepare("missing lookuptype for %s",lookupname)
end
end
end
end
-function fonts.initializers.node.otf.features(tfmdata,value)
+-- we can consider lookuphash == false (initialized but empty) vs lookuphash == table
+
+local function featuresinitializer(tfmdata,value)
if true then -- value then
- if not tfmdata.shared.otfdata.shared.initialized then
- local t = trace_preparing and os.clock()
- local otfdata = tfmdata.shared.otfdata
- local featuredata = otfdata.shared.featuredata
- -- caches
- featuredata.gsub_multiple = { }
- featuredata.gsub_alternate = { }
- featuredata.gsub_single = { }
- featuredata.gsub_ligature = { }
- featuredata.gsub_contextchain = { }
- featuredata.gsub_reversecontextchain = { }
- featuredata.gpos_pair = { }
- featuredata.gpos_single = { }
- featuredata.gpos_mark2base = { }
- featuredata.gpos_mark2ligature = featuredata.gpos_mark2base
- featuredata.gpos_mark2mark = featuredata.gpos_mark2base
- featuredata.gpos_cursive = { }
- featuredata.gpos_contextchain = featuredata.gsub_contextchain
- featuredata.gpos_reversecontextchain = featuredata.gsub_reversecontextchain
- --
+ -- beware we need to use the topmost properties table
+ local rawdata = tfmdata.shared.rawdata
+ local properties = rawdata.properties
+ if not properties.initialized then
+ local starttime = trace_preparing and os.clock()
+ local resources = rawdata.resources
+ resources.lookuphash = resources.lookuphash or { }
prepare_contextchains(tfmdata)
prepare_lookups(tfmdata)
- otfdata.shared.initialized = true
+ properties.initialized = true
if trace_preparing then
- logs.report("otf process","preparation time is %0.3f seconds for %s",os.clock()-t,tfmdata.fullname or "?")
+ report_prepare("preparation time is %0.3f seconds for %s",os.clock()-starttime,tfmdata.properties.fullname or "?")
end
end
end
end
+registerotffeature {
+ name = "features",
+ description = "features",
+ default = true,
+ initializers = {
+ position = 1,
+ node = featuresinitializer,
+ },
+ processors = {
+ node = featuresprocessor,
+ }
+}
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['luatex-fonts-chr'] = {
+ version = 1.001,
+ comment = "companion to luatex-fonts.lua",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+characters = characters or { }
+characters.categories = {
+ [0x0300]="mn",
+ [0x0301]="mn",
+ [0x0302]="mn",
+ [0x0303]="mn",
+ [0x0304]="mn",
+ [0x0305]="mn",
+ [0x0306]="mn",
+ [0x0307]="mn",
+ [0x0308]="mn",
+ [0x0309]="mn",
+ [0x030A]="mn",
+ [0x030B]="mn",
+ [0x030C]="mn",
+ [0x030D]="mn",
+ [0x030E]="mn",
+ [0x030F]="mn",
+ [0x0310]="mn",
+ [0x0311]="mn",
+ [0x0312]="mn",
+ [0x0313]="mn",
+ [0x0314]="mn",
+ [0x0315]="mn",
+ [0x0316]="mn",
+ [0x0317]="mn",
+ [0x0318]="mn",
+ [0x0319]="mn",
+ [0x031A]="mn",
+ [0x031B]="mn",
+ [0x031C]="mn",
+ [0x031D]="mn",
+ [0x031E]="mn",
+ [0x031F]="mn",
+ [0x0320]="mn",
+ [0x0321]="mn",
+ [0x0322]="mn",
+ [0x0323]="mn",
+ [0x0324]="mn",
+ [0x0325]="mn",
+ [0x0326]="mn",
+ [0x0327]="mn",
+ [0x0328]="mn",
+ [0x0329]="mn",
+ [0x032A]="mn",
+ [0x032B]="mn",
+ [0x032C]="mn",
+ [0x032D]="mn",
+ [0x032E]="mn",
+ [0x032F]="mn",
+ [0x0330]="mn",
+ [0x0331]="mn",
+ [0x0332]="mn",
+ [0x0333]="mn",
+ [0x0334]="mn",
+ [0x0335]="mn",
+ [0x0336]="mn",
+ [0x0337]="mn",
+ [0x0338]="mn",
+ [0x0339]="mn",
+ [0x033A]="mn",
+ [0x033B]="mn",
+ [0x033C]="mn",
+ [0x033D]="mn",
+ [0x033E]="mn",
+ [0x033F]="mn",
+ [0x0340]="mn",
+ [0x0341]="mn",
+ [0x0342]="mn",
+ [0x0343]="mn",
+ [0x0344]="mn",
+ [0x0345]="mn",
+ [0x0346]="mn",
+ [0x0347]="mn",
+ [0x0348]="mn",
+ [0x0349]="mn",
+ [0x034A]="mn",
+ [0x034B]="mn",
+ [0x034C]="mn",
+ [0x034D]="mn",
+ [0x034E]="mn",
+ [0x034F]="mn",
+ [0x0350]="mn",
+ [0x0351]="mn",
+ [0x0352]="mn",
+ [0x0353]="mn",
+ [0x0354]="mn",
+ [0x0355]="mn",
+ [0x0356]="mn",
+ [0x0357]="mn",
+ [0x0358]="mn",
+ [0x0359]="mn",
+ [0x035A]="mn",
+ [0x035B]="mn",
+ [0x035C]="mn",
+ [0x035D]="mn",
+ [0x035E]="mn",
+ [0x035F]="mn",
+ [0x0360]="mn",
+ [0x0361]="mn",
+ [0x0362]="mn",
+ [0x0363]="mn",
+ [0x0364]="mn",
+ [0x0365]="mn",
+ [0x0366]="mn",
+ [0x0367]="mn",
+ [0x0368]="mn",
+ [0x0369]="mn",
+ [0x036A]="mn",
+ [0x036B]="mn",
+ [0x036C]="mn",
+ [0x036D]="mn",
+ [0x036E]="mn",
+ [0x036F]="mn",
+ [0x0483]="mn",
+ [0x0484]="mn",
+ [0x0485]="mn",
+ [0x0486]="mn",
+ [0x0591]="mn",
+ [0x0592]="mn",
+ [0x0593]="mn",
+ [0x0594]="mn",
+ [0x0595]="mn",
+ [0x0596]="mn",
+ [0x0597]="mn",
+ [0x0598]="mn",
+ [0x0599]="mn",
+ [0x059A]="mn",
+ [0x059B]="mn",
+ [0x059C]="mn",
+ [0x059D]="mn",
+ [0x059E]="mn",
+ [0x059F]="mn",
+ [0x05A0]="mn",
+ [0x05A1]="mn",
+ [0x05A2]="mn",
+ [0x05A3]="mn",
+ [0x05A4]="mn",
+ [0x05A5]="mn",
+ [0x05A6]="mn",
+ [0x05A7]="mn",
+ [0x05A8]="mn",
+ [0x05A9]="mn",
+ [0x05AA]="mn",
+ [0x05AB]="mn",
+ [0x05AC]="mn",
+ [0x05AD]="mn",
+ [0x05AE]="mn",
+ [0x05AF]="mn",
+ [0x05B0]="mn",
+ [0x05B1]="mn",
+ [0x05B2]="mn",
+ [0x05B3]="mn",
+ [0x05B4]="mn",
+ [0x05B5]="mn",
+ [0x05B6]="mn",
+ [0x05B7]="mn",
+ [0x05B8]="mn",
+ [0x05B9]="mn",
+ [0x05BA]="mn",
+ [0x05BB]="mn",
+ [0x05BC]="mn",
+ [0x05BD]="mn",
+ [0x05BF]="mn",
+ [0x05C1]="mn",
+ [0x05C2]="mn",
+ [0x05C4]="mn",
+ [0x05C5]="mn",
+ [0x05C7]="mn",
+ [0x0610]="mn",
+ [0x0611]="mn",
+ [0x0612]="mn",
+ [0x0613]="mn",
+ [0x0614]="mn",
+ [0x0615]="mn",
+ [0x064B]="mn",
+ [0x064C]="mn",
+ [0x064D]="mn",
+ [0x064E]="mn",
+ [0x064F]="mn",
+ [0x0650]="mn",
+ [0x0651]="mn",
+ [0x0652]="mn",
+ [0x0653]="mn",
+ [0x0654]="mn",
+ [0x0655]="mn",
+ [0x0656]="mn",
+ [0x0657]="mn",
+ [0x0658]="mn",
+ [0x0659]="mn",
+ [0x065A]="mn",
+ [0x065B]="mn",
+ [0x065C]="mn",
+ [0x065D]="mn",
+ [0x065E]="mn",
+ [0x0670]="mn",
+ [0x06D6]="mn",
+ [0x06D7]="mn",
+ [0x06D8]="mn",
+ [0x06D9]="mn",
+ [0x06DA]="mn",
+ [0x06DB]="mn",
+ [0x06DC]="mn",
+ [0x06DF]="mn",
+ [0x06E0]="mn",
+ [0x06E1]="mn",
+ [0x06E2]="mn",
+ [0x06E3]="mn",
+ [0x06E4]="mn",
+ [0x06E7]="mn",
+ [0x06E8]="mn",
+ [0x06EA]="mn",
+ [0x06EB]="mn",
+ [0x06EC]="mn",
+ [0x06ED]="mn",
+ [0x0711]="mn",
+ [0x0730]="mn",
+ [0x0731]="mn",
+ [0x0732]="mn",
+ [0x0733]="mn",
+ [0x0734]="mn",
+ [0x0735]="mn",
+ [0x0736]="mn",
+ [0x0737]="mn",
+ [0x0738]="mn",
+ [0x0739]="mn",
+ [0x073A]="mn",
+ [0x073B]="mn",
+ [0x073C]="mn",
+ [0x073D]="mn",
+ [0x073E]="mn",
+ [0x073F]="mn",
+ [0x0740]="mn",
+ [0x0741]="mn",
+ [0x0742]="mn",
+ [0x0743]="mn",
+ [0x0744]="mn",
+ [0x0745]="mn",
+ [0x0746]="mn",
+ [0x0747]="mn",
+ [0x0748]="mn",
+ [0x0749]="mn",
+ [0x074A]="mn",
+ [0x07A6]="mn",
+ [0x07A7]="mn",
+ [0x07A8]="mn",
+ [0x07A9]="mn",
+ [0x07AA]="mn",
+ [0x07AB]="mn",
+ [0x07AC]="mn",
+ [0x07AD]="mn",
+ [0x07AE]="mn",
+ [0x07AF]="mn",
+ [0x07B0]="mn",
+ [0x07EB]="mn",
+ [0x07EC]="mn",
+ [0x07ED]="mn",
+ [0x07EE]="mn",
+ [0x07EF]="mn",
+ [0x07F0]="mn",
+ [0x07F1]="mn",
+ [0x07F2]="mn",
+ [0x07F3]="mn",
+ [0x0901]="mn",
+ [0x0902]="mn",
+ [0x093C]="mn",
+ [0x0941]="mn",
+ [0x0942]="mn",
+ [0x0943]="mn",
+ [0x0944]="mn",
+ [0x0945]="mn",
+ [0x0946]="mn",
+ [0x0947]="mn",
+ [0x0948]="mn",
+ [0x094D]="mn",
+ [0x0951]="mn",
+ [0x0952]="mn",
+ [0x0953]="mn",
+ [0x0954]="mn",
+ [0x0962]="mn",
+ [0x0963]="mn",
+ [0x0981]="mn",
+ [0x09BC]="mn",
+ [0x09C1]="mn",
+ [0x09C2]="mn",
+ [0x09C3]="mn",
+ [0x09C4]="mn",
+ [0x09CD]="mn",
+ [0x09E2]="mn",
+ [0x09E3]="mn",
+ [0x0A01]="mn",
+ [0x0A02]="mn",
+ [0x0A3C]="mn",
+ [0x0A41]="mn",
+ [0x0A42]="mn",
+ [0x0A47]="mn",
+ [0x0A48]="mn",
+ [0x0A4B]="mn",
+ [0x0A4C]="mn",
+ [0x0A4D]="mn",
+ [0x0A70]="mn",
+ [0x0A71]="mn",
+ [0x0A81]="mn",
+ [0x0A82]="mn",
+ [0x0ABC]="mn",
+ [0x0AC1]="mn",
+ [0x0AC2]="mn",
+ [0x0AC3]="mn",
+ [0x0AC4]="mn",
+ [0x0AC5]="mn",
+ [0x0AC7]="mn",
+ [0x0AC8]="mn",
+ [0x0ACD]="mn",
+ [0x0AE2]="mn",
+ [0x0AE3]="mn",
+ [0x0B01]="mn",
+ [0x0B3C]="mn",
+ [0x0B3F]="mn",
+ [0x0B41]="mn",
+ [0x0B42]="mn",
+ [0x0B43]="mn",
+ [0x0B4D]="mn",
+ [0x0B56]="mn",
+ [0x0B82]="mn",
+ [0x0BC0]="mn",
+ [0x0BCD]="mn",
+ [0x0C3E]="mn",
+ [0x0C3F]="mn",
+ [0x0C40]="mn",
+ [0x0C46]="mn",
+ [0x0C47]="mn",
+ [0x0C48]="mn",
+ [0x0C4A]="mn",
+ [0x0C4B]="mn",
+ [0x0C4C]="mn",
+ [0x0C4D]="mn",
+ [0x0C55]="mn",
+ [0x0C56]="mn",
+ [0x0CBC]="mn",
+ [0x0CBF]="mn",
+ [0x0CC6]="mn",
+ [0x0CCC]="mn",
+ [0x0CCD]="mn",
+ [0x0CE2]="mn",
+ [0x0CE3]="mn",
+ [0x0D41]="mn",
+ [0x0D42]="mn",
+ [0x0D43]="mn",
+ [0x0D4D]="mn",
+ [0x0DCA]="mn",
+ [0x0DD2]="mn",
+ [0x0DD3]="mn",
+ [0x0DD4]="mn",
+ [0x0DD6]="mn",
+ [0x0E31]="mn",
+ [0x0E34]="mn",
+ [0x0E35]="mn",
+ [0x0E36]="mn",
+ [0x0E37]="mn",
+ [0x0E38]="mn",
+ [0x0E39]="mn",
+ [0x0E3A]="mn",
+ [0x0E47]="mn",
+ [0x0E48]="mn",
+ [0x0E49]="mn",
+ [0x0E4A]="mn",
+ [0x0E4B]="mn",
+ [0x0E4C]="mn",
+ [0x0E4D]="mn",
+ [0x0E4E]="mn",
+ [0x0EB1]="mn",
+ [0x0EB4]="mn",
+ [0x0EB5]="mn",
+ [0x0EB6]="mn",
+ [0x0EB7]="mn",
+ [0x0EB8]="mn",
+ [0x0EB9]="mn",
+ [0x0EBB]="mn",
+ [0x0EBC]="mn",
+ [0x0EC8]="mn",
+ [0x0EC9]="mn",
+ [0x0ECA]="mn",
+ [0x0ECB]="mn",
+ [0x0ECC]="mn",
+ [0x0ECD]="mn",
+ [0x0F18]="mn",
+ [0x0F19]="mn",
+ [0x0F35]="mn",
+ [0x0F37]="mn",
+ [0x0F39]="mn",
+ [0x0F71]="mn",
+ [0x0F72]="mn",
+ [0x0F73]="mn",
+ [0x0F74]="mn",
+ [0x0F75]="mn",
+ [0x0F76]="mn",
+ [0x0F77]="mn",
+ [0x0F78]="mn",
+ [0x0F79]="mn",
+ [0x0F7A]="mn",
+ [0x0F7B]="mn",
+ [0x0F7C]="mn",
+ [0x0F7D]="mn",
+ [0x0F7E]="mn",
+ [0x0F80]="mn",
+ [0x0F81]="mn",
+ [0x0F82]="mn",
+ [0x0F83]="mn",
+ [0x0F84]="mn",
+ [0x0F86]="mn",
+ [0x0F87]="mn",
+ [0x0F90]="mn",
+ [0x0F91]="mn",
+ [0x0F92]="mn",
+ [0x0F93]="mn",
+ [0x0F94]="mn",
+ [0x0F95]="mn",
+ [0x0F96]="mn",
+ [0x0F97]="mn",
+ [0x0F99]="mn",
+ [0x0F9A]="mn",
+ [0x0F9B]="mn",
+ [0x0F9C]="mn",
+ [0x0F9D]="mn",
+ [0x0F9E]="mn",
+ [0x0F9F]="mn",
+ [0x0FA0]="mn",
+ [0x0FA1]="mn",
+ [0x0FA2]="mn",
+ [0x0FA3]="mn",
+ [0x0FA4]="mn",
+ [0x0FA5]="mn",
+ [0x0FA6]="mn",
+ [0x0FA7]="mn",
+ [0x0FA8]="mn",
+ [0x0FA9]="mn",
+ [0x0FAA]="mn",
+ [0x0FAB]="mn",
+ [0x0FAC]="mn",
+ [0x0FAD]="mn",
+ [0x0FAE]="mn",
+ [0x0FAF]="mn",
+ [0x0FB0]="mn",
+ [0x0FB1]="mn",
+ [0x0FB2]="mn",
+ [0x0FB3]="mn",
+ [0x0FB4]="mn",
+ [0x0FB5]="mn",
+ [0x0FB6]="mn",
+ [0x0FB7]="mn",
+ [0x0FB8]="mn",
+ [0x0FB9]="mn",
+ [0x0FBA]="mn",
+ [0x0FBB]="mn",
+ [0x0FBC]="mn",
+ [0x0FC6]="mn",
+ [0x102D]="mn",
+ [0x102E]="mn",
+ [0x102F]="mn",
+ [0x1030]="mn",
+ [0x1032]="mn",
+ [0x1036]="mn",
+ [0x1037]="mn",
+ [0x1039]="mn",
+ [0x1058]="mn",
+ [0x1059]="mn",
+ [0x135F]="mn",
+ [0x1712]="mn",
+ [0x1713]="mn",
+ [0x1714]="mn",
+ [0x1732]="mn",
+ [0x1733]="mn",
+ [0x1734]="mn",
+ [0x1752]="mn",
+ [0x1753]="mn",
+ [0x1772]="mn",
+ [0x1773]="mn",
+ [0x17B7]="mn",
+ [0x17B8]="mn",
+ [0x17B9]="mn",
+ [0x17BA]="mn",
+ [0x17BB]="mn",
+ [0x17BC]="mn",
+ [0x17BD]="mn",
+ [0x17C6]="mn",
+ [0x17C9]="mn",
+ [0x17CA]="mn",
+ [0x17CB]="mn",
+ [0x17CC]="mn",
+ [0x17CD]="mn",
+ [0x17CE]="mn",
+ [0x17CF]="mn",
+ [0x17D0]="mn",
+ [0x17D1]="mn",
+ [0x17D2]="mn",
+ [0x17D3]="mn",
+ [0x17DD]="mn",
+ [0x180B]="mn",
+ [0x180C]="mn",
+ [0x180D]="mn",
+ [0x18A9]="mn",
+ [0x1920]="mn",
+ [0x1921]="mn",
+ [0x1922]="mn",
+ [0x1927]="mn",
+ [0x1928]="mn",
+ [0x1932]="mn",
+ [0x1939]="mn",
+ [0x193A]="mn",
+ [0x193B]="mn",
+ [0x1A17]="mn",
+ [0x1A18]="mn",
+ [0x1B00]="mn",
+ [0x1B01]="mn",
+ [0x1B02]="mn",
+ [0x1B03]="mn",
+ [0x1B34]="mn",
+ [0x1B36]="mn",
+ [0x1B37]="mn",
+ [0x1B38]="mn",
+ [0x1B39]="mn",
+ [0x1B3A]="mn",
+ [0x1B3C]="mn",
+ [0x1B42]="mn",
+ [0x1B6B]="mn",
+ [0x1B6C]="mn",
+ [0x1B6D]="mn",
+ [0x1B6E]="mn",
+ [0x1B6F]="mn",
+ [0x1B70]="mn",
+ [0x1B71]="mn",
+ [0x1B72]="mn",
+ [0x1B73]="mn",
+ [0x1DC0]="mn",
+ [0x1DC1]="mn",
+ [0x1DC2]="mn",
+ [0x1DC3]="mn",
+ [0x1DC4]="mn",
+ [0x1DC5]="mn",
+ [0x1DC6]="mn",
+ [0x1DC7]="mn",
+ [0x1DC8]="mn",
+ [0x1DC9]="mn",
+ [0x1DCA]="mn",
+ [0x1DFE]="mn",
+ [0x1DFF]="mn",
+ [0x20D0]="mn",
+ [0x20D1]="mn",
+ [0x20D2]="mn",
+ [0x20D3]="mn",
+ [0x20D4]="mn",
+ [0x20D5]="mn",
+ [0x20D6]="mn",
+ [0x20D7]="mn",
+ [0x20D8]="mn",
+ [0x20D9]="mn",
+ [0x20DA]="mn",
+ [0x20DB]="mn",
+ [0x20DC]="mn",
+ [0x20E1]="mn",
+ [0x20E5]="mn",
+ [0x20E6]="mn",
+ [0x20E7]="mn",
+ [0x20E8]="mn",
+ [0x20E9]="mn",
+ [0x20EA]="mn",
+ [0x20EB]="mn",
+ [0x20EC]="mn",
+ [0x20ED]="mn",
+ [0x20EE]="mn",
+ [0x20EF]="mn",
+ [0x302A]="mn",
+ [0x302B]="mn",
+ [0x302C]="mn",
+ [0x302D]="mn",
+ [0x302E]="mn",
+ [0x302F]="mn",
+ [0x3099]="mn",
+ [0x309A]="mn",
+ [0xA806]="mn",
+ [0xA80B]="mn",
+ [0xA825]="mn",
+ [0xA826]="mn",
+ [0xFB1E]="mn",
+ [0xFE00]="mn",
+ [0xFE01]="mn",
+ [0xFE02]="mn",
+ [0xFE03]="mn",
+ [0xFE04]="mn",
+ [0xFE05]="mn",
+ [0xFE06]="mn",
+ [0xFE07]="mn",
+ [0xFE08]="mn",
+ [0xFE09]="mn",
+ [0xFE0A]="mn",
+ [0xFE0B]="mn",
+ [0xFE0C]="mn",
+ [0xFE0D]="mn",
+ [0xFE0E]="mn",
+ [0xFE0F]="mn",
+ [0xFE20]="mn",
+ [0xFE21]="mn",
+ [0xFE22]="mn",
+ [0xFE23]="mn",
+}
+
end -- closure
do -- begin closure to overcome local limits and interference
@@ -10807,49 +11100,109 @@ local type, tostring, match, format, concat = type, tostring, string.match, stri
if not trackers then trackers = { register = function() end } end
local trace_analyzing = false trackers.register("otf.analyzing", function(v) trace_analyzing = v end)
-local trace_cjk = false trackers.register("cjk.injections", function(v) trace_cjk = v end)
-trackers.register("cjk.analyzing","otf.analyzing")
+local fonts, nodes, node = fonts, nodes, node
-fonts = fonts or { }
-fonts.analyzers = fonts.analyzers or { }
-fonts.analyzers.initializers = fonts.analyzers.initializers or { node = { otf = { } } }
-fonts.analyzers.methods = fonts.analyzers.methods or { node = { otf = { } } }
+local allocate = utilities.storage.allocate
-local otf = fonts.otf
-local tfm = fonts.tfm
+local otf = fonts.handlers.otf
-local initializers = fonts.analyzers.initializers
-local methods = fonts.analyzers.methods
+local analyzers = fonts.analyzers
+local initializers = allocate()
+local methods = allocate()
-local glyph = node.id('glyph')
-local glue = node.id('glue')
-local penalty = node.id('penalty')
+analyzers.initializers = initializers
+analyzers.methods = methods
+analyzers.useunicodemarks = false
-local set_attribute = node.set_attribute
-local has_attribute = node.has_attribute
-local traverse_id = node.traverse_id
-local traverse_node_list = node.traverse
+local nodecodes = nodes.nodecodes
+local glyph_code = nodecodes.glyph
-local fontdata = fonts.ids
-local state = attributes.private('state')
+local set_attribute = node.set_attribute
+local has_attribute = node.has_attribute
+local traverse_id = node.traverse_id
+local traverse_node_list = node.traverse
-local fcs = (fonts.color and fonts.color.set) or function() end
-local fcr = (fonts.color and fonts.color.reset) or function() end
+local fontdata = fonts.hashes.identifiers
+local state = attributes.private('state')
+local categories = characters and characters.categories or { } -- sorry, only in context
-local a_to_script = otf.a_to_script
-local a_to_language = otf.a_to_language
+local tracers = nodes.tracers
+local colortracers = tracers and tracers.colors
+local setnodecolor = colortracers and colortracers.set or function() end
+local resetnodecolor = colortracers and colortracers.reset or function() end
+
+local otffeatures = fonts.constructors.newfeatures("otf")
+local registerotffeature = otffeatures.register
+
+--[[ldx--
+<p>Analyzers run per script and/or language and are needed in order to
+process features right.</p>
+--ldx]]--
+
+-- 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
+
+local state = attributes.private('state')
+
+function analyzers.setstate(head,font)
+ local useunicodemarks = analyzers.useunicodemarks
+ local tfmdata = fontdata[font]
+ local characters = tfmdata.characters
+ local descriptions = tfmdata.descriptions
+ local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean
+ while current do
+ local id = current.id
+ if id == glyph_code and current.font == font then
+ local char = current.char
+ local d = descriptions[char]
+ if d then
+ if d.class == "mark" or (useunicodemarks and categories[char] == "mn") then
+ done = true
+ set_attribute(current,state,5) -- mark
+ elseif n == 0 then
+ first, last, n = current, current, 1
+ set_attribute(current,state,1) -- init
+ else
+ last, n = current, n+1
+ set_attribute(current,state,2) -- medi
+ end
+ else -- finish
+ if first and first == last then
+ set_attribute(last,state,4) -- isol
+ elseif last then
+ set_attribute(last,state,3) -- fina
+ end
+ first, last, n = nil, nil, 0
+ end
+ elseif id == disc_code then
+ -- always in the middle
+ set_attribute(current,state,2) -- midi
+ last = current
+ else -- finish
+ if first and first == last then
+ set_attribute(last,state,4) -- isol
+ elseif last then
+ set_attribute(last,state,3) -- fina
+ end
+ first, last, n = nil, nil, 0
+ end
+ current = current.next
+ end
+ if first and first == last then
+ set_attribute(last,state,4) -- isol
+ elseif last then
+ set_attribute(last,state,3) -- 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
-function fonts.initializers.node.otf.analyze(tfmdata,value,attr)
- if attr and attr > 0 then
- script, language = a_to_script[attr], a_to_language[attr]
- else
- script, language = tfmdata.script, tfmdata.language
- end
+local function analyzeinitializer(tfmdata,value) -- attr
+ local script, language = otf.scriptandlanguage(tfmdata) -- attr
local action = initializers[script]
if action then
if type(action) == "function" then
@@ -10861,17 +11214,11 @@ function fonts.initializers.node.otf.analyze(tfmdata,value,attr)
end
end
end
- return nil
end
-function fonts.methods.node.otf.analyze(head,font,attr)
+local function analyzeprocessor(head,font,attr)
local tfmdata = fontdata[font]
- local script, language
- if attr and attr > 0 then
- script, language = a_to_script[attr], a_to_language[attr]
- else
- script, language = tfmdata.script, tfmdata.language
- end
+ local script, language = otf.scriptandlanguage(tfmdata,attr)
local action = methods[script]
if action then
if type(action) == "function" then
@@ -10886,14 +11233,25 @@ function fonts.methods.node.otf.analyze(head,font,attr)
return head, false
end
-otf.features.register("analyze",true) -- we always analyze
-table.insert(fonts.triggers,"analyze") -- we need a proper function for doing this
+registerotffeature {
+ name = "analyze",
+ description = "analysis of (for instance) character classes",
+ default = true,
+ initializers = {
+ node = analyzeinitializer,
+ },
+ processors = {
+ position = 1,
+ node = analyzeprocessor,
+ }
+}
-- latin
-fonts.analyzers.methods.latn = fonts.analyzers.aux.setstate
+methods.latn = analyzers.setstate
--- this info eventually will go into char-def
+-- this info eventually will go into char-def adn we will have a state
+-- table for generic then
local zwnj = 0x200C
local zwj = 0x200D
@@ -10968,15 +11326,15 @@ local arab_warned = { }
local function warning(current,what)
local char = current.char
if not arab_warned[char] then
- log.report("analyze","arab: character %s (U+%04X) has no %s class", char, char, what)
+ log.report("analyze","arab: character %s (U+%05X) has no %s class", char, char, what)
arab_warned[char] = true
end
end
-function fonts.analyzers.methods.nocolor(head,font,attr)
- for n in traverse_node_list(head,glyph) do
+function methods.nocolor(head,font,attr)
+ for n in traverse_id(glyph_code,head) do
if not font or n.font == font then
- fcr(n)
+ resetnodecolor(n)
end
end
return head, true
@@ -10988,22 +11346,22 @@ local function finish(first,last)
local fc = first.char
if isol_fina_medi_init[fc] or isol_fina[fc] then
set_attribute(first,state,4) -- isol
- if trace_analyzing then fcs(first,"font:isol") end
+ if trace_analyzing then setnodecolor(first,"font:isol") end
else
warning(first,"isol")
set_attribute(first,state,0) -- error
- if trace_analyzing then fcr(first) end
+ if trace_analyzing then resetnodecolor(first) end
end
else
local lc = last.char
if isol_fina_medi_init[lc] or isol_fina[lc] then -- why isol here ?
-- if laststate == 1 or laststate == 2 or laststate == 4 then
set_attribute(last,state,3) -- fina
- if trace_analyzing then fcs(last,"font:fina") end
+ if trace_analyzing then setnodecolor(last,"font:fina") end
else
warning(last,"fina")
set_attribute(last,state,0) -- error
- if trace_analyzing then fcr(last) end
+ if trace_analyzing then resetnodecolor(last) end
end
end
first, last = nil, nil
@@ -11012,41 +11370,42 @@ local function finish(first,last)
local fc = first.char
if isol_fina_medi_init[fc] or isol_fina[fc] then
set_attribute(first,state,4) -- isol
- if trace_analyzing then fcs(first,"font:isol") end
+ if trace_analyzing then setnodecolor(first,"font:isol") end
else
warning(first,"isol")
set_attribute(first,state,0) -- error
- if trace_analyzing then fcr(first) end
+ if trace_analyzing then resetnodecolor(first) end
end
first = nil
end
return first, last
end
-function fonts.analyzers.methods.arab(head,font,attr) -- maybe make a special version with no trace
+function methods.arab(head,font,attr) -- maybe make a special version with no trace
+ local useunicodemarks = analyzers.useunicodemarks
local tfmdata = fontdata[font]
- local marks = tfmdata.marks
+ local marks = tfmdata.resources.marks
local first, last, current, done = nil, nil, head, false
while current do
- if current.id == glyph and current.subtype<256 and current.font == font and not has_attribute(current,state) then
+ if current.id == glyph_code and current.subtype<256 and current.font == font and not has_attribute(current,state) then
done = true
local char = current.char
- if marks[char] then
+ if marks[char] or (useunicodemarks and categories[char] == "mn") then
set_attribute(current,state,5) -- mark
- if trace_analyzing then fcs(current,"font:mark") end
+ if trace_analyzing then setnodecolor(current,"font:mark") end
elseif isol[char] then -- can be zwj or zwnj too
first, last = finish(first,last)
set_attribute(current,state,4) -- isol
- if trace_analyzing then fcs(current,"font:isol") end
+ if trace_analyzing then setnodecolor(current,"font:isol") end
first, last = nil, nil
elseif not first then
if isol_fina_medi_init[char] then
set_attribute(current,state,1) -- init
- if trace_analyzing then fcs(current,"font:init") end
+ if trace_analyzing then setnodecolor(current,"font:init") end
first, last = first or current, current
elseif isol_fina[char] then
set_attribute(current,state,4) -- isol
- if trace_analyzing then fcs(current,"font:isol") end
+ if trace_analyzing then setnodecolor(current,"font:isol") end
first, last = nil, nil
else -- no arab
first, last = finish(first,last)
@@ -11054,18 +11413,18 @@ function fonts.analyzers.methods.arab(head,font,attr) -- maybe make a special ve
elseif isol_fina_medi_init[char] then
first, last = first or current, current
set_attribute(current,state,2) -- medi
- if trace_analyzing then fcs(current,"font:medi") end
+ if trace_analyzing then setnodecolor(current,"font:medi") end
elseif isol_fina[char] then
if not has_attribute(last,state,1) then
-- tricky, we need to check what last may be !
set_attribute(last,state,2) -- medi
- if trace_analyzing then fcs(last,"font:medi") end
+ if trace_analyzing then setnodecolor(last,"font:medi") end
end
set_attribute(current,state,3) -- fina
- if trace_analyzing then fcs(current,"font:fina") end
+ if trace_analyzing then setnodecolor(current,"font:fina") end
first, last = nil, nil
elseif char >= 0x0600 and char <= 0x06FF then
- if trace_analyzing then fcs(current,"font:rest") end
+ if trace_analyzing then setnodecolor(current,"font:rest") end
first, last = finish(first,last)
else --no
first, last = finish(first,last)
@@ -11079,224 +11438,48 @@ function fonts.analyzers.methods.arab(head,font,attr) -- maybe make a special ve
return head, done
end
+directives.register("otf.analyze.useunicodemarks",function(v)
+ analyzers.useunicodemarks = v
+end)
+
end -- closure
do -- begin closure to overcome local limits and interference
-if not modules then modules = { } end modules ['font-otc'] = {
+if not modules then modules = { } end modules ['luatex-fonts-lua'] = {
version = 1.001,
- comment = "companion to font-otf.lua (context)",
+ comment = "companion to luatex-*.tex",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
-local format, insert = string.format, table.insert
-local type, next = type, next
-
--- we assume that the other otf stuff is loaded already
-
-local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
-
-local otf = fonts.otf
-local tfm = fonts.tfm
-
--- instead of "script = "DFLT", langs = { 'dflt' }" we now use wildcards (we used to
--- have always); some day we can write a "force always when true" trick for other
--- features as well
---
--- we could have a tnum variant as well
-
-local extra_lists = {
- tlig = {
- {
- endash = "hyphen hyphen",
- emdash = "hyphen hyphen hyphen",
- -- quotedblleft = "quoteleft quoteleft",
- -- quotedblright = "quoteright quoteright",
- -- quotedblleft = "grave grave",
- -- quotedblright = "quotesingle quotesingle",
- -- quotedblbase = "comma comma",
- },
- },
- trep = {
- {
- -- [0x0022] = 0x201D,
- [0x0027] = 0x2019,
- -- [0x0060] = 0x2018,
- },
- },
- anum = {
- { -- arabic
- [0x0030] = 0x0660,
- [0x0031] = 0x0661,
- [0x0032] = 0x0662,
- [0x0033] = 0x0663,
- [0x0034] = 0x0664,
- [0x0035] = 0x0665,
- [0x0036] = 0x0666,
- [0x0037] = 0x0667,
- [0x0038] = 0x0668,
- [0x0039] = 0x0669,
- },
- { -- persian
- [0x0030] = 0x06F0,
- [0x0031] = 0x06F1,
- [0x0032] = 0x06F2,
- [0x0033] = 0x06F3,
- [0x0034] = 0x06F4,
- [0x0035] = 0x06F5,
- [0x0036] = 0x06F6,
- [0x0037] = 0x06F7,
- [0x0038] = 0x06F8,
- [0x0039] = 0x06F9,
- },
- },
-}
-
-local extra_features = { -- maybe just 1..n so that we prescribe order
- tlig = {
- {
- features = { { scripts = { { script = "*", langs = { "*" }, } }, tag = "tlig", comment = "added bij mkiv" }, },
- name = "ctx_tlig_1",
- subtables = { { name = "ctx_tlig_1_s" } },
- type = "gsub_ligature",
- flags = { },
- },
- },
- trep = {
- {
- features = { { scripts = { { script = "*", langs = { "*" }, } }, tag = "trep", comment = "added bij mkiv" }, },
- name = "ctx_trep_1",
- subtables = { { name = "ctx_trep_1_s" } },
- type = "gsub_single",
- flags = { },
- },
- },
- anum = {
- {
- features = { { scripts = { { script = "arab", langs = { "dflt", "FAR" }, } }, tag = "anum", comment = "added bij mkiv" }, },
- name = "ctx_anum_1",
- subtables = { { name = "ctx_anum_1_s" } },
- type = "gsub_single",
- flags = { },
- },
- {
- features = { { scripts = { { script = "arab", langs = { "URD" }, } }, tag = "anum", comment = "added bij mkiv" }, },
- name = "ctx_anum_2",
- subtables = { { name = "ctx_anum_2_s" } },
- type = "gsub_single",
- flags = { },
- },
- },
-}
-
-fonts.otf.enhancers["add some missing characters"] = function(data,filename)
- -- todo
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
end
-fonts.otf.enhancers["enrich with features"] = function(data,filename)
- -- could be done elsewhere (true can be #)
- local used = { }
- for i=1,#otf.glists do
- local g = data[otf.glists[i]]
- if g then
- for i=1,#g do
- local f = g[i].features
- if f then
- for i=1,#f do
- local t = f[i].tag
- if t then used[t] = true end
- end
- end
- end
+local fonts = fonts
+fonts.formats.lua = "lua"
+
+function fonts.readers.lua(specification)
+ local fullname = specification.filename or ""
+ if fullname == "" then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ fullname = specification.name .. "." .. forced
+ else
+ fullname = specification.name
end
end
- --
- local glyphs = data.glyphs
- local indices = data.map.map
- data.gsub = data.gsub or { }
- for kind, specifications in next, extra_features do
- if not used[kind] then
- local done = 0
- for s=1,#specifications do
- local added = false
- local specification = specifications[s]
- local list = extra_lists[kind][s]
- local name = specification.name .. "_s"
- if specification.type == "gsub_ligature" then
- for unicode, index in next, indices do
- local glyph = glyphs[index]
- local ligature = list[glyph.name]
- if ligature then
- local o = glyph.lookups or { }
- -- o[name] = { "ligature", ligature, glyph.name }
- o[name] = {
- {
- ["type"] = "ligature",
- ["specification"] = {
- char = glyph.name,
- components = ligature,
- }
- }
- }
- glyph.lookups, done, added = o, done+1, true
- end
- end
- elseif specification.type == "gsub_single" then
- for unicode, index in next, indices do
- local glyph = glyphs[index]
- local r = list[unicode]
- if r then
- local replacement = indices[r]
- if replacement and glyphs[replacement] then
- local o = glyph.lookups or { }
- -- o[name] = { { "substitution", glyphs[replacement].name } }
- o[name] = {
- {
- ["type"] = "substitution",
- ["specification"] = {
- variant = glyphs[replacement].name,
- }
- }
- }
- glyph.lookups, done, added = o, done+1, true
- end
- end
- end
- end
- if added then
- insert(data.gsub,s,table.fastcopy(specification)) -- right order
- end
- end
- if done > 0 then
- if trace_loading then
- logs.report("load otf","enhance: registering %s feature (%s glyphs affected)",kind,done)
- end
- end
- end
+ local fullname = resolvers.findfile(fullname) or ""
+ if fullname ~= "" then
+ local loader = loadfile(fullname)
+ loader = loader and loader()
+ return loader and loader(specification)
end
end
-otf.tables.features['tlig'] = 'TeX Ligatures'
-otf.tables.features['trep'] = 'TeX Replacements'
-otf.tables.features['anum'] = 'Arabic Digits'
-
-otf.features.register_base_substitution('tlig')
-otf.features.register_base_substitution('trep')
-otf.features.register_base_substitution('anum')
-
--- the functionality is defined elsewhere
-
-fonts.initializers.base.otf.equaldigits = fonts.initializers.common.equaldigits
-fonts.initializers.node.otf.equaldigits = fonts.initializers.common.equaldigits
-
-fonts.initializers.base.otf.lineheight = fonts.initializers.common.lineheight
-fonts.initializers.node.otf.lineheight = fonts.initializers.common.lineheight
-
-fonts.initializers.base.otf.compose = fonts.initializers.common.compose
-fonts.initializers.node.otf.compose = fonts.initializers.common.compose
-
end -- closure
do -- begin closure to overcome local limits and interference
@@ -11309,58 +11492,53 @@ if not modules then modules = { } end modules ['font-def'] = {
license = "see context related readme files"
}
-local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower
+local concat = table.concat
+local format, gmatch, match, find, lower, gsub = string.format, string.gmatch, string.match, string.find, string.lower, string.gsub
local tostring, next = tostring, next
local lpegmatch = lpeg.match
+local allocate = utilities.storage.allocate
+
local trace_defining = false trackers .register("fonts.defining", function(v) trace_defining = v end)
local directive_embedall = false directives.register("fonts.embedall", function(v) directive_embedall = v end)
trackers.register("fonts.loading", "fonts.defining", "otf.loading", "afm.loading", "tfm.loading")
trackers.register("fonts.all", "fonts.*", "otf.*", "afm.*", "tfm.*")
+local report_defining = logs.reporter("fonts","defining")
+
--[[ldx--
<p>Here we deal with defining fonts. We do so by intercepting the
default loader that only handles <l n='tfm'/>.</p>
--ldx]]--
-fonts = fonts or { }
-fonts.define = fonts.define or { }
-fonts.tfm = fonts.tfm or { }
-fonts.ids = fonts.ids or { }
-fonts.vf = fonts.vf or { }
-fonts.used = fonts.used or { }
+local fonts = fonts
+local fontdata = fonts.hashes.identifiers
+local readers = fonts.readers
+local definers = fonts.definers
+local specifiers = fonts.specifiers
+local constructors = fonts.constructors
-local tfm = fonts.tfm
-local vf = fonts.vf
-local define = fonts.define
+readers.sequence = allocate { 'otf', 'ttf', 'afm', 'tfm', 'lua' } -- dfont ttc
-tfm.version = 1.01
-tfm.cache = containers.define("fonts", "tfm", tfm.version, false) -- better in font-tfm
+local variants = allocate()
+specifiers.variants = variants
-define.method = "afm or tfm" -- afm, tfm, afm or tfm, tfm or afm
-define.specify = fonts.define.specify or { }
-define.methods = fonts.define.methods or { }
+definers.methods = definers.methods or { }
-tfm.fonts = tfm.fonts or { }
-tfm.readers = tfm.readers or { }
-tfm.internalized = tfm.internalized or { } -- internal tex numbers
+local internalized = allocate() -- internal tex numbers (private)
-tfm.readers.sequence = { 'otf', 'ttf', 'afm', 'tfm' }
-tfm.auto_afm = true
-
-local readers = tfm.readers
-local sequence = readers.sequence
+local loadedfonts = constructors.loadedfonts
+local designsizes = constructors.designsizes
--[[ldx--
<p>We hardly gain anything when we cache the final (pre scaled)
-<l n='tfm'/> table. But it can be handy for debugging.</p>
+<l n='tfm'/> table. But it can be handy for debugging, so we no
+longer carry this code along. Also, we now have quite some reference
+to other tables so we would end up with lots of catches.</p>
--ldx]]--
-fonts.version = 1.05
-fonts.cache = containers.define("fonts", "def", fonts.version, false)
-
--[[ldx--
<p>We can prefix a font specification by <type>name:</type> or
<type>file:</type>. The first case will result in a lookup in the
@@ -11380,7 +11558,7 @@ and prepares a table that will move along as we proceed.</p>
-- name name(sub) name(sub)*spec name*spec
-- name@spec*oeps
-local splitter, specifiers = nil, ""
+local splitter, splitspecifiers = nil, ""
local P, C, S, Cc = lpeg.P, lpeg.C, lpeg.S, lpeg.Cc
@@ -11389,13 +11567,13 @@ local right = P(")")
local colon = P(":")
local space = P(" ")
-define.defaultlookup = "file"
+definers.defaultlookup = "file"
local prefixpattern = P(false)
-function define.add_specifier(symbol)
- specifiers = specifiers .. symbol
- local method = S(specifiers)
+local function addspecifier(symbol)
+ splitspecifiers = splitspecifiers .. symbol
+ local method = S(splitspecifiers)
local lookup = C(prefixpattern) * colon
local sub = left * C(P(1-left-right-method)^1) * right
local specification = C(method) * C(P(1)^1)
@@ -11403,36 +11581,39 @@ function define.add_specifier(symbol)
splitter = P((lookup + Cc("")) * name * (sub + Cc("")) * (specification + Cc("")))
end
-function define.add_lookup(str,default)
+local function addlookup(str,default)
prefixpattern = prefixpattern + P(str)
end
-define.add_lookup("file")
-define.add_lookup("name")
-define.add_lookup("spec")
+definers.addlookup = addlookup
-function define.get_specification(str)
+addlookup("file")
+addlookup("name")
+addlookup("spec")
+
+local function getspecification(str)
return lpegmatch(splitter,str)
end
-function define.register_split(symbol,action)
- define.add_specifier(symbol)
- define.specify[symbol] = action
+definers.getspecification = getspecification
+
+function definers.registersplit(symbol,action,verbosename)
+ addspecifier(symbol)
+ variants[symbol] = action
+ if verbosename then
+ variants[verbosename] = action
+ end
end
-function define.makespecification(specification, lookup, name, sub, method, detail, size)
+function definers.makespecification(specification, lookup, name, sub, method, detail, size)
size = size or 655360
if trace_defining then
- logs.report("define font","%s -> lookup: %s, name: %s, sub: %s, method: %s, detail: %s",
+ report_defining("%s -> lookup: %s, name: %s, sub: %s, method: %s, detail: %s",
specification, (lookup ~= "" and lookup) or "[file]", (name ~= "" and name) or "-",
(sub ~= "" and sub) or "-", (method ~= "" and method) or "-", (detail ~= "" and detail) or "-")
end
---~ if specification.lookup then
---~ lookup = specification.lookup -- can come from xetex [] syntax
---~ specification.lookup = nil
---~ end
if not lookup or lookup == "" then
- lookup = define.defaultlookup
+ lookup = definers.defaultlookup
end
local t = {
lookup = lookup, -- forced type
@@ -11449,112 +11630,49 @@ function define.makespecification(specification, lookup, name, sub, method, deta
return t
end
-function define.analyze(specification, size)
+function definers.analyze(specification, size)
-- can be optimized with locals
- local lookup, name, sub, method, detail = define.get_specification(specification or "")
- return define.makespecification(specification, lookup, name, sub, method, detail, size)
+ local lookup, name, sub, method, detail = getspecification(specification or "")
+ return definers.makespecification(specification, lookup, name, sub, method, detail, size)
end
--[[ldx--
-<p>A unique hash value is generated by:</p>
+<p>We can resolve the filename using the next function:</p>
--ldx]]--
-local sortedhashkeys = table.sortedhashkeys
+definers.resolvers = definers.resolvers or { }
+local resolvers = definers.resolvers
-function tfm.hash_features(specification)
- local features = specification.features
- if features then
- local t = { }
- local normal = features.normal
- if normal and next(normal) then
- local f = sortedhashkeys(normal)
- for i=1,#f do
- local v = f[i]
- if v ~= "number" and v ~= "features" then -- i need to figure this out, features
- t[#t+1] = v .. '=' .. tostring(normal[v])
- end
- end
- end
- local vtf = features.vtf
- if vtf and next(vtf) then
- local f = sortedhashkeys(vtf)
- for i=1,#f do
- local v = f[i]
- t[#t+1] = v .. '=' .. tostring(vtf[v])
- end
- end
---~ if specification.mathsize then
---~ t[#t+1] = "mathsize=" .. specification.mathsize
---~ end
- if #t > 0 then
- return concat(t,"+")
- end
- end
- return "unknown"
-end
-
-fonts.designsizes = { }
+-- todo: reporter
---[[ldx--
-<p>In principle we can share tfm tables when we are in node for a font, but then
-we need to define a font switch as an id/attr switch which is no fun, so in that
-case users can best use dynamic features ... so, we will not use that speedup. Okay,
-when we get rid of base mode we can optimize even further by sharing, but then we
-loose our testcases for <l n='luatex'/>.</p>
---ldx]]--
-
-function tfm.hash_instance(specification,force)
- local hash, size, fallbacks = specification.hash, specification.size, specification.fallbacks
- if force or not hash then
- hash = tfm.hash_features(specification)
- specification.hash = hash
+function resolvers.file(specification)
+ local suffix = file.suffix(specification.name)
+ if fonts.formats[suffix] then
+ specification.forced = suffix
+ specification.name = file.removesuffix(specification.name)
end
- if size < 1000 and fonts.designsizes[hash] then
- size = math.round(tfm.scaled(size, fonts.designsizes[hash]))
- specification.size = size
- end
---~ local mathsize = specification.mathsize or 0
---~ if mathsize > 0 then
---~ local textsize = specification.textsize
---~ if fallbacks then
---~ return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ] @ ' .. fallbacks
---~ else
---~ return hash .. ' @ ' .. tostring(size) .. ' [ ' .. tostring(mathsize) .. ' : ' .. tostring(textsize) .. ' ]'
---~ end
---~ else
- if fallbacks then
- return hash .. ' @ ' .. tostring(size) .. ' @ ' .. fallbacks
- else
- return hash .. ' @ ' .. tostring(size)
- end
---~ end
end
---[[ldx--
-<p>We can resolve the filename using the next function:</p>
---ldx]]--
-
-define.resolvers = resolvers
-
-function define.resolvers.file(specification)
- specification.forced = file.extname(specification.name)
- specification.name = file.removesuffix(specification.name)
-end
-
-function define.resolvers.name(specification)
+function resolvers.name(specification)
local resolve = fonts.names.resolve
if resolve then
- specification.resolved, specification.sub = fonts.names.resolve(specification.name,specification.sub)
- if specification.resolved then
- specification.forced = file.extname(specification.resolved)
- specification.name = file.removesuffix(specification.resolved)
+ local resolved, sub = fonts.names.resolve(specification.name,specification.sub)
+ specification.resolved, specification.sub = resolved, sub
+ if resolved then
+ local suffix = file.suffix(resolved)
+ if fonts.formats[suffix] then
+ specification.forced = suffix
+ specification.name = file.removesuffix(resolved)
+ else
+ specification.name = resolved
+ end
end
else
- define.resolvers.file(specification)
+ resolvers.file(specification)
end
end
-function define.resolvers.spec(specification)
+function resolvers.spec(specification)
local resolvespec = fonts.names.resolvespec
if resolvespec then
specification.resolved, specification.sub = fonts.names.resolvespec(specification.name,specification.sub)
@@ -11563,13 +11681,13 @@ function define.resolvers.spec(specification)
specification.name = file.removesuffix(specification.resolved)
end
else
- define.resolvers.name(specification)
+ resolvers.name(specification)
end
end
-function define.resolve(specification)
+function definers.resolve(specification)
if not specification.resolved or specification.resolved == "" then -- resolved itself not per se in mapping hash
- local r = define.resolvers[specification.lookup]
+ local r = resolvers[specification.lookup]
if r then
r(specification)
end
@@ -11579,7 +11697,18 @@ function define.resolve(specification)
else
specification.forced = specification.forced
end
- specification.hash = lower(specification.name .. ' @ ' .. tfm.hash_features(specification))
+ -- for the moment here (goodies set outside features)
+ local goodies = specification.goodies
+ if goodies and goodies ~= "" then
+ local normal = specification.features.normal
+ if not normal then
+ specification.features.normal = { goodies = goodies }
+ elseif not normal.goodies then
+ normal.goodies = goodies
+ end
+ end
+ --
+ specification.hash = lower(specification.name .. ' @ ' .. constructors.hashfeatures(specification))
if specification.sub and specification.sub ~= "" then
specification.hash = specification.sub .. ' @ ' .. specification.hash
end
@@ -11602,25 +11731,48 @@ features (esp in virtual fonts) so let's not do that now.</p>
specification yet.</p>
--ldx]]--
-function tfm.read(specification)
- local hash = tfm.hash_instance(specification)
- local tfmtable = tfm.fonts[hash] -- hashes by size !
- if not tfmtable then
+-- not in context, at least not now:
+--
+-- function definers.applypostprocessors(tfmdata)
+-- local postprocessors = tfmdata.postprocessors
+-- if postprocessors then
+-- for i=1,#postprocessors do
+-- local extrahash = postprocessors[i](tfmdata) -- after scaling etc
+-- if type(extrahash) == "string" and extrahash ~= "" then
+-- -- e.g. a reencoding needs this
+-- extrahash = gsub(lower(extrahash),"[^a-z]","-")
+-- tfmdata.properties.fullname = format("%s-%s",tfmdata.properties.fullname,extrahash)
+-- end
+-- end
+-- end
+-- return tfmdata
+-- end
+
+function definers.applypostprocessors(tfmdata)
+ return tfmdata
+end
+
+function definers.loadfont(specification)
+ local hash = constructors.hashinstance(specification)
+ local tfmdata = loadedfonts[hash] -- hashes by size !
+ if not tfmdata then
local forced = specification.forced or ""
if forced ~= "" then
- tfmtable = readers[lower(forced)](specification)
- if not tfmtable then
- logs.report("define font","forced type %s of %s not found",forced,specification.name)
+ local reader = readers[lower(forced)]
+ tfmdata = reader and reader(specification)
+ if not tfmdata then
+ report_defining("forced type %s of %s not found",forced,specification.name)
end
else
- for s=1,#sequence do -- reader sequence
+ local sequence = readers.sequence -- can be overloaded so only a shortcut here
+ for s=1,#sequence do
local reader = sequence[s]
- if readers[reader] then -- not really needed
+ if readers[reader] then -- we skip not loaded readers
if trace_defining then
- logs.report("define font","trying (reader sequence driven) type %s for %s with file %s",reader,specification.name,specification.filename or "unknown")
+ report_defining("trying (reader sequence driven) type %s for %s with file %s",reader,specification.name,specification.filename or "unknown")
end
- tfmtable = readers[reader](specification)
- if tfmtable then
+ tfmdata = readers[reader](specification)
+ if tfmdata then
break
else
specification.filename = nil
@@ -11628,196 +11780,60 @@ function tfm.read(specification)
end
end
end
- if tfmtable then
+ if tfmdata then
+ local properties = tfmdata.properties
+ local embedding
if directive_embedall then
- tfmtable.embedding = "full"
- elseif tfmtable.filename and fonts.dontembed[tfmtable.filename] then
- tfmtable.embedding = "no"
+ embedding = "full"
+ elseif properties.filename and constructors.dontembed[properties.filename] then
+ embedding = "no"
+ else
+ embedding = "subset"
+ end
+ if properties then
+ properties.embedding = embedding
else
- tfmtable.embedding = "subset"
+ tfmdata.properties = { embedding = embedding }
end
- tfm.fonts[hash] = tfmtable
- fonts.designsizes[specification.hash] = tfmtable.designsize -- we only know this for sure after loading once
- --~ tfmtable.mode = specification.features.normal.mode or "base"
+ tfmdata = definers.applypostprocessors(tfmdata)
+ loadedfonts[hash] = tfmdata
+ designsizes[specification.hash] = tfmdata.parameters.designsize
end
end
- if not tfmtable then
- logs.report("define font","font with name %s is not found",specification.name)
+ if not tfmdata then
+ report_defining("font with asked name '%s' is not found using lookup '%s'",specification.name,specification.lookup)
end
- return tfmtable
+ return tfmdata
end
--[[ldx--
<p>For virtual fonts we need a slightly different approach:</p>
--ldx]]--
-function tfm.read_and_define(name,size) -- no id
- local specification = define.analyze(name,size)
+function constructors.readanddefine(name,size) -- no id -- maybe a dummy first
+ local specification = definers.analyze(name,size)
local method = specification.method
- if method and define.specify[method] then
- specification = define.specify[method](specification)
+ if method and variants[method] then
+ specification = variants[method](specification)
end
- specification = define.resolve(specification)
- local hash = tfm.hash_instance(specification)
- local id = define.registered(hash)
+ specification = definers.resolve(specification)
+ local hash = constructors.hashinstance(specification)
+ local id = definers.registered(hash)
if not id then
- local fontdata = tfm.read(specification)
- if fontdata then
- fontdata.hash = hash
- id = font.define(fontdata)
- define.register(fontdata,id)
- tfm.cleanup_table(fontdata)
+ local tfmdata = definers.loadfont(specification)
+ if tfmdata then
+ tfmdata.properties.hash = hash
+ id = font.define(tfmdata)
+ definers.register(tfmdata,id)
else
id = 0 -- signal
end
end
- return fonts.ids[id], id
-end
-
---[[ldx--
-<p>Next follow the readers. This code was written while <l n='luatex'/>
-evolved. Each one has its own way of dealing with its format.</p>
---ldx]]--
-
-local function check_tfm(specification,fullname)
- -- ofm directive blocks local path search unless set; btw, in context we
- -- don't support ofm files anyway as this format is obsolete
- local foundname = resolvers.findbinfile(fullname, 'tfm') or "" -- just to be sure
- if foundname == "" then
- foundname = resolvers.findbinfile(fullname, 'ofm') or "" -- bonus for usage outside context
- end
- if foundname ~= "" then
- specification.filename, specification.format = foundname, "ofm"
- return tfm.read_from_tfm(specification)
- end
-end
-
-local function check_afm(specification,fullname)
- local foundname = resolvers.findbinfile(fullname, 'afm') or "" -- just to be sure
- if foundname == "" and tfm.auto_afm then
- local encoding, shortname = match(fullname,"^(.-)%-(.*)$") -- context: encoding-name.*
- if encoding and shortname and fonts.enc.known[encoding] then
- shortname = resolvers.findbinfile(shortname,'afm') or "" -- just to be sure
- if shortname ~= "" then
- foundname = shortname
- -- tfm.set_normal_feature(specification,'encoding',encoding) -- will go away
- if trace_loading then
- logs.report("load afm","stripping encoding prefix from filename %s",afmname)
- end
- end
- end
- end
- if foundname ~= "" then
- specification.filename, specification.format = foundname, "afm"
- return tfm.read_from_afm(specification)
- end
-end
-
-function readers.tfm(specification)
- local fullname, tfmtable = specification.filename or "", nil
- if fullname == "" then
- local forced = specification.forced or ""
- if forced ~= "" then
- tfmtable = check_tfm(specification,specification.name .. "." .. forced)
- end
- if not tfmtable then
- tfmtable = check_tfm(specification,specification.name)
- end
- else
- tfmtable = check_tfm(specification,fullname)
- end
- return tfmtable
-end
-
-function readers.afm(specification,method)
- local fullname, tfmtable = specification.filename or "", nil
- if fullname == "" then
- local forced = specification.forced or ""
- if forced ~= "" then
- tfmtable = check_afm(specification,specification.name .. "." .. forced)
- end
- if not tfmtable then
- method = method or define.method or "afm or tfm"
- if method == "tfm" then
- tfmtable = check_tfm(specification,specification.name)
- elseif method == "afm" then
- tfmtable = check_afm(specification,specification.name)
- elseif method == "tfm or afm" then
- tfmtable = check_tfm(specification,specification.name) or check_afm(specification,specification.name)
- else -- method == "afm or tfm" or method == "" then
- tfmtable = check_afm(specification,specification.name) or check_tfm(specification,specification.name)
- end
- end
- else
- tfmtable = check_afm(specification,fullname)
- end
- return tfmtable
+ return fontdata[id], id
end
--- maybe some day a set of names
-
-local function check_otf(forced,specification,suffix,what)
- local name = specification.name
- if forced then
- name = file.addsuffix(name,suffix)
- end
- local fullname, tfmtable = resolvers.findbinfile(name,suffix) or "", nil -- one shot
- if fullname == "" then
- local fb = fonts.names.old_to_new[name]
- if fb then
- fullname = resolvers.findbinfile(fb,suffix) or ""
- end
- end
- if fullname == "" then
- local fb = fonts.names.new_to_old[name]
- if fb then
- fullname = resolvers.findbinfile(fb,suffix) or ""
- end
- end
- if fullname ~= "" then
- specification.filename, specification.format = fullname, what -- hm, so we do set the filename, then
- tfmtable = tfm.read_from_open_type(specification) -- we need to do it for all matches / todo
- end
- return tfmtable
-end
-
-function readers.opentype(specification,suffix,what)
- local forced = specification.forced or ""
- if forced == "otf" then
- return check_otf(true,specification,forced,"opentype")
- elseif forced == "ttf" or forced == "ttc" or forced == "dfont" then
- return check_otf(true,specification,forced,"truetype")
- else
- return check_otf(false,specification,suffix,what)
- end
-end
-
-function readers.otf (specification) return readers.opentype(specification,"otf","opentype") end
-function readers.ttf (specification) return readers.opentype(specification,"ttf","truetype") end
-function readers.ttc (specification) return readers.opentype(specification,"ttf","truetype") end -- !!
-function readers.dfont(specification) return readers.opentype(specification,"ttf","truetype") end -- !!
-
--[[ldx--
-<p>We need to check for default features. For this we provide
-a helper function.</p>
---ldx]]--
-
-function define.check(features,defaults) -- nb adapts features !
- local done = false
- if features and next(features) then
- for k,v in next, defaults do
- if features[k] == nil then
- features[k], done = v, true
- end
- end
- else
- features, done = table.fastcopy(defaults), true
- end
- return features, done -- done signals a change
-end
-
---[[ldx--
-<p>So far the specifyers. Now comes the real definer. Here we cache
+<p>So far the specifiers. Now comes the real definer. Here we cache
based on id's. Here we also intercept the virtual font handler. Since
it evolved stepwise I may rewrite this bit (combine code).</p>
@@ -11828,238 +11844,146 @@ not gain much. By the way, passing id's back to in the callback was
introduced later in the development.</p>
--ldx]]--
-define.last = nil
+local lastdefined = nil -- we don't want this one to end up in s-tra-02
+local internalized = { }
-function define.register(fontdata,id)
- if fontdata and id then
- local hash = fontdata.hash
- if not tfm.internalized[hash] then
- if trace_defining then
- logs.report("define font","loading at 2 id %s, hash: %s",id or "?",hash or "?")
- end
- fonts.identifiers[id] = fontdata
- fonts.characters [id] = fontdata.characters
- fonts.quads [id] = fontdata.parameters.quad
- -- todo: extra functions, e.g. setdigitwidth etc in list
- tfm.internalized[hash] = id
- end
- end
+function definers.current() -- or maybe current
+ return lastdefined
end
-function define.registered(hash)
- local id = tfm.internalized[hash]
- return id, id and fonts.ids[id]
+function definers.registered(hash)
+ local id = internalized[hash]
+ return id, id and fontdata[id]
end
-local cache_them = false
-
-function tfm.make(specification)
- -- currently fonts are scaled while constructing the font, so we
- -- have to do scaling of commands in the vf at that point using
- -- e.g. "local scale = g.factor or 1" after all, we need to work
- -- with copies anyway and scaling needs to be done at some point;
- -- however, when virtual tricks are used as feature (makes more
- -- sense) we scale the commands in fonts.tfm.scale (and set the
- -- factor there)
- local fvm = define.methods[specification.features.vtf.preset]
- if fvm then
- return fvm(specification)
- else
- return nil
+function definers.register(tfmdata,id)
+ if tfmdata and id then
+ local hash = tfmdata.properties.hash
+ if not internalized[hash] then
+ internalized[hash] = id
+ if trace_defining then
+ report_defining("registering font, id: %s, hash: %s",id or "?",hash or "?")
+ end
+ fontdata[id] = tfmdata
+ end
end
end
-function define.read(specification,size,id) -- id can be optional, name can already be table
+function definers.read(specification,size,id) -- id can be optional, name can already be table
statistics.starttiming(fonts)
if type(specification) == "string" then
- specification = define.analyze(specification,size)
+ specification = definers.analyze(specification,size)
end
local method = specification.method
- if method and define.specify[method] then
- specification = define.specify[method](specification)
- end
- specification = define.resolve(specification)
- local hash = tfm.hash_instance(specification)
- if cache_them then
- local fontdata = containers.read(fonts.cache(),hash) -- for tracing purposes
- end
- local fontdata = define.registered(hash) -- id
- if not fontdata then
- if specification.features.vtf and specification.features.vtf.preset then
- fontdata = tfm.make(specification)
- else
- fontdata = tfm.read(specification)
- if fontdata then
- tfm.check_virtual_id(fontdata)
- end
- end
- if cache_them then
- fontdata = containers.write(fonts.cache(),hash,fontdata) -- for tracing purposes
- end
- if fontdata then
- fontdata.hash = hash
- fontdata.cache = "no"
- if id then
- define.register(fontdata,id)
- end
- end
+ if method and variants[method] then
+ specification = variants[method](specification)
end
- define.last = fontdata or id -- todo ! ! ! ! !
- if not fontdata then
- logs.report("define font", "unknown font %s, loading aborted",specification.name)
- elseif trace_defining and type(fontdata) == "table" then
- logs.report("define font","using %s font with id %s, name:%s size:%s bytes:%s encoding:%s fullname:%s filename:%s",
- fontdata.type or "unknown",
- id or "?",
- fontdata.name or "?",
- fontdata.size or "default",
- fontdata.encodingbytes or "?",
- fontdata.encodingname or "unicode",
- fontdata.fullname or "?",
- file.basename(fontdata.filename or "?"))
-
+ specification = definers.resolve(specification)
+ local hash = constructors.hashinstance(specification)
+ local tfmdata = definers.registered(hash) -- id
+ if not tfmdata then
+ tfmdata = definers.loadfont(specification) -- can be overloaded
+ if tfmdata then
+--~ constructors.checkvirtualid(tfmdata) -- interferes
+ tfmdata.properties.hash = hash
+ if id then
+ definers.register(tfmdata,id)
+ end
+ end
+ end
+ lastdefined = tfmdata or id -- todo ! ! ! ! !
+ if not tfmdata then -- or id?
+ report_defining( "unknown font %s, loading aborted",specification.name)
+ 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 %s, name:%s size:%s bytes:%s encoding:%s fullname:%s filename:%s",
+ properties.type or "unknown",
+ id or "?",
+ properties.name or "?",
+ parameters.size or "default",
+ properties.encodingbytes or "?",
+ properties.encodingname or "unicode",
+ properties.fullname or "?",
+ file.basename(properties.filename or "?"))
end
statistics.stoptiming(fonts)
- return fontdata
-end
-
-function vf.find(name)
- name = file.removesuffix(file.basename(name))
- if tfm.resolve_vf then
- local format = fonts.logger.format(name)
- if format == 'tfm' or format == 'ofm' then
- if trace_defining then
- logs.report("define font","locating vf for %s",name)
- end
- return resolvers.findbinfile(name,"ovf")
- else
- if trace_defining then
- logs.report("define font","vf for %s is already taken care of",name)
- end
- return nil -- ""
- end
- else
- if trace_defining then
- logs.report("define font","locating vf for %s",name)
- end
- return resolvers.findbinfile(name,"ovf")
- end
+ return tfmdata
end
--[[ldx--
-<p>We overload both the <l n='tfm'/> and <l n='vf'/> readers.</p>
+<p>We overload the <l n='tfm'/> reader.</p>
--ldx]]--
-callbacks.register('define_font' , define.read, "definition of fonts (tfmtable preparation)")
-callbacks.register('find_vf_file', vf.find , "locating virtual fonts, insofar needed") -- not that relevant any more
+callbacks.register('define_font', definers.read, "definition of fonts (tfmdata preparation)")
end -- closure
do -- begin closure to overcome local limits and interference
-if not modules then modules = { } end modules ['font-xtx'] = {
+if not modules then modules = { } end modules ['luatex-font-def'] = {
version = 1.001,
- comment = "companion to font-ini.mkiv",
+ comment = "companion to luatex-*.tex",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
-local texsprint, count = tex.sprint, tex.count
-local format, concat, gmatch, match, find, lower = string.format, table.concat, string.gmatch, string.match, string.find, string.lower
-local tostring, next = tostring, next
-local lpegmatch = lpeg.match
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
-local trace_defining = false trackers.register("fonts.defining", function(v) trace_defining = v end)
+local fonts = fonts
---[[ldx--
-<p>Choosing a font by name and specififying its size is only part of the
-game. In order to prevent complex commands, <l n='xetex'/> introduced
-a method to pass feature information as part of the font name. At the
-risk of introducing nasty parsing and compatinility problems, this
-syntax was expanded over time.</p>
-
-<p>For the sake of users who have defined fonts using that syntax, we
-will support it, but we will provide additional methods as well.
-Normally users will not use this direct way, but use a more abstract
-interface.</p>
-
-<p>The next one is the official one. However, in the plain
-variant we need to support the crappy [] specification as
-well and that does not work too well with the general design
-of the specifier.</p>
---ldx]]--
+-- A bit of tuning for definitions.
---~ function fonts.define.specify.colonized(specification) -- xetex mode
---~ local list = { }
---~ if specification.detail and specification.detail ~= "" then
---~ for v in gmatch(specification.detail,"%s*([^;]+)%s*") do
---~ local a, b = match(v,"^(%S*)%s*=%s*(%S*)$")
---~ if a and b then
---~ list[a] = b:is_boolean()
---~ if type(list[a]) == "nil" then
---~ list[a] = b
---~ end
---~ else
---~ local a, b = match(v,"^([%+%-]?)%s*(%S+)$")
---~ if a and b then
---~ list[b] = a ~= "-"
---~ end
---~ end
---~ end
---~ end
---~ specification.features.normal = list
---~ return specification
---~ end
+fonts.constructors.namemode = "specification" -- somehow latex needs this (changed name!) => will change into an overload
---~ check("oeps/BI:+a;-b;c=d")
---~ check("[oeps]/BI:+a;-b;c=d")
---~ check("file:oeps/BI:+a;-b;c=d")
---~ check("name:oeps/BI:+a;-b;c=d")
+-- tricky: we sort of bypass the parser and directly feed all into
+-- the sub parser
-local list = { }
+function fonts.definers.getspecification(str)
+ return "", str, "", ":", str
+end
-fonts.define.specify.colonized_default_lookup = "file"
+-- the generic name parser (different from context!)
+
+local list = { }
-local function issome () list.lookup = fonts.define.specify.colonized_default_lookup end
-local function isfile () list.lookup = 'file' end
-local function isname () list.lookup = 'name' end
-local function thename(s) list.name = s end
-local function issub (v) list.sub = v end
+local function issome () list.lookup = 'name' end -- xetex mode prefers name (not in context!)
+local function isfile () list.lookup = 'file' end
+local function isname () list.lookup = 'name' end
+local function thename(s) list.name = s end
+local function issub (v) list.sub = v end
local function iscrap (s) list.crap = string.lower(s) end
-local function istrue (s) list[s] = 'yes' end
-local function isfalse(s) list[s] = 'no' end
-local function iskey (k,v) list[k] = v end
-
-local function istrue (s) list[s] = true end
-local function isfalse(s) list[s] = false end
-
-local spaces = lpeg.P(" ")^0
-local namespec = (1-lpeg.S("/:("))^0 -- was: (1-lpeg.S("/: ("))^0
-local crapspec = spaces * lpeg.P("/") * (((1-lpeg.P(":"))^0)/iscrap) * spaces
-local filename = (lpeg.P("file:")/isfile * (namespec/thename)) + (lpeg.P("[") * lpeg.P(true)/isname * (((1-lpeg.P("]"))^0)/thename) * lpeg.P("]"))
-local fontname = (lpeg.P("name:")/isname * (namespec/thename)) + lpeg.P(true)/issome * (namespec/thename)
-local sometext = (lpeg.R("az","AZ","09") + lpeg.S("+-."))^1
-local truevalue = lpeg.P("+") * spaces * (sometext/istrue)
-local falsevalue = lpeg.P("-") * spaces * (sometext/isfalse)
-local keyvalue = (lpeg.C(sometext) * spaces * lpeg.P("=") * spaces * lpeg.C(sometext))/iskey
+local function iskey (k,v) list[k] = v end
+local function istrue (s) list[s] = true end
+local function isfalse(s) list[s] = false end
+
+local P, S, R, C = lpeg.P, lpeg.S, lpeg.R, lpeg.C
+
+local spaces = P(" ")^0
+local namespec = (1-S("/:("))^0 -- was: (1-S("/: ("))^0
+local crapspec = spaces * P("/") * (((1-P(":"))^0)/iscrap) * spaces
+local filename_1 = P("file:")/isfile * (namespec/thename)
+local filename_2 = P("[") * P(true)/isname * (((1-P("]"))^0)/thename) * P("]")
+local fontname_1 = P("name:")/isname * (namespec/thename)
+local fontname_2 = P(true)/issome * (namespec/thename)
+local sometext = (R("az","AZ","09") + S("+-."))^1
+local truevalue = P("+") * spaces * (sometext/istrue)
+local falsevalue = P("-") * spaces * (sometext/isfalse)
+local keyvalue = (C(sometext) * spaces * P("=") * spaces * C(sometext))/iskey
local somevalue = sometext/istrue
-local subvalue = lpeg.P("(") * (lpeg.C(lpeg.P(1-lpeg.S("()"))^1)/issub) * lpeg.P(")") -- for Kim
+local subvalue = P("(") * (C(P(1-S("()"))^1)/issub) * P(")") -- for Kim
local option = spaces * (keyvalue + falsevalue + truevalue + somevalue) * spaces
-local options = lpeg.P(":") * spaces * (lpeg.P(";")^0 * option)^0
-local pattern = (filename + fontname) * subvalue^0 * crapspec^0 * options^0
+local options = P(":") * spaces * (P(";")^0 * option)^0
-local normalize_meanings = fonts.otf.meanings.normalize
+local pattern = (filename_1 + filename_2 + fontname_1 + fontname_2) * subvalue^0 * crapspec^0 * options^0
-function fonts.define.specify.colonized(specification) -- xetex mode
+local function colonized(specification) -- xetex mode
list = { }
- lpegmatch(pattern,specification.specification)
---~ for k, v in next, list do
---~ list[k] = v:is_boolean()
---~ if type(list[a]) == "nil" then
---~ list[k] = v
---~ end
---~ end
+ lpeg.match(pattern,specification.specification)
list.crap = nil -- style not supported, maybe some day
if list.name then
specification.name = list.name
@@ -12073,18 +11997,33 @@ function fonts.define.specify.colonized(specification) -- xetex mode
specification.sub = list.sub
list.sub = nil
end
--- specification.features.normal = list
- specification.features.normal = normalize_meanings(list)
+ specification.features.normal = fonts.handlers.otf.features.normalize(list)
return specification
end
-fonts.define.register_split(":", fonts.define.specify.colonized)
+fonts.definers.registersplit(":",colonized,"cryptic")
+fonts.definers.registersplit("", colonized,"more cryptic") -- catches \font\text=[names]
+
+function fonts.definers.applypostprocessors(tfmdata)
+ local postprocessors = tfmdata.postprocessors
+ if postprocessors then
+ for i=1,#postprocessors do
+ local extrahash = postprocessors[i](tfmdata) -- after scaling etc
+ if type(extrahash) == "string" and extrahash ~= "" then
+ -- e.g. a reencoding needs this
+ extrahash = string.gsub(lower(extrahash),"[^a-z]","-")
+ tfmdata.properties.fullname = format("%s-%s",tfmdata.properties.fullname,extrahash)
+ end
+ end
+ end
+ return tfmdata
+end
end -- closure
do -- begin closure to overcome local limits and interference
-if not modules then modules = { } end modules ['font-dum'] = {
+if not modules then modules = { } end modules ['luatex-fonts-ext'] = {
version = 1.001,
comment = "companion to luatex-*.tex",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
@@ -12092,120 +12031,46 @@ if not modules then modules = { } end modules ['font-dum'] = {
license = "see context related readme files"
}
-fonts = fonts or { }
-
--- general
-
-fonts.otf.pack = false -- only makes sense in context
-fonts.tfm.resolve_vf = false -- no sure about this
-fonts.tfm.fontname_mode = "specification" -- somehow latex needs this
-
--- readers
-
-fonts.tfm.readers = fonts.tfm.readers or { }
-fonts.tfm.readers.sequence = { 'otf', 'ttf', 'tfm' }
-fonts.tfm.readers.afm = nil
-
--- define
-
-fonts.define = fonts.define or { }
-
---~ fonts.define.method = "tfm"
-
-fonts.define.specify.colonized_default_lookup = "name"
-
-function fonts.define.get_specification(str)
- return "", str, "", ":", str
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
end
--- logger
-
-fonts.logger = fonts.logger or { }
-
-function fonts.logger.save()
-end
-
--- names
---
--- Watch out, the version number is the same as the one used in
--- the mtx-fonts.lua function scripts.fonts.names as we use a
--- simplified font database in the plain solution and by using
--- a different number we're less dependent on context.
-
-fonts.names = fonts.names or { }
-
-fonts.names.version = 1.001 -- not the same as in context
-fonts.names.basename = "luatex-fonts-names.lua"
-fonts.names.new_to_old = { }
-fonts.names.old_to_new = { }
-
-local data, loaded = nil, false
+local fonts = fonts
+local otffeatures = fonts.constructors.newfeatures("otf")
-local fileformats = { "lua", "tex", "other text files" }
+-- A few generic extensions.
-function fonts.names.resolve(name,sub)
- if not loaded then
- local basename = fonts.names.basename
- if basename and basename ~= "" then
- for i=1,#fileformats do
- local format = fileformats[i]
- local foundname = resolvers.find_file(basename,format) or ""
- if foundname ~= "" then
- data = dofile(foundname)
- break
- end
- end
- end
- loaded = true
- end
- if type(data) == "table" and data.version == fonts.names.version then
- local condensed = string.gsub(string.lower(name),"[^%a%d]","")
- local found = data.mappings and data.mappings[condensed]
- if found then
- local fontname, filename, subfont = found[1], found[2], found[3]
- if subfont then
- return filename, fontname
- else
- return filename, false
- end
- else
- return name, false -- fallback to filename
- end
- end
-end
-
-fonts.names.resolvespec = fonts.names.resolve -- only supported in mkiv
-
--- For the moment we put this (adapted) pseudo feature here.
-
-table.insert(fonts.triggers,"itlc")
-
-local function itlc(tfmdata,value)
+local function initializeitlc(tfmdata,value)
if value then
-- the magic 40 and it formula come from Dohyun Kim
- local metadata = tfmdata.shared.otfdata.metadata
- if metadata then
- local italicangle = metadata.italicangle
- if italicangle and italicangle ~= 0 then
- local uwidth = (metadata.uwidth or 40)/2
- for unicode, d in next, tfmdata.descriptions do
- local it = d.boundingbox[3] - d.width + uwidth
- if it ~= 0 then
- d.italic = it
- end
+ local parameters = tfmdata.parameters
+ local italicangle = parameters.italicangle
+ if italicangle and italicangle ~= 0 then
+ local uwidth = (parameters.uwidth or 40)/2
+ for unicode, d in next, tfmdata.descriptions do
+ local it = d.boundingbox[3] - d.width + uwidth
+ if it ~= 0 then
+ d.italic = it
end
- tfmdata.has_italic = true
end
+ tfmdata.properties.italic_correction = true
end
end
end
-fonts.initializers.base.otf.itlc = itlc
-fonts.initializers.node.otf.itlc = itlc
+otffeatures.register {
+ name = "itlc",
+ description = "italic correction",
+ initializers = {
+ base = initializeitlc,
+ node = initializeitlc,
+ }
+}
-- slant and extend
-function fonts.initializers.common.slant(tfmdata,value)
+local function initializeslant(tfmdata,value)
value = tonumber(value)
if not value then
value = 0
@@ -12214,10 +12079,19 @@ function fonts.initializers.common.slant(tfmdata,value)
elseif value < -1 then
value = -1
end
- tfmdata.slant_factor = value
+ tfmdata.parameters.slant_factor = value
end
-function fonts.initializers.common.extend(tfmdata,value)
+otffeatures.register {
+ name = "slant",
+ description = "slant glyphs",
+ initializers = {
+ base = initializeslant,
+ node = initializeslant,
+ }
+}
+
+local function initializeextend(tfmdata,value)
value = tonumber(value)
if not value then
value = 0
@@ -12226,31 +12100,34 @@ function fonts.initializers.common.extend(tfmdata,value)
elseif value < -10 then
value = -10
end
- tfmdata.extend_factor = value
+ tfmdata.parameters.extend_factor = value
end
-table.insert(fonts.triggers,"slant")
-table.insert(fonts.triggers,"extend")
-
-fonts.initializers.base.otf.slant = fonts.initializers.common.slant
-fonts.initializers.node.otf.slant = fonts.initializers.common.slant
-fonts.initializers.base.otf.extend = fonts.initializers.common.extend
-fonts.initializers.node.otf.extend = fonts.initializers.common.extend
+otffeatures.register {
+ name = "extend",
+ description = "scale glyphs horizontally",
+ initializers = {
+ base = initializeextend,
+ node = initializeextend,
+ }
+}
-- expansion and protrusion
fonts.protrusions = fonts.protrusions or { }
fonts.protrusions.setups = fonts.protrusions.setups or { }
-local setups = fonts.protrusions.setups
+local setups = fonts.protrusions.setups
-function fonts.initializers.common.protrusion(tfmdata,value)
+local function initializeprotrusion(tfmdata,value)
if value then
local setup = setups[value]
if setup then
local factor, left, right = setup.factor or 1, setup.left or 1, setup.right or 1
local emwidth = tfmdata.parameters.quad
- tfmdata.auto_protrude = true
+ tfmdata.parameters.protrusion = {
+ auto = true,
+ }
for i, chr in next, tfmdata.characters do
local v, pl, pr = setup[i], nil, nil
if v then
@@ -12263,17 +12140,31 @@ function fonts.initializers.common.protrusion(tfmdata,value)
end
end
+otffeatures.register {
+ name = "protrusion",
+ description = "shift characters into the left and or right margin",
+ initializers = {
+ base = initializeprotrusion,
+ node = initializeprotrusion,
+ }
+}
+
fonts.expansions = fonts.expansions or { }
fonts.expansions.setups = fonts.expansions.setups or { }
local setups = fonts.expansions.setups
-function fonts.initializers.common.expansion(tfmdata,value)
+local function initializeexpansion(tfmdata,value)
if value then
local setup = setups[value]
if setup then
- local stretch, shrink, step, factor = setup.stretch or 0, setup.shrink or 0, setup.step or 0, setup.factor or 1
- tfmdata.stretch, tfmdata.shrink, tfmdata.step, tfmdata.auto_expand = stretch * 10, shrink * 10, step * 10, true
+ local factor = setup.factor or 1
+ tfmdata.parameters.expansion = {
+ stretch = 10 * (setup.stretch or 0),
+ shrink = 10 * (setup.shrink or 0),
+ step = 10 * (setup.step or 0),
+ auto = true,
+ }
for i, chr in next, tfmdata.characters do
local v = setup[i]
if v and v ~= 0 then
@@ -12286,18 +12177,18 @@ function fonts.initializers.common.expansion(tfmdata,value)
end
end
-table.insert(fonts.manipulators,"protrusion")
-table.insert(fonts.manipulators,"expansion")
-
-fonts.initializers.base.otf.protrusion = fonts.initializers.common.protrusion
-fonts.initializers.node.otf.protrusion = fonts.initializers.common.protrusion
-fonts.initializers.base.otf.expansion = fonts.initializers.common.expansion
-fonts.initializers.node.otf.expansion = fonts.initializers.common.expansion
+otffeatures.register {
+ name = "expansion",
+ description = "apply hz optimization",
+ initializers = {
+ base = initializeexpansion,
+ node = initializeexpansion,
+ }
+}
-- left over
-function fonts.register_message()
-end
+function fonts.loggers.onetimemessage() end
-- example vectors
@@ -12339,51 +12230,147 @@ fonts.protrusions.setups['default'] = {
-- normalizer
-fonts.otf.meanings = fonts.otf.meanings or { }
-
-fonts.otf.meanings.normalize = fonts.otf.meanings.normalize or function(t)
+fonts.handlers.otf.features.normalize = function(t)
if t.rand then
t.rand = "random"
end
+ return t
end
-- bonus
-function fonts.otf.name_to_slot(name)
- local tfmdata = fonts.ids[font.current()]
- if tfmdata and tfmdata.shared then
- local otfdata = tfmdata.shared.otfdata
- local unicode = otfdata.luatex.unicodes[name]
- return unicode and (type(unicode) == "number" and unicode or unicode[1])
+function fonts.helpers.nametoslot(name)
+ local t = type(name)
+ if t == "string" then
+ local tfmdata = fonts.hashes.identifiers[currentfont()]
+ local shared = tfmdata and tfmdata.shared
+ local fntdata = shared and shared.rawdata
+ return fntdata and fntdata.resources.unicodes[name]
+ elseif t == "number" then
+ return n
end
end
-function fonts.otf.char(n)
- if type(n) == "string" then
- n = fonts.otf.name_to_slot(n)
- end
- if type(n) == "number" then
- tex.sprint("\\char" .. n)
- end
-end
-
--- another one:
-
-fonts.strippables = table.tohash {
- 0x000AD, 0x017B4, 0x017B5, 0x0200B, 0x0200C, 0x0200D, 0x0200E, 0x0200F, 0x0202A, 0x0202B,
- 0x0202C, 0x0202D, 0x0202E, 0x02060, 0x02061, 0x02062, 0x02063, 0x0206A, 0x0206B, 0x0206C,
- 0x0206D, 0x0206E, 0x0206F, 0x0FEFF, 0x1D173, 0x1D174, 0x1D175, 0x1D176, 0x1D177, 0x1D178,
- 0x1D179, 0x1D17A, 0xE0001, 0xE0020, 0xE0021, 0xE0022, 0xE0023, 0xE0024, 0xE0025, 0xE0026,
- 0xE0027, 0xE0028, 0xE0029, 0xE002A, 0xE002B, 0xE002C, 0xE002D, 0xE002E, 0xE002F, 0xE0030,
- 0xE0031, 0xE0032, 0xE0033, 0xE0034, 0xE0035, 0xE0036, 0xE0037, 0xE0038, 0xE0039, 0xE003A,
- 0xE003B, 0xE003C, 0xE003D, 0xE003E, 0xE003F, 0xE0040, 0xE0041, 0xE0042, 0xE0043, 0xE0044,
- 0xE0045, 0xE0046, 0xE0047, 0xE0048, 0xE0049, 0xE004A, 0xE004B, 0xE004C, 0xE004D, 0xE004E,
- 0xE004F, 0xE0050, 0xE0051, 0xE0052, 0xE0053, 0xE0054, 0xE0055, 0xE0056, 0xE0057, 0xE0058,
- 0xE0059, 0xE005A, 0xE005B, 0xE005C, 0xE005D, 0xE005E, 0xE005F, 0xE0060, 0xE0061, 0xE0062,
- 0xE0063, 0xE0064, 0xE0065, 0xE0066, 0xE0067, 0xE0068, 0xE0069, 0xE006A, 0xE006B, 0xE006C,
- 0xE006D, 0xE006E, 0xE006F, 0xE0070, 0xE0071, 0xE0072, 0xE0073, 0xE0074, 0xE0075, 0xE0076,
- 0xE0077, 0xE0078, 0xE0079, 0xE007A, 0xE007B, 0xE007C, 0xE007D, 0xE007E, 0xE007F,
+-- \font\test=file:somefont:reencode=mymessup
+--
+-- fonts.encodings.reencodings.mymessup = {
+-- [109] = 110, -- m
+-- [110] = 109, -- n
+-- }
+
+fonts.encodings = fonts.encodings or { }
+local reencodings = { }
+fonts.encodings.reencodings = reencodings
+
+local function specialreencode(tfmdata,value)
+ -- we forget about kerns as we assume symbols and we
+ -- could issue a message if ther are kerns but it's
+ -- a hack anyway so we odn't care too much here
+ local encoding = value and reencodings[value]
+ if encoding then
+ local temp = { }
+ local char = tfmdata.characters
+ for k, v in next, encoding do
+ temp[k] = char[v]
+ end
+ for k, v in next, temp do
+ char[k] = temp[k]
+ end
+ -- if we use the font otherwise luatex gets confused so
+ -- we return an additional hash component for fullname
+ return string.format("reencoded:%s",value)
+ end
+end
+
+local function reencode(tfmdata,value)
+ tfmdata.postprocessors = tfmdata.postprocessors or { }
+ table.insert(tfmdata.postprocessors,
+ function(tfmdata)
+ return specialreencode(tfmdata,value)
+ end
+ )
+end
+
+otffeatures.register {
+ name = "reencode",
+ description = "reencode characters",
+ manipulators = {
+ base = reencode,
+ node = reencode,
+ }
+}
+
+end -- closure
+
+do -- begin closure to overcome local limits and interference
+
+if not modules then modules = { } end modules ['luatex-fonts-cbk'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
}
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+local fonts = fonts
+local nodes = nodes
+
+-- Fonts: (might move to node-gef.lua)
+
+local traverse_id = node.traverse_id
+local glyph_code = nodes.nodecodes.glyph
+
+function nodes.handlers.characters(head)
+ local fontdata = fonts.hashes.identifiers
+ if fontdata then
+ local usedfonts, done, prevfont = { }, false, nil
+ for n in traverse_id(glyph_code,head) 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
+ done = true
+ end
+ end
+ end
+ end
+ end
+ end
+ if done 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
+ end
+ end
+ end
+ return head, true
+ else
+ return head, false
+ end
+end
+
+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
+end
end -- closure
diff --git a/Master/texmf-dist/tex/generic/context/luatex-fonts-syn.lua b/Master/texmf-dist/tex/generic/context/luatex-fonts-syn.lua
new file mode 100644
index 00000000000..36a74d0f497
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex-fonts-syn.lua
@@ -0,0 +1,83 @@
+if not modules then modules = { } end modules ['luatex-fonts-syn'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+-- Generic font names support.
+--
+-- Watch out, the version number is the same as the one used in
+-- the mtx-fonts.lua function scripts.fonts.names as we use a
+-- simplified font database in the plain solution and by using
+-- a different number we're less dependent on context.
+--
+-- mtxrun --script font --reload --simple
+--
+-- The format of the file is as follows:
+--
+-- return {
+-- ["version"] = 1.001,
+-- ["mappings"] = {
+-- ["somettcfontone"] = { "Some TTC Font One", "SomeFontA.ttc", 1 },
+-- ["somettcfonttwo"] = { "Some TTC Font Two", "SomeFontA.ttc", 2 },
+-- ["somettffont"] = { "Some TTF Font", "SomeFontB.ttf" },
+-- ["someotffont"] = { "Some OTF Font", "SomeFontC.otf" },
+-- },
+-- }
+
+local fonts = fonts
+fonts.names = fonts.names or { }
+
+fonts.names.version = 1.001 -- not the same as in context
+fonts.names.basename = "luatex-fonts-names.lua"
+fonts.names.new_to_old = { }
+fonts.names.old_to_new = { }
+
+local data, loaded = nil, false
+
+local fileformats = { "lua", "tex", "other text files" }
+
+function fonts.names.resolve(name,sub)
+ if not loaded then
+ local basename = fonts.names.basename
+ if basename and basename ~= "" then
+ for i=1,#fileformats do
+ local format = fileformats[i]
+ local foundname = resolvers.findfile(basename,format) or ""
+ if foundname ~= "" then
+ data = dofile(foundname)
+ texio.write("<font database loaded: ",foundname,">")
+ break
+ end
+ end
+ end
+ loaded = true
+ end
+ if type(data) == "table" and data.version == fonts.names.version then
+ local condensed = string.gsub(string.lower(name),"[^%a%d]","")
+ local found = data.mappings and data.mappings[condensed]
+ if found then
+ local fontname, filename, subfont = found[1], found[2], found[3]
+ if subfont then
+ return filename, fontname
+ else
+ return filename, false
+ end
+ else
+ return name, false -- fallback to filename
+ end
+ end
+end
+
+fonts.names.resolvespec = fonts.names.resolve -- only supported in mkiv
+
+function fonts.names.getfilename(askedname,suffix) -- only supported in mkiv
+ return ""
+end
diff --git a/Master/texmf-dist/tex/generic/context/luatex-fonts-tfm.lua b/Master/texmf-dist/tex/generic/context/luatex-fonts-tfm.lua
new file mode 100644
index 00000000000..b9bb1bd0f28
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex-fonts-tfm.lua
@@ -0,0 +1,38 @@
+if not modules then modules = { } end modules ['luatex-fonts-tfm'] = {
+ version = 1.001,
+ comment = "companion to luatex-*.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+if context then
+ texio.write_nl("fatal error: this module is not for context")
+ os.exit()
+end
+
+local fonts = fonts
+local tfm = { }
+fonts.handlers.tfm = tfm
+fonts.formats.tfm = "type1" -- we need to have at least a value here
+
+function fonts.readers.tfm(specification)
+ local fullname = specification.filename or ""
+ if fullname == "" then
+ local forced = specification.forced or ""
+ if forced ~= "" then
+ fullname = specification.name .. "." .. forced
+ else
+ fullname = specification.name
+ end
+ end
+ local foundname = resolvers.findbinfile(fullname, 'tfm') or ""
+ if foundname == "" then
+ foundname = resolvers.findbinfile(fullname, 'ofm') or ""
+ end
+ if foundname ~= "" then
+ specification.filename = foundname
+ specification.format = "ofm"
+ return font.read_tfm(specification.filename,specification.size)
+ end
+end
diff --git a/Master/texmf-dist/tex/generic/context/luatex-fonts.lua b/Master/texmf-dist/tex/generic/context/luatex-fonts.lua
index 84acb2b18c6..23d33f26b8f 100644
--- a/Master/texmf-dist/tex/generic/context/luatex-fonts.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex-fonts.lua
@@ -6,8 +6,62 @@ if not modules then modules = { } end modules ['luatex-fonts'] = {
license = "see context related readme files"
}
+-- The following code isolates the generic ConTeXt code from already
+-- defined or to be defined namespaces.
+
+-- todo: all global namespaces in called modules will get local shortcuts
+
+utf = unicode.utf8
+
+if not generic_context then
+
+ generic_context = { }
+
+end
+
+if not generic_context.push_namespaces then
+
+ function generic_context.push_namespaces()
+ texio.write(" <push namespace>")
+ local normalglobal = { }
+ for k, v in next, _G do
+ normalglobal[k] = v
+ end
+ return normalglobal
+ end
+
+ function generic_context.pop_namespaces(normalglobal,isolate)
+ if normalglobal then
+ texio.write(" <pop namespace>")
+ for k, v in next, _G do
+ if not normalglobal[k] then
+ generic_context[k] = v
+ if isolate then
+ _G[k] = nil
+ end
+ end
+ end
+ for k, v in next, normalglobal do
+ _G[k] = v
+ end
+ -- just to be sure:
+ setmetatable(generic_context,_G)
+ else
+ texio.write(" <fatal error: invalid pop of generic_context>")
+ os.exit()
+ end
+ end
+
+end
+
+local whatever = generic_context.push_namespaces()
+
-- We keep track of load time by storing the current time. That
--- way we cannot be accused of slowing down luading too much.
+-- way we cannot be accused of slowing down loading too much.
+--
+-- Please don't update to this version without proper testing. It
+-- might be that this version lags behind stock context and the only
+-- formal release takes place around tex live code freeze.
local starttime = os.gettimeofday()
@@ -47,21 +101,19 @@ loadmodule('luatex-fonts-merged.lua',true) -- you might comment this line
if fonts then
- -- We're using the merged version. That one could be outdated so
- -- remove it from your system when you want to use the files from
- -- from the ConTeXt tree, or keep your copy of the merged version
- -- up to date.
-
- texio.write_nl("log",[[
-
-I am using the merged version of 'luatex-fonts.lua' here. If
-you run into problems or experience unexpected behaviour, and
-if you have ConTeXt installed you can try to delete the file
-'luatex-font-merged.lua' as I might then use the possibly
-updated libraries. The merged version is not supported as it
-is a frozen instance.
+ if not fonts._merge_loaded_message_done_ then
+ texio.write_nl("log", "!")
+ texio.write_nl("log", "! I am using the merged version of 'luatex-fonts.lua' here. If")
+ texio.write_nl("log", "! you run into problems or experience unexpected behaviour, and")
+ texio.write_nl("log", "! if you have ConTeXt installed you can try to delete the file")
+ texio.write_nl("log", "! 'luatex-font-merged.lua' as I might then use the possibly")
+ texio.write_nl("log", "! updated libraries. The merged version is not supported as it")
+ texio.write_nl("log", "! is a frozen instance. Problems can be reported to the ConTeXt")
+ texio.write_nl("log", "! mailing list.")
+ texio.write_nl("log", "!")
+ end
- ]])
+ fonts._merge_loaded_message_done_ = true
else
@@ -82,25 +134,20 @@ else
-- lack of other modules.
-- First we load a few helper modules. This is about the miminum
- -- needed to let the font modules do theuir work.
+ -- needed to let the font modules do their work. Don't depend on
+ -- their functions as we might strip them in future versions of
+ -- this generic variant.
- loadmodule('luat-dum.lua') -- not used in context at all
- loadmodule('data-con.lua') -- maybe some day we don't need this one
+ loadmodule('luatex-basics-gen.lua')
+ loadmodule('data-con.lua')
- -- We do need some basic node support although the following
- -- modules contain a little bit of code that is not used. It's
- -- not worth weeding.
+ -- We do need some basic node support. The code in there is not for
+ -- general use as it might change.
- loadmodule('node-ini.lua')
- loadmodule('node-res.lua') -- will be stripped
- loadmodule('node-inj.lua') -- will be replaced (luatex > .50)
- loadmodule('node-fnt.lua')
- loadmodule('node-dum.lua')
+ loadmodule('luatex-basics-nod.lua')
-- Now come the font modules that deal with traditional TeX fonts
- -- as well as open type fonts. We don't load the afm related code
- -- from font-enc.lua and font-afm.lua as only ConTeXt deals with
- -- it.
+ -- as well as open type fonts. We only support OpenType fonts here.
--
-- The font database file (if used at all) must be put someplace
-- visible for kpse and is not shared with ConTeXt. The mtx-fonts
@@ -108,33 +155,59 @@ else
-- option).
loadmodule('font-ini.lua')
- loadmodule('font-tfm.lua') -- will be split (we may need font-log)
+ loadmodule('font-con.lua')
+ loadmodule('luatex-fonts-enc.lua') -- will load font-age on demand
loadmodule('font-cid.lua')
- loadmodule('font-ott.lua') -- might be split
- loadmodule('font-map.lua') -- for loading lum file (will be stripped)
- loadmodule('font-otf.lua')
- loadmodule('font-otd.lua')
+ loadmodule('font-map.lua') -- for loading lum file (will be stripped)
+ loadmodule('luatex-fonts-syn.lua') -- deals with font names (synonyms)
+ loadmodule('luatex-fonts-tfm.lua')
loadmodule('font-oti.lua')
+ loadmodule('font-otf.lua')
loadmodule('font-otb.lua')
+ loadmodule('node-inj.lua') -- will be replaced (luatex >= .70)
loadmodule('font-otn.lua')
- loadmodule('font-ota.lua') -- might be split
- loadmodule('font-otc.lua')
+ -- loadmodule('luatex-fonts-chr.lua')
+ loadmodule('font-ota.lua')
+ loadmodule('luatex-fonts-lua.lua')
loadmodule('font-def.lua')
- loadmodule('font-xtx.lua')
- loadmodule('font-dum.lua')
+ loadmodule('luatex-fonts-def.lua')
+ loadmodule('luatex-fonts-ext.lua') -- some extensions
+
+ -- We need to plug into a callback and the following module implements
+ -- the handlers. Actual plugging in happens later.
+
+ loadmodule('luatex-fonts-cbk.lua')
end
+resolvers.loadmodule = loadmodule
+
-- In order to deal with the fonts we need to initialize some
--- callbacks. One can overload them later on if needed.
+-- callbacks. One can overload them later on if needed. First
+-- a bit of abstraction.
+
+generic_context.callback_ligaturing = false
+generic_context.callback_kerning = false
+generic_context.callback_pre_linebreak_filter = nodes.simple_font_handler
+generic_context.callback_hpack_filter = nodes.simple_font_handler
+generic_context.callback_define_font = fonts.definers.read
+
+-- The next ones can be done at a different moment if needed. You can create
+-- a generic_context namespace and set no_callbacks_yet to true, load this
+-- module, and enable the callbacks later.
-callback.register('ligaturing', false)
-callback.register('kerning', false)
-callback.register('pre_linebreak_filter', nodes.simple_font_handler)
-callback.register('hpack_filter', nodes.simple_font_handler)
-callback.register('define_font' , fonts.define.read)
-callback.register('find_vf_file', nil) -- reset to normal
+if not generic_context.no_callbacks_yet then
+
+ callback.register('ligaturing', generic_context.callback_ligaturing)
+ callback.register('kerning', generic_context.callback_kerning)
+ callback.register('pre_linebreak_filter', generic_context.callback_pre_linebreak_filter)
+ callback.register('hpack_filter', generic_context.callback_hpack_filter)
+ callback.register('define_font' , generic_context.callback_define_font)
+
+end
-- We're done.
texio.write(string.format(" <luatex-fonts.lua loaded in %0.3f seconds>", os.gettimeofday()-starttime))
+
+generic_context.pop_namespaces(whatever)
diff --git a/Master/texmf-dist/tex/generic/context/luatex-fonts.tex b/Master/texmf-dist/tex/generic/context/luatex-fonts.tex
index 644d168f5c4..8ccc9f3d566 100644
--- a/Master/texmf-dist/tex/generic/context/luatex-fonts.tex
+++ b/Master/texmf-dist/tex/generic/context/luatex-fonts.tex
@@ -4,8 +4,7 @@
%D title=\LUATEX\ Support Macros,
%D subtitle=Generic \OPENTYPE\ Font Handler,
%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright=public domain]
+%D copyright=see context related readme files]
%D \subject{Welcome}
%D
diff --git a/Master/texmf-dist/tex/generic/context/luatex-mplib.lua b/Master/texmf-dist/tex/generic/context/luatex-mplib.lua
index 0afad083ac2..c6628acb3b8 100644
--- a/Master/texmf-dist/tex/generic/context/luatex-mplib.lua
+++ b/Master/texmf-dist/tex/generic/context/luatex-mplib.lua
@@ -1,4 +1,4 @@
-if not modules then modules = { } end modules ['supp-mpl'] = {
+if not modules then modules = { } end modules ['luatex-mplib'] = {
version = 1.001,
comment = "companion to luatex-mplib.tex",
author = "Hans Hagen & Taco Hoekwater",
@@ -25,7 +25,7 @@ else
local format, concat, abs, match = string.format, table.concat, math.abs, string.match
local mplib = require ('mplib')
- local kpse = require ('kpse')
+ local kpse = require ('kpse')
--[[ldx--
<p>We create a namespace and some variables to it. If a namespace is
@@ -93,11 +93,11 @@ else
metapost.lastlog = ""
end
- metapost.make = metapost.make or function(name,mem_name,dump)
- if false then
- metapost.report("no format %s made for %s",mem_name,name)
- return false
- else
+ local mplibone = tonumber(mplib.version()) <= 1.50
+
+ if mplibone then
+
+ metapost.make = metapost.make or function(name,mem_name,dump)
local t = os.clock()
local mpx = mplib.new {
ini_version = true,
@@ -113,25 +113,52 @@ else
end
return mpx
end
- end
- function metapost.load(name)
- local mem_name = file.replacesuffix(name,"mem")
- local mpx = mplib.new {
- ini_version = false,
- mem_name = mem_name,
- find_file = metapost.finder
- }
- if not mpx and type(metapost.make) == "function" then
- -- when i have time i'll locate the format and dump
- mpx = metapost.make(name,mem_name)
+ function metapost.load(name)
+ local mem_name = file.replacesuffix(name,"mem")
+ local mpx = mplib.new {
+ ini_version = false,
+ mem_name = mem_name,
+ find_file = metapost.finder
+ }
+ if not mpx and type(metapost.make) == "function" then
+ -- when i have time i'll locate the format and dump
+ mpx = metapost.make(name,mem_name)
+ end
+ if mpx then
+ metapost.report("using format %s",mem_name,false)
+ return mpx, nil
+ else
+ return nil, { status = 99, error = "out of memory or invalid format" }
+ end
end
- if mpx then
- metapost.report("using format %s",mem_name,false)
- return mpx, nil
- else
- return nil, { status = 99, error = "out of memory or invalid format" }
+
+ else
+
+ local preamble = [[
+ boolean mplib ; mplib := true ;
+ let dump = endinput ;
+ input %s ;
+ ]]
+
+ metapost.make = metapost.make or function()
end
+
+ function metapost.load(name)
+ local mpx = mplib.new {
+ ini_version = true,
+ find_file = metapost.finder,
+ }
+ local result
+ if not mpx then
+ result = { status = 99, error = "out of memory"}
+ else
+ result = mpx:execute(format(preamble, file.replacesuffix(name,"mp")))
+ end
+ metapost.reporterror(result)
+ return mpx, result
+ end
+
end
function metapost.unload(mpx)
@@ -221,15 +248,10 @@ else
local rx, sx, sy, ry, tx, ty, divider = 1, 0, 0, 1, 0, 0, 1
local function pen_characteristics(object)
- if mplib.pen_info then
- local t = mplib.pen_info(object)
- rx, ry, sx, sy, tx, ty = t.rx, t.ry, t.sx, t.sy, t.tx, t.ty
- divider = sx*sy - rx*ry
- return not (sx==1 and rx==0 and ry==0 and sy==1 and tx==0 and ty==0), t.width
- else
- rx, sx, sy, ry, tx, ty, divider = 1, 0, 0, 1, 0, 0, 1
- return false, 1
- end
+ local t = mplib.pen_info(object)
+ rx, ry, sx, sy, tx, ty = t.rx, t.ry, t.sx, t.sy, t.tx, t.ty
+ divider = sx*sy - rx*ry
+ return not (sx==1 and rx==0 and ry==0 and sy==1 and tx==0 and ty==0), t.width
end
local function concat(px, py) -- no tx, ty here
diff --git a/Master/texmf-dist/tex/generic/context/luatex-mplib.tex b/Master/texmf-dist/tex/generic/context/luatex-mplib.tex
index 206518d7dc1..69195864670 100644
--- a/Master/texmf-dist/tex/generic/context/luatex-mplib.tex
+++ b/Master/texmf-dist/tex/generic/context/luatex-mplib.tex
@@ -4,8 +4,7 @@
%D title=\LUATEX\ Support Macros,
%D subtitle=\METAPOST\ to \PDF\ conversion,
%D author=Taco Hoekwater \& Hans Hagen,
-%D date=\currentdate,
-%D copyright=public domain]
+%D copyright=see context related readme files]
%D This is the companion to the \LUA\ module \type {supp-mpl.lua}. Further
%D embedding is up to others. A simple example of usage in plain \TEX\ is:
diff --git a/Master/texmf-dist/tex/generic/context/luatex-plain.tex b/Master/texmf-dist/tex/generic/context/luatex-plain.tex
deleted file mode 100644
index ae2588327ff..00000000000
--- a/Master/texmf-dist/tex/generic/context/luatex-plain.tex
+++ /dev/null
@@ -1,25 +0,0 @@
-%D \module
-%D [ file=luatex-basics,
-%D version=2009.12.01,
-%D title=\LUATEX\ Support Macros,
-%D subtitle=Attribute Allocation,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright=public domain]
-
-\input plain
-
-\directlua {tex.enableprimitives('', tex.extraprimitives())}
-
-\pdfoutput=1
-
-\everyjob \expandafter {%
- \the\everyjob
- \input luatex-basics\relax
- \input luatex-fonts\relax
- \input luatex-mplib\relax
-}
-
-\edef\fmtversion{\fmtversion+luatex}
-
-\dump
diff --git a/Master/texmf-dist/tex/generic/context/luatex-preprocessor-test.tex b/Master/texmf-dist/tex/generic/context/luatex-preprocessor-test.tex
new file mode 100644
index 00000000000..857b28f831b
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex-preprocessor-test.tex
@@ -0,0 +1,30 @@
+\ifdefined\inputpreprocessed
+
+ \def\TestOne[#1]%
+ {test one: [#1]\par}
+
+ \def\TestTwo#some%
+ {test two: #some\par}
+
+ \def\TestThree[#whatever][#more]%
+ {test three: [#more] and [#whatever]\par}
+
+ \def\TestFour[#one]#two%
+ {\def\TestFive[#alpha][#one]%
+ {test four and five: [#one], [#two] and [#alpha]}\par}
+
+ \def\TestSix[#{one}]#{two}%
+ {test six: [#{one}] and #{two}\par}
+
+ \TestOne [one]
+ \TestTwo {one}
+ \TestThree[one][two]
+ \TestFour [one]{two}
+ \TestFive [one][two]
+ \TestSix [one]{two}
+
+\else
+ \input{luatex-preprocessor.tex}
+ \inputpreprocessed{luatex-preprocessor-test.tex}
+ \expandafter \end
+\fi
diff --git a/Master/texmf-dist/tex/generic/context/luatex-preprocessor.lua b/Master/texmf-dist/tex/generic/context/luatex-preprocessor.lua
new file mode 100644
index 00000000000..8faa0b47e69
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex-preprocessor.lua
@@ -0,0 +1,163 @@
+if not modules then modules = { } end modules ['luatex-preprocessor'] = {
+ version = 1.001,
+ comment = "companion to luatex-preprocessor.tex",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+--[[ldx
+<p>This is a stripped down version of the preprocessor. In
+<l n='context'/> we have a bit more, use a different logger, and
+use a few optimizations. A few examples are shown at the end.</p>
+--ldx]]
+
+local rep, sub, gmatch = string.rep, string.sub, string.gmatch
+local insert, remove = table.insert, table.remove
+local setmetatable = setmetatable
+
+local stack, top, n, hashes = { }, nil, 0, { }
+
+local function set(s)
+ if top then
+ n = n + 1
+ if n > 9 then
+ texio.write_nl("number of arguments > 9, ignoring: " .. s)
+ else
+ local ns = #stack
+ local h = hashes[ns]
+ if not h then
+ h = rep("#",ns)
+ hashes[ns] = h
+ end
+ m = h .. n
+ top[s] = m
+ return m
+ end
+ end
+end
+
+local function get(s)
+ local m = top and top[s] or s
+ return m
+end
+
+local function push()
+ top = { }
+ n = 0
+ local s = stack[#stack]
+ if s then
+ setmetatable(top,{ __index = s })
+ end
+ insert(stack,top)
+end
+
+local function pop()
+ top = remove(stack)
+end
+
+local leftbrace = lpeg.P("{")
+local rightbrace = lpeg.P("}")
+local escape = lpeg.P("\\")
+
+local space = lpeg.P(" ")
+local spaces = space^1
+local newline = lpeg.S("\r\n")
+local nobrace = 1 - leftbrace - rightbrace
+
+local name = lpeg.R("AZ","az")^1
+local longname = (leftbrace/"") * (nobrace^1) * (rightbrace/"")
+local variable = lpeg.P("#") * lpeg.Cs(name + longname)
+local escapedname = escape * name
+local definer = escape * (lpeg.P("def") + lpeg.P("egdx") * lpeg.P("def"))
+local anything = lpeg.P(1)
+local always = lpeg.P(true)
+
+local pushlocal = always / push
+local poplocal = always / pop
+local declaration = variable / set
+local identifier = variable / get
+
+local function matcherror(str,pos)
+ texio.write_nl("runaway definition at: " .. sub(str,pos-30,pos))
+end
+
+local parser = lpeg.Cs { "converter",
+ definition = pushlocal
+ * definer
+ * escapedname
+ * (declaration + (1-leftbrace))^0
+ * lpeg.V("braced")
+ * poplocal,
+ braced = leftbrace
+ * ( lpeg.V("definition")
+ + identifier
+ + lpeg.V("braced")
+ + nobrace
+ )^0
+ * (rightbrace + lpeg.Cmt(always,matcherror)),
+ converter = (lpeg.V("definition") + anything)^1,
+}
+
+--[[ldx
+<p>We provide a few commands.</p>
+--ldx]]
+
+-- local texkpse
+
+local function find_file(...)
+ -- texkpse = texkpse or kpse.new("luatex","tex")
+ -- return texkpse:find_file(...) or ""
+ return kpse.find_file(...) or ""
+end
+
+commands = commands or { }
+
+function commands.preprocessed(str)
+ return lpeg.match(parser,str)
+end
+
+function commands.inputpreprocessed(name)
+ local name = find_file(name) or ""
+ if name ~= "" then
+ -- we could use io.loaddata as it's loaded in luatex-plain
+ local f = io.open(name,'rb')
+ if f then
+ texio.write("("..name)
+ local d = commands.preprocessed(f:read("*a"))
+ if d and d ~= "" then
+ texio.write("processed: " .. name)
+ for s in gmatch(d,"[^\n\r]+") do
+ tex.print(s) -- we do a dumb feedback
+ end
+ end
+ f:close()
+ texio.write(")")
+ else
+ tex.error("preprocessor error, invalid file: " .. name)
+ end
+ else
+ tex.error("preprocessor error, unknown file: " .. name)
+ end
+end
+
+function commands.preprocessfile(oldfile,newfile) -- no checking
+ if oldfile and oldfile ~= newfile then
+ local f = io.open(oldfile,'rb')
+ if f then
+ local g = io.open(newfile,'wb')
+ if g then
+ g:write(lpeg.match(parser,f:read("*a") or ""))
+ g:close()
+ end
+ f:close()
+ end
+ end
+end
+
+--~ print(preprocessed([[\def\test#oeps{test:#oeps}]]))
+--~ print(preprocessed([[\def\test#oeps{test:#{oeps}}]]))
+--~ print(preprocessed([[\def\test#{oeps:1}{test:#{oeps:1}}]]))
+--~ print(preprocessed([[\def\test#{oeps}{test:#oeps}]]))
+--~ preprocessed([[\def\test#{oeps}{test:#oeps \halign{##\cr #oeps\cr}]])
+--~ print(preprocessed([[\def\test#{oeps}{test:#oeps \halign{##\cr #oeps\cr}}]]))
diff --git a/Master/texmf-dist/tex/generic/context/luatex-preprocessor.tex b/Master/texmf-dist/tex/generic/context/luatex-preprocessor.tex
new file mode 100644
index 00000000000..fe4872d6101
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/context/luatex-preprocessor.tex
@@ -0,0 +1,14 @@
+%D \module
+%D [ file=luatex-preprocessor,
+%D version=2010.12.02,
+%D title=\LUATEX\ Support Macros,
+%D subtitle=Generic Preprocessor,
+%D author=Hans Hagen,
+%D copyright=public domain]
+
+\directlua{dofile(kpse.find_file('luatex-preprocessor.lua'))}
+
+\def\inputpreprocessed#1%
+ {\directlua{commands.inputpreprocessed("#1")}}
+
+\endinput
diff --git a/Master/texmf-dist/tex/generic/context/luatex-test.tex b/Master/texmf-dist/tex/generic/context/luatex-test.tex
index a142d163534..1c3aeb1b689 100644
--- a/Master/texmf-dist/tex/generic/context/luatex-test.tex
+++ b/Master/texmf-dist/tex/generic/context/luatex-test.tex
@@ -17,20 +17,19 @@
\font\testc=file:lmroman12-regular:mode=node;+liga; at 24pt \testc effe flink fietsen \par
\font\testd=name:lmroman10bold at 12pt \testd a bit bold \par
-\font\oeps=[lmroman12-regular]:+liga at 30pt \oeps crap
-\font\oeps=[lmroman12-regular] at 40pt \oeps more crap
-
\font\oeps=cmr10
-\font\testx=ptmr8t \testx abc
+\font\oeps=[lmroman12-regular]:+liga at 30pt \oeps crap
+\font\oeps=[lmroman12-regular] at 40pt \oeps more crap
\font\cidtest=adobesongstd-light
\font\mathtest=cambria(math) {\mathtest 123}
-% \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 این یک متن نمونه است با قلم ذر که درست آمده است.
-% \font\testz=name:linlibertineo \testz
+\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 این یک متن نمونه است با قلم ذر که درست آمده است.
\pdfprotrudechars2 \pdfadjustspacing2
@@ -49,5 +48,12 @@
endfig ;
\endmplibcode
-\end
+\font\mine=file:luatex-fonts-demo-vf-1.lua at 12pt
+
+\mine \input tufte \par
+
+% \font\mine=file:luatex-fonts-demo-vf-2.lua at 12pt \mine [abab] \par
+% \font\mine=file:luatex-fonts-demo-vf-3.lua at 12pt \mine [abab] \par
+
+\end
diff --git a/Master/texmf-dist/tex/generic/context/mptopdf.tex b/Master/texmf-dist/tex/generic/context/mptopdf.tex
index 1f229678daa..a0ac34a42b3 100644
--- a/Master/texmf-dist/tex/generic/context/mptopdf.tex
+++ b/Master/texmf-dist/tex/generic/context/mptopdf.tex
@@ -110,11 +110,13 @@
%D different vision on paths, the graphic is positioned in
%D such a way that accuracy in \PDF\ xforms is guaranteed.
+\ifx\makeMPintoPDFobject\undefined \newcount\makeMPintoPDFobject \fi
+
\def\processMPfile#1 %
{\pdfoutput=1
\pdfpkresolution600
\pdfcompresslevel=9
- \chardef\makeMPintoPDFobject=1
+ \makeMPintoPDFobject=1
\hsize=100in
\vsize=\hsize
\hoffset=-1in
diff --git a/Master/texmf/web2c/texmfcnf.lua b/Master/texmf/web2c/texmfcnf.lua
index cebf0b5f957..3f5aaa513ff 100644
--- a/Master/texmf/web2c/texmfcnf.lua
+++ b/Master/texmf/web2c/texmfcnf.lua
@@ -1,15 +1,179 @@
--- original texmfcnf.lua: TEXMFCACHE setting for luatools --generate.
--- Public domain.
---
--- If you modify this original file, YOUR CHANGES WILL BE LOST when it
--- is updated. Instead, put your version in ../../texmfcnf.lua. That
--- is, if this file is installed in
--- /some/path/to/texlive/2010/texmf/web2c/texmfcnf.lua,
--- put your custom settings in /some/path/to/texlive/2010/texmfcnf.lua.
---
--- This file is intended only for use by ConTeXt.
---
return {
- TEXMFCACHE = '~/.texlive2010/texmf-var'
-}
+ type = "configuration",
+ version = "1.1.0",
+ date = "2011-09-02", -- or so
+ time = "12:12:12",
+ comment = "ConTeXt MkIV configuration file",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+
+ content = {
+
+ -- Originally there was support for engines and progname but I don't expect
+ -- other engines to use this file, so first engines were removed. After that
+ -- if made sense also to get rid of progname. At some point specific formats
+ -- will be supported but then as a subtable with fallbacks, which sounds more
+ -- natural. Also, at some point the paths will become tables. For the moment
+ -- I don't care too much about it as extending is easy.
+
+ variables = {
+
+ -- The following variable is predefined (but can be overloaded) and in
+ -- most cases you can leve this one untouched. The built-in definition
+ -- permits relocation of the tree.
+ --
+ -- TEXMFCNF = "{selfautodir:,selfautoparent:}{,{/share,}/texmf{-local,}/web2c}"
+ --
+ -- more readable than "selfautoparent:{/texmf{-local,}{,/web2c},}}" is:
+ --
+ -- TEXMFCNF = {
+ -- "selfautoparent:/texmf-local",
+ -- "selfautoparent:/texmf-local/web2c",
+ -- "selfautoparent:/texmf",
+ -- "selfautoparent:/texmf/web2c",
+ -- "selfautoparent:",
+ -- }
+
+ -- We have only one cache path but there can be more. The first writable one
+ -- will be chose but there can be more readable paths.
+
+ TEXMFCACHE = "~/.texlive2011/texmf-cache",
+
+ -- I don't like this texmf under home and texmf-home would make more
+ -- sense. One never knows what installers put under texmf anywhere and
+ -- sorting out problems will be a pain. But on the other hand ... home
+ -- mess is normally under the users own responsibility.
+ --
+ -- By using prefixes we don't get expanded paths in the cache __path__
+ -- entry. This makes the tex root relocatable.
+
+ TEXMFOS = "selfautodir:",
+ TEXMFSYSTEM = "selfautoparent:$SELFAUTOSYSTEM",
+ TEXMFMAIN = "selfautoparent:texmf",
+ TEXMFCONTEXT = "selfautoparent:texmf-dist",
+ TEXMFLOCAL = "selfautoparent:/../texmf-local",
+ TEXMFFONTS = "selfautoparent:texmf-fonts",
+ TEXMFPROJECT = "selfautoparent:texmf-project",
+
+ TEXMFHOME = "home:texmf",
+ -- TEXMFHOME = os.name == "macosx" and "home:Library/texmf" or "home:texmf",
+
+ -- We need texmfos for a few rare files but as I have a few more bin trees
+ -- a hack is needed. Maybe other users also have texmf-platform-new trees.
+
+ TEXMF = "{$TEXMFHOME,!!$TEXMFPROJECT,!!$TEXMFFONTS,!!$TEXMFLOCAL,!!$TEXMFCONTEXT,!!$TEXMFSYSTEM,!!$TEXMFMAIN}",
+
+ TEXFONTMAPS = ".;$TEXMF/fonts/data//;$TEXMF/fonts/map/{pdftex,dvips}//",
+ ENCFONTS = ".;$TEXMF/fonts/data//;$TEXMF/fonts/enc/{dvips,pdftex}//",
+ VFFONTS = ".;$TEXMF/fonts/{data,vf}//",
+ TFMFONTS = ".;$TEXMF/fonts/{data,tfm}//",
+ T1FONTS = ".;$TEXMF/fonts/{data,type1,pfb}//;$OSFONTDIR",
+ AFMFONTS = ".;$TEXMF/fonts/{data,afm}//;$OSFONTDIR",
+ TTFONTS = ".;$TEXMF/fonts/{data,truetype,ttf}//;$OSFONTDIR",
+ OPENTYPEFONTS = ".;$TEXMF/fonts/{data,opentype}//;$OSFONTDIR",
+ CMAPFONTS = ".;$TEXMF/fonts/cmap//",
+ FONTFEATURES = ".;$TEXMF/fonts/{data,fea}//;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS",
+ FONTCIDMAPS = ".;$TEXMF/fonts/{data,cid,cmap}//;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS",
+ OFMFONTS = ".;$TEXMF/fonts/{data,ofm,tfm}//",
+ OVFFONTS = ".;$TEXMF/fonts/{data,ovf,vf}//",
+
+ TEXINPUTS = ".;{$CTXDEVTXPATH};$TEXMF/tex/{context,plain/base,generic}//",
+ MPINPUTS = ".;{$CTXDEVMPPATH};$TEXMF/metapost/{context,base,}//",
+
+ -- In the next variable the inputs path will go away.
+
+ TEXMFSCRIPTS = ".;$CTXDEVLUPATH;$CTXDEVRBPATH;$CTXDEVPLPATH;$TEXMF/scripts/context/{lua,ruby,python,perl}//;$TEXINPUTS",
+ PERLINPUTS = ".;$CTXDEVPLPATH;$TEXMF/scripts/context/perl",
+ PYTHONINPUTS = ".;$CTXDEVPYPATH;$TEXMF/scripts/context/python",
+ RUBYINPUTS = ".;$CTXDEVRBPATH;$TEXMF/scripts/context/ruby",
+ LUAINPUTS = ".;$CTXDEVLUPATH;$TEXINPUTS;$TEXMF/scripts/context/lua//",
+ CLUAINPUTS = ".;$SELFAUTOLOC/lib/{context,luatex,}/lua//",
+
+ -- Not really used by MkIV so they might go away.
+
+ BIBINPUTS = ".;{$CTXDEVTXPATH};$TEXMF/bibtex/bib//",
+ BSTINPUTS = ".;{$CTXDEVTXPATH};$TEXMF/bibtex/bst//",
+
+ -- Experimental
+
+ ICCPROFILES = ".;$TEXMF/colors/icc/{context,profiles}//;$OSCOLORDIR",
+
+ -- A few special ones that will change some day.
+
+ FONTCONFIG_FILE = "fonts.conf",
+ FONTCONFIG_PATH = "$TEXMFSYSTEM/fonts/conf",
+ FC_CACHEDIR = "$TEXMFSYSTEM/fonts/cache", -- not needed
+
+ },
+
+ -- We have a few reserved subtables. These control runtime behaviour. The
+ -- keys have names like 'foo.bar' which means that you have to use keys
+ -- like ['foo.bar'] so for convenience we also support 'foo_bar'.
+
+ directives = {
+
+ -- There are a few variables that determine the engines
+ -- limits. Most will fade away when we close in on version 1.
+
+ ["luatex.expanddepth"] = "10000", -- 10000
+ ["luatex.hashextra"] = "100000", -- 0
+ ["luatex.nestsize"] = "1000", -- 50
+ ["luatex.maxinopen"] = "500", -- 15
+ ["luatex.maxprintline"] = " 10000", -- 79
+ ["luatex.maxstrings"] = "500000", -- 15000 -- obsolete
+ ["luatex.paramsize"] = "25000", -- 60
+ ["luatex.savesize"] = "50000", -- 4000
+ ["luatex.stacksize"] = "10000", -- 300
+
+ -- A few process related variables come next.
+
+ -- ["system.checkglobals"] = "10",
+ -- ["system.nostatistics"] = "yes",
+ ["system.errorcontext"] = "10",
+ ["system.compile.cleanup"] = "no", -- remove tma files
+ ["system.compile.strip"] = "yes", -- strip tmc files
+
+ -- The io modes are similar to the traditional ones. Possible values
+ -- are all, paranoid and restricted.
+
+ ["system.outputmode"] = "restricted",
+ ["system.inputmode"] = "any",
+
+ -- The following variable is under consideration. We do have protection
+ -- mechanims but it's not enabled by default.
+
+ ["system.commandmode"] = "any", -- any none list
+ ["system.commandlist"] = "mtxrun, convert, inkscape, gs, imagemagick, curl, bibtex, pstoedit",
+
+ -- The mplib library support mechanisms have their own
+ -- configuration. Normally these variables can be left as
+ -- they are.
+
+ ["mplib.texerrors"] = "yes",
+
+ -- Normally you can leave the font related directives untouched
+ -- as they only make sense when testing.
+
+ -- ["fonts.autoreload"] = "no",
+ -- ["fonts.otf.loader.method"] = "table", -- table mixed sparse
+ -- ["fonts.otf.loader.cleanup"] = "0", -- 0 1 2 3
+
+ -- In an edit cycle it can be handy to launch an editor. The
+ -- preferred one can be set here.
+
+ -- ["pdfview.method"] = "okular", -- default (often acrobat) xpdf okular
+
+ },
+
+ experiments = {
+ ["fonts.autorscale"] = "yes",
+ },
+
+ trackers = {
+ },
+
+ },
+
+ TEXMFCACHE = "~/.texlive2011/texmf-cache", -- for old times sake
+
+}
diff --git a/Master/tlpkg/tlpsrc/context.tlpsrc b/Master/tlpkg/tlpsrc/context.tlpsrc
index b8aef4c92de..1e2467df00e 100644
--- a/Master/tlpkg/tlpsrc/context.tlpsrc
+++ b/Master/tlpkg/tlpsrc/context.tlpsrc
@@ -32,6 +32,7 @@ execute addMap original-context-symbol.map
#
runpattern +d texmf-dist/context/data
runpattern +d texmf-dist/fonts/cid/fontforge
+runpattern +d texmf-dist/colors/icc
runpattern +f texmf-dist/tex/mptopdf/config/mptopdf.ini
#
# See longdesc in mptopdf.tlpsrc.
@@ -62,12 +63,10 @@ docpattern +f texmf/doc/man/man1/texmfstart.*
binpattern f bin/${ARCH}/context
binpattern f bin/${ARCH}/ctxtools
binpattern f bin/${ARCH}/luatools
-binpattern f bin/${ARCH}/metafun
binpattern f bin/${ARCH}/mtxrun
binpattern f bin/${ARCH}/pstopdf
binpattern f bin/${ARCH}/rlxtools
binpattern f bin/${ARCH}/texexec
binpattern f bin/${ARCH}/texmfstart
#
-binpattern f/win32 bin/win32/luatools.lua
binpattern f/win32 bin/win32/mtxrun.lua